ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OTBjZWUKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzIgQEAKKyouNQorKi43CisqLjgKKyouYQorKi5kCisqLm8KKyoub3JpZworKi5wYworKi5wb3QKKyoucHljCisqLnB5bworKi5yZWoKKyouc28KKyouc28uKgorKi5zdyoKKyp+CisKKy5leHBvcnQuc3ltCisuZXhwb3J0ZWRfc3ltYm9sc19nZW5lcmF0ZWQKKy5nZGJfaGlzdG9yeQorCitNYWtlZmlsZQorbWFrZS50bXBsCisKKy9hdXRvbTR0ZS5jYWNoZS8KKy9hdXRvc2Nhbi5sb2cKKy9jb25maWcubG9nCisvY29uZmlnLnN0YXR1cworL2NvbmZpZ3VyZS5zY2FuCisvY3Njb3BlLm91dAorL3RhZ3MKKy90bXAvCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNhNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU2IEBACisjIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliZG0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlsaWJkbS9kYXRhc3RydWN0L2JpdHNldC5jIFwKKwlsaWJkbS9kYXRhc3RydWN0L2hhc2guYyBcCisJbGliZG0vZGF0YXN0cnVjdC9saXN0LmMgXAorCWxpYmRtL2xpYmRtLWNvbW1vbi5jIFwKKwlsaWJkbS9saWJkbS1jb25maWcuYyBcCisJbGliZG0vbGliZG0tZGVwdHJlZS5jIFwKKwlsaWJkbS9saWJkbS1maWxlLmMgXAorCWxpYmRtL2xpYmRtLXJlcG9ydC5jIFwKKwlsaWJkbS9saWJkbS1zdGF0cy5jIFwKKwlsaWJkbS9saWJkbS1zdHJpbmcuYyBcCisJbGliZG0vbGliZG0tdGFyZ2V0cy5jIFwKKwlsaWJkbS9saWJkbS10aW1lc3RhbXAuYyBcCisJbGliZG0vbW0vZGJnX21hbGxvYy5jIFwKKwlsaWJkbS9tbS9wb29sLmMgXAorCWxpYmRtL3JlZ2V4L21hdGNoZXIuYyBcCisJbGliZG0vcmVnZXgvcGFyc2VfcnguYyBcCisJbGliZG0vcmVnZXgvdHRyZWUuYyBcCisJbGliZG0vaW9jdGwvbGliZG0taWZhY2UuYworCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkkKExPQ0FMX1BBVEgpL2xpYi9taXNjIFwKKwkkKExPQ0FMX1BBVEgpL2xpYi9sb2cgXAorCSQoTE9DQUxfUEFUSCkvbGliZG0gXAorCSQoTE9DQUxfUEFUSCkvbGliZG0vaW9jdGwgXAorCSQoTE9DQUxfUEFUSCkvbGliZG0vbWlzYworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gZG1zZXR1cAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX1JPT1RfT1VUX1NCSU4pCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJdG9vbHMvZG1zZXR1cC5jCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCSQoTE9DQUxfUEFUSCkvbGliL21pc2MgXAorCSQoTE9DQUxfUEFUSCkvbGliL2xvZyBcCisJJChMT0NBTF9QQVRIKS9saWJkbSBcCisJJChMT0NBTF9QQVRIKS9saWJkbS9taXNjCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZG0KKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRmOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9DT1BZSU5HLkxJQiBiL0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjc2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkxJQgpAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwZDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwKQEAgLTAsMCArMSwzMSBAQAorSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT0KKworMSkgR2VuZXJhdGUgY3VzdG9tIG1ha2VmaWxlcy4KKworICAgUnVuIHRoZSAnY29uZmlndXJlJyBzY3JpcHQgZnJvbSB0aGUgdG9wIGRpcmVjdG9yeS4KKworICAgSWYgeW91IGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgTFZNMSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb2RlIHVzZToKKyAgICAgLi9jb25maWd1cmUgLS13aXRoLWx2bTE9bm9uZSAKKworICAgVG8gc2VwYXJhdGUgdGhlIExWTTEgc3VwcG9ydCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkgbG9hZGVkIGJ5IGx2bS5jb25mIHVzZToKKyAgICAgLi9jb25maWd1cmUgLS13aXRoLWx2bTE9c2hhcmVkCisKKyAgIFVzZSAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gc2VlIG90aGVyIG9wdGlvbnMuCisKKzIpIEJ1aWxkIGFuZCBpbnN0YWxsLgorCisgICBSdW4gJ21ha2UnIGZyb20gdGhlIHRvcCBkaXJlY3RvcnkgdG8gYnVpbGQgZXZlcnl0aGluZyB5b3UgY29uZmlndXJlZC4KKyAgIFJ1biAnbWFrZSBpbnN0YWxsJyB0byBidWlsZCBhbmQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdSBjb25maWd1cmVkLgorCisgICBJZiB5b3Ugb25seSB3YW50IHRoZSBkZXZpY2UtbWFwcGVyIGxpYnJhcmllcyBhbmQgdG9vbHMgdXNlCisgICAnbWFrZSBkZXZpY2UtbWFwcGVyJyBvciAnbWFrZSBpbnN0YWxsX2RldmljZS1tYXBwZXInLgorCiszKSBJZiB1c2luZyBMVk0yLCBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGZpbGUuCisKKyAgIFRoZSB0b29scyB3aWxsIHdvcmsgZmluZSB3aXRob3V0IGEgY29uZmlndXJhdGlvbiBmaWxlIGJlaW5nCisgICBwcmVzZW50LCBidXQgeW91IG91Z2h0IHRvIHJldmlldyB0aGUgZXhhbXBsZSBmaWxlIGluIGRvYy9leGFtcGxlLmNvbmYuCisKK1BsZWFzZSBhbHNvIHJlZmVyIHRvIHRoZSBXSEFUU19ORVcgZmlsZSBhbmQgdGhlIG1hbnVhbCBwYWdlcyBmb3IgdGhlIAoraW5kaXZpZHVhbCBjb21tYW5kcy4KKwpkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfR1BMIGIvTU9EVUxFX0xJQ0VOU0VfR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9HUEwKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NDFmMQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjQzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorCitTVUJESVJTID0gY29uZiBkYWVtb25zIGluY2x1ZGUgbGliIGxpYmRhZW1vbiBsaWJkbSBtYW4gc2NyaXB0cyB0b29scworCitpZmVxICgiQFVERVZfUlVMRVNAIiwgInllcyIpCisgIFNVQkRJUlMgKz0gdWRldgorZW5kaWYKKworaWZlcSAoIkBJTlRMQCIsICJ5ZXMiKQorICBTVUJESVJTICs9IHBvCitlbmRpZgorCitpZmVxICgiQEFQUExJQkAiLCAieWVzIikKKyAgU1VCRElSUyArPSBsaWJsdm0KK2VuZGlmCisKK2lmZXEgKCJAUFlUSE9OX0JJTkRJTkdTQCIsICJ5ZXMiKQorICBTVUJESVJTICs9IHB5dGhvbgorZW5kaWYKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLGNsZWFuKQorICBTVUJESVJTICs9IHRlc3QKK2VuZGlmCisjIEZJWE1FIFNob3VsZCB1c2UgaW50ZXJtZWRpYXRlIE1ha2VmaWxlcyBoZXJlIQoraWZlcSAoJChNQUtFQ01ER09BTFMpLGRpc3RjbGVhbikKKyAgU1VCRElSUyA9IGNvbmYgaW5jbHVkZSBtYW4gdGVzdCBzY3JpcHRzIFwKKyAgICBsaWJkYWVtb24gbGliIHRvb2xzIGRhZW1vbnMgbGliZG0gXAorICAgIHVkZXYgcG8gbGlibHZtIHB5dGhvbiBcCisgICAgdW5pdC10ZXN0cy9kYXRhc3RydWN0IHVuaXQtdGVzdHMvbW0gdW5pdC10ZXN0cy9yZWdleAordG9vbHMuZGlzdGNsZWFuOiB0ZXN0LmRpc3RjbGVhbgorZW5kaWYKK0RJU1RDTEVBTl9ESVJTICs9IGxjb3ZfcmVwb3J0cyoKK0RJU1RDTEVBTl9UQVJHRVRTICs9IGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMgbWFrZS50bXBsCisKK2luY2x1ZGUgbWFrZS50bXBsCisKK2xpYmRtOiBpbmNsdWRlCitsaWJkYWVtb246IGluY2x1ZGUKK2xpYjogbGliZG0gbGliZGFlbW9uCitsaWJsdm06IGxpYgorZGFlbW9uczogbGliIGxpYmRhZW1vbiB0b29scwordG9vbHM6IGxpYiBsaWJkYWVtb24gZGV2aWNlLW1hcHBlcgorcG86IHRvb2xzIGRhZW1vbnMKK3NjcmlwdHM6IGxpYmx2bSBsaWJkbQorCitsaWIuZGV2aWNlLW1hcHBlcjogaW5jbHVkZS5kZXZpY2UtbWFwcGVyCitsaWJkbS5kZXZpY2UtbWFwcGVyOiBpbmNsdWRlLmRldmljZS1tYXBwZXIKK2xpYmx2bS5kZXZpY2UtbWFwcGVyOiBpbmNsdWRlLmRldmljZS1tYXBwZXIKK2RhZW1vbnMuZGV2aWNlLW1hcHBlcjogbGliZG0uZGV2aWNlLW1hcHBlcgordG9vbHMuZGV2aWNlLW1hcHBlcjogbGliZG0uZGV2aWNlLW1hcHBlcgorc2NyaXB0cy5kZXZpY2UtbWFwcGVyOiBpbmNsdWRlLmRldmljZS1tYXBwZXIKK2RldmljZS1tYXBwZXI6IHRvb2xzLmRldmljZS1tYXBwZXIgZGFlbW9ucy5kZXZpY2UtbWFwcGVyIG1hbi5kZXZpY2UtbWFwcGVyCisKK2lmZXEgKCJASU5UTEAiLCAieWVzIikKK2xpYi5wb2ZpbGU6IGluY2x1ZGUucG9maWxlCit0b29scy5wb2ZpbGU6IGxpYi5wb2ZpbGUKK2RhZW1vbnMucG9maWxlOiBsaWIucG9maWxlCitwby5wb2ZpbGU6IHRvb2xzLnBvZmlsZSBkYWVtb25zLnBvZmlsZQorcG9maWxlOiBwby5wb2ZpbGUKK2VuZGlmCisKK2lmZXEgKCJAUFlUSE9OX0JJTkRJTkdTQCIsICJ5ZXMiKQorcHl0aG9uOiBsaWJsdm0KK2VuZGlmCisKK2lmbmVxICgiJChDRkxPV19DTUQpIiwgIiIpCit0b29scy5jZmxvdzogbGliZG0uY2Zsb3cgbGliLmNmbG93CitkYWVtb25zLmNmbG93OiB0b29scy5jZmxvdworY2Zsb3c6IGluY2x1ZGUuY2Zsb3cKK2VuZGlmCisKK2lmbmVxICgiQENTQ09QRV9DTURAIiwgIiIpCitjc2NvcGUub3V0OgorCUBDU0NPUEVfQ01EQCAtYiAtUiAtcyQodG9wX3NyY2RpcikKK2FsbDogY3Njb3BlLm91dAorZW5kaWYKK0RJU1RDTEVBTl9UQVJHRVRTICs9IGNzY29wZS5vdXQKK0NMRUFOX0RJUlMgKz0gYXV0b200dGUuY2FjaGUKKworY2hlY2sgY2hlY2tfc3lzdGVtIGNoZWNrX2NsdXN0ZXIgY2hlY2tfbG9jYWwgY2hlY2tfbHZtZXRhZCBjaGVja19sdm1wb2xsZCBjaGVja19sdm1sb2NrZF90ZXN0IGNoZWNrX2x2bWxvY2tkX2RsbSBjaGVja19sdm1sb2NrZF9zYW5sb2NrIHVuaXQ6IGFsbAorCSQoTUFLRSkgLUMgdGVzdCAkKEApCisKK2NvbmYuZ2VuZXJhdGU6IHRvb2xzCisKKyMgaG93IHRvIHVzZSBwYXJlbnRoZXNpcyBpbiBtYWtlZmlsZXMKK2xlZnRwYXJlbjo9KAorTFZNX1ZFUiA6PSAkKGZpcnN0d29yZCAkKHN1YnN0ICQobGVmdHBhcmVuKSwgLCQoTFZNX1ZFUlNJT04pKSkKK1ZFUiA6PSBMVk0yLiQoTFZNX1ZFUikKKyMgcmVsZWFzZSBmaWxlIG5hbWUKK0ZJTEVfVkVSIDo9ICQoVkVSKS50Z3oKK0NMRUFOX1RBUkdFVFMgKz0gJChGSUxFX1ZFUikKK0NMRUFOX0RJUlMgKz0gJChycG1idWlsZGRpcikKKworZGlzdDoKKwlAZWNobyAiR2VuZXJhdGluZyAkKEZJTEVfVkVSKSI7XAorCShjZCAkKHRvcF9zcmNkaXIpOyBnaXQgbHMtdHJlZSAtciBIRUFEIC0tbmFtZS1vbmx5IHwgeGFyZ3MgdGFyIC0tdHJhbnNmb3JtICJzLF4sJChWRVIpLywiIC1jKSB8IGd6aXAgPiQoRklMRV9WRVIpCisKK3JwbTogZGlzdAorCSQoUk0pIC1yICQocnBtYnVpbGRkaXIpL1NPVVJDRVMKKwkkKE1LRElSX1ApICQocnBtYnVpbGRkaXIpL1NPVVJDRVMKKwkkKExOX1MpIC1mICQoYWJzX3RvcF9idWlsZGRpcikvJChGSUxFX1ZFUikgJChycG1idWlsZGRpcikvU09VUkNFUworCSQoTE5fUykgLWYgJChhYnNfdG9wX3NyY2Rpcikvc3BlYy9idWlsZC5pbmMgJChycG1idWlsZGRpcikvU09VUkNFUworCSQoTE5fUykgLWYgJChhYnNfdG9wX3NyY2Rpcikvc3BlYy9tYWNyb3MuaW5jICQocnBtYnVpbGRkaXIpL1NPVVJDRVMKKwkkKExOX1MpIC1mICQoYWJzX3RvcF9zcmNkaXIpL3NwZWMvcGFja2FnZXMuaW5jICQocnBtYnVpbGRkaXIpL1NPVVJDRVMKKwlETV9WRVI9JCQoY3V0IC1kLSAtZjEgJCh0b3Bfc3JjZGlyKS9WRVJTSU9OX0RNKTtcCisJR0lUX1ZFUj0kJChjZCAkKHRvcF9zcmNkaXIpOyBnaXQgZGVzY3JpYmUgfCBjdXQgLWQtIC0tb3V0cHV0LWRlbGltaXRlcj0uIC1mMiwzIHx8IGVjaG8gMCk7XAorCXNlZCAtZSAicyxcKGRldmljZV9tYXBwZXJfdmVyc2lvblwpIFswLTkuXSokJCxcMSAkJERNX1ZFUiwiIFwKKwkgICAgLWUgInMsXlwoVmVyc2lvbjpbXjAtOSVdKlwpWzAtOS5dKiQkLFwxICQoTFZNX1ZFUiksIiBcCisJICAgIC1lICJzLF5cKFJlbGVhc2U6W14wLTklXSpcKVswLTkuXVwrLFwxICQkR0lUX1ZFUiwiIFwKKwkgICAgJCh0b3Bfc3JjZGlyKS9zcGVjL3NvdXJjZS5pbmMgPiQocnBtYnVpbGRkaXIpL1NPVVJDRVMvc291cmNlLmluYworCXJwbWJ1aWxkIC12IC0tZGVmaW5lICJfdG9wZGlyICQocnBtYnVpbGRkaXIpIiAtYmEgJCh0b3Bfc3JjZGlyKS9zcGVjL2x2bTIuc3BlYworCitnZW5lcmF0ZTogY29uZi5nZW5lcmF0ZQorCSQoTUFLRSkgLUMgY29uZiBnZW5lcmF0ZQorCithbGxfbWFuOgorCSQoTUFLRSkgLUMgbWFuIGFsbF9tYW4KKworaW5zdGFsbF9zeXN0ZW1fZGlyczoKKwkkKElOU1RBTExfRElSKSAkKERFU1RESVIpJChERUZBVUxUX1NZU19ESVIpCisJJChJTlNUQUxMX1JPT1RfRElSKSAkKERFU1RESVIpJChERUZBVUxUX0FSQ0hJVkVfRElSKQorCSQoSU5TVEFMTF9ST09UX0RJUikgJChERVNURElSKSQoREVGQVVMVF9CQUNLVVBfRElSKQorCSQoSU5TVEFMTF9ST09UX0RJUikgJChERVNURElSKSQoREVGQVVMVF9DQUNIRV9ESVIpCisJJChJTlNUQUxMX1JPT1RfRElSKSAkKERFU1RESVIpJChERUZBVUxUX0xPQ0tfRElSKQorCSQoSU5TVEFMTF9ST09UX0RJUikgJChERVNURElSKSQoREVGQVVMVF9SVU5fRElSKQorCSQoSU5TVEFMTF9ST09UX0RBVEEpIC9kZXYvbnVsbCAkKERFU1RESVIpJChERUZBVUxUX0NBQ0hFX0RJUikvLmNhY2hlCisKK2luc3RhbGxfaW5pdHNjcmlwdHM6IAorCSQoTUFLRSkgLUMgc2NyaXB0cyBpbnN0YWxsX2luaXRzY3JpcHRzCisKK2luc3RhbGxfc3lzdGVtZF9nZW5lcmF0b3JzOgorCSQoTUFLRSkgLUMgc2NyaXB0cyBpbnN0YWxsX3N5c3RlbWRfZ2VuZXJhdG9ycworCSQoTUFLRSkgLUMgbWFuIGluc3RhbGxfc3lzdGVtZF9nZW5lcmF0b3JzCisKK2luc3RhbGxfc3lzdGVtZF91bml0czoKKwkkKE1BS0UpIC1DIHNjcmlwdHMgaW5zdGFsbF9zeXN0ZW1kX3VuaXRzCisKK2luc3RhbGxfYWxsX21hbjoKKwkkKE1BS0UpIC1DIG1hbiBpbnN0YWxsX2FsbF9tYW4KKworaWZlcSAoIkBQWVRIT05fQklORElOR1NAIiwgInllcyIpCitpbnN0YWxsX3B5dGhvbl9iaW5kaW5nczoKKwkkKE1BS0UpIC1DIGxpYmx2bS9weXRob24gaW5zdGFsbF9weXRob25fYmluZGluZ3MKK2VuZGlmCisKK2luc3RhbGxfdG1wZmlsZXNfY29uZmlndXJhdGlvbjoKKwkkKE1BS0UpIC1DIHNjcmlwdHMgaW5zdGFsbF90bXBmaWxlc19jb25maWd1cmF0aW9uCisKK0xDT1ZfVFJBQ0VTID0gbGliZG0uaW5mbyBsaWIuaW5mbyBsaWJsdm0uaW5mbyB0b29scy5pbmZvIFwKKwlsaWJkYWVtb24vY2xpZW50LmluZm8gbGliZGFlbW9uL3NlcnZlci5pbmZvIFwKKwlkYWVtb25zL2Nsdm1kLmluZm8gXAorCWRhZW1vbnMvZG1ldmVudGQuaW5mbyBcCisJZGFlbW9ucy9sdm1ldGFkLmluZm8gXAorCWRhZW1vbnMvbHZtbG9ja2QuaW5mbyBcCisJZGFlbW9ucy9sdm1wb2xsZC5pbmZvCisKK0NMRUFOX1RBUkdFVFMgKz0gJChMQ09WX1RSQUNFUykKKworaWZuZXEgKCIkKExDT1YpIiwgIiIpCisuUEhPTlk6IGxjb3YtcmVzZXQgbGNvdiBsY292LWRhdGVkICQoTENPVl9UUkFDRVMpCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxsY292LWRhdGVkKQorTENPVl9SRVBPUlRTX0RJUiA6PSBsY292X3JlcG9ydHMtJChzaGVsbCBkYXRlICslWSVtJWQlayVNJVMpCitsY292LWRhdGVkOiBsY292CitlbHNlCitMQ09WX1JFUE9SVFNfRElSIDo9IGxjb3ZfcmVwb3J0cworZW5kaWYKKworbGNvdi1yZXNldDoKKwkkKExDT1YpIC0temVyb2NvdW50ZXJzICQoYWRkcHJlZml4IC1kICwgJChiYXNlbmFtZSAkKExDT1ZfVFJBQ0VTKSkpCisKKyMgbWF5YmUgdXNlIHN1YmRpcnMgcHJvY2Vzc2luZyB0byBjcmVhdGUgdHJhY2VmaWxlcy4uLgorJChMQ09WX1RSQUNFUyk6CisJJChMQ09WKSAtYiAkKGJhc2VuYW1lICRAKSAtZCAkKGJhc2VuYW1lICRAKSBcCisJCS0taWdub3JlLWVycm9ycyBzb3VyY2UgLWMgLW8gLSB8ICQoU0VEKSBcCisJCS1lICJzL1woZG1ldmVudGRfbHZtLltjaF1cKS9wbHVnaW5zXC9sdm0yXC9cMS8iIFwKKwkJLWUgInMvZG1ldmVudGRfXChtaXJyb3JcfHNuYXBzaG90XHx0aGluXHxyYWlkXClcLmMvcGx1Z2luc1wvXDFcL2RtZXZlbnRkX1wxXC5jLyIgXAorCQk+JEAKKworaWZuZXEgKCIkKEdFTkhUTUwpIiwgIiIpCitsY292OiAkKExDT1ZfVFJBQ0VTKQorCSQoUk0pIC1yICQoTENPVl9SRVBPUlRTX0RJUikKKwkkKE1LRElSX1ApICQoTENPVl9SRVBPUlRTX0RJUikKKwlmb3IgaSBpbiAkKExDT1ZfVFJBQ0VTKTsgZG8gXAorCQl0ZXN0IC1zICQkaSAtYSAkJCh3YyAtdyA8JCRpKSAtZ2UgMTAwICYmIGxjPSIkJGxjICQkaSI7IFwKKwlkb25lOyBcCisJdGVzdCAteiAiJCRsYyIgfHwgJChHRU5IVE1MKSAtcCBAYWJzX3RvcF9idWlsZGRpckAgXAorCQktbyAkKExDT1ZfUkVQT1JUU19ESVIpICQkbGMKK2VuZGlmCisKK2VuZGlmCisKK2lmZXEgKCIkKFRFU1RJTkcpIiwgInllcyIpCisjIHRlc3RpbmcgYW5kIHJlcG9ydCBnZW5lcmF0aW9uCitSVUJZPXJ1YnkxLjkgLUlyZXBvcnQtZ2VuZXJhdG9ycy9saWIgLUlyZXBvcnQtZ2VuZXJhdG9ycy90ZXN0CisKKy5QSE9OWTogdW5pdC10ZXN0IHJ1YnktdGVzdCB0ZXN0LXByb2dyYW1zCisKKyMgRklYTUU6IHB1dCBkZXBlbmRlbmNpZXMgb24gbGliZG0gYW5kIGxpYmx2bQorIyBGSVhNRTogU2hvdWxkIGJlIGhhbmRsZWQgYnkgTWFrZWZpbGVzIGluIHN1YmRpcnMsIG5vdCBoZXJlIGF0IHRvcCBsZXZlbC4KK3Rlc3QtcHJvZ3JhbXM6CisJY2QgdW5pdC10ZXN0cy9yZWdleCAmJiAkKE1BS0UpCisJY2QgdW5pdC10ZXN0cy9kYXRhc3RydWN0ICYmICQoTUFLRSkKKwljZCB1bml0LXRlc3RzL21tICYmICQoTUFLRSkKKwordW5pdC10ZXN0OiB0ZXN0LXByb2dyYW1zCisJJChSVUJZKSByZXBvcnQtZ2VuZXJhdG9ycy91bml0X3Rlc3QucmIgJChzaGVsbCBmaW5kIC4gLW5hbWUgVEVTVFMpCisJJChSVUJZKSByZXBvcnQtZ2VuZXJhdG9ycy90aXRsZV9wYWdlLnJiCisKK21lbWNoZWNrOiB0ZXN0LXByb2dyYW1zCisJJChSVUJZKSByZXBvcnQtZ2VuZXJhdG9ycy9tZW1jaGVjay5yYiAkKHNoZWxsIGZpbmQgLiAtbmFtZSBURVNUUykKKwkkKFJVQlkpIHJlcG9ydC1nZW5lcmF0b3JzL3RpdGxlX3BhZ2UucmIKKworcnVieS10ZXN0OgorCSQoUlVCWSkgcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC90cy5yYgorZW5kaWYKKworaWZuZXEgKCQoc2hlbGwgd2hpY2ggY3RhZ3MpLCkKKy5QSE9OWTogdGFncwordGFnczoKKwl0ZXN0IC16ICIkKHNoZWxsIGZpbmQgJCh0b3Bfc3JjZGlyKSAtdHlwZSBmIC1uYW1lICcqLltjaF0nIC1uZXdlciB0YWdzIDI+L2Rldi9udWxsIHwgaGVhZCAtMSkiIHx8ICQoUk0pIHRhZ3MKKwl0ZXN0IC1mIHRhZ3MgfHwgZmluZCAkKHRvcF9zcmNkaXIpIC1tYXhkZXB0aCA1IC10eXBlIGYgLW5hbWUgJyouW2NoXScgLWV4ZWMgY3RhZ3MgLWEgJ3t9JyArCisKK0NMRUFOX1RBUkdFVFMgKz0gdGFncworZW5kaWYKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRmOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGUzYzllCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMzMgQEAKK1RoaXMgdHJlZSBjb250YWlucyB0aGUgTFZNMiBhbmQgZGV2aWNlLW1hcHBlciB0b29scyBhbmQgbGlicmFyaWVzLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBMVk0yIHJlYWQgdGhlIGNoYW5nZWxvZyBpbiB0aGUgV0hBVFNfTkVXIGZpbGUuCitJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGFyZSBpbiBJTlNUQUxMLgorCitUaGVyZSBpcyBubyB3YXJyYW50eSAtIHNlZSBDT1BZSU5HIGFuZCBDT1BZSU5HLkxJQi4KKworVGFyYmFsbHMgYXJlIGF2YWlsYWJsZSBmcm9tOgorICBmdHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vcHViL2x2bTIvCisKK1RoZSBzb3VyY2UgY29kZSBpcyBzdG9yZWQgaW4gZ2l0OgorICBodHRwOi8vZ2l0LmZlZG9yYWhvc3RlZC5vcmcvZ2l0L2x2bTIuZ2l0CisgIGdpdCBjbG9uZSBnaXQ6Ly9naXQuZmVkb3JhaG9zdGVkLm9yZy9naXQvbHZtMi5naXQKKworTWFpbGluZyBsaXN0IGZvciBnZW5lcmFsIGRpc2N1c3Npb24gcmVsYXRlZCB0byBMVk0yOgorICBsaW51eC1sdm1AcmVkaGF0LmNvbQorICBTdWJzY3JpYmUgZnJvbSBodHRwczovL3d3dy5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vbGludXgtbHZtCisKK01haWxpbmcgbGlzdHMgZm9yIExWTTIgZGV2ZWxvcG1lbnQsIHBhdGNoZXMgYW5kIGNvbW1pdHM6CisgIGx2bS1kZXZlbEByZWRoYXQuY29tCisgIFN1YnNjcmliZSBmcm9tIGh0dHBzOi8vd3d3LnJlZGhhdC5jb20vbWFpbG1hbi9saXN0aW5mby9sdm0tZGV2ZWwKKworICBsdm0yLWNvbW1pdHNAbGlzdHMuZmVkb3JhaG9zdGVkLm9yZyAoUmVhZC1vbmx5IGFyY2hpdmUgb2YgY29tbWl0cykKKyAgU3Vic2NyaWJlIGZyb20gaHR0cHM6Ly9mZWRvcmFob3N0ZWQub3JnL21haWxtYW4vbGlzdGluZm8vbHZtMi1jb21taXRzCisKK01haWxpbmcgbGlzdCBmb3IgZGV2aWNlLW1hcHBlciBkZXZlbG9wbWVudCwgaW5jbHVkaW5nIGtlcm5lbCBwYXRjaGVzCithbmQgbXVsdGlwYXRoLXRvb2xzOgorICBkbS1kZXZlbEByZWRoYXQuY29tCisgIFN1YnNjcmliZSBmcm9tIGh0dHBzOi8vd3d3LnJlZGhhdC5jb20vbWFpbG1hbi9saXN0aW5mby9kbS1kZXZlbAorCitUaGUgc291cmNlIGNvZGUgcmVwb3NpdG9yeSB1c2VkIHVudGlsIDd0aCBKdW5lIDIwMTIgaXMgYWNjZXNzaWJsZSBoZXJlOgorICBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2NnaS1iaW4vY3Zzd2ViLmNnaS9MVk0yLz9jdnNyb290PWx2bTIuCisKZGlmZiAtLWdpdCBhL1ZFUlNJT04gYi9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyY2VmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9WRVJTSU9OCkBAIC0wLDAgKzEgQEAKKzIuMDIuMTYzKDIpLWdpdCAoMjAxNi0wNy0yOCkKZGlmZiAtLWdpdCBhL1ZFUlNJT05fRE0gYi9WRVJTSU9OX0RNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWM0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9WRVJTSU9OX0RNCkBAIC0wLDAgKzEgQEAKKzEuMDIuMTMzLWdpdCAoMjAxNi0wNy0yOCkKZGlmZiAtLWdpdCBhL1dIQVRTX05FVyBiL1dIQVRTX05FVwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWYyZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvV0hBVFNfTkVXCkBAIC0wLDAgKzEsNDU2NyBAQAorVmVyc2lvbiAyLjAyLjE2MyAtIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZlcnNpb24gMi4wMi4xNjIgLSAyOHRoIEp1bHkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEV4dGVuZCB2Z192YWxpZGF0ZSBhbHNvIHRvIGNoZWNrIHJhaWQgY29uZmlndXJhdGlvbnMgdGhvcm91Z2hseS4KKyAgU3VwcG9ydCBsdmNvbnZlcnQgLVpuIGFsc28gd2hlbiBkb2luZyBmdWxsIGNhY2hlIHBvb2wgY29udmVyc2lvbi4KKyAgU3VwcHJlc3Mgbm90IHplcm9pbmcgd2FybiB3aGVuIGNvbnZlcnRpbmcgdG8gdGhpbiBMViBmb3Igbm9uLXplcm9pbmcgdHBvb2wuCisgIEZpeCBhdXRvbWF0aWMgdXBkYXRlcyBvZiBQViBleHRlbnNpb24gaGVhZGVycyB0byBuZXdlc3QgdmVyc2lvbi4KKyAgSW1wcm92ZSBsdmNvbnZlcnQgLS10cmFja2NoYW5nZXMgdmFsaWRhdGlvbiB0byByZXF1aXJlIC0tc3BsaXRtaXJyb3JzIDEuCisgIEFkZCBub3RlIGFib3V0IGxhc3Rsb2cgYnVpbHQtaW4gY29tbWFuZCB0byBsdm0gbWFuIHBhZ2UuCisgIEZpeCB1bnJlY29nbmlzZWQgc2VndHlwZSBmbGFnIG1lc3NhZ2UuCisgIGx2Y29udmVydCBub3QgY2xlYXJzIGNhY2hlIHBvb2wgbWV0YWRhdGEgT05MWSB3aXRoIC1abi4KKyAgQWRkIGFsbG9jYXRpb24vcmFpZF9zdHJpcGVfYWxsX2RldmljZXMgdG8gcmVpbnN0YXRlIHByZXZpb3VzIGJlaGF2aW91ci4KKyAgQ3JlYXRlIHJhaWQgc3RyaXBlcyBhY3Jvc3MgZml4ZWQgc21hbGwgbnVtYmVycyBvZiBQVnMgaW5zdGVhZCBvZiBhbGwgUFZzLgorICBFbmFibGVkIGx2Y29udmVydCAtLXVuY2FjaGUgdG8gd29yayB3aXRoIHBhcnRpYWwgVkcuCisgIERpc2FsbG93IGx2Y29udmVydCAtLXJlcGxhY2Ugd2l0aCByYWlkMCogTFZzLgorICBGaXggc29tZSBsdm1ldGFkIGNoYW5nZWQgVkcgbWV0YWRhdGEgbm90aWZpY2F0aW9ucyB0aGF0IHNlbnQgdW5jb21taXR0ZWQgZGF0YS4KKworVmVyc2lvbiAyLjAyLjE2MSAtIDE1dGggSnVseSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUHJvaGliaXQgc29tZSBsdmNoYW5nZS9sdnJlc2l6ZSB0aGF0IHdlcmUgZmFpbGluZyBvbiByYWlkMCB2b2x1bWVzLgorICBGaXggc2VnZmF1bHRzIGluIGNvbXBsZXggdmdzcGxpdHMuICgyLjAyLjE1OSkKKyAgUmVmb3JtYXQgdW53aWVsZHkgbHZjb252ZXJ0IG1hbiBwYWdlLgorICBBbGxvdyAtLWZvcmNlIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHB2Y3JlYXRlIGZyb20gdmdjcmVhdGUuICgyLjAyLjE0NCkKKyAgRml4IGx2cmVzaXplIG9mIGZpbGVzeXN0ZW0gd2hlbiBMViBoYXMgYWxyZWFkeSByaWdodCBzaXplICgyLjAyLjE0MSkKKyAgTmV3IExWTV9MT0dfRklMRV9NQVhfTElORVMgZW52IHZhciB0byBsaW1pdCBtYXggc2l6ZSBvZiBjcmVhdGVkIGxvZ3MuCisKK1ZlcnNpb24gMi4wMi4xNjAgLSA2dGggSnVseSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNaW5vciBmaXhlcyBmcm9tIGNvdmVyaXR5LgorCitWZXJzaW9uIDIuMDIuMTU5IC0gNnRoIEp1bHkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHJhaWQwX21ldGEgc2VnbWVudCB0eXBlIHRoYXQgcHJvdmlkZXMgbWV0YWRhdGEgc3BhY2UgZm9yIHJhaWQgY29udmVyc2lvbnMuCisgIEZpeCBjcmVhdGVkIGxpbmsgZm9yIGEgdXNlZCBwb29sIGZvciB2Z21rbm9kZS4KKyAgSW50cm9kdWNlIGFuZCB1c2UgaXNfcG93ZXJfb2ZfMiBtYWNyby4KKyAgU3VwcG9ydCBjb252ZXJzaW9ucyBiZXR3ZWVuIHN0cmlwZWQgYW5kIHJhaWQwIHNlZ21lbnQgdHlwZXMuCisgIEFkZCBpbmZyYXN0cnVjdHVyZSBmb3IgcmFpZCB0YWtlb3ZlciBsdmNvbnZlcnQgb3B0aW9ucy4KKworVmVyc2lvbiAyLjAyLjE1OCAtIDI1dGggSnVuZSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGEgbW9yZSBlZmZpY2llbnQgbmF0aXZlIHZnaW1wb3J0Y2xvbmUgY29tbWFuZCB0byByZXBsYWNlIHRoZSBzY3JpcHQuCisgIE1ha2UgbHZtbG9ja2QgYWx3YXlzIGF0dGVtcHQgdG8gY29ubmVjdCB0byBsdm1ldGFkIGlmIG5vIGNvbm5lY3Rpb24gZXhpc3RzLgorICBMZXQgbHZtZXRhZCBoYW5kbGUgbmV3IGNvbm5lY3Rpb25zIGFmdGVyIHNodXRkb3duIHNpZ25hbC4KKyAgRGlzYWJsZSBsdm1ldGFkIHdoZW4gdmdjZmdyZXN0b3JlIGJlZ2lucyBhbmQgZW5hYmxlIGl0IGFnYWluIGFmdGVyLgorICBNYWtlIHB2c2NhbiBkbyBhY3RpdmF0aW9uIGlmIGx2bWV0YWQgaXMgY29uZmlndXJlZCBidXQgbm90IHJ1bm5pbmcuCisgIEZpeCByZXNjYW5uaW5nIHRoZSBQVnMgZm9yIGEgc2luZ2xlIFZHIHdoZW4gdXNpbmcgbHZtZXRhZC4KKyAgUG9vbCBtZXRhZGF0YSBsdnJlc2l6ZSB1c2VzIG5vdyBzYW1lIGNvZGUgYXMgcmVzaXplIG9mIG5vcm1hbCB2b2x1bWUuCisgIFByZXNlcnZlIG1vbml0b3Jpbmcgc3RhdHVzIHdoZW4gdXBkYXRpbmcgdGhpbi1wb29sIG1ldGFkYXRhLgorICBSZXR1cm4gMCAoaW5hY3RpdmUpIHdoZW4gc3RhdHVzIGNhbm5vdCBiZSBxdWVyaWVkIGluIF9sdl9hY3RpdmUoKS4KKyAgU3dpdGNoIHRvIGxvZ193YXJuKCkgZm9yIGZhaWxpbmcgYWN0aXZhdGlvbiBzdGF0dXMgcXVlcnkuCisgIFJlcGxhY2UgdmdpbXBvcnRjbG9uZSBzY3JpcHQgd2l0aCBiaW5hcnkuCisgIFdoaWxlIGx2bWV0YWQgaXMgc2h1dHRpbmcgZG93biwgY29udGludWUgaGFuZGxpbmcgYWxsIGNvbm5lY3Rpb25zIGNsZWFubHkuCisgIFJlZmFjdG9yIGx2Y29udmVydCBhcmd1bWVudCBoYW5kbGluZyBjb2RlLgorICBOb3RpZnkgbHZtZXRhZCB3aGVuIHZnY2ZncmVzdG9yZSBjaGFuZ2VzIFZHIG1ldGFkYXRhLgorICBBZGQgLS1sb2dvbmx5IG9wdGlvbiB0byByZXBvcnQgb25seSBjbWQgbG9nIGZvciBhIGNvbW1hbmQsIG5vdCBvdGhlciByZXBvcnRzLgorICBBZGQgbG9nL2NvbW1hbmRfbG9nX3NlbGVjdGlvbiB0byBjb25maWd1cmUgZGVmYXVsdCBzZWxlY3Rpb24gdXNlZCBvbiBjbWQgbG9nLgorICBVc2UgJ29ycGhhbicgb2JqZWN0IHR5cGUgaW4gY21kIGxvZyBmb3IgZ3JvdXBzIHRvIGNvbGxlY3QgUFZzIG5vdCB5ZXQgaW4gVkdzLgorICBBZGQgbHZtIGxhc3Rsb2cgY29tbWFuZCBmb3IgcXVlcnkgYW5kIGRpc3BsYXkgb2YgbGFzdCBjbWQncyBsb2cgaW4gbHZtIHNoZWxsLgorICBSZXBvcnQgcGVyLW9iamVjdCByZXR1cm4gY29kZXMgdmlhIGNtZCBsb2cgd2hpbGUgcHJvY2Vzc2luZyBtdWx0aXBsZSBvYmplY3RzLgorICBBbm5vdGF0ZSBwcm9jZXNzaW5nIGNvZGUgd2l0aCBsb2cgcmVwb3J0IGhvb2tzIGZvciBwZXItb2JqZWN0IGNvbW1hbmQgbG9nLgorICBBbHNvIHBhc3MgY29tbW9uIHByaW50ZWQgbWVzc2FnZXMgKGJlc2lkZXMgd2FybmluZ3MgYW5kIGVycm9ycykgdG8gbG9nIHJlcG9ydC4KKyAgTG9nIHdhcm5pbmdzIGFuZCBlcnJvcnMgdmlhIHJlcG9ydCBkdXJpbmcgY21kIHByb2Nlc3NpbmcgaWYgdGhpcyBpcyBlbmFibGVkLgorICBNYWtlIGl0IHBvc3NpYmxlIHRvIGl0ZXJhdGUgb3ZlciBpbnRlcm5hbCAnb3JwaGFuJyBWR3MgaW4gcHJvY2Vzc19lYWNoX3ZnIGZuLgorICBNYWtlIC1TfC0tc2VsZWN0IG9wdGlvbiBncm91cGFibGUgdGhhdCBhbGxvd3MgdGhpcyBvcHRpb24gdG8gYmUgcmVwZWF0ZWQuCisgIE1ha2UgLU98LS1zb3J0IG9wdGlvbiBncm91cGFibGUgdGhhdCBhbGxvd3MgdGhpcyBvcHRpb24gdG8gYmUgcmVwZWF0ZWQuCisgIEFkZCAtLWNvbmZpZ3JlcG9ydCBvcHRpb24gdG8gc2VsZWN0IHJlcG9ydCBmb3Igd2hpY2ggbmV4dCBvcHRpb25zIGFyZSBhcHBsaWVkLgorICBBZGQgc3VwcG9ydCBmb3IgcHJpb3JpdGllcyBvbiBncm91cGluZyBjb21tYW5kIGFyZ3VtZW50cy4KKyAgQWRkIHJlcG9ydC97cHZzLHZncyxsdnMscHZzZWdzLHNlZ3N9X3tjb2xzLHNvcnR9X2Z1bGwgdG8gbHZtLmNvbmYuCisgIEFkZCBsdm0gZnVsbHJlcG9ydCBjb21tYW5kIGZvciBqb2luZWQgUFYsIFZHLCBMViBhbmQgc2VnbWVudCByZXBvcnQgcGVyIFZHLgorICBJbnRlZ3JhdGUgcmVwb3J0IGdyb3VwIGhhbmRsaW5nIGFuZCBjbWQgbG9nIHJlcG9ydCBpbnRvIGNtZCBwcm9jZXNzaW5nIGNvZGUuCisgIEFkZCBsb2cvcmVwb3J0X2NvbW1hbmRfbG9nIHRvIGx2bS5jb25mIHRvIGVuYWJsZSBvciBkaXNhYmxlIGNtZCBsb2cgcmVwb3J0LgorICBBZGQgbG9nL3JlcG9ydF9vdXRwdXRfZm9ybWF0IHRvIGx2bS5jb25mIGZvciBkZWZhdWx0IHJlcG9ydCBvdXRwdXQgZm9ybWF0LgorICBSZWNvZ25pemUgLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259IG9wdGlvbiB0byBzZWxlY3QgcmVwb3J0IG91dHB1dCBmb3JtYXQuCisgIEFkZCBsb2cvY29tbWFuZF9sb2dfe3NvcnQsY29sc30gdG8gbHZtLmNvbmYgdG8gY29uZmlndXJlIGNvbW1hbmQgbG9nIHJlcG9ydC4KKyAgQWRkIGxvZ19vYmplY3Rfe3R5cGUsbmFtZSxpZCxncm91cCxncm91cF9pZH0gZmllbGRzIHRvIGNtZCBsb2cuCisgIEFkZCBsb2dfe3NlcV9udW0sdHlwZSxjb250ZXh0LG1lc3NhZ2UsZXJybm8scmV0X2NvZGV9IGZpZWxkcyB0byBjbWQgbG9nLgorICBBZGQgQ01ETE9HIHJlcG9ydCB0eXBlIC0gYSBzZXBhcmF0ZSByZXBvcnQgdHlwZSBmb3IgY29tbWFuZCBsb2dnaW5nLgorCitWZXJzaW9uIDIuMDIuMTU3IC0gMTd0aCBKdW5lIDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDaGFuZ2UgcHZzY2FuIC0tY2FjaGUgLWFheSB0byBzY2FuIGxvY2FsbHkgaWYgbHZtZXRhZCBmYWlscy4KKworVmVyc2lvbiAyLjAyLjE1NiAtIDExdGggSnVuZSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRG9uJ3QgYWxsb3cgZHVwbGljYXRlIG9ycGhhbiBQVnMgdG8gYmUgdXNlZCB3aXRoIHZnY3JlYXRlL3ZnZXh0ZW5kL3B2Y3JlYXRlLgorICBJbXByb3ZlIGhhbmRsaW5nIG9mIGx2bWV0YWQgdXBkYXRlIGZhaWx1cmVzLgorICBZZXMvTm8gcHJvbXB0IGFjY2VwdHMgJ15bIF50XSooW1l5XShbRWVdKFtTc118KXwpfFtObl0oW09vXXwpKVsgXnRdKiQnLgorICBJZiBhdmFpbGFibGUsIGFsc28gY29sbGVjdCBvdXRwdXQgZnJvbSBsc2JsayBjb21tYW5kIHdoZW4gcnVubmluZyBsdm1kdW1wIC1zLgorCitWZXJzaW9uIDIuMDIuMTU1IC0gM3JkIEp1bmUgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVqZWN0IFBWIHRhZ3Mgb24gcHZtb3ZlIGNtZGxpbmUgYmVjYXVzZSBvbmx5IDEgUFYgaXMgc3VwcG9ydGVkLiAoMi4wMi4xNDEpCisgIEZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGggY29uZmlndXJlIC0tZGlzYWJsZS1kZXZtYXBwZXIuCisgIEZpeCBsdm1jb25maWcgLS10eXBlIGRpZmYgdG8gZGlzcGxheSBjb21wbGV0ZSBkaWZmIGlmIGNvbmZpZyBjYXNjYWRlIHVzZWQuCisgIEF1dG9tYXRpY2FsbHkgZmlsdGVyIG91dCBwYXJ0aXRpb25lZCBsb29wIGRldmljZXMgd2l0aCBwYXJ0c2NhbiAobG9zZXR1cCAtUCkuCisgIEZpeCBsdm0gZGV2dHlwZXMgaW50ZXJuYWwgZXJyb3IgaWYgLVMgdXNlZCB3aXRoIGZpZWxkIG5hbWUgZnJvbSBwdnMvdmdzL2x2cy4KKyAgV2hlbiByZXBvcnRpbmcgRGF0YSUsU25hcCUsTWV0YSUsQ3B5JVN5bmMgdXNlIHNpbmdsZSBpb2N0bCBwZXIgTFYuCisgIEFkZCBsdnNlZ19wZXJjZW50X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cygpIGZvciBwZXJjZW50IHJldHJpZXZhbC4KKyAgRW5oYW5jZSBpbnRlcm5hbCBzZWdfc3RhdHVzIGhhbmRsaW5nIHRvIHVuZGVyc3RhbmQgc25hcHNob3RzIGJldHRlci4KKyAgV2hlbiByZWZyZXNoIGZhaWxlZCBpbiBzdXNwZW5kLCBjYWxsIHJlc3VtZSB1cG9uIGVycm9yIHBhdGguCisgIFN1cHBvcnQgcGFzc3Rocm91Z2ggY2FjaGUgbW9kZSB3aGVuIHdhaXRpbmcgZm9yIGNsZWFuIGNhY2hlLgorICBDaGVjayBjYWNoZSBzdGF0dXMgb25seSBmb3IgJ2luLXVzZScgY2FjaGUgcG9vbHMuCisgIEV4dGVuZCBzZXR1cF90YXNrKCkgdG8gcHJlc2V0IGZsdXNoaW5nIGZvciBkbV90YXNrIG9iamVjdC4KKyAgV2hlbiBjaGVja2luZyBMViBpcyBhIG1lcmdpbmcgQ09XLCB2YWxpZGF0ZSBpdHMgYSBDT1cgTFYgZmlyc3QuCisgIENvcnJlY3RpbmcgdmFsdWUgaW4gY29weV9wZXJjZW50KCkgZm9yIDEwMCUuCisgIFVwZGF0ZSB2Z3JlZHVjZSB0byB1c2UgcHJvY2Vzc19lYWNoX3ZnLgorICBVcGRhdGUgbHZjb252ZXJ0IHRvIHVzZSBwcm9jZXNzX2VhY2hfbHYuCisgIFVwZGF0ZSBwdnNjYW4gdG8gdXNlIHByb2Nlc3NfZWFjaF92ZyBmb3IgYXV0b2FjdGl2YXRpb24uCisgIEFkZCBiYXNpYyBzdXBwb3J0IGZvciAtLXR5cGUgcmFpZDAgdXNpbmcgbWQuCisgIEFkZCBzdXBwb3J0IGZvciBsdmNoYW5nZSAtLWNhY2hlbW9kZSBmb3IgY2FjaGVkIExWLgorICBGaXggbGlibHZtMmFwcCBlcnJvciBoYW5kbGluZyB3aGVuIHNldHRpbmcgdXAgY29udGV4dC4KKyAgRGVsYXkgbGlibHZtMmFwcCBpbml0IGluIHB5dGhvbiBjb2RlIHVudGlsIGl0IGlzIG5lZWRlZC4KKyAgU2ltcGxpZnkgdGhyZWFkIGxvY2tpbmcgaW4gbHZtZXRhZCB0byBmaXggbG9ja2luZyBwcm9ibGVtcy4KKyAgQWxsb3cgcHZyZW1vdmUgLWZmIHRvIHJlbW92ZSBhIGR1cGxpY2F0ZSBQVi4KKyAgRml4IGx2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3IgdG8gcmVhZCBsdm0uY29uZiB3aXRob3V0IGZ1bGwgY29tbWFuZCBzZXR1cC4KKyAgQWxsb3cgYSBtaW5pbWFsIGNvbnRleHQgdG8gYmUgdXNlZCBpbiBsdm0yYXBwIGZvciByZWFkaW5nIGx2bS5jb25mLgorCitWZXJzaW9uIDIuMDIuMTU0IC0gMTR0aCBNYXkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGxpYmx2bSBzZWdmYXVsdCBhZnRlciBmYWlsdXJlIGluaXRpYWxpc2luZyBsdm1ldGFkIGNvbm5lY3Rpb24uCisgIFJldHJ5IG9wZW4gd2l0aG91dCBPX05PQVRJTUUgaWYgaXQgZmFpbHMgKG5vdCBmaWxlIG93bmVyL0NBUF9GT1dORVIpLgorICBTcGxpdCBfcmVwb3J0IGludG8gb25lIGZuIGZvciBvcHRpb25zIGFuZCBhcmd1bWVudHMgYW5kIG9uZSBmb3IgcHJvY2Vzc2luZy4KKworVmVyc2lvbiAyLjAyLjE1MyAtIDd0aCBNYXkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDaGFuZ2Ugd2FybmluZyBtZXNzYWdlcyByZWxhdGVkIHRvIGR1cGxpY2F0ZSBQVnMuCisgIEEgbmFtZWQgZGV2aWNlIGlzIGFsd2F5cyBwcm9jZXNzZWQgaXRzZWxmLCBub3Qgc3dpdGNoZWQgZm9yIGEgZHVwbGljYXRlLgorICBBZGQgUFYgYXR0ciAiZCIgYW5kIHJlcG9ydCBmaWVsZCAiZHVwbGljYXRlIiBmb3IgZHVwbGljYXRlIFBWcy4KKyAgQWRkIGNvbmZpZyBzZXR0aW5nIHRvIGRpc2FsbG93IFZHIGNoYW5nZXMgd2hlbiBkdXBsaWNhdGUgUFZzIGV4aXN0LgorICBVc2UgZGV2aWNlIHNpemUgYW5kIGFjdGl2ZSBMVnMgdG8gY2hvb3NlIHRoZSBwcmVmZXJyZWQgZHVwbGljYXRlIFBWLgorICBEaXNhYmxlIGx2bWV0YWQgd2hlbiBkdXBsaWNhdGUgUFZzIGFyZSBzZWVuLgorICBTdXBwb3J0IC0tY2h1bmtzaXplIG9wdGlvbiBhbHNvIHdoZW4gY2FjaGluZyBMViB3aGVuIHBvc3NpYmxlLgorICBBZGQgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHRhcmdldCBwcmVzZW5jZSBhbmQgdmVyc2lvbiB2aWEgMSBpb2N0bC4KKworVmVyc2lvbiAyLjAyLjE1MiAtIDMwdGggQXByaWwgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVc2UgYW55IGluaGVyaXRlZCB0YWdzIHdoZW4gd2lwaW5nIG1ldGFkYXRhIHN1YiBMVnMgdG8gZW5zdXJlIGFjdGl2YXRpb24uCisgIEFkZCBzdHJfbGlzdF93aXBlLgorICBJbXByb3ZlIHN1cHBvcnQgZm9yIGludGVycnVwdGluZyBwcm9jZXNpbmcgb2Ygdm9sdW1lcyBkdXJpbmcgbHZjaGFuZ2UuCisgIFVzZSBmYWlsZWQgY29tbWFuZCByZXR1cm4gY29kZSB3aGVuIGx2Y2hhbmdpbmcgcmVhZC1vbmx5IHZvbHVtZS4KKyAgU2hvdyBjcmVhdGlvbiB0cmFuc2FjdGlvbl9pZCBhbmQgemVyb2luZyBzdGF0ZSBvZiBwb29sIHdpdGggdGhpbiB2b2x1bWUuCisgIFN0b3AgY2hlY2tpbmcgZm9yIGRtX2NhY2hlX21xIHBvbGljeSB3aXRoIGNhY2hlIHRhcmdldCAxLjkgKGFsaWFzIHRvIHNtcSkuCisgIENoZWNrIGZpcnN0IC9zeXMvbW9kdWxlL2RtXyogZGlyIGV4aXN0YW5jZSBiZWZvcmUgdXNpbmcgbW9kcHJvYmUuCisgIFJlbW92ZSBtcGF0aCBmcm9tIDEwLWRtLnJ1bGVzLCBzdXBlcnNlZGVkIGJ5IDExLWRtLW1wYXRoLnJ1bGVzIChtcGF0aD49MC42LjApLgorCitWZXJzaW9uIDIuMDIuMTUxIC0gMjNyZCBBcHJpbCAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBlcnJvciBwYXRoIGFmdGVyIHJldXNpbmcgb2YgX3NldHVwX3Rhc2sgKDIuMDIuMTUwKS4KKyAgRml4IG1lbW9yeSBhY2Nlc3MgZm9yIGVtcHR5IHN5c2ZzIHZhbHVlcyAoMi4wMi4xNDkpLgorICBEaXNhYmxlIGx2bWV0YWQgd2hlbiBsdm0xIG1ldGFkYXRhIGlzIHNlZW4sIHNvIGNvbW1hbmRzIHJldmVydCB0byBzY2FubmluZy4KKyAgU3VwcHJlc3MgZXJyb3JzIHdoZW4gc25hcHNob3QgbWVyZ2UgZ2V0cyBkZWxheWVkIGJlY2F1c2Ugdm9sdW1lIGlzIGluIHVzZS4KKyAgQXZvaWQgaW50ZXJuYWwgc25hcHNob3QgTFYgbmFtZXMgaW4gbWVzc2FnZXMuCisgIEF1dG9kZXRlY3QgYW5kIHVzZSAvcnVuL2xvY2sgZGlyIHdoZW4gYXZhaWxhYmxlIGluc3RlYWQgb2YgL3Zhci9sb2NrLgorICBsdmNoYW5nZSAtLXJlZnJlc2ggZm9yIG1lcmdpbmcgdGhpbiBvcmlnaW4gd2lsbCByZXRyeSB0byBkZWFjdGl2YXRlIHNuYXBzaG90LgorICBSZWNvZ25pemUgaW4tcHJvZ3Jlc3Mgc25hcHNob3QgbWVyZ2UgZm9yIHRoaW4gdm9sdW1lcyBmcm9tIGRtIHRhYmxlLgorICBBdm9pZCBkZWNpZGluZyB0byBpbml0aWF0ZSBhIHBlbmRpbmcgc25hcHNob3QgbWVyZ2UgZHVyaW5nIHJlc3VtZS4KKyAgSW1wcm92ZSByZXRyeWluZyBsdm1ldGFkIHJlcXVlc3RzIHdoaWxlIGx2bWV0YWQgaXMgYmVpbmcgdXBkYXRlZC4KKyAgUmVhZCBkZXZpY2VzIGluc3RlYWQgb2YgdXNpbmcgdGhlIGx2bWV0YWQgY2FjaGUgaWYgcmVzY2FuIGZhaWxzLgorICBNb3ZlIGx2bWV0YWQgdG9rZW4vZmlsdGVyIGNoZWNrIGFuZCBkZXZpY2UgcmVzY2FuIHRvIHRoZSBzdGFydCBvZiBjb21tYW5kcy4KKyAgRG9uJ3QgdHJ5IGRlYWN0aXZhdGluZyBmaWN0aW9uYWwgaW50ZXJuYWwgTFYgYmVmb3JlIHNuYXBzaG90IG1lcmdlLiAoMi4wMi4xMDUpCisgIFdoZW4gbm90IG9idGFpbmluZyBkZXZzIGZyb20gdWRldiwgY2hlY2sgdGhleSBleGlzdCBiZWZvcmUgY2FjaGluZyB0aGVtLgorICBEZXRlY3QgZGV2aWNlIG1pc21hdGNoIGFsc28gd2hlbiBjb21waWxpbmcgd2l0aG91dCB1ZGV2IHN1cHBvcnQuCisKK1ZlcnNpb24gMi4wMi4xNTAgLSA5dGggQXByaWwgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEF2b2lkIHVzaW5nIGZsdXNoaW5nIGRtIHN0YXR1cyBpb2N0bCB3aGVuIGNoZWNraW5nIGZvciB1c2FibGUgRE0gZGV2aWNlLgorICBDaGVjayBmb3IgZGV2aWNlcyB3aXRob3V0IExWTS0gdXVpZCBwcmVmaXggb25seSB3aXRoIGtlcm5lbHMgPCAzLlguCisgIFJldXNlICVGUkVFIHNpemUgYXByb3hpbWF0aW9uIHdpdGggbHZjcmVhdGUgLWwlUFZTIHRoaW4tcG9vbC4KKyAgQWxsb3cgdGhlIGx2bWR1bXAgZGlyZWN0b3J5IHRvIGV4aXN0IGFscmVhZHkgcHJvdmlkZWQgaXQgaXMgZW1wdHkuCisgIFNob3cgbHZjb252ZXJ0ZWQgcGVyY2VudGFnZSB3aXRoIDIgZGVjaW1hbCBkaWdpdHMuCisgIEZpeCByZWdyZXNzaW9uIGluIHN1c3BlbmQgd2hlbiByZXBhaXJpbmcgLS10eXBlIG1pcnJvciAoMi4wMi4xMzMpLgorCitWZXJzaW9uIDIuMDIuMTQ5IC0gMXN0IEFwcmlsIDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEbyBub3QgZmx1c2ggdGhpbi1wb29sIHdoZW4gY2hlY2tpbmcgbWV0YWRhdGEgZnVsbG5lc3MuCisgIFJlbW92ZSBzcHVyaW91cyBlcnJvciBhYm91dCBubyB2YWx1ZSBpbiAvc3lzL2Rldi9ibG9jay9tYWpvcjptaW5vci9kbS91dWlkLgorICBGaXggZGV2aWNlIG1pc21hdGNoIGRldGVjdGlvbiBmb3IgTFYgaWYgcGVyc2lzdGVudCAuY2FjaGUgZmlsZSBpcyB1c2VkLgorICBGaXggaG9sZGVyIGRldmljZSBub3QgYmVpbmcgZm91bmQgaW4gL2RldiB3aGlsZSBzeXNmcyBoYXMgaXQgZHVyaW5nIGRldiBzY2FuLgorCitWZXJzaW9uIDIuMDIuMTQ4IC0gMjZ0aCBNYXJjaCAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEludHJvZHVjZSBUQVJHRVRfTkFNRSBhbmQgTU9EVUxFIE5BTUUgbWFjcm9zLgorICBSZXBsYWNlIGhhcmQtY29kZWQgbW9kdWxlIGFuZCB0YXJnZXQgbmFtZXMgd2l0aCBtYWNyb3MuCisgIEFkZCBwdl9tYWpvciBhbmQgcHZfbWlub3IgcmVwb3J0IGZpZWxkcy4KKyAgRGV0ZWN0IGFuZCB3YXJuIGFib3V0IG1pc21hdGNoIGJldHdlZW4gZGV2aWNlcyB1c2VkIGFuZCBhc3N1bWVkIGZvciBhbiBMVi4KKworVmVyc2lvbiAyLjAyLjE0NyAtIDE5dGggTWFyY2ggMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJZiBhdmFpbGFibGUsIHVzZSAvcHJvYy9zZWxmL21vdW50aW5mbyB0byBkZXRlY3QgbW91bnRlZCB2b2x1bWUgaW4gZnNhZG0uCisgIEZpeCByZXNpemUgb2Ygc3RhY2tlZCByYWlkIHRoaW4gZGF0YSB2b2x1bWUgKDIuMDIuMTQxKS4KKyAgRml4IHRlc3QgZm9yIGx2cmVtb3ZlIGZhaWx1cmUgaW4gbHZjb252ZXJ0IC0tdW5jYWNoZSAoMi4wMi4xNDYpLgorCitWZXJzaW9uIDIuMDIuMTQ2IC0gMTF0aCBNYXJjaCAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1vcmUgbWFuIHBhZ2UgY2xlYW51cHMgaW4gbHZjb252ZXJ0LgorICBGaXggbWFrZWZpbGUgdnBhdGggaW4gL3VkZXYgd2hlbiBnZW5lcmF0aW5nIHVkZXYgcnVsZXMgZmlsZXMuCisgIEFub3RoZXIgYXR0ZW1wdCB0byBpbXByb3ZlIFZHIG5hbWUgcGFyc2luZyBmb3IgbHZjb252ZXJ0ICgyLjAyLjE0NCkuCisgIFVzZSBuZXcgY2FjaGUgc3RhdHVzIGluZm8gYW5kIHNraXAgZmx1c2hpbmcgZm9yIGZhaWxlZCBjYWNoZS4KKyAgU3VwcG9ydCAtLXVuY2FjaGUgd2l0aCBtaXNzaW5nIFBWcy4KKyAgVGlkeSByZXBvcnQgZmllbGQgbmFtZXMsIGhlYWRpbmdzIGFuZCB3aWR0aHMuCisgIEFkZCB2Z3NjYW4gLS1ub3RpZnlkYnVzIHRvIHNlbmQgYSBkYnVzIG5vdGlmaWNhdGlvbi4KKyAgQWRkIGRidXMgbm90aWZpY2F0aW9uIGZyb20gY29tbWFuZHMgYWZ0ZXIgYSBQVi9WRy9MViBjaGFuZ2VzIHN0YXRlLgorCitWZXJzaW9uIDIuMDIuMTQ1IC0gNHRoIE1hcmNoIDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBsdnJlbW92ZSBhbmQgbHZyZW5hbWUgb24gaGlzdG9yaWNhbCBMVnMuCisgIEZvciBoaXN0b3JpY2FsIExWcywgcmVwb3J0ICdub25lJyBmb3IgbHZfbGF5b3V0IGFuZCAnaGlzdG9yeScgZm9yIGx2X3JvbGUuCisgIEFkZCBmdWxsX3thbmNlc3RvcnMsZGVzY2VuZGFudHN9IGZpZWxkcyB0byByZXBvcnQgTFYgYW5jZXN0cnkgd2l0aCBoaXN0b3J5LgorICBSZXBvcnQgKGgpaXN0b3JpY2FsIHN0YXRlIHdpdGhpbiA1dGggYml0IChTdGF0ZSkgb2YgdGhlIGx2X2F0dHIgZmllbGQuCisgIEFkZCBsdl9oaXN0b3JpY2FsIHJlcG9ydGluZyBmaWVsZCB0byByZXBvcnQgaWYgTFYgaXMgaGlzdG9yaWNhbCBvciBub3QuCisgIEFkZCBsdl90aW1lX3JlbW92ZWQgcmVwb3J0aW5nIGZpZWxkIHRvIGRpc3BsYXkgcmVtb3ZhbCB0aW1lIGZvciBoaXN0LiBMVnMuCisgIFJlcG9ydCBsdl9uYW1lLCBsdl91dWlkLCB2Z19uYW1lLCBsdl90aW1lIGZvciBoaXN0b3JpY2FsIExWcy4KKyAgQWRkIC0tbm9oaXN0b3J5IHN3aXRjaCB0byBsdnJlbW92ZSB0byBkaXNhYmxlIGhpc3RvcnkgcmVjb3JkaW5nIG9uIGRlbWFuZC4KKyAgQWRkIC1IfC0taGlzdG9yeSBzd2l0Y2ggdG8gbHZzIGFuZCBsdmRpc3BsYXkgdG8gaW5jbHVkZSBoaXN0b3JpY2FsIExWcy4KKyAgQ3JlYXRlIGhpc3RvcmljYWwgTFZzIG91dCBvZiByZW1vdmVkIHRoaW4gc25hcHNob3QgTFZzIGFuZCByZWNvcmQgaW4gaGlzdG9yeS4KKyAgQWRkIG1ldGFkYXRhL2x2c19oaXN0b3J5X3JldGVudGlvbl90aW1lIGZvciBhdXRvbWF0aWMgcmVtb3ZhbCBvZiBoaXN0LiBMVnMuCisgIEFkZCBtZXRhZGF0YS9yZWNvcmRfbHZzX2hpc3RvcnkgY29uZmlnIGZvciBzd2l0Y2hpbmcgTFYgaGlzdG9yeSByZWNvcmRpbmcuCisgIEFkZCBzdXBwb3J0IGFuZCBpbmZyYXN0cnVjdHVyZSBmb3IgdHJhY2tpbmcgaGlzdG9yaWNhbCBMVnMuCisgIEltcHJvdmUgbHZjb252ZXJ0IG1hbiBwYWdlLgorICBBZGQga2VybmVsX2NhY2hlX3BvbGljeSBsdnMgZmllbGQuCisgIERpc3BsYXkgW3Vua25vd25dIGluc3RlYWQgb2YgJ3Vua25vd24gZGV2aWNlJyBpbiBwdnMgb3V0cHV0LgorICBGaXggZXJyb3IgcGF0aCB3aGVuIHB2Y3JlYXRlIGFsbG9jYXRpb24gZmFpbHMgKDIuMDIuMTQ0KS4KKyAgRGlzcGxheSBbdW5rbm93bl0gaW5zdGVhZCBvZiBibGFuayBmb3IgdW5rbm93biBWRyBuYW1lcyBpbiBwdnMgb3V0cHV0LgorCitWZXJzaW9uIDIuMDIuMTQ0IC0gMjZ0aCBGZWJydWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVzZSBuZXcgUFYgcHJvY2Vzc2luZyBjb2RlIGluIHB2Y3JlYXRlL3ZnY3JlYXRlL3ZnZXh0ZW5kL3B2cmVtb3ZlLgorICBBZGQgbmV3IFBWIHByb2Nlc3NpbmcgY29kZSB0aGF0IHByb21wdHMgdXNlciB3aXRob3V0IGxvY2tzIGhlbGQuCisgIFByZXZlbnQgbHZtbG9ja2QgYmxvY2tpbmcgd2l0aCBuZXcgZmxhZyByZXF1aXJpbmcgc2FubG9jayAzLjMuMC4KKyAgT25seSBzaG93ICh1KXNlZCBwdl9hdHRyIGNoYXIgd2hlbiBQViBpcyBub3QgKGEpbGxvY2F0YWJsZS4gKDIuMDIuMTQzKQorICBVcGRhdGUgbWFrZWZpbGUgdG8gZ2VuZXJhdGUgbGNvdiBvdXRwdXQgYWxzbyBmb3IgbHZtcG9sbGQgYW5kIGx2bWxvY2tkLgorICBGaXggU3lzdGVtZFNlcnZpY2UgbHZtMi1sdm1kYnVzZC5zZXJ2aWNlIG5hbWUuCisgIEltcHJvdmUgc3VwcG9ydCBmb3IgZW52IExWTV9WR19OQU1FIGZvciByZWZlcmVuY2UgVkcgbmFtZSBpbiBsdmNvbnZlcnQuCisgIEZpeCByZWdyZXNzaW9uIHdoZW4gbHZyZXNpemUgYWNjZXB0ZWQgemVybyBzaXplcy4gKDIuMDIuMTQxKQorICBBbHdheXMgd2FybiB1c2VyIGFib3V0IFBWIGluIHVzZSBldmVuIHdoZW4gcHZyZW1vdmUgdXNlcyAtLWZvcmNlIC0tZm9yY2UuCisgIFVzZSB1bmluaXRpYWxpemVkIHBvb2wgaGVhZGVyIGRldGVjdGlvbiBpbiBhbGwgY2FzZXMuCisgIEZpeCByZWFkIGVycm9yIGRldGVjdGlvbiB3aGVuIGNoZWNraW5nIGZvciB1bmluaXRpYWxpemVkIHRoaW4tcG9vbCBoZWFkZXIuCisgIEZpeCBlcnJvciBwYXRoIGZvciBpbnRlcm5hbCBlcnJvciBpbiBsdm1ldGFkIFZHIGxvb2t1cCBjb2RlLgorCitWZXJzaW9uIDIuMDIuMTQzIC0gMjFzdCBGZWJydWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBlcnJvciBwYXRoIHdoZW4gc2VuZGluZyB0aGluLXBvb2wgbWVzc2FnZSBmYWlscyBpbiB1cGRhdGVfcG9vbF9sdigpLgorICBTdXBwb3J0IHJlcG9ydGluZyBDaGVja05lZWRlZCBhbmQgRmFpbCBzdGF0ZSBmb3IgdGhpbi1wb29sIGFuZCB0aGluIExWLgorICBGb3IgZmFpbGluZyB0aGluLXBvb2wgYW5kIHRoaW4gdm9sdW1lIGNvcnJlY3RseSByZXBvcnQgcGVyY2VudGFnZSBhcyBJTlZBTElELgorICBSZXBvcnQgLTEsIG5vdCAndW5rb3duJyBmb3IgbHZfe3NuYXBzaG90X2ludmFsaWQsbWVyZ2VfZmFpbGVkfSB3aXRoIC0tYmluYXJ5LgorICBBZGQgY29uZmlndXJlIC0tZW5hYmxlLWRidXMtc2VydmljZSBmb3IgYW4gTFZNIEQtQnVzIHNlcnZpY2UuCisgIFJlcGxhY2UgY29uZmlndXJlIC0tZW5hYmxlLXB5dGhvbl9iaW5kaW5ncyB3aXRoIHB5dGhvbjIgYW5kIHB5dGhvbjMgdmVyc2lvbnMuCisgIElmIFBWIGJlbG9uZ3MgdG8gc29tZSBWRyBhbmQgbWV0YWRhdGEgbWlzc2luZywgc2tpcCBpdCBpZiBzeXN0ZW0gSUQgaXMgdXNlZC4KKyAgQXV0b21hdGljYWxseSBjaGFuZ2UgUFYgaGVhZGVyIGV4dGVuc2lvbiB0byBsYXRlc3QgdmVyc2lvbiBpZiB3cml0aW5nIFBWL1ZHLgorICBJZGVudGlmeSB1c2VkIFBWcyBpbiBwdl9hdHRyIGZpZWxkIGJ5IG5ldyAndScgY2hhcmFjdGVyLgorICBBZGQgcHZfaW5fdXNlIHJlcG9ydGluZyBmaWVsZCB0byByZXBvcnQgaWYgUFYgaXMgdXNlZCBvciBub3QuCisgIEFkZCBwdl9leHRfdnNuIHJlcG9ydGluZyBmaWVsZCB0byByZXBvcnQgUFYgaGVhZGVyIGV4dGVuc2lvbiB2ZXJzaW9uLgorICBBZGQgcHJvdGVjdGl2ZSBmbGFnIG1hcmtpbmcgUFZzIGFzIHVzZWQgZXZlbiBpZiBubyBtZXRhZGF0YSBhdmFpbGFibGUuCisKK1ZlcnNpb24gMi4wMi4xNDIgLSAxNXRoIEZlYnJ1YXJ5IDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IG1lbW9yeSBwb29sIGNvcnJ1cHRpb24gaW4gcHZtb3ZlICgyLjAyLjE0MSkuCisgIFN1cHBvcnQgY29udHJvbCBvZiBzcGFyZSBtZXRhZGF0YSBjcmVhdGlvbiB3aGVuIHJlcGFpcmluZyB0aGluLXBvb2wuCisgIEZpeCBjb25maWcgdHlwZSBvZiAnbG9nL3ZlcmJvc2UnIGZyb20gYm9vbCB0byBpbnQgKDIuMDIuOTkpLgorICBGaXggaW52ZXJ0ZWQgZGF0YSBMViB0aGlucCB3YXRlcm1hcmsgY2FsYyBmb3IgZG1ldmVudGQgcmVzcG9uc2UgKDIuMDIuMTMzKS4KKyAgVXNlIHVzZV9ibGtpZF93aXBpbmc9MCBpZiBub3QgZGVmaW5lZCBpbiBsdm0uY29uZiBhbmQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4uCisgIERvIG5vdCBjaGVjayBmb3Igc3VzcGVuZGVkIGRldmljZXMgaWYgc2Nhbm5pbmcgZm9yIGx2bWV0YWQgdXBkYXRlLgorICBDbGVhciBjYWNoZWQgYm9vdGxvYWRlciBhcmVhcyB3aGVuIFBWIGZvcm1hdCBjaGFuZ2VkLgorICBGaXggcGFydG4gdGFibGUgZmlsdGVyIHdpdGggZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlPSJ1ZGV2IiBhbmQgYmxraWQ8Mi4yMC4KKworVmVyc2lvbiAyLjAyLjE0MSAtIDI1dGggSmFudWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIG1ldGFkYXRhL2NoZWNrX3B2X2RldmljZV9zaXplcyBzd2l0Y2ggdG8gbHZtLmNvbmYgZm9yIGRldmljZSBzaXplIGNoZWNrcy4KKyAgV2FybiBpZiBkZXZpY2Ugc2l6ZSBpcyBsZXNzIHRoYW4gY29ycmVzcG9uZGluZyBQViBzaXplIGluIG1ldGFkYXRhLgorICBDYWNoZSBkZXZpY2Ugc2l6ZXMgaW50ZXJuYWxseS4KKyAgUmVzdG9yZSBzdXBwb3J0IGZvciBjb21tYW5kIGJyZWFraW5nIGluIHByb2Nlc3NfZWFjaF9sdl9pbl92ZygpICgyLjAyLjExOCkuCisgIFVzZSBjb3JyZWN0IG1lbXBvb2wgd2hlbiBwcm9jZXNzX2VhY2hfbHZfaW5fdmcoKSAoMi4wMi4xMTgpLgorICBGaXggbHZtLjggbWFuIHRvIHNob3cgYWdhaW4gcHJvaGliaXRlZCBzdWZmaXhlcy4KKyAgRml4IGNvbmZpZ3VyZSB0byBzZXQgcHJvcGVyIHVzZV9ibGtpZF93aXBpbmcgaWYgYXV0b2RldGVjdGVkIGFzIGRpc2FibGVkLgorICBJbml0aWFsaXNlIHVkZXYgaW4gY2x2bWQgZm9yIHVzZSBpbiBkZXZpY2Ugc2Nhbm5pbmcuICgyLjAyLjExNikKKyAgQWRkIHNlZ19sZV9yYW5nZXMgcmVwb3J0IGZpZWxkIGZvciBjb21tb24gZm9ybWF0IHdoZW4gZGlzcGxheWluZyBzZWcgZGV2aWNlcy4KKyAgSG9ub3VyIHJlcG9ydC9saXN0X2l0ZW1fc2VwYXJhdG9yIGZvciBzZWdfbWV0YWRhdGFfbGVfcmFuZ2VzIHJlcG9ydCBmaWVsZC4KKyAgRG9uJ3QgbWFyayBoaWRkZW4gZGV2cyBpbiAtbyBkZXZpY2VzLG1ldGFkYXRhX2RldmljZXMsc2VnX3BlX3Jhbmdlcy4oMi4wMi4xNDApCisgIENoYW5nZSBMViBzaXplcyBpbiBzZWdfcGVfcmFuZ2VzIHJlcG9ydCBmaWVsZCB0byBtYXRjaCB1bmRlcmx5aW5nIGRldmljZXMuCisgIEFkZCBrZXJuZWxfY2FjaGVfc2V0dGluZ3MgcmVwb3J0IGZpZWxkIGZvciBjYWNoZSBMViBzZXR0aW5ncyB1c2VkIGluIGtlcm5lbC4KKworVmVyc2lvbiAyLjAyLjE0MCAtIDE2dGggSmFudWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGx2bTJhcHAgdG8gcmV0dXJuIGVpdGhlciAwIG9yIDEgZm9yIGx2bV92Z19pc197Y2x1c3RlcmVkLGV4cG9ydGVkfS4KKyAgQWRkIGtlcm5lbF9kaXNjYXJkcyByZXBvcnQgZmllbGQgdG8gZGlzcGxheSB0aGluIHBvb2wgZGlzY2FyZCB1c2VkIGluIGtlcm5lbC4KKyAgQ29ycmVjdCBjaGVja2luZyBvZiB0YXJnZXQgcHJlc2VuY2Ugd2hlbiBkcml2ZXIgYWNjZXNzIGlzIGRpc2FibGVkLgorICBFdmFsIHBvb2xtZXRhZGF0YXNpemUgYXJnIGVhcmxpZXIgaW4gbHZyZXNpemUuCisgIEZpeCB2Z2NmZ3Jlc3RvcmUgdG8gcmVzcGVjdCBhbGxvY2F0YWJsZSBhdHRyaWJ1dGUgb2YgUFZzLgorICBBZGQgcmVwb3J0L21hcmtfaGlkZGVuX2RldmljZXMgdG8gbHZtLmNvbmYuCisgIFVzZSBicmFja2V0cyBjb25zaXN0ZW50bHkgaW4gcmVwb3J0IGZpZWxkcyB0byBtYXJrIGhpZGRlbiBkZXZpY2VzLgorICBSZXN0b3JlIGJhY2tncm91bmQgcG9sbGluZyBwcm9jZXNzaW5nIGR1cmluZyBhdXRvLWFjdGl2YXRpb24gKDIuMDIuMTE5KS4KKyAgRml4IGludmFsaWQgbWVtb3J5IHJlYWQgd2hlbiByZXBvcnRpbmcgY2FjaGUgTFYgcG9saWN5X25hbWUgKDIuMDIuMTI2KS4KKworVmVyc2lvbiAyLjAyLjEzOSAtIDh0aCBKYW51YXJ5IDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBsdm1sb2NrZCB3aXRoIHRoZSBuZXcgVkcgc2Vxbm8gYmVmb3JlIGRldmljZXMgYXJlIHN1c3BlbmRlZC4KKyAgUmV3b3JrIHZncmVuYW1lIHRvIHVzZSB0aGUgY29tbW9uIHByb2Nlc3NpbmcgY29kZSBpbiB0b29sbGliLgorICBNYWtlIHB2cyBzaG93IG5ldyBkZXZpY2VzIG9uIHRoZSBzeXN0ZW0gc2luY2UgdGhlIGxhc3QgLmNhY2hlIHVwZGF0ZS4KKyAgRG9jdW1lbnQgRixEIGFuZCBNIHRoaW4gcG9vbCBoZWFsdGggc3RhdHVzIGNoYXJzIGZvciBsdl9hdHRyIGluIGx2cyBtYW4gcGFnZS4KKyAgQWxzbyBhZGQgbHZtMi1hY3RpdmF0aW9uey1lYXJseSwtbmV0fS5zZXJ2aWNlIHN5c3RlbWQgc3RhdHVzIGZvciBsdm1kdW1wIC1zLgorCitWZXJzaW9uIDIuMDIuMTM4IC0gMTR0aCBEZWNlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN1cHBvcnQgbHZyZW5hbWUgZm9yIGhpZGRlbiAodXNlZCkgY2FjaGUgcG9vbHMuCisgIEZpeCBsdnJlbmFtZSBmb3Igc3RhY2tlZCBjYWNoZSBwb29scy4KKworVmVyc2lvbiAyLjAyLjEzNyAtIDV0aCBEZWNlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVzdG9yZSBhcmNoaXZpbmcgYmVmb3JlIGNoYW5naW5nIG1ldGFkYXRhIGluIHZnZXh0ZW5kICgyLjAyLjExNykuCisgIERyb3BwZWQgaW50ZXJuYWwgdXNhZ2Ugb2YgbG9nX3N1cHByZXNzKDIpLgorICBDbGVhbmVkIGxvZ2dpbmcgY29kZSBmb3IgYnVmZmVyIHNpemUgdXNhZ2UuCisgIEFkZGVkIGludGVybmFsIGlkX3JlYWRfZm9ybWF0X3RyeSgpIGZ1bmN0aW9uIHRvIGNoZWNrIGFuZCByZWFkIHZhbGlkIFVVSUQuCisgIENoYW5nZSBsdmNyZWF0ZSwgbHZyZW5hbWUsIGx2cmVzaXplIHRvIHVzZSBwcm9jZXNzX2VhY2hfdmcuCisgIENoYW5nZSBwcm9jZXNzX2VhY2hfdmcgdG8gaGFuZGxlIHNpbmdsZSBWRyBhcyBzZXBhcmF0ZSBhcmcuCisgIElzc3VlIGVycm9yIGlmIGFtYmlndW91cyBWRyBuYW1lIGlzIHN1cHBsaWVkIGluIG1vc3QgY29tbWFuZHMuCisgIE1ha2UgcHJvY2Vzc19lYWNoIGZucyBhbHdheXMgd29yayB0aHJvdWdoIGZ1bGwgbGlzdCBvZiBrbm93biBWRyBuYW1lcy4KKyAgVXNlIGRtX2dldF9zdGF0dXNfbWlycm9yKCkgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIHBhcnNlcnMuCisgIEFkZCBtZW0gcG9vbCBhcmcgZm9yIGNoZWNrX3RyYW5zaWVudF9zdGF0dXMoKSB0YXJnZXQgZnVuY3Rpb24uCisgIEF2b2lkIG1pc2xlYWRpbmcgZXJyb3Igd2l0aCAtbSBpcyBvbWl0dGVkIHdpdGggbHZjb252ZXJ0IHRvIHJhaWQgdHlwZXMuCisgIEFkZCBzeXN0ZW1faWQgdG8gdmdpbmZvIGNhY2hlLgorCitWZXJzaW9uIDIuMDIuMTM2IC0gMjh0aCBOb3ZlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBuZXcgLS1zaW5jZXZlcnNpb24gb3B0aW9uIGZvciBsdm1jb25maWcgLS10eXBlIG5ldy4KKyAgRml4IGluYWN0aXZlIHRhYmxlIGxvYWRlZCBmb3Igd3JhcHBpbmcgdGhpbi1wb29sIHdoZW4gcmVzaXppbmcgaXQuCisgIEV4dGVuZCB0aGUgbGlzdCBvZiBpZ25vcmVkIGxpYnJhcmllcyB3aGVuIGxvY2tpbmcgbWVtb3J5LgorCitWZXJzaW9uIDIuMDIuMTM1IC0gMjNyZCBOb3ZlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBhIG1vZGVsIGZpbGUgZm9yIENvdmVyaXR5LgorICBTaG93IGNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgdW5zdXBwb3J0ZWQgeWV0IGNhY2hlIHBvb2wgcmVwYWlyLgorICBBbGxvdyBsdmNvbnZlcnQgY2FjaGUgcG9vbHMnIGRhdGEgYW5kIG1ldGFkYXRhIExWIHRvIHJhaWQuCisgIEZpeCByZWFkaW5nIG9mIG9sZCBtZXRhZGF0YSB3aXRoIG1pc3NpbmcgY2FjaGUgcG9saWN5IG9yIG1vZGUgc2V0dGluZ3MuCisgIElzc3VlIGVycm9yIGlmIGV4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZT11ZGV2IGFuZCB1ZGV2IGRiIHJlY29yZCBpbmNvbXBsZXRlLgorICBVcGRhdGUgbHZtZXRhZCBkdXBsaWNhdGUgVkcgbmFtZSBoYW5kbGluZyB0byB1c2UgaGFzaCBmdW5jdGlvbiBleHRlbnNpb25zLgorICBEZXRlY3QgaW52YWxpZCB2Z3JlbmFtZXMgYnkgdmdpZCB3aGVyZSB0aGUgbmFtZSBpcyB1bmNoYW5nZWQuCisgIEZpeCBwYXNzaW5nIG9mIDMyYml0IHZhbHVlcyB0aHJvdWdoIGRhZW1vbnMgKG1vc3RseSBsdm1sb2NrZCkuCisgIFVzZSBsb2NhbCBtZW1vcnkgcG9vbCBmb3Igd2hvbGUgYWxsb2NfaGFuZGxlIG1hbmlwdWxhdGlvbi4KKyAgQWRkIG1pc3NpbmcgcG9pbnRlciB2YWxpZGF0aW9uIGFmdGVyIGRtX2dldF9uZXh0X3RhcmdldCgpLgorICBEbyBub3QgZGVyZWYgTlVMTCBwb2ludGVyIGluIGRlYnVnIG1lc3NhZ2UgZm9yIF9tYXRjaF9wdl90YWdzKCkuCisgIERyb3AgdW5uZWVkZWQgc3RhdCgpIGNhbGwgd2hlbiBjaGVja2luZyBmb3Igc3lzZnMgZmlsZS4KKyAgRml4IG1lbW9yeSBsZWFrIG9uIGVycm9yIHBhdGggb2YgZmFpbGluZyB0aGluLXBvb2wgcGVyY2VudGFnZSBjaGVjay4KKyAgQWRkIG1pc3NpbmcgdGVzdCBmb3IgZmFpbGluZyBub2RlIGFsbG9jYXRpb24gaW4gbHZtZXRhZC4KKyAgQ29ycmVjdCBjb25maWd1cmUgbWVzc2FnZXMgd2hlbiBlbmFibGluZy9kaXNhYmxpbmcgbHZtbG9ja2QuCisKK1ZlcnNpb24gMi4wMi4xMzQgLSA5dGggTm92ZW1iZXIgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlZmFjdG9yIHNvbWUgbHZtZXRhZCBjb2RlIGFuZCBhZGp1c3Qgc29tZSBkdXBsaWNhdGUgUFYgbWVzc2FnZXMuCisgIE5vIGxvbmdlciByZXBhaXIvd2lwZSBWRy9QVnMgaWYgaW5hY2Nlc3NpYmxlIGJlY2F1c2UgZm9yZWlnbiBvciBzaGFyZWQuCisgIFBhc3MgY29ycmVjdCBkYXRhIHNpemUgdG8gbWlycm9yIGxvZyBjYWxjIHNvIGxvZyBjYW4gYmUgYmlnZ2VyIHRoYW4gMSBleHRlbnQuCisKK1ZlcnNpb24gMi4wMi4xMzMgLSAzMHRoIE9jdG9iZXIgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN1cHBvcnQgcmVwZWF0ZWQgLW98LS1vcHRpb25zIGZvciByZXBvcnRpbmcgY29tbWFuZHMuCisgIFN1cHBvcnQgLW8tIGFuZCAtbyMgZm9yIHJlcG9ydGluZyBjb21tYW5kcyB0byByZW1vdmUgYW5kIGNvbXBhY3QgZmllbGRzLgorICBGaXggbWlzc2luZyBQVnMgZnJvbSBwdnMgb3V0cHV0IGlmIHZncmVtb3ZlIGlzIHJ1biBjb25jdXJyZW50bHkuCisgIFJlbW92ZSB1bndhbnRlZCBlcnJvciBtZXNzYWdlIHdoZW4gcnVubmluZyBwdnMvdmdzL2x2cyBhbmQgdmdyZW1vdmUgYXQgb25jZS4KKyAgQ2hlY2sgbmV3bHkgY3JlYXRlZCBWRydzIG1ldGFkYXRhIGRvIG5vdCBvdmVybGFwIGluIG1ldGFkYXRhIHJpbmcgYnVmZmVyLgorICBDaGVjayBtZXRhZGF0YSBhcmVhIHNpemUgaXMgYXQgbGVhc3QgdGhlIG1pbmltdW0gc2l6ZSBkZWZpbmVkIGZvciB0aGUgZm9ybWF0LgorICBUaGluIHBvb2wgdGFyZ2V0cyB1c2VzIGxvd193YXRlcl9tYXJrIGZyb20gcHJvZmlsZS4KKyAgRHJvcHBpbmcgJ3lldCcgZnJvbSBlcnJvciBvZiB1bnN1cHBvcnRlZCB0aGljayBzbmFwc2hvdCBvZiBzbmFwc2hvdHMuCisgIERvIG5vdCBzdXBwb3J0IHVucGFydGl0aW9uZWQgREFTRCBkZXZpY2VzIHdpdGggQ0RMIGZvcm1hdHRlZCB3aXRoIHB2Y3JlYXRlLgorICBGb3IgdGhpbnMgdXNlIGZsdXNoIGZvciBzdXNwZW5kIG9ubHkgd2hlbiB2b2x1bWUgc2l6ZSBpcyByZWR1Y2VkLgorICBFbmFibGUgY29kZSB3aGljaCBkZXRlY3RzIHRoZSBuZWVkIG9mIGZsdXNoIGR1cmluZyBzdXNwZW5kLgorICBFbnN1cmUgLS11c2UtcG9saWN5IHdpbGwgcmVzaXplIHZvbHVtZSB0byBmaXQgYmVsb3cgdGhyZXNob2xkLgorICBDb3JyZWN0IHBlcmNlbnRhZ2UgZXZhbHVhdGlvbiB3aGVuIGNoZWNraW5nIHRoaW4tcG9vbCBvdmVyIHRocmVzaG9sZC4KKyAgRml4IGx2bWNhY2hlIHRvIG1vdmUgUFYgZnJvbSBWRyB0byBvcnBoYW5zIGlmIFZHIGlzIHJlbW92ZWQgYW5kIGx2bWV0YWQgdXNlZC4KKyAgRml4IGx2bWNhY2hlIHRvIG5vdCBjYWNoZSBldmVuIGludmFsaWQgaW5mbyBhYm91dCBQViB3aGljaCBnb3QgcmVtb3ZlZC4KKyAgU3VwcG9ydCBjaGVja2luZyBvZiBtZW1sb2NrIGRhZW1vbiBjb3VudGVyLgorICBBbGxvdyBhbGwgbG9nIGxldmVscyB0byBiZSB1c2VkIHdpdGggdGhlIGx2bWV0YWQgLWwgb3B0aW9uLgorICBBZGQgb3B0aW9uYWwgc2h1dGRvd24gd2hlbiBpZGxlIHN1cHBvcnQgZm9yIGx2bWV0YWQuCisgIEZpeCBtaXNzaW5nIGluLXN5bmMgcHJvZ3Jlc3MgaW5mbyB3aGlsZSBsdmNvbnZlcnQgdXNlZCB3aXRoIGx2bXBvbGxkLgorICBBZGQgcmVwb3J0L2NvbXBhY3Rfb3V0cHV0X2NvbHMgdG8gbHZtLmNvbmYgdG8gZGVmaW5lIHJlcG9ydCBjb2xzIHRvIGNvbXBhY3QuCisgIERvIG5vdCBjaGFuZ2UgbG9nZ2luZyBpbiBsdm0yIGxpYnJhcnkgd2hlbiBpdCdzIGFscmVhZHkgc2V0LgorICBDaGVjayBmb3IgZW5vdWdoIHNwYWNlIGluIHRoaW4tcG9vbCBpbiBjb21tYW5kIGJlZm9yZSBjcmVhdGluZyBuZXcgdGhpbi4KKyAgTWFrZSBsaWJibGtpZCBkZXRlY3QgYWxsIGNvcGllcyBvZiB0aGUgc2FtZSBzaWduYXR1cmUgaWYgdXNlX2Jsa2lkX3dpcGluZz0xLgorICBGaXggdmdpbXBvcnRjbG9uZSB3aXRoIC1uIHRvIG5vdCBhZGQgbnVtYmVyIHVubmVjZXNzYXJpbHkgdG8gYmFzZSBWRyBuYW1lLgorICBDbGVhbnVwIHZnaW1wb3J0Y2xvbmUgc2NyaXB0IGFuZCByZW1vdmUgZGVwZW5kZW5jeSBvbiBhd2ssIGdyZXAsIGN1dCBhbmQgdHIuCisgIEFkZCB2Z19taXNzaW5nX3B2X2NvdW50IHJlcG9ydCBmaWVsZCB0byByZXBvcnQgbnVtYmVyIG9mIG1pc3NpbmcgUFZzIGluIGEgVkcuCisgIFByb3Blcmx5IGlkZW50aWZ5IGludGVybmFsIExWIGhvbGRpbmcgc2FubG9jayBsb2NrcyB3aXRoaW4gbHZfcm9sZSBmaWVsZC4KKyAgQWRkIG1ldGFkYXRhX2RldmljZXMgYW5kIHNlZ19tZXRhZGF0YV9sZV9yYW5nZXMgcmVwb3J0IGZpZWxkcyBmb3IgcmFpZCB2b2xzLgorICBGaXggbHZtMi17YWN0aXZhdGlvbixjbHZtZCxjbWlycm9yZCxtb25pdG9yfSBzZXJ2aWNlIHRvIGV4ZWMgYmVmb3JlIG1vdW50aW5nLgorCitWZXJzaW9uIDIuMDIuMTMyIC0gMjJuZCBTZXB0ZW1iZXIgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGx2bWNvbmYgdG8gc2V0IGxvY2tpbmdfdHlwZT0yIGlmIGV4dGVybmFsIGxvY2tpbmcgbGlicmFyeSBpcyByZXF1ZXN0ZWQuCisgIFJlbW92ZSB2ZXJib3NlIG1lc3NhZ2Ugd2hlbiByZXNjYW5uaW5nIGFuIHVuY2hhbmdlZCBkZXZpY2UuICgyLjAyLjExOSkKKyAgQWRkIG9yaWdpbl91dWlkLCBtaXJyb3JfbG9nX3V1aWQsIG1vdmVfcHZfdXVpZCwgY29udmVydF9sdl91dWlkIHJlcG9ydCBmaWVsZHMuCisgIEFkZCBwb29sX2x2X3V1aWQsIG1ldGFkYXRhX2x2X3V1aWQsIGRhdGFfbHZfdXVpZCByZXBvcnRpbmcgZmllbGRzLgorICBGaXggUFYgbGFiZWwgcHJvY2Vzc2luZyBmYWlsdXJlIGFmdGVyIHB2Y3JlYXRlIGluIGx2bSBzaGVsbCB3aXRoIGx2bWV0YWQuCisKK1ZlcnNpb24gMi4wMi4xMzEgLSAxNXRoIFNlcHRlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZW5hbWUgJ21ha2UgaW5zdGFsbF9mdWxsX21hbicgdG8gaW5zdGFsbF9hbGxfbWFuIGFuZCBhZGQgYWxsX21hbiB0YXJnZXQuCisgIEZpeCB2Z2ltcG9ydGNsb25lIGNhY2hlX2RpciBwYXRoIG5hbWUgKDIuMDIuMTE1KS4KKyAgU3dhcHBpbmcgb2YgTFYgaWRlbnRpZmllcnMgaGFuZGxlcyBtb3JlIGNvbXBsZXggTFZzLgorICBVc2UgcGFzc2VkIGxpc3Qgb2YgUFZTIHdoZW4gYWxsb2NhdGluZyBzcGFjZSBpbiBsdmNvbnZlcnQgLS10aGlucG9vbC4KKyAgRGlzYWxsb3cgdXNhZ2Ugb2YgLS1zdHJpcGUgYW5kIC0tc3RyaXBlc2l6ZSB3aGVuIGNyZWF0aW5nIGNhY2hlIHBvb2wuCisgIFdhcm4gdXNlciB3aGVuIGNhY2hpbmcgcmFpZCBvciB0aGluIHBvb2wgZGF0YSBMVi4KKyAgV2hlbiBsYXllcmluZyBMViwgbW92ZSBMViBmbGFncyB3aXRoIHNlZ21lbnRzLgorICBJZ25vcmUgcGVyc2lzdGVudCBjYWNoZSBpZiBjb25maWd1cmF0aW9uIGNoYW5nZWQuICgyLjAyLjEyNykKKyAgRml4IGRldmljZXMvZmlsdGVyIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGRpc2stYWNjZXNzaW5nIGZpbHRlcnMuICgyLjAyLjExMikKKyAgTWFrZSB0YWdzIG9ubHkgd2hlbiByZXF1ZXN0ZWQgdmlhICdtYWtlIHRhZ3MnLgorICBDb25maWd1cmUgc3VwcG9ydHMgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgZm9yIG9uZS10aW1lIGJ1aWxkcy4KKyAgRml4IHVzYWdlIG9mIGNvbmZpZ3VyZS5oIHdoZW4gYnVpbGRpbmcgaW4gc3JjZGlyICE9IGJ1aWxkZGlyLgorCitWZXJzaW9uIDIuMDIuMTMwIC0gNXRoIFNlcHRlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZCBkZXZpY2Ugc3RhdHVzIGlmIHJlYWRpbmcgb3V0ZGF0ZWQgLmNhY2hlIHJlY29yZC4KKyAgUmVzdG9yZSBzdXBwb3J0IGZvciAtLW1vbml0b3Igb3B0aW9uIGluIGx2Y3JlYXRlICgyLjAyLjExMikuCisgIFJlYWQgdGhpbi1wb29sIGRhdGEgYW5kIG1ldGFkYXRhIHBlcmNlbnQgd2l0aG91dCBmbHVzaC4KKyAgRGV0ZWN0IGJsb2NrZWQgdGhpbi1wb29sIGFuZCBhdm9pZCBzY2FubmluZyB0aGVpciB0aGluIHZvbHVtZXMuCisgIENoZWNrIGlmIGRtIGRldmljZSBpcyB1c2FibGUgYmVmb3JlIGNoZWNraW5nIGl0cyBzaXplICgyLjAyLjExNikuCisgIEV4dGVuZCBwYXJzaW5nIG9mIGNhY2hlX2NoZWNrIHZlcnNpb24gaW4gY29uZmlndXJlLgorICBNYWtlIGx2cG9sbCBlcnJvciBtZXNzYWdlcyB2aXNpYmxlIGluIGx2bXBvbGxkJ3Mgc3RkZXJyIGFuZCBpbiBzeXNsb2cuCisgIEFkZCAnbWFrZSBpbnN0YWxsX2Z1bGxfbWFuJyB0byBpbnN0YWxsIGFsbCBtYW4gcGFnZXMgcmVnYXJkbGVzcyBvZiBjb25maWcuCisKK1ZlcnNpb24gMi4wMi4xMjkgLSAyNnRoIEF1Z3VzdCAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEcm9wIGVycm9yIG1lc3NhZ2Ugd2hlbiB2Z2Rpc3BsYXkgZW5jb3VudGVycyBhbiBleHBvcnRlZCBWRy4gKDIuMDIuMjcpCisgIEZpeCBzaGFyZWQgbGlicmFyeSBnZW5lcmF0aW9uIHRvIHN0b3AgZXhwb3J0aW5nIGludGVybmFsIGZ1bmN0aW9ucy4oMi4wMi4xMjApCisgIEFjY2VwdCAtLWNhY2hlbW9kZSB3aXRoIGx2Y29udmVydC4KKyAgRml4IGFuZCBpbXByb3ZlIHJlcG9ydGluZyBwcm9wZXJ0aWVzIG9mIGNhY2hlLXBvb2wuCisgIEVuYWJsZSB1c2FnZSBvZiAtLWNhY2hlcG9saWN5IGFuZCAtLWNhY2hlc2V0dGluZyB3aXRoIGx2Y29udmVydC4KKyAgRG9uJ3QgYWxsb3cgdG8gcmVkdWNlIHNpemUgb2YgdGhpbi1wb29sIG1ldGFkYXRhLgorICBGaXggZGVidWcgYnVmZmVyIG92ZXJmbG93cyBpbiBjbWlycm9yZCBsb2dnaW5nLgorICBBZGQgLS1mb3JlZ3JvdW5kIGFuZCAtLWhlbHAgdG8gY21pcnJvcmQuCisKK1ZlcnNpb24gMi4wMi4xMjggLSAxN3RoIEF1Z3VzdCAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBbGxvY2F0aW9uIHNldHRpbmcgY2FjaGVfcG9vbF9jYWNoZW1vZGUgaXMgcmVwbGFjZWQgYnkgY2FjaGVfbW9kZS4KKyAgRG9uJ3QgYXR0ZW1wdCB0byBjbG9zZSBjb25maWcgZmlsZSB0aGF0IGNvdWxkbid0IGJlIG9wZW5lZC4KKyAgQ2hlY2sgZm9yIHZhbGlkIGNhY2hlIG1vZGUgaW4gdmFsaWRhdGlvbiBvZiBjYWNoZSBzZWdtZW50LgorICBDaGFuZ2UgaW50ZXJuYWwgaW50ZXJmYWNlIGhhbmRsaW5nIGNhY2hlIG1vZGUgYW5kIHBvbGljeS4KKyAgV2hlbiBubyBjYWNoZSBwb2xpY3kgc3BlY2lmaWVkLCBwcmVmZXIgc21xIChpZiBhdmFpbGFibGUpIG92ZXIgbXEuCisgIEFkZCBkZW1vIGNhY2hlLW1xIGFuZCBjYWNoZS1zbXEgcHJvZmlsZXMuCisgIEFkZCBjbWQgcHJvZmlsYWJsZSBhbGxvY2F0aW9uL2NhY2hlX3BvbGljeSxjYWNoZV9zZXR0aW5ncyxjYWNoZV9tb2RlLgorICBSZXF1aXJlIGNhY2hlX2NoZWNrIDAuNS40IGZvciB1c2Ugb2YgLS1jbGVhci1uZWVkcy1jaGVjay1mbGFnLgorICBGaXggbHZtZXRhZCB1ZGV2IHJ1bGVzIHRvIG5vdCBvdmVycmlkZSBTWVNURU1EX1dBTlRTLCBhZGQgdGhlIHNlcnZpY2UgaW5zdGVhZC4KKworVmVyc2lvbiAyLjAyLjEyNyAtIDEwdGggQXVndXN0IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERvIG5vdCBpbml0IGZpbHRlcnMsIGxvY2tpbmcsIGx2bWV0YWQsIGx2bXBvbGxkIGlmIGNvbW1hbmQgZG9lc24ndCB1c2UgaXQuCisgIE9yZGVyIGZpZWxkcyBpbiBzdHJ1Y3QgY21kX2NvbnRleHQgbW9yZSBsb2dpY2FsbHkuCisgIEFkZCBsb2NrX3R5cGUgdG8gbHZtY2FjaGUgVkcgc3VtbWFyeSBhbmQgaW5mbyBzdHJ1Y3RzLgorICBGaXggcmVncmVzc2lvbiBpbiBjYWNoZSBjYXVzaW5nIHNvbWUgUFZzIHRvIGJ5cGFzcyBmaWx0ZXJzICgyLjAyLjEwNSkuCisgIE1ha2UgY29uZmlndXJlIC0tZW5hYmxlLXJlYWx0aW1lIHRoZSBkZWZhdWx0IG5vdy4KKyAgVXBkYXRlIC5naXRpZ25vcmUgYW5kIGNvbmZpZ3VyZS5pbiBmaWxlcyB0byByZWZsZWN0IHVzYWdlIG9mIGN1cnJlbnQgdHJlZS4KKworVmVyc2lvbiAyLjAyLjEyNiAtIDI0dGggSnVseSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGxvbmcgb3B0aW9uIGh5cGhlbiByZW1vdmFsLiAoMi4wMi4xMjIpCisgIEZpeCBjbHZtZCBmcmVlemUgaWYgY2xpZW50IGRpc2FwcGVhcnMgd2l0aG91dCBmaXJzdCByZWxlYXNpbmcgaXRzIGxvY2tzLgorICBGaXggbHZjb252ZXJ0IHNlZ2ZhdWx0cyB3aGlsZSBwZXJmb3JtaW5nIHNuYXBzaG90cyBtZXJnZS4KKyAgSWdub3JlIGVycm9ycyBkdXJpbmcgZGV0ZWN0aW9uIGlmIHVzZV9ibGtpZF93aXBpbmc9MSBhbmQgLS1mb3JjZSBpcyB1c2VkLgorICBSZWNvZ25pc2UgRE1fQUJPUlRfT05fSU5URVJOQUxfRVJST1JTIGVudiB2YXIgb3ZlcnJpZGUgaW4gbHZtIGxvZ2dpbmcgZm4uCisgIEZpeCBhbGxvYyBzZWdmYXVsdCB3aGVuIGV4dGVuZGluZyBMViB3aXRoIGZld2VyIHN0cmlwZXMgdGhhbiBpbiBmaXJzdCBzZWcuCisgIEZpeCBoYW5kbGluZyBvZiBjYWNoZSBwb2xpY3kgbmFtZS4KKyAgU2V0IGNhY2hlIHBvbGljeSBiZWZvcmUgd2l0aCB0aGUgZmlyc3QgbHZtMiBjYWNoZSBwb29sIG1ldGFkYXRhIGNvbW1pdC4KKyAgRml4IGRldGVjdGlvbiBvZiB0aGluLXBvb2wgb3ZlcnByb3Zpc2lvbmluZyAoMi4wMi4xMjQpLgorICBGaXggbHZtcG9sbGQgc2VnZmF1bHRzIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLgorICBBZGQgbHZtbG9ja2QgbG9ja19hcmdzIHZhbGlkYXRpb24gdG8gdmdfdmFsaWRhdGUuCisgIEZpeCBpZ25vcmVkIC0tc3RhcnRzdG9wc2VydmljZXMgb3B0aW9uIGlmIHJ1bm5pbmcgbHZtY29uZiB3aXRoIHN5c3RlbWQuCisgIEhpZGUgc2FubG9jayBMVnMgd2hlbiBwcm9jZXNzaW5nIExWcyBpbiBWRyB1bmxlc3MgbmFtZWQgb3IgLS1hbGwgdXNlZC4KKworVmVyc2lvbiAyLjAyLjEyNSAtIDd0aCBKdWx5IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBnZXRsaW5lIG1lbW9yeSB1c2FnZSBpbiBsdm1wb2xsZC4KKyAgQWRkIHN1cHBvcnQgLS1jbGVhci1uZWVkcy1jaGVjay1mbGFnIGZvciBjYWNoZV9jaGVjayBvZiBjYWNoZSBwb29sIG1ldGFkYXRhLgorICBBZGQgbHZtZXRhY3RsIGZvciBkZXZlbG9wZXIgdXNlIG9ubHkuCisgIFJlbmFtZSBnbG9iYWwvbG9ja19yZXRyaWVzIHRvIGx2bWxvY2tkX3JldHJpZXMuCisgIFJlcGxhY2UgLS1lbmFibGUtbHZtbG9ja2QgYnkgLS1lbmFibGUtbG9ja2Qtc2FubG9jayBhbmQgLS1lbmFibGUtbG9ja2QtZGxtLgorCitWZXJzaW9uIDIuMDIuMTI0IC0gM3JkIEp1bHkgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTW92ZSBzZW5kaW5nIHRoaW4gcG9vbCBtZXNzYWdlcyBmcm9tIHJlc3VtZSB0byBzdXNwZW5kIHBoYXNlLgorICBSZXBvcnQgd2FybmluZyB3aGVuIHBvb2wgaXMgb3ZlcnByb3Zpc2lvbmVkIGFuZCBub3QgYXV0byByZXNpemVkLgorICBSZWNvZ25pemUgZnJlZS1mb3JtIGRhdGUvdGltZSB2YWx1ZXMgZm9yIGx2X3RpbWUgZmllbGQgaW4gc2VsZWN0aW9uIGNyaXRlcmlhLgorICBBZGRlZCBleHBlcmltZW50YWwgbHZtbG9ja2Qgd2l0aCBjb25maWd1cmUgLS1lbmFibGUtbHZtbG9ja2QuCisgIEZpeCByZWdyZXNzaW9uIGluIHNlbGVjdCB0byBtYXRjaCBzdHJpbmcgZmllbGRzIGlmIHVzaW5nIHN5bm9ueW1zICgyLjAyLjEyMykuCisgIEZpeCByZWdyZXNzaW9uIHdoZW4gcHJpbnRpbmcgbW9yZSBsdiBuYW1lcyB2aWEgZGlzcGxheV9sdm5hbWUgKDIuMDIuMTIyKS4KKyAgQWRkIG1pc3NpbmcgZXJyb3IgbG9nZ2luZyB0byB1bmxvY2tfdmcgYW5kIHN5bmNfbG9jYWxfZGV2X25hbWVzIGNhbGxlcnMuCisKK1ZlcnNpb24gMi4wMi4xMjMgLSAzMHRoIEp1bmUgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCByZXBvcnQvdGltZV9mb3JtYXQgbHZtLmNvbmYgb3B0aW9uIHRvIGRlZmluZSB0aW1lIGZvcm1hdCBmb3IgcmVwb3J0LgorICBGaXggbWFrZWZpbGUgc2hlbGwgY29tcGFyZSA9PSB3aGVuIGJ1aWxkaW5nIGx2bWV0YWQgbHZtcG9sbGQgKDIuMDIuMTIwKS4KKyAgQWRkIC0tdHlwZSBmdWxsIHRvIGx2bWNvbmZpZyBmb3IgZnVsbCBjb25maWd1cmF0aW9uIHRyZWUgdmlldy4KKyAgQWRkIHVuZG9jdW1lbnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gbHZtIG1hbiBwYWdlLiAoMi4wMi4xMTkpCisgIEFkZCBkZXZpY2Ugc3luY2hyb25pemF0aW9uIHBvaW50IGJlZm9yZSBhY3RpdmF0aW5nIGEgbmV3IHNuYXBzaG90LgorICBBZGQgLS13aXRoc3BhY2VzIHRvIGx2bWNvbmZpZyB0byBhZGQgc3BhY2VzIGluIG91dHB1dCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgorICBBZGQgY3VzdG9tIG1haW4gZnVuY3Rpb24gdG8gbGliZGFlbW9uLgorICBVc2UgbHZtZXRhZCB0byB0cmFjayBvdXQtb2YtZGF0ZSBtZXRhZGF0YSBkaXNjb3ZlcmVkLgorCitWZXJzaW9uIDIuMDIuMTIyIC0gMjB0aCBKdW5lIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGbHVzaCBzdGRvdXQgYmVmb3JlIHByaW50aW5nIHRvIHN0ZGVyci4KKyAgVXNlIHByZS1hbGxvY2F0ZWQgYnVmZmVyIGZvciBwcmludGVkIExWIG5hbWVzIGluIGRpc3BsYXlfbHZuYW1lLgorICBTdXBwb3J0IHRoaW5zIHdpdGggc2l6ZSBvZiBleHRlcm5hbCBvcmlnaW4gdW5hbGlnbmVkIHdpdGggdGhpbiBwb29sIGNodW5rLgorICBBbGxvdyBleHRlbnNpb24gb2YgcmVkdWNlZCB0aGluIHZvbHVtZXMgd2l0aCBleHRlcm5hbCBvcmlnaW5zLgorICBDb25zaWRlciBzbmFwc2hvdCBhbmQgb3JpZ2luIExWIGFzIHVudXNhYmxlIGlmIGNvbXBvbmVudCBkZXZpY2VzIHN1c3BlbmRlZC4KKyAgRml4IGx2bWNvbmZpZyBzZWdmYXVsdCBvbiBzZXR0aW5ncyB3aXRoIHVuZGVmaW5lZCBkZWZhdWx0IHZhbHVlICgyLjAyLjEyMCkuCisgIEFkZCBleHBsaWNpdCAncycgKHNoYXJlZCkgTFYgYWN0aXZhdGlvbiBtb2RlLgorICBJZ25vcmUgaHlwaGVucyBpbiBsb25nIG9wdGlvbnMgbmFtZXMgKGkuZS4gLS1sb25nLW9wdGlvbiA9PSAtLWxvbmdvcHRpb24pLgorCitWZXJzaW9uIDIuMDIuMTIxIC0gMTJ0aCBKdW5lIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9uLWRpc2sgYW5kIGx2bWV0YWQgdmVyc2lvbnMgb2YgdGV4dCBtZXRhZGF0YS4KKyAgUmVtb3ZlIERMX0xJQlMgZnJvbSBNYWtlZmlsZXMgZm9yIGRhZW1vbnMgdGhhdCBkb24ndCBuZWVkIHRoZW0uCisgIFplcm8gZXJybm8gaW4gYmVmb3JlIHN0cnRvdWwgY2FsbCBpbiBkbXNldHVwIGlmIHRlc3RlZCBhZnRlciB0aGUgY2FsbC4KKyAgWmVybyBlcnJubyBpbiBiZWZvcmUgc3RydG91bCBjYWxsIGluIGx2bXBvbGxkLgorICBGaXggYSBzZWdmYXVsdCBpbiBwdnNjYW4gLS1jYWNoZSAtLWJhY2tncm91bmQgY29tbWFuZC4KKyAgRml4IHRlc3QgZm9yIEFSRUFfUFYgd2hlbiBjaGVja2luZyBmb3IgZmFpbGVkIG1pcnJvcnMuCisgIERvIG5vdCB1c2UgLS1zeXNpbml0IGluIGx2bTItYWN0aXZhdGlvbnstZWFybHksLW5ldH0uc2VydmljZSBpZiBsdm1wb2xsZCB1c2VkLgorICBNYWludGFpbiBvdXRkYXRlZCBQViBpbmZvIGluIGx2bWV0YWQgdGlsbCBhbGwgb2xkIG1ldGFkYXRhIGlzIGdvbmUgZnJvbSBkaXNrLgorICBEbyBub3QgZmFpbCBwb2xsaW5nIHdoZW4gcG9sbCBMViBub3QgZm91bmQgKGFscmVhZHkgZmluaXNoZWQgb3IgcmVtb3ZlZCkuCisgIFJlcGxhY2UgcG9sbF9nZXRfY29weV92Zy9sdiBmbnMgd2l0aCB2Z19yZWFkKCkgYW5kIGZpbmRfbHYoKSBpbiBwb2xsZGFlbW9uLgorICBDbG9zZSBhbGwgZGV2aWNlIGZkcyBvbmx5IGluIGJlZm9yZSBzbGVlcCBjYWxsIGluIHBvbGxkYWVtb24uCisgIFNpbXBsaWZ5IE1ha2VmaWxlIHRhcmdldHMgdGhhdCBnZW5lcmF0ZSBleHBvcnRlZCBzeW1ib2xzLgorICBNb3ZlIHZhcmlvdXMgLUQgc2V0dGluZ3MgZnJvbSBNYWtlZmlsZXMgdG8gY29uZmlndXJlLmguCisKK1ZlcnNpb24gMi4wMi4xMjAgLSAxNXRoIE1heSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNYWtlIHZhcmlvdXMgYWRqdXN0bWVudHMgdG8gTWFrZWZpbGUgY29tcGlsYXRpb24gZmxhZ3MuCisgIEFkZCBsdm1wb2xsZCBkZWJ1ZyBtZXNzYWdlIGNsYXNzLgorICBBZGQgbHZtcG9sbGQgY2xpZW50IG1vZGUgZm9yIHF1ZXJ5aW5nIHJ1bm5pbmcgc2VydmVyIGluc3RhbmNlIGZvciBzdGF0dXMgaW5mby4KKyAgRml4IHNvbWUgbGliZGFlbW9uIHNvY2tldCBjcmVhdGlvbiBhbmQgcmV1c2UgZXJyb3IgcGF0aHMuCisgIERhZW1vbnMgKGxpYmRhZW1vbikgc3VwcG9ydCBleGl0IG9uIGlkbGUgYWxzbyBpbiBub24tc3lzdGVtZCBlbnZpcm9ubWVudC4KKyAgUHJvdmlkZSBtYWtlIGRpc3QgYW5kIG1ha2UgcnBtIHRhcmdldHMKKyAgQ29uZmlndXJlIGx2bS5jb25mIGZvciB1c2VfbHZtZXRhZCBhbmQgdXNlX2x2bXBvbGxkLgorICBBZGQgbHZwb2xsIGZvciBjbWRsaW5lIGNvbW11bmljYXRpb24gd2l0aCBsdm1wb2xsZC4KKyAgQWRkIGx2bXBvbGxkIGFjdGluZyBhcyBhIGZyZWUtc3RhbmRpbmcgdmVyc2lvbiBvZiBwb2xsZGFlbW9uLgorICBBdm9pZCByZXBlYXRlZCBpZGVudGljYWwgbHZtZXRhZCBWRyBsb29rdXBzIGluIGNvbW1hbmRzIHByb2Nlc3NpbmcgYWxsIFZHcy4KKyAgSGFuZGxlIHN3aXRjaGVzIHRvIGFsdGVybmF0aXZlIGR1cGxpY2F0ZSBQVnMgZWZmaWNpZW50bHkgd2l0aCBsdm1ldGFkLgorICBQcm9wZXJseSB2YWxpZGF0ZSBQViBzaXplIGZvciBwdmNyZWF0ZSAtLXJlc3RvcmVmaWxlLgorICBGaXggY2hlY2sgaWYgcHZjcmVhdGUgd2lwZWQgZGV2aWNlICgyLjAyLjExNykuCisgIEZpeCBzdG9yaW5nIG9mIHZnaWQgd2hlbiBjYWNoaW5nIG1ldGFkYXRhICgyLjAyLjExOCkuCisgIEZpeCByZWN1cnNpdmUgbHZtLWNvbmZpZyBtYW4gcGFnZS4gKDIuMDIuMTE5KQorICBSZWZhY3RvciBwb2xsZGFlbW9uIGludGVyZmFjZXMgdG8gcG9sbCBldmVyeSBvcGVyYXRpb24gYnkgVkcvTFYgY291cGxlCisgIFNraXAgd2FpdCBhZnRlciB0ZXN0aW5nIGluIF93YWl0X2Zvcl9zaW5nbGVfbHYgd2hlbiBwb2xsaW5nIGZpbmlzaGVkCisgIFJldHVybiAnTm9uZScgaW4gcHl0aG9uIGZvciBlbXB0eSBzdHJpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGNyYXNoaW5nLgorICBEaXN0aW5ndWlzaCBzaWduZWQgbnVtZXJpY2FsIHByb3BlcnR5IHR5cGUgaW4gcmVwb3J0cyBmb3IgbHZtMmFwcCBsaWJyYXJ5LgorICBSZXJlYWQgcmFpZCBjb21wbGV0aW9uIHN0YXR1cyBpbW1lZGlhdGVseSB3aGVuIHByb2dyZXNzIGFwcGVhcnMgdG8gYmUgemVyby4KKyAgbHZtMmFwcCBjbG9zZXMgbG9ja2luZyBvbiBsdm1fcXVpdCgpLgorICBDb25maWd1cmUgZGV0ZWN0cyAvcnVuIG9yIC92YXIvcnVuLgorICBBZGQgbWlzc2luZyBuZXdsaW5lIGluIGNsdm1kIC0taGVscCBvdXRwdXQuCisKK1ZlcnNpb24gMi4wMi4xMTkgLSAybmQgTWF5IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTmV3IExWTV9MT0dfRklMRV9FUE9DSCwgTFZNX0VYUEVDVEVEX0VYSVRfU1RBVFVTIGVudiB2YXJzLiBNYW4gcGFnZSB0byBmb2xsb3cuCisgIFJlbW92ZSBkZXRhaWxlZCBjb250ZW50IGZyb20gbHZtLmNvbmYgbWFuIHBhZ2U6IHVzZSBsdm1jb25maWcgaW5zdGVhZC4KKyAgR2VuZXJhdGUgY29tcGxldGUgY29uZmlnIGZpbGVzIHdpdGggbHZtY29uZmlnIG9yICdtYWtlIGdlbmVyYXRlJy4KKyAgQWxzbyBkaXNwbGF5IGluZm8gb24gZGVwcmVjYXRlZCBjb25maWcgd2l0aCBsdm1jb25maWcgLS13aXRoY29tbWVudHMuCisgIERpc3BsYXkgdmVyc2lvbiBzaW5jZSB3aGljaCBjb25maWcgaXMgZGVwcmVjYXRlZCBpbiBsdm1jb25maWcgLS13aXRodmVyc2lvbnMuCisgIEFkZCAtLXNob3dkZXByZWNhdGVkIHRvIGx2bWNvbmZpZyB0byBhbHNvIGRpc3BsYXkgZGVwcmVjYXRlZCBzZXR0aW5ncy4KKyAgSGlkZSBkZXByZWNhdGVkIHNldHRpbmdzIGluIGx2bWNvbmZpZyBvdXRwdXQgZm9yIGFsbCB0eXBlcyBidXQgY3VycmVudCxkaWZmLgorICBJbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgZXhpdCBvbiBpZGxlIGZlYXR1cmUgaW4gbGliZGFlbW9uCisgIEFkZCAtLXNob3d1bnN1cHBvcnRlZCB0byBsdm1jb25maWcgdG8gYWxzbyBkaXNwbGF5IHVuc3VwcG9ydGVkIHNldHRpbmdzLgorICBEaXNwbGF5IHVuc3VwcG9ydGVkIHNldHRpbmdzIGZvciBsdm1jb25maWcgLS10eXBlIGN1cnJlbnQsZGlmZiBvbmx5IGJ5IGRlZmF1bHQKKyAgSG9ub3VyIGx2bWNvbmZpZyAtLWlnbm9yZXVuc3VwcG9ydGVkIGFuZCAtLWlnbm9yZWFkdmFuY2VkIGZvciBhbGwgLS10eXBlLgorICBNYWtlIHB5dGhvbiBiaW5kaW5ncyB1c2FibGUgd2l0aCBweXRob24zIChhbmQgY29tcGF0aWJsZSB3aXRoIDIuNiAmIDIuNykuCisgIEFkZCBsdm1jb25maWcgLWx8LS1saXN0IGFzIHNob3J0Y3V0IGZvciBsdm1jb25maWcgLS10eXBlIGxpc3QgLS13aXRoc3VtbWFyeS4KKyAgQWRkIGx2bWNvbmZpZyAtLXR5cGUgbGlzdCB0byBkaXNwbGF5IHBsYWluIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAgSW50cm9kdWNlIGx2bWNvbmZpZyBhcyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgJ2x2bSBkdW1wY29uZmlnJy4KKyAgQWRkIGx2X2FuY2VzdG9ycyBhbmQgbHZfZGVzY2VuZGFudHMgcmVwb3J0aW5nIGZpZWxkcy4KKyAgQWRkIC0taWdub3JlbG9jYWwgb3B0aW9uIHRvIGR1bXBjb25maWcgdG8gaWdub3JlIHRoZSBsb2NhbCBzZWN0aW9uLgorICBDbG9zZSBjb25uZWN0aW9uIHRvIGx2bWV0YWQgYWZ0ZXIgZm9yay4KKyAgTWFrZSBsdmNoYW5nZSBhYmxlIHRvIHJlc3VtZSBiYWNrZ3JvdW5kIHB2bW92ZSBwb2xsaW5nIGFnYWluLgorICBTcGxpdCBwdm1vdmUgdXBkYXRlIG1ldGFkYXRhIGZuIGluIGFuIGluaXRpYWwgb25lIGFuZCBhIHN1YnNlcXVlbnQgb25lLgorICBSZWZhY3RvciBzaGFyZWQgcHZtb3ZlIGFuZCBsdmNvbnZlcnQgY29kZSBpbnRvIG5ldyBfcG9sbCBmaWxlcy4KKyAgQWRkIC0tdW5jb25maWd1cmVkIG9wdGlvbiB0byBkdW1wY29uZmlnIHRvIHByaW50IHN0cmluZ3MgdW5jb25maWd1cmVkLgorICBBZGQgLS13aXRoc3VtbWFyeSBvcHRpb24gdG8gZHVtcGNvbmZpZyB0byBwcmludCBmaXJzdCBsaW5lIC0gc3VtbWFyeSBjb21tZW50LgorICBVc2UgbnVtYmVyIG9mIGRldmljZSBob2xkZXJzIHRvIGhlbHAgY2hvb3NlIGJldHdlZW4gZHVwbGljYXRlIFBWcy4KKyAgVHJ5IHRvIG1ha2UgbHZtZXRhZCBhbmQgbm9uLWx2bWV0YWQgZHVwbGljYXRlIFBWIGhhbmRsaW5nIGFzIHNpbWlsYXIgYXMgcG9zcy4KKyAgSXNzdWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIFBWcyBkaXNjb3ZlcmVkIGJ5IGx2bWV0YWQuCisgIFRyYWNrIGFsdGVybmF0aXZlIGRldmljZXMgd2l0aCBtYXRjaGluZyBQVklEcyBpbiBsdm1ldGFkLgorICBDaGVjayBmb3IgbHZtIGJpbmFyeSBpbiBibGtkZWFjdGl2YXRlIGFuZCBza2lwIExWTSBwcm9jZXNzaW5nIGlmIG5vdCBwcmVzZW50LgorICBBZGQgLS1lbmFibGUtaGFsdm0gYW5kIC0tZGlzYWJsZS1oYWx2bSBvcHRpb25zIHRvIGx2bWNvbmYgc2NyaXB0LgorICBBZGQgLS1zZXJ2aWNlcywgLS1taXJyb3JzZXJ2aWNlIGFuZCAtLXN0YXJ0c3RvcHNlcnZpY2VzIG9wdGlvbiB0byBsdm1jb25mLgorICBVc2UgcHJvcGVyIGRlZmF1bHQgdmFsdWUgb2YgZ2xvYmFsL3VzZV9sdm1ldGFkIHdoZW4gcHJvY2Vzc2luZyBsdm1jb25mIHNjcmlwdC4KKyAgUmVzcGVjdCBhbGxvY2F0aW9uL2NsaW5nX3RhZ19saXN0IGR1cmluZyBpbnRpYWwgY29udGlndW91cyBhbGxvY2F0aW9uLgorICBBZGQgQV9QQVJUSVRJT05fQllfVEFHUyBzZXQgd2hlbiBhbGxvY2F0ZWQgYXJlYXMgc2hvdWxkIG5vdCBzaGFyZSB0YWdzLgorICBNYWtlIGNoYW5nZXMgcGVyc2lzdCB3aXRoIHB5dGhvbiBhZGRUYWcvcmVtb3ZlVGFnLgorICBTZXQgY29ycmVjdCB2Z2lkIHdoZW4gdXBkYXRpbmcgY2FjaGUgd2hlbiB3cml0aW5nIFBWIG1ldGFkYXRhLgorICBNb3JlIGVmZmljaWVudCBjbHZtZCBzaW5nbGVub2RlIGxvY2tpbmcgZW11bGF0aW9uLgorICBSZWplY3QgbHZjcmVhdGUgLW0gd2l0aCByYWlkNC81LzYgdG8gYXZvaWQgdW5leHBlY3RlZCBsYXlvdXQuCisgIERvbid0IHNraXAgaW52YWxpZGF0aW9uIG9mIGNhY2hlZCBvcnBoYW5zIGlmIHZnIHdyaXRlIGxjayBpcyBoZWxkICgyLjAyLjExOCkuCisgIExvZyByZWxldmFudCBQViB0YWdzIHdoZW4gdXNpbmcgY2xpbmcgYWxsb2NhdGlvbi4KKyAgQWRkIHN0cl9saXN0X2FkZF9saXN0KCkgdG8gY29tYmluZSB0d28gbGlzdHMuCisgIEZpeCBMViBwcm9jZXNzaW5nIHdpdGggc2VsZWN0aW9uIHRvIGFsd2F5cyBkbyB0aGUgc2VsZWN0aW9uIG9uIGluaXRpYWwgc3RhdGUuCisgIEFkZCBpbnRlcm5hbCBMVl9SRU1PVkVEIExWIHN0YXR1cyBmbGFnLgorCitWZXJzaW9uIDIuMDIuMTE4IC0gMjNyZCBNYXJjaCAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN0b3JlIG1ldGFkYXRhIHNpemUgKyBjaGVja3N1bSBpbiBsdm1jYWNoZSBhbmQgYWRkIHN0cnVjdCBsdm1jYWNoZV92Z3N1bW1hcnkuCisgIFJlbW92ZSBpbmFjY2Vzc2libGUgY2x1c3RlcmVkIFBWcyBmcm9tICdwdnMgLWEnLgorICBEb24ndCBpbnZhbGlkYXRlIGNhY2hlZCBvcnBoYW4gaW5mb3JtYXRpb24gd2hpbGUgZ2xvYmFsIGxvY2sgaXMgaGVsZC4KKyAgQXZvaWQgcmVzY2FuIG9mIGFsbCBkZXZpY2VzIHdoZW4gcmVxdWVzdGVkIHB2c2NhbiBmb3IgcmVtb3ZlZCBkZXZpY2UuCisgIE1lYXN1cmUgY29uZmlndXJhdGlvbiB0aW1lc3RhbXBzIHdpdGggbmFub3NlY29uZHMgd2hlbiBhdmFpbGFibGUuCisgIERpc2FibGUgbHZjaGFuZ2Ugb2YgbWFqb3IgYW5kIG1pbm9yIG9mIHBvb2wgTFZzLgorICBGaXggcHZzY2FuIC0tY2FjaGUgdG8gbm90IHNjYW4gYW5kIHJlYWQgaWdub3JlZCBtZXRhZGF0YSBhcmVhcyBvbiBQVnMuCisgIEFkZCBBZnRlcj1pc2NzaS1zaHV0ZG93bi5zZXJ2aWNlIHRvIGJsay1hdmFpbGFiaWxpdHkuc2VydmljZSBzeXN0ZW1kIHVuaXQuCisgIERpc2FsbG93IHZnY29udmVydCBmcm9tIGNoYW5naW5nIG1ldGFkYXRhIGZvcm1hdCB3aGVuIGx2bWV0YWQgaXMgdXNlZC4KKyAgRG9uJ3QgZG8gYSBmdWxsIHJlYWQgb2YgVkcgd2hlbiBjcmVhdGluZyBhIG5ldyBWRyB3aXRoIGFuIGV4aXN0aW5nIG5hbWUuCisgIFJlZHVjZSBhbW91bnQgb2YgVkcgbWV0YWRhdGEgcGFyc2luZyB3aGVuIGxvb2tpbmcgZm9yIHZnbmFtZSBvbiBhIFBWLgorICBBdm9pZCByZXBhcnNpbmcgc2FtZSBtZXRhZGF0YSB3aGVuIHJlYWRpbmcgc2FtZSBtZXRhZGF0YSBmcm9tIG11bHRpcGxlIFBWcy4KKyAgU2F2ZSBleHRyYSBkZXZpY2Ugb3Blbi9jbG9zZSB3aGVuIHNjYW5uaW5nIGRldmljZSBmb3Igc2l6ZS4KKyAgRml4IHNlZ19tb25pdG9yIGZpZWxkIHRvIHJlcG9ydCBzdGF0dXMgYWxzbyBmb3IgbWlycm9ycyBhbmQgdGhpY2sgc25hcHNob3RzLgorICBSZXBsYWNlIExWTV9XUklURSB3aXRoIExWTV9XUklURV9MT0NLRUQgZmxhZ3MgaW4gbWV0YWRhdGEgaWYgc3lzdGVtIElEIGlzIHNldC4KKyAgUmVtb3ZlIEFDQ0VTU19ORUVEU19TWVNURU1fSUQgVkcgc3RhdHVzIGZsYWcuICgyLjAyLjExNykKKyAgRW5hYmxlIHN5c3RlbSBJRCBmZWF0dXJlcy4KKworVmVyc2lvbiAyLjAyLjExNyAtIDR0aCBNYXJjaCAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIENGR19ESVNBQkxFRCBmb3IgbmV3IHN5c3RlbSBJRCBjb25maWcgc2V0dGluZ3MgdGhhdCBtdXN0IG5vdCB5ZXQgYmUgdXNlZC4KKyAgUHJlc2VydmUgb3JpZ2luYWwgZm9ybWF0IHR5cGUgZmllbGQgd2hlbiBwcm9jZXNzaW5nIGJhY2t1cCBmaWxlcy4KKyAgSW1wbGVtZW50IHN0YXR1cyBhY3Rpb24gZm9yIGx2bTItbW9uaXRvciBpbml0c2NyaXB0IHRvIGRpc3BsYXkgbW9uaXRvcmVkIExWcy4KKyAgQWxsb3cgbHZjaGFuZ2UgLXAgdG8gY2hhbmdlIGtlcm5lbCBzdGF0ZSBvbmx5IGlmIG1ldGFkYXRhIHN0YXRlIGRpZmZlcnMuCisgIEZpeCBpbmNvcnJlY3QgcGVyc2lzdGVudCAuY2FjaGUgYWZ0ZXIgcmVwb3J0IHdpdGggbGFiZWwgZmllbGRzIG9ubHkgKDIuMDIuMTA2KS4KKyAgUmVpbnN0YXRlIFBWIHRhZyByZWNvZ25pdGlvbiBmb3IgcHZzIGlmIHJlcG9ydGluZyBsYWJlbCBmaWVsZHMgb25seSAoMi4wMi4xMDUpLgorICBSZXNjYW4gZGV2aWNlcyBiZWZvcmUgdmdpbXBvcnQgd2l0aCBsdm1ldGFkIHNvIGV4cG9ydGVkIFZHIGlzIHNlZW4uCisgIEZpeCBoYW5nIGJ5IGFkanVzdGluZyBjbHVzdGVyIG1pcnJvciByZWdpb25zaXplLCBhdm9pZGluZyBDUEcgbXNnIGxpbWl0LgorICBEbyBub3QgY3Jhc2ggd2hlbiAtLWNhY2hlcG9saWN5IGlzIGdpdmVuIHdpdGhvdXQgLS1jYWNoZXNldHRpbmdzLgorICBBZGQgTkVFRFNfRk9SRUlHTl9WR1MgZmxhZyB0byB2Z2ltcG9ydCBzbyAtLWZvcmVpZ24gaXMgYWx3YXlzIHN1cHBsaWVkLgorICBBZGQgLS1mb3JlaWduIHRvIHRoZSA2IGRpc3BsYXkgYW5kIHJlcG9ydGluZyB0b29scyBhbmQgdmdjZmdiYWNrdXAuCisgIEluc3RhbGwgL2V0Yy9sdm0vbHZtbG9jYWwuY29uZiB0ZW1wbGF0ZSB3aXRoIGxvY2FsIHNlY3Rpb24gZm9yIHN5c3RlbWlkLgorICBSZWNvcmQgY3JlYXRpb25faG9zdF9zeXN0ZW1faWQgaW4gbHZtMiBtZXRhZGF0YSAobmV2ZXIgc2V0IHlldCkuCisgIFJlaW5zdGF0ZSByZWN1cnNpdmUgY29uZmlnIGZpbGUgdGFnIHNlY3Rpb24gcHJvY2Vzc2luZy4gKDIuMDIuOTkpCisgIEFkZCAnbHZtIHN5c3RlbWlkJyB0byBkaXNwbGF5IHRoZSBjdXJyZW50IHN5c3RlbSBJRCAobmV2ZXIgc2V0IHlldCkuCisgIEZpeCBjb25maWd1cmUgdG8gcHJvcGVybHkgcmVjb2duaXplIC0td2l0aC1kZWZhdWx0LXJhaWQxMC1zZWd0eXBlIG9wdGlvbi4KKyAgRG8gbm90IHJlZnJlc2ggZmlsdGVycy9yZXNjYW4gaWYgbm8gc2lnbmF0dXJlIGlzIHdpcGVkIGR1cmluZyBwdmNyZWF0ZS4KKyAgRW5mb3JjZSBub25lIGV4dGVybmFsIGRldiBpbmZvIGZvciB3aXBpbmcgZHVyaW5nIHB2Y3JlYXRlIHRvIGF2b2lkIHJhY2VzLgorICBBZGQgZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgYW5kIHN5c3RlbV9pZF9maWxlIHRvIGx2bS5jb25mIChkaXNhYmxlZCkuCisgIEFkZCBzdXBwb3J0IGZvciBWRyBzeXN0ZW1faWQgdG8gY29udHJvbCBob3N0IGFjY2VzcyB0byBWR3MuCisgIFVwZGF0ZSB2Z2V4dGVuZCB0byB1c2UgcHJvY2Vzc19lYWNoX3ZnLgorICBBZGQgLS1pZ25vcmVza2lwcGVkY2x1c3RlciB0byBwdmNoYW5nZS4KKyAgQWxsb3cgcHZjaGFuZ2UgdG8gbW9kaWZ5IHNldmVyYWwgcHJvcGVydGllcyBhdCBvbmNlLgorICBVcGRhdGUgcHZjaGFuZ2UgdG8gdXNlIHByb2Nlc3NfZWFjaF9wdi4KKyAgRml4IHB2cyAtYSB1c2VkIHdpdGggbHZtZXRhZCB0byBmaWx0ZXIgb3V0IGRldmljZXMgdW5zdWl0YWJsZSBmb3IgUFZzLgorICBGaXggc2VsZWN0aW9uIHRvIHJlY29nbml6ZSB1bml0cyBmb3IgYmFfc3RhcnQsIHZnX2ZyZWUgYW5kIHNlZ19zdGFydCBmaWVsZHMuCisgIEFkZCBzdXBwb3J0IGZvciAtUy8tLXNlbGVjdCB0byB2Z2V4cG9ydCBhbmQgdmdpbXBvcnQuCisgIEFkZCBzdXBwb3J0IGZvciAtUy8tLXNlbGVjdCB0byB2Z2Rpc3BsYXksIGx2ZGlzcGxheSBhbmQgcHZkaXNwbGF5IHdpdGhvdXQgLUMuCisgIEFkZCBzdXBwb3J0IGZvciAtUy8tLXNlbGVjdCB0byB2Z3JlbW92ZSBhbmQgbHZyZW1vdmUuCisgIEFkZCBzdXBwb3J0IGZvciAtUy8tLXNlbGVjdCB0byB2Z2NoYW5nZSxsdmNoYW5nZSBhbmQgcHZjaGFuZ2UuCisgIEFkZCBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHNlbGVjdGlvbiBmb3Igbm9uLXJlcG9ydGluZyB0b29scy4KKyAgQWRkIExWTV9DT01NQU5EX1BST0ZJTEUgZW52IHZhciB0byBzZXQgZGVmYXVsdCBjb21tYW5kIHByb2ZpbGUgbmFtZSB0byB1c2UuCisgIFNldCBDTE9FWEVDIGZsYWcgb24gZmlsZSBkZXNjcmlwdG9ycyBvcmlnaW5hdGluZyBpbiBsaWJkYWVtb24uCisKK1ZlcnNpb24gMi4wMi4xMTYgLSAzMHRoIEphbnVhcnkgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlYWN0aXZhdGUgdW51c2VkIHRoaW4gcG9vbHMgYWN0aXZhdGVkIHdpdGggbHZtMiBwcmUtMi4wMi4xMTIgdmVyc2lvbnMuCisgIENoZWNrIGxvY2sgaG9sZGluZyBMViB3aGVuIGx2Y29udmVydGluZyBzdGFja2VkIHJhaWQgTFYgaW4gY2x1c3Rlci4KKyAgU3VwcG9ydCB1ZGV2IGV4dGVybmFsIGRldiBpbmZvIGZvciBmaWx0ZXJzOiBQViBtaW4gc2l6ZSwgbXBhdGgsIG1kLCBwYXJ0aXRpb24uCisgIEFkZCBmd19yYWlkX2NvbXBvbmVudF9kZXRlY3Rpb24gbHZtLmNvbmYgb3B0aW9uIHRvIGVuYWJsZSBGVyByYWlkIGRldGVjdGlvbi4KKyAgQWRkIGRldmljZXMvZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlIGx2bS5jb25mIG9wdGlvbiAoIm5vbmUiIGJ5IGRlZmF1bHQpLgorICBTY2FuIHBvb2xzIGluIGZvcl9lYWNoX3N1Yl9sdigpIGFuZCBhZGQgZm9yX2VhY2hfc3ViX2x2X2V4Y2VwdF9wb29scygpLgorICBGaXggbHZtMmFwcCBsdm1fbHZfZ2V0X3Byb3BlcnR5IHJldHVybiB2YWx1ZSBmb3IgZmllbGRzIHdpdGggaW5mby9zdGF0dXMgaW9jdGwuCisgIEZpeCBsdm0yYXBwIHJlZ3Jlc3Npb24gaW4gbHZtX2x2X2dldF9hdHRyIGNhdXNpbmcgdW5rbm93biB2YWx1ZXMgKDIuMDIuMTE1KS4KKyAgU2V0IGRlZmF1bHQgY2FjaGVfbW9kZSB0byB3cml0ZWhyb3VnaCB3aGVuIG1pc3NpbmcgaW4gbWV0YWRhdGEuCisgIFByZXNlcnZlIGNodW5rIHNpemUgd2l0aCByZXBhaXIgYW5kIG1ldGFkYXRhIHN3YXAgb2YgYSB0aGluIHBvb2wuCisgIEZpeCByYWlkIC0tc3BsaXRtaXJyb3IgMSBmdW5jdGlvbmFsaXR5ICgyLjAyLjExMikuCisgIEZpeCB0cmVlIHByZWxvYWQgdG8gaGFuZGxlIHNwbGl0dGluZyByYWlkIGltYWdlcy4KKyAgRG8gbm90IHN1cHBvcnQgdW5wYXJ0aXRpb25lZCBEQVNEIGRldmljZXMuCisgIEltcHJvdmUgY29uZmlnIHZhbGlkYXRpb24gdG8gY2hlY2sgaWYgc2V0dGluZyB3aXRoIHN0cmluZyB2YWx1ZSBjYW4gYmUgZW1wdHkuCisKK1ZlcnNpb24gMi4wMi4xMTUgLSAyMXN0IEphbnVhcnkgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlcG9ydCBzZWdtZW50IHR5cGVzIHdpdGhvdXQgbW9uaXRvcmluZyBzdXBwb3J0IGFzIHVuZGVmaW5lZC4KKyAgU3VwcG9ydCBsdmNoYW5nZSAtLWVycm9yd2hlbmZ1bGwgZm9yIHRoaW4gcG9vbHMuCisgIEltcHJvdmUgdGhlIHByb2Nlc3NpbmcgYW5kIHJlcG9ydGluZyBvZiBkdXBsaWNhdGUgUFZzLgorICBSZXBvcnQgbHZfaGVhbHRoX3N0YXR1cyBhbmQgaGVhbHRoIGF0dHJpYnV0ZSBhbHNvIGZvciB0aGluIHBvb2wuCisgIEFkZCBsdl93aGVuX2Z1bGwgcmVwb3J0aW5nIGZpZWxkLgorICBBZGQgc3VwcG9ydCBmb3IgbHZjcmVhdGUgLS1lcnJvcndoZW5mdWxsIHl8biBmb3IgdGhpbiBwb29scy4KKyAgRml4IGx2Y29udmVydCAtLXJlcGFpciB0byBob25vdXIgcmVzaWxpZW5jZSByZXF1aXJlbWVudCBmb3Igc2VnbWVudGVkIFJBSUQgTFYuCisgIEZpbHRlciBvdXQgcGFydGl0aW9uZWQgZGV2aWNlLW1hcHBlciBkZXZpY2VzIGFzIHVuc3VpdGFibGUgZm9yIHVzZSBhcyBQVnMuCisgIEFsc28gbm90aWZ5IGx2bWV0YWQgYWJvdXQgZmlsdGVyZWQgZGV2aWNlIGlmIHVzaW5nIHB2c2NhbiAtLWNhY2hlIERldmljZVBhdGguCisgIFVzZSBMVk0ncyBvd24gc2VsZWN0aW9uIGluc3RlYWQgb2YgYXdrIGV4cHJlc3Npb25zIGluIGNsdm1kIHN0YXJ0dXAgc2NyaXB0cy4KKyAgRG8gbm90IGZpbHRlciBvdXQgc25hcHNob3Qgb3JpZ2luIExWcyBhcyB1bnVzYWJsZSBkZXZpY2VzIGZvciBhbiBMVk0gc3RhY2suCisgIEZpeCBpbmNvcnJlY3QgcmltYWdlIG5hbWVzIHdoZW4gY29udmVydGluZyBmcm9tIG1pcnJvciB0byByYWlkMSBMViAoMi4wMi4xMTIpLgorICBJbnRyb2R1Y2UgcHZyZW1vdmVfbWFueSB0byBhdm9pZCBleGNlc3NpdmUgbWV0YWRhdGEgcmUtcmVhZGluZyBhbmQgbWVzc2FnZXMuCisgIENoZWNrIGZvciBjbWlycm9yIGF2YWlsYWJpbGl0eSBkdXJpbmcgY2x1c3RlciBtaXJyb3IgY3JlYXRpb24gYW5kIGFjdGl2YXRpb24uCisgIEFkZCBjYWNoZV9wb2xpY3kgYW5kIGNhY2hlX3NldHRpbmdzIHJlcG9ydGluZyBmaWVsZHMuCisgIEFkZCBtaXNzaW5nIHJlY29nbml0aW9uIGZvciAtLWJpbmFyeSBvcHRpb24gd2l0aCB7cHYsdmcsbHZ9ZGlzcGxheSAtQy4KKyAgRml4IHZnaW1wb3J0Y2xvbmUgdG8gbm90aWZ5IGx2bWV0YWQgYWJvdXQgY2hhbmdlcyBkb25lIGlmIGx2bWV0YWQgaXMgdXNlZC4KKyAgRml4IHZnaW1wb3J0Y2xvbmUgdG8gcHJvcGVybHkgb3ZlcnJpZGUgY29uZmlnIGlmIGl0IGlzIG1pc3NpbmcgaW4gbHZtLmNvbmYuCisgIEZpeCBhdXRvbWF0aWMgdXNlIG9mIGNvbmZpZ3VyZSAtLWVuYWJsZS11ZGV2LXN5c3RlbWQtYmFja2dyb3VuZC1qb2JzLgorICBDb3JyZWN0bHkgcmVuYW1lIGFjdGl2ZSBzcGxpdCBMViB3aXRoIC1zcGxpdG1pcnJvcnMgZm9yIHJhaWQxLgorICBBZGQgcmVwb3J0L2NvbXBhY3Rfb3V0cHV0IHRvIGx2bS5jb25mIHRvIGVuYWJsZS9kaXNhYmxlIGNvbXBhY3QgcmVwb3J0IG91dHB1dC4KKyAgU3RpbGwgcmVzdHJpY3QgbWlycm9yIHJlZ2lvbiBzaXplIHRvIHBvd2VyIG9mIDIgd2hlbiBWRyBleHRlbnQgc2l6ZSBpcyBub3QuCisKK1ZlcnNpb24gMi4wMi4xMTQgLSAyOHRoIE5vdmVtYmVyIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVsZWFzZSBzb2NrZXQgaW4gZGFlbW9uX2Nsb3NlIGFuZCBwcm90b2NvbCBzdHJpbmcgaW4gZGFlbW9uX29wZW4gZXJyb3IgcGF0aC4KKyAgQWRkIC0tY2FjaGVwb2xpY3kgYW5kIC0tY2FjaGVzZXR0aW5ncyB0byBsdmNyZWF0ZS4KKyAgRml4IHJlZ3Jlc3Npb24gd2hlbiBwYXJzaW5nIC9kZXYvbWFwcGVyIGRpciAoMi4wMi4xMTIpLgorICBGaXggbWlzc2luZyByb3VuZGluZyB0byA2NEtCIHdoZW4gZXN0aW1hdGluZyBvcHRpbWFsIHRoaW4gcG9vbCBjaHVuayBzaXplLgorICBGaXggdHlwbyBpbiBjbHZtZCBpbml0c2NyaXB0IGNhdXNpbmcgQ0xWTURfU1RPUF9USU1FT1VUIHZhciB0byBiZSBpZ25vcmVkLgorICBGaXggc2l6ZSBpbiBwdnJlc2l6ZSAiUmVzaXppbmcgdG8gLi4uIiB2ZXJib3NlIG1zZyB0byBzaG93IHByb3BlciByZXN1bHQgc2l6ZS4KKworVmVyc2lvbiAyLjAyLjExMyAtIDI0dGggTm92ZW1iZXIgMjAxNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgLS1jYWNoZXBvbGljeSBhbmQgLS1jYWNoZXNldHRpbmdzIG9wdGlvbnMgdG8gbHZjaGFuZ2UuCisgIFZhbGlkYXRlIHRoYXQgY29udmVydGVkIHZvbHVtZSBhbmQgc3BlY2lmaWVkIHBvb2wgdm9sdW1lIGRpZmZlciBpbiBsdmNvbnZlcnQuCisgIEZpeCByZWdyZXNzaW9uIGluIHZnc2NhbiAtLW1rbm9kZXMgdXNhZ2UgKDIuMDIuMTEyKS4KKyAgUmVzcGVjdCAtLXByZWZpeCB3aGVuIHNldHRpbmcgQ0xNVkRfUEFUSCBjb25maWd1cmUgKDIuMDIuODkpLgorICBEZWZhdWx0IHRvIGNvbmZpZ3VyZSAtLWVuYWJsZS11ZGV2LXN5c3RlbWQtYmFja2dyb3VuZC1qb2JzIGZvciBzeXN0ZW1kPj0yMDUuCisgIEZpeCBpZ25vcmVfdmcoKSB0byBwcm9wZXJseSByZWFjdCBvbiB2YXJpb3VzIHZnX3JlYWQgZXJyb3JzICgyLjAyLjExMikuCisgIEZhaWxlZCByZWNvdmVyeSByZXR1cm5zIEZBSUxFRF9SRUNPVkVSWSBzdGF0dXMgZmxhZyBmb3IgdmdfcmVhZCgpLgorICBFeGl0IHdpdGggbm9uLXplcm8gc3RhdHVzIGNvZGUgd2hlbiBwdmNrIGVuY291bnRlcnMgYSBwcm9ibGVtLgorICBGaXggY2xlYW5fdHJlZSBhZnRlciBhY3RpdmF0aW9uL3Jlc3VtZSBmb3IgY2FjaGUgdGFyZ2V0ICgyLjAyLjExMikuCisKK1ZlcnNpb24gMi4wMi4xMTIgLSAxMXRoIE5vdmVtYmVyIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGNhY2hlX3tyZWFkLHdyaXRlfV97aGl0cyxtaXNzZXN9IHJlcG9ydGluZyBmaWVsZHMuCisgIEFkZCBjYWNoZV97dG90YWwsdXNlZCxkaXJ0eX1fYmxvY2tzIHJlcG9ydGluZyBmaWVsZHMuCisgIEFkZCBfY29yaWcgYXMgcmVzZXJ2ZWQgc3VmZml4LgorICBSZWR1Y2UgbnVtYmVyIG9mIFZHIHdyaXRlcyBhbmQgY29tbWl0cyB3aGVuIGNyZWF0aW5nIHNwYXJlIHZvbHVtZXMuCisgIFdoZW4gcmVtb3ZlX2xheWVyX2Zyb21fbHYoKSByZW1vdmVzIGxheWVyLCByZXN0b3JlIHN1YkxWIG5hbWVzLgorICBDYWNoZS1wb29sIGluIHVzZSBiZWNvbWVzIGludmlzaWJsZSBMVi4KKyAgRG9uJ3QgcHJvbXB0IGZvciByZW1vdmFsIG9mIF9wbXNwYXJlIGluIFZHIHdpdGhvdXQgcG9vbCBtZXRhZGF0YSBMVi4KKyAgRGVhY3RpdmF0aW9uIG9mIHNuYXBzaG90IG9yaWdpbiBkZXRlY3RzIGFuZCBkZWFjdGl2YXRlcyBsZWZ0LW92ZXIgc25hcHNob3RzLgorICBQcm9wZXJseSByZXBvcnQgZXJyb3Igd2hlbiB0YWtpbmcgc25hcHNob3Qgb2YgYW55IGNhY2hlIHR5cGUgTFYuCisgIEFkZCBiYXNpYyB0aHJlYWQgZGVidWdnaW5nIG1lc3NhZ2VzIHRvIGRtZXZlbnRkLgorICBJbmNsdWRlIHRocmVhZHMgYmVpbmcgc2h1dGRvd24gaW4gZG1ldmVudGQgZGV2aWNlIHJlZ2lzdHJhdGlvbiByZXNwb25zZXMuCisgIEluaXRhbCBzdXBwb3J0IGZvciBleHRlcm5hbCB1c2VycyBvZiB0aGluIHBvb2xzIGJhc2VkIG9uIHRyYW5zYWN0aW9uX2lkLgorICBSZXBvcnQgc29tZSBiYXNpYyBwZXJjZW50YWdlIGluZm8gZm9yIGNhY2hlIHBvb2xzLgorICBJbnRyb2R1Y2Ugc2l6ZV9tYl9hcmdfd2l0aF9wZXJjZW50KCkgZm9yIGFkdmFuY2VkIHNpemUgYXJnIHJlYWRpbmcuCisgIEFkZCBleHRyYSBzdXBwb3J0IGZvciAnLicgYXMgZGVjaW1hbCBwb2ludCBpbiBzaXplIGFyZ3MuCisgIEFkZCBjb25maWd1cmUgcGFyYW1ldGVycyBmb3IgZGVmYXVsdCBzZWdtZW50IHR5cGUgY2hvaWNlcy4KKyAgQWRkIGdsb2JhbC9zcGFyc2Vfc2VndHlwZV9kZWZhdWx0IHNldHRpbmcgdG8gdXNlIHRoaW4gZm9yIC0tdHlwZSBzcGFyc2UuCisgIFVwZGF0ZSBhbmQgY29ycmVjdCBsdmNyZWF0ZSBhbmQgbHZjb3ZlcnQgbWFuIHBhZ2VzLgorICBNYXJrIHBvb2xzIGFuZCBzbmFwc2hvdHMgYXMgdW56ZXJvYWJsZSB2b2x1bWVzLgorICBDaGVjayBmb3IgemVyb2luZyBvZiB2b2x1bWUgYWZ0ZXIgc2VnbWVudCB0eXBlIGlzIGZ1bGx5IGRldGVjdGVkLgorICBCZXR0ZXIgc3VwcG9ydCBmb3IgcGVyc2lzdGVudCBtYWpvciBhbmQgbWlub3Igb3B0aW9ucyB3aXRoIGx2Y3JlYXRlLgorICBSZWZhY3RvciBsdmNyZWF0ZSB0b3dhcmRzIG1vcmUgY29tcGxldGUgdmFsaWRhdGlvbiBvZiBhbGwgc3VwcG9ydGVkIG9wdGlvbnMuCisgIFN1cHBvcnQgbHZjcmVhdGUgLS10eXBlIGxpbmVhci4KKyAgSW1wcm92ZSBfc2hvdWxkX3dpcGVfbHYoKSB0byB3YXJuIHdpdGggbWVzc2FnZS4KKyAgSW5mb3JtIGFib3V0IHRlbXBvcmFyaWx5IGNyZWF0ZWQgdm9sdW1lcyBvbmx5IGluIHZlcmJvc2UgbW9kZS4KKyAgQmV0dGVyIHN1cHBvcnQgZm9yIC0tdGVzdCBtb2RlIHdpdGggcG9vbCBjcmVhdGlvbi4KKyAgUXVlcnkgbG9jayBob2xkaW5nIExWIHdoZW4gcmVwbGFjaW5nIGFuZCBjb252ZXJ0aW5nIHJhaWQgdm9sdW1lcy4KKyAgQWRkIGV4dHJhIHZhbGlkYXRlIGZvciBsb2NrZWQgbHYgd2l0aGluIHZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZSgpLgorICBBZGQgaW50ZXJuYWwgbHZzZWdfbmFtZSgpIGZ1bmN0aW9uLgorICBTa2lwIHVzZSBvZiBsb2NrIGZpbGVzIGZvciB2aXJ0dWFsIGludGVybmFsIFZHIG5hbWVzLgorICBGaXggc2VsZWN0aW9uIG9uIHt2Zyxsdn1fcGVybWlzc2lvbnMgZmllbGRzIHRvIHByb3Blcmx5IG1hdGNoIHNlbGVjdGlvbiBjcml0ZXJpYS4KKyAgRml4IGx2X3Blcm1pc3Npb25zIHJlcG9ydGluZyB0byBkaXNwbGF5IHJlYWQtb25seXstb3ZlcnJpZGV9IGluc3RlYWQgb2YgYmxhbmsuCisgIEZpeCBsaWJsdm0yY21kIGFuZCBsdm0gc2hlbGwgdG8gcmVzcGVjdCBxdW90ZXMgYXJvdW5kIGFyZ3MgaW4gY21kIGxpbmUgc3RyaW5nLgorICBQZXJtaXQgZXh0ZW50IHNpemVzID4gMTI4S0IgdGhhdCBhcmUgbm90IHBvd2VyIG9mIDIgd2l0aCBsdm0yIGZvcm1hdC4KKyAgUmVtb3ZlIHdvcmthcm91bmQgZm9yIGx2bTItbW9uaXRvci5zZXJ2aWNlIGhhbmcgb24gc3RvcCBpZiBsdm1ldGFkIHN0b3BwZWQuCisgIENoYW5nZSB2Z3JlbW92ZSB0byB1c2UgcHJvY2Vzc19lYWNoX2x2X2luX3ZnLgorICBBbGxvdyBsdmNvbnZlcnQgLS1yZXBhaXIgYW5kIC0tc3BsaXRtaXJyb3JzIG9uIGludGVybmFsIExWcy4KKyAgSW50cm9kdWNlIFdBUk5fIGZsYWdzIHRvIGNvbnRyb2wgc29tZSBtZXRhZGF0YSB3YXJuaW5nIG1lc3NhZ2VzLgorICBVc2UgcHJvY2Vzc19lYWNoX3B2IGluIHZncmVkdWNlLgorICBSZWZhY3RvciBwcm9jZXNzX2VhY2hfcHYgaW4gdG9vbGxpYi4KKyAgSW50cm9kdWNlIHNpbmdsZSB2YWxpZGF0aW9uIHJvdXRpbmUgZm9yIHBvb2wgY2h1bmsgc2l6ZS4KKyAgU3VwcG9ydCAtLXllcyBsaWtlIC0tZm9yY2UgaW4gdmcvbHZyZW1vdmUgdG8gc2tpcCB5fG4gcHJvbXB0LgorICBTdXBwb3J0IC0teWVzIHdpdGggbHZjb252ZXJ0IC0tc3BsaXRzbmFwc2hvdC4KKyAgRml4IGRldGVjdGlvbiBvZiB1bnN1cHBvcnRlZCB0aGluIGV4dGVybmFsIGx2Y29udmVyc2lvbnMuCisgIEZpeCBkZXRlY3Rpb24gb2YgdW5zdXBwb3J0ZWQgY2FjaGUgYW5kIHRoaW4gcG9vbCBsdmNvbnZlcnNpb25zLgorICBGaXggZGV0ZWN0aW9uIG9mIHVuc3VwcG9ydGVkIGx2Y29udmVyc2lvbiBvZiBjYWNoZSB0byBzbmFwc2hvdC4KKyAgSW1wcm92ZSBjb2RlIGZvciBjcmVhdGlvbiBvZiBjYWNoZSBhbmQgY2FjaGUgcG9vbCB2b2x1bWVzLgorICBDaGVjayBjbHVzdGVyLXdpZGUgKG5vdCBsb2NhbCkgYWN0aXZlIHN0YXR1cyBiZWZvcmUgcmVtb3ZpbmcgTFYuCisgIFByb3Blcmx5IGNoZWNrIGlmIGFjdGl2YXRpb24gb2YgcmVtb3ZlZCBjYWNoZWQgTFYgcmVhbGx5IGFjdGl2YXRlZC4KKyAgbHZyZW1vdmUgY2FjaGVkIExWIHJlbW92ZXMgY2FjaGVwb29sIChrZWVwIHdpdGggbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSkuCisgIEFsd2F5cyByZW1vdmUgc3BhcmUgTFYgd2l0aCBsYXN0IHJlbW92ZWQgcG9vbCB2b2x1bWUuCisgIFN1cHBvcnQgbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSBhbmQgLS11bmNhY2hlIG9mIGNhY2hlZCBMVi4KKyAgT3B0aW9uIC0tY2FjaGUgaGFzIGFsc28gc2hvcnRjdXQgLUggKGkuZS4gbHZjcmVhdGUgLUgpLgorICBSZWZhY3RvciBsdmNyZWF0ZSBjb2RlIGFuZCBiZXR0ZXIgcHJlc2VydmUgLS10eXBlIGFyZ3VtZW50LgorICBSZWZhY3RvciBmaWx0ZXIgcHJvY2Vzc2luZyBhcm91bmQgbHZtZXRhZC4KKyAgUmVmYWN0b3IgcHJvY2Vzc19lYWNoX2x2IGluIHRvb2xsaWIuCisgIFJlZmFjdG9yIHByb2Nlc3NfZWFjaF92ZyBpbiB0b29sbGliLgorICBQb29scyBjYW5ub3QgYmUgdXNlZCBhcyBleHRlcm5hbCBvcmlnaW4uCisgIFVzZSBsdl91cGRhdGVfYW5kX3JlbG9hZCgpIGZvciBzbmFwc2hvdCByZWxvYWQuCisgIERvbid0IHByaW50IG1lc3NhZ2UgaW4gYWRqdXN0ZWRfbWlycm9yX3JlZ2lvbl9zaXplKCkgaW4gYWN0aXZhdGlvbi4KKyAgSW1wcm92ZSBsdl91cGRhdGVfYW5kX3JlbG9hZCgpIHRvIGZpbmQgb3V0IHByb3BlciBsb2NrIGhvbGRpbmcgTFYuCisgIEltcHJvdmUgc2VhcmNoIG9mIExWIGluIGx2X29uZGlzaygpLgorICBEbyBub3Qgc2NhbiBzeXNmcyBpbiBsdl9jaGVja19ub3RfaW5fdXNlKCkgd2hlbiBkZXZpY2UgaXMgY2xvc2VkLgorICBCYWNrdXAgZmluYWwgbWV0YWRhdGEgYWZ0ZXIgcmVzeW5jIG9mIG1pcnJvci9yYWlkLgorICBVbmlmeSBoYW5kbGluZyBvZiAtLXBlcnNpc3RlbnQgb3B0aW9uIGZvciBsdmNyZWF0ZSBhbmQgbHZjaGFuZ2UuCisgIFZhbGlkYXRlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIHN0b3JlZCBpbiBtZXRhZGF0YS4KKyAgVXNlIC1mUElFIHdoZW4gbGlua2luZyAtcGllIGV4ZWN1dGFibGVzLgorICBTdXBwb3J0IERFQlVHX01FTUxPQ0sgdG8gdHJhcCB1bnN1cHBvcnRlZCBtbWFwIHVzYWdlLgorICBFbmFibGUgY2FjaGUgc2VnbWVudCB0eXBlIGJ5IGRlZmF1bHQuCisgIEVuc3VyZSBvbmx5IHN1cHBvcnRlZCB2b2x1bWUgdHlwZXMgYXJlIHVzZWQgd2l0aCBjYWNoZSBzZWdtZW50cy4KKyAgRml4IGluYWJsaWxpdHkgdG8gc3BlY2lmeSBjYWNoZW1vZGUgd2hlbiAnbHZjb252ZXJ0J2luZyB0byBjYWNoZS1wb29sLgorICBHcmFiIGNsdXN0ZXIgbG9jayBmb3IgYWN0aXZlIExWcyB3aGVuIHNldHRpbmcgY2x1c3RlcmVkIGF0dHJpYnV0ZS4KKyAgVXNlIHZhX2NvcHkgdG8gcHJvcGVybHkgcGFzcyB2YV9saXN0IHRocm91Z2ggZnVuY3Rpb25zLgorICBBZGQgZnVuY3Rpb24gdG8gZGV0ZWN0IHJvdGF0aW9uYWwgZGV2aWNlcy4KKyAgUmV2aWV3IGludGVybmFsIGNoZWNrcyBmb3IgbWlycm9yL3JhaWQvcHZtb3ZlIHZvbHVtZXMuCisgIFRyYWNrIG1pcnJvciBzZWdtZW50IHR5cGUgd2l0aCBzZXBhcmF0ZSBNSVJST1IgZmxhZy4KKyAgRml4IGNtaXJyb3IgZW5kaWFuIGNvbnZlcnNpb25zLgorICBJbnRyb2R1Y2UgbHZfaXNfcHZtb3ZlL2xvY2tlZC9jb252ZXJ0aW5nL21lcmdpbmcgbWFjcm9zLgorICBBdm9pZCBsZWF2aW5nIGxpbmVhciBsb2dpY2FsIHZvbHVtZSB3aGVuIHRoaW4gcG9vbCBjcmVhdGlvbiBmYWlscy4KKyAgRG9uJ3QgbGVhayBhbGxvY19oYW5kbGUgb24gcmFpZCB0YXJnZXQgZXJyb3IgcGF0aC4KKyAgUHJvcGVybHkgdmFsaWRhdGUgcmFpZCBsZWcgbmFtZXMuCisgIEFyY2hpdmUgbWV0YWRhdGEgYmVmb3JlIHN0YXJ0aW5nIHRoZWlyIG1vZGlmaWNhdGlvbiBpbiByYWlkIHRhcmdldC4KKyAgQWRkIG1pc3NpbmcgdmdfcmV2ZXJ0KCkgaW4gc3VzcGVuZF9sdigpIHJhaWQgYW5kIHNuYXBzaG90IGVycm9yIHBhdGguCisgIEFkZCBtaXNzaW5nIGJhY2t1cCBvZiBsdm0yIG1ldGFkYXRhIGFmdGVyIHNvbWUgcmFpZCBtb2RpZmljYXRpb25zLgorICBVc2UgdmcgbWVtb3J5IHBvb2wgZm9yIGV4dGVudCBhbGxvY2F0aW9uLgorICBBZGQgYWxsb2NhdGlvbi9waHlzaWNhbF9leHRlbnRfc2l6ZSBjb25maWcgb3B0aW9uIGZvciBkZWZhdWx0IFBFIHNpemUgb2YgVkdzLgorICBEZW1vdGUgYW4gZXJyb3IgdG8gYSB3YXJuaW5nIHdoZW4gZGV2aWNlcyBrbm93biB0byBsdm1ldGFkIGFyZSBmaWx0ZXJlZCBvdXQuCisgIFJlLW9yZGVyIGZpbHRlciBldmFsdWF0aW9uLCBtYWtpbmcgY29tcG9uZW50IGZpbHRlcnMgZ2xvYmFsLgorICBGaXggbG9naWMgdGhhdCBjaGVja3MgZm9yIGZ1bGwgc2NhbiBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZGV2aWNlcy4KKyAgSW50cm9kdWNlIGNvbW1vbiBjb2RlIHRvIG1vZGlmeSBtZXRhZGF0YSBhbmQgcmVsb2FkIHVwZGF0ZWQgTFYuCisgIEZpeCByZW5hbWUgb2YgYWN0aXZlIHNuYXBzaG90IHZvbHVtZSBpbiBjbHVzdGVyLgorICBNYWtlIHN1cmUgc2hhcmVkIGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCBSRUxSTyBvcHRpb24uCisKK1ZlcnNpb24gMi4wMi4xMTEgLSAxc3QgU2VwdGVtYmVyIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUGFzcyBwcm9wZXJseSBzaXplZCBjaGFyIGJ1ZmZlcnMgZm9yIHNzY2FuZiB3aGVuIGluaXRpYWxpemluZyBjbHZtZC4KKyAgUmVpbnN0YXRlIG5vc3luYyBsb2dpYyB3aGVuIGV4dGVuZGluZyBtaXJyb3IuICgyLjAyLjExMCkKKyAgRml4IHRvdGFsIGFyZWEgZXh0ZW50IGNhbGN1bGF0aW9uIHdoZW4gYWxsb2NhdGluZyBjYWNoZSBwb29sLiAoMi4wMi4xMTApCisKK1ZlcnNpb24gMi4wMi4xMTAgLSAyNnRoIEF1Z3VzdCAyMDE0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggbWFuaXB1bGF0aW9uIHdpdGggdGhpbi1wb29scyB3aGljaCBhcmUgZXhjbHVkZWQgdmlhIHZvbHVtZV9saXN0LgorICBTdXBwb3J0IGx2L3ZncmVtb3ZlIC1mZiB0byByZW1vdmUgdGhpbiB2b2xzIGZyb20gYnJva2VuL2luYWN0aXZlIHRoaW4gcG9vbHMuCisgIEZpeCB0eXBvIGJyZWFraW5nIGNvbmZpZ3VyZSAtLXdpdGgtbHZtMT1zaGFyZWQuCisgIE1vZGlmeSBsdnJlc2l6ZSBjb2RlIHRvIGhhbmRsZSByYWlkL21pcnJvcnMgYW5kIHBoeXNpY2FsIGV4dGVudHMuCisgIERvbid0IGFsbG93IHB2Y3JlYXRlIHRvIHByb2NlZWQgaWYgc2Nhbm5pbmcgb3IgZmlsdGVyaW5nIGZhaWxzLgorICBDbGVhbmx5IGVycm9yIHdoZW4gY3JlYXRpbmcgUkFJRCB3aXRoIHN0cmlwZSBzaXplIDwgUEFHRV9TSVpFLgorICBQcmludCBuYW1lIG9mIExWIHdoaWNoIG9uIGFjdGl2YXRpb24gdHJpZ2dlcnMgZGVsYXllZCBzbmFwc2hvdCBtZXJnZS4KKyAgQWRkIGx2X2xheW91dCBhbmQgbHZfcm9sZSBMViByZXBvcnRpbmcgZmllbGRzLgorICBQcm9wZXJseSBkaXNwbGF5IGx2cyBsdl9hdHRyIHZvbHVtZSB0eXBlIGFuZCB0YXJnZXQgdHlwZSBiaXQgZm9yIGNhY2hlIG9yaWdpbi4KKyAgRml4IHB2Y3JlYXRlX2NoZWNrKCkgdG8gdXBkYXRlIGNhY2hlIGNvcnJlY3RseSBhZnRlciBzaWduYXR1cmUgd2lwaW5nLgorICBGaXggcHJpbWFyeSBkZXZpY2UgbG9va3VwIGZhaWx1cmUgZm9yIHBhcnRpdGlvbiB3aGVuIHByb2Nlc3NpbmcgbXBhdGggZmlsdGVyLgorICBJZiBMViBpbmFjdGl2ZSBhbmQgbm9uLWNsdXN0ZXJlZCwgZG8gbm90IGlzc3VlICJDYW5ub3QgZGVhY3RpdmF0ZSIgb24gLWFsbi4KKyAgUmVtb3ZlIHNwdXJpb3VzICJTa2lwcGluZyBtaXJyb3IgTFYiIG1lc3NhZ2Ugb24gcHZtb3ZlIG9mIGNsdXN0ZXJlZCBtaXJyb3IuCisKK1ZlcnNpb24gMi4wMi4xMDkgLSA1dGggQXVndXN0IDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIGx2X3ZvbHVtZV90eXBlIGZpZWxkIGZyb20gcmVwb3J0cy4gKDIuMDIuMTA4KQorICBGaXggYSBzZWdmYXVsdCBpbiBsdnNjYW4gLS1jYWNoZSB3aGVuIGRldmljZXMgd2VyZSBhbHJlYWR5IG1pc3NpbmcuICgyLjAyLjEwOCkKKyAgRml4IGluY29ycmVjdCBwZXJzaXN0ZW50IC5jYWNoZSBhZnRlciB2Z2NyZWF0ZSB3aXRoIFBWIGNyZWF0aW9uLiAoMi4wMi4xMDgpCisgIERpc3BsYXkgYWN0dWFsIHNpemUgY2hhbmdlZCB3aGVuIHJlc2l6aW5nIExWLgorICBBbGxvdyBhcHByb3hpbWF0ZSBhbGxvY2F0aW9uIHdpdGggKyVGUkVFIGluIGx2ZXh0ZW5kLgorICBSZW1vdmUgcG9zc2libGUgc3B1cmlvdXMgIm5vdCBmb3VuZCIgbWVzc2FnZSBvbiBQViBjcmVhdGUgYmVmb3JlIHdpcGluZy4KKyAgSGFuZGxlIHVwZ3JhZGUgZnJvbSAyLjAyLjEwNSB3aGVuIGFuIExWIG5vdyBnYWluaW5nIGEgdXVpZCBzdWZmaXggaXMgYWN0aXZlLgorCitWZXJzaW9uIDIuMDIuMTA4IC0gMjNyZCBKdWx5IDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgbHZzY2FuIC0tY2FjaGUgd2hpY2ggcmUtc2NhbnMgY29uc3RpdHVlbnRzIG9mIGEgcGFydGljdWxhciBMVi4KKyAgTWFrZSBkbWV2ZW50ZCdzIFJBSUQgcGx1Z2luIHJlLXNjYW4gZmFpbGVkIFBWcyB3aGVuIGx2bWV0YWQgaXMgaW4gdXNlLgorICBJbXByb3ZlIGNvZGUgc2hhcmluZyBmb3IgbHZjb252ZXJ0IGFuZCBsdmNyZWF0ZSBhbmQgcG9vbHMgKGNhY2hlICYgdGhpbikuCisgIEltcHJvdmUgbHZjb252ZXJ0IC0tbWVyZ2UgdmFsaWRhdGlvbi4KKyAgSW1wcm92ZSBsdmNvbnZlcnQgLS1zcGxpdHNuYXBzaG90IHZhbGlkYXRpb24uCisgIEFkZCByZXBvcnQvbGlzdF9pdGVtX3NlcGFyYXRvciBsdm0uY29uZiBvcHRpb24uCisgIEFkZCBsdl9hY3RpdmVfe2xvY2FsbHkscmVtb3RlbHksZXhjbHVzaXZlbHl9IExWIHJlcG9ydGluZyBmaWVsZHMuCisgIENvbW1lbnQgb3V0IGRldmljZXMve3ByZWZlcnJlZF9uYW1lcyxmaWx0ZXJ9IGluIGRlZmF1bHQgbHZtLmNvbmYgZmlsZS4KKyAgRW5oYW5jZSBsdmNvbnZlcnQgdGhpbiwgdGhpbnBvb2wsIGNhY2hlIGFuZCBjYWNoZXBvb2wgY29tbWFuZCBsaW5lIHN1cHBvcnQuCisgIERpc3BsYXkgJ0MnIG9ubHkgZm9yIGNhY2hlIGFuZCBjYWNoZS1wb29sIHRhcmdldCB0eXBlcyBpbiBsdnMuCisgIFByb21wdCBmb3IgY29uZmlybWF0aW9uIGJlZm9yZSBjaGFuZ2UgTFYgaW50byBhIHNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZS4KKyAgUmV0dXJuIHByb3BlciBlcnJvciBjb2RlcyBmb3Igc29tZSBmYWlsaW5nIGx2Y29udmVydCBmdW50aW9ucy4KKyAgQWRkIGluaXRpYWwgY29kZSB0byB1c2UgY2FjaGUgdG9vbHMgKGNhY2hlX2NoZWNrfGR1bXB8cmVwYWlyfHJlc3RvcmUpLgorICBTdXBwb3J0IGx2ZGlzcGxheSAtLW1hcHMgZm9yIHJhaWQuCisgIEFkZCAtLWFjdGl2YXRpb25tb2RlIGRlZ3JhZGVkIHRvIGFjdGl2YXRlIGRlZ3JhZGVkIHJhaWQgdm9sdW1lcyBieSBkZWZhdWx0LgorICBBZGQgc2VwYXJhdGUgbHZfYWN0aXZlX3tsb2NhbGx5LHJlbW90ZWx5LGV4Y2x1c2l2ZWx5fSBMViByZXBvcnRpbmcgZmllbGRzLgorICBSZWNvZ25pemUgImF1dG8iLyJ1bm1hbmFnZWQiIHZhbHVlcyBpbiBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIGZpZWxkcyBvbmx5LgorICBBZGQgcmVwb3J0L2JpbmFyeV92YWx1ZXNfYXNfbnVtZXJpYyBsdm0uY29uZiBvcHRpb24gZm9yIGJpbmFyeSB2YWx1ZXMgYXMgMC8xLgorICBBZGQgLS1iaW5hcnkgYXJnIHRvIHB2cyx2Z3MsbHZzIGFuZCB7cHYsdmcsbHZ9ZGlzcGxheSAtQyBmb3IgMC8xIG9uIHJlcG9ydHMuCisgIEFkZCBzZXBhcmF0ZSByZXBvcnRpbmcgZmllbGRzIGZvciBlYWNoIGVhY2gge3B2LHZnLGx2fV9hdHRyIGJpdC4KKyAgU2VwYXJhdGUgTFYgZGV2aWNlIHN0YXR1cyByZXBvcnRpbmcgZmllbGRzIG91dCBvZiBMViBmaWVsZHMuCisgIEZpeCByZWdyZXNzaW9uIGNhdXNpbmcgUFZzIG5vdCBpbiBWR3MgdG8gYmUgbWFya2VkIGFzIGFsbG9jYXRhYmxlICgyLjAyLjU5KS4KKyAgRml4IFZHIGNvbXBvbmVudCBvZiBsdmlkIGluIHZnc3BsaXQvdmdtZXJnZSBhbmQgY2hlY2sgaW4gdmdfdmFsaWRhdGUuCisgIEFkZCBsdl9mdWxsX25hbWUsIGx2X3BhcmVudCBhbmQgbHZfZG1fcGF0aCBmaWVsZHMgdG8gcmVwb3J0cy4KKyAgQ2hhbmdlIGx2X3BhdGggZmllbGQgdG8gc3VwcHJlc3MgZGV2aWNlcyB0aGF0IG5ldmVyIGFwcGVhciBpbiAvZGV2L3ZnLgorICBQb3N0cG9uZSB0aGluIHBvb2wgbHZjb252ZXJ0IHByb21wdHMgKDIuMDIuMTA3KS4KKyAgUmVxdWlyZSAtLXllcyBvcHRpb24gdG8gc2tpcCBwcm9tcHQgdG8gbHZjb252ZXJ0IHRoaW4gcG9vbCBjaHVua3NpemUuCisgIFN1cHBvcnQgbHZyZW1vdmUgLWZmIHRvIHJlbW92ZSB0aGluIHZvbHVtZXMgZnJvbSBicm9rZW4gdGhpbiBwb29scy4KKyAgUmVxdWlyZSAtLXllcyB0byBza2lwIHJhaWQgcmVwYWlyIHByb21wdC4KKyAgQ2hhbmdlIG1ha2VmaWxlICUuZCBnZW5lcmF0aW9uIHRvIGhhbmRsZSBmaWxlbmFtZSBjaGFuZ2VzIHdpdGhvdXQgbWFrZSBjbGVhbi4KKyAgRml4IHVzZSBvZiBidWlsZGlyIGluIG1ha2UgcG9maWxlLgorICBFbmhhbmNlIHByaXZhdGUgdm9sdW1lcyBVVUlEcyB3aXRoIHN1ZmZpeGVkIGZvciBlYXNpZXIgZGV0ZWN0aW9uLgorICBEbyBub3QgdXNlIHJlc2VydmVkIF9bdGNdbWV0YSB2b2x1bWVzIGZvciB0ZW1wb3JhcnkgTFZzLgorICBMZWF2ZSBiYWNrdXAgcG9vbCBtZXRhZGF0YSB3aXRoIF9tZXRhJWQgc3VmZml4IGluc3RlYWQgb2YgcmVzZXJ2ZWQgX3RtZXRhJWQuCisgIEFsbG93IFJBSUQgcmVwYWlyIHRvIHJldXNlIFBWcyBmcm9tIHNhbWUgaW1hZ2UgdGhhdCBzdWZmZXJlZCBhIGZhaWx1cmUuCisgIE5ldyBSQUlEIGltYWdlcyBub3cgYXZvaWQgYWxsb2NhdGlvbiBvbiBhbnkgUFZzIGluIHRoZSBzYW1lIHBhcmVudCBSQUlEIExWLgorICBBbHdheXMgcmVldmFsdWF0ZSBmaWx0ZXJzIGp1c3QgYmVmb3JlIGNyZWF0aW5nIFBWLgorCitWZXJzaW9uIDIuMDIuMTA3IC0gMjNyZCBKdW5lIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbnRyb2R1Y2UgTENLX0FDVElWQVRJT04gdG8gYXZvaWQgY29uY3VycmVudCBhY3RpdmF0aW9uIG9mIGJhc2ljIExWIHR5cGVzLgorICBGaXggb3Blbl9jb3VudCB0ZXN0IGZvciBsdmNoYW5nZSAtLXJlZnJlc2ggb3IgbWlycm9ycyBhbmQgcmFpZHMuCisgIFVwZGF0ZSBwdnMsdmdzLGx2cyBhbmQgbHZtIG1hbiBwYWdlIGZvciBzZWxlY3Rpb24gc3VwcG9ydC4KKyAgQWRkIC1TLy0tc2VsZWN0IHRvIGx2bSBkZXZ0eXBlcyBmb3IgcmVwb3J0IHNlbGVjdGlvbi4KKyAgQWRkIC1TLy0tc2VsZWN0IHRvIHB2cyx2Z3MsbHZzIGFuZCB7cHYsdmcsbHZ9ZGlzcGxheSAtQyBmb3IgcmVwb3J0IHNlbGVjdGlvbi4KKyAgVXNlIGRtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uIG5vdywgaW1wbGljaXQgInNlbGVjdGVkIiBmaWVsZCBhcHBlYXJzLgorICBNYWtlIHVzZSBvZiBsaWJkbSdzIERNX1JFUE9SVF9GSUVMRF9UWVBFe1NJWkUsUEVSQ0VOVCxTVFJJTkdfTElTVH0gZm9yIGZpZWxkcy4KKyAgU3VwcG9ydCBhbGwtb3Itbm90aGluZyBwdm1vdmUgLS1hdG9taWMuCisgIEF1dG9tYXRpY2FsbHkgYWRkIHNuYXBzaG90IG1ldGFkYXRhIHNpemUgZm9yIC1sICVPUklHSU4gY2FsY3VsYXRpb24uCisgIFdoZW4gY29udmVydGluZyBSQUlEIG9yaWdpbiB0byBjYWNoZSBMViwgcHJvcGVybHkgcmVuYW1lIHN1Yi1MVnMuCisgIFVzZSBSZW1vdmVPblN0b3AgZm9yIGx2bTItbHZtZXRhZC5zb2NrZXQgc3lzdGVtZCB1bml0LgorICBBZGQgdGhpbi1nZW5lcmljIGNvbmZpZ3VyYXRpb24gcHJvZmlsZSBmb3IgZ2VuZXJpYyB0aGluIHNldHRpbmdzLgorICBGaXggY3Jhc2ggd2hlbiByZXBvcnRpbmcgZW1wdHkgbGFiZWxzIG9uIHB2cy4KKyAgVXNlIHJldHJ5X2RlYWN0aXZhdGlvbiBhbHNvIHdoZW4gY2xlYW5pbmcgb3JwaGFuIGRldmljZXMuCisgIFdhaXQgZm9yIGNsaWVudCB0aHJlYWRzIHdoZW4gc2h1dHRpbmcgZG93biBsdm1ldGFkLgorICBSZW1vdmUgUFYgZnJvbSBjYWNoZSBvbiBwdnJlbW92ZS4KKyAgQXZvaWQgcmVwZWF0ZWRseSByZXBvcnRpbmcgb2YgZmFpbHVyZSB0byBjb25uZWN0IHRvIGx2bWV0YWQuCisgIEludHJvZHVjZSBNREFfRkFJTEVEIHRvIHBlcm1pdCBtZXRhZGF0YSB1cGRhdGVzIGV2ZW4gaWYgc29tZSBtZGFzIGFyZSBtaXNzaW5nLgorICBQcm9tcHQgd2hlbiBzZXR0aW5nIHRoZSBWRyBjbHVzdGVyIGF0dHIgaWYgdGhlIGNsdXN0ZXIgaXMgbm90IHNldHVwLgorICBBbGxvdyAtLXllcyB0byBza2lwIHByb21wdCBpbiB2Z2V4dGVuZCAod29ya2VkIG9ubHkgd2l0aCAtZikuCisgIERvbid0IHVzZSBuYW1lIG1hbmdsaW5nIGZvciBMVk0gLSBpdCBuZXZlciB1c2VzIGRtIG5hbWVzIHdpdGggd3JvbmcgY2hhciBzZXQuCisgIFJlbW92ZSBkZWZhdWx0LnByb2ZpbGUgYW5kIGFkZCB7Y29tbWFuZCxtZXRhZGF0YX1fcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlLgorICBVc2UgcHJvcGVyIHVtYXNrIGZvciBzeXN0ZW1kIHVuaXRzIGdlbmVyYXRlZCBieSBsdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLgorICBDaGVjayBmb3IgZmFpbGluZyBtaXJyb3JfcmVtb3ZlX21pc3NpbmcoKSBmdW5jdGlvbi4KKyAgUHJvbXB0IGJlZm9yZSBjb252ZXJ0aW5nIHZvbHVtZXMgdG8gdGhpbiBwb29sIGFuZCB0aGluIHBvb2wgbWV0YWRhdGEuCisgIEFkZCBkdW1wY29uZmlnIC0tdHlwZSBwcm9maWxhYmxlLXttZXRhZGF0YSxjb21tYW5kfSB0byBzZWxlY3QgcHJvZmlsZSB0eXBlLgorICBFeGl0IGltbWVkaWF0ZWx5IHdpdGggZXJyb3IgaWYgY29tbWFuZCBwcm9maWxlIGlzIGZvdW5kIGludmFsaWQuCisgIFNlcGFyYXRlIC0tcHJvZmlsZSBjbWQgbGluZSBhcmcgaW50byAtLWNvbW1hbmRwcm9maWxlIGFuZCAtLW1ldGFkYXRhcHJvZmlsZS4KKyAgU3RyaWN0bHkgc2VwYXJhdGUgY29tbWFuZCBwcm9maWxlcyBhbmQgcGVyLVZHL0xWIHByb2ZpbGVzIHJlZmVyZW5jZWQgaW4gbWRhLgorICBGaXggZHVtcGNvbmZpZyAtLXR5cGUgZGlmZiB3aGVuIHJ1biBhcyBzZWNvbmQgYW5kIGxhdGVyIGNtZCBpbiBsdm0gc2hlbGwuCisgIEZpeCB3cm9uZyBwcm9maWxlIHJldXNlIGZyb20gcHJldmlvdXMgcnVuIGlmIGFub3RoZXIgY21kIGlzIHJ1biBpbiBsdm0gc2hlbGwuCisgIE1vdmUgY2FjaGUgZGVzY3JpcHRpb24gZnJvbSBsdm0oOCkgdG8gbmV3IGx2bWNhY2hlKDcpIG1hbiBwYWdlLgorICBEaXNwbGF5IHNraXBwZWQgcHJvbXB0IGluIHNpbGVudCBtb2RlLgorICBNYWtlIHJlcG9ydGluZyBjb21tYW5kcyBzaG93IGhlbHAgYWJvdXQgcG9zc2libGUgc29ydCBrZXlzIG9uICctTyBoZWxwJy4KKyAgQWRkIG1ldGFkYXRhX3BlcmNlbnQgdG8gbHZzX2NvbHMuCisgIFRha2UgYWNjb3VudCBvZiBwYXJpdHkgYXJlYXMgd2l0aCBhbGxvYyBhbnl3aGVyZSBpbiBfY2FsY19yZXF1aXJlZF9leHRlbnRzLgorICBVc2UgcHJvcGVyIHVpbnQ2NCBjYXN0aW5nIGZvciBjYWxjdWxhdGlvbiBvZiBjYWNoZSBtZXRhZGF0YSBzaXplLgorICBCZXR0ZXIgc3VwcG9ydCBmb3IgbmVzdGluZyBvZiBibG9ja2luZyBzaWduYWxzLgorICBVc2Ugb25seSBzaWdhY3Rpb24gaGFuZGxlciBhbmQgZHJvcCBkdXBsaWNhdGUgc2lnbmFsIGhhbmRsZXIuCisgIFNlcGFyYXRlIHNpZ25hbCBoYW5kbGluZyBhbmQgZmxvY2sgY29kZSBvdXQgaW50byBsaWIvbWlzYy4KKyAgRG9uJ3Qgc3RhcnQgZG1ldmVudGQgY2hlY2tpbmcgc2VnX21vbml0b3IgYW5kIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQuCisgIENhdGNoIENUUkwtYyBkdXJpbmcgcHZyZW1vdmUgcHJvbXB0cy4KKyAgU2hvdyBjb3JyZWN0IGF2YWlsYWJpbGl0eSBzdGF0dXMgZm9yIHNuYXBzaG90IG9yaWdpbiBpbiBsdnNjYW4uCisgIE1vdmUgc2VnbWVudCB0aGluIHBvb2wvdm9sdW1lIGluZm8gaW50byBzZWdtZW50IGRpc3BsYXkgJ2x2ZGlzcGxheSAtLW1hcHMnLgorICBEaXNwbGF5IHRoaW4gcG9vbCB1c2FnZSBldmVuIHdoZW4ganVzdCB0aGluIHZvbHVtZSBpcyBhdmFpbGFibGUuCisgIERpc3BsYXkgbW9uaXRvcmluZyBzdGF0dXMgZm9yIG1vbml0b3JhYmxlIHNlZ21lbnRzIGluICdsdmRpc3BsYXkgLS1tYXBzJy4KKyAgRGlzcGxheSB2aXJ0dWFsIGV4dGVudHMgZm9yIHZpcnR1YWwgTFZzIGluICdsdmRpc3BsYXkgLS1tYXBzJy4KKyAgTWFrZSB2Z3NwbGl0IGZhaWwgY2xlYW5seSB3aGVuIG5vdCBhbGwgUFZzIGFyZSBzcGVjaWZpZWQgZm9yIFJBSUQgNC81LzYuCisgIE1ha2UgdmdzcGxpdCB3b3JrIG9uIG1pcnJvcnMgd2l0aCBsb2dzIHRoYXQgc2hhcmUgUFZzIHdpdGggaW1hZ2VzLgorICBVc2UgZGV2aWNlcy9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXM9MCBieSBkZWZhdWx0IGlmIG5vdCBkZWZpbmVkIGluIGx2bS5jb25mLgorICBVc2UgcHJvcGVyIGxpYm1lbSBtZW1wb29sIGZvciBhbGxvY2F0aW9uIG9mIHVua25vd24gc2VnbWVudCBuYW1lLgorICBBZGQgLS1yZWFkb25seSB0byByZXBvcnRpbmcgYW5kIGRpc3BsYXkgdG9vbHMgZm9yIGxvY2stZnJlZSBtZXRhZGF0YSBhY2Nlc3MuCisgIEFkZCBsb2NraW5nX3R5cGUgNSBmb3IgZHVtbXkgbG9ja2luZyBmb3IgdG9vbHMgdGhhdCBkbyBub3QgbmVlZCBhbnkgbG9ja3MuCisgIEZpeCBfcmVjb3Zlcl92ZygpIGVycm9yIHBhdGggd2hlbiBsb2NrIGNvbnZlcnNpb24gZmFpbHMuCisgIFVzZSBYIGZvciBMViBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVua25vd24gd2hlbiBhY3RpdmF0aW9uIGRpc2FibGVkLgorICBPbmx5IG91dHB1dCBsdmRpc3BsYXkgJ0xWIFN0YXR1cycgZmllbGQgd2hlbiBhY3RpdmF0aW9uIGlzIGVuYWJsZWQuCisgIFVzZSBsdm1ldGFkX3VzZWQoKSBpbiBwdnNjYW4gaW5zdGVhZCBvZiBjb25maWdfdHJlZS4KKyAgQ29uZmlndXJlIC0tZW5hYmxlLXVkZXYtc3lzdGVtZC1iYWNrZ3JvdW5kLWpvYnMgaWYgbm90IGRpc2FibGVkIGV4cGxpY2l0bHkuCisgIEFkZCBsdm1kdW1wIC1zIHRvIGNvbGxlY3Qgc3lzdGVtIGluZm8gYW5kIGNvbnRleHQgKGN1cnJlbnRseSBzeXN0ZW1kIG9ubHkpLgorICBSZWZhY3RvciBhbGxvY2F0aW9uIGNvZGUgdG8gbWFrZSBBX1BPU0lUSU9OQUxfRklMTCBleHBsaWNpdC4KKyAgVXNlIHRocmVhZC1zYWZlIGN0aW1lX3IoKSBmb3IgY2x2bWQgZGVidWcgbG9nZ2luZy4KKyAgU2tpcCBhZGRpbmcgcmVwbGllcyB0byBhbHJlYWR5IGZpbmlzaGVkIHJlcGx5IHRocmVhZC4KKyAgVXNlIG11dGV4IHRvIGNoZWNrIG51bWJlciBvZiByZXBsaWVzIGluIHJlcXVlc3RfdGltZWRfb3V0KCkgaW4gY2x2bWQuCisgIERyb3AgdXNhZ2Ugb2YgZXh0cmEgcmVwbHlfbXV0ZXggZm9yIGxvY2Fsc29jayBpbiBjbHZtZC4KKyAgUHJvdGVjdCBtYW5pcHVsYXRpb24gd2l0aCBmaW5pc2hlZCBmbGFnIHdpdGggbXV0ZXggaW4gY2x2bWQuIAorICBTaGlmdCBtdXRleCBjcmVhdGlvbiBhbmQgZGVzdHJveSBmb3IgbG9jYWxzb2NrIGluIGNsdm1kIHRvIGNvcnJlY3QgcGxhY2UuCisgIEZpeCB1c2FnZSBvZiAtLXRlc3Qgb3B0aW9uIGluIGNsdm1kLgorICBTa2lwIG1vcmUgbGlicmFyaWVzIHRvIGJlIG1sb2NrZWQgaW4gbWVtb3J5LgorICBSZW1vdmUgTE9DS0VEIGZsYWcgZm9yIHB2bW92ZSByZXBsYWNlZCB3aXRoIGVycm9yIHRhcmdldC4KKyAgUmV0dXJuIGludmFsaWQgY29tbWFuZCB3aGVuIHNwZWNpZnlpbmcgbmVnYXRpdmUgcG9sbGluZyBpbnRlcnZhbC4KKworVmVyc2lvbiAyLjAyLjEwNiAtIDEwdGggQXByaWwgMjAxNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggaWdub3JlZCAtLWRhdGFhbGlnbm1lbnQvZGF0YWFsaWdubWVudCBvZmZzZXQgZm9yIHB2Y3JlYXRlIC0tcmVzdG9yZWZpbGUuCisgIEZpeCBsb3N0IGluZm9ybWF0aW9uIGFib3V0IGJvb3Rsb2FkZXIgYXJlYSB3aGVuIHVzaW5nIGx2bWV0YWQuCisgIERvbid0IHJlcXVpcmUgLS1tYWpvciB0byBiZSBzcGVjaWZpZWQgd2hlbiB1c2luZyAtTXkgb3B0aW9uIG9uIGtlcm5lbHMgPiAyLjQuCisgIEFkZCBjb25maWd1cmUgLS1kaXNhYmxlLXRoaW5fY2hlY2tfbmVlZHNfY2hlY2sgdG8gc3VwcG9ydCBvbGQgdGhpbl9jaGVjay4KKyAgVXNlIHRoaW5fY2hlY2sgLS1jbGVhci1uZWVkcy1jaGVjay1mbGFnIGJ5IGRlZmF1bHQuCisgIEV4cG9ydCBsdm1fZXZlbl9yYW5kKCkgZm9yIGNvbnRyb2xsZWQgcHJvdmlzaW9uIG9mIHJhbmRvbSBudW1iZXJzLgorICBBZGQgbHZtdGhpbiBtYW4gcGFnZSB0byBzZWN0aW9uIDcuCisgIEVuc3VyZSBtYXBwZWQgZGV2aWNlIG5hbWVzIGFyZSBub3QgdG9vIGxvbmcgaW4gdmdfdmFsaWRhdGUgYW5kIGx2cmVuYW1lLgorICBFbnN1cmUgcmVzdW1lIGZhaWx1cmUgaW4gbHZyZW5hbWUgcmVzdWx0cyBpbiBjb21tYW5kIGZhaWx1cmUuCisgIEFkZCBleHBsaWNpdCBlcnJvciBtZXNzYWdlIHdoZW4gdXNpbmcgbHZkaXNwbGF5IC1jIC1tLgorICBSZXBvcnQgZXJyb3IgaWYgc3VwZXJmbHVvdXMgYXJndW1lbnQgKGUuZy4gUFYgbmFtZSkgc3VwcGxpZWQgdG8gcHZzY2FuLgorICBGaXggZXJyb3IgbWVzc2FnZSBmb3IgcHZkaXNwbGF5IC1jIC1tIGFuZCBhZGQgb25lIGZvciBwdmRpc3BsYXkgLWMgLXMuCisgIFVzZSBFSU5WQUxJRF9DTURfTElORSBjb3JyZWN0bHkgaW5zdGVhZCBvZiBFQ01EX0ZBSUxFRCBpbiB2Z2ltcG9ydC9leHBvcnQuCisgIE9idGFpbiBsaXN0IG9mIGtub3duIFZHcyBmcm9tIGx2bWV0YWQgZm9yIHB2Y2hhbmdlIC0tYWxsLgorICBBZGQgbWFuIHBhZ2UgZm9yIGx2bS1kdW1wY29uZmlnIHRvIHNlY3Rpb24gOC4KKyAgRHJvcCB1bnVzZWQgY21kIHBvaW50ZXIgZm9yIGludGVybmFsIGZ1bmN0aW9uIGZvcl9lYWNoX3N1Yl9sdigpLgorICBWYWxpZGF0ZSBuYW1lIGZvciByZW5hbWVkIHN1YiBMVnMuCisgIFdoZW4gbHZyZW5hbWUgZmFpbHMgb24gYXJndW1lbnQgcGFyc2luZyByZXR1cm4gRUlOVkFMSURfQ01EX0xJTkUuCisgIEZpeCBleGl0IGNvZGUgcmVncmVzc2lvbiBpbiBmYWlsaW5nIHB2Y2hhbmdlIGNvbW1hbmQgKDIuMDIuNjYpLgorICBJbmNsdWRlICdsdm0gZHVtcGNvbmZpZyAtLXR5cGUgbWlzc2luZycgYW5kICctLXR5cGUgZGlmZicgb3V0cHV0IHRvIGx2bWR1bXAuCisgIFJldHVybiBmYWlsdXJlIHdoZW4gc3BlY2lmeWluZyBuZWdhdGl2ZSBzaXplIGZvciBwdnJlc2l6ZS4KKyAgRml4IG1lbW9yeSBjb3JydXB0aW9uIGluIGNtZCBjb250ZXh0IHJlZnJlc2ggaWYgY2x2bWQgbGVha3Mgb3BlbmVkIGRldmljZS4KKyAgUmVpbml0aWFsaXNlIGx2bWNhY2hlIHByb3Blcmx5IG9uIGZvcmsgdG8gZml4IHByZW1hdHVyZSBwb2xsZGFlbW9uIGV4aXQuCisgIEFkZCAnbHZtIGR1bXBjb25maWcgLS10eXBlIGRpZmYnIHRvIHNob3cgZGlmZmVyZW5jZXMgZnJvbSBkZWZhdWx0cy4KKyAgRml4IHN3YXAgc2lnbmF0dXJlIGRldGVjdGlvbiBmb3IgZGV2aWNlcyBzbWFsbGVyIHRoZW4gMk1CLgorICBVc2UgZG1fbWFsbG9jIGZ1bmN0aW9uIGluIGNsdm1kLmMuCisgIFJlc29sdmUgbWVtb3J5IHJlbGVhc2Ugb3JkZXIgZm9yIGNsdm1kIHNodXRkb3duLgorICBSZXBvcnQgZXJyb3Igd2hlbiBsdm0yIGFjdGl2YXRpb24gaXMgcmVsZWFzZWQgaW4gY3JpdGljYWxfc2VjdGlvbi4KKyAgRml4IG1lbW9yeSBjb3JydXB0aW9uIHdoZW4gcHZzY2FuIHJlcG9ydHMgbG9uZyBwdiBuYW1lcy4KKyAgRG8gbm90IHJlcG9ydCBpbnRlcm5hbCBvcnBoYW4gVkcgbmFtZXMgd2hlbiByZXBvcnRpbmcgcHZkaXNwbGF5L3B2c2Nhbi4KKyAgRml4IHB2ZGlzcGxheSAtYyBtYW4gcGFnZSByZWZlcmVuY2luZyBLQiBpbnN0ZWFkIG9mIHNlY3RvcnMuCisgIFNraXAgcmVkdW5kYW50IHN5bmNocm9uaXphdGlvbiBjYWxscyBvbiBsb2NhbCBjbHZtZC4KKyAgVXNlIGNvcnJlY3QgUEFUSF9NQVggZm9yIGxvY2tpbmcgZGlyIHBhdGguCisgIERvIG5vdCBjaGVjayBmb3IgYmFja3VwcyB3aGVuIHdoZW4gaXRzIGNyZWF0aW9uIGlzIGRpc2FibGVkLgorICBEb24ndCBhbGxvdyAtLW1lcmdlZGNvbmZpZyB3aXRob3V0IC0tdHlwZSBjdXJyZW50IGluIGR1bXBjb25maWcuIEZpeCBtZW1sZWFrLgorICBNYWtlIGdsb2JhbC9sdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aCBsdm0uY29uZiBzZXR0aW5nIHByb2ZpbGFibGUuCisgIE1ha2UgZ2xvYmFsL3t1bml0c3xzaV91bml0X2NvbnNpc3RlbmN5fHN1ZmZpeH0gbHZtLmNvbmYgc2V0dGluZyBwcm9maWxhYmxlLgorICBWYWxpZGF0ZSBtaW5pbWFsIGNodW5rIHNpemUgZm9yIHNuYXBzaG90IENPVyB2b2x1bWUgaW4gbHZjb252ZXJ0LgorICBEaXNhbGxvdyBsdmNvbnZlcnQgb2Ygb3JpZ2luIHRvIHNuYXBzaG90IENPVyB2b2x1bWUuCisgIE1ha2UgcmVwb3J0IGx2bS5jb25mIHNldHRpbmdzIHByb2ZpbGFibGUuCisgIEFkZCBleGlzdGluZyByZXBvcnQgc2V0dGluZ3MgdG8gbHZtLmNvbmYuCisgIFVzZSBWRyByZWFkIGxvY2sgZHVyaW5nICdwdnNjYW4gLS1jYWNoZSAtYWF5JyBhdXRvYWN0aXZhdGlvbi4KKyAgSXNzdWUgYSBWRyByZWZyZXNoIGJlZm9yZSBhdXRvYWN0aXZhdGlvbiBvbmx5IGlmIHRoZSBQViBoYXMgY2hhbmdlZC9pcyBuZXcuCisgIEFkZCBmbGFnIHRvIGx2bWV0YWQgcHJvdG9jb2wgdG8gaW5kaWNhdGUgdGhlIFBWIHNjYW5uZWQgaGFzIGNoYW5nZWQvaXMgbmV3LgorICBBbHNvIGFkZCB2Z25hbWUgdG8gbHZtZXRhZCBwcm90b2NvbCB3aGVuIHJlZmVyZW5jaW5nIFZHcyBmb3IgUFZzIHNjYW5uZWQuCisgIEFkZCBtYW4gcGFnZSBmb3IgbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvci4KKyAgRG9uJ3QgcHJpbnQgYW4gZXJyb3IgYW5kIGFjY2VwdCBlbXB0eSB2YWx1ZSBmb3IgZ2xvYmFsL3RoaW5fZGlzYWJsZWRfZmVhdHVyZXMuCisgIFVwZGF0ZSBBUEkgZm9yIGludGVybmFsIGZ1bmN0aW9uIGJ1aWxkX2RtX3V1aWQoKS4KKyAgRG8gbm90IHRyeSB0byBjaGVjayBlbXB0eSBwb29sIHdpdGggc2NoZWR1bGVkIG1lc3NhZ2VzLgorICBGaXggcmV0dXJuIHZhbHVlIGluIHBvb2xfaGFzX21lc3NhZ2UoKSB3aGVuIHF1ZXJpbmcgZm9yIGFueSBtZXNzYWdlLgorICBDbGVhbnVwIGFsbCBjbGllbnQgcmVzb3VyY2VzIG9uIGNsdm1kIGV4aXQuCisgIFVzZSBkbV96YWxsb2MgdG8gY2xlYXIgbWVtYmVycyBvZiBjbHZtZCBjbGllbnQgc3RydWN0LgorICBVc2UgQkxLSURfQ0ZMQUdTIHdoZW4gY29tcGlsaW5nIHdpdGggYmxraWQgc3VwcG9ydC4KKyAgVXNlIGNvcnJlY3QgcmxfY29tcGxldGlvbl9mdW5jX3QgdHlwZWRlZiBmb3IgbmV3IHJlYWRsaW5lLgorICBNYWtlIGx2bSAnZHVtcGNvbmZpZyAtLXR5cGUgZGVmYXVsdCcgY29tcGxldGUgZm9yIGl0IHRvIGJlIGNvbnN1bWVkIGJ5IGx2bS4KKyAgUnVuIHB2c2NhbiAtLWNhY2hlIHZpYSBzeXN0ZW1kLXJ1biBpbiB1ZGV2IGlmIHRoZSBQViBsYWJlbCBpcyBkZXRlY3RlZCBsb3N0LgorICBGaXggbWVtbGVhayB3aGVuIGx2bWV0YWQgZGlzY292ZXJzIFBWIHRvIGFwcGVhciBvbiBhbm90aGVyIGRldmljZS4KKyAgRml4IGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc2l6ZSBvZiBDT1cgZGV2aWNlIGZvciBzbmFwc2hvdCAoMi4wMi45OSkuCisgIERvIG5vdCBhbGxvdyBzdHJpcGUgc2l6ZSB0byBiZSBiaWdnZXIgdGhlbiBleHRlbnQgc2l6ZSBmb3IgbHZyZXNpemUuCisgIFplcm8gc25hcHNob3QgQ09XIGhlYWRlciB3aGVuIGNyZWF0aW5nIHJlYWQtb25seSBzbmFwc2hvdC4KKyAgQ29tbWVudCBvdXQgY29uZmlnIGxpbmVzIGluIGR1bXBjb25maWcgb3V0cHV0IHdpdGhvdXQgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZC4KKyAgSW1wcm92ZSBkZXRlY3Rpb24gb2YgY2x1c3RlcmVkIG1pcnJvciBzdXBwb3J0LgorICBFbmhhbmNlIHJhaWQgY29kZSB3aXRoIGZlYXR1cmUgZmxhZ3MsIGZvciBub3cgY2hlY2tzIGZvciByYWlkMTAuCisgIE1vdmUgcGFyc2luZyBvZiBWRyBtZXRhZGF0YSBmcm9tIHZnX2NvbW1pdCgpIGJhY2sgdG8gdmdfd3JpdGUoKSAoMi4wMi45OSkKKyAgQXZvaWQgYSBQViBsYWJlbCBzY2FuIHdoaWxlIGluIGEgY3JpdGljYWwgc2VjdGlvbi4KKyAgUmVtb3ZlIChhbHdheXMgMCkgc2tpcCBhcmd1bWVudCBmcm9tIGx2X2FjdGl2YXRpb25fc2tpcCgpLgorICBDcmVhdGUgL2Rldi9kaXNrL2J5LWlkL2x2bS1wdi11dWlkLTxQVl9VVUlEPiBzeW1saW5rIGZvciBlYWNoIFBWIHZpYSB1ZGV2LgorICBsdmNyZWF0ZSBjb21wdXRlcyBSQUlENC81LzYgc3RyaXBlcyBpZiBub3QgZ2l2ZW4gZnJvbSAjIG9mIGFsbG9jYXRhYmxlIFBWcy4KKyAgRml4IG1lcmdpbmcgb2Ygb2xkIHNuYXBzaG90IGludG8gdGhpbiB2b2x1bWUgb3JpZ2luLgorICBVc2UgLS1pZ25vcmVza2lwcGVkY2x1c3RlciBpbiBsdm0yLW1vbml0b3IgaW5pdHNjcmlwdC9zeXN0ZW1kIHVuaXQuCisgIERvIG5vdCB1c2UgVkcgcmVhZC93cml0ZSBzdGF0ZSBmb3IgTFYgcmVhZC93cml0ZSBzdGF0ZS4KKyAgVXNlIC0taWdub3Jlc2tpcHBlZGNsdXN0ZXIgaW4gYWN0aXZhdGlvbiBzeXN0ZW1kIHVuaXRzIGlmIHVzZV9sdm1ldGFkPTAuCisgIEFsbG93IGFwcHJveGltYXRlIGFsbG9jYXRpb24gd2hlbiBzcGVjaWZ5aW5nIHNpemUgaW4gcGVyY2VudGFnZSB0ZXJtcy4KKyAgQWRkIGJhc2ljIExWTSBzdXBwb3J0IGZvciBjYWNoZVtwb29sXSBzZWdtZW50IHR5cGVzLgorICBVc2UgbG9jYWwgZXhjbHVzaXZlIGFjdGl2YXRpb24gZm9yIGNyZWF0aW9uIG9mIHJhaWQgaW4gY2x1c3Rlci4KKyAgVXNlIGNvcnJlY3RseSBzaWduZWQgNjRiIGNvbnN0YW50IHdoZW4gc2VsZWN0aW5nIHJhaWQgdm9sdW1lcy4KKyAgQWRkIHN5c3RlbWQgbmF0aXZlIHNlcnZpY2UgZm9yIGNsdm1kLCBjbWlycm9yZCBhbmQgY2x1c3RlcmVkIExWIGFjdGl2YXRpb24uCisgIFJlbW92ZSBFeGVjUmVsb2FkIGZyb20gbHZtZXRhZCBzeXN0ZW1kIHVuaXQ6IGx2bWV0YWQgLVIgdW5kZWZpbmVkLiAoMi4wMi45OCkKKyAgRG8gbm90IGZvcmsgbHZtZXRhZCBpZiBydW5uaW5nIHVuZGVyIHN5c3RlbWQuCisgIFdpcGUgRE1fc25hcHNob3RfY293IHNpZ25hdHVyZSB3aXRob3V0IHByb21wdCBpbiBuZXcgTFZzIHdpdGggYmxraWQgd2lwaW5nLgorICBBdm9pZCBleHBvc2luZyB0ZW1wb3JhcnkgZGV2aWNlcyB3aGVuIGluaXRpYWxpemluZyByYWlkIG1ldGFkYXRhIHZvbHVtZXMuCisgIEFkZCBpbnRlcm5hbCB0YWdzIGNvbW1hbmQgdG8gZGlzcGxheSBhbnkgdGFncyBkZWZpbmVkIG9uIHRoZSBob3N0LgorICBQcm9oaWJpdCB1c2Ugb2YgZXh0ZXJuYWwgb3JpZ2luIHdpdGggc2l6ZSBpbmNvbXBhdGlibGUgd2l0aCB0aGluIHBvb2wuCisgIEF2b2lkIHRyeWluZyB0byBjb252ZXJ0IHNpbmdsZSB0byB0aGluIHBvb2wgYW5kIHZvbHVtZSBhdCB0aGUgc2FtZSB0aW1lLgorICBBZGQgc3VwcG9ydCBmb3IgcGFydGl0aW9ucyBvbiBaRlMgenZvbC4KKyAgRml4IHVud2FudGVkIGRyb3Agb2YgaG9sZCBmbG9ja3Mgb24gZm9ya2VkIGNoaWxkcmVuLgorICBSZXNwZWN0IExWTV9MVk1FVEFEX1BJREZJTEUgZW52IHZhciBmb3IgbHZtIGNvbW1hbmQuCisgIEF2b2lkIGV4cG9zaW5nIHRlbXBvcmFyeSBkZXZpY2VzIHdoZW4gaW5pdGlhbGl6aW5nIHRoaW4gcG9vbCB2b2x1bWUuCisgIEZpeCB0ZXN0IHdoZW4gY2hlY2tpbmcgdGFyZ2V0IHZlcnNpb24gZm9yIGF2YWlsYWJsZSB0aGluIGZlYXR1cmVzLgorICBEZXRlY3QgdGhpbiBmZWF0dXJlIGV4dGVybmFsX29yaWdpbl9leHRlbmQgYW5kIGxpbWl0IGV4dGVuZCB3aGVuIG1pc3NpbmcuCisgIFJlbmFtZSBpbnRlcm5hbCBwb29sX2Nhbl9yZXNpemVfbWV0YWRhdGEoKSB0byB0aGluX3Bvb2xfZmVhdHVyZV9zdXBwb3J0ZWQoKS4KKyAgSXNzdWUgZXJyb3IgaWYgbGliYmJsa2lkIGRldGVjdHMgc2lnbmF0dXJlIGFuZCBmYWlscyB0byByZXR1cm4gb2Zmc2V0L2xlbmd0aC4KKyAgVXBkYXRlIGF1dG9jb25mIGNvbmZpZy5ndWVzcy9zdWIgdG8gMjAxNC0wMS0wMS4KKyAgT25saW5lIHRoaW4gcG9vbCBtZXRhZGF0YSByZXNpemUgcmVxdWlyZXMgMS4xMCBrZXJuZWwgdGhpbiBwb29sIHRhcmdldC4KKworVmVyc2lvbiAyLjAyLjEwNSAtIDIwdGggSmFudWFyeSAyMDE0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHRoaW4gTFYgZmxhZ2dpbmcgZm9yIHVkZXYgdG8gc2tpcCBzY2FubmluZyBvbmx5IGlmIHRoZSBMViBpcyB3aXBlZC4KKyAgUmVwbGFjZSB1c2Ugb2YgeGZzX2NoZWNrIHdpdGggeGZzX3JlcGFpciBpbiBmc2FkbS4gCisgIE1hcmsgbHZtMSBmb3JtYXQgbWV0YWRhdGEgYXMgRk1UX09CU09MRVRFLiBEbyBub3QgdXNlIGl0IHdpdGggbHZtZXRhZC4KKyAgSW52YWxpZGF0ZSBjYWNoZWQgVkcgc3RydWN0IGFmdGVyIGEgUFYgaW4gaXQgZ2V0cyBvcnBoYW5lZC4gKDIuMDIuODcpCisgIE1hcmsgcG9vbCBmb3JtYXQgbWV0YWRhdGEgYXMgRk1UX09CU09MRVRFLgorICBVc2UgbWFqb3I6bWlub3IgaW4gbHZtMi1wdnNjYW5ALnNlcnZpY2UgZm9yIHByb3BlciBnbG9iYWxfZmlsdGVyIGFwcGxpY2F0aW9uLgorICBTeW50YXggYW5kIHNwZWxsaW5nIGZpeGVzIGluIHNvbWUgbWFuIHBhZ2VzLgorICBEZXBlbmRlbmN5IHNjYW4gY291bnRzIHdpdGggc25hcHNob3RzIGFuZCBleHRlcm5hbCBvcmlnaW5zLgorICBNYWtlIHN1cmUgVkcgZXh0ZW50IHNpemUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gUFYgcGh5cy4gYmxvY2sgc2l6ZS4KKyAgT3B0aW1pemUgZG91YmxlIGNhbGwgb2Ygc3RhdCgpIGZvciBjYWNoZWQgZGV2aWNlcy4KKyAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoaW4gcHJvdmlzaW9uaW5nIGZvciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgIEltcHJvdmUgcHJvY2Vzc19lYWNoX2x2X2luX3ZnKCkgdGFnIHByb2Nlc3NpbmcuCisgIFJlb3JkZXJlZCBhbmQgc2ltcGxpZmllZCBsb2dnaW5nIGNvZGUuCisgIEZpeCBTWVNURU1EX1JFQURZIGFzc2lnbm1lbnQgZm9yIGZvcmVpZ24gZGV2aWNlcyBpbiBsdm1ldGFkIHVkZXYgcnVsZXMuCisgIERpc2FibGUgb25saW5lIHRoaW4gcG9vbCBtZXRhZGF0YSByZXNpemUgZm9yIDEuOSBrZXJuZWwgdGhpbiB0YXJnZXQuCisgIFNob3J0ZW5lZCBjb2RlIGZvciBpbml0aWFsaXphdGlvbiBvZiByYWlkIHNlZ21lbnQgdHlwZXMuCisgIENhY2hlIGdsb2JhbCBsaWJyYXJ5IGRpciBpbiBjb21tYW5kIGNvbnRleHQuCisgIFJldHVybiBzdWNjZXNzIHdoZW4gaW5zZXJ0aW5nIGRpcnMgYW5kIGxpbmtzIGludG8gZGV2aWNlIGNhY2hlLgorICBUZXN0IGZvciByZW1vdGUgZXhjbHVzaXZlIGFjdGl2YXRpb24gYWZ0ZXIgYWN0aXZhdGlvbiBmYWlscy4KKyAgU3VwcG9ydCBsdmNvbnZlcnQgLS1tZXJnZSBmb3IgdGhpbiBzbmFwc2hvdHMuCisgIEFkZCBzdXBwb3J0IHRvIHJlYWQgdGhpbiBkZXZpY2UgaWQgZnJvbSB0YWJsZSBsaW5lIGVudHJ5LgorICBEcm9wIGV4dHJhIHRlc3QgZm9yIG9yaWdpbiB3aGVuIHRlc3RpbmcgbWVyZ2luZyBvcmlnaW4gaW4gbHZfcmVmcmVzaCgpLgorICBFeHRlbmQgbHZfcmVtb3ZlX3NpbmdsZSgpIHRvIG5vdCBwcmludCBpbmZvIGFib3V0IHJlbW92ZWQgTFYuCisgIFJlcGxhY2Ugb3Blbl9jb3VudCBjaGVjayB3aXRoIGx2X2NoZWNrX25vdF9pbl91c2UoKSBmb3Igc25hcHNob3Qgb3BlbiB0ZXN0LgorICBBZGQgZXJyb3IgbWVzc2FnZXMgd2l0aCBMViBuYW1lcyBmb3IgZmFpbGluZyBsdiByZWZyZXNoLgorICBDb21waWxlL2xpbmsgZXhlY3V0YWJsZXMgd2l0aCBuZXcgUkVMUk8gYW5kIFBJRSBvcHRpb25zIChub24tc3RhdGljIGJ1aWxkcykuCisgIFN1cHBvcnQgcGVyLW9iamVjdCBjb21waWxhdGlvbiBjZmxhZ3MgdmlhIENGTEFHU19vYmplY3Quby4KKyAgQXV0b21hdGljYWxseSBkZXRlY3Qgc3VwcG9ydCBmb3IgY29tcGlsZXIvbGlua2VyIG9wdGlvbnMgdG8gdXNlIFJFTFJPIGFuZCBQSUUuCisgIEFkZCAtLXNwbGl0c25hcHNob3QgdG8gbHZjb252ZXJ0IHRvIHNlcGFyYXRlIG91dCBjb3cgTFYuCisgIFJlaW5zdGF0ZSBvcmlnaW4gcmVsb2FkIHRvIGNvbXBsZXRlIGx2Y29udmVydCAtcyB3aXRoIGFjdGl2ZSBMVnMuICgyLjAyLjk4KQorICBTZWxlY3Qgb25seSBhY3RpdmUgdm9sdW1lIGdyb3VwcyBpZiB2Z2Rpc3BsYXkgLUEgaXMgdXNlZC4KKyAgQWRkIC1wIGFuZCBMVk1fTFZNRVRBRF9QSURGSUxFIGVudiB2YXIgdG8gbHZtZXRhZCB0byBjaGFuZ2UgcGlkIGZpbGUuCisgIEFsbG93IGx2bWV0YWQgdG8gcmV1c2Ugc3RhbGUgc29ja2V0LgorICBPbmx5IHVubGluayBsdm1ldGFkIHNvY2tldCBvbiBlcnJvciBpZiBjcmVhdGVkIGJ5IHRoZSBzYW1lIHByb2Nlc3MuCisgIEFwcGVuZCBtaXNzaW5nIG5ld2xpbmUgdG8gbHZtZXRhZCBtaXNzaW5nIHNvY2tldCBwYXRoIGVycm9yIG1lc3NhZ2UuCisgIENoZWNrIGZvciBub24temVybyBhbGlnbWVudCBpbiBfdGV4dF9wdl9hZGRfbWV0YWRhdGFfYXJlYSgpIHRvIG5vdCBkaXYgYnkgMC4KKyAgQWRkIGFsbG9jYXRpb24vdXNlX2Jsa2lkX3dpcGluZyB0byBsdm0uY29uZiB0byBlbmFibGUgYmxraWQgd2lwaW5nLgorICBFbmFibGUgYmxraWRfd2lwaW5nIGJ5IGRlZmF1bHQgaWYgdGhlIGJsa2lkIGxpYnJhcnkgaXMgcHJlc2VudC4KKyAgQWRkIGNvbmZpZ3VyZSAtLWRpc2FibGUtYmxraWRfd2lwaW5nIHRvIGRpc2FibGUgbGliYmxraWQgc2lnbmF0dXJlIGRldGVjdGlvbi4KKyAgQWRkIC1XLy0td2lwZXNpZ25hdHVyZXMgbHZjcmVhdGUgb3B0aW9uIHRvIHN1cHBvcnQgd2lwaW5nIG9uIG5ldyBMVnMuCisgIEFkZCBhbGxvY2F0aW9uL3dpcGVfc2lnbmF0dXJlc193aGVuX3plcm9pbmdfbmV3X2x2cyB0byBsdm0uY29uZi4KKyAgRG8gbm90IGZhaWwgdGhlIHdob2xlIGF1dG9hY3RpdmF0aW9uIGlmIHRoZSBWRyByZWZyZXNoIGRvbmUgYmVmb3JlIGZhaWxzLgorICBEbyBub3QgY29ubmVjdCB0byBsdm1ldGFkIG9uIHZnL2x2Y2hhbmdlIC0tc3lzaW5pdCAtYWF5IGFuZCBzb2NrZXQgYWJzZW50LgorICBVc2UgbHZfY2hlY2tfbm90X2luX3VzZSgpIHdoZW4gdGVzdGluZyBkZXZpY2UgaW4gdXNlIGJlZm9yZSBtZXJnaW5nLgorICBNb3ZlIHRlc3QgZm9yIHRhcmdldCBwcmVzZW50IGZyb20gaW5pdF9zbmFwc2hvdF9tZXJnZSgpIHRvIGx2Y29udmVydC4KKyAgQ2hlY2sgZm9yIGZhaWx1cmUgb2YgbHZtY2FjaGVfYWRkX21kYSgpIHdoZW4gd3JpdGluZyBwdi4KKyAgQ2hlY2sgZm9yIGZhaWx1cmUgb2YgZGV2X2dldF9zaXplKCkgd2hlbiByZXBvcnRpbmcgZGV2aWNlIHNpemUuCisgIERyb3AgZXh0cmEgdW5uZWVkZWQgJy8nIHdoZW4gc2Nhbm5pbmcgc3lzZnMgZGlyZWN0b3J5LgorICBGaXggdW5kZWYgdmFsdWUgaWYgc2tpcHBlZCBjbHVzdGVyZWQgVkcgaWdub3JlZCBmb3IgdG9vbGxpYiBQViBzZWcuICgyLjAyLjEwMykKKyAgU3VwcG9ydCB2YWxpZGF0aW9uIG9mIFZHL0xWIG5hbWVzIGluIGxpYmx2bS9weXRob24uCisgIEFsbG93IGNyZWF0aW9uIG9mIFBWcyB3aXRoIGFyZ3VtZW50cyB0byBsaWJsdm0vcHl0aG9uLgorICBFbnN1cmUgc3VmZmljaWVudCBtZXRhZGF0YSBjb3BpZXMgcmV0YWluZWQgaW4gbGlibHZtL3B5dGhvbiB2Z3JlZHVjZS4KKyAgRml4IGluc3RhbGxhdGlvbiBvZiBwcm9maWxlcyBmcm9tIGNvbmYgc3ViZGlyIHdoZW4gbm90IGJ1aWxkaW5nIGluIHNyY2Rpci4KKyAgU2hvdyBVVUlEcyBmb3IgbWlzc2luZyBQVnMgaW4gcmVwb3J0cy4KKyAgQ2hhbmdlIGRldl9zaXplL25hbWUsIHB2X2ZtdC9tZGFfZnJlZS9tZGFfc2l6ZS91dWlkIGZpZWxkcyBmcm9tIHB2IHRvIGxhYmVsLgorICBBZGQgc3RydWN0IGRldmljZSAqZGV2IHRvIHN0cnVjdCBsYWJlbC4KKyAgSW50cm9kdWNlIHByb2Nlc3NfZWFjaF9sYWJlbC4KKyAgQ2hhbmdlIHZvaWQgKnByaXZhdGUgdG8gc3RydWN0IGZvcm1hdF90eXBlICpmbXQgaW4gc3RydWN0IGxhYmVsbGVyLgorICBSZW1vdmUgcHZfcmVhZC4KKyAgQWRkIHJlcG9ydGluZyBvZiB0aGluX2lkIGRldmljZSBpZCBmb3IgdGhpbiB2b2x1bWVzLgorICBGaXggcmVwb3J0aW5nIG9mIGVtcHR5IG51bWVyaWNhbCB2YWx1ZXMgZm9yIHJlY2VudGx5LWFkZGVkIGZpZWxkcy4KKyAgVXNlIF9maWVsZF9zZXRfcGVyY2VudC92YWx1ZSBpbiByZXBvcnRpbmcgY29kZS4KKworVmVyc2lvbiAyLjAyLjEwNCAtIDEzdGggTm92ZW1iZXIgMjAxMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBXb3JrYXJvdW5kIFZHIHJlZnJlc2ggcmFjZSBkdXJpbmcgYXV0b2FjdGl2YXRpb24gYnkgcmV0cnlpbmcgdGhlIHJlZnJlc2guCisgIEhhbmRsZSBmYWlsdXJlcyBpbiB0ZW1wb3JhcnkgbWlycm9yIHVzZWQgd2hlbiBhZGRpbmcgaW1hZ2VzIHRvIG1pcnJvcnMuCisgIEZpeCBhbmQgaW1wcm92ZSBsb2dpYyBmb3IgaW1wbGljaXRlbHkgZXhjbHVzaXZlIGFjdGl2YXRpb25zLgorICBSZXR1cm4gc3VjY2VzcyB3aGVuIExWIGNhbm5vdCBiZSBhY3RpdmF0ZWQgYmVjYXVzZSBvZiB2b2x1bWVfbGlzdCBmaWx0ZXIuCisgIFJldHVybiBwcm9wZXIgZXJyb3Igc3RhdGUgZm9yIHJlbW90ZSBleGNsdXNpdmUgYWN0aXZhdGlvbi4KKyAgRml4IG1pc3NpbmcgbHZtZXRhZCBzY2FuIGZvciBQVnMgZm91bmQgb24gTUQgcGFydGl0aW9ucy4KKyAgUmVzcGVjdCBETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBRyBpbiBsdm1ldGFkIHVkZXYgcnVsZXMuCisgIEZpeCBjbHZtZCBtZXNzYWdlIHZlcmlmaWNhdGlvbiB0byBub3QgcmVqZWN0IFJFTU9URSBmbGFnLiAoMi4wMi4xMDApCisgIENvbXBhcmUgZXF1YWxpdHkgb2YgZG91YmxlIHZhbHVlcyB3aXRoIERCTF9FUFNJTE9OIHByZWRlZmluZWQgY29uc3RhbnQuCisgIFVzZSBhZGRpdGlvbmFsIGdjYyB3YXJuaW5nIGZsYWdzIGJ5IGRlZmF1bHQuCisgIEFkZCBpZ25vcmVfbHZtX21pcnJvcnMgdG8gY29uZmlnIGZpbGUgdG8gcmVhZC9pZ25vcmUgbGFiZWxzIG9uIG1pcnJvcnMuCisgIEFkZCBpbnRlcm5hbCBmbGFnIGZvciB0ZW1wb3JhcnkgTFZzIHRvIHByb3Blcmx5IGRpcmVjdCB1ZGV2IHRvIG5vdCBpbnRlcmZlcmUuCisgIEZpeCBlbmRsZXNzIGxvb3AgaW4gYmxrZGVhY3RpdmF0ZSA8ZGV2aWNlPi4uLiBpZiB1bmFibGUgdG8gdW1vdW50L2RlYWN0aXZhdGUuCisgIEFkZCBkZXYtYmxvY2stPG1ham9yPjo8bWlub3I+LmRldmljZSBzeXN0ZW1kIGFsaWFzIGZvciBjb21wbGV0ZSBQViB0cmFja2luZy4KKyAgVXNlIG1ham9yOm1pbm9yIGFzIHNob3J0IGZvcm0gb2YgLS1tYWpvciBhbmQgLS1taW5vciBhcmcgZm9yIHB2c2NhbiAtLWNhY2hlLgorICBSZW1vdmUgMj4vZGV2L251bGwgZnJvbSB0aHJlZSBsdm0gY29tbWFuZHMgZXhlY3V0ZWQgYnkgdmdpbXBvcnRjbG9uZS4KKyAgQWRkIGNvbmZpZ3VyZSAtLWVuYWJsZS11ZGV2LXN5c3RlbWQtYmFja2dyb3VuZC1qb2JzLgorICBBZGQgbHZtMi1wdnNjYW5ALnNlcnZpY2UgdG8gcnVuIHB2c2NhbiBhcyBhIHNlcnZpY2UgZm9yIGx2bWV0YWQvYXV0b2FjdGl2YXRpb24uCisgIFVzZSAjaWZkZWYgX19saW51eF9fIGluc3RlYWQgb2YgbGludXggdGhyb3VnaG91dC4KKyAgRml4IGx2Y29udmVydCBzd2FwIG9mIHBvb2xtZXRhZGF0YSB2b2x1bWUgZm9yIGFjdGl2ZSB0aGluIHBvb2wuCisgIENoZWNrIGZvciBvcGVuIGNvdW50IHdpdGggYSB0aW1lb3V0IGJlZm9yZSByZW1vdmFsL2RlYWN0aXZhdGlvbiBvZiBhbiBMVi4KKyAgUmVwb3J0IFJBSUQgaW1hZ2VzIHNwbGl0IHdpdGggdHJhY2tpbmcgYXMgb3V0LW9mLXN5bmMgKCJJIikuCisgIEltcHJvdmUgcGFyc2luZyBvZiBzbmFwc2hvdCBsdiBzZWdtZW50LgorICBBZGQgd29ya2Fyb3VuZCBmb3IgZGVhY3RpdmF0aW9uIHByb2JsZW0gb2Ygb3BlbmVkIHZpcnR1YWwgc25hcHNob3QuCisgIERpc2FibGUgdW5zdXBwb3J0ZWQgbWVyZ2UgZm9yIHZpcnR1YWwgc25hcHNob3QuCisgIE1vdmUgY29kZSB0byByZW1vdmUgdmlydHVhbCBzbmFwc2hvdCBmcm9tIHRvb2xzIHRvIGxpYiBmb3IgbHZtMmFwcC4KKyAgRml4IHBvc3NpYmxlIHJhY2UgZHVyaW5nIGRhZW1vbiB3b3JrZXIgdGhyZWFkIGNyZWF0aW9uIChsdm1ldGFkKS4KKyAgRml4IHBvc3NpYmxlIGRlYWRsb2NrIHdoaWxlIGNsZWFyaW5nIGx2bWV0YWQgY2FjaGUgZm9yIGZ1bGwgcmVzY2FuLgorICBSZWNvZ25pc2UgTlZNIEV4cHJlc3MgZGV2aWNlcyBpbiBmaWx0ZXIuCisgIEZpeCBmYWlsaW5nIG1ldGFkYXRhIHJlcGFpciB3aGVuIGx2bWV0YWQgaXMgdXNlZC4KKyAgRml4IGluY29ycmVjdCBtZW1vcnkgaGFuZGxpbmcgd2hlbiByZWFkaW5nIG1lc3NhZ2VzIGZyb20gbHZtZXRhZC4KKyAgRml4IGxvY2tpbmcgaW4gbHZtZXRhZCB3aGVuIGhhbmRsaW5nIHRoZSBQViB3aGljaCBpcyBnb25lLgorICBSZWNvZ25pemUgbmV3IGZsYWcgdG8gc2tpcCB1ZGV2IHNjYW5uaW5nIGluIHVkZXYgcnVsZXMgYW5kIGFjdCBhcHByb3ByaWF0ZWx5LgorICBBZGQgc3VwcG9ydCBmb3IgZmxhZ2dpbmcgYW4gTFYgdG8gc2tpcCB1ZGV2IHNjYW5uaW5nIGR1cmluZyBhY3RpdmF0aW9uLgorICBJbXByb3ZlIG1lc3NhZ2Ugd2hlbiB1bmFibGUgdG8gY2hhbmdlIGRpc2NhcmRzIHNldHRpbmcgb24gYWN0aXZlIHRoaW4gcG9vbC4KKyAgUnVuIGZ1bGwgc2NhbiBiZWZvcmUgdmdyZW5hbWUgb3BlcmF0aW9uIHRvIGF2b2lkIGFueSBjYWNoZSBuYW1lIGNvbGxpc2lvbi4KKyAgRml4IGx2Y29udmVydCB3aGVuIGNvbnZlcnRpbmcgdG8gYSB0aGluIHBvb2wgYW5kIHRoaW4gTFYgYXQgb25jZS4gKDIuMDIuOTkpCisKK1ZlcnNpb24gMi4wMi4xMDMgLSA0dGggT2N0b2JlciAyMDEzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFbnN1cmUgdmdpZCBtYXRjaGVzIGJlZm9yZSByZW1vdmluZyB2Z25hbWUgZW50cnkgZnJvbSBsdm1ldGFkIGNhY2hlLgorICBBZGQgLS1pZ25vcmVza2lwcGVkY2x1c3RlciBmb3IgZXhpdCBzdGF0dXMgc3VjY2VzcyB3aGVuIGNsdXN0ZXJlZCBWR3Mgc2tpcHBlZC4KKyAgRml4IDMgbWludXRlIHVkZXYgdGltZW91dCBzbyB0aGF0IGl0IGlzIGFwcGxpZWQgZm9yIGFsbCBMVk0gdm9sdW1lcy4KKyAgRml4IHRoaW4vcmFpZCAmIGFjdGl2YXRpb24gY29uZmlnIGRlZmF1bHRzIHdpdGggY29uZmlndXJlIC0tZGlzYWJsZS1kZXZtYXBwZXIuCisgIEZpeCBSQUlEIGNhbGN1bGF0aW9uIGZvciBzdWZmaWNpZW50IGFsbG9jYXRhYmxlIHNwYWNlLgorICBsdmNvbnZlcnQgZnJvbSBsaW5lYXIgdG8gbWlycm9yIG9yIFJBSUQxIG5vdyBob25vcnMgbWlycm9yX3NlZ3R5cGVfZGVmYXVsdC4KKyAgQWRkIHRoaW4tcGVyZm9ybWFuY2UgY29uZmlndXJhdGlvbiBwcm9maWxlLgorICBBZGQgbHZtLmNvbmYgYWxsb2NhdGlvbi90aGluX3Bvb2xfY2h1bmtfc2l6ZV9wb2xpY3kgb3B0aW9uLgorICBGaXggY29udGlndW91cyAmIGNsaW5nIGFsbG9jYXRpb24gcG9saWNpZXMgZm9yIHBhcml0eSBSQUlELiAgKDIuMDIuMTAwKQorICBIYXZlIGx2bWNvbmYgLS1lbmFibGUvZGlzYWJsZS1jbHVzdGVyIHJlc2V0L3NldCB1c2VfbHZtZXRhZC4KKyAgRG9uJ3QgaW5zdGFsbCBzZXBhcmF0ZSBjb21tYW5kIHN5bWxpbmsgZm9yICdsdm0gZGV2dHlwZXMnLiAoMi4wMi4xMDEpCisgIEFkZCBzZWdfc2l6ZV9wZSBmaWVsZCB0byByZXBvcnRzLgorICBTdXBwb3J0IHN0YXJ0K2xlbmd0aCBub3RhdGlvbiB3aXRoIGNvbW1hbmQgbGluZSBQRSByYW5nZXMuCisgIEV4aXQgY2xlYW5seSB3aXRoIG1lc3NhZ2Ugd2hlbiBwdm1vdmUgY2Fubm90IHJlc3RhcnQgYmVjYXVzZSBMViBpcyBpbmFjdGl2ZS4KKworVmVyc2lvbiAyLjAyLjEwMiAtIDIzcmQgU2VwdGVtYmVyIDIwMTMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBtaXNzaW5nIGJ1aWxkIGRlcGVuZGVuY3kgZm9yIHNjcmlwdHMgc3ViZGlyIGluIE1ha2VmaWxlLgorICBFeHRlbmQgbHZfaW5mbygpIGZvciBtb3JlIGVmZmljaWVudCBsdl9pc19hY3RpdmVfbG9jYWxseSgpIGNoZWNrLgorICBGaXggbm9kZSB1cC9kb3duIGhhbmRsaW5nIGluIGNsdm1kIGNvcm9zeW5jIG1vZHVsZS4KKworVmVyc2lvbiAyLjAyLjEwMSAtIDIwdGggU2VwdGVtYmVyIDIwMTMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCAzLXRocmVhZCBjbHZtZCBkZWFkbG9jayB0cmlnZ2VyZWQgYnkgY2xlYW51cCBvbiBFT0YgZnJvbSBjbGllbnQuCisgIFJlbW92ZSBWRyBmcm9tIGx2bWV0YWQgYmVmb3JlIHJlc3RvcmluZyBpdCB3aXRoIHZnY2ZncmVzdG9yZS4KKyAgVXNlIHN0cnRvdWxsIGluc3RlYWQgb2Ygc3RydG9sIGluIF9nZXRfaW50X2FyZy4KKyAgQWRkIGRldnR5cGVzIHJlcG9ydCBjb21tYW5kIHRvIGRpc3BsYXkgYnVpbHQtaW4gcmVjb2duaXNlZCBibG9jayBkZXZpY2UgdHlwZXMuCisgIEZpeCBDQyBNYWtlZmlsZSBvdmVycmlkZSB3aGljaCBoYWQgcmV2ZXJ0ZWQgdG8gdXNpbmcgYnVpbHQtaW4gdmFsdWUuICgyLjAyLjc1KQorICBSZWNvZ25pc2UgYmNhY2hlIGJsb2NrIGRldmljZXMgaW4gZmlsdGVyIChleHBlcmltZW50YWwpLgorICBSdW4gbHZtMi1hY3RpdmF0aW9uLW5ldCBhZnRlciBsdm0yLWFjdGl2YXRpb24gc2VydmljZSB0byBwcmV2ZW50IHBhcmFsbGVsIHJ1bi4KKyAgQWRkIG1hbiBwYWdlIGVudHJpZXMgZm9yIGx2bWR1bXAncyAtdSBhbmQgLWwgb3B0aW9ucy4KKyAgRml4IGx2bTJhcHAgc2VnZmF1bHQgd2hpbGUgdXNpbmcgbHZtX2xpc3RfcHZzX2ZyZWUgZm4gaWYgdGhlcmUgYXJlIG5vIFBWcy4KKyAgSW1wcm92ZSBvZiBjbHZtZCBzaW5nbGVub2RlIGxvY2tpbmcgc2ltdWxhdGlvbi4KKyAgbHZjb252ZXJ0IG5vIGxvbmdlciBjb252ZXJ0cyBMVnMgb2YgIm1pcnJvciIgc2VnbWVudCB0eXBlIHRvIHRoaW5wb29sLgorICBsdmNvbnZlcnQgbm8gbG9uZ2VyIGNvbnZlcnRzIHRoaW5wb29sIHN1Yi1MVnMgdG8gIm1pcnJvciIgc2VnbWVudCB0eXBlLgorICBEaXJlY3QgdWRldiB0byB1c2UgM21pbiB0aW1lb3V0IGZvciBMVk0gZGV2aWNlcy4gUmVjZW50IHVkZXYgaGFzIGRlZmF1bHQgMzBzLgorICBEbyBub3Qgc2NhbiBtdWx0aXBhdGggb3IgUkFJRCBjb21wb25lbnRzIGFuZCBhdm9pZCBpbmNvcnJlY3QgYXV0b2FjdGl2YXRpb24uCisgIEZpeCBNRC9sb29wIHVkZXYgaGFuZGxpbmcgdG8gZmlyZSBhdXRvYWN0aXZhdGlvbiBhZnRlciBzZXR1cCBvciBjb2xkcGx1ZyBvbmx5LgorICBNYWtlIFJBSUQgY2FwYWJsZSBvZiBzaW5nbGUtbWFjaGluZSBleGNsdXNpdmUgb3BlcmF0aW9ucyBpbiBhIGNsdXN0ZXIuCisgIERyb3AgY2FsY3VsYXRpb24gb2YgcmVhZCBhaGVhZCBmb3IgZGVhY3RpdmF0ZWQgdm9sdW1lLgorICBDaGVjayBmb3IgZXhhY3RseSBvbmUgbHYgc2VnbWVudCBpbiB2YWxpZGF0aW9uIG9mIHRoaW4gcG9vbHMgYW5kIHZvbHVtZXMuCisgIEZpeCBkbWV2ZW50ZCB1bm1vbml0b3Jpbmcgb2YgdGhpbiBwb29scy4KKyAgRml4IGx2cmVzaXplIGZvciBzdGFja2VkIHRoaW4gcG9vbCB2b2x1bWVzIChpLmUuIG1pcnJvcnMpLgorICBXcml0ZSBDb21wbGV0ZWQgZGVidWcgbWVzc2FnZSBiZWZvcmUgcmVpbnN0YXRpbmcgbG9nIGRlZmF1bHRzIGFmdGVyIGNvbW1hbmQuCisgIFJlZnJlc2ggZXhpc3RpbmcgVkcgYmVmb3JlIGF1dG9hY3RpdmF0aW9uIChldmVudCByZXRyaWdnZXIvZGV2aWNlIHJlYXBwZWFyZWQpLgorICBVc2UgcHZzY2FuIC1iIGluIHVkZXYgcnVsZXMgdG8gYXZvaWQgYSBkZWFkbG9jayBvbiB1ZGV2IHByb2Nlc3MgY291bnQgbGltaXQuCisgIEFkZCBwdnNjYW4gLWIvLS1iYWNrZ3JvdW5kIGZvciB0aGUgY29tbWFuZCB0byBiZSBwcm9jZXNzZWQgaW4gdGhlIGJhY2tncm91bmQuCisgIERvbid0IGFzc3VtZSBzdGRpbiBmaWxlIGRlc2NyaXB0b3IgaXMgcmVhZGFibGUuCisgIEF2b2lkIHVubGltaXRlZCByZWN1cnNpb24gd2hlbiBjcmVhdGluZyBkdHJlZSBjb250YWluaW5nIGluYWN0aXZlIHB2bW92ZSBMVi4KKyAgUmVxdWlyZSBleGFjdGx5IDMgYXJndW1lbnRzIGZvciBsdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLiBSZW1vdmUgZGVmYXVsdHMuCisgIEluZm9ybSBsdm1ldGFkIGFib3V0IGFueSBsb3N0IFBWIGxhYmVsIHRvIG1ha2UgaXQgaW4gc3luYyB3aXRoIHN5c3RlbSBzdGF0ZS4KKyAgU3VwcG9ydCBtb3N0IG9mIGx2Y2hhbmdlIG9wZXJhdGlvbnMgb24gc3RhY2tlZCB0aGluIHBvb2wgbWV0YS9kYXRhIExWcy4KKyAgRW5hYmxlIG5vbi1jbHVzdGVyZWQgcHZtb3ZlIG9mIHNuYXBzaG90cyBhbmQgc25hcHNob3Qgb3JpZ2lucy4KKyAgQWRkIGFiaWxpdHkgdG8gcHZtb3ZlIG5vbi1jbHVzdGVyZWQgUkFJRCwgbWlycm9yLCBhbmQgdGhpbiB2b2x1bWVzLgorICBNYWtlIGx2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3Igc2lsZW50IHVubGVzcyBpdCdzIGluIGVycm9yIHN0YXRlLgorICBSZW1vdmUgIm1wYXRoIG1ham9yIGlzIG5vdCBkbSBtYWpvciIgbXNnIGZvciBtcGF0aCBjb21wb25lbnQgc2NhbiAoMi4wMi45NCkuCisgIFByZXZlbnQgY2x1c3RlciBtaXJyb3IgbG9ncyBmcm9tIGJlaW5nIGNvcnJ1cHRlZCBieSByZWR1bmRhbnQgY2hlY2twb2ludHMuCisgIEZpeCBpZ25vcmVkIGx2bWV0YWQgdXBkYXRlIG9uIGxvb3AgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKDIuMDIuOTkpLgorICBVc2UgTFZNX1BBVEggaW5zdGVhZCBvZiBoYXJkY29kZWQgdmFsdWUgaW4gbHZtMiBhY3RpdmF0aW9uIHN5c3RlbWQgZ2VuZXJhdG9yLgorICBGaXggdmdjayB0byBub3RpY2Ugb24tZGlzayBjb3JydXB0aW9uIGV2ZW4gaWYgbHZtZXRhZCBpcyB1c2VkLgorICBNb3ZlIG1wYXRoIGRldmljZSBmaWx0ZXIgYmVmb3JlIHBhcnRpdGlvbmVkIGZpbHRlciAod2hpY2ggb3BlbnMgZGV2aWNlcykuCisgIFNwbGl0IHBhcnRpdGlvbmVkIGZpbHRlciBvdXQgb2YgbHZtX3R5cGUgZmlsdGVyLgorICBNZXJnZSBmaWx0ZXIqLmggaW50byBhIHNpbmdsZSBmaWx0ZXIuaC4KKyAgUmVxdWlyZSBjb25maXJtYXRpb24gZm9yIHZnY2hhbmdlIC1jIHdoZW4gbm8gVkdzIGxpc3RlZCBleHBsaWNpdGx5LgorICBBbHNvIHNraXAgL3ZhciBhbmQgL3Zhci9sb2cgYnkgZGVmYXVsdCBpbiBibGtkZWFjdGl2YXRlIHdoZW4gdW5tb3VudGluZy4KKyAgQWRkIHN1cHBvcnQgZm9yIGJpbmQgbW91bnRzIGluIGJsa2RlYWN0aXZhdGUuCisgIEFkZCBibGtkZWFjdGl2YXRlIC12Ly0tdmVyYm9zZSBmb3IgZGVidWcgb3V0cHV0IGZyb20gZXh0ZXJuYWwgdG9vbHMgdXNlZC4KKyAgQWRkIGJsa2RlYWN0aXZhdGUgLWUvLS1lcnJvcnMgZm9yIGVycm9yIG1lc3NhZ2VzIGZyb20gZXh0ZXJuYWwgdG9vbHMgdXNlZC4KKyAgU3VwcHJlc3MgbWVzc2FnZXMgZnJvbSBleHRlcm5hbCB0b29scyBjYWxsZWQgaW4gYmxrZGVhY3RpdmF0ZSBieSBkZWZhdWx0LgorCitWZXJzaW9uIDIuMDIuMTAwIC0gMTN0aCBBdWd1c3QgMjAxMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGluYWJpbGl0eSB0byByZW1vdmUgYSBWRydzIGNsdXN0ZXIgZmxhZyBpZiBpdCBjb250YWlucyBhIG1pcnJvci4KKyAgU3VwcHJlc3MgYXJnOiBwcmVmaXggaW4gbG9nX3N5c19lcnJvciBtYWNybyB3aGVuIGFyZyBpcyBlbXB0eSBzdHJpbmcuCisgIEZpeCBidWcgbWFraW5nIGx2Y2hhbmdlIHVuYWJsZSB0byBjaGFuZ2UgcmVjb3ZlcnkgcmF0ZSBmb3IgUkFJRC4KKyAgUHJvaGliaXQgY29udmVyc2lvbiBvZiB0aGluIHBvb2wgdG8gZXh0ZXJuYWwgb3JpZ2luLgorICBXb3JrYXJvdW5kIGdjYyB2NC44IC1PMiBidWcgY2F1c2luZyBmYWlsdXJlcyBpZiBjb25maWcvY2hlY2tzPTEgKDMyYml0IGFyY2gpLgorICBWZXJpZnkgY2x2bWQgbWVzc2FnZSB2YWxpZGl0eSBiZWZvcmUgcHJvY2Vzc2luZyBhbmQgbG9nIGVycm9yIGlmIGluY29ycmVjdC4KKyAgV2hlbiBjcmVhdGluZyBQViBvbiBleGlzdGluZyBMViBkb24ndCBmb3JiaWQgcmVzZXJ2ZWQgTFYgbmFtZXMgb24gTFZzIGJlbG93LgorICBTcGxpdCBvdXQgZGV2aWNlX2lzX3N1c3BlbmRlZF9vcl9ibG9ja2luZyBmcm9tIGRldmljZV9pc191c2FibGUuCisgIFdoZW4gY29udmVydGluZyBtaXJyb3JzLCBkZWZhdWx0IHNlZ3R5cGUgc2hvdWxkIGJlIHRoZSBzYW1lIHVubGVzcyBzcGVjaWZpZWQuCisgIE1ha2UgInJhaWQxIiB0aGUgZGVmYXVsdCBtaXJyb3Igc2VnbWVudCB0eXBlLgorICBGaXggY2xvZ2QgZGVzY3JpcHRvciBsZWFrIHdoZW4gZGFlbW9uaXppbmcuCisgIEZpeCBjbHZtZCBkZXNjcmlwdG9yIGxlYWsgb24gcmVzdGFydC4KKyAgQWRkIHBpcGVfb3Blbi9jbG9zZSgpIHRvIHVzZSBpbnN0ZWFkIG9mIGxlc3MgZWZmaWNpZW50L3NlY3VyZSBwb3BlbigpLgorICBGaXggbWV0YWRhdGEgYXJlYSBvZmZzZXQvc2l6ZSBvdmVyZmxvdyBpZiBpdCdzID49IDRnIGFuZCB3aGlsZSB1c2luZyBsdm1ldGFkLgorICBJbmhlcml0IGFuZCBhcHBseSBhbnkgcHJvZmlsZSBhdHRhY2hlZCB0byBhIFZHIGlmIGNyZWF0aW5nIG5ldyB0aGluIHBvb2wuCisgIEFkZCBpbml0aWFsIHN1cHBvcnQgdGhpbiBwb29sIGx2Y29udmVydCAtLXJlcGFpci4KKyAgQWRkIC0td2l0aC10aGluLXJlcGFpciBhbmQgLS13aXRoLXRoaW4tZHVtcCBjb25maWd1cmUgb3B0aW9ucy4KKyAgQWRkIGx2bS5jb25mIHRoaW5fcmVwYWlyL2R1bXBfZXhlY3V0YWJsZSBhbmQgdGhpbl9yZXBhaXJfb3B0aW9ucy4KKyAgUmVxdWlyZSAxLjkgdGhpbiBwb29sIHRhcmdldCB2ZXJzaW9uIGZvciBvbmxpbmUgdGhpbiBwb29sIG1ldGFkYXRhIHJlc2l6ZS4KKyAgSWdub3JlIHByZXZpb3VzIExWIHNlZyB3aXRoIGFsbG9jIGNvbnRpZ3VvdXMgJiBjbGluZyB3aGVuIG51bSBzdHJpcGVzIHZhcmllcy4KKyAgRml4IHNlZ2ZhdWx0IGlmIGRldmljZXMvZ2xvYmFsX2ZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIGNvcnJlY3RseS4KKworVmVyc2lvbiAyLjAyLjk5IC0gMjR0aCBKdWx5IDIwMTMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERvIG5vdCB6ZXJvIGluaXQgNEtCIG9mIHRoaW4gc25hcHNob3QgZm9yIG5vbi16ZXJvaW5nIHRoaW4gcG9vbCAoMi4wMi45NCkuCisgIElzc3VlIGFuIGVycm9yIG1zZyBpZiBsdmNvbnZlcnQgLS10eXBlIHVzZWQgaW5jb3JyZWN0bHkgd2l0aCBvdGhlciBvcHRpb25zLgorICBVc2UgTE9HX0RFQlVHL0VSUiBtc2cgc2V2ZXJpdHkgaW5zdGVhZCBkZWZhdWx0IGZvciBsdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLgorICBTdXBwb3J0IEFSR19HUk9VUEFCTEUgd2l0aCBtZXJnZV9zeW5vbnltIChmb3IgLS1yYWlkd3JpdGVtb3N0bHkpLgorICBGaXggc2VnZmF1bHQgd2hlbiByZXBvcnRpbmcgcmFpZF9zeW5jYWN0aW9uIGZvciBvbGRlciBrZXJuZWxzLgorICBBZGQgTFYgcmVwb3J0IGZpZWxkczogcmFpZF9taXNtYXRjaF9jb3VudC9yYWlkX3N5bmNfYWN0aW9uL3JhaWRfd3JpdGVfYmVoaW5kLgorICBBZGQgTFYgcmVwb3J0aW5nIGZpZWxkcyByYWlkX21pbl9yZWNvdmVyeV9yYXRlLCByYWlkX21heF9yZWNvdmVyeV9yYXRlLgorICBBZGQgc3luY19wZXJjZW50IGFzIGFsaWFzIGZvciBjb3B5X3BlcmNlbnQgTFYgcmVwb3J0aW5nIGZpZWxkLgorICBBZGQgbHZfIHByZWZpeCB0byBtb2R1bGVzIHJlcG9ydGluZyBmaWVsZC4KKyAgVXNlIHVuaXRzIEIgb3IgYiAobmV2ZXIgRSkgd2l0aCBubyBkZWNpbWFsIHBsYWNlcyB3aGVuIGRpc3BsYXlpbmcgc2l6ZXMgPCAxay4KKyAgQWRkIHN1cHBvcnQgZm9yIHBvb2xtZXRhZGF0YXNwYXJlIExWLCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgcG9vbCByZWNvdmVyeS4KKyAgSW1wcm92ZSBhY3RpdmF0aW9uIG9yZGVyIHdoZW4gY3JlYXRpbmcgdGhpbiBwb29scyBpbiBub24tY2x1c3RlcmVkIFZHLgorICBMaXN0IHRoaW4tcG9vbCBhbmQgdGhpbiBtb2R1bGVzIGZvciB0aGluIHZvbHVtZXMuCisgIENvcnJlY3QgdGhpbiBjcmVhdGlvbiBlcnJvciBwYXRocy4KKyAgVXNlIGxvY2FsIGFjdGl2YXRpb24gZm9yIGNsZWFyaW5nIHNuYXBzaG90IENPVyBkZXZpY2UuCisgIEFkZCBsdm0yLWFjdGl2YXRpb24tbmV0IHN5c3RlbWQgdW5pdCB0byBhY3RpdmF0ZSBMVnMgb24gbmV0LWF0dGFjaGVkIHN0b3JhZ2UuCisgIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIF9jYWNoZWRfaW5mbygpLgorICBBZGQgd2hvbGUgbG9nX2x2IGFuZCBtZXRhZGF0YV9sdiBzdWIgdm9sdW1lcyB3aGVuIGNyZWF0aW5nIHBhcnRpYWwgdHJlZS4KKyAgUHJvcGVybHkgdXNlIHNuYXBzaG90IGxheWVyIGZvciBvcmlnaW4gd2hpY2ggaXMgYWxzbyB0aGluIHZvbHVtZS4KKyAgQXZvaWQgZ2VuZXJhdGluZyBtZXRhZGF0YSBiYWNrdXAgd2hlbiBjYWxsaW5nIHVwZGF0ZV9wb29sX2x2KCkuCisgIFNlbmQgdGhpbiBtZXNzYWdlcyBhbHNvIGZvciBhY3RpdmUgdGhpbiBwb29sIGFuZCBpbmFjdGl2ZSB0aGluIHZvbHVtZS4KKyAgQWRkIGFjdGl2YXRpb24vYXV0b19zZXRfYWN0aXZhdGlvbl9za2lwIHRvIGNvbnRyb2wgYWN0aXZhdGlvbiBza2lwIGZsYWdnaW5nLgorICBBZGQgJ3MoaylpcCBhY3RpdmF0aW9uJyBiaXQgdG8gbHZzIC1vIGx2X2F0dHIgdG8gaW5kaWNhdGUgc2tpcCBmbGFnIGF0dGFjaGVkLgorICBBZGQgLS1pZ25vcmVhY3RpdmF0aW9uc2tpcCB0byBsdmNyZWF0ZS92Z2NoYW5nZS9sdmNoYW5nZSB0byBpZ25vcmUgc2tpcCBmbGFnLgorICBBZGQgLS1zZXRhY3RpdmF0aW9uc2tpcCB0byBsdmNyZWF0ZS9sdmNoYW5nZSB0byBzZXQgYWN0aXZhdGlvbiBza2lwIGZsYWcuCisgIEF1dG9tYXRpY2FsbHkgZmxhZyB0aGluIHNuYXBzaG90cyB0byBiZSBza2lwcGVkIGR1cmluZyBhY3RpdmF0aW9uLgorICBBZGQgc3VwcG9ydCBmb3IgcGVyc2lzdGVudCBmbGFnZ2luZyBvZiBMVnMgdG8gYmUgc2tpcHBlZCBkdXJpbmcgYWN0aXZhdGlvbi4KKyAgQWRkIC0tdHlwZSBwcm9maWxhYmxlIHRvIGx2bSBkdW1wY29uZmlnIHRvIHNob3cgcHJvZmlsYWJsZSBjb25maWcgc2V0dGluZ3MuCisgIEFkZCAtLW1lcmdlZGNvbmZpZyB0byBsdm0gZHVtcGNvbmZpZyBmb3IgbWVyZ2VkIC0tY29uZmlnLy0tcHJvZmlsZS9sdm0uY29uZi4KKyAgUmVsYXNlIG1lbW9yeSBhbmQgdW5ibG9jayBzaWduYWxzIGluIGxvY2tfdm9sIGVycm9yIHBhdGguCisgIERlZmluZSBMVk0yXyogY29tbWFuZCBlcnJvcnMgaW4gbHZtMmNtZC5oIGFuZCB1c2UgaW4gZG1ldmVudGQgcGx1Z2lucy4KKyAgTW92ZSBlcnJvcnMuaCB0byB0b29scyBkaXIuCisgIEFkZCBtYW4gcGFnZSBlbnRyaWVzIGZvciBwcm9maWxlIGNvbmZpZ3VyYXRpb24gYW5kIHJlbGF0ZWQgb3B0aW9ucy4KKyAgSW1wcm92ZSBlcnJvciBsb2dpbmcgd2hlbiB1c2VyIHRyaWVzIHRvIGludGVycnVwdCBjb21tYW5kcy4KKyAgUmVuYW1lIF9zd2FwX2x2IHRvIF9zd2FwX2x2X2lkZW50aWZpZXJzIGFuZCBtb3ZlIHRvIGFsbG93IGFuIGFkZGl0aW9uYWwgdXNlci4KKyAgUmVuYW1lIHNuYXBzaG90IHNlZ21lbnQgcmV0dXJuaW5nIG1ldGhvZHMgZnJvbSBmaW5kXypfY293IHRvIGZpbmRfKl9zbmFwc2hvdC4KKyAgbGlibHZtL3B5dGhvbiBBUEk6IEFkZGl0aW9uczogUFYgY3JlYXRlL3JlbW92YWwvcmVzaXplL2xpc3RpbmcKKyAgbGlibHZtL3B5dGhvbiBBUEk6IEFkZGl0aW9uczogTFYgYXR0ci9vcmlnaW4vVGhpbiBwb29sL1RoaW4gTFYgY3JlYXRpb24KKyAgQWRkIHZncy9sdnMgLW8gdmdfcHJvZmlsZS9sdl9wcm9maWxlIHRvIHJlcG9ydCBwcm9maWxlcyBhdHRhY2hlZCB0byBWRy9MVi4KKyAgQWRkIGRlZmF1bHQucHJvZmlsZSBjb25maWd1cmF0aW9uIHByb2ZpbGUgYW5kIGluc3RhbGwgaXQgb24gbWFrZSBpbnN0YWxsLgorICBDcmVhdGUgYSBuZXcgJ2NvbmYnIHN1YmRpciBmb3IgY29uZmlndXJhdGlvbiBmaWxlcyBpbmNsdWRpbmcgcHJvZmlsZXMuCisgIE1ha2Ugc2VsZWN0ZWQgdGhpbnAgc2V0dGluZ3MgY3VzdG9taXphYmxlIGJ5IGEgcHJvZmlsZS4KKyAgU3VwcG9ydCBjaGFuZ2luZyBWRy9MViBwcm9maWxlczogdmdjaGFuZ2UvbHZjaGFuZ2UgLS1wcm9maWxlLy0tZGV0YWNocHJvZmlsZS4KKyAgU3VwcG9ydCBzdG9yaW5nIHByb2ZpbGUgbmFtZSBpbiBtZXRhZGF0YSBmb3IgYm90aCBWR3MgYW5kIExWcy4KKyAgQWRkIG5ldyAtLXByb2ZpbGUgY29tbWFuZCBsaW5lIGFyZyB0byBzZWxlY3QgYSBjb25maWd1cmF0aW9uIHByb2ZpbGUgZm9yIHVzZS4KKyAgQWRkIGNvbmZpZy9wcm9maWxlX2RpciB0byBzZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gbG9hZCBwcm9maWxlcyBmcm9tLgorICBBZGQgY29uZmlndXJlIC0td2l0aC1kZWZhdWx0LXByb2ZpbGUtc3ViZGlyIHRvIHNlbGVjdCBkaXIgdG8ga2VlcCBwcm9maWxlcyBpbi4KKyAgQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyYXRpb24gcHJvZmlsZXMuCisgIEludHJvZHVjZSBjb25maWdfc291cmNlIHdyYXBwZXIgZm9yIGlkZW50aWZpY2F0aW9uIG9mIGNvbmZpZ3VyYXRpb24gc291cmNlcy4KKyAgQXZvaWQgY3JlYXRpb24gb2YgbXVsdGlwbGUgYXJjaGl2ZXMgZm9yIG9uZSBjb21tYW5kLgorICBVc2UgbWlycm9yX3NlZ3R5cGVfZGVmYXVsdCBpZiB0eXBlIG5vdCBzcGVjaWZpZWQgZm9yIGxpbmVhci0+bWlycm9yIHVwY29udmVydC4KKyAgRml4IHVzZSBvZiB0b28gYmlnIGNodW5rcyBvZiBtZW1vcnkgd2hlbiBjb21tdW5pY2F0aW9uIHdpdGggbHZtZXRhZC4KKyAgRml4IHZnY2ZncmVzdG9yZSBjcmFzaCB3aGVuIHNwZWNpZmllZCBpbmNvcnJlY3QgdmcgbmFtZS4KKyAgUmVmaW5lIGx2bS5jb25mIGFuZCBtYW4gcGFnZSBkb2N1bWVudGF0aW9uIGZvciBhdXRvYWN0aXZhdGlvbiBmZWF0dXJlLgorICBBZGQgc3VwcG9ydCBmb3IgdGhpbiB2b2x1bWVzIGluIHZnc3BsaXQuCisgIEFsc28gZmlsdGVyIHBhcnRpdGlvbnMgb24gbXBhdGggY29tcG9uZW50cyBpZiBtdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbj0xLgorICBBZGQgbHZyZXNpemUgc3VwcG9ydCBmb3Igb25saW5lIHRoaW4gcG9vbCBtZXRhZGF0YSB2b2x1bWUgcmVzaXplLgorICBBZGQgaGVscGVyIGZ1bmN0aW9ucyBmaW5kX3Bvb2xfbHYoKSBhbmQgcG9vbF9jYW5fcmVzaXplX21ldGFkYXRhKCkuCisgIEFkZCBkZXRlY3Rpb24gZm9yIHRoaW4gcG9vbCBtZXRhZGF0YSByZXNpemUga2VybmVsIHN1cHBvcnQuCisgIFJlcG9ydCBsdnMgdm9sdW1lIHR5cGUgJ2UnIHdpdGggaGlnaGVyIHByaW9yaXR5LgorICBSZXBvcnQgbHZzIHZvbHVtZSB0eXBlICdvJyBhbHNvIGZvciBleHRlcm5hbCBvcmlnaW4gdm9sdW1lcy4KKyAgUmVwb3J0IGx2cyB0YXJnZXQgdHlwZSAndCcgb25seSBmb3IgdGhpbiBwb29scyBhbmQgdGhpbiB2b2x1bWVzLgorICBGaXggdGVzdCBmb3IgYWN0aXZlIHNuYXBzaG90IGluIGNsdXN0ZXIgYmVmb3JlIHJlc2l6aW5nIGl0LgorICBBbGxvdyBsb2NhbCBhY3RpdmF0aW9uIHRvIHJlY2VpdmUgYSBsb2NhbGx5LXN1cHBsaWVkIExWIHN0cnVjdC4KKyAgQWRkIHZnLT52Z19vbmRpc2sgLyBsdl9vbmRpc2soKSBob2xkaW5nIGNvbW1pdHRlZCBtZXRhZGF0YS4KKyAgUmVwb3J0IGJhY2t0cmFjZSBmcm9tIGR1bXAgZmlsdGVyIGVycm9yIHBhdGguCisgIERvIG5vdCB1c2UgcGVyc2lzdGVudCBmaWx0ZXIgd2l0aCBsdm1ldGFkLgorICBDb21wb3NhYmxlIHBlcnNpc3RlbnQgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgZm9yIGdsb2JhbCBmaWx0ZXIuCisgIE92ZXJyaWRlIHN5c3RlbSdzIGdsb2JhbF9maWx0ZXIgc2V0dGluZ3MgZm9yIHZnaW1wb3J0Y2xvbmUuCisgIERldGVjdCBtYXhpbXVtIHVzYWJsZSBzaXplIGZvciBzbmFwc2hvdCBmb3IgbHZyZXNpemUuCisgIENyZWF0aW9uIG9mIHNuYXBzaG90IHRha2VzIGF0IG1vc3QgMTAwJSBvcmlnaW4gY292ZXJhZ2UuCisgIEFkZCBjb3dfbWF4X2V4dGVudHMoKSB0byBjYWxjIGV4dGVudHMgZm9yIDEwMCUgb3JpZ2luIGNvdmVyYWdlLgorICBGb3IgY3JlYXRpb24gb2Ygc25hcHNob3QgcmVxdWlyZSBzaXplIGZvciBhdCBsZWFzdCAzIGNodW5rcy4KKyAgRml4IGx2cmVzaXplIC0tdXNlLXBvbGljaWVzIG9mIFZBTElEIGJ1dCAxMDAlIGZ1bGwgc25hcHNob3QuCisgIERvIG5vdCBhY2NlcHQgc2l6ZSBwYXJhbWV0ZXJzIGJpZ2dlciB0aGVuIDE2RWlCLgorICBGaXggcmVsZWFzZSBvZiBQVidzIGZpZCBpbiBmcmVlX3B2X2ZpZCgpLgorICBTa2lwIG1vbml0b3Jpbmcgb2Ygc25hcHNob3RzIHRoYXQgYXJlIGFscmVhZHkgYmlnZ2VyIHRoZW4gb3JpZ2luLgorICBBZGQgbHZfaXNfY293X2NvdmVyaW5nX29yaWdpbigpIHRvIGNoZWNrIGlmIGNvdyBjb3ZlcnMgb3JpZ2luIHNpemUuCisgIFVzZSBsaWJkbSBkbV9nZXRfc3RhdHVzX3NuYXBzaG90KCkgdG8gcGFyc2Ugc25hcHNob3Qgc3RhdHVzLgorICBBZGQgZGV0ZWN0aW9uIG9mIG1vdW50ZWQgZnMgYWxzbyBmb3IgdmdjaGFuZ2UgZGVhY3RpdmF0aW9uLgorICBSZXBsYWNlICdsdl9pc19hY3RpdmUnIHdpdGggbW9yZSBjb3JyZWN0L3NwZWNpZmljIHZhcmlhbnRzIChlLmcuICpfbG9jYWxseSkuCisgIFJlZnVzZSB0byBpbml0IGEgc25hcHNob3QgbWVyZ2UgaW4gbHZjb252ZXJ0IGlmIHRoZXJlJ3Mgbm8ga2VybmVsIHN1cHBvcnQuCisgIEZpeCBleHBvcnRlZCBzeW1ib2xzIHJlZ2V4IGZvciBub24tR05VIGJ1c3lib3ggc2VkLgorICBBY2NlcHQgLS15ZXMgaW4gYWxsIGNvbW1hbmRzIHNvIHRlc3Qgc2NyaXB0cyBjYW4gYmUgc2ltcGxlci4KKyAgRml4IGFsaWdubWVudCBvZiBQViBkYXRhIGFyZWEgaWYgZGV0ZWN0ZWQgYWxpZ25tZW50IGxlc3MgdGhhbiAxIE1CICgyLjAyLjc0KS4KKyAgRml4IG1lbW9yeSByZXNvdXJjZSBsZWFrIGluIG1lbWxvY2tpbmcgZXJyb3IgcGF0aC4KKyAgRml4IHByZW1hdHVyZSBETSB2ZXJzaW9uIGNoZWNraW5nIHdoaWNoIGNhdXNlZCB1c2VsZXNzIG1hcHBlci9jb250cm9sIGFjY2Vzcy4KKyAgQWRkICJhY3RpdmUiIExWIHJlcG9ydGluZyBmaWVsZCB0byBzaG93IGFjdGl2YXRpb24gc3RhdGUuCisgIEFkZCAibW9uaXRvciIgc2VnbWVudCByZXBvcnRpbmcgZmllbGQgdG8gc2hvdyBkbWV2ZW50IG1vbml0b3Jpbmcgc3RhdHVzLgorICBEb2N1bWVudCBsdmV4dGVuZCAtLXVzZS1wb2xpY2llcyBvcHRpb24gaW4gbWFuLgorICBGaXggY3JlYXRpb24gYW5kIHJlbW92YWwgb2YgY2x1c3RlcmVkIHNuYXBzaG90LgorICBGaXggY2x2bWQgY2FjaGluZyBvZiBtZXRhZGF0YSB3aGVuIHN1c3BlbmRpbmcgaW5hY3RpdmUgdm9sdW1lcy4KKyAgRmluZCBuZXdlc3QgdGltZXN0YW1wIG9mIG1lcmdlZCBjb25maWcgZmlsZXMuCisgIEZpeCBhc3NpZ25tZW50IG9yZGVyIGZvciB2ZyBmaWQgZm9yIGx2bTEgYW5kIHBvb2wgZm9ybWF0LgorICBGaXggbWVtbGVhayBpbiBkbWV2ZW50ZCB0aGluIHBsdWdpbiBpbiBkZXZpY2UgbGlzdCBvYnRhaW5pbmcgZXJyIHBhdGguCisgIEFkZCBleHBsaWNpdCBtZXNzYWdlIGFib3V0IHVuc3VwcG9ydGVkIHB2bW92ZSBmb3IgdGhpbi90aGlucG9vbCB2b2x1bWVzLgorICBGaXggbHZtZXRhZCBlcnJvciBwYXRoIGluIGx2bWV0YWRfdmdfbG9va3VwKCkgZm9yIG51bGwgdmduYW1lLgorICBGaXggY2x2bWQgX2NsdXN0ZXJfcmVxdWVzdCgpIHJldHVybiBjb2RlIGluIG1lbW9yeSBmYWlsIHBhdGguCisgIEFkZCBsdmNyZWF0ZS9sdmNoYW5nZSAtLVtyYWlkXXttaW58bWF4fXJlY292ZXJ5cmF0ZSBmb3IgcmFpZCBMVnMuCisgIEFkZCBsdmNoYW5nZSAtLVtyYWlkXXdyaXRlbW9zdGx5L3dyaXRlYmVoaW5kIHN1cHBvcnQgZm9yIFJBSUQxCisgIEFkZCBsdl9jaGFuZ2VfYWN0aXZhdGUoKSBmb3IgY29tbW9uIGFjdGl2YXRpb24gY29kZSBpbiB2Zy9sdmNoYW5nZS4KKyAgQWRkIGx2Y2hhbmdlIC0tW3JhaWRdc3luY2FjdGlvbiBmb3Igc2NydWJiaW5nIG9mIFJBSUQgTFZzLgorICBJbXByb3ZlIFJBSUQga2VybmVsIHN0YXR1cyByZXRyaWV2YWwgdG8gaW5jbHVkZSBzeW5jX2FjdGlvbi9taXNtYXRjaF9jbnQuCisgIEFkZCBleHRlcm5hbCBvcmlnaW4gc3VwcG9ydCBmb3IgbHZjcmVhdGUuCisgIEltcHJvdmUgbHZjcmVhdGUsIGx2Y29udmVydCBhbmQgbHZtIG1hbiBwYWdlcy4KKyAgQ2xlYW4gdXAgZm9ybWF0MSBQViB3cml0ZSB0byByZW1vdmUgYSBuZWVkIGZvciBhbiBvcnBoYW4gVkcgZm9yIGl0IHRvIHBhc3MuCisgIEZpeCB2Z2V4dGVuZCB0byBub3QgYWxsb3cgYSBQViB3aXRoIDAgTURBcyB0byBiZSB1c2VkIHdoaWxlIGFscmVhZHkgaW4gYSBWRy4KKyAgTW92ZSB1cGRhdGVfcG9vbF9wYXJhbXMoKSBmcm9tIC90b29scyB0byAvbGliIGZvciBiZXR0ZXIgcmV1c2UuCisgIEdpdmUgcHJlY2VkZW5jZSB0byBFTUMgcG93ZXIyIGRldmljZXMgd2l0aCBkdXBsaWNhdGUgUFZJRHMuCisgIEFkZCAtLXZhbGlkYXRlIG9wdGlvbiB0byBsdm0gZHVtcGNvbmZpZyB0byB2YWxpZGF0ZSBjdXJyZW50IGNvbmZpZyBvbiBkZW1hbmQuCisgIEFkZCAtLWlnbm9yZWFkdmFuY2VkIGFuZCAtLWlnbm9yZXVuc3VwcG9ydGVkIHN3aXRjaCB0byBsdm0gZHVtcGNvbmZpZy4KKyAgQWRkIC0td2l0aGNvbW1lbnRzIGFuZCAtLXdpdGh2ZXJzaW9ucyBzd2l0Y2ggdG8gbHZtIGR1bXBjb25maWcuCisgIEFkZCAtLXR5cGUge2N1cnJlbnR8ZGVmYXVsdHxtaXNzaW5nfG5ld30gYW5kIC0tYXR2ZXJzaW9uIHRvIGx2bSBkdW1wY29uZmlnLgorICBTdXBwb3J0IGF1dG9tYXRpYyBjb25maWcgdmFsaWRhdGlvbiBhbmQgYWRkICdjb25maWcnIHNlY3Rpb24gdG8gbHZtLmNvbmYuCisgIEFkZCBwdnMgLW8gcHZfYmFfc3RhcnQscHZfYmFfc2l6ZSB0byByZXBvcnQgYm9vdGxvYWRlciBhcmVhIHN0YXJ0IGFuZCBzaXplLgorICBBZGQgLS1ib290bG9hZGVyYXJlYXNpemUgdG8gcHZjcmVhdGUgYW5kIHZnY29udmVydCB0byBjcmVhdGUgYm9vdGxvYWRlciBhcmVhLgorICBBZGQgUFYgaGVhZGVyIGV4dGVuc2lvbjogZXh0ZW5zaW9uIHZlcnNpb24sIGZsYWdzIGFuZCBib290bG9hZGVyIGFyZWFzLgorICBJbml0aWFsIHN1cHBvcnQgZm9yIGx2Y29udmVydCBvZiB0aGluIGV4dGVybmFsIG9yaWdpbi4KKyAgQWRkIF9sdl9yZW1vdmVfc2Vnc191c2luZ190aGlzX2x2KCkgZm9yIHJlbW92YWwgb2YgZGVwZW5kZW50IGx2cy4KKyAgSW1wcm92ZSBhY3RpdmF0aW9uIGNvZGUgZm9yIGJldHRlciBzdXBwb3J0IG9mIHN0YWNrZWQgZGV2aWNlcy4KKyAgQWRkIF9hZGRfbGF5ZXJfdGFyZ2V0X3RvX2R0cmVlKCkgZm9yIGFkZGluZyBsaW5lYXIgbGF5ZXIgaW50byBkdHJlZS4KKyAgRXh0ZW5kIF9jYWNoZWRfaW5mbygpIHRvIGFjY2VwdCBsYXllciBzdHJpbmcuCisgIHZnaW1wb3J0ICctLWZvcmNlJyBub3cgYWxsb3dzIGltcG9ydCBvZiBWR3Mgd2l0aCBtaXNzaW5nIFBWcy4KKyAgRml4IFBWIGFsaWdubWVudCB0byBpbmNvcnBvcmF0ZSBhbGlnbm1lbnQgb2Zmc2V0IGlmIHRoZSBQViBoYXMgemVybyBNREFzLgorICBBZGQgZ2xvYmFsL3JhaWQxMF9zZWd0eXBlX2RlZmF1bHQgdG8gbHZtLmNvbmYuCisgIEFsbG93IHJlbW92YWwgb3IgcmVwbGFjZW1lbnQgb2YgUkFJRCBMViBjb21wb25lbnRzIHRoYXQgYXJlIGVycm9yIHNlZ21lbnRzLgorICBNYWtlICd2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcnIGFibGUgdG8gaGFuZGxlIFJBSUQgTFZzIHdpdGggbWlzc2luZyBQVnMuCisgIEFjY2VwdCBhY3RpdmF0aW9uL3JhaWRfcmVnaW9uX3NpemUgaW4gcHJlZmVyZW5jZSB0byBtaXJyb3JfcmVnaW9uX3NpemUgY29uZmlnLgorICBGaXggcHZzIC1vIHB2X2ZyZWUgcmVwb3J0aW5nIGZvciBQVnMgd2l0aCB6ZXJvIFBFIGNvdW50LgorICBGaXggbWlzc2luZyBjbGVhbnVwIG9mIGZsYWdzIHdoZW4gdGhlIExWIGlzIGRldGFjaGVkIGZyb20gcG9vbC4KKyAgRml4IGNoZWNrIGZvciBzb21lIGZvcmJpZGRlbiBkaXNjYXJkcyBjb252ZXJzaW9uIG9mIHRoaW4gcG9vbHMuCisgIEFkZCBwb29sX2lzX2FjdGl2ZSgpIHRvIGNoZWNrIGZvciBhbnkgcG9vbCByZWxhdGVkIGFjdGl2ZSBMVi4KKyAgUmVwb3J0IGJsYW5rIG9yaWdpbl9zaXplIGZpZWxkIGlmIHRoZSBMViBkb2Vzbid0IGhhdmUgYW4gb3JpZ2luIGluc3RlYWQgb2YgMC4KKyAgRG8gbm90IHRha2UgYSBmcmVlIGx2IG5hbWUgYXJndW1lbnQgZm9yIGx2Y29udmVydCAtLXRoaW5wb29sIG9wdGlvbi4KKyAgQXZvaWQgZmx1c2hpbmcgdGhpbiBwb29sIHdoZW4ganVzdCByZXF1ZXN0aW5nIHRyYW5zYWN0aW9uX2lkLgorICBBZGQgaW50ZXJuYWwgZnVuY3Rpb24gbHZfbGF5ZXIoKSB0byBvYnRhaW4gbGF5ZXIgbmFtZSBmb3IgTFYuCisgIFJlcG9ydCBwYXJ0aWFsIGFuZCBpbi1zeW5jIFJBSUQgYXR0cmlidXRlIGJhc2VkIG9uIGtlcm5lbCBzdGF0dXMKKyAgRml4IGJsa2RlYWN0aXZhdGUgdG8gaGFuZGxlIG5lc3RlZCBtb3VudHBvaW50cyBhbmQgbWFuZ2xlZCBtb3VudCBwYXRocy4KKyAgVXNlIExDX0FMTCB0byBzZXQgbG9jYWxlIGluIGRhZW1vbnMgYW5kIGZzYWRtIGluc3RlYWQgb2YgbG93ZXIgcHJpb3JpdHkgTEFORy4KKyAgQXZvaWQgY3Jhc2gtaW5kdWNpbmcgcmFjZSBpbiBsdm1ldGFkIHdoZW4gVkcgZGlzYXBwZWFycyBkdXJpbmcgcmVuYW1lLgorICBBZGQgbG9nL2RlYnVnX2NsYXNzZXMgdG8gbHZtLmNvbmYgdG8gY29udHJvbCBkZWJ1ZyBsb2cgbWVzc2FnZXMuCisgIFN5bmNocm9uaXplIHdpdGggdWRldiBpbiBwdnNjYW4gLS1jYWNoZSBhbmQgZml4IGRhbmdsaW5nIHVkZXZfc3luYyBjb29raWVzLgorICBGaXggYXV0b2FjdGl2YXRpb24gdG8gbm90IGF1dG9hY3RpdmF0ZSBWRy9MViBvbiBlYWNoIGNoYW5nZSBvZiB0aGUgUFZzIHVzZWQuCisgIExpbWl0IFJBSUQgZGV2aWNlIHJlcGxhY2VtZW50IHRvIHJlcGFpciBvbmx5IGlmIExWIGlzIG5vdCBpbi1zeW5jLgorICBEaXNhbGxvdyBSQUlEIGRldmljZSByZXBsYWNlbWVudCBvciByZXBhaXIgb24gaW5hY3RpdmUgTFZzLgorICBGaXggcG9zc2libGUgcmFjZSB3aGlsZSByZW1vdmluZyBtZXRhZGF0YSBmcm9tIGx2bWV0YWQuCisgIEZpeCBwb3NzaWJsZSBkZWFkbG9jayB3aGVuIHF1ZXJ5aW5nIGFuZCB1cGRhdGluZyBsdm1ldGFkIGF0IHRoZSBzYW1lIHRpbWUuCisgIENoZWNrIGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkIGFuZCByZWNhbGwgb25seSB3aGVuIG5lZWRlZCBpbiBfcHZfcmVhZC4KKyAgQ2hlY2sgZm9yIG1lbW9yeSBmYWlsdXJlIG9mIGRtX2NvbmZpZ193cml0ZV9ub2RlKCkgaW4gbHZtZXRhZC4KKyAgRml4IHNvY2tldCBsZWFrIG9uIGVycm9yIHBhdGggaW4gbHZtZXRhZCdzIGhhbmRsZV9jb25uZWN0LgorICBDaGVjayBmb3IgZmFpbGluZyBpZF9yZWFkX2Zvcm1hdCgpIGluIF9wdl9wb3B1bGF0ZV9sdm1jYWNoZS4KKyAgRml4IG1lbWxlYWsgb24gZXJyb3IgcGF0aCBmb3IgbHZtZXRhZCdzIHB2X2ZvdW5kLgorICBVbmxvY2sgdmcgbXV0ZXggaW4gZXJyb3IgcGF0aCB3aGVuIGx2bWV0YWQgdHJpZXMgdG8gbG9ja192Zy4KKyAgRGV0ZWN0IGtleSBzdHJpbmcgZHVwbGljYXRpb24gZmFpbHVyZSBpbiBjb25maWdfbWFrZV9ub2Rlc192IGluIGxpYmRhZW1vbi4KKyAgRGV0ZWN0IGZpZCBjcmVhdGlvbiBmYWlsdXJlIGluIF9zY2FuX2ZpbGUgaW4gZm9ybWF0X3RleHQuCisgIExvZyBvdXRwdXQgYWxzbyB0byBzeXNsb2cgd2hlbiBhYm9ydF9vbl9pbnRlcm5hbF9lcnJvciBpcyBzZXQuCisgIEFkZCBMViBzbmFwc2hvdCBzdXBwb3J0IHRvIGxpYmx2bSBhbmQgcHl0aG9uLWx2bS4KKyAgQXZvaWQgYSBnbG9iYWwgbG9jayBpbiBwdnMgd2hlbiBsdm1ldGFkIGlzIGluIHVzZS4KKyAgRml4IGNyYXNoIGluIHB2c2NhbiAtLWNhY2hlIC1hYXkgdHJpZ2dlcmVkIGJ5IG5vbi1tZGEgUFYuCisgIEFsbG93IGx2Y29udmVydCAtLXN0cmlwZXMvc3RyaXBlc2l6ZSBvbmx5IHdpdGggLS1taXJyb3JzLy0tcmVwYWlyLy0tdGhpbnBvb2wuCisgIEZpeCBtZW1sZWFrIGluIGRldmljZV9pc191c2FibGUgbWlycm9yIHRlc3RpbmcgZnVuY3Rpb24uCisgIERvIG5vdCBpZ25vcmUgLWYgaW4gbHZjb252ZXJ0IC0tcmVwYWlyIC15IC1mIGZvciBtaXJyb3IgYW5kIHJhaWQgdm9sdW1lcy4KKyAgRGlzYWxsb3cgcHZtb3ZlIG9uIFJBSUQgTFZzIHVudGlsIHRoZXkgYXJlIGFkZHJlc3NlZCBwcm9wZXJseQorICBBbGxvdyBlbXB0eSBhY3RpdmF0aW9uL3thdXRvX2FjdGl2YXRpb258cmVhZF9vbmx5fH1fdm9sdW1lX2xpc3QgY29uZmlnIG9wdGlvbi4KKyAgQWRkIGx2bS5jb25mIG9wdGlvbiBnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcy4KKyAgQWRkIGx2Y29udmVydCBzdXBwb3J0IHRvIHN3YXAgdGhpbiBwb29sIG1ldGFkYXRhIHZvbHVtZS4KKyAgSW1wbGVtZW50IGludGVybmFsIGZ1bmN0aW9uIGRldGFjaF9wb29sX21ldGFkYXRhX2x2KCkuCisgIEZpeCBsdm0yYXBwIHRvIHJldHVybiBhbGwgcHJvcGVydHkgc2l6ZXMgaW4gYnl0ZXMgKG5vdCBzZWN0b3JzKS4KKyAgUmVjb2duaXplIERNX0RJU0FCTEVfVURFViBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgYSBjb21wbGV0ZSBmYWxsYmFjay4KKyAgRG8gbm90IHZlcmlmeSB1ZGV2IG9wZXJhdGlvbnMgaWYgLS1ub3VkZXZzeW5jIGNvbW1hbmQgb3B0aW9uIGlzIHVzZWQuCisgIEZpeCBsdm0yYXBwIGFuZCByZXR1cm4gbHZzZWcgZGlzY2FyZHMgcHJvcGVydHkgYXMgc3RyaW5nLgorICBBbGxvdyB2Z2NmZ3Jlc3RvcmUgb2YgbHZtMiBtZXRhZGF0YSB3aXRoIHRoaW4gdm9sdW1lcyBpZiAtLWZvcmNlIGlzIHVzZWQuCisgIFJlY29nbmlzZSBTdG9yYWdlIENsYXNzIE1lbW9yeSAoSUJNIFMvMzkwKSBkZXZpY2VzIGluIGZpbHRlci4KKyAgUmVjb2duaXNlIFNURUMgc2tkIGRldmljZXMgaW4gZmlsdGVyLgorICBSZWNvZ25pc2UgVmlvbGluIE1lbW9yeSB2dG1zIGRldmljZXMgaW4gZmlsdGVyLgorICBBZGQgbHZtLmNvbmYgdGhpbiBwb29sIGFsbG9jYXRpb24gc2V0dGluZ3MgdGhpbl9wb29sX3tjaHVua19zaXplfGRpc2NhcmRzfHplcm99LgorICBTdXBwb3J0IGRpc2NhcmRzIGZvciBub24tcG93ZXItb2YtMiB0aGluIHBvb2wgY2h1bmtzLgorICBBdXRvbWF0aWNhbGx5IHJlc3RvcmUgTUlTU0lORyBQVnMgd2l0aCBubyBNREFzLgorICBXaGVuIG5vIC0tc3RyaXBlcyBhcmd1bWVudCBpcyBnaXZlbiB3aGVuIGNyZWF0aW5nIGEgUkFJRDEwIHZvbHVtZSwgZGVmYXVsdCB0byAyIHN0cmlwZXMuCisgIERvIG5vdCBhbGxvdyBsdmNvbnZlcnQgLS1zcGxpdG1pcnJvcnMgb24gUkFJRDEwIGxvZ2ljYWwgdm9sdW1lcy4KKyAgU2tpcCBtbG9ja2luZyBbdmVjdG9yc10gb24gYXJtIGFyY2hpdGVjdHVyZS4KKyAgU3VwcG9ydCBhbGxvY2F0aW9uIG9mIHBvb2wgbWV0YWRhdGEgd2l0aCBsdmNvbnZlcnQgY29tbWFuZC4KKyAgTW92ZSBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgdGhpbiBsdmNyZWF0ZSBhbmQgbHZjb252ZXJ0IHRvIHRvb2xsaWIuCisgIFJlcGFpciBhIG1pcnJvcmVkIGxvZyBiZWZvcmUgdGhlIG1pcnJvciBpdHNlbGYgd2hlbiBib3RoIGZhaWwuCisgIEFkZCBweXRob24tbHZtIHVuaXQgdGVzdCBjYXNlCisgIEV4aXQgcHZzY2FuIC0tY2FjaGUgaW1tZWRpYXRlbHkgaWYgY2x1c3RlciBsb2NraW5nIHVzZWQgb3IgbHZtZXRhZCBub3QgdXNlZC4KKyAgRG9uJ3QgdXNlIGx2bWV0YWQgaW4gbHZtMi1tb25pdG9yLnNlcnZpY2UgRXhlY1N0b3AgdG8gYXZvaWQgYSBzeXN0ZW1kIGlzc3VlLgorICBSZW1vdmUgZGVwZW5kZW5jeSBvbiBmZWRvcmEtc3RvcmFnZS1pbml0LnNlcnZpY2UgaW4gbHZtMiBzeXN0ZW1kIHVuaXRzLgorICBEZXBlbmQgb24gbHZtMi1sdm1ldGFkLnNvY2tldCBpbiBsdm0yLW1vbml0b3Iuc2VydmljZSBzeXN0ZW1kIHVuaXQuCisgIEhhcmRjb2RlIHVzZV9sdm1ldGFkPTAgaWYgY2x1c3RlciBsb2NraW5nIHVzZWQgYW5kIGlzc3VlIGEgd2FybmluZyBtc2cuCisgIEF2b2lkIHRyeWluZyB0byByZWFkIGEgbWlycm9yIHRoYXQgaGFzIGEgZmFpbGVkIGRldmljZSBpbiBpdHMgbWlycm9yZWQgbG9nLgorICBSZWxheCBpZ25vcmVfc3VzcGVuZGVkX2RldmljZXMgdG8gcmVhZCBmcm9tIG1pcnJvcnMgdGhhdCBkb24ndCBoYXZlIGEgZGV2aWNlIG1hcmtlZCBmYWlsZWQuCisgIENoYW5nZSBsdnMgaGVhZGluZyBDb3B5JSB0byBDcHklU3luYyBhbmQgcHJpbnQgUkFJRDQvNS82IHN5bmMlIHRoZXJlIHRvby4KKyAgRml4IGNsdm1kIHN1cHBvcnQgZm9yIG9wdGlvbiAtZCBhbmQgcHJvcGVybHkgdXNlIGl0cyBhcmd1bWVudC4KKyAgU3VwcG9ydCB1c2Ugb2Ygb3B0aW9uIC0teWVzIGZvciBsdmNoYW5nZSAtLXBlcnNpc3RlbnQuCisgIEZpeCBtZW1vcnkgbGVhayBvbiBlcnJvciBwYXRoIGZvciBwdmNyZWF0ZSB3aXRoIGludmFsaWQgdXVpZC4KKyAgSW1wbGVtZW50IHJlZi1jb3VudGluZyBmb3IgcGFyZW50cyBpbiBweXRob24gbGliLgorICBBZGQgbHZfaXNfYWN0aXZlX2xvY2FsbHkgYW5kIHVzZSBpbnN0ZWFkIG9mIG1vc3QgbG9jYWwgbHZfaW5mbyBjYWxscy4KKyAgUmVkdWNlIHNvbWUgbG9nX2Vycm9yIG1lc3NhZ2VzIHRvIGxvZ193YXJuIHdoZXJlIHdlIGRvbid0IGZhaWwuCisgIFJlbW92ZSBweXRob24gbGlibHZtIG9iamVjdC4gc3lzdGVtZGlyIGNhbiBvbmx5IGJlIGNoYW5nZWQgdXNpbmcgZW52IHZhciBub3cuCisgIAorVmVyc2lvbiAyLjAyLjk4IC0gMTV0aCBPY3RvYmVyIDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN3aXRjaCBmcm9tIERFQlVHKCkgdG8gREVCVUdMT0coKSBpbiBsdm1ldGFkIGFzIC1EREVCVUcgaXMgYWxyZWFkeSB1c2VkLgorICBQcm9oaWJpdCBub3QgeWV0IHN1cHBvcnRlZCBjaGFuZ2Ugb2YgdGhpbi1wb29sIHRvIHJlYWQtb25seS4KKyAgU3VwcG9ydCBjcmVhdGlvbiBvZiByZWFkLW9ubHkgdGhpbiB2b2x1bWVzIChsdmNyZWF0ZSAtcCByKS4KKyAgVXNpbmcgYXV0b2V4dGVuZCBwZXJjZW50IDAgZm9yIHRoaW4gcG9vbCBmYWlscyAnbHZleHRlbmQgLS11c2UtcG9saWNpZXMnLgorICBJbnRyb2R1Y2UgYmxrZGVhY3RpdmF0ZSBzY3JpcHQgdG8gZGVhY3RpdmF0ZSBibG9jayBkZXZzIHdpdGggZGVwZW5kZW5jaWVzLgorICBJbXBsZW1lbnQgZGV2aWNlcy9nbG9iYWxfZmlsdGVyIHRvIGhpZGUgZGV2aWNlcyBmcm9tIGx2bWV0YWQuCisgIE1ha2UgdmdzY2FuIC0tY2FjaGUgYW4gYWxpYXMgZm9yIHB2c2NhbiAtLWNhY2hlLgorICBDbGVhciBsdm1ldGFkIG1ldGFkYXRhL1BWIGNhY2hlIGJlZm9yZSBhIHJlc2Nhbi4KKyAgRml4IGEgc2VnbWVudGF0aW9uIGZhdWx0IHVwb24gcmVjZWl2aW5nIGEgY29ycnVwdCBsdm1ldGFkIHJlc3BvbnNlLgorICBHaXZlIGluY29uc2lzdGVudCBtZXRhZGF0YSB3YXJuaW5ncyBpbiBwdnNjYW4gLS1jYWNoZS4KKyAgTWFrZSBsdnJlbW92ZSBhc2sgYmVmb3JlIGRpc2NhcmRpbmcgZGF0YSBhcmVhcy4KKyAgQXZvaWQgb3ZlcmxhcHBpbmcgbG9ja3MgdGhhdCBjb3VsZCBjYXVzZSBhIGRlYWRsb2NrIGluIGx2bWV0YWQuCisgIEZpeCBtZW1vcnkgbGVha3MgaW4gbGliZGFlbW9uIGFuZCBsdm1ldGFkLgorICBPcHRpbWl6ZSBsaWJkYWVtb24gbG9nZ2luZyBmb3IgYSBmYXN0IG5vLW91dHB1dCBwYXRoLgorICBPbmx5IGNyZWF0ZSBsdm1ldGFkIHBpZGZpbGUgd2hlbiBydW5uaW5nIGFzIGEgZGFlbW9uIChubyAtZikuCisgIFdhcm4gaWYgbHZtZXRhZCBpcyBydW5uaW5nIGJ1dCBkaXNhYmxlZC4KKyAgV2FybiBhYm91dCBydW5uaW5nIGx2bWV0YWQgd2l0aCB1c2VfbHZtZXRhZCA9IDAgaW4gZXhhbXBsZS5jb25mLgorICBVcGRhdGUgbHZtZXRhZCBoZWxwIG91dHB1dCAoZmxhZ3MgYW5kIHRoZWlyIG1lYW5pbmcpLgorICBNYWtlIHB2c2NhbiAtLWNhY2hlIHJlYWQgbWV0YWRhdGEgZnJvbSBMVk0xIFBWcy4KKyAgTWFrZSBsaWJkYWVtb24gYnVmZmVyIGhhbmRsaW5nIGFzeW1wdG90aWNhbGx5IG1vcmUgZWZmaWNpZW50LgorICBBZGQgbHZtZHVtcCAtbCwgdG8gY29sbGVjdCBhIHN0YXRlIGR1bXAgZnJvbSBsdm1ldGFkLgorICBNYWtlIC0tc3lzaW5pdCBzdXBwcmVzcyBsdm1ldGFkIGNvbm5lY3Rpb24gZmFpbHVyZSB3YXJuaW5ncy4KKyAgUHJvaGliaXQgdXNhZ2Ugb2YgbHZjcmVhdGUgLS10aGlucG9vbCB3aXRoIC0tbWlycm9ycy4KKyAgRml4IGx2bTJhcGkgb3JpZ2luIHJlcG9ydGluZyBmb3IgdGhpbiBzbmFwc2hvdCB2b2x1bWUuCisgIEFkZCBjb25maWd1cmUgLS1lbmFibGUtcHl0aG9uX2JpbmRpbmdzIGZvciBsaWJsdm0yYXBwIHRvIG5ldyBweXRob24gc3ViZGlyLgorICBBZGQgaW1wbGVtZW50YXRpb24gb2YgbHZtMmFwaSBmdW5jdGlvbiBsdm1fcGVyY2VudF90b19mbG9hdC4KKyAgQWxsb3cgbm9uIHBvd2VyIG9mIDIgdGhpbiBjaHVuayBzaXplcyBpZiB0aGluIHBvb2wgZHJpdmVyIHN1cHBvcnRzIHRoYXQuCisgIEFsbG93IGxpbWl0ZWQgbWV0YWRhdGEgY2hhbmdlcyB3aGVuIFBWcyBhcmUgbWlzc2luZyB2aWEgW3ZnfGx2XWNoYW5nZS4KKyAgRG8gbm90IHN0YXJ0IGRtZXZlbnRkIGZvciBsdmNoYW5nZSAtLXJlc3luYyB3aGVuIG1vbml0b3JpbmcgaXMgb2ZmLgorICBSZW1vdmUgcHZzY2FuIC0tY2FjaGUgZnJvbSBsdm0yLWx2bWV0YWQgaW5pdCBzY3JpcHQuCisgIFJlbW92ZSBFeGVjU3RhcnRQb3N0IHdpdGggcHZzY2FuIC0tY2FjaGUgZnJvbSBsdm0yLWx2bWV0YWQuc2VydmljZS4KKyAgUmVwb3J0IGludmFsaWQgcGVyY2VudGFnZSBmb3IgcHJvcGVydHkgc25hcF9wZXJjZW50IG9mIG5vbi1zbmFwaG90IExWcy4KKyAgRGlzYWxsb3cgY29udmVyc2lvbiBvZiB0aGluIExWcyB0byBtaXJyb3JzLgorICBGaXggbHZtMmFwaSBkYXRhX3BlcmNlbnQgcmVwb3J0aW5nIGZvciB0aGluIHZvbHVtZXMuCisgIERvIG5vdCBhbGxvdyBSQUlEIExWcyBpbiBhIGNsdXN0ZXJlZCB2b2x1bWUgZ3JvdXAuCisgIEFkZCAtLWRpc2NhcmRzIHRvIGx2Y29udmVydC4KKyAgQWRkIC0tcG9vbG1ldGFkYXRhIHRvIGx2Y29udmVydCBhbmQgc3VwcG9ydCB0aGluIG1ldGEvZGF0YSBkZXYgc3RhY2tpbmcuCisgIFN1cHBvcnQgY2hhbmdlcyBvZiBwZXJtaXNzaW9ucyBmb3IgdGhpbiBzbmFwc2hvdCB2b2x1bWVzLgorICBFbmhhbmNlIGluc2VydF9sYXllcl9mb3JfbHYoKSB3aXRoIHJlY3Vyc2l2ZSByZW5hbWUgZm9yIF90ZGF0YSBMVnMuCisgIFNraXAgYnVpbGRpbmcgZG0gdHJlZSBmb3IgdGhpbiBwb29sIHdoZW4gY2FsbGVkIHdpdGggb3JpZ2luX29ubHkgZmxhZy4KKyAgQWRkIGludGVybmFsIGx2X3JlbmFtZV91cGRhdGUoKSB0byByZW5hbWUgTFYgd2l0aG91dCB1cGRhdGluZyBtZGEuCisgIEVuc3VyZSBkZXNjcmlwdG9ycyAwLDEsMiBhcmUgYWx3YXlzIGF2YWlsYWJsZSwgdXNpbmcgL2Rldi9udWxsIGlmIG5lY2Vzc2FyeS4KKyAgVXNlIC9wcm9jL3NlbGYvZmQgd2hlbiBhdmFpbGFibGUgZm9yIGNsb3Npbmcgb3BlbmVkIGRlc2NyaXB0b3JzIGVmZmljaWVudGx5LgorICBBZGQgbWlzc2luZyBwa2cgaW5pdCB3aXRoIC0tZW5hYmxlLXRlc3RpbmcgaW4gY29uZmlndXJlLmluICgyLjAyLjcxKS4KKyAgRml4IGluYWJpbGl0eSB0byBjcmVhdGUsIGV4dGVuZCBvciBjb252ZXJ0IHRvIGEgbGFyZ2UgKD4gMVRpQikgUkFJRCBMVi4KKyAgU3BsaXQgb3V0IGRhZW1vbi1pbyBmcm9tIGRhZW1vbi1zaGFyZWQgYW5kIGFsd2F5cyBidWlsZCBsaWJkYWVtb25jbGllbnQuCisgIFVwZGF0ZSBsdm1ldGFkIGNvbW11bmljYXRpb25zIHRvIGNvcGUgd2l0aCBjbGllbnRzIHVzaW5nIGRpZmZlcmVudCBmaWx0ZXJzLgorICBBZGQgKHApYXJ0aWFsIGF0dHJpYnV0ZSB0byBsdnMuCisgIERvbid0IHRyeSB0byBpc3N1ZSBkaXNjYXJkcyB0byBhIG1pc3NpbmcgUFYgdG8gYXZvaWQgc2VnZmF1bHQuCisgIENsZWFyIExWX05PU1lOQ0VEIGZsYWcgd2hlbiBhIFJBSUQxIExWIGlzIGNvbnZlcnRlZCB0byBhIGxpbmVhciBMVi4KKyAgRGlzYWxsb3cgUkFJRDEgdXBjb252ZXJ0IGlmIHRoZSBMViB3YXMgY3JlYXRlZCB3aXRoIC0tbm9zeW5jLgorICBEZXBlbmQgb24gc3lzdGVtZC11ZGV2LXNldHRsZSBpbiB1bml0cyBnZW5lcmF0ZWQgYnkgYWN0aXZhdGlvbiBnZW5lcmF0b3IuCisgIEZpeCB2Z2NoYW5nZSAtYWF5IG5vdCB0byBhY3RpdmF0ZSBub24tbWF0Y2hpbmcgTFZzIHRoYXQgZm9sbG93IGEgbWF0Y2hpbmcgTFYuCisgIEZpeCBsdmNoYW5nZSAtLXJlc3luYyBmb3IgUkFJRCBMVnMgd2hpY2ggaGFkIG5vIGVmZmVjdC4KKyAgUmVzdHJ1Y3R1cmUgbWlycm9yIHJlc3luYyBjb2RlLgorICBEaXNhbGxvdyBhZGRpdGlvbiBvZiBSQUlEIGltYWdlcyB1bnRpbCB0aGUgYXJyYXkgaXMgaW4tc3luYy4KKyAgRml4IFJBSUQgTFYgY3JlYXRpb24gd2l0aCAnLS10ZXN0JyBzbyB2YWxpZCBjb21tYW5kcyBkbyBub3QgZmFpbC4KKyAgQWRkIGx2bV9sdl9yZW5hbWUoKSB0byBsdm0yYXBpLgorICBGaXggc2V0dmJ1ZiBjb2RlIGJ5IGNsb3NpbmcgYW5kIHJlb3BlbmluZyBzdHJlYW0gYmVmb3JlIGNoYW5naW5nIGJ1ZmZlci4KKyAgRGlzYWJsZSBwcml2YXRlIGJ1ZmZlcmluZyB3aGVuIHVzaW5nIGxpYmx2bS4KKyAgV2hlbiBwcml2YXRlIHN0ZGluL3N0ZG91dCBidWZmZXJpbmcgaXMgbm90IHVzZWQgYWx3YXlzIHVzZSBzaWxlbnQgbW9kZS4KKyAgQWRkIGxvZy9zaWxlbnQgdG8gbHZtLmNvbmYgZXF1aXZhbGVudCB0byAtcXEuCisgIFN1cHByZXNzIG5vbi1lc3NlbnRpYWwgc3Rkb3V0IHdpdGggLXFxLgorICBTd2l0Y2ggbm9uLWVzc2VudGlhbCBsb2dfcHJpbnQgbWVzc2FnZXMgdG8gbG9nX3ByaW50X3VubGVzc19zaWxlbnQuCisgIFVzZSAtcSBhcyBzaG9ydCBmb3JtIG9mIC0tcXVpZXQuCisgIEFkZCBSQUlEMTAgc3VwcG9ydCAoLS10eXBlIHJhaWQxMCkuCisgIFJldXNlIF9yZWxvYWRfbHYoKSBpbiBtb3JlIGx2Y29udmVydCBmdW5jdGlvbnMuCisgIEZpeCAzMi1iaXQgZGV2aWNlIHNpemUgYXJpdGhtZXRpYyBuZWVkaW5nIDY0LWJpdCBjYXN0aW5nIHRocm91Z2hvdXQgdHJlZS4KKyAgUmVtb3ZlIG51bWVyb3VzIHVubmVjZXNzYXJ5ICNpbmNsdWRlcyBhbmQgdGhlIGVtcHR5IHV0aWwuYy4KKyAgRml4IGRlcmVmZXJlbmNlIG9mIE5VTEwgaW4gbHZtZXRhZCBlcnJvciBwYXRoIGxvZ2dpbmcuCisgIEZpeCBidWZmZXIgbWVtb3J5IGxlYWsgaW4gbHZtZXRhZCBsb2dnaW5nLgorICBBZGQgc3VwcG9ydCBmb3IgbHZjcmVhdGUgLS1kaXNjYXJkcy4KKyAgQ29ycmVjdCB0aGUgZGlzY2FyZHMgZmllbGQgaW4gdGhlIGx2cyBtYW5wYWdlICgyLjAyLjk3KS4KKyAgVXNlIHByb3BlciBjb25kaXRpb24gdG8gY2hlY2sgZm9yIGRpc2NhcmRzIHNldHRpbmdzIHVuc3VwcG9ydGVkIGJ5IGtlcm5lbC4KKyAgUmVpbnN0YXRlIGNvcnJlY3QgZGVmYXVsdCB0byBpZ25vcmUgZGlzY2FyZHMgZm9yIHRoaW4gbWV0YWRhdGEgZnJvbSBvbGQgdG9vbHMuCisgIElzc3VlIGVycm9yIG1lc3NhZ2Ugd2hlbiAtaSBhbmQgLW0gYXJncyBkbyBub3QgbWF0Y2ggc3BlY2lmaWVkIFJBSUQgdHlwZS4KKyAgQ2hhbmdlIGx2bWV0YWQgbG9nZ2luZyBzeW50YXggZnJvbSAtZGRkIHRvIC1sIHthbGx8d2lyZXxkZWJ1Z30uCisgIEFkZCBuZXcgbGliZGFlbW9uIGxvZ2dpbmcgaW5mcmFzdHJ1Y3R1cmUuCisKK1ZlcnNpb24gMi4wMi45NyAtIDd0aCBBdWd1c3QgMjAxMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEltcHJvdmUgZG9jdW1lbnRpb24gb2YgYWxsb2NhdGlvbiBwb2xpY2llcyBpbiBsdm0uOC4KKyAgSW5jcmVhc2UgbGltaXQgZm9yIG1ham9yOm1pbm9yIHRvIDQwOTU6MTA0ODU3NSB3aGVuIHVzaW5nIC1NeSBvcHRpb24uCisgIEFkZCBtYWtlIGluc3RhbGxfc3lzdGVtZF9nZW5lcmF0b3JzLgorICBBZGQgZ2VuZXJhdG9yIGZvciBsdm0yIGFjdGl2YXRpb24gc3lzdGVtZCB1bml0cy4KKyAgQWRkIGx2bV9jb25maWdfZmluZF9ib29sIGx2bTJhcHAgZm4gdG8gcmV0cmlldmUgYm9vbCB2YWx1ZSBmcm9tIGNvbmZpZyB0cmVlLgorICBSZXNwZWN0IC0tdGVzdCB3aGVuIHVzaW5nIGx2bWV0YWQuCisgIE5vIGxvbmdlciBjYXBpdGFsaXNlIGZpcnN0IExWIGF0dHJpYnV0ZSBjaGFyIGZvciBpbnZhbGlkIHNuYXBzaG90cy4KKyAgQWxsb3cgdmdleHRlbmQgdG8gYWRkIFBWcyB0byBhIFZHIHRoYXQgaXMgbWlzc2luZyBQVnMuCisgIFJlY29nbmlzZSBNaWNyb24gUENJZSBTU0RzIGluIGZpbHRlciBhbmQgbW92ZSBhcnJheSBvdXQgdG8gZGV2aWNlLXR5cGVzLmguCisgIEZpeCBkdW1wY29uZmlnIDxub2RlPiB0byBwcmludCBvbmx5IDxub2RlPiB3aXRob3V0IGl0cyBzaWJsaW5ncy4gKDIuMDIuODkpCisgIERvIG5vdCBpc3N1ZSAiRmFpbGVkIHRvIGhhbmRsZSBhIGNsaWVudCBjb25uZWN0aW9uIiBlcnJvciBpZiBsdm1ldGFkIGtpbGxlZC4KKyAgU3VwcG9ydCBsdmNoYW5nZSAtLWRpc2NhcmRzIGFuZCAtWiB3aXRoIHRoaW4gcG9vbHMuCisgIEFkZCBkaXNjYXJkIExWIHNlZ21lbnQgZmllbGQgdG8gcmVwb3J0cy4KKyAgQWRkIC0tZGlzY2FyZHMgdG8gbHZjcmVhdGUgLS10aGluLgorICBTZXQgZGlzY2FyZCBhbmQgZXh0ZXJuYWwgc25hcHNob3QgZmVhdHVyZXMgaWYgdGhpbiBwb29sIHRhcmdldCBpcyB2c24gMS4xKy4KKyAgQ291bnQgcGVyY2VudGFnZSBvZiBjb21wbGV0ZW5lc3MgdXB3YXJkcyBub3QgZG93bndhcmRzIHdoZW4gbWVyZ2luZyBzbmFwc2hvdC4KKyAgU2tpcCBhY3RpdmF0aW9uIHdoZW4gdXNpbmcgdmcvbHZjaGFuZ2UgLS1zeXNpbml0IC1hIGF5IGFuZCBsdm1ldGFkIGlzIGFjdGl2ZS4KKyAgRml4IGV4dGVuZGluZyBSQUlEIDQvNS82IGxvZ2ljYWwgdm9sdW1lcworICBGaXggdGVzdCBmb3IgUFYgd2l0aCB1bmtub3duIFZHIGluIHByb2Nlc3NfZWFjaF9wdiB0byBpZ25vcmUgaWdub3JlZCBtZGFzLgorICBVcGRhdGUgbWFuIHBhZ2VzIHdpdGggLS1hY3RpdmF0ZSBheSBvcHRpb24gYW5kIGF1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdC4KKyAgRml4IF9hbGxvY19wYXJhbGxlbF9hcmVhIHRvIGF2b2lkIHBpY2tpbmcgYWxyZWFkeS1mdWxsIGFyZWFzIGZvciByYWlkIGRldmljZXMuCisgIFVzZSB2Z2NoYW5nZSAtYWF5IGluc3RlYWQgb2YgdmdjaGFuZ2UgLWF5IGluIGNsbXZkIGluaXQgc2NyaXB0LgorICBBZGQgYWN0aXZhdGlvbi9hdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3QgdG8gbHZtLmNvbmYuCisgIEFkZCAtLWFjdGl2YXRlIGF5IHRvIGx2Y3JlYXRlLCBsdmNoYW5nZSwgcHZzY2FuIGFuZCB2Z2NoYW5nZS4KKyAgQWRkIHN1cHBvcnQgZm9yIHZvbHVtZSBhdXRvYWN0aXZhdGlvbiB1c2luZyBsdm1ldGFkLgorICBBZGQgLS1hY3RpdmF0ZSBzeW5vbnltIGZvciAtLWF2YWlsYWJsZSBhcmcgYW5kIHByZWZlciAtLWFjdGl2YXRlLgorICBOZXZlciBpc3N1ZSBkaXNjYXJkcyB3aGVuIExWIGV4dGVudHMgYXJlIGJlaW5nIHJlY29uZmlndXJlZCwgbm90IGRlbGV0ZWQuCisgIEFsbG93IHJlbGVhc2VfbHZfc2VnbWVudF9hcmVhIHRvIGZhaWwgYXMgZnVuY3Rpb25zIGl0IGNhbGxzIGNhbiBmYWlsLgorICBPcGVuIGRldmljZSByZWFkLW9ubHkgaW5zdGVhZCBvZiByZWFkLXdyaXRlIHdoZW4gb2J0YWluaW5nIHJlYWRhaGVhZCB2YWx1ZS4KKyAgRml4IGx2Y29udmVydCB0aGluIHBvb2wgZXJyb3IgcGF0aCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuCisgIERldGVjdCBjcmVhdGVfaW5zdGFuY2UoKSBmYWlsdXJlIGluIHB2c2Nhbl9sdm1ldGFkX3NpbmdsZSgpLgorICBVc2UgNjQtYml0IGNhbGN1bGF0aW9ucyBmb3IgcmVzZXJ2ZWQgbWVtb3J5IGFuZCBzdGFjay4KKyAgRml4IG1pc3Npbmcgc3luYyBvZiBmaWxlc3lzdGVtIHdoZW4gY3JlYXRpbmcgdGhpbiB2b2x1bWUgc25hcHNob3QuCisKK1ZlcnNpb24gMi4wMi45NiAtIDh0aCBKdW5lIDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXBzdHJlYW0gc291cmNlIHJlcG8gbm93IGZlZG9yYWhvc3RlZC5vcmcgZ2l0IG5vdCBzb3VyY2VzLnJlZGhhdC5jb20gQ1ZTLgorICBGaXggZXJyb3IgcGF0aHMgZm9yIHJlZ2V4IGZpbHRlciBpbml0aWFsaXphdGlvbi4KKyAgUmUtZW5hYmxlIHBhcnRpYWwgYWN0aXZhdGlvbiBvZiBub24tdGhpbiBMVnMgdW50aWwgaXQgY2FuIGJlIGZpeGVkLiAoMi4wMi45MCkKKyAgRml4IGFsbG9jIGNsaW5nIHRvIGNsaW5nIHRvIFBWcyBhbHJlYWR5IGZvdW5kIHdpdGggY29udGlndW91cyBwb2xpY3kuCisgIEZpeCBjbGluZyBwb2xpY3kgbm90IHRvIGJlaGF2ZSBsaWtlIG5vcm1hbCBwb2xpY3kgaWYgbm8gcHJldmlvdXMgTFYgc2VnLgorICBGaXggYWxsb2NhdGlvbiBsb29wIG5vdCB0byB1c2UgbGF0ZXIgcG9saWNpZXMgd2hlbiAtLWFsbG9jIGNsaW5nIHdpdGhvdXQgdGFncy4KKyAgQXBwZW5kIF9UT19MVlNFRyB0byBuYW1lcyBvZiBpbnRlcm5hbCBBX0NPTlRJR1VPVVMgYW5kIEFfQ0xJTkcgZmxhZ3MuCisgIEFkZCBtaXNzaW5nIHBrZyBpbml0IC0td2l0aC1zeXN0ZW1kc3lzdGVtdW5pdGRpciBpbiBjb25maWd1cmUuaW4gKDIuMDIuOTIpLgorICBGaXggZGl2aXNpb24gYnkgemVybyBpZiBQViB3aXRoIHplcm8gUEUgY291bnQgaXMgdXNlZCBkdXJpbmcgdmdjZmdyZXN0b3JlLgorICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aGluIHBvb2wgbHZjb252ZXJ0LgorICBGaXggbHZyZW5hbWUgZm9yIHRoaW4gdm9sdW1lcyAocmVncmVzc2lvbiBpbiBmb3JfZWFjaF9zdWJfbHYpLiAoMi4wMi44OSkKKyAgRml4IHVwLWNvbnZlcnQgd2hlbiBtaXJyb3IgYWN0aXZhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHZvbHVtZV9saXN0IGFuZCB0YWdzLgorICBXYXJuIG9mIGRlYWRsb2NrIHJpc2sgd2hlbiB1c2luZyBzbmFwc2hvdHMgb2YgbWlycm9yIHNlZ21lbnQgdHlwZS4KKyAgRml4IGJ1ZyBpbiBjbWlycm9yIHRoYXQgY2F1c2VkIGluY29ycmVjdCBzdGF0dXMgaW5mbyB0byBwcmludCBvbiBzb21lIG5vZGVzLgorICBSZW1vdmUgc3RhdGVtZW50IHRoYXQgc25hcHNob3RzIGNhbm5vdCBiZSB0YWdnZWQgZnJvbSBsdm0gbWFuIHBhZ2UuCisgIERpc2FsbG93IGNoYW5naW5nIGNsdXN0ZXIgYXR0cmlidXRlIG9mIFZHIHdoaWxlIFJBSUQgTFZzIGFyZSBhY3RpdmUuCisgIEZpeCBsdmNvbnZlcnQgZXJyb3IgbWVzc2FnZSBmb3Igbm9uLW1lcmdlYWJsZSB2b2x1bWVzLgorICBBbGxvdyBzdWJzZXQgb2YgZmFpbGVkIGRldmljZXMgdG8gYmUgcmVwbGFjZWQgaW4gUkFJRCBMVnMuCisgIFByZXZlbnQgcmVzdW1lIGZyb20gY3JlYXRpbmcgZXJyb3IgZGV2aWNlcyB0aGF0IGFscmVhZHkgZXhpc3QgZnJvbSBzdXNwZW5kLgorICBJbXByb3ZlIGNsbXZkIHNpbmdsZW5vZGUgbG9ja2luZyBmb3IgYmV0dGVyIHRlc3RpbmcuCisgIFVwZGF0ZSBhbmQgY29ycmVjdCBsdnMgbWFuIHBhZ2Ugd2l0aCBzdXBwb3J0ZWQgY29sdW1uIG5hbWVzLgorICBIYW5kbGUgcmVwbGFjZW1lbnQgb2YgYW4gYWN0aXZlIGRldmljZSB0aGF0IGdvZXMgbWlzc2luZyB3aXRoIGFuIGVycm9yIGRldmljZS4KKyAgQ2hhbmdlIGNoYW5nZSByYWlkMSBzZWd0eXBlIGFsd2F5cyB0byByZXF1ZXN0IGEgZmx1c2ggd2hlbiBzdXNwZW5kaW5nLgorICBBZGQgdWRldiBpbmZvIGFuZCBjb250ZXh0IHRvIGx2bWR1bXAuCisgIEFkZCBsdm1ldGFkIG1hbiBwYWdlLgorICBGaXggUkFJRCBkZXZpY2UgcmVwbGFjZW1lbnQgY29kZSBzbyB0aGF0IGl0IHdvcmtzIHVuZGVyIHNuYXBzaG90LgorICBGaXggaW5hYmlsaXR5IHRvIHNwbGl0IFJBSUQxIGltYWdlIHdoaWxlIHNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIFBWLgorICBVcGRhdGUgbWFuIHBhZ2VzIHRvIGdpdmUgdGhlbSBhbGwgdGhlIHNhbWUgbG9vayZmZWVsLgorICBGaXggbHZyZXNpemUgb2YgdGhpbiBwb29sIGZvciBzdHJpcGVkIGRldmljZXMuCisgIEZvciBsdnJlc2l6ZSByb3VuZCB1cHdhcmQgd2hlbiBzcGVjaWZ5aW5nIG51bWJlciBvZiBleHRlbnRzLgorICBGb3IgbHZjcmVhdGUgd2l0aCAlRlJFRSBzdXBwb3J0IHJvdW5kaW5nIGRvd253YXJkIHN0cmlwZSBhbGlnbm1lbnQuCisgIENoYW5nZSBtZXNzYWdlIHNldmVyaXR5IHRvIGxvZ192ZXJ5X3ZlcmJvc2UgZm9yIG1pc3NpbmcgZGV2IGluZm8gaW4gdWRldiBkYi4KKyAgRml4IGx2Y29udmVydCB3aGVuIHNwZWNpZnlpbmcgcmVtb3ZhbCBvZiBhIFJBSUQgZGV2aWNlIG90aGVyIHRoYW4gbGFzdCBvbmUuCisgIEZpeCBhYmlsaXR5IHRvIGhhbmRsZSBmYWlsdXJlcyBpbiBtaXJyb3JlZCBsb2cgaW4gZG1ldmVudGQgcGx1Z2luLiAoMi4wMi44OSkKKyAgRml4IHVubG9ja2luZyB2b2x1bWUgZ3JvdXAgaW4gdmdyZWR1Y2UgaW4gZXJyb3IgcGF0aC4KKyAgQ29wZSB3aGVuIFZHIG5hbWUgaXMgcGFydCBvZiB0aGUgc3VwcGxpZWQgbmFtZSBpbiBsdmNvbnZlcnQgLS1zcGxpdG1pcnJvcnMgLW4uCisgIEZpeCBleGNsdXNpdmUgbHZjaGFuZ2UgcnVubmluZyBmcm9tIG90aGVyIG5vZGUuICgyLjAyLjg5KQorICBBZGQgJ3Znc2NhbiAtLWNhY2hlJyBmdW5jdGlvbmFsaXR5IGZvciBjb25zaXN0ZW5jeSB3aXRoICdwdnNjYW4gLS1jYWNoZScuCisgIEtlZXAgZXhjbHVzaXZlIGFjdGl2YXRpb24gaW4gcHZtb3ZlIGlmIExWIGlzIGFscmVhZHkgYWN0aXZlLgorICBEaXNhbGxvdyBleGNsdXNpdmUgcHZtb3ZlIGlmIHNvbWUgYWZmZWN0ZWQgTFZzIGFyZSBub3QgZXhjbHVzaXZlbHkgYWN0aXZhdGVkLgorICBSZW1vdmUgdW51c2VkIGFuZCB3cm9uZ2x5IHNldCBjbHVzdGVyIFZHIGZsYWcgZnJvbSBjbHZtZCBsb2NrIHF1ZXJ5IGNvbW1hbmQuCisgIEZpeCBwdm1vdmUgZm9yIGV4Y2x1c2l2ZWx5IGFjdGl2YXRlZCBMViBwdm1vdmUgaW4gY2x1c3RlcmVkIFZHLiAoMi4wMi44NikKKyAgQWx3YXlzIGZyZWUgaGFzaCB0YWJsZSBvbiB1cGRhdGVfcHZpZF90b192Z2lkKCkgaW4gbHZtZXRhZC4KKyAgVXBkYXRlIGFuZCBmaXggbW9uaXRvcmluZyBvZiB0aGluIHBvb2wgZGV2aWNlcy4KKyAgQ2hlY2sgaGFzaCBpbnNlcnQgc3VjY2VzcyBpbiBsb2NrX3ZnIGluIGNsdm1kLgorICBDaGVjayBmb3IgYnVmZmVyIG92ZXJ3cml0ZSBpbiBnZXRfY2x1c3Rlcl90eXBlKCkgaW4gY2x2bWQuCisgIEZpeCBnbG9iYWwvZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24gY29uZmlnIGNoZWNrLgorICBVcGRhdGUgbGNvdiBNYWtlZmlsZSB0YXJnZXQgdG8gc3VwcG9ydCBhbGwgZG1ldmVudGQgcGx1Z2lucy4KKyAgRml4IGluaXRpYWxpemlhdGlvbiBvZiB0aGluIG1vbml0b3JpbmcuICgyLjAyLjkyKQorICBDb3BlIHdpdGggaW1wcm9wZXJseSBmb3JtYXR0ZWQgZGV2aWNlIG51bWJlcnMgaW4gL3Byb2MvZGV2aWNlcy4gKDIuMDIuOTEpCisgIEV4aXQgaWYgTElTVEVOX1BJRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbmNvcnJlY3QgaW4gbHZtZXRhZCBzeXN0ZW1kIGhhbmRvdmVyLgorICBVc2UgcHZzY2FuIC0tY2FjaGUgaW5zdGVhZCBvZiB2Z3NjYW4gaW4gbHZtZXRhZCBzY3JpcHRzLgorICBGaXggZnNhZG0gcHJvcGFnYXRpb24gb2YgLWUgb3B0aW9uLgorICBGaXggZnNhZG0gcGFyc2luZyBvZiAvcHJvYy9tb3VudHMgZmlsZXMgKGRvbid0IGNoZWNrIGZvciBzdWJzdHJpbmdzKS4KKyAgRml4IGZzYWRtIHVzYWdlIG9mIGFyZ3VtZW50cyB3aXRoIHNwYWNlLgorICBGaXggYXJnX2ludF92YWx1ZSBhbG9uZ3NpZGUgQVJHX0dST1VQQUJMRSAtLW1ham9yLy0tbWlub3IgZm9yIGx2Y3JlYXRlL2NoYW5nZS4KKyAgRml4IG5hbWUgY29uZmxpY3RzIHRoYXQgcHJldmVudCBkb3duLWNvbnZlcnRpbmcgUkFJRDEgd2hlbiBzcGVjaWZ5aW5nIGEgZGV2aWNlCisgIEltcHJvdmUgdGhpbl9jaGVjayBvcHRpb24gcGFzc2luZyBhbmQgdXNlIGNvbmZpZ3VyZWQgcGF0aC4KKyAgQWRkIC0td2l0aC10aGluLWNoZWNrIGNvbmZpZ3VyZSBvcHRpb24gZm9yIHBhdGggdG8gdGhpbl9jaGVjay4KKyAgRml4IGVycm9yIG1lc3NhZ2Ugd2hlbiBwdm1vdmUgTFYgYWN0aXZhdGlvbiBmYWlscyB3aXRoIG5hbWUgYWxyZWFkeSBpbiB1c2UuCisgIEJldHRlciBzdHJ1Y3R1cmUgbGF5b3V0IGZvciBkZXZpY2VfaW5mbyBpbiBkZXZfc3Vic3lzdGVtX25hbWUoKS4KKyAgQ2hhbmdlIG1lc3NhZ2Ugc2V2ZXJpdHkgZm9yIGNyZWF0aW9uIG9mIFZHIG92ZXIgdW5pbml0aWFsaXNlZCBkZXZpY2VzLgorICBGaXggZXJyb3IgcGF0aCBmb3IgZmFpbGVkIHRvb2xjb250ZXh0IGNyZWF0aW9uLgorICBEZXRlY3QgbHZtIGJpbmFyeSBwYXRoIGluIGx2bWV0YWQgdWRldiBydWxlcy4KKyAgRG9uJ3QgdW5saW5rIHNvY2tldCBvbiBsdm1ldGFkIHNodXRkb3duIGlmIGluc3RhbnRpYXRlZCBmcm9tIHN5c3RlbWQuCisgIFJlc3RhcnQgbHZtZXRhZCBhdXRvbWF0aWNhbGx5IGZyb20gc3lzdGVtZCBpZiBpdCBleGl0cyBmcm9tIHVuY2F1Z2h0IHNpZ25hbC4KKyAgRml4IHdhcm4gbXNnIGZvciB0aGluIHBvb2wgY2h1bmsgc2l6ZSBhbmQgdXBkYXRlIG1hbiBmb3IgY2h1bmtzaXplLiAoMi4wMi44OSkKKworVmVyc2lvbiAyLjAyLjk1IC0gNnRoIE1hcmNoIDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIElmIHVuc3BlY2lmaWVkLCBhZGp1c3QgdGhpbiBwb29sIG1ldGFkYXRhIGFuZCBjaHVuayBzaXplIHRvIGZpdCBpbnRvIDEyOE1CLgorICBQcmludCBqdXN0IHdhcm5pbmcgb24gdGhpbiBwb29sIGNoZWNrIGNhbGxiYWNrIHBhdGggZm9yIGZhaWxpbmcgY2hlY2suCisgIEFsd2F5cyB1c2UgNjRiaXQgYXJpdGhtZXRpYyB3aXRoIFZHIGV4dGVudF9zaXplIGV4cHJlc3Npb24uCisgIFZhbGlkYXRlIHVkZXYgc3RydWN0dXJlcyBpbiBfaW5zZXJ0X3VkZXZfZGlyKCkuCisgIFRha2UgcmVwZWF0YWJsZSAtLW1ham9yIC0tbWlub3Igd2l0aCBwdnNjYW4gLS1jYWNoZSBpbnN0ZWFkIG9mIG1ham9yOm1pbm9yLgorICBTY2FuIGFsbCBkZXZpY2VzIGZvciBsdm1ldGFkIGlmICdwdnNjYW4gLS1jYWNoZScgdXNlZCB3aXRob3V0IGRldmljZSBsaXN0LgorICBQb3B1bGF0ZSBsdm1jYWNoZSBmcm9tIGx2bWV0YWQgYmVmb3JlIGRpc3BsYXlpbmcgUFZzIGluIHB2c2Nhbi4gKDIuMDIuOTQpCisgIFN1cHByZXNzIGluY29ycmVjdCAtbiBwdnNjYW4gd2FybmluZyBub3cgYWx3YXlzIGRpc3BsYXllZC4gKDIuMDIuOTQpCisKK1ZlcnNpb24gMi4wMi45NCAtIDNyZCBNYXJjaCAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgc3VwcG9ydCB0byBleGVjdXRlIHRoaW5fY2hlY2sgd2l0aCBlYWNoIGRlL2FjdGl2ZSBvZiB0aGluIHBvb2wuCisgIEZpeCBhdXRvbWF0aWMgZXN0aW1hdGlvbiBvZiBtZXRhZGF0YSBkZXZpY2Ugc2l6ZSBmb3IgdGhpbiBwb29sLgorICBUZXN0IGZvciBhbGxvYyBmYWlsIGZyb20gX2FsbG9jX3B2X3NlZ21lbnQoKSBpbiBfZXh0ZW5kX3B2KCkuCisgIENoZWNrIGZvciBhbGxvYyBmYWlsIGZyb20gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoKSBpbiBfbHZjcmVhdGVfcGFyYW1zKCkuCisgIEFkZCBfcmltYWdlIGFzIHJlc2VydmVkIHN1ZmZpeCB0byBsdm0uOCBtYW4gcGFnZS4KKyAgSW1wcm92ZSBlcnJvciBsb2dnaW5nIGZyb20gbXBhdGggZmlsdGVyLgorICBDaGVjayBmb3IgYWxsb2NhdGlvbiBmYWlsdXJlIGluIGhvbGRfbG9jaygpIGluIGNsdm1kLgorICBVc2Ugc2V0X2x2KCkgKHdpcGUgaW5pdGlhbCA0S2lCKSBmb3Igbm9uIHplcm9lZCB0aGluIHZvbHVtZS4KKyAgQWxsb3cgY2x1c3RlciBtaXJyb3JzIHRvIGhhbmRsZSB0aGUgYWJzZW5jZSBvZiB0aGUgY2hlY2twb2ludCBsaWIgKGxpYlNhQ2twdCkuCisgIFJldmVydCBmcmVlIG9mIGFsbG9jYXRlZCBzZWd0eXBlIGluIGluaXQgc2VnbWVudCBlcnJvciBwYXRoICgyLjAyLjg5KS4KKyAgVGVzdCBkbV9oYXNoX2luc2VydCgpIGZhaWx1cmVzIGluIGZpbHRlci1wZXJzaXN0ZW50LmMgYW5kIGZpZF9hZGRfbWRhKCkuCisgIEVuc3VyZSBjbHZtZCBtZXNzYWdlIGlzIGFsd2F5cyBOVUwtdGVybWluYXRlZCBhZnRlciByZWFkLgorICBBZGQgc29tZSBjbG9zZSgpIGFuZCBkZXZfY2xvc2UoKSBlcnJvciBwYXRoIGJhY2t0cmFjZXMuCisgIFNldCBzdGRpbi9zdGRvdXQvc3RkZXJyIHRvIC9kZXYvbnVsbCBmb3IgcG9sbGRhZW1vbi4KKyAgTGltaXQgdGhlIG1heCBzaXplIG9mIHByb2Nlc3NlZCBjbHZtZCBtZXNzYWdlIHRvIH44S0IuCisgIERvIG5vdCBzZW5kIHVuaW5pdGlhbGlzZWQgYnl0ZXMgaW4gY2x1c3RlciBlcnJvciByZXBseSBtZXNzYWdlcy4KKyAgVXNlIHVuc2lnbmVkIHR5cGUgZm9yIGJpdG1hc2sgaW5zdGVhZCBvZiBlbnVtIHR5cGUgZm9yIGx2bSBwcm9wZXJ0aWVzLgorICBBZGQgbWlzc2luZyBjbGVhbnVwIG9mIGV4Y2xfdXVpZCBoYXNoIG9uIHNvbWUgZXhpdCBwYXRocyBvZiBjbHZtZC4KKyAgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiB2Z19uYW1lIGluIF9mb3JtYXQxL19wb29sX3ZnX3JlYWQoKS4KKyAgRml4IG1pc3NpbmcgYnJlYWsgaW4gX2Zvcm1hdF9wdnNlZ3MgKDIuMDIuOTIpLgorICBUZXN0IHNlZyBwb2ludGVyIGZvciBub24tbnVsbCBpdCBpbiByYWlkX3RhcmdldF9wZXJjZW50IGVycm9yIHBhdGguCisgIENoZWNrIGZvciBlcnJvcnMgaW4gX2luaXRfdGFncygpIGR1cmluZyBjb25maWcgbG9hZGluZy4KKyAgQWx3YXlzIGNoZWNrIHJlc3VsdCBvZiBfc2V0X3ZnX25hbWUoKSBpbiBsdmNyZWF0ZS4KKyAgRHJvcCB1bnVzZWQgY2FsbCB0byB1bmFtZSgpIGR1cmluZyBjbHZtZCBpbml0aWFsaXphdGlvbi4KKyAgVGVzdCBhbGxvY2F0aW9uIHJlc3VsdCBpbiBzeXNmcyBmaWx0ZXIgY3JlYXRpb24uCisgIExpbWl0IHNzY2FuZiBwYXJhbWV0ZXJzIHdpdGggYnVmZmVyIHNpemUgaW4gY2x2bWQgZ2V0X2luaXRpYWxfc3RhdGUoKS4KKyAgVXNlIGNvbnN0IGx2IHBvaW50ZXIgZm9yIGx2X2lzX2FjdGl2ZS4uLigpIGZ1bmN0aW9ucy4gCisgIFVzZSBzYW1lIHNpZ25lZCBudW1iZXJzIGluIF9taXJyb3JlZF90cmFuc2llbnRfc3RhdHVzKCkuCisgIFN1cHBvcnQgJ3B2c2NhbiAtLWNhY2hlJyB0byB1cGRhdGUgbHZtZXRhZCBzdGF0ZSBmcm9tIHNwZWNpZmljIFBWcy4KKyAgUHJvdmlkZSBuZXcgbWV0YWRhdGEgZGFlbW9uIGZvciB0ZXN0aW5nIHdpdGggY29uZmlndXJlIC0tZW5hYmxlLWx2bWV0YWQgLgorICBJbnRlZ3JhdGUgY2xpZW50LXNpZGUgbHZtZXRhZCBpbnRvIGJ1aWxkLgorCitWZXJzaW9uIDIuMDIuOTMgLSAyM3JkIEZlYnJ1YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXF1aXJlIG51bWJlciBvZiBzdHJpcGVzIHRvIGJlIGdyZWF0ZXIgdGhhbiBwYXJpdHkgZGV2aWNlcyBpbiBoaWdoZXIgUkFJRC4KKyAgRml4IGFsbG9jYXRpb24gY29kZSB0byBhbGxvdyByZXBsYWNlbWVudCBvZiBzaW5nbGUgUkFJRCA0LzUvNiBkZXZpY2UuCisgIENoZWNrIGFsbCB0YWdzIGFuZCBMViBuYW1lcyBhcmUgaW4gYSB2YWxpZCBmb3JtIGluIHZnX3ZhbGlkYXRlLgorICBBZGQgdG1wZmlsZXMuZCBzdHlsZSBjb25maWd1cmF0aW9uIGZvciBsdm0yIGxvY2sgYW5kIHJ1biBkaXJlY3RvcnkuCisgIEFkZCBjb25maWd1cmUgLS13aXRoLXRtcGZpbGVzZGlyIGZvciBkaXIgaG9sZGluZyB2b2xhdGlsZS1maWxlIGNvbmZpZ3VyYXRpb24uCisgIEFsbG93ICdsdmNvbnZlcnQgLS1yZXBhaXInIHRvIG9wZXJhdGUgb24gUkFJRCA0LzUvNi4KKyAgRml4IGJ1aWxkX3BhcmFsbGVsX2FyZWFzX2Zyb21fbHYgdG8gYWNjb3VudCBjb3JyZWN0bHkgZm9yIHJhaWQgcGFyaXR5IGRldmljZXMuCisgIFByaW50IG1lc3NhZ2Ugd2hlbiBmYXVsdHkgcmFpZCBkZXZpY2VzIGhhdmUgYmVlbiByZXBsYWNlZC4KKworVmVyc2lvbiAyLjAyLjkyIC0gMjB0aCBGZWJydWFyeSAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVhZCBkbWV2ZW50ZCBtb25pdG9yaW5nIGNvbmZpZyBzZXR0aW5ncyBmb3IgZXZlcnkgbHZtIGNvbW1hbmQuCisgIEZvciB0aGluIGRldmljZXMsIGluaXRpYWxpemUgbW9uaXRvcmluZyBvbmx5IGZvciB0aGluIHBvb2xzIG5vdCB0aGluIHZvbHVtZXMuCisgIE1ha2UgY29udmVyc2lvbiBmcm9tIGEgc3luY2VkICdtaXJyb3InIHRvICdyYWlkMScgbm90IGNhdXNlIGEgZnVsbCByZXN5bmMuCisgIFByb3Blcmx5IHRlc3QgYnVmZmVyIGZvciB1bml0IGNoZWNrIGluIHVuaXRzX3RvX2J5dGVzKCkuCisgIEFkZCBjb25maWd1cmUgLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyLgorICBBZGQgY2hlY2sgZm9yIGFsbG9jYXRpb24gZmFpbHVyZSBpbiBfYnVpbGRfbWF0Y2hlcigpLgorICBBZGQgY2hlY2sgZm9yIHJpbWFnZSBuYW1lIGFsbG9jYXRpb24gZmFpbHVyZSBpbiBfcmFpZF9hZGRfaW1hZ2VzKCkuCisgIEFkZCBjaGVjayBmb3IgbWRhX2NvcHkgZmFpbHVyZSBpbiBfdGV4dF9wdl9zZXR1cCgpLgorICBBZGQgY2hlY2sgZm9yIF9taXJyb3JlZF9pbml0X3RhcmdldCBmYWlsdXJlLgorICBBZGQgZnJlZV9vcnBoYW5fdmcuCisgIFNraXAgcHYvdmdfc2V0X2ZpZCBwcm9jZXNzaW5nIGlmIHRoZSBmaWQgaXMgc2FtZS4KKyAgQ2hlY2sgZm9yIGZvcmVhY2ggbG9vcCBlcnJvcnMgaW4gX3ZnX3JlYWRfb3JwaGFucygpICgyLjAyLjkxKS4KKyAgQ2xlYW4gZXJyb3IgcGF0aHMgZm9yIGZvcm1hdCBpbnN0YW5jZSBjcmVhdGlvbiAoMi4wMi45MSkuCisgIFJlbGVhc2UgdmcgaW4gZXJyb3IgcGF0aCBvZiBfZm9ybWF0MV92Z19yZWFkKCkgaW5zdGVhZCBvZiBqdXN0IGZyZWUoKS4KKyAgUmVwb3J0IGFsbG9jYXRpb24gZmFpbHVyZSBmb3IgYWxsb2NhdGlvbiBvZiBQViBzdHJ1Y3R1cmUuCisgIEFkZCBjbHZtZCBpbml0IGRlcGVuZGVuY3kgb24gZGxtIHNlcnZpY2Ugd2hlbiBydW5uaW5nIHdpdGggbmV3IGNvcm9zeW5jLgorCitWZXJzaW9uIDIuMDIuOTEgLSAxMnRoIEZlYnJ1YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZW1vdmUgUFYtYmFzZWQgZm9ybWF0IGluc3RhbmNlcyAod2hpY2ggYXJlIG5vIGxvbmdlciBuZWVkZWQpLgorICBMaW5rIGFsbCBvcnBoYW4gUFZzIGRpcmVjdGx5IHRvIGEgcGVyLWZvcm1hdCBnbG9iYWwgb3JwaGFuIFZHLgorICBSZWZhY3RvciBsdm1jYWNoZSBhcm91bmQgYW4gaW50ZXJuYWwgQVBJLgorICBTdG9wIHByb2Nlc3NpbmcgbHZleHRlbmQgaWYgdHJ5aW5nIHRvIGV4dGVuZCBhIG1pcnJvciB0aGF0IGlzIGJlaW5nIHJlY292ZXJlZC4KKyAgQWRkIHBvb2xfYmVsb3dfdGhyZXNob2xkKCkgZnVuY3Rpb24gdG8gY2hlY2sgdGhpbiBwb29sIHBlcmNlbnQgc3RhdHVzLgorICBGaXggdGVzdCBmb3Igc25hcCBwZXJjZW50IGZvciBmYWlsaW5nIG1lcmdlIHdoZW4gcmVtb3ZpbmcgTFYuCisgIFN3aXRjaCBpbnQgdG8gdm9pZCByZXR1cm4gZm9yIHN0cl9saXN0X2RlbCgpLgorICBGaXggZXJyb3IgcGF0aCBoYW5kbGluZyBpbiBfYnVpbGRfZGVzYygpLgorICBBZGQgcmFuZ2UgdGVzdCBmb3IgZGV2aWNlIG51bWJlciBpbiBfc2Nhbl9wcm9jX2RldigpLgorICBVc2Ugc2lnbmVkIGxvbmcgZm9yIHN5c2NvbmYoKSBjYWxsIGluIGNtaXJyb3JkLgorICBEbyBub3Qgd3JpdGUgaW4gZnJvbnQgb2YgbG9nIGJ1ZmZlciBpbiBwcmludF9sb2coKS4KKyAgQWRkIGJvdW5kYXJ5IHRlc3QgZm9yIG51bWJlciBvZiBtaXJyb3IgZGV2cyBhbmQgbG9ncy4KKyAgQ2hlY2sgdGhhdCB3aG9sZSBsb2NraW5nX2RpciBmaXRzIF9sb2NrX2RpciBidWZmZXIgaW4gaW5pdF9maWxlX2xvY2tpbmcoKS4KKyAgVXNlIGxpc3QgZnVuY3Rpb25zIGZvciBsYWJlbF9leGl0KCkuCisgIEVuc3VyZSBzdHJuY3B5KCkgZnVuY3Rpb24gYWx3YXlzIGVuZHMgd2l0aCAnXDAnLgorICBTZXQgc3RhdHVzIGluIF9mc2FkbV9jbWQoKSBmb3IgZXJyb3IgcGF0aC4KKyAgQWRkIG1pc3NpbmcgZGVwcyBmb3IgbHZtMmFwaSBmb3IgcmVidWlsZCB3aGVuIGx2bS1pbnRlcm5hbCBpcyBjaGFuZ2VkLgorICBGaXggcmVzb3VyY2UgbGVha3MgZm9yIGZhaWxpbmcgYWxsb2NhdGlvbiBvZiBmb3JtYXRzIChsdm0xLzIscG9vbCkuCisgIFJlbGVhc2UgYWxsb2NhdGVkIHJlc291cmNlcyBpbiBlcnJvciBwYXRoIGZvciBjb21wb3NpdGVfZmlsdGVyX2NyZWF0ZSgpLgorICBEbyBub3QgdXNlIGxzdGF0KCkgcmVzdWx0cyB3aGVuIGZhaWxlZCBpbiBfcm1fbGluaygpLgorICBSZW1vdmUgYSAid2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQiIGxvZyBtZXNzYWdlIGZyb20gZG1ldmVudGQgcGx1Z2lucy4KKworVmVyc2lvbiAyLjAyLjkwIC0gMXN0IEZlYnJ1YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIHN5bmNfbG9jYWxfZGV2X25hbWVzIGJlZm9yZSAocmUpYWN0aXZhdGluZyBtaXJyb3IgbG9nIGZvciBpbml0aWFsaXNhdGlvbi4KKyAgRGlzYWJsZSBwYXJ0aWFsIGFjdGl2YXRpb24gZm9yIHRoaW4gTFZzIGFuZCBMVnMgd2l0aCBhbGwgbWlzc2luZyBzZWdtZW50cy4KKyAgRG8gbm90IHByaW50IHdhcm5pbmcgZm9yIHB2X21pbl9zaXplIGJldHdlZW4gNTEyS0IgYW5kIDJNQi4KKyAgQ2xlYW4gdXAgc3lzdGVtZCB1bml0IG9yZGVyaW5nIGFuZCByZXF1aXJlbWVudHMuCisgIEZpeCBsY292IHJlcG9ydHMgd2hlbiBzcmNkaXIgIT0gYnVpbGRkaXIuCisgIEFsbG93IEFMTE9DX05PUk1BTCB0byB0cmFjayByZXNlcnZlZCBleHRlbnRzIGZvciBsb2cgYW5kIGRhdGEgb24gc2FtZSBQVi4KKyAgQXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciBjb3Jvc3luYyBjbHZtZCBuZWVkcyB0byB1c2UgY29uZmRiIG9yIGNtYXAuCisgIEZpeCBkYXRhJSByZXBvcnQgZm9yIHRoaW4gdm9sdW1lIHVzZWQgYXMgb3JpZ2luIGZvciBub24tdGhpbiBzbmFwc2hvdC4KKworVmVyc2lvbiAyLjAyLjg5IC0gMjZ0aCBKYW51YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBtaXNzaW5nIGNoZWNrIGZvciB1bmFtZSByZXN1bHQgaW4gY2x2bWQgVEVTVCBwcm9jZXNzaW5nLgorICBGaXggbWVtbGVhayBpbiB0YXJnZXRfdmVyc2lvbigpIGVycm9yIHBhdGggKHVuc3VwcG9ydGVkIExJU1RfVkVSU0lPTlMpLgorICBMaW1pdCBkYXRhX2FsaWdubWVudCBhbmQgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0IHRvIDMyYml0IHZhbHVlcy4KKyAgQ2hlY2sgZm9yIGNvcnJlY3RuZXNzIG9mIHVpbnQ2NCBkZXZfc2l6ZSB2YWx1ZSBpbiBmb3JtYXRfdGV4dC4KKyAgVGhpbiBwb29scyBoYXZlIHNlZ21lbnQgZmllbGRzIHRoaW5fY291bnQsIHplcm8sIHRyYW5zYWN0aW9uX2lkLgorICBBZGQgZGF0YV9wZXJjZW50IGFuZCBtZXRhZGF0YV9wZXJjZW50IGZvciB0aGluIHBvb2xzIHRvIGx2cyAtdi4KKyAgQWRkIGRhdGFfbHYgJiBtZXRhZGF0YV9sdiBmaWVsZHMgdG8gbHZzIGZvciB0aGluIHBvb2xzLgorICBBZGQgZGF0YV9wZXJjZW50ICYgcG9vbF9sdiBmaWVsZHMgdG8gbHZzIGZvciB0aGluIHZvbHVtZXMuCisgIFJlbmFtZSBvcmlnaW5fb25seSBwYXJtIHRvIHVzZV9sYXllciBmb3IgbHZfaW5mbyBhbmQgdXNlIHdpdGggdGhpbiBMVnMuCisgIEFkZCBsdl90aGluX3Bvb2xfdHJhbnNhY3Rpb25faWQgdG8gcmVhZCB0aGUgdHJhbnNhY3Rpb25faWQgdmFsdWUuCisgIFVzZSB7c3VzcGVuZCxyZXN1bWV9X29yaWdpbl9vbmx5IHdoZW4gdXAtY29udmVydGluZyBSQUlELCBhcyBtaXJyb3JzIGRvLgorICBBbHdheXMgYWRkIFJBSUQgbWV0YWRhdGEgTFZzIHRvIGRlcHRyZWUgKGV2ZW4gd2hlbiBvcmlnaW5fb25seSBpcyBzZXQpLgorICBDaGFuZ2UgZXhjbHVzaXZlIExWIGFjdGl2YXRpb24gbG9naWMgdG8gdHJ5IGxvY2FsIG5vZGUgYmVmb3JlIHJlbW90ZSBub2Rlcy4KKyAgQWRkIENMVk1EX0ZMQUdfUkVNT1RFIHRvIHNraXAgcHJvY2Vzc2luZyBvbiBsb2NhbCBub2RlLgorICBQcm9tcHQgaWYgcmVxdWVzdCBpcyBtYWRlIHRvIHJlbW92ZSBhIHNuYXBzaG90IHdob3NlICJNZXJnZSBmYWlsZWQiLgorICBBbGxvdyByZW1vdmFsIG9mIGFuIGludmFsaWQgc25hcHNob3QgdGhhdCB3YXMgdG8gYmUgbWVyZ2VkIG9uIG5leHQgYWN0aXZhdGlvbi4KKyAgRG9uJ3QgYWxsb3cgYSB1c2VyIHRvIG1lcmdlIGFuIGludmFsaWQgc25hcHNob3QuCisgIFVzZSBtIGFuZCBNIGx2X2F0dHIgdG8gaW5kaWNhdGUgdGhhdCBhIHNuYXBzaG90IG1lcmdlIGZhaWxlZCBpbiBsdnMuCisgIERpZmZlcmVudGlhdGUgYmV0d2VlbiBzbmFwc2hvdCBzdGF0dXMgb2YgIkludmFsaWQiIGFuZCAiTWVyZ2UgZmFpbGVkIi4KKyAgUmVwb3J0IHNuYXBzaG90IHVzYWdlIHBlcmNlbnQgb2Ygb3JpZ2luIHZvbHVtZSB3aGVuIGEgc25hcHNob3QgaXMgbWVyZ2luZy4KKyAgUmVxdWlyZSBnbG9iYWwvbHZkaXNwbGF5X3Nob3dzX2Z1bGxfZGV2aWNlX3BhdGggZm9yIChib2d1cykgbHZtMS1zdHlsZSBwYXRocy4KKyAgRG8gbm90IHJlcG9ydCBsaW5lYXIgc2VndHlwZSBmb3Igbm9uLXN0cmlwZWQgdGFyZ2V0cy4KKyAgUmVjb3JkIGNyZWF0aW9uIGhvc3QgJiB0aW1lIGZvciBlYWNoIExWIGFuZCByZXBvcnQgYXMgbHZfdGltZSAmIGx2X2hvc3QuCisgIE1ha2UgZXJyb3IgbWVzc2FnZSBoaXQgd2hlbiBwcmVhbGxvY2F0ZWQgbWVtbG9jayBtZW1vcnkgZXhjZWVkZWQgY2xlYXJlci4KKyAgVXNlIFIgbHZfYXR0ciB0byBpbmRpY2F0ZSByZWFkLW9ubHkgYWN0aXZhdGlvbiBvZiBub24tcmVhZC1vbmx5IGRldmljZSBpbiBsdnMuCisgIFNob3cgcmVhZC1vbmx5IGFjdGl2YXRpb24gb3ZlcnJpZGUgaW4gbHZkaXNwbGF5ICYgYWRkIDQgdG8gcGVybXMgaW4gLWMuCisgIEFkZCBhY3RpdmF0aW9uL3JlYWRfb25seV92b2x1bWVfbGlzdCB0byBvdmVycmlkZSBMViBwZXJtaXNzaW9uIGluIG1ldGFkYXRhLgorICBHaXZlIHByaW9yaXR5IHRvIGVtY3Bvd2VyIGRldmljZXMgd2l0aCBkdXBsaWNhdGUgUFZJRHMuCisgIEFkZCBjaGVjayBmb3IgZXJyb3IgaW4gX2FkanVzdF9wb2xpY3lfcGFyYW1zKCkgKGx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzKS4KKyAgUm91bmQgc3BlY2lmaWVkIHBlcmNlbnRhZ2VzIHVwd2FyZHMgKCVMViwgJVZHLi4uKSB3aGVuIHJlc2l6aW5nIExWcy4KKyAgVXNlIGRtZXZlbnRkX2x2bTJfY29tbWFuZCBpbiBkbWV2ZW50ZCBwbHVnaW5zIHNuYXBzaG90LCByYWlkLCBtaXJyb3IuCisgIEFkZCBoZWxwZXIgZG1ldmVudGRfbHZtMl9jb21tYW5kKCkgdG8gbGliZGV2bWFwcGVyLWV2ZW50LWx2bTIgbGlicmFyeS4KKyAgVXBkYXRlIGRvY3VtZW50YXRpb24gZm9yIGRtZXZlbnRkLgorICBSZW1vdmUgdW5uZWNlc3Nhcnkgc3RhdCBiZWZvcmUgb3BlbmluZyBkZXZpY2UgaW4gZGV2X29wZW5fZmxhZ3MuCisgIFJlZHVjZSBudW1iZXIgb2YgbHN0YXQgY2FsbHMgd2hlbiBzZWxlY3RpbmcgZGV2aWNlIGFsaWFzLgorICBBZGQgX2Rldl9pbml0IHRvIGluaXRpYWxpemUgY29tbW9uIHN0cnVjdCBkZXZpY2UgbWVtYmVycy4KKyAgQWx3YXlzIHphbGxvYyBzdHJ1Y3QgZGV2aWNlIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgRml4IG1pc3NpbmcgdGhyZWFkIGxpc3QgbWFuaXB1bGF0aW9uIHByb3RlY3Rpb24gaW4gZG1ldmVudGQuCisgIERvIG5vdCBkZXJlZmVuY2UgbHYgcG9pbnRlciBpbiBfcGVyY2VudF9ydW4oKSBmdW5jdGlvbiBiZWZvcmUgTlVMTCBjaGVjay4KKyAgQWxsb3cgZW1wdHkgc3RyaW5ncyBmb3IgZGVzY3JpcHRpb24gYW5kIGNyZWF0aW9uX2hvc3QgY29uZmlnIGZpZWxkcy4KKyAgSXNzdWUgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIHJlbW92aW5nIGxhc3QgbHZtMS1mb3JtYXQgc25hcHNob3QuCisgIFJlaW5zdGF0ZSBzdXBwb3J0IGZvciBzbmFwc2hvdCByZW1vdmFsIHdpdGggbHZtMSBmb3JtYXQuICgyLjAyLjg2KQorICBBZGQgcG9saWN5LWJhc2VkIGF1dG9tYXRlZCByZXBhaXIgb2YgUkFJRCBsb2dpY2FsIHZvbHVtZXMuCisgIERvbid0IGFsbG93IHR3byBpbWFnZXMgdG8gYmUgc3BsaXQgYW5kIHRyYWNrZWQgZnJvbSBhIFJBSUQgTFYgYXQgb25lIHRpbWUuCisgIERvbid0IGFsbG93IHNpemUgY2hhbmdlIG9mIFJBSUQgTFYgdGhhdCBpcyB0cmFja2luZyBjaGFuZ2VzIGZvciBhIHNwbGl0IGltYWdlLgorICBEb24ndCBhbGxvdyBzaXplIGNoYW5nZSBvZiBSQUlEIHN1Yi1MVnMgaW5kZXBlbmRlbnRseS4KKyAgRG9uJ3QgYWxsb3cgbmFtZSBjaGFuZ2Ugb2YgUkFJRCBMViB0aGF0IGlzIHRyYWNraW5nIGNoYW5nZXMgZm9yIGEgc3BsaXQgaW1hZ2UuCisgIERvIG5vdCBhbGxvdyB1c2VycyB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgUkFJRCBzdWItTFZzIGluZGVwZW5kZW50bHkuCisgIERvIG5vdCBhbGxvdyB1c2VycyB0byBjaGFuZ2UgcGVybWlzc2lvbnMgb24gUkFJRCBzdWItTFZzLgorICBBbGxvdyBsdmNvbnZlcnQgdG8gcmVwbGFjZSBzcGVjaWZpZWQgZGV2aWNlcyBpbiBhIFJBSUQgYXJyYXkuCisgIEFkZCBhY3RpdmF0aW9uL3VzZV9saW5lYXJfdGFyZ2V0IGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgVXNlIGdjYyB3YXJuaW5nIG9wdGlvbnMgb25seSB3aXRoIC5jIHRvIC5vIGNvbXBpbGF0aW9uLgorICBNb3ZlIHkvbiBwcm9tcHRzIHRvIHN0ZGVyciBhbmQgcmVwZWF0IGlmIHJlc3BvbnNlIGhhcyBib3RoICduJyBhbmQgJ3knLgorICBSZXBsYWNlIHRoZSB1bml0IHRlc3RpbmcgZnJhbWV3b3JrIHdpdGggQ1VuaXQgKC0tZW5hYmxlLXRlc3RpbmcpLgorICBGaXggZG1ldmVudGQgc25hcHNob3QgbW9uaXRvcmluZyB3aGVuIG11bHRpcGxlIGV4dGVuc2lvbnMgd2VyZSBpbnZvbHZlZC4KKyAgRG9uJ3QgaWdub3JlIGNvbmZpZ3VyZSAtLW1hbmRpciBhbmQgLS1pbmZvZGlyLgorICBEcm9wIHBvb2wgbWVtb3J5IGFsbG9jYXRlZCB3aXRoaW4gbHZfaGFzX3RhcmdldF90eXBlKCkuCisgIFJlZHVjZSBzdGFjayBhbGxvY2F0aW9uIG9mIHNvbWUgUEFUSF9NQVggc2l6ZWQgY2hhciBidWZmZXJzLgorICBVbmxvY2sgbWVtb3J5IGJlZm9yZSB3cml0aW5nIG1ldGFkYXRhLgorICBBZGQgcXVlcnkgYmVmb3JlIHJlbW92aW5nIHNuYXBzaG90cyB3aGVuIGluYWN0aXZlIHNuYXBzaG90IG9yaWdpbiBpcyByZW1vdmVkLgorICBBbGxvdyBjaGFuZ2luZyBhdmFpbGFiaWxpdHkgc3RhdGUgb2Ygc25hcHNob3RzLgorICBTa2lwIG5vbi12aXJ0dWFsIHNuYXBzaG90cyBmb3IgYXZhaWxhYmlsaXR5IGNoYW5nZSBmb3IgbHZjaGFuZ2Ugd2l0aCB2ZyBuYW1lLgorICBTa2lwIGFkanVzdGluZyBtaXJyb3IgcmVnaW9uIHNpemUgdW5sZXNzIG1pcnJvciBvciByYWlkLgorICBSZW9yZGVyIHByb21wdCBjb25kaXRpb25zIGZvciByZW1vdmFsIG9mIGFjdGl2ZSB2b2x1bWVzLgorICBBdm9pZCAnbWRhIGluY29uc2lzdGVuY3knIGJ5IHByb3Blcmx5IHJlZ2lzdGVyaW5nIFVOTEFCRUxMRURfUFYgZmxhZy4oMi4wMi44NikKKyAgRml4IC0tZW5hYmxlLXN0YXRpY19saW5rIHVubGVzcyB1c2luZyAtLWVuYWJsZS1kbWV2ZW50ZCAvIC0tZW5hYmxlLXVkZXZfc3luYy4KKyAgTW92ZSBnZW50b28gTUFLRURFViB0byAvc2JpbiBpbiBsdm0yY3JlYXRlX2luaXRyZC4KKyAgQWRkIGZpbHRlciB0byBhdm9pZCBzY2FuIG9mIGRldmljZSBpZiBpdCBpcyBwYXJ0IG9mIGFjdGl2ZSBtdWx0aXBhdGguCisgIEFkZCBtaXNzaW5nIGRlZmF1bHQgJExWTV9WR19OQU1FIHVzYWdlIGZvciBzbmFwc2hvdHMuCisgIEF2b2lkIGV4dGVudF9jb3VudCBvdmVyZmxvdyB3aXRoIGx2ZXh0ZW5kLgorICBBZGQgbWlzc2luZyBsdnJlbmFtZSBtaXJyb3JlZCBsb2cgcmVjdXJzaW9uIGluIGZvcl9lYWNoX3N1Yl9sdi4KKyAgSW1wcm92ZSBsdl9leHRlbmQgc3RhY2sgcmVwb3J0aW5nLgorICBJbmNyZWFzZSB2aXJ0dWFsIHNlZ21lbnQgc2l6ZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIG11bHRpcGxlIHNlZ21lbnQgbGlzdC4KKyAgQWRkIGxhc3Rfc2VnKGx2KSBpbnRlcm5hbCBmdW5jdGlvbi4KKyAgU3VwcG9ydCBlbXB0eSBzdHJpbmcgZm9yIGxvZy9wcmVmaXguCisgIERpc2FsbG93IG1pcnJvcmVkIGxvZ3MgZm9yIGNsdXN0ZXIgbWlycm9ycy4gKDIuMDIuNzIpCisgIERvbid0IHByaW50IGNoYXIgdHlwZVs4XSBhcyBhIHBsYWluIHN0cmluZyBpbiBwdmNrIFBWIHR5cGUuCisgIFVzZSB2ZyBtZW1vcnkgcG9vbCBpbXBsaWNpdGx5IGZvciB2ZyByZWFkLgorICBBbHdheXMgdXNlIHZnIG1lbW9yeSBwb29sIGZvciBhbGxvY2F0ZWQgbHYgc2VnbWVudC4KKyAgUmVtb3ZlIGV4dHJhIDRrQiBidWZmZXIgYWxsb2NhdGVkIG9uIHN0YWNrIGluIHByaW50X2xvZygpLgorICBNYWtlIG1vdmVfbHZfc2VnbWVudCBub24tc3RhdGljIGZ1bmN0aW9uIGFuZCB1c2UgZG1fbGlzdCBmdW5jdGlvbi4KKyAgUGFzcyBleGNsdXNpdmUgTFYgbG9ja3MgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICBJbXByb3ZlIGx2Y3JlYXRlIGNodW5rc2l6ZSBtYW4gcGFnZSBkZXNjcmlwdGlvbi4KKyAgSW1wcm92ZSBtYW4gcGFnZSBzdHlsZSBmb3IgbHZjcmVhdGUgJiBsdnMuCisgIEF2b2lkIHJlY3Vyc2l2ZSBjYWxscyB0byBkbWV2ZW50ZCBpbiBpdHMgTFZNIHBsdWdpbnMuCisgIExvZyBkZXYgbmFtZSBub3cgcmV0dXJuZWQgdG8ga2VybmVsIGZvciByZWdpc3RlcmluZyBkdXJpbmcgY21pcnJvciBDVFIuCisgIEZpeCBsdl9pbmZvIG9wZW5fY291bnQgdGVzdCBmb3IgZGlzYWJsZWQgdmVyaWZ5X3VkZXZfb3BlcmF0aW9ucy4gKDIuMDIuODYpCisgIFNpbXBsaWZ5IGNvZGUgZm9yIGx2bSB3b3JrZXIgdGhyZWFkIGluIGNsdm1kLiAgICAgICAgICAgICAgICAgICAgIAorICBVc2UgcHRocmVhZF9iYXJyaWVyIHRvIHN5bmNocm9uaXplIGNsdm1kIHRocmVhZHMgYXQgc3RhcnR1cC4KKyAgTGltaXQgY2x2bWQncyB0aHJlYWQgc2l6ZSB0byAxMjhLaUIgYW5kIGlnbm9yZSBhY3RpdmF0aW9uL3Jlc2VydmVkX3N0YWNrLgorICBSZWR1Y2UgZGVmYXVsdCBwcmVhbGxvY2F0ZWQgc3RhY2sgc2l6ZSB0byA2NEtpQi4KKyAgQWRkIGNoZWNrIGZvciBhY2Nlc3MgdGhyb3VnaCBOVUxMIHBvaW50ZXIgd2hlbiByZWZyZXNoX2ZpbHRlcigpIGZhaWxzLgorICBVc2UgcHRocmVhZCBjb25kaXRpb24gZm9yIFNJTkdMRU5PREUgbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAgSW1wcm92ZSBiYWNrdHJhY2UgcmVwb3J0aW5nIGZvciBzb21lIGRldl9tYW5hZ2VyXyBmdW5jdGlvbnMuCisgIENoYW5nZSBtZXNzYWdlIHNldmVyaXR5IHRvIGxvZ193YXJuIHdoZW4gc3ltbGluayBjcmVhdGlvbiBmYWlscy4KKyAgQWRkIGFiaWxpdHkgdG8gY29udmVydCBtaXJyb3Igc2VndHlwZSB0byBSQUlEMSBzZWd0eXBlLgorICBBZGQgYWJpbGl0eSB0byBjb252ZXJ0IGZyb20gbGluZWFyIHRvIFJBSUQxLgorICBBZGQgYWJpbGl0eSB0byBleHRlbmQgbWlycm9ycyB3aXRoICctLW5vc3luYycgb3B0aW9uLgorICBGaXggc3BsaXRtaXJyb3IgTFYgbmFtZXMgdG8gbWFpbnRhaW4gY29uc2lzdGVudCBzdGF0ZSBpbiBhIGNsdXN0ZXIuCisgIEFwcGx5IGFwcHJvcHJpYXRlIHVkZXYgZmxhZ3Mgd2hlbiBzdXNwZW5kaW5nL3Jlc3VtaW5nIG1pcnJvciBzdWItTFZzLgorICBGaXggdmdzcGxpdCB0byBoYW5kbGUgbWlycm9yZWQgbG9ncy4KKyAgQ2xhcmlmeSBtdWx0aS1uYW1lIGRldmljZSBmaWx0ZXIgcGF0dGVybiBtYXRjaGluZyBleHBsYW5hdGlvbiBpbiBsdm0uY29uZi4KKyAgSW50cm9kdWNlIHJldmVydF9sdiBmb3IgYmV0dGVyIHB2bW92ZSBjbGVhbnVwLgorICBSZXBsYWNlIGluY29tcGxldGUgcHZtb3ZlIGFjdGl2YXRpb24gZmFpbHVyZSByZWNvdmVyeSBjb2RlIHdpdGggYSBtZXNzYWdlLgorICBBYm9ydCBpZiBfZmluaXNoX3B2bW92ZSBzdXNwZW5kX2x2cyBmYWlscyBpbnN0ZWFkIG9mIGNsZWFuaW5nIHVwIGluY29tcGxldGVseS4KKyAgQ2hhbmdlIHN1c3BlbmRfbHZzIHRvIGNhbGwgdmdfcmV2ZXJ0IGludGVybmFsbHkuCisgIENoYW5nZSB2Z19yZXZlcnQgdG8gdm9pZCBhbmQgcmVtb3ZlIHN1cGVyZmx1b3VzIGNhbGxzIGFmdGVyIGZhaWxlZCB2Z19jb21taXQuCisgIFVzZSBleGVjdnAgZm9yIENMVk1EIHJlc3RhcnQgdG8gcHJlc2VydmUgZW52aXJvbm1lbnQgc2V0dGluZ3MuCisgIFJlc3RhcnQgQ0xWTUQgd2l0aCBzYW1lIGNsdXN0ZXIgbWFuYWdlci4KKyAgRml4IGxvZ19lcnJvcigpIHVzYWdlIGluIHJhaWQgYW5kIHVua25vd24gc2VndHlwZSBpbml0aWFsaXNhdGlvbi4KKyAgSW1wcm92ZSB0ZXN0aW5nIE1ha2VmaWxlLgorICBGaXggaW5zdGFsbF9vY2YgbWFrZSB0YXJnZXQgd2hlbiBzcmNkaXIgIT0gYnVpbGRkaXIuICgyLjAyLjgwKQorICBTdXBwb3J0IGVudiB2YXJzIExWTV9DTFZNRF9CSU5BUlkgYW5kIExWTV9CSU5BUlkgaW4gY2x2bWQuCisgIEZpeCByZXN0YXJ0IG9mIGNsdm1kIChwcmVzZXJ2ZSBleGx1c2l2ZSBsb2NrcykuICgyLjAyLjY0KQorICBBZGQgJ1ZvbHVtZSBUeXBlJyBsdl9hdHRyIGNoYXJhY3RlcnMgZm9yIFJBSUQgYW5kIFJBSURfSU1BR0UuCisgIEFkZCBhY3RpdmF0aW9uL3JldHJ5X2RlYWN0aXZhdGlvbiB0byBsdm0uY29uZiB0byByZXRyeSBkZWFjdGl2YXRpb24gb2YgYW4gTFYuCisgIFJlcGxhY2Ugb3Blbl9jb3VudCBjaGVjayB3aXRoIGhvbGRlcnMvbW91bnRlZF9mcyBjaGVjayBvbiBsdnJlbW92ZSBwYXRoLgorICBEaXNhbGxvdyB0aGUgY3JlYXRpb24gb2YgbWlycm9ycyAobWlycm9yIG9yIHJhaWQxIHNlZ3R5cGUpIHdpdGggb25seSBvbmUgbGVnLgorICBDbGVhbnVwIHJlc3RhcnQgY2x2bWQgY29kZSAobm8gbWVtb3J5IGFsbG9jYXRpb24sIGRlYnVnIHByaW50IHBhc3NlZCBhcmdzKS4KKyAgQWRkIGFsbCBleGNsdXNpdmUgbG9ja3MgdG8gY2x2bWQgcmVzdGFydCBvcHRpb24gYXJncy4KKyAgQWx3YXlzIHNlbmQgdGhlIHdob2xlIGNsdm1kIHBhY2tldCBoZWFkZXIgaW4gcmVmcmVzaCBjb21tYW5kcy4KKyAgQWRkIG1pc3NpbmcgZXJyb3IgY2hlY2tzIGZvciBzb21lIHN5c3RlbSBjYWxscyBpbiBjbWlycm9yZC4KKyAgQWRkIG1pc3NpbmcgbG9nX2Vycm9yKCkgdG8gbHZyZXNpemUgY29tbWFuZCB3aGVuIGZzYWRtIHRvb2wgZmFpbHMuCisgIEFkZCBzdXBwb3J0IGZvciBETV9ERVZfRElSIGRldmljZSBwYXRoIGludG8gZnNhZG0gc2NyaXB0LgorICBTdXBwb3J0IGRpZmZlcmVudCBQQVRIIHNldHRpbmcgZm9yIGZzYWRtIHNjcmlwdCB0ZXN0aW5nLgorICBTdXJyb3VuZCBhbGwgZXhlY3V0ZWQgY29tbWFuZHMgd2l0aCBxdW90ZXMgaW4gZnNhZG0gc2NyaXB0LgorICBGaXggbWlzc2luZyAnJCcgaW4gdGVzdCBmb3IgY29udGVudCBvZiAiJExWTSIgaW4gZnNhZG0gc2NyaXB0LgorICBNb3ZlIGRlYnVnIG1lc3NhZ2UgaW4gZXhlY19jbWQgYWZ0ZXIgc3luY19sb2NhbF9kZXZfbmFtZXMuCisgIEZpeCBjbHZtZCBwcm9jZXNzaW5nIG9mIGludmFsaWQgcmVxdWVzdCBvbiBsb2NhbCBzb2NrZXQuCisgIEZpeCBjb21tYW5kIGxpbmUgb3B0aW9uIGRlY29kaW5nLgorICBSZXNldCBMViBzdGF0dXMgd2hlbiB1bmxpbmtpbmcgTFYgZnJvbSBWRy4KKyAgRml4IG92ZXJseS1zdHJpY3QgZXh0ZW50LWNvdW50IGRpdmlzaWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIHN0cmlwZWQgbWlycm9ycy4KKyAgRml4IHJvdW5kaW5nIGRpcmVjdGlvbiBpbiBsdnJlc2l6ZSB3aGVuIHJlZHVjaW5nIHZvbHVtZSBzaXplLgorICBGaXggcG9zc2libGUgb3ZlcmZsb3cgb2Ygc2l6ZSBpZiAlRlJFRSBvciAlVkcgaXMgdXNlZC4KKyAgRml4IHZnY2hhbmdlIGFjdGl2YXRpb24gb2Ygc25hcHNob3Qgd2l0aCB2aXJ0dWFsIG9yaWdpbi4KKyAgQWN0aXZhdGUgdmlydHVhbCBzbmFwc2hvdCBvcmlnaW4gZXhjbHVzaXZlbHkgKG9ubHkgb24gbG9jYWwgbm9kZSBpbiBjbHVzdGVyKS4KKyAgRml4IGx2X21pcnJvcl9jb3VudCB0byBoYW5kbGUgbWlycm9yZWQgc3RyaXBlcyBwcm9wZXJseS4KKyAgRml4IGZhaWx1cmUgdG8gZG93bi1jb252ZXJ0IGEgbWlycm9yIHRvIGxpbmVhciBkdWUgdG8gdWRldiAiZGV2IG9wZW4iIGNvbmZsaWN0CisgIEZpeCBtaXJyb3JlZCBsb2cgY3JlYXRpb24gd2hlbiBQRSBzaXplIGlzIHNtYWxsOiB1c2UgbG9nX3NpemUgPj0gcmVnaW9uX3NpemUuCisgIEZpeCBsb2cgc2l6ZSBjYWxjdWxhdGlvbiB3aGVuIG9ubHkgYSBsb2cgaXMgYmVpbmcgYWRkZWQgdG8gYSBtaXJyb3IuCisgIEFkZCA3dGggbHZfYXR0ciBjaGFyIHRvIHNob3cgdGhlIHJlbGF0ZWQga2VybmVsIHRhcmdldC4KKyAgVGVybWluYXRlIHB2X2F0dHIgZmllbGQgY29ycmVjdGx5LiAoMi4wMi44NikKKyAgRml4ICdub3Qgbm90JyB0eXBvIGluIHB2Y3JlYXRlIG1hbiBwYWdlLgorICBJbXByb3ZlIG1hbiBwYWdlIHN0eWxlIGZvciBmc2FkbSwgbHZyZWR1Y2UsIGx2cmVtb3ZlLCBsdnJlbmFtZSAmIGx2cmVzaXplLgorICBTdXBwb3J0IGJyZWFrIGZvciB2Z2NoYW5nZSBhbmQgdmdyZWZyZXNoIG9wZXJhdGlvbi4KKyAgU3dpdGNoIGludCB0byB1bnNpZ25lZCB0eXBlIGZvciBwdm1ldGFkYXRhY29waWVzIGZvciBwdl9jcmVhdGUoKS4KKyAgUmVwbGFjZSA6c3BhY2U6IHdpdGggW1x0IF0gZm9yIGF3ayBpbiB2Z2ltcG9ydGNsb25lIChub3Qgd2lkZWx5IHN1cHBvcnRlZCkuCisgIEJlZ2luIHVzaW5nIDY0LWJpdCBzdGF0dXMgZmllbGQgZmxhZ3MuCisgIERldGVjdCBzc2NhbmYgcmVjb3ZlcmluZ19yZWdpb24gaW5wdXQgZXJyb3IgaW4gY21pcnJvcmQgcHVsbF9zdGF0ZSgpLgorICBGaXggZXJyb3IgcGF0aCBiaXRtYXAgbGVhayBpbiBjbWlycm9yZCBpbXBvcnRfY2hlY2twb2ludCgpLgorICBMb2cgdW5saW5rKCkgZXJyb3IgaW4gY21pcnJvcmQgcmVtb3ZlX2xvY2tmaWxlKCkuCisgIFJlbW92ZSBpbmNvcnJlY3QgcmVxdWlyZW1lbnQgZm9yIC1qIG9yIC1tIGZyb20gbHZjaGFuZ2UgZXJyb3IgbWVzc2FnZS4KKyAgRml4IHVuc2FmZSB0YWJsZSBsb2FkIHdoZW4gc3BsaXR0aW5nIG9mZiBzbWFsbGVyIG1pcnJvciBmcm9tIGEgbGFyZ2VyIG9uZS4KKyAgVXNlIHNpemVfdCByZXR1cm4gdHlwZSBmb3IgdGV4dF92Z19leHBvcnRfcmF3KCkgYW5kIGV4cG9ydF92Z190b19idWZmZXIoKS4KKyAgQWRkIGNvbmZpZ3VyZSAtLWVuYWJsZS1sdm1ldGFkIGZvciBidWlsZGluZyB0aGUgKGV4cGVyaW1lbnRhbCkgTFZNZXRhRC4KKyAgRml4IHJlc291cmNlIGxlYWsgd2hlbiBzdHJkdXAgZmFpbHMgaW4gX2dldF9kZXZpY2Vfc3RhdHVzKCkgKDIuMDIuODUpLgorICBEaXJlY3RseSBhbGxvY2F0ZSBidWZmZXIgbWVtb3J5IGluIGEgcHZjayBzY2FuIGluc3RlYWQgb2YgdXNpbmcgYSBtZW1wb29sLgorICBBZGQgY29uZmlndXJlIC0td2l0aC10aGluIGZvciBzZWd0eXBlcyAidGhpbiIgYW5kICJ0aGluX3Bvb2wiLgorICBGaXggcmFpZCBzaGFyZWQgbGliIHNlZ3R5cGUgcmVnaXN0cmF0aW9uICgyLjAyLjg3KS4KKworVmVyc2lvbiAyLjAyLjg4IC0gMTl0aCBBdWd1c3QgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZW1vdmUgaW5jb3JyZWN0ICdCcmVha2luZycgZXJyb3IgbWVzc2FnZSBmcm9tIGFsbG9jYXRpb24gY29kZS4gKDIuMDIuODcpCisgIEFkZCBsdmNvbnZlcnQgLS1tZXJnZSBzdXBwb3J0IGZvciByYWlkMSBkZXZpY2VzIHNwbGl0IHdpdGggLS10cmFja2NoYW5nZXMuCisgIFN1cHBvcnQgbHZjb252ZXJ0IG9mIC1tMSByYWlkMSBkZXZpY2VzIHRvIGEgaGlnaGVyIG51bWJlci4KKyAgQWRkIC0tdHJhY2tjaGFuZ2VzIHN1cHBvcnQgdG8gbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIG9wdGlvbiBmb3IgcmFpZDEuCisgIFN1cHBvcnQgc3BsaXR0aW5nIG9mZiBhIHNpbmdsZSByYWlkMSByaW1hZ2UgaW4gbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzLgorICBVc2Ugc3luY19sb2NhbF9kZXZfbmFtZXMgd2hlbiByZWR1Y2luZyBudW1iZXIgb2YgcmFpZCByaW1hZ2VzIGluIGx2Y29udmVydC4KKyAgQWRkIC1WIGFzIHNob3J0IGZvcm0gb2YgLS12aXJ0dWFsc2l6ZSBpbiBsdmNyZWF0ZS4KKyAgRml4IG1ha2UgY2xlYW4gbm90IHRvIHJlbW92ZSBNYWtlZmlsZS4gICgyLjAyLjg3KQorCitWZXJzaW9uIDIuMDIuODcgLSAxMnRoIEF1Z3VzdCAyMDExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBtYWtlIGRpc3RjbGVhbiB0byByZW1vdmUgc3RyYXkgZG1ldmVudGQgYW5kIGV4cG9ydGVkIHN5bWJvbHMgZmlsZXMuCisgIEFkZCBnbG9iYWwvZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24gdG8gbHZtLmNvbmYuCisgIFVzZSBtZW1vcnkgcG9vbCBsb2NraW5nIHRvIGNoZWNrIGZvciBjb3JydXB0aW9uIG9mIGludGVybmFsIFZHIHN0cnVjdHMuCisgIENhY2hlIGFuZCBzaGFyZSBnZW5lcmF0ZWQgVkcgc3RydWN0cy4KKyAgRml4IHBvc3NpYmxlIGZvcm1hdCBpbnN0YW5jZSBtZW1vcnkgbGVha3MgYW5kIHByZW1hdHVyZSByZWxlYXNlcyBpbiBfdmdfcmVhZC4KKyAgU3VwcHJlc3MgbG9ja2luZyBlcnJvciBtZXNzYWdlcyBpbiBtb25pdG9yaW5nIGluaXQgc2NyaXB0cy4KKyAgSWYgcGlwZSBpbiBjbHZtZCBmYWlscyByZXR1cm4gYnVzeSBpbnN0ZWFkIG9mIHVzaW5nIHVuaW5pdGlhbGlzZWQgZGVzY3JpcHRvcnMuCisgIEFkZCBhYmlsaXR5IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1pcnJvcnMgaW4gcmFpZDEgYXJyYXlzIHRvIGx2Y29udmVydC4KKyAgQWRkIGRtZXZlbnRkIHBsdWdpbiBmb3IgcmFpZC4KKyAgUmVwbGFjZSBmcmVlX3ZnIHdpdGggcmVsZWFzZV92ZyBhbmQgbW92ZSBpdCB0byB2Zy5jLgorICBSZW1vdmUgSU5DT05TSVNURU5UX1ZHIGZsYWcgZnJvbSB0aGUgY29kZS4KKyAgUmVtb3ZlIGxvY2sgZnJvbSBjYWNoZSBpbiBfbG9ja192b2wgZXZlbiBpZiB1bmxvY2sgZmFpbHMuCisgIEluaXRpYWxpc2UgY2x2bWQgbG9ja3MgYmVmb3JlIGx2bSBjb250ZXh0IHRvIGF2b2lkIG9wZW4gZGVzY3JpcHRvciBsZWFrcy4KKyAgUmVtb3ZlIG9ic29sZXRlIGd1bG0gY2x2bWQgY2x1c3RlciBsb2NraW5nIHN1cHBvcnQuCisgIFN1cHByZXNzIGxvdy1sZXZlbCBsb2NraW5nIGVycm9ycyBhbmQgd2FybmluZ3Mgd2hpbGUgdXNpbmcgLS1zeXNpbml0LgorICBSZW1vdmUgdW51c2VkIGluY29uc2lzdGVudF9zZXFubyB2YXJpYWJsZSBpbiBfdmdfcmVhZCgpLgorICBSZW1vdmUgbWVhbmluZ2xlc3MgY29uc3QgdHlwZSBxdWFsaWZpZXJzIG9uIGNhc3QgdHlwZS4KKyAgQWRkIHRlc3QgZm9yIGZjbnRsIGVycm9yIGluIHNpbmdsZW5vZGUgY2xpZW50IGNvZGUuCisgIFJlbW92ZSAtLWZvcmNlIG9wdGlvbiBmcm9tIGx2cmVuYW1lIG1hbnBhZ2UuCisgIEFkZCBnbG9iYWwvbWlycm9yX3NlZ3R5cGVfZGVmYXVsdCB0byBwaWNrIG1kIHJhaWQgb3IgZG0gbWlycm9yIGFzIGRlZmF1bHQuCisgIEFkZCBjb25maWd1cmUgLS13aXRoLXJhaWQgZm9yIG5ldyBzZWd0eXBlICdyYWlkJyBmb3IgTUQgUkFJRCAxLzQvNS82IHN1cHBvcnQuCisgIENoYW5nZSBERUZBVUxUX1VERVZfU1lOQyB0byAxIHNvIHVkZXZfc3luYyBpcyB1c2VkIGlmIHRoZXJlIGlzIG5vIGNvbmZpZyBmaWxlLgorICBBZGQgc3lzdGVtZCB1bml0IGZpbGUgdG8gcHJvdmlkZSBsdm0yIG1vbml0b3JpbmcuCisgIENvbXBhcmUgZmlsZSBzaXplIChhcyB3ZWxsIGFzIHRpbWVzdGFtcCkgdG8gZGV0ZWN0IGNoYW5nZWQgY29uZmlnIGZpbGUuCisKK1ZlcnNpb24gMi4wMi44NiAtIDh0aCBKdWx5IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IHdhcm5pbmcgaW4gcHZjcmVhdGUgZm9yIE1EIGxpbmVhciBkZXZpY2VzLgorICBNb3ZlIHNuYXBzaG90IHJlbW92YWwgYWN0aXZhdGlvbiBsb2dpYyBpbnRvIGxpYi9hY3RpdmF0ZS4KKyAgQ29wZSB3aXRoIGEgUFYgb25seSBkaXNjb3ZlcmVkIG1pc3Npbmcgd2hlbiBjcmVhdGluZyBkZXB0cmVlLgorICBBYm9ydCBvcGVyYXRpb24gaWYgZG1fdHJlZV9ub2RlX2FkZF90YXJnZXRfYXJlYSBmYWlscy4KKyAgQWRkIGFjdGl2YXRpb24vY2hlY2tzIHRvIGx2bS5jb25mIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBpb2N0bCB2YWxpZGF0aW9uLgorICBBbHdheXMgcHJlbG9hZCBvbiBzdXNwZW5kLCBldmVuIGlmIG5vIG1ldGFkYXRhIGNoYW5nZWQgKGx2Y2hhbmdlIC0tcmVmcmVzaCkuCisgIFdoZW4gc3VzcGVuZGluZywgYXV0b21hdGljYWxseSBwcmVsb2FkIG5ld2x5LXZpc2libGUgZXhpc3RpbmcgTFZzLgorICBUZWFyZG93biBhbnkgc3RyYXkgZGV2aWNlcyB3aXRoICRDT01NT05fUFJFRklYIGR1cmluZyB0ZXN0IHJ1bnMuCisgIFJlaW5zdGF0ZSBjb3JyZWN0IHBlcm1pc3Npb25zIHdoZW4gY3JlYXRpbmcgbWlycm9ycy4gWzIuMDIuODVdCisgIEFwcGVuZCAnbScgYXR0cmlidXRlIHRvIHB2X2F0dHIgZm9yIG1pc3NpbmcgUFZzLgorICBBbm5vdGF0ZSBDTFZNRF9DTURfU1lOQ19OQU1FUyBpbiBkZWNvZGVfY21kLgorICBSZW1vdmUgZW5mb3JjZW1lbnQgb2YgdWRldiB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBub24tc3RhbmRhcmQgL2RldiBsb2NhdGlvbi4KKyAgS2VlcCBhbiBleGNsdXNpdmUgbWlycm9yIG5vbi1jbHVzdGVyZWQgaWYgcmVsb2FkZWQgZS5nLiBkdXJpbmcgY29udmVyc2lvbi4KKyAgUmVqZWN0IGFsbG9jYXRpb24gaWYgbnVtYmVyIG9mIGV4dGVudHMgaXMgbm90IGRpdmlzaWJsZSBieSBhcmVhIGNvdW50LgorICBGaXggY2x1c3RlciBtaXJyb3IgY3JlYXRpb24gdG8gd29yayB3aXRoIG5ldyBtaXJyb3IgYWxsb2NhdGlvbiBhbGdvcml0aG0uCisgIElnbm9yZSBhY3RpdmF0aW9uL3ZlcmlmeV91ZGV2X29wZXJhdGlvbnMgaWYgZG0ga2VybmVsIGRyaXZlciB2c24gPCA0LjE4LgorICBBZGQgYWN0aXZhdGlvbi92ZXJpZnlfdWRldl9vcGVyYXRpb25zIHRvIGx2bS5jb25mLCBkaXNhYmxlZCBieSBkZWZhdWx0LgorICBDYWxsIHZnX21hcmtfcGFydGlhbF9sdnMoKSBiZWZvcmUgVkcgc3RydWN0dXJlIGlzIHJldHVybmVkIGZyb20gdGhlIGNhY2hlLgorICBSZW1vdmUgdW51c2VkIGludGVybmFsIGZsYWcgQUNUSVZBVEVfRVhDTCBmcm9tIHRoZSBjb2RlLgorICBSZW1vdmUgdXNlbGVzcyB0ZXN0IG9mIEFDVElWQVRFX0VYQ0wgaW4gbHZfYWRkX21pcnJvcnMoKSBjbHVzdGVyZWQgY29kZSBwYXRoLgorICBBZGQgbHZfYWN0aXZhdGVfb3B0cyBzdHJ1Y3R1cmUgZm9yIGFjdGl2YXRpb24gKHJlcGxhY2luZyBhY3RpdmF0aW9uIGZsYWdzKS4KKyAgSWdub3JlIGluY29uc2lzdGVudCBwcmUtY29tbWl0IG1ldGFkYXRhIG9uIE1JU1NJTkdfUFYgZGV2cyB3aGlsZSBhY3RpdmF0aW5nLgorICBBZGQgcHJvcGVyIHVkZXYgbGlicmFyeSBjb250ZXh0IGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gdG8gbGlibHZtLgorICBGaXggbGFzdCBzbmFwc2hvdCByZW1vdmFsIHRvIGF2b2lkIHRhYmxlIHJlbG9hZCB3aGlsZSBhIGRldmljZSBpcyBzdXNwZW5kZWQuCisgIFVzZSBkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIgaW4gcmVwbGFjZW1lbnQgY3JpdGljYWxfc2VjdGlvbiBsb2dpYy4KKyAgRG93bmdyYWRlIGNyaXRpY2FsX3NlY3Rpb24gZXJyb3JzIHRvIGRlYnVnIGxldmVsIHVudGlsIGl0IGlzIG1vdmVkIHRvIGxpYmRtLgorICBGaXggaWdub3JlZCBiYWNrZ3JvdW5kIHBvbGxpbmcgZGVmYXVsdCBpbiB2Z2NoYW5nZSAtYXkuCisgIEZpeCBwdm1vdmUgYWN0aXZhdGlvbiBzZXF1ZW5jZXMgdG8gYXZvaWQgdHJhcHBlZCBJL08gd2l0aCBtdWx0aXBsZSBMVnMuCisgIEFubm90YXRlIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgbWVzc2FnZXMuCisgIEZpeCByZWR1Y3Rpb24gb2YgbWlycm9ycyB3aXRoIHN0cmlwZWQgc2VnbWVudHMgdG8gYWx3YXlzIGFsaWduIHRvIHN0cmlwZSBzaXplLgorICBWYWxpZGF0ZSBtaXJyb3Igc2VnbWVudHMgc2l6ZS4KKyAgSW5jbHVkZSBsdm1ldGFkIGRldmVsb3BtZW50IGNvZGUgaW4gdHJlZS4KKyAgRml4IGV4dGVudCByb3VuZGluZyBmb3Igc3RyaXBlZCB2b2x1bWVzIG5ldmVyIHRvIHJlZHVjZSBtb3JlIHRoYW4gcmVxdWVzdGVkLgorICBGaXggY3JlYXRlX3RlbXBfbmFtZSB0byByZXBsYWNlIGFueSAnLycgZm91bmQgaW4gdGhlIGhvc3RuYW1lIHdpdGggJz8nLgorICBBbHdheXMgdXNlIGFwcGVuZCB0byBmaWxlIGluIGx2bWR1bXAuIHNlbGludXggcG9saWN5IG1heSBiYW4gZmlsZSB0cnVuY2F0aW9uLgorICBQcm9wYWdhdGUgdGVzdCBtb2RlIHRvIGNsdm1kIHRvIHNraXAgYWN0aXZhdGlvbiBhbmQgY2hhbmdlcyB0byBoZWxkIGxvY2tzLgorICBEZWZlciB3cml0aW5nIFBWIGxhYmVscyB1bnRpbCB2Z193cml0ZS4KKyAgU3RvcmUgbGFiZWxfc2VjdG9yIG9ubHkgaW4gc3RydWN0IHBoeXNpY2FsX3ZvbHVtZS4KKyAgUGVybWl0IC0tYXZhaWxhYmxlIHdpdGggbHZjcmVhdGUgc28gbm9uLXNuYXBzaG90IExWcyBuZWVkIG5vdCBiZSBhY3RpdmF0ZWQuCisgIFJlcG9ydCBzZWN0b3IgY29udGFpbmluZyBsYWJlbCBpbiB2ZXJib3NlIG1lc3NhZ2UuCisgIENsYXJpZnkgZXJyb3IgbWVzc2FnZSB3aGVuIHVuYWJsZSB0byBjb252ZXJ0IGFuIExWIGludG8gYSBzbmFwc2hvdCBvZiBhbiBMVi4KKyAgQWRkIGFuZCB1c2UgZGV2X29wZW5fcmVhZG9ubHkgYW5kIHZhcmlhdGlvbnMuCisgIERvIG5vdCBsb2cgYSBzdXBlcmZsdW91cyBzdGFjayBtZXNzYWdlIHdoZW4gdGhlIGx2IGlzIHByb3Blcmx5IHByb2Nlc3NlZC4KKyAgRG8gbm90IGlzc3VlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB1bmFibGUgdG8gcmVtb3ZlIC5jYWNoZSBvbiByZWFkLW9ubHkgZnMuCisgIEF2b2lkIG1lbWxvY2sgc2l6ZSBtaXNtYXRjaCBieSBwcmVhbGxvY2F0aW5nIHN0ZGlvIGxpbmUgYnVmZmVycy4KKyAgUmV3cml0ZSB2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSB0byBzaGFyZSBsdmNvbnZlcnQgY29kZS4KKyAgUmVvcmdhbml6ZSBsdmNvbnZlcnQgLS1yZXBhaXIgY29kZSB0byBhbGxvdyByZXVzZS4KKworVmVyc2lvbiAyLjAyLjg1IC0gMjl0aCBBcHJpbCAyMDExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIG5ldyBvYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2IHNldHRpbmcgdG8gbHZtLmNvbmYuCisgIE9idGFpbiBkZXZpY2UgbGlzdCBmcm9tIHVkZXYgYnkgZGVmYXVsdCBpZiBMVk0yIGlzIGNvbXBpbGVkIHdpdGggdWRldiBzdXBwb3J0LgorICBBZGQgdGVzdCBmb3IgdmdpbXBvcnRjbG9uZSBhbmQgcXVlcnlpbmcgb2YgdmduYW1lcyB3aXRoIGR1cGxpY2F0ZSBwdnMuCisgIEF2b2lkIHVzZSBvZiByZWxlYXNlZCBtZW1vcnkgd2hlbiBkdXBsaWNhdGUgUFYgaXMgZm91bmQuCisgIEFkZCAiZGV2aWNlcy9pc3N1ZV9kaXNjYXJkcyIgdG8gbHZtLmNvbmYuCisgIElzc3VlIGRpc2NhcmRzIG9uIGx2cmVtb3ZlIGFuZCBsdnJlZHVjZSBldGMuIGlmIGVuYWJsZWQgYW5kIHN1cHBvcnRlZC4KKyAgQWRkIHNlZ19wZV9yYW5nZXMgYW5kIGRldmljZXMgZmllbGRzIHRvIGxpYmx2bS4KKyAgRml4IGluY29ycmVjdCB0ZXN0cyBmb3IgZG1fc25wcmludGYoKSBmYWlsdXJlLgorICBGaXggc29tZSB1bm1hdGNoaW5nIHNpZ24gY29tcGFyYXRpb24gZ2NjIHdhcm5pbmdzIGluIHRoZSBjb2RlLgorICBTdXBwb3J0IGx2X2V4dGVuZCgpIG9uIGVtcHR5IExWcy4KKyAgQXZvaWQgcmVnZW5lcmF0aW5nIGNhY2hlIGNvbnRlbnQgd2hlbiBleHBvcnRlZCBWRyBidWZmZXIgaXMgdW5jaGFuZ2VkLgorICBFeHRlbmQgdGhlIHNldCBvZiBtZW1vcnkgcmVnaW9ucyB0aGF0IGFyZSBub3QgbG9ja2VkIHRvIG1lbW9yeS4KKyAgV29ya2Fyb3VuZCBzb21lIHByb2JsZW1zIHdoZW4gY29tcGlsZWQgZm9yIHZhbGdyaW5kIG1lbWNoZWNrLgorICBTdXBwb3J0IGNvbnRyb2xsZWQgcXVpdCBvZiB0aGUgbHZtX3RocmVhZF9mbiBmdW5jdGlvbiBpbiBjbHZtZC4KKyAgRml4IHJlYWRpbmcgb2YgdW5hbGxvY2F0ZWQgbWVtb3J5IGluIGx2bTEgZm9ybWF0IGltcG9ydCBmdW5jdGlvbi4KKyAgUmVwbGFjZSBzZXZlcmFsIHN0cm5jbXAoKSBjYWxscyB3aXRoIGlkX2VxdWFsKCkuCisgIEZpeCBsdm1jYWNoZV9pbmZvIHRyYW5zZmVyIHRvIG9ycGhhbl92Z2luZm8gaW4gX2x2bWNhY2hlX3VwZGF0ZV92Z25hbWUoKS4KKyAgRml4IC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gZ2NjIHdhcm5pbmdzLgorICBSZW5hbWUgTUlSUk9SX05PVFNZTkNFRCB0byBMVl9OT1RTWU5DRUQuCisgIEZpeCBfbW92ZV9sdl9zZWdtZW50cyB0byBoYW5kbGUgZW1wdHkgTFZzLgorICBGaXhlcyBmb3IgbHZjb252ZXJ0IChpbmNsdWRpbmcgLS1yZXBhaXIpIG9mIHRlbXBvcmFyeSBtaXJyb3Igc3RhY2tzLgorICBBdm9pZCBwb3RlbnRpYWwgbG9vcCB3aGVuIHJlbW92aW5nIG1pcnJvciBpbWFnZXMuCisgIEZpeCBtaXJyb3IgcmVtb3ZhbCBhbHdheXMgdG8gdGFrZSBhY2NvdW50IG9mIHByZWZlcmVuY2VzIGFzIHRvIHdoaWNoLgorICBGaXggTUlSUk9SRUQgZmxhZyB1c2FnZS4KKyAgUmVtb3ZlIGVycm9yIG1lc3NhZ2VzIGlzc3VlZCBieSBkZXZpY2VfaXNfdXNhYmxlIHdoZW4gcnVuIGFzIG5vbi1yb290LgorICBBZGQgbWlzc2luZyBcMCBmb3IgZ3Jvd24gZGVidWcgb2JqZWN0IGluIF9iaXRzZXRfd2l0aF9yYW5kb21fYml0cygpLgorICBGaXggYWxsb2NhdGlvbiBvZiBzeXN0ZW1faWQgYnVmZmVyIGluIHZvbHVtZV9ncm91cCBzdHJ1Y3R1cmUuCisgIEZpeCByZWFkbGluayB1c2FnZSBpbnNpZGUgZ2V0X3ByaW1hcnlfZGV2KCkuCisgIFVzZSBmb3JtYXQgaW5zdGFuY2UgbWVtcG9vbCB3aGVyZSBwb3NzaWJsZSBhbmQgYWRlcXVhdGUuCisgIENhbGwgZGVzdHJveV9pbnN0YW5jZSBmb3IgYW55IFBWcyBmb3VuZCBpbiBWRyBzdHJ1Y3R1cmUgZHVyaW5nIHZnX2ZyZWUgY2FsbC4KKyAgQWRkIG5ldyBmcmVlX3B2X2ZpZCBmbiBhbmQgdXNlIGl0IHRocm91Z2hvdXQgdG8gZnJlZSBhbGwgYXR0YWNoZWQgZmlkcy4KKyAgVXNlIG9ubHkgdmdfc2V0X2ZpZCBhbmQgbmV3IHB2X3NldF9maWQgZm4gdG8gYXNzaWduIHRoZSBmb3JtYXQgaW5zdGFuY2UuCisgIE1ha2UgY3JlYXRlX3RleHRfY29udGV4dCBmbiBzdGF0aWMgYW5kIG1vdmUgaXQgaW5zaWRlIGNyZWF0ZV9pbnN0YW5jZSBmbi4KKyAgQWRkIG1lbSBhbmQgcmVmX2NvdW50IGZpZWxkcyB0byBzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlIGZvciBvd24gbWVtcG9vbCB1c2UuCisgIFVzZSBuZXcgYWxsb2NfZmlkIGZuIGZvciBjb21tb24gZm9ybWF0IGluc3RhbmNlIGluaXRpYWxpc2F0aW9uLgorICBPcHRpbWlzZSBfZ2V0X3Rva2VuKCkgYW5kIF9lYXRfc3BhY2UoKS4KKyAgQWRkIF9sdl9wb3N0b3JkZXJfdmcoKSB0byBpbXByb3ZlIGVmZmljaWVuY3kgZm9yIGFsbCBMVnMgaW4gVkcuCisgIEFkZCBnZGJpbml0IHNjcmlwdCBmb3IgZGVidWdnaW5nLgorICBVc2UgaGFzaCB0YWJsZXMgdG8gc3BlZWR1cCBzdHJpbmcgc2VhcmNoIGluIHZnX3ZhbGlkYXRlKCkuCisgIFJlZmFjdG9yIGFsbG9jYXRpb24gb2YgVkcgc3RydWN0dXJlIGFkZGluZyBhbGxvY192ZygpLgorICBBdm9pZCBwb3NzaWJsZSBlbmRsZXNzIGxvb3AgaW4gX2ZyZWVfdmdpbmZvIHdoZW4gNCBvciBtb3JlIFZHcyBoYXZlIHNhbWUgbmFtZS4KKyAgVXNlIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mIC9kZXYvLyBmb3IgTFYgcGF0aCB3aGVuIHRoZXJlJ3Mgbm8gVkcuCisgIERvbid0IGFsbG9jYXRlIHVudXNlZCBWRyBtZW1wb29sIGluIF9wdnNlZ3Nfc3ViX3NpbmdsZS4KKyAgRG8gbm90IHNlbmQgdW5pbml0aWFsaXNlZCBieXRlcyBpbiBsb2NhbCBjbHZtZCBtZXNzYWdlcy4KKyAgU3VwcG9ydCAtLWhlbHAgb3B0aW9uIGZvciBjbHZtZCBhbmQgcmV0dXJuIGVycm9yIGZvciB1bmtub3duIG9wdGlvbi4KKyAgQXZvaWQgcmVhZGluZyBmcmVlZCBtZW1vcnkgd2hlbiBwcmludGluZyBMViBzZWdtZW50IHR5cGUuCisgIEZpeCBzeXNsb2cgaW5pdGlhbGlzYXRpb24gaW4gY2x2bWQgdG8gcmVzcGVjdCBsdm0uY29uZiBzZXR0aW5nLgorICBGaXggcG9zc2libGUgb3ZlcmZsb3cgaW4gbWF4aW11bSBzdHJpcGUgc2l6ZSBhbmQgcGh5c2ljYWwgZXh0ZW50IHNpemUuCisgIEltcHJvdmUgcHZyZW1vdmUgZXJyb3IgbWVzc2FnZSB3aGVuIFBWIGJlbG9uZ3MgdG8gYSBWRy4KKyAgRXh0ZW5kIG5vcm1hbCBwb2xpY3kgdG8gYWxsb3cgbWlycm9yIGxvZ3Mgb24gc2FtZSBQVnMgYXMgaW1hZ2VzIGlmIG5lY2Vzc2FyeS4KKyAgSW1wcm92ZSBjbGluZyBwb2xpY3kgdG8gcmVjb2duaXNlIFBWcyBhbHJlYWR5IHVzZWQgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi4KKyAgSW1wcm92ZSBub3JtYWwgYWxsb2NhdGlvbiBhbGdvcml0aG0gdG8gaW5jbHVkZSBjbGluZ2luZyB0byBleGlzdGluZyBhcmVhcy4KKyAgQWRkIGFsbG9jYXRpb24vbWF4aW1pc2VfY2xpbmcgJiBtaXJyb3JfbG9nc19yZXF1aXJlX3NlcGFyYXRlX3B2cyB0byBsdm0uY29uZi4KKyAgQWRhcHQgbWV0YWRhdGEgYmFsYW5jaW5nIGNvZGUgdG8gd29yayB3aXRoIG1ldGFkYXRhIGhhbmRsaW5nIGNoYW5nZXMuCisgIEFkZCBvbGRfaWQgZmllbGQgdG8gcGh5c2ljYWxfdm9sdW1lIGFuZCBmaXggcHZjaGFuZ2UgLXUgZm9yIHJlY2VudCBjaGFuZ2VzLgorICBBbGxvdyBwdnJlc2l6ZSBvbiBhIFBWIHdpdGggdHdvIG1ldGFkYXRhIGFyZWFzLgorICBDaGFuZ2UgcHZjcmVhdGUgdG8gdXNlIG5ldyBtZXRhZGF0YSBoYW5kbGluZyBpbnRlcmZhY2UuCisgIFJlc3RydWN0dXJlIGV4aXN0aW5nIHB2X3NldHVwIGFuZCBwdl93cml0ZSBhbmQgYWRkIHB2X2luaXRpYWxpc2UuCisgIEFkZCBpbnRlcm5hbCBpbnRlcmZhY2UgdG8gc3VwcG9ydCBhZGRpbmcgYW5kIHJlbW92aW5nIG1ldGFkYXRhIGFyZWFzLgorICBBbGxvdyBpbnRlcm5hbCBpbmRleGluZyBvZiBtZXRhZGF0YSBhcmVhcyAoUFYgaWQgKyBtZGEgb3JkZXIpLgorICBHZW5lcmFsaXNlIGludGVybmFsIGZvcm1hdF9pbnN0YW5jZSBpbmZyYXN0cnVzdHVyZSBmb3IgUFYgYW5kIFZHIHVzZS4KKyAgSGFuZGxlIGRlY2ltYWwgZGlnaXRzIHdpdGggLS11bml0cyBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZW0gc2lsZW50bHkuCisgIEZpeCByZW1haW5pbmcgd2FybmluZ3MgYW5kIGNvbXBpbGUgd2l0aCAtV3BvaW50ZXItYXJpdGguCisgIEZpeCBnY2Mgd2FybmluZ3MgZm9yIHVudXNlZCB2YXJpYWJsZXMgYW5kIGNvbnN0IGNhc3RzLgorICBBZGQgc3RhY2sgYmFja3RyYWNlcyBmb3IgZXJyb3IgcGF0aHMgaW4gcHJvY2Vzc19lYWNoX2x2KCkuCisgIFRlbXBvcmFyaWx5IHN1cHByZXNzIGVycm9yIGZyb20gY2FsbGluZyB5ZXNfbm9fcHJvbXB0IHdoaWxlIGxvY2tzIGFyZSBoZWxkLgorICBSZXBsYWNlIHZvaWQqIHdpdGggY2hhciogYXJpdGhtZXRpYyBpbiBfdGV4dF93cml0ZSwgX3RleHRfcmVhZCAmIHNlbmRfbWVzc2FnZS4KKyAgRml4IGNvbXBpbGF0aW9uIHdpdGhvdXQgREVWTUFQUEVSX1NVUFBPUlQuCisgIFJlbW92ZSBmc191bmxvY2soKSBmcm9tIGx2X3N1c3BlbmQgZXJyb3IgcGF0aC4KKyAgQWxsb3cgbWVtb3J5IHRvIHN0YXkgbG9ja2VkIGJldHdlZW4gbGVhdmluZyBhbmQgcmUtZW50ZXJpbmcgY3JpdGljYWwgc2VjdGlvbnMuCisgIFJlbmFtZSBtZW1sb2NrIHRvIGNyaXRpY2FsX3NlY3Rpb24gdGhyb3VnaG91dC4KKyAgTWFrZSBwdl9taW5fc2l6ZSBjb25maWd1cmFibGUgYW5kIGluY3JlYXNlIHRvIDIwNDhLQiB0byBleGNsdWRlIGZsb3BweSBkcml2ZXMuCisgIEFkZCBmaW5kX2NvbmZpZ190cmVlX2ludDY0IHRvIHJlYWQgNjQtYml0IGludHMgZnJvbSBjb25maWcuCisgIEVuc3VyZSByZXN1bWluZyBleGNsdXNpdmUgY2x1c3RlciBtaXJyb3IgY29udGludWVzIHRvIHVzZSBsb2NhbCBtaXJyb3IgdGFyZ2V0LgorICBDbGVhciB0ZW1wb3JhcnkgcG9zdG9yZGVyIExWIHN0YXR1cyBmbGFncyB0byBhbGxvdyByZS11c2Ugd2l0aCBzYW1lIExWIHN0cnVjdC4KKyAgUmVtb3ZlIGludmFsaWQgc25hcHNob3QgdW1vdW50IG1lc2cgd2hpY2ggZmxvb2RzIHN5c2xvZyBmcm9tIGRtZXZlbnRkIHBsdWdpbi4KKyAgQWRkIGV4dGVuZGVkIGV4YW1wbGVzIHRvIHB2bW92ZSBtYW4gcGFnZS4KKyAgU3VwcG9ydCBMVk1fVEVTVF9ERVZESVIgZW52IHZhciBmb3IgcHJpdmF0ZSAvZGV2IGR1cmluZyB0ZXN0aW5nLgorCitWZXJzaW9uIDIuMDIuODQgLSA5dGggRmVicnVhcnkgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IENSQzMyIGNhbGN1bGF0aW9uIG9uIGJpZyBlbmRpYW4gQ1BVICgyLjAyLjc1KS4KKworVmVyc2lvbiAyLjAyLjgzIC0gNHRoIEZlYnJ1YXJ5IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFsbG93IGV4Y2x1c2l2ZSBhY3RpdmF0aW9uIG9mIHNuYXBzaG90cyBpbiBhIGNsdXN0ZXIuCisgIExlYXZlIEVYIGxvY2sgdW5jaGFuZ2VkIHdoZW4gc3VzcGVuZGluZyBhIGRldmljZSBpbiBjbHZtZC4KKyAgVXNlIHN5bmNfZGV2X25hbWVzIGluIHVubG9ja192ZyBtYWNybyBmb3IgY2x1c3Rlci13aWRlIGRldiBuYW1lIHN5bmMuCisgIEZpeCBmcyBvcGVyYXRpb24gc3RhY2sgaGFuZGxpbmcgd2hlbiBtdWx0aXBsZSBvcGVyYXRpb25zIG9uIHNhbWUgZGV2aWNlLgorICBJbmNyZWFzZSBoYXNoIHRhYmxlIHNpemUgdG8gMTAyNCBsdiBuYW1lcyBhbmQgNjQgcHYgdXVpZHMuCisgIFJlbW92ZSBmc191bmxvY2soKSBmcm9tIGx2X3Jlc3VtZSBwYXRoLgorICBGaXggd2lwZSBzaXplIHdoZW4gc2V0dGluZyB1cCBtZGEuCisgIFJlbW92ZSB1bm5lZWRlZCBjaGVja3MgZm9yIG9wZW5fY291bnQgaW4gbHZfaW5mbygpLgorICBTeW5jaHJvbml6ZSB3aXRoIHVkZXYgYmVmb3JlIGNoZWNraW5nIG9wZW5fY291bnQgaW4gbHZfaW5mbygpLgorICBBbGxvdyBDTFZNRF9DTURfU1lOQ19OQU1FUyB0byBiZSBwcm9wYWdhdGVkIGFyb3VuZCB0aGUgY2x1c3RlciBpZiByZXF1ZXN0ZWQuCisgIEFkZCAiZG1zZXR1cCBscyAtLXRyZWUiIG91dHB1dCB0byBsdm1kdW1wLgorICBGaXggdWRldiBzeW5jaHJvbml6YXRpb24gd2l0aCBuby1sb2NraW5nIC0tc3lzaW5pdCAoMi4wMi44MCkuCisgIEltcHJvdmUgbWFuIHBhZ2Ugc3R5bGUgY29uc2lzdGVuY3kgZm9yIHB2Y3JlYXRlLCBwdnJlbW92ZSwgcHZyZXNpemUsIHB2c2Nhbi4KKyAgQXZvaWQgcmVidWlsZGluZyBvZiB1dWlkIHZhbGlkYXRpb24gdGFibGUuCisgIEltcHJvdmUgbHZjcmVhdGUgZXJyb3IgdGV4dCBmcm9tIGluc3VmZmljaWVudCAiZXh0ZW50cyIgdG8gImZyZWUgc3BhY2UiLgorICBBbHdheXMgdXNlIE9fRElSRUNUIHdoZW4gb3BlbmluZyBibG9jayBkZXZpY2VzIHRvIGNoZWNrIGZvciBwYXJ0aXRpb25pbmcuCisKK1ZlcnNpb24gMi4wMi44MiAtIDI0dGggSmFudWFyeSAyMDExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCcmluZyBsdnNjYW4gbWFuIHBhZ2UgdXAtdG8tZGF0ZS4KKyAgRml4IGx2Y2hhbmdlIC0tdGVzdCB0byBleGl0IGNsZWFubHkuCisgIEFkZCBjaGFuZ2VfdGFnIHRvIHRvb2xsaWIuCisgIEFsbG93IG11bHRpcGxlIHB2Y2hhbmdlIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGJlIHNwZWNpZmllZCB0b2dldGhlci4KKyAgRG8gbm90IGZhaWwgcHZtb3ZlIHBvbGxpbmcgaWYgYW5vdGhlciBwcm9jZXNzIGNsZWFuZWQgdXAgZmlyc3QuCisgIEF2b2lkIGNsdm1kIGluY3JlbWVudGluZyBkbG0gbG9ja3NwYWNlIHJlZmVyZW5jZSBjb3VudCBtb3JlIHRoYW4gb25jZS4KKyAgQWRkIC1mIChkb24ndCBmb3JrKSBvcHRpb24gdG8gY2x2bWQgYW5kIGZpeCBjbHZtZCAtZDxudW0+IGRlc2NyaXB0aW9uLgorCitWZXJzaW9uIDIuMDIuODEgLSAxN3RoIEphbnVhcnkgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRG8gbm90IHNjYW4gZGV2aWNlcyBpbiBkZXZfcmVzZXRfZXJyb3JfY291bnQoKS4KKyAgU2tpcCB1bm5lY2Vzc2FyeSBMT0NLX05VTEwgdW5sb2NrIGNhbGwgZHVyaW5nIHZvbHVtZSBkZWFjdGl2YXRpb24uCisgIFNraXAgZnNfdW5sb2NrIHdoZW4gY2FsbGluZyBleGVjX2NtZCB3aXRoaW4gYWN0aXZhdGlvbiBjb2RlIChmb3IgbW9kcHJvYmUpLgorICBFeHRlbmQgZXhlY19jbWQgcGFyYW1zIHRvIHNwZWNpZnkgd2hlbiBkZXZpY2Ugc3luYyAoZnNfdW5sb2NrKSBpcyBuZWVkZWQuCisgIFJlcGxhY2UgZnNfdW5sb2NrIGJ5IHN5bmNfbG9jYWxfZGV2X25hbWVzIHRvIG5vdGlmeSBsb2NhbCBjbHZtZC4gKDIuMDIuODApCisgIEludHJvZHVjZSBzeW5jX2xvY2FsX2Rldl9uYW1lcyBhbmQgQ0xWTURfQ01EX1NZTkNfTkFNRVMgdG8gaXNzdWUgZnNfdW5sb2NrLgorICBBY2NlcHQgZnVzaW9uIGZpbyBpbiBkZXZpY2UgdHlwZSBmaWx0ZXIuCisgIEFkZCBhYmlsaXR5IHRvIGNvbnZlcnQgbWlycm9yIGxvZyB0eXBlIGZyb20gZGlzayB0byBtaXJyb3JlZC4KKworVmVyc2lvbiAyLjAyLjgwIC0gMTB0aCBKYW51YXJ5IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVzZSBzYW1lIGRtIGNvb2tpZSBmb3IgY29uc2VjdXRpdmUgZG0gb3BzIGluIHNhbWUgVkcgdG8gcmVkdWNlIHVkZXYgd2FpdHMuCisgIFNwZWVkIHVwIGNvbW1hbmQgcHJvY2Vzc2luZyBieSBjYWNoaW5nIHJlc29sdmVkIGNvbmZpZyB0cmVlLgorICBQYXNzIGNvbmZpZ190cmVlIHRvIHJlbmFtZWQgZnVuY3Rpb24gaW1wb3J0X3ZnX2Zyb21fY29uZmlnX3RyZWUoKS4KKyAgRGV0ZWN0IE5VTEwgaGFuZGxlIGluIGdldF9wcm9wZXJ0eSgpLgorICBGaXggc3VwZXJmbHVvdXMgL3VzciBpbiBvY2Zfc2NyaXB0ZGlyIGluc3RhbGF0aW9uIHBhdGguCisgIEFkZCAtLXdpdGgtb2NmZGlyIGNvbmZpZ3VyYWJsZSBvcHRpb24uCisgIEFkZCBhY2xvY2FsLm00IChmb3IgcGtnY29uZmlnKS4KKyAgRml4IG1lbW9yeSBsZWFrIGluIHBlcnNpc3RlbnQgZmlsdGVyIGNyZWF0aW9uIGVycm9yIHBhdGguCisgIENoZWNrIGZvciBlcnJvcnMgc2V0dGluZyB1cCBkbV90YXNrIHN0cnVjdCBpbiBfc2V0dXBfdGFzaygpLgorICBGYWlsIHBvbGxkYWVtb24gY3JlYXRpb24gd2hlbiBsdm1jYWNoZV9pbml0KCkgZmFpbHMuCisgIFJldHVybiBQRVJDRU5UX0lOVkFMSUQgZm9yIGVycm9ycyBpbiBfY29weV9wZXJjZW50KCkgYW5kIF9zbmFwX3BlcmNlbnQoKS4KKyAgUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KKyAgSW1wcm92ZSBnZW5lcmFsIGx2Y29udmVydCBtYW4gcGFnZSBkZXNjcmlwdGlvbi4KKyAgUmV0dXJuIDAgZnJvbSBjbWlycm9yZCBpbml0c2NyaXB0ICdzdGFydCcgaWYgZGFlbW9uIGlzIGFscmVhZHkgcnVubmluZy4KKyAgRml4IHdyb25nbHkgcGFpcmVkIHVubG9ja2luZyBvZiBWR19HTE9CQUwgaW4gcHZjaGFuZ2UuICgyLjAyLjY2KQorICBBZGQgYmFja3RyYWNlcyBmb3IgYmFja3VwIGFuZCBiYWNrdXBfcmVtb3ZlIGZhaWwgcGF0aHMuCisgIERldGVjdCBlcnJvcnMgZnJvbSBkbV90YXNrX3NldCBjYWxscyBpbiBfZ2V0X2RldmljZV9pbmZvIChkbWV2ZW50ZCkuCisgIEFkZCBiYWNrdHJhY2VzIGZvciBhcmNoaXZlIGFuZCBiYWNrdXBfbG9jYWxseSBpbiBjaGVja19jdXJyZW50X2JhY2t1cCgpLgorICBGaXggbWVtb3J5IGxlYWsgaW4gZGVidWcgbW9kZSBvZiByZXN0YXJ0X2Nsdm1kKCkgZXJyb3IgcGF0aC4KKyAgTG9nIGVycm9yIG1lc3NhZ2UgZm9yIHB0aHJlYWRfam9pbigpIGZhaWx1cmUgaW4gY2x2bWQuCisKK1ZlcnNpb24gMi4wMi43OSAtIDIwdGggRGVjZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCisgIEFkZCBtaXNzaW5nIHRlc3QgZm9yIHJlYWxsb2NhdGlvbiBlcnJvciBpbiBfZmluZF9wYXJhbGxlbF9zcGFjZSgpLgorICBBZGQgY2hlY2tzIGZvciBhbGxvY2F0aW9uIGVycm9ycyBpbiBjb25maWcgbm9kZSBjbG9uaW5nLgorICBGaXggZXJyb3IgcGF0aCBpZiByZWdleCBlbmdpbmUgY2Fubm90IGJlIGNyZWF0ZWQgaW4gX2J1aWxkX21hdGNoZXIoKS4KKyAgVXNlIGNoYXIqIGFyaXRobWV0aWMgaW4gdGFyZ2V0X3ZlcnNpb24oKSwgX3Byb2Nlc3NfYWxsKCkgJiBfdGFyZ2V0cygpLgorICBGaXhpbmcgY29uc3QgY2FzdCBnY2Mgd2FybmluZ3MgaW4gdGhlIGNvZGUuCisgIENoZWNrIHJlYWQoKSBhbmQgY2xvc2UoKSByZXN1bHRzIGluIF9nZXRfY21kbGluZSgpLgorICBBZGQgY29uc3QgZm9yIHN0cnVjdCBjb25maWdfbm9kZSB1c2FnZS4KKyAgRml4IE5VTEwgcG9pbnRlciBjaGVjayBpbiBlcnJvciBwYXRoIGluIGNsdm1kIGRvX2NvbW1hbmQoKS4gKDIuMDIuNzgpCisgIEZpeCBkZXZpY2UuYyAjaW5jbHVkZSB0byBlbnN1cmUgNjQtYml0IGZvcGVuNjQgdXNlLiAoMi4wMi41MSkKKyAgQWRkIGNvcHlfcGVyY2VudCBhbmQgc25hcF9wZXJjZW50IHRvIGxpYmx2bS4KKyAgRW5oYW5jZSB2Z192YWxpZGF0ZSB0byBlbnN1cmUgaW50ZWdyaXR5IG9mIExWIGFuZCBQViBzdHJ1Y3RzIHJlZmVyZW5jZWQuCisgIEVuaGFuY2UgdmdfdmFsaWRhdGUgdG8gY2hlY2sgY29tcG9zaXRpb24gb2YgcHZtb3ZlIExWcy4KKyAgQ3JlYXRlIC92YXIvcnVuL2x2bSBkaXJlY3RvcnkgZHVyaW5nIGNsdm1kIGluaXRpYWxpc2F0aW9uIGlmIG1pc3NpbmcuCisgIFVzZSBuZXcgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQgaW5zdGVhZCBvZiBkbV9zZXRfc2VsaW51eF9jb250ZXh0LgorICBBdm9pZCByZXZhbGlkYXRpbmcgdGhlIGxhYmVsIGNhY2hlIGltbWVkaWF0ZWx5IGFmdGVyIHNjYW5uaW5nLgorICBTdXBwb3J0IHNjYW5uaW5nIGZvciBhIHNpbmdsZSBWRyBpbiBpbmRlcGVuZGVudCBtZGFzLgorICBEb24ndCBza2lwIGZ1bGwgc2NhbiB3aGVuIGluZGVwZW5kZW50IG1kYXMgYXJlIHByZXNlbnQgZXZlbiBpZiBtZW1sb2NrIGlzIHNldC4KKyAgU2V0IGNtZC0+aW5kZXBlbmRlbnRfbWV0YWRhdGFfYXJlYXMgaWYgbWV0YWRhdGEvZGlycyBvciBkaXNrX2FyZWFzIGluIHVzZS4KKyAgQ29wZSBiZXR0ZXIgd2l0aCBhbiB1bmRlZmluZWQgdGFyZ2V0X3BlcmNlbnQgb3BlcmF0aW9uIGluIF9wZXJjZW50X3J1bi4KKyAgQXZvaWQgd3JpdGluZyB0byBmcmVlZCBtZW1vcnkgaW4gdmdfcmVsZWFzZSBhbmQgcmVuYW1lIHRvIGZyZWVfdmcuICAoMi4wMi43OCkKKworVmVyc2lvbiAyLjAyLjc4IC0gNnRoIERlY2VtYmVyIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFib3J0IGlmIHNlZ21lbnQgdGFnIGFsbG9jYXRpb24gZmFpbHMgaW4gcG9vbCBmb3JtYXQgX2FkZF9zdHJpcGVfc2VnLgorICBBYm9ydCBpbiBfbWlycm9yZWRfdHJhbnNpZW50X3N0YXR1cyBpZiByZWZlcmVuY2VkIGxvZy9pbWFnZSBMViBpcyBub3QgYWN0aXZlLgorICBBZGQgYmFja3RyYWNlcyBmb3IgZGV2X3NldCgpIGFuZCBkZXZfY2xvc2VfaW1tZWRpYXRlKCkgZXJyb3JzIGluIHNldF9sdigpLgorICBMb2cgYW55IHVubGluaygpIGVycm9yIGluIGNsdm1kIHJlbW92ZV9sb2NrZmlsZSgpLgorICBMb2cgYW55IHBpcGUgd3JpdGUoKSBvciBjbG9zZSgpIGVycm9ycyBpbiBjbHZtZCBjaGlsZF9pbml0X3NpZ25hbCgpLgorICBEZXRlY3QgaWYgb3JwaGFuIHZnaW5mbyB3YXMgbG9zdCBmcm9tIGNhY2hlIGJlZm9yZSBfbHZtY2FjaGVfdXBkYXRlX3ZnbmFtZSgpLgorICBEbyBhIGZ1bGwgcmVzY2FuIGlmIHNvbWUgZGV2aWNlIGlzIG1pc3NpbmcgaW4gbHZtMSBmb3JtYXQgcmVhZF9wdnNfaW5fdmcuCisgIEFkZCBtaXNzaW5nIGNoZWNrIHRoYXQgZG1fcG9vbF9jcmVhdGUgc3VjY2VlZGVkIGluIHdyaXRlX2NvbmZpZ19ub2RlKCkuCisgIFVzZSBkbV9zbnByaW50ZiBpbiBjbHZtZC1jb21tYW5kLmMgdG8gZW5zdXJlIGFuIG92ZXJsb25nIGJ1ZmZlciBpcyB0cnVuY2F0ZWQuCisgIERvbid0IHdyaXRlIHRvIGJ1ZmZlciBpZiBpdHMgcmVhbGxvY2F0aW9uIGZhaWxlZCBpbiBjbHZtZCBkb19jb21tYW5kKCkuCisgIFN3aXRjaCBmcm9tIGZsb2F0IHRvIGZpeGVkIHBvaW50IHBlcmNlbnRhZ2UgaGFuZGxpbmcuCisgIEF2b2lkIG1pc2xlYWRpbmcgbWlzc2luZyBQViB3YXJuaW5ncyBpbiB2Z2V4dGVuZCAtLXJlc3RvcmVtaXNzaW5nLgorICBGaXggbWVtb3J5IGxlYWsgd2hlbiBWRyBhbGxvY2F0aW9uIHBvbGljeSBpbiBtZXRhZGF0YSBpcyBpbnZhbGlkLgorICBJZ25vcmUgdW5yZWNvZ25pc2VkIGFsbG9jYXRpb24gcG9saWN5IGZvdW5kIGluIG1ldGFkYXRhIGluc3RlYWQgb2YgYWJvcnRpbmcuCisgIEZhY3RvciBvdXQgdGFnIHByaW50aW5nIGludG8gX291dF90YWdzIGFuZCBhdm9pZCBsZWFraW5nIHN0cmluZyBidWZmZXIuCisgIFJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMgJiBhc3NpZ25tZW50cy4KKyAgQWRkIG1pc3NpbmcgdmdfcmVsZWFzZSBjYWxscyBpbiBfdmdfcmVhZF9ieV92Z2lkLgorICBGaXggZGVidWcgbG9nZ2luZyBvZiBkZXJpdmVkIGZsYWcgTENLX0NBQ0hFIGluIGNsdm1kLgorICBGaXggdGVzdCBmb3Igbm8gc3lzdGVtX2RpciBpbiBfaW5pdF9iYWNrdXAoKS4KKyAgRGlzYWxsb3cgbHZjb252ZXJ0IG9wcyB0aGF0IGJvdGggYWxsb2NhdGUgJiBmcmVlIHN1cHBsaWVkIFBFcyBpbiBhIHNpbmdsZSBjbWQuCisgIEZpeCBsaWJsdm0gc2VnX3NpemUgdG8gZ2l2ZSBieXRlcyBub3Qgc2VjdG9ycy4KKyAgQWRkIGZ1bmN0aW9ucyB0byBsb29rIHVwIExWL1BWIGJ5IG5hbWUvdXVpZCB0byBsaWJsdm0uCisgIEZyZWUgY21kX2NvbnRleHQgaWYgZmFsbGJhY2sgdG8gTFZNMSBmYWlscyBpbiBsdm0yX21haW4oKS4KKyAgRnJlZSBkZXZpY2UgbmFtZSBidWZmZXIgaW4gZG1zZXR1cCBwYXJzZV9sb29wX2RldmljZV9uYW1lKCkgZXJyb3IgcGF0aHMuCisgIENsb3NlIGZvcm1hdCBsaWIgaWYgaW5pdF9mb3JtYXRfZm4gZmFpbHMgaW4gX2luaXRfZm9ybWF0cygpLgorICBEb24ndCBsZWF2ZSAvcHJvYy9tb3VudHMgb3BlbiBhZnRlciBkbWV2ZW50ZCBzbmFwc2hvdCBldmVudCBwcm9jZXNzaW5nLgorICBGaXggb3V0LW9mLXNjb3BlIGFyZ192Z25hbWVzIHVzZSBpbiBwcm9jZXNzX2VhY2hfbHYoKS4KKyAgUmVtb3ZlIGluY29ycmVjdCBkbV90YXNrX2Rlc3Ryb3koTlVMTCkgZnJvbSBfbm9kZV9jbGVhcl90YWJsZSgpIGVycm9yIHBhdGguCisgIEFkZCBtaXNzaW5nIGNsb3NlZGlyIGluIF9ybV9ibGtzIGFmdGVyIHJlbW92aW5nIHN0cmF5IExWTTEgVkcgZmlsZXMuCisgIFN1cHByZXNzICdObyBQViBsYWJlbCcgbWVzc2FnZSB3aGVuIHJlbW92aW5nIHNldmVyYWwgUFZzIHdpdGhvdXQgbWRhcy4KKyAgRml4IGRlZmF1bHQgL2V0Yy9sdm0gcGVybWlzc2lvbnMgdG8gYmUgMDc1NS4gKDIuMDIuNjYpCisKK1ZlcnNpb24gMi4wMi43NyAtIDIybmQgTm92ZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFsbG9jYXRlIGEgcG9vbCBmb3IgZHVtbXkgVkcgaW4gX3B2c2Vnc19zdWJfc2luZ2xlLgorICBBZGQgUFYgYW5kIExWIHNlZ21lbnQgdHlwZXMgYW5kIGZ1bmN0aW9ucyB0byBsaWJsdm0uCisgIEFkZCBzZXRfcHJvcGVydHkgZnVuY3Rpb25zIHRvIGxpYmx2bS4KKyAgUmVtb3ZlIHRhZyBsZW5ndGggcmVzdHJpY3Rpb24gYW5kIGFsbG93IC8gPSAhIDogIyAmIGNoYXJhY3RlcnMuCisgIFN1cHBvcnQgcmVwZXRpdGlvbiBvZiAtLWFkZHRhZyBhbmQgLS1kZWx0YWcgYXJndW1lbnRzLgorICBBZGQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHNwZWNpZmljIGNtZGxpbmUgYXJndW1lbnRzIHRvIGJlIHJlcGVhdGVkIGluIGdyb3Vwcy4KKyAgU3BsaXQgdGhlX2FyZ3MgY21kbGluZSBhcmd1bWVudHMgYW5kIHZhbHVlcyBpbnRvIGFyZ19wcm9wcyBhbmQgYXJnX3ZhbHVlcy4KKyAgRml4IGZzYWRtIG5vIGxvbmdlciB0byByZXF1aXJlICctZicgdG8gcmVzaXplIGFuIHVubW91bnRlZCBmaWxlc3lzdGVtLgorICBGaXggZnNhZG0gdG8gZGV0ZWN0IG1vdW50ZWQgZmlsZXN5c3RlbXMgb24gb2xkZXIgc3lzdGVtcy4gKDIuMC43NSkKKyAgRXh0ZW5kIGNsaW5nIGFsbG9jYXRpb24gcG9saWN5IHRvIHJlY29nbmlzZSBQViB0YWdzIChjbGluZ19ieV90YWdzKS4KKyAgQWRkIGFsbG9jYXRpb24vY2xpbmdfdGFnX2xpc3QgdG8gbHZtLmNvbmYuCisgIFJlZ2VuZXJhdGUgY29uZmlndXJlIHdpdGggJ2F1dG9yZWNvbmYnIGZvciAtLWVuYWJsZS1vY2YuICgyLjAyLjc2KQorCitWZXJzaW9uIDIuMDIuNzYgLSA4dGggTm92ZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2xhcmlmeSBlcnJvciBtZXNzYWdlcyB3aGVuIGFjdGl2YXRpb24gZmFpbHMgZHVlIHRvIGFjdGl2YXRpb24gZmlsdGVyIHVzZS4KKyAgQWRkIHBhY2VtYWtlciBzY3JpcHQgVm9sdW1lR3JvdXAub2NmIHdpdGggY29uZmlndXJlIC0tZW5hYmxlLW9jZi4KKyAgSW1wb3J0IG1ha2UudG1wbCBpbnRvIGluY2x1ZGUvIE1ha2VmaWxlLgorICBGaXggaGFuZGxpbmcgb2Ygb25saW5lIGZpbGVzeXN0ZW0gcmVzaXplICh1c2luZyBuZXcgZnNhZG0gcmV0dXJuIGNvZGUpLgorICBBZGQgRElBR05PU1RJQ1Mgc2VjdGlvbiB0byBmc2FkbSBtYW4gcGFnZS4KKyAgTW9kaWZ5IGZzYWRtIHRvIHJldHVybiBkaWZmZXJlbnQgc3RhdHVzIGNvZGUgZm9yIGNoZWNrIG9mIG1vdW50ZWQgZmlsZXN5c3RlbS4KKyAgVXBkYXRlIFZHIG1ldGFkYXRhIG9ubHkgb25jZSBpbiB2Z2NoYW5nZSB3aGVuIG1ha2luZyBtdWx0aXBsZSBjaGFuZ2VzLgorICBBbGxvdyBpbmRlcGVuZGVudCB2Z2NoYW5nZSBhcmd1bWVudHMgdG8gYmUgdXNlZCB0b2dldGhlci4KKyAgQXV0b21hdGljYWxseSB1bm1vdW50IGludmFsaWRhdGVkIHNuYXBzaG90cyBpbiBkbWV2ZW50ZC4KKyAgU3VwcHJlc3Mgc29tZSBzdXBlcmZsdW91cyBtZXNzYWdlcyBmcm9tIGNsYW5nIHN0YXRpYyBhbmFseXNpcy4KKyAgRml4IGEgZGVhZGxvY2sgY2F1c2VkIGJ5IGRvdWJsZSBjbG9zZSBpbiBjbHZtZC4KKyAgRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvbiB0b28tbGFyZ2UgTURBIGVycm9yIHBhdGggaW4gX3ZnX3JlYWRfcmF3X2FyZWEuCisgIFVzZSBzdGF0aWMgZm9yIGludGVybmFsIF9hbGlnbl9jaHVuaygpIGFuZCBfbmV3X2NodW5rKCkgZnJvbSBwb29sLWZhc3QuYy4KKyAgRml4IHZnY2hhbmdlIHRvIHByb2Nlc3MgLWEsIC0tcmVmcmVzaCwgLS1tb25pdG9yIGFuZCAtLXBvbGwgbGlrZSBsdmNoYW5nZS4KKyAgQWRkIGx2bTJhcHAgZnVuY3Rpb25zIHRvIHF1ZXJ5IGFueSBwdiwgdmcsIG9yIGx2IHByb3BlcnR5IC8gcmVwb3J0IGZpZWxkLgorCitWZXJzaW9uIDIuMDIuNzUgLSAyNXRoIE9jdG9iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQW5ub3RhdGUgbW9yZSB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXMgY29uc3QuCisgIEZpeCBtaXNzaW5nIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGluIGNsdXN0ZXJfc2VuZCgpIGZ1bmN0aW9uIGZyb20gY21pcnJvcmQuCisgIEZpeCBwb2ludGVyIGZvciBWRyBuYW1lIGluIF9wdl9yZXNpemVfc2luZ2xlIGVycm9yIGNvZGUgcGF0aC4KKyAgRml4IHdhcm5pbmcgZm9yIGNoYW5nZWQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgZG1ldmVudGQgcmVhZC93cml0ZSBmdW5jLgorICBBZGQgZ2xvYmFsL21ldGFkYXRhX3JlYWRfb25seSB0byB1c2UgdW5yZXBhaXJlZCBtZXRhZGF0YSBpbiByZWFkLW9ubHkgY21kcy4KKyAgRG9uJ3QgdGFrZSB3cml0ZSBsb2NrIGluIHZnY2hhbmdlIC0tcmVmcmVzaCwgLS1wb2xsIG9yIC0tbW9uaXRvci4KKyAgU2tpcCBkbSBkZXZpY2VzIGluIHNjYW4gaWYgdGhleSBjb250YWluIG9ubHkgZXJyb3IgdGFyZ2V0cyBvciBhcmUgZW1wdHkuCisgIEZpeCBzdHJpY3QtYWxpYXNpbmcgY29tcGlsZSB3YXJuaW5nIGluIHBhcnRpdGlvbiB0YWJsZSBzY2FubmluZy4KKyAgRml4IHB0aHJlYWQgbXV0ZXggdXNhZ2UgZGVhZGxvY2sgaW4gY2x2bWQuCisgIEF1dG9tYXRpY2FsbHkgZXh0ZW5kIHNuYXBzaG90cyB3aXRoIGRtZXZlbnRkIGFjY29yZGluZyB0byBwb2xpY3kgaW4gbHZtLmNvbmYuCisgIEFkZCBhY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfdGhyZXNob2xkL3BlcmNlbnQgdG8gbHZtLmNvbmYuCisgIEZpeCBsaWJsdm0yY21kIGxpbmsgb3JkZXIgdG8gc3VwcG9ydCAtLWFzLW5lZWRlZC4KKyAgUmVtb3ZlIGRlcGVuZGVuY3kgb24gbGlibSBieSByZXBsYWNpbmcgZmxvb3IoKSBieSBhbiBpbnRlZ2VyLWJhc2VkIGFsZ29yaXRobS4KKyAgRml4IGhhbmcgd2hlbiByZXBhaXJpbmcgYSBtaXJyb3JlZC1sb2cgdGhhdCBoYWQgYm90aCBkZXZzIGZhaWwuCisgIENvbnZleSBuZWVkIGZvciBzbmFwc2hvdC1tZXJnZSB0YXJnZXQgaW4gbHZjb252ZXJ0IGVycm9yIG1lc3NhZ2UgYW5kIG1hbiBwYWdlLgorICBBZGQgZGV2aWNlcy9kaXNhYmxlX2FmdGVyX2Vycm9yX2NvdW50IGNvbmZpZyB0byBsaW1pdCBhY2Nlc3MgdG8gZmFpbGluZyBkZXZzLgorICBHaXZlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSB3aGVuIGNyZWF0aW5nIGEgdG9vLXNtYWxsIHNuYXBzaG90LgorICBJbXBsZW1lbnQgdmdleHRlbmQgLS1yZXN0b3JlbWlzc2luZyB0byByZWluc3RhdGUgbWlzc2luZyBkZXZzIHRoYXQgcmV0dXJuLgorICBNYWtlIGx2Y29udmVydCByZXNwZWN0IC0teWVzIGFuZCAtLWZvcmNlIHdoZW4gY29udmVydGluZyBhbiBpbmFjdGl2ZSBsb2cuCisgIFJlZmFjdG9yIGFuZCBhZGQgJ2dldCcgZnVuY3Rpb25zIGZvciBsdiBwcm9wZXJ0aWVzL2ZpZWxkcy4KKyAgVXBkYXRlIHNjcmlwdCBmb3IgZnNhZG0gdGVzdGluZy4KKyAgQmV0dGVyIHN1cHBvcnQgb2Ygbm9uaW50ZXJhY3RpdmUgc2hlbGwgZXhlY3V0aW9uIG9mIGZzYWRtLgorICBGaXggdXNhZ2Ugb2YgLS15ZXMgZmxhZyBmb3IgUmVpc2VyRlMgcmVzaXplIGluIGZzYWRtLgorICBGaXggZGV0ZWN0aW9uIG9mIG1vdW50ZWQgZmlsZXN5c3RlbXMgZm9yIGZzYWRtIHdoZW4gdWRldiBpcyB1c2VkLgorICBGaXggYXNzaWdubWVudCBvZiBkZWZhdWx0IHZhbHVlIHRvIExWTSB2YXJpYWJsZSBpbiBmc2FkbS4KKyAgRml4IHN1cHBvcnQgZm9yIC0teWVzIGZsYWcgZm9yIGZzYWRtLgorICBEbyBub3QgZXhlY3V0ZSBsdnJlc2l6ZSBmcm9tIGZzYWRtIC0tZHJ5LXJ1bi4KKyAgRml4IGZzYWRtIHJldHVybiBlcnJvciBjb2RlIGZyb20gdXNlcidzIGJyZWFrIGFjdGlvbi4KKyAgQWxsb3cgQ0MgdG8gYmUgb3ZlcnJpZGRlbiBhdCBidWlsZCB0aW1lIChmb3IgJ3NjYW4tYnVpbGQgbWFrZScpLgorICBSZW5hbWUgJ2ZsYWdzJyB0byAnc3RhdHVzJyBpbiBzdHJ1Y3QgbWV0YWRhdGFfYXJlYS4KKyAgQXZvaWQgc2VnZmF1bHQgYnkgbGltaXRpbmcgcGFydGlhbCBtb2RlIGZvciBsdm0xIG1ldGFkYXRhLiAoMi4wMi43NCkKKyAgVXNlIGRtX3phbGxvYyBhbmQgZG1fcG9vbF96YWxsb2MgdGhyb3VnaG91dC4KKyAgQWRkIHB2X2dldF9wcm9wZXJ0eSBhbmQgY3JlYXRlIGdlbmVyaWMgaW50ZXJuYWwgX2dldF9wcm9wZXJ0eSBmdW5jdGlvbi4KKyAgQWRkICdnZXQnIGZ1bmN0aW9ucyBmb3IgcHYgYW5kIHZnIHByb3BlcnRpZXMvZmllbGRzLgorICBNYWtlIGdlbmVyaWMgR0VUXypfUFJPUEVSVFlfRk4gbWFjcm9zIHdpdGggc2Vjb25kYXJ5IG1hY3JvIGZvciB2ZywgcHYgJiBsdi4KKyAgQWRkIHRhZ3NfZm9ybWF0X2FuZF9jb3B5KCkgY29tbW9uIGZ1bmN0aW9uIGFuZCBjYWxsIGZyb20gX3RhZ3NfZGlzcC4KKyAgQWRkIGlkX2Zvcm1hdF9hbmRfY29weSgpIGNvbW1vbiBmdW5jdGlvbiBhbmQgY2FsbCBmcm9tIF91dWlkX2Rpc3AuCisgIFJlZmFjdG9yIHJlcG9ydC5jICcqX2Rpc3AnIGZ1bmN0aW9ucyB0byBjYWxsIHN1cHBvcnRpbmcgZnVuY3Rpb25zLgorICBNb3ZlIHBhcnRzIG9mIG1ldGFkYXRhKi5bY2hdIGludG8gbmV3IHtwdnx2Z3xsdn0uW2NoXSBmaWxlcy4KKyAgRml4IHZnX3JlYWQgbWVtb3J5IGxlYWsgd2l0aCBkaXJlY3RvcnktYmFzZWQgbWV0YWRhdGEuCisgIEZpeCBtZW1vcnkgbGVhayBvZiBjb25maWdfdHJlZSBpbiByZWluaXRpYWxpemF0aW9uIGNvZGUgcGF0aC4KKyAgRml4IHBvb2wgZGVzdHJ1Y3Rpb24gb3JkZXIgaW4gZG1ldmVudGRfbHZtMl9leGl0KCkgdG8gYXZvaWQgbGVhayBkZWJ1ZyBtZXNnLgorICBSZWFkIHdob2xlIC9wcm9jL3NlbGYvbWFwcyBmaWxlIGJlZm9yZSB3b3JraW5nIHdpdGggbWFwcyBlbnRyaWVzLgorICBTcGVlZCB1cCB1bnF1b3Rpbmcgb2YgcXVvdGVkIGRvdWJsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLgorICBTcGVlZCB1cCBDUkMzMiBjYWxjdWxhdGlvbnMgYnkgdXNpbmcgYSBsYXJnZXIgbG9va3VwIHRhYmxlLgorCitWZXJzaW9uIDIuMDIuNzQgLSAyNHRoIFNlcHRlbWJlciAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFsbG93IDogYW5kIEAgdG8gYmUgZXNjYXBlZCB3aXRoIFwgaW4gZGV2aWNlIG5hbWVzIG9mIFBWcy4KKyAgUmVwbGFjZSBhbGxvY2Egd2l0aCBkbV9tYWxsb2MgaW4gX2FsaWduZWRfaW8gdG8gYXZvaWQgc3RhY2sgY29ycnVwdGlvbi4KKyAgRml4IHBhcnRpYWwgbW9kZSBvcGVyYXRpb25zIGZvciBsdm0xIG1ldGFkYXRhIGZvcm1hdC4KKyAgVHJhY2sgcmVjdXJzaXZlIGZpbHRlciBpdGVyYXRpb24gdG8gYXZvaWQgcmVmcmVzaGluZyB3aGlsZSBpbiB1c2UuICgyLjAyLjU2KQorICBSZXZlcnQgdG8gb2xkIGdsaWJjIHZzbnByaW50ZiBiZWhhdmlvdXIgaW4gZW1pdF90b19idWZmZXIoKSB0byBjYXRjaCBvdmVyZmxvdy4KKyAgQWxsb2NhdGUgYnVmZmVyIGZvciBtZXRhZGF0YSB0YWdzIGR5bmFtaWNhbGx5IHRvIHJlbW92ZSA0ayBsaW1pdC4KKyAgQWRkIHJhbmRvbSBzdWZmaXggdG8gYXJjaGl2ZSBmaWxlIG5hbWVzIHRvIHByZXZlbnQgcmFjZXMgd2hlbiBiZWluZyBjcmVhdGVkLgorICBSZWluaXRpYWxpemUgYXJjaGl2ZSBhbmQgYmFja3VwIGhhbmRsaW5nIG9uIHRvb2xjb250ZXh0IHJlZnJlc2guCisgIE1ha2UgcG9sbF9taXJyb3JfcHJvZ3Jlc3MgcmVwb3J0IFBST0dSRVNTX0NIRUNLX0ZBSUxFRCBpZiBMViBpcyBub3QgYSBtaXJyb3IuCisgIExpa2UgbWlycm9ycywgZG9uJ3Qgc2NhbiBvcmlnaW5zIGlmIGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygpIGlzIHNldC4KKyAgRml4IHJldHVybiB0eXBlIHF1YWxpZmllciB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLiAoMi4wMi42OSkKKyAgQXV0b21hdGljYWxseSBnZW5lcmF0ZSBMU0IgUmVxdWlyZXMtU3RhcnQgZm9yIGNsdm1kIGluaXQgc2NyaXB0LgorICBGaXggcmV0dXJuIGNvZGUgb2YgcHZtb3ZlIC0tYWJvcnQgUFYuCisgIEZpeCBwdm1vdmUgLS1hYm9ydCB0byByZW1vdmUgZXZlbiBmb3IgZW1wdHkgcHZtb3ZlIExWLgorICBBZGQgY29uZmlndXJlIC0td2l0aC1kZWZhdWx0LWRhdGEtYWxpZ25tZW50LgorICBVcGRhdGUgaGV1cmlzdGljIHVzZWQgZm9yIGRlZmF1bHQgYW5kIGRldGVjdGVkIGRhdGEgYWxpZ25tZW50LgorICBBZGQgImRldmljZXMvZGVmYXVsdF9kYXRhX2FsaWdubWVudCIgdG8gbHZtLmNvbmYuCisgIEFkZCBpbXBsZW1lbnRhdGlvbiBmb3Igc2ltcGxlIG51bWVyaWMgJ2dldCcgcHJvcGVydHkgZnVuY3Rpb25zLgorICBEZWZpbmUgR0VUX05VTV9QUk9QRVJUWV9GTiBtYWNybyB0byBzaW1wbGlmeSBudW1lcmljIHByb3BlcnR5ICdnZXQnIGZ1bmN0aW9uCisgIEFkZCBwcm9wZXJ0aWVzLltjaF0gdG8gbGliL3JlcG9ydCB1c2luZyBjb2x1bW5zLmguCisgIEFkZCBtYWNybyBkZWZpbml0aW9ucyB0byByZXBvcnQgaW5mcmFzdHJ1Y3R1cmUgZm9yIGNoYXJhY3RlciBhcnJheSBsZW5ndGguCisgIFJlbW92ZSBleHBsaWNpdCBkb3VibGUgcXVvdGVzIGZyb20gY29sdW1ucy5oICdpZCcgZW50cmllcy4KKyAgQWRkICdmbGFncycgZmllbGQgdG8gY29sdW1ucy5oIGFuZCBkZWZpbmUgRklFTERfTU9ESUZJQUJMRS4KKyAgQWRkIHZnX21kYV9zaXplIGFuZCB2Z19tZGFfZnJlZSBmdW5jdGlvbnMuCisgIFNpbXBsaWZ5IE1EL3N3YXAgc2lnbmF0dXJlIGRldGVjdGlvbiBpbiBwdmNyZWF0ZSBhbmQgYWxsb3cgYWJvcnRpbmcuCisgIEFsbG93IC0teWVzIHRvIGJlIHVzZWQgd2l0aG91dCAtLWZvcmNlIG1vZGUuCisgIEZpeCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBzd2FwIHNpZ25hdHVyZSBkZXRlY3Rpb24gZXJyb3IgcGF0aC4KKyAgRGV0ZWN0IGFuZCBhbGxvdyBhYm9ydCBpbiBwdmNyZWF0ZSBpZiBMVUtTIHNpZ25hdHVyZSBpcyBkZXRlY3RlZC4KKyAgQWx3YXlzIG1hc2sgbG9jayBmbGFncyBjb3JyZWN0bHkgd2hlbiBjaGVja2luZyBmb3IgTENLX1dSSVRFLgorCitWZXJzaW9uIDIuMDIuNzMgLSAxOHRoIEF1Z3VzdCAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBwb3RlbnRpYWwgZm9yIGNvcnJ1cHRpb24gZHVyaW5nIGNsdXN0ZXIgbWlycm9yIGRldmljZSBmYWlsdXJlLgorICBVc2UgJ1NJTkdMRU5PREUnIGluc3RlYWQgb2YgJ2RlYWQnIGluIGNsdm1kIHNpbmdsZW5vZGUgbWVzc2FnZXMuCisgIElnbm9yZSBzbmFwc2hvdHMgd2hlbiBwZXJmb3JtaW5nIG1pcnJvciByZWNvdmVyeSBiZW5lYXRoIGFuIG9yaWdpbi4KKyAgUGFzcyBMQ0tfT1JJR0lOX09OTFkgZmxhZyBhcm91bmQgY2x1c3Rlci4KKyAgQWRkIHN1c3BlbmRfbHZfb3JpZ2luIGFuZCByZXN1bWVfbHZfb3JpZ2luIHVzaW5nIExDS19PUklHSU5fT05MWS4KKyAgQWxsb3cgaW50ZXJuYWwgc3VzcGVuZCBhbmQgcmVzdW1lIG9mIG9yaWdpbiB3aXRob3V0IGl0cyBzbmFwc2hvdHMuCisgIEZpeCBkZXZfbWFuYWdlcl90cmFuc2llbnQgdG8gYWNjZXNzIC1yZWFsIGRldmljZSBub3Qgc25hcHNob3Qtb3JpZ2luLgorICBNb25pdG9yIG9yaWdpbiAtcmVhbCBkZXZpY2UgYmVsb3cgc25hcHNob3QgaW5zdGVhZCBvZiBvdmVybGF5IGRldmljZS4KKyAgRG9uJ3QgcmVhbGx5IGNoYW5nZSBtb25pdG9yaW5nIHN0YXR1cyB3aGVuIGluIHRlc3QgbW9kZS4KKyAgRml4IHNvbWUgZXhpdCBzdGF0dXNlcyB3aGVuIHN0YXJ0aW5nL3N0b3BwaW5nIG1vbml0b3JpbmcgZmFpbHMuCisgIEVuYWJsZSBzbmFwc2hvdCBtb25pdG9yaW5nIGJ5IGRlZmF1bHQgd2hlbiBkbWV2ZW50ZCBpcyBlbmFibGVkLgorICBNb3ZlIGNsb25lZCBsaWJkZXZtYXBwZXItZXZlbnQgY2xpZW50IGNvZGUgZnJvbSBzZWdtZW50cyBpbnRvIGxpYi9hY3RpdmF0ZS4KKyAgRml4ICdsdmNvbnZlcnQgLS1zcGxpdG1pcnJvcnMnIGluIGNsdXN0ZXIgb3BlcmF0aW9uLgorICBGaXggY2x2bWQgaW5pdCBzY3JpcHQgZXhpdCBjb2RlIHRvIHJldHVybiA0IHdoZW4gZXhlY3V0ZWQgYXMgbm9uLXJvb3QgdXNlci4KKyAgQ2hhbmdlIGRlZmF1bHQgYWxpZ25tZW50IG9mIHBlX3N0YXJ0IHRvIDFNQi4KKyAgQWRkIC0tbm9yZXN0b3JlZmlsZSBvcHRpb24gdG8gcHZjcmVhdGUuCisgIFJlcXVpcmUgLS1yZXN0b3JlZmlsZSB3aGVuIHVzaW5nIHB2Y3JlYXRlIC0tdXVpZC4KKyAgUmVjb2duaXNlIGFuZCBnaXZlIHByZWZlcmVuY2UgdG8gbWQgZGV2aWNlIHBhcnRpdGlvbnMgKGJsa2V4dCBtYWpvcikuCisgIE5ldmVyIHNjYW4gaW50ZXJuYWwgTFZNIGRldmljZXMuCisgIERvbid0IGlnbm9yZSB1c2VyLXNwZWNpZmllZCBQVnMgaW4gc3BsaXQtbWlycm9yIG9wZXJhdGlvbnMuICgyLjAyLjcxKQorICBGaXggZGF0YSBjb3JydXB0aW9uIGJ1ZyBpbiBjbHVzdGVyIG1pcnJvcnMuCisgIFJlcXVpcmUgbG9naWNhbCB2b2x1bWUocykgdG8gYmUgZXhwbGljaXRseSBuYW1lZCBmb3IgbHZjb252ZXJ0IC0tbWVyZ2UuCisgIEF2b2lkIGNoYW5naW5nIGFsaWduZWQgcGVfc3RhcnQgYXMgYSBzaWRlLWVmZmVjdCBvZiB2ZXJ5IHZlcmJvc2UgbG9nZ2luZy4KKyAgVXNlIGJ1aWx0LWluIHJ1bGUgZm9yIGRldmljZSBhbGlhc2VzOiBibG9jay8gPCBkbS0gPCBkaXNrLyA8IG1hcHBlci8gPCBvdGhlci4KKyAgRml4IGNvbnN0IHdhcm5pbmcgaW4gZGV2X21hbmFnZXJfaW5mbygpIGFuZCBfZGV2X21hbmFnZXJfbHZfcm1ub2RlcygpLgorICBGaXggY29uc3Qgd2FybmluZyBpbiBhcmNoaXZlX2ZpbGUgc3RydWN0dXJlIGZyb20gYXJjaGl2ZS5jLgorICBDbGVhbiBnZW5lcmF0ZWQgZmlsZXMgLmV4cG9ydGVkX3N5bWJvbHNfZ2VuZXJhdGVkLCBleGFtcGxlLmNvbmYgZm9yIGRpc3RjbGVhbi4KKyAgSGFuZGxlIGZhaWx1cmUgb2YgYWxsIG1pcnJvcmVkIGxvZyBkZXZpY2VzIGFuZCBhbGwgYnV0IG9uZSBtaXJyb3IgbGVnLgorICBEaXNhbGxvdyAnbWlycm9yZWQnIGxvZyB0eXBlIGZvciBjbHVzdGVyIG1pcnJvcnMuCisgIERvIG5vdCB1c2UgVlBBVEggaW4gaW5jbHVkZS9NYWtlZmlsZS4KKyAgRml4IGV4cG9ydGVkX3N5bWJvbHMgZ2VuZXJhdGlvbiB0byB1c2Ugc3RhbmRhcmQgY29tcGlsZXIgYXJndW1lbnRzLgorICBVc2UgI2luY2x1ZGUgPD4gbm90ICIiIGluIGx2bTJhcHAuaCB3aGljaCBnZXRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLgorICBNYWtlIGxpYiBhbmQgbGlibHZtLmRldmljZS1tYXBwZXIgd2FpdCBmb3IgaW5jbHVkZSBmaWxlIGdlbmVyYXRpb24uCisgIEZpeCBjb25maWd1cmUgdG8gc3VwcGx5IERFRkFVTFRfUlVOX0RJUiB0byBNYWtlZmlsZXMuCisgIEZpeCBhbGxvY2F0aW9uIG9mIHdyb25nIG51bWJlciBvZiBtaXJyb3IgbG9ncyB3aXRoICdyZW1vdmUnIGZhdWx0IHBvbGljeS4KKworVmVyc2lvbiAyLjAyLjcyIC0gMjh0aCBKdWx5IDIwMTAgIFtDVkUtMjAxMC0yNTI2XQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDaGFuZ2UgY2x2bWQgdG8gY29tbXVuaWNhdGUgd2l0aCBsdm0yIHZpYSBhIHNvY2tldCBpbiAvdmFyL3J1bi9sdm0uCisgIFJldHVybiBjb250cm9sbGVkIGVycm9yIGlmIGNsdm1kIGlzIHJ1biBieSBub24tcm9vdCB1c2VyLgorICBBZGQgY29uZmlndXJlIC0tZGVmYXVsdC1ydW4tZGlyIGZvciAvdmFyL3J1bi9sdm0uCisgIE5ldmVyIHVzZSBjbHZtZCBzaW5nbGVub2RlIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1Jc2luZ2xlbm9kZS4KKworVmVyc2lvbiAyLjAyLjcxIC0gMjh0aCBKdWx5IDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERvY3VtZW50IExWTSBmYXVsdCBoYW5kbGluZyBpbiBkb2MvbHZtX2ZhdWx0X2hhbmRsaW5nLnR4dC4KKyAgTWFrZSB2Z2NrIHdhcm4gYWJvdXQgbWlzc2luZyBQVnMuCisgIENsYXJpZnkgaGVscCB0ZXh0IGZvciB2Z19tZGFfY291bnQuCisgIENoZWNrIGlmIGNsdXN0ZXIgbG9nIGRhZW1vbiBpcyBydW5uaW5nIGJlZm9yZSBhbGxvd2luZyBjbWlycm9yIGNyZWF0ZS4KKyAgQWRkIHVuaXQtdGVzdHMgZGlyLgorICBBZGQgY29uZmlndXJlIC0tZW5hYmxlLXRlc3RpbmcgYW5kIHJlcG9ydHMgYW5kIHJlcG9ydC1nZW5lcmF0b3JzIGRpcnMuCisgIENvcnJlY3QgTFYgbGlzdCBvcmRlciB1c2VkIGJ5IGx2Y29udmVydCB3aGVuIHNwbGl0dGluZyBhIG1pcnJvci4KKyAgQ2hlY2sgaWYgTFYgd2l0aCBzcGVjaWZpZWQgbmFtZSBhbHJlYWR5IGV4aXN0cyB3aGVuIHNwbGl0dGluZyBhIG1pcnJvci4KKyAgRml4IHN1c3BlbmQvcmVzdW1lIGxvZ2ljIGZvciBMVnMgcmVzdWx0aW5nIGZyb20gc3BsaXR0aW5nIGEgbWlycm9yLgorICBVcGRhdGUgcHZjcmVhdGUsIHtwdnx2Z31jaGFuZ2UsIGFuZCBsdm0uY29uZiBtYW4gcGFnZXMgYWJvdXQgbWV0YWRhdGFpZ25vcmUuCisgIFN3aXRjaCBjbWlycm9yZCBhbmQgY2x2bWQgdG8gdXNlIGRtX2NyZWF0ZV9sb2NrZmlsZS4KKyAgQWxsb3cgY2x2bWQgcGlkZmlsZSB0byBiZSBjb25maWd1cmFibGUuCisgIFVwZGF0ZSBjb21tZW50cyBhYm91dCBtZW1vcnkgaGFuZGxpbmcgaW4gbHZtMmFwcC5oLgorICBBZGQgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzIHdoaWxlIGNoZWNraW5nIHZvbHVtZV9saXN0IGFuZCBob3N0dGFncyBzZXR0aW5ncy4KKyAgQWRkIGxvZ19lcnJvciB3aGVuIHN0cmR1cCBmYWlscyBpbiB7dmd8bHZ9X2NoYW5nZV90YWcoKS4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVzIGluIGxpYmx2bSBmaWxlcy4KKyAgVXNlIF9fYXR0cmlidXRlX18gY29uc2lzdGVudGx5IHRocm91Z2hvdXQuCisgIEZpeCByZWR1bmRhbnQgZGVjbGFyYXRpb25zIGFuZCBhbHdheXMgY29tcGlsZSB3aXRoIC1XcmVkdW5kYW50LWRlY2xzLgorICBGaXggcG9zc2libGUgaGFuZyB3aGVuIGFsbCBtaXJyb3IgaW1hZ2VzIG9mIGEgbWlycm9yZWQgbG9nIGZhaWwuCisgIFBhc3MgbWV0YWRhdGFpZ25vcmUgdG8gcHZfY3JlYXRlLCBwdl9zZXR1cCwgX21kYV9zZXR1cCwgYW5kIGFkZF9tZGEuCisgIEluaXQgbWRhLT5saXN0IGluIG1kYV9jb3B5LgorICBEbyBub3QgbG9nIGJhY2t0cmFjZSBpbiB2YWxpZCBfbHZfcmVzdW1lKCkgY29kZSBwYXRoLgorICBDbGVhbnVwIGhlbHAgc3RyaW5ncyBpbiBjb25maWd1cmUuaW4uCisgIFByb21wdCBpZiBtZXRhZGF0YWlnbm9yZSB3aXRoIHZnZXh0ZW5kIG9yIHB2Y2hhbmdlIHdvdWxkIGFkanVzdCB2Z19tZGFfY29waWVzLgorICBBZGp1c3QgdmdfbWRhX2NvcGllcyBpZiBtZXRhZGF0YWlnbm9yZSBnaXZlbiB3aXRoIHZnZXh0ZW5kIG9yIHB2Y2hhbmdlLgorICBBZGp1c3QgYXV0by1tZXRhZGF0YSByZXBhaXIgYW5kIGNhY2hpbmcgbG9naWMgdG8gdHJ5IHRvIGNvcGUgd2l0aCBlbXB0eSBtZGFzLgorCitWZXJzaW9uIDIuMDIuNzAgLSA2dGggSnVseSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlbW92ZSBsb2cgZGlyZWN0bHkgaWYgYWxsIG1pcnJvciBpbWFnZXMgb2YgYSBtaXJyb3JlZCBsb2cgZmFpbC4KKyAgUmFuZG9tbHkgc2VsZWN0IHdoaWNoIG1kYXMgdG8gdXNlIG9yIGlnbm9yZS4KKyAgQWRkIHNvbWUgbWlzc2luZyBzdGFuZGFyZCBjb25maWd1cmUuaW4gY2hlY2tzLgorICBBZGQgcHJpbnRmIGZvcm1hdCBhdHRyaWJ1dGVzIHRvIHllc19ub19wcm9tcHQgYW5kIGZpeCBhIGNhbGxlci4KKyAgQWx3YXlzIHBhc3MgdW5zdXNwZW5kZWQgZG0gZGV2aWNlcyB0aHJvdWdoIHBlcnNpc3RlbnQgZmlsdGVyIHRvIG90aGVyIGZpbHRlcnMuCisgIE1vdmUgdGVzdCBmb3Igc3VzcGVuZGVkIGRtIGRldmljZXMgYWhlYWQgb2Ygb3RoZXIgZmlsdGVycy4KKyAgRml4IGFub3RoZXIgc2VnZmF1bHQgaW4gY2x2bWQgLVIgaWYgbm8gcmVzcG9uc2UgZnJvbSBkYWVtb24uICgyLjAyLjY4KQorICBSZW1vdmUgc3VwZXJmbHVvdXMgc3VzcGVuZGVkIGRldmljZSBjb3VudGVyIGZyb20gY2x2bWQuCisgIEZpeCBsdm0gc2hlbGwgY3Jhc2ggd2hlbiBpbnB1dCBpcyBlbnRpcmVseSB3aGl0ZXNwYWNlLgorICBVcGRhdGUgcGFydGlhbCBtb2RlIHdhcm5pbmcgbWVzc2FnZS4KKyAgUHJlc2VydmUgbWVtbG9jayBiYWxhbmNlIGluIGNsdm1kIHdoZW4gYWN0aXZhdGlvbiB0cmlnZ2VycyBhIHJlc3VtZS4KKyAgUmVzdG9yZSB0aGUgcmVtb3ZlbWlzc2luZyBiZWhhdmlvdXIgb2YgbHZjb252ZXJ0IC0tcmVwYWlyIC0tdXNlLXBvbGljaWVzLgorCitWZXJzaW9uIDIuMDIuNjkgLSAzMHRoIEp1bmUgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHZncmVtb3ZlIHRvIGFsbG93IHJlbW92YWwgb2YgVkcgd2l0aCBtaXNzaW5nIFBWcy4gKDIuMDIuNTIpCisgIEFkZCBtZXRhZGF0YS92Z21ldGFkYXRhY29waWVzIHRvIGx2bS5jb25mLgorICBBZGQgLS1tZXRhZGF0YWlnbm9yZSB0byBwdmNyZWF0ZSBhbmQgdmdleHRlbmQuCisgIEFkZCB2Z19tZGFfY29waWVzLCBwdl9tZGFfdXNlZF9jb3VudCBhbmQgdmdfbWRhX3VzZWRfY291bnQgdG8gcmVwb3J0cy4KKyAgRGVzY3JpYmUgLS12Z21ldGFkYXRhY29waWVzIGluIGx2bS5jb25mIGFuZCBvdGhlciBtYW4gcGFnZXMuCisgIEFkZCAtLVt2Z11tZXRhZGF0YWNvcGllcyB0byBzZWxlY3QgbnVtYmVyIG9mIG1kYXMgdG8gdXNlIGluIGEgVkcuCisgIE1ha2UgdGhlIG1ldGFkYXRhIGlnbm9yZSBiaXQgY29udHJvbCByZWFkL3dyaXRlIG1ldGFkYXRhIGFyZWFzIGluIGEgUFYuCisgIEFkZCBwdmNoYW5nZSAtLW1ldGFkYXRhaWdub3JlIHRvIHNldCBvciBjbGVhciBhIG1ldGFkYXRhIGlnbm9yZSBiaXQuCisgIFJlZmFjdG9yIG1ldGFkYXRhIGNvZGUgdG8gcHJlcGFyZSBmb3IgLS1tZXRhZGF0YWlnbm9yZSAvIC0tdmdtZXRhZGF0YWNvcGllcy4KKyAgRW5zdXJlIHJlZ2lvbl9zaXplIG9mIG1pcnJvcmVkIGxvZyBkb2VzIG5vdCBleGNlZWQgaXRzIGZ1bGwgc2l6ZS4KKyAgR2VuZXJhdGUgbGlibHZtMmFwcCBleHBvcnRlZCBzeW1ib2xzIGZyb20gaGVhZGVyIGZpbGUuCisgIFByZWxvYWQgbGliYyBsb2NhbGUgbWVzc2FnZXMgdG8gcHJldmVudCByZWFkaW5nIGl0IGluIG1lbW9yeSBsb2NrZWQgc3RhdGUuCisgIEZpeCBoYW5kbGluZyBvZiBzaW11bHRhbmVvdXMgbWlycm9yIGltYWdlIGFuZCBtaXJyb3JlZCBsb2cgaW1hZ2UgZmFpbHVyZS4KKworVmVyc2lvbiAyLjAyLjY4IC0gMjNyZCBKdW5lIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBjbHZtZCBpbml0c2NyaXB0IHN0YXR1cyB0byBwcmludCBvbmx5IGFjdGl2ZSBjbHVzdGVyZWQgTFZzLgorICBBZGQgbHZfcGF0aCB0byByZXBvcnRzIHRvIG9mZmVyIGZ1bGwgL2RldiBwYXRobmFtZS4KKyAgRml4IHR5cG8gaW4gd2FybmluZyBtZXNzYWdlIGFib3V0IG1pc3NpbmcgZGV2aWNlIHdpdGggYWxsb2NhdGVkIGRhdGEgYXJlYXMuCisgIEFkZCBkZXZpY2UgbmFtZSBhbmQgb2Zmc2V0IHRvIHJhd19yZWFkX21kYV9oZWFkZXIgZXJyb3IgbWVzc2FnZXMuCisgIEhvbm91ciBsb2cgYXJndW1lbnQgd2hlbiBkb3duLWNvbnZlcnRpbmcgc3RhY2tlZCBtaXJyb3IuCisgIFNsZWVwIHRvIHdvcmthcm91bmQgY2x2bWQgLVMgcmFjZTogc29ja2V0IGNsb3NlZCBlYXJseSBhbmQgc2VydmVyIGRyb3BzIGNtZC4KKyAgVXNlIGVhcmx5IHVkZXYgc3luY2hyb25pc2F0aW9uIGFuZCB1cGRhdGUgb2YgZGV2IG5vZGVzIGZvciBjbHVzdGVyZWQgbWlycm9ycy4KKyAgUmVtb3ZlIGluY29ycmVjdCBpbmNsdXNpb24gb2Yga2Rldl90LmggZnJvbSBjbWlycm9yZC9mdW5jdGlvbnMuaC4KKyAgQWRkIG1hbiBwYWdlcyBmb3IgbHZtY29uZiBhbmQgbm9uLWV4aXN0ZW50IGx2bXNhZGMgYW5kIGx2bXNhciB0b29scy4KKyAgRXhpdCBzdWNjZXNzZnVsbHkgd2hlbiB1c2luZyAtbyBoZWxwIChidXQgbm90IC1vICtoZWxwKSB3aXRoIExWTSByZXBvcnRzLgorICBEbyBub3QgdXNlIGludGVybmFsIERMTSBsb2NrIGRlZmluaXRpb25zIGluIGdlbmVyaWMgTFZNMiBjbHZtZCBjb2RlLgorICBBZGQgLS1mb3JjZSwgLS1ub2ZzY2sgYW5kIC0tcmVzaXplZnMgdG8gbHZyZXNpemUvZXh0ZW5kL3JlZHVjZSBtYW4gcGFnZXMuCisgIEZpeCBsdm0yY21kIGV4YW1wbGUgaW4gZG9jdW1lbnRhdGlvbi4KKyAgQWxsb3cgdXNlIG9mIGx2bTJhcHAgYW5kIGx2bTJjbWQgaGVhZGVycyBpbiBDKysgY29kZS4KKyAgUmVtb3ZlIHVudXNlZCAjaW5jbHVkZXMgZnJvbSBjbHZtZCBmaWxlcyBhbmQgaW50cm9kdWNlIGNsdm1kLWNvbW1vbi5oLgorICBNb3ZlIGNvbW1vbiBpbmNsdXNpb25zIHRvIGNsdm1kLWNvbW1vbi5oLgorICBVc2UgI2luY2x1ZGUgIiIgZm9yIGxpYmRldm1hcHBlci5oIGFuZCBjb25maWd1cmUuaCB0aHJvdWdob3V0IHRyZWUuCisgIEZpeCBMVk1fUEFUSCBleHBhbnNpb24gd2hlbiBleGVjX3ByZWZpeD1OT05FLiAoMi4wMi42NykKKyAgRml4IHNlZ2ZhdWx0IGluIGNsdm1kIC1SIGlmIG5vIHJlc3BvbnNlIGZyb20gZGFlbW9uIHJlY2VpdmVkLgorCitWZXJzaW9uIDIuMDIuNjcgLSA0dGggSnVuZSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEhhbmRsZSBmYWlsZWQgcmVzdGFydCBvZiBjbHZtZCB1c2luZyAtUyBzd2l0Y2ggcHJvcGVybHkuCisgIEZpeCBjbHZtZCBpbml0c2NyaXB0IHJlc3RhcnQgY29tbWFuZCB0byBzdGFydCBjbHZtZCBpZiBub3QgeWV0IHJ1bm5pbmcuCisgIFVzZSBidWlsdC1pbiBhYnNvbHV0ZSBwYXRocyBpbiBjbHZtZCAoY2x2bWQgcmVzdGFydCBhbmQgUFYgYW5kIExWIHF1ZXJpZXMpLgorICBSZXF1aXJlIHBhcnRpYWwgb3B0aW9uIGluIGx2Y2hhbmdlIC0tcmVmcmVzaCBmb3IgcGFydGlhbCBMVnMuCisgIERvIG5vdCBmYWlsIGx2bV9pbml0KCkgaWYgaW5pdF9sb2dnaW5nKCkgb3IgX2luaXRfcmFuZCgpIGdlbmVyYXRlcyBhbiBlcnJuby4KKyAgRG9uJ3QgbWVyZ2UgdW5jaGFuZ2VkIHBlcnNpc3RlbnQgY2FjaGUgZmlsZSBiZWZvcmUgZHVtcGluZyBpZiB0b29sIHNjYW5uZWQuCisgIEZpeCBpbmNvcnJlY3QgbWVtb3J5IHBvb2wgZGVhbGxvY2F0aW9uIHdoaWxlIHVzaW5nIHZnX3JlYWQgZm9yIGZpbGVzLgorICBBZGQgLS10eXBlIHBhcmFtZXRlciBkZXNjcmlwdGlvbiB0byB0aGUgbHZjcmVhdGUgbWFuIHBhZ2UuCisgIFJlcGxhY2Ugc3RybmNtcCBrZXJuZWwgdmVyc2lvbiBudW1iZXIgY2hlY2tzIHdpdGggcHJvcGVyIG9uZXMuCisgIEF2b2lkIHNlbGVjdGluZyBuYW1lcyB1bmRlciAvZGV2L2Jsb2NrIGlmIHRoZXJlIGlzIGFuIGFsdGVybmF0aXZlLgorICBVcGRhdGUgY2x1c3RlcmVkIGxvZyBrZXJuZWwgbW9kdWxlIG5hbWUgdG8gbG9nLXVzZXJzcGFjZSBmb3IgMi42LjMxIG9ud2FyZHMuCisgIEFkZCByZXBsaWNhdG9ycycgTFZzIHRvIGR0cmVlIGZvciBhY3RpdmF0aW9uLgorICBTdXByZXNzIGFjdGl2YXRpb24gbWVzc2FnZSBpZiB0aGVyZSBpcyBhIG1pc3NpbmcgcmVwbGljYXRvciBWRy4KKyAgRml4IHNjcmlwdHMvcmVscGF0aC5hd2sgdG8gd29yayBpbiBtYXdrCisgIEV4dGVuZCBsb2NrX3ZvbCB0byBjaGVjayBmb3IgbWlzc2luZyByZXBsaWNhdG9yIFZHcyBmaXJzdC4KKyAgVXBkYXRlIF9wcm9jZXNzX29uZV92ZyBhbmQgcHJvY2Vzc19lYWNoX2x2X2luX3ZnIHRvIHBvcHVsYXRlIGNtZF92Zy4KKyAgQWRkIGNtZF92ZyBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25zIGZvciByZXBsaWNhdG9yLgorICBFeHRlbmQgX2x2X2VhY2hfZGVwZW5kZW5jeSgpIHRvIGhhbmRsZSByZXBsaWNhdG9yIGRlcGVuZGVuY2llcy4KKyAgQWRkIGNoZWNrX3JlcGxpY2F0b3Jfc2VnbWVudCgpIHRvIGNhdGNoIGludGVybmFsIHJlcGxpY2F0b3IgZXJyb3JzLgorICBJbml0aWFsIHN1cHBvcnQgZm9yIHJlcGxpY2F0b3IgbWV0YWRhdGEuCisgIEV4dGVuZCBwcm9jZXNzX2VhY2hfbHZfaW5fdmcoKSB0byBwcm92aWRlIGxpc3Qgb2YgZmFpbGVkIGx2bmFtZXMuCisgIENvbnNpc3RlbnRseSByZXR1cm4gRUNNRF9GQUlMRUQgaWYgcHJvY2Vzc19lYWNoXypsdigpIGlzIGludGVycnVwdGVkLgorCitWZXJzaW9uIDIuMDIuNjYgLSAyMHRoIE1heSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIElmIHVuYWJsZSB0byBvYnRhaW4gc25hcHNob3QgcGVyY2VudGFnZSBsZWF2ZSB2YWx1ZSBibGFuayBvbiByZXBvcnRzLgorICBBZGQgaW5zdGFsbF9zeXN0ZW1fZGlycyBhbmQgaW5zdGFsbF9pbml0c2NyaXB0cyBtYWtlZmlsZSB0YXJnZXRzLgorICBBZGQgY29uZmlndXJlIG9wdGlvbnMgZm9yIHN5c3RlbSBhbmQgbG9ja2luZyBkaXJlY3Rvcmllcy4KKyAgR2VuZXJhdGUgZXhhbXBsZS5jb25mIHNvIGRlZmF1bHQgbHZtLmNvbmYgY29udGVudHMgY2FuIGJlIGNvbmZpZ3VyZWQuCisgIEluc3RhbGwgbHZtY29uZiBzY3JpcHQgYnkgZGVmYXVsdC4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IHZlcnNpb25lZCBkbWV2ZW50ZCBwbHVnaW4gc3ltbGlua3MuCisgIEFkZCB0ZXN0cyBmb3IgbHZtX3ZnbmFtZV9mcm9tX3twdmlkfGRldmljZX0uCisgIEFkZCBsdm0yYXBwIGludGVyZmFjZXMgdG8gbG9va3VwIGEgdmduYW1lIGZyb20gYSBwdmlkIGFuZCBwdm5hbWUuCisgIFVwZGF0ZSBwdmNoYW5nZSB0byBhbHdheXMgb2J0YWluIGEgdmcgaGFuZGxlIGZvciBlYWNoIHB2IHRvIHByb2Nlc3MuCisgIEFkZCBmaW5kX3ZnbmFtZV9mcm9tX3twdm5hbWV8cHZpZH0gZnVuY3Rpb25zLgorICBBZGQgcHZpZF9mcm9tX2Rldm5hbWUgYW5kIGx2bWNhY2hlX3ZnbmFtZV9mcm9tX3B2aWQgbHZtY2FjaGUgZnVuY3Rpb25zLgorICBWYWxpZGF0ZSBvcnBoYW4gYW5kIFZHX0dMT0JBTCBsb2NrIG9yZGVyIHRvby4KKyAgQWNjZXB0IG9ycGhhbiBWRyBuYW1lcyBhcyBwYXJhbWV0ZXJzIHRvIGxvY2tfdm9sKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICBVc2UgaXNfb3JwaGFuX3ZnIGluIHBsYWNlIG9mIGhhcmQtY29kZWQgcHJlZml4IHRlc3RzIGFuZCBhZGQgaXNfZ2xvYmFsX3ZnLgorCitWZXJzaW9uIDIuMDIuNjUgLSAxN3RoIE1heSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBjbHZtZCBpbml0IHNjcmlwdCBuZXZlciB0byBkZWFjdGl2YXRlIG5vbi1jbHVzdGVyZWQgdm9sdW1lIGdyb3Vwcy4KKyAgRGlzYWxsb3cgdmdjaGFuZ2UgLS1jbHVzdGVyZWQgaWYgdGhlcmUgYXJlIGFjdGl2ZSBtaXJyb3JzIG9yIHNuYXBzaG90cy4KKyAgSW50cm9kdWNlIGx2X2lzX21pcnJvcmVkLgorICBVc2UgL2Jpbi9iYXNoIGZvciBzY3JpcHRzIHdpdGggYmFzaGlzbXMuCisgIFNraXAgaW50ZXJuYWwgbHZtIGRldmljZXMgaW4gc2NhbiBpZiBpZ25vcmVfc3VzcGVuZGVkX2RldmljZXMgaXMgc2V0LgorICBEbyBub3QgbWVyZ2Ugb2xkIGRldmljZSBjYWNoZSBhZnRlciB3ZSBydW4gZnVsbCBzY2FuLiAoMi4wMi41NikKKyAgQWRkIHBrZ2NvbmZpZ2RpciBNYWtlZmlsZSB2YXJpYWJsZSBmb3IgbWFrZSBpbnN0YWxsIG92ZXJyaWRlLgorICBDb25maWd1cmUgcGtnY29uZmlnIHVkZXYgYW5kIHNlbGludXggZGVwZW5kZW5jaWVzLgorICBTd2l0Y2ggTGlicy5wcml2YXRlIHRvIFJlcXVpcmVzLnByaXZhdGUgaW4gZGV2bWFwcGVyLnBjIGFuZCBsdm0yYXBwLnBjLgorICBVc2UgcGtnY29uZmlnIFJlcXVpcmVzLnByaXZhdGUgZm9yIGRldm1hcHBlci1ldmVudC5wYy4KKyAgQWRkIGxpYmRldm1hcHBlciB0byBsaW5rZWQgbGliZGV2bWFwcGVyLWV2ZW50LnNvLgorICBMaW5rIGxpYmx2bTJjbWQuc28gd2l0aCBsaWJkZXZtYXBwZXItZXZlbnQgYW5kIGxpYmRldm1hcHBlci4KKyAgRml4IHRydW5jYXRlZCB0b3RhbCBzaXplIGRpc3BsYXllZCBieSBwdnNjYW4uCisgIEFkZCBuZXcgLS1zeXNpbml0IGNvbXBvdW5kIG9wdGlvbiB0byB2Z2NoYW5nZSBhbmQgbHZjaGFuZ2UuCisgIERyb3AgZHVwbGljYXRlIGVycm9ycyBmb3IgcmVhZCBmYWlsdXJlcyBhbmQgbWlzc2luZyBkZXZpY2VzIHRvIHZlcmJvc2UgbGV2ZWwuCisgIFVzZSAkKGxpYmRpcikvbHZtMiB3aXRoIG1ha2UgaW5zdGFsbF9sdm0yX3BsdWdpbi4KKyAgVXNlICQobGliZGlyKS9kZXZpY2UtbWFwcGVyIHdpdGggbWFrZSBpbnN0YWxsX2RtX3BsdWdpbi4KKyAgQWRkIGRtX2xpc3Rfc3BsaWNlKCkgZnVuY3Rpb24gdG8gam9pbiB0d28gbGlzdHMgdG9nZXRoZXIuCisKK1ZlcnNpb24gMi4wMi42NCAtIDMwdGggQXByaWwgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEF2b2lkIHBvaW50bGVzcyBpbml0aWFsaXNhdGlvbiB3aGVuIHRoZSAndmVyc2lvbicgY29tbWFuZCBpcyBydW4gZGlyZWN0bHkuCisgIEZpeCBtZW1vcnkgbGVhayBmb3IgaW52YWxpZCByZWdleCBwYXR0ZXJuIGlucHV0LgorICBEaXNwbGF5IGludmFsaWQgcmVnZXggcGF0dGVybiBmb3IgZmlsdGVyIGNvbmZpZ3VyYXRpb24gaW4gY2FzZSBvZiBlcnJvci4KKyAgUmVtb3ZlIG5vLWxvbmdlci11c2VkIGFyZ19wdHJfdmFsdWUuCisgIEZpeCAtTSBhbmQgLS10eXBlIHRvIHVzZSBzdHJpbmdzLCBub3QgcG9pbnRlcnMgdGhhdCBjaGFuZ2Ugb24gY29uZmlnIHJlZnJlc2guCisgIEZpeCBsdmNvbnZlcnQgZXJyb3IgbWVzc2FnZSB3aGVuIGV4aXN0aW5nIG1pcnJvcmVkIExWIGlzIG5vdCBmb3VuZC4KKyAgU2V0IGFwcHJvcHJpYXRlIHVkZXYgZmxhZ3MgZm9yIHJlc2VydmVkIExWcy4KKyAgRGlzYWxsb3cgdGhlIGRpcmVjdCByZW1vdmFsIG9mIGEgbWVyZ2luZyBzbmFwc2hvdC4KKyAgRG9uJ3QgcHJlbG9hZCB0aGUgb3JpZ2luIHdoZW4gcmVtb3ZpbmcgYSBzbmFwc2hvdCB3aG9zZSBtZXJnZSBpcyBwZW5kaW5nLgorICBEaXNhbGxvdyB0aGUgYWRkaXRpb24gb2YgbWlycm9yIGltYWdlcyB3aGlsZSBhIGNvbnZlcnNpb24gaXMgaGFwcGVuaW5nLgorICBEaXNhbGxvdyBwcmltYXJ5IG1pcnJvciBpbWFnZSByZW1vdmFsIHdoZW4gbWlycm9yIGlzIG5vdCBpbi1zeW5jLgorICBSZW1vdmUgb2Jzb2xldGUgLS1uYW1lIHBhcmFtZXRlciBmcm9tIHZnY2ZncmVzdG9yZS4KKyAgQWRkIC1TIGNvbW1hbmQgdG8gY2x2bWQgdG8gcmVzdGFydCB0aGUgZGFlbW9uIHByZXNlcnZpbmcgZXhjbHVzaXZlIGxvY2tzLgorICBJbmNyZW1lbnQgbHZtMmFwcCB2ZXJzaW9uIGZyb20gMSB0byAyIChtZW1vcnkgYWxsb2NhdGlvbiBjaGFuZ2VzKS4KKyAgQ2hhbmdlIGx2bTJhcHAgbWVtb3J5IGFsbG9jL2ZyZWUgZm9yIHB2L3ZnL2x2IHByb3BlcnRpZXMuCisgIENoYW5nZSBkYWVtb24gbG9jayBmaWxlbmFtZSBmcm9tIGx2bTJfbW9uaXRvciB0byBsdm0yLW1vbml0b3IgZm9yIGNvbnNpc3RlbmN5LgorICBJbnN0YWxsIHN5bWJvbGljIC5zbyBsaW5rcyB3aXRoIHJlbGF0aXZlIHBhdGhzIGJldHdlZW4gdXNybGliZGlyIGFuZCBsaWJkaXIuCisgIEFkZCBhd2sgc2NyaXB0IHJlbHBhdGguYXdrIHRvIGNhbGN1bGF0ZSBwYXRocyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCisgIFVzZSBAQVdLQCBpbiBtYWtlZmlsZXMuCisgIEZpeCBkb3VibGUgREVTVERJUiB1c2FnZSBmb3IgaW5mb2RpciBhbmQgbWFuZGlyLgorCitWZXJzaW9uIDIuMDIuNjMgLSAxNHRoIEFwcmlsIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZW5hbWUgbHZtX2R1bXAuc2ggdG8gbHZtZHVtcC5zaC4KKyAgQWxsb3cgaW5jb21wbGV0ZSBtaXJyb3IgcmVzdG9yZSBpbiBsdmNvbnZlcnQgLS1yZXBhaXIgdXBvbiBpbnN1ZmZpY2llbnQgc3BhY2UuCisgIERvIG5vdCByZXNldCBwb3NpdGlvbiBpbiBtZXRhZGF0YSByaW5nIGJ1ZmZlciBvbiB2Z3JlbmFtZSBhbmQgdmdjZmdyZXN0b3JlLgorICBBbGxvdyBWR3Mgd2l0aCBhY3RpdmUgTFZzIHRvIGJlIHJlbmFtZWQuCisgIFVzZSBVVUlEcyBpbnN0ZWFkIG9mIG5hbWVzIHdoaWxlIHByb2Nlc3NpbmcgZXZlbnQgaGFuZGxlcnMuCisgIE9ubHkgcGFzcyB2aXNpYmxlIExWcyB0byB0b29scyBpbiBjbWRsaW5lIFZHIG5hbWUvdGFnIGV4cGFuc2lvbnMgd2l0aG91dCAtYS4KKyAgVXNlIHR5cGVkZWZzIGZvciB0b29sbGliIHByb2Nlc3NfZWFjaCBmdW5jdGlvbnMuCisgIFVzZSBDIGxvY2FsZXMgYW5kIHVzZV9tbG9ja2FsbCBmb3IgY2x2bWQuCisgIFJlZmFjdG9yIGNvZGUgcmVsYXRlZCB0byB2Zy0+cHZzIGxpc3QgYW5kIGFkZCBwdi0+dmcgbGluay4KKyAgTWFzayBMQ0tfSE9MRCBmbGFnIGluIGNsdXN0ZXIgVkcgbG9ja3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBBZGQgYWN0aXZhdGlvbi9wb2xsaW5nX2ludGVydmFsIHRvIGx2bS5jb25mIGFzIC0taW50ZXJ2YWwgZGVmYXVsdC4KKyAgRG9uJ3QgaWdub3JlIGVycm9yIGlmIHJlc3VtaW5nIGFueSBMViBmYWlscyBpbiByZXN1bWVfbHZzLgorICBTa2lwIGNsb3NpbmcgcGVyc2lzdGVudCBmaWx0ZXIgY2FjaGUgZmlsZSBpZiBvcGVuIGZhaWxlZC4KKyAgSW5zdGFsbCAuYSBhbmQgLnNvIGxpbmtzIGludG8gJCh1c3JsaWJkaXIpLgorICBBZGQgLS1lbmFibGUtd3JpdGVfaW5zdGFsbCBvcHRpb25zIHRvIGluc3RhbGwgdXNlci13cml0YWJsZSBmaWxlcy4KKyAgVXNlIElOU1RBTExfUFJPR1JBTS9EQVRBL1dEQVRBIHRhcmdldC4KKyAgU3dpdGNoIGZyb20gdXNpbmcgVlBBVEggIHRvIHZwYXRoIGluIE1ha2VmaWxlcy4KKyAgUGVybWl0IG1pbWFnZSBMVnMgdG8gYmUgc3RyaXBlZCBpbiBsdmNyZWF0ZSwgbHZyZXNpemUgYW5kIGx2Y29udmVydC4KKyAgRml4IHB2bW92ZSBhbGxvY2F0aW9uIHRvIHRha2UgZXhpc3RpbmcgcGFyYWxsZWwgc3RyaXBlcyBpbnRvIGFjY291bnQuCisgIEFkZCBwdm1vdmVfc291cmNlX3NlZyB0byBzdHJ1Y3QgbHZfc2VnbWVudC4KKyAgRml4IGluY29ycmVjdCByZW1vdmFsIG9mIHN5bWxpbmtzIGFmdGVyIExWIGRlYWN0aXZhdGlvbiBmYWlscy4KKyAgRml4IGlzX3BhcnRpdGlvbmVkX2RldiBub3QgdG8gYXR0ZW1wdCB0byByZW9wZW4gZGV2aWNlLgorICBGaXggYW5vdGhlciB0aHJlYWQgcmFjZSBpbiBjbHZtZC4KKyAgUmVmYWN0b3IgbWFuYWdlbWVudCBvZiB2Zy0+cHZzIGxpc3QuCisgIEZpeCBsY292IHJ1bGVzIGFuZCBnZW5lcmF0ZSBiZXR0ZXIgY292ZXJhZ2UgcmVwb3J0LgorICBJbXByb3ZlIHZnX3ZhbGlkYXRlIHRvIGRldGVjdCBzb21lIGxvb3BzIGluIGxpc3RzLgorICBDaGFuZ2UgbW9zdCByZW1haW5pbmcgbG9nX2Vycm9yIFdBUk5JTkcgbWVzc2FnZXMgdG8gbG9nX3dhcm4uCisgIEFsd2F5cyB1c2UgYmxvY2tpbmcgbG9jayBmb3IgVkdzIGFuZCBvcnBoYW4gbG9ja3MuCisgIEFsbG9jYXRlIGFsbCBtZW1vcnkgZm9yIHNlZ21lbnRzIGZyb20gcHJpdmF0ZSBWRyBtZW1wb29sLgorICBSZXR1cm4gbmV3bHkgYWxsb2NhdGVkIFBWIHNlZ21lbnQgYWZ0ZXIgc2VnbWVudCBzcGxpdC4KKyAgT3B0aW1pc2Ugc2VhcmNoaW5nIFBWIHNlZ21lbnRzIGZvciBzZWVraW5nIHRoZSBtb3N0IHJlY2VudGx5LWFkZGVkLgorICBSZW1vdmUgdmdfdmFsaWRhdGUgY2FsbCB3aGVuIHBhcnNpbmcgY2FjaGVkIG1ldGFkYXRhLgorICBVc2UgaGFzaCB0YWJsZSBvZiBMVnMgdG8gc3BlZWQgdXAgcGFyc2luZyBvZiB0ZXh0IG1ldGFkYXRhIHdpdGggbWFueSBMVnMuCisgIEZpeCB0d28gdmdfdmFsaWRhdGUgbWVzc2FnZXMsIGFkZGluZyB3aGl0ZXNwYWNlIGFuZCBwYXJlbnRoZXNlcy4KKyAgV2hlbiBkbWV2ZW50ZCBpcyBub3QgZm9ya2luZyBiZWNhdXNlIG9mIC1kIGZsYWcsIGRvbid0IGtpbGwgcGFyZW50IHByb2Nlc3MuCisgIEZpeCAnbWFrZSBpbnN0YWxsJyB3aGVuICQoYnVpbGRkaXIpIGlzIGRpZmZlcmVudCBmcm9tICQoc3JjZGlyKS4KKyAgRml4IGRzbyByZXNvdXJjZSBsZWFrIGluIGVycm9yIHBhdGggb2YgZG1ldmVudGQuCisgIFVzZSBDIGxvY2FsZXMgYW5kIHVzZV9tbG9ja2FsbCBmb3IgZG1ldmVudGQuCisgIEZpeCAtLWFsbG9jIGNvbnRpZ3VvdXMgcG9saWN5IG9ubHkgdG8gYWxsb2NhdGUgb25lIHNldCBvZiBwYXJhbGxlbCBhcmVhcy4KKyAgRG8gbm90IGFsbG93IHt2Z3xsdn1jaGFuZ2UgLS1pZ25vcmVtb25pdG9yaW5nIGlmIG9uIGNsdXN0ZXJlZCBWRy4KKyAgSW1wcm92ZWQgZGVwZW5kZW5jeSB0cmFja2luZyBmb3IgZG1ldmVudGQgYW5kIGxpYmx2bTJjbWQgc291cmNlcy4KKyAgSW1wcm92ZWQgTWFrZWZpbGUgcnVsZXMgZm9yIGRpc3RjbGVhbiBhbmQgY2Zsb3cgdGFyZ2V0cy4KKyAgQWRkIGFiaWxpdHkgdG8gY3JlYXRlIG1pcnJvcmVkIGxvZ3MgZm9yIG1pcnJvciBMVnMuCisgIEZpeCBjbHZtZCBjbHVzdGVyIHByb3BhZ2F0aW9uIG9mIGRtZXZlbnRkIG1vbml0b3JpbmcgbW9kZS4KKyAgQWxsb3cgQUxMT0NfQU5ZV0hFUkUgdG8gc3BsaXQgY29udGlndW91cyBhcmVhcy4KKyAgVXNlIElOVEVSTkFMX0VSUk9SIGZvciBpbnRlcm5hbCBlcnJvcnMgdGhyb3VnaG91dCB0cmVlLgorICBBZGQgc29tZSBhc3NlcnRpb25zIHRvIGFsbG9jYXRpb24gY29kZS4KKyAgSW50cm9kdWNlIHB2X2FyZWFfdXNlZCBpbnRvIGFsbG9jYXRpb24gYWxnb3JpdGhtIGFuZCBhZGQgZGVidWcgbWVzc2FnZXMuCisgIEFkZCBhY3RpdmF0aW9uL21vbml0b3JpbmcgdG8gbHZtLmNvbmYuCisgIEFkZCAtLW1vbml0b3IgYW5kIC0taWdub3JlbW9uaXRvcmluZyB0byBsdmNyZWF0ZS4KKyAgQWxsb3cgZHluYW1pYyBleHRlbnNpb24gb2YgYXJyYXkgb2YgYXJlYXMgc2VsZWN0ZWQgYXMgYWxsb2NhdGlvbiBjYW5kaWRhdGVzLgorICBFeHBvcnQgYW5kIHVzZSBvbmx5IHZhbGlkIGNvb2tpZSB2YWx1ZSBpbiB0ZXN0IHN1aXRlLgorICBSZW1vdmUgY29uc3QgbW9kaWZpZXIgZm9yIHN0cnVjdCB2b2x1bWVfZ3JvdXAqIGZyb20gcHJvY2Vzc19lYWNoX2x2X2luX3ZnKCkuCisgIERvbid0IGFsbG93IHJlc2l6aW5nIG9mIGludGVybmFsIGxvZ2ljYWwgdm9sdW1lcy4KKyAgRml4IGxpYmRldm1hcHBlci1ldmVudCBwa2djb25maWcgdmVyc2lvbiBzdHJpbmcgdG8gbWF0Y2ggbGliZGV2bWFwcGVyLgorICBBdm9pZCBzY2FubmluZyBhbGwgcHZzIGluIHRoZSBzeXN0ZW0gaWYgb3BlcmF0aW5nIG9uIGEgZGV2aWNlIHdpdGggbWRhcy4KKyAgQWRkIGNvbmZpZ3VyZSAtLXdpdGgtY2x2bWQ9c2luZ2xlbm9kZSB0byB1c2UgY2x2bWQgdy9vIGNsdXN0ZXIgaW5mcmFzdHJ1Y3R1cmUuCisgIEdldCBzdGFja3RyYWNlIGlmIHRlc3RzdWl0ZSB0ZXN0IGRyb3BzIGNvcmUgYW5kIGx2bSB3YXMgYnVpbHQgd2l0aCBkZWJ1Z2dpbmcuCisgIERpc2FibGUgbG9uZyBsaXZpbmcgcHJvY2VzcyBmbGFnIGluIGx2bTJhcHAuCisgIEZpeCBwdmNyZWF0ZSBkZXZpY2UgbWQgZmlsdGVyIGNoZWNrLgorICBTdXBwcmVzcyByZXBlYXRlZCBlcnJvcnMgYWJvdXQgdGhlIHNhbWUgbWlzc2luZyBQViB1dWlkcy4KKyAgQnlwYXNzIGZ1bGwgZGV2aWNlIHNjYW5zIHdoZW4gdXNpbmcgaW50ZXJuYWxseS1jYWNoZWQgVkcgbWV0YWRhdGEuCisgIE9ubHkgZG8gb25lIGZ1bGwgZGV2aWNlIHNjYW4gZHVyaW5nIGVhY2ggcmVhZCBvZiB0ZXh0IGZvcm1hdCBtZXRhZGF0YS4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IGZ1bGxfc2NhbiBwYXJhbWV0ZXIgZnJvbSBnZXRfdmdpZHMgYW5kIGdldF92Z25hbWVzIGNhbGxzLgorICBMb29rIHVwIG1pc3NpbmcgUFZzIGJ5IHV1aWQgbm90IGRldl9uYW1lIGluIF9wdnNfc2luZ2xlIHRvIGF2b2lkIGludmFsaWQgc3RhdC4KKyAgTWFrZSBmaW5kX3B2X2luX3ZnX2J5X3V1aWQoKSByZXR1cm4gc2FtZSB0eXBlIGFzIHJlbGF0ZWQgZnVuY3Rpb25zLgorICBJbnRyb2R1Y2UgaXNfbWlzc2luZ19wdigpLgorICBGaXggY2x2bWQgTWFrZWZpbGUgdG8gbm90IG92ZXJ3cml0ZSBMSUJTIGZyb20gdGVtcGxhdGUgZGVmaW5pdGlvbi4KKworVmVyc2lvbiAyLjAyLjYyIC0gOXRoIE1hcmNoIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCB1c2VfbWxvY2thbGwgYW5kIG1sb2NrX2ZpbHRlciB0byBhY3RpdmF0aW9uIHNlY3Rpb24gb2YgbHZtLmNvbmYuCisgIEFkZCBkZWZhdWx0IGFsdGVybmF0aXZlIHRvIG1sb2NrYWxsIHVzaW5nIG1sb2NrIHRvIHJlZHVjZSBwaW5uZWQgbWVtb3J5IHNpemUuCisgIFJlbW92ZSAtcmR5bmFtaWMgZnJvbSBzdGF0aWMgYnVpbGRzLgorICBVcGRhdGUgY2hlY2tzIGZvciBwdGhyZWFkLCByZWFkbGluZSAmIHNlbGludXggbGlicyBhbmQgbGluayBvbmx5IHdoZW4gbmVlZGVkLgorICBJbnRyb2R1Y2UgbWFrZWZpbGUgdmFycyBVREVWX0xJQlMsIERMX0xJQlMsIFNFTElOVVhfTElCUywgU1RBVElDX0xJQlMuCisgIEludHJvZHVjZSBtYWtlZmlsZSB2YXJzIExWTUlOVEVSTkFMX0xJQlMsIFJFQURMSU5FX0xJQlMsIFBUSFJFQURfTElCUy4KKyAgVG9nZ2xlIGNvbmZpZ3VyZSBoZWxwIHRvIHByaW50IC0tZGlzYWJsZS1mc2FkbS4KKyAgVXNlICQoKSBpbnN0ZWFkIG9mICR7fSBjb25zaXN0ZW50bHkgZm9yIGFsbCBNYWtlZmlsZSB2YXJpYWJsZXMuCisgIFJlcGxhY2UgQ0ZMT1dfQ01EIG9ubHkgaW4gbWFrZS50bXBsIGFuZCB1c2UgaXQgYXMgdmFyaWFibGUgZWxzZXdoZXJlLgorICBVc2UgJCh0b3BfYnVpbGRkaXIpIGZvciBpbmNsdXNpb24gb2YgbWFrZS50bXBsIGluIE1ha2VmaWxlcy4KKyAgRml4IGF1dG9jb25mIHdhcm5pbmcgYWJvdXQgaWdub3JlZCBkYXRhcm9vdGRpci4KKyAgSW5jcmVhc2UgQUNfUFJFUkVRIHZlcnNpb24gdG8gMi42MSAoZm9yIEFDX1BST0NfU0VELCBBQ19QUk9HX01LRElSX1ApLgorICBIYW5kbGUgbWlzYWxpZ25lZCBkZXZpY2VzIHRoYXQgcmVwb3J0IGFsaWdubWVudF9vZmZzZXQgb2YgLTEuCisgIEV4dGVuZCBjb3JlIGFsbG9jYXRpb24gY29kZSBpbiBwcmVwYXJhdGlvbiBmb3IgbWlycm9yZWQgbG9nIGFyZWFzLgorICBSZXdyaXRlIGNsdm1kIGluaXQgc2NyaXB0LgorICBSZW1vdmUgbHZzX2luX3ZnX2FjdGl2YXRlZF9ieV91dWlkX29ubHkgY2FsbC4KKyAgTm8gbG9uZ2VyIGZhbGwgYmFjayB0byBsb29raW5nIHVwIGFjdGl2ZSBkZXZpY2VzIGJ5IG5hbWUgaWYgdXVpZCBub3QgZm91bmQuCisgIERvbid0IHRvdWNoIC9kZXYgaW4gdmdta25vZGVzIGlmIGFjdGl2YXRpb24gaXMgZGlzYWJsZWQuCisgIFVwZGF0ZSBsdm0yYXBwLmggRG94eWdlbiBjb21tZW50cyBhbmQgYWRkIGx2bTJhcHAgRG94eWdlbiBjb25maWcgZmlsZS4KKyAgVXBkYXRlIG5pZ2h0bHkgdGVzdHMgYW5kIGx2bTJhcHAgdW5pdCB0ZXN0cyB0byBjb3ZlciB0YWdzLgorICBBZGQgbHZtMmFwcCBmdW5jdGlvbnMgbHZtX3t2Z3xsdn1fe2dldHxhZGR8cmVtb3ZlfV90YWcoKSBmdW5jdGlvbnMuCisgIEFkZCBkbV9wb29sX3N0cmR1cCB0byBhbGxvY2F0ZSBhbmQgY29weSBtZW1vcnkgaW4gdGFnIGxpYnJhcnkgZnVuY3Rpb24uCisgIFJlZmFjdG9yIHZnY3JlYXRlLCB2Z2NoYW5nZSwgYW5kIGx2Y2hhbmdlIGZvciB0YWcgbGlicmFyeSBmdW5jdGlvbi4KKyAgUmVmYWN0b3Igc25hcHNob3QtbWVyZ2UgZGVwdHJlZSBhbmQgZGV2aWNlIHJlbW92YWwgdG8gc3VwcG9ydCBpbmZvLWJ5LXV1aWQuCisKK1ZlcnNpb24gMi4wMi42MSAtIDE1dGggRmVicnVhcnkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBzb21lIGNvbnN0cyBhbmQgZmxvYXRpbmcgcG9pbnQgZ2NjIHdhcm5pbmdzLgorICBGaXggZG1fcmVwb3J0X2ZpZWxkX3VpbnQ2NCBmdW5jdGlvbiB0byBhY2NlcHQgNjQtYml0IGludHMuCisgIENoYW5nZSByZWFkaGVhZCBkaXNwbGF5IHRvIHVzZSAzMi1iaXQgLTEgY29uc3QgaW5zdGVhZCBvZiA2NC1iaXQuCisgIEFkZCBMVk1fU1VQUFJFU1NfTE9DS0lOR19GQUlMVVJFX01FU1NBR0VTIGVudmlyb25tZW50IHZhcmlhYmxlLgorICBSZW1vdmUgaGFyZC1jb2RpbmcgdGhhdCBza2lwcGVkIF9taW1hZ2UgZGV2aWNlcyBmcm9tIDExLWRtLWx2bS5ydWxlcy4KKyAgVXNlIHVkZXYgdHJhbnNhY3Rpb25zIGluIHRlc3Qgc3VpdGUuCisgIFNldCB1ZGV2IHN0YXRlIGF1dG9tYXRpY2FsbHkgaW5zdGVhZCBvZiB1c2luZyBMVk1fVURFVl9ESVNBQkxFX0NIRUNLSU5HLgorICBBZGQgbHZtX3B2X2dldF9zaXplLCBsdm1fcHZfZ2V0X2ZyZWUgYW5kIGx2bV9wdl9nZXRfZGV2X3NpemUgdG8gbHZtMmFwcC4KKyAgQ2hhbmdlIGx2bTJhcHAgdG8gcmV0dXJuIGFsbCBzaXplcyBpbiBieXRlcyBhcyBkb2N1bWVudGVkIChub3Qgc2VjdG9ycykuCisgIEFkZCAnZmFpbF9pZl9wZXJjZW50X3Vuc3VwcG9ydGVkJyBhcmcgdG8gX3BlcmNlbnQgYW5kIF9wZXJjZW50X3J1bi4KKyAgUmVtb3ZlIGZhbHNlICJmYWlsZWQgdG8gZmluZCB0cmVlIG5vZGUiIGVycm9yIHdoZW4gYWN0aXZhdGluZyBtZXJnaW5nIG9yaWdpbi4KKyAgRXhpdCB3aXRoIHN1Y2Nlc3Mgd2hlbiBsdmNvbnZlcnQgLS1yZXBhaXIgLS11c2UtcG9saWNpZXMgcGVyZm9ybXMgbm8gYWN0aW9uLgorICBBY2NlcHQgYSBsaXN0IG9mIExWcyB3aXRoICdsdmNvbnZlcnQgLS1tZXJnZSBAdGFnJyB1c2luZyBwcm9jZXNzX2VhY2hfbHYuCisgIEF2b2lkIHVubmVjZXNzYXJ5IHNlY29uZCByZXN5bmMgd2hlbiBhZGRpbmcgbWltYWdlIHRvIGNvcmUtbG9nZ2VkIG1pcnJvci4KKyAgRXhjbHVkZSBpbnRlcm5hbCBWRyBuYW1lcyBhbmQgdXVpZHMgZnJvbSBsaXN0cyByZXR1cm5lZCB0aHJvdWdoIGx2bTJhcHAuCisgIEFkZCAlT1JJR0lOIHN1cHBvcnQgdG8gbHZ7Y3JlYXRlLGV4dGVuZCxyZWR1Y2UscmVzaXplfSAtLWV4dGVudHMuCisgIEFkZCBfbWRhX2NvcHkgdG8gY2xvbmUgYSBzdHJ1Y3QgbWV0YWRhdGFfYXJlYS4KKyAgUmVtb3ZlIHBvaW50bGVzcyB2ZXJzaW9uZWQgc3ltbGlua3MgdG8gZG1ldmVudGQgcGx1Z2luIGxpYnJhcmllcy4KKyAgRml4IGRtZXZlbnRkIHNuYXBzaG90IHBsdWdpbiBidWlsZCBkZXBlbmRlbmN5LgorICBNYWtlIGNsdm1kIC1WIHJldHVybiBzdGF0dXMgemVyby4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5ICdkbXNldHVwIHJlc3VtZScgZm9sbG93aW5nICdkbXNldHVwIGNyZWF0ZScgaW4gdGVzdHMuCisgIEZpeCBjbWlycm9yZCBzZWdmYXVsdCBpbiBjbG9nX2NwZyBsaXN0IHByb2Nlc3Npbmcgd2hlbiBjb252ZXJ0aW5nIG1pcnJvciBsb2cuCisgIERlYWN0aXZhdGUgdGVtcG9yYXJ5IHB2bW92ZSBtaXJyb3IgY2x1c3Rlci13aWRlIHdoZW4gYWN0aXZhdGluZyBpdCBmYWlscy4KKyAgQWx3YXlzIHF1ZXJ5IGRldmljZSBieSB1dWlkIGFuZCBub3QgbmFtZSBpbiBjbHZtZC4KKyAgQWRkIG1pc3NpbmcgbWV0YWRhdGEgdmdfcmV2ZXJ0cyBpbiBwdm1vdmUgZXJyb3IgcGF0aHMuCisgIFVubG9jayBzaGFyZWQgbG9jayBpbiBjbHZtZCBpZiBhY3RpdmF0aW9uIGNhbGxzIGZhaWwuCisgIFJldHVybiBzdWNjZXNzIGZyb20gZGV2X21hbmFnZXJfaW5mbyB3aXRoIG5vbi1leGlzdGVudCB1dWlkIGlmIGlvY3RsIHN1Y2NlZWRzLgorCitWZXJzaW9uIDIuMDIuNjAgLSAyM3JkIEphbnVhcnkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRXh0ZW5kIGNtaXJyb3JkIG1hbiBwYWdlLgorICBTbGVlcCBiZWZvcmUgZmlyc3QgcHJvZ3Jlc3MgY2hlY2sgaWYgcHZtb3ZlL2x2Y29udmVydCBpbnRlcnZhbCBoYXMgcHJlZml4ICcrJy4KKyAgRGVmYXVsdCB0byBjaGVja2luZyBwcm9ncmVzcyBiZWZvcmUgd2FpdGluZyBpbiBfd2FpdF9mb3Jfc2luZ2xlX2x2LgorICBGaXggY21pcnJvciBpbml0c2NyaXB0IChpbmNsdWRpbmcgc3ludGF4IGVycm9yKS4KKyAgRWxpbWluYXRlIGF2b2lkYWJsZSBpb2N0bHMgZm9yIGNoZWNraW5nIG9wZW5fY291bnQgaW4gX2FkZF9uZXdfbHZfdG9fZHRyZWUuCisgIERpc2FibGUgbWVtb3J5IGRlYnVnZ2luZyBpZiBkbWV2ZW50ZCBpcyBjb25maWd1cmVkLiAoTm90IHRocmVhZC1zYWZlLikKKyAgRml4IGZpcnN0IGxvZyBtZXNzYWdlIHByZWZpeCBpbiBzeXNsb2cgZm9yIGRtZXZlbnRkIHBsdWdpbnMuCisgIEZpeCBleHBvcnRlZCBzeW1ib2xzIG5hbWVzIGZvciBkbWV2ZW50ZCBsdm0yIHdyYXBwZXIgcGx1Z2luLgorICBNYWtlIGZhaWxlZCBsb2NraW5nIGluaXRpYWxpc2F0aW9uIG1lc3NhZ2VzIG1vcmUgZGVzY3JpcHRpdmUuCisKK1ZlcnNpb24gMi4wMi41OSAtIDIxc3QgSmFudWFyeSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgbGliZGV2bWFwcGVyLWV2ZW50LWx2bTIuc28gdG8gc2VyaWFsaXNlIGRtZXZlbnRkIHBsdWdpbiBsaWJsdm0yY21kIHVzZS4KKyAgQ2xlYW51cCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gYW5kIGZyZWVpbmcgaW4gcHZfcmVhZCgpIGFuZCBwdl9jcmVhdGUoKS4KKyAgQ2xlYXIgcG9pbnRlciBhbmQgY291bnRlcnMgYWZ0ZXIgdGhlaXIgcmVsZWFzZSBpbiBfZmluX2NvbW1hbmRzKCkuCisgIFN0b3AgZG1ldmVudGQgdHJ5aW5nIHRvIGFjY2VzcyBhbHJlYWR5LXJlbW92ZWQgc25hcHNob3RzLgorICBSZW1vdmUgKGZhbGxiYWNrKSAvZGV2IG1rbm9kIGZyb20gY21pcnJvcmQuCisgIEFkZCB0LXRvcG9sb2d5LXN1cHBvcnQuc2ggYW5kIHQtc25hcHNob3QtbWVyZ2Uuc2ggdGVzdHMuCisgIEZpeCBjbHZtZCB0byBuZXZlciBzY2FuIHN1c3BlbmRlZCBkZXZpY2VzLgorICBGaXggZG1ldmVudGQgYnVpbGQgb3V0c2lkZSBzb3VyY2UgdHJlZS4KKyAgQXNzb3J0ZWQgY21pcnJvciBjb2RlIGNoYW5nZXMgdG8gcmVtb3ZlIHZhcmlvdXMgY29tcGlsZXIgd2FybmluZ3MuCisgIEZpeCBkZXRlY3Rpb24gb2YgY29tcGxldGVkIHNuYXBzaG90IG1lcmdlLgorICBBZGQgUmVkIEhhdCBjbWlycm9yIGluaXRzY3JpcHQgKHVuZmluaXNoZWQpLgorICBBZGQgY21pcnJvcmQgbWFuIHBhZ2UgKGluY29tcGxldGUpLgorICBNYWtlIGNsdXN0ZXIgbG9nIGNvbW11bmljYXRpb24gc3RydWN0dXJlcyBhcmNoaXRlY3R1cmUgaW5kZXBlbmRhbnQuCisgIEZpeCBjbHVzdGVyIGxvZyBpbi1tZW1vcnkgYml0bWFwIGhhbmRsaW5nLgorICBJbXByb3ZlIHNuYXBzaG90IG1lcmdlIG1ldGFkYXRhIGltcG9ydCB2YWxpZGF0aW9uLgorICBJbXByb3ZlIHRhcmdldCB0eXBlIGNvbXBhdGliaWxpdHkgY2hlY2tpbmcgaW4gX3BlcmNlbnRfcnVuKCkuCisgIEFkZCAndGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlJyBtZXRob2QgdG8gJ3N0cnVjdCBzZWd0eXBlX2hhbmRsZXInLgorICBDaGFuZ2UgdW5kZXJzY29yZSB0byBoeXBoZW4gaW4gdGFibGUgbGluZSBmb3IgY2x1c3RlcmVkIGxvZyB0eXBlLgorCitWZXJzaW9uIDIuMDIuNTggLSAxNHRoIEphbnVhcnkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2xlYW51cCBzb21lIG1pbm9yIGdjYyB3YXJuaW5ncy4KKyAgQWRkIC0tbWVyZ2UgdG8gbHZjb252ZXJ0IHRvIG1lcmdlIGEgc25hcHNob3QgaW50byBpdHMgb3JpZ2luLgorICBGaXggY2x2bWQgYXV0b21hdGljIHRhcmdldCBtb2R1bGUgbG9hZGluZyBjcmFzaCAobm8gcmVzZXRfbG9ja2luZyBmbikuCisgIEZpeCBhbGxvY2F0aW9uIGNvZGUgbm90IHRvIHN0b3AgYXQgdGhlIGZpcnN0IGFyZWEgb2YgYSBQViB0aGF0IGZpdHMuCisKK1ZlcnNpb24gMi4wMi41NyAtIDEydGggSmFudWFyeSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFbnN1cmUgZXhhY3RseSBvbmUgcHJvY2VzcyByZXR1cm5zIGZyb20gcG9sbF9kYWVtb24oKSwgbmV2ZXIgdHdvLgorICBSZXNldCBfdmdzX2xvY2tlZCBpbiBsdm1jYWNoZV9pbml0KCkgaW4gY2hpbGQgYWZ0ZXIgZm9ya2luZy4KKyAgRGVmaW5lIHtETSwgTFZNfV9VREVWX0RJU0FCTEVfQ0hFQ0tJTkc9MSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZHVyaW5nIHRlc3RzLgorICBFbmFibGUgdWRldl9zeW5jIGFuZCB1ZGV2X3J1bGVzIGluIGx2bS5jb25mIGJ5IGRlZmF1bHQgd2hpbGUgcnVubmluZyB0ZXN0cy4KKyAgSWYgTFZNX1VERVZfRElTQUJMRV9DSEVDS0lORyBpbiBzZXQgaW4gZW52aXJvbm1lbnQsIGRpc2FibGUgdWRldiB3YXJuaW5ncy4KKyAgQWRkIC0tc3BsaXRtaXJyb3JzIHRvIGx2Y29udmVydCB0byBzcGxpdCBvZmYgcGFydCBvZiBhIG1pcnJvci4KKyAgQ2hhbmdlIGJhY2tncm91bmQgcG9sbGRhZW1vbidzIHByb2Nlc3MgbmFtZSB0byAiKGx2bTIpIi4KKyAgQWxsb3cgdmdyZW1vdmUgdG8gcmVtb3ZlIGEgVkcgd2l0aCBQVnMgbWlzc2luZyBhZnRlciBhIHByb21wdC4KKyAgUmV0dXJuIHN1Y2Nlc3MgaW4gbHZjb252ZXJ0IC0tcmVwYWlyIC0tdXNlLXBvbGljaWVzIG9uIGZhaWxlZCBhbGxvY2F0aW9uLgorICBLZWVwIGxvZyB0eXBlIGNvbnNpc3RlbnQgd2hlbiBjaGFuZ2luZyBtaXJyb3IgaW1hZ2UgY291bnQuCisgIEFsd2F5cyBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBhbiBMVk0yIGRldmljZSBpbiAxMS1kbS1sdm0ucnVsZXMuCisgIEFkZCBhY3RpdmF0aW9uL3VkZXZfcnVsZXMgY29uZmlnIG9wdGlvbiBpbiBsdm0uY29uZi4KKyAgQWRkIGNvbnN0cyB0byB0ZXh0IG1ldGFkYXRhIGZsYWcgc3RydWN0cy4KKyAgQWRkIG1hY3JvcyBvdXRmYywgb3V0c2l6ZSwgb3V0aGludCBhbmQgZnVuY3Rpb24gb3V0X3RleHRfd2l0aF9jb21tZW50LgorICBSZWltcGxlbWVudCByZXBvcnQgRklFTEQgbWFjcm8gdXNpbmcgb2Zmc2V0b2YgaW5zdGVhZCBvZiBzdGF0aWMgc3RydWN0cy4KKyAgRml4IGZzYWRtIG1hbiBwYWdlIHR5cG8gKGZzZGFtKS4KKyAgUmVuYW1lIG1pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5IHRvIG1pcnJvcl9pbWFnZV9mYXVsdCBwb2xpY3kuCisgIFJlbW92ZSBlbXB0eSBQViBkZXZpY2VzIGlmIGx2Y29udmVydCAtLXJlcGFpciBpcyB1c2luZyBkZWZpbmVkIHBvbGljaWVzLgorICBVc2UgZml4ZWQgYnVmZmVyIHRvIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgaW4gcGVyc2lzdGVudCBmaWx0ZXIgZHVtcC4KKyAgVXNlIGV4dGVuZGVkIHN0YXR1cyBvZiBuZXcga2VybmVsIHNuYXBzaG90IHRhcmdldCAxLjguMCB0byBkZXRlY3Qgd2hlbiBlbXB0eS4KKyAgSW5zZXJ0IHN0YWNrIG1hY3JvcyBpbiBzdXNwZW5kX2x2LCByZXN1bWVfbHYgJiAoZGUpYWN0aXZhdGVfbHYgY2FsbGVycy4KKyAgQWRkIC0tcG9sbCBmbGFnIHRvIHZnY2hhbmdlIGFuZCBsdmNoYW5nZSB0byBjb250cm9sIGJhY2tncm91bmQgZGFlbW9uIGxhdW5jaC4KKyAgUHJvcGFnYXRlIG1ldGFkYXRhIGNvbW1pdCBhbmQgcmV2ZXJ0IG5vdGlmaWNhdGlvbnMgdG8gb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAgVXNlIHByb3BlciBtYXNrIGZvciBWRyBsb2NrIG1vZGUgaW4gY2x2bWQuCisgIEFsbG93IHByZWNvbW1pdHRlZCBtZXRhZGF0YSB0byBiZSBkcm9wcGVkIGZyb20gbHZtY2FjaGUuCisgIE1vdmUgcHJvY2Vzc2luZyBvZiBWRyBsb2NrcyB0byBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBjbHZtZC4KKyAgUHJvcGVybHkgZGVjb2RlIGFsbCBmbGFncyBpbiBjbHZtZCBtZXNzYWdlcyBpbmNsdWRpbmcgVkcgbG9ja3MuCisgIFByb3Blcmx5IGhhbmRsZSBwcmVjb21taXR0ZWQgY2FjaGUgZmxhZyB3aGVuIG9ubHkgY29tbWl0dGVkIG1ldGFkYXRhIHByZXNlbnQuCisgIFJlc3VtZSByZW5hbWVkIHZvbHVtZXMgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSBtZW1sb2NrIHBhaXJpbmcuCisgIERyb3AgY2FjaGVkIG1ldGFkYXRhIGFmdGVyIGRldmljZSB3YXMgYXV0by1yZXBhaXJlZCBhbmQgcmVtb3ZlZCBmcm9tIFZHLgorICBDbGVhciBNSVNTSU5HX1BWIGZsYWcgaWYgUFYgcmVhcHBlYXJlZCBhbmQgaXMgZW1wdHkuCisgIEZpeCByZW1vdmFsIG9mIG11bHRpcGxlIGRldmljZXMgZnJvbSBhIG1pcnJvci4KKyAgQWxzbyBjbGVhbiB1cCBQVnMgZmxhZ2dlZCBhcyBtaXNzaW5nIGluIHZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlLgorICBJbnRyb2R1Y2UgSU5URVJOQUxfRVJST1IgbWFjcm8gZm9yIGVycm9yIG1lc3NhZ2VzIGFuZCB1c2UgdGhyb3VnaG91dC4KKyAgUmVtb3ZlIHN1cGVyZmx1b3VzIHJldHVybnMgZnJvbSB2b2lkIGZ1bmN0aW9ucy4KKyAgRGVzdHJveSBhbGxvY2F0ZWQgbWVtcG9vbCBpbiBfdmdfcmVhZF9vcnBoYW5zKCkgZXJyb3IgcGF0aC4KKyAgRml4IHNvbWUgcHZyZXNpemUgYW5kIHRvb2xsaWIgZXJyb3IgcGF0aHMgd2l0aCBtaXNzaW5nIFZHIHJlbGVhc2VzL3VubG9ja3MuCisgIEV4cGxpY2l0bHkgY2FsbCBzdXNwZW5kIGZvciB0ZW1wb3JhcnkgbWlycm9yIGxheWVyLgorICBBbGxvdyB1c2Ugb2YgcHJlY29tbWl0dGVkIG1ldGFkYXRhIHdoZW4gYSBQViBpcyBtaXNzaW5nLgorICBBZGQgbWVtbG9jayBpbmZvcm1hdGlvbiB0byBkb19sb2NrX2x2IGRlYnVnIG91dHB1dC4KKyAgQWx3YXlzIGJ5cGFzcyBjYWxscyB0byByZW1vdGUgY2x1c3RlciBub2RlcyBmb3Igbm9uLWNsdXN0ZXJlZCBWR3MuCisgIFBlcm1pdCBpbXBsaWNpdCBjbHVzdGVyIGxvY2sgY29udmVyc2lvbiBpbiBwcmUvcG9zdCBjYWxsYmFja3Mgb24gbG9jYWwgbm9kZS4KKyAgUGVybWl0IGltcGxpY2l0IGNsdXN0ZXIgbG9jayBjb252ZXJzaW9uIHRvIHRoZSBsb2NrIG1vZGUgYWxyZWFkeSBoZWxkLgorICBGaXggbG9jayBmbGFnIG1hc2tpbmcgaW4gY2x2bWQgc28gaW50ZW5kZWQgY29kZSBwYXRocyBnZXQgaW52b2tlZC4KKyAgUmVwbGFjZSBtYWdpYyBtYXNrcyBpbiBjbHVzdGVyIGxvY2tpbmcgY29kZSBieSBkZWZpbmVkIG1hc2tzLgorICBSZW1vdmUgbmV3bHktY3JlYXRlZCBtaXJyb3IgbG9nIGZyb20gbWV0YWRhdGEgaWYgaW5pdGlhbCBkZWFjdGl2YXRpb24gZmFpbHMuCisgIENvcnJlY3QgYWN0aXZhdGVkIG9yIGRlYWN0aXZhdGVkIHRleHQgaW4gdmdjaGFuZ2Ugc3VtbWFyeSBtZXNzYWdlLgorICBJbXByb3ZlIHB2bW92ZSBlcnJvciBtZXNzYWdlIHdoZW4gYWxsIHNvdXJjZSBMVnMgYXJlIHNraXBwZWQuCisgIEZpeCBtZW1sb2NrIGltYmFsYW5jZSBpbiBsdl9zdXNwZW5kIGlmIGFscmVhZHkgc3VzcGVuZGVkLgorICBGaXggcHZtb3ZlIHRlc3QgbW9kZSBub3QgdG8gcG9sbCAoYW5kIGZhaWwpLgorICBGaXggdmdjcmVhdGUgZXJyb3IgbWVzc2FnZSBpZiBWRyBhbHJlYWR5IGV4aXN0cy4KKyAgRml4IHRvb2xzIHRvIHVzZSBsb2dfZXJyb3Igd2hlbiBhYm9ydGVkIGR1ZSB0byB1c2VyIHJlc3BvbnNlIHRvIHByb21wdC4KKyAgRml4IGlnbm9yZWQgcmVhZGFoZWFkIHNldHRpbmcgaW4gbHZjcmVhdGUgLS1yZWFkYWhlYWQuCisgIEZpeCBjbHZtZCBtZW1vcnkgbGVhayBpbiBsdl9pbmZvX2J5X2x2aWQgYnkgY2FsbGluZyByZWxlYXNlX3ZnLgorICBJZiBhYm9ydGluZyBkdWUgdG8gaW50ZXJuYWwgZXJyb3IsIGFsd2F5cyBzZW5kIHRoYXQgbWVzc2FnZSB0byBzdGRlcnIuCisgIEFkZCBnbG9iYWwvYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzIHRvIGx2bS5jb25mIHRvIGFzc2lzdCB0ZXN0aW5nLgorICBGaXggdGVzdCBNYWtlZmlsZXMgd2hlbiBidWlsZGRpciBhbmQgc3JjZGlyIGRpZmZlci4KKyAgSW1wb3NlIGxpbWl0IG9mIDggbWlycm9yIGltYWdlcyB0byBtYXRjaCB0aGUgaW4ta2VybmVsIGtjb3B5ZCByZXN0cmljdGlvbi4KKyAgVXNlIGxvY2tpbmdfdHlwZSAzIChjb21waWxlZCBpbikgZm9yIGx2bWNvbmYgLS1lbmFibGUtY2x1c3Rlci4KKyAgUmVtb3ZlIGxpc3QuYyBhbmQgbGlzdC5oIHdpdGggbm8tbG9uZ2VyLXVzZWQgZG1fbGlzdCBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4KKyAgTG9nIGZhaWx1cmUgdHlwZSBhbmQgcmVjb2duaXNlIHR5cGUgJ0YnIChmbHVzaCkgaW4gZG1ldmVudGQgbWlycm9yIHBsdWdpbi4KKyAgRXh0ZW5kIGludGVybmFsIFBWL1ZHL0xWL3NlZ21lbnQgc3RhdHVzIHZhcmlhYmxlcyBmcm9tIDMyLWJpdCB0byA2NC1iaXQuCisKK1ZlcnNpb24gMi4wMi41NiAtIDI0dGggTm92ZW1iZXIgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBtaXNzaW5nIHZnX3JlbGVhc2UgdG8gcHZzIGFuZCBwdmRpc3BsYXkgdG8gZml4IG1lbW9yeSBsZWFrLgorICBEbyBub3QgdHJ5IHRvIHVubG9jayBWRyB3aGljaCBpcyBub3QgbG9ja2VkIGluIF9wcm9jZXNzX29uZV92Zy4KKyAgTW92ZSBpc19sb25nX2xpdmVkIHBlcnNpc3RlbnRfZmlsdGVyX2R1bXAgdG8gaGFwcGVuIGFmdGVyIGV2ZXJ5IGZ1bGwgc2Nhbi4KKyAgUmVmcmVzaCBkZXZpY2UgZmlsdGVycyBiZWZvcmUgZnVsbCBkZXZpY2UgcmVzY2FuIGluIGx2bWNhY2hlLgorICBSZXR1cm4gZXJyb3Igc3RhdHVzIGlmIHZnY2hhbmdlIGZhaWxzIHRvIGFjdGl2YXRlIHNvbWUgdm9sdW1lLgorICBGaXggc3VzcGVuZC9yZXN1bWUgbG9jayB0eXBlIHRlc3QgY2F1c2luZyB1bmJhbGFuY2VkIG1lbW9yeSBsb2NraW5nLgorICBSZXZlcnQgdmdfcmVhZF9pbnRlcm5hbCBjaGFuZ2UgYXMgY2x2bWQgd2FzIG5vdCByZWFkeSBmb3IgdmdfcmVhZC4gKDIuMDIuNTUpCisKK1ZlcnNpb24gMi4wMi41NSAtIDE5dGggTm92ZW1iZXIgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBkZWFkbG9jayB3aGVuIGNoYW5naW5nIG1pcnJvcnMgZHVlIHRvIHVucGFpcmVkIG1lbWxvY2sgcmVmY291bnQgY2hhbmdlcy4KKyAgVXNlIHNlcGFyYXRlIG1lbWxvY2sgY291bnRlciBmb3IgZG1ldmVudGQgaGFuZGxlcnMgdG8gcGVybWl0IGRldmljZSBzY2FubmluZy4KKyAgRGlyZWN0bHkgcmVzdHJpY3QgdmdjaGFuZ2UgdG8gYWN0aXZhdGluZyB2aXNpYmxlIExWcy4KKyAgRml4IHB2bW92ZSByZWdpb25fc2l6ZSBvdmVyZmxvdyBmb3IgdmVyeSBsYXJnZSBQVnMuCisgIEZpeCBsdmNyZWF0ZSBhbmQgbHZyZXNpemUgJVBWUyBhcmd1bWVudCBhbHdheXMgdG8gdXNlIHNlbnNpYmxlIHRvdGFsIHNpemUuCisgIFRpZHkgc29tZSB1c2VzIG9mIGFyZ19jb3VudCBhbmQgaW50cm9kdWNlIGFyZ19pc19zZXQuCisgIEV4cG9ydCBvdXRubCBhbmQgaW5kZW50IGZ1bmN0aW9ucyBmb3IgbW9kdWxlcy4KKyAgRmx1c2ggc3Rkb3V0IGFmdGVyIHllcy9ubyBwcm9tcHQuCisgIFVwZGF0ZSB2Z3NwbGl0IGFuZCB2Z2NyZWF0ZSB0byB1c2Ugdmdfc2V0X2NsdXN0ZXJlZC4KKyAgQWRkIHZnX21kYV9jb3VudCBhbmQgdmdfc2V0X2NsdXN0ZXJlZCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAgQWRkIG1vcmUgdmdjcmVhdGUgYW5kIHZnc3BsaXQgbmlnaHRseSB0ZXN0cy4KKyAgSW5zZXJ0IHNvbWUgbWlzc2luZyBzdGFjayBtYWNyb3MgaW50byBhY3RpdmF0aW9uIGNvZGUuCisgIFJlY29nbmlzZSBEUkJEIGRldmljZXMgYW5kIGhhbmRsZSB0aGVtIGxpa2UgbWQgZGV2aWNlcy4KKworVmVyc2lvbiAyLjAyLjU0IC0gMjZ0aCBPY3RvYmVyIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBsdmNyZWF0ZS9sdmNvbnZlcnQgbWFuIHBhZ2VzIHRvIGV4cGxhaW4gUGh5c2ljYWxWb2x1bWUgcGFyYW1ldGVyLgorICBEb2N1bWVudCAtLWFsbCBvcHRpb24gaW4gbWFuIHBhZ2VzLCBjbGVhbnVwIHtwdnx2Z3xsdn17c3xkaXNwbGF5fSBtYW4gcGFnZXMuCisgIFBlcm1pdCBzbmFwc2hvdHMgb2YgbWlycm9ycy4KKyAgQ2xlYW51cCBtaW1hZ2V0bXAgTFYgaWYgYWxsb2NhdGlvbiBmYWlscyBmb3IgbmV3IGx2Y29udmVydCBtaW1hZ2UuCisgIEZpeCBjbHZtZCBzZWdmYXVsdCB3aGVuIHJlZnJlc2hfdG9vbGNvbnRleHQgZmFpbHMuCisgIFJlbWVtYmVyIHRvIGNsZWFyICdnbG9iYWwgbG9jayBoZWxkIGR1cmluZyBjYWNoZSByZWZyZXNoJyBzdGF0ZSBhZnRlciB1c2UuCisgIFVzZSB1ZGV2IGZsYWdzIHN1cHBvcnQgaW4gTFZNIGFuZCBhcHBseSB2YXJpb3VzIGZpeGVzIHRvIHVkZXYgcnVsZXMuCisgIERlbGF5IGFubm91bmNpbmcgbWlycm9yIG1vbml0b3JpbmcgdG8gc3lzbG9nIHVudGlsIGluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZC4KKyAgSGFuZGxlIG1ldGFkYXRhIHdpdGggdW5rbm93biBzZWdtZW50IHR5cGVzIG1vcmUgZ3JhY2VmdWxseS4KKyAgU2V0IGRlZmF1bHQgb3duZXIgYW5kIGdyb3VwIHRvIG51bGwuCisgIEFkZCBkbWV2ZW50ZC5zdGF0aWMgdG8gdGhlIGJ1aWxkLgorICBEaXNhYmxlIHJlYWx0aW1lIHN1cHBvcnQgY29kZSBieSBkZWZhdWx0LgorICBNYWtlIGNsdm1kIHJldHVybiAwIG9uIHN1Y2Nlc3MgcmF0aGVyIHRoYW4gMS4KKyAgQWRkIC0tcHZtZXRhZGF0YWNvcGllcyBmb3IgcHZjcmVhdGUsIHZnY3JlYXRlLCB2Z2V4dGVuZCwgdmdjb252ZXJ0LgorICBBZGQgaW1wbGljdCBwdmNyZWF0ZSBzdXBwb3J0IHRvIHZnY3JlYXRlIGFuZCB2Z2V4dGVuZC4KKyAgQ29ycmVjdCBleGFtcGxlLmNvbmYgdG8gaW5kaWNhdGUgdGhhdCBsdm0yIG5vdCBsdm0xIGlzIHRoZSBkZWZhdWx0IGZvcm1hdC4KKyAgUmVtb3ZlIGFuIHVudXNlZCBzdHJheSBMVk0xX1NVUFBPUlQgaWZkZWYuCisgIE9ubHkgaW5jbHVkZSBzZWxpbnV4IGxpYnMgaW4gbGliZGV2bWFwcGVyLnBjIHdoZW4gc2VsaW51eCBidWlsZCBlbmFibGVkLgorICBBbGxvdyBmb3IgYSBidWlsZCBkaXJlY3Rvcnkgc2VwYXJhdGUgZnJvbSB0aGUgc291cmNlLgorICBVcGRhdGUgZGlzdGNsZWFuIHRhcmdldCBmb3IgcmVuYW1lIGNsb2dkIHRvIGNtaXJyb3JkLiAoMi4wMi41MikKKyAgT25seSBkbyBsb2NrIGNvbnZlcnNpb25zIGluIGNsdm1kIGlmIHdlIGFyZSBleHBsaWNpdGx5IGFza2VkIGZvciBvbmUuCisgIEludHJvZHVjZSBwZXJjZW50X3JhbmdlX3QgYW5kIGNlbnRyYWxpc2Ugc25hcHNob3QgZnVsbC9taXJyb3IgaW4tc3luYyBjaGVja3MuCisgIEZhY3RvciBvdXQgcG9sbF9taXJyb3JfcHJvZ3Jlc3MgYW5kIGludHJvZHVjZSBwcm9ncmVzc190LgorICBEaXN0aW5ndWlzaCBiZXR3ZWVuIHBvd2VycyBvZiAxMDAwIGFuZCBwb3dlcnMgb2YgMTAyNCBpbiB1bml0IHN1ZmZpeGVzLgorICBSZXN0YXJ0IGx2Y29udmVydHMgaW4gdmdjaGFuZ2UgYnkgc2hhcmluZyBsdl9zcGF3bl9iYWNrZ3JvdW5kX3BvbGxpbmcuCisgIEdlbmVyYWxpc2UgcG9sbGRhZW1vbiBjb2RlIGJ5IGNoYW5naW5nIG1pcnJvci1zcGVjaWZpYyB2YXJpYWJsZSBuYW1lcy4KKyAgRG9uJ3QgYXR0ZW1wdCB0byBkZWFjdGl2YXRlIGFuIExWIGlmIGFueSBvZiBpdHMgc25hcHNob3RzIGFyZSBpbiB1c2UuCisgIFJldHVybiBlcnJvciBpZiBsdl9kZWFjdGl2YXRlIGZhaWxzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbSBrZXJuZWwuCisgIFByb3ZpZGUgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2Ygb2Jzb2xldGUgc2lnaW50ZXJydXB0KCkuCisgIENvbnNvbGlkYXRlIExWIGFsbG9jYXRpb24gaW50byBhbGxvY19sdigpLgorICBUcmVhdCBpbnB1dCB1bml0cyBvZiBib3RoICdzJyBhbmQgJ1MnIGFzIDUxMi1ieXRlIHNlY3RvcnMuICAoMi4wMi40OSkKKyAgVXNlIHN0YW5kYXJkIG91dHB1dCB1bml0cyBmb3IgJ1BFIFNpemUnIGFuZCAnU3RyaXBlIHNpemUnIGluIHB2L2x2ZGlzcGxheS4KKyAgQWRkIGNvbmZpZ3VyZSAtLWVuYWJsZS11bml0cy1jb21wYXQgdG8gc2V0IHNpX3VuaXRfY29uc2lzdGVuY3kgb2ZmIGJ5IGRlZmF1bHQuCisgIEFkZCBnbG9iYWwvc2lfdW5pdF9jb25zaXN0ZW5jeSB0byBlbmFibGUgY2xlYW5lZC11cCB1c2Ugb2YgdW5pdHMgaW4gb3V0cHV0LgorCitWZXJzaW9uIDIuMDIuNTMgLSAyNXRoIFNlcHRlbWJlciAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENyZWF0ZSBhbnkgZGlyZWN0b3JpZXMgaW4gL2RldiB3aXRoIERNX0RFVl9ESVJfVU1BU0sgKDAyMikuCisgIEVuYWJsZSBkbWV2ZW50ZCBtb25pdG9yaW5nIHNlY3Rpb24gb2YgY29uZmlnIGZpbGUgYnkgZGVmYXVsdC4KKyAgVXBkYXRlIGx2bTIgbW9uaXRvcmluZyBzY3JpcHQgdG8gbHZtMl9tb25pdG9yaW5nX2luaXRfcmVkX2hhdC5pbi4KKyAgRml4IGx2bTJhcHAgdGVzdCB0byBydW4gdW5kZXIgdGVzdC9hcGkgc3ViZGlyZWN0b3J5IG9ubHkgd2hlbiBjb25maWd1cmVkLgorICBBZGQgdmdfaXNfcmVzaXplYWJsZSgpIGFuZCBjbGVhbnVwIHJlZmVyZW5jZSB0byBWR19SRVNJWkVBQkxFLgorCitWZXJzaW9uIDIuMDIuNTIgLSAxNXRoIFNlcHRlbWJlciAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBfcHJvY2Vzc19vbmVfdmcgdG8gY2xlYW51cCBwcm9wZXJseSBhZnRlciB2Z19yZWFkX2Vycm9yLgorICBBZGQgbG90cyBvZiBtaXNzaW5nIHN0YWNrIGRlYnVnIG1lc3NhZ2VzIHRvIHRvb2xzLgorICBNYWtlIHJlYWRvbmx5IGxvY2tpbmcgYXZhaWxhYmxlIGFzIGxvY2tpbmcgdHlwZSA0LgorICBGaXggcmVhZG9ubHkgbG9ja2luZyB0byBwZXJtaXQgd3JpdGVhYmxlIGdsb2JhbCBsb2NrcyAoZm9yIHZnc2NhbikuICgyLjAyLjQ5KQorICBBZGQgRE1fVURFVl9SVUxFU19WU04gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdWRldiBydWxlcy4KKyAgVXBkYXRlIHZnc3BsaXQsIHZnbWVyZ2UsIGFuZCB2Z3JlbmFtZSB0byBvYmV5IG5ldyB2Z25hbWUgb3JkZXJpbmcgcnVsZXMuCisgIE1ha2UgbHZtMmFwcCBwdl90LCBsdl90LCB2Z190IGhhbmRsZSBkZWZpbml0aW9ucyBjb25zaXN0ZW50IHdpdGggbHZtX3QuCisgIEVuZm9yY2UgYW4gYWxwaGFiZXRpY2FsIGxvY2sgb3JkZXJpbmcgb24gdmduYW1lIGxvY2tpbmcuCisgIFByaW9yaXRpc2Ugd3JpdGUgbG9ja3Mgb3ZlciByZWFkIGxvY2tzIGJ5IGRlZmF1bHQgZm9yIGZpbGUgbG9ja2luZy4KKyAgQWRkIGxvY2FsIGxvY2sgZmlsZXMgd2l0aCBzdWZmaXggJzphdXgnIHRvIHNlcmlhbGlzZSBsb2NraW5nIHJlcXVlc3RzLgorICBGaXggZ2xvYmFsIGxvY2tpbmcgaW4gUFYgcmVwb3J0aW5nIGNvbW1hbmRzICgyLjAyLjQ5KS4KKyAgRml4IHB2Y3JlYXRlIHN0cmluZyB0ZXJtaW5hdGlvbiBpbiBkdXBsaWNhdGUgdXVpZCB3YXJuaW5nIG1lc3NhZ2UuCisgIERvbid0IGxvb3AgcmVhZGluZyBzeXNmcyB3aXRoIHB2Y3JlYXRlIG9uIGEgbm9uLWJsa2V4dCBwYXJ0aXRpb24gKDIuMDIuNTEpLgorICBGaXggdmdjZmdyZXN0b3JlIGVycm9yIHBhdGhzIHdoZW4gbG9ja2luZyBmYWlscyAoMi4wMi40OSkuCisgIFVwZGF0ZSBNYWtlZmlsZSBkaXN0Y2xlYW4gdGFyZ2V0LgorICBBZGQgbGlidWRldiBjb25maWd1cmF0aW9uIGNoZWNrLgorICBNYWtlIGNsdm1kIGNoZWNrIGNvcm9zeW5jIHRvIHNlZSB3aGF0IGNsdXN0ZXIgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UuCisgIEFkZCBjbHZtZCBhdXRvZGV0ZWN0aW9uIGNoZWNrIGFuZCBjbGVhbnVwIHJlbGF0ZWQgY29uZmlndXJlIG1lc3NhZ2VzLgorICBSZXdyaXRlIGNsdm1kIGNvbmZpZ3VyYXRpb24gY29kZSB0byBjb3BlIHdpdGggYWxsIGNvbWJpbmF0aW9ucyBvZiBsaWJzLgorICBBZGRlZCBjb25maWd1cmUgLS1lbmFibGUtY21pcnJvcmQgdG8gYnVpbGQgdGhlIGNsdXN0ZXIgbWlycm9yIGxvZyBkYWVtb24uCisgIFJlbmFtZSBjbG9nZCB0byBjbWlycm9yZC4KKyAgTWFrZSBsdmNoYW5nZSAtLXJlZnJlc2ggb25seSB0YWtlIGEgcmVhZCBsb2NrIG9uIHZvbHVtZSBncm91cC4KKyAgRml4IHJhY2Ugd2hlcmUgbm9uLWJsb2NraW5nIGZpbGUgbG9ja3MgY291bGQgYmUgZ3JhbnRlZCBpbiBlcnJvci4KKyAgRml4IHZnZXh0ZW5kIGVycm9yIHBhdGggLSBpZiBPUlBIQU4gbG9jayBmYWlscywgdW5sb2NrIC8gcmVsZWFzZSB2ZyAoMi4wMi40OSkuCisgIEZpeCBjb21waWxlIHdhcm5pbmcgaW4gY2x2bWQuCisgIENsYXJpZnkgdXNlIG9mIFBFIHJhbmdlcyBpbiBsdntjb252ZXJ0fGNyZWF0ZXxleHRlbmR8cmVzaXplfSBtYW4gcGFnZXMuCisgIFJlbW92ZSB1c2VsZXNzIF9wdl93cml0ZSB3cmFwcGVyLgorICBBZGQgbHZtMmFwcC5zaCB0byB0ZXN0cyBjb25kaXRpb25hbCB1cG9uIGNvbmZpZ3VyZSAtLWVuYWJsZS1hcHBsaWIuCisgIEFkZCBsdm1fdmdfaXNfY2x1c3RlcmVkLCBsdm1fdmdfaXNfZXhwb3J0ZWQsIGFuZCBsdm1fdmdfaXNfcGFydGlhbC4KKyAgVXBkYXRlIGx2bV92Z19yZW1vdmUgdG8gcmVxdWlyZSBsdm1fdmdfd3JpdGUgdG8gY29tbWl0IHJlbW92ZSB0byBkaXNrLgorICBVcGRhdGUgdGVzdC9hcGkvdGVzdC5jIHRvIGNhbGwgbHZtX3ZnX2NyZWF0ZSBhbmQgbHZtX3ZnX3JlbW92ZS4KKworVmVyc2lvbiAyLjAyLjUxIC0gNnRoIEF1Z3VzdCAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGxvY2tpbmcgaW4gY2x2bWQgKDIuMDIuNTApLgorICBBZGQgLS1ub3VkZXZzeW5jIG9wdGlvbiBmb3IgcmVsZXZhbnQgTFZNIHRvb2xzLgorICBBZGQgYWN0aXZhdGlvbi91ZGV2X3N5bmMgdG8gbHZtLmNvbmYuCisgIE9ubHkgY2hhbmdlIExWIHN5bWxpbmtzIG9uIEFDVElWQVRFIG5vdCBQUkVMT0FELgorICBNYWtlIGx2Y29udmVydCBob25vdXIgbG9nIG1pcnJvciBvcHRpb25zIGNvbWJpbmVkIHdpdGggZG93bmNvbnZlcnNpb24uCisgIEFsbG93IExWIHN1c3BlbmQgd2hpbGUgLS1pZ25vcmVsb2NraW5nZmFpbHVyZSBpcyBpbiBmb3JjZS4KKyAgVXBkYXRlIHN5bm9wc2lzIGluIGx2Y29udmVydCBtYW5wYWdlIHRvIG1lbnRpb24gLS1yZXBhaXIuCisgIFNldCBjb29raWVzIGluIGFjdGl2YXRpb24gY29kZSBhbmQgd2FpdCBmb3IgdWRldiB0byBjb21wbGV0ZSBwcm9jZXNzaW5nLgorICBBZGRlZCBjb25maWd1cmUgLS1lbmFibGUtdWRldl9ydWxlcyAtLWVuYWJsZS11ZGV2X3N5bmMuCisgIEFkZGVkIGNvbmZpZ3VyZSAtLXdpdGgtdWRldi1wcmVmaXggLS13aXRoLXVkZXZkaXIuCisgIEFkZGVkIHVkZXYgZGlyIHRvIGhvbGQgdWRldiBydWxlcy4KKyAgQWRkIGRldmljZXMvZGF0YV9hbGlnbm1lbnRfZGV0ZWN0aW9uIHRvIGx2bS5jb25mLgorICBBZGQgZGV2aWNlcy9kYXRhX2FsaWdubWVudF9vZmZzZXRfZGV0ZWN0aW9uIHRvIGx2bS5jb25mLgorICBBZGQgLS1kYXRhYWxpZ25tZW50b2Zmc2V0IHRvIHB2Y3JlYXRlIHRvIHNoaWZ0IHN0YXJ0IG9mIGFsaWduZWQgZGF0YSBhcmVhLgorICBGaXggX21kYV9zZXR1cCgpIHRvIG5vdCBjaGVjayBmaXJzdCBtZGEncyBzaXplIGJlZm9yZSBwZV9hbGlnbiByb3VuZGluZy4KKyAgRG9jdW1lbnQgLUkgb3B0aW9uIG9mIGNsdm1kIGluIHRoZSBtYW4gcGFnZS4KKyAgRml4IGNvbmZpZ3VyZSBzY3JpcHQgdG8gaGFuZGxlIG11bHRpcGxlIGNsdm1kIHNlbGVjdGlvbnMuCisgIEZpeCBsdm0yYXBwLnBjIGluc3RhbGxhdGlvbiBmaWxlbmFtZS4KKyAgUmVtb3ZlIHB2X3QsIHZnX3QgJiBsdl90IGhhbmRsZXMgZnJvbSBsaWIuICBPbmx5IGxpYmx2bSB1c2VzIHRoZW0uCisgIFJlbmFtZSBsdm0uaCB0byBsdm0yYXBwLmggZm9yIG5vdy4KKworVmVyc2lvbiAyLjAyLjUwIC0gMjh0aCBKdWx5IDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENoYW5nZSB0ZXN0L2FwaS90ZXN0LmMgcHJvbXB0IHNvIGl0J3Mgbm90IGNvbmZ1c2VkIHdpdGggdGhlIG1haW4gbHZtIHByb21wdC4KKyAgVXBkYXRlIGxpYmx2bSB1bml0IHRlc3RzIGluIHRlc3QvYXBpIHRvIGNvdmVyIGxhdGVzdCBsaWJsdm0gY2hhbmdlcy4KKyAgQWRkIHVuaW1wbGVtZW50ZWQgbHZtX2x2X3Jlc2l6ZSBhbmQgbHZtX3B2X3Jlc2l6ZSBza2VsZXRvbnMgdG8gbGlibHZtLgorICBBZGQgbHZtX2xpYnJhcnlfZ2V0X3ZlcnNpb24gdG8gbGlibHZtLgorICBBZGQgbHZtX2NvbmZpZ19vdmVycmlkZSB0byBsaWJsdm0gdG8gYWxsb3cgY2FsbGVyIHRvIG92ZXJyaWRlIExWTSBjb25maWcuCisgIEFkZCBsdm1fbHZfaXNfYWN0aXZlIGFuZCBsdm1fbHZfaXNfc3VzcGVuZGVkIHRvIGxpYmx2bS4KKyAgQWRkIGx2bV9sdl9hY3RpdmF0ZSBhbmQgbHZtX2x2X2RlYWN0aXZhdGUgdG8gbGlibHZtLgorICBBZGQgbHZtX3NjYW4sIGx2bV92Z19yZWR1Y2UgYW5kIGx2bV92Z19yZW1vdmVfbHYgdG8gbGlibHZtLgorICBBZGQgZnVuY3Rpb25zIHRvIGdldCBudW1lcmljIHByb3BlcnRpZXMgdG8gbGlibHZtLgorICBBZGQgbHZtX3twdnx2Z3xsdn1fZ2V0X3tuYW1lfHV1aWR9IHRvIGxpYmx2bS4KKyAgQWRkIGx2bV92Z19saXN0X3B2cyBhbmQgbHZtX3ZnX2xpc3RfbHZzIHRvIGxpYmx2bS4KKyAgQWRkIGx2bV92Z19vcGVuIGFuZCBsdm1fdmdfY3JlYXRlX2x2X2xpbmVhciB0byBsaWJsdm0uCisgIEFkZCBsdm1fbGlzdF92Z19uYW1lcy91dWlkcyB0byBsaWJsdm0uCisgIEFkZCBsdm1fZXJybm8gYW5kIGx2bV9lcnJtc2cgdG8gbGlibHZtIHRvIG9idGFpbiBmYWlsdXJlIGluZm9ybWF0aW9uLgorICBSZW5hbWUgbHZtX2NyZWF0ZS9kZXN0cm95IHRvIGx2bV9pbml0L3F1aXQuCisgIFJlbmFtZSBsdm1fcmVsb2FkX2NvbmZpZyB0byBsdm1fY29uZmlnX3JlbG9hZC4KKyAgUmVmYWN0b3IgX292ZXJyaWRlX3NldHRpbmdzIHRvIHVzZSBuZXcgb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9zdHJpbmcuCisgIEFkZCB2Z19yZWR1Y2UgdG8gbWV0YWRhdGEuYyBhbmQgbWV0YWRhdGEtZXhwb3J0ZWQuaC4KKyAgVXBkYXRlIGx2bS5oIHRvIGNsYXJpZnkgQVBJIGJlaGF2aW9yIGFuZCByZXR1cm4gY29kZXMuCisgIFVwZGF0ZSBsdm1fdmdfZXh0ZW5kIHRvIGRvIGFuIGltcGxpY2l0IHB2Y3JlYXRlIG9uIHRoZSBkZXZpY2UuCisgIFVwZGF0ZSBkaXNwbGF5LmMgdG8gdXNlIHZnX2ZyZWUodmcpIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgdGhlIGNhbGN1bGF0aW9uLgorICBSZWZhY3RvciB2Z19zaXplLCB2Z19mcmVlLCBhbmQgcHZfbWRhX2NvdW50IGZpZWxkIGNhbGN1bGF0aW9ucyBmb3IgbGlibHZtLgorICBSZWZhY3RvciBwdmNyZWF0ZSBhbmQgbHZjcmVhdGUgZm9yIGxpYmx2bS4KKyAgQWRkIGdsb2JhbC93YWl0X2Zvcl9sb2NrcyB0byBsdm0uY29uZiBzbyBibG9ja2luZyBmb3IgbG9ja3MgY2FuIGJlIGRpc2FibGVkLgorICBBbGwgTFYgbG9ja3MgYXJlIG5vbi1ibG9ja2luZyBzbyByZW1vdmUgTENLX05PTkJMT0NLIGZyb20gc2VwYXJhdGUgbWFjcm9zLgorICBGaXggcmFjZSBjb25kaXRpb24gd2l0aCB2Z2NyZWF0ZSBhbmQgdmdleHRlbmQgb24gc2FtZSBkZXZpY2UgKDIuMDIuNDkpLgorICBSZW1vdmUgcmVkdW5kYW50IHZhbGlkYXRlX25hbWUgY2FsbCBmcm9tIHZncmVkdWNlLgorICBSZW1vdmUgdW51c2VkIGhhbmRsZXMgbHZzZWcsIHB2c2VnIGluc2lkZSBsaWJsdm0vbHZtLmguCisgIEFkZCBsaWJsdm0yYXBwIE1ha2VmaWxlIGluc3RhbGxhdGlvbiB0YXJnZXRzLgorICBBZGQgbGlibHZtIHBrZ2NvbmZpZyBmaWxlLgorICBVc2UgbmV3bHktaW5kZXBlbmRlbnQgTFZNX0xJQkFQSSBpbiBsaWJsdm0gc29uYW1lLiAgRS5nLiBsaWJsdm0yYXBwLnNvLjIuMS4KKyAgQWRkIGFuIEFQSSB2ZXJzaW9uIG51bWJlciwgTFZNX0xJQkFQSSwgdG8gdGhlIFZFUlNJT04gc3RyaW5nIGZvciBsaWJsdm0uCisgIFBhc3MgYSBwb2ludGVyIHRvIHN0cnVjdCBjbWRfY29udGV4dCB0byBpbml0X211bHRpcGxlX3NlZ3R5cGVzCisgIFJldHVybiBFSU5WQUxJRF9DTURfTElORSBub3Qgc3VjY2VzcyB3aGVuIGludmFsaWQgVkcgbmFtZSBmb3JtYXQgaXMgdXNlZC4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IG1lc3NhZ2VzIGFmdGVyIHZnY3JlYXRlL3Znc3BsaXQgcmVmYWN0b3IgKDIuMDIuNDkpLgorICBBZGQgbG9nX2Vycm5vIHRvIHNldCBhIHNwZWNpZmljIGVycm5vIGFuZCByZXBsYWNlIGxvZ19lcnJvciBpbiBkdWUgY291cnNlLgorICBDaGFuZ2UgY3JlYXRlX3Rvb2xjb250ZXh0IHRvIHN0aWxsIHJldHVybiBhbiBvYmplY3QgaWYgaXQgZmFpbHMgcGFydC13YXkuCisgIEFkZCBFVU5DTEFTU0lGSUVEICgtMSkgYXMgdGhlIGRlZmF1bHQgTFZNIGVycm5vIGNvZGUuCisgIFN0b3JlIGFueSBlcnJubyBhbmQgZXJyb3IgbWVzc2FnZXMgaXNzdWVkIHdoaWxlIHByb2Nlc3NpbmcgZWFjaCBjb21tYW5kLgorICBVc2UgbG9nX2Vycm9yIG1hY3JvIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IGluIHBsYWNlIG9mIGxvZ19lcnIuCisKK1ZlcnNpb24gMi4wMi40OSAtIDE1dGggSnVseSAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgcmVhZG9ubHkgbG9ja2luZyB0eXBlIHRvIHJlcGxhY2UgaW1wbGVtZW50YXRpb24gb2YgLS1pZ25vcmVsb2NraW5nZmFpbHVyZS4KKyAgRXhjbHVkZSBWR19HTE9CQUwgZnJvbSB2Z193cml0ZV9sb2NrX2hlbGQgc28gc2NhbnMgb3BlbiBkZXZzIHJlYWQtb25seSBhZ2Fpbi4KKyAgQWRkIHVuaXQgdGVzdCBjYXNlIGZvciBsaWJsdm0gVkcgY3JlYXRlL2RlbGV0ZSBBUElzLgorICBBZGQgbGlibHZtIEFQSXMgdG8gaW1wbGVtZW50IGNyZWF0aW9uIGFuZCBkZWxldGlvbiBvZiBWR3MuCisgIEluaXRpYWxpemUgY21kLT5jbWRfbGluZSB0byAibGlibHZtIiBpbiBuZXcgbGlibHZtIGxpYnJhcnkuCisgIFBsYWNlIGhhbmRsZXMgdG8gbGlibHZtIG9iamVjdHMgZm9yIHB2LCB2ZywgbHYsIGx2c2VnLCBwdnNlZyBpbnNpZGUgbHZtLmguCisgIFJlZmFjdG9yIHZnc3BsaXQgYW5kIHZnZXh0ZW5kIHRvIHJlbW92ZSBSRUFEX1JFUVVJUkVfUkVTSVpFQUJMRSBmbGFnLgorICBVc2UgX2V4aXQoKSBub3QgZXhpdCgpIGFmdGVyIGZvcmtpbmcgdG8gYXZvaWQgZmx1c2hpbmcgbGliYyBidWZmZXJzIHR3aWNlLgorICBBZGQgY2FzdCB0byBsb2dfaW5mbyBhcmcgaW4gX2ZpbmRfbGFiZWxsZXIgdG8gYXZvaWQgU3BhcmM2NCB3YXJuaW5nLgorICBNYWtlIGNtZC0+Y21kX2xpbmUgY29uc3QuCisgIEZpeCBkZXYgbmFtZSBtaXNtYXRjaCBpbiB2Z2NyZWF0ZSBtYW4gcGFnZSBleGFtcGxlLgorICBSZWZhY3RvciB2Z19yZW1vdmVfc2luZ2xlIGZvciB1c2UgaW4gbGlibHZtLgorICBNYWtlIGFsbCB0b29scyB1c2UgY29uc2lzdGVudCBsb2NrIG9yZGVyaW5nIG9idGFpbmluZyBWR19PUlBIQU4gbG9jayBzZWNvbmQuCisgIENoZWNrIG1kIGRldmljZXMgZm9yIGEgcGFydGl0aW9uIHRhYmxlIGR1cmluZyBkZXZpY2Ugc2Nhbi4KKyAgQWRkIGV4dGVuZGVkIGRldmljZSAoYmxrZXh0KSBhbmQgbWQgcGFydGl0aW9uIChtZHApIHR5cGVzIHRvIGZpbHRlcnMuCisgIE1ha2UgdGV4dCBtZXRhZGF0YSByZWFkIGVycm9ycyBmb3Igc2VnbWVudCBhcmVhcyBtb3JlIHByZWNpc2UuCisgIEZpeCB0ZXh0IHNlZ21lbnQgbWV0YWRhdGEgcmVhZCBlcnJvcnMgdG8gbWVudGlvbiBjb3JyZWN0IHNlZ21lbnQgbmFtZS4KKyAgSW5jbHVkZSBzZWdtZW50IGFuZCBMViBuYW1lcyBpbiB0ZXh0IHNlZ21lbnQgaW1wb3J0IGVycm9yIG1lc3NhZ2VzLgorICBBZGQgcGFyZW50IG5vZGUgdG8gY29uZmlnX25vZGUgc3RydWN0dXJlLgorICBVcGRhdGUgdmdzcGxpdCBhbmQgdmdjcmVhdGUgdG8gY2FsbCBuZXcgdmdfY3JlYXRlIGFuZCAnc2V0JyBmdW5jdGlvbnMuCisgIENoYW5nZSB2Z19jcmVhdGUgdG8gdGFrZSBtaW5pbWFsIHBhcmFtZXRlcnMsIG9idGFpbiBhIGxvY2ssIGFuZCByZXR1cm4gdmdfdC4KKyAgUmVmYWN0b3IgdmdjaGFuZ2UgZXh0ZW50X3NpemUsIG1heF9sdiwgbWF4X3B2LCBhbmQgYWxsb2NfcG9saWN5IGZvciBsaWJsdm0uCisgIFVwZGF0ZSB0LXZnY3JlYXRlLXVzYWdlLnNoIHRvIHRlc3QgZm9yIGRlZmF1bHQgdmcgcHJvcGVydGllcy4KKyAgRml4IG1lbW9yeSBsZWFrIGluIHZnc3BsaXQgd2hlbiByZS1yZWFkaW5nIHRoZSB2Zy4KKyAgTWFrZSB2YXJpb3VzIGV4aXQvY2xlYW51cCBwYXRocyBtb3JlIHJvYnVzdCBhZnRlciBsdm0gaW5pdCBmYWlsdXJlcy4KKyAgVXNlIExDS19OT05CTE9DSyBpbXBsaWNpdGx5IGluc3RlYWQgb2YgZXhwbGljaXQgdmdfcmVhZCgpIGZsYWcuCisgIFJlbW92ZSB1bm5lY2Vzc2FyeSBsb2NraW5nIGFuZCBleGlzdGVuY2UgdGVzdHMgZnJvbSBuZXcgdmdfcmVhZCgpIGludGVyZmFjZS4KKyAgUGVybWl0IHNldmVyYWwgc2VnbWVudCB0eXBlcyB0byBiZSByZWdpc3RlcmVkIGJ5IGEgc2luZ2xlIHNoYXJlZCBvYmplY3QuCisgIFVwZGF0ZSB0aGUgbWFuIHBhZ2VzIHRvIGRvY3VtZW50IHNpemUgdW5pdHMgdW5pZm9ybWx5LgorICBBbGxvdyBjb21tYW5kbGluZSBzaXplcyB0byBiZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgYnl0ZXMgYW5kIHNlY3RvcnMuCisgIFVwZGF0ZSAnbWRfY2h1bmtfYWxpZ25tZW50JyB0byB1c2Ugc3RyaXBlLXdpZHRoIHRvIGFsaWduIFBWIGRhdGEgYXJlYS4KKyAgVXBkYXRlIHRlc3QvdC1pbmNvbnNpc3RlbnQtbWV0YWRhdGEuc2ggdG8gbWF0Y2ggbmV3IHZnX3JlYWQgaW50ZXJmYWNlLgorICBBZGQgbHZtY2FjaGVfaW5pdCgpIHRvIHBvbGxkYWVtb24gaW5pdGlhbGl6YXRpb24uCisgIENvbnZlcnQgdG9vbHMgdG8gdXNlIG5ldyB2Z19yZWFkIC8gdmdfcmVhZF9mb3JfdXBkYXRlLgorICBGaXggc2VnZmF1bHQgaW4gdmdfcmVsZWFzZSB3aGVuIHZnLT5jbWQgaXMgTlVMTC4KKworVmVyc2lvbiAyLjAyLjQ4IC0gMzB0aCBKdW5lIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFib3J0IGlmIGF1dG9tYXRpYyBtZXRhZGF0YSBjb3JyZWN0aW9uIGZhaWxzIHdoZW4gcmVhZGluZyBWRyB0byB1cGRhdGUgaXQuCisgIEV4cGxpY2l0bHkgcmVxdWVzdCBmYWxsYmFjayB0byBkZWZhdWx0IG1ham9yIG51bWJlciBpbiBkZXZpY2UgbWFwcGVyLgorICBJZ25vcmUgc3VzcGVuZGVkIGRldmljZXMgZHVyaW5nIHJlcGFpci4KKyAgQ2FsbCB2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgYXV0b21hdGljYWxseSB0byBmaXggbWlzc2luZyBQVnMgaW4gZG1ldmVudGQuCisgIFN1Z2dlc3QgdXNpbmcgbHZjaGFuZ2UgLS1yZXN5bmMgd2hlbiBhZGRpbmcgbGVnIHRvIG5vdC15ZXQtc3luY2VkIG1pcnJvci4KKyAgRGVzdHJveSB0b29sY29udGV4dCBvbiBjbHZtZCBleGl0IHRvIGF2b2lkIG1lbW9yeSBwb29sIGxlYWtzLgorICBGaXggbHZjb252ZXJ0IG5vdCB0byBwb2xsIG1pcnJvciBpZiBubyBjb252ZXJzaW9uIGluIHByb2dyZXNzLgorICBGaXggbWVtb3J5IGxlYWtzIGluIHRvb2xjb250ZXh0IGVycm9yIHBhdGguCisgIFJlaW5zdGF0ZSBwYXJ0aWFsIGFjdGl2YXRpb24gc3VwcG9ydCBpbiBjbHVzdGVyZWQgbW9kZS4gKDIuMDIuNDApCisgIEFsbG93IG1ldGFkYXRhIGNvcnJlY3Rpb24gZXZlbiB3aGVuIFBWcyBhcmUgbWlzc2luZy4KKyAgVXNlICdsdm0gbHZyZXNpemUnIGluc3RlYWQgb2YgJ2x2cmVzaXplJyBpbiBmc2FkbS4KKyAgRG8gbm90IHVzZSAnLW4nIHJlYWxpbmUgb3B0aW9uIGluIGZzYWRtIGZvciBidXN5Ym94IGNvbXBhdGlibGl0eS4KKyAgQWRkIHZnX2xvY2tfbmV3bmFtZSgpIGxpYnJhcnkgZnVuY3Rpb24gZm9yIHZncmVuYW1lLCB2Z3NwbGl0IGFuZCB2Z2NyZWF0ZS4KKyAgUm91bmQgdXAgcmVxdWVzdGVkIHJlYWRhaGVhZCB0byBhdCBsZWFzdCBvbmUgcGFnZSBhbmQgcHJpbnQgd2FybmluZy4KKyAgVHJ5IHRvIHJlcGFpciB2ZyBiZWZvcmUgYWN0dWFsIHZncmVtb3ZlIHdoZW4gZm9yY2UgZmxhZyBwcm92aWRlZC4KKyAgRml4IHBvc3NpYmxlIGRvdWJsZSByZWxlYXNlIG9mIFZHIGFmdGVyIHJlY292ZXJ5LgorICBBZGQgcGFyYW1ldGVyIHRvIHByb2Nlc3NfZWFjaF92ZyBzcGVjaWZ5aW5nIHdoYXQgdG8gZG8gd2l0aCBpbmNvbnNpc3RlbnQgVkcuCisgIFVuaWZ5IGVycm9yIG1lc3NhZ2VzIHdoZW4gcHJvY2Vzc2luZyBpbmNvbnNpc3RlbnQgdm9sdW1lIGdyb3VwLgorICBVc2UgbHZjb252ZXJ0IC0tcmVwYWlyIGluc3RlYWQgb2YgdmdyZWR1Y2UgaW4gbWlycm9yIGRtZXZlbnRkIERTTy4KKyAgSW50cm9kdWNlIGx2Y29udmVydCAtLXVzZV9wb2xpY2llcyAocmVwYWlyIHBvbGljeSBhY2NvcmRpbmcgdG8gbHZtLmNvbmYpLgorICBVcGRhdGUgY2x2bWQtY29yb3N5bmMgdG8gbWF0Y2ggbmV3IGNvcm9zeW5jIEFQSS4KKyAgRml4IGxpYiBNYWtlZmlsZSB0byBpbmNsdWRlIGFueSBzaGFyZWQgbGlicmFyaWVzIGluIGRlZmF1bHQgdGFyZ2V0LgorICBGaXggcmVuYW1lIG9mIGFjdGl2ZSBzbmFwc2hvdCB3aXRoIHZpcnR1YWwgb3JpZ2luLgorICBGaXggY29udmVydCBwb2xsaW5nIHRvIGlnbm9yZSBMViB3aXRoIGRpZmZlcmVudCBVVUlELgorICBDYWNoZSB1bmRlcmx5aW5nIGRldmljZSByZWFkYWhlYWQgb25seSBiZWZvcmUgYWN0aXZhdGlvbiBjYWxscy4KKyAgRml4IHNlZ2ZhdWx0IHdoZW4gY2FsY3VsYXRpbmcgcmVhZGFoZWFkIG9uIG1pc3NpbmcgZGV2aWNlIGluIHZncmVkdWNlLgorICBSZW1vdmUgdmVyYm9zZSAndmlzaXRlZCcgbWVzc2FnZXMuCisgIEhhbmRsZSBtdWx0aS1leHRlbnQgbWlycm9yIGxvZyBhbGxvY2F0aW9uIHdoZW4gc21hbGxlc3QgUFYgaGFzIG9ubHkgMSBleHRlbnQuCisgIEFkZCBMU0Igc3RhbmRhcmQgaGVhZGVycyBhbmQgZnVuY3Rpb25zIChpbmNsLiByZWxvYWQpIHRvIGNsdm1kIGluaXRzY3JpcHQuCisgIFdoZW4gY3JlYXRpbmcgbmV3IExWLCBkb3VibGUtY2hlY2sgdGhhdCBuYW1lIGlzIG5vdCBhbHJlYWR5IGluIHVzZS4KKyAgUmVtb3ZlIC9kZXYvdmduYW1lL2x2bmFtZSBzeW1saW5rIGF1dG9tYXRpY2FsbHkgaWYgTFYgaXMgbm8gbG9uZ2VyIHZpc2libGUuCisgIFJlbmFtZSBpbnRlcm5hbCB2b3JpZ2luIExWIHRvIG1hdGNoIHZpc2libGUgTFYuCisgIFN1cHByZXNzICdyZW1vdmVkJyBtZXNzYWdlcyBkaXNwbGF5ZWQgd2hlbiBpbnRlcm5hbCBMVnMgYXJlIHJlbW92ZWQuCisgIEZpeCBsdmNoYW5nZSAtYSBhbmQgLXAgZm9yIHNwYXJzZSBMVnMuCisgIEZpeCBsdmNyZWF0ZSAtLXZpcnR1YWxzaXplIHRvIGFjdGl2YXRlIHRoZSBuZXcgZGV2aWNlIGltbWVkaWF0ZWx5LgorICBNYWtlIC0tc25hcHNob3Qgb3B0aW9uYWwgd2l0aCBsdmNyZWF0ZSAtLXZpcnR1YWxzaXplLgorICBHZW5lcmFsaXNlIC0tdmlydHVhbG9yaWdpbnNpemUgdG8gLS12aXJ0dWFsc2l6ZS4KKyAgU2tpcCB2aXJ0dWFsIG9yaWdpbnMgaW4gcHJvY2Vzc19lYWNoX2x2X2luX3ZnKCkgd2l0aG91dCAtLWFsbC4KKyAgRml4IGNvdW50aW5nIG9mIHZpcnR1YWwgb3JpZ2luIExWcyBpbiB2Z192YWxpZGF0ZS4KKyAgQXR0ZW1wdCB0byBsb2FkIGRtLXplcm8gbW9kdWxlIGlmIHplcm8gdGFyZ2V0IG5lZWRlZCBidXQgbm90IHByZXNlbnQuCisKK1ZlcnNpb24gMi4wMi40NyAtIDIybmQgTWF5IDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVuYW1lIGxpYmx2bS5zbyB0byBsaWJsdm0yYXBwLnNvIGFuZCB1c2UgY29uZmlndXJlIC0tZW5hYmxlLWFwcGxpYi4KKyAgUmVpbnN0YXRlIHZlcnNpb24gaW4gbGlibHZtMmNtZC5zbyBzb25hbWUuICgyLjAyLjQ0KQorCitWZXJzaW9uIDIuMDIuNDYgLSAyMXN0IE1heSAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEluaGVyaXQgcmVhZGFoZWFkIHNldHRpbmcgZnJvbSB1bmRlcmx5aW5nIGRldmljZXMgZHVyaW5nIGFjdGl2YXRpb24uCisgIERldGVjdCBMVnMgYWN0aXZlIG9uIHJlbW90ZSBub2RlcyBieSBxdWVyeWluZyBsb2NrcyBpZiBzdXBwb3J0ZWQuCisgIEVuYWJsZSBvbmxpbmUgcmVzaXppbmcgb2YgbWlycm9ycy4KKyAgVXNlIHN1c3BlbmQgd2l0aCBmbHVzaCB3aGVuIGRldmljZSBzaXplIHdhcyBjaGFuZ2VkIGR1cmluZyB0YWJsZSBwcmVsb2FkLgorICBJbXBsZW1lbnQgcXVlcnlfcmVzb3VyY2VfZm4gZm9yIGNsdXN0ZXJfbG9ja2luZy4KKyAgU3VwcG9ydCBxdWVyeV9yZXNvdXJjZV9mbiBpbiBsb2NraW5nIG1vZHVsZXMuCisgIEludHJvZHVjZSBDTFZNRF9DTURfTE9DS19RVUVSWSBjb21tYW5kIGZvciBjbHZtZC4KKyAgRml4IHB2bW92ZSB0byByZXZlcnQgb3BlcmF0aW9uIGlmIHRlbXBvcmFyeSBtaXJyb3IgY3JlYXRpb24gZmFpbHMuCisgIEZpeCBtZXRhZGF0YSBleHBvcnQgZm9yIFZHIHdpdGggbWlzc2luZyBQVnMuCisgIEFkZCB2Z2ltcG9ydGNsb25lIGFuZCBpbnN0YWxsIGl0IGFuZCB0aGUgbWFuIHBhZ2UgYnkgZGVmYXVsdC4KKyAgRm9yY2UgbWF4X2x2IHJlc3RyaWN0aW9uIG9ubHkgZm9yIG5ld2x5IGNyZWF0ZWQgTFYuCisgIFJlbW92ZSB1bm5lZWRlZCBpbXBvcnQgcGFyYW1ldGVyIGZyb20gbHZfY3JlYXRlX2VtcHR5LgorICBNZXJnZSBsdl9pc19kaXNwbGF5YWJsZSBhbmQgbHZfaXNfdmlzaWJsZSBmdW5jdGlvbnMuCisgIEludHJvZHVjZSBsdl9zZXRfdmlzaWJsZSAmIGx2X3NldF9oaWRkZW4gZnVuY3Rpb25zLgorICBGaXggbHZfaXNfdmlzaWJsZSB0byBoYW5kbGUgdmlydHVhbCBvcmlnaW4uCisgIEludHJvZHVjZSBsaW5rX2x2X3RvX3ZnIGFuZCB1bmxpbmtfbHZfZnJvbV92ZyBmdW5jdGlvbnMuCisgIFJlbW92ZSBsdl9jb3VudCBmcm9tIFZHIGFuZCB1c2UgY291bnRlciBmdW5jdGlvbiBpbnN0ZWFkLgorICBGaXggc25hcHNob3Qgc2VnbWVudCBpbXBvcnQgdG8gbm90IHVzZSBkdXBsaWNhdGUgc2VnbWVudHMgJiByZXBsYWNlLgorICBEbyBub3QgcXVlcnkgbm9uZXhpc3RlbnQgZGV2aWNlcyBmb3IgcmVhZGFoZWFkLgorICBSZW1vdmUgTk9OX0JMT0NLSU5HIGxvY2sgZmxhZyBmcm9tIHRvb2xzIGFuZCBzZXQgYSBwb2xpY3kgdG8gYXV0by1zZXQuCisgIFJlbW92ZSBzbmFwc2hvdF9jb3VudCBmcm9tIFZHIGFuZCB1c2UgZnVuY3Rpb24gaW5zdGVhZC4KKyAgRml4IGZpcnN0X3NlZygpIGNhbGwgZm9yIGVtcHR5IHNlZ21lbnQgbGlzdC4KKyAgQWRkIGluc3RhbGxfbHZtMiBtYWtlZmlsZSB0YXJnZXQgdG8gaW5zdGFsbCBvbmx5IHRoZSBMVk0yIGNvbXBvbmVudHMuCisgIFJlamVjdCBtaXNzaW5nIFBWcyBmcm9tIGFsbG9jYXRpb24gaW4gdG9vbGxpYi4KKyAgRml4IFBWIGRhdGFsaWdubWVudCBmb3IgdmFsdWVzIHN0YXJ0aW5nIHByaW9yIHRvIE1EQSBhcmVhLiAoMi4wMi40NSkKKyAgQWRkIHNwYXJzZSBkZXZpY2VzOiBsdmNyZWF0ZSAtcyAtLXZpcnR1YWxvcmlnaW5zaXplIChoaWRkZW4gemVybyBvcmlnaW4pLgorICBGaXggbWluaW11bSB3aWR0aCBvZiBkZXZpY2VzIGNvbHVtbiBpbiByZXBvcnRzLgorICBBZGQgbHZzIG9yaWdpbl9zaXplIGZpZWxkLgorICBGaXggbGludXggY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHRvIGV4Y2x1ZGUgLU8yLgorICBJbXBsZW1lbnQgbHZjb252ZXJ0IC0tcmVwYWlyIGZvciByZXBhaXJpbmcgcGFydGlhbGx5LWZhaWxlZCBtaXJyb3JzLgorICBGaXggdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIGZhaWx1cmUgZXhpdCBjb2RlLgorICBGaXggcmVtb3RlIG1ldGFkYXRhIGJhY2t1cCBmb3IgY2x2bWQuCisgIEludHJvZHVjZSB1bmxvY2tfYW5kX3JlbGVhc2VfdmcgbWFjcm8uCisgIEludHJvZHVjZSB2Z19yZWxlYXNlKCkgdG8gYmUgY2FsbGVkIHRvIGZyZWUgZXZlcnkgc3RydWN0IHZvbHVtZV9ncm91cC4KKyAgQWxsb2MgUFYgaW50ZXJuYWwgc3RydWN0dXJlIGZyb20gVkcgbWVtcG9vbCBpZiBwb3NzaWJsZS4KKyAgRml4IG1ldGFkYXRhIGJhY2t1cCB0byBydW4gYWZ0ZXIgdmdfY29tbWl0IGFsd2F5cy4KKyAgVGlkeSBjbHZtZCB2b2x1bWUgbG9jayBjYWNoZSBmdW5jdGlvbnMuCisgIEZpeCBwdnMgcmVwb3J0IGZvciBvcnBoYW4gUFZzIHdoZW4gc2VnbWVudCBhdHRyaWJ1dGVzIGFyZSByZXF1ZXN0ZWQuCisgIEZpeCBwdnMgLWEgb3V0cHV0IHRvIG5vdCByZWFkIHZvbHVtZSBncm91cHMgZnJvbSBub24tUFYgZGV2aWNlcy4KKyAgQWRkIE1NQyAobW1jYmxrKSBkZXZpY2UgdHlwZSB0byBmaWx0ZXJzLgorICBJbnRyb2R1Y2UgbWVtb3J5IHBvb2xzIHBlciB2b2x1bWUgZ3JvdXAgKHRvIHJlZHVjZSBtZW1vcnkgZm9yIGxhcmdlIFZHcykuCisgIFVzZSBjb3B5IG9mIFBWIHN0cnVjdHVyZSB3aGVuIG1hbmlwdWxhdGluZyBnbG9iYWwgUFYgbGlzdHMuCisgIEFsd2F5cyByZXR1cm4gZXhpdCBlcnJvciBzdGF0dXMgd2hlbiBsb2NraW5nIG9mIHZvbHVtZSBncm91cCBmYWlscy4KKyAgRml4IG1pcnJvciBsb2cgY29udmVydCB2YWxpZGF0aW9uIHF1ZXN0aW9uLgorICBBdm9pZCByZWZlcmVuY2luZyBmaWxlcyBmcm9tIERFU1RESVIgZHVyaW5nIGJ1aWxkIHByb2Nlc3MuCisgIEF2b2lkIGNyZWF0aW5nIHNvbWUgc3RhdGljIGxpYnJhcmllcyB1bmxlc3MgY29uZmlndXJlZCAtLWVuYWJsZS1zdGF0aWNfbGluay4KKyAgRW5hYmxlIHVzZSBvZiBjYWNoZWQgbWV0YWRhdGEgZm9yIHB2cyBhbmQgcHZkaXNwbGF5IGNvbW1hbmRzLgorICBBZGQgbWlzc2luZyAnZGV2aWNlLW1hcHBlcicgaW50ZXJuYWwgc3ViZGlyIGJ1aWxkIGRlcGVuZGVuY3kuCisgIEZpeCBtZW1vcnkgbGVhayBpbiBtaXJyb3IgYWxsb2NhdGlvbiBjb2RlLgorICBTYXZlIGFuZCByZXN0b3JlIHRoZSBwcmV2aW91cyBsb2dnaW5nIGxldmVsIHdoZW4gbG9nIGxldmVsIGlzIGNoYW5nZWQuCisgIEZpeCBlcnJvciBtZXNzYWdlIHdoZW4gYXJjaGl2ZSBpbml0aWFsaXphdGlvbiBmYWlscy4KKyAgTWFrZSBzdXJlIGNsdm1kLWNvcm9zeW5jIHJlbGVhc2VzIHRoZSBsb2Nrc3BhY2Ugd2hlbiBpdCBleGl0cy4KKyAgRml4IHNlZ2ZhdWx0IGZvciB2Z2NmZ3Jlc3RvcmUgb24gVkcgd2l0aCBtaXNzaW5nIFBWcy4KKyAgQmxvY2sgU0lHVEVSTSAmIFNJR0lOVCBpbiBjbHZtZCBzdWJ0aHJlYWRzLgorICBEZXRlY3QgYW5kIGNvbmRpdGlvbmFsbHkgd2lwZSBzd2Fwc3BhY2Ugc2lnbmF0dXJlcyBpbiBwdmNyZWF0ZS4KKyAgRml4IG1heGltYWwgdm9sdW1lIGNvdW50IGNoZWNrIGZvciBzbmFwc2hvdHMgaWYgbWF4X2x2IHNldCBmb3Igdm9sdW1lIGdyb3VwLgorICBGaXggbHZjcmVhdGUgdG8gcmVtb3ZlIHVudXNlZCBjb3cgdm9sdW1lIGlmIHRoZSBzbmFwc2hvdCBjcmVhdGlvbiBmYWlscy4KKyAgRml4IGVycm9yIG1lc3NhZ2VzIHdoZW4gUFYgdXVpZCBvciBwZV9zdGFydCByZWFkaW5nIGZhaWxzLgorICBCdWlsZCBuZXcgbGlibHZtIGFwcGxpY2F0aW9uLWxldmVsIGxpYnJhcnkuCisgIFJlbmFtZSBsaWJsdm0uYSB0byBsaWJsdm0taW50ZXJuYWwuYS4KKyAgRmx1c2ggbWVtb3J5IHBvb2wgYW5kIGZpeCBsb2NraW5nIGluIGNsdm1kIHJlZnJlc2ggYW5kIGJhY2t1cCBjb21tYW5kLgorICBGaXggdW5sb2NrcyBpbiBjbHZtZC1jb3Jvc3luYy4gKDIuMDIuNDUpCisgIEZpeCBlcnJvciBtZXNzYWdlIHdoZW4gYWRkaW5nIG1ldGFkYXRhIGRpcmVjdG9yeSB0byBpbnRlcm5hbCBsaXN0IGZhaWxzLgorICBGaXggc2l6ZSBhbmQgZXJyb3IgbWVzc2FnZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhdCBiYWNrdXAgaW5pdGlhbGl6YXRpb24uCisgIFJlbW92ZSBvbGQgbWV0YWRhdGEgYmFja3VwIGZpbGUgYWZ0ZXIgcmVuYW1pbmcgVkcuCisgIFJlc3RvcmUgbG9nX3N1cHByZXNzIHN0YXRlIHdoZW4gbWV0YWRhdGEgYmFja3VwIGZpbGUgaXMgdXAtdG8tZGF0ZS4KKworVmVyc2lvbiAyLjAyLjQ1IC0gM3JkIE1hcmNoIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEF2b2lkIHNjYW5uaW5nIGVtcHR5IG1ldGFkYXRhIGFyZWFzIGZvciBWRyBuYW1lcy4KKyAgQXR0ZW1wdCBwcm9wZXIgY2xlYW4gdXAgaW4gY2hpbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXcgYmluYXJ5IGluIGV4ZWNfY21kKCkuCisgIERvIG5vdCBzY2FuIGRldmljZXMgaWYgcmVwb3J0aW5nIG9ubHkgYXR0cmlidXRlcyBmcm9tIFBWIGxhYmVsLgorICBVc2UgcGtnY29uZmlnIHRvIG9idGFpbiBjb3Jvc3luYyBsaWJyYXJ5IGRldGFpbHMgZHVyaW5nIGNvbmZpZ3VyYXRpb24uCisgIEZpeCBlcnJvciByZXR1cm5zIGluIGNsdm1kLWNvcm9zeW5jIGludGVyZmFjZSB0byBETE0uCisgIEFkZCAtLXJlZnJlc2ggdG8gdmdjaGFuZ2UgYW5kIHZnbWtub2RlcyBtYW4gcGFnZXMuCisgIFBhc3MgLS10ZXN0IGZyb20gbHZyZXNpemUgdG8gZnNhZG0gYXMgLS1kcnktcnVuLgorICBTdXBwbHkgYXJndltdIGxpc3QgdG8gZXhlY19jbWQoKSB0byBhbGxvdyBmb3IgdmFyaWFibGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuCisgIFByZXZlbnQgZnNhZG0gZnJvbSBjaGVja2luZyBtb3VudGVkIGZpbGVzeXN0ZW1zLgorICBObyBsb25nZXIgdHJlYXRzIGFueSBvdGhlciBrZXkgYXMgJ25vJyB3aGVuIHByb21wdGluZyBpbiBmc2FkbS4KKyAgVGlkeSBmc2FkbSBjb21tYW5kIGxpbmUgcHJvY2Vzc2luZy4KKyAgQWRkIGxpYi9sdm0uaCBhbmQgbGliL2x2bV9iYXNlLmMgZm9yIHRoZSBuZXcgbGlicmFyeSBpbnRlcmZhY2UuCisgIE1vdmUgdG9vbHMvdmVyc2lvbi5oIHRvIGxpYi9taXNjL2x2bS12ZXJzaW9uLmguCisgIFNwbGl0IExWTV9WRVJTSU9OIGludG8gTUFKT1IsIE1JTk9SLCBQQVRDSExFVkVMLCBSRUxFQVNFIGFuZCBSRUxFQVNFX0RBVEUuCisgIEFkZCBzeXN0ZW1fZGlyIHBhcmFtZXRlciB0byBjcmVhdGVfdG9vbGNvbnRleHQoKS4KKyAgQWRkIC0tZGF0YWFsaWdubWVudCB0byBwdmNyZWF0ZSB0byBzcGVjaWZ5IGFsaWdubWVudCBvZiBkYXRhIGFyZWEuCisgIEV4Y2x1ZGUgTENLX0NBQ0hFIGxvY2tzIGZyb20gX3ZnX2xvY2tfY291bnQsIGZpeGluZyBpbnRlcnJ1cHQgdW5ibG9ja2luZy4KKyAgUHJvdmlkZSBkYSBhbmQgbWRhIGxvY2F0aW9ucyBpbiBkZWJ1ZyBtZXNzYWdlIHdoZW4gd3JpdGluZyB0ZXh0IGZvcm1hdCBsYWJlbC4KKyAgTWVudGlvbiB0aGUgcmVzdHJpY3Rpb24gb24gZmlsZSBkZXNjcmlwdG9ycyBhdCBpbnZvY2F0aW9uIG9uIHRoZSBsdm0gbWFuIHBhZ2UuCisgIEluZGV4IGNhY2hlZCB2Z21ldGFkYXRhIGJ5IHZnaWQgbm90IHZnbmFtZSB0byBjb3BlIHdpdGggZHVwbGljYXRlIHZnbmFtZXMuCisgIE5vIGxvbmdlciByZXF1aXJlIGtlcm5lbCBhbmQgbWV0YWRhdGEgbWFqb3IgbnVtYmVycyB0byBtYXRjaC4KKyAgQWRkIGEgZnVsbHktZnVuY3Rpb25hbCBnZXRfY2x1c3Rlcl9uYW1lKCkgdG8gY2x2bWQgY29yb3N5bmMgaW50ZXJmYWNlLgorICBSZW1vdmUgZHVwbGljYXRlIGNwZ19pbml0aWFsaXplIGZyb20gY2x2bWQgc3RhcnR1cC4KKyAgQWRkIG9wdGlvbiB0byAvZXRjL3N5c2NvbmZpZy9jbHVzdGVyIHRvIHNlbGVjdCBjbHVzdGVyIHR5cGUgZm9yIGNsdm1kLgorICBBbGxvdyBjbHZtZCB0byBzdGFydCB1cCBpZiBpdHMgbG9ja3NwYWNlIGFscmVhZHkgZXhpc3RzLgorICBTZXBhcmF0ZSBQViBsYWJlbCBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBuZWVkIHBhcnNlIG1ldGFkYXRhIHdoZW4gcmVwb3J0aW5nLgorICBSZW1vdmUgZXh0ZXJuYWwgZGVwZW5kZW5jeSBvbiB0aGUgJ2N1dCcgY29tbWFuZCBmcm9tIGZzYWRtLgorICBGaXggcHZzIHNlZ2ZhdWx0IHdoZW4gcHYgbWRhIGF0dHJpYnV0ZXMgcmVxdWVzdGVkIGZvciBub3QgYXZhaWxhYmxlIFBWLgorICBBZGQgZnNhZG0gc3VwcG9ydCBmb3IgcmVzemluZyBleHQ0IGZpbGVzeXN5c3RlbXMuCisgIE1vdmUgbG9ja2luZ190eXBlIHJlYWRpbmcgaW5zaWRlIGluaXRfbG9ja2luZygpLgorICBSZW5hbWUgZ2V0X3ZncygpIHRvIGdldF92Z25hbWVzKCkgYW5kIGNsYXJpZnkgcmVsYXRlZCBlcnJvciBtZXNzYWdlcy4KKyAgQWxsb3cgY2x2bWQgdG8gYmUgYnVpbHQgd2l0aCBhbGwgY2x1c3RlciBtYW5hZ2VycyAmIHNlbGVjdCBvbmUgb24gY21kbGluZS4KKyAgTWVudGlvbiAtLXdpdGgtY2x2bWQ9Y29yb3N5bmMgaW4gLi9jb25maWd1cmUuCisgIFJlcGxhY2UgaW50ZXJuYWwgdmdfY2hlY2tfc3RhdHVzKCkgaW1wbGVtZW50YXRpb24uCisgIFJlbmFtZSB2Z19yZWFkKCkgdG8gdmdfcmVhZF9pbnRlcm5hbCgpLgorCitWZXJzaW9uIDIuMDIuNDQgLSAyNnRoIEphbnVhcnkgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IC0tZW5hYmxlLXN0YXRpY19saW5rIGFmdGVyIHRoZSByZWNlbnQgcmVwb3NpdG9yeSBjaGFuZ2VzLgorICBBZGQgY29yb3N5bmMvRExNIGNsdXN0ZXIgaW50ZXJmYWNlIHRvIGNsdm1kLgorICBBZGQgLS1uYW1lcHJlZml4ZXMsIC0tdW5xdW90ZWQsIC0tcm93cyB0byBwdnMsIHZncywgbHZzIG1hbiBwYWdlcy4KKyAgRml4IGx2cmVzaXplIHNpemUgY29udmVyc2lvbiBmb3IgZnNhZG0gd2hlbiBibG9jayBzaXplIGlzIG5vdCAxSy4KKyAgRml4IHB2cyBzZWdmYXVsdCB3aGVuIHJ1biB3aXRoIG9ycGhhbiBQViBhbmQgc29tZSBWRyBmaWVsZHMuCisgIERpc3BsYXkgYSAnZGV2X3NpemUnIG9mIHplcm8gZm9yIG1pc3NpbmcgZGV2aWNlcyBpbiByZXBvcnRzLgorICBBZGQgcHZfbWRhX3NpemUgdG8gcHZzIGFuZCB2Z19tZGFfc2l6ZSB0byB2Z3MuCisgIEZpeCBsdm1kdW1wIC9zeXMgbGlzdGluZyB0byBpbmNsdWRlIHZpcnR1YWwgZGV2aWNlcyBkaXJlY3RvcnkuCisgIEFkZCAiLS1yZWZyZXNoIiBmdW5jdGlvbmFsaXR5IHRvIHZnY2hhbmdlIGFuZCB2Z21rbm9kZXMuCisgIEF2b2lkIGV4Y2VlZGluZyBMViBzaXplIHdoZW4gd2lwaW5nIGRldmljZS4KKyAgQ2FsY3VsYXRlIG1pcnJvciBsb2cgc2l6ZSBpbnN0ZWFkIG9mIHVzaW5nIDEgZXh0ZW50LgorICBFbnN1cmUgcmVxdWVzdGVkIGRldmljZSBudW1iZXIgaXMgYXZhaWxhYmxlIGJlZm9yZSBhY3RpdmF0aW5nIHdpdGggaXQuCisgIEZpeCBpbmNvcnJlY3QgZXhpdCBzdGF0dXMgZnJvbSAnaGVscCA8Y29tbWFuZD4nLgorICBGaXggdmdyZW5hbWUgdXNpbmcgVVVJRCBpZiB0aGVyZSBhcmUgVkdzIHdpdGggaWRlbnRpY2FsIG5hbWVzLgorICBGaXggc2VnZmF1bHQgd2hlbiBpbnZhbGlkIGZpZWxkIGdpdmVuIGluIHJlcG9ydGluZyBjb21tYW5kcy4KKyAgTW92ZSBpc19zdGF0aWMgZnJvbSBjbWQgdG8gZ2xvYmFsIGlzX3N0YXRpYygpLgorICBSZWZhY3RvciBpbml0X2x2bSgpIGZvciBsdm1jbWRsaW5lIGFuZCBjbHZtZC4KKyAgQWRkIGxpYmx2bSBpbnRlcmFjdGl2ZSB0ZXN0IGluZnJhc3RydWN0dXJlIHRvIGJ1aWxkLgorICBBZGQgc2tlbGV0b24gbHZtMi5oIGZpbGUgaW4gcHJlcGFyYXRpb24gZm9yIGEgc2hhcmVkIGxpYnJhcnkgaW50ZXJmYWNlLgorICBVc2UgYmV0dGVyIHJhbmRvbSBzZWVkIHZhbHVlIGluIHRlbXAgZmlsZSBjcmVhdGlvbi4KKyAgQWRkIHJlYWRfdXJhbmRvbSB0byByZWFkIC9kZXYvdXJhbmRvbS4gVXNlIGluIHV1aWQgY2FsY3VsYXRpb24uCisgIFVzZSBkaXNwbGF5YWJsZV9sdnNfaW5fdmcgYW5kIGx2X2lzX2Rpc3BsYXlhYmxlIGZvciBjb25zaXN0ZW5jeSB0aHJvdWdob3V0LgorICBGaXggcmFjZSBpbiB2Z2NyZWF0ZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiBzZWNvbmQgY2FsbGVyIG92ZXJ3cml0aW5nIGZpcnN0LgorICBGaXggdW5pbml0aWFsaXNlZCBsdl9jb3VudCBpbiB2Z2Rpc3BsYXkgLWMuCisgIERvbid0IHNraXAgdXBkYXRpbmcgcHZpZCBoYXNoIHdoZW4gbHZtY2FjaGVfaW5mbyBzdHJ1Y3QgZ290IHN3YXBwZWQuCisgIEFkZCB0aW5mbyB0byB0ZXJtY2FwIHNlYXJjaCBwYXRoIGZvciBwbGQtbGludXguCisgIEZpeCBzdGFydHVwIHJhY2UgaW4gY2x2bWQuCisgIEdlbmVyYXRlIFJlZCBIYXQgY2x2bWQgc3RhcnR1cCBzY3JpcHQgYXQgY29uZmlnIHRpbWUgd2l0aCBjb3JyZWN0IHBhdGhzLgorICBGaXggY2x2bWQgJiBkbWV2ZW50ZCBidWlsZHMgYWZ0ZXIgdHJlZSByZXN0cnVjdHVyaW5nLgorICBDb3BlIHdpdGggc25hcHNob3QgZGVwZW5kZW5jaWVzIHdoZW4gcmVtb3ZpbmcgYSB3aG9sZSBWRyB3aXRoIGx2cmVtb3ZlLgorICBNYWtlIG1hbiBwYWdlcyBhbmQgdG9vbCBoZWxwIHRleHQgY29uc2lzdGVudCB1c2luZyB8IGZvciBhbHRlcm5hdGl2ZSBvcHRpb25zLgorCitWZXJzaW9uIDIuMDIuNDMgLSAxMHRoIE5vdmVtYmVyIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNZXJnZSBkZXZpY2UtbWFwcGVyIGludG8gdGhlIGx2bTIgdHJlZS4KKyAgQ29ycmVjdCBwcm90b3R5cGUgZm9yIC0tcGVybWlzc2lvbiBvbiBsdmNoYW5nZSBhbmQgbHZjcmVhdGUgbWFuIHBhZ2VzLgorICBFeGl0IHdpdGggbm9uLXplcm8gc3RhdHVzIGZyb20gdmdkaXNwbGF5IGlmIGNvdWxkbid0IHNob3cgYW55IHJlcXVlc3RlZCBWRy4KKyAgTW92ZSBsaXN0LmMgaW50byBsaWJkZXZtYXBwZXIgYW5kIHJlbmFtZSBmdW5jdGlvbnMuCisgIFJlbmFtZSBhIGNvdXBsZSBvZiB2YXJpYWJsZXMgdGhhdCBtYXRjaGVkIGZ1bmN0aW9uIG5hbWVzLgorICBVc2Ugc2ltcGxpZmllZCB4LnkueiB2ZXJzaW9uIG51bWJlciBpbiBsaWJkZXZtYXBwZXIucGMuCisgIFJlbW92ZSBhbmNpZW50IGRlYmlhbiBkaXJlY3RvcnkuCisgIFNwbGl0IG91dCBsdm0tbG9nZ2luZy5oIGZyb20gbG9nLmggYW5kIGx2bS1nbG9iYWxzLltjaF0gZnJvbSBsb2cuW2NoXS4KKworVmVyc2lvbiAyLjAyLjQyIC0gMjZ0aCBPY3RvYmVyIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFjY2VwdCBsb2NraW5nIGZhbGxiYWNrX3RvXyogb3B0aW9ucyBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gYXMgZG9jdW1lbnRlZC4KKyAgRml4IHRlbXAgdGFibGUgYWN0aXZhdGlvbiBpbiBtaXJyb3IgY29udmVyc2lvbnMgbm90IHRvIGhhcHBlbiBpbiBvdGhlciBjbWRzLgorICBGaXggdGVtcCB0YWJsZSBpbiBtaXJyb3IgY29udmVyc2lvbnMgdG8gdXNlIGFsd2F5cy1wcmVzZW50IGVycm9yIG5vdCB6ZXJvLgorCitWZXJzaW9uIDIuMDIuNDEgLSAxN3RoIE9jdG9iZXIgMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXNlIHRlbXAgdGFibGUgdG8gc2V0IGRldmljZSBzaXplIHdoZW4gY29udmVydGluZyBtaXJyb3JzLgorICBJbiByZXN1bWVfbWlycm9yX2ltYWdlcyByZXBsYWNlIGFjdGl2YXRlX2x2IHdpdGggcmVzdW1lX2x2IGFzIHdvcmthcm91bmQuCisgIEF2b2lkIG92ZXJ3cml0aW5nIGluLXVzZSBvbi1kaXNrIHRleHQgbWV0YWRhdGEgYnkgZm9yZ2V0dGluZyBNREFfSEVBREVSX1NJWkUuCisgIEZpeCBzbmFwc2hvdCBtb25pdG9yaW5nIGxpYnJhcnkgdG8gbm90IGNhbmNlbCBtb25pdG9yaW5nIGludmFsaWQgc25hcHNob3QuCisgIEdlbmVyYXRlIG1hbiBwYWdlcyBmcm9tIHRlbXBsYXRlcyBhbmQgaW5jbHVkZSB2ZXJzaW9uLgorICBBZGQgdXNybGliZGlyIGFuZCB1c3JzYmluZGlyIHRvIGNvbmZpZ3VyZS4KKyAgRml4IGNvbnZlcnNpb24gb2YgbWQgY2h1bmsgc2l6ZSBpbnRvIHNlY3RvcnMuCisgIEZyZWUgdGV4dCBtZXRhZGF0YSBidWZmZXIgYWZ0ZXIgYSBmYWlsdXJlIHdyaXRpbmcgaXQuCisgIEZpeCBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gYWxsb2NhdGFibGUgZXh0ZW50cyBpbiBWRy4KKyAgRml4IGhhbmRsaW5nIG9mIFBWcyB3aGljaCByZWFwcGVhcmVkIHdpdGggb2xkIG1ldGFkYXRhIHZlcnNpb24uCisgIEZpeCBtaXJyb3IgRFNPIHRvIGNhbGwgdmdyZWR1Y2Ugd2l0aCBwcm9wZXIgcGFyYW1ldGVycy4KKyAgRml4IHZhbGlkYXRpb24gb2YgLS1taW5vciBhbmQgLS1tYWpvciBpbiBsdmNyZWF0ZSB0byByZXF1aXJlIC1NeSBhbHdheXMuCisgIEZpeCByZWxlYXNlOiBjbHZtZCBidWlsZCwgdmdyZWR1Y2UgY29uc29saWRhdGUgJiB0ZXN0cywgL2Rldi9pb2Vycm9yIHdhcm5pbmcuCisKK1ZlcnNpb24gMi4wMi40MCAtIDE5dGggU2VwdGVtYmVyIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWxsb3cgbHZyZW1vdmUgdG8gcmVtb3ZlIExWcyBmcm9tIFZHcyB3aXRoIG1pc3NpbmcgUFZzLgorICBJbiBWRyB3aXRoIFBWcyBtaXNzaW5nLCBieSBkZWZhdWx0IGFsbG93IGFjdGl2YXRpb24gb2YgTFZzIHRoYXQgYXJlIGNvbXBsZXRlLgorICBUcmFjayBQQVJUSUFMX0xWIGFuZCBNSVNTSU5HX1BWIGZsYWdzIGludGVybmFsbHkuCisgIFJlcXVpcmUgLS1mb3JjZSB3aXRoIC0tcmVtb3ZlbWlzc2luZyBpbiB2Z3JlZHVjZSB0byByZW1vdmUgcGFydGlhbCBMVnMuCisgIE5vIGxvbmdlciB3cml0ZSBvdXQgUEFSVElBTCBmbGFnIGludG8gbWV0YWRhdGEgYmFja3Vwcy4KKyAgVHJlYXQgbmV3IGRlZmF1bHQgYWN0aXZhdGlvbi9taXNzaW5nX3N0cmlwZV9maWxsZXIgImVycm9yIiBhcyBhbiBlcnJvciB0YXJnZXQuCisgIFJlbW92ZSBpbnRlcm5hbCBwYXJ0aWFsX21vZGUuCisgIEFkZCBkZXZpY2VzL21kX2NodW5rX2FsaWdubWVudCB0byBsdm0uY29uZi4KKyAgUGFzcyBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lIHRvIHBlX2FsaWduIGFuZCBhZGp1c3QgZm9yIG1kIGNodW5rIHNpemUuCisgIFN0b3JlIHN5c2ZzIGxvY2F0aW9uIGluIHN0cnVjdCBjbWRfY29udGV4dC4KKyAgQXZvaWQgc2h1ZmZsaW5nIHJlbWFpbmluZyBtaXJyb3IgaW1hZ2VzIHdoZW4gcmVtb3Zpbmcgb25lLCByZXRhaW5pbmcgcHJpbWFyeS4KKyAgQWRkIG1pc3NpbmcgTFYgZXJyb3IgdGFyZ2V0IGFjdGl2YXRpb24gaW4gX3JlbW92ZV9taXJyb3JfaW1hZ2VzLgorICBQcmV2ZW50IHJlc2l6aW5nIGFuIExWIHdoaWxlIGx2Y29udmVydCBpcyB1c2luZyBpdC4KKyAgQXZvaWQgcmVwZWF0ZWRseSB3aXBpbmcgY2FjaGUgd2hpbGUgVkdfR0xPQkFMIGlzIGhlbGQgaW4gdmdzY2FuICYgcHZzY2FuLgorICBGaXggcHZyZXNpemUgdG8gbm90IGFsbG93IHJlc2l6ZSBpZiBQViBoYXMgdHdvIG1ldGFkYXRhIGFyZWFzLgorICBGaXggc2V0dGluZyBvZiB2b2x1bWUgbGltaXQgY291bnQgaWYgY29udmVydGluZyB0byBsdm0xIGZvcm1hdC4KKyAgRml4IHZnY29udmVydCBsb2dpY2FsIHZvbHVtZSBpZCBtZXRhZGF0YSB2YWxpZGF0aW9uLgorICBGaXggbHZtZHVtcCBtZXRhZGF0YSBnYXRoZXIgb3B0aW9uICgtbSkgdG8gd29yayBjb3JyZWN0bHkuCisgIEZpeCBhbGxvY2F0aW9uIGJ1ZyBpbiB0ZXh0IG1ldGFkYXRhIGZvcm1hdCB3cml0ZSBlcnJvciBwYXRoLgorICBGaXggdmdjZmdiYWNrdXAgdG8gcHJvcGVybHkgY2hlY2sgZmlsZW5hbWUgaWYgdGVtcGxhdGUgaXMgdXNlZC4KKyAgY29uZmlndXJlIGFib3J0cyBpZiBsY292IG9yIGdlbmh0bWwgYXJlIG1pc3Npbmcgd2l0aCAtLWVuYWJsZS1wcm9maWxpbmcKKyAgdmdyZW1vdmUgdHJpZXMgdG8gcmVtb3ZlIGx2IHNuYXBzaG90IGZpcnN0LgorICBBZGRlZCBmdW5jdGlvbiBsdl9yZW1vdmVfd2l0aF9kZXBlbmRlbmNpZXMoKS4KKyAgSW1wcm92ZSBmaWxlIGRlc2NyaXB0b3IgbGVhayBkZXRlY3Rpb24gdG8gZGlzcGxheSBsaWtlbHkgY3VscHJpdCBhbmQgZmlsZW5hbWUuCisgIENoYW5nZSBjbHVzdGVyZWQgbWlycm9yIGtlcm5lbCBtb2R1bGUgbmFtZSBmcm9tIGNtaXJyb3IgdG8gZG0tbG9nLWNsdXN0ZXJlZC4KKyAgQXZvaWQgbG9vcGluZyBmb3JldmVyIGluIF9wdl9hbmFseXplX21kYV9yYXcgdXNlZCBieSBwdmNrLgorICBDaGFuZ2UgbHZjaGFuZ2UgZXhpdCBzdGF0dXMgdG8gaW5kaWNhdGUgaWYgYW55IHBhcnQgb2YgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCisgIEZpeCBwdmNoYW5nZSBhbmQgcHZyZW1vdmUgdG8gaGFuZGxlIFBWcyB3aXRob3V0IG1kYXMuCisgIFJlZmFjdG9yIF90ZXh0X3B2X3JlYWQgYW5kIGFsd2F5cyByZXR1cm4gbWRhIGxpc3QgaWYgcmVxdWVzdGVkLgorICBGaXggY29uZmlndXJlIHRvIHdvcmsgdy9vIHJlYWRsaW5lIHVubGVzcyAtLWVuYWJsZS1yZWFkbGluZSB1c2VkLiAoMi4wMi4zOSkKKyAgUmVtb3ZlIGlzX2x2bV9wYXJ0aXRpb24gdGVtcGxhdGUgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBjb2RlZC4KKyAgUmVmYWN0b3IgcHZjcmVhdGUgdG8gc2VwYXJhdGUgcGFyYW1ldGVyIHBhcnNpbmcgZnJvbSB2YWxpZGF0aW9uIGxvZ2ljLgorICBDaGVjayBmb3IgbGFiZWxfd3JpdGUoKSBmYWlsdXJlIGluIF90ZXh0X3B2X3dyaXRlKCkuCisgIEFkZCBwdmNyZWF0ZSB0ZXN0cyBhbmQgdXBkYXRlIHZnc3BsaXQgdGVzdHMgdG8gaGFuZGxlIGx2bTEgYW5kIGx2bTIgbWV0YWRhdGEuCisgIEZpeCBwdmNoYW5nZSAtTTEgLXUgdG8gcHJlc2VydmUgZXhpc3RpbmcgZXh0ZW50IGxvY2F0aW9ucyB3aGVuIHRoZXJlJ3MgYSBWRy4KKyAgQ2Vhc2UgcmVjb2duaXNpbmcgc25hcHNob3QtaW4tdXNlIHBlcmNlbnRhZ2VzIHJldHVybmVkIGJ5IGVhcmx5IGRldnQga2VybmVscy4KKyAgQWRkIGJhY2t3YXJkLWNvbXBhdGlibGUgZmxhZ3MgZmllbGQgdG8gb24tZGlzayBmb3JtYXRfdGV4dCBtZXRhZGF0YS4KKyAgRml4IGRtZXZlbnRkIG1vbml0b3JpbmcgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdCBsaWJsdm0yY21kIGFnYWluLiAoMi4wMi4zOSkKKworVmVyc2lvbiAyLjAyLjM5IC0gMjd0aCBKdW5lIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVuYWJsZSByZWFkbGluZSBieSBkZWZhdWx0IGlmIGF2YWlsYWJsZS4KKyAgVXBkYXRlIGF1dG9jb25mIHRvIDIwMDgtMDEtMTYuCisgIEFkZCAkRElTVENMRUFOX0RJUlMgdG8gbWFrZS50bXBsLmluLgorICBDcmVhdGUgY292ZXJhZ2UgcmVwb3J0cyB3aXRoIC0tZW5hYmxlLXByb2ZpbGluZyBhbmQgbWFrZSBsY292IG9yIGxjb3YtZGF0ZWQuCisgIEZpeCB1cCBjYWNoZSBmb3IgUFZzIHdpdGhvdXQgbWRhcyBhZnRlciBjb25zaXN0ZW50IFZHIG1ldGFkYXRhIGlzIHByb2Nlc3NlZC4KKyAgVXBkYXRlIHZhbGlkYXRpb24gb2Ygc2FmZSBtaXJyb3IgbG9nIHR5cGUgY29udmVyc2lvbnMgaW4gbHZjb252ZXJ0LgorICBGaXggbHZjb252ZXJ0IHRvIGRpc2FsbG93IHNuYXBzaG90IGFuZCBtaXJyb3IgY29tYmluYXRpb25zLgorICBGaXggcmVwb3J0aW5nIG9mIExWIGZpZWxkcyBhbG9uZ3NpZGUgdW5hbGxvY2F0ZWQgUFYgc2VnbWVudHMuCisgIEFkZCAtLXVucXVvdGVkIGFuZCAtLXJvd3MgdG8gcmVwb3J0aW5nIHRvb2xzLgorICBBZGQgYW5kIHVzZSB1bmluaXRpYWxpemVkX3ZhcigpIG1hY3JvIHRvIHN1cHByZXNzIGludmFsaWQgY29tcGlsZXIgd2FybmluZ3MuCisgIEludHJvZHVjZSBlbnVtIGZvciBtZCBtaW5vciBzYiB2ZXJzaW9uIHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCisgIEF2b2lkIHVuZGVmaW5lZCByZXR1cm4gdmFsdWUgYWZ0ZXIgX21lbWxvY2sgbWFuaXB1bGF0aW9uIGluIGx2bTJfcnVuLgorICBBdm9pZCBsaW5rIGZhaWx1cmUgaWYgY29uZmlndXJlZCB3aXRob3V0IC0tZW5hYmxlLWNtZGxpYiBvciAtLWVuYWJsZS1yZWFkbGluZS4KKyAgTWFrZSBjbHZtZCByZXR1cm4gYXQgb25jZSBpZiBvdGhlciBub2RlcyBkb3duIGluIGEgZ3VsbSBvciBvcGVuYWlzIGNsdXN0ZXIuCisgIEZpeCBhbmQgaW1wcm92ZSByZWFkYWhlYWQgJ2F1dG8nIGNhbGN1bGF0aW9uIGZvciBzdHJpcGVfc2l6ZS4KKyAgRml4IGx2Y2hhbmdlIG91dHB1dCBmb3IgLXIgYXV0byBzZXR0aW5nIGlmIGF1dG8gaXMgYWxyZWFkeSBzZXQuCisgIEFkZCB0ZXN0IGNhc2UgZm9yIHJlYWRhaGVhZC4KKyAgQXZvaWQgYW1iaWd1b3VzIHVzZSBvZiBpZGVudGlmaWVyIGVycm9yX21lc3NhZ2VfcHJvZHVjZWQuCisgIEJlZ2luIHN5bmNpbmcgY29uZmlndXJlLmluIGZvciBtZXJnZS91bmlmaWNhdGlvbiB3aXRoIGRldmljZS1tYXBwZXIuCisgIEZpeCBhZGRfbWlycm9yX2ltYWdlcyBub3QgdG8gZGVyZWZlcmVuY2UgdW5pbml0aWFsaXplZCBsb2dfbHYgdXBvbiBmYWlsdXJlLgorICBEb24ndCBjYWxsIG9wZW5sb2cgZm9yIGV2ZXJ5IGRlYnVnIGxpbmUgb3V0cHV0IGJ5IGNsdm1kLgorICBBZGQgLS1mb3JjZSB0byBsdmV4dGVuZCBhbmQgbHZyZXNpemUuCisgIEZpeCB2Z2NoYW5nZSBub3QgdG8gYWN0aXZhdGUgY29tcG9uZW50IG1pcnJvciB2b2x1bWVzIGRpcmVjdGx5LgorICBGaXggdGVzdCBkaXJlY3RvcnkgY2xlYW4gdXAgaW4gbWFrZSBkaXN0Y2xlYW4uCisKK1ZlcnNpb24gMi4wMi4zOCAtIDExdGggSnVuZSAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggdHJhY2tpbmcgb2YgdmFsaWRpdHkgb2YgUFZzIHdpdGggbm8gbWRhcyBpbiBsdm1jYWNoZS4KKyAgRml4IHJldHVybiB2YWx1ZXMgZm9yIHJlcG9ydGluZyBjb21tYW5kcyB3aGVuIHJ1biB3aXRoIG5vIFBWcywgTFZzLCBvciBWR3MuCisgIEFkZCBvbWl0dGVkIHVubG9ja192ZygpIGNhbGwgd2hlbiBzaWdpbnRfY2F1Z2h0KCkgZHVyaW5nIHZnIHByb2Nlc3NpbmcuCisgIEZpeCBmcmVlX2NvdW50IHdoZW4gcmVhZGluZyBwb29sIG1ldGFkYXRhLgorICBGaXggc2VnZmF1bHQgd2hlbiB1c2luZyBwdmNyZWF0ZSBvbiBhIGRldmljZSBjb250YWluaW5nIHBvb2wgbWV0YWRhdGEuCisgIEZpeCBzZWdmYXVsdCBhZnRlciBfZnJlZV92Z2luZm8gYnkgcmVtZW1iZXJpbmcgdG8gcmVtb3ZlIHZnaW5mbyBmcm9tIGxpc3QuCisgIFR3ZWFrIGRldGVjdGlvbiBvZiBpbnZhbGlkIGZpZCBhZnRlciBjaGFuZ2VzIHRvIFBWcyBpbiBWRyBpbiBfdmdfcmVhZC4KKyAgUmV2ZXJ0IGFzc3VtaW5nIHByZWNvbW1pdHRlZCBtZXRhZGF0YSBpcyBsaXZlIHdoZW4gYWN0aXZhdGluZyAodW5uZWNlc3NhcnkpLgorICBEcm9wIGNhY2hlZCBtZXRhZGF0YSBmb3IgZGlzYXBwZWFyaW5nIFZHIGluIHZnbWVyZ2UuCisgIEluIHNjcmlwdC1wcm9jZXNzaW5nIG1vZGUsIHN0b3AgaWYgYW55IGNvbW1hbmQgZmFpbHMuCisgIFdhcm4gaWYgY29tbWFuZCBleGl0cyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBjb2RlIHdpdGhvdXQgYSBwcmlvciBsb2dfZXJyb3IuCisgIENoZWNrIGx2X2NvdW50IGluIHZnX3ZhbGlkYXRlLgorICBBZGQgLS1uYW1lcHJlZml4ZXMgdG8gcmVwb3J0aW5nIHRvb2xzIGZvciBmaWVsZCBuYW1lIHByZWZpeCBvdXRwdXQgZm9ybWF0LgorCitWZXJzaW9uIDIuMDIuMzcgLSA2dGggSnVuZSAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1ha2UgY2x2bWQtY21hbiB1c2UgYSBoYXNoIHJhdGhlciB0aGFuIGFuIGFycmF5IGZvciBub2RlIHVwZG93biBpbmZvLgorICBDb3JyZWN0IGNvbmZpZyBmaWxlIGxpbmUgbnVtYmVycyBpbiBtZXNzYWdlcyB3aGVuIHBhcnNpbmcgY29tbWVudHMuCisgIERyb3AgY2FjaGVkIG1ldGFkYXRhIHdoZW4gcmVuYW1pbmcgYSBWRy4KKyAgQWxsb3cgZm9yIHZnaW5mbyBjaGFuZ2luZyBkdXJpbmcgX3ZnX3JlYWQuCisgIERlY29kZSBudW1iZXJzIGluIGNsdm1kIGRlYnVnZ2luZyBvdXRwdXQuCisgIEFkZCBtaXNzaW5nIGRlYWN0aXZhdGlvbiBhZnRlciBhY3RpdmF0aW9uIGZhaWx1cmUgaW4gbHZjcmVhdGUgLVp5LgorICBXaGVuIGFjdGl2YXRpbmcsIGlmIHByZWNvbW1pdHRlZCBtZXRhZGF0YSBpcyBzdGlsbCBjYWNoZWQsIGFzc3VtZSBpdCdzIGxpdmUuCisgIFdoZW4gcmVtb3ZpbmcgTFYgc3ltbGlua3MsIHNraXAgYW55IHdoZXJlIHRoZSBWRyBuYW1lIGlzIG5vdCBkZXRlcm1pbmVkLgorICBEcm9wIG1ldGFkYXRhIGNhY2hlIGlmIHVwZGF0ZSBmYWlscyBpbiB2Z19yZXZlcnQgb3IgdmdfY29tbWl0LgorICBBdm9pZCBzcHVyaW91cyBkdXBsaWNhdGUgVkcgbWVzc2FnZXMgcmVmZXJyaW5nIHRvIFZHcyB0aGF0IGFyZSBnb25lLgorICBEcm9wIGRldl9uYW1lX2NvbmZpcm1lZCBlcnJvciBtZXNzYWdlIHRvIGRlYnVnIGxldmVsLgorICBGaXggc2V0cHJpb3JpdHkgZXJyb3IgbWVzc2FnZSB0byBzaWduZWQgaW50LgorICBUZW1wb3JhcmlseSBkaXNhYmxlIGRtZXZlbnRkIG1pcnJvciBtb25pdG9yaW5nIGR1cmluZyBsdmNoYW5nZSAtLXJlc3luYy4KKyAgUmVmYWN0b3Igc29tZSB2Z2luZm8gbWFuaXB1bGF0aW9uIGNvZGUuCisgIEFkZCBhc3NlcnRpb25zIHRvIHRyYXAgZGVwcmVjYXRlZCBQXyBhbmQgVl8gbG9jayB1c2FnZS4KKyAgQWRkIG1pc3NpbmcgbXV0ZXggYXJvdW5kIGNsdm1kIGx2bWNhY2hlX2Ryb3BfbWV0YWRhdGEgbGlicmFyeSBjYWxsLgorICBGaXggdW5pbml0aWFsaXNlZCBtdXRleCBpbiBjbHZtZCBpZiBhbGwgZGFlbW9ucyBhcmUgbm90IHJ1bm5pbmcgYXQgc3RhcnR1cC4KKyAgQXZvaWQgdXNpbmcgRExNIGxvY2tzIHdpdGggTENLX0NBQ0hFIHR5cGUgUF8gbG9jayByZXF1ZXN0cy4KKyAgV2hlbiBhc2tlZCB0byBkcm9wIGNhY2hlZCBjb21taXR0ZWQgVkcgbWV0YWRhdGEsIGludmFsaWRhdGUgY2FjaGVkIFBWIGxhYmVscy4KKyAgRHJvcCBtZXRhZGF0YSBjYWNoZSBiZWZvcmUgd3JpdGluZyBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaW5zdGVhZCBvZiBhZnRlci4KKyAgRG9uJ3QgdG91Y2ggL2RldiBpbiB2Z3JlbmFtZSBpZiBhY3RpdmF0aW9uIGlzIGRpc2FibGVkLgorCitWZXJzaW9uIDIuMDIuMzYgLSAyOXRoIEFwcmlsIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZnNhZG0uc2ggdG8gd29yayB3aXRoIG9sZGVyIGJsb2NrZGV2LCBibGtpZCAmIHJlYWRsaW5rIGJpbmFyaWVzLgorICBGaXggbHZyZXNpemUgdG8gcGFzcyBuZXcgc2l6ZSB0byBmc2FkbSB3aGVuIGV4dGVuZGluZyBkZXZpY2UuCisgIFJlbW92ZSB1bnVzZWQgc3RydWN0IGluIGNsdm1kLW9wZW5haXMsIGFuZCB1c2UgY29ycmVjdCBub2RlIGNvdW50LgorICBGaXggbm9kZXMgbGlzdCBpbiBjbHZtZC1vcGVuYWlzLCBhbmQgYWxsb3cgZm9yIGJyb2FkY2FzdCBtZXNzYWdlcy4KKyAgRXhjbHVkZSBWR19HTE9CQUwgZnJvbSBpbnRlcm5hbCBjb25jdXJyZW50IFZHIGxvY2sgY291bnRlci4KKyAgRml4IHZnc3BsaXQgaW50ZXJuYWwgY291bnRpbmcgb2Ygc25hcHNob3QgTFZzLgorICBGaXggdmdtZXJnZSBzbmFwc2hvdF9jb3VudCB3aGVuIHNvdXJjZSBWRyBjb250YWlucyBzbmFwc2hvdHMuCisgIFNpbXBsaWZ5IGNsdm1kLW9wZW5haXMgYnkgdXNpbmcgbm9uLWFzeW5jIHNhTGNrUmVzb3VyY2VMb2NrLgorICBGaXggaW50ZXJuYWwgTFYgY291bnRlciB3aGVuIGEgc25hcHNob3QgaXMgcmVtb3ZlZC4KKyAgRml4IG1ldGFkYXRhIGNvcnJ1cHRpb24gd3JpdGluZyBsdm0xLWZvcm1hdHRlZCBtZXRhZGF0YSB3aXRoIHNuYXBzaG90cy4KKyAgRml4IGx2Y29udmVydCAtbTAgYWxsb2NhdGFibGUgc3BhY2UgY2hlY2suCisKK1ZlcnNpb24gMi4wMi4zNSAtIDE1dGggQXByaWwgMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERyb3AgY2FjaGVkIFZHIG1ldGFkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgY29tbWl0dGluZyBjaGFuZ2VzIHRvIGl0LgorICBSZW5hbWUgUF9nbG9iYWwgdG8gUF8jZ2xvYmFsLgorICBEb24ndCBhdHRlbXB0IHJlbW90ZSBtZXRhZGF0YSBiYWNrdXBzIG9mIG5vbi1jbHVzdGVyZWQgVkdzLiAoMi4wMi4yOSkKKyAgRG9uJ3Qgc3RvcmUgZmlkIGluIFZHIG1ldGFkYXRhIGNhY2hlIHRvIGF2b2lkIGNsdm1kIHNlZ2ZhdWx0LiAoMi4wMi4zNCkKKyAgVXBkYXRlIHZnc3BsaXQgdGVzdHMgdG8gdmVyaWZ5IGxvb3NlbmluZyBvZiBhY3RpdmUgTFYgcmVzdHJpY3Rpb24uCisgIFVwZGF0ZSB2Z3NwbGl0IHRvIG9ubHkgcmVzdHJpY3Qgc3BsaXQgd2l0aCBhY3RpdmUgTFZzIGludm9sdmVkIGluIHNwbGl0LgorICBBZGQgbHZfaXNfYWN0aXZlKCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gbHYgaXMgYWN0aXZlLgorCitWZXJzaW9uIDIuMDIuMzQgLSAxMHRoIEFwcmlsIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbXByb3ZlIHByZWZlcnJlZF9uYW1lcyBsdm0uY29uZiBleGFtcGxlLgorICBGaXggdmdkaXNwbGF5ICdDdXIgTFYnIGZpZWxkIHRvIG1hdGNoIGx2ZGlzcGxheSBvdXRwdXQuCisgIEZpeCBsdl9jb3VudCByZXBvcnQgZmllbGQgdG8gZXhjbHVkZSBoaWRkZW4gTFZzLgorICBBZGQgdmdfaXNfY2x1c3RlcmVkKCkgaGVscGVyIGZ1bmN0aW9uLgorICBGaXggdmdzcGxpdCB0byBvbmx5IG1vdmUgaGlkZGVuICdzbmFwc2hvdE4nIExWcyB3aGVuIG5lY2Vzc2FyeS4KKyAgVXBkYXRlIHZnc3BsaXQgdGVzdHMgZm9yIGx2bmFtZXMgb24gdGhlIGNtZGxpbmUuCisgIFVwZGF0ZSB2Z3NwbGl0IG1hbiBwYWdlIHRvIHJlZmxlY3QgbHZuYW1lcyBvbiB0aGUgY21kbGluZS4KKyAgVXBkYXRlIHZnc3BsaXQgdG8gdGFrZSAiLW4gTG9naWNhbFZvbHVtZU5hbWUiIG9uIHRoZSBjbWRsaW5lLgorICBVc2UgY2x1c3RlcmVkIG1pcnJvciBsb2cgd2l0aCBwdm1vdmUgaW4gY2x1c3RlcmVkIFZHcywgaWYgYXZhaWxhYmxlLgorICBGaXggc29tZSBwdm1vdmUgZXJyb3Igc3RhdHVzIGNvZGVzLgorICBGaXggdmdzcGxpdCBlcnJvciBwYXRocyB0byByZWxlYXNlIHZnX3RvIGxvY2suCisgIEluZGljYXRlIHdoZXRoZXIgb3Igbm90IFZHIGlzIGNsdXN0ZXJlZCBpbiB2Z2NyZWF0ZSBsb2cgbWVzc2FnZS4KKyAgTWVudGlvbiBkZWZhdWx0IC0tY2x1c3RlcmVkIHNldHRpbmcgaW4gdmdjcmVhdGUgbWFuIHBhZ2UuCisgIEFkZCBjb25maWcgZmlsZSBvdmVycmlkZXMgdG8gY2x2bWQgd2hlbiBpdCByZWFkcyB0aGUgYWN0aXZlIExWcyBsaXN0LgorICBGaXggdmdyZWR1Y2UgdG8gdXNlIHZnX3NwbGl0X21kYXMgdG8gY2hlY2sgc3VmZmljaWVudCBtZGFzIHJlbWFpbi4KKyAgQWRkIChlbXB0eSkgb3JwaGFuIFZHcyB0byBsdm1jYWNoZSBkdXJpbmcgaW5pdGlhbGlzYXRpb24uCisgIEZpeCBvcnBoYW4gVkcgbmFtZSB1c2VkIGZvciBmb3JtYXRfcG9vbC4KKyAgQ3JlYXRlIGEgZmlkIGZvciBpbnRlcm5hbCBvcnBoYW4gVkdzLgorICBVcGRhdGUgbHZtY2FjaGUgVkcgbG9jayBzdGF0ZSBmb3IgYWxsIGxvY2tpbmcgdHlwZXMgbm93LgorICBGaXggb3V0cHV0IGlmIG92ZXJyaWRpbmcgY29tbWFuZF9uYW1lcyBvbiBjbWRsaW5lLgorICBBZGQgZGV0ZWN0aW9uIG9mIGNsdXN0ZXJlZCBtaXJyb3IgbG9nIGNhcGFiaWxpdHkuCisgIEFkZCBjaGVjayB0byB2Z19jb21taXQoKSBlbnN1cmluZyBWRyBsb2NrIGhlbGQgYmVmb3JlIHdyaXRpbmcgbmV3IFZHIG1ldGFkYXRhLgorICBBZGQgdmFsaWRhdGlvbiBvZiBMViBuYW1lIHRvIHB2bW92ZSAtbi4KKyAgTWFrZSBjbHZtZCByZWZyZXNoIHRoZSBjb250ZXh0IGNvcnJlY3RseSB3aGVuIGx2bS5jb25mIGlzIHVwZGF0ZWQuCisgIEFkZCBzb21lIGJhc2ljIGludGVybmFsIFZHIGxvY2sgdmFsaWRhdGlvbi4KKyAgQWRkIHBlci1jb21tYW5kIGZsYWdzIHRvIGNvbnRyb2wgd2hpY2ggY29tbWFuZHMgdXNlIHRoZSBWRyBtZXRhZGF0YSBjYWNoZS4KKyAgRml4IHZnc3BsaXQgbG9ja2luZyBvZiBuZXcgVkcgKDIuMDIuMzApLgorICBBdm9pZCBlcnJvbmVvdXMgdmdzcGxpdCBlcnJvciBtZXNzYWdlIGZvciBuZXcgVkcuICgyLjAyLjI5KQorICBTdXBwcmVzcyBkdXBsaWNhdGUgbWVzc2FnZSB3aGVuIGx2cmVzaXplIGZhaWxzIGJlY2F1c2Ugb2YgaW52YWxpZCB2Z25hbWUuCisgIENhY2hlIFZHIG1ldGFkYXRhIGludGVybmFsbHkgd2hpbGUgVkcgbG9jayBpcyBoZWxkLgorICBGaXggcmVkdW5kYW50IGx2cmVzaXplIG1lc3NhZ2UgaWYgdmcgZG9lc24ndCBleGlzdC4KKyAgRml4IGFub3RoZXIgYWxsb2NhdGlvbiBidWcgd2l0aCBjbHZtZCBhbmQgbGFyZ2Ugbm9kZSBJRHMuCisgIEFkZCBmaW5kX2x2X2luX2x2X2xpc3QoKSBhbmQgZmluZF9wdl9pbl9wdl9saXN0KCkuCisgIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIGluIGNsdm1kIHRoYXQgY291bGQgY2F1c2Ugb2RkIGhhbmdzLgorICBBZGQgdmdtZXJnZSB0ZXN0cy4KKyAgQWRkIHB2c2VnX2lzX2FsbG9jYXRlZCgpIGZvciBpZGVudGlmeWluZyBhIFBWIHNlZ21lbnQgYWxsb2NhdGVkIHRvIGEgTFYuCisgIEFkZCBsaXN0X21vdmUoKSBmb3IgbW92aW5nIGVsZW1lbnRzIGZyb20gb25lIGxpc3QgdG8gYW5vdGhlci4KKyAgQWRkICdpc19yZXNlcnZlZF9sdm5hbWUoKScgZm9yIGlkZW50aWZ5aW5nIGhpZGRlbiBMVnMuCisgIENvcnJlY3QgY29tbWFuZCBuYW1lIGluIGx2bWRpc2tzY2FuIG1hbiBwYWdlLgorICBjbHZtZCBubyBsb25nZXIgY3Jhc2hlcyBpZiBpdCBzZWVzIG5vZGVpZHMgb3ZlciA1MC4KKyAgRml4IHBvdGVudGlhbCBkZWFkbG9jayBpbiBjbHZtZCB0aHJlYWQgaGFuZGxpbmcuCisgIFJlZmFjdG9yIHRleHQgZm9ybWF0IGluaXRpYWxpc2F0aW9uIGludG8gX2luaXRfdGV4dF9pbXBvcnQuCisgIEVzY2FwZSBkb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBpbiBleHRlcm5hbCBtZXRhZGF0YSBhbmQgY29uZmlnIGRhdGEuCisgIEFkZCBmdW5jdGlvbnMgZm9yIGVzY2FwaW5nIGRvdWJsZSBxdW90ZXMgaW4gc3RyaW5ncy4KKyAgUmVuYW1lIGNvdW50X2NoYXJzX2xlbiB0byBjb3VudF9jaGFycy4KKyAgVXNlIHJldHVybl8wIGluIGEgY291cGxlIG1vcmUgcGxhY2VzLgorICBDb3JyZWN0IGEgZnVuY3Rpb24gbmFtZSB0eXBvIGluIF9saW5lX2FwcGVuZCBlcnJvciBtZXNzYWdlLgorICBJbmNsdWRlIGxpbWl0cy5oIGluIGNsdm1kIHNvIGl0IGNvbXBpbGVzIHdpdGggbmV3ZXIgaGVhZGVycy4KKyAgQWRkIFZpcnRJTyBkaXNrcyAodmlydGJsaykgdG8gZmlsdGVycy4KKyAgRml4IHJlc2V0dGluZyBvZiBNSVJST1JfSU1BR0UgYW5kIFZJU0lCTEVfTFYgYWZ0ZXIgcmVtb3ZhbCBvZiBMVi4gKDIuMDIuMzApCisgIEZpeCByZW1vdmVfbGF5ZXJfZnJvbV9sdiB0byBlbXB0eSB0aGUgTFYgYmVmb3JlIHJlbW92aW5nIGl0LiAoMi4wMi4zMCkKKyAgQWRkIG1pc3Npbmcgbm8tbG9uZ2VyLXVzZWQgc2Vnc191c2luZ190aGlzX2x2IHRlc3QgdG8gY2hlY2tfbHZfc2VnbWVudHMuCisgIFJlbW92ZSByZWR1bmRhbnQgbm9uLU5VTEwgdGVzdHMgYmVmb3JlIGNhbGxpbmcgZnJlZSBpbiBjbHZtZC5jLgorICBBdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmc6IG1ha2UgaXNfb3JwaGFuJ3MgcGFyYW1ldGVyIGNvbnN0LgorICBGaXggbHZjb252ZXJ0IGRldGVjdGlvbiBvZiBtaXJyb3IgY29udmVyc2lvbiBpbiBwcm9ncmVzcy4gKDIuMDIuMzApCisgIEF2b2lkIGF1dG9tYXRpYyBsdmNvbnZlcnQgcG9sbGRhZW1vbiBpbnZvY2F0aW9uIHdoZW4gLVIgc3BlY2lmaWVkLiAoMi4wMi4zMCkKKyAgRml4ICdwdnMgLWEnIHRvIGRldGVjdCBWR3Mgb2YgUFZzIHdpdGhvdXQgbWV0YWRhdGEgYXJlYXMuCisgIERpdmlkZSB1cCBpbnRlcm5hbCBvcnBoYW4gdm9sdW1lIGdyb3VwIGJ5IGZvcm1hdCB0eXBlLgorICBVcGRhdGUgdXNhZ2UgbWVzc2FnZSBmb3IgY2x2bWQuCisgIEZpeCBjbHZtZCBtYW4gcGFnZSBub3QgdG8gcHJpbnQgPGJyPiBhbmQgY2xhcmlmaWVkIGRlYnVnIG9wdGlvbnMuCisgIEZpeCBsdnJlc2l6ZSB0byBzdXBwb3J0IC9kZXYvbWFwcGVyIHByZWZpeCBpbiB0aGUgTFYgbmFtZS4KKyAgRml4IHVuZmlsbGVkIHBhcmFtZXRlciBwYXNzZWQgdG8gZnNhZG0gZnJvbSBsdnJlc2l6ZS4KKyAgVXBkYXRlIGZzYWRtIHRvIGNhbGwgbHZyZXNpemUgaWYgdGhlIHBhcnRpdGlvbiBzaXplIGRpZmZlcnMgKHdpdGggb3B0aW9uIC1sKS4KKyAgRml4IGZzYWRtIHRvIHN1cHBvcnQgVkcvTFYgbmFtZXMuCisKK1ZlcnNpb24gMi4wMi4zMyAtIDMxc3QgSmFudWFyeSAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggbWlycm9yIGxvZyBuYW1lIGNvbnN0cnVjdGlvbiBkdXJpbmcgbHZjb252ZXJ0LiAoMi4wMi4zMCkKKyAgTWFrZSBtb25pdG9yX2Rldl9mb3JfZXZlbnRzIHJlY3Vyc2UgdGhyb3VnaCB0aGUgc3RhY2sgb2YgTFZzLgorICBDbGVhbiB1cCBzb21lIG1vcmUgY29tcGlsZXIgd2FybmluZ3MuCisgIFNvbWUgd2hpdGVzcGFjZSB0aWR5LXVwcy4KKyAgVXNlIHN0YWNrIHJldHVybiBtYWNyb3MgdGhyb3VnaG91dC4KKyAgUmVseSB1cG9uIGludGVybmFsbHktY2FjaGVkIFBWIGxhYmVscyB3aGlsZSBjb3JyZXNwb25kaW5nIFZHIGxvY2sgaXMgaGVsZC4KKworVmVyc2lvbiAyLjAyLjMyIC0gMjl0aCBKYW51YXJ5IDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCB0d28gY2hlY2tfbHZfc2VnbWVudHMgZXJyb3IgbWVzc2FnZXMgdG8gc2hvdyB3aG9sZSBzZWdtZW50LgorICBSZWZhY3RvciBtaXJyb3IgbG9nIGF0dGFjaG1lbnQgY29kZS4KKyAgRml4IGludGVybmFsIG1ldGFkYXRhIGNvcnJ1cHRpb24gaW4gbHZjaGFuZ2UgLS1yZXN5bmMuICgyLjAyLjMwKQorICBGaXggbmV3IHBhcmFtZXRlciB2YWxpZGF0aW9uIGluIHZnc3BsaXQgYW5kIHRlc3QgbW9kZS4gKDIuMDIuMzApCisgIFJlbW92ZSByZWR1bmRhbnQgY254bWFuLXNvY2tldC5oIGZpbGUgZnJvbSBjbHZtZCBkaXJlY3RvcnkuCisgIEZpeCBwdnMsIHZncywgbHZzIGVycm9yIGV4aXQgc3RhdHVzIG9uIHNvbWUgZXJyb3IgcGF0aHMuCisKK1ZlcnNpb24gMi4wMi4zMSAtIDE5dGggSmFudWFyeSAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggbHZjcmVhdGUgLS1ub3N5bmMgbm90IHRvIHdhaXQgZm9yIG5vbi1oYXBwZW5pbmcgc3luYy4gKDIuMDIuMzApCisgIEFkZCB2ZXJ5X3ZlcmJvc2UgbHZjb252ZXJ0IG1lc3NhZ2VzLgorICBBdm9pZCByZWFkYWhlYWQgZXJyb3IgbWVzc2FnZSB3aXRoIGRlZmF1bHQgc2V0dGluZyBvZiBsdmNyZWF0ZSAtTTEuICgyLjAyLjI5KQorCitWZXJzaW9uIDIuMDIuMzAgLSAxN3RoIEphbnVhcnkgMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU2V0IGRlZmF1bHQgcmVhZGFoZWFkIHRvIHR3aWNlIG1heGltaXVtIHN0cmlwZSBzaXplLgorICBSZWluc3RhdGUgVkcgZXh0ZW50IHNpemUgYW5kIHN0cmlwZSBzaXplIGRlZmF1bHRzIChoYWx2ZWQpLiAoMi4wMi4yOSkKKyAgQWRkIGxpc3RzIG9mIHN0YWNrZWQgTFYgc2VnbWVudHMgdXNpbmcgZWFjaCBMViB0byB0aGUgaW50ZXJuYWwgbWV0YWRhdGEuCisgIENoYW5nZSB2Z3NwbGl0IC1sIChmb3IgdW5pbXBsZW1lbnRlZCAtLWxpc3QpIGludG8gLS1tYXhsb2dpY2Fsdm9sdW1lcy4KKyAgRml4IHByb2Nlc3NfYWxsX3B2cyB0byBkZXRlY3Qgbm9uLW9ycGhhbnMgd2l0aCBubyBNREFzIGNvcnJlY3RseS4KKyAgRG9uJ3QgdXNlIGJsb2NrX29uX2Vycm9yIHdpdGggbWlycm9yIHRhcmdldHMgdmVyc2lvbiAxLjEyIGFuZCBhYm92ZS4KKyAgVXBkYXRlIHZnc3BsaXQgdG8gYWNjZXB0IHZnY3JlYXRlIG9wdGlvbnMgd2hlbiBuZXcgVkcgaXMgZGVzdGluYXRpb24uCisgIFVwZGF0ZSB2Z3NwbGl0IHRvIGFjY2VwdCBleGlzdGluZyBWRyBhcyBkZXN0aW5hdGlvbi4KKyAgbHZjb252ZXJ0IHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGluaXRpYWwgc3luYyBieSBkZWZhdWx0LgorICBSZWZhY3RvciB2Z2NyZWF0ZSBmb3IgcGFyYW1ldGVyIHZhbGlkYXRpb24gYW5kIGFkZCB0ZXN0cy4KKyAgQWRkIG5ldyBjb252ZXJ0X2x2IGZpZWxkIHRvIGx2cyBvdXRwdXQuCisgIFByaW50IHdhcm5pbmcgd2hlbiBsdm0gdG9vbHMgYXJlIHJ1bm5pbmcgYXMgbm9uLXJvb3QuCisgIEFkZCBzbmFwc2hvdCBkbWV2ZW50ZCBsaWJyYXJ5IChlbmFibGVzIGRtZXZlbnRkIHNuYXBzaG90IG1vbml0b3JpbmcpLgorICBQcmV2ZW50IHB2Y3JlYXRlIGZyb20gb3ZlcndyaXRpbmcgTURBLWxlc3MgUFZzIGJlbG9uZ2luZyB0byBhY3RpdmUgVkdzLgorICBGaXggYSBzZWdmYXVsdCBpZiB1c2luZyBwdnMgd2l0aCAtLWFsbCBhcmd1bWVudC4gKDIuMDIuMjkpCisgIFVwZGF0ZSAtLXV1aWQgYXJndW1lbnQgZGVzY3JpcHRpb24gaW4gbWFuIHBhZ2VzLgorICBGaXggdmdyZWR1Y2UgUFYgbGlzdCBwcm9jZXNzaW5nIG5vdCB0byBwcm9jZXNzIGV2ZXJ5IFBWIGluIHRoZSBWRy4gKDIuMDIuMjkpCisgIEV4dGVuZCBsdmNvbnZlcnQgdG8gdXNlIHBvbGxkYWVtb24uCisgIEFkZCBzdXBwb3J0IGZvciBzdGFja2VkIG1pcnJvcnMuCisgIE1ham9yIHJlc3RydWN0dXJpbmcgb2YgcHZtb3ZlIGFuZCBsdmNvbnZlcnQgbGF5ZXIgbWFuaXB1bGF0aW9uIGNvZGUuCisgIFJlcGxhY2UgdG9vbHMvZnNhZG0gd2l0aCBzY3JpcHRzL2ZzYWRtLnNoLgorICBBcHBlbmQgZmllbGRzIHRvIHJlcG9ydC9wdnNlZ3NfY29sc192ZXJib3NlLgorICBQZXJtaXQgTFYgc2VnbWVudCBmaWVsZHMgd2l0aCBQViBzZWdtZW50IHJlcG9ydHMuCisgIEFkZCBzZWdfc3RhcnRfcGUgYW5kIHNlZ19wZV9yYW5nZXMgdG8gcmVwb3J0cy4KKworVmVyc2lvbiAyLjAyLjI5IC0gNXRoIERlY2VtYmVyIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1ha2UgY2x2bWQgYmFja3VwIHZnIG1ldGFkYXRhIG9uIHJlbW90ZSBub2Rlcy4KKyAgUmVmYWN0b3IgcHZtb3ZlIGFsbG9jYXRpb24gY29kZS4KKyAgRGVjb2RlIGNsdXN0ZXIgbG9ja2luZyBzdGF0ZSBpbiBsb2cgbWVzc2FnZS4KKyAgQ2hhbmdlIGZpbGUgbG9ja2luZyBzdGF0ZSBtZXNzYWdlcyBmcm9tIGRlYnVnIHRvIHZlcnkgdmVyYm9zZS4KKyAgRml4IC0tYWRkdGFnIHRvIGRyb3AgQCBwcmVmaXggZnJvbSBuYW1lLgorICBTdG9wIGNsdm1kIGdvaW5nIGhheXdpcmUgaWYgYSBwcmVfZnVuY3Rpb24gZmFpbHMuCisgIENvbnZlcnQgc29tZSB2Z19yZWFkcyBpbnRvIHZnX2xvY2tfYW5kX3JlYWRzLgorICBBdm9pZCBuZXN0ZWQgdmdfcmVhZHMgd2hlbiBwcm9jZXNzaW5nIFBWcyBpbiBWR3MgYW5kIGZpeCBhc3NvY2lhdGVkIGxvY2tpbmcuCisgIEFjY2VwdCBzaXplcyB3aXRoIC0tcmVhZGFoZWFkIGFyZ3VtZW50LgorICBTdG9yZSBzaXplIGFyZ3VtZW50cyBhcyBzZWN0b3JzIGludGVybmFsbHkuCisgIEF0dGVtcHQgdG8gcmVtb3ZlIGluY29tcGxldGUgTFZzIHdpdGggbHZjcmVhdGUgemVyb2luZy9hY3RpdmF0aW9uIHByb2JsZW1zLgorICBBZGQgcmVhZF9haGVhZCBhY3RpdmF0aW9uIGNvZGUuCisgIEFkZCBhY3RpdmF0aW9uL3JlYWRhaGVhZCBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgRk1UX1JFU1RSSUNURURfUkVBREFIRUFELgorICBFeHRlbmQgcmVhZGFoZWFkIGFyZyB0byBhY2NlcHQgImF1dG8iIGFuZCAibm9uZSIuCisgIEFkZCBsdl9yZWFkX2FoZWFkIGFuZCBsdl9rZXJuZWxfcmVhZF9haGVhZCBmaWVsZHMgdG8gcmVwb3J0cyBhbmQgbHZkaXNwbGF5LgorICBQcmV2ZW50IGx2Y29udmVydCAtcyBmcm9tIHVzaW5nIHNhbWUgTFYgYXMgb3JpZ2luIGFuZCBzbmFwc2hvdC4KKyAgRml4IGh1bWFuLXJlYWRhYmxlIG91dHB1dCBvZiBvZGQgbnVtYmVycyBvZiBzZWN0b3JzLgorICBBZGQgcHZfbWRhX2ZyZWUgYW5kIHZnX21kYV9mcmVlIGZpZWxkcyB0byByZXBvcnRzIGZvciByYXcgdGV4dCBmb3JtYXQuCisgIEFkZCBMVk0yIHZlcnNpb24gdG8gJ0dlbmVyYXRlZCBieScgY29tbWVudCBpbiBtZXRhZGF0YS4KKyAgU2hvdyAnbm90IHVzYWJsZScgc3BhY2Ugd2hlbiBQViBpcyB0b28gbGFyZ2UgZm9yIGRldmljZSBpbiBwdmRpc3BsYXkuCisgIElnbm9yZSBhbmQgZml4IHVwIGFueSBleGNlc3NpdmUgZGV2aWNlIHNpemUgZm91bmQgaW4gbWV0YWRhdGEuCisgIEZpeCBlcnJvciBtZXNzYWdlIHdoZW4gZml4aW5nIHVwIFBWIHNpemUgaW4gbHZtMiBtZXRhZGF0YSAoMi4wMi4xMSkuCisgIEZpeCBvcnBoYW4tcmVsYXRlZCBsb2NraW5nIGluIHB2ZGlzcGxheSBhbmQgcHZzLgorICBGaXggbWlzc2luZyBWRyB1bmxvY2tzIGluIHNvbWUgcHZjaGFuZ2UgZXJyb3IgcGF0aHMuCisgIEFkZCBzb21lIG1pc3NpbmcgdmFsaWRhdGlvbiBvZiBWRyBuYW1lcy4KKyAgUmVuYW1lIHZhbGlkYXRlX3ZnX25hbWUoKSB0byB2YWxpZGF0ZV9uZXdfdmdfbmFtZSgpLgorICBDaGFuZ2Ugb3JwaGFuIGxvY2sgdG8gVkdfT1JQSEFOUy4KKyAgQ2hhbmdlIGZvcm1hdDEgdG8gdXNlIE9SUEhBTiBhcyBvcnBoYW4gVkcgbmFtZS4KKyAgQ29udmVydCBwdmNoYW5nZSwgcHZkaXNwbGF5LCBwdnNjYW4gdG8gdXNlIGlzX29ycGhhbigpCisgIEFkZCBpc19vcnBoYW5fdmcoKSBhbmQgY2hhbmdlIGFsbCBoYXJkLWNvZGVkIGNoZWNrcyB0byB1c2UgaXQuCisgIERldGVjdCBtZCBzdXBlcmJsb2NrcyB2ZXJzaW9uIDEuMCwgMS4xIGFuZCAxLjIuCisgIEFkZCBfYWxsb2NfcHYoKSBhbmQgX2ZyZWVfcHYoKSBmcm9tIF9wdl9jcmVhdGUoKSBjb2RlIGFuZCBmaXggZXJyb3IgcGF0aHMuCisgIEFkZCBwdl9kZXZfbmFtZSgpIHRvIGFjY2VzcyBQViBkZXZpY2UgbmFtZS4KKyAgQWRkIGNvbnN0IGF0dHJpYnV0ZXMgdG8gcHYgYWNjZXNzb3IgZnVuY3Rpb25zLgorICBSZWZhY3RvciB2Z19hZGRfc25hcHNob3QoKSBhbmQgbHZfY3JlYXRlX2VtcHR5KCkuCisgIEhhbmRsZSBuZXcgc3lzZnMgc3Vic3lzdGVtL2Jsb2NrL2RldmljZXMgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAgUnVuIHRlc3Qgd2l0aCBMVk1fU1lTVEVNX0RJUiBwb2ludGluZyB0byBwcml2YXRlIHJvb3QgYW5kIC9kZXYgZGlycy4KKyAgRml4IGEgYnVnIGluIGx2bV9kdW1wLnNoIGNoZWNrcyBmb3IgbHZtL2Rtc2V0dXAgYmluYXJpZXMuCisgIEZpeCB1bmRlcnF1b3RhdGlvbnMgaW4gbHZtX2R1bXAuc2guCisgIFJlZmFjdG9yIGx2Y3JlYXRlIHN0cmlwZSBhbmQgbWlycm9yIHBhcmFtZXRlciB2YWxpZGF0aW9uLgorICBQcmludCAtLWhlbHAgb3V0cHV0IHRvIHN0ZG91dCwgbm90IHN0ZGVyci4KKyAgQWZ0ZXIgYSBjbWRsaW5lIHByb2Nlc3NpbmcgZXJyb3IsIGRvbid0IHByaW50IGhlbHAgdGV4dCBidXQgc3VnZ2VzdCAtLWhlbHAuCisgIEFkZCAlUFZTIGV4dGVudHMgb3B0aW9uIHRvIGx2cmVzaXplLCBsdmV4dGVuZCwgYW5kIGx2Y3JlYXRlLgorICBBZGQgJ21ha2UgY2hlY2snIHRvIHJ1biB0ZXN0cyBpbiBuZXcgc3ViZGlyZWN0b3J5ICd0ZXN0Jy4KKyAgTW92ZWQgdGhlIG9ic29sZXRlIHRlc3Qgc3ViZGlyZWN0b3J5IHRvIG9sZC10ZXN0cy4KKyAgQ29wZSB3aXRoIHJlbGF0aXZlIHBhdGhzIGluIGNvbmZpZ3VyZSAtLXdpdGgtZG1kaXIuCisgIFJlbW92ZSBuby1sb25nZXItY29ycmVjdCByZXN0cmljdGlvbnMgb24gUFYgYXJnIGNvdW50IHdpdGggc3RyaXBlcy9taXJyb3JzLgorICBGaXggc3RyZHVwIG1lbW9yeSBsZWFrIGluIHN0cl9saXN0X2R1cCgpLgorICBMaW5rIHdpdGggLWxwdGhyZWFkIHdoZW4gc3RhdGljIFNFTGludXggbGlicmFyaWVzIHJlcXVpcmUgdGhhdC4KKyAgRGV0ZWN0IGNvbW1hbmQgbGluZSBQRSB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlaXIgMzItYml0IHJhbmdlLgorICBJbmNsdWRlIHN0cmVycm9yIHN0cmluZyBpbiBkZXZfb3Blbl9mbGFncycgc3RhdCBmYWlsdXJlIG1lc3NhZ2UuCisgIE1vdmUgZ3V0cyBvZiBwdnJlc2l6ZSBpbnRvIGxpYnJhcnkuCisgIEF2b2lkIGVycm9yIHdoZW4gLS1jb3JlbG9nIGlzIHByb3ZpZGVkIHdpdGhvdXQgLS1taXJyb3Jsb2cuICgyLjAyLjI4KQorICBDb3JyZWN0IC0tbWlycm9ybG9nIGFyZ3VtZW50IG5hbWUgaW4gbWFuIHBhZ2VzIChub3QgLS1sb2cpLgorICBDbGVhciBNSVJST1JfTk9UU1lOQ0VEIExWIGZsYWcgd2hlbiBjb252ZXJ0aW5nIGZyb20gbWlycm9yIHRvIGxpbmVhci4KKyAgTW9kaWZ5IGx2cmVtb3ZlIHRvIHByb21wdCBmb3IgcmVtb3ZhbCBpZiBMViBhY3RpdmUgb24gb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAgQWRkICctZicgdG8gdmdyZW1vdmUgdG8gZm9yY2UgcmVtb3ZhbCBvZiBWRyBldmVuIGlmIExWcyBleGlzdC4KKworVmVyc2lvbiAyLjAyLjI4IC0gMjR0aCBBdWd1c3QgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggY2x2bWQgbG9nZ2luZyBzbyB5b3UgY2FuIGdldCBsdm0tbGV2ZWwgZGVidWdnaW5nIG91dCBvZiBpdC4KKyAgSW50cm9kdWNlIFZHX0dMT0JBTCBsb2NrIHR5cGUgZm9yIHZnc2Nhbi9wdnNjYW4gdG8gdHJpZ2dlciBjbHZtZCAtUi4KKyAgQ2hhbmdlIGxvY2tpbmdfZmxhZ3MgZnJvbSBpbnQgdG8gdWludDMyX3QuCisgIEZpeCBjbHZtZCAtUiwgc28gaXQgZnVsbHkgcmVmcmVzaGVzIHRoZSBjYWNoZXMuCisgIENoYW5nZSBsdmNvbnZlcnRfbWlycm9ycyB0byB1c2UgbWlycm9yIHNlZ3R5cGUgbm90IHN0cmlwZWQuCisgIEZpeCBsdmNvbnZlcnRfbWlycm9ycyBkZXRlY3Rpb24gb2YgbnVtYmVyIG9mIGV4aXN0aW5nIG1pcnJvcnMuCisgIENsZWFuIHVwIG51bWVyb3VzIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQgYXBwZWFyZWQgaW4gcmVjZW50IHJlbGVhc2VzLgorICBSZW1vdmUgc2V2ZXJhbCB1bnVzZWQgcGFyYW1ldGVycyBmcm9tIF9hbGxvY2F0ZSgpLgorICBPbmx5IHBlcm1pdCAtLWZvcmNlLCAtLXZlcmJvc2UgYW5kIC0tZGVidWcgYXJndW1lbnRzIHRvIGJlIHJlcGVhdGVkLgorICBGaXggaW5jb25zaXN0ZW50IGxpY2VuY2Ugbm90aWNlczogZXhlY3V0YWJsZXMgYXJlIEdQTHYyOyBsaWJyYXJpZXMgTEdQTHYyLjEuCisgIE1vdmUgZ3V0cyBvZiB2Z3JlbW92ZSBhbmQgbHZyZW1vdmUgaW50byBsaWJyYXJ5LCBpbmNsdWRpbmcgeWVzX25vX3Byb21wdC4KKyAgQWxsb3cgY2x2bWQgZGVidWcgdG8gYmUgdHVybmVkIG9uIGluIGEgcnVubmluZyBkYWVtb24gdXNpbmcgY2x2bWQgLWQgWy1DXS4KKyAgVXBkYXRlIHRvIHVzZSBhdXRvY29uZiAyLjYxLCB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIDIuNTcuCisgIEFkZCBtb3JlIGNsdXN0ZXIgaW5mbyB0byBsdm1kdW1wLgorICBBZGQgZnVydGhlciBjb25zdCBhdHRyaWJ1dGVzIHRocm91Z2hvdXQuCisgIEFkZCBzdXBwb3J0IGZvciByZW5hbWluZyBtaXJyb3JlZCBMVnMuCisgIEZhY3RvciBvdXQgY29yZSBvZiBsdnJlbmFtZSgpIHRvIGxpYnJhcnkgZnVuY3Rpb24uCisgIEFkZCAtLW1pcnJvcmxvZyBhcmd1bWVudCB0byBzcGVjaWZ5IGxvZyB0eXBlIGZvciBtaXJyb3JzLgorICBEb24ndCBhdHRlbXB0IHRvIG1vbml0b3IgZGV2aWNlcyBpZiB0aGVpciBjcmVhdGlvbiBmYWlsZWQgaW4gX2x2X2FjdGl2YXRlLgorICBEb24ndCBsZWFrIGEgZmlsZSBkZXNjcmlwdG9yIGluIGZjbnRsX2xvY2tfZmlsZSgpIHdoZW4gZmNudGwgZmFpbHMuCisgIFJlcGxhY2UgY3JlYXRlX2RpciB3aXRoIGRtX2NyZWF0ZV9kaXIuCisgIERldGVjdCBzdHJlYW0gd3JpdGUgZmFpbHVyZSByZWxpYWJseSB3aXRoIGx2bV9mY2xvc2UgdXNpbmcgZG1fZmNsb3NlLgorICBGaXggY2x2bWQgaWYgY29tcGlsZWQgd2l0aCBndWxtIHN1cHBvcnQuICgyLjAyLjI2KQorICBGaXggbHZkaXNwbGF5IG1hbiBwYWdlIHRvIHNheSBMViBzaXplIGlzIHJlcG9ydGVkIGluIHNlY3RvcnMsIG5vdCBLQi4KKyAgQWRkIHZnX2xvY2tfYW5kX3JlYWQoKSBleHRlcm5hbCBsaWJyYXJ5IGZ1bmN0aW9uLgorICBGaXggbG9hZGluZyBvZiBwZXJzaXN0ZW50IGNhY2hlIGlmIGNhY2hlX2RpciBpcyB1c2VkLiAoMi4wMi4yMykKKyAgUmVkdWNlIF9jb21wYXJlX3BhdGhzIGxzdGF0IGVycm9yIG1lc3NhZ2UgZnJvbSBsb2dfZXJyb3IgdG8gbG9nX3ZlcnlfdmVyYm9zZS4KKyAgQ3JlYXRlIHV0aWwuaCB3aXRoIGxhc3RfcGF0aF9jb21wb25lbnQgcmVwbGFjaW5nIHN0cmR1cCArIGJhc2VuYW1lLgorICBVc2UgZ2NjJ3MgcHJpbnRmIGF0dHJpYnV0ZSB3aGVyZXZlciBwb3NzaWJsZS4KKyAgSW4gX2xpbmVfYXBwZW5kLCB1c2UgInNpemVvZiBidWYgLSAxIiByYXRoZXIgdGhhbiBlcXVpdmFsZW50ICI0MDk1Ii4KKyAgSW50cm9kdWNlIGlzX3NhbWVfaW5vZGUgbWFjcm8sIG5vdyBpbmNsdWRpbmcgYSBjb21wYXJpc29uIG9mIHN0X2Rldi4KKyAgRG9uJ3QgbGVhayBhIGZpbGUgZGVzY3JpcHRvciBpbiBfbG9ja19maWxlKCkgd2hlbiBmbG9jayBmYWlscy4KKyAgQWRkIFNVTidzIExET00gdmlydHVhbCBibG9jayBkZXZpY2UgKHZkaXNrKSBhbmQgcHMzZGlzayB0byBmaWx0ZXJzLgorICBTcGxpdCBtZXRhZGF0YS1leHRlcm5hbC5oIG91dCBmcm9tIG1ldGFkYXRhLmggZm9yIHRoZSB0b29scyB0byB1c2UuCisKK1ZlcnNpb24gMi4wMi4yNyAtIDE3dGggSnVseSAyMDA3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggc25hcHNob3QgY293IGFyZWEgZGVhY3RpdmF0aW9uIGlmIG9yaWdpbiBpcyBub3QgYWN0aXZlLiAoMi4wMi4xMykKKyAgRml4IGNvbmZpZ3VyZSBsaWJkZXZtYXBwZXIuaCBjaGVjayB3aGVuIC0td2l0aC1kbWRpciBpcyB1c2VkLgorICBUdXJuIF9hZGRfcHZfdG9fdmcoKSBpbnRvIGV4dGVybmFsIGxpYnJhcnkgZnVuY3Rpb24gYWRkX3B2X3RvX3ZnKCkuCisgIEFkZCBwdl9ieV9wYXRoKCkgZXh0ZXJuYWwgbGlicmFyeSBmdW5jdGlvbi4KKyAgVGlkeSBjbHZtZC1vcGVuYWlzIG9mIHJlZHVuZGFudCBiaXRzLCBhbmQgaW1wcm92ZSBhbiBlcnJvciByZXBvcnQuCisgIENvcGUgd2l0aCBmaW5kX3NlZ19ieV9sZSgpIGZhaWx1cmUgaW4gY2hlY2tfbHZfc2VnbWVudHMoKS4KKyAgQ2FsbCBkZXZfaXRlcl9kZXN0cm95KCkgaWYgX3Byb2Nlc3NfYWxsX2RldnMoKSBpcyBpbnRlcnJ1cHRlZCBieSBzaWdpbnQuCisgIEFkZCB2Z19tZGFfY291bnQgYW5kIHB2X21kYV9jb3VudCBjb2x1bW5zIHRvIHJlcG9ydHMuCisgIEZpeCBkdW1wY29uZmlnIHRvIHVzZSBsb2dfcHJpbnQgaW5zdGVhZCBvZiBzdGRvdXQgZGlyZWN0bHkuCisgIFJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyICdmaWQnIGZyb20gX2FkZF9wdl90b192Zy4KKyAgQWRkIGtlcm5lbCBhbmQgZGV2aWNlLW1hcHBlciB0YXJnZXRzIHZlcnNpb25zIHRvIGx2bWR1bXAuCisgIFJlcGxhY2UgQlNEIChyKWluZGV4IHdpdGggQzg5IHN0cihyKWNoci4KKyAgSGFuZGxlIHZnc3BsaXQgb2YgYW4gZW50aXJlIFZHIGFzIGEgdmdyZW5hbWUuCisgIFJlaW5pdGlhbGlzZSBpbnRlcm5hbCBsdm1kaXNrc2NhbiB2YXJpYWJsZXMgd2hlbiBjYWxsZWQgcmVwZWF0ZWRseS4KKyAgRml4IG1pc3NpbmcgbHZtX3NoZWxsIHN5bWJvbCBpbiBsdm0yY21kIGxpYnJhcnkuICgyLjAyLjIzKQorICBBZGQgdmdfc3RhdHVzIGZ1bmN0aW9uIGFuZCBjbGVhbiB1cCB2Zy0+c3RhdHVzIGluIHRvb2xzIGRpcmVjdG9yeS4KKyAgQWRkIC0taWdub3JlbW9uaXRvcmluZyB0byBkaXNhYmxlIGFsbCBkbWV2ZW50ZCBpbnRlcmFjdGlvbi4KKyAgUmVtb3ZlIGdldF8gcHJlZml4IGZyb20gZ2V0X3B2XyogZnVuY3Rpb25zLgorICBjbHZtZC1vcGVuYWlzIG5vdyB1c2VzIGNwZ19sb2NhbF9nZXQoKSB0byBnZXQgbm9kZWlkLCByYXRoZXIgdGhhbiBDbG0uCisgIFByaW50IHdhcm5pbmdzIHRvIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dC4KKworVmVyc2lvbiAyLjAyLjI2IC0gMTV0aCBKdW5lIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSB2Z2NmZ3Jlc3RvcmUgbWFuIHBhZ2UuCisgIEFsbG93IGtleWJvYXJkIGludGVycnVwdCBkdXJpbmcgdXNlciBwcm9tcHRzIHdoZW4gYXBwcm9wcmlhdGUuCisgIFJlbW92ZSB1bnVzZWQgY2x2bWQgc3lzdGVtLWx2IGNvZGUuCisgIFJlcGxhY2UgbWFueSBwaHlzaWNhbF92b2x1bWUgc3RydWN0IGRlcmVmZXJlbmNlcyB3aXRoIG5ldyBnZXRfcHZfKiBmdW5jdGlvbnMuCisgIFN1cHByZXNzIGEgYmVuaWduIGNvbXBpbGUtdGltZSB3YXJuaW5nLgorICBDb252ZXJ0IGZpbmRfcHZfaW5fdmdfYnlfdXVpZCBhbmQgcHZfY3JlYXRlIHRvIHVzZSBQViBoYW5kbGVzLgorICBBZGQgd3JhcHBlcnMgdG8gc29tZSBmdW5jdGlvbnMgaW4gcHJlcGFyYXRpb24gZm9yIGV4dGVybmFsIExWTSBsaWJyYXJ5LgorICBBZGQgLWYgdG8gdmdjZmdyZXN0b3JlIHRvIGxpc3QgbWV0YWRhdGEgYmFja3VwIGZpbGVzLgorICBBZGQgdmdfY2hlY2tfc3RhdHVzIHRvIGNvbnNvbGlkYXRlIHZnIHN0YXR1cyBjaGVja3MgYW5kIGVycm9yIG1lc3NhZ2VzLgorICBBZGQgcHZkaXNwbGF5IC0tbWFwcyBpbXBsZW1lbnRhdGlvbi4KKyAgUmVtb3ZlIHVuc3VwcG9ydGVkIExWTTEgb3B0aW9ucyBmcm9tIHZnY2ZncmVzdG9yZSBtYW4gcGFnZS4KKyAgVXBkYXRlIHZnY2ZncmVzdG9yZSBtYW4gcGFnZSB0byBzaG93IG1hbmRhdG9yeSBWRyBuYW1lLgorICBVcGRhdGUgdmdyZW5hbWUgbWFuIHBhZ2UgdG8gaW5jbHVkZSBVVUlEIGFuZCBiZSBjb25zaXN0ZW50IHdpdGggbHZyZW5hbWUuCisgIEFkZCAoZXhwZXJpbWVudGFsKSBPcGVuQUlTIHN1cHBvcnQgdG8gY2x2bWQuCisgIEZpeCBkZWFjdGl2YXRpb24gY29kZSB0byBmb2xsb3cgZGVwZW5kZW5jaWVzIGFuZCByZW1vdmUgc3ltbGlua3MuCisgIEZpeCBhbmQgY2xhcmlmeSB2Z3NwbGl0IGVycm9yIG1lc3NhZ2VzLgorICBGaXggYSBzZWdmYXVsdCBpbiBkZXZpY2VfaXNfdXNhYmxlKCkgaWYgYSBkZXZpY2UgaGFzIG5vIHRhYmxlLgorICBBZGQgc29tZSBtb3JlIGRlYnVnIG1lc3NhZ2VzIHRvIGNsdm1kIHN0YXJ0dXAuCisgIE1pc2MgY2x2bWQgY2xlYW51cHMuCisKK1ZlcnNpb24gMi4wMi4yNSAtIDI3dGggQXByaWwgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBnZXRfY29uZmlnX3VpbnQ2NCgpIHRvIHJlYWQgYSA2NC1iaXQgdmFsdWUgbm90IGEgMzItYml0IG9uZS4KKyAgQWRkIC1XZm9ybWF0LXNlY3VyaXR5IGFuZCBjaGFuZ2Ugb25lIGZwcmludGYoKSB0byBmcHV0cygpLgorICBNb3ZlIHJlZ2V4IGZ1bmN0aW9ucyBpbnRvIGxpYmRldm1hcHBlci4KKyAgQ2hhbmdlIHNvbWUgI2luY2x1ZGUgbGluZXMgdG8gc2VhcmNoIG9ubHkgc3RhbmRhcmQgc3lzdGVtIGRpcmVjdG9yaWVzLgorICBBZGQgZGV2aWNlcy9wcmVmZXJyZWRfbmFtZXMgY29uZmlnIHJlZ2V4IGxpc3QgZm9yIGRpc3BsYXllZCBkZXZpY2UgbmFtZXMuCisgIEZyZWUgYSB0ZW1wb3JhcnkgZGlyIHN0cmluZyBpbiBmY250bF9sb2NrX2ZpbGUoKSBhZnRlciB1c2UuCisgIEZpeCBhIGRtX3Bvb2xfZGVzdHJveSgpIGluIG1hdGNoZXJfY3JlYXRlKCkuCisgIEludHJvZHVjZSBnb3RvX2JhZCBtYWNyby4KKyAgRml4IHdhcm5pbmdzIG9uIHg4Nl82NCBpbnZvbHZpbmcgcHRyZGlmZl90IGluIGxvZ19lcnJvciBtZXNzYWdlcy4KKyAgVXBkYXRlIHB2Y2sgdG8gaW5jbHVkZSB0ZXh0IG1ldGFkYXRhIGFyZWEgYW5kIHJlY29yZCBkZXRlY3Rpb24uCisgIEFkZCBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdG9rZW4gY291bnRpbmcgaW4gY29uZmlnIGZpbGUgZXh0cmFjdHMuCisgIFVwZGF0ZSBwdmNrIHRvIHJlYWQgbGFiZWxzIG9uIGRpc2ssIHdpdGggLS1sYWJlbHNlY3RvciBwYXJhbWV0ZXIuCisgIEFkZCBjb3VudF9jaGFycyBhbmQgY291bnRfY2hhcnNfbGVuIGZ1bmN0aW9ucy4KKyAgQWRkIC9zeXMvYmxvY2sgbGlzdGluZ3MgdG8gbHZtX2R1bXAuc2guCisgIE1ha2UgbHZtX2R1bXAuc2ggbGlzdCAvZGV2IHJlY3Vyc2l2ZWx5LgorICBGaXggdGhyZWFkIHJhY2UgaW4gY2x2bWQuCisgIEFkZCBzY2FuX3NlY3RvciBwYXJhbSB0byBsYWJlbF9yZWFkIGFuZCBfZmluZF9sYWJlbGxlci4KKyAgTWFrZSBjbHZtZCBjb3BlIHdpdGggcXVvcnVtIGRldmljZXMuCisgIEFkZCBleHRyYSBpbnRlcm5hbCBlcnJvciBjaGVja2luZyB0byBjbHZtZC4KKyAgQWRkIGRldl9yZWFkX2NpcmN1bGFyLgorICBBZGQgcHZjayBjb21tYW5kIHN0dWIuCisgIFVwZGF0ZSBsaXN0cyBvZiBhdHRyaWJ1dGUgY2hhcmFjdGVycyBpbiBtYW4gcGFnZXMuCisgIENoYW5nZSBjbGluZyBhbGxvYyBwb2xpY3kgYXR0cmlidXRlIGNoYXJhY3RlciBmcm9tICdDJyB0byBsJy4KKyAgRml4IGNyZWF0aW9uIGFuZCBjb252ZXJzaW9uIG9mIG1pcnJvcnMgd2l0aCB0YWdzLgorICBGaXggdmdzcGxpdCBmb3IgbHZtMSBmb3JtYXQgKHNldCBhbmQgdmFsaWRhdGUgVkcgbmFtZSBpbiBQVnMgbWV0YWRhdGEpLgorICBTcGxpdCBtZXRhZGF0YSBhcmVhcyBpbiB2Z3NwbGl0IHByb3Blcmx5LgorCitWZXJzaW9uIDIuMDIuMjQgLSAxOXRoIE1hcmNoIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggcHJvY2Vzc2luZyBvZiBleGl0IHN0YXR1cyBpbiBpbml0IHNjcmlwdHMKKyAgRml4IHZncmVtb3ZlIHRvIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHZnIGFyZ3VtZW50LgorICBGaXggcmVhZGluZyBvZiBzdHJpcGVkIExWcyBpbiBMVk0xIGZvcm1hdC4KKyAgRmxhZyBub2xvY2tpbmcgYXMgY2x1c3RlcmVkIHNvIGNsdm1kIHN0YXJ0dXAgc2VlcyBjbHVzdGVyZWQgTFZzLiAoMi4wMi4xMCkKKyAgQWRkIGEgZmV3IG1pc3NpbmcgcGllY2VzIG9mIHZnbmFtZSBjb21tYW5kIGxpbmUgdmFsaWRhdGlvbi4KKyAgU3VwcG9ydCB0aGUgL2Rldi9tYXBwZXIgcHJlZml4IG9uIG1vc3QgY29tbWFuZCBsaW5lcy4KKworVmVyc2lvbiAyLjAyLjIzIC0gOHRoIE1hcmNoIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCB2Z3JlbmFtZSBhY3RpdmUgTFYgY2hlY2sgdG8gaWdub3JlIGRpZmZlcmluZyB2Z2lkcy4KKyAgUmVtb3ZlIG5vLWxvbmdlci11c2VkIHV1aWRfb3V0IHBhcmFtZXRlciBmcm9tIGFjdGl2YXRpb24gaW5mbyBmdW5jdGlvbnMuCisgIEZpeCB0d28gbW9yZSBzZWdmYXVsdHMgaWYgYW4gZW1wdHkgY29uZmlnIGZpbGUgc2VjdGlvbiBlbmNvdW50ZXJlZC4KKyAgTW92ZSAuY2FjaGUgZmlsZSBpbnRvIGEgbmV3IC9ldGMvbHZtL2NhY2hlIGRpcmVjdG9yeSBieSBkZWZhdWx0LgorICBBZGQgZGV2aWNlcy9jYWNoZV9kaXIgJiBkZXZpY2VzL2NhY2hlX2ZpbGVfcHJlZml4LCBkZXByZWNhdGluZyBkZXZpY2VzL2NhY2hlLgorICBDcmVhdGUgZGlyZWN0b3J5IGluIGZjbnRsX2xvY2tfZmlsZSgpIGlmIHJlcXVpcmVkLgorICBFeGNsdWRlIHJlYWRsaW5lIHN1cHBvcnQgZnJvbSBsdm0uc3RhdGljLgorICBGaXggYSBsZWFrIGluIGEgcmVwb3J0aW5nIGVycm9yIHBhdGggKDIuMDIuMTkpLgorCitWZXJzaW9uIDIuMDIuMjIgLSAxM3RoIEZlYnJ1YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3JyZWN0IC1iIGFuZCAtUCBvbiBhIGNvdXBsZSBvZiBtYW4gcGFnZXMuCisgIEFkZCBnbG9iYWwvdW5pdHMgdG8gZXhhbXBsZS5jb25mLgorICBGaXggbG9hZGluZyBvZiBzZWdtZW50X2xpYnJhcmllcy4KKyAgSWYgYSBQViByZWFwcGVhcnMgYWZ0ZXIgaXQgd2FzIHJlbW92ZWQgZnJvbSBpdHMgVkcsIG1ha2UgaXQgYW4gb3JwaGFuLgorICBEb24ndCB1cGRhdGUgbWV0YWRhdGEgYXV0b21hdGljYWxseSBpZiBWR0lEcyBkb24ndCBtYXRjaC4KKyAgRml4IHNvbWUgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIGNvbW1hbmQgbGluZSB2YWxpZGF0aW9uLgorCitWZXJzaW9uIDIuMDIuMjEgLSAzMHRoIEphbnVhcnkgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHdhcm5pbmcgdG8gbHZtMl9tb25pdG9yaW5nX2luaXRfcmhlbDQgaWYgYXR0ZW1wdGluZyB0byBzdG9wIG1vbml0b3JpbmcuCisgIEZpeCB2Z3NwbGl0IHRvIGhhbmRsZSBtaXJyb3JzLgorICBSZW9yZGVyIGZpZWxkcyBpbiByZXBvcnRpbmcgZmllbGQgZGVmaW5pdGlvbnMuCisgIEZpeCB2Z3MgdG8gdHJlYXQgYXJncyBhcyBWR3MgZXZlbiB3aGVuIFBWIGZpZWxkcyBhcmUgZGlzcGxheWVkLgorICBGaXggbWQgc2lnbmF0dXJlIGNoZWNrIHRvIGhhbmRsZSBib3RoIGVuZGlhbm5lc3Nlcy4KKworVmVyc2lvbiAyLjAyLjIwIC0gMjV0aCBKYW51YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIGRtZXZlbnRkIG1pcnJvciBzZXRzIGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyBhbmQgYXZvaWRzIHNjYW5uaW5nIG1pcnJvcnMuCisgIEFkZCBkZXZpY2VzL2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyB0byBpZ25vcmUgc3VzcGVuZGVkIGRtIGRldmljZXMuCisgIEFkZCBzb21lIG1pc3NpbmcgY2xvc2UoKSBhbmQgZmNsb3NlKCkgcmV0dXJuIGNvZGUgY2hlY2tzLgorICBGaXggZXhpdCBzdGF0dXNlcyBvZiByZXBvcnRpbmcgdG9vbHMgKDIuMDIuMTkpLgorICBBZGQgaW5pdCBzY3JpcHQgZm9yIGRtZXZlbnRkIG1vbml0b3JpbmcuCisgIGx2bS5zdGF0aWMgbm8gbG9uZ2VyIGludGVyYWN0cyB3aXRoIGRtZXZlbnRkIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIHRvLgorICBBZGQgZmllbGQgZGVmaW5pdGlvbnMgdG8gcmVwb3J0IGhlbHAgdGV4dC4KKyAgUmVtb3ZlIHVubmVjZXNzYXJ5IGNtZCBhcmcgZnJvbSB0YXJnZXRfKm1vbml0b3JfZXZlbnRzKCkuCisgIEFkZCBwcml2YXRlIHZhcmlhYmxlIHRvIGRtZXZlbnRkIHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZS4KKyAgTG9uZy1saXZlZCBwcm9jZXNzZXMgd3JpdGUgb3V0IHBlcnNpc3RlbnQgZGV2IGNhY2hlIGluIHJlZnJlc2hfdG9vbGNvbnRleHQoKS4KKyAgRml4IHJlZnJlc2hfdG9vbGNvbnRleHQoKSBhbHdheXMgdG8gd2lwZSBwZXJzaXN0ZW50IGRldmljZSBmaWx0ZXIgY2FjaGUuCisgIEFkZCBpc19sb25nX2xpdmVkIHRvIHRvb2xjb250ZXh0LgorICBBZGQgLS1jbHVzdGVyZWQgdG8gbWFuIHBhZ2VzLgorICBTdHJlYW1saW5lIGRtX3JlcG9ydF9maWVsZF8qIGludGVyZmFjZS4KKyAgQ2hhbmdlIHJlbWFpbmluZyBkbWV2ZW50ZCB0ZXJtaW5vbG9neSAncmVnaXN0ZXInIHRvICdtb25pdG9yJy4KKyAgVXBkYXRlIHJlcG9ydGluZyBtYW4gcGFnZXMuCisgIE5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSBhbGlnbm1lbnQgdHlwZSBmb3IgcmVwb3J0IGZpZWxkcy4KKworVmVyc2lvbiAyLjAyLjE5IC0gMTd0aCBKYW51YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBhIHNlZ2ZhdWx0IGlmIGFuIGVtcHR5IGNvbmZpZyBmaWxlIHNlY3Rpb24gZW5jb3VudGVyZWQuCisgIE1vdmUgYmFzaWMgcmVwb3J0aW5nIGZ1bmN0aW9ucyBpbnRvIGxpYmRldm1hcHBlci4KKyAgRml4IHBhcnRpdGlvbiB0YWJsZSBwcm9jZXNzaW5nIGFmdGVyIHNwYXJjIGNoYW5nZXMgKDIuMDIuMTYpLgorICBGaXggY21kbGluZSBQRSByYW5nZSBwcm9jZXNzaW5nIHNlZ2ZhdWx0ICgyLjAyLjEzKS4KKyAgU29tZSBsaWJkZXZtYXBwZXItZXZlbnQgaW50ZXJmYWNlIGNoYW5nZXMuCisgIFJlcG9ydCBkbWV2ZW50ZCBtaXJyb3IgbW9uaXRvcmluZyBzdGF0dXMuCisgIEZpeCBkbWV2ZW50ZCBtaXJyb3Igc3RhdHVzIGxpbmUgcHJvY2Vzc2luZy4KKworVmVyc2lvbiAyLjAyLjE4IC0gMTF0aCBKYW51YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJldmlzZWQgbGliZGV2bWFwcGVyLWV2ZW50IGludGVyZmFjZSBmb3IgZG1ldmVudGQuCisgIFJlbW92ZSBkbWV2ZW50ZCBtaXJyb3Igc3RhdHVzIGxpbmUgd29yZCBsaW1pdC4KKyAgVXNlIENGTEFHUyB3aGVuIGxpbmtpbmcgc28gbWl4ZWQgc3BhcmMgYnVpbGRzIGNhbiBzdXBwbHkgLW02NC4KKyAgUHJldmVudCBwZXJtaXNzaW9uIGNoYW5nZXMgb24gYWN0aXZlIG1pcnJvcnMuCisgIFByaW50IHdhcm5pbmcgaW5zdGVhZCBvZiBlcnJvciBtZXNzYWdlIGlmIGx2Y29udmVydCBjYW5ub3QgemVybyB2b2x1bWUuCisgIEFkZCBzbmFwc2hvdCBvcHRpb25zIHRvIGx2Y29udmVydCBtYW4gcGFnZS4KKyAgZHVtcGNvbmZpZyBhY2NlcHRzIGEgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0byBkaXNwbGF5LgorICBDaGFuZ2UgZHVtcGNvbmZpZyB0byB1c2UgLS1maWxlIHRvIHJlZGlyZWN0IG91dHB1dCB0byBhIGZpbGUuCisgIEF2b2lkIHZncmVkdWNlIGVycm9yIHdoZW4gbWlycm9yIGNvZGUgcmVtb3ZlcyB0aGUgbG9nIExWLgorICBSZW1vdmUgMyByZWR1bmRhbnQgQUNfTVNHX1JFU1VMVHMgZnJvbSBjb25maWd1cmUuaW4uCisgIEZyZWUgbWVtb3J5IGluIF9yYXdfcmVhZF9tZGFfaGVhZGVyKCkgZXJyb3IgcGF0aHMuCisgIEZpeCBhbWJpZ3VvdXMgdmdzcGxpdCBlcnJvciBtZXNzYWdlIGZvciBzcGxpdCBMVi4KKyAgRml4IGx2ZXh0ZW5kIG1hbiBwYWdlIHR5cG8uCisgIEFkZCBjb25maWd1cmUgLS13aXRoLWRtZGlyIHRvIGNvbXBpbGUgYWdhaW5zdCBhIGRldmljZS1tYXBwZXIgc291cmNlIHRyZWUuCisgIFVzZSBubyBmbHVzaCBzdXNwZW5kaW5nIGZvciBtaXJyb3JzLgorICBBZGQgZG1ldmVudGRfbWlycm9yIHJlZ2lzdGVyX211dGV4LCB0aWR5IGluaXRpYWxpc2F0aW9uICYgYWRkIG1lbWxvY2suCisgIEZpeCBjcmVhdGUgbWlycm9yIHdpdGggbmFtZSBsb25nZXIgdGhhbiAyMiBjaGFycy4KKyAgRml4IHNvbWUgYWN0aXZhdGUuYyBwcm90b3R5cGVzIHdoZW4gY29tcGlsZWQgd2l0aG91dCBkZXZtYXBwZXIuCisgIEZpeCBkbWV2ZW50ZCBtaXJyb3IgdG8gY29wZSBpZiBtb25pdG9yZWQgZGV2aWNlIGRpc2FwcGVhcnMuCisKK1ZlcnNpb24gMi4wMi4xNyAtIDE0dGggRGVjZW1iZXIgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBtaXNzaW5nIHB2cmVtb3ZlIGVycm9yIG1lc3NhZ2Ugd2hlbiBkZXZpY2UgZG9lc24ndCBleGlzdC4KKyAgV2hlbiBsdmNvbnZlcnQgYWxsb2NhdGVzIGEgbWlycm9yIGxvZywgcmVzcGVjdCBwYXJhbGxlbCBhcmVhIGNvbnN0cmFpbnRzLgorICBVc2UgbG9vcCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIG5vdy1vcmRlcmVkIHBvbGljeSBsaXN0IGluIF9hbGxvY2F0ZSgpLgorICBDaGVjayBmb3IgZmFpbHVyZSB0byBhbGxvY2F0ZSBqdXN0IHRoZSBtaXJyb3IgbG9nLgorICBJbnRyb2R1Y2UgY2FsY19hcmVhX211bHRpcGxlKCkuCisgIFN1cHBvcnQgbWlycm9yIGxvZyBhbGxvY2F0aW9uIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgUFY6IGFyZWFfY291bnQgbm93IDAuCisgIEZpeCBkZXRlY3Rpb24gb2Ygc21hbGxlc3QgYXJlYSBpbiBfYWxsb2NfcGFyYWxsZWxfYXJlYSgpIGZvciBjbGluZyBwb2xpY3kuCisgIEFkZCBtYW5wYWdlIGVudHJ5IGZvciBjbHZtZCAtVAorICBGaXggZ3VsbSBvcGVyYXRpb24gb2YgY2x2bWQsIGluY2x1ZGluZyBhIGhhbmcgd2hlbiBkb2luZyBsdmNoYW5nZSAtYWV5CisgIEZpeCBoYW5nIGluIGNsdm1kIGlmIGEgcHJlLWNvbW1hbmQgZmFpbGVkLgorCitWZXJzaW9uIDIuMDIuMTYgLSAxc3QgRGVjZW1iZXIgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IFZHIGNsdXN0ZXJlZCByZWFkIGxvY2tzIHRvIHVzZSBQUiBub3QgQ1IuCisgIEFkanVzdCBzb21lIGFsaWdubWVudHMgZm9yIGlhNjQvc3BhcmMuCisgIEZpeCBtaXJyb3Igc2VnbWVudCByZW1vdmFsIHRvIHVzZSB0ZW1wb3JhcnkgZXJyb3Igc2VnbWVudC4KKyAgQWx3YXlzIGNvbXBpbGUgZGVidWcgbG9nZ2luZyBpbnRvIGNsdm1kLgorICBBZGQgc3RhcnR1cCB0aW1lb3V0IHRvIFJIRUw0IGNsdm1kIHN0YXJ0dXAgc2NyaXB0LgorICBBZGQgLVQgKHN0YXJ0dXAgdGltZW91dCkgc3dpdGNoIHRvIGNsdm1kLgorICBJbXByb3ZlIGx2bV9kdW1wLnNoIHJvYnVzdG5lc3MuCisgIFVwZGF0ZSBsdm0yY3JlYXRlX2luaXRyZCB0byBzdXBwb3J0IGdlbnRvby4KKworVmVyc2lvbiAyLjAyLjE1IC0gMjFzdCBOb3ZlbWJlciAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGNsdm1kX2luaXRfcmhlbDQgbGluZSB0cnVuY2F0aW9uICgyLjAyLjE0KS4KKyAgSW5zdGFsbCBsdm1kdW1wIGJ5IGRlZmF1bHQuCisgIEZpeCBjaGVjayBmb3Igc25hcHNob3QgbW9kdWxlIHdoZW4gYWN0aXZhdGluZyBzbmFwc2hvdC4KKyAgRml4IHB2cmVtb3ZlIGVycm9yIHBhdGggZm9yIGNhc2Ugd2hlbiBQViBpcyBpbiB1c2UuCisgIFdhcm4gaWYgY2VydGFpbiBkdXBsaWNhdGUgY29uZmlnIGZpbGUgZW50cmllcyBhcmUgc2Vlbi4KKyAgRW5oYW5jZSBsdm1fZHVtcC5zaCBmb3Igc3lzcmVwb3J0IGludGVncmF0aW9uIGFuZCBhZGQgbWFuIHBhZ2UuCisgIEZpeCAtLWF1dG9iYWNrdXAgYXJndW1lbnQgd2hpY2ggY291bGQgbmV2ZXIgZGlzYWJsZSBiYWNrdXBzLgorICBGaXggYSBsYWJlbF92ZXJpZnkgZXJyb3IgcGF0aC4KKworVmVyc2lvbiAyLjAyLjE0IC0gMTB0aCBOb3ZlbWJlciAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGFkanVzdGVkX21pcnJvcl9yZWdpb25fc2l6ZSgpIHRvIGhhbmRsZSA2NC1iaXQgc2l6ZS4KKyAgQWRkIHNvbWUgbWlzc2luZyBib3VuZHMgY2hlY2tzIG9uIDMyLWJpdCBleHRlbnQgY291bnRlcnMuCisgIEFkZCBQZXRhYnl0ZSBhbmQgRXhhYnl0ZSBzdXBwb3J0LgorICBGaXggbHZjcmVhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIDAgZXh0ZW50cyByZXF1ZXN0ZWQuCisgIGx2cmVtb3ZlIG1hbiBwYWdlOiB2b2x1bWVzIG11c3QgYmUgY2x1c3RlciBpbmFjdGl2ZSBiZWZvcmUgYmVpbmcgcmVtb3ZlZC4KKyAgUHJvdGVjdCAuY2FjaGUgbWFuaXB1bGF0aW9ucyB3aXRoIGZjbnRsIGxvY2tpbmcuCisgIENoYW5nZSAuY2FjaGUgdGltZXN0YW1wIGNvbXBhcmlzb25zIHRvIHVzZSBjdGltZS4KKyAgRml4IG1pcnJvciBsb2cgTFYgd3JpdGluZyB0byBzZXQgYWxsIGJpdHMgaW4gd2hvbGUgTFYuCisgIEZpeCBjbHVzdGVyZWQgVkcgZGV0ZWN0aW9uIGFuZCBkZWZhdWx0IHJ1bmxldmVscyBpbiBjbHZtZF9pbml0X3JoZWw0LgorICBGaXggaGlnaC1sZXZlbCBmcmVlIHNwYWNlIGNoZWNrIGZvciBwYXJ0aWFsIGFsbG9jYXRpb25zLgorCitWZXJzaW9uIDIuMDIuMTMgLSAyN3RoIE9jdG9iZXIgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGNvdXBsZSBvZiBtaXNzaW5nIGZpbGVzIHRvIHRvb2xzL01ha2VmaWxlIENMRUFOX1RBUkdFVFMuCisgIFdoZW4gYWRkaW5nIHNuYXBzaG90IGxlYXZlIGNvdyBMViBtYXBwZWQgZGV2aWNlIGFjdGl2ZSBhZnRlciB6ZXJvaW5nLgorICBGaXggYSBjbHZtZCBkZWJ1ZyBtZXNzYWdlLgorICBBZGQgZGV2X2ZsdXNoKCkgdG8gc2V0X2x2KCkuCisgIEFkZCBsdmNoYW5nZSAtLXJlc3luYy4KKyAgUGVyZm9ybSBoaWdoLWxldmVsIGZyZWUgc3BhY2UgY2hlY2sgYmVmb3JlIGVhY2ggYWxsb2NhdGlvbiBhdHRlbXB0LgorICBEb24ndCBhbGxvdyBhIG5vZGUgdG8gcmVtb3ZlIGFuIExWIHRoYXQncyBleGNsdXNpdmVseSBhY3RpdmUgb24gYW50aGVyIG5vZGUuCisgIENvcGUgaWYgc2FtZSBQViBpcyBpbmNsdWRlZCBtb3JlIHRoYW4gb25jZSBpbiBjbWRsaW5lIFBFIHJhbmdlIGxpc3QuCisgIFNldCBQViBzaXplIHRvIGN1cnJlbnQgZGV2aWNlIHNpemUgaWYgaXQgaXMgZm91bmQgdG8gYmUgemVyby4KKyAgQWRkIHNlZ21lbnQgcGFyYW1ldGVyIHRvIHRhcmdldF9wcmVzZW50IGZ1bmN0aW9ucy4KKworVmVyc2lvbiAyLjAyLjEyIC0gMTZ0aCBPY3RvYmVyIDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBwdmRpc3BsYXkgdG8gdXNlIHZnX3JlYWQoKSBmb3Igbm9uLW9ycGhhbnMuCisgIEZhbGwgYmFjayB0byBpbnRlcm5hbCBsb2NraW5nIGlmIGV4dGVybmFsIGxvY2tpbmcgbGliIGlzIG1pc3Npbmcgb3IgZmFpbHMuCisgIFJldGFpbiBhY3RpdmF0aW9uIHN0YXRlIGFmdGVyIGNoYW5naW5nIExWIG1pbm9yIG51bWJlciB3aXRoIC0tZm9yY2UuCisgIFByb3BhZ2F0ZSBjbHVzdGVyZWQgZmxhZyBpbiB2Z3NwbGl0IGFuZCByZXF1aXJlIHJlc2l6ZWFibGUgZmxhZy4KKworVmVyc2lvbiAyLjAyLjExIC0gMTJ0aCBPY3RvYmVyIDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBjbHZtZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGNsdXN0ZXIgbmFtZS4gbm90IHVzZWQgYnkgTFZNIHlldC4KKyAgQWRkIGNsaW5nIGFsbG9jYXRpb24gcG9saWN5LgorICBDaGFuZ2UgX2NoZWNrX2NvbnRpZ3VvdXMoKSB0byB1c2UgX2Zvcl9lYWNoX3B2KCkuCisgIEV4dGVuZCBfZm9yX2VhY2hfcHYoKSB0byBhbGxvdyB0ZXJtaW5hdGlvbiB3aXRob3V0IGVycm9yLgorICBBYnN0cmFjdCBfaXNfY29udGlndW91cygpLgorICBSZW1vdmUgZHVwbGljYXRlZCBwdiBhcmcgZnJvbSBfY2hlY2tfY29udGlndW91cygpLgorICBBY2NlcHQgcmVnaW9uc2l6ZSB3aXRoIGx2Y29udmVydC4KKyAgQWRkIHJlcG9ydCBjb2x1bW5zIHdpdGggdW5kZXJzY29yZSBiZWZvcmUgZmllbGQgbmFtZXMgZW5kaW5nICdzaXplJy4KKyAgQ29ycmVjdCByZWdpb25zaXplIGRlZmF1bHQgb24gbHZjcmVhdGUgbWFuIHBhZ2UgKE1CKS4KKyAgRml4IGNsdm1kIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIGRpZSB3aGVuIGEgbm9kZSB3aXRoIGEgbG9uZyBuYW1lIGNyYXNoZWQuCisgIEFkZCBkZXZpY2Ugc2l6ZSB0byB0ZXh0IG1ldGFkYXRhLgorICBGaXggZm9ybWF0X3RleHQgbWRhX3NldHVwIHB2LT5zaXplIGFuZCBwdl9zZXR1cCBwZV9jb3VudCBjYWxjdWxhdGlvbnMuCisgIEZpeCBfZm9yX2VhY2hfcHYoKSBmb3IgbWlycm9yIHdpdGggY29yZSBsb2cuCisgIEFkZCBsdm1fZHVtcC5zaCBzY3JpcHQgdG8gY3JlYXRlIGEgdGFyYmFsbCBvZiBkZWJ1Z2dpbmcgaW5mbyBmcm9tIGEgc3lzdGVtLgorICBDYXB0dXJlIGVycm9yIG1lc3NhZ2VzIGluIGNsdm1kIGFuZCBwYXNzIHRoZW0gYmFjayB0byB0aGUgdXNlci4KKyAgUmVtb3ZlIHVudXNlZCAjZGVmaW5lcyBmcm9tIGZpbHRlci1tZC5jLgorICBNYWtlIGNsdm1kIHJlc3RhcnQgaW5pdCBzY3JpcHQgd2FpdCB1bnRpbCBjbHZtZCBoYXMgZGllZCBiZWZvcmUgc3RhcnRpbmcgaXQuCisgIEFkZCAtUiB0byBjbHZtZCB3aGljaCB0ZWxscyBydW5uaW5nIGNsdm1kcyB0byByZWxvYWQgdGhlaXIgZGV2aWNlIGNhY2hlLgorICBBZGQgTFYgY29sdW1uIHRvIHJlcG9ydHMgbGlzdGluZyBrZXJuZWwgbW9kdWxlcyBuZWVkZWQgZm9yIGFjdGl2YXRpb24uCisgIFNob3cgYXZhaWxhYmxlIGZpZWxkcyBpZiByZXBvcnQgZ2l2ZW4gaW52YWxpZCBmaWVsZC4gKGUuZy4gbHZzIC1vIGxpc3QpCisgIEFkZCB0aW1lc3RhbXAgZnVuY3Rpb25zIHdpdGggLS1kaXNhYmxlLXJlYWx0aW1lIGNvbmZpZ3VyZSBvcHRpb24uCisgIEFkZCAlVkcsICVMViBhbmQgJUZSRUUgc3VmZmljZXMgdG8gbHZjcmVhdGUvbHZyZXNpemUgLS1leHRlbnRzIGFyZy4KKyAgRml4IHR3byBwb3RlbnRpYWwgTlVMTCBwb2ludGVyIGRlcmVmcyBpbiBlcnJvciBjYXNlcyBpbiB2Z19yZWFkKCkuCisgIFNlcGFyYXRlIC0tZW5hYmxlLWNsdXN0ZXIgZnJvbSBsb2NraW5nIGxpYiBvcHRpb25zIGluIGx2bWNvbmYuc2guCisgIEFkZCBhIG1pc3NpbmcgY29tbWEgaW4gbHZjcmVhdGUgbWFuIHBhZ2UuCisKK1ZlcnNpb24gMi4wMi4xMCAtIDE5dGggU2VwdGVtYmVyIDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGx2Y29udmVydCBtaXJyb3IgY2hhbmdlIGNhc2UgZGV0ZWN0aW9uIGxvZ2ljLgorICBGaXggbWlycm9yIGxvZyBkZXRhY2htZW50IHNvIGl0IGNvcnJlY3RseSBiZWNvbWVzIGEgc3RhbmRhbG9uZSBMVi4KKyAgRXh0ZW5kIF9jaGVja19jb250aWd1b3VzKCkgdG8gZGV0ZWN0IHNpbmdsZS1hcmVhIExWcy4KKyAgSW5jbHVkZSBtaXJyb3IgbG9nICh1bnRlc3RlZCkgaW4gX2Zvcl9lYWNoX3B2KCkgcHJvY2Vzc2luZy4KKyAgVXNlIE1JUlJPUl9MT0dfU0laRSBjb25zdGFudC4KKyAgUmVtb3ZlIHN0cnVjdCBzZWdfcHZzIGZyb20gX2Zvcl9lYWNoX3B2KCkgdG8gZ2VuZXJhbGlzZS4KKyAgQXZvaWQgYWRkaW5nIGR1cGxpY2F0ZXMgdG8gbGlzdCBvZiBwYXJhbGxlbCBQVnMgdG8gYXZvaWQuCisgIEZpeCBzZXZlcmFsIGluY29ycmVjdCBjb21wYXJpc29ucyBpbiBwYXJhbGxlbCBhcmVhIGF2b2lkYW5jZSBjb2RlLgorICBGaXggc2VnbWVudCBsZW5ndGhzIHdoZW4gZmxhdHRlbmluZyBleGlzdGluZyBwYXJhbGxlbCBhcmVhcy4KKyAgTG9nIGV4aXN0aW5nIHBhcmFsbGVsIGFyZWFzIHByaW9yIHRvIGFsbG9jYXRpb24uCisgIEZpeCBtaXJyb3IgbG9nIGNyZWF0aW9uIHdoZW4gYWN0aXZhdGlvbiBkaXNhYmxlZC4KKyAgRG9uJ3QgYXR0ZW1wdCBhdXRvbWF0aWMgcmVjb3Zlcnkgd2l0aG91dCBwcm9wZXIgbG9ja2luZy4KKyAgV2hlbiB1c2luZyBsb2NhbCBmaWxlIGxvY2tpbmcsIHNraXAgY2x1c3RlcmVkIFZHcy4KKyAgQWRkIGZhbGxiYWNrX3RvX2NsdXN0ZXJlZF9sb2NraW5nIGFuZCBmYWxsYmFja190b19sb2NhbF9sb2NraW5nIHBhcmFtZXRlcnMuCisgIGx2bS5zdGF0aWMgdXNlcyBidWlsdC1pbiBjbHVzdGVyIGxvY2tpbmcgaW5zdGVhZCBvZiBleHRlcm5hbCBsb2NraW5nLgorICBEb24ndCBhdHRlbXB0IHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyBpZiBidWlsdCBzdGF0aWNhbGx5LgorICBDaGFuZ2UgZGVmYXVsdCBsb2NraW5nX2xpYiB0byBsaWJsdm0yY2x1c3RlcmxvY2suc28uCisgIEFkZCBza2lwX2Rldl9kaXIoKSB0byBwcm9jZXNzIGNvbW1hbmQgbGluZSBWR3MuCisgIFN0b3AgY2x2bWQgY29tcGxhaW5pbmcgYWJvdXQgbm9kZXMgdGhhdCBoYXZlIGxlZnQgdGhlIGNsdXN0ZXIuCisgIE1vdmUgbHZtX3NucHJpbnRmKCksIHNwbGl0X3dvcmRzKCkgYW5kIHNwbGl0X2RtX25hbWUoKSBpbnRvIGxpYmRldm1hcHBlci4KKyAgQWRkIGx2Y29udmVydCBtYW4gcGFnZS4KKyAgQWRkIG1pcnJvciBvcHRpb25zIHRvIG1hbiBwYWdlcy4KKyAgUHJldmVudCBtaXJyb3IgcmVuYW1lcy4KKyAgTW92ZSBDTURMSUIgY29kZSBpbnRvIHNlcGFyYXRlIGZpbGUgYW5kIHJlY29yZCB3aGV0aGVyIHN0YXRpYyBidWlsZC4KKworVmVyc2lvbiAyLjAyLjA5IC0gMTd0aCBBdWd1c3QgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggUEVfQUxJR04gZm9yIHBhZ2VzaXplIG92ZXIgMzJLQi4KKyAgU2VwYXJhdGUgb3V0IExWTTFfUEVfQUxJR04gYW5kIHBlX2FsaWduKCkuCisgIEFkZCBsdm1fZ2V0cGFnZXNpemUgd3JhcHBlci4KKyAgQWRkIC0tbWF4cGh5c2ljYWx2b2x1bWVzIHRvIHZnY2hhbmdlLgorCitWZXJzaW9uIDIuMDIuMDggLSAxNXRoIEF1Z3VzdCAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBjaGVja3MgZm9yIGR1cGxpY2F0ZSBMViBuYW1lLCBsdmlkIGFuZCBQViBpZCBiZWZvcmUgd3JpdGluZyBtZXRhZGF0YS4KKyAgUmVwb3J0IGFsbCBzYW5pdHkgY2hlY2sgZmFpbHVyZXMsIG5vdCBqdXN0IHRoZSBmaXJzdC4KKyAgRml4IG1pc3NpbmcgbG9ja2ZzIG9uIGZpcnN0IHNuYXBzaG90IGNyZWF0aW9uLgorICBBZGQgdW5yZWxpYWJsZSAtLXRydXN0Y2FjaGUgb3B0aW9uIHRvIHJlcG9ydGluZyBjb21tYW5kcy4KKyAgRml4IGxvY2tpbmcgZm9yIG1pbWFnZSByZW1vdmFsLgorICBGaXggY2x2bWRfaW5pdF9yaGVsNCAnc3RhdHVzJyBleGl0IGNvZGUuCisKK1ZlcnNpb24gMi4wMi4wNyAtIDE3dGggSnVseSAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggYWN0aXZhdGlvbiBsb2dpYyBpbiBsdmNoYW5nZSAtLXBlcnNpc3RlbnQuCisgIERvbid0IGlnbm9yZSBwZXJzaXN0ZW50IG1pbm9yIG51bWJlcnMgd2hlbiBhY3RpdmF0aW5nLgorICBVc2UgUlRMRF9HTE9CQUwgd2hlbiBsb2FkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCisgIEFkZCBzb21lIGZvcmdvdHRlbiBtZW1sb2NrIGNoZWNrcyB0byBfdmdfcmVhZCB0byBwcm90ZWN0IGFnYWluc3QgZnVsbCBzY2Fucy4KKyAgQWRkIG11dGV4IHRvIGRtZXZlbnRkX21pcnJvciB0byBhdm9pZCBjb25jdXJyZW50IGV4ZWN1dGlvbi4KKyAgRml4IHZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyB0byByZXR1cm4gc3VjY2VzcyBpZiBWRyBpcyBhbHJlYWR5IGNvbnNpc3RlbnQuCisgIEZpeCByZXR1cm4gY29kZSBpZiBWRyBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lIGlzIG5vdCBmb3VuZC4KKyAgRml4IFBWIHRvb2xzIHRvIGluY2x1ZGUgb3JwaGFuZWQgUFZzIGluIGRlZmF1bHQgb3V0cHV0IGFnYWluLgorICBGaXhlZCB1bmFsaWduZWQgYWNjZXNzIHdoZW4gdXNpbmcgY2x2bS4KKyAgRml4IGFuIGV4dHJhIGRldl9jbG9zZSBpbiBhIGxhYmVsX3JlYWQgZXJyb3IgcGF0aC4KKyAgQXBwZW5kIHBhdGNoZXMgdG8gY29tbWl0IGVtYWlscy4KKyAgRml4IHRhcmdldF9yZWdpc3Rlcl9ldmVudHMgYXJncy4KKyAgUHJldmVudCBzbmFwc2hvdHMgb2YgbWlycm9ycy4KKyAgQWRkIERJU1RDTEVBTl9UQVJHRVRTIHRvIG1ha2UgdGVtcGxhdGUgZm9yIGNvbmZpZ3VyZS5oLgorICBNb3JlIGZpeGVzIHRvIGVycm9yIHBhdGhzLgorICBGaXggbHZjcmVhdGUgY29yZWxvZyB2YWxpZGF0aW9uLgorICBBZGQgLS1jb25maWcgZm9yIG92ZXJyaWRpbmcgbW9zdCBjb25maWcgZmlsZSBzZXR0aW5ncyBmcm9tIGNtZGxpbmUuCisgIFF1b3RlIGFyZ3VtZW50cyB3aGVuIHByaW50aW5nIGNvbW1hbmQgbGluZS4KKyAgUmVtb3ZlIGxpbmVmZWVkIGZyb20gJ2luaXRpYWxpc2luZyBsb2dnaW5nJyBtZXNzYWdlLgorICBBZGQgJ0NvbXBsZXRlZCcgZGVidWcgbWVzc2FnZS4KKyAgRG9uJ3QgYXR0ZW1wdCBsaWJyYXJ5IGV4aXQgYWZ0ZXIgcmVsb2FkaW5nIGNvbmZpZyBmaWxlcy4KKyAgQWx3YXlzIGNvbXBpbGUgd2l0aCBsaWJkZXZtYXBwZXIsIGV2ZW4gaWYgZGV2aWNlLW1hcHBlciBpcyBkaXNhYmxlZC4KKworVmVyc2lvbiAyLjAyLjA2IC0gMTJ0aCBNYXkgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQcm9wYWdhdGUgLS1tb25pdG9yIGFyb3VuZCBjbHVzdGVyLgorICBBZGQgLS1tb25pdG9yIHRvIHZnY3JlYXRlIGFuZCBsdmNyZWF0ZSB0byBjb250cm9sIGRtZXZlbnRkIHJlZ2lzdHJhdGlvbi4KKyAgRmlsdGVyIExDS19OT05CTE9DSyBpbiBjbHZtZCBsb2NrX3ZnLgorICBBZGQgLS1ub3N5bmMgdG8gbHZjcmVhdGUgd2l0aCBMViBmbGFnIE5PVFNZTkNFRC4KKyAgVXNlIG1pcnJvcidzIHV1aWQgZm9yIGEgY29yZSBsb2cuCisgIEFkZCBtaXJyb3IgbG9nIGZhdWx0LWhhbmRsaW5nIHBvbGljeS4KKyAgSW1wcm92ZSBtaXJyb3Igd2FybmluZyBtZXNzYWdlcyBhbmQgdGlkeSBkbWV2ZW50ZCBzeXNsb2cgb3V0cHV0LgorICBQcm9wYWdhdGUgbm9zeW5jIGZsYWcgYXJvdW5kIGNsdXN0ZXIuCisgIEFsbG93IHZncmVkdWNlIHRvIGhhbmRsZSBtaXJyb3IgbG9nIGZhaWx1cmVzLgorICBBZGQgLS1jb3JlbG9nIHRvIGx2Y3JlYXRlIGFuZCBsdmNvbnZlcnQuCisgIENyZWF0ZSBhIGxvZyBoZWFkZXIgZm9yIHJlcGxhY2VtZW50IGluLXN5bmMgbWlycm9yIGxvZy4KKyAgVXNlIHNldF9sdigpIGFuZCBkZXZfc2V0KCkgdG8gd2lwZSBzZWN0aW9ucyBvZiBkZXZpY2VzLgorICBBZGQgbWlycm9yX2luX3N5bmMoKSBmbGFnIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlc3luYyBvbiBhY3RpdmF0aW9uLgorICBBZGQgbWlycm9yX2xpYnJhcnkgZGVzY3JpcHRpb24gdG8gZXhhbXBsZS5jb25mLgorICBGaXggdXVpZF9mcm9tX251bSgpIGJ1ZmZlciBvdmVycnVuLgorICBNYWtlIFNJWkVfU0hPUlQgdGhlIGRlZmF1bHQgZm9yIGRpc3BsYXlfc2l6ZSgpLgorICBGaXggc29tZSBtZW1vcnkgbGVha3MgaW4gZXJyb3IgcGF0aHMgZm91bmQgYnkgY292ZXJpdHkuCisgIFVzZSBDOTkgc3RydWN0IGluaXRpYWxpc2Vycy4KKyAgTW92ZSBERUZTIGludG8gY29uZmlndXJlLmguCisgIENsZWFuLXVwcyB0byByZW1vdmUgbWlzY2VsbGFuZW91cyBjb21waWxlciB3YXJuaW5ncy4KKyAgSW1wcm92ZSBzdHJpcGUgc2l6ZSB2YWxpZGF0aW9uLgorICBJbmNyZWFzZSBtYXhpbXVtIHN0cmlwZSBzaXplIGxpbWl0IHRvIHBoeXNpY2FsIGV4dGVudCBzaXplIGZvciBsdm0yIG1ldGFkYXRhLgorICBGaXggYWN0aXZhdGlvbiBjb2RlIHRvIGNoZWNrIGZvciBwcmUtZXhpc3RpbmcgbWlycm9yIGxvZ3MuCisgIFRpZ2h0ZW4gcmVnaW9uIHNpemUgdmFsaWRhdGlvbi4KKyAgSWdub3JlIGVtcHR5IHN0cmluZ3MgaW4gY29uZmlnIGZpbGVzLgorICBSZXF1aXJlIG5vbi16ZXJvIHJlZ2lvbnNpemUgYW5kIGRvY3VtZW50IHBhcmFtZXRlciBvbiBsdmNyZWF0ZSBtYW4gcGFnZS4KKyAgSW52YWxpZGF0ZSBjYWNoZSBpZiBjb21wb3NpdGlvbiBvZiBWRyBjaGFuZ2VkIGV4dGVybmFsbHkuCisKK1ZlcnNpb24gMi4wMi4wNSAtIDIxc3QgQXByaWwgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCB2Z2lkIHN0cmluZyB0ZXJtaW5hdGlvbiBpbiByZWNlbnQgY2FjaGUgY29kZS4KKworVmVyc2lvbiAyLjAyLjA0IC0gMTl0aCBBcHJpbCAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2hlY2sgZm9yIGxpYnNlcG9sLgorICBBZGQgc29tZSBjZmxvdyAmIHNjb3BlIHN1cHBvcnQuCisgIFNlcGFyYXRlIG91dCBERUZTIGZyb20gQ0ZMQUdTLgorICBSZW1vdmUgaW5saW5lcyBhbmQgdXNlIHVuaXF1ZSBmdW5jdGlvbiBuYW1lcy4KKworVmVyc2lvbiAyLjAyLjAzIC0gMTR0aCBBcHJpbCAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgdmdyZW5hbWUgYWNjZXB0cyB2Z2lkIGFuZCBleHBvcnRlZCBWRy4KKyAgQWRkIC0tcGFydGlhbCB0byBwdnMuCisgIFdoZW4gY2hvb3NpbmcgYmV0d2VlbiBpZGVudGljYWxseS1uYW1lZCBWR3MsIGFsc28gY29uc2lkZXIgY3JlYXRpb25faG9zdC4KKyAgUHJvdmlkZSB0b3RhbCBsb2cgc3VwcHJlc3Npb24gd2l0aCAyLgorICBGaXggdmdleHBvcnQvdmdpbXBvcnQgdG8gc2V0L3Jlc2V0IFBWIGV4cG9ydGVkIGZsYWcgc28gcHZfYXR0ciBpcyBjb3JyZWN0LgorICBBZGQgdmdpZCB0byBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lIGFuZCBwYXNzIHdpdGggdmdfbmFtZSB0byBzb21lIGZ1bmN0aW9ucy4KKyAgSWYgdHdvIG9yIG1vcmUgVkdzIGFyZSBmb3VuZCB3aXRoIHRoZSBzYW1lIG5hbWUsIHVzZSBvbmUgdGhhdCBpcyBub3QgZXhwb3J0ZWQuCisgIFdoZW5ldmVyIHZnbmFtZSBpcyBjYXB0dXJlZCwgYWxzbyBjYXB0dXJlIHZnaWQgYW5kIHdoZXRoZXIgZXhwb3J0ZWQuCisgIFJlbW92ZSBhbiBpbmNvcnJlY3QgdW5sb2NrX3ZnKCkgZnJvbSBwcm9jZXNzX2VhY2hfbHYoKS4KKyAgVXBkYXRlIGV4dGVudCBzaXplIGluZm9ybWF0aW9uIGluIHZnY2hhbmdlIGFuZCB2Z2NyZWF0ZSBtYW4gcGFnZXMuCisgIEludHJvZHVjZSBvcmlnaW5fZnJvbV9jb3coKSBhbmQgbHZfaXNfdmlzaWJsZSgpLgorICBwdnJlbW92ZSB3aXRob3V0IC1mIG5vdyBmYWlscyBpZiB0aGVyZSdzIG5vIFBWIGxhYmVsLgorICBTdXBwb3J0IGx2Y29udmVydCAtcy4KKyAgU3VwcHJlc3MgbG9ja2luZyBsaWJyYXJ5IGxvYWQgZmFpbHVyZSBtZXNzYWdlIGlmIC0taWdub3JlbG9ja2luZ2ZhaWx1cmUuCisgIFByb3BhZ2F0ZSBwYXJ0aWFsIG1vZGUgYXJvdW5kIGNsdXN0ZXIuCisgIEZpeCBhcmNoaXZlIGZpbGUgZXhwaXJhdGlvbi4KKyAgRml4IGRtZXZlbnRkIGJ1aWxkLgorICBjbHZtZCBub3cgdXNlcyBsaWJjbWFuIHJhdGhlciB0aGFuIGNtYW4gaW9jdGxzLgorICBjbHZtZCB3aWxsIGFsbG93IG5ldyBjbWFuIHRvIHNodXRkb3duIG9uIHJlcXVlc3QuCisKK1ZlcnNpb24gMi4wMi4wMiAtIDd0aCBGZWJydWFyeSAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgJS5zbzogJS5hIG1ha2UgdGVtcGxhdGUgcnVsZS4KKyAgU3dpdGNob3ZlciBsaWJyYXJ5IGJ1aWxkaW5nIHRvIHVzZSBMSUJfU1VGRklYLgorICBPbmx5IGRvIGxvY2tmcyBmaWxlc3lzdGVtIHN5bmMgd2hlbiBzdXNwZW5kaW5nIHNuYXBzaG90cy4KKyAgQWx3YXlzIHByaW50IHdhcm5pbmcgaWYgYWN0aXZhdGlvbiBpcyBkaXNhYmxlZC4KKyAgdmdyZWR1Y2UgcmVtb3ZlcyBtaXJyb3IgaW1hZ2VzLgorICBBZGQgLS1taXJyb3Jzb25seSB0byB2Z3JlZHVjZS4KKyAgdmdyZWR1Y2UgcmVwbGFjZXMgYWN0aXZlIExWcyB3aXRoIGVycm9yIHNlZ21lbnQgYmVmb3JlIHJlbW92aW5nIHRoZW0uCisgIFNldCBibG9ja19vbl9lcnJvciBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlLgorICBBZGQgdGFyZ2V0X3ZlcnNpb24uCisgIEFkZCBkZXRhaWxzIHRvIGZvcm1hdDEgJ0ludmFsaWQgTFYgaW4gZXh0ZW50IG1hcCcgZXJyb3IgbWVzc2FnZS4KKyAgRml4IGx2c2NhbiBzbmFwc2hvdCBmdWxsIGRpc3BsYXkuCisgIEJyaW5nIGx2ZGlzcGxheSBtYW4gcGFnZSBleGFtcGxlIGludG8gbGluZS4KKyAgQWRkIG1pcnJvciBkbWV2ZW50ZCBsaWJyYXJ5LgorICBBZGQgc29tZSBhY3RpdmF0aW9uIGxvZ2ljIHRvIHJlbW92ZV9taXJyb3JfaW1hZ2VzKCkuCisgIGx2Y29udmVydCBjYW4gcmVtb3ZlIHNwZWNpZmllZCBQVnMgZnJvbSBhIG1pcnJvci4KKyAgbHZjb252ZXJ0IHR1cm5zIGFuIGV4aXN0aW5nIExWIGludG8gYSBtaXJyb3IuCisgIEFsbG93IHNpZ25lZCBtaXJyb3JzIGFyZ3VtZW50cy4KKyAgTW92ZSBjcmVhdGVfbWlycm9yX2xvZygpIGludG8gdG9vbGxpYi4KKyAgRGV0ZXJtaW5lIHBhcmFsbGVsIFBWcyB0byBhdm9pZCB3aXRoIEFMTE9DX05PUk1BTCBhbGxvY2F0aW9uLgorICBGaXggbHZfZW1wdHkuCisKK1ZlcnNpb24gMi4wMi4wMSAtIDIzcmQgTm92ZW1iZXIgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBsdmRpc3BsYXkgY21kbGluZSB0byBhY2NlcHQgc25hcHNob3RzLgorICBGaXggb3BlbiBSTy0+UlcgcHJvbW90aW9uLgorICBGaXggbWlzc2luZyB2Z19yZXZlcnQgaW4gbHZjcmVhdGUgZXJyb3IgcGF0aC4KKworVmVyc2lvbiAyLjAyLjAwIC0gMTB0aCBOb3ZlbWJlciAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRXh0ZW5kIGFsbG9jYXRpb24gYXJlYXMgdG8gYXZvaWQgb3ZlcmZsb3cgd2l0aCBjb250aWd1b3VzIHdpdGggb3RoZXIgUFZzLgorICBTdG9wIGx2Y3JlYXRlIGF0dGVtcHRpbmcgdG8gd2lwZSB6ZXJvIG9yIGVycm9yIHNlZ21lbnRzLgorICBBZGRlZCBuZXcgbHZzIHRhYmxlIGF0dHJpYnV0ZXMuCisgIFNlcGFyYXRlZCBvdXQgYWN0aXZhdGlvbiBwcmVsb2FkLgorICBNb3ZlZCBhY3RpdmF0aW9uIGZ1bmN0aW9ucyBpbnRvIGxpYmRldm1hcHBlci4KKyAgRml4ZWQgYnVpbGRfZG1fbmFtZS4KKyAgQWRkIHJldHVybiBtYWNyb3MuCisgIEFkZGVkIHhlbiB4dmQgZGV2aWNlcy4KKyAgQ2xlYXIgdXAgcHJlY29tbWl0dGVkIG1ldGFkYXRhIGJldHRlci4KKyAgQSBwdnJlc2l6ZSBpbXBsZW1lbnRhdGlvbi4KKyAgRml4IGNvbnRpZ3VvdXMgYWxsb2NhdGlvbiB3aGVuIHRoZXJlIGFyZSBubyBwcmVjZWRpbmcgc2VnbWVudHMuCisgIEFkZCBtaXJyb3Jfc2VnIHBvaW50ZXIgdG8gbHZfc2VnbWVudCBzdHJ1Y3QuCisgIE9ubHkga2VlcCBhIGRldmljZSBvcGVuIGlmIGl0J3Mga25vd24gdG8gYmVsb25nIHRvIGEgbG9ja2VkIFZHLgorICBGaXggbHZkaXNwbGF5IHRvIHNob3cgYWxsIG1pcnJvciBkZXN0aW5hdGlvbnMuCisgIFJlcGxhY2VtZW50IHN1c3BlbmQgY29kZSB1c2luZyBsaWJkZXZtYXBwZXIgZGVwZW5kZW5jeSB0cmVlLgorICBBZGQgREVGUyB0byBtYWtlLnRtcGwuCisgIFVzZSBkbV9pc19kbV9tYWpvciBpbnN0ZWFkIG9mIGxvY2FsIGNvcHkuCisgIEFsbG93IG1hcHBlZCBkZXZpY2VzIHRvIGJlIHVzZWQgYXMgUFZzLgorICBNb3ZlIHNldF9zZWxpbnV4X2NvbnRleHQgaW50byBsaWJkZXZtYXBwZXIuCisgIEZpeCBhdXRvbWF0aWMgdGV4dCBtZXRhZGF0YSBidWZmZXIgZXhwYW5zaW9uICh1c2luZyBtYWNybykuCisgIENhY2hlIGZvcm1hdHRlZCB0ZXh0IG1ldGFkYXRhIGJ1ZmZlciBiZXR3ZWVuIG1ldGFkYXRhIGFyZWEgd3JpdGVzLgorICBBZGQgcGVfc3RhcnQgZmllbGQgdG8gcHZzLgorICBBZGQgJ0xWTS0nIHByZWZpeCB0byB1dWlkcy4KKyAgU3BsaXQgbHZfc2VnbWVudF9hcmVhIGZyb20gbHZfc2VnbWVudCB0byBwZXJtaXQgZXh0ZW5zaW9uLgorICBSZXBsYWNlbWVudCBkZWFjdGl2YXRpb24gY29kZSB1c2luZyBsaWJkZXZtYXBwZXIgZGVwZW5kZW5jeSB0cmVlLgorICBTaW1wbGlmeSBkZXZfbWFuYWdlcl9pbmZvKCkuCisgIEF0dGVtcHQgdG8gbG9hZCBtaXNzaW5nIHRhcmdldHMgdXNpbmcgbW9kcHJvYmUuCisgIEFkZCAtYSB0byBsdnNjYW4uCisgIE1vdmUgbWtub2RlcyBpbnRvIGxpYmRldm1hcHBlci4KKyAgTW92ZSBiaXRzZXQsIGhhc2gsIHBvb2wgYW5kIGRiZ19tYWxsb2MgaW50byBsaWJkZXZtYXBwZXIuCisKK1ZlcnNpb24gMi4wMS4xNSAtIDE2dGggT2N0b2JlciAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZWZ1c2UgdG8gcnVuIHB2Y3JlYXRlL3B2cmVtb3ZlIG9uIGRldmljZXMgd2UgY2FuJ3Qgb3BlbiBleGNsdXNpdmVseS4KKyAgVXNlIE9SUEhBTiBsb2NrIGRlZmluaXRpb24gdGhyb3VnaG91dC4KKyAgVmFsaWRhdGUgY2h1bmtzaXplIGluIGx2Y3JlYXRlLgorICBSZWR1Y2UgY2h1bmtzaXplIGxpbWl0IHRvIDUxMmsuCisgIEZpeCBjaHVua3NpemUgZmllbGQgaW4gcmVwb3J0cy4KKyAgRG9uJ3QgaGlkZSBzbmFwc2hvdHMgZnJvbSBkZWZhdWx0ICdsdnMnIG91dHB1dC4KKyAgQWRkIGlzX2RtX21ham9yKCkgZm9yIHVzZSBpbiBkdXBsaWNhdGUgZGV2aWNlIGRldGVjdGlvbiBpbiBsdm1jYWNoZV9hZGQoKS4KKyAgUmVhbGx5IHN3aXRjaCBkZXZpY2UgbnVtYmVyIGluIGx2bWNhY2hlIHdoZW4gaXQgc2F5cyBpdCBpcyBkb2luZyBzby4KKyAgT3B0aW9uIGZvciBiaXRzZXQgbWVtb3J5IGFsbG9jYXRpb24gdXNpbmcgbWFsbG9jIGFzIHdlbGwgYXMgcG9vbC4KKyAgRG9uJ3QgYXNzdW1lIGV4YWN0bHkgdHdvIG1pcnJvcnMgd2hlbiBwYXJzaW5nIG1pcnJvciBzdGF0dXMuCisgIFN1cHByZXNzIGZzeW5jKCkgZXJyb3IgbWVzc2FnZSBvbiBmaWxlc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQuCisgIEZpeCB5ZXNfbm9fcHJvbXB0KCkgZXJyb3IgaGFuZGxpbmcuCisgIEFkZCBsdm0uY29uZiBjb21tZW50IHdhcm5pbmcgYWdhaW5zdCBtdWx0aXBsZSBmaWx0ZXIgbGluZXMuCisgIFRpZHkgbHZtY29uZi5zaC4KKyAgQWRkIGZvcm1hdDEgZGV2X3dyaXRlIGRlYnVnIG1lc3NhZ2VzLgorICBBZGQgY2x1c3RlcmVkIFZHIGF0dHJpYnV0ZSB0byByZXBvcnQuCisgIE1vdmUgbHZjb252ZXJ0IHBhcmFtZXRlcnMgaW50byBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcy4KKyAgQWRkIGNsdXN0ZXJlZCBWRyBmbGFnIHRvIExWIGxvY2sgcmVxdWVzdHMuCisgIENoYW5nZSBMViBsb2NraW5nIG1hY3JvcyB0byB0YWtlIGx2IGluc3RlYWQgb2YgbHZpZC4KKyAgUHJlcGVuZCAnY2x1c3RlcicgYWN0aXZhdGlvbiBwYXJhbWV0ZXIgdG8gbWlycm9yIGxvZyB3aGVuIGFwcHJvcHJpYXRlLgorICBQYXNzIGV4Y2x1c2l2ZSBmbGFnIHRvIGx2X2FjdGl2YXRlIGFuZCBvbiB0byB0YXJnZXQgYWN0aXZhdGlvbiBjb2RlLgorICBQcmV2ZW50IHNuYXBzaG90IGNyZWF0aW9uIGluIGEgY2x1c3RlcmVkIFZHIGZvciBub3cuCisgIEZhY3RvciBvdXQgYWRqdXN0ZWRfbWlycm9yX3JlZ2lvbl9zaXplKCkgYW5kIGdlbmVyYXRlX2xvZ19uYW1lX2Zvcm1hdCgpLgorICBNb3ZlIGNvbXBvc2VfbG9nX2xpbmUoKSBpbnRvIG1pcnJvciBkaXJlY3RvcnkuCisgIEZhY3RvciBvdXQgX2dldF9saWJyYXJ5X3BhdGgoKS4KKyAgRG9uJ3Qga2lsbCBpZGxpbmcgY2x2bWQgdGhyZWFkcy4KKyAgY2x2bWQgbm8gbG9uZ2VyIHRha2VzIG91dCBsb2NrcyBmb3Igbm9uLWNsdXN0ZXJlZCBMVnMuCisgIFJlY29nbmlzZSBBVEEgb3ZlciBFdGhlcm5ldCAoYW9lKSBkZXZpY2VzLgorCitWZXJzaW9uIDIuMDEuMTQgLSA0dGggQXVndXN0IDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggbHZjb252ZXJ0IFBWIHBhcmFtZXRlciBpbiBoZWxwIHN0cmluZy4KKyAgUHJldmVudCBzbmFwc2hvdHMgZ2V0dGluZyBhY3RpdmF0ZWQgaW4gYSBjbHVzdGVyZWQgVkcuCisgIFNlcGFyYXRlIG91dCBfYnVpbGRfZGV2X3N0cmluZy4KKyAgTW92ZSB6ZXJvX2x2IHRvIHRvb2xsaWIuCisgIEZpeCBwb29sIGZvcm1hdCBoYW5kbGVyIHRvIHdvcmsgd2l0aCBwdiBzZWdtZW50IGNvZGUuCisKK1ZlcnNpb24gMi4wMS4xMyAtIDEzdGggSnVseSAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggcHZtb3ZlIHNlZ21lbnQgc3BsaXR0aW5nLgorICBBYnN0cmFjdCB2Z192YWxpZGF0ZS4KKyAgT25seSBtYWtlIG9uZSBhdHRlbXB0IGF0IGNvbnRpZ3VvdXMgYWxsb2NhdGlvbi4KKyAgRml4IGx2bTEgZm9ybWF0IG1ldGFkYXRhIHJlYWQuCisgIEZpeCBsdm0xIGZvcm1hdCBub24tbWlycm9yIGx2Y3JlYXRlLgorCitWZXJzaW9uIDIuMDEuMTIgLSAxNHRoIEp1bmUgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVmFyaW91cyBhbGxvY2F0aW9uLXJlbGF0ZWQgcHZtb3ZlIGZpeGVzLgorICBMb2cgYW4gZXJyb3IgaWYgY2x2bWQgY2FuJ3QgcmVzb2x2ZSBhIGhvc3QgbmFtZSBnb3QgZnJvbSBDQ1MuCisgIEZpeCBwb3RlbnRpYWwgc3BpbiBsb29wIGluIGNsdm1kLgorCitWZXJzaW9uIDIuMDEuMTEgLSAxM3RoIEp1bmUgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkZWQgbHZtY29uZi5zaC4KKyAgVXNlIG1hdGNocGF0aGNvbiBtb2RlIHBhcmFtZXRlci4KKyAgRG9uJ3QgZGVmZXIgY2xvc2luZyBkZWFkIEZEcyBpbiBjbHZtZC4KKyAgUmVtb3ZlIGhhcmQtY29kZWQgNjRrIHRleHQgbWV0YWRhdGEgd3JpdGluZyByZXN0cmljdGlvbi4KKyAgTWFrZSBWRyBuYW1lIHJlc3RyaWN0aW9ucyBjb25zaXN0ZW50LgorICBJbnRyb2R1Y2UgbHZjb252ZXJ0LiAgU28gZmFyIG9ubHkgcmVtb3ZlcyBtaXJyb3IgaW1hZ2VzLgorICBBbGxvdyBtaXJyb3IgaW1hZ2VzIHRvIGJlIHJlc2l6ZWQuCisgIEFsbG93IG1pcnJvciBpbWFnZXMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHNlZ21lbnQuCisgIENlbnRyYWxpc2UgcmVzdHJpY3Rpb25zIG9uIExWIG5hbWVzLgorICBBbHdheXMgaW5zZXJ0IGFuIGludGVybWVkaWF0ZSBsYXllciBmb3IgbWlycm9ycy4KKyAgU3VwcHJlc3MgaGlkZGVuIExWcyBmcm9tIHJlcG9ydHMgdW5sZXNzIC0tYWxsIGlzIGdpdmVuLgorICBVc2Ugc3F1YXJlIGJyYWNrZXRzIGZvciBoaWRkZW4gTFZzIGluIHJlcG9ydHMuCisgIEFsbG93IHRoZSBjcmVhdGlvbiBvZiBtaXJyb3JzIHdpdGggY29udGlndW91cyBleHRlbnRzLgorICBBbHdheXMgcGVyZm9ybSBzYW5pdHkgY2hlY2tzIGFnYWluc3QgbWV0YWRhdGEgYmVmb3JlIGNvbW1pdHRpbmcgaXQgdG8gZGlzay4KKyAgU3BsaXQgbHZfZXh0ZW5kIGludG8gdHdvIHN0ZXBzOiBjaG9vc2luZyBleHRlbnRzICsgYWxsb2NhdGlvbiB0byBMVihzKS4KKyAgQWRkIG1pcnJvciBsb2cgcmVnaW9uIHNpemUgdG8gbWV0YWRhdGEuCisgIFVzZSBsaXN0X2l0ZXJhdGVfaXRlbXMgdGhyb3VnaG91dCBhbmQgYWRkIGxpc3QqYmFjayBtYWNyb3MuCisgIEludHJvZHVjZSBzZWdfIG1hY3JvcyB0byBhY2Nlc3MgYXJlYXMuCisgIEFkZCBzZWd0eXBlX2lzXyBtYWNyb3MuCisgIFN1cHBvcnQgdGlueSBtZXRhZGF0YSBhcmVhcyBmb3IgcG9vbCBjb252ZXJzaW9ucy4KKyAgTWlycm9yIGFjdGl2YXRpb24gaGFuZGxlcyBkaXNrIGxvZyBhcyB3ZWxsIGFzIGNvcmUuCisgIEFjdGl2YXRpb24gY29kZSByZWNvZ25pc2VzIG1pcnJvciBsb2cgZGVwZW5kZW5jeS4KKyAgQWRkIG1pcnJvcl9sb2cgYW5kIHJlZ2lvbnNpemUgZmllbGRzIHRvIHJlcG9ydC4KKyAgRml4IG5vbi1vcnBoYW4gcHZjaGFuZ2UgLXUuCisgIEZpeCB2Z21lcmdlIHRvIGhhbmRsZSBkdXBsaWNhdGUgTFZJRHMuCisgIE1vdmUgYXJjaGl2ZXIgY29kZSBmcm9tIHRvb2xzIGludG8gbGlicmFyeS4KKyAgdmdzY2FuL2NoYW5nZS9kaXNwbGF5L3ZncyBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBtZXRhZGF0YSBiYWNrdXBzIGlmIG5lZWRlZC4KKyAgTWVyZ2UgY2xvbmVkIGFsbG9jYXRpb24gZnVuY3Rpb25zLgorICBGaXggY29udGlndW91cyBhbGxvY2F0aW9uIHBvbGljeSB3aXRoIGxpbmVhci4KKyAgQ29wZSB3aXRoIG1pc3NpbmcgZm9ybWF0MSBQVnMgYWdhaW4uCisgIFJlbW92ZSBsaXN0cyBvZiBmcmVlIFBWIHNlZ21lbnRzLgorICBTaW1wbGlmeSBwdl9tYXBzIGNvZGUgYW5kIHJlbW92ZSBzbG93IGJpdHNldCBhbGdvcml0aG0uCisgIFJlZC1IYXQtaWZ5IHRoZSBjbHZtZCByaGVsNCBpbml0c2NyaXB0LgorICAlWnUtPiV6dQorICBGaXggbG9vcGZpbGVzIGFsaWFzIGFsbG9jICYgbWVtIGRlYnVnZ2luZy4KKyAgVW4taW5saW5lIGRiZ19zdHJkdXAuCisgIGx2X3JlZHVjZSB0aWR5aW5nLgorICBSZW1vdmUgc29tZSB1bm5lY2Vzc2FyeSBwYXJhbWV0ZXJzLgorICBJbnRyb2R1Y2Ugc2VnX2lzIG1hY3Jvcy4KKworVmVyc2lvbiAyLjAxLjEwIC0gM3JkIE1heSAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRG9uJ3QgY3JlYXRlIGJhY2t1cCBhbmQgYXJjaGl2ZSBkaXJzIHRpbGwgbmVlZGVkLgorICBSZWluc3RhdGUgZnVsbCBQViBzaXplIHdoZW4gcmVtb3ZpbmcgZnJvbSBWRy4KKyAgU3VwcG9ydCBsb29wZmlsZXMgZm9yIHRlc3RpbmcuCisgIFRpZHkgbHZfc2VnbWVudCBpbnRlcmZhY2UuCisgIHB2X3NlZ21lbnQgc3VwcG9ydC4KKyAgdmdjaGFuZ2UgLS1waHlzaWNhbGV4dGVudHNpemUKKyAgSW50ZXJuYWwgc25hcHNob3QgcmVzdHJ1Y3R1cmluZy4KKyAgUmVtb3ZlIHVudXNlZCBpbnRlcm5hbCBub24tcGVyc2lzdGVudCBzbmFwc2hvdCBvcHRpb24uCisgIEFsbG93IG9mZmxpbmUgZXh0ZW5zaW9uIG9mIHNuYXBzaG90IHZvbHVtZXMuCisgIE1vdmUgZnJvbSAyLXN0ZXAgdG8gMy1zdGVwIG9uLWRpc2sgbWV0YWRhdGEgY29tbWl0LgorICBTY2FuIHJhbWRpc2tzIHRvbyBhbmQgYWxsb3cgbm9uLU9fRElSRUNUIGZhbGxiYWNrLgorICBBbm5vdGF0ZSwgdGlkeSBhbmQgZXh0ZW5kIGxpc3QuaC4KKyAgQWxpZ25tZW50IHRpZHlpbmcuCisgIE1ha2UgY2x2bWQgd29yayBhcm91bmQgc29tZSAiYnVncyIgaW4gZ3VsbSdzIG5vZGUgc3RhdGUgbm90aWZpY2F0aW9ucy4KKyAgVGlkeSBjbHZtZCdzIFNJR0hVUCBoYW5kbGVyCisKK1ZlcnNpb24gMi4wMS4wOSAtIDR0aCBBcHJpbCAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgLS1pZ25vcmVsb2NraW5nZmFpbHVyZSB0byB2Z21rbm9kZXMuCisgIGNsdm1kOiBEb24ndCBhbGxvdyB1c2VyIG9wZXJhdGlvbnMgdG8gc3RhcnQgdW50aWwgdGhlIGx2bSB0aHJlYWQgaXMgZnVsbHkgdXAuCisgIGNsdm1kLWd1bG06IHNldCBLRUVQQUxJVkUgb24gc29ja2V0cy4KKworVmVyc2lvbiAyLjAxLjA4IC0gMjJuZCBNYXJjaCAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGNsdXN0ZXJlZCBhdHRyaWJ1dGUgc28gdmdjaGFuZ2UgY2FuIGlkZW50aWZ5IGNsdXN0ZXJlZCBWR3Mgdy9vIGxvY2tpbmcuCisgIEltcHJvdmUgZGV0ZWN0aW9uIG9mIGV4dGVybmFsIGNoYW5nZXMgYWZmZWN0aW5nIGludGVybmFsIGNhY2hlLgorICBBZGQgJ2FscmVhZHkgaW4gZGV2aWNlIGNhY2hlJyBkZWJ1ZyBtZXNzYWdlLgorICBBZGQgLWEgdG8gcHZkaXNwbGF5IC1DLgorICBBdm9pZCBybWRpciBvcGVuZGlyIGVycm9yIG1lc3NzYWdlcyB3aGVuIGRpciB3YXMgYWxyZWFkeSByZW1vdmVkLgorICBUaWdodGVuIHNpZ25hbCBoYW5kbGVycy4KKyAgQXZvaWQgc29tZSBjb21waWxlciB3YXJuaW5ncy4KKyAgQWRkaXRpb25hbCByZW5hbWUgZmFpbHVyZSBlcnJvciBtZXNzYWdlLgorICByZWFkL3dyaXRlIG1heSBiZSBtYWNyb3MuCisgIGNsdm1kOiBkb24ndCB0YWtlIG91dCBsdm0gdGhyZWFkIGxvY2sgYXQgc3RhcnR1cCwgaXQgb25seSBwcm90ZWN0cyBqb2JzIGxpc3QuCisKK1ZlcnNpb24gMi4wMS4wNyAtIDh0aCBNYXJjaCAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3BlIHdpdGggbmV3IGRldmljZXMgYXBwZWFyaW5nIGJ5IHJlc2Nhbm5pbmcgL2RldiBpZiBhIHV1aWQgY2FuJ3QgYmUgZm91bmQuCisgIFJlbW92ZSBERVNURElSIGZyb20gTFZNX1NIQVJFRF9QQVRILgorICBjbHZtZCBmaXhlczogbWFrZSBGRHMgY2xvc2Utb24tZXhlYworICAgICAgICAgICAgICAgZ3VsbSB1bmxvY2tzIFZHICYgb3JwaGFuIGxvY2tzIGF0IHN0YXJ0dXAgaW4gY2FzZSB0aGV5IGFyZSBzdGFsZQorICAgICAgICAgICAgICAgZ3VsbSBub3cgdW5sb2NrcyBWRyAmIG9ycGhhbiBsb2NrcyBpZiBjbGllbnQgZGllcy4KKworVmVyc2lvbiAyLjAxLjA2IC0gMXN0IE1hcmNoIDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN1cHByZXNzICdvcGVuIGZhaWxlZCcgZXJyb3IgbWVzc2FnZXMgZHVyaW5nIHNjYW5uaW5nLgorICBPcHRpb24gdG8gc3VwcHJlc3Mgd2FybmluZ3Mgb2YgZmlsZSBkZXNjcmlwdG9ycyBsZWZ0IG9wZW4uCisgIEZpeCBkZWZhdWx0IHZhbHVlIG9mIG1ldGFkYXRhY29waWVzIGluIGRvY3VtZW50YXRpb24gKDItPjEpLgorICBGaXggY2x2bWQtZ3VsbSBsb2NraW5nLgorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyBub3cgZW5hYmxlcyBkZWJ1Z2dpbmcgY29kZSBpbiBjbHZtZC4KKyAgRml4IGNsdm1kLWd1bG0gbm9kZSB1cC9kb3duIGNvZGUgc28gaXQgYWN0dWFsbHkgd29ya3MuCisgIGNsdm1kLWd1bG0gbm93IHJlbGVhc2VzIGxvY2tzIHdoZW4gc2h1dCBkb3duLgorCitWZXJzaW9uIDIuMDEuMDUgLSAxOHRoIEZlYnJ1YXJ5IDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBTdGF0aWMgYmluYXJ5IGludm9rZXMgZHluYW1pYyBiaW5hcnkgaWYgYXBwcm9wcmlhdGUuCisgIE1ha2UgY2x2bWQgY29uZmlnIGNoZWNrIGEgbGl0dGxlIG1vcmUgdG9sZXJhbnQuCisgIGd1bG0gY2x2bWQgY2FuIG5vdyBjb3BlIHdpdGggPjEgbWVzc2FnZSBhcnJpdmluZyBpbiBhIFRDUCBtZXNzYWdlLgorCitWZXJzaW9uIDIuMDEuMDQgLSA5dGggRmVicnVhcnkgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGZpeGVkIG9mZnNldCB0byBpbXBvcnRlZCBwb29sIG1pbm9yIG51bWJlcnMuCisgIFVwZGF0ZSBiaW5hcnkgcGF0aG5hbWVzIGluIGNsdm1kX2luaXRfcmhlbDQuCisgIGx2bTJjbWQuc28gc2hvdWxkIHNraXAgdGhlIGNoZWNrIGZvciBvcGVuIGZkcy4KKyAgUmVtb3ZlIHVudXNlZCAtZiBmcm9tIHB2bW92ZS4KKyAgR3VsbSBjbHZtZCBkb2Vzbid0IHJlcG9ydCAiY29ubmVjdGlvbiByZWZ1c2VkIiBlcnJvcnMuCisgIGNsdm1kIGRvZXMgYSBiYXNpYyBjb25maWcgZmlsZSBzYW5pdHkgY2hlY2sgYXQgc3RhcnR1cC4KKyAgRml4IHBvdGVudGlhbCB0aHJlYWQgc2h1dGRvd24gcmFjZSBpbiBjbHZtZC4KKworVmVyc2lvbiAyLjAxLjAzIC0gMXN0IEZlYnJ1YXJ5IDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1vcmUgNjQtYml0IGRpc3BsYXkvcmVwb3J0IGZpeGVzLgorICBNb3JlIGluZm9ybWF0aXZlIHN0YXJ0dXAgbWVzZyBpZiBjYW4ndCBjcmVhdGUgL2V0Yy9sdm0uCisgIEZpeCBzbmFwc2hvdCBkZXZpY2Ugc2l6ZSBidWcgKHNpbmNlIDIuMDEuMDEpLgorICBjbHZtZCBhbm5vdW5jZXMgc3RhcnR1cCBhbmQgY2x1c3RlciBjb25uZWN0aW9uIGluIHN5c2xvZy4KKyAgR3VsbSBjbHZtZCBkb2Vzbid0IGhhbmcgdHJ5aW5nIHRvIHRhbGsgdG8gYSByZWJvb3RlZCBub2RlLgorICBHdWxtIGNsdm1kIGRvZXNuJ3QgcHJpbnQgY21hbiBlcnJvciBvbiBzdGFydHVwLgorCitWZXJzaW9uIDIuMDEuMDIgLSAyMXN0IEphbnVhcnkgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXBkYXRlIGNsdm1kX2luaXRfcmhlbDQ6IHVzZSBsdm0uc3RhdGljIGFuZCBkb24ndCBsb2FkIGRsbS4KKyAgRml4IHNvbWUgc2l6ZV90IHByaW50aW5nLgorICBGaXggNjQgYml0IHhsYXRlIGNvbnN0cy4KKyAgU3BsaXQgb3V0IHBvb2wgc3B0eXBlX25hbWVzIHRvIGF2b2lkIHVudXNlZCBjb25zdC4KKyAgQWx3YXlzIGZhaWwgaWYgcmFuZG9tIGlkIGdlbmVyYXRpb24gZmFpbHMuCisgIFJlY29nbmlzZSBnbmJkIGRldmljZXMuCisgIEZpeCBjbHZtZCBzdGFydHVwIGJ1ZyBpbnRyb2R1Y2VkIGluIGNtYW4vZ3VsbSBhbWFsZ2FtYXRpb24uCisgIEltcHJvdmUgcmVwb3J0aW5nIG9mIG5vZGUtc3BlY2lmaWMgbG9ja2luZyBlcnJvcnMuCisKK1ZlcnNpb24gMi4wMS4wMSAtIDE5dGggSmFudWFyeSAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggY2x2bWQgbHZfaW5mb19ieV9sdmlkIG9wZW5fY291bnQuCisgIFN0b3JlIHNuYXBzaG90IGFuZCBvcmlnaW4gc2l6ZXMgc2VwYXJhdGVseS4KKyAgVXBkYXRlIHZnY3JlYXRlIG1hbiBwYWdlLgorCitWZXJzaW9uIDIuMDEuMDAgLSAxN3RoIEphbnVhcnkgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHZnc2NhbiBtZXRhZGF0YSBhdXRvLWNvcnJlY3Rpb24uCisgIE9ubHkgYXNrIGxpYmRldm1hcHBlciBmb3Igb3Blbl9jb3VudCB3aGVuIHdlIG5lZWQgaXQuCisgIEFkanVzdCBSSEVMNCBjbHZtZCBpbml0IHNjcmlwdCBwcmlvcml0eS4KKyAgRW5hYmxlIGJ1aWxkaW5nIG9mIENNQU4gJiBHVUxNIHZlcnNpb25zIG9mIGNsdm1kIGludG8gYSBzaW5nbGUgYmluYXJ5CisKK1ZlcnNpb24gMi4wMC4zMyAtIDd0aCBKYW51YXJ5IDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgcHZjcmVhdGUgd2lwZXMgZmlyc3QgNCBzZWN0b3JzIHVubGVzcyBnaXZlbiAtLXplcm8gbi4KKyAgZ3VsbSBjbHZtZCBub3cgdXNlcyBuZXcgY2NzZCBrZXkgbmFtZXMuCisgIGd1bG0gY2x2bWQgbm93IGRvZXNuJ3QgaWdub3JlIHRoZSBmaXJzdCBub2RlIGluIGNsdXN0ZXIuY29uZgorICBJbXByb3ZlIGNsdm1kIGZhaWx1cmUgbWVzc2FnZSBpZiBpdCdzIGFscmVhZHkgcnVubmluZy4KKyAgQWxsb3cgdXNlciB0byBraWxsIGNsdm1kIGR1cmluZyBpbml0aWFsaXNhdGlvbi4KKyAgRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gY2x1c3Rlcl9sb2NraW5nIHRoYXQgY291bGQgY2F1c2UgcmVhZCBoYW5ncy4KKworVmVyc2lvbiAyLjAwLjMyIC0gMjJuZCBEZWNlbWJlciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRHJvcCBzdGF0aWMvZGwgcmVzdHJpY3Rpb24gZm9yIG5vdy4KKyAgRml4IGFuIGVycm9yIGZwcmludGYuCisgIEZpeCB2Z2Rpc3BsYXkgLXMuIEJyZWFrcyAodW5kb2N1bWVudGVkKSBsdnMvcHZzL3ZncyAtcyBpbnN0ZWFkIGZvciBub3cuCisgIEZpeCBkZXZpY2UgcmVmZXJlbmNlIGNvdW50aW5nIG9uIHJlLW9wZW5zLgorICBJZ25vcmUgc3lzZnMgc3ltbGlua3Mgd2hlbiBEVF9VTktOT1dOLgorICBBZGQgY2x2bWQgaW5pdCBzY3JpcHQgZm9yIFJIRUw0LgorICBTa2lwIGRldmljZXMgdGhhdCBhcmUgdG9vIHNtYWxsIHRvIGJlIFBWcy4KKyAgRml4IHB2Y2hhbmdlIC14IHNlZ2ZhdWx0IHdpdGggbHZtMi1mb3JtYXQgb3JwaGFuLgorICBDb3BlIHdpdGggZW1wdHkgbXNkb3MgcGFydGl0aW9uIHRhYmxlcy4KKyAgQWRkIENPTlRSSUJVVE9SUyBmaWxlLgorCitWZXJzaW9uIDIuMDAuMzEgLSAxMnRoIERlY2VtYmVyIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZW9wZW4gUk8gZmlsZSBkZXNjcmlwdG9ycyBSVyBpZiBuZWNlc3NhcnkuCisKK1ZlcnNpb24gMi4wMC4zMCAtIDEwdGggRGVjZW1iZXIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZGl0aW9uYWwgZGV2aWNlLWhhbmRsaW5nIGRlYnVnIG1lc3NhZ2VzLgorICBBZGRpdGlvbmFsIHZlcmJvc2l0eSBsZXZlbCAtdnZ2diBpbmNsdWRlcyBsaW5lIG51bWJlcnMgYW5kIGJhY2t0cmFjZXMuCisgIFZlcmJvc2UgbWVzc2FnZXMgbm93IGdvIHRvIHN0ZGVyciBub3Qgc3Rkb3V0LgorICBDbG9zZSBhbnkgc3RyYXkgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgc3RhcnRpbmcuCisgIFJlZmluZSBwYXJ0aXRpb25hYmxlIGNoZWNrcyBmb3IgY2VydGFpbiBkZXZpY2UgdHlwZXMuCisgIEFsbG93IGRldmljZXMvdHlwZXMgdG8gb3ZlcnJpZGUgYnVpbHQtaW5zLgorICBGaXggbHZyZWR1Y2UgbWFuIHBhZ2UgLmktPi5JCisgIEZpeCB2Z3NwbGl0IG1hbiBwYWdlIHRpdGxlLgorICBGaXggY2x2bWQgbWFuIG1ha2VmaWxlLgorICBFeHRlbmQgZGV2X29wZW4gbG9nZ2luZy4KKyAgTWFrZSBjbHZtZF9maXhfY29uZi5zaCBVTkRPYWJsZS4KKworVmVyc2lvbiAyLjAwLjI5IC0gMjd0aCBOb3ZlbWJlciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgeGxhdGUgY29tcGlsYXRpb24gZml4LgorCitWZXJzaW9uIDIuMDAuMjggLSAyN3RoIE5vdmVtYmVyIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggcGFydGl0aW9uIHRhYmxlICYgbWQgc2lnbmF0dXJlIGRldGVjdGlvbi4KKyAgTWlub3IgY29uZmlndXJlL21ha2VmaWxlIHRpZHkuCisgIEV4cG9ydCB2ZXJzaW9uLmggZnJvbSB0b29scyBmb3IgY2x2bWQuCisKK1ZlcnNpb24gMi4wMC4yNyAtIDI0dGggTm92ZW1iZXIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRyYXAgbGFyZ2UgbWVtb3J5IGFsbG9jYXRpb24gcmVxdWVzdHMuCisgIEZpeCB0byBwYXJ0aXRpb24gdGFibGUgZGV0ZWN0aW9uIGNvZGUuCisgIEltcHJvdmUgZmlsdGVyIGRlYnVnIG1lc2dzLgorICBNYWtlIGNsdm1kX2ZpeF9jb25mLnNoIFVORE9hYmxlCisKK1ZlcnNpb24gMi4wMC4yNiAtIDIzcmQgTm92ZW1iZXIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEltcHJvdmUgcG9vbCBkZWJ1Z2dpbmcgc3RhdHMuCisgIERldGVjdCBwYXJ0aXRpb24gdGFibGUgc2lnbmF0dXJlLgorICBwdmNyZWF0ZSB3aXBlcyBtZCBzdXBlcmJsb2Nrcy4gKFdpdGggLS11dWlkIG9yIC0tcmVzdG9yZWZpbGUgaXQgcHJvbXB0cy4pCisgIFNlcGFyYXRlIG91dCBtZCBzdXBlcmJsb2NrIGRldGVjdGlvbiBjb2RlLgorICBQcmV2ZW50IHNuYXBzaG90IG9yaWdpbiByZXNpemluZy4KKyAgSW1wcm92ZSBhIHZncmVtb3ZlIGVycm9yIG1lc3NhZ2UuCisgIFVwZGF0ZSBzb21lIG1hbiBwYWdlcy4KKyAgQWxsb3cgeS9uIHdpdGggLWFlIGFyZ3MgKGV4Y2x1c2l2ZSBhY3RpdmF0aW9uKS4KKyAgRml4ZXMgdG8gbHZjcmVhdGUgdmduYW1lIHBhcnNpbmcuCisgIEZpeCBkbV9uYW1lIHN0cmluZyBzaXplIGNhbGN1bGF0aW9uLgorICBJbXByb3ZlIGNsdm1kIGVycm9yIHJlcG9ydGluZyBkdXJpbmcgc3RhcnR1cC4KKyAgTWFrZSBjbHZtZCBjb3BlIHdpdGggbGFyZ2UgZ2FwcyBpbiBub2RlIG51bWJlcnMgSURzLgorICBNYWtlIGNsdm1kIGluaXRpYWxpc2F0aW9uIGNvcGUgYmV0dGVyIHdpdGggZGVidWdnaW5nIG91dHB1dC4KKyAgVGlkeSBjbHZtZCBzb2NrZXQgY2FsbGJhY2tzIHNvIGFsbCB3b3JrIGhhcHBlbnMgb3V0c2lkZSBtYWluIGxvb3AuCisgIGNsdm1kIC1WIG5vdyBkaXNwbGF5cyBsdm0gdmVyc2lvbiB0b28uCisgIEFkZCBvcHRpb25hbCBndWxtIGJ1aWxkIGZvciBjbHZtZAorCitWZXJzaW9uIDIuMDAuMjUgLSAyOXRoIFNlcHRlbWJlciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCByZXR1cm4gY29kZSBmcm9tIHJtX2xpbmsgZm9yIHZnbWtub2Rlcy4KKyAgTWFrZSBjbHZtZCBMViBoYXNoIHRhYmxlIHRocmVhZC1zYWZlLgorICBGaXggY2x2bWQgbG9ja2luZyBzbyBpdCB3aWxsIGxvY2sgb3V0IG11bHRpcGxlIHVzZXJzIG9uIHRoZSBzYW1lIG5vZGUuCisgIEZpeCBjbHZtZCBWRyBsb2NraW5nIHRvIGl0IGNhbiBjb3BlIHdpdGggbXVsdGlwbGUgVkcgbG9ja3MuCisgIFJlbW92ZSBzcHVyaW91cyB0cmFpbGluZyBkb3QgaW4gbHZyZWR1Y2UgbWFuIHBhZ2UuCisgIEZpeCB2Z3JlbW92ZSBsb2NraW5nLgorCitWZXJzaW9uIDIuMDAuMjQgLSAxNnRoIFNlcHRlbWJlciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBwb29sX2VtcHR5IHNvIGl0IHJlYWxseSBkb2VzIGVtcHR5IHRoZSBtZW1vcnkgcG9vbC4KKyAgUmVuYW1lIG9sZCBzZWd0eXBlcyBmaWxlcyB0byBzZWd0eXBlLgorICBTb21lIGZpeGVzIHRvIG1lbW9yeSBkZWJ1Z2dpbmcgY29kZS4KKyAgRXhjbHVkZSBpbnRlcm5hbCBjb21tYW5kcyBmb3JtYXRzICYgc2VndHlwZXMgZnJvbSBpbnN0YWxsLgorCitWZXJzaW9uIDIuMDAuMjMgLSAxNXRoIFNlcHRlbWJlciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEV4cG9ydCBkbSBuYW1lIGJ1aWxkICYgc3BsaXQgZnVuY3Rpb25zLgorICBVc2UgT19OT0FUSU1FIG9uIGRldmljZXMgaWYgYXZhaWxhYmxlLgorICBXcml0ZSBsb2cgbWVzc2FnZSB3aGVuIGVhY2ggc2VndHlwZS9mb3JtYXQgZ2V0cyBpbml0aWFsaXNlZC4KKyAgTmV3IGNvbW1hbmRzICdzZWd0eXBlcycgYW5kICdmb3JtYXRzJy4KKyAgU3VwcHJlc3MgcHZtb3ZlIGFib3J0IG1lc3NhZ2UgaW4gdGVzdCBtb2RlLgorICBJbXByb3ZlIHB2Y3JlYXRlL3JlbW92ZSBkZXZpY2Ugbm90IGZvdW5kIGVycm9yIG1lc3NhZ2UuCisgIEFsbG93IHB2bW92ZSB0byBtb3ZlIGRhdGEgd2l0aGluIHRoZSBzYW1lIFBWLgorICBEZXNjcmliZSBob3cgcHZtb3ZlIHdvcmtzIG9uIG1hbiBwYWdlLgorICBUZXN0IGZvciBpbmNvbXBhdGlibGUgZm9ybWF0L3NlZ3R5cGUgY29tYmluYXRpb25zIGluIGx2X2V4dGVuZC4KKyAgRml4IGx2Y2hhbmdlIGV4YW1wbGUgb24gbWFuIHBhZ2UuCisKK1ZlcnNpb24gMi4wMC4yMiAtIDNyZCBTZXB0ZW1iZXIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCAvZGV2L3ZnbmFtZSBwZXJtcy4KKyAgUmVzdHJ1Y3R1cmUgeGxhdGUuaC4KKyAgQWRkIGNsdm1kIG1hbiBwYWdlLgorCitWZXJzaW9uIDIuMDAuMjEgLSAxOXRoIEF1Z3VzdCAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBjbnhtYW4tc29ja2V0LmggZnJvbSBjbWFuLgorICBSZWNvZ25pc2UgaXNlcmllcy92ZCBkZXZpY2VzLgorICBVc2UgJ21ha2UgaW5zdGFsbF9jbHVzdGVyJyB0byBpbnN0YWxsIGNsdXN0ZXIgZXh0ZW5zaW9ucyBvbmx5LgorICBDb3BlIHdpdGggRFRfVU5LTk9XTiBpbiBzeXNmcy4KKyAgRml4IGV4dGVudHNfbW92ZWQgbWV0YWRhdGEgc2l6ZSBjb21tZW50LgorICBSZW1vdmUgZHVwbGljYXRlIGxpbmUgaW4gcHZyZW1vdmUgaGVscCB0ZXh0LgorICBTdXBwb3J0IHZhcmlhYmxlIG1pcnJvciByZWdpb24gc2l6ZS4KKyAgU3VwcG9ydCBQRSByYW5nZXMgaW4gcHZtb3ZlIHNvdXJjZSBQVi4KKyAgRml4ZXMgdG8gYXMteWV0LXVudXNlZCBMViBzZWdtZW50IHNwbGl0dGluZyBjb2RlLgorICBDaGFuZ2UgYWxsb2NfYXJlYXMgdG8gcGVfcmFuZ2VzIGFuZCBhbGxvdyBzdXBwcmVzc2lvbiBvZiBhdmFpbGFiaWxpdHkgY2hlY2tzLgorICBBZGQgZGV2X3NpemUgY29sdW1uIHRvIHB2cy4KKyAgQWRkIHJlcG9ydCBjb2x1bW5zIGZvciBpbi1rZXJuZWwgZGV2aWNlIG51bWJlci4KKworVmVyc2lvbiAyLjAwLjIwIC0gMyBKdWx5IDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1vcmUgYXV0b2NvbmYgZml4ZXMuCisgIEZpeCBkZXZpY2UgbnVtYmVyIGhhbmRsaW5nIGZvciAyLjYga2VybmVscy4KKworVmVyc2lvbiAyLjAwLjE5IC0gMjkgSnVuZSAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVkdWNlIHNldmVyaXR5IG9mIHNldGxvY2FsZSBmYWlsdXJlIG1lc3NhZ2UuCisgIFJlY29nbmlzZSBhcmd2WzBdICJpbml0cmQtbHZtIiAocGxkLWxpbnV4KS4KKyAgTWFrZSAtTzIgY29uZmlndXJhYmxlLgorICBBZGRlZCAtLWRpc2FibGUtc2VsaW51eCB0byBjb25maWd1cmUgc2NyaXB0LgorICBMRF9GTEFHUy0+TERGTEFHUyAmIExEX0RFUFMtPkxEREVQUyBpbiBjb25maWd1cmUgc2NyaXB0LgorICBBZGQgaW5pdF9kZWJ1ZyB0byBjbHZtZC4KKworVmVyc2lvbiAyLjAwLjE4IC0gMjQgSnVuZSAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHZnY2hhbmdlIGFjdGl2YXRpb24uCisgIEFkZCBjbHVzdGVyIHN1cHBvcnQuCisKK1ZlcnNpb24gMi4wMC4xNyAtIDIwIEp1bmUgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIGNvbmZpZ3VyZSAtLWVuYWJsZS1mc2FkbSB0byB0cnkgb3V0IGZzYWRtLiAgZnNhZG0gaXMgbm90IHRlc3RlZCB5ZXQuCisgIERpc3BsYXkgYWxsIGZpbHRlcmVkIGRldmljZXMsIG5vdCBqdXN0IFBWcywgd2l0aCBwdnMgLWEuCisgIEZpeCBzeW5jX2RpcigpIHdoZW4gbm8gLyBpbiBmaWxlbmFtZQorICB2Z2NmZ2JhY2t1cCAtZiBhY2NlcHRzIHRlbXBsYXRlIHdpdGggJXMgZm9yIFZHIG5hbWUuCisgIEV4dGVuZCBoYXNoIGZ1bmN0aW9ucyB0byBoYW5kbGUgbm9uLW51bGwtdGVybWluYXRlZCBkYXRhLgorICBBZGQgbG9jYWwgYWN0aXZhdGlvbiBzdXBwb3J0LgorICBUaWR5IHJlbGF0aXZlIHBhdGhzIGluIG1ha2VmaWxlIGluY2x1ZGVzLgorICBmc2FkbSBzdXBwb3J0IGZvciBmc2NrIGFuZCByZXNpemluZyAtIG5lZWRzIHRlc3RpbmcuCisgIEFkZCByZWFkLW9ubHkgR0ZTIHBvb2wgc3VwcG9ydC4KKyAgQWRkIGx2bTJjcmVhdGVfaW5pdHJkIHNjcmlwdCBmcm9tIGh0dHA6Ly9wb29jaGllcmVkcy5uZXQvc3ZuL2x2bTIvCisgIEZpeCByb3VuZGluZyBvZiBsYXJnZSBkaXBsYXllZCBzaXplcy4KKyAgU3VwcHJlc3MgZGVjaW1hbCBwb2ludCB3aGVuIHVzaW5nIHVuaXRzIG9mIHNlY3RvcnMvYnl0ZXMuCisgIEFkZGl0aW9uYWwga2VybmVsIHRhcmdldCBjaGVja3MgYmVmb3JlIHB2bW92ZSAmIHNuYXBzaG90IGNyZWF0aW9uLgorICBBZGQgaTJvX2Jsb2NrLgorCitWZXJzaW9uIDIuMDAuMTYgLSAyNCBNYXkgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU2V0IGFyZWFfY291bnQgd2l0aGluIGFsbG9jX2x2X3NlZ21lbnQuCisgIFJlbW92ZSBlcnJvciBsYWJlbHMgZnJvbSBsdnJlc2l6ZS4KKyAgRml4IGEgcHZzIGVycm9yIHBhdGguCisgIHh4Y2hhbmdlIC1hZSBmb3IgZXhjbHVzaXZlIGFjdGl2YXRpb24uCisgIERvbid0IHJldHVybiBub24temVybyBzdGF0dXMgaWYgdGhlcmUgYXJlbid0IGFueSB2b2x1bWUgZ3JvdXBzLgorICBBZGQgLS1hbGxvYyBhcmd1bWVudCB0byB0b29scy4KKyAgUmVuYW1lIGFsbG9jYXRpb24gcG9saWNpZXMgdG8gY29udGlndW91cywgbm9ybWFsLCBhbnl3aGVyZSwgaW5oZXJpdC4KKyAgbmV4dGZyZWUgYmVjb21lcyBub3JtYWw7IGFueXdoZXJlIGlzbid0IGltcGxlbWVudGVkIHlldC4KKyAgTFYgaW5oZXJpdHMgYWxsb2NhdGlvbiBwb2xpY3kgZnJvbSBWRy4gRGVmYXVsdHM6IExWIC0gaW5oZXJpdDsgVkcgLSBub3JtYWwKKyAgQWRkaXRpb25hbCBzdGF0dXMgY2hhcmFjdGVyIGFkZGVkIHRvIHZncyB0byBpbmRpY2F0ZSBhbGxvY2F0aW9uIHBvbGljeS4KKyAgQWRkIHJlc2V0X2ZuIHRvIGV4dGVybmFsX2xvY2tpbmcuCisgIEVuc3VyZSBwcmVzZW5jZSBvZiB2aXJ0dWFsIHRhcmdldHMgYmVmb3JlIGF0dGVtcHRpbmcgYWN0aXZhdGluZy4KKyAgQXR0ZW1wdCB0byBmaXggcmVzaXppbmcgb2Ygc25hcHNob3Qgb3JpZ2lucy4KKyAgUmVzdHJ1Y3R1cmUgbHZyZXNpemUsIGJyaW5naW5nIGl0IGNsb3NlciB0byBsdmNyZWF0ZS4KKyAgQSBxdWljayBzYW5pdHkgY2hlY2sgb24gdmdfZGlzayBzdHJ1Y3Qgd2hlbiByZWFkIGluLiAgTW9yZSBjaGVja3MgbmVlZGVkLgorICBPbmx5IGluY2x1ZGUgdmlzaWJsZSBMVnMgaW4gYWN0aXZlL29wZW4gY291bnRzLgorICBBZGQgdmlydHVhbCBzZWdtZW50IHR5cGVzLCB6ZXJvIGFuZCBlcnJvci4gIEEgbGFyZ2Ugc3BhcnNlIGRldmljZSBjYW4gYmUKK2NvbnN0cnVjdGVkIGFzIGEgd3JpdGVhYmxlIHNuYXBzaG90IG9mIGEgbGFyZ2UgemVybyBzZWdtZW50LgorICBBZGQgLS10eXBlIHRvIGx2Y3JlYXRlL3Jlc2l6ZS4KKyAgUHVzaCBsdl9jcmVhdGUgJiBhbGxvYyBwb2xpY3kgdXAgdG8gdG9vbCBsZXZlbC4KKyAgRml4IHB2ZGlzcGxheSByZXR1cm4gY29kZS4KKyAgRGV0ZWN0IGludmFsaWQgTFYgbmFtZXMgaW4gYXJnIGxpc3RzLgorICBSZXBvcnRpbmcgdXNlcyBsaW5lLWF0LWEtdGltZSBvdXRwdXQuCisgIGx2bTIgZm9ybWF0IHNldHMgdW5saW1pdGVkX3ZvbHMgZm9ybWF0IGZsYWcuCisgIEludGVybmFsLW9ubHkgbWV0YWRhdGEgZmxhZyBzdXBwb3J0LgorICBCYXNpYyBjaGVja2luZyBmb3IgcHJlc2VuY2Ugb2YgZGV2aWNlLW1hcHBlciB0YXJnZXRzLgorICBTZXBhcmF0ZSBvdXQgcG9sbGRhZW1vbi4KKyAgUmV2aXNlIGludGVybmFsIGxvY2tpbmcgc2VtYW50aWNzLgorICBNb3ZlIGZpbmRfcHZfYnlfbmFtZSB0byBsaWJyYXJ5LgorICBSZW5hbWUgbW92ZS0+Y29weS4KKyAgQWRkIGRldmljZXMgdG8gc2VnbWVudHMgcmVwb3J0LgorICBCZWdpbiBzZXBhcmF0aW5nIG91dCBzZWdtZW50IGNvZGUuIFRoZXJlJ3MgYSBsb3Qgb2YgY2hhbmdlIGhlcmUuCisgIENvbXByZXNzIGFueSAob2Jzb2xldGUpIGxvbmcgTFZNMSBwdmlkcyBlbmNvdW50ZXJlZC4KKyAgU3VwcG9ydCBmb3IgdGFnZ2VkIGNvbmZpZyBmaWxlcy4KKyAgRG9uJ3QgYWJvcnQgb3BlcmF0aW9ucyBpZiBzZWxpbnV4IHByZXNlbnQgYnV0IGRpc2FibGVkLgorICBGaXggdHlwbyBpbiBjb25maWd1cmUgd2hpY2ggbGVmdCBIQVZFX0xJQkRMIHVuc2V0LgorCitWZXJzaW9uIDIuMDAuMTUgLSAxOSBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgY29uZmlndXJlIC0td2l0aC1vd25lcj0gLS13aXRoLWdyb3VwPSB0byBhdm9pZCAtbyBhbmQgLWcgYXJncyB0byAnaW5zdGFsbCcKKworVmVyc2lvbiAyLjAwLjE0IC0gMTYgQXByIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVzZSA2NC1iaXQgZmlsZSBmdW5jdGlvbnMgYnkgZGVmYXVsdC4KKworVmVyc2lvbiAyLjAwLjEzIC0gMTYgQXByIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFNldCBkZXZpY2VzL21kX2NvbXBvbmVudF9kZXRlY3Rpb24gPSAxIHRvIGlnbm9yZSBkZXZpY2VzIGNvbnRhaW5pbmcgbWQKKyAgc3VwZXJibG9ja3MuIFtMdWNhIEJlcnJhXQorICBJZ25vcmUgZXJyb3Igc2V0dGluZyBzZWxpbnV4IGZpbGUgY29udGV4dCBpZiBmcyBkb2Vzbid0IHN1cHBvcnQgaXQuCisKK1ZlcnNpb24gMi4wMC4xMiAtIDE0IEFwciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbnN0YWxsIGEgZGVmYXVsdCBsdm0uY29uZiBpbnRvIC9ldGMvbHZtIGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LgorICBBbGxvdyBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpciBmb3IgbHZtLnN0YXRpYyAoY29uZmlndXJlIC0tc3RhdGljZGlyPSkKKyAgRml4IGludmVydGVkIHNlbGludXggZXJyb3IgY2hlY2suCisgIFJlY29nbmlzZSBwb3dlcjIgaW4gL3Byb2MvZGV2aWNlcy4KKyAgRml4IGNvdW50aW5nIGluIGx2c19pbl92Z19vcGVuZWQuIFtJdCBpZ25vcmVkIGRldmljZXMgb3BlbiBtb3JlIHRoYW4gb25jZS5dCisKK1ZlcnNpb24gMi4wMC4xMSAtIDggQXByIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU2V0IGZhbGxiYWNrX3RvX2x2bTEgaW4gbHZtLmNvbmYgKG9yIGNvbmZpZ3VyZSAtLWVuYWJsZS1sdm0xX2ZhbGxiYWNrKQorICB0byBydW4gbHZtMSBiaW5hcmllcyBpZiBydW5uaW5nIGEgMi40IGtlcm5lbCB3aXRob3V0IGRldmljZS1tYXBwZXIuCisKK1ZlcnNpb24gMi4wMC4xMCAtIDcgQXByIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTW9yZSBmaXhlcyBmb3Igc3RhdGljIGJ1aWxkLgorICBBZGQgYmFzaWMgc2VsaW51eCBzdXBwb3J0LgorICBGaXggc3lzZnMgZGV0ZWN0aW9uLgorCitWZXJzaW9uIDIuMDAuMDkgLSAzMSBNYXIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXBkYXRlIGNvcHlyaWdodCBub3RpY2VzIGZvciBSZWQgSGF0LgorICBGaXggdmdta25vZGVzIHRvIHJlbW92ZSBkdWQgL2Rldi9tYXBwZXIgZW50cmllcy4gKGxpYmRldm1hcHBlciB1cGRhdGUgcmVxZCkuCisgIEFkZCBMVk0xLXN0eWxlIGNvbG9uIG91dHB1dCB0byB2Z2Rpc3BsYXkuCisgIGx2Y2hhbmdlIC0tcmVmcmVzaCB0byByZWxvYWQgYWN0aXZlIExWcy4KKyAgQWRkIHN0cmluZyBkaXNwbGF5IHRvIG1lbW9yeSBsZWFrIGR1bXAuCisgIEFkZCBsb2NraW5nIGZsYWdzICYgbWVtbG9jayBvcHRpb24uCisgIEFkZCBsaXN0X3ZlcnNpb25zIHRvIGxpYnJhcnkuCisgIElnbm9yZSBvcGVuIGhpZGRlbiBMVnMgd2hlbiBjaGVja2luZyBpZiBkZWFjdGl2YXRpb24gaXMgT0suCisgIFN1cHByZXNzIG1vdmUgcGVyY2VudGFnZSB3aGVuIGRldmljZSBpbmFjdGl2ZS4KKyAgQWRkIGx2X2luZm9fYnlfbHZpZC4KKyAgVmFyaW91cyB0aWR5LXVwcyB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KKyAgUmViYXNlbGluZSBpbnRlcm5hbCB2ZXJib3NlIGxldmVsLgorICBBZGQgLS1ub2xvY2tpbmcgb3B0aW9uIGZvciByZWFkIG9wZXJhdGlvbnMgaWYgbG9ja2luZyBpcyBmYWlsaW5nLgorICBBZGQgb3B0aW9uIHRvIGNvbXBpbGUgaW50byBhIGxpYnJhcnkuCisgIFdoZW4gY29tcGlsZWQgd2l0aG91dCBsaWJkZXZtYXBwZXIsIG9ubHkgcHJpbnQgd2FybmluZyBtZXNzYWdlIG9uY2UuCisgIEZpeCBsdnJlZHVjZSBQViBleHRlbnQgY2FsY3VsYXRpb25zLgorICBGaXggREVTVERJUiB0byB3b3JrIHdpdGggY29uZmlndXJlIHBhdGggb3ZlcnJpZGVzLgorICBBbHdheXMgdXNlIC8gYXMgY29uZmlnIGZpbGUgc2VwYXJhdG9yICYgcmVuYW1lIGludGVybmFsIGNvbmZpZyBmaWxlIHZhcmlhYmxlcy4KKyAgQWRkIHN1cHBvcnQgZm9yIHRhZ2dpbmcgUFYvVkcvTFZzIGFuZCBob3N0cy4KKyAgRml4IHJhcmUgYnVnIGluIHJlY29nbml0aW9uIG9mIGxvbmcgY21kbGluZSBhcmd1bWVudCBmb3Jtcy4KKyAgQWRkIGJhc2ljIGludGVybmF0aW9uYWxpc2F0aW9uIGluZnJhc3RydWN0dXJlLgorICBEb24ndCByZWN1cnNlIHN5bWxpbmtlZCBkaXJzIHN1Y2ggYXMgL2Rldi9mZCBvbiAyLjYga2VybmVscy4KKyAgVXBkYXRlIGF1dG9jb25mIGZpbGVzLgorICBBZGQgc3lzZnMgYmxvY2sgZGV2aWNlIGZpbHRlcmluZyBmb3IgMi42IGtlcm5lbHMuCisgIFVwZGF0ZSByZWZzIGZvciBtb3ZlIHRvIHNvdXJjZXMucmVkaGF0LmNvbS4KKworRnJpZGF5IDE0dGggTm92ZW1iZXIgMjAwMworPT09PT09PT09PT09PT09PT09PT09PT09PQorU29tZSBidWcgZml4ZXMgJiBtaW5vciBlbmhhbmNlbWVudHMsIGluY2x1ZGluZzoKKyAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBMVk0xIG1ldGFkYXRhIGltcHJvdmVkLgorICBNaXNzaW5nIG1hbiBwYWdlcyB3cml0dGVuLgorICBUb29sIGVycm9yIGNvZGVzIG1hZGUgbW9yZSBjb25zaXN0ZW50LgorICB2Z21rbm9kZXMgd3JpdHRlbi4KKyAgT19ESVJFQ1QgY2FuIGJlIHR1cm5lZCBvZmYgaWYgaXQgZG9lc24ndCB3b3JrIGluIHlvdXIga2VybmVsLgorICBkdW1wY29uZmlnIHRvIGRpc3BsYXkgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIGZpbGUKKworWW91IG5lZWQgdG8gdXBkYXRlIGxpYmRldm1hcHBlciBiZWZvcmUgdXNpbmcgJ3ZnbWtub2Rlcycgb3IgJ3Znc2NhbiAtLW1rbm9kZXMnLgorSWYgeW91ciByb290IGZpbGVzeXN0ZW0gaXMgb24gYW4gTFYsIHlvdSBzaG91bGQgcnVuIG9uZSBvZiB0aG9zZSB0d28KK2NvbW1hbmRzIHRvIGZpeCB1cCB0aGUgc3BlY2lhbCBmaWxlcyBpbiAvZGV2IGluIHlvdXIgcmVhbCByb290IGZpbGVzeXN0ZW0KK2FmdGVyIGZpbmlzaGluZyB3aXRoIHlvdXIgaW5pdHJkLiAgQWxzbywgcmVtZW1iZXIgeW91IGNhbiB1c2UKKyd2Z2NoYW5nZSAtLWlnbm9yZWxvY2tpbmdmYWlsdXJlJyBvbiB5b3VyIGluaXRyZCBpZiB0aGUgdG9vbCBmYWlscyBiZWNhdXNlCitpdCBjYW4ndCB3cml0ZSBhIGxvY2sgZmlsZSB0byBhIHJlYWQtb25seSBmaWxlc3lzdGVtLgorCitXZWRuZXNkYXkgMzB0aCBBcHJpbCAyMDAzCis9PT09PT09PT09PT09PT09PT09PT09PT09CitBIHB2bW92ZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cgYXZhaWxhYmxlIGZvciB0aGUgbmV3IG1ldGFkYXRhIGZvcm1hdC4KKworV2hlbiBydW5uaW5nIGEgY29tbWFuZCB0aGF0IGFsbG9jYXRlcyBzcGFjZSAoZS5nLiBsdmNyZWF0ZSksIHlvdSBjYW4gbm93CityZXN0cmljdCBub3Qgb25seSB3aGljaCBkaXNrKHMpIG1heSBiZSB1c2VkIGJ1dCBhbHNvIHRoZSBQaHlzaWNhbCBFeHRlbnRzCitvbiB0aG9zZSBkaXNrcy4gIGUuZy4gbHZjcmVhdGUgLUwgMTAgdmcxIC9kZXYvaGRhNjoxMDAwLTIwMDA6MzAwMC00MDAwCisKKworTW9uZGF5IDE4dGggTm92ZW1iZXIgMjAwMgorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBuZXcgZm9ybWF0IG9mIExWTSBtZXRhZGF0YSBpcyByZWFkeSBmb3IgeW91IHRvIHRlc3QhCisgIFdlIGV4cGVjdCBpdCB0byBiZSBtb3JlIGVmZmljaWVudCBhbmQgbW9yZSByb2J1c3QgdGhhbiB0aGUgb3JpZ2luYWwgZm9ybWF0LgorICBJdCdzIG1vcmUgY29tcGFjdCBhbmQgc3VwcG9ydHMgdHJhbnNhY3Rpb25hbCBjaGFuZ2VzIGFuZCByZXBsaWNhdGlvbi4KKyAgU2hvdWxkIHRoaW5ncyBnbyB3cm9uZyBvbiBhIHN5c3RlbSwgaXQncyBodW1hbi1yZWFkYWJsZSAoYW5kIGVkaXRhYmxlKS4KKworUGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgeW91IGZpbmQgdG8gdGhlIG1haWxpbmcgbGlzdCwKK2xpbnV4LWx2bUBzaXN0aW5hLmNvbS4gIFRoZSBzb2Z0d2FyZSBoYXMgTk9UIHlldCBiZWVuIHRob3JvdWdobHkKK3Rlc3RlZCBhbmQgc28gcXVpdGUgcG9zc2libHkgdGhlcmUnbGwgc3RpbGwgYmUgc29tZSBidWdzIGluIGl0LgorQmUgYXdhcmUgb2YgdGhlIGRpc2NsYWltZXIgaW4gdGhlIENPUFlJTkcgZmlsZS4KKworV2hpbGUgdGVzdGluZywgd2UgcmVjb21tZW5kIHR1cm5pbmcgbG9nZ2luZyBvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCit0byBwcm92aWRlIHVzIHdpdGggZGlhZ25vc3RpYyBpbmZvcm1hdGlvbjoKKyAgbG9nIHsKKyAgICAgICAgZmlsZT0iL3RtcC9sdm0yLmxvZyIKKwlsZXZlbD03CisJYWN0aXZhdGlvbj0xCisgIH0KKworWW91IHNob3VsZCBzY2hlZHVsZSByZWd1bGFyIGJhY2t1cHMgb2YgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgYW5kCittZXRhZGF0YSBiYWNrdXBzIGFuZCBhcmNoaXZlcyAobm9ybWFsbHkga2VwdCB1bmRlciAvZXRjL2x2bSkuCisKK1BsZWFzZSByZWFkIGRvY3MvZXhhbXBsZS5jb25mIGFuZCAibWFuIGx2bS5jb25mIiB0byBmaW5kIG91dCBtb3JlIGFib3V0Cit0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCitUbyBjb252ZXJ0IGFuIGV4aXN0aW5nIHZvbHVtZSBncm91cCBjYWxsZWQgdmcxIHRvIHRoZSBuZXcgZm9ybWF0IHVzaW5nCit0aGUgZGVmYXVsdCBzZXR0aW5ncywgdXNlICJ2Z2NvbnZlcnQgLU0yIHZnMSIuICBTZWUgIm1hbiB2Z2NvbnZlcnQiLgorCistTSAob3IgLS1tZXRhZGF0YXR5cGUgaW4gaXRzIGxvbmcgZm9ybSkgaXMgYSBuZXcgZmxhZyB0byBpbmRpY2F0ZSB3aGljaAorZm9ybWF0IG9mIG1ldGFkYXRhIHRoZSBjb21tYW5kIHNob3VsZCB1c2UgZm9yIGFueXRoaW5nIGl0IGNyZWF0ZXMuCitDdXJyZW50bHksIHRoZSB2YWxpZCB0eXBlcyBhcmUgImx2bTEiIGFuZCAibHZtMiIgYW5kIHRoZXkgY2FuIGJlCithYmJyZXZpYXRlZCB0byAiMSIgYW5kICIyIiByZXNwZWN0aXZlbHkuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcworZmxhZyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgZ2xvYmFsIHNlY3Rpb24gaW4gdGhlIGNvbmZpZyBmaWxlLgorCitCYWNrd2FyZHMtY29tcGF0aWJsZSBzdXBwb3J0IGZvciB0aGUgb3JpZ2luYWwgTFZNMSBtZXRhZGF0YSBmb3JtYXQgaXMKK21haW50YWluZWQsIGJ1dCBpdCBjYW4gYmUgbW92ZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5IG9yIHJlbW92ZWQKK2NvbXBsZXRlbHkgd2l0aCBjb25maWd1cmUncyAtLXdpdGgtbHZtMSBvcHRpb24uCisKK1VuZGVyIExWTTIsIHRoZSBiYXNpYyB1bml0IG9mIG1ldGFkYXRhIGlzIHRoZSB2b2x1bWUgZ3JvdXAuICBEaWZmZXJlbnQKK3ZvbHVtZSBncm91cHMgY2FuIHVzZSBkaWZmZXJlbnQgZm9ybWF0cyBvZiBtZXRhZGF0YSAtIHZnMSBjb3VsZCB1c2UKK3RoZSBvcmlnaW5hbCBMVk0xIGZvcm1hdCB3aGlsZSB2ZzIgdXNlZCB0aGUgbmV3IGZvcm1hdCAtIGJ1dCB5b3UgY2FuJ3QKK21peCBmb3JtYXRzIHdpdGhpbiBhIHZvbHVtZSBncm91cC4gIFNvIHRvIGFkZCBhIFBWIHRvIGFuIExWTTItZm9ybWF0Cit2b2x1bWUgZ3JvdXAgeW91IG11c3QgcnVuICJwdmNyZWF0ZSAtTTIiIG9uIGl0LCBmb2xsb3dlZCBieSAidmdleHRlbmQiLgorCitXaXRoIExWTTItZm9ybWF0IG1ldGFkYXRhLCBsdmV4dGVuZCB3aWxsIGxldCB5b3Ugc3BlY2lmeSBzdHJpcGluZworcGFyYW1ldGVycy4gIFNvIGFuIExWIGNvdWxkIGNvbnNpc3Qgb2YgdHdvIG9yIG1vcmUgInNlZ21lbnRzIiAtIHRoZQorZmlyc3Qgc2VnbWVudCBjb3VsZCBoYXZlIDMgc3RyaXBlcyB3aGlsZSB0aGUgc2Vjb25kIHNlZ21lbnQgaGFzIGp1c3QgMi4KKworTFZNMiBtYWludGFpbnMgYSBiYWNrdXAgb2YgdGhlIGN1cnJlbnQgbWV0YWRhdGEgZm9yIGVhY2ggdm9sdW1lIGdyb3VwCitpbiAvZXRjL2x2bS9iYWNrdXAsIGFuZCBwdXRzIGNvcGllcyBvZiBwcmV2aW91cyB2ZXJzaW9ucyBpbgorL2V0Yy9sdm0vYXJjaGl2ZS4gICJ2Z2NmZ2JhY2t1cCIgYW5kICJ2Z2NmZ3Jlc3RvcmUiIGNhbiBiZSB1c2VkIHRvCitjcmVhdGUgYW5kIHJlc3RvcmUgZnJvbSB0aGVzZSBmaWxlcy4gIElmIHlvdSBmdWxseSB1bmRlcnN0YW5kIHdoYXQKK3lvdSdyZSBkb2luZywgbWV0YWRhdGEgY2FuIGJlIGNoYW5nZWQgYnkgZWRpdGluZyBhIGNvcHkgb2YgYSBjdXJyZW50CitiYWNrdXAgZmlsZSBhbmQgdXNpbmcgdmdjZmdyZXN0b3JlIHRvIHJlbG9hZCBpdC4KKworUGxlYXNlIHJlYWQgdGhlIHB2Y3JlYXRlIG1hbiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBuZXcKK2Zvcm1hdCBmb3IgbWV0YWRhdGEuCisKK0FsbCB0b29scyB0aGF0IGNhbiBjaGFuZ2UgdGhpbmdzIGhhdmUgYSAtLXRlc3QgZmxhZyB3aGljaCBjYW4gYmUgdXNlZAordG8gY2hlY2sgdGhlIGVmZmVjdCAgb2YgYSBzZXQgb2YgY21kbGluZSBhcmdzIHdpdGhvdXQgcmVhbGx5IG1ha2luZyB0aGUKK2NoYW5nZXMuCisKKworV2hhdCdzIG5vdCBmaW5pc2hlZD8KKz09PT09PT09PT09PT09PT09PT09CitUaGUgaW50ZXJuYWwgY2FjaGUuICBJZiB5b3UgdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0IHlvdSdsbCBzZWUgbG90cyBvZgorcmVwZWF0ZWQgbWVzc2FnZXMsIG1hbnkgb2Ygd2hpY2ggd2lsbCBldmVudHVhbGx5IGdldCBvcHRpbWlzZWQgb3V0LgorCistLXRlc3Qgc29tZXRpbWVzIGNhdXNlcyBhIGNvbW1hbmQgdG8gZmFpbCAoZS5nLiB2Z2NvbnZlcnQgLS10ZXN0KSBldmVuCit0aG91Z2ggdGhlIHJlYWwgY29tbWFuZCB3b3VsZCB3b3JrOiBhZ2FpbiwgZml4aW5nIHRoaXMgaXMgd2FpdGluZyBmb3IKK3RoZSB3b3JrIG9uIHRoZSBjYWNoZS4KKworU2V2ZXJhbCBvZiB0aGUgdG9vbHMgZG8gbm90IHlldCBjb250YWluIHRoZSBsb2dpYyB0byBoYW5kbGUgZnVsbAorcmVjb3Zlcnk6IGNvbWJpbmF0aW9ucyBvZiBwdmNyZWF0ZSBhbmQgdmdjZmdyZXN0b3JlIG1heSBzb21ldGltZXMgYmUKK25lZWRlZCB0byByZXN0b3JlIG1ldGFkYXRhIGlmIGEgdG9vbCBnZXRzIGludGVycnVwdGVkIG9yIGNyYXNoZXMgb3IKK2ZpbmRzIHNvbWV0aGluZyB1bmV4cGVjdGVkLiAgVGhpcyBhcHBsaWVzIHBhcnRpY3VsYXJseSB0byB0b29scyB0aGF0Cit3b3JrIG9uIG1vcmUgdGhhbiBvbmUgdm9sdW1lIGdyb3VwIGF0IG9uY2UgKGUuZy4gdmdzcGxpdCkuCisKK0Rpc3BsYXkgb3V0cHV0LiAgU29tZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBjYW5ub3QgeWV0IGJlIGRpc3BsYXllZC4KKworUmVjb3ZlcnkgdG9vbHMgdG8gc2FsdmFnZSAibG9zdCIgbWV0YWRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgZGlza3M6CitidXQgd2UgaG9wZSB0aGUgbmV3IGZvcm1hdCB3aWxsIG1lYW4gc3VjaCB0b29scyBhcmUgaGFyZGx5IGV2ZXIgbmVlZGVkIQpkaWZmIC0tZ2l0IGEvV0hBVFNfTkVXX0RNIGIvV0hBVFNfTkVXX0RNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzIyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9XSEFUU19ORVdfRE0KQEAgLTAsMCArMSwxMjkxIEBACitWZXJzaW9uIDEuMDIuMTMzIC0gCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVmVyc2lvbiAxLjAyLjEzMiAtIDI4dGggSnVseSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGpzb24gcmVwb3J0aW5nIHRvIGVzY2FwZSAnIicgY2hhcmFjdGVyIHRoYXQgbWF5IGFwcGVhciBpbiByZXBvcnRlZCBzdHJpbmcuCisKK1ZlcnNpb24gMS4wMi4xMzEgLSAxNXRoIEp1bHkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERpc2FibGUgcXVldWVpbmcgb24gbXBhdGggZGV2cyBpbiBibGstYXZhaWxhYmlsaXR5IHN5c3RlbWQgc2VydmljZS9pbml0c2NyaXB0LgorICBBZGQgbmV3IC1tfC0tbXBhdGhvcHRpb24gZGlzYWJsZXF1ZXVlaW5nIHRvIGJsa2RlYWN0aXZhdGUuCisgIEF1dG9tYXRpY2FsbHkgZ3JvdXAgcmVnaW9ucyB3aXRoICdjcmVhdGUgLS1zZWdtZW50cycgdW5sZXNzIC0tbm9ncm91cC4KKyAgRml4IHJlc291cmNlIGxlYWsgd2hlbiBkZWxldGluZyB0aGUgZmlyc3QgbWVtYmVyIG9mIGEgZ3JvdXAuCisgIEFsbG93IC0tYm91bmRzIHdpdGggJ2NyZWF0ZSAtLWZpbGVtYXAnIGZvciBkbXN0YXRzLgorICBFbmFibGUgY3JlYXRpb24gb2YgZmlsZW1hcCByZWdpb25zIHdpdGggaGlzdG9ncmFtcy4KKyAgRW5hYmxlIGhpc3RvZ3JhbSBhZ2dyZWdhdGlvbiBmb3IgcmVnaW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUgYXJlYS4KKyAgRW5hYmxlIGhpc3RvZ3JhbSBhZ2dyZWdhdGlvbiBmb3IgZ3JvdXBzIG9mIHJlZ2lvbnMuCisgIEFkZCBhIC0tZmlsZW1hcCBvcHRpb24gdG8gJ2Rtc3RhdHMgY3JlYXRlJyB0byBhbGxvdyBtYXBwaW5nIG9mIGZpbGVzLgorICBBZGQgZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbnNfZnJvbV9mZCgpIHRvIG1hcCBmaWxlIGV4dGVudHMgdG8gcmVnaW9ucy4KKworVmVyc2lvbiAxLjAyLjEzMCAtIDZ0aCBKdWx5IDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1pbm9yIGZpeGVzIGZyb20gY292ZXJpdHkuCisKK1ZlcnNpb24gMS4wMi4xMjkgLSA2dGggSnVseSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgZGVmYXVsdCBkbXN0YXRzIGZpZWxkIHNlbGVjdGlvbnMgZm9yIGdyb3Vwcy4KKyAgQWRkICdvYmpfdHlwZScsICdncm91cF9pZCcsIGFuZCAnc3RhdHNuYW1lJyBmaWVsZHMgdG8gZG1zdGF0cyByZXBvcnRzLgorICBBZGQgLS1hcmVhLCAtLXJlZ2lvbiwgYW5kIC0tZ3JvdXAgdG8gZG1zdGF0cyB0byBjb250cm9sIG9iamVjdCBzZWxlY3Rpb24uCisgIEFkZCAtLWFsaWFzLCAtLWdyb3VwaWQsIC0tcmVnaW9ucyB0byBkbXN0YXRzIGZvciBncm91cCBjcmVhdGlvbiBhbmQgZGVsZXRpb24uCisgIEFkZCAnZ3JvdXAnIGFuZCAndW5ncm91cCcgY29tbWFuZHMgdG8gZG1zdGF0cy4KKyAgQWxsb3cgZG1fc3RhdHNfZGVsZXRlX2dyb3VwKCkgdG8gb3B0aW9uYWxseSBkZWxldGUgYWxsIGdyb3VwIG1lbWJlcnMuCisgIEFkZCBkbV9zdGF0c19nZXRfb2JqZWN0X3R5cGUoKSB0byByZXR1cm4gdGhlIHR5cGUgb2Ygb2JqZWN0IHByZXNlbnQuCisgIEFkZCBkbV9zdGF0c193YWxrX2luaXQoKSBhbGxvd2luZyBjb250cm9sIG9mIG9iamVjdHMgdmlzaXRlZCBieSB3YWxrcy4KKyAgQWRkIGRtX3N0YXRzX2dldF9ncm91cF9kZXNjcmlwdG9yKCkgdG8gcmV0dXJuIHRoZSBtZW1iZXIgbGlzdCBhcyBhIHN0cmluZy4KKyAgSW50cm9kdWNlIGRtX3N0YXRzX2dldF9ucl9ncm91cHMoKSBhbmQgZG1fc3RhdHNfZ3JvdXBfcHJlc2VudCgpLgorICBBZGQgZG1fc3RhdHNfe2dldCxzZXR9X2FsaWFzKCkgdG8gc2V0IGFuZCByZXRyaWV2ZSBhbGlhcyBuYW1lcyBmb3IgZ3JvdXBzLgorICBBZGQgZG1fc3RhdHNfZ2V0X2dyb3VwX2lkKCkgdG8gcmV0dXJuIHRoZSBncm91cCBJRCBmb3IgYSBnaXZlbiByZWdpb24uCisgIEFkZCBkbV9zdGF0c197Y3JlYXRlLGRlbGV0ZX1fZ3JvdXAoKSB0byBhbGxvdyBncm91cGluZyBvZiBzdGF0cyByZWdpb25zLgorICBBZGQgZW51bS1kcml2ZW4gZG1fc3RhdHNfZ2V0X3ttZXRyaWMsY291bnRlcn0oKSBpbnRlcmZhY2VzLgorICBBZGQgZG1fYml0c2V0X3BhcnNlX2xpc3QoKSB0byBwYXJzZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGJpdHNldC4KKyAgVGhpbiBkbWV2ZW50ZCBwbHVnaW4gdW1vdW50cyBsdm0yIHZvbHVtZSBvbmx5IHdoZW4gcG9vbCBpcyA5NSUgb3IgbW9yZS4KKworVmVyc2lvbiAxLjAyLjEyOCAtIDI1dGggSnVuZSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVjb2duaXplICdhbGwnIGtleXdvcmQgdXNlZCBpbiBzZWxlY3Rpb24gYXMgc3lub255bSBmb3IgIiIgKG5vIHNlbGVjdGlvbikuCisgIEFkZCBkbV9yZXBvcnRfc2V0X3NlbGVjdGlvbiB0byBzZXQgc2VsZWN0aW9uIGZvciBtdWx0aXBsZSBvdXRwdXQgb2YgcmVwb3J0LgorICBBZGQgRE1fUkVQT1JUX09VVFBVVF9NVUxUSVBMRV9USU1FUyBmbGFnIGZvciBtdWx0aXBsZSBvdXRwdXQgb2Ygc2FtZSByZXBvcnQuCisgIE1vdmUgZmllbGQgd2lkdGggaGFuZGxpbmcvc29ydCBpbml0IGZyb20gZG1fcmVwb3J0X29iamVjdCB0byBkbV9yZXBvcnRfb3V0cHV0LgorICBBZGQgX0xPR19CWVBBU1NfUkVQT1JUIGZsYWcgZm9yIGJ5cGFzc2luZyBhbnkgbG9nIHJlcG9ydCBjdXJyZW50bHkgc2V0LgorICBJbnRyb2R1Y2UgRE1fUkVQT1JUX0dST1VQX0pTT04gZm9yIHJlcG9ydCBncm91cCB3aXRoIEpTT04gb3V0cHV0IGZvcm1hdC4KKyAgSW50cm9kdWNlIERNX1JFUE9SVF9HUk9VUF9CQVNJQyBmb3IgcmVwb3J0IGdyb3VwIHdpdGggYmFzaWMgcmVwb3J0IG91dHB1dC4KKyAgSW50cm9kdWNlIERNX1JFUE9SVF9HUk9VUF9TSU5HTEUgZm9yIHJlcG9ydCBncm91cCBoYXZpbmcgc2luZ2xlIHJlcG9ydCBvbmx5LgorICBBZGQgZG1fcmVwb3J0X2dyb3VwX3tjcmVhdGUscHVzaCxwb3AsZGVzdHJveX0gdG8gc3VwcG9ydCByZXBvcnQgZ3JvdXBpbmcuCisKK1ZlcnNpb24gMS4wMi4xMjcgLSAxMXRoIEp1bmUgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgRml4IGJsa2RlYWN0aXZhdGUgcmVncmVzc2lvbiBjYXVzaW5nIHNraXBwaW5nIG9mIGRtICsgbWQgZGV2aWNlcy4gKDEuMDIuMTI2KQorCitWZXJzaW9uIDEuMDIuMTI2IC0gM3JkIEp1bmUgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVwb3J0IHBhc3N0aHJvdWdoIGNhY2hpbmcgbW9kZSB3aGVuIHBhcnNpbmcgY2FjaGUgbW9kZS4KKworVmVyc2lvbiAxLjAyLjEyNSAtIDE0dGggTWF5IDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFNob3cgbGlicmFyeSB2ZXJzaW9uIGluIG1lc3NhZ2UgZXZlbiBpZiBkbSBkcml2ZXIgdmVyc2lvbiBpcyB1bmF2YWlsYWJsZS4KKworVmVyc2lvbiAxLjAyLjEyNCAtIDMwdGggQXByaWwgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgZG1fdWRldl93YWl0X2ltbWVkaWF0ZSB0byBsaWJkZXZtYXBwZXIgZm9yIHdhaXRpbmcgb3V0c2lkZSB0aGUgbGlicmFyeS4KKworVmVyc2lvbiAxLjAyLjEyMyAtIDIzcmQgQXByaWwgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEbyBub3Qgc3RyaXAgTFZNLSB3aGVuIGRlYnVnIHJlcG9ydGluZyBub3QgZm91bmQgdXVpZC4KKworVmVyc2lvbiAxLjAyLjEyMiAtIDl0aCBBcHJpbCAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2hhbmdlIGxvZ19kZWJ1ZyBpb2N0bCBmbGFncyBmcm9tIHNpbmdsZSBjaGFyYWN0ZXJzIGludG8gd29yZHMuCisKK1ZlcnNpb24gMS4wMi4xMjEgLSAyNnRoIE1hcmNoIDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRqdXN0IHJhaWQgc3RhdHVzIGZ1bmN0aW9uLgorCitWZXJzaW9uIDEuMDIuMTIwIC0gMTF0aCBNYXJjaCAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEltcHJvdmUgcGFyc2luZyBvZiBjYWNoZSBzdGF0dXMgYW5kIHJlcG9ydCBGYWlsLCBFcnJvciwgbmVlZHNfY2hlY2ssIHJvLgorCitWZXJzaW9uIDEuMDIuMTE5IC0gNHRoIE1hcmNoIDIwMTYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZG1fY29uZmlnX3dyaXRlX25vZGUgYW5kIHZhcmlhbnRzIHRvIHJldHVybiBlcnJvciBvbiBzdWJzZWN0aW9uIGZhaWx1cmVzLgorICBSZW1vdmUgNDA5NiBjaGFyIGxpbWl0IGR1ZSB0byBidWZmZXIgc2l6ZSBpZiB3cml0aW5nIGRtX2NvbmZpZ19ub2RlLgorCitWZXJzaW9uIDEuMDIuMTE4IC0gMjZ0aCBGZWJydWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBzdHJpbmcgYm91bmRhcnkgY2hlY2sgaW4gX2dldF9jYW5vbmljYWxfZmllbGRfbmFtZSgpLgorICBBbHdheXMgaW5pdGlhbGl6ZWQgaGlzdCBzdHJ1Y3QgaW4gX3N0YXRzX3BhcnNlX2hpc3RvZ3JhbSgpLgorCitWZXJzaW9uIDEuMDIuMTE3IC0gMjFzdCBGZWJydWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEltcHJvdmUgc3RhdHVzIHBhcnNpbmcgZm9yIHRoaW4tcG9vbCBhbmQgdGhpbiBkZXZpY2VzLgorCitWZXJzaW9uIDEuMDIuMTE2IC0gMTV0aCBGZWJydWFyeSAyMDE2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVzZSBmdWxseSBhbGlnbmVkIGFsbG9jYXRpb25zIGZvciBkbV9wb29sX3N0cmR1cC9zdHJuZHVwKCkgKDEuMDIuNjQpLgorICBGaXggdGhpbi1wb29sIHRhYmxlIHBhcmFtZXRlciBmZWF0dXJlIG9yZGVyIHRvIG1hdGNoIGtlcm5lbCBvdXRwdXQuCisKK1ZlcnNpb24gMS4wMi4xMTUgLSAyNXRoIEphbnVhcnkgMjAxNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBtYW4gcGFnZSBmb3IgZG1zZXR1cCB1ZGV2Y3JlYXRlY29va2llLgorCitWZXJzaW9uIDEuMDIuMTE0IC0gMTR0aCBEZWNlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJldHRlciBzdXBwb3J0IGZvciBkbXNldHVwIHN0YXRpYyBsaW5rYWdlLgorICBFeHRlbmQgdmFsaWRpdHkgY2hlY2tzIG9uIGRtZXZlbnRkIGNsaWVudCBzb2NrZXQuCisKK1ZlcnNpb24gMS4wMi4xMTMgLSA1dGggRGVjZW1iZXIgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1pcnJvciBwbHVnaW4gaW4gZG1ldmVudGQgdXNlcyBkbV9nZXRfc3RhdHVzX21pcnJvcigpLgorICBBZGQgZG1fZ2V0X3N0YXR1c19taXJyb3IoKSBmb3IgcGFyc2luZyBtaXJyb3Igc3RhdHVzIGxpbmUuCisKK1ZlcnNpb24gMS4wMi4xMTIgLSAyOHRoIE5vdmVtYmVyIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU2hvdyBlcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSB1bnN1cHBvcnRlZCByYWlkIHR5cGUuCisgIEltcHJvdmUgcHJlbG9hZGluZyBzZXF1ZW5jZSBvZiBhbiBhY3RpdmUgdGhpbi1wb29sIHRhcmdldC4KKyAgRHJvcCBleHRyYSBzcGFjZSBmcm9tIGNhY2hlIHRhcmdldCBsaW5lIHRvIGZpeCB1bm5lZGVkIHRhYmxlIHJlbG9hZHMuCisKK1ZlcnNpb24gMS4wMi4xMTEgLSAyM3JkIE5vdmVtYmVyIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRXh0ZW5kIGRtX2hhc2ggdG8gc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBrZXkuCisgIEFkZCBtaXNzaW5nIGNoZWNrIGZvciBhbGxvY2F0aW9uIGluc2lkZSBkbV9zcGxpdF9sdm1fbmFtZSgpLgorICBUZXN0IGRtX3Rhc2tfZ2V0X21lc3NhZ2VfcmVzcG9uc2UgZm9yICFOVUxMIGluIGRtX3N0YXRzX3ByaW50X3JlZ2lvbigpLgorICBBZGQgY2hlY2tzIGZvciBmYWlsaW5nIGRtX3N0YXRzX2NyZWF0ZSgpIGluIGRtc2V0dXAuCisgIEFkZCBtaXNzaW5nIGZpZm8gY2xvc2Ugd2hlbiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjbGllbnQgY29ubmVjdGlvbi4KKworVmVyc2lvbiAxLjAyLjExMCAtIDMwdGggT2N0b2JlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGlzYWJsZSB0aGluIG1vbml0b3JpbmcgcGx1Z2luIHdoZW4gaXQgZmFpbHMgdG9vIG9mdGVuICg+MTAgdGltZXMpLgorICBGaXgvcmVzdG9yZSBwYXJzaW5nIG9mIGVtcHR5IGZpZWxkICctJyB3aGVuIHByb2Nlc3NpbmcgZG1ldmVudGQgZXZlbnQuCisgIEVuaGFuY2UgZG1fdHJlZV9ub2RlX3NpemVfY2hhbmdlZCgpIHRvIHJlY29nbml6ZSBzaXplIHJlZHVjdGlvbi4KKyAgU3VwcG9ydCBleGl0IG9uIGlkbGUgZm9yIGRtZW52ZW50ZCAoMSBob3VyKS4KKyAgQWRkIHN1cHBvcnQgdG8gYWxsb3cgdW5tb25pdG9yIGRldmljZSBmcm9tIHBsdWdpbiBpdHNlbGYuCisgIE5ldyBkZXNpZ24gZm9yIHRocmVhZCBjby1vcGVyYXRpb24gaW4gZG1ldmVudGQuCisgIERtZXZlbnRkIHJlYWQgZGV2aWNlIHN0YXR1cyB3aXRoICdub2ZsdXNoJy4KKyAgRG1ldmVudGQgY2xvc2VzIGNvbnRyb2wgZGV2aWNlIHdoZW4gbm8gZGV2aWNlIGlzIG1vbml0b3JlZC4KKyAgVGhpbiBwbHVnaW4gZm9yIGRtZXZlbnRkIGltcHJvdmVkIHBlcmNlbnRhZ2UgdXNhZ2UuCisgIFNuYXBzaG90IHBsdWdpbiBmb3IgZG1ldmVudGQgaW1wcm92ZWQgcGVyY2VudGFnZSB1c2FnZS4KKyAgQWRkIGRtX2hvbGRfY29udHJvbF9kZXYgdG8gYWxsb3cgaG9sZGluZyBvZiBjb250cm9sIGRldmljZSBvcGVuLgorICBBZGQgZG1fcmVwb3J0X2NvbXBhY3RfZ2l2ZW5fZmllbGRzIHRvIHJlbW92ZSBnaXZlbiBlbXB0eSBmaWVsZHMgZnJvbSByZXBvcnQuCisgIFVzZSBsaWJkbSBzdGF0dXMgcGFyc2luZyBhbmQgbG9jYWwgbWVtIHJhaWQgZG1ldmVudGQgcGx1Z2luLgorICBVc2UgbG9jYWwgbWVtIHBvb2wgYW5kIGxvY2sgb25seSBsdm0yIGV4ZWN1dGlvbiBmb3IgbWlycm9yIGRtZXZlbnRkIHBsdWdpbi4KKyAgTG9jayBwcm90ZWN0IG9ubHkgbHZtMiBleGVjdXRpb24gZm9yIHNuYXBzaG90IGFuZCB0aGluIGRtZXZlbnRkIHBsdWdpbi4KKyAgVXNlIGxvY2FsIG1lbXBvb2wgZm9yIHJhaWQgYW5kIG1pcnJvciBwbHVnaW5zLgorICBSZXdvcmtlZCB0aHJlYWQgaW5pdGlhbGl6YXRpb24gZm9yIGRtZXZlbnRkIHBsdWdpbnMuCisgIERtZXZlbnRkIGhhbmRsZXMgc25hcHNob3Qgb3ZlcmZsb3cgZm9yIG5vdyBlcXVhbGx5IGFzIGludmFsaWQuCisgIENvbnZlcnQgZG1ldmVudGQgdG8gdXNlIGNvbW1vbiBsb2dnaW5nIG1hY3JvIHN5c3RlbSBmcm9tIGxpYmRtLgorICBSZXR1cm4gLUVOT01FTSB3aGVuIGRldmljZSByZWdpc3RyYXRpb24gZmFpbHMgaW5zdGVhZCBvZiAwICg9c3VjY2VzcykuCisgIEVuZm9yY2Ugd3JpdGV0aHJvdWdoIG1vZGUgZm9yIGNsZWFuZXIgcG9saWN5LgorICBBZGQgc3VwcG9ydCBmb3IgcmVjb2duaXRpb24gYW5kIGRlYWN0aXZhdGlvbiBvZiBNRCBkZXZpY2VzIHRvIGJsa2RlYWN0aXZhdGUuCisgIE1vdmUgdGFyZ2V0IHN0YXR1cyBmdW5jdGlvbnMgb3V0IG9mIGxpYmRtLWRlcHRyZWUuCisgIENvcnJlY3QgdXNlIG9mIG1heF93cml0ZV9iZWhpbmQgcGFyYW1ldGVyIHdoZW4gZ2VuZXJhdGluZyByYWlkIHRhcmdldCBsaW5lLgorICBGaXggZG0tZXZlbnQgc3lzdGVtZCBzZXJ2aWNlIHRvIG1ha2Ugc3VyZSBpdCBpcyBleGVjdXRlZCBiZWZvcmUgbW91bnRpbmcuCisKK1ZlcnNpb24gMS4wMi4xMDkgLSAyMm5kIFNlcHRlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgbWFuIHBhZ2VzIGZvciBkbXNldHVwIGFuZCBkbXN0YXRzLgorICBJbXByb3ZlIGhlbHAgdGV4dCBmb3IgZG1zZXR1cC4KKyAgVXNlIC0tbm9mbHVzaCBhbmQgLS1ub2xvY2tmcyB3aGVuIHJlbW92aW5nIGRldmljZSB3aXRoIC0tZm9yY2UuCisgIFBhcnNlIG5ldyBPdmVyZmxvdyBzdGF0dXMgc3RyaW5nIGZvciBzbmFwc2hvdCB0YXJnZXQuCisgIENoZWNrIGRpciBwYXRoIGNvbXBvbmVudHMgYXJlIHZhbGlkIGlmIHVzaW5nIGRtX2NyZWF0ZV9kaXIsIGVycm9yIG91dCBpZiBub3QuCisgIEZpeCAvZGV2L21hcHBlciBoYW5kbGluZyB0byByZW1vdmUgZGFuZ2xpbmcgZW50cmllcyBpZiBzeW1saW5rcyBhcmUgZm91bmQuCisgIE1ha2UgaXQgcG9zc2libGUgdG8gdXNlIGJsYW5rIHZhbHVlIGFzIHNlbGVjdGlvbiBmb3Igc3RyaW5nIGxpc3QgcmVwb3J0IGZpZWxkLgorCitWZXJzaW9uIDEuMDIuMTA4IC0gMTV0aCBTZXB0ZW1iZXIgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRG8gbm90IGNoZWNrIGZvciBmdWxsIHRoaW4gcG9vbCB3aGVuIGFjdGl2YXRpbmcgd2l0aG91dCBtZXNzYWdlcyAoMS4wMi4xMDcpLgorCitWZXJzaW9uIDEuMDIuMTA3IC0gNXRoIFNlcHRlbWJlciAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFBhcnNlIHRoaW4tcG9vbCBzdGF0dXMgd2l0aCBvbmUgc2luZ2xlIHJvdXRpbmUgaW50ZXJuYWxseS4KKyAgQWRkIC0taGlzdG9ncmFtIHRvIHNlbGVjdCBkZWZhdWx0IGhpc3RvZ3JhbSBmaWVsZHMgZm9yIGxpc3QgYW5kIHJlcG9ydC4KKyAgQWRkIHJlcG9ydCBmaWVsZHMgZm9yIGRpc3BsYXlpbmcgbGF0ZW5jeSBoaXN0b2dyYW0gY29uZmlndXJhdGlvbiBhbmQgZGF0YS4KKyAgQWRkIGRtc3RhdHMgLS1ib3VuZHMgdG8gc3BlY2lmeSBoaXN0b2dyYW0gYm91bmRhcmllcyBmb3IgYSBuZXcgcmVnaW9uLgorICBBZGQgZG1faGlzdG9ncmFtX3RvX3N0cmluZygpIHRvIGZvcm1hdCBoaXN0b2dyYW0gZGF0YSBpbiBzdHJpbmcgZm9ybS4KKyAgQWRkIHB1YmxpYyBtZXRob2RzIHRvIGxpYmRtIHRvIGFjY2VzcyBudW1lcmljYWwgaGlzdG9ncmFtIGNvbmZpZyBhbmQgZGF0YS4KKyAgUGFyc2UgYW5kIHN0b3JlIGhpc3RvZ3JhbSBkYXRhIGluIGRtX3N0YXRzX2xpc3QoKSBhbmQgZG1fc3RhdHNfcG9wdWxhdGUoKS4KKyAgQWRkIGFuIGFyZ3VtZW50IHRvIHNwZWNpZnkgaGlzdG9ncmFtIGJvdW5kcyB0byBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKCkuCisgIEFkZCBkbV9oaXN0b2dyYW1fYm91bmRzX2Zyb21fe3N0cmluZyx1aW50NjRfdH0oKSB0byBwYXJzZSBoaXN0b2dyYW0gYm91bmRzLgorICBBZGQgZG1faGlzdG9ncmFtIGhhbmRsZSB0eXBlIHRvIHJlcHJlc2VudCBhIGxhdGVuY3kgaGlzdG9ncmFtIGFuZCBpdHMgYm91bmRzLgorICBGaXggZGV2bWFwcGVyLnBjIHBrZ2NvbmZpZyBmaWxlIHRvIG5vdCByZWZlcmVuY2Ugbm9uLWV4aXN0ZW50IHJ0LnBjIGZpbGUuCisgIFJlaW5zdGF0ZSBkbV90YXNrX2dldF9pbmZvQEJhc2UgdG8gbGliZGV2bWFwcGVyIGV4cG9ydHMuICgxLjAyLjEwNikKKworVmVyc2lvbiAxLjAyLjEwNiAtIDI2dGggQXVndXN0IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCAncHJlY2lzZScgY29sdW1uIHRvIHN0YXRpc3RpY3MgcmVwb3J0cy4KKyAgQWRkIC0tcHJlY2lzZSBzd2l0Y2ggdG8gJ2Rtc3RhdHMgY3JlYXRlJyB0byByZXF1ZXN0IG5hbm9zZWNvbmQgY291bnRlcnMuCisgIEFkZCBwcmVjaXNlIGFyZ3VtZW50IHRvIGRtX3N0YXRzX2NyZWF0ZV9yZWdpb24oKS4KKyAgQWRkIHN1cHBvcnQgdG8gbGliZG0tc3RhdHMgZm9yIHByZWNpc2VfdGltZXN0YW1wcworCitWZXJzaW9uIDEuMDIuMTA1IC0gMTd0aCBBdWd1c3QgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4ICdkbXN0YXRzIGxpc3QgLW8gYWxsJyBzZWdmYXVsdC4KKyAgU2VwYXJhdGUgZG1zdGF0cyBzdGF0aXN0aWNzIGZpZWxkcyBmcm9tIHJlZ2lvbiBpbmZvcm1hdGlvbiBmaWVsZHMuCisgIEFkZCBpbnRlcnZhbCBhbmQgaW50ZXJ2YWxfbnMgZmllbGRzIHRvIGRtc3RhdHMgcmVwb3J0cy4KKyAgRG8gbm90IGluY2x1ZGUgaW50ZXJuYWwgZ2xpYmMgaGVhZGVycyBpbiBsaWJkbS10aW1lc3RhbXAuYyAoMS4wMi4xMDQpCisgIEV4aXQgaW1tZWRpYXRlbHkgaWYgbm8gZGV2aWNlIGlzIHN1cHBsaWVkIHRvIGRtc2V0dXAgd2lwZV90YWJsZS4KKyAgU3VwcHJlc3MgZG1zZXR1cCByZXBvcnQgaGVhZGluZ3Mgd2hlbiBubyBkYXRhIGlzIG91dHB1dC4gKDEuMDIuMTA0KQorICBBZGp1c3QgZG1zZXR1cCB1c2FnZS9oZWxwIG91dHB1dCBzZWxlY3Rpb24gdG8gbWF0Y2ggY29tbWFuZCBpbnZva2VkLgorICBGaXggZG1zZXR1cCAtbyBhbGwgdG8gc2VsZWN0IGNvcnJlY3QgZmllbGRzIGluIHNwbGl0bmFtZSByZXBvcnQuCisgIFJlc3RydWN0dXJlIGludGVybmFsIGRtc2V0dXAgYXJndW1lbnQgaGFuZGxpbmcgYWNyb3NzIGFsbCBjb21tYW5kcy4KKyAgQWRkIGRtX3JlcG9ydF9pc19lbXB0eSgpIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIGRhdGEgYXdhaXRpbmcgb3V0cHV0LgorICBBZGQgbW9yZSBhcmcgdmFsaWRhdGlvbiBmb3IgZG1fdHJlZV9ub2RlX2FkZF9jYWNoZV90YXJnZXQoKS4KKyAgQWRkIC0tYWxsZGV2aWNlcyBzd2l0Y2ggdG8gcmVwbGFjZSB1c2Ugb2YgLS1mb3JjZSBmb3Igc3RhdHMgY3JlYXRlIC8gZGVsZXRlLgorCitWZXJzaW9uIDEuMDIuMTA0IC0gMTB0aCBBdWd1c3QgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtc3RhdHMuOCBtYW4gcGFnZQorICBBZGQgZG1zdGF0cyAtLXNlZ21lbnRzIHN3aXRjaCB0byBjcmVhdGUgb25lIHJlZ2lvbiBwZXIgZGV2aWNlIHNlZ21lbnQuCisgIEFkZCBkbXN0YXRzIC0tcmVnaW9uaWQsIC0tYWxscmVnaW9ucyB0byBzcGVjaWZ5IGEgc2luZ2xlIC8gYWxsIHN0YXRzIHJlZ2lvbnMuCisgIEFkZCBkbXN0YXRzIC0tYWxscHJvZ3JhbXMgZm9yIHN0YXRzIGNvbW1hbmRzIHRoYXQgZmlsdGVyIGJ5IHByb2dyYW0gSUQuCisgIEFkZCBkbXN0YXRzIC0tYXV4ZGF0YSBhbmQgLS1wcm9ncmFtaWQgYXJncyB0byBzcGVjaWZ5IGF1eCBkYXRhIGFuZCBwcm9ncmFtIElELgorICBBZGQgcmVwb3J0IHN0YXRzIHN1Yi1jb21tYW5kIHRvIHByb3ZpZGUgcmVwZWF0aW5nIHN0YXRzIHJlcG9ydHMuCisgIEFkZCBjbGVhciwgZGVsZXRlLCBsaXN0LCBhbmQgcHJpbnQgc3RhdHMgc3ViLWNvbW1hbmRzLgorICBBZGQgY3JlYXRlIHN0YXRzIHN1Yi1jb21tYW5kIGFuZCAtLXN0YXJ0LCAtLWxlbmd0aCwgLS1hcmVhcyBhbmQgLS1hcmVhc2l6ZS4KKyAgUmVjb2duaXplICdkbXN0YXRzJyBhcyBhbiBhbGlhcyBmb3IgJ2Rtc2V0dXAgc3RhdHMnIHdoZW4gcnVuIHdpdGggdGhpcyBuYW1lLgorICBBZGQgYSAnc3RhdHMnIGNvbW1hbmQgdG8gZG1zZXR1cCB0byBjb25maWd1cmUsIG1hbmFnZSBhbmQgcmVwb3J0IHN0YXRzIGRhdGEuCisgIEFkZCBzdGF0aXN0aWNzIGZpZWxkcyB0byBkbXNldHVwIC1vLgorICBBZGQgbGliZG0tc3RhdHMgbGlicmFyeSB0byBhbGxvdyBtYW5hZ2VtZW50IG9mIGRldmljZS1tYXBwZXIgc3RhdGlzdGljcy4KKyAgQWRkIC0tbm9zdWZmaXggdG8gc3VwcHJlc3MgZG1zZXR1cCB1bml0IHN1ZmZpeGVzIGluIHJlcG9ydCBvdXRwdXQuCisgIEFkZCAtLXVuaXRzIHRvIGNvbnRyb2wgZG1zZXR1cCByZXBvcnQgZmllbGQgb3V0cHV0IHVuaXRzLgorICBBZGQgc3VwcG9ydCB0byByZWRpc3BsYXkgY29sdW1uIGhlYWRpbmdzIGZvciByZXBlYXRpbmcgY29sdW1uIHJlcG9ydHMuCisgIEZpeCByZXBvcnQgaGVhZGVyIGFuZCByb3cgcmVzb3VyY2UgbGVha3MuCisgIFJlcG9ydCB0aW1lc3RhbXBzIG9mIGlvY3RscyB3aXRoIGRtc2V0dXAgLXZ2di4KKyAgUmVjb2duaXplIHJlcG9ydCBmaWVsZCBuYW1lIHZhcmlhbnRzIHdpdGhvdXQgYW55IHVuZGVyc2NvcmVzIHRvby4KKyAgQWRkIGRtc2V0dXAgLS1pbnRlcnZhbCBhbmQgLS1jb3VudCB0byByZXBlYXQgcmVwb3J0cyBhdCBzcGVjaWZpZWQgaW50ZXJ2YWxzLgorICBBZGQgZG1fdGltZXN0YW1wIGZ1bmN0aW9ucyB0byBsaWJkZXZtYXBwZXIuCisgIFJlY29nbmlzZSB2Zy9sdiBuYW1lIGZvcm1hdCBpbiBkbXNldHVwLgorICBNb3ZlIHNpemUgZGlzcGxheSBjb2RlIHRvIGxpYmRldm1hcHBlciBhcyBkbV9zaXplX3RvX3N0cmluZy4KKworVmVyc2lvbiAxLjAyLjEwMyAtIDI0dGggSnVseSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSW50cm9kdWNlIGxpYmRldm1hcHBlciB3cmFwcGVycyBmb3IgYWxsIG1hbGxvYy1yZWxhdGVkIGZ1bmN0aW9ucy4KKworVmVyc2lvbiAxLjAyLjEwMiAtIDd0aCBKdWx5IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEluY2x1ZGUgdG9vbC5oIGZvciBkZWZhdWx0IG5vbi1saWJyYXJ5IHVzZS4KKyAgSW50cm9kdWNlIGZvcm1hdCBtYWNyb3Mgd2l0aCBlbWJlZGRlZCAlIHN1Y2ggYXMgRk1UdTY0LgorCitWZXJzaW9uIDEuMDIuMTAxIC0gM3JkIEp1bHkgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IHRvIHBhc3NpbmcgbWVzc2FnZXMgaW4gc3VzcGVuZCB0cmVlLgorICBBZGQgZG1fcmVwb3J0X3ZhbHVlX2NhY2hlX3tzZXQsZ2V0fSB0byBzdXBwb3J0IGNhY2hpbmcgZHVyaW5nIHJlcG9ydC9zZWxlY3QuCisgIEFkZCBkbV9yZXBvcnRfcmVzZXJ2ZWRfaGFuZGxlciB0byBoYW5kbGUgcmVwb3J0IHJlc2VydmVkIHZhbHVlIGFjdGlvbnMuCisgIFN1cHBvcnQgZHluYW1pYyB2YWx1ZSBpbiBzZWxlY3Q6IERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9EWU5BTUlDX1ZBTFVFLgorICBTdXBwb3J0IGZ1enp5IG5hbWVzIGluIHNlbGVjdDogRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX0ZVWlpZX05BTUVTLgorICBUaGluIHBvb2wgdHJhY2UgbWVzc2FnZXMgc2hvdyBhIGRldmljZSBuYW1lIGFuZCBtYWpvcjptaW5vci4KKworVmVyc2lvbiAxLjAyLjEwMCAtIDMwdGggSnVuZSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHNpbmNlLCBhZnRlciwgdW50aWwgYW5kIGJlZm9yZSB0aW1lIG9wZXJhdG9ycyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbi4KKyAgQWRkIHN1cHBvcnQgZm9yIHRpbWUgaW4gcmVwb3J0cyBhbmQgc2VsZWN0aW9uOiBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FLgorICBTdXBwb3J0IHJlcG9ydCByZXNlcnZlZCB2YWx1ZSByYW5nZXM6IERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9SQU5HRS4KKyAgU3VwcG9ydCByZXBvcnQgcmVzZXJ2ZWQgdmFsdWUgbmFtZXM6IERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9OQU1FRC4KKyAgQWRkIERNX0NPTkZJR19WQUxVRV9GTVRfe0lOVF9PQ1RBTCxTVFJJTkdfTk9fUVVPVEVTfSBjb25maWcgdmFsdWUgZm9ybWF0IGZsYWcuCisgIEFkZCBETV9DT05GSUdfVkFMVUVfRk1UX0NPTU1PTl97QVJSQVksRVhUUkFfU1BBQ0V9IGNvbmZpZyB2YWx1ZSBmb3JtYXQgZmxhZy4KKyAgQWRkIGRtX2NvbmZpZ192YWx1ZV97Z2V0LHNldH1fZm9ybWF0X2ZsYWdzIHRvIGdldCBhbmQgc2V0IGNvbmZpZyB2YWx1ZSBmb3JtYXQuCisKK1ZlcnNpb24gMS4wMi45OSAtIDIwdGggSnVuZSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBOZXcgZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfcmVhZF9vbmx5KERNXzFfMDJfOTkpIGZvciByZWFkLW9ubHkgdGhpbiBwb29sLgorICBFbmhhbmNlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGluLXBvb2wgbWVzc2FnZSBmYWlscy4KKyAgRml4IGRtZXZlbnRkIGxvZ2dpbmcgdG8gYXZvaWQgdGhyZWFkZWQgdXNlIG9mIHN0YXRpYyB2YXJpYWJsZS4KKyAgUmVtb3ZlIHJlZHVuZGFudCBkbWV2ZW50ZCBTSUdBTFJNIGNvZGVkLgorCitWZXJzaW9uIDEuMDIuOTggLSAxMnRoIEp1bmUgMjAxNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtX3Rhc2tfZ2V0X2Vycm5vKCkgdG8gcmV0dXJuIGFueSB1bmV4cGVjdGVkIGVycm5vIGZyb20gYSBkbSBpb2N0bCBjYWxsLgorICBVc2UgY29weSBvZiBlcnJubyBtYWRlIGFmdGVyIGVhY2ggZG0gaW9jdGwgY2FsbCBpbiBjYXNlIGVycm5vIGNoYW5nZXMgbGF0ZXIuCisKK1ZlcnNpb24gMS4wMi45NyAtIDE1dGggTWF5IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTmV3IGRtX3Rhc2tfZ2V0X2luZm8oRE1fMV8wMl85Nykgc3VwcG9ydHMgaW50ZXJuYWxfc3VzcGVuZCBzdGF0ZS4KKyAgTmV3IHN5bWJvbHMgYXJlIHZlcnNpb25lZCBhbmQgY29tZXMgd2l0aCB2ZXJzaW9uZWQgc3ltYm9sIG5hbWUgKERNXzFfMDJfOTcpLgorCitWZXJzaW9uIDEuMDIuOTYgLSAybmQgTWF5IDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggc2VsZWN0aW9uIHRvIG5vdCBtYXRjaCBpZiB1c2luZyByZXNlcnZlZCB2YWx1ZSBpbiBjcml0ZXJpYSB3aXRoID4sPCw+PSw8LgorICBGaXggc2VsZWN0aW9uIHRvIG5vdCBtYXRjaCByZXNlcnZlZCB2YWx1ZXMgZm9yIHNpemUgZmllbGRzIGlmIHVzaW5nID4sPCw+PSw8LgorICBJbmNsdWRlIHV1aWQgb3IgZGV2aWNlIG51bWJlciBpbiBsb2cgbWVzc2FnZSBhZnRlciBpb2N0bCBmYWlsdXJlLgorICBBZGQgRE1fSU5URVJOQUxfU1VTUEVORF9GTEFHIHRvIGRtLWlvY3RsLmguCisgIEluc3RhbGwgYmxrZGVhY3RpdmF0ZSBzY3JpcHQgYW5kIGl0cyBtYW4gcGFnZSB3aXRoIG1ha2UgaW5zdGFsbF9kZXZpY2UtbWFwcGVyLgorCitWZXJzaW9uIDEuMDIuOTUgLSAxNXRoIE1hcmNoIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNYWtlZmlsZSByZWdlbmVyYXRlZC4KKworVmVyc2lvbiAxLjAyLjk0IC0gNHRoIE1hcmNoIDIwMTUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkIGZvciBnZW5lcmFsaXplZCBpbnRlcmZhY2UgZm9yIHJlcG9ydC9zZWxlY3QuCisKK1ZlcnNpb24gMS4wMi45MyAtIDIxc3QgSmFudWFyeSAyMDE1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZWR1Y2Ugc2V2ZXJpdHkgb2YgaW9jdGwgZXJyb3IgbWVzc2FnZSB3aGVuIGRtZXZlbnRkIHdhaXRldmVudCBpcyBpbnRlcnJ1cHRlZC4KKyAgUmVwb3J0ICd1bmtub3duIHZlcnNpb24nIHdoZW4gaW5jb21wYXRpYmxlIHZlcnNpb24gbnVtYmVycyB3ZXJlIG5vdCBvYnRhaW5lZC4KKyAgUmVwb3J0IG1vcmUgaW5mbyBmcm9tIHRoaW4gcG9vbCBzdGF0dXMgKG91dCBvZiBkYXRhLCBtZXRhZGF0YS1ybywgZmFpbCkuCisgIFN1cHBvcnQgZXJyb3JfaWZfbm9fc3BhY2UgZm9yIHRoaW4gcG9vbCB0YXJnZXQuCisgIEZpeCBzZWdmYXVsdCB3aGlsZSB1c2luZyBzZWxlY3Rpb24gd2l0aCByZWdleCBhbmQgdW5idWZmZXJlZCByZXBvcnRpbmcuCisgIEFkZCBkbV9yZXBvcnRfY29tcGFjdF9maWVsZHMgdG8gcmVtb3ZlIGVtcHR5IGZpZWxkcyBmcm9tIHJlcG9ydCBvdXRwdXQuCisgIFJlbW92ZSB1bmltcGxlbWVudGVkIGRtX3JlcG9ydF9zZXRfb3V0cHV0X3NlbGVjdGlvbiBmcm9tIGxpYmRldm1hcHBlci5oLgorCitWZXJzaW9uIDEuMDIuOTIgLSAyNHRoIE5vdmVtYmVyIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggbWVtb3J5IGNvcnJ1cHRpb24gd2l0aCBzb3J0aW5nIGVtcHR5IHN0cmluZyBsaXN0cyAoMS4wMi44NikuCisgIEZpeCBtYW4gZG1zZXR1cC44IHN5bnRheCB3YXJuaW5nIG9mIEdyb2ZmCisgIEFjY2VwdCB1bnF1b3RlZCBzdHJpbmdzIGFuZCAvIGluIHBsYWNlIG9mIHt9IHdoZW4gcGFyc2luZyBjb25maWdzLgorCitWZXJzaW9uIDEuMDIuOTEgLSAxMXRoIE5vdmVtYmVyIDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgY2FjaGUgY3JlYXRpb24gYW5kIGRtX2NvbmZpZ19ub2RlIHRvIHBhc3MgcG9saWN5LgorICBBbGxvdyBhY3RpdmF0aW9uIG9mIGFueSB0aGluLXBvb2wgaWYgdHJhbnNhY3Rpb25faWQgc3VwcGxpZWQgaXMgMC4KKyAgRG9uJ3QgcHJpbnQgdW5pbml0aWFsaXplZCBzdGFjayBieXRlcyB3aGVuIG5vbi1yb290IHVzZXMgZG1fY2hlY2tfdmVyc2lvbigpLgorICBGaXggc2VsZWN0aW9uIGNyaXRlcmlhIHRvIG5vdCBtYXRjaCByZXNlcnZlZCB2YWx1ZXMgd2hlbiB1c2luZyA+LCA8LCA+PSwgPC4KKyAgQWRkIERNX0xJU1RfSEVBRF9JTklUIG1hY3JvIHRvIGxpYmRldm1hcHBlci5oLgorICBGaXggZG1faXNfZG1fbWFqb3IgdG8gbm90IGlzc3VlIGVycm9yIGFib3V0IG1pc3NpbmcgL3Byb2MgbGluZXMgZm9yIGRtIG1vZHVsZS4KKworVmVyc2lvbiAxLjAyLjkwIC0gMXN0IFNlcHRlbWJlciAyMDE0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVzdG9yZSBwcm9wZXIgYnVmZmVyIHNpemUgZm9yIHBhcnNpbmcgbW91bnRpbmZvIGxpbmUgKDEuMDIuODkpCisKK1ZlcnNpb24gMS4wMi44OSAtIDI2dGggQXVndXN0IDIwMTQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSW1wcm92ZSBsaWJkZXZtYXBwZXItZXZlbnQgc2VsZWN0KCkgZXJyb3IgaGFuZGxpbmcuCisgIEFkZCBleHRyYSBjaGVjayBmb3IgbWF0Y2hpbmcgdHJhbnNhdGlvbl9pZCBhZnRlciBtZXNzYWdlIHN1Ym1pdHRpbmcuCisgIEFkZCBkbV9yZXBvcnRfZmllbGRfc3RyaW5nX2xpc3RfdW5zb3J0ZWQgZm9yIHN0ci4gbGlzdCByZXBvcnQgd2l0aG91dCBzb3J0aW5nLgorICBTdXBwb3J0IC0tZGVmZXJyZWQgd2l0aCBkbXNldHVwIHJlbW92ZSB0byBkZWZlciByZW1vdmFsIG9mIG9wZW4gZGV2aWNlcy4KKyAgVXBkYXRlIGRtLWlvY3RsLmggdG8gaW5jbHVkZSBETV9ERUZFUlJFRF9SRU1PVkUgZmxhZy4KKyAgQWRkIHN1cHBvcnQgZm9yIHNlbGVjdGlvbiB0byBtYXRjaCBzdHJpbmcgbGlzdCBzdWJzZXQsIHJlY29nbml6ZSB7IH0gb3BlcmF0b3IuCisgIEZpeCBzdHJpbmcgbGlzdCBzZWxlY3Rpb24gd2l0aCAnW3ZhbHVlXScgdG8gbm90IG1hdGNoIGxpc3QgdGhhdCdzIHN1cGVyc2V0LgorICBGaXggc3RyaW5nIGxpc3Qgc2VsZWN0aW9uIHRvIG1hdGNoIHdob2xlIHdvcmRzIG9ubHksIG5vdCBwcmVmaXhlcy4KKworVmVyc2lvbiAxLjAyLjg4IC0gNXRoIEF1Z3VzdCAyMDE0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtX3RyZWVfc2V0X29wdGlvbmFsX3V1aWRfc3VmZml4ZXMgdG8gaGFuZGxlIHVwZ3JhZGVzLgorCitWZXJzaW9uIDEuMDIuODcgLSAyM3JkIEp1bHkgMjAxNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdCB0byBoYW5kbGUgZGVsaW1pdGVyIHdpdGggbXVsdGlwbGUgY2hhcnMuCisgIEFkZCBkbV9yZXBvcnRfZmllbGRfcmVzZXJ2ZWRfdmFsdWUgZm9yIHBlci1maWVsZCByZXNlcnZlZCB2YWx1ZSBkZWZpbml0aW9uLgorCitWZXJzaW9uIDEuMDIuODYgLSAyM3JkIEp1bmUgMjAxNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTWFrZSAiaGVscCIgYW5kICI/IiByZXBvcnRpbmcgZmllbGRzIGltcGxpY2l0LgorICBSZWNvZ25pemUgaW1wbGljaXQgInNlbGVjdGVkIiBmaWVsZCBpZiB1c2luZyBkbV9yZXBvcnRfaW5pdF93aXRoX3NlbGVjdGlvbi4KKyAgQWRkIHN1cHBvcnQgZm9yIGltcGxpY2l0IHJlcG9ydGluZyBmaWVsZHMgd2hpY2ggYXJlIHByZWRlZmluZWQgaW4gbGliZG0uCisgIEFkZCBETV9SRVBPUlRfRklFTERfVFlQRV9QRVJDRU5UOiBzZXBhcmF0ZSBudW1iZXIgYW5kIHBlcmNlbnQgZmllbGRzLgorICBBZGQgZG1fcGVyY2VudF9yYW5nZV90LGRtX3BlcmNlbnRfdG9fZmxvYXQsZG1fbWFrZV9wZXJjZW50IHRvIGxpYmRtIGZvciByZXVzZS4KKyAgQWRkIGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSB0byBsaWJkZXZtYXBwZXIgZm9yIHJlc2VydmVkIHZhbHVlIGRlZmluaXRpb24uCisgIEFsc28gZGlzcGxheSBmaWVsZCB0eXBlcyB3aGVuIGxpc3RpbmcgYWxsIGZpZWxkcyBpbiBzZWxlY3Rpb24gaGVscC4KKyAgUmVjb2duaXplICJoZWxwIiBrZXl3b3JkIGluIHNlbGVjdGlvbiBzdHJpbmcgdG8gc2hvdyBicmllZiBoZWxwIGZvciBzZWxlY3Rpb24uCisgIEFsd2F5cyBvcmRlciBpdGVtcyByZXBvcnRlZCBhcyBzdHJpbmcgbGlzdCBmaWVsZCBsZXhpY29ncmFwaGljYWxseS4KKyAgQWRkIGRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdCB0byBsaWJkZXZtYXBwZXIgZm9yIGRpcmVjdCBzdHJpbmcgbGlzdCByZXBvcnQuCisgIEFkZCBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkdfTElTVDogc2VwYXJhdGUgc3RyaW5nIGFuZCBzdHJpbmcgbGlzdCBmaWVsZHMuCisgIEFkZCBkbV9zdHJfbGlzdCB0byBsaWJkZXZtYXBwZXIgZm9yIHN0cmluZyBsaXN0IHR5cGUgZGVmaW5pdGlvbiBhbmQgaXRzIHJldXNlLgorICBBZGQgZG1zZXR1cCAtUy8tLXNlbGVjdCB0byBkZWZpbmUgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBkbXNldHVwIHJlcG9ydHMuCisgIEFkZCBkbV9yZXBvcnRfaW5pdF93aXRoX3NlbGVjdGlvbiB0byBpbnRpYWxpemUgcmVwb3J0IHdpdGggc2VsZWN0aW9uIGNyaXRlcmlhLgorICBBZGQgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRTogc2VwYXJhdGUgbnVtYmVyIGFuZCBzaXplIHJlcG9ydGluZyBmaWVsZHMuCisgIFVzZSBSZW1vdmVPblN0b3AgZm9yIGRtLWV2ZW50LnNvY2tldCBzeXN0ZW1kIHVuaXQuCisgIERvY3VtZW50IGVudiB2YXIgJ0RNX0RFRkFVTFRfTkFNRV9NQU5HTElOR19NT0RFJyBpbiBkbXNldHVwIG1hbiBwYWdlLgorICBXYXJuIHVzZXIgYWJvdXQgaW5jb3JyZWN0IHVzZSBvZiBjb29raWUgd2l0aCAnZG1zZXR1cCByZW1vdmUgLS1mb3JjZScuCisgIEFsc28gcmVjb2duaXplICdoZWxwJy8nPycgYXMgcmVzZXJ2ZWQgc29ydCBrZXkgbmFtZSB0byBzaG93IGhlbHAuCisgIEFkZCBkbV91bml0c190b19mYWN0b3IgZm9yIHNpemUgdW5pdCBwYXJzaW5nLgorICBJbmNyZWFzZSBiaXRzZXQgc2l6ZSBmb3IgbWlub3JzIGZvciB0aGluIGRtZXZlbnRkIHBsdWdpbi4KKworVmVyc2lvbiAxLjAyLjg1IC0gMTB0aCBBcHJpbCAyMDE0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2hlY2sgZm9yIHNwcmludGYgZXJyb3Igd2hlbiBidWlsZGluZyBpbnRlcm5hbCBkZXZpY2UgcGF0aC4KKyAgQ2hlY2sgZm9yIHNwcmludGYgZXJyb3Igd2hlbiBjcmVhdGluZyBwYXRoIGZvciBkbSBjb250cm9sIG5vZGUuCisgIFdoZW4gYnVmZmVyIGZvciBkbV9nZXRfbGlicmFyeV92ZXJzaW9uKCkgaXMgdG9vIHNtYWxsLCByZXR1cm4gZXJyb3IgY29kZS4KKyAgQWx3YXlzIHJlaW5pdGlhbGl6ZSBfbmFtZV9tYW5nbGluZ19tb2RlIGluIGRtX2xpYl9pbml0KCkuCisgIEFkZCB0cmFja2luZyBmbGFnIGFib3V0IGltcGxpY2l0bHkgYWRkZWQgZGV2aWNlcyBpbnRvIGRtX3RyZWUuCisgIFN0b3AgdGltZW91dCB0aHJlYWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGFzdCB3b3JrZXIgdGhyZWFkIGlzIGZpbmlzaGVkLgorICBGaXggZG1ldmVudGQgbG9nZ2luZyB3aXRoIHBhcmFsbGVsIHdhaXQgZXZlbnQgcHJvY2Vzc2luZy4KKyAgUmV1c2UgX25vZGVfc2VuZF9tZXNzYWdlcygpIGZvciB2YWxpZGF0aW9uIG9mIHRyYW5zYWN0aW9uX2lkIGluIHByZWxvYWQuCisgIFRyYW5zYWN0aW9uX2lkIGNvdWxkIGJlIGxvd2VyIGJ5IG9uZSBvbmx5IHdoZW4gbWVzc2FnZXMgYXJlIHByZXBhcmVkLgorICBEbyBub3QgY2FsbCBjYWxsYmFjayB3aGVuIHByZWxvYWQgZmFpbHMuCisgIFdyYXAgaXNfc2VsaW51eF9lbmFibGVkKCkgdG8gYmUgY2FsbGVkIGp1c3Qgb25jZS4KKyAgVXNlIGNvcnJlY3RseSBzaWduZWQgNjRiIGNvbnN0YW50IHdoZW4gd29ya2luZyB3aXRoIHJhaWQgdm9sdW1lcy4KKyAgRXhpdCBkbWV2ZW50ZCB3aXRoIHBpZGZpbGUgY2xlYW51cCBpbnN0ZWFkIG9mIHJhaXNpbmcgU0lHS0lMTCBvbiBESUUgcmVxdWVzdC4KKyAgQWRkIG5ldyBETV9FVkVOVF9HRVRfUEFSQU1FVEVSUyByZXF1ZXN0IHRvIGRtZXZlbnRkIHByb3RvY29sLgorICBEbyBub3QgdXNlIHN5c3RlbWQncyByZWxvYWQgZm9yIGRtZXZlbnRkIHJlc3RhcnQsIHVzZSBkbWV2ZW50ZCAtUiBpbnN0ZWFkLgorICBEcm9wIGNyeXB0c2V0dXAgcnVsZXMgZnJvbSAxMC1kbS5ydWxlcyAtIGNyeXB0c2V0dXAgPj0gMS4xLjMgc2V0cyB0aGVtLgorCitWZXJzaW9uIDEuMDIuODQgLSAyMHRoIEphbnVhcnkgMjAxNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmV2ZXJ0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGVkIG5vZGVzIGlmIGEgbm9kZSBwcmVsb2FkIGNhbGxiYWNrIGZhaWxzLgorICBBdm9pZCBidXN5IGxvb3Bpbmcgb24gQ1BVIHdoZW4gZG1ldmVudGQgcmVhZHMgZXZlbnQgRE1fV0FJVF9SRVRSWS4KKyAgRW5zdXJlIGdsb2JhbCBtdXRleCBpcyBoZWxkIHdoZW4gd29ya2luZyB3aXRoIGRtZXZlbnRkIHRocmVhZC4KKyAgRHJvcCB0YWtpbmcgdGltZW91dCBtdXRleCBmb3IgdW4vcmVnaXN0ZXJpbmcgZG1ldmVudGQgbW9uaXRvci4KKyAgQWxsb3cgc2VjdGlvbiBuYW1lcyBpbiBjb25maWcgZmlsZSBkYXRhIHRvIGJlIHF1b3RlZCBzdHJpbmdzLgorICBDbG9zZSBmaWZvcyBiZWZvcmUgZXhpdGluZyBpbiBkbWV2ZW50ZCByZXN0YXJ0KCkgZXJyb3IgcGF0aC4KKyAgTW92ZSBwcmludGYgZm9ybWF0IHN0cmluZyBkaXJlY3RseSBpbnRvIGRtX2FzcHJpbnRmIGFyZ3MgbGlzdC4KKyAgQ2F0Y2ggaW52YWxpZCB1c2Ugb2Ygc3RyaW5nIHNvcnQgdmFsdWVzIHdoZW4gcmVwb3J0aW5nIG51bWVyaWNhbCBmaWVsZHMuCisKK1ZlcnNpb24gMS4wMi44MyAtIDEzdGggTm92ZW1iZXIgMjAxMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENvbnNpc3RlbnRseSByZXBvcnQgb24gc3RkZXJyIHdoZW4gZGV2aWNlIGlzIG5vdCBmb3VuZCBmb3IgZG1zZXR1cCBpbmZvLgorICBTa2lwIHJhY2UgZXJyb3JzIHdoZW4gbm9uLXVkZXYgZG1zZXR1cCBidWlsZCBydW5zIG9uIHVkZXYtZW5hYmxlZCBzeXN0ZW0uCisgIFNraXAgZXJyb3IgbWVzc2FnZSB3aGVuIGhvbGRlcnMgYXJlIG5vdCBwcmVzZW50IGluIHN5c2ZzLgorICBVc2UgX19saW51eF9fIGluc3RlYWQgb2YgbGludXggZGVmaW5lIHRvIG1ha2UgbGliZGV2bWFwcGVyLmggQyBjb21wbGlhbnQuCisgIFVzZSBtdXRleCB0byBhdm9pZCBwb3NzaWJsZSByYWNlIHdoaWxlIGNyZWF0aW5nL2Rlc3Ryb3lpbmcgbWVtb3J5IHBvb2xzLgorICBSZXF1aXJlIGxpYnB0aHJlYWQgdG8gYnVpbGQgbm93LgorCitWZXJzaW9uIDEuMDIuODIgLSA0dGggT2N0b2JlciAyMDEzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3Igc3Vic3lzdGVtIHVkZXYgZmxhZ3MgaW4gbGliZGV2bWFwcGVyIGZvciBlYXNpZXIgdXNlLgorICBNYWtlIHN1YnN5c3RlbSB1ZGV2IHJ1bGVzIHJlc3BvbnNpYmxlIGZvciBpbXBvcnRpbmcgRE1fU1VCU1lTVEVNX1VERVZfRkxBRyouCisKK1ZlcnNpb24gMS4wMi44MSAtIDIzcmQgU2VwdGVtYmVyIDIwMTMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGlkeSBkbWV2ZW50ZCBmaWZvIGluaXRpYWxpc2F0aW9uLgorCitWZXJzaW9uIDEuMDIuODAgLSAyMHRoIFNlcHRlbWJlciAyMDEzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERldGVjdCBpbnZhbGlkIHNlY3RvciBzdXBwbGllZCB0byAnZG1zZXR1cCBtZXNzYWdlJy4KKyAgRnJlZSBhbnkgcHJldmlvdXNseS1zZXQgc3RyaW5nIGlmIGEgZG1fdGFza19zZXRfKiBmdW5jdGlvbiBpcyBjYWxsZWQgYWdhaW4uCisgIERvIG5vdCBhbGxvdyBwYXNzaW5nIGVtcHR5IG5ldyBuYW1lIGZvciBkbXNldHVwIHJlbmFtZS4KKyAgRGlzcGxheSBhbnkgb3V0cHV0IHJldHVybmVkIGJ5ICdkbXNldHVwIG1lc3NhZ2UnLgorICBBZGQgZG1fdGFza19nZXRfbWVzc2FnZV9yZXNwb25zZSB0byBsaWJkZXZtYXBwZXIuCisKK1ZlcnNpb24gMS4wMi43OSAtIDEzdGggQXVndXN0IDIwMTMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ3JlYXRlIGRtZXZlbnRkIHRpbWVvdXQgdGhyZWFkcyBhcyAiZGV0YWNoZWQiIHNvIGV4aXQgc3RhdHVzIGlzIGZyZWVkLgorICBBZGQgRE1fQUJPUlRfT05fSU5URVJOQUxfRVJST1JTIGVudiB2YXIgc3VwcG9ydCB0byBhYm9ydCBvbiBpbnRlcm5hbCBlcnJvcnMuCisKK1ZlcnNpb24gMS4wMi43OCAtIDI0dGggSnVseSAyMDEzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQcm9jZXNzIHRoaW4gbWVzc2FnZXMgb25jZSB0byBhY3RpdmUgdGhpbiBwb29sIHRhcmdldCBmb3IgZG1fdHJlZS4KKyAgT3B0aW1pemUgb3V0IHNldHRpbmcgdGhlIHNhbWUgdmFsdWUgb3IgcmVhZF9haGVhZC4KKyAgQWRkIERNX0FSUkFZX1NJWkUgcHVibGljIG1hY3JvLgorICBNb3ZlIHN5c2xvZyBjb2RlIG91dCBvZiBzaWduYWwgaGFuZGxlIGluIGRtZXZlbnRkLgorICBBZGQgRE1fVE9fU1RSSU5HIHB1YmxpYyBtYWNyby4KKyAgQWx3YXlzIHJldHVybiBzdWNjZXNzIG9uIGRtZXZlbnRkIC1WIGNvbW1hbmQgY2FsbC4KKyAgRml4IHBhcnNpbmcgb2YgNjRiaXQgc25hcHNob3Qgc3RhdHVzIGluIGRtZXZlbnRkIHNuYXBzaG90IHBsdWdpbi4KKyAgQWRkIGRtX2dldF9zdGF0dXNfc25hcHNob3QoKSBmb3IgcGFyc2luZyBzbmFwc2hvdCBzdGF0dXMuCisgIERldGVjdGUgbW91bnRlZCBmcyBhbHNvIHZpYSByZWFkaW5nIC9wcm9jL3NlbGYvbW91bnRpbmZvLgorICBBZGQgZG1fbW91bnRpbmZvX3JlYWQoKSBmb3IgcGFyc2luZyAvcHJvYy9zZWxmL21vdW50aW5mby4KKyAgUmVwb3J0IGVycm9yIGZvciBub25leGlzdGluZyBkZXZpY2VzIGluIGRtZXZlbnRkIGNvbW11bmljYXRpb24uCisgIFByZXZlbnQgZG91YmxlIGZyZWUgZXJyb3IgYWZ0ZXIgZG1ldmVudGQgY2FsbCBvZiBfZmlsbF9kZXZpY2VfZGF0YSgpLgorICBVcGRhdGUgZG1ldmVudCBzdHJ1Y3R1cmUgbWVzc2FnZV9kYXRhIHRvIHNpbXBsaWZ5L2ZpeCBlcnJvciBwYXRoIGhhbmRsaW5nLgorICBWYWxpZGF0ZSBwYXNzZWQgcGFyYW1zIHRvIGRtX2dldF9zdGF0dXNfcmFpZC90aGluL3RoaW5fcG9vbCgpLiAKKyAgRml4ICdkbXNldHVwIHNwbGl0bmFtZSAtbycgdG8gbm90IGZhaWwgaWYgdXNlZCB3aXRob3V0ICctYycgc3dpdGNoICgxLjAyLjY4KS4KKyAgQWRkIGRtX2NvbmZpZ193cml0ZV97bm9kZV9vdXQvb25lX25vZGVfb3V0fSBmb3IgZW5oYW5jZWQgY29uZmlnIG91dHB1dC4KKyAgQWRkIGRtX2NvbmZpZ192YWx1ZV9pc19ib29sIHRvIGNoZWNrIGZvciBib29sZWFuIHZhbHVlIGluIHN1cHBvcnRlZCBmb3JtYXRzLgorICBGaXggY29uZmlnIG5vZGUgbG9va3VwIGluc2lkZSBlbXB0eSBzZWN0aW9ucyB0byBub3QgcmV0dXJuIHRoZSBzZWN0aW9uIGl0c2VsZi4KKyAgQXBwZW5kIGRpc2NhcmRzIGFuZCByZWFkLW9ubHkgZmllbGRzIHRvIGV4cG9ydGVkIHN0cnVjdCBkbV9zdGF0dXNfdGhpbl9wb29sLgorICBGaXggc2VnZmF1bHQgZm9yIHRydW5jYXRlZCBzdHJpbmcgdG9rZW4gaW4gY29uZmlnIGZpbGUgYWZ0ZXIgdGhlIGZpcnN0ICciJy4KKyAgQ2xvc2Ugb3BlbiBkbWV2ZW50ZCBGSUZPIGZpbGUgZGVzY3JpcHRvcnMgb24gZXhlYyAoRkRfQ0xPRVhFQykuCisgIEZpeCByZXNvdXJjZSBsZWFrIGluIGVycm9yIHBhdGggb2YgZG1ldmVudGQncyB1bW91bnQgb2YgdGhpbiB2b2x1bWUuCisgIEF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZSBmYWlsZWQgcHJlbG9hZGVkIGRtIHRyZWUgbm9kZS4KKyAgQWRkIERNX0RJU0FCTEVfVURFViBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtYW5hZ2UgZGV2IG5vZGVzIGJ5IGxpYmRtIG9ubHkuCisgIEZpeCBkbV90YXNrX3NldF9jb29raWUgdG8gcHJvcGVybHkgcHJvY2VzcyB1ZGV2IGZsYWdzIGlmIHVkZXZfc3luYyBkaXNhYmxlZC4KKworVmVyc2lvbiAxLjAyLjc3IC0gMTV0aCBPY3RvYmVyIDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFN1cHBvcnQgdW5tb3VudCBvZiB0aGluIHZvbHVtZXMgZnJvbSBwb29sIGFib3ZlIHRoaW4gcG9vbCB0aHJlc2hvbGQuCisgIFVwZGF0ZSBtYW4gcGFnZSB0byByZWZsZWN0IHRoYXQgZG0gVVVJRHMgYXJlIGJlaW5nIG1hbmdsZWQgYXMgd2VsbC4KKyAgQXBwbHkgJ2Rtc2V0dXAgbWFuZ2xlJyBmb3IgZG0gVVVJRHMgYmVzaWRlcyBkbSBuYW1lcy4KKyAgQWRkICdtYW5nbGVkX3V1aWQnIGFuZCAndW5tYW5nbGVkX3V1aWQnIGZpZWxkcyB0byBkbXNldHVwIGluZm8gLWMgLW8uCisgIE1hbmdsZSBkZXZpY2UgVVVJRCBvbiBkbV90YXNrX3NldF91dWlkL25ld3V1aWQgY2FsbCBpZiBuZWNlc3NhcnkuCisgIEFkZCBkbV90YXNrX2dldF91dWlkX21hbmdsZWQvdW5tYW5nbGVkIHRvIGxpYmRldm1hcHBlci4KKyAgQWx3YXlzIHJlc2V0IGRlbGF5X3Jlc3VtZV9pZl9uZXcgZmxhZyB3aGVuIHN0YWNraW5nIHRoaW4gcG9vbCBvdmVyIGFueXRoaW5nLgorICBEb24ndCBjcmVhdGUgdmFsdWUgZm9yIGRtX2NvbmZpZ19ub2RlIGFuZCByZXF1aXJlIGRtX2NvbmZpZ19jcmVhdGVfdmFsdWUgY2FsbC4KKyAgQ2hlY2sgZm9yIGV4aXN0aW5nIG5ld19uYW1lIGZvciBkbXNldHVwIHJlbmFtZS4KKyAgRml4IG1lbW9yeSBsZWFrIGluIGRtc2V0dXAgX2dldF9zcGxpdF9uYW1lKCkgZXJyb3IgcGF0aC4KKworVmVyc2lvbiAxLjAyLjc2IC0gN3RoIEF1Z3VzdCAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtX3Zhc3ByaW50ZiB0byBsaWJkZXZtYXBwZXIuCisgIEFsbG93IC0tbm9mbHVzaCB3aXRoIGRtc2V0dXAgc3RhdHVzIGFuZCB3YWl0IChmb3IgdGhpbiB0YXJnZXQpLgorICBBZGQgZG1fY29uZmlnX3dyaXRlX29uZV9ub2RlIHRvIGxpYmRldm1hcHBlci4KKyAgU3VwcG9ydCB0aGluIHBvb2wgbWVzc2FnZSByZWxlYXNlL3Jlc2VydmVfbWV0YWRhdGFfc25hcCBpbiBsaWJkZXZtYXBwZXIuCisgIFN1cHBvcnQgdGhpbiBwb29sIGRpc2NhcmRzIGFuZCBleHRlcm5hbCBvcmlnaW4gZmVhdHVyZXMgaW4gbGliZGV2bWFwcGVyLgorICBBZGQgY29uZmlndXJlIC0tZW5hYmxlLXVkZXYtcnVsZS1leGVjLWRldGVjdGlvbiB0byBkZXRlY3QgZXhlYyBwYXRoIGluIHJ1bGVzLgorICBVc2Ugc2JpbmRpciBpbiB1ZGV2IHJ1bGVzIGJ5IGRlZmF1bHQgYW5kIHJlbW92ZSBleGVjdXRhYmxlIHBhdGggZGV0ZWN0aW9uLgorICBSZW1vdmUgaGFyZC1jb2RlZCBwYXRocyBmb3IgZG1ldmVudGQgZmlmb3MgYW5kIHVzZSBkZWZhdWx0LWRtLXJ1bi1kaXIuCisgIEFkZCBjb25maWd1cmUgLS13aXRoLWx2bWV0YWQtcGlkZmlsZSB0byByZW1vdmUgaGFyZC1jb2RlZCB2YWx1ZS4KKyAgQWRkIGNvbmZpZ3VyZSAtLXdpdGgtZGVmYXVsdC1waWQtZGlyIGZvciBjb21tb24gZGlyZWN0b3J5IHdpdGggcGlkIGZpbGVzLgorICBBZGQgY29uZmlndXJlIC0td2l0aC1kZWZhdWx0LWRtLXJ1bi1kaXIgdG8gc2V0IHJ1biBkaXJlY3RvcnkgZm9yIGRtIHRvb2xzLgorICBEZXRlY3Qga2VybmVsX3NlbmQoKSBlcnJvcnMgaW4gY21pcnJvcmQuCisgIEFkZCBfX2F0dHJpYnV0ZV9fIGluc3RydW1lbnRhdGlvbiB0byBsaWJkZXZtYXBwZXIuaC4KKyAgUHJpbnQgY2xlYW5fYml0cyBpbnN0ZWFkIG9mIHN5bmNfYml0cyBpbiBwdWxsX3N0YXRlIGluIGNtaXJyb3JkLgorICBBZGQgdGVzdHMgZm9yIGVycm9ycyBmcm9tIGNsb3NlZGlyKCksIGNsb3NlKCkgaW4gY21pcnJvcmQuCisgIEFkZCBkb2N1bWVudGF0aW9uIHJlZmVyZW5jZXMgaW4gc3lzdGVtZCB1bml0cy4KKyAgUmVtb3ZlIHZlcml0eXNldHVwLiAgTm93IG1haW50YWluZWQgd2l0aCBjcnlwdHNldHVwLgorCitWZXJzaW9uIDEuMDIuNzUgLSA4dGggSnVuZSAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwc3RyZWFtIHNvdXJjZSByZXBvIG5vdyBmZWRvcmFob3N0ZWQub3JnIGdpdCBub3Qgc291cmNlcy5yZWRoYXQuY29tIENWUy4KKyAgUmVtb3ZlIHVuc3VwcG9ydGVkIHVkZXZfZ2V0X2Rldl9wYXRoIGxpYnVkZXYgY2FsbCB1c2VkIGZvciBjaGVja2luZyB1ZGV2IGRpci4KKyAgU2V0IGRlbGF5X3Jlc3VtZV9pZl9uZXcgb24gZGVwdHJlZSBzbmFwc2hvdCBvcmlnaW4uCisgIExvZyB2YWx1ZSBjaG9zZW4gaW4gX2ZpbmRfY29uZmlnX2Jvb2wgbGlrZSBvdGhlciB2YXJpYWJsZSB0eXBlcyBkby4KKyAgV2FpdCBmb3IgZG1ldmVudGQgdG8gZXhpdCBhZnRlciBzZW5kaW5nIGl0IERNX0VWRU5UX0NNRF9ESUUgd2hlbiByZXN0YXJ0aW5nLgorICBBcHBlbmQgJ1VzZWQnIHRvIHtCbGt9RGV2TmFtZXMvRGV2Tm9zIGRtc2V0dXAgcmVwb3J0IGhlYWRlcnMgZm9yIGNsYXJpdHkuCisgIEFkZCBjb25maWd1cmUgLS13aXRoLXZlcml0eXNldHVwIGZvciBpbmRlcGVuZGVudCB2ZXJpdHlzZXR1cCB0b29sLgorICBQcm9wZXJseSBzdXBwb3J0IHN1cHBsaWVkIGRtZXZlbnQgcGF0aCBpbiBkbV9ldmVudF9yZWdpc3Rlcl9oYW5kbGVyKCkuCisgIFJlbW92ZSBkbWV2ZW50ZCBmaWZvcyBvbiBleGl0IGlmIHRoZXkgYXJlIG5vdCBtYW5hZ2VkIGJ5IHN5c3RlbWQuCisgIFVzZSBTRF9BQ1RJVkFUSU9OIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHN5c3RlbWQgdW5pdHMgdG8gZGV0ZWN0IHN5c3RlbWQuCisgIE9ubHkgc3RhcnQgYSBuZXcgZG1ldmVudGQgaW5zdGFuY2Ugb24gcmVzdGFydCBpZiBvbmUgd2FzIGFscmVhZHkgcnVubmluZy4KKyAgRXh0ZW5kIHRoZSB0aW1lIHdhaXRlZCBmb3IgaW5wdXQgZnJvbSBkbWV2ZW50ZCBmaWZvIHRvIDUgc2Vjcy4gKDEuMDIuNzMpCisKK1ZlcnNpb24gMS4wMi43NCAtIDZ0aCBNYXJjaCAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDaGVjayBmb3IgbXVsdGlwbHktbWFuZ2xlZCBuYW1lcyBpbiBhdXRvIG1hbmdsaW5nIG1vZGUuCisgIEZpeCBkbV90YXNrX2dldF9uYW1lX3VubWFuZ2xlZCB0byBub3QgdW5tYW5nbGUgYWxyZWFkeSB1bm1hbmdsZWQgbmFtZS4KKyAgQ2hlY2sgd2hldGhlciBkZXZpY2UgbmFtZXMgYXJlIHByb3Blcmx5IG1hbmdsZWQgb24gaW9jdGwgcmV0dXJuLgorICBEZWFjdGl2YXRpb24gb2YgZmFpbGVkIHRoaW4gY2hlY2sgb24gdGhpbiBwb29sIHJldHVybnMgc3VjY2Vzcy4KKworVmVyc2lvbiAxLjAyLjczIC0gM3JkIE1hcmNoIDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRlc3QgX3RocmVhZF9yZWdpc3RyeSBsaXN0IHdpdGggaG9sZGluZyBtdXRleCBpbiBkbWV2ZW50ZC4KKyAgQWRkIGRtX3RyZWVfbm9kZV9zZXRfY2FsbGJhY2soKSBmb3IgcHJlbG9hZCBhbmQgZGVhY3RpdmF0aW9uIGhvb2tzLgorICBEcm9wIHVuc3VwcG9ydGVkIFRSSU0gbWVzc2FnZSBmb3IgdGhpbiBwb29sLgorICBJbXByb3ZlIGxvZ2dpbmcgZm9yIGZpZm8gc3RhcnR1cCBpbiBkbWV2ZW50ZC4KKyAgQmV0dGVyIGRldGVjdGlvbiBvZiBtaXNzaW5nIGRtZXZlbnRkIGZpZm8gY29ubmVjdGlvbiAoMS4wMi43MSkuCisgIEFkZCBhIGZldyBwb2ludGVyIHZhbGlkYXRpb25zIGluIGRtc2V0dXAuCisgIFN1cHBvcnQgZG1fdGFza19nZXRfZHJpdmVyX3ZlcnNpb24oKSBxdWVyeSB3aXRob3V0IHZlcnNpb24gc3RyaW5nLgorICBMb2cgZmFpbHVyZSBvZiBwdGhyZWFkX2pvaW4gd2hlbiBjbGVhbmluZyB1bnVzZWQgdGhyZWFkcyBpbiBkbWV2ZW50ZC4KKyAgRml4IGVtcHR5IHN0cmluZyB3YXJuaW5nIGxvZ2ljIGluIF9maW5kX2NvbmZpZ19zdHIuICgxLjAyLjY4KQorICBGaXggZG1fdGFza19zZXRfbmFtZSB0byBwcm9wZXJseSByZXNvbHZlIHBhdGggdG8gZG0gbmFtZSAoMS4wMi43MSkuCisgIEFkZCBkbV9zdHJuY3B5KCkgZnVuY3Rpb24gYXMgYSBmYXN0ZXIgc3RybmNweSgpIHJlcGxhY2VtZW50LgorCitWZXJzaW9uIDEuMDIuNzIgLSAyM3JkIEZlYnJ1YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBdm9pZCBtZW1vcnkgcmVhbGxvY2F0aW9uIGZvciBkbV9hc3ByaW50Zi4KKworVmVyc2lvbiAxLjAyLjcxIC0gMjB0aCBGZWJydWFyeSAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU3dpdGNoIHRvIHVzaW5nIGJ1aWx0LWluIGJsa2lkIGluIDEzLWRtLWRpc2sucnVsZXMuCisgIEFkZCAid2F0Y2giIHJ1bGUgdG8gMTMtZG0tZGlzay5ydWxlcy4KKyAgRGV0ZWN0IGZhaWxpbmcgZmlmbyBhbmQgc2tpcCAyMHMgcmV0cnkgY29tbXVuaWNhdGlvbiBwZXJpb2QuCisgIEFkZCBETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhbiBvdmVycmlkZS4KKyAgQWRkIGRtX2xpYl9pbml0IHRvIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGlzZSBkZXZpY2UtbWFwcGVyIGxpYnJhcnkgb24gbG9hZC4KKyAgUmVwbGFjZSBhbnkgJ1wnIGNoYXIgd2l0aCAnXFwnIGluIGRtIHRhYmxlIHNwZWNpZmljYXRpb24gb24gaW5wdXQuCisgIEFkZCBtYW5nbGUgY29tbWFuZCB0byBkbXNldHVwIHRvIHByb3ZpZGUgcmVuYW1pbmcgdG8gY29ycmVjdCBtYW5nbGVkIGZvcm0uCisgIEFkZCAnbWFuZ2xlZF9uYW1lJyBhbmQgJ3VubWFuZ2xlZF9uYW1lJyBmaWVsZHMgdG8gZG1zZXR1cCBpbmZvIC1jIC1vLgorICBBZGQgLS1tYW5nbGVuYW1lIG9wdGlvbiB0byBkbXNldHVwIHRvIHNlbGVjdCB0aGUgbmFtZSBtYW5nbGluZyBtb2RlLgorICBBZGQgZG1fdGFza19nZXRfbmFtZV9tYW5nbGVkL3VubWFuZ2xlZCB0byBsaWJkZXZtYXBwZXIuCisgIE1hbmdsZSBkZXZpY2UgbmFtZSBvbiBkbV90YXNrX3NldF9uYW1lL25ld25hbWUgY2FsbCBpZiBuZWNlc3NhcnkuCisgIEFkZCBkbV9zZXQvZ2V0X25hbWVfbWFuZ2xpbmdfbW9kZSB0byBzZXQvZ2V0IG5hbWUgbWFuZ2xpbmcgaW4gbGliZGV2bWFwcGVyLgorICBBZGQgY29uZmlndXJlIC0td2l0aC1kZWZhdWx0LW5hbWUtbWFuZ2xpbmcgZm9yIHVkZXYtZnJpZW5kbHkgZGV2IG5hbWUgY2hhcnNldC4KKyAgVGVzdCBmb3IgcGFyc2VkIHdvcmRzIGluIF91bW91bnQoKSBkbWV2ZW50ZCBzbmFwc2hvdCBwbHVnaW4uCisgIEZpeCBtZW1vcnkgbGVhayBpbiBmYWlsIHBhdGggb2YgcGFyc2VfbG9vcF9kZXZpY2VfbmFtZSgpIGluIGRtc2V0dXAuCisgIENoZWNrIGZvciBtaXNzaW5nIHJlcGx5X3V1aWQgaW4gZG1fZXZlbnRfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlKCkuCisgIENoZWNrIGZvciBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZG1ldmVudGQgcmVzdGFydCgpLgorICBBZGQgZmV3IG1pc3NpbmcgYWxsb2NhdGlvbiBmYWlsdXJlcyB0ZXN0cyBpbiBkbXNldHVwLgorICBGaXggcG90ZW50aWFsIHJpc2sgb2Ygd3JpdGluZyBpbiBmcm9udCBvZiBidWZmZXIgaW4gX3N5c2ZzX2dldF9kbV9uYW1lKCkuCisKK1ZlcnNpb24gMS4wMi43MCAtIDEydGggRmVicnVhcnkgMjAxMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBkbV9ldmVudF9nZXRfdmVyc2lvbigpIGNoZWNrLgorICBBZGQgcG9pbnRlciB0ZXN0IGZvciBkZXBlbmRlbmN5IGNoZWNrIGluIF9hZGRfZGV2KCkuCisgIFZhbGlkYXRlIG5hbWUgYW5kIHV1aWQgcGFyYW1zIG9mIGRtX3RyZWVfYWRkX25ld19kZXZfd2l0aF91ZGV2X2ZsYWdzKCkuCisgIERvIG5vdCBjcmFzaCBmb3IgZG1fcmVwb3J0X2luaXQoKSBzb3J0X2tleSA9PSBOVUxMIGFuZCBiZWhhdmUgbGlrZSAiIi4KKyAgUmV0dXJuIGVycm9yIGZvciBmYWlsaW5nIGFsbG9jYXRpb24gaW4gZG1fYXNwcmludGYoKS4KKyAgQWRkIG1pc3NpbmcgdGVzdCBmb3IgZmFpbGluZyBhbGxvY2F0aW9uIGluIGRtX3JlYWxsb2MoKSBjb2RlLgorICBBZGQgdGVzdCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMgaW4gcmVnZXggbWF0Y2hlciBjb2RlLgorICBTaW1wbGlmeSBkbV90YXNrX3NldF9nZW9tZXRyeSgpIGFuZCB1c2UgZG1fYXNwcmludGYoKS4KKyAgU2V0IGFsbCBwYXJhbWV0ZXJzIHRvIDAgZm9yIGRtX2dldF9uZXh0X3RhcmdldCgpIGZvciBOVUxMIHJldHVybi4KKyAgRml4IGZkIHJlc291cmNlIGxlYWsgaW4gZXJyb3IgcGF0aCBmb3IgX3VkZXZfbm90aWZ5X3NlbV9jcmVhdGUoKS4KKyAgTGVhdmUgc3BhY2UgZm9yICdcMCcgZm9yIHJlYWRsaW5lKCkgY2FsbCBpbiBfc3lzZnNfZ2V0X2tlcm5lbF9uYW1lKCkuCisKK1ZlcnNpb24gMS4wMi42OSAtIDFzdCBGZWJydWFyeSAyMDEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDbGVhbiB1cCBkbWV2ZW50ZCBzeXN0ZW1kIHVuaXQgb3JkZXJpbmcgYW5kIHJlcXVpcmVtZW50cy4KKworVmVyc2lvbiAxLjAyLjY4IC0gMjZ0aCBKYW51YXJ5IDIwMTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlc2V0IGFsbCBtZW1iZXJzIG9mIGluZm8gc3RydWN0IGluIGRtX3RyZWVfYWRkX25ld19kZXZfd2l0aF91ZGV2X2ZsYWdzLgorICBBZGQgZG1zZXR1cCB3aXBlX3RhYmxlIHRvIHJlcGxhY2UgdGFibGUgd2l0aCBvbmUgdGhhdCB1c2VzIGVycm9yIHRhcmdldC4KKyAgQWRkICdibGtkZXZuYW1lJyBhbmQgJ2Jsa2RldnNfdXNlZCcgZmllbGRzIHRvIGRtc2V0dXAgaW5mbyAtYyAtby4KKyAgQWRkICdibGtkZXZuYW1lJyBvcHRpb24gdG8gZG1zZXR1cCBscyAtLXRyZWUgdG8gc2VlIGJsb2NrIGRldmljZSBuYW1lcy4KKyAgQWRkIC1vIGRldm5vL2Jsa2Rldm5hbWUvZGV2bmFtZSB0byBkbXNldHVwIGRlcHMgYW5kIGxzLgorICBBZGQgZG1fZGV2aWNlX2dldF9uYW1lIHRvIGdldCBtYXAgbmFtZSBvciBibG9jayBkZXZpY2UgbmFtZSBmb3IgZ2l2ZW4gZGV2bm8uCisgIFJlbW92ZSBlbXB0eSBkZXZpY2VzIHdoZW4gY2xlYXJpbmcgbGVmdC1vdmVyIGluYWN0aXZlIHRhYmxlcyBpbiBkZXB0cmVlLgorICBBZGQgZG1fdXVpZF9wcmVmaXgvZG1fc2V0X3V1aWRfcHJlZml4IHRvIG92ZXJyaWRlIGhhcmQtY29kZWQgTFZNLSBwcmVmaXguCisgIEltcHJvdmUgZG1zZXR1cCBtYW4gcGFnZSBkZXNjcmlwdGlvbiBvZiByZWFkYWhlYWQgcGFyYW1ldGVyLgorICBVc2Ugc3lzZnMgdG8gc2V0L2dldCByZWFkYWhlYWQgaWYgcG9zc2libGUuCisgIEZpeCBsdm0yLW1vbml0b3IgaW5pdCBzY3JpcHQgdG8gdXNlIG5vcm1hbGl6ZWQgb3V0cHV0IHdoZW4gdXNpbmcgdmdzLgorICBBZGQgdGVzdCBmb3IgbWF4IGxlbmd0aCAoRE1fTUFYX1RZUEVfTkFNRSkgb2YgdGFyZ2V0IHR5cGUgbmFtZS4KKyAgSW5jbHVkZSBhIGNvcHkgb2Yga2VybmVsIERNIGRvY3VtZW50YXRpb24gaW4gZG9jL2tlcm5lbC4KKyAgSW1wcm92ZSBtYW4gcGFnZSBzdHlsZSBmb3IgZG1zZXR1cCBhbmQgbWVudGlvbiBtb3JlIHRhcmdldHMuCisgIEZpeCBfZ2V0X3Byb2NfbnVtYmVyIHRvIGJlIHRvbGVyYW50IG9mIG1hbGZvcm1lZCAvcHJvYy9taXNjIGVudHJpZXMuCisgIEZpeCBtaXNzaW5nIHRocmVhZCBsaXN0IG1hbmlwdWxhdGlvbiBwcm90ZWN0aW9uIGluIGRtZXZlbnRkLgorICBBZGQgRXhlY1JlbG9hZCB0byBkbS1ldmVudC5zZXJ2aWNlIGZvciBzeXN0ZW1kIHRvIHJlbG9hZCBkbWV2ZW50ZCBwcm9wZXJseS4KKyAgQWRkIGRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyX2FsbG93X2VtcHR5IGFuZCBkbV9jb25maWdfZmluZF9zdHJfYWxsb3dfZW1wdHkuCisgIEZpeCBjb21waWxlLXRpbWUgcG9vbCBtZW1vcnkgbG9ja2luZyB3aXRoIERFQlVHX01FTS4KKyAgRml4IHZhbGdyaW5kIGVycm9yIHJlcG9ydHMgaW4gZnJlZSBvZiBwb29sIGNodW5rcyB3aXRoIERFQlVHX01FTS4KKyAgQWxpZ24gc2l6ZSBvZiBzdHJ1Y3R1cmUgY2h1bmsgZm9yIGZhc3QgcG9vbCBhbGxvY2F0b3IgdG8gOCBieXRlcy4KKyAgU2ltcGxpZnkgc29tZSBwb2ludGVyIG9wZXJhdGlvbnMgaW4gZG1fZnJlZV9hdXgoKSBkZWJ1ZyBjb2RlLgorICBSZW1vdmUgdW51c2VkIGRiZ19tYWxsb2MuaCBmaWxlIGZyb20gc291cmNlIHRyZWUuCisgIENsZWFudXAgYmFja3RyYWNlcyBmb3IgX2NyZWF0ZV9hbmRfbG9hZF92NCgpLgorICBGaXggYWxpZ25tZW50IHdhcm5pbmcgaW4gYml0Y291bnQgY2FsY3VsYXRpb24gZm9yIHJhaWQgc2VnbWVudC4KKyAgQWxsb2NhdGUgZG1fdHJlZSBzdHJ1Y3R1cmUgZnJvbSBkbV90cmVlIHBvb2wuCisgIFVwZGF0ZSBkZWJ1ZyBsb2dnaW5nIGZvciBfcmVzdW1lX25vZGUuCisgIEFkZCBmdW5jdGlvbnMgdG8gc3VwcG9ydCB0aGluIHByb3Zpc2lvbmluZyB0YXJnZXQuCisgIEltcHJvdmUgbGliZG0tY29uZmlnIGVycm9yIHBhdGggcmVwb3J0aW5nLgorICBVcGRhdGUgZG1zZXR1cCByZXN1bWUgbWFuIHdpdGggLS1hZGRub2Rlb25yZXN1bWUvY3JlYXRlIG9wdGlvbnMuCisgIEFkZCBkZXBlbmRlbmN5IGZvciBkbSBtYW4gcGFnZXMgdG8gbWFuIHN1YmRpcmVjdG9yeSBtYWtlIGFsbCB0YXJnZXQuCisgIEFkZCBkbV90cmVlX3JldHJ5X3JlbW92ZSB0byB1c2UgcmV0cnkgbG9naWMgZm9yIGRldmljZSByZW1vdmFsIGluIGEgZG1fdHJlZS4KKyAgQWRkIGRtX2RldmljZV9oYXNfbW91bnRlZF9mcyBmbiB0byBjaGVjayBtb3VudGVkIGZpbGVzeXN0ZW0gb24gYSBkZXZpY2UuCisgIEFkZCBkbV9kZXZpY2VfaGFzX2hvbGRlcnMgZm4gdG8gdG8gY2hlY2sgdXNlIG9mIHRoZSBkZXZpY2UgYnkgYW5vdGhlciBkZXZpY2UuCisgIEFkZCBkbV9zeXNmc19kaXIgdG8gbGliZGV2bWFwcGVyIHRvIHJldHJpZXZlIHN5c2ZzIGxvY2F0aW9uIHNldC4KKyAgQWRkIGRtX3NldF9zeXNmc19kaXIgdG8gbGliZGV2bWFwcGVyIHRvIHNldCBzeXNmcyBsb2NhdGlvbi4KKyAgQWRkIC0tcmV0cnkgb3B0aW9uIGZvciBkbXNldHVwIHJlbW92ZSB0byByZXRyeSByZW1vdmFsIGlmIG5vdCBzdWNjZXNzZnVsLgorICBBZGQgZG1fdGFza19yZXRyeV9yZW1vdmUgZm4gdG8gdXNlIHJldHJ5IGxvZ2ljIGZvciBkZXZpY2UgcmVtb3ZhbC4KKyAgUmVtb3ZlIHVudXNlZCBwYXNzZWQgcGFyYW1ldGVycyBmb3IgX21pcnJvcl9lbWl0X3NlZ21lbnRfbGluZSgpLgorICBBZGQgZG1fY29uZmlnIGFuZCBzdHJpbmcgY2hhcmFjdGVyIGVzY2FwaW5nIGZ1bmN0aW9ucyB0byBsaWJkZXZtYXBwZXIuCisgIE1hcmsgdW5yZWxlYXNlZCBtZW1vcnkgcG9vbHMgYXMgaW50ZXJuYWwgZXJyb3IuCisKK1ZlcnNpb24gMS4wMi42NyAtIDE5dGggQXVndXN0IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtX3RyZWVfbm9kZV9hZGRfbnVsbF9hcmVhIGZvciB0ZW1wb3JhcmlseS1taXNzaW5nIHJhaWQgZGV2cyB0cmFja2VkLgorCitWZXJzaW9uIDEuMDIuNjYgLSAxMnRoIEF1Z3VzdCAyMDExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlbGVhc2UgZ2VvbWV0cnkgYnVmZmVyIGluIGRtX3Rhc2tfZGVzdHJveS4KKyAgVXBkYXRlIHVkZXYgcnVsZXMgdG8gc2tpcCBETSBmbGFncyBkZWNvZGluZyBmb3IgcmVtb3ZlZCBkZXZpY2VzLgorICBBZGQgY29tcGlsZS10aW1lIHBvb2wgbWVtb3J5IGxvY2tpbmcgb3B0aW9ucyAodG8gZGVidWcgc2hhcmVkIFZHIHN0cnVjdHMpLgorICBSZW1vdmUgZGV2aWNlIG5hbWUgcHJlZml4IGZyb20gZG1zZXR1cCBsaW5lIG91dHB1dCBpZiAtaiAmIC1tIG9yIC11IHN1cHBsaWVkLgorICBSZW1vdmUgc3VwcG9ydCBmb3IgdGhlIG9yaWdpbmFsIHZlcnNpb24gMSBkbSBpb2N0bHMuCisgIEFkZCBtaXNzaW5nIGNoZWNrIGZvciBhbGxvY2F0aW9uIGZhaWx1cmUgX2NyZWF0ZV9kaXJfcmVjdXJzaXZlKCkuCisgIEFkZCBzdXBwb3J0IGZvciBzeXN0ZW1kIGZpbGUgZGVzY3JpcHRvciBoYW5kb3ZlciBpbiBkbWV2ZW50ZC4KKyAgRml4IG1lbW9yeSBsZWFrIGluIGRtc2V0dXAgX21lc3NhZ2UoKSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBwYXRoLgorICBVc2UgbmV3IG9vbSBraWxsZXIgYWRqdXN0bWVudCBpbnRlcmZhY2UgKG9vbV9zY29yZV9hZGopIHdoZW4gYXZhaWxhYmxlLgorICBBZGQgc3lzdGVtZCB1bml0IGZpbGVzIGZvciBkbWV2ZW50ZC4KKyAgRml4IHJlYWQtb25seSBpZGVudGljYWwgdGFibGUgcmVsb2FkIHN1cHJlc3Npb24uCisKK1ZlcnNpb24gMS4wMi42NSAtIDh0aCBKdWx5IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIGRldiBuYW1lIHByZWZpeCBmcm9tIGRtc2V0dXAgbGluZSBvdXRwdXQgaWYgZXhhY3RseSBvbmUgZGV2IHJlcXVlc3RlZC4KKyAgUmVwb3J0IGludGVybmFsIGVycm9yIGlmIHN1c3BlbmRpbmcgYSBkZXZpY2UgdXNpbmcgYW4gYWxyZWFkeS1zdXNwZW5kZWQgZGV2LgorICBSZXBvcnQgZXJyb3IgaWYgYSB0YWJsZSBsb2FkIHJlcXVpcmluZyB0YXJnZXQgcGFyYW1ldGVycyBoYXMgbm9uZSBzdXBwbGllZC4KKyAgQWRkIGRtc2V0dXAgLS1jaGVja3MgYW5kIGRtX3Rhc2tfZW5hYmxlX2NoZWNrcyBmcmFtZXdvcmsgdG8gdmFsaWRhdGUgaW9jdGxzLgorICBBZGQgYWdlX2luX21pbnV0ZXMgcGFyYW1ldGVyIHRvIGRtc2V0dXAgdWRldmNvbXBsZXRlX2FsbC4KKyAgUmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gZG1fbGliX2V4aXQoKSBpZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgIERpc2FibGUgdWRldiBmYWxsYmFjayBieSBkZWZhdWx0IGFuZCBhZGQgLS12ZXJpZnl1ZGV2IG9wdGlvbiB0byBkbXNldHVwLgorICBSZXBvcnQgaW50ZXJuYWwgZXJyb3IgaWYgYW55IHRhYmxlIGlzIGxvYWRlZCB3aGlsZSBhbnkgZGV2IGlzIGtub3duIHN1c3BlbmRlZC4KKyAgQWRkIGRtX2dldF9zdXNwZW5kZWRfY291bnRlcigpIGZvciBudW1iZXIgb2YgZGV2cyBpbiBzdXNwZW5kZWQgc3RhdGUgYnkgbGliLgorICBGaXggImFsbCIgcmVwb3J0IGZpZWxkIHByZWZpeCBtYXRjaGluZyB0byBpbmNsdWRlIGxhYmVsIGZpZWxkcyB3aXRoIHB2X2FsbC4KKyAgRGVsYXkgcmVzdW1pbmcgbmV3IHByZWxvYWRlZCBtaXJyb3IgZGV2aWNlcyB3aXRoIGNvcmUgbG9ncyBpbiBkZXB0cmVlIGNvZGUuCisgIEFjY2VwdCBuZXcga2VybmVsIHZlcnNpb24gMyB1bmFtZSBmb3JtYXRzIGluIGluaXRpYWxpc2F0aW9uLgorCitWZXJzaW9uIDEuMDIuNjQgLSAyOXRoIEFwcmlsIDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVxdWlyZSBsaWJ1ZGV2ID49IDE0MyB3aGVuIGNvbXBpbGluZyB3aXRoIHVkZXYgc3VwcG9ydC4KKyAgVXNlIHdvcmQgYWxpZ25tZW50IGZvciBkbV9wb29sX3N0cmR1cCgpIGFuZCBkbV9wb29sX3N0cm5kdXAoKS4KKyAgVXNlIGRtX3NucHJpbnRmKCkgdG8gZml4IHNpZ25lZG5lc3Mgd2FybmluZyBpbiBkbV9zZXRfZGV2X2RpcigpLgorICBVc2UgdW5zaWduZWQgbG9vcCBjb3VudGVyIHRvIGZpeCBzaWduZWRuZXNzIHdhcm5pbmcgaW4gX290aGVyX25vZGVfb3BzKCkuCisgIEZpeCBjb25zdCBjYXN0IGluIGRtc2V0dXAgY2FsbHMgb2YgZG1fcmVwb3J0X2ZpZWxkX3N0cmluZygpLgorICBTdHJlYW1saW5lIC9kZXYvbWFwcGVyL2NvbnRyb2wgbm9kZSBjb2RlIGZvciBjb21tb24gY2FzZXMuCisgIFVzZSBoYXJkLWNvZGVkIGRtIGNvbnRyb2wgbm9kZSBkZXZpY2UgbnVtYmVyIGZvciAyLjYuMzYga2VybmVscyBhbmQgYWJvdmUuCisgIEltcHJvdmUgc3RhY2sgZGVidWcgcmVwb3J0aW5nIGluIGRtX3Rhc2tfY3JlYXRlKCkuCisgIEZhbGxiYWNrIHRvIGNvbnRyb2wgbm9kZSBjcmVhdGlvbiBvbmx5IGlmIG5vZGUgZG9lc24ndCBleGlzdCB5ZXQuCisgIENoYW5nZSBkbV9oYXNoIGJpbmFyeSBmdW5jdGlvbnMgdG8gdGFrZSB2b2lkICprZXkgaW5zdGVhZCBvZiBjaGFyICouCisgIEZpeCB1bmluaXRpYWxpc2VkIG1lbW9yeSB1c2Ugd2l0aCBlbXB0eSBwYXJhbXMgaW4gX3JlbG9hZF93aXRoX3N1cHByZXNzaW9uX3Y0LgorICBMb3dlciBzZXZlcml0eSBvZiBzZWxhYmVsX2xvb2t1cCBhbmQgbWF0Y2hwYXRoY29uIGZhaWx1cmUgdG8gbG9nX2RlYnVnLgorICBBZGQgdGVzdCBmb3IgZmFpbGVkIGFsbG9jYXRpb24gZnJvbSBkbV90YXNrX3NldF91dWlkKCkgaW4gZG1ldmVudGQuCisgIEFkZCBkbV9ldmVudF9nZXRfdmVyc2lvbiB0byBkbWV2ZW50ZCBmb3IgdXNlIHdpdGggLVIuCisgIEF2b2lkIGRtZXZlbnRkIGNvcmUgZHVtcHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0IHdpdGggdW5rbm93biBjb21tYW5kIElELgorICBIYXZlIGRtZXZlbnRkIC1SIHN0YXJ0IHVwIGV2ZW4gd2hlbiBubyBleGlzdGluZyBjb3B5IGlzIHJ1bm5pbmcuCisgIEFjY2VwdCBtdWx0aXBsZSBtYXBwZWQgZGV2aWNlIG5hbWVzIG9uIG1hbnkgZG1zZXR1cCBjb21tYW5kIGxpbmVzLgorICBGaXggZG1fdWRldl93YWl0IGNhbGxzIGluIGRtc2V0dXAgdG8gb2NjdXIgYmVmb3JlIHJlYWRhaGVhZCBkaXNwbGF5IG5vdCBhZnRlci4KKyAgSW5jbHVkZSBhbiBpbXBsaWNpdCBkbV90YXNrX3VwZGF0ZV9ub2RlcygpIHdpdGhpbiBkbV91ZGV2X3dhaXQoKS4KKyAgRml4IF9jcmVhdGVfYW5kX2xvYWRfdjQgbm90IHRvIGxvc2UgdGhlIC0tYWRkbm9kZW9uY3JlYXRlIHNldHRpbmcgKDEuMDIuNjIpLgorICBBZGQgaW5hY3RpdmUgdGFibGUgcXVlcnkgc3VwcG9ydCBmb3Iga2VybmVsIGRyaXZlciA+PSA0LjExLjYgKFJIRUwgNS43KS4KKyAgTG9nIGRlYnVnIG9wZW5fY291bnQgaW4gX25vZGVfaGFzX2Nsb3NlZF9wYXJlbnRzKCkuCisgIEFkZCBhIGNvbnN0IHRvIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcoKSBkYXRhIHBhcmFtZXRlci4KKworVmVyc2lvbiAxLjAyLjYzIC0gOXRoIEZlYnJ1YXJ5IDIwMTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFJlaW5zdGF0ZSBERUJVR19NRU0gYXMgaXQncyBwYXJ0IG9mIHRoZSBBUEkuICgxLjAyLjYyKQorCitWZXJzaW9uIDEuMDIuNjIgLSA0dGggRmVicnVhcnkgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGNvbmZpZ3VyZSAtLXdpdGgtZGV2aWNlLW5vZGVzLW9uPWNyZWF0ZSBmb3IgcHJldmlvdXMgYmVoYXZpb3VyLgorICBNb3ZlIGNyZWF0aW9uIG9mIGRldmljZSBub2RlcyBmcm9tICdjcmVhdGUnIHRvICdyZXN1bWUnLgorICBBZGQgLS1hZGRub2Rlb25yZXN1bWUgYW5kIC0tYWRkbm9kZW9uY3JlYXRlIG9wdGlvbnMgdG8gZG1zZXR1cC4KKyAgQWRkIGRtX3Rhc2tfc2V0X2FkZF9ub2RlIHRvIGxpYmRldm1hcHBlciB0byBjb250cm9sIGRldiBub2RlIGNyZWF0aW9uIHRpbWUuCisgIEFkZCBkbV90YXNrX3NlY3VyZV9kYXRhIHRvIGxpYmRldm1hcHBlciB0byB3aXBlIGlvY3RsIGJ1ZmZlcnMgaW4ga2VybmVsLgorICBMb2cgZGVidWcgbWVzc2FnZSB3aGVuIGV4cGVjdGVkIHVldmVudCBpcyBub3QgZ2VuZXJhdGVkLgorICBPbmx5IGNvbXBpbGUgbWVtb3J5IGRlYnVnZ2luZyBjb2RlIHdoZW4gREVCVUdfTUVNIGlzIHNldC4KKyAgU2V0IERNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHIGZvciBzdXNwZW5kZWQgRE0gZGV2aWNlcyBpbiB1ZGV2IHJ1bGVzLgorICBCZWdpbiBhIG5ldyBwb29sIG9iamVjdCBmb3IgZWFjaCByb3cgaW4gX291dHB1dF9hc19yb3dzKCkgY29ycmVjdGx5LgorCitWZXJzaW9uIDEuMDIuNjEgLSAxMHRoIEphbnVhcnkgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIERNX0NPT0tJRV9BVVRPX0NSRUFURSB0byBsaWJkZXZtYXBwZXIuaC4KKyAgRXhwb3J0IERNX0NPTlRST0xfTk9ERV9VTUFTSyBhbmQgdXNlIGl0IHdoaWxlIGNyZWF0aW5nIC9kZXYvbWFwcGVyL2NvbnRyb2wuCisKK1ZlcnNpb24gMS4wMi42MCAtIDIwdGggRGVjZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENoZWNrIGZvciB1bmxpbmsgZmFpbHVyZSBpbiByZW1vdmVfbG9ja2ZpbGUoKSBpbiBkbWV2ZW50ZC4KKyAgVXNlIGRtX2ZyZWUgZm9yIGRtX21hbGxvYy1lZCBhcmVhcyBpbiBfY2xvZ19jdHIvX2Nsb2dfZHRyIGluIGNtaXJyb3JkLgorICBVc2UgY2hhciogYXJpdGhtZXRpYyBpbiBfcHJvY2Vzc19hbGwoKSAmIF90YXJnZXRzKCkgaW4gZG1zZXR1cC4KKyAgQ2hhbmdlIGRtX3JlZ2V4X2NyZWF0ZSgpIEFQSSB0byBhY2NlcHQgY29uc3QgY2hhciAqIGNvbnN0ICpwYXR0ZXJucy4KKyAgQWRkIG5ldyBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dCBmbiB0byBsaWJkZXZtYXBwZXIgYW5kIHVzZSBpdCB0aHJvdWdob3V0LgorICBEZXRlY3QgZXhpc3RlbmNlIG9mIG5ldyBTRUxpbnV4IHNlbGFiZWwgaW50ZXJmYWNlIGR1cmluZyBjb25maWd1cmUuCisKK1ZlcnNpb24gMS4wMi41OSAtIDZ0aCBEZWNlbWJlciAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgYmFja3RyYWNlcyB0byBfcHJvY2Vzc19tYXBwZXJfZGlyIGFuZCAgX2NyZWF0ZV9hbmRfbG9hZF92NCBlcnJvciBwYXRocy4KKyAgUmVtb3ZlIHN1cGVyZmx1b3VzIGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBkbV9mcmVlLgorCitWZXJzaW9uIDEuMDIuNTggLSAyMm5kIE5vdmVtYmVyIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggX291dHB1dF9maWVsZCBjcmFzaCBmcm9tIGZpZWxkX2lkIGZyZWUgd2l0aCBERUJVR19NRU0uICgxLjAyLjU3KQorCitWZXJzaW9uIDEuMDIuNTcgLSA4dGggTm92ZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHJlZ2V4IG9wdGltaXNlciBub3QgdG8gaWdub3JlIFJIUyBvZiBPUiBub2RlcyBpbiBfZmluZF9sZWZ0bW9zdF9jb21tb24uCisgIEFkZCBkbWV2ZW50ZCAtUiB0byByZXN0YXJ0IGRtZXZlbnRkIHdpdGhvdXQgbG9zaW5nIG1vbml0b3Jpbmcgc3RhdGUuICgxLjAyLjU2KQorICBGaXggbWVtb3J5IGxlYWsgb2YgZmllbGRfaWQgaW4gX291dHB1dF9maWVsZCBmdW5jdGlvbi4KKyAgQWxsb2NhdGUgYnVmZmVyIGZvciByZXBvcnRpbmcgZnVuY3Rpb25zIGR5bmFtaWNhbGx5IHRvIHN1cHBvcnQgbG9uZyBvdXRwdXRzLgorCitWZXJzaW9uIDEuMDIuNTYgLSAyNXRoIE9jdG9iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmV0dXJuIGNvbnN0IHBvaW50ZXIgZnJvbSBkbV9iYXNlbmFtZSgpIGluIGxpYmRldm1hcHBlci4KKyAgSW1wbGVtZW50IGRtZXZlbnRkIC1SIHRvIHJlc3RhcnQgd2l0aG91dCBzdGF0ZSBsb3NzLgorICBBZGQgZG1femFsbG9jIGFuZCB1c2UgaXQgYW5kIGRtX3Bvb2xfemFsbG9jIHRocm91Z2hvdXQuCisgIEFkZCAtLXNldHV1aWQgdG8gZG1zZXR1cCByZW5hbWUuCisgIEFkZCBkbV90YXNrX3NldF9uZXd1dWlkIHRvIHNldCB1dWlkIG9mIG1hcHBlZCBkZXZpY2UgcG9zdC1jcmVhdGlvbi4KKworVmVyc2lvbiAxLjAyLjU1IC0gMjR0aCBTZXB0ZW1iZXIgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggdGhlIHdheSByZWdpb25zIGFyZSBtYXJrZWQgY29tcGxldGUgdG8gYXZvaWQgc2xvdyAtLW5vc3luYyBjbWlycm9yIEkvTy4KKyAgQWRkIERNX1JFUE9SVF9GSUVMRF9UWVBFX0lEX0xFTiB0byBsaWJkZXZtYXBwZXIuaC4KKworVmVyc2lvbiAxLjAyLjU0IC0gMTh0aCBBdWd1c3QgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZG0tbW9kIGF1dG9sb2FkaW5nIGxvZ2ljIHRvIG5vdCBhc3N1bWUgY29udHJvbCBub2RlIGlzIHNldCBjb3JyZWN0bHkuCisgIEFkZCBkbWV2ZW50ZC9leGVjdXRhYmxlIHRvIGx2bS5jb25mIHRvIHRlc3QgYWx0ZXJuYXRpdmUgZG1ldmVudGQuCisgIEV4cG9ydCBkbV9ldmVudF9oYW5kbGVyX3NldF9kbWV2ZW50ZF9wYXRoIHRvIG92ZXJyaWRlIGJ1aWx0LWluIGRtZXZlbnRkIHBhdGguCisgIEdlbmVyYXRlIGxpYmRldm1hcHBlci1ldmVudCBleHBvcnRlZCBzeW1ib2xzLgorICBSZW1vdmUgc3VwZXJmbHVvdXMgTlVMTCBwb2ludGVyIHRlc3RzIGJlZm9yZSBkbV9mcmVlIGZyb20gZG1ldmVudGQuCisgIEFzc3VtZSBkbS1tb2QgYXV0b2xvYWRpbmcgc3VwcG9ydCBpcyBpbiBrZXJuZWwgMi42LjM2IGFuZCBoaWdoZXIsIG5vdCAyLjYuMzUuCisgIEZpeCB1ZGV2IHJ1bGVzIHRvIHN1cHBvcnQgdWRldiBkYXRhYmFzZSBjb250ZW50IGdlbmVyYXRlZCBieSBvbGRlciBydWxlcy4KKyAgUmVpbnN0YXRlIGRldGVjdGlvbiBvZiBpbmFwcHJvcHJpYXRlIHVldmVudCB3aXRoIERJU0tfUk8gc2V0IGFuZCBzdXBwcmVzcyBpdC4KKyAgRml4IHJlZ2V4IHR0cmVlIG9mZi1ieS1vbmUgZXJyb3IuCisgIEFkZCAtLWVuYWJsZS12YWxncmluZC1wb29sIHRvIGNvbmZpZ3VyZS4KKyAgRml4IHNlZ2ZhdWx0IGluIHJlZ2V4IG1hdGNoZXIgd2l0aCBjaGFyYWN0ZXJzIG9mIG9yZGluYWwgdmFsdWUgPiAxMjcuCisgIEZpeCAndm9pZConIGFyaXRobWV0aWMgd2FybmluZ3MgaW4gZGJnX21hbGxvYy5jIGFuZCBsaWJkbS1pZmFjZS5jLgorICBXYWl0IGZvciBub2RlIGNyZWF0aW9uIGJlZm9yZSBkaXNwbGF5aW5nIGRlYnVnIGluZm8gaW4gZG1zZXR1cC4KKyAgRml4IHJldHVybiBzdGF0dXMgMCBmb3IgImRtc2V0dXAgaW5mbyAtYyAtbyBoZWxwIi4KKyAgQWRkIGNoZWNrIGZvciBrZXJuZWwgc2VtYXBob3JlIHN1cHBvcnQgYW5kIGRpc2FibGUgdWRldl9zeW5jIGlmIG5vdCBhdmFpbGFibGUuCisKK1ZlcnNpb24gMS4wMi41MyAtIDI4dGggSnVseSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXZlcnQgZmFpbGVkIHRhYmxlIGxvYWQgcHJlcGFyYXRpb24gYWZ0ZXIgImNyZWF0ZSwgbG9hZCBhbmQgcmVzdW1lIi4KKyAgU3dpdGNoIGRtZXZlbnRkIHRvIHVzZSBkbV9jcmVhdGVfbG9ja2ZpbGUgYW5kIGRyb3AgZHVwbGljYXRlIGNvZGUuCisgIEFkZCBkbV9jcmVhdGVfbG9ja2ZpbGUgdG8gbGliZG0gdG8gaGFuZGxlIHBpZGZpbGVzIGZvciBhbGwgZGFlbW9ucy4KKyAgUmVwbGFjZSBsb29rdXAgd2l0aCBuZXh0IGluIHN0cnVjdCBkZmFfc3RhdGUgJiBjYWxjdWxhdGUgc3RhdGVzIG9uIGRlbWFuZC4KKyAgSW1wcm92ZSB0aGUgcmVnZXggbWF0Y2hlciwgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBjaGFyc2V0IG5vZGVzIHVzZWQuCisgIEFkZCBkbV9yZWdleF9maW5nZXJwcmludCB0byBmYWNpbGl0YXRlIHJlZ2V4IHRlc3RpbmcuCisgIFNraXAgZmZzKDApIGluIF90ZXN0X3dvcmQgaW4gYml0c2V0IGZ1bmN0aW9ucy4KKyAgVXNlICJub3dhdGNoIiB1ZGV2IHJ1bGUgZm9yIGluYXBwcm9wcmlhdGUgZGV2aWNlcy4KKworVmVyc2lvbiAxLjAyLjUyIC0gNnRoIEp1bHkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZG1sb3NldHVwIHNucHJpbnRmICVsbHUgY29tcGlsZXIgd2FybmluZy4KKyAgQWRkIHBhcmVudGhlc2VzIHRvIHNvbWUgbGliZGV2bWFwcGVyLmggbWFjcm8gYXJndW1lbnRzLgorICBBZGQgcHJpbnRmIGZvcm1hdCBhdHRyaWJ1dGVzIHRvIGRtX3tzbixhc31wcmludGYgYW5kIGZpeCBhIGNhbGxlci4KKyAgTW92ZSBkbWV2ZW50ZCBtYW4gcGFnZSBmcm9tIGluc3RhbGxfbHZtMiB0byBpbnN0YWxsX2RldmljZS1tYXBwZXIuICgxLjAyLjUwKQorCitWZXJzaW9uIDEuMDIuNTEgLSAzMHRoIEp1bmUgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgR2VuZXJhdGUgbGliZGV2bWFwcGVyIGV4cG9ydGVkIHN5bWJvbHMgZnJvbSBoZWFkZXIgZmlsZS4KKworVmVyc2lvbiAxLjAyLjUwIC0gMjNyZCBKdW5lIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBJTlRFUk5BTF9FUlJPUiB0eXBvIGluIGlvY3RsIGlmYWNlIHVua25vd24gdGFzayBtZXNzYWdlLgorICBGaXggdWRldiBydWxlcyB0byBoYW5kbGUgc3B1cmlvdXMgZXZlbnRzIHByb3Blcmx5LgorICBVc2UgQzk5IFtdIG5vdCBbMF0gaW4gZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCB0byBhdm9pZCBhYm9ydCB3aGVuIGZvcnRpZmllZC4KKyAgQWxsb3cgdXNlIG9mIGRldm1hcHBlciBoZWFkZXIgZmlsZSBpbiBDKysgbW9kZSAoZXh0ZXJuICJDIiBhbmQgX190eXBlb2ZfXykuCisgIEFkZCBkbWV2ZW50ZCBtYW4gcGFnZS4KKworVmVyc2lvbiAxLjAyLjQ5IC0gNHRoIEp1bmUgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBTdXBwb3J0IGF1dG9sb2FkaW5nIG9mIGRtLW1vZCBtb2R1bGUgZm9yIGtlcm5lbHMgZnJvbSAyLjYuMzUuCisgIERvY3VtZW50ICdjbGVhcicgaW4gZG1zZXR1cCBtYW4gcGFnZS4KKyAgRml4IHNlbWN0bCBwYXJhbWV0ZXIgKHVuaW9uKSB0byBhdm9pZCBtaXNhbGlnbmVkIHBhcmFtZXRlciBvbiBzb21lIGFyY2hlcy4KKyAgQWRkIGRtX3RyZWVfbm9kZV9zZXRfcHJlc3VzcGVuZF9ub2RlKCkgdG8gcHJlc3VzcGVuZCBjaGlsZCB3aGVuIGRlYWN0aXZhdGluZy4KKyAgSW5pdGlhbCBzdXBwb3J0IGZvciByZXBsaWNhdG9yIHRhcmdldC4KKworVmVyc2lvbiAxLjAyLjQ4IC0gMTd0aCBNYXkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXNlIC1kIHRvIGNvbnRyb2wgbGV2ZWwgb2YgbWVzc2FnZXMgc2VudCB0byBzeXNsb2cgYnkgZG1ldmVudGQuCisgIENoYW5nZSAtZCB0byAtZiB0byBydW4gZG1ldmVudGQgaW4gZm9yZWdyb3VuZC4KKyAgRG8gbm90IHByaW50IGVuY3J5cHRpb24ga2V5IGluIG1lc3NhZ2UgZGVidWcgb3V0cHV0IChjcnlwdHNldHVwIGx1a3NSZXN1bWUpLgorICBGaXggZG1ldmVudGQgc3RhdGljIGJ1aWxkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLgorICBGaXggdWRldiBmbGFncyBvbiByZW1vdmUgaW4gY3JlYXRlX2FuZF9sb2FkIGVycm9yIHBhdGguCisKK1ZlcnNpb24gMS4wMi40NyAtIDMwdGggQXByaWwgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBzdXBwb3J0IGZvciBuZXcgSU1QT1JUe2RifSB1ZGV2IHJ1bGUuCisgIEFkZCBETV9VREVWX1BSSU1BUllfU09VUkNFX0ZMQUcgdWRldiBmbGFnIHRvIHJlY29nbml6ZSBwcm9wZXIgRE0gZXZlbnRzLgorICBBbHNvIGluY2x1ZGUgdWRldiBsaWJzIGluIGxpYmRldm1hcHBlci5wYyB3aGVuIHVkZXZfc3luYyBpcyBlbmFibGVkLgorICBDYWNoZSBiaXRzZXQgbG9jYXRpb25zIHRvIHNwZWVkIHVwIF9jYWxjX3N0YXRlcy4KKyAgQWRkIGEgcmVnZXggb3B0aW1pc2F0aW9uIHBhc3MgZm9yIHNoYXJlZCBwcmVmaXhlcyBhbmQgc3VmZml4ZXMuCisgIEFkZCBkbV9iaXRfYW5kIGFuZCBkbV9iaXRzZXRfZXF1YWwgdG8gbGliZGV2bWFwcGVyLgorICBTaW1wbGlmeSBkbV9iaXRzZXRfY3JlYXRlLgorICBTcGVlZCB1cCBkbV9iaXRfZ2V0X25leHQgd2l0aCBmZnMoKS4KKworVmVyc2lvbiAxLjAyLjQ2IC0gMTR0aCBBcHJpbCAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQ2hhbmdlIGRtX3RyZWVfZGVhY3RpdmF0ZV9jaGlsZHJlbiB0byBmYWlsIGlmIGRldmljZSBpcyBvcGVuLgorICBXaXBlIG1lbW9yeSBidWZmZXJzIGZvciBkbS1pb2N0bCBwYXJhbWV0ZXJzIGJlZm9yZSByZWxlYXNpbmcuCisgIFN0cmljdGx5IHJlcXVpcmUgbGlidWRldiBpZiB1ZGV2X3N5bmMgaXMgdXNlZC4KKyAgQWRkIHN1cHBvcnQgZm9yIGlvY3RsJ3MgRE1fVUVWRU5UX0dFTkVSQVRFRF9GTEFHLgorCitWZXJzaW9uIDEuMDIuNDUgLSA5dGggTWFyY2ggMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIC0tc2hvd2tleXMgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIHRvIGRtc2V0dXAgbWFuIHBhZ2UuCisgIEFkZCAtLWhlbHAgb3B0aW9uIGFzIHN5bm9ueW0gZm9yIGhlbHAgY29tbWFuZC4KKworVmVyc2lvbiAxLjAyLjQ0IC0gMTV0aCBGZWJydWFyeSAyMDEwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIERNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLIHVkZXYgZmxhZyB0byByZWx5IG9uIHVkZXYgb25seS4KKyAgRXhwb3J0IGRtX3VkZXZfY3JlYXRlX2Nvb2tpZSBmdW5jdGlvbiB0byBjcmVhdGUgbmV3IGNvb2tpZXMgb24gZGVtYW5kLgorICBBZGQgLS11ZGV2Y29va2llLCB1ZGV2Y3JlYXRlY29va2llIGFuZCB1ZGV2cmVsZWFzZWNvb2tpZSB0byBkbXNldHVwLgorICBTZXQgdWRldiBzdGF0ZSBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2YgdXNpbmcgRE1fVURFVl9ESVNBQkxFX0NIRUNLSU5HLgorCitWZXJzaW9uIDEuMDIuNDMgLSAyMXN0IEphbnVhcnkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIGJpdHNldCwgaGFzaCBhbmQgcG9vbCBoZWFkZXJzIHN1cGVyY2VkZWQgYnkgbGliZGV2bWFwcGVyLmguCisgIEZpeCBvZmYtYnktb25lIGVycm9yIGNhdXNpbmcgYmFkIGNsdXN0ZXIgbWlycm9yIHRhYmxlIGNvbnN0cnVjdGlvbi4KKworVmVyc2lvbiAxLjAyLjQyIC0gMTR0aCBKYW51YXJ5IDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBzdXBwb3J0IGZvciB0aGUgInNuYXBzaG90LW1lcmdlIiBrZXJuZWwgdGFyZ2V0ICgyLjYuMzMtcmMxKS4KKyAgSW50cm9kdWNlIGEgdGhpcmQgYWN0aXZhdGlvbl9wcmlvcml0eSBsZXZlbCBpbiBkbV90cmVlX2FjdGl2YXRlX2NoaWxkcmVuLgorCitWZXJzaW9uIDEuMDIuNDEgLSAxMnRoIEphbnVhcnkgMjAxMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSWYgRE1fVURFVl9ESVNBQkxFX0NIRUNLSU5HIGlzIHNldCBpbiBlbnZpcm9ubWVudCwgZGlzYWJsZSB1ZGV2IHdhcm5pbmdzLgorICBBZGQgZG1fdHJlZV9hZGRfZGV2X3dpdGhfdWRldl9mbGFncyB0byBwcm92aWRlIHdpZGVyIHN1cHBvcnQgZm9yIHVkZXYgZmxhZ3MuCisgIEFkZCAtLW5vdWRldnJ1bGVzIG9wdGlvbiBmb3IgZG1zZXR1cCB0byBkaXNhYmxlIC9kZXYgbm9kZSBtYW5hZ2VtZW50IGJ5IHVkZXYuCisgIEZpeCAnZG1zZXR1cCBpbmZvIC1jIC1vIGFsbCcgdG8gc2hvdyBhbGwgZmllbGRzLgorICBSZXR1cm4gZXJyb3JzIGlmIGRtX3RyZWVfKl9jaGlsZHJlbiBmdW5jdGlvbnMgZmFpbC4KKyAgRml4IGNvcmVkdW1wIGFuZCBtZW1vcnkgbGVhayBmb3IgJ2Rtc2V0dXAgaGVscCAtYycuCisgIERpc2FibGUgdWRldiBydWxlcyBmb3IgY2hhbmdlIGV2ZW50cyB3aXRoIERJU0tfUk8gc2V0LgorCitWZXJzaW9uIDEuMDIuNDAgLSAxOXRoIE5vdmVtYmVyIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggaW5zdGFsbF9kZXZpY2UtbWFwcGVyIE1ha2VmaWxlIHRhcmdldCB0byBub3QgYnVpbGQgZG1ldmVudGQgcGx1Z2lucy4KKyAgU3VwcG9ydCB1ZGV2IGZsYWdzIGV2ZW4gd2hlbiB1ZGV2X3N5bmMgaXMgZGlzYWJsZWQgb3Igbm90IGNvbXBpbGVkIGluLgorICBSZW1vdmUgJ2xhc3RfcnVsZScgZnJvbSB1ZGV2IHJ1bGVzOiBob25vdXIgRE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUcuCisgIEFkZCBkbXNldHVwIC0taW5hY3RpdmUgc3VwcG9ydC4KKyAgQWRkIGRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUgdG8gbGliZGV2bWFwcGVyIGZvciBrZXJuZWwgZHJpdmVyID49IDQuMTYuCisgIEZpeCBoYXNoIGxvb2t1cCBzZWdmYXVsdCB3aGVuIGtleXMgY29tcGFyZWQgYXJlIGRpZmZlcmVudCBsZW5ndGhzLgorCitWZXJzaW9uIDEuMDIuMzkgLSAyNnRoIE9jdG9iZXIgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIHN0cmljdCBkZWZhdWx0IHBlcm1pc3Npb25zIGZvciBETSBkZXZpY2VzIGZyb20gOTUtZG0tbm90aWZ5LnJ1bGVzLgorICBBZGQgZG1zZXR1cCB1ZGV2ZmxhZ3MgY29tbWFuZCB0byBkZWNvZGUgdWRldiBmbGFncyBpbiBnaXZlbiBjb29raWUgdmFsdWUuCisgIFN1cHBvcnQgdWRldiBmbGFncyBpbiBsaWJkZXZtYXBwZXIgaW5jbC4gZG1fdHJlZV9hZGRfbmV3X2Rldl93aXRoX3VkZXZfZmxhZ3MuCisgIE1ha2UgbGliZG0gQUJJIGNvbnNpc3RlbnQgd2hlbiBidWlsdCB3aXRoL3dpdGhvdXQgc2VsaW51eCBzdXBwb3J0LgorCitWZXJzaW9uIDEuMDIuMzggLSAyNXRoIFNlcHRlbWJlciAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEV4cG9ydCBETV9ERVZfRElSX1VNQVNLLCB0aGUgZGVmYXVsdCB1bWFzayBmb3IgL2RldiBkaXJlY3RvcmllcyBjcmVhdGVkLgorICBIYW5kbGUgYW55IHBhdGggc3VwcGxpZWQgdG8gZG1fdGFza19zZXRfbmFtZSBieSBsb29raW5nIHVwIGluIC9kZXYvbWFwcGVyLgorICBBZGQgc2V2ZXJhbCBleGFtcGxlcyB0byAxMi1kbS1wZXJtaXNzaW9ucy5ydWxlcy4KKyAgQWRkIHNwbGl0bmFtZSBhbmQgLS15ZXMgdG8gZG1zZXR1cCBtYW4gcGFnZS4KKyAgRml4IF9taXJyb3JfZW1pdF9zZWdtZW50X2xpbmUgcmV0dXJuIGNvZGUuCisgIEZpeCBkbWV2ZW50ZCBfdGVtcG9yYXJ5X2xvZ19mbiBwYXJhbWV0ZXJzLiAoMi4wMi41MCkKKworVmVyc2lvbiAxLjAyLjM3IC0gMTV0aCBTZXB0ZW1iZXIgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgZG1zZXR1cCBtYW5wYWdlIGVudHJpZXMgZm9yIHVkZXZjb21wbGV0ZV9hbGwgYW5kIHVkZXZjb29raWVzLgorICBDaGVjayB1ZGV2IGlzIHJ1bm5pbmcgd2hlbiBwcm9jZXNzaW5nIGNvb2tpZXMgYW5kIHJldGFpbiBzdGF0ZSBpbnRlcm5hbGx5LgorICBBZGQgeXwtLXllcyBvcHRpb24gdG8gZG1zZXR1cCBmb3IgZGVmYXVsdCAneWVzJyBhbnN3ZXIgdG8gcHJvbXB0cy4KKyAgRml4IHRvb2xzIE1ha2VmaWxlIHRvIHByb2Nlc3MgZG1zZXR1cCBzb3VyY2VzIHNlcGFyYXRlbHkuCisgIFJlc3RvcmUgdW1hc2sgd2hlbiBkZXZpY2Ugbm9kZSBjcmVhdGlvbiBmYWlscy4KKyAgQ2hlY2sga2VybmVsIHZzbiB0byB1c2UgJ2Jsb2NrX29uX2Vycm9yJyBvciAnaGFuZGxlX2Vycm9ycycgaW4gbWlycm9yIHRhYmxlLgorICBBZGQgZG0tbG9nLXVzZXJzcGFjZS5oIHRvIHRyZWUgZm9yIGNtaXJyb3JkIGJ1aWxkcy4KKworVmVyc2lvbiAxLjAyLjM2IC0gNnRoIEF1Z3VzdCAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHVkZXZjb29raWVzLCB1ZGV2Y29tcGxldGUsIHVkZXZjb21wbGV0ZV9hbGwgYW5kIC0tbm91ZGV2d2FpdCB0byBkbXNldHVwLgorICBBZGQgbGliZGV2bWFwcGVyIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHN5bmNocm9uaXNhdGlvbiB3aXRoIHVkZXYuCisKK1ZlcnNpb24gMS4wMi4zNSAtIDI4dGggSnVseSAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgTE9HX0xJTkVfV0lUSF9FUlJOTyBtYWNyby4KKyAgVXNlIGxvZ19lcnJvciBtYWNybyBjb25zaXN0ZW50bHkgdGhyb3VnaG91dCBpbiBwbGFjZSBvZiBsb2dfZXJyLgorCitWZXJzaW9uIDEuMDIuMzQgLSAxNXRoIEp1bHkgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXNlIF9leGl0KCkgbm90IGV4aXQoKSBhZnRlciBmb3JraW5nIHRvIGF2b2lkIGZsdXNoaW5nIGxpYmMgYnVmZmVycyB0d2ljZS4KKyAgUmVuYW1lIHBsb2cgbWFjcm8gdG8gTE9HX0xJTkUgJiBhZGQgTE9HX01FU0cgdmFyaWFudCBmb3IgZG1fZHVtcF9tZW1vcnlfZGVidWcuCisgIENoYW5nZSBwbG9nIHRvIHVzZSBkbV9sb2dfd2l0aF9lcnJubyB1bmxlc3MgZGVwcmVjYXRlZCBkbV9sb2dfaW5pdCB3YXMgdXNlZC4KKyAgQWRkIGRtX2xvZ193aXRoX2Vycm5vIGFuZCBkbV9sb2dfd2l0aF9lcnJub19pbml0LCBkZXByZWNhdGluZyB0aGUgb2xkIGZucy4KKyAgRml4IHdoaXRlc3BhY2UgaW4gbGluZWFyIHRhcmdldCBsaW5lIHRvIGZpeCBpZGVudGljYWwgdGFibGUgbGluZSBkZXRlY3Rpb24uCisgIEFkZCBkZXZpY2UgbnVtYmVyIHRvIG1vcmUgbG9nIG1lc3NhZ2VzIGR1cmluZyBhY3RpdmF0aW9uLgorCitWZXJzaW9uIDEuMDIuMzMgLSAzMHRoIEp1bmUgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRG9uJ3QgZmFsbGJhY2sgdG8gZGVmYXVsdCBtYWpvciBudW1iZXI6IHVzZSBkbV90YXNrX3NldF9tYWpvcl9taW5vci4gKDEuMDIuMzEpCisgIERvIG5vdCBmb3JrIGRhZW1vbiB3aGVuIGRtZXZlbnRkIGNhbm5vdCBiZSBmb3VuZC4KKyAgQWRkIGNyeXB0IHRhcmdldCBoYW5kbGluZyB0byBsaWJkZXZtYXBwZXIgdHJlZSBub2Rlcy4KKyAgQWRkIHNwbGl0bmFtZSBjb21tYW5kIHRvIGRtc2V0dXAuCisgIEFkZCBzdWJzeXN0ZW0sIHZnX25hbWUsIGx2X25hbWUsIGx2X2xheWVyIGZpZWxkcyB0byBkbXNldHVwIHJlcG9ydHMuCisgIE1ha2UgbWVtcG9vbCBvcHRpb25hbCBpbiBkbV9zcGxpdF9sdm1fbmFtZSgpLgorCitWZXJzaW9uIDEuMDIuMzIgLSAyMXN0IE1heSAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE9ubHkgZ2VuZXJhdGUgbGliZGV2bWFwcGVyLmEgd2hlbiBjb25maWd1cmVkIHRvIGxpbmsgc3RhdGljYWxseS4KKyAgRXhwb3J0IGRtX3RyZWVfbm9kZV9zaXplX2NoYW5nZWQoKSBmcm9tIGxpYmRldm1hcHBlci4KKyAgUHJvcGFnYXRlIHRoZSB0YWJsZSBzaXplX2NoYW5nZWQgcHJvcGVydHkgdXAgdGhlIGRtIGRldmljZSB0cmVlLgorICBEZXRlY3QgZmFpbHVyZSB0byBmcmVlIG1lbW9yeSBwb29scyB3aGVuIHJlbGVhc2luZyB0aGUgbGlicmFyeS4KKyAgRml4IHNlZ2ZhdWx0IHdoZW4gZ2V0b3B0IHByb2Nlc3NlcyBkbXNldHVwIC1VLCAtRyBhbmQgLU0gb3B0aW9ucy4KKworVmVyc2lvbiAxLjAyLjMxIC0gM3JkIE1hcmNoIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIElmIGtlcm5lbCBzdXBwb3J0cyBvbmx5IG9uZSBkbSBtYWpvciBudW1iZXIsIHVzZSBpbiBwbGFjZSBvZiBhbnkgc3VwcGxpZWQuCisKK1ZlcnNpb24gMS4wMi4zMCAtIDI2dGggSmFudWFyeSAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkICJhbGwiIGZpZWxkIHRvIHJlcG9ydHMgZXhwYW5kaW5nIHRvIGFsbCBmaWVsZHMgb2YgcmVwb3J0IHR5cGUuCisgIEVuZm9yY2UgZGV2aWNlIG5hbWUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgbGltaXRhdGlvbnMgaW4gbGliZG0uCisgIFJlcGxhY2UgX2RtX3NucHJpbnRmIHdpdGggRU1JVF9QQVJBTVMgbWFjcm8gZm9yIGNyZWF0aW5nIHRhcmdldCBsaW5lcy4KKworVmVyc2lvbiAxLjAyLjI5IC0gMTB0aCBOb3ZlbWJlciAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTWVyZ2UgZGV2aWNlLW1hcHBlciBpbnRvIHRoZSBMVk0yIHRyZWUuCisgIFNwbGl0IG91dCBkbS1sb2dnaW5nLmggZnJvbSBsb2cuaC4KKyAgVXNlIGx2bS10eXBlcy5oLgorICBBZGQgdXNyc2JpbmRpciB0byBjb25maWd1cmUuCisKK1ZlcnNpb24gMS4wMi4yOCAtIDE4dGggU2VwdGVtYmVyIDIwMDgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgT25seSByZXN1bWUgZGV2aWNlcyBpbiBkbV90cmVlX3ByZWxvYWRfY2hpbGRyZW4gaWYgc2l6ZSBjaGFuZ2VzLgorICBFeHRlbmQgZGVwdHJlZSBidWZmZXJzIHNvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGRldmljZSBudW1iZXJzIGZpdC4KKyAgR2VuZXJhdGUgdmVyc2lvbmVkIGxpYmRldm1hcHBlci1ldmVudC5zby4KKyAgVW5kZXJsaW5lIGxvbmdlciByZXBvcnQgaGVscCB0ZXh0IGhlYWRpbmdzLgorCitWZXJzaW9uIDEuMDIuMjcgLSAyNXRoIEp1bmUgMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWxpZ24gc3RydWN0IG1lbWJsb2NrIGluIGRiZ19tYWxsb2MgZm9yIHNwYXJjLgorICBBZGQgLS11bnF1b3RlZCBhbmQgLS1yb3dzIHRvIGRtc2V0dXAuCisgIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgY2FzdCBpbiBkbXNldHVwLmMncyBPRkZTRVRfT0YgbWFjcm8uCisgIEZpeCBpbnZlcnRlZCBub19mbHVzaCBkZWJ1ZyBtZXNzYWdlLgorICBSZW1vdmUgLS1lbmFibGUtam9icyBmcm9tIGNvbmZpZ3VyZS4gKFNldCBhdCBydW50aW1lIGluc3RlYWQuKQorICBCcmluZyBjb25maWd1cmUuaW4gYW5kIGxpc3QuaCBpbnRvIGxpbmUgd2l0aCB0aGUgbHZtMiB2ZXJzaW9ucy4KKworVmVyc2lvbiAxLjAyLjI2IC0gNnRoIEp1bmUgMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbml0aWFsaXNlIHBhcmFtcyBidWZmZXIgdG8gZW1wdHkgc3RyaW5nIGluIF9lbWl0X3NlZ21lbnQuCisgIFNraXAgYWRkX2Rldl9ub2RlIHdoZW4gaW9jdGxzIGRpc2FibGVkLgorICBNYWtlIGRtX2hhc2hfaXRlciBzYWZlIGFnYWluc3QgZGVsZXRpb24uCisgIEFjY2VwdCBhIE5VTEwgcG9pbnRlciB0byBkbV9mcmVlIHNpbGVudGx5LgorICBBZGQgdGFibGVzX2xvYWRlZCwgcmVhZG9ubHkgYW5kIHN1c3BlbmRlZCBjb2x1bW5zIHRvIHJlcG9ydHMuCisgIEFkZCAtLW5hbWVwcmVmaXhlcyB0byBkbXNldHVwLgorICBBZGQgZmllbGQgbmFtZSBwcmVmaXggb3B0aW9uIHRvIHJlcG9ydGluZyBmdW5jdGlvbnMuCisgIENhbGN1bGF0ZSBzdHJpbmcgc2l6ZSB3aXRoaW4gZG1fcG9vbF9ncm93X29iamVjdC4KKworVmVyc2lvbiAxLjAyLjI1IC0gMTB0aCBBcHJpbCAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUmVtb3ZlIHJlZHVuZGFudCBpZi1iZWZvcmUtZnJlZSB0ZXN0cy4KKyAgVXNlIGxvZ193YXJuIGZvciByZXBvcnRpbmcgZmllbGQgaGVscCB0ZXh0IGluc3RlYWQgb2YgbG9nX3ByaW50LgorICBDaGFuZ2UgY2x1c3RlciBtaXJyb3IgbG9nIHR5cGUgbmFtZSAocy9jbHVzdGVyZWRfL2NsdXN0ZXJlZC0vKQorCitWZXJzaW9uIDEuMDIuMjQgLSAyMHRoIERlY2VtYmVyIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZGVwdHJlZSB0byBwYXNzIG5ldyBuYW1lIHRvIF9yZXN1bWVfbm9kZSBhZnRlciBhIHJlbmFtZS4KKyAgU3VwcHJlc3Mgb3RoZXIgbm9kZSBvcGVyYXRpb25zIGlmIG5vZGUgaXMgZGVsZXRlZC4KKyAgQWRkIG5vZGUgb3BlcmF0aW9uIHN0YWNrIGRlYnVnIG1lc3NhZ2VzLgorICBSZXBvcnQgZXJyb3Igd2hlbiBlbXB0eSBkZXZpY2UgbmFtZSBwYXNzZWQgdG8gcmVhZGFoZWFkIGZ1bmN0aW9ucy4KKyAgRml4IG1pbmltdW0gcmVhZGFoZWFkIGRlYnVnIG1lc3NhZ2UuCisKK1ZlcnNpb24gMS4wMi4yMyAtIDV0aCBEZWNlbWJlciAyMDA3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgZG0taW9jdGwuaCBhZnRlciByZW1vdmFsIG9mIGNvbXBhdCBjb2RlLgorICBBZGQgcmVhZGFoZWFkIHN1cHBvcnQgdG8gbGliZGV2bWFwcGVyIGFuZCBkbXNldHVwLgorICBGaXggZG91YmxlIGZyZWUgaW4gYSBsaWJkZXZtYXBwZXItZXZlbnQgZXJyb3IgcGF0aC4KKyAgRml4IGNvbmZpZ3VyZSAtLXdpdGgtZG1ldmVudGQtcGF0aCBzdWJzdGl0dXRpb24uCisgIEFsbG93IGEgRE1fREVWX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycmlkZSAvZGV2IGluIGRtc2V0dXAuCisgIENyZWF0ZSBhIGxpYmRldm1hcHBlci5zby4kTElCX1ZFUlNJT04gc3ltbGluayB3aXRoaW4gdGhlIGJ1aWxkIHRyZWUuCisgIEF2b2lkIHN0YXRpYyBsaW5rIGZhaWx1cmUgd2l0aCBzb21lIFNFTGludXggbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBsaWJwdGhyZWFkLgorICBSZW1vdmUgb2Jzb2xldGUgZG1mcyBjb2RlIGZyb20gdHJlZSBhbmQgdXBkYXRlIElOU1RBTEwuCisKK1ZlcnNpb24gMS4wMi4yMiAtIDIxc3QgQXVndXN0IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGluY29uc2lzdGVudCBsaWNlbmNlIG5vdGljZXM6IGV4ZWN1dGFibGVzIGFyZSBHUEx2MjsgbGlicmFyaWVzIExHUEx2Mi4xLgorICBVcGRhdGUgdG8gdXNlIGF1dG9jb25mIDIuNjEsIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgMi41Ny4KKyAgQXZvaWQgcmVwZWF0ZWQgZG1fdGFzayBmcmVlIG9uIHNvbWUgZG1fZXZlbnRfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlIGVycm9ycy4KKyAgSW50cm9kdWNlIGxvZ19zeXNfKiBtYWNyb3MgZnJvbSBMVk0yLgorICBFeHBvcnQgZG1fZmNsb3NlIGFuZCBkbV9jcmVhdGVfZGlyOyByZW1vdmUgbGliZG0tZmlsZS5oLgorICBEb24ndCBsb2cgRVJPRlMgbWtkaXIgZmFpbHVyZXMgaW4gX2NyZWF0ZV9kaXJfcmVjdXJzaXZlIChmb3IgTFZNMikuCisgIEFkZCBmY2xvc2Ugd3JhcHBlciBkbV9mY2xvc2UgdGhhdCBjYXRjaGVzIHdyaXRlIGZhaWx1cmVzICh1c2luZyBmZXJyb3IpLgorCitWZXJzaW9uIDEuMDIuMjEgLSAxM3RoIEp1bHkgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSW50cm9kdWNlIF9MT0dfU1RERVJSIHRvIHNlbmQgbG9nX3dhcm4oKSBtZXNzYWdlcyB0byBzdGRlcnIgbm90IHN0ZG91dC4KKyAgRml4IGRtc2V0dXAgLW8gZGV2bm8gc3RyaW5nIHRlcm1pbmF0aW9uLiAoMS4wMi4yMCkKKworVmVyc2lvbiAxLjAyLjIwIC0gMTV0aCBKdW5lIDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBkZWZhdWx0IGRtc2V0dXAgcmVwb3J0IGJ1ZmZlcmluZyBhbmQgYWRkIC0tdW5idWZmZXJlZC4KKyAgQWRkIHRyZWUtYmFzZWQgYW5kIGRlcGVuZGVuY3kgZmllbGRzIHRvIGRtc2V0dXAgcmVwb3J0cy4KKworVmVyc2lvbiAxLjAyLjE5IC0gMjd0aCBBcHJpbCAyMDA3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgU3RhbmRhcmRpc2UgcHJvdGVjdGl2ZSBpbmNsdWRlIGZpbGUgI2RlZmluZXMuCisgIEFkZCByZWdleCBmdW5jdGlvbnMgdG8gbGlicmFyeS4KKyAgQXZvaWQgdHJhaWxpbmcgc2VwYXJhdG9yIGluIHJlcG9ydHMgd2hlbiB0aGVyZSBhcmUgaGlkZGVuIHNvcnQgZmllbGRzLgorICBGaXggc2VnZmF1bHQgaW4gJ2Rtc2V0dXAgc3RhdHVzJyB3aXRob3V0IC0tc2hvd2tleXMgYWdhaW5zdCBjcnlwdCB0YXJnZXQuCisgIERlYWwgd2l0aCBzb21lIG1vcmUgY29tcGlsZXIgd2FybmluZ3MuCisgIEludHJvZHVjZSBfYWRkX2ZpZWxkKCkgYW5kIF9pc19zYW1lX2ZpZWxkKCkgdG8gbGliZG0tcmVwb3J0LmMuCisgIEZpeCBzb21lIGxpYmRldm1hcHBlci1ldmVudCBhbmQgZG1ldmVudGQgbWVtb3J5IGxlYWtzLgorICBSZW1vdmUgdW5uZWNlc3NhcnkgbWVtc2V0KCkgcmV0dXJuIHZhbHVlIGNoZWNrcy4KKyAgRml4IGEgZmV3IGxlYWtzIGluIHJlcG9ydGluZyBlcnJvciBwYXRocy4gWzEuMDIuMTUrXQorCitWZXJzaW9uIDEuMDIuMTggLSAxM3RoIEZlYnJ1YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBJbXByb3ZlIGRtZXZlbnRkIG1lc3NhZ2luZyBwcm90b2NvbDogZHJhaW4gcGlwZSBhbmQgdGFnIG1lc3NhZ2VzLgorCitWZXJzaW9uIDEuMDIuMTcgLSAyOXRoIEphbnVhcnkgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHJlY2VudCByZXBvcnRpbmcgb3B0aW9ucyB0byBkbXNldHVwIG1hbiBwYWdlLgorICBSZXZpc2Ugc29tZSByZXBvcnQgZmllbGRzIG5hbWVzLgorICBBZGQgZG1zZXR1cCAnaGVscCcgY29tbWFuZCBhbmQgdXBkYXRlIHVzYWdlIHRleHQuCisgIFVzZSBmaXhlZC1zaXplIGZpZWxkcyBpbiByZXBvcnQgaW50ZXJmYWNlIGFuZCByZW9yZGVyLgorCitWZXJzaW9uIDEuMDIuMTYgLSAyNXRoIEphbnVhcnkgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHNvbWUgbWlzc2luZyBjbG9zZSgpIGFuZCBmY2xvc2UoKSByZXR1cm4gdmFsdWUgY2hlY2tzLgorICBNaWdyYXRlIGRtc2V0dXAgY29sdW1uLWJhc2VkIG91dHB1dCBvdmVyIHRvIG5ldyBsaWJkZXZtYXBwZXIgcmVwb3J0IGZyYW1ld29yay4KKyAgQWRkIGRlc2NyaXB0aW9ucyB0byByZXBvcnRpbmcgZmllbGQgZGVmaW5pdGlvbnMuCisgIEFkZCBhIGRzby1wcml2YXRlIHZhcmlhYmxlIHRvIGRtZXZlbnRkIGRzbyBpbnRlcmZhY2UuCisgIEFkZCBkbV9ldmVudF9oYW5kbGVyX1tnc11ldF90aW1lb3V0IGZ1bmN0aW9ucy4KKyAgU3RyZWFtbGluZSBkbV9yZXBvcnRfZmllbGRfKiBpbnRlcmZhY2UuCisgIEFkZCBjbWRsaW5lIGRlYnVnICYgdmVyc2lvbiBvcHRpb25zIHRvIGRtZXZlbnRkLgorICBBZGQgRE1fTElCX1ZFUlNJT04gZGVmaW5pdGlvbiB0byBjb25maWd1cmUuaC4KKyAgU3VwcHJlc3MgJ1VucmVjb2duaXNlZCBmaWVsZCcgZXJyb3IgaWYgcmVwb3J0IGZpZWxkIGlzICdoZWxwJy4KKyAgQWRkIC0tc2VwYXJhdG9yIGFuZCAtLXNvcnQgdG8gZG1zZXR1cCAodW51c2VkKS4KKyAgTWFrZSBhbGlnbm1lbnQgZmxhZyBvcHRpb25hbCB3aGVuIHNwZWNpZnlpbmcgcmVwb3J0IGZpZWxkcy4KKworVmVyc2lvbiAxLjAyLjE1IC0gMTd0aCBKYW51YXJ5IDIwMDcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBiYXNpYyByZXBvcnRpbmcgZnVuY3Rpb25zIHRvIGxpYmRldm1hcHBlci4KKyAgRml4IGEgbWFsbG9jIGVycm9yIHBhdGggaW4gZG1zZXR1cCBtZXNzYWdlLgorICBNb3JlIGxpYmRldm1hcHBlci1ldmVudCBpbnRlcmZhY2UgY2hhbmdlcyBhbmQgZml4ZXMuCisgIFJlbmFtZSBkbV9zYXByaW50ZigpIHRvIGRtX2FzcHJpbnRmKCkuCisgIFJlcG9ydCBlcnJvciBpZiBOVUxMIHBvaW50ZXIgaXMgc3VwcGxpZWQgdG8gZG1fc3RyZHVwX2F1eCgpLgorICBSZWluc3RhdGUgZG1fZXZlbnRfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlLgorCitWZXJzaW9uIDEuMDIuMTQgLSAxMXRoIEphbnVhcnkgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGRtX3NhcHJpbnRmKCkuCisgIFVzZSBDRkxBR1Mgd2hlbiBsaW5raW5nIHNvIG1peGVkIHNwYXJjIGJ1aWxkcyBjYW4gc3VwcGx5IC1tNjQuCisgIEFkZCBkbV90cmVlX3VzZV9ub19mbHVzaF9zdXNwZW5kKCkuCisgIExvdHMgb2YgZG1ldmVudCBjaGFuZ2VzIGluY2x1ZGluZyByZXZpc2VkIGludGVyZmFjZS4KKyAgRXhwb3J0IGRtX2Jhc2VuYW1lKCkuCisgIENvcGUgd2l0aCBhIHRyYWlsaW5nIHNwYWNlIHdoZW4gY29tcGFyaW5nIHRhYmxlcyBwcmlvciB0byBwb3NzaWJsZSByZWxvYWQuCisgIEZpeCBkbWV2ZW50ZCB0byBjb3BlIGlmIG1vbml0b3JlZCBkZXZpY2UgZGlzYXBwZWFycy4KKworVmVyc2lvbiAxLjAyLjEzIC0gMjggTm92IDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBkbXNldHVwIG1hbiBwYWdlIChzZXRnZW9tZXRyeSAmIG1lc3NhZ2UpLgorICBGaXggZG1zZXR1cCBmcmVlIGFmdGVyIGdldGxpbmUgd2l0aCBkZWJ1Zy4KKyAgU3VwcHJlc3MgZW5jcnlwdGlvbiBrZXkgaW4gJ2Rtc2V0dXAgdGFibGUnIG91dHB1dCB1bmxlc3MgLS1zaG93a2V5cyBzdXBwbGllZC4KKworVmVyc2lvbiAxLjAyLjEyIC0gMTMgT2N0IDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEF2b2lkIGRlcHRyZWUgYXR0ZW1wdGluZyB0byBzdXNwZW5kIGEgZGV2aWNlIHRoYXQncyBhbHJlYWR5IHN1c3BlbmRlZC4KKworVmVyc2lvbiAxLjAyLjExIC0gIDEyIE9jdCAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIHN1c3BlbmQgbm9mbHVzaCBzdXBwb3J0LgorICBBZGQgYmFzaWMgZG1zZXR1cCBsb29wIHN1cHBvcnQuCisgIFN3aXRjaCBkbXNldHVwIHRvIHVzZSBkbV9tYWxsb2MgYW5kIGRtX2ZyZWUuCisKK1ZlcnNpb24gMS4wMi4xMCAtIDE5IFNlcCAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgZG1fc25wcmludGYoKSwgZG1fc3BsaXRfd29yZHMoKSBhbmQgZG1fc3BsaXRfbHZtX25hbWUoKSB0byBsaWJkZXZtYXBwZXIuCisgIFJlb3JkZXIgbW0gYm91bmRzX2NoZWNrIGNvZGUgdG8gcmVkdWNlIHdpbmRvdyBmb3IgYSBkbWV2ZW50ZCByYWNlLgorCitWZXJzaW9uIDEuMDIuMDkgLSAxNSBBdWcgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIC0tdGFibGUgYXJndW1lbnQgdG8gZG1zZXR1cCBmb3IgYSBvbmUtbGluZSB0YWJsZS4KKyAgQWJvcnQgaWYgZXJyb3JzIGFyZSBmb3VuZCBkdXJpbmcgY21kbGluZSBvcHRpb24gcHJvY2Vzc2luZy4KKyAgQWRkIGxvY2tmcyBpbmRpY2F0b3IgdG8gZGVidWcgb3V0cHV0LgorCitWZXJzaW9uIDEuMDIuMDggLSAxNyBKdWx5IDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBcHBlbmQgZnVsbCBwYXRjaCB0byBjaGVjayBpbiBlbWFpbHMuCisgIEF2b2lkIGR1cGxpY2F0ZSBkbWV2ZW50ZCBzdWJkaXIgd2l0aCAnbWFrZSBkaXN0Y2xlYW4nLgorICBVcGRhdGUgZG1zZXR1cCBtYW4gcGFnZS4KKyAgQWRkIC0tZm9yY2UgdG8gZG1zZXR1cCByZW1vdmUqIHRvIGxvYWQgZXJyb3IgdGFyZ2V0LgorICBkbXNldHVwIHJlbW92ZV9hbGwgYWxzbyBwZXJmb3JtcyBta25vZGVzLgorICBEb24ndCBzdXBwcmVzcyBpZGVudGljYWwgdGFibGUgcmVsb2FkcyBpZiBwZXJtaXNzaW9uIGNoYW5nZXMuCisgIEZpeCBjb3JlbG9nIHNlZ21lbnQgbGluZS4KKyAgU3VwcHJlc3Mgc29tZSBjb21waWxlciB3YXJuaW5ncy4KKworVmVyc2lvbiAxLjAyLjA3IC0gMTEgTWF5IDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBETV9DT1JFTE9HIGZsYWcgdG8gZG1fdHJlZV9ub2RlX2FkZF9taXJyb3JfdGFyZ2V0KCkuCisgIEF2b2lkIGEgZG1ldmVudGQgY29tcGlsZXIgd2FybmluZy4KKworVmVyc2lvbiAxLjAyLjA2IC0gMTAgTWF5IDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1vdmUgREVGUyBpbnRvIGNvbmZpZ3VyZS5oLgorICBGaXggbGVha3MgaW4gZXJyb3IgcGF0aHMgZm91bmQgYnkgY292ZXJpdHkuCisgIFJlbW92ZSBkbXNldHVwIGxpbmUgYnVmZmVyIGxpbWl0YXRpb24uCisKK1ZlcnNpb24gMS4wMi4wNSAtIDE5IEFwciAyMDA2Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBTZXBhcmF0ZSBpbnN0YWxsX2luY2x1ZGUgdGFyZ2V0IGluIG1ha2VmaWxlcy4KKyAgU2VwYXJhdGUgb3V0IERFRlMgZnJvbSBDRkxBR1MuCisgIFN1cHBvcnQgcGtnLWNvbmZpZy4KKyAgQ2hlY2sgZm9yIGxpYnNlcG9sLgorCitWZXJzaW9uIDEuMDIuMDQgLSAxNCBBcHIgMjAwNgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQnJpbmcgZG1zZXR1cCBtYW4gcGFnZSB1cC10by1kYXRlLgorICBVc2UgbmFtZS1iYXNlZCBkZXZpY2UgcmVmcyBpZiBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IGRldmljZSBudW1iZXIgcmVmcy4KKyAgRml4IG1lbW9yeSBsZWFrIChzdHJ1Y3QgZG1faW9jdGwpIHdoZW4gc3RydWN0IGRtX3Rhc2sgaXMgcmV1c2VkLgorICBJZiBfY3JlYXRlX2FuZF9sb2FkX3Y0IGZhaWxzIHBhcnQgd2F5IHRocm91Z2gsIHJldmVydCB0aGUgY3JlYXRpb24uCisgIGRtZXZlbnRkIHRocmVhZC9maWZvIGZpeGVzLgorICBBZGQgZmlsZSAmIGxpbmUgdG8gZG1fc3RyZHVwX2F1eCgpLgorICBBZGQgc2V0Z2VvbWV0cnkuCisKK1ZlcnNpb24gMS4wMi4wMyAtIDcgRmViIDIwMDYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQWRkIGV4cG9ydGVkIGZ1bmN0aW9ucyB0byBzZXQgdWlkLCBnaWQgYW5kIG1vZGUuCisgIFJlbmFtZSBfbG9nIHRvIGRtX2xvZyBhbmQgZXhwb3J0LgorICBBZGQgZG1fdHJlZV9za2lwX2xvY2tmcy4KKyAgRml4IGRtX3N0cmR1cCBkZWJ1ZyBkZWZpbml0aW9uLgorICBGaXggaGFzaCBmdW5jdGlvbiB0byBhdm9pZCB1c2luZyBhIG5lZ2F0aXZlIGFycmF5IG9mZnNldC4KKyAgRG9uJ3QgaW5saW5lIF9maW5kIGluIGhhc2guYyBhbmQgdGlkeSBzaWduZWQvdW5zaWduZWQgZXRjLgorICBGaXggbGliZGV2bWFwcGVyLmggI2VuZGlmLgorICBGaXggZG1zZXR1cCB2ZXJzaW9uIGRyaXZlciB2ZXJzaW9uLgorICBBZGQgc3luYywgbm9zeW5jIGFuZCBibG9ja19vbl9lcnJvciBtaXJyb3IgbG9nIHBhcmFtZXRlcnMuCisgIEFkZCBod2VpZ2h0MzIuCisgIEZpeCBkbWV2ZW50ZCBidWlsZC4KKworVmVyc2lvbiAxLjAyLjAyIC0gMiBEZWMgMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBkbWV2ZW50ZCBhZGRlZC4KKyAgRXhwb3J0IGRtX3Rhc2tfdXBkYXRlX25vZGVzLgorICBVc2UgbmFtZXMgaW5zdGVhZCBvZiBudW1iZXJzIGluIG1lc3NhZ2VzIHdoZW4gaW9jdGxzIGZhaWwuCisKK1ZlcnNpb24gMS4wMi4wMSAtIDIzIE5vdiAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXN1bWUgc25hcHNob3Qtb3JpZ2lucyBsYXN0LgorICBEcm9wIGxlYWRpbmcgemVyb3MgZnJvbSBkbV9mb3JtYXRfZGV2LgorICBTdXBwcmVzcyBhdHRlbXB0IHRvIHJlbG9hZCBpZGVudGljYWwgdGFibGUuCisgIEFkZGl0aW9uYWwgTFZNLSBwcmVmaXggbWF0Y2hpbmcgZm9yIHRyYW5zaXRpb25hbCBwZXJpb2QuCisKK1ZlcnNpb24gMS4wMi4wMCAtIDEwIE5vdiAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGRlZCBhY3RpdmF0aW9uIGZ1bmN0aW9ucyB0byBsaWJyYXJ5LgorICBBZGRlZCByZXR1cm4gbWFjcm9zLgorICBBbHNvIHN1cHByZXNzIGVycm9yIGlmIGRldmljZSBkb2Vzbid0IGV4aXN0IHdpdGggRE1fREVWSUNFX1NUQVRVUy4KKyAgRXhwb3J0IGRtX3NldF9zZWxpbnV4X2NvbnRleHQoKS4KKyAgQWRkIGRtX2RyaXZlcl92ZXJzaW9uKCkuCisgIEFkZGVkIGRlcGVuZGVuY3kgdHJlZSBmdW5jdGlvbnMgdG8gbGlicmFyeS4KKyAgQWRkZWQgaGFzaCwgYml0c2V0LCBwb29sLCBkYmdfbWFsbG9jIHRvIGxpYnJhcnkuCisgIEFkZGVkIGxzIC0tdHJlZSB0byBkbXNldHVwLgorICBBZGRlZCBkbXNldHVwIC0tbm9sb2NrZnMgc3VwcG9ydCBmb3Igc3VzcGVuZC9yZWxvYWQuCisKK1ZlcnNpb24gMS4wMS4wNSAtIDI2IFNlcCAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXN5bmMgbGlzdC5oIHdpdGggTFZNMi4KKyAgUmVtZW1iZXIgaW5jcmVhc2VkIGJ1ZmZlciBzaXplIGFuZCB1c2UgZm9yIHN1YnNlcXVlbnQgY2FsbHMuCisgIE9uICdidWZmZXIgZnVsbCcgY29uZGl0aW9uLCBkb3VibGUgYnVmZmVyIHNpemUgYW5kIHJlcGVhdCBpb2N0bC4KKyAgRml4IHRlcm1pbmF0aW9uIG9mIGdldG9wdF9sb25nKCkgb3B0aW9uIGFycmF5LgorICBSZXBvcnQgJ2J1ZmZlciBmdWxsJyBjb25kaXRpb24gd2l0aCB2NCBpb2N0bCBhcyB3ZWxsIGFzIHdpdGggdjEuCisKK1ZlcnNpb24gMS4wMS4wNCAtIDIgQXVnIDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IGRtc2V0dXAgbHMgLWogYW5kIHN0YXR1cyAtLXRhcmdldCB3aXRoIGVtcHR5IHRhYmxlLgorCitWZXJzaW9uIDEuMDEuMDMgLSAxMyBKdW4gMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXNlIG1hdGNocGF0aGNvbiBtb2RlIHBhcmFtZXRlci4KKyAgRml4IGNvbmZpZ3VyZSBzY3JpcHQgdG8gcmUtZW5hYmxlIHNlbGludXguCisKK1ZlcnNpb24gMS4wMS4wMiAtIDE3IE1heSAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDYWxsIGRtX2xpYl9leGl0KCkgYW5kIGRtX2xpYl9yZWxlYXNlKCkgYXV0b21hdGljYWxseSBub3cuCisgIEFkZCAtLXRhcmdldCA8dGFyZ2V0X3R5cGU+IGZpbHRlciB0byBkbXNldHVwIHRhYmxlL3N0YXR1cy9scy4KKyAgQWRkIC0tZXhlYyA8Y29tbWFuZD4gdG8gZG1zZXR1cCBscy4KKyAgRml4IGRtc2V0dXAgZ2V0b3B0X2xvbmcgdXNhZ2UuCisKK1ZlcnNpb24gMS4wMS4wMSAtIDI5IE1hciAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgZG1zZXR1cCBtYW4gcGFnZS4KKyAgRHJvcC1pbiBkZXZtYXBfbmFtZSByZXBsYWNlbWVudC4KKyAgQWRkIG9wdGlvbiB0byBjb21waWxlIHdpdGhvdXQgaW9jdGwgZm9yIHRlc3RpbmcuCisgIEZpeCBETV9MSUJfVkVSU0lPTiBzZWQuCisKK1ZlcnNpb24gMS4wMS4wMCAtIDE3IEphbiAyMDA1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBZGQgZG1fdGFza19ub19vcGVuX2NvdW50KCkgdG8gc2tpcCBnZXR0aW5nIG9wZW5fY291bnQuCisKK1ZlcnNpb24gMS4wMC4yMSAtIDcgSmFuIDIwMDUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IC9wcm9jL2RldmljZXMgcGFyc2luZy4KKworVmVyc2lvbiAxLjAwLjIwIC0gNiBKYW4gMjAwNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBBdHRlbXB0IHRvIGZpeCAvZGV2L21hcHBlci9jb250cm9sIHRyYW5zcGFyZW50bHkgaWYgaXQncyB3cm9uZy4KKyAgQ29uZmlndXJhdGlvbi10aW1lIG9wdGlvbiBmb3Igc2V0dGluZyB1aWQvZ2lkL21vZGUgZm9yIC9kZXYvbWFwcGVyIG5vZGVzLgorICBVcGRhdGUga2VybmVsIHBhdGNoZXMgZm9yIDIuNC4yNy8yLjQuMjgtcHJlLTQgKGluY2x1ZGVzIG1pbm9yIGZpeGVzKS4KKyAgQWRkIC0tbm9oZWFkaW5ncyBjb2x1bW5zIG9wdGlvbiBmb3IgY29sb24tc2VwYXJhdGVkIGRtc2V0dXAgb3V0cHV0LgorICBTdXBwb3J0IGRldmljZSByZWZlcmVuY2luZyBieSB1dWlkIG9yIG1ham9yL21pbm9yLgorICBXYXJuIGlmIGtlcm5lbCBkYXRhIGRpZG4ndCBmaXQgaW4gYnVmZmVyLgorICBGaXggYSBwcmludGYuCisKK1ZlcnNpb24gMS4wMC4xOSAtIDMgSnVseSAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBNb3JlIGF1dG9jb25mIGZpeGVzLgorICBGaXggYSBkbXNldHVwIG5ld2xpbmUuCisgIEZpeCBkZXZpY2UgbnVtYmVyIGhhbmRsaW5nIGZvciAyLjYga2VybmVscy4KKworVmVyc2lvbiAxLjAwLjE4IC0gMjAgSnVuIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBhIHV1aWQgZnJlZSBpbiBsaWJkbS1pZmFjZS4KKyAgRml4IGEgdGFyZ2V0cyBzdHJpbmcgc2l6ZSBjYWxjIGluIGRyaXZlci4KKyAgQWRkIC1jIHRvIGRtc2V0dXAgZm9yIGNvbHVtbi1iYXNlZCBvdXRwdXQuCisgIEFkZCB0YXJnZXQgbWVzc2FnZS1wYXNzaW5nIGlvY3RsLgorCitWZXJzaW9uIDEuMDAuMTcgLSAxNyBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgY29uZmlndXJlIC0td2l0aC1vd25lcj0gLS13aXRoLWdyb3VwPSB0byBhdm9pZCAtbyBhbmQgLWcgYXJncyB0byAnaW5zdGFsbCcKKyAgRml4IGxpYnJhcnkgc2VsaW51eCBsaW5raW5nLgorCitWZXJzaW9uIDEuMDAuMTYgLSAxNiBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgSWdub3JlIGVycm9yIHNldHRpbmcgc2VsaW51eCBmaWxlIGNvbnRleHQgaWYgZnMgZG9lc24ndCBzdXBwb3J0IGl0LgorCitWZXJzaW9uIDEuMDAuMTUgLSA3IEFwciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEZpeCBzdGF0dXMgb3ZlcmZsb3cgY2hlY2sgaW4ga2VybmVsIHBhdGNoZXMuCisKK1ZlcnNpb24gMS4wMC4xNCAtIDYgQXByIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRml4IHN0YXRpYyBzZWxpbnV4IGJ1aWxkLgorCitWZXJzaW9uIDEuMDAuMTMgLSA2IEFwciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZCBzb21lIGJhc2ljIHNlbGludXggc3VwcG9ydC4KKworVmVyc2lvbiAxLjAwLjEyIC0gNiBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggZG1zZXR1cC5zdGF0aWMgaW5zdGFsbC4KKworVmVyc2lvbiAxLjAwLjExIC0gNSBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBjb25maWd1cmUgLS1lbmFibGUtc3RhdGljX2xpbmsgZG9lcyBzdGF0aWMgYnVpbGQgaW4gYWRkaXRpb24gdG8gZHluYW1pYy4KKyAgTW92ZWQgTWFrZWZpbGUgbGlicmFyeSB0YXJnZXRzIGRlZmluaXRpb24gaW50byB0ZW1wbGF0ZS4KKworVmVyc2lvbiAxLjAwLjEwIC0gMiBBcHIgMjAwNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBGaXggREVTVERJUiBoYW5kbGluZy4KKyAgU3RhdGljIGJ1aWxkIGluc3RhbGxzIHRvIGRtc2V0dXAuc3RhdGljLgorICBCYXNpYyBzdXBwb3J0IGZvciBpbnRlcm5hdGlvbmFsaXNhdGlvbi4KKyAgTWlub3IgTWFrZWZpbGUgdGlkeS11cHMvZml4ZXMuCisKK1ZlcnNpb24gMS4wMC4wOSAtIDMxIE1hciAyMDA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVcGRhdGUgY29weXJpZ2h0IG5vdGljZXMgdG8gUmVkIEhhdC4KKyAgTW92ZSBmdWxsIG1rbm9kZXMgZnVuY3Rpb25hbGl0eSBmcm9tIGRtc2V0dXAgaW50byBsaWJkZXZtYXBwZXIuCisgIEF2b2lkIHNzY2FuZiAlYXMgZm9yIHVDbGliYyBjb21wYXRpYmlsaXR5LgorICBDb3BlIGlmIERNX0xJU1RfVkVSU0lPTlMgaXMgbm90IGRlZmluZWQuCisgIEFkZCBETV9MSVNUX1ZFUlNJT05TIGZ1bmN0aW9uYWxpdHkgdG8ga2VybmVsIHBhdGNoZXMuCisgIEdlbmVyYXRlIG5ldyBrZXJuZWwgcGF0Y2hlcyBmb3IgMi40LjI2LXJjMS4KKworVmVyc2lvbiAxLjAwLjA4IC0gMjcgRmViIDIwMDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFkZGVkICdkbXNldHVwIHRhcmdldHMnLgorICBBZGRlZCBldmVudF9uciBzdXBwb3J0IHRvICdkbXNldHVwIHdhaXQnLgorICBVcGRhdGVkIGRtc2V0dXAgbWFuIHBhZ2UuCisgIEFsbG93IGxvZ2dpbmcgZnVuY3Rpb24gdG8gYmUgcmVzZXQgdG8gdXNlIGludGVybmFsIG9uZS4KKyAgQnJpbmcgbG9nIG1hY3JvcyBpbiBsaW5lIHdpdGggTFZNMiBvbmVzLgorICBBZGRlZCAnbWFrZSBpbnN0YWxsX3N0YXRpY19saWInIHdoaWNoIGluc3RhbGxzIGxpYmRldm1hcHBlci5hLgorICBNYWRlIGNvbmZpZ3VyZS9tYWtlZmlsZXMgY2xvc2VyIHRvIExWTTIgdmVyc2lvbnMuCisgIEZpeGVkIERFU1RESVIgZm9yIG1ha2UgaW5zdGFsbC9pbnN0YWxsX3N0YXRpY19saWIuCisgIFVwZGF0ZWQgUkVBRE1FL0lOU1RBTEwgdG8gcmVmbGVjdCBtb3ZlIHRvIHNvdXJjZXMucmVkaGF0LmNvbS4KKyAgVXBkYXRlZCBhdXRvY29uZiBmaWxlcyB0byAyMDAzLTA2LTE3LgpkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzliMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSw2MyBAQAorZG5sIEFDX0dDQ19WRVJTSU9OCitkbmwgY2hlY2sgZm9yIGNvbXBpbGVyIHZlcnNpb24KK2RubCBzZXRzIENPTVBJTEVSX1ZFUlNJT04gYW5kIEdDQ19WRVJTSU9OCisKK0FDX0RFRlVOKFtBQ19DQ19WRVJTSU9OXSwKK1sKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW0MgY29tcGlsZXIgdmVyc2lvbl0pCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJENDIC12IDI+JjEgfCBncmVwIHZlcnNpb25gCisgICAgY2FzZSAiJENPTVBJTEVSX1ZFUlNJT04iIGluCisgICAgICAgICpnY2MqKQorCSAgIGRubCBPaywgaG93IHRvIHR1cm4gJDMgaW50byB0aGUgcmVhbCAkMworCSAgIEdDQ19WRVJTSU9OPWBlY2hvICRDT01QSUxFUl9WRVJTSU9OIHwgXAorCSAgIHNlZCAtZSAncy9bW14gXV0qXCBbW14gXV0qXCBcKFtbXiBdXSpcKVwgLiovXDEvJ2AgOzsKKwkqKSBHQ0NfVkVSU0lPTj11bmtub3duIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoJEdDQ19WRVJTSU9OKQorXSkKKworZG5sIEFDX1RSWV9DQ0ZMQUcoW0NDRkxBR10sIFtWQVJdLCBbQUNUSU9OLUlGLVdPUktTXSwgW0FDVElPTi1JRi1GQUlMU10pCitkbmwgY2hlY2sgaWYgJENDIHN1cHBvcnRzIGEgZ2l2ZW4gZmxhZworCitBQ19ERUZVTihbQUNfVFJZX0NDRkxBR10sCitbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgICAgYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0kMQorICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBhY2NlcHRzICQxIGZsYWddLCBbYWNfY3ZfZmxhZ18kMl0sCisJW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCisJCQkgICBbQVNfVkFSX1NFVChbYWNfY3ZfZmxhZ18kMl0sIFt5ZXNdKV0sCisJCQkgICBbQVNfVkFSX1NFVChbYWNfY3ZfZmxhZ18kMl0sIFtub10pXSldKQorICAgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyAgICAkMj1BU19WQVJfR0VUKFthY19jdl9mbGFnXyQyXSkKKyAgICBpZiB0ZXN0ICIkMiIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskM10sIFtdLCBbOl0sIFskM10pCisgICAgZWxzZQorICAgICAgICBpZmVsc2UoWyQ0XSwgW10sIFs6XSwgWyQ0XSkKKyAgICBmaQorXSkKKworZG5sIEFDX0lGX1lFUyhbVEVTVC1GT1ItWUVTXSwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCitkbmwgQVNfSUYoKSBhYnN0cmFjdGlvbiwgY2hlY2tzIHNoZWxsIHZhcmlhYmxlIGZvciAneWVzJworQUNfREVGVU4oW0FDX0lGX1lFU10sIFtBU19JRihbdGVzdCAkJDEgPSB5ZXNdLCBbJDJdLCBbJDNdKV0pCisKK2RubCBBQ19UUllfTERGTEFHUyhbTERGTEFHU10sIFtWQVJdLCBbQUNUSU9OLUlGLVdPUktTXSwgW0FDVElPTi1JRi1GQUlMU10pCitkbmwgY2hlY2sgaWYgJENDIHN1cHBvcnRzIGdpdmVuIGxkIGZsYWdzCisKK0FDX0RFRlVOKFtBQ19UUllfTERGTEFHU10sCitbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgICAgYWNfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgTERGTEFHUz0kMQorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBhY2NlcHRzICQxIGxkIGZsYWdzXSwgW2FjX2N2X2ZsYWdfJDJdLAorCVtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAorCQkJW0FTX1ZBUl9TRVQoW2FjX2N2X2ZsYWdfJDJdLCBbeWVzXSldLAorCQkJW0FTX1ZBUl9TRVQoW2FjX2N2X2ZsYWdfJDJdLCBbbm9dKV0pXSkKKyAgICBMREZMQUdTPSRhY19zYXZlX0xERkxBR1MKKyAgICAkMj1BU19WQVJfR0VUKFthY19jdl9mbGFnXyQyXSkKKyAgICBpZiB0ZXN0ICIkMiIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskM10sIFtdLCBbOl0sIFskM10pCisgICAgZWxzZQorICAgICAgICBpZmVsc2UoWyQ0XSwgW10sIFs6XSwgWyQ0XSkKKyAgICBmaQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwubTQgYi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTA3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsLm00CkBAIC0wLDAgKzEsNTM5IEBACisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xNSAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19DT05GSUdfTUFDUk9fRElSU10sIFttNF9kZWZ1bihbX0FNX0NPTkZJR19NQUNST19ESVJTXSwgW10pbTRfZGVmdW4oW0FDX0NPTkZJR19NQUNST19ESVJTXSwgW19BTV9DT05GSUdfTUFDUk9fRElSUygkQCldKV0pCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHl0aG9uX21vZHVsZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BZVEhPTl9NT0RVTEUobW9kbmFtZVssIGZhdGFsLCBweXRob25dKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrcyBmb3IgUHl0aG9uIG1vZHVsZS4KKyMKKyMgICBJZiBmYXRhbCBpcyBub24tZW1wdHkgdGhlbiBhYnNlbmNlIG9mIGEgbW9kdWxlIHdpbGwgdHJpZ2dlciBhbiBlcnJvci4KKyMgICBUaGUgdGhpcmQgcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgInB5dGhvbiIgZm9yIFB5dGhvbiAyIG9yICJweXRob24zIiBmb3IKKyMgICBQeXRob24gMzsgZGVmYXVsdHMgdG8gUHl0aG9uIDMuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQW5kcmV3IENvbGxpZXIKKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgOAorCitBVV9BTElBUyhbQUNfUFlUSE9OX01PRFVMRV0sIFtBWF9QWVRIT05fTU9EVUxFXSkKK0FDX0RFRlVOKFtBWF9QWVRIT05fTU9EVUxFXSxbCisgICAgaWYgdGVzdCAteiAkUFlUSE9OOworICAgIHRoZW4KKyAgICAgICAgaWYgdGVzdCAteiAiJDMiOworICAgICAgICB0aGVuCisgICAgICAgICAgICBQWVRIT049InB5dGhvbjMiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFBZVEhPTj0iJDMiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBQWVRIT05fTkFNRT1gYmFzZW5hbWUgJFBZVEhPTmAKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoJFBZVEhPTl9OQU1FIG1vZHVsZTogJDEpCisgICAgJFBZVEhPTiAtYyAiaW1wb3J0ICQxIiAyPi9kZXYvbnVsbAorICAgIGlmIHRlc3QgJD8gLWVxIDA7CisgICAgdGhlbgorICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgZXZhbCBBU19UUl9DUFAoSEFWRV9QWU1PRF8kMSk9eWVzCisgICAgZWxzZQorICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICBldmFsIEFTX1RSX0NQUChIQVZFX1BZTU9EXyQxKT1ubworICAgICAgICAjCisgICAgICAgIGlmIHRlc3QgLW4gIiQyIgorICAgICAgICB0aGVuCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoZmFpbGVkIHRvIGZpbmQgcmVxdWlyZWQgbW9kdWxlICQxKQorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgZmkKK10pCisKKyMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgc2VyaWFsIDEgKHBrZy1jb25maWctMC4yNCkKKyMgCisjIENvcHlyaWdodCDCqSAyMDA0IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwKK1ttNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKK200X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF8oUEFUSHxMSUJESVJ8U1lTUk9PVF9ESVJ8QUxMT1dfU1lTVEVNXyhDRkxBR1N8TElCUykpKT8kXSkKK200X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHXyhESVNBQkxFX1VOSU5TVEFMTEVEfFRPUF9CVUlMRF9ESVJ8REVCVUdfU1BFVykkXSkKK0FDX0FSR19WQVIoW1BLR19DT05GSUddLCBbcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHldKQorQUNfQVJHX1ZBUihbUEtHX0NPTkZJR19QQVRIXSwgW2RpcmVjdG9yaWVzIHRvIGFkZCB0byBwa2ctY29uZmlnJ3Mgc2VhcmNoIHBhdGhdKQorQUNfQVJHX1ZBUihbUEtHX0NPTkZJR19MSUJESVJdLCBbcGF0aCBvdmVycmlkaW5nIHBrZy1jb25maWcncyBidWlsdC1pbiBzZWFyY2ggcGF0aF0pCisKK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KKwlBQ19QQVRIX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCitmaQoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisJX3BrZ19taW5fdmVyc2lvbj1tNF9kZWZhdWx0KFskMV0sIFswLjkuMF0pCisJQUNfTVNHX0NIRUNLSU5HKFtwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb25dKQorCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCWVsc2UKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlQS0dfQ09ORklHPSIiCisJZmkKK2ZpW11kbmwKK10pIyBQS0dfUFJPR19QS0dfQ09ORklHCisKKyMgUEtHX0NIRUNLX0VYSVNUUyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3RzLiAgU2ltaWxhcgorIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZhcmlhYmxlcyBvciBwcmludCBlcnJvcnMuCisjCisjIFBsZWFzZSByZW1lbWJlciB0aGF0IG00IGV4cGFuZHMgQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCisjIG9ubHkgYXQgdGhlIGZpcnN0IG9jY3VyZW5jZSBpbiBjb25maWd1cmUuYWMsIHNvIGlmIHRoZSBmaXJzdCBwbGFjZQorIyBpdCdzIGNhbGxlZCBtaWdodCBiZSBza2lwcGVkIChzdWNoIGFzIGlmIGl0IGlzIHdpdGhpbiBhbiAiaWYiLCB5b3UKKyMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgQUNfUlVOX0xPRyhbJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIiQxIl0pOyB0aGVuCisgIG00X2RlZmF1bHQoWyQyXSwgWzpdKQorbTRfaWZ2YWxuKFskM10sIFtlbHNlCisgICQzXSlkbmwKK2ZpXSkKKworIyBfUEtHX0NPTkZJRyhbVkFSSUFCTEVdLCBbQ09NTUFORF0sIFtNT0RVTEVTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19QS0dfQ09ORklHXSwKK1tpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCisgICAgcGtnX2N2X1tdJDE9IiQkMSIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKKyAgICAgICAgICAgICAgICAgICAgIFtwa2dfY3ZfW10kMT1gJFBLR19DT05GSUcgLS1bXSQyICIkMyIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcyBdLAorCQkgICAgIFtwa2dfZmFpbGVkPXllc10pCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmlbXWRubAorXSkjIF9QS0dfQ09ORklHCisKKyMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaVtdZG5sCitdKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisKKworIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAorIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisjCisjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCisjIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCisjIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYworIworIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCisKK3BrZ19mYWlsZWQ9bm8KK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKKworX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCitfUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQorCittNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCithbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAlBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKKyAgICAgICAgZWxzZSAKKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICIkMiIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkJDFbXV9QS0dfRVJST1JTIiA+JkFTX01FU1NBR0VfTE9HX0ZECisKKwltNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoCitbUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6CisKKyQkMV9QS0dfRVJST1JTCisKK0NvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQoraW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KKworX1BLR19URVhUXSlbXWRubAorICAgICAgICBdKQorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorICAgICAJQUNfTVNHX1JFU1VMVChbbm9dKQorCW00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19GQUlMVVJFKAorW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgorCitfUEtHX1RFWFQKKworVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSlbXWRubAorICAgICAgICBdKQorZWxzZQorCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUworCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCisgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJJDMKK2ZpW11kbmwKK10pIyBQS0dfQ0hFQ0tfTU9EVUxFUworCisKKyMgUEtHX0lOU1RBTExESVIoRElSRUNUT1JZKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFN1YnN0aXR1dGVzIHRoZSB2YXJpYWJsZSBwa2djb25maWdkaXIgYXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbW9kdWxlCisjIHNob3VsZCBpbnN0YWxsIHBrZy1jb25maWcgLnBjIGZpbGVzLiBCeSBkZWZhdWx0IHRoZSBkaXJlY3RvcnkgaXMKKyMgJGxpYmRpci9wa2djb25maWcsIGJ1dCB0aGUgZGVmYXVsdCBjYW4gYmUgY2hhbmdlZCBieSBwYXNzaW5nCisjIERJUkVDVE9SWS4gVGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRocm91Z2ggdGhlIC0td2l0aC1wa2djb25maWdkaXIKKyMgcGFyYW1ldGVyLgorQUNfREVGVU4oW1BLR19JTlNUQUxMRElSXSwKK1ttNF9wdXNoZGVmKFtwa2dfZGVmYXVsdF0sIFttNF9kZWZhdWx0KFskMV0sIFsnJHtsaWJkaXJ9L3BrZ2NvbmZpZyddKV0pCittNF9wdXNoZGVmKFtwa2dfZGVzY3JpcHRpb25dLAorICAgIFtwa2ctY29uZmlnIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgQDw6QF1wa2dfZGVmYXVsdFtAOj5AXSkKK0FDX0FSR19XSVRIKFtwa2djb25maWdkaXJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBrZ2NvbmZpZ2Rpcl0sIHBrZ19kZXNjcmlwdGlvbildLCwKKyAgICBbd2l0aF9wa2djb25maWdkaXI9XXBrZ19kZWZhdWx0KQorQUNfU1VCU1QoW3BrZ2NvbmZpZ2Rpcl0sIFskd2l0aF9wa2djb25maWdkaXJdKQorbTRfcG9wZGVmKFtwa2dfZGVmYXVsdF0pCittNF9wb3BkZWYoW3BrZ19kZXNjcmlwdGlvbl0pCitdKSBkbmwgUEtHX0lOU1RBTExESVIKKworCisjIFBLR19OT0FSQ0hfSU5TVEFMTERJUihESVJFQ1RPUlkpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3Vic3RpdHV0ZXMgdGhlIHZhcmlhYmxlIG5vYXJjaF9wa2djb25maWdkaXIgYXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEKKyMgbW9kdWxlIHNob3VsZCBpbnN0YWxsIGFyY2gtaW5kZXBlbmRlbnQgcGtnLWNvbmZpZyAucGMgZmlsZXMuIEJ5CisjIGRlZmF1bHQgdGhlIGRpcmVjdG9yeSBpcyAkZGF0YWRpci9wa2djb25maWcsIGJ1dCB0aGUgZGVmYXVsdCBjYW4gYmUKKyMgY2hhbmdlZCBieSBwYXNzaW5nIERJUkVDVE9SWS4gVGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRocm91Z2ggdGhlCisjIC0td2l0aC1ub2FyY2gtcGtnY29uZmlnZGlyIHBhcmFtZXRlci4KK0FDX0RFRlVOKFtQS0dfTk9BUkNIX0lOU1RBTExESVJdLAorW200X3B1c2hkZWYoW3BrZ19kZWZhdWx0XSwgW200X2RlZmF1bHQoWyQxXSwgWycke2RhdGFkaXJ9L3BrZ2NvbmZpZyddKV0pCittNF9wdXNoZGVmKFtwa2dfZGVzY3JpcHRpb25dLAorICAgIFtwa2ctY29uZmlnIGFyY2gtaW5kZXBlbmRlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBAPDpAXXBrZ19kZWZhdWx0W0A6PkBdKQorQUNfQVJHX1dJVEgoW25vYXJjaC1wa2djb25maWdkaXJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLW5vYXJjaC1wa2djb25maWdkaXJdLCBwa2dfZGVzY3JpcHRpb24pXSwsCisgICAgW3dpdGhfbm9hcmNoX3BrZ2NvbmZpZ2Rpcj1dcGtnX2RlZmF1bHQpCitBQ19TVUJTVChbbm9hcmNoX3BrZ2NvbmZpZ2Rpcl0sIFskd2l0aF9ub2FyY2hfcGtnY29uZmlnZGlyXSkKK200X3BvcGRlZihbcGtnX2RlZmF1bHRdKQorbTRfcG9wZGVmKFtwa2dfZGVzY3JpcHRpb25dKQorXSkgZG5sIFBLR19OT0FSQ0hfSU5TVEFMTERJUgorCisKKyMgUEtHX0NIRUNLX1ZBUihWQVJJQUJMRSwgTU9EVUxFLCBDT05GSUctVkFSSUFCTEUsCisjIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgcGtnLWNvbmZpZyB2YXJpYWJsZSBmb3IgdGhlIGdpdmVuIG1vZHVsZS4KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfVkFSXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK0FDX0FSR19WQVIoWyQxXSwgW3ZhbHVlIG9mICQzIGZvciAkMiwgb3ZlcnJpZGluZyBwa2ctY29uZmlnXSlkbmwKKworX1BLR19DT05GSUcoWyQxXSwgW3ZhcmlhYmxlPSJdWyQzXVsiXSwgWyQyXSkKK0FTX1ZBUl9DT1BZKFskMV0sIFtwa2dfY3ZfXVskMV0pCisKK0FTX1ZBUl9JRihbJDFdLCBbIiJdLCBbJDVdLCBbJDRdKWRubAorXSkjIFBLR19DSEVDS19WQVIKKworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisKKyMgQU1fUEFUSF9QWVRIT04oW01JTklNVU0tVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRzIHN1cHBvcnQgZm9yIGRpc3RyaWJ1dGluZyBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMuICBUbworIyBpbnN0YWxsIG1vZHVsZXMsIGNvcHkgdGhlbSB0byAkKHB5dGhvbmRpciksIHVzaW5nIHRoZSBweXRob25fUFlUSE9OCisjIGF1dG9tYWtlIHZhcmlhYmxlLiAgVG8gaW5zdGFsbCBhIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQorIyBhdXRvbWFrZSBwYWNrYWdlLCBpbnN0YWxsIHRvICQocGtncHl0aG9uZGlyKSwgb3IgdXNlIHRoZQorIyBwa2dweXRob25fUFlUSE9OIGF1dG9tYWtlIHZhcmlhYmxlLgorIworIyBUaGUgdmFyaWFibGVzICQocHlleGVjZGlyKSBhbmQgJChwa2dweWV4ZWNkaXIpIGFyZSBwcm92aWRlZCBhcworIyBsb2NhdGlvbnMgdG8gaW5zdGFsbCBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMgKHNoYXJlZCBsaWJyYXJpZXMpLgorIyBBbm90aGVyIG1hY3JvIGlzIHJlcXVpcmVkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIHRvIGNvbXBpbGUKKyMgZXh0ZW5zaW9uIG1vZHVsZXMuCisjCisjIElmIHlvdXIgcGFja2FnZSBpcyBjb25maWd1cmVkIHdpdGggYSBkaWZmZXJlbnQgcHJlZml4IHRvIHB5dGhvbiwKKyMgdXNlcnMgd2lsbCBoYXZlIHRvIGFkZCB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgdG8gdGhlIFBZVEhPTlBBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGNyZWF0ZSBhIC5wdGggZmlsZSAoc2VlIHRoZSBweXRob24KKyMgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscykuCisjCisjIElmIHRoZSBNSU5JTVVNLVZFUlNJT04gYXJndW1lbnQgaXMgcGFzc2VkLCBBTV9QQVRIX1BZVEhPTiB3aWxsCisjIGNhdXNlIGFuIGVycm9yIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbQorIyBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVtZW50LiAgTUlOSU1VTS1WRVJTSU9OIHNob3VsZCBjb25zaXN0IG9mCisjIG51bWJlcnMgYW5kIGRvdHMgb25seS4KK0FDX0RFRlVOKFtBTV9QQVRIX1BZVEhPTl0sCisgWworICBkbmwgRmluZCBhIFB5dGhvbiBpbnRlcnByZXRlci4gIFB5dGhvbiB2ZXJzaW9ucyBwcmlvciB0byAyLjAgYXJlIG5vdAorICBkbmwgc3VwcG9ydGVkLiAoMi4wIHdhcyByZWxlYXNlZCBvbiBPY3RvYmVyIDE2LCAyMDAwKS4KKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BTV9QWVRIT05fSU5URVJQUkVURVJfTElTVF0sCitbcHl0aG9uIHB5dGhvbjIgcHl0aG9uMyBweXRob24zLjMgcHl0aG9uMy4yIHB5dGhvbjMuMSBweXRob24zLjAgcHl0aG9uMi43IGRubAorIHB5dGhvbjIuNiBweXRob24yLjUgcHl0aG9uMi40IHB5dGhvbjIuMyBweXRob24yLjIgcHl0aG9uMi4xIHB5dGhvbjIuMF0pCisKKyAgQUNfQVJHX1ZBUihbUFlUSE9OXSwgW3RoZSBQeXRob24gaW50ZXJwcmV0ZXJdKQorCisgIG00X2lmKFskMV0sW10sWworICAgIGRubCBObyB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4KKyAgICAjIEZpbmQgYW55IFB5dGhvbiBpbnRlcnByZXRlci4KKyAgICBpZiB0ZXN0IC16ICIkUFlUSE9OIjsgdGhlbgorICAgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OXSwgX0FNX1BZVEhPTl9JTlRFUlBSRVRFUl9MSVNULCA6KQorICAgIGZpCisgICAgYW1fZGlzcGxheV9QWVRIT049cHl0aG9uCisgIF0sIFsKKyAgICBkbmwgQSB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4KKyAgICBpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgorICAgICAgIyBJZiB0aGUgdXNlciBzZXQgJFBZVEhPTiwgdXNlIGl0IGFuZCBkb24ndCBzZWFyY2ggc29tZXRoaW5nIGVsc2UuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJFBZVEhPTiB2ZXJzaW9uIGlzID49ICQxXSkKKyAgICAgIEFNX1BZVEhPTl9DSEVDS19WRVJTSU9OKFskUFlUSE9OXSwgWyQxXSwKKwkJCSAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisJCQkgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQorCQkJICAgICAgIEFDX01TR19FUlJPUihbUHl0aG9uIGludGVycHJldGVyIGlzIHRvbyBvbGRdKV0pCisgICAgICBhbV9kaXNwbGF5X1BZVEhPTj0kUFlUSE9OCisgICAgZWxzZQorICAgICAgIyBPdGhlcndpc2UsIHRyeSBlYWNoIGludGVycHJldGVyIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgc2F0aXNmaWVzCisgICAgICAjIFZFUlNJT04uCisgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIGEgUHl0aG9uIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAkMV0sCisJW2FtX2N2X3BhdGhsZXNzX1BZVEhPTl0sWworCWZvciBhbV9jdl9wYXRobGVzc19QWVRIT04gaW4gX0FNX1BZVEhPTl9JTlRFUlBSRVRFUl9MSVNUIG5vbmU7IGRvCisJICB0ZXN0ICIkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIiA9IG5vbmUgJiYgYnJlYWsKKwkgIEFNX1BZVEhPTl9DSEVDS19WRVJTSU9OKFskYW1fY3ZfcGF0aGxlc3NfUFlUSE9OXSwgWyQxXSwgW2JyZWFrXSkKKwlkb25lXSkKKyAgICAgICMgU2V0ICRQWVRIT04gdG8gdGhlIGFic29sdXRlIHBhdGggb2YgJGFtX2N2X3BhdGhsZXNzX1BZVEhPTi4KKyAgICAgIGlmIHRlc3QgIiRhbV9jdl9wYXRobGVzc19QWVRIT04iID0gbm9uZTsgdGhlbgorCVBZVEhPTj06CisgICAgICBlbHNlCisgICAgICAgIEFDX1BBVEhfUFJPRyhbUFlUSE9OXSwgWyRhbV9jdl9wYXRobGVzc19QWVRIT05dKQorICAgICAgZmkKKyAgICAgIGFtX2Rpc3BsYXlfUFlUSE9OPSRhbV9jdl9wYXRobGVzc19QWVRIT04KKyAgICBmaQorICBdKQorCisgIGlmIHRlc3QgIiRQWVRIT04iID0gOjsgdGhlbgorICBkbmwgUnVuIGFueSB1c2VyLXNwZWNpZmllZCBhY3Rpb24sIG9yIGFib3J0LgorICAgIG00X2RlZmF1bHQoWyQzXSwgW0FDX01TR19FUlJPUihbbm8gc3VpdGFibGUgUHl0aG9uIGludGVycHJldGVyIGZvdW5kXSldKQorICBlbHNlCisKKyAgZG5sIFF1ZXJ5IFB5dGhvbiBmb3IgaXRzIHZlcnNpb24gbnVtYmVyLiAgR2V0dGluZyBbOjNdIHNlZW1zIHRvIGJlCisgIGRubCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpczsgaXQncyB3aGF0ICJzaXRlLnB5IiBkb2VzIGluIHRoZSBzdGFuZGFyZAorICBkbmwgbGlicmFyeS4KKworICBBQ19DQUNIRV9DSEVDSyhbZm9yICRhbV9kaXNwbGF5X1BZVEhPTiB2ZXJzaW9uXSwgW2FtX2N2X3B5dGhvbl92ZXJzaW9uXSwKKyAgICBbYW1fY3ZfcHl0aG9uX3ZlcnNpb249YCRQWVRIT04gLWMgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3lzLnZlcnNpb25bWzozXV0pImBdKQorICBBQ19TVUJTVChbUFlUSE9OX1ZFUlNJT05dLCBbJGFtX2N2X3B5dGhvbl92ZXJzaW9uXSkKKworICBkbmwgVXNlIHRoZSB2YWx1ZXMgb2YgJHByZWZpeCBhbmQgJGV4ZWNfcHJlZml4IGZvciB0aGUgY29ycmVzcG9uZGluZworICBkbmwgdmFsdWVzIG9mIFBZVEhPTl9QUkVGSVggYW5kIFBZVEhPTl9FWEVDX1BSRUZJWC4gIFRoZXNlIGFyZSBtYWRlCisgIGRubCBkaXN0aW5jdCB2YXJpYWJsZXMgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiAgSG93ZXZlciwKKyAgZG5sIGdlbmVyYWwgY29uc2Vuc3VzIGlzIHRoYXQgeW91IHNob3VsZG4ndCBuZWVkIHRoaXMgYWJpbGl0eS4KKworICBBQ19TVUJTVChbUFlUSE9OX1BSRUZJWF0sIFsnJHtwcmVmaXh9J10pCisgIEFDX1NVQlNUKFtQWVRIT05fRVhFQ19QUkVGSVhdLCBbJyR7ZXhlY19wcmVmaXh9J10pCisKKyAgZG5sIEF0IHRpbWVzIChsaWtlIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcykgeW91IG1heSB3YW50CisgIGRubCB0byBrbm93IHdoaWNoIE9TIHBsYXRmb3JtIFB5dGhvbiB0aGlua3MgdGhpcyBpcy4KKworICBBQ19DQUNIRV9DSEVDSyhbZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBwbGF0Zm9ybV0sIFthbV9jdl9weXRob25fcGxhdGZvcm1dLAorICAgIFthbV9jdl9weXRob25fcGxhdGZvcm09YCRQWVRIT04gLWMgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3lzLnBsYXRmb3JtKSJgXSkKKyAgQUNfU1VCU1QoW1BZVEhPTl9QTEFURk9STV0sIFskYW1fY3ZfcHl0aG9uX3BsYXRmb3JtXSkKKworICAjIEp1c3QgZmFjdG9yIG91dCBzb21lIGNvZGUgZHVwbGljYXRpb24uCisgIGFtX3B5dGhvbl9zZXR1cF9zeXNjb25maWc9IlwKK2ltcG9ydCBzeXMKKyMgUHJlZmVyIHN5c2NvbmZpZyBvdmVyIGRpc3R1dGlscy5zeXNjb25maWcsIGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eQorIyB3aXRoIHB5dGhvbiAzLnguICBTZWUgYXV0b21ha2UgYnVnIzEwMjI3LgordHJ5OgorICAgIGltcG9ydCBzeXNjb25maWcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjYW5fdXNlX3N5c2NvbmZpZyA9IDAKK2Vsc2U6CisgICAgY2FuX3VzZV9zeXNjb25maWcgPSAxCisjIENhbid0IHVzZSBzeXNjb25maWcgaW4gQ1B5dGhvbiAyLjcsIHNpbmNlIGl0J3MgYnJva2VuIGluIHZpcnR1YWxlbnZzOgorIyA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvdmlydHVhbGVudi9pc3N1ZXMvMTE4PgordHJ5OgorICAgIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl9pbXBsZW1lbnRhdGlvbgorICAgIGlmIHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICdDUHl0aG9uJyBhbmQgc3lzLnZlcnNpb25bWzozXV0gPT0gJzIuNyc6CisgICAgICAgIGNhbl91c2Vfc3lzY29uZmlnID0gMAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MiCisKKyAgZG5sIFNldCB1cCA0IGRpcmVjdG9yaWVzOgorCisgIGRubCBweXRob25kaXIgLS0gd2hlcmUgdG8gaW5zdGFsbCBweXRob24gc2NyaXB0cy4gIFRoaXMgaXMgdGhlCisgIGRubCAgIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5LCBub3QgdGhlIHB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5CisgIGRubCAgIGRpcmVjdG9yeSBsaWtlIGluIHByZXZpb3VzIGF1dG9tYWtlIGJldGFzLiAgVGhpcyBiZWhhdmlvcgorICBkbmwgICBpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBsaXNwZGlyLm00IGZvciBleGFtcGxlLgorICBkbmwgUXVlcnkgZGlzdHV0aWxzIGZvciB0aGlzIGRpcmVjdG9yeS4KKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYW1fZGlzcGxheV9QWVRIT04gc2NyaXB0IGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weXRob25kaXJdLAorICAgIFtpZiB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORQorICAgICB0aGVuCisgICAgICAgYW1fcHlfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgICBlbHNlCisgICAgICAgYW1fcHlfcHJlZml4PSRwcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcj1gJFBZVEhPTiAtYyAiCiskYW1fcHl0aG9uX3NldHVwX3N5c2NvbmZpZworaWYgY2FuX3VzZV9zeXNjb25maWc6CisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcGF0aCgncHVyZWxpYicsIHZhcnM9eydiYXNlJzonJGFtX3B5X3ByZWZpeCd9KQorZWxzZToKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigwLCAwLCBwcmVmaXg9JyRhbV9weV9wcmVmaXgnKQorc3lzLnN0ZG91dC53cml0ZShzaXRlZGlyKSJgCisgICAgIGNhc2UgJGFtX2N2X3B5dGhvbl9weXRob25kaXIgaW4KKyAgICAgJGFtX3B5X3ByZWZpeCopCisgICAgICAgYW1fX3N0cmlwX3ByZWZpeD1gZWNobyAiJGFtX3B5X3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weXRob25kaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHl0aG9uZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9QUkVGSVgsImAKKyAgICAgICA7OworICAgICAqKQorICAgICAgIGNhc2UgJGFtX3B5X3ByZWZpeCBpbgorICAgICAgICAgL3VzcnwvU3lzdGVtKikgOzsKKyAgICAgICAgICopCisJICBhbV9jdl9weXRob25fcHl0aG9uZGlyPSRQWVRIT05fUFJFRklYL2xpYi9weXRob24kUFlUSE9OX1ZFUlNJT04vc2l0ZS1wYWNrYWdlcworCSAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgZXNhYworICAgIF0pCisgIEFDX1NVQlNUKFtweXRob25kaXJdLCBbJGFtX2N2X3B5dGhvbl9weXRob25kaXJdKQorCisgIGRubCBwa2dweXRob25kaXIgLS0gJFBBQ0tBR0UgZGlyZWN0b3J5IHVuZGVyIHB5dGhvbmRpci4gIFdhcworICBkbmwgICBQWVRIT05fU0lURV9QQUNLQUdFIGluIHByZXZpb3VzIGJldGFzLCBidXQgdGhpcyBuYW1pbmcgaXMKKyAgZG5sICAgbW9yZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgYXV0b21ha2UuCisKKyAgQUNfU1VCU1QoW3BrZ3B5dGhvbmRpcl0sIFtcJHtweXRob25kaXJ9LyRQQUNLQUdFXSkKKworICBkbmwgcHlleGVjZGlyIC0tIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBweXRob24gZXh0ZW5zaW9uIG1vZHVsZXMKKyAgZG5sICAgKHNoYXJlZCBsaWJyYXJpZXMpCisgIGRubCBRdWVyeSBkaXN0dXRpbHMgZm9yIHRoaXMgZGlyZWN0b3J5LgorICBBQ19DQUNIRV9DSEVDSyhbZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBleHRlbnNpb24gbW9kdWxlIGRpcmVjdG9yeV0sCisgICAgW2FtX2N2X3B5dGhvbl9weWV4ZWNkaXJdLAorICAgIFtpZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FCisgICAgIHRoZW4KKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kYW1fcHlfcHJlZml4CisgICAgIGVsc2UKKyAgICAgICBhbV9weV9leGVjX3ByZWZpeD0kZXhlY19wcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcj1gJFBZVEhPTiAtYyAiCiskYW1fcHl0aG9uX3NldHVwX3N5c2NvbmZpZworaWYgY2FuX3VzZV9zeXNjb25maWc6CisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcGF0aCgncGxhdGxpYicsIHZhcnM9eydwbGF0YmFzZSc6JyRhbV9weV9wcmVmaXgnfSkKK2Vsc2U6CisgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworICAgIHNpdGVkaXIgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoMSwgMCwgcHJlZml4PSckYW1fcHlfcHJlZml4JykKK3N5cy5zdGRvdXQud3JpdGUoc2l0ZWRpcikiYAorICAgICBjYXNlICRhbV9jdl9weXRob25fcHlleGVjZGlyIGluCisgICAgICRhbV9weV9leGVjX3ByZWZpeCopCisgICAgICAgYW1fX3N0cmlwX3ByZWZpeD1gZWNobyAiJGFtX3B5X2V4ZWNfcHJlZml4IiB8IHNlZCAnc3wufC58ZydgCisgICAgICAgYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcj1gZWNobyAiJGFtX2N2X3B5dGhvbl9weWV4ZWNkaXIiIHwgc2VkICJzLF4kYW1fX3N0cmlwX3ByZWZpeCwkUFlUSE9OX0VYRUNfUFJFRklYLCJgCisgICAgICAgOzsKKyAgICAgKikKKyAgICAgICBjYXNlICRhbV9weV9leGVjX3ByZWZpeCBpbgorICAgICAgICAgL3VzcnwvU3lzdGVtKikgOzsKKyAgICAgICAgICopCisJICAgYW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcj0kUFlUSE9OX0VYRUNfUFJFRklYL2xpYi9weXRob24kUFlUSE9OX1ZFUlNJT04vc2l0ZS1wYWNrYWdlcworCSAgIDs7CisgICAgICAgZXNhYworICAgICAgIDs7CisgICAgIGVzYWMKKyAgICBdKQorICBBQ19TVUJTVChbcHlleGVjZGlyXSwgWyRhbV9jdl9weXRob25fcHlleGVjZGlyXSkKKworICBkbmwgcGtncHlleGVjZGlyIC0tICQocHlleGVjZGlyKS8kKFBBQ0tBR0UpCisKKyAgQUNfU1VCU1QoW3BrZ3B5ZXhlY2Rpcl0sIFtcJHtweWV4ZWNkaXJ9LyRQQUNLQUdFXSkKKworICBkbmwgUnVuIGFueSB1c2VyLXNwZWNpZmllZCBhY3Rpb24uCisgICQyCisgIGZpCisKK10pCisKKworIyBBTV9QWVRIT05fQ0hFQ0tfVkVSU0lPTihQUk9HLCBWRVJTSU9OLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJ1biBBQ1RJT04tSUYtVFJVRSBpZiB0aGUgUHl0aG9uIGludGVycHJldGVyIFBST0cgaGFzIHZlcnNpb24gPj0gVkVSU0lPTi4KKyMgUnVuIEFDVElPTi1JRi1GQUxTRSBvdGhlcndpc2UuCisjIFRoaXMgdGVzdCB1c2VzIHN5cy5oZXh2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIHN0cmluZyBlcXVpdmFsZW50IChmaXJzdAorIyB3b3JkIG9mIHN5cy52ZXJzaW9uKSwgaW4gb3JkZXIgdG8gY29wZSB3aXRoIHZlcnNpb25zIHN1Y2ggYXMgMi4yYzEuCisjIFRoaXMgc3VwcG9ydHMgUHl0aG9uIDIuMCBvciBoaWdoZXIuICgyLjAgd2FzIHJlbGVhc2VkIG9uIE9jdG9iZXIgMTYsIDIwMDApLgorQUNfREVGVU4oW0FNX1BZVEhPTl9DSEVDS19WRVJTSU9OXSwKKyBbcHJvZz0iaW1wb3J0IHN5cworIyBzcGxpdCBzdHJpbmdzIGJ5ICcuJyBhbmQgY29udmVydCB0byBudW1lcmljLiAgQXBwZW5kIHNvbWUgemVyb3MKKyMgYmVjYXVzZSB3ZSBuZWVkIGF0IGxlYXN0IDQgZGlnaXRzIGZvciB0aGUgaGV4IGNvbnZlcnNpb24uCisjIG1hcCByZXR1cm5zIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLjAgYW5kIGEgbGlzdCBpbiAyLngKK21pbnZlciA9IGxpc3QobWFwKGludCwgJyQyJy5zcGxpdCgnLicpKSkgKyBbWzAsIDAsIDBdXQorbWludmVyaGV4ID0gMAorIyB4cmFuZ2UgaXMgbm90IHByZXNlbnQgaW4gUHl0aG9uIDMuMCBhbmQgcmFuZ2UgcmV0dXJucyBhbiBpdGVyYXRvcgorZm9yIGkgaW4gbGlzdChyYW5nZSgwLCA0KSk6IG1pbnZlcmhleCA9IChtaW52ZXJoZXggPDwgOCkgKyBtaW52ZXJbW2ldXQorc3lzLmV4aXQoc3lzLmhleHZlcnNpb24gPCBtaW52ZXJoZXgpIgorICBBU19JRihbQU1fUlVOX0xPRyhbJDEgLWMgIiRwcm9nIl0pXSwgWyQzXSwgWyQ0XSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUlVOX0xPRyhDT01NQU5EKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJ1biBDT01NQU5ELCBzYXZlIHRoZSBleGl0IHN0YXR1cyBpbiBhY19zdGF0dXMsIGFuZCBsb2cgaXQuCisjIChUaGlzIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSBBdXRvY29uZidzIF9BQ19SVU5fTE9HIG1hY3JvLikKK0FDX0RFRlVOKFtBTV9SVU5fTE9HXSwKK1t7IGVjaG8gIiRhc19tZTokTElORU5POiAkMSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgKCQxKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICBhY19zdGF0dXM9JD8KKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfV0pCisKK200X2luY2x1ZGUoW2FjaW5jbHVkZS5tNF0pCmRpZmYgLS1naXQgYS9hdXRvY29uZi9jb25maWcuZ3Vlc3MgYi9hdXRvY29uZi9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQzOGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2F1dG9jb25mL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE1NjggQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgMTk5Mi0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTQtMDEtMDEnCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdAorIyBwcm9ncmFtLiAgVGhpcyBFeGNlcHRpb24gaXMgYW4gYWRkaXRpb25hbCBwZXJtaXNzaW9uIHVuZGVyIHNlY3Rpb24gNworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMyAoIkdQTHYzIikuCisjCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorIworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHdpdGggYSBDaGFuZ2VMb2cgZW50cnkgdG8gY29uZmlnLXBhdGNoZXNAZ251Lm9yZy4KKworCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IDE5OTItMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCitjYXNlICIke1VOQU1FX1NZU1RFTX0iIGluCitMaW51eHxHTlV8R05VLyopCisJIyBJZiB0aGUgc3lzdGVtIGxhY2tzIGEgY29tcGlsZXIsIHRoZW4ganVzdCBwaWNrIGdsaWJjLgorCSMgV2UgY291bGQgcHJvYmFibHkgdHJ5IGhhcmRlci4KKwlMSUJDPWdudQorCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWNhdCA8PC1FT0YgPiAkZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZiBkZWZpbmVkKF9fVUNMSUJDX18pCisJTElCQz11Y2xpYmMKKwkjZWxpZiBkZWZpbmVkKF9fZGlldGxpYmNfXykKKwlMSUJDPWRpZXRsaWJjCisJI2Vsc2UKKwlMSUJDPWdudQorCSNlbmRpZgorCUVPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJOzsKK2VzYWMKKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCQlvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6Qml0cmlnOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvQml0cmlnLi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLWJpdHJpZyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwkjIFJlc2V0IEVYSVQgdHJhcCBiZWZvcmUgZXhpdGluZyB0byBhdm9pZCBzcHVyaW91cyBub24temVybyBleGl0IGNvZGUuCisJZXhpdGNvZGU9JD8KKwl0cmFwICcnIDAKKwlleGl0ICRleGl0Y29kZSA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisJZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhcm0qOnJpc2NvczoqOip8YXJtKjpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgczM5MHg6U3VuT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpBdXJvcmFVWDo1Lio6KiB8IGk4NnhlbjpBdXJvcmFVWDo1Lio6KikKKwllY2hvIGkzODYtcGMtYXVyb3JhdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlTVU5fQVJDSD0iaTM4NiIKKwkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KKwkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCisJIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCVNVTl9BUkNIPSJ4ODZfNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisJZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKwllY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCisJZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCisJICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgorCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCisJICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKwkjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworCVVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWV4aXQgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKKwkJdGhlbgorCQkJZWNobyAiJFNZU1RFTV9OQU1FIgorCQllbHNlCisJCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJZmkKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTY3XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisJCSAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKKwkJICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorCQkgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKwkJICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCisJCSAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorCQkJY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisJCQkgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKwkJCSAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisJCQllc2FjIDs7CisJCSAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisKKwkJI2RlZmluZSBfSFBVWF9TT1VSQ0UKKwkJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCQkjaW5jbHVkZSA8dW5pc3RkLmg+CisKKwkJaW50IG1haW4gKCkKKwkJeworCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCSAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisJCSNlbmRpZgorCQkgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworCQkgICAgc3dpdGNoIChjcHUpCisJCQl7CisJCQljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzJfMDoKKwkJI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorCQkJICAgIHN3aXRjaCAoYml0cykKKwkJCQl7CisJCQkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworCQkJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKwkJCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKwkJCQl9IGJyZWFrOworCQkjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworCQkJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkjZW5kaWYKKwkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJfQorCQkgICAgZXhpdCAoMCk7CisJCX0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgLXEgX19MUDY0X18KKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorCUZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisJZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJY2FzZSAke1VOQU1FX1BST0NFU1NPUn0gaW4KKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCWVzYWMKKwlleGl0IDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVzY0KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzY0CisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6TVNZUyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXN5cworCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgOzsKKyAgICAqOkludGVyaXgqOiopCisJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsIHwgRU02NFQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tJHtMSUJDfWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpKjg2Ok1pbml4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKKwlleGl0IDs7CisgICAgYWFyY2g2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhYXJjaDY0X2JlOkxpbnV4Oio6KikKKwlVTkFNRV9NQUNISU5FPWFhcmNoNjRfYmUKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisJZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImdudWxpYmMxIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcmM6TGludXg6KjoqIHwgYXJjZWI6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWVsc2UKKwkgICAgaWYgZWNobyBfX0FSTV9QQ1NfVkZQIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJfCBncmVwIC1xIF9fQVJNX1BDU19WRlAKKwkgICAgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9ZWFiaQorCSAgICBlbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ31lYWJpaGYKKwkgICAgZmkKKwlmaQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWF4aXMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBoZXhhZ29uOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KiB8IG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9CisJI3VuZGVmICR7VU5BTUVfTUFDSElORX1lbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPSR7VU5BTUVfTUFDSElORX1lbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9JHtVTkFNRV9NQUNISU5FfQorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15DUFUnYAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC0ke0xJQkN9IjsgZXhpdDsgfQorCTs7CisgICAgb3IxazpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBvcjMyOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtJHtMSUJDfSA7OworCWVzYWMKKwlleGl0IDs7CisgICAgcHBjNjQ6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcHBjNjRsZTpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcHBjbGU6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgdGlsZSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHh0ZW5zYSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIHg4Nl82NDpIYWlrdToqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1oYWlrdQorCWV4aXQgOzsKKyAgICBTWC00OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC03OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtODpTVVBFUi1VWDoqOiopCisJZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLThSOlNVUEVSLVVYOio6KikKKwllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9IHVua25vd24gOyB0aGVuCisJICAgIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjCisJZmkKKwlpZiB0ZXN0IGBlY2hvICIkVU5BTUVfUkVMRUFTRSIgfCBzZWQgLWUgJ3MvXC4uKi8vJ2AgLWxlIDEwIDsgdGhlbgorCSAgICBpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkJaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQkgICAgZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJCQlpMzg2KSBVTkFNRV9QUk9DRVNTT1I9eDg2XzY0IDs7CisJCQlwb3dlcnBjKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYzY0IDs7CisJCSAgICBlc2FjCisJCWZpCisJICAgIGZpCisJZWxpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9IGkzODYgOyB0aGVuCisJICAgICMgQXZvaWQgZXhlY3V0aW5nIGNjIG9uIE9TIFggMTAuOSwgYXMgaXQgc2hpcHMgd2l0aCBhIHN0dWIKKwkgICAgIyB0aGF0IHB1dHMgdXAgYSBncmFwaGljYWwgYWxlcnQgcHJvbXB0aW5nIHRvIGluc3RhbGwKKwkgICAgIyBkZXZlbG9wZXIgdG9vbHMuICBBbnkgc3lzdGVtIHJ1bm5pbmcgTWFjIE9TIFggMTAuNyBvcgorCSAgICAjIGxhdGVyIChEYXJ3aW4gMTEgYW5kIGxhdGVyKSBpcyByZXF1aXJlZCB0byBoYXZlIGEgNjQtYml0CisJICAgICMgcHJvY2Vzc29yLiBUaGlzIGlzIG5vdCB0cnVlIG9mIHRoZSBBUk0gdmVyc2lvbiBvZiBEYXJ3aW4KKwkgICAgIyB0aGF0IEFwcGxlIHVzZXMgaW4gcG9ydGFibGUgZGV2aWNlcy4KKwkgICAgVU5BTUVfUFJPQ0VTU09SPXg4Nl82NAorCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTkVPLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbmVvLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TRS0qOk5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorCWVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7CisgICAgeDg2XzY0OlZNa2VybmVsOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1lc3gKKwlleGl0IDs7Citlc2FjCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2F1dG9jb25mL2NvbmZpZy5zdWIgYi9hdXRvY29uZi9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MmNmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvY29uZi9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTc5MyBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IDE5OTItMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDE0LTAxLTAxJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQKKyMgcHJvZ3JhbS4gIFRoaXMgRXhjZXB0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB3aXRoIGEgQ2hhbmdlTG9nIGVudHJ5IHRvIGNvbmZpZy1wYXRjaGVzQGdudS5vcmcuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAxOTkyLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtYW5kcm9pZCogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBcCisgIGxpbnV4LW11c2wqIHwgbGludXgtdWNsaWJjKiB8IHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwgXAorICBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICBhbmRyb2lkLWxpbnV4KQorICAgIG9zPS1saW51eC1hbmRyb2lkCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AtdW5rbm93bgorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKikKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktYmx1ZWdlbmUqKQorCQlvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNyZGIpCisJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KjE3OCkKKwkJb3M9LWx5bnhvczE3OAorCQk7OworCS1seW54KjUpCisJCW9zPS1seW54b3M1CisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhYXJjaDY0IHwgYWFyY2g2NF9iZSBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcmNlYiBcCisJfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyLThdIHwgYXJtdlszLThdW2xiXSB8IGFybXY3W2FybV0gXAorCXwgYXZyIHwgYXZyMzIgXAorCXwgYmUzMiB8IGJlNjQgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjODA1MSB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGVwaXBoYW55IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBoZXhhZ29uIFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBrMW9tIFwKKwl8IGxlMzIgfCBsZTY0IFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWljcm9ibGF6ZWVsIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzcjU5MDAgfCBtaXBzcjU5MDBlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5kczMyIHwgbmRzMzJsZSB8IG5kczMyYmUgXAorCXwgbmlvcyB8IG5pb3MyIHwgbmlvczJlYiB8IG5pb3MyZWwgXAorCXwgbnMxNmsgfCBuczMyayBcCisJfCBvcGVuOCBcCisJfCBvcjFrIHwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIFwKKwl8IHB5cmFtaWQgXAorCXwgcmw3OCB8IHJ4IFwKKwl8IHNjb3JlIFwKKwl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hlYiB8IHNoYmUgfCBzaGxlIHwgc2hbMTIzNF1sZSB8IHNoM2VsZSBcCisJfCBzaDY0IHwgc2g2NGxlIFwKKwl8IHNwYXJjIHwgc3BhcmM2NCB8IHNwYXJjNjRiIHwgc3BhcmM2NHYgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIFwKKwl8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5diBcCisJfCBzcHUgXAorCXwgdGFob2UgfCB0aWM0eCB8IHRpYzU0eCB8IHRpYzU1eCB8IHRpYzZ4IHwgdGljODAgfCB0cm9uIFwKKwl8IHViaWNvbTMyIFwKKwl8IHY4NTAgfCB2ODUwZSB8IHY4NTBlMSB8IHY4NTBlMiB8IHY4NTBlcyB8IHY4NTBlMnYzIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHN0b3JteTE2IHwgeHRlbnNhIFwKKwl8IHo4ayB8IHo4MCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJYzU0eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQk7OworCWM1NXgpCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KKwkJOzsKKwljNngpCisJCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IG02OGhjczEyeCB8IG52cHR4IHwgcGljb2NoaXApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwlzdHJvbmdhcm0gfCB0aHVtYiB8IHhzY2FsZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQk7OworCXhnYXRlKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwl4c2NhbGVlYikKKwkJYmFzaWNfbWFjaGluZT1hcm1lYi11bmtub3duCisJCTs7CisKKwl4c2NhbGVlbCkKKwkJYmFzaWNfbWFjaGluZT1hcm1lbC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWFyY2g2NC0qIHwgYWFyY2g2NF9iZS0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogfCBhcmNlYi0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJlMzItKiB8IGJlNjQtKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCisJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiBcCisJfCBjODA1MS0qIHwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGhleGFnb24tKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgazFvbS0qIFwKKwl8IGxlMzItKiB8IGxlNjQtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogXAorCXwgbWljcm9ibGF6ZS0qIHwgbWljcm9ibGF6ZWVsLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3I1OTAwLSogfCBtaXBzcjU5MDBlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIHwgbmlvczJlYi0qIHwgbmlvczJlbC0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3BlbjgtKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJsNzgtKiB8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIFwKKwl8IHRpbGUqLSogXAorCXwgdHJvbi0qIFwKKwl8IHViaWNvbTMyLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHY4NTBlMS0qIHwgdjg1MGVzLSogfCB2ODUwZTItKiB8IHY4NTBlMnYzLSogXAorCXwgdmF4LSogXAorCXwgd2UzMmstKiBcCisJfCB4ODYtKiB8IHg4Nl82NC0qIHwgeGMxNngtKiB8IHhwczEwMC0qIFwKKwl8IHhzdG9ybXkxNi0qIHwgeHRlbnNhKi0qIFwKKwl8IHltcC0qIFwKKwl8IHo4ay0qIHwgejgwLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZSwgd2l0aCBnbG9iIG1hdGNoLgorCXh0ZW5zYSopCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWFyb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tYXJvcworCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYmxhY2tmaW4pCisJCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCWJsYWNrZmluLSopCisJCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlibHVlZ2VuZSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LWNuaworCQk7OworCWM1NHgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNTV4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzZ4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNngtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNlZ2NjKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1jZWdjYworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2IHwgY3IxNi0qKQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKwlpKjg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWkqODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpKjg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaSo4NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKKwkJb3M9LW1hY2gKKwkJOzsKKwlpMzg2LXZzdGEgfCB2c3RhKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltNjhrbm9tbXUpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCW02OGtub21tdS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWljcm9ibGF6ZSopCisJCWJhc2ljX21hY2hpbmU9bWljcm9ibGF6ZS14aWxpbngKKwkJOzsKKwltaW5ndzY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tbWluZ3c2NAorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltc3lzKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1zeXMKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5hY2wpCisJCWJhc2ljX21hY2hpbmU9bGUzMi11bmtub3duCisJCW9zPS1uYWNsCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlub25zdG9wdXgpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKKwkJb3M9LW5vbnN0b3B1eAorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwluZW8tdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5lby10YW5kZW0KKwkJOzsKKwluc2UtdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zZS10YW5kZW0KKwkJOzsKKwluc3ItdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KKwkJOzsKKwlvcDUwbi0qIHwgb3A2MGMtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQlvcz0tcHJvZWxmCisJCTs7CisJb3BlbnJpc2MgfCBvcGVucmlzYy0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBhcmlzYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJcGFyaXNjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisJcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGM5OCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCTs7CisJcGM5OC0qKQorCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMgfCBwcGNiZSkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJOzsKKwlwcGMtKiB8IHBwY2JlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJkb3MgfCByZG9zNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcmRvczMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3Ryb25nYXJtLSogfCB0aHVtYi0qKQorCQliYXNpY19tYWNoaW5lPWFybS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN2MSkKKwkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXQzZSkKKwkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0OTApCisJCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpbGUqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeHNjYWxlLSogfCB4c2NhbGVlW2JsXS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL154c2NhbGUvYXJtLydgCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwl6ODAtKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4MC11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKwkjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworCSMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLWF1cm9yYXV4KQorCQlvcz0tYXVyb3JhdXgKKwkJOzsKKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCisJICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIHwgLXBsYW45KiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtYml0cmlnKiB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLW1zeXMqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbWluZ3c2NCogfCAtbGludXgtZ251KiB8IC1saW51eC1hbmRyb2lkKiBcCisJICAgICAgfCAtbGludXgtbmV3bGliKiB8IC1saW51eC1tdXNsKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKwktb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1kaWNvcyopCisJCW9zPS1kaWNvcworCQk7OworCS1uYWNsKikKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCXNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKwlzcHUtKikKKwkJb3M9LWVsZgorCQk7OworCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisJYzR4LSogfCB0aWM0eC0qKQorCQlvcz0tY29mZgorCQk7OworCWM4MDUxLSopCisJCW9zPS1lbGYKKwkJOzsKKwloZXhhZ29uLSopCisJCW9zPS1lbGYKKwkJOzsKKwl0aWM1NHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eC0qKQorCQlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltZXAtKikKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMWstKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWhhaWt1KQorCQlvcz0taGFpa3UKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktY25rKnwtYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2F1dG9jb25mL2luc3RhbGwtc2ggYi9hdXRvY29uZi9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmYmJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvY29uZi9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsNTA3IEBACisjIS9iaW4vc2gKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisKK3NjcmlwdHZlcnNpb249MjAwNi0xMC0xNC4xNQorCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKK2lmIHRlc3QgLXogIiRkb2l0IjsgdGhlbgorICBkb2l0X2V4ZWM9ZXhlYworZWxzZQorICBkb2l0X2V4ZWM9JGRvaXQKK2ZpCisKKyMgUHV0IGluIGFic29sdXRlIGZpbGUgbmFtZXMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7CisjIG9yIHVzZSBlbnZpcm9ubWVudCB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCitwb3NpeF9nbG9iPQorcG9zaXhfbWtkaXI9CisKKyMgRGVzaXJlZCBtb2RlIG9mIGluc3RhbGxlZCBmaWxlLgorbW9kZT0wNzU1CisKK2NobW9kY21kPSRjaG1vZHByb2cKK2Nob3duY21kPQorY2hncnBjbWQ9CitzdHJpcGNtZD0KK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9Citkc3Q9CitkaXJfYXJnPQorZHN0YXJnPQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKy1jICAgICAgICAgKGlnbm9yZWQpCistZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCistZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgorLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgorLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KKy10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKy1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCistLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgorLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCisiCisKK3doaWxlIHRlc3QgJCMgLW5lIDA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtYykgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZQorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAkPzs7CisKKyAgICAtbSkgbW9kZT0kMgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorCWNhc2UgJG1vZGUgaW4KKwkgIConICcqIHwgKicJJyogfCAqJworJyoJICB8IConKicqIHwgKic/JyogfCAqJ1snKikKKwkgICAgZWNobyAiJDA6IGludmFsaWQgbW9kZTogJG1vZGUiID4mMgorCSAgICBleGl0IDE7OworCWVzYWMKKyAgICAgICAgY29udGludWU7OworCisgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZworICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtdCkgZHN0YXJnPSQyCisJc2hpZnQKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWUKKwlzaGlmdAorCWNvbnRpbnVlOzsKKworICAgIC0tdmVyc2lvbikgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iOyBleGl0ICQ/OzsKKworICAgIC0tKQlzaGlmdAorCWJyZWFrOzsKKworICAgIC0qKQllY2hvICIkMDogaW52YWxpZCBvcHRpb246ICQxIiA+JjIKKwlleGl0IDE7OworCisgICAgKikgIGJyZWFrOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjIC1uZSAwICYmIHRlc3QgLXogIiRkaXJfYXJnJGRzdGFyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RhcmciOyB0aGVuCisgICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKyAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0YXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgIGZpCisgICAgc2hpZnQgIyBhcmcKKyAgICBkc3Rhcmc9JGFyZworICBkb25lCitmaQorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYyA7OworICBlc2FjCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgZHN0PSRzcmMKKyAgICBkc3RkaXI9JGRzdAorICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgZHN0ZGlyX3N0YXR1cz0kPworICBlbHNlCisKKyAgICAjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZAorICAgICMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKKyAgICAjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKyAgICBpZiB0ZXN0ICEgLWYgIiRzcmMiICYmIHRlc3QgISAtZCAiJHNyYyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0LiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGRzdGFyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdGFyZworICAgICMgUHJvdGVjdCBuYW1lcyBzdGFydGluZyB3aXRoIGAtJy4KKyAgICBjYXNlICRkc3QgaW4KKyAgICAgIC0qKSBkc3Q9Li8kZHN0IDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0YXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgICAgZHN0ZGlyPSRkc3QKKyAgICAgIGRzdD0kZHN0ZGlyL2BiYXNlbmFtZSAiJHNyYyJgCisgICAgICBkc3RkaXJfc3RhdHVzPTAKKyAgICBlbHNlCisgICAgICAjIFByZWZlciBkaXJuYW1lLCBidXQgZmFsbCBiYWNrIG9uIGEgc3Vic3RpdHV0ZSBpZiBkaXJuYW1lIGZhaWxzLgorICAgICAgZHN0ZGlyPWAKKwkoZGlybmFtZSAiJGRzdCIpIDI+L2Rldi9udWxsIHx8CisJZXhwciBYIiRkc3QiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC8vXCkkJyBcfCBcCisJICAgICBYIiRkc3QiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorCWVjaG8gWCIkZHN0IiB8CisJICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKVteL10uKi97CisJCSAgIHMvL1wxLworCQkgICBxCisJCSB9CisJCSAvXlhcKFwvXC9cKSQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wpLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgcy8uKi8uLzsgcScKKyAgICAgIGAKKworICAgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICAgIGRzdGRpcl9zdGF0dXM9JD8KKyAgICBmaQorICBmaQorCisgIG9ic29sZXRlX21rZGlyX3VzZWQ9ZmFsc2UKKworICBpZiB0ZXN0ICRkc3RkaXJfc3RhdHVzICE9IDA7IHRoZW4KKyAgICBjYXNlICRwb3NpeF9ta2RpciBpbgorICAgICAgJycpCisJIyBDcmVhdGUgaW50ZXJtZWRpYXRlIGRpcnMgdXNpbmcgbW9kZSA3NTUgYXMgbW9kaWZpZWQgYnkgdGhlIHVtYXNrLgorCSMgVGhpcyBpcyBsaWtlIEZyZWVCU0QgJ2luc3RhbGwnIGFzIG9mIDE5OTctMTAtMjguCisJdW1hc2s9YHVtYXNrYAorCWNhc2UgJHN0cmlwY21kLiR1bWFzayBpbgorCSAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisJICAqWzIzNjddWzIzNjddKSBta2Rpcl91bWFzaz0kdW1hc2s7OworCSAgLiowWzAyXVswMl0gfCAuWzAyXVswMl0gfCAuWzAyXSkgbWtkaXJfdW1hc2s9MjI7OworCisJICAqWzAtN10pCisJICAgIG1rZGlyX3VtYXNrPWBleHByICR1bWFzayArIDIyIFwKKwkgICAgICAtICR1bWFzayAlIDEwMCAlIDQwICsgJHVtYXNrICUgMjAgXAorCSAgICAgIC0gJHVtYXNrICUgMTAgJSA0ICsgJHVtYXNrICUgMgorCSAgICBgOzsKKwkgICopIG1rZGlyX3VtYXNrPSR1bWFzayxnby13OzsKKwllc2FjCisKKwkjIFdpdGggLWQsIGNyZWF0ZSB0aGUgbmV3IGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBtb2RlLgorCSMgT3RoZXJ3aXNlLCByZWx5IG9uICRta2Rpcl91bWFzay4KKwlpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKwkgIG1rZGlyX21vZGU9LW0kbW9kZQorCWVsc2UKKwkgIG1rZGlyX21vZGU9CisJZmkKKworCXBvc2l4X21rZGlyPWZhbHNlCisJY2FzZSAkdW1hc2sgaW4KKwkgICpbMTIzNTY3XVswLTddWzAtN10pCisJICAgICMgUE9TSVggbWtkaXIgLXAgc2V0cyB1K3d4IGJpdHMgcmVnYXJkbGVzcyBvZiB1bWFzaywgd2hpY2gKKwkgICAgIyBpcyBpbmNvbXBhdGlibGUgd2l0aCBGcmVlQlNEICdpbnN0YWxsJyB3aGVuICh1bWFzayAmIDMwMCkgIT0gMC4KKwkgICAgOzsKKwkgICopCisJICAgIHRtcGRpcj0ke1RNUERJUi0vdG1wfS9pbnMkUkFORE9NLSQkCisJICAgIHRyYXAgJ3JldD0kPzsgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiIDI+L2Rldi9udWxsOyBleGl0ICRyZXQnIDAKKworCSAgICBpZiAodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJCWV4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJHRtcGRpci9kIikgPi9kZXYvbnVsbCAyPiYxCisJICAgIHRoZW4KKwkgICAgICBpZiB0ZXN0IC16ICIkZGlyX2FyZyIgfHwgeworCQkgICAjIENoZWNrIGZvciBQT1NJWCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIC1tLgorCQkgICAjIEhQLVVYIDExLjIzIGFuZCBJUklYIDYuNSBta2RpciAtbSAtcCBzZXRzIGdyb3VwLSBvcgorCQkgICAjIG90aGVyLXdyaXRlYWJsZSBiaXQgb2YgcGFyZW50IGRpcmVjdG9yeSB3aGVuIGl0IHNob3VsZG4ndC4KKwkJICAgIyBGcmVlQlNEIDYuMSBta2RpciAtbSAtcCBzZXRzIG1vZGUgb2YgZXhpc3RpbmcgZGlyZWN0b3J5LgorCQkgICBsc19sZF90bXBkaXI9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgIGNhc2UgJGxzX2xkX3RtcGRpciBpbgorCQkgICAgIGQ/Pz8/LT9yLSopIGRpZmZlcmVudF9tb2RlPTcwMDs7CisJCSAgICAgZD8/Pz8tPy0tKikgZGlmZmVyZW50X21vZGU9NzU1OzsKKwkJICAgICAqKSBmYWxzZTs7CisJCSAgIGVzYWMgJiYKKwkJICAgJG1rZGlycHJvZyAtbSRkaWZmZXJlbnRfbW9kZSAtcCAtLSAiJHRtcGRpciIgJiYgeworCQkgICAgIGxzX2xkX3RtcGRpcl8xPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICAgIHRlc3QgIiRsc19sZF90bXBkaXIiID0gIiRsc19sZF90bXBkaXJfMSIKKwkJICAgfQorCQkgfQorCSAgICAgIHRoZW4gcG9zaXhfbWtkaXI9OgorCSAgICAgIGZpCisJICAgICAgcm1kaXIgIiR0bXBkaXIvZCIgIiR0bXBkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIFJlbW92ZSBhbnkgZGlycyBsZWZ0IGJlaGluZCBieSBhbmNpZW50IG1rZGlyIGltcGxlbWVudGF0aW9ucy4KKwkgICAgICBybWRpciAuLyRta2Rpcl9tb2RlIC4vLXAgLi8tLSAyPi9kZXYvbnVsbAorCSAgICBmaQorCSAgICB0cmFwICcnIDA7OworCWVzYWM7OworICAgIGVzYWMKKworICAgIGlmCisgICAgICAkcG9zaXhfbWtkaXIgJiYgKAorCXVtYXNrICRta2Rpcl91bWFzayAmJgorCSRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIKKyAgICAgICkKKyAgICB0aGVuIDoKKyAgICBlbHNlCisKKyAgICAgICMgVGhlIHVtYXNrIGlzIHJpZGljdWxvdXMsIG9yIG1rZGlyIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisgICAgICAjIG9yIGl0IGZhaWxlZCBwb3NzaWJseSBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gIENyZWF0ZSB0aGUKKyAgICAgICMgZGlyZWN0b3J5IHRoZSBzbG93IHdheSwgc3RlcCBieSBzdGVwLCBjaGVja2luZyBmb3IgcmFjZXMgYXMgd2UgZ28uCisKKyAgICAgIGNhc2UgJGRzdGRpciBpbgorCS8qKSBwcmVmaXg9LyA7OworCS0qKSBwcmVmaXg9Li8gOzsKKwkqKSAgcHJlZml4PSA7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRwb3NpeF9nbG9iIGluCisgICAgICAgICcnKQorCSAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKwkgICAgcG9zaXhfZ2xvYj10cnVlCisJICBlbHNlCisJICAgIHBvc2l4X2dsb2I9ZmFsc2UKKwkgIGZpIDs7CisgICAgICBlc2FjCisKKyAgICAgIG9JRlM9JElGUworICAgICAgSUZTPS8KKyAgICAgICRwb3NpeF9nbG9iICYmIHNldCAtZgorICAgICAgc2V0IGZub3JkICRkc3RkaXIKKyAgICAgIHNoaWZ0CisgICAgICAkcG9zaXhfZ2xvYiAmJiBzZXQgK2YKKyAgICAgIElGUz0kb0lGUworCisgICAgICBwcmVmaXhlcz0KKworICAgICAgZm9yIGQKKyAgICAgIGRvCisJdGVzdCAteiAiJGQiICYmIGNvbnRpbnVlCisKKwlwcmVmaXg9JHByZWZpeCRkCisJaWYgdGVzdCAtZCAiJHByZWZpeCI7IHRoZW4KKwkgIHByZWZpeGVzPQorCWVsc2UKKwkgIGlmICRwb3NpeF9ta2RpcjsgdGhlbgorCSAgICAodW1hc2s9JG1rZGlyX3VtYXNrICYmCisJICAgICAkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiKSAmJiBicmVhaworCSAgICAjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJICAgIHRlc3QgLWQgIiRwcmVmaXgiIHx8IGV4aXQgMQorCSAgZWxzZQorCSAgICBjYXNlICRwcmVmaXggaW4KKwkgICAgICAqXCcqKSBxcHJlZml4PWBlY2hvICIkcHJlZml4IiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisJICAgICAgKikgcXByZWZpeD0kcHJlZml4OzsKKwkgICAgZXNhYworCSAgICBwcmVmaXhlcz0iJHByZWZpeGVzICckcXByZWZpeCciCisJICBmaQorCWZpCisJcHJlZml4PSRwcmVmaXgvCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwcmVmaXhlcyI7IHRoZW4KKwkjIERvbid0IGZhaWwgaWYgdHdvIGluc3RhbmNlcyBhcmUgcnVubmluZyBjb25jdXJyZW50bHkuCisJKHVtYXNrICRta2Rpcl91bWFzayAmJgorCSBldmFsICJcJGRvaXRfZXhlYyBcJG1rZGlycHJvZyAkcHJlZml4ZXMiKSB8fAorCSAgdGVzdCAtZCAiJGRzdGRpciIgfHwgZXhpdCAxCisJb2Jzb2xldGVfbWtkaXJfdXNlZD10cnVlCisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAiJG9ic29sZXRlX21rZGlyX3VzZWQkY2hvd25jbWQkY2hncnBjbWQiID0gZmFsc2UgfHwKKyAgICAgIHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICRtb2RlICIkZHN0IjsgfSB8fCBleGl0IDEKKyAgZWxzZQorCisgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KKyAgICBybXRtcD0kZHN0ZGlyL19ybS4kJF8KKworICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCisgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCisKKyAgICAjIENvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lLgorICAgICh1bWFzayAkY3BfdW1hc2sgJiYgJGRvaXRfZXhlYyAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIpICYmCisKKyAgICAjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMuCisgICAgIworICAgICMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyAgICAjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyAgICAjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisgICAgIworICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3R0bXAiOyB9ICYmCisKKyAgICAjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0IiAyPi9kZXYvbnVsbCBcCisgICAgICB8fCB7CisJICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorCSAgICMgdG8gaXRzZWxmLCBvciBwZXJoYXBzIGJlY2F1c2UgbXYgaXMgc28gYW5jaWVudCB0aGF0IGl0IGRvZXMgbm90CisJICAgIyBzdXBwb3J0IC1mLgorCisJICAgIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLgorCSAgICMgV2UgdHJ5IHRoaXMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lCisJICAgIyBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24gZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlcgorCSAgICMgcmVhc29ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZpbmFsIGNsZWFudXAgbWlnaHQgZmFpbCBidXQgdGhlIG5ldworCSAgICMgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCisJICAgeworCSAgICAgaWYgdGVzdCAtZiAiJGRzdCI7IHRoZW4KKwkgICAgICAgJGRvaXQgJHJtY21kIC1mICIkZHN0IiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8IHsgJGRvaXQgJG12Y21kIC1mICIkZHN0IiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCisJCSAgICAgJiYgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH07IH1cCisJICAgICAgIHx8IHsKKwkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0IiA+JjIKKwkJIChleGl0IDEpOyBleGl0IDEKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICA6CisJICAgICBmaQorCSAgIH0gJiYKKworCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0IgorCSB9CisgICAgfSB8fCBleGl0IDEKKworICAgIHRyYXAgJycgMAorICBmaQorZG9uZQorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2F1dG9jb25mL3B5LWNvbXBpbGUgYi9hdXRvY29uZi9weS1jb21waWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjMjAzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvY29uZi9weS1jb21waWxlCkBAIC0wLDAgKzEsMTcwIEBACisjIS9iaW4vc2gKKyMgcHktY29tcGlsZSAtIENvbXBpbGUgYSBQeXRob24gcHJvZ3JhbQorCitzY3JpcHR2ZXJzaW9uPTIwMTEtMDYtMDguMTI7ICMgVVRDCisKKyMgQ29weXJpZ2h0IChDKSAyMDAwLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAorIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCisjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorCitpZiBbIC16ICIkUFlUSE9OIiBdOyB0aGVuCisgIFBZVEhPTj1weXRob24KK2ZpCisKK21lPXB5LWNvbXBpbGUKKwordXNhZ2VfZXJyb3IgKCkKK3sKKyAgZWNobyAiJG1lOiAkKiIgPiYyCisgIGVjaG8gIlRyeSAnJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKyAgZXhpdCAxCit9CisKK2Jhc2VkaXI9CitkZXN0ZGlyPQord2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAiJDEiIGluCisgICAgLS1iYXNlZGlyKQorICAgICAgaWYgdGVzdCAkIyAtbHQgMjsgdGhlbgorICAgICAgICB1c2FnZV9lcnJvciAib3B0aW9uICctLWJhc2VkaXInIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorICAgICAgZWxzZQorICAgICAgICBiYXNlZGlyPSQyCisgICAgICBmaQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgLS1kZXN0ZGlyKQorICAgICAgaWYgdGVzdCAkIyAtbHQgMjsgdGhlbgorICAgICAgICB1c2FnZV9lcnJvciAib3B0aW9uICctLWRlc3RkaXInIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorICAgICAgZWxzZQorICAgICAgICBkZXN0ZGlyPSQyCisgICAgICBmaQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgLWh8LS1oZWxwKQorICAgICAgY2F0IDw8XEVPRgorVXNhZ2U6IHB5LWNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gWy0tYmFzZWRpciBESVJdIFstLWRlc3RkaXIgRElSXSBGSUxFUy4uLiIKKworQnl0ZSBjb21waWxlIHNvbWUgcHl0aG9uIHNjcmlwdHMgRklMRVMuICBVc2UgLS1kZXN0ZGlyIHRvIHNwZWNpZnkgYW55CitsZWFkaW5nIGRpcmVjdG9yeSBwYXRoIHRvIHRoZSBGSUxFUyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIGluY2x1ZGUgaW4gdGhlCitieXRlIGNvbXBpbGVkIGZpbGUuICBTcGVjaWZ5IC0tYmFzZWRpciBmb3IgYW55IGFkZGl0aW9uYWwgcGF0aCBpbmZvcm1hdGlvbiB5b3UKK2RvIHdhbnQgdG8gYmUgc2hvd24gaW4gdGhlIGJ5dGUgY29tcGlsZWQgZmlsZS4KKworRXhhbXBsZToKKyAgcHktY29tcGlsZSAtLWRlc3RkaXIgL3RtcC9wa2ctcm9vdCAtLWJhc2VkaXIgL3Vzci9zaGFyZS90ZXN0IHRlc3QucHkgdGVzdDIucHkKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgICAgZXhpdCAkPworICAgICAgOzsKKyAgICAtdnwtLXZlcnNpb24pCisgICAgICBlY2hvICIkbWUgJHNjcmlwdHZlcnNpb24iCisgICAgICBleGl0ICQ/CisgICAgICA7OworICAgIC0tKQorICAgICAgc2hpZnQKKyAgICAgIGJyZWFrCisgICAgICA7OworICAgIC0qKQorICAgICAgdXNhZ2VfZXJyb3IgInVucmVjb2duaXplZCBvcHRpb24gJyQxJyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGJyZWFrCisgICAgICA7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2ZpbGVzPSQqCitpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgdXNhZ2VfZXJyb3IgIm5vIGZpbGVzIGdpdmVuIgorZmkKKworIyBpZiBiYXNlZGlyIHdhcyBnaXZlbiwgdGhlbiBpdCBzaG91bGQgYmUgcHJlcGVuZGVkIHRvIGZpbGVuYW1lcyBiZWZvcmUKKyMgYnl0ZSBjb21waWxhdGlvbi4KK2lmIFsgLXogIiRiYXNlZGlyIiBdOyB0aGVuCisgICAgcGF0aHRyYW5zPSJwYXRoID0gZmlsZSIKK2Vsc2UKKyAgICBwYXRodHJhbnM9InBhdGggPSBvcy5wYXRoLmpvaW4oJyRiYXNlZGlyJywgZmlsZSkiCitmaQorCisjIGlmIGRlc3RkaXIgd2FzIGdpdmVuLCB0aGVuIGl0IG5lZWRzIHRvIGJlIHByZXBlbmRlZCB0byB0aGUgZmlsZW5hbWUgdG8KKyMgYnl0ZSBjb21waWxlIGJ1dCBub3QgZ28gaW50byB0aGUgY29tcGlsZWQgZmlsZS4KK2lmIFsgLXogIiRkZXN0ZGlyIiBdOyB0aGVuCisgICAgZmlsZXRyYW5zPSJmaWxlcGF0aCA9IHBhdGgiCitlbHNlCisgICAgZmlsZXRyYW5zPSJmaWxlcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoJyRkZXN0ZGlyJyArIG9zLnNlcCArIHBhdGgpIgorZmkKKworJFBZVEhPTiAtYyAiCitpbXBvcnQgc3lzLCBvcywgcHlfY29tcGlsZSwgaW1wCisKK2ZpbGVzID0gJycnJGZpbGVzJycnCisKK3N5cy5zdGRvdXQud3JpdGUoJ0J5dGUtY29tcGlsaW5nIHB5dGhvbiBtb2R1bGVzLi4uXG4nKQorZm9yIGZpbGUgaW4gZmlsZXMuc3BsaXQoKToKKyAgICAkcGF0aHRyYW5zCisgICAgJGZpbGV0cmFucworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlcGF0aCkgb3Igbm90IChsZW4oZmlsZXBhdGgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGVwYXRoWy0zOl0gPT0gJy5weScpOgorCSAgICBjb250aW51ZQorICAgIHN5cy5zdGRvdXQud3JpdGUoZmlsZSkKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICBpZiBoYXNhdHRyKGltcCwgJ2dldF90YWcnKToKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKGZpbGVwYXRoLCBpbXAuY2FjaGVfZnJvbV9zb3VyY2UoZmlsZXBhdGgpLCBwYXRoKQorICAgIGVsc2U6CisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShmaWxlcGF0aCwgZmlsZXBhdGggKyAnYycsIHBhdGgpCitzeXMuc3Rkb3V0LndyaXRlKCdcbicpIiB8fCBleGl0ICQ/CisKKyMgdGhpcyB3aWxsIGZhaWwgZm9yIHB5dGhvbiA8IDEuNSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgLi4uCiskUFlUSE9OIC1PIC1jICIKK2ltcG9ydCBzeXMsIG9zLCBweV9jb21waWxlLCBpbXAKKworIyBweXB5IGRvZXMgbm90IHVzZSAucHlvIG9wdGltaXphdGlvbgoraWYgaGFzYXR0cihzeXMsICdweXB5X3RyYW5zbGF0aW9uX2luZm8nKToKKyAgICBzeXMuZXhpdCgwKQorCitmaWxlcyA9ICcnJyRmaWxlcycnJworc3lzLnN0ZG91dC53cml0ZSgnQnl0ZS1jb21waWxpbmcgcHl0aG9uIG1vZHVsZXMgKG9wdGltaXplZCB2ZXJzaW9ucykgLi4uXG4nKQorZm9yIGZpbGUgaW4gZmlsZXMuc3BsaXQoKToKKyAgICAkcGF0aHRyYW5zCisgICAgJGZpbGV0cmFucworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlcGF0aCkgb3Igbm90IChsZW4oZmlsZXBhdGgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGVwYXRoWy0zOl0gPT0gJy5weScpOgorCSAgICBjb250aW51ZQorICAgIHN5cy5zdGRvdXQud3JpdGUoZmlsZSkKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICBpZiBoYXNhdHRyKGltcCwgJ2dldF90YWcnKToKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKGZpbGVwYXRoLCBpbXAuY2FjaGVfZnJvbV9zb3VyY2UoZmlsZXBhdGgsIEZhbHNlKSwgcGF0aCkKKyAgICBlbHNlOgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoZmlsZXBhdGgsIGZpbGVwYXRoICsgJ28nLCBwYXRoKQorc3lzLnN0ZG91dC53cml0ZSgnXG4nKSIgMj4vZGV2L251bGwgfHwgOgorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZi8uZ2l0aWdub3JlIGIvY29uZi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmM0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACitjb21tYW5kX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZQorZXhhbXBsZS5jb25mCitsdm1sb2NhbC5jb25mCittZXRhZGF0YV9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUKK2NvbmZpZ3VyZS5oCitsdm0tdmVyc2lvbi5oCmRpZmYgLS1naXQgYS9jb25mL01ha2VmaWxlLmluIGIvY29uZi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODgwNDVjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK0NPTkZTUkM9ZXhhbXBsZS5jb25mCitDT05GREVTVD1sdm0uY29uZgorQ09ORkxPQ0FMPWx2bWxvY2FsLmNvbmYKKworUFJPRklMRV9URU1QTEFURVM9Y29tbWFuZF9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUgbWV0YWRhdGFfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlCitQUk9GSUxFUz0kKFBST0ZJTEVfVEVNUExBVEVTKSBcCisJJChzcmNkaXIpL2NhY2hlLW1xLnByb2ZpbGUgXAorCSQoc3JjZGlyKS9jYWNoZS1zbXEucHJvZmlsZSBcCisJJChzcmNkaXIpL3RoaW4tZ2VuZXJpYy5wcm9maWxlIFwKKwkkKHNyY2RpcikvdGhpbi1wZXJmb3JtYW5jZS5wcm9maWxlCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCisuUEhPTlk6IGluc3RhbGxfY29uZiBpbnN0YWxsX2xvY2FsY29uZiBpbnN0YWxsX3Byb2ZpbGVzCisKK2dlbmVyYXRlOgorCShjYXQgJCh0b3Bfc3JjZGlyKS9jb25mL2V4YW1wbGUuY29uZi5iYXNlICYmIExEX0xJQlJBUllfUEFUSD0kKHRvcF9idWlsZGRpcikvbGliZG06JChMRF9MSUJSQVJZX1BBVEgpICQodG9wX2J1aWxkZGlyKS90b29scy9sdm0gZHVtcGNvbmZpZyAtLXR5cGUgZGVmYXVsdCAtLXVuY29uZmlndXJlZCAtLXdpdGhjb21tZW50cyAtLWlnbm9yZWxvY2FsIC0td2l0aHNwYWNlcykgPiBleGFtcGxlLmNvbmYuaW4KKwkoY2F0ICQodG9wX3NyY2RpcikvY29uZi9sdm1sb2NhbC5jb25mLmJhc2UgJiYgTERfTElCUkFSWV9QQVRIPSQodG9wX2J1aWxkZGlyKS9saWJkbTokKExEX0xJQlJBUllfUEFUSCkgJCh0b3BfYnVpbGRkaXIpL3Rvb2xzL2x2bSBkdW1wY29uZmlnIC0tdHlwZSBkZWZhdWx0IC0tdW5jb25maWd1cmVkIC0td2l0aGNvbW1lbnRzIC0td2l0aHNwYWNlcyBsb2NhbCkgPiBsdm1sb2NhbC5jb25mLmluCisKK2luc3RhbGxfY29uZjogJChDT05GU1JDKQorCUBpZiBbICEgLWUgJChjb25mZGlyKS8kKENPTkZERVNUKSBdOyB0aGVuIFwKKwkJZWNobyAiJChJTlNUQUxMX1dEQVRBKSAtRCAkPCAkKGNvbmZkaXIpLyQoQ09ORkRFU1QpIjsgXAorCQkkKElOU1RBTExfV0RBVEEpIC1EICQ8ICQoY29uZmRpcikvJChDT05GREVTVCk7IFwKKwlmaQorCitpbnN0YWxsX2xvY2FsY29uZjogJChDT05GTE9DQUwpCisJQGlmIFsgISAtZSAkKGNvbmZkaXIpLyQoQ09ORkxPQ0FMKSBdOyB0aGVuIFwKKwkJZWNobyAiJChJTlNUQUxMX1dEQVRBKSAtRCAkPCAkKGNvbmZkaXIpLyQoQ09ORkxPQ0FMKSI7IFwKKwkJJChJTlNUQUxMX1dEQVRBKSAtRCAkPCAkKGNvbmZkaXIpLyQoQ09ORkxPQ0FMKTsgXAorCWZpCisKK2luc3RhbGxfcHJvZmlsZXM6ICQoUFJPRklMRVMpCisJJChJTlNUQUxMX0RJUikgJChERVNURElSKSQoREVGQVVMVF9QUk9GSUxFX0RJUikKKwkkKElOU1RBTExfREFUQSkgJChQUk9GSUxFUykgJChERVNURElSKSQoREVGQVVMVF9QUk9GSUxFX0RJUikvCisKK2luc3RhbGxfbHZtMjogaW5zdGFsbF9jb25mIGluc3RhbGxfbG9jYWxjb25mIGluc3RhbGxfcHJvZmlsZXMKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCisKK0RJU1RDTEVBTl9UQVJHRVRTICs9ICQoQ09ORlNSQykgJChDT05GTE9DQUwpICQoUFJPRklMRV9URU1QTEFURVMpCmRpZmYgLS1naXQgYS9jb25mL2NhY2hlLW1xLnByb2ZpbGUgYi9jb25mL2NhY2hlLW1xLnByb2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5MDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmYvY2FjaGUtbXEucHJvZmlsZQpAQCAtMCwwICsxLDIwIEBACisjIERlbW8gY29uZmlndXJhdGlvbiAnbXEnIGNhY2hlIHBvbGljeQorIworIyBOb3RlOiBUaGlzIHBvbGljeSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBzbXEgcG9saWN5CisjIGtleXdvcmQgImRlZmF1bHQiIG1lYW5zLCBzZXR0aW5nIGlzIGxlZnQgd2l0aCBrZXJuZWwgZGVmYXVsdHMuCisjCisKK2FsbG9jYXRpb24geworCWNhY2hlX3Bvb2xfY2h1bmtfc2l6ZSA9IDY0CisJY2FjaGVfbW9kZSA9ICJ3cml0ZXRocm91Z2giCisJY2FjaGVfcG9saWN5ID0gIm1xIgorCWNhY2hlX3NldHRpbmdzIHsKKwkJbXEgeworCQkJc2VxdWVudGlhbF90aHJlc2hvbGQgPSAiZGVmYXVsdCIJIyAgI25yX3NlcXVlbnRpYWxfaW9zCisJCQlyYW5kb21fdGhyZXNob2xkID0gImRlZmF1bHQiCQkjICAjbnJfcmFuZG9tX2lvcworCQkJcmVhZF9wcm9tb3RlX2FkanVzdG1lbnQgPSAiZGVmYXVsdCIKKwkJCXdyaXRlX3Byb21vdGVfYWRqdXN0bWVudCA9ICJkZWZhdWx0IgorCQkJZGlzY2FyZF9wcm9tb3RlX2FkanVzdG1lbnQgPSAiZGVmYXVsdCIKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvbmYvY2FjaGUtc21xLnByb2ZpbGUgYi9jb25mL2NhY2hlLXNtcS5wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDYyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL2NhY2hlLXNtcS5wcm9maWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMgRGVtbyBjb25maWd1cmF0aW9uICdzbXEnIGNhY2hlIHBvbGljeQorIworIyBUaGUgc3RvY2hhc3RpYyBtdWx0aS1xdWV1ZSAoc21xKSBwb2xpY3kgYWRkcmVzc2VzIHNvbWUgb2YgdGhlIHByb2JsZW1zCisjIHdpdGggdGhlIG11bHRpcXVldWUgKG1xKSBwb2xpY3kgYW5kIHVzZXMgbGVzcyBtZW1vcnkuCisjCisKK2FsbG9jYXRpb24geworCWNhY2hlX3Bvb2xfY2h1bmtfc2l6ZSA9IDY0CisJY2FjaGVfbW9kZSA9ICJ3cml0ZXRocm91Z2giCisJY2FjaGVfcG9saWN5ID0gInNtcSIKKwljYWNoZV9zZXR0aW5ncyB7CisJICAgICAgICAjIGN1cnJlbnRseSBubyBzZXR0aW5zIGZvciAic21xIiBwb2xpY3kKKwl9Cit9CmRpZmYgLS1naXQgYS9jb25mL2NvbW1hbmRfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlLmluIGIvY29uZi9jb21tYW5kX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZkYzBkCi0tLSAvZGV2L251bGwKKysrIGIvY29uZi9jb21tYW5kX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZS5pbgpAQCAtMCwwICsxLDc0IEBACisjIFRoaXMgaXMgYSBjb21tYW5kIHByb2ZpbGUgdGVtcGxhdGUgZm9yIHRoZSBMVk0yIHN5c3RlbS4KKyMKKyMgSXQgY29udGFpbnMgYWxsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdGhhdCBhcmUgY3VzdG9taXphYmxlIGJ5IGNvbW1hbmQKKyMgcHJvZmlsZXMuIFRvIGNyZWF0ZSBhIG5ldyBjb21tYW5kIHByb2ZpbGUsIHNlbGVjdCB0aGUgc2V0dGluZ3MgeW91IHdhbnQKKyMgdG8gY3VzdG9taXplIGFuZCBhZGQgdGhlbSBpbiBhIG5ldyBmaWxlIG5hbWVkIDxwcm9maWxlX25hbWU+LnByb2ZpbGUuCisjIFRoZW4gaW5zdGFsbCB0aGUgbmV3IHByb2ZpbGUgaW4gYSBkaXJlY3RvcnkgYXMgZGVmaW5lZCBieSBjb25maWcvcHJvZmlsZV9kaXIKKyMgc2V0dGluZyBmb3VuZCBpbiBAREVGQVVMVF9TWVNfRElSQC9sdm0uY29uZiBmaWxlLgorIworIyBDb21tYW5kIHByb2ZpbGVzIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHVzaW5nIHRoZSAtLWNvbW1hbmRwcm9maWxlIG9wdGlvbiB0aGVuLgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBwcm9maWxlcyBhbmQKKyMgZ2VuZXJhbCBjb25maWd1cmF0aW9uIGZpbGUgbGF5b3V0LgorIworYWxsb2NhdGlvbiB7CisJY2FjaGVfbW9kZT0id3JpdGV0aHJvdWdoIgorCWNhY2hlX3NldHRpbmdzIHsKKwl9Cit9Citsb2cgeworCXJlcG9ydF9jb21tYW5kX2xvZz0wCisJY29tbWFuZF9sb2dfc29ydD0ibG9nX3NlcV9udW0iCisJY29tbWFuZF9sb2dfY29scz0ibG9nX3NlcV9udW0sbG9nX3R5cGUsbG9nX2NvbnRleHQsbG9nX29iamVjdF90eXBlLGxvZ19vYmplY3RfbmFtZSxsb2dfb2JqZWN0X2lkLGxvZ19vYmplY3RfZ3JvdXAsbG9nX29iamVjdF9ncm91cF9pZCxsb2dfbWVzc2FnZSxsb2dfZXJybm8sbG9nX3JldF9jb2RlIgorCWNvbW1hbmRfbG9nX3NlbGVjdGlvbj0iIShsb2dfdHlwZT1zdGF0dXMgJiYgbWVzc2FnZT1zdWNjZXNzKSIKK30KK2dsb2JhbCB7CisJdW5pdHM9ImgiCisJc2lfdW5pdF9jb25zaXN0ZW5jeT0xCisJc3VmZml4PTEKKwlsdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aD0wCit9CityZXBvcnQgeworCW91dHB1dF9mb3JtYXQ9ImJhc2ljIgorCWNvbXBhY3Rfb3V0cHV0PTAKKwljb21wYWN0X291dHB1dF9jb2xzPSIiCisJYWxpZ25lZD0xCisJYnVmZmVyZWQ9MQorCWhlYWRpbmdzPTEKKwlzZXBhcmF0b3I9IiAiCisJbGlzdF9pdGVtX3NlcGFyYXRvcj0iLCIKKwlwcmVmaXhlcz0wCisJcXVvdGVkPTEKKwljb2x1bXNfYXNfcm93cz0wCisJYmluYXJ5X3ZhbHVlc19hc19udW1lcmljPTAKKwl0aW1lX2Zvcm1hdD0iJVktJW0tJWQgJVQgJXoiCisJZGV2dHlwZXNfc29ydD0iZGV2dHlwZV9uYW1lIgorCWRldnR5cGVzX2NvbHM9ImRldnR5cGVfbmFtZSxkZXZ0eXBlX21heF9wYXJ0aXRpb25zLGRldnR5cGVfZGVzY3JpcHRpb24iCisJZGV2dHlwZXNfY29sc192ZXJib3NlPSJkZXZ0eXBlX25hbWUsZGV2dHlwZV9tYXhfcGFydGl0aW9ucyxkZXZ0eXBlX2Rlc2NyaXB0aW9uIgorCWx2c19zb3J0PSJ2Z19uYW1lLGx2X25hbWUiCisJbHZzX2NvbHM9Imx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLGx2X3NpemUscG9vbF9sdixvcmlnaW4sZGF0YV9wZXJjZW50LG1ldGFkYXRhX3BlcmNlbnQsbW92ZV9wdixtaXJyb3JfbG9nLGNvcHlfcGVyY2VudCxjb252ZXJ0X2x2IgorCWx2c19jb2xzX3ZlcmJvc2U9Imx2X25hbWUsdmdfbmFtZSxzZWdfY291bnQsbHZfYXR0cixsdl9zaXplLGx2X21ham9yLGx2X21pbm9yLGx2X2tlcm5lbF9tYWpvcixsdl9rZXJuZWxfbWlub3IscG9vbF9sdixvcmlnaW4sZGF0YV9wZXJjZW50LG1ldGFkYXRhX3BlcmNlbnQsbW92ZV9wdixjb3B5X3BlcmNlbnQsbWlycm9yX2xvZyxjb252ZXJ0X2x2LGx2X3V1aWQsbHZfcHJvZmlsZSIKKwl2Z3Nfc29ydD0idmdfbmFtZSIKKwl2Z3NfY29scz0idmdfbmFtZSxwdl9jb3VudCxsdl9jb3VudCxzbmFwX2NvdW50LHZnX2F0dHIsdmdfc2l6ZSx2Z19mcmVlIgorCXZnc19jb2xzX3ZlcmJvc2U9InZnX25hbWUsdmdfYXR0cix2Z19leHRlbnRfc2l6ZSxwdl9jb3VudCxsdl9jb3VudCxzbmFwX2NvdW50LHZnX3NpemUsdmdfZnJlZSx2Z191dWlkLHZnX3Byb2ZpbGUiCisJcHZzX3NvcnQ9InB2X25hbWUiCisJcHZzX2NvbHM9InB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUiCisJcHZzX2NvbHNfdmVyYm9zZT0icHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSxkZXZfc2l6ZSxwdl91dWlkIgorCXNlZ3Nfc29ydD0idmdfbmFtZSxsdl9uYW1lLHNlZ19zdGFydCIKKwlzZWdzX2NvbHM9Imx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLHN0cmlwZXMsc2VndHlwZSxzZWdfc2l6ZSIKKwlzZWdzX2NvbHNfdmVyYm9zZT0ibHZfbmFtZSx2Z19uYW1lLGx2X2F0dHIsc2VnX3N0YXJ0LHNlZ19zaXplLHN0cmlwZXMsc2VndHlwZSxzdHJpcGVzaXplLGNodW5rc2l6ZSIKKwlwdnNlZ3Nfc29ydD0icHZfbmFtZSxwdnNlZ19zdGFydCIKKwlwdnNlZ3NfY29scz0icHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSxwdnNlZ19zdGFydCxwdnNlZ19zaXplIgorCXB2c2Vnc19jb2xzX3ZlcmJvc2U9InB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUscHZzZWdfc3RhcnQscHZzZWdfc2l6ZSxsdl9uYW1lLHNlZ19zdGFydF9wZSxzZWd0eXBlLHNlZ19wZV9yYW5nZXMiCisJdmdzX2NvbHNfZnVsbD0idmdfYWxsIgorCXB2c19jb2xzX2Z1bGw9InB2X2FsbCIKKwlsdnNfY29sc19mdWxsPSJsdl9hbGwiCisJcHZzZWdzX2NvbHNfZnVsbD0icHZzZWdfYWxsLHB2X3V1aWQsbHZfdXVpZCIKKwlzZWdzX2NvbHNfZnVsbD0ic2VnX2FsbCxsdl91dWlkIgorCXZnc19zb3J0X2Z1bGw9InZnX25hbWUiCisJcHZzX3NvcnRfZnVsbD0icHZfbmFtZSIKKwlsdnNfc29ydF9mdWxsPSJ2Z19uYW1lLGx2X25hbWUiCisJcHZzZWdzX3NvcnRfZnVsbD0icHZfdXVpZCxwdnNlZ19zdGFydCIKKwlzZWdzX3NvcnRfZnVsbD0ibHZfdXVpZCxzZWdfc3RhcnQiCisJbWFya19oaWRkZW5fZGV2aWNlcz0xCit9CmRpZmYgLS1naXQgYS9jb25mL2V4YW1wbGUuY29uZi5iYXNlIGIvY29uZi9leGFtcGxlLmNvbmYuYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ5ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZi9leGFtcGxlLmNvbmYuYmFzZQpAQCAtMCwwICsxLDIzIEBACisjIFRoaXMgaXMgYW4gZXhhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBMVk0yIHN5c3RlbS4KKyMgSXQgY29udGFpbnMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCB3b3VsZCBiZSB1c2VkIGlmIHRoZXJlIHdhcyBubworIyBAREVGQVVMVF9TWVNfRElSQC9sdm0uY29uZiBmaWxlLgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlIGZpbGUgbGF5b3V0LgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHNldHRpbmdzIGNvbmZpZ3VyZWQgaW4KKyMgdGhpcyBmaWxlIGFyZSBjb21iaW5lZCB3aXRoIGJ1aWx0LWluIHZhbHVlcyBhbmQgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8KKyMgYXJyaXZlIGF0IHRoZSBmaW5hbCB2YWx1ZXMgdXNlZCBieSBMVk0uCisjCisjIFJlZmVyIHRvICdtYW4gbHZtY29uZmlnJyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgZGlzcGxheWluZyB0aGUgYnVpbHQtaW4KKyMgYW5kIGNvbmZpZ3VyZWQgdmFsdWVzIHVzZWQgYnkgTFZNLgorIworIyBJZiBhIGRlZmF1bHQgdmFsdWUgaXMgc2V0IGluIHRoaXMgZmlsZSAobm90IGNvbW1lbnRlZCBvdXQpLCB0aGVuIGEKKyMgbmV3IHZlcnNpb24gb2YgTFZNIHVzaW5nIHRoaXMgZmlsZSB3aWxsIGNvbnRpbnVlIHVzaW5nIHRoYXQgdmFsdWUsCisjIGV2ZW4gaWYgdGhlIG5ldyB2ZXJzaW9uIG9mIExWTSBjaGFuZ2VzIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgorIworIyBUbyBwdXQgdGhpcyBmaWxlIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhbmQgb3ZlcnJpZGUgQERFRkFVTFRfU1lTX0RJUkAgc2V0CisjIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVk1fU1lTVEVNX0RJUiBiZWZvcmUgcnVubmluZyB0aGUgdG9vbHMuCisjCisjIE4uQi4gVGFrZSBjYXJlIHRoYXQgZWFjaCBzZXR0aW5nIG9ubHkgYXBwZWFycyBvbmNlIGlmIHVuY29tbWVudGluZworIyBleGFtcGxlIHNldHRpbmdzIGluIHRoaXMgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvY29uZi9leGFtcGxlLmNvbmYuaW4gYi9jb25mL2V4YW1wbGUuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThhMTlmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZi9leGFtcGxlLmNvbmYuaW4KQEAgLTAsMCArMSwyMDg5IEBACisjIFRoaXMgaXMgYW4gZXhhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBMVk0yIHN5c3RlbS4KKyMgSXQgY29udGFpbnMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCB3b3VsZCBiZSB1c2VkIGlmIHRoZXJlIHdhcyBubworIyBAREVGQVVMVF9TWVNfRElSQC9sdm0uY29uZiBmaWxlLgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlIGZpbGUgbGF5b3V0LgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHNldHRpbmdzIGNvbmZpZ3VyZWQgaW4KKyMgdGhpcyBmaWxlIGFyZSBjb21iaW5lZCB3aXRoIGJ1aWx0LWluIHZhbHVlcyBhbmQgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8KKyMgYXJyaXZlIGF0IHRoZSBmaW5hbCB2YWx1ZXMgdXNlZCBieSBMVk0uCisjCisjIFJlZmVyIHRvICdtYW4gbHZtY29uZmlnJyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgZGlzcGxheWluZyB0aGUgYnVpbHQtaW4KKyMgYW5kIGNvbmZpZ3VyZWQgdmFsdWVzIHVzZWQgYnkgTFZNLgorIworIyBJZiBhIGRlZmF1bHQgdmFsdWUgaXMgc2V0IGluIHRoaXMgZmlsZSAobm90IGNvbW1lbnRlZCBvdXQpLCB0aGVuIGEKKyMgbmV3IHZlcnNpb24gb2YgTFZNIHVzaW5nIHRoaXMgZmlsZSB3aWxsIGNvbnRpbnVlIHVzaW5nIHRoYXQgdmFsdWUsCisjIGV2ZW4gaWYgdGhlIG5ldyB2ZXJzaW9uIG9mIExWTSBjaGFuZ2VzIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgorIworIyBUbyBwdXQgdGhpcyBmaWxlIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhbmQgb3ZlcnJpZGUgQERFRkFVTFRfU1lTX0RJUkAgc2V0CisjIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVk1fU1lTVEVNX0RJUiBiZWZvcmUgcnVubmluZyB0aGUgdG9vbHMuCisjCisjIE4uQi4gVGFrZSBjYXJlIHRoYXQgZWFjaCBzZXR0aW5nIG9ubHkgYXBwZWFycyBvbmNlIGlmIHVuY29tbWVudGluZworIyBleGFtcGxlIHNldHRpbmdzIGluIHRoaXMgZmlsZS4KKworCisjIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBjb25maWcuCisjIEhvdyBMVk0gY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcmUgaGFuZGxlZC4KK2NvbmZpZyB7CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGNvbmZpZy9jaGVja3MuCisJIyBJZiBlbmFibGVkLCBhbnkgTFZNIGNvbmZpZ3VyYXRpb24gbWlzbWF0Y2ggaXMgcmVwb3J0ZWQuCisJIyBUaGlzIGltcGxpZXMgY2hlY2tpbmcgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBrZXkgaXMgdW5kZXJzdG9vZCBieQorCSMgTFZNIGFuZCB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUga2V5IGlzIHRoZSBwcm9wZXIgdHlwZS4gSWYgZGlzYWJsZWQsCisJIyBhbnkgY29uZmlndXJhdGlvbiBtaXNtYXRjaCBpcyBpZ25vcmVkIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkCisJIyB3aXRob3V0IGFueSB3YXJuaW5nIChhIG1lc3NhZ2UgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24ga2V5IG5vdCBiZWluZworCSMgZm91bmQgaXMgaXNzdWVkIGluIHZlcmJvc2UgbW9kZSBvbmx5KS4KKwljaGVja3MgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGNvbmZpZy9hYm9ydF9vbl9lcnJvcnMuCisJIyBBYm9ydCB0aGUgTFZNIHByb2Nlc3MgaWYgYSBjb25maWd1cmF0aW9uIG1pc21hdGNoIGlzIGZvdW5kLgorCWFib3J0X29uX2Vycm9ycyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gY29uZmlnL3Byb2ZpbGVfZGlyLgorCSMgRGlyZWN0b3J5IHdoZXJlIExWTSBsb29rcyBmb3IgY29uZmlndXJhdGlvbiBwcm9maWxlcy4KKwlwcm9maWxlX2RpciA9ICJAREVGQVVMVF9TWVNfRElSQC9AREVGQVVMVF9QUk9GSUxFX1NVQkRJUkAiCit9CisKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uIGRldmljZXMuCisjIEhvdyBMVk0gdXNlcyBibG9jayBkZXZpY2VzLgorZGV2aWNlcyB7CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvZGlyLgorCSMgRGlyZWN0b3J5IGluIHdoaWNoIHRvIGNyZWF0ZSB2b2x1bWUgZ3JvdXAgZGV2aWNlIG5vZGVzLgorCSMgQ29tbWFuZHMgYWxzbyBhY2NlcHQgdGhpcyBhcyBhIHByZWZpeCBvbiB2b2x1bWUgZ3JvdXAgbmFtZXMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGFkdmFuY2VkLgorCWRpciA9ICIvZGV2IgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL3NjYW4uCisJIyBEaXJlY3RvcmllcyBjb250YWluaW5nIGRldmljZSBub2RlcyB0byB1c2Ugd2l0aCBMVk0uCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGFkdmFuY2VkLgorCXNjYW4gPSBbICIvZGV2IiBdCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldi4KKwkjIE9idGFpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZGV2aWNlcyBmcm9tIHVkZXYuCisJIyBUaGlzIGF2b2lkcyBvcGVuaW5nIG9yIHVzaW5nIGFueSBpbmFwcGxpY2FibGUgbm9uLWJsb2NrIGRldmljZXMgb3IKKwkjIHN1YmRpcmVjdG9yaWVzIGZvdW5kIGluIHRoZSB1ZGV2IGRpcmVjdG9yeS4gQW55IGRldmljZSBub2RlIG9yCisJIyBzeW1saW5rIG5vdCBtYW5hZ2VkIGJ5IHVkZXYgaW4gdGhlIHVkZXYgZGlyZWN0b3J5IGlzIGlnbm9yZWQuIFRoaXMKKwkjIHNldHRpbmcgYXBwbGllcyBvbmx5IHRvIHRoZSB1ZGV2LW1hbmFnZWQgZGV2aWNlIGRpcmVjdG9yeTsgb3RoZXIKKwkjIGRpcmVjdG9yaWVzIHdpbGwgYmUgc2Nhbm5lZCBmdWxseS4gTFZNIG5lZWRzIHRvIGJlIGNvbXBpbGVkIHdpdGgKKwkjIHVkZXYgc3VwcG9ydCBmb3IgdGhpcyBzZXR0aW5nIHRvIGFwcGx5LgorCW9idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXYgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlLgorCSMgU2VsZWN0IGFuIGV4dGVybmFsIGRldmljZSBpbmZvcm1hdGlvbiBzb3VyY2UuCisJIyBTb21lIGluZm9ybWF0aW9uIG1heSBhbHJlYWR5IGJlIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtIGFuZCBMVk0gY2FuCisJIyB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IHR5cGUgb3IgdXNlIG9mIGRldmljZXMgaXQKKwkjIHByb2Nlc3Nlcy4gVXNpbmcgYW4gZXhpc3RpbmcgZXh0ZXJuYWwgZGV2aWNlIGluZm9ybWF0aW9uIHNvdXJjZSBjYW4KKwkjIHNwZWVkIHVwIGRldmljZSBwcm9jZXNzaW5nIGFzIExWTSBkb2VzIG5vdCBuZWVkIHRvIHJ1biBpdHMgb3duIG5hdGl2ZQorCSMgcm91dGluZXMgdG8gYWNxdWlyZSB0aGlzIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgdGhpcyBpbmZvcm1hdGlvbgorCSMgaXMgdXNlZCB0byBkcml2ZSBMVk0gZmlsdGVyaW5nIGxpa2UgTUQgY29tcG9uZW50IGRldGVjdGlvbiwgbXVsdGlwYXRoCisJIyBjb21wb25lbnQgZGV0ZWN0aW9uLCBwYXJ0aXRpb24gZGV0ZWN0aW9uIGFuZCBvdGhlcnMuCisJIyAKKwkjIEFjY2VwdGVkIHZhbHVlczoKKwkjICAgbm9uZQorCSMgICAgIE5vIGV4dGVybmFsIGRldmljZSBpbmZvcm1hdGlvbiBzb3VyY2UgaXMgdXNlZC4KKwkjICAgdWRldgorCSMgICAgIFJldXNlIGV4aXN0aW5nIHVkZXYgZGF0YWJhc2UgcmVjb3Jkcy4gQXBwbGljYWJsZSBvbmx5IGlmIExWTSBpcworCSMgICAgIGNvbXBpbGVkIHdpdGggdWRldiBzdXBwb3J0LgorCSMgCisJZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlID0gIm5vbmUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvcHJlZmVycmVkX25hbWVzLgorCSMgU2VsZWN0IHdoaWNoIHBhdGggbmFtZSB0byBkaXNwbGF5IGZvciBhIGJsb2NrIGRldmljZS4KKwkjIElmIG11bHRpcGxlIHBhdGggbmFtZXMgZXhpc3QgZm9yIGEgYmxvY2sgZGV2aWNlLCBhbmQgTFZNIG5lZWRzIHRvCisJIyBkaXNwbGF5IGEgbmFtZSBmb3IgdGhlIGRldmljZSwgdGhlIHBhdGggbmFtZXMgYXJlIG1hdGNoZWQgYWdhaW5zdAorCSMgZWFjaCBpdGVtIGluIHRoaXMgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiBUaGUgZmlyc3QgbWF0Y2ggaXMKKwkjIHVzZWQuIFRyeSB0byBhdm9pZCB1c2luZyB1bmRlc2NyaXB0aXZlIC9kZXYvZG0tTiBuYW1lcywgaWYgcHJlc2VudC4KKwkjIElmIG5vIHByZWZlcnJlZCBuYW1lIG1hdGNoZXMsIG9yIGlmIHByZWZlcnJlZF9uYW1lcyBhcmUgbm90IGRlZmluZWQsCisJIyB0aGUgZm9sbG93aW5nIGJ1aWx0LWluIHByZWZlcmVuY2VzIGFyZSBhcHBsaWVkIGluIG9yZGVyIHVudGlsIG9uZQorCSMgcHJvZHVjZXMgYSBwcmVmZXJyZWQgbmFtZToKKwkjIFByZWZlciBuYW1lcyB3aXRoIHBhdGggcHJlZml4ZXMgaW4gdGhlIG9yZGVyIG9mOgorCSMgL2Rldi9tYXBwZXIsIC9kZXYvZGlzaywgL2Rldi9kbS0qLCAvZGV2L2Jsb2NrLgorCSMgUHJlZmVyIHRoZSBuYW1lIHdpdGggdGhlIGxlYXN0IG51bWJlciBvZiBzbGFzaGVzLgorCSMgUHJlZmVyIGEgbmFtZSB0aGF0IGlzIGEgc3ltbGluay4KKwkjIFByZWZlciB0aGUgcGF0aCB3aXRoIGxlYXN0IHZhbHVlIGluIGxleGljb2dyYXBoaWNhbCBvcmRlci4KKwkjIAorCSMgRXhhbXBsZQorCSMgcHJlZmVycmVkX25hbWVzID0gWyAiXi9kZXYvbXBhdGgvIiwgIl4vZGV2L21hcHBlci9tcGF0aCIsICJeL2Rldi9baHNdZCIgXQorCSMgCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvZmlsdGVyLgorCSMgTGltaXQgdGhlIGJsb2NrIGRldmljZXMgdGhhdCBhcmUgdXNlZCBieSBMVk0gY29tbWFuZHMuCisJIyBUaGlzIGlzIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgdG8gYWNjZXB0IG9yIHJlamVjdCBibG9jaworCSMgZGV2aWNlIHBhdGggbmFtZXMuIEVhY2ggcmVnZXggaXMgZGVsaW1pdGVkIGJ5IGEgdmVydGljYWwgYmFyICd8JworCSMgKG9yIGFueSBjaGFyYWN0ZXIpIGFuZCBpcyBwcmVjZWRlZCBieSAnYScgdG8gYWNjZXB0IHRoZSBwYXRoLCBvcgorCSMgYnkgJ3InIHRvIHJlamVjdCB0aGUgcGF0aC4gVGhlIGZpcnN0IHJlZ2V4IGluIHRoZSBsaXN0IHRvIG1hdGNoIHRoZQorCSMgcGF0aCBpcyB1c2VkLCBwcm9kdWNpbmcgdGhlICdhJyBvciAncicgcmVzdWx0IGZvciB0aGUgZGV2aWNlLgorCSMgV2hlbiBtdWx0aXBsZSBwYXRoIG5hbWVzIGV4aXN0IGZvciBhIGJsb2NrIGRldmljZSwgaWYgYW55IHBhdGggbmFtZQorCSMgbWF0Y2hlcyBhbiAnYScgcGF0dGVybiBiZWZvcmUgYW4gJ3InIHBhdHRlcm4sIHRoZW4gdGhlIGRldmljZSBpcworCSMgYWNjZXB0ZWQuIElmIGFsbCB0aGUgcGF0aCBuYW1lcyBtYXRjaCBhbiAncicgcGF0dGVybiBmaXJzdCwgdGhlbiB0aGUKKwkjIGRldmljZSBpcyByZWplY3RlZC4gVW5tYXRjaGluZyBwYXRoIG5hbWVzIGRvIG5vdCBhZmZlY3QgdGhlIGFjY2VwdAorCSMgb3IgcmVqZWN0IGRlY2lzaW9uLiBJZiBubyBwYXRoIG5hbWVzIGZvciBhIGRldmljZSBtYXRjaCBhIHBhdHRlcm4sCisJIyB0aGVuIHRoZSBkZXZpY2UgaXMgYWNjZXB0ZWQuIEJlIGNhcmVmdWwgbWl4aW5nICdhJyBhbmQgJ3InIHBhdHRlcm5zLAorCSMgYXMgdGhlIGNvbWJpbmF0aW9uIG1pZ2h0IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzICh0ZXN0IGNoYW5nZXMuKQorCSMgUnVuIHZnc2NhbiBhZnRlciBjaGFuZ2luZyB0aGUgZmlsdGVyIHRvIHJlZ2VuZXJhdGUgdGhlIGNhY2hlLgorCSMgU2VlIHRoZSB1c2VfbHZtZXRhZCBjb21tZW50IGZvciBhIHNwZWNpYWwgY2FzZSByZWdhcmRpbmcgZmlsdGVycy4KKwkjIAorCSMgRXhhbXBsZQorCSMgQWNjZXB0IGV2ZXJ5IGJsb2NrIGRldmljZToKKwkjIGZpbHRlciA9IFsgImF8LiovfCIgXQorCSMgUmVqZWN0IHRoZSBjZHJvbSBkcml2ZToKKwkjIGZpbHRlciA9IFsgInJ8L2Rldi9jZHJvbXwiIF0KKwkjIFdvcmsgd2l0aCBqdXN0IGxvb3BiYWNrIGRldmljZXMsIGUuZy4gZm9yIHRlc3Rpbmc6CisJIyBmaWx0ZXIgPSBbICJhfGxvb3B8IiwgInJ8Lip8IiBdCisJIyBBY2NlcHQgYWxsIGxvb3AgZGV2aWNlcyBhbmQgaWRlIGRyaXZlcyBleGNlcHQgaGRjOgorCSMgZmlsdGVyID0gWyAiYXxsb29wfCIsICJyfC9kZXYvaGRjfCIsICJhfC9kZXYvaWRlfCIsICJyfC4qfCIgXQorCSMgVXNlIGFuY2hvcnMgdG8gYmUgdmVyeSBzcGVjaWZpYzoKKwkjIGZpbHRlciA9IFsgImF8Xi9kZXYvaGRhOCR8IiwgInJ8LiovfCIgXQorCSMgCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGZpbHRlciA9IFsgImF8LiovfCIgXQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2dsb2JhbF9maWx0ZXIuCisJIyBMaW1pdCB0aGUgYmxvY2sgZGV2aWNlcyB0aGF0IGFyZSB1c2VkIGJ5IExWTSBzeXN0ZW0gY29tcG9uZW50cy4KKwkjIEJlY2F1c2UgZGV2aWNlcy9maWx0ZXIgbWF5IGJlIG92ZXJyaWRkZW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpdCBpcworCSMgbm90IHN1aXRhYmxlIGZvciBzeXN0ZW0td2lkZSBkZXZpY2UgZmlsdGVyaW5nLCBlLmcuIHVkZXYgYW5kIGx2bWV0YWQuCisJIyBVc2UgZ2xvYmFsX2ZpbHRlciB0byBoaWRlIGRldmljZXMgZnJvbSB0aGVzZSBMVk0gc3lzdGVtIGNvbXBvbmVudHMuCisJIyBUaGUgc3ludGF4IGlzIHRoZSBzYW1lIGFzIGRldmljZXMvZmlsdGVyLiBEZXZpY2VzIHJlamVjdGVkIGJ5CisJIyBnbG9iYWxfZmlsdGVyIGFyZSBub3Qgb3BlbmVkIGJ5IExWTS4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgZ2xvYmFsX2ZpbHRlciA9IFsgImF8LiovfCIgXQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2NhY2hlX2Rpci4KKwkjIERpcmVjdG9yeSBpbiB3aGljaCB0byBzdG9yZSB0aGUgZGV2aWNlIGNhY2hlIGZpbGUuCisJIyBUaGUgcmVzdWx0cyBvZiBmaWx0ZXJpbmcgYXJlIGNhY2hlZCBvbiBkaXNrIHRvIGF2b2lkIHJlc2Nhbm5pbmcgZHVkCisJIyBkZXZpY2VzICh3aGljaCBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lKS4gQnkgZGVmYXVsdCB0aGlzIGNhY2hlIGlzCisJIyBzdG9yZWQgaW4gYSBmaWxlIG5hbWVkIC5jYWNoZS4gSXQgaXMgc2FmZSB0byBkZWxldGUgdGhpcyBmaWxlOyB0aGUKKwkjIHRvb2xzIHJlZ2VuZXJhdGUgaXQuIElmIG9idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXYgaXMgZW5hYmxlZCwgdGhlCisJIyBsaXN0IG9mIGRldmljZXMgaXMgb2J0YWluZWQgZnJvbSB1ZGV2IGFuZCBhbnkgZXhpc3RpbmcgLmNhY2hlIGZpbGUKKwkjIGlzIHJlbW92ZWQuCisJY2FjaGVfZGlyID0gIkBERUZBVUxUX1NZU19ESVJAL0BERUZBVUxUX0NBQ0hFX1NVQkRJUkAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvY2FjaGVfZmlsZV9wcmVmaXguCisJIyBBIHByZWZpeCB1c2VkIGJlZm9yZSB0aGUgLmNhY2hlIGZpbGUgbmFtZS4gU2VlIGRldmljZXMvY2FjaGVfZGlyLgorCWNhY2hlX2ZpbGVfcHJlZml4ID0gIiIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy93cml0ZV9jYWNoZV9zdGF0ZS4KKwkjIEVuYWJsZS9kaXNhYmxlIHdyaXRpbmcgdGhlIGNhY2hlIGZpbGUuIFNlZSBkZXZpY2VzL2NhY2hlX2Rpci4KKwl3cml0ZV9jYWNoZV9zdGF0ZSA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy90eXBlcy4KKwkjIExpc3Qgb2YgYWRkaXRpb25hbCBhY2NlcHRhYmxlIGJsb2NrIGRldmljZSB0eXBlcy4KKwkjIFRoZXNlIGFyZSBvZiBkZXZpY2UgdHlwZSBuYW1lcyBmcm9tIC9wcm9jL2RldmljZXMsIGZvbGxvd2VkIGJ5IHRoZQorCSMgbWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9ucy4KKwkjIAorCSMgRXhhbXBsZQorCSMgdHlwZXMgPSBbICJmZCIsIDE2IF0KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9zeXNmc19zY2FuLgorCSMgUmVzdHJpY3QgZGV2aWNlIHNjYW5uaW5nIHRvIGJsb2NrIGRldmljZXMgYXBwZWFyaW5nIGluIHN5c2ZzLgorCSMgVGhpcyBpcyBhIHF1aWNrIHdheSBvZiBmaWx0ZXJpbmcgb3V0IGJsb2NrIGRldmljZXMgdGhhdCBhcmUgbm90CisJIyBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIHN5c2ZzIG11c3QgYmUgcGFydCBvZiB0aGUga2VybmVsIGFuZCBtb3VudGVkLikKKwlzeXNmc19zY2FuID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL211bHRpcGF0aF9jb21wb25lbnRfZGV0ZWN0aW9uLgorCSMgSWdub3JlIGRldmljZXMgdGhhdCBhcmUgY29tcG9uZW50cyBvZiBETSBtdWx0aXBhdGggZGV2aWNlcy4KKwltdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbiA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9tZF9jb21wb25lbnRfZGV0ZWN0aW9uLgorCSMgSWdub3JlIGRldmljZXMgdGhhdCBhcmUgY29tcG9uZW50cyBvZiBzb2Z0d2FyZSBSQUlEIChtZCkgZGV2aWNlcy4KKwltZF9jb21wb25lbnRfZGV0ZWN0aW9uID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2Z3X3JhaWRfY29tcG9uZW50X2RldGVjdGlvbi4KKwkjIElnbm9yZSBkZXZpY2VzIHRoYXQgYXJlIGNvbXBvbmVudHMgb2YgZmlybXdhcmUgUkFJRCBkZXZpY2VzLgorCSMgTFZNIG11c3QgdXNlIGFuIGV4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZSBvdGhlciB0aGFuIG5vbmUgZm9yIHRoaXMKKwkjIGRldGVjdGlvbiB0byBleGVjdXRlLgorCWZ3X3JhaWRfY29tcG9uZW50X2RldGVjdGlvbiA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9tZF9jaHVua19hbGlnbm1lbnQuCisJIyBBbGlnbiBQViBkYXRhIGJsb2NrcyB3aXRoIG1kIGRldmljZSdzIHN0cmlwZS13aWR0aC4KKwkjIFRoaXMgYXBwbGllcyBpZiBhIFBWIGlzIHBsYWNlZCBkaXJlY3RseSBvbiBhbiBtZCBkZXZpY2UuCisJbWRfY2h1bmtfYWxpZ25tZW50ID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2RlZmF1bHRfZGF0YV9hbGlnbm1lbnQuCisJIyBEZWZhdWx0IGFsaWdubWVudCBvZiB0aGUgc3RhcnQgb2YgYSBQViBkYXRhIGFyZWEgaW4gTUIuCisJIyBJZiBzZXQgdG8gMCwgYSB2YWx1ZSBvZiA2NEtpQiB3aWxsIGJlIHVzZWQuCisJIyBTZXQgdG8gMSBmb3IgMU1pQiwgMiBmb3IgMk1pQiwgZXRjLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBkZWZhdWx0X2RhdGFfYWxpZ25tZW50ID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2RhdGFfYWxpZ25tZW50X2RldGVjdGlvbi4KKwkjIERldGVjdCBQViBkYXRhIGFsaWdubWVudCBiYXNlZCBvbiBzeXNmcyBkZXZpY2UgaW5mb3JtYXRpb24uCisJIyBUaGUgc3RhcnQgb2YgYSBQViBkYXRhIGFyZWEgd2lsbCBiZSBhIG11bHRpcGxlIG9mIG1pbmltdW1faW9fc2l6ZSBvcgorCSMgb3B0aW1hbF9pb19zaXplIGV4cG9zZWQgaW4gc3lzZnMuIG1pbmltdW1faW9fc2l6ZSBpcyB0aGUgc21hbGxlc3QKKwkjIHJlcXVlc3QgdGhlIGRldmljZSBjYW4gcGVyZm9ybSB3aXRob3V0IGluY3VycmluZyBhIHJlYWQtbW9kaWZ5LXdyaXRlCisJIyBwZW5hbHR5LCBlLmcuIE1EIGNodW5rIHNpemUuIG9wdGltYWxfaW9fc2l6ZSBpcyB0aGUgZGV2aWNlJ3MKKwkjIHByZWZlcnJlZCB1bml0IG9mIHJlY2VpdmluZyBJL08sIGUuZy4gTUQgc3RyaXBlIHdpZHRoLgorCSMgbWluaW11bV9pb19zaXplIGlzIHVzZWQgaWYgb3B0aW1hbF9pb19zaXplIGlzIHVuZGVmaW5lZCAoMCkuCisJIyBJZiBtZF9jaHVua19hbGlnbm1lbnQgaXMgZW5hYmxlZCwgdGhhdCBkZXRlY3RzIHRoZSBvcHRpbWFsX2lvX3NpemUuCisJIyBUaGlzIHNldHRpbmcgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIG1kX2NodW5rX2FsaWdubWVudC4KKwlkYXRhX2FsaWdubWVudF9kZXRlY3Rpb24gPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvZGF0YV9hbGlnbm1lbnQuCisJIyBBbGlnbm1lbnQgb2YgdGhlIHN0YXJ0IG9mIGEgUFYgZGF0YSBhcmVhIGluIEtpQi4KKwkjIElmIGEgUFYgaXMgcGxhY2VkIGRpcmVjdGx5IG9uIGFuIG1kIGRldmljZSBhbmQgbWRfY2h1bmtfYWxpZ25tZW50IG9yCisJIyBkYXRhX2FsaWdubWVudF9kZXRlY3Rpb24gYXJlIGVuYWJsZWQsIHRoZW4gdGhpcyBzZXR0aW5nIGlzIGlnbm9yZWQuCisJIyBPdGhlcndpc2UsIG1kX2NodW5rX2FsaWdubWVudCBhbmQgZGF0YV9hbGlnbm1lbnRfZGV0ZWN0aW9uIGFyZQorCSMgZGlzYWJsZWQgaWYgdGhpcyBpcyBzZXQuIFNldCB0byAwIHRvIHVzZSB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgb3IgdGhlCisJIyBwYWdlIHNpemUsIGlmIGxhcmdlci4KKwlkYXRhX2FsaWdubWVudCA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9kYXRhX2FsaWdubWVudF9vZmZzZXRfZGV0ZWN0aW9uLgorCSMgRGV0ZWN0IFBWIGRhdGEgYWxpZ25tZW50IG9mZnNldCBiYXNlZCBvbiBzeXNmcyBkZXZpY2UgaW5mb3JtYXRpb24uCisJIyBUaGUgc3RhcnQgb2YgYSBQViBhbGlnbmVkIGRhdGEgYXJlYSB3aWxsIGJlIHNoaWZ0ZWQgYnkgdGhlCisJIyBhbGlnbm1lbnRfb2Zmc2V0IGV4cG9zZWQgaW4gc3lzZnMuIFRoaXMgb2Zmc2V0IGlzIG9mdGVuIDAsIGJ1dCBtYXkKKwkjIGJlIG5vbi16ZXJvLiBDZXJ0YWluIDRLaUIgc2VjdG9yIGRyaXZlcyB0aGF0IGNvbXBlbnNhdGUgZm9yIHdpbmRvd3MKKwkjIHBhcnRpdGlvbmluZyB3aWxsIGhhdmUgYW4gYWxpZ25tZW50X29mZnNldCBvZiAzNTg0IGJ5dGVzIChzZWN0b3IgNworCSMgaXMgdGhlIGxvd2VzdCBhbGlnbmVkIGxvZ2ljYWwgYmxvY2ssIHRoZSA0S2lCIHNlY3RvcnMgc3RhcnQgYXQKKwkjIExCQSAtMSwgYW5kIGNvbnNlcXVlbnRseSBzZWN0b3IgNjMgaXMgYWxpZ25lZCBvbiBhIDRLaUIgYm91bmRhcnkpLgorCSMgcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50b2Zmc2V0IHdpbGwgc2tpcCB0aGlzIGRldGVjdGlvbi4KKwlkYXRhX2FsaWdubWVudF9vZmZzZXRfZGV0ZWN0aW9uID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkZXZpY2VzL2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcy4KKwkjIElnbm9yZSBETSBkZXZpY2VzIHRoYXQgaGF2ZSBJL08gc3VzcGVuZGVkIHdoaWxlIHNjYW5uaW5nIGRldmljZXMuCisJIyBPdGhlcndpc2UsIExWTSB3YWl0cyBmb3IgYSBzdXNwZW5kZWQgZGV2aWNlIHRvIGJlY29tZSBhY2Nlc3NpYmxlLgorCSMgVGhpcyBzaG91bGQgb25seSBiZSBuZWVkZWQgaW4gcmVjb3Zlcnkgc2l0dWF0aW9ucy4KKwlpZ25vcmVfc3VzcGVuZGVkX2RldmljZXMgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvaWdub3JlX2x2bV9taXJyb3JzLgorCSMgRG8gbm90IHNjYW4gJ21pcnJvcicgTFZzIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2Nrcy4KKwkjIFRoaXMgYXZvaWRzIHBvc3NpYmxlIGRlYWRsb2NrcyB3aGVuIHVzaW5nIHRoZSAnbWlycm9yJyBzZWdtZW50IHR5cGUuCisJIyBUaGlzIHNldHRpbmcgZGV0ZXJtaW5lcyB3aGV0aGVyIExWcyB1c2luZyB0aGUgJ21pcnJvcicgc2VnbWVudCB0eXBlCisJIyBhcmUgc2Nhbm5lZCBmb3IgTFZNIGxhYmVscy4gVGhpcyBhZmZlY3RzIHRoZSBhYmlsaXR5IG9mIG1pcnJvcnMgdG8KKwkjIGJlIHVzZWQgYXMgcGh5c2ljYWwgdm9sdW1lcy4gSWYgdGhpcyBzZXR0aW5nIGlzIGVuYWJsZWQsIGl0IGlzCisJIyBpbXBvc3NpYmxlIHRvIGNyZWF0ZSBWR3Mgb24gdG9wIG9mIG1pcnJvciBMVnMsIGkuZS4gdG8gc3RhY2sgVkdzIG9uCisJIyBtaXJyb3IgTFZzLiBJZiB0aGlzIHNldHRpbmcgaXMgZGlzYWJsZWQsIGFsbG93aW5nIG1pcnJvciBMVnMgdG8gYmUKKwkjIHNjYW5uZWQsIGl0IG1heSBjYXVzZSBMVk0gcHJvY2Vzc2VzIGFuZCBJL08gdG8gdGhlIG1pcnJvciB0byBiZWNvbWUKKwkjIGJsb2NrZWQuIFRoaXMgaXMgZHVlIHRvIHRoZSB3YXkgdGhhdCB0aGUgbWlycm9yIHNlZ21lbnQgdHlwZSBoYW5kbGVzCisJIyBmYWlsdXJlcy4gSW4gb3JkZXIgZm9yIHRoZSBoYW5nIHRvIG9jY3VyLCBhbiBMVk0gY29tbWFuZCBtdXN0IGJlIHJ1bgorCSMganVzdCBhZnRlciBhIGZhaWx1cmUgYW5kIGJlZm9yZSB0aGUgYXV0b21hdGljIExWTSByZXBhaXIgcHJvY2VzcworCSMgdGFrZXMgcGxhY2UsIG9yIHRoZXJlIG11c3QgYmUgZmFpbHVyZXMgaW4gbXVsdGlwbGUgbWlycm9ycyBpbiB0aGUKKwkjIHNhbWUgVkcgYXQgdGhlIHNhbWUgdGltZSB3aXRoIHdyaXRlIGZhaWx1cmVzIG9jY3VycmluZyBtb21lbnRzIGJlZm9yZQorCSMgYSBzY2FuIG9mIHRoZSBtaXJyb3IncyBsYWJlbHMuIFRoZSAnbWlycm9yJyBzY2FubmluZyBwcm9ibGVtcyBkbyBub3QKKwkjIGFwcGx5IHRvIExWTSBSQUlEIHR5cGVzIGxpa2UgJ3JhaWQxJyB3aGljaCBoYW5kbGUgZmFpbHVyZXMgaW4gYQorCSMgZGlmZmVyZW50IHdheSwgbWFraW5nIHRoZW0gYSBiZXR0ZXIgY2hvaWNlIGZvciBWRyBzdGFja2luZy4KKwlpZ25vcmVfbHZtX21pcnJvcnMgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudC4KKwkjIE51bWJlciBvZiBJL08gZXJyb3JzIGFmdGVyIHdoaWNoIGEgZGV2aWNlIGlzIHNraXBwZWQuCisJIyBEdXJpbmcgZWFjaCBMVk0gb3BlcmF0aW9uLCBlcnJvcnMgcmVjZWl2ZWQgZnJvbSBlYWNoIGRldmljZSBhcmUKKwkjIGNvdW50ZWQuIElmIHRoZSBjb3VudGVyIG9mIGEgZGV2aWNlIGV4Y2VlZHMgdGhlIGxpbWl0IHNldCBoZXJlLAorCSMgbm8gZnVydGhlciBJL08gaXMgc2VudCB0byB0aGF0IGRldmljZSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUKKwkjIG9wZXJhdGlvbi4gU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgdGhlIGNvdW50ZXJzIGFsdG9nZXRoZXIuCisJZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudCA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9yZXF1aXJlX3Jlc3RvcmVmaWxlX3dpdGhfdXVpZC4KKwkjIEFsbG93IHVzZSBvZiBwdmNyZWF0ZSAtLXV1aWQgd2l0aG91dCByZXF1aXJpbmcgLS1yZXN0b3JlZmlsZS4KKwlyZXF1aXJlX3Jlc3RvcmVmaWxlX3dpdGhfdXVpZCA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9wdl9taW5fc2l6ZS4KKwkjIE1pbmltdW0gc2l6ZSBpbiBLaUIgb2YgYmxvY2sgZGV2aWNlcyB3aGljaCBjYW4gYmUgdXNlZCBhcyBQVnMuCisJIyBJbiBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCBhbGwgbm9kZXMgbXVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuCisJIyBBbnkgdmFsdWUgc21hbGxlciB0aGFuIDUxMktpQiBpcyBpZ25vcmVkLiBUaGUgcHJldmlvdXMgYnVpbHQtaW4KKwkjIHZhbHVlIHdhcyA1MTIuCisJcHZfbWluX3NpemUgPSAyMDQ4CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRldmljZXMvaXNzdWVfZGlzY2FyZHMuCisJIyBJc3N1ZSBkaXNjYXJkcyB0byBQVnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgYW4gTFYuCisJIyBEaXNjYXJkcyBhcmUgc2VudCB0byBhbiBMVidzIHVuZGVybHlpbmcgcGh5c2ljYWwgdm9sdW1lcyB3aGVuIHRoZSBMVgorCSMgaXMgbm8gbG9uZ2VyIHVzaW5nIHRoZSBwaHlzaWNhbCB2b2x1bWVzJyBzcGFjZSwgZS5nLiBsdnJlbW92ZSwKKwkjIGx2cmVkdWNlLiBEaXNjYXJkcyBpbmZvcm0gdGhlIHN0b3JhZ2UgdGhhdCBhIHJlZ2lvbiBpcyBubyBsb25nZXIKKwkjIHVzZWQuIFN0b3JhZ2UgdGhhdCBzdXBwb3J0cyBkaXNjYXJkcyBhZHZlcnRpc2UgdGhlIHByb3RvY29sLXNwZWNpZmljCisJIyB3YXkgZGlzY2FyZHMgc2hvdWxkIGJlIGlzc3VlZCBieSB0aGUga2VybmVsIChUUklNLCBVTk1BUCwgb3IKKwkjIFdSSVRFIFNBTUUgd2l0aCBVTk1BUCBiaXQgc2V0KS4gTm90IGFsbCBzdG9yYWdlIHdpbGwgc3VwcG9ydCBvcgorCSMgYmVuZWZpdCBmcm9tIGRpc2NhcmRzLCBidXQgU1NEcyBhbmQgdGhpbmx5IHByb3Zpc2lvbmVkIExVTnMKKwkjIGdlbmVyYWxseSBkby4gSWYgZW5hYmxlZCwgZGlzY2FyZHMgd2lsbCBvbmx5IGJlIGlzc3VlZCBpZiBib3RoIHRoZQorCSMgc3RvcmFnZSBhbmQga2VybmVsIHByb3ZpZGUgc3VwcG9ydC4KKwlpc3N1ZV9kaXNjYXJkcyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZGV2aWNlcy9hbGxvd19jaGFuZ2VzX3dpdGhfZHVwbGljYXRlX3B2cy4KKwkjIEFsbG93IFZHIG1vZGlmaWNhdGlvbiB3aGlsZSBhIFBWIGFwcGVhcnMgb24gbXVsdGlwbGUgZGV2aWNlcy4KKwkjIFdoZW4gYSBQViBhcHBlYXJzIG9uIG11bHRpcGxlIGRldmljZXMsIExWTSBhdHRlbXB0cyB0byBjaG9vc2UgdGhlCisJIyBiZXN0IGRldmljZSB0byB1c2UgZm9yIHRoZSBQVi4gSWYgdGhlIGRldmljZXMgcmVwcmVzZW50IHRoZSBzYW1lCisJIyB1bmRlcmx5aW5nIHN0b3JhZ2UsIHRoZSBjaG9pY2UgaGFzIG1pbmltYWwgY29uc2VxdWVuY2UuIElmIHRoZQorCSMgZGV2aWNlcyByZXByZXNlbnQgZGlmZmVyZW50IHVuZGVybHlpbmcgc3RvcmFnZSwgdGhlIHdyb25nIGNob2ljZQorCSMgY2FuIHJlc3VsdCBpbiBkYXRhIGxvc3MgaWYgdGhlIFZHIGlzIG1vZGlmaWVkLiBEaXNhYmxpbmcgdGhpcworCSMgc2V0dGluZyBpcyB0aGUgc2FmZXN0IG9wdGlvbiBiZWNhdXNlIGl0IHByZXZlbnRzIG1vZGlmeWluZyBhIFZHCisJIyBvciBhY3RpdmF0aW5nIExWcyBpbiBpdCB3aGlsZSBhIFBWIGFwcGVhcnMgb24gbXVsdGlwbGUgZGV2aWNlcy4KKwkjIEVuYWJsaW5nIHRoaXMgc2V0dGluZyBhbGxvd3MgdGhlIFZHIHRvIGJlIHVzZWQgYXMgdXN1YWwgZXZlbiB3aXRoCisJIyB1bmNlcnRhaW4gZGV2aWNlcy4KKwlhbGxvd19jaGFuZ2VzX3dpdGhfZHVwbGljYXRlX3B2cyA9IDAKK30KKworIyBDb25maWd1cmF0aW9uIHNlY3Rpb24gYWxsb2NhdGlvbi4KKyMgSG93IExWTSBzZWxlY3RzIHNwYWNlIGFuZCBhcHBsaWVzIHByb3BlcnRpZXMgdG8gTFZzLgorYWxsb2NhdGlvbiB7CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFsbG9jYXRpb24vY2xpbmdfdGFnX2xpc3QuCisJIyBBZHZpc2UgTFZNIHdoaWNoIFBWcyB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgZm9yIG5ldyBzcGFjZS4KKwkjIFdoZW4gc2VhcmNoaW5nIGZvciBmcmVlIHNwYWNlIHRvIGV4dGVuZCBhbiBMViwgdGhlICdjbGluZycgYWxsb2NhdGlvbgorCSMgcG9saWN5IHdpbGwgY2hvb3NlIHNwYWNlIG9uIHRoZSBzYW1lIFBWcyBhcyB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZQorCSMgZXhpc3RpbmcgTFYuIElmIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBhbmQgYSBsaXN0IG9mIHRhZ3MgaXMKKwkjIGRlZmluZWQgaGVyZSwgaXQgd2lsbCBjaGVjayB3aGV0aGVyIGFueSBvZiB0aGVtIGFyZSBhdHRhY2hlZCB0byB0aGUKKwkjIFBWcyBjb25jZXJuZWQgYW5kIHRoZW4gc2VlayB0byBtYXRjaCB0aG9zZSBQViB0YWdzIGJldHdlZW4gZXhpc3RpbmcKKwkjIGV4dGVudHMgYW5kIG5ldyBleHRlbnRzLgorCSMgCisJIyBFeGFtcGxlCisJIyBVc2UgdGhlIHNwZWNpYWwgdGFnICJAKiIgYXMgYSB3aWxkY2FyZCB0byBtYXRjaCBhbnkgUFYgdGFnOgorCSMgY2xpbmdfdGFnX2xpc3QgPSBbICJAKiIgXQorCSMgTFZzIGFyZSBtaXJyb3JlZCBiZXR3ZWVuIHR3byBzaXRlcyB3aXRoaW4gYSBzaW5nbGUgVkcsIGFuZAorCSMgUFZzIGFyZSB0YWdnZWQgd2l0aCBlaXRoZXIgQHNpdGUxIG9yIEBzaXRlMiB0byBpbmRpY2F0ZSB3aGVyZQorCSMgdGhleSBhcmUgc2l0dWF0ZWQ6CisJIyBjbGluZ190YWdfbGlzdCA9IFsgIkBzaXRlMSIsICJAc2l0ZTIiIF0KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL21heGltaXNlX2NsaW5nLgorCSMgVXNlIGEgcHJldmlvdXMgYWxsb2NhdGlvbiBhbGdvcml0aG0uCisJIyBDaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAyLjAyLjg1IGV4dGVuZGVkIHRoZSByZWFjaCBvZiB0aGUgJ2NsaW5nJworCSMgcG9saWNpZXMgdG8gZGV0ZWN0IG1vcmUgc2l0dWF0aW9ucyB3aGVyZSBkYXRhIGNhbiBiZSBncm91cGVkIG9udG8KKwkjIHRoZSBzYW1lIGRpc2tzLiBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgY2hhbmdlcworCSMgYW5kIHJldmVydCB0byB0aGUgcHJldmlvdXMgYWxnb3JpdGhtLgorCW1heGltaXNlX2NsaW5nID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL3VzZV9ibGtpZF93aXBpbmcuCisJIyBVc2UgYmxraWQgdG8gZGV0ZWN0IGV4aXN0aW5nIHNpZ25hdHVyZXMgb24gbmV3IFBWcyBhbmQgTFZzLgorCSMgVGhlIGJsa2lkIGxpYnJhcnkgY2FuIGRldGVjdCBtb3JlIHNpZ25hdHVyZXMgdGhhbiB0aGUgbmF0aXZlIExWTQorCSMgZGV0ZWN0aW9uIGNvZGUsIGJ1dCBtYXkgdGFrZSBsb25nZXIuIExWTSBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoCisJIyBibGtpZCB3aXBpbmcgc3VwcG9ydCBmb3IgdGhpcyBzZXR0aW5nIHRvIGFwcGx5LiBMVk0gbmF0aXZlIGRldGVjdGlvbgorCSMgY29kZSBpcyBjdXJyZW50bHkgYWJsZSB0byByZWNvZ25pemU6IE1EIGRldmljZSBzaWduYXR1cmVzLAorCSMgc3dhcCBzaWduYXR1cmUsIGFuZCBMVUtTIHNpZ25hdHVyZXMuIFRvIHNlZSB0aGUgbGlzdCBvZiBzaWduYXR1cmVzCisJIyByZWNvZ25pemVkIGJ5IGJsa2lkLCBjaGVjayB0aGUgb3V0cHV0IG9mIHRoZSAnYmxraWQgLWsnIGNvbW1hbmQuCisJdXNlX2Jsa2lkX3dpcGluZyA9IEBERUZBVUxUX1VTRV9CTEtJRF9XSVBJTkdACisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFsbG9jYXRpb24vd2lwZV9zaWduYXR1cmVzX3doZW5femVyb2luZ19uZXdfbHZzLgorCSMgTG9vayBmb3IgYW5kIGVyYXNlIGFueSBzaWduYXR1cmVzIHdoaWxlIHplcm9pbmcgYSBuZXcgTFYuCisJIyBUaGUgLS13aXBlc2lnbmF0dXJlcyBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy4KKwkjIFplcm9pbmcgaXMgY29udHJvbGxlZCBieSB0aGUgLVovLS16ZXJvIG9wdGlvbiwgYW5kIGlmIG5vdCBzcGVjaWZpZWQsCisJIyB6ZXJvaW5nIGlzIHVzZWQgYnkgZGVmYXVsdCBpZiBwb3NzaWJsZS4gWmVyb2luZyBzaW1wbHkgb3ZlcndyaXRlcyB0aGUKKwkjIGZpcnN0IDRLaUIgb2YgYSBuZXcgTFYgd2l0aCB6ZXJvZXMgYW5kIGRvZXMgbm8gc2lnbmF0dXJlIGRldGVjdGlvbiBvcgorCSMgd2lwaW5nLiBTaWduYXR1cmUgd2lwaW5nIGdvZXMgYmV5b25kIHplcm9pbmcgYW5kIGRldGVjdHMgZXhhY3QgdHlwZXMKKwkjIGFuZCBwb3NpdGlvbnMgb2Ygc2lnbmF0dXJlcyB3aXRoaW4gdGhlIHdob2xlIExWLiBJdCBwcm92aWRlcyBhCisJIyBjbGVhbmVyIExWIGFmdGVyIGNyZWF0aW9uIGFzIGFsbCBrbm93biBzaWduYXR1cmVzIGFyZSB3aXBlZC4gVGhlIExWCisJIyBpcyBub3QgY2xhaW1lZCBpbmNvcnJlY3RseSBieSBvdGhlciB0b29scyBiZWNhdXNlIG9mIG9sZCBzaWduYXR1cmVzCisJIyBmcm9tIHByZXZpb3VzIHVzZS4gVGhlIG51bWJlciBvZiBzaWduYXR1cmVzIHRoYXQgTFZNIGNhbiBkZXRlY3QKKwkjIGRlcGVuZHMgb24gdGhlIGRldGVjdGlvbiBjb2RlIHRoYXQgaXMgc2VsZWN0ZWQgKHNlZQorCSMgdXNlX2Jsa2lkX3dpcGluZy4pIFdpcGluZyBlYWNoIGRldGVjdGVkIHNpZ25hdHVyZSBtdXN0IGJlIGNvbmZpcm1lZC4KKwkjIFdoZW4gdGhpcyBzZXR0aW5nIGlzIGRpc2FibGVkLCBzaWduYXR1cmVzIG9uIG5ldyBMVnMgYXJlIG5vdCBkZXRlY3RlZAorCSMgb3IgZXJhc2VkIHVubGVzcyB0aGUgLS13aXBlc2lnbmF0dXJlcyBvcHRpb24gaXMgdXNlZCBkaXJlY3RseS4KKwl3aXBlX3NpZ25hdHVyZXNfd2hlbl96ZXJvaW5nX25ld19sdnMgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFsbG9jYXRpb24vbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMuCisJIyBNaXJyb3IgbG9ncyBhbmQgaW1hZ2VzIHdpbGwgYWx3YXlzIHVzZSBkaWZmZXJlbnQgUFZzLgorCSMgVGhlIGRlZmF1bHQgc2V0dGluZyBjaGFuZ2VkIGluIHZlcnNpb24gMi4wMi44NS4KKwltaXJyb3JfbG9nc19yZXF1aXJlX3NlcGFyYXRlX3B2cyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWxsb2NhdGlvbi9yYWlkX3N0cmlwZV9hbGxfZGV2aWNlcy4KKwkjIFN0cmlwZSBhY3Jvc3MgYWxsIFBWcyB3aGVuIFJBSUQgc3RyaXBlcyBhcmUgbm90IHNwZWNpZmllZC4KKwkjIElmIGVuYWJsZWQsIGFsbCBQVnMgaW4gdGhlIFZHIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIHVzZWQgZm9yIHJhaWQwLzQvNS82LzEwCisJIyB3aGVuIHRoZSBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgdGhlIG51bWJlciBvZiBzdHJpcGVzIHRvIHVzZS4KKwkjIFRoaXMgd2FzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciB1bnRpbCByZWxlYXNlIDIuMDIuMTYyLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyByYWlkX3N0cmlwZV9hbGxfZGV2aWNlcyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWxsb2NhdGlvbi9jYWNoZV9wb29sX21ldGFkYXRhX3JlcXVpcmVfc2VwYXJhdGVfcHZzLgorCSMgQ2FjaGUgcG9vbCBtZXRhZGF0YSBhbmQgZGF0YSB3aWxsIGFsd2F5cyB1c2UgZGlmZmVyZW50IFBWcy4KKwljYWNoZV9wb29sX21ldGFkYXRhX3JlcXVpcmVfc2VwYXJhdGVfcHZzID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL2NhY2hlX21vZGUuCisJIyBUaGUgZGVmYXVsdCBjYWNoZSBtb2RlIHVzZWQgZm9yIG5ldyBjYWNoZS4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICB3cml0ZXRocm91Z2gKKwkjICAgICBEYXRhIGJsb2NrcyBhcmUgaW1tZWRpYXRlbHkgd3JpdHRlbiBmcm9tIHRoZSBjYWNoZSB0byBkaXNrLgorCSMgICB3cml0ZWJhY2sKKwkjICAgICBEYXRhIGJsb2NrcyBhcmUgd3JpdHRlbiBmcm9tIHRoZSBjYWNoZSBiYWNrIHRvIGRpc2sgYWZ0ZXIgc29tZQorCSMgICAgIGRlbGF5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisJIyAKKwkjIFRoaXMgc2V0dGluZyByZXBsYWNlcyBhbGxvY2F0aW9uL2NhY2hlX3Bvb2xfY2FjaGVtb2RlLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBjYWNoZV9tb2RlID0gIndyaXRldGhyb3VnaCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWxsb2NhdGlvbi9jYWNoZV9wb2xpY3kuCisJIyBUaGUgZGVmYXVsdCBjYWNoZSBwb2xpY3kgdXNlZCBmb3IgbmV3IGNhY2hlIHZvbHVtZS4KKwkjIFNpbmNlIGtlcm5lbCA0LjIgdGhlIGRlZmF1bHQgcG9saWN5IGlzIHNtcSAoU3RvY2hhc3RpYyBtdWx0aXF1ZSksCisJIyBvdGhlcndpc2UgdGhlIG9sZGVyIG1xIChNdWx0aXF1ZXVlKSBwb2xpY3kgaXMgc2VsZWN0ZWQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBhbGxvY2F0aW9uL2NhY2hlX3NldHRpbmdzLgorCSMgU2V0dGluZ3MgZm9yIHRoZSBjYWNoZSBwb2xpY3kuCisJIyBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgaW5kaXZpZHVhbCBjYWNoZSBwb2xpY2llcyBmb3IgbW9yZSBpbmZvLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIHNlY3Rpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY2FjaGVfc2V0dGluZ3MgeworCSMgfQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL2NhY2hlX3Bvb2xfY2h1bmtfc2l6ZS4KKwkjIFRoZSBtaW5pbWFsIGNodW5rIHNpemUgaW4gS2lCIGZvciBjYWNoZSBwb29sIHZvbHVtZXMuCisJIyBVc2luZyBhIGNodW5rX3NpemUgdGhhdCBpcyB0b28gbGFyZ2UgY2FuIHJlc3VsdCBpbiB3YXN0ZWZ1bCB1c2Ugb2YKKwkjIHRoZSBjYWNoZSwgd2hlcmUgc21hbGwgcmVhZHMgYW5kIHdyaXRlcyBjYW4gY2F1c2UgbGFyZ2Ugc2VjdGlvbnMgb2YKKwkjIGFuIExWIHRvIGJlIG1hcHBlZCBpbnRvIHRoZSBjYWNoZS4gSG93ZXZlciwgY2hvb3NpbmcgYSBjaHVua19zaXplCisJIyB0aGF0IGlzIHRvbyBzbWFsbCBjYW4gcmVzdWx0IGluIG1vcmUgb3ZlcmhlYWQgdHJ5aW5nIHRvIG1hbmFnZSB0aGUKKwkjIG51bWVyb3VzIGNodW5rcyB0aGF0IGJlY29tZSBtYXBwZWQgaW50byB0aGUgY2FjaGUuIFRoZSBmb3JtZXIgaXMKKwkjIG1vcmUgb2YgYSBwcm9ibGVtIHRoYW4gdGhlIGxhdHRlciBpbiBtb3N0IGNhc2VzLCBzbyB0aGUgZGVmYXVsdCBpcworCSMgb24gdGhlIHNtYWxsZXIgZW5kIG9mIHRoZSBzcGVjdHJ1bS4gU3VwcG9ydGVkIHZhbHVlcyByYW5nZSBmcm9tCisJIyAzMktpQiB0byAxR2lCIGluIG11bHRpcGxlcyBvZiAzMi4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWxsb2NhdGlvbi90aGluX3Bvb2xfbWV0YWRhdGFfcmVxdWlyZV9zZXBhcmF0ZV9wdnMuCisJIyBUaGluIHBvb2wgbWV0ZGF0YSBhbmQgZGF0YSB3aWxsIGFsd2F5cyB1c2UgZGlmZmVyZW50IFBWcy4KKwl0aGluX3Bvb2xfbWV0YWRhdGFfcmVxdWlyZV9zZXBhcmF0ZV9wdnMgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFsbG9jYXRpb24vdGhpbl9wb29sX3plcm8uCisJIyBUaGluIHBvb2wgZGF0YSBjaHVua3MgYXJlIHplcm9lZCBiZWZvcmUgdGhleSBhcmUgZmlyc3QgdXNlZC4KKwkjIFplcm9pbmcgd2l0aCBhIGxhcmdlciB0aGluIHBvb2wgY2h1bmsgc2l6ZSByZWR1Y2VzIHBlcmZvcm1hbmNlLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB0aGluX3Bvb2xfemVybyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWxsb2NhdGlvbi90aGluX3Bvb2xfZGlzY2FyZHMuCisJIyBUaGUgZGlzY2FyZHMgYmVoYXZpb3VyIG9mIHRoaW4gcG9vbCB2b2x1bWVzLgorCSMgCisJIyBBY2NlcHRlZCB2YWx1ZXM6CisJIyAgIGlnbm9yZQorCSMgICBub3Bhc3Nkb3duCisJIyAgIHBhc3Nkb3duCisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGhpbl9wb29sX2Rpc2NhcmRzID0gInBhc3Nkb3duIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL3RoaW5fcG9vbF9jaHVua19zaXplX3BvbGljeS4KKwkjIFRoZSBjaHVuayBzaXplIGNhbGN1bGF0aW9uIHBvbGljeSBmb3IgdGhpbiBwb29sIHZvbHVtZXMuCisJIyAKKwkjIEFjY2VwdGVkIHZhbHVlczoKKwkjICAgZ2VuZXJpYworCSMgICAgIElmIHRoaW5fcG9vbF9jaHVua19zaXplIGlzIGRlZmluZWQsIHVzZSBpdC4gT3RoZXJ3aXNlLCBjYWxjdWxhdGUKKwkjICAgICB0aGUgY2h1bmsgc2l6ZSBiYXNlZCBvbiBlc3RpbWF0aW9uIGFuZCBkZXZpY2UgaGludHMgZXhwb3NlZCBpbgorCSMgICAgIHN5c2ZzIC0gdGhlIG1pbmltdW1faW9fc2l6ZS4gVGhlIGNodW5rIHNpemUgaXMgYWx3YXlzIGF0IGxlYXN0CisJIyAgICAgNjRLaUIuCisJIyAgIHBlcmZvcm1hbmNlCisJIyAgICAgSWYgdGhpbl9wb29sX2NodW5rX3NpemUgaXMgZGVmaW5lZCwgdXNlIGl0LiBPdGhlcndpc2UsIGNhbGN1bGF0ZQorCSMgICAgIHRoZSBjaHVuayBzaXplIGZvciBwZXJmb3JtYW5jZSBiYXNlZCBvbiBkZXZpY2UgaGludHMgZXhwb3NlZCBpbgorCSMgICAgIHN5c2ZzIC0gdGhlIG9wdGltYWxfaW9fc2l6ZS4gVGhlIGNodW5rIHNpemUgaXMgYWx3YXlzIGF0IGxlYXN0CisJIyAgICAgNTEyS2lCLgorCSMgCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHRoaW5fcG9vbF9jaHVua19zaXplX3BvbGljeSA9ICJnZW5lcmljIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL3RoaW5fcG9vbF9jaHVua19zaXplLgorCSMgVGhlIG1pbmltYWwgY2h1bmsgc2l6ZSBpbiBLaUIgZm9yIHRoaW4gcG9vbCB2b2x1bWVzLgorCSMgTGFyZ2VyIGNodW5rIHNpemVzIG1heSBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvciBwbGFpbiB0aGluIHZvbHVtZXMsCisJIyBob3dldmVyIHVzaW5nIHRoZW0gZm9yIHNuYXBzaG90IHZvbHVtZXMgaXMgbGVzcyBlZmZpY2llbnQsIGFzIGl0CisJIyBjb25zdW1lcyBtb3JlIHNwYWNlIGFuZCB0YWtlcyBleHRyYSB0aW1lIGZvciBjb3B5aW5nLiBXaGVuIHVuc2V0LAorCSMgbHZtIHRyaWVzIHRvIGVzdGltYXRlIGNodW5rIHNpemUgc3RhcnRpbmcgZnJvbSA2NEtpQi4gU3VwcG9ydGVkCisJIyB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSA2NEtpQiB0byAxR2lCLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhbGxvY2F0aW9uL3BoeXNpY2FsX2V4dGVudF9zaXplLgorCSMgRGVmYXVsdCBwaHlzaWNhbCBleHRlbnQgc2l6ZSBpbiBLaUIgdG8gdXNlIGZvciBuZXcgVkdzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwaHlzaWNhbF9leHRlbnRfc2l6ZSA9IDQwOTYKK30KKworIyBDb25maWd1cmF0aW9uIHNlY3Rpb24gbG9nLgorIyBIb3cgTFZNIGxvZyBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZC4KK2xvZyB7CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGxvZy9yZXBvcnRfY29tbWFuZF9sb2cuCisJIyBFbmFibGUgb3IgZGlzYWJsZSBMVk0gbG9nIHJlcG9ydGluZy4KKwkjIElmIGVuYWJsZWQsIExWTSB3aWxsIGNvbGxlY3QgYSBsb2cgb2Ygb3BlcmF0aW9ucywgbWVzc2FnZXMsCisJIyBwZXItb2JqZWN0IHJldHVybiBjb2RlcyB3aXRoIG9iamVjdCBpZGVudGlmaWNhdGlvbiBhbmQgYXNzb2NpYXRlZAorCSMgZXJyb3IgbnVtYmVycyAoZXJybm9zKSBkdXJpbmcgTFZNIGNvbW1hbmQgcHJvY2Vzc2luZy4gVGhlbiB0aGUKKwkjIGxvZyBpcyBlaXRoZXIgcmVwb3J0ZWQgc29sZWx5IG9yIGluIGFkZGl0aW9uIHRvIGFueSBleGlzdGluZworCSMgcmVwb3J0cywgZGVwZW5kaW5nIG9uIExWTSBjb21tYW5kIHVzZWQuIElmIGl0IGlzIGEgcmVwb3J0aW5nIGNvbW1hbmQKKwkjIChlLmcuIHB2cywgdmdzLCBsdnMsIGx2bSBmdWxscmVwb3J0KSwgdGhlbiB0aGUgbG9nIGlzIHJlcG9ydGVkIGluCisJIyBhZGRpdGlvbiB0byBhbnkgZXhpc3RpbmcgcmVwb3J0cy4gT3RoZXJ3aXNlLCB0aGVyZSdzIG9ubHkgbG9nIHJlcG9ydAorCSMgb24gb3V0cHV0LiBGb3IgYWxsIGFwcGxpY2FibGUgTFZNIGNvbW1hbmRzLCB5b3UgY2FuIHJlcXVlc3QgdGhhdAorCSMgdGhlIG91dHB1dCBoYXMgb25seSBsb2cgcmVwb3J0IGJ5IHVzaW5nIC0tbG9nb25seSBjb21tYW5kIGxpbmUKKwkjIG9wdGlvbi4gVXNlIGxvZy9jb21tYW5kX2xvZ19jb2xzIGFuZCBsb2cvY29tbWFuZF9sb2dfc29ydCBzZXR0aW5ncworCSMgdG8gZGVmaW5lIGZpZWxkcyB0byBkaXNwbGF5IGFuZCBzb3J0IGZpZWxkcyBmb3IgdGhlIGxvZyByZXBvcnQuCisJIyBZb3UgY2FuIGFsc28gdXNlIGxvZy9jb21tYW5kX2xvZ19zZWxlY3Rpb24gdG8gZGVmaW5lIHNlbGVjdGlvbgorCSMgY3JpdGVyaWEgdXNlZCBlYWNoIHRpbWUgdGhlIGxvZyBpcyByZXBvcnRlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcmVwb3J0X2NvbW1hbmRfbG9nID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvY29tbWFuZF9sb2dfc29ydC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nIGNvbW1hbmQgbG9nLgorCSMgU2VlIDxsdm0gY29tbWFuZD4gLS1sb2dvbmx5IC0tY29uZmlncmVwb3J0IGxvZyAtbyBoZWxwCisJIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBjb21tYW5kX2xvZ19zb3J0ID0gImxvZ19zZXFfbnVtIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvY29tbWFuZF9sb2dfY29scy4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgd2hlbiByZXBvcnRpbmcgY29tbWFuZCBsb2cuCisJIyBTZWUgPGx2bSBjb21tYW5kPiAtLWxvZ29ubHkgLS1jb25maWdyZXBvcnQgbG9nIC1vIGhlbHAKKwkjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGNvbW1hbmRfbG9nX2NvbHMgPSAibG9nX3NlcV9udW0sbG9nX3R5cGUsbG9nX2NvbnRleHQsbG9nX29iamVjdF90eXBlLGxvZ19vYmplY3RfbmFtZSxsb2dfb2JqZWN0X2lkLGxvZ19vYmplY3RfZ3JvdXAsbG9nX29iamVjdF9ncm91cF9pZCxsb2dfbWVzc2FnZSxsb2dfZXJybm8sbG9nX3JldF9jb2RlIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvY29tbWFuZF9sb2dfc2VsZWN0aW9uLgorCSMgU2VsZWN0aW9uIGNyaXRlcmlhIHVzZWQgd2hlbiByZXBvcnRpbmcgY29tbWFuZCBsb2cuCisJIyBZb3UgY2FuIGRlZmluZSBzZWxlY3Rpb24gY3JpdGVyaWEgdGhhdCBhcmUgYXBwbGllZCBlYWNoCisJIyB0aW1lIGxvZyBpcyByZXBvcnRlZC4gVGhpcyB3YXksIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnRyb2wgdGhlCisJIyBhbW91bnQgb2YgbG9nIHRoYXQgaXMgZGlzcGxheWVkIG9uIG91dHB1dCBhbmQgeW91IGNhbiBzZWxlY3QKKwkjIG9ubHkgcGFydHMgb2YgdGhlIGxvZyB0aGF0IGFyZSBpbXBvcnRhbnQgZm9yIHlvdS4gVG8gZGVmaW5lCisJIyBzZWxlY3Rpb24gY3JpdGVyaWEsIHVzZSBmaWVsZHMgZnJvbSBsb2cgcmVwb3J0LiBTZWUgYWxzbworCSMgPGx2bSBjb21tYW5kPiAtLWxvZ29ubHkgLS1jb25maWdyZXBvcnQgbG9nIC1TIGhlbHAgZm9yIHRoZQorCSMgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMgYW5kIHNlbGVjdGlvbiBvcGVyYXRvcnMuIFlvdSBjYW4gYWxzbworCSMgZGVmaW5lIHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgbG9nIHJlcG9ydCBvbiBjb21tYW5kIGxpbmUgZGlyZWN0bHkKKwkjIHVzaW5nIDxsdm0gY29tbWFuZD4gLS1jb25maWdyZXBvcnQgbG9nIC1TIDxzZWxlY3Rpb24gY3JpdGVyaWE+CisJIyB3aGljaCBoYXMgcHJlY2VkZW5jZSBvdmVyIGxvZy9jb21tYW5kX2xvZ19zZWxlY3Rpb24gc2V0dGluZy4KKwkjIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNlbGVjdGlvbiBjcml0ZXJpYSBpbiBnZW5lcmFsLCBzZWUKKwkjIGx2bSg4KSBtYW4gcGFnZS4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY29tbWFuZF9sb2dfc2VsZWN0aW9uID0gIiEobG9nX3R5cGU9c3RhdHVzICYmIG1lc3NhZ2U9c3VjY2VzcykiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGxvZy92ZXJib3NlLgorCSMgQ29udHJvbHMgdGhlIG1lc3NhZ2VzIHNlbnQgdG8gc3Rkb3V0IG9yIHN0ZGVyci4KKwl2ZXJib3NlID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvc2lsZW50LgorCSMgU3VwcHJlc3MgYWxsIG5vbi1lc3NlbnRpYWwgbWVzc2FnZXMgZnJvbSBzdGRvdXQuCisJIyBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgLXFxLiBXaGVuIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMKKwkjIHN0aWxsIHByb2R1Y2Ugb3V0cHV0OiBkdW1wY29uZmlnLCBsdmRpc3BsYXksIGx2bWRpc2tzY2FuLCBsdnMsIHB2Y2ssCisJIyBwdmRpc3BsYXksIHB2cywgdmVyc2lvbiwgdmdjZmdyZXN0b3JlIC1sLCB2Z2Rpc3BsYXksIHZncy4KKwkjIE5vbi1lc3NlbnRpYWwgbWVzc2FnZXMgYXJlIHNoaWZ0ZWQgZnJvbSBsb2cgbGV2ZWwgNCB0byBsb2cgbGV2ZWwgNQorCSMgZm9yIHN5c2xvZyBhbmQgbHZtMl9sb2dfZm4gcHVycG9zZXMuCisJIyBBbnkgJ3llcycgb3IgJ25vJyBxdWVzdGlvbnMgbm90IG92ZXJyaWRkZW4gYnkgb3RoZXIgYXJndW1lbnRzIGFyZQorCSMgc3VwcHJlc3NlZCBhbmQgZGVmYXVsdCB0byAnbm8nLgorCXNpbGVudCA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbG9nL3N5c2xvZy4KKwkjIFNlbmQgbG9nIG1lc3NhZ2VzIHRocm91Z2ggc3lzbG9nLgorCXN5c2xvZyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbG9nL2ZpbGUuCisJIyBXcml0ZSBlcnJvciBhbmQgZGVidWcgbG9nIG1lc3NhZ2VzIHRvIGEgZmlsZSBzcGVjaWZpZWQgaGVyZS4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbG9nL292ZXJ3cml0ZS4KKwkjIE92ZXJ3cml0ZSB0aGUgbG9nIGZpbGUgZWFjaCB0aW1lIHRoZSBwcm9ncmFtIGlzIHJ1bi4KKwlvdmVyd3JpdGUgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGxvZy9sZXZlbC4KKwkjIFRoZSBsZXZlbCBvZiBsb2cgbWVzc2FnZXMgdGhhdCBhcmUgc2VudCB0byB0aGUgbG9nIGZpbGUgb3Igc3lzbG9nLgorCSMgVGhlcmUgYXJlIDYgc3lzbG9nLWxpa2UgbG9nIGxldmVscyBjdXJyZW50bHkgaW4gdXNlOiAyIHRvIDcgaW5jbHVzaXZlLgorCSMgNyBpcyB0aGUgbW9zdCB2ZXJib3NlIChMT0dfREVCVUcpLgorCWxldmVsID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvaW5kZW50LgorCSMgSW5kZW50IG1lc3NhZ2VzIGFjY29yZGluZyB0byB0aGVpciBzZXZlcml0eS4KKwlpbmRlbnQgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGxvZy9jb21tYW5kX25hbWVzLgorCSMgRGlzcGxheSB0aGUgY29tbWFuZCBuYW1lIG9uIGVhY2ggbGluZSBvZiBvdXRwdXQuCisJY29tbWFuZF9uYW1lcyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbG9nL3ByZWZpeC4KKwkjIEEgcHJlZml4IHRvIHVzZSBiZWZvcmUgdGhlIGxvZyBtZXNzYWdlIHRleHQuCisJIyAoQWZ0ZXIgdGhlIGNvbW1hbmQgbmFtZSwgaWYgc2VsZWN0ZWQpLgorCSMgVHdvIHNwYWNlcyBhbGxvd3MgeW91IHRvIHNlZS9ncmVwIHRoZSBzZXZlcml0eSBvZiBlYWNoIG1lc3NhZ2UuCisJIyBUbyBtYWtlIHRoZSBtZXNzYWdlcyBsb29rIHNpbWlsYXIgdG8gdGhlIG9yaWdpbmFsIExWTSB0b29scyB1c2U6CisJIyBpbmRlbnQgPSAwLCBjb21tYW5kX25hbWVzID0gMSwgcHJlZml4ID0gIiAtLSAiCisJcHJlZml4ID0gIiAgIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvYWN0aXZhdGlvbi4KKwkjIExvZyBtZXNzYWdlcyBkdXJpbmcgYWN0aXZhdGlvbi4KKwkjIERvbid0IHVzZSB0aGlzIGluIGxvdyBtZW1vcnkgc2l0dWF0aW9ucyAoY2FuIGRlYWRsb2NrKS4KKwlhY3RpdmF0aW9uID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2cvZGVidWdfY2xhc3Nlcy4KKwkjIFNlbGVjdCBsb2cgbWVzc2FnZXMgYnkgY2xhc3MuCisJIyBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgYXNzaWduZWQgdG8gYSBjbGFzcyBhbmQgb25seSBhcHBlYXIgaW4KKwkjIGRlYnVnIG91dHB1dCBpZiB0aGUgY2xhc3MgaXMgbGlzdGVkIGhlcmUuIENsYXNzZXMgY3VycmVudGx5CisJIyBhdmFpbGFibGU6IG1lbW9yeSwgZGV2aWNlcywgYWN0aXZhdGlvbiwgYWxsb2NhdGlvbiwgbHZtZXRhZCwKKwkjIG1ldGFkYXRhLCBjYWNoZSwgbG9ja2luZywgbHZtcG9sbGQuIFVzZSAiYWxsIiB0byBzZWUgZXZlcnl0aGluZy4KKwlkZWJ1Z19jbGFzc2VzID0gWyAibWVtb3J5IiwgImRldmljZXMiLCAiYWN0aXZhdGlvbiIsICJhbGxvY2F0aW9uIiwgImx2bWV0YWQiLCAibWV0YWRhdGEiLCAiY2FjaGUiLCAibG9ja2luZyIsICJsdm1wb2xsZCIsICJkYnVzIiBdCit9CisKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uIGJhY2t1cC4KKyMgSG93IExWTSBtZXRhZGF0YSBpcyBiYWNrZWQgdXAgYW5kIGFyY2hpdmVkLgorIyBJbiBMVk0sIGEgJ2JhY2t1cCcgaXMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGN1cnJlbnQgc3lzdGVtLAorIyBhbmQgYW4gJ2FyY2hpdmUnIGNvbnRhaW5zIG9sZCBtZXRhZGF0YSBjb25maWd1cmF0aW9ucy4gVGhleSBhcmUKKyMgc3RvcmVkIGluIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBmb3JtYXQuCitiYWNrdXAgeworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBiYWNrdXAvYmFja3VwLgorCSMgTWFpbnRhaW4gYSBiYWNrdXAgb2YgdGhlIGN1cnJlbnQgbWV0YWRhdGEgY29uZmlndXJhdGlvbi4KKwkjIFRoaW5rIHZlcnkgaGFyZCBiZWZvcmUgdHVybmluZyB0aGlzIG9mZiEKKwliYWNrdXAgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGJhY2t1cC9iYWNrdXBfZGlyLgorCSMgTG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGJhY2t1cCBmaWxlcy4KKwkjIFJlbWVtYmVyIHRvIGJhY2sgdXAgdGhpcyBkaXJlY3RvcnkgcmVndWxhcmx5IQorCWJhY2t1cF9kaXIgPSAiQERFRkFVTFRfU1lTX0RJUkAvQERFRkFVTFRfQkFDS1VQX1NVQkRJUkAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGJhY2t1cC9hcmNoaXZlLgorCSMgTWFpbnRhaW4gYW4gYXJjaGl2ZSBvZiBvbGQgbWV0YWRhdGEgY29uZmlndXJhdGlvbnMuCisJIyBUaGluayB2ZXJ5IGhhcmQgYmVmb3JlIHR1cm5pbmcgdGhpcyBvZmYuCisJYXJjaGl2ZSA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYmFja3VwL2FyY2hpdmVfZGlyLgorCSMgTG9jYXRpb24gb2YgdGhlIG1ldGRhdGEgYXJjaGl2ZSBmaWxlcy4KKwkjIFJlbWVtYmVyIHRvIGJhY2sgdXAgdGhpcyBkaXJlY3RvcnkgcmVndWxhcmx5IQorCWFyY2hpdmVfZGlyID0gIkBERUZBVUxUX1NZU19ESVJAL0BERUZBVUxUX0FSQ0hJVkVfU1VCRElSQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYmFja3VwL3JldGFpbl9taW4uCisJIyBNaW5pbXVtIG51bWJlciBvZiBhcmNoaXZlcyB0byBrZWVwLgorCXJldGFpbl9taW4gPSAxMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBiYWNrdXAvcmV0YWluX2RheXMuCisJIyBNaW5pbXVtIG51bWJlciBvZiBkYXlzIHRvIGtlZXAgYXJjaGl2ZSBmaWxlcy4KKwlyZXRhaW5fZGF5cyA9IDMwCit9CisKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uIHNoZWxsLgorIyBTZXR0aW5ncyBmb3IgcnVubmluZyBMVk0gaW4gc2hlbGwgKHJlYWRsaW5lKSBtb2RlLgorc2hlbGwgeworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBzaGVsbC9oaXN0b3J5X3NpemUuCisJIyBOdW1iZXIgb2YgbGluZXMgb2YgaGlzdG9yeSB0byBzdG9yZSBpbiB+Ly5sdm1faGlzdG9yeS4KKwloaXN0b3J5X3NpemUgPSAxMDAKK30KKworIyBDb25maWd1cmF0aW9uIHNlY3Rpb24gZ2xvYmFsLgorIyBNaXNjZWxsYW5lb3VzIGdsb2JhbCBMVk0gc2V0dGluZ3MuCitnbG9iYWwgeworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvdW1hc2suCisJIyBUaGUgZmlsZSBjcmVhdGlvbiBtYXNrIGZvciBhbnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNyZWF0ZWQuCisJIyBJbnRlcnByZXRlZCBhcyBvY3RhbCBpZiB0aGUgZmlyc3QgZGlnaXQgaXMgemVyby4KKwl1bWFzayA9IDA3NworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvdGVzdC4KKwkjIE5vIG9uLWRpc2sgbWV0YWRhdGEgY2hhbmdlcyB3aWxsIGJlIG1hZGUgaW4gdGVzdCBtb2RlLgorCSMgRXF1aXZhbGVudCB0byBoYXZpbmcgdGhlIC10IG9wdGlvbiBvbiBldmVyeSBjb21tYW5kLgorCXRlc3QgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC91bml0cy4KKwkjIERlZmF1bHQgdmFsdWUgZm9yIC0tdW5pdHMgYXJndW1lbnQuCisJdW5pdHMgPSAiaCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3NpX3VuaXRfY29uc2lzdGVuY3kuCisJIyBEaXN0aW5ndWlzaCBiZXR3ZWVuIHBvd2VycyBvZiAxMDI0IGFuZCAxMDAwIGJ5dGVzLgorCSMgVGhlIExWTSBjb21tYW5kcyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHBvd2VycyBvZiAxMDI0IGJ5dGVzLAorCSMgZS5nLiBLaUIsIE1pQiwgR2lCLCBhbmQgcG93ZXJzIG9mIDEwMDAgYnl0ZXMsIGUuZy4gS0IsIE1CLCBHQi4KKwkjIElmIHNjcmlwdHMgZGVwZW5kIG9uIHRoZSBvbGQgYmVoYXZpb3VyLCBkaXNhYmxlIHRoaXMgc2V0dGluZworCSMgdGVtcG9yYXJpbHkgdW50aWwgdGhleSBhcmUgdXBkYXRlZC4KKwlzaV91bml0X2NvbnNpc3RlbmN5ID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvc3VmZml4LgorCSMgRGlzcGxheSB1bml0IHN1ZmZpeCBmb3Igc2l6ZXMuCisJIyBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCBpZiB0aGUgdW5pdHMgYXJlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0KKwkjIChnbG9iYWwvdW5pdHMgPSAiaCIpIGluIHdoaWNoIGNhc2UgdGhlIHN1ZmZpeCBpcyBhbHdheXMgZGlzcGxheWVkLgorCXN1ZmZpeCA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2FjdGl2YXRpb24uCisJIyBFbmFibGUvZGlzYWJsZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGtlcm5lbCBkZXZpY2UtbWFwcGVyLgorCSMgRGlzYWJsZSB0byB1c2UgdGhlIHRvb2xzIHRvIG1hbmlwdWxhdGUgTFZNIG1ldGFkYXRhIHdpdGhvdXQKKwkjIGFjdGl2YXRpbmcgYW55IGxvZ2ljYWwgdm9sdW1lcy4gSWYgdGhlIGRldmljZS1tYXBwZXIgZHJpdmVyCisJIyBpcyBub3QgcHJlc2VudCBpbiB0aGUga2VybmVsLCBkaXNhYmxpbmcgdGhpcyBzaG91bGQgc3VwcHJlc3MKKwkjIHRoZSBlcnJvciBtZXNzYWdlcy4KKwlhY3RpdmF0aW9uID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvZmFsbGJhY2tfdG9fbHZtMS4KKwkjIFRyeSBydW5uaW5nIExWTTEgdG9vbHMgaWYgTFZNIGNhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIERNLgorCSMgVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIDIuNCBrZXJuZWxzIGFuZCBpcyBwcm92aWRlZCB0byBoZWxwCisJIyBzd2l0Y2ggYmV0d2VlbiBkZXZpY2UtbWFwcGVyIGtlcm5lbHMgYW5kIExWTTEga2VybmVscy4gVGhlIExWTTEKKwkjIHRvb2xzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIHdpdGggLmx2bTEgc3VmZmljZXMsIGUuZy4gdmdzY2FuLmx2bTEuCisJIyBUaGV5IHdpbGwgc3RvcCB3b3JraW5nIG9uY2UgdGhlIGx2bTIgb24tZGlzayBtZXRhZGF0YSBmb3JtYXQgaXMgdXNlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgZmFsbGJhY2tfdG9fbHZtMSA9IEBERUZBVUxUX0ZBTExCQUNLX1RPX0xWTTFACisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9mb3JtYXQuCisJIyBUaGUgZGVmYXVsdCBtZXRhZGF0YSBmb3JtYXQgdGhhdCBjb21tYW5kcyBzaG91bGQgdXNlLgorCSMgVGhlIC1NIDF8MiBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBsdm0xCisJIyAgIGx2bTIKKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBmb3JtYXQgPSAibHZtMiIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2Zvcm1hdF9saWJyYXJpZXMuCisJIyBTaGFyZWQgbGlicmFyaWVzIHRoYXQgcHJvY2VzcyBkaWZmZXJlbnQgbWV0YWRhdGEgZm9ybWF0cy4KKwkjIElmIHN1cHBvcnQgZm9yIExWTTEgbWV0YWRhdGEgd2FzIGNvbXBpbGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkgdXNlCisJIyBmb3JtYXRfbGlicmFyaWVzID0gImxpYmx2bTJmb3JtYXQxLnNvIgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvc2VnbWVudF9saWJyYXJpZXMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9wcm9jLgorCSMgTG9jYXRpb24gb2YgcHJvYyBmaWxlc3lzdGVtLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwlwcm9jID0gIi9wcm9jIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvZXRjLgorCSMgTG9jYXRpb24gb2YgL2V0YyBzeXN0ZW0gY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCisJZXRjID0gIkBDT05GRElSQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2xvY2tpbmdfdHlwZS4KKwkjIFR5cGUgb2YgbG9ja2luZyB0byB1c2UuCisJIyAKKwkjIEFjY2VwdGVkIHZhbHVlczoKKwkjICAgMAorCSMgICAgIFR1cm5zIG9mZiBsb2NraW5nLiBXYXJuaW5nOiB0aGlzIHJpc2tzIG1ldGFkYXRhIGNvcnJ1cHRpb24gaWYKKwkjICAgICBjb21tYW5kcyBydW4gY29uY3VycmVudGx5LgorCSMgICAxCisJIyAgICAgTFZNIHVzZXMgbG9jYWwgZmlsZS1iYXNlZCBsb2NraW5nLCB0aGUgc3RhbmRhcmQgbW9kZS4KKwkjICAgMgorCSMgICAgIExWTSB1c2VzIHRoZSBleHRlcm5hbCBzaGFyZWQgbGlicmFyeSBsb2NraW5nX2xpYnJhcnkuCisJIyAgIDMKKwkjICAgICBMVk0gdXNlcyBidWlsdC1pbiBjbHVzdGVyZWQgbG9ja2luZyB3aXRoIGNsdm1kLgorCSMgICAgIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggbHZtZXRhZC4gSWYgdXNlX2x2bWV0YWQgaXMgZW5hYmxlZCwKKwkjICAgICBMVk0gcHJpbnRzIGEgd2FybmluZyBhbmQgZGlzYWJsZXMgbHZtZXRhZCB1c2UuCisJIyAgIDQKKwkjICAgICBMVk0gdXNlcyByZWFkLW9ubHkgbG9ja2luZyB3aGljaCBmb3JiaWRzIGFueSBvcGVyYXRpb25zIHRoYXQKKwkjICAgICBtaWdodCBjaGFuZ2UgbWV0YWRhdGEuCisJIyAgIDUKKwkjICAgICBPZmZlcnMgZHVtbXkgbG9ja2luZyBmb3IgdG9vbHMgdGhhdCBkbyBub3QgbmVlZCBhbnkgbG9ja3MuCisJIyAgICAgWW91IHNob3VsZCBub3QgbmVlZCB0byBzZXQgdGhpcyBkaXJlY3RseTsgdGhlIHRvb2xzIHdpbGwgc2VsZWN0CisJIyAgICAgd2hlbiB0byB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgY29uZmlndXJlZCBsb2NraW5nX3R5cGUuCisJIyAgICAgRG8gbm90IHVzZSBsdm1ldGFkIG9yIHRoZSBrZXJuZWwgZGV2aWNlLW1hcHBlciBkcml2ZXIgd2l0aCB0aGlzCisJIyAgICAgbG9ja2luZyB0eXBlLiBJdCBpcyB1c2VkIGJ5IHRoZSAtLXJlYWRvbmx5IG9wdGlvbiB0aGF0IG9mZmVycworCSMgICAgIHJlYWQtb25seSBhY2Nlc3MgdG8gVm9sdW1lIEdyb3VwIG1ldGFkYXRhIHRoYXQgY2Fubm90IGJlIGxvY2tlZAorCSMgICAgIHNhZmVseSBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gYW4gaW5hY2Nlc3NpYmxlIGRvbWFpbiBhbmQgbWlnaHQgYmUKKwkjICAgICBpbiB1c2UsIGZvciBleGFtcGxlIGEgdmlydHVhbCBtYWNoaW5lIGltYWdlIG9yIGEgZGlzayB0aGF0IGlzCisJIyAgICAgc2hhcmVkIGJ5IGEgY2x1c3RlcmVkIG1hY2hpbmUuCisJIyAKKwlsb2NraW5nX3R5cGUgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC93YWl0X2Zvcl9sb2Nrcy4KKwkjIFdoZW4gZGlzYWJsZWQsIGZhaWwgaWYgYSBsb2NrIHJlcXVlc3Qgd291bGQgYmxvY2suCisJd2FpdF9mb3JfbG9ja3MgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9mYWxsYmFja190b19jbHVzdGVyZWRfbG9ja2luZy4KKwkjIEF0dGVtcHQgdG8gdXNlIGJ1aWx0LWluIGNsdXN0ZXIgbG9ja2luZyBpZiBsb2NraW5nX3R5cGUgMiBmYWlscy4KKwkjIElmIHVzaW5nIGV4dGVybmFsIGxvY2tpbmcgKHR5cGUgMikgYW5kIGluaXRpYWxpc2F0aW9uIGZhaWxzLCB3aXRoCisJIyB0aGlzIGVuYWJsZWQsIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHVzZSB0aGUgYnVpbHQtaW4gY2x1c3RlcmVkCisJIyBsb2NraW5nLiBEaXNhYmxlIHRoaXMgaWYgdXNpbmcgYSBjdXN0b21pc2VkIGxvY2tpbmdfbGlicmFyeS4KKwlmYWxsYmFja190b19jbHVzdGVyZWRfbG9ja2luZyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2ZhbGxiYWNrX3RvX2xvY2FsX2xvY2tpbmcuCisJIyBVc2UgbG9ja2luZ190eXBlIDEgKGxvY2FsKSBpZiBsb2NraW5nX3R5cGUgMiBvciAzIGZhaWwuCisJIyBJZiBhbiBhdHRlbXB0IHRvIGluaXRpYWxpc2UgdHlwZSAyIG9yIHR5cGUgMyBsb2NraW5nIGZhaWxlZCwgcGVyaGFwcworCSMgYmVjYXVzZSBjbHVzdGVyIGNvbXBvbmVudHMgc3VjaCBhcyBjbHZtZCBhcmUgbm90IHJ1bm5pbmcsIHdpdGggdGhpcworCSMgZW5hYmxlZCwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gdXNlIGxvY2FsIGZpbGUtYmFzZWQgbG9ja2luZworCSMgKHR5cGUgMSkuIElmIHRoaXMgc3VjY2VlZHMsIG9ubHkgY29tbWFuZHMgYWdhaW5zdCBsb2NhbCBWR3Mgd2lsbAorCSMgcHJvY2VlZC4gVkdzIG1hcmtlZCBhcyBjbHVzdGVyZWQgd2lsbCBiZSBpZ25vcmVkLgorCWZhbGxiYWNrX3RvX2xvY2FsX2xvY2tpbmcgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9sb2NraW5nX2Rpci4KKwkjIERpcmVjdG9yeSB0byB1c2UgZm9yIExWTSBjb21tYW5kIGZpbGUgbG9ja3MuCisJIyBMb2NhbCBub24tTFYgZGlyZWN0b3J5IHRoYXQgaG9sZHMgZmlsZS1iYXNlZCBsb2NrcyB3aGlsZSBjb21tYW5kcyBhcmUKKwkjIGluIHByb2dyZXNzLiBBIGRpcmVjdG9yeSBsaWtlIC90bXAgdGhhdCBtYXkgZ2V0IHdpcGVkIG9uIHJlYm9vdCBpcyBPSy4KKwlsb2NraW5nX2RpciA9ICJAREVGQVVMVF9MT0NLX0RJUkAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9wcmlvcml0aXNlX3dyaXRlX2xvY2tzLgorCSMgQWxsb3cgcXVpY2tlciBWRyB3cml0ZSBhY2Nlc3MgZHVyaW5nIGhpZ2ggdm9sdW1lIHJlYWQgYWNjZXNzLgorCSMgV2hlbiB0aGVyZSBhcmUgY29tcGV0aW5nIHJlYWQtb25seSBhbmQgcmVhZC13cml0ZSBhY2Nlc3MgcmVxdWVzdHMgZm9yCisJIyBhIHZvbHVtZSBncm91cCdzIG1ldGFkYXRhLCBpbnN0ZWFkIG9mIGFsd2F5cyBncmFudGluZyB0aGUgcmVhZC1vbmx5CisJIyByZXF1ZXN0cyBpbW1lZGlhdGVseSwgZGVsYXkgdGhlbSB0byBhbGxvdyB0aGUgcmVhZC13cml0ZSByZXF1ZXN0cyB0bworCSMgYmUgc2VydmljZWQuIFdpdGhvdXQgdGhpcyBzZXR0aW5nLCB3cml0ZSBhY2Nlc3MgbWF5IGJlIHN0YWxsZWQgYnkgYQorCSMgaGlnaCB2b2x1bWUgb2YgcmVhZC1vbmx5IHJlcXVlc3RzLiBUaGlzIG9wdGlvbiBvbmx5IGFmZmVjdHMKKwkjIGxvY2tpbmdfdHlwZSAxIHZpei4gbG9jYWwgZmlsZS1iYXNlZCBsb2NraW5nLgorCXByaW9yaXRpc2Vfd3JpdGVfbG9ja3MgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9saWJyYXJ5X2Rpci4KKwkjIFNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmaXJzdCBmb3Igc2hhcmVkIGxpYnJhcmllcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2xvY2tpbmdfbGlicmFyeS4KKwkjIFRoZSBleHRlcm5hbCBsb2NraW5nIGxpYnJhcnkgdG8gdXNlIGZvciBsb2NraW5nX3R5cGUgMi4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbG9ja2luZ19saWJyYXJ5ID0gImxpYmx2bTJjbHVzdGVybG9jay5zbyIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2Fib3J0X29uX2ludGVybmFsX2Vycm9ycy4KKwkjIEFib3J0IGEgY29tbWFuZCB0aGF0IGVuY291bnRlcnMgYW4gaW50ZXJuYWwgZXJyb3IuCisJIyBUcmVhdCBhbnkgaW50ZXJuYWwgZXJyb3JzIGFzIGZhdGFsIGVycm9ycywgYWJvcnRpbmcgdGhlIHByb2Nlc3MgdGhhdAorCSMgZW5jb3VudGVyZWQgdGhlIGludGVybmFsIGVycm9yLiBQbGVhc2Ugb25seSBlbmFibGUgZm9yIGRlYnVnZ2luZy4KKwlhYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnMgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbi4KKwkjIEludGVybmFsIHZlcmlmaWNhdGlvbiBvZiBWRyBzdHJ1Y3R1cmVzLgorCSMgQ2hlY2sgaWYgQ1JDIG1hdGNoZXMgd2hlbiBhIHBhcnNlZCBWRyBpcyB1c2VkIG11bHRpcGxlIHRpbWVzLiBUaGlzCisJIyBpcyB1c2VmdWwgdG8gY2F0Y2ggdW5leHBlY3RlZCBjaGFuZ2VzIHRvIGNhY2hlZCBWRyBzdHJ1Y3R1cmVzLgorCSMgUGxlYXNlIG9ubHkgZW5hYmxlIGZvciBkZWJ1Z2dpbmcuCisJZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24gPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9tZXRhZGF0YV9yZWFkX29ubHkuCisJIyBObyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIG9uLWRpc2sgbWV0YWRhdGEgYXJlIHBlcm1pdHRlZC4KKwkjIEFkZGl0aW9uYWxseSwgcmVhZC1vbmx5IGNvbW1hbmRzIHRoYXQgZW5jb3VudGVyIG1ldGFkYXRhIGluIG5lZWQgb2YKKwkjIHJlcGFpciB3aWxsIHN0aWxsIGJlIGFsbG93ZWQgdG8gcHJvY2VlZCBleGFjdGx5IGFzIGlmIHRoZSByZXBhaXIgaGFkCisJIyBiZWVuIHBlcmZvcm1lZCAoZXhjZXB0IGZvciB0aGUgdW5jaGFuZ2VkIHZnX3NlcW5vKS4gSW5hcHByb3ByaWF0ZQorCSMgdXNlIGNvdWxkIG1lc3MgdXAgeW91ciBzeXN0ZW0sIHNvIHNlZWsgYWR2aWNlIGZpcnN0IQorCW1ldGFkYXRhX3JlYWRfb25seSA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL21pcnJvcl9zZWd0eXBlX2RlZmF1bHQuCisJIyBUaGUgc2VnbWVudCB0eXBlIHVzZWQgYnkgdGhlIHNob3J0IG1pcnJvcmluZyBvcHRpb24gLW0uCisJIyBUaGUgLS10eXBlIG1pcnJvcnxyYWlkMSBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBtaXJyb3IKKwkjICAgICBUaGUgb3JpZ2luYWwgUkFJRDEgaW1wbGVtZW50YXRpb24gZnJvbSBMVk0vRE0uIEl0IGlzCisJIyAgICAgY2hhcmFjdGVyaXplZCBieSBhIGZsZXhpYmxlIGxvZyBzb2x1dGlvbiAoY29yZSwgZGlzaywgbWlycm9yZWQpLAorCSMgICAgIGFuZCBieSB0aGUgbmVjZXNzaXR5IHRvIGJsb2NrIEkvTyB3aGlsZSBoYW5kbGluZyBhIGZhaWx1cmUuCisJIyAgICAgVGhlcmUgaXMgYW4gaW5oZXJlbnQgcmFjZSBpbiB0aGUgZG1ldmVudGQgZmFpbHVyZSBoYW5kbGluZyBsb2dpYworCSMgICAgIHdpdGggc25hcHNob3RzIG9mIGRldmljZXMgdXNpbmcgdGhpcyB0eXBlIG9mIFJBSUQxIHRoYXQgaW4gdGhlCisJIyAgICAgd29yc3QgY2FzZSBjb3VsZCBjYXVzZSBhIGRlYWRsb2NrLiAoQWxzbyBzZWUKKwkjICAgICBkZXZpY2VzL2lnbm9yZV9sdm1fbWlycm9ycy4pCisJIyAgIHJhaWQxCisJIyAgICAgVGhpcyBpcyBhIG5ld2VyIFJBSUQxIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBNRCBSQUlEMQorCSMgICAgIHBlcnNvbmFsaXR5IHRocm91Z2ggZGV2aWNlLW1hcHBlci4gSXQgaXMgY2hhcmFjdGVyaXplZCBieSBhCisJIyAgICAgbGFjayBvZiBsb2cgb3B0aW9ucy4gKEEgbG9nIGlzIGFsd2F5cyBhbGxvY2F0ZWQgZm9yIGV2ZXJ5CisJIyAgICAgZGV2aWNlIGFuZCB0aGV5IGFyZSBwbGFjZWQgb24gdGhlIHNhbWUgZGV2aWNlIGFzIHRoZSBpbWFnZSwKKwkjICAgICBzbyBubyBzZXBhcmF0ZSBkZXZpY2VzIGFyZSByZXF1aXJlZC4pIFRoaXMgbWlycm9yCisJIyAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVxdWlyZSBJL08gdG8gYmUgYmxvY2tlZCB3aGlsZQorCSMgICAgIGhhbmRsaW5nIGEgZmFpbHVyZS4gVGhpcyBtaXJyb3IgaW1wbGVtZW50YXRpb24gaXMgbm90CisJIyAgICAgY2x1c3Rlci1hd2FyZSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gYSBzaGFyZWQgKGFjdGl2ZS9hY3RpdmUpCisJIyAgICAgZmFzaGlvbiBpbiBhIGNsdXN0ZXIuCisJIyAKKwltaXJyb3Jfc2VndHlwZV9kZWZhdWx0ID0gIkBERUZBVUxUX01JUlJPUl9TRUdUWVBFQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3JhaWQxMF9zZWd0eXBlX2RlZmF1bHQuCisJIyBUaGUgc2VnbWVudCB0eXBlIHVzZWQgYnkgdGhlIC1pIC1tIGNvbWJpbmF0aW9uLgorCSMgVGhlIC0tdHlwZSByYWlkMTB8bWlycm9yIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLgorCSMgVGhlIC0tc3RyaXBlcy8taSBhbmQgLS1taXJyb3JzLy1tIG9wdGlvbnMgY2FuIGJvdGggYmUgc3BlY2lmaWVkCisJIyBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgbG9naWNhbCB2b2x1bWUgdG8gdXNlIGJvdGggc3RyaXBpbmcgYW5kCisJIyBtaXJyb3JpbmcgZm9yIHRoZSBMVi4gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zLgorCSMgCisJIyBBY2NlcHRlZCB2YWx1ZXM6CisJIyAgIHJhaWQxMAorCSMgICAgIExWTSB1c2VzIE1EJ3MgUkFJRDEwIHBlcnNvbmFsaXR5IHRocm91Z2ggRE0uIFRoaXMgaXMgdGhlCisJIyAgICAgcHJlZmVycmVkIG9wdGlvbi4KKwkjICAgbWlycm9yCisJIyAgICAgTFZNIGxheWVycyB0aGUgJ21pcnJvcicgYW5kICdzdHJpcGUnIHNlZ21lbnQgdHlwZXMuIFRoZSBsYXllcmluZworCSMgICAgIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSBtaXJyb3IgTFYgb24gdG9wIG9mIHN0cmlwZWQgc3ViLUxWcywKKwkjICAgICBlZmZlY3RpdmVseSBjcmVhdGluZyBhIFJBSUQgMCsxIGFycmF5LiBUaGUgbGF5ZXJpbmcgaXMgc3Vib3B0aW1hbAorCSMgICAgIGluIHRlcm1zIG9mIHByb3ZpZGluZyByZWR1bmRhbmN5IGFuZCBwZXJmb3JtYW5jZS4KKwkjIAorCXJhaWQxMF9zZWd0eXBlX2RlZmF1bHQgPSAiQERFRkFVTFRfUkFJRDEwX1NFR1RZUEVAIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvc3BhcnNlX3NlZ3R5cGVfZGVmYXVsdC4KKwkjIFRoZSBzZWdtZW50IHR5cGUgdXNlZCBieSB0aGUgLVYgLUwgY29tYmluYXRpb24uCisJIyBUaGUgLS10eXBlIHNuYXBzaG90fHRoaW4gb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuCisJIyBUaGUgY29tYmluYXRpb24gb2YgLVYgYW5kIC1MIG9wdGlvbnMgY3JlYXRlcyBhIHNwYXJzZSBMVi4gVGhlcmUgYXJlCisJIyB0d28gZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucy4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBzbmFwc2hvdAorCSMgICAgIFRoZSBvcmlnaW5hbCBzbmFwc2hvdCBpbXBsZW1lbnRhdGlvbiBmcm9tIExWTS9ETS4gSXQgdXNlcyBhbiBvbGQKKwkjICAgICBzbmFwc2hvdCB0aGF0IG1peGVzIGRhdGEgYW5kIG1ldGFkYXRhIHdpdGhpbiBhIHNpbmdsZSBDT1cKKwkjICAgICBzdG9yYWdlIHZvbHVtZSBhbmQgcGVyZm9ybXMgcG9vcmx5IHdoZW4gdGhlIHNpemUgb2Ygc3RvcmVkIGRhdGEKKwkjICAgICBwYXNzZXMgaHVuZHJlZHMgb2YgTUIuCisJIyAgIHRoaW4KKwkjICAgICBBIG5ld2VyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGluIHByb3Zpc2lvbmluZy4gSXQgaGFzIGEKKwkjICAgICBiaWdnZXIgbWluaW1hbCBjaHVuayBzaXplICg2NEtpQikgYW5kIHVzZXMgYSBzZXBhcmF0ZSB2b2x1bWUgZm9yCisJIyAgICAgbWV0YWRhdGEuIEl0IGhhcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgd2hlbiBtb3JlIGRhdGEKKwkjICAgICBpcyB1c2VkLiBJdCBhbHNvIHN1cHBvcnRzIGZ1bGwgc25hcHNob3RzLgorCSMgCisJc3BhcnNlX3NlZ3R5cGVfZGVmYXVsdCA9ICJAREVGQVVMVF9TUEFSU0VfU0VHVFlQRUAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9sdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aC4KKwkjIEVuYWJsZSB0aGlzIHRvIHJlaW5zdGF0ZSB0aGUgcHJldmlvdXMgbHZkaXNwbGF5IG5hbWUgZm9ybWF0LgorCSMgVGhlIGRlZmF1bHQgZm9ybWF0IGZvciBkaXNwbGF5aW5nIExWIG5hbWVzIGluIGx2ZGlzcGxheSB3YXMgY2hhbmdlZAorCSMgaW4gdmVyc2lvbiAyLjAyLjg5IHRvIHNob3cgdGhlIExWIG5hbWUgYW5kIHBhdGggc2VwYXJhdGVseS4KKwkjIFByZXZpb3VzbHkgdGhpcyB3YXMgYWx3YXlzIHNob3duIGFzIC9kZXYvdmduYW1lL2x2bmFtZSBldmVuIHdoZW4gdGhhdAorCSMgd2FzIG5ldmVyIGEgdmFsaWQgcGF0aCBpbiB0aGUgL2RldiBmaWxlc3lzdGVtLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBsdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aCA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3VzZV9sdm1ldGFkLgorCSMgVXNlIGx2bWV0YWQgdG8gY2FjaGUgbWV0YWRhdGEgYW5kIHJlZHVjZSBkaXNrIHNjYW5uaW5nLgorCSMgV2hlbiBlbmFibGVkIChhbmQgcnVubmluZyksIGx2bWV0YWQgcHJvdmlkZXMgTFZNIGNvbW1hbmRzIHdpdGggVkcKKwkjIG1ldGFkYXRhIGFuZCBQViBzdGF0ZS4gTFZNIGNvbW1hbmRzIHRoZW4gYXZvaWQgcmVhZGluZyB0aGlzCisJIyBpbmZvcm1hdGlvbiBmcm9tIGRpc2tzIHdoaWNoIGNhbiBiZSBzbG93LiBXaGVuIGRpc2FibGVkIChvciBub3QKKwkjIHJ1bm5pbmcpLCBMVk0gY29tbWFuZHMgZmFsbCBiYWNrIHRvIHNjYW5uaW5nIGRpc2tzIHRvIG9idGFpbiBWRworCSMgbWV0YWRhdGEuIGx2bWV0YWQgaXMga2VwdCB1cGRhdGVkIHZpYSB1ZGV2IHJ1bGVzIHdoaWNoIG11c3QgYmUgc2V0CisJIyB1cCBmb3IgTFZNIHRvIHdvcmsgY29ycmVjdGx5LiAoVGhlIHVkZXYgcnVsZXMgc2hvdWxkIGJlIGluc3RhbGxlZAorCSMgYnkgZGVmYXVsdC4pIFdpdGhvdXQgYSBwcm9wZXIgdWRldiBzZXR1cCwgY2hhbmdlcyBpbiB0aGUgc3lzdGVtJ3MKKwkjIGJsb2NrIGRldmljZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgdW5rbm93biB0byBMVk0sIGFuZCBpZ25vcmVkCisJIyB1bnRpbCBhIG1hbnVhbCAncHZzY2FuIC0tY2FjaGUnIGlzIHJ1bi4gSWYgbHZtZXRhZCB3YXMgcnVubmluZworCSMgd2hpbGUgdXNlX2x2bWV0YWQgd2FzIGRpc2FibGVkLCBpdCBtdXN0IGJlIHN0b3BwZWQsIHVzZV9sdm1ldGFkCisJIyBlbmFibGVkLCBhbmQgdGhlbiBzdGFydGVkLiBXaGVuIHVzaW5nIGx2bWV0YWQsIExWIGFjdGl2YXRpb24gaXMKKwkjIHN3aXRjaGVkIHRvIGFuIGF1dG9tYXRpYywgZXZlbnQtYmFzZWQgbW9kZS4gSW4gdGhpcyBtb2RlLCBMVnMgYXJlCisJIyBhY3RpdmF0ZWQgYmFzZWQgb24gaW5jb21pbmcgdWRldiBldmVudHMgdGhhdCBpbmZvcm0gbHZtZXRhZCB3aGVuCisJIyBQVnMgYXBwZWFyIG9uIHRoZSBzeXN0ZW0uIFdoZW4gYSBWRyBpcyBjb21wbGV0ZSAoYWxsIFBWcyBwcmVzZW50KSwKKwkjIGl0IGlzIGF1dG8tYWN0aXZhdGVkLiBUaGUgYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0IHNldHRpbmcKKwkjIGNvbnRyb2xzIHdoaWNoIExWcyBhcmUgYXV0by1hY3RpdmF0ZWQgKGFsbCBieSBkZWZhdWx0LikKKwkjIFdoZW4gbHZtZXRhZCBpcyB1cGRhdGVkIChhdXRvbWF0aWNhbGx5IGJ5IHVkZXYgZXZlbnRzLCBvciBkaXJlY3RseQorCSMgYnkgcHZzY2FuIC0tY2FjaGUpLCBkZXZpY2VzL2ZpbHRlciBpcyBpZ25vcmVkIGFuZCBhbGwgZGV2aWNlcyBhcmUKKwkjIHNjYW5uZWQgYnkgZGVmYXVsdC4gbHZtZXRhZCBhbHdheXMga2VlcHMgdW5maWx0ZXJlZCBpbmZvcm1hdGlvbgorCSMgd2hpY2ggaXMgcHJvdmlkZWQgdG8gTFZNIGNvbW1hbmRzLiBFYWNoIExWTSBjb21tYW5kIHRoZW4gZmlsdGVycworCSMgYmFzZWQgb24gZGV2aWNlcy9maWx0ZXIuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gb3RoZXIsIG5vbi1yZWdleHAsCisJIyBmaWx0ZXJpbmcgc2V0dGluZ3M6IGNvbXBvbmVudCBmaWx0ZXJzIHN1Y2ggYXMgbXVsdGlwYXRoIGFuZCBNRAorCSMgYXJlIGNoZWNrZWQgZHVyaW5nIHB2c2NhbiAtLWNhY2hlLiBUbyBmaWx0ZXIgYSBkZXZpY2UgYW5kIHByZXZlbnQKKwkjIHNjYW5uaW5nIGZyb20gdGhlIExWTSBzeXN0ZW0gZW50aXJlbHksIGluY2x1ZGluZyBsdm1ldGFkLCB1c2UKKwkjIGRldmljZXMvZ2xvYmFsX2ZpbHRlci4KKwl1c2VfbHZtZXRhZCA9IEBERUZBVUxUX1VTRV9MVk1FVEFEQAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvbHZtZXRhZF91cGRhdGVfd2FpdF90aW1lLgorCSMgVGhlIG51bWJlciBvZiBzZWNvbmRzIGEgY29tbWFuZCB3aWxsIHdhaXQgZm9yIGx2bWV0YWQgdXBkYXRlIHRvIGZpbmlzaC4KKwkjIEFmdGVyIHdhaXRpbmcgZm9yIHRoaXMgcGVyaW9kLCBhIGNvbW1hbmQgd2lsbCBub3QgdXNlIGx2bWV0YWQsIGFuZAorCSMgd2lsbCByZXZlcnQgdG8gZGlzayBzY2FubmluZy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZtZXRhZF91cGRhdGVfd2FpdF90aW1lID0gMTAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3VzZV9sdm1sb2NrZC4KKwkjIFVzZSBsdm1sb2NrZCBmb3IgbG9ja2luZyBhbW9uZyBob3N0cyB1c2luZyBMVk0gb24gc2hhcmVkIHN0b3JhZ2UuCisJIyBBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2Qgc3VwcG9ydCBpbiB3aGljaAorCSMgY2FzZSB0aGVyZSBpcyBhbHNvIGx2bWxvY2tkKDgpIG1hbiBwYWdlIGF2YWlsYWJsZSBmb3IgbW9yZQorCSMgaW5mb3JtYXRpb24uCisJdXNlX2x2bWxvY2tkID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvbHZtbG9ja2RfbG9ja19yZXRyaWVzLgorCSMgUmV0cnkgbHZtbG9ja2QgbG9jayByZXF1ZXN0cyB0aGlzIG1hbnkgdGltZXMuCisJIyBBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2Qgc3VwcG9ydAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBsdm1sb2NrZF9sb2NrX3JldHJpZXMgPSAzCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9zYW5sb2NrX2x2X2V4dGVuZC4KKwkjIFNpemUgaW4gTWlCIHRvIGV4dGVuZCB0aGUgaW50ZXJuYWwgTFYgaG9sZGluZyBzYW5sb2NrIGxvY2tzLgorCSMgVGhlIGludGVybmFsIExWIGhvbGRzIGxvY2tzIGZvciBlYWNoIExWIGluIHRoZSBWRywgYW5kIGFmdGVyIGVub3VnaAorCSMgTFZzIGhhdmUgYmVlbiBjcmVhdGVkLCB0aGUgaW50ZXJuYWwgTFYgbmVlZHMgdG8gYmUgZXh0ZW5kZWQuIGx2Y3JlYXRlCisJIyB3aWxsIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIHRoZSBpbnRlcm5hbCBMViB3aGVuIG5lZWRlZCBieSB0aGUgYW1vdW50CisJIyBzcGVjaWZpZWQgaGVyZS4gU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBleHRlbnNpb24KKwkjIGFuZCBjYW4gY2F1c2UgbHZjcmVhdGUgdG8gZmFpbC4gQXBwbGljYWJsZSBvbmx5IGlmIExWTSBpcyBjb21waWxlZAorCSMgd2l0aCBsb2NrZCBzdXBwb3J0CisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHNhbmxvY2tfbHZfZXh0ZW5kID0gMjU2CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC90aGluX2NoZWNrX2V4ZWN1dGFibGUuCisJIyBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aGluX2NoZWNrIGNvbW1hbmQuCisJIyBMVk0gdXNlcyB0aGlzIGNvbW1hbmQgdG8gY2hlY2sgdGhhdCBhIHRoaW4gbWV0YWRhdGEgZGV2aWNlIGlzIGluIGEKKwkjIHVzYWJsZSBzdGF0ZS4gV2hlbiBhIHRoaW4gcG9vbCBpcyBhY3RpdmF0ZWQgYW5kIGFmdGVyIGl0IGlzCisJIyBkZWFjdGl2YXRlZCwgdGhpcyBjb21tYW5kIGlzIHJ1bi4gQWN0aXZhdGlvbiB3aWxsIG9ubHkgcHJvY2VlZCBpZgorCSMgdGhlIGNvbW1hbmQgaGFzIGFuIGV4aXQgc3RhdHVzIG9mIDAuIFNldCB0byAiIiB0byBza2lwIHRoaXMgY2hlY2suCisJIyAoTm90IHJlY29tbWVuZGVkLikgQWxzbyBzZWUgdGhpbl9jaGVja19vcHRpb25zLgorCSMgKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKQorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB0aGluX2NoZWNrX2V4ZWN1dGFibGUgPSAiQFRISU5fQ0hFQ0tfQ01EQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3RoaW5fZHVtcF9leGVjdXRhYmxlLgorCSMgVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhpbl9kdW1wIGNvbW1hbmQuCisJIyBMVk0gdXNlcyB0aGlzIGNvbW1hbmQgdG8gZHVtcCB0aGluIHBvb2wgbWV0YWRhdGEuCisJIyAoU2VlIHBhY2thZ2UgZGV2aWNlLW1hcHBlci1wZXJzaXN0ZW50LWRhdGEgb3IgdGhpbi1wcm92aXNpb25pbmctdG9vbHMpCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHRoaW5fZHVtcF9leGVjdXRhYmxlID0gIkBUSElOX0RVTVBfQ01EQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3RoaW5fcmVwYWlyX2V4ZWN1dGFibGUuCisJIyBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aGluX3JlcGFpciBjb21tYW5kLgorCSMgTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIHJlcGFpciBhIHRoaW4gbWV0YWRhdGEgZGV2aWNlIGlmIGl0IGlzIGluCisJIyBhbiB1bnVzYWJsZSBzdGF0ZS4gQWxzbyBzZWUgdGhpbl9yZXBhaXJfb3B0aW9ucy4KKwkjIChTZWUgcGFja2FnZSBkZXZpY2UtbWFwcGVyLXBlcnNpc3RlbnQtZGF0YSBvciB0aGluLXByb3Zpc2lvbmluZy10b29scykKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGhpbl9yZXBhaXJfZXhlY3V0YWJsZSA9ICJAVEhJTl9SRVBBSVJfQ01EQCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3RoaW5fY2hlY2tfb3B0aW9ucy4KKwkjIExpc3Qgb2Ygb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHRoaW5fY2hlY2sgY29tbWFuZC4KKwkjIFdpdGggdGhpbl9jaGVjayB2ZXJzaW9uIDIuMSBvciBuZXdlciB5b3UgY2FuIGFkZCB0aGUgb3B0aW9uCisJIyAtLWlnbm9yZS1ub24tZmF0YWwtZXJyb3JzIHRvIGxldCBpdCBwYXNzIHRocm91Z2ggaWdub3JhYmxlIGVycm9ycworCSMgYW5kIGZpeCB0aGVtIGxhdGVyLiBXaXRoIHRoaW5fY2hlY2sgdmVyc2lvbiAzLjIgb3IgbmV3ZXIgeW91IHNob3VsZAorCSMgaW5jbHVkZSB0aGUgb3B0aW9uIC0tY2xlYXItbmVlZHMtY2hlY2stZmxhZy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGhpbl9jaGVja19vcHRpb25zID0gWyAiLXEiLCAiLS1jbGVhci1uZWVkcy1jaGVjay1mbGFnIiBdCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC90aGluX3JlcGFpcl9vcHRpb25zLgorCSMgTGlzdCBvZiBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGhpbl9yZXBhaXIgY29tbWFuZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGhpbl9yZXBhaXJfb3B0aW9ucyA9IFsgIiIgXQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcy4KKwkjIEZlYXR1cmVzIHRvIG5vdCB1c2UgaW4gdGhlIHRoaW4gZHJpdmVyLgorCSMgVGhpcyBjYW4gYmUgaGVscGZ1bCBmb3IgdGVzdGluZywgb3IgdG8gYXZvaWQgdXNpbmcgYSBmZWF0dXJlIHRoYXQgaXMKKwkjIGNhdXNpbmcgcHJvYmxlbXMuIEZlYXR1cmVzIGluY2x1ZGU6IGJsb2NrX3NpemUsIGRpc2NhcmRzLAorCSMgZGlzY2FyZHNfbm9uX3Bvd2VyXzIsIGV4dGVybmFsX29yaWdpbiwgbWV0YWRhdGFfcmVzaXplLAorCSMgZXh0ZXJuYWxfb3JpZ2luX2V4dGVuZCwgZXJyb3JfaWZfbm9fc3BhY2UuCisJIyAKKwkjIEV4YW1wbGUKKwkjIHRoaW5fZGlzYWJsZWRfZmVhdHVyZXMgPSBbICJkaXNjYXJkcyIsICJibG9ja19zaXplIiBdCisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2NhY2hlX2Rpc2FibGVkX2ZlYXR1cmVzLgorCSMgRmVhdHVyZXMgdG8gbm90IHVzZSBpbiB0aGUgY2FjaGUgZHJpdmVyLgorCSMgVGhpcyBjYW4gYmUgaGVscGZ1bCBmb3IgdGVzdGluZywgb3IgdG8gYXZvaWQgdXNpbmcgYSBmZWF0dXJlIHRoYXQgaXMKKwkjIGNhdXNpbmcgcHJvYmxlbXMuIEZlYXR1cmVzIGluY2x1ZGU6IHBvbGljeV9tcSwgcG9saWN5X3NtcS4KKwkjIAorCSMgRXhhbXBsZQorCSMgY2FjaGVfZGlzYWJsZWRfZmVhdHVyZXMgPSBbICJwb2xpY3lfc21xIiBdCisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL2NhY2hlX2NoZWNrX2V4ZWN1dGFibGUuCisJIyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBjYWNoZV9jaGVjayBjb21tYW5kLgorCSMgTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIGNoZWNrIHRoYXQgYSBjYWNoZSBtZXRhZGF0YSBkZXZpY2UgaXMgaW4gYQorCSMgdXNhYmxlIHN0YXRlLiBXaGVuIGEgY2FjaGVkIExWIGlzIGFjdGl2YXRlZCBhbmQgYWZ0ZXIgaXQgaXMKKwkjIGRlYWN0aXZhdGVkLCB0aGlzIGNvbW1hbmQgaXMgcnVuLiBBY3RpdmF0aW9uIHdpbGwgb25seSBwcm9jZWVkIGlmIHRoZQorCSMgY29tbWFuZCBoYXMgYW4gZXhpdCBzdGF0dXMgb2YgMC4gU2V0IHRvICIiIHRvIHNraXAgdGhpcyBjaGVjay4KKwkjIChOb3QgcmVjb21tZW5kZWQuKSBBbHNvIHNlZSBjYWNoZV9jaGVja19vcHRpb25zLgorCSMgKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKQorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBjYWNoZV9jaGVja19leGVjdXRhYmxlID0gIkBDQUNIRV9DSEVDS19DTURAIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvY2FjaGVfZHVtcF9leGVjdXRhYmxlLgorCSMgVGhlIGZ1bGwgcGF0aCB0byB0aGUgY2FjaGVfZHVtcCBjb21tYW5kLgorCSMgTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIGR1bXAgY2FjaGUgcG9vbCBtZXRhZGF0YS4KKwkjIChTZWUgcGFja2FnZSBkZXZpY2UtbWFwcGVyLXBlcnNpc3RlbnQtZGF0YSBvciB0aGluLXByb3Zpc2lvbmluZy10b29scykKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY2FjaGVfZHVtcF9leGVjdXRhYmxlID0gIkBDQUNIRV9EVU1QX0NNREAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9jYWNoZV9yZXBhaXJfZXhlY3V0YWJsZS4KKwkjIFRoZSBmdWxsIHBhdGggdG8gdGhlIGNhY2hlX3JlcGFpciBjb21tYW5kLgorCSMgTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIHJlcGFpciBhIGNhY2hlIG1ldGFkYXRhIGRldmljZSBpZiBpdCBpcyBpbgorCSMgYW4gdW51c2FibGUgc3RhdGUuIEFsc28gc2VlIGNhY2hlX3JlcGFpcl9vcHRpb25zLgorCSMgKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKQorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBjYWNoZV9yZXBhaXJfZXhlY3V0YWJsZSA9ICJAQ0FDSEVfUkVQQUlSX0NNREAiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9jYWNoZV9jaGVja19vcHRpb25zLgorCSMgTGlzdCBvZiBvcHRpb25zIHBhc3NlZCB0byB0aGUgY2FjaGVfY2hlY2sgY29tbWFuZC4KKwkjIFdpdGggY2FjaGVfY2hlY2sgdmVyc2lvbiA1LjAgb3IgbmV3ZXIgeW91IHNob3VsZCBpbmNsdWRlIHRoZSBvcHRpb24KKwkjIC0tY2xlYXItbmVlZHMtY2hlY2stZmxhZy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY2FjaGVfY2hlY2tfb3B0aW9ucyA9IFsgIi1xIiwgIi0tY2xlYXItbmVlZHMtY2hlY2stZmxhZyIgXQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBnbG9iYWwvY2FjaGVfcmVwYWlyX29wdGlvbnMuCisJIyBMaXN0IG9mIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBjYWNoZV9yZXBhaXIgY29tbWFuZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY2FjaGVfcmVwYWlyX29wdGlvbnMgPSBbICIiIF0KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UuCisJIyBUaGUgbWV0aG9kIExWTSB1c2VzIHRvIHNldCB0aGUgbG9jYWwgc3lzdGVtIElELgorCSMgVm9sdW1lIEdyb3VwcyBjYW4gYWxzbyBiZSBnaXZlbiBhIHN5c3RlbSBJRCAoYnkgdmdjcmVhdGUsIHZnY2hhbmdlLAorCSMgb3IgdmdpbXBvcnQuKSBBIFZHIG9uIHNoYXJlZCBzdG9yYWdlIGRldmljZXMgaXMgYWNjZXNzaWJsZSBvbmx5IHRvCisJIyB0aGUgaG9zdCB3aXRoIGEgbWF0Y2hpbmcgc3lzdGVtIElELiBTZWUgJ21hbiBsdm1zeXN0ZW1pZCcgZm9yCisJIyBpbmZvcm1hdGlvbiBvbiBsaW1pdGF0aW9ucyBhbmQgY29ycmVjdCB1c2FnZS4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBub25lCisJIyAgICAgVGhlIGhvc3QgaGFzIG5vIHN5c3RlbSBJRC4KKwkjICAgbHZtbG9jYWwKKwkjICAgICBPYnRhaW4gdGhlIHN5c3RlbSBJRCBmcm9tIHRoZSBzeXN0ZW1faWQgc2V0dGluZyBpbiB0aGUgJ2xvY2FsJworCSMgICAgIHNlY3Rpb24gb2YgYW4gbHZtIGNvbmZpZ3VyYXRpb24gZmlsZSwgZS5nLiBsdm1sb2NhbC5jb25mLgorCSMgICB1bmFtZQorCSMgICAgIFNldCB0aGUgc3lzdGVtIElEIGZyb20gdGhlIGhvc3RuYW1lICh1bmFtZSkgb2YgdGhlIHN5c3RlbS4KKwkjICAgICBTeXN0ZW0gSURzIGJlZ2lubmluZyBsb2NhbGhvc3QgYXJlIG5vdCBwZXJtaXR0ZWQuCisJIyAgIG1hY2hpbmVpZAorCSMgICAgIFVzZSB0aGUgY29udGVudHMgb2YgdGhlIG1hY2hpbmUtaWQgZmlsZSB0byBzZXQgdGhlIHN5c3RlbSBJRC4KKwkjICAgICBTb21lIHN5c3RlbXMgY3JlYXRlIHRoaXMgZmlsZSBhdCBpbnN0YWxsYXRpb24gdGltZS4KKwkjICAgICBTZWUgJ21hbiBtYWNoaW5lLWlkJyBhbmQgZ2xvYmFsL2V0Yy4KKwkjICAgZmlsZQorCSMgICAgIFVzZSB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIChzeXN0ZW1faWRfZmlsZSkgdG8gc2V0IHRoZQorCSMgICAgIHN5c3RlbSBJRC4KKwkjIAorCXN5c3RlbV9pZF9zb3VyY2UgPSAibm9uZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZ2xvYmFsL3N5c3RlbV9pZF9maWxlLgorCSMgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIGEgc3lzdGVtIElELgorCSMgVGhpcyBpcyB1c2VkIHdoZW4gc3lzdGVtX2lkX3NvdXJjZSBpcyBzZXQgdG8gJ2ZpbGUnLgorCSMgQ29tbWVudHMgc3RhcnRpbmcgd2l0aCB0aGUgY2hhcmFjdGVyICMgYXJlIGlnbm9yZWQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC91c2VfbHZtcG9sbGQuCisJIyBVc2UgbHZtcG9sbGQgdG8gc3VwZXJ2aXNlIGxvbmcgcnVubmluZyBMVk0gY29tbWFuZHMuCisJIyBXaGVuIGVuYWJsZWQsIGNvbnRyb2wgb2YgbG9uZyBydW5uaW5nIExWTSBjb21tYW5kcyBpcyB0cmFuc2ZlcnJlZAorCSMgZnJvbSB0aGUgb3JpZ2luYWwgTFZNIGNvbW1hbmQgdG8gdGhlIGx2bXBvbGxkIGRhZW1vbi4gVGhpcyBhbGxvd3MKKwkjIHRoZSBvcGVyYXRpb24gdG8gY29udGludWUgaW5kZXBlbmRlbnQgb2YgdGhlIG9yaWdpbmFsIExWTSBjb21tYW5kLgorCSMgQWZ0ZXIgbHZtcG9sbGQgdGFrZXMgb3ZlciwgdGhlIExWTSBjb21tYW5kIGRpc3BsYXlzIHRoZSBwcm9ncmVzcworCSMgb2YgdGhlIG9uZ29pbmcgb3BlcmF0aW9uLiBsdm1wb2xsZCBpdHNlbGYgcnVucyBMVk0gY29tbWFuZHMgdG8KKwkjIG1hbmFnZSB0aGUgcHJvZ3Jlc3Mgb2Ygb25nb2luZyBvcGVyYXRpb25zLiBsdm1wb2xsZCBjYW4gYmUgdXNlZCBhcworCSMgYSBuYXRpdmUgc3lzdGVtZCBzZXJ2aWNlLCB3aGljaCBhbGxvd3MgaXQgdG8gYmUgc3RhcnRlZCBvbiBkZW1hbmQsCisJIyBhbmQgdG8gdXNlIGl0cyBvd24gY29udHJvbCBncm91cC4gV2hlbiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCwgTFZNCisJIyBjb21tYW5kcyB3aWxsIHN1cGVydmlzZSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9ucyBieSBmb3JraW5nIHRoZW1zZWx2ZXMuCisJIyBBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbHZtcG9sbGQgc3VwcG9ydC4KKwl1c2VfbHZtcG9sbGQgPSBAREVGQVVMVF9VU0VfTFZNUE9MTERACisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGdsb2JhbC9ub3RpZnlfZGJ1cy4KKwkjIEVuYWJsZSBELUJ1cyBub3RpZmljYXRpb24gZnJvbSBMVk0gY29tbWFuZHMuCisJIyBXaGVuIGVuYWJsZWQsIGFuIExWTSBjb21tYW5kIHRoYXQgY2hhbmdlcyBQVnMsIGNoYW5nZXMgVkcgbWV0YWRhdGEsCisJIyBvciBjaGFuZ2VzIHRoZSBhY3RpdmF0aW9uIHN0YXRlIG9mIGFuIExWIHdpbGwgc2VuZCBhIG5vdGlmaWNhdGlvbi4KKwlub3RpZnlfZGJ1cyA9IDEKK30KKworIyBDb25maWd1cmF0aW9uIHNlY3Rpb24gYWN0aXZhdGlvbi4KK2FjdGl2YXRpb24geworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL2NoZWNrcy4KKwkjIFBlcmZvcm0gaW50ZXJuYWwgY2hlY2tzIG9mIGxpYmRldm1hcHBlciBvcGVyYXRpb25zLgorCSMgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHJvYmxlbXMgd2l0aCBhY3RpdmF0aW9uLiBTb21lIG9mIHRoZSBjaGVja3MgbWF5CisJIyBiZSBleHBlbnNpdmUsIHNvIGl0J3MgYmVzdCB0byB1c2UgdGhpcyBvbmx5IHdoZW4gdGhlcmUgc2VlbXMgdG8gYmUgYQorCSMgcHJvYmxlbS4KKwljaGVja3MgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vdWRldl9zeW5jLgorCSMgVXNlIHVkZXYgbm90aWZpY2F0aW9ucyB0byBzeW5jaHJvbml6ZSB1ZGV2IGFuZCBMVk0uCisJIyBUaGUgLS1ub2RldnN5bmMgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuCisJIyBXaGVuIGRpc2FibGVkLCBMVk0gY29tbWFuZHMgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9ucyBmcm9tCisJIyB1ZGV2LCBidXQgY29udGludWUgaXJyZXNwZWN0aXZlIG9mIGFueSBwb3NzaWJsZSB1ZGV2IHByb2Nlc3NpbmcgaW4KKwkjIHRoZSBiYWNrZ3JvdW5kLiBPbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcgb3IgaGFzIHJ1bGVzCisJIyB0aGF0IGlnbm9yZSB0aGUgZGV2aWNlcyBMVk0gY3JlYXRlcy4gSWYgZW5hYmxlZCB3aGVuIHVkZXYgaXMgbm90CisJIyBydW5uaW5nLCBhbmQgTFZNIHByb2Nlc3NlcyBhcmUgd2FpdGluZyBmb3IgdWRldiwgcnVuIHRoZSBjb21tYW5kCisJIyAnZG1zZXR1cCB1ZGV2Y29tcGxldGVfYWxsJyB0byB3YWtlIHRoZW0gdXAuCisJdWRldl9zeW5jID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3VkZXZfcnVsZXMuCisJIyBVc2UgdWRldiBydWxlcyB0byBtYW5hZ2UgTFYgZGV2aWNlIG5vZGVzIGFuZCBzeW1saW5rcy4KKwkjIFdoZW4gZGlzYWJsZWQsIExWTSB3aWxsIG1hbmFnZSB0aGUgZGV2aWNlIG5vZGVzIGFuZCBzeW1saW5rcyBmb3IKKwkjIGFjdGl2ZSBMVnMgaXRzZWxmLiBNYW51YWwgaW50ZXJ2ZW50aW9uIG1heSBiZSByZXF1aXJlZCBpZiB0aGlzCisJIyBzZXR0aW5nIGlzIGNoYW5nZWQgd2hpbGUgTFZzIGFyZSBhY3RpdmUuCisJdWRldl9ydWxlcyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi92ZXJpZnlfdWRldl9vcGVyYXRpb25zLgorCSMgVXNlIGV4dHJhIGNoZWNrcyBpbiBMVk0gdG8gdmVyaWZ5IHVkZXYgb3BlcmF0aW9ucy4KKwkjIFRoaXMgZW5hYmxlcyBhZGRpdGlvbmFsIGNoZWNrcyAoYW5kIGlmIG5lY2Vzc2FyeSwgcmVwYWlycykgb24gZW50cmllcworCSMgaW4gdGhlIGRldmljZSBkaXJlY3RvcnkgYWZ0ZXIgdWRldiBoYXMgY29tcGxldGVkIHByb2Nlc3NpbmcgaXRzCisJIyBldmVudHMuIFVzZWZ1bCBmb3IgZGlhZ25vc2luZyBwcm9ibGVtcyB3aXRoIExWTS91ZGV2IGludGVyYWN0aW9ucy4KKwl2ZXJpZnlfdWRldl9vcGVyYXRpb25zID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3JldHJ5X2RlYWN0aXZhdGlvbi4KKwkjIFJldHJ5IGZhaWxlZCBMViBkZWFjdGl2YXRpb24uCisJIyBJZiBMViBkZWFjdGl2YXRpb24gZmFpbHMsIExWTSB3aWxsIHJldHJ5IGZvciBhIGZldyBzZWNvbmRzIGJlZm9yZQorCSMgZmFpbGluZy4gVGhpcyBtYXkgaGFwcGVuIGJlY2F1c2UgYSBwcm9jZXNzIHJ1biBmcm9tIGEgcXVpY2sgdWRldiBydWxlCisJIyB0ZW1wb3JhcmlseSBvcGVuZWQgdGhlIGRldmljZS4KKwlyZXRyeV9kZWFjdGl2YXRpb24gPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vbWlzc2luZ19zdHJpcGVfZmlsbGVyLgorCSMgTWV0aG9kIHRvIGZpbGwgbWlzc2luZyBzdHJpcGVzIHdoZW4gYWN0aXZhdGluZyBhbiBpbmNvbXBsZXRlIExWLgorCSMgVXNpbmcgJ2Vycm9yJyB3aWxsIG1ha2UgaW5hY2Nlc3NpYmxlIHBhcnRzIG9mIHRoZSBkZXZpY2UgcmV0dXJuIEkvTworCSMgZXJyb3JzIG9uIGFjY2Vzcy4gWW91IGNhbiBpbnN0ZWFkIHVzZSBhIGRldmljZSBwYXRoLCBpbiB3aGljaCBjYXNlLAorCSMgdGhhdCBkZXZpY2Ugd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIG1pc3Npbmcgc3RyaXBlcy4gVXNpbmcgYW55dGhpbmcKKwkjIG90aGVyIHRoYW4gJ2Vycm9yJyB3aXRoIG1pcnJvcmVkIG9yIHNuYXBzaG90dGVkIHZvbHVtZXMgaXMgbGlrZWx5IHRvCisJIyByZXN1bHQgaW4gZGF0YSBjb3JydXB0aW9uLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwltaXNzaW5nX3N0cmlwZV9maWxsZXIgPSAiZXJyb3IiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vdXNlX2xpbmVhcl90YXJnZXQuCisJIyBVc2UgdGhlIGxpbmVhciB0YXJnZXQgdG8gb3B0aW1pemUgc2luZ2xlIHN0cmlwZSBMVnMuCisJIyBXaGVuIGRpc2FibGVkLCB0aGUgc3RyaXBlZCB0YXJnZXQgaXMgdXNlZC4gVGhlIGxpbmVhciB0YXJnZXQgaXMgYW4KKwkjIG9wdGltaXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpcGVkIHRhcmdldCB0aGF0IG9ubHkgaGFuZGxlcyBhIHNpbmdsZQorCSMgc3RyaXBlLgorCXVzZV9saW5lYXJfdGFyZ2V0ID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3Jlc2VydmVkX3N0YWNrLgorCSMgU3RhY2sgc2l6ZSBpbiBLaUIgdG8gcmVzZXJ2ZSBmb3IgdXNlIHdoaWxlIGRldmljZXMgYXJlIHN1c3BlbmRlZC4KKwkjIEluc3VmZmljZW50IHJlc2VydmUgcmlza3MgSS9PIGRlYWRsb2NrIGR1cmluZyBkZXZpY2Ugc3VzcGVuc2lvbi4KKwlyZXNlcnZlZF9zdGFjayA9IDY0CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vcmVzZXJ2ZWRfbWVtb3J5LgorCSMgTWVtb3J5IHNpemUgaW4gS2lCIHRvIHJlc2VydmUgZm9yIHVzZSB3aGlsZSBkZXZpY2VzIGFyZSBzdXNwZW5kZWQuCisJIyBJbnN1ZmZpY2VudCByZXNlcnZlIHJpc2tzIEkvTyBkZWFkbG9jayBkdXJpbmcgZGV2aWNlIHN1c3BlbnNpb24uCisJcmVzZXJ2ZWRfbWVtb3J5ID0gODE5MgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3Byb2Nlc3NfcHJpb3JpdHkuCisJIyBOaWNlIHZhbHVlIHVzZWQgd2hpbGUgZGV2aWNlcyBhcmUgc3VzcGVuZGVkLgorCSMgVXNlIGEgaGlnaCBwcmlvcml0eSBzbyB0aGF0IExWcyBhcmUgc3VzcGVuZGVkCisJIyBmb3IgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIHRpbWUuCisJcHJvY2Vzc19wcmlvcml0eSA9IC0xOAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3ZvbHVtZV9saXN0LgorCSMgT25seSBMVnMgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0IGFyZSBhY3RpdmF0ZWQuCisJIyBJZiB0aGlzIGxpc3QgaXMgZGVmaW5lZCwgYW4gTFYgaXMgb25seSBhY3RpdmF0ZWQgaWYgaXQgbWF0Y2hlcyBhbgorCSMgZW50cnkgaW4gdGhpcyBsaXN0LiBJZiB0aGlzIGxpc3QgaXMgdW5kZWZpbmVkLCBpdCBpbXBvc2VzIG5vIGxpbWl0cworCSMgb24gTFYgYWN0aXZhdGlvbiAoYWxsIGFyZSBhbGxvd2VkKS4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICB2Z25hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBpcyBtYXRjaGVkIGV4YWN0bHkgYW5kIHNlbGVjdHMgYWxsIExWcyBpbiB0aGUgVkcuCisJIyAgIHZnbmFtZS9sdm5hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBhbmQgTFYgbmFtZSBhcmUgbWF0Y2hlZCBleGFjdGx5IGFuZCBzZWxlY3RzIHRoZSBMVi4KKwkjICAgQHRhZworCSMgICAgIFNlbGVjdHMgYW4gTFYgaWYgdGhlIHNwZWNpZmllZCB0YWcgbWF0Y2hlcyBhIHRhZyBzZXQgb24gdGhlIExWCisJIyAgICAgb3IgVkcuCisJIyAgIEAqCisJIyAgICAgU2VsZWN0cyBhbiBMViBpZiBhIHRhZyBkZWZpbmVkIG9uIHRoZSBob3N0IGlzIGFsc28gc2V0IG9uIHRoZSBMVgorCSMgICAgIG9yIFZHLiBTZWUgdGFncy9ob3N0dGFncy4gSWYgYW55IGhvc3QgdGFncyBleGlzdCBidXQgdm9sdW1lX2xpc3QKKwkjICAgICBpcyBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IHNpbmdsZS1lbnRyeSBsaXN0IGNvbnRhaW5pbmcgJ0AqJworCSMgICAgIGlzIGFzc3VtZWQuCisJIyAKKwkjIEV4YW1wbGUKKwkjIHZvbHVtZV9saXN0ID0gWyAidmcxIiwgInZnMi9sdm9sMSIsICJAdGFnMSIsICJAKiIgXQorCSMgCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0LgorCSMgT25seSBMVnMgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0IGFyZSBhdXRvLWFjdGl2YXRlZC4KKwkjIFRoaXMgbGlzdCB3b3JrcyBsaWtlIHZvbHVtZV9saXN0LCBidXQgaXQgaXMgdXNlZCBvbmx5IGJ5CisJIyBhdXRvLWFjdGl2YXRpb24gY29tbWFuZHMuIEl0IGRvZXMgbm90IGFwcGx5IHRvIGRpcmVjdCBhY3RpdmF0aW9uCisJIyBjb21tYW5kcy4gSWYgdGhpcyBsaXN0IGlzIGRlZmluZWQsIGFuIExWIGlzIG9ubHkgYXV0by1hY3RpdmF0ZWQKKwkjIGlmIGl0IG1hdGNoZXMgYW4gZW50cnkgaW4gdGhpcyBsaXN0LiBJZiB0aGlzIGxpc3QgaXMgdW5kZWZpbmVkLCBpdAorCSMgaW1wb3NlcyBubyBsaW1pdHMgb24gTFYgYXV0by1hY3RpdmF0aW9uIChhbGwgYXJlIGFsbG93ZWQuKSBJZiB0aGlzCisJIyBsaXN0IGlzIGRlZmluZWQgYW5kIGVtcHR5LCBpLmUuICJbXSIsIHRoZW4gbm8gTFZzIGFyZSBzZWxlY3RlZCBmb3IKKwkjIGF1dG8tYWN0aXZhdGlvbi4gQW4gTFYgdGhhdCBpcyBzZWxlY3RlZCBieSB0aGlzIGxpc3QgZm9yCisJIyBhdXRvLWFjdGl2YXRpb24sIG11c3QgYWxzbyBiZSBzZWxlY3RlZCBieSB2b2x1bWVfbGlzdCAoaWYgZGVmaW5lZCkKKwkjIGJlZm9yZSBpdCBpcyBhY3RpdmF0ZWQuIEF1dG8tYWN0aXZhdGlvbiBpcyBhbiBhY3RpdmF0aW9uIGNvbW1hbmQgdGhhdAorCSMgaW5jbHVkZXMgdGhlICdhJyBhcmd1bWVudDogLS1hY3RpdmF0ZSBheSBvciAtYSBheS4gVGhlICdhJyAoYXV0bykKKwkjIGFyZ3VtZW50IGZvciBhdXRvLWFjdGl2YXRpb24gaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBhY3RpdmF0aW9uCisJIyBjb21tYW5kcyB0aGF0IGFyZSBydW4gYXV0b21hdGljYWxseSBieSB0aGUgc3lzdGVtLCBhcyBvcHBvc2VkIHRvIExWTQorCSMgY29tbWFuZHMgcnVuIGRpcmVjdGx5IGJ5IGEgdXNlci4gQSB1c2VyIG1heSBhbHNvIHVzZSB0aGUgJ2EnIGZsYWcKKwkjIGRpcmVjdGx5IHRvIHBlcmZvcm0gYXV0by1hY3RpdmF0aW9uLiBBbHNvIHNlZSBwdnNjYW4oOCkgZm9yIG1vcmUKKwkjIGluZm9ybWF0aW9uIGFib3V0IGF1dG8tYWN0aXZhdGlvbi4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICB2Z25hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBpcyBtYXRjaGVkIGV4YWN0bHkgYW5kIHNlbGVjdHMgYWxsIExWcyBpbiB0aGUgVkcuCisJIyAgIHZnbmFtZS9sdm5hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBhbmQgTFYgbmFtZSBhcmUgbWF0Y2hlZCBleGFjdGx5IGFuZCBzZWxlY3RzIHRoZSBMVi4KKwkjICAgQHRhZworCSMgICAgIFNlbGVjdHMgYW4gTFYgaWYgdGhlIHNwZWNpZmllZCB0YWcgbWF0Y2hlcyBhIHRhZyBzZXQgb24gdGhlIExWCisJIyAgICAgb3IgVkcuCisJIyAgIEAqCisJIyAgICAgU2VsZWN0cyBhbiBMViBpZiBhIHRhZyBkZWZpbmVkIG9uIHRoZSBob3N0IGlzIGFsc28gc2V0IG9uIHRoZSBMVgorCSMgICAgIG9yIFZHLiBTZWUgdGFncy9ob3N0dGFncy4gSWYgYW55IGhvc3QgdGFncyBleGlzdCBidXQgdm9sdW1lX2xpc3QKKwkjICAgICBpcyBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IHNpbmdsZS1lbnRyeSBsaXN0IGNvbnRhaW5pbmcgJ0AqJworCSMgICAgIGlzIGFzc3VtZWQuCisJIyAKKwkjIEV4YW1wbGUKKwkjIGF1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdCA9IFsgInZnMSIsICJ2ZzIvbHZvbDEiLCAiQHRhZzEiLCAiQCoiIF0KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3JlYWRfb25seV92b2x1bWVfbGlzdC4KKwkjIExWcyBpbiB0aGlzIGxpc3QgYXJlIGFjdGl2YXRlZCBpbiByZWFkLW9ubHkgbW9kZS4KKwkjIElmIHRoaXMgbGlzdCBpcyBkZWZpbmVkLCBlYWNoIExWIHRoYXQgaXMgdG8gYmUgYWN0aXZhdGVkIGlzIGNoZWNrZWQKKwkjIGFnYWluc3QgdGhpcyBsaXN0LCBhbmQgaWYgaXQgbWF0Y2hlcywgaXQgaXMgYWN0aXZhdGVkIGluIHJlYWQtb25seQorCSMgbW9kZS4gVGhpcyBvdmVycmlkZXMgdGhlIHBlcm1pc3Npb24gc2V0dGluZyBzdG9yZWQgaW4gdGhlIG1ldGFkYXRhLAorCSMgZS5nLiBmcm9tIC0tcGVybWlzc2lvbiBydy4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICB2Z25hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBpcyBtYXRjaGVkIGV4YWN0bHkgYW5kIHNlbGVjdHMgYWxsIExWcyBpbiB0aGUgVkcuCisJIyAgIHZnbmFtZS9sdm5hbWUKKwkjICAgICBUaGUgVkcgbmFtZSBhbmQgTFYgbmFtZSBhcmUgbWF0Y2hlZCBleGFjdGx5IGFuZCBzZWxlY3RzIHRoZSBMVi4KKwkjICAgQHRhZworCSMgICAgIFNlbGVjdHMgYW4gTFYgaWYgdGhlIHNwZWNpZmllZCB0YWcgbWF0Y2hlcyBhIHRhZyBzZXQgb24gdGhlIExWCisJIyAgICAgb3IgVkcuCisJIyAgIEAqCisJIyAgICAgU2VsZWN0cyBhbiBMViBpZiBhIHRhZyBkZWZpbmVkIG9uIHRoZSBob3N0IGlzIGFsc28gc2V0IG9uIHRoZSBMVgorCSMgICAgIG9yIFZHLiBTZWUgdGFncy9ob3N0dGFncy4gSWYgYW55IGhvc3QgdGFncyBleGlzdCBidXQgdm9sdW1lX2xpc3QKKwkjICAgICBpcyBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IHNpbmdsZS1lbnRyeSBsaXN0IGNvbnRhaW5pbmcgJ0AqJworCSMgICAgIGlzIGFzc3VtZWQuCisJIyAKKwkjIEV4YW1wbGUKKwkjIHJlYWRfb25seV92b2x1bWVfbGlzdCA9IFsgInZnMSIsICJ2ZzIvbHZvbDEiLCAiQHRhZzEiLCAiQCoiIF0KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3JhaWRfcmVnaW9uX3NpemUuCisJIyBTaXplIGluIEtpQiBvZiBlYWNoIHJhaWQgb3IgbWlycm9yIHN5bmNocm9uaXphdGlvbiByZWdpb24uCisJIyBGb3IgcmFpZCBvciBtaXJyb3Igc2VnbWVudCB0eXBlcywgdGhpcyBpcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcworCSMgY29waWVkIGF0IG9uY2Ugd2hlbiBpbml0aWFsaXppbmcsIG9yIG1vdmVkIGF0IG9uY2UgYnkgcHZtb3ZlLgorCXJhaWRfcmVnaW9uX3NpemUgPSA1MTIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9lcnJvcl93aGVuX2Z1bGwuCisJIyBSZXR1cm4gZXJyb3JzIGlmIGEgdGhpbiBwb29sIHJ1bnMgb3V0IG9mIHNwYWNlLgorCSMgVGhlIC0tZXJyb3J3aGVuZnVsbCBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy4KKwkjIFdoZW4gZW5hYmxlZCwgd3JpdGVzIHRvIHRoaW4gTFZzIGltbWVkaWF0ZWx5IHJldHVybiBhbiBlcnJvciBpZiB0aGUKKwkjIHRoaW4gcG9vbCBpcyBvdXQgb2YgZGF0YSBzcGFjZS4gV2hlbiBkaXNhYmxlZCwgd3JpdGVzIHRvIHRoaW4gTFZzCisJIyBhcmUgcXVldWVkIGlmIHRoZSB0aGluIHBvb2wgaXMgb3V0IG9mIHNwYWNlLCBhbmQgcHJvY2Vzc2VkIHdoZW4gdGhlCisJIyB0aGluIHBvb2wgZGF0YSBzcGFjZSBpcyBleHRlbmRlZC4gTmV3IHRoaW4gcG9vbHMgYXJlIGFzc2lnbmVkIHRoZQorCSMgYmVoYXZpb3IgZGVmaW5lZCBoZXJlLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBlcnJvcl93aGVuX2Z1bGwgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vcmVhZGFoZWFkLgorCSMgU2V0dGluZyB0byB1c2Ugd2hlbiB0aGVyZSBpcyBubyByZWFkYWhlYWQgc2V0dGluZyBpbiBtZXRhZGF0YS4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBub25lCisJIyAgICAgRGlzYWJsZSByZWFkYWhlYWQuCisJIyAgIGF1dG8KKwkjICAgICBVc2UgZGVmYXVsdCB2YWx1ZSBjaG9zZW4gYnkga2VybmVsLgorCSMgCisJcmVhZGFoZWFkID0gImF1dG8iCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vcmFpZF9mYXVsdF9wb2xpY3kuCisJIyBEZWZpbmVzIGhvdyBhIGRldmljZSBmYWlsdXJlIGluIGEgUkFJRCBMViBpcyBoYW5kbGVkLgorCSMgVGhpcyBpbmNsdWRlcyBMVnMgdGhhdCBoYXZlIHRoZSBmb2xsb3dpbmcgc2VnbWVudCB0eXBlczoKKwkjIHJhaWQxLCByYWlkNCwgcmFpZDUqLCBhbmQgcmFpZDYqLgorCSMgSWYgYSBkZXZpY2UgaW4gdGhlIExWIGZhaWxzLCB0aGUgcG9saWN5IGRldGVybWluZXMgdGhlIHN0ZXBzCisJIyBwZXJmb3JtZWQgYnkgZG1ldmVudGQgYXV0b21hdGljYWxseSwgYW5kIHRoZSBzdGVwcyBwZXJmb21lZCBieSB0aGUKKwkjIG1hbnVhbCBjb21tYW5kIGx2Y29udmVydCAtLXJlcGFpciAtLXVzZS1wb2xpY2llcy4KKwkjIEF1dG9tYXRpYyBoYW5kbGluZyByZXF1aXJlcyBkbWV2ZW50ZCB0byBiZSBtb25pdG9yaW5nIHRoZSBMVi4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICB3YXJuCisJIyAgICAgVXNlIHRoZSBzeXN0ZW0gbG9nIHRvIHdhcm4gdGhlIHVzZXIgdGhhdCBhIGRldmljZSBpbiB0aGUgUkFJRCBMVgorCSMgICAgIGhhcyBmYWlsZWQuIEl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gcnVuIGx2Y29udmVydCAtLXJlcGFpcgorCSMgICAgIG1hbnVhbGx5IHRvIHJlbW92ZSBvciByZXBsYWNlIHRoZSBmYWlsZWQgZGV2aWNlLiBBcyBsb25nIGFzIHRoZQorCSMgICAgIG51bWJlciBvZiBmYWlsZWQgZGV2aWNlcyBkb2VzIG5vdCBleGNlZWQgdGhlIHJlZHVuZGFuY3kgb2YgdGhlIExWCisJIyAgICAgKDEgZGV2aWNlIGZvciByYWlkNC81LCAyIGZvciByYWlkNiksIHRoZSBMViB3aWxsIHJlbWFpbiB1c2FibGUuCisJIyAgIGFsbG9jYXRlCisJIyAgICAgQXR0ZW1wdCB0byB1c2UgYW55IGV4dHJhIHBoeXNpY2FsIHZvbHVtZXMgaW4gdGhlIFZHIGFzIHNwYXJlcyBhbmQKKwkjICAgICByZXBsYWNlIGZhdWx0eSBkZXZpY2VzLgorCSMgCisJcmFpZF9mYXVsdF9wb2xpY3kgPSAid2FybiIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9taXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5LgorCSMgRGVmaW5lcyBob3cgYSBkZXZpY2UgZmFpbHVyZSBpbiBhICdtaXJyb3InIExWIGlzIGhhbmRsZWQuCisJIyBBbiBMViB3aXRoIHRoZSAnbWlycm9yJyBzZWdtZW50IHR5cGUgaXMgY29tcG9zZWQgb2YgbWlycm9yIGltYWdlcworCSMgKGNvcGllcykgYW5kIGEgbWlycm9yIGxvZy4gQSBkaXNrIGxvZyBlbnN1cmVzIHRoYXQgYSBtaXJyb3IgTFYgZG9lcworCSMgbm90IG5lZWQgdG8gYmUgcmUtc3luY2VkIChhbGwgY29waWVzIG1hZGUgdGhlIHNhbWUpIGV2ZXJ5IHRpbWUgYQorCSMgbWFjaGluZSByZWJvb3RzIG9yIGNyYXNoZXMuIElmIGEgZGV2aWNlIGluIHRoZSBMViBmYWlscywgdGhpcyBwb2xpY3kKKwkjIGRldGVybWluZXMgdGhlIHN0ZXBzIHBlcmZvbWVkIGJ5IGRtZXZlbnRkIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgc3RlcHMKKwkjIHBlcmZvcm1lZCBieSB0aGUgbWFudWFsIGNvbW1hbmQgbHZjb252ZXJ0IC0tcmVwYWlyIC0tdXNlLXBvbGljaWVzLgorCSMgQXV0b21hdGljIGhhbmRsaW5nIHJlcXVpcmVzIGRtZXZlbnRkIHRvIGJlIG1vbml0b3JpbmcgdGhlIExWLgorCSMgCisJIyBBY2NlcHRlZCB2YWx1ZXM6CisJIyAgIHJlbW92ZQorCSMgICAgIFNpbXBseSByZW1vdmUgdGhlIGZhdWx0eSBkZXZpY2UgYW5kIHJ1biB3aXRob3V0IGl0LiBJZiB0aGUgbG9nCisJIyAgICAgZGV2aWNlIGZhaWxzLCB0aGUgbWlycm9yIHdvdWxkIGNvbnZlcnQgdG8gdXNpbmcgYW4gaW4tbWVtb3J5IGxvZy4KKwkjICAgICBUaGlzIG1lYW5zIHRoZSBtaXJyb3Igd2lsbCBub3QgcmVtZW1iZXIgaXRzIHN5bmMgc3RhdHVzIGFjcm9zcworCSMgICAgIGNyYXNoZXMvcmVib290cyBhbmQgdGhlIGVudGlyZSBtaXJyb3Igd2lsbCBiZSByZS1zeW5jZWQuIElmIGEKKwkjICAgICBtaXJyb3IgaW1hZ2UgZmFpbHMsIHRoZSBtaXJyb3Igd2lsbCBjb252ZXJ0IHRvIGEgbm9uLW1pcnJvcmVkCisJIyAgICAgZGV2aWNlIGlmIHRoZXJlIGlzIG9ubHkgb25lIHJlbWFpbmluZyBnb29kIGNvcHkuCisJIyAgIGFsbG9jYXRlCisJIyAgICAgUmVtb3ZlIHRoZSBmYXVsdHkgZGV2aWNlIGFuZCB0cnkgdG8gYWxsb2NhdGUgc3BhY2Ugb24gYSBuZXcKKwkjICAgICBkZXZpY2UgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGZhaWxlZCBkZXZpY2UuIFVzaW5nIHRoaXMKKwkjICAgICBwb2xpY3kgZm9yIHRoZSBsb2cgaXMgZmFzdCBhbmQgbWFpbnRhaW5zIHRoZSBhYmlsaXR5IHRvIHJlbWVtYmVyCisJIyAgICAgc3luYyBzdGF0ZSB0aHJvdWdoIGNyYXNoZXMvcmVib290cy4gVXNpbmcgdGhpcyBwb2xpY3kgZm9yIGEKKwkjICAgICBtaXJyb3IgZGV2aWNlIGlzIHNsb3csIGFzIGl0IHJlcXVpcmVzIHRoZSBtaXJyb3IgdG8gcmVzeW5jaHJvbml6ZQorCSMgICAgIHRoZSBkZXZpY2VzLCBidXQgaXQgd2lsbCBwcmVzZXJ2ZSB0aGUgbWlycm9yIGNoYXJhY3RlcmlzdGljIG9mCisJIyAgICAgdGhlIGRldmljZS4gVGhpcyBwb2xpY3kgYWN0cyBsaWtlICdyZW1vdmUnIGlmIG5vIHN1aXRhYmxlIGRldmljZQorCSMgICAgIGFuZCBzcGFjZSBjYW4gYmUgYWxsb2NhdGVkIGZvciB0aGUgcmVwbGFjZW1lbnQuCisJIyAgIGFsbG9jYXRlX2FueXdoZXJlCisJIyAgICAgTm90IHlldCBpbXBsZW1lbnRlZC4gVXNlZnVsIHRvIHBsYWNlIHRoZSBsb2cgZGV2aWNlIHRlbXBvcmFyaWx5CisJIyAgICAgb24gdGhlIHNhbWUgcGh5c2ljYWwgdm9sdW1lIGFzIG9uZSBvZiB0aGUgbWlycm9yIGltYWdlcy4gVGhpcworCSMgICAgIHBvbGljeSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIG1pcnJvciBkZXZpY2VzIHNpbmNlIGl0IHdvdWxkIGJyZWFrCisJIyAgICAgdGhlIHJlZHVuZGFudCBuYXR1cmUgb2YgdGhlIG1pcnJvci4gVGhpcyBwb2xpY3kgYWN0cyBsaWtlCisJIyAgICAgJ3JlbW92ZScgaWYgbm8gc3VpdGFibGUgZGV2aWNlIGFuZCBzcGFjZSBjYW4gYmUgYWxsb2NhdGVkIGZvciB0aGUKKwkjICAgICByZXBsYWNlbWVudC4KKwkjIAorCW1pcnJvcl9pbWFnZV9mYXVsdF9wb2xpY3kgPSAicmVtb3ZlIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL21pcnJvcl9sb2dfZmF1bHRfcG9saWN5LgorCSMgRGVmaW5lcyBob3cgYSBkZXZpY2UgZmFpbHVyZSBpbiBhICdtaXJyb3InIGxvZyBMViBpcyBoYW5kbGVkLgorCSMgVGhlIG1pcnJvcl9pbWFnZV9mYXVsdF9wb2xpY3kgZGVzY3JpcHRpb24gZm9yIG1pcnJvcmVkIExWcyBhbHNvCisJIyBhcHBsaWVzIHRvIG1pcnJvcmVkIGxvZyBMVnMuCisJbWlycm9yX2xvZ19mYXVsdF9wb2xpY3kgPSAiYWxsb2NhdGUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vc25hcHNob3RfYXV0b2V4dGVuZF90aHJlc2hvbGQuCisJIyBBdXRvLWV4dGVuZCBhIHNuYXBzaG90IHdoZW4gaXRzIHVzYWdlIGV4Y2VlZHMgdGhpcyBwZXJjZW50LgorCSMgU2V0dGluZyB0aGlzIHRvIDEwMCBkaXNhYmxlcyBhdXRvbWF0aWMgZXh0ZW5zaW9uLgorCSMgVGhlIG1pbmltdW0gdmFsdWUgaXMgNTAgKGEgc21hbGxlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIDUwLikKKwkjIEFsc28gc2VlIHNuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudC4KKwkjIEF1dG9tYXRpYyBleHRlbnNpb24gcmVxdWlyZXMgZG1ldmVudGQgdG8gYmUgbW9uaXRvcmluZyB0aGUgTFYuCisJIyAKKwkjIEV4YW1wbGUKKwkjIFVzaW5nIDcwJSBhdXRvZXh0ZW5kIHRocmVzaG9sZCBhbmQgMjAlIGF1dG9leHRlbmQgc2l6ZSwgd2hlbiBhIDFHCisJIyBzbmFwc2hvdCBleGNlZWRzIDcwME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuMkcsIGFuZCB3aGVuIGl0IGV4Y2VlZHMKKwkjIDg0ME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuNDRHOgorCSMgc25hcHNob3RfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSA3MAorCSMgCisJc25hcHNob3RfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSAxMDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9zbmFwc2hvdF9hdXRvZXh0ZW5kX3BlcmNlbnQuCisJIyBBdXRvLWV4dGVuZGluZyBhIHNuYXBzaG90IGFkZHMgdGhpcyBwZXJjZW50IGV4dHJhIHNwYWNlLgorCSMgVGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHNwYWNlIGFkZGVkIHRvIGEgc25hcHNob3QgaXMgdGhpcworCSMgcGVyY2VudCBvZiBpdHMgY3VycmVudCBzaXplLgorCSMgCisJIyBFeGFtcGxlCisJIyBVc2luZyA3MCUgYXV0b2V4dGVuZCB0aHJlc2hvbGQgYW5kIDIwJSBhdXRvZXh0ZW5kIHNpemUsIHdoZW4gYSAxRworCSMgc25hcHNob3QgZXhjZWVkcyA3MDBNLCBpdCBpcyBleHRlbmRlZCB0byAxLjJHLCBhbmQgd2hlbiBpdCBleGNlZWRzCisJIyA4NDBNLCBpdCBpcyBleHRlbmRlZCB0byAxLjQ0RzoKKwkjIHNuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudCA9IDIwCisJIyAKKwlzbmFwc2hvdF9hdXRvZXh0ZW5kX3BlcmNlbnQgPSAyMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG9sZC4KKwkjIEF1dG8tZXh0ZW5kIGEgdGhpbiBwb29sIHdoZW4gaXRzIHVzYWdlIGV4Y2VlZHMgdGhpcyBwZXJjZW50LgorCSMgU2V0dGluZyB0aGlzIHRvIDEwMCBkaXNhYmxlcyBhdXRvbWF0aWMgZXh0ZW5zaW9uLgorCSMgVGhlIG1pbmltdW0gdmFsdWUgaXMgNTAgKGEgc21hbGxlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIDUwLikKKwkjIEFsc28gc2VlIHRoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQuCisJIyBBdXRvbWF0aWMgZXh0ZW5zaW9uIHJlcXVpcmVzIGRtZXZlbnRkIHRvIGJlIG1vbml0b3JpbmcgdGhlIExWLgorCSMgCisJIyBFeGFtcGxlCisJIyBVc2luZyA3MCUgYXV0b2V4dGVuZCB0aHJlc2hvbGQgYW5kIDIwJSBhdXRvZXh0ZW5kIHNpemUsIHdoZW4gYSAxRworCSMgdGhpbiBwb29sIGV4Y2VlZHMgNzAwTSwgaXQgaXMgZXh0ZW5kZWQgdG8gMS4yRywgYW5kIHdoZW4gaXQgZXhjZWVkcworCSMgODQwTSwgaXQgaXMgZXh0ZW5kZWQgdG8gMS40NEc6CisJIyB0aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSA3MAorCSMgCisJdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkID0gMTAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudC4KKwkjIEF1dG8tZXh0ZW5kaW5nIGEgdGhpbiBwb29sIGFkZHMgdGhpcyBwZXJjZW50IGV4dHJhIHNwYWNlLgorCSMgVGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHNwYWNlIGFkZGVkIHRvIGEgdGhpbiBwb29sIGlzIHRoaXMKKwkjIHBlcmNlbnQgb2YgaXRzIGN1cnJlbnQgc2l6ZS4KKwkjIAorCSMgRXhhbXBsZQorCSMgVXNpbmcgNzAlIGF1dG9leHRlbmQgdGhyZXNob2xkIGFuZCAyMCUgYXV0b2V4dGVuZCBzaXplLCB3aGVuIGEgMUcKKwkjIHRoaW4gcG9vbCBleGNlZWRzIDcwME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuMkcsIGFuZCB3aGVuIGl0IGV4Y2VlZHMKKwkjIDg0ME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuNDRHOgorCSMgdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCA9IDIwCisJIyAKKwl0aGluX3Bvb2xfYXV0b2V4dGVuZF9wZXJjZW50ID0gMjAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9tbG9ja19maWx0ZXIuCisJIyBEbyBub3QgbWxvY2sgdGhlc2UgbWVtb3J5IGFyZWFzLgorCSMgV2hpbGUgYWN0aXZhdGluZyBkZXZpY2VzLCBJL08gdG8gZGV2aWNlcyBiZWluZyAocmUpY29uZmlndXJlZCBpcworCSMgc3VzcGVuZGVkLiBBcyBhIHByZWNhdXRpb24gYWdhaW5zdCBkZWFkbG9ja3MsIExWTSBwaW5zIG1lbW9yeSBpdCBpcworCSMgdXNpbmcgc28gaXQgaXMgbm90IHBhZ2VkIG91dCwgYW5kIHdpbGwgbm90IHJlcXVpcmUgSS9PIHRvIHJlcmVhZC4KKwkjIEdyb3VwcyBvZiBwYWdlcyB0aGF0IGFyZSBrbm93biBub3QgdG8gYmUgYWNjZXNzZWQgZHVyaW5nIGFjdGl2YXRpb24KKwkjIGRvIG5vdCBuZWVkIHRvIGJlIHBpbm5lZCBpbnRvIG1lbW9yeS4gRWFjaCBzdHJpbmcgbGlzdGVkIGluIHRoaXMKKwkjIHNldHRpbmcgaXMgY29tcGFyZWQgYWdhaW5zdCBlYWNoIGxpbmUgaW4gL3Byb2Mvc2VsZi9tYXBzLCBhbmQgdGhlCisJIyBwYWdlcyBjb3JyZXNwb25kaW5nIHRvIGxpbmVzIHRoYXQgbWF0Y2ggYXJlIG5vdCBwaW5uZWQuIE9uIHNvbWUKKwkjIHN5c3RlbXMsIGxvY2FsZS1hcmNoaXZlIHdhcyBmb3VuZCB0byBtYWtlIHVwIG92ZXIgODAlIG9mIHRoZSBtZW1vcnkKKwkjIHVzZWQgYnkgdGhlIHByb2Nlc3MuCisJIyAKKwkjIEV4YW1wbGUKKwkjIG1sb2NrX2ZpbHRlciA9IFsgImxvY2FsZS9sb2NhbGUtYXJjaGl2ZSIsICJnY29udi9nY29udi1tb2R1bGVzLmNhY2hlIiBdCisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgYWR2YW5jZWQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vdXNlX21sb2NrYWxsLgorCSMgVXNlIHRoZSBvbGQgYmVoYXZpb3Igb2YgbWxvY2thbGwgdG8gcGluIGFsbCBtZW1vcnkuCisJIyBQcmlvciB0byB2ZXJzaW9uIDIuMDIuNjIsIExWTSB1c2VkIG1sb2NrYWxsKCkgdG8gcGluIHRoZSB3aG9sZQorCSMgcHJvY2VzcydzIG1lbW9yeSB3aGlsZSBhY3RpdmF0aW5nIGRldmljZXMuCisJdXNlX21sb2NrYWxsID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBhY3RpdmF0aW9uL21vbml0b3JpbmcuCisJIyBNb25pdG9yIExWcyB0aGF0IGFyZSBhY3RpdmF0ZWQuCisJIyBUaGUgLS1pZ25vcmVtb25pdG9yaW5nIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLgorCSMgV2hlbiBlbmFibGVkLCBMVk0gd2lsbCBhc2sgZG1ldmVudGQgdG8gbW9uaXRvciBhY3RpdmF0ZWQgTFZzLgorCW1vbml0b3JpbmcgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vcG9sbGluZ19pbnRlcnZhbC4KKwkjIENoZWNrIHB2bW92ZSBvciBsdmNvbnZlcnQgcHJvZ3Jlc3MgYXQgdGhpcyBpbnRlcnZhbCAoc2Vjb25kcykuCisJIyBXaGVuIHB2bW92ZSBvciBsdmNvbnZlcnQgbXVzdCB3YWl0IGZvciB0aGUga2VybmVsIHRvIGZpbmlzaAorCSMgc3luY2hyb25pc2luZyBvciBtZXJnaW5nIGRhdGEsIHRoZXkgY2hlY2sgYW5kIHJlcG9ydCBwcm9ncmVzcyBhdAorCSMgaW50ZXJ2YWxzIG9mIHRoaXMgbnVtYmVyIG9mIHNlY29uZHMuIElmIHRoaXMgaXMgc2V0IHRvIDAgYW5kIHRoZXJlCisJIyBpcyBvbmx5IG9uZSB0aGluZyB0byB3YWl0IGZvciwgdGhlcmUgYXJlIG5vIHByb2dyZXNzIHJlcG9ydHMsIGJ1dAorCSMgdGhlIHByb2Nlc3MgaXMgYXdva2VuIGltbWVkaWF0ZWx5IG9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwlwb2xsaW5nX2ludGVydmFsID0gMTUKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9hdXRvX3NldF9hY3RpdmF0aW9uX3NraXAuCisJIyBTZXQgdGhlIGFjdGl2YXRpb24gc2tpcCBmbGFnIG9uIG5ldyB0aGluIHNuYXBzaG90IExWcy4KKwkjIFRoZSAtLXNldGFjdGl2YXRpb25za2lwIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLgorCSMgQW4gTFYgY2FuIGhhdmUgYSBwZXJzaXN0ZW50ICdhY3RpdmF0aW9uIHNraXAnIGZsYWcuIFRoZSBmbGFnIGNhdXNlcworCSMgdGhlIExWIHRvIGJlIHNraXBwZWQgZHVyaW5nIG5vcm1hbCBhY3RpdmF0aW9uLiBUaGUgbHZjaGFuZ2UvdmdjaGFuZ2UKKwkjIC1LIG9wdGlvbiBpcyByZXF1aXJlZCB0byBhY3RpdmF0ZSBMVnMgdGhhdCBoYXZlIHRoZSBhY3RpdmF0aW9uIHNraXAKKwkjIGZsYWcgc2V0LiBXaGVuIHRoaXMgc2V0dGluZyBpcyBlbmFibGVkLCB0aGUgYWN0aXZhdGlvbiBza2lwIGZsYWcgaXMKKwkjIHNldCBvbiBuZXcgdGhpbiBzbmFwc2hvdCBMVnMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGF1dG9fc2V0X2FjdGl2YXRpb25fc2tpcCA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9hY3RpdmF0aW9uX21vZGUuCisJIyBIb3cgTFZzIHdpdGggbWlzc2luZyBkZXZpY2VzIGFyZSBhY3RpdmF0ZWQuCisJIyBUaGUgLS1hY3RpdmF0aW9ubW9kZSBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy4KKwkjIAorCSMgQWNjZXB0ZWQgdmFsdWVzOgorCSMgICBjb21wbGV0ZQorCSMgICAgIE9ubHkgYWxsb3cgYWN0aXZhdGlvbiBvZiBhbiBMViBpZiBhbGwgb2YgdGhlIFBoeXNpY2FsIFZvbHVtZXMgaXQKKwkjICAgICB1c2VzIGFyZSBwcmVzZW50LiBPdGhlciBQVnMgaW4gdGhlIFZvbHVtZSBHcm91cCBtYXkgYmUgbWlzc2luZy4KKwkjICAgZGVncmFkZWQKKwkjICAgICBMaWtlIGNvbXBsZXRlLCBidXQgYWRkaXRpb25hbGx5IFJBSUQgTFZzIG9mIHNlZ21lbnQgdHlwZSByYWlkMSwKKwkjICAgICByYWlkNCwgcmFpZDUsIHJhZGlkNiBhbmQgcmFpZDEwIHdpbGwgYmUgYWN0aXZhdGVkIGlmIHRoZXJlIGlzIG5vCisJIyAgICAgZGF0YSBsb3NzLCBpLmUuIHRoZXkgaGF2ZSBzdWZmaWNpZW50IHJlZHVuZGFuY3kgdG8gcHJlc2VudCB0aGUKKwkjICAgICBlbnRpcmUgYWRkcmVzc2FibGUgcmFuZ2Ugb2YgdGhlIExvZ2ljYWwgVm9sdW1lLgorCSMgICBwYXJ0aWFsCisJIyAgICAgQWxsb3dzIHRoZSBhY3RpdmF0aW9uIG9mIGFueSBMViBldmVuIGlmIGEgbWlzc2luZyBvciBmYWlsZWQgUFYKKwkjICAgICBjb3VsZCBjYXVzZSBkYXRhIGxvc3Mgd2l0aCBhIHBvcnRpb24gb2YgdGhlIExWIGluYWNjZXNzaWJsZS4KKwkjICAgICBUaGlzIHNldHRpbmcgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLCBidXQgbWF5IHNvbWV0aW1lcworCSMgICAgIGFzc2lzdCB3aXRoIGRhdGEgcmVjb3ZlcnkuCisJIyAKKwlhY3RpdmF0aW9uX21vZGUgPSAiZGVncmFkZWQiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGFjdGl2YXRpb24vbG9ja19zdGFydF9saXN0LgorCSMgTG9ja2luZyBpcyBzdGFydGVkIG9ubHkgZm9yIFZHcyBzZWxlY3RlZCBieSB0aGlzIGxpc3QuCisJIyBUaGUgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciB2b2x1bWVfbGlzdC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gYWN0aXZhdGlvbi9hdXRvX2xvY2tfc3RhcnRfbGlzdC4KKwkjIExvY2tpbmcgaXMgYXV0by1zdGFydGVkIG9ubHkgZm9yIFZHcyBzZWxlY3RlZCBieSB0aGlzIGxpc3QuCisJIyBUaGUgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciBhdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3QuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQuCit9CisKKyMgQ29uZmlndXJhdGlvbiBzZWN0aW9uIG1ldGFkYXRhLgorIyBUaGlzIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisjIG1ldGFkYXRhIHsKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbWV0YWRhdGEvY2hlY2tfcHZfZGV2aWNlX3NpemVzLgorCSMgQ2hlY2sgZGV2aWNlIHNpemVzIGFyZSBub3Qgc21hbGxlciB0aGFuIGNvcnJlc3BvbmRpbmcgUFYgc2l6ZXMuCisJIyBJZiBkZXZpY2Ugc2l6ZSBpcyBsZXNzIHRoYW4gY29ycmVzcG9uZGluZyBQViBzaXplIGZvdW5kIGluIG1ldGFkYXRhLAorCSMgdGhlcmUgaXMgYWx3YXlzIGEgcmlzayBvZiBkYXRhIGxvc3MuIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlbiBMVk0KKwkjIGlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSBlYWNoIHRpbWUgaXQgZmluZHMgdGhhdCB0aGUgZGV2aWNlIHNpemUgaXMKKwkjIGxlc3MgdGhhbiBjb3JyZXNwb25kaW5nIFBWIHNpemUuIFlvdSBzaG91bGQgbm90IGRpc2FibGUgdGhpcyB1bmxlc3MKKwkjIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIGFib3V0IHdoYXQgeW91IGFyZSBkb2luZyEKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgYWR2YW5jZWQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGNoZWNrX3B2X2RldmljZV9zaXplcyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbWV0YWRhdGEvcmVjb3JkX2x2c19oaXN0b3J5LgorCSMgV2hlbiBlbmFibGVkLCBMVk0ga2VlcHMgaGlzdG9yeSByZWNvcmRzIGFib3V0IHJlbW92ZWQgTFZzIGluCisJIyBtZXRhZGF0YS4gVGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVjb3JkZWQgaW4gbWV0YWRhdGEgZm9yCisJIyBoaXN0b3JpY2FsIExWcyBpcyByZWR1Y2VkIHdoZW4gY29tcGFyZWQgdG8gb3JpZ2luYWwKKwkjIGluZm9ybWF0aW9uIGtlcHQgaW4gbWV0YWRhdGEgZm9yIGxpdmUgTFZzLiBDdXJyZW50bHksIHRoaXMKKwkjIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGZvciB0aGluIGFuZCB0aGluIHNuYXBzaG90IExWcyBvbmx5LgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyByZWNvcmRfbHZzX2hpc3RvcnkgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIG1ldGFkYXRhL2x2c19oaXN0b3J5X3JldGVudGlvbl90aW1lLgorCSMgUmV0ZW50aW9uIHRpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHJlY29yZCBhYm91dCBpbmRpdmlkdWFsCisJIyBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lIGlzIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkLgorCSMgQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoaXMgZmVhdHVyZS4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZzX2hpc3RvcnlfcmV0ZW50aW9uX3RpbWUgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIG1ldGFkYXRhL3B2bWV0YWRhdGFjb3BpZXMuCisJIyBOdW1iZXIgb2YgY29waWVzIG9mIG1ldGFkYXRhIHRvIHN0b3JlIG9uIGVhY2ggUFYuCisJIyBUaGUgLS1wdm1ldGFkYXRhY29waWVzIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLgorCSMgCisJIyBBY2NlcHRlZCB2YWx1ZXM6CisJIyAgIDIKKwkjICAgICBUd28gY29waWVzIG9mIHRoZSBWRyBtZXRhZGF0YSBhcmUgc3RvcmVkIG9uIHRoZSBQViwgb25lIGF0IHRoZQorCSMgICAgIGZyb250IG9mIHRoZSBQViwgYW5kIG9uZSBhdCB0aGUgZW5kLgorCSMgICAxCisJIyAgICAgT25lIGNvcHkgb2YgVkcgbWV0YWRhdGEgaXMgc3RvcmVkIGF0IHRoZSBmcm9udCBvZiB0aGUgUFYuCisJIyAgIDAKKwkjICAgICBObyBjb3BpZXMgb2YgVkcgbWV0YWRhdGEgYXJlIHN0b3JlZCBvbiB0aGUgUFYuIFRoaXMgbWF5IGJlCisJIyAgICAgdXNlZnVsIGZvciBWR3MgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mIFBWcy4KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcHZtZXRhZGF0YWNvcGllcyA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbWV0YWRhdGEvdmdtZXRhZGF0YWNvcGllcy4KKwkjIE51bWJlciBvZiBjb3BpZXMgb2YgbWV0YWRhdGEgdG8gbWFpbnRhaW4gZm9yIGVhY2ggVkcuCisJIyBUaGUgLS12Z21ldGFkYXRhY29waWVzIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLgorCSMgSWYgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIExWTSBhdXRvbWF0aWNhbGx5IGNob29zZXMgd2hpY2ggb2YgdGhlCisJIyBhdmFpbGFibGUgbWV0YWRhdGEgYXJlYXMgdG8gdXNlIHRvIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKKwkjIGNvcGllcyBvZiB0aGUgVkcgbWV0YWRhdGEuIElmIHlvdSBzZXQgYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgdGhlCisJIyB0b3RhbCBudW1iZXIgb2YgbWV0YWRhdGEgYXJlYXMgYXZhaWxhYmxlLCB0aGVuIG1ldGFkYXRhIGlzIHN0b3JlZCBpbgorCSMgdGhlbSBhbGwuIFRoZSB2YWx1ZSAwICh1bm1hbmFnZWQpIGRpc2FibGVzIHRoaXMgYXV0b21hdGljIG1hbmFnZW1lbnQKKwkjIGFuZCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgd2hpY2ggbWV0YWRhdGEgYXJlYXMgYXJlIHVzZWQgYXQgdGhlCisJIyBpbmRpdmlkdWFsIFBWIGxldmVsIHVzaW5nIHB2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgeXxuLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB2Z21ldGFkYXRhY29waWVzID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBtZXRhZGF0YS9wdm1ldGFkYXRhc2l6ZS4KKwkjIEFwcHJveGltYXRlIG51bWJlciBvZiBzZWN0b3JzIHRvIHVzZSBmb3IgZWFjaCBtZXRhZGF0YSBjb3B5LgorCSMgVkdzIHdpdGggbGFyZ2UgbnVtYmVycyBvZiBQVnMgb3IgTFZzLCBvciBWR3MgY29udGFpbmluZyBjb21wbGV4IExWCisJIyBzdHJ1Y3R1cmVzLCBtYXkgbmVlZCBhZGRpdGlvbmFsIHNwYWNlIGZvciBWRyBtZXRhZGF0YS4gVGhlIG1ldGFkYXRhCisJIyBhcmVhcyBhcmUgdHJlYXRlZCBhcyBjaXJjdWxhciBidWZmZXJzLCBzbyB1bnVzZWQgc3BhY2UgYmVjb21lcyBmaWxsZWQKKwkjIHdpdGggYW4gYXJjaGl2ZSBvZiB0aGUgbW9zdCByZWNlbnQgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIG1ldGFkYXRhLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwdm1ldGFkYXRhc2l6ZSA9IDI1NQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBtZXRhZGF0YS9wdm1ldGFkYXRhaWdub3JlLgorCSMgSWdub3JlIG1ldGFkYXRhIGFyZWFzIG9uIGEgbmV3IFBWLgorCSMgVGhlIC0tbWV0YWRhdGFpZ25vcmUgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuCisJIyBJZiBtZXRhZGF0YSBhcmVhcyBvbiBhIFBWIGFyZSBpZ25vcmVkLCBMVk0gd2lsbCBub3Qgc3RvcmUgbWV0YWRhdGEKKwkjIGluIHRoZW0uCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGFkdmFuY2VkLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwdm1ldGFkYXRhaWdub3JlID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBtZXRhZGF0YS9zdHJpcGVzaXplLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgc3RyaXBlc2l6ZSA9IDY0CisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIG1ldGFkYXRhL2RpcnMuCisJIyBEaXJlY3RvcmllcyBob2xkaW5nIGxpdmUgY29waWVzIG9mIHRleHQgZm9ybWF0IG1ldGFkYXRhLgorCSMgVGhlc2UgZGlyZWN0b3JpZXMgbXVzdCBub3QgYmUgb24gbG9naWNhbCB2b2x1bWVzIQorCSMgSXQncyBwb3NzaWJsZSB0byB1c2UgTFZNIHdpdGggYSBjb3VwbGUgb2YgZGlyZWN0b3JpZXMgaGVyZSwKKwkjIHByZWZlcmFibHkgb24gZGlmZmVyZW50IChub24tTFYpIGZpbGVzeXN0ZW1zLCBhbmQgd2l0aCBubyBvdGhlcgorCSMgb24tZGlzayBtZXRhZGF0YSAocHZtZXRhZGF0YWNvcGllcyA9IDApLiBPciB0aGlzIGNhbiBiZSBpbiBhZGRpdGlvbgorCSMgdG8gb24tZGlzayBtZXRhZGF0YSBhcmVhcy4gVGhlIGZlYXR1cmUgd2FzIG9yaWdpbmFsbHkgYWRkZWQgdG8KKwkjIHNpbXBsaWZ5IHRlc3RpbmcgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgbG93IG1lbW9yeSBzaXR1YXRpb25zIC0KKwkjIHRoZSBtYWNoaW5lIGNvdWxkIGxvY2sgdXAuIE5ldmVyIGVkaXQgYW55IGZpbGVzIGluIHRoZXNlIGRpcmVjdG9yaWVzCisJIyBieSBoYW5kIHVubGVzcyB5b3UgYXJlIGFic29sdXRlbHkgc3VyZSB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisJIyBVc2UgdGhlIHN1cHBsaWVkIHRvb2xzZXQgdG8gbWFrZSBjaGFuZ2VzIChlLmcuIHZnY2ZncmVzdG9yZSkuCisJIyAKKwkjIEV4YW1wbGUKKwkjIGRpcnMgPSBbICIvZXRjL2x2bS9tZXRhZGF0YSIsICIvbW50L2Rpc2syL2x2bS9tZXRhZGF0YTIiIF0KKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBhZHZhbmNlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKyMgfQorCisjIENvbmZpZ3VyYXRpb24gc2VjdGlvbiByZXBvcnQuCisjIExWTSByZXBvcnQgY29tbWFuZCBvdXRwdXQgZm9ybWF0dGluZy4KKyMgVGhpcyBjb25maWd1cmF0aW9uIHNlY3Rpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorIyByZXBvcnQgeworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvb3V0cHV0X2Zvcm1hdC4KKwkjIEZvcm1hdCBvZiBMVk0gY29tbWFuZCdzIHJlcG9ydCBvdXRwdXQuCisJIyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJlcG9ydCBwZXIgY29tbWFuZCwgdGhlbiB0aGUgZm9ybWF0CisJIyBpcyBhcHBsaWVkIGZvciBhbGwgcmVwb3J0cy4gWW91IGNhbiBhbHNvIGNoYW5nZSBvdXRwdXQgZm9ybWF0CisJIyBkaXJlY3RseSBvbiBjb21tYW5kIGxpbmUgdXNpbmcgLS1yZXBvcnRmb3JtYXQgb3B0aW9uIHdoaWNoCisJIyBoYXMgcHJlY2VkZW5jZSBvdmVyIGxvZy9vdXRwdXRfZm9ybWF0IHNldHRpbmcuCisJIyBBY2NlcHRlZCB2YWx1ZXM6CisJIyAgIGJhc2ljCisJIyAgICAgT3JpZ2luYWwgZm9ybWF0IHdpdGggY29sdW1ucyBhbmQgcm93cy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuCisJIyAgICAgb25lIHJlcG9ydCBwZXIgY29tbWFuZCwgZWFjaCByZXBvcnQgaXMgcHJlZml4ZWQgd2l0aCByZXBvcnQncworCSMgICAgIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uLgorCSMgICBqc29uCisJIyAgICAgSlNPTiBmb3JtYXQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIG91dHB1dF9mb3JtYXQgPSAiYmFzaWMiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9jb21wYWN0X291dHB1dC4KKwkjIERvIG5vdCBwcmludCBlbXB0eSB2YWx1ZXMgZm9yIGFsbCByZXBvcnQgZmllbGRzLgorCSMgSWYgZW5hYmxlZCwgYWxsIGZpZWxkcyB0aGF0IGRvbid0IGhhdmUgYSB2YWx1ZSBzZXQgZm9yIGFueSBvZiB0aGUKKwkjIHJvd3MgcmVwb3J0ZWQgYXJlIHNraXBwZWQgYW5kIG5vdCBwcmludGVkLiBDb21wYWN0IG91dHB1dCBpcworCSMgYXBwbGljYWJsZSBvbmx5IGlmIHJlcG9ydC9idWZmZXJlZCBpcyBlbmFibGVkLiBJZiB5b3UgbmVlZCB0bworCSMgY29tcGFjdCBvbmx5IHNwZWNpZmllZCBmaWVsZHMsIHVzZSBjb21wYWN0X291dHB1dD0wIGFuZCBkZWZpbmUKKwkjIHJlcG9ydC9jb21wYWN0X291dHB1dF9jb2xzIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBpbnN0ZWFkLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBjb21wYWN0X291dHB1dCA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L2NvbXBhY3Rfb3V0cHV0X2NvbHMuCisJIyBEbyBub3QgcHJpbnQgZW1wdHkgdmFsdWVzIGZvciBzcGVjaWZpZWQgcmVwb3J0IGZpZWxkcy4KKwkjIElmIGRlZmluZWQsIHNwZWNpZmllZCBmaWVsZHMgdGhhdCBkb24ndCBoYXZlIGEgdmFsdWUgc2V0IGZvciBhbnkKKwkjIG9mIHRoZSByb3dzIHJlcG9ydGVkIGFyZSBza2lwcGVkIGFuZCBub3QgcHJpbnRlZC4gQ29tcGFjdCBvdXRwdXQKKwkjIGlzIGFwcGxpY2FibGUgb25seSBpZiByZXBvcnQvYnVmZmVyZWQgaXMgZW5hYmxlZC4gSWYgeW91IG5lZWQgdG8KKwkjIGNvbXBhY3QgYWxsIGZpZWxkcywgdXNlIGNvbXBhY3Rfb3V0cHV0PTEgaW5zdGVhZCBpbiB3aGljaCBjYXNlCisJIyB0aGUgY29tcGFjdF9vdXRwdXRfY29scyBzZXR0aW5nIGlzIHRoZW4gaWdub3JlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgY29tcGFjdF9vdXRwdXRfY29scyA9ICIiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9hbGlnbmVkLgorCSMgQWxpZ24gY29sdW1ucyBpbiByZXBvcnQgb3V0cHV0LgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBhbGlnbmVkID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvYnVmZmVyZWQuCisJIyBCdWZmZXIgcmVwb3J0IG91dHB1dC4KKwkjIFdoZW4gYnVmZmVyZWQgcmVwb3J0aW5nIGlzIHVzZWQsIHRoZSByZXBvcnQncyBjb250ZW50IGlzIGFwcGVuZGVkCisJIyBpbmNyZW1lbnRhbGx5IHRvIGluY2x1ZGUgZWFjaCBvYmplY3QgYmVpbmcgcmVwb3J0ZWQgdW50aWwgdGhlIHJlcG9ydAorCSMgaXMgZmx1c2hlZCB0byBvdXRwdXQgd2hpY2ggbm9ybWFsbHkgaGFwcGVucyBhdCB0aGUgZW5kIG9mIGNvbW1hbmQKKwkjIGV4ZWN1dGlvbi4gT3RoZXJ3aXNlLCBpZiBidWZmZXJpbmcgaXMgbm90IHVzZWQsIGVhY2ggb2JqZWN0IGlzCisJIyByZXBvcnRlZCBhcyBzb29uIGFzIGl0cyBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBidWZmZXJlZCA9IDEKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L2hlYWRpbmdzLgorCSMgU2hvdyBoZWFkaW5ncyBmb3IgY29sdW1ucyBvbiByZXBvcnQuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGhlYWRpbmdzID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvc2VwYXJhdG9yLgorCSMgQSBzZXBhcmF0b3IgdG8gdXNlIG9uIHJlcG9ydCBhZnRlciBlYWNoIGZpZWxkLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBzZXBhcmF0b3IgPSAiICIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L2xpc3RfaXRlbV9zZXBhcmF0b3IuCisJIyBBIHNlcGFyYXRvciB0byB1c2UgZm9yIGxpc3QgaXRlbXMgd2hlbiByZXBvcnRlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbGlzdF9pdGVtX3NlcGFyYXRvciA9ICIsIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvcHJlZml4ZXMuCisJIyBVc2UgYSBmaWVsZCBuYW1lIHByZWZpeCBmb3IgZWFjaCBmaWVsZCByZXBvcnRlZC4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcHJlZml4ZXMgPSAwCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9xdW90ZWQuCisJIyBRdW90ZSBmaWVsZCB2YWx1ZXMgd2hlbiB1c2luZyBmaWVsZCBuYW1lIHByZWZpeGVzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBxdW90ZWQgPSAxCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9jb2x1bXNfYXNfcm93cy4KKwkjIE91dHB1dCBlYWNoIGNvbHVtbiBhcyBhIHJvdy4KKwkjIElmIHNldCwgdGhpcyBhbHNvIGltcGxpZXMgcmVwb3J0L3ByZWZpeGVzPTEuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGNvbHVtc19hc19yb3dzID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvYmluYXJ5X3ZhbHVlc19hc19udW1lcmljLgorCSMgVXNlIGJpbmFyeSB2YWx1ZXMgMCBvciAxIGluc3RlYWQgb2YgZGVzY3JpcHRpdmUgbGl0ZXJhbCB2YWx1ZXMuCisJIyBGb3IgY29sdW1ucyB0aGF0IGhhdmUgZXhhY3RseSB0d28gdmFsaWQgdmFsdWVzIHRvIHJlcG9ydAorCSMgKG5vdCBjb3VudGluZyB0aGUgJ3Vua25vd24nIHZhbHVlIHdoaWNoIGRlbm90ZXMgdGhhdCB0aGUKKwkjIHZhbHVlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkKS4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgYmluYXJ5X3ZhbHVlc19hc19udW1lcmljID0gMAorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvdGltZV9mb3JtYXQuCisJIyBTZXQgdGltZSBmb3JtYXQgZm9yIGZpZWxkcyByZXBvcnRpbmcgdGltZSB2YWx1ZXMuCisJIyBGb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyBhIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcgorCSMgc2VxdWVuY2VzIGFuZCBvcmRpbmFyeSBjaGFyYWN0ZXIgc2VxdWVuY2VzLiBPcmRpbmFyeSBjaGFyYWN0ZXIKKwkjIHNlcXVlbmNlcyBhcmUgY29waWVkIHZlcmJhdGltLiBFYWNoIHNwZWNpYWwgY2hhcmFjdGVyIHNlcXVlbmNlIGlzCisJIyBpbnRyb2R1Y2VkIGJ5IHRoZSAnJScgY2hhcmFjdGVyIGFuZCBzdWNoIHNlcXVlbmNlIGlzIHRoZW4KKwkjIHN1YnN0aXR1dGVkIHdpdGggYSB2YWx1ZSBhcyBkZXNjcmliZWQgYmVsb3cuCisJIyAKKwkjIEFjY2VwdGVkIHZhbHVlczoKKwkjICAgJWEKKwkjICAgICBUaGUgYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFjY29yZGluZyB0byB0aGUKKwkjICAgICBjdXJyZW50IGxvY2FsZS4KKwkjICAgJUEKKwkjICAgICBUaGUgZnVsbCBuYW1lIG9mIHRoZSBkYXkgb2YgdGhlIHdlZWsgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CisJIyAgICAgbG9jYWxlLgorCSMgICAlYgorCSMgICAgIFRoZSBhYmJyZXZpYXRlZCBtb250aCBuYW1lIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUuCisJIyAgICVCCisJIyAgICAgVGhlIGZ1bGwgbW9udGggbmFtZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLgorCSMgICAlYworCSMgICAgIFRoZSBwcmVmZXJyZWQgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQKKwkjICAgICBsb2NhbGUgKGFsdCBFKQorCSMgICAlQworCSMgICAgIFRoZSBjZW50dXJ5IG51bWJlciAoeWVhci8xMDApIGFzIGEgMi1kaWdpdCBpbnRlZ2VyLiAoYWx0IEUpCisJIyAgICVkCisJIyAgICAgVGhlIGRheSBvZiB0aGUgbW9udGggYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgMDEgdG8gMzEpLgorCSMgICAgIChhbHQgTykKKwkjICAgJUQKKwkjICAgICBFcXVpdmFsZW50IHRvICVtLyVkLyV5LiAoRm9yIEFtZXJpY2FucyBvbmx5LiBBbWVyaWNhbnMgc2hvdWxkCisJIyAgICAgbm90ZSB0aGF0IGluIG90aGVyIGNvdW50cmllcyVkLyVtLyV5IGlzIHJhdGhlciBjb21tb24uIFRoaXMKKwkjICAgICBtZWFucyB0aGF0IGluIGludGVybmF0aW9uYWwgY29udGV4dCB0aGlzIGZvcm1hdCBpcyBhbWJpZ3VvdXMgYW5kCisJIyAgICAgc2hvdWxkIG5vdCBiZSB1c2VkLgorCSMgICAlZQorCSMgICAgIExpa2UgJWQsIHRoZSBkYXkgb2YgdGhlIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIsIGJ1dCBhIGxlYWRpbmcKKwkjICAgICB6ZXJvIGlzIHJlcGxhY2VkIGJ5IGEgc3BhY2UuIChhbHQgTykKKwkjICAgJUUKKwkjICAgICBNb2RpZmllcjogdXNlIGFsdGVybmF0aXZlIGxvY2FsLWRlcGVuZGVudCByZXByZXNlbnRhdGlvbiBpZgorCSMgICAgIGF2YWlsYWJsZS4KKwkjICAgJUYKKwkjICAgICBFcXVpdmFsZW50IHRvICVZLSVtLSVkICh0aGUgSVNPIDg2MDEgZGF0ZSBmb3JtYXQpLgorCSMgICAlRworCSMgICAgIFRoZSBJU08gODYwMSB3ZWVrLWJhc2VkIHllYXIgd2l0aCBjZW50dXJ5IGFzIGFkZWNpbWFsIG51bWJlci4KKwkjICAgICBUaGUgNC1kaWdpdCB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIElTTyB3ZWVrIG51bWJlciAoc2VlICVWKS4KKwkjICAgICBUaGlzIGhhcyB0aGUgc2FtZSBmb3JtYXQgYW5kIHZhbHVlIGFzICVZLCBleGNlcHQgdGhhdCBpZiB0aGUKKwkjICAgICBJU08gd2VlayBudW1iZXIgYmVsb25ncyB0byB0aGUgcHJldmlvdXMgb3IgbmV4dCB5ZWFyLCB0aGF0IHllYXIKKwkjICAgICBpcyB1c2VkIGluc3RlYWQuCisJIyAgICVnCisJIyAgICAgTGlrZSAlRywgYnV0IHdpdGhvdXQgY2VudHVyeSwgdGhhdCBpcywgd2l0aCBhIDItZGlnaXQgeWVhcgorCSMgICAgICgwMC05OSkuCisJIyAgICVoCisJIyAgICAgRXF1aXZhbGVudCB0byAlYi4KKwkjICAgJUgKKwkjICAgICBUaGUgaG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyIHVzaW5nIGEgMjQtaG91ciBjbG9jaworCSMgICAgIChyYW5nZSAwMCB0byAyMykuIChhbHQgTykKKwkjICAgJUkKKwkjICAgICBUaGUgaG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyIHVzaW5nIGEgMTItaG91ciBjbG9jaworCSMgICAgIChyYW5nZSAwMSB0byAxMikuIChhbHQgTykKKwkjICAgJWoKKwkjICAgICBUaGUgZGF5IG9mIHRoZSB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDAwMSB0byAzNjYpLgorCSMgICAlaworCSMgICAgIFRoZSBob3VyICgyNC1ob3VyIGNsb2NrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwIHRvIDIzKTsKKwkjICAgICBzaW5nbGUgZGlnaXRzIGFyZSBwcmVjZWRlZCBieSBhIGJsYW5rLiAoU2VlIGFsc28gJUguKQorCSMgICAlbAorCSMgICAgIFRoZSBob3VyICgxMi1ob3VyIGNsb2NrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAxIHRvIDEyKTsKKwkjICAgICBzaW5nbGUgZGlnaXRzIGFyZSBwcmVjZWRlZCBieSBhIGJsYW5rLiAoU2VlIGFsc28gJUkuKQorCSMgICAlbQorCSMgICAgIFRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMSB0byAxMikuIChhbHQgTykKKwkjICAgJU0KKwkjICAgICBUaGUgbWludXRlIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDAwIHRvIDU5KS4gKGFsdCBPKQorCSMgICAlTworCSMgICAgIE1vZGlmaWVyOiB1c2UgYWx0ZXJuYXRpdmUgbnVtZXJpYyBzeW1ib2xzLgorCSMgICAlcAorCSMgICAgIEVpdGhlciAiQU0iIG9yICJQTSIgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0aW1lIHZhbHVlLAorCSMgICAgIG9yIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4gTm9vbiBpcworCSMgICAgIHRyZWF0ZWQgYXMgIlBNIiBhbmQgbWlkbmlnaHQgYXMgIkFNIi4KKwkjICAgJVAKKwkjICAgICBMaWtlICVwIGJ1dCBpbiBsb3dlcmNhc2U6ICJhbSIgb3IgInBtIiBvciBhIGNvcnJlc3BvbmRpbmcKKwkjICAgICBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KKwkjICAgJXIKKwkjICAgICBUaGUgdGltZSBpbiBhLm0uIG9yIHAubS4gbm90YXRpb24uIEluIHRoZSBQT1NJWCBsb2NhbGUgdGhpcyBpcworCSMgICAgIGVxdWl2YWxlbnQgdG8gJUk6JU06JVMgJXAuCisJIyAgICVSCisJIyAgICAgVGhlIHRpbWUgaW4gMjQtaG91ciBub3RhdGlvbiAoJUg6JU0pLiBGb3IgYSB2ZXJzaW9uIGluY2x1ZGluZworCSMgICAgIHRoZSBzZWNvbmRzLCBzZWUgJVQgYmVsb3cuCisJIyAgICVzCisJIyAgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCwKKwkjICAgICAxOTcwLTAxLTAxIDAwOjAwOjAwICswMDAwIChVVEMpCisJIyAgICVTCisJIyAgICAgVGhlIHNlY29uZCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMCB0byA2MCkuIChUaGUgcmFuZ2UgaXMKKwkjICAgICB1cCB0byA2MCB0byBhbGxvdyBmb3Igb2NjYXNpb25hbCBsZWFwIHNlY29uZHMuKSAoYWx0IE8pCisJIyAgICV0CisJIyAgICAgQSB0YWIgY2hhcmFjdGVyLgorCSMgICAlVAorCSMgICAgIFRoZSB0aW1lIGluIDI0LWhvdXIgbm90YXRpb24gKCVIOiVNOiVTKS4KKwkjICAgJXUKKwkjICAgICBUaGUgZGF5IG9mIHRoZSB3ZWVrIGFzIGEgZGVjaW1hbCwgcmFuZ2UgMSB0byA3LCBNb25kYXkgYmVpbmcgMS4KKwkjICAgICBTZWUgYWxzbyAldy4gKGFsdCBPKQorCSMgICAlVQorCSMgICAgIFRoZSB3ZWVrIG51bWJlciBvZiB0aGUgY3VycmVudCB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIsCisJIyAgICAgcmFuZ2UgMDAgdG8gNTMsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IFN1bmRheSBhcyB0aGUgZmlyc3QKKwkjICAgICBkYXkgb2Ygd2VlayAwMS4gU2VlIGFsc28gJVYgYW5kICVXLiAoYWx0IE8pCisJIyAgICVWCisJIyAgICAgVGhlIElTTyA4NjAxIHdlZWsgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciwKKwkjICAgICByYW5nZSAwMSB0byA1Mywgd2hlcmUgd2VlayAxIGlzIHRoZSBmaXJzdCB3ZWVrIHRoYXQgaGFzIGF0IGxlYXN0CisJIyAgICAgNCBkYXlzIGluIHRoZSBuZXcgeWVhci4gU2VlIGFsc28gJVUgYW5kICVXLiAoYWx0IE8pCisJIyAgICV3CisJIyAgICAgVGhlIGRheSBvZiB0aGUgd2VlayBhcyBhIGRlY2ltYWwsIHJhbmdlIDAgdG8gNiwgU3VuZGF5IGJlaW5nIDAuCisJIyAgICAgU2VlIGFsc28gJXUuIChhbHQgTykKKwkjICAgJVcKKwkjICAgICBUaGUgd2VlayBudW1iZXIgb2YgdGhlIGN1cnJlbnQgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyLAorCSMgICAgIHJhbmdlIDAwIHRvIDUzLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBNb25kYXkgYXMgdGhlIGZpcnN0IGRheQorCSMgICAgIG9mIHdlZWsgMDEuIChhbHQgTykKKwkjICAgJXgKKwkjICAgICBUaGUgcHJlZmVycmVkIGRhdGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZSB3aXRob3V0CisJIyAgICAgdGhlIHRpbWUuIChhbHQgRSkKKwkjICAgJVgKKwkjICAgICBUaGUgcHJlZmVycmVkIHRpbWUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZSB3aXRob3V0CisJIyAgICAgdGhlIGRhdGUuIChhbHQgRSkKKwkjICAgJXkKKwkjICAgICBUaGUgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyIHdpdGhvdXQgYSBjZW50dXJ5IChyYW5nZSAwMCB0byA5OSkuCisJIyAgICAgKGFsdCBFLCBhbHQgTykKKwkjICAgJVkKKwkjICAgICBUaGUgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyIGluY2x1ZGluZyB0aGUgY2VudHVyeS4gKGFsdCBFKQorCSMgICAlegorCSMgICAgIFRoZSAraGhtbSBvciAtaGhtbSBudW1lcmljIHRpbWV6b25lICh0aGF0IGlzLCB0aGUgaG91ciBhbmQgbWludXRlCisJIyAgICAgb2Zmc2V0IGZyb20gVVRDKS4KKwkjICAgJVoKKwkjICAgICBUaGUgdGltZXpvbmUgbmFtZSBvciBhYmJyZXZpYXRpb24uCisJIyAgICUlCisJIyAgICAgQSBsaXRlcmFsICclJyBjaGFyYWN0ZXIuCisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGltZV9mb3JtYXQgPSAiJVktJW0tJWQgJVQgJXoiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9kZXZ0eXBlc19zb3J0LgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ2x2bSBkZXZ0eXBlcycgY29tbWFuZC4KKwkjIFNlZSAnbHZtIGRldnR5cGVzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGRldnR5cGVzX3NvcnQgPSAiZGV2dHlwZV9uYW1lIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvZGV2dHlwZXNfY29scy4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICdsdm0gZGV2dHlwZXMnIGNvbW1hbmQuCisJIyBTZWUgJ2x2bSBkZXZ0eXBlcyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBkZXZ0eXBlc19jb2xzID0gImRldnR5cGVfbmFtZSxkZXZ0eXBlX21heF9wYXJ0aXRpb25zLGRldnR5cGVfZGVzY3JpcHRpb24iCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9kZXZ0eXBlc19jb2xzX3ZlcmJvc2UuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAnbHZtIGRldnR5cGVzJyBjb21tYW5kIGluIHZlcmJvc2UgbW9kZS4KKwkjIFNlZSAnbHZtIGRldnR5cGVzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGRldnR5cGVzX2NvbHNfdmVyYm9zZSA9ICJkZXZ0eXBlX25hbWUsZGV2dHlwZV9tYXhfcGFydGl0aW9ucyxkZXZ0eXBlX2Rlc2NyaXB0aW9uIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvbHZzX3NvcnQuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAnbHZzJyBjb21tYW5kLgorCSMgU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZzX3NvcnQgPSAidmdfbmFtZSxsdl9uYW1lIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvbHZzX2NvbHMuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAnbHZzJyBjb21tYW5kLgorCSMgU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZzX2NvbHMgPSAibHZfbmFtZSx2Z19uYW1lLGx2X2F0dHIsbHZfc2l6ZSxwb29sX2x2LG9yaWdpbixkYXRhX3BlcmNlbnQsbWV0YWRhdGFfcGVyY2VudCxtb3ZlX3B2LG1pcnJvcl9sb2csY29weV9wZXJjZW50LGNvbnZlcnRfbHYiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9sdnNfY29sc192ZXJib3NlLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ2x2cycgY29tbWFuZCBpbiB2ZXJib3NlIG1vZGUuCisJIyBTZWUgJ2x2cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBsdnNfY29sc192ZXJib3NlID0gImx2X25hbWUsdmdfbmFtZSxzZWdfY291bnQsbHZfYXR0cixsdl9zaXplLGx2X21ham9yLGx2X21pbm9yLGx2X2tlcm5lbF9tYWpvcixsdl9rZXJuZWxfbWlub3IscG9vbF9sdixvcmlnaW4sZGF0YV9wZXJjZW50LG1ldGFkYXRhX3BlcmNlbnQsbW92ZV9wdixjb3B5X3BlcmNlbnQsbWlycm9yX2xvZyxjb252ZXJ0X2x2LGx2X3V1aWQsbHZfcHJvZmlsZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3Znc19zb3J0LgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ3ZncycgY29tbWFuZC4KKwkjIFNlZSAndmdzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHZnc19zb3J0ID0gInZnX25hbWUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC92Z3NfY29scy4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICd2Z3MnIGNvbW1hbmQuCisJIyBTZWUgJ3ZncyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB2Z3NfY29scyA9ICJ2Z19uYW1lLHB2X2NvdW50LGx2X2NvdW50LHNuYXBfY291bnQsdmdfYXR0cix2Z19zaXplLHZnX2ZyZWUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC92Z3NfY29sc192ZXJib3NlLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ3ZncycgY29tbWFuZCBpbiB2ZXJib3NlIG1vZGUuCisJIyBTZWUgJ3ZncyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB2Z3NfY29sc192ZXJib3NlID0gInZnX25hbWUsdmdfYXR0cix2Z19leHRlbnRfc2l6ZSxwdl9jb3VudCxsdl9jb3VudCxzbmFwX2NvdW50LHZnX3NpemUsdmdfZnJlZSx2Z191dWlkLHZnX3Byb2ZpbGUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9wdnNfc29ydC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nICdwdnMnIGNvbW1hbmQuCisJIyBTZWUgJ3B2cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwdnNfc29ydCA9ICJwdl9uYW1lIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvcHZzX2NvbHMuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAncHZzJyBjb21tYW5kLgorCSMgU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcHZzX2NvbHMgPSAicHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3B2c19jb2xzX3ZlcmJvc2UuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAncHZzJyBjb21tYW5kIGluIHZlcmJvc2UgbW9kZS4KKwkjIFNlZSAncHZzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHB2c19jb2xzX3ZlcmJvc2UgPSAicHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSxkZXZfc2l6ZSxwdl91dWlkIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvc2Vnc19zb3J0LgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ2x2cyAtLXNlZ21lbnRzJyBjb21tYW5kLgorCSMgU2VlICdsdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBzZWdzX3NvcnQgPSAidmdfbmFtZSxsdl9uYW1lLHNlZ19zdGFydCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3NlZ3NfY29scy4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICdsdnMgLS1zZWdtZW50cycgY29tbWFuZC4KKwkjIFNlZSAnbHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgc2Vnc19jb2xzID0gImx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLHN0cmlwZXMsc2VndHlwZSxzZWdfc2l6ZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3NlZ3NfY29sc192ZXJib3NlLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ2x2cyAtLXNlZ21lbnRzJyBjb21tYW5kIGluIHZlcmJvc2UgbW9kZS4KKwkjIFNlZSAnbHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgc2Vnc19jb2xzX3ZlcmJvc2UgPSAibHZfbmFtZSx2Z19uYW1lLGx2X2F0dHIsc2VnX3N0YXJ0LHNlZ19zaXplLHN0cmlwZXMsc2VndHlwZSxzdHJpcGVzaXplLGNodW5rc2l6ZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3B2c2Vnc19zb3J0LgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ3B2cyAtLXNlZ21lbnRzJyBjb21tYW5kLgorCSMgU2VlICdwdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwdnNlZ3Nfc29ydCA9ICJwdl9uYW1lLHB2c2VnX3N0YXJ0IgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvcHZzZWdzX2NvbHMuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAncHZzIC0tc2VnbWVudHMnIGNvbW1hbmQuCisJIyBTZWUgJ3B2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHB2c2Vnc19jb2xzID0gInB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUscHZzZWdfc3RhcnQscHZzZWdfc2l6ZSIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3B2c2Vnc19jb2xzX3ZlcmJvc2UuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAncHZzIC0tc2VnbWVudHMnIGNvbW1hbmQgaW4gdmVyYm9zZSBtb2RlLgorCSMgU2VlICdwdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBwdnNlZ3NfY29sc192ZXJib3NlID0gInB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUscHZzZWdfc3RhcnQscHZzZWdfc2l6ZSxsdl9uYW1lLHNlZ19zdGFydF9wZSxzZWd0eXBlLHNlZ19wZV9yYW5nZXMiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC92Z3NfY29sc19mdWxsLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgbHZtIGZ1bGxyZXBvcnQncyAndmdzJyBzdWJyZXBvcnQuCisJIyBTZWUgJ3ZncyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyB2Z3NfY29sc19mdWxsID0gInZnX2FsbCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3B2c19jb2xzX2Z1bGwuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICd2Z3MnIHN1YnJlcG9ydC4KKwkjIFNlZSAncHZzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHB2c19jb2xzX2Z1bGwgPSAicHZfYWxsIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvbHZzX2NvbHNfZnVsbC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yIGx2bSBmdWxscmVwb3J0J3MgJ2x2cycgc3VicmVwb3J0LgorCSMgU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZzX2NvbHNfZnVsbCA9ICJsdl9hbGwiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9wdnNlZ3NfY29sc19mdWxsLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgbHZtIGZ1bGxyZXBvcnQncyAncHZzZWcnIHN1YnJlcG9ydC4KKwkjIFNlZSAncHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcHZzZWdzX2NvbHNfZnVsbCA9ICJwdnNlZ19hbGwscHZfdXVpZCxsdl91dWlkIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvc2Vnc19jb2xzX2Z1bGwuCisJIyBMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICdzZWcnIHN1YnJlcG9ydC4KKwkjIFNlZSAnbHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgc2Vnc19jb2xzX2Z1bGwgPSAic2VnX2FsbCxsdl91dWlkIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvdmdzX3NvcnRfZnVsbC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nIGx2bSBmdWxscmVwb3J0J3MgJ3Zncycgc3VicmVwb3J0LgorCSMgU2VlICd2Z3MgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdmdzX3NvcnRfZnVsbCA9ICJ2Z19uYW1lIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvcHZzX3NvcnRfZnVsbC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nIGx2bSBmdWxscmVwb3J0J3MgJ3Zncycgc3VicmVwb3J0LgorCSMgU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgcHZzX3NvcnRfZnVsbCA9ICJwdl9uYW1lIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvbHZzX3NvcnRfZnVsbC4KKwkjIExpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nIGx2bSBmdWxscmVwb3J0J3MgJ2x2cycgc3VicmVwb3J0LgorCSMgU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgbHZzX3NvcnRfZnVsbCA9ICJ2Z19uYW1lLGx2X25hbWUiCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlcG9ydC9wdnNlZ3Nfc29ydF9mdWxsLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgZm9yIGx2bSBmdWxscmVwb3J0J3MgJ3B2c2VnJyBzdWJyZXBvcnQuCisJIyBTZWUgJ3B2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHB2c2Vnc19zb3J0X2Z1bGwgPSAicHZfdXVpZCxwdnNlZ19zdGFydCIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gcmVwb3J0L3NlZ3Nfc29ydF9mdWxsLgorCSMgTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgbHZtIGZ1bGxyZXBvcnQncyAnc2VnJyBzdWJyZXBvcnQuCisJIyBTZWUgJ2x2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIHNlZ3Nfc29ydF9mdWxsID0gImx2X3V1aWQsc2VnX3N0YXJ0IgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvbWFya19oaWRkZW5fZGV2aWNlcy4KKwkjIFVzZSBicmFja2V0cyBbXSB0byBtYXJrIGhpZGRlbiBkZXZpY2VzLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBtYXJrX2hpZGRlbl9kZXZpY2VzID0gMQorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiByZXBvcnQvdHdvX3dvcmRfdW5rbm93bl9kZXZpY2UuCisJIyBVc2UgdGhlIHR3byB3b3JkcyAndW5rbm93biBkZXZpY2UnIGluIHBsYWNlIG9mICdbdW5rbm93bl0nLgorCSMgVGhpcyBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgZGV2aWNlIGZvciBhIFBWIGlzIG5vdCBrbm93bi4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdHdvX3dvcmRfdW5rbm93bl9kZXZpY2UgPSAwCisjIH0KKworIyBDb25maWd1cmF0aW9uIHNlY3Rpb24gZG1ldmVudGQuCisjIFNldHRpbmdzIGZvciB0aGUgTFZNIGV2ZW50IGRhZW1vbi4KK2RtZXZlbnRkIHsKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZG1ldmVudGQvbWlycm9yX2xpYnJhcnkuCisJIyBUaGUgbGlicmFyeSBkbWV2ZW50ZCB1c2VzIHdoZW4gbW9uaXRvcmluZyBhIG1pcnJvciBkZXZpY2UuCisJIyBsaWJkZXZtYXBwZXItZXZlbnQtbHZtMm1pcnJvci5zbyBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20KKwkjIGZhaWx1cmVzLiBJdCByZW1vdmVzIGZhaWxlZCBkZXZpY2VzIGZyb20gYSB2b2x1bWUgZ3JvdXAgYW5kCisJIyByZWNvbmZpZ3VyZXMgYSBtaXJyb3IgYXMgbmVjZXNzYXJ5LiBJZiBubyBtaXJyb3IgbGlicmFyeSBpcworCSMgcHJvdmlkZWQsIG1pcnJvcnMgYXJlIG5vdCBtb25pdG9yZWQgdGhyb3VnaCBkbWV2ZW50ZC4KKwltaXJyb3JfbGlicmFyeSA9ICJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMm1pcnJvci5zbyIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZG1ldmVudGQvcmFpZF9saWJyYXJ5LgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyByYWlkX2xpYnJhcnkgPSAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJyYWlkLnNvIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBkbWV2ZW50ZC9zbmFwc2hvdF9saWJyYXJ5LgorCSMgVGhlIGxpYnJhcnkgZG1ldmVudGQgdXNlcyB3aGVuIG1vbml0b3JpbmcgYSBzbmFwc2hvdCBkZXZpY2UuCisJIyBsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnNuYXBzaG90LnNvIG1vbml0b3JzIHRoZSBmaWxsaW5nIG9mIHNuYXBzaG90cworCSMgYW5kIGVtaXRzIGEgd2FybmluZyB0aHJvdWdoIHN5c2xvZyB3aGVuIHRoZSB1c2FnZSBleGNlZWRzIDgwJS4gVGhlCisJIyB3YXJuaW5nIGlzIHJlcGVhdGVkIHdoZW4gODUlLCA5MCUgYW5kIDk1JSBvZiB0aGUgc25hcHNob3QgaXMgZmlsbGVkLgorCXNuYXBzaG90X2xpYnJhcnkgPSAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJzbmFwc2hvdC5zbyIKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gZG1ldmVudGQvdGhpbl9saWJyYXJ5LgorCSMgVGhlIGxpYnJhcnkgZG1ldmVudGQgdXNlcyB3aGVuIG1vbml0b3JpbmcgYSB0aGluIGRldmljZS4KKwkjIGxpYmRldm1hcHBlci1ldmVudC1sdm0ydGhpbi5zbyBtb25pdG9ycyB0aGUgZmlsbGluZyBvZiBhIHBvb2wKKwkjIGFuZCBlbWl0cyBhIHdhcm5pbmcgdGhyb3VnaCBzeXNsb2cgd2hlbiB0aGUgdXNhZ2UgZXhjZWVkcyA4MCUuIFRoZQorCSMgd2FybmluZyBpcyByZXBlYXRlZCB3aGVuIDg1JSwgOTAlIGFuZCA5NSUgb2YgdGhlIHBvb2wgaXMgZmlsbGVkLgorCXRoaW5fbGlicmFyeSA9ICJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnRoaW4uc28iCisKKwkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIGRtZXZlbnRkL2V4ZWN1dGFibGUuCisJIyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkbWV2ZW50ZCBiaW5hcnkuCisJIyBUaGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS4KKwkjIGV4ZWN1dGFibGUgPSAiQERNRVZFTlREX1BBVEhAIgorfQorCisjIENvbmZpZ3VyYXRpb24gc2VjdGlvbiB0YWdzLgorIyBIb3N0IHRhZyBzZXR0aW5ncy4KKyMgVGhpcyBjb25maWd1cmF0aW9uIHNlY3Rpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorIyB0YWdzIHsKKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gdGFncy9ob3N0dGFncy4KKwkjIENyZWF0ZSBhIGhvc3QgdGFnIHVzaW5nIHRoZSBtYWNoaW5lIG5hbWUuCisJIyBUaGUgbWFjaGluZSBuYW1lIGlzIG5vZGVuYW1lIHJldHVybmVkIGJ5IHVuYW1lKDIpLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBob3N0dGFncyA9IDAKKworCSMgQ29uZmlndXJhdGlvbiBzZWN0aW9uIHRhZ3MvPHRhZz4uCisJIyBSZXBsYWNlIHRoaXMgc3Vic2VjdGlvbiBuYW1lIHdpdGggYSBjdXN0b20gdGFnIG5hbWUuCisJIyBNdWx0aXBsZSBzdWJzZWN0aW9ucyBsaWtlIHRoaXMgY2FuIGJlIGNyZWF0ZWQuIFRoZSAnQCcgcHJlZml4IGZvcgorCSMgdGFncyBpcyBvcHRpb25hbC4gVGhpcyBzdWJzZWN0aW9uIGNhbiBjb250YWluIGhvc3RfbGlzdCwgd2hpY2ggaXMgYQorCSMgbGlzdCBvZiBtYWNoaW5lIG5hbWVzLiBJZiB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgbWFjaGluZSBpcyBmb3VuZCBpbgorCSMgaG9zdF9saXN0LCB0aGVuIHRoZSBuYW1lIG9mIHRoaXMgc3Vic2VjdGlvbiBpcyB1c2VkIGFzIGEgdGFnIGFuZCBpcworCSMgYXBwbGllZCB0byB0aGUgbG9jYWwgbWFjaGluZSBhcyBhICdob3N0IHRhZycuIElmIHRoaXMgc3Vic2VjdGlvbiBpcworCSMgZW1wdHkgKGhhcyBubyBob3N0X2xpc3QpLCB0aGVuIHRoZSBzdWJzZWN0aW9uIG5hbWUgaXMgYWx3YXlzIGFwcGxpZWQKKwkjIGFzIGEgJ2hvc3QgdGFnJy4KKwkjIAorCSMgRXhhbXBsZQorCSMgVGhlIGhvc3QgdGFnIGZvbyBpcyBnaXZlbiB0byBhbGwgaG9zdHMsIGFuZCB0aGUgaG9zdCB0YWcKKwkjIGJhciBpcyBnaXZlbiB0byB0aGUgaG9zdHMgbmFtZWQgbWFjaGluZTEgYW5kIG1hY2hpbmUyLgorCSMgdGFncyB7IGZvbyB7IH0gYmFyIHsgaG9zdF9saXN0ID0gWyAibWFjaGluZTEiLCAibWFjaGluZTIiIF0gfSB9CisJIyAKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBzZWN0aW9uIGhhcyB2YXJpYWJsZSBuYW1lLgorCSMgVGhpcyBjb25maWd1cmF0aW9uIHNlY3Rpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgdGFnIHsKKworCQkjIENvbmZpZ3VyYXRpb24gb3B0aW9uIHRhZ3MvPHRhZz4vaG9zdF9saXN0LgorCQkjIEEgbGlzdCBvZiBtYWNoaW5lIG5hbWVzLgorCQkjIFRoZXNlIG1hY2hpbmUgbmFtZXMgYXJlIGNvbXBhcmVkIHRvIHRoZSBub2RlbmFtZSByZXR1cm5lZAorCQkjIGJ5IHVuYW1lKDIpLiBJZiB0aGUgbG9jYWwgbWFjaGluZSBuYW1lIG1hdGNoZXMgYW4gZW50cnkgaW4KKwkJIyB0aGlzIGxpc3QsIHRoZSBuYW1lIG9mIHRoZSBzdWJzZWN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlCisJCSMgbWFjaGluZSBhcyBhICdob3N0IHRhZycuCisJCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkLgorCSMgfQorIyB9CmRpZmYgLS1naXQgYS9jb25mL2x2bWxvY2FsLmNvbmYuYmFzZSBiL2NvbmYvbHZtbG9jYWwuY29uZi5iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTllMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL2x2bWxvY2FsLmNvbmYuYmFzZQpAQCAtMCwwICsxLDE5IEBACisjIFRoaXMgaXMgYSBsb2NhbCBjb25maWd1cmF0aW9uIGZpbGUgdGVtcGxhdGUgZm9yIHRoZSBMVk0yIHN5c3RlbQorIyB3aGljaCBzaG91bGQgYmUgaW5zdGFsbGVkIGFzIEBERUZBVUxUX1NZU19ESVJAL2x2bWxvY2FsLmNvbmYgLgorIworIyBSZWZlciB0byAnbWFuIGx2bS5jb25mJyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUgbGF5b3V0LgorIworIyBUbyBwdXQgdGhpcyBmaWxlIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhbmQgb3ZlcnJpZGUKKyMgQERFRkFVTFRfU1lTX0RJUkAgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVk1fU1lTVEVNX0RJUiBiZWZvcmUKKyMgcnVubmluZyB0aGUgdG9vbHMuCisjCisjIFRoZSBsdm1sb2NhbC5jb25mIGZpbGUgaXMgbm9ybWFsbHkgZXhwZWN0ZWQgdG8gY29udGFpbiBvbmx5IHRoZQorIyAibG9jYWwiIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdGhhdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvcgorIyByZXBlYXRlZCBhbW9uZyBkaWZmZXJlbnQgaG9zdHMuICAoQnV0IGlmIG90aGVyIHNlY3Rpb25zIGFyZSBwcmVzZW50LAorIyB0aGV5ICp3aWxsKiBnZXQgcHJvY2Vzc2VkLiAgU2V0dGluZ3MgaW4gdGhpcyBmaWxlIG92ZXJyaWRlIGVxdWl2YWxlbnQKKyMgb25lcyBpbiBsdm0uY29uZiBhbmQgYXJlIGluIHR1cm4gb3ZlcnJpZGRlbiBieSBvbmVzIGluIGFueSBlbmFibGVkCisjIGx2bV88dGFnPi5jb25mIGZpbGVzLikKKyMKKyMgUGxlYXNlIHRha2UgY2FyZSB0aGF0IGVhY2ggc2V0dGluZyBvbmx5IGFwcGVhcnMgb25jZSBpZiB1bmNvbW1lbnRpbmcKKyMgZXhhbXBsZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgYW5kIG5ldmVyIGNvcHkgdGhpcyBmaWxlIGJldHdlZW4gaG9zdHMuCisKZGlmZiAtLWdpdCBhL2NvbmYvbHZtbG9jYWwuY29uZi5pbiBiL2NvbmYvbHZtbG9jYWwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQxNGJmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZi9sdm1sb2NhbC5jb25mLmluCkBAIC0wLDAgKzEsNTcgQEAKKyMgVGhpcyBpcyBhIGxvY2FsIGNvbmZpZ3VyYXRpb24gZmlsZSB0ZW1wbGF0ZSBmb3IgdGhlIExWTTIgc3lzdGVtCisjIHdoaWNoIHNob3VsZCBiZSBpbnN0YWxsZWQgYXMgQERFRkFVTFRfU1lTX0RJUkAvbHZtbG9jYWwuY29uZiAuCisjCisjIFJlZmVyIHRvICdtYW4gbHZtLmNvbmYnIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBsYXlvdXQuCisjCisjIFRvIHB1dCB0aGlzIGZpbGUgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGFuZCBvdmVycmlkZQorIyBAREVGQVVMVF9TWVNfRElSQCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExWTV9TWVNURU1fRElSIGJlZm9yZQorIyBydW5uaW5nIHRoZSB0b29scy4KKyMKKyMgVGhlIGx2bWxvY2FsLmNvbmYgZmlsZSBpcyBub3JtYWxseSBleHBlY3RlZCB0byBjb250YWluIG9ubHkgdGhlCisjICJsb2NhbCIgc2VjdGlvbiB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0aGF0IHNob3VsZCBub3QgYmUgc2hhcmVkIG9yCisjIHJlcGVhdGVkIGFtb25nIGRpZmZlcmVudCBob3N0cy4gIChCdXQgaWYgb3RoZXIgc2VjdGlvbnMgYXJlIHByZXNlbnQsCisjIHRoZXkgKndpbGwqIGdldCBwcm9jZXNzZWQuICBTZXR0aW5ncyBpbiB0aGlzIGZpbGUgb3ZlcnJpZGUgZXF1aXZhbGVudAorIyBvbmVzIGluIGx2bS5jb25mIGFuZCBhcmUgaW4gdHVybiBvdmVycmlkZGVuIGJ5IG9uZXMgaW4gYW55IGVuYWJsZWQKKyMgbHZtXzx0YWc+LmNvbmYgZmlsZXMuKQorIworIyBQbGVhc2UgdGFrZSBjYXJlIHRoYXQgZWFjaCBzZXR0aW5nIG9ubHkgYXBwZWFycyBvbmNlIGlmIHVuY29tbWVudGluZworIyBleGFtcGxlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBhbmQgbmV2ZXIgY29weSB0aGlzIGZpbGUgYmV0d2VlbiBob3N0cy4KKworCisjIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBsb2NhbC4KKyMgTFZNIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBsb2NhbCBob3N0LgorbG9jYWwgeworCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2NhbC9zeXN0ZW1faWQuCisJIyBEZWZpbmVzIHRoZSBsb2NhbCBzeXN0ZW0gSUQgZm9yIGx2bWxvY2FsIG1vZGUuCisJIyBUaGlzIGlzIHVzZWQgd2hlbiBnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSBpcyBzZXQgdG8gJ2x2bWxvY2FsJyBpbiB0aGUKKwkjIG1haW4gY29uZmlndXJhdGlvbiBmaWxlLCBlLmcuIGx2bS5jb25mLiBXaGVuIHVzZWQsIGl0IG11c3QgYmUgc2V0IHRvCisJIyBhIHVuaXF1ZSB2YWx1ZSBhbW9uZyBhbGwgaG9zdHMgc2hhcmluZyBhY2Nlc3MgdG8gdGhlIHN0b3JhZ2UsCisJIyBlLmcuIGEgaG9zdCBuYW1lLgorCSMgCisJIyBFeGFtcGxlCisJIyBTZXQgbm8gc3lzdGVtIElEOgorCSMgc3lzdGVtX2lkID0gIiIKKwkjIFNldCB0aGUgc3lzdGVtX2lkIHRvIGEgc3BlY2lmaWMgbmFtZToKKwkjIHN5c3RlbV9pZCA9ICJob3N0MSIKKwkjIAorCSMgVGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBoYXMgYW4gYXV0b21hdGljIGRlZmF1bHQgdmFsdWUuCisJIyBzeXN0ZW1faWQgPSAiIgorCisJIyBDb25maWd1cmF0aW9uIG9wdGlvbiBsb2NhbC9leHRyYV9zeXN0ZW1faWRzLgorCSMgQSBsaXN0IG9mIGV4dHJhIFZHIHN5c3RlbSBJRHMgdGhlIGxvY2FsIGhvc3QgY2FuIGFjY2Vzcy4KKwkjIFZHcyB3aXRoIHRoZSBzeXN0ZW0gSURzIGxpc3RlZCBoZXJlIChpbiBhZGRpdGlvbiB0byB0aGUgaG9zdCdzIG93bgorCSMgc3lzdGVtIElEKSBjYW4gYmUgZnVsbHkgYWNjZXNzZWQgYnkgdGhlIGxvY2FsIGhvc3QuIChUaGVzZSBhcmUKKwkjIHN5c3RlbSBJRHMgdGhhdCB0aGUgaG9zdCBzZWVzIGluIFZHcywgbm90IHN5c3RlbSBJRHMgdGhhdCBpZGVudGlmeQorCSMgdGhlIGxvY2FsIGhvc3QsIHdoaWNoIGlzIGRldGVybWluZWQgYnkgc3lzdGVtX2lkX3NvdXJjZS4pCisJIyBVc2UgdGhpcyBvbmx5IGFmdGVyIGNvbnN1bHRpbmcgJ21hbiBsdm1zeXN0ZW1pZCcgdG8gYmUgY2VydGFpbiBvZgorCSMgY29ycmVjdCB1c2FnZSBhbmQgcG9zc2libGUgZGFuZ2Vycy4KKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC4KKworCSMgQ29uZmlndXJhdGlvbiBvcHRpb24gbG9jYWwvaG9zdF9pZC4KKwkjIFRoZSBsdm1sb2NrZCBzYW5sb2NrIGhvc3RfaWQuCisJIyBUaGlzIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCBob3N0cywgYW5kIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyMDAwLgorCSMgQXBwbGljYWJsZSBvbmx5IGlmIExWTSBpcyBjb21waWxlZCB3aXRoIGxvY2tkIHN1cHBvcnQKKwkjIFRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0IHZhbHVlLgorCSMgaG9zdF9pZCA9IDAKK30KZGlmZiAtLWdpdCBhL2NvbmYvbWV0YWRhdGFfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlLmluIGIvY29uZi9tZXRhZGF0YV9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4ZDMyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmYvbWV0YWRhdGFfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlLmluCkBAIC0wLDAgKzEsMjQgQEAKKyMgVGhpcyBpcyBhIG1ldGFkYXRhIHByb2ZpbGUgdGVtcGxhdGUgZm9yIHRoZSBMVk0yIHN5c3RlbS4KKyMKKyMgSXQgY29udGFpbnMgYWxsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdGhhdCBhcmUgY3VzdG9taXphYmxlIGJ5IG1ldGFkYXRhCisjIHByb2ZpbGVzLiBUbyBjcmVhdGUgYSBuZXcgbWV0YWRhdGEgcHJvZmlsZSwgc2VsZWN0IHRoZSBzZXR0aW5ncyB5b3Ugd2FudAorIyB0byBjdXN0b21pemUgYW5kIGFkZCB0aGVtIGluIGEgbmV3IGZpbGUgbmFtZWQgPHByb2ZpbGVfbmFtZT4ucHJvZmlsZS4KKyMgVGhlbiBpbnN0YWxsIHRoZSBuZXcgcHJvZmlsZSBpbiBhIGRpcmVjdG9yeSBhcyBkZWZpbmVkIGJ5IGNvbmZpZy9wcm9maWxlX2RpcgorIyBzZXR0aW5nIGZvdW5kIGluIEBERUZBVUxUX1NZU19ESVJAL2x2bS5jb25mIGZpbGUuCisjCisjIE1ldGFkYXRhIHByb2ZpbGVzIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHVzaW5nIHRoZSAtLW1ldGFkYXRhcHJvZmlsZSBMVk0yCisjIGNvbW1hbmQgbGluZSBvcHRpb24uCisjCisjIFJlZmVyIHRvICdtYW4gbHZtLmNvbmYnIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHByb2ZpbGVzIGFuZAorIyBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBsYXlvdXQuCisjCithbGxvY2F0aW9uIHsKKwl0aGluX3Bvb2xfemVybz0xCisJdGhpbl9wb29sX2Rpc2NhcmRzPSJwYXNzZG93biIKKwl0aGluX3Bvb2xfY2h1bmtfc2l6ZV9wb2xpY3k9ImdlbmVyaWMiCisjCXRoaW5fcG9vbF9jaHVua19zaXplPTEyOAorfQorYWN0aXZhdGlvbiB7CisJdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkPTEwMAorCXRoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQ9MjAKK30KZGlmZiAtLWdpdCBhL2NvbmYvdGhpbi1nZW5lcmljLnByb2ZpbGUgYi9jb25mL3RoaW4tZ2VuZXJpYy5wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWE3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL3RoaW4tZ2VuZXJpYy5wcm9maWxlCkBAIC0wLDAgKzEsNCBAQAorYWxsb2NhdGlvbiB7CisJdGhpbl9wb29sX2NodW5rX3NpemVfcG9saWN5ID0gImdlbmVyaWMiCisJdGhpbl9wb29sX3plcm8gPSAxCit9CmRpZmYgLS1naXQgYS9jb25mL3RoaW4tcGVyZm9ybWFuY2UucHJvZmlsZSBiL2NvbmYvdGhpbi1wZXJmb3JtYW5jZS5wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTRkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL3RoaW4tcGVyZm9ybWFuY2UucHJvZmlsZQpAQCAtMCwwICsxLDQgQEAKK2FsbG9jYXRpb24geworCXRoaW5fcG9vbF9jaHVua19zaXplX3BvbGljeSA9ICJwZXJmb3JtYW5jZSIKKwl0aGluX3Bvb2xfemVybyA9IDAKK30KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjUzYmZjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlCkBAIC0wLDAgKzEsMTY3MzIgQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LgorIworIworIyBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgMTk5OC0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworIyBVc2UgYSBwcm9wZXIgaW50ZXJuYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5zdXJlIHdlIGRvbid0IGZhbGwKKyAgIyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIGNvbnRpbnVvdXNseSByZS1leGVjdXRpbmcgb3Vyc2VsdmVzLgorICBpZiB0ZXN0IHgiJHtfYXNfY2FuX3JlZXhlY30iICE9IHhubyAmJiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgorICAgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWM7CisgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKyMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorQkFTSF9FTlY9L2Rldi9udWxsCitFTlY9L2Rldi9udWxsCisodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKK2Nhc2UgJC0gaW4gIyAoKCgoCisgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworICAqdiogKSBhc19vcHRzPS12IDs7CisgICp4KiApIGFzX29wdHM9LXggOzsKKyAgKiApIGFzX29wdHM9IDs7Citlc2FjCitleGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCisjIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCiskYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCithc19mbl9leGl0IDI1NQorICBmaQorICAjIFdlIGRvbid0IHdhbnQgdGhpcyB0byBwcm9wYWdhdGUgdG8gb3RoZXIgc3VicHJvY2Vzc2VzLgorICAgICAgICAgIHsgX2FzX2Nhbl9yZWV4ZWM9OyB1bnNldCBfYXNfY2FuX3JlZXhlYzt9CitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorIgorICBhc19yZXF1aXJlZD0iYXNfZm5fcmV0dXJuICgpIHsgKGV4aXQgXCQxKTsgfQorYXNfZm5fc3VjY2VzcyAoKSB7IGFzX2ZuX3JldHVybiAwOyB9Cithc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KK2FzX2ZuX3JldF9zdWNjZXNzICgpIHsgcmV0dXJuIDA7IH0KK2FzX2ZuX3JldF9mYWlsdXJlICgpIHsgcmV0dXJuIDE7IH0KKworZXhpdGNvZGU9MAorYXNfZm5fc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2FzX2ZuX3JldF9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9yZXRfZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQoraWYgKCBzZXQgeDsgYXNfZm5fcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4gOgorCitlbHNlCisgIGV4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgorZmkKK3Rlc3QgeFwkZXhpdGNvZGUgPSB4MCB8fCBleGl0IDEKK3Rlc3QgLXggLyB8fCBleGl0IDEiCisgIGFzX3N1Z2dlc3RlZD0iICBhc19saW5lbm9fMT0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzFhPVwkTElORU5PCisgIGFzX2xpbmVub18yPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMmE9XCRMSU5FTk8KKyAgZXZhbCAndGVzdCBcInhcJGFzX2xpbmVub18xJ1wkYXNfcnVuJ1wiICE9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCIgJiYKKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSdcJGFzX3J1bicgKyAxXGBcIiA9IFwieFwkYXNfbGluZW5vXzInXCRhc19ydW4nXCInIHx8IGV4aXQgMQordGVzdCBcJCgoIDEgKyAxICkpID0gMiB8fCBleGl0IDEiCisgIGlmIChldmFsICIkYXNfcmVxdWlyZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitlbHNlCisgIGFzX2hhdmVfcmVxdWlyZWQ9bm8KK2ZpCisgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geHllcyAmJiAoZXZhbCAiJGFzX3N1Z2dlc3RlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKworZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCithc19mb3VuZD1mYWxzZQorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBhc19mb3VuZD06CisgIGNhc2UgJGFzX2RpciBpbiAjKAorCSAvKikKKwkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisJICAgICBhc19zaGVsbD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcworCQkgICBpZiB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19zdWdnZXN0ZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBicmVhayAyCitmaQorZmkKKwkgICBkb25lOzsKKyAgICAgICBlc2FjCisgIGFzX2ZvdW5kPWZhbHNlCitkb25lCiskYXNfZm91bmQgfHwgeyBpZiB7IHRlc3QgLWYgIiRTSEVMTCIgfHwgdGVzdCAtZiAiJFNIRUxMLmV4ZSI7IH0gJiYKKwkgICAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJFNIRUxMIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2ZpOyB9CitJRlM9JGFzX3NhdmVfSUZTCisKKworICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4gOgorICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICAgICAgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKyMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorQkFTSF9FTlY9L2Rldi9udWxsCitFTlY9L2Rldi9udWxsCisodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKK2Nhc2UgJC0gaW4gIyAoKCgoCisgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworICAqdiogKSBhc19vcHRzPS12IDs7CisgICp4KiApIGFzX29wdHM9LXggOzsKKyAgKiApIGFzX29wdHM9IDs7Citlc2FjCitleGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCisjIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCiskYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCitleGl0IDI1NQorZmkKKworICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgorICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKKyAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KKyAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKKyAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCisgIGVsc2UKKyAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorCisjIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9ICMgYXNfZm5fZXhlY3V0YWJsZV9wCisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTyBhc19saW5lbm9fMWE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCisgIGV2YWwgJ3Rlc3QgIngkYXNfbGluZW5vXzEnJGFzX3J1biciICE9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIiAmJgorICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xJyRhc19ydW4nICsgMWAiID0gIngkYXNfbGluZW5vXzInJGFzX3J1biciJyB8fCB7CisgICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgLW4gJworICAgIHAKKyAgICAvWyRdTElORU5PLz0KKyAgJyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIHMvWyRdTElORU5PLiovJi0vCisgICAgICB0IGxpbmVubworICAgICAgYgorICAgICAgOmxpbmVubworICAgICAgTgorICAgICAgOmxvb3AKKyAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLworICAgICAgdCBsb29wCisgICAgICBzLy1cbi4qLy8KKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAorICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7IGFzX2ZuX2V4aXQgMTsgfQorCisgICMgSWYgd2UgaGFkIHRvIHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMLCB3ZSdyZSBlbnN1cmVkIHRvIGhhdmUKKyAgIyBhbHJlYWR5IGRvbmUgdGhhdCwgc28gZW5zdXJlIHdlIGRvbid0IHRyeSB0byBkbyBzbyBhZ2FpbiBhbmQgZmFsbAorICAjIGluIGFuIGluZmluaXRlIGxvb3AuICBUaGlzIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGluIHByYWN0aWNlLgorICBfYXNfY2FuX3JlZXhlYz1ubzsgZXhwb3J0IF9hc19jYW5fcmVleGVjCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorICAuICIuLyRhc19tZS5saW5lbm8iCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAorLW4qKQorICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CisgIGVzYWM7OworKikKKyAgRUNIT19OPSctbic7OworZXNhYworCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCitmaQoraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPSdsbiAtcycKKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wUicuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXBSJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZmkKK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXBSJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX3Rlc3RfeD0ndGVzdCAteCcKK2FzX2V4ZWN1dGFibGVfcD1hc19mbl9leGVjdXRhYmxlX3AKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK3Rlc3QgLW4gIiRESkRJUiIgfHwgZXhlYyA3PCYwIDwvZGV2L251bGwKK2V4ZWMgNj4mMQorCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBvbGQgR05VL0xpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKK2FjX2NsZWFuX2ZpbGVzPQorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorTElCT0JKUz0KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9CitQQUNLQUdFX1RBUk5BTUU9CitQQUNLQUdFX1ZFUlNJT049CitQQUNLQUdFX1NUUklORz0KK1BBQ0tBR0VfQlVHUkVQT1JUPQorUEFDS0FHRV9VUkw9CisKK2FjX3VuaXF1ZV9maWxlPSJsaWIvZGV2aWNlL2Rldi1jYWNoZS5oIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19oZWFkZXJfbGlzdD0KK2FjX2Z1bmNfbGlzdD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IKK2FjX3N1YnN0X3ZhcnM9J0xUTElCT0JKUwordXNyc2JpbmRpcgordXNybGliZGlyCit0bXBmaWxlc2Rpcgorc3lzdGVtZHV0aWxkaXIKK3N5c3RlbWRzeXN0ZW11bml0ZGlyCit1ZGV2ZGlyCit1ZGV2X3ByZWZpeAordG1wZGlyCitrZXJuZWx2c24KK21pc3NpbmdrZXJuZWwKK2tlcm5lbGRpcgoraW50ZXJmYWNlCitDTUlSUk9SRF9QSURGSUxFCitDTFZNRF9QSURGSUxFCitMVk1MT0NLRF9QSURGSUxFCitMVk1QT0xMRF9QSURGSUxFCitMVk1FVEFEX1BJREZJTEUKK0RNRVZFTlREX1BJREZJTEUKK1dSSVRFX0lOU1RBTEwKK1ZBTEdSSU5EX1BPT0wKK1VTRV9UUkFDS0lORworVURFVl9IQVNfQlVJTFRJTl9CTEtJRAorVURFVl9SVUxFX0VYRUNfREVURUNUSU9OCitVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTCitVREVWX1NZTkMKK1VERVZfUlVMRVMKK1VERVZfUEMKK1RISU4KK1RFU1RTVUlURV9EQVRBCitURVNUSU5HCitTVEFUSUNfTElOSworU1RBVElDRElSCitTTkFQU0hPVFMKK1NFTElOVVhfUEMKK1NFTElOVVhfTElCUworUkVQTElDQVRPUlMKK1JFQURMSU5FX0xJQlMKK1JUX0xJQgorUkFJRAorUFlUSE9OM0RJUgorUFlUSE9OMkRJUgorUFlUSE9OM19MSUJESVJTCitQWVRIT04yX0xJQkRJUlMKK1BZVEhPTjNfSU5DRElSUworUFlUSE9OMl9JTkNESVJTCitQWVRIT04zX0JJTkRJTkdTCitQWVRIT04yX0JJTkRJTkdTCitQWVRIT05fQklORElOR1MKK1BZVEhPTjMKK1BUSFJFQURfTElCUworTV9MSUJTCitQT09MCitQS0dDT05GSUcKK09DRkRJUgorT0NGCitNSVJST1JTCitNQU5HTElORworTFZNX1JFTEVBU0VfREFURQorTFZNX1JFTEVBU0UKK0xWTV9QQVRICitMVk1fUEFUQ0hMRVZFTAorTFZNX01JTk9SCitMVk1fTUFKT1IKK0xWTV9MSUJBUEkKK0xWTV9WRVJTSU9OCitMVk0xX0ZBTExCQUNLCitMVk0xCitMSUJfU1VGRklYCitMRERFUFMKK0pPQlMKK0lOVEwKK0hBVkVfVkFMR1JJTkQKK0hBVkVfUkVBTFRJTUUKK0hBVkVfTElCREwKK0JMS0RFQUNUSVZBVEUKK0ZTQURNCitFTERGTEFHUworRE1fTElCX1BBVENITEVWRUwKK0RNRVZFTlREX1BBVEgKK0RNRVZFTlRECitETF9MSUJTCitERVZNQVBQRVIKK0RFRkFVTFRfVVNFX0xWTUxPQ0tECitERUZBVUxUX1VTRV9MVk1QT0xMRAorREVGQVVMVF9VU0VfTFZNRVRBRAorREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HCitERUZBVUxUX1NZU19ESVIKK0RFRkFVTFRfU1BBUlNFX1NFR1RZUEUKK0RFRkFVTFRfUlVOX0RJUgorREVGQVVMVF9SQUlEMTBfU0VHVFlQRQorREVGQVVMVF9QUk9GSUxFX1NVQkRJUgorREVGQVVMVF9QSURfRElSCitERUZBVUxUX01JUlJPUl9TRUdUWVBFCitERUZBVUxUX0ZBTExCQUNLX1RPX0xWTTEKK0RFRkFVTFRfTE9DS19ESVIKK0RFRkFVTFRfRE1fUlVOX0RJUgorREVGQVVMVF9EQVRBX0FMSUdOTUVOVAorREVGQVVMVF9DQUNIRV9TVUJESVIKK0RFRkFVTFRfQkFDS1VQX1NVQkRJUgorREVGQVVMVF9BUkNISVZFX1NVQkRJUgorREVCVUcKK0NPUFRJTUlTRV9GTEFHCitDT05GRElSCitDTURMSUIKK0NMVk1EX1BBVEgKK0NMVk1EX0NNQU5BR0VSUworQ0xWTUQKK0NMVVNURVIKK0NMRFdIT0xFQVJDSElWRQorQ0xETk9XSE9MRUFSQ0hJVkUKK0NMREZMQUdTCitDQUNIRQorQlVJTERfTk9USUZZREJVUworQlVJTERfTE9DS0RETE0KK0JVSUxEX0xPQ0tEU0FOTE9DSworQlVJTERfTFZNTE9DS0QKK0JVSUxEX0xWTVBPTExECitCVUlMRF9MVk1FVEFECitCVUlMRF9MVk1EQlVTRAorQlVJTERfRE1FVkVOVEQKK0JVSUxEX0NNSVJST1JECitCTEtJRF9QQworQVBQTElCCitNT0RQUk9CRV9DTUQKK01TR0ZNVAorUFlUSE9OM19DT05GSUcKK1BZVEhPTjJfQ09ORklHCitQWVRIT04yCitwa2dweWV4ZWNkaXIKK3B5ZXhlY2RpcgorcGtncHl0aG9uZGlyCitweXRob25kaXIKK1BZVEhPTl9QTEFURk9STQorUFlUSE9OX0VYRUNfUFJFRklYCitQWVRIT05fUFJFRklYCitQWVRIT05fVkVSU0lPTgorUFlUSE9OCitMVk0yQ01EX0xJQgorTFZNMkFQUF9MSUIKK1VERVZfTElCUworVURFVl9DRkxBR1MKK1NZU1RFTURfTElCUworU1lTVEVNRF9DRkxBR1MKK0JMS0lEX0xJQlMKK0JMS0lEX0NGTEFHUworTk9USUZZX0RCVVNfTElCUworTk9USUZZX0RCVVNfQ0ZMQUdTCitMT0NLRF9ETE1fTElCUworTE9DS0RfRExNX0NGTEFHUworTE9DS0RfU0FOTE9DS19MSUJTCitMT0NLRF9TQU5MT0NLX0NGTEFHUworVkFMR1JJTkRfTElCUworVkFMR1JJTkRfQ0ZMQUdTCitDVU5JVF9MSUJTCitDVU5JVF9DRkxBR1MKK0dFTlBORworR0VOSFRNTAorTENPVgorSEFWRV9XU1lOQ05BTkQKK0hBVkVfV0NMT0JCRVJFRAorSEFWRV9XSlVNUAorU0FDS1BUX0xJQlMKK1NBQ0tQVF9DRkxBR1MKK0RMTV9MSUJTCitETE1fQ0ZMQUdTCitDUEdfTElCUworQ1BHX0NGTEFHUworQ01BUF9MSUJTCitDTUFQX0NGTEFHUworQ09ORkRCX0xJQlMKK0NPTkZEQl9DRkxBR1MKK1NBTENLX0xJQlMKK1NBTENLX0NGTEFHUworUVVPUlVNX0xJQlMKK1FVT1JVTV9DRkxBR1MKK0NPUk9TWU5DX0xJQlMKK0NPUk9TWU5DX0NGTEFHUworQ01BTl9MSUJTCitDTUFOX0NGTEFHUworUEtHQ09ORklHSU5JVF9MSUJTCitQS0dDT05GSUdJTklUX0NGTEFHUworUEtHX0NPTkZJR19MSUJESVIKK1BLR19DT05GSUdfUEFUSAorUEtHX0NPTkZJRworQ0FDSEVfUkVTVE9SRV9DTUQKK0NBQ0hFX1JFUEFJUl9DTUQKK0NBQ0hFX0RVTVBfQ01ECitDQUNIRV9DSEVDS19DTUQKK1RISU5fUkVTVE9SRV9DTUQKK1RISU5fUkVQQUlSX0NNRAorVEhJTl9EVU1QX0NNRAorVEhJTl9DSEVDS19DTUQKK0hBVkVfRlVMTF9SRUxSTworSEFWRV9QSUUKK1BPV19MSUIKK0xJQk9CSlMKK0FMTE9DQQorQ0hNT0QKK0NTQ09QRV9DTUQKK0NGTE9XX0NNRAorUkFOTElCCitNS0RJUl9QCitTRVRfTUFLRQorTE5fUworSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCitFR1JFUAorR1JFUAorQ1BQCithY19jdF9DWFgKK0NYWEZMQUdTCitDWFgKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUworQ0MKK0FXSworU0VECit0YXJnZXRfb3MKK3RhcmdldF92ZW5kb3IKK3RhcmdldF9jcHUKK3RhcmdldAoraG9zdF9vcworaG9zdF92ZW5kb3IKK2hvc3RfY3B1Citob3N0CitidWlsZF9vcworYnVpbGRfdmVuZG9yCitidWlsZF9jcHUKK2J1aWxkCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcKK2VuYWJsZV9zdGF0aWNfbGluaword2l0aF91c2VyCit3aXRoX2dyb3VwCit3aXRoX2RldmljZV91aWQKK3dpdGhfZGV2aWNlX2dpZAord2l0aF9kZXZpY2VfbW9kZQord2l0aF9kZXZpY2Vfbm9kZXNfb24KK3dpdGhfZGVmYXVsdF9uYW1lX21hbmdsaW5nCitlbmFibGVfbHZtMV9mYWxsYmFjaword2l0aF9sdm0xCit3aXRoX3Bvb2wKK3dpdGhfY2x1c3Rlcgord2l0aF9zbmFwc2hvdHMKK3dpdGhfbWlycm9ycword2l0aF9yYWlkCit3aXRoX2RlZmF1bHRfbWlycm9yX3NlZ3R5cGUKK3dpdGhfZGVmYXVsdF9yYWlkMTBfc2VndHlwZQord2l0aF9yZXBsaWNhdG9ycword2l0aF9kZWZhdWx0X3NwYXJzZV9zZWd0eXBlCit3aXRoX3RoaW4KK3dpdGhfdGhpbl9jaGVjaword2l0aF90aGluX2R1bXAKK3dpdGhfdGhpbl9yZXBhaXIKK3dpdGhfdGhpbl9yZXN0b3JlCitlbmFibGVfdGhpbl9jaGVja19uZWVkc19jaGVjaword2l0aF9jYWNoZQord2l0aF9jYWNoZV9jaGVjaword2l0aF9jYWNoZV9kdW1wCit3aXRoX2NhY2hlX3JlcGFpcgord2l0aF9jYWNoZV9yZXN0b3JlCitlbmFibGVfY2FjaGVfY2hlY2tfbmVlZHNfY2hlY2sKK2VuYWJsZV9yZWFkbGluZQorZW5hYmxlX3JlYWx0aW1lCitlbmFibGVfb2NmCit3aXRoX29jZmRpcgord2l0aF9kZWZhdWx0X3BpZF9kaXIKK3dpdGhfZGVmYXVsdF9kbV9ydW5fZGlyCit3aXRoX2RlZmF1bHRfcnVuX2Rpcgord2l0aF9jbHZtZAord2l0aF9jbHZtZF9waWRmaWxlCitlbmFibGVfY21pcnJvcmQKK3dpdGhfY21pcnJvcmRfcGlkZmlsZQorZW5hYmxlX2RlYnVnCit3aXRoX29wdGltaXNhdGlvbgorZW5hYmxlX3Byb2ZpbGluZworZW5hYmxlX3Rlc3RpbmcKK2VuYWJsZV92YWxncmluZF9wb29sCitlbmFibGVfZGV2bWFwcGVyCitlbmFibGVfbHZtZXRhZAorZW5hYmxlX2x2bXBvbGxkCitlbmFibGVfbG9ja2Rfc2FubG9jaworZW5hYmxlX2xvY2tkX2RsbQorZW5hYmxlX3VzZV9sdm1sb2NrZAord2l0aF9sdm1sb2NrZF9waWRmaWxlCitlbmFibGVfdXNlX2x2bWV0YWQKK3dpdGhfbHZtZXRhZF9waWRmaWxlCitlbmFibGVfdXNlX2x2bXBvbGxkCit3aXRoX2x2bXBvbGxkX3BpZGZpbGUKK2VuYWJsZV9ub3RpZnlfZGJ1cworZW5hYmxlX2Jsa2lkX3dpcGluZworZW5hYmxlX3VkZXZfc3lzdGVtZF9iYWNrZ3JvdW5kX2pvYnMKK2VuYWJsZV91ZGV2X3N5bmMKK2VuYWJsZV91ZGV2X3J1bGVzCitlbmFibGVfdWRldl9ydWxlX2V4ZWNfZGV0ZWN0aW9uCitlbmFibGVfY29tcGF0CitlbmFibGVfdW5pdHNfY29tcGF0CitlbmFibGVfaW9jdGwKK2VuYWJsZV9vX2RpcmVjdAorZW5hYmxlX2FwcGxpYgorZW5hYmxlX2NtZGxpYgorZW5hYmxlX2RidXNfc2VydmljZQorZW5hYmxlX3B5dGhvbl9iaW5kaW5ncworZW5hYmxlX3B5dGhvbjJfYmluZGluZ3MKK2VuYWJsZV9weXRob24zX2JpbmRpbmdzCitlbmFibGVfcGtnY29uZmlnCitlbmFibGVfd3JpdGVfaW5zdGFsbAorZW5hYmxlX2ZzYWRtCitlbmFibGVfYmxrZGVhY3RpdmF0ZQorZW5hYmxlX2RtZXZlbnRkCitlbmFibGVfc2VsaW51eAorZW5hYmxlX25scword2l0aF9sb2NhbGVkaXIKK3dpdGhfY29uZmRpcgord2l0aF9zdGF0aWNkaXIKK3dpdGhfdXNybGliZGlyCit3aXRoX3VzcnNiaW5kaXIKK3dpdGhfdWRldl9wcmVmaXgKK3dpdGhfdWRldmRpcgord2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcgord2l0aF90bXBmaWxlc2Rpcgord2l0aF9kbWV2ZW50ZF9waWRmaWxlCit3aXRoX2RtZXZlbnRkX3BhdGgKK3dpdGhfZGVmYXVsdF9zeXN0ZW1fZGlyCit3aXRoX2RlZmF1bHRfcHJvZmlsZV9zdWJkaXIKK3dpdGhfZGVmYXVsdF9hcmNoaXZlX3N1YmRpcgord2l0aF9kZWZhdWx0X2JhY2t1cF9zdWJkaXIKK3dpdGhfZGVmYXVsdF9jYWNoZV9zdWJkaXIKK3dpdGhfZGVmYXVsdF9sb2NraW5nX2Rpcgord2l0aF9kZWZhdWx0X2RhdGFfYWxpZ25tZW50Cit3aXRoX2ludGVyZmFjZQorJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1BQCitQS0dfQ09ORklHCitQS0dfQ09ORklHX1BBVEgKK1BLR19DT05GSUdfTElCRElSCitQS0dDT05GSUdJTklUX0NGTEFHUworUEtHQ09ORklHSU5JVF9MSUJTCitDTUFOX0NGTEFHUworQ01BTl9MSUJTCitDT1JPU1lOQ19DRkxBR1MKK0NPUk9TWU5DX0xJQlMKK1FVT1JVTV9DRkxBR1MKK1FVT1JVTV9MSUJTCitTQUxDS19DRkxBR1MKK1NBTENLX0xJQlMKK0NPTkZEQl9DRkxBR1MKK0NPTkZEQl9MSUJTCitDTUFQX0NGTEFHUworQ01BUF9MSUJTCitDUEdfQ0ZMQUdTCitDUEdfTElCUworRExNX0NGTEFHUworRExNX0xJQlMKK1NBQ0tQVF9DRkxBR1MKK1NBQ0tQVF9MSUJTCitDVU5JVF9DRkxBR1MKK0NVTklUX0xJQlMKK1ZBTEdSSU5EX0NGTEFHUworVkFMR1JJTkRfTElCUworTE9DS0RfU0FOTE9DS19DRkxBR1MKK0xPQ0tEX1NBTkxPQ0tfTElCUworTE9DS0RfRExNX0NGTEFHUworTE9DS0RfRExNX0xJQlMKK05PVElGWV9EQlVTX0NGTEFHUworTk9USUZZX0RCVVNfTElCUworQkxLSURfQ0ZMQUdTCitCTEtJRF9MSUJTCitTWVNURU1EX0NGTEFHUworU1lTVEVNRF9MSUJTCitVREVWX0NGTEFHUworVURFVl9MSUJTCitQWVRIT04nCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisKK2FjX3ByZXY9CithY19kYXNoZGFzaD0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqPSkgICBhY19vcHRhcmc9IDs7CisgICopICAgIGFjX29wdGFyZz15ZXMgOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCisgIC0tKQorICAgIGFjX2Rhc2hkYXNoPXllcyA7OworCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1kaXNhYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCisgICAgYWNfcHJldj1odG1sZGlyIDs7CisgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorICB8IC0taHQ9KikKKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorICAgIGFjX3ByZXY9cGRmZGlyIDs7CisgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCisgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQorICAgIGFjX3ByZXY9cHNkaXIgOzsKKyAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCisgICAgcHNkaXI9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGhvdXQtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAiJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCisgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KKyAgICBubykgOzsKKyAgICBmYXRhbCkgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworICBlc2FjCitmaQorCisjIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgICovICkKKyAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgZXNhYworICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIGFzX2ZuX2Vycm9yICQ/ICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICBhc19mbl9lcnJvciAkPyAid29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiCit0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKyAgYXNfZm5fZXJyb3IgJD8gInB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIKKworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX215c2VsZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiCitmaQorYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorYWNfYWJzX2NvbmZkaXI9YCgKKwljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IGFzX2ZuX2Vycm9yICQ/ICIkYWNfbXNnIgorCXB3ZClgCisjIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgoraWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorICBzcmNkaXI9LgorZmkKKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCisjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKyMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgorY2FzZSAkc3JjZGlyIGluCisqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKK2VzYWMKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Citkb25lCisKKyMKKyMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KKyMKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCisgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgIGNhdCA8PF9BQ0VPRgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgdGhpcyBwYWNrYWdlIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCisKK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKK1ZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCisKK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorCitDb25maWd1cmF0aW9uOgorICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCisgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvUEFDS0FHRV0KKyAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgY29uZmlndXJlIGZvciBidWlsZGluZyBjb21waWxlcnMgZm9yIFRBUkdFVCBbSE9TVF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKworICBjYXQgPDxcX0FDRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQuCisgIC0tZW5hYmxlLXN0YXRpY19saW5rICAgIHVzZSB0aGlzIHRvIGxpbmsgdGhlIHRvb2xzIHRvIHRoZWlyIGxpYnJhcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNhbGx5IChkZWZhdWx0IGlzIGR5bmFtaWMgbGlua2luZworICAtLWVuYWJsZS1sdm0xX2ZhbGxiYWNrICB1c2UgdGhpcyB0byBmYWxsIGJhY2sgYW5kIHVzZSBMVk0xIGJpbmFyaWVzIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS1tYXBwZXIgaXMgbWlzc2luZyBmcm9tIHRoZSBrZXJuZWwKKyAgLS1kaXNhYmxlLXRoaW5fY2hlY2tfbmVlZHNfY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWYgdGhpbl9jaGVjayB2ZXJzaW9uIGlzIDwgMC4zLjAKKyAgLS1kaXNhYmxlLWNhY2hlX2NoZWNrX25lZWRzX2NoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGlmIGNhY2hlX2NoZWNrIHZlcnNpb24gaXMgPCAwLjUKKyAgLS1kaXNhYmxlLXJlYWRsaW5lICAgICAgZGlzYWJsZSByZWFkbGluZSBzdXBwb3J0CisgIC0tZGlzYWJsZS1yZWFsdGltZSAgICAgIGRpc2FibGUgcmVhbHRpbWUgY2xvY2sgc3VwcG9ydAorICAtLWVuYWJsZS1vY2YgICAgICAgICAgICBlbmFibGUgT3BlbiBDbHVzdGVyIEZyYW1ld29yayAoT0NGKSBjb21wbGlhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgYWdlbnRzCisgIC0tZW5hYmxlLWNtaXJyb3JkICAgICAgIGVuYWJsZSB0aGUgY2x1c3RlciBtaXJyb3IgbG9nIGRhZW1vbgorICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBlbmFibGUgZGVidWdnaW5nCisgIC0tZW5hYmxlLXByb2ZpbGluZyAgICAgIGdhdGhlciBnY292IHByb2ZpbGluZyBkYXRhCisgIC0tZW5hYmxlLXRlc3RpbmcgICAgICAgIGVuYWJsZSB0ZXN0aW5nIHRhcmdldHMgaW4gdGhlIG1ha2VmaWxlCisgIC0tZW5hYmxlLXZhbGdyaW5kLXBvb2wgIGVuYWJsZSB2YWxncmluZCBhd2FyZW5lc3Mgb2YgcG9vbHMKKyAgLS1kaXNhYmxlLWRldm1hcHBlciAgICAgZGlzYWJsZSBMVk0yIGRldmljZS1tYXBwZXIgaW50ZXJhY3Rpb24KKyAgLS1lbmFibGUtbHZtZXRhZCAgICAgICAgZW5hYmxlIHRoZSBMVk0gTWV0YWRhdGEgRGFlbW9uCisgIC0tZW5hYmxlLWx2bXBvbGxkICAgICAgIGVuYWJsZSB0aGUgTFZNIFBvbGxpbmcgRGFlbW9uCisgIC0tZW5hYmxlLWxvY2tkLXNhbmxvY2sgIGVuYWJsZSB0aGUgTFZNIGxvY2sgZGFlbW9uIHVzaW5nIHNhbmxvY2sKKyAgLS1lbmFibGUtbG9ja2QtZGxtICAgICAgZW5hYmxlIHRoZSBMVk0gbG9jayBkYWVtb24gdXNpbmcgZGxtCisgIC0tZGlzYWJsZS11c2UtbHZtbG9ja2QgIGRpc2FibGUgdXNhZ2Ugb2YgTFZNIGxvY2sgZGFlbW9uCisgIC0tZGlzYWJsZS11c2UtbHZtZXRhZCAgIGRpc2FibGUgdXNhZ2Ugb2YgTFZNIE1ldGFkYXRhIERhZW1vbgorICAtLWRpc2FibGUtdXNlLWx2bXBvbGxkICBkaXNhYmxlIHVzYWdlIG9mIExWTSBQb2xsIERhZW1vbgorICAtLWVuYWJsZS1ub3RpZnktZGJ1cyAgICBlbmFibGUgTFZNIG5vdGlmaWNhdGlvbiB1c2luZyBkYnVzCisgIC0tZGlzYWJsZS1ibGtpZF93aXBpbmcgIGRpc2FibGUgbGliYmxraWQgZGV0ZWN0aW9uIG9mIHNpZ25hdHVyZXMgd2hlbiB3aXBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZSBuYXRpdmUgY29kZSBpbnN0ZWFkCisgIC0tZGlzYWJsZS11ZGV2LXN5c3RlbWQtYmFja2dyb3VuZC1qb2JzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdWRldi1zeXN0ZW1kIHByb3RvY29sIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSBmb3IgYmFja2dyb3VuZCBqb2IKKyAgLS1lbmFibGUtdWRldl9zeW5jICAgICAgZW5hYmxlIHN5bmNocm9uaXNhdGlvbiB3aXRoIHVkZXYgcHJvY2Vzc2luZworICAtLWVuYWJsZS11ZGV2X3J1bGVzICAgICBpbnN0YWxsIHJ1bGUgZmlsZXMgbmVlZGVkIGZvciB1ZGV2IHN5bmNocm9uaXNhdGlvbgorICAtLWVuYWJsZS11ZGV2LXJ1bGUtZXhlYy1kZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIGV4ZWN1dGFibGUgcGF0aCBkZXRlY3Rpb24gaW4gdWRldiBydWxlcworICAtLWVuYWJsZS1jb21wYXQgICAgICAgICBlbmFibGUgc3VwcG9ydCBmb3Igb2xkIGRldmljZS1tYXBwZXIgdmVyc2lvbnMKKyAgLS1lbmFibGUtdW5pdHMtY29tcGF0ICAgZW5hYmxlIG91dHB1dCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkbyBub3QgdXNlIEtpQi1zdHlsZSB1bml0IHN1ZmZpeGVzCisgIC0tZGlzYWJsZS1pb2N0bCAgICAgICAgIGRpc2FibGUgaW9jdGwgY2FsbHMgdG8gZGV2aWNlLW1hcHBlciBpbiB0aGUga2VybmVsCisgIC0tZGlzYWJsZS1vX2RpcmVjdCAgICAgIGRpc2FibGUgT19ESVJFQ1QKKyAgLS1lbmFibGUtYXBwbGliICAgICAgICAgYnVpbGQgYXBwbGljYXRpb24gbGlicmFyeQorICAtLWVuYWJsZS1jbWRsaWIgICAgICAgICBidWlsZCBzaGFyZWQgY29tbWFuZCBsaWJyYXJ5CisgIC0tZW5hYmxlLWRidXMtc2VydmljZSAgIGluc3RhbGwgRC1CdXMgc3VwcG9ydAorICAtLWVuYWJsZS1weXRob25fYmluZGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgZGVmYXVsdCBQeXRob24gYXBwbGliIGJpbmRpbmdzCisgIC0tZW5hYmxlLXB5dGhvbjJfYmluZGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgUHl0aG9uMiBhcHBsaWIgYmluZGluZ3MKKyAgLS1lbmFibGUtcHl0aG9uM19iaW5kaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCBQeXRob24zIGFwcGxpYiBiaW5kaW5ncworICAtLWVuYWJsZS1wa2djb25maWcgICAgICBpbnN0YWxsIHBrZ2NvbmZpZyBzdXBwb3J0CisgIC0tZW5hYmxlLXdyaXRlX2luc3RhbGwgIGluc3RhbGwgdXNlciB3cml0YWJsZSBmaWxlcworICAtLWRpc2FibGUtZnNhZG0gICAgICAgICBkaXNhYmxlIGZzYWRtCisgIC0tZGlzYWJsZS1ibGtkZWFjdGl2YXRlIGRpc2FibGUgYmxrZGVhY3RpdmF0ZQorICAtLWVuYWJsZS1kbWV2ZW50ZCAgICAgICBlbmFibGUgdGhlIGRldmljZS1tYXBwZXIgZXZlbnQgZGFlbW9uCisgIC0tZGlzYWJsZS1zZWxpbnV4ICAgICAgIGRpc2FibGUgc2VsaW51eCBzdXBwb3J0CisgIC0tZW5hYmxlLW5scyAgICAgICAgICAgIGVuYWJsZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorCitPcHRpb25hbCBQYWNrYWdlczoKKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS13aXRoLXVzZXI9VVNFUiAgICAgICAgc2V0IHRoZSBvd25lciBvZiBpbnN0YWxsZWQgZmlsZXMgW1VTRVI9XQorICAtLXdpdGgtZ3JvdXA9R1JPVVAgICAgICBzZXQgdGhlIGdyb3VwIG93bmVyIG9mIGluc3RhbGxlZCBmaWxlcyBbR1JPVVA9XQorICAtLXdpdGgtZGV2aWNlLXVpZD1VSUQgICBzZXQgdGhlIG93bmVyIHVzZWQgZm9yIG5ldyBkZXZpY2Ugbm9kZXMgW1VJRD0wXQorICAtLXdpdGgtZGV2aWNlLWdpZD1HSUQgICBzZXQgdGhlIGdyb3VwIHVzZWQgZm9yIG5ldyBkZXZpY2Ugbm9kZXMgW0dJRD0wXQorICAtLXdpdGgtZGV2aWNlLW1vZGU9TU9ERSBzZXQgdGhlIG1vZGUgdXNlZCBmb3IgbmV3IGRldmljZSBub2RlcyBbTU9ERT0wNjAwXQorICAtLXdpdGgtZGV2aWNlLW5vZGVzLW9uPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSBub2RlcyBvbiByZXN1bWUgb3IgY3JlYXRlIFtPTj1yZXN1bWVdCisgIC0td2l0aC1kZWZhdWx0LW5hbWUtbWFuZ2xpbmc9TUFOR0xJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1lIG1hbmdsaW5nOiBhdXRvL25vbmUvaGV4IFthdXRvXQorICAtLXdpdGgtbHZtMT1UWVBFICAgICAgICBMVk0xIG1ldGFkYXRhIHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbF0KKyAgLS13aXRoLXBvb2w9VFlQRSAgICAgICAgR0ZTIHBvb2wgcmVhZC1vbmx5IHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbF0KKyAgLS13aXRoLWNsdXN0ZXI9VFlQRSAgICAgY2x1c3RlciBMVk0gbG9ja2luZyBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50ZXJuYWxdCisgIC0td2l0aC1zbmFwc2hvdHM9VFlQRSAgIHNuYXBzaG90IHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF0KKyAgLS13aXRoLW1pcnJvcnM9VFlQRSAgICAgbWlycm9yIHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF0KKyAgLS13aXRoLXJhaWQ9VFlQRSAgICAgICAgcmFpZCBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdCisgIC0td2l0aC1kZWZhdWx0LW1pcnJvci1zZWd0eXBlPVRZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBtaXJyb3Igc2VndHlwZTogcmFpZDEvbWlycm9yIFtyYWlkMV0KKyAgLS13aXRoLWRlZmF1bHQtcmFpZDEwLXNlZ3R5cGU9VFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IG1pcnJvciBzZWd0eXBlOiByYWlkMTAvbWlycm9yIFtyYWlkMTBdCisgIC0td2l0aC1yZXBsaWNhdG9ycz1UWVBFIHJlcGxpY2F0b3Igc3VwcG9ydDogaW50ZXJuYWwvc2hhcmVkL25vbmUgW25vbmVdCisgIC0td2l0aC1kZWZhdWx0LXNwYXJzZS1zZWd0eXBlPVRZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzcGFyc2Ugc2VndHlwZTogdGhpbi9zbmFwc2hvdCBbdGhpbl0KKyAgLS13aXRoLXRoaW49VFlQRSAgICAgICAgdGhpbiBwcm92aXNpb25pbmcgc3VwcG9ydDogaW50ZXJuYWwvc2hhcmVkL25vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2ludGVybmFsXQorICAtLXdpdGgtdGhpbi1jaGVjaz1QQVRIICB0aGluX2NoZWNrIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtdGhpbi1kdW1wPVBBVEggICB0aGluX2R1bXAgdG9vbDogW2F1dG9kZXRlY3RdCisgIC0td2l0aC10aGluLXJlcGFpcj1QQVRIIHRoaW5fcmVwYWlyIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtdGhpbi1yZXN0b3JlPVBBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbl9yZXN0b3JlIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtY2FjaGU9VFlQRSAgICAgICBjYWNoZSBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdCisgIC0td2l0aC1jYWNoZS1jaGVjaz1QQVRIIGNhY2hlX2NoZWNrIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtY2FjaGUtZHVtcD1QQVRIICBjYWNoZV9kdW1wIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtY2FjaGUtcmVwYWlyPVBBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfcmVwYWlyIHRvb2w6IFthdXRvZGV0ZWN0XQorICAtLXdpdGgtY2FjaGUtcmVzdG9yZT1QQVRICisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3Jlc3RvcmUgdG9vbDogW2F1dG9kZXRlY3RdCisgIC0td2l0aC1vY2ZkaXI9RElSICAgICAgIGluc3RhbGwgT0NGIGZpbGVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvbGliL29jZi9yZXNvdXJjZS5kL2x2bTJdCisgIC0td2l0aC1kZWZhdWx0LXBpZC1kaXI9UElEX0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGRpcmVjdG9yeSB0byBrZWVwIFBJRCBmaWxlcyBpbi4gW2F1dG9kZXRlY3RdCisgIC0td2l0aC1kZWZhdWx0LWRtLXJ1bi1kaXI9RE1fUlVOX0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IERNIHJ1biBkaXJlY3RvcnkuIFthdXRvZGV0ZWN0XQorICAtLXdpdGgtZGVmYXVsdC1ydW4tZGlyPVJVTl9ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBMVk0gcnVuIGRpcmVjdG9yeS4gW2F1dG9kZXRlY3RfcnVuX2Rpci9sdm1dCisgIC0td2l0aC1jbHZtZD1UWVBFICAgICAgIGJ1aWxkIGNsdXN0ZXIgTFZNIERhZW1vbgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNsdXN0ZXIgbWFuYWdlciBjb21iaW5hdGlvbnMgYXJlIHZhbGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjbWFuICAgICAgICAgICAgICAgICAgKFJIRUw1IG9yIGVxdWl2YWxlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNtYW4sY29yb3N5bmMsb3BlbmFpcyAob3Igc2VsZWN0aW9uIG9mIHRoZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmdsZW5vZGUgICAgICAgICAgICAobG9jYWxob3N0IG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCAgICAgICAgICAgICAgICAgICAoYXV0b2RldGVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogbm9uZSAgICAgICAgICAgICAgICAgIChkaXNhYmxlIGJ1aWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgICBbbm9uZV0KKyAgLS13aXRoLWNsdm1kLXBpZGZpbGU9UEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZtZCBwaWRmaWxlIFtQSURfRElSL2Nsdm1kLnBpZF0KKyAgLS13aXRoLWNtaXJyb3JkLXBpZGZpbGU9UEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbWlycm9yZCBwaWRmaWxlIFtQSURfRElSL2NtaXJyb3JkLnBpZF0KKyAgLS13aXRoLW9wdGltaXNhdGlvbj1PUFQgQyBvcHRpbWlzYXRpb24gZmxhZyBbT1BUPS1PMl0KKyAgLS13aXRoLWx2bWxvY2tkLXBpZGZpbGU9UEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICBsdm1sb2NrZCBwaWRmaWxlIFtQSURfRElSL2x2bWxvY2tkLnBpZF0KKyAgLS13aXRoLWx2bWV0YWQtcGlkZmlsZT1QQVRICisgICAgICAgICAgICAgICAgICAgICAgICAgIGx2bWV0YWQgcGlkZmlsZSBbUElEX0RJUi9sdm1ldGFkLnBpZF0KKyAgLS13aXRoLWx2bXBvbGxkLXBpZGZpbGU9UEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICBsdm1wb2xsZCBwaWRmaWxlIFtQSURfRElSL2x2bXBvbGxkLnBpZF0KKyAgLS13aXRoLWxvY2FsZWRpcj1ESVIgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0td2l0aC1jb25mZGlyPURJUiAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gRElSIFsvZXRjXQorICAtLXdpdGgtc3RhdGljZGlyPURJUiAgICBzdGF0aWMgYmluYXJpZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0td2l0aC11c3JsaWJkaXI9RElSICAgIHVzcmxpYiBpbiBESVIgW1BSRUZJWC9saWJdCisgIC0td2l0aC11c3JzYmluZGlyPURJUiAgIHVzcnNiaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtQUkVGSVgvc2Jpbl0KKyAgLS13aXRoLXVkZXYtcHJlZml4PVVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCB1ZGV2IHJ1bGUgZmlsZXMgaW4gVVBSRUZJWCBbRVBSRUZJWF0KKyAgLS13aXRoLXVkZXZkaXI9RElSICAgICAgdWRldiBydWxlcyBpbiBESVIgW1VQUkVGSVgvbGliL3VkZXYvcnVsZXMuZF0KKyAgLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPURJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1kIHNlcnZpY2UgZmlsZXMgaW4gRElSCisgIC0td2l0aC10bXBmaWxlc2Rpcj1ESVIgIGluc3RhbGwgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgbWFuYWdlbWVudCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvbGliL3RtcGZpbGVzLmRdCisgIC0td2l0aC1kbWV2ZW50ZC1waWRmaWxlPVBBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG1ldmVudGQgcGlkZmlsZSBbUElEX0RJUi9kbWV2ZW50ZC5waWRdCisgIC0td2l0aC1kbWV2ZW50ZC1wYXRoPVBBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG1ldmVudGQgcGF0aCBbRVBSRUZJWC9zYmluL2RtZXZlbnRkXQorICAtLXdpdGgtZGVmYXVsdC1zeXN0ZW0tZGlyPURJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IExWTSBzeXN0ZW0gZGlyZWN0b3J5IFsvZXRjL2x2bV0KKyAgLS13aXRoLWRlZmF1bHQtcHJvZmlsZS1zdWJkaXI9U1VCRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwcm9maWxlIHN1YmRpciBbcHJvZmlsZV0KKyAgLS13aXRoLWRlZmF1bHQtYXJjaGl2ZS1zdWJkaXI9U1VCRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgbWV0YWRhdGEgYXJjaGl2ZSBzdWJkaXIgW2FyY2hpdmVdCisgIC0td2l0aC1kZWZhdWx0LWJhY2t1cC1zdWJkaXI9U1VCRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgbWV0YWRhdGEgYmFja3VwIHN1YmRpciBbYmFja3VwXQorICAtLXdpdGgtZGVmYXVsdC1jYWNoZS1zdWJkaXI9U1VCRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgbWV0YWRhdGEgY2FjaGUgc3ViZGlyIFtjYWNoZV0KKyAgLS13aXRoLWRlZmF1bHQtbG9ja2luZy1kaXI9RElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgbG9ja2luZyBkaXJlY3RvcnkgW2F1dG9kZXRlY3RfbG9ja19kaXIvbHZtXQorICAtLXdpdGgtZGVmYXVsdC1kYXRhLWFsaWdubWVudD1OVU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSBkZWZhdWx0IGRhdGEgYWxpZ25tZW50IGluIE1pQiBbMV0KKyAgLS13aXRoLWludGVyZmFjZT1JRkFDRSAgY2hvb3NlIGtlcm5lbCBpbnRlcmZhY2UgKGlvY3RsKSBbaW9jdGxdCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCisgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorICBQS0dfQ09ORklHICBwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eQorICBQS0dfQ09ORklHX1BBVEgKKyAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYWRkIHRvIHBrZy1jb25maWcncyBzZWFyY2ggcGF0aAorICBQS0dfQ09ORklHX0xJQkRJUgorICAgICAgICAgICAgICBwYXRoIG92ZXJyaWRpbmcgcGtnLWNvbmZpZydzIGJ1aWx0LWluIHNlYXJjaCBwYXRoCisgIFBLR0NPTkZJR0lOSVRfQ0ZMQUdTCisgICAgICAgICAgICAgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIFBLR0NPTkZJR0lOSVQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBQS0dDT05GSUdJTklUX0xJQlMKKyAgICAgICAgICAgICAgbGlua2VyIGZsYWdzIGZvciBQS0dDT05GSUdJTklULCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgQ01BTl9DRkxBR1MgQyBjb21waWxlciBmbGFncyBmb3IgQ01BTiwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENNQU5fTElCUyAgIGxpbmtlciBmbGFncyBmb3IgQ01BTiwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENPUk9TWU5DX0NGTEFHUworICAgICAgICAgICAgICBDIGNvbXBpbGVyIGZsYWdzIGZvciBDT1JPU1lOQywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENPUk9TWU5DX0xJQlMKKyAgICAgICAgICAgICAgbGlua2VyIGZsYWdzIGZvciBDT1JPU1lOQywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIFFVT1JVTV9DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgUVVPUlVNLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgUVVPUlVNX0xJQlMgbGlua2VyIGZsYWdzIGZvciBRVU9SVU0sIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBTQUxDS19DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgU0FMQ0ssIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBTQUxDS19MSUJTICBsaW5rZXIgZmxhZ3MgZm9yIFNBTENLLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgQ09ORkRCX0NGTEFHUworICAgICAgICAgICAgICBDIGNvbXBpbGVyIGZsYWdzIGZvciBDT05GREIsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBDT05GREJfTElCUyBsaW5rZXIgZmxhZ3MgZm9yIENPTkZEQiwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENNQVBfQ0ZMQUdTIEMgY29tcGlsZXIgZmxhZ3MgZm9yIENNQVAsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBDTUFQX0xJQlMgICBsaW5rZXIgZmxhZ3MgZm9yIENNQVAsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBDUEdfQ0ZMQUdTICBDIGNvbXBpbGVyIGZsYWdzIGZvciBDUEcsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBDUEdfTElCUyAgICBsaW5rZXIgZmxhZ3MgZm9yIENQRywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIERMTV9DRkxBR1MgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIERMTSwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIERMTV9MSUJTICAgIGxpbmtlciBmbGFncyBmb3IgRExNLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgU0FDS1BUX0NGTEFHUworICAgICAgICAgICAgICBDIGNvbXBpbGVyIGZsYWdzIGZvciBTQUNLUFQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBTQUNLUFRfTElCUyBsaW5rZXIgZmxhZ3MgZm9yIFNBQ0tQVCwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENVTklUX0NGTEFHUworICAgICAgICAgICAgICBDIGNvbXBpbGVyIGZsYWdzIGZvciBDVU5JVCwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIENVTklUX0xJQlMgIGxpbmtlciBmbGFncyBmb3IgQ1VOSVQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBWQUxHUklORF9DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgVkFMR1JJTkQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBWQUxHUklORF9MSUJTCisgICAgICAgICAgICAgIGxpbmtlciBmbGFncyBmb3IgVkFMR1JJTkQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBMT0NLRF9TQU5MT0NLX0NGTEFHUworICAgICAgICAgICAgICBDIGNvbXBpbGVyIGZsYWdzIGZvciBMT0NLRF9TQU5MT0NLLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgTE9DS0RfU0FOTE9DS19MSUJTCisgICAgICAgICAgICAgIGxpbmtlciBmbGFncyBmb3IgTE9DS0RfU0FOTE9DSywgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIExPQ0tEX0RMTV9DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgTE9DS0RfRExNLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgTE9DS0RfRExNX0xJQlMKKyAgICAgICAgICAgICAgbGlua2VyIGZsYWdzIGZvciBMT0NLRF9ETE0sIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBOT1RJRllfREJVU19DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgTk9USUZZX0RCVVMsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBOT1RJRllfREJVU19MSUJTCisgICAgICAgICAgICAgIGxpbmtlciBmbGFncyBmb3IgTk9USUZZX0RCVVMsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBCTEtJRF9DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgQkxLSUQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBCTEtJRF9MSUJTICBsaW5rZXIgZmxhZ3MgZm9yIEJMS0lELCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgU1lTVEVNRF9DRkxBR1MKKyAgICAgICAgICAgICAgQyBjb21waWxlciBmbGFncyBmb3IgU1lTVEVNRCwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIFNZU1RFTURfTElCUworICAgICAgICAgICAgICBsaW5rZXIgZmxhZ3MgZm9yIFNZU1RFTUQsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZworICBVREVWX0NGTEFHUyBDIGNvbXBpbGVyIGZsYWdzIGZvciBVREVWLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgVURFVl9MSUJTICAgbGlua2VyIGZsYWdzIGZvciBVREVWLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgUFlUSE9OICAgICAgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2NvbmZpZ3VyZQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5CisKK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY3h4X3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY3BwCisKKyMgYWNfZm5fY190cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQgdXNpbmcKKyMgdGhlIGluY2x1ZGUgZmlsZXMgaW4gSU5DTFVERVMgYW5kIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHVzYWJpbGl0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCisgIHllczpubzogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKK2VzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCisjIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X3J1bgorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCisjIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfdHlwZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPW5vIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgkMikpCisJIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCgkMikpKQorCSAgICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGV2YWwgIiQzPXllcyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX3R5cGUKKworIyBhY19mbl9jX2NoZWNrX21lbWJlciBMSU5FTk8gQUdHUiBNRU1CRVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJpZXMgdG8gZmluZCBpZiB0aGUgZmllbGQgTUVNQkVSIGV4aXN0cyBpbiB0eXBlIEFHR1IsIGFmdGVyIGluY2x1ZGluZworIyBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX21lbWJlciAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyLiQzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4kMy4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskNCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ1CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyAkMiBhY19hZ2dyOworaWYgKGFjX2FnZ3IuJDMpCityZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkND15ZXMiCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ1CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyAkMiBhY19hZ2dyOworaWYgKHNpemVvZiBhY19hZ2dyLiQzKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDQ9eWVzIgorZWxzZQorICBldmFsICIkND1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQ0CisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX21lbWJlcgorCisjIGFjX2ZuX2NfZmluZF9pbnRYX3QgTElORU5PIEJJVFMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmRzIGEgc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19maW5kX2ludFhfdCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGludCQyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludCQyX3QuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1ubyIKKyAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCisgICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCisgICAgIGZvciBhY190eXBlIGluIGludCQyX3QgJ2ludCcgJ2xvbmcgaW50JyBcCisJICdsb25nIGxvbmcgaW50JyAnc2hvcnQgaW50JyAnc2lnbmVkIGNoYXInOyBkbworICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisJICAgICBlbnVtIHsgTiA9ICQyIC8gMiAtIDEgfTsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoMCA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorCSAgICAgICAgZW51bSB7IE4gPSAkMiAvIDIgLSAxIH07CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpCisJCSA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDIpKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGNhc2UgJGFjX3R5cGUgaW4gIygKKyAgaW50JDJfdCkgOgorICAgIGV2YWwgIiQzPXllcyIgOzsgIygKKyAgKikgOgorICAgIGV2YWwgIiQzPVwkYWNfdHlwZSIgOzsKK2VzYWMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICBpZiBldmFsIHRlc3QgXCJ4XCQiJDMiXCIgPSB4Im5vIjsgdGhlbiA6CisKK2Vsc2UKKyAgYnJlYWsKK2ZpCisgICAgIGRvbmUKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2ZpbmRfaW50WF90CisKKyMgYWNfZm5fY19maW5kX3VpbnRYX3QgTElORU5PIEJJVFMgVkFSCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaW5kcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfZmluZF91aW50WF90ICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdWludCQyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQkMl90Li4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgorICAgICAjIHRoYW4gaGFsZiBvZiB0aGUgZXhwZWN0ZWQgdGFyZ2V0IHdpZHRoLgorICAgICBmb3IgYWNfdHlwZSBpbiB1aW50JDJfdCAndW5zaWduZWQgaW50JyAndW5zaWduZWQgbG9uZyBpbnQnIFwKKwkgJ3Vuc2lnbmVkIGxvbmcgbG9uZyBpbnQnICd1bnNpZ25lZCBzaG9ydCBpbnQnICd1bnNpZ25lZCBjaGFyJzsgZG8KKyAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKCRhY190eXBlKSAtMSA+PiAoJDIgLyAyIC0gMSkpID4+ICgkMiAvIDIgLSAxKSA9PSAzKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXNlICRhY190eXBlIGluICMoCisgIHVpbnQkMl90KSA6CisgICAgZXZhbCAiJDM9eWVzIiA7OyAjKAorICAqKSA6CisgICAgZXZhbCAiJDM9XCRhY190eXBlIiA7OworZXNhYworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgIGlmIGV2YWwgdGVzdCBcInhcJCIkMyJcIiA9IHgibm8iOyB0aGVuIDoKKworZWxzZQorICBicmVhaworZmkKKyAgICAgZG9uZQorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfZmluZF91aW50WF90CisKKyMgYWNfZm5fY19jaGVja19mdW5jIExJTkVOTyBGVU5DIFZBUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQorYWNfZm5fY19jaGVja19mdW5jICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICQyIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJDIuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJDIgaW5ub2N1b3VzXyQyCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICQyICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICQyCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJDIgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kMiB8fCBkZWZpbmVkIF9fc3R1Yl9fXyQyCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICQyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2Z1bmMKKworIyBhY19mbl9jX2NoZWNrX2RlY2wgTElORU5PIFNZTUJPTCBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgU1lNQk9MIGlzIGRlY2xhcmVkIGluIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfZGVjbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGFzX2RlY2xfbmFtZT1gZWNobyAkMnxzZWQgJ3MvICooLiovLydgCisgIGFzX2RlY2xfdXNlPWBlY2hvICQyfHNlZCAtZSAncy8oLygoLycgLWUgJ3MvKS8pIDAmLycgLWUgJ3MvLC8pIDAmICgvZydgCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkYXNfZGVjbF9uYW1lIGlzIGRlY2xhcmVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZC4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgJGFzX2RlY2xfbmFtZQorI2lmZGVmIF9fY3BsdXNwbHVzCisgICh2b2lkKSAkYXNfZGVjbF91c2U7CisjZWxzZQorICAodm9pZCkgJGFzX2RlY2xfbmFtZTsKKyNlbmRpZgorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfZGVjbAorY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKK2FzX2ZuX2FwcGVuZCBhY19oZWFkZXJfbGlzdCAiIHN5cy90aW1lLmgiCithc19mbl9hcHBlbmQgYWNfaGVhZGVyX2xpc3QgIiB1bmlzdGQuaCIKK2FzX2ZuX2FwcGVuZCBhY19mdW5jX2xpc3QgIiBhbGFybSIKK2FzX2ZuX2FwcGVuZCBhY19oZWFkZXJfbGlzdCAiIHN0ZGxpYi5oIgorYXNfZm5fYXBwZW5kIGFjX2hlYWRlcl9saXN0ICIgc3lzL3BhcmFtLmgiCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGluY2x1ZGUvY29uZmlndXJlLmgiCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGF1dG9jb25mICIkc3JjZGlyIi9hdXRvY29uZjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBhdXRvY29uZiBcIiRzcmNkaXJcIi9hdXRvY29uZiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl90YXJnZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JHRhcmdldF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X3RhcmdldD0kYWNfY3ZfaG9zdAorZWxzZQorICBhY19jdl90YXJnZXQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJHRhcmdldF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJHRhcmdldF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl90YXJnZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl90YXJnZXQiID4mNjsgfQorY2FzZSAkYWNfY3ZfdGFyZ2V0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1OzsKK2VzYWMKK3RhcmdldD0kYWNfY3ZfdGFyZ2V0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfdGFyZ2V0CitzaGlmdAordGFyZ2V0X2NwdT0kMQordGFyZ2V0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK3RhcmdldF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkdGFyZ2V0X29zIGluICpcICopIHRhcmdldF9vcz1gZWNobyAiJHRhcmdldF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCit0ZXN0IC1uICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCitpZiB0ZXN0IC16ICIkQ0ZMQUdTIjsgdGhlbiA6CisgIENPUFRJTUlTRV9GTEFHPSItTzIiCitmaQorY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCQlDTERGTEFHUz0iJENMREZMQUdTIC1XbCwtLXZlcnNpb24tc2NyaXB0LC5leHBvcnQuc3ltIgorCQlFTERGTEFHUz0iLVdsLC0tZXhwb3J0LWR5bmFtaWMiCisJCSMgRklYTUUgR2VuZXJhdGUgbGlzdCBhbmQgdXNlIC0tZHluYW1pYy1saXN0PS5kbG9wZW4uc3ltCisJCUNMRFdIT0xFQVJDSElWRT0iLVdsLC13aG9sZS1hcmNoaXZlIgorCQlDTEROT1dIT0xFQVJDSElWRT0iLVdsLC1uby13aG9sZS1hcmNoaXZlIgorCQlMRERFUFM9IiRMRERFUFMgLmV4cG9ydC5zeW0iCisJCUxJQl9TVUZGSVg9c28KKwkJREVWTUFQUEVSPXllcworCQlCVUlMRF9MVk1FVEFEPW5vCisJCUJVSUxEX0xWTVBPTExEPW5vCisJCUxPQ0tEU0FOTE9DSz1ubworCQlMT0NLRERMTT1ubworCQlPRElSRUNUPXllcworCQlETV9JT0NUTFM9eWVzCisJCVNFTElOVVg9eWVzCisJCUNMVVNURVI9aW50ZXJuYWwKKwkJRlNBRE09eWVzCisJCUJMS0RFQUNUSVZBVEU9eWVzCisJCTs7CisJZGFyd2luKikKKwkJQ0ZMQUdTPSIkQ0ZMQUdTIC1uby1jcHAtcHJlY29tcCAtZm5vLWNvbW1vbiIKKwkJQ0xERkxBR1M9IiRDTERGTEFHUyIKKwkJRUxERkxBR1M9CisJCUNMRFdIT0xFQVJDSElWRT0iLWFsbF9sb2FkIgorCQlDTEROT1dIT0xFQVJDSElWRT0KKwkJTElCX1NVRkZJWD1keWxpYgorCQlERVZNQVBQRVI9eWVzCisJCU9ESVJFQ1Q9bm8KKwkJRE1fSU9DVExTPW5vCisJCVNFTElOVVg9bm8KKwkJQ0xVU1RFUj1ub25lCisJCUZTQURNPW5vCisJCUJMS0RFQUNUSVZBVEU9bm8KKwkJOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAgICAgICBhY19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCisgICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCisgICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKKyAgICAgZG9uZQorICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAorICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3NjcmlwdDt9CisgICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCisgIGFjX3BhdGhfU0VEX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9TRUQiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9TRUQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX1NFRAorY2FzZSBgIiRhY19wYXRoX1NFRCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIgYWNfcGF0aF9TRURfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJycgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9TRUQiIC1mIGNvbmZ0ZXN0LnNlZCA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfU0VEX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIgorICAgICAgYWNfcGF0aF9TRURfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9TRURfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX1NFRCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBzZWQgY291bGQgYmUgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX1NFRD0kU0VECitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX1NFRCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfU0VEIiA+JjY7IH0KKyBTRUQ9IiRhY19jdl9wYXRoX1NFRCIKKyAgcm0gLWYgY29uZnRlc3Quc2VkCisKK2ZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3aworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0FXSys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitBV0s9JGFjX2N2X3Byb2dfQVdLCitpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFXSyIgPiY1CiskYXNfZWNobyAiJEFXSyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCitkb25lCisKK3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVuIDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwlmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBhY19maWxlPScnCitmaQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCitybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9CitpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKKyByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCisjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitzdHJ1Y3Qgc3RhdDsKKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisgICAgQ1hYPSRDQ0MKKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYIiA+JjUKKyRhc19lY2hvICIkQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX2N0X0NYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ1hYIiA9IHg7IHRoZW4KKyAgICBDWFg9ImcrKyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX2N0X0NYWAorICBmaQorZmkKKworICBmaQorZmkKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHWFg9eWVzCitlbHNlCisgIEdYWD0KK2ZpCithY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jeHhfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKyAgIENYWEZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIENYWEZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKwkgQ1hYRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NGTEFHUz0kc2F2ZV9DRkxBR1MKK0NYWEZMQUdTPSRzYXZlX0NYWEZMQUdTCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfRUdSRVAiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCitpZiB0ZXN0ICRhY19jdl9jX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgbmVlZHMgLXRyYWRpdGlvbmFsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIG5lZWRzIC10cmFkaXRpb25hbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2djY190cmFkaXRpb25hbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgYWNfcGF0dGVybj0iQXV0b2NvbmYuKid4JyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHNndHR5Lmg+CitBdXRvY29uZiBUSU9DR0VUUAorX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiJGFjX3BhdHRlcm4iID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcworZWxzZQorICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKKyAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSBubzsgdGhlbgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDx0ZXJtaW8uaD4KK0F1dG9jb25mIFRDR0VUQQorX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiJGFjX3BhdHRlcm4iID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsIiA+JjY7IH0KKyAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC10cmFkaXRpb25hbCIKKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gIiA+JjY7IH0KK0xOX1M9JGFzX2xuX3MKK2lmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1CiskYXNfZWNobyAibm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCBcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCitTSEVMTCA9IC9iaW4vc2gKK2FsbDoKKwlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJworX0FDRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KKyAgKkBAQCUlJT0/Kj1AQEAlJSUqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7CisgICopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OworZXNhYworcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICBTRVRfTUFLRT0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRNS0RJUl9QIjsgdGhlbgorICBpZiAke2FjX2N2X3BhdGhfbWtkaXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbworCSBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwkgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIHx8IGNvbnRpbnVlCisJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAorCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKKwkgICAgICAgYWNfY3ZfcGF0aF9ta2Rpcj0kYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0CisJICAgICAgIGJyZWFrIDM7OworCSAgIGVzYWMKKwkgZG9uZQorICAgICAgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorCisgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCisgICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIE1LRElSX1A9IiRhY19pbnN0YWxsX3NoIC1kIgorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUtESVJfUCIgPiY1CiskYXNfZWNobyAiJE1LRElSX1AiID4mNjsgfQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCisgICAgUkFOTElCPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2Zsb3ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2Zsb3c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0NGTE9XX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJENGTE9XX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9DRkxPV19DTUQ9IiRDRkxPV19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX0NGTE9XX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0NGTE9XX0NNRD0kYWNfY3ZfcGF0aF9DRkxPV19DTUQKK2lmIHRlc3QgLW4gIiRDRkxPV19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0ZMT1dfQ01EIiA+JjUKKyRhc19lY2hvICIkQ0ZMT1dfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DRkxPV19DTUQiOyB0aGVuCisgIGFjX3B0X0NGTE9XX0NNRD0kQ0ZMT1dfQ01ECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2Zsb3ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNmbG93OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9DRkxPV19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9DRkxPV19DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfQ0ZMT1dfQ01EPSIkYWNfcHRfQ0ZMT1dfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9DRkxPV19DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9DRkxPV19DTUQ9JGFjX2N2X3BhdGhfYWNfcHRfQ0ZMT1dfQ01ECitpZiB0ZXN0IC1uICIkYWNfcHRfQ0ZMT1dfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X0NGTE9XX0NNRCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0NGTE9XX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X0NGTE9XX0NNRCIgPSB4OyB0aGVuCisgICAgQ0ZMT1dfQ01EPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0ZMT1dfQ01EPSRhY19wdF9DRkxPV19DTUQKKyAgZmkKK2Vsc2UKKyAgQ0ZMT1dfQ01EPSIkYWNfY3ZfcGF0aF9DRkxPV19DTUQiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jc2NvcGUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y3Njb3BlOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DU0NPUEVfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQ1NDT1BFX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9DU0NPUEVfQ01EPSIkQ1NDT1BFX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfQ1NDT1BFX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0NTQ09QRV9DTUQ9JGFjX2N2X3BhdGhfQ1NDT1BFX0NNRAoraWYgdGVzdCAtbiAiJENTQ09QRV9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1NDT1BFX0NNRCIgPiY1CiskYXNfZWNobyAiJENTQ09QRV9DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX0NTQ09QRV9DTUQiOyB0aGVuCisgIGFjX3B0X0NTQ09QRV9DTUQ9JENTQ09QRV9DTUQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjc2NvcGUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNzY29wZTsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfQ1NDT1BFX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X0NTQ09QRV9DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfQ1NDT1BFX0NNRD0iJGFjX3B0X0NTQ09QRV9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X0NTQ09QRV9DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9DU0NPUEVfQ01EPSRhY19jdl9wYXRoX2FjX3B0X0NTQ09QRV9DTUQKK2lmIHRlc3QgLW4gIiRhY19wdF9DU0NPUEVfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X0NTQ09QRV9DTUQiID4mNQorJGFzX2VjaG8gIiRhY19wdF9DU0NPUEVfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfQ1NDT1BFX0NNRCIgPSB4OyB0aGVuCisgICAgQ1NDT1BFX0NNRD0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENTQ09QRV9DTUQ9JGFjX3B0X0NTQ09QRV9DTUQKKyAgZmkKK2Vsc2UKKyAgQ1NDT1BFX0NNRD0iJGFjX2N2X3BhdGhfQ1NDT1BFX0NNRCIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNobW9kIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNobW9kOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DSE1PRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJENITU9EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NITU9EPSIkQ0hNT0QiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX0NITU9EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0hNT0Q9JGFjX2N2X3BhdGhfQ0hNT0QKK2lmIHRlc3QgLW4gIiRDSE1PRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSE1PRCIgPiY1CiskYXNfZWNobyAiJENITU9EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DSE1PRCI7IHRoZW4KKyAgYWNfcHRfQ0hNT0Q9JENITU9ECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2htb2QiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNobW9kOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9DSE1PRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X0NITU9EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X0NITU9EPSIkYWNfcHRfQ0hNT0QiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X0NITU9EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfQ0hNT0Q9JGFjX2N2X3BhdGhfYWNfcHRfQ0hNT0QKK2lmIHRlc3QgLW4gIiRhY19wdF9DSE1PRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9DSE1PRCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0NITU9EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfQ0hNT0QiID0geDsgdGhlbgorICAgIENITU9EPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0hNT0Q9JGFjX3B0X0NITU9ECisgIGZpCitlbHNlCisgIENITU9EPSIkYWNfY3ZfcGF0aF9DSE1PRCIKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FjX2hlYWRlcl9kaXJlbnQ9bm8KK2ZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oOyBkbworICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19oZHIiIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX2FjX0hlYWRlcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDwkYWNfaGRyPgorCitpbnQKK21haW4gKCkKK3sKK2lmICgoRElSICopIDApCityZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCRhc19hY19IZWFkZXIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGRyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCithY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCitmaQorCitkb25lCisjIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCitpZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVuZGlyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgb3BlbmRpciAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIG9wZW5kaXIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgZGlyOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX29wZW5kaXI9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfb3BlbmRpcj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX29wZW5kaXIiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfb3BlbmRpciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9vcGVuZGlyCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVuZGlyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9vcGVuZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgb3BlbmRpciAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIG9wZW5kaXIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgeDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9vcGVuZGlyPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfb3BlbmRpcis6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfb3BlbmRpcis6fSBmYWxzZTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX29wZW5kaXI9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9vcGVuZGlyIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX29wZW5kaXIiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfb3BlbmRpcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzeXMvdHlwZXMuaCBkZWZpbmVzIG1ha2VkZXYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzeXMvdHlwZXMuaCBkZWZpbmVzIG1ha2VkZXYuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBtYWtlZGV2KDAsIDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2PXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYiID4mNjsgfQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiA9IG5vOyB0aGVuCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL21rZGV2LmgiICJhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBNQUpPUl9JTl9NS0RFViAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisKKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oID0gbm87IHRoZW4KKyAgICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL3N5c21hY3Jvcy5oIiAiYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBNQUpPUl9JTl9TWVNNQUNST1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworICBmaQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkYm9vbC5oIHRoYXQgY29uZm9ybXMgdG8gQzk5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdGRib29sLmggdGhhdCBjb25mb3JtcyB0byBDOTkuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRib29sLmg+CisgICAgICAgICAgICAgI2lmbmRlZiBib29sCisgICAgICAgICAgICAgICJlcnJvcjogYm9vbCBpcyBub3QgZGVmaW5lZCIKKyAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAjaWZuZGVmIGZhbHNlCisgICAgICAgICAgICAgICJlcnJvcjogZmFsc2UgaXMgbm90IGRlZmluZWQiCisgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgI2lmIGZhbHNlCisgICAgICAgICAgICAgICJlcnJvcjogZmFsc2UgaXMgbm90IDAiCisgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgI2lmbmRlZiB0cnVlCisgICAgICAgICAgICAgICJlcnJvcjogdHJ1ZSBpcyBub3QgZGVmaW5lZCIKKyAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAjaWYgdHJ1ZSAhPSAxCisgICAgICAgICAgICAgICJlcnJvcjogdHJ1ZSBpcyBub3QgMSIKKyAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAjaWZuZGVmIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCisgICAgICAgICAgICAgICJlcnJvcjogX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQgaXMgbm90IGRlZmluZWQiCisgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICBzdHJ1Y3QgcyB7IF9Cb29sIHM6IDE7IF9Cb29sIHQ7IH0gczsKKworICAgICAgICAgICAgIGNoYXIgYVt0cnVlID09IDEgPyAxIDogLTFdOworICAgICAgICAgICAgIGNoYXIgYltmYWxzZSA9PSAwID8gMSA6IC0xXTsKKyAgICAgICAgICAgICBjaGFyIGNbX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQgPT0gMSA/IDEgOiAtMV07CisgICAgICAgICAgICAgY2hhciBkWyhib29sKSAwLjUgPT0gdHJ1ZSA/IDEgOiAtMV07CisgICAgICAgICAgICAgLyogU2VlIGJvZHkgb2YgbWFpbiBwcm9ncmFtIGZvciAnZScuICAqLworICAgICAgICAgICAgIGNoYXIgZlsoX0Jvb2wpIDAuMCA9PSBmYWxzZSA/IDEgOiAtMV07CisgICAgICAgICAgICAgY2hhciBnW3RydWVdOworICAgICAgICAgICAgIGNoYXIgaFtzaXplb2YgKF9Cb29sKV07CisgICAgICAgICAgICAgY2hhciBpW3NpemVvZiBzLnRdOworICAgICAgICAgICAgIGVudW0geyBqID0gZmFsc2UsIGsgPSB0cnVlLCBsID0gZmFsc2UgKiB0cnVlLCBtID0gdHJ1ZSAqIDI1NiB9OworICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZmFpbHMgZm9yCisgICAgICAgICAgICAgICAgSFAgYUMrKy9BTlNJIEMgQjM5MTBCIEEuMDUuNTUgW0RlYyAwNCAyMDAzXS4gKi8KKyAgICAgICAgICAgICBfQm9vbCBuW21dOworICAgICAgICAgICAgIGNoYXIgb1tzaXplb2YgbiA9PSBtICogc2l6ZW9mIG5bMF0gPyAxIDogLTFdOworICAgICAgICAgICAgIGNoYXIgcFstMSAtIChfQm9vbCkgMCA8IDAgJiYgLTEgLSAoYm9vbCkgMCA8IDAgPyAxIDogLTFdOworICAgICAgICAgICAgIC8qIENhdGNoIGEgYnVnIGluIGFuIEhQLVVYIEMgY29tcGlsZXIuICBTZWUKKyAgICAgICAgICAgICAgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwMy0xMi9tc2cwMjMwMy5odG1sCisgICAgICAgICAgICAgICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1jb3JldXRpbHMvMjAwNS0xMS9tc2cwMDE2MS5odG1sCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgX0Jvb2wgcSA9IHRydWU7CisgICAgICAgICAgICAgX0Jvb2wgKnBxID0gJnE7CisKK2ludAorbWFpbiAoKQoreworCisgICAgICAgICAgICAgYm9vbCBlID0gJnM7CisgICAgICAgICAgICAgKnBxIHw9IHE7CisgICAgICAgICAgICAgKnBxIHw9ICEgcTsKKyAgICAgICAgICAgICAvKiBSZWZlciB0byBldmVyeSBkZWNsYXJlZCB2YWx1ZSwgdG8gYXZvaWQgY29tcGlsZXIgb3B0aW1pemF0aW9ucy4gICovCisgICAgICAgICAgICAgcmV0dXJuICghYSArICFiICsgIWMgKyAhZCArICFlICsgIWYgKyAhZyArICFoICsgIWkgKyAhIWogKyAhayArICEhbAorICAgICAgICAgICAgICAgICAgICAgKyAhbSArICFuICsgIW8gKyAhcCArICFxICsgIXBxKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRib29sX2g9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRib29sX2g9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRib29sX2giID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYm9vbF9oIiA+JjY7IH0KKyAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgIl9Cb29sIiAiYWNfY3ZfdHlwZV9fQm9vbCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX19Cb29sIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfX0JPT0wgMQorX0FDRU9GCisKKworZmkKKworCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYm9vbF9oID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1REQk9PTF9IIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3lzX3dhaXRfaCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmbmRlZiBXRVhJVFNUQVRVUworIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQgaW50KSAoc3RhdF92YWwpID4+IDgpCisjZW5kaWYKKyNpZm5kZWYgV0lGRVhJVEVECisjIGRlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKKyAgaW50IHM7CisgIHdhaXQgKCZzKTsKKyAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3RpbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK2ludAorbWFpbiAoKQoreworaWYgKChzdHJ1Y3QgdG0gKikgMCkKK3JldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl90aW1lPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfdGltZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworZm9yIGFjX2hlYWRlciBpbiBhc3NlcnQuaCBjdHlwZS5oIGRpcmVudC5oIGVycm5vLmggZmNudGwuaCBmbG9hdC5oIFwKKyAgZ2V0b3B0LmggaW50dHlwZXMuaCBsYW5naW5mby5oIGxpYmdlbi5oIGxpbWl0cy5oIGxvY2FsZS5oIHBhdGhzLmggXAorICBzaWduYWwuaCBzdGRhcmcuaCBzdGRkZWYuaCBzdGRpby5oIHN0ZGxpYi5oIHN0cmluZy5oIHN5cy9maWxlLmggXAorICBzeXMvaW9jdGwuaCBzeXNsb2cuaCBzeXMvbW1hbi5oIHN5cy9wYXJhbS5oIHN5cy9yZXNvdXJjZS5oIHN5cy9zdGF0LmggXAorICBzeXMvdGltZS5oIHN5cy90eXBlcy5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCB0aW1lLmggXAorICB1bmlzdGQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiYmFpbGluZyBvdXQiICIkTElORU5PIiA1CitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiB0ZXJtaW9zLmggc3lzL3N0YXR2ZnMuaCBzeXMvdGltZXJmZC5oIGxpbnV4L21hZ2ljLmggbGludXgvZmllbWFwLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitjYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCWZvciBhY19oZWFkZXIgaW4gYXNtL2J5dGVvcmRlci5oIGxpbnV4L2ZzLmggbWFsbG9jLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gImJhaWxpbmcgb3V0IiAiJExJTkVOTyIgNQorZmkKKworZG9uZQorIDs7CisJZGFyd2luKikKKwkJZm9yIGFjX2hlYWRlciBpbiBtYWNoaW5lL2VuZGlhbi5oIHN5cy9kaXNrLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gImJhaWxpbmcgb3V0IiAiJExJTkVOTyIgNQorZmkKKworZG9uZQorIDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb25zdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IGNzID0geyAwLCAwIH07CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpwY3BjYzsKKyAgY2hhciAqKnBwYzsKKyAgLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9OworICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKyAgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbgorICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50CisgICAgIGV4cHJlc3Npb24gKi8KKyAgY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworICBwY3BjYyA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytwY3BjYzsKKyAgcHBjID0gKGNoYXIqKikgcGNwY2M7CisgIHBjcGNjID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHBwYzsKKyAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLworICAgIGNoYXIgdHg7CisgICAgY2hhciAqdCA9ICZ0eDsKKyAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICAgKnQrKyA9IDA7CisgICAgaWYgKHMpIHJldHVybiAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZywgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH0gYng7CisgICAgc3RydWN0IHMgKmIgPSAmYng7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICAgIGlmICghZm9vKSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gIWNzWzBdICYmICF6ZXJvLng7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbnN0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBjb25zdCAvKiovIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19pbmxpbmUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGludCBmb29fdDsKK3N0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KKyRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CisjZW5kaWYKKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfaW5saW5lPSRhY19rdworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCitkb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorCitjYXNlICRhY19jdl9jX2lubGluZSBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgICopCisgICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KKyAgICAgIG5vKSBhY192YWw9OzsKKyAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OworICAgIGVzYWMKKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGlubGluZSAkYWNfdmFsCisjZW5kaWYKK19BQ0VPRgorICAgIDs7Citlc2FjCisKK2FjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHN0YXQiICJzdF9yZGV2IiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9SREVWIDEKK19BQ0VPRgorCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInB0cmRpZmZfdCIgImFjX2N2X3R5cGVfcHRyZGlmZl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcHRyZGlmZl90IiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfUFRSRElGRl9UIDEKK19BQ0VPRgorCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmguLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc3RydWN0X3RtKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitzdHJ1Y3QgdG0gdG07CisJCQkJICAgICBpbnQgKnAgPSAmdG0udG1fc2VjOworCQkJCSAgICAgcmV0dXJuICFwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N0cnVjdF90bT10aW1lLmgKK2Vsc2UKKyAgYWNfY3Zfc3RydWN0X3RtPXN5cy90aW1lLmgKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N0cnVjdF90bSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N0cnVjdF90bSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFRNX0lOX1NZU19USU1FIDEiID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJvZmZfdCIgImFjX2N2X3R5cGVfb2ZmX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9vZmZfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIG9mZl90IGxvbmcgaW50CitfQUNFT0YKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90eXBlX3BpZF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcGlkX3QiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBwaWRfdCBpbnQKK19BQ0VPRgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfdHlwZV9zaWduYWwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICooc2lnbmFsICgwLCAwKSkgKDApID09IDE7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitlbHNlCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdHlwZV9zaWduYWwiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitfQUNFT0YKKworCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJtb2RlX3QiICJhY19jdl90eXBlX21vZGVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX21vZGVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIG1vZGVfdCBpbnQKK19BQ0VPRgorCitmaQorCithY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiOCIgImFjX2N2X2NfaW50OF90IgorY2FzZSAkYWNfY3ZfY19pbnQ4X3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGludDhfdCAkYWNfY3ZfY19pbnQ4X3QKK19BQ0VPRgorOzsKK2VzYWMKKworYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjE2IiAiYWNfY3ZfY19pbnQxNl90IgorY2FzZSAkYWNfY3ZfY19pbnQxNl90IGluICMoCisgIG5vfHllcykgOzsgIygKKyAgKikKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBpbnQxNl90ICRhY19jdl9jX2ludDE2X3QKK19BQ0VPRgorOzsKK2VzYWMKKworYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjMyIiAiYWNfY3ZfY19pbnQzMl90IgorY2FzZSAkYWNfY3ZfY19pbnQzMl90IGluICMoCisgIG5vfHllcykgOzsgIygKKyAgKikKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBpbnQzMl90ICRhY19jdl9jX2ludDMyX3QKK19BQ0VPRgorOzsKK2VzYWMKKworYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjY0IiAiYWNfY3ZfY19pbnQ2NF90IgorY2FzZSAkYWNfY3ZfY19pbnQ2NF90IGluICMoCisgIG5vfHllcykgOzsgIygKKyAgKikKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBpbnQ2NF90ICRhY19jdl9jX2ludDY0X3QKK19BQ0VPRgorOzsKK2VzYWMKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3NpemVfdCIgImFjX2N2X3R5cGVfc3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NzaXplX3QiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBzc2l6ZV90IGludAorX0FDRU9GCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaC4uLiAiID4mNjsgfQoraWYgJHthY19jdl90eXBlX3VpZF90Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ1aWRfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgYWNfY3ZfdHlwZV91aWRfdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfdHlwZV91aWRfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl90eXBlX3VpZF90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91aWRfdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl90eXBlX3VpZF90ID0gbm87IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgdWlkX3QgaW50IiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBnaWRfdCBpbnQiID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjgiICJhY19jdl9jX3VpbnQ4X3QiCitjYXNlICRhY19jdl9jX3VpbnQ4X3QgaW4gIygKKyAgbm98eWVzKSA7OyAjKAorICAqKQorCiskYXNfZWNobyAiI2RlZmluZSBfVUlOVDhfVCAxIiA+PmNvbmZkZWZzLmgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnQ4X3QgJGFjX2N2X2NfdWludDhfdAorX0FDRU9GCis7OworICBlc2FjCisKK2FjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMTYiICJhY19jdl9jX3VpbnQxNl90IgorY2FzZSAkYWNfY3ZfY191aW50MTZfdCBpbiAjKAorICBub3x5ZXMpIDs7ICMoCisgICopCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSB1aW50MTZfdCAkYWNfY3ZfY191aW50MTZfdAorX0FDRU9GCis7OworICBlc2FjCisKK2FjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX3VpbnQzMl90IgorY2FzZSAkYWNfY3ZfY191aW50MzJfdCBpbiAjKAorICBub3x5ZXMpIDs7ICMoCisgICopCisKKyRhc19lY2hvICIjZGVmaW5lIF9VSU5UMzJfVCAxIiA+PmNvbmZkZWZzLmgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHVpbnQzMl90ICRhY19jdl9jX3VpbnQzMl90CitfQUNFT0YKKzs7CisgIGVzYWMKKworYWNfZm5fY19maW5kX3VpbnRYX3QgIiRMSU5FTk8iICI2NCIgImFjX2N2X2NfdWludDY0X3QiCitjYXNlICRhY19jdl9jX3VpbnQ2NF90IGluICMoCisgIG5vfHllcykgOzsgIygKKyAgKikKKworJGFzX2VjaG8gIiNkZWZpbmUgX1VJTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgdWludDY0X3QgJGFjX2N2X2NfdWludDY0X3QKK19BQ0VPRgorOzsKKyAgZXNhYworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmb3IgYWNfZnVuYyBpbiBmdHJ1bmNhdGUgZ2V0aG9zdG5hbWUgZ2V0cGFnZXNpemUgZ2V0dGltZW9mZGF5IGxvY2FsdGltZV9yIFwKKyAgbWVtY2hyIG1lbXNldCBta2RpciBta2ZpZm8gbXVubWFwIG5sX2xhbmdpbmZvIHJlYWxwYXRoIHJtZGlyIHNldGVudiBcCisgIHNldGxvY2FsZSBzdHJjYXNlY21wIHN0cmNociBzdHJjc3BuIHN0cmR1cCBzdHJlcnJvciBzdHJuY2FzZWNtcCBzdHJuZHVwIFwKKyAgc3RycmNociBzdHJzcG4gc3Ryc3RyIHN0cnRvbCBzdHJ0b3VsIHVuYW1lCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiYmFpbGluZyBvdXQiICIkTElORU5PIiA1CitmaQorZG9uZQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludAorbWFpbiAoKQoreworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7CisJCQkgIGlmIChwKSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl93b3JraW5nX2FsbG9jYV9oPXllcworZWxzZQorICBhY19jdl93b3JraW5nX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNQorJGFzX2VjaG8gIiRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbGxvY2EuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWZkZWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK3ZvaWQgKmFsbG9jYSAoc2l6ZV90KTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDEpOworCQkJCSAgICBpZiAocCkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiID4mNjsgfQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FMTE9DQSAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorCitBTExPQ0E9XCR7TElCT0JKRElSfWFsbG9jYS4kYWNfb2JqZXh0CisKKyRhc19lY2hvICIjZGVmaW5lIENfQUxMT0NBIDEiID4+Y29uZmRlZnMuaAorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vc19jcmF5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQgQ1JBWSAmJiAhIGRlZmluZWQgQ1JBWTIKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vc19jcmF5IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb3NfY3JheSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCisgIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworX0FDRU9GCisKKyAgICBicmVhaworZmkKKworICBkb25lCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoaW50ICphZGRyLCBpbnQgZGVwdGgpCit7CisgIGludCBkaXIsIGR1bW15ID0gMDsKKyAgaWYgKCEgYWRkcikKKyAgICBhZGRyID0gJmR1bW15OworICAqYWRkciA9IGFkZHIgPCAmZHVtbXkgPyAxIDogYWRkciA9PSAmZHVtbXkgPyAwIDogLTE7CisgIGRpciA9IGRlcHRoID8gZmluZF9zdGFja19kaXJlY3Rpb24gKGFkZHIsIGRlcHRoIC0gMSkgOiAwOworICByZXR1cm4gZGlyICsgZHVtbXk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKDAsIGFyZ2MgKyAhYXJndiArIDIwKSA8IDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY2OyB9CitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK19BQ0VPRgorCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBjbG9zZWRpciByZXR1cm5zIHZvaWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBjbG9zZWRpciByZXR1cm5zIHZvaWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19jbG9zZWRpcl92b2lkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQ9eWVzCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcl9kaXJlbnQ+CisjaWZuZGVmIF9fY3BsdXNwbHVzCitpbnQgY2xvc2VkaXIgKCk7CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gY2xvc2VkaXIgKG9wZW5kaXIgKCIuIikpICE9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQ9bm8KK2Vsc2UKKyAgYWNfY3ZfZnVuY19jbG9zZWRpcl92b2lkPXllcworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfY2xvc2VkaXJfdm9pZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfY2xvc2VkaXJfdm9pZCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgQ0xPU0VESVJfVk9JRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZm9yIGFjX2hlYWRlciBpbiB1bmlzdGQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidW5pc3RkLmgiICJhY19jdl9oZWFkZXJfdW5pc3RkX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBjaG93biIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBjaG93bi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX2Nob3duX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX2Nob3duX3dvcmtzPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8ZmNudGwuaD4KKworaW50CittYWluICgpCit7CisgIGNoYXIgKmYgPSAiY29uZnRlc3QuY2hvd24iOworICBzdHJ1Y3Qgc3RhdCBiZWZvcmUsIGFmdGVyOworCisgIGlmIChjcmVhdCAoZiwgMDYwMCkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoc3RhdCAoZiwgJmJlZm9yZSkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoY2hvd24gKGYsICh1aWRfdCkgLTEsIChnaWRfdCkgLTEpID09IC0xKQorICAgIHJldHVybiAxOworICBpZiAoc3RhdCAoZiwgJmFmdGVyKSA8IDApCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAhIChiZWZvcmUuc3RfdWlkID09IGFmdGVyLnN0X3VpZCAmJiBiZWZvcmUuc3RfZ2lkID09IGFmdGVyLnN0X2dpZCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfY2hvd25fd29ya3M9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfY2hvd25fd29ya3M9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb25mdGVzdC5jaG93bgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2Nob3duX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19jaG93bl93b3JrcyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX2Nob3duX3dvcmtzID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQ0hPV04gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gdmZvcmsuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidmZvcmsuaCIgImFjX2N2X2hlYWRlcl92Zm9ya19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl92Zm9ya19oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVkZPUktfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfZnVuYyBpbiBmb3JrIHZmb3JrCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworaWYgdGVzdCAieCRhY19jdl9mdW5jX2ZvcmsiID0geHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yay4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX2Zvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zcworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CisKKwkgIC8qIEJ5IFJ1ZWRpZ2VyIEt1aGxtYW5uLiAqLworCSAgcmV0dXJuIGZvcmsgKCkgPCAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY2OyB9CisKK2Vsc2UKKyAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPSRhY19jdl9mdW5jX2ZvcmsKK2ZpCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KKyAgY2FzZSAkaG9zdCBpbgorICAgICotKi1hbWlnYW9zKiB8ICotKi1tc2Rvc2RqZ3BwKikKKyAgICAgICMgT3ZlcnJpZGUsIGFzIHRoZXNlIHN5c3RlbXMgaGF2ZSBvbmx5IGEgZHVtbXkgZm9yaygpIHN0dWIKKyAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz1ubworICAgICAgOzsKKyAgICAqKQorICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcworICAgICAgOzsKKyAgZXNhYworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mMjt9CitmaQorYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yaworaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrIiA9IHh5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yay4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3Zmb3JrX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPWNyb3NzCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIFRoYW5rcyB0byBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpZmRlZiBIQVZFX1ZGT1JLX0gKKyMgaW5jbHVkZSA8dmZvcmsuaD4KKyNlbmRpZgorLyogT24gc29tZSBzcGFyYyBzeXN0ZW1zLCBjaGFuZ2VzIGJ5IHRoZSBjaGlsZCB0byBsb2NhbCBhbmQgaW5jb21pbmcKKyAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQuICBUaGUgY29tcGlsZXIKKyAgIGlzIHRvbGQgYWJvdXQgdGhpcyB3aXRoICNpbmNsdWRlIDx2Zm9yay5oPiwgYnV0IHNvbWUgY29tcGlsZXJzCisgICAoZS5nLiBnY2MgLU8pIGRvbid0IGdyb2sgPHZmb3JrLmg+LiAgVGVzdCBmb3IgdGhpcyBieSB1c2luZyBhCisgICBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRkcmVzcyBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMKKyAgIGNsb2JiZXJlZCBieSB0aGUgdmZvcmsuICAqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX2NwbHVzcGx1cworc3BhcmNfYWRkcmVzc190ZXN0IChpbnQgYXJnKQorIyBlbHNlCitzcGFyY19hZGRyZXNzX3Rlc3QgKGFyZykgaW50IGFyZzsKKyNlbmRpZgoreworICBzdGF0aWMgcGlkX3QgY2hpbGQ7CisgIGlmICghY2hpbGQpIHsKKyAgICBjaGlsZCA9IHZmb3JrICgpOworICAgIGlmIChjaGlsZCA8IDApIHsKKyAgICAgIHBlcnJvciAoInZmb3JrIik7CisgICAgICBfZXhpdCgyKTsKKyAgICB9CisgICAgaWYgKCFjaGlsZCkgeworICAgICAgYXJnID0gZ2V0cGlkKCk7CisgICAgICB3cml0ZSgtMSwgIiIsIDApOworICAgICAgX2V4aXQgKGFyZyk7CisgICAgfQorICB9Cit9CisKK2ludAorbWFpbiAoKQoreworICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7CisgIHBpZF90IGNoaWxkOworCisgIHNwYXJjX2FkZHJlc3NfdGVzdCAoMCk7CisKKyAgY2hpbGQgPSB2Zm9yayAoKTsKKworICBpZiAoY2hpbGQgPT0gMCkgeworICAgIC8qIEhlcmUgaXMgYW5vdGhlciB0ZXN0IGZvciBzcGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4gIFRoaXMKKyAgICAgICB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0IGFzIG1hbnkgbG9jYWwKKyAgICAgICB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhciBpbmNsdWRpbmcgY29tcGlsZXIKKyAgICAgICB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9yIGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzCisgICAgICAgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLiAgQSBidWdneSBjb21waWxlciBzaG91bGQKKyAgICAgICByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50IGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywKKyAgICAgICBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJlIHVzZWQgYW55IG1vcmUKKyAgICAgICBpbiB0aGlzIHJvdXRpbmUuICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cworICAgICAgIG11bmdlIHBhcmVudCBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLworICAgIHBpZF90CisgICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCisgICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOworICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1pZ2h0CisgICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLworICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0CisJfHwgcCAhPSBwNSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCisgICAgICBfZXhpdCgxKTsKKworICAgIC8qIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50CisgICAgICAgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLiAgSWYgdGhlIGNoaWxkIGNsb3NlcyBhIGRlc2NyaXB0b3IKKyAgICAgICBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsIHRoaXMgbXVuZ2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yCisgICAgICAgYXMgd2VsbC4gIFRlc3QgZm9yIHRoaXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KKyAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7CisgIH0gZWxzZSB7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHdoaWxlICh3YWl0KCZzdGF0dXMpICE9IGNoaWxkKQorICAgICAgOworICAgIHJldHVybiAoCisJIC8qIFdhcyB0aGVyZSBzb21lIHByb2JsZW0gd2l0aCB2Zm9ya2luZz8gICovCisJIGNoaWxkIDwgMAorCisJIC8qIERpZCB0aGUgY2hpbGQgZmFpbD8gIChUaGlzIHNob3VsZG4ndCBoYXBwZW4uKSAgKi8KKwkgfHwgc3RhdHVzCisKKwkgLyogRGlkIHRoZSB2Zm9yay9jb21waWxlciBidWcgb2NjdXI/ICAqLworCSB8fCBwYXJlbnQgIT0gZ2V0cGlkKCkKKworCSAvKiBEaWQgdGhlIGZpbGUgZGVzY3JpcHRvciBidWcgb2NjdXI/ICAqLworCSB8fCBmc3RhdChmaWxlbm8oc3Rkb3V0KSwgJnN0KSAhPSAwCisJICk7CisgIH0KK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY2OyB9CisKK2ZpOworaWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCisgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mMjt9CitmaQorCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgdmZvcmsgZm9yayIgPj5jb25mZGVmcy5oCisKK2ZpCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2giID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsc3RhdCBjb3JyZWN0bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQorZWNobyA+Y29uZnRlc3QuZmlsZQoraWYgdGVzdCAiJGFzX2xuX3MiID0gImxuIC1zIiAmJiBsbiAtcyBjb25mdGVzdC5maWxlIGNvbmZ0ZXN0LnN5bTsgdGhlbgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CitzdHJ1Y3Qgc3RhdCBzYnVmOworICAgICAvKiBMaW51eCB3aWxsIGRlcmVmZXJlbmNlIHRoZSBzeW1saW5rIGFuZCBmYWlsLCBhcyByZXF1aXJlZCBieSBQT1NJWC4KKwlUaGF0IGlzIGJldHRlciBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtZWFucyB3ZSB3aWxsIG5vdAorCWhhdmUgdG8gY29tcGlsZSBhbmQgdXNlIHRoZSBsc3RhdCB3cmFwcGVyLiAgKi8KKyAgICAgcmV0dXJuIGxzdGF0ICgiY29uZnRlc3Quc3ltLyIsICZzYnVmKSA9PSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPXllcworZWxzZQorICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitlbHNlCisgICMgSWYgdGhlIGBsbiAtcycgY29tbWFuZCBmYWlsZWQsIHRoZW4gd2UgcHJvYmFibHkgZG9uJ3QgZXZlbgorICAjIGhhdmUgYW4gbHN0YXQgZnVuY3Rpb24uCisgIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LnN5bSBjb25mdGVzdC5maWxlCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPiY2OyB9CisKK3Rlc3QgJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayA9IHllcyAmJgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKK19BQ0VPRgorCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhubzsgdGhlbgorICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBsc3RhdC4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgbHN0YXQuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbHN0YXQgYWNjZXB0cyBhbiBlbXB0eSBzdHJpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX2xzdGF0X2VtcHR5X3N0cmluZ19idWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbHN0YXRfZW1wdHlfc3RyaW5nX2J1Zz15ZXMKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworc3RydWN0IHN0YXQgc2J1ZjsKKyAgcmV0dXJuIGxzdGF0ICgiIiwgJnNidWYpID09IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX2xzdGF0X2VtcHR5X3N0cmluZ19idWc9bm8KK2Vsc2UKKyAgYWNfY3ZfZnVuY19sc3RhdF9lbXB0eV9zdHJpbmdfYnVnPXllcworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbHN0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbHN0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2VtcHR5X3N0cmluZ19idWcgPSB5ZXM7IHRoZW4KKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgbHN0YXQuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIGxzdGF0LiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTFNUQVRfRU1QVFlfU1RSSU5HX0JVRyAxCitfQUNFT0YKKworZmkKKworZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkbGliLmgiICJhY19jdl9oZWFkZXJfc3RkbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBtYWxsb2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsaWJjIGNvbXBhdGlibGUgbWFsbG9jLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorY2hhciAqbWFsbG9jICgpOworI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICEgbWFsbG9jICgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCA9IHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFMTE9DIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFMTE9DIDAiID4+Y29uZmRlZnMuaAorCisgICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBtYWxsb2MuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIG1hbGxvYy4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworJGFzX2VjaG8gIiNkZWZpbmUgbWFsbG9jIHJwbF9tYWxsb2MiID4+Y29uZmRlZnMuaAorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX21lbWNtcF93b3JraW5nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworICAvKiBTb21lIHZlcnNpb25zIG9mIG1lbWNtcCBhcmUgbm90IDgtYml0IGNsZWFuLiAgKi8KKyAgY2hhciBjMCA9ICdcMTAwJywgYzEgPSAnXDIwMCcsIGMyID0gJ1wyMDEnOworICBpZiAobWVtY21wKCZjMCwgJmMyLCAxKSA+PSAwIHx8IG1lbWNtcCgmYzEsICZjMiwgMSkgPj0gMCkKKyAgICByZXR1cm4gMTsKKworICAvKiBUaGUgTmV4dCB4ODYgT3BlblN0ZXAgYnVnIHNob3dzIHVwIG9ubHkgd2hlbiBjb21wYXJpbmcgMTYgYnl0ZXMKKyAgICAgb3IgbW9yZSBhbmQgd2l0aCBhdCBsZWFzdCBvbmUgYnVmZmVyIG5vdCBzdGFydGluZyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKyAgICAgV2lsbGlhbSBMZXdpcyBwcm92aWRlZCB0aGlzIHRlc3QgcHJvZ3JhbS4gICAqLworICB7CisgICAgY2hhciBmb29bMjFdOworICAgIGNoYXIgYmFyWzIxXTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgeworCWNoYXIgKmEgPSBmb28gKyBpOworCWNoYXIgKmIgPSBiYXIgKyBpOworCXN0cmNweSAoYSwgIi0tLS0tLS0tMDExMTExMTEiKTsKKwlzdHJjcHkgKGIsICItLS0tLS0tLTEwMDAwMDAwIik7CisJaWYgKG1lbWNtcCAoYSwgYiwgMTYpID49IDApCisJICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPXllcworZWxzZQorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNjsgfQordGVzdCAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyA9IG5vICYmIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIG1lbWNtcC4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgbWVtY21wLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworCisKKworCisgIGZvciBhY19oZWFkZXIgaW4gJGFjX2hlYWRlcl9saXN0CitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisKKworCisKKworCisgIGZvciBhY19mdW5jIGluICRhY19mdW5jX2xpc3QKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWt0aW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1rdGltZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIFRlc3QgcHJvZ3JhbSBmcm9tIFBhdWwgRWdnZXJ0IGFuZCBUb255IExlbmVpcy4gICovCisjaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8dGltZS5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0FMQVJNCisjIGRlZmluZSBhbGFybShYKSAvKiBlbXB0eSAqLworI2VuZGlmCisKKy8qIFdvcmsgYXJvdW5kIHJlZGVmaW5pdGlvbiB0byBycGxfcHV0ZW52IGJ5IG90aGVyIGNvbmZpZyB0ZXN0cy4gICovCisjdW5kZWYgcHV0ZW52CisKK3N0YXRpYyB0aW1lX3QgdGltZV90X21heDsKK3N0YXRpYyB0aW1lX3QgdGltZV90X21pbjsKKworLyogVmFsdWVzIHdlJ2xsIHVzZSB0byBzZXQgdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0el9zdHJpbmdzW10gPSB7CisgIChjb25zdCBjaGFyICopIDAsICJUWj1HTVQwIiwgIlRaPUpTVC05IiwKKyAgIlRaPUVTVCszRURUKzIsTTEwLjEuMC8wMDowMDowMCxNMi4zLjAvMDA6MDA6MDAiCit9OworI2RlZmluZSBOX1NUUklOR1MgKHNpemVvZiAodHpfc3RyaW5ncykgLyBzaXplb2YgKHR6X3N0cmluZ3NbMF0pKQorCisvKiBSZXR1cm4gMCBpZiBta3RpbWUgZmFpbHMgdG8gY29udmVydCBhIGRhdGUgaW4gdGhlIHNwcmluZy1mb3J3YXJkIGdhcC4KKyAgIEJhc2VkIG9uIGEgcHJvYmxlbSByZXBvcnQgZnJvbSBBbmRyZWFzIEphZWdlci4gICovCitzdGF0aWMgaW50CitzcHJpbmdfZm9yd2FyZF9nYXAgKCkKK3sKKyAgLyogZ2xpYmMgKHVwIHRvIGFib3V0IDE5OTgtMTAtMDcpIGZhaWxlZCB0aGlzIHRlc3QuICovCisgIHN0cnVjdCB0bSB0bTsKKworICAvKiBVc2UgdGhlIHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIKKyAgICAgaW5zdGVhZCBvZiAiVFo9QW1lcmljYS9WYW5jb3V2ZXIiIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgYnVnIGV2ZW4KKyAgICAgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIE9sc29uIGV4dGVuc2lvbiwgb3IgZG9uJ3QgaGF2ZSB0aGUKKyAgICAgZnVsbCB6b25laW5mbyB0YWJsZXMgaW5zdGFsbGVkLiAgKi8KKyAgcHV0ZW52ICgoY2hhciopICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIik7CisKKyAgdG0udG1feWVhciA9IDk4OworICB0bS50bV9tb24gPSAzOworICB0bS50bV9tZGF5ID0gNTsKKyAgdG0udG1faG91ciA9IDI7CisgIHRtLnRtX21pbiA9IDA7CisgIHRtLnRtX3NlYyA9IDA7CisgIHRtLnRtX2lzZHN0ID0gLTE7CisgIHJldHVybiBta3RpbWUgKCZ0bSkgIT0gKHRpbWVfdCkgLTE7Cit9CisKK3N0YXRpYyBpbnQKK21rdGltZV90ZXN0MSAodGltZV90IG5vdykKK3sKKyAgc3RydWN0IHRtICpsdDsKKyAgcmV0dXJuICEgKGx0ID0gbG9jYWx0aW1lICgmbm93KSkgfHwgbWt0aW1lIChsdCkgPT0gbm93OworfQorCitzdGF0aWMgaW50Citta3RpbWVfdGVzdCAodGltZV90IG5vdykKK3sKKyAgcmV0dXJuIChta3RpbWVfdGVzdDEgKG5vdykKKwkgICYmIG1rdGltZV90ZXN0MSAoKHRpbWVfdCkgKHRpbWVfdF9tYXggLSBub3cpKQorCSAgJiYgbWt0aW1lX3Rlc3QxICgodGltZV90KSAodGltZV90X21pbiArIG5vdykpKTsKK30KKworc3RhdGljIGludAoraXJpeF82XzRfYnVnICgpCit7CisgIC8qIEJhc2VkIG9uIGNvZGUgZnJvbSBBcmllbCBGYWlnb24uICAqLworICBzdHJ1Y3QgdG0gdG07CisgIHRtLnRtX3llYXIgPSA5NjsKKyAgdG0udG1fbW9uID0gMzsKKyAgdG0udG1fbWRheSA9IDA7CisgIHRtLnRtX2hvdXIgPSAwOworICB0bS50bV9taW4gPSAwOworICB0bS50bV9zZWMgPSAwOworICB0bS50bV9pc2RzdCA9IC0xOworICBta3RpbWUgKCZ0bSk7CisgIHJldHVybiB0bS50bV9tb24gPT0gMiAmJiB0bS50bV9tZGF5ID09IDMxOworfQorCitzdGF0aWMgaW50CitiaWd0aW1lX3Rlc3QgKGludCBqKQoreworICBzdHJ1Y3QgdG0gdG07CisgIHRpbWVfdCBub3c7CisgIHRtLnRtX3llYXIgPSB0bS50bV9tb24gPSB0bS50bV9tZGF5ID0gdG0udG1faG91ciA9IHRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IGo7CisgIG5vdyA9IG1rdGltZSAoJnRtKTsKKyAgaWYgKG5vdyAhPSAodGltZV90KSAtMSkKKyAgICB7CisgICAgICBzdHJ1Y3QgdG0gKmx0ID0gbG9jYWx0aW1lICgmbm93KTsKKyAgICAgIGlmICghIChsdAorCSAgICAgJiYgbHQtPnRtX3llYXIgPT0gdG0udG1feWVhcgorCSAgICAgJiYgbHQtPnRtX21vbiA9PSB0bS50bV9tb24KKwkgICAgICYmIGx0LT50bV9tZGF5ID09IHRtLnRtX21kYXkKKwkgICAgICYmIGx0LT50bV9ob3VyID09IHRtLnRtX2hvdXIKKwkgICAgICYmIGx0LT50bV9taW4gPT0gdG0udG1fbWluCisJICAgICAmJiBsdC0+dG1fc2VjID09IHRtLnRtX3NlYworCSAgICAgJiYgbHQtPnRtX3lkYXkgPT0gdG0udG1feWRheQorCSAgICAgJiYgbHQtPnRtX3dkYXkgPT0gdG0udG1fd2RheQorCSAgICAgJiYgKChsdC0+dG1faXNkc3QgPCAwID8gLTEgOiAwIDwgbHQtPnRtX2lzZHN0KQorCQkgID09ICh0bS50bV9pc2RzdCA8IDAgPyAtMSA6IDAgPCB0bS50bV9pc2RzdCkpKSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Cit5ZWFyXzIwNTBfdGVzdCAoKQoreworICAvKiBUaGUgY29ycmVjdCBhbnN3ZXIgZm9yIDIwNTAtMDItMDEgMDA6MDA6MDAgaW4gUGFjaWZpYyB0aW1lLAorICAgICBpZ25vcmluZyBsZWFwIHNlY29uZHMuICAqLworICB1bnNpZ25lZCBsb25nIGludCBhbnN3ZXIgPSAyNTI3MzE1MjAwVUw7CisKKyAgc3RydWN0IHRtIHRtOworICB0aW1lX3QgdDsKKyAgdG0udG1feWVhciA9IDIwNTAgLSAxOTAwOworICB0bS50bV9tb24gPSAyIC0gMTsKKyAgdG0udG1fbWRheSA9IDE7CisgIHRtLnRtX2hvdXIgPSB0bS50bV9taW4gPSB0bS50bV9zZWMgPSAwOworICB0bS50bV9pc2RzdCA9IC0xOworCisgIC8qIFVzZSB0aGUgcG9ydGFibGUgUE9TSVguMSBzcGVjaWZpY2F0aW9uICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIgorICAgICBpbnN0ZWFkIG9mICJUWj1BbWVyaWNhL1ZhbmNvdXZlciIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBidWcgZXZlbgorICAgICBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgT2xzb24gZXh0ZW5zaW9uLCBvciBkb24ndCBoYXZlIHRoZQorICAgICBmdWxsIHpvbmVpbmZvIHRhYmxlcyBpbnN0YWxsZWQuICAqLworICBwdXRlbnYgKChjaGFyKikgIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiKTsKKworICB0ID0gbWt0aW1lICgmdG0pOworCisgIC8qIENoZWNrIHRoYXQgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYSBmYWlsdXJlLCBvciBjbG9zZSBlbm91Z2gKKyAgICAgdG8gdGhlIGNvcnJlY3QgYW5zd2VyIHRoYXQgd2UgY2FuIGFzc3VtZSB0aGUgZGlzY3JlcGFuY3kgaXMKKyAgICAgZHVlIHRvIGxlYXAgc2Vjb25kcy4gICovCisgIHJldHVybiAodCA9PSAodGltZV90KSAtMQorCSAgfHwgKDAgPCB0ICYmIGFuc3dlciAtIDEyMCA8PSB0ICYmIHQgPD0gYW5zd2VyICsgMTIwKSk7Cit9CisKK2ludAorbWFpbiAoKQoreworICB0aW1lX3QgdCwgZGVsdGE7CisgIGludCBpLCBqOworCisgIC8qIFRoaXMgdGVzdCBtYWtlcyBzb21lIGJ1Z2d5IG1rdGltZSBpbXBsZW1lbnRhdGlvbnMgbG9vcC4KKyAgICAgR2l2ZSB1cCBhZnRlciA2MCBzZWNvbmRzOyBhIG1rdGltZSBzbG93ZXIgdGhhbiB0aGF0CisgICAgIGlzbid0IHdvcnRoIHVzaW5nIGFueXdheS4gICovCisgIGFsYXJtICg2MCk7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICB0ID0gKHRpbWVfdF9tYXggPDwgMSkgKyAxOworICAgICAgaWYgKHQgPD0gdGltZV90X21heCkKKwlicmVhazsKKyAgICAgIHRpbWVfdF9tYXggPSB0OworICAgIH0KKyAgdGltZV90X21pbiA9IC0gKCh0aW1lX3QpIH4gKHRpbWVfdCkgMCA9PSAodGltZV90KSAtMSkgLSB0aW1lX3RfbWF4OworCisgIGRlbHRhID0gdGltZV90X21heCAvIDk5NzsgLyogYSBzdWl0YWJsZSBwcmltZSBudW1iZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5fU1RSSU5HUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0el9zdHJpbmdzW2ldKQorCXB1dGVudiAoKGNoYXIqKSB0el9zdHJpbmdzW2ldKTsKKworICAgICAgZm9yICh0ID0gMDsgdCA8PSB0aW1lX3RfbWF4IC0gZGVsdGE7IHQgKz0gZGVsdGEpCisJaWYgKCEgbWt0aW1lX3Rlc3QgKHQpKQorCSAgcmV0dXJuIDE7CisgICAgICBpZiAoISAobWt0aW1lX3Rlc3QgKCh0aW1lX3QpIDEpCisJICAgICAmJiBta3RpbWVfdGVzdCAoKHRpbWVfdCkgKDYwICogNjApKQorCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwICogMjQpKSkpCisJcmV0dXJuIDE7CisKKyAgICAgIGZvciAoaiA9IDE7IDsgaiA8PD0gMSkKKwlpZiAoISBiaWd0aW1lX3Rlc3QgKGopKQorCSAgcmV0dXJuIDE7CisJZWxzZSBpZiAoSU5UX01BWCAvIDIgPCBqKQorCSAgYnJlYWs7CisgICAgICBpZiAoISBiaWd0aW1lX3Rlc3QgKElOVF9NQVgpKQorCXJldHVybiAxOworICAgIH0KKyAgcmV0dXJuICEgKGlyaXhfNl80X2J1ZyAoKSAmJiBzcHJpbmdfZm9yd2FyZF9nYXAgKCkgJiYgeWVhcl8yMDUwX3Rlc3QgKCkpOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUgPSBubzsgdGhlbgorICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBta3RpbWUuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIG1rdGltZS4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKKworCisKKworCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRwYWdlc2l6ZSIgImFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCitfQUNFT0YKKworZmkKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorLyogbWFsbG9jIG1pZ2h0IGhhdmUgYmVlbiByZW5hbWVkIGFzIHJwbF9tYWxsb2MuICovCisjdW5kZWYgbWFsbG9jCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiAhZGVmaW5lZCBIQVZFX1NURExJQl9ICitjaGFyICptYWxsb2MgKCk7CisjZW5kaWYKKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworaW50CittYWluICgpCit7CisgIGNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworICBjb25zdCBjaGFyICpjZGF0YTI7CisgIGludCBpLCBwYWdlc2l6ZTsKKyAgaW50IGZkLCBmZDI7CisKKyAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKKworICAvKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuICovCisgIGRhdGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICAqKGRhdGEgKyBpKSA9IHJhbmQgKCk7CisgIHVtYXNrICgwKTsKKyAgZmQgPSBjcmVhdCAoImNvbmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gMjsKKyAgaWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorICAgIHJldHVybiAzOworICBjbG9zZSAoZmQpOworCisgIC8qIE5leHQsIGNoZWNrIHRoYXQgdGhlIHRhaWwgb2YgYSBwYWdlIGlzIHplcm8tZmlsbGVkLiAgRmlsZSBtdXN0IGhhdmUKKyAgICAgbm9uLXplcm8gbGVuZ3RoLCBvdGhlcndpc2Ugd2UgcmlzayBTSUdCVVMgZm9yIGVudGlyZSBwYWdlLiAgKi8KKyAgZmQyID0gb3BlbiAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjAwKTsKKyAgaWYgKGZkMiA8IDApCisgICAgcmV0dXJuIDQ7CisgIGNkYXRhMiA9ICIiOworICBpZiAod3JpdGUgKGZkMiwgY2RhdGEyLCAxKSAhPSAxKQorICAgIHJldHVybiA1OworICBkYXRhMiA9IChjaGFyICopIG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZDIsIDBMKTsKKyAgaWYgKGRhdGEyID09IE1BUF9GQUlMRUQpCisgICAgcmV0dXJuIDY7CisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgIGlmICgqKGRhdGEyICsgaSkpCisgICAgICByZXR1cm4gNzsKKyAgY2xvc2UgKGZkMik7CisgIGlmIChtdW5tYXAgKGRhdGEyLCBwYWdlc2l6ZSkpCisgICAgcmV0dXJuIDg7CisKKyAgLyogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoIGFscmVhZHkgaGFzCisgICAgIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwgYWxzbyBtYWtlIHN1cmUgdGhhdAorICAgICB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCisgIGZkID0gb3BlbiAoImNvbmZ0ZXN0Lm1tYXAiLCBPX1JEV1IpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiA5OworICBpZiAoZGF0YTIgIT0gbW1hcCAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorICAgIHJldHVybiAxMDsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKyAgICAgIHJldHVybiAxMTsKKworICAvKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYSBkbyBub3QKKyAgICAgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBhIGJ1ZyBvbgorICAgICBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikgICovCisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisgIGRhdGEzID0gKGNoYXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7CisgIGlmICghZGF0YTMpCisgICAgcmV0dXJuIDEyOworICBpZiAocmVhZCAoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisgICAgcmV0dXJuIDEzOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorICAgICAgcmV0dXJuIDE0OworICBjbG9zZSAoZmQpOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTU1BUCAxIiA+PmNvbmZkZWZzLmgKKworZmkKK3JtIC1mIGNvbmZ0ZXN0Lm1tYXAgY29uZnRlc3QudHh0CisKK2ZvciBhY19oZWFkZXIgaW4gc3RkbGliLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN0ZGxpYi5oIiAiYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRsaWJfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NURExJQl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBsaWJjIGNvbXBhdGlibGUgcmVhbGxvYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSByZWFsbG9jLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGw9bm8KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCitjaGFyICpyZWFsbG9jICgpOworI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICEgcmVhbGxvYyAoMCwgMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPXllcworZWxzZQorICBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbCA9IHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUkVBTExPQyAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1JFQUxMT0MgMCIgPj5jb25mZGVmcy5oCisKKyAgIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIHJlYWxsb2MuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIHJlYWxsb2MuJGFjX29iamV4dCIKKyA7OworZXNhYworCisKKyRhc19lY2hvICIjZGVmaW5lIHJlYWxsb2MgcnBsX3JlYWxsb2MiID4+Y29uZmRlZnMuaAorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGFjY2VwdHMgYW4gZW1wdHkgc3RyaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19zdGF0X2VtcHR5X3N0cmluZ19idWc9eWVzCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKK3N0cnVjdCBzdGF0IHNidWY7CisgIHJldHVybiBzdGF0ICgiIiwgJnNidWYpID09IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zz1ubworZWxzZQorICBhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1Zz15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3N0YXRfZW1wdHlfc3RyaW5nX2J1ZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfc3RhdF9lbXB0eV9zdHJpbmdfYnVnID0geWVzOyB0aGVuCisgIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIHN0YXQuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIHN0YXQuJGFjX29iamV4dCIKKyA7OworZXNhYworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcgMQorX0FDRU9GCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgc3RydG9kIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIHN0cnRvZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3N0cnRvZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19zdHJ0b2Q9bm8KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmbmRlZiBzdHJ0b2QKK2RvdWJsZSBzdHJ0b2QgKCk7CisjZW5kaWYKK2ludAorbWFpbigpCit7CisgIHsKKyAgICAvKiBTb21lIHZlcnNpb25zIG9mIExpbnV4IHN0cnRvZCBtaXMtcGFyc2Ugc3RyaW5ncyB3aXRoIGxlYWRpbmcgJysnLiAgKi8KKyAgICBjaGFyICpzdHJpbmcgPSAiICs2OSI7CisgICAgY2hhciAqdGVybTsKKyAgICBkb3VibGUgdmFsdWU7CisgICAgdmFsdWUgPSBzdHJ0b2QgKHN0cmluZywgJnRlcm0pOworICAgIGlmICh2YWx1ZSAhPSA2OSB8fCB0ZXJtICE9IChzdHJpbmcgKyA0KSkKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgeworICAgIC8qIFVuZGVyIFNvbGFyaXMgMi40LCBzdHJ0b2QgcmV0dXJucyB0aGUgd3JvbmcgdmFsdWUgZm9yIHRoZQorICAgICAgIHRlcm1pbmF0aW5nIGNoYXJhY3RlciB1bmRlciBzb21lIGNvbmRpdGlvbnMuICAqLworICAgIGNoYXIgKnN0cmluZyA9ICJOYU4iOworICAgIGNoYXIgKnRlcm07CisgICAgc3RydG9kIChzdHJpbmcsICZ0ZXJtKTsKKyAgICBpZiAodGVybSAhPSBzdHJpbmcgJiYgKih0ZXJtIC0gMSkgPT0gMCkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX3N0cnRvZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19zdHJ0b2Q9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3N0cnRvZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfc3RydG9kIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfc3RydG9kID0gbm87IHRoZW4KKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgc3RydG9kLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJPQkpTPSIkTElCT0JKUyBzdHJ0b2QuJGFjX29iamV4dCIKKyA7OworZXNhYworCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwb3ciICJhY19jdl9mdW5jX3BvdyIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19wb3ciID0geHllczsgdGhlbiA6CisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcG93ID0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcG93IGluIC1sbSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcG93IGluIC1sbS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfbV9wb3crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG0gICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHBvdyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHBvdyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfbV9wb3c9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9tX3Bvdz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbV9wb3ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfbV9wb3ciID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbV9wb3ciID0geHllczsgdGhlbiA6CisgIFBPV19MSUI9LWxtCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbm5vdCBmaW5kIGxpYnJhcnkgY29udGFpbmluZyBkZWZpbml0aW9uIG9mIHBvdyIgPiYyO30KK2ZpCisKK2ZpCisKK2ZpCisKK2ZvciBhY19mdW5jIGluIHZwcmludGYKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAidnByaW50ZiIgImFjX2N2X2Z1bmNfdnByaW50ZiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY192cHJpbnRmIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVlBSSU5URiAxCitfQUNFT0YKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiX2RvcHJudCIgImFjX2N2X2Z1bmNfX2RvcHJudCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19fZG9wcm50IiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RPUFJOVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZmkKK2RvbmUKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGRlcGVuZGVuY3kgdHJhY2tpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZGVwZW5kZW5jeSB0cmFja2luZy4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7IFVTRV9UUkFDS0lORz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9UUkFDS0lORz15ZXMKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVVNFX1RSQUNLSU5HIiA+JjUKKyRhc19lY2hvICIkVVNFX1RSQUNLSU5HIiA+JjY7IH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byB1c2Ugc3RhdGljIGxpbmtpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byB1c2Ugc3RhdGljIGxpbmtpbmcuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWNfbGluayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWNfbGluaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3N0YXRpY19saW5rOyBTVEFUSUNfTElOSz0kZW5hYmxldmFsCitlbHNlCisgIFNUQVRJQ19MSU5LPW5vCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUQVRJQ19MSU5LIiA+JjUKKyRhc19lY2hvICIkU1RBVElDX0xJTksiID4mNjsgfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyAgICBhY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgICAgQ0ZMQUdTPS1waWUKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLXBpZSBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLXBpZSBmbGFnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2ZsYWdfSEFWRV9QSUUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZmxhZ19IQVZFX1BJRT15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmxhZ19IQVZFX1BJRT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZmxhZ19IQVZFX1BJRSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2ZsYWdfSEFWRV9QSUUiID4mNjsgfQorICAgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyAgICBIQVZFX1BJRT0kYWNfY3ZfZmxhZ19IQVZFX1BJRQorICAgIGlmIHRlc3QgIkhBVkVfUElFIiA9IHllczsgdGhlbgorICAgICAgICA6CisgICAgZWxzZQorICAgICAgICA6CisgICAgZmkKKworCisKKworICAgIGFjX3NhdmVfTERGTEFHUz0kTERGTEFHUworICAgIExERkxBR1M9LVdsLC16LHJlbHJvLC16LG5vdworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtV2wsLXoscmVscm8sLXosbm93IGxkIGZsYWdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLVdsLC16LHJlbHJvLC16LG5vdyBsZCBmbGFncy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mbGFnX0hBVkVfRlVMTF9SRUxSTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mbGFnX0hBVkVfRlVMTF9SRUxSTz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmxhZ19IQVZFX0ZVTExfUkVMUk89bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZmxhZ19IQVZFX0ZVTExfUkVMUk8iID4mNQorJGFzX2VjaG8gIiRhY19jdl9mbGFnX0hBVkVfRlVMTF9SRUxSTyIgPiY2OyB9CisgICAgTERGTEFHUz0kYWNfc2F2ZV9MREZMQUdTCisgICAgSEFWRV9GVUxMX1JFTFJPPSRhY19jdl9mbGFnX0hBVkVfRlVMTF9SRUxSTworICAgIGlmIHRlc3QgIkhBVkVfRlVMTF9SRUxSTyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgOgorICAgIGVsc2UKKyAgICAgICAgOgorICAgIGZpCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiB0ZXN0ICIkcHJlZml4IiA9IE5PTkU7IHRoZW4KKyAgZGF0YXJvb3RkaXI9JHthY19kZWZhdWx0X3ByZWZpeH0vc2hhcmUKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZpbGUgb3duZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZmlsZSBvd25lci4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXVzZXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3VzZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3VzZXI7IE9XTkVSPSR3aXRodmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9XTkVSIiA+JjUKKyRhc19lY2hvICIkT1dORVIiID4mNjsgfQordGVzdCAtbiAiJE9XTkVSIiAmJiBJTlNUQUxMPSIkSU5TVEFMTCAtbyAkT1dORVIiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGdyb3VwIG93bmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGdyb3VwIG93bmVyLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3JvdXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dyb3VwK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9ncm91cDsgR1JPVVA9JHdpdGh2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkR1JPVVAiID4mNQorJGFzX2VjaG8gIiRHUk9VUCIgPiY2OyB9Cit0ZXN0IC1uICIkR1JPVVAiICYmIElOU1RBTEw9IiRJTlNUQUxMIC1nICRHUk9VUCIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGV2aWNlIG5vZGUgdWlkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRldmljZSBub2RlIHVpZC4uLiAiID4mNjsgfQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGV2aWNlLXVpZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGV2aWNlX3VpZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGV2aWNlX3VpZDsgRE1fREVWSUNFX1VJRD0kd2l0aHZhbAorZWxzZQorICBETV9ERVZJQ0VfVUlEPTAKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRE1fREVWSUNFX1VJRCIgPiY1CiskYXNfZWNobyAiJERNX0RFVklDRV9VSUQiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERNX0RFVklDRV9VSUQgJERNX0RFVklDRV9VSUQKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRldmljZSBub2RlIGdpZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXZpY2Ugbm9kZSBnaWQuLi4gIiA+JjY7IH0KKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRldmljZS1naWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RldmljZV9naWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RldmljZV9naWQ7IERNX0RFVklDRV9HSUQ9JHdpdGh2YWwKK2Vsc2UKKyAgRE1fREVWSUNFX0dJRD0wCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERNX0RFVklDRV9HSUQiID4mNQorJGFzX2VjaG8gIiRETV9ERVZJQ0VfR0lEIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBETV9ERVZJQ0VfR0lEICRETV9ERVZJQ0VfR0lECitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXZpY2Ugbm9kZSBtb2RlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRldmljZSBub2RlIG1vZGUuLi4gIiA+JjY7IH0KKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRldmljZS1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kZXZpY2VfbW9kZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGV2aWNlX21vZGU7IERNX0RFVklDRV9NT0RFPSR3aXRodmFsCitlbHNlCisgIERNX0RFVklDRV9NT0RFPTA2MDAKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRE1fREVWSUNFX01PREUiID4mNQorJGFzX2VjaG8gIiRETV9ERVZJQ0VfTU9ERSIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgRE1fREVWSUNFX01PREUgJERNX0RFVklDRV9NT0RFCitfQUNFT0YKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZW4gdG8gY3JlYXRlIGRldmljZSBub2RlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGVuIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZXMuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kZXZpY2Utbm9kZXMtb24gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RldmljZV9ub2Rlc19vbitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGV2aWNlX25vZGVzX29uOyBBRERfTk9ERT0kd2l0aHZhbAorZWxzZQorICBBRERfTk9ERT1yZXN1bWUKK2ZpCisKK2Nhc2UgIiRBRERfTk9ERSIgaW4KKyByZXN1bWUpIGFkZF9vbj1ETV9BRERfTk9ERV9PTl9SRVNVTUU7OworIGNyZWF0ZSkgYWRkX29uPURNX0FERF9OT0RFX09OX0NSRUFURTs7CisgKikgYXNfZm5fZXJyb3IgJD8gIi0td2l0aC1kZXZpY2Utbm9kZXMtb24gcGFyYW1ldGVyIGludmFsaWQiICIkTElORU5PIiA1OzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvbiAkQUREX05PREUiID4mNQorJGFzX2VjaG8gIm9uICRBRERfTk9ERSIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9ETV9BRERfTk9ERSAkYWRkX29uCitfQUNFT0YKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlZmF1bHQgbmFtZSBtYW5nbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZWZhdWx0IG5hbWUgbWFuZ2xpbmcuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kZWZhdWx0LW5hbWUtbWFuZ2xpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfbmFtZV9tYW5nbGluZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGVmYXVsdF9uYW1lX21hbmdsaW5nOyBNQU5HTElORz0kd2l0aHZhbAorZWxzZQorICBNQU5HTElORz1hdXRvCitmaQorCitjYXNlICIkTUFOR0xJTkciIGluCisgYXV0bykgbWFuZ2xpbmc9RE1fU1RSSU5HX01BTkdMSU5HX0FVVE87OworIG5vbmV8ZGlzYWJsZWQpIG1hbmdsaW5nPURNX1NUUklOR19NQU5HTElOR19OT05FOzsKKyBoZXgpIG1hbmdsaW5nPURNX1NUUklOR19NQU5HTElOR19IRVg7OworICopIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtZGVmYXVsdC1uYW1lLW1hbmdsaW5nIHBhcmFtZXRlciBpbnZhbGlkIiAiJExJTkVOTyIgNTs7Citlc2FjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTkdMSU5HIiA+JjUKKyRhc19lY2hvICIkTUFOR0xJTkciID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfRE1fTkFNRV9NQU5HTElORyAkbWFuZ2xpbmcKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGx2bTEgZmFsbGJhY2siID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbHZtMSBmYWxsYmFjay4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWx2bTFfZmFsbGJhY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbHZtMV9mYWxsYmFjaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2x2bTFfZmFsbGJhY2s7IExWTTFfRkFMTEJBQ0s9JGVuYWJsZXZhbAorZWxzZQorICBMVk0xX0ZBTExCQUNLPW5vCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExWTTFfRkFMTEJBQ0siID4mNQorJGFzX2VjaG8gIiRMVk0xX0ZBTExCQUNLIiA+JjY7IH0KKworaWYgdGVzdCAiJExWTTFfRkFMTEJBQ0siID0geWVzOyB0aGVuCisJREVGQVVMVF9GQUxMQkFDS19UT19MVk0xPTEKKworJGFzX2VjaG8gIiNkZWZpbmUgTFZNMV9GQUxMQkFDSyAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorCURFRkFVTFRfRkFMTEJBQ0tfVE9fTFZNMT0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfRkFMTEJBQ0tfVE9fTFZNMSAkREVGQVVMVF9GQUxMQkFDS19UT19MVk0xCitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgbHZtMSBtZXRhZGF0YSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgbHZtMSBtZXRhZGF0YS4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWx2bTEgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2x2bTErc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2x2bTE7IExWTTE9JHdpdGh2YWwKK2Vsc2UKKyAgTFZNMT1pbnRlcm5hbAorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExWTTEiID4mNQorJGFzX2VjaG8gIiRMVk0xIiA+JjY7IH0KKworY2FzZSAiJExWTTEiIGluCisgIG5vbmV8c2hhcmVkKSA7OworICBpbnRlcm5hbCkKKyRhc19lY2hvICIjZGVmaW5lIExWTTFfSU5URVJOQUwgMSIgPj5jb25mZGVmcy5oCisgOzsKKyAgKikgYXNfZm5fZXJyb3IgJD8gIi0td2l0aC1sdm0xIHBhcmFtZXRlciBpbnZhbGlkIiAiJExJTkVOTyIgNSA7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgR0ZTIHBvb2wgbWV0YWRhdGEiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEdGUyBwb29sIG1ldGFkYXRhLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcG9vbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcG9vbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfcG9vbDsgUE9PTD0kd2l0aHZhbAorZWxzZQorICBQT09MPWludGVybmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBPT0wiID4mNQorJGFzX2VjaG8gIiRQT09MIiA+JjY7IH0KKworY2FzZSAiJFBPT0wiIGluCisgIG5vbmV8c2hhcmVkKSA7OworICBpbnRlcm5hbCkKKyRhc19lY2hvICIjZGVmaW5lIFBPT0xfSU5URVJOQUwgMSIgPj5jb25mZGVmcy5oCisgOzsKKyAgKikgYXNfZm5fZXJyb3IgJD8gIi0td2l0aC1wb29sIHBhcmFtZXRlciBpbnZhbGlkIiAiJExJTkVOTyIgNQorZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgY2x1c3RlciBsb2NraW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBjbHVzdGVyIGxvY2tpbmcuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jbHVzdGVyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jbHVzdGVyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jbHVzdGVyOyBDTFVTVEVSPSR3aXRodmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENMVVNURVIiID4mNQorJGFzX2VjaG8gIiRDTFVTVEVSIiA+JjY7IH0KKworY2FzZSAiJENMVVNURVIiIGluCisgIG5vbmV8c2hhcmVkKSA7OworICBpbnRlcm5hbCkKKyRhc19lY2hvICIjZGVmaW5lIENMVVNURVJfTE9DS0lOR19JTlRFUk5BTCAxIiA+PmNvbmZkZWZzLmgKKyA7OworICAqKSBhc19mbl9lcnJvciAkPyAiLS13aXRoLWNsdXN0ZXIgcGFyYW1ldGVyIGludmFsaWQiICIkTElORU5PIiA1IDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBzbmFwc2hvdHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHNuYXBzaG90cy4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNuYXBzaG90cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc25hcHNob3RzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zbmFwc2hvdHM7IFNOQVBTSE9UUz0kd2l0aHZhbAorZWxzZQorICBTTkFQU0hPVFM9aW50ZXJuYWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU05BUFNIT1RTIiA+JjUKKyRhc19lY2hvICIkU05BUFNIT1RTIiA+JjY7IH0KKworY2FzZSAiJFNOQVBTSE9UUyIgaW4KKyAgbm9uZXxzaGFyZWQpIDs7CisgIGludGVybmFsKQorJGFzX2VjaG8gIiNkZWZpbmUgU05BUFNIT1RfSU5URVJOQUwgMSIgPj5jb25mZGVmcy5oCisgOzsKKyAgKikgYXNfZm5fZXJyb3IgJD8gIi0td2l0aC1zbmFwc2hvdHMgcGFyYW1ldGVyIGludmFsaWQiICIkTElORU5PIiA1IDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBtaXJyb3JzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBtaXJyb3JzLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbWlycm9ycyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbWlycm9ycytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfbWlycm9yczsgTUlSUk9SUz0kd2l0aHZhbAorZWxzZQorICBNSVJST1JTPWludGVybmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1JUlJPUlMiID4mNQorJGFzX2VjaG8gIiRNSVJST1JTIiA+JjY7IH0KKworY2FzZSAiJE1JUlJPUlMiIGluCisgIG5vbmV8c2hhcmVkKSA7OworICBpbnRlcm5hbCkKKyRhc19lY2hvICIjZGVmaW5lIE1JUlJPUkVEX0lOVEVSTkFMIDEiID4+Y29uZmRlZnMuaAorIDs7CisgICopIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtbWlycm9ycyBwYXJhbWV0ZXIgaW52YWxpZCIgIiRMSU5FTk8iIDUgOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHJhaWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHJhaWQuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1yYWlkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9yYWlkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9yYWlkOyBSQUlEPSR3aXRodmFsCitlbHNlCisgIFJBSUQ9aW50ZXJuYWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFJRCIgPiY1CiskYXNfZWNobyAiJFJBSUQiID4mNjsgfQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGVmYXVsdC1taXJyb3Itc2VndHlwZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9taXJyb3Jfc2VndHlwZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGVmYXVsdF9taXJyb3Jfc2VndHlwZTsgREVGQVVMVF9NSVJST1JfU0VHVFlQRT0kd2l0aHZhbAorZWxzZQorICBERUZBVUxUX01JUlJPUl9TRUdUWVBFPSJyYWlkMSIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kZWZhdWx0LXJhaWQxMC1zZWd0eXBlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kZWZhdWx0X3JhaWQxMF9zZWd0eXBlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3JhaWQxMF9zZWd0eXBlOyBERUZBVUxUX1JBSUQxMF9TRUdUWVBFPSR3aXRodmFsCitlbHNlCisgIERFRkFVTFRfUkFJRDEwX1NFR1RZUEU9InJhaWQxMCIKK2ZpCisKK2Nhc2UgIiRSQUlEIiBpbgorICBub25lKSAgdGVzdCAiJERFRkFVTFRfTUlSUk9SX1NFR1RZUEUiID0gInJhaWQxIiAmJiBERUZBVUxUX01JUlJPUl9TRUdUWVBFPSJtaXJyb3IiCisJdGVzdCAiJERFRkFVTFRfUkFJRDEwX1NFR1RZUEUiID0gInJhaWQxMCIgJiYgREVGQVVMVF9SQUlEMTBfU0VHVFlQRT0ibWlycm9yIiA7OworICBzaGFyZWQpIDs7CisgIGludGVybmFsKQorJGFzX2VjaG8gIiNkZWZpbmUgUkFJRF9JTlRFUk5BTCAxIiA+PmNvbmZkZWZzLmgKKyA7OworICAqKSBhc19mbl9lcnJvciAkPyAiLS13aXRoLXJhaWQgcGFyYW1ldGVyIGludmFsaWQiICIkTElORU5PIiA1IDs7Citlc2FjCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX01JUlJPUl9TRUdUWVBFICIkREVGQVVMVF9NSVJST1JfU0VHVFlQRSIKK19BQ0VPRgorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX1JBSUQxMF9TRUdUWVBFICIkREVGQVVMVF9SQUlEMTBfU0VHVFlQRSIKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSByZXBsaWNhdG9ycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgcmVwbGljYXRvcnMuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1yZXBsaWNhdG9ycyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcmVwbGljYXRvcnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3JlcGxpY2F0b3JzOyBSRVBMSUNBVE9SUz0kd2l0aHZhbAorZWxzZQorICBSRVBMSUNBVE9SUz1ub25lCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJFUExJQ0FUT1JTIiA+JjUKKyRhc19lY2hvICIkUkVQTElDQVRPUlMiID4mNjsgfQorCitjYXNlICIkUkVQTElDQVRPUlMiIGluCisgIG5vbmV8c2hhcmVkKSA7OworICBpbnRlcm5hbCkKKyRhc19lY2hvICIjZGVmaW5lIFJFUExJQ0FUT1JfSU5URVJOQUwgMSIgPj5jb25mZGVmcy5oCisgOzsKKyAgKikgYXNfZm5fZXJyb3IgJD8gIi0td2l0aC1yZXBsaWNhdG9ycyBwYXJhbWV0ZXIgaW52YWxpZCAoJFJFUExJQ0FUT1JTKSIgIiRMSU5FTk8iIDUgOzsKK2VzYWMKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGVmYXVsdC1zcGFyc2Utc2VndHlwZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9zcGFyc2Vfc2VndHlwZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGVmYXVsdF9zcGFyc2Vfc2VndHlwZTsgREVGQVVMVF9TUEFSU0VfU0VHVFlQRT0kd2l0aHZhbAorZWxzZQorICBERUZBVUxUX1NQQVJTRV9TRUdUWVBFPSJ0aGluIgorZmkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgdGhpbiBwcm92aXNpb25pbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIHRoaW4gcHJvdmlzaW9uaW5nLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhpbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdGhpbitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGhpbjsgVEhJTj0kd2l0aHZhbAorZWxzZQorICBUSElOPWludGVybmFsCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhpbi1jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdGhpbl9jaGVjaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGhpbl9jaGVjazsgVEhJTl9DSEVDS19DTUQ9JHdpdGh2YWwKK2Vsc2UKKyAgVEhJTl9DSEVDS19DTUQ9ImF1dG9kZXRlY3QiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhpbi1kdW1wIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90aGluX2R1bXArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3RoaW5fZHVtcDsgVEhJTl9EVU1QX0NNRD0kd2l0aHZhbAorZWxzZQorICBUSElOX0RVTVBfQ01EPSJhdXRvZGV0ZWN0IgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRoaW4tcmVwYWlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90aGluX3JlcGFpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGhpbl9yZXBhaXI7IFRISU5fUkVQQUlSX0NNRD0kd2l0aHZhbAorZWxzZQorICBUSElOX1JFUEFJUl9DTUQ9ImF1dG9kZXRlY3QiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhpbi1yZXN0b3JlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90aGluX3Jlc3RvcmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3RoaW5fcmVzdG9yZTsgVEhJTl9SRVNUT1JFX0NNRD0kd2l0aHZhbAorZWxzZQorICBUSElOX1JFU1RPUkVfQ01EPSJhdXRvZGV0ZWN0IgorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRISU4iID4mNQorJGFzX2VjaG8gIiRUSElOIiA+JjY7IH0KKworY2FzZSAiJFRISU4iIGluCisgIG5vbmUpICB0ZXN0ICIkREVGQVVMVF9TUEFSU0VfU0VHVFlQRSIgPSAidGhpbiIgJiYgREVGQVVMVF9TUEFSU0VfU0VHVFlQRT0ic25hcHNob3QiIDs7CisgIHNoYXJlZCkgOzsKKyAgaW50ZXJuYWwpCiskYXNfZWNobyAiI2RlZmluZSBUSElOX0lOVEVSTkFMIDEiID4+Y29uZmRlZnMuaAorIDs7CisgICopIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtdGhpbiBwYXJhbWV0ZXIgaW52YWxpZCAoJFRISU4pIiAiJExJTkVOTyIgNSA7OworZXNhYworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9TUEFSU0VfU0VHVFlQRSAiJERFRkFVTFRfU1BBUlNFX1NFR1RZUEUiCitfQUNFT0YKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGhpbl9jaGVja19uZWVkc19jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90aGluX2NoZWNrX25lZWRzX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdGhpbl9jaGVja19uZWVkc19jaGVjazsgVEhJTl9DSEVDS19ORUVEU19DSEVDSz0kZW5hYmxldmFsCitlbHNlCisgIFRISU5fQ0hFQ0tfTkVFRFNfQ0hFQ0s9eWVzCitmaQorCisKKyMgVGVzdCBpZiBuZWNlc3NhcnkgdGhpbiB0b29scyBhcmUgYXZhaWxhYmxlCisjIGlmIG5vdCAtIHVzZSBwbGFpbiBkZWZhdWx0cyBhbmQgd2FybiB1c2VyCitjYXNlICIkVEhJTiIgaW4KKyAgaW50ZXJuYWx8c2hhcmVkKQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSB0aGluIGNoZWNraW5nCisJaWYgdGVzdCAiJFRISU5fQ0hFQ0tfQ01EIiA9ICJhdXRvZGV0ZWN0IjsgdGhlbgorCQlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH10aGluX2NoZWNrIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXRoaW5fY2hlY2s7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1RISU5fQ0hFQ0tfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkVEhJTl9DSEVDS19DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfVEhJTl9DSEVDS19DTUQ9IiRUSElOX0NIRUNLX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfVEhJTl9DSEVDS19DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitUSElOX0NIRUNLX0NNRD0kYWNfY3ZfcGF0aF9USElOX0NIRUNLX0NNRAoraWYgdGVzdCAtbiAiJFRISU5fQ0hFQ0tfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRISU5fQ0hFQ0tfQ01EIiA+JjUKKyRhc19lY2hvICIkVEhJTl9DSEVDS19DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1RISU5fQ0hFQ0tfQ01EIjsgdGhlbgorICBhY19wdF9USElOX0NIRUNLX0NNRD0kVEhJTl9DSEVDS19DTUQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ0aGluX2NoZWNrIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB0aGluX2NoZWNrOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9USElOX0NIRUNLX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1RISU5fQ0hFQ0tfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X1RISU5fQ0hFQ0tfQ01EPSIkYWNfcHRfVEhJTl9DSEVDS19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1RISU5fQ0hFQ0tfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfVEhJTl9DSEVDS19DTUQ9JGFjX2N2X3BhdGhfYWNfcHRfVEhJTl9DSEVDS19DTUQKK2lmIHRlc3QgLW4gIiRhY19wdF9USElOX0NIRUNLX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9USElOX0NIRUNLX0NNRCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X1RISU5fQ0hFQ0tfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfVEhJTl9DSEVDS19DTUQiID0geDsgdGhlbgorICAgIFRISU5fQ0hFQ0tfQ01EPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgVEhJTl9DSEVDS19DTUQ9JGFjX3B0X1RISU5fQ0hFQ0tfQ01ECisgIGZpCitlbHNlCisgIFRISU5fQ0hFQ0tfQ01EPSIkYWNfY3ZfcGF0aF9USElOX0NIRUNLX0NNRCIKK2ZpCisKKwkJaWYgdGVzdCAteiAiJFRISU5fQ0hFQ0tfQ01EIjsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB0aGluX2NoZWNrIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHRoaW5fY2hlY2sgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiID4mMjt9CisJCQlUSElOX0NIRUNLX0NNRD0vdXNyL3NiaW4vdGhpbl9jaGVjaworCQkJVEhJTl9DT05GSUdVUkVfV0FSTj15CisJCWZpCisJZmkKKwlpZiB0ZXN0ICIkVEhJTl9DSEVDS19ORUVEU19DSEVDSyIgPSB5ZXM7IHRoZW4KKwkJVEhJTl9DSEVDS19WU049YCIkVEhJTl9DSEVDS19DTUQiIC1WIDI+L2Rldi9udWxsYAorCQlUSElOX0NIRUNLX1ZTTl9NQUpPUj1gZWNobyAiJFRISU5fQ0hFQ0tfVlNOIiB8ICRBV0sgLUYgJy4nICd7cHJpbnQgJDF9J2AKKwkJVEhJTl9DSEVDS19WU05fTUlOT1I9YGVjaG8gIiRUSElOX0NIRUNLX1ZTTiIgfCAkQVdLIC1GICcuJyAne3ByaW50ICQyfSdgCisKKwkJaWYgdGVzdCAteiAiJFRISU5fQ0hFQ0tfVlNOX01BSk9SIiAtbyAteiAiJFRISU5fQ0hFQ0tfVlNOX01JTk9SIjsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkVEhJTl9DSEVDS19DTUQ6IEJhZCB2ZXJzaW9uIFwiJFRISU5fQ0hFQ0tfVlNOXCIgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJFRISU5fQ0hFQ0tfQ01EOiBCYWQgdmVyc2lvbiBcIiRUSElOX0NIRUNLX1ZTTlwiIGZvdW5kIiA+JjI7fQorCQkJVEhJTl9DSEVDS19WRVJTSU9OX1dBUk49eQorCQkJVEhJTl9DSEVDS19ORUVEU19DSEVDSz1ubworCQllbGlmIHRlc3QgIiRUSElOX0NIRUNLX1ZTTl9NQUpPUiIgLWVxIDAgLWEgIiRUSElOX0NIRUNLX1ZTTl9NSU5PUiIgLWx0IDM7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJFRISU5fQ0hFQ0tfQ01EOiBPbGQgdmVyc2lvbiBcIiRUSElOX0NIRUNLX1ZTTlwiIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRUSElOX0NIRUNLX0NNRDogT2xkIHZlcnNpb24gXCIkVEhJTl9DSEVDS19WU05cIiBmb3VuZCIgPiYyO30KKwkJCVRISU5fQ0hFQ0tfVkVSU0lPTl9XQVJOPXkKKwkJCVRISU5fQ0hFQ0tfTkVFRFNfQ0hFQ0s9bm8KKwkJZmkKKwlmaQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSB0aGluIGR1bXBpbmcKKwlpZiB0ZXN0ICIkVEhJTl9EVU1QX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9dGhpbl9kdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXRoaW5fZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfVEhJTl9EVU1QX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFRISU5fRFVNUF9DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfVEhJTl9EVU1QX0NNRD0iJFRISU5fRFVNUF9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1RISU5fRFVNUF9DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitUSElOX0RVTVBfQ01EPSRhY19jdl9wYXRoX1RISU5fRFVNUF9DTUQKK2lmIHRlc3QgLW4gIiRUSElOX0RVTVBfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRISU5fRFVNUF9DTUQiID4mNQorJGFzX2VjaG8gIiRUSElOX0RVTVBfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9USElOX0RVTVBfQ01EIjsgdGhlbgorICBhY19wdF9USElOX0RVTVBfQ01EPSRUSElOX0RVTVBfQ01ECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAidGhpbl9kdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB0aGluX2R1bXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X1RISU5fRFVNUF9DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9USElOX0RVTVBfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X1RISU5fRFVNUF9DTUQ9IiRhY19wdF9USElOX0RVTVBfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9USElOX0RVTVBfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfVEhJTl9EVU1QX0NNRD0kYWNfY3ZfcGF0aF9hY19wdF9USElOX0RVTVBfQ01ECitpZiB0ZXN0IC1uICIkYWNfcHRfVEhJTl9EVU1QX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9USElOX0RVTVBfQ01EIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfVEhJTl9EVU1QX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X1RISU5fRFVNUF9DTUQiID0geDsgdGhlbgorICAgIFRISU5fRFVNUF9DTUQ9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBUSElOX0RVTVBfQ01EPSRhY19wdF9USElOX0RVTVBfQ01ECisgIGZpCitlbHNlCisgIFRISU5fRFVNUF9DTUQ9IiRhY19jdl9wYXRoX1RISU5fRFVNUF9DTUQiCitmaQorCisJCXRlc3QgLXogIiRUSElOX0RVTVBfQ01EIiAmJiB7CisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHRoaW5fZHVtcCBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0aGluX2R1bXAgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiID4mMjt9CisJCQlUSElOX0RVTVBfQ01EPS91c3Ivc2Jpbi90aGluX2R1bXAKKwkJCVRISU5fQ09ORklHVVJFX1dBUk49eQorCQl9CisJZmkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgdGhpbiByZXBhaXJpbmcKKwlpZiB0ZXN0ICIkVEhJTl9SRVBBSVJfQ01EIiA9ICJhdXRvZGV0ZWN0IjsgdGhlbgorCQlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH10aGluX3JlcGFpciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH10aGluX3JlcGFpcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfVEhJTl9SRVBBSVJfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkVEhJTl9SRVBBSVJfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1RISU5fUkVQQUlSX0NNRD0iJFRISU5fUkVQQUlSX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfVEhJTl9SRVBBSVJfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorVEhJTl9SRVBBSVJfQ01EPSRhY19jdl9wYXRoX1RISU5fUkVQQUlSX0NNRAoraWYgdGVzdCAtbiAiJFRISU5fUkVQQUlSX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRUSElOX1JFUEFJUl9DTUQiID4mNQorJGFzX2VjaG8gIiRUSElOX1JFUEFJUl9DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1RISU5fUkVQQUlSX0NNRCI7IHRoZW4KKyAgYWNfcHRfVEhJTl9SRVBBSVJfQ01EPSRUSElOX1JFUEFJUl9DTUQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ0aGluX3JlcGFpciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgdGhpbl9yZXBhaXI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X1RISU5fUkVQQUlSX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1RISU5fUkVQQUlSX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9USElOX1JFUEFJUl9DTUQ9IiRhY19wdF9USElOX1JFUEFJUl9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1RISU5fUkVQQUlSX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X1RISU5fUkVQQUlSX0NNRD0kYWNfY3ZfcGF0aF9hY19wdF9USElOX1JFUEFJUl9DTUQKK2lmIHRlc3QgLW4gIiRhY19wdF9USElOX1JFUEFJUl9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfVEhJTl9SRVBBSVJfQ01EIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfVEhJTl9SRVBBSVJfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfVEhJTl9SRVBBSVJfQ01EIiA9IHg7IHRoZW4KKyAgICBUSElOX1JFUEFJUl9DTUQ9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBUSElOX1JFUEFJUl9DTUQ9JGFjX3B0X1RISU5fUkVQQUlSX0NNRAorICBmaQorZWxzZQorICBUSElOX1JFUEFJUl9DTUQ9IiRhY19jdl9wYXRoX1RISU5fUkVQQUlSX0NNRCIKK2ZpCisKKwkJdGVzdCAteiAiJFRISU5fUkVQQUlSX0NNRCIgJiYgeworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB0aGluX3JlcGFpciBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0aGluX3JlcGFpciBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiYyO30KKwkJCVRISU5fUkVQQUlSX0NNRD0vdXNyL3NiaW4vdGhpbl9yZXBhaXIKKwkJCVRISU5fQ09ORklHVVJFX1dBUk49eQorCQl9CisJZmkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgdGhpbiByZXN0b3JpbmcKKwlpZiB0ZXN0ICIkVEhJTl9SRVNUT1JFX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9dGhpbl9yZXN0b3JlIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXRoaW5fcmVzdG9yZTsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfVEhJTl9SRVNUT1JFX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFRISU5fUkVTVE9SRV9DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfVEhJTl9SRVNUT1JFX0NNRD0iJFRISU5fUkVTVE9SRV9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1RISU5fUkVTVE9SRV9DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitUSElOX1JFU1RPUkVfQ01EPSRhY19jdl9wYXRoX1RISU5fUkVTVE9SRV9DTUQKK2lmIHRlc3QgLW4gIiRUSElOX1JFU1RPUkVfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRISU5fUkVTVE9SRV9DTUQiID4mNQorJGFzX2VjaG8gIiRUSElOX1JFU1RPUkVfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9USElOX1JFU1RPUkVfQ01EIjsgdGhlbgorICBhY19wdF9USElOX1JFU1RPUkVfQ01EPSRUSElOX1JFU1RPUkVfQ01ECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAidGhpbl9yZXN0b3JlIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB0aGluX3Jlc3RvcmU7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X1RISU5fUkVTVE9SRV9DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9USElOX1JFU1RPUkVfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X1RISU5fUkVTVE9SRV9DTUQ9IiRhY19wdF9USElOX1JFU1RPUkVfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9USElOX1JFU1RPUkVfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfVEhJTl9SRVNUT1JFX0NNRD0kYWNfY3ZfcGF0aF9hY19wdF9USElOX1JFU1RPUkVfQ01ECitpZiB0ZXN0IC1uICIkYWNfcHRfVEhJTl9SRVNUT1JFX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9USElOX1JFU1RPUkVfQ01EIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfVEhJTl9SRVNUT1JFX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X1RISU5fUkVTVE9SRV9DTUQiID0geDsgdGhlbgorICAgIFRISU5fUkVTVE9SRV9DTUQ9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBUSElOX1JFU1RPUkVfQ01EPSRhY19wdF9USElOX1JFU1RPUkVfQ01ECisgIGZpCitlbHNlCisgIFRISU5fUkVTVE9SRV9DTUQ9IiRhY19jdl9wYXRoX1RISU5fUkVTVE9SRV9DTUQiCitmaQorCisJCXRlc3QgLXogIiRUSElOX1JFU1RPUkVfQ01EIiAmJiB7CisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHRoaW5fcmVzdG9yZSBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB0aGluX3Jlc3RvcmUgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiID4mMjt9CisJCQlUSElOX1JFU1RPUkVfQ01EPS91c3Ivc2Jpbi90aGluX3Jlc3RvcmUKKwkJCVRISU5fQ09ORklHVVJFX1dBUk49eQorCQl9CisJZmkKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGluX2NoZWNrIHN1cHBvcnRzIHRoZSBuZWVkcy1jaGVjayBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhpbl9jaGVjayBzdXBwb3J0cyB0aGUgbmVlZHMtY2hlY2sgZmxhZy4uLiAiID4mNjsgfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEhJTl9DSEVDS19ORUVEU19DSEVDSyIgPiY1CiskYXNfZWNobyAiJFRISU5fQ0hFQ0tfTkVFRFNfQ0hFQ0siID4mNjsgfQorCWlmIHRlc3QgIiRUSElOX0NIRUNLX05FRURTX0NIRUNLIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBUSElOX0NIRUNLX05FRURTX0NIRUNLIDEiID4+Y29uZmRlZnMuaAorCisJZmkKKworCTs7Citlc2FjCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBUSElOX0NIRUNLX0NNRCAiJFRISU5fQ0hFQ0tfQ01EIgorX0FDRU9GCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFRISU5fRFVNUF9DTUQgIiRUSElOX0RVTVBfQ01EIgorX0FDRU9GCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFRISU5fUkVQQUlSX0NNRCAiJFRISU5fUkVQQUlSX0NNRCIKK19BQ0VPRgorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBUSElOX1JFU1RPUkVfQ01EICIkVEhJTl9SRVNUT1JFX0NNRCIKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBjYWNoZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGluY2x1ZGUgY2FjaGUuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jYWNoZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY2FjaGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2NhY2hlOyBDQUNIRT0kd2l0aHZhbAorZWxzZQorICBDQUNIRT0iaW50ZXJuYWwiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2FjaGUtY2hlY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2NhY2hlX2NoZWNrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jYWNoZV9jaGVjazsgQ0FDSEVfQ0hFQ0tfQ01EPSR3aXRodmFsCitlbHNlCisgIENBQ0hFX0NIRUNLX0NNRD0iYXV0b2RldGVjdCIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jYWNoZS1kdW1wIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jYWNoZV9kdW1wK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jYWNoZV9kdW1wOyBDQUNIRV9EVU1QX0NNRD0kd2l0aHZhbAorZWxzZQorICBDQUNIRV9EVU1QX0NNRD0iYXV0b2RldGVjdCIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jYWNoZS1yZXBhaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2NhY2hlX3JlcGFpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY2FjaGVfcmVwYWlyOyBDQUNIRV9SRVBBSVJfQ01EPSR3aXRodmFsCitlbHNlCisgIENBQ0hFX1JFUEFJUl9DTUQ9ImF1dG9kZXRlY3QiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2FjaGUtcmVzdG9yZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY2FjaGVfcmVzdG9yZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY2FjaGVfcmVzdG9yZTsgQ0FDSEVfUkVTVE9SRV9DTUQ9JHdpdGh2YWwKK2Vsc2UKKyAgQ0FDSEVfUkVTVE9SRV9DTUQ9ImF1dG9kZXRlY3QiCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENBQ0hFIiA+JjUKKyRhc19lY2hvICIkQ0FDSEUiID4mNjsgfQorCitjYXNlICIkQ0FDSEUiIGluCisgbm9uZXxzaGFyZWQpIDs7CisgaW50ZXJuYWwpCiskYXNfZWNobyAiI2RlZmluZSBDQUNIRV9JTlRFUk5BTCAxIiA+PmNvbmZkZWZzLmgKKyA7OworICopIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtY2FjaGUgcGFyYW1ldGVyIGludmFsaWQiICIkTElORU5PIiA1IDs7Citlc2FjCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jYWNoZV9jaGVja19uZWVkc19jaGVjayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jYWNoZV9jaGVja19uZWVkc19jaGVjaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2NhY2hlX2NoZWNrX25lZWRzX2NoZWNrOyBDQUNIRV9DSEVDS19ORUVEU19DSEVDSz0kZW5hYmxldmFsCitlbHNlCisgIENBQ0hFX0NIRUNLX05FRURTX0NIRUNLPXllcworZmkKKworCisjIFRlc3QgaWYgbmVjZXNzYXJ5IGNhY2hlIHRvb2xzIGFyZSBhdmFpbGFibGUKKyMgaWYgbm90IC0gdXNlIHBsYWluIGRlZmF1bHRzIGFuZCB3YXJuIHVzZXIKK2Nhc2UgIiRDQUNIRSIgaW4KKyAgaW50ZXJuYWx8c2hhcmVkKQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSBjYWNoZSBjaGVja2luZworCWlmIHRlc3QgIiRDQUNIRV9DSEVDS19DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNhY2hlX2NoZWNrIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNhY2hlX2NoZWNrOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DQUNIRV9DSEVDS19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDQUNIRV9DSEVDS19DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfQ0FDSEVfQ0hFQ0tfQ01EPSIkQ0FDSEVfQ0hFQ0tfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DQUNIRV9DSEVDS19DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitDQUNIRV9DSEVDS19DTUQ9JGFjX2N2X3BhdGhfQ0FDSEVfQ0hFQ0tfQ01ECitpZiB0ZXN0IC1uICIkQ0FDSEVfQ0hFQ0tfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENBQ0hFX0NIRUNLX0NNRCIgPiY1CiskYXNfZWNobyAiJENBQ0hFX0NIRUNLX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ0FDSEVfQ0hFQ0tfQ01EIjsgdGhlbgorICBhY19wdF9DQUNIRV9DSEVDS19DTUQ9JENBQ0hFX0NIRUNLX0NNRAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNhY2hlX2NoZWNrIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYWNoZV9jaGVjazsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfQ0hFQ0tfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfQ0FDSEVfQ0hFQ0tfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X0NBQ0hFX0NIRUNLX0NNRD0iJGFjX3B0X0NBQ0hFX0NIRUNLX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfQ0hFQ0tfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfQ0FDSEVfQ0hFQ0tfQ01EPSRhY19jdl9wYXRoX2FjX3B0X0NBQ0hFX0NIRUNLX0NNRAoraWYgdGVzdCAtbiAiJGFjX3B0X0NBQ0hFX0NIRUNLX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9DQUNIRV9DSEVDS19DTUQiID4mNQorJGFzX2VjaG8gIiRhY19wdF9DQUNIRV9DSEVDS19DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9DQUNIRV9DSEVDS19DTUQiID0geDsgdGhlbgorICAgIENBQ0hFX0NIRUNLX0NNRD0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENBQ0hFX0NIRUNLX0NNRD0kYWNfcHRfQ0FDSEVfQ0hFQ0tfQ01ECisgIGZpCitlbHNlCisgIENBQ0hFX0NIRUNLX0NNRD0iJGFjX2N2X3BhdGhfQ0FDSEVfQ0hFQ0tfQ01EIgorZmkKKworCQlpZiB0ZXN0IC16ICIkQ0FDSEVfQ0hFQ0tfQ01EIjsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZV9jaGVjayBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZV9jaGVjayBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiYyO30KKwkJCUNBQ0hFX0NIRUNLX0NNRD0vdXNyL3NiaW4vY2FjaGVfY2hlY2sKKwkJCUNBQ0hFX0NPTkZJR1VSRV9XQVJOPXkKKwkJZmkKKwlmaQorCWlmIHRlc3QgIiRDQUNIRV9DSEVDS19ORUVEU19DSEVDSyIgPSB5ZXM7IHRoZW4KKwkJJENBQ0hFX0NIRUNLX0NNRCAtViAyPi9kZXYvbnVsbCA+Y29uZnRlc3QudG1wCisJCXJlYWQgLXIgQ0FDSEVfQ0hFQ0tfVlNOIDwgY29uZnRlc3QudG1wCisJCUlGUz0uLSByZWFkIC1yIENBQ0hFX0NIRUNLX1ZTTl9NQUpPUiBDQUNIRV9DSEVDS19WU05fTUlOT1IgQ0FDSEVfQ0hFQ0tfVlNOX1BBVENIIExFRlRPVkVSIDwgY29uZnRlc3QudG1wCisJCXJtIC1mIGNvbmZ0ZXN0LnRtcAorCisJCSMgUmVxdWlyZSB2ZXJzaW9uID49IDAuNS40IGZvciAtLWNsZWFyLW5lZWRzLWNoZWNrLWZsYWcKKwkJaWYgdGVzdCAteiAiJENBQ0hFX0NIRUNLX1ZTTl9NQUpPUiIgXAorCQkJfHwgdGVzdCAteiAiJENBQ0hFX0NIRUNLX1ZTTl9NSU5PUiIgXAorCQkJfHwgdGVzdCAteiAiJENBQ0hFX0NIRUNLX1ZTTl9QQVRDSCI7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJENBQ0hFX0NIRUNLX0NNRDogQmFkIHZlcnNpb24gXCIkQ0FDSEVfQ0hFQ0tfVlNOXCIgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJENBQ0hFX0NIRUNLX0NNRDogQmFkIHZlcnNpb24gXCIkQ0FDSEVfQ0hFQ0tfVlNOXCIgZm91bmQiID4mMjt9CisJCQlDQUNIRV9DSEVDS19WRVJTSU9OX1dBUk49eQorCQkJQ0FDSEVfQ0hFQ0tfTkVFRFNfQ0hFQ0s9bm8KKwkJZWxpZiB0ZXN0ICIkQ0FDSEVfQ0hFQ0tfVlNOX01BSk9SIiAtZXEgMCA7IHRoZW4KKwkJCWlmIHRlc3QgIiRDQUNIRV9DSEVDS19WU05fTUlOT1IiIC1sdCA1IFwKKwkJCQl8fCB0ZXN0ICIkQ0FDSEVfQ0hFQ0tfVlNOX01JTk9SIiAtZXEgNSAtYSAiJENBQ0hFX0NIRUNLX1ZTTl9QQVRDSCIgLWx0IDQ7IHRoZW4KKwkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRDQUNIRV9DSEVDS19DTUQ6IE9sZCB2ZXJzaW9uIFwiJENBQ0hFX0NIRUNLX1ZTTlwiIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRDQUNIRV9DSEVDS19DTUQ6IE9sZCB2ZXJzaW9uIFwiJENBQ0hFX0NIRUNLX1ZTTlwiIGZvdW5kIiA+JjI7fQorCQkJCUNBQ0hFX0NIRUNLX1ZFUlNJT05fV0FSTj15CisJCQkJQ0FDSEVfQ0hFQ0tfTkVFRFNfQ0hFQ0s9bm8KKwkJCWZpCisJCWZpCisJZmkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgY2FjaGUgZHVtcGluZworCWlmIHRlc3QgIiRDQUNIRV9EVU1QX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2FjaGVfZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYWNoZV9kdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9DQUNIRV9EVU1QX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJENBQ0hFX0RVTVBfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NBQ0hFX0RVTVBfQ01EPSIkQ0FDSEVfRFVNUF9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX0NBQ0hFX0RVTVBfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0FDSEVfRFVNUF9DTUQ9JGFjX2N2X3BhdGhfQ0FDSEVfRFVNUF9DTUQKK2lmIHRlc3QgLW4gIiRDQUNIRV9EVU1QX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQUNIRV9EVU1QX0NNRCIgPiY1CiskYXNfZWNobyAiJENBQ0hFX0RVTVBfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DQUNIRV9EVU1QX0NNRCI7IHRoZW4KKyAgYWNfcHRfQ0FDSEVfRFVNUF9DTUQ9JENBQ0hFX0RVTVBfQ01ECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2FjaGVfZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2FjaGVfZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfRFVNUF9DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9DQUNIRV9EVU1QX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9DQUNIRV9EVU1QX0NNRD0iJGFjX3B0X0NBQ0hFX0RVTVBfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9DQUNIRV9EVU1QX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X0NBQ0hFX0RVTVBfQ01EPSRhY19jdl9wYXRoX2FjX3B0X0NBQ0hFX0RVTVBfQ01ECitpZiB0ZXN0IC1uICIkYWNfcHRfQ0FDSEVfRFVNUF9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfQ0FDSEVfRFVNUF9DTUQiID4mNQorJGFzX2VjaG8gIiRhY19wdF9DQUNIRV9EVU1QX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X0NBQ0hFX0RVTVBfQ01EIiA9IHg7IHRoZW4KKyAgICBDQUNIRV9EVU1QX0NNRD0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENBQ0hFX0RVTVBfQ01EPSRhY19wdF9DQUNIRV9EVU1QX0NNRAorICBmaQorZWxzZQorICBDQUNIRV9EVU1QX0NNRD0iJGFjX2N2X3BhdGhfQ0FDSEVfRFVNUF9DTUQiCitmaQorCisJCXRlc3QgLXogIiRDQUNIRV9EVU1QX0NNRCIgJiYgeworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZV9kdW1wIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlX2R1bXAgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiID4mMjt9CisJCQlDQUNIRV9EVU1QX0NNRD0vdXNyL3NiaW4vY2FjaGVfZHVtcAorCQkJQ0FDSEVfQ09ORklHVVJFX1dBUk49eQorCQl9CisJZmkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgY2FjaGUgcmVwYWlyaW5nCisJaWYgdGVzdCAiJENBQ0hFX1JFUEFJUl9DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNhY2hlX3JlcGFpciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYWNoZV9yZXBhaXI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0NBQ0hFX1JFUEFJUl9DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDQUNIRV9SRVBBSVJfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NBQ0hFX1JFUEFJUl9DTUQ9IiRDQUNIRV9SRVBBSVJfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DQUNIRV9SRVBBSVJfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0FDSEVfUkVQQUlSX0NNRD0kYWNfY3ZfcGF0aF9DQUNIRV9SRVBBSVJfQ01ECitpZiB0ZXN0IC1uICIkQ0FDSEVfUkVQQUlSX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQUNIRV9SRVBBSVJfQ01EIiA+JjUKKyRhc19lY2hvICIkQ0FDSEVfUkVQQUlSX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ0FDSEVfUkVQQUlSX0NNRCI7IHRoZW4KKyAgYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRD0kQ0FDSEVfUkVQQUlSX0NNRAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNhY2hlX3JlcGFpciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2FjaGVfcmVwYWlyOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9DQUNIRV9SRVBBSVJfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9DQUNIRV9SRVBBSVJfQ01EPSIkYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X0NBQ0hFX1JFUEFJUl9DTUQ9JGFjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRAoraWYgdGVzdCAtbiAiJGFjX3B0X0NBQ0hFX1JFUEFJUl9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0NBQ0hFX1JFUEFJUl9DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9DQUNIRV9SRVBBSVJfQ01EIiA9IHg7IHRoZW4KKyAgICBDQUNIRV9SRVBBSVJfQ01EPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0FDSEVfUkVQQUlSX0NNRD0kYWNfcHRfQ0FDSEVfUkVQQUlSX0NNRAorICBmaQorZWxzZQorICBDQUNIRV9SRVBBSVJfQ01EPSIkYWNfY3ZfcGF0aF9DQUNIRV9SRVBBSVJfQ01EIgorZmkKKworCQl0ZXN0IC16ICIkQ0FDSEVfUkVQQUlSX0NNRCIgJiYgeworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZV9yZXBhaXIgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGVfcmVwYWlyIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIIiA+JjI7fQorCQkJQ0FDSEVfUkVQQUlSX0NNRD0vdXNyL3NiaW4vY2FjaGVfcmVwYWlyCisJCQlDQUNIRV9DT05GSUdVUkVfV0FSTj15CisJCX0KKwlmaQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSBjYWNoZSByZXN0b3JpbmcKKwlpZiB0ZXN0ICIkQ0FDSEVfUkVTVE9SRV9DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNhY2hlX3Jlc3RvcmUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2FjaGVfcmVzdG9yZTsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfQ0FDSEVfUkVTVE9SRV9DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDQUNIRV9SRVNUT1JFX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9DQUNIRV9SRVNUT1JFX0NNRD0iJENBQ0hFX1JFU1RPUkVfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DQUNIRV9SRVNUT1JFX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0NBQ0hFX1JFU1RPUkVfQ01EPSRhY19jdl9wYXRoX0NBQ0hFX1JFU1RPUkVfQ01ECitpZiB0ZXN0IC1uICIkQ0FDSEVfUkVTVE9SRV9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0FDSEVfUkVTVE9SRV9DTUQiID4mNQorJGFzX2VjaG8gIiRDQUNIRV9SRVNUT1JFX0NNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ0FDSEVfUkVTVE9SRV9DTUQiOyB0aGVuCisgIGFjX3B0X0NBQ0hFX1JFU1RPUkVfQ01EPSRDQUNIRV9SRVNUT1JFX0NNRAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNhY2hlX3Jlc3RvcmUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNhY2hlX3Jlc3RvcmU7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X0NBQ0hFX1JFU1RPUkVfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfQ0FDSEVfUkVTVE9SRV9DTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfUkVTVE9SRV9DTUQ9IiRhY19wdF9DQUNIRV9SRVNUT1JFX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfQ0FDSEVfUkVTVE9SRV9DTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9DQUNIRV9SRVNUT1JFX0NNRD0kYWNfY3ZfcGF0aF9hY19wdF9DQUNIRV9SRVNUT1JFX0NNRAoraWYgdGVzdCAtbiAiJGFjX3B0X0NBQ0hFX1JFU1RPUkVfQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X0NBQ0hFX1JFU1RPUkVfQ01EIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfQ0FDSEVfUkVTVE9SRV9DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9DQUNIRV9SRVNUT1JFX0NNRCIgPSB4OyB0aGVuCisgICAgQ0FDSEVfUkVTVE9SRV9DTUQ9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQUNIRV9SRVNUT1JFX0NNRD0kYWNfcHRfQ0FDSEVfUkVTVE9SRV9DTUQKKyAgZmkKK2Vsc2UKKyAgQ0FDSEVfUkVTVE9SRV9DTUQ9IiRhY19jdl9wYXRoX0NBQ0hFX1JFU1RPUkVfQ01EIgorZmkKKworCQl0ZXN0IC16ICIkQ0FDSEVfUkVTVE9SRV9DTUQiICYmIHsKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGVfcmVzdG9yZSBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZV9yZXN0b3JlIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIIiA+JjI7fQorCQkJQ0FDSEVfUkVTVE9SRV9DTUQ9L3Vzci9zYmluL2NhY2hlX3Jlc3RvcmUKKwkJCUNBQ0hFX0NPTkZJR1VSRV9XQVJOPXkKKwkJfQorCWZpCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgY2FjaGVfY2hlY2sgc3VwcG9ydHMgdGhlIG5lZWRzLWNoZWNrIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBjYWNoZV9jaGVjayBzdXBwb3J0cyB0aGUgbmVlZHMtY2hlY2sgZmxhZy4uLiAiID4mNjsgfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0FDSEVfQ0hFQ0tfTkVFRFNfQ0hFQ0siID4mNQorJGFzX2VjaG8gIiRDQUNIRV9DSEVDS19ORUVEU19DSEVDSyIgPiY2OyB9CisJaWYgdGVzdCAiJENBQ0hFX0NIRUNLX05FRURTX0NIRUNLIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBDQUNIRV9DSEVDS19ORUVEU19DSEVDSyAxIiA+PmNvbmZkZWZzLmgKKworCWZpCisJOzsKK2VzYWMKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENBQ0hFX0NIRUNLX0NNRCAiJENBQ0hFX0NIRUNLX0NNRCIKK19BQ0VPRgorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBDQUNIRV9EVU1QX0NNRCAiJENBQ0hFX0RVTVBfQ01EIgorX0FDRU9GCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENBQ0hFX1JFUEFJUl9DTUQgIiRDQUNIRV9SRVBBSVJfQ01EIgorX0FDRU9GCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENBQ0hFX1JFU1RPUkVfQ01EICIkQ0FDSEVfUkVTVE9SRV9DTUQiCitfQUNFT0YKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlYWRsaW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlYWRsaW5lLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVhZGxpbmUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcmVhZGxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9yZWFkbGluZTsgUkVBRExJTkU9JGVuYWJsZXZhbAorZWxzZQorICBSRUFETElORT1tYXliZQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSRUFETElORSIgPiY1CiskYXNfZWNobyAiJFJFQURMSU5FIiA+JjY7IH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgcmVhbHRpbWUgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZWFsdGltZSBzdXBwb3J0Li4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVhbHRpbWUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcmVhbHRpbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9yZWFsdGltZTsgUkVBTFRJTUU9JGVuYWJsZXZhbAorZWxzZQorICBSRUFMVElNRT15ZXMKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkVBTFRJTUUiID4mNQorJGFzX2VjaG8gIiRSRUFMVElNRSIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIE9DRiByZXNvdXJjZSBhZ2VudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgT0NGIHJlc291cmNlIGFnZW50cy4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW9jZiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9vY2Yrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9vY2Y7IE9DRj0kZW5hYmxldmFsCitlbHNlCisgIE9DRj1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0YiID4mNQorJGFzX2VjaG8gIiRPQ0YiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLW9jZmRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfb2NmZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9vY2ZkaXI7IE9DRkRJUj0kd2l0aHZhbAorZWxzZQorICBPQ0ZESVI9JyR7cHJlZml4fS9saWIvb2NmL3Jlc291cmNlLmQvbHZtMicKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BrZ19jb25maWdfaW5pdCgpIHsKKwlpZiB0ZXN0ICIkUEtHQ09ORklHX0lOSVQiICE9IDE7IHRoZW4KKworCisKKworCisKKworaWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgorCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUEtHX0NPTkZJRys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQS0dfQ09ORklHPSRhY19jdl9wYXRoX1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRQS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgorICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1BLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFjX3B0X1BLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRhY19wdF9QS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUEtHX0NPTkZJRz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBLR19DT05GSUc9JGFjX3B0X1BLR19DT05GSUcKKyAgZmkKK2Vsc2UKKyAgUEtHX0NPTkZJRz0iJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPTAuOS4wCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uLi4uICIgPiY2OyB9CisJaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJUEtHX0NPTkZJRz0iIgorCWZpCitmaQorCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBQS0dDT05GSUdJTklUIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBQS0dDT05GSUdJTklULi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRQS0dDT05GSUdJTklUX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfUEtHQ09ORklHSU5JVF9DRkxBR1M9IiRQS0dDT05GSUdJTklUX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcInBrZ2NvbmZpZ2luaXRcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAicGtnY29uZmlnaW5pdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9QS0dDT05GSUdJTklUX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgInBrZ2NvbmZpZ2luaXQiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRQS0dDT05GSUdJTklUX0xJQlMiOyB0aGVuCisgICAgcGtnX2N2X1BLR0NPTkZJR0lOSVRfTElCUz0iJFBLR0NPTkZJR0lOSVRfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcInBrZ2NvbmZpZ2luaXRcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAicGtnY29uZmlnaW5pdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9QS0dDT05GSUdJTklUX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAicGtnY29uZmlnaW5pdCIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQorCisKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmkKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBQS0dDT05GSUdJTklUX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAicGtnY29uZmlnaW5pdCIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgUEtHQ09ORklHSU5JVF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgInBrZ2NvbmZpZ2luaXQiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJFBLR0NPTkZJR0lOSVRfUEtHX0VSUk9SUyIgPiY1CisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcGtnLWNvbmZpZyBpbml0aWFsaXplZCIgPiY1CiskYXNfZWNobyAicGtnLWNvbmZpZyBpbml0aWFsaXplZCIgPiY2OyB9CitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcGtnLWNvbmZpZyBpbml0aWFsaXplZCIgPiY1CiskYXNfZWNobyAicGtnLWNvbmZpZyBpbml0aWFsaXplZCIgPiY2OyB9CitlbHNlCisJUEtHQ09ORklHSU5JVF9DRkxBR1M9JHBrZ19jdl9QS0dDT05GSUdJTklUX0NGTEFHUworCVBLR0NPTkZJR0lOSVRfTElCUz0kcGtnX2N2X1BLR0NPTkZJR0lOSVRfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitmaQorCQlQS0dDT05GSUdfSU5JVD0xCisJZmkKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRlZmF1bHQgcnVuIGRpcmVjdG9yeSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmYXVsdCBydW4gZGlyZWN0b3J5Li4uICIgPiY2OyB9CitSVU5fRElSPSIvcnVuIgordGVzdCAtZCAiL3J1biIgfHwgUlVOX0RJUj0iL3Zhci9ydW4iCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJVTl9ESVIiID4mNQorJGFzX2VjaG8gIiRSVU5fRElSIiA+JjY7IH0KKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtcGlkLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9waWRfZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3BpZF9kaXI7IERFRkFVTFRfUElEX0RJUj0iJHdpdGh2YWwiCitlbHNlCisgIERFRkFVTFRfUElEX0RJUj0kUlVOX0RJUgorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfUElEX0RJUiAiJERFRkFVTFRfUElEX0RJUiIKK19BQ0VPRgorCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtZG0tcnVuLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9kbV9ydW5fZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X2RtX3J1bl9kaXI7IERFRkFVTFRfRE1fUlVOX0RJUj0iJHdpdGh2YWwiCitlbHNlCisgIERFRkFVTFRfRE1fUlVOX0RJUj0kUlVOX0RJUgorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfRE1fUlVOX0RJUiAiJERFRkFVTFRfRE1fUlVOX0RJUiIKK19BQ0VPRgorCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtcnVuLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9ydW5fZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3J1bl9kaXI7IERFRkFVTFRfUlVOX0RJUj0iJHdpdGh2YWwiCitlbHNlCisgIERFRkFVTFRfUlVOX0RJUj0iJFJVTl9ESVIvbHZtIgorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfUlVOX0RJUiAiJERFRkFVTFRfUlVOX0RJUiIKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgY2x1c3RlciBMVk0gZGFlbW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgY2x1c3RlciBMVk0gZGFlbW9uLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2x2bWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2Nsdm1kK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jbHZtZDsgQ0xWTUQ9JHdpdGh2YWwKK2Vsc2UKKyAgQ0xWTUQ9bm9uZQorZmkKKwordGVzdCAiJENMVk1EIiA9IHllcyAmJiBDTFZNRD1hbGwKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0xWTUQiID4mNQorJGFzX2VjaG8gIiRDTFZNRCIgPiY2OyB9CisKK3Rlc3QgIiRDTFZNRCIgIT0gbm9uZSAtYSAiJENMVVNURVIiID0gbm9uZSAmJiBDTFVTVEVSPWludGVybmFsCisKK3Rlc3QgIiRDTFZNRCIgIT0gbm9uZSAmJiBwa2dfY29uZmlnX2luaXQKKworQ0xWTURfQ01BTkFHRVJTPSIiCitDTFZNRF9ORUVEU19RRElTS0Q9bm8KKworaWYgWyBgZXhwciB4IiRDTFZNRCIgOiAnLipndWxtLionYCAhPSAwIF07IHRoZW4KKwlhc19mbl9lcnJvciAkPyAiU2luY2UgdmVyc2lvbiAyLjAyLjg3IEdVTE0gbG9ja2luZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiIgIiRMSU5FTk8iIDU7CitmaQoraWYgWyBgZXhwciB4IiRDTFZNRCIgOiAnLipjbWFuLionYCAhPSAwIF07IHRoZW4KKwlCVUlMRENNQU49eWVzCisJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIGNtYW4iCisJQ0xWTURfTkVFRFNfUURJU0tEPXllcworZmkKK2lmIFsgYGV4cHIgeCIkQ0xWTUQiIDogJy4qY29yb3N5bmMuKidgICE9IDAgXTsgdGhlbgorCUJVSUxEQ09ST1NZTkM9eWVzCisJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIGNvcm9zeW5jIgorZmkKK2lmIFsgYGV4cHIgeCIkQ0xWTUQiIDogJy4qb3BlbmFpcy4qJ2AgIT0gMCBdOyB0aGVuCisJQlVJTERPUEVOQUlTPXllcworCUNMVk1EX0NNQU5BR0VSUz0iJENMVk1EX0NNQU5BR0VSUyBvcGVuYWlzIgorZmkKK3Rlc3QgIiRDTFZNRF9ORUVEU19RRElTS0QiICE9IG5vICYmIENMVk1EX0NNQU5BR0VSUz0iJENMVk1EX0NNQU5BR0VSUyBxZGlza2QiCisKK3NvZnRfYmFpbG91dCgpIHsKKwlOT1RGT1VORD0xCit9CisKK2hhcmRfYmFpbG91dCgpIHsKKwlhc19mbl9lcnJvciAkPyAiYmFpbGluZyBvdXQiICIkTElORU5PIiA1Cit9CisKK2lmIHRlc3QgIiRDTFZNRCIgPSBhbGw7IHRoZW4KKwliYWlsb3V0PXNvZnRfYmFpbG91dAorCUJVSUxEQ01BTj15ZXMKKwlCVUlMRENPUk9TWU5DPXllcworCUJVSUxET1BFTkFJUz15ZXMKK2Vsc2UKKwliYWlsb3V0PWhhcmRfYmFpbG91dAorZmkKKworY2hlY2tfbGliX25vX2xpYnMoKSB7CisJbGliX25vX2xpYnNfYXJnMT0kMQorCXNoaWZ0CisJbGliX25vX2xpYnNfYXJnMj0kMQorCXNoaWZ0CisJbGliX25vX2xpYnNfYXJncz0kQAorCWFzX2FjX0xpYj1gJGFzX2VjaG8gImFjX2N2X2xpYl8kbGliX25vX2xpYnNfYXJnMScnXyRsaWJfbm9fbGlic19hcmcyIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRsaWJfbm9fbGlic19hcmcyIGluIC1sJGxpYl9ub19saWJzX2FyZzEiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRsaWJfbm9fbGlic19hcmcyIGluIC1sJGxpYl9ub19saWJzX2FyZzEuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JGFzX2FjX0xpYis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sJGxpYl9ub19saWJzX2FyZzEgJGxpYl9ub19saWJzX2FyZ3MgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJGxpYl9ub19saWJzX2FyZzIgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkbGliX25vX2xpYnNfYXJnMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkYXNfYWNfTGliPXllcyIKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0xpYj1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2V2YWwgYWNfcmVzPVwkJGFzX2FjX0xpYgorCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0xpYiJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFX0xJQiRsaWJfbm9fbGlic19hcmcxIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sJGxpYl9ub19saWJzX2FyZzEgJExJQlMiCisKK2Vsc2UKKyAgJGJhaWxvdXQKK2ZpCisKKwlMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCit9CisKK2lmIHRlc3QgIiRCVUlMRENNQU4iID0geWVzOyB0aGVuCisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIENNQU4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIENNQU4uLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJENNQU5fQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9DTUFOX0NGTEFHUz0iJENNQU5fQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliY21hblwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJjbWFuIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0NNQU5fQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAibGliY21hbiIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJENNQU5fTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfQ01BTl9MSUJTPSIkQ01BTl9MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliY21hblwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJjbWFuIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0NNQU5fTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJjbWFuIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIENNQU5fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJjbWFuIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBDTUFOX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliY21hbiIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkQ01BTl9QS0dfRVJST1JTIiA+JjUKKworCU5PVEZPVU5EPTAKKwkJZm9yIGFjX2hlYWRlciBpbiBsaWJjbWFuLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmNtYW4uaCIgImFjX2N2X2hlYWRlcl9saWJjbWFuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmNtYW5faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQkNNQU5fSCAxCitfQUNFT0YKKworZWxzZQorICAkYmFpbG91dAorZmkKKworZG9uZQorCisJCWNoZWNrX2xpYl9ub19saWJzIGNtYW4gY21hbl9pbml0CisJCWlmIHRlc3QgJE5PVEZPVU5EID0gMDsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIHBrZyBmb3IgbGliY21hbiwgdXNpbmcgLWxjbWFuIiA+JjUKKyRhc19lY2hvICJubyBwa2cgZm9yIGxpYmNtYW4sIHVzaW5nIC1sY21hbiIgPiY2OyB9CisJCQlDTUFOX0xJQlM9Ii1sY21hbiIKKwkJCUhBVkVfQ01BTj15ZXMKKwkJZmkKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCU5PVEZPVU5EPTAKKwkJZm9yIGFjX2hlYWRlciBpbiBsaWJjbWFuLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmNtYW4uaCIgImFjX2N2X2hlYWRlcl9saWJjbWFuX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmNtYW5faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQkNNQU5fSCAxCitfQUNFT0YKKworZWxzZQorICAkYmFpbG91dAorZmkKKworZG9uZQorCisJCWNoZWNrX2xpYl9ub19saWJzIGNtYW4gY21hbl9pbml0CisJCWlmIHRlc3QgJE5PVEZPVU5EID0gMDsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIHBrZyBmb3IgbGliY21hbiwgdXNpbmcgLWxjbWFuIiA+JjUKKyRhc19lY2hvICJubyBwa2cgZm9yIGxpYmNtYW4sIHVzaW5nIC1sY21hbiIgPiY2OyB9CisJCQlDTUFOX0xJQlM9Ii1sY21hbiIKKwkJCUhBVkVfQ01BTj15ZXMKKwkJZmkKK2Vsc2UKKwlDTUFOX0NGTEFHUz0kcGtnX2N2X0NNQU5fQ0ZMQUdTCisJQ01BTl9MSUJTPSRwa2dfY3ZfQ01BTl9MSUJTCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJSEFWRV9DTUFOPXllcworZmkKKwlDSEVDS0NPTkZEQj15ZXMKKwlDSEVDS0RMTT15ZXMKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRENPUk9TWU5DIiA9IHllcyAtbyAiJEJVSUxET1BFTkFJUyIgPSB5ZXM7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQ09ST1NZTkMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIENPUk9TWU5DLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDT1JPU1lOQ19DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X0NPUk9TWU5DX0NGTEFHUz0iJENPUk9TWU5DX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImNvcm9zeW5jXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImNvcm9zeW5jIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0NPUk9TWU5DX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImNvcm9zeW5jIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkQ09ST1NZTkNfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfQ09ST1NZTkNfTElCUz0iJENPUk9TWU5DX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJjb3Jvc3luY1wiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJjb3Jvc3luYyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DT1JPU1lOQ19MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImNvcm9zeW5jIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIENPUk9TWU5DX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiY29yb3N5bmMiIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIENPUk9TWU5DX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiY29yb3N5bmMiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJENPUk9TWU5DX1BLR19FUlJPUlMiID4mNQorCisJJGJhaWxvdXQKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSRiYWlsb3V0CitlbHNlCisJQ09ST1NZTkNfQ0ZMQUdTPSRwa2dfY3ZfQ09ST1NZTkNfQ0ZMQUdTCisJQ09ST1NZTkNfTElCUz0kcGtnX2N2X0NPUk9TWU5DX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwlIQVZFX0NPUk9TWU5DPXllcworZmkKKwlDSEVDS0NPTkZEQj15ZXMKKwlDSEVDS0NNQVA9eWVzCitmaQorCitpZiB0ZXN0ICIkQlVJTERDT1JPU1lOQyIgPSB5ZXM7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgUVVPUlVNIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBRVU9SVU0uLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJFFVT1JVTV9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X1FVT1JVTV9DRkxBR1M9IiRRVU9SVU1fQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGlicXVvcnVtXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYnF1b3J1bSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9RVU9SVU1fQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAibGlicXVvcnVtIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkUVVPUlVNX0xJQlMiOyB0aGVuCisgICAgcGtnX2N2X1FVT1JVTV9MSUJTPSIkUVVPUlVNX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJxdW9ydW1cIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGlicXVvcnVtIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1FVT1JVTV9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImxpYnF1b3J1bSIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQorCisKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmkKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBRVU9SVU1fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJxdW9ydW0iIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIFFVT1JVTV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImxpYnF1b3J1bSIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkUVVPUlVNX1BLR19FUlJPUlMiID4mNQorCisJJGJhaWxvdXQKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSRiYWlsb3V0CitlbHNlCisJUVVPUlVNX0NGTEFHUz0kcGtnX2N2X1FVT1JVTV9DRkxBR1MKKwlRVU9SVU1fTElCUz0kcGtnX2N2X1FVT1JVTV9MSUJTCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJSEFWRV9RVU9SVU09eWVzCitmaQorCUNIRUNLQ1BHPXllcworCUNIRUNLRExNPXllcworZmkKKworaWYgdGVzdCAiJEJVSUxET1BFTkFJUyIgPSB5ZXM7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgU0FMQ0siID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNBTENLLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRTQUxDS19DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X1NBTENLX0NGTEFHUz0iJFNBTENLX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYlNhTGNrXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYlNhTGNrIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1NBTENLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYlNhTGNrIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkU0FMQ0tfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfU0FMQ0tfTElCUz0iJFNBTENLX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJTYUxja1wiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJTYUxjayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9TQUxDS19MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImxpYlNhTGNrIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIFNBTENLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliU2FMY2siIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIFNBTENLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliU2FMY2siIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJFNBTENLX1BLR19FUlJPUlMiID4mNQorCisJJGJhaWxvdXQKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCSRiYWlsb3V0CitlbHNlCisJU0FMQ0tfQ0ZMQUdTPSRwa2dfY3ZfU0FMQ0tfQ0ZMQUdTCisJU0FMQ0tfTElCUz0kcGtnX2N2X1NBTENLX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwlIQVZFX1NBTENLPXllcworZmkKKwlDSEVDS0NQRz15ZXMKK2ZpCisKKworCitpZiB0ZXN0ICIkQ0hFQ0tDT05GREIiID0geWVzOyB0aGVuCisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIENPTkZEQiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQ09ORkRCLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDT05GREJfQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9DT05GREJfQ0ZMQUdTPSIkQ09ORkRCX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmNvbmZkYlwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJjb25mZGIiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfQ09ORkRCX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYmNvbmZkYiIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJENPTkZEQl9MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9DT05GREJfTElCUz0iJENPTkZEQl9MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliY29uZmRiXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYmNvbmZkYiIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DT05GREJfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJjb25mZGIiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgQ09ORkRCX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliY29uZmRiIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBDT05GREJfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJjb25mZGIiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJENPTkZEQl9QS0dfRVJST1JTIiA+JjUKKworCUhBVkVfQ09ORkRCPW5vCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwlIQVZFX0NPTkZEQj1ubworZWxzZQorCUNPTkZEQl9DRkxBR1M9JHBrZ19jdl9DT05GREJfQ0ZMQUdTCisJQ09ORkRCX0xJQlM9JHBrZ19jdl9DT05GREJfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfQ09ORkRCPXllcworZmkKKworCWZvciBhY19oZWFkZXIgaW4gY29yb3N5bmMvY29uZmRiLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImNvcm9zeW5jL2NvbmZkYi5oIiAiYWNfY3ZfaGVhZGVyX2Nvcm9zeW5jX2NvbmZkYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9jb3Jvc3luY19jb25mZGJfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0NPUk9TWU5DX0NPTkZEQl9IIDEKK19BQ0VPRgorIEhBVkVfQ09ORkRCX0g9eWVzCitlbHNlCisgIEhBVkVfQ09ORkRCX0g9bm8KK2ZpCisKK2RvbmUKKworCisJaWYgdGVzdCAiJEhBVkVfQ09ORkRCIiAhPSB5ZXMgLWEgIiRIQVZFX0NPTkZEQl9IIiA9IHllczsgdGhlbgorCQljaGVja19saWJfbm9fbGlicyBjb25mZGIgY29uZmRiX2luaXRpYWxpemUKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIHBrZyBmb3IgY29uZmRiLCB1c2luZyAtbGNvbmZkYiIgPiY1CiskYXNfZWNobyAibm8gcGtnIGZvciBjb25mZGIsIHVzaW5nIC1sY29uZmRiIiA+JjY7IH0KKwkJQ09ORkRCX0xJQlM9Ii1sY29uZmRiIgorCQlIQVZFX0NPTkZEQj15ZXMKKwlmaQorZmkKKworCitpZiB0ZXN0ICIkQ0hFQ0tDTUFQIiA9IHllczsgdGhlbgorCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDTUFQIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDTUFQLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDTUFQX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfQ01BUF9DRkxBR1M9IiRDTUFQX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmNtYXBcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGliY21hcCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DTUFQX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYmNtYXAiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRDTUFQX0xJQlMiOyB0aGVuCisgICAgcGtnX2N2X0NNQVBfTElCUz0iJENNQVBfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmNtYXBcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGliY21hcCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DTUFQX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAibGliY21hcCIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQorCisKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmkKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBDTUFQX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliY21hcCIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgQ01BUF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImxpYmNtYXAiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJENNQVBfUEtHX0VSUk9SUyIgPiY1CisKKwlIQVZFX0NNQVA9bm8KK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCUhBVkVfQ01BUD1ubworZWxzZQorCUNNQVBfQ0ZMQUdTPSRwa2dfY3ZfQ01BUF9DRkxBR1MKKwlDTUFQX0xJQlM9JHBrZ19jdl9DTUFQX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwlIQVZFX0NNQVA9eWVzCitmaQorCisJZm9yIGFjX2hlYWRlciBpbiBjb3Jvc3luYy9jbWFwLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImNvcm9zeW5jL2NtYXAuaCIgImFjX2N2X2hlYWRlcl9jb3Jvc3luY19jbWFwX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2Nvcm9zeW5jX2NtYXBfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0NPUk9TWU5DX0NNQVBfSCAxCitfQUNFT0YKKyBIQVZFX0NNQVBfSD15ZXMKK2Vsc2UKKyAgSEFWRV9DTUFQX0g9bm8KK2ZpCisKK2RvbmUKKworCisJaWYgdGVzdCAiJEhBVkVfQ01BUCIgIT0geWVzIC1hICIkSEFWRV9DTUFQX0giID0geWVzOyB0aGVuCisJCWNoZWNrX2xpYl9ub19saWJzIGNtYXAgY21hcF9pbml0aWFsaXplCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyBwa2cgZm9yIGNtYXAsIHVzaW5nIC1sY21hcCIgPiY1CiskYXNfZWNobyAibm8gcGtnIGZvciBjbWFwLCB1c2luZyAtbGNtYXAiID4mNjsgfQorCQlDTUFQX0xJQlM9Ii1sY21hcCIKKwkJSEFWRV9DTUFQPXllcworCWZpCitmaQorCitpZiB0ZXN0ICIkQlVJTERDT1JPU1lOQyIgPSB5ZXMgLWEgXAorCSIkSEFWRV9DTUFQIiAhPSB5ZXMgLWEgIiRIQVZFX0NPTkZEQiIgIT0geWVzIC1hICIkQ0xWTUQiICE9IGFsbDsgdGhlbgorCWFzX2ZuX2Vycm9yICQ/ICJiYWlsaW5nIG91dC4uLiBjbWFwIChjb3Jvc3luYyA+PSAyLjApIG9yIGNvbmZkYiAoY29yb3N5bmMgPCAyLjApIGxpYnJhcnkgaXMgcmVxdWlyZWQiICIkTElORU5PIiA1CitmaQorCitpZiB0ZXN0ICIkQ0hFQ0tDUEciID0geWVzOyB0aGVuCisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIENQRyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQ1BHLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDUEdfQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9DUEdfQ0ZMQUdTPSIkQ1BHX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmNwZ1wiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJjcGciKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfQ1BHX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYmNwZyIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJENQR19MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9DUEdfTElCUz0iJENQR19MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliY3BnXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYmNwZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DUEdfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJjcGciIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgQ1BHX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliY3BnIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBDUEdfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJjcGciIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJENQR19QS0dfRVJST1JTIiA+JjUKKworCSRiYWlsb3V0CitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkkYmFpbG91dAorZWxzZQorCUNQR19DRkxBR1M9JHBrZ19jdl9DUEdfQ0ZMQUdTCisJQ1BHX0xJQlM9JHBrZ19jdl9DUEdfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfQ1BHPXllcworZmkKK2ZpCisKK2lmIHRlc3QgIiRDSEVDS0RMTSIgPSB5ZXM7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRExNIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBETE0uLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJERMTV9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X0RMTV9DRkxBR1M9IiRETE1fQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliZGxtXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYmRsbSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9ETE1fQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAibGliZGxtIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkRExNX0xJQlMiOyB0aGVuCisgICAgcGtnX2N2X0RMTV9MSUJTPSIkRExNX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJkbG1cIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGliZGxtIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0RMTV9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImxpYmRsbSIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQorCisKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmkKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBETE1fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJkbG0iIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIERMTV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImxpYmRsbSIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkRExNX1BLR19FUlJPUlMiID4mNQorCisJTk9URk9VTkQ9MAorCQlmb3IgYWNfaGVhZGVyIGluIGxpYmRsbS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaWJkbG0uaCIgImFjX2N2X2hlYWRlcl9saWJkbG1faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGliZGxtX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJETE1fSCAxCitfQUNFT0YKKworZWxzZQorICAkYmFpbG91dAorZmkKKworZG9uZQorCisJCWNoZWNrX2xpYl9ub19saWJzIGRsbSBkbG1fbG9jayAtbHB0aHJlYWQKKwkJaWYgdGVzdCAkTk9URk9VTkQgPSAwOyB0aGVuCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8gcGtnIGZvciBsaWJkbG0sIHVzaW5nIC1sZGxtIiA+JjUKKyRhc19lY2hvICJubyBwa2cgZm9yIGxpYmRsbSwgdXNpbmcgLWxkbG0iID4mNjsgfQorCQkJRExNX0xJQlM9Ii1sZGxtIC1scHRocmVhZCIKKwkJCUhBVkVfRExNPXllcworCQlmaQorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJTk9URk9VTkQ9MAorCQlmb3IgYWNfaGVhZGVyIGluIGxpYmRsbS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaWJkbG0uaCIgImFjX2N2X2hlYWRlcl9saWJkbG1faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGliZGxtX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJETE1fSCAxCitfQUNFT0YKKworZWxzZQorICAkYmFpbG91dAorZmkKKworZG9uZQorCisJCWNoZWNrX2xpYl9ub19saWJzIGRsbSBkbG1fbG9jayAtbHB0aHJlYWQKKwkJaWYgdGVzdCAkTk9URk9VTkQgPSAwOyB0aGVuCisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8gcGtnIGZvciBsaWJkbG0sIHVzaW5nIC1sZGxtIiA+JjUKKyRhc19lY2hvICJubyBwa2cgZm9yIGxpYmRsbSwgdXNpbmcgLWxkbG0iID4mNjsgfQorCQkJRExNX0xJQlM9Ii1sZGxtIC1scHRocmVhZCIKKwkJCUhBVkVfRExNPXllcworCQlmaQorZWxzZQorCURMTV9DRkxBR1M9JHBrZ19jdl9ETE1fQ0ZMQUdTCisJRExNX0xJQlM9JHBrZ19jdl9ETE1fTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfRExNPXllcworZmkKK2ZpCisKK2lmIHRlc3QgIiRDTFZNRCIgPSBhbGw7IHRoZW4KKwlDTFZNRD1ub25lCisJQ0xWTURfQ01BTkFHRVJTPSIiCisJQ0xWTURfTkVFRFNfUURJU0tEPW5vCisJaWYgdGVzdCAiJEhBVkVfQ01BTiIgPSB5ZXMgLWEgXAorCQkiJEhBVkVfRExNIiA9IHllczsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogRW5hYmxpbmcgY2x2bWQgY21hbiBjbHVzdGVyIG1hbmFnZXIiID4mNQorJGFzX2VjaG8gIkVuYWJsaW5nIGNsdm1kIGNtYW4gY2x1c3RlciBtYW5hZ2VyIiA+JjY7IH0KKwkJQ0xWTUQ9IiRDTFZNRCxjbWFuIgorCQlDTFZNRF9DTUFOQUdFUlM9IiRDTFZNRF9DTUFOQUdFUlMgY21hbiIKKwkJQ0xWTURfTkVFRFNfUURJU0tEPXllcworCWZpCisJaWYgdGVzdCAiJEhBVkVfQ09ST1NZTkMiID0geWVzIC1hIFwKKwkJIiRIQVZFX1FVT1JVTSIgPSB5ZXMgLWEgXAorCQkiJEhBVkVfQ1BHIiA9IHllcyAtYSBcCisJCSIkSEFWRV9ETE0iID0geWVzOyB0aGVuCisJICAgaWYgdGVzdCAiJEhBVkVfQ09ORkRCIiA9IHllcyAtbyAiJEhBVkVfQ01BUCIgPSB5ZXM7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIGNsdm1kIGNvcm9zeW5jIGNsdXN0ZXIgbWFuYWdlciIgPiY1CiskYXNfZWNobyAiRW5hYmxpbmcgY2x2bWQgY29yb3N5bmMgY2x1c3RlciBtYW5hZ2VyIiA+JjY7IH0KKwkJQ0xWTUQ9IiRDTFZNRCxjb3Jvc3luYyIKKwkJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIGNvcm9zeW5jIgorCSAgIGZpCisJZmkKKwlpZiB0ZXN0ICIkSEFWRV9DT1JPU1lOQyIgPSB5ZXMgLWEgXAorCQkiJEhBVkVfQ1BHIiA9IHllcyAtYSBcCisJCSIkSEFWRV9TQUxDSyIgPSB5ZXM7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IEVuYWJsaW5nIGNsdm1kIG9wZW5haXMgY2x1c3RlciBtYW5hZ2VyIiA+JjUKKyRhc19lY2hvICJFbmFibGluZyBjbHZtZCBvcGVuYWlzIGNsdXN0ZXIgbWFuYWdlciIgPiY2OyB9CisJCUNMVk1EPSIkQ0xWTUQsb3BlbmFpcyIKKwkJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIG9wZW5haXMiCisJZmkKKwl0ZXN0ICIkQ0xWTURfTkVFRFNfUURJU0tEIiAhPSBubyAmJiBDTFZNRF9DTUFOQUdFUlM9IiRDTFZNRF9DTUFOQUdFUlMgcWRpc2tkIgorCXRlc3QgIiRDTFZNRCIgPSBub25lICYmIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBEaXNhYmxpbmcgY2x2bWQgYnVpbGQuIE5vIGNsdXN0ZXIgbWFuYWdlciBkZXRlY3RlZC4iID4mNQorJGFzX2VjaG8gIkRpc2FibGluZyBjbHZtZCBidWlsZC4gTm8gY2x1c3RlciBtYW5hZ2VyIGRldGVjdGVkLiIgPiY2OyB9CitmaQorCitpZiBbIGBleHByIHgiJENMVk1EIiA6ICcuKmNvcm9zeW5jLionYCAhPSAwIF07IHRoZW4KKyAgIHRlc3QgIiRIQVZFX0NNQVAiID0geWVzICYmIENMVk1EX0NNQU5BR0VSUz0iJENMVk1EX0NNQU5BR0VSUyBkbG0iCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJENMVk1EIiAhPSBub25lOyB0aGVuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2x2bWQtcGlkZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY2x2bWRfcGlkZmlsZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY2x2bWRfcGlkZmlsZTsgQ0xWTURfUElERklMRT0kd2l0aHZhbAorZWxzZQorICBDTFZNRF9QSURGSUxFPSIkREVGQVVMVF9QSURfRElSL2Nsdm1kLnBpZCIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBDTFZNRF9QSURGSUxFICIkQ0xWTURfUElERklMRSIKK19BQ0VPRgorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGNsdXN0ZXIgbWlycm9yIGxvZyBkYWVtb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBjbHVzdGVyIG1pcnJvciBsb2cgZGFlbW9uLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY21pcnJvcmQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY21pcnJvcmQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9jbWlycm9yZDsgQ01JUlJPUkQ9JGVuYWJsZXZhbAorZWxzZQorICBDTUlSUk9SRD1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDTUlSUk9SRCIgPiY1CiskYXNfZWNobyAiJENNSVJST1JEIiA+JjY7IH0KKworQlVJTERfQ01JUlJPUkQ9JENNSVJST1JECisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiB0ZXN0ICIkQlVJTERfQ01JUlJPUkQiID0geWVzOyB0aGVuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY21pcnJvcmQtcGlkZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY21pcnJvcmRfcGlkZmlsZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfY21pcnJvcmRfcGlkZmlsZTsgQ01JUlJPUkRfUElERklMRT0kd2l0aHZhbAorZWxzZQorICBDTUlSUk9SRF9QSURGSUxFPSIkREVGQVVMVF9QSURfRElSL2NtaXJyb3JkLnBpZCIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBDTUlSUk9SRF9QSURGSUxFICIkQ01JUlJPUkRfUElERklMRSIKK19BQ0VPRgorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgWyAiJEJVSUxEX0NNSVJST1JEIiA9IHllcyBdOyB0aGVuCisJcGtnX2NvbmZpZ19pbml0CisKKworJGFzX2VjaG8gIiNkZWZpbmUgQ01JUlJPUl9IQVNfQ0hFQ0tQT0lOVCAxIiA+PmNvbmZkZWZzLmgKKworCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBTQUNLUFQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNBQ0tQVC4uLiAiID4mNjsgfQorCitpZiB0ZXN0IC1uICIkU0FDS1BUX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfU0FDS1BUX0NGTEFHUz0iJFNBQ0tQVF9DRkxBR1MiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJTYUNrcHRcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGliU2FDa3B0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1NBQ0tQVF9DRkxBR1M9YCRQS0dfQ09ORklHIC0tY2ZsYWdzICJsaWJTYUNrcHQiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRTQUNLUFRfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfU0FDS1BUX0xJQlM9IiRTQUNLUFRfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYlNhQ2twdFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJTYUNrcHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfU0FDS1BUX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAibGliU2FDa3B0IiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIFNBQ0tQVF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImxpYlNhQ2twdCIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgU0FDS1BUX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliU2FDa3B0IiAyPiYxYAorICAgICAgICBmaQorCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncworCWVjaG8gIiRTQUNLUFRfUEtHX0VSUk9SUyIgPiY1CisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8gbGliU2FDa3B0LCBjb21waWxpbmcgd2l0aG91dCBpdCIgPiY1CiskYXNfZWNobyAibm8gbGliU2FDa3B0LCBjb21waWxpbmcgd2l0aG91dCBpdCIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIENNSVJST1JfSEFTX0NIRUNLUE9JTlQgMCIgPj5jb25mZGVmcy5oCisKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyBsaWJTYUNrcHQsIGNvbXBpbGluZyB3aXRob3V0IGl0IiA+JjUKKyRhc19lY2hvICJubyBsaWJTYUNrcHQsIGNvbXBpbGluZyB3aXRob3V0IGl0IiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgQ01JUlJPUl9IQVNfQ0hFQ0tQT0lOVCAwIiA+PmNvbmZkZWZzLmgKKworZWxzZQorCVNBQ0tQVF9DRkxBR1M9JHBrZ19jdl9TQUNLUFRfQ0ZMQUdTCisJU0FDS1BUX0xJQlM9JHBrZ19jdl9TQUNLUFRfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfU0FDS1BUPXllcworZmkKKworCWlmIHRlc3QgIiRIQVZFX0NQRyIgIT0geWVzOyB0aGVuCisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIENQRyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQ1BHLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDUEdfQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9DUEdfQ0ZMQUdTPSIkQ1BHX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmNwZ1wiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJjcGciKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfQ1BHX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYmNwZyIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJENQR19MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9DUEdfTElCUz0iJENQR19MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliY3BnXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYmNwZyIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9DUEdfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJjcGciIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgQ1BHX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliY3BnIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBDUEdfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJjcGciIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJENQR19QS0dfRVJST1JTIiA+JjUKKworCWFzX2ZuX2Vycm9yICQ/ICJQYWNrYWdlIHJlcXVpcmVtZW50cyAobGliY3BnKSB3ZXJlIG5vdCBtZXQ6CisKKyRDUEdfUEtHX0VSUk9SUworCitDb25zaWRlciBhZGp1c3RpbmcgdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UKK2luc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXguCisKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQ1BHX0NGTEFHUworYW5kIENQR19MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDUKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIlRoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIENQR19DRkxBR1MKK2FuZCBDUEdfTElCUyB0byBhdm9pZCB0aGUgbmVlZCB0byBjYWxsIHBrZy1jb25maWcuCitTZWUgdGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKworVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorCUNQR19DRkxBR1M9JHBrZ19jdl9DUEdfQ0ZMQUdTCisJQ1BHX0xJQlM9JHBrZ19jdl9DUEdfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCitmaQorCWZpCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBkZWJ1Z2dpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZGVidWdnaW5nLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1ZzsgREVCVUc9JGVuYWJsZXZhbAorZWxzZQorICBERUJVRz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERUJVRyIgPiY1CiskYXNfZWNobyAiJERFQlVHIiA+JjY7IH0KKworaWYgdGVzdCAiJERFQlVHIiA9IHllczsgdGhlbgorCUNPUFRJTUlTRV9GTEFHPQorZWxzZQorCUNTQ09QRV9DTUQ9CitmaQorCisKKworICAgIGFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9LVdqdW1wLW1pc3Nlcy1pbml0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1XanVtcC1taXNzZXMtaW5pdCBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLVdqdW1wLW1pc3Nlcy1pbml0IGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZmxhZ19IQVZFX1dKVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2ZsYWdfSEFWRV9XSlVNUD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmxhZ19IQVZFX1dKVU1QPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mbGFnX0hBVkVfV0pVTVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mbGFnX0hBVkVfV0pVTVAiID4mNjsgfQorICAgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyAgICBIQVZFX1dKVU1QPSRhY19jdl9mbGFnX0hBVkVfV0pVTVAKKyAgICBpZiB0ZXN0ICJIQVZFX1dKVU1QIiA9IHllczsgdGhlbgorICAgICAgICA6CisgICAgZWxzZQorICAgICAgICA6CisgICAgZmkKKworCisKKworICAgIGFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9LVdjbG9iYmVyZWQKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLVdjbG9iYmVyZWQgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1XY2xvYmJlcmVkIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZmxhZ19IQVZFX1dDTE9CQkVSRUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZmxhZ19IQVZFX1dDTE9CQkVSRUQ9eWVzCitlbHNlCisgIGFjX2N2X2ZsYWdfSEFWRV9XQ0xPQkJFUkVEPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mbGFnX0hBVkVfV0NMT0JCRVJFRCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2ZsYWdfSEFWRV9XQ0xPQkJFUkVEIiA+JjY7IH0KKyAgICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCisgICAgSEFWRV9XQ0xPQkJFUkVEPSRhY19jdl9mbGFnX0hBVkVfV0NMT0JCRVJFRAorICAgIGlmIHRlc3QgIkhBVkVfV0NMT0JCRVJFRCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgOgorICAgIGVsc2UKKyAgICAgICAgOgorICAgIGZpCisKKworCisKKyAgICBhY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgICAgQ0ZMQUdTPS1Xc3luYy1uYW5kCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1Xc3luYy1uYW5kIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtV3N5bmMtbmFuZCBmbGFnLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2ZsYWdfSEFWRV9XU1lOQ05BTkQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZmxhZ19IQVZFX1dTWU5DTkFORD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmxhZ19IQVZFX1dTWU5DTkFORD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZmxhZ19IQVZFX1dTWU5DTkFORCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2ZsYWdfSEFWRV9XU1lOQ05BTkQiID4mNjsgfQorICAgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyAgICBIQVZFX1dTWU5DTkFORD0kYWNfY3ZfZmxhZ19IQVZFX1dTWU5DTkFORAorICAgIGlmIHRlc3QgIkhBVkVfV1NZTkNOQU5EIiA9IHllczsgdGhlbgorICAgICAgICA6CisgICAgZWxzZQorICAgICAgICA6CisgICAgZmkKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIG9wdGltaXNhdGlvbiBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIG9wdGltaXNhdGlvbiBmbGFnLi4uICIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtb3B0aW1pc2F0aW9uIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9vcHRpbWlzYXRpb24rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX29wdGltaXNhdGlvbjsgQ09QVElNSVNFX0ZMQUc9JHdpdGh2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ09QVElNSVNFX0ZMQUciID4mNQorJGFzX2VjaG8gIiRDT1BUSU1JU0VfRkxBRyIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZ2F0aGVyIGdjb3YgcHJvZmlsaW5nIGRhdGEiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBnYXRoZXIgZ2NvdiBwcm9maWxpbmcgZGF0YS4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXByb2ZpbGluZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wcm9maWxpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wcm9maWxpbmc7IFBST0ZJTElORz0kZW5hYmxldmFsCitlbHNlCisgIFBST0ZJTElORz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUk9GSUxJTkciID4mNQorJGFzX2VjaG8gIiRQUk9GSUxJTkciID4mNjsgfQorCitpZiB0ZXN0ICIkUFJPRklMSU5HIiA9IHllczsgdGhlbgorICBDT1BUSU1JU0VfRkxBRz0iJENPUFRJTUlTRV9GTEFHIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bGNvdiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1sY292OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9MQ09WKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTENPViBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9MQ09WPSIkTENPViIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfTENPVj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0xDT1Y9JGFjX2N2X3BhdGhfTENPVgoraWYgdGVzdCAtbiAiJExDT1YiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTENPViIgPiY1CiskYXNfZWNobyAiJExDT1YiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX0xDT1YiOyB0aGVuCisgIGFjX3B0X0xDT1Y9JExDT1YKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsY292Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsY292OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9MQ09WKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfTENPViBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9MQ09WPSIkYWNfcHRfTENPViIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfTENPVj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X0xDT1Y9JGFjX2N2X3BhdGhfYWNfcHRfTENPVgoraWYgdGVzdCAtbiAiJGFjX3B0X0xDT1YiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfTENPViIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0xDT1YiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9MQ09WIiA9IHg7IHRoZW4KKyAgICBMQ09WPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTENPVj0kYWNfcHRfTENPVgorICBmaQorZWxzZQorICBMQ09WPSIkYWNfY3ZfcGF0aF9MQ09WIgorZmkKKworICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nZW5odG1sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdlbmh0bWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0dFTkhUTUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRHRU5IVE1MIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0dFTkhUTUw9IiRHRU5IVE1MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HRU5IVE1MPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorR0VOSFRNTD0kYWNfY3ZfcGF0aF9HRU5IVE1MCitpZiB0ZXN0IC1uICIkR0VOSFRNTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRHRU5IVE1MIiA+JjUKKyRhc19lY2hvICIkR0VOSFRNTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR0VOSFRNTCI7IHRoZW4KKyAgYWNfcHRfR0VOSFRNTD0kR0VOSFRNTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdlbmh0bWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdlbmh0bWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X0dFTkhUTUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9HRU5IVE1MIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X0dFTkhUTUw9IiRhY19wdF9HRU5IVE1MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9HRU5IVE1MPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfR0VOSFRNTD0kYWNfY3ZfcGF0aF9hY19wdF9HRU5IVE1MCitpZiB0ZXN0IC1uICIkYWNfcHRfR0VOSFRNTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9HRU5IVE1MIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfR0VOSFRNTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X0dFTkhUTUwiID0geDsgdGhlbgorICAgIEdFTkhUTUw9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBHRU5IVE1MPSRhY19wdF9HRU5IVE1MCisgIGZpCitlbHNlCisgIEdFTkhUTUw9IiRhY19jdl9wYXRoX0dFTkhUTUwiCitmaQorCisgIHRlc3QgLXogIiRMQ09WIiAtbyAteiAiJEdFTkhUTUwiICYmIGFzX2ZuX2Vycm9yICQ/ICJsY292IGFuZCBnZW5odG1sIGFyZSByZXF1aXJlZCBmb3IgcHJvZmlsaW5nIiAiJExJTkVOTyIgNQorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nZW5wbmciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2VucG5nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9HRU5QTkcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRHRU5QTkcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfR0VOUE5HPSIkR0VOUE5HIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9HRU5QTkc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitHRU5QTkc9JGFjX2N2X3BhdGhfR0VOUE5HCitpZiB0ZXN0IC1uICIkR0VOUE5HIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEdFTlBORyIgPiY1CiskYXNfZWNobyAiJEdFTlBORyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR0VOUE5HIjsgdGhlbgorICBhY19wdF9HRU5QTkc9JEdFTlBORworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdlbnBuZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2VucG5nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9HRU5QTkcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9HRU5QTkcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfR0VOUE5HPSIkYWNfcHRfR0VOUE5HIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9HRU5QTkc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9HRU5QTkc9JGFjX2N2X3BhdGhfYWNfcHRfR0VOUE5HCitpZiB0ZXN0IC1uICIkYWNfcHRfR0VOUE5HIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X0dFTlBORyIgPiY1CiskYXNfZWNobyAiJGFjX3B0X0dFTlBORyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X0dFTlBORyIgPSB4OyB0aGVuCisgICAgR0VOUE5HPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgR0VOUE5HPSRhY19wdF9HRU5QTkcKKyAgZmkKK2Vsc2UKKyAgR0VOUE5HPSIkYWNfY3ZfcGF0aF9HRU5QTkciCitmaQorCisgIGlmIHRlc3QgLW4gIiRHRU5QTkciOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRHRU5QTkcgaGFzIGFsbCByZXF1aXJlZCBtb2R1bGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJEdFTlBORyBoYXMgYWxsIHJlcXVpcmVkIG1vZHVsZXMuLi4gIiA+JjY7IH0KKyAgICBpZiAiJEdFTlBORyIgLS1oZWxwID4gL2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQorJGFzX2VjaG8gIm9rIiA+JjY7IH0KKyAgICAgIEdFTkhUTUw9IiRHRU5IVE1MIC0tZnJhbWVzIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3Qgc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJub3Qgc3VwcG9ydGVkIiA+JjY7IH0KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogR0QucG0gcGVybCBtb2R1bGUgaXMgbm90IGluc3RhbGxlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBHRC5wbSBwZXJsIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkIiA+JjI7fQorICAgICAgR0VOUE5HPQorICAgIGZpCisgIGZpCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB1bml0IHRlc3RpbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgdW5pdCB0ZXN0aW5nLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGVzdGluZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90ZXN0aW5nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdGVzdGluZzsgVEVTVElORz0kZW5hYmxldmFsCitlbHNlCisgIFRFU1RJTkc9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVEVTVElORyIgPiY1CiskYXNfZWNobyAiJFRFU1RJTkciID4mNjsgfQorCitpZiB0ZXN0ICIkVEVTVElORyIgPSB5ZXM7IHRoZW4KKwlwa2dfY29uZmlnX2luaXQKKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQ1VOSVQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIENVTklULi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRDVU5JVF9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X0NVTklUX0NGTEFHUz0iJENVTklUX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImN1bml0ID49IDIuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJjdW5pdCA+PSAyLjAiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfQ1VOSVRfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAiY3VuaXQgPj0gMi4wIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkQ1VOSVRfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfQ1VOSVRfTElCUz0iJENVTklUX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJjdW5pdCA+PSAyLjBcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiY3VuaXQgPj0gMi4wIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0NVTklUX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAiY3VuaXQgPj0gMi4wIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIENVTklUX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAiY3VuaXQgPj0gMi4wIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBDVU5JVF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImN1bml0ID49IDIuMCIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkQ1VOSVRfUEtHX0VSUk9SUyIgPiY1CisKKwlhc19mbl9lcnJvciAkPyAiUGFja2FnZSByZXF1aXJlbWVudHMgKGN1bml0ID49IDIuMCkgd2VyZSBub3QgbWV0OgorCiskQ1VOSVRfUEtHX0VSUk9SUworCitDb25zaWRlciBhZGp1c3RpbmcgdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UKK2luc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXguCisKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQ1VOSVRfQ0ZMQUdTCithbmQgQ1VOSVRfTElCUyB0byBhdm9pZCB0aGUgbmVlZCB0byBjYWxsIHBrZy1jb25maWcuCitTZWUgdGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1CitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJUaGUgcGtnLWNvbmZpZyBzY3JpcHQgY291bGQgbm90IGJlIGZvdW5kIG9yIGlzIHRvbyBvbGQuICBNYWtlIHN1cmUgaXQKK2lzIGluIHlvdXIgUEFUSCBvciBzZXQgdGhlIFBLR19DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGZ1bGwKK3BhdGggdG8gcGtnLWNvbmZpZy4KKworQWx0ZXJuYXRpdmVseSwgeW91IG1heSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBDVU5JVF9DRkxBR1MKK2FuZCBDVU5JVF9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorCitUbyBnZXQgcGtnLWNvbmZpZywgc2VlIDxodHRwOi8vcGtnLWNvbmZpZy5mcmVlZGVza3RvcC5vcmcvPi4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitlbHNlCisJQ1VOSVRfQ0ZMQUdTPSRwa2dfY3ZfQ1VOSVRfQ0ZMQUdTCisJQ1VOSVRfTElCUz0kcGtnX2N2X0NVTklUX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworZmkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitURVNUU1VJVEVfREFUQT0nJHtkYXRhcm9vdGRpcn0vbHZtMi10ZXN0c3VpdGUnCisjIGRvdWJsZSBldmFsIG5lZWRlZCAke2RhdGFyb290ZGlyfSAtPiAke3ByZWZpeH0vc2hhcmUgLT4gcmVhbCBwYXRoCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVEVTVFNVSVRFX0RBVEEgIiQoZXZhbCBlY2hvICQoZXZhbCBlY2hvICRURVNUU1VJVEVfREFUQSkpIgorX0FDRU9GCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB2YWxncmluZCBhd2FyZW5lc3Mgb2YgcG9vbHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgdmFsZ3JpbmQgYXdhcmVuZXNzIG9mIHBvb2xzLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdmFsZ3JpbmRfcG9vbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV92YWxncmluZF9wb29sK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdmFsZ3JpbmRfcG9vbDsgVkFMR1JJTkRfUE9PTD0kZW5hYmxldmFsCitlbHNlCisgIFZBTEdSSU5EX1BPT0w9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVkFMR1JJTkRfUE9PTCIgPiY1CiskYXNfZWNobyAiJFZBTEdSSU5EX1BPT0wiID4mNjsgfQorCitwa2dfY29uZmlnX2luaXQKKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgVkFMR1JJTkQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFZBTEdSSU5ELi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRWQUxHUklORF9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X1ZBTEdSSU5EX0NGTEFHUz0iJFZBTEdSSU5EX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcInZhbGdyaW5kXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgInZhbGdyaW5kIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1ZBTEdSSU5EX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgInZhbGdyaW5kIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkVkFMR1JJTkRfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfVkFMR1JJTkRfTElCUz0iJFZBTEdSSU5EX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJ2YWxncmluZFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJ2YWxncmluZCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9WQUxHUklORF9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgInZhbGdyaW5kIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIFZBTEdSSU5EX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAidmFsZ3JpbmQiIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIFZBTEdSSU5EX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAidmFsZ3JpbmQiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJFZBTEdSSU5EX1BLR19FUlJPUlMiID4mNQorCisJaWYgdGVzdCB4JFZBTEdSSU5EX1BPT0wgPSB4eWVzOyB0aGVuIGFzX2ZuX2Vycm9yICQ/ICJiYWlsaW5nIG91dCIgIiRMSU5FTk8iIDU7IGZpCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwlpZiB0ZXN0IHgkVkFMR1JJTkRfUE9PTCA9IHh5ZXM7IHRoZW4gYXNfZm5fZXJyb3IgJD8gImJhaWxpbmcgb3V0IiAiJExJTkVOTyIgNTsgZmkKK2Vsc2UKKwlWQUxHUklORF9DRkxBR1M9JHBrZ19jdl9WQUxHUklORF9DRkxBR1MKKwlWQUxHUklORF9MSUJTPSRwa2dfY3ZfVkFMR1JJTkRfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfVkFMR1JJTkQ9eWVzCitmaQorCisKK2lmIHRlc3QgeCRIQVZFX1ZBTEdSSU5EID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1ZBTEdSSU5EIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitpZiB0ZXN0IHgkVkFMR1JJTkRfUE9PTCA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgVkFMR1JJTkRfUE9PTCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byB1c2UgZGV2aWNlLW1hcHBlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIHVzZSBkZXZpY2UtbWFwcGVyLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGV2bWFwcGVyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Rldm1hcHBlcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Rldm1hcHBlcjsgREVWTUFQUEVSPSRlbmFibGV2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkREVWTUFQUEVSIiA+JjUKKyRhc19lY2hvICIkREVWTUFQUEVSIiA+JjY7IH0KKworaWYgdGVzdCAiJERFVk1BUFBFUiIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgREVWTUFQUEVSX1NVUFBPUlQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgTFZNZXRhRCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIExWTWV0YUQuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sdm1ldGFkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2x2bWV0YWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sdm1ldGFkOyBMVk1FVEFEPSRlbmFibGV2YWwKK2ZpCisKK3Rlc3QgLW4gIiRMVk1FVEFEIiAmJiBCVUlMRF9MVk1FVEFEPSRMVk1FVEFECit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJVSUxEX0xWTUVUQUQiID4mNQorJGFzX2VjaG8gIiRCVUlMRF9MVk1FVEFEIiA+JjY7IH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBsdm1wb2xsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGx2bXBvbGxkLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbHZtcG9sbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbHZtcG9sbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sdm1wb2xsZDsgTFZNUE9MTEQ9JGVuYWJsZXZhbAorZmkKKwordGVzdCAtbiAiJExWTVBPTExEIiAmJiBCVUlMRF9MVk1QT0xMRD0kTFZNUE9MTEQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQlVJTERfTFZNUE9MTEQiID4mNQorJGFzX2VjaG8gIiRCVUlMRF9MVk1QT0xMRCIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitCVUlMRF9MVk1MT0NLRD1ubworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgbG9ja2RzYW5sb2NrIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgbG9ja2RzYW5sb2NrLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbG9ja2Qtc2FubG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sb2NrZF9zYW5sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbG9ja2Rfc2FubG9jazsgTE9DS0RTQU5MT0NLPSRlbmFibGV2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTE9DS0RTQU5MT0NLIiA+JjUKKyRhc19lY2hvICIkTE9DS0RTQU5MT0NLIiA+JjY7IH0KKworQlVJTERfTE9DS0RTQU5MT0NLPSRMT0NLRFNBTkxPQ0sKKworaWYgdGVzdCAiJEJVSUxEX0xPQ0tEU0FOTE9DSyIgPSB5ZXM7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgTE9DS0RfU0FOTE9DSyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgTE9DS0RfU0FOTE9DSy4uLiAiID4mNjsgfQorCitpZiB0ZXN0IC1uICIkTE9DS0RfU0FOTE9DS19DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X0xPQ0tEX1NBTkxPQ0tfQ0ZMQUdTPSIkTE9DS0RfU0FOTE9DS19DRkxBR1MiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJzYW5sb2NrX2NsaWVudCA+PSAzLjMuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJzYW5sb2NrX2NsaWVudCA+PSAzLjMuMCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9MT0NLRF9TQU5MT0NLX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYnNhbmxvY2tfY2xpZW50ID49IDMuMy4wIiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCitpZiB0ZXN0IC1uICIkTE9DS0RfU0FOTE9DS19MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9MT0NLRF9TQU5MT0NLX0xJQlM9IiRMT0NLRF9TQU5MT0NLX0xJQlMiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJsaWJzYW5sb2NrX2NsaWVudCA+PSAzLjMuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJzYW5sb2NrX2NsaWVudCA+PSAzLjMuMCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9MT0NLRF9TQU5MT0NLX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAibGlic2FubG9ja19jbGllbnQgPj0gMy4zLjAiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgTE9DS0RfU0FOTE9DS19QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImxpYnNhbmxvY2tfY2xpZW50ID49IDMuMy4wIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBMT0NLRF9TQU5MT0NLX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGlic2FubG9ja19jbGllbnQgPj0gMy4zLjAiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJExPQ0tEX1NBTkxPQ0tfUEtHX0VSUk9SUyIgPiY1CisKKwkkYmFpbG91dAorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJJGJhaWxvdXQKK2Vsc2UKKwlMT0NLRF9TQU5MT0NLX0NGTEFHUz0kcGtnX2N2X0xPQ0tEX1NBTkxPQ0tfQ0ZMQUdTCisJTE9DS0RfU0FOTE9DS19MSUJTPSRwa2dfY3ZfTE9DS0RfU0FOTE9DS19MSUJTCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJSEFWRV9MT0NLRF9TQU5MT0NLPXllcworZmkKKworJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0RTQU5MT0NLX1NVUFBPUlQgMSIgPj5jb25mZGVmcy5oCisKKwlCVUlMRF9MVk1MT0NLRD15ZXMKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgbG9ja2RkbG0iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBsb2NrZGRsbS4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxvY2tkLWRsbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sb2NrZF9kbG0rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sb2NrZF9kbG07IExPQ0tERExNPSRlbmFibGV2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTE9DS0RETE0iID4mNQorJGFzX2VjaG8gIiRMT0NLRERMTSIgPiY2OyB9CisKK0JVSUxEX0xPQ0tERExNPSRMT0NLRERMTQorCitpZiB0ZXN0ICIkQlVJTERfTE9DS0RETE0iID0geWVzOyB0aGVuCisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIExPQ0tEX0RMTSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgTE9DS0RfRExNLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRMT0NLRF9ETE1fQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9MT0NLRF9ETE1fQ0ZMQUdTPSIkTE9DS0RfRExNX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYmRsbVwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJkbG0iKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfTE9DS0RfRExNX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImxpYmRsbSIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJExPQ0tEX0RMTV9MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9MT0NLRF9ETE1fTElCUz0iJExPQ0tEX0RMTV9MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGliZGxtXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYmRsbSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9MT0NLRF9ETE1fTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJkbG0iIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgTE9DS0RfRExNX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGliZGxtIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBMT0NLRF9ETE1fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJkbG0iIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJExPQ0tEX0RMTV9QS0dfRVJST1JTIiA+JjUKKworCSRiYWlsb3V0CitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisgICAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkkYmFpbG91dAorZWxzZQorCUxPQ0tEX0RMTV9DRkxBR1M9JHBrZ19jdl9MT0NLRF9ETE1fQ0ZMQUdTCisJTE9DS0RfRExNX0xJQlM9JHBrZ19jdl9MT0NLRF9ETE1fTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfTE9DS0RfRExNPXllcworZmkKKworJGFzX2VjaG8gIiNkZWZpbmUgTE9DS0RETE1fU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworCUJVSUxEX0xWTUxPQ0tEPXllcworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBsdm1sb2NrZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGx2bWxvY2tkLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJVSUxEX0xWTUxPQ0tEIiA+JjUKKyRhc19lY2hvICIkQlVJTERfTFZNTE9DS0QiID4mNjsgfQorCitpZiB0ZXN0ICIkQlVJTERfTFZNTE9DS0QiID0geWVzOyB0aGVuCisJaWYgdGVzdCAiJExWTVBPTExEIiA9IG5vOyB0aGVuIDoKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBidWlsZCBsdm1sb2NrZCB3aXRoIC0tZGlzYWJsZS1sdm1wb2xsZC4iICIkTElORU5PIiA1CitmaQorCWlmIHRlc3QgIiRMVk1FVEFEIiA9IG5vOyB0aGVuIDoKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBidWlsZCBsdm1sb2NrZCB3aXRoIC0tZGlzYWJsZS1sdm1ldGFkLiIgIiRMSU5FTk8iIDUKK2ZpCisJaWYgdGVzdCAiJEJVSUxEX0xWTVBPTExEIiA9IG5vOyB0aGVuIDoKKyAgQlVJTERfTFZNUE9MTEQ9eWVzOyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IEVuYWJsaW5nIGx2bXBvbGxkIC0gcmVxdWlyZWQgYnkgbHZtbG9ja2QuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEVuYWJsaW5nIGx2bXBvbGxkIC0gcmVxdWlyZWQgYnkgbHZtbG9ja2QuIiA+JjI7fQorZmkKKwlpZiB0ZXN0ICIkQlVJTERfTFZNRVRBRCIgPSBubzsgdGhlbiA6CisgIEJVSUxEX0xWTUVUQUQ9eWVzOyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IEVuYWJsaW5nIGx2bWV0YWQgLSByZXF1aXJlZCBieSBsdm1sb2NrZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogRW5hYmxpbmcgbHZtZXRhZCAtIHJlcXVpcmVkIGJ5IGx2bWxvY2tkLiIgPiYyO30KK2ZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZWZhdWx0cyBmb3IgdXNlX2x2bWxvY2tkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlZmF1bHRzIGZvciB1c2VfbHZtbG9ja2QuLi4gIiA+JjY7IH0KKwkjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXNlX2x2bWxvY2tkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VzZV9sdm1sb2NrZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3VzZV9sdm1sb2NrZDsgY2FzZSAke2VuYWJsZXZhbH0gaW4KKwkJICAgICAgIHllcykgREVGQVVMVF9VU0VfTFZNTE9DS0Q9MSA7OworCQkgICAgICAgKikgREVGQVVMVF9VU0VfTFZNTE9DS0Q9MCA7OworCQkgICAgICAgZXNhYworZWxzZQorICBERUZBVUxUX1VTRV9MVk1MT0NLRD0xCitmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERUZBVUxUX1VTRV9MVk1MT0NLRCIgPiY1CiskYXNfZWNobyAiJERFRkFVTFRfVVNFX0xWTUxPQ0tEIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgTFZNTE9DS0RfU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbHZtbG9ja2QtcGlkZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbHZtbG9ja2RfcGlkZmlsZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfbHZtbG9ja2RfcGlkZmlsZTsgTFZNTE9DS0RfUElERklMRT0kd2l0aHZhbAorZWxzZQorICBMVk1MT0NLRF9QSURGSUxFPSIkREVGQVVMVF9QSURfRElSL2x2bWxvY2tkLnBpZCIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMVk1MT0NLRF9QSURGSUxFICIkTFZNTE9DS0RfUElERklMRSIKK19BQ0VPRgorCitlbHNlCisJREVGQVVMVF9VU0VfTFZNTE9DS0Q9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX1VTRV9MVk1MT0NLRCAkREVGQVVMVF9VU0VfTFZNTE9DS0QKK19BQ0VPRgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiB0ZXN0ICIkQlVJTERfTFZNRVRBRCIgPSB5ZXM7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlZmF1bHRzIGZvciB1c2VfbHZtZXRhZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZWZhdWx0cyBmb3IgdXNlX2x2bWV0YWQuLi4gIiA+JjY7IH0KKwkjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXNlX2x2bWV0YWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdXNlX2x2bWV0YWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91c2VfbHZtZXRhZDsgY2FzZSAke2VuYWJsZXZhbH0gaW4KKwkJICAgICAgIHllcykgREVGQVVMVF9VU0VfTFZNRVRBRD0xIDs7CisJCSAgICAgICAqKSBERUZBVUxUX1VTRV9MVk1FVEFEPTAgOzsKKwkJICAgICAgIGVzYWMKK2Vsc2UKKyAgREVGQVVMVF9VU0VfTFZNRVRBRD0xCitmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERUZBVUxUX1VTRV9MVk1FVEFEIiA+JjUKKyRhc19lY2hvICIkREVGQVVMVF9VU0VfTFZNRVRBRCIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIExWTUVUQURfU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbHZtZXRhZC1waWRmaWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9sdm1ldGFkX3BpZGZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2x2bWV0YWRfcGlkZmlsZTsgTFZNRVRBRF9QSURGSUxFPSR3aXRodmFsCitlbHNlCisgIExWTUVUQURfUElERklMRT0iJERFRkFVTFRfUElEX0RJUi9sdm1ldGFkLnBpZCIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMVk1FVEFEX1BJREZJTEUgIiRMVk1FVEFEX1BJREZJTEUiCitfQUNFT0YKKworZWxzZQorCURFRkFVTFRfVVNFX0xWTUVUQUQ9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX1VTRV9MVk1FVEFEICRERUZBVUxUX1VTRV9MVk1FVEFECitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJEJVSUxEX0xWTVBPTExEIiA9IHllczsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVmYXVsdHMgZm9yIHVzZV9sdm1wb2xsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZWZhdWx0cyBmb3IgdXNlX2x2bXBvbGxkLi4uICIgPiY2OyB9CisJIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXVzZV9sdm1wb2xsZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91c2VfbHZtcG9sbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91c2VfbHZtcG9sbGQ7IGNhc2UgJHtlbmFibGV2YWx9IGluCisJCSAgICAgICB5ZXMpIERFRkFVTFRfVVNFX0xWTVBPTExEPTEgOzsKKwkJICAgICAgICopIERFRkFVTFRfVVNFX0xWTVBPTExEPTAgOzsKKwkJICAgICAgIGVzYWMKK2Vsc2UKKyAgREVGQVVMVF9VU0VfTFZNUE9MTEQ9MQorZmkKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkREVGQVVMVF9VU0VfTFZNUE9MTEQiID4mNQorJGFzX2VjaG8gIiRERUZBVUxUX1VTRV9MVk1QT0xMRCIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIExWTVBPTExEX1NVUFBPUlQgMSIgPj5jb25mZGVmcy5oCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWx2bXBvbGxkLXBpZGZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2x2bXBvbGxkX3BpZGZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2x2bXBvbGxkX3BpZGZpbGU7IExWTVBPTExEX1BJREZJTEU9JHdpdGh2YWwKK2Vsc2UKKyAgTFZNUE9MTERfUElERklMRT0iJERFRkFVTFRfUElEX0RJUi9sdm1wb2xsZC5waWQiCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFZNUE9MTERfUElERklMRSAiJExWTVBPTExEX1BJREZJTEUiCitfQUNFT0YKKworZWxzZQorCURFRkFVTFRfVVNFX0xWTVBPTExEPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9VU0VfTFZNUE9MTEQgJERFRkFVTFRfVVNFX0xWTVBPTExECitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIG5vdGlmeWRidXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBub3RpZnlkYnVzLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbm90aWZ5LWRidXMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbm90aWZ5X2RidXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ub3RpZnlfZGJ1czsgTk9USUZZREJVUz0kZW5hYmxldmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE5PVElGWURCVVMiID4mNQorJGFzX2VjaG8gIiROT1RJRllEQlVTIiA+JjY7IH0KKworQlVJTERfTk9USUZZREJVUz0kTk9USUZZREJVUworCitpZiB0ZXN0ICIkQlVJTERfTk9USUZZREJVUyIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgTk9USUZZREJVU19TVVBQT1JUIDEiID4+Y29uZmRlZnMuaAorCisJTElCUz0iLWxzeXN0ZW1kICRMSUJTIgorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRCVUlMRF9OT1RJRllEQlVTIiA9IHllczsgdGhlbgorCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBOT1RJRllfREJVUyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgTk9USUZZX0RCVVMuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJE5PVElGWV9EQlVTX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfTk9USUZZX0RCVVNfQ0ZMQUdTPSIkTk9USUZZX0RCVVNfQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwic3lzdGVtZCA+PSAyMjFcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAic3lzdGVtZCA+PSAyMjEiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfTk9USUZZX0RCVVNfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAic3lzdGVtZCA+PSAyMjEiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiROT1RJRllfREJVU19MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9OT1RJRllfREJVU19MSUJTPSIkTk9USUZZX0RCVVNfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcInN5c3RlbWQgPj0gMjIxXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgInN5c3RlbWQgPj0gMjIxIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X05PVElGWV9EQlVTX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAic3lzdGVtZCA+PSAyMjEiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgTk9USUZZX0RCVVNfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJzeXN0ZW1kID49IDIyMSIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgTk9USUZZX0RCVVNfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJzeXN0ZW1kID49IDIyMSIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkTk9USUZZX0RCVVNfUEtHX0VSUk9SUyIgPiY1CisKKwkkYmFpbG91dAorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJJGJhaWxvdXQKK2Vsc2UKKwlOT1RJRllfREJVU19DRkxBR1M9JHBrZ19jdl9OT1RJRllfREJVU19DRkxBR1MKKwlOT1RJRllfREJVU19MSUJTPSRwa2dfY3ZfTk9USUZZX0RCVVNfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCUhBVkVfTk9USUZZX0RCVVM9eWVzCitmaQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBsaWJibGtpZCBkZXRlY3Rpb24gb2Ygc2lnbmF0dXJlcyB3aGVuIHdpcGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBsaWJibGtpZCBkZXRlY3Rpb24gb2Ygc2lnbmF0dXJlcyB3aGVuIHdpcGluZy4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJsa2lkX3dpcGluZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ibGtpZF93aXBpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ibGtpZF93aXBpbmc7IEJMS0lEX1dJUElORz0kZW5hYmxldmFsCitlbHNlCisgIEJMS0lEX1dJUElORz1tYXliZQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCTEtJRF9XSVBJTkciID4mNQorJGFzX2VjaG8gIiRCTEtJRF9XSVBJTkciID4mNjsgfQorCitpZiB0ZXN0ICIkQkxLSURfV0lQSU5HIiAhPSBubzsgdGhlbgorCXBrZ19jb25maWdfaW5pdAorCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCTEtJRCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQkxLSUQuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJEJMS0lEX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfQkxLSURfQ0ZMQUdTPSIkQkxLSURfQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiYmxraWQgPj0gMi4yNFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJibGtpZCA+PSAyLjI0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0JMS0lEX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImJsa2lkID49IDIuMjQiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRCTEtJRF9MSUJTIjsgdGhlbgorICAgIHBrZ19jdl9CTEtJRF9MSUJTPSIkQkxLSURfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImJsa2lkID49IDIuMjRcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiYmxraWQgPj0gMi4yNCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9CTEtJRF9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImJsa2lkID49IDIuMjQiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgQkxLSURfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJibGtpZCA+PSAyLjI0IiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBCTEtJRF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgImJsa2lkID49IDIuMjQiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJEJMS0lEX1BLR19FUlJPUlMiID4mNQorCisJaWYgdGVzdCAiJEJMS0lEX1dJUElORyIgPSBtYXliZTsgdGhlbgorCQkJCUJMS0lEX1dJUElORz1ubworCQkJICAgZWxzZQorCQkJICAgICAgICBhc19mbl9lcnJvciAkPyAiYmFpbGluZyBvdXQuLi4gYmxraWQgbGlicmFyeSA+PSAyLjI0IGlzIHJlcXVpcmVkIiAiJExJTkVOTyIgNQorCQkJICAgZmkKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCWlmIHRlc3QgIiRCTEtJRF9XSVBJTkciID0gbWF5YmU7IHRoZW4KKwkJCQlCTEtJRF9XSVBJTkc9bm8KKwkJCSAgIGVsc2UKKwkJCSAgICAgICAgYXNfZm5fZXJyb3IgJD8gImJhaWxpbmcgb3V0Li4uIGJsa2lkIGxpYnJhcnkgPj0gMi4yNCBpcyByZXF1aXJlZCIgIiRMSU5FTk8iIDUKKwkJCSAgIGZpCitlbHNlCisJQkxLSURfQ0ZMQUdTPSRwa2dfY3ZfQkxLSURfQ0ZMQUdTCisJQkxLSURfTElCUz0kcGtnX2N2X0JMS0lEX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwl0ZXN0ICIkQkxLSURfV0lQSU5HIiA9IG1heWJlICYmIEJMS0lEX1dJUElORz15ZXMKK2ZpCisJaWYgdGVzdCAiJEJMS0lEX1dJUElORyIgPSB5ZXM7IHRoZW4KKwkJQkxLSURfUEM9ImJsa2lkIgorCQlERUZBVUxUX1VTRV9CTEtJRF9XSVBJTkc9MQorCiskYXNfZWNobyAiI2RlZmluZSBCTEtJRF9XSVBJTkdfU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworCWVsc2UKKwkJREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HPTAKKwlmaQorZWxzZQorCURFRkFVTFRfVVNFX0JMS0lEX1dJUElORz0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfVVNFX0JMS0lEX1dJUElORyAkREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HCitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIHVzZSB1ZGV2LXN5c3RlbWQgcHJvdG9jb2wgZm9yIGpvYnMgaW4gYmFja2dyb3VuZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIHVzZSB1ZGV2LXN5c3RlbWQgcHJvdG9jb2wgZm9yIGpvYnMgaW4gYmFja2dyb3VuZC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXVkZXYtc3lzdGVtZC1iYWNrZ3JvdW5kLWpvYnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdWRldl9zeXN0ZW1kX2JhY2tncm91bmRfam9icytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3VkZXZfc3lzdGVtZF9iYWNrZ3JvdW5kX2pvYnM7IFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlM9JGVuYWJsZXZhbAorZWxzZQorICBVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTPW1heWJlCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlMiID4mNQorJGFzX2VjaG8gIiRVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTIiA+JjY7IH0KKworaWYgdGVzdCAiJFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlMiICE9IG5vOyB0aGVuCisJcGtnX2NvbmZpZ19pbml0CisKK3BrZ19mYWlsZWQ9bm8KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFNZU1RFTUQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNZU1RFTUQuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJFNZU1RFTURfQ0ZMQUdTIjsgdGhlbgorICAgIHBrZ19jdl9TWVNURU1EX0NGTEFHUz0iJFNZU1RFTURfQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwic3lzdGVtZCA+PSAyMDVcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAic3lzdGVtZCA+PSAyMDUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfU1lTVEVNRF9DRkxBR1M9YCRQS0dfQ09ORklHIC0tY2ZsYWdzICJzeXN0ZW1kID49IDIwNSIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJFNZU1RFTURfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfU1lTVEVNRF9MSUJTPSIkU1lTVEVNRF9MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwic3lzdGVtZCA+PSAyMDVcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAic3lzdGVtZCA+PSAyMDUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfU1lTVEVNRF9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgInN5c3RlbWQgPj0gMjA1IiAyPi9kZXYvbnVsbGAKKwkJICAgICAgdGVzdCAieCQ/IiAhPSAieDAiICYmIHBrZ19mYWlsZWQ9eWVzCitlbHNlCisgIHBrZ19mYWlsZWQ9eWVzCitmaQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpCisKKworCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaQorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgIFNZU1RFTURfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJzeXN0ZW1kID49IDIwNSIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAgICAgU1lTVEVNRF9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAtLWNmbGFncyAtLWxpYnMgInN5c3RlbWQgPj0gMjA1IiAyPiYxYAorICAgICAgICBmaQorCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncworCWVjaG8gIiRTWVNURU1EX1BLR19FUlJPUlMiID4mNQorCisJaWYgdGVzdCAiJFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlMiID0gbWF5YmU7IHRoZW4KKwkJCQlVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTPW5vCisJCQkgICBlbHNlCisJCQkJYXNfZm5fZXJyb3IgJD8gImJhaWxpbmcgb3V0Li4uIHN5c3RlbWQgPj0gMjA1IGlzIHJlcXVpcmVkIiAiJExJTkVOTyIgNQorCQkJICAgZmkKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCWlmIHRlc3QgIiRVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTIiA9IG1heWJlOyB0aGVuCisJCQkJVURFVl9TWVNURU1EX0JBQ0tHUk9VTkRfSk9CUz1ubworCQkJICAgZWxzZQorCQkJCWFzX2ZuX2Vycm9yICQ/ICJiYWlsaW5nIG91dC4uLiBzeXN0ZW1kID49IDIwNSBpcyByZXF1aXJlZCIgIiRMSU5FTk8iIDUKKwkJCSAgIGZpCitlbHNlCisJU1lTVEVNRF9DRkxBR1M9JHBrZ19jdl9TWVNURU1EX0NGTEFHUworCVNZU1RFTURfTElCUz0kcGtnX2N2X1NZU1RFTURfTElCUworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCXRlc3QgIiRVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTIiA9IG1heWJlICYmIFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlM9eWVzCitmaQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgc3luY2hyb25pc2F0aW9uIHdpdGggdWRldiBwcm9jZXNzaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHN5bmNocm9uaXNhdGlvbiB3aXRoIHVkZXYgcHJvY2Vzc2luZy4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXVkZXZfc3luYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91ZGV2X3N5bmMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91ZGV2X3N5bmM7IFVERVZfU1lOQz0kZW5hYmxldmFsCitlbHNlCisgIFVERVZfU1lOQz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVREVWX1NZTkMiID4mNQorJGFzX2VjaG8gIiRVREVWX1NZTkMiID4mNjsgfQorCitpZiB0ZXN0ICIkVURFVl9TWU5DIiA9IHllczsgdGhlbgorCXBrZ19jb25maWdfaW5pdAorCitwa2dfZmFpbGVkPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBVREVWIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBVREVWLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgLW4gIiRVREVWX0NGTEFHUyI7IHRoZW4KKyAgICBwa2dfY3ZfVURFVl9DRkxBR1M9IiRVREVWX0NGTEFHUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYnVkZXYgPj0gMTQzXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYnVkZXYgPj0gMTQzIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1VERVZfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAibGlidWRldiA+PSAxNDMiIDI+L2Rldi9udWxsYAorCQkgICAgICB0ZXN0ICJ4JD8iICE9ICJ4MCIgJiYgcGtnX2ZhaWxlZD15ZXMKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRVREVWX0xJQlMiOyB0aGVuCisgICAgcGtnX2N2X1VERVZfTElCUz0iJFVERVZfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYnVkZXYgPj0gMTQzXCIiOyB9ID4mNQorICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImxpYnVkZXYgPj0gMTQzIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X1VERVZfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJ1ZGV2ID49IDE0MyIgMj4vZGV2L251bGxgCisJCSAgICAgIHRlc3QgIngkPyIgIT0gIngwIiAmJiBwa2dfZmFpbGVkPXllcworZWxzZQorICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQorCisKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmkKKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBVREVWX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzIC0tY2ZsYWdzIC0tbGlicyAibGlidWRldiA+PSAxNDMiIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgIFVERVZfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgLS1jZmxhZ3MgLS1saWJzICJsaWJ1ZGV2ID49IDE0MyIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkVURFVl9QS0dfRVJST1JTIiA+JjUKKworCWFzX2ZuX2Vycm9yICQ/ICJQYWNrYWdlIHJlcXVpcmVtZW50cyAobGlidWRldiA+PSAxNDMpIHdlcmUgbm90IG1ldDoKKworJFVERVZfUEtHX0VSUk9SUworCitDb25zaWRlciBhZGp1c3RpbmcgdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UKK2luc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXguCisKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgVURFVl9DRkxBR1MKK2FuZCBVREVWX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgorU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNQorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiVGhlIHBrZy1jb25maWcgc2NyaXB0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBpcyB0b28gb2xkLiAgTWFrZSBzdXJlIGl0CitpcyBpbiB5b3VyIFBBVEggb3Igc2V0IHRoZSBQS0dfQ09ORklHIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBmdWxsCitwYXRoIHRvIHBrZy1jb25maWcuCisKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgVURFVl9DRkxBR1MKK2FuZCBVREVWX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgorU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisKK1RvIGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+LgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2Vsc2UKKwlVREVWX0NGTEFHUz0kcGtnX2N2X1VERVZfQ0ZMQUdTCisJVURFVl9MSUJTPSRwa2dfY3ZfVURFVl9MSUJTCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJVURFVl9QQz0ibGlidWRldiIKK2ZpCisKKyRhc19lY2hvICIjZGVmaW5lIFVERVZfU1lOQ19TVVBQT1JUIDEiID4+Y29uZmRlZnMuaAorCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1ZGV2X2RldmljZV9nZXRfaXNfaW5pdGlhbGl6ZWQgaW4gLWx1ZGV2IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1ZGV2X2RldmljZV9nZXRfaXNfaW5pdGlhbGl6ZWQgaW4gLWx1ZGV2Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl91ZGV2X3VkZXZfZGV2aWNlX2dldF9pc19pbml0aWFsaXplZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sdWRldiAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgdWRldl9kZXZpY2VfZ2V0X2lzX2luaXRpYWxpemVkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gdWRldl9kZXZpY2VfZ2V0X2lzX2luaXRpYWxpemVkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl91ZGV2X3VkZXZfZGV2aWNlX2dldF9pc19pbml0aWFsaXplZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3VkZXZfdWRldl9kZXZpY2VfZ2V0X2lzX2luaXRpYWxpemVkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl91ZGV2X3VkZXZfZGV2aWNlX2dldF9pc19pbml0aWFsaXplZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl91ZGV2X3VkZXZfZGV2aWNlX2dldF9pc19pbml0aWFsaXplZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91ZGV2X3VkZXZfZGV2aWNlX2dldF9pc19pbml0aWFsaXplZCIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJVREVWX1VERVZfREVWSUNFX0dFVF9JU19JTklUSUFMSVpFRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgaW5zdGFsbGF0aW9uIG9mIHVkZXYgcnVsZXMgcmVxdWlyZWQgZm9yIHN5bmNocm9uaXNhdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBpbnN0YWxsYXRpb24gb2YgdWRldiBydWxlcyByZXF1aXJlZCBmb3Igc3luY2hyb25pc2F0aW9uLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdWRldl9ydWxlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91ZGV2X3J1bGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdWRldl9ydWxlczsgVURFVl9SVUxFUz0kZW5hYmxldmFsCitlbHNlCisgIFVERVZfUlVMRVM9JFVERVZfU1lOQworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVREVWX1JVTEVTIiA+JjUKKyRhc19lY2hvICIkVURFVl9SVUxFUyIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZXhlY3V0YWJsZSBwYXRoIGRldGVjdGlvbiBpbiB1ZGV2IHJ1bGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGV4ZWN1dGFibGUgcGF0aCBkZXRlY3Rpb24gaW4gdWRldiBydWxlcy4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXVkZXZfcnVsZV9leGVjX2RldGVjdGlvbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91ZGV2X3J1bGVfZXhlY19kZXRlY3Rpb24rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91ZGV2X3J1bGVfZXhlY19kZXRlY3Rpb247IFVERVZfUlVMRV9FWEVDX0RFVEVDVElPTj0kZW5hYmxldmFsCitlbHNlCisgIFVERVZfUlVMRV9FWEVDX0RFVEVDVElPTj1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVREVWX1JVTEVfRVhFQ19ERVRFQ1RJT04iID4mNQorJGFzX2VjaG8gIiRVREVWX1JVTEVfRVhFQ19ERVRFQ1RJT04iID4mNjsgfQorCitpZiB0ZXN0ICIkVURFVl9SVUxFIiAhPSBubyA7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdWRldiBzdXBwb3J0cyBidWlsdC1pbiBibGtpZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHVkZXYgc3VwcG9ydHMgYnVpbHQtaW4gYmxraWQuLi4gIiA+JjY7IH0KKwlwa2dfY29uZmlnX2luaXQKKwlpZiAkKCIkUEtHX0NPTkZJRyIgLS1hdGxlYXN0LXZlcnNpb249MTc2IGxpYnVkZXYpOyB0aGVuCisJCVVERVZfSEFTX0JVSUxUSU5fQkxLSUQ9eWVzCisJZWxzZQorCQlVREVWX0hBU19CVUlMVElOX0JMS0lEPW5vCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVERVZfSEFTX0JVSUxUSU5fQkxLSUQiID4mNQorJGFzX2VjaG8gIiRVREVWX0hBU19CVUlMVElOX0JMS0lEIiA+JjY7IH0KK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tcGF0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NvbXBhdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2NvbXBhdDsgRE1fQ09NUEFUPSRlbmFibGV2YWwKK2Vsc2UKKyAgRE1fQ09NUEFUPW5vCitmaQorCisKK2lmIHRlc3QgIiRETV9DT01QQVQiID0geWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgRE1fQ09NUEFUIDEiID4+Y29uZmRlZnMuaAorCisgICAgICBhc19mbl9lcnJvciAkPyAiLS1lbmFibGUtY29tcGF0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorU2luY2UgZGV2aWNlLW1hcHBlciB2ZXJzaW9uIDEuMDIuNjYsIG9ubHkgb25lIHZlcnNpb24gKDQpIG9mIHRoZSBkZXZpY2UtbWFwcGVyCitpb2N0bCBwcm90b2NvbCBpcyBzdXBwb3J0ZWQuIiAiJExJTkVOTyIgNQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS11bml0cy1jb21wYXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdW5pdHNfY29tcGF0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdW5pdHNfY29tcGF0OyBVTklUU19DT01QQVQ9JGVuYWJsZXZhbAorZWxzZQorICBVTklUU19DT01QQVQ9bm8KK2ZpCisKKworaWYgdGVzdCAiJFVOSVRTX0NPTVBBVCIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgREVGQVVMVF9TSV9VTklUX0NPTlNJU1RFTkNZIDAiID4+Y29uZmRlZnMuaAorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlvY3RsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2lvY3RsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfaW9jdGw7IERNX0lPQ1RMUz0kZW5hYmxldmFsCitmaQorCitpZiB0ZXN0ICIkRE1fSU9DVExTIiA9IHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIERNX0lPQ1RMUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgT19ESVJFQ1QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgT19ESVJFQ1QuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vX2RpcmVjdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9vX2RpcmVjdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX29fZGlyZWN0OyBPRElSRUNUPSRlbmFibGV2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0RJUkVDVCIgPiY1CiskYXNfZWNobyAiJE9ESVJFQ1QiID4mNjsgfQorCitpZiB0ZXN0ICIkT0RJUkVDVCIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgT19ESVJFQ1RfU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBsaWJsdm0yYXBwLnNvIGFwcGxpY2F0aW9uIGxpYnJhcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBsaWJsdm0yYXBwLnNvIGFwcGxpY2F0aW9uIGxpYnJhcnkuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1hcHBsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYXBwbGliK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfYXBwbGliOyBBUFBMSUI9JGVuYWJsZXZhbAorZWxzZQorICBBUFBMSUI9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVBQTElCIiA+JjUKKyRhc19lY2hvICIkQVBQTElCIiA+JjY7IH0KKwordGVzdCAiJEFQUExJQiIgPSB5ZXMgXAorICAmJiBMVk0yQVBQX0xJQj0tbGx2bTJhcHAgXAorICB8fCBMVk0yQVBQX0xJQj0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBjb21waWxlIGxpYmx2bTJjbWQuc28iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBjb21waWxlIGxpYmx2bTJjbWQuc28uLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jbWRsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY21kbGliK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY21kbGliOyBDTURMSUI9JGVuYWJsZXZhbAorZWxzZQorICBDTURMSUI9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ01ETElCIiA+JjUKKyRhc19lY2hvICIkQ01ETElCIiA+JjY7IH0KKwordGVzdCAiJENNRExJQiIgPSB5ZXMgXAorICAmJiBMVk0yQ01EX0xJQj0tbGx2bTJjbWQgXAorICB8fCBMVk0yQ01EX0xJQj0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBpbmNsdWRlIFB5dGhvbiBELUJ1cyBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBQeXRob24gRC1CdXMgc3VwcG9ydC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRidXMtc2VydmljZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kYnVzX3NlcnZpY2Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kYnVzX3NlcnZpY2U7IEJVSUxEX0xWTURCVVNEPSRlbmFibGV2YWwKK2Vsc2UKKyAgQlVJTERfTFZNREJVU0Q9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQlVJTERfTFZNREJVU0QiID4mNQorJGFzX2VjaG8gIiRCVUlMRF9MVk1EQlVTRCIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgUHl0aG9uIHdyYXBwZXIgZm9yIGxpYmx2bTJhcHAuc28iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBQeXRob24gd3JhcHBlciBmb3IgbGlibHZtMmFwcC5zby4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXB5dGhvbl9iaW5kaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9weXRob25fYmluZGluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9weXRob25fYmluZGluZ3M7IFBZVEhPTl9CSU5ESU5HUz0kZW5hYmxldmFsCitlbHNlCisgIFBZVEhPTl9CSU5ESU5HUz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQWVRIT05fQklORElOR1MiID4mNQorJGFzX2VjaG8gIiRQWVRIT05fQklORElOR1MiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgUHl0aG9uMiB3cmFwcGVyIGZvciBsaWJsdm0yYXBwLnNvIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgUHl0aG9uMiB3cmFwcGVyIGZvciBsaWJsdm0yYXBwLnNvLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcHl0aG9uMl9iaW5kaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9weXRob24yX2JpbmRpbmdzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfcHl0aG9uMl9iaW5kaW5nczsgUFlUSE9OMl9CSU5ESU5HUz0kZW5hYmxldmFsCitlbHNlCisgIFBZVEhPTjJfQklORElOR1M9bm8KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFlUSE9OMl9CSU5ESU5HUyIgPiY1CiskYXNfZWNobyAiJFBZVEhPTjJfQklORElOR1MiID4mNjsgfQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBQeXRob24zIHdyYXBwZXIgZm9yIGxpYmx2bTJhcHAuc28iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBQeXRob24zIHdyYXBwZXIgZm9yIGxpYmx2bTJhcHAuc28uLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1weXRob24zX2JpbmRpbmdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3B5dGhvbjNfYmluZGluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9weXRob24zX2JpbmRpbmdzOyBQWVRIT04zX0JJTkRJTkdTPSRlbmFibGV2YWwKK2Vsc2UKKyAgUFlUSE9OM19CSU5ESU5HUz1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQWVRIT04zX0JJTkRJTkdTIiA+JjUKKyRhc19lY2hvICIkUFlUSE9OM19CSU5ESU5HUyIgPiY2OyB9CisKK2lmIHRlc3QgIiRQWVRIT05fQklORElOR1MiID0geWVzOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIi0tZW5hYmxlLXB5dGhvbi1iaW5kaW5ncyBpcyByZXBsYWNlZCBieSAtLWVuYWJsZS1weXRob24yLWJpbmRpbmdzIGFuZCAtLWVuYWJsZS1weXRob24zLWJpbmRpbmdzIiAiJExJTkVOTyIgNQorZmkKKworaWYgdGVzdCAiJFBZVEhPTjJfQklORElOR1MiID0geWVzOyB0aGVuCisKKworCisKKworCisgICAgICAgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCisgICAgICAjIElmIHRoZSB1c2VyIHNldCAkUFlUSE9OLCB1c2UgaXQgYW5kIGRvbid0IHNlYXJjaCBzb21ldGhpbmcgZWxzZS4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkUFlUSE9OIHZlcnNpb24gaXMgPj0gMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRQWVRIT04gdmVyc2lvbiBpcyA+PSAyLi4uICIgPiY2OyB9CisgICAgICBwcm9nPSJpbXBvcnQgc3lzCisjIHNwbGl0IHN0cmluZ3MgYnkgJy4nIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMuICBBcHBlbmQgc29tZSB6ZXJvcworIyBiZWNhdXNlIHdlIG5lZWQgYXQgbGVhc3QgNCBkaWdpdHMgZm9yIHRoZSBoZXggY29udmVyc2lvbi4KKyMgbWFwIHJldHVybnMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMuMCBhbmQgYSBsaXN0IGluIDIueAorbWludmVyID0gbGlzdChtYXAoaW50LCAnMicuc3BsaXQoJy4nKSkpICsgWzAsIDAsIDBdCittaW52ZXJoZXggPSAwCisjIHhyYW5nZSBpcyBub3QgcHJlc2VudCBpbiBQeXRob24gMy4wIGFuZCByYW5nZSByZXR1cm5zIGFuIGl0ZXJhdG9yCitmb3IgaSBpbiBsaXN0KHJhbmdlKDAsIDQpKTogbWludmVyaGV4ID0gKG1pbnZlcmhleCA8PCA4KSArIG1pbnZlcltpXQorc3lzLmV4aXQoc3lzLmhleHZlcnNpb24gPCBtaW52ZXJoZXgpIgorICBpZiB7IGVjaG8gIiRhc19tZTokTElORU5POiAkUFlUSE9OIC1jICIkcHJvZyIiID4mNQorICAgKCRQWVRIT04gLWMgIiRwcm9nIikgPiY1IDI+JjUKKyAgIGFjX3N0YXR1cz0kPworICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJCSAgICAgICBhc19mbl9lcnJvciAkPyAiUHl0aG9uIGludGVycHJldGVyIGlzIHRvbyBvbGQiICIkTElORU5PIiA1CitmaQorICAgICAgYW1fZGlzcGxheV9QWVRIT049JFBZVEhPTgorICAgIGVsc2UKKyAgICAgICMgT3RoZXJ3aXNlLCB0cnkgZWFjaCBpbnRlcnByZXRlciB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHNhdGlzZmllcworICAgICAgIyBWRVJTSU9OLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBQeXRob24gaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49IDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgUHl0aG9uIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAyLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X3BhdGhsZXNzX1BZVEhPTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwlmb3IgYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIGluIHB5dGhvbiBweXRob24yIHB5dGhvbjMgcHl0aG9uMy4zIHB5dGhvbjMuMiBweXRob24zLjEgcHl0aG9uMy4wIHB5dGhvbjIuNyAgcHl0aG9uMi42IHB5dGhvbjIuNSBweXRob24yLjQgcHl0aG9uMi4zIHB5dGhvbjIuMiBweXRob24yLjEgcHl0aG9uMi4wIG5vbmU7IGRvCisJICB0ZXN0ICIkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIiA9IG5vbmUgJiYgYnJlYWsKKwkgIHByb2c9ImltcG9ydCBzeXMKKyMgc3BsaXQgc3RyaW5ncyBieSAnLicgYW5kIGNvbnZlcnQgdG8gbnVtZXJpYy4gIEFwcGVuZCBzb21lIHplcm9zCisjIGJlY2F1c2Ugd2UgbmVlZCBhdCBsZWFzdCA0IGRpZ2l0cyBmb3IgdGhlIGhleCBjb252ZXJzaW9uLgorIyBtYXAgcmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy4wIGFuZCBhIGxpc3QgaW4gMi54CittaW52ZXIgPSBsaXN0KG1hcChpbnQsICcyJy5zcGxpdCgnLicpKSkgKyBbMCwgMCwgMF0KK21pbnZlcmhleCA9IDAKKyMgeHJhbmdlIGlzIG5vdCBwcmVzZW50IGluIFB5dGhvbiAzLjAgYW5kIHJhbmdlIHJldHVybnMgYW4gaXRlcmF0b3IKK2ZvciBpIGluIGxpc3QocmFuZ2UoMCwgNCkpOiBtaW52ZXJoZXggPSAobWludmVyaGV4IDw8IDgpICsgbWludmVyW2ldCitzeXMuZXhpdChzeXMuaGV4dmVyc2lvbiA8IG1pbnZlcmhleCkiCisgIGlmIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhbV9jdl9wYXRobGVzc19QWVRIT04gLWMgIiRwcm9nIiIgPiY1CisgICAoJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiAtYyAiJHByb2ciKSA+JjUgMj4mNQorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbiA6CisgIGJyZWFrCitmaQorCWRvbmUKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPiY1CiskYXNfZWNobyAiJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPiY2OyB9CisgICAgICAjIFNldCAkUFlUSE9OIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mICRhbV9jdl9wYXRobGVzc19QWVRIT04uCisgICAgICBpZiB0ZXN0ICIkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIiA9IG5vbmU7IHRoZW4KKwlQWVRIT049OgorICAgICAgZWxzZQorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhbV9jdl9wYXRobGVzc19QWVRIT04iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhbV9jdl9wYXRobGVzc19QWVRIT047IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1BZVEhPTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBZVEhPTiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QWVRIT049IiRQWVRIT04iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1BZVEhPTj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1BZVEhPTj0kYWNfY3ZfcGF0aF9QWVRIT04KK2lmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFlUSE9OIiA+JjUKKyRhc19lY2hvICIkUFlUSE9OIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICAgIGZpCisgICAgICBhbV9kaXNwbGF5X1BZVEhPTj0kYW1fY3ZfcGF0aGxlc3NfUFlUSE9OCisgICAgZmkKKworCisgIGlmIHRlc3QgIiRQWVRIT04iID0gOjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIm5vIHN1aXRhYmxlIFB5dGhvbiBpbnRlcnByZXRlciBmb3VuZCIgIiRMSU5FTk8iIDUKKyAgZWxzZQorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhbV9kaXNwbGF5X1BZVEhPTiB2ZXJzaW9uLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X3B5dGhvbl92ZXJzaW9uKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYW1fY3ZfcHl0aG9uX3ZlcnNpb249YCRQWVRIT04gLWMgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3lzLnZlcnNpb25bOjNdKSJgCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9weXRob25fdmVyc2lvbiIgPiY1CiskYXNfZWNobyAiJGFtX2N2X3B5dGhvbl92ZXJzaW9uIiA+JjY7IH0KKyAgUFlUSE9OX1ZFUlNJT049JGFtX2N2X3B5dGhvbl92ZXJzaW9uCisKKworCisgIFBZVEhPTl9QUkVGSVg9JyR7cHJlZml4fScKKworICBQWVRIT05fRVhFQ19QUkVGSVg9JyR7ZXhlY19wcmVmaXh9JworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gcGxhdGZvcm0iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBwbGF0Zm9ybS4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9weXRob25fcGxhdGZvcm0rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhbV9jdl9weXRob25fcGxhdGZvcm09YCRQWVRIT04gLWMgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3lzLnBsYXRmb3JtKSJgCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9weXRob25fcGxhdGZvcm0iID4mNQorJGFzX2VjaG8gIiRhbV9jdl9weXRob25fcGxhdGZvcm0iID4mNjsgfQorICBQWVRIT05fUExBVEZPUk09JGFtX2N2X3B5dGhvbl9wbGF0Zm9ybQorCisKKyAgIyBKdXN0IGZhY3RvciBvdXQgc29tZSBjb2RlIGR1cGxpY2F0aW9uLgorICBhbV9weXRob25fc2V0dXBfc3lzY29uZmlnPSJcCitpbXBvcnQgc3lzCisjIFByZWZlciBzeXNjb25maWcgb3ZlciBkaXN0dXRpbHMuc3lzY29uZmlnLCBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkKKyMgd2l0aCBweXRob24gMy54LiAgU2VlIGF1dG9tYWtlIGJ1ZyMxMDIyNy4KK3RyeToKKyAgICBpbXBvcnQgc3lzY29uZmlnCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY2FuX3VzZV9zeXNjb25maWcgPSAwCitlbHNlOgorICAgIGNhbl91c2Vfc3lzY29uZmlnID0gMQorIyBDYW4ndCB1c2Ugc3lzY29uZmlnIGluIENQeXRob24gMi43LCBzaW5jZSBpdCdzIGJyb2tlbiBpbiB2aXJ0dWFsZW52czoKKyMgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3ZpcnR1YWxlbnYvaXNzdWVzLzExOD4KK3RyeToKKyAgICBmcm9tIHBsYXRmb3JtIGltcG9ydCBweXRob25faW1wbGVtZW50YXRpb24KKyAgICBpZiBweXRob25faW1wbGVtZW50YXRpb24oKSA9PSAnQ1B5dGhvbicgYW5kIHN5cy52ZXJzaW9uWzozXSA9PSAnMi43JzoKKyAgICAgICAgY2FuX3VzZV9zeXNjb25maWcgPSAwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcyIKKworCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gc2NyaXB0IGRpcmVjdG9yeSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHNjcmlwdCBkaXJlY3RvcnkuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfcHl0aG9uX3B5dGhvbmRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkcHJlZml4IiA9IHhOT05FCisgICAgIHRoZW4KKyAgICAgICBhbV9weV9wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisgICAgIGVsc2UKKyAgICAgICBhbV9weV9wcmVmaXg9JHByZWZpeAorICAgICBmaQorICAgICBhbV9jdl9weXRob25fcHl0aG9uZGlyPWAkUFlUSE9OIC1jICIKKyRhbV9weXRob25fc2V0dXBfc3lzY29uZmlnCitpZiBjYW5fdXNlX3N5c2NvbmZpZzoKKyAgICBzaXRlZGlyID0gc3lzY29uZmlnLmdldF9wYXRoKCdwdXJlbGliJywgdmFycz17J2Jhc2UnOickYW1fcHlfcHJlZml4J30pCitlbHNlOgorICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICBzaXRlZGlyID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKDAsIDAsIHByZWZpeD0nJGFtX3B5X3ByZWZpeCcpCitzeXMuc3Rkb3V0LndyaXRlKHNpdGVkaXIpImAKKyAgICAgY2FzZSAkYW1fY3ZfcHl0aG9uX3B5dGhvbmRpciBpbgorICAgICAkYW1fcHlfcHJlZml4KikKKyAgICAgICBhbV9fc3RyaXBfcHJlZml4PWBlY2hvICIkYW1fcHlfcHJlZml4IiB8IHNlZCAnc3wufC58ZydgCisgICAgICAgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcj1gZWNobyAiJGFtX2N2X3B5dGhvbl9weXRob25kaXIiIHwgc2VkICJzLF4kYW1fX3N0cmlwX3ByZWZpeCwkUFlUSE9OX1BSRUZJWCwiYAorICAgICAgIDs7CisgICAgICopCisgICAgICAgY2FzZSAkYW1fcHlfcHJlZml4IGluCisgICAgICAgICAvdXNyfC9TeXN0ZW0qKSA7OworICAgICAgICAgKikKKwkgIGFtX2N2X3B5dGhvbl9weXRob25kaXI9JFBZVEhPTl9QUkVGSVgvbGliL3B5dGhvbiRQWVRIT05fVkVSU0lPTi9zaXRlLXBhY2thZ2VzCisJICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworICAgICBlc2FjCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X3B5dGhvbl9weXRob25kaXIiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9weXRob25fcHl0aG9uZGlyIiA+JjY7IH0KKyAgcHl0aG9uZGlyPSRhbV9jdl9weXRob25fcHl0aG9uZGlyCisKKworCisgIHBrZ3B5dGhvbmRpcj1cJHtweXRob25kaXJ9LyRQQUNLQUdFCisKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gZXh0ZW5zaW9uIG1vZHVsZSBkaXJlY3RvcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBleHRlbnNpb24gbW9kdWxlIGRpcmVjdG9yeS4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9weXRob25fcHlleGVjZGlyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORQorICAgICB0aGVuCisgICAgICAgYW1fcHlfZXhlY19wcmVmaXg9JGFtX3B5X3ByZWZpeAorICAgICBlbHNlCisgICAgICAgYW1fcHlfZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4CisgICAgIGZpCisgICAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9YCRQWVRIT04gLWMgIgorJGFtX3B5dGhvbl9zZXR1cF9zeXNjb25maWcKK2lmIGNhbl91c2Vfc3lzY29uZmlnOgorICAgIHNpdGVkaXIgPSBzeXNjb25maWcuZ2V0X3BhdGgoJ3BsYXRsaWInLCB2YXJzPXsncGxhdGJhc2UnOickYW1fcHlfcHJlZml4J30pCitlbHNlOgorICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICBzaXRlZGlyID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKDEsIDAsIHByZWZpeD0nJGFtX3B5X3ByZWZpeCcpCitzeXMuc3Rkb3V0LndyaXRlKHNpdGVkaXIpImAKKyAgICAgY2FzZSAkYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpciBpbgorICAgICAkYW1fcHlfZXhlY19wcmVmaXgqKQorICAgICAgIGFtX19zdHJpcF9wcmVmaXg9YGVjaG8gIiRhbV9weV9leGVjX3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHlleGVjZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9FWEVDX1BSRUZJWCwiYAorICAgICAgIDs7CisgICAgICopCisgICAgICAgY2FzZSAkYW1fcHlfZXhlY19wcmVmaXggaW4KKyAgICAgICAgIC91c3J8L1N5c3RlbSopIDs7CisgICAgICAgICAqKQorCSAgIGFtX2N2X3B5dGhvbl9weWV4ZWNkaXI9JFBZVEhPTl9FWEVDX1BSRUZJWC9saWIvcHl0aG9uJFBZVEhPTl9WRVJTSU9OL3NpdGUtcGFja2FnZXMKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworICAgICBlc2FjCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X3B5dGhvbl9weWV4ZWNkaXIiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9weXRob25fcHlleGVjZGlyIiA+JjY7IH0KKyAgcHlleGVjZGlyPSRhbV9jdl9weXRob25fcHlleGVjZGlyCisKKworCisgIHBrZ3B5ZXhlY2Rpcj1cJHtweWV4ZWNkaXJ9LyRQQUNLQUdFCisKKworCisgIGZpCisKKworCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXB5dGhvbjIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cHl0aG9uMjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUFlUSE9OMis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBZVEhPTjIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFlUSE9OMj0iJFBZVEhPTjIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1BZVEhPTjI9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQWVRIT04yPSRhY19jdl9wYXRoX1BZVEhPTjIKK2lmIHRlc3QgLW4gIiRQWVRIT04yIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBZVEhPTjIiID4mNQorJGFzX2VjaG8gIiRQWVRIT04yIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QWVRIT04yIjsgdGhlbgorICBhY19wdF9QWVRIT04yPSRQWVRIT04yCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHl0aG9uMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHl0aG9uMjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfUFlUSE9OMis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1BZVEhPTjIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfUFlUSE9OMj0iJGFjX3B0X1BZVEhPTjIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BZVEhPTjI9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9QWVRIT04yPSRhY19jdl9wYXRoX2FjX3B0X1BZVEhPTjIKK2lmIHRlc3QgLW4gIiRhY19wdF9QWVRIT04yIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BZVEhPTjIiID4mNQorJGFzX2VjaG8gIiRhY19wdF9QWVRIT04yIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfUFlUSE9OMiIgPSB4OyB0aGVuCisgICAgUFlUSE9OMj0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBZVEhPTjI9JGFjX3B0X1BZVEhPTjIKKyAgZmkKK2Vsc2UKKyAgUFlUSE9OMj0iJGFjX2N2X3BhdGhfUFlUSE9OMiIKK2ZpCisKKwl0ZXN0IC16ICIkUFlUSE9OMiIgJiYgYXNfZm5fZXJyb3IgJD8gInB5dGhvbjIgaXMgcmVxdWlyZWQgZm9yIC0tZW5hYmxlLXB5dGhvbjJfYmluZGluZ3MgYnV0IGNhbm5vdCBiZSBmb3VuZCIgIiRMSU5FTk8iIDUKKwlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1weXRob24yLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1weXRob24yLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfUFlUSE9OMl9DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQWVRIT04yX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QWVRIT04yX0NPTkZJRz0iJFBZVEhPTjJfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QWVRIT04yX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1BZVEhPTjJfQ09ORklHPSRhY19jdl9wYXRoX1BZVEhPTjJfQ09ORklHCitpZiB0ZXN0IC1uICIkUFlUSE9OMl9DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFlUSE9OMl9DT05GSUciID4mNQorJGFzX2VjaG8gIiRQWVRIT04yX0NPTkZJRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUFlUSE9OMl9DT05GSUciOyB0aGVuCisgIGFjX3B0X1BZVEhPTjJfQ09ORklHPSRQWVRIT04yX0NPTkZJRworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInB5dGhvbjItY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBweXRob24yLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfYWNfcHRfUFlUSE9OMl9DT05GSUcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9QWVRIT04yX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9QWVRIT04yX0NPTkZJRz0iJGFjX3B0X1BZVEhPTjJfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9QWVRIT04yX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X1BZVEhPTjJfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BZVEhPTjJfQ09ORklHCitpZiB0ZXN0IC1uICIkYWNfcHRfUFlUSE9OMl9DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfUFlUSE9OMl9DT05GSUciID4mNQorJGFzX2VjaG8gIiRhY19wdF9QWVRIT04yX0NPTkZJRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X1BZVEhPTjJfQ09ORklHIiA9IHg7IHRoZW4KKyAgICBQWVRIT04yX0NPTkZJRz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBZVEhPTjJfQ09ORklHPSRhY19wdF9QWVRIT04yX0NPTkZJRworICBmaQorZWxzZQorICBQWVRIT04yX0NPTkZJRz0iJGFjX2N2X3BhdGhfUFlUSE9OMl9DT05GSUciCitmaQorCisJdGVzdCAteiAiJFBZVEhPTjJfQ09ORklHIiAmJiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1weXRob24tY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXB5dGhvbi1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1BZVEhPTjJfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUFlUSE9OMl9DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFlUSE9OMl9DT05GSUc9IiRQWVRIT04yX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfUFlUSE9OMl9DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQWVRIT04yX0NPTkZJRz0kYWNfY3ZfcGF0aF9QWVRIT04yX0NPTkZJRworaWYgdGVzdCAtbiAiJFBZVEhPTjJfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBZVEhPTjJfQ09ORklHIiA+JjUKKyRhc19lY2hvICIkUFlUSE9OMl9DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1BZVEhPTjJfQ09ORklHIjsgdGhlbgorICBhY19wdF9QWVRIT04yX0NPTkZJRz0kUFlUSE9OMl9DT05GSUcKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJweXRob24tY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBweXRob24tY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9QWVRIT04yX0NPTkZJRys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1BZVEhPTjJfQ09ORklHIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X1BZVEhPTjJfQ09ORklHPSIkYWNfcHRfUFlUSE9OMl9DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BZVEhPTjJfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorYWNfcHRfUFlUSE9OMl9DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUFlUSE9OMl9DT05GSUcKK2lmIHRlc3QgLW4gIiRhY19wdF9QWVRIT04yX0NPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9QWVRIT04yX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJGFjX3B0X1BZVEhPTjJfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfUFlUSE9OMl9DT05GSUciID0geDsgdGhlbgorICAgIFBZVEhPTjJfQ09ORklHPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUFlUSE9OMl9DT05GSUc9JGFjX3B0X1BZVEhPTjJfQ09ORklHCisgIGZpCitlbHNlCisgIFBZVEhPTjJfQ09ORklHPSIkYWNfY3ZfcGF0aF9QWVRIT04yX0NPTkZJRyIKK2ZpCisKKwl0ZXN0IC16ICIkUFlUSE9OMl9DT05GSUciICYmIGFzX2ZuX2Vycm9yICQ/ICJweXRob24gaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIC0tZW5hYmxlLXB5dGhvbjJfYmluZGluZ3MgYnV0IGNhbm5vdCBiZSBmb3VuZCIgIiRMSU5FTk8iIDUKKwlQWVRIT04yX0lOQ0RJUlM9YCIkUFlUSE9OMl9DT05GSUciIC0taW5jbHVkZXNgCisJUFlUSE9OMl9MSUJESVJTPWAiJFBZVEhPTjJfQ09ORklHIiAtLWxpYnNgCisJUFlUSE9OMkRJUj0kcHl0aG9uZGlyCisJUFlUSE9OX0JJTkRJTkdTPXllcworZmkKKworaWYgdGVzdCAiJFBZVEhPTjNfQklORElOR1MiID0geWVzIC1vICIkQlVJTERfTFZNREJVU0QiID0geWVzOyB0aGVuCisJdW5zZXQgUFlUSE9OIFBZVEhPTl9DT05GSUcKKwl1bnNldCBhbV9jdl9wYXRobGVzc19QWVRIT04gYWNfY3ZfcGF0aF9QWVRIT04gYW1fY3ZfcHl0aG9uX3BsYXRmb3JtCisJdW5zZXQgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpciBhbV9jdl9weXRob25fdmVyc2lvbiBhbV9jdl9weXRob25fcHlleGVjZGlyCisJdW5zZXQgYWNfY3ZfcGF0aF9QWVRIT05fQ09ORklHIGFjX2N2X3BhdGhfYWNfcHRfUFlUSE9OX0NPTkZJRworCisKKworCisKKworICAgICAgICBpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgorICAgICAgIyBJZiB0aGUgdXNlciBzZXQgJFBZVEhPTiwgdXNlIGl0IGFuZCBkb24ndCBzZWFyY2ggc29tZXRoaW5nIGVsc2UuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJFBZVEhPTiB2ZXJzaW9uIGlzID49IDMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkUFlUSE9OIHZlcnNpb24gaXMgPj0gMy4uLiAiID4mNjsgfQorICAgICAgcHJvZz0iaW1wb3J0IHN5cworIyBzcGxpdCBzdHJpbmdzIGJ5ICcuJyBhbmQgY29udmVydCB0byBudW1lcmljLiAgQXBwZW5kIHNvbWUgemVyb3MKKyMgYmVjYXVzZSB3ZSBuZWVkIGF0IGxlYXN0IDQgZGlnaXRzIGZvciB0aGUgaGV4IGNvbnZlcnNpb24uCisjIG1hcCByZXR1cm5zIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLjAgYW5kIGEgbGlzdCBpbiAyLngKK21pbnZlciA9IGxpc3QobWFwKGludCwgJzMnLnNwbGl0KCcuJykpKSArIFswLCAwLCAwXQorbWludmVyaGV4ID0gMAorIyB4cmFuZ2UgaXMgbm90IHByZXNlbnQgaW4gUHl0aG9uIDMuMCBhbmQgcmFuZ2UgcmV0dXJucyBhbiBpdGVyYXRvcgorZm9yIGkgaW4gbGlzdChyYW5nZSgwLCA0KSk6IG1pbnZlcmhleCA9IChtaW52ZXJoZXggPDwgOCkgKyBtaW52ZXJbaV0KK3N5cy5leGl0KHN5cy5oZXh2ZXJzaW9uIDwgbWludmVyaGV4KSIKKyAgaWYgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJFBZVEhPTiAtYyAiJHByb2ciIiA+JjUKKyAgICgkUFlUSE9OIC1jICIkcHJvZyIpID4mNSAyPiY1CisgICBhY19zdGF0dXM9JD8KKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCQkgICAgICAgYXNfZm5fZXJyb3IgJD8gIlB5dGhvbiBpbnRlcnByZXRlciBpcyB0b28gb2xkIiAiJExJTkVOTyIgNQorZmkKKyAgICAgIGFtX2Rpc3BsYXlfUFlUSE9OPSRQWVRIT04KKyAgICBlbHNlCisgICAgICAjIE90aGVyd2lzZSwgdHJ5IGVhY2ggaW50ZXJwcmV0ZXIgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzYXRpc2ZpZXMKKyAgICAgICMgVkVSU0lPTi4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgUHl0aG9uIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIFB5dGhvbiBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gPj0gMy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9wYXRobGVzc19QWVRIT04rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJZm9yIGFtX2N2X3BhdGhsZXNzX1BZVEhPTiBpbiBweXRob24gcHl0aG9uMiBweXRob24zIHB5dGhvbjMuMyBweXRob24zLjIgcHl0aG9uMy4xIHB5dGhvbjMuMCBweXRob24yLjcgIHB5dGhvbjIuNiBweXRob24yLjUgcHl0aG9uMi40IHB5dGhvbjIuMyBweXRob24yLjIgcHl0aG9uMi4xIHB5dGhvbjIuMCBub25lOyBkbworCSAgdGVzdCAiJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPSBub25lICYmIGJyZWFrCisJICBwcm9nPSJpbXBvcnQgc3lzCisjIHNwbGl0IHN0cmluZ3MgYnkgJy4nIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMuICBBcHBlbmQgc29tZSB6ZXJvcworIyBiZWNhdXNlIHdlIG5lZWQgYXQgbGVhc3QgNCBkaWdpdHMgZm9yIHRoZSBoZXggY29udmVyc2lvbi4KKyMgbWFwIHJldHVybnMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMuMCBhbmQgYSBsaXN0IGluIDIueAorbWludmVyID0gbGlzdChtYXAoaW50LCAnMycuc3BsaXQoJy4nKSkpICsgWzAsIDAsIDBdCittaW52ZXJoZXggPSAwCisjIHhyYW5nZSBpcyBub3QgcHJlc2VudCBpbiBQeXRob24gMy4wIGFuZCByYW5nZSByZXR1cm5zIGFuIGl0ZXJhdG9yCitmb3IgaSBpbiBsaXN0KHJhbmdlKDAsIDQpKTogbWludmVyaGV4ID0gKG1pbnZlcmhleCA8PCA4KSArIG1pbnZlcltpXQorc3lzLmV4aXQoc3lzLmhleHZlcnNpb24gPCBtaW52ZXJoZXgpIgorICBpZiB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIC1jICIkcHJvZyIiID4mNQorICAgKCRhbV9jdl9wYXRobGVzc19QWVRIT04gLWMgIiRwcm9nIikgPiY1IDI+JjUKKyAgIGFjX3N0YXR1cz0kPworICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4gOgorICBicmVhaworZmkKKwlkb25lCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9wYXRobGVzc19QWVRIT04iID4mNQorJGFzX2VjaG8gIiRhbV9jdl9wYXRobGVzc19QWVRIT04iID4mNjsgfQorICAgICAgIyBTZXQgJFBZVEhPTiB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiAkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OLgorICAgICAgaWYgdGVzdCAiJGFtX2N2X3BhdGhsZXNzX1BZVEhPTiIgPSBub25lOyB0aGVuCisJUFlUSE9OPToKKyAgICAgIGVsc2UKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYW1fY3ZfcGF0aGxlc3NfUFlUSE9OOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QWVRIT04rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQWVRIT04gaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFlUSE9OPSIkUFlUSE9OIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QWVRIT049IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQWVRIT049JGFjX2N2X3BhdGhfUFlUSE9OCitpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBZVEhPTiIgPiY1CiskYXNfZWNobyAiJFBZVEhPTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgICBmaQorICAgICAgYW1fZGlzcGxheV9QWVRIT049JGFtX2N2X3BhdGhsZXNzX1BZVEhPTgorICAgIGZpCisKKworICBpZiB0ZXN0ICIkUFlUSE9OIiA9IDo7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBzdWl0YWJsZSBQeXRob24gaW50ZXJwcmV0ZXIgZm91bmQiICIkTElORU5PIiA1CisgIGVsc2UKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhbV9kaXNwbGF5X1BZVEhPTiB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gdmVyc2lvbi4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9weXRob25fdmVyc2lvbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFtX2N2X3B5dGhvbl92ZXJzaW9uPWAkUFlUSE9OIC1jICJpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKHN5cy52ZXJzaW9uWzozXSkiYAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfcHl0aG9uX3ZlcnNpb24iID4mNQorJGFzX2VjaG8gIiRhbV9jdl9weXRob25fdmVyc2lvbiIgPiY2OyB9CisgIFBZVEhPTl9WRVJTSU9OPSRhbV9jdl9weXRob25fdmVyc2lvbgorCisKKworICBQWVRIT05fUFJFRklYPScke3ByZWZpeH0nCisKKyAgUFlUSE9OX0VYRUNfUFJFRklYPScke2V4ZWNfcHJlZml4fScKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHBsYXRmb3JtIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gcGxhdGZvcm0uLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfcHl0aG9uX3BsYXRmb3JtKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYW1fY3ZfcHl0aG9uX3BsYXRmb3JtPWAkUFlUSE9OIC1jICJpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKHN5cy5wbGF0Zm9ybSkiYAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfcHl0aG9uX3BsYXRmb3JtIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfcHl0aG9uX3BsYXRmb3JtIiA+JjY7IH0KKyAgUFlUSE9OX1BMQVRGT1JNPSRhbV9jdl9weXRob25fcGxhdGZvcm0KKworCisgICMgSnVzdCBmYWN0b3Igb3V0IHNvbWUgY29kZSBkdXBsaWNhdGlvbi4KKyAgYW1fcHl0aG9uX3NldHVwX3N5c2NvbmZpZz0iXAoraW1wb3J0IHN5cworIyBQcmVmZXIgc3lzY29uZmlnIG92ZXIgZGlzdHV0aWxzLnN5c2NvbmZpZywgZm9yIGJldHRlciBjb21wYXRpYmlsaXR5CisjIHdpdGggcHl0aG9uIDMueC4gIFNlZSBhdXRvbWFrZSBidWcjMTAyMjcuCit0cnk6CisgICAgaW1wb3J0IHN5c2NvbmZpZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNhbl91c2Vfc3lzY29uZmlnID0gMAorZWxzZToKKyAgICBjYW5fdXNlX3N5c2NvbmZpZyA9IDEKKyMgQ2FuJ3QgdXNlIHN5c2NvbmZpZyBpbiBDUHl0aG9uIDIuNywgc2luY2UgaXQncyBicm9rZW4gaW4gdmlydHVhbGVudnM6CisjIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS92aXJ0dWFsZW52L2lzc3Vlcy8xMTg+Cit0cnk6CisgICAgZnJvbSBwbGF0Zm9ybSBpbXBvcnQgcHl0aG9uX2ltcGxlbWVudGF0aW9uCisgICAgaWYgcHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gJ0NQeXRob24nIGFuZCBzeXMudmVyc2lvbls6M10gPT0gJzIuNyc6CisgICAgICAgIGNhbl91c2Vfc3lzY29uZmlnID0gMAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MiCisKKworICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIHNjcmlwdCBkaXJlY3RvcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhbV9kaXNwbGF5X1BZVEhPTiBzY3JpcHQgZGlyZWN0b3J5Li4uICIgPiY2OyB9CitpZiAke2FtX2N2X3B5dGhvbl9weXRob25kaXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORQorICAgICB0aGVuCisgICAgICAgYW1fcHlfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorICAgICBlbHNlCisgICAgICAgYW1fcHlfcHJlZml4PSRwcmVmaXgKKyAgICAgZmkKKyAgICAgYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcj1gJFBZVEhPTiAtYyAiCiskYW1fcHl0aG9uX3NldHVwX3N5c2NvbmZpZworaWYgY2FuX3VzZV9zeXNjb25maWc6CisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcGF0aCgncHVyZWxpYicsIHZhcnM9eydiYXNlJzonJGFtX3B5X3ByZWZpeCd9KQorZWxzZToKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigwLCAwLCBwcmVmaXg9JyRhbV9weV9wcmVmaXgnKQorc3lzLnN0ZG91dC53cml0ZShzaXRlZGlyKSJgCisgICAgIGNhc2UgJGFtX2N2X3B5dGhvbl9weXRob25kaXIgaW4KKyAgICAgJGFtX3B5X3ByZWZpeCopCisgICAgICAgYW1fX3N0cmlwX3ByZWZpeD1gZWNobyAiJGFtX3B5X3ByZWZpeCIgfCBzZWQgJ3N8LnwufGcnYAorICAgICAgIGFtX2N2X3B5dGhvbl9weXRob25kaXI9YGVjaG8gIiRhbV9jdl9weXRob25fcHl0aG9uZGlyIiB8IHNlZCAicyxeJGFtX19zdHJpcF9wcmVmaXgsJFBZVEhPTl9QUkVGSVgsImAKKyAgICAgICA7OworICAgICAqKQorICAgICAgIGNhc2UgJGFtX3B5X3ByZWZpeCBpbgorICAgICAgICAgL3VzcnwvU3lzdGVtKikgOzsKKyAgICAgICAgICopCisJICBhbV9jdl9weXRob25fcHl0aG9uZGlyPSRQWVRIT05fUFJFRklYL2xpYi9weXRob24kUFlUSE9OX1ZFUlNJT04vc2l0ZS1wYWNrYWdlcworCSAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9weXRob25fcHl0aG9uZGlyIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfcHl0aG9uX3B5dGhvbmRpciIgPiY2OyB9CisgIHB5dGhvbmRpcj0kYW1fY3ZfcHl0aG9uX3B5dGhvbmRpcgorCisKKworICBwa2dweXRob25kaXI9XCR7cHl0aG9uZGlyfS8kUEFDS0FHRQorCisKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFtX2Rpc3BsYXlfUFlUSE9OIGV4dGVuc2lvbiBtb2R1bGUgZGlyZWN0b3J5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYW1fZGlzcGxheV9QWVRIT04gZXh0ZW5zaW9uIG1vZHVsZSBkaXJlY3RvcnkuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfcHl0aG9uX3B5ZXhlY2Rpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUKKyAgICAgdGhlbgorICAgICAgIGFtX3B5X2V4ZWNfcHJlZml4PSRhbV9weV9wcmVmaXgKKyAgICAgZWxzZQorICAgICAgIGFtX3B5X2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeAorICAgICBmaQorICAgICBhbV9jdl9weXRob25fcHlleGVjZGlyPWAkUFlUSE9OIC1jICIKKyRhbV9weXRob25fc2V0dXBfc3lzY29uZmlnCitpZiBjYW5fdXNlX3N5c2NvbmZpZzoKKyAgICBzaXRlZGlyID0gc3lzY29uZmlnLmdldF9wYXRoKCdwbGF0bGliJywgdmFycz17J3BsYXRiYXNlJzonJGFtX3B5X3ByZWZpeCd9KQorZWxzZToKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgc2l0ZWRpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigxLCAwLCBwcmVmaXg9JyRhbV9weV9wcmVmaXgnKQorc3lzLnN0ZG91dC53cml0ZShzaXRlZGlyKSJgCisgICAgIGNhc2UgJGFtX2N2X3B5dGhvbl9weWV4ZWNkaXIgaW4KKyAgICAgJGFtX3B5X2V4ZWNfcHJlZml4KikKKyAgICAgICBhbV9fc3RyaXBfcHJlZml4PWBlY2hvICIkYW1fcHlfZXhlY19wcmVmaXgiIHwgc2VkICdzfC58LnxnJ2AKKyAgICAgICBhbV9jdl9weXRob25fcHlleGVjZGlyPWBlY2hvICIkYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpciIgfCBzZWQgInMsXiRhbV9fc3RyaXBfcHJlZml4LCRQWVRIT05fRVhFQ19QUkVGSVgsImAKKyAgICAgICA7OworICAgICAqKQorICAgICAgIGNhc2UgJGFtX3B5X2V4ZWNfcHJlZml4IGluCisgICAgICAgICAvdXNyfC9TeXN0ZW0qKSA7OworICAgICAgICAgKikKKwkgICBhbV9jdl9weXRob25fcHlleGVjZGlyPSRQWVRIT05fRVhFQ19QUkVGSVgvbGliL3B5dGhvbiRQWVRIT05fVkVSU0lPTi9zaXRlLXBhY2thZ2VzCisJICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9weXRob25fcHlleGVjZGlyIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpciIgPiY2OyB9CisgIHB5ZXhlY2Rpcj0kYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpcgorCisKKworICBwa2dweWV4ZWNkaXI9XCR7cHlleGVjZGlyfS8kUEFDS0FHRQorCisKKworICBmaQorCisKKwlQWVRIT04zPSRQWVRIT04KKwl0ZXN0IC16ICIkUFlUSE9OMyIgJiYgYXNfZm5fZXJyb3IgJD8gInB5dGhvbjMgaXMgcmVxdWlyZWQgZm9yIC0tZW5hYmxlLXB5dGhvbjNfYmluZGluZ3Mgb3IgLS1lbmFibGUtZGJ1cy1zZXJ2aWNlIGJ1dCBjYW5ub3QgYmUgZm91bmQiICIkTElORU5PIiA1CisJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cHl0aG9uMy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cHl0aG9uMy1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1BZVEhPTjNfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUFlUSE9OM19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUFlUSE9OM19DT05GSUc9IiRQWVRIT04zX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfUFlUSE9OM19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQWVRIT04zX0NPTkZJRz0kYWNfY3ZfcGF0aF9QWVRIT04zX0NPTkZJRworaWYgdGVzdCAtbiAiJFBZVEhPTjNfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBZVEhPTjNfQ09ORklHIiA+JjUKKyRhc19lY2hvICIkUFlUSE9OM19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1BZVEhPTjNfQ09ORklHIjsgdGhlbgorICBhY19wdF9QWVRIT04zX0NPTkZJRz0kUFlUSE9OM19DT05GSUcKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJweXRob24zLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcHl0aG9uMy1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X1BZVEhPTjNfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfUFlUSE9OM19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfUFlUSE9OM19DT05GSUc9IiRhY19wdF9QWVRIT04zX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfUFlUSE9OM19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9QWVRIT04zX0NPTkZJRz0kYWNfY3ZfcGF0aF9hY19wdF9QWVRIT04zX0NPTkZJRworaWYgdGVzdCAtbiAiJGFjX3B0X1BZVEhPTjNfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BZVEhPTjNfQ09ORklHIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfUFlUSE9OM19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9QWVRIT04zX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUFlUSE9OM19DT05GSUc9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBQWVRIT04zX0NPTkZJRz0kYWNfcHRfUFlUSE9OM19DT05GSUcKKyAgZmkKK2Vsc2UKKyAgUFlUSE9OM19DT05GSUc9IiRhY19jdl9wYXRoX1BZVEhPTjNfQ09ORklHIgorZmkKKworCXRlc3QgLXogIiRQWVRIT04zX0NPTkZJRyIgJiYgYXNfZm5fZXJyb3IgJD8gInB5dGhvbjMgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIC0tZW5hYmxlLXB5dGhvbjNfYmluZGluZ3Mgb3IgLS1lbmFibGUtZGJ1cy1zZXJ2aWNlIGJ1dCBjYW5ub3QgYmUgZm91bmQiICIkTElORU5PIiA1CisJUFlUSE9OM19JTkNESVJTPWAiJFBZVEhPTjNfQ09ORklHIiAtLWluY2x1ZGVzYAorCVBZVEhPTjNfTElCRElSUz1gIiRQWVRIT04zX0NPTkZJRyIgLS1saWJzYAorCVBZVEhPTjNESVI9JHB5dGhvbmRpcgorCVBZVEhPTl9CSU5ESU5HUz15ZXMKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9MVk1EQlVTRCIgPSB5ZXM7IHRoZW4KKwkjIFRvIGdldCB0aGlzIG1hY3JvLCBpbnN0YWxsIGF1dG9jb25mLWFyY2hpdmUgcGFja2FnZSB0aGVuIHJ1biBhdXRvcmVjb25mCisKKyAgICBpZiB0ZXN0IC16ICRQWVRIT047CisgICAgdGhlbgorICAgICAgICBpZiB0ZXN0IC16ICJweXRob24zIjsKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgUFlUSE9OPSJweXRob24zIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBQWVRIT049InB5dGhvbjMiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBQWVRIT05fTkFNRT1gYmFzZW5hbWUgJFBZVEhPTmAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICRQWVRIT05fTkFNRSBtb2R1bGU6IHB5dWRldiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkUFlUSE9OX05BTUUgbW9kdWxlOiBweXVkZXYuLi4gIiA+JjY7IH0KKyAgICAkUFlUSE9OIC1jICJpbXBvcnQgcHl1ZGV2IiAyPi9kZXYvbnVsbAorICAgIGlmIHRlc3QgJD8gLWVxIDA7CisgICAgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgICBldmFsIEhBVkVfUFlNT0RfUFlVREVWPXllcworICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgIGV2YWwgSEFWRV9QWU1PRF9QWVVERVY9bm8KKyAgICAgICAgIworICAgICAgICBpZiB0ZXN0IC1uICJSZXF1aXJlZCIKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gImZhaWxlZCB0byBmaW5kIHJlcXVpcmVkIG1vZHVsZSBweXVkZXYiICIkTElORU5PIiA1CisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorCisKKyAgICBpZiB0ZXN0IC16ICRQWVRIT047CisgICAgdGhlbgorICAgICAgICBpZiB0ZXN0IC16ICJweXRob24zIjsKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgUFlUSE9OPSJweXRob24zIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBQWVRIT049InB5dGhvbjMiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBQWVRIT05fTkFNRT1gYmFzZW5hbWUgJFBZVEhPTmAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICRQWVRIT05fTkFNRSBtb2R1bGU6IGRidXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJFBZVEhPTl9OQU1FIG1vZHVsZTogZGJ1cy4uLiAiID4mNjsgfQorICAgICRQWVRIT04gLWMgImltcG9ydCBkYnVzIiAyPi9kZXYvbnVsbAorICAgIGlmIHRlc3QgJD8gLWVxIDA7CisgICAgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgICAgICBldmFsIEhBVkVfUFlNT0RfREJVUz15ZXMKKyAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICBldmFsIEhBVkVfUFlNT0RfREJVUz1ubworICAgICAgICAjCisgICAgICAgIGlmIHRlc3QgLW4gIlJlcXVpcmVkIgorICAgICAgICB0aGVuCisgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGZpbmQgcmVxdWlyZWQgbW9kdWxlIGRidXMiICIkTElORU5PIiA1CisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorCitmaQorCitpZiB0ZXN0ICIkUFlUSE9OX0JJTkRJTkdTIiA9IHllcyAtbyAiJFBZVEhPTjJfQklORElOR1MiID0geWVzIC1vICIkUFlUSE9OM19CSU5ESU5HUyIgPSB5ZXM7IHRoZW4KKwl0ZXN0ICIkQVBQTElCIiAhPSB5ZXMgJiYgYXNfZm5fZXJyb3IgJD8gIlB5dGhvbl9iaW5kaW5ncyByZXF1aXJlIC0tZW5hYmxlLWFwcGxpYiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGtnY29uZmlnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3BrZ2NvbmZpZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3BrZ2NvbmZpZzsgUEtHQ09ORklHPSRlbmFibGV2YWwKK2Vsc2UKKyAgUEtHQ09ORklHPW5vCitmaQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtd3JpdGVfaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV93cml0ZV9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfd3JpdGVfaW5zdGFsbDsgV1JJVEVfSU5TVEFMTD0kZW5hYmxldmFsCitlbHNlCisgIFdSSVRFX0lOU1RBTEw9bm8KK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBpbnN0YWxsIGZzYWRtIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBmc2FkbS4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZzYWRtIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZzYWRtK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZnNhZG07IEZTQURNPSRlbmFibGV2YWwKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRlNBRE0iID4mNQorJGFzX2VjaG8gIiRGU0FETSIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBibGtkZWFjdGl2YXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBibGtkZWFjdGl2YXRlLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYmxrZGVhY3RpdmF0ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ibGtkZWFjdGl2YXRlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfYmxrZGVhY3RpdmF0ZTsgQkxLREVBQ1RJVkFURT0kZW5hYmxldmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJMS0RFQUNUSVZBVEUiID4mNQorJGFzX2VjaG8gIiRCTEtERUFDVElWQVRFIiA+JjY7IH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byB1c2UgZG1ldmVudGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byB1c2UgZG1ldmVudGQuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kbWV2ZW50ZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kbWV2ZW50ZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RtZXZlbnRkOyBETUVWRU5URD0kZW5hYmxldmFsCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERNRVZFTlREIiA+JjUKKyRhc19lY2hvICIkRE1FVkVOVEQiID4mNjsgfQorCitCVUlMRF9ETUVWRU5URD0kRE1FVkVOVEQKKworaWYgdGVzdCAiJERNRVZFTlREIiA9IHllczsgdGhlbgorICAgaWYgdGVzdCAiJE1JUlJPUlMiICE9IGludGVybmFsOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiLS1lbmFibGUtZG1ldmVudGQgY3VycmVudGx5IHJlcXVpcmVzIC0td2l0aC1taXJyb3JzPWludGVybmFsIiAiJExJTkVOTyIgNQorICAgZmkKKyAgIGlmIHRlc3QgIiRDTURMSUIiID0gbm87IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICItLWVuYWJsZS1kbWV2ZW50ZCByZXF1aXJlcyAtLWVuYWJsZS1jbWRsaWIgdG8gYmUgdXNlZCBhcyB3ZWxsIiAiJExJTkVOTyIgNQorICAgZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBETUVWRU5URCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0bGluZSBpbiAtbGMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGxpbmUgaW4gLWxjLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9jX2dldGxpbmUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGxpbmUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRsaW5lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9jX2dldGxpbmU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jX2dldGxpbmU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NfZ2V0bGluZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9jX2dldGxpbmUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY19nZXRsaW5lIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0dFVExJTkUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBpbiAtbGMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgaW4gLWxjLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9jX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjYW5vbmljYWxpemVfZmlsZV9uYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9jX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9jX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NfY2Fub25pY2FsaXplX2ZpbGVfbmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9jX2Nhbm9uaWNhbGl6ZV9maWxlX25hbWUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY19jYW5vbmljYWxpemVfZmlsZV9uYW1lIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0NBTk9OSUNBTElaRV9GSUxFX05BTUUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Rlc3QgIiRleGVjX3ByZWZpeCIgPSBOT05FIC1hICIkcHJlZml4IiA9IE5PTkUgJiYgZXhlY19wcmVmaXg9IiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQkRMIDEiID4+Y29uZmRlZnMuaAorCisJICAgICAgRExfTElCUz0iLWxkbCIKKwkgICAgICBIQVZFX0xJQkRMPXllcworZWxzZQorICBETF9MSUJTPQorCSAgICAgIEhBVkVfTElCREw9bm8KK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIFsgXCggIiRMVk0xIiA9IHNoYXJlZCAtbyAiJFBPT0wiID0gc2hhcmVkIC1vICIkQ0xVU1RFUiIgPSBzaGFyZWQgXAorICAgICAgLW8gIiRTTkFQU0hPVFMiID0gc2hhcmVkIC1vICIkTUlSUk9SUyIgPSBzaGFyZWQgXAorICAgICAgLW8gIiRSQUlEIiA9IHNoYXJlZCAtbyAiJENBQ0hFIiA9IHNoYXJlZCBcCisgICAgICBcKSAtYSAiJFNUQVRJQ19MSU5LIiA9IHllcyBdOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIkZlYXR1cmVzIGNhbm5vdCBiZSAnc2hhcmVkJyB3aGVuIGJ1aWxkaW5nIHN0YXRpY2FsbHkiICIkTElORU5PIiA1CitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbG9nMTAgaW4gLWxtIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsb2cxMCBpbiAtbG0uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX21fbG9nMTArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG0gICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGxvZzEwICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbG9nMTAgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX21fbG9nMTA9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9tX2xvZzEwPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9tX2xvZzEwIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX21fbG9nMTAiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbV9sb2cxMCIgPSB4eWVzOyB0aGVuIDoKKyAgTV9MSUJTPSItbG0iCitlbHNlCisgIGhhcmRfYmFpbG91dAorZmkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIGluIC1scHRocmVhZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIGluIC1scHRocmVhZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2srOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHB0aHJlYWQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHB0aHJlYWRfbXV0ZXhfbG9jayAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2s9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2xvY2siID0geHllczsgdGhlbiA6CisgIFBUSFJFQURfTElCUz0iLWxwdGhyZWFkIgorZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgc2VsaW51eCBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHNlbGludXggc3VwcG9ydC4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNlbGludXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2VsaW51eCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3NlbGludXg7IFNFTElOVVg9JGVuYWJsZXZhbAorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTRUxJTlVYIiA+JjUKKyRhc19lY2hvICIkU0VMSU5VWCIgPiY2OyB9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiB0ZXN0ICIkU0VMSU5VWCIgPSB5ZXM7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzZXBvbF9jaGVja19jb250ZXh0IGluIC1sc2Vwb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNlcG9sX2NoZWNrX2NvbnRleHQgaW4gLWxzZXBvbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfc2Vwb2xfc2Vwb2xfY2hlY2tfY29udGV4dCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc2Vwb2wgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNlcG9sX2NoZWNrX2NvbnRleHQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBzZXBvbF9jaGVja19jb250ZXh0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zZXBvbF9zZXBvbF9jaGVja19jb250ZXh0PXllcworZWxzZQorICBhY19jdl9saWJfc2Vwb2xfc2Vwb2xfY2hlY2tfY29udGV4dD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc2Vwb2xfc2Vwb2xfY2hlY2tfY29udGV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zZXBvbF9zZXBvbF9jaGVja19jb250ZXh0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3NlcG9sX3NlcG9sX2NoZWNrX2NvbnRleHQiID0geHllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRVBPTCAxIiA+PmNvbmZkZWZzLmgKKworCQlTRUxJTlVYX0xJQlM9Ii1sc2Vwb2wiCitmaQorCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpc19zZWxpbnV4X2VuYWJsZWQgaW4gLWxzZWxpbnV4IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpc19zZWxpbnV4X2VuYWJsZWQgaW4gLWxzZWxpbnV4Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc2VsaW51eCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgaXNfc2VsaW51eF9lbmFibGVkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaXNfc2VsaW51eF9lbmFibGVkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NlbGludXhfaXNfc2VsaW51eF9lbmFibGVkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPSB4eWVzOyB0aGVuIDoKKworCQlmb3IgYWNfaGVhZGVyIGluIHNlbGludXgvc2VsaW51eC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzZWxpbnV4L3NlbGludXguaCIgImFjX2N2X2hlYWRlcl9zZWxpbnV4X3NlbGludXhfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc2VsaW51eF9zZWxpbnV4X2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TRUxJTlVYX1NFTElOVVhfSCAxCitfQUNFT0YKKworZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCisKK2RvbmUKKworCQlmb3IgYWNfaGVhZGVyIGluIHNlbGludXgvbGFiZWwuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic2VsaW51eC9sYWJlbC5oIiAiYWNfY3ZfaGVhZGVyX3NlbGludXhfbGFiZWxfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc2VsaW51eF9sYWJlbF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU0VMSU5VWF9MQUJFTF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRUxJTlVYIDEiID4+Y29uZmRlZnMuaAorCisJCVNFTElOVVhfTElCUz0iLWxzZWxpbnV4ICRTRUxJTlVYX0xJQlMiCisJCVNFTElOVVhfUEM9ImxpYnNlbGludXgiCisJCUhBVkVfU0VMSU5VWD15ZXMKK2Vsc2UKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IERpc2FibGluZyBzZWxpbnV4IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IERpc2FibGluZyBzZWxpbnV4IiA+JjI7fQorCQlTRUxJTlVYX0xJQlM9CisJCVNFTElOVVhfUEM9CisJCUhBVkVfU0VMSU5VWD1ubworZmkKKworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRSRUFMVElNRSIgPSB5ZXM7IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbG9ja19nZXR0aW1lIGluIC1scnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNsb2NrX2dldHRpbWUgaW4gLWxydC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scnQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGNsb2NrX2dldHRpbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjbG9ja19nZXR0aW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0aW1lPXllcworZWxzZQorICBhY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0aW1lIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWUiID0geHllczsgdGhlbiA6CisgIEhBVkVfUkVBTFRJTUU9eWVzCitlbHNlCisgIEhBVkVfUkVBTFRJTUU9bm8KK2ZpCisKKworCWlmIHRlc3QgIiRIQVZFX1JFQUxUSU1FIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1JFQUxUSU1FIDEiID4+Y29uZmRlZnMuaAorCisJCUxJQlM9Ii1scnQgJExJQlMiCisJCVJUX0xJQj0iLWxydCIKKwllbHNlCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogRGlzYWJsaW5nIHJlYWx0aW1lIGNsb2NrIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IERpc2FibGluZyByZWFsdGltZSBjbG9jayIgPiYyO30KKwlmaQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQgaGFzIHN0X2N0aW0uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdCBoYXMgc3RfY3RpbS4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc3RhdF9zdF9jdGltKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Citsb25nIGJhcih2b2lkKSB7IHN0cnVjdCBzdGF0IHM7IHJldHVybiAobG9uZykocy5zdF9jdGltLnR2X3NlYyArIHMuc3RfY3RpbS50dl9uc2VjKTt9CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3RhdF9zdF9jdGltPXllcworZWxzZQorICBhY19jdl9zdGF0X3N0X2N0aW09bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N0YXRfc3RfY3RpbSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N0YXRfc3RfY3RpbSIgPiY2OyB9CisKK2lmIHRlc3QgJGFjX2N2X3N0YXRfc3RfY3RpbSA9IHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RBVF9TVF9DVElNIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZm9yIGFjX2hlYWRlciBpbiBnZXRvcHQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZ2V0b3B0LmgiICJhY19jdl9oZWFkZXJfZ2V0b3B0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2dldG9wdF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfR0VUT1BUX0ggMQorX0FDRU9GCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfR0VUT1BUTE9ORyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZG9uZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiB0ZXN0ICIkUkVBRExJTkUiICE9IG5vOyB0aGVuCisJbHZtX3NhdmVkX2xpYnM9JExJQlMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgdGdldGVudCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHRnZXRlbnQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2VhcmNoX3RnZXRlbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciB0Z2V0ZW50ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gdGdldGVudCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyB0aW5mbyBuY3Vyc2VzIGN1cnNlcyB0ZXJtY2FwIHRlcm1saWI7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfdGdldGVudD0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3RnZXRlbnQrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX3RnZXRlbnQrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF90Z2V0ZW50PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfdGdldGVudCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF90Z2V0ZW50IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3RnZXRlbnQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAgUkVBRExJTkVfTElCUz0kYWNfY3Zfc2VhcmNoX3RnZXRlbnQKK2Vsc2UKKworCQlpZiB0ZXN0ICIkUkVBRExJTkUiID0geWVzOyB0aGVuCisJCQlhc19mbl9lcnJvciAkPyAidGVybWNhcCBjb3VsZCBub3QgYmUgZm91bmQgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZQorLS1lbmFibGUtcmVhZGxpbmUgb3B0aW9uICh3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQpLiAgRWl0aGVyIGRpc2FibGUgcmVhZGxpbmUKK3N1cHBvcnQgd2l0aCAtLWRpc2FibGUtcmVhZGxpbmUgb3IgZG93bmxvYWQgYW5kIGluc3RhbGwgdGVybWNhcCBmcm9tOgorCWZ0cC5nbnUub3JnL2dudS90ZXJtY2FwCitOb3RlOiBpZiB5b3UgYXJlIHVzaW5nIHByZWNvbXBpbGVkIHBhY2thZ2VzIHlvdSB3aWxsIGFsc28gbmVlZCB0aGUgZGV2ZWxvcG1lbnQKKyAgcGFja2FnZSBhcyB3ZWxsICh3aGljaCBtYXkgYmUgY2FsbGVkIHRlcm1jYXAtZGV2ZWwgb3Igc29tZXRoaW5nIHNpbWlsYXIpLgorTm90ZTogKG4pY3Vyc2VzIGFsc28gc2VlbXMgdG8gd29yayBhcyBhIHN1YnN0aXR1dGUgZm9yIHRlcm1jYXAuICBUaGlzIHdhcworICBub3QgZm91bmQgZWl0aGVyIC0gYnV0IHlvdSBjb3VsZCB0cnkgaW5zdGFsbGluZyB0aGF0IGFzIHdlbGwuIiAiJExJTkVOTyIgNQorCQlmaQorZmkKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZWFkbGluZSBpbiAtbHJlYWRsaW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciByZWFkbGluZSBpbiAtbHJlYWRsaW5lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9yZWFkbGluZV9yZWFkbGluZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scmVhZGxpbmUgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHJlYWRsaW5lICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcmVhZGxpbmUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lPXllcworZWxzZQorICBhY19jdl9saWJfcmVhZGxpbmVfcmVhZGxpbmU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lIiA9IHh5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIFJFQURMSU5FX1NVUFBPUlQgMSIgPj5jb25mZGVmcy5oCisKKwkJCQlMSUJTPSRsdm1fc2F2ZWRfbGlicworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBybF9saW5lX2J1ZmZlciBpbiAtbHJlYWRsaW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBybF9saW5lX2J1ZmZlciBpbiAtbHJlYWRsaW5lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9yZWFkbGluZV9ybF9saW5lX2J1ZmZlcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1scmVhZGxpbmUgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHJsX2xpbmVfYnVmZmVyICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcmxfbGluZV9idWZmZXIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2xpbmVfYnVmZmVyPXllcworZWxzZQorICBhY19jdl9saWJfcmVhZGxpbmVfcmxfbGluZV9idWZmZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2xpbmVfYnVmZmVyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2xpbmVfYnVmZmVyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2xpbmVfYnVmZmVyIiA9IHh5ZXM7IHRoZW4gOgorICAgUkVBRExJTkVfTElCUz0iLWxyZWFkbGluZSIKK2Vsc2UKKworCQkJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbGlua2luZyAtbHJlYWRsaW5lIHdpdGggJFJFQURMSU5FX0xJQlMgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJsaW5raW5nIC1scmVhZGxpbmUgd2l0aCAkUkVBRExJTkVfTElCUyBuZWVkZWQiID4mNjsgfQorCQkJICBSRUFETElORV9MSUJTPSItbHJlYWRsaW5lICRSRUFETElORV9MSUJTIgorCitmaQorCitlbHNlCisKKwkJUkVBRExJTkVfTElCUz0KKwkJaWYgdGVzdCAiJFJFQURMSU5FIiA9IHllczsgdGhlbgorCQkJYXNfZm5fZXJyb3IgJD8gIkdOVSBSZWFkbGluZSBjb3VsZCBub3QgYmUgZm91bmQgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZQorLS1lbmFibGUtcmVhZGxpbmUgb3B0aW9uICh3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQpLiAgRWl0aGVyIGRpc2FibGUgcmVhZGxpbmUKK3N1cHBvcnQgd2l0aCAtLWRpc2FibGUtcmVhZGxpbmUgb3IgZG93bmxvYWQgYW5kIGluc3RhbGwgcmVhZGxpbmUgZnJvbToKKwlmdHAuZ251Lm9yZy9nbnUvcmVhZGxpbmUKK05vdGU6IGlmIHlvdSBhcmUgdXNpbmcgcHJlY29tcGlsZWQgcGFja2FnZXMgeW91IHdpbGwgYWxzbyBuZWVkIHRoZSBkZXZlbG9wbWVudAorcGFja2FnZSBhcyB3ZWxsICh3aGljaCBtYXkgYmUgY2FsbGVkIHJlYWRsaW5lLWRldmVsIG9yIHNvbWV0aGluZyBzaW1pbGFyKS4iICIkTElORU5PIiA1CisJCWZpCitmaQorCisJTElCUz0iJFJFQURMSU5FX0xJQlMgJGx2bV9zYXZlZF9saWJzIgorCWZvciBhY19mdW5jIGluIHJsX2NvbXBsZXRpb25fbWF0Y2hlcworZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJybF9jb21wbGV0aW9uX21hdGNoZXMiICJhY19jdl9mdW5jX3JsX2NvbXBsZXRpb25fbWF0Y2hlcyIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19ybF9jb21wbGV0aW9uX21hdGNoZXMiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKwlMSUJTPSRsdm1fc2F2ZWRfbGlicworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgaW50ZXJuYXRpb25hbGlzYXRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgaW50ZXJuYXRpb25hbGlzYXRpb24uLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbmxzOyBJTlRMPSRlbmFibGV2YWwKK2Vsc2UKKyAgSU5UTD1ubworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlRMIiA+JjUKKyRhc19lY2hvICIkSU5UTCIgPiY2OyB9CisKK2lmIHRlc3QgIiRJTlRMIiA9IHllczsgdGhlbgorIyBGSVhNRSAtIE1vdmUgdGhpcyAtIGNhbiBiZSBkZXZpY2UtbWFwcGVyIHRvbworCUlOVExfUEFDS0FHRT0ibHZtMiIKKwlpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bXNnZm10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9NU0dGTVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNU0dGTVQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9JGFjX2N2X3BhdGhfTVNHRk1UCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TR0ZNVCIgPiY1CiskYXNfZWNobyAiJE1TR0ZNVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIjsgdGhlbgorICBhY19wdF9NU0dGTVQ9JE1TR0ZNVAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9NU0dGTVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9NU0dGTVQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfTVNHRk1UPSIkYWNfcHRfTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9NU0dGTVQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9NU0dGTVQ9JGFjX2N2X3BhdGhfYWNfcHRfTVNHRk1UCitpZiB0ZXN0IC1uICIkYWNfcHRfTVNHRk1UIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X01TR0ZNVCIgPiY1CiskYXNfZWNobyAiJGFjX3B0X01TR0ZNVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX3B0X01TR0ZNVCIgPSB4OyB0aGVuCisgICAgTVNHRk1UPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTVNHRk1UPSRhY19wdF9NU0dGTVQKKyAgZmkKK2Vsc2UKKyAgTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitmaQorCisKKwlpZiB0ZXN0IC16ICIkTVNHRk1UIjsgdGhlbiA6CisgIGFzX2ZuX2Vycm9yICQ/ICJtc2dmbXQgbm90IGZvdW5kIGluIHBhdGggJFBBVEgiICIkTElORU5PIiA1CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbG9jYWxlZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9sb2NhbGVkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2xvY2FsZWRpcjsgbG9jYWxlZGlyPSR3aXRodmFsCitlbHNlCisgIGxvY2FsZWRpcj0ke2xvY2FsZWRpci0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJ30KK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBJTlRMX1BBQ0tBR0UgIiRJTlRMX1BBQ0tBR0UiCitfQUNFT0YKKworCSMgZG91YmxlIGV2YWwgbmVlZGVkICR7ZGF0YXJvb3RkaXJ9IC0+ICR7cHJlZml4fS9zaGFyZSAtPiByZWFsIHBhdGgKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMT0NBTEVESVIgIiQoZXZhbCBlY2hvICQoZXZhbCBlY2hvICRsb2NhbGVkaXIpKSIKK19BQ0VPRgorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNvbmZkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2NvbmZkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2NvbmZkaXI7IENPTkZESVI9JHdpdGh2YWwKK2Vsc2UKKyAgQ09ORkRJUj0nL2V0YycKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX0VUQ19ESVIgIiRDT05GRElSIgorX0FDRU9GCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN0YXRpY2RpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3RhdGljZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zdGF0aWNkaXI7IFNUQVRJQ0RJUj0kd2l0aHZhbAorZWxzZQorICBTVEFUSUNESVI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC11c3JsaWJkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3VzcmxpYmRpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdXNybGliZGlyOyB1c3JsaWJkaXI9JHdpdGh2YWwKK2Vsc2UKKyAgdXNybGliZGlyPScke3ByZWZpeH0vbGliJworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdXNyc2JpbmRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdXNyc2JpbmRpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdXNyc2JpbmRpcjsgdXNyc2JpbmRpcj0kd2l0aHZhbAorZWxzZQorICB1c3JzYmluZGlyPScke3ByZWZpeH0vc2JpbicKK2ZpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC11ZGV2X3ByZWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdWRldl9wcmVmaXgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3VkZXZfcHJlZml4OyB1ZGV2X3ByZWZpeD0kd2l0aHZhbAorZWxzZQorICB1ZGV2X3ByZWZpeD0nJHtleGVjX3ByZWZpeH0nCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC11ZGV2ZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF91ZGV2ZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF91ZGV2ZGlyOyB1ZGV2ZGlyPSR3aXRodmFsCitlbHNlCisgIHVkZXZkaXI9JyR7dWRldl9wcmVmaXh9L2xpYi91ZGV2L3J1bGVzLmQnCitmaQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcjsgc3lzdGVtZHN5c3RlbXVuaXRkaXI9JHdpdGh2YWwKK2Vsc2UKKyAgcGtnX2NvbmZpZ19pbml0CisJICAgIHBrZ19zeXN0ZW1kc3lzdGVtdW5pdGRpcj0kKCIkUEtHX0NPTkZJRyIgLS12YXJpYWJsZT1zeXN0ZW1kc3lzdGVtdW5pdGRpciBzeXN0ZW1kKQorZmkKKworCit0ZXN0IC1uICIkcGtnX3N5c3RlbWRzeXN0ZW11bml0ZGlyIiAmJiBzeXN0ZW1kc3lzdGVtdW5pdGRpcj0kcGtnX3N5c3RlbWRzeXN0ZW11bml0ZGlyCit0ZXN0IC16ICIkc3lzdGVtZHN5c3RlbXVuaXRkaXIiICYmIHN5c3RlbWRzeXN0ZW11bml0ZGlyPScke2V4ZWNfcHJlZml4fS9saWIvc3lzdGVtZC9zeXN0ZW0nOworCitzeXN0ZW1kdXRpbGRpcj0kKCIkUEtHX0NPTkZJRyIgLS12YXJpYWJsZT1zeXN0ZW1kdXRpbGRpciBzeXN0ZW1kKQordGVzdCAteiAiJHN5c3RlbWR1dGlsZGlyIiAmJiBzeXN0ZW1kdXRpbGRpcj0nJHtleGVjX3ByZWZpeH0vbGliL3N5c3RlbWQnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRtcGZpbGVzZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90bXBmaWxlc2RpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdG1wZmlsZXNkaXI7IHRtcGZpbGVzZGlyPSR3aXRodmFsCitlbHNlCisgIHRtcGZpbGVzZGlyPScke3ByZWZpeH0vbGliL3RtcGZpbGVzLmQnCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgdGVzdCAiJFJFQURMSU5FIiA9IHllczsgdGhlbgorCWZvciBhY19oZWFkZXIgaW4gcmVhZGxpbmUvcmVhZGxpbmUuaCByZWFkbGluZS9oaXN0b3J5LmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgaGFyZF9iYWlsb3V0CitmaQorCitkb25lCisKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9DTUlSUk9SRCIgPSB5ZXM7IHRoZW4KKwlmb3IgYWNfZnVuYyBpbiBhdGV4aXQKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiYXRleGl0IiAiYWNfY3ZfZnVuY19hdGV4aXQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfYXRleGl0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfQVRFWElUIDEKK19BQ0VPRgorCitlbHNlCisgIGhhcmRfYmFpbG91dAorZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAiJEJVSUxEX0xWTUxPQ0tEIiA9IHllczsgdGhlbgorCWZvciBhY19mdW5jIGluIGNsb2NrX2dldHRpbWUgc3RydG91bGwKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitlbHNlCisgIGhhcmRfYmFpbG91dAorZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAiJEJVSUxEX0xWTVBPTExEIiA9IHllczsgdGhlbgorCWZvciBhY19mdW5jIGluIHN0cnBicmsKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic3RycGJyayIgImFjX2N2X2Z1bmNfc3RycGJyayIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJwYnJrIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSUEJSSyAxCitfQUNFT0YKKworZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCitkb25lCisKKwlhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJzdHJlcnJvcl9yIiAiYWNfY3ZfaGF2ZV9kZWNsX3N0cmVycm9yX3IiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX3N0cmVycm9yX3IiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9TVFJFUlJPUl9SICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCitmb3IgYWNfZnVuYyBpbiBzdHJlcnJvcl9yCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmVycm9yX3IiICJhY19jdl9mdW5jX3N0cmVycm9yX3IiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc3RyZXJyb3JfciIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUkVSUk9SX1IgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3N0cmVycm9yX3JfY2hhcl9wKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgIGFjX2N2X2Z1bmNfc3RyZXJyb3Jfcl9jaGFyX3A9bm8KKyAgICBpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfc3RyZXJyb3JfciA9IHllczsgdGhlbgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisJICBjaGFyIGJ1ZlsxMDBdOworCSAgY2hhciB4ID0gKnN0cmVycm9yX3IgKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJICBjaGFyICpwID0gc3RyZXJyb3JfciAoMCwgYnVmLCBzaXplb2YgYnVmKTsKKwkgIHJldHVybiAhcCB8fCB4OworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBlbHNlCisgICAgICAjIHN0cmVycm9yX3IgaXMgbm90IGRlY2xhcmVkLiAgQ2hvb3NlIGJldHdlZW4KKyAgICAgICMgc3lzdGVtcyB0aGF0IGhhdmUgcmVsYXRpdmVseSBpbmFjY2Vzc2libGUgZGVjbGFyYXRpb25zIGZvciB0aGUKKyAgICAgICMgZnVuY3Rpb24uICBCZU9TIGFuZCBERUMgVU5JWCA0LjAgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBidXQgdGhlCisgICAgICAjIGZvcm1lciBoYXMgYSBzdHJlcnJvcl9yIHRoYXQgcmV0dXJucyBjaGFyKiwgd2hpbGUgdGhlIGxhdHRlcgorICAgICAgIyBoYXMgYSBzdHJlcnJvcl9yIHRoYXQgcmV0dXJucyBgaW50Jy4KKyAgICAgICMgVGhpcyB0ZXN0IHNob3VsZCBzZWdmYXVsdCBvbiB0aGUgREVDIHN5c3RlbS4KKyAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorCWV4dGVybiBjaGFyICpzdHJlcnJvcl9yICgpOworaW50CittYWluICgpCit7CitjaGFyIGJ1ZlsxMDBdOworCSAgY2hhciB4ID0gKnN0cmVycm9yX3IgKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJICByZXR1cm4gISBpc2FscGhhICh4KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfc3RyZXJyb3Jfcl9jaGFyX3A9eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfc3RyZXJyb3Jfcl9jaGFyX3AiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0cmVycm9yX3JfY2hhcl9wIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfc3RyZXJyb3Jfcl9jaGFyX3AgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1RSRVJST1JfUl9DSEFSX1AgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2ZpCisKK2lmIHRlc3QgIiRDTFZNRCIgIT0gbm9uZTsgdGhlbgorCWZvciBhY19oZWFkZXIgaW4gbW50ZW50LmggbmV0ZGIuaCBuZXRpbmV0L2luLmggcHRocmVhZC5oIHNlYXJjaC5oIHN5cy9tb3VudC5oIHN5cy9zb2NrZXQuaCBzeXMvdWlvLmggc3lzL3VuLmggdXRtcHguaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiYmFpbGluZyBvdXQiICIkTElORU5PIiA1CitmaQorCitkb25lCisKKwlmb3IgYWNfZnVuYyBpbiBkdXAyIGdldG1udGVudCBtZW1tb3ZlIHNlbGVjdCBzb2NrZXQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitlbHNlCisgIGhhcmRfYmFpbG91dAorZmkKK2RvbmUKKworCSMgZ2V0bW50ZW50IGlzIGluIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgb24gVU5JQ09TLCBpbiAtbHN1biBvbiBJcml4IDQsCisjIC1sc2VxIG9uIER5bml4L1BUWCwgLWxnZW4gb24gVW5peHdhcmUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0bW50ZW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0bW50ZW50Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9nZXRtbnRlbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRtbnRlbnQgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRtbnRlbnQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgc3VuIHNlcSBnZW47IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfZ2V0bW50ZW50PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfZ2V0bW50ZW50Kzp9IGZhbHNlOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiAke2FjX2N2X3NlYXJjaF9nZXRtbnRlbnQrOn0gZmFsc2U7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9nZXRtbnRlbnQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9nZXRtbnRlbnQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfZ2V0bW50ZW50IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2dldG1udGVudAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorICBhY19jdl9mdW5jX2dldG1udGVudD15ZXMKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRNTlRFTlQgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgYWNfY3ZfZnVuY19nZXRtbnRlbnQ9bm8KK2ZpCisKKworCWZvciBhY19oZWFkZXIgaW4gc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHR5cGVzIG9mIGFyZ3VtZW50cyBmb3Igc2VsZWN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHR5cGVzIG9mIGFyZ3VtZW50cyBmb3Igc2VsZWN0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBmb3IgYWNfYXJnMjM0IGluICdmZF9zZXQgKicgJ2ludCAqJyAndm9pZCAqJzsgZG8KKyBmb3IgYWNfYXJnMSBpbiAnaW50JyAnc2l6ZV90JyAndW5zaWduZWQgbG9uZyBpbnQnICd1bnNpZ25lZCBpbnQnOyBkbworICBmb3IgYWNfYXJnNSBpbiAnc3RydWN0IHRpbWV2YWwgKicgJ2NvbnN0IHN0cnVjdCB0aW1ldmFsIConOyBkbworICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworaW50CittYWluICgpCit7CitleHRlcm4gaW50IHNlbGVjdCAoJGFjX2FyZzEsCisJCQkJCSAgICAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LAorCQkJCQkgICAgJGFjX2FyZzUpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9IiRhY19hcmcxLCRhY19hcmcyMzQsJGFjX2FyZzUiOyBicmVhayAzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKKyBkb25lCitkb25lCisjIFByb3ZpZGUgYSBzYWZlIGRlZmF1bHQgdmFsdWUuCis6ICIke2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9aW50LGludCAqLHN0cnVjdCB0aW1ldmFsICp9IgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3NlbGVjdF9hcmdzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19zZWxlY3RfYXJncyIgPiY2OyB9CithY19zYXZlX0lGUz0kSUZTOyBJRlM9JywnCitzZXQgZHVtbXkgYGVjaG8gIiRhY19jdl9mdW5jX3NlbGVjdF9hcmdzIiB8IHNlZCAncy9cKi9cKi9nJ2AKK0lGUz0kYWNfc2F2ZV9JRlMKK3NoaWZ0CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0VMRUNUX1RZUEVfQVJHMSAkMQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTRUxFQ1RfVFlQRV9BUkcyMzQgKCQyKQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTRUxFQ1RfVFlQRV9BUkc1ICgkMykKK19BQ0VPRgorCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAiJENMVVNURVIiICE9IG5vbmU7IHRoZW4KKwlmb3IgYWNfaGVhZGVyIGluIHN5cy9zb2NrZXQuaCBzeXMvdW4uaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCisKK2RvbmUKKworCWZvciBhY19mdW5jIGluIHNvY2tldAorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzb2NrZXQiICJhY19jdl9mdW5jX3NvY2tldCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zb2NrZXQiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TT0NLRVQgMQorX0FDRU9GCisKK2Vsc2UKKyAgaGFyZF9iYWlsb3V0CitmaQorZG9uZQorCitmaQorCitpZiB0ZXN0ICIkRE1FVkVOVEQiID0geWVzOyB0aGVuCisJZm9yIGFjX2hlYWRlciBpbiBhcnBhL2luZXQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiYXJwYS9pbmV0LmgiICJhY19jdl9oZWFkZXJfYXJwYV9pbmV0X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2FycGFfaW5ldF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQorX0FDRU9GCisKK2Vsc2UKKyAgaGFyZF9iYWlsb3V0CitmaQorCitkb25lCisKK2ZpCisKK2lmIHRlc3QgIiRIQVZFX0xJQkRMIiA9IHllczsgdGhlbgorCWZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfRExGQ05fSCAxCitfQUNFT0YKKworZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCisKK2RvbmUKKworZmkKKworaWYgdGVzdCAiJElOVEwiID0geWVzOyB0aGVuCisJZm9yIGFjX2hlYWRlciBpbiBsaWJpbnRsLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYmludGwuaCIgImFjX2N2X2hlYWRlcl9saWJpbnRsX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpYmludGxfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQklOVExfSCAxCitfQUNFT0YKKworZWxzZQorICBoYXJkX2JhaWxvdXQKK2ZpCisKK2RvbmUKKworZmkKKworaWYgdGVzdCAiJFVERVZfU1lOQyIgPSB5ZXM7IHRoZW4KKwlmb3IgYWNfaGVhZGVyIGluIHN5cy9pcGMuaCBzeXMvc2VtLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgaGFyZF9iYWlsb3V0CitmaQorCitkb25lCisKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tb2Rwcm9iZSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1tb2Rwcm9iZTsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfTU9EUFJPQkVfQ01EKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTU9EUFJPQkVfQ01EIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX01PRFBST0JFX0NNRD0iJE1PRFBST0JFX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfTU9EUFJPQkVfQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorTU9EUFJPQkVfQ01EPSRhY19jdl9wYXRoX01PRFBST0JFX0NNRAoraWYgdGVzdCAtbiAiJE1PRFBST0JFX0NNRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNT0RQUk9CRV9DTUQiID4mNQorJGFzX2VjaG8gIiRNT0RQUk9CRV9DTUQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX01PRFBST0JFX0NNRCI7IHRoZW4KKyAgYWNfcHRfTU9EUFJPQkVfQ01EPSRNT0RQUk9CRV9DTUQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtb2Rwcm9iZSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbW9kcHJvYmU7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2FjX3B0X01PRFBST0JFX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X01PRFBST0JFX0NNRCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9NT0RQUk9CRV9DTUQ9IiRhY19wdF9NT0RQUk9CRV9DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X01PRFBST0JFX0NNRD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X01PRFBST0JFX0NNRD0kYWNfY3ZfcGF0aF9hY19wdF9NT0RQUk9CRV9DTUQKK2lmIHRlc3QgLW4gIiRhY19wdF9NT0RQUk9CRV9DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfTU9EUFJPQkVfQ01EIiA+JjUKKyRhc19lY2hvICIkYWNfcHRfTU9EUFJPQkVfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfTU9EUFJPQkVfQ01EIiA9IHg7IHRoZW4KKyAgICBNT0RQUk9CRV9DTUQ9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBNT0RQUk9CRV9DTUQ9JGFjX3B0X01PRFBST0JFX0NNRAorICBmaQorZWxzZQorICBNT0RQUk9CRV9DTUQ9IiRhY19jdl9wYXRoX01PRFBST0JFX0NNRCIKK2ZpCisKKworaWYgdGVzdCAtbiAiJE1PRFBST0JFX0NNRCI7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBNT0RQUk9CRV9DTUQgIiRNT0RQUk9CRV9DTUQiCitfQUNFT0YKKworZmkKKworCitsdm1fZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4Cit0ZXN0ICIkbHZtX2V4ZWNfcHJlZml4IiA9IE5PTkUgJiYgbHZtX2V4ZWNfcHJlZml4PSRwcmVmaXgKK3Rlc3QgIiRsdm1fZXhlY19wcmVmaXgiID0gTk9ORSAmJiBsdm1fZXhlY19wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CitMVk1fUEFUSD0iJGx2bV9leGVjX3ByZWZpeC9zYmluL2x2bSIKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMVk1fUEFUSCAiJExWTV9QQVRIIgorX0FDRU9GCisKKworY2x2bWRfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAordGVzdCAiJHByZWZpeCIgIT0gTk9ORSAmJiBjbHZtZF9wcmVmaXg9JHByZWZpeAorQ0xWTURfUEFUSD0iJGNsdm1kX3ByZWZpeC9zYmluL2Nsdm1kIgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIENMVk1EX1BBVEggIiRDTFZNRF9QQVRIIgorX0FDRU9GCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmIHRlc3QgIiRCVUlMRF9ETUVWRU5URCIgPSB5ZXM7IHRoZW4KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kbWV2ZW50ZC1waWRmaWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kbWV2ZW50ZF9waWRmaWxlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kbWV2ZW50ZF9waWRmaWxlOyBETUVWRU5URF9QSURGSUxFPSR3aXRodmFsCitlbHNlCisgIERNRVZFTlREX1BJREZJTEU9IiRERUZBVUxUX1BJRF9ESVIvZG1ldmVudGQucGlkIgorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERNRVZFTlREX1BJREZJTEUgIiRETUVWRU5URF9QSURGSUxFIgorX0FDRU9GCisKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9ETUVWRU5URCIgPSB5ZXM7IHRoZW4KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kbWV2ZW50ZC1wYXRoIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kbWV2ZW50ZF9wYXRoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kbWV2ZW50ZF9wYXRoOyBETUVWRU5URF9QQVRIPSR3aXRodmFsCitlbHNlCisgIERNRVZFTlREX1BBVEg9IiRsdm1fZXhlY19wcmVmaXgvc2Jpbi9kbWV2ZW50ZCIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBETUVWRU5URF9QQVRIICIkRE1FVkVOVERfUEFUSCIKK19BQ0VPRgorCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtc3lzdGVtLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGVmYXVsdF9zeXN0ZW1fZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3N5c3RlbV9kaXI7IERFRkFVTFRfU1lTX0RJUj0kd2l0aHZhbAorZWxzZQorICBERUZBVUxUX1NZU19ESVI9Ii9ldGMvbHZtIgorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfU1lTX0RJUiAiJERFRkFVTFRfU1lTX0RJUiIKK19BQ0VPRgorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kZWZhdWx0LXByb2ZpbGUtc3ViZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kZWZhdWx0X3Byb2ZpbGVfc3ViZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X3Byb2ZpbGVfc3ViZGlyOyBERUZBVUxUX1BST0ZJTEVfU1VCRElSPSR3aXRodmFsCitlbHNlCisgIERFRkFVTFRfUFJPRklMRV9TVUJESVI9cHJvZmlsZQorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERFRkFVTFRfUFJPRklMRV9TVUJESVIgIiRERUZBVUxUX1BST0ZJTEVfU1VCRElSIgorX0FDRU9GCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtYXJjaGl2ZS1zdWJkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfYXJjaGl2ZV9zdWJkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RlZmF1bHRfYXJjaGl2ZV9zdWJkaXI7IERFRkFVTFRfQVJDSElWRV9TVUJESVI9JHdpdGh2YWwKK2Vsc2UKKyAgREVGQVVMVF9BUkNISVZFX1NVQkRJUj1hcmNoaXZlCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9BUkNISVZFX1NVQkRJUiAiJERFRkFVTFRfQVJDSElWRV9TVUJESVIiCitfQUNFT0YKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGVmYXVsdC1iYWNrdXAtc3ViZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kZWZhdWx0X2JhY2t1cF9zdWJkaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RlZmF1bHRfYmFja3VwX3N1YmRpcjsgREVGQVVMVF9CQUNLVVBfU1VCRElSPSR3aXRodmFsCitlbHNlCisgIERFRkFVTFRfQkFDS1VQX1NVQkRJUj1iYWNrdXAKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX0JBQ0tVUF9TVUJESVIgIiRERUZBVUxUX0JBQ0tVUF9TVUJESVIiCitfQUNFT0YKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGVmYXVsdC1jYWNoZS1zdWJkaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfY2FjaGVfc3ViZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZWZhdWx0X2NhY2hlX3N1YmRpcjsgREVGQVVMVF9DQUNIRV9TVUJESVI9JHdpdGh2YWwKK2Vsc2UKKyAgREVGQVVMVF9DQUNIRV9TVUJESVI9Y2FjaGUKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBERUZBVUxUX0NBQ0hFX1NVQkRJUiAiJERFRkFVTFRfQ0FDSEVfU1VCRElSIgorX0FDRU9GCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtbG9ja2luZy1kaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfbG9ja2luZ19kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RlZmF1bHRfbG9ja2luZ19kaXI7IERFRkFVTFRfTE9DS19ESVI9JHdpdGh2YWwKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVmYXVsdCBsb2NrIGRpcmVjdG9yeSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmYXVsdCBsb2NrIGRpcmVjdG9yeS4uLiAiID4mNjsgfQorCSAgICAgREVGQVVMVF9MT0NLX0RJUj0iJFJVTl9ESVIvbG9jay9sdm0iCisJICAgICB0ZXN0IC1kICIkUlVOX0RJUi9sb2NrIiB8fCBERUZBVUxUX0xPQ0tfRElSPSIvdmFyL2xvY2svbHZtIgorCSAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERUZBVUxUX0xPQ0tfRElSIiA+JjUKKyRhc19lY2hvICIkREVGQVVMVF9MT0NLX0RJUiIgPiY2OyB9CitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9MT0NLX0RJUiAiJERFRkFVTFRfTE9DS19ESVIiCitfQUNFT0YKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlZmF1bHQtZGF0YS1hbGlnbm1lbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RlZmF1bHRfZGF0YV9hbGlnbm1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RlZmF1bHRfZGF0YV9hbGlnbm1lbnQ7IERFRkFVTFRfREFUQV9BTElHTk1FTlQ9JHdpdGh2YWwKK2Vsc2UKKyAgREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0xCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREVGQVVMVF9EQVRBX0FMSUdOTUVOVCAkREVGQVVMVF9EQVRBX0FMSUdOTUVOVAorX0FDRU9GCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGtlcm5lbCBpbnRlcmZhY2UgY2hvaWNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBrZXJuZWwgaW50ZXJmYWNlIGNob2ljZS4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWludGVyZmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW50ZXJmYWNlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9pbnRlcmZhY2U7IGludGVyZmFjZT0kd2l0aHZhbAorZWxzZQorICBpbnRlcmZhY2U9aW9jdGwKK2ZpCisKK3Rlc3QgIiRpbnRlcmZhY2UiICE9IGlvY3RsICYmIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtaW50ZXJmYWNlPWlvY3RsIHJlcXVpcmVkLiBmcyBubyBsb25nZXIgc3VwcG9ydGVkLiIgIiRMSU5FTk8iIDUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaW50ZXJmYWNlIiA+JjUKKyRhc19lY2hvICIkaW50ZXJmYWNlIiA+JjY7IH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3JlYWQgRE1fTElCX1ZFUlNJT04gPCAiJHNyY2RpciIvVkVSU0lPTl9ETSAyPi9kZXYvbnVsbCB8fCBETV9MSUJfVkVSU0lPTj1Vbmtub3duCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgRE1fTElCX1ZFUlNJT04gIiRETV9MSUJfVkVSU0lPTiIKK19BQ0VPRgorCisKK0RNX0xJQl9QQVRDSExFVkVMPWBjYXQgIiRzcmNkaXIiL1ZFUlNJT05fRE0gfCAkQVdLIC1GICdbLS4gXScgJ3twcmludGYgIiVzLiVzLiVzIiwkMSwkMiwkM30nYAorCityZWFkIFZFUiA8ICIkc3JjZGlyIi9WRVJTSU9OIDI+L2Rldi9udWxsIHx8IFZFUj1Vbmtub3duCisKK0xWTV9WRVJTSU9OPVwiJFZFUlwiCitMVk1fUkVMRUFTRV9EQVRFPSJcImBlY2hvICRWRVIgfCAkU0VEICdzLy4qICgvLztzLykuKi8vJ2BcIiIKK1ZFUj1gZWNobyAiJFZFUiIgfCAkQVdLICd7cHJpbnQgJDF9J2AKK0xWTV9SRUxFQVNFPSJcImBlY2hvICIkVkVSIiB8ICRBV0sgLUYgJy0nICd7cHJpbnQgJDJ9J2BcIiIKK1ZFUj1gZWNobyAiJFZFUiIgfCAkQVdLIC1GICctJyAne3ByaW50ICQxfSdgCitMVk1fTUFKT1I9YGVjaG8gIiRWRVIiIHwgJEFXSyAtRiAnLicgJ3twcmludCAkMX0nYAorTFZNX01JTk9SPWBlY2hvICIkVkVSIiB8ICRBV0sgLUYgJy4nICd7cHJpbnQgJDJ9J2AKK0xWTV9QQVRDSExFVkVMPWBlY2hvICIkVkVSIiB8ICRBV0sgLUYgJ1soLl0nICd7cHJpbnQgJDN9J2AKK0xWTV9MSUJBUEk9YGVjaG8gIiRWRVIiIHwgJEFXSyAtRiAnWygpXScgJ3twcmludCAkMn0nYAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIG1ha2UudG1wbCBkYWVtb25zL01ha2VmaWxlIGRhZW1vbnMvY2x2bWQvTWFrZWZpbGUgZGFlbW9ucy9jbWlycm9yZC9NYWtlZmlsZSBkYWVtb25zL2RtZXZlbnRkL01ha2VmaWxlIGRhZW1vbnMvZG1ldmVudGQvbGliZGV2bWFwcGVyLWV2ZW50LnBjIGRhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9NYWtlZmlsZSBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9NYWtlZmlsZSBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC9NYWtlZmlsZSBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yL01ha2VmaWxlIGRhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC9NYWtlZmlsZSBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9NYWtlZmlsZSBkYWVtb25zL2x2bWRidXNkL01ha2VmaWxlIGRhZW1vbnMvbHZtZGJ1c2QvcGF0aC5weSBkYWVtb25zL2x2bWV0YWQvTWFrZWZpbGUgZGFlbW9ucy9sdm1wb2xsZC9NYWtlZmlsZSBkYWVtb25zL2x2bWxvY2tkL01ha2VmaWxlIGNvbmYvTWFrZWZpbGUgY29uZi9leGFtcGxlLmNvbmYgY29uZi9sdm1sb2NhbC5jb25mIGNvbmYvY29tbWFuZF9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUgY29uZi9tZXRhZGF0YV9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUgaW5jbHVkZS8uc3ltbGlua3MgaW5jbHVkZS9NYWtlZmlsZSBsaWIvTWFrZWZpbGUgbGliL2Zvcm1hdDEvTWFrZWZpbGUgbGliL2Zvcm1hdF9wb29sL01ha2VmaWxlIGxpYi9sb2NraW5nL01ha2VmaWxlIGxpYi9taXJyb3IvTWFrZWZpbGUgbGliL3JlcGxpY2F0b3IvTWFrZWZpbGUgaW5jbHVkZS9sdm0tdmVyc2lvbi5oIGxpYi9yYWlkL01ha2VmaWxlIGxpYi9zbmFwc2hvdC9NYWtlZmlsZSBsaWIvdGhpbi9NYWtlZmlsZSBsaWIvY2FjaGVfc2VndHlwZS9NYWtlZmlsZSBsaWJkYWVtb24vTWFrZWZpbGUgbGliZGFlbW9uL2NsaWVudC9NYWtlZmlsZSBsaWJkYWVtb24vc2VydmVyL01ha2VmaWxlIGxpYmRtL01ha2VmaWxlIGxpYmRtL2xpYmRldm1hcHBlci5wYyBsaWJsdm0vTWFrZWZpbGUgbGlibHZtL2xpYmx2bTJhcHAucGMgbWFuL01ha2VmaWxlIHBvL01ha2VmaWxlIHB5dGhvbi9NYWtlZmlsZSBweXRob24vc2V0dXAucHkgc2NyaXB0cy9ibGtkZWFjdGl2YXRlLnNoIHNjcmlwdHMvYmxrX2F2YWlsYWJpbGl0eV9pbml0X3JlZF9oYXQgc2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIHNjcmlwdHMvY2x2bWRfaW5pdF9yZWRfaGF0IHNjcmlwdHMvY21pcnJvcmRfaW5pdF9yZWRfaGF0IHNjcmlwdHMvY29tLnJlZGhhdC5sdm1kYnVzMS5zZXJ2aWNlIHNjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2Ugc2NyaXB0cy9kbV9ldmVudF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0IHNjcmlwdHMvbHZtMl9jbHVzdGVyX2FjdGl2YXRpb25fcmVkX2hhdC5zaCBzY3JpcHRzL2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIHNjcmlwdHMvbHZtMl9jbHZtZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBzY3JpcHRzL2x2bTJfY21pcnJvcmRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2Ugc2NyaXB0cy9sdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIHNjcmlwdHMvbHZtMl9sdm1ldGFkX2luaXRfcmVkX2hhdCBzY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBzY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0IHNjcmlwdHMvbHZtMl9sdm1wb2xsZF9pbml0X3JlZF9oYXQgc2NyaXB0cy9sdm0yX2x2bXBvbGxkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIHNjcmlwdHMvbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0IHNjcmlwdHMvbHZtMl9sdm1sb2NrZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBzY3JpcHRzL2x2bTJfbHZtbG9ja2luZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBzY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQgc2NyaXB0cy9sdm0yX21vbml0b3Jpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2Ugc2NyaXB0cy9sdm0yX3B2c2Nhbl9zeXN0ZW1kX3JlZF9oYXRALnNlcnZpY2Ugc2NyaXB0cy9sdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZiBzY3JpcHRzL01ha2VmaWxlIHRlc3QvTWFrZWZpbGUgdGVzdC9hcGkvTWFrZWZpbGUgdGVzdC91bml0L01ha2VmaWxlIHRvb2xzL01ha2VmaWxlIHVkZXYvTWFrZWZpbGUgdW5pdC10ZXN0cy9kYXRhc3RydWN0L01ha2VmaWxlIHVuaXQtdGVzdHMvcmVnZXgvTWFrZWZpbGUgdW5pdC10ZXN0cy9tbS9NYWtlZmlsZSIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKKyAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisgICAgIHQgY2xlYXIKKyAgICAgOmNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDplbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCisJY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgorICAgICAgZWxzZQorICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCisgICAgICAgICovKiB8ID86KikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKKwkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCisgICAgICAgICopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCitERUZTPS1ESEFWRV9DT05GSUdfSAorCithY19saWJvYmpzPQorYWNfbHRsaWJvYmpzPQorVT0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYXNfZm5fYXBwZW5kIGFjX2xpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYXNfZm5fYXBwZW5kIGFjX2x0bGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworCis6ICIke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfSIKK2FjX3dyaXRlX2ZhaWw9MAorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQorYXNfd3JpdGVfZmFpbD0wCitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcFInCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXBSJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcFInCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAoraWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKKworIyBhc19mbl9leGVjdXRhYmxlX3AgRklMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0IGlmIEZJTEUgaXMgYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuCithc19mbl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXggIiQxIgorfSAjIGFzX2ZuX2V4ZWN1dGFibGVfcAorYXNfdGVzdF94PSd0ZXN0IC14JworYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworZXhlYyA2PiYxCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mICRDT05GSUdfU1RBVFVTIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNFT0YKK3Rlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICQwIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KK2FjX2xvZz0iCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyIKKworX0FDRU9GCisKK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JCo7OworZXNhYworCitjYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKK2VzYWMKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCitmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gIFVubGVzcyB0aGUgZmlsZXMKK2FuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtUQUddLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKKyAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisgICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgICAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworUmVwb3J0IGJ1Z3MgdG8gdGhlIHBhY2thZ2UgcHJvdmlkZXIuIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKK2FjX2NzX3ZlcnNpb249IlxcCitjb25maWcuc3RhdHVzCitjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCisgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgorCitDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisKK2FjX3B3ZD0nJGFjX3B3ZCcKK3NyY2Rpcj0nJHNyY2RpcicKK0lOU1RBTEw9JyRJTlNUQUxMJworTUtESVJfUD0nJE1LRElSX1AnCitBV0s9JyRBV0snCit0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0/KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCisgICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJFNIRUxMICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2hpZnQKKyAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKKyAgQ09ORklHX1NIRUxMPSckU0hFTEwnCisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgZXhlYyAiXCRAIgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgJGFzX2VjaG8gIiRhY19sb2ciCit9ID4mNQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiaW5jbHVkZS9jb25maWd1cmUuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgaW5jbHVkZS9jb25maWd1cmUuaCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgIm1ha2UudG1wbCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBtYWtlLnRtcGwiIDs7CisgICAgImRhZW1vbnMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9NYWtlZmlsZSIgOzsKKyAgICAiZGFlbW9ucy9jbHZtZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2Nsdm1kL01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2NtaXJyb3JkL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhZW1vbnMvY21pcnJvcmQvTWFrZWZpbGUiIDs7CisgICAgImRhZW1vbnMvZG1ldmVudGQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9kbWV2ZW50ZC9NYWtlZmlsZSIgOzsKKyAgICAiZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQucGMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQucGMiIDs7CisgICAgImRhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvTWFrZWZpbGUiIDs7CisgICAgImRhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yL01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC9NYWtlZmlsZSIgOzsKKyAgICAiZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yL01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvc25hcHNob3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3NuYXBzaG90L01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9NYWtlZmlsZSIgOzsKKyAgICAiZGFlbW9ucy9sdm1kYnVzZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYWVtb25zL2x2bWRidXNkL01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2x2bWRidXNkL3BhdGgucHkiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9sdm1kYnVzZC9wYXRoLnB5IiA7OworICAgICJkYWVtb25zL2x2bWV0YWQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9sdm1ldGFkL01ha2VmaWxlIiA7OworICAgICJkYWVtb25zL2x2bXBvbGxkL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhZW1vbnMvbHZtcG9sbGQvTWFrZWZpbGUiIDs7CisgICAgImRhZW1vbnMvbHZtbG9ja2QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGFlbW9ucy9sdm1sb2NrZC9NYWtlZmlsZSIgOzsKKyAgICAiY29uZi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb25mL01ha2VmaWxlIiA7OworICAgICJjb25mL2V4YW1wbGUuY29uZiIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb25mL2V4YW1wbGUuY29uZiIgOzsKKyAgICAiY29uZi9sdm1sb2NhbC5jb25mIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbmYvbHZtbG9jYWwuY29uZiIgOzsKKyAgICAiY29uZi9jb21tYW5kX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb25mL2NvbW1hbmRfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlIiA7OworICAgICJjb25mL21ldGFkYXRhX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb25mL21ldGFkYXRhX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZSIgOzsKKyAgICAiaW5jbHVkZS8uc3ltbGlua3MiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS8uc3ltbGlua3MiIDs7CisgICAgImluY2x1ZGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9NYWtlZmlsZSIgOzsKKyAgICAibGliL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9NYWtlZmlsZSIgOzsKKyAgICAibGliL2Zvcm1hdDEvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliL2Zvcm1hdDEvTWFrZWZpbGUiIDs7CisgICAgImxpYi9mb3JtYXRfcG9vbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWIvZm9ybWF0X3Bvb2wvTWFrZWZpbGUiIDs7CisgICAgImxpYi9sb2NraW5nL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9sb2NraW5nL01ha2VmaWxlIiA7OworICAgICJsaWIvbWlycm9yL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9taXJyb3IvTWFrZWZpbGUiIDs7CisgICAgImxpYi9yZXBsaWNhdG9yL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9yZXBsaWNhdG9yL01ha2VmaWxlIiA7OworICAgICJpbmNsdWRlL2x2bS12ZXJzaW9uLmgiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9sdm0tdmVyc2lvbi5oIiA7OworICAgICJsaWIvcmFpZC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWIvcmFpZC9NYWtlZmlsZSIgOzsKKyAgICAibGliL3NuYXBzaG90L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9zbmFwc2hvdC9NYWtlZmlsZSIgOzsKKyAgICAibGliL3RoaW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliL3RoaW4vTWFrZWZpbGUiIDs7CisgICAgImxpYi9jYWNoZV9zZWd0eXBlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9jYWNoZV9zZWd0eXBlL01ha2VmaWxlIiA7OworICAgICJsaWJkYWVtb24vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliZGFlbW9uL01ha2VmaWxlIiA7OworICAgICJsaWJkYWVtb24vY2xpZW50L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYmRhZW1vbi9jbGllbnQvTWFrZWZpbGUiIDs7CisgICAgImxpYmRhZW1vbi9zZXJ2ZXIvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliZGFlbW9uL3NlcnZlci9NYWtlZmlsZSIgOzsKKyAgICAibGliZG0vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGliZG0vTWFrZWZpbGUiIDs7CisgICAgImxpYmRtL2xpYmRldm1hcHBlci5wYyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJkbS9saWJkZXZtYXBwZXIucGMiIDs7CisgICAgImxpYmx2bS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJsdm0vTWFrZWZpbGUiIDs7CisgICAgImxpYmx2bS9saWJsdm0yYXBwLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYmx2bS9saWJsdm0yYXBwLnBjIiA7OworICAgICJtYW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbWFuL01ha2VmaWxlIiA7OworICAgICJwby9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwby9NYWtlZmlsZSIgOzsKKyAgICAicHl0aG9uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHB5dGhvbi9NYWtlZmlsZSIgOzsKKyAgICAicHl0aG9uL3NldHVwLnB5IikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHB5dGhvbi9zZXR1cC5weSIgOzsKKyAgICAic2NyaXB0cy9ibGtkZWFjdGl2YXRlLnNoIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvYmxrZGVhY3RpdmF0ZS5zaCIgOzsKKyAgICAic2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X2luaXRfcmVkX2hhdCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2Jsa19hdmFpbGFiaWxpdHlfaW5pdF9yZWRfaGF0IiA7OworICAgICJzY3JpcHRzL2Jsa19hdmFpbGFiaWxpdHlfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIiA7OworICAgICJzY3JpcHRzL2Nsdm1kX2luaXRfcmVkX2hhdCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2Nsdm1kX2luaXRfcmVkX2hhdCIgOzsKKyAgICAic2NyaXB0cy9jbWlycm9yZF9pbml0X3JlZF9oYXQiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9jbWlycm9yZF9pbml0X3JlZF9oYXQiIDs7CisgICAgInNjcmlwdHMvY29tLnJlZGhhdC5sdm1kYnVzMS5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvY29tLnJlZGhhdC5sdm1kYnVzMS5zZXJ2aWNlIiA7OworICAgICJzY3JpcHRzL2RtX2V2ZW50X3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiIDs7CisgICAgInNjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2RtX2V2ZW50X3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQiIDs7CisgICAgInNjcmlwdHMvbHZtMl9jbHVzdGVyX2FjdGl2YXRpb25fcmVkX2hhdC5zaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3JlZF9oYXQuc2giIDs7CisgICAgInNjcmlwdHMvbHZtMl9jbHVzdGVyX2FjdGl2YXRpb25fc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9sdm0yX2NsdXN0ZXJfYWN0aXZhdGlvbl9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9jbHZtZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2NtaXJyb3JkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9jbWlycm9yZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9sdm1kYnVzZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bWV0YWRfaW5pdF9yZWRfaGF0IikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9sdm1ldGFkX2luaXRfcmVkX2hhdCIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9sdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiIDs7CisgICAgInNjcmlwdHMvbHZtMl9sdm1ldGFkX3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9sdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bXBvbGxkX2luaXRfcmVkX2hhdCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfbHZtcG9sbGRfaW5pdF9yZWRfaGF0IiA7OworICAgICJzY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9sdm0yX2x2bXBvbGxkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIiA7OworICAgICJzY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9sdm1sb2NrZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX2x2bWxvY2tpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2NyaXB0cy9sdm0yX2x2bWxvY2tpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UiIDs7CisgICAgInNjcmlwdHMvbHZtMl9tb25pdG9yaW5nX2luaXRfcmVkX2hhdCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQiIDs7CisgICAgInNjcmlwdHMvbHZtMl9tb25pdG9yaW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvbHZtMl9tb25pdG9yaW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIiA7OworICAgICJzY3JpcHRzL2x2bTJfcHZzY2FuX3N5c3RlbWRfcmVkX2hhdEAuc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfcHZzY2FuX3N5c3RlbWRfcmVkX2hhdEAuc2VydmljZSIgOzsKKyAgICAic2NyaXB0cy9sdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZiIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzY3JpcHRzL2x2bTJfdG1wZmlsZXNfcmVkX2hhdC5jb25mIiA7OworICAgICJzY3JpcHRzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNjcmlwdHMvTWFrZWZpbGUiIDs7CisgICAgInRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9NYWtlZmlsZSIgOzsKKyAgICAidGVzdC9hcGkvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9hcGkvTWFrZWZpbGUiIDs7CisgICAgInRlc3QvdW5pdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3VuaXQvTWFrZWZpbGUiIDs7CisgICAgInRvb2xzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL01ha2VmaWxlIiA7OworICAgICJ1ZGV2L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHVkZXYvTWFrZWZpbGUiIDs7CisgICAgInVuaXQtdGVzdHMvZGF0YXN0cnVjdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB1bml0LXRlc3RzL2RhdGFzdHJ1Y3QvTWFrZWZpbGUiIDs7CisgICAgInVuaXQtdGVzdHMvcmVnZXgvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdW5pdC10ZXN0cy9yZWdleC9NYWtlZmlsZSIgOzsKKyAgICAidW5pdC10ZXN0cy9tbS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB1bml0LXRlc3RzL21tL01ha2VmaWxlIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OworICBlc2FjCitkb25lCisKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiskZGVidWcgfHwKK3sKKyAgdG1wPSBhY190bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIDogIiR7YWNfdG1wOj0kdG1wfSIKKyAgeyB0ZXN0ICEgLWQgIiRhY190bXAiIHx8IHJtIC1mciAiJGFjX3RtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CithY190bXA9JHRtcAorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXFxyJworZWxzZQorICBhY19jc19hd2tfY3I9JGFjX2NyCitmaQorCitlY2hvICdCRUdJTiB7JyA+IiRhY190bXAvc3ViczEuYXdrIiAmJgorX0FDRU9GCisKKworeworICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgorICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisgIGVjaG8gIl9BQ0VPRiIKK30gPmNvbmYkJHN1YnMuc2ggfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICdeJ2AKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKyAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCitybSAtZiBjb25mJCRzdWJzLnNoCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorX0FDRU9GCitzZWQgLW4gJworaAorcy9eL1NbIi87IHMvIS4qLyJdPS8KK3AKK2cKK3MvXlteIV0qIS8vCis6cmVwbAordCByZXBsCitzLyciJGFjX2RlbGltIickLy8KK3QgZGVsaW0KKzpubAoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBlbnRyaWVzIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9WwkgXSoveworaAorcy8vLworcy9eLzovCitzL1sJIF0qJC86Lworcy86XCQoc3JjZGlyKTovOi9nCitzLzpcJHtzcmNkaXJ9Oi86L2cKK3MvOkBzcmNkaXJAOi86L2cKK3MvXjoqLy8KK3MvOiokLy8KK3gKK3MvXCg9WwkgXSpcKS4qL1wxLworRworcy9cbi8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorQkVHSU4geworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCisjIGhlcmUtZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisKKyMgQ3JlYXRlIGEgZGVsaW1pdGVyIHN0cmluZyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGNvbmZkZWZzLmgsIHRvIGVhc2UKKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KKyAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiRhY190bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgYXNfZm5fZXJyb3IgMSAiY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogXGAkYWNfZiciICIkTElORU5PIiA1OzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19maWxlX2lucHV0cyAiICckYWNfZiciCisgICAgZG9uZQorCisgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgICBjb25maWd1cmVfaW5wdXQ9J0dlbmVyYXRlZCBmcm9tICdgCisJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKwlgJyBieSBjb25maWd1cmUuJworICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBmaQorICAgICMgTmV1dHJhbGl6ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50ZXJwcmV0ZWQgYnkgc2VkIGluIHJlcGxhY2VtZW50IHN0cmluZ3MuCisgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisgICAgKlwmKiB8ICpcfCogfCAqXFwqICkKKyAgICAgICBhY19zZWRfY29uZl9pbnB1dD1gJGFzX2VjaG8gIiRjb25maWd1cmVfaW5wdXQiIHwKKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKyAgICAqKSBhY19zZWRfY29uZl9pbnB1dD0kY29uZmlndXJlX2lucHV0OzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRhY190YWcgaW4KKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1IDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIGFzX2Rpcj0iJGFjX2RpciI7IGFzX2ZuX21rZGlyX3AKKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkYpCisgICMKKyAgIyBDT05GSUdfRklMRQorICAjCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OworICBlc2FjCisgIGFjX01LRElSX1A9JE1LRElSX1AKKyAgY2FzZSAkTUtESVJfUCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OworICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OworICBlc2FjCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KK2FjX3NlZF9kYXRhcm9vdD0nCisvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcCcKK2Nhc2UgYGV2YWwgInNlZCAtbiBcIlwkYWNfc2VkX2RhdGFyb290XCIgJGFjX2ZpbGVfaW5wdXRzImAgaW4KKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KKworICBybSAtZiAiJGFjX3RtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsKKyAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgcm0gLWYgIiRhY19maWxlIgorICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICBmaQorIDs7CisKKworICBlc2FjCisKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKKworaWYgdGVzdCAtbiAiJFRISU5fQ09ORklHVVJFX1dBUk4iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBTdXBwb3J0IGZvciB0aGluIHByb3Zpc2lvbmluZyBpcyBsaW1pdGVkIHNpbmNlIHNvbWUgdGhpbiBwcm92aXNpb25pbmcgdG9vbHMgYXJlIG1pc3NpbmchIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFN1cHBvcnQgZm9yIHRoaW4gcHJvdmlzaW9uaW5nIGlzIGxpbWl0ZWQgc2luY2Ugc29tZSB0aGluIHByb3Zpc2lvbmluZyB0b29scyBhcmUgbWlzc2luZyEiID4mMjt9CitmaQorCitpZiB0ZXN0IC1uICIkVEhJTl9DSEVDS19WRVJTSU9OX1dBUk4iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBZb3Ugc2hvdWxkIGFsc28gaW5zdGFsbCB0aGluX2NoZWNrIHZzbiAwLjMuMiAob3IgbGF0ZXIpIHRvIHVzZSBsdm0yIHRoaW4gcHJvdmlzaW9uaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFlvdSBzaG91bGQgYWxzbyBpbnN0YWxsIHRoaW5fY2hlY2sgdnNuIDAuMy4yIChvciBsYXRlcikgdG8gdXNlIGx2bTIgdGhpbiBwcm92aXNpb25pbmciID4mMjt9CitmaQorCitpZiB0ZXN0IC1uICIkQ0FDSEVfQ09ORklHVVJFX1dBUk4iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBTdXBwb3J0IGZvciBjYWNoZSBpcyBsaW1pdGVkIHNpbmNlIHNvbWUgY2FjaGUgdG9vbHMgYXJlIG1pc3NpbmchIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFN1cHBvcnQgZm9yIGNhY2hlIGlzIGxpbWl0ZWQgc2luY2Ugc29tZSBjYWNoZSB0b29scyBhcmUgbWlzc2luZyEiID4mMjt9CitmaQorCitpZiB0ZXN0ICIkT0RJUkVDVCIgIT0geWVzOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBPX0RJUkVDVCBkaXNhYmxlZDogbG93LW1lbW9yeSBwdm1vdmUgbWF5IGxvY2sgdXAiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogT19ESVJFQ1QgZGlzYWJsZWQ6IGxvdy1tZW1vcnkgcHZtb3ZlIG1heSBsb2NrIHVwIiA+JjI7fQorZmkKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5oIGIvY29uZmlndXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2NDlhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgQ09ORklHVVJFX0gKKyNkZWZpbmUgQ09ORklHVVJFX0gKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjZGVmaW5lIERFRkFVTFRfRE1fQUREX05PREUgRE1fQUREX05PREVfT05fQ1JFQVRFCisjZGVmaW5lIERFRkFVTFRfRE1fTkFNRV9NQU5HTElORyBETV9TVFJJTkdfTUFOR0xJTkdfTk9ORQorI2RlZmluZSBETV9MSUJfVkVSU0lPTiAiMS4wMi4xMzEgKDIwMTYtMDctMTUpIgorI2RlZmluZSBETV9ERVZJQ0VfVUlEIDAKKyNkZWZpbmUgRE1fREVWSUNFX0dJRCAwCisjZGVmaW5lIERNX0RFVklDRV9NT0RFIDA2MDAKKyNkZWZpbmUgRE1fSU9DVExTIDEKKyNkZWZpbmUgSEFWRV9HRVRPUFRMT05HCisKKyNlbmRpZiAgLy8gQ09ORklHVVJFX0gKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I1Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMjIzOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyMKKyMjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBQ19QUkVSRVEoMi42OSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK0FDX0lOSVQKK0FDX0NPTkZJR19TUkNESVIoW2xpYi9kZXZpY2UvZGV2LWNhY2hlLmhdKQorQUNfQ09ORklHX0hFQURFUlMoW2luY2x1ZGUvY29uZmlndXJlLmhdKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIFNldHVwIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYXV0b2NvbmYgaGFzIGF1eGlsYXJ5IGZpbGVzCitBQ19DT05GSUdfQVVYX0RJUihhdXRvY29uZikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBHZXQgc3lzdGVtIHR5cGUKK0FDX0NBTk9OSUNBTF9UQVJHRVQoW10pCisKK0FTX0lGKFt0ZXN0IC16ICIkQ0ZMQUdTIl0sIFtDT1BUSU1JU0VfRkxBRz0iLU8yIl0pCitjYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCUNMREZMQUdTPSIkQ0xERkxBR1MgLVdsLC0tdmVyc2lvbi1zY3JpcHQsLmV4cG9ydC5zeW0iCisJCUVMREZMQUdTPSItV2wsLS1leHBvcnQtZHluYW1pYyIKKwkJIyBGSVhNRSBHZW5lcmF0ZSBsaXN0IGFuZCB1c2UgLS1keW5hbWljLWxpc3Q9LmRsb3Blbi5zeW0KKwkJQ0xEV0hPTEVBUkNISVZFPSItV2wsLXdob2xlLWFyY2hpdmUiCisJCUNMRE5PV0hPTEVBUkNISVZFPSItV2wsLW5vLXdob2xlLWFyY2hpdmUiCisJCUxEREVQUz0iJExEREVQUyAuZXhwb3J0LnN5bSIKKwkJTElCX1NVRkZJWD1zbworCQlERVZNQVBQRVI9eWVzCisJCUJVSUxEX0xWTUVUQUQ9bm8KKwkJQlVJTERfTFZNUE9MTEQ9bm8KKwkJTE9DS0RTQU5MT0NLPW5vCisJCUxPQ0tERExNPW5vCisJCU9ESVJFQ1Q9eWVzCisJCURNX0lPQ1RMUz15ZXMKKwkJU0VMSU5VWD15ZXMKKwkJQ0xVU1RFUj1pbnRlcm5hbAorCQlGU0FETT15ZXMKKwkJQkxLREVBQ1RJVkFURT15ZXMKKwkJOzsKKwlkYXJ3aW4qKQorCQlDRkxBR1M9IiRDRkxBR1MgLW5vLWNwcC1wcmVjb21wIC1mbm8tY29tbW9uIgorCQlDTERGTEFHUz0iJENMREZMQUdTIgorCQlFTERGTEFHUz0KKwkJQ0xEV0hPTEVBUkNISVZFPSItYWxsX2xvYWQiCisJCUNMRE5PV0hPTEVBUkNISVZFPQorCQlMSUJfU1VGRklYPWR5bGliCisJCURFVk1BUFBFUj15ZXMKKwkJT0RJUkVDVD1ubworCQlETV9JT0NUTFM9bm8KKwkJU0VMSU5VWD1ubworCQlDTFVTVEVSPW5vbmUKKwkJRlNBRE09bm8KKwkJQkxLREVBQ1RJVkFURT1ubworCQk7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19QUk9HX1NFRAorQUNfUFJPR19BV0sKK3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCitBQ19QUk9HX0NDCitBQ19QUk9HX0NYWAorQ0ZMQUdTPSRzYXZlX0NGTEFHUworQ1hYRkxBR1M9JHNhdmVfQ1hYRkxBR1MKKworZG5sIHByb2JhYmx5IG5vIGxvbmdlciBuZWVkZWQgaW4gMjAwOCwgYnV0Li4uCitBQ19QUk9HX0dDQ19UUkFESVRJT05BTAorQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX0xOX1MKK0FDX1BST0dfTUFLRV9TRVQKK0FDX1BST0dfTUtESVJfUAorQUNfUFJPR19SQU5MSUIKK0FDX1BBVEhfVE9PTChDRkxPV19DTUQsIGNmbG93KQorQUNfUEFUSF9UT09MKENTQ09QRV9DTUQsIGNzY29wZSkKK0FDX1BBVEhfVE9PTChDSE1PRCwgY2htb2QpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgZm9yIGhlYWRlciBmaWxlcy4KK0FDX0hFQURFUl9ESVJFTlQKK0FDX0hFQURFUl9NQUpPUgorQUNfSEVBREVSX1NUREJPT0wKK0FDX0hFQURFUl9TVERDCitBQ19IRUFERVJfU1lTX1dBSVQKK0FDX0hFQURFUl9USU1FCisKK0FDX0NIRUNLX0hFQURFUlMoW2Fzc2VydC5oIGN0eXBlLmggZGlyZW50LmggZXJybm8uaCBmY250bC5oIGZsb2F0LmggXAorICBnZXRvcHQuaCBpbnR0eXBlcy5oIGxhbmdpbmZvLmggbGliZ2VuLmggbGltaXRzLmggbG9jYWxlLmggcGF0aHMuaCBcCisgIHNpZ25hbC5oIHN0ZGFyZy5oIHN0ZGRlZi5oIHN0ZGlvLmggc3RkbGliLmggc3RyaW5nLmggc3lzL2ZpbGUuaCBcCisgIHN5cy9pb2N0bC5oIHN5c2xvZy5oIHN5cy9tbWFuLmggc3lzL3BhcmFtLmggc3lzL3Jlc291cmNlLmggc3lzL3N0YXQuaCBcCisgIHN5cy90aW1lLmggc3lzL3R5cGVzLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHRpbWUuaCBcCisgIHVuaXN0ZC5oXSwgLCBbQUNfTVNHX0VSUk9SKGJhaWxpbmcgb3V0KV0pCisKK0FDX0NIRUNLX0hFQURFUlModGVybWlvcy5oIHN5cy9zdGF0dmZzLmggc3lzL3RpbWVyZmQuaCBsaW51eC9tYWdpYy5oIGxpbnV4L2ZpZW1hcC5oKQorCitjYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCUFDX0NIRUNLX0hFQURFUlMoYXNtL2J5dGVvcmRlci5oIGxpbnV4L2ZzLmggbWFsbG9jLmgsLEFDX01TR19FUlJPUihiYWlsaW5nIG91dCkpIDs7CisJZGFyd2luKikKKwkJQUNfQ0hFQ0tfSEVBREVSUyhtYWNoaW5lL2VuZGlhbi5oIHN5cy9kaXNrLmgsLEFDX01TR19FUlJPUihiYWlsaW5nIG91dCkpIDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19DT05TVAorQUNfQ19JTkxJTkUKK0FDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X3JkZXZdKQorQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0pCitBQ19TVFJVQ1RfVE0KK0FDX1RZUEVfT0ZGX1QKK0FDX1RZUEVfUElEX1QKK0FDX1RZUEVfU0lHTkFMCitBQ19UWVBFX1NJWkVfVAorQUNfVFlQRV9NT0RFX1QKK0FDX1RZUEVfSU5UOF9UCitBQ19UWVBFX0lOVDE2X1QKK0FDX1RZUEVfSU5UMzJfVAorQUNfVFlQRV9JTlQ2NF9UCitBQ19UWVBFX1NTSVpFX1QKK0FDX1RZUEVfVUlEX1QKK0FDX1RZUEVfVUlOVDhfVAorQUNfVFlQRV9VSU5UMTZfVAorQUNfVFlQRV9VSU5UMzJfVAorQUNfVFlQRV9VSU5UNjRfVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIENoZWNrIGZvciBmdW5jdGlvbnMKK0FDX0NIRUNLX0ZVTkNTKFtmdHJ1bmNhdGUgZ2V0aG9zdG5hbWUgZ2V0cGFnZXNpemUgZ2V0dGltZW9mZGF5IGxvY2FsdGltZV9yIFwKKyAgbWVtY2hyIG1lbXNldCBta2RpciBta2ZpZm8gbXVubWFwIG5sX2xhbmdpbmZvIHJlYWxwYXRoIHJtZGlyIHNldGVudiBcCisgIHNldGxvY2FsZSBzdHJjYXNlY21wIHN0cmNociBzdHJjc3BuIHN0cmR1cCBzdHJlcnJvciBzdHJuY2FzZWNtcCBzdHJuZHVwIFwKKyAgc3RycmNociBzdHJzcG4gc3Ryc3RyIHN0cnRvbCBzdHJ0b3VsIHVuYW1lXSwgLCBbQUNfTVNHX0VSUk9SKGJhaWxpbmcgb3V0KV0pCitBQ19GVU5DX0FMTE9DQQorQUNfRlVOQ19DTE9TRURJUl9WT0lECitBQ19GVU5DX0NIT1dOCitBQ19GVU5DX0ZPUksKK0FDX0ZVTkNfTFNUQVQKK0FDX0ZVTkNfTUFMTE9DCitBQ19GVU5DX01FTUNNUAorQUNfRlVOQ19NS1RJTUUKK0FDX0ZVTkNfTU1BUAorQUNfRlVOQ19SRUFMTE9DCitBQ19GVU5DX1NUQVQKK0FDX0ZVTkNfU1RSVE9ECitBQ19GVU5DX1ZQUklOVEYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBEaXNhYmxlIGRlcGVuZGVuY3kgdHJhY2tpbmcKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBkZXBlbmRlbmN5IHRyYWNraW5nKQorQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZ10sCisJCQkgICAgIFtzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQuXSksCisJICAgICAgVVNFX1RSQUNLSU5HPSRlbmFibGV2YWwsIFVTRV9UUkFDS0lORz15ZXMpCitBQ19NU0dfUkVTVUxUKCRVU0VfVFJBQ0tJTkcpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlcyBzdGF0aWNhbGx5LWxpbmtlZCB0b29scworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gdXNlIHN0YXRpYyBsaW5raW5nKQorQUNfQVJHX0VOQUJMRShzdGF0aWNfbGluaywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljX2xpbmtdLAorCQkJICAgICBbdXNlIHRoaXMgdG8gbGluayB0aGUgdG9vbHMgdG8gdGhlaXIgbGlicmFyaWVzCisJCQkgICAgICBzdGF0aWNhbGx5IChkZWZhdWx0IGlzIGR5bmFtaWMgbGlua2luZ10pLAorCSAgICAgIFNUQVRJQ19MSU5LPSRlbmFibGV2YWwsIFNUQVRJQ19MSU5LPW5vKQorQUNfTVNHX1JFU1VMVCgkU1RBVElDX0xJTkspCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgaWYgY29tcGlsZXIvbGlua2VyIHN1cHBvcnRzIFBJRSBhbmQgUkVMUk8KK0FDX1RSWV9DQ0ZMQUcoWy1waWVdLCBbSEFWRV9QSUVdLCBbXSwgW10pCitBQ19TVUJTVChIQVZFX1BJRSkKK0FDX1RSWV9MREZMQUdTKFstV2wsLXoscmVscm8sLXosbm93XSwgW0hBVkVfRlVMTF9SRUxST10sIFtdLCBbXSkKK0FDX1NVQlNUKEhBVkVfRlVMTF9SRUxSTykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBQcmVmaXggaXMgL3VzciBieSBkZWZhdWx0LCB0aGUgZXhlY19wcmVmaXggZGVmYXVsdCBpcyBzZXR1cCBsYXRlcgorQUNfUFJFRklYX0RFRkFVTFQoL3VzcikKK2lmIHRlc3QgIiRwcmVmaXgiID0gTk9ORTsgdGhlbgorICBkYXRhcm9vdGRpcj0ke2FjX2RlZmF1bHRfcHJlZml4fS9zaGFyZQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBTZXR1cCB0aGUgb3duZXJzaGlwIG9mIHRoZSBmaWxlcworQUNfTVNHX0NIRUNLSU5HKGZpbGUgb3duZXIpCitBQ19BUkdfV0lUSCh1c2VyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXVzZXI9VVNFUl0sCisJCQkgICBbc2V0IHRoZSBvd25lciBvZiBpbnN0YWxsZWQgZmlsZXMgW1VTRVI9XV0pLAorCSAgICBPV05FUj0kd2l0aHZhbCkKK0FDX01TR19SRVNVTFQoJE9XTkVSKQordGVzdCAtbiAiJE9XTkVSIiAmJiBJTlNUQUxMPSIkSU5TVEFMTCAtbyAkT1dORVIiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gU2V0dXAgdGhlIGdyb3VwIG93bmVyc2hpcCBvZiB0aGUgZmlsZXMKK0FDX01TR19DSEVDS0lORyhncm91cCBvd25lcikKK0FDX0FSR19XSVRIKGdyb3VwLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWdyb3VwPUdST1VQXSwKKwkJCSAgIFtzZXQgdGhlIGdyb3VwIG93bmVyIG9mIGluc3RhbGxlZCBmaWxlcyBbR1JPVVA9XV0pLAorCSAgICBHUk9VUD0kd2l0aHZhbCkKK0FDX01TR19SRVNVTFQoJEdST1VQKQordGVzdCAtbiAiJEdST1VQIiAmJiBJTlNUQUxMPSIkSU5TVEFMTCAtZyAkR1JPVVAiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gU2V0dXAgZGV2aWNlIG5vZGUgb3duZXJzaGlwCitBQ19NU0dfQ0hFQ0tJTkcoZGV2aWNlIG5vZGUgdWlkKQorCitBQ19BUkdfV0lUSChkZXZpY2UtdWlkLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWRldmljZS11aWQ9VUlEXSwKKwkJCSAgIFtzZXQgdGhlIG93bmVyIHVzZWQgZm9yIG5ldyBkZXZpY2Ugbm9kZXMgW1VJRD0wXV0pLAorCSAgICBETV9ERVZJQ0VfVUlEPSR3aXRodmFsLCBETV9ERVZJQ0VfVUlEPTApCitBQ19NU0dfUkVTVUxUKCRETV9ERVZJQ0VfVUlEKQorQUNfREVGSU5FX1VOUVVPVEVEKFtETV9ERVZJQ0VfVUlEXSwgWyRETV9ERVZJQ0VfVUlEXSwgW0RlZmluZSBkZWZhdWx0IG93bmVyIGZvciBkZXZpY2Ugbm9kZV0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gU2V0dXAgZGV2aWNlIGdyb3VwIG93bmVyc2hpcAorQUNfTVNHX0NIRUNLSU5HKGRldmljZSBub2RlIGdpZCkKKworQUNfQVJHX1dJVEgoZGV2aWNlLWdpZCwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZXZpY2UtZ2lkPUdJRF0sCisJCQkgICBbc2V0IHRoZSBncm91cCB1c2VkIGZvciBuZXcgZGV2aWNlIG5vZGVzIFtHSUQ9MF1dKSwKKwkgICAgRE1fREVWSUNFX0dJRD0kd2l0aHZhbCwgRE1fREVWSUNFX0dJRD0wKQorQUNfTVNHX1JFU1VMVCgkRE1fREVWSUNFX0dJRCkKK0FDX0RFRklORV9VTlFVT1RFRChbRE1fREVWSUNFX0dJRF0sIFskRE1fREVWSUNFX0dJRF0sIFtEZWZpbmUgZGVmYXVsdCBncm91cCBmb3IgZGV2aWNlIG5vZGVdKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIFNldHVwIGRldmljZSBtb2RlCitBQ19NU0dfQ0hFQ0tJTkcoZGV2aWNlIG5vZGUgbW9kZSkKKworQUNfQVJHX1dJVEgoZGV2aWNlLW1vZGUsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGV2aWNlLW1vZGU9TU9ERV0sCisJCQkgICBbc2V0IHRoZSBtb2RlIHVzZWQgZm9yIG5ldyBkZXZpY2Ugbm9kZXMgW01PREU9MDYwMF1dKSwKKwkgICAgRE1fREVWSUNFX01PREU9JHdpdGh2YWwsIERNX0RFVklDRV9NT0RFPTA2MDApCitBQ19NU0dfUkVTVUxUKCRETV9ERVZJQ0VfTU9ERSkKK0FDX0RFRklORV9VTlFVT1RFRChbRE1fREVWSUNFX01PREVdLCBbJERNX0RFVklDRV9NT0RFXSwgW0RlZmluZSBkZWZhdWx0IG1vZGUgZm9yIGRldmljZSBub2RlXSkKKworQUNfTVNHX0NIRUNLSU5HKHdoZW4gdG8gY3JlYXRlIGRldmljZSBub2RlcykKK0FDX0FSR19XSVRIKGRldmljZS1ub2Rlcy1vbiwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZXZpY2Utbm9kZXMtb249T05dLAorCQkJICAgW2NyZWF0ZSBub2RlcyBvbiByZXN1bWUgb3IgY3JlYXRlIFtPTj1yZXN1bWVdXSksCisJICAgIEFERF9OT0RFPSR3aXRodmFsLCBBRERfTk9ERT1yZXN1bWUpCitjYXNlICIkQUREX05PREUiIGluCisgcmVzdW1lKSBhZGRfb249RE1fQUREX05PREVfT05fUkVTVU1FOzsKKyBjcmVhdGUpIGFkZF9vbj1ETV9BRERfTk9ERV9PTl9DUkVBVEU7OworICopIEFDX01TR19FUlJPUihbLS13aXRoLWRldmljZS1ub2Rlcy1vbiBwYXJhbWV0ZXIgaW52YWxpZF0pOzsKK2VzYWMKK0FDX01TR19SRVNVTFQob24gJEFERF9OT0RFKQorQUNfREVGSU5FX1VOUVVPVEVEKFtERUZBVUxUX0RNX0FERF9OT0RFXSwgJGFkZF9vbiwgW0RlZmluZSBkZWZhdWx0IG5vZGUgY3JlYXRpb24gYmVoYXZpb3Igd2l0aCBkbXNldHVwIGNyZWF0ZV0pCisKK0FDX01TR19DSEVDS0lORyhkZWZhdWx0IG5hbWUgbWFuZ2xpbmcpCitBQ19BUkdfV0lUSChkZWZhdWx0LW5hbWUtbWFuZ2xpbmcsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1uYW1lLW1hbmdsaW5nPU1BTkdMSU5HXSwKKwkJCSAgIFtkZWZhdWx0IG5hbWUgbWFuZ2xpbmc6IGF1dG8vbm9uZS9oZXggW2F1dG9dXSksCisJICAgIE1BTkdMSU5HPSR3aXRodmFsLCBNQU5HTElORz1hdXRvKQorY2FzZSAiJE1BTkdMSU5HIiBpbgorIGF1dG8pIG1hbmdsaW5nPURNX1NUUklOR19NQU5HTElOR19BVVRPOzsKKyBub25lfGRpc2FibGVkKSBtYW5nbGluZz1ETV9TVFJJTkdfTUFOR0xJTkdfTk9ORTs7CisgaGV4KSBtYW5nbGluZz1ETV9TVFJJTkdfTUFOR0xJTkdfSEVYOzsKKyAqKSBBQ19NU0dfRVJST1IoWy0td2l0aC1kZWZhdWx0LW5hbWUtbWFuZ2xpbmcgcGFyYW1ldGVyIGludmFsaWRdKTs7Citlc2FjCitBQ19NU0dfUkVTVUxUKCRNQU5HTElORykKK0FDX0RFRklORV9VTlFVT1RFRChbREVGQVVMVF9ETV9OQU1FX01BTkdMSU5HXSwgJG1hbmdsaW5nLCBbRGVmaW5lIGRlZmF1bHQgbmFtZSBtYW5nbGluZyBiZWhhdmlvdXJdKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIExWTTEgdG9vbCBmYWxsYmFjayBvcHRpb24KK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBsdm0xIGZhbGxiYWNrKQorQUNfQVJHX0VOQUJMRShsdm0xX2ZhbGxiYWNrLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sdm0xX2ZhbGxiYWNrXSwKKwkJCSAgICAgW3VzZSB0aGlzIHRvIGZhbGwgYmFjayBhbmQgdXNlIExWTTEgYmluYXJpZXMgaWYKKwkJCSAgICAgIGRldmljZS1tYXBwZXIgaXMgbWlzc2luZyBmcm9tIHRoZSBrZXJuZWxdKSwKKwkgICAgICBMVk0xX0ZBTExCQUNLPSRlbmFibGV2YWwsIExWTTFfRkFMTEJBQ0s9bm8pCitBQ19NU0dfUkVTVUxUKCRMVk0xX0ZBTExCQUNLKQorCitpZiB0ZXN0ICIkTFZNMV9GQUxMQkFDSyIgPSB5ZXM7IHRoZW4KKwlERUZBVUxUX0ZBTExCQUNLX1RPX0xWTTE9MQorCUFDX0RFRklORShbTFZNMV9GQUxMQkFDS10sIDEsIFtEZWZpbmUgdG8gMSBpZiAnbHZtJyBzaG91bGQgZmFsbCBiYWNrIHRvIHVzaW5nIExWTTEgYmluYXJpZXMgaWYgZGV2aWNlLW1hcHBlciBpcyBtaXNzaW5nIGZyb20gdGhlIGtlcm5lbF0pCitlbHNlCisJREVGQVVMVF9GQUxMQkFDS19UT19MVk0xPTAKK2ZpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9GQUxMQkFDS19UT19MVk0xLCBbJERFRkFVTFRfRkFMTEJBQ0tfVE9fTFZNMV0sCisJCSAgIFtGYWxsIGJhY2sgdG8gTFZNMSBieSBkZWZhdWx0IGlmIGRldmljZS1tYXBwZXIgaXMgbWlzc2luZyBmcm9tIHRoZSBrZXJuZWwuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBmb3JtYXQxIGluY2x1c2lvbiB0eXBlCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGx2bTEgbWV0YWRhdGEpCitBQ19BUkdfV0lUSChsdm0xLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWx2bTE9VFlQRV0sCisJCQkgICBbTFZNMSBtZXRhZGF0YSBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdXSksCisJICAgIExWTTE9JHdpdGh2YWwsIExWTTE9aW50ZXJuYWwpCisKK0FDX01TR19SRVNVTFQoJExWTTEpCisKK2Nhc2UgIiRMVk0xIiBpbgorICBub25lfHNoYXJlZCkgOzsKKyAgaW50ZXJuYWwpIEFDX0RFRklORShbTFZNMV9JTlRFUk5BTF0sIDEsCisJCSAgICAgIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIExWTTEgbWV0YWRhdGEuXSkgOzsKKyAgKikgQUNfTVNHX0VSUk9SKFstLXdpdGgtbHZtMSBwYXJhbWV0ZXIgaW52YWxpZF0pIDs7Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gZm9ybWF0X3Bvb2wgaW5jbHVzaW9uIHR5cGUKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgR0ZTIHBvb2wgbWV0YWRhdGEpCitBQ19BUkdfV0lUSChwb29sLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXBvb2w9VFlQRV0sCisJCQkgICBbR0ZTIHBvb2wgcmVhZC1vbmx5IHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF1dKSwKKwkgICAgUE9PTD0kd2l0aHZhbCwgUE9PTD1pbnRlcm5hbCkKK0FDX01TR19SRVNVTFQoJFBPT0wpCisKK2Nhc2UgIiRQT09MIiBpbgorICBub25lfHNoYXJlZCkgOzsKKyAgaW50ZXJuYWwpIEFDX0RFRklORShbUE9PTF9JTlRFUk5BTF0sIDEsCisJCSAgICAgIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIEdGUyBwb29sIG1ldGFkYXRhLl0pIDs7CisgICopIEFDX01TR19FUlJPUihbLS13aXRoLXBvb2wgcGFyYW1ldGVyIGludmFsaWRdKQorZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIGNsdXN0ZXJfbG9ja2luZyBpbmNsdXNpb24gdHlwZQorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBjbHVzdGVyIGxvY2tpbmcpCitBQ19BUkdfV0lUSChjbHVzdGVyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWNsdXN0ZXI9VFlQRV0sCisJCQkgICBbY2x1c3RlciBMVk0gbG9ja2luZyBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdXSksCisJICAgIENMVVNURVI9JHdpdGh2YWwpCitBQ19NU0dfUkVTVUxUKCRDTFVTVEVSKQorCitjYXNlICIkQ0xVU1RFUiIgaW4KKyAgbm9uZXxzaGFyZWQpIDs7CisgIGludGVybmFsKSBBQ19ERUZJTkUoW0NMVVNURVJfTE9DS0lOR19JTlRFUk5BTF0sIDEsCisJCSAgICAgIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIGNsdXN0ZXJlZCBMVk0gbG9ja2luZy5dKSA7OworICAqKSBBQ19NU0dfRVJST1IoWy0td2l0aC1jbHVzdGVyIHBhcmFtZXRlciBpbnZhbGlkXSkgOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBzbmFwc2hvdHMgaW5jbHVzaW9uIHR5cGUKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGluY2x1ZGUgc25hcHNob3RzKQorQUNfQVJHX1dJVEgoc25hcHNob3RzLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXNuYXBzaG90cz1UWVBFXSwKKwkJCSAgIFtzbmFwc2hvdCBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdXSksCisJICAgIFNOQVBTSE9UUz0kd2l0aHZhbCwgU05BUFNIT1RTPWludGVybmFsKQorQUNfTVNHX1JFU1VMVCgkU05BUFNIT1RTKQorCitjYXNlICIkU05BUFNIT1RTIiBpbgorICBub25lfHNoYXJlZCkgOzsKKyAgaW50ZXJuYWwpIEFDX0RFRklORShbU05BUFNIT1RfSU5URVJOQUxdLCAxLAorCQkgICAgICBbRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBidWlsdC1pbiBzdXBwb3J0IGZvciBzbmFwc2hvdHMuXSkgOzsKKyAgKikgQUNfTVNHX0VSUk9SKFstLXdpdGgtc25hcHNob3RzIHBhcmFtZXRlciBpbnZhbGlkXSkgOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBtaXJyb3JzIGluY2x1c2lvbiB0eXBlCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBpbmNsdWRlIG1pcnJvcnMpCitBQ19BUkdfV0lUSChtaXJyb3JzLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLW1pcnJvcnM9VFlQRV0sCisJCQkgICBbbWlycm9yIHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF1dKSwKKwkgICAgTUlSUk9SUz0kd2l0aHZhbCwgTUlSUk9SUz1pbnRlcm5hbCkKK0FDX01TR19SRVNVTFQoJE1JUlJPUlMpCisKK2Nhc2UgIiRNSVJST1JTIiBpbgorICBub25lfHNoYXJlZCkgOzsKKyAgaW50ZXJuYWwpIEFDX0RFRklORShbTUlSUk9SRURfSU5URVJOQUxdLCAxLAorCQkgICAgICBbRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBidWlsdC1pbiBzdXBwb3J0IGZvciBtaXJyb3JzLl0pIDs7CisgICopIEFDX01TR19FUlJPUihbLS13aXRoLW1pcnJvcnMgcGFyYW1ldGVyIGludmFsaWRdKSA7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIHJhaWQgaW5jbHVzaW9uIHR5cGUKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGluY2x1ZGUgcmFpZCkKK0FDX0FSR19XSVRIKHJhaWQsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtcmFpZD1UWVBFXSwKKwkJCSAgIFtyYWlkIHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF1dKSwKKwkgICAgUkFJRD0kd2l0aHZhbCwgUkFJRD1pbnRlcm5hbCkKK0FDX01TR19SRVNVTFQoJFJBSUQpCisKK0FDX0FSR19XSVRIKGRlZmF1bHQtbWlycm9yLXNlZ3R5cGUsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1taXJyb3Itc2VndHlwZT1UWVBFXSwKKwkJCSAgIFtkZWZhdWx0IG1pcnJvciBzZWd0eXBlOiByYWlkMS9taXJyb3IgW3JhaWQxXV0pLAorCQkJICAgREVGQVVMVF9NSVJST1JfU0VHVFlQRT0kd2l0aHZhbCwgREVGQVVMVF9NSVJST1JfU0VHVFlQRT0icmFpZDEiKQorQUNfQVJHX1dJVEgoZGVmYXVsdC1yYWlkMTAtc2VndHlwZSwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LXJhaWQxMC1zZWd0eXBlPVRZUEVdLAorCQkJICAgW2RlZmF1bHQgbWlycm9yIHNlZ3R5cGU6IHJhaWQxMC9taXJyb3IgW3JhaWQxMF1dKSwKKwkJCSAgIERFRkFVTFRfUkFJRDEwX1NFR1RZUEU9JHdpdGh2YWwsIERFRkFVTFRfUkFJRDEwX1NFR1RZUEU9InJhaWQxMCIpCitjYXNlICIkUkFJRCIgaW4KKyAgbm9uZSkgIHRlc3QgIiRERUZBVUxUX01JUlJPUl9TRUdUWVBFIiA9ICJyYWlkMSIgJiYgREVGQVVMVF9NSVJST1JfU0VHVFlQRT0ibWlycm9yIgorCXRlc3QgIiRERUZBVUxUX1JBSUQxMF9TRUdUWVBFIiA9ICJyYWlkMTAiICYmIERFRkFVTFRfUkFJRDEwX1NFR1RZUEU9Im1pcnJvciIgOzsKKyAgc2hhcmVkKSA7OworICBpbnRlcm5hbCkgQUNfREVGSU5FKFtSQUlEX0lOVEVSTkFMXSwgMSwKKwkJICAgICAgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgcmFpZC5dKSA7OworICAqKSBBQ19NU0dfRVJST1IoWy0td2l0aC1yYWlkIHBhcmFtZXRlciBpbnZhbGlkXSkgOzsKK2VzYWMKKworQUNfREVGSU5FX1VOUVVPVEVEKFtERUZBVUxUX01JUlJPUl9TRUdUWVBFXSwgWyIkREVGQVVMVF9NSVJST1JfU0VHVFlQRSJdLAorCQkgICBbRGVmYXVsdCBzZWd0eXBlIHVzZWQgZm9yIG1pcnJvciB2b2x1bWVzLl0pCisKK0FDX0RFRklORV9VTlFVT1RFRChbREVGQVVMVF9SQUlEMTBfU0VHVFlQRV0sIFsiJERFRkFVTFRfUkFJRDEwX1NFR1RZUEUiXSwKKwkJICAgW0RlZmF1bHQgc2VndHlwZSB1c2VkIGZvciByYWlkMTAgdm9sdW1lcy5dKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIGFzeW5jaHJvbm91cyB2b2x1bWUgcmVwbGljYXRvciBpbmNsdXNpb24gdHlwZQorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gaW5jbHVkZSByZXBsaWNhdG9ycykKK0FDX0FSR19XSVRIKHJlcGxpY2F0b3JzLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXJlcGxpY2F0b3JzPVRZUEVdLAorCQkJICAgW3JlcGxpY2F0b3Igc3VwcG9ydDogaW50ZXJuYWwvc2hhcmVkL25vbmUgW25vbmVdXSksCisJICAgIFJFUExJQ0FUT1JTPSR3aXRodmFsLCBSRVBMSUNBVE9SUz1ub25lKQorQUNfTVNHX1JFU1VMVCgkUkVQTElDQVRPUlMpCisKK2Nhc2UgIiRSRVBMSUNBVE9SUyIgaW4KKyAgbm9uZXxzaGFyZWQpIDs7CisgIGludGVybmFsKSBBQ19ERUZJTkUoW1JFUExJQ0FUT1JfSU5URVJOQUxdLCAxLAorCQlbRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBidWlsdC1pbiBzdXBwb3J0IGZvciByZXBsaWNhdG9ycy5dKSA7OworICAqKSBBQ19NU0dfRVJST1IoWy0td2l0aC1yZXBsaWNhdG9ycyBwYXJhbWV0ZXIgaW52YWxpZCAoJFJFUExJQ0FUT1JTKV0pIDs7Citlc2FjCisKKworQUNfQVJHX1dJVEgoZGVmYXVsdC1zcGFyc2Utc2VndHlwZSwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LXNwYXJzZS1zZWd0eXBlPVRZUEVdLAorCQkJICAgW2RlZmF1bHQgc3BhcnNlIHNlZ3R5cGU6IHRoaW4vc25hcHNob3QgW3RoaW5dXSksCisJCQkgICBERUZBVUxUX1NQQVJTRV9TRUdUWVBFPSR3aXRodmFsLCBERUZBVUxUX1NQQVJTRV9TRUdUWVBFPSJ0aGluIikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSB0aGluIHByb3Zpc2lvbmluZworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gaW5jbHVkZSB0aGluIHByb3Zpc2lvbmluZykKK0FDX0FSR19XSVRIKHRoaW4sCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGhpbj1UWVBFXSwKKwkJCSAgIFt0aGluIHByb3Zpc2lvbmluZyBzdXBwb3J0OiBpbnRlcm5hbC9zaGFyZWQvbm9uZSBbaW50ZXJuYWxdXSksCisJICAgIFRISU49JHdpdGh2YWwsIFRISU49aW50ZXJuYWwpCitBQ19BUkdfV0lUSCh0aGluLWNoZWNrLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXRoaW4tY2hlY2s9UEFUSF0sCisJCQkgICBbdGhpbl9jaGVjayB0b29sOiBbYXV0b2RldGVjdF1dKSwKKwkJCSAgIFRISU5fQ0hFQ0tfQ01EPSR3aXRodmFsLCBUSElOX0NIRUNLX0NNRD0iYXV0b2RldGVjdCIpCitBQ19BUkdfV0lUSCh0aGluLWR1bXAsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGhpbi1kdW1wPVBBVEhdLAorCQkJICAgW3RoaW5fZHVtcCB0b29sOiBbYXV0b2RldGVjdF1dKSwKKwkJCSAgIFRISU5fRFVNUF9DTUQ9JHdpdGh2YWwsIFRISU5fRFVNUF9DTUQ9ImF1dG9kZXRlY3QiKQorQUNfQVJHX1dJVEgodGhpbi1yZXBhaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGhpbi1yZXBhaXI9UEFUSF0sCisJCQkgICBbdGhpbl9yZXBhaXIgdG9vbDogW2F1dG9kZXRlY3RdXSksCisJCQkgICBUSElOX1JFUEFJUl9DTUQ9JHdpdGh2YWwsIFRISU5fUkVQQUlSX0NNRD0iYXV0b2RldGVjdCIpCitBQ19BUkdfV0lUSCh0aGluLXJlc3RvcmUsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtdGhpbi1yZXN0b3JlPVBBVEhdLAorCQkJICAgW3RoaW5fcmVzdG9yZSB0b29sOiBbYXV0b2RldGVjdF1dKSwKKwkJCSAgIFRISU5fUkVTVE9SRV9DTUQ9JHdpdGh2YWwsIFRISU5fUkVTVE9SRV9DTUQ9ImF1dG9kZXRlY3QiKQorCitBQ19NU0dfUkVTVUxUKCRUSElOKQorCitjYXNlICIkVEhJTiIgaW4KKyAgbm9uZSkgIHRlc3QgIiRERUZBVUxUX1NQQVJTRV9TRUdUWVBFIiA9ICJ0aGluIiAmJiBERUZBVUxUX1NQQVJTRV9TRUdUWVBFPSJzbmFwc2hvdCIgOzsKKyAgc2hhcmVkKSA7OworICBpbnRlcm5hbCkgQUNfREVGSU5FKFtUSElOX0lOVEVSTkFMXSwgMSwKKwkJICAgICAgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgdGhpbiBwcm92aXNpb25pbmcuXSkgOzsKKyAgKikgQUNfTVNHX0VSUk9SKFstLXdpdGgtdGhpbiBwYXJhbWV0ZXIgaW52YWxpZCAoJFRISU4pXSkgOzsKK2VzYWMKKworQUNfREVGSU5FX1VOUVVPVEVEKFtERUZBVUxUX1NQQVJTRV9TRUdUWVBFXSwgWyIkREVGQVVMVF9TUEFSU0VfU0VHVFlQRSJdLAorCQkgICBbRGVmYXVsdCBzZWd0eXBlIHVzZWQgZm9yIHNwYXJzZSB2b2x1bWVzLl0pCisKK2RubCAtLSB0aGluX2NoZWNrIG5lZWRzLWNoZWNrIGZsYWcKK0FDX0FSR19FTkFCTEUodGhpbl9jaGVja19uZWVkc19jaGVjaywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXRoaW5fY2hlY2tfbmVlZHNfY2hlY2tdLAorCQkJICAgICBbcmVxdWlyZWQgaWYgdGhpbl9jaGVjayB2ZXJzaW9uIGlzIDwgMC4zLjBdKSwKKwkgICAgICBUSElOX0NIRUNLX05FRURTX0NIRUNLPSRlbmFibGV2YWwsIFRISU5fQ0hFQ0tfTkVFRFNfQ0hFQ0s9eWVzKQorCisjIFRlc3QgaWYgbmVjZXNzYXJ5IHRoaW4gdG9vbHMgYXJlIGF2YWlsYWJsZQorIyBpZiBub3QgLSB1c2UgcGxhaW4gZGVmYXVsdHMgYW5kIHdhcm4gdXNlcgorY2FzZSAiJFRISU4iIGluCisgIGludGVybmFsfHNoYXJlZCkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgdGhpbiBjaGVja2luZworCWlmIHRlc3QgIiRUSElOX0NIRUNLX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJQUNfUEFUSF9UT09MKFRISU5fQ0hFQ0tfQ01ELCB0aGluX2NoZWNrKQorCQlpZiB0ZXN0IC16ICIkVEhJTl9DSEVDS19DTUQiOyB0aGVuCisJCQlBQ19NU0dfV0FSTihbdGhpbl9jaGVjayBub3QgZm91bmQgaW4gcGF0aCAkUEFUSF0pCisJCQlUSElOX0NIRUNLX0NNRD0vdXNyL3NiaW4vdGhpbl9jaGVjaworCQkJVEhJTl9DT05GSUdVUkVfV0FSTj15CisJCWZpCisJZmkKKwlpZiB0ZXN0ICIkVEhJTl9DSEVDS19ORUVEU19DSEVDSyIgPSB5ZXM7IHRoZW4KKwkJVEhJTl9DSEVDS19WU049YCIkVEhJTl9DSEVDS19DTUQiIC1WIDI+L2Rldi9udWxsYAorCQlUSElOX0NIRUNLX1ZTTl9NQUpPUj1gZWNobyAiJFRISU5fQ0hFQ0tfVlNOIiB8ICRBV0sgLUYgJy4nICd7cHJpbnQgJDF9J2AKKwkJVEhJTl9DSEVDS19WU05fTUlOT1I9YGVjaG8gIiRUSElOX0NIRUNLX1ZTTiIgfCAkQVdLIC1GICcuJyAne3ByaW50ICQyfSdgCisKKwkJaWYgdGVzdCAteiAiJFRISU5fQ0hFQ0tfVlNOX01BSk9SIiAtbyAteiAiJFRISU5fQ0hFQ0tfVlNOX01JTk9SIjsgdGhlbgorCQkJQUNfTVNHX1dBUk4oWyRUSElOX0NIRUNLX0NNRDogQmFkIHZlcnNpb24gIiRUSElOX0NIRUNLX1ZTTiIgZm91bmRdKQorCQkJVEhJTl9DSEVDS19WRVJTSU9OX1dBUk49eQorCQkJVEhJTl9DSEVDS19ORUVEU19DSEVDSz1ubworCQllbGlmIHRlc3QgIiRUSElOX0NIRUNLX1ZTTl9NQUpPUiIgLWVxIDAgLWEgIiRUSElOX0NIRUNLX1ZTTl9NSU5PUiIgLWx0IDM7IHRoZW4KKwkJCUFDX01TR19XQVJOKFskVEhJTl9DSEVDS19DTUQ6IE9sZCB2ZXJzaW9uICIkVEhJTl9DSEVDS19WU04iIGZvdW5kXSkKKwkJCVRISU5fQ0hFQ0tfVkVSU0lPTl9XQVJOPXkKKwkJCVRISU5fQ0hFQ0tfTkVFRFNfQ0hFQ0s9bm8KKwkJZmkKKwlmaQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSB0aGluIGR1bXBpbmcKKwlpZiB0ZXN0ICIkVEhJTl9EVU1QX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJQUNfUEFUSF9UT09MKFRISU5fRFVNUF9DTUQsIHRoaW5fZHVtcCkKKwkJdGVzdCAteiAiJFRISU5fRFVNUF9DTUQiICYmIHsKKwkJCUFDX01TR19XQVJOKHRoaW5fZHVtcCBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCkKKwkJCVRISU5fRFVNUF9DTUQ9L3Vzci9zYmluL3RoaW5fZHVtcAorCQkJVEhJTl9DT05GSUdVUkVfV0FSTj15CisJCX0KKwlmaQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSB0aGluIHJlcGFpcmluZworCWlmIHRlc3QgIiRUSElOX1JFUEFJUl9DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCUFDX1BBVEhfVE9PTChUSElOX1JFUEFJUl9DTUQsIHRoaW5fcmVwYWlyKQorCQl0ZXN0IC16ICIkVEhJTl9SRVBBSVJfQ01EIiAmJiB7CisJCQlBQ19NU0dfV0FSTih0aGluX3JlcGFpciBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCkKKwkJCVRISU5fUkVQQUlSX0NNRD0vdXNyL3NiaW4vdGhpbl9yZXBhaXIKKwkJCVRISU5fQ09ORklHVVJFX1dBUk49eQorCQl9CisJZmkKKwkjIEVtcHR5IG1lYW5zIGEgY29uZmlnIHdheSB0byBpZ25vcmUgdGhpbiByZXN0b3JpbmcKKwlpZiB0ZXN0ICIkVEhJTl9SRVNUT1JFX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJQUNfUEFUSF9UT09MKFRISU5fUkVTVE9SRV9DTUQsIHRoaW5fcmVzdG9yZSkKKwkJdGVzdCAteiAiJFRISU5fUkVTVE9SRV9DTUQiICYmIHsKKwkJCUFDX01TR19XQVJOKHRoaW5fcmVzdG9yZSBub3QgZm91bmQgaW4gcGF0aCAkUEFUSCkKKwkJCVRISU5fUkVTVE9SRV9DTUQ9L3Vzci9zYmluL3RoaW5fcmVzdG9yZQorCQkJVEhJTl9DT05GSUdVUkVfV0FSTj15CisJCX0KKwlmaQorCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoaW5fY2hlY2sgc3VwcG9ydHMgdGhlIG5lZWRzLWNoZWNrIGZsYWddKQorCUFDX01TR19SRVNVTFQoWyRUSElOX0NIRUNLX05FRURTX0NIRUNLXSkKKwlpZiB0ZXN0ICIkVEhJTl9DSEVDS19ORUVEU19DSEVDSyIgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKFtUSElOX0NIRUNLX05FRURTX0NIRUNLXSwgMSwgW0RlZmluZSB0byAxIGlmIHRoZSBleHRlcm5hbCAndGhpbl9jaGVjaycgdG9vbCByZXF1aXJlcyB0aGUgLS1jbGVhci1uZWVkcy1jaGVjay1mbGFnIG9wdGlvbl0pCisJZmkKKworCTs7Citlc2FjCisKK0FDX0RFRklORV9VTlFVT1RFRChbVEhJTl9DSEVDS19DTURdLCBbIiRUSElOX0NIRUNLX0NNRCJdLAorCQkgICBbVGhlIHBhdGggdG8gJ3RoaW5fY2hlY2snLCBpZiBhdmFpbGFibGUuXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtUSElOX0RVTVBfQ01EXSwgWyIkVEhJTl9EVU1QX0NNRCJdLAorCQkgICBbVGhlIHBhdGggdG8gJ3RoaW5fZHVtcCcsIGlmIGF2YWlsYWJsZS5dKQorCitBQ19ERUZJTkVfVU5RVU9URUQoW1RISU5fUkVQQUlSX0NNRF0sIFsiJFRISU5fUkVQQUlSX0NNRCJdLAorCQkgICBbVGhlIHBhdGggdG8gJ3RoaW5fcmVwYWlyJywgaWYgYXZhaWxhYmxlLl0pCisKK0FDX0RFRklORV9VTlFVT1RFRChbVEhJTl9SRVNUT1JFX0NNRF0sIFsiJFRISU5fUkVTVE9SRV9DTUQiXSwKKwkJICAgW1RoZSBwYXRoIHRvICd0aGluX3Jlc3RvcmUnLCBpZiBhdmFpbGFibGUuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBjYWNoZSBpbmNsdXNpb24gdHlwZQorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gaW5jbHVkZSBjYWNoZSkKK0FDX0FSR19XSVRIKGNhY2hlLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWNhY2hlPVRZUEVdLAorCQkJICAgW2NhY2hlIHN1cHBvcnQ6IGludGVybmFsL3NoYXJlZC9ub25lIFtpbnRlcm5hbF1dKSwKKwkJCSAgIENBQ0hFPSR3aXRodmFsLCBDQUNIRT0iaW50ZXJuYWwiKQorQUNfQVJHX1dJVEgoY2FjaGUtY2hlY2ssCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY2FjaGUtY2hlY2s9UEFUSF0sCisJCQkgICBbY2FjaGVfY2hlY2sgdG9vbDogW2F1dG9kZXRlY3RdXSksCisJCQkgICBDQUNIRV9DSEVDS19DTUQ9JHdpdGh2YWwsIENBQ0hFX0NIRUNLX0NNRD0iYXV0b2RldGVjdCIpCitBQ19BUkdfV0lUSChjYWNoZS1kdW1wLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWNhY2hlLWR1bXA9UEFUSF0sCisJCQkgICBbY2FjaGVfZHVtcCB0b29sOiBbYXV0b2RldGVjdF1dKSwKKwkJCSAgIENBQ0hFX0RVTVBfQ01EPSR3aXRodmFsLCBDQUNIRV9EVU1QX0NNRD0iYXV0b2RldGVjdCIpCitBQ19BUkdfV0lUSChjYWNoZS1yZXBhaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY2FjaGUtcmVwYWlyPVBBVEhdLAorCQkJICAgW2NhY2hlX3JlcGFpciB0b29sOiBbYXV0b2RldGVjdF1dKSwKKwkJCSAgIENBQ0hFX1JFUEFJUl9DTUQ9JHdpdGh2YWwsIENBQ0hFX1JFUEFJUl9DTUQ9ImF1dG9kZXRlY3QiKQorQUNfQVJHX1dJVEgoY2FjaGUtcmVzdG9yZSwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jYWNoZS1yZXN0b3JlPVBBVEhdLAorCQkJICAgW2NhY2hlX3Jlc3RvcmUgdG9vbDogW2F1dG9kZXRlY3RdXSksCisJCQkgICBDQUNIRV9SRVNUT1JFX0NNRD0kd2l0aHZhbCwgQ0FDSEVfUkVTVE9SRV9DTUQ9ImF1dG9kZXRlY3QiKQorQUNfTVNHX1JFU1VMVCgkQ0FDSEUpCisKK2Nhc2UgIiRDQUNIRSIgaW4KKyBub25lfHNoYXJlZCkgOzsKKyBpbnRlcm5hbCkgQUNfREVGSU5FKFtDQUNIRV9JTlRFUk5BTF0sIDEsIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIGNhY2hlLl0pIDs7CisgKikgQUNfTVNHX0VSUk9SKFstLXdpdGgtY2FjaGUgcGFyYW1ldGVyIGludmFsaWRdKSA7OworZXNhYworCitkbmwgLS0gY2FjaGVfY2hlY2sgbmVlZHMtY2hlY2sgZmxhZworQUNfQVJHX0VOQUJMRShjYWNoZV9jaGVja19uZWVkc19jaGVjaywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWNhY2hlX2NoZWNrX25lZWRzX2NoZWNrXSwKKwkJCSAgICAgW3JlcXVpcmVkIGlmIGNhY2hlX2NoZWNrIHZlcnNpb24gaXMgPCAwLjVdKSwKKwkgICAgICBDQUNIRV9DSEVDS19ORUVEU19DSEVDSz0kZW5hYmxldmFsLCBDQUNIRV9DSEVDS19ORUVEU19DSEVDSz15ZXMpCisKKyMgVGVzdCBpZiBuZWNlc3NhcnkgY2FjaGUgdG9vbHMgYXJlIGF2YWlsYWJsZQorIyBpZiBub3QgLSB1c2UgcGxhaW4gZGVmYXVsdHMgYW5kIHdhcm4gdXNlcgorY2FzZSAiJENBQ0hFIiBpbgorICBpbnRlcm5hbHxzaGFyZWQpCisJIyBFbXB0eSBtZWFucyBhIGNvbmZpZyB3YXkgdG8gaWdub3JlIGNhY2hlIGNoZWNraW5nCisJaWYgdGVzdCAiJENBQ0hFX0NIRUNLX0NNRCIgPSAiYXV0b2RldGVjdCI7IHRoZW4KKwkJQUNfUEFUSF9UT09MKENBQ0hFX0NIRUNLX0NNRCwgY2FjaGVfY2hlY2spCisJCWlmIHRlc3QgLXogIiRDQUNIRV9DSEVDS19DTUQiOyB0aGVuCisJCQlBQ19NU0dfV0FSTihbY2FjaGVfY2hlY2sgbm90IGZvdW5kIGluIHBhdGggJFBBVEhdKQorCQkJQ0FDSEVfQ0hFQ0tfQ01EPS91c3Ivc2Jpbi9jYWNoZV9jaGVjaworCQkJQ0FDSEVfQ09ORklHVVJFX1dBUk49eQorCQlmaQorCWZpCisJaWYgdGVzdCAiJENBQ0hFX0NIRUNLX05FRURTX0NIRUNLIiA9IHllczsgdGhlbgorCQkkQ0FDSEVfQ0hFQ0tfQ01EIC1WIDI+L2Rldi9udWxsID5jb25mdGVzdC50bXAKKwkJcmVhZCAtciBDQUNIRV9DSEVDS19WU04gPCBjb25mdGVzdC50bXAKKwkJSUZTPS4tIHJlYWQgLXIgQ0FDSEVfQ0hFQ0tfVlNOX01BSk9SIENBQ0hFX0NIRUNLX1ZTTl9NSU5PUiBDQUNIRV9DSEVDS19WU05fUEFUQ0ggTEVGVE9WRVIgPCBjb25mdGVzdC50bXAKKwkJcm0gLWYgY29uZnRlc3QudG1wCisKKwkJIyBSZXF1aXJlIHZlcnNpb24gPj0gMC41LjQgZm9yIC0tY2xlYXItbmVlZHMtY2hlY2stZmxhZworCQlpZiB0ZXN0IC16ICIkQ0FDSEVfQ0hFQ0tfVlNOX01BSk9SIiBcCisJCQl8fCB0ZXN0IC16ICIkQ0FDSEVfQ0hFQ0tfVlNOX01JTk9SIiBcCisJCQl8fCB0ZXN0IC16ICIkQ0FDSEVfQ0hFQ0tfVlNOX1BBVENIIjsgdGhlbgorCQkJQUNfTVNHX1dBUk4oWyRDQUNIRV9DSEVDS19DTUQ6IEJhZCB2ZXJzaW9uICIkQ0FDSEVfQ0hFQ0tfVlNOIiBmb3VuZF0pCisJCQlDQUNIRV9DSEVDS19WRVJTSU9OX1dBUk49eQorCQkJQ0FDSEVfQ0hFQ0tfTkVFRFNfQ0hFQ0s9bm8KKwkJZWxpZiB0ZXN0ICIkQ0FDSEVfQ0hFQ0tfVlNOX01BSk9SIiAtZXEgMCA7IHRoZW4KKwkJCWlmIHRlc3QgIiRDQUNIRV9DSEVDS19WU05fTUlOT1IiIC1sdCA1IFwKKwkJCQl8fCB0ZXN0ICIkQ0FDSEVfQ0hFQ0tfVlNOX01JTk9SIiAtZXEgNSAtYSAiJENBQ0hFX0NIRUNLX1ZTTl9QQVRDSCIgLWx0IDQ7IHRoZW4KKwkJCQlBQ19NU0dfV0FSTihbJENBQ0hFX0NIRUNLX0NNRDogT2xkIHZlcnNpb24gIiRDQUNIRV9DSEVDS19WU04iIGZvdW5kXSkKKwkJCQlDQUNIRV9DSEVDS19WRVJTSU9OX1dBUk49eQorCQkJCUNBQ0hFX0NIRUNLX05FRURTX0NIRUNLPW5vCisJCQlmaQorCQlmaQorCWZpCisJIyBFbXB0eSBtZWFucyBhIGNvbmZpZyB3YXkgdG8gaWdub3JlIGNhY2hlIGR1bXBpbmcKKwlpZiB0ZXN0ICIkQ0FDSEVfRFVNUF9DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCUFDX1BBVEhfVE9PTChDQUNIRV9EVU1QX0NNRCwgY2FjaGVfZHVtcCkKKwkJdGVzdCAteiAiJENBQ0hFX0RVTVBfQ01EIiAmJiB7CisJCQlBQ19NU0dfV0FSTihjYWNoZV9kdW1wIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIKQorCQkJQ0FDSEVfRFVNUF9DTUQ9L3Vzci9zYmluL2NhY2hlX2R1bXAKKwkJCUNBQ0hFX0NPTkZJR1VSRV9XQVJOPXkKKwkJfQorCWZpCisJIyBFbXB0eSBtZWFucyBhIGNvbmZpZyB3YXkgdG8gaWdub3JlIGNhY2hlIHJlcGFpcmluZworCWlmIHRlc3QgIiRDQUNIRV9SRVBBSVJfQ01EIiA9ICJhdXRvZGV0ZWN0IjsgdGhlbgorCQlBQ19QQVRIX1RPT0woQ0FDSEVfUkVQQUlSX0NNRCwgY2FjaGVfcmVwYWlyKQorCQl0ZXN0IC16ICIkQ0FDSEVfUkVQQUlSX0NNRCIgJiYgeworCQkJQUNfTVNHX1dBUk4oY2FjaGVfcmVwYWlyIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIKQorCQkJQ0FDSEVfUkVQQUlSX0NNRD0vdXNyL3NiaW4vY2FjaGVfcmVwYWlyCisJCQlDQUNIRV9DT05GSUdVUkVfV0FSTj15CisJCX0KKwlmaQorCSMgRW1wdHkgbWVhbnMgYSBjb25maWcgd2F5IHRvIGlnbm9yZSBjYWNoZSByZXN0b3JpbmcKKwlpZiB0ZXN0ICIkQ0FDSEVfUkVTVE9SRV9DTUQiID0gImF1dG9kZXRlY3QiOyB0aGVuCisJCUFDX1BBVEhfVE9PTChDQUNIRV9SRVNUT1JFX0NNRCwgY2FjaGVfcmVzdG9yZSkKKwkJdGVzdCAteiAiJENBQ0hFX1JFU1RPUkVfQ01EIiAmJiB7CisJCQlBQ19NU0dfV0FSTihjYWNoZV9yZXN0b3JlIG5vdCBmb3VuZCBpbiBwYXRoICRQQVRIKQorCQkJQ0FDSEVfUkVTVE9SRV9DTUQ9L3Vzci9zYmluL2NhY2hlX3Jlc3RvcmUKKwkJCUNBQ0hFX0NPTkZJR1VSRV9XQVJOPXkKKwkJfQorCWZpCisKKwlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgY2FjaGVfY2hlY2sgc3VwcG9ydHMgdGhlIG5lZWRzLWNoZWNrIGZsYWddKQorCUFDX01TR19SRVNVTFQoWyRDQUNIRV9DSEVDS19ORUVEU19DSEVDS10pCisJaWYgdGVzdCAiJENBQ0hFX0NIRUNLX05FRURTX0NIRUNLIiA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoW0NBQ0hFX0NIRUNLX05FRURTX0NIRUNLXSwgMSwgW0RlZmluZSB0byAxIGlmIHRoZSBleHRlcm5hbCAnY2FjaGVfY2hlY2snIHRvb2wgcmVxdWlyZXMgdGhlIC0tY2xlYXItbmVlZHMtY2hlY2stZmxhZyBvcHRpb25dKQorCWZpCisJOzsKK2VzYWMKKworQUNfREVGSU5FX1VOUVVPVEVEKFtDQUNIRV9DSEVDS19DTURdLCBbIiRDQUNIRV9DSEVDS19DTUQiXSwKKwkJICAgW1RoZSBwYXRoIHRvICdjYWNoZV9jaGVjaycsIGlmIGF2YWlsYWJsZS5dKQorCitBQ19ERUZJTkVfVU5RVU9URUQoW0NBQ0hFX0RVTVBfQ01EXSwgWyIkQ0FDSEVfRFVNUF9DTUQiXSwKKwkJICAgW1RoZSBwYXRoIHRvICdjYWNoZV9kdW1wJywgaWYgYXZhaWxhYmxlLl0pCisKK0FDX0RFRklORV9VTlFVT1RFRChbQ0FDSEVfUkVQQUlSX0NNRF0sIFsiJENBQ0hFX1JFUEFJUl9DTUQiXSwKKwkJICAgW1RoZSBwYXRoIHRvICdjYWNoZV9yZXBhaXInLCBpZiBhdmFpbGFibGUuXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtDQUNIRV9SRVNUT1JFX0NNRF0sIFsiJENBQ0hFX1JFU1RPUkVfQ01EIl0sCisJCSAgIFtUaGUgcGF0aCB0byAnY2FjaGVfcmVzdG9yZScsIGlmIGF2YWlsYWJsZS5dKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRGlzYWJsZSByZWFkbGluZQorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gZW5hYmxlIHJlYWRsaW5lKQorQUNfQVJHX0VOQUJMRShbcmVhZGxpbmVdLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtcmVhZGxpbmVdLCBbZGlzYWJsZSByZWFkbGluZSBzdXBwb3J0XSksCisJICAgICAgUkVBRExJTkU9JGVuYWJsZXZhbCwgUkVBRExJTkU9bWF5YmUpCitBQ19NU0dfUkVTVUxUKCRSRUFETElORSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBEaXNhYmxlIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSByZWFsdGltZSBzdXBwb3J0KQorQUNfQVJHX0VOQUJMRShyZWFsdGltZSwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXJlYWx0aW1lXSwgW2Rpc2FibGUgcmVhbHRpbWUgY2xvY2sgc3VwcG9ydF0pLAorCSAgICAgIFJFQUxUSU1FPSRlbmFibGV2YWwsIFJFQUxUSU1FPXllcykKK0FDX01TR19SRVNVTFQoJFJFQUxUSU1FKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIGRpc2FibGUgT0NGIHJlc291cmNlIGFnZW50cworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gZW5hYmxlIE9DRiByZXNvdXJjZSBhZ2VudHMpCitBQ19BUkdfRU5BQkxFKG9jZiwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtb2NmXSwKKwkJCSAgICAgW2VuYWJsZSBPcGVuIENsdXN0ZXIgRnJhbWV3b3JrIChPQ0YpIGNvbXBsaWFudCByZXNvdXJjZSBhZ2VudHNdKSwKKwkgICAgICBPQ0Y9JGVuYWJsZXZhbCwgT0NGPW5vKQorQUNfTVNHX1JFU1VMVCgkT0NGKQorQUNfQVJHX1dJVEgob2NmZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLW9jZmRpcj1ESVJdLAorCQkJICAgW2luc3RhbGwgT0NGIGZpbGVzIGluIFtQUkVGSVgvbGliL29jZi9yZXNvdXJjZS5kL2x2bTJdXSksCisJICAgIE9DRkRJUj0kd2l0aHZhbCwgT0NGRElSPScke3ByZWZpeH0vbGliL29jZi9yZXNvdXJjZS5kL2x2bTInKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEluaXQgcGtnLWNvbmZpZyB3aXRoIGR1bW15IGludm9rYXRpb246CitkbmwgLS0gdGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIFBLR19DSEVDS19NT0RVTEVTIG1hY3JvIGlzIGV4cGFuZGVkCitkbmwgLS0gdG8gaW5pdGlhbGl6ZSB0aGUgcGtnLWNvbmZpZyBlbnZpcm9ubWVudCBvbmx5IGF0IHRoZSBmaXJzdCBpbnZva2F0aW9uLAorZG5sIC0tIHRoYXQgd291bGQgYmUgY29uZGl0aW9uYWwgaW4gdGhpcyBjb25maWd1cmUuaW4uCitwa2dfY29uZmlnX2luaXQoKSB7CisJaWYgdGVzdCAiJFBLR0NPTkZJR19JTklUIiAhPSAxOyB0aGVuCisJCVBLR19DSEVDS19NT0RVTEVTKFBLR0NPTkZJR0lOSVQsIHBrZ2NvbmZpZ2luaXQsIFtdLAorCQkJCSAgW0FDX01TR19SRVNVTFQoW3BrZy1jb25maWcgaW5pdGlhbGl6ZWRdKV0pCisJCVBLR0NPTkZJR19JTklUPTEKKwlmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfTVNHX0NIRUNLSU5HKGZvciBkZWZhdWx0IHJ1biBkaXJlY3RvcnkpCitSVU5fRElSPSIvcnVuIgordGVzdCAtZCAiL3J1biIgfHwgUlVOX0RJUj0iL3Zhci9ydW4iCitBQ19NU0dfUkVTVUxUKCRSVU5fRElSKQorZG5sIC0tIFNldCB1cCBwaWRmaWxlIGFuZCBydW4gZGlyZWN0b3J5CitBSF9URU1QTEFURShERUZBVUxUX1BJRF9ESVIpCitBQ19BUkdfV0lUSChkZWZhdWx0LXBpZC1kaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1waWQtZGlyPVBJRF9ESVJdLAorCQkJICAgW0RlZmF1bHQgZGlyZWN0b3J5IHRvIGtlZXAgUElEIGZpbGVzIGluLiBbYXV0b2RldGVjdF1dKSwKKwkgICAgREVGQVVMVF9QSURfRElSPSIkd2l0aHZhbCIsIERFRkFVTFRfUElEX0RJUj0kUlVOX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX1BJRF9ESVIsIFsiJERFRkFVTFRfUElEX0RJUiJdLAorCQkgICBbRGVmYXVsdCBkaXJlY3RvcnkgdG8ga2VlcCBQSUQgZmlsZXMgaW4uXSkKKworQUhfVEVNUExBVEUoREVGQVVMVF9ETV9SVU5fRElSLCBbTmFtZSBvZiBkZWZhdWx0IERNIHJ1biBkaXJlY3RvcnkuXSkKK0FDX0FSR19XSVRIKGRlZmF1bHQtZG0tcnVuLWRpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LWRtLXJ1bi1kaXI9RE1fUlVOX0RJUl0sCisJCQkgICBbIERlZmF1bHQgRE0gcnVuIGRpcmVjdG9yeS4gW2F1dG9kZXRlY3RdXSksCisJICAgIERFRkFVTFRfRE1fUlVOX0RJUj0iJHdpdGh2YWwiLCBERUZBVUxUX0RNX1JVTl9ESVI9JFJVTl9ESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9ETV9SVU5fRElSLCBbIiRERUZBVUxUX0RNX1JVTl9ESVIiXSwKKwkJICAgW0RlZmF1bHQgRE0gcnVuIGRpcmVjdG9yeS5dKQorCitBSF9URU1QTEFURShERUZBVUxUX1JVTl9ESVIsIFtOYW1lIG9mIGRlZmF1bHQgTFZNIHJ1biBkaXJlY3RvcnkuXSkKK0FDX0FSR19XSVRIKGRlZmF1bHQtcnVuLWRpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LXJ1bi1kaXI9UlVOX0RJUl0sCisJCQkgICBbRGVmYXVsdCBMVk0gcnVuIGRpcmVjdG9yeS4gW2F1dG9kZXRlY3RfcnVuX2Rpci9sdm1dXSksCisJICAgIERFRkFVTFRfUlVOX0RJUj0iJHdpdGh2YWwiLCBERUZBVUxUX1JVTl9ESVI9IiRSVU5fRElSL2x2bSIpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9SVU5fRElSLCBbIiRERUZBVUxUX1JVTl9ESVIiXSwKKwkJICAgW0RlZmF1bHQgTFZNIHJ1biBkaXJlY3RvcnkuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBCdWlsZCBjbHVzdGVyIExWTSBkYWVtb24KK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGJ1aWxkIGNsdXN0ZXIgTFZNIGRhZW1vbikKK0FDX0FSR19XSVRIKGNsdm1kLAorICBbICAtLXdpdGgtY2x2bWQ9VFlQRSAgICAgICBidWlsZCBjbHVzdGVyIExWTSBEYWVtb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjbHVzdGVyIG1hbmFnZXIgY29tYmluYXRpb25zIGFyZSB2YWxpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogY21hbiAgICAgICAgICAgICAgICAgIChSSEVMNSBvciBlcXVpdmFsZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjbWFuLGNvcm9zeW5jLG9wZW5haXMgKG9yIHNlbGVjdGlvbiBvZiB0aGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5nbGVub2RlICAgICAgICAgICAgKGxvY2FsaG9zdCBvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbGwgICAgICAgICAgICAgICAgICAgKGF1dG9kZXRlY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vbmUgICAgICAgICAgICAgICAgICAoZGlzYWJsZSBidWlsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1tub25lXV1dLAorCSAgICBDTFZNRD0kd2l0aHZhbCwgQ0xWTUQ9bm9uZSkKK3Rlc3QgIiRDTFZNRCIgPSB5ZXMgJiYgQ0xWTUQ9YWxsCitBQ19NU0dfUkVTVUxUKCRDTFZNRCkKKworZG5sIC0tIElmIGNsdm1kIGVuYWJsZWQgd2l0aG91dCBjbHVzdGVyIGxvY2tpbmcsIGF1dG9tYWdpY2FsbHkgaW5jbHVkZSBpdAordGVzdCAiJENMVk1EIiAhPSBub25lIC1hICIkQ0xVU1RFUiIgPSBub25lICYmIENMVVNURVI9aW50ZXJuYWwKKworZG5sIC0tIGluaXQgcGtnY29uZmlnIGlmIHJlcXVpcmVkCit0ZXN0ICIkQ0xWTUQiICE9IG5vbmUgJiYgcGtnX2NvbmZpZ19pbml0CisKK2RubCAtLSBFeHByZXNzIGNsdm1kIGluaXQgc2NyaXB0IFJlcXVpcmVkLVN0YXJ0IC8gUmVxdWlyZWQtU3RvcAorQ0xWTURfQ01BTkFHRVJTPSIiCitkbmwgLS0gT24gUkhFTDQvUkhFTDUsIHFkaXNrZCBpcyBzdGFydGVkIGZyb20gYSBzZXBhcmF0ZSBpbml0IHNjcmlwdC4KK2RubCAtLSBFbmFibGUgaWYgd2UgYXJlIGJ1aWxkIGZvciBjbWFuLgorQ0xWTURfTkVFRFNfUURJU0tEPW5vCisKK2RubCAtLSBkZWZpbmUgYnVpbGQgdHlwZXMKK2lmIFtbIGBleHByIHgiJENMVk1EIiA6ICcuKmd1bG0uKidgICE9IDAgXV07IHRoZW4KKwlBQ19NU0dfRVJST1IoW1NpbmNlIHZlcnNpb24gMi4wMi44NyBHVUxNIGxvY2tpbmcgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5dKTsKK2ZpCitpZiBbWyBgZXhwciB4IiRDTFZNRCIgOiAnLipjbWFuLionYCAhPSAwIF1dOyB0aGVuCisJQlVJTERDTUFOPXllcworCUNMVk1EX0NNQU5BR0VSUz0iJENMVk1EX0NNQU5BR0VSUyBjbWFuIgorCUNMVk1EX05FRURTX1FESVNLRD15ZXMKK2ZpCitpZiBbWyBgZXhwciB4IiRDTFZNRCIgOiAnLipjb3Jvc3luYy4qJ2AgIT0gMCBdXTsgdGhlbgorCUJVSUxEQ09ST1NZTkM9eWVzCisJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIGNvcm9zeW5jIgorZmkKK2lmIFtbIGBleHByIHgiJENMVk1EIiA6ICcuKm9wZW5haXMuKidgICE9IDAgXV07IHRoZW4KKwlCVUlMRE9QRU5BSVM9eWVzCisJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIG9wZW5haXMiCitmaQordGVzdCAiJENMVk1EX05FRURTX1FESVNLRCIgIT0gbm8gJiYgQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIHFkaXNrZCIKKworZG5sIC0tIGRlZmluZSBhIHNvZnQgYmFpbG91dCBpZiB3ZSBhcmUgYXV0b2RldGVjdGluZworc29mdF9iYWlsb3V0KCkgeworCU5PVEZPVU5EPTEKK30KKworaGFyZF9iYWlsb3V0KCkgeworCUFDX01TR19FUlJPUihbYmFpbGluZyBvdXRdKQorfQorCitkbmwgLS0gaWYgY2x2bWQ9YWxsIHRoZW4gc2V0IHNvZnRfYmFpbG91dCAod2UgZG8gbm90IHdhbnQgdG8gZXJyb3IpCitkbmwgLS0gYW5kIHNldCBhbGwgYnVpbGRzIHRvIHllcy4gV2UgbmVlZCB0byBkbyB0aGlzIGhlcmUKK2RubCAtLSB0byBza2lwIHRoZSBvcGVuYWlzfGNvcm9zeW5jIHNhbml0eSBjaGVjayBhYm92ZS4KK2lmIHRlc3QgIiRDTFZNRCIgPSBhbGw7IHRoZW4KKwliYWlsb3V0PXNvZnRfYmFpbG91dAorCUJVSUxEQ01BTj15ZXMKKwlCVUlMRENPUk9TWU5DPXllcworCUJVSUxET1BFTkFJUz15ZXMKK2Vsc2UKKwliYWlsb3V0PWhhcmRfYmFpbG91dAorZmkKKworZG5sIC0tIGhlbHBlciBtYWNybyB0byBjaGVjayBsaWJzIHdpdGhvdXQgYWRkaW5nIHRoZW0gdG8gTElCUworY2hlY2tfbGliX25vX2xpYnMoKSB7CisJbGliX25vX2xpYnNfYXJnMT0kMQorCXNoaWZ0CisJbGliX25vX2xpYnNfYXJnMj0kMQorCXNoaWZ0CisJbGliX25vX2xpYnNfYXJncz0kQAorCUFDX0NIRUNLX0xJQihbJGxpYl9ub19saWJzX2FyZzFdLAorCQkgICAgIFskbGliX25vX2xpYnNfYXJnMl0sLAorCQkgICAgIFskYmFpbG91dF0sCisJCSAgICAgWyRsaWJfbm9fbGlic19hcmdzXSkKKwlMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCit9CisKK2RubCAtLSBMb29rIGZvciBjbWFuIGxpYnJhcmllcyBpZiByZXF1aXJlZC4KK2lmIHRlc3QgIiRCVUlMRENNQU4iID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoQ01BTiwgbGliY21hbiwgW0hBVkVfQ01BTj15ZXNdLAorCQlbTk9URk9VTkQ9MAorCQlBQ19DSEVDS19IRUFERVJTKGxpYmNtYW4uaCwsJGJhaWxvdXQpCisJCWNoZWNrX2xpYl9ub19saWJzIGNtYW4gY21hbl9pbml0CisJCWlmIHRlc3QgJE5PVEZPVU5EID0gMDsgdGhlbgorCQkJQUNfTVNHX1JFU1VMVChbbm8gcGtnIGZvciBsaWJjbWFuLCB1c2luZyAtbGNtYW5dKQorCQkJQ01BTl9MSUJTPSItbGNtYW4iCisJCQlIQVZFX0NNQU49eWVzCisJCWZpXSkKKwlDSEVDS0NPTkZEQj15ZXMKKwlDSEVDS0RMTT15ZXMKK2ZpCisKK2RubCAtLSBMb29rIGZvciBjb3Jvc3luYyB0aGF0IGlzIHJlcXVpcmVkIGFsc28gZm9yIG9wZW5haXMgYnVpbGQKK2RubCAtLSBvbmx5IGVub3VnaCByZWNlbnQgdmVyc2lvbiBvZiBjb3Jvc3luYyBzaGlwIHBrZy1jb25maWcgZmlsZXMuCitkbmwgLS0gV2UgY2FuIHNhZmVseSByZWx5IG9uIHRoYXQgdG8gZGV0ZWN0IHRoZSBjb3JyZWN0IGJpdHMuCitpZiB0ZXN0ICIkQlVJTERDT1JPU1lOQyIgPSB5ZXMgLW8gIiRCVUlMRE9QRU5BSVMiID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoQ09ST1NZTkMsIGNvcm9zeW5jLCBbSEFWRV9DT1JPU1lOQz15ZXNdLCAkYmFpbG91dCkKKwlDSEVDS0NPTkZEQj15ZXMKKwlDSEVDS0NNQVA9eWVzCitmaQorCitkbmwgLS0gTG9vayBmb3IgY29yb3N5bmMgbGlicmFyaWVzIGlmIHJlcXVpcmVkLgoraWYgdGVzdCAiJEJVSUxEQ09ST1NZTkMiID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoUVVPUlVNLCBsaWJxdW9ydW0sIFtIQVZFX1FVT1JVTT15ZXNdLCAkYmFpbG91dCkKKwlDSEVDS0NQRz15ZXMKKwlDSEVDS0RMTT15ZXMKK2ZpCisKK2RubCAtLSBMb29rIGZvciBvcGVuYWlzIGxpYnJhcmllcyBpZiByZXF1aXJlZC4KK2lmIHRlc3QgIiRCVUlMRE9QRU5BSVMiID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoU0FMQ0ssIGxpYlNhTGNrLCBbSEFWRV9TQUxDSz15ZXNdLCAkYmFpbG91dCkKKwlDSEVDS0NQRz15ZXMKK2ZpCisKK2RubCAtLSBCZWxvdyBhcmUgY2hlY2tzIGZvciBsaWJyYXJpZXMgY29tbW9uIHRvIG1vcmUgdGhhbiBvbmUgYnVpbGQuCisKK2RubCAtLSBDaGVjayBjb25mZGIgbGlicmFyeS4KK2RubCAtLSBtYW5kYXRvcnkgZm9yIGNvcm9zeW5jIDwgMi4wIGJ1aWxkLgorZG5sIC0tIG9wdGlvbmFsIGZvciBvcGVuYWlzL2NtYW4gYnVpbGQuCisKK2lmIHRlc3QgIiRDSEVDS0NPTkZEQiIgPSB5ZXM7IHRoZW4KKwlQS0dfQ0hFQ0tfTU9EVUxFUyhDT05GREIsIGxpYmNvbmZkYiwKKwkJCSAgW0hBVkVfQ09ORkRCPXllc10sIFtIQVZFX0NPTkZEQj1ub10pCisKKwlBQ19DSEVDS19IRUFERVJTKFtjb3Jvc3luYy9jb25mZGIuaF0sCisJCQkgW0hBVkVfQ09ORkRCX0g9eWVzXSwgW0hBVkVfQ09ORkRCX0g9bm9dKQorCisJaWYgdGVzdCAiJEhBVkVfQ09ORkRCIiAhPSB5ZXMgLWEgIiRIQVZFX0NPTkZEQl9IIiA9IHllczsgdGhlbgorCQljaGVja19saWJfbm9fbGlicyBjb25mZGIgY29uZmRiX2luaXRpYWxpemUKKwkJQUNfTVNHX1JFU1VMVChbbm8gcGtnIGZvciBjb25mZGIsIHVzaW5nIC1sY29uZmRiXSkKKwkJQ09ORkRCX0xJQlM9Ii1sY29uZmRiIgorCQlIQVZFX0NPTkZEQj15ZXMKKwlmaQorZmkKKworZG5sIC0tIENoZWNrIGNtYXAgbGlicmFyeQorZG5sIC0tIG1hbmRhdG9yeSBmb3IgY29yb3N5bmMgPj0gMi4wIGJ1aWxkLgorCitpZiB0ZXN0ICIkQ0hFQ0tDTUFQIiA9IHllczsgdGhlbgorCVBLR19DSEVDS19NT0RVTEVTKENNQVAsIGxpYmNtYXAsCisJCQkgIFtIQVZFX0NNQVA9eWVzXSwgW0hBVkVfQ01BUD1ub10pCisKKwlBQ19DSEVDS19IRUFERVJTKFtjb3Jvc3luYy9jbWFwLmhdLAorCQkJIFtIQVZFX0NNQVBfSD15ZXNdLCBbSEFWRV9DTUFQX0g9bm9dKQorCisJaWYgdGVzdCAiJEhBVkVfQ01BUCIgIT0geWVzIC1hICIkSEFWRV9DTUFQX0giID0geWVzOyB0aGVuCisJCWNoZWNrX2xpYl9ub19saWJzIGNtYXAgY21hcF9pbml0aWFsaXplCisJCUFDX01TR19SRVNVTFQoW25vIHBrZyBmb3IgY21hcCwgdXNpbmcgLWxjbWFwXSkKKwkJQ01BUF9MSUJTPSItbGNtYXAiCisJCUhBVkVfQ01BUD15ZXMKKwlmaQorZmkKKworaWYgdGVzdCAiJEJVSUxEQ09ST1NZTkMiID0geWVzIC1hIFwKKwkiJEhBVkVfQ01BUCIgIT0geWVzIC1hICIkSEFWRV9DT05GREIiICE9IHllcyAtYSAiJENMVk1EIiAhPSBhbGw7IHRoZW4KKwlBQ19NU0dfRVJST1IoW2JhaWxpbmcgb3V0Li4uIGNtYXAgKGNvcm9zeW5jID49IDIuMCkgb3IgY29uZmRiIChjb3Jvc3luYyA8IDIuMCkgbGlicmFyeSBpcyByZXF1aXJlZF0pCitmaQorCitkbmwgLS0gQ2hlY2sgY3BnIGxpYnJhcnkuCitpZiB0ZXN0ICIkQ0hFQ0tDUEciID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoQ1BHLCBsaWJjcGcsIFtIQVZFX0NQRz15ZXNdLCBbJGJhaWxvdXRdKQorZmkKKworZG5sIC0tIENoZWNrIGRsbSBsaWJyYXJ5LgoraWYgdGVzdCAiJENIRUNLRExNIiA9IHllczsgdGhlbgorCVBLR19DSEVDS19NT0RVTEVTKERMTSwgbGliZGxtLCBbSEFWRV9ETE09eWVzXSwKKwkJW05PVEZPVU5EPTAKKwkJQUNfQ0hFQ0tfSEVBREVSUyhsaWJkbG0uaCwsWyRiYWlsb3V0XSkKKwkJY2hlY2tfbGliX25vX2xpYnMgZGxtIGRsbV9sb2NrIC1scHRocmVhZAorCQlpZiB0ZXN0ICROT1RGT1VORCA9IDA7IHRoZW4KKwkJCUFDX01TR19SRVNVTFQoW25vIHBrZyBmb3IgbGliZGxtLCB1c2luZyAtbGRsbV0pCisJCQlETE1fTElCUz0iLWxkbG0gLWxwdGhyZWFkIgorCQkJSEFWRV9ETE09eWVzCisJCWZpXSkKK2ZpCisKK2RubCAtLSBJZiB3ZSBhcmUgYXV0b2RldGVjdGluZywgd2UgbmVlZCB0byByZS1jcmVhdGUKK2RubCAtLSB0aGUgZGVwZWRlbmNpZXMgY2hlY2tzIGFuZCBzZXQgYSBwcm9wZXIgQ0xWTUQsCitkbmwgLS0gdG9nZXRoZXIgd2l0aCBpbml0IHNjcmlwdCBSZXF1aXJlZC1TdGFydC9TdG9wIGVudHJpZXMuCitpZiB0ZXN0ICIkQ0xWTUQiID0gYWxsOyB0aGVuCisJQ0xWTUQ9bm9uZQorCUNMVk1EX0NNQU5BR0VSUz0iIgorCUNMVk1EX05FRURTX1FESVNLRD1ubworCWlmIHRlc3QgIiRIQVZFX0NNQU4iID0geWVzIC1hIFwKKwkJIiRIQVZFX0RMTSIgPSB5ZXM7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbRW5hYmxpbmcgY2x2bWQgY21hbiBjbHVzdGVyIG1hbmFnZXJdKQorCQlDTFZNRD0iJENMVk1ELGNtYW4iCisJCUNMVk1EX0NNQU5BR0VSUz0iJENMVk1EX0NNQU5BR0VSUyBjbWFuIgorCQlDTFZNRF9ORUVEU19RRElTS0Q9eWVzCisJZmkKKwlpZiB0ZXN0ICIkSEFWRV9DT1JPU1lOQyIgPSB5ZXMgLWEgXAorCQkiJEhBVkVfUVVPUlVNIiA9IHllcyAtYSBcCisJCSIkSEFWRV9DUEciID0geWVzIC1hIFwKKwkJIiRIQVZFX0RMTSIgPSB5ZXM7IHRoZW4KKwkgICBpZiB0ZXN0ICIkSEFWRV9DT05GREIiID0geWVzIC1vICIkSEFWRV9DTUFQIiA9IHllczsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBjbHZtZCBjb3Jvc3luYyBjbHVzdGVyIG1hbmFnZXJdKQorCQlDTFZNRD0iJENMVk1ELGNvcm9zeW5jIgorCQlDTFZNRF9DTUFOQUdFUlM9IiRDTFZNRF9DTUFOQUdFUlMgY29yb3N5bmMiCisJICAgZmkKKwlmaQorCWlmIHRlc3QgIiRIQVZFX0NPUk9TWU5DIiA9IHllcyAtYSBcCisJCSIkSEFWRV9DUEciID0geWVzIC1hIFwKKwkJIiRIQVZFX1NBTENLIiA9IHllczsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFtFbmFibGluZyBjbHZtZCBvcGVuYWlzIGNsdXN0ZXIgbWFuYWdlcl0pCisJCUNMVk1EPSIkQ0xWTUQsb3BlbmFpcyIKKwkJQ0xWTURfQ01BTkFHRVJTPSIkQ0xWTURfQ01BTkFHRVJTIG9wZW5haXMiCisJZmkKKwl0ZXN0ICIkQ0xWTURfTkVFRFNfUURJU0tEIiAhPSBubyAmJiBDTFZNRF9DTUFOQUdFUlM9IiRDTFZNRF9DTUFOQUdFUlMgcWRpc2tkIgorCXRlc3QgIiRDTFZNRCIgPSBub25lICYmIEFDX01TR19SRVNVTFQoW0Rpc2FibGluZyBjbHZtZCBidWlsZC4gTm8gY2x1c3RlciBtYW5hZ2VyIGRldGVjdGVkLl0pCitmaQorCitkbmwgLS0gRml4dXAgQ0xWTURfQ01BTkFHRVJTIHdpdGggbmV3IGNvcm9zeW5jCitkbmwgLS0gY2x2bWQgYnVpbHQgd2l0aCBjb3Jvc3luYyA+PSAyLjAgbmVlZHMgZGxtIChlaXRoZXIgaW5pdCBvciBzeXN0ZW1kIHNlcnZpY2UpCitkbmwgLS0gdG8gYmUgc3RhcnRlZC4KK2lmIFtbIGBleHByIHgiJENMVk1EIiA6ICcuKmNvcm9zeW5jLionYCAhPSAwIF1dOyB0aGVuCisgICB0ZXN0ICIkSEFWRV9DTUFQIiA9IHllcyAmJiBDTFZNRF9DTUFOQUdFUlM9IiRDTFZNRF9DTUFOQUdFUlMgZGxtIgorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBjbHZtZCBwaWRmaWxlCitpZiB0ZXN0ICIkQ0xWTUQiICE9IG5vbmU7IHRoZW4KKwlBQ19BUkdfV0lUSChjbHZtZC1waWRmaWxlLAorCQkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jbHZtZC1waWRmaWxlPVBBVEhdLAorCQkJCSAgIFtjbHZtZCBwaWRmaWxlIFtQSURfRElSL2Nsdm1kLnBpZF1dKSwKKwkJICAgIENMVk1EX1BJREZJTEU9JHdpdGh2YWwsCisJCSAgICBDTFZNRF9QSURGSUxFPSIkREVGQVVMVF9QSURfRElSL2Nsdm1kLnBpZCIpCisJQUNfREVGSU5FX1VOUVVPVEVEKENMVk1EX1BJREZJTEUsIFsiJENMVk1EX1BJREZJTEUiXSwKKwkJCSAgIFtQYXRoIHRvIGNsdm1kIHBpZGZpbGUuXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQnVpbGQgY2x1c3RlciBtaXJyb3IgbG9nIGRhZW1vbgorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgY2x1c3RlciBtaXJyb3IgbG9nIGRhZW1vbikKK0FDX0FSR19FTkFCTEUoY21pcnJvcmQsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNtaXJyb3JkXSwKKwkJCSAgICAgW2VuYWJsZSB0aGUgY2x1c3RlciBtaXJyb3IgbG9nIGRhZW1vbl0pLAorCSAgICAgIENNSVJST1JEPSRlbmFibGV2YWwsIENNSVJST1JEPW5vKQorQUNfTVNHX1JFU1VMVCgkQ01JUlJPUkQpCisKK0JVSUxEX0NNSVJST1JEPSRDTUlSUk9SRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIGNtaXJyb3JkIHBpZGZpbGUKK2lmIHRlc3QgIiRCVUlMRF9DTUlSUk9SRCIgPSB5ZXM7IHRoZW4KKwlBQ19BUkdfV0lUSChjbWlycm9yZC1waWRmaWxlLAorCQkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jbWlycm9yZC1waWRmaWxlPVBBVEhdLAorCQkJCSAgIFtjbWlycm9yZCBwaWRmaWxlIFtQSURfRElSL2NtaXJyb3JkLnBpZF1dKSwKKwkJICAgIENNSVJST1JEX1BJREZJTEU9JHdpdGh2YWwsCisJCSAgICBDTUlSUk9SRF9QSURGSUxFPSIkREVGQVVMVF9QSURfRElSL2NtaXJyb3JkLnBpZCIpCisJQUNfREVGSU5FX1VOUVVPVEVEKENNSVJST1JEX1BJREZJTEUsIFsiJENNSVJST1JEX1BJREZJTEUiXSwKKwkJCSAgIFtQYXRoIHRvIGNtaXJyb3JkIHBpZGZpbGUuXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gTG9vayBmb3IgY29yb3N5bmMgbGlicmFyaWVzIGlmIHJlcXVpcmVkLgoraWYgW1sgIiRCVUlMRF9DTUlSUk9SRCIgPSB5ZXMgXV07IHRoZW4KKwlwa2dfY29uZmlnX2luaXQKKworCUFDX0RFRklORShbQ01JUlJPUl9IQVNfQ0hFQ0tQT0lOVF0sIDEsIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGxpYlNhQ2twdC5dKQorCVBLR19DSEVDS19NT0RVTEVTKFNBQ0tQVCwgbGliU2FDa3B0LCBbSEFWRV9TQUNLUFQ9eWVzXSwKKwkJW0FDX01TR19SRVNVTFQoW25vIGxpYlNhQ2twdCwgY29tcGlsaW5nIHdpdGhvdXQgaXRdKQorCQlBQ19ERUZJTkUoW0NNSVJST1JfSEFTX0NIRUNLUE9JTlRdLCAwLCBbRGVmaW5lIHRvIDAgdG8gZXhjbHVkZSBsaWJTYUNrcHQuXSldKQorCisJaWYgdGVzdCAiJEhBVkVfQ1BHIiAhPSB5ZXM7IHRoZW4KKwkJUEtHX0NIRUNLX01PRFVMRVMoQ1BHLCBsaWJjcGcpCisJZmkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIGRlYnVnZ2luZworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gZW5hYmxlIGRlYnVnZ2luZykKK0FDX0FSR19FTkFCTEUoZGVidWcsIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZWJ1Z10sIFtlbmFibGUgZGVidWdnaW5nXSksCisJICAgICAgREVCVUc9JGVuYWJsZXZhbCwgREVCVUc9bm8pCitBQ19NU0dfUkVTVUxUKCRERUJVRykKKworZG5sIC0tIE5vcm1hbGx5IHR1cm4gb2ZmIG9wdGltaXNhdGlvbiBmb3IgZGVidWcgYnVpbGRzCitpZiB0ZXN0ICIkREVCVUciID0geWVzOyB0aGVuCisJQ09QVElNSVNFX0ZMQUc9CitlbHNlCisJQ1NDT1BFX0NNRD0KK2ZpCisKK2RubCAtLSBDaGVjayBpZiBjb21waWxlciBzdXBwb3J0cyAtV2p1bXAtbWlzc2VzLWluaXQKK0FDX1RSWV9DQ0ZMQUcoWy1XanVtcC1taXNzZXMtaW5pdF0sIFtIQVZFX1dKVU1QXSwgW10sIFtdKQorQUNfU1VCU1QoSEFWRV9XSlVNUCkKK0FDX1RSWV9DQ0ZMQUcoWy1XY2xvYmJlcmVkXSwgW0hBVkVfV0NMT0JCRVJFRF0sIFtdLCBbXSkKK0FDX1NVQlNUKEhBVkVfV0NMT0JCRVJFRCkKK0FDX1RSWV9DQ0ZMQUcoWy1Xc3luYy1uYW5kXSwgW0hBVkVfV1NZTkNOQU5EXSwgW10sIFtdKQorQUNfU1VCU1QoSEFWRV9XU1lOQ05BTkQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gT3ZlcnJpZGUgb3B0aW1pc2F0aW9uCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEMgb3B0aW1pc2F0aW9uIGZsYWcpCitBQ19BUkdfV0lUSChvcHRpbWlzYXRpb24sCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtb3B0aW1pc2F0aW9uPU9QVF0sCisJCQkgICBbQyBvcHRpbWlzYXRpb24gZmxhZyBbT1BUPS1PMl1dKSwKKwkgICAgQ09QVElNSVNFX0ZMQUc9JHdpdGh2YWwpCitBQ19NU0dfUkVTVUxUKCRDT1BUSU1JU0VfRkxBRykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBFbmFibGUgcHJvZmlsaW5nCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBnYXRoZXIgZ2NvdiBwcm9maWxpbmcgZGF0YSkKK0FDX0FSR19FTkFCTEUocHJvZmlsaW5nLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wcm9maWxpbmddLAorCQkJICAgICBbZ2F0aGVyIGdjb3YgcHJvZmlsaW5nIGRhdGFdKSwKKwkgICAgICBQUk9GSUxJTkc9JGVuYWJsZXZhbCwgUFJPRklMSU5HPW5vKQorQUNfTVNHX1JFU1VMVCgkUFJPRklMSU5HKQorCitpZiB0ZXN0ICIkUFJPRklMSU5HIiA9IHllczsgdGhlbgorICBDT1BUSU1JU0VfRkxBRz0iJENPUFRJTUlTRV9GTEFHIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKyAgQUNfUEFUSF9UT09MKExDT1YsIGxjb3YpCisgIEFDX1BBVEhfVE9PTChHRU5IVE1MLCBnZW5odG1sKQorICB0ZXN0IC16ICIkTENPViIgLW8gLXogIiRHRU5IVE1MIiAmJiBBQ19NU0dfRVJST1IoW2xjb3YgYW5kIGdlbmh0bWwgYXJlIHJlcXVpcmVkIGZvciBwcm9maWxpbmddKQorICBBQ19QQVRIX1RPT0woR0VOUE5HLCBnZW5wbmcpCisgIGlmIHRlc3QgLW4gIiRHRU5QTkciOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICRHRU5QTkcgaGFzIGFsbCByZXF1aXJlZCBtb2R1bGVzXSkKKyAgICBpZiAiJEdFTlBORyIgLS1oZWxwID4gL2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKG9rKQorICAgICAgR0VOSFRNTD0iJEdFTkhUTUwgLS1mcmFtZXMiCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm90IHN1cHBvcnRlZF0pCisgICAgICBBQ19NU0dfV0FSTihbR0QucG0gcGVybCBtb2R1bGUgaXMgbm90IGluc3RhbGxlZF0pCisgICAgICBHRU5QTkc9CisgICAgZmkKKyAgZmkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIHRlc3RpbmcKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSB1bml0IHRlc3RpbmcpCitBQ19BUkdfRU5BQkxFKHRlc3RpbmcsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlc3RpbmddLAorCQkJICAgICBbZW5hYmxlIHRlc3RpbmcgdGFyZ2V0cyBpbiB0aGUgbWFrZWZpbGVdKSwKKwkgICAgICBURVNUSU5HPSRlbmFibGV2YWwsIFRFU1RJTkc9bm8pCitBQ19NU0dfUkVTVUxUKCRURVNUSU5HKQorCitpZiB0ZXN0ICIkVEVTVElORyIgPSB5ZXM7IHRoZW4KKwlwa2dfY29uZmlnX2luaXQKKwlQS0dfQ0hFQ0tfTU9EVUxFUyhDVU5JVCwgY3VuaXQgPj0gMi4wKQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBTZXQgTFZNMiB0ZXN0c3VpdGUgZGF0YQorVEVTVFNVSVRFX0RBVEE9JyR7ZGF0YXJvb3RkaXJ9L2x2bTItdGVzdHN1aXRlJworIyBkb3VibGUgZXZhbCBuZWVkZWQgJHtkYXRhcm9vdGRpcn0gLT4gJHtwcmVmaXh9L3NoYXJlIC0+IHJlYWwgcGF0aAorQUNfREVGSU5FX1VOUVVPVEVEKFRFU1RTVUlURV9EQVRBLCBbIiQoZXZhbCBlY2hvICQoZXZhbCBlY2hvICRURVNUU1VJVEVfREFUQSkpIl0sIFtQYXRoIHRvIHRlc3RzdWl0ZSBkYXRhXSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSB2YWxncmluZCBhd2FyZW5lc3Mgb2YgbWVtb3J5IHBvb2xzCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgdmFsZ3JpbmQgYXdhcmVuZXNzIG9mIHBvb2xzKQorQUNfQVJHX0VOQUJMRSh2YWxncmluZF9wb29sLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12YWxncmluZC1wb29sXSwKKwkJCSAgICAgW2VuYWJsZSB2YWxncmluZCBhd2FyZW5lc3Mgb2YgcG9vbHNdKSwKKwkgICAgICBWQUxHUklORF9QT09MPSRlbmFibGV2YWwsIFZBTEdSSU5EX1BPT0w9bm8pCitBQ19NU0dfUkVTVUxUKCRWQUxHUklORF9QT09MKQorCitwa2dfY29uZmlnX2luaXQKK1BLR19DSEVDS19NT0RVTEVTKFZBTEdSSU5ELCB2YWxncmluZCwgW0hBVkVfVkFMR1JJTkQ9eWVzXSwgW2lmIHRlc3QgeCRWQUxHUklORF9QT09MID0geHllczsgdGhlbiBBQ19NU0dfRVJST1IoYmFpbGluZyBvdXQpOyBmaV0pCitBQ19TVUJTVChWQUxHUklORF9DRkxBR1MpCisKK2lmIHRlc3QgeCRIQVZFX1ZBTEdSSU5EID0geHllczsgdGhlbgorCUFDX0RFRklORShbSEFWRV9WQUxHUklORF0sIDEsIFt2YWxncmluZC5oIGZvdW5kXSkKK2ZpCisKK2lmIHRlc3QgeCRWQUxHUklORF9QT09MID0geHllczsgdGhlbgorCUFDX0RFRklORShbVkFMR1JJTkRfUE9PTF0sIDEsIFtFbmFibGUgYSB2YWxncmluZCBhd2FyZSBidWlsZCBvZiBwb29sXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRGlzYWJsZSBkZXZtYXBwZXIKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIHVzZSBkZXZpY2UtbWFwcGVyKQorQUNfQVJHX0VOQUJMRShkZXZtYXBwZXIsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1kZXZtYXBwZXJdLAorCQkJICAgICBbZGlzYWJsZSBMVk0yIGRldmljZS1tYXBwZXIgaW50ZXJhY3Rpb25dKSwKKwkgICAgICBERVZNQVBQRVI9JGVuYWJsZXZhbCkKK0FDX01TR19SRVNVTFQoJERFVk1BUFBFUikKKworaWYgdGVzdCAiJERFVk1BUFBFUiIgPSB5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoW0RFVk1BUFBFUl9TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBMVk0yIGRldmljZS1tYXBwZXIgaW50ZXJhY3Rpb24uXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQnVpbGQgbHZtZXRhZAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgTFZNZXRhRCkKK0FDX0FSR19FTkFCTEUobHZtZXRhZCwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbHZtZXRhZF0sCisJCQkgICAgIFtlbmFibGUgdGhlIExWTSBNZXRhZGF0YSBEYWVtb25dKSwKKwkgICAgICBMVk1FVEFEPSRlbmFibGV2YWwpCit0ZXN0IC1uICIkTFZNRVRBRCIgJiYgQlVJTERfTFZNRVRBRD0kTFZNRVRBRAorQUNfTVNHX1JFU1VMVCgkQlVJTERfTFZNRVRBRCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBCdWlsZCBsdm1wb2xsZAorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgbHZtcG9sbGQpCitBQ19BUkdfRU5BQkxFKGx2bXBvbGxkLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sdm1wb2xsZF0sCisJCQkgICAgIFtlbmFibGUgdGhlIExWTSBQb2xsaW5nIERhZW1vbl0pLAorCSAgICAgIExWTVBPTExEPSRlbmFibGV2YWwpCit0ZXN0IC1uICIkTFZNUE9MTEQiICYmIEJVSUxEX0xWTVBPTExEPSRMVk1QT0xMRAorQUNfTVNHX1JFU1VMVCgkQlVJTERfTFZNUE9MTEQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitCVUlMRF9MVk1MT0NLRD1ubworCitkbmwgLS0gQnVpbGQgbG9ja2RzYW5sb2NrCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBidWlsZCBsb2NrZHNhbmxvY2spCitBQ19BUkdfRU5BQkxFKGxvY2tkLXNhbmxvY2ssCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxvY2tkLXNhbmxvY2tdLAorCQkJICAgICBbZW5hYmxlIHRoZSBMVk0gbG9jayBkYWVtb24gdXNpbmcgc2FubG9ja10pLAorCSAgICAgIExPQ0tEU0FOTE9DSz0kZW5hYmxldmFsKQorQUNfTVNHX1JFU1VMVCgkTE9DS0RTQU5MT0NLKQorCitCVUlMRF9MT0NLRFNBTkxPQ0s9JExPQ0tEU0FOTE9DSworCitkbmwgLS0gTG9vayBmb3Igc2FubG9jayBsaWJyYXJpZXMKK2lmIHRlc3QgIiRCVUlMRF9MT0NLRFNBTkxPQ0siID0geWVzOyB0aGVuCisJUEtHX0NIRUNLX01PRFVMRVMoTE9DS0RfU0FOTE9DSywgbGlic2FubG9ja19jbGllbnQgPj0gMy4zLjAsIFtIQVZFX0xPQ0tEX1NBTkxPQ0s9eWVzXSwgJGJhaWxvdXQpCisJQUNfREVGSU5FKFtMT0NLRFNBTkxPQ0tfU1VQUE9SVF0sIDEsIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bWxvY2tkIHNhbmxvY2sgb3B0aW9uLl0pCisJQlVJTERfTFZNTE9DS0Q9eWVzCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEJ1aWxkIGxvY2tkZGxtCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBidWlsZCBsb2NrZGRsbSkKK0FDX0FSR19FTkFCTEUobG9ja2QtZGxtLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sb2NrZC1kbG1dLAorCQkJICAgICBbZW5hYmxlIHRoZSBMVk0gbG9jayBkYWVtb24gdXNpbmcgZGxtXSksCisJICAgICAgTE9DS0RETE09JGVuYWJsZXZhbCkKK0FDX01TR19SRVNVTFQoJExPQ0tERExNKQorCitCVUlMRF9MT0NLRERMTT0kTE9DS0RETE0KKworZG5sIC0tIExvb2sgZm9yIGRsbSBsaWJyYXJpZXMKK2lmIHRlc3QgIiRCVUlMRF9MT0NLRERMTSIgPSB5ZXM7IHRoZW4KKwlQS0dfQ0hFQ0tfTU9EVUxFUyhMT0NLRF9ETE0sIGxpYmRsbSwgW0hBVkVfTE9DS0RfRExNPXllc10sICRiYWlsb3V0KQorCUFDX0RFRklORShbTE9DS0RETE1fU1VQUE9SVF0sIDEsIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bWxvY2tkIGRsbSBvcHRpb24uXSkKKwlCVUlMRF9MVk1MT0NLRD15ZXMKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQnVpbGQgbHZtbG9ja2QKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGJ1aWxkIGx2bWxvY2tkKQorQUNfTVNHX1JFU1VMVCgkQlVJTERfTFZNTE9DS0QpCisKK2lmIHRlc3QgIiRCVUlMRF9MVk1MT0NLRCIgPSB5ZXM7IHRoZW4KKwlBU19JRihbdGVzdCAiJExWTVBPTExEIiA9IG5vXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGJ1aWxkIGx2bWxvY2tkIHdpdGggLS1kaXNhYmxlLWx2bXBvbGxkLl0pXSkKKwlBU19JRihbdGVzdCAiJExWTUVUQUQiID0gbm9dLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgYnVpbGQgbHZtbG9ja2Qgd2l0aCAtLWRpc2FibGUtbHZtZXRhZC5dKV0pCisJQVNfSUYoW3Rlc3QgIiRCVUlMRF9MVk1QT0xMRCIgPSBub10sIFtCVUlMRF9MVk1QT0xMRD15ZXM7IEFDX01TR19XQVJOKFtFbmFibGluZyBsdm1wb2xsZCAtIHJlcXVpcmVkIGJ5IGx2bWxvY2tkLl0pXSkKKwlBU19JRihbdGVzdCAiJEJVSUxEX0xWTUVUQUQiID0gbm9dLCBbQlVJTERfTFZNRVRBRD15ZXM7IEFDX01TR19XQVJOKFtFbmFibGluZyBsdm1ldGFkIC0gcmVxdWlyZWQgYnkgbHZtbG9ja2QuXSldKQorCUFDX01TR19DSEVDS0lORyhbZGVmYXVsdHMgZm9yIHVzZV9sdm1sb2NrZF0pCisJQUNfQVJHX0VOQUJMRSh1c2VfbHZtbG9ja2QsCisJCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdXNlLWx2bWxvY2tkXSwKKwkJCQkgICAgIFtkaXNhYmxlIHVzYWdlIG9mIExWTSBsb2NrIGRhZW1vbl0pLAorCQkgICAgICBbY2FzZSAke2VuYWJsZXZhbH0gaW4KKwkJICAgICAgIHllcykgREVGQVVMVF9VU0VfTFZNTE9DS0Q9MSA7OworCQkgICAgICAgKikgREVGQVVMVF9VU0VfTFZNTE9DS0Q9MCA7OworCQkgICAgICAgZXNhY10sIERFRkFVTFRfVVNFX0xWTUxPQ0tEPTEpCisJQUNfTVNHX1JFU1VMVCgkREVGQVVMVF9VU0VfTFZNTE9DS0QpCisJQUNfREVGSU5FKFtMVk1MT0NLRF9TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgY29kZSB0aGF0IHVzZXMgbHZtbG9ja2QuXSkKKworCUFDX0FSR19XSVRIKGx2bWxvY2tkLXBpZGZpbGUsCisJCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWx2bWxvY2tkLXBpZGZpbGU9UEFUSF0sCisJCQkJICAgW2x2bWxvY2tkIHBpZGZpbGUgW1BJRF9ESVIvbHZtbG9ja2QucGlkXV0pLAorCQkgICAgTFZNTE9DS0RfUElERklMRT0kd2l0aHZhbCwKKwkJICAgIExWTUxPQ0tEX1BJREZJTEU9IiRERUZBVUxUX1BJRF9ESVIvbHZtbG9ja2QucGlkIikKKwlBQ19ERUZJTkVfVU5RVU9URUQoTFZNTE9DS0RfUElERklMRSwgWyIkTFZNTE9DS0RfUElERklMRSJdLAorCQkJICAgW1BhdGggdG8gbHZtbG9ja2QgcGlkZmlsZS5dKQorZWxzZQorCURFRkFVTFRfVVNFX0xWTUxPQ0tEPTAKK2ZpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9VU0VfTFZNTE9DS0QsIFskREVGQVVMVF9VU0VfTFZNTE9DS0RdLAorCQkgICBbVXNlIGx2bWxvY2tkIGJ5IGRlZmF1bHQuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDaGVjayBsdm1ldGFkCitpZiB0ZXN0ICIkQlVJTERfTFZNRVRBRCIgPSB5ZXM7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcoW2RlZmF1bHRzIGZvciB1c2VfbHZtZXRhZF0pCisJQUNfQVJHX0VOQUJMRSh1c2VfbHZtZXRhZCwKKwkJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS11c2UtbHZtZXRhZF0sCisJCQkJICAgICBbZGlzYWJsZSB1c2FnZSBvZiBMVk0gTWV0YWRhdGEgRGFlbW9uXSksCisJCSAgICAgIFtjYXNlICR7ZW5hYmxldmFsfSBpbgorCQkgICAgICAgeWVzKSBERUZBVUxUX1VTRV9MVk1FVEFEPTEgOzsKKwkJICAgICAgICopIERFRkFVTFRfVVNFX0xWTUVUQUQ9MCA7OworCQkgICAgICAgZXNhY10sIERFRkFVTFRfVVNFX0xWTUVUQUQ9MSkKKwlBQ19NU0dfUkVTVUxUKCRERUZBVUxUX1VTRV9MVk1FVEFEKQorCUFDX0RFRklORShbTFZNRVRBRF9TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgY29kZSB0aGF0IHVzZXMgbHZtZXRhZC5dKQorCisJQUNfQVJHX1dJVEgobHZtZXRhZC1waWRmaWxlLAorCQkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1sdm1ldGFkLXBpZGZpbGU9UEFUSF0sCisJCQkJICAgW2x2bWV0YWQgcGlkZmlsZSBbUElEX0RJUi9sdm1ldGFkLnBpZF1dKSwKKwkJICAgIExWTUVUQURfUElERklMRT0kd2l0aHZhbCwKKwkJICAgIExWTUVUQURfUElERklMRT0iJERFRkFVTFRfUElEX0RJUi9sdm1ldGFkLnBpZCIpCisJQUNfREVGSU5FX1VOUVVPVEVEKExWTUVUQURfUElERklMRSwgWyIkTFZNRVRBRF9QSURGSUxFIl0sCisJCQkgICBbUGF0aCB0byBsdm1ldGFkIHBpZGZpbGUuXSkKK2Vsc2UKKwlERUZBVUxUX1VTRV9MVk1FVEFEPTAKK2ZpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9VU0VfTFZNRVRBRCwgWyRERUZBVUxUX1VTRV9MVk1FVEFEXSwKKwkJICAgW1VzZSBsdm1ldGFkIGJ5IGRlZmF1bHQuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDaGVjayBsdm1wb2xsZAoraWYgdGVzdCAiJEJVSUxEX0xWTVBPTExEIiA9IHllczsgdGhlbgorCUFDX01TR19DSEVDS0lORyhbZGVmYXVsdHMgZm9yIHVzZV9sdm1wb2xsZF0pCisJQUNfQVJHX0VOQUJMRSh1c2VfbHZtcG9sbGQsCisJCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdXNlLWx2bXBvbGxkXSwKKwkJCQkgICAgIFtkaXNhYmxlIHVzYWdlIG9mIExWTSBQb2xsIERhZW1vbl0pLAorCQkgICAgICBbY2FzZSAke2VuYWJsZXZhbH0gaW4KKwkJICAgICAgIHllcykgREVGQVVMVF9VU0VfTFZNUE9MTEQ9MSA7OworCQkgICAgICAgKikgREVGQVVMVF9VU0VfTFZNUE9MTEQ9MCA7OworCQkgICAgICAgZXNhY10sIERFRkFVTFRfVVNFX0xWTVBPTExEPTEpCisJQUNfTVNHX1JFU1VMVCgkREVGQVVMVF9VU0VfTFZNUE9MTEQpCisJQUNfREVGSU5FKFtMVk1QT0xMRF9TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgY29kZSB0aGF0IHVzZXMgbHZtcG9sbGQuXSkKKworCUFDX0FSR19XSVRIKGx2bXBvbGxkLXBpZGZpbGUsCisJCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWx2bXBvbGxkLXBpZGZpbGU9UEFUSF0sCisJCQkJICAgW2x2bXBvbGxkIHBpZGZpbGUgW1BJRF9ESVIvbHZtcG9sbGQucGlkXV0pLAorCQkgICAgTFZNUE9MTERfUElERklMRT0kd2l0aHZhbCwKKwkJICAgIExWTVBPTExEX1BJREZJTEU9IiRERUZBVUxUX1BJRF9ESVIvbHZtcG9sbGQucGlkIikKKwlBQ19ERUZJTkVfVU5RVU9URUQoTFZNUE9MTERfUElERklMRSwgWyIkTFZNUE9MTERfUElERklMRSJdLAorCQkJICAgW1BhdGggdG8gbHZtcG9sbGQgcGlkZmlsZS5dKQorZWxzZQorCURFRkFVTFRfVVNFX0xWTVBPTExEPTAKK2ZpCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9VU0VfTFZNUE9MTEQsIFskREVGQVVMVF9VU0VfTFZNUE9MTERdLAorCQkgICBbVXNlIGx2bXBvbGxkIGJ5IGRlZmF1bHQuXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBCdWlsZCBub3RpZnlkYnVzCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBidWlsZCBub3RpZnlkYnVzKQorQUNfQVJHX0VOQUJMRShub3RpZnktZGJ1cywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbm90aWZ5LWRidXNdLAorCQkJICAgICBbZW5hYmxlIExWTSBub3RpZmljYXRpb24gdXNpbmcgZGJ1c10pLAorCSAgICAgIE5PVElGWURCVVM9JGVuYWJsZXZhbCkKK0FDX01TR19SRVNVTFQoJE5PVElGWURCVVMpCisKK0JVSUxEX05PVElGWURCVVM9JE5PVElGWURCVVMKKworaWYgdGVzdCAiJEJVSUxEX05PVElGWURCVVMiID0geWVzOyB0aGVuCisJQUNfREVGSU5FKFtOT1RJRllEQlVTX1NVUFBPUlRdLCAxLCBbRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBjb2RlIHRoYXQgdXNlcyBkYnVzIG5vdGlmaWNhdGlvbi5dKQorCUxJQlM9Ii1sc3lzdGVtZCAkTElCUyIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gTG9vayBmb3IgZGJ1cyBsaWJyYXJpZXMKK2lmIHRlc3QgIiRCVUlMRF9OT1RJRllEQlVTIiA9IHllczsgdGhlbgorCVBLR19DSEVDS19NT0RVTEVTKE5PVElGWV9EQlVTLCBzeXN0ZW1kID49IDIyMSwgW0hBVkVfTk9USUZZX0RCVVM9eWVzXSwgJGJhaWxvdXQpCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkbmwgLS0gRW5hYmxlIGJsa2lkIHdpcGluZyBmdW5jdGlvbmFsaXR5CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgbGliYmxraWQgZGV0ZWN0aW9uIG9mIHNpZ25hdHVyZXMgd2hlbiB3aXBpbmcpCitBQ19BUkdfRU5BQkxFKGJsa2lkX3dpcGluZywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWJsa2lkX3dpcGluZ10sCisJCQkgICAgIFtkaXNhYmxlIGxpYmJsa2lkIGRldGVjdGlvbiBvZiBzaWduYXR1cmVzIHdoZW4gd2lwaW5nIGFuZCB1c2UgbmF0aXZlIGNvZGUgaW5zdGVhZF0pLAorCSAgICAgIEJMS0lEX1dJUElORz0kZW5hYmxldmFsLCBCTEtJRF9XSVBJTkc9bWF5YmUpCitBQ19NU0dfUkVTVUxUKCRCTEtJRF9XSVBJTkcpCisKK2lmIHRlc3QgIiRCTEtJRF9XSVBJTkciICE9IG5vOyB0aGVuCisJcGtnX2NvbmZpZ19pbml0CisJUEtHX0NIRUNLX01PRFVMRVMoQkxLSUQsIGJsa2lkID49IDIuMjQsCisJCQkgIFt0ZXN0ICIkQkxLSURfV0lQSU5HIiA9IG1heWJlICYmIEJMS0lEX1dJUElORz15ZXNdLAorCQkJICBbaWYgdGVzdCAiJEJMS0lEX1dJUElORyIgPSBtYXliZTsgdGhlbgorCQkJCUJMS0lEX1dJUElORz1ubworCQkJICAgZWxzZQorCQkJICAgICAgICBBQ19NU0dfRVJST1IoW2JhaWxpbmcgb3V0Li4uIGJsa2lkIGxpYnJhcnkgPj0gMi4yNCBpcyByZXF1aXJlZF0pCisJCQkgICBmaV0pCisJaWYgdGVzdCAiJEJMS0lEX1dJUElORyIgPSB5ZXM7IHRoZW4KKwkJQkxLSURfUEM9ImJsa2lkIgorCQlERUZBVUxUX1VTRV9CTEtJRF9XSVBJTkc9MQorCQlBQ19ERUZJTkUoW0JMS0lEX1dJUElOR19TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIHVzZSBsaWJibGtpZCBkZXRlY3Rpb24gb2Ygc2lnbmF0dXJlcyB3aGVuIHdpcGluZy5dKQorCWVsc2UKKwkJREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HPTAKKwlmaQorZWxzZQorCURFRkFVTFRfVVNFX0JMS0lEX1dJUElORz0wCitmaQorQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfVVNFX0JMS0lEX1dJUElORywgWyRERUZBVUxUX1VTRV9CTEtJRF9XSVBJTkddLAorCQkgICBbVXNlIGJsa2lkIHdpcGluZyBieSBkZWZhdWx0Ll0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIHVkZXYtc3lzdGVtZCBwcm90b2NvbCB0byBpbnN0YW50aWF0ZSBhIHNlcnZpY2UgZm9yIGJhY2tncm91bmQgam9icworZG5sIC0tIFJlcXVpcmVzIHN5c3RlbWQgdmVyc2lvbiAyMDUgYXQgbGVhc3QgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBzeXN0ZW1kLXJ1bikKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIHVzZSB1ZGV2LXN5c3RlbWQgcHJvdG9jb2wgZm9yIGpvYnMgaW4gYmFja2dyb3VuZCkKK0FDX0FSR19FTkFCTEUodWRldi1zeXN0ZW1kLWJhY2tncm91bmQtam9icywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXVkZXYtc3lzdGVtZC1iYWNrZ3JvdW5kLWpvYnNdLAorCQkJICAgICBbZGlzYWJsZSB1ZGV2LXN5c3RlbWQgcHJvdG9jb2wgdG8gaW5zdGFudGlhdGUgYSBzZXJ2aWNlIGZvciBiYWNrZ3JvdW5kIGpvYl0pLAorCSAgICAgIFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlM9JGVuYWJsZXZhbCwKKwkgICAgICBVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTPW1heWJlKQorQUNfTVNHX1JFU1VMVCgkVURFVl9TWVNURU1EX0JBQ0tHUk9VTkRfSk9CUykKKworaWYgdGVzdCAiJFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlMiICE9IG5vOyB0aGVuCisJcGtnX2NvbmZpZ19pbml0CisJUEtHX0NIRUNLX01PRFVMRVMoU1lTVEVNRCwgc3lzdGVtZCA+PSAyMDUsCisJCQkgIFt0ZXN0ICIkVURFVl9TWVNURU1EX0JBQ0tHUk9VTkRfSk9CUyIgPSBtYXliZSAmJiBVREVWX1NZU1RFTURfQkFDS0dST1VORF9KT0JTPXllc10sCisJCQkgIFtpZiB0ZXN0ICIkVURFVl9TWVNURU1EX0JBQ0tHUk9VTkRfSk9CUyIgPSBtYXliZTsgdGhlbgorCQkJCVVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlM9bm8KKwkJCSAgIGVsc2UKKwkJCQlBQ19NU0dfRVJST1IoW2JhaWxpbmcgb3V0Li4uIHN5c3RlbWQgPj0gMjA1IGlzIHJlcXVpcmVkXSkKKwkJCSAgIGZpXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIHVkZXYgc3luY2hyb25pc2F0aW9uCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgc3luY2hyb25pc2F0aW9uIHdpdGggdWRldiBwcm9jZXNzaW5nKQorQUNfQVJHX0VOQUJMRSh1ZGV2X3N5bmMsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXVkZXZfc3luY10sCisJCQkgICAgIFtlbmFibGUgc3luY2hyb25pc2F0aW9uIHdpdGggdWRldiBwcm9jZXNzaW5nXSksCisJICAgICAgVURFVl9TWU5DPSRlbmFibGV2YWwsIFVERVZfU1lOQz1ubykKK0FDX01TR19SRVNVTFQoJFVERVZfU1lOQykKKworaWYgdGVzdCAiJFVERVZfU1lOQyIgPSB5ZXM7IHRoZW4KKwlwa2dfY29uZmlnX2luaXQKKwlQS0dfQ0hFQ0tfTU9EVUxFUyhVREVWLCBsaWJ1ZGV2ID49IDE0MywgW1VERVZfUEM9ImxpYnVkZXYiXSkKKwlBQ19ERUZJTkUoW1VERVZfU1lOQ19TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBzeW5jaHJvbmlzYXRpb24gd2l0aCB1ZGV2IHByb2Nlc3NpbmcuXSkKKworCUFDX0NIRUNLX0xJQih1ZGV2LCB1ZGV2X2RldmljZV9nZXRfaXNfaW5pdGlhbGl6ZWQsIEFDX0RFRklORShbSEFWRV9MSUJVREVWX1VERVZfREVWSUNFX0dFVF9JU19JTklUSUFMSVpFRF0sIDEsCisJICBbRGVmaW5lIHRvIDEgaWYgdWRldl9kZXZpY2VfZ2V0X2lzX2luaXRpYWxpemVkIGlzIGF2YWlsYWJsZS5dKSkKKwlMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorCitkbmwgLS0gRW5hYmxlIHVkZXYgcnVsZXMKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBpbnN0YWxsYXRpb24gb2YgdWRldiBydWxlcyByZXF1aXJlZCBmb3Igc3luY2hyb25pc2F0aW9uKQorQUNfQVJHX0VOQUJMRSh1ZGV2X3J1bGVzLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS11ZGV2X3J1bGVzXSwKKwkJCSAgICAgW2luc3RhbGwgcnVsZSBmaWxlcyBuZWVkZWQgZm9yIHVkZXYgc3luY2hyb25pc2F0aW9uXSksCisJICAgICAgVURFVl9SVUxFUz0kZW5hYmxldmFsLCBVREVWX1JVTEVTPSRVREVWX1NZTkMpCitBQ19NU0dfUkVTVUxUKCRVREVWX1JVTEVTKQorCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgZXhlY3V0YWJsZSBwYXRoIGRldGVjdGlvbiBpbiB1ZGV2IHJ1bGVzKQorQUNfQVJHX0VOQUJMRSh1ZGV2X3J1bGVfZXhlY19kZXRlY3Rpb24sCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXVkZXYtcnVsZS1leGVjLWRldGVjdGlvbl0sCisJCQkgICAgIFtlbmFibGUgZXhlY3V0YWJsZSBwYXRoIGRldGVjdGlvbiBpbiB1ZGV2IHJ1bGVzXSksCisJICAgICAgVURFVl9SVUxFX0VYRUNfREVURUNUSU9OPSRlbmFibGV2YWwsIFVERVZfUlVMRV9FWEVDX0RFVEVDVElPTj1ubykKK0FDX01TR19SRVNVTFQoJFVERVZfUlVMRV9FWEVDX0RFVEVDVElPTikKKworZG5sIC0tIENoZWNrIHN1cHBvcnQgZm9yIGJ1aWx0LWluIGJsa2lkIGFnYWluc3QgdGFyZ2V0IHVkZXYgdmVyc2lvbgoraWYgdGVzdCAiJFVERVZfUlVMRSIgIT0gbm8gOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdWRldiBzdXBwb3J0cyBidWlsdC1pbiBibGtpZCkKKwlwa2dfY29uZmlnX2luaXQKKwlpZiAkKCIkUEtHX0NPTkZJRyIgLS1hdGxlYXN0LXZlcnNpb249MTc2IGxpYnVkZXYpOyB0aGVuCisJCVVERVZfSEFTX0JVSUxUSU5fQkxLSUQ9eWVzCisJZWxzZQorCQlVREVWX0hBU19CVUlMVElOX0JMS0lEPW5vCisJZmkKKwlBQ19NU0dfUkVTVUxUKCRVREVWX0hBU19CVUlMVElOX0JMS0lEKQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDb21wYXRpYmlsaXR5IG1vZGUKK0FDX0FSR19FTkFCTEUoY29tcGF0LAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb21wYXRdLAorCQkJICAgICBbZW5hYmxlIHN1cHBvcnQgZm9yIG9sZCBkZXZpY2UtbWFwcGVyIHZlcnNpb25zXSksCisJICAgICAgRE1fQ09NUEFUPSRlbmFibGV2YWwsIERNX0NPTVBBVD1ubykKKworQVNfSUYoW3Rlc3QgIiRETV9DT01QQVQiID0geWVzXSwKKyAgICAgIFtBQ19ERUZJTkUoW0RNX0NPTVBBVF0sIDEsIFtEZWZpbmUgdG8gZW5hYmxlIGNvbXBhdCBwcm90b2NvbF0pCisgICAgICBBQ19NU0dfRVJST1IoWy0tZW5hYmxlLWNvbXBhdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KK1NpbmNlIGRldmljZS1tYXBwZXIgdmVyc2lvbiAxLjAyLjY2LCBvbmx5IG9uZSB2ZXJzaW9uICg0KSBvZiB0aGUgZGV2aWNlLW1hcHBlcgoraW9jdGwgcHJvdG9jb2wgaXMgc3VwcG9ydGVkLl0pXSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDb21wYXRpYmxlIHVuaXRzIHN1ZmZpeCBtb2RlCitBQ19BUkdfRU5BQkxFKHVuaXRzLWNvbXBhdCwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdW5pdHMtY29tcGF0XSwKKwkJCSAgICAgW2VuYWJsZSBvdXRwdXQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyB0aGF0CisJCQkgICAgICB0aGF0IGRvIG5vdCB1c2UgS2lCLXN0eWxlIHVuaXQgc3VmZml4ZXNdKSwKKwkgICAgICBVTklUU19DT01QQVQ9JGVuYWJsZXZhbCwgVU5JVFNfQ09NUEFUPW5vKQorCitpZiB0ZXN0ICIkVU5JVFNfQ09NUEFUIiA9IHllczsgdGhlbgorCUFDX0RFRklORShbREVGQVVMVF9TSV9VTklUX0NPTlNJU1RFTkNZXSwgMCwgW0RlZmluZSB0byAwIHRvIHJlaW5zdGF0ZSB0aGUgcHJlLTIuMDIuNTQgaGFuZGxpbmcgb2YgdW5pdCBzdWZmaXhlcy5dKQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBEaXNhYmxlIGlvY3RsCitBQ19BUkdfRU5BQkxFKGlvY3RsLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaW9jdGxdLAorCQkJICAgICBbZGlzYWJsZSBpb2N0bCBjYWxscyB0byBkZXZpY2UtbWFwcGVyIGluIHRoZSBrZXJuZWxdKSwKKwkgICAgICBETV9JT0NUTFM9JGVuYWJsZXZhbCkKK0FTX0lGKFt0ZXN0ICIkRE1fSU9DVExTIiA9IHllc10sCisgICAgICBbQUNfREVGSU5FKFtETV9JT0NUTFNdLCAxLCBbRGVmaW5lIHRvIGVuYWJsZSBpb2N0bHMgY2FsbHMgdG8ga2VybmVsXSldKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIERpc2FibGUgT19ESVJFQ1QKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBPX0RJUkVDVCkKK0FDX0FSR19FTkFCTEUob19kaXJlY3QsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1vX2RpcmVjdF0sIFtkaXNhYmxlIE9fRElSRUNUXSksCisJICAgICAgT0RJUkVDVD0kZW5hYmxldmFsKQorQUNfTVNHX1JFU1VMVCgkT0RJUkVDVCkKKworaWYgdGVzdCAiJE9ESVJFQ1QiID0geWVzOyB0aGVuCisJQUNfREVGSU5FKFtPX0RJUkVDVF9TVVBQT1JUXSwgMSwgW0RlZmluZSB0byAxIHRvIGVuYWJsZSBPX0RJUkVDVCBzdXBwb3J0Ll0pCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSBsaWJsdm0yYXBwLnNvCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBidWlsZCBsaWJsdm0yYXBwLnNvIGFwcGxpY2F0aW9uIGxpYnJhcnkpCitBQ19BUkdfRU5BQkxFKGFwcGxpYiwKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtYXBwbGliXSwgW2J1aWxkIGFwcGxpY2F0aW9uIGxpYnJhcnldKSwKKwkgICAgICBBUFBMSUI9JGVuYWJsZXZhbCwgQVBQTElCPW5vKQorQUNfTVNHX1JFU1VMVCgkQVBQTElCKQorQUNfU1VCU1QoW0xWTTJBUFBfTElCXSkKK3Rlc3QgIiRBUFBMSUIiID0geWVzIFwKKyAgJiYgTFZNMkFQUF9MSUI9LWxsdm0yYXBwIFwKKyAgfHwgTFZNMkFQUF9MSUI9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIGNtZGxpYgorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gY29tcGlsZSBsaWJsdm0yY21kLnNvKQorQUNfQVJHX0VOQUJMRShjbWRsaWIsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNtZGxpYl0sIFtidWlsZCBzaGFyZWQgY29tbWFuZCBsaWJyYXJ5XSksCisJICAgICAgQ01ETElCPSRlbmFibGV2YWwsIENNRExJQj1ubykKK0FDX01TR19SRVNVTFQoJENNRExJQikKK0FDX1NVQlNUKFtMVk0yQ01EX0xJQl0pCit0ZXN0ICIkQ01ETElCIiA9IHllcyBcCisgICYmIExWTTJDTURfTElCPS1sbHZtMmNtZCBcCisgIHx8IExWTTJDTURfTElCPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSBELUJ1cyBzZXJ2aWNlCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBpbmNsdWRlIFB5dGhvbiBELUJ1cyBzdXBwb3J0KQorQUNfQVJHX0VOQUJMRShkYnVzLXNlcnZpY2UsCisJICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRidXMtc2VydmljZV0sIFtpbnN0YWxsIEQtQnVzIHN1cHBvcnRdKSwKKwkgICAgICBCVUlMRF9MVk1EQlVTRD0kZW5hYmxldmFsLCBCVUlMRF9MVk1EQlVTRD1ubykKK0FDX01TR19SRVNVTFQoJEJVSUxEX0xWTURCVVNEKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSBQeXRob24gbGlibHZtMmFwcCBiaW5kaW5ncworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgUHl0aG9uIHdyYXBwZXIgZm9yIGxpYmx2bTJhcHAuc28pCitBQ19BUkdfRU5BQkxFKHB5dGhvbl9iaW5kaW5ncywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcHl0aG9uX2JpbmRpbmdzXSwgW2J1aWxkIGRlZmF1bHQgUHl0aG9uIGFwcGxpYiBiaW5kaW5nc10pLAorCSAgICAgIFBZVEhPTl9CSU5ESU5HUz0kZW5hYmxldmFsLCBQWVRIT05fQklORElOR1M9bm8pCitBQ19NU0dfUkVTVUxUKCRQWVRIT05fQklORElOR1MpCisKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGJ1aWxkIFB5dGhvbjIgd3JhcHBlciBmb3IgbGlibHZtMmFwcC5zbykKK0FDX0FSR19FTkFCTEUocHl0aG9uMl9iaW5kaW5ncywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcHl0aG9uMl9iaW5kaW5nc10sIFtidWlsZCBQeXRob24yIGFwcGxpYiBiaW5kaW5nc10pLAorCSAgICAgIFBZVEhPTjJfQklORElOR1M9JGVuYWJsZXZhbCwgUFlUSE9OMl9CSU5ESU5HUz1ubykKK0FDX01TR19SRVNVTFQoJFBZVEhPTjJfQklORElOR1MpCisKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgUHl0aG9uMyB3cmFwcGVyIGZvciBsaWJsdm0yYXBwLnNvKQorQUNfQVJHX0VOQUJMRShweXRob24zX2JpbmRpbmdzLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1weXRob24zX2JpbmRpbmdzXSwgW2J1aWxkIFB5dGhvbjMgYXBwbGliIGJpbmRpbmdzXSksCisJICAgICAgUFlUSE9OM19CSU5ESU5HUz0kZW5hYmxldmFsLCBQWVRIT04zX0JJTkRJTkdTPW5vKQorQUNfTVNHX1JFU1VMVCgkUFlUSE9OM19CSU5ESU5HUykKKworaWYgdGVzdCAiJFBZVEhPTl9CSU5ESU5HUyIgPSB5ZXM7IHRoZW4KKwlBQ19NU0dfRVJST1IoWy0tZW5hYmxlLXB5dGhvbi1iaW5kaW5ncyBpcyByZXBsYWNlZCBieSAtLWVuYWJsZS1weXRob24yLWJpbmRpbmdzIGFuZCAtLWVuYWJsZS1weXRob24zLWJpbmRpbmdzXSkKK2ZpCisKK2lmIHRlc3QgIiRQWVRIT04yX0JJTkRJTkdTIiA9IHllczsgdGhlbgorCUFNX1BBVEhfUFlUSE9OKFsyXSkKKwlBQ19QQVRIX1RPT0woUFlUSE9OMiwgcHl0aG9uMikKKwl0ZXN0IC16ICIkUFlUSE9OMiIgJiYgQUNfTVNHX0VSUk9SKFtweXRob24yIGlzIHJlcXVpcmVkIGZvciAtLWVuYWJsZS1weXRob24yX2JpbmRpbmdzIGJ1dCBjYW5ub3QgYmUgZm91bmRdKQorCUFDX1BBVEhfVE9PTChQWVRIT04yX0NPTkZJRywgcHl0aG9uMi1jb25maWcpCisJdGVzdCAteiAiJFBZVEhPTjJfQ09ORklHIiAmJiBBQ19QQVRIX1RPT0woUFlUSE9OMl9DT05GSUcsIHB5dGhvbi1jb25maWcpCisJdGVzdCAteiAiJFBZVEhPTjJfQ09ORklHIiAmJiBBQ19NU0dfRVJST1IoW3B5dGhvbiBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgLS1lbmFibGUtcHl0aG9uMl9iaW5kaW5ncyBidXQgY2Fubm90IGJlIGZvdW5kXSkKKwlQWVRIT04yX0lOQ0RJUlM9YCIkUFlUSE9OMl9DT05GSUciIC0taW5jbHVkZXNgCisJUFlUSE9OMl9MSUJESVJTPWAiJFBZVEhPTjJfQ09ORklHIiAtLWxpYnNgCisJUFlUSE9OMkRJUj0kcHl0aG9uZGlyCisJUFlUSE9OX0JJTkRJTkdTPXllcworZmkKKwkKK2lmIHRlc3QgIiRQWVRIT04zX0JJTkRJTkdTIiA9IHllcyAtbyAiJEJVSUxEX0xWTURCVVNEIiA9IHllczsgdGhlbgorCXVuc2V0IFBZVEhPTiBQWVRIT05fQ09ORklHCisJdW5zZXQgYW1fY3ZfcGF0aGxlc3NfUFlUSE9OIGFjX2N2X3BhdGhfUFlUSE9OIGFtX2N2X3B5dGhvbl9wbGF0Zm9ybQorCXVuc2V0IGFtX2N2X3B5dGhvbl9weXRob25kaXIgYW1fY3ZfcHl0aG9uX3ZlcnNpb24gYW1fY3ZfcHl0aG9uX3B5ZXhlY2RpcgorCXVuc2V0IGFjX2N2X3BhdGhfUFlUSE9OX0NPTkZJRyBhY19jdl9wYXRoX2FjX3B0X1BZVEhPTl9DT05GSUcKKwlBTV9QQVRIX1BZVEhPTihbM10pCisJUFlUSE9OMz0kUFlUSE9OCisJdGVzdCAteiAiJFBZVEhPTjMiICYmIEFDX01TR19FUlJPUihbcHl0aG9uMyBpcyByZXF1aXJlZCBmb3IgLS1lbmFibGUtcHl0aG9uM19iaW5kaW5ncyBvciAtLWVuYWJsZS1kYnVzLXNlcnZpY2UgYnV0IGNhbm5vdCBiZSBmb3VuZF0pCisJQUNfUEFUSF9UT09MKFBZVEhPTjNfQ09ORklHLCBweXRob24zLWNvbmZpZykKKwl0ZXN0IC16ICIkUFlUSE9OM19DT05GSUciICYmIEFDX01TR19FUlJPUihbcHl0aG9uMyBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgLS1lbmFibGUtcHl0aG9uM19iaW5kaW5ncyBvciAtLWVuYWJsZS1kYnVzLXNlcnZpY2UgYnV0IGNhbm5vdCBiZSBmb3VuZF0pCisJUFlUSE9OM19JTkNESVJTPWAiJFBZVEhPTjNfQ09ORklHIiAtLWluY2x1ZGVzYAorCVBZVEhPTjNfTElCRElSUz1gIiRQWVRIT04zX0NPTkZJRyIgLS1saWJzYAorCVBZVEhPTjNESVI9JHB5dGhvbmRpcgorCVBZVEhPTl9CSU5ESU5HUz15ZXMKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9MVk1EQlVTRCIgPSB5ZXM7IHRoZW4KKwkjIFRvIGdldCB0aGlzIG1hY3JvLCBpbnN0YWxsIGF1dG9jb25mLWFyY2hpdmUgcGFja2FnZSB0aGVuIHJ1biBhdXRvcmVjb25mCisJQUNfUFlUSE9OX01PRFVMRShbcHl1ZGV2XSwgW1JlcXVpcmVkXSwgcHl0aG9uMykKKwlBQ19QWVRIT05fTU9EVUxFKFtkYnVzXSwgW1JlcXVpcmVkXSwgcHl0aG9uMykKK2ZpCisKK2lmIHRlc3QgIiRQWVRIT05fQklORElOR1MiID0geWVzIC1vICIkUFlUSE9OMl9CSU5ESU5HUyIgPSB5ZXMgLW8gIiRQWVRIT04zX0JJTkRJTkdTIiA9IHllczsgdGhlbgorCXRlc3QgIiRBUFBMSUIiICE9IHllcyAmJiBBQ19NU0dfRVJST1IoW1B5dGhvbl9iaW5kaW5ncyByZXF1aXJlIC0tZW5hYmxlLWFwcGxpYl0pCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSBwa2ctY29uZmlnCitBQ19BUkdfRU5BQkxFKHBrZ2NvbmZpZywKKwkgICAgICBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtcGtnY29uZmlnXSwgW2luc3RhbGwgcGtnY29uZmlnIHN1cHBvcnRdKSwKKwkgICAgICBQS0dDT05GSUc9JGVuYWJsZXZhbCwgUEtHQ09ORklHPW5vKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEVuYWJsZSBpbnN0YWxsYXRpb24gb2Ygd3JpdGFibGUgZmlsZXMgYnkgdXNlcgorQUNfQVJHX0VOQUJMRSh3cml0ZV9pbnN0YWxsLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS13cml0ZV9pbnN0YWxsXSwKKwkJCSAgICAgW2luc3RhbGwgdXNlciB3cml0YWJsZSBmaWxlc10pLAorCSAgICAgIFdSSVRFX0lOU1RBTEw9JGVuYWJsZXZhbCwgV1JJVEVfSU5TVEFMTD1ubykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBFbmFibGUgZnNhZG0KK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGluc3RhbGwgZnNhZG0pCitBQ19BUkdfRU5BQkxFKGZzYWRtLCBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWZzYWRtXSwgW2Rpc2FibGUgZnNhZG1dKSwKKwkgICAgICBGU0FETT0kZW5hYmxldmFsKQorQUNfTVNHX1JFU1VMVCgkRlNBRE0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5hYmxlIGJsa2RlYWN0aXZhdGUKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGluc3RhbGwgYmxrZGVhY3RpdmF0ZSkKK0FDX0FSR19FTkFCTEUoYmxrZGVhY3RpdmF0ZSwgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1ibGtkZWFjdGl2YXRlXSwgW2Rpc2FibGUgYmxrZGVhY3RpdmF0ZV0pLAorCSAgICAgIEJMS0RFQUNUSVZBVEU9JGVuYWJsZXZhbCkKK0FDX01TR19SRVNVTFQoJEJMS0RFQUNUSVZBVEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gZW5hYmxlIGRtZXZlbnRkIGhhbmRsaW5nCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byB1c2UgZG1ldmVudGQpCitBQ19BUkdfRU5BQkxFKGRtZXZlbnRkLCBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZG1ldmVudGRdLAorCQkJCSAgICAgICBbZW5hYmxlIHRoZSBkZXZpY2UtbWFwcGVyIGV2ZW50IGRhZW1vbl0pLAorCSAgICAgIERNRVZFTlREPSRlbmFibGV2YWwpCitBQ19NU0dfUkVTVUxUKCRETUVWRU5URCkKKworQlVJTERfRE1FVkVOVEQ9JERNRVZFTlRECisKK2RubCAtLSBkbWV2ZW50ZCBjdXJyZW50bHkgcmVxdWlyZXMgaW50ZXJuYWwgbWlycm9yIHN1cHBvcnQKK2lmIHRlc3QgIiRETUVWRU5URCIgPSB5ZXM7IHRoZW4KKyAgIGlmIHRlc3QgIiRNSVJST1JTIiAhPSBpbnRlcm5hbDsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFstLWVuYWJsZS1kbWV2ZW50ZCBjdXJyZW50bHkgcmVxdWlyZXMgLS13aXRoLW1pcnJvcnM9aW50ZXJuYWxdKQorICAgZmkKKyAgIGlmIHRlc3QgIiRDTURMSUIiID0gbm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbLS1lbmFibGUtZG1ldmVudGQgcmVxdWlyZXMgLS1lbmFibGUtY21kbGliIHRvIGJlIHVzZWQgYXMgd2VsbF0pCisgICBmaQorCisgICBBQ19ERUZJTkUoW0RNRVZFTlREXSwgMSwgW0RlZmluZSB0byAxIHRvIGVuYWJsZSB0aGUgZGV2aWNlLW1hcHBlciBldmVudCBkYWVtb24uXSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gZ2V0bGluZSBpbmNsdWRlZCBpbiByZWNlbnQgbGliYworCitBQ19DSEVDS19MSUIoYywgZ2V0bGluZSwgQUNfREVGSU5FKFtIQVZFX0dFVExJTkVdLCAxLAorICBbRGVmaW5lIHRvIDEgaWYgZ2V0bGluZSBpcyBhdmFpbGFibGUuXSkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBpbmNsdWRlZCBpbiByZWNlbnQgbGliYworCitBQ19DSEVDS19MSUIoYywgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSwKKyAgQUNfREVGSU5FKFtIQVZFX0NBTk9OSUNBTElaRV9GSUxFX05BTUVdLCAxLAorICAgIFtEZWZpbmUgdG8gMSBpZiBjYW5vbmljYWxpemVfZmlsZV9uYW1lIGlzIGF2YWlsYWJsZS5dKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDbGVhciBkZWZhdWx0IGV4ZWNfcHJlZml4IC0gaW5zdGFsbCBpbnRvIC9zYmluIHJhdGhlciB0aGFuIC91c3Ivc2JpbgordGVzdCAiJGV4ZWNfcHJlZml4IiA9IE5PTkUgLWEgIiRwcmVmaXgiID0gTk9ORSAmJiBleGVjX3ByZWZpeD0iIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIENoZWNrIGZvciBkbG9wZW4KK0FDX0NIRUNLX0xJQihkbCwgZGxvcGVuLAorCSAgICAgW0FDX0RFRklORShbSEFWRV9MSUJETF0sIDEsIFtEZWZpbmUgdG8gMSBpZiBkeW5hbWljIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlLl0pCisJICAgICAgRExfTElCUz0iLWxkbCIKKwkgICAgICBIQVZFX0xJQkRMPXllc10sCisJICAgICBbRExfTElCUz0KKwkgICAgICBIQVZFX0xJQkRMPW5vIF0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMgY29uZmxpY3RzCitpZiBbWyBcKCAiJExWTTEiID0gc2hhcmVkIC1vICIkUE9PTCIgPSBzaGFyZWQgLW8gIiRDTFVTVEVSIiA9IHNoYXJlZCBcCisgICAgICAtbyAiJFNOQVBTSE9UUyIgPSBzaGFyZWQgLW8gIiRNSVJST1JTIiA9IHNoYXJlZCBcCisgICAgICAtbyAiJFJBSUQiID0gc2hhcmVkIC1vICIkQ0FDSEUiID0gc2hhcmVkIFwKKyAgICAgIFwpIC1hICIkU1RBVElDX0xJTksiID0geWVzIF1dOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtGZWF0dXJlcyBjYW5ub3QgYmUgJ3NoYXJlZCcgd2hlbiBidWlsZGluZyBzdGF0aWNhbGx5XSkKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitBQ19DSEVDS19MSUIobSwgbG9nMTAsCisJW01fTElCUz0iLWxtIl0sIGhhcmRfYmFpbG91dCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX0NIRUNLX0xJQihbcHRocmVhZF0sIFtwdGhyZWFkX211dGV4X2xvY2tdLAorCVtQVEhSRUFEX0xJQlM9Ii1scHRocmVhZCJdLCBoYXJkX2JhaWxvdXQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRGlzYWJsZSBzZWxpbnV4CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0byBlbmFibGUgc2VsaW51eCBzdXBwb3J0KQorQUNfQVJHX0VOQUJMRShzZWxpbnV4LAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc2VsaW51eF0sIFtkaXNhYmxlIHNlbGludXggc3VwcG9ydF0pLAorCSAgICAgIFNFTElOVVg9JGVuYWJsZXZhbCkKK0FDX01TR19SRVNVTFQoJFNFTElOVVgpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgZm9yIHNlbGludXgKK2lmIHRlc3QgIiRTRUxJTlVYIiA9IHllczsgdGhlbgorCUFDX0NIRUNLX0xJQihbc2Vwb2xdLCBbc2Vwb2xfY2hlY2tfY29udGV4dF0sIFsKKwkJQUNfREVGSU5FKFtIQVZFX1NFUE9MXSwgMSwgW0RlZmluZSB0byAxIGlmIHNlcG9sX2NoZWNrX2NvbnRleHQgaXMgYXZhaWxhYmxlLl0pCisJCVNFTElOVVhfTElCUz0iLWxzZXBvbCJdKQorCisJQUNfQ0hFQ0tfTElCKFtzZWxpbnV4XSwgW2lzX3NlbGludXhfZW5hYmxlZF0sIFsKKwkJQUNfQ0hFQ0tfSEVBREVSUyhbc2VsaW51eC9zZWxpbnV4LmhdLCwgaGFyZF9iYWlsb3V0KQorCQlBQ19DSEVDS19IRUFERVJTKFtzZWxpbnV4L2xhYmVsLmhdKQorCQlBQ19ERUZJTkUoW0hBVkVfU0VMSU5VWF0sIDEsIFtEZWZpbmUgdG8gMSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNlbGludXguXSkKKwkJU0VMSU5VWF9MSUJTPSItbHNlbGludXggJFNFTElOVVhfTElCUyIKKwkJU0VMSU5VWF9QQz0ibGlic2VsaW51eCIKKwkJSEFWRV9TRUxJTlVYPXllcyBdLCBbCisJCUFDX01TR19XQVJOKERpc2FibGluZyBzZWxpbnV4KQorCQlTRUxJTlVYX0xJQlM9CisJCVNFTElOVVhfUEM9CisJCUhBVkVfU0VMSU5VWD1ubyBdKQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDaGVjayBmb3IgcmVhbHRpbWUgY2xvY2sgc3VwcG9ydAoraWYgdGVzdCAiJFJFQUxUSU1FIiA9IHllczsgdGhlbgorCUFDX0NIRUNLX0xJQihydCwgY2xvY2tfZ2V0dGltZSwgSEFWRV9SRUFMVElNRT15ZXMsIEhBVkVfUkVBTFRJTUU9bm8pCisKKwlpZiB0ZXN0ICIkSEFWRV9SRUFMVElNRSIgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKFtIQVZFX1JFQUxUSU1FXSwgMSwgW0RlZmluZSB0byAxIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgcmVhbHRpbWUgY2xvY2suXSkKKwkJTElCUz0iLWxydCAkTElCUyIKKwkJUlRfTElCPSItbHJ0IgorCWVsc2UKKwkJQUNfTVNHX1dBUk4oRGlzYWJsaW5nIHJlYWx0aW1lIGNsb2NrKQorCWZpCitmaQorCitkbmwgQ2hlY2sgaWYgdGhlIHN5c3RlbSBoYXMgc3RydWN0IHN0YXQgc3RfY3RpbS4KK0FDX0NBQ0hFX0NIRUNLKFtmb3Igc3RydWN0IHN0YXQgaGFzIHN0X2N0aW0uXSwKKwlbYWNfY3Zfc3RhdF9zdF9jdGltXSwKKwlbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1sjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2xvbmcgYmFyKHZvaWQpIHsgc3RydWN0IHN0YXQgczsgcmV0dXJuIChsb25nKShzLnN0X2N0aW0udHZfc2VjICsgcy5zdF9jdGltLnR2X25zZWMpO31dCisJICldLCBbYWNfY3Zfc3RhdF9zdF9jdGltPXllc10sIFthY19jdl9zdGF0X3N0X2N0aW09bm9dKV0pCisKK0FDX0lGX1lFUyhhY19jdl9zdGF0X3N0X2N0aW0sCisJICBBQ19ERUZJTkUoSEFWRV9TVEFUX1NUX0NUSU0sIDEsCisJCSAgICBbRGVmaW5lIGlmIHN0cnVjdCBzdGF0IGhhcyBhIGZpZWxkIHN0X2N0aW0gd2l0aCB0aW1lc3BlYyBmb3IgY3RpbWVdKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSBDaGVjayBmb3IgZ2V0b3B0CitBQ19DSEVDS19IRUFERVJTKGdldG9wdC5oLCBBQ19ERUZJTkUoW0hBVkVfR0VUT1BUTE9OR10sIDEsIFtEZWZpbmUgdG8gMSBpZiBnZXRvcHRfbG9uZyBpcyBhdmFpbGFibGUuXSkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gQ2hlY2sgZm9yIHJlYWRsaW5lIChTaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBwYXJ0ZWQgMS40LjE3KQoraWYgdGVzdCAiJFJFQURMSU5FIiAhPSBubzsgdGhlbgorCWx2bV9zYXZlZF9saWJzPSRMSUJTCisJQUNfU0VBUkNIX0xJQlMoW3RnZXRlbnRdLCBbdGluZm8gbmN1cnNlcyBjdXJzZXMgdGVybWNhcCB0ZXJtbGliXSwKKwkJUkVBRExJTkVfTElCUz0kYWNfY3Zfc2VhcmNoX3RnZXRlbnQsIFsKKwkJaWYgdGVzdCAiJFJFQURMSU5FIiA9IHllczsgdGhlbgorCQkJQUNfTVNHX0VSUk9SKAorW3Rlcm1jYXAgY291bGQgbm90IGJlIGZvdW5kIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB0aGUKKy0tZW5hYmxlLXJlYWRsaW5lIG9wdGlvbiAod2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0KS4gIEVpdGhlciBkaXNhYmxlIHJlYWRsaW5lCitzdXBwb3J0IHdpdGggLS1kaXNhYmxlLXJlYWRsaW5lIG9yIGRvd25sb2FkIGFuZCBpbnN0YWxsIHRlcm1jYXAgZnJvbToKKwlmdHAuZ251Lm9yZy9nbnUvdGVybWNhcAorTm90ZTogaWYgeW91IGFyZSB1c2luZyBwcmVjb21waWxlZCBwYWNrYWdlcyB5b3Ugd2lsbCBhbHNvIG5lZWQgdGhlIGRldmVsb3BtZW50CisgIHBhY2thZ2UgYXMgd2VsbCAod2hpY2ggbWF5IGJlIGNhbGxlZCB0ZXJtY2FwLWRldmVsIG9yIHNvbWV0aGluZyBzaW1pbGFyKS4KK05vdGU6IChuKWN1cnNlcyBhbHNvIHNlZW1zIHRvIHdvcmsgYXMgYSBzdWJzdGl0dXRlIGZvciB0ZXJtY2FwLiAgVGhpcyB3YXMKKyAgbm90IGZvdW5kIGVpdGhlciAtIGJ1dCB5b3UgY291bGQgdHJ5IGluc3RhbGxpbmcgdGhhdCBhcyB3ZWxsLl0pCisJCWZpXSkKKwlkbmwgLS0gT2xkIHN5c3RlbXMgbWF5IG5lZWQgZXh0cmEgdGVybWNhcCBkZXBlbmRlbmN5IGV4cGxpY2l0bHkgaW4gTElCUworCUFDX0NIRUNLX0xJQihbcmVhZGxpbmVdLCBbcmVhZGxpbmVdLCBbCisJCUFDX0RFRklORShbUkVBRExJTkVfU1VQUE9SVF0sIDEsCisJCQlbRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSB0aGUgTFZNIHJlYWRsaW5lIHNoZWxsLl0pCisJCWRubCAtLSBUcnkgb25seSB3aXRoIC1scmVhZGxpbmUgYW5kIGNoZWNrIGZvciBkaWZmZXJlbnQgc3ltYm9sCisJCUxJQlM9JGx2bV9zYXZlZF9saWJzCisJCUFDX0NIRUNLX0xJQihbcmVhZGxpbmVdLCBbcmxfbGluZV9idWZmZXJdLAorCQkJWyBSRUFETElORV9MSUJTPSItbHJlYWRsaW5lIiBdLCBbCisJCQkgIEFDX01TR19SRVNVTFQoW2xpbmtpbmcgLWxyZWFkbGluZSB3aXRoICRSRUFETElORV9MSUJTIG5lZWRlZF0pCisJCQkgIFJFQURMSU5FX0xJQlM9Ii1scmVhZGxpbmUgJFJFQURMSU5FX0xJQlMiCisJCQldKSBdLCBbCisJCVJFQURMSU5FX0xJQlM9CisJCWlmIHRlc3QgIiRSRUFETElORSIgPSB5ZXM7IHRoZW4KKwkJCUFDX01TR19FUlJPUigKK1tHTlUgUmVhZGxpbmUgY291bGQgbm90IGJlIGZvdW5kIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB0aGUKKy0tZW5hYmxlLXJlYWRsaW5lIG9wdGlvbiAod2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0KS4gIEVpdGhlciBkaXNhYmxlIHJlYWRsaW5lCitzdXBwb3J0IHdpdGggLS1kaXNhYmxlLXJlYWRsaW5lIG9yIGRvd25sb2FkIGFuZCBpbnN0YWxsIHJlYWRsaW5lIGZyb206CisJZnRwLmdudS5vcmcvZ251L3JlYWRsaW5lCitOb3RlOiBpZiB5b3UgYXJlIHVzaW5nIHByZWNvbXBpbGVkIHBhY2thZ2VzIHlvdSB3aWxsIGFsc28gbmVlZCB0aGUgZGV2ZWxvcG1lbnQKK3BhY2thZ2UgYXMgd2VsbCAod2hpY2ggbWF5IGJlIGNhbGxlZCByZWFkbGluZS1kZXZlbCBvciBzb21ldGhpbmcgc2ltaWxhcikuXSkKKwkJZmkgXSkKKwlMSUJTPSIkUkVBRExJTkVfTElCUyAkbHZtX3NhdmVkX2xpYnMiCisJQUNfQ0hFQ0tfRlVOQ1MoW3JsX2NvbXBsZXRpb25fbWF0Y2hlc10pCisJTElCUz0kbHZtX3NhdmVkX2xpYnMKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gSW50ZXJuYXRpb25hbGlzYXRpb24gc3R1ZmYKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBpbnRlcm5hdGlvbmFsaXNhdGlvbikKK0FDX0FSR19FTkFCTEUobmxzLAorCSAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ubHNdLCBbZW5hYmxlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSksCisJICAgICAgSU5UTD0kZW5hYmxldmFsLCBJTlRMPW5vKQorQUNfTVNHX1JFU1VMVCgkSU5UTCkKKworaWYgdGVzdCAiJElOVEwiID0geWVzOyB0aGVuCisjIEZJWE1FIC0gTW92ZSB0aGlzIC0gY2FuIGJlIGRldmljZS1tYXBwZXIgdG9vCisJSU5UTF9QQUNLQUdFPSJsdm0yIgorCUFDX1BBVEhfVE9PTChNU0dGTVQsIG1zZ2ZtdCkKKworCUFTX0lGKFt0ZXN0IC16ICIkTVNHRk1UIl0sIFtBQ19NU0dfRVJST1IoW21zZ2ZtdCBub3QgZm91bmQgaW4gcGF0aCAkUEFUSF0pXSkKKworCUFDX0FSR19XSVRIKGxvY2FsZWRpciwKKwkJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbG9jYWxlZGlyPURJUl0sCisJCQkJICAgW2xvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXV0pLAorCQkgICAgbG9jYWxlZGlyPSR3aXRodmFsLCBsb2NhbGVkaXI9JHtsb2NhbGVkaXItJyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZSd9KQorCUFDX0RFRklORV9VTlFVT1RFRChbSU5UTF9QQUNLQUdFXSwgWyIkSU5UTF9QQUNLQUdFIl0sIFtJbnRlcm5hbGl6YXRpb24gcGFja2FnZV0pCisJIyBkb3VibGUgZXZhbCBuZWVkZWQgJHtkYXRhcm9vdGRpcn0gLT4gJHtwcmVmaXh9L3NoYXJlIC0+IHJlYWwgcGF0aAorCUFDX0RFRklORV9VTlFVT1RFRChbTE9DQUxFRElSXSwgWyIkKGV2YWwgZWNobyAkKGV2YWwgZWNobyAkbG9jYWxlZGlyKSkiXSwgW0xvY2FsZS1kZXBlbmRlbnQgZGF0YV0pCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEZJWE1FOiBuZWVkIHRvIHN3aXRjaCB0byByZWd1bGFyIG9wdGlvbiBoZXJlICAtLXN5c2NvbmZkaXIKK0FDX0FSR19XSVRIKGNvbmZkaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uZmRpcj1ESVJdLAorCQkJICAgW2NvbmZpZ3VyYXRpb24gZmlsZXMgaW4gRElSIFsvZXRjXV0pLAorCSAgICBDT05GRElSPSR3aXRodmFsLCBDT05GRElSPScvZXRjJykKK0FDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0VUQ19ESVIsIFsiJENPTkZESVIiXSwKKwkJICAgW0RlZmF1bHQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5Ll0pCisKK0FDX0FSR19XSVRIKHN0YXRpY2RpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zdGF0aWNkaXI9RElSXSwKKwkJCSAgIFtzdGF0aWMgYmluYXJpZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dXSksCisJICAgIFNUQVRJQ0RJUj0kd2l0aHZhbCwgU1RBVElDRElSPScke2V4ZWNfcHJlZml4fS9zYmluJykKKworQUNfQVJHX1dJVEgodXNybGliZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXVzcmxpYmRpcj1ESVJdLAorCQkJICAgW3VzcmxpYiBpbiBESVIgW1BSRUZJWC9saWJdXSksCisJICAgIHVzcmxpYmRpcj0kd2l0aHZhbCwgdXNybGliZGlyPScke3ByZWZpeH0vbGliJykKKworQUNfQVJHX1dJVEgodXNyc2JpbmRpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC11c3JzYmluZGlyPURJUl0sCisJCQkgICBbdXNyc2JpbiBleGVjdXRhYmxlcyBpbiBESVIgW1BSRUZJWC9zYmluXV0pLAorCSAgICB1c3JzYmluZGlyPSR3aXRodmFsLCB1c3JzYmluZGlyPScke3ByZWZpeH0vc2JpbicpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitBQ19BUkdfV0lUSCh1ZGV2X3ByZWZpeCwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC11ZGV2LXByZWZpeD1VUFJFRklYXSwKKwkJCSAgIFtpbnN0YWxsIHVkZXYgcnVsZSBmaWxlcyBpbiBVUFJFRklYIFtFUFJFRklYXV0pLAorCSAgICB1ZGV2X3ByZWZpeD0kd2l0aHZhbCwgdWRldl9wcmVmaXg9JyR7ZXhlY19wcmVmaXh9JykKKworQUNfQVJHX1dJVEgodWRldmRpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC11ZGV2ZGlyPURJUl0sCisJCQkgICBbdWRldiBydWxlcyBpbiBESVIgW1VQUkVGSVgvbGliL3VkZXYvcnVsZXMuZF1dKSwKKwkgICAgdWRldmRpcj0kd2l0aHZhbCwgdWRldmRpcj0nJHt1ZGV2X3ByZWZpeH0vbGliL3VkZXYvcnVsZXMuZCcpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gR2V0IHRoZSBzeXN0ZW1kIHN5c3RlbSB1bml0IGRpciB2YWx1ZSBmcm9tIHBrZ19jb25maWcgYXV0b21hdGljYWxseSBpZiB2YWx1ZSBub3QgZ2l2ZW4gZXhwbGljaXRseS4KK2RubCAtLSBUaGlzIGZvbGxvd3MgdGhlIHJlY29tbWVuZGF0aW9uIGZvciBzeXN0ZW1kIGludGVncmF0aW9uIGJlc3QgcHJhY3RpY2VzIG1lbnRpb25lZCBpbiBkYWVtb24oNykgbWFucGFnZS4KK0FDX0FSR19XSVRIKHN5c3RlbWRzeXN0ZW11bml0ZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPURJUl0sCisJCQkgICBbc3lzdGVtZCBzZXJ2aWNlIGZpbGVzIGluIERJUl0pLAorCSAgICBzeXN0ZW1kc3lzdGVtdW5pdGRpcj0kd2l0aHZhbCwKKwkgICAgcGtnX2NvbmZpZ19pbml0CisJICAgIHBrZ19zeXN0ZW1kc3lzdGVtdW5pdGRpcj0kKCIkUEtHX0NPTkZJRyIgLS12YXJpYWJsZT1zeXN0ZW1kc3lzdGVtdW5pdGRpciBzeXN0ZW1kKSkKKwordGVzdCAtbiAiJHBrZ19zeXN0ZW1kc3lzdGVtdW5pdGRpciIgJiYgc3lzdGVtZHN5c3RlbXVuaXRkaXI9JHBrZ19zeXN0ZW1kc3lzdGVtdW5pdGRpcgordGVzdCAteiAiJHN5c3RlbWRzeXN0ZW11bml0ZGlyIiAmJiBzeXN0ZW1kc3lzdGVtdW5pdGRpcj0nJHtleGVjX3ByZWZpeH0vbGliL3N5c3RlbWQvc3lzdGVtJzsKKworc3lzdGVtZHV0aWxkaXI9JCgiJFBLR19DT05GSUciIC0tdmFyaWFibGU9c3lzdGVtZHV0aWxkaXIgc3lzdGVtZCkKK3Rlc3QgLXogIiRzeXN0ZW1kdXRpbGRpciIgJiYgc3lzdGVtZHV0aWxkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYi9zeXN0ZW1kJzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX0FSR19XSVRIKHRtcGZpbGVzZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXRtcGZpbGVzZGlyPURJUl0sCisJCQkgICBbaW5zdGFsbCBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBtYW5hZ2VtZW50IG9mIHZvbGF0aWxlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiBESVIgW1BSRUZJWC9saWIvdG1wZmlsZXMuZF1dKSwKKwkJCSAgIHRtcGZpbGVzZGlyPSR3aXRodmFsLCB0bXBmaWxlc2Rpcj0nJHtwcmVmaXh9L2xpYi90bXBmaWxlcy5kJykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gRW5zdXJlIGFkZGl0aW9uYWwgaGVhZGVycyByZXF1aXJlZAoraWYgdGVzdCAiJFJFQURMSU5FIiA9IHllczsgdGhlbgorCUFDX0NIRUNLX0hFQURFUlMocmVhZGxpbmUvcmVhZGxpbmUuaCByZWFkbGluZS9oaXN0b3J5LmgsLGhhcmRfYmFpbG91dCkKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9DTUlSUk9SRCIgPSB5ZXM7IHRoZW4KKwlBQ19DSEVDS19GVU5DUyhhdGV4aXQsLGhhcmRfYmFpbG91dCkKK2ZpCisKK2lmIHRlc3QgIiRCVUlMRF9MVk1MT0NLRCIgPSB5ZXM7IHRoZW4KKwlBQ19DSEVDS19GVU5DUyhjbG9ja19nZXR0aW1lIHN0cnRvdWxsLCxoYXJkX2JhaWxvdXQpCitmaQorCitpZiB0ZXN0ICIkQlVJTERfTFZNUE9MTEQiID0geWVzOyB0aGVuCisJQUNfQ0hFQ0tfRlVOQ1Moc3RycGJyaywsaGFyZF9iYWlsb3V0KQorCUFDX0ZVTkNfU1RSRVJST1JfUgorZmkKKworaWYgdGVzdCAiJENMVk1EIiAhPSBub25lOyB0aGVuCisJQUNfQ0hFQ0tfSEVBREVSUyhtbnRlbnQuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBwdGhyZWFkLmggc2VhcmNoLmggc3lzL21vdW50Lmggc3lzL3NvY2tldC5oIHN5cy91aW8uaCBzeXMvdW4uaCB1dG1weC5oLCxBQ19NU0dfRVJST1IoYmFpbGluZyBvdXQpKQorCUFDX0NIRUNLX0ZVTkNTKGR1cDIgZ2V0bW50ZW50IG1lbW1vdmUgc2VsZWN0IHNvY2tldCwsaGFyZF9iYWlsb3V0KQorCUFDX0ZVTkNfR0VUTU5URU5UCisJQUNfRlVOQ19TRUxFQ1RfQVJHVFlQRVMKK2ZpCisKK2lmIHRlc3QgIiRDTFVTVEVSIiAhPSBub25lOyB0aGVuCisJQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc29ja2V0Lmggc3lzL3VuLmgsLGhhcmRfYmFpbG91dCkKKwlBQ19DSEVDS19GVU5DUyhzb2NrZXQsLGhhcmRfYmFpbG91dCkKK2ZpCisKK2lmIHRlc3QgIiRETUVWRU5URCIgPSB5ZXM7IHRoZW4KKwlBQ19DSEVDS19IRUFERVJTKGFycGEvaW5ldC5oLCxoYXJkX2JhaWxvdXQpCitmaQorCitpZiB0ZXN0ICIkSEFWRV9MSUJETCIgPSB5ZXM7IHRoZW4KKwlBQ19DSEVDS19IRUFERVJTKGRsZmNuLmgsLGhhcmRfYmFpbG91dCkKK2ZpCisKK2lmIHRlc3QgIiRJTlRMIiA9IHllczsgdGhlbgorCUFDX0NIRUNLX0hFQURFUlMobGliaW50bC5oLCxoYXJkX2JhaWxvdXQpCitmaQorCitpZiB0ZXN0ICIkVURFVl9TWU5DIiA9IHllczsgdGhlbgorCUFDX0NIRUNLX0hFQURFUlMoc3lzL2lwYy5oIHN5cy9zZW0uaCwsaGFyZF9iYWlsb3V0KQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX1BBVEhfVE9PTChNT0RQUk9CRV9DTUQsIG1vZHByb2JlKQorCitpZiB0ZXN0IC1uICIkTU9EUFJPQkVfQ01EIjsgdGhlbgorCUFDX0RFRklORV9VTlFVT1RFRChbTU9EUFJPQkVfQ01EXSwgWyIkTU9EUFJPQkVfQ01EIl0sIFtUaGUgcGF0aCB0byAnbW9kcHJvYmUnLCBpZiBhdmFpbGFibGUuXSkKK2ZpCisKKworbHZtX2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeAordGVzdCAiJGx2bV9leGVjX3ByZWZpeCIgPSBOT05FICYmIGx2bV9leGVjX3ByZWZpeD0kcHJlZml4Cit0ZXN0ICIkbHZtX2V4ZWNfcHJlZml4IiA9IE5PTkUgJiYgbHZtX2V4ZWNfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorTFZNX1BBVEg9IiRsdm1fZXhlY19wcmVmaXgvc2Jpbi9sdm0iCitBQ19ERUZJTkVfVU5RVU9URUQoTFZNX1BBVEgsIFsiJExWTV9QQVRIIl0sIFtQYXRoIHRvIGx2bSBiaW5hcnkuXSkKKworY2x2bWRfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAordGVzdCAiJHByZWZpeCIgIT0gTk9ORSAmJiBjbHZtZF9wcmVmaXg9JHByZWZpeAorQ0xWTURfUEFUSD0iJGNsdm1kX3ByZWZpeC9zYmluL2Nsdm1kIgorQUNfREVGSU5FX1VOUVVPVEVEKENMVk1EX1BBVEgsIFsiJENMVk1EX1BBVEgiXSwgW1BhdGggdG8gY2x2bWQgYmluYXJ5Ll0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gZG1ldmVudGQgcGlkZmlsZSBhbmQgZXhlY3V0YWJsZSBwYXRoCitpZiB0ZXN0ICIkQlVJTERfRE1FVkVOVEQiID0geWVzOyB0aGVuCisJQUNfQVJHX1dJVEgoZG1ldmVudGQtcGlkZmlsZSwKKwkJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZG1ldmVudGQtcGlkZmlsZT1QQVRIXSwKKwkJCQkgICBbZG1ldmVudGQgcGlkZmlsZSBbUElEX0RJUi9kbWV2ZW50ZC5waWRdXSksCisJCSAgICBETUVWRU5URF9QSURGSUxFPSR3aXRodmFsLAorCQkgICAgRE1FVkVOVERfUElERklMRT0iJERFRkFVTFRfUElEX0RJUi9kbWV2ZW50ZC5waWQiKQorCUFDX0RFRklORV9VTlFVT1RFRChETUVWRU5URF9QSURGSUxFLCBbIiRETUVWRU5URF9QSURGSUxFIl0sCisJCQkgICBbUGF0aCB0byBkbWV2ZW50ZCBwaWRmaWxlLl0pCitmaQorCitpZiB0ZXN0ICIkQlVJTERfRE1FVkVOVEQiID0geWVzOyB0aGVuCisJQUNfQVJHX1dJVEgoZG1ldmVudGQtcGF0aCwKKwkJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZG1ldmVudGQtcGF0aD1QQVRIXSwKKwkJCQkgICBbZG1ldmVudGQgcGF0aCBbRVBSRUZJWC9zYmluL2RtZXZlbnRkXV0pLAorCQkgICAgRE1FVkVOVERfUEFUSD0kd2l0aHZhbCwKKwkJICAgIERNRVZFTlREX1BBVEg9IiRsdm1fZXhlY19wcmVmaXgvc2Jpbi9kbWV2ZW50ZCIpCisJQUNfREVGSU5FX1VOUVVPVEVEKERNRVZFTlREX1BBVEgsIFsiJERNRVZFTlREX1BBVEgiXSwKKwkJCSAgIFtQYXRoIHRvIGRtZXZlbnRkIGJpbmFyeS5dKQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RubCAtLSB2YXJpb3VzIGRlZmF1bHRzCitkbmwgLS0gRklYTUU6IG5lZWQgdG8gc3dpdGNoIHRvIHJlZ3VsYXIgb3B0aW9uIGhlcmUgIC0tc3lzY29uZmRpcgorQUNfQVJHX1dJVEgoZGVmYXVsdC1zeXN0ZW0tZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWRlZmF1bHQtc3lzdGVtLWRpcj1ESVJdLAorCQkJICAgW2RlZmF1bHQgTFZNIHN5c3RlbSBkaXJlY3RvcnkgWy9ldGMvbHZtXV0pLAorCSAgICBERUZBVUxUX1NZU19ESVI9JHdpdGh2YWwsIERFRkFVTFRfU1lTX0RJUj0iL2V0Yy9sdm0iKQorQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfU1lTX0RJUiwgWyIkREVGQVVMVF9TWVNfRElSIl0sCisJCSAgIFtQYXRoIHRvIExWTSBzeXN0ZW0gZGlyZWN0b3J5Ll0pCisKK0FDX0FSR19XSVRIKGRlZmF1bHQtcHJvZmlsZS1zdWJkaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1wcm9maWxlLXN1YmRpcj1TVUJESVJdLAorCQkJICAgW2RlZmF1bHQgY29uZmlndXJhdGlvbiBwcm9maWxlIHN1YmRpciBbcHJvZmlsZV1dKSwKKwkgICAgREVGQVVMVF9QUk9GSUxFX1NVQkRJUj0kd2l0aHZhbCwgREVGQVVMVF9QUk9GSUxFX1NVQkRJUj1wcm9maWxlKQorQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfUFJPRklMRV9TVUJESVIsIFsiJERFRkFVTFRfUFJPRklMRV9TVUJESVIiXSwKKwkJICAgW05hbWUgb2YgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb2ZpbGUgc3ViZGlyZWN0b3J5Ll0pCisKK0FDX0FSR19XSVRIKGRlZmF1bHQtYXJjaGl2ZS1zdWJkaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1hcmNoaXZlLXN1YmRpcj1TVUJESVJdLAorCQkJICAgW2RlZmF1bHQgbWV0YWRhdGEgYXJjaGl2ZSBzdWJkaXIgW2FyY2hpdmVdXSksCisJICAgIERFRkFVTFRfQVJDSElWRV9TVUJESVI9JHdpdGh2YWwsIERFRkFVTFRfQVJDSElWRV9TVUJESVI9YXJjaGl2ZSkKK0FDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0FSQ0hJVkVfU1VCRElSLCBbIiRERUZBVUxUX0FSQ0hJVkVfU1VCRElSIl0sCisJCSAgIFtOYW1lIG9mIGRlZmF1bHQgbWV0YWRhdGEgYXJjaGl2ZSBzdWJkaXJlY3RvcnkuXSkKKworQUNfQVJHX1dJVEgoZGVmYXVsdC1iYWNrdXAtc3ViZGlyLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWRlZmF1bHQtYmFja3VwLXN1YmRpcj1TVUJESVJdLAorCQkJICAgW2RlZmF1bHQgbWV0YWRhdGEgYmFja3VwIHN1YmRpciBbYmFja3VwXV0pLAorCSAgICBERUZBVUxUX0JBQ0tVUF9TVUJESVI9JHdpdGh2YWwsIERFRkFVTFRfQkFDS1VQX1NVQkRJUj1iYWNrdXApCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9CQUNLVVBfU1VCRElSLCBbIiRERUZBVUxUX0JBQ0tVUF9TVUJESVIiXSwKKyAgICAgICAgICAgICAgICAgICBbTmFtZSBvZiBkZWZhdWx0IG1ldGFkYXRhIGJhY2t1cCBzdWJkaXJlY3RvcnkuXSkKKworQUNfQVJHX1dJVEgoZGVmYXVsdC1jYWNoZS1zdWJkaXIsCisJICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGVmYXVsdC1jYWNoZS1zdWJkaXI9U1VCRElSXSwKKwkJCSAgIFtkZWZhdWx0IG1ldGFkYXRhIGNhY2hlIHN1YmRpciBbY2FjaGVdXSksCisJICAgIERFRkFVTFRfQ0FDSEVfU1VCRElSPSR3aXRodmFsLCBERUZBVUxUX0NBQ0hFX1NVQkRJUj1jYWNoZSkKK0FDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0NBQ0hFX1NVQkRJUiwgWyIkREVGQVVMVF9DQUNIRV9TVUJESVIiXSwKKwkJICAgW05hbWUgb2YgZGVmYXVsdCBtZXRhZGF0YSBjYWNoZSBzdWJkaXJlY3RvcnkuXSkKKworQUNfQVJHX1dJVEgoZGVmYXVsdC1sb2NraW5nLWRpciwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LWxvY2tpbmctZGlyPURJUl0sCisJCQkgICBbZGVmYXVsdCBsb2NraW5nIGRpcmVjdG9yeSBbYXV0b2RldGVjdF9sb2NrX2Rpci9sdm1dXSksCisJICAgIERFRkFVTFRfTE9DS19ESVI9JHdpdGh2YWwsCisJICAgIFtBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRlZmF1bHQgbG9jayBkaXJlY3RvcnkpCisJICAgICBERUZBVUxUX0xPQ0tfRElSPSIkUlVOX0RJUi9sb2NrL2x2bSIKKwkgICAgIHRlc3QgLWQgIiRSVU5fRElSL2xvY2siIHx8IERFRkFVTFRfTE9DS19ESVI9Ii92YXIvbG9jay9sdm0iCisJICAgICBBQ19NU0dfUkVTVUxUKCRERUZBVUxUX0xPQ0tfRElSKV0pCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9MT0NLX0RJUiwgWyIkREVGQVVMVF9MT0NLX0RJUiJdLAorCQkgICBbTmFtZSBvZiBkZWZhdWx0IGxvY2tpbmcgZGlyZWN0b3J5Ll0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gU2V0dXAgZGVmYXVsdCBkYXRhIGFsaWdubWVudAorQUNfQVJHX1dJVEgoZGVmYXVsdC1kYXRhLWFsaWdubWVudCwKKwkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZWZhdWx0LWRhdGEtYWxpZ25tZW50PU5VTV0sCisJCQkgICBbc2V0IHRoZSBkZWZhdWx0IGRhdGEgYWxpZ25tZW50IGluIE1pQiBbMV1dKSwKKwkgICAgREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0kd2l0aHZhbCwgREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0xKQorQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfREFUQV9BTElHTk1FTlQsIFskREVGQVVMVF9EQVRBX0FMSUdOTUVOVF0sCisJCSAgIFtEZWZhdWx0IGRhdGEgYWxpZ25tZW50Ll0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkbmwgLS0gd2hpY2gga2VybmVsIGludGVyZmFjZSB0byB1c2UgKGlvY3RsIG9ubHkpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGtlcm5lbCBpbnRlcmZhY2UgY2hvaWNlKQorQUNfQVJHX1dJVEgoaW50ZXJmYWNlLAorCSAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWludGVyZmFjZT1JRkFDRV0sCisJCQkgICBbY2hvb3NlIGtlcm5lbCBpbnRlcmZhY2UgKGlvY3RsKSBbaW9jdGxdXSksCisJICAgIGludGVyZmFjZT0kd2l0aHZhbCwgaW50ZXJmYWNlPWlvY3RsKQordGVzdCAiJGludGVyZmFjZSIgIT0gaW9jdGwgJiYgQUNfTVNHX0VSUk9SKFstLXdpdGgtaW50ZXJmYWNlPWlvY3RsIHJlcXVpcmVkLiBmcyBubyBsb25nZXIgc3VwcG9ydGVkLl0pCitBQ19NU0dfUkVTVUxUKCRpbnRlcmZhY2UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCityZWFkIERNX0xJQl9WRVJTSU9OIDwgIiRzcmNkaXIiL1ZFUlNJT05fRE0gMj4vZGV2L251bGwgfHwgRE1fTElCX1ZFUlNJT049VW5rbm93bgorQUNfREVGSU5FX1VOUVVPVEVEKERNX0xJQl9WRVJTSU9OLCAiJERNX0xJQl9WRVJTSU9OIiwgW0xpYnJhcnkgdmVyc2lvbl0pCisKK0RNX0xJQl9QQVRDSExFVkVMPWBjYXQgIiRzcmNkaXIiL1ZFUlNJT05fRE0gfCAkQVdLIC1GICdbWy0uIF1dJyAne3ByaW50ZiAiJXMuJXMuJXMiLCQxLCQyLCQzfSdgCisKK3JlYWQgVkVSIDwgIiRzcmNkaXIiL1ZFUlNJT04gMj4vZGV2L251bGwgfHwgVkVSPVVua25vd24KKworTFZNX1ZFUlNJT049XCIkVkVSXCIKK0xWTV9SRUxFQVNFX0RBVEU9IlwiYGVjaG8gJFZFUiB8ICRTRUQgJ3MvLiogKC8vO3MvKS4qLy8nYFwiIgorVkVSPWBlY2hvICIkVkVSIiB8ICRBV0sgJ3twcmludCAkMX0nYAorTFZNX1JFTEVBU0U9IlwiYGVjaG8gIiRWRVIiIHwgJEFXSyAtRiAnLScgJ3twcmludCAkMn0nYFwiIgorVkVSPWBlY2hvICIkVkVSIiB8ICRBV0sgLUYgJy0nICd7cHJpbnQgJDF9J2AKK0xWTV9NQUpPUj1gZWNobyAiJFZFUiIgfCAkQVdLIC1GICcuJyAne3ByaW50ICQxfSdgCitMVk1fTUlOT1I9YGVjaG8gIiRWRVIiIHwgJEFXSyAtRiAnLicgJ3twcmludCAkMn0nYAorTFZNX1BBVENITEVWRUw9YGVjaG8gIiRWRVIiIHwgJEFXSyAtRiAnW1soLl1dJyAne3ByaW50ICQzfSdgCitMVk1fTElCQVBJPWBlY2hvICIkVkVSIiB8ICRBV0sgLUYgJ1tbKCldXScgJ3twcmludCAkMn0nYAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfU1VCU1QoQVBQTElCKQorQUNfU1VCU1QoQVdLKQorQUNfU1VCU1QoQkxLSURfUEMpCitBQ19TVUJTVChCVUlMRF9DTUlSUk9SRCkKK0FDX1NVQlNUKEJVSUxEX0RNRVZFTlREKQorQUNfU1VCU1QoQlVJTERfTFZNREJVU0QpCitBQ19TVUJTVChCVUlMRF9MVk1FVEFEKQorQUNfU1VCU1QoQlVJTERfTFZNUE9MTEQpCitBQ19TVUJTVChCVUlMRF9MVk1MT0NLRCkKK0FDX1NVQlNUKEJVSUxEX0xPQ0tEU0FOTE9DSykKK0FDX1NVQlNUKEJVSUxEX0xPQ0tERExNKQorQUNfU1VCU1QoQlVJTERfTk9USUZZREJVUykKK0FDX1NVQlNUKENBQ0hFKQorQUNfU1VCU1QoQ0ZMQUdTKQorQUNfU1VCU1QoQ0ZMT1dfQ01EKQorQUNfU1VCU1QoQ0hNT0QpCitBQ19TVUJTVChDTERGTEFHUykKK0FDX1NVQlNUKENMRE5PV0hPTEVBUkNISVZFKQorQUNfU1VCU1QoQ0xEV0hPTEVBUkNISVZFKQorQUNfU1VCU1QoQ0xVU1RFUikKK0FDX1NVQlNUKENMVk1EKQorQUNfU1VCU1QoQ0xWTURfQ01BTkFHRVJTKQorQUNfU1VCU1QoQ0xWTURfUEFUSCkKK0FDX1NVQlNUKENNQU5fQ0ZMQUdTKQorQUNfU1VCU1QoQ01BTl9MSUJTKQorQUNfU1VCU1QoQ01BUF9DRkxBR1MpCitBQ19TVUJTVChDTUFQX0xJQlMpCitBQ19TVUJTVChDTURMSUIpCitBQ19TVUJTVChDT05GREJfQ0ZMQUdTKQorQUNfU1VCU1QoQ09ORkRCX0xJQlMpCitBQ19TVUJTVChDT05GRElSKQorQUNfU1VCU1QoQ09QVElNSVNFX0ZMQUcpCitBQ19TVUJTVChDUEdfQ0ZMQUdTKQorQUNfU1VCU1QoQ1BHX0xJQlMpCitBQ19TVUJTVChDU0NPUEVfQ01EKQorQUNfU1VCU1QoREVCVUcpCitBQ19TVUJTVChERUZBVUxUX0FSQ0hJVkVfU1VCRElSKQorQUNfU1VCU1QoREVGQVVMVF9CQUNLVVBfU1VCRElSKQorQUNfU1VCU1QoREVGQVVMVF9DQUNIRV9TVUJESVIpCitBQ19TVUJTVChERUZBVUxUX0RBVEFfQUxJR05NRU5UKQorQUNfU1VCU1QoREVGQVVMVF9ETV9SVU5fRElSKQorQUNfU1VCU1QoREVGQVVMVF9MT0NLX0RJUikKK0FDX1NVQlNUKERFRkFVTFRfRkFMTEJBQ0tfVE9fTFZNMSkKK0FDX1NVQlNUKERFRkFVTFRfTUlSUk9SX1NFR1RZUEUpCitBQ19TVUJTVChERUZBVUxUX1BJRF9ESVIpCitBQ19TVUJTVChERUZBVUxUX1BST0ZJTEVfU1VCRElSKQorQUNfU1VCU1QoREVGQVVMVF9SQUlEMTBfU0VHVFlQRSkKK0FDX1NVQlNUKERFRkFVTFRfUlVOX0RJUikKK0FDX1NVQlNUKERFRkFVTFRfU1BBUlNFX1NFR1RZUEUpCitBQ19TVUJTVChERUZBVUxUX1NZU19ESVIpCitBQ19TVUJTVChERUZBVUxUX1VTRV9CTEtJRF9XSVBJTkcpCitBQ19TVUJTVChERUZBVUxUX1VTRV9MVk1FVEFEKQorQUNfU1VCU1QoREVGQVVMVF9VU0VfTFZNUE9MTEQpCitBQ19TVUJTVChERUZBVUxUX1VTRV9MVk1MT0NLRCkKK0FDX1NVQlNUKERFVk1BUFBFUikKK0FDX1NVQlNUKERMTV9DRkxBR1MpCitBQ19TVUJTVChETE1fTElCUykKK0FDX1NVQlNUKERMX0xJQlMpCitBQ19TVUJTVChETUVWRU5URCkKK0FDX1NVQlNUKERNRVZFTlREX1BBVEgpCitBQ19TVUJTVChETV9MSUJfUEFUQ0hMRVZFTCkKK0FDX1NVQlNUKEVMREZMQUdTKQorQUNfU1VCU1QoRlNBRE0pCitBQ19TVUJTVChCTEtERUFDVElWQVRFKQorQUNfU1VCU1QoSEFWRV9MSUJETCkKK0FDX1NVQlNUKEhBVkVfUkVBTFRJTUUpCitBQ19TVUJTVChIQVZFX1ZBTEdSSU5EKQorQUNfU1VCU1QoSU5UTCkKK0FDX1NVQlNUKEpPQlMpCitBQ19TVUJTVChMRERFUFMpCitBQ19TVUJTVChMSUJTKQorQUNfU1VCU1QoTElCX1NVRkZJWCkKK0FDX1NVQlNUKExWTTEpCitBQ19TVUJTVChMVk0xX0ZBTExCQUNLKQorQUNfU1VCU1QoTFZNX1ZFUlNJT04pCitBQ19TVUJTVChMVk1fTElCQVBJKQorQUNfU1VCU1QoTFZNX01BSk9SKQorQUNfU1VCU1QoTFZNX01JTk9SKQorQUNfU1VCU1QoTFZNX1BBVENITEVWRUwpCitBQ19TVUJTVChMVk1fUEFUSCkKK0FDX1NVQlNUKExWTV9SRUxFQVNFKQorQUNfU1VCU1QoTFZNX1JFTEVBU0VfREFURSkKK0FDX1NVQlNUKGxvY2FsZWRpcikKK0FDX1NVQlNUKE1BTkdMSU5HKQorQUNfU1VCU1QoTUlSUk9SUykKK0FDX1NVQlNUKE1TR0ZNVCkKK0FDX1NVQlNUKE9DRikKK0FDX1NVQlNUKE9DRkRJUikKK0FDX1NVQlNUKFBLR0NPTkZJRykKK0FDX1NVQlNUKFBPT0wpCitBQ19TVUJTVChNX0xJQlMpCitBQ19TVUJTVChQVEhSRUFEX0xJQlMpCitBQ19TVUJTVChQWVRIT04yKQorQUNfU1VCU1QoUFlUSE9OMykKK0FDX1NVQlNUKFBZVEhPTl9CSU5ESU5HUykKK0FDX1NVQlNUKFBZVEhPTjJfQklORElOR1MpCitBQ19TVUJTVChQWVRIT04zX0JJTkRJTkdTKQorQUNfU1VCU1QoUFlUSE9OMl9JTkNESVJTKQorQUNfU1VCU1QoUFlUSE9OM19JTkNESVJTKQorQUNfU1VCU1QoUFlUSE9OMl9MSUJESVJTKQorQUNfU1VCU1QoUFlUSE9OM19MSUJESVJTKQorQUNfU1VCU1QoUFlUSE9OMkRJUikKK0FDX1NVQlNUKFBZVEhPTjNESVIpCitBQ19TVUJTVChRVU9SVU1fQ0ZMQUdTKQorQUNfU1VCU1QoUVVPUlVNX0xJQlMpCitBQ19TVUJTVChSQUlEKQorQUNfU1VCU1QoUlRfTElCKQorQUNfU1VCU1QoUkVBRExJTkVfTElCUykKK0FDX1NVQlNUKFJFUExJQ0FUT1JTKQorQUNfU1VCU1QoU0FDS1BUX0NGTEFHUykKK0FDX1NVQlNUKFNBQ0tQVF9MSUJTKQorQUNfU1VCU1QoU0FMQ0tfQ0ZMQUdTKQorQUNfU1VCU1QoU0FMQ0tfTElCUykKK0FDX1NVQlNUKFNFTElOVVhfTElCUykKK0FDX1NVQlNUKFNFTElOVVhfUEMpCitBQ19TVUJTVChTTkFQU0hPVFMpCitBQ19TVUJTVChTVEFUSUNESVIpCitBQ19TVUJTVChTVEFUSUNfTElOSykKK0FDX1NVQlNUKFRFU1RJTkcpCitBQ19TVUJTVChURVNUU1VJVEVfREFUQSkKK0FDX1NVQlNUKFRISU4pCitBQ19TVUJTVChUSElOX0NIRUNLX0NNRCkKK0FDX1NVQlNUKFRISU5fRFVNUF9DTUQpCitBQ19TVUJTVChUSElOX1JFUEFJUl9DTUQpCitBQ19TVUJTVChUSElOX1JFU1RPUkVfQ01EKQorQUNfU1VCU1QoQ0FDSEVfQ0hFQ0tfQ01EKQorQUNfU1VCU1QoQ0FDSEVfRFVNUF9DTUQpCitBQ19TVUJTVChDQUNIRV9SRVBBSVJfQ01EKQorQUNfU1VCU1QoQ0FDSEVfUkVTVE9SRV9DTUQpCitBQ19TVUJTVChVREVWX1BDKQorQUNfU1VCU1QoVURFVl9SVUxFUykKK0FDX1NVQlNUKFVERVZfU1lOQykKK0FDX1NVQlNUKFVERVZfU1lTVEVNRF9CQUNLR1JPVU5EX0pPQlMpCitBQ19TVUJTVChVREVWX1JVTEVfRVhFQ19ERVRFQ1RJT04pCitBQ19TVUJTVChVREVWX0hBU19CVUlMVElOX0JMS0lEKQorQUNfU1VCU1QoVVNFX1RSQUNLSU5HKQorQUNfU1VCU1QoVkFMR1JJTkRfUE9PTCkKK0FDX1NVQlNUKFdSSVRFX0lOU1RBTEwpCitBQ19TVUJTVChETUVWRU5URF9QSURGSUxFKQorQUNfU1VCU1QoTFZNRVRBRF9QSURGSUxFKQorQUNfU1VCU1QoTFZNUE9MTERfUElERklMRSkKK0FDX1NVQlNUKExWTUxPQ0tEX1BJREZJTEUpCitBQ19TVUJTVChDTFZNRF9QSURGSUxFKQorQUNfU1VCU1QoQ01JUlJPUkRfUElERklMRSkKK0FDX1NVQlNUKGludGVyZmFjZSkKK0FDX1NVQlNUKGtlcm5lbGRpcikKK0FDX1NVQlNUKG1pc3NpbmdrZXJuZWwpCitBQ19TVUJTVChrZXJuZWx2c24pCitBQ19TVUJTVCh0bXBkaXIpCitBQ19TVUJTVCh1ZGV2X3ByZWZpeCkKK0FDX1NVQlNUKHVkZXZkaXIpCitBQ19TVUJTVChzeXN0ZW1kc3lzdGVtdW5pdGRpcikKK0FDX1NVQlNUKHN5c3RlbWR1dGlsZGlyKQorQUNfU1VCU1QodG1wZmlsZXNkaXIpCitBQ19TVUJTVCh1c3JsaWJkaXIpCitBQ19TVUJTVCh1c3JzYmluZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZG5sIC0tIEZpcnN0IGFuZCBsYXN0IGxpbmVzIHNob3VsZCBub3QgY29udGFpbiBmaWxlcyB0byBnZW5lcmF0ZSBpbiBvcmRlciB0bworZG5sIC0tIGtlZXAgdXRpbGl0eSBzY3JpcHRzIHJ1bm5pbmcgcHJvcGVybHkKK0FDX0NPTkZJR19GSUxFUyhbCitNYWtlZmlsZQorbWFrZS50bXBsCitkYWVtb25zL01ha2VmaWxlCitkYWVtb25zL2Nsdm1kL01ha2VmaWxlCitkYWVtb25zL2NtaXJyb3JkL01ha2VmaWxlCitkYWVtb25zL2RtZXZlbnRkL01ha2VmaWxlCitkYWVtb25zL2RtZXZlbnRkL2xpYmRldm1hcHBlci1ldmVudC5wYworZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL01ha2VmaWxlCitkYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9NYWtlZmlsZQorZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3JhaWQvTWFrZWZpbGUKK2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9taXJyb3IvTWFrZWZpbGUKK2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC9NYWtlZmlsZQorZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3RoaW4vTWFrZWZpbGUKK2RhZW1vbnMvbHZtZGJ1c2QvTWFrZWZpbGUKK2RhZW1vbnMvbHZtZGJ1c2QvcGF0aC5weQorZGFlbW9ucy9sdm1ldGFkL01ha2VmaWxlCitkYWVtb25zL2x2bXBvbGxkL01ha2VmaWxlCitkYWVtb25zL2x2bWxvY2tkL01ha2VmaWxlCitjb25mL01ha2VmaWxlCitjb25mL2V4YW1wbGUuY29uZgorY29uZi9sdm1sb2NhbC5jb25mCitjb25mL2NvbW1hbmRfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlCitjb25mL21ldGFkYXRhX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZQoraW5jbHVkZS8uc3ltbGlua3MKK2luY2x1ZGUvTWFrZWZpbGUKK2xpYi9NYWtlZmlsZQorbGliL2Zvcm1hdDEvTWFrZWZpbGUKK2xpYi9mb3JtYXRfcG9vbC9NYWtlZmlsZQorbGliL2xvY2tpbmcvTWFrZWZpbGUKK2xpYi9taXJyb3IvTWFrZWZpbGUKK2xpYi9yZXBsaWNhdG9yL01ha2VmaWxlCitpbmNsdWRlL2x2bS12ZXJzaW9uLmgKK2xpYi9yYWlkL01ha2VmaWxlCitsaWIvc25hcHNob3QvTWFrZWZpbGUKK2xpYi90aGluL01ha2VmaWxlCitsaWIvY2FjaGVfc2VndHlwZS9NYWtlZmlsZQorbGliZGFlbW9uL01ha2VmaWxlCitsaWJkYWVtb24vY2xpZW50L01ha2VmaWxlCitsaWJkYWVtb24vc2VydmVyL01ha2VmaWxlCitsaWJkbS9NYWtlZmlsZQorbGliZG0vbGliZGV2bWFwcGVyLnBjCitsaWJsdm0vTWFrZWZpbGUKK2xpYmx2bS9saWJsdm0yYXBwLnBjCittYW4vTWFrZWZpbGUKK3BvL01ha2VmaWxlCitweXRob24vTWFrZWZpbGUKK3B5dGhvbi9zZXR1cC5weQorc2NyaXB0cy9ibGtkZWFjdGl2YXRlLnNoCitzY3JpcHRzL2Jsa19hdmFpbGFiaWxpdHlfaW5pdF9yZWRfaGF0CitzY3JpcHRzL2Jsa19hdmFpbGFiaWxpdHlfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK3NjcmlwdHMvY2x2bWRfaW5pdF9yZWRfaGF0CitzY3JpcHRzL2NtaXJyb3JkX2luaXRfcmVkX2hhdAorc2NyaXB0cy9jb20ucmVkaGF0Lmx2bWRidXMxLnNlcnZpY2UKK3NjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK3NjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldAorc2NyaXB0cy9sdm0yX2NsdXN0ZXJfYWN0aXZhdGlvbl9yZWRfaGF0LnNoCitzY3JpcHRzL2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitzY3JpcHRzL2x2bTJfY2x2bWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK3NjcmlwdHMvbHZtMl9jbWlycm9yZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZQorc2NyaXB0cy9sdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitzY3JpcHRzL2x2bTJfbHZtZXRhZF9pbml0X3JlZF9oYXQKK3NjcmlwdHMvbHZtMl9sdm1ldGFkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitzY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0CitzY3JpcHRzL2x2bTJfbHZtcG9sbGRfaW5pdF9yZWRfaGF0CitzY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK3NjcmlwdHMvbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0CitzY3JpcHRzL2x2bTJfbHZtbG9ja2Rfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK3NjcmlwdHMvbHZtMl9sdm1sb2NraW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitzY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQKK3NjcmlwdHMvbHZtMl9tb25pdG9yaW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitzY3JpcHRzL2x2bTJfcHZzY2FuX3N5c3RlbWRfcmVkX2hhdEAuc2VydmljZQorc2NyaXB0cy9sdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZgorc2NyaXB0cy9NYWtlZmlsZQordGVzdC9NYWtlZmlsZQordGVzdC9hcGkvTWFrZWZpbGUKK3Rlc3QvdW5pdC9NYWtlZmlsZQordG9vbHMvTWFrZWZpbGUKK3VkZXYvTWFrZWZpbGUKK3VuaXQtdGVzdHMvZGF0YXN0cnVjdC9NYWtlZmlsZQordW5pdC10ZXN0cy9yZWdleC9NYWtlZmlsZQordW5pdC10ZXN0cy9tbS9NYWtlZmlsZQorXSkKK0FDX09VVFBVVAorCitBU19JRihbdGVzdCAtbiAiJFRISU5fQ09ORklHVVJFX1dBUk4iXSwKKyAgICAgIFtBQ19NU0dfV0FSTihbU3VwcG9ydCBmb3IgdGhpbiBwcm92aXNpb25pbmcgaXMgbGltaXRlZCBzaW5jZSBzb21lIHRoaW4gcHJvdmlzaW9uaW5nIHRvb2xzIGFyZSBtaXNzaW5nIV0pXSkKKworQVNfSUYoW3Rlc3QgLW4gIiRUSElOX0NIRUNLX1ZFUlNJT05fV0FSTiJdLAorICAgICAgW0FDX01TR19XQVJOKFtZb3Ugc2hvdWxkIGFsc28gaW5zdGFsbCB0aGluX2NoZWNrIHZzbiAwLjMuMiAob3IgbGF0ZXIpIHRvIHVzZSBsdm0yIHRoaW4gcHJvdmlzaW9uaW5nXSldKQorCitBU19JRihbdGVzdCAtbiAiJENBQ0hFX0NPTkZJR1VSRV9XQVJOIl0sCisgICAgICBbQUNfTVNHX1dBUk4oW1N1cHBvcnQgZm9yIGNhY2hlIGlzIGxpbWl0ZWQgc2luY2Ugc29tZSBjYWNoZSB0b29scyBhcmUgbWlzc2luZyFdKV0pCisKK0FTX0lGKFt0ZXN0ICIkT0RJUkVDVCIgIT0geWVzXSwKKyAgICAgIFtBQ19NU0dfV0FSTihbT19ESVJFQ1QgZGlzYWJsZWQ6IGxvdy1tZW1vcnkgcHZtb3ZlIG1heSBsb2NrIHVwXSldKQpkaWZmIC0tZ2l0IGEvY292ZXJpdHkvY292ZXJpdHlfbW9kZWwuYyBiL2NvdmVyaXR5L2NvdmVyaXR5X21vZGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvdmVyaXR5L2NvdmVyaXR5X21vZGVsLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogQ292ZXJpdHkgdXNhZ2U6CisgKgorICogdHJhbnNsYXRlIG1vZGVsIGludG8geG1sCisgKiBjb3YtbWFrZS1saWJyYXJ5IC1vZiBjb3Zlcml0eV9tb2RlbC54bWwgY292ZXJpdHlfbW9kZWwuYworICoKKyAqIGNvbXBpbGUgKHVzaW5nIG91dGRpciAnY292Jyk6CisgKiBjb3YtYnVpbGQgLS1kaXI9Y292IG1ha2UgQ0M9Z2NjCisgKgorICogYW5hbHl6ZSAoYWdyZXNzaXZlbHksIHVzaW5nICdjb3YnKQorICogY292LWFuYWx5emUgLS1kaXIgY292IC0td2FpdC1mb3ItbGljZW5zZSAtLWhmYSAtLWNvbmN1cnJlbmN5IC0tZW5hYmxlLWZucHRyIC0tZW5hYmxlLWNvbnN0cmFpbnQtZnBwIC0tc2VjdXJpdHkgLS1hbGwgLS1hZ2dyZXNzaXZlbmVzcy1sZXZlbD1oaWdoIC0tZmllbGQtb2Zmc2V0LWVzY2FwZSAtLXVzZXItbW9kZWwtZmlsZT1jb3Zlcml0eS9jb3Zlcml0eV9tb2RlbC54bWwKKyAqCisgKiBnZW5lcmF0ZSBodG1sIG91dHB1dCAodG8gJ2h0bWwnIGZyb20gJ2NvdicpOgorICogY292LWZvcm1hdC1lcnJvcnMgLS1kaXIgY292ICAtLWh0bWwtb3V0cHV0IGh0bWwKKyAqLworCitzdHJ1Y3QgbHZfc2VnbWVudDsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZTsKKworc3RydWN0IGx2X3NlZ21lbnQgKmZpcnN0X3NlZyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAoKHN0cnVjdCBsdl9zZWdtZW50ICoqKWx2KVswXTsKK30KKworc3RydWN0IGx2X3NlZ21lbnQgKmxhc3Rfc2VnKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuICgoc3RydWN0IGx2X3NlZ21lbnQgKiopbHYpWzBdOworfQorCisvKiBzaW1wbGVfbWVtY2NweSgpIGZyb20gZ2xpYmMgKi8KK3ZvaWQgKm1lbWNjcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgYywgc2l6ZV90IG4pCit7CisJY29uc3QgY2hhciAqcyA9IHNyYzsKKwljaGFyICpkID0gZGVzdDsKKworCXdoaWxlIChuLS0gPiAwKQorCQlpZiAoKCpkKysgPSAqcysrKSA9PSAoY2hhcikgYykKKwkJCXJldHVybiBkOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAyIGxpbmVzIGJlbGxvdyBuZWVkcyB0byBiZSBwbGFjZWQgaW4gY292ZXJpdHkvY29uZmlnL3VzZXJfbm9kZWZzLmgKKyAqIE5vdCBzdXJlIGFib3V0IGFueSBvdGhlciB3YXkuCisgKiBXaXRob3V0IHRoZW0sIGNvdmVyaXR5IHNob3dzIHdhcm5pbmcgc2luY2UgeDg2IHN5c3RlbSBoZWFkZXIgZmlsZXMKKyAqIGFyZSB1c2luZyBpbmxpbmUgYXNzZW1ibHkgdG8gcmVzZXQgZmRzZXQKKyAqLworLy8jbm9kZWYgRkRfWkVSTyBtb2RlbF9GRF9aRVJPCisvL3ZvaWQgbW9kZWxfRkRfWkVSTyh2b2lkICpmZHNldCk7CisKK3ZvaWQgbW9kZWxfRkRfWkVSTyh2b2lkICpmZHNldCkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwMjQgLyA4IC8gc2l6ZW9mKGxvbmcpOyArK2kpCisJCSgobG9uZyopZmRzZXQpW2ldID0gMDsKK30KKworLyoKKyAqIEFkZGVkIGV4dHJhIHBvaW50ZXIgY2hlY2sgdG8gbm90IG5lZWQgdGhlc2UgbW9kZWxzLAorICogZm9yIG5vdyBqdXN0IGtlZXAgdGhlbiBpbiBmaWxlCisgKi8KKworLyoKK3N0cnVjdCBjbWRfY29udGV4dDsKK3N0cnVjdCBwcm9maWxlOworCitjb25zdCBjaGFyICpmaW5kX2NvbmZpZ190cmVlX3N0cihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKyAgICAgICAgcmV0dXJuICJ0ZXh0IjsKK30KKworY29uc3QgY2hhciAqZmluZF9jb25maWdfdHJlZV9zdHJfYWxsb3dfZW1wdHkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBpZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpCit7CisgICAgICAgIHJldHVybiAidGV4dCI7Cit9CisqLworCisvKgorICogVW50aWwgZml4ZWQgY292ZXJpdHkgY2FzZSMgMDA1MzE4NjA6CisgKiAgIEEgRk9SV0FSRF9OVUxMIGZhbHNlIHBvc2l0aXZlIG9uIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGwKKyAqCisgKiBtb2RlbCBhbHNvIHRoZXNlIGZ1bmN0aW9uczoKKyAqLworLyoKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZTsKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZmluZF9jb25maWdfdHJlZV9hcnJheShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJcmV0dXJuIGNuOworfQorCitjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmZpbmRfY29uZmlnX3RyZWVfbm9kZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJcmV0dXJuIGNuOworfQorCitpbnQgZmluZF9jb25maWdfdHJlZV9ib29sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWludCBiOworCisJcmV0dXJuIGI7Cit9CisqLwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0MzI3OAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1OSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCisuUEhPTlk6IGRtZXZlbnRkIGNsdm1kIGNtaXJyb3JkIGx2bWV0YWQgbHZtcG9sbGQgbHZtbG9ja2QKKworaWZuZXEgKCJAQ0xWTURAIiwgIm5vbmUiKQorICBTVUJESVJTICs9IGNsdm1kCitlbmRpZgorCitpZmVxICgiQEJVSUxEX0NNSVJST1JEQCIsICJ5ZXMiKQorICBTVUJESVJTICs9IGNtaXJyb3JkCitlbmRpZgorCitpZmVxICgiQEJVSUxEX0RNRVZFTlREQCIsICJ5ZXMiKQorICBTVUJESVJTICs9IGRtZXZlbnRkCitpZm5lcSAoIiQoQ0ZMT1dfQ01EKSIsICIiKQorZGFlbW9ucy5jZmxvdzogZG1ldmVudGQuY2Zsb3cKK2VuZGlmCitlbmRpZgorCitpZmVxICgiQEJVSUxEX0xWTUVUQURAIiwgInllcyIpCisgIFNVQkRJUlMgKz0gbHZtZXRhZAorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1QT0xMREAiLCAieWVzIikKKyAgU1VCRElSUyArPSBsdm1wb2xsZAorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1MT0NLREAiLCAieWVzIikKKyAgU1VCRElSUyArPSBsdm1sb2NrZCAKK2VuZGlmCisKK2lmZXEgKCJAQlVJTERfTFZNREJVU0RAIiwgInllcyIpCisgIFNVQkRJUlMgKz0gbHZtZGJ1c2QgCitlbmRpZgorCitpZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdGNsZWFuKQorICBTVUJESVJTID0gY2x2bWQgY21pcnJvcmQgZG1ldmVudGQgbHZtZXRhZCBsdm1wb2xsZCBsdm1sb2NrZCBsdm1kYnVzZAorZW5kaWYKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2lmZXEgKCJAQlVJTERfRE1FVkVOVERAIiwgInllcyIpCitkZXZpY2UtbWFwcGVyOiBkbWV2ZW50ZC5kZXZpY2UtbWFwcGVyCitlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC8uZ2l0aWdub3JlIGIvZGFlbW9ucy9jbHZtZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjAzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorY2x2bWQKZGlmZiAtLWdpdCBhL2RhZW1vbnMvY2x2bWQvTWFrZWZpbGUuaW4gYi9kYWVtb25zL2Nsdm1kL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1N2FmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTAzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitDTUFOX0xJQlMgPSBAQ01BTl9MSUJTQAorQ01BTl9DRkxBR1MgPSBAQ01BTl9DRkxBR1NACitDTUFQX0xJQlMgPSBAQ01BUF9MSUJTQAorQ01BUF9DRkxBR1MgPSBAQ01BUF9DRkxBR1NACitDT05GREJfTElCUyA9IEBDT05GREJfTElCU0AKK0NPTkZEQl9DRkxBR1MgPSBAQ09ORkRCX0NGTEFHU0AKK0NQR19MSUJTID0gQENQR19MSUJTQAorQ1BHX0NGTEFHUyA9IEBDUEdfQ0ZMQUdTQAorRExNX0xJQlMgPSBARExNX0xJQlNACitETE1fQ0ZMQUdTID0gQERMTV9DRkxBR1NACitRVU9SVU1fTElCUyA9IEBRVU9SVU1fTElCU0AKK1FVT1JVTV9DRkxBR1MgPSBAUVVPUlVNX0NGTEFHU0AKK1NBTENLX0xJQlMgPSBAU0FMQ0tfTElCU0AKK1NBTENLX0NGTEFHUyA9IEBTQUxDS19DRkxBR1NACisKK1NPVVJDRVMgPSBcCisJY2x2bWQtY29tbWFuZC5jICBcCisJY2x2bWQuYyAgICAgICAgICBcCisJbHZtLWZ1bmN0aW9ucy5jICBcCisJcmVmcmVzaF9jbHZtZC5jCisKK2lmbmVxICgsJChmaW5kc3RyaW5nIGNtYW4sLCAiQENMVk1EQCwiKSkKKwlTT1VSQ0VTICs9IGNsdm1kLWNtYW4uYworCUxNTElCUyArPSAkKENNQU5fTElCUykgJChDT05GREJfTElCUykgJChETE1fTElCUykKKwlDRkxBR1MgKz0gJChDTUFOX0NGTEFHUykgJChDT05GREJfQ0ZMQUdTKSAkKERMTV9DRkxBR1MpCisJREVGUyArPSAtRFVTRV9DTUFOCitlbmRpZgorCitpZm5lcSAoLCQoZmluZHN0cmluZyBvcGVuYWlzLCwgIkBDTFZNREAsIikpCisJU09VUkNFUyArPSBjbHZtZC1vcGVuYWlzLmMKKwlMTUxJQlMgKz0gJChDT05GREJfTElCUykgJChDUEdfTElCUykgJChTQUxDS19MSUJTKQorCUNGTEFHUyArPSAkKENPTkZEQl9DRkxBR1MpICQoQ1BHX0NGTEFHUykgJChTQUxDS19DRkxBR1MpCisJREVGUyArPSAtRFVTRV9PUEVOQUlTCitlbmRpZgorCitpZm5lcSAoLCQoZmluZHN0cmluZyBjb3Jvc3luYywsICJAQ0xWTURALCIpKQorCVNPVVJDRVMgKz0gY2x2bWQtY29yb3N5bmMuYworCUxNTElCUyArPSAkKENNQVBfTElCUykgJChDT05GREJfTElCUykgJChDUEdfTElCUykgJChETE1fTElCUykgJChRVU9SVU1fTElCUykKKwlDRkxBR1MgKz0gJChDTUFQX0NGTEFHUykgJChDT05GREJfQ0ZMQUdTKSAkKENQR19DRkxBR1MpICQoRExNX0NGTEFHUykgJChRVU9SVU1fQ0ZMQUdTKQorCURFRlMgKz0gLURVU0VfQ09ST1NZTkMKK2VuZGlmCisKK2lmbmVxICgsJChmaW5kc3RyaW5nIHNpbmdsZW5vZGUsLCAmcXVvdDtAQ0xWTURALCZxdW90OykpCisJU09VUkNFUyArPSBjbHZtZC1zaW5nbGVub2RlLmMKKwlERUZTICs9IC1EVVNFX1NJTkdMRU5PREUKK2VuZGlmCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0Y2xlYW4pCisJU09VUkNFUyArPSBjbHZtZC1jbWFuLmMKKwlTT1VSQ0VTICs9IGNsdm1kLW9wZW5haXMuYworCVNPVVJDRVMgKz0gY2x2bWQtY29yb3N5bmMuYworCVNPVVJDRVMgKz0gY2x2bWQtc2luZ2xlbm9kZS5jCitlbmRpZgorCitUQVJHRVRTID0gXAorCWNsdm1kCisKK0xWTUxJQlMgPSAkKExWTUlOVEVSTkFMX0xJQlMpCisKK2lmZXEgKCJARE1FVkVOVERAIiwgInllcyIpCisJTFZNTElCUyArPSAtbGRldm1hcHBlci1ldmVudAorZW5kaWYKKyAKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitMVk1MSUJTICs9IC1sZGV2bWFwcGVyCitMSUJTICs9ICQoUFRIUkVBRF9MSUJTKQorCitDRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgJChFWFRSQV9FWEVDX0NGTEFHUykKK0xERkxBR1MgKz0gJChFWFRSQV9FWEVDX0xERkxBR1MpCisKK0lOU1RBTExfVEFSR0VUUyA9IFwKKwlpbnN0YWxsX2Nsdm1kCisKK2Nsdm1kOiAkKE9CSkVDVFMpICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyBjbHZtZCAkKE9CSkVDVFMpIFwKKwkJJChMVk1MSUJTKSAkKExNTElCUykgJChMSUJTKQorCisuUEhPTlk6IGluc3RhbGxfY2x2bWQKKworaW5zdGFsbF9jbHZtZDogJChUQVJHRVRTKQorCSQoSU5TVEFMTF9QUk9HUkFNKSAtRCBjbHZtZCAkKHVzcnNiaW5kaXIpL2Nsdm1kCisKK2luc3RhbGw6ICQoSU5TVEFMTF9UQVJHRVRTKQorCitpbnN0YWxsX2NsdXN0ZXI6ICQoSU5TVEFMTF9UQVJHRVRTKQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC9jbHZtLmggYi9kYWVtb25zL2Nsdm1kL2Nsdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBhMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbHZtZC9jbHZtLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIENMVk1EIHNlcnZlciBhbmQgY2xpZW50cyAqLworCisvKgorICogVGhlIHByb3RvY29sIHNwb2tlbiBvdmVyIHRoZSBjbHVzdGVyIGFuZCBhY3Jvc3MgdGhlIGxvY2FsIHNvY2tldC4KKyAqLworCisjaWZuZGVmIF9DTFZNX0gKKyNkZWZpbmUgX0NMVk1fSAorCisjaW5jbHVkZSAiY29uZmlndXJlLmgiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworc3RydWN0IGNsdm1faGVhZGVyIHsKKwl1aW50OF90ICBjbWQ7CSAgICAgICAgLyogU2VlIGJlbG93ICovCisJdWludDhfdCAgZmxhZ3M7CSAgICAgICAgLyogU2VlIGJlbG93ICovCisJdWludDE2X3QgeGlkOwkgICAgICAgIC8qIFRyYW5zYWN0aW9uIElEICovCisJdWludDMyX3QgY2xpZW50aWQ7CS8qIE9ubHkgdXNlZCBpbiBEYWVtb24tPkRhZW1vbiBjb21tcyAqLworCWludDMyX3QgIHN0YXR1czsJLyogRm9yIHJlcGxpZXMsIHdoZXRoZXIgcmVxdWVzdCBzdWNjZWVkZWQgKi8KKwl1aW50MzJfdCBhcmdsZW47CS8qIExlbmd0aCBvZiBhcmd1bWVudCBiZWxvdy4KKwkJCQkgICBJZiA+MTUwMCB0aGVuIGl0IHdpbGwgYmUgcGFzc2VkCisJCQkJICAgYXJvdW5kIHRoZSBjbHVzdGVyIGluIHRoZSBzeXN0ZW0gTFYgKi8KKwljaGFyIG5vZGVbMV07CQkvKiBBY3R1YWxseSBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgbm9kZSBuYW1lLgorCQkJCSAgIElmIHRoaXMgaXMgZW1wdHkgdGhlbiB0aGUgY29tbWFuZCBpcworCQkJCSAgIGZvcndhcmRlZCB0byBhbGwgY2x1c3RlciBub2RlcyB1bmxlc3MKKwkJCQkgICBGTEFHX0xPQ0FMIG9yIEZMQUdfUkVNT1RFIGlzIGFsc28gc2V0LiAqLworCWNoYXIgYXJnc1sxXTsJCS8qIEFyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQgZm9sbG93IHRoZQorCQkJCSAgIG5vZGUgbmFtZSwgVGhpcyBtZW1iZXIgaXMgb25seQorCQkJCSAgIHZhbGlkIGlmIHRoZSBub2RlIG5hbWUgaXMgZW1wdHkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGbGFncyAqLworI2RlZmluZSBDTFZNRF9GTEFHX0xPQ0FMCTEJLyogT25seSBkbyB0aGlzIG9uIHRoZSBsb2NhbCBub2RlICovCisjZGVmaW5lIENMVk1EX0ZMQUdfU1lTVEVNTFYJMgkvKiBEYXRhIGluIHN5c3RlbSBMViB1bmRlciBteSBub2RlIG5hbWUgKi8KKyNkZWZpbmUgQ0xWTURfRkxBR19OT0RFRVJSUwk0CS8qIFJlcGx5IGhhcyBlcnJvcnMgaW4gbm9kZS1zcGVjaWZpYyBwb3J0aW9uICovCisjZGVmaW5lIENMVk1EX0ZMQUdfUkVNT1RFCTgJLyogRG8gdGhpcyBvbiBhbGwgbm9kZXMgZXhjZXB0IGZvciB0aGUgbG9jYWwgbm9kZSAqLworCisvKiBOYW1lIG9mIHRoZSBsb2NhbCBzb2NrZXQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBsdm0gYW5kIGNsdm1kICovCisjZGVmaW5lIENMVk1EX1NPQ0tOQU1FCQlERUZBVUxUX1JVTl9ESVIgIi9jbHZtZC5zb2NrIgorCisvKiBJbnRlcm5hbCBjb21tYW5kcyAmIHJlcGxpZXMgKi8KKyNkZWZpbmUgQ0xWTURfQ01EX1JFUExZICAgIDEKKyNkZWZpbmUgQ0xWTURfQ01EX1ZFUlNJT04gIDIJLyogU2VuZCB2ZXJzaW9uIGFyb3VuZCBjbHVzdGVyIHdoZW4gd2Ugc3RhcnQgKi8KKyNkZWZpbmUgQ0xWTURfQ01EX0dPQVdBWSAgIDMJLyogRGllIGlmIHJlY2VpdmVkIHRoaXMgLSB3ZSBhcmUgcnVubmluZworCQkJCSAgIGFuIGluY29tcGF0aWJsZSB2ZXJzaW9uICovCisjZGVmaW5lIENMVk1EX0NNRF9URVNUICAgICA0CS8qIEp1c3QgZm9yIG11Y2tpbmcgYWJvdXQgKi8KKworI2RlZmluZSBDTFZNRF9DTURfTE9DSyAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgQ0xWTURfQ01EX1VOTE9DSyAgICAgICAgICAgIDMxCisKKy8qIExvY2svVW5sb2NrIGNvbW1hbmRzICovCisjZGVmaW5lIENMVk1EX0NNRF9MT0NLX0xWICAgICAgICAgICA1MAorI2RlZmluZSBDTFZNRF9DTURfTE9DS19WRyAgICAgICAgICAgNTEKKyNkZWZpbmUgQ0xWTURfQ01EX0xPQ0tfUVVFUlkJICAgIDUyCisKKy8qIE1pc2MgZnVuY3Rpb25zICovCisjZGVmaW5lIENMVk1EX0NNRF9SRUZSRVNICSAgICA0MAorI2RlZmluZSBDTFZNRF9DTURfR0VUX0NMVVNURVJOQU1FICAgNDEKKyNkZWZpbmUgQ0xWTURfQ01EX1NFVF9ERUJVRwkgICAgNDIKKyNkZWZpbmUgQ0xWTURfQ01EX1ZHX0JBQ0tVUAkgICAgNDMKKyNkZWZpbmUgQ0xWTURfQ01EX1JFU1RBUlQJICAgIDQ0CisjZGVmaW5lIENMVk1EX0NNRF9TWU5DX05BTUVTCSAgICA0NQorCisvKiBVc2VkIGludGVybmFsbHkgYnkgc29tZSBjYWxsZXJzLCBidXQgbm90IHBhcnQgb2YgdGhlIHByb3RvY29sLiovCisjaWZuZGVmIE5PREVfQUxMCisjICBkZWZpbmUgTk9ERV9BTEwJIioiCisjICBkZWZpbmUgTk9ERV9MT0NBTAkiLiIKKyMgIGRlZmluZSBOT0RFX1JFTU9URQkiXiIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RhZW1vbnMvY2x2bWQvY2x2bWQtY21hbi5jIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1jbWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlOTIyOQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY2x2bWQvY2x2bWQtY21hbi5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIENNQU4gY29tbXVuaWNhdGlvbiBsYXllciBmb3IgY2x2bWQuCisgKi8KKworI2luY2x1ZGUgImNsdm1kLWNvbW1vbi5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiY2x2bWQtY29tbXMuaCIKKyNpbmNsdWRlICJjbHZtLmgiCisjaW5jbHVkZSAiY2x2bWQuaCIKKyNpbmNsdWRlICJsdm0tZnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlIDxsaWJkbG0uaD4KKworI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjZGVmaW5lIExPQ0tTUEFDRV9OQU1FICJjbHZtZCIKKworc3RydWN0IGNsdm1kX25vZGUKK3sKKwlzdHJ1Y3QgY21hbl9ub2RlICpub2RlOworCWludCBjbHZtZF91cDsKK307CisKK3N0YXRpYyBpbnQgbnVtX25vZGVzOworc3RhdGljIHN0cnVjdCBjbWFuX25vZGUgKm5vZGVzID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY21hbl9ub2RlIHRoaXNfbm9kZTsKK3N0YXRpYyBpbnQgY291bnRfbm9kZXM7IC8qIHNpemUgb2YgYWxsb2NhdGVkIG5vZGVzIGFycmF5ICovCitzdGF0aWMgc3RydWN0IGRtX2hhc2hfdGFibGUgKm5vZGVfdXBkb3duX2hhc2g7CitzdGF0aWMgZGxtX2xzaGFuZGxlX3QgKmxvY2tzcGFjZTsKK3N0YXRpYyBjbWFuX2hhbmRsZV90IGNfaGFuZGxlOworCitzdGF0aWMgdm9pZCBjb3VudF9jbHZtZHNfcnVubmluZyh2b2lkKTsKK3N0YXRpYyB2b2lkIGdldF9tZW1iZXJzKHZvaWQpOworc3RhdGljIGludCBub2RlaWRfZnJvbV9jc2lkKGNvbnN0IGNoYXIgKmNzaWQpOworc3RhdGljIGludCBuYW1lX2Zyb21fbm9kZWlkKGludCBub2RlaWQsIGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgZXZlbnRfY2FsbGJhY2soY21hbl9oYW5kbGVfdCBoYW5kbGUsIHZvaWQgKnByaXZhdGUsIGludCByZWFzb24sIGludCBhcmcpOworc3RhdGljIHZvaWQgZGF0YV9jYWxsYmFjayhjbWFuX2hhbmRsZV90IGhhbmRsZSwgdm9pZCAqcHJpdmF0ZSwKKwkJCSAgY2hhciAqYnVmLCBpbnQgbGVuLCB1aW50OF90IHBvcnQsIGludCBub2RlaWQpOworCitzdHJ1Y3QgbG9ja193YWl0IHsKKwlwdGhyZWFkX2NvbmRfdCBjb25kOworCXB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKKwlzdHJ1Y3QgZGxtX2xrc2IgbGtzYjsKK307CisKK3N0YXRpYyBpbnQgX2luaXRfY2x1c3Rlcih2b2lkKQoreworCW5vZGVfdXBkb3duX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMDApOworCisJLyogT3BlbiB0aGUgY2x1c3RlciBjb21tdW5pY2F0aW9uIHNvY2tldCAqLworCWNfaGFuZGxlID0gY21hbl9pbml0KE5VTEwpOworCWlmICghY19oYW5kbGUpIHsKKwkJc3lzbG9nKExPR19FUlIsICJDYW4ndCBvcGVuIGNsdXN0ZXIgbWFuYWdlciBzb2NrZXQ6ICVtIik7CisJCXJldHVybiAtMTsKKwl9CisJREVCVUdMT0coIkNvbm5lY3RlZCB0byBDTUFOXG4iKTsKKworCWlmIChjbWFuX3N0YXJ0X3JlY3ZfZGF0YShjX2hhbmRsZSwgZGF0YV9jYWxsYmFjaywgQ0xVU1RFUl9QT1JUX0NMVk1EKSkgeworCQlzeXNsb2coTE9HX0VSUiwgIkNhbid0IGJpbmQgY2x1c3RlciBzb2NrZXQ6ICVtIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY21hbl9zdGFydF9ub3RpZmljYXRpb24oY19oYW5kbGUsIGV2ZW50X2NhbGxiYWNrKSkgeworCQlzeXNsb2coTE9HX0VSUiwgIkNhbid0IHN0YXJ0IGNsdXN0ZXIgZXZlbnQgbGlzdGVuaW5nIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBHZXQgdGhlIGNsdXN0ZXIgbWVtYmVycyBsaXN0ICovCisJZ2V0X21lbWJlcnMoKTsKKwljb3VudF9jbHZtZHNfcnVubmluZygpOworCisJREVCVUdMT0coIkNNQU4gaW5pdGlhbGlzYXRpb24gY29tcGxldGVcbiIpOworCisJLyogQ3JlYXRlIGEgbG9ja3NwYWNlIGZvciBMViAmIFZHIGxvY2tzIHRvIGxpdmUgaW4gKi8KKwlsb2Nrc3BhY2UgPSBkbG1fb3Blbl9sb2Nrc3BhY2UoTE9DS1NQQUNFX05BTUUpOworCWlmICghbG9ja3NwYWNlKSB7CisJCWxvY2tzcGFjZSA9IGRsbV9jcmVhdGVfbG9ja3NwYWNlKExPQ0tTUEFDRV9OQU1FLCAwNjAwKTsKKwkJaWYgKCFsb2Nrc3BhY2UpIHsKKwkJCXN5c2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIGNyZWF0ZSBETE0gbG9ja3NwYWNlIGZvciBDTFZNOiAlbSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCURFQlVHTE9HKCJDcmVhdGVkIERMTSBsb2Nrc3BhY2UgZm9yIENMVk1ELlxuIik7CisJfSBlbHNlCisJCURFQlVHTE9HKCJPcGVuZWQgZXhpc3RpbmcgRExNIGxvY2tzcGFjZSBmb3IgQ0xWTUQuXG4iKTsKKworCWRsbV9sc19wdGhyZWFkX2luaXQobG9ja3NwYWNlKTsKKwlERUJVR0xPRygiRExNIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2NsdXN0ZXJfaW5pdF9jb21wbGV0ZWQodm9pZCkKK3sKKwljbHZtZF9jbHVzdGVyX2luaXRfY29tcGxldGVkKCk7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9tYWluX2NsdXN0ZXJfZmQodm9pZCkKK3sKKwlyZXR1cm4gY21hbl9nZXRfZmQoY19oYW5kbGUpOworfQorCitzdGF0aWMgaW50IF9nZXRfbnVtX25vZGVzKHZvaWQpCit7CisJaW50IGk7CisJaW50IG5ub2RlcyA9IDA7CisKKwkvKiByZXR1cm4gbnVtYmVyIG9mIEFDVElWRSBub2RlcyAqLworCWZvciAoaT0wOyBpPG51bV9ub2RlczsgaSsrKSB7CisJCWlmIChub2Rlc1tpXS5jbl9tZW1iZXIgJiYgbm9kZXNbaV0uY25fbm9kZWlkKQorCQkJbm5vZGVzKys7CisJfQorCXJldHVybiBubm9kZXM7Cit9CisKKy8qIHNlbmRfbWVzc2FnZSB3aXRoIHRoZSBmZCBjaGVjayByZW1vdmVkICovCitzdGF0aWMgaW50IF9jbHVzdGVyX3NlbmRfbWVzc2FnZShjb25zdCB2b2lkICpidWYsIGludCBtc2dsZW4sIGNvbnN0IGNoYXIgKmNzaWQsCisJCQkJIGNvbnN0IGNoYXIgKmVycnRleHQpCit7CisJaW50IG5vZGVpZCA9IDA7CisKKwlpZiAoY3NpZCkKKwkJbWVtY3B5KCZub2RlaWQsIGNzaWQsIENNQU5fTUFYX0NTSURfTEVOKTsKKworCWlmIChjbWFuX3NlbmRfZGF0YShjX2hhbmRsZSwgYnVmLCBtc2dsZW4sIDAsIENMVVNURVJfUE9SVF9DTFZNRCwgbm9kZWlkKSA8PSAwKQorCXsKKwkJbG9nX2Vycm9yKCIlcyIsIGVycnRleHQpOworCX0KKwlyZXR1cm4gbXNnbGVuOworfQorCitzdGF0aWMgdm9pZCBfZ2V0X291cl9jc2lkKGNoYXIgKmNzaWQpCit7CisJaWYgKHRoaXNfbm9kZS5jbl9ub2RlaWQgPT0gMCkgeworCQljbWFuX2dldF9ub2RlKGNfaGFuZGxlLCAwLCAmdGhpc19ub2RlKTsKKwl9CisJbWVtY3B5KGNzaWQsICZ0aGlzX25vZGUuY25fbm9kZWlkLCBDTUFOX01BWF9DU0lEX0xFTik7Cit9CisKKy8qIENhbGwgYSBjYWxsYmFjayByb3V0aW5lIGZvciBlYWNoIG5vZGUgaXMgdGhhdCBrbm93biAoZG93biBtZWFucyBub3QgcnVubmluZyBhIGNsdm1kKSAqLworc3RhdGljIGludCBfY2x1c3Rlcl9kb19ub2RlX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBsb2NhbF9jbGllbnQgKiwKKwkJCQkJCSAgICAgICBjb25zdCBjaGFyICosCisJCQkJCQkgICAgICAgaW50KSkKK3sKKwlpbnQgaTsKKwlpbnQgc29tZWRvd24gPSAwOworCisJZm9yIChpID0gMDsgaSA8IF9nZXRfbnVtX25vZGVzKCk7IGkrKykgeworCQlpZiAobm9kZXNbaV0uY25fbWVtYmVyICYmIG5vZGVzW2ldLmNuX25vZGVpZCkgeworCQkJaW50IHVwID0gKGludCkobG9uZylkbV9oYXNoX2xvb2t1cF9iaW5hcnkobm9kZV91cGRvd25faGFzaCwgKGNoYXIgKikmbm9kZXNbaV0uY25fbm9kZWlkLCBzaXplb2YoaW50KSk7CisKKwkJCWNhbGxiYWNrKGNsaWVudCwgKGNoYXIgKikmbm9kZXNbaV0uY25fbm9kZWlkLCB1cCk7CisJCQlpZiAoIXVwKQorCQkJCXNvbWVkb3duID0gLTE7CisJCX0KKwl9CisJcmV0dXJuIHNvbWVkb3duOworfQorCisvKiBQcm9jZXNzIE9PQiBtZXNzYWdlcyBmcm9tIHRoZSBjbHVzdGVyIHNvY2tldCAqLworc3RhdGljIHZvaWQgZXZlbnRfY2FsbGJhY2soY21hbl9oYW5kbGVfdCBoYW5kbGUsIHZvaWQgKnByaXZhdGUsIGludCByZWFzb24sIGludCBhcmcpCit7CisJY2hhciBuYW1lYnVmW01BWF9DTFVTVEVSX01FTUJFUl9OQU1FX0xFTl07CisKKwlzd2l0Y2ggKHJlYXNvbikgeworICAgICAgICBjYXNlIENNQU5fUkVBU09OX1BPUlRDTE9TRUQ6CisJCW5hbWVfZnJvbV9ub2RlaWQoYXJnLCBuYW1lYnVmKTsKKwkJbG9nX25vdGljZSgiY2x2bWQgb24gbm9kZSAlcyBoYXMgZGllZFxuIiwgbmFtZWJ1Zik7CisJCURFQlVHTE9HKCJHb3QgcG9ydCBjbG9zZWQgbWVzc2FnZSwgcmVtb3Zpbmcgbm9kZSAlc1xuIiwgbmFtZWJ1Zik7CisKKwkJZG1faGFzaF9pbnNlcnRfYmluYXJ5KG5vZGVfdXBkb3duX2hhc2gsIChjaGFyICopJmFyZywgc2l6ZW9mKGludCksICh2b2lkICopMCk7CisJCWJyZWFrOworCisJY2FzZSBDTUFOX1JFQVNPTl9TVEFURUNIQU5HRToKKwkJREVCVUdMT0coIkdvdCBzdGF0ZSBjaGFuZ2UgbWVzc2FnZSwgcmUtcmVhZGluZyBtZW1iZXJzIGxpc3RcbiIpOworCQlnZXRfbWVtYmVycygpOworCQlicmVhazsKKworI2lmIGRlZmluZWQoTElCQ01BTl9WRVJTSU9OKSAmJiBMSUJDTUFOX1ZFUlNJT04gPj0gMgorCWNhc2UgQ01BTl9SRUFTT05fUE9SVE9QRU5FRDoKKwkJLyogSWdub3JlIHRoaXMsIHdhaXQgZm9yIHN0YXJ0dXAgbWVzc2FnZSBmcm9tIGNsdm1kIGl0c2VsZiAqLworCQlicmVhazsKKworCWNhc2UgQ01BTl9SRUFTT05fVFJZX1NIVVRET1dOOgorCQlERUJVR0xPRygiR290IHRyeSBzaHV0ZG93biwgc2VuZGluZyBPS1xuIik7CisJCWNtYW5fcmVwbHl0b19zaHV0ZG93bihjX2hhbmRsZSwgMSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogRVJST1IgKi8KKwkJREVCVUdMT0coIkdvdCB1bmtub3duIGV2ZW50IGNhbGxiYWNrIG1lc3NhZ2U6ICVkXG4iLCByZWFzb24pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbWFuX2NsaWVudDsKK3N0YXRpYyBpbnQgX2NsdXN0ZXJfZmRfY2FsbGJhY2soc3RydWN0IGxvY2FsX2NsaWVudCAqZmQsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJCQljb25zdCBjaGFyICpjc2lkLAorCQkJCXN0cnVjdCBsb2NhbF9jbGllbnQgKipuZXdfY2xpZW50KQoreworCisJLyogU2F2ZSB0aGlzIGZvciBkYXRhX2NhbGxiYWNrICovCisJY21hbl9jbGllbnQgPSBmZDsKKworCS8qIFdlIG5ldmVyIHJldHVybiBhIG5ldyBjbGllbnQgKi8KKwkqbmV3X2NsaWVudCA9IE5VTEw7CisKKwlyZXR1cm4gY21hbl9kaXNwYXRjaChjX2hhbmRsZSwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgZGF0YV9jYWxsYmFjayhjbWFuX2hhbmRsZV90IGhhbmRsZSwgdm9pZCAqcHJpdmF0ZSwKKwkJCSAgY2hhciAqYnVmLCBpbnQgbGVuLCB1aW50OF90IHBvcnQsIGludCBub2RlaWQpCit7CisJLyogSWdub3JlIGxvb3BlZCBiYWNrIG1lc3NhZ2VzICovCisJaWYgKG5vZGVpZCA9PSB0aGlzX25vZGUuY25fbm9kZWlkKQorCQlyZXR1cm47CisJcHJvY2Vzc19tZXNzYWdlKGNtYW5fY2xpZW50LCBidWYsIGxlbiwgKGNoYXIgKikmbm9kZWlkKTsKK30KKworc3RhdGljIHZvaWQgX2FkZF91cF9ub2RlKGNvbnN0IGNoYXIgKmNzaWQpCit7CisJLyogSXQncyB1cCAhICovCisJaW50IG5vZGVpZCA9IG5vZGVpZF9mcm9tX2NzaWQoY3NpZCk7CisKKwlkbV9oYXNoX2luc2VydF9iaW5hcnkobm9kZV91cGRvd25faGFzaCwgKGNoYXIgKikmbm9kZWlkLCBzaXplb2YoaW50KSwgKHZvaWQgKikxKTsKKwlERUJVR0xPRygiQWRkZWQgbmV3IG5vZGUgJWQgdG8gdXBkb3duIGxpc3RcbiIsIG5vZGVpZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9jbHVzdGVyX2Nsb3NlZG93bih2b2lkKQoreworCWRsbV9yZWxlYXNlX2xvY2tzcGFjZShMT0NLU1BBQ0VfTkFNRSwgbG9ja3NwYWNlLCAxKTsKKwljbWFuX2ZpbmlzaChjX2hhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfbGlzdGVuaW5nKGludCBub2RlaWQpCit7CisJaW50IHN0YXR1czsKKworCWRvIHsKKwkJc3RhdHVzID0gY21hbl9pc19saXN0ZW5pbmcoY19oYW5kbGUsIG5vZGVpZCwgQ0xVU1RFUl9QT1JUX0NMVk1EKTsKKwkJaWYgKHN0YXR1cyA8IDAgJiYgZXJybm8gPT0gRUJVU1kpIHsJLyogRG9uJ3QgYnVzeXdhaXQgKi8KKwkJCXNsZWVwKDEpOworCQkJZXJybm8gPSBFQlVTWTsJLyogSW4gY2FzZSBzbGVlcCB0cmFzaGVzIGl0ICovCisJCX0KKwl9CisJd2hpbGUgKHN0YXR1cyA8IDAgJiYgZXJybm8gPT0gRUJVU1kpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUG9wdWxhdGUgdGhlIGxpc3Qgb2YgQ0xWTURzIHJ1bm5pbmcuCisgICBjYWxsZWQgb25seSBhdCBzdGFydHVwIHRpbWUgKi8KK3N0YXRpYyB2b2lkIGNvdW50X2Nsdm1kc19ydW5uaW5nKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX25vZGVzOyBpKyspIHsKKwkJaW50IG5vZGVpZCA9IG5vZGVzW2ldLmNuX25vZGVpZDsKKworCQlpZiAoaXNfbGlzdGVuaW5nKG5vZGVpZCkgPT0gMSkKKwkJCWRtX2hhc2hfaW5zZXJ0X2JpbmFyeShub2RlX3VwZG93bl9oYXNoLCAodm9pZCAqKSZub2RlaWQsIHNpemVvZihpbnQpLCAodm9pZCopMSk7CisJCWVsc2UKKwkJCWRtX2hhc2hfaW5zZXJ0X2JpbmFyeShub2RlX3VwZG93bl9oYXNoLCAodm9pZCAqKSZub2RlaWQsIHNpemVvZihpbnQpLCAodm9pZCopMCk7CisJfQorfQorCisvKiBHZXQgYSBsaXN0IG9mIGFjdGl2ZSBjbHVzdGVyIG1lbWJlcnMgKi8KK3N0YXRpYyB2b2lkIGdldF9tZW1iZXJzKHZvaWQpCit7CisJaW50IHJldG5vZGVzOworCWludCBzdGF0dXM7CisJaW50IGk7CisJaW50IGhpZ2hfbm9kZWlkID0gMDsKKworCW51bV9ub2RlcyA9IGNtYW5fZ2V0X25vZGVfY291bnQoY19oYW5kbGUpOworCWlmIChudW1fbm9kZXMgPT0gLTEpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZ2V0IG5vZGUgY291bnQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vdCBlbm91Z2ggcm9vbSBmb3IgbmV3IG5vZGVzIGxpc3QgPyAqLworCWlmIChudW1fbm9kZXMgPiBjb3VudF9ub2RlcyAmJiBub2RlcykgeworCQlmcmVlKG5vZGVzKTsKKwkJbm9kZXMgPSBOVUxMOworCX0KKworCWlmIChub2RlcyA9PSBOVUxMKSB7CisJCWNvdW50X25vZGVzID0gbnVtX25vZGVzICsgMTA7IC8qIE92ZXJhbGxvY2F0ZSBhIGxpdHRsZSAqLworCQlub2RlcyA9IG1hbGxvYyhjb3VudF9ub2RlcyAqIHNpemVvZihzdHJ1Y3QgY21hbl9ub2RlKSk7CisJCWlmICghbm9kZXMpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG5vZGVzIGFycmF5XG4iKTsKKwkJCWV4aXQoNSk7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBjbWFuX2dldF9ub2RlcyhjX2hhbmRsZSwgY291bnRfbm9kZXMsICZyZXRub2Rlcywgbm9kZXMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGdldCBub2RlIGRldGFpbHMiKTsKKwkJZXhpdCg2KTsKKwl9CisKKwkvKiBHZXQgdGhlIGhpZ2hlc3Qgbm9kZWlkICovCisJZm9yIChpPTA7IGk8cmV0bm9kZXM7IGkrKykgeworCQlpZiAobm9kZXNbaV0uY25fbm9kZWlkID4gaGlnaF9ub2RlaWQpCisJCQloaWdoX25vZGVpZCA9IG5vZGVzW2ldLmNuX25vZGVpZDsKKwl9Cit9CisKKworLyogQ29udmVydCBhIG5vZGUgbmFtZSB0byBhIENTSUQgKi8KK3N0YXRpYyBpbnQgX2NzaWRfZnJvbV9uYW1lKGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX25vZGVzOyBpKyspIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBub2Rlc1tpXS5jbl9uYW1lKSA9PSAwKSB7CisJCQltZW1jcHkoY3NpZCwgJm5vZGVzW2ldLmNuX25vZGVpZCwgQ01BTl9NQVhfQ1NJRF9MRU4pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCisvKiBDb252ZXJ0IGEgQ1NJRCB0byBhIG5vZGUgbmFtZSAqLworc3RhdGljIGludCBfbmFtZV9mcm9tX2NzaWQoY29uc3QgY2hhciAqY3NpZCwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbm9kZXM7IGkrKykgeworCQlpZiAobWVtY21wKGNzaWQsICZub2Rlc1tpXS5jbl9ub2RlaWQsIENNQU5fTUFYX0NTSURfTEVOKSA9PSAwKSB7CisJCQlzdHJjcHkobmFtZSwgbm9kZXNbaV0uY25fbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBXaG8/PyAqLworCXN0cmNweShuYW1lLCAiVW5rbm93biIpOworCXJldHVybiAtMTsKK30KKworLyogQ29udmVydCBhIG5vZGUgSUQgdG8gYSBub2RlIG5hbWUgKi8KK3N0YXRpYyBpbnQgbmFtZV9mcm9tX25vZGVpZChpbnQgbm9kZWlkLCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9ub2RlczsgaSsrKSB7CisJCWlmIChub2RlaWQgPT0gbm9kZXNbaV0uY25fbm9kZWlkKSB7CisJCQlzdHJjcHkobmFtZSwgbm9kZXNbaV0uY25fbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBXaG8/PyAqLworCXN0cmNweShuYW1lLCAiVW5rbm93biIpOworCXJldHVybiAtMTsKK30KKworLyogQ29udmVydCBhIENTSUQgdG8gYSBub2RlIElEICovCitzdGF0aWMgaW50IG5vZGVpZF9mcm9tX2NzaWQoY29uc3QgY2hhciAqY3NpZCkKK3sKKyAgICAgICAgaW50IG5vZGVpZDsKKworCW1lbWNweSgmbm9kZWlkLCBjc2lkLCBDTUFOX01BWF9DU0lEX0xFTik7CisKKwlyZXR1cm4gbm9kZWlkOworfQorCitzdGF0aWMgaW50IF9pc19xdW9yYXRlKHZvaWQpCit7CisJcmV0dXJuIGNtYW5faXNfcXVvcmF0ZShjX2hhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfYXN0X3JvdXRpbmUodm9pZCAqYXJnKQoreworCXN0cnVjdCBsb2NrX3dhaXQgKmx3YWl0ID0gYXJnOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsd2FpdC0+bXV0ZXgpOworCXB0aHJlYWRfY29uZF9zaWduYWwoJmx3YWl0LT5jb25kKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHdhaXQtPm11dGV4KTsKK30KKworc3RhdGljIGludCBfc3luY19sb2NrKGNvbnN0IGNoYXIgKnJlc291cmNlLCBpbnQgbW9kZSwgaW50IGZsYWdzLCBpbnQgKmxvY2tpZCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBsb2NrX3dhaXQgbHdhaXQ7CisKKwlpZiAoIWxvY2tpZCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCURFQlVHTE9HKCJzeW5jX2xvY2s6ICclcycgbW9kZTolZCBmbGFncz0lZFxuIiwgcmVzb3VyY2UsbW9kZSxmbGFncyk7CisJLyogQ29udmVyc2lvbnMgbmVlZCB0aGUgbG9ja2lkIGluIHRoZSBMS1NCICovCisJaWYgKGZsYWdzICYgTEtGX0NPTlZFUlQpCisJCWx3YWl0Lmxrc2Iuc2JfbGtpZCA9ICpsb2NraWQ7CisKKwlwdGhyZWFkX2NvbmRfaW5pdCgmbHdhaXQuY29uZCwgTlVMTCk7CisJcHRocmVhZF9tdXRleF9pbml0KCZsd2FpdC5tdXRleCwgTlVMTCk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZsd2FpdC5tdXRleCk7CisKKwlzdGF0dXMgPSBkbG1fbHNfbG9jayhsb2Nrc3BhY2UsCisJCQkgICAgIG1vZGUsCisJCQkgICAgICZsd2FpdC5sa3NiLAorCQkJICAgICBmbGFncywKKwkJCSAgICAgcmVzb3VyY2UsCisJCQkgICAgIHN0cmxlbihyZXNvdXJjZSksCisJCQkgICAgIDAsIHN5bmNfYXN0X3JvdXRpbmUsICZsd2FpdCwgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIFdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJcHRocmVhZF9jb25kX3dhaXQoJmx3YWl0LmNvbmQsICZsd2FpdC5tdXRleCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmx3YWl0Lm11dGV4KTsKKworCSpsb2NraWQgPSBsd2FpdC5sa3NiLnNiX2xraWQ7CisKKwllcnJubyA9IGx3YWl0Lmxrc2Iuc2Jfc3RhdHVzOworCURFQlVHTE9HKCJzeW5jX2xvY2s6IHJldHVybmluZyBsa2lkICV4XG4iLCAqbG9ja2lkKTsKKwlpZiAobHdhaXQubGtzYi5zYl9zdGF0dXMpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zeW5jX3VubG9jayhjb25zdCBjaGFyICpyZXNvdXJjZSAvKiBVTlVTRUQgKi8sIGludCBsb2NraWQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbG9ja193YWl0IGx3YWl0OworCisJREVCVUdMT0coInN5bmNfdW5sb2NrOiAnJXMnIGxraWQ6JXhcbiIsIHJlc291cmNlLCBsb2NraWQpOworCisJcHRocmVhZF9jb25kX2luaXQoJmx3YWl0LmNvbmQsIE5VTEwpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbHdhaXQubXV0ZXgsIE5VTEwpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHdhaXQubXV0ZXgpOworCisJc3RhdHVzID0gZGxtX2xzX3VubG9jayhsb2Nrc3BhY2UsIGxvY2tpZCwgMCwgJmx3YWl0Lmxrc2IsICZsd2FpdCk7CisKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogV2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlwdGhyZWFkX2NvbmRfd2FpdCgmbHdhaXQuY29uZCwgJmx3YWl0Lm11dGV4KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHdhaXQubXV0ZXgpOworCisJZXJybm8gPSBsd2FpdC5sa3NiLnNiX3N0YXR1czsKKwlpZiAobHdhaXQubGtzYi5zYl9zdGF0dXMgIT0gRVVOTE9DSykKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBfZ2V0X2NsdXN0ZXJfbmFtZShjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJY21hbl9jbHVzdGVyX3QgY2x1c3Rlcl9pbmZvOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBjbWFuX2dldF9jbHVzdGVyKGNfaGFuZGxlLCAmY2x1c3Rlcl9pbmZvKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdHJuY3B5KGJ1ZiwgY2x1c3Rlcl9pbmZvLmNpX25hbWUsIGJ1Zmxlbik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2x1c3Rlcl9vcHMgX2NsdXN0ZXJfY21hbl9vcHMgPSB7CisJLm5hbWUgICAgICAgICAgICAgICAgICAgICA9ICJjbWFuIiwKKwkuY2x1c3Rlcl9pbml0X2NvbXBsZXRlZCAgID0gX2NsdXN0ZXJfaW5pdF9jb21wbGV0ZWQsCisJLmNsdXN0ZXJfc2VuZF9tZXNzYWdlICAgICA9IF9jbHVzdGVyX3NlbmRfbWVzc2FnZSwKKwkubmFtZV9mcm9tX2NzaWQgICAgICAgICAgID0gX25hbWVfZnJvbV9jc2lkLAorCS5jc2lkX2Zyb21fbmFtZSAgICAgICAgICAgPSBfY3NpZF9mcm9tX25hbWUsCisJLmdldF9udW1fbm9kZXMgICAgICAgICAgICA9IF9nZXRfbnVtX25vZGVzLAorCS5jbHVzdGVyX2ZkX2NhbGxiYWNrICAgICAgPSBfY2x1c3Rlcl9mZF9jYWxsYmFjaywKKwkuZ2V0X21haW5fY2x1c3Rlcl9mZCAgICAgID0gX2dldF9tYWluX2NsdXN0ZXJfZmQsCisJLmNsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayA9IF9jbHVzdGVyX2RvX25vZGVfY2FsbGJhY2ssCisJLmlzX3F1b3JhdGUgICAgICAgICAgICAgICA9IF9pc19xdW9yYXRlLAorCS5nZXRfb3VyX2NzaWQgICAgICAgICAgICAgPSBfZ2V0X291cl9jc2lkLAorCS5hZGRfdXBfbm9kZSAgICAgICAgICAgICAgPSBfYWRkX3VwX25vZGUsCisJLmNsdXN0ZXJfY2xvc2Vkb3duICAgICAgICA9IF9jbHVzdGVyX2Nsb3NlZG93biwKKwkuZ2V0X2NsdXN0ZXJfbmFtZSAgICAgICAgID0gX2dldF9jbHVzdGVyX25hbWUsCisJLnN5bmNfbG9jayAgICAgICAgICAgICAgICA9IF9zeW5jX2xvY2ssCisJLnN5bmNfdW5sb2NrICAgICAgICAgICAgICA9IF9zeW5jX3VubG9jaywKK307CisKK3N0cnVjdCBjbHVzdGVyX29wcyAqaW5pdF9jbWFuX2NsdXN0ZXIodm9pZCkKK3sKKwlpZiAoIV9pbml0X2NsdXN0ZXIoKSkKKwkJcmV0dXJuICZfY2x1c3Rlcl9jbWFuX29wczsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC9jbHZtZC1jb21tYW5kLmMgYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLWNvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkzZjZmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1jb21tYW5kLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisKKyAgQ0xWTUQgQ2x1c3RlciBMVk0gZGFlbW9uIGNvbW1hbmQgcHJvY2Vzc29yLgorCisgIFRvIGFkZCBjb21tYW5kcyB0byB0aGUgZGFlbW9uIHNpbXBseSBhZGQgYSBwcm9jZXNzb3IgaW4gZG9fY29tbWFuZCBhbmQgcmV0dXJuCisgIGFuZCBtZXNzYWdlcyBiYWNrIGluIGJ1ZiBhbmQgdGhlIGxlbmd0aCBpbiAqcmV0bGVuLiBUaGUgaW5pdGlhbCB2YWx1ZSBvZgorICBidWZsZW4gaXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyLiBpZiBidWYgaXMgbm90IGxhcmdlIGVub3VnaCB0aGVuIGl0CisgIG1heSBiZSByZWFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb25zIGluIGhlcmUgdG8gYSBzdWl0YWJsZSBzaXplIGJlYXJpbmcgaW4KKyAgbWluZCB0aGF0IGFueXRoaW5nIGxhcmdlciB0aGFuIHRoZSBwYXNzZWQtaW4gc2l6ZSB3aWxsIGhhdmUgdG8gYmUgcmV0dXJuZWQKKyAgdXNpbmcgdGhlIHN5c3RlbSBMViBhbmQgc28gcGVyZm9ybWFuY2Ugd2lsbCBzdWZmZXIuCisKKyAgVGhlIHN0YXR1cyByZXR1cm4gd2lsbCBiZSBuZWdhdGVkIGFuZCBwYXNzZWQgYmFjayB0byB0aGUgb3JpZ2luYXRpbmcgbm9kZS4KKworICBwcmUtIGFuZCBwb3N0LSBjb21tYW5kIHJvdXRpbmVzIGFyZSBjYWxsZWQgb25seSBvbiB0aGUgbG9jYWwgbm9kZS4gVGhlCisgIHB1cnBvc2UgaXMgcHJpbWFyaWx5IHRvIGdldCBhbmQgcmVsZWFzZSBsb2NrcywgdGhvdWdoIHRoZSBwcmUtIHJvdXRpbmUgc2hvdWxkCisgIGFsc28gZG8gYW55IG90aGVyIGxvY2FsIHNldHVwcyByZXF1aXJlZCBieSB0aGUgY29tbWFuZCAoaWYgYW55KSBhbmQgY2FuCisgIHJldHVybiBhIGZhaWx1cmUgY29kZSB0aGF0IHByZXZlbnRzIHRoZSBjb21tYW5kIGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgYXJvdW5kCisgIHRoZSBjbHVzdGVyCisKKyAgVGhlIHByZS0gYW5kIHBvc3QtIHJvdXRpbmVzIGFyZSBydW4gaW4gdGhlaXIgb3duIHRocmVhZCBzbyBjYW4gYmxvY2sgYXMgbG9uZworICB0aGV5IGxpa2UsIGRvX2NvbW1hbmQgaXMgcnVuIGluIHRoZSBtYWluIGNsdm1kIHRocmVhZCBzbyBzaG91bGQgbm90IGJsb2NrIGZvcgorICB0b28gbG9uZy4gSWYgdGhlIHByZS1jb21tYW5kIHJldHVybnMgYW4gZXJyb3IgY29kZSAoIT0wKSB0aGVuIHRoZSBjb21tYW5kCisgIHdpbGwgbm90IGJlIHByb3BvZ2F0ZWQgYXJvdW5kIHRoZSBjbHVzdGVyIGJ1dCB0aGUgcG9zdC1jb21tYW5kIFdJTEwgYmUgY2FsbGVkCisKKyAgQWxzbyBub3RlIHRoYXQgdGhlIHByZSBhbmQgcG9zdCByb3V0aW5lIGFyZSAqYWx3YXlzKiBjYWxsZWQgb24gdGhlIGxvY2FsCisgIG5vZGUsIGV2ZW4gaWYgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgd2FzIG9ubHkgcmVxdWVzdGVkIHRvIHJ1biBvbiBhCisgIHJlbW90ZSBub2RlLiBJdCBtYXkgcGVlayBpbnNpZGUgdGhlIGNsaWVudCBzdHJ1Y3R1cmUgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZgorICB0aGUgY29tbWFuZC4KKworICBUaGUgY2xpZW50cyBvZiB0aGUgZGFlbW9uIG11c3QsIG5hdHVyYWxseSwgdW5kZXJzdGFuZCB0aGUgcmV0dXJuIG1lc3NhZ2VzIGFuZAorICBjb2Rlcy4KKworICBSb3V0aW5lcyBpbiBoZXJlIG1heSBvbmx5IFJFQUQgdGhlIHZhbHVlcyBpbiB0aGUgY2xpZW50IHN0cnVjdHVyZSBwYXNzZWQgaW4KKyAgYXBhcnQgZnJvbSBjbGllbnQtPnByaXZhdGUgd2hpY2ggdGhleSBhcmUgZnJlZSB0byBkbyB3aGF0IHRoZXkgbGlrZSB3aXRoLgorCisqLworCisjaW5jbHVkZSAiY2x2bWQtY29tbW9uLmgiCisjaW5jbHVkZSAiY2x2bWQtY29tbXMuaCIKKyNpbmNsdWRlICJjbHZtLmgiCisjaW5jbHVkZSAiY2x2bWQuaCIKKyNpbmNsdWRlICJsdm0tZ2xvYmFscy5oIgorI2luY2x1ZGUgImx2bS1mdW5jdGlvbnMuaCIKKworI2luY2x1ZGUgImxvY2tpbmcuaCIKKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK2V4dGVybiBzdHJ1Y3QgY2x1c3Rlcl9vcHMgKmNsb3BzOworc3RhdGljIGludCByZXN0YXJ0X2Nsdm1kKHZvaWQpOworCisvKiBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgcmVhbCB3b3JrIGhhcHBlbnM6CisgICBOT1RFOiBjbGllbnQgd2lsbCBiZSBOVUxMIHdoZW4gdGhpcyBpcyBleGVjdXRlZCBvbiBhIHJlbW90ZSBub2RlICovCitpbnQgZG9fY29tbWFuZChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLCBpbnQgbXNnbGVuLAorCSAgICAgICBjaGFyICoqYnVmLCBpbnQgYnVmbGVuLCBpbnQgKnJldGxlbikKK3sKKwljaGFyICphcmdzID0gbXNnLT5ub2RlICsgc3RybGVuKG1zZy0+bm9kZSkgKyAxOworCWludCBhcmdsZW4gPSBtc2dsZW4gLSBzaXplb2Yoc3RydWN0IGNsdm1faGVhZGVyKSAtIHN0cmxlbihtc2ctPm5vZGUpOworCWludCBzdGF0dXMgPSAwOworCWNoYXIgKmxvY2tuYW1lOworCWNvbnN0IGNoYXIgKmxvY2t0eXBlOworCXN0cnVjdCB1dHNuYW1lIG5vZGVpbmZvOworCXVuc2lnbmVkIGNoYXIgbG9ja19jbWQ7CisJdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzOworCisJLyogRG8gdGhlIGNvbW1hbmQgKi8KKwlzd2l0Y2ggKG1zZy0+Y21kKSB7CisJCS8qIEp1c3QgYSB0ZXN0IG1lc3NhZ2UgKi8KKwljYXNlIENMVk1EX0NNRF9URVNUOgorCQlpZiAoYXJnbGVuID4gYnVmbGVuKSB7CisJCQljaGFyICpuZXdfYnVmOworCQkJYnVmbGVuID0gYXJnbGVuICsgMjAwOworCQkJbmV3X2J1ZiA9IHJlYWxsb2MoKmJ1ZiwgYnVmbGVuKTsKKwkJCWlmIChuZXdfYnVmID09IE5VTEwpIHsKKwkJCQlzdGF0dXMgPSBlcnJubzsKKwkJCQlmcmVlICgqYnVmKTsKKwkJCX0KKwkJCSpidWYgPSBuZXdfYnVmOworCQl9CisJCWlmICgqYnVmKSB7CisJCQlpZiAodW5hbWUoJm5vZGVpbmZvKSkKKwkJCQltZW1zZXQoJm5vZGVpbmZvLCAwLCBzaXplb2Yobm9kZWluZm8pKTsKKworCQkJKnJldGxlbiA9IDEgKyBkbV9zbnByaW50ZigqYnVmLCBidWZsZW4sCisJCQkJCQkgICJURVNUIGZyb20gJXM6ICVzIHYlcyIsCisJCQkJCQkgIG5vZGVpbmZvLm5vZGVuYW1lLCBhcmdzLAorCQkJCQkJICBub2RlaW5mby5yZWxlYXNlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ0xWTURfQ01EX0xPQ0tfVkc6CisJCWxvY2tfY21kID0gYXJnc1swXTsKKwkJbG9ja19mbGFncyA9IGFyZ3NbMV07CisJCWxvY2tuYW1lID0gJmFyZ3NbMl07CisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgVkcgaXMgaW4gdXNlIGJ5IExWTTEgKi8KKwkJc3RhdHVzID0gZG9fY2hlY2tfbHZtMShsb2NrbmFtZSk7CisJCWRvX2xvY2tfdmcobG9ja19jbWQsIGxvY2tfZmxhZ3MsIGxvY2tuYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIENMVk1EX0NNRF9MT0NLX0xWOgorCQkvKiBUaGlzIGlzIHRoZSBiaWdnaWUgKi8KKwkJbG9ja19jbWQgPSBhcmdzWzBdOworCQlsb2NrX2ZsYWdzID0gYXJnc1sxXTsKKwkJbG9ja25hbWUgPSAmYXJnc1syXTsKKwkJc3RhdHVzID0gZG9fbG9ja19sdihsb2NrX2NtZCwgbG9ja19mbGFncywgbG9ja25hbWUpOworCQkvKiBSZXBsYWNlIEVJTyB3aXRoIHNvbWV0aGluZyBsZXNzIHNjYXJ5ICovCisJCWlmIChzdGF0dXMgPT0gRUlPKSB7CisJCQkqcmV0bGVuID0gMSArIGRtX3NucHJpbnRmKCpidWYsIGJ1ZmxlbiwgIiVzIiwKKwkJCQkJCSAgZ2V0X2xhc3RfbHZtX2Vycm9yKCkpOworCQkJcmV0dXJuIEVJTzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ0xWTURfQ01EX0xPQ0tfUVVFUlk6CisJCWxvY2tuYW1lID0gJmFyZ3NbMl07CisJCWlmIChidWZsZW4gPCAzKQorCQkJcmV0dXJuIEVJTzsKKwkJaWYgKChsb2NrdHlwZSA9IGRvX2xvY2tfcXVlcnkobG9ja25hbWUpKSkKKwkJCSpyZXRsZW4gPSAxICsgZG1fc25wcmludGYoKmJ1ZiwgYnVmbGVuLCAiJXMiLCBsb2NrdHlwZSk7CisJCWJyZWFrOworCisJY2FzZSBDTFZNRF9DTURfUkVGUkVTSDoKKwkJZG9fcmVmcmVzaF9jYWNoZSgpOworCQlicmVhazsKKworCWNhc2UgQ0xWTURfQ01EX1NZTkNfTkFNRVM6CisJCWx2bV9kb19mc191bmxvY2soKTsKKwkJYnJlYWs7CisKKwljYXNlIENMVk1EX0NNRF9TRVRfREVCVUc6CisJCWNsdm1kX3NldF9kZWJ1ZygoZGVidWdfdCkgYXJnc1swXSk7CisJCWJyZWFrOworCisJY2FzZSBDTFZNRF9DTURfUkVTVEFSVDoKKwkJc3RhdHVzID0gcmVzdGFydF9jbHZtZCgpOworCQlicmVhazsKKworCWNhc2UgQ0xWTURfQ01EX0dFVF9DTFVTVEVSTkFNRToKKwkJc3RhdHVzID0gY2xvcHMtPmdldF9jbHVzdGVyX25hbWUoKmJ1ZiwgYnVmbGVuKTsKKwkJaWYgKCFzdGF0dXMpCisJCQkqcmV0bGVuID0gc3RybGVuKCpidWYpKzE7CisJCWJyZWFrOworCisJY2FzZSBDTFZNRF9DTURfVkdfQkFDS1VQOgorCQkvKgorCQkgKiBEbyBub3QgcnVuIGJhY2t1cCBvbiBsb2NhbCBub2RlLCBjYWxsZXIgc2hvdWxkIGRvIHRoYXQuCisJCSAqLworCQlpZiAoIWNsaWVudCkKKwkJCWx2bV9kb19iYWNrdXAoJmFyZ3NbMl0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFdvbid0IGdldCBoZXJlIGJlY2F1c2UgY29tbWFuZCBpcyB2YWxpZGF0ZWQgaW4gcHJlX2NvbW1hbmQgKi8KKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBlcnJvciB0ZXh0ICovCisJaWYgKHN0YXR1cykgeworCQkqcmV0bGVuID0gMSArICgoKmJ1ZikgPyBkbV9zbnByaW50ZigqYnVmLCBidWZsZW4sICIlcyIsCisJCQkJCQkgICAgc3RyZXJyb3Ioc3RhdHVzKSkgOiAtMSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBsb2NrX3ZnKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbG9ja19oYXNoOworCXN0cnVjdCBjbHZtX2hlYWRlciAqaGVhZGVyID0KKwkJKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLmNtZDsKKwl1bnNpZ25lZCBjaGFyIGxvY2tfY21kOworCWludCBsb2NrX21vZGU7CisJY2hhciAqYXJncyA9IGhlYWRlci0+bm9kZSArIHN0cmxlbihoZWFkZXItPm5vZGUpICsgMTsKKwlpbnQgbGtpZDsKKwlpbnQgc3RhdHVzOworCWNoYXIgKmxvY2tuYW1lOworCisJLyoKKwkgKiBLZWVwIGEgdHJhY2sgb2YgVkcgbG9ja3MgaW4gb3VyIG93biBoYXNoIHRhYmxlLiBJbiBjdXJyZW50CisJICogcHJhY3RpY2UgdGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBtb3JlIHRoYW4gdHdvIFZHcyBsb2NrZWQKKwkgKiBpZiBhIHVzZXIgdHJpZXMgdG8gbWVyZ2UgbG90cyBvZiB0aGVtIGF0IG9uY2UKKwkgKi8KKwlpZiAoIWNsaWVudC0+Yml0cy5sb2NhbHNvY2sucHJpdmF0ZSkgeworCQlpZiAoIShsb2NrX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgzKSkpCisJCQlyZXR1cm4gRU5PTUVNOworCQljbGllbnQtPmJpdHMubG9jYWxzb2NrLnByaXZhdGUgPSAodm9pZCAqKSBsb2NrX2hhc2g7CisJfSBlbHNlCisJCWxvY2tfaGFzaCA9IChzdHJ1Y3QgZG1faGFzaF90YWJsZSAqKSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLnByaXZhdGU7CisKKwlsb2NrX2NtZCA9IGFyZ3NbMF0gJiAoTENLX05PTkJMT0NLIHwgTENLX0hPTEQgfCBMQ0tfU0NPUEVfTUFTSyB8IExDS19UWVBFX01BU0spOworCWxvY2tfbW9kZSA9ICgoaW50KSBsb2NrX2NtZCAmIExDS19UWVBFX01BU0spOworCS8qIGxvY2tfZmxhZ3MgPSBhcmdzWzFdOyAqLworCWxvY2tuYW1lID0gJmFyZ3NbMl07CisJREVCVUdMT0coImRvaW5nIFBSRSBjb21tYW5kIExPQ0tfVkcgJyVzJyBhdCAleCAoY2xpZW50PSVwKVxuIiwgbG9ja25hbWUsIGxvY2tfY21kLCBjbGllbnQpOworCisJaWYgKGxvY2tfbW9kZSA9PSBMQ0tfVU5MT0NLKSB7CisJCWlmICghKGxraWQgPSAoaW50KSAobG9uZykgZG1faGFzaF9sb29rdXAobG9ja19oYXNoLCBsb2NrbmFtZSkpKQorCQkJcmV0dXJuIEVJTlZBTDsKKworCQlpZiAoKHN0YXR1cyA9IHN5bmNfdW5sb2NrKGxvY2tuYW1lLCBsa2lkKSkpCisJCQlzdGF0dXMgPSBlcnJubzsKKwkJZWxzZQorCQkJZG1faGFzaF9yZW1vdmUobG9ja19oYXNoLCBsb2NrbmFtZSk7CisJfSBlbHNlIHsKKwkJLyogUmVhZCBsb2NrcyBuZWVkIHRvIGJlIFBSOyBvdGhlciBtb2RlcyBnZXQgcGFzc2VkIHRocm91Z2ggKi8KKwkJaWYgKGxvY2tfbW9kZSA9PSBMQ0tfUkVBRCkKKwkJCWxvY2tfbW9kZSA9IExDS19QUkVBRDsKKworCQlpZiAoKHN0YXR1cyA9IHN5bmNfbG9jayhsb2NrbmFtZSwgbG9ja19tb2RlLCAobG9ja19jbWQgJiBMQ0tfTk9OQkxPQ0spID8gTENLRl9OT1FVRVVFIDogMCwgJmxraWQpKSkKKwkJCXN0YXR1cyA9IGVycm5vOworCQllbHNlIGlmICghZG1faGFzaF9pbnNlcnQobG9ja19oYXNoLCBsb2NrbmFtZSwgKHZvaWQgKikgKGxvbmcpIGxraWQpKQorCQkJcmV0dXJuIEVOT01FTTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIFByZS1jb21tYW5kIGlzIGEgZ29vZCBwbGFjZSB0byBnZXQgbG9ja3MgdGhhdCBhcmUgbmVlZGVkIG9ubHkgZm9yIHRoZSBkdXJhdGlvbgorICAgb2YgdGhlIGNvbW1hbmRzIGFyb3VuZCB0aGUgY2x1c3RlciAoZG9uJ3QgZm9yZ2V0IHRvIGZyZWUgdGhlbSBpbiBwb3N0LWNvbW1hbmQpLAorICAgYW5kIHRvIHNhbml0eSBjaGVjayB0aGUgY29tbWFuZCBhcmd1bWVudHMgKi8KK2ludCBkb19wcmVfY29tbWFuZChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNsdm1faGVhZGVyICpoZWFkZXIgPQorCSAgICAoc3RydWN0IGNsdm1faGVhZGVyICopIGNsaWVudC0+Yml0cy5sb2NhbHNvY2suY21kOworCXVuc2lnbmVkIGNoYXIgbG9ja19jbWQ7CisJdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzOworCWNoYXIgKmFyZ3MgPSBoZWFkZXItPm5vZGUgKyBzdHJsZW4oaGVhZGVyLT5ub2RlKSArIDE7CisJaW50IGxvY2tpZCA9IDA7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciAqbG9ja25hbWU7CisKKwlzd2l0Y2ggKGhlYWRlci0+Y21kKSB7CisJY2FzZSBDTFZNRF9DTURfVEVTVDoKKwkJc3RhdHVzID0gc3luY19sb2NrKCJDTFZNRF9URVNUIiwgTENLX0VYQ0wsIDAsICZsb2NraWQpOworCQljbGllbnQtPmJpdHMubG9jYWxzb2NrLnByaXZhdGUgPSAodm9pZCAqKShsb25nKWxvY2tpZDsKKwkJYnJlYWs7CisKKwljYXNlIENMVk1EX0NNRF9MT0NLX1ZHOgorCQlsb2NrbmFtZSA9ICZhcmdzWzJdOworCQkvKiBXZSB0YWtlIG91dCBhIHJlYWwgbG9jayB1bmxlc3MgTENLX0NBQ0hFIHdhcyBzZXQgKi8KKwkJaWYgKCFzdHJuY21wKGxvY2tuYW1lLCAiVl8iLCAyKSB8fAorCQkgICAgIXN0cm5jbXAobG9ja25hbWUsICJQXyMiLCAzKSkKKwkJCXN0YXR1cyA9IGxvY2tfdmcoY2xpZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIENMVk1EX0NNRF9MT0NLX0xWOgorCQlsb2NrX2NtZCA9IGFyZ3NbMF07CisJCWxvY2tfZmxhZ3MgPSBhcmdzWzFdOworCQlsb2NrbmFtZSA9ICZhcmdzWzJdOworCQlzdGF0dXMgPSBwcmVfbG9ja19sdihsb2NrX2NtZCwgbG9ja19mbGFncywgbG9ja25hbWUpOworCQlicmVhazsKKworCWNhc2UgQ0xWTURfQ01EX1JFRlJFU0g6CisJY2FzZSBDTFZNRF9DTURfR0VUX0NMVVNURVJOQU1FOgorCWNhc2UgQ0xWTURfQ01EX1NFVF9ERUJVRzoKKwljYXNlIENMVk1EX0NNRF9WR19CQUNLVVA6CisJY2FzZSBDTFZNRF9DTURfU1lOQ19OQU1FUzoKKwljYXNlIENMVk1EX0NNRF9MT0NLX1FVRVJZOgorCWNhc2UgQ0xWTURfQ01EX1JFU1RBUlQ6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKCJVbmtub3duIGNvbW1hbmQgJWQgcmVjZWl2ZWRcbiIsIGhlYWRlci0+Y21kKTsKKwkJc3RhdHVzID0gRUlOVkFMOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBOb3RlIHRoYXQgdGhlIHBvc3QtY29tbWFuZCByb3V0aW5lIGlzIGNhbGxlZCBldmVuIGlmIHRoZSBwcmUtY29tbWFuZCBvciB0aGUgcmVhbCBjb21tYW5kCisgICBmYWlsZWQgKi8KK2ludCBkb19wb3N0X2NvbW1hbmQoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjbHZtX2hlYWRlciAqaGVhZGVyID0KKwkgICAgKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLmNtZDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxvY2tfY21kOworCXVuc2lnbmVkIGNoYXIgbG9ja19mbGFnczsKKwljaGFyICphcmdzID0gaGVhZGVyLT5ub2RlICsgc3RybGVuKGhlYWRlci0+bm9kZSkgKyAxOworCWNoYXIgKmxvY2tuYW1lOworCisJc3dpdGNoIChoZWFkZXItPmNtZCkgeworCWNhc2UgQ0xWTURfQ01EX1RFU1Q6CisJCXN0YXR1cyA9IHN5bmNfdW5sb2NrKCJDTFZNRF9URVNUIiwgKGludCkgKGxvbmcpIGNsaWVudC0+Yml0cy5sb2NhbHNvY2sucHJpdmF0ZSk7CisJCWNsaWVudC0+Yml0cy5sb2NhbHNvY2sucHJpdmF0ZSA9IE5VTEw7CisJCWJyZWFrOworCisJY2FzZSBDTFZNRF9DTURfTE9DS19MVjoKKwkJbG9ja19jbWQgPSBhcmdzWzBdOworCQlsb2NrX2ZsYWdzID0gYXJnc1sxXTsKKwkJbG9ja25hbWUgPSAmYXJnc1syXTsKKwkJc3RhdHVzID0gcG9zdF9sb2NrX2x2KGxvY2tfY21kLCBsb2NrX2ZsYWdzLCBsb2NrbmFtZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogTm90aGluZyB0byBkbyBoZXJlICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIENhbGxlZCB3aGVuIHRoZSBjbGllbnQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCAqLwordm9pZCBjbWRfY2xpZW50X2NsZWFudXAoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKnY7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmxvY2tfaGFzaDsKKwlpbnQgbGtpZDsKKwljaGFyICpsb2NrbmFtZTsKKworCURFQlVHTE9HKCJDbGllbnQgdGhyZWFkIGNsZWFudXAgKCVwKVxuIiwgY2xpZW50KTsKKwlpZiAoIWNsaWVudC0+Yml0cy5sb2NhbHNvY2sucHJpdmF0ZSkKKwkJcmV0dXJuOworCisJbG9ja19oYXNoID0gKHN0cnVjdCBkbV9oYXNoX3RhYmxlICopY2xpZW50LT5iaXRzLmxvY2Fsc29jay5wcml2YXRlOworCisJZG1faGFzaF9pdGVyYXRlKHYsIGxvY2tfaGFzaCkgeworCQlsa2lkID0gKGludCkobG9uZylkbV9oYXNoX2dldF9kYXRhKGxvY2tfaGFzaCwgdik7CisJCWxvY2tuYW1lID0gZG1faGFzaF9nZXRfa2V5KGxvY2tfaGFzaCwgdik7CisJCURFQlVHTE9HKCJDbGVhbnVwICglcCk6IFVubG9ja2luZyBsb2NrICVzICV4XG4iLCBjbGllbnQsIGxvY2tuYW1lLCBsa2lkKTsKKwkJKHZvaWQpIHN5bmNfdW5sb2NrKGxvY2tuYW1lLCBsa2lkKTsKKwl9CisKKwlkbV9oYXNoX2Rlc3Ryb3kobG9ja19oYXNoKTsKKwljbGllbnQtPmJpdHMubG9jYWxzb2NrLnByaXZhdGUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHJlc3RhcnRfY2x2bWQodm9pZCkKK3sKKwljb25zdCBjaGFyICoqYXJndjsKKwljaGFyICpsdl9uYW1lOworCWludCBhcmdjID0gMCwgbWF4X2xvY2tzID0gMDsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpobiA9IE5VTEw7CisJY2hhciBkZWJ1Z19hcmdbMTZdOworCWNvbnN0IGNoYXIgKmNsdm1kID0gZ2V0ZW52KCJMVk1fQ0xWTURfQklOQVJZIikgPyA6IENMVk1EX1BBVEg7CisKKwlERUJVR0xPRygiY2x2bWQgcmVzdGFydCByZXF1ZXN0ZWRcbiIpOworCisJLyogQ291bnQgZXhjbHVzaXZlbHktb3BlbiBMVnMgKi8KKwlkbyB7CisJCWhuID0gZ2V0X25leHRfZXhjbF9sb2NrKGhuLCAmbHZfbmFtZSk7CisJCWlmIChsdl9uYW1lKSB7CisJCQltYXhfbG9ja3MrKzsKKwkJCWlmICghKmx2X25hbWUpCisJCQkJYnJlYWs7IC8qIEZJWE1FOiBJcyB0aGlzIGVycm9yID8gKi8KKwkJfQorCX0gd2hpbGUgKGhuKTsKKworCS8qIGNsdm1kICsgbG9ja3MgKC1FIHV1aWQpICsgZGVidWcgKC1kIFgpICsgTlVMTCAqLworCWlmICghKGFyZ3YgPSBtYWxsb2MoKG1heF9sb2NrcyAqIDIgKyA2KSAqIHNpemVvZigqYXJndikpKSkKKwkJZ290b19vdXQ7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBjb21tYW5kLWxpbmUKKwkgKi8KKwlhcmd2W2FyZ2MrK10gPSAiY2x2bWQiOworCisJLyogUHJvcGFnYXRlIGRlYnVnIG9wdGlvbnMgKi8KKwlpZiAoY2x2bWRfZ2V0X2RlYnVnKCkpIHsKKwkJaWYgKGRtX3NucHJpbnRmKGRlYnVnX2FyZywgc2l6ZW9mKGRlYnVnX2FyZyksICItZCV1IiwgY2x2bWRfZ2V0X2RlYnVnKCkpIDwgMCkKKwkJCWdvdG9fb3V0OworCQlhcmd2W2FyZ2MrK10gPSBkZWJ1Z19hcmc7CisJfQorCisJLyogUHJvcGFnYXRlIGZvcmVncm91bmQgb3B0aW9ucyAqLworCWlmIChjbHZtZF9nZXRfZm9yZWdyb3VuZCgpKQorCQlhcmd2W2FyZ2MrK10gPSAiLWYiOworCisJYXJndlthcmdjKytdID0gIi1JIjsKKwlhcmd2W2FyZ2MrK10gPSBjbG9wcy0+bmFtZTsKKworCS8qIE5vdyBhZGQgdGhlIGV4Y2x1c2l2ZWx5LW9wZW4gTFZzICovCisJaG4gPSBOVUxMOworCWRvIHsKKwkJaG4gPSBnZXRfbmV4dF9leGNsX2xvY2soaG4sICZsdl9uYW1lKTsKKwkJaWYgKGx2X25hbWUpIHsKKwkJCWlmICghKmx2X25hbWUpCisJCQkJYnJlYWs7IC8qIEZJWE1FOiBJcyB0aGlzIGVycm9yID8gKi8KKwkJCWFyZ3ZbYXJnYysrXSA9ICItRSI7CisJCQlhcmd2W2FyZ2MrK10gPSBsdl9uYW1lOworCQkJREVCVUdMT0coImV4Y2wgbG9jazogJXNcbiIsIGx2X25hbWUpOworCQl9CisJfSB3aGlsZSAoaG4pOworCWFyZ3ZbYXJnY10gPSBOVUxMOworCisJLyogRXhlYyBuZXcgY2x2bWQgKi8KKwlERUJVR0xPRygiLS0tIFJlc3RhcnRpbmcgJXMgLS0tXG4iLCBjbHZtZCk7CisJZm9yIChhcmdjID0gMTsgYXJndlthcmdjXTsgYXJnYysrKSBERUJVR0xPRygiLS0tICVkOiAlc1xuIiwgYXJnYywgYXJndlthcmdjXSk7CisKKwkvKiBOT1RFOiBUaGlzIHdpbGwgZmFpbCB3aGVuIGRvd25ncmFkaW5nISAqLworCWV4ZWN2cChjbHZtZCwgKGNoYXIgKiopYXJndik7CitvdXQ6CisJLyogV2UgZmFpbGVkICovCisJREVCVUdMT0coIlJlc3RhcnQgb2YgY2x2bWQgZmFpbGVkLlxuIik7CisKKwlmcmVlKGFyZ3YpOworCisJcmV0dXJuIEVJTzsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY2x2bWQvY2x2bWQtY29tbW9uLmggYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTBlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLWNvbW1vbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGZpcnN0IGJ5IGV2ZXJ5IGNsdm1kIHNvdXJjZSBmaWxlLgorICovCisjaWZuZGVmIF9MVk1fQ0xWTURfQ09NTU9OX0gKKyNkZWZpbmUgX0xWTV9DTFZNRF9DT01NT05fSAorCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImx2bS1sb2dnaW5nLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC9jbHZtZC1jb21tcy5oIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1jb21tcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDA3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLWNvbW1zLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBBYnN0cmFjdGlvbiBsYXllciBmb3IgY2x2bWQgY2x1c3RlciBjb21tdW5pY2F0aW9ucworICovCisKKyNpZm5kZWYgX0NMVk1EX0NPTU1TX0gKKyNkZWZpbmUgX0NMVk1EX0NPTU1TX0gKKworc3RydWN0IGxvY2FsX2NsaWVudDsKKworc3RydWN0IGNsdXN0ZXJfb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCpjbHVzdGVyX2luaXRfY29tcGxldGVkKSAodm9pZCk7CisKKwlpbnQgKCpjbHVzdGVyX3NlbmRfbWVzc2FnZSkgKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG1zZ2xlbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNzaWQsCisJCQkJICAgICBjb25zdCBjaGFyICplcnJ0ZXh0KTsKKwlpbnQgKCpuYW1lX2Zyb21fY3NpZCkgKGNvbnN0IGNoYXIgKmNzaWQsIGNoYXIgKm5hbWUpOworCWludCAoKmNzaWRfZnJvbV9uYW1lKSAoY2hhciAqY3NpZCwgY29uc3QgY2hhciAqbmFtZSk7CisJaW50ICgqZ2V0X251bV9ub2RlcykgKHZvaWQpOworCWludCAoKmNsdXN0ZXJfZmRfY2FsbGJhY2spIChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpmZCwgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJCSAgICBjb25zdCBjaGFyICpjc2lkLAorCQkJCSAgICBzdHJ1Y3QgbG9jYWxfY2xpZW50ICoqbmV3X2NsaWVudCk7CisJaW50ICgqZ2V0X21haW5fY2x1c3Rlcl9mZCkgKHZvaWQpOwkvKiBnZXRzIGFjY2VwdCBGRCBvciBjbWFuIGNsdXN0ZXIgc29ja2V0ICovCisJaW50ICgqY2x1c3Rlcl9kb19ub2RlX2NhbGxiYWNrKSAoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50LAorCQkJCQkgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGxvY2FsX2NsaWVudCAqLAorCQkJCQkJCSAgIGNvbnN0IGNoYXIgKmNzaWQsCisJCQkJCQkJICAgaW50IG5vZGVfdXApKTsKKwlpbnQgKCppc19xdW9yYXRlKSAodm9pZCk7CisKKwl2b2lkICgqZ2V0X291cl9jc2lkKSAoY2hhciAqY3NpZCk7CisJdm9pZCAoKmFkZF91cF9ub2RlKSAoY29uc3QgY2hhciAqY3NpZCk7CisJdm9pZCAoKnJlcmVhZF9jb25maWcpICh2b2lkKTsKKwl2b2lkICgqY2x1c3Rlcl9jbG9zZWRvd24pICh2b2lkKTsKKworCWludCAoKmdldF9jbHVzdGVyX25hbWUpKGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisKKwlpbnQgKCpzeW5jX2xvY2spIChjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50IG1vZGUsCisJCQkgIGludCBmbGFncywgaW50ICpsb2NraWQpOworCWludCAoKnN5bmNfdW5sb2NrKSAoY29uc3QgY2hhciAqcmVzb3VyY2UsIGludCBsb2NraWQpOworCit9OworCisjaWZkZWYgVVNFX0NNQU4KKyMgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgIGluY2x1ZGUgImxpYmNtYW4uaCIKKyMgIGRlZmluZSBDTUFOX01BWF9DU0lEX0xFTiA0CisjICBpZm5kZWYgTUFYX0NTSURfTEVOCisjICAgIGRlZmluZSBNQVhfQ1NJRF9MRU4gQ01BTl9NQVhfQ1NJRF9MRU4KKyMgIGVuZGlmCisjICB1bmRlZiBNQVhfQ0xVU1RFUl9NRU1CRVJfTkFNRV9MRU4KKyMgIGRlZmluZSBNQVhfQ0xVU1RFUl9NRU1CRVJfTkFNRV9MRU4gICBDTUFOX01BWF9OT0RFTkFNRV9MRU4KKyMgIGRlZmluZSBDTUFOX01BWF9DTFVTVEVSX01FU1NBR0UgMTUwMAorIyAgZGVmaW5lIENMVVNURVJfUE9SVF9DTFZNRCAxMQorc3RydWN0IGNsdXN0ZXJfb3BzICppbml0X2NtYW5fY2x1c3Rlcih2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX09QRU5BSVMKKyMgIGluY2x1ZGUgPG9wZW5haXMvc2FBaXMuaD4KKyMgIGluY2x1ZGUgPGNvcm9zeW5jL3RvdGVtL3RvdGVtLmg+CisjICBkZWZpbmUgT1BFTkFJU19DU0lEX0xFTiAoc2l6ZW9mKGludCkpCisjICBkZWZpbmUgT1BFTkFJU19NQVhfQ0xVU1RFUl9NRVNTQUdFICAgICAgICAgTUVTU0FHRV9TSVpFX01BWAorIyAgZGVmaW5lIE9QRU5BSVNfTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOIFNBX01BWF9OQU1FX0xFTkdUSAorIyAgaWZuZGVmIE1BWF9DTFVTVEVSX01FTUJFUl9OQU1FX0xFTgorIyAgICBkZWZpbmUgTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOICAgICAgIFNBX01BWF9OQU1FX0xFTkdUSAorIyAgZW5kaWYKKyMgIGlmbmRlZiBDTUFOX01BWF9DTFVTVEVSX01FU1NBR0UKKyMgICAgZGVmaW5lIENNQU5fTUFYX0NMVVNURVJfTUVTU0FHRSAgICAgICAgICBNRVNTQUdFX1NJWkVfTUFYCisjICBlbmRpZgorIyAgaWZuZGVmIE1BWF9DU0lEX0xFTgorIyAgICBkZWZpbmUgTUFYX0NTSURfTEVOIHNpemVvZihpbnQpCisjICBlbmRpZgorc3RydWN0IGNsdXN0ZXJfb3BzICppbml0X29wZW5haXNfY2x1c3Rlcih2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0NPUk9TWU5DCisjICBpbmNsdWRlIDxjb3Jvc3luYy9jb3JvdHlwZXMuaD4KKyMgIGRlZmluZSBDT1JPU1lOQ19DU0lEX0xFTiAoc2l6ZW9mKGludCkpCisjICBkZWZpbmUgQ09ST1NZTkNfTUFYX0NMVVNURVJfTUVTU0FHRSAgICAgICAgIDY1NTM1CisjICBkZWZpbmUgQ09ST1NZTkNfTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOIENTX01BWF9OQU1FX0xFTkdUSAorIyAgaWZuZGVmIE1BWF9DTFVTVEVSX01FTUJFUl9OQU1FX0xFTgorIyAgICBkZWZpbmUgTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOICAgICAgIENTX01BWF9OQU1FX0xFTkdUSAorIyAgZW5kaWYKKyMgIGlmbmRlZiBDTUFOX01BWF9DTFVTVEVSX01FU1NBR0UKKyMgICAgZGVmaW5lIENNQU5fTUFYX0NMVVNURVJfTUVTU0FHRSAgICAgICAgICA2NTUzNQorIyAgZW5kaWYKKyMgIGlmbmRlZiBNQVhfQ1NJRF9MRU4KKyMgICAgZGVmaW5lIE1BWF9DU0lEX0xFTiBzaXplb2YoaW50KQorIyAgZW5kaWYKK3N0cnVjdCBjbHVzdGVyX29wcyAqaW5pdF9jb3Jvc3luY19jbHVzdGVyKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfU0lOR0xFTk9ERQorIyAgZGVmaW5lIFNJTkdMRU5PREVfQ1NJRF9MRU4gKHNpemVvZihpbnQpKQorIyAgaWZuZGVmIE1BWF9DTFVTVEVSX01FTUJFUl9OQU1FX0xFTgorIyAgICBkZWZpbmUgTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOICAgICAgIDY0CisjICBlbmRpZgorIyAgZGVmaW5lIFNJTkdMRU5PREVfTUFYX0NMVVNURVJfTUVTU0FHRSAgICAgICAgICA2NTUzNQorIyAgaWZuZGVmIE1BWF9DU0lEX0xFTgorIyAgICBkZWZpbmUgTUFYX0NTSURfTEVOIHNpemVvZihpbnQpCisjICBlbmRpZgorc3RydWN0IGNsdXN0ZXJfb3BzICppbml0X3NpbmdsZW5vZGVfY2x1c3Rlcih2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RhZW1vbnMvY2x2bWQvY2x2bWQtY29yb3N5bmMuYyBiL2RhZW1vbnMvY2x2bWQvY2x2bWQtY29yb3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM5ODgyCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1jb3Jvc3luYy5jCkBAIC0wLDAgKzEsNjU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGNsdm1kIGFuZCBjb3Jvc3luYy9ETE0gYXMgdGhlIGNsdXN0ZXIKKyAqIGFuZCBsb2NrIG1hbmFnZXIuCisgKi8KKworI2luY2x1ZGUgImNsdm1kLWNvbW1vbi5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiY2x2bS5oIgorI2luY2x1ZGUgImNsdm1kLWNvbW1zLmgiCisjaW5jbHVkZSAiY2x2bWQuaCIKKyNpbmNsdWRlICJsdm0tZnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlICJsb2NraW5nLmgiCisKKyNpbmNsdWRlIDxjb3Jvc3luYy9jcGcuaD4KKyNpbmNsdWRlIDxjb3Jvc3luYy9xdW9ydW0uaD4KKworI2lmZGVmIEhBVkVfQ09ST1NZTkNfQ09ORkRCX0gKKyMgIGluY2x1ZGUgPGNvcm9zeW5jL2NvbmZkYi5oPgorI2VsaWYgZGVmaW5lZCBIQVZFX0NPUk9TWU5DX0NNQVBfSAorIyAgaW5jbHVkZSA8Y29yb3N5bmMvY21hcC5oPgorI2Vsc2UKKyMgIGVycm9yICJFaXRoZXIgSEFWRV9DT1JPU1lOQ19DT05GREJfSCBvciBIQVZFX0NPUk9TWU5DX0NNQVBfSCBtdXN0IGJlIGRlZmluZWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkbG0uaD4KKworI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvKiBUaW1lb3V0IHZhbHVlIGZvciBzZXZlcmFsIGNvcm9zeW5jIGNhbGxzICovCisjZGVmaW5lIExPQ0tTUEFDRV9OQU1FICJjbHZtZCIKKworc3RhdGljIHZvaWQgY29yb3N5bmNfY3BnX2RlbGl2ZXJfY2FsbGJhY2sgKGNwZ19oYW5kbGVfdCBoYW5kbGUsCisJCQkJICBjb25zdCBzdHJ1Y3QgY3BnX25hbWUgKmdyb3VwTmFtZSwKKwkJCQkgIHVpbnQzMl90IG5vZGVpZCwKKwkJCQkgIHVpbnQzMl90IHBpZCwKKwkJCQkgIHZvaWQgKm1zZywKKwkJCQkgIHNpemVfdCBtc2dfbGVuKTsKK3N0YXRpYyB2b2lkIGNvcm9zeW5jX2NwZ19jb25mY2hnX2NhbGxiYWNrKGNwZ19oYW5kbGVfdCBoYW5kbGUsCisJCQkJIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAqZ3JvdXBOYW1lLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKm1lbWJlcl9saXN0LCBzaXplX3QgbWVtYmVyX2xpc3RfZW50cmllcywKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpsZWZ0X2xpc3QsIHNpemVfdCBsZWZ0X2xpc3RfZW50cmllcywKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpqb2luZWRfbGlzdCwgc2l6ZV90IGpvaW5lZF9saXN0X2VudHJpZXMpOworc3RhdGljIHZvaWQgX2NsdXN0ZXJfY2xvc2Vkb3duKHZvaWQpOworCisvKiBIYXNoIGxpc3Qgb2Ygbm9kZXMgaW4gdGhlIGNsdXN0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbm9kZV9oYXNoOworCisvKiBOdW1iZXIgb2YgYWN0aXZlIG5vZGVzICovCitzdGF0aWMgaW50IG51bV9ub2RlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3VyX25vZGVpZDsKKworc3RhdGljIHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsdXN0ZXJfY2xpZW50OworCisvKiBDb3Jvc3luYyBoYW5kbGVzICovCitzdGF0aWMgY3BnX2hhbmRsZV90IGNwZ19oYW5kbGU7CitzdGF0aWMgcXVvcnVtX2hhbmRsZV90IHF1b3J1bV9oYW5kbGU7CisKKy8qIERMTSBIYW5kbGUgKi8KK3N0YXRpYyBkbG1fbHNoYW5kbGVfdCAqbG9ja3NwYWNlOworCitzdGF0aWMgc3RydWN0IGNwZ19uYW1lIGNwZ19ncm91cF9uYW1lOworCisvKiBDb3Jvc3luYyBjYWxsYmFjayBzdHJ1Y3RzICovCitjcGdfY2FsbGJhY2tzX3QgY29yb3N5bmNfY3BnX2NhbGxiYWNrcyA9IHsKKwkuY3BnX2RlbGl2ZXJfZm4gPSAgICAgICAgICAgIGNvcm9zeW5jX2NwZ19kZWxpdmVyX2NhbGxiYWNrLAorCS5jcGdfY29uZmNoZ19mbiA9ICAgICAgICAgICAgY29yb3N5bmNfY3BnX2NvbmZjaGdfY2FsbGJhY2ssCit9OworCitxdW9ydW1fY2FsbGJhY2tzX3QgcXVvcnVtX2NhbGxiYWNrcyA9IHsKKwkucXVvcnVtX25vdGlmeV9mbiA9IE5VTEwsCit9OworCitzdHJ1Y3Qgbm9kZV9pbmZvCit7CisJZW51bSB7Tk9ERV9ET1dOLCBOT0RFX0NMVk1EfSBzdGF0ZTsKKwlpbnQgbm9kZWlkOworfTsKKworCisvKiBTZXQgZXJybm8gdG8gc29tZXRoaW5nIGFwcHJveGltYXRpbmcgdGhlIHJpZ2h0IHZhbHVlIGFuZCByZXR1cm4gMCBvciAtMSAqLworc3RhdGljIGludCBjc190b19lcnJubyhjc19lcnJvcl90IGVycikKK3sKKwlzd2l0Y2goZXJyKQorCXsKKwljYXNlIENTX09LOgorCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBDU19FUlJfTElCUkFSWToKKwkJZXJybm8gPSBFSU5WQUw7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9WRVJTSU9OOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX0lOSVQ6CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKyAgICAgICAgY2FzZSBDU19FUlJfVElNRU9VVDoKKwkJZXJybm8gPSBFVElNRTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX1RSWV9BR0FJTjoKKwkJZXJybm8gPSBFQUdBSU47CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9JTlZBTElEX1BBUkFNOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX05PX01FTU9SWToKKwkJZXJybm8gPSBFTk9NRU07CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9CQURfSEFORExFOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX0JVU1k6CisJCWVycm5vID0gRUJVU1k7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9BQ0NFU1M6CisJCWVycm5vID0gRVBFUk07CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9OT1RfRVhJU1Q6CisJCWVycm5vID0gRU5PRU5UOworCQlicmVhazsKKyAgICAgICAgY2FzZSBDU19FUlJfTkFNRV9UT09fTE9ORzoKKwkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9FWElTVDoKKwkJZXJybm8gPSBFRVhJU1Q7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9OT19TUEFDRToKKwkJZXJybm8gPSBFTk9TUEM7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9JTlRFUlJVUFQ6CisJCWVycm5vID0gRUlOVFI7CisJCWJyZWFrOworCWNhc2UgQ1NfRVJSX05BTUVfTk9UX0ZPVU5EOgorCQllcnJubyA9IEVOT0VOVDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX05PX1JFU09VUkNFUzoKKwkJZXJybm8gPSBFTk9NRU07CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9OT1RfU1VQUE9SVEVEOgorCQllcnJubyA9IEVPUE5PVFNVUFA7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9CQURfT1BFUkFUSU9OOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX0ZBSUxFRF9PUEVSQVRJT046CisJCWVycm5vID0gRUlPOworCQlicmVhazsKKyAgICAgICAgY2FzZSBDU19FUlJfTUVTU0FHRV9FUlJPUjoKKwkJZXJybm8gPSBFSU87CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9RVUVVRV9GVUxMOgorCQllcnJubyA9IEVYRlVMTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX1FVRVVFX05PVF9BVkFJTEFCTEU6CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKyAgICAgICAgY2FzZSBDU19FUlJfQkFEX0ZMQUdTOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQ1NfRVJSX1RPT19CSUc6CisJCWVycm5vID0gRTJCSUc7CisJCWJyZWFrOworICAgICAgICBjYXNlIENTX0VSUl9OT19TRUNUSU9OUzoKKwkJZXJybm8gPSBFTk9NRU07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfY29yb3N5bmNfY3NpZChjb25zdCBjaGFyICpjc2lkKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCWludCBpZDsKKworCW1lbWNweSgmaWQsIGNzaWQsIHNpemVvZihpbnQpKTsKKwlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIGNvcm9zeW5jX2NwZ19kZWxpdmVyX2NhbGxiYWNrIChjcGdfaGFuZGxlX3QgaGFuZGxlLAorCQkJCSAgY29uc3Qgc3RydWN0IGNwZ19uYW1lICpncm91cE5hbWUsCisJCQkJICB1aW50MzJfdCBub2RlaWQsCisJCQkJICB1aW50MzJfdCBwaWQsCisJCQkJICB2b2lkICptc2csCisJCQkJICBzaXplX3QgbXNnX2xlbikKK3sKKwlpbnQgdGFyZ2V0X25vZGVpZDsKKworCW1lbWNweSgmdGFyZ2V0X25vZGVpZCwgbXNnLCBDT1JPU1lOQ19DU0lEX0xFTik7CisKKwlERUJVR0xPRygiJXUgZ290IG1lc3NhZ2UgZnJvbSBub2RlaWQgJWQgZm9yICVkLiBsZW4gJXpkXG4iLAorCQkgb3VyX25vZGVpZCwgbm9kZWlkLCB0YXJnZXRfbm9kZWlkLCBtc2dfbGVuLTQpOworCisJaWYgKG5vZGVpZCAhPSBvdXJfbm9kZWlkKQorCQlpZiAodGFyZ2V0X25vZGVpZCA9PSBvdXJfbm9kZWlkIHx8IHRhcmdldF9ub2RlaWQgPT0gMCkKKwkJCXByb2Nlc3NfbWVzc2FnZShjbHVzdGVyX2NsaWVudCwgKGNoYXIgKiltc2crQ09ST1NZTkNfQ1NJRF9MRU4sCisJCQkJCW1zZ19sZW4tQ09ST1NZTkNfQ1NJRF9MRU4sIChjaGFyKikmbm9kZWlkKTsKK30KKworc3RhdGljIHZvaWQgY29yb3N5bmNfY3BnX2NvbmZjaGdfY2FsbGJhY2soY3BnX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19uYW1lICpncm91cE5hbWUsCisJCQkJIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbWVtYmVyX2xpc3QsIHNpemVfdCBtZW1iZXJfbGlzdF9lbnRyaWVzLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKmxlZnRfbGlzdCwgc2l6ZV90IGxlZnRfbGlzdF9lbnRyaWVzLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKmpvaW5lZF9saXN0LCBzaXplX3Qgam9pbmVkX2xpc3RfZW50cmllcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgbm9kZV9pbmZvICpuaW5mbzsKKworCURFQlVHTE9HKCJjb25mY2hnIGNhbGxiYWNrLiAlemQgam9pbmVkLCAlemQgbGVmdCwgJXpkIG1lbWJlcnNcbiIsCisJCSBqb2luZWRfbGlzdF9lbnRyaWVzLCBsZWZ0X2xpc3RfZW50cmllcywgbWVtYmVyX2xpc3RfZW50cmllcyk7CisKKwlmb3IgKGk9MDsgaTxqb2luZWRfbGlzdF9lbnRyaWVzOyBpKyspIHsKKwkJbmluZm8gPSBkbV9oYXNoX2xvb2t1cF9iaW5hcnkobm9kZV9oYXNoLAorCQkJCQkgICAgICAoY2hhciAqKSZqb2luZWRfbGlzdFtpXS5ub2RlaWQsCisJCQkJCSAgICAgIENPUk9TWU5DX0NTSURfTEVOKTsKKwkJaWYgKCFuaW5mbykgeworCQkJbmluZm8gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlX2luZm8pKTsKKwkJCWlmICghbmluZm8pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW5pbmZvLT5ub2RlaWQgPSBqb2luZWRfbGlzdFtpXS5ub2RlaWQ7CisJCQkJZG1faGFzaF9pbnNlcnRfYmluYXJ5KG5vZGVfaGFzaCwKKwkJCQkJCSAgICAgIChjaGFyICopJm5pbmZvLT5ub2RlaWQsCisJCQkJCQkgICAgICBDT1JPU1lOQ19DU0lEX0xFTiwgbmluZm8pOworCQkJfQorCQl9CisJCW5pbmZvLT5zdGF0ZSA9IE5PREVfQ0xWTUQ7CisJfQorCisJZm9yIChpPTA7IGk8bGVmdF9saXN0X2VudHJpZXM7IGkrKykgeworCQluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsCisJCQkJCSAgICAgIChjaGFyICopJmxlZnRfbGlzdFtpXS5ub2RlaWQsCisJCQkJCSAgICAgIENPUk9TWU5DX0NTSURfTEVOKTsKKwkJaWYgKG5pbmZvKQorCQkJbmluZm8tPnN0YXRlID0gTk9ERV9ET1dOOworCX0KKworCW51bV9ub2RlcyA9IG1lbWJlcl9saXN0X2VudHJpZXM7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfY2x1c3Rlcih2b2lkKQoreworCWNzX2Vycm9yX3QgZXJyOworCisjaWZkZWYgUVVPUlVNX1NFVAkvKiBjb3Jvc3luYy9xdW9ydW0uaCAqLworCXVpbnQzMl90IHF1b3J1bV90eXBlOworI2VuZGlmCisKKwlub2RlX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMDApOworCisJZXJyID0gY3BnX2luaXRpYWxpemUoJmNwZ19oYW5kbGUsCisJCQkgICAgICZjb3Jvc3luY19jcGdfY2FsbGJhY2tzKTsKKwlpZiAoZXJyICE9IENTX09LKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiQ2Fubm90IGluaXRpYWxpc2UgQ29yb3N5bmMgQ1BHIHNlcnZpY2U6ICVkIiwKKwkJICAgICAgIGVycik7CisJCURFQlVHTE9HKCJDYW5ub3QgaW5pdGlhbGlzZSBDb3Jvc3luYyBDUEcgc2VydmljZTogJWQiLCBlcnIpOworCQlyZXR1cm4gY3NfdG9fZXJybm8oZXJyKTsKKwl9CisKKyNpZmRlZiBRVU9SVU1fU0VUCisJZXJyID0gcXVvcnVtX2luaXRpYWxpemUoJnF1b3J1bV9oYW5kbGUsCisJCQkJJnF1b3J1bV9jYWxsYmFja3MsCisJCQkJJnF1b3J1bV90eXBlKTsKKworCWlmIChxdW9ydW1fdHlwZSAhPSBRVU9SVU1fU0VUKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiQ29yb3N5bmMgcXVvcnVtIHNlcnZpY2UgaXMgbm90IGNvbmZpZ3VyZWQiKTsKKwkJREVCVUdMT0coIkNvcm9zeW5jIHF1b3J1bSBzZXJ2aWNlIGlzIG5vdCBjb25maWd1cmVkIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorI2Vsc2UKKwllcnIgPSBxdW9ydW1faW5pdGlhbGl6ZSgmcXVvcnVtX2hhbmRsZSwKKwkJCQkmcXVvcnVtX2NhbGxiYWNrcyk7CisjZW5kaWYKKworCWlmIChlcnIgIT0gQ1NfT0spIHsKKwkJc3lzbG9nKExPR19FUlIsICJDYW5ub3QgaW5pdGlhbGlzZSBDb3Jvc3luYyBxdW9ydW0gc2VydmljZTogJWQiLAorCQkgICAgICAgZXJyKTsKKwkJREVCVUdMT0coIkNhbm5vdCBpbml0aWFsaXNlIENvcm9zeW5jIHF1b3J1bSBzZXJ2aWNlOiAlZCIsIGVycik7CisJCXJldHVybiBjc190b19lcnJubyhlcnIpOworCX0KKworCS8qIENyZWF0ZSBhIGxvY2tzcGFjZSBmb3IgTFYgJiBWRyBsb2NrcyB0byBsaXZlIGluICovCisJbG9ja3NwYWNlID0gZGxtX29wZW5fbG9ja3NwYWNlKExPQ0tTUEFDRV9OQU1FKTsKKwlpZiAoIWxvY2tzcGFjZSkgeworCQlsb2Nrc3BhY2UgPSBkbG1fY3JlYXRlX2xvY2tzcGFjZShMT0NLU1BBQ0VfTkFNRSwgMDYwMCk7CisJCWlmICghbG9ja3NwYWNlKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgIlVuYWJsZSB0byBjcmVhdGUgRExNIGxvY2tzcGFjZSBmb3IgQ0xWTTogJW0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlERUJVR0xPRygiQ3JlYXRlZCBETE0gbG9ja3NwYWNlIGZvciBDTFZNRC5cbiIpOworCX0gZWxzZQorCQlERUJVR0xPRygiT3BlbmVkIGV4aXN0aW5nIERMTSBsb2Nrc3BhY2UgZm9yIENMVk1ELlxuIik7CisKKwlkbG1fbHNfcHRocmVhZF9pbml0KGxvY2tzcGFjZSk7CisJREVCVUdMT0coIkRMTSBpbml0aWFsaXNhdGlvbiBjb21wbGV0ZVxuIik7CisKKwkvKiBDb25uZWN0IHRvIHRoZSBjbHZtZCBncm91cCAqLworCXN0cmNweSgoY2hhciAqKWNwZ19ncm91cF9uYW1lLnZhbHVlLCAiY2x2bWQiKTsKKwljcGdfZ3JvdXBfbmFtZS5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKiljcGdfZ3JvdXBfbmFtZS52YWx1ZSk7CisJZXJyID0gY3BnX2pvaW4oY3BnX2hhbmRsZSwgJmNwZ19ncm91cF9uYW1lKTsKKwlpZiAoZXJyICE9IENTX09LKSB7CisJCWNwZ19maW5hbGl6ZShjcGdfaGFuZGxlKTsKKwkJcXVvcnVtX2ZpbmFsaXplKHF1b3J1bV9oYW5kbGUpOworCQlkbG1fcmVsZWFzZV9sb2Nrc3BhY2UoTE9DS1NQQUNFX05BTUUsIGxvY2tzcGFjZSwgMSk7CisJCXN5c2xvZyhMT0dfRVJSLCAiQ2Fubm90IGpvaW4gY2x2bWQgcHJvY2VzcyBncm91cCIpOworCQlERUJVR0xPRygiQ2Fubm90IGpvaW4gY2x2bWQgcHJvY2VzcyBncm91cDogJWRcbiIsIGVycik7CisJCXJldHVybiBjc190b19lcnJubyhlcnIpOworCX0KKworCWVyciA9IGNwZ19sb2NhbF9nZXQoY3BnX2hhbmRsZSwKKwkJCSAgICAmb3VyX25vZGVpZCk7CisJaWYgKGVyciAhPSBDU19PSykgeworCQljcGdfZmluYWxpemUoY3BnX2hhbmRsZSk7CisJCXF1b3J1bV9maW5hbGl6ZShxdW9ydW1faGFuZGxlKTsKKwkJZGxtX3JlbGVhc2VfbG9ja3NwYWNlKExPQ0tTUEFDRV9OQU1FLCBsb2Nrc3BhY2UsIDEpOworCQlzeXNsb2coTE9HX0VSUiwgIkNhbm5vdCBnZXQgbG9jYWwgbm9kZSBpZFxuIik7CisJCXJldHVybiBjc190b19lcnJubyhlcnIpOworCX0KKwlERUJVR0xPRygiT3VyIGxvY2FsIG5vZGUgaWQgaXMgJWRcbiIsIG91cl9ub2RlaWQpOworCisJREVCVUdMT0coIkNvbm5lY3RlZCB0byBDb3Jvc3luY1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2NsdXN0ZXJfY2xvc2Vkb3duKHZvaWQpCit7CisJZGxtX3JlbGVhc2VfbG9ja3NwYWNlKExPQ0tTUEFDRV9OQU1FLCBsb2Nrc3BhY2UsIDEpOworCWNwZ19maW5hbGl6ZShjcGdfaGFuZGxlKTsKKwlxdW9ydW1fZmluYWxpemUocXVvcnVtX2hhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9nZXRfb3VyX2NzaWQoY2hhciAqY3NpZCkKK3sKKwltZW1jcHkoY3NpZCwgJm91cl9ub2RlaWQsIHNpemVvZihpbnQpKTsKK30KKworLyogQ29yb3N5bmMgZG9lc24ndCByZWFsbHkgaGF2ZSBubW9kZSBuYW1lcyBzbyB3ZQorICAganVzdCB1c2UgdGhlIG5vZGUgSUQgaW4gaGV4IGluc3RlYWQgKi8KK3N0YXRpYyBpbnQgX2NzaWRfZnJvbV9uYW1lKGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IG5vZGVpZDsKKwlzdHJ1Y3Qgbm9kZV9pbmZvICpuaW5mbzsKKworCWlmIChzc2NhbmYobmFtZSwgIiV4IiwgJm5vZGVpZCkgPT0gMSkgeworCQluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsIGNzaWQsIENPUk9TWU5DX0NTSURfTEVOKTsKKwkJaWYgKG5pbmZvKQorCQkJcmV0dXJuIG5vZGVpZDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9uYW1lX2Zyb21fY3NpZChjb25zdCBjaGFyICpjc2lkLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBub2RlX2luZm8gKm5pbmZvOworCisJbmluZm8gPSBkbV9oYXNoX2xvb2t1cF9iaW5hcnkobm9kZV9oYXNoLCBjc2lkLCBDT1JPU1lOQ19DU0lEX0xFTik7CisJaWYgKCFuaW5mbykKKwl7CisJCXNwcmludGYobmFtZSwgIlVOS05PV04gJXMiLCBwcmludF9jb3Jvc3luY19jc2lkKGNzaWQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwcmludGYobmFtZSwgIiV4IiwgbmluZm8tPm5vZGVpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9udW1fbm9kZXModm9pZCkKK3sKKwlERUJVR0xPRygibnVtX25vZGVzID0gJWRcbiIsIG51bV9ub2Rlcyk7CisJcmV0dXJuIG51bV9ub2RlczsKK30KKworLyogTm9kZSBpcyBub3cga25vd24gdG8gYmUgcnVubmluZyBhIGNsdm1kICovCitzdGF0aWMgdm9pZCBfYWRkX3VwX25vZGUoY29uc3QgY2hhciAqY3NpZCkKK3sKKwlzdHJ1Y3Qgbm9kZV9pbmZvICpuaW5mbzsKKworCW5pbmZvID0gZG1faGFzaF9sb29rdXBfYmluYXJ5KG5vZGVfaGFzaCwgY3NpZCwgQ09ST1NZTkNfQ1NJRF9MRU4pOworCWlmICghbmluZm8pIHsKKwkJREVCVUdMT0coImNvcm9zeW5jX2FkZF91cF9ub2RlIG5vIG5vZGVfaGFzaCBlbnRyeSBmb3IgY3NpZCAlc1xuIiwKKwkJCSBwcmludF9jb3Jvc3luY19jc2lkKGNzaWQpKTsKKwkJcmV0dXJuOworCX0KKworCURFQlVHTE9HKCJjb3Jvc3luY19hZGRfdXBfbm9kZSAlZFxuIiwgbmluZm8tPm5vZGVpZCk7CisKKwluaW5mby0+c3RhdGUgPSBOT0RFX0NMVk1EOworCisJcmV0dXJuOworfQorCisvKiBDYWxsIGEgY2FsbGJhY2sgZm9yIGVhY2ggbm9kZSwgc28gdGhlIGNhbGxlciBrbm93cyB3aGV0aGVyIGl0J3MgdXAgb3IgZG93biAqLworc3RhdGljIGludCBfY2x1c3Rlcl9kb19ub2RlX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKm1hc3Rlcl9jbGllbnQsCisJCQkJICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBsb2NhbF9jbGllbnQgKiwKKwkJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmNzaWQsIGludCBub2RlX3VwKSkKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpobjsKKwlzdHJ1Y3Qgbm9kZV9pbmZvICpuaW5mbzsKKworCWRtX2hhc2hfaXRlcmF0ZShobiwgbm9kZV9oYXNoKQorCXsKKwkJY2hhciBjc2lkW0NPUk9TWU5DX0NTSURfTEVOXTsKKworCQluaW5mbyA9IGRtX2hhc2hfZ2V0X2RhdGEobm9kZV9oYXNoLCBobik7CisJCW1lbWNweShjc2lkLCBkbV9oYXNoX2dldF9rZXkobm9kZV9oYXNoLCBobiksIENPUk9TWU5DX0NTSURfTEVOKTsKKworCQlERUJVR0xPRygiZG93bl9jYWxsYmFjay4gbm9kZSAlZCwgc3RhdGUgPSAlZFxuIiwgbmluZm8tPm5vZGVpZCwKKwkJCSBuaW5mby0+c3RhdGUpOworCisJCWlmIChuaW5mby0+c3RhdGUgPT0gTk9ERV9DTFZNRCkKKwkJCWNhbGxiYWNrKG1hc3Rlcl9jbGllbnQsIGNzaWQsIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhbCBsb2NraW5nICovCitzdGF0aWMgaW50IF9sb2NrX3Jlc291cmNlKGNvbnN0IGNoYXIgKnJlc291cmNlLCBpbnQgbW9kZSwgaW50IGZsYWdzLCBpbnQgKmxvY2tpZCkKK3sKKwlzdHJ1Y3QgZGxtX2xrc2IgbGtzYjsKKwlpbnQgZXJyOworCisJREVCVUdMT0coImxvY2tfcmVzb3VyY2UgJyVzJywgZmxhZ3M9JWQsIG1vZGU9JWRcbiIsIHJlc291cmNlLCBmbGFncywgbW9kZSk7CisKKwlpZiAoZmxhZ3MgJiBMS0ZfQ09OVkVSVCkKKwkJbGtzYi5zYl9sa2lkID0gKmxvY2tpZDsKKworCWVyciA9IGRsbV9sc19sb2NrX3dhaXQobG9ja3NwYWNlLAorCQkJICAgICAgIG1vZGUsCisJCQkgICAgICAgJmxrc2IsCisJCQkgICAgICAgZmxhZ3MsCisJCQkgICAgICAgcmVzb3VyY2UsCisJCQkgICAgICAgc3RybGVuKHJlc291cmNlKSwKKwkJCSAgICAgICAwLAorCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisJaWYgKGVyciAhPSAwKQorCXsKKwkJREVCVUdMT0coImRsbV9sc19sb2NrIHJldHVybmVkICVkXG4iLCBlcnJubyk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChsa3NiLnNiX3N0YXR1cyAhPSAwKQorCXsKKwkJREVCVUdMT0coImRsbV9sc19sb2NrIHJldHVybnMgbGtzYi5zYl9zdGF0dXMgJWRcbiIsIGxrc2Iuc2Jfc3RhdHVzKTsKKwkJZXJybm8gPSBsa3NiLnNiX3N0YXR1czsKKwkJcmV0dXJuIC0xOworCX0KKworCURFQlVHTE9HKCJsb2NrX3Jlc291cmNlIHJldHVybmluZyAlZCwgbG9ja19pZD0leFxuIiwgZXJyLCBsa3NiLnNiX2xraWQpOworCisJKmxvY2tpZCA9IGxrc2Iuc2JfbGtpZDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX3VubG9ja19yZXNvdXJjZShjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50IGxvY2tpZCkKK3sKKwlzdHJ1Y3QgZGxtX2xrc2IgbGtzYjsKKwlpbnQgZXJyOworCisJREVCVUdMT0coInVubG9ja19yZXNvdXJjZTogJXMgbG9ja2lkOiAleFxuIiwgcmVzb3VyY2UsIGxvY2tpZCk7CisJbGtzYi5zYl9sa2lkID0gbG9ja2lkOworCisJZXJyID0gZGxtX2xzX3VubG9ja193YWl0KGxvY2tzcGFjZSwKKwkJCQkgbG9ja2lkLAorCQkJCSAwLAorCQkJCSAmbGtzYik7CisJaWYgKGVyciAhPSAwKQorCXsKKwkJREVCVUdMT0coIlVubG9jayByZXR1cm5lZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGxrc2Iuc2Jfc3RhdHVzICE9IEVVTkxPQ0spCisJeworCQlERUJVR0xPRygiZGxtX2xzX3VubG9ja193YWl0IHJldHVybnMgbGtzYi5zYl9zdGF0dXM6ICVkXG4iLCBsa3NiLnNiX3N0YXR1cyk7CisJCWVycm5vID0gbGtzYi5zYl9zdGF0dXM7CisJCXJldHVybiAtMTsKKwl9ICAgCisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9pc19xdW9yYXRlKHZvaWQpCit7CisJaW50IHF1b3JhdGU7CisJaWYgKHF1b3J1bV9nZXRxdW9yYXRlKHF1b3J1bV9oYW5kbGUsICZxdW9yYXRlKSA9PSBDU19PSykKKwkJcmV0dXJuIHF1b3JhdGU7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZ2V0X21haW5fY2x1c3Rlcl9mZCh2b2lkKQoreworCWludCBzZWxlY3RfZmQ7CisKKwljcGdfZmRfZ2V0KGNwZ19oYW5kbGUsICZzZWxlY3RfZmQpOworCXJldHVybiBzZWxlY3RfZmQ7Cit9CisKK3N0YXRpYyBpbnQgX2NsdXN0ZXJfZmRfY2FsbGJhY2soc3RydWN0IGxvY2FsX2NsaWVudCAqZmQsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJCQljb25zdCBjaGFyICpjc2lkLAorCQkJCXN0cnVjdCBsb2NhbF9jbGllbnQgKipuZXdfY2xpZW50KQoreworCWNsdXN0ZXJfY2xpZW50ID0gZmQ7CisJKm5ld19jbGllbnQgPSBOVUxMOworCWNwZ19kaXNwYXRjaChjcGdfaGFuZGxlLCBDU19ESVNQQVRDSF9PTkUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jbHVzdGVyX3NlbmRfbWVzc2FnZShjb25zdCB2b2lkICpidWYsIGludCBtc2dsZW4sIGNvbnN0IGNoYXIgKmNzaWQsCisJCQkJIGNvbnN0IGNoYXIgKmVycnRleHQpCit7CisJc3RydWN0IGlvdmVjIGlvdlsyXTsKKwljc19lcnJvcl90IGVycjsKKwlpbnQgdGFyZ2V0X25vZGU7CisKKwlpZiAoY3NpZCkKKwkJbWVtY3B5KCZ0YXJnZXRfbm9kZSwgY3NpZCwgQ09ST1NZTkNfQ1NJRF9MRU4pOworCWVsc2UKKwkJdGFyZ2V0X25vZGUgPSAwOworCisJaW92WzBdLmlvdl9iYXNlID0gJnRhcmdldF9ub2RlOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKGludCk7CisJaW92WzFdLmlvdl9iYXNlID0gKGNoYXIgKilidWY7CisJaW92WzFdLmlvdl9sZW4gPSBtc2dsZW47CisKKwllcnIgPSBjcGdfbWNhc3Rfam9pbmVkKGNwZ19oYW5kbGUsIENQR19UWVBFX0FHUkVFRCwgaW92LCAyKTsKKwlyZXR1cm4gY3NfdG9fZXJybm8oZXJyKTsKK30KKworI2lmZGVmIEhBVkVfQ09ST1NZTkNfQ09ORkRCX0gKKy8qCisgKiBXZSBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvbm5lY3RlZCB0byBhIFJlZCBIYXQgQ2x1c3RlciBzeXN0ZW0sCisgKiBidXQgaWYgd2UgYXJlLCB0aGlzIHJldHVybnMgdGhlIGNsdXN0ZXIgbmFtZSBmcm9tIGNsdXN0ZXIuY29uZi4KKyAqIEkndmUgdXNlZCBjb25mZGIgcmF0aGVyIHRoYW4gY2NzIHRvIHJlZHVjZSB0aGUgaW50ZXItcGFja2FnZQorICogZGVwZW5kYW5jaWVzIGFzIHdlbGwgYXMgdG8gYWxsb3cgcGVvcGxlIHRvIHNldCBhIGNsdXN0ZXIgbmFtZQorICogZm9yIHRoZW1zZWx2ZXMgZXZlbiBpZiB0aGV5IGFyZSBub3QgcnVubmluZyBvbiBSSCBjbHVzdGVyLgorICovCitzdGF0aWMgaW50IF9nZXRfY2x1c3Rlcl9uYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwljb25mZGJfaGFuZGxlX3QgaGFuZGxlOworCWludCByZXN1bHQ7CisJc2l6ZV90IG5hbWVsZW4gPSBidWZsZW47CisJaGRiX2hhbmRsZV90IGNsdXN0ZXJfaGFuZGxlOworCWNvbmZkYl9jYWxsYmFja3NfdCBjYWxsYmFja3MgPSB7CisJCS5jb25mZGJfa2V5X2NoYW5nZV9ub3RpZnlfZm4gPSBOVUxMLAorCQkuY29uZmRiX29iamVjdF9jcmVhdGVfY2hhbmdlX25vdGlmeV9mbiA9IE5VTEwsCisJCS5jb25mZGJfb2JqZWN0X2RlbGV0ZV9jaGFuZ2Vfbm90aWZ5X2ZuID0gTlVMTAorCX07CisKKwkvKiBUaGlzIGlzIGEgZGVmYXVsdCBpbiBjYXNlIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAqLworCXN0cm5jcHkoYnVmLCAiQ29yb3N5bmMiLCBidWZsZW4pOworCisJLyogTG9vayBmb3IgYSBjbHVzdGVyIG5hbWUgaW4gY29uZmRiICovCisJcmVzdWx0ID0gY29uZmRiX2luaXRpYWxpemUgKCZoYW5kbGUsICZjYWxsYmFja3MpOworICAgICAgICBpZiAocmVzdWx0ICE9IENTX09LKQorCQlyZXR1cm4gMDsKKworICAgICAgICByZXN1bHQgPSBjb25mZGJfb2JqZWN0X2ZpbmRfc3RhcnQoaGFuZGxlLCBPQkpFQ1RfUEFSRU5UX0hBTkRMRSk7CisJaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJZ290byBvdXQ7CisKKyAgICAgICAgcmVzdWx0ID0gY29uZmRiX29iamVjdF9maW5kKGhhbmRsZSwgT0JKRUNUX1BBUkVOVF9IQU5ETEUsICh2b2lkICopImNsdXN0ZXIiLCBzdHJsZW4oImNsdXN0ZXIiKSwgJmNsdXN0ZXJfaGFuZGxlKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJZ290byBvdXQ7CisKKyAgICAgICAgcmVzdWx0ID0gY29uZmRiX2tleV9nZXQoaGFuZGxlLCBjbHVzdGVyX2hhbmRsZSwgKHZvaWQgKikibmFtZSIsIHN0cmxlbigibmFtZSIpLCBidWYsICZuYW1lbGVuKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJZ290byBvdXQ7CisKKwlidWZbbmFtZWxlbl0gPSAnXDAnOworCitvdXQ6CisJY29uZmRiX2ZpbmFsaXplKGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQgSEFWRV9DT1JPU1lOQ19DTUFQX0gKKworc3RhdGljIGludCBfZ2V0X2NsdXN0ZXJfbmFtZShjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJY21hcF9oYW5kbGVfdCBjbWFwX2hhbmRsZSA9IDA7CisJaW50IHJlc3VsdDsKKwljaGFyICpuYW1lID0gTlVMTDsKKworCS8qIFRoaXMgaXMgYSBkZWZhdWx0IGluIGNhc2UgZXZlcnl0aGluZyBlbHNlIGZhaWxzICovCisJc3RybmNweShidWYsICJDb3Jvc3luYyIsIGJ1Zmxlbik7CisKKwkvKiBMb29rIGZvciBhIGNsdXN0ZXIgbmFtZSBpbiBjbWFwICovCisJcmVzdWx0ID0gY21hcF9pbml0aWFsaXplKCZjbWFwX2hhbmRsZSk7CisJaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSBjbWFwX2dldF9zdHJpbmcoY21hcF9oYW5kbGUsICJ0b3RlbS5jbHVzdGVyX25hbWUiLCAmbmFtZSk7CisJaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoYnVmLCAwLCBidWZsZW4pOworCXN0cm5jcHkoYnVmLCBuYW1lLCBidWZsZW4gLSAxKTsKKworb3V0OgorCWlmIChuYW1lKQorCQlmcmVlKG5hbWUpOworCWNtYXBfZmluYWxpemUoY21hcF9oYW5kbGUpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjbHVzdGVyX29wcyBfY2x1c3Rlcl9jb3Jvc3luY19vcHMgPSB7CisJLm5hbWUgICAgICAgICAgICAgICAgICAgICA9ICJjb3Jvc3luYyIsCisJLmNsdXN0ZXJfaW5pdF9jb21wbGV0ZWQgICA9IE5VTEwsCisJLmNsdXN0ZXJfc2VuZF9tZXNzYWdlICAgICA9IF9jbHVzdGVyX3NlbmRfbWVzc2FnZSwKKwkubmFtZV9mcm9tX2NzaWQgICAgICAgICAgID0gX25hbWVfZnJvbV9jc2lkLAorCS5jc2lkX2Zyb21fbmFtZSAgICAgICAgICAgPSBfY3NpZF9mcm9tX25hbWUsCisJLmdldF9udW1fbm9kZXMgICAgICAgICAgICA9IF9nZXRfbnVtX25vZGVzLAorCS5jbHVzdGVyX2ZkX2NhbGxiYWNrICAgICAgPSBfY2x1c3Rlcl9mZF9jYWxsYmFjaywKKwkuZ2V0X21haW5fY2x1c3Rlcl9mZCAgICAgID0gX2dldF9tYWluX2NsdXN0ZXJfZmQsCisJLmNsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayA9IF9jbHVzdGVyX2RvX25vZGVfY2FsbGJhY2ssCisJLmlzX3F1b3JhdGUgICAgICAgICAgICAgICA9IF9pc19xdW9yYXRlLAorCS5nZXRfb3VyX2NzaWQgICAgICAgICAgICAgPSBfZ2V0X291cl9jc2lkLAorCS5hZGRfdXBfbm9kZSAgICAgICAgICAgICAgPSBfYWRkX3VwX25vZGUsCisJLnJlcmVhZF9jb25maWcgICAgICAgICAgICA9IE5VTEwsCisJLmNsdXN0ZXJfY2xvc2Vkb3duICAgICAgICA9IF9jbHVzdGVyX2Nsb3NlZG93biwKKwkuZ2V0X2NsdXN0ZXJfbmFtZSAgICAgICAgID0gX2dldF9jbHVzdGVyX25hbWUsCisJLnN5bmNfbG9jayAgICAgICAgICAgICAgICA9IF9sb2NrX3Jlc291cmNlLAorCS5zeW5jX3VubG9jayAgICAgICAgICAgICAgPSBfdW5sb2NrX3Jlc291cmNlLAorfTsKKworc3RydWN0IGNsdXN0ZXJfb3BzICppbml0X2Nvcm9zeW5jX2NsdXN0ZXIodm9pZCkKK3sKKwlpZiAoIV9pbml0X2NsdXN0ZXIoKSkKKwkJcmV0dXJuICZfY2x1c3Rlcl9jb3Jvc3luY19vcHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY2x2bWQvY2x2bWQtb3BlbmFpcy5jIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1vcGVuYWlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxYTRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY2x2bWQvY2x2bWQtb3BlbmFpcy5jCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGNsdm1kIGFuZCBPcGVuQUlTIGFzIHRoZSBjbHVzdGVyCisgKiBhbmQgbG9jayBtYW5hZ2VyLgorICovCisKKyNpbmNsdWRlICJjbHZtZC1jb21tb24uaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaW5jbHVkZSA8b3BlbmFpcy9zYUFpcy5oPgorI2luY2x1ZGUgPG9wZW5haXMvc2FMY2suaD4KKworI2luY2x1ZGUgPGNvcm9zeW5jL2Nvcm90eXBlcy5oPgorI2luY2x1ZGUgPGNvcm9zeW5jL2NwZy5oPgorCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgImNsdm0uaCIKKyNpbmNsdWRlICJjbHZtZC1jb21tcy5oIgorI2luY2x1ZGUgImx2bS1mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJjbHZtZC5oIgorCisvKiBUaW1lb3V0IHZhbHVlIGZvciBzZXZlcmFsIG9wZW5haXMgY2FsbHMgKi8KKyNkZWZpbmUgVElNRU9VVCAxMAorCitzdGF0aWMgdm9pZCBvcGVuYWlzX2NwZ19kZWxpdmVyX2NhbGxiYWNrIChjcGdfaGFuZGxlX3QgaGFuZGxlLAorCQkJCSAgY29uc3Qgc3RydWN0IGNwZ19uYW1lICpncm91cE5hbWUsCisJCQkJICB1aW50MzJfdCBub2RlaWQsCisJCQkJICB1aW50MzJfdCBwaWQsCisJCQkJICB2b2lkICptc2csCisJCQkJICBzaXplX3QgbXNnX2xlbik7CitzdGF0aWMgdm9pZCBvcGVuYWlzX2NwZ19jb25mY2hnX2NhbGxiYWNrKGNwZ19oYW5kbGVfdCBoYW5kbGUsCisJCQkJIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAqZ3JvdXBOYW1lLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKm1lbWJlcl9saXN0LCBzaXplX3QgbWVtYmVyX2xpc3RfZW50cmllcywKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpsZWZ0X2xpc3QsIHNpemVfdCBsZWZ0X2xpc3RfZW50cmllcywKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpqb2luZWRfbGlzdCwgc2l6ZV90IGpvaW5lZF9saXN0X2VudHJpZXMpOworCitzdGF0aWMgdm9pZCBfY2x1c3Rlcl9jbG9zZWRvd24odm9pZCk7CisKKy8qIEhhc2ggbGlzdCBvZiBub2RlcyBpbiB0aGUgY2x1c3RlciAqLworc3RhdGljIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpub2RlX2hhc2g7CisKKy8qIEZvciBhc3NvY2lhdGluZyBsb2NrIElEcyAmIHJlc291cmNlIGhhbmRsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbG9ja19oYXNoOworCisvKiBOdW1iZXIgb2YgYWN0aXZlIG5vZGVzICovCitzdGF0aWMgaW50IG51bV9ub2RlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3VyX25vZGVpZDsKKworc3RhdGljIHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsdXN0ZXJfY2xpZW50OworCisvKiBPcGVuQUlTIGhhbmRsZXMgKi8KK3N0YXRpYyBjcGdfaGFuZGxlX3QgY3BnX2hhbmRsZTsKK3N0YXRpYyBTYUxja0hhbmRsZVQgbGNrX2hhbmRsZTsKKworc3RhdGljIHN0cnVjdCBjcGdfbmFtZSBjcGdfZ3JvdXBfbmFtZTsKKworLyogT3BlbmFpcyBjYWxsYmFjayBzdHJ1Y3RzICovCitjcGdfY2FsbGJhY2tzX3Qgb3BlbmFpc19jcGdfY2FsbGJhY2tzID0geworCS5jcGdfZGVsaXZlcl9mbiA9ICAgICAgICAgICAgb3BlbmFpc19jcGdfZGVsaXZlcl9jYWxsYmFjaywKKwkuY3BnX2NvbmZjaGdfZm4gPSAgICAgICAgICAgIG9wZW5haXNfY3BnX2NvbmZjaGdfY2FsbGJhY2ssCit9OworCitzdHJ1Y3Qgbm9kZV9pbmZvCit7CisJZW51bSB7Tk9ERV9VTktOT1dOLCBOT0RFX0RPV04sIE5PREVfVVAsIE5PREVfQ0xWTUR9IHN0YXRlOworCWludCBub2RlaWQ7Cit9OworCitzdHJ1Y3QgbG9ja19pbmZvCit7CisJU2FMY2tSZXNvdXJjZUhhbmRsZVQgcmVzX2hhbmRsZTsKKwlTYUxja0xvY2tJZFQgICAgICAgICBsb2NrX2lkOworCVNhTmFtZVQgICAgICAgICAgICAgIGxvY2tfbmFtZTsKK307CisKKy8qIFNldCBlcnJubyB0byBzb21ldGhpbmcgYXBwcm94aW1hdGluZyB0aGUgcmlnaHQgdmFsdWUgYW5kIHJldHVybiAwIG9yIC0xICovCitzdGF0aWMgaW50IGFpc190b19lcnJubyhTYUFpc0Vycm9yVCBlcnIpCit7CisJc3dpdGNoKGVycikKKwl7CisJY2FzZSBTQV9BSVNfT0s6CisJCXJldHVybiAwOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfTElCUkFSWToKKwkJZXJybm8gPSBFSU5WQUw7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfVkVSU0lPTjoKKwkJZXJybm8gPSBFSU5WQUw7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfSU5JVDoKKwkJZXJybm8gPSBFSU5WQUw7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfVElNRU9VVDoKKwkJZXJybm8gPSBFVElNRTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9UUllfQUdBSU46CisJCWVycm5vID0gRUFHQUlOOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTQV9BSVNfRVJSX0lOVkFMSURfUEFSQU06CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTQV9BSVNfRVJSX05PX01FTU9SWToKKwkJZXJybm8gPSBFTk9NRU07CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfQkFEX0hBTkRMRToKKwkJZXJybm8gPSBFSU5WQUw7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfQlVTWToKKwkJZXJybm8gPSBFQlVTWTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9BQ0NFU1M6CisJCWVycm5vID0gRVBFUk07CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfTk9UX0VYSVNUOgorCQllcnJubyA9IEVOT0VOVDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9OQU1FX1RPT19MT05HOgorCQllcnJubyA9IEVOQU1FVE9PTE9ORzsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9FWElTVDoKKwkJZXJybm8gPSBFRVhJU1Q7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfTk9fU1BBQ0U6CisJCWVycm5vID0gRU5PU1BDOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTQV9BSVNfRVJSX0lOVEVSUlVQVDoKKwkJZXJybm8gPSBFSU5UUjsKKwkJYnJlYWs7CisJY2FzZSBTQV9BSVNfRVJSX05BTUVfTk9UX0ZPVU5EOgorCQllcnJubyA9IEVOT0VOVDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9OT19SRVNPVVJDRVM6CisJCWVycm5vID0gRU5PTUVNOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTQV9BSVNfRVJSX05PVF9TVVBQT1JURUQ6CisJCWVycm5vID0gRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9CQURfT1BFUkFUSU9OOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9GQUlMRURfT1BFUkFUSU9OOgorCQllcnJubyA9IEVJTzsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9NRVNTQUdFX0VSUk9SOgorCQllcnJubyA9IEVJTzsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9RVUVVRV9GVUxMOgorCQllcnJubyA9IEVYRlVMTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9RVUVVRV9OT1RfQVZBSUxBQkxFOgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0FfQUlTX0VSUl9CQURfRkxBR1M6CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTQV9BSVNfRVJSX1RPT19CSUc6CisJCWVycm5vID0gRTJCSUc7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNBX0FJU19FUlJfTk9fU0VDVElPTlM6CisJCWVycm5vID0gRU5PTUVNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGNoYXIgKnByaW50X29wZW5haXNfY3NpZChjb25zdCBjaGFyICpjc2lkKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCWludCBpZDsKKworCW1lbWNweSgmaWQsIGNzaWQsIHNpemVvZihpbnQpKTsKKwlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2ludGVybmFsX2NsaWVudChpbnQgZmQsIGZkX2NhbGxiYWNrX3QgY2FsbGJhY2spCit7CisJc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50OworCisJREVCVUdMT0coIkFkZF9pbnRlcm5hbF9jbGllbnQsIGZkID0gJWRcbiIsIGZkKTsKKworCWlmICghKGNsaWVudCA9IGRtX3phbGxvYyhzaXplb2YoKmNsaWVudCkpKSkgeworCQlERUJVR0xPRygibWFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljbGllbnQtPmZkID0gZmQ7CisJY2xpZW50LT50eXBlID0gQ0xVU1RFUl9JTlRFUk5BTDsKKwljbGllbnQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJYWRkX2NsaWVudChjbGllbnQpOworCisJLyogU2V0IENsb3NlLW9uLWV4ZWMgKi8KKwlmY250bChmZCwgRl9TRVRGRCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3BlbmFpc19jcGdfZGVsaXZlcl9jYWxsYmFjayAoY3BnX2hhbmRsZV90IGhhbmRsZSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAqZ3JvdXBOYW1lLAorCQkJCSAgdWludDMyX3Qgbm9kZWlkLAorCQkJCSAgdWludDMyX3QgcGlkLAorCQkJCSAgdm9pZCAqbXNnLAorCQkJCSAgc2l6ZV90IG1zZ19sZW4pCit7CisJaW50IHRhcmdldF9ub2RlaWQ7CisKKwltZW1jcHkoJnRhcmdldF9ub2RlaWQsIG1zZywgT1BFTkFJU19DU0lEX0xFTik7CisKKwlERUJVR0xPRygiJXUgZ290IG1lc3NhZ2UgZnJvbSBub2RlaWQgJWQgZm9yICVkLiBsZW4gJSIgUFJJc2l6ZV90ICJcbiIsCisJCSBvdXJfbm9kZWlkLCBub2RlaWQsIHRhcmdldF9ub2RlaWQsIG1zZ19sZW4tNCk7CisKKwlpZiAobm9kZWlkICE9IG91cl9ub2RlaWQpCisJCWlmICh0YXJnZXRfbm9kZWlkID09IG91cl9ub2RlaWQgfHwgdGFyZ2V0X25vZGVpZCA9PSAwKQorCQkJcHJvY2Vzc19tZXNzYWdlKGNsdXN0ZXJfY2xpZW50LCAoY2hhciAqKW1zZytPUEVOQUlTX0NTSURfTEVOLAorCQkJCQltc2dfbGVuLU9QRU5BSVNfQ1NJRF9MRU4sIChjaGFyKikmbm9kZWlkKTsKK30KKworc3RhdGljIHZvaWQgb3BlbmFpc19jcGdfY29uZmNoZ19jYWxsYmFjayhjcGdfaGFuZGxlX3QgaGFuZGxlLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3BnX25hbWUgKmdyb3VwTmFtZSwKKwkJCQkgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICptZW1iZXJfbGlzdCwgc2l6ZV90IG1lbWJlcl9saXN0X2VudHJpZXMsCisJCQkJIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbGVmdF9saXN0LCBzaXplX3QgbGVmdF9saXN0X2VudHJpZXMsCisJCQkJIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqam9pbmVkX2xpc3QsIHNpemVfdCBqb2luZWRfbGlzdF9lbnRyaWVzKQoreworCWludCBpOworCXN0cnVjdCBub2RlX2luZm8gKm5pbmZvOworCisJREVCVUdMT0coImNvbmZjaGcgY2FsbGJhY2suICUiIFBSSXNpemVfdCAiIGpvaW5lZCwgIgorCQkgRk1Uc2l6ZV90ICIgbGVmdCwgJSIgUFJJc2l6ZV90ICIgbWVtYmVyc1xuIiwKKwkJIGpvaW5lZF9saXN0X2VudHJpZXMsIGxlZnRfbGlzdF9lbnRyaWVzLCBtZW1iZXJfbGlzdF9lbnRyaWVzKTsKKworCWZvciAoaT0wOyBpPGpvaW5lZF9saXN0X2VudHJpZXM7IGkrKykgeworCQluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsCisJCQkJCSAgICAgIChjaGFyICopJmpvaW5lZF9saXN0W2ldLm5vZGVpZCwKKwkJCQkJICAgICAgT1BFTkFJU19DU0lEX0xFTik7CisJCWlmICghbmluZm8pIHsKKwkJCW5pbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZV9pbmZvKSk7CisJCQlpZiAoIW5pbmZvKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIHsKKwkJCQluaW5mby0+bm9kZWlkID0gam9pbmVkX2xpc3RbaV0ubm9kZWlkOworCQkJCWRtX2hhc2hfaW5zZXJ0X2JpbmFyeShub2RlX2hhc2gsCisJCQkJCQkgICAgICAoY2hhciAqKSZuaW5mby0+bm9kZWlkLAorCQkJCQkJICAgICAgT1BFTkFJU19DU0lEX0xFTiwgbmluZm8pOworCQkJfQorCQl9CisJCW5pbmZvLT5zdGF0ZSA9IE5PREVfQ0xWTUQ7CisJfQorCisJZm9yIChpPTA7IGk8bGVmdF9saXN0X2VudHJpZXM7IGkrKykgeworCQluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsCisJCQkJCSAgICAgIChjaGFyICopJmxlZnRfbGlzdFtpXS5ub2RlaWQsCisJCQkJCSAgICAgIE9QRU5BSVNfQ1NJRF9MRU4pOworCQlpZiAobmluZm8pCisJCQluaW5mby0+c3RhdGUgPSBOT0RFX0RPV047CisJfQorCisJZm9yIChpPTA7IGk8bWVtYmVyX2xpc3RfZW50cmllczsgaSsrKSB7CisJCWlmIChtZW1iZXJfbGlzdFtpXS5ub2RlaWQgPT0gMCkgY29udGludWU7CisJCW5pbmZvID0gZG1faGFzaF9sb29rdXBfYmluYXJ5KG5vZGVfaGFzaCwKKwkJCQkoY2hhciAqKSZtZW1iZXJfbGlzdFtpXS5ub2RlaWQsCisJCQkJT1BFTkFJU19DU0lEX0xFTik7CisJCWlmICghbmluZm8pIHsKKwkJCW5pbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZV9pbmZvKSk7CisJCQlpZiAoIW5pbmZvKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIHsKKwkJCQluaW5mby0+bm9kZWlkID0gbWVtYmVyX2xpc3RbaV0ubm9kZWlkOworCQkJCWRtX2hhc2hfaW5zZXJ0X2JpbmFyeShub2RlX2hhc2gsCisJCQkJCQkoY2hhciAqKSZuaW5mby0+bm9kZWlkLAorCQkJCQkJT1BFTkFJU19DU0lEX0xFTiwgbmluZm8pOworCQkJfQorCQl9CisJCW5pbmZvLT5zdGF0ZSA9IE5PREVfQ0xWTUQ7CisJfQorCisJbnVtX25vZGVzID0gbWVtYmVyX2xpc3RfZW50cmllczsKK30KKworc3RhdGljIGludCBsY2tfZGlzcGF0Y2goc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYsIGludCBsZW4sCisJCQljb25zdCBjaGFyICpjc2lkLCBzdHJ1Y3QgbG9jYWxfY2xpZW50ICoqbmV3X2NsaWVudCkKK3sKKwkqbmV3X2NsaWVudCA9IE5VTEw7CisJc2FMY2tEaXNwYXRjaChsY2tfaGFuZGxlLCBTQV9ESVNQQVRDSF9PTkUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbml0X2NsdXN0ZXIodm9pZCkKK3sKKwlTYUFpc0Vycm9yVCBlcnI7CisJU2FWZXJzaW9uVCAgdmVyID0geyAnQicsIDEsIDEgfTsKKwlpbnQgc2VsZWN0X2ZkOworCisJbm9kZV9oYXNoID0gZG1faGFzaF9jcmVhdGUoMTAwKTsKKwlsb2NrX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMCk7CisKKwllcnIgPSBjcGdfaW5pdGlhbGl6ZSgmY3BnX2hhbmRsZSwKKwkJCSAgICAgJm9wZW5haXNfY3BnX2NhbGxiYWNrcyk7CisJaWYgKGVyciAhPSBTQV9BSVNfT0spIHsKKwkJc3lzbG9nKExPR19FUlIsICJDYW5ub3QgaW5pdGlhbGlzZSBPcGVuQUlTIENQRyBzZXJ2aWNlOiAlZCIsCisJCSAgICAgICBlcnIpOworCQlERUJVR0xPRygiQ2Fubm90IGluaXRpYWxpc2UgT3BlbkFJUyBDUEcgc2VydmljZTogJWQiLCBlcnIpOworCQlyZXR1cm4gYWlzX3RvX2Vycm5vKGVycik7CisJfQorCisJZXJyID0gc2FMY2tJbml0aWFsaXplKCZsY2tfaGFuZGxlLAorCQkJCQlOVUxMLAorCQkJICAgICAgJnZlcik7CisJaWYgKGVyciAhPSBTQV9BSVNfT0spIHsKKwkJY3BnX2luaXRpYWxpemUoJmNwZ19oYW5kbGUsICZvcGVuYWlzX2NwZ19jYWxsYmFja3MpOworCQlzeXNsb2coTE9HX0VSUiwgIkNhbm5vdCBpbml0aWFsaXNlIE9wZW5BSVMgbG9jayBzZXJ2aWNlOiAlZCIsCisJCSAgICAgICBlcnIpOworCQlERUJVR0xPRygiQ2Fubm90IGluaXRpYWxpc2UgT3BlbkFJUyBsb2NrIHNlcnZpY2U6ICVkXG5cbiIsIGVycik7CisJCXJldHVybiBhaXNfdG9fZXJybm8oZXJyKTsKKwl9CisKKwkvKiBDb25uZWN0IHRvIHRoZSBjbHZtZCBncm91cCAqLworCXN0cmNweSgoY2hhciAqKWNwZ19ncm91cF9uYW1lLnZhbHVlLCAiY2x2bWQiKTsKKwljcGdfZ3JvdXBfbmFtZS5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKiljcGdfZ3JvdXBfbmFtZS52YWx1ZSk7CisJZXJyID0gY3BnX2pvaW4oY3BnX2hhbmRsZSwgJmNwZ19ncm91cF9uYW1lKTsKKwlpZiAoZXJyICE9IFNBX0FJU19PSykgeworCQljcGdfZmluYWxpemUoY3BnX2hhbmRsZSk7CisJCXNhTGNrRmluYWxpemUobGNrX2hhbmRsZSk7CisJCXN5c2xvZyhMT0dfRVJSLCAiQ2Fubm90IGpvaW4gY2x2bWQgcHJvY2VzcyBncm91cCIpOworCQlERUJVR0xPRygiQ2Fubm90IGpvaW4gY2x2bWQgcHJvY2VzcyBncm91cDogJWRcbiIsIGVycik7CisJCXJldHVybiBhaXNfdG9fZXJybm8oZXJyKTsKKwl9CisKKwllcnIgPSBjcGdfbG9jYWxfZ2V0KGNwZ19oYW5kbGUsCisJCQkgICAgJm91cl9ub2RlaWQpOworCWlmIChlcnIgIT0gU0FfQUlTX09LKSB7CisJCWNwZ19maW5hbGl6ZShjcGdfaGFuZGxlKTsKKwkJc2FMY2tGaW5hbGl6ZShsY2tfaGFuZGxlKTsKKwkJc3lzbG9nKExPR19FUlIsICJDYW5ub3QgZ2V0IGxvY2FsIG5vZGUgaWRcbiIpOworCQlyZXR1cm4gYWlzX3RvX2Vycm5vKGVycik7CisJfQorCURFQlVHTE9HKCJPdXIgbG9jYWwgbm9kZSBpZCBpcyAlZFxuIiwgb3VyX25vZGVpZCk7CisKKwlzYUxja1NlbGVjdGlvbk9iamVjdEdldChsY2tfaGFuZGxlLCAoU2FTZWxlY3Rpb25PYmplY3RUICopJnNlbGVjdF9mZCk7CisJYWRkX2ludGVybmFsX2NsaWVudChzZWxlY3RfZmQsIGxja19kaXNwYXRjaCk7CisKKwlERUJVR0xPRygiQ29ubmVjdGVkIHRvIE9wZW5BSVNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9jbHVzdGVyX2Nsb3NlZG93bih2b2lkKQoreworCXNhTGNrRmluYWxpemUobGNrX2hhbmRsZSk7CisJY3BnX2ZpbmFsaXplKGNwZ19oYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBfZ2V0X291cl9jc2lkKGNoYXIgKmNzaWQpCit7CisJbWVtY3B5KGNzaWQsICZvdXJfbm9kZWlkLCBzaXplb2YoaW50KSk7Cit9CisKKy8qIE9wZW5BSVMgZG9lc24ndCByZWFsbHkgaGF2ZSBubW9kZSBuYW1lcyBzbyB3ZQorICAganVzdCB1c2UgdGhlIG5vZGUgSUQgaW4gaGV4IGluc3RlYWQgKi8KK3N0YXRpYyBpbnQgX2NzaWRfZnJvbV9uYW1lKGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IG5vZGVpZDsKKwlzdHJ1Y3Qgbm9kZV9pbmZvICpuaW5mbzsKKworCWlmIChzc2NhbmYobmFtZSwgIiV4IiwgJm5vZGVpZCkgPT0gMSkgeworCQluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsIGNzaWQsIE9QRU5BSVNfQ1NJRF9MRU4pOworCQlpZiAobmluZm8pCisJCQlyZXR1cm4gbm9kZWlkOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX25hbWVfZnJvbV9jc2lkKGNvbnN0IGNoYXIgKmNzaWQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5vZGVfaW5mbyAqbmluZm87CisKKwluaW5mbyA9IGRtX2hhc2hfbG9va3VwX2JpbmFyeShub2RlX2hhc2gsIGNzaWQsIE9QRU5BSVNfQ1NJRF9MRU4pOworCWlmICghbmluZm8pCisJeworCQlzcHJpbnRmKG5hbWUsICJVTktOT1dOICVzIiwgcHJpbnRfb3BlbmFpc19jc2lkKGNzaWQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwcmludGYobmFtZSwgIiV4IiwgbmluZm8tPm5vZGVpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9udW1fbm9kZXMoKQoreworCURFQlVHTE9HKCJudW1fbm9kZXMgPSAlZFxuIiwgbnVtX25vZGVzKTsKKwlyZXR1cm4gbnVtX25vZGVzOworfQorCisvKiBOb2RlIGlzIG5vdyBrbm93biB0byBiZSBydW5uaW5nIGEgY2x2bWQgKi8KK3N0YXRpYyB2b2lkIF9hZGRfdXBfbm9kZShjb25zdCBjaGFyICpjc2lkKQoreworCXN0cnVjdCBub2RlX2luZm8gKm5pbmZvOworCisJbmluZm8gPSBkbV9oYXNoX2xvb2t1cF9iaW5hcnkobm9kZV9oYXNoLCBjc2lkLCBPUEVOQUlTX0NTSURfTEVOKTsKKwlpZiAoIW5pbmZvKSB7CisJCURFQlVHTE9HKCJvcGVuYWlzX2FkZF91cF9ub2RlIG5vIG5vZGVfaGFzaCBlbnRyeSBmb3IgY3NpZCAlc1xuIiwKKwkJCSBwcmludF9vcGVuYWlzX2NzaWQoY3NpZCkpOworCQlyZXR1cm47CisJfQorCisJREVCVUdMT0coIm9wZW5haXNfYWRkX3VwX25vZGUgJWRcbiIsIG5pbmZvLT5ub2RlaWQpOworCisJbmluZm8tPnN0YXRlID0gTk9ERV9DTFZNRDsKKworCXJldHVybjsKK30KKworLyogQ2FsbCBhIGNhbGxiYWNrIGZvciBlYWNoIG5vZGUsIHNvIHRoZSBjYWxsZXIga25vd3Mgd2hldGhlciBpdCdzIHVwIG9yIGRvd24gKi8KK3N0YXRpYyBpbnQgX2NsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayhzdHJ1Y3QgbG9jYWxfY2xpZW50ICptYXN0ZXJfY2xpZW50LAorCQkJCSAgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgbG9jYWxfY2xpZW50ICosCisJCQkJCQkgICAgICBjb25zdCBjaGFyICpjc2lkLCBpbnQgbm9kZV91cCkpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqaG47CisJc3RydWN0IG5vZGVfaW5mbyAqbmluZm87CisJaW50IHNvbWVkb3duID0gMDsKKworCWRtX2hhc2hfaXRlcmF0ZShobiwgbm9kZV9oYXNoKQorCXsKKwkJY2hhciBjc2lkW09QRU5BSVNfQ1NJRF9MRU5dOworCisJCW5pbmZvID0gZG1faGFzaF9nZXRfZGF0YShub2RlX2hhc2gsIGhuKTsKKwkJbWVtY3B5KGNzaWQsIGRtX2hhc2hfZ2V0X2tleShub2RlX2hhc2gsIGhuKSwgT1BFTkFJU19DU0lEX0xFTik7CisKKwkJREVCVUdMT0coImRvd25fY2FsbGJhY2suIG5vZGUgJWQsIHN0YXRlID0gJWRcbiIsIG5pbmZvLT5ub2RlaWQsCisJCQkgbmluZm8tPnN0YXRlKTsKKworCQlpZiAobmluZm8tPnN0YXRlICE9IE5PREVfRE9XTikKKwkJCWNhbGxiYWNrKG1hc3Rlcl9jbGllbnQsIGNzaWQsIG5pbmZvLT5zdGF0ZSA9PSBOT0RFX0NMVk1EKTsKKwkJaWYgKG5pbmZvLT5zdGF0ZSAhPSBOT0RFX0NMVk1EKQorCQkJc29tZWRvd24gPSAtMTsKKwl9CisJcmV0dXJuIHNvbWVkb3duOworfQorCisvKiBSZWFsIGxvY2tpbmcgKi8KK3N0YXRpYyBpbnQgX2xvY2tfcmVzb3VyY2UoY2hhciAqcmVzb3VyY2UsIGludCBtb2RlLCBpbnQgZmxhZ3MsIGludCAqbG9ja2lkKQoreworCXN0cnVjdCBsb2NrX2luZm8gKmxpbmZvOworCVNhTGNrUmVzb3VyY2VIYW5kbGVUIHJlc19oYW5kbGU7CisJU2FBaXNFcnJvclQgZXJyOworCVNhTGNrTG9ja0lkVCBsb2NrX2lkOworCVNhTGNrTG9ja1N0YXR1c1QgbG9ja1N0YXR1czsKKworCS8qIFRoaXMgbmVlZHMgdG8gYmUgY29udmVydGVkIGZyb20gRExNL0xWTTIgdmFsdWUgZm9yIE9wZW5BSVMgTENLICovCisJaWYgKGZsYWdzICYgTENLX05PTkJMT0NLKSBmbGFncyA9IFNBX0xDS19MT0NLX05PX1FVRVVFOworCisJbGluZm8gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NrX2luZm8pKTsKKwlpZiAoIWxpbmZvKQorCQlyZXR1cm4gLTE7CisKKwlERUJVR0xPRygibG9ja19yZXNvdXJjZSAnJXMnLCBmbGFncz0lZCwgbW9kZT0lZFxuIiwgcmVzb3VyY2UsIGZsYWdzLCBtb2RlKTsKKworCWxpbmZvLT5sb2NrX25hbWUubGVuZ3RoID0gc3RybGVuKHJlc291cmNlKSsxOworCXN0cmNweSgoY2hhciAqKWxpbmZvLT5sb2NrX25hbWUudmFsdWUsIHJlc291cmNlKTsKKworCWVyciA9IHNhTGNrUmVzb3VyY2VPcGVuKGxja19oYW5kbGUsICZsaW5mby0+bG9ja19uYW1lLAorCQkJCVNBX0xDS19SRVNPVVJDRV9DUkVBVEUsIFRJTUVPVVQsICZyZXNfaGFuZGxlKTsKKwlpZiAoZXJyICE9IFNBX0FJU19PSykKKwl7CisJCURFQlVHTE9HKCJSZXNvdXJjZU9wZW4gcmV0dXJuZWQgJWRcbiIsIGVycik7CisJCWZyZWUobGluZm8pOworCQlyZXR1cm4gYWlzX3RvX2Vycm5vKGVycik7CisJfQorCisJZXJyID0gc2FMY2tSZXNvdXJjZUxvY2soCisJCQlyZXNfaGFuZGxlLAorCQkJJmxvY2tfaWQsCisJCQltb2RlLAorCQkJZmxhZ3MsCisJCQkwLAorCQkJU0FfVElNRV9FTkQsCisJCQkmbG9ja1N0YXR1cyk7CisJaWYgKGVyciAhPSBTQV9BSVNfT0sgJiYgbG9ja1N0YXR1cyAhPSBTQV9MQ0tfTE9DS19HUkFOVEVEKQorCXsKKwkJZnJlZShsaW5mbyk7CisJCXNhTGNrUmVzb3VyY2VDbG9zZShyZXNfaGFuZGxlKTsKKwkJcmV0dXJuIGFpc190b19lcnJubyhlcnIpOworCX0KKworCS8qIFdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisKKwlERUJVR0xPRygibG9ja19yZXNvdXJjZSByZXR1cm5pbmcgJWQsIGxvY2tfaWQ9JSIgUFJJeDY0ICJcbiIsCisJCSBlcnIsIGxvY2tfaWQpOworCisJbGluZm8tPmxvY2tfaWQgPSBsb2NrX2lkOworCWxpbmZvLT5yZXNfaGFuZGxlID0gcmVzX2hhbmRsZTsKKworCWRtX2hhc2hfaW5zZXJ0KGxvY2tfaGFzaCwgcmVzb3VyY2UsIGxpbmZvKTsKKworCXJldHVybiBhaXNfdG9fZXJybm8oZXJyKTsKK30KKworCitzdGF0aWMgaW50IF91bmxvY2tfcmVzb3VyY2UoY2hhciAqcmVzb3VyY2UsIGludCBsb2NraWQpCit7CisJU2FBaXNFcnJvclQgZXJyOworCXN0cnVjdCBsb2NrX2luZm8gKmxpbmZvOworCisJREVCVUdMT0coInVubG9ja19yZXNvdXJjZSAlc1xuIiwgcmVzb3VyY2UpOworCWxpbmZvID0gZG1faGFzaF9sb29rdXAobG9ja19oYXNoLCByZXNvdXJjZSk7CisJaWYgKCFsaW5mbykKKwkJcmV0dXJuIDA7CisKKwlERUJVR0xPRygidW5sb2NrX3Jlc291cmNlOiBsb2NraWQ6ICUiIFBSSXg2NCAiXG4iLCBsaW5mby0+bG9ja19pZCk7CisJZXJyID0gc2FMY2tSZXNvdXJjZVVubG9jayhsaW5mby0+bG9ja19pZCwgU0FfVElNRV9FTkQpOworCWlmIChlcnIgIT0gU0FfQUlTX09LKQorCXsKKwkJREVCVUdMT0coIlVubG9jayByZXR1cm5lZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGFpc190b19lcnJubyhlcnIpOworCX0KKworCS8qIFJlbGVhc2UgdGhlIHJlc291cmNlICovCisJZG1faGFzaF9yZW1vdmUobG9ja19oYXNoLCByZXNvdXJjZSk7CisJc2FMY2tSZXNvdXJjZUNsb3NlKGxpbmZvLT5yZXNfaGFuZGxlKTsKKwlmcmVlKGxpbmZvKTsKKworCXJldHVybiBhaXNfdG9fZXJybm8oZXJyKTsKK30KKworc3RhdGljIGludCBfc3luY19sb2NrKGNvbnN0IGNoYXIgKnJlc291cmNlLCBpbnQgbW9kZSwgaW50IGZsYWdzLCBpbnQgKmxvY2tpZCkKK3sKKwlpbnQgc3RhdHVzOworCWNoYXIgbG9jazFbc3RybGVuKHJlc291cmNlKSszXTsKKwljaGFyIGxvY2syW3N0cmxlbihyZXNvdXJjZSkrM107CisKKwlzbnByaW50Zihsb2NrMSwgc2l6ZW9mKGxvY2sxKSwgIiVzLTEiLCByZXNvdXJjZSk7CisJc25wcmludGYobG9jazIsIHNpemVvZihsb2NrMiksICIlcy0yIiwgcmVzb3VyY2UpOworCisJc3dpdGNoIChtb2RlKQorCXsKKwljYXNlIExDS19FWENMOgorCQlzdGF0dXMgPSBfbG9ja19yZXNvdXJjZShsb2NrMSwgU0FfTENLX0VYX0xPQ0tfTU9ERSwgZmxhZ3MsIGxvY2tpZCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKworCQkvKiBJZiB3ZSBjYW4ndCBnZXQgdGhpcyBsb2NrIHRvbyB0aGVuIGJhaWwgb3V0ICovCisJCXN0YXR1cyA9IF9sb2NrX3Jlc291cmNlKGxvY2syLCBTQV9MQ0tfRVhfTE9DS19NT0RFLCBMQ0tfTk9OQkxPQ0ssCisJCQkJCWxvY2tpZCk7CisJCWlmIChzdGF0dXMgPT0gU0FfTENLX0xPQ0tfTk9UX1FVRVVFRCkKKwkJeworCQkJX3VubG9ja19yZXNvdXJjZShsb2NrMSwgKmxvY2tpZCk7CisJCQlzdGF0dXMgPSAtMTsKKwkJCWVycm5vID0gRUFHQUlOOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQ0tfUFJFQUQ6CisJY2FzZSBMQ0tfUkVBRDoKKwkJc3RhdHVzID0gX2xvY2tfcmVzb3VyY2UobG9jazEsIFNBX0xDS19QUl9MT0NLX01PREUsIGZsYWdzLCBsb2NraWQpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJCV91bmxvY2tfcmVzb3VyY2UobG9jazIsICpsb2NraWQpOworCQlicmVhazsKKworCWNhc2UgTENLX1dSSVRFOgorCQlzdGF0dXMgPSBfbG9ja19yZXNvdXJjZShsb2NrMiwgU0FfTENLX0VYX0xPQ0tfTU9ERSwgZmxhZ3MsIGxvY2tpZCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwkJX3VubG9ja19yZXNvdXJjZShsb2NrMSwgKmxvY2tpZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLTE7CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKwl9CitvdXQ6CisJKmxvY2tpZCA9IG1vZGU7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfc3luY191bmxvY2soY29uc3QgY2hhciAqcmVzb3VyY2UsIGludCBsb2NraWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciBsb2NrMVtzdHJsZW4ocmVzb3VyY2UpKzNdOworCWNoYXIgbG9jazJbc3RybGVuKHJlc291cmNlKSszXTsKKworCXNucHJpbnRmKGxvY2sxLCBzaXplb2YobG9jazEpLCAiJXMtMSIsIHJlc291cmNlKTsKKwlzbnByaW50Zihsb2NrMiwgc2l6ZW9mKGxvY2syKSwgIiVzLTIiLCByZXNvdXJjZSk7CisKKwlfdW5sb2NrX3Jlc291cmNlKGxvY2sxLCBsb2NraWQpOworCV91bmxvY2tfcmVzb3VyY2UobG9jazIsIGxvY2tpZCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBXZSBhcmUgYWx3YXlzIHF1b3JhdGUgISAqLworc3RhdGljIGludCBfaXNfcXVvcmF0ZSgpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9tYWluX2NsdXN0ZXJfZmQodm9pZCkKK3sKKwlpbnQgc2VsZWN0X2ZkOworCisJY3BnX2ZkX2dldChjcGdfaGFuZGxlLCAmc2VsZWN0X2ZkKTsKKwlyZXR1cm4gc2VsZWN0X2ZkOworfQorCitzdGF0aWMgaW50IF9jbHVzdGVyX2ZkX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKmZkLCBjaGFyICpidWYsIGludCBsZW4sCisJCQkJY29uc3QgY2hhciAqY3NpZCwKKwkJCQlzdHJ1Y3QgbG9jYWxfY2xpZW50ICoqbmV3X2NsaWVudCkKK3sKKwljbHVzdGVyX2NsaWVudCA9IGZkOworCSpuZXdfY2xpZW50ID0gTlVMTDsKKwljcGdfZGlzcGF0Y2goY3BnX2hhbmRsZSwgU0FfRElTUEFUQ0hfT05FKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2x1c3Rlcl9zZW5kX21lc3NhZ2UoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbXNnbGVuLCBjb25zdCBjaGFyICpjc2lkLAorCQkJCSBjb25zdCBjaGFyICplcnJ0ZXh0KQoreworCXN0cnVjdCBpb3ZlYyBpb3ZbMl07CisJU2FBaXNFcnJvclQgZXJyOworCWludCB0YXJnZXRfbm9kZTsKKworCWlmIChjc2lkKQorCQltZW1jcHkoJnRhcmdldF9ub2RlLCBjc2lkLCBPUEVOQUlTX0NTSURfTEVOKTsKKwllbHNlCisJCXRhcmdldF9ub2RlID0gMDsKKworCWlvdlswXS5pb3ZfYmFzZSA9ICZ0YXJnZXRfbm9kZTsKKwlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihpbnQpOworCWlvdlsxXS5pb3ZfYmFzZSA9IChjaGFyICopYnVmOworCWlvdlsxXS5pb3ZfbGVuID0gbXNnbGVuOworCisJZXJyID0gY3BnX21jYXN0X2pvaW5lZChjcGdfaGFuZGxlLCBDUEdfVFlQRV9BR1JFRUQsIGlvdiwgMik7CisJcmV0dXJuIGFpc190b19lcnJubyhlcnIpOworfQorCisvKiBXZSBkb24ndCBoYXZlIGEgY2x1c3RlciBuYW1lIHRvIHJlcG9ydCBoZXJlICovCitzdGF0aWMgaW50IF9nZXRfY2x1c3Rlcl9uYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdHJuY3B5KGJ1ZiwgIk9wZW5BSVMiLCBidWZsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsdXN0ZXJfb3BzIF9jbHVzdGVyX29wZW5haXNfb3BzID0geworCS5uYW1lICAgICAgICAgICAgICAgICAgICAgPSAib3BlbmFpcyIsCisJLmNsdXN0ZXJfaW5pdF9jb21wbGV0ZWQgICA9IE5VTEwsCisJLmNsdXN0ZXJfc2VuZF9tZXNzYWdlICAgICA9IF9jbHVzdGVyX3NlbmRfbWVzc2FnZSwKKwkubmFtZV9mcm9tX2NzaWQgICAgICAgICAgID0gX25hbWVfZnJvbV9jc2lkLAorCS5jc2lkX2Zyb21fbmFtZSAgICAgICAgICAgPSBfY3NpZF9mcm9tX25hbWUsCisJLmdldF9udW1fbm9kZXMgICAgICAgICAgICA9IF9nZXRfbnVtX25vZGVzLAorCS5jbHVzdGVyX2ZkX2NhbGxiYWNrICAgICAgPSBfY2x1c3Rlcl9mZF9jYWxsYmFjaywKKwkuZ2V0X21haW5fY2x1c3Rlcl9mZCAgICAgID0gX2dldF9tYWluX2NsdXN0ZXJfZmQsCisJLmNsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayA9IF9jbHVzdGVyX2RvX25vZGVfY2FsbGJhY2ssCisJLmlzX3F1b3JhdGUgICAgICAgICAgICAgICA9IF9pc19xdW9yYXRlLAorCS5nZXRfb3VyX2NzaWQgICAgICAgICAgICAgPSBfZ2V0X291cl9jc2lkLAorCS5hZGRfdXBfbm9kZSAgICAgICAgICAgICAgPSBfYWRkX3VwX25vZGUsCisJLnJlcmVhZF9jb25maWcgICAgICAgICAgICA9IE5VTEwsCisJLmNsdXN0ZXJfY2xvc2Vkb3duICAgICAgICA9IF9jbHVzdGVyX2Nsb3NlZG93biwKKwkuZ2V0X2NsdXN0ZXJfbmFtZSAgICAgICAgID0gX2dldF9jbHVzdGVyX25hbWUsCisJLnN5bmNfbG9jayAgICAgICAgICAgICAgICA9IF9zeW5jX2xvY2ssCisJLnN5bmNfdW5sb2NrICAgICAgICAgICAgICA9IF9zeW5jX3VubG9jaywKK307CisKK3N0cnVjdCBjbHVzdGVyX29wcyAqaW5pdF9vcGVuYWlzX2NsdXN0ZXIodm9pZCkKK3sKKwlpZiAoIV9pbml0X2NsdXN0ZXIoKSkKKwkJcmV0dXJuICZfY2x1c3Rlcl9vcGVuYWlzX29wczsKKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC9jbHZtZC1zaW5nbGVub2RlLmMgYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLXNpbmdsZW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBhNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbHZtZC9jbHZtZC1zaW5nbGVub2RlLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY2x2bWQtY29tbW9uLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAiY2x2bS5oIgorI2luY2x1ZGUgImNsdm1kLWNvbW1zLmgiCisjaW5jbHVkZSAiY2x2bWQuaCIKKworI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBTSU5HTEVOT0RFX0NMVk1EX1NPQ0tOQU1FW10gPSBERUZBVUxUX1JVTl9ESVIgIi9jbHZtZF9zaW5nbGVub2RlLnNvY2siOworc3RhdGljIGludCBsaXN0ZW5fZmQgPSAtMTsKKworc3RhdGljIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpfbG9ja3M7CitzdGF0aWMgaW50IF9sb2NraWQ7CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgX2xvY2tfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworLyogVXNpbmcgb25lIGNvbW1vbiBjb25kaXRpb24gZm9yIGFsbCBsb2NrcyBmb3Igc2ltcGxpY2l0eSAqLworc3RhdGljIHB0aHJlYWRfY29uZF90IF9sb2NrX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CisKK3N0cnVjdCBsb2NrIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWludCBsb2NraWQ7CisJaW50IG1vZGU7Cit9OworCitzdGF0aWMgdm9pZCBjbG9zZV9jb21tcyh2b2lkKQoreworCWlmIChsaXN0ZW5fZmQgIT0gLTEgJiYgY2xvc2UobGlzdGVuX2ZkKSkKKwkJc3RhY2s7CisJKHZvaWQpdW5saW5rKFNJTkdMRU5PREVfQ0xWTURfU09DS05BTUUpOworCWxpc3Rlbl9mZCA9IC0xOworfQorCitzdGF0aWMgaW50IGluaXRfY29tbXModm9pZCkKK3sKKwltb2RlX3Qgb2xkX21hc2s7CisJc3RydWN0IHNvY2thZGRyX3VuIGFkZHIgPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OworCisJaWYgKCFkbV9zdHJuY3B5KGFkZHIuc3VuX3BhdGgsIFNJTkdMRU5PREVfQ0xWTURfU09DS05BTUUsCisJCQlzaXplb2YoYWRkci5zdW5fcGF0aCkpKSB7CisJCURFQlVHTE9HKCIlczogc2luZ2xlbm9kZSBzb2NrZXQgbmFtZSB0b28gbG9uZy4iLAorCQkJIFNJTkdMRU5PREVfQ0xWTURfU09DS05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2xvc2VfY29tbXMoKTsKKworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChTSU5HTEVOT0RFX0NMVk1EX1NPQ0tOQU1FLCBTX0lGU09DSyk7CisJb2xkX21hc2sgPSB1bWFzaygwMDc3KTsKKworCWxpc3Rlbl9mZCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKGxpc3Rlbl9mZCA8IDApIHsKKwkJREVCVUdMT0coIkNhbid0IGNyZWF0ZSBsb2NhbCBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBTZXQgQ2xvc2Utb24tZXhlYyAqLworCWlmIChmY250bChsaXN0ZW5fZmQsIEZfU0VURkQsIDEpKSB7CisJCURFQlVHTE9HKCJTZXR0aW5nIENMT0VYRUMgb24gY2xpZW50IGZkIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGJpbmQobGlzdGVuX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCURFQlVHTE9HKCJDYW4ndCBiaW5kIGxvY2FsIHNvY2tldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChsaXN0ZW4obGlzdGVuX2ZkLCAxMCkgPCAwKSB7CisJCURFQlVHTE9HKCJDYW4ndCBsaXN0ZW4gbG9jYWwgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl1bWFzayhvbGRfbWFzayk7CisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCXJldHVybiAwOworZXJyb3I6CisJdW1hc2sob2xkX21hc2spOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKwljbG9zZV9jb21tcygpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfaW5pdF9jbHVzdGVyKHZvaWQpCit7CisJaW50IHI7CisKKwlpZiAoIShfbG9ja3MgPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkgeworCQlERUJVR0xPRygiRmFpbGVkIHRvIGFsbG9jYXRlIHNpbmdsZS1ub2RlIGhhc2ggdGFibGUuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJciA9IGluaXRfY29tbXMoKTsKKwlpZiAocikgeworCQlkbV9oYXNoX2Rlc3Ryb3koX2xvY2tzKTsKKwkJX2xvY2tzID0gTlVMTDsKKwkJcmV0dXJuIHI7CisJfQorCisJREVCVUdMT0coIlNpbmdsZS1ub2RlIGNsdXN0ZXIgaW5pdGlhbGlzZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2NsdXN0ZXJfY2xvc2Vkb3duKHZvaWQpCit7CisJY2xvc2VfY29tbXMoKTsKKworCS8qIElmIHRoZXJlIGlzIGFueSBhd2FpdGVkIHJlc291cmNlLCBraWxsIGl0IHNvZnRseSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX2xvY2tfbXV0ZXgpOworCWRtX2hhc2hfZGVzdHJveShfbG9ja3MpOworCV9sb2NrcyA9IE5VTEw7CisJX2xvY2tpZCA9IDA7CisJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmX2xvY2tfY29uZCk7IC8qIHdha2V1cCB3YWl0ZXJzICovCisJcHRocmVhZF9tdXRleF91bmxvY2soJl9sb2NrX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgX2dldF9vdXJfY3NpZChjaGFyICpjc2lkKQoreworCWludCBub2RlaWQgPSAxOworCW1lbWNweShjc2lkLCAmbm9kZWlkLCBzaXplb2YoaW50KSk7Cit9CisKK3N0YXRpYyBpbnQgX2NzaWRfZnJvbV9uYW1lKGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX25hbWVfZnJvbV9jc2lkKGNvbnN0IGNoYXIgKmNzaWQsIGNoYXIgKm5hbWUpCit7CisJc3RyY3B5KG5hbWUsICJTSU5HTEVOT0RFIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9udW1fbm9kZXModm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworLyogTm9kZSBpcyBub3cga25vd24gdG8gYmUgcnVubmluZyBhIGNsdm1kICovCitzdGF0aWMgdm9pZCBfYWRkX3VwX25vZGUoY29uc3QgY2hhciAqY3NpZCkKK3sKK30KKworLyogQ2FsbCBhIGNhbGxiYWNrIGZvciBlYWNoIG5vZGUsIHNvIHRoZSBjYWxsZXIga25vd3Mgd2hldGhlciBpdCdzIHVwIG9yIGRvd24gKi8KK3N0YXRpYyBpbnQgX2NsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayhzdHJ1Y3QgbG9jYWxfY2xpZW50ICptYXN0ZXJfY2xpZW50LAorCQkJCSAgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgbG9jYWxfY2xpZW50ICosCisJCQkJICAgICBjb25zdCBjaGFyICpjc2lkLCBpbnQgbm9kZV91cCkpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBfbG9ja19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVpbnQzMl90IGZsYWdzKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRfbW9kZShpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIExDS19OVUxMOiByZXR1cm4gIk5VTEwiOworCWNhc2UgTENLX1JFQUQ6IHJldHVybiAiUkVBRCI7CisJY2FzZSBMQ0tfUFJFQUQ6IHJldHVybiAiUFJFQUQiOworCWNhc2UgTENLX1dSSVRFOiByZXR1cm4gIldSSVRFIjsKKwljYXNlIExDS19FWENMOiByZXR1cm4gIkVYQ0xVU0lWRSI7CisJY2FzZSBMQ0tfVU5MT0NLOiByZXR1cm4gIlVOTE9DSyI7CisJZGVmYXVsdDogcmV0dXJuICI/Pz8/IjsKKwl9Cit9CisKKy8qIFJlYWwgbG9ja2luZyAqLworc3RhdGljIGludCBfbG9ja19yZXNvdXJjZShjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50IG1vZGUsIGludCBmbGFncywgaW50ICpsb2NraWQpCit7CisJLyogRExNIHRhYmxlIG9mIGFsbG93ZWQgdHJhbnNpdGlvbiBzdGF0ZXMgKi8KKwlzdGF0aWMgY29uc3QgaW50IF9kbG1fdGFibGVbNl1bNl0gPSB7CisJLyogTW9kZQkgICBOTAlDUglDVwlQUglQVwlFWCAqLworCS8qIE5MICovIHsgMSwJIDEsCSAxLAkgMSwJIDEsCSAxfSwKKwkvKiBDUiAqLyB7IDEsCSAxLAkgMSwJIDEsCSAxLAkgMH0sCisJLyogQ1cgKi8geyAxLAkgMSwJIDEsCSAwLAkgMCwJIDB9LAorCS8qIFBSICovIHsgMSwJIDEsCSAwLAkgMSwJIDAsCSAwfSwKKwkvKiBQVyAqLyB7IDEsCSAxLAkgMCwJIDAsCSAwLAkgMH0sCisJLyogRVggKi8geyAxLAkgMCwJIDAsCSAwLAkgMCwJIDB9CisJfTsKKworCXN0cnVjdCBsb2NrICpsY2sgPSBOVUxMLCAqbGNrdDsKKwlzdHJ1Y3QgZG1fbGlzdCAqaGVhZDsKKworCURFQlVHTE9HKCJMb2NraW5nIHJlc291cmNlICVzLCBmbGFncz0weCUwMnggKCVzJXMlcyksIG1vZGU9JXMgKCVkKVxuIiwKKwkJIHJlc291cmNlLCBmbGFncywKKwkJIChmbGFncyAmIExDS0ZfTk9RVUVVRSkgPyAiTk9RVUVVRSIgOiAiIiwKKwkJICgoZmxhZ3MgJiAoTENLRl9OT1FVRVVFIHwgTENLRl9DT05WRVJUKSkgPT0KKwkJICAoTENLRl9OT1FVRVVFIHwgTENLRl9DT05WRVJUKSkgPyAifCIgOiAiIiwKKwkJIChmbGFncyAmIExDS0ZfQ09OVkVSVCkgPyAiQ09OVkVSVCIgOiAiIiwKKwkJIF9nZXRfbW9kZShtb2RlKSwgbW9kZSk7CisKKwltb2RlICY9IExDS19UWVBFX01BU0s7CisJcHRocmVhZF9tdXRleF9sb2NrKCZfbG9ja19tdXRleCk7CisKK3JldHJ5OgorCWlmICghKGhlYWQgPSBkbV9oYXNoX2xvb2t1cChfbG9ja3MsIHJlc291cmNlKSkpIHsKKwkJaWYgKGZsYWdzICYgTENLRl9DT05WRVJUKSB7CisJCQkvKiBJbiByZWFsIERMTSwgbG9jayBpcyBpZGVudGlmaWVkIG9ubHkgYnkgbG9ja2lkLCByZXNvdXJjZSBpcyBub3QgdXNlZCAqLworCQkJREVCVUdMT0coIlVubG9ja2VkIHJlc291cmNlICVzIGNhbm5vdCBiZSBjb252ZXJ0ZWRcbiIsIHJlc291cmNlKTsKKwkJCWdvdG9fYmFkOworCQl9CisJCS8qIEFkZCBuZXcgbG9ja2VkIHJlc291cmNlICovCisJCWlmICghKGhlYWQgPSBkbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbV9saXN0KSkpIHx8CisJCSAgICAhZG1faGFzaF9pbnNlcnQoX2xvY2tzLCByZXNvdXJjZSwgaGVhZCkpIHsKKwkJCWRtX2ZyZWUoaGVhZCk7CisJCQlnb3RvX2JhZDsKKwkJfQorCisJCWRtX2xpc3RfaW5pdChoZWFkKTsKKwl9IGVsc2UJLyogVXBkYXRlL2NvbnZlcnQgbG9ja2VkIHJlc291cmNlICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsY2ssIGhlYWQpIHsKKwkJCS8qIENoZWNrIGlzIGFsbCBsb2NrcyBhcmUgY29tcGF0aWJsZSB3aXRoIHJlcXVlc3RlZCBsb2NrICovCisJCQlpZiAoZmxhZ3MgJiBMQ0tGX0NPTlZFUlQpIHsKKwkJCQlpZiAobGNrLT5sb2NraWQgIT0gKmxvY2tpZCkKKwkJCQkJY29udGludWU7CisKKwkJCQlERUJVR0xPRygiQ29udmVydGluZyByZXNvdXJjZSAlcyBsb2NraWQ9JWQgbW9kZTolcyAtPiAlcy4uLlxuIiwKKwkJCQkJIHJlc291cmNlLCBsY2stPmxvY2tpZCwgX2dldF9tb2RlKGxjay0+bW9kZSksIF9nZXRfbW9kZShtb2RlKSk7CisJCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxja3QsIGhlYWQpIHsKKwkJCQkJaWYgKChsY2t0LT5sb2NraWQgIT0gKmxvY2tpZCkgJiYKKwkJCQkJICAgICFfZGxtX3RhYmxlW21vZGVdW2xja3QtPm1vZGVdKSB7CisJCQkJCQlpZiAoIShmbGFncyAmIExDS0ZfTk9RVUVVRSkgJiYKKwkJCQkJCSAgICAvKiBUT0RPOiBSZWFsIGRsbSB1c2VzIGhlcmUgY29udmVyc2lvbiBxdWV1ZXMgKi8KKwkJCQkJCSAgICAhcHRocmVhZF9jb25kX3dhaXQoJl9sb2NrX2NvbmQsICZfbG9ja19tdXRleCkgJiYKKwkJCQkJCSAgICBfbG9ja3MpIC8qIEVuZCBvZiB0aGUgZ2FtZT8gKi8KKwkJCQkJCQlnb3RvIHJldHJ5OworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQl9CisJCQkJbGNrLT5tb2RlID0gbW9kZTsgLyogTG9jayBpcyBub3cgY29udmVydGVkICovCisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKCFfZGxtX3RhYmxlW21vZGVdW2xjay0+bW9kZV0pIHsKKwkJCQlERUJVR0xPRygiUmVzb3VyY2UgJXMgYWxyZWFkeSBsb2NrZWQgbG9ja2lkPSVkLCBtb2RlOiVzXG4iLAorCQkJCQkgcmVzb3VyY2UsIGxjay0+bG9ja2lkLCBfZ2V0X21vZGUobGNrLT5tb2RlKSk7CisJCQkJaWYgKCEoZmxhZ3MgJiBMQ0tGX05PUVVFVUUpICYmCisJCQkJICAgICFwdGhyZWFkX2NvbmRfd2FpdCgmX2xvY2tfY29uZCwgJl9sb2NrX211dGV4KSAmJgorCQkJCSAgICBfbG9ja3MpIHsgLyogRW5kIG9mIHRoZSBnYW1lPyAqLworCQkJCQlERUJVR0xPRygiUmVzb3VyY2UgJXMgcmV0cnlpbmcgbG9jayBpbiBtb2RlOiVzLi4uXG4iLAorCQkJCQkJIHJlc291cmNlLCBfZ2V0X21vZGUobW9kZSkpOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0KKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCisJaWYgKCEoZmxhZ3MgJiBMQ0tGX0NPTlZFUlQpKSB7CisJCWlmICghKGxjayA9IGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IGxvY2spKSkpCisJCQlnb3RvX2JhZDsKKworCQkqbG9ja2lkID0gbGNrLT5sb2NraWQgPSArK19sb2NraWQ7CisJCWxjay0+bW9kZSA9IG1vZGU7CisJCWRtX2xpc3RfYWRkKGhlYWQsICZsY2stPmxpc3QpOworCX0KK291dDoKKwlwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZfbG9ja19jb25kKTsgLyogdG8gd2FrZXVwIHdhaXRlcnMgKi8KKwlwdGhyZWFkX211dGV4X3VubG9jaygmX2xvY2tfbXV0ZXgpOworCURFQlVHTE9HKCJMb2NrZWQgcmVzb3VyY2UgJXMsIGxvY2tpZD0lZCwgbW9kZT0lc1xuIiwKKwkJIHJlc291cmNlLCBsY2stPmxvY2tpZCwgX2dldF9tb2RlKGxjay0+bW9kZSkpOworCisJcmV0dXJuIDA7CitiYWQ6CisJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmX2xvY2tfY29uZCk7IC8qIHRvIHdha2V1cCB3YWl0ZXJzICovCisJcHRocmVhZF9tdXRleF91bmxvY2soJl9sb2NrX211dGV4KTsKKwlERUJVR0xPRygiRmFpbGVkIHRvIGxvY2sgcmVzb3VyY2UgJXNcbiIsIHJlc291cmNlKTsKKworCXJldHVybiAxOyAvKiBmYWlsICovCit9CisKK3N0YXRpYyBpbnQgX3VubG9ja19yZXNvdXJjZShjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50IGxvY2tpZCkKK3sKKwlzdHJ1Y3QgbG9jayAqbGNrOworCXN0cnVjdCBkbV9saXN0ICpoZWFkOworCWludCByID0gMTsKKworCWlmIChsb2NraWQgPCAwKSB7CisJCURFQlVHTE9HKCJOb3QgdHJhY2tpbmcgdW5sb2NrIG9mIGxvY2tpZCAtMTogJXMsIGxvY2tpZD0lZFxuIiwKKwkJCSByZXNvdXJjZSwgbG9ja2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJREVCVUdMT0coIlVubG9ja2luZyByZXNvdXJjZSAlcywgbG9ja2lkPSVkXG4iLCByZXNvdXJjZSwgbG9ja2lkKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJl9sb2NrX211dGV4KTsKKwlwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZfbG9ja19jb25kKTsgLyogd2FrZXVwIHdhaXRlcnMgKi8KKworCWlmICghKGhlYWQgPSBkbV9oYXNoX2xvb2t1cChfbG9ja3MsIHJlc291cmNlKSkpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJl9sb2NrX211dGV4KTsKKwkJREVCVUdMT0coIlJlc291cmNlICVzIGlzIG5vdCBsb2NrZWQuXG4iLCByZXNvdXJjZSk7CisJCXJldHVybiAxOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsY2ssIGhlYWQpCisJCWlmIChsY2stPmxvY2tpZCA9PSBsb2NraWQpIHsKKwkJCWRtX2xpc3RfZGVsKCZsY2stPmxpc3QpOworCQkJZG1fZnJlZShsY2spOworCQkJciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJREVCVUdMT0coIlJlc291cmNlICVzIGhhcyB3cm9uZyBsb2NraWQgJWQuXG4iLCByZXNvdXJjZSwgbG9ja2lkKTsKK291dDoKKwlpZiAoZG1fbGlzdF9lbXB0eShoZWFkKSkgeworCQkvL0RFQlVHTE9HKCJSZXNvdXJjZSAlcyBpcyBubyBsb25nZXIgaGFzaGVkIChsb2NraWQ9JWQpLlxuIiwgcmVzb3VyY2UsIGxvY2tpZCk7CisJCWRtX2hhc2hfcmVtb3ZlKF9sb2NrcywgcmVzb3VyY2UpOworCQlkbV9mcmVlKGhlYWQpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfbG9ja19tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfaXNfcXVvcmF0ZSh2b2lkKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9nZXRfbWFpbl9jbHVzdGVyX2ZkKHZvaWQpCit7CisJcmV0dXJuIGxpc3Rlbl9mZDsKK30KKworc3RhdGljIGludCBfY2x1c3Rlcl9mZF9jYWxsYmFjayhzdHJ1Y3QgbG9jYWxfY2xpZW50ICpmZCwgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJCWNvbnN0IGNoYXIgKmNzaWQsCisJCQkJc3RydWN0IGxvY2FsX2NsaWVudCAqKm5ld19jbGllbnQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NsdXN0ZXJfc2VuZF9tZXNzYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG1zZ2xlbiwKKwkJCQkgY29uc3QgY2hhciAqY3NpZCwKKwkJCQkgY29uc3QgY2hhciAqZXJydGV4dCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZ2V0X2NsdXN0ZXJfbmFtZShjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJcmV0dXJuIGRtX3N0cm5jcHkoYnVmLCAibG9jYWxjbHVzdGVyIiwgYnVmbGVuKSA/IDAgOiAxOworfQorCitzdGF0aWMgc3RydWN0IGNsdXN0ZXJfb3BzIF9jbHVzdGVyX3NpbmdsZW5vZGVfb3BzID0geworCS5uYW1lICAgICAgICAgICAgICAgICAgICAgPSAic2luZ2xlbm9kZSIsCisJLmNsdXN0ZXJfaW5pdF9jb21wbGV0ZWQgICA9IE5VTEwsCisJLmNsdXN0ZXJfc2VuZF9tZXNzYWdlICAgICA9IF9jbHVzdGVyX3NlbmRfbWVzc2FnZSwKKwkubmFtZV9mcm9tX2NzaWQgICAgICAgICAgID0gX25hbWVfZnJvbV9jc2lkLAorCS5jc2lkX2Zyb21fbmFtZSAgICAgICAgICAgPSBfY3NpZF9mcm9tX25hbWUsCisJLmdldF9udW1fbm9kZXMgICAgICAgICAgICA9IF9nZXRfbnVtX25vZGVzLAorCS5jbHVzdGVyX2ZkX2NhbGxiYWNrICAgICAgPSBfY2x1c3Rlcl9mZF9jYWxsYmFjaywKKwkuZ2V0X21haW5fY2x1c3Rlcl9mZCAgICAgID0gX2dldF9tYWluX2NsdXN0ZXJfZmQsCisJLmNsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayA9IF9jbHVzdGVyX2RvX25vZGVfY2FsbGJhY2ssCisJLmlzX3F1b3JhdGUgICAgICAgICAgICAgICA9IF9pc19xdW9yYXRlLAorCS5nZXRfb3VyX2NzaWQgICAgICAgICAgICAgPSBfZ2V0X291cl9jc2lkLAorCS5hZGRfdXBfbm9kZSAgICAgICAgICAgICAgPSBfYWRkX3VwX25vZGUsCisJLnJlcmVhZF9jb25maWcgICAgICAgICAgICA9IE5VTEwsCisJLmNsdXN0ZXJfY2xvc2Vkb3duICAgICAgICA9IF9jbHVzdGVyX2Nsb3NlZG93biwKKwkuZ2V0X2NsdXN0ZXJfbmFtZSAgICAgICAgID0gX2dldF9jbHVzdGVyX25hbWUsCisJLnN5bmNfbG9jayAgICAgICAgICAgICAgICA9IF9sb2NrX3Jlc291cmNlLAorCS5zeW5jX3VubG9jayAgICAgICAgICAgICAgPSBfdW5sb2NrX3Jlc291cmNlLAorfTsKKworc3RydWN0IGNsdXN0ZXJfb3BzICppbml0X3NpbmdsZW5vZGVfY2x1c3Rlcih2b2lkKQoreworCWlmICghX2luaXRfY2x1c3RlcigpKQorCQlyZXR1cm4gJl9jbHVzdGVyX3NpbmdsZW5vZGVfb3BzOworCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2Nsdm1kL2Nsdm1kLmMgYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NmM2MwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY2x2bWQvY2x2bWQuYwpAQCAtMCwwICsxLDIzODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBDTFZNRDogQ2x1c3RlciBMVk0gZGFlbW9uCisgKi8KKworI2luY2x1ZGUgImNsdm1kLWNvbW1vbi5oIgorCisjaW5jbHVkZSAiY2x2bWQtY29tbXMuaCIKKyNpbmNsdWRlICJjbHZtLmgiCisjaW5jbHVkZSAiY2x2bWQuaCIKKyNpbmNsdWRlICJsdm0tZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAibHZtLXZlcnNpb24uaCIKKyNpbmNsdWRlICJyZWZyZXNoX2Nsdm1kLmgiCisKKyNpZmRlZiBIQVZFX0NPUk9TWU5DX0NPTkZEQl9ICisjaW5jbHVkZSA8Y29yb3N5bmMvY29uZmRiLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9SRVRSSUVTIDQKKyNkZWZpbmUgTUFYX01JU1NJTkdfTEVOIDgwMDAgLyogTWF4IHN1cHBvcnRlZCBjbHZtZCBtZXNzYWdlIHNpemUgPyAqLworCisjZGVmaW5lIElTTE9DQUxfQ1NJRChjKSAobWVtY21wKGMsIG91cl9jc2lkLCBtYXhfY3NpZF9sZW4pID09IDApCisKKy8qIEhlYWQgb2YgdGhlIGZkIGxpc3QuIEFsc28gY29udGFpbnMKKyAgIHRoZSBjbHVzdGVyX3NvY2tldCBkZXRhaWxzICovCitzdGF0aWMgc3RydWN0IGxvY2FsX2NsaWVudCBsb2NhbF9jbGllbnRfaGVhZDsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdsb2JhbF94aWQgPSAwOwkvKiBMYXN0IHRyYW5zYWN0aW9uIElEIGlzc3VlZCAqLworCitzdHJ1Y3QgY2x1c3Rlcl9vcHMgKmNsb3BzID0gTlVMTDsKKworc3RhdGljIGNoYXIgb3VyX2NzaWRbTUFYX0NTSURfTEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBtYXhfY3NpZF9sZW47CitzdGF0aWMgdW5zaWduZWQgbWF4X2NsdXN0ZXJfbWVzc2FnZTsKK3N0YXRpYyB1bnNpZ25lZCBtYXhfY2x1c3Rlcl9tZW1iZXJfbmFtZV9sZW47CisKKy8qIFN0cnVjdHVyZSBvZiBpdGVtcyBvbiB0aGUgTFZNIHRocmVhZCBsaXN0ICovCitzdHJ1Y3QgbHZtX3RocmVhZF9jbWQgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisKKwlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGNsdm1faGVhZGVyICptc2c7CisJY2hhciBjc2lkW01BWF9DU0lEX0xFTl07CisJaW50IHJlbW90ZTsJCS8qIEZsYWcgKi8KKwlpbnQgbXNnbGVuOworCXVuc2lnbmVkIHNob3J0IHhpZDsKK307CisKK3N0cnVjdCBsdm1fc3RhcnR1cF9wYXJhbXMgeworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpleGNsX3V1aWQ7Cit9OworCitzdGF0aWMgZGVidWdfdCBkZWJ1ZyA9IERFQlVHX09GRjsKK3N0YXRpYyBpbnQgZm9yZWdyb3VuZF9tb2RlID0gMDsKK3N0YXRpYyBwdGhyZWFkX3QgbHZtX3RocmVhZDsKKy8qIFN0YWNrIHNpemUgMTI4S2lCIGZvciB0aHJlYWQsIG11c3QgYmUgYmlnZ2VyIHRoZW4gREVGQVVMVF9SRVNFUlZFRF9TVEFDSyAqLworc3RhdGljIGNvbnN0IHNpemVfdCBTVEFDS19TSVpFID0gMTI4ICogMTAyNDsKK3N0YXRpYyBwdGhyZWFkX2F0dHJfdCBzdGFja19hdHRyOworc3RhdGljIGludCBsdm1fdGhyZWFkX2V4aXQgPSAwOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsdm1fdGhyZWFkX211dGV4Oworc3RhdGljIHB0aHJlYWRfY29uZF90IGx2bV90aHJlYWRfY29uZDsKK3N0YXRpYyBwdGhyZWFkX2JhcnJpZXJfdCBsdm1fc3RhcnRfYmFycmllcjsKK3N0YXRpYyBzdHJ1Y3QgZG1fbGlzdCBsdm1fY21kX2hlYWQ7CitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHF1aXQgPSAwOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCByZXJlYWRfY29uZmlnID0gMDsKK3N0YXRpYyBpbnQgY2hpbGRfcGlwZVsyXTsKKworLyogUmVhc29ucyB0aGUgZGFlbW9uIGZhaWxlZCBpbml0aWFsaXNhdGlvbiAqLworI2RlZmluZSBERkFJTF9JTklUICAgICAgIDEKKyNkZWZpbmUgREZBSUxfTE9DQUxfU09DSyAyCisjZGVmaW5lIERGQUlMX0NMVVNURVJfSUYgMworI2RlZmluZSBERkFJTF9NQUxMT0MgICAgIDQKKyNkZWZpbmUgREZBSUxfVElNRU9VVCAgICA1CisjZGVmaW5lIFNVQ0NFU1MgICAgICAgICAgMAorCit0eXBlZGVmIGVudW0ge0lGX0FVVE8sIElGX0NNQU4sIElGX09QRU5BSVMsIElGX0NPUk9TWU5DLCBJRl9TSU5HTEVOT0RFfSBpZl90eXBlX3Q7CisKKy8qIFByb3RvdHlwZXMgZm9yIGNvZGUgZnVydGhlciBkb3duICovCitzdGF0aWMgdm9pZCBzaWd1c3IyX2hhbmRsZXIoaW50IHNpZyk7CitzdGF0aWMgdm9pZCBzaWdodXBfaGFuZGxlcihpbnQgc2lnKTsKK3N0YXRpYyB2b2lkIHNpZ3Rlcm1faGFuZGxlcihpbnQgc2lnKTsKK3N0YXRpYyB2b2lkIHNlbmRfbG9jYWxfcmVwbHkoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50LCBpbnQgc3RhdHVzLAorCQkJICAgICBpbnQgY2xpZW50aWQpOworc3RhdGljIHZvaWQgZnJlZV9yZXBseShzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgc2VuZF92ZXJzaW9uX21lc3NhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCAqcHJlX2FuZF9wb3N0X3RocmVhZCh2b2lkICphcmcpOworc3RhdGljIGludCBzZW5kX21lc3NhZ2Uodm9pZCAqYnVmLCBpbnQgbXNnbGVuLCBjb25zdCBjaGFyICpjc2lkLCBpbnQgZmQsCisJCQljb25zdCBjaGFyICplcnJ0ZXh0KTsKK3N0YXRpYyBpbnQgcmVhZF9mcm9tX2xvY2FsX3NvY2soc3RydWN0IGxvY2FsX2NsaWVudCAqdGhpc2ZkKTsKK3N0YXRpYyBpbnQgY2xlYW51cF96b21iaWUoc3RydWN0IGxvY2FsX2NsaWVudCAqdGhpc2ZkKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19sb2NhbF9jb21tYW5kKHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLCBpbnQgbXNnbGVuLAorCQkJCSBzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsCisJCQkJIHVuc2lnbmVkIHNob3J0IHhpZCk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3JlbW90ZV9jb21tYW5kKHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLCBpbnQgbXNnbGVuLCBpbnQgZmQsCisJCQkJICAgY29uc3QgY2hhciAqY3NpZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfcmVwbHkoY29uc3Qgc3RydWN0IGNsdm1faGVhZGVyICptc2csIGludCBtc2dsZW4sCisJCQkgY29uc3QgY2hhciAqY3NpZCk7CitzdGF0aWMgaW50IG9wZW5fbG9jYWxfc29jayh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsb3NlX2xvY2FsX3NvY2soaW50IGxvY2FsX3NvY2tldCk7CitzdGF0aWMgaW50IGNoZWNrX2xvY2FsX2Nsdm1kKHZvaWQpOworc3RhdGljIHN0cnVjdCBsb2NhbF9jbGllbnQgKmZpbmRfY2xpZW50KGludCBjbGllbnRpZCk7CitzdGF0aWMgdm9pZCBtYWluX2xvb3AoaW50IGNtZF90aW1lb3V0KTsKK3N0YXRpYyB2b2lkIGJlX2RhZW1vbihpbnQgc3RhcnRfdGltZW91dCk7CitzdGF0aWMgaW50IGNoZWNrX2FsbF9jbHZtZHNfcnVubmluZyhzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBsb2NhbF9yZW5kZXp2b3VzX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKnRoaXNmZCwgY2hhciAqYnVmLAorCQkJCSAgICAgaW50IGxlbiwgY29uc3QgY2hhciAqY3NpZCwKKwkJCQkgICAgIHN0cnVjdCBsb2NhbF9jbGllbnQgKipuZXdfY2xpZW50KTsKK3N0YXRpYyB2b2lkICpsdm1fdGhyZWFkX2ZuKHZvaWQgKikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3N0YXRpYyBpbnQgYWRkX3RvX2x2bXF1ZXVlKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgc3RydWN0IGNsdm1faGVhZGVyICptc2csCisJCQkgICBpbnQgbXNnbGVuLCBjb25zdCBjaGFyICpjc2lkKTsKK3N0YXRpYyBpbnQgZGlzdHJpYnV0ZV9jb21tYW5kKHN0cnVjdCBsb2NhbF9jbGllbnQgKnRoaXNmZCk7CitzdGF0aWMgdm9pZCBodG9uX2Nsdm0oc3RydWN0IGNsdm1faGVhZGVyICpoZHIpOworc3RhdGljIHZvaWQgbnRvaF9jbHZtKHN0cnVjdCBjbHZtX2hlYWRlciAqaGRyKTsKK3N0YXRpYyB2b2lkIGFkZF9yZXBseV90b19saXN0KHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgaW50IHN0YXR1cywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaWZfdHlwZV90IHBhcnNlX2NsdXN0ZXJfaW50ZXJmYWNlKGNoYXIgKmlmbmFtZSk7CitzdGF0aWMgaWZfdHlwZV90IGdldF9jbHVzdGVyX3R5cGUodm9pZCk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnByb2csIEZJTEUgKmZpbGUpCit7CisJZnByaW50ZihmaWxlLCAiVXNhZ2U6ICVzIFtvcHRpb25zXVxuIgorCQkiICAgLUMgICAgICAgU2V0cyBkZWJ1ZyBsZXZlbCAoZnJvbSAtZCkgb24gYWxsIGNsdm1kIGluc3RhbmNlcyBjbHVzdGVyd2lkZVxuIgorCQkiICAgLWRbPG4+XSAgU2V0IGRlYnVnIGxvZ2dpbmcgKDA6bm9uZSwgMTpzdGRlcnIgKGltcGxpZXMgLWYgb3B0aW9uKSwgMjpzeXNsb2cpXG4iCisJCSIgICAtRTx1dWlkPiBUYWtlIHRoaXMgbG9jayB1dWlkIGFzIGV4Y2x1c2l2ZWx5IGxvY2tlZCByZXNvdXJjZSAoZm9yIHJlc3RhcnQpXG4iCisJCSIgICAtZiAgICAgICBEb24ndCBmb3JrLCBydW4gaW4gdGhlIGZvcmVncm91bmRcbiIKKwkJIiAgIC1oICAgICAgIFNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uXG4iCisJCSIgICAtSTxjbWdyPiBDbHVzdGVyIG1hbmFnZXIgKGRlZmF1bHQ6IGF1dG8pXG4iCisJCSIgICAgICAgICAgICBBdmFpbGFibGUgY2x1c3RlciBtYW5hZ2VyczogIgorI2lmZGVmIFVTRV9DT1JPU1lOQworCQkiY29yb3N5bmMgIgorI2VuZGlmCisjaWZkZWYgVVNFX0NNQU4KKwkJImNtYW4gIgorI2VuZGlmCisjaWZkZWYgVVNFX09QRU5BSVMKKwkJIm9wZW5haXMgIgorI2VuZGlmCisjaWZkZWYgVVNFX1NJTkdMRU5PREUKKwkJInNpbmdsZW5vZGUgIgorI2VuZGlmCisJCSJcbiIKKwkJIiAgIC1SICAgICAgIFRlbGwgYWxsIHJ1bm5pbmcgY2x2bWRzIGluIHRoZSBjbHVzdGVyIHRvIHJlbG9hZCB0aGVpciBkZXZpY2UgY2FjaGVcbiIKKwkJIiAgIC1TICAgICAgIFJlc3RhcnQgY2x2bWQsIHByZXNlcnZpbmcgZXhjbHVzaXZlIGxvY2tzXG4iCisJCSIgICAtdDxzZWNzPiBDb21tYW5kIHRpbWVvdXQgKGRlZmF1bHQ6IDYwIHNlY29uZHMpXG4iCisJCSIgICAtVDxzZWNzPiBTdGFydHVwIHRpbWVvdXQgKGRlZmF1bHQ6ICAwIHNlY29uZHMpXG4iCisJCSIgICAtViAgICAgICBTaG93IHZlcnNpb24gb2YgY2x2bWRcbiIKKwkJIlxuIiwgcHJvZyk7Cit9CisKKy8qIENhbGxlZCB0byBzaWduYWwgdGhlIHBhcmVudCBob3cgd2VsbCB3ZSBnb3Qgb24gZHVyaW5nIGluaXRpYWxpc2F0aW9uICovCitzdGF0aWMgdm9pZCBjaGlsZF9pbml0X3NpZ25hbChpbnQgc3RhdHVzKQoreworCWlmIChjaGlsZF9waXBlWzFdKSB7CisJCS8qIEZJWE1FIFVzZSBhIHByb3BlciB3cmFwcGVyIGFyb3VuZCB3cml0ZSAqLworCQlpZiAod3JpdGUoY2hpbGRfcGlwZVsxXSwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpIDwgMCkKKwkJCWxvZ19zeXNfZXJyb3IoIndyaXRlIiwgImNoaWxkX3BpcGUiKTsKKwkJaWYgKGNsb3NlKGNoaWxkX3BpcGVbMV0pKQorCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCAiY2hpbGRfcGlwZSIpOworCX0KK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgdm9pZCBjaGlsZF9pbml0X3NpZ25hbF9hbmRfZXhpdChpbnQgc3RhdHVzKSAKK3sKKwljaGlsZF9pbml0X3NpZ25hbChzdGF0dXMpOworCWV4aXQoc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc2FmZV9jbG9zZShpbnQgKmZkKQoreworCWlmICgqZmQgPj0gMCkgeworCQlpbnQgdG9fY2xvc2UgPSAqZmQ7CisJCSpmZCA9IC0xOworCQlpZiAoY2xvc2UodG9fY2xvc2UpKQorCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCAiIik7IC8qIHBhdGggKi8KKwl9Cit9CisKK3ZvaWQgZGVidWdsb2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdGltZV90IFA7CisJdmFfbGlzdCBhcDsKKwlzdGF0aWMgaW50IHN5c2xvZ19pbml0ID0gMDsKKwljaGFyIGJ1Zl9jdGltZVs2NF07CisKKwlzd2l0Y2ggKGNsdm1kX2dldF9kZWJ1ZygpKSB7CisJY2FzZSBERUJVR19TVERFUlI6CisJCXZhX3N0YXJ0KGFwLGZtdCk7CisJCXRpbWUoJlApOworCQlmcHJpbnRmKHN0ZGVyciwgIkNMVk1EWyV4XTogJS4xNXMgIiwgKGludClwdGhyZWFkX3NlbGYoKSwgY3RpbWVfcigmUCwgYnVmX2N0aW1lKSArIDQpOworCQl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCQl2YV9lbmQoYXApOworCQlmZmx1c2goc3RkZXJyKTsKKwkJYnJlYWs7CisJY2FzZSBERUJVR19TWVNMT0c6CisJCWlmICghc3lzbG9nX2luaXQpIHsKKwkJCW9wZW5sb2coImNsdm1kIiwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCQlzeXNsb2dfaW5pdCA9IDE7CisJCX0KKworCQl2YV9zdGFydChhcCxmbXQpOworCQl2c3lzbG9nKExPR19ERUJVRywgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWJyZWFrOworCWNhc2UgREVCVUdfT0ZGOgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgY2x2bWRfc2V0X2RlYnVnKGRlYnVnX3QgbmV3X2RlYnVnKQoreworCWlmICghZm9yZWdyb3VuZF9tb2RlICYmIG5ld19kZWJ1ZyA9PSBERUJVR19TVERFUlIpCisJCW5ld19kZWJ1ZyA9IERFQlVHX1NZU0xPRzsKKworCWlmIChuZXdfZGVidWcgPiBERUJVR19TWVNMT0cpCisJCW5ld19kZWJ1ZyA9IERFQlVHX1NZU0xPRzsKKworCWRlYnVnID0gbmV3X2RlYnVnOworfQorCitkZWJ1Z190IGNsdm1kX2dldF9kZWJ1Zyh2b2lkKQoreworCXJldHVybiBkZWJ1ZzsKK30KKworaW50IGNsdm1kX2dldF9mb3JlZ3JvdW5kKHZvaWQpCit7CisJcmV0dXJuIGZvcmVncm91bmRfbW9kZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRlY29kZV9jbWQodW5zaWduZWQgY2hhciBjbWRsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCWNvbnN0IGNoYXIgKmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGNtZGwpIHsKKwljYXNlIENMVk1EX0NNRF9URVNUOgorCQljb21tYW5kID0gIlRFU1QiOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9MT0NLX1ZHOgorCQljb21tYW5kID0gIkxPQ0tfVkciOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9MT0NLX0xWOgorCQljb21tYW5kID0gIkxPQ0tfTFYiOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9SRUZSRVNIOgorCQljb21tYW5kID0gIlJFRlJFU0giOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9TRVRfREVCVUc6CisJCWNvbW1hbmQgPSAiU0VUX0RFQlVHIjsKKwkJYnJlYWs7CisJY2FzZSBDTFZNRF9DTURfR0VUX0NMVVNURVJOQU1FOgorCQljb21tYW5kID0gIkdFVF9DTFVTVEVSTkFNRSI7CisJCWJyZWFrOworCWNhc2UgQ0xWTURfQ01EX1ZHX0JBQ0tVUDoKKwkJY29tbWFuZCA9ICJWR19CQUNLVVAiOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9SRVBMWToKKwkJY29tbWFuZCA9ICJSRVBMWSI7CisJCWJyZWFrOworCWNhc2UgQ0xWTURfQ01EX1ZFUlNJT046CisJCWNvbW1hbmQgPSAiVkVSU0lPTiI7CisJCWJyZWFrOworCWNhc2UgQ0xWTURfQ01EX0dPQVdBWToKKwkJY29tbWFuZCA9ICJHT0FXQVkiOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9MT0NLOgorCQljb21tYW5kID0gIkxPQ0siOworCQlicmVhazsKKwljYXNlIENMVk1EX0NNRF9VTkxPQ0s6CisJCWNvbW1hbmQgPSAiVU5MT0NLIjsKKwkJYnJlYWs7CisJY2FzZSBDTFZNRF9DTURfTE9DS19RVUVSWToKKwkJY29tbWFuZCA9ICJMT0NLX1FVRVJZIjsKKwkJYnJlYWs7CisJY2FzZSBDTFZNRF9DTURfUkVTVEFSVDoKKwkJY29tbWFuZCA9ICJSRVNUQVJUIjsKKwkJYnJlYWs7CisJY2FzZSBDTFZNRF9DTURfU1lOQ19OQU1FUzoKKwkJY29tbWFuZCA9ICJTWU5DX05BTUVTIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29tbWFuZCA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzICgweCV4KSIsIGNvbW1hbmQsIGNtZGwpOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xvY2tmaWxlKHZvaWQpCit7CisJaWYgKHVubGluayhDTFZNRF9QSURGSUxFKSkKKwkJbG9nX3N5c19lcnJvcigidW5saW5rIiwgQ0xWTURfUElERklMRSk7Cit9CisKKy8qCisgKiBjbHZtZCByZXF1aXJlIGRtLWlvY3RsIGNhcGFiaWxpdHkgZm9yIG9wZXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBjaGVja19wZXJtaXNzaW9ucyh2b2lkKQoreworCWlmIChnZXR1aWQoKSB8fCBnZXRldWlkKCkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgcnVuIGFzIGEgbm9uLXJvb3QgdXNlci4iKTsKKworCQkgLyoKKwkJICAqIEZhaWwgY2xlYW5seSBoZXJlIGlmIG5vdCBydW4gYXMgcm9vdCwgaW5zdGVhZCBvZiBmYWlsaW5nCisJCSAgKiBsYXRlciB3aGVuIGF0dGVtcHRpbmcgYSByb290LW9ubHkgb3BlcmF0aW9uIAorCQkgICogUHJlZmVycmVkIGV4aXQgY29kZSBmcm9tIGFuIGluaXRzY3JpcHQgZm9yIHRoaXMuCisJCSAgKi8KKwkJZXhpdCg0KTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGxvY2FsX3NvY2s7CisJc3RydWN0IGxvY2FsX2NsaWVudCAqbmV3ZmQsICpkZWxmZDsKKwlzdHJ1Y3QgbHZtX3N0YXJ0dXBfcGFyYW1zIGx2bV9wYXJhbXM7CisJaW50IG9wdDsKKwlpbnQgY21kX3RpbWVvdXQgPSBERUZBVUxUX0NNRF9USU1FT1VUOworCWludCBzdGFydF90aW1lb3V0ID0gMDsKKwlpZl90eXBlX3QgY2x1c3Rlcl9pZmFjZSA9IElGX0FVVE87CisJc2lnc2V0X3Qgc3M7CisJZGVidWdfdCBkZWJ1Z19vcHQgPSBERUJVR19PRkY7CisJZGVidWdfdCBkZWJ1Z19hcmcgPSBERUJVR19PRkY7CisJaW50IGNsdXN0ZXJ3aWRlX29wdCA9IDA7CisJbW9kZV90IG9sZF9tYXNrOworCWludCByZXQgPSAxOworCisJc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCXsgTlVMTCwgMCwgMCwgMCB9CisJfTsKKworCWlmICghKGx2bV9wYXJhbXMuZXhjbF91dWlkID0gZG1faGFzaF9jcmVhdGUoMTI4KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgaGFzaCB0YWJsZVxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIERlYWwgd2l0aCBjb21tYW5kLWxpbmUgYXJndW1lbnRzICovCisJb3B0ZXJyID0gMDsKKwlvcHRpbmQgPSAwOworCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlZoZmQ6dDpSU1Q6Q0k6RToiLAorCQkJCSAgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKGFyZ3ZbMF0sIHN0ZG91dCk7CisJCQlleGl0KDApOworCisJCWNhc2UgJ1InOgorCQkJY2hlY2tfcGVybWlzc2lvbnMoKTsKKwkJCXJldCA9IChyZWZyZXNoX2Nsdm1kKDEpID09IDEpID8gMCA6IDE7CisJCQlnb3RvIG91dDsKKworCQljYXNlICdTJzoKKwkJCWNoZWNrX3Blcm1pc3Npb25zKCk7CisJCQlyZXQgPSAocmVzdGFydF9jbHZtZChjbHVzdGVyd2lkZV9vcHQpID09IDEpID8gMCA6IDE7CisJCQlnb3RvIG91dDsKKworCQljYXNlICdDJzoKKwkJCWNsdXN0ZXJ3aWRlX29wdCA9IDE7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJCWRlYnVnX29wdCA9IERFQlVHX1NUREVSUjsKKwkJCWRlYnVnX2FyZyA9IChkZWJ1Z190KSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoZGVidWdfYXJnID09IERFQlVHX1NUREVSUikKKwkJCQlmb3JlZ3JvdW5kX21vZGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZic6CisJCQlmb3JlZ3JvdW5kX21vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJY21kX3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoIWNtZF90aW1lb3V0KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJjb21tYW5kIHRpbWVvdXQgaXMgaW52YWxpZFxuIik7CisJCQkJdXNhZ2UoYXJndlswXSwgc3RkZXJyKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0knOgorCQkJY2x1c3Rlcl9pZmFjZSA9IHBhcnNlX2NsdXN0ZXJfaW50ZXJmYWNlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnRSc6CisJCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KGx2bV9wYXJhbXMuZXhjbF91dWlkLCBvcHRhcmcsIG9wdGFyZykpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBoYXNoIGVudHJ5XG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdUJzoKKwkJCXN0YXJ0X3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoc3RhcnRfdGltZW91dCA8PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJzdGFydHVwIHRpbWVvdXQgaXMgaW52YWxpZFxuIik7CisJCQkJdXNhZ2UoYXJndlswXSwgc3RkZXJyKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnVic6CisJCSAgICAgICAgcHJpbnRmKCJDbHVzdGVyIExWTSBkYWVtb24gdmVyc2lvbjogJXNcbiIsIExWTV9WRVJTSU9OKTsKKwkJCXByaW50ZigiUHJvdG9jb2wgdmVyc2lvbjogICAgICAgICAgICVkLiVkLiVkXG4iLAorCQkJICAgICAgIENMVk1EX01BSk9SX1ZFUlNJT04sIENMVk1EX01JTk9SX1ZFUlNJT04sCisJCQkgICAgICAgQ0xWTURfUEFUQ0hfVkVSU0lPTik7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGFyZ3ZbMF0sIHN0ZGVycik7CisJCQlleGl0KDIpOworCQl9CisJfQorCisJY2hlY2tfcGVybWlzc2lvbnMoKTsKKworCS8qCisJICogU3dpdGNoIHRvIEMgbG9jYWxlIHRvIGF2b2lkIHJlYWRpbmcgbGFyZ2UgbG9jYWxlLWFyY2hpdmUgZmlsZQorCSAqIHVzZWQgYnkgc29tZSBnbGliYyAob24gc29tZSBkaXN0cmlidXRpb25zIGl0IHRha2VzIG92ZXIgMTAwTUIpLgorCSAqIERhZW1vbiBjdXJyZW50bHkgbmVlZHMgdG8gdXNlIG1sb2NrYWxsKCkuCisJICovCisJaWYgKHNldGVudigiTENfQUxMIiwgIkMiLCAxKSkKKwkJcGVycm9yKCJDYW5ub3Qgc2V0IExDX0FMTCB0byBDIik7CisKKwkvKiBTZXR0aW5nIGRlYnVnIG9wdGlvbnMgb24gYW4gZXhpc3RpbmcgY2x2bWQgKi8KKwlpZiAoZGVidWdfb3B0ICYmICFjaGVja19sb2NhbF9jbHZtZCgpKSB7CisJCWRtX2hhc2hfZGVzdHJveShsdm1fcGFyYW1zLmV4Y2xfdXVpZCk7CisJCXJldHVybiBkZWJ1Z19jbHZtZChkZWJ1Z19hcmcsIGNsdXN0ZXJ3aWRlX29wdCk9PTE/MDoxOworCX0KKworCWNsdm1kX3NldF9kZWJ1ZyhkZWJ1Z19hcmcpOworCisJLyogRm9yayBpbnRvIHRoZSBiYWNrZ3JvdW5kICh1bmxlc3MgcmVxdWVzdGVkIG5vdCB0bykgKi8KKwlpZiAoIWZvcmVncm91bmRfbW9kZSkKKwkJYmVfZGFlbW9uKHN0YXJ0X3RpbWVvdXQpOworCisgICAgICAgICh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChERUZBVUxUX1JVTl9ESVIsIFNfSUZESVIpOworICAgICAgICBvbGRfbWFzayA9IHVtYXNrKDAwNzcpOworICAgICAgICBpZiAoZG1fY3JlYXRlX2RpcihERUZBVUxUX1JVTl9ESVIpID09IDApIHsKKyAgICAgICAgICAgICAgICBERUJVR0xPRygiY2x2bWQ6IHVuYWJsZSB0byBjcmVhdGUgJXMgZGlyZWN0b3J5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTl9ESVIpOworICAgICAgICAgICAgICAgIHVtYXNrKG9sZF9tYXNrKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHVtYXNrKG9sZF9tYXNrKTsKKworCS8qIENyZWF0ZSBwaWRmaWxlICovCisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KENMVk1EX1BJREZJTEUsIFNfSUZSRUcpOworCWlmIChkbV9jcmVhdGVfbG9ja2ZpbGUoQ0xWTURfUElERklMRSkgPT0gMCkgeworCQlERUJVR0xPRygiY2x2bWQ6IHVuYWJsZSB0byBjcmVhdGUgbG9ja2ZpbGVcbiIpOworCQlleGl0KDEpOworCX0KKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisKKwlhdGV4aXQocmVtb3ZlX2xvY2tmaWxlKTsKKworCURFQlVHTE9HKCJDTFZNRCBzdGFydGVkXG4iKTsKKworCS8qIE9wZW4gdGhlIFVuaXggc29ja2V0IHdlIGxpc3RlbiBmb3IgY29tbWFuZHMgb24uCisJICAgV2UgZG8gdGhpcyBiZWZvcmUgb3BlbmluZyB0aGUgY2x1c3RlciBzb2NrZXQgc28gdGhhdAorCSAgIHBvdGVudGlhbCBjbGllbnRzIHdpbGwgYmxvY2sgcmF0aGVyIHRoYW4gZXJyb3IgaWYgd2UgYXJlIHJ1bm5pbmcKKwkgICBidXQgdGhlIGNsdXN0ZXIgaXMgbm90IHJlYWR5IHlldCAqLworCWxvY2FsX3NvY2sgPSBvcGVuX2xvY2FsX3NvY2soKTsKKwlpZiAobG9jYWxfc29jayA8IDApIHsKKwkJY2hpbGRfaW5pdF9zaWduYWxfYW5kX2V4aXQoREZBSUxfTE9DQUxfU09DSyk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwkvKiBTZXQgdXAgc2lnbmFsIGhhbmRsZXJzLCBVU1IxIGlzIGZvciBjbHVzdGVyIGNoYW5nZSBub3RpZmljYXRpb25zIChpbiBjbWFuKQorCSAgIFVTUjIgY2F1c2VzIGNoaWxkIHRocmVhZHMgdG8gZXhpdC4KKwkgICAoSFVQIHVzZWQgdG8gY2F1c2UgZ3VsbSB0byByZS1yZWFkIHRoZSBub2RlcyBsaXN0IGZyb20gQ0NTLikKKwkgICBQSVBFIHNob3VsZCBiZSBpZ25vcmVkICovCisJc2lnbmFsKFNJR1VTUjIsIHNpZ3VzcjJfaGFuZGxlcik7CisJc2lnbmFsKFNJR0hVUCwgIHNpZ2h1cF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvKiBCbG9jayBTSUdVU1IyL1NJR0lOVC9TSUdURVJNIGluIHByb2Nlc3MgKi8KKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIFNJR1VTUjIpOworCXNpZ2FkZHNldCgmc3MsIFNJR0lOVCk7CisJc2lnYWRkc2V0KCZzcywgU0lHVEVSTSk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3MsIE5VTEwpOworCisJLyogSW5pdGlhbGlzZSB0aGUgTFZNIHRocmVhZCB2YXJpYWJsZXMgKi8KKwlkbV9saXN0X2luaXQoJmx2bV9jbWRfaGVhZCk7CisJaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZzdGFja19hdHRyKSB8fAorCSAgICBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZzdGFja19hdHRyLCBTVEFDS19TSVpFKSkgeworCQlsb2dfc3lzX2Vycm9yKCJwdGhyZWFkX2F0dHJfaW5pdCIsICIiKTsKKwkJZXhpdCgxKTsKKwl9CisJcHRocmVhZF9tdXRleF9pbml0KCZsdm1fdGhyZWFkX211dGV4LCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmbHZtX3RocmVhZF9jb25kLCBOVUxMKTsKKwlwdGhyZWFkX2JhcnJpZXJfaW5pdCgmbHZtX3N0YXJ0X2JhcnJpZXIsIE5VTEwsIDIpOworCWluaXRfbHZoYXNoKCk7CisKKwkvKiBTdGFydCB0aGUgY2x1c3RlciBpbnRlcmZhY2UgKi8KKwlpZiAoY2x1c3Rlcl9pZmFjZSA9PSBJRl9BVVRPKQorCQljbHVzdGVyX2lmYWNlID0gZ2V0X2NsdXN0ZXJfdHlwZSgpOworCisjaWZkZWYgVVNFX0NNQU4KKwlpZiAoKGNsdXN0ZXJfaWZhY2UgPT0gSUZfQVVUTyB8fCBjbHVzdGVyX2lmYWNlID09IElGX0NNQU4pICYmCisJICAgIChjbG9wcyA9IGluaXRfY21hbl9jbHVzdGVyKCkpKSB7CisJCW1heF9jc2lkX2xlbiA9IENNQU5fTUFYX0NTSURfTEVOOworCQltYXhfY2x1c3Rlcl9tZXNzYWdlID0gQ01BTl9NQVhfQ0xVU1RFUl9NRVNTQUdFOworCQltYXhfY2x1c3Rlcl9tZW1iZXJfbmFtZV9sZW4gPSBDTUFOX01BWF9OT0RFTkFNRV9MRU47CisJCXN5c2xvZyhMT0dfTk9USUNFLCAiQ2x1c3RlciBMVk0gZGFlbW9uIHN0YXJ0ZWQgLSBjb25uZWN0ZWQgdG8gQ01BTiIpOworCX0KKyNlbmRpZgorI2lmZGVmIFVTRV9DT1JPU1lOQworCWlmICghY2xvcHMpCisJCWlmICgoKGNsdXN0ZXJfaWZhY2UgPT0gSUZfQVVUTyB8fCBjbHVzdGVyX2lmYWNlID09IElGX0NPUk9TWU5DKSAmJgorCQkgICAgIChjbG9wcyA9IGluaXRfY29yb3N5bmNfY2x1c3RlcigpKSkpIHsKKwkJCW1heF9jc2lkX2xlbiA9IENPUk9TWU5DX0NTSURfTEVOOworCQkJbWF4X2NsdXN0ZXJfbWVzc2FnZSA9IENPUk9TWU5DX01BWF9DTFVTVEVSX01FU1NBR0U7CisJCQltYXhfY2x1c3Rlcl9tZW1iZXJfbmFtZV9sZW4gPSBDT1JPU1lOQ19NQVhfQ0xVU1RFUl9NRU1CRVJfTkFNRV9MRU47CisJCQlzeXNsb2coTE9HX05PVElDRSwgIkNsdXN0ZXIgTFZNIGRhZW1vbiBzdGFydGVkIC0gY29ubmVjdGVkIHRvIENvcm9zeW5jIik7CisJCX0KKyNlbmRpZgorI2lmZGVmIFVTRV9PUEVOQUlTCisJaWYgKCFjbG9wcykKKwkJaWYgKChjbHVzdGVyX2lmYWNlID09IElGX0FVVE8gfHwgY2x1c3Rlcl9pZmFjZSA9PSBJRl9PUEVOQUlTKSAmJgorCQkgICAgKGNsb3BzID0gaW5pdF9vcGVuYWlzX2NsdXN0ZXIoKSkpIHsKKwkJCW1heF9jc2lkX2xlbiA9IE9QRU5BSVNfQ1NJRF9MRU47CisJCQltYXhfY2x1c3Rlcl9tZXNzYWdlID0gT1BFTkFJU19NQVhfQ0xVU1RFUl9NRVNTQUdFOworCQkJbWF4X2NsdXN0ZXJfbWVtYmVyX25hbWVfbGVuID0gT1BFTkFJU19NQVhfQ0xVU1RFUl9NRU1CRVJfTkFNRV9MRU47CisJCQlzeXNsb2coTE9HX05PVElDRSwgIkNsdXN0ZXIgTFZNIGRhZW1vbiBzdGFydGVkIC0gY29ubmVjdGVkIHRvIE9wZW5BSVMiKTsKKwkJfQorI2VuZGlmCisjaWZkZWYgVVNFX1NJTkdMRU5PREUKKwlpZiAoIWNsb3BzKQorCQlpZiAoY2x1c3Rlcl9pZmFjZSA9PSBJRl9TSU5HTEVOT0RFICYmIChjbG9wcyA9IGluaXRfc2luZ2xlbm9kZV9jbHVzdGVyKCkpKSB7CisJCQltYXhfY3NpZF9sZW4gPSBTSU5HTEVOT0RFX0NTSURfTEVOOworCQkJbWF4X2NsdXN0ZXJfbWVzc2FnZSA9IFNJTkdMRU5PREVfTUFYX0NMVVNURVJfTUVTU0FHRTsKKwkJCW1heF9jbHVzdGVyX21lbWJlcl9uYW1lX2xlbiA9IE1BWF9DTFVTVEVSX01FTUJFUl9OQU1FX0xFTjsKKwkJCXN5c2xvZyhMT0dfTk9USUNFLCAiQ2x1c3RlciBMVk0gZGFlbW9uIHN0YXJ0ZWQgLSBydW5uaW5nIGluIHNpbmdsZS1ub2RlIG1vZGUiKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoIWNsb3BzKSB7CisJCURFQlVHTE9HKCJDYW4ndCBpbml0aWFsaXNlIGNsdXN0ZXIgaW50ZXJmYWNlXG4iKTsKKwkJbG9nX2Vycm9yKCJDYW4ndCBpbml0aWFsaXNlIGNsdXN0ZXIgaW50ZXJmYWNlLiIpOworCQljaGlsZF9pbml0X3NpZ25hbF9hbmRfZXhpdChERkFJTF9DTFVTVEVSX0lGKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlERUJVR0xPRygiQ2x1c3RlciByZWFkeSwgZG9pbmcgc29tZSBtb3JlIGluaXRpYWxpc2F0aW9uXG4iKTsKKworCS8qIFNhdmUgb3VyIENTSUQgKi8KKwljbG9wcy0+Z2V0X291cl9jc2lkKG91cl9jc2lkKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIEZEIGxpc3QgaGVhZCAqLworCWxvY2FsX2NsaWVudF9oZWFkLmZkID0gY2xvcHMtPmdldF9tYWluX2NsdXN0ZXJfZmQoKTsKKwlsb2NhbF9jbGllbnRfaGVhZC50eXBlID0gQ0xVU1RFUl9NQUlOX1NPQ0s7CisJbG9jYWxfY2xpZW50X2hlYWQuY2FsbGJhY2sgPSBjbG9wcy0+Y2x1c3Rlcl9mZF9jYWxsYmFjazsKKworCS8qIEFkZCB0aGUgbG9jYWwgc29ja2V0IHRvIHRoZSBsaXN0ICovCisJaWYgKCEobmV3ZmQgPSBkbV96YWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NhbF9jbGllbnQpKSkpIHsKKwkJY2hpbGRfaW5pdF9zaWduYWxfYW5kX2V4aXQoREZBSUxfTUFMTE9DKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCW5ld2ZkLT5mZCA9IGxvY2FsX3NvY2s7CisJbmV3ZmQtPnR5cGUgPSBMT0NBTF9SRU5ERVpWT1VTOworCW5ld2ZkLT5jYWxsYmFjayA9IGxvY2FsX3JlbmRlenZvdXNfY2FsbGJhY2s7CisJbmV3ZmQtPm5leHQgPSBsb2NhbF9jbGllbnRfaGVhZC5uZXh0OworCWxvY2FsX2NsaWVudF9oZWFkLm5leHQgPSBuZXdmZDsKKworCS8qIFRoaXMgbmVlZHMgdG8gYmUgc3RhcnRlZCBhZnRlciBjbHVzdGVyIGluaXRpYWxpc2F0aW9uCisJICAgYXMgaXQgbWF5IG5lZWQgdG8gdGFrZSBvdXQgbG9ja3MgKi8KKwlERUJVR0xPRygiU3RhcnRpbmcgTFZNIHRocmVhZFxuIik7CisJREVCVUdMT0coIk1haW4gY2x1c3RlciBzb2NrZXQgZmQgJWQgKCVwKSB3aXRoIGxvY2FsIHNvY2tldCAlZCAoJXApXG4iLAorCQkgbG9jYWxfY2xpZW50X2hlYWQuZmQsICZsb2NhbF9jbGllbnRfaGVhZCwgbmV3ZmQtPmZkLCBuZXdmZCk7CisKKwkvKiBEb24ndCBsZXQgYW55b25lIGVsc2UgdG8gZG8gd29yayB1bnRpbCB3ZSBhcmUgc3RhcnRlZCAqLworCWlmIChwdGhyZWFkX2NyZWF0ZSgmbHZtX3RocmVhZCwgJnN0YWNrX2F0dHIsIGx2bV90aHJlYWRfZm4sICZsdm1fcGFyYW1zKSkgeworCQlsb2dfc3lzX2Vycm9yKCJwdGhyZWFkX2NyZWF0ZSIsICIiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRG9uJ3Qgc3RhcnQgdW50aWwgdGhlIExWTSB0aHJlYWQgaXMgcmVhZHkgKi8KKwlwdGhyZWFkX2JhcnJpZXJfd2FpdCgmbHZtX3N0YXJ0X2JhcnJpZXIpOworCisJLyogVGVsbCB0aGUgcmVzdCBvZiB0aGUgY2x1c3RlciBvdXIgdmVyc2lvbiBudW1iZXIgKi8KKwlpZiAoY2xvcHMtPmNsdXN0ZXJfaW5pdF9jb21wbGV0ZWQpCisJCWNsb3BzLT5jbHVzdGVyX2luaXRfY29tcGxldGVkKCk7CisKKwlERUJVR0xPRygiY2x2bWQgcmVhZHkgZm9yIHdvcmtcbiIpOworCWNoaWxkX2luaXRfc2lnbmFsKFNVQ0NFU1MpOworCisJLyogVHJ5IHRvIHNodXRkb3duIG5lYXRseSAqLworCXNpZ25hbChTSUdURVJNLCBzaWd0ZXJtX2hhbmRsZXIpOworCXNpZ25hbChTSUdJTlQsIHNpZ3Rlcm1faGFuZGxlcik7CisKKwkvKiBEbyBzb21lIHdvcmsgKi8KKwltYWluX2xvb3AoY21kX3RpbWVvdXQpOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsdm1fdGhyZWFkX211dGV4KTsKKwlsdm1fdGhyZWFkX2V4aXQgPSAxOworCXB0aHJlYWRfY29uZF9zaWduYWwoJmx2bV90aHJlYWRfY29uZCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bV90aHJlYWRfbXV0ZXgpOworCWlmICgoZXJybm8gPSBwdGhyZWFkX2pvaW4obHZtX3RocmVhZCwgTlVMTCkpKQorCQlsb2dfc3lzX2Vycm9yKCJwdGhyZWFkX2pvaW4iLCAiIik7CisKKwljbG9zZV9sb2NhbF9zb2NrKGxvY2FsX3NvY2spOworCisJd2hpbGUgKChkZWxmZCA9IGxvY2FsX2NsaWVudF9oZWFkLm5leHQpKSB7CisJCWxvY2FsX2NsaWVudF9oZWFkLm5leHQgPSBkZWxmZC0+bmV4dDsKKwkJLyogRmFpbGluZyBjbGVhbnVwX3pvbWJpZSBsZWFrcy4uLiAqLworCQlpZiAoZGVsZmQtPnR5cGUgPT0gTE9DQUxfU09DSyAmJiAhY2xlYW51cF96b21iaWUoZGVsZmQpKQorCQkJY21kX2NsaWVudF9jbGVhbnVwKGRlbGZkKTsgLyogY2FsbHMgc3luY191bmxvY2sgKi8KKwkJaWYgKGRlbGZkLT5mZCAhPSBsb2NhbF9zb2NrKQorCQkJc2FmZV9jbG9zZSgmKGRlbGZkLT5mZCkpOworCQlkbV9mcmVlKGRlbGZkKTsKKwl9CisKKwlERUJVR0xPRygiY2x1c3Rlcl9jbG9zZWRvd25cbiIpOworCWRlc3Ryb3lfbHZoYXNoKCk7CisJY2xvcHMtPmNsdXN0ZXJfY2xvc2Vkb3duKCk7CisKKwlyZXQgPSAwOworb3V0OgorCWRtX2hhc2hfZGVzdHJveShsdm1fcGFyYW1zLmV4Y2xfdXVpZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgY2x1c3RlciBsYXllciBoYXMgY29tcGxldGVkIGluaXRpYWxpc2F0aW9uLgorICAgV2Ugc2VuZCB0aGUgdmVyc2lvbiBtZXNzYWdlICovCit2b2lkIGNsdm1kX2NsdXN0ZXJfaW5pdF9jb21wbGV0ZWQodm9pZCkKK3sKKwlzZW5kX3ZlcnNpb25fbWVzc2FnZSgpOworfQorCisvKiBEYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCAqLworc3RhdGljIGludCBsb2NhbF9zb2NrX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKnRoaXNmZCwgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmNzaWQsCisJCQkgICAgICAgc3RydWN0IGxvY2FsX2NsaWVudCAqKm5ld19jbGllbnQpCit7CisJKm5ld19jbGllbnQgPSBOVUxMOworCXJldHVybiByZWFkX2Zyb21fbG9jYWxfc29jayh0aGlzZmQpOworfQorCisvKiBEYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCAqLworc3RhdGljIGludCBsb2NhbF9yZW5kZXp2b3VzX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKnRoaXNmZCwgY2hhciAqYnVmLAorCQkJCSAgICAgaW50IGxlbiwgY29uc3QgY2hhciAqY3NpZCwKKwkJCQkgICAgIHN0cnVjdCBsb2NhbF9jbGllbnQgKipuZXdfY2xpZW50KQoreworCS8qIFNvbWVvbmUgY29ubmVjdGVkIHRvIG91ciBsb2NhbCBzb2NrZXQsIGFjY2VwdCBpdC4gKi8KKworCXN0cnVjdCBzb2NrYWRkcl91biBzb2NrYTsKKwlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpuZXdmZDsKKwlzb2NrbGVuX3Qgc2wgPSBzaXplb2Yoc29ja2EpOworCWludCBjbGllbnRfZmQgPSBhY2NlcHQodGhpc2ZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29ja2EsICZzbCk7CisKKwlpZiAoY2xpZW50X2ZkID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQlyZXR1cm4gMTsKKworCWlmIChjbGllbnRfZmQgPj0gMCkgeworCQlpZiAoIShuZXdmZCA9IGRtX3phbGxvYyhzaXplb2YoKm5ld2ZkKSkpKSB7CisJCQlpZiAoY2xvc2UoY2xpZW50X2ZkKSkKKwkJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJzb2NrZXQiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcHRocmVhZF9jb25kX2luaXQoJm5ld2ZkLT5iaXRzLmxvY2Fsc29jay5jb25kLCBOVUxMKTsKKwkJcHRocmVhZF9tdXRleF9pbml0KCZuZXdmZC0+Yml0cy5sb2NhbHNvY2subXV0ZXgsIE5VTEwpOworCisJCWlmIChmY250bChjbGllbnRfZmQsIEZfU0VURkQsIDEpKQorCQkJREVCVUdMT0coIlNldHRpbmcgQ0xPRVhFQyBvbiBjbGllbnQgZmQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCQluZXdmZC0+ZmQgPSBjbGllbnRfZmQ7CisJCW5ld2ZkLT50eXBlID0gTE9DQUxfU09DSzsKKwkJbmV3ZmQtPmNhbGxiYWNrID0gbG9jYWxfc29ja19jYWxsYmFjazsKKwkJbmV3ZmQtPmJpdHMubG9jYWxzb2NrLmFsbF9zdWNjZXNzID0gMTsKKwkJREVCVUdMT0coIkdvdCBuZXcgY29ubmVjdGlvbiBvbiBmZCAlZCAoJXApXG4iLCBuZXdmZC0+ZmQsIG5ld2ZkKTsKKwkJKm5ld19jbGllbnQgPSBuZXdmZDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbG9jYWxfcGlwZV9jYWxsYmFjayhzdHJ1Y3QgbG9jYWxfY2xpZW50ICp0aGlzZmQsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBpbnQgbWF4bGVuLCBjb25zdCBjaGFyICpjc2lkLAorCQkJICAgICAgIHN0cnVjdCBsb2NhbF9jbGllbnQgKipuZXdfY2xpZW50KQoreworCWludCBsZW47CisJY2hhciBidWZmZXJbUElQRV9CVUZdOworCXN0cnVjdCBsb2NhbF9jbGllbnQgKnNvY2tfY2xpZW50ID0gdGhpc2ZkLT5iaXRzLnBpcGUuY2xpZW50OworCWludCBzdGF0dXMgPSAtMTsJLyogaW4gZXJyb3IgYnkgZGVmYXVsdCAqLworCisJbGVuID0gcmVhZCh0aGlzZmQtPmZkLCBidWZmZXIsIHNpemVvZihpbnQpKTsKKwlpZiAobGVuID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQlyZXR1cm4gMTsKKworCWlmIChsZW4gPT0gc2l6ZW9mKGludCkpCisJCW1lbWNweSgmc3RhdHVzLCBidWZmZXIsIHNpemVvZihpbnQpKTsKKworCURFQlVHTE9HKCJSZWFkIG9uIHBpcGUgJWQsICVkIGJ5dGVzLCBzdGF0dXMgJWRcbiIsCisJCSB0aGlzZmQtPmZkLCBsZW4sIHN0YXR1cyk7CisKKwkvKiBFT0Ygb24gcGlwZSBvciBhbiBlcnJvciwgY2xvc2UgaXQgKi8KKwlpZiAobGVuIDw9IDApIHsKKwkJdm9pZCAqcmV0ID0gJnN0YXR1czsKKwkJaWYgKGNsb3NlKHRoaXNmZC0+ZmQpKQorCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCAibG9jYWxfcGlwZSIpOworCisJCS8qIENsZWFyIG91dCB0aGUgY3Jvc3MtbGluayAqLworCQlpZiAodGhpc2ZkLT5iaXRzLnBpcGUuY2xpZW50KQorCQkJdGhpc2ZkLT5iaXRzLnBpcGUuY2xpZW50LT5iaXRzLmxvY2Fsc29jay5waXBlX2NsaWVudCA9IE5VTEw7CisKKwkJLyogUmVhcCBjaGlsZCB0aHJlYWQgKi8KKwkJaWYgKHRoaXNmZC0+Yml0cy5waXBlLnRocmVhZGlkKSB7CisJCQlpZiAoKGVycm5vID0gcHRocmVhZF9qb2luKHRoaXNmZC0+Yml0cy5waXBlLnRocmVhZGlkLCAmcmV0KSkpCisJCQkJbG9nX3N5c19lcnJvcigicHRocmVhZF9qb2luIiwgIiIpOworCisJCQl0aGlzZmQtPmJpdHMucGlwZS50aHJlYWRpZCA9IDA7CisJCQlpZiAodGhpc2ZkLT5iaXRzLnBpcGUuY2xpZW50KQorCQkJCXRoaXNmZC0+Yml0cy5waXBlLmNsaWVudC0+Yml0cy5sb2NhbHNvY2sudGhyZWFkaWQgPSAwOworCQl9CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlERUJVR0xPRygiQmFja2dyb3VuZCByb3V0aW5lIHN0YXR1cyB3YXMgJWQsIHNvY2tfY2xpZW50ICglcClcbiIsCisJCQkgc3RhdHVzLCBzb2NrX2NsaWVudCk7CisJCS8qIEJ1dCBoYXMgdGhlIGNsaWVudCBnb25lIGF3YXkgPz8gKi8KKwkJaWYgKCFzb2NrX2NsaWVudCkgeworCQkJREVCVUdMT0coIkdvdCBwaXBlIHJlc3BvbnNlIGZvciBkZWFkIGNsaWVudCwgaWdub3JpbmcgaXRcbiIpOworCQl9IGVsc2UgeworCQkJLyogSWYgZXJyb3IgdGhlbiBqdXN0IHJldHVybiB0aGF0IGNvZGUgKi8KKwkJCWlmIChzdGF0dXMpCisJCQkJc2VuZF9sb2NhbF9yZXBseShzb2NrX2NsaWVudCwgc3RhdHVzLAorCQkJCQkJIHNvY2tfY2xpZW50LT5mZCk7CisJCQllbHNlIHsKKwkJCQkvKiBGSVhNRTogY2xvc2VyIGluc3BlY3QgdGhpcyBjb2RlIHNpbmNlIHN0YXRlIGlzIHdyaXRlIHRocmVhZCBwcm90ZWN0ZWQgKi8KKwkJCQlwdGhyZWFkX211dGV4X2xvY2soJnNvY2tfY2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCQkJaWYgKHNvY2tfY2xpZW50LT5iaXRzLmxvY2Fsc29jay5zdGF0ZSA9PSBQT1NUX0NPTU1BTkQpIHsKKwkJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJnNvY2tfY2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCQkJCXNlbmRfbG9jYWxfcmVwbHkoc29ja19jbGllbnQsIDAsCisJCQkJCQkJIHNvY2tfY2xpZW50LT5mZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogUFJFX0NPTU1BTkQgZmluaXNoZWQuICovCisJCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzb2NrX2NsaWVudC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCQkJCQlpZiAoKHN0YXR1cyA9IGRpc3RyaWJ1dGVfY29tbWFuZChzb2NrX2NsaWVudCkpKQorCQkJCQkJc2VuZF9sb2NhbF9yZXBseShzb2NrX2NsaWVudCwgRUZCSUcsCisJCQkJCQkJCSBzb2NrX2NsaWVudC0+ZmQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBJZiBhIG5vZWQgaXMgdXAsIGxvb2sgZm9yIGl0IGluIHRoZSByZXBseSBhcnJheSwgaWYgaXQncyBub3QgdGhlcmUgdGhlbgorICAgYWRkIG9uZSB3aXRoICJFVElNRURPVVQiLgorICAgTk9URTogVGhpcyB3b24ndCByYWNlIHdpdGggcmVhbCByZXBsaWVzIGJlY2F1c2UgdGhleSBoYXBwZW4gaW4gdGhlIHNhbWUgdGhyZWFkLgorKi8KK3N0YXRpYyB2b2lkIHRpbWVkb3V0X2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqY3NpZCwKKwkJCSAgICAgIGludCBub2RlX3VwKQoreworCXN0cnVjdCBub2RlX3JlcGx5ICpyZXBseTsKKwljaGFyIG5vZGVuYW1lW21heF9jbHVzdGVyX21lbWJlcl9uYW1lX2xlbl07CisKKwlpZiAoIW5vZGVfdXApCisJCXJldHVybjsKKworCWNsb3BzLT5uYW1lX2Zyb21fY3NpZChjc2lkLCBub2RlbmFtZSk7CisJREVCVUdMT0coIkNoZWNraW5nIGZvciBhIHJlcGx5IGZyb20gJXNcbiIsIG5vZGVuYW1lKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCisJcmVwbHkgPSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLnJlcGxpZXM7CisJd2hpbGUgKHJlcGx5ICYmIHN0cmNtcChyZXBseS0+bm9kZSwgbm9kZW5hbWUpICE9IDApCisJCXJlcGx5ID0gcmVwbHktPm5leHQ7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmY2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisKKwlpZiAoIXJlcGx5KSB7CisJCURFQlVHTE9HKCJOb2RlICVzIHRpbWVkLW91dFxuIiwgbm9kZW5hbWUpOworCQlhZGRfcmVwbHlfdG9fbGlzdChjbGllbnQsIEVUSU1FRE9VVCwgY3NpZCwKKwkJCQkgICJDb21tYW5kIHRpbWVkIG91dCIsIDE4KTsKKwl9Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IGhhcyB0aW1lZCBvdXQgb24gYXQgbGVhc3Qgb25lIG5vZGUuIFdlIGZpbGwgaW4KKyAgIHRoZSByZW1haW5pbmcgbm9kZSBlbnRyaWVzIHdpdGggRVRJTUVET1VUIGFuZCByZXR1cm4uCisKKyAgIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlIHRoZSBub2RlIHRoYXQgY2F1c2VkCisgICB0aGUgdGltZW91dCBjb3VsZCBoYXZlIGdvbmUgZG93biwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIG5ldmVyIGdldCB0aGUgZXhwZWN0ZWQKKyAgIG51bWJlciBvZiByZXBsaWVzIHRoYXQgdHJpZ2dlcnMgdGhlIHBvc3QgY29tbWFuZCBzbyB3ZSBuZWVkIHRvIGRvIGl0IGhlcmUKKyovCitzdGF0aWMgdm9pZCByZXF1ZXN0X3RpbWVkX291dChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpCit7CisJREVCVUdMT0coIlJlcXVlc3QgdGltZWQtb3V0LiBwYWRkaW5nXG4iKTsKKwljbG9wcy0+Y2x1c3Rlcl9kb19ub2RlX2NhbGxiYWNrKGNsaWVudCwgdGltZWRvdXRfY2FsbGJhY2spOworCisJaWYgKCFjbGllbnQtPmJpdHMubG9jYWxzb2NrLnRocmVhZGlkKQorCQlyZXR1cm47CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCisJaWYgKCFjbGllbnQtPmJpdHMubG9jYWxzb2NrLmZpbmlzaGVkICYmCisJICAgIChjbGllbnQtPmJpdHMubG9jYWxzb2NrLm51bV9yZXBsaWVzICE9CisJICAgICBjbGllbnQtPmJpdHMubG9jYWxzb2NrLmV4cGVjdGVkX3JlcGxpZXMpKSB7CisJCS8qIFBvc3QtcHJvY2VzcyB0aGUgY29tbWFuZCAqLworCQljbGllbnQtPmJpdHMubG9jYWxzb2NrLnN0YXRlID0gUE9TVF9DT01NQU5EOworCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZjbGllbnQtPmJpdHMubG9jYWxzb2NrLmNvbmQpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmJpdHMubG9jYWxzb2NrLm11dGV4KTsKK30KKworLyogVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGhhcHBlbnMgKi8KK3N0YXRpYyB2b2lkIG1haW5fbG9vcChpbnQgY21kX3RpbWVvdXQpCit7CisJc2lnc2V0X3Qgc3M7CisKKwlERUJVR0xPRygiVXNpbmcgdGltZW91dCBvZiAlZCBzZWNvbmRzXG4iLCBjbWRfdGltZW91dCk7CisKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIFNJR0lOVCk7CisJc2lnYWRkc2V0KCZzcywgU0lHVEVSTSk7CisJcHRocmVhZF9zaWdtYXNrKFNJR19VTkJMT0NLLCAmc3MsIE5VTEwpOworCS8qIE1haW4gbG9vcCAqLworCXdoaWxlICghcXVpdCkgeworCQlmZF9zZXQgaW47CisJCWludCBzZWxlY3Rfc3RhdHVzOworCQlzdHJ1Y3QgbG9jYWxfY2xpZW50ICp0aGlzZmQ7CisJCXN0cnVjdCB0aW1ldmFsIHR2ID0geyBjbWRfdGltZW91dCwgMCB9OworCQlpbnQgcXVvcmF0ZSA9IGNsb3BzLT5pc19xdW9yYXRlKCk7CisJCWludCBjbGllbnRfY291bnQgPSAwOworCQlpbnQgbWF4X2ZkID0gMDsKKwkJc3RydWN0IGxvY2FsX2NsaWVudCAqbGFzdGZkID0gJmxvY2FsX2NsaWVudF9oZWFkOworCQlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpuZXh0ZmQgPSBsb2NhbF9jbGllbnRfaGVhZC5uZXh0OworCisJCS8qIFdhaXQgb24gdGhlIGNsdXN0ZXIgRkQgYW5kIGFsbCBsb2NhbCBzb2NrZXRzL3BpcGVzICovCisJCWxvY2FsX2NsaWVudF9oZWFkLmZkID0gY2xvcHMtPmdldF9tYWluX2NsdXN0ZXJfZmQoKTsKKwkJRkRfWkVSTygmaW4pOworCisJCWZvciAodGhpc2ZkID0gJmxvY2FsX2NsaWVudF9oZWFkOyB0aGlzZmQ7IHRoaXNmZCA9IHRoaXNmZC0+bmV4dCkgeworCQkJY2xpZW50X2NvdW50Kys7CisJCQltYXhfZmQgPSBtYXgobWF4X2ZkLCB0aGlzZmQtPmZkKTsKKwkJfQorCisJCWlmIChtYXhfZmQgPiBGRF9TRVRTSVpFIC0gMzIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogVGhlcmUgYXJlIHRvbyBtYW55IGNvbm5lY3Rpb25zIHRvIGNsdm1kLiAgSW52ZXN0aWdhdGUgYW5kIHRha2UgYWN0aW9uIG5vdyFcbiIpOworIAkJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogWW91ciBjbHVzdGVyIG1heSBmcmVlemUgdXAgaWYgdGhlIG51bWJlciBvZiBjbHZtZCBmaWxlIGRlc2NyaXB0b3JzICglZCkgZXhjZWVkcyAlZC5cbiIsIG1heF9mZCArIDEsIEZEX1NFVFNJWkUpOworCQl9CisKKwkJZm9yICh0aGlzZmQgPSAmbG9jYWxfY2xpZW50X2hlYWQ7IHRoaXNmZDsgdGhpc2ZkID0gbmV4dGZkLCBuZXh0ZmQgPSB0aGlzZmQgPyB0aGlzZmQtPm5leHQgOiBOVUxMKSB7CisKKwkJCWlmICh0aGlzZmQtPnJlbW92ZW1lICYmICFjbGVhbnVwX3pvbWJpZSh0aGlzZmQpKSB7CisJCQkJc3RydWN0IGxvY2FsX2NsaWVudCAqZnJlZV9mZCA9IHRoaXNmZDsKKwkJCQlsYXN0ZmQtPm5leHQgPSBuZXh0ZmQ7CisJCQkJREVCVUdMT0coInJlbW92ZW1lIHNldCBmb3IgJXAgd2l0aCAlZCBtb25pdG9yZWQgZmRzIHJlbWFpbmluZ1xuIiwgZnJlZV9mZCwgY2xpZW50X2NvdW50IC0gMSk7CisKKwkJCQkvKiBRdWV1ZSBjbGVhbnVwLCB0aGlzIGFsc28gZnJlZXMgdGhlIGNsaWVudCBzdHJ1Y3QgKi8KKwkJCQlhZGRfdG9fbHZtcXVldWUoZnJlZV9mZCwgTlVMTCwgMCwgTlVMTCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbGFzdGZkID0gdGhpc2ZkOworCisJCQlpZiAodGhpc2ZkLT5yZW1vdmVtZSkKKwkJCQljb250aW51ZTsKKworCQkJLyogaWYgdGhlIGNsdXN0ZXIgaXMgbm90IHF1b3JhdGUgdGhlbiBkb24ndCBsaXN0ZW4gZm9yIG5ldyByZXF1ZXN0cyAqLworCQkJaWYgKCh0aGlzZmQtPnR5cGUgIT0gTE9DQUxfUkVOREVaVk9VUyAmJgorCQkJICAgICB0aGlzZmQtPnR5cGUgIT0gTE9DQUxfU09DSykgfHwgcXVvcmF0ZSkKKwkJCQlpZiAodGhpc2ZkLT5mZCA8IEZEX1NFVFNJWkUpCisJCQkJCUZEX1NFVCh0aGlzZmQtPmZkLCAmaW4pOworCQl9CisKKwkJc2VsZWN0X3N0YXR1cyA9IHNlbGVjdChGRF9TRVRTSVpFLCAmaW4sIE5VTEwsIE5VTEwsICZ0dik7CisKKwkJaWYgKHJlcmVhZF9jb25maWcpIHsKKwkJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCisJCQlyZXJlYWRfY29uZmlnID0gMDsKKwkJCURFQlVHTE9HKCJnb3QgU0lHSFVQXG4iKTsKKwkJCWlmIChjbG9wcy0+cmVyZWFkX2NvbmZpZykKKwkJCQljbG9wcy0+cmVyZWFkX2NvbmZpZygpOworCQkJZXJybm8gPSBzYXZlZF9lcnJubzsKKwkJfQorCisJCWlmIChzZWxlY3Rfc3RhdHVzID4gMCkgeworCQkJY2hhciBjc2lkW01BWF9DU0lEX0xFTl07CisJCQljaGFyIGJ1ZlttYXhfY2x1c3Rlcl9tZXNzYWdlXTsKKworCQkJZm9yICh0aGlzZmQgPSAmbG9jYWxfY2xpZW50X2hlYWQ7IHRoaXNmZDsgdGhpc2ZkID0gdGhpc2ZkLT5uZXh0KSB7CisJCQkJaWYgKHRoaXNmZC0+ZmQgPCBGRF9TRVRTSVpFICYmIEZEX0lTU0VUKHRoaXNmZC0+ZmQsICZpbikpIHsKKwkJCQkJc3RydWN0IGxvY2FsX2NsaWVudCAqbmV3ZmQgPSBOVUxMOworCQkJCQlpbnQgcmV0OworCisJCQkJCS8qIEZJWE1FIFJlbW92ZSBmcm9tIG1haW4gdGhyZWFkIGluIGNhc2UgaXQgYmxvY2tzISAqLworCQkJCQkvKiBEbyBjYWxsYmFjayAqLworCQkJCQlyZXQgPSB0aGlzZmQtPmNhbGxiYWNrKHRoaXNmZCwgYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkJCQkgICAgICAgY3NpZCwgJm5ld2ZkKTsKKwkJCQkJLyogSWdub3JlIEVBR0FJTiAqLworCQkJCQlpZiAocmV0IDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkgeworCQkJCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQkJCS8qIEdvdCBlcnJvciBvciBFT0Y6IFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IHNhZmVseSAqLworCQkJCQlpZiAocmV0IDw9IDApIHsKKwkJCQkJCWludCB0eXBlID0gdGhpc2ZkLT50eXBlOworCisJCQkJCQkvKiBJZiB0aGUgY2x1c3RlciBzb2NrZXQgc2h1dHMgZG93biwgc28gZG8gd2UgKi8KKwkJCQkJCWlmICh0eXBlID09IENMVVNURVJfTUFJTl9TT0NLIHx8CisJCQkJCQkgICAgdHlwZSA9PSBDTFVTVEVSX0lOVEVSTkFMKQorCQkJCQkJCWdvdG8gY2xvc2Vkb3duOworCisJCQkJCQlERUJVR0xPRygicmV0ID09ICVkLCBlcnJubyA9ICVkLiByZW1vdmluZyBjbGllbnRcbiIsCisJCQkJCQkJIHJldCwgZXJybm8pOworCQkJCQkJdGhpc2ZkLT5yZW1vdmVtZSA9IDE7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIE5ldyBjbGllbnQuLi5zaW1wbHkgYWRkIGl0IHRvIHRoZSBsaXN0ICovCisJCQkJCWlmIChuZXdmZCkgeworCQkJCQkJbmV3ZmQtPm5leHQgPSB0aGlzZmQtPm5leHQ7CisJCQkJCQl0aGlzZmQtPm5leHQgPSBuZXdmZDsKKwkJCQkJCXRoaXNmZCA9IG5ld2ZkOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogU2VsZWN0IHRpbWVkIG91dC4gQ2hlY2sgZm9yIGNsaWVudHMgdGhhdCBoYXZlIGJlZW4gd2FpdGluZyB0b28gbG9uZyBmb3IgYSByZXNwb25zZSAqLworCQlpZiAoc2VsZWN0X3N0YXR1cyA9PSAwKSB7CisJCQl0aW1lX3QgdGhlX3RpbWUgPSB0aW1lKE5VTEwpOworCisJCQlmb3IgKHRoaXNmZCA9ICZsb2NhbF9jbGllbnRfaGVhZDsgdGhpc2ZkOyB0aGlzZmQgPSB0aGlzZmQtPm5leHQpIHsKKwkJCQlpZiAodGhpc2ZkLT50eXBlID09IExPQ0FMX1NPQ0sgJiYKKwkJCQkgICAgdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5zZW50X291dCAmJgorCQkJCSAgICAodGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5zZW50X3RpbWUgKyBjbWRfdGltZW91dCkgPCB0aGVfdGltZSAmJgorCQkJCSAgICB0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmV4cGVjdGVkX3JlcGxpZXMgIT0KKwkJCQkgICAgdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5udW1fcmVwbGllcykgeworCQkJCQkvKiBTZW5kIHRpbWVkIG91dCBtZXNzYWdlICsgcmVwbGllcyB3ZSBhbHJlYWR5IGhhdmUgKi8KKwkJCQkJREVCVUdMT0coIlJlcXVlc3QgdGltZWQtb3V0IChzZW5kOiAlbGQsIG5vdzogJWxkKVxuIiwKKwkJCQkJCSB0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnNlbnRfdGltZSwgdGhlX3RpbWUpOworCisJCQkJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suYWxsX3N1Y2Nlc3MgPSAwOworCisJCQkJCXJlcXVlc3RfdGltZWRfb3V0KHRoaXNmZCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzZWxlY3Rfc3RhdHVzIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgREVCVUcKKwkJCXBlcnJvcigic2VsZWN0IGVycm9yIik7CisJCQlleGl0KC0xKTsKKyNlbmRpZgorCQl9CisJfQorCisgICAgICBjbG9zZWRvd246CisJaWYgKHF1aXQpCisJCURFQlVHTE9HKCJTSUdURVJNIHJlY2VpdmVkXG4iKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIHZvaWQgd2FpdF9mb3JfY2hpbGQoaW50IGNfcGlwZSwgaW50IHRpbWVvdXQpCit7CisJaW50IGNoaWxkX3N0YXR1czsKKwlmZF9zZXQgZmRzOworCXN0cnVjdCB0aW1ldmFsIHR2ID0ge3RpbWVvdXQsIDB9OworCisJRkRfWkVSTygmZmRzKTsKKwlGRF9TRVQoY19waXBlLCAmZmRzKTsKKworCXN3aXRjaCAoc2VsZWN0KGNfcGlwZSsxLCAmZmRzLCBOVUxMLCBOVUxMLCB0aW1lb3V0PyAmdHY6IE5VTEwpKSB7CisJY2FzZSAwOgorCQlmcHJpbnRmKHN0ZGVyciwgImNsdm1kIHN0YXJ0dXAgdGltZWQgb3V0XG4iKTsKKwkJZXhpdChERkFJTF9USU1FT1VUKTsKKwljYXNlIDE6CisJCWlmIChyZWFkKGNfcGlwZSwgJmNoaWxkX3N0YXR1cywgc2l6ZW9mKGNoaWxkX3N0YXR1cykpICE9CisJCSAgICBzaXplb2YoY2hpbGRfc3RhdHVzKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJjbHZtZCBmYWlsZWQgaW4gaW5pdGlhbGlzYXRpb25cbiIpOworCQkJZXhpdChERkFJTF9JTklUKTsKKwkJfQorCisJCXN3aXRjaCAoY2hpbGRfc3RhdHVzKSB7CisJCWNhc2UgU1VDQ0VTUzoKKwkJCWJyZWFrOworCQljYXNlIERGQUlMX0lOSVQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgImNsdm1kIGZhaWxlZCBpbiBpbml0aWFsaXNhdGlvblxuIik7CisJCQlicmVhazsKKwkJY2FzZSBERkFJTF9MT0NBTF9TT0NLOgorCQkJZnByaW50ZihzdGRlcnIsICJjbHZtZCBjb3VsZCBub3QgY3JlYXRlIGxvY2FsIHNvY2tldFxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFub3RoZXIgY2x2bWQgaXMgcHJvYmFibHkgYWxyZWFkeSBydW5uaW5nXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIERGQUlMX0NMVVNURVJfSUY6CisJCQlmcHJpbnRmKHN0ZGVyciwgImNsdm1kIGNvdWxkIG5vdCBjb25uZWN0IHRvIGNsdXN0ZXIgbWFuYWdlclxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbnN1bHQgc3lzbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIERGQUlMX01BTExPQzoKKwkJCWZwcmludGYoc3RkZXJyLCAiY2x2bWQgZmFpbGVkLCBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiY2x2bWQgZmFpbGVkLCBlcnJvciB3YXMgJWRcbiIsIGNoaWxkX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlleGl0KGNoaWxkX3N0YXR1cyk7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJjbHZtZCBzdGFydHVwLCBzZWxlY3QgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdChERkFJTF9JTklUKTsKKwl9Cit9CisKKy8qCisgKiBGb3JrIGludG8gdGhlIGJhY2tncm91bmQgYW5kIGRldGFjaCBmcm9tIG91ciBwYXJlbnQgcHJvY2Vzcy4KKyAqIEluIHRoZSBpbnRlcmVzdHMgb2YgdXNlci1mcmllbmRsaW5lc3Mgd2Ugd2FpdCBmb3IgdGhlIGRhZW1vbgorICogdG8gY29tcGxldGUgaW5pdGlhbGlzYXRpb24gYmVmb3JlIHJldHVybmluZyBpdHMgc3RhdHVzCisgKiB0aGUgdGhlIHVzZXIuCisgKi8KK3N0YXRpYyB2b2lkIGJlX2RhZW1vbihpbnQgdGltZW91dCkKK3sKKwlpbnQgZGV2bnVsbCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJaWYgKGRldm51bGwgPT0gLTEpIHsKKwkJcGVycm9yKCJDYW4ndCBvcGVuIC9kZXYvbnVsbCIpOworCQlleGl0KDMpOworCX0KKworCWlmIChwaXBlKGNoaWxkX3BpcGUpKSB7CisJCXBlcnJvcigiRXJyb3IgY3JlYXRpbmcgcGlwZSIpOworCQlleGl0KDMpOworCX0KKworCXN3aXRjaCAoZm9yaygpKSB7CisJY2FzZSAtMToKKwkJcGVycm9yKCJjbHZtZDogY2FuJ3QgZm9yayIpOworCQlleGl0KDIpOworCisJY2FzZSAwOgkJLyogQ2hpbGQgKi8KKwkJKHZvaWQpIGNsb3NlKGNoaWxkX3BpcGVbMF0pOworCQlicmVhazsKKworCWRlZmF1bHQ6ICAgICAgIC8qIFBhcmVudCAqLworCQkodm9pZCkgY2xvc2UoY2hpbGRfcGlwZVsxXSk7CisJCXdhaXRfZm9yX2NoaWxkKGNoaWxkX3BpcGVbMF0sIHRpbWVvdXQpOworCX0KKworCS8qIERldGFjaCBvdXJzZWxmIGZyb20gdGhlIGNhbGxpbmcgZW52aXJvbm1lbnQgKi8KKwlpZiAoY2xvc2UoMCkgfHwgY2xvc2UoMSkgfHwgY2xvc2UoMikpIHsKKwkJcGVycm9yKCJFcnJvciBjbG9zaW5nIHRlcm1pbmFsIEZEcyIpOworCQlleGl0KDQpOworCX0KKwlzZXRzaWQoKTsKKworCWlmIChkdXAyKGRldm51bGwsIDApIDwgMCB8fCBkdXAyKGRldm51bGwsIDEpIDwgMAorCSAgICB8fCBkdXAyKGRldm51bGwsIDIpIDwgMCkgeworCQlwZXJyb3IoIkVycm9yIHNldHRpbmcgdGVybWluYWwgRkRzIHRvIC9kZXYvbnVsbCIpOworCQlsb2dfZXJyb3IoIkVycm9yIHNldHRpbmcgdGVybWluYWwgRkRzIHRvIC9kZXYvbnVsbDogJW0iKTsKKwkJZXhpdCg1KTsKKwl9CisJaWYgKChkZXZudWxsID4gU1RERVJSX0ZJTEVOTykgJiYgY2xvc2UoZGV2bnVsbCkpIHsKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCAiL2Rldi9udWxsIik7CisJCWV4aXQoNyk7CisJfQorCWlmIChjaGRpcigiLyIpKSB7CisJCWxvZ19lcnJvcigiRXJyb3Igc2V0dGluZyBjdXJyZW50IGRpcmVjdG9yeSB0byAvOiAlbSIpOworCQlleGl0KDYpOworCX0KK30KKworc3RhdGljIGludCB2ZXJpZnlfbWVzc2FnZShjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGNsdm1faGVhZGVyICpoID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKWJ1ZjsKKworCWlmIChsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgY2x2bV9oZWFkZXIpKSB7CisJCWxvZ19lcnJvcigidmVyaWZ5X21lc3NhZ2Ugc2hvcnQgbGVuICVkLiIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKGgtPmNtZCkgeworCWNhc2UgQ0xWTURfQ01EX1JFUExZOgorCWNhc2UgQ0xWTURfQ01EX1ZFUlNJT046CisJY2FzZSBDTFZNRF9DTURfR09BV0FZOgorCWNhc2UgQ0xWTURfQ01EX1RFU1Q6CisJY2FzZSBDTFZNRF9DTURfTE9DSzoKKwljYXNlIENMVk1EX0NNRF9VTkxPQ0s6CisJY2FzZSBDTFZNRF9DTURfTE9DS19MVjoKKwljYXNlIENMVk1EX0NNRF9MT0NLX1ZHOgorCWNhc2UgQ0xWTURfQ01EX0xPQ0tfUVVFUlk6CisJY2FzZSBDTFZNRF9DTURfUkVGUkVTSDoKKwljYXNlIENMVk1EX0NNRF9HRVRfQ0xVU1RFUk5BTUU6CisJY2FzZSBDTFZNRF9DTURfU0VUX0RFQlVHOgorCWNhc2UgQ0xWTURfQ01EX1ZHX0JBQ0tVUDoKKwljYXNlIENMVk1EX0NNRF9SRVNUQVJUOgorCWNhc2UgQ0xWTURfQ01EX1NZTkNfTkFNRVM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigidmVyaWZ5X21lc3NhZ2UgYmFkIGNtZCAleC4iLCBoLT5jbWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVE9ETzogd2UgbWF5IGJlIGFibGUgdG8gbmFycm93IGxlbi9mbGFncy9jbGllbnRpZC9hcmdsZW4gY2hlY2tzIGJhc2VkIG9uIGNtZCAqLworCisJaWYgKGgtPmZsYWdzICYgfihDTFZNRF9GTEFHX0xPQ0FMIHwgQ0xWTURfRkxBR19TWVNURU1MViB8IENMVk1EX0ZMQUdfTk9ERUVSUlMgfCBDTFZNRF9GTEFHX1JFTU9URSkpIHsKKwkJbG9nX2Vycm9yKCJ2ZXJpZnlfbWVzc2FnZSBiYWQgZmxhZ3MgJXguIiwgaC0+ZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGgtPmFyZ2xlbiA+IG1heF9jbHVzdGVyX21lc3NhZ2UpIHsKKwkJbG9nX2Vycm9yKCJ2ZXJpZnlfbWVzc2FnZSBiYWQgYXJnbGVuICV4IG1heCAlZC4iLCBoLT5hcmdsZW4sIG1heF9jbHVzdGVyX21lc3NhZ2UpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbWVzc2FnZShjaGFyICpidWYsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciByb3dbOF07CisJY2hhciBzdHJbOV07CisJaW50IGksIGogPSAwOworCisJc3RyWzhdID0gJ1wwJzsKKwlpZiAobGVuID4gMTI4KQorCQlsZW4gPSAxMjg7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJcm93W2pdID0gYnVmW2ldOworCQlzdHJbal0gPSAoaXNwcmludChidWZbaV0pKSA/IGJ1ZltpXSA6ICcgJzsKKworCQlpZiAoaSArIDEgPT0gbGVuKSB7CisJCQlmb3IgKDtqIDwgODsgKytqKSB7CisJCQkJcm93W2pdID0gMDsKKwkJCQlzdHJbal0gPSAnICc7CisJCQl9CisKKwkJCWxvZ19lcnJvcigiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IFslc10iLAorCQkJCSAgcm93WzBdLCByb3dbMV0sIHJvd1syXSwgcm93WzNdLCByb3dbNF0sIHJvd1s1XSwgcm93WzZdLCByb3dbN10sIHN0cik7CisJCQlqID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjbGVhbnVwX3pvbWJpZShzdHJ1Y3QgbG9jYWxfY2xpZW50ICp0aGlzZmQpCit7CisJaW50ICpzdGF0dXM7CisJc3RydWN0IGxvY2FsX2NsaWVudCAqcGlwZV9jbGllbnQ7CisKKwlpZiAodGhpc2ZkLT50eXBlICE9IExPQ0FMX1NPQ0spCisJCXJldHVybiAwOworCisJaWYgKCF0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmNsZWFudXBfbmVlZGVkKQorCQlyZXR1cm4gMDsKKworCURFQlVHTE9HKCJFT0Ygb24gbG9jYWwgc29ja2V0OiBpbnByb2dyZXNzPSVkXG4iLAorCQkgdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5pbl9wcm9ncmVzcyk7CisKKwlpZiAoKHBpcGVfY2xpZW50ID0gdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5waXBlX2NsaWVudCkpCisJCXBpcGVfY2xpZW50ID0gcGlwZV9jbGllbnQtPmJpdHMucGlwZS5jbGllbnQ7CisKKwkvKiBJZiB0aGUgY2xpZW50IHdlbnQgYXdheSBpbiBtaWQgY29tbWFuZCB0aGVuIHRpZHkgdXAgKi8KKwlpZiAodGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5pbl9wcm9ncmVzcykgeworCQlERUJVR0xPRygiU2VuZGluZyBTSUdVU1IyIHRvIHByZSZwb3N0IHRocmVhZCAoJXAgaW4tcHJvZ3Jlc3MpXG4iLCBwaXBlX2NsaWVudCk7CisJCXB0aHJlYWRfa2lsbCh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnRocmVhZGlkLCBTSUdVU1IyKTsKKwkJaWYgKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5tdXRleCkpCisJCQlyZXR1cm4gMTsKKwkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5zdGF0ZSA9IFBPU1RfQ09NTUFORDsKKwkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5maW5pc2hlZCA9IDE7CisJCXB0aHJlYWRfY29uZF9zaWduYWwoJnRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY29uZCk7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aGlzZmQtPmJpdHMubG9jYWxzb2NrLm11dGV4KTsKKworCQkvKiBGcmVlIGFueSB1bnNlbnQgYnVmZmVycyAqLworCQlmcmVlX3JlcGx5KHRoaXNmZCk7CisJfQorCisJLyogS2lsbCB0aGUgc3VidGhyZWFkICYgZnJlZSByZXNvdXJjZXMgKi8KKwlpZiAodGhpc2ZkLT5iaXRzLmxvY2Fsc29jay50aHJlYWRpZCkgeworCQlERUJVR0xPRygiV2FpdGluZyBmb3IgcHJlJnBvc3QgdGhyZWFkICglcClcbiIsIHBpcGVfY2xpZW50KTsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0aGlzZmQtPmJpdHMubG9jYWxzb2NrLm11dGV4KTsKKwkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5zdGF0ZSA9IFBSRV9DT01NQU5EOworCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmZpbmlzaGVkID0gMTsKKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5jb25kKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRoaXNmZC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCisJCWlmICgoZXJybm8gPSBwdGhyZWFkX2pvaW4odGhpc2ZkLT5iaXRzLmxvY2Fsc29jay50aHJlYWRpZCwKKwkJCQkJICAodm9pZCAqKikgJnN0YXR1cykpKQorCQkJbG9nX3N5c19lcnJvcigicHRocmVhZF9qb2luIiwgIiIpOworCisJCURFQlVHTE9HKCJKb2luZWQgcHJlJnBvc3QgdGhyZWFkXG4iKTsKKworCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnRocmVhZGlkID0gMDsKKworCQkvKiBSZW1vdmUgdGhlIHBpcGUgY2xpZW50ICovCisJCWlmICh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnBpcGVfY2xpZW50KSB7CisJCQlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpkZWxmZDsKKwkJCXN0cnVjdCBsb2NhbF9jbGllbnQgKmxhc3RmZDsKKworCQkJKHZvaWQpIGNsb3NlKHRoaXNmZC0+Yml0cy5sb2NhbHNvY2sucGlwZV9jbGllbnQtPmZkKTsJLyogQ2xvc2UgcGlwZSAqLworCQkJKHZvaWQpIGNsb3NlKHRoaXNmZC0+Yml0cy5sb2NhbHNvY2sucGlwZSk7CisKKwkJCS8qIFJlbW92ZSBwaXBlIGNsaWVudCAqLworCQkJZm9yIChsYXN0ZmQgPSAmbG9jYWxfY2xpZW50X2hlYWQ7IChkZWxmZCA9IGxhc3RmZC0+bmV4dCk7IGxhc3RmZCA9IGRlbGZkKQorCQkJCWlmICh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnBpcGVfY2xpZW50ID09IGRlbGZkKSB7CisJCQkJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2sucGlwZV9jbGllbnQgPSBOVUxMOworCQkJCQlsYXN0ZmQtPm5leHQgPSBkZWxmZC0+bmV4dDsKKwkJCQkJZG1fZnJlZShkZWxmZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCX0KKworCS8qIEZyZWUgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJZG1fZnJlZSh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmNtZCk7CisKKwlzYWZlX2Nsb3NlKCYodGhpc2ZkLT5mZCkpOworCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY2xlYW51cF9uZWVkZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgYSByZWFkIGZyb20gdGhlIGxvY2FsIHNvY2tldC4KKyAgIHdhcyBpbiB0aGUgbWFpbiBsb29wIGJ1dCBpdCdzIGdyb3duIHVwIGFuZCBpcyBhIGJpZyBnaXJsIG5vdyAqLworc3RhdGljIGludCByZWFkX2Zyb21fbG9jYWxfc29jayhzdHJ1Y3QgbG9jYWxfY2xpZW50ICp0aGlzZmQpCit7CisJaW50IGxlbjsKKwlpbnQgYXJnc2xlbjsKKwlpbnQgbWlzc2luZ19sZW47CisJY2hhciBidWZmZXJbUElQRV9CVUYgKyAxXTsKKwljaGFyIGNzaWRbTUFYX0NTSURfTEVOXTsKKwlpbnQgY29tbXNfcGlwZVsyXTsKKwlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpuZXdmZDsKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmluaGVhZGVyID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBidWZmZXI7CisJaW50IHN0YXR1czsKKworCWxlbiA9IHJlYWQodGhpc2ZkLT5mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEpOworCWlmIChsZW4gPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCXJldHVybiAxOworCisJREVCVUdMT0coIlJlYWQgb24gbG9jYWwgc29ja2V0ICVkLCBsZW4gPSAlZFxuIiwgdGhpc2ZkLT5mZCwgbGVuKTsKKworCWlmIChsZW4gJiYgdmVyaWZ5X21lc3NhZ2UoYnVmZmVyLCBsZW4pIDwgMCkgeworCQlsb2dfZXJyb3IoInJlYWRfZnJvbV9sb2NhbF9zb2NrIGZyb20gJWQgbGVuICVkIGJhZCB2ZXJpZnkuIiwKKwkJCSAgdGhpc2ZkLT5mZCwgbGVuKTsKKwkJZHVtcF9tZXNzYWdlKGJ1ZmZlciwgbGVuKTsKKwkJLyogZm9yY2UgZXJyb3IgaGFuZGxpbmcgYmVsb3cgKi8KKwkJbGVuID0gMDsKKwl9CisKKwkvKiBFT0Ygb3IgZXJyb3Igb24gc29ja2V0ICovCisJaWYgKGxlbiA8PSAwKSB7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY2xlYW51cF9uZWVkZWQgPSAxOworCQkodm9pZCkgY2xlYW51cF96b21iaWUodGhpc2ZkKTsgLyogaWdub3JlIGVycm9ycyBoZXJlICovCisJCXJldHVybiAwOworCX0KKworCWJ1ZmZlcltsZW5dID0gMDsgLyogRW5zdXJlIFwwIHRlcm1pbmF0ZWQgKi8KKworCS8qIEZpbGwgaW4gdGhlIGNsaWVudCBJRCAqLworCWluaGVhZGVyLT5jbGllbnRpZCA9IGh0b25sKHRoaXNmZC0+ZmQpOworCisJLyogSWYgd2UgYXJlIGFscmVhZHkgYnVzeSB0aGVuIHJldHVybiBhbiBlcnJvciAqLworCWlmICh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmluX3Byb2dyZXNzKSB7CisJCXN0cnVjdCBjbHZtX2hlYWRlciByZXBseSA9IHsKKwkJCS5jbWQgPSBDTFZNRF9DTURfUkVQTFksCisJCQkuc3RhdHVzID0gRUJVU1kKKwkJfTsKKwkJc2VuZF9tZXNzYWdlKCZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgb3VyX2NzaWQsIHRoaXNmZC0+ZmQsCisJCQkgICAgICJFcnJvciBzZW5kaW5nIEVCVVNZIHJlcGx5IHRvIGxvY2FsIHVzZXIiKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwkvKiBTZWUgaWYgd2UgaGF2ZSB0aGUgd2hvbGUgbWVzc2FnZSAqLworCWFyZ3NsZW4gPSBsZW4gLSBzdHJsZW4oaW5oZWFkZXItPm5vZGUpIC0gc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcik7CisJbWlzc2luZ19sZW4gPSBpbmhlYWRlci0+YXJnbGVuIC0gYXJnc2xlbjsKKworCWlmIChtaXNzaW5nX2xlbiA8IDApCisJCW1pc3NpbmdfbGVuID0gMDsKKworCS8qIFdlIG5lZWQgYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikgYnl0ZXMgaW4gYnVmZmVyICovCisJaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikgfHwgLyogQWxyZWFkeSBoYW5kbGVkIGluIHZlcmlmeV9tZXNzYWdlKCkgKi8KKwkgICAgYXJnc2xlbiA8IDAgfHwgbWlzc2luZ19sZW4gPiBNQVhfTUlTU0lOR19MRU4pIHsKKwkJc3RydWN0IGNsdm1faGVhZGVyIHJlcGx5ID0geworCQkJLmNtZCA9IENMVk1EX0NNRF9SRVBMWSwKKwkJCS5zdGF0dXMgPSBFSU5WQUwKKwkJfTsKKwkJc2VuZF9tZXNzYWdlKCZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgb3VyX2NzaWQsIHRoaXNmZC0+ZmQsCisJCQkgICAgICJFcnJvciBzZW5kaW5nIEVJTlZBTCByZXBseSB0byBsb2NhbCB1c2VyIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEZyZWUgYW55IG9sZCBidWZmZXIgc3BhY2UgKi8KKwlkbV9mcmVlKHRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY21kKTsKKworCS8qIFNhdmUgdGhlIG1lc3NhZ2UgKi8KKwlpZiAoISh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmNtZCA9IGRtX21hbGxvYyhsZW4gKyBtaXNzaW5nX2xlbikpKSB7CisJCXN0cnVjdCBjbHZtX2hlYWRlciByZXBseSA9IHsKKwkJCS5jbWQgPSBDTFZNRF9DTURfUkVQTFksCisJCQkuc3RhdHVzID0gRU5PTUVNCisJCX07CisJCXNlbmRfbWVzc2FnZSgmcmVwbHksIHNpemVvZihyZXBseSksIG91cl9jc2lkLCB0aGlzZmQtPmZkLAorCQkJICAgICAiRXJyb3Igc2VuZGluZyBFTk9NRU0gcmVwbHkgdG8gbG9jYWwgdXNlciIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KHRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY21kLCBidWZmZXIsIGxlbik7CisJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5jbWRfbGVuID0gbGVuICsgbWlzc2luZ19sZW47CisJaW5oZWFkZXIgPSAoc3RydWN0IGNsdm1faGVhZGVyICopIHRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY21kOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgZnVsbCBtZXNzYWdlIHRoZW4gcmVhZCB0aGUgcmVzdCBub3cgKi8KKwlpZiAobWlzc2luZ19sZW4pIHsKKwkJY2hhciAqYXJncHRyID0gaW5oZWFkZXItPm5vZGUgKyBzdHJsZW4oaW5oZWFkZXItPm5vZGUpICsgMTsKKworCQl3aGlsZSAobWlzc2luZ19sZW4gPiAwKSB7CisJCQlERUJVR0xPRygiZ290ICVkIGJ5dGVzLCBuZWVkIGFub3RoZXIgJWQgKHRvdGFsICVkKVxuIiwKKwkJCQkgYXJnc2xlbiwgbWlzc2luZ19sZW4sIGluaGVhZGVyLT5hcmdsZW4pOworCQkJbGVuID0gcmVhZCh0aGlzZmQtPmZkLCBhcmdwdHIgKyBhcmdzbGVuLCBtaXNzaW5nX2xlbik7CisJCQlpZiAobGVuID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobGVuIDw9IDApIHsKKwkJCQkvKiBFT0Ygb3IgZXJyb3Igb24gc29ja2V0ICovCisJCQkJREVCVUdMT0coIkVPRiBvbiBsb2NhbCBzb2NrZXRcbiIpOworCQkJCWRtX2ZyZWUodGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5jbWQpOworCQkJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY21kID0gTlVMTDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJbWlzc2luZ19sZW4gLT0gbGVuOworCQkJYXJnc2xlbiArPSBsZW47CisJCX0KKwl9CisKKwkvKiBPbmx5IHJ1biB0aGUgY29tbWFuZCBpZiBhbGwgdGhlIGNsdXN0ZXIgbm9kZXMgYXJlIHJ1bm5pbmcgQ0xWTUQgKi8KKwlpZiAoKChpbmhlYWRlci0+ZmxhZ3MgJiBDTFZNRF9GTEFHX0xPQ0FMKSA9PSAwKSAmJgorCSAgICAoY2hlY2tfYWxsX2Nsdm1kc19ydW5uaW5nKHRoaXNmZCkgPT0gLTEpKSB7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suZXhwZWN0ZWRfcmVwbGllcyA9IDA7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2subnVtX3JlcGxpZXMgPSAwOworCQlzZW5kX2xvY2FsX3JlcGx5KHRoaXNmZCwgRUhPU1RET1dOLCB0aGlzZmQtPmZkKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwkvKiBDaGVjayB0aGUgbm9kZSBuYW1lIGZvciB2YWxpZGl0eSAqLworCWlmIChpbmhlYWRlci0+bm9kZVswXSAmJiBjbG9wcy0+Y3NpZF9mcm9tX25hbWUoY3NpZCwgaW5oZWFkZXItPm5vZGUpKSB7CisJCS8qIEVycm9yLCBub2RlIGlzIG5vdCBpbiB0aGUgY2x1c3RlciAqLworCQlzdHJ1Y3QgY2x2bV9oZWFkZXIgcmVwbHkgPSB7CisJCQkuY21kID0gQ0xWTURfQ01EX1JFUExZLAorCQkJLnN0YXR1cyA9IEVOT0VOVAorCQl9OworCisJCURFQlVHTE9HKCJVbmtub3duIG5vZGU6ICclcydcbiIsIGluaGVhZGVyLT5ub2RlKTsKKwkJc2VuZF9tZXNzYWdlKCZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgb3VyX2NzaWQsIHRoaXNmZC0+ZmQsCisJCQkgICAgICJFcnJvciBzZW5kaW5nIEVOT0VOVCByZXBseSB0byBsb2NhbCB1c2VyIik7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suZXhwZWN0ZWRfcmVwbGllcyA9IDA7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2subnVtX3JlcGxpZXMgPSAwOworCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmluX3Byb2dyZXNzID0gRkFMU0U7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suc2VudF9vdXQgPSBGQUxTRTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdWJ0aHJlYWQgdGhlbiBqdXN0IHNpZ25hbCBpdCB0byBzdGFydCAqLworCWlmICh0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnRocmVhZGlkKSB7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suc3RhdGUgPSBQUkVfQ09NTUFORDsKKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5jb25kKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRoaXNmZC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCQlyZXR1cm4gbGVuOworCX0KKworCS8qIENyZWF0ZSBhIHBpcGUgYW5kIGFkZCB0aGUgcmVhZGluZyBlbmQgdG8gb3VyIEZEIGxpc3QgKi8KKwlpZiAocGlwZShjb21tc19waXBlKSkgeworCQlzdHJ1Y3QgY2x2bV9oZWFkZXIgcmVwbHkgPSB7CisJCQkuY21kID0gQ0xWTURfQ01EX1JFUExZLAorCQkJLnN0YXR1cyA9IEVCVVNZCisJCX07CisKKwkJREVCVUdMT0coIkNyZWF0aW5nIHBpcGUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJc2VuZF9tZXNzYWdlKCZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgb3VyX2NzaWQsIHRoaXNmZC0+ZmQsCisJCQkgICAgICJFcnJvciBzZW5kaW5nIEVCVVNZIHJlcGx5IHRvIGxvY2FsIHVzZXIiKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiAoIShuZXdmZCA9IGRtX3phbGxvYyhzaXplb2YoKm5ld2ZkKSkpKSB7CisJCXN0cnVjdCBjbHZtX2hlYWRlciByZXBseSA9IHsKKwkJCS5jbWQgPSBDTFZNRF9DTURfUkVQTFksCisJCQkuc3RhdHVzID0gRU5PTUVNCisJCX07CisKKwkJKHZvaWQpIGNsb3NlKGNvbW1zX3BpcGVbMF0pOworCQkodm9pZCkgY2xvc2UoY29tbXNfcGlwZVsxXSk7CisKKwkJc2VuZF9tZXNzYWdlKCZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgb3VyX2NzaWQsIHRoaXNmZC0+ZmQsCisJCQkgICAgICJFcnJvciBzZW5kaW5nIEVOT01FTSByZXBseSB0byBsb2NhbCB1c2VyIik7CisJCXJldHVybiBsZW47CisJfQorCisJREVCVUdMT0coIkNyZWF0aW5nIHBpcGUsIFslZCwgJWRdXG4iLCBjb21tc19waXBlWzBdLCBjb21tc19waXBlWzFdKTsKKworCWlmIChmY250bChjb21tc19waXBlWzBdLCBGX1NFVEZELCAxKSkKKwkJREVCVUdMT0coInNldHRpbmcgQ0xPRVhFQyBvbiBwaXBlWzBdIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZjbnRsKGNvbW1zX3BpcGVbMV0sIEZfU0VURkQsIDEpKQorCQlERUJVR0xPRygic2V0dGluZyBDTE9FWEVDIG9uIHBpcGVbMV0gZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCW5ld2ZkLT5mZCA9IGNvbW1zX3BpcGVbMF07CisJbmV3ZmQtPnR5cGUgPSBUSFJFQURfUElQRTsKKwluZXdmZC0+Y2FsbGJhY2sgPSBsb2NhbF9waXBlX2NhbGxiYWNrOworCW5ld2ZkLT5iaXRzLnBpcGUuY2xpZW50ID0gdGhpc2ZkOworCW5ld2ZkLT5uZXh0ID0gdGhpc2ZkLT5uZXh0OworCXRoaXNmZC0+bmV4dCA9IG5ld2ZkOworCisJLyogU3RvcmUgYSBjcm9zcyBsaW5rIHRvIHRoZSBwaXBlICovCisJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5waXBlX2NsaWVudCA9IG5ld2ZkOworCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2sucGlwZSA9IGNvbW1zX3BpcGVbMV07CisKKwkvKiBNYWtlIHN1cmUgdGhlIHRocmVhZCBoYXMgYSBjb3B5IG9mIGl0J3Mgb3duIElEICovCisJbmV3ZmQtPmJpdHMucGlwZS50aHJlYWRpZCA9IHRoaXNmZC0+Yml0cy5sb2NhbHNvY2sudGhyZWFkaWQ7CisKKwkvKiBSdW4gdGhlIHByZSByb3V0aW5lICovCisJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5pbl9wcm9ncmVzcyA9IFRSVUU7CisJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5zdGF0ZSA9IFBSRV9DT01NQU5EOworCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suY2xlYW51cF9uZWVkZWQgPSAxOworCURFQlVHTE9HKCJDcmVhdGluZyBwcmUmcG9zdCB0aHJlYWQgZm9yIHBpcGUgZmQgJWQgKCVwKVxuIiwgbmV3ZmQtPmZkLCBuZXdmZCk7CisJc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJnRoaXNmZC0+Yml0cy5sb2NhbHNvY2sudGhyZWFkaWQsCisJCQkJJnN0YWNrX2F0dHIsIHByZV9hbmRfcG9zdF90aHJlYWQsIHRoaXNmZCk7CisJREVCVUdMT0coIkNyZWF0ZWQgcHJlJnBvc3QgdGhyZWFkLCBzdGF0ZSA9ICVkXG4iLCBzdGF0dXMpOworCisJcmV0dXJuIGxlbjsKK30KKworLyogQWRkIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGNsdXN0ZXIgb3IgY29tbXMgaW50ZXJmYWNlIHRvCisgICBvdXIgbGlzdCBvZiBGRHMgZm9yIHNlbGVjdAorKi8KK2ludCBhZGRfY2xpZW50KHN0cnVjdCBsb2NhbF9jbGllbnQgKm5ld19jbGllbnQpCit7CisJbmV3X2NsaWVudC0+bmV4dCA9IGxvY2FsX2NsaWVudF9oZWFkLm5leHQ7CisJbG9jYWxfY2xpZW50X2hlYWQubmV4dCA9IG5ld19jbGllbnQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIHByZS1jb21tYW5kIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IC0gd2UKKyAgIG5vdyBleGVjdXRlIHRoZSByZWFsIGNvbW1hbmQgb24gYWxsIHRoZSByZXF1ZXN0ZWQgbm9kZXMgKi8KK3N0YXRpYyBpbnQgZGlzdHJpYnV0ZV9jb21tYW5kKHN0cnVjdCBsb2NhbF9jbGllbnQgKnRoaXNmZCkKK3sKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmluaGVhZGVyID0KKwkJKHN0cnVjdCBjbHZtX2hlYWRlciAqKSB0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmNtZDsKKwlpbnQgbGVuID0gdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5jbWRfbGVuOworCisJdGhpc2ZkLT54aWQgPSBnbG9iYWxfeGlkKys7CisJREVCVUdMT0coImRpc3RyaWJ1dGUgY29tbWFuZDogWElEID0gJWQsIGZsYWdzPTB4JXggKCVzJXMpXG4iLAorCQkgdGhpc2ZkLT54aWQsIGluaGVhZGVyLT5mbGFncywKKwkJKGluaGVhZGVyLT5mbGFncyAmIENMVk1EX0ZMQUdfTE9DQUwpID8gIkxPQ0FMIiA6ICIiLAorCQkoaW5oZWFkZXItPmZsYWdzICYgQ0xWTURfRkxBR19SRU1PVEUpID8gIlJFTU9URSIgOiAiIik7CisKKwkvKiBGb3J3YXJkIGl0IHRvIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyIGlmIG5lZWRlZCAqLworCWlmICghKGluaGVhZGVyLT5mbGFncyAmIENMVk1EX0ZMQUdfTE9DQUwpKSB7CisJCS8qIGlmIG5vZGUgaXMgZW1wdHkgdGhlbiBkbyBpdCBvbiB0aGUgd2hvbGUgY2x1c3RlciAqLworCQlpZiAoaW5oZWFkZXItPm5vZGVbMF0gPT0gJ1wwJykgeworCQkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5leHBlY3RlZF9yZXBsaWVzID0KKwkJCQljbG9wcy0+Z2V0X251bV9ub2RlcygpOworCQkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5udW1fcmVwbGllcyA9IDA7CisJCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLnNlbnRfdGltZSA9IHRpbWUoTlVMTCk7CisJCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmluX3Byb2dyZXNzID0gVFJVRTsKKwkJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suc2VudF9vdXQgPSBUUlVFOworCisJCQkvKgorCQkJICogU2VuZCB0byBsb2NhbCBub2RlIGZpcnN0LCBldmVuIGlmIENMVk1EX0ZMQUdfUkVNT1RFCisJCQkgKiBpcyBzZXQgc28gd2Ugc3RpbGwgZ2V0IGEgcmVwbHkgaWYgdGhpcyBpcyB0aGUKKwkJCSAqIG9ubHkgbm9kZS4KKwkJCSAqLworCQkJYWRkX3RvX2x2bXF1ZXVlKHRoaXNmZCwgaW5oZWFkZXIsIGxlbiwgTlVMTCk7CisKKwkJCURFQlVHTE9HKCJTZW5kaW5nIG1lc3NhZ2UgdG8gYWxsIGNsdXN0ZXIgbm9kZXNcbiIpOworCQkJaW5oZWFkZXItPnhpZCA9IHRoaXNmZC0+eGlkOworCQkJc2VuZF9tZXNzYWdlKGluaGVhZGVyLCBsZW4sIE5VTEwsIC0xLAorCQkJCSAgICAgIkVycm9yIGZvcndhcmRpbmcgbWVzc2FnZSB0byBjbHVzdGVyIik7CisJCX0gZWxzZSB7CisJCQkvKiBEbyBpdCBvbiBhIHNpbmdsZSBub2RlICovCisJCQljaGFyIGNzaWRbTUFYX0NTSURfTEVOXTsKKworCQkJaWYgKGNsb3BzLT5jc2lkX2Zyb21fbmFtZShjc2lkLCBpbmhlYWRlci0+bm9kZSkpCisJCQkJLyogVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgc28gc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCQlyZXR1cm4gMDsKKworCQkJLyogT0ssIGZvdW5kIGEgbm9kZS4uLiAqLworCQkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5pbl9wcm9ncmVzcyA9IFRSVUU7CisJCQl0aGlzZmQtPmJpdHMubG9jYWxzb2NrLmV4cGVjdGVkX3JlcGxpZXMgPSAxOworCQkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5udW1fcmVwbGllcyA9IDA7CisKKwkJCS8qIEFyZSB3ZSB0aGUgcmVxdWVzdGVkIG5vZGUgPz8gKi8KKwkJCWlmIChtZW1jbXAoY3NpZCwgb3VyX2NzaWQsIG1heF9jc2lkX2xlbikgPT0gMCkgeworCQkJCURFQlVHTE9HKCJEb2luZyBjb21tYW5kIG9uIGxvY2FsIG5vZGUgb25seVxuIik7CisJCQkJYWRkX3RvX2x2bXF1ZXVlKHRoaXNmZCwgaW5oZWFkZXIsIGxlbiwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCURFQlVHTE9HKCJTZW5kaW5nIG1lc3NhZ2UgdG8gc2luZ2xlIG5vZGU6ICVzXG4iLAorCQkJCQkgaW5oZWFkZXItPm5vZGUpOworCQkJCWluaGVhZGVyLT54aWQgPSB0aGlzZmQtPnhpZDsKKwkJCQlzZW5kX21lc3NhZ2UoaW5oZWFkZXIsIGxlbiwgY3NpZCwgLTEsCisJCQkJCSAgICAgIkVycm9yIGZvcndhcmRpbmcgbWVzc2FnZSB0byBjbHVzdGVyIG5vZGUiKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIExvY2FsIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBpZ25vcmUgbm9kZXMgKi8KKwkJdGhpc2ZkLT5iaXRzLmxvY2Fsc29jay5pbl9wcm9ncmVzcyA9IFRSVUU7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2suZXhwZWN0ZWRfcmVwbGllcyA9IDE7CisJCXRoaXNmZC0+Yml0cy5sb2NhbHNvY2subnVtX3JlcGxpZXMgPSAwOworCQlERUJVR0xPRygiRG9pbmcgY29tbWFuZCBleHBsaWNpdGx5IG9uIGxvY2FsIG5vZGUgb25seVxuIik7CisJCWFkZF90b19sdm1xdWV1ZSh0aGlzZmQsIGluaGVhZGVyLCBsZW4sIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBQcm9jZXNzIGEgY29tbWFuZCBmcm9tIGEgcmVtb3RlIG5vZGUgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JlbW90ZV9jb21tYW5kKHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLCBpbnQgbXNnbGVuLCBpbnQgZmQsCisJCQkgICAgCSAgIGNvbnN0IGNoYXIgKmNzaWQpCit7CisJY2hhciAqcmVwbHlhcmdzOworCWNoYXIgbm9kZW5hbWVbbWF4X2NsdXN0ZXJfbWVtYmVyX25hbWVfbGVuXTsKKwlpbnQgcmVwbHlsZW4gPSAwOworCWludCBidWZsZW4gPSBtYXhfY2x1c3Rlcl9tZXNzYWdlIC0gc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikgLSAxOworCWludCBzdGF0dXM7CisKKwkvKiBHZXQgdGhlIG5vZGUgbmFtZSBhcyB3ZSAvbWF5LyBuZWVkIGl0IGxhdGVyICovCisJY2xvcHMtPm5hbWVfZnJvbV9jc2lkKGNzaWQsIG5vZGVuYW1lKTsKKworCURFQlVHTE9HKCJwcm9jZXNzX3JlbW90ZV9jb21tYW5kICVzIGZvciBjbGllbnRpZCAweCV4IFhJRCAlZCBvbiBub2RlICVzXG4iLAorCQkgZGVjb2RlX2NtZChtc2ctPmNtZCksIG1zZy0+Y2xpZW50aWQsIG1zZy0+eGlkLCBub2RlbmFtZSk7CisKKwkvKiBDaGVjayBmb3IgR09BV0FZIGFuZCBzdWxrICovCisJaWYgKG1zZy0+Y21kID09IENMVk1EX0NNRF9HT0FXQVkpIHsKKwkJREVCVUdMT0coIlRvbGQgdG8gZ28gYXdheSBieSAlc1xuIiwgbm9kZW5hbWUpOworCQlsb2dfZXJyb3IoIlRvbGQgdG8gZ28gYXdheSBieSAlcy4iLCBub2RlbmFtZSk7CisJCWV4aXQoOTkpOworCX0KKworCS8qIFZlcnNpb24gY2hlY2sgaXMgaW50ZXJuYWwgLSBkb24ndCBib3RoZXIgZXhwb3NpbmcgaXQgaW4gY2x2bWQtY29tbWFuZC5jICovCisJaWYgKG1zZy0+Y21kID09IENMVk1EX0NNRF9WRVJTSU9OKSB7CisJCWludCB2ZXJzaW9uX251bXNbM107CisJCWNoYXIgbm9kZVsyNTZdOworCisJCW1lbWNweSh2ZXJzaW9uX251bXMsIG1zZy0+YXJncywgc2l6ZW9mKHZlcnNpb25fbnVtcykpOworCisJCWNsb3BzLT5uYW1lX2Zyb21fY3NpZChjc2lkLCBub2RlKTsKKwkJREVCVUdMT0coIlJlbW90ZSBub2RlICVzIGlzIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJCQkgbm9kZSwgbnRvaGwodmVyc2lvbl9udW1zWzBdKSwKKwkJCSBudG9obCh2ZXJzaW9uX251bXNbMV0pLCBudG9obCh2ZXJzaW9uX251bXNbMl0pKTsKKworCQlpZiAobnRvaGwodmVyc2lvbl9udW1zWzBdKSAhPSBDTFZNRF9NQUpPUl9WRVJTSU9OKSB7CisJCQlzdHJ1Y3QgY2x2bV9oZWFkZXIgYnllYnllbXNnID0geworCQkJCS5jbWQgPSBDTFZNRF9DTURfR09BV0FZCisJCQl9OworCisJCQlERUJVR0xPRygiVGVsbGluZyBub2RlICVzIHRvIGdvIGF3YXkgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgdmVyc2lvbiBudW1iZXJcbiIsCisJCQkJIG5vZGUpOworCQkJbG9nX25vdGljZSgiVGVsbGluZyBub2RlICVzIHRvIGdvIGF3YXkgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgdmVyc2lvbiBudW1iZXIgJWQuJWQuJWRcbiIsCisJCQkJICAgbm9kZSwgbnRvaGwodmVyc2lvbl9udW1zWzBdKSwKKwkJCQkgICBudG9obCh2ZXJzaW9uX251bXNbMV0pLCBudG9obCh2ZXJzaW9uX251bXNbMl0pKTsKKworCQkJY2xvcHMtPmNsdXN0ZXJfc2VuZF9tZXNzYWdlKCZieWVieWVtc2csIHNpemVvZihieWVieWVtc2cpLCBvdXJfY3NpZCwKKwkJCQkJCSAgICAiRXJyb3IgU2VuZGluZyBHT0FXQVkgbWVzc2FnZSIpOworCQl9IGVsc2UKKwkJCWNsb3BzLT5hZGRfdXBfbm9kZShjc2lkKTsKKworCQlyZXR1cm47CisJfQorCisJLyogQWxsb2NhdGUgYSBkZWZhdWx0IHJlcGx5IGJ1ZmZlciAqLworCWlmICgocmVwbHlhcmdzID0gZG1fbWFsbG9jKG1heF9jbHVzdGVyX21lc3NhZ2UgLSBzaXplb2Yoc3RydWN0IGNsdm1faGVhZGVyKSkpKQorCQkvKiBSdW4gdGhlIGNvbW1hbmQgKi8KKwkJLyogRklYTUU6IHVzYWdlIG9mIGluaXRfdGVzdCgpIGlzIHVucHJvdGVjdGVkICovCisJCXN0YXR1cyA9IGRvX2NvbW1hbmQoTlVMTCwgbXNnLCBtc2dsZW4sICZyZXBseWFyZ3MsCisJCQkJICAgIGJ1ZmxlbiwgJnJlcGx5bGVuKTsKKwllbHNlCisJCXN0YXR1cyA9IEVOT01FTTsKKworCS8qIElmIGl0IHdhc24ndCBhIHJlcGx5LCB0aGVuIHJlcGx5ICovCisJaWYgKG1zZy0+Y21kICE9IENMVk1EX0NNRF9SRVBMWSkgeworCQljaGFyICphZ2dyZXBseTsKKworCQlhZ2dyZXBseSA9IGRtX3JlYWxsb2MocmVwbHlhcmdzLCByZXBseWxlbiArIHNpemVvZihzdHJ1Y3QgY2x2bV9oZWFkZXIpKTsKKwkJaWYgKGFnZ3JlcGx5KSB7CisJCQlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmFnZ2hlYWQgPQorCQkJICAgIChzdHJ1Y3QgY2x2bV9oZWFkZXIgKikgYWdncmVwbHk7CisKKwkJCXJlcGx5YXJncyA9IGFnZ3JlcGx5OworCQkJLyogTW92ZSBpdCB1cCBzbyB0aGVyZSdzIHJvb20gZm9yIGEgaGVhZGVyIGluIGZyb250IG9mIHRoZSBkYXRhICovCisJCQltZW1tb3ZlKGFnZ3JlcGx5ICsgb2Zmc2V0b2Yoc3RydWN0IGNsdm1faGVhZGVyLCBhcmdzKSwKKwkJCQlyZXBseWFyZ3MsIHJlcGx5bGVuKTsKKworCQkJYWdnaGVhZC0+eGlkID0gbXNnLT54aWQ7CisJCQlhZ2doZWFkLT5jbWQgPSBDTFZNRF9DTURfUkVQTFk7CisJCQlhZ2doZWFkLT5zdGF0dXMgPSBzdGF0dXM7CisJCQlhZ2doZWFkLT5mbGFncyA9IDA7CisJCQlhZ2doZWFkLT5jbGllbnRpZCA9IG1zZy0+Y2xpZW50aWQ7CisJCQlhZ2doZWFkLT5hcmdsZW4gPSByZXBseWxlbjsKKwkJCWFnZ2hlYWQtPm5vZGVbMF0gPSAnXDAnOworCQkJc2VuZF9tZXNzYWdlKGFnZ3JlcGx5LCBzaXplb2Yoc3RydWN0IGNsdm1faGVhZGVyKSArIHJlcGx5bGVuLAorCQkJCSAgICAgY3NpZCwgZmQsICJFcnJvciBzZW5kaW5nIGNvbW1hbmQgcmVwbHkiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJldHVybiBhIGZhaWx1cmUgcmVzcG9uc2UgKi8KKwkJCXN0cnVjdCBjbHZtX2hlYWRlciByZXBseSA9IHsKKwkJCQkuY21kID0gQ0xWTURfQ01EX1JFUExZLAorCQkJCS5zdGF0dXMgPSBFTk9NRU0sCisJCQkJLmNsaWVudGlkID0gbXNnLT5jbGllbnRpZAorCQkJfTsKKwkJCURFQlVHTE9HKCJFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWxsb2MgcmV0dXJuIGJ1ZmZlclxuIik7CisJCQlzZW5kX21lc3NhZ2UoJnJlcGx5LCBzaXplb2YocmVwbHkpLCBjc2lkLCBmZCwKKwkJCQkgICAgICJFcnJvciBzZW5kaW5nIEVOT01FTSBjb21tYW5kIHJlcGx5Iik7CisJCX0KKwl9CisKKwlkbV9mcmVlKHJlcGx5YXJncyk7Cit9CisKKy8qIEFkZCBhIHJlcGx5IHRvIGEgY29tbWFuZCB0byB0aGUgbGlzdCBvZiByZXBsaWVzIGZvciB0aGlzIGNsaWVudC4KKyAgIElmIHdlIGhhdmUgZ290IGEgZnVsbCBzZXQgdGhlbiBzZW5kIHRoZW0gdG8gdGhlIHdhaXRpbmcgY2xpZW50IGRvd24gdGhlIGxvY2FsCisgICBzb2NrZXQgKi8KK3N0YXRpYyB2b2lkIGFkZF9yZXBseV90b19saXN0KHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgaW50IHN0YXR1cywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmNzaWQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgbm9kZV9yZXBseSAqcmVwbHk7CisKKwkvKiBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcmVwbGllcyAqLworCWlmICghKHJlcGx5ID0gZG1femFsbG9jKHNpemVvZigqcmVwbHkpKSkpIHsKKwkJLyogSXQncyBhbGwgZ29uZSBob3JyaWJseSB3cm9uZy4uLiAqLworCQlzZW5kX2xvY2FsX3JlcGx5KGNsaWVudCwgRU5PTUVNLCBjbGllbnQtPmZkKTsKKwkJcmV0dXJuOworCX0KKworCXJlcGx5LT5zdGF0dXMgPSBzdGF0dXM7CisJY2xvcHMtPm5hbWVfZnJvbV9jc2lkKGNzaWQsIHJlcGx5LT5ub2RlKTsKKwlERUJVR0xPRygiUmVwbHkgZnJvbSBub2RlICVzOiAlZCBieXRlc1xuIiwgcmVwbHktPm5vZGUsIGxlbik7CisKKwlpZiAobGVuID4gMCkgeworCQlpZiAoIShyZXBseS0+cmVwbHltc2cgPSBkbV9tYWxsb2MobGVuKSkpCisJCQlyZXBseS0+c3RhdHVzID0gRU5PTUVNOworCQllbHNlCisJCQltZW1jcHkocmVwbHktPnJlcGx5bXNnLCBidWYsIGxlbik7CisJfSBlbHNlCisJCXJlcGx5LT5yZXBseW1zZyA9IE5VTEw7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCisJaWYgKGNsaWVudC0+Yml0cy5sb2NhbHNvY2suZmluaXNoZWQpIHsKKwkJZG1fZnJlZShyZXBseS0+cmVwbHltc2cpOworCQlkbV9mcmVlKHJlcGx5KTsKKwl9IGVsc2UgeworCQkvKiBIb29rIGl0IG9udG8gdGhlIHJlcGx5IGNoYWluICovCisJCXJlcGx5LT5uZXh0ID0gY2xpZW50LT5iaXRzLmxvY2Fsc29jay5yZXBsaWVzOworCQljbGllbnQtPmJpdHMubG9jYWxzb2NrLnJlcGxpZXMgPSByZXBseTsKKworCQkvKiBJZiB3ZSBoYXZlIHRoZSB3aG9sZSBsb3QgdGhlbiBkbyB0aGUgcG9zdC1wcm9jZXNzICovCisJCS8qIFBvc3QtcHJvY2VzcyB0aGUgY29tbWFuZCAqLworCQlpZiAoKytjbGllbnQtPmJpdHMubG9jYWxzb2NrLm51bV9yZXBsaWVzID09CisJCSAgICBjbGllbnQtPmJpdHMubG9jYWxzb2NrLmV4cGVjdGVkX3JlcGxpZXMpIHsKKwkJCWNsaWVudC0+Yml0cy5sb2NhbHNvY2suc3RhdGUgPSBQT1NUX0NPTU1BTkQ7CisJCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZjbGllbnQtPmJpdHMubG9jYWxzb2NrLmNvbmQpOworCQl9CisJCURFQlVHTE9HKCJHb3QgJWQgcmVwbGllcywgZXhwZWN0aW5nOiAlZFxuIiwKKwkJCSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLm51bV9yZXBsaWVzLAorCQkJIGNsaWVudC0+Yml0cy5sb2NhbHNvY2suZXhwZWN0ZWRfcmVwbGllcyk7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmJpdHMubG9jYWxzb2NrLm11dGV4KTsKK30KKworLyogVGhpcyBpcyB0aGUgdGhyZWFkIHRoYXQgcnVucyB0aGUgUFJFIGFuZCBwb3N0IGNvbW1hbmRzIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiAqLworc3RhdGljIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIHZvaWQgKnByZV9hbmRfcG9zdF90aHJlYWQodm9pZCAqYXJnKQoreworCXN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCA9IChzdHJ1Y3QgbG9jYWxfY2xpZW50ICopIGFyZzsKKwlpbnQgc3RhdHVzOworCWludCB3cml0ZV9zdGF0dXM7CisJc2lnc2V0X3Qgc3M7CisJaW50IHBpcGVfZmQgPSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLnBpcGU7CisKKwlERUJVR0xPRygiUHJlJnBvc3QgdGhyZWFkICglcCksIHBpcGUgZmQgJWRcbiIsIGNsaWVudCwgcGlwZV9mZCk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZjbGllbnQtPmJpdHMubG9jYWxzb2NrLm11dGV4KTsKKworCS8qIElnbm9yZSBTSUdVU1IxIChoYW5kbGVkIGJ5IG1hc3RlciBwcm9jZXNzKSBidXQgZW5hYmxlCisJICAgU0lHVVNSMiAoa2lsbHMgc3VidGhyZWFkcykgKi8KKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIFNJR1VTUjEpOworCXB0aHJlYWRfc2lnbWFzayhTSUdfQkxPQ0ssICZzcywgTlVMTCk7CisKKwlzaWdkZWxzZXQoJnNzLCBTSUdVU1IxKTsKKwlzaWdhZGRzZXQoJnNzLCBTSUdVU1IyKTsKKwlwdGhyZWFkX3NpZ21hc2soU0lHX1VOQkxPQ0ssICZzcywgTlVMTCk7CisKKwkvKiBMb29wIGFyb3VuZCBkb2luZyBQUkUgYW5kIFBPU1QgZnVuY3Rpb25zIHVudGlsIHRoZSBjbGllbnQgZ29lcyBhd2F5ICovCisJd2hpbGUgKCFjbGllbnQtPmJpdHMubG9jYWxzb2NrLmZpbmlzaGVkKSB7CisJCS8qIEV4ZWN1dGUgdGhlIGNvZGUgKi8KKwkJLyogRklYTUU6IHVzYWdlIG9mIGluaXRfdGVzdCgpIGlzIHVucHJvdGVjdGVkIGFzIGluIGRvX2NvbW1hbmQoKSAqLworCQlpZiAoKHN0YXR1cyA9IGRvX3ByZV9jb21tYW5kKGNsaWVudCkpKQorCQkJY2xpZW50LT5iaXRzLmxvY2Fsc29jay5hbGxfc3VjY2VzcyA9IDA7CisKKwkJREVCVUdMT0coIlByZSZwb3N0IHRocmVhZCAoJXApIHdyaXRlcyBzdGF0dXMgJWQgZG93biB0byBwaXBlIGZkICVkXG4iLAorCQkJIGNsaWVudCwgc3RhdHVzLCBwaXBlX2ZkKTsKKworCQkvKiBUZWxsIHRoZSBwYXJlbnQgcHJvY2VzcyB3ZSBoYXZlIGZpbmlzaGVkIHRoaXMgYml0ICovCisJCXdoaWxlICgod3JpdGVfc3RhdHVzID0gd3JpdGUocGlwZV9mZCwgJnN0YXR1cywgc2l6ZW9mKGludCkpKSAhPSBzaXplb2YoaW50KSkKKwkJCWlmICh3cml0ZV9zdGF0dXMgPj0wIHx8IChlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pKSB7CisJCQkJbG9nX2Vycm9yKCJFcnJvciBzZW5kaW5nIHRvIHBpcGU6ICVtIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKHN0YXR1cykgeworCQkJY2xpZW50LT5iaXRzLmxvY2Fsc29jay5zdGF0ZSA9IFBPU1RfQ09NTUFORDsKKwkJCWdvdG8gbmV4dF9wcmU7CisJCX0KKworCQkvKiBXZSBtYXkgbmVlZCB0byB3YWl0IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIHRoZSBwb3N0IGNvbW1hbmQgKi8KKwkJaWYgKGNsaWVudC0+Yml0cy5sb2NhbHNvY2suc3RhdGUgIT0gUE9TVF9DT01NQU5EICYmCisJCSAgICAhY2xpZW50LT5iaXRzLmxvY2Fsc29jay5maW5pc2hlZCkgeworCQkJREVCVUdMT0coIlByZSZwb3N0IHRocmVhZCAoJXApIHdhaXRpbmcgdG8gZG8gcG9zdCBjb21tYW5kLCBzdGF0ZSA9ICVkXG4iLAorCQkJCSBjbGllbnQsIGNsaWVudC0+Yml0cy5sb2NhbHNvY2suc3RhdGUpOworCQkJcHRocmVhZF9jb25kX3dhaXQoJmNsaWVudC0+Yml0cy5sb2NhbHNvY2suY29uZCwKKwkJCQkJICAmY2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCX0KKworCQlERUJVR0xPRygiUHJlJnBvc3QgdGhyZWFkICglcCkgZ290IHBvc3QgY29tbWFuZCBjb25kaXRpb24uLi5cbiIsIGNsaWVudCk7CisKKwkJLyogUE9TVCBmdW5jdGlvbiBtdXN0IGFsd2F5cyBydW4sIGV2ZW4gaWYgdGhlIGNsaWVudCBhYm9ydHMgKi8KKwkJc3RhdHVzID0gMDsKKwkJZG9fcG9zdF9jb21tYW5kKGNsaWVudCk7CisKKwkJd2hpbGUgKCh3cml0ZV9zdGF0dXMgPSB3cml0ZShwaXBlX2ZkLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpICE9IHNpemVvZihpbnQpKQorCQkJaWYgKHdyaXRlX3N0YXR1cyA+PTAgfHwgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikpIHsKKwkJCQlsb2dfZXJyb3IoIkVycm9yIHNlbmRpbmcgdG8gcGlwZTogJW0iKTsKKwkJCQlicmVhazsKKwkJCX0KK25leHRfcHJlOgorCQlpZiAoY2xpZW50LT5iaXRzLmxvY2Fsc29jay5zdGF0ZSAhPSBQUkVfQ09NTUFORCAmJgorCQkgICAgIWNsaWVudC0+Yml0cy5sb2NhbHNvY2suZmluaXNoZWQpIHsKKwkJCURFQlVHTE9HKCJQcmUmcG9zdCB0aHJlYWQgKCVwKSB3YWl0aW5nIGZvciBuZXh0IHByZSBjb21tYW5kXG4iLCBjbGllbnQpOworCQkJcHRocmVhZF9jb25kX3dhaXQoJmNsaWVudC0+Yml0cy5sb2NhbHNvY2suY29uZCwKKwkJCQkJICAmY2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCX0KKworCQlERUJVR0xPRygiUHJlJnBvc3QgdGhyZWFkICglcCkgZ290IHByZSBjb21tYW5kIGNvbmRpdGlvbi4uLlxuIiwgY2xpZW50KTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudC0+Yml0cy5sb2NhbHNvY2subXV0ZXgpOworCURFQlVHTE9HKCJQcmUmcG9zdCB0aHJlYWQgKCVwKSBmaW5pc2hlZFxuIiwgY2xpZW50KTsKKworCXB0aHJlYWRfZXhpdChOVUxMKTsKK30KKworLyogUHJvY2VzcyBhIGNvbW1hbmQgb24gdGhlIGxvY2FsIG5vZGUgYW5kIHN0b3JlIHRoZSByZXN1bHQgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19sb2NhbF9jb21tYW5kKHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLCBpbnQgbXNnbGVuLAorCQkJCSBzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsCisJCQkJIHVuc2lnbmVkIHNob3J0IHhpZCkKK3sKKwljaGFyICpyZXBseWJ1ZjsKKwlpbnQgYnVmbGVuID0gbWF4X2NsdXN0ZXJfbWVzc2FnZSAtIHNpemVvZihzdHJ1Y3QgY2x2bV9oZWFkZXIpIC0gMTsKKwlpbnQgcmVwbHlsZW4gPSAwOworCWludCBzdGF0dXM7CisKKwlpZiAoIShyZXBseWJ1ZiA9IGRtX21hbGxvYyhtYXhfY2x1c3Rlcl9tZXNzYWdlKSkpCisJCXJldHVybiAtMTsKKworCURFQlVHTE9HKCJwcm9jZXNzX2xvY2FsX2NvbW1hbmQ6ICVzIG1zZz0lcCwgbXNnbGVuID0lZCwgY2xpZW50PSVwXG4iLAorCQkgZGVjb2RlX2NtZChtc2ctPmNtZCksIG1zZywgbXNnbGVuLCBjbGllbnQpOworCisJLyogSWYgcmVtb3RlIGZsYWcgaXMgc2V0LCBqdXN0IHNldCBhIHN1Y2Nlc3NmdWwgc3RhdHVzIGNvZGUuICovCisJaWYgKG1zZy0+ZmxhZ3MgJiBDTFZNRF9GTEFHX1JFTU9URSkKKwkJc3RhdHVzID0gMDsKKwllbHNlCisJCXN0YXR1cyA9IGRvX2NvbW1hbmQoY2xpZW50LCBtc2csIG1zZ2xlbiwgJnJlcGx5YnVmLCBidWZsZW4sICZyZXBseWxlbik7CisKKwlpZiAoc3RhdHVzKQorCQljbGllbnQtPmJpdHMubG9jYWxzb2NrLmFsbF9zdWNjZXNzID0gMDsKKworCS8qIElmIHdlIHRvb2sgdG9vIGxvbmcgdGhlbiBkaXNjYXJkIHRoZSByZXBseSAqLworCWlmICh4aWQgPT0gY2xpZW50LT54aWQpCisJCWFkZF9yZXBseV90b19saXN0KGNsaWVudCwgc3RhdHVzLCBvdXJfY3NpZCwgcmVwbHlidWYsIHJlcGx5bGVuKTsKKwllbHNlCisJCURFQlVHTE9HKCJMb2NhbCBjb21tYW5kIHRvb2sgdG9vIGxvbmcsIGRpc2NhcmRpbmcgeGlkICVkLCBjdXJyZW50IGlzICVkXG4iLAorCQkJIHhpZCwgY2xpZW50LT54aWQpOworCisJZG1fZnJlZShyZXBseWJ1Zik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmVwbHkoY29uc3Qgc3RydWN0IGNsdm1faGVhZGVyICptc2csIGludCBtc2dsZW4sIGNvbnN0IGNoYXIgKmNzaWQpCit7CisJc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50OworCisJaWYgKCEoY2xpZW50ID0gZmluZF9jbGllbnQobXNnLT5jbGllbnRpZCkpKSB7CisJCURFQlVHTE9HKCJHb3QgbWVzc2FnZSBmb3IgdW5rbm93biBjbGllbnQgMHgleFxuIiwKKwkJCSBtc2ctPmNsaWVudGlkKTsKKwkJbG9nX2Vycm9yKCJHb3QgbWVzc2FnZSBmb3IgdW5rbm93biBjbGllbnQgMHgleC4iLAorCQkJICBtc2ctPmNsaWVudGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtc2ctPnN0YXR1cykKKwkJY2xpZW50LT5iaXRzLmxvY2Fsc29jay5hbGxfc3VjY2VzcyA9IDA7CisKKwkvKiBHYXRoZXIgcmVwbGllcyB0b2dldGhlciBmb3IgdGhpcyBjbGllbnQgaWQgKi8KKwlpZiAobXNnLT54aWQgPT0gY2xpZW50LT54aWQpCisJCWFkZF9yZXBseV90b19saXN0KGNsaWVudCwgbXNnLT5zdGF0dXMsIGNzaWQsIG1zZy0+YXJncywKKwkJCQkgIG1zZy0+YXJnbGVuKTsKKwllbHNlCisJCURFQlVHTE9HKCJEaXNjYXJkaW5nIHJlcGx5IHdpdGggb2xkIFhJRCAlZCwgY3VycmVudCA9ICVkXG4iLAorCQkJIG1zZy0+eGlkLCBjbGllbnQtPnhpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhbiBhZ2dyZWdhdGVkIHJlcGx5IGJhY2sgdG8gdGhlIGNsaWVudCAqLworc3RhdGljIHZvaWQgc2VuZF9sb2NhbF9yZXBseShzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsIGludCBzdGF0dXMsIGludCBmZCkKK3sKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmNsaWVudHJlcGx5OworCXN0cnVjdCBub2RlX3JlcGx5ICp0aGlzcmVwbHkgPSBjbGllbnQtPmJpdHMubG9jYWxzb2NrLnJlcGxpZXM7CisJY2hhciAqcmVwbHlidWY7CisJY2hhciAqcHRyOworCWludCBtZXNzYWdlX2xlbiA9IDA7CisKKwlERUJVR0xPRygiU2VuZCBsb2NhbCByZXBseVxuIik7CisKKwkvKiBXb3JrIG91dCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcmVwbHkgKi8KKwl3aGlsZSAodGhpc3JlcGx5KSB7CisJCWlmICh0aGlzcmVwbHktPnJlcGx5bXNnKQorCQkJbWVzc2FnZV9sZW4gKz0gc3RybGVuKHRoaXNyZXBseS0+cmVwbHltc2cpICsgMTsKKwkJZWxzZQorCQkJbWVzc2FnZV9sZW4rKzsKKworCQltZXNzYWdlX2xlbiArPSBzdHJsZW4odGhpc3JlcGx5LT5ub2RlKSArIDEgKyBzaXplb2YoaW50KTsKKworCQl0aGlzcmVwbHkgPSB0aGlzcmVwbHktPm5leHQ7CisJfQorCisJLyogQWRkIGluIHRoZSBzaXplIG9mIG91ciBoZWFkZXIgKi8KKwltZXNzYWdlX2xlbiA9IG1lc3NhZ2VfbGVuICsgc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcik7CisJaWYgKCEocmVwbHlidWYgPSBkbV9tYWxsb2MobWVzc2FnZV9sZW4pKSkgeworCQlERUJVR0xPRygiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHNcbiIpOworCQlyZXR1cm47CisJfQorCisJY2xpZW50cmVwbHkgPSAoc3RydWN0IGNsdm1faGVhZGVyICopIHJlcGx5YnVmOworCWNsaWVudHJlcGx5LT5zdGF0dXMgPSBzdGF0dXM7CisJY2xpZW50cmVwbHktPmNtZCA9IENMVk1EX0NNRF9SRVBMWTsKKwljbGllbnRyZXBseS0+bm9kZVswXSA9ICdcMCc7CisJY2xpZW50cmVwbHktPnhpZCA9IDA7CisJY2xpZW50cmVwbHktPmNsaWVudGlkID0gMDsKKwljbGllbnRyZXBseS0+ZmxhZ3MgPSAwOworCisJcHRyID0gY2xpZW50cmVwbHktPmFyZ3M7CisKKwkvKiBBZGQgaW4gYWxsIHRoZSByZXBsaWVzLCBhbmQgZnJlZSB0aGVtIGFzIHdlIGdvICovCisJdGhpc3JlcGx5ID0gY2xpZW50LT5iaXRzLmxvY2Fsc29jay5yZXBsaWVzOworCXdoaWxlICh0aGlzcmVwbHkpIHsKKwkJc3RydWN0IG5vZGVfcmVwbHkgKnRlbXByZXBseSA9IHRoaXNyZXBseTsKKworCQlzdHJjcHkocHRyLCB0aGlzcmVwbHktPm5vZGUpOworCQlwdHIgKz0gc3RybGVuKHRoaXNyZXBseS0+bm9kZSkgKyAxOworCisJCWlmICh0aGlzcmVwbHktPnN0YXR1cykKKwkJCWNsaWVudHJlcGx5LT5mbGFncyB8PSBDTFZNRF9GTEFHX05PREVFUlJTOworCisJCW1lbWNweShwdHIsICZ0aGlzcmVwbHktPnN0YXR1cywgc2l6ZW9mKGludCkpOworCQlwdHIgKz0gc2l6ZW9mKGludCk7CisKKwkJaWYgKHRoaXNyZXBseS0+cmVwbHltc2cpIHsKKwkJCXN0cmNweShwdHIsIHRoaXNyZXBseS0+cmVwbHltc2cpOworCQkJcHRyICs9IHN0cmxlbih0aGlzcmVwbHktPnJlcGx5bXNnKSArIDE7CisJCX0gZWxzZSB7CisJCQlwdHJbMF0gPSAnXDAnOworCQkJcHRyKys7CisJCX0KKwkJdGhpc3JlcGx5ID0gdGhpc3JlcGx5LT5uZXh0OworCisJCWRtX2ZyZWUodGVtcHJlcGx5LT5yZXBseW1zZyk7CisJCWRtX2ZyZWUodGVtcHJlcGx5KTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgd2l0aCBhbiBlbXB0eSBub2RlIG5hbWUgKi8KKwkqcHRyID0gJ1wwJzsKKworCWNsaWVudHJlcGx5LT5hcmdsZW4gPSBwdHIgLSBjbGllbnRyZXBseS0+YXJnczsKKworCS8qIEFuZCBzZW5kIGl0ICovCisJc2VuZF9tZXNzYWdlKHJlcGx5YnVmLCBtZXNzYWdlX2xlbiwgb3VyX2NzaWQsIGZkLAorCQkgICAgICJFcnJvciBzZW5kaW5nIFJFUExZIHRvIGNsaWVudCIpOworCWRtX2ZyZWUocmVwbHlidWYpOworCisJLyogUmVzZXQgY29tbXMgdmFyaWFibGVzICovCisJY2xpZW50LT5iaXRzLmxvY2Fsc29jay5yZXBsaWVzID0gTlVMTDsKKwljbGllbnQtPmJpdHMubG9jYWxzb2NrLmV4cGVjdGVkX3JlcGxpZXMgPSAwOworCWNsaWVudC0+Yml0cy5sb2NhbHNvY2suaW5fcHJvZ3Jlc3MgPSBGQUxTRTsKKwljbGllbnQtPmJpdHMubG9jYWxzb2NrLnNlbnRfb3V0ID0gRkFMU0U7Cit9CisKKy8qIEp1c3QgZnJlZSBhIHJlcGx5IGNoYWluIGJhY2V1c2UgaXQgd2Fzbid0IHVzZWQuICovCitzdGF0aWMgdm9pZCBmcmVlX3JlcGx5KHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCkKK3sKKwkvKiBBZGQgaW4gYWxsIHRoZSByZXBsaWVzLCBhbmQgZnJlZSB0aGVtIGFzIHdlIGdvICovCisJc3RydWN0IG5vZGVfcmVwbHkgKnRoaXNyZXBseSA9IGNsaWVudC0+Yml0cy5sb2NhbHNvY2sucmVwbGllczsKKwl3aGlsZSAodGhpc3JlcGx5KSB7CisJCXN0cnVjdCBub2RlX3JlcGx5ICp0ZW1wcmVwbHkgPSB0aGlzcmVwbHk7CisKKwkJdGhpc3JlcGx5ID0gdGhpc3JlcGx5LT5uZXh0OworCisJCWRtX2ZyZWUodGVtcHJlcGx5LT5yZXBseW1zZyk7CisJCWRtX2ZyZWUodGVtcHJlcGx5KTsKKwl9CisJY2xpZW50LT5iaXRzLmxvY2Fsc29jay5yZXBsaWVzID0gTlVMTDsKK30KKworLyogU2VuZCBvdXIgdmVyc2lvbiBudW1iZXIgdG8gdGhlIGNsdXN0ZXIgKi8KK3N0YXRpYyB2b2lkIHNlbmRfdmVyc2lvbl9tZXNzYWdlKHZvaWQpCit7CisJY2hhciBtZXNzYWdlW3NpemVvZihzdHJ1Y3QgY2x2bV9oZWFkZXIpICsgc2l6ZW9mKGludCkgKiAzXTsKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKm1zZyA9IChzdHJ1Y3QgY2x2bV9oZWFkZXIgKikgbWVzc2FnZTsKKwlpbnQgdmVyc2lvbl9udW1zWzNdID0geworCQlodG9ubChDTFZNRF9NQUpPUl9WRVJTSU9OKSwKKwkJaHRvbmwoQ0xWTURfTUlOT1JfVkVSU0lPTiksCisJCWh0b25sKENMVk1EX1BBVENIX1ZFUlNJT04pCisJfTsKKworCW1zZy0+Y21kID0gQ0xWTURfQ01EX1ZFUlNJT047CisJbXNnLT5zdGF0dXMgPSAwOworCW1zZy0+ZmxhZ3MgPSAwOworCW1zZy0+Y2xpZW50aWQgPSAwOworCW1zZy0+YXJnbGVuID0gc2l6ZW9mKHZlcnNpb25fbnVtcyk7CisKKwltZW1jcHkoJm1zZy0+YXJncywgdmVyc2lvbl9udW1zLCBzaXplb2YodmVyc2lvbl9udW1zKSk7CisKKwlodG9uX2Nsdm0obXNnKTsKKworCWNsb3BzLT5jbHVzdGVyX3NlbmRfbWVzc2FnZShtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksIE5VTEwsCisJCQkJICAgICJFcnJvciBTZW5kaW5nIHZlcnNpb24gbnVtYmVyIik7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRvIGVpdGhlciBhIGxvY2FsIGNsaWVudCBvciBhbm90aGVyIHNlcnZlciAqLworc3RhdGljIGludCBzZW5kX21lc3NhZ2Uodm9pZCAqYnVmLCBpbnQgbXNnbGVuLCBjb25zdCBjaGFyICpjc2lkLCBpbnQgZmQsCisJCQljb25zdCBjaGFyICplcnJ0ZXh0KQoreworCWludCBsZW4gPSAwOworCWludCBwdHI7CisJc3RydWN0IHRpbWVzcGVjIGRlbGF5OworCXN0cnVjdCB0aW1lc3BlYyByZW10aW1lOworCWludCByZXRyeV9jbnQgPSAwOworCisJLyogU2VuZCByZW1vdGUgbWVzc2FnZXMgZG93biB0aGUgY2x1c3RlciBzb2NrZXQgKi8KKwlpZiAoIWNzaWQgfHwgIUlTTE9DQUxfQ1NJRChjc2lkKSkgeworCQlodG9uX2Nsdm0oKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBidWYpOworCQlyZXR1cm4gY2xvcHMtPmNsdXN0ZXJfc2VuZF9tZXNzYWdlKGJ1ZiwgbXNnbGVuLCBjc2lkLCBlcnJ0ZXh0KTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgaXQgYWxsIGdvZXMgKi8KKwlmb3IgKHB0ciA9IDA7IHB0ciA8IG1zZ2xlbjspIHsKKwkJaWYgKChsZW4gPSB3cml0ZShmZCwgKGNoYXIqKWJ1ZiArIHB0ciwgbXNnbGVuIC0gcHRyKSkgPD0gMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlPIHx8IGVycm5vID09IEVOT1NQQykgJiYKKwkJCSAgICArK3JldHJ5X2NudCA8IE1BWF9SRVRSSUVTKSB7CisJCQkJZGVsYXkudHZfc2VjID0gMDsKKwkJCQlkZWxheS50dl9uc2VjID0gMTAwMDAwOworCQkJCXJlbXRpbWUudHZfc2VjID0gMDsKKwkJCQlyZW10aW1lLnR2X25zZWMgPSAwOworCQkJCSh2b2lkKSBuYW5vc2xlZXAgKCZkZWxheSwgJnJlbXRpbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbG9nX2Vycm9yKCIlcyIsIGVycnRleHQpOworCQkJYnJlYWs7CisJCX0KKwkJcHRyICs9IGxlbjsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfd29ya19pdGVtKHN0cnVjdCBsdm1fdGhyZWFkX2NtZCAqY21kKQoreworCS8qIElmIG1zZyBpcyBOVUxMIHRoZW4gdGhpcyBpcyBhIGNsZWFudXAgcmVxdWVzdCAqLworCWlmIChjbWQtPm1zZyA9PSBOVUxMKSB7CisJCURFQlVHTE9HKCJwcm9jZXNzX3dvcmtfaXRlbTogZnJlZSAlcFxuIiwgY21kLT5jbGllbnQpOworCQljbWRfY2xpZW50X2NsZWFudXAoY21kLT5jbGllbnQpOworCQlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmNtZC0+Y2xpZW50LT5iaXRzLmxvY2Fsc29jay5tdXRleCk7CisJCXB0aHJlYWRfY29uZF9kZXN0cm95KCZjbWQtPmNsaWVudC0+Yml0cy5sb2NhbHNvY2suY29uZCk7CisJCWRtX2ZyZWUoY21kLT5jbGllbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNtZC0+cmVtb3RlKSB7CisJCURFQlVHTE9HKCJwcm9jZXNzX3dvcmtfaXRlbTogbG9jYWxcbiIpOworCQlwcm9jZXNzX2xvY2FsX2NvbW1hbmQoY21kLT5tc2csIGNtZC0+bXNnbGVuLCBjbWQtPmNsaWVudCwKKwkJCQkgICAgICBjbWQtPnhpZCk7CisJfSBlbHNlIHsKKwkJREVCVUdMT0coInByb2Nlc3Nfd29ya19pdGVtOiByZW1vdGVcbiIpOworCQlwcm9jZXNzX3JlbW90ZV9jb21tYW5kKGNtZC0+bXNnLCBjbWQtPm1zZ2xlbiwgY21kLT5jbGllbnQtPmZkLAorCQkJCSAgICAgICBjbWQtPmNzaWQpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUm91dGluZSB0aGF0IHJ1bnMgaW4gdGhlICJMVk0gdGhyZWFkIi4KKyAqLworc3RhdGljIHZvaWQgKmx2bV90aHJlYWRfZm4odm9pZCAqYXJnKQoreworCXNpZ3NldF90IHNzOworCXN0cnVjdCBsdm1fc3RhcnR1cF9wYXJhbXMgKmx2bV9wYXJhbXMgPSBhcmc7CisJc3RydWN0IGx2bV90aHJlYWRfY21kICpjbWQ7CisKKwlERUJVR0xPRygiTFZNIHRocmVhZCBmdW5jdGlvbiBzdGFydGVkXG4iKTsKKworCS8qIElnbm9yZSBTSUdVU1IxICYgMiAqLworCXNpZ2VtcHR5c2V0KCZzcyk7CisJc2lnYWRkc2V0KCZzcywgU0lHVVNSMSk7CisJc2lnYWRkc2V0KCZzcywgU0lHVVNSMik7CisJcHRocmVhZF9zaWdtYXNrKFNJR19CTE9DSywgJnNzLCBOVUxMKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGludGVyZmFjZSB0byBsaWJsdm0gKi8KKwlpbml0X2Nsdm0obHZtX3BhcmFtcy0+ZXhjbF91dWlkKTsKKworCS8qIEFsbG93IG90aGVycyB0byBnZXQgbW92aW5nICovCisJcHRocmVhZF9iYXJyaWVyX3dhaXQoJmx2bV9zdGFydF9iYXJyaWVyKTsKKwlERUJVR0xPRygiTFZNIHRocmVhZCByZWFkeSBmb3Igd29yay5cbiIpOworCisJLyogTm93IHdhaXQgZm9yIHNvbWUgYWN0dWFsIHdvcmsgKi8KKwlwdGhyZWFkX211dGV4X2xvY2soJmx2bV90aHJlYWRfbXV0ZXgpOworCisJZm9yICg7OykgeworCQl3aGlsZSAoIWRtX2xpc3RfZW1wdHkoJmx2bV9jbWRfaGVhZCkpIHsKKwkJCWNtZCA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2ZpcnN0KCZsdm1fY21kX2hlYWQpLAorCQkJCQkgICBzdHJ1Y3QgbHZtX3RocmVhZF9jbWQpOworCQkJZG1fbGlzdF9kZWwoJmNtZC0+bGlzdCk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbHZtX3RocmVhZF9tdXRleCk7CisKKwkJCXByb2Nlc3Nfd29ya19pdGVtKGNtZCk7CisJCQlkbV9mcmVlKGNtZC0+bXNnKTsKKwkJCWRtX2ZyZWUoY21kKTsKKworCQkJcHRocmVhZF9tdXRleF9sb2NrKCZsdm1fdGhyZWFkX211dGV4KTsKKwkJfQorCisJCWlmICAobHZtX3RocmVhZF9leGl0KQorCQkJYnJlYWs7CisKKwkJREVCVUdMT0coIkxWTSB0aHJlYWQgd2FpdGluZyBmb3Igd29ya1xuIik7CisJCXB0aHJlYWRfY29uZF93YWl0KCZsdm1fdGhyZWFkX2NvbmQsICZsdm1fdGhyZWFkX211dGV4KTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHZtX3RocmVhZF9tdXRleCk7CisJREVCVUdMT0coIkxWTSB0aHJlYWQgZXhpdHNcbiIpOworCisJZGVzdHJveV9sdm0oKTsKKworCXB0aHJlYWRfZXhpdChOVUxMKTsKK30KKworLyogUGFzcyBkb3duIHNvbWUgd29yayB0byB0aGUgTFZNIHRocmVhZCAqLworc3RhdGljIGludCBhZGRfdG9fbHZtcXVldWUoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgY2x2bV9oZWFkZXIgKm1zZywKKwkJCSAgIGludCBtc2dsZW4sIGNvbnN0IGNoYXIgKmNzaWQpCit7CisJc3RydWN0IGx2bV90aHJlYWRfY21kICpjbWQ7CisKKwlpZiAoIShjbWQgPSBkbV9tYWxsb2Moc2l6ZW9mKCpjbWQpKSkpCisJCXJldHVybiBFTk9NRU07CisKKwlpZiAobXNnbGVuKSB7CisJCWlmICghKGNtZC0+bXNnID0gZG1fbWFsbG9jKG1zZ2xlbikpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgc3BhY2UuIik7CisJCQlkbV9mcmVlKGNtZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KGNtZC0+bXNnLCBtc2csIG1zZ2xlbik7CisJfQorCWVsc2UKKwkJY21kLT5tc2cgPSBOVUxMOworCisJY21kLT5jbGllbnQgPSBjbGllbnQ7CisJY21kLT5tc2dsZW4gPSBtc2dsZW47CisJY21kLT54aWQgPSBjbGllbnQtPnhpZDsKKworCWlmIChjc2lkKSB7CisJCW1lbWNweShjbWQtPmNzaWQsIGNzaWQsIG1heF9jc2lkX2xlbik7CisJCWNtZC0+cmVtb3RlID0gMTsKKwl9IGVsc2UKKwkJY21kLT5yZW1vdGUgPSAwOworCisJREVCVUdMT0coImFkZF90b19sdm1xdWV1ZTogY21kPSVwLiBjbGllbnQ9JXAsIG1zZz0lcCwgbGVuPSVkLCBjc2lkPSVwLCB4aWQ9JWRcbiIsCisJCSBjbWQsIGNsaWVudCwgbXNnLCBtc2dsZW4sIGNzaWQsIGNtZC0+eGlkKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJmx2bV90aHJlYWRfbXV0ZXgpOworCWlmIChsdm1fdGhyZWFkX2V4aXQpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bV90aHJlYWRfbXV0ZXgpOworCQlkbV9mcmVlKGNtZC0+bXNnKTsKKwkJZG1fZnJlZShjbWQpOworCQlyZXR1cm4gLTE7IC8qIFdlIGFyZSBhYm91dCB0byBleGl0ICovCisJfQorCWRtX2xpc3RfYWRkKCZsdm1fY21kX2hlYWQsICZjbWQtPmxpc3QpOworCXB0aHJlYWRfY29uZF9zaWduYWwoJmx2bV90aHJlYWRfY29uZCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bV90aHJlYWRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiAwIGlmIHdlIGNhbiB0YWxrIHRvIGFuIGV4aXN0aW5nIGNsdm1kICovCitzdGF0aWMgaW50IGNoZWNrX2xvY2FsX2Nsdm1kKHZvaWQpCit7CisJaW50IGxvY2FsX3NvY2tldDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja2FkZHIgPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OworCisJaWYgKCFkbV9zdHJuY3B5KHNvY2thZGRyLnN1bl9wYXRoLCBDTFZNRF9TT0NLTkFNRSwgc2l6ZW9mKHNvY2thZGRyLnN1bl9wYXRoKSkpIHsKKwkJbG9nX2Vycm9yKCIlczogY2x2bWQgc29ja2V0IG5hbWUgdG9vIGxvbmcuIiwgQ0xWTURfU09DS05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogT3BlbiBsb2NhbCBzb2NrZXQgKi8KKwlpZiAoKGxvY2FsX3NvY2tldCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworCQlsb2dfc3lzX2Vycm9yKCJzb2NrZXQiLCAibG9jYWwgc29ja2V0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY29ubmVjdChsb2NhbF9zb2NrZXQsKHN0cnVjdCBzb2NrYWRkciAqKSAmc29ja2FkZHIsCisJCSAgICBzaXplb2Yoc29ja2FkZHIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJjb25uZWN0IiwgImxvY2FsIHNvY2tldCIpOworCQlyZXQgPSAtMTsKKwl9CisKKwlpZiAoY2xvc2UobG9jYWxfc29ja2V0KSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCAibG9jYWwgc29ja2V0Iik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9sb2NhbF9zb2NrKGludCBsb2NhbF9zb2NrZXQpCit7CisJaWYgKGxvY2FsX3NvY2tldCAhPSAtMSAmJiBjbG9zZShsb2NhbF9zb2NrZXQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIENMVk1EX1NPQ0tOQU1FKTsKKworCWlmIChDTFZNRF9TT0NLTkFNRVswXSAhPSAnXDAnICYmIHVubGluayhDTFZNRF9TT0NLTkFNRSkpCisJCXN0YWNrOworfQorCisvKiBPcGVuIHRoZSBsb2NhbCBzb2NrZXQsIHRoYXQncyB0aGUgb25lIHdlIHRhbGsgdG8gbGliY2x2bSBkb3duICovCitzdGF0aWMgaW50IG9wZW5fbG9jYWxfc29jayh2b2lkKQoreworCW1vZGVfdCBvbGRfbWFzazsKKwlpbnQgbG9jYWxfc29ja2V0ID0gLTE7CisJc3RydWN0IHNvY2thZGRyX3VuIHNvY2thZGRyID0geyAuc3VuX2ZhbWlseSA9IEFGX1VOSVggfTsKKworCWlmICghZG1fc3RybmNweShzb2NrYWRkci5zdW5fcGF0aCwgQ0xWTURfU09DS05BTUUsIHNpemVvZihzb2NrYWRkci5zdW5fcGF0aCkpKSB7CisJCWxvZ19lcnJvcigiJXM6IGNsdm1kIHNvY2tldCBuYW1lIHRvbyBsb25nLiIsIENMVk1EX1NPQ0tOQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNsb3NlX2xvY2FsX3NvY2sobG9jYWxfc29ja2V0KTsKKworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChDTFZNRF9TT0NLTkFNRSwgU19JRlNPQ0spOworCW9sZF9tYXNrID0gdW1hc2soMDA3Nyk7CisKKwkvKiBPcGVuIGxvY2FsIHNvY2tldCAqLworCWlmICgobG9jYWxfc29ja2V0ID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgY3JlYXRlIGxvY2FsIHNvY2tldDogJW0iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBTZXQgQ2xvc2Utb24tZXhlYyAmIG5vbi1ibG9ja2luZyAqLworCWlmIChmY250bChsb2NhbF9zb2NrZXQsIEZfU0VURkQsIDEpKQorCQlERUJVR0xPRygic2V0dGluZyBDTE9FWEVDIG9uIGxvY2FsX3NvY2tldCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmY250bChsb2NhbF9zb2NrZXQsIEZfU0VURkwsIGZjbnRsKGxvY2FsX3NvY2tldCwgRl9HRVRGTCwgMCkgfCBPX05PTkJMT0NLKSkKKwkJREVCVUdMT0coInNldHRpbmcgT19OT05CTE9DSyBvbiBsb2NhbF9zb2NrZXQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCisJaWYgKGJpbmQobG9jYWxfc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopICZzb2NrYWRkciwgc2l6ZW9mKHNvY2thZGRyKSkpIHsKKwkJbG9nX2Vycm9yKCJjYW4ndCBiaW5kIGxvY2FsIHNvY2tldDogJW0iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGxpc3Rlbihsb2NhbF9zb2NrZXQsIDEpICE9IDApIHsKKwkJbG9nX2Vycm9yKCJsaXN0ZW4gbG9jYWw6ICVtIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdW1hc2sob2xkX21hc2spOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKwlyZXR1cm4gbG9jYWxfc29ja2V0OworZXJyb3I6CisJY2xvc2VfbG9jYWxfc29jayhsb2NhbF9zb2NrZXQpOworCXVtYXNrKG9sZF9tYXNrKTsKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHByb2Nlc3NfbWVzc2FnZShzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJICAgICBjb25zdCBjaGFyICpjc2lkKQoreworCWNoYXIgbm9kZW5hbWVbbWF4X2NsdXN0ZXJfbWVtYmVyX25hbWVfbGVuXTsKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmluaGVhZGVyID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBidWY7CisJbnRvaF9jbHZtKGluaGVhZGVyKTsJLyogQnl0ZXN3YXAgZmllbGRzICovCisKKwlpZiAodmVyaWZ5X21lc3NhZ2UoYnVmLCBsZW4pIDwgMCkgeworCQljbG9wcy0+bmFtZV9mcm9tX2NzaWQoY3NpZCwgbm9kZW5hbWUpOworCQlsb2dfZXJyb3IoInByb2Nlc3NfbWVzc2FnZSBmcm9tICVzIGxlbiAlZCBiYWQgdmVyaWZ5LiIsIG5vZGVuYW1lLCBsZW4pOworCQlkdW1wX21lc3NhZ2UoYnVmLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJaWYgKGluaGVhZGVyLT5jbWQgPT0gQ0xWTURfQ01EX1JFUExZKQorCQlwcm9jZXNzX3JlcGx5KGluaGVhZGVyLCBsZW4sIGNzaWQpOworCWVsc2UKKwkJYWRkX3RvX2x2bXF1ZXVlKGNsaWVudCwgaW5oZWFkZXIsIGxlbiwgY3NpZCk7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfYWxsX2NhbGxiYWNrKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqY3NpZCwKKwkJCSAgICAgICBpbnQgbm9kZV91cCkKK3sKKwlpZiAoIW5vZGVfdXApCisJCWFkZF9yZXBseV90b19saXN0KGNsaWVudCwgRUhPU1RET1dOLCBjc2lkLCAiQ0xWTUQgbm90IHJ1bm5pbmciLCAxOCk7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiBhbGwgQ0xWTURzIGFyZSBydW5uaW5nIChpZSBvbmUgb24KKyAgIGV2ZXJ5IG5vZGUgaW4gdGhlIGNsdXN0ZXIpLgorICAgSWYgbm90LCByZXR1cm5zIC0xIGFuZCBwcmludHMgb3V0IGEgbGlzdCBvZiBlcnJhbnQgbm9kZXMgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYWxsX2Nsdm1kc19ydW5uaW5nKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCkKK3sKKwlERUJVR0xPRygiY2hlY2tfYWxsX2Nsdm1kc19ydW5uaW5nXG4iKTsKKwlyZXR1cm4gY2xvcHMtPmNsdXN0ZXJfZG9fbm9kZV9jYWxsYmFjayhjbGllbnQsIGNoZWNrX2FsbF9jYWxsYmFjayk7Cit9CisKKy8qIFJldHVybiBhIGxvY2FsX2NsaWVudCBzdHJ1Y3QgZ2l2ZW4gYSBjbGllbnQgSUQuCisgICBjbGllbnQgSURzIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9jYWxfY2xpZW50ICpmaW5kX2NsaWVudChpbnQgY2xpZW50aWQpCit7CisJc3RydWN0IGxvY2FsX2NsaWVudCAqdGhpc2ZkOworCisJZm9yICh0aGlzZmQgPSAmbG9jYWxfY2xpZW50X2hlYWQ7IHRoaXNmZDsgdGhpc2ZkID0gdGhpc2ZkLT5uZXh0KQorCQlpZiAodGhpc2ZkLT5mZCA9PSAoaW50KW50b2hsKGNsaWVudGlkKSkKKwkJCXJldHVybiB0aGlzZmQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQnl0ZS1zd2FwcGluZyByb3V0aW5lcyBmb3IgdGhlIGhlYWRlciBzbyB3ZQorICAgd29yayBpbiBhIGhldGVyb2dlbmVvdXMgZW52aXJvbm1lbnQgKi8KK3N0YXRpYyB2b2lkIGh0b25fY2x2bShzdHJ1Y3QgY2x2bV9oZWFkZXIgKmhkcikKK3sKKwloZHItPnN0YXR1cyA9IGh0b25sKGhkci0+c3RhdHVzKTsKKwloZHItPmFyZ2xlbiA9IGh0b25sKGhkci0+YXJnbGVuKTsKKwloZHItPnhpZCA9IGh0b25zKGhkci0+eGlkKTsKKwkvKiBEb24ndCBzd2FwIGNsaWVudGlkIGFzIGl0J3Mgb25seSBhIHRva2VuIGFzIGZhciBhcworCSAgIHJlbW90ZSBub2RlcyBhcmUgY29uY2VybmVkICovCit9CisKK3N0YXRpYyB2b2lkIG50b2hfY2x2bShzdHJ1Y3QgY2x2bV9oZWFkZXIgKmhkcikKK3sKKwloZHItPnN0YXR1cyA9IG50b2hsKGhkci0+c3RhdHVzKTsKKwloZHItPmFyZ2xlbiA9IG50b2hsKGhkci0+YXJnbGVuKTsKKwloZHItPnhpZCA9IG50b2hzKGhkci0+eGlkKTsKK30KKworLyogSGFuZGxlciBmb3IgU0lHVVNSMiAtIHNlbnQgdG8ga2lsbCBzdWJ0aHJlYWRzICovCitzdGF0aWMgdm9pZCBzaWd1c3IyX2hhbmRsZXIoaW50IHNpZykKK3sKKwlERUJVR0xPRygiU0lHVVNSMiByZWNlaXZlZFxuIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzaWd0ZXJtX2hhbmRsZXIoaW50IHNpZykKK3sKKwlxdWl0ID0gMTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNpZ2h1cF9oYW5kbGVyKGludCBzaWcpCit7CisJcmVyZWFkX2NvbmZpZyA9IDE7Cit9CisKK2ludCBzeW5jX2xvY2soY29uc3QgY2hhciAqcmVzb3VyY2UsIGludCBtb2RlLCBpbnQgZmxhZ3MsIGludCAqbG9ja2lkKQoreworCXJldHVybiBjbG9wcy0+c3luY19sb2NrKHJlc291cmNlLCBtb2RlLCBmbGFncywgbG9ja2lkKTsKK30KKworaW50IHN5bmNfdW5sb2NrKGNvbnN0IGNoYXIgKnJlc291cmNlLCBpbnQgbG9ja2lkKQoreworCXJldHVybiBjbG9wcy0+c3luY191bmxvY2socmVzb3VyY2UsIGxvY2tpZCk7Cit9CisKK3N0YXRpYyBpZl90eXBlX3QgcGFyc2VfY2x1c3Rlcl9pbnRlcmZhY2UoY2hhciAqaWZuYW1lKQoreworCWlmX3R5cGVfdCBpZmFjZSA9IElGX0FVVE87CisKKwlpZiAoIXN0cmNtcChpZm5hbWUsICJhdXRvIikpCisJCWlmYWNlID0gSUZfQVVUTzsKKwllbHNlIGlmICghc3RyY21wKGlmbmFtZSwgImNtYW4iKSkKKwkJaWZhY2UgPSBJRl9DTUFOOworCWVsc2UgaWYgKCFzdHJjbXAoaWZuYW1lLCAib3BlbmFpcyIpKQorCQlpZmFjZSA9IElGX09QRU5BSVM7CisJZWxzZSBpZiAoIXN0cmNtcChpZm5hbWUsICJjb3Jvc3luYyIpKQorCQlpZmFjZSA9IElGX0NPUk9TWU5DOworCWVsc2UgaWYgKCFzdHJjbXAoaWZuYW1lLCAic2luZ2xlbm9kZSIpKQorCQlpZmFjZSA9IElGX1NJTkdMRU5PREU7CisKKwlyZXR1cm4gaWZhY2U7Cit9CisKKy8qCisgKiBUcnkgYW5kIGZpbmQgYSBjbHVzdGVyIHN5c3RlbSBpbiBjb3Jvc3luYydzIG9iamRiLCBpZiBpdCBpcyBydW5uaW5nLiBUaGlzIGlzCisgKiBvbmx5IGNhbGxlZCBpZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbiBpcyBub3QgcHJlc2VudCwgYW5kIGlmIGl0IGZhaWxzCisgKiB3ZSBzdGlsbCB0cnkgdGhlIGludGVyZmFjZXMgaW4gb3JkZXIuCisgKi8KK3N0YXRpYyBpZl90eXBlX3QgZ2V0X2NsdXN0ZXJfdHlwZSh2b2lkKQoreworI2lmZGVmIEhBVkVfQ09ST1NZTkNfQ09ORkRCX0gKKwljb25mZGJfaGFuZGxlX3QgaGFuZGxlOworCWlmX3R5cGVfdCB0eXBlID0gSUZfQVVUTzsKKwlpbnQgcmVzdWx0OworCWNoYXIgYnVmWzI1NV07CisJc2l6ZV90IG5hbWVsZW4gPSBzaXplb2YoYnVmKTsKKwloZGJfaGFuZGxlX3QgY2x1c3Rlcl9oYW5kbGU7CisJaGRiX2hhbmRsZV90IGNsdm1kX2hhbmRsZTsKKwljb25mZGJfY2FsbGJhY2tzX3QgY2FsbGJhY2tzID0geyAwIH07CisKKwlyZXN1bHQgPSBjb25mZGJfaW5pdGlhbGl6ZSAoJmhhbmRsZSwgJmNhbGxiYWNrcyk7CisJaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJcmV0dXJuIHR5cGU7CisKKwlyZXN1bHQgPSBjb25mZGJfb2JqZWN0X2ZpbmRfc3RhcnQoaGFuZGxlLCBPQkpFQ1RfUEFSRU5UX0hBTkRMRSk7CisJaWYgKHJlc3VsdCAhPSBDU19PSykKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSBjb25mZGJfb2JqZWN0X2ZpbmQoaGFuZGxlLCBPQkpFQ1RfUEFSRU5UX0hBTkRMRSwgKHZvaWQgKikiY2x1c3RlciIsIHN0cmxlbigiY2x1c3RlciIpLCAmY2x1c3Rlcl9oYW5kbGUpOworCWlmIChyZXN1bHQgIT0gQ1NfT0spCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gY29uZmRiX29iamVjdF9maW5kX3N0YXJ0KGhhbmRsZSwgY2x1c3Rlcl9oYW5kbGUpOworCWlmIChyZXN1bHQgIT0gQ1NfT0spCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gY29uZmRiX29iamVjdF9maW5kKGhhbmRsZSwgY2x1c3Rlcl9oYW5kbGUsICh2b2lkICopImNsdm1kIiwgc3RybGVuKCJjbHZtZCIpLCAmY2x2bWRfaGFuZGxlKTsKKwlpZiAocmVzdWx0ICE9IENTX09LKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IGNvbmZkYl9rZXlfZ2V0KGhhbmRsZSwgY2x2bWRfaGFuZGxlLCAodm9pZCAqKSJpbnRlcmZhY2UiLCBzdHJsZW4oImludGVyZmFjZSIpLCBidWYsICZuYW1lbGVuKTsKKwlpZiAocmVzdWx0ICE9IENTX09LKQorCQlnb3RvIG91dDsKKworCWlmIChuYW1lbGVuID49IHNpemVvZihidWYpKQorCQluYW1lbGVuID0gc2l6ZW9mKGJ1ZikgLSAxOworCisJYnVmW25hbWVsZW5dID0gJ1wwJzsKKwl0eXBlID0gcGFyc2VfY2x1c3Rlcl9pbnRlcmZhY2UoYnVmKTsKKwlERUJVR0xPRygiZ290IGludGVyZmFjZSB0eXBlICclcycgZnJvbSBjb25mZGJcbiIsIGJ1Zik7CitvdXQ6CisJY29uZmRiX2ZpbmFsaXplKGhhbmRsZSk7CisJcmV0dXJuIHR5cGU7CisjZWxzZQorCXJldHVybiBJRl9BVVRPOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2Nsdm1kL2Nsdm1kLmggYi9kYWVtb25zL2Nsdm1kL2Nsdm1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZWU4OAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY2x2bWQvY2x2bWQuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0NMVk1EX0gKKyNkZWZpbmUgX0NMVk1EX0gKKworI2RlZmluZSBDTFZNRF9NQUpPUl9WRVJTSU9OIDAKKyNkZWZpbmUgQ0xWTURfTUlOT1JfVkVSU0lPTiAyCisjZGVmaW5lIENMVk1EX1BBVENIX1ZFUlNJT04gMQorCisvKiBEZWZhdWx0IHRpbWUgKGluIHNlY29uZHMpIHdlIHdpbGwgd2FpdCBmb3IgYWxsIHJlbW90ZSBjb21tYW5kcyB0byBleGVjdXRlCisgICBiZWZvcmUgZGVjbGFyaW5nIHRoZW0gZGVhZCAqLworI2RlZmluZSBERUZBVUxUX0NNRF9USU1FT1VUIDYwCisKKy8qIE9uZSBvZiB0aGVzZSBmb3IgZWFjaCByZXBseSB3ZSBnZXQgZnJvbSBjb21tYW5kIGV4ZWN1dGlvbiBvbiBhIG5vZGUgKi8KK3N0cnVjdCBub2RlX3JlcGx5IHsKKwljaGFyIG5vZGVbTUFYX0NMVVNURVJfTUVNQkVSX05BTUVfTEVOXTsKKwljaGFyICpyZXBseW1zZzsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBub2RlX3JlcGx5ICpuZXh0OworfTsKKwordHlwZWRlZiBlbnVtIHtERUJVR19PRkYsIERFQlVHX1NUREVSUiwgREVCVUdfU1lTTE9HfSBkZWJ1Z190OworCisvKgorICogVGhlc2UgZXhpc3QgZm9yIHRoZSB1c2Ugb2YgbG9jYWwgc29ja2V0cyBvbmx5IHdoZW4gd2UgYXJlCisgKiBjb2xsZWN0aW5nIHJlc3BvbnNlcyBmcm9tIGFsbCBjbHVzdGVyIG5vZGVzCisgKi8KK3N0cnVjdCBsb2NhbHNvY2tfYml0cyB7CisJc3RydWN0IG5vZGVfcmVwbHkgKnJlcGxpZXM7CisJaW50IG51bV9yZXBsaWVzOworCWludCBleHBlY3RlZF9yZXBsaWVzOworCXRpbWVfdCBzZW50X3RpbWU7CS8qIFNvIHdlIGNhbiBjaGVjayBmb3IgdGltZW91dHMgKi8KKwlpbnQgaW5fcHJvZ3Jlc3M7CS8qIE9ubHkgZXhlY3V0ZSBvbmUgY21kIGF0IGEgdGltZSBwZXIgY2xpZW50ICovCisJaW50IHNlbnRfb3V0OwkJLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IGEgY29tbWFuZCB3YXMgc2VudAorCQkJCSAgIHRvIHJlbW90ZSBub2RlcyAqLworCXZvaWQgKnByaXZhdGU7CQkvKiBQcml2YXRlIGFyZWEgZm9yIGNvbW1hbmQgcHJvY2Vzc29yIHVzZSAqLworCXZvaWQgKmNtZDsJCS8qIFdob2xlIGNvbW1hbmQgYXMgcGFzc2VkIGRvd24gbG9jYWwgc29ja2V0ICovCisJaW50IGNtZF9sZW47CQkvKiBMZW5ndGggb2YgYWJvdmUgKi8KKwlpbnQgcGlwZTsJCS8qIFBpcGUgdG8gc2VuZCBQUkUgY29tcGxldGlvbiBzdGF0dXMgZG93biAqLworCWludCBmaW5pc2hlZDsJCS8qIEZsYWcgdG8gdGVsbCBzdWJ0aHJlYWQgdG8gZXhpdCAqLworCWludCBhbGxfc3VjY2VzczsJLyogU2V0IHRvIDAgaWYgYW55IG5vZGUgKG9yIHRoZSBwcmVfY29tbWFuZCkKKwkJCQkgICBmYWlsZWQgKi8KKwlpbnQgY2xlYW51cF9uZWVkZWQ7ICAgICAvKiBoZWxwZXIgZm9yIGNsZWFudXBfem9tYmllICovCisJc3RydWN0IGxvY2FsX2NsaWVudCAqcGlwZV9jbGllbnQ7CisJcHRocmVhZF90IHRocmVhZGlkOworCWVudW0geyBQUkVfQ09NTUFORCwgUE9TVF9DT01NQU5EIH0gc3RhdGU7CisJcHRocmVhZF9tdXRleF90IG11dGV4OwkvKiBNYWluIHRocmVhZCBhbmQgd29ya2VyIHN5bmNocm9uaXNhdGlvbiAqLworCXB0aHJlYWRfY29uZF90IGNvbmQ7Cit9OworCisvKiBFbnRyaWVzIGZvciBQSVBFIGNsaWVudHMgKi8KK3N0cnVjdCBwaXBlX2JpdHMgeworCXN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudDsJLyogQWN0dWFsIChsb2NhbHNvY2spIGNsaWVudCAqLworCXB0aHJlYWRfdCB0aHJlYWRpZDsJCS8qIE91ciBvd24gY29weSBvZiB0aGUgdGhyZWFkIGlkICovCit9OworCisvKiBFbnRyaWVzIGZvciBOZXR3b3JrIHNvY2tldCBjbGllbnRzICovCitzdHJ1Y3QgbmV0c29ja19iaXRzIHsKKwl2b2lkICpwcml2YXRlOworCWludCBmbGFnczsKK307CisKK3R5cGVkZWYgaW50ICgqZmRfY2FsbGJhY2tfdCkgKHN0cnVjdCBsb2NhbF9jbGllbnQgKiBmZCwgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJICAgICAgY29uc3QgY2hhciAqY3NpZCwKKwkJCSAgICAgIHN0cnVjdCBsb2NhbF9jbGllbnQgKiogbmV3X2NsaWVudCk7CisKKy8qIE9uZSBvZiB0aGVzZSBmb3IgZWFjaCBmZCB3ZSBhcmUgbGlzdGVuaW5nIG9uICovCitzdHJ1Y3QgbG9jYWxfY2xpZW50IHsKKwlpbnQgZmQ7CisJZW51bSB7IENMVVNURVJfTUFJTl9TT0NLLCBDTFVTVEVSX0RBVEFfU09DSywgTE9DQUxfUkVOREVaVk9VUywKKwkJICAgIExPQ0FMX1NPQ0ssIFRIUkVBRF9QSVBFLCBDTFVTVEVSX0lOVEVSTkFMIH0gdHlwZTsKKwlzdHJ1Y3QgbG9jYWxfY2xpZW50ICpuZXh0OworCXVuc2lnbmVkIHNob3J0IHhpZDsKKwlmZF9jYWxsYmFja190IGNhbGxiYWNrOworCXVpbnQ4X3QgcmVtb3ZlbWU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBsb2NhbHNvY2tfYml0cyBsb2NhbHNvY2s7CisJCXN0cnVjdCBwaXBlX2JpdHMgcGlwZTsKKwkJc3RydWN0IG5ldHNvY2tfYml0cyBuZXQ7CisJfSBiaXRzOworfTsKKworI2RlZmluZSBERUJVR0xPRyhmbXQsIGFyZ3MuLi4pIGRlYnVnbG9nKGZtdCwgIyMgYXJncykKKworI2lmbmRlZiBtYXgKKyNkZWZpbmUgbWF4KGEsYikgKChhKT4oYik/KGEpOihiKSkKKyNlbmRpZgorCisvKiBUaGUgcmVhbCBjb21tYW5kIHByb2Nlc3NvciBpcyBpbiBjbHZtZC1jb21tYW5kLmMgKi8KK2V4dGVybiBpbnQgZG9fY29tbWFuZChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBjbHZtX2hlYWRlciAqbXNnLAorCQkgICAgICBpbnQgbXNnbGVuLCBjaGFyICoqYnVmLCBpbnQgYnVmbGVuLCBpbnQgKnJldGxlbik7CisKKy8qIFByZSBhbmQgcG9zdCBjb21tYW5kIHJvdXRpbmVzIGFyZSBjYWxsZWQgb25seSBvbiB0aGUgbG9jYWwgbm9kZSAqLworZXh0ZXJuIGludCBkb19wcmVfY29tbWFuZChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpOworZXh0ZXJuIGludCBkb19wb3N0X2NvbW1hbmQoc3RydWN0IGxvY2FsX2NsaWVudCAqY2xpZW50KTsKK2V4dGVybiB2b2lkIGNtZF9jbGllbnRfY2xlYW51cChzdHJ1Y3QgbG9jYWxfY2xpZW50ICpjbGllbnQpOworZXh0ZXJuIGludCBhZGRfY2xpZW50KHN0cnVjdCBsb2NhbF9jbGllbnQgKm5ld19jbGllbnQpOworCitleHRlcm4gdm9pZCBjbHZtZF9jbHVzdGVyX2luaXRfY29tcGxldGVkKHZvaWQpOworZXh0ZXJuIHZvaWQgcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBsb2NhbF9jbGllbnQgKmNsaWVudCwgY2hhciAqYnVmLAorCQkJICAgIGludCBsZW4sIGNvbnN0IGNoYXIgKmNzaWQpOworZXh0ZXJuIHZvaWQgZGVidWdsb2coY29uc3QgY2hhciAqZm10LCAuLi4gKQorICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKwordm9pZCBjbHZtZF9zZXRfZGVidWcoZGVidWdfdCBuZXdfZGUpOworZGVidWdfdCBjbHZtZF9nZXRfZGVidWcodm9pZCk7CitpbnQgY2x2bWRfZ2V0X2ZvcmVncm91bmQodm9pZCk7CisKK2ludCBzeW5jX2xvY2soY29uc3QgY2hhciAqcmVzb3VyY2UsIGludCBtb2RlLCBpbnQgZmxhZ3MsIGludCAqbG9ja2lkKTsKK2ludCBzeW5jX3VubG9jayhjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50IGxvY2tpZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbHZtZC9sdm0tZnVuY3Rpb25zLmMgYi9kYWVtb25zL2Nsdm1kL2x2bS1mdW5jdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODcyZmJlCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbHZtZC9sdm0tZnVuY3Rpb25zLmMKQEAgLTAsMCArMSw5MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjbHZtZC1jb21tb24uaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgImNsdm0uaCIKKyNpbmNsdWRlICJjbHZtZC1jb21tcy5oIgorI2luY2x1ZGUgImNsdm1kLmgiCisjaW5jbHVkZSAibHZtLWZ1bmN0aW9ucy5oIgorCisvKiBMVk0yIGhlYWRlcnMgKi8KKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAibHZtLWdsb2JhbHMuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2X2hhc2ggPSBOVUxMOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsdl9oYXNoX2xvY2s7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGx2bV9sb2NrOworc3RhdGljIGNoYXIgbGFzdF9lcnJvclsxMDI0XTsKKworc3RydWN0IGx2X2luZm8geworCWludCBsb2NrX2lkOworCWludCBsb2NrX21vZGU7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZGVjb2RlX2Z1bGxfbG9ja2luZ19jbWQodWludDMyX3QgY21kbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwljb25zdCBjaGFyICp0eXBlOworCWNvbnN0IGNoYXIgKnNjb3BlOworCWNvbnN0IGNoYXIgKmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGNtZGwgJiBMQ0tfVFlQRV9NQVNLKSB7CisJY2FzZSBMQ0tfTlVMTDoKKwkJdHlwZSA9ICJOVUxMIjsKKwkJYnJlYWs7CisJY2FzZSBMQ0tfUkVBRDoKKwkJdHlwZSA9ICJSRUFEIjsKKwkJYnJlYWs7CisJY2FzZSBMQ0tfUFJFQUQ6CisJCXR5cGUgPSAiUFJFQUQiOworCQlicmVhazsKKwljYXNlIExDS19XUklURToKKwkJdHlwZSA9ICJXUklURSI7CisJCWJyZWFrOworCWNhc2UgTENLX0VYQ0w6CisJCXR5cGUgPSAiRVhDTCI7CisJCWJyZWFrOworCWNhc2UgTENLX1VOTE9DSzoKKwkJdHlwZSA9ICJVTkxPQ0siOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlID0gInVua25vd24iOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGNtZGwgJiBMQ0tfU0NPUEVfTUFTSykgeworCWNhc2UgTENLX1ZHOgorCQlzY29wZSA9ICJWRyI7CisJCWNvbW1hbmQgPSAiTENLX1ZHIjsKKwkJYnJlYWs7CisJY2FzZSBMQ0tfTFY6CisJCXNjb3BlID0gIkxWIjsKKwkJc3dpdGNoIChjbWRsICYgTENLX01BU0spIHsKKwkJY2FzZSBMQ0tfTFZfRVhDTFVTSVZFICYgTENLX01BU0s6CisJCQljb21tYW5kID0gIkxDS19MVl9FWENMVVNJVkUiOworCQkJYnJlYWs7CisJCWNhc2UgTENLX0xWX1NVU1BFTkQgJiBMQ0tfTUFTSzoKKwkJCWNvbW1hbmQgPSAiTENLX0xWX1NVU1BFTkQiOworCQkJYnJlYWs7CisJCWNhc2UgTENLX0xWX1JFU1VNRSAmIExDS19NQVNLOgorCQkJY29tbWFuZCA9ICJMQ0tfTFZfUkVTVU1FIjsKKwkJCWJyZWFrOworCQljYXNlIExDS19MVl9BQ1RJVkFURSAmIExDS19NQVNLOgorCQkJY29tbWFuZCA9ICJMQ0tfTFZfQUNUSVZBVEUiOworCQkJYnJlYWs7CisJCWNhc2UgTENLX0xWX0RFQUNUSVZBVEUgJiBMQ0tfTUFTSzoKKwkJCWNvbW1hbmQgPSAiTENLX0xWX0RFQUNUSVZBVEUiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb21tYW5kID0gInVua25vd24iOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2NvcGUgPSAidW5rbm93biI7CisJCWNvbW1hbmQgPSAidW5rbm93biI7CisJCWJyZWFrOworCX0KKworCXNwcmludGYoYnVmLCAiMHgleCAlcyAoJXN8JXMlcyVzJXMlcykiLCBjbWRsLCBjb21tYW5kLCB0eXBlLCBzY29wZSwKKwkJY21kbCAmIExDS19OT05CTE9DSyAgID8gInxOT05CTE9DSyIgOiAiIiwKKwkJY21kbCAmIExDS19IT0xEICAgICAgID8gInxIT0xEIiA6ICIiLAorCQljbWRsICYgTENLX0NMVVNURVJfVkcgPyAifENMVVNURVJfVkciIDogIiIsCisJCWNtZGwgJiBMQ0tfQ0FDSEUgICAgICA/ICJ8Q0FDSEUiIDogIiIpOworCisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIE9ubHkgcHJvY2Vzc2VzIDggYml0czogZXhjbHVkZXMgTENLX0NBQ0hFLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqZGVjb2RlX2xvY2tpbmdfY21kKHVuc2lnbmVkIGNoYXIgY21kbCkKK3sKKwlyZXR1cm4gZGVjb2RlX2Z1bGxfbG9ja2luZ19jbWQoKHVpbnQzMl90KSBjbWRsKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRlY29kZV9mbGFncyh1bnNpZ25lZCBjaGFyIGZsYWdzKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JXggKCAlcyVzJXMlcyVzJXMlcyVzKSIsIGZsYWdzLAorCQlmbGFncyAmIExDS19QQVJUSUFMX01PREUJICA/ICJQQVJUSUFMX01PREV8IiA6ICIiLAorCQlmbGFncyAmIExDS19NSVJST1JfTk9TWU5DX01PREUJICA/ICJNSVJST1JfTk9TWU5DfCIgOiAiIiwKKwkJZmxhZ3MgJiBMQ0tfRE1FVkVOVERfTU9OSVRPUl9NT0RFID8gIkRNRVZFTlREX01PTklUT1J8IiA6ICIiLAorCQlmbGFncyAmIExDS19PUklHSU5fT05MWV9NT0RFID8gIk9SSUdJTl9PTkxZfCIgOiAiIiwKKwkJZmxhZ3MgJiBMQ0tfVEVTVF9NT0RFID8gIlRFU1R8IiA6ICIiLAorCQlmbGFncyAmIExDS19DT05WRVJUX01PREUgPyAiQ09OVkVSVHwiIDogIiIsCisJCWZsYWdzICYgTENLX0RNRVZFTlREX01PTklUT1JfSUdOT1JFID8gIkRNRVZFTlREX01PTklUT1JfSUdOT1JFfCIgOiAiIiwKKwkJZmxhZ3MgJiBMQ0tfUkVWRVJUX01PREUgPyAiUkVWRVJUfCIgOiAiIik7CisKKwlpZiAobGVuID4gMSkKKwkJYnVmW2xlbiAtIDJdID0gJyAnOworCWVsc2UKKwkJYnVmWzBdID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisKK2NoYXIgKmdldF9sYXN0X2x2bV9lcnJvcih2b2lkKQoreworCXJldHVybiBsYXN0X2Vycm9yOworfQorCisvKgorICogSGFzaCBsb2NrIGluZm8gaGVscGVycworICovCitzdGF0aWMgc3RydWN0IGx2X2luZm8gKmxvb2t1cF9pbmZvKGNvbnN0IGNoYXIgKnJlc291cmNlKQoreworCXN0cnVjdCBsdl9pbmZvICpsdmk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmx2X2hhc2hfbG9jayk7CisJbHZpID0gZG1faGFzaF9sb29rdXAobHZfaGFzaCwgcmVzb3VyY2UpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsdl9oYXNoX2xvY2spOworCisJcmV0dXJuIGx2aTsKK30KKworc3RhdGljIGludCBpbnNlcnRfaW5mbyhjb25zdCBjaGFyICpyZXNvdXJjZSwgc3RydWN0IGx2X2luZm8gKmx2aSkKK3sKKwlpbnQgcmV0OworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsdl9oYXNoX2xvY2spOworCXJldCA9IGRtX2hhc2hfaW5zZXJ0KGx2X2hhc2gsIHJlc291cmNlLCBsdmkpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsdl9oYXNoX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2luZm8oY29uc3QgY2hhciAqcmVzb3VyY2UpCit7CisJaW50IG51bV9vcGVuOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsdl9oYXNoX2xvY2spOworCWRtX2hhc2hfcmVtb3ZlKGx2X2hhc2gsIHJlc291cmNlKTsKKworCS8qIFdoZW4gbGFzdCBsb2NrIGlzIHJlbW92ZSwgdmFsaWRhdGUgdGhlcmUgYXJlIG5vdCBsZWZ0IG9wZW5lZCBkZXZpY2VzICovCisJaWYgKCFkbV9oYXNoX2dldF9maXJzdChsdl9oYXNoKSkgeworCQlpZiAoY3JpdGljYWxfc2VjdGlvbigpKQorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJObyB2b2x1bWVzIGFyZSBsb2NrZWQgaG93ZXZlciBjbHZtZCBpcyBpbiBhY3RpdmF0aW9uIG1vZGUgY3JpdGljYWwgc2VjdGlvbi4iKTsKKwkJaWYgKChudW1fb3BlbiA9IGRldl9jYWNoZV9jaGVja19mb3Jfb3Blbl9kZXZpY2VzKCkpKQorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJObyB2b2x1bWVzIGFyZSBsb2NrZWQgaG93ZXZlciAlZCBkZXZpY2VzIGFyZSBzdGlsbCBvcGVuLiIsIG51bV9vcGVuKTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHZfaGFzaF9sb2NrKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbW9kZSBhIGxvY2sgaXMgY3VycmVudGx5IGhlbGQgYXQgKG9yIC0xIGlmIG5vdCBoZWxkKQorICovCitzdGF0aWMgaW50IGdldF9jdXJyZW50X2xvY2soY2hhciAqcmVzb3VyY2UpCit7CisJc3RydWN0IGx2X2luZm8gKmx2aTsKKworCWlmICgobHZpID0gbG9va3VwX2luZm8ocmVzb3VyY2UpKSkKKwkJcmV0dXJuIGx2aS0+bG9ja19tb2RlOworCisJcmV0dXJuIC0xOworfQorCisKK3ZvaWQgaW5pdF9sdmhhc2godm9pZCkKK3sKKwkvKiBDcmVhdGUgaGFzaCB0YWJsZSBmb3Iga2VlcGluZyBMViBsb2NrcyAmIHN0YXR1cyAqLworCWx2X2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMDI0KTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmx2X2hhc2hfbG9jaywgTlVMTCk7CisJcHRocmVhZF9tdXRleF9pbml0KCZsdm1fbG9jaywgTlVMTCk7Cit9CisKKy8qIENhbGxlZCBhdCBzaHV0ZG93biB0byB0aWR5IHRoZSBsb2Nrc3BhY2UgKi8KK3ZvaWQgZGVzdHJveV9sdmhhc2godm9pZCkKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICp2OworCXN0cnVjdCBsdl9pbmZvICpsdmk7CisJY2hhciAqcmVzb3VyY2U7CisJaW50IHN0YXR1czsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHZfaGFzaF9sb2NrKTsKKworCWRtX2hhc2hfaXRlcmF0ZSh2LCBsdl9oYXNoKSB7CisJCWx2aSA9IGRtX2hhc2hfZ2V0X2RhdGEobHZfaGFzaCwgdik7CisJCXJlc291cmNlID0gZG1faGFzaF9nZXRfa2V5KGx2X2hhc2gsIHYpOworCisJCWlmICgoc3RhdHVzID0gc3luY191bmxvY2socmVzb3VyY2UsIGx2aS0+bG9ja19pZCkpKQorCQkJREVCVUdMT0coInVubG9ja19hbGwuIHVubG9jayBmYWlsZWQoJWQpOiAlc1xuIiwKKwkJCQkgc3RhdHVzLCAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZG1fZnJlZShsdmkpOworCX0KKworCWRtX2hhc2hfZGVzdHJveShsdl9oYXNoKTsKKwlsdl9oYXNoID0gTlVMTDsKKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsdl9oYXNoX2xvY2spOworfQorCisvKiBHZXRzIGEgcmVhbCBsb2NrIGFuZCBrZWVwcyB0aGUgaW5mbyBpbiB0aGUgaGFzaCB0YWJsZSAqLworc3RhdGljIGludCBob2xkX2xvY2soY2hhciAqcmVzb3VyY2UsIGludCBtb2RlLCBpbnQgZmxhZ3MpCit7CisJaW50IHN0YXR1czsKKwlpbnQgc2F2ZWRfZXJybm87CisJc3RydWN0IGx2X2luZm8gKmx2aTsKKworCS8qIE1hc2sgb2ZmIGludmFsaWQgb3B0aW9ucyAqLworCWZsYWdzICY9IExDS0ZfTk9RVUVVRSB8IExDS0ZfQ09OVkVSVDsKKworCWx2aSA9IGxvb2t1cF9pbmZvKHJlc291cmNlKTsKKworCWlmIChsdmkpIHsKKwkJaWYgKGx2aS0+bG9ja19tb2RlID09IG1vZGUpIHsKKwkJCURFQlVHTE9HKCJob2xkX2xvY2ssIGxvY2sgbW9kZSAlZCBhbHJlYWR5IGhlbGRcbiIsCisJCQkJIG1vZGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKChsdmktPmxvY2tfbW9kZSA9PSBMQ0tfRVhDTCkgJiYgKG1vZGUgPT0gTENLX1dSSVRFKSkgeworCQkJREVCVUdMT0coImhvbGRfbG9jaywgbG9jayBhbHJlYWR5IGhlbGQgTENLX0VYQ0wsICIKKwkJCQkgImlnbm9yaW5nIExDS19XUklURSByZXF1ZXN0XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogT25seSBhbGxvdyBleHBsaWNpdCBjb252ZXJzaW9ucyAqLworCWlmIChsdmkgJiYgIShmbGFncyAmIExDS0ZfQ09OVkVSVCkpIHsKKwkJZXJybm8gPSBFQlVTWTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobHZpKSB7CisJCS8qIEFscmVhZHkgZXhpc3RzIC0gY29udmVydCBpdCAqLworCQlzdGF0dXMgPSBzeW5jX2xvY2socmVzb3VyY2UsIG1vZGUsIGZsYWdzLCAmbHZpLT5sb2NrX2lkKTsKKwkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJaWYgKCFzdGF0dXMpCisJCQlsdmktPmxvY2tfbW9kZSA9IG1vZGU7CisJCWVsc2UKKwkJCURFQlVHTE9HKCJob2xkX2xvY2suIGNvbnZlcnQgdG8gJWQgZmFpbGVkOiAlc1xuIiwgbW9kZSwKKwkJCQkgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXJybm8gPSBzYXZlZF9lcnJubzsKKwl9IGVsc2UgeworCQlpZiAoIShsdmkgPSBkbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBsdl9pbmZvKSkpKSB7CisJCQllcnJubyA9IEVOT01FTTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWx2aS0+bG9ja19tb2RlID0gbW9kZTsKKwkJbHZpLT5sb2NrX2lkID0gMDsKKwkJc3RhdHVzID0gc3luY19sb2NrKHJlc291cmNlLCBtb2RlLCBmbGFncyAmIH5MQ0tGX0NPTlZFUlQsICZsdmktPmxvY2tfaWQpOworCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQlpZiAoc3RhdHVzKSB7CisJCQlkbV9mcmVlKGx2aSk7CisJCQlERUJVR0xPRygiaG9sZF9sb2NrLiBsb2NrIGF0ICVkIGZhaWxlZDogJXNcbiIsIG1vZGUsCisJCQkJIHN0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZQorCQkJaWYgKCFpbnNlcnRfaW5mbyhyZXNvdXJjZSwgbHZpKSkgeworCQkJCWVycm5vID0gRU5PTUVNOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQllcnJubyA9IHNhdmVkX2Vycm5vOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBVbmxvY2sgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBoYXNoIHRhYmxlICovCitzdGF0aWMgaW50IGhvbGRfdW5sb2NrKGNoYXIgKnJlc291cmNlKQoreworCXN0cnVjdCBsdl9pbmZvICpsdmk7CisJaW50IHN0YXR1czsKKwlpbnQgc2F2ZWRfZXJybm87CisKKwlpZiAoIShsdmkgPSBsb29rdXBfaW5mbyhyZXNvdXJjZSkpKSB7CisJCURFQlVHTE9HKCJob2xkX3VubG9jaywgbG9jayBub3QgYWxyZWFkeSBoZWxkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHVzID0gc3luY191bmxvY2socmVzb3VyY2UsIGx2aS0+bG9ja19pZCk7CisJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwlpZiAoIXN0YXR1cykgeworCQlyZW1vdmVfaW5mbyhyZXNvdXJjZSk7CisJCWRtX2ZyZWUobHZpKTsKKwl9IGVsc2UgeworCQlERUJVR0xPRygiaG9sZF91bmxvY2suIHVubG9jayBmYWlsZWQoJWQpOiAlc1xuIiwgc3RhdHVzLAorCQkJIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJZXJybm8gPSBzYXZlZF9lcnJubzsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBXYXRjaCB0aGUgcmV0dXJuIGNvZGVzIGhlcmUuCisgICBsaWJsdm0gQVBJIGZ1bmN0aW9ucyByZXR1cm4gMSh0cnVlKSBmb3Igc3VjY2VzcywgMChmYWxzZSkgZm9yIGZhaWx1cmUgYW5kIGRvbid0IHNldCBlcnJuby4KKyAgIGxpYmRsbSBBUEkgZnVuY3Rpb25zIHJldHVybiAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZSBhbmQgZG8gc2V0IGVycm5vLgorICAgVGhlc2UgZnVuY3Rpb25zIGhlcmUgcmV0dXJuIDAgZm9yIHN1Y2Nlc3Mgb3IgPjAgZm9yIGZhaWx1cmUgKHdoZXJlIHRoZSByZXRjb2RlIGlzIGVycm5vKQorKi8KKworLyogQWN0aXZhdGUgTFYgZXhjbHVzaXZlIG9yIG5vbi1leGNsdXNpdmUgKi8KK3N0YXRpYyBpbnQgZG9fYWN0aXZhdGVfbHYoY2hhciAqcmVzb3VyY2UsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzLCBpbnQgbW9kZSkKK3sKKwlpbnQgb2xkbW9kZTsKKwlpbnQgc3RhdHVzOworCWludCBhY3RpdmF0ZV9sdjsKKwlpbnQgZXhjbHVzaXZlID0gMDsKKwlzdHJ1Y3QgbHZpbmZvIGx2aTsKKworCS8qIElzIGl0IGFscmVhZHkgb3BlbiA/ICovCisJb2xkbW9kZSA9IGdldF9jdXJyZW50X2xvY2socmVzb3VyY2UpOworCWlmIChvbGRtb2RlID09IG1vZGUgJiYgKGNvbW1hbmQgJiBMQ0tfQ0xVU1RFUl9WRykpIHsKKwkJREVCVUdMT0coImRvX2FjdGl2YXRlX2x2LCBsb2NrIGFscmVhZHkgaGVsZCBhdCAlZFxuIiwgb2xkbW9kZSk7CisJCXJldHVybiAwOwkvKiBOb3RoaW5nIHRvIGRvICovCisJfQorCisJLyogRG9lcyB0aGUgY29uZmlnIGZpbGUgd2FudCB1cyB0byBhY3RpdmF0ZSB0aGlzIExWID8gKi8KKwlpZiAoIWx2X2FjdGl2YXRpb25fZmlsdGVyKGNtZCwgcmVzb3VyY2UsICZhY3RpdmF0ZV9sdiwgTlVMTCkpCisJCXJldHVybiBFSU87CisKKwlpZiAoIWFjdGl2YXRlX2x2KQorCQlyZXR1cm4gMDsJLyogU3VjY2Vzcywgd2UgZGlkIG5vdGhpbmchICovCisKKwkvKiBEbyB3ZSBuZWVkIHRvIGFjdGl2YXRlIGV4Y2x1c2l2ZWx5PyAqLworCWlmICgoYWN0aXZhdGVfbHYgPT0gMikgfHwgKG1vZGUgPT0gTENLX0VYQ0wpKSB7CisJCWV4Y2x1c2l2ZSA9IDE7CisJCW1vZGUgPSBMQ0tfRVhDTDsKKwl9CisKKwkvKgorCSAqIFRyeSB0byBnZXQgdGhlIGxvY2sgaWYgaXQncyBhIGNsdXN0ZXJlZCB2b2x1bWUgZ3JvdXAuCisJICogVXNlIGxvY2sgY29udmVyc2lvbiBvbmx5IGlmIHJlcXVlc3RlZCwgdG8gcHJldmVudCBpbXBsaWNpdCBjb252ZXJzaW9uCisJICogb2YgZXhjbHVzaXZlIGxvY2sgdG8gc2hhcmVkIG9uZSBkdXJpbmcgYWN0aXZhdGlvbi4KKwkgKi8KKwlpZiAoIXRlc3RfbW9kZSgpICYmIGNvbW1hbmQgJiBMQ0tfQ0xVU1RFUl9WRykgeworCQlzdGF0dXMgPSBob2xkX2xvY2socmVzb3VyY2UsIG1vZGUsIExDS0ZfTk9RVUVVRSB8ICgobG9ja19mbGFncyAmIExDS19DT05WRVJUX01PREUpID8gTENLRl9DT05WRVJUOjApKTsKKwkJaWYgKHN0YXR1cykgeworCQkJLyogUmV0dXJuIGFuIExWTS1zZW5zaWJsZSBlcnJvciBmb3IgdGhpcy4KKwkJCSAqIEZvcmNpbmcgRUlPIG1ha2VzIHRoZSB1cHBlciBsZXZlbCByZXR1cm4gdGhpcyB0ZXh0CisJCQkgKiByYXRoZXIgdGhhbiB0aGUgc3RyZXJyb3IgdGV4dCBmb3IgRUFHQUlOLgorCQkJICovCisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkJc3ByaW50ZihsYXN0X2Vycm9yLCAiVm9sdW1lIGlzIGJ1c3kgb24gYW5vdGhlciBub2RlIik7CisJCQkJZXJybm8gPSBFSU87CisJCQl9CisJCQlyZXR1cm4gZXJybm87CisJCX0KKwl9CisKKwkvKiBJZiBpdCdzIHN1c3BlbmRlZCB0aGVuIHJlc3VtZSBpdCAqLworCWlmICghbHZfaW5mb19ieV9sdmlkKGNtZCwgcmVzb3VyY2UsIDAsICZsdmksIDAsIDApKQorCQlnb3RvIGVycm9yOworCisJaWYgKGx2aS5zdXNwZW5kZWQpIHsKKwkJY3JpdGljYWxfc2VjdGlvbl9pbmMoY21kLCAicmVzdW1pbmciKTsKKwkJaWYgKCFsdl9yZXN1bWUoY21kLCByZXNvdXJjZSwgMCwgTlVMTCkpIHsKKwkJCWNyaXRpY2FsX3NlY3Rpb25fZGVjKGNtZCwgInJlc3VtZWQiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwkvKiBOb3cgYWN0aXZhdGUgaXQgKi8KKwlpZiAoIWx2X2FjdGl2YXRlKGNtZCwgcmVzb3VyY2UsIGV4Y2x1c2l2ZSwgMCwgMCwgTlVMTCkpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKCF0ZXN0X21vZGUoKSAmJiAob2xkbW9kZSA9PSAtMSB8fCBvbGRtb2RlICE9IG1vZGUpKQorCQkodm9pZClob2xkX3VubG9jayhyZXNvdXJjZSk7CisJcmV0dXJuIEVJTzsKK30KKworLyogUmVzdW1lIHRoZSBMViBpZiBpdCB3YXMgYWN0aXZlICovCitzdGF0aWMgaW50IGRvX3Jlc3VtZV9sdihjaGFyICpyZXNvdXJjZSwgdW5zaWduZWQgY2hhciBjb21tYW5kLCB1bnNpZ25lZCBjaGFyIGxvY2tfZmxhZ3MpCit7CisJaW50IG9sZG1vZGUsIG9yaWdpbl9vbmx5LCBleGNsdXNpdmUsIHJldmVydDsKKworCS8qIElzIGl0IG9wZW4gPyAqLworCW9sZG1vZGUgPSBnZXRfY3VycmVudF9sb2NrKHJlc291cmNlKTsKKwlpZiAob2xkbW9kZSA9PSAtMSAmJiAoY29tbWFuZCAmIExDS19DTFVTVEVSX1ZHKSkgeworCQlERUJVR0xPRygiZG9fcmVzdW1lX2x2LCBsb2NrIG5vdCBhbHJlYWR5IGhlbGRcbiIpOworCQlyZXR1cm4gMDsJLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworCX0KKwlvcmlnaW5fb25seSA9IChsb2NrX2ZsYWdzICYgTENLX09SSUdJTl9PTkxZX01PREUpID8gMSA6IDA7CisJZXhjbHVzaXZlID0gKG9sZG1vZGUgPT0gTENLX0VYQ0wpID8gMSA6IDA7CisJcmV2ZXJ0ID0gKGxvY2tfZmxhZ3MgJiBMQ0tfUkVWRVJUX01PREUpID8gMSA6IDA7CisKKwlpZiAoIWx2X3Jlc3VtZV9pZl9hY3RpdmUoY21kLCByZXNvdXJjZSwgb3JpZ2luX29ubHksIGV4Y2x1c2l2ZSwgcmV2ZXJ0LCBOVUxMKSkKKwkJcmV0dXJuIEVJTzsKKworCXJldHVybiAwOworfQorCisvKiBTdXNwZW5kIHRoZSBkZXZpY2UgaWYgYWN0aXZlICovCitzdGF0aWMgaW50IGRvX3N1c3BlbmRfbHYoY2hhciAqcmVzb3VyY2UsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzKQoreworCWludCBvbGRtb2RlOworCXVuc2lnbmVkIG9yaWdpbl9vbmx5ID0gKGxvY2tfZmxhZ3MgJiBMQ0tfT1JJR0lOX09OTFlfTU9ERSkgPyAxIDogMDsKKwl1bnNpZ25lZCBleGNsdXNpdmU7CisKKwkvKiBJcyBpdCBvcGVuID8gKi8KKwlvbGRtb2RlID0gZ2V0X2N1cnJlbnRfbG9jayhyZXNvdXJjZSk7CisJaWYgKG9sZG1vZGUgPT0gLTEgJiYgKGNvbW1hbmQgJiBMQ0tfQ0xVU1RFUl9WRykpIHsKKwkJREVCVUdMT0coImRvX3N1c3BlbmRfbHYsIGxvY2sgbm90IGFscmVhZHkgaGVsZFxuIik7CisJCXJldHVybiAwOyAvKiBOb3QgYWN0aXZlLCBzbyBpdCdzIE9LICovCisJfQorCisJZXhjbHVzaXZlID0gKG9sZG1vZGUgPT0gTENLX0VYQ0wpID8gMSA6IDA7CisKKwkvKiBBbHdheXMgY2FsbCBsdl9zdXNwZW5kIHRvIHJlYWQgY29tbWl0ZWQgYW5kIHByZWNvbW1pdGVkIGRhdGEgKi8KKwlpZiAoIWx2X3N1c3BlbmRfaWZfYWN0aXZlKGNtZCwgcmVzb3VyY2UsIG9yaWdpbl9vbmx5LCBleGNsdXNpdmUsIE5VTEwsIE5VTEwpKQorCQlyZXR1cm4gRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGVhY3RpdmF0ZV9sdihjaGFyICpyZXNvdXJjZSwgdW5zaWduZWQgY2hhciBjb21tYW5kLCB1bnNpZ25lZCBjaGFyIGxvY2tfZmxhZ3MpCit7CisJaW50IG9sZG1vZGU7CisJaW50IHN0YXR1czsKKworCS8qIElzIGl0IG9wZW4gPyAqLworCW9sZG1vZGUgPSBnZXRfY3VycmVudF9sb2NrKHJlc291cmNlKTsKKwlpZiAob2xkbW9kZSA9PSAtMSAmJiAoY29tbWFuZCAmIExDS19DTFVTVEVSX1ZHKSkgeworCQlERUJVR0xPRygiZG9fZGVhY3RpdmF0ZV9sb2NrLCBsb2NrIG5vdCBhbHJlYWR5IGhlbGRcbiIpOworCQlyZXR1cm4gMDsJLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworCX0KKworCWlmICghbHZfZGVhY3RpdmF0ZShjbWQsIHJlc291cmNlLCBOVUxMKSkKKwkJcmV0dXJuIEVJTzsKKworCWlmICghdGVzdF9tb2RlKCkgJiYgY29tbWFuZCAmIExDS19DTFVTVEVSX1ZHKSB7CisJCXN0YXR1cyA9IGhvbGRfdW5sb2NrKHJlc291cmNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBlcnJubzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqZG9fbG9ja19xdWVyeShjaGFyICpyZXNvdXJjZSkKK3sKKwlpbnQgbW9kZTsKKwljb25zdCBjaGFyICp0eXBlOworCisJbW9kZSA9IGdldF9jdXJyZW50X2xvY2socmVzb3VyY2UpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTENLX05VTEw6IHR5cGUgPSAiTkwiOyBicmVhazsKKwljYXNlIExDS19SRUFEOiB0eXBlID0gIkNSIjsgYnJlYWs7CisJY2FzZSBMQ0tfUFJFQUQ6dHlwZSA9ICJQUiI7IGJyZWFrOworCWNhc2UgTENLX1dSSVRFOnR5cGUgPSAiUFciOyBicmVhazsKKwljYXNlIExDS19FWENMOiB0eXBlID0gIkVYIjsgYnJlYWs7CisJZGVmYXVsdDogdHlwZSA9IE5VTEw7CisJfQorCisJREVCVUdMT0coImRvX2xvY2tfcXVlcnk6IHJlc291cmNlICclcycsIG1vZGUgJWkgKCVzKVxuIiwgcmVzb3VyY2UsIG1vZGUsIHR5cGUgPzogIi0tIik7CisKKwlyZXR1cm4gdHlwZTsKK30KKworLyogVGhpcyBpcyB0aGUgTE9DS19MViBwYXJ0IHRoYXQgaGFwcGVucyBvbiBhbGwgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgLQorICAgaXQgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGRldmljZS1tYXBwZXIgYW5kIExWTSAqLworaW50IGRvX2xvY2tfbHYodW5zaWduZWQgY2hhciBjb21tYW5kLCB1bnNpZ25lZCBjaGFyIGxvY2tfZmxhZ3MsIGNoYXIgKnJlc291cmNlKQoreworCWludCBzdGF0dXMgPSAwOworCisJREVCVUdMT0coImRvX2xvY2tfbHY6IHJlc291cmNlICclcycsIGNtZCA9ICVzLCBmbGFncyA9ICVzLCBjcml0aWNhbF9zZWN0aW9uID0gJWRcbiIsCisJCSByZXNvdXJjZSwgZGVjb2RlX2xvY2tpbmdfY21kKGNvbW1hbmQpLCBkZWNvZGVfZmxhZ3MobG9ja19mbGFncyksIGNyaXRpY2FsX3NlY3Rpb24oKSk7CisKKwlpZiAoIWNtZC0+aW5pdGlhbGl6ZWQuY29uZmlnIHx8IGNvbmZpZ19maWxlc19jaGFuZ2VkKGNtZCkpIHsKKwkJLyogUmVpbml0aWFsaXNlIHZhcmlvdXMgc2V0dGluZ3MgaW5jLiBsb2dnaW5nLCBmaWx0ZXJzICovCisJCWlmIChkb19yZWZyZXNoX2NhY2hlKCkpIHsKKwkJCWxvZ19lcnJvcigiVXBkYXRlZCBjb25maWcgZmlsZSBpbnZhbGlkLiBBYm9ydGluZy4iKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmx2bV9sb2NrKTsKKwlpbml0X3Rlc3QoKGxvY2tfZmxhZ3MgJiBMQ0tfVEVTVF9NT0RFKSA/IDEgOiAwKTsKKworCWlmIChsb2NrX2ZsYWdzICYgTENLX01JUlJPUl9OT1NZTkNfTU9ERSkKKwkJaW5pdF9taXJyb3JfaW5fc3luYygxKTsKKworCWlmIChsb2NrX2ZsYWdzICYgTENLX0RNRVZFTlREX01PTklUT1JfSUdOT1JFKQorCQlpbml0X2RtZXZlbnRkX21vbml0b3IoRE1FVkVOVERfTU9OSVRPUl9JR05PUkUpOworCWVsc2UgeworCQlpZiAobG9ja19mbGFncyAmIExDS19ETUVWRU5URF9NT05JVE9SX01PREUpCisJCQlpbml0X2RtZXZlbnRkX21vbml0b3IoMSk7CisJCWVsc2UKKwkJCWluaXRfZG1ldmVudGRfbW9uaXRvcigwKTsKKwl9CisKKwljbWQtPnBhcnRpYWxfYWN0aXZhdGlvbiA9IChsb2NrX2ZsYWdzICYgTENLX1BBUlRJQUxfTU9ERSkgPyAxIDogMDsKKworCS8qIGNsdm1kIHNob3VsZCBuZXZlciB0cnkgdG8gcmVhZCBzdXNwZW5kZWQgZGV2aWNlICovCisJaW5pdF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMoMSk7CisKKwlzd2l0Y2ggKGNvbW1hbmQgJiBMQ0tfTUFTSykgeworCWNhc2UgTENLX0xWX0VYQ0xVU0lWRToKKwkJc3RhdHVzID0gZG9fYWN0aXZhdGVfbHYocmVzb3VyY2UsIGNvbW1hbmQsIGxvY2tfZmxhZ3MsIExDS19FWENMKTsKKwkJYnJlYWs7CisKKwljYXNlIExDS19MVl9TVVNQRU5EOgorCQlzdGF0dXMgPSBkb19zdXNwZW5kX2x2KHJlc291cmNlLCBjb21tYW5kLCBsb2NrX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIExDS19VTkxPQ0s6CisJY2FzZSBMQ0tfTFZfUkVTVU1FOgkvKiBpZiBhY3RpdmUgKi8KKwkJc3RhdHVzID0gZG9fcmVzdW1lX2x2KHJlc291cmNlLCBjb21tYW5kLCBsb2NrX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIExDS19MVl9BQ1RJVkFURToKKwkJc3RhdHVzID0gZG9fYWN0aXZhdGVfbHYocmVzb3VyY2UsIGNvbW1hbmQsIGxvY2tfZmxhZ3MsIExDS19SRUFEKTsKKwkJYnJlYWs7CisKKwljYXNlIExDS19MVl9ERUFDVElWQVRFOgorCQlzdGF0dXMgPSBkb19kZWFjdGl2YXRlX2x2KHJlc291cmNlLCBjb21tYW5kLCBsb2NrX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVR0xPRygiSW52YWxpZCBMViBjb21tYW5kIDB4JXhcbiIsIGNvbW1hbmQpOworCQlzdGF0dXMgPSBFSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmIChsb2NrX2ZsYWdzICYgTENLX01JUlJPUl9OT1NZTkNfTU9ERSkKKwkJaW5pdF9taXJyb3JfaW5fc3luYygwKTsKKworCWNtZC0+cGFydGlhbF9hY3RpdmF0aW9uID0gMDsKKworCS8qIGNsZWFuIHRoZSBwb29sIGZvciBhbm90aGVyIGNvbW1hbmQgKi8KKwlkbV9wb29sX2VtcHR5KGNtZC0+bWVtKTsKKwlpbml0X3Rlc3QoMCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bV9sb2NrKTsKKworCURFQlVHTE9HKCJDb21tYW5kIHJldHVybiBpcyAlZCwgY3JpdGljYWxfc2VjdGlvbiBpcyAlZFxuIiwgc3RhdHVzLCBjcml0aWNhbF9zZWN0aW9uKCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEZ1bmN0aW9ucyB0byBkbyBvbiB0aGUgbG9jYWwgbm9kZSBvbmx5IEJFRk9SRSB0aGUgY2x1c3Rlci13aWRlIHN0dWZmIGFib3ZlIGhhcHBlbnMgKi8KK2ludCBwcmVfbG9ja19sdih1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGNoYXIgbG9ja19mbGFncywgY2hhciAqcmVzb3VyY2UpCit7CisJLyogTmVhcmx5IGFsbCB0aGUgc3R1ZmYgaGFwcGVucyBjbHVzdGVyLXdpZGUuIEFwYXJ0IGZyb20gU1VTUEVORC4gSGVyZSB3ZSBnZXQgdGhlCisJICAgbG9jayBvdXQgb24gdGhpcyBub2RlIChiZWNhdXNlIHdlIGFyZSB0aGUgbm9kZSBtb2RpZnlpbmcgdGhlIG1ldGFkYXRhKQorCSAgIGJlZm9yZSBzdXNwZW5kaW5nIGNsdXN0ZXItd2lkZS4KKwkgICBMQ0tGX0NPTlZFUlQgaXMgdXNlZCBhbHdheXMsIGxvY2FsIG5vZGUgaXMgZ29pbmcgdG8gbW9kaWZ5IG1ldGFkYXRhCisJICovCisJaWYgKChjb21tYW5kICYgKExDS19TQ09QRV9NQVNLIHwgTENLX1RZUEVfTUFTSykpID09IExDS19MVl9TVVNQRU5EICYmCisJICAgIChjb21tYW5kICYgTENLX0NMVVNURVJfVkcpKSB7CisJCURFQlVHTE9HKCJwcmVfbG9ja19sdjogcmVzb3VyY2UgJyVzJywgY21kID0gJXMsIGZsYWdzID0gJXNcbiIsCisJCQkgcmVzb3VyY2UsIGRlY29kZV9sb2NraW5nX2NtZChjb21tYW5kKSwgZGVjb2RlX2ZsYWdzKGxvY2tfZmxhZ3MpKTsKKworCQlpZiAoIShsb2NrX2ZsYWdzICYgTENLX1RFU1RfTU9ERSkgJiYKKwkJICAgIGhvbGRfbG9jayhyZXNvdXJjZSwgTENLX1dSSVRFLCBMQ0tGX05PUVVFVUUgfCBMQ0tGX0NPTlZFUlQpKQorCQkJcmV0dXJuIGVycm5vOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRnVuY3Rpb25zIHRvIGRvIG9uIHRoZSBsb2NhbCBub2RlIG9ubHkgQUZURVIgdGhlIGNsdXN0ZXItd2lkZSBzdHVmZiBhYm92ZSBoYXBwZW5zICovCitpbnQgcG9zdF9sb2NrX2x2KHVuc2lnbmVkIGNoYXIgY29tbWFuZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzLAorCQkgY2hhciAqcmVzb3VyY2UpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBvcmlnaW5fb25seSA9IChsb2NrX2ZsYWdzICYgTENLX09SSUdJTl9PTkxZX01PREUpID8gMSA6IDA7CisKKwkvKiBPcHBvc2l0ZSBvZiBhYm92ZSwgZG9uZSBvbiByZXN1bWUgYWZ0ZXIgYSBtZXRhZGF0YSB1cGRhdGUgKi8KKwlpZiAoKGNvbW1hbmQgJiAoTENLX1NDT1BFX01BU0sgfCBMQ0tfVFlQRV9NQVNLKSkgPT0gTENLX0xWX1JFU1VNRSAmJgorCSAgICAoY29tbWFuZCAmIExDS19DTFVTVEVSX1ZHKSkgeworCQlpbnQgb2xkbW9kZTsKKworCQlERUJVR0xPRygicG9zdF9sb2NrX2x2OiByZXNvdXJjZSAnJXMnLCBjbWQgPSAlcywgZmxhZ3MgPSAlc1xuIiwKKwkJCSByZXNvdXJjZSwgZGVjb2RlX2xvY2tpbmdfY21kKGNvbW1hbmQpLCBkZWNvZGVfZmxhZ3MobG9ja19mbGFncykpOworCisJCS8qIElmIHRoZSBsb2NrIHN0YXRlIGlzIFBXIHRoZW4gcmVzdG9yZSBpdCB0byB3aGF0IGl0IHdhcyAqLworCQlvbGRtb2RlID0gZ2V0X2N1cnJlbnRfbG9jayhyZXNvdXJjZSk7CisJCWlmIChvbGRtb2RlID09IExDS19XUklURSkgeworCQkJc3RydWN0IGx2aW5mbyBsdmk7CisKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHZtX2xvY2spOworCQkJc3RhdHVzID0gbHZfaW5mb19ieV9sdmlkKGNtZCwgcmVzb3VyY2UsIG9yaWdpbl9vbmx5LCAmbHZpLCAwLCAwKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsdm1fbG9jayk7CisJCQlpZiAoIXN0YXR1cykKKwkJCQlyZXR1cm4gRUlPOworCisJCQlpZiAoIShsb2NrX2ZsYWdzICYgTENLX1RFU1RfTU9ERSkpIHsKKwkJCQlpZiAobHZpLmV4aXN0cykgeworCQkJCQlpZiAoaG9sZF9sb2NrKHJlc291cmNlLCBMQ0tfUkVBRCwgTENLRl9DT05WRVJUKSkKKwkJCQkJCXJldHVybiBlcnJubzsKKwkJCQl9IGVsc2UgaWYgKGhvbGRfdW5sb2NrKHJlc291cmNlKSkKKwkJCQkJcmV0dXJuIGVycm5vOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGVjayBpZiBhIFZHIGlzIGluIHVzZSBieSBMVk0xIHNvIHdlIGRvbid0IHN0b21wIG9uIGl0ICovCitpbnQgZG9fY2hlY2tfbHZtMShjb25zdCBjaGFyICp2Z25hbWUpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGNoZWNrX2x2bTFfdmdfaW5hY3RpdmUoY21kLCB2Z25hbWUpOworCisJcmV0dXJuIHN0YXR1cyA9PSAxID8gMCA6IEVCVVNZOworfQorCitpbnQgZG9fcmVmcmVzaF9jYWNoZSh2b2lkKQoreworCURFQlVHTE9HKCJSZWZyZXNoaW5nIGNvbnRleHRcbiIpOworCWxvZ19ub3RpY2UoIlJlZnJlc2hpbmcgY29udGV4dCIpOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsdm1fbG9jayk7CisKKwlpZiAoIXJlZnJlc2hfdG9vbGNvbnRleHQoY21kKSkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbHZtX2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5pdF9mdWxsX3NjYW5fZG9uZSgwKTsKKwlpbml0X2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygxKTsKKwlsdm1jYWNoZV9mb3JjZV9uZXh0X2xhYmVsX3NjYW4oKTsKKwlsdm1jYWNoZV9sYWJlbF9zY2FuKGNtZCk7CisJZG1fcG9vbF9lbXB0eShjbWQtPm1lbSk7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHZtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgVkcgbG9jayAtIGRyb3AgbWV0YWRhdGEgb3IgdXBkYXRlIGx2bWNhY2hlIHN0YXRlCisgKi8KK3ZvaWQgZG9fbG9ja192Zyh1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGNoYXIgbG9ja19mbGFncywgY2hhciAqcmVzb3VyY2UpCit7CisJdWludDMyX3QgbG9ja19jbWQgPSBjb21tYW5kOworCWNoYXIgKnZnbmFtZSA9IHJlc291cmNlICsgMjsKKworCWxvY2tfY21kICY9IChMQ0tfU0NPUEVfTUFTSyB8IExDS19UWVBFX01BU0sgfCBMQ0tfSE9MRCk7CisKKwkvKgorCSAqIENoZWNrIGlmIExDS19DQUNIRSBzaG91bGQgYmUgc2V0LiBBbGwgUF8gbG9ja3MgZXhjZXB0ICMgYXJlIGNhY2hlIHJlbGF0ZWQuCisJICovCisJaWYgKHN0cm5jbXAocmVzb3VyY2UsICJQXyMiLCAzKSAmJiAhc3RybmNtcChyZXNvdXJjZSwgIlBfIiwgMikpCisJCWxvY2tfY21kIHw9IExDS19DQUNIRTsKKworCURFQlVHTE9HKCJkb19sb2NrX3ZnOiByZXNvdXJjZSAnJXMnLCBjbWQgPSAlcywgZmxhZ3MgPSAlcywgY3JpdGljYWxfc2VjdGlvbiA9ICVkXG4iLAorCQkgcmVzb3VyY2UsIGRlY29kZV9mdWxsX2xvY2tpbmdfY21kKGxvY2tfY21kKSwgZGVjb2RlX2ZsYWdzKGxvY2tfZmxhZ3MpLCBjcml0aWNhbF9zZWN0aW9uKCkpOworCisJLyogUF8jZ2xvYmFsIGNhdXNlcyBhIGZ1bGwgY2FjaGUgcmVmcmVzaCAqLworCWlmICghc3RyY21wKHJlc291cmNlLCAiUF8iIFZHX0dMT0JBTCkpIHsKKwkJZG9fcmVmcmVzaF9jYWNoZSgpOworCQlyZXR1cm47CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZsdm1fbG9jayk7CisJaW5pdF90ZXN0KChsb2NrX2ZsYWdzICYgTENLX1RFU1RfTU9ERSkgPyAxIDogMCk7CisKKwlzd2l0Y2ggKGxvY2tfY21kKSB7CisJCWNhc2UgTENLX1ZHX0NPTU1JVDoKKwkJCURFQlVHTE9HKCJ2Z19jb21taXQgbm90aWZpY2F0aW9uIGZvciBWRyAlc1xuIiwgdmduYW1lKTsKKwkJCWx2bWNhY2hlX2NvbW1pdF9tZXRhZGF0YSh2Z25hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgTENLX1ZHX1JFVkVSVDoKKwkJCURFQlVHTE9HKCJ2Z19yZXZlcnQgbm90aWZpY2F0aW9uIGZvciBWRyAlc1xuIiwgdmduYW1lKTsKKwkJCWx2bWNhY2hlX2Ryb3BfbWV0YWRhdGEodmduYW1lLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIExDS19WR19EUk9QX0NBQ0hFOgorCQlkZWZhdWx0OgorCQkJREVCVUdMT0coIkludmFsaWRhdGluZyBjYWNoZWQgbWV0YWRhdGEgZm9yIFZHICVzXG4iLCB2Z25hbWUpOworCQkJbHZtY2FjaGVfZHJvcF9tZXRhZGF0YSh2Z25hbWUsIDApOworCX0KKworCWluaXRfdGVzdCgwKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHZtX2xvY2spOworfQorCisvKgorICogSWRlYWxseSwgY2x2bWQgc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlIGFueSBMVnMgYXJlIGFjdGl2ZQorICogYnV0IHRoaXMgbWF5IG5vdCBiZSB0aGUgY2FzZS4uLgorICogSSBzdXBwb3NlIHRoaXMgYWxzbyBjb21lcyBpbiBoYW5keSBpZiBjbHZtZCBjcmFzaGVzLCBub3QgdGhhdCBpdCB3b3VsZCEKKyAqLworc3RhdGljIGludCBnZXRfaW5pdGlhbF9zdGF0ZShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqZXhjbF91dWlkKQoreworCWludCBsb2NrX21vZGU7CisJY2hhciBsdls2NV0sIHZnWzY1XSwgZmxhZ3NbMjZdLCB2Z19mbGFnc1syNl07IC8qIHdpdGggc3BhY2UgZm9yICdcMCcgKi8KKwljaGFyIHV1aWRbNjVdOworCWNoYXIgbGluZVsyNTVdOworCWNoYXIgKmx2c19jbWQ7CisJY29uc3QgY2hhciAqbHZtX2JpbmFyeSA9IGdldGVudigiTFZNX0JJTkFSWSIpID8gOiBMVk1fUEFUSDsKKwlGSUxFICpsdnM7CisKKwlpZiAoZG1fYXNwcmludGYoJmx2c19jbWQsICIlcyBsdnMgIC0tY29uZmlnICdsb2d7Y29tbWFuZF9uYW1lcz0wIHByZWZpeD1cIlwifScgIgorCQkJIi0tbm9sb2NraW5nIC0tbm9oZWFkaW5ncyAtbyB2Z191dWlkLGx2X3V1aWQsbHZfYXR0cix2Z19hdHRyIiwKKwkJCWx2bV9iaW5hcnkpIDwgMCkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRTogTWF5YmUgbGluayBhbmQgdXNlIGxpYmx2bTJjbWQgZGlyZWN0bHkgaW5zdGVhZCBvZiBmb3JrICovCisJaWYgKCEobHZzID0gcG9wZW4obHZzX2NtZCwgInIiKSkpIHsKKwkJZG1fZnJlZShsdnNfY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgbHZzKSkgeworCSAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJTY0cyAlNjRzICUyNXMgJTI1c1xuIiwgdmcsIGx2LCBmbGFncywgdmdfZmxhZ3MpID09IDQpIHsKKworCQkJLyogU3RhdGVzOiBzOnN1c3BlbmRlZCBhOmFjdGl2ZSBTOmRyb3BwZWQgc25hcHNob3QgSTppbnZhbGlkIHNuYXBzaG90ICovCisJCSAgICAgICAgaWYgKHN0cmxlbih2ZykgPT0gMzggJiYgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaXMgYSB2YWxpZCBVVUlEID8gKi8KKwkJCSAgICAoZmxhZ3NbNF0gPT0gJ2EnIHx8IGZsYWdzWzRdID09ICdzJykgJiYJLyogaXMgaXQgYWN0aXZlIG9yIHN1c3BlbmRlZD8gKi8KKwkJCSAgICB2Z19mbGFnc1s1XSA9PSAnYycpIHsJCQkvKiBpcyBpdCBjbHVzdGVyZWQgPyAqLworCQkJCS8qIENvbnZlcnQgaHlwaGVuLXNlcGFyYXRlZCBVVUlEcyBpbnRvIG9uZSAqLworCQkJCW1lbWNweSgmdXVpZFswXSwgJnZnWzBdLCA2KTsKKwkJCQltZW1jcHkoJnV1aWRbNl0sICZ2Z1s3XSwgNCk7CisJCQkJbWVtY3B5KCZ1dWlkWzEwXSwgJnZnWzEyXSwgNCk7CisJCQkJbWVtY3B5KCZ1dWlkWzE0XSwgJnZnWzE3XSwgNCk7CisJCQkJbWVtY3B5KCZ1dWlkWzE4XSwgJnZnWzIyXSwgNCk7CisJCQkJbWVtY3B5KCZ1dWlkWzIyXSwgJnZnWzI3XSwgNCk7CisJCQkJbWVtY3B5KCZ1dWlkWzI2XSwgJnZnWzMyXSwgNik7CisJCQkJbWVtY3B5KCZ1dWlkWzMyXSwgJmx2WzBdLCA2KTsKKwkJCQltZW1jcHkoJnV1aWRbMzhdLCAmbHZbN10sIDQpOworCQkJCW1lbWNweSgmdXVpZFs0Ml0sICZsdlsxMl0sIDQpOworCQkJCW1lbWNweSgmdXVpZFs0Nl0sICZsdlsxN10sIDQpOworCQkJCW1lbWNweSgmdXVpZFs1MF0sICZsdlsyMl0sIDQpOworCQkJCW1lbWNweSgmdXVpZFs1NF0sICZsdlsyN10sIDQpOworCQkJCW1lbWNweSgmdXVpZFs1OF0sICZsdlszMl0sIDYpOworCQkJCXV1aWRbNjRdID0gJ1wwJzsKKworCQkJCS8qIExvb2sgZm9yIHRoaXMgbG9jayBpbiB0aGUgbGlzdCBvZiBFWCBsb2NrcworCQkJCSAgIHdlIHdlcmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUgKi8KKwkJCQlsb2NrX21vZGUgPSAoZG1faGFzaF9sb29rdXAoZXhjbF91dWlkLCB1dWlkKSkgPworCQkJCQlMQ0tfRVhDTCA6IExDS19SRUFEOworCisJCQkJREVCVUdMT0coImdldHRpbmcgaW5pdGlhbCBsb2NrIGZvciAlc1xuIiwgdXVpZCk7CisJCQkJaWYgKGhvbGRfbG9jayh1dWlkLCBsb2NrX21vZGUsIExDS0ZfTk9RVUVVRSkpCisJCQkJCURFQlVHTE9HKCJGYWlsZWQgdG8gaG9sZCBsb2NrICVzXG4iLCB1dWlkKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAocGNsb3NlKGx2cykpCisJCURFQlVHTE9HKCJsdnMgcGNsb3NlIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlkbV9mcmVlKGx2c19jbWQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGx2bTJfbG9nX2ZuKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBkbV9lcnJubywKKwkJCWNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisKKwkvKiBTZW5kIG1lc3NhZ2VzIHRvIHRoZSBub3JtYWwgTFZNMiBsb2dnaW5nIHN5c3RlbSB0b28sCisJICAgc28gd2UgZ2V0IGRlYnVnIG91dHB1dCB3aGVuIGl0J3MgYXNrZWQgZm9yLgorIAkgICBXZSBuZWVkIHRvIE5VTEwgdGhlIGZ1bmN0aW9uIHB0ciBvdGhlcndpc2UgaXQgd2lsbCBqdXN0IGNhbGwKKwkgICBiYWNrIGludG8gaGVyZSEgKi8KKwlpbml0X2xvZ19mbihOVUxMKTsKKwlwcmludF9sb2cobGV2ZWwsIGZpbGUsIGxpbmUsIGRtX2Vycm5vLCAiJXMiLCBtZXNzYWdlKTsKKwlpbml0X2xvZ19mbihsdm0yX2xvZ19mbik7CisKKwkvKgorCSAqIElnbm9yZSBub24tZXJyb3IgbWVzc2FnZXMsIGJ1dCBzdG9yZSB0aGUgbGF0ZXN0IG9uZSBmb3IgcmV0dXJuaW5nCisJICogdG8gdGhlIHVzZXIuCisJICovCisJaWYgKGxldmVsICE9IF9MT0dfRVJSICYmIGxldmVsICE9IF9MT0dfRkFUQUwpCisJCXJldHVybjsKKworCXN0cm5jcHkobGFzdF9lcnJvciwgbWVzc2FnZSwgc2l6ZW9mKGxhc3RfZXJyb3IpKTsKKwlsYXN0X2Vycm9yW3NpemVvZihsYXN0X2Vycm9yKS0xXSA9ICdcMCc7Cit9CisKKy8qIFRoaXMgY2hlY2tzIHNvbWUgYmFzaWMgY2x1c3Rlci1MVk0gY29uZmlndXJhdGlvbiBzdHVmZiAqLworc3RhdGljIHZvaWQgY2hlY2tfY29uZmlnKHZvaWQpCit7CisJaW50IGxvY2tpbmdfdHlwZTsKKworCWxvY2tpbmdfdHlwZSA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgZ2xvYmFsX2xvY2tpbmdfdHlwZV9DRkcsIE5VTEwpOworCisJaWYgKGxvY2tpbmdfdHlwZSA9PSAzKSAvKiBjb21waWxlZC1pbiBjbHVzdGVyIHN1cHBvcnQgKi8KKwkJcmV0dXJuOworCisJaWYgKGxvY2tpbmdfdHlwZSA9PSAyKSB7IC8qIEV4dGVybmFsIGxpYnJhcnksIGNoZWNrIG5hbWUgKi8KKwkJY29uc3QgY2hhciAqbGlibmFtZTsKKworCQlsaWJuYW1lID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBnbG9iYWxfbG9ja2luZ19saWJyYXJ5X0NGRywgTlVMTCk7CisJCWlmIChsaWJuYW1lICYmIHN0cnN0cihsaWJuYW1lLCAibGlibHZtMmNsdXN0ZXJsb2NrLnNvIikpCisJCQlyZXR1cm47CisKKwkJbG9nX2Vycm9yKCJJbmNvcnJlY3QgTFZNIGxvY2tpbmcgbGlicmFyeSBzcGVjaWZpZWQgaW4gbHZtLmNvbmYsIGNsdXN0ZXIgb3BlcmF0aW9ucyBtYXkgbm90IHdvcmsuIik7CisJCXJldHVybjsKKwl9CisJbG9nX2Vycm9yKCJsb2NraW5nX3R5cGUgbm90IHNldCBjb3JyZWN0bHkgaW4gbHZtLmNvbmYsIGNsdXN0ZXIgb3BlcmF0aW9ucyB3aWxsIG5vdCB3b3JrLiIpOworfQorCisvKiBCYWNrdXBzIHVwIHRoZSBMVk0gbWV0YWRhdGEgaWYgaXQncyBjaGFuZ2VkICovCit2b2lkIGx2bV9kb19iYWNrdXAoY29uc3QgY2hhciAqdmduYW1lKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKiB2ZzsKKwlpbnQgY29uc2lzdGVudCA9IDA7CisKKwlERUJVR0xPRygiVHJpZ2dlcmluZyBiYWNrdXAgb2YgVkcgbWV0YWRhdGEgZm9yICVzLlxuIiwgdmduYW1lKTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHZtX2xvY2spOworCisJdmcgPSB2Z19yZWFkX2ludGVybmFsKGNtZCwgdmduYW1lLCBOVUxMIC8qdmdpZCovLCBXQVJOX1BWX1JFQUQsICZjb25zaXN0ZW50KTsKKworCWlmICh2ZyAmJiBjb25zaXN0ZW50KQorCQljaGVja19jdXJyZW50X2JhY2t1cCh2Zyk7CisJZWxzZQorCQlsb2dfZXJyb3IoIkVycm9yIGJhY2tpbmcgdXAgbWV0YWRhdGEsIGNhbid0IGZpbmQgVkcgZm9yIGdyb3VwICVzIiwgdmduYW1lKTsKKworCXJlbGVhc2VfdmcodmcpOworCWRtX3Bvb2xfZW1wdHkoY21kLT5tZW0pOworCisJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bV9sb2NrKTsKK30KKworc3RydWN0IGRtX2hhc2hfbm9kZSAqZ2V0X25leHRfZXhjbF9sb2NrKHN0cnVjdCBkbV9oYXNoX25vZGUgKnYsIGNoYXIgKipuYW1lKQoreworCXN0cnVjdCBsdl9pbmZvICpsdmk7CisKKwkqbmFtZSA9IE5VTEw7CisJaWYgKCF2KQorCQl2ID0gZG1faGFzaF9nZXRfZmlyc3QobHZfaGFzaCk7CisKKwlkbyB7CisJCWlmICh2KSB7CisJCQlsdmkgPSBkbV9oYXNoX2dldF9kYXRhKGx2X2hhc2gsIHYpOworCQkJREVCVUdMT0coIkxvb2tpbmcgZm9yIEVYIGxvY2tzLiBmb3VuZCAleCBtb2RlICVkXG4iLCBsdmktPmxvY2tfaWQsIGx2aS0+bG9ja19tb2RlKTsKKworCQkJaWYgKGx2aS0+bG9ja19tb2RlID09IExDS19FWENMKSB7CisJCQkJKm5hbWUgPSBkbV9oYXNoX2dldF9rZXkobHZfaGFzaCwgdik7CisJCQl9CisJCQl2ID0gZG1faGFzaF9nZXRfbmV4dChsdl9oYXNoLCB2KTsKKwkJfQorCX0gd2hpbGUgKHYgJiYgISpuYW1lKTsKKworCWlmICgqbmFtZSkKKwkJREVCVUdMT0coInJldHVybmluZyBFWGNsdXNpdmUgVVVJRCAlc1xuIiwgKm5hbWUpOworCXJldHVybiB2OworfQorCit2b2lkIGx2bV9kb19mc191bmxvY2sodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJmx2bV9sb2NrKTsKKwlERUJVR0xPRygiU3luY2luZyBkZXZpY2UgbmFtZXNcbiIpOworCWZzX3VubG9jaygpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsdm1fbG9jayk7Cit9CisKKy8qIENhbGxlZCB0byBpbml0aWFsaXNlIHRoZSBMVk0gY29udGV4dCBvZiB0aGUgZGFlbW9uICovCitpbnQgaW5pdF9jbHZtKHN0cnVjdCBkbV9oYXNoX3RhYmxlICpleGNsX3V1aWQpCit7CisJLyogVXNlIExPR19EQUVNT04gZm9yIHN5c2xvZyBtZXNzYWdlcyBpbnN0ZWFkIG9mIExPR19VU0VSICovCisJaW5pdF9zeXNsb2coTE9HX0RBRU1PTik7CisJb3BlbmxvZygiY2x2bWQiLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKworCS8qIEluaXRpYWxpc2UgYWxyZWFkeSBoZWxkIGxvY2tzICovCisJaWYgKCFnZXRfaW5pdGlhbF9zdGF0ZShleGNsX3V1aWQpKQorCQlsb2dfZXJyb3IoIkNhbm5vdCBsb2FkIGluaXRpYWwgbG9jayBzdGF0ZXMuIik7CisKKwlpZiAoIXVkZXZfaW5pdF9saWJyYXJ5X2NvbnRleHQoKSkKKwkJc3RhY2s7CisKKwlpZiAoIShjbWQgPSBjcmVhdGVfdG9vbGNvbnRleHQoMSwgTlVMTCwgMCwgMSwgMSwgMSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbW1hbmQgY29udGV4dCIpOworCQl1ZGV2X2Zpbl9saWJyYXJ5X2NvbnRleHQoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0b3JlZF9lcnJubygpKSB7CisJCWRlc3Ryb3lfdG9vbGNvbnRleHQoY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kLT5jbWRfbGluZSA9ICJjbHZtZCI7CisKKwkvKiBDaGVjayBsdm0uY29uZiBpcyBzZXR1cCBmb3IgY2x1c3Rlci1MVk0gKi8KKwljaGVja19jb25maWcoKTsKKwlpbml0X2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygxKTsKKworCS8qIFRyYXAgbG9nIG1lc3NhZ2VzIHNvIHdlIGNhbiBwYXNzIHRoZW0gYmFjayB0byB0aGUgdXNlciAqLworCWluaXRfbG9nX2ZuKGx2bTJfbG9nX2ZuKTsKKwltZW1sb2NrX2luY19kYWVtb24oY21kKTsKKworCXJldHVybiAxOworfQorCit2b2lkIGRlc3Ryb3lfbHZtKHZvaWQpCit7CisJaWYgKGNtZCkgeworCQltZW1sb2NrX2RlY19kYWVtb24oY21kKTsKKwkJZGVzdHJveV90b29sY29udGV4dChjbWQpOworCQl1ZGV2X2Zpbl9saWJyYXJ5X2NvbnRleHQoKTsKKwkJY21kID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2Nsdm1kL2x2bS1mdW5jdGlvbnMuaCBiL2RhZW1vbnMvY2x2bWQvbHZtLWZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzk2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL2x2bS1mdW5jdGlvbnMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBGdW5jdGlvbnMgaW4gbHZtLWZ1bmN0aW9ucy5jICovCisKKyNpZm5kZWYgX0xWTV9GVU5DVElPTlNfSAorI2RlZmluZSBfTFZNX0ZVTkNUSU9OU19ICisKK2V4dGVybiBpbnQgcHJlX2xvY2tfbHYodW5zaWduZWQgY2hhciBsb2NrX2NtZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzLAorCQkgICAgICAgY2hhciAqcmVzb3VyY2UpOworZXh0ZXJuIGludCBkb19sb2NrX2x2KHVuc2lnbmVkIGNoYXIgbG9ja19jbWQsIHVuc2lnbmVkIGNoYXIgbG9ja19mbGFncywKKwkJICAgICAgY2hhciAqcmVzb3VyY2UpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRvX2xvY2tfcXVlcnkoY2hhciAqcmVzb3VyY2UpOworZXh0ZXJuIGludCBwb3N0X2xvY2tfbHYodW5zaWduZWQgY2hhciBsb2NrX2NtZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzLAorCQkJY2hhciAqcmVzb3VyY2UpOworZXh0ZXJuIGludCBkb19jaGVja19sdm0xKGNvbnN0IGNoYXIgKnZnbmFtZSk7CitleHRlcm4gaW50IGRvX3JlZnJlc2hfY2FjaGUodm9pZCk7CitleHRlcm4gaW50IGluaXRfY2x2bShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqZXhjbF91dWlkKTsKK2V4dGVybiB2b2lkIGRlc3Ryb3lfbHZtKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF9sdmhhc2godm9pZCk7CitleHRlcm4gdm9pZCBkZXN0cm95X2x2aGFzaCh2b2lkKTsKK2V4dGVybiB2b2lkIGx2bV9kb19iYWNrdXAoY29uc3QgY2hhciAqdmduYW1lKTsKK2V4dGVybiBjaGFyICpnZXRfbGFzdF9sdm1fZXJyb3Iodm9pZCk7CitleHRlcm4gdm9pZCBkb19sb2NrX3ZnKHVuc2lnbmVkIGNoYXIgY29tbWFuZCwgdW5zaWduZWQgY2hhciBsb2NrX2ZsYWdzLAorCQkgICAgICBjaGFyICpyZXNvdXJjZSk7CitleHRlcm4gc3RydWN0IGRtX2hhc2hfbm9kZSAqZ2V0X25leHRfZXhjbF9sb2NrKHN0cnVjdCBkbV9oYXNoX25vZGUgKnYsIGNoYXIgKipuYW1lKTsKK3ZvaWQgbHZtX2RvX2ZzX3VubG9jayh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYWVtb25zL2Nsdm1kL3JlZnJlc2hfY2x2bWQuYyBiL2RhZW1vbnMvY2x2bWQvcmVmcmVzaF9jbHZtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODk1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL3JlZnJlc2hfY2x2bWQuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogRklYTUUgUmVtb3ZlIGR1cGxpY2F0ZWQgZnVuY3Rpb25zIGZyb20gdGhpcyBmaWxlLiAqLworCisvKgorICogU2VuZCBhIGNvbW1hbmQgdG8gYSBydW5uaW5nIGNsdm1kIGZyb20gdGhlIGNvbW1hbmQtbGluZQorICovCisKKyNpbmNsdWRlICJjbHZtZC1jb21tb24uaCIKKworI2luY2x1ZGUgImNsdm0uaCIKKyNpbmNsdWRlICJyZWZyZXNoX2Nsdm1kLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK3R5cGVkZWYgc3RydWN0IGx2bV9yZXNwb25zZSB7CisJY2hhciBub2RlWzI1NV07CisJY2hhciAqcmVzcG9uc2U7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfSBsdm1fcmVzcG9uc2VfdDsKKworLyoKKyAqIFRoaXMgZ2V0cyBzdHVjayBhdCB0aGUgc3RhcnQgb2YgbWVtb3J5IHdlIGFsbG9jYXRlIHNvIHdlCisgKiBjYW4gc2FuaXR5LWNoZWNrIGl0IGF0IGRlYWxsb2NhdGlvbiB0aW1lCisgKi8KKyNkZWZpbmUgTFZNX1NJR05BVFVSRSAweDQzNEM1NjRECisKK3N0YXRpYyBpbnQgX2Nsdm1kX3NvY2sgPSAtMTsKKworLyogT3BlbiBjb25uZWN0aW9uIHRvIHRoZSBjbHZtIGRhZW1vbiAqLworc3RhdGljIGludCBfb3Blbl9sb2NhbF9zb2NrKHZvaWQpCit7CisJaW50IGxvY2FsX3NvY2tldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja2FkZHIgPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OworCisJaWYgKCFkbV9zdHJuY3B5KHNvY2thZGRyLnN1bl9wYXRoLCBDTFZNRF9TT0NLTkFNRSwgc2l6ZW9mKHNvY2thZGRyLnN1bl9wYXRoKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2x2bWQgc29ja2V0IG5hbWUgdG9vIGxvbmcuIiwgQ0xWTURfU09DS05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogT3BlbiBsb2NhbCBzb2NrZXQgKi8KKwlpZiAoKGxvY2FsX3NvY2tldCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkxvY2FsIHNvY2tldCBjcmVhdGlvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjb25uZWN0KGxvY2FsX3NvY2tldCwoc3RydWN0IHNvY2thZGRyICopICZzb2NrYWRkciwKKwkJICAgIHNpemVvZihzb2NrYWRkcikpKSB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCisJCWZwcmludGYoc3RkZXJyLCAiY29ubmVjdCgpIGZhaWxlZCBvbiBsb2NhbCBzb2NrZXQ6ICVzXG4iLAorCQkJICBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY2xvc2UobG9jYWxfc29ja2V0KSkKKwkJCXJldHVybiAtMTsKKworCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGxvY2FsX3NvY2tldDsKK30KKworLyogU2VuZCBhIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgc3RhdHVzICovCitzdGF0aWMgaW50IF9zZW5kX3JlcXVlc3QoY29uc3QgY2hhciAqaW5idWYsIGludCBpbmxlbiwgY2hhciAqKnJldGJ1ZiwgaW50IG5vX3Jlc3BvbnNlKQoreworCWNoYXIgb3V0YnVmW1BJUEVfQlVGXTsKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKm91dGhlYWRlciA9IChzdHJ1Y3QgY2x2bV9oZWFkZXIgKikgb3V0YnVmOworCWludCBsZW47CisJdW5zaWduZWQgb2ZmOworCWludCBidWZsZW47CisJaW50IGVycjsKKworCS8qIFNlbmQgaXQgdG8gQ0xWTUQgKi8KKyByZXdyaXRlOgorCWlmICggKGVyciA9IHdyaXRlKF9jbHZtZF9zb2NrLCBpbmJ1ZiwgaW5sZW4pKSAhPSBpbmxlbikgeworCSAgICAgICAgaWYgKGVyciA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKwkJICAgICAgICBnb3RvIHJld3JpdGU7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBkYXRhIHRvIGNsdm1kOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobm9fcmVzcG9uc2UpCisJCXJldHVybiAxOworCisJLyogR2V0IHRoZSByZXNwb25zZSAqLworIHJlcmVhZDoKKwlpZiAoKGxlbiA9IHJlYWQoX2Nsdm1kX3NvY2ssIG91dGJ1Ziwgc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikpKSA8IDApIHsKKwkgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKwkJICAgICAgICBnb3RvIHJlcmVhZDsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIGRhdGEgZnJvbSBjbHZtZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGVuID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFT0YgcmVhZGluZyBDTFZNRCIpOworCQllcnJubyA9IEVOT1RDT05OOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgKi8KKwlidWZsZW4gPSBsZW4gKyBvdXRoZWFkZXItPmFyZ2xlbjsKKwkqcmV0YnVmID0gZG1fbWFsbG9jKGJ1Zmxlbik7CisJaWYgKCEqcmV0YnVmKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb3B5IHRoZSBoZWFkZXIgKi8KKwltZW1jcHkoKnJldGJ1Ziwgb3V0YnVmLCBsZW4pOworCW91dGhlYWRlciA9IChzdHJ1Y3QgY2x2bV9oZWFkZXIgKikgKnJldGJ1ZjsKKworCS8qIFJlYWQgdGhlIHJldHVybmVkIHZhbHVlcyAqLworCW9mZiA9IDE7CQkvKiB3ZSd2ZSBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IGJ5dGUgKi8KKwl3aGlsZSAob2ZmIDw9IG91dGhlYWRlci0+YXJnbGVuICYmIGxlbiA+IDApIHsKKwkJbGVuID0gcmVhZChfY2x2bWRfc29jaywgb3V0aGVhZGVyLT5hcmdzICsgb2ZmLAorCQkJICAgYnVmbGVuIC0gb2ZmIC0gb2Zmc2V0b2Yoc3RydWN0IGNsdm1faGVhZGVyLCBhcmdzKSk7CisJCWlmIChsZW4gPiAwKQorCQkJb2ZmICs9IGxlbjsKKwl9CisKKwkvKiBXYXMgaXQgYW4gZXJyb3IgPyAqLworCWlmIChvdXRoZWFkZXItPnN0YXR1cyAhPSAwKSB7CisJCWVycm5vID0gb3V0aGVhZGVyLT5zdGF0dXM7CisKKwkJLyogT25seSByZXR1cm4gYW4gZXJyb3IgaGVyZSBpZiB0aGVyZSBhcmUgbm8gbm9kZS1zcGVjaWZpYworCQkgICBlcnJvcnMgcHJlc2VudCBpbiB0aGUgbWVzc2FnZSB0aGF0IG1pZ2h0IGhhdmUgbW9yZSBkZXRhaWwgKi8KKwkJaWYgKCEob3V0aGVhZGVyLT5mbGFncyAmIENMVk1EX0ZMQUdfTk9ERUVSUlMpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNsdXN0ZXIgcmVxdWVzdCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KKworCXJldHVybiAxOworfQorCisvKiBCdWlsZCB0aGUgc3RydWN0dXJlIGhlYWRlciBhbmQgcGFyc2Utb3V0IHdpbGRjYXJkIG5vZGUgbmFtZXMgKi8KK3N0YXRpYyB2b2lkIF9idWlsZF9oZWFkZXIoc3RydWN0IGNsdm1faGVhZGVyICpoZWFkLCBpbnQgY21kLCBjb25zdCBjaGFyICpub2RlLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuKQoreworCWhlYWQtPmNtZCA9IGNtZDsKKwloZWFkLT5zdGF0dXMgPSAwOworCWhlYWQtPmZsYWdzID0gMDsKKwloZWFkLT54aWQgPSAwOworCWhlYWQtPmNsaWVudGlkID0gMDsKKwlpZiAobGVuKQorCQkvKiAxIGJ5dGUgaXMgdXNlZCBmcm9tIHN0cnVjdCBjbHZtX2hlYWRlci5hcmdzWzFdLCBzbyAtPiBsZW4gLSAxICovCisJCWhlYWQtPmFyZ2xlbiA9IGxlbiAtIDE7CisJZWxzZSB7CisJCWhlYWQtPmFyZ2xlbiA9IDA7CisJCSpoZWFkLT5hcmdzID0gJ1wwJzsKKwl9CisKKwkvKgorCSAqIFRyYW5zbGF0ZSBzcGVjaWFsIG5vZGUgbmFtZXMuCisJICovCisJaWYgKCFub2RlIHx8ICFzdHJjbXAobm9kZSwgTk9ERV9BTEwpKQorCQloZWFkLT5ub2RlWzBdID0gJ1wwJzsKKwllbHNlIGlmICghc3RyY21wKG5vZGUsIE5PREVfTE9DQUwpKSB7CisJCWhlYWQtPm5vZGVbMF0gPSAnXDAnOworCQloZWFkLT5mbGFncyA9IENMVk1EX0ZMQUdfTE9DQUw7CisJfSBlbHNlCisJCXN0cmNweShoZWFkLT5ub2RlLCBub2RlKTsKK30KKworLyoKKyAqIFNlbmQgYSBtZXNzYWdlIHRvIGEob3IgYWxsKSBub2RlKHMpIGluIHRoZSBjbHVzdGVyIGFuZCB3YWl0IGZvciByZXBsaWVzCisgKi8KK3N0YXRpYyBpbnQgX2NsdXN0ZXJfcmVxdWVzdChjaGFyIGNtZCwgY29uc3QgY2hhciAqbm9kZSwgdm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCSAgICBsdm1fcmVzcG9uc2VfdCAqKiByZXNwb25zZSwgaW50ICpudW0sIGludCBub19yZXNwb25zZSkKK3sKKwljaGFyIG91dGJ1ZltzaXplb2Yoc3RydWN0IGNsdm1faGVhZGVyKSArIGxlbiArIHN0cmxlbihub2RlKSArIDFdOworCWNoYXIgKmlucHRyOworCWNoYXIgKnJldGJ1ZiA9IE5VTEw7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlpbnQgbnVtX3Jlc3BvbnNlcyA9IDA7CisJc3RydWN0IGNsdm1faGVhZGVyICpoZWFkID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBvdXRidWY7CisJbHZtX3Jlc3BvbnNlX3QgKnJhcnJheTsKKworCSpudW0gPSAwOworCisJaWYgKF9jbHZtZF9zb2NrID09IC0xKQorCQlfY2x2bWRfc29jayA9IF9vcGVuX2xvY2FsX3NvY2soKTsKKworCWlmIChfY2x2bWRfc29jayA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlfYnVpbGRfaGVhZGVyKGhlYWQsIGNtZCwgbm9kZSwgbGVuKTsKKwlpZiAobGVuKQorCQltZW1jcHkoaGVhZC0+bm9kZSArIHN0cmxlbihoZWFkLT5ub2RlKSArIDEsIGRhdGEsIGxlbik7CisKKwlzdGF0dXMgPSBfc2VuZF9yZXF1ZXN0KG91dGJ1Ziwgc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikgKworCQkJICAgICAgIHN0cmxlbihoZWFkLT5ub2RlKSArIGxlbiwgJnJldGJ1Ziwgbm9fcmVzcG9uc2UpOworCWlmICghc3RhdHVzIHx8IG5vX3Jlc3BvbnNlKQorCQlnb3RvIG91dDsKKworCS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVzcG9uc2VzIHdlIGdvdCAqLworCWhlYWQgPSAoc3RydWN0IGNsdm1faGVhZGVyICopIHJldGJ1ZjsKKwlpbnB0ciA9IGhlYWQtPmFyZ3M7CisJd2hpbGUgKGlucHRyWzBdKSB7CisJCW51bV9yZXNwb25zZXMrKzsKKwkJaW5wdHIgKz0gc3RybGVuKGlucHRyKSArIDE7CisJCWlucHRyICs9IHNpemVvZihpbnQpOworCQlpbnB0ciArPSBzdHJsZW4oaW5wdHIpICsgMTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHJlc3BvbnNlIGFycmF5LgorCSAqIFdpdGggYW4gZXh0cmEgcGFpciBvZiBJTlRzIG9uIHRoZSBmcm9udCB0byBzYW5pdHkKKwkgKiBjaGVjayB0aGUgcG9pbnRlciB3aGVuIHdlIGFyZSBnaXZlbiBpdCBiYWNrIHRvIGZyZWUKKwkgKi8KKwkqcmVzcG9uc2UgPSBOVUxMOworCWlmICghKHJhcnJheSA9IGRtX21hbGxvYyhzaXplb2YobHZtX3Jlc3BvbnNlX3QpICogbnVtX3Jlc3BvbnNlcyArCisJCQkJIHNpemVvZihpbnQpICogMikpKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlzdGF0dXMgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBVbnBhY2sgdGhlIHJlc3BvbnNlIGludG8gYW4gbHZtX3Jlc3BvbnNlX3QgYXJyYXkgKi8KKwlpbnB0ciA9IGhlYWQtPmFyZ3M7CisJaSA9IDA7CisJd2hpbGUgKGlucHRyWzBdKSB7CisJCXN0cmNweShyYXJyYXlbaV0ubm9kZSwgaW5wdHIpOworCQlpbnB0ciArPSBzdHJsZW4oaW5wdHIpICsgMTsKKworCQltZW1jcHkoJnJhcnJheVtpXS5zdGF0dXMsIGlucHRyLCBzaXplb2YoaW50KSk7CisJCWlucHRyICs9IHNpemVvZihpbnQpOworCisJCXJhcnJheVtpXS5yZXNwb25zZSA9IGRtX21hbGxvYyhzdHJsZW4oaW5wdHIpICsgMSk7CisJCWlmIChyYXJyYXlbaV0ucmVzcG9uc2UgPT0gTlVMTCkgeworCQkJLyogRnJlZSB1cCBldmVyeXRoaW5nIGVsc2UgYW5kIHJldHVybiBlcnJvciAqLworCQkJaW50IGo7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCWRtX2ZyZWUocmFycmF5W2ldLnJlc3BvbnNlKTsKKwkJCWRtX2ZyZWUocmFycmF5KTsKKwkJCWVycm5vID0gRU5PTUVNOworCQkJc3RhdHVzID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RyY3B5KHJhcnJheVtpXS5yZXNwb25zZSwgaW5wdHIpOworCQlyYXJyYXlbaV0ubGVuID0gc3RybGVuKGlucHRyKTsKKwkJaW5wdHIgKz0gc3RybGVuKGlucHRyKSArIDE7CisJCWkrKzsKKwl9CisJKm51bSA9IG51bV9yZXNwb25zZXM7CisJKnJlc3BvbnNlID0gcmFycmF5OworCisgICAgICBvdXQ6CisJZG1fZnJlZShyZXRidWYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogRnJlZSByZXBseSBhcnJheSAqLworc3RhdGljIGludCBfY2x1c3Rlcl9mcmVlX3JlcXVlc3QobHZtX3Jlc3BvbnNlX3QgKiByZXNwb25zZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlkbV9mcmVlKHJlc3BvbnNlW2ldLnJlc3BvbnNlKTsKKwl9CisKKwlkbV9mcmVlKHJlc3BvbnNlKTsKKworCXJldHVybiAxOworfQorCitpbnQgcmVmcmVzaF9jbHZtZChpbnQgYWxsX25vZGVzKQoreworCWludCBudW1fcmVzcG9uc2VzOworCWNoYXIgYXJnc1sxXTsgLy8gTm8gYXJncyByZWFsbHkuCisJbHZtX3Jlc3BvbnNlX3QgKnJlc3BvbnNlID0gTlVMTDsKKwlpbnQgc2F2ZWRfZXJybm87CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKworCXN0YXR1cyA9IF9jbHVzdGVyX3JlcXVlc3QoQ0xWTURfQ01EX1JFRlJFU0gsIGFsbF9ub2RlcyA/IE5PREVfQUxMIDogTk9ERV9MT0NBTCwgYXJncywgMCwgJnJlc3BvbnNlLCAmbnVtX3Jlc3BvbnNlcywgMCk7CisKKwkvKiBJZiBhbnkgbm9kZXMgd2VyZSBkb3duIHRoZW4gZGlzcGxheSB0aGVtIGFuZCByZXR1cm4gYW4gZXJyb3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jlc3BvbnNlczsgaSsrKSB7CisJCWlmIChyZXNwb25zZVtpXS5zdGF0dXMgPT0gRUhPU1RET1dOKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNsdm1kIG5vdCBydW5uaW5nIG9uIG5vZGUgJXMiLAorCQkJCSAgcmVzcG9uc2VbaV0ubm9kZSk7CisJCQlzdGF0dXMgPSAwOworCQkJZXJybm8gPSByZXNwb25zZVtpXS5zdGF0dXM7CisJCX0gZWxzZSBpZiAocmVzcG9uc2VbaV0uc3RhdHVzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlc2V0dGluZyBub2RlICVzOiAlcyIsCisJCQkJICByZXNwb25zZVtpXS5ub2RlLAorCQkJCSAgcmVzcG9uc2VbaV0ucmVzcG9uc2VbMF0gPworCQkJCSAgCXJlc3BvbnNlW2ldLnJlc3BvbnNlIDoKKwkJCQkgIAlzdHJlcnJvcihyZXNwb25zZVtpXS5zdGF0dXMpKTsKKwkJCXN0YXR1cyA9IDA7CisJCQllcnJubyA9IHJlc3BvbnNlW2ldLnN0YXR1czsKKwkJfQorCX0KKworCXNhdmVkX2Vycm5vID0gZXJybm87CisJX2NsdXN0ZXJfZnJlZV9yZXF1ZXN0KHJlc3BvbnNlLCBudW1fcmVzcG9uc2VzKTsKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHJlc3RhcnRfY2x2bWQoaW50IGFsbF9ub2RlcykKK3sKKwlpbnQgZHVtbXksIHN0YXR1czsKKworCXN0YXR1cyA9IF9jbHVzdGVyX3JlcXVlc3QoQ0xWTURfQ01EX1JFU1RBUlQsIGFsbF9ub2RlcyA/IE5PREVfQUxMIDogTk9ERV9MT0NBTCwgTlVMTCwgMCwgTlVMTCwgJmR1bW15LCAxKTsKKworCS8qCisJICogRklYTUU6IHdlIGNhbm5vdCByZWNlaXZlIHJlc3BvbnNlLCBjbHZtZCByZS1leGVjIGJlZm9yZSBpdC4KKwkgKiAgICAgICAgYnV0IGFsc28gc2hvdWxkIG5vdCBjbG9zZSBzb2NrZXQgdG9vIGVhcmx5ICh0aGUgd2hvbGUgcnEgaXMgZHJvcHBlZCB0aGVuKS4KKwkgKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCB0aGlzIHdheToKKwkgKiAgLSBjbGllbnQgd2FpdHMgZm9yIFJFU1RBUlQgYWNrIChhbmQgc29ja2V0IGNsb3NlKQorCSAqICAtIHNlcnZlciByZXN0YXJ0cworCSAqICAtIGNsaWVudCBjaGVja3MgdGhhdCBzZXJ2ZXIgaXMgcmVhZHkgYWdhaW4gKFZFUlNJT04gY29tbWFuZD8pCisJICovCisJdXNsZWVwKDUwMDAwMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgZGVidWdfY2x2bWQoaW50IGxldmVsLCBpbnQgY2x1c3RlcndpZGUpCit7CisJaW50IG51bV9yZXNwb25zZXM7CisJY2hhciBhcmdzWzFdOworCWNvbnN0IGNoYXIgKm5vZGVzOworCWx2bV9yZXNwb25zZV90ICpyZXNwb25zZSA9IE5VTEw7CisJaW50IHNhdmVkX2Vycm5vOworCWludCBzdGF0dXM7CisJaW50IGk7CisKKwlhcmdzWzBdID0gbGV2ZWw7CisJaWYgKGNsdXN0ZXJ3aWRlKQorCQlub2RlcyA9IE5PREVfQUxMOworCWVsc2UKKwkJbm9kZXMgPSBOT0RFX0xPQ0FMOworCisJc3RhdHVzID0gX2NsdXN0ZXJfcmVxdWVzdChDTFZNRF9DTURfU0VUX0RFQlVHLCBub2RlcywgYXJncywgMSwgJnJlc3BvbnNlLCAmbnVtX3Jlc3BvbnNlcywgMCk7CisKKwkvKiBJZiBhbnkgbm9kZXMgd2VyZSBkb3duIHRoZW4gZGlzcGxheSB0aGVtIGFuZCByZXR1cm4gYW4gZXJyb3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jlc3BvbnNlczsgaSsrKSB7CisJCWlmIChyZXNwb25zZVtpXS5zdGF0dXMgPT0gRUhPU1RET1dOKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNsdm1kIG5vdCBydW5uaW5nIG9uIG5vZGUgJXMiLAorCQkJCSAgcmVzcG9uc2VbaV0ubm9kZSk7CisJCQlzdGF0dXMgPSAwOworCQkJZXJybm8gPSByZXNwb25zZVtpXS5zdGF0dXM7CisJCX0gZWxzZSBpZiAocmVzcG9uc2VbaV0uc3RhdHVzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHNldHRpbmcgZGVidWcgb24gbm9kZSAlczogJXMiLAorCQkJCSAgcmVzcG9uc2VbaV0ubm9kZSwKKwkJCQkgIHJlc3BvbnNlW2ldLnJlc3BvbnNlWzBdID8KKwkJCQkgIAlyZXNwb25zZVtpXS5yZXNwb25zZSA6CisJCQkJICAJc3RyZXJyb3IocmVzcG9uc2VbaV0uc3RhdHVzKSk7CisJCQlzdGF0dXMgPSAwOworCQkJZXJybm8gPSByZXNwb25zZVtpXS5zdGF0dXM7CisJCX0KKwl9CisKKwlzYXZlZF9lcnJubyA9IGVycm5vOworCV9jbHVzdGVyX2ZyZWVfcmVxdWVzdChyZXNwb25zZSwgbnVtX3Jlc3BvbnNlcyk7CisJZXJybm8gPSBzYXZlZF9lcnJubzsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2Nsdm1kL3JlZnJlc2hfY2x2bWQuaCBiL2RhZW1vbnMvY2x2bWQvcmVmcmVzaF9jbHZtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDc3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2Nsdm1kL3JlZnJlc2hfY2x2bWQuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworCitpbnQgcmVmcmVzaF9jbHZtZChpbnQgYWxsX25vZGVzKTsKK2ludCByZXN0YXJ0X2Nsdm1kKGludCBhbGxfbm9kZXMpOworaW50IGRlYnVnX2Nsdm1kKGludCBsZXZlbCwgaW50IGNsdXN0ZXJ3aWRlKTsKKwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbWlycm9yZC8uZ2l0aWdub3JlIGIvZGFlbW9ucy9jbWlycm9yZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTFlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorY21pcnJvcmQKZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvTWFrZWZpbGUuaW4gYi9kYWVtb25zL2NtaXJyb3JkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOWRkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworQ1BHX0xJQlMgPSBAQ1BHX0xJQlNACitDUEdfQ0ZMQUdTID0gQENQR19DRkxBR1NACitTQUNLUFRfTElCUyA9IEBTQUNLUFRfTElCU0AKK1NBQ0tQVF9DRkxBR1MgPSBAU0FDS1BUX0NGTEFHU0AKKworU09VUkNFUyA9IGNsb2dkLmMgY2x1c3Rlci5jIGNvbXBhdC5jIGZ1bmN0aW9ucy5jIGxpbmtfbW9uLmMgbG9jYWwuYyBsb2dnaW5nLmMKKworVEFSR0VUUyA9IGNtaXJyb3JkCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitMSUJTICs9IC1sZGV2bWFwcGVyCitMTUxJQlMgKz0gJChDUEdfTElCUykgJChTQUNLUFRfTElCUykKK0NGTEFHUyArPSAkKENQR19DRkxBR1MpICQoU0FDS1BUX0NGTEFHUykgJChFWFRSQV9FWEVDX0NGTEFHUykKK0xERkxBR1MgKz0gJChFWFRSQV9FWEVDX0xERkxBR1MpCisKK2NtaXJyb3JkOiAkKE9CSkVDVFMpICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpIFwKKwkJJChMVk1MSUJTKSAkKExNTElCUykgJChMSUJTKQorCitpbnN0YWxsOiAkKFRBUkdFVFMpCisJJChJTlNUQUxMX1BST0dSQU0pIC1EIGNtaXJyb3JkICQodXNyc2JpbmRpcikvY21pcnJvcmQKZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvY2xvZ2QuYyBiL2RhZW1vbnMvY21pcnJvcmQvY2xvZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY2NWFmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9jbG9nZC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlICJsb2dnaW5nLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAibGlua19tb24uaCIKKyNpbmNsdWRlICJsb2NhbC5oIgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZXhpdF9ub3cgPSAwOworLyogRklYTUUgUmV2aWV3IHNpZ25hbCBoYW5kbGluZy4gIFNob3VsZCBiZSB2b2xhdGlsZSBzaWdfYXRvbWljX3QgKi8KK3N0YXRpYyBzaWdzZXRfdCBzaWduYWxfbWFzazsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc2lnbmFsX3JlY2VpdmVkOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NpZ25hbHModm9pZCk7CitzdGF0aWMgdm9pZCBkYWVtb25pemUodm9pZCk7CitzdGF0aWMgdm9pZCBpbml0X2FsbCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsZWFudXBfYWxsKHZvaWQpOworCitzdGF0aWMgdm9pZCB1c2FnZSAoRklMRSAqZGVzdCkKK3sKKwlmcHJpbnRmIChkZXN0LCAiVXNhZ2U6IGNtaXJyb3JkIFtvcHRpb25zXVxuIgorCQkgIiAgIC1mLCAtLWZvcmVncm91bmQgICAgc3RheSBpbiB0aGUgZm9yZWdyb3VuZCwgbG9nIHRvIHRoZSB0ZXJtaW5hbFxuIgorCQkgIiAgIC1oLCAtLWhlbHAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZm9yZWdyb3VuZF9tb2RlID0gMDsKKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CisJCXsgImZvcmVncm91bmQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnIH0sCisJCXsgImhlbHAiICAgICAgLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnIH0sCisJCXsgMCwgMCwgMCwgMCB9CisJfTsKKwlpbnQgb3B0OworCisJd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImZoIiwgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdmJzoKKwkJCWZvcmVncm91bmRfbW9kZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQl1c2FnZSAoc3Rkb3V0KTsKKwkJCWV4aXQgKDApOworCQlkZWZhdWx0OgorCQkJdXNhZ2UgKHN0ZGVycik7CisJCQlleGl0ICgyKTsKKwkJfQorCX0KKwlpZiAob3B0aW5kIDwgYXJnYykgeworCQl1c2FnZSAoc3RkZXJyKTsKKwkJZXhpdCAoMik7CisJfQorCisJaWYgKCFmb3JlZ3JvdW5kX21vZGUpCisJCWRhZW1vbml6ZSgpOworCisJaW5pdF9hbGwoKTsKKworCS8qIFBhcmVudCBjYW4gbm93IGV4aXQsIHdlJ3JlIHJlYWR5IHRvIGhhbmRsZSByZXF1ZXN0cyAqLworCWlmICghZm9yZWdyb3VuZF9tb2RlKQorCQlraWxsKGdldHBwaWQoKSwgU0lHVEVSTSk7CisKKwlMT0dfUFJJTlQoIlN0YXJ0aW5nIGNtaXJyb3JkOiIpOworCUxPR19QUklOVCgiIEJ1aWx0OiAiX19EQVRFX18iICJfX1RJTUVfXyJcbiIpOworCUxPR19EQkcoIiBDb21waWxlZCB3aXRoIGRlYnVnZ2luZy4iKTsKKworCXdoaWxlICghZXhpdF9ub3cpIHsKKwkJbGlua3NfbW9uaXRvcigpOworCisJCWxpbmtzX2lzc3VlX2NhbGxiYWNrcygpOworCisJCXByb2Nlc3Nfc2lnbmFscygpOworCX0KKwlleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKKy8qCisgKiBwYXJlbnRfZXhpdF9oYW5kbGVyOiBleGl0IHRoZSBwYXJlbnQKKyAqIEBzaWc6IHRoZSBzaWduYWwKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHBhcmVudF9leGl0X2hhbmRsZXIoaW50IHNpZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlleGl0X25vdyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcpCit7CisJLyogRklYTUUgUmFjZXMgLSBkb24ndCB0b3VjaCBzaWduYWxfbWFzayBoZXJlLiAqLworCXNpZ2FkZHNldCgmc2lnbmFsX21hc2ssIHNpZyk7CisJc2lnbmFsX3JlY2VpdmVkID0gMTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19zaWduYWwoaW50IHNpZyl7CisJaW50IHIgPSAwOworCisJc3dpdGNoKHNpZykgeworCWNhc2UgU0lHSU5UOgorCWNhc2UgU0lHUVVJVDoKKwljYXNlIFNJR1RFUk06CisJY2FzZSBTSUdIVVA6CisJCXIgKz0gbG9nX3N0YXR1cygpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjE6CisJY2FzZSBTSUdVU1IyOgorCQlsb2dfZGVidWcoKTsKKwkJLypsb2NhbF9kZWJ1ZygpOyovCisJCWNsdXN0ZXJfZGVidWcoKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCUxPR19QUklOVCgiVW5rbm93biBzaWduYWwgcmVjZWl2ZWQuLi4gaWdub3JpbmciKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghcikgeworCQlMT0dfREJHKCJObyBjdXJyZW50IGNsdXN0ZXIgbG9ncy4uLiBzYWZlIHRvIGV4aXQuIik7CisJCWNsZWFudXBfYWxsKCk7CisJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwlMT0dfRVJST1IoIkNsdXN0ZXIgbG9ncyBleGlzdC4gIFJlZnVzaW5nIHRvIGV4aXQuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2lnbmFscyh2b2lkKQoreworCWludCB4OworCisJaWYgKCFzaWduYWxfcmVjZWl2ZWQpCisJCXJldHVybjsKKworCXNpZ25hbF9yZWNlaXZlZCA9IDA7CisKKwlmb3IgKHggPSAxOyB4IDwgX05TSUc7IHgrKykgeworCQlpZiAoc2lnaXNtZW1iZXIoJnNpZ25hbF9tYXNrLCB4KSkgeworCQkJc2lnZGVsc2V0KCZzaWduYWxfbWFzaywgeCk7CisJCQlwcm9jZXNzX3NpZ25hbCh4KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xvY2tmaWxlKHZvaWQpCit7CisJaWYgKHVubGluayhDTUlSUk9SRF9QSURGSUxFKSkKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gcmVtb3ZlIFwiIiBDTUlSUk9SRF9QSURGSUxFICJcIiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qCisgKiBkYWVtb25pemUKKyAqCisgKiBQZXJmb3JtcyB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGJlY29tZSBhIGRhZW1vbi4KKyAqLworc3RhdGljIHZvaWQgZGFlbW9uaXplKHZvaWQpCit7CisJaW50IHBpZDsKKwlpbnQgc3RhdHVzOworCWludCBkZXZudWxsOworCisJaWYgKChkZXZudWxsID0gb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKSkgPT0gLTEpIHsKKwkJTE9HX0VSUk9SKCJDYW4ndCBvcGVuIC9kZXYvbnVsbDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJc2lnbmFsKFNJR1RFUk0sICZwYXJlbnRfZXhpdF9oYW5kbGVyKTsKKworCXBpZCA9IGZvcmsoKTsKKworCWlmIChwaWQgPCAwKSB7CisJCUxPR19FUlJPUigiVW5hYmxlIHRvIGZvcmsoKSIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKHBpZCkgeworCQkvKiBQYXJlbnQgd2FpdHMgaGVyZSBmb3IgY2hpbGQgdG8gZ2V0IGdvaW5nICovCisJCXdoaWxlICghd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpICYmICFleGl0X25vdyk7CisJCWlmIChleGl0X25vdykKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworCQlzd2l0Y2ggKFdFWElUU1RBVFVTKHN0YXR1cykpIHsKKwkJY2FzZSBFWElUX0xPQ0tGSUxFOgorCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGxvY2tmaWxlIik7CisJCQlMT0dfRVJST1IoIlByb2Nlc3MgYWxyZWFkeSBydW5uaW5nPyIpOworCQkJYnJlYWs7CisJCWNhc2UgRVhJVF9LRVJORUxfU09DS0VUOgorCQkJTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBFWElUX0tFUk5FTF9CSU5EOgorCQkJTE9HX0VSUk9SKCJVbmFibGUgdG8gYmluZCB0byBuZXRsaW5rIHNvY2tldCIpOworCQkJYnJlYWs7CisJCWNhc2UgRVhJVF9LRVJORUxfU0VUU09DS09QVDoKKwkJCUxPR19FUlJPUigiVW5hYmxlIHRvIHNldHNvY2tvcHQgb24gbmV0bGluayBzb2NrZXQiKTsKKwkJCWJyZWFrOworCQljYXNlIEVYSVRfQ0xVU1RFUl9DS1BUX0lOSVQ6CisJCQlMT0dfRVJST1IoIlVuYWJsZSB0byBpbml0aWFsaXplIGNoZWNrcG9pbnQgc2VydmljZSIpOworCQkJTE9HX0VSUk9SKCJIYXMgdGhlIGNsdXN0ZXIgaW5mcmFzdHJ1Y3R1cmUgYmVlbiBzdGFydGVkPyIpOworCQkJYnJlYWs7CisJCWNhc2UgRVhJVF9GQUlMVVJFOgorCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gc3RhcnQ6IEdlbmVyaWMgZXJyb3IiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gc3RhcnQ6IFVua25vd24gZXJyb3IiKTsKKwkJCWJyZWFrOworCQl9CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlzZXRzaWQoKTsKKwlpZiAoY2hkaXIoIi8iKSkgeworCQlMT0dfRVJST1IoIkZhaWxlZCB0byBjaGRpciAvOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwl1bWFzaygwKTsKKworCWlmIChjbG9zZSgwKSB8fCBjbG9zZSgxKSB8fCBjbG9zZSgyKSkgeworCQlMT0dfRVJST1IoIkZhaWxlZCB0byBjbG9zZSB0ZXJtaW5hbCBGRHMiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWlmICgoZHVwMihkZXZudWxsLCAwKSA8IDApIHx8IC8qIHJlb3BlbiBzdGRpbiAqLworCSAgICAoZHVwMihkZXZudWxsLCAxKSA8IDApIHx8IC8qIHJlb3BlbiBzdGRvdXQgKi8KKwkgICAgKGR1cDIoZGV2bnVsbCwgMikgPCAwKSkgICAvKiByZW9wZW4gc3RkZXJyICovCisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKworCWlmICgoZGV2bnVsbCA+IFNUREVSUl9GSUxFTk8pICYmIGNsb3NlKGRldm51bGwpKSB7CisJCUxPR19FUlJPUigiRmFpbGVkIHRvIGNsb3NlIGRlc2NyaXB0b3IgJWQ6ICVzIiwKKwkJCSAgZGV2bnVsbCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCUxPR19PUEVOKCJjbWlycm9yZCIsIExPR19QSUQsIExPR19EQUVNT04pOworfQorCisvKgorICogaW5pdF9hbGwKKyAqCisgKiBJbml0aWFsaXplIG1vZHVsZXMuICBFeGl0IG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfYWxsKHZvaWQpCit7CisJaW50IHI7CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoQ01JUlJPUkRfUElERklMRSwgU19JRlJFRyk7CisJaWYgKGRtX2NyZWF0ZV9sb2NrZmlsZShDTUlSUk9SRF9QSURGSUxFKSA9PSAwKQorCQlleGl0KEVYSVRfTE9DS0ZJTEUpOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKworCWF0ZXhpdChyZW1vdmVfbG9ja2ZpbGUpOworCisJLyogRklYTUUgUmVwbGFjZSB3aXRoIHNpZ2FjdGlvbi4gKGRlcHJlY2F0ZWQpICovCisJc2lnbmFsKFNJR0lOVCwgJnNpZ19oYW5kbGVyKTsKKwlzaWduYWwoU0lHUVVJVCwgJnNpZ19oYW5kbGVyKTsKKwlzaWduYWwoU0lHVEVSTSwgJnNpZ19oYW5kbGVyKTsKKwlzaWduYWwoU0lHSFVQLCAmc2lnX2hhbmRsZXIpOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ19oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMiwgJnNpZ19oYW5kbGVyKTsKKwlzaWdlbXB0eXNldCgmc2lnbmFsX21hc2spOworCXNpZ25hbF9yZWNlaXZlZCA9IDA7CisKKwlpZiAoKHIgPSBpbml0X2xvY2FsKCkpIHx8CisJICAgIChyID0gaW5pdF9jbHVzdGVyKCkpKSB7CisJCWV4aXQocik7CisJfQorfQorCisvKgorICogY2xlYW51cF9hbGwKKyAqCisgKiBDbGVhbiB1cCBiZWZvcmUgZXhpdGluZworICovCitzdGF0aWMgdm9pZCBjbGVhbnVwX2FsbCh2b2lkKQoreworCWNsZWFudXBfbG9jYWwoKTsKKwljbGVhbnVwX2NsdXN0ZXIoKTsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvY2x1c3Rlci5jIGIvZGFlbW9ucy9jbWlycm9yZC9jbHVzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5NmViMgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY21pcnJvcmQvY2x1c3Rlci5jCkBAIC0wLDAgKzEsMTgxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImxvZ2dpbmcuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAibGlua19tb24uaCIKKyNpbmNsdWRlICJsb2NhbC5oIgorI2luY2x1ZGUgInhsYXRlLmgiCisKKyNpbmNsdWRlIDxjb3Jvc3luYy9jcGcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIENNSVJST1JfSEFTX0NIRUNLUE9JTlQKKyNpbmNsdWRlIDxvcGVuYWlzL3NhQWlzLmg+CisjaW5jbHVkZSA8b3BlbmFpcy9zYUNrcHQuaD4KKworLyogT3BlbiBBSVMgZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUgc3RyX2Fpc19lcnJvcih4KQkJCQkJCVwKKwkoKHgpID09IFNBX0FJU19PSykgPyAiU0FfQUlTX09LIiA6CQkJCVwKKwkoKHgpID09IFNBX0FJU19FUlJfTElCUkFSWSkgPyAiU0FfQUlTX0VSUl9MSUJSQVJZIiA6CQlcCisJKCh4KSA9PSBTQV9BSVNfRVJSX1ZFUlNJT04pID8gIlNBX0FJU19FUlJfVkVSU0lPTiIgOgkJXAorCSgoeCkgPT0gU0FfQUlTX0VSUl9JTklUKSA/ICJTQV9BSVNfRVJSX0lOSVQiIDoJCQlcCisJKCh4KSA9PSBTQV9BSVNfRVJSX1RJTUVPVVQpID8gIlNBX0FJU19FUlJfVElNRU9VVCIgOgkJXAorCSgoeCkgPT0gU0FfQUlTX0VSUl9UUllfQUdBSU4pID8gIlNBX0FJU19FUlJfVFJZX0FHQUlOIiA6CVwKKwkoKHgpID09IFNBX0FJU19FUlJfSU5WQUxJRF9QQVJBTSkgPyAiU0FfQUlTX0VSUl9JTlZBTElEX1BBUkFNIiA6IFwKKwkoKHgpID09IFNBX0FJU19FUlJfTk9fTUVNT1JZKSA/ICJTQV9BSVNfRVJSX05PX01FTU9SWSIgOglcCisJKCh4KSA9PSBTQV9BSVNfRVJSX0JBRF9IQU5ETEUpID8gIlNBX0FJU19FUlJfQkFEX0hBTkRMRSIgOglcCisJKCh4KSA9PSBTQV9BSVNfRVJSX0JVU1kpID8gIlNBX0FJU19FUlJfQlVTWSIgOgkJCVwKKwkoKHgpID09IFNBX0FJU19FUlJfQUNDRVNTKSA/ICJTQV9BSVNfRVJSX0FDQ0VTUyIgOgkJXAorCSgoeCkgPT0gU0FfQUlTX0VSUl9OT1RfRVhJU1QpID8gIlNBX0FJU19FUlJfTk9UX0VYSVNUIiA6CVwKKwkoKHgpID09IFNBX0FJU19FUlJfTkFNRV9UT09fTE9ORykgPyAiU0FfQUlTX0VSUl9OQU1FX1RPT19MT05HIiA6IFwKKwkoKHgpID09IFNBX0FJU19FUlJfRVhJU1QpID8gIlNBX0FJU19FUlJfRVhJU1QiIDoJCVwKKwkoKHgpID09IFNBX0FJU19FUlJfTk9fU1BBQ0UpID8gIlNBX0FJU19FUlJfTk9fU1BBQ0UiIDoJCVwKKwkoKHgpID09IFNBX0FJU19FUlJfSU5URVJSVVBUKSA/ICJTQV9BSVNfRVJSX0lOVEVSUlVQVCIgOglcCisJKCh4KSA9PSBTQV9BSVNfRVJSX05BTUVfTk9UX0ZPVU5EKSA/ICJTQV9BSVNfRVJSX05BTUVfTk9UX0ZPVU5EIiA6IFwKKwkoKHgpID09IFNBX0FJU19FUlJfTk9fUkVTT1VSQ0VTKSA/ICJTQV9BSVNfRVJSX05PX1JFU09VUkNFUyIgOglcCisJKCh4KSA9PSBTQV9BSVNfRVJSX05PVF9TVVBQT1JURUQpID8gIlNBX0FJU19FUlJfTk9UX1NVUFBPUlRFRCIgOiBcCisJKCh4KSA9PSBTQV9BSVNfRVJSX0JBRF9PUEVSQVRJT04pID8gIlNBX0FJU19FUlJfQkFEX09QRVJBVElPTiIgOiBcCisJKCh4KSA9PSBTQV9BSVNfRVJSX0ZBSUxFRF9PUEVSQVRJT04pID8gIlNBX0FJU19FUlJfRkFJTEVEX09QRVJBVElPTiIgOiBcCisJKCh4KSA9PSBTQV9BSVNfRVJSX01FU1NBR0VfRVJST1IpID8gIlNBX0FJU19FUlJfTUVTU0FHRV9FUlJPUiIgOiBcCisJKCh4KSA9PSBTQV9BSVNfRVJSX1FVRVVFX0ZVTEwpID8gIlNBX0FJU19FUlJfUVVFVUVfRlVMTCIgOglcCisJKCh4KSA9PSBTQV9BSVNfRVJSX1FVRVVFX05PVF9BVkFJTEFCTEUpID8gIlNBX0FJU19FUlJfUVVFVUVfTk9UX0FWQUlMQUJMRSIgOiBcCisJKCh4KSA9PSBTQV9BSVNfRVJSX0JBRF9GTEFHUykgPyAiU0FfQUlTX0VSUl9CQURfRkxBR1MiIDoJXAorCSgoeCkgPT0gU0FfQUlTX0VSUl9UT09fQklHKSA/ICJTQV9BSVNfRVJSX1RPT19CSUciIDoJCVwKKwkoKHgpID09IFNBX0FJU19FUlJfTk9fU0VDVElPTlMpID8gIlNBX0FJU19FUlJfTk9fU0VDVElPTlMiIDoJXAorCSJhaXNfZXJyb3JfdW5rbm93biIKKyNlbHNlCisjZGVmaW5lIHN0cl9haXNfZXJyb3IoeCkJCQkJCQlcCisJKCh4KSA9PSBDU19PSykgPyAiQ1NfT0siIDoJCQkJXAorCSgoeCkgPT0gQ1NfRVJSX0xJQlJBUlkpID8gIkNTX0VSUl9MSUJSQVJZIiA6CQlcCisJKCh4KSA9PSBDU19FUlJfVkVSU0lPTikgPyAiQ1NfRVJSX1ZFUlNJT04iIDoJCVwKKwkoKHgpID09IENTX0VSUl9JTklUKSA/ICJDU19FUlJfSU5JVCIgOgkJCVwKKwkoKHgpID09IENTX0VSUl9USU1FT1VUKSA/ICJDU19FUlJfVElNRU9VVCIgOgkJXAorCSgoeCkgPT0gQ1NfRVJSX1RSWV9BR0FJTikgPyAiQ1NfRVJSX1RSWV9BR0FJTiIgOglcCisJKCh4KSA9PSBDU19FUlJfSU5WQUxJRF9QQVJBTSkgPyAiQ1NfRVJSX0lOVkFMSURfUEFSQU0iIDogXAorCSgoeCkgPT0gQ1NfRVJSX05PX01FTU9SWSkgPyAiQ1NfRVJSX05PX01FTU9SWSIgOglcCisJKCh4KSA9PSBDU19FUlJfQkFEX0hBTkRMRSkgPyAiQ1NfRVJSX0JBRF9IQU5ETEUiIDoJXAorCSgoeCkgPT0gQ1NfRVJSX0JVU1kpID8gIkNTX0VSUl9CVVNZIiA6CQkJXAorCSgoeCkgPT0gQ1NfRVJSX0FDQ0VTUykgPyAiQ1NfRVJSX0FDQ0VTUyIgOgkJXAorCSgoeCkgPT0gQ1NfRVJSX05PVF9FWElTVCkgPyAiQ1NfRVJSX05PVF9FWElTVCIgOglcCisJKCh4KSA9PSBDU19FUlJfTkFNRV9UT09fTE9ORykgPyAiQ1NfRVJSX05BTUVfVE9PX0xPTkciIDogXAorCSgoeCkgPT0gQ1NfRVJSX0VYSVNUKSA/ICJDU19FUlJfRVhJU1QiIDoJCVwKKwkoKHgpID09IENTX0VSUl9OT19TUEFDRSkgPyAiQ1NfRVJSX05PX1NQQUNFIiA6CQlcCisJKCh4KSA9PSBDU19FUlJfSU5URVJSVVBUKSA/ICJDU19FUlJfSU5URVJSVVBUIiA6CVwKKwkoKHgpID09IENTX0VSUl9OQU1FX05PVF9GT1VORCkgPyAiQ1NfRVJSX05BTUVfTk9UX0ZPVU5EIiA6IFwKKwkoKHgpID09IENTX0VSUl9OT19SRVNPVVJDRVMpID8gIkNTX0VSUl9OT19SRVNPVVJDRVMiIDoJXAorCSgoeCkgPT0gQ1NfRVJSX05PVF9TVVBQT1JURUQpID8gIkNTX0VSUl9OT1RfU1VQUE9SVEVEIiA6IFwKKwkoKHgpID09IENTX0VSUl9CQURfT1BFUkFUSU9OKSA/ICJDU19FUlJfQkFEX09QRVJBVElPTiIgOiBcCisJKCh4KSA9PSBDU19FUlJfRkFJTEVEX09QRVJBVElPTikgPyAiQ1NfRVJSX0ZBSUxFRF9PUEVSQVRJT04iIDogXAorCSgoeCkgPT0gQ1NfRVJSX01FU1NBR0VfRVJST1IpID8gIkNTX0VSUl9NRVNTQUdFX0VSUk9SIiA6IFwKKwkoKHgpID09IENTX0VSUl9RVUVVRV9GVUxMKSA/ICJDU19FUlJfUVVFVUVfRlVMTCIgOglcCisJKCh4KSA9PSBDU19FUlJfUVVFVUVfTk9UX0FWQUlMQUJMRSkgPyAiQ1NfRVJSX1FVRVVFX05PVF9BVkFJTEFCTEUiIDogXAorCSgoeCkgPT0gQ1NfRVJSX0JBRF9GTEFHUykgPyAiQ1NfRVJSX0JBRF9GTEFHUyIgOglcCisJKCh4KSA9PSBDU19FUlJfVE9PX0JJRykgPyAiQ1NfRVJSX1RPT19CSUciIDoJCVwKKwkoKHgpID09IENTX0VSUl9OT19TRUNUSU9OUykgPyAiQ1NfRVJSX05PX1NFQ1RJT05TIiA6CVwKKwkoKHgpID09IENTX0VSUl9DT05URVhUX05PVF9GT1VORCkgPyAiQ1NfRVJSX0NPTlRFWFRfTk9UX0ZPVU5EIiA6IFwKKwkoKHgpID09IENTX0VSUl9UT09fTUFOWV9HUk9VUFMpID8gIkNTX0VSUl9UT09fTUFOWV9HUk9VUFMiIDogXAorCSgoeCkgPT0gQ1NfRVJSX1NFQ1VSSVRZKSA/ICJDU19FUlJfU0VDVVJJVFkiIDogXAorCSJjc19lcnJvcl91bmtub3duIgorI2VuZGlmCisKKyNkZWZpbmUgX1JRX1RZUEUoeCkJCQkJCQkJXAorCSgoeCkgPT0gRE1fVUxPR19DSEVDS1BPSU5UX1JFQURZKSA/ICJETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFkiOiBcCisJKCh4KSA9PSBETV9VTE9HX01FTUJFUl9KT0lOKSA/ICJETV9VTE9HX01FTUJFUl9KT0lOIjoJCVwKKwlSUV9UWVBFKCh4KSAmIH5ETV9VTE9HX1JFU1BPTlNFKQorCitzdGF0aWMgdWludDMyX3QgbXlfY2x1c3Rlcl9pZCA9IDB4REVBRDsKKyNpZiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UCitzdGF0aWMgU2FDa3B0SGFuZGxlVCBja3B0X2hhbmRsZSA9IDA7CitzdGF0aWMgU2FDa3B0Q2FsbGJhY2tzVCBjYWxsYmFja3MgPSB7IDAsIDAgfTsKK3N0YXRpYyBTYVZlcnNpb25UIHZlcnNpb24gPSB7ICdCJywgMSwgMSB9OworI2VuZGlmCisKKyNkZWZpbmUgREVCVUdHSU5HX0hJU1RPUlkgMTAwCisjZGVmaW5lIERFQlVHR0lOR19CVUZMRU4gMTI4CisjZGVmaW5lIExPR19TUFJJTlQoY2MsIGYsIGFyZy4uLikgZG8gewkJCQlcCisJCWNjLT5pZHgrKzsJCQkJCVwKKwkJY2MtPmlkeCA9IGNjLT5pZHggJSBERUJVR0dJTkdfSElTVE9SWTsJCVwKKwkJc25wcmludGYoY2MtPmRlYnVnZ2luZ1tjYy0+aWR4XSwgREVCVUdHSU5HX0JVRkxFTiwgZiwgIyMgYXJnKTsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgbG9nX3Jlc3BfcmVjID0gMDsKKworI2RlZmluZSBSRUNPVkVSSU5HX1JFR0lPTl9TRUNUSU9OX1NJWkUgNjQKK3N0cnVjdCBjaGVja3BvaW50X2RhdGEgeworCXVpbnQzMl90IHJlcXVlc3RlcjsKKwljaGFyIHV1aWRbQ1BHX01BWF9OQU1FX0xFTkdUSF07CisKKwlpbnQgYml0bWFwX3NpemU7IC8qIGluIGJ5dGVzICovCisJY2hhciAqc3luY19iaXRzOworCWNoYXIgKmNsZWFuX2JpdHM7CisJY2hhciAqcmVjb3ZlcmluZ19yZWdpb247CisJc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqbmV4dDsKK307CisKKyNkZWZpbmUgSU5WQUxJRCAwCisjZGVmaW5lIFZBTElEICAgMQorI2RlZmluZSBMRUFWSU5HIDIKKworI2RlZmluZSBNQVhfQ0hFQ0tQT0lOVF9SRVFVRVNURVJTIDEwCitzdHJ1Y3QgY2xvZ19jcGcgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisKKwl1aW50MzJfdCBsb3dlc3RfaWQ7CisJY3BnX2hhbmRsZV90IGhhbmRsZTsKKwlzdHJ1Y3QgY3BnX25hbWUgbmFtZTsKKwl1aW50NjRfdCBsdWlkOworCisJLyogQXJlIHdlIHRoZSBmaXJzdCwgb3IgaGF2ZSB3ZSByZWNlaXZlZCBjaGVja3BvaW50PyAqLworCWludCBzdGF0ZTsKKwlpbnQgY3BnX3N0YXRlOyAgLyogRklYTUU6IGRlYnVnZ2luZyAqLworCWludCBmcmVlX21lOworCWludCBkZWxheTsKKwlpbnQgcmVzZW5kX3JlcXVlc3RzOworCXN0cnVjdCBkbV9saXN0IHN0YXJ0dXBfbGlzdDsKKwlzdHJ1Y3QgZG1fbGlzdCB3b3JraW5nX2xpc3Q7CisKKwlpbnQgY2hlY2twb2ludHNfbmVlZGVkOworCXVpbnQzMl90IGNoZWNrcG9pbnRfcmVxdWVzdGVyc1tNQVhfQ0hFQ0tQT0lOVF9SRVFVRVNURVJTXTsKKwlzdHJ1Y3QgY2hlY2twb2ludF9kYXRhICpjaGVja3BvaW50X2xpc3Q7CisJaW50IGlkeDsKKwljaGFyIGRlYnVnZ2luZ1tERUJVR0dJTkdfSElTVE9SWV1bREVCVUdHSU5HX0JVRkxFTl07Cit9OworCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgY2xvZ19jcGdfbGlzdDsKKworLyoKKyAqIGNsdXN0ZXJfc2VuZAorICogQHJxCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRXh4eCBvbiBlcnJvcgorICovCitpbnQgY2x1c3Rlcl9zZW5kKHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCWludCBmb3VuZCA9IDA7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgY2xvZ19jcGcgKmVudHJ5OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGVudHJ5LCAmY2xvZ19jcGdfbGlzdCkKKwkJaWYgKCFzdHJuY21wKGVudHJ5LT5uYW1lLnZhbHVlLCBycS0+dV9ycS51dWlkLAorCQkJICAgICBDUEdfTUFYX05BTUVfTEVOR1RIKSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCWlmICghZm91bmQpIHsKKwkJcnEtPnVfcnEuZXJyb3IgPSAtRU5PRU5UOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKgorCSAqIE9uY2UgdGhlIHJlcXVlc3QgaGVhZHMgZm9yIHRoZSBjbHVzdGVyLCB0aGUgbHVpZCBsb29zZXMKKwkgKiBhbGwgaXRzIG1lYW5pbmcuCisJICovCisJcnEtPnVfcnEubHVpZCA9IDA7CisKKwlpb3YuaW92X2Jhc2UgPSBycTsKKwlpb3YuaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgY2xvZ19yZXF1ZXN0KSArIHJxLT51X3JxLmRhdGFfc2l6ZTsKKworCXJxLT51LnZlcnNpb25bMF0gPSB4bGF0ZTY0KENMT0dfVEZSX1ZFUlNJT04pOworCXJxLT51LnZlcnNpb25bMV0gPSBDTE9HX1RGUl9WRVJTSU9OOworCisJciA9IGNsb2dfcmVxdWVzdF90b19uZXR3b3JrKHJxKTsKKwlpZiAociA8IDApCisJCS8qIEZJWE1FOiBCZXR0ZXIgZXJyb3IgY29kZSBmb3IgYnl0ZXN3YXAgZmFpbHVyZT8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZW50cnktPmNwZ19zdGF0ZSAhPSBWQUxJRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UCisJZG8geworCQlpbnQgY291bnQgPSAwOworCisJCXIgPSBjcGdfbWNhc3Rfam9pbmVkKGVudHJ5LT5oYW5kbGUsIENQR19UWVBFX0FHUkVFRCwgJmlvdiwgMSk7CisJCWlmIChyICE9IFNBX0FJU19FUlJfVFJZX0FHQUlOKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA8IDEwKQorCQkJTE9HX1BSSU5UKCJbJXNdICBSZXRyeSAjJWQgb2YgY3BnX21jYXN0X2pvaW5lZDogJXMiLAorCQkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgY291bnQsCisJCQkJICBzdHJfYWlzX2Vycm9yKHIpKTsKKwkJZWxzZSBpZiAoKGNvdW50IDwgMTAwKSAmJiAhKGNvdW50ICUgMTApKQorCQkJTE9HX0VSUk9SKCJbJXNdICBSZXRyeSAjJWQgb2YgY3BnX21jYXN0X2pvaW5lZDogJXMiLAorCQkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgY291bnQsCisJCQkJICBzdHJfYWlzX2Vycm9yKHIpKTsKKwkJZWxzZSBpZiAoKGNvdW50IDwgMTAwMCkgJiYgIShjb3VudCAlIDEwMCkpCisJCQlMT0dfRVJST1IoIlslc10gIFJldHJ5ICMlZCBvZiBjcGdfbWNhc3Rfam9pbmVkOiAlcyIsCisJCQkJICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLCBjb3VudCwKKwkJCQkgIHN0cl9haXNfZXJyb3IocikpOworCQllbHNlIGlmICgoY291bnQgPCAxMDAwMCkgJiYgIShjb3VudCAlIDEwMDApKQorCQkJTE9HX0VSUk9SKCJbJXNdICBSZXRyeSAjJWQgb2YgY3BnX21jYXN0X2pvaW5lZDogJXMgLSAiCisJCQkJICAiT3BlbkFJUyBub3QgaGFuZGxpbmcgdGhlIGxvYWQ/IiwKKwkJCQkgIFNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksIGNvdW50LAorCQkJCSAgc3RyX2Fpc19lcnJvcihyKSk7CisJCXVzbGVlcCgxMDAwKTsKKwl9IHdoaWxlICgxKTsKKyNlbHNlCisJciA9IGNwZ19tY2FzdF9qb2luZWQoZW50cnktPmhhbmRsZSwgQ1BHX1RZUEVfQUdSRUVELCAmaW92LCAxKTsKKyNlbmRpZgorCWlmIChyID09IENTX09LKQorCQlyZXR1cm4gMDsKKworCS8qIGVycm9yIGNvZGVzIGZvdW5kIGluIG9wZW5haXMvY3BnLmggKi8KKwlMT0dfRVJST1IoImNwZ19tY2FzdF9qb2luZWQgZXJyb3I6ICVkIiwgcik7CisKKwlycS0+dV9ycS5lcnJvciA9IC1FQkFERTsKKwlyZXR1cm4gLUVCQURFOworfQorCitzdGF0aWMgc3RydWN0IGNsb2dfcmVxdWVzdCAqZ2V0X21hdGNoaW5nX3JxKHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxLAorCQkJCQkgICAgc3RydWN0IGRtX2xpc3QgKmwpCit7CisJc3RydWN0IGNsb2dfcmVxdWVzdCAqbWF0Y2gsICpuOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbl9zYWZlKG1hdGNoLCBuLCBsLCB1Lmxpc3QpCisJCWlmIChtYXRjaC0+dV9ycS5zZXEgPT0gcnEtPnVfcnEuc2VxKSB7CisJCQlkbV9saXN0X2RlbCgmbWF0Y2gtPnUubGlzdCk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciBycV9idWZmZXJbRE1fVUxPR19SRVFVRVNUX1NJWkVdOworc3RhdGljIGludCBoYW5kbGVfY2x1c3Rlcl9yZXF1ZXN0KHN0cnVjdCBjbG9nX2NwZyAqZW50cnkgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICBzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSwgaW50IHNlcnZlcikKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IGNsb2dfcmVxdWVzdCAqdG1wID0gKHN0cnVjdCBjbG9nX3JlcXVlc3QgKilycV9idWZmZXI7CisKKwkvKgorCSAqIFdlIG5lZWQgYSBzZXBhcmF0ZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0LCBvbmUgdGhhdCBjYW4gY2FycnkKKwkgKiBhIHJldHVybiBwYXlsb2FkLiAgT3RoZXJ3aXNlLCB0aGUgbWVtb3J5IGFkZHJlc3MgYWZ0ZXIKKwkgKiBycSB3aWxsIGJlIGFsdGVyZWQgLSBsZWFkaW5nIHRvIHByb2JsZW1zCisJICovCisJbWVtc2V0KHJxX2J1ZmZlciwgMCwgc2l6ZW9mKHJxX2J1ZmZlcikpOworCW1lbWNweSh0bXAsIHJxLCBzaXplb2Yoc3RydWN0IGNsb2dfcmVxdWVzdCkgKyBycS0+dV9ycS5kYXRhX3NpemUpOworCisJLyoKKwkgKiBXaXRoIHJlc3VtZXMsIHdlIG9ubHkgaGFuZGxlIG91ciBvd24uCisJICogUmVzdW1lIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgcmVxdWlyZXMKKwkgKiBsb2NhbCBhY3Rpb24gKHRvIHNldCB1cCBDUEcpLCBmb2xsb3dlZCBieQorCSAqIGEgY2x1c3RlciBhY3Rpb24gdG8gY28tb3JkaW5hdGUgcmVhZGluZworCSAqIHRoZSBkaXNrIGFuZCBjaGVja3BvaW50aW5nCisJICovCisJaWYgKHRtcC0+dV9ycS5yZXF1ZXN0X3R5cGUgPT0gRE1fVUxPR19SRVNVTUUpIHsKKwkJaWYgKHRtcC0+b3JpZ2luYXRvciA9PSBteV9jbHVzdGVyX2lkKSB7CisJCQlyID0gZG9fcmVxdWVzdCh0bXAsIHNlcnZlcik7CisKKwkJCXIgPSBrZXJuZWxfc2VuZCgmdG1wLT51X3JxKTsKKwkJCWlmIChyIDwgMCkKKwkJCQlMT0dfRVJST1IoIkZhaWxlZCB0byBzZW5kIHJlc3VtZSByZXNwb25zZSB0byBrZXJuZWwiKTsKKwkJfQorCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gZG9fcmVxdWVzdCh0bXAsIHNlcnZlcik7CisKKwlpZiAoc2VydmVyICYmCisJICAgICh0bXAtPnVfcnEucmVxdWVzdF90eXBlICE9IERNX1VMT0dfQ0xFQVJfUkVHSU9OKSAmJgorCSAgICAodG1wLT51X3JxLnJlcXVlc3RfdHlwZSAhPSBETV9VTE9HX1BPU1RTVVNQRU5EKSkgeworCQl0bXAtPnVfcnEucmVxdWVzdF90eXBlIHw9IERNX1VMT0dfUkVTUE9OU0U7CisKKwkJLyoKKwkJICogRXJyb3JzIGZyb20gcHJldmlvdXMgZnVuY3Rpb25zIGFyZSBpbiB0aGUgcnEgc3RydWN0LgorCQkgKi8KKwkJciA9IGNsdXN0ZXJfc2VuZCh0bXApOworCQlpZiAociA8IDApCisJCQlMT0dfRVJST1IoImNsdXN0ZXJfc2VuZCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoLXIpKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBoYW5kbGVfY2x1c3Rlcl9yZXNwb25zZShzdHJ1Y3QgY2xvZ19jcGcgKmVudHJ5LAorCQkJCSAgIHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpvcmlnX3JxOworCisJLyoKKwkgKiBJZiBJIGRpZG4ndCBzZW5kIGl0LCB0aGVuIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzcG9uc2UKKwkgKi8KKwlpZiAocnEtPm9yaWdpbmF0b3IgIT0gbXlfY2x1c3Rlcl9pZCkKKwkJcmV0dXJuIDA7CisKKwlycS0+dV9ycS5yZXF1ZXN0X3R5cGUgJj0gfkRNX1VMT0dfUkVTUE9OU0U7CisJb3JpZ19ycSA9IGdldF9tYXRjaGluZ19ycShycSwgJmVudHJ5LT53b3JraW5nX2xpc3QpOworCisJaWYgKCFvcmlnX3JxKSB7CisJCS8qIFVuYWJsZSB0byBmaW5kIG1hdGNoIGZvciByZXNwb25zZSAqLworCisJCUxPR19FUlJPUigiWyVzXSBObyBtYXRjaCBmb3IgY2x1c3RlciByZXNwb25zZTogJXM6JXUiLAorCQkJICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLAorCQkJICBfUlFfVFlQRShycS0+dV9ycS5yZXF1ZXN0X3R5cGUpLAorCQkJICBycS0+dV9ycS5zZXEpOworCisJCUxPR19FUlJPUigiQ3VycmVudCBsb2NhbCBsaXN0OiIpOworCQlpZiAoZG1fbGlzdF9lbXB0eSgmZW50cnktPndvcmtpbmdfbGlzdCkpCisJCQlMT0dfRVJST1IoIiAgIFtub25lXSIpOworCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4ob3JpZ19ycSwgJmVudHJ5LT53b3JraW5nX2xpc3QsIHUubGlzdCkKKwkJCUxPR19FUlJPUigiICAgWyVzXSAgJXM6JXUiLAorCQkJCSAgU0hPUlRfVVVJRChvcmlnX3JxLT51X3JxLnV1aWQpLAorCQkJCSAgX1JRX1RZUEUob3JpZ19ycS0+dV9ycS5yZXF1ZXN0X3R5cGUpLAorCQkJCSAgb3JpZ19ycS0+dV9ycS5zZXEpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsb2dfcmVzcF9yZWMgPiAwKSB7CisJCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsCisJCQkgIlslc10gUmVzcG9uc2UgcmVjZWl2ZWQgdG8gJXMvIyV1IiwKKwkJCSBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLAorCQkJIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkgcnEtPnVfcnEuc2VxKTsKKwkJbG9nX3Jlc3BfcmVjLS07CisJfQorCisJLyogRklYTUU6IEVuc3VyZSBtZW1jcHkgY2Fubm90IGV4cGxvZGUgKi8KKwltZW1jcHkob3JpZ19ycSwgcnEsIHNpemVvZigqcnEpICsgcnEtPnVfcnEuZGF0YV9zaXplKTsKKworCXIgPSBrZXJuZWxfc2VuZCgmb3JpZ19ycS0+dV9ycSk7CisJaWYgKHIpCisJCUxPR19FUlJPUigiRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2UgdG8ga2VybmVsIik7CisKKwlmcmVlKG9yaWdfcnEpOworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGNsb2dfY3BnICpmaW5kX2Nsb2dfY3BnKGNwZ19oYW5kbGVfdCBoYW5kbGUpCit7CisJc3RydWN0IGNsb2dfY3BnICptYXRjaDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhtYXRjaCwgJmNsb2dfY3BnX2xpc3QpCisJCWlmIChtYXRjaC0+aGFuZGxlID09IGhhbmRsZSkKKwkJCXJldHVybiBtYXRjaDsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogcHJlcGFyZV9jaGVja3BvaW50CisgKiBAZW50cnk6IGNsb2dfY3BnIGRlc2NyaWJpbmcgdGhlIGxvZworICogQGNwX3JlcXVlc3Rlcjogbm9kZWlkIHJlcXVlc3RpbmcgdGhlIGNoZWNrcG9pbnQKKyAqCisgKiBDcmVhdGVzIGFuZCBmaWxscyBpbiBhIG5ldyBjaGVja3BvaW50X2RhdGEgc3RydWN0LgorICoKKyAqIFJldHVybnM6IGNoZWNrcG9pbnRfZGF0YSBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hlY2twb2ludF9kYXRhICpwcmVwYXJlX2NoZWNrcG9pbnQoc3RydWN0IGNsb2dfY3BnICplbnRyeSwKKwkJCQkJCSAgdWludDMyX3QgY3BfcmVxdWVzdGVyKQoreworCWludCByOworCXN0cnVjdCBjaGVja3BvaW50X2RhdGEgKm5ldzsKKworCWlmIChlbnRyeS0+c3RhdGUgIT0gVkFMSUQpIHsKKwkJLyoKKwkJICogV2UgY2FuJ3Qgc3RvcmUgYml0bWFwcyB5ZXQsIGJlY2F1c2UgdGhlIGxvZyBpcyBub3QKKwkJICogdmFsaWQgeWV0LgorCQkgKi8KKwkJTE9HX0VSUk9SKCJGb3JjZWQgdG8gcmVmdXNlIGNoZWNrcG9pbnQgZm9yIG5vZGVpZCAldSAtIGxvZyBub3QgdmFsaWQgeWV0IiwKKwkJCSAgY3BfcmVxdWVzdGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbmV3ID0gbWFsbG9jKHNpemVvZigqbmV3KSk7CisJaWYgKCFuZXcpIHsKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlIGNoZWNrcG9pbnQgZGF0YSBmb3IgJXUiLAorCQkJICBjcF9yZXF1ZXN0ZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKKwluZXctPnJlcXVlc3RlciA9IGNwX3JlcXVlc3RlcjsKKwlzdHJuY3B5KG5ldy0+dXVpZCwgZW50cnktPm5hbWUudmFsdWUsIGVudHJ5LT5uYW1lLmxlbmd0aCk7CisKKwluZXctPmJpdG1hcF9zaXplID0gcHVzaF9zdGF0ZShlbnRyeS0+bmFtZS52YWx1ZSwgZW50cnktPmx1aWQsCisJCQkJICAgICAgImNsZWFuX2JpdHMiLAorCQkJCSAgICAgICZuZXctPmNsZWFuX2JpdHMsIGNwX3JlcXVlc3Rlcik7CisJaWYgKG5ldy0+Yml0bWFwX3NpemUgPD0gMCkgeworCQlMT0dfRVJST1IoIkZhaWxlZCB0byBzdG9yZSBjbGVhbl9iaXRzIHRvIGNoZWNrcG9pbnQgZm9yIG5vZGUgJXUiLAorCQkJICBuZXctPnJlcXVlc3Rlcik7CisJCWZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbmV3LT5iaXRtYXBfc2l6ZSA9IHB1c2hfc3RhdGUoZW50cnktPm5hbWUudmFsdWUsIGVudHJ5LT5sdWlkLAorCQkJCSAgICAgICJzeW5jX2JpdHMiLAorCQkJCSAgICAgICZuZXctPnN5bmNfYml0cywgY3BfcmVxdWVzdGVyKTsKKwlpZiAobmV3LT5iaXRtYXBfc2l6ZSA8PSAwKSB7CisJCUxPR19FUlJPUigiRmFpbGVkIHRvIHN0b3JlIHN5bmNfYml0cyB0byBjaGVja3BvaW50IGZvciBub2RlICV1IiwKKwkJCSAgbmV3LT5yZXF1ZXN0ZXIpOworCQlmcmVlKG5ldy0+Y2xlYW5fYml0cyk7CisJCWZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJciA9IHB1c2hfc3RhdGUoZW50cnktPm5hbWUudmFsdWUsIGVudHJ5LT5sdWlkLAorCQkgICAgICAgInJlY292ZXJpbmdfcmVnaW9uIiwKKwkJICAgICAgICZuZXctPnJlY292ZXJpbmdfcmVnaW9uLCBjcF9yZXF1ZXN0ZXIpOworCWlmIChyIDw9IDApIHsKKwkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gc3RvcmUgcmVjb3ZlcmluZ19yZWdpb24gdG8gY2hlY2twb2ludCBmb3Igbm9kZSAldSIsCisJCQkgIG5ldy0+cmVxdWVzdGVyKTsKKwkJZnJlZShuZXctPnN5bmNfYml0cyk7CisJCWZyZWUobmV3LT5jbGVhbl9iaXRzKTsKKwkJZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJTE9HX0RCRygiWyVzXSBDaGVja3BvaW50IHByZXBhcmVkIGZvciBub2RlICV1OiIsCisJCVNIT1JUX1VVSUQobmV3LT51dWlkKSwgbmV3LT5yZXF1ZXN0ZXIpOworCUxPR19EQkcoIiAgYml0bWFwX3NpemUgPSAlZCIsIG5ldy0+Yml0bWFwX3NpemUpOworCisJcmV0dXJuIG5ldzsKK30KKworLyoKKyAqIGZyZWVfY2hlY2twb2ludAorICogQGNwOiB0aGUgY2hlY2twb2ludF9kYXRhIHN0cnVjdCB0byBmcmVlCisgKgorICovCitzdGF0aWMgdm9pZCBmcmVlX2NoZWNrcG9pbnQoc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqY3ApCit7CisJZnJlZShjcC0+cmVjb3ZlcmluZ19yZWdpb24pOworCWZyZWUoY3AtPnN5bmNfYml0cyk7CisJZnJlZShjcC0+Y2xlYW5fYml0cyk7CisJZnJlZShjcCk7Cit9CisKKyNpZiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UCitzdGF0aWMgaW50IGV4cG9ydF9jaGVja3BvaW50KHN0cnVjdCBjaGVja3BvaW50X2RhdGEgKmNwKQoreworCVNhQ2twdENoZWNrcG9pbnRDcmVhdGlvbkF0dHJpYnV0ZXNUIGF0dHI7CisJU2FDa3B0Q2hlY2twb2ludEhhbmRsZVQgaDsKKwlTYUNrcHRTZWN0aW9uSWRUIHNlY3Rpb25faWQ7CisJU2FDa3B0U2VjdGlvbkNyZWF0aW9uQXR0cmlidXRlc1Qgc2VjdGlvbl9hdHRyOworCVNhQ2twdENoZWNrcG9pbnRPcGVuRmxhZ3NUIGZsYWdzOworCVNhTmFtZVQgbmFtZTsKKwlTYUFpc0Vycm9yVCBydjsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycTsKKwlpbnQgbGVuLCByID0gMDsKKwljaGFyIGJ1ZlszMl07CisKKwlMT0dfREJHKCJTZW5kaW5nIGNoZWNrcG9pbnRlZCBkYXRhIHRvICV1IiwgY3AtPnJlcXVlc3Rlcik7CisKKwlsZW4gPSBzbnByaW50ZigoY2hhciAqKShuYW1lLnZhbHVlKSwgU0FfTUFYX05BTUVfTEVOR1RILAorCQkgICAgICAgImJpdG1hcHNfJXNfJXUiLCBTSE9SVF9VVUlEKGNwLT51dWlkKSwgY3AtPnJlcXVlc3Rlcik7CisJbmFtZS5sZW5ndGggPSAoU2FVaW50MTZUKWxlbjsKKworCWxlbiA9IChpbnQpc3RybGVuKGNwLT5yZWNvdmVyaW5nX3JlZ2lvbikgKyAxOworCisJYXR0ci5jcmVhdGlvbkZsYWdzID0gU0FfQ0tQVF9XUl9BTExfUkVQTElDQVM7CisJYXR0ci5jaGVja3BvaW50U2l6ZSA9IGNwLT5iaXRtYXBfc2l6ZSAqIDIgKyBsZW47CisKKwlhdHRyLnJldGVudGlvbkR1cmF0aW9uID0gU0FfVElNRV9NQVg7CisJYXR0ci5tYXhTZWN0aW9ucyA9IDQ7ICAgICAgLyogZG9uJ3Qga25vdyB3aHkgd2UgbmVlZCArMSAqLworCisJYXR0ci5tYXhTZWN0aW9uU2l6ZSA9IChjcC0+Yml0bWFwX3NpemUgPiBsZW4pID8JY3AtPmJpdG1hcF9zaXplIDogbGVuOworCWF0dHIubWF4U2VjdGlvbklkU2l6ZSA9IDIyOworCisJZmxhZ3MgPSBTQV9DS1BUX0NIRUNLUE9JTlRfUkVBRCB8CisJCVNBX0NLUFRfQ0hFQ0tQT0lOVF9XUklURSB8CisJCVNBX0NLUFRfQ0hFQ0tQT0lOVF9DUkVBVEU7CisKK29wZW5fcmV0cnk6CisJcnYgPSBzYUNrcHRDaGVja3BvaW50T3Blbihja3B0X2hhbmRsZSwgJm5hbWUsICZhdHRyLCBmbGFncywgMCwgJmgpOworCWlmIChydiA9PSBTQV9BSVNfRVJSX1RSWV9BR0FJTikgeworCQlMT0dfRVJST1IoImV4cG9ydF9jaGVja3BvaW50OiBja3B0IG9wZW4gcmV0cnkiKTsKKwkJdXNsZWVwKDEwMDApOworCQlnb3RvIG9wZW5fcmV0cnk7CisJfQorCisJaWYgKHJ2ID09IFNBX0FJU19FUlJfRVhJU1QpIHsKKwkJTE9HX0RCRygiZXhwb3J0X2NoZWNrcG9pbnQ6IGNoZWNrcG9pbnQgYWxyZWFkeSBleGlzdHMiKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJaWYgKHJ2ICE9IFNBX0FJU19PSykgeworCQlMT0dfRVJST1IoIlslc10gRmFpbGVkIHRvIG9wZW4gY2hlY2twb2ludCBmb3IgJXU6ICVzIiwKKwkJCSAgU0hPUlRfVVVJRChjcC0+dXVpZCksIGNwLT5yZXF1ZXN0ZXIsCisJCQkgIHN0cl9haXNfZXJyb3IocnYpKTsKKwkJcmV0dXJuIC1FSU87IC8qIEZJWE1FOiBiZXR0ZXIgZXJyb3IgKi8KKwl9CisKKwkvKgorCSAqIEFkZCBzZWN0aW9uIGZvciBzeW5jX2JpdHMKKwkgKi8KKwlzZWN0aW9uX2lkLmlkTGVuID0gKFNhVWludDE2VClzbnByaW50ZihidWYsIDMyLCAic3luY19iaXRzIik7CisJc2VjdGlvbl9pZC5pZCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCXNlY3Rpb25fYXR0ci5zZWN0aW9uSWQgPSAmc2VjdGlvbl9pZDsKKwlzZWN0aW9uX2F0dHIuZXhwaXJhdGlvblRpbWUgPSBTQV9USU1FX0VORDsKKworc3luY19jcmVhdGVfcmV0cnk6CisJcnYgPSBzYUNrcHRTZWN0aW9uQ3JlYXRlKGgsICZzZWN0aW9uX2F0dHIsCisJCQkJIGNwLT5zeW5jX2JpdHMsIGNwLT5iaXRtYXBfc2l6ZSk7CisJaWYgKHJ2ID09IFNBX0FJU19FUlJfVFJZX0FHQUlOKSB7CisJCUxPR19FUlJPUigiU3luYyBjaGVja3BvaW50IHNlY3Rpb24gY3JlYXRlIHJldHJ5Iik7CisJCXVzbGVlcCgxMDAwKTsKKwkJZ290byBzeW5jX2NyZWF0ZV9yZXRyeTsKKwl9CisKKwlpZiAocnYgPT0gU0FfQUlTX0VSUl9FWElTVCkgeworCQlMT0dfREJHKCJTeW5jIGNoZWNrcG9pbnQgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cyIpOworCQlzYUNrcHRDaGVja3BvaW50Q2xvc2UoaCk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWlmIChydiAhPSBTQV9BSVNfT0spIHsKKwkJTE9HX0VSUk9SKCJTeW5jIGNoZWNrcG9pbnQgc2VjdGlvbiBjcmVhdGlvbiBmYWlsZWQ6ICVzIiwKKwkJCSAgc3RyX2Fpc19lcnJvcihydikpOworCQlzYUNrcHRDaGVja3BvaW50Q2xvc2UoaCk7CisJCXJldHVybiAtRUlPOyAvKiBGSVhNRTogYmV0dGVyIGVycm9yICovCisJfQorCisJLyoKKwkgKiBBZGQgc2VjdGlvbiBmb3IgY2xlYW5fYml0cworCSAqLworCXNlY3Rpb25faWQuaWRMZW4gPSBzbnByaW50ZihidWYsIDMyLCAiY2xlYW5fYml0cyIpOworCXNlY3Rpb25faWQuaWQgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwlzZWN0aW9uX2F0dHIuc2VjdGlvbklkID0gJnNlY3Rpb25faWQ7CisJc2VjdGlvbl9hdHRyLmV4cGlyYXRpb25UaW1lID0gU0FfVElNRV9FTkQ7CisKK2NsZWFuX2NyZWF0ZV9yZXRyeToKKwlydiA9IHNhQ2twdFNlY3Rpb25DcmVhdGUoaCwgJnNlY3Rpb25fYXR0ciwgY3AtPmNsZWFuX2JpdHMsIGNwLT5iaXRtYXBfc2l6ZSk7CisJaWYgKHJ2ID09IFNBX0FJU19FUlJfVFJZX0FHQUlOKSB7CisJCUxPR19FUlJPUigiQ2xlYW4gY2hlY2twb2ludCBzZWN0aW9uIGNyZWF0ZSByZXRyeSIpOworCQl1c2xlZXAoMTAwMCk7CisJCWdvdG8gY2xlYW5fY3JlYXRlX3JldHJ5OworCX0KKworCWlmIChydiA9PSBTQV9BSVNfRVJSX0VYSVNUKSB7CisJCUxPR19EQkcoIkNsZWFuIGNoZWNrcG9pbnQgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cyIpOworCQlzYUNrcHRDaGVja3BvaW50Q2xvc2UoaCk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWlmIChydiAhPSBTQV9BSVNfT0spIHsKKwkJTE9HX0VSUk9SKCJDbGVhbiBjaGVja3BvaW50IHNlY3Rpb24gY3JlYXRpb24gZmFpbGVkOiAlcyIsCisJCQkgIHN0cl9haXNfZXJyb3IocnYpKTsKKwkJc2FDa3B0Q2hlY2twb2ludENsb3NlKGgpOworCQlyZXR1cm4gLUVJTzsgLyogRklYTUU6IGJldHRlciBlcnJvciAqLworCX0KKworCS8qCisJICogQWRkIHNlY3Rpb24gZm9yIHJlY292ZXJpbmdfcmVnaW9uCisJICovCisJc2VjdGlvbl9pZC5pZExlbiA9IHNucHJpbnRmKGJ1ZiwgMzIsICJyZWNvdmVyaW5nX3JlZ2lvbiIpOworCXNlY3Rpb25faWQuaWQgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwlzZWN0aW9uX2F0dHIuc2VjdGlvbklkID0gJnNlY3Rpb25faWQ7CisJc2VjdGlvbl9hdHRyLmV4cGlyYXRpb25UaW1lID0gU0FfVElNRV9FTkQ7CisKK3JyX2NyZWF0ZV9yZXRyeToKKwlydiA9IHNhQ2twdFNlY3Rpb25DcmVhdGUoaCwgJnNlY3Rpb25fYXR0ciwgY3AtPnJlY292ZXJpbmdfcmVnaW9uLAorCQkJCSBzdHJsZW4oY3AtPnJlY292ZXJpbmdfcmVnaW9uKSArIDEpOworCWlmIChydiA9PSBTQV9BSVNfRVJSX1RSWV9BR0FJTikgeworCQlMT0dfRVJST1IoIlJSIGNoZWNrcG9pbnQgc2VjdGlvbiBjcmVhdGUgcmV0cnkiKTsKKwkJdXNsZWVwKDEwMDApOworCQlnb3RvIHJyX2NyZWF0ZV9yZXRyeTsKKwl9CisKKwlpZiAocnYgPT0gU0FfQUlTX0VSUl9FWElTVCkgeworCQlMT0dfREJHKCJSUiBjaGVja3BvaW50IHNlY3Rpb24gYWxyZWFkeSBleGlzdHMiKTsKKwkJc2FDa3B0Q2hlY2twb2ludENsb3NlKGgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlpZiAocnYgIT0gU0FfQUlTX09LKSB7CisJCUxPR19FUlJPUigiUlIgY2hlY2twb2ludCBzZWN0aW9uIGNyZWF0aW9uIGZhaWxlZDogJXMiLAorCQkJICBzdHJfYWlzX2Vycm9yKHJ2KSk7CisJCXNhQ2twdENoZWNrcG9pbnRDbG9zZShoKTsKKwkJcmV0dXJuIC1FSU87IC8qIEZJWE1FOiBiZXR0ZXIgZXJyb3IgKi8KKwl9CisKKwlMT0dfREJHKCJleHBvcnRfY2hlY2twb2ludDogY2xvc2luZyBjaGVja3BvaW50Iik7CisJc2FDa3B0Q2hlY2twb2ludENsb3NlKGgpOworCisJcnEgPSBtYWxsb2MoRE1fVUxPR19SRVFVRVNUX1NJWkUpOworCWlmICghcnEpIHsKKwkJTE9HX0VSUk9SKCJleHBvcnRfY2hlY2twb2ludDogVW5hYmxlIHRvIGFsbG9jYXRlIHRyYW5zZmVyIHN0cnVjdHMiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChycSwgMCwgc2l6ZW9mKCpycSkpOworCisJZG1fbGlzdF9pbml0KCZycS0+dS5saXN0KTsKKwlycS0+dV9ycS5yZXF1ZXN0X3R5cGUgPSBETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFk7CisJcnEtPm9yaWdpbmF0b3IgPSBjcC0+cmVxdWVzdGVyOyAgLyogRklYTUU6IGhhY2sgdG8gb3ZlcmxvYWQgbWVhbmluZyBvZiBvcmlnaW5hdG9yICovCisJc3RybmNweShycS0+dV9ycS51dWlkLCBjcC0+dXVpZCwgQ1BHX01BWF9OQU1FX0xFTkdUSCk7CisJcnEtPnVfcnEuc2VxID0gbXlfY2x1c3Rlcl9pZDsKKworCXIgPSBjbHVzdGVyX3NlbmQocnEpOworCWlmIChyKQorCQlMT0dfRVJST1IoIkZhaWxlZCB0byBzZW5kIGNoZWNrcG9pbnQgcmVhZHkgbm90aWNlOiAlcyIsCisJCQkgIHN0cmVycm9yKC1yKSk7CisKKwlmcmVlKHJxKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgZXhwb3J0X2NoZWNrcG9pbnQoc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqY3ApCit7CisJaW50IHIsIHJxX3NpemU7CisJc3RydWN0IGNsb2dfcmVxdWVzdCAqcnE7CisKKwlycV9zaXplID0gc2l6ZW9mKCpycSk7CisJcnFfc2l6ZSArPSBSRUNPVkVSSU5HX1JFR0lPTl9TRUNUSU9OX1NJWkU7CisJcnFfc2l6ZSArPSBjcC0+Yml0bWFwX3NpemUgKiAyOyAvKiBjbGVhbnxzeW5jX2JpdHMgKi8KKworCXJxID0gbWFsbG9jKHJxX3NpemUpOworCWlmICghcnEpIHsKKwkJTE9HX0VSUk9SKCJleHBvcnRfY2hlY2twb2ludDogIgorCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHRyYW5zZmVyIHN0cnVjdHMiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChycSwgMCwgcnFfc2l6ZSk7CisKKwlkbV9saXN0X2luaXQoJnJxLT51Lmxpc3QpOworCXJxLT51X3JxLnJlcXVlc3RfdHlwZSA9IERNX1VMT0dfQ0hFQ0tQT0lOVF9SRUFEWTsKKwlycS0+b3JpZ2luYXRvciA9IGNwLT5yZXF1ZXN0ZXI7CisJc3RybmNweShycS0+dV9ycS51dWlkLCBjcC0+dXVpZCwgQ1BHX01BWF9OQU1FX0xFTkdUSCk7CisJcnEtPnVfcnEuc2VxID0gbXlfY2x1c3Rlcl9pZDsKKwlycS0+dV9ycS5kYXRhX3NpemUgPSBycV9zaXplIC0gc2l6ZW9mKCpycSk7CisKKwkvKiBTeW5jIGJpdHMgKi8KKwltZW1jcHkocnEtPnVfcnEuZGF0YSwgY3AtPnN5bmNfYml0cywgY3AtPmJpdG1hcF9zaXplKTsKKworCS8qIENsZWFuIGJpdHMgKi8KKwltZW1jcHkocnEtPnVfcnEuZGF0YSArIGNwLT5iaXRtYXBfc2l6ZSwgY3AtPmNsZWFuX2JpdHMsIGNwLT5iaXRtYXBfc2l6ZSk7CisKKwkvKiBSZWNvdmVyaW5nIHJlZ2lvbiAqLworCW1lbWNweShycS0+dV9ycS5kYXRhICsgKGNwLT5iaXRtYXBfc2l6ZSAqIDIpLCBjcC0+cmVjb3ZlcmluZ19yZWdpb24sCisJICAgICAgIHN0cmxlbihjcC0+cmVjb3ZlcmluZ19yZWdpb24pKTsKKworCXIgPSBjbHVzdGVyX3NlbmQocnEpOworCWlmIChyKQorCQlMT0dfRVJST1IoIkZhaWxlZCB0byBzZW5kIGNoZWNrcG9pbnQgcmVhZHkgbm90aWNlOiAlcyIsCisJCQkgIHN0cmVycm9yKC1yKSk7CisKKwlmcmVlKHJxKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UICovCisKKyNpZiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UCitzdGF0aWMgaW50IGltcG9ydF9jaGVja3BvaW50KHN0cnVjdCBjbG9nX2NwZyAqZW50cnksIGludCBub19yZWFkLAorCQkJICAgICBzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpbnQgcnRuID0gMDsKKwlTYUNrcHRDaGVja3BvaW50SGFuZGxlVCBoOworCVNhQ2twdFNlY3Rpb25JdGVyYXRpb25IYW5kbGVUIGl0cjsKKwlTYUNrcHRTZWN0aW9uRGVzY3JpcHRvclQgZGVzYzsKKwlTYUNrcHRJT1ZlY3RvckVsZW1lbnRUIGlvdjsKKwlTYU5hbWVUIG5hbWU7CisJU2FBaXNFcnJvclQgcnY7CisJY2hhciAqYml0bWFwID0gTlVMTDsKKwlpbnQgbGVuOworCisJYml0bWFwID0gbWFsbG9jKDEwMjQqMTAyNCk7CisJaWYgKCFiaXRtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gc25wcmludGYoKGNoYXIgKikobmFtZS52YWx1ZSksIFNBX01BWF9OQU1FX0xFTkdUSCwgImJpdG1hcHNfJXNfJXUiLAorCQkgICAgICAgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksIG15X2NsdXN0ZXJfaWQpOworCW5hbWUubGVuZ3RoID0gKFNhVWludDE2VClsZW47CisKK29wZW5fcmV0cnk6CisJcnYgPSBzYUNrcHRDaGVja3BvaW50T3Blbihja3B0X2hhbmRsZSwgJm5hbWUsIE5VTEwsCisJCQkJICBTQV9DS1BUX0NIRUNLUE9JTlRfUkVBRCwgMCwgJmgpOworCWlmIChydiA9PSBTQV9BSVNfRVJSX1RSWV9BR0FJTikgeworCQlMT0dfRVJST1IoImltcG9ydF9jaGVja3BvaW50OiBja3B0IG9wZW4gcmV0cnkiKTsKKwkJdXNsZWVwKDEwMDApOworCQlnb3RvIG9wZW5fcmV0cnk7CisJfQorCisJaWYgKHJ2ICE9IFNBX0FJU19PSykgeworCQlMT0dfRVJST1IoIlslc10gRmFpbGVkIHRvIG9wZW4gY2hlY2twb2ludDogJXMiLAorCQkJICBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgc3RyX2Fpc19lcnJvcihydikpOworCQlmcmVlKGJpdG1hcCk7CisJCXJldHVybiAtRUlPOyAvKiBGSVhNRTogYmV0dGVyIGVycm9yICovCisJfQorCit1bmxpbmtfcmV0cnk6CisJcnYgPSBzYUNrcHRDaGVja3BvaW50VW5saW5rKGNrcHRfaGFuZGxlLCAmbmFtZSk7CisJaWYgKHJ2ID09IFNBX0FJU19FUlJfVFJZX0FHQUlOKSB7CisJCUxPR19FUlJPUigiaW1wb3J0X2NoZWNrcG9pbnQ6IGNrcHQgdW5saW5rIHJldHJ5Iik7CisJCXVzbGVlcCgxMDAwKTsKKwkJZ290byB1bmxpbmtfcmV0cnk7CisJfQorCisJaWYgKG5vX3JlYWQpIHsKKwkJTE9HX0RCRygiQ2hlY2twb2ludCBmb3IgdGhpcyBsb2cgYWxyZWFkeSByZWNlaXZlZCIpOworCQlnb3RvIG5vX3JlYWQ7CisJfQorCitpbml0X3JldHJ5OgorCXJ2ID0gc2FDa3B0U2VjdGlvbkl0ZXJhdGlvbkluaXRpYWxpemUoaCwgU0FfQ0tQVF9TRUNUSU9OU19BTlksCisJCQkJCSAgICAgIFNBX1RJTUVfRU5ELCAmaXRyKTsKKwlpZiAocnYgPT0gU0FfQUlTX0VSUl9UUllfQUdBSU4pIHsKKwkJTE9HX0VSUk9SKCJpbXBvcnRfY2hlY2twb2ludDogc3luYyBjcmVhdGUgcmV0cnkiKTsKKwkJdXNsZWVwKDEwMDApOworCQlnb3RvIGluaXRfcmV0cnk7CisJfQorCisJaWYgKHJ2ICE9IFNBX0FJU19PSykgeworCQlMT0dfRVJST1IoIlslc10gU3luYyBjaGVja3BvaW50IHNlY3Rpb24gY3JlYXRpb24gZmFpbGVkOiAlcyIsCisJCQkgIFNIT1JUX1VVSUQoZW50cnktPm5hbWUudmFsdWUpLCBzdHJfYWlzX2Vycm9yKHJ2KSk7CisJCWZyZWUoYml0bWFwKTsKKwkJcmV0dXJuIC1FSU87IC8qIEZJWE1FOiBiZXR0ZXIgZXJyb3IgKi8KKwl9CisKKwlsZW4gPSAwOworCXdoaWxlICgxKSB7CisJCXJ2ID0gc2FDa3B0U2VjdGlvbkl0ZXJhdGlvbk5leHQoaXRyLCAmZGVzYyk7CisJCWlmIChydiA9PSBTQV9BSVNfT0spCisJCQlsZW4rKzsKKwkJZWxzZSBpZiAoKHJ2ID09IFNBX0FJU19FUlJfTk9fU0VDVElPTlMpICYmIGxlbikKKwkJCWJyZWFrOworCQllbHNlIGlmIChydiAhPSBTQV9BSVNfRVJSX1RSWV9BR0FJTikgeworCQkJTE9HX0VSUk9SKCJzYUNrcHRTZWN0aW9uSXRlcmF0aW9uTmV4dCBmYWlsdXJlOiAlZCIsIHJ2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNhQ2twdFNlY3Rpb25JdGVyYXRpb25GaW5hbGl6ZShpdHIpOworCWlmIChsZW4gIT0gMykgeworCQlMT0dfRVJST1IoImltcG9ydF9jaGVja3BvaW50OiAlZCBjaGVja3BvaW50IHNlY3Rpb25zIGZvdW5kIiwKKwkJCSAgbGVuKTsKKwkJdXNsZWVwKDEwMDApOworCQlnb3RvIGluaXRfcmV0cnk7CisJfQorCXNhQ2twdFNlY3Rpb25JdGVyYXRpb25Jbml0aWFsaXplKGgsIFNBX0NLUFRfU0VDVElPTlNfQU5ZLAorCQkJCQkgU0FfVElNRV9FTkQsICZpdHIpOworCisJd2hpbGUgKDEpIHsKKwkJcnYgPSBzYUNrcHRTZWN0aW9uSXRlcmF0aW9uTmV4dChpdHIsICZkZXNjKTsKKwkJaWYgKHJ2ID09IFNBX0FJU19FUlJfTk9fU0VDVElPTlMpCisJCQlicmVhazsKKworCQlpZiAocnYgPT0gU0FfQUlTX0VSUl9UUllfQUdBSU4pIHsKKwkJCUxPR19FUlJPUigiaW1wb3J0X2NoZWNrcG9pbnQ6IGNrcHQgaXRlcm5leHQgcmV0cnkiKTsKKwkJCXVzbGVlcCgxMDAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJ2ICE9IFNBX0FJU19PSykgeworCQkJTE9HX0VSUk9SKCJpbXBvcnRfY2hlY2twb2ludDogY2xlYW4gY2hlY2twb2ludCBzZWN0aW9uICIKKwkJCQkgICJjcmVhdGlvbiBmYWlsZWQ6ICVzIiwgc3RyX2Fpc19lcnJvcihydikpOworCQkJcnRuID0gLUVJTzsgLyogRklYTUU6IGJldHRlciBlcnJvciAqLworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKCFkZXNjLnNlY3Rpb25TaXplKSB7CisJCQlMT0dfRVJST1IoIkNoZWNrcG9pbnQgc2VjdGlvbiBlbXB0eSIpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoYml0bWFwLCAwLCBzaXplb2YoKmJpdG1hcCkpOworCQlpb3Yuc2VjdGlvbklkID0gZGVzYy5zZWN0aW9uSWQ7CisJCWlvdi5kYXRhQnVmZmVyID0gYml0bWFwOworCQlpb3YuZGF0YVNpemUgPSBkZXNjLnNlY3Rpb25TaXplOworCQlpb3YuZGF0YU9mZnNldCA9IDA7CisKKwlyZWFkX3JldHJ5OgorCQlydiA9IHNhQ2twdENoZWNrcG9pbnRSZWFkKGgsICZpb3YsIDEsIE5VTEwpOworCQlpZiAocnYgPT0gU0FfQUlTX0VSUl9UUllfQUdBSU4pIHsKKwkJCUxPR19FUlJPUigiY2twdCByZWFkIHJldHJ5Iik7CisJCQl1c2xlZXAoMTAwMCk7CisJCQlnb3RvIHJlYWRfcmV0cnk7CisJCX0KKworCQlpZiAocnYgIT0gU0FfQUlTX09LKSB7CisJCQlMT0dfRVJST1IoImltcG9ydF9jaGVja3BvaW50OiBja3B0IHJlYWQgZXJyb3I6ICVzIiwKKwkJCQkgIHN0cl9haXNfZXJyb3IocnYpKTsKKwkJCXJ0biA9IC1FSU87IC8qIEZJWE1FOiBiZXR0ZXIgZXJyb3IgKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChpb3YucmVhZFNpemUpIHsKKwkJCWlmIChwdWxsX3N0YXRlKGVudHJ5LT5uYW1lLnZhbHVlLCBlbnRyeS0+bHVpZCwKKwkJCQkgICAgICAgKGNoYXIgKilkZXNjLnNlY3Rpb25JZC5pZCwgYml0bWFwLAorCQkJCSAgICAgICBpb3YucmVhZFNpemUpKSB7CisJCQkJTE9HX0VSUk9SKCJFcnJvciBsb2FkaW5nIHN0YXRlIik7CisJCQkJcnRuID0gLUVJTzsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBOZWVkIHRvIHJlcXVlc3QgbmV3IGNoZWNrcG9pbnQgKi8KKwkJCXJ0biA9IC1FQUdBSU47CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKK2ZhaWw6CisJc2FDa3B0U2VjdGlvbkl0ZXJhdGlvbkZpbmFsaXplKGl0cik7Citub19yZWFkOgorCXNhQ2twdENoZWNrcG9pbnRDbG9zZShoKTsKKworCWZyZWUoYml0bWFwKTsKKwlyZXR1cm4gcnRuOworfQorCisjZWxzZQorc3RhdGljIGludCBpbXBvcnRfY2hlY2twb2ludChzdHJ1Y3QgY2xvZ19jcGcgKmVudHJ5LCBpbnQgbm9fcmVhZCwKKwkJCSAgICAgc3RydWN0IGNsb2dfcmVxdWVzdCAqcnEpCit7CisJaW50IGJpdG1hcF9zaXplOworCisJaWYgKG5vX3JlYWQpIHsKKwkJTE9HX0RCRygiQ2hlY2twb2ludCBmb3IgdGhpcyBsb2cgYWxyZWFkeSByZWNlaXZlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwliaXRtYXBfc2l6ZSA9IChycS0+dV9ycS5kYXRhX3NpemUgLSBSRUNPVkVSSU5HX1JFR0lPTl9TRUNUSU9OX1NJWkUpIC8gMjsKKwlpZiAoYml0bWFwX3NpemUgPCAwKSB7CisJCUxPR19FUlJPUigiQ2hlY2twb2ludCBoYXMgaW52YWxpZCBwYXlsb2FkIHNpemUuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwdWxsX3N0YXRlKGVudHJ5LT5uYW1lLnZhbHVlLCBlbnRyeS0+bHVpZCwgInN5bmNfYml0cyIsCisJCSAgICAgICBycS0+dV9ycS5kYXRhLCBiaXRtYXBfc2l6ZSkgfHwKKwkgICAgcHVsbF9zdGF0ZShlbnRyeS0+bmFtZS52YWx1ZSwgZW50cnktPmx1aWQsICJjbGVhbl9iaXRzIiwKKwkJICAgICAgIHJxLT51X3JxLmRhdGEgKyBiaXRtYXBfc2l6ZSwgYml0bWFwX3NpemUpIHx8CisJICAgIHB1bGxfc3RhdGUoZW50cnktPm5hbWUudmFsdWUsIGVudHJ5LT5sdWlkLCAicmVjb3ZlcmluZ19yZWdpb24iLAorCQkgICAgICAgcnEtPnVfcnEuZGF0YSArIChiaXRtYXBfc2l6ZSAqIDIpLAorCQkgICAgICAgUkVDT1ZFUklOR19SRUdJT05fU0VDVElPTl9TSVpFKSkgeworCQlMT0dfRVJST1IoIkVycm9yIGxvYWRpbmcgYml0bWFwIHN0YXRlIGZyb20gY2hlY2twb2ludC4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENNSVJST1JfSEFTX0NIRUNLUE9JTlQgKi8KKworc3RhdGljIHZvaWQgZG9fY2hlY2twb2ludHMoc3RydWN0IGNsb2dfY3BnICplbnRyeSwgaW50IGxlYXZpbmcpCit7CisJc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqY3A7CisKKwlmb3IgKGNwID0gZW50cnktPmNoZWNrcG9pbnRfbGlzdDsgY3A7KSB7CisJCS8qCisJCSAqIEZJWE1FOiBDaGVjayByZXR1cm4gY29kZS4gIENvdWxkIHNlbmQgZmFpbHVyZQorCQkgKiBub3RpY2UgaW4gcnEgaW4gZXhwb3J0X2NoZWNrcG9pbnQgZnVuY3Rpb24KKwkJICogYnkgc2V0dGluZyBycS0+ZXJyb3IKKwkJICovCisJCXN3aXRjaCAoZXhwb3J0X2NoZWNrcG9pbnQoY3ApKSB7CisJCWNhc2UgLUVFWElTVDoKKwkJCUxPR19TUFJJTlQoZW50cnksICJbJXNdIENoZWNrcG9pbnQgZm9yICV1IGFscmVhZHkgaGFuZGxlZCVzIiwKKwkJCQkgICBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgY3AtPnJlcXVlc3RlciwKKwkJCQkgICAobGVhdmluZykgPyAiKEwpIjogIiIpOworCQkJTE9HX0NPTkQobG9nX2NoZWNrcG9pbnQsCisJCQkJICJbJXNdIENoZWNrcG9pbnQgZm9yICV1IGFscmVhZHkgaGFuZGxlZCVzIiwKKwkJCQkgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksIGNwLT5yZXF1ZXN0ZXIsCisJCQkJIChsZWF2aW5nKSA/ICIoTCkiOiAiIik7CisJCQllbnRyeS0+Y2hlY2twb2ludF9saXN0ID0gY3AtPm5leHQ7CisJCQlmcmVlX2NoZWNrcG9pbnQoY3ApOworCQkJY3AgPSBlbnRyeS0+Y2hlY2twb2ludF9saXN0OworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCUxPR19TUFJJTlQoZW50cnksICJbJXNdIENoZWNrcG9pbnQgZGF0YSBhdmFpbGFibGUgZm9yIG5vZGUgJXUlcyIsCisJCQkJICAgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksIGNwLT5yZXF1ZXN0ZXIsCisJCQkJICAgKGxlYXZpbmcpID8gIihMKSI6ICIiKTsKKwkJCUxPR19DT05EKGxvZ19jaGVja3BvaW50LAorCQkJCSAiWyVzXSBDaGVja3BvaW50IGRhdGEgYXZhaWxhYmxlIGZvciBub2RlICV1JXMiLAorCQkJCSBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgY3AtPnJlcXVlc3RlciwKKwkJCQkgKGxlYXZpbmcpID8gIihMKSI6ICIiKTsKKwkJCWVudHJ5LT5jaGVja3BvaW50X2xpc3QgPSBjcC0+bmV4dDsKKwkJCWZyZWVfY2hlY2twb2ludChjcCk7CisJCQljcCA9IGVudHJ5LT5jaGVja3BvaW50X2xpc3Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEZJWE1FOiBTa2lwcGluZyB3aWxsIGNhdXNlIGxpc3QgY29ycnVwdGlvbiAqLworCQkJTE9HX0VSUk9SKCJbJXNdIEZhaWxlZCB0byBleHBvcnQgY2hlY2twb2ludCBmb3IgJXUlcyIsCisJCQkJICBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgY3AtPnJlcXVlc3RlciwKKwkJCQkgIChsZWF2aW5nKSA/ICIoTCkiOiAiIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVzZW5kX3JlcXVlc3RzKHN0cnVjdCBjbG9nX2NwZyAqZW50cnkpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxLCAqbjsKKworCWlmICghZW50cnktPnJlc2VuZF9yZXF1ZXN0cyB8fCBlbnRyeS0+ZGVsYXkpCisJCXJldHVybiAwOworCisJaWYgKGVudHJ5LT5zdGF0ZSAhPSBWQUxJRCkKKwkJcmV0dXJuIDA7CisKKwllbnRyeS0+cmVzZW5kX3JlcXVlc3RzID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW5fc2FmZShycSwgbiwgJmVudHJ5LT53b3JraW5nX2xpc3QsIHUubGlzdCkgeworCQlkbV9saXN0X2RlbCgmcnEtPnUubGlzdCk7CisKKwkJaWYgKHN0cmNtcChlbnRyeS0+bmFtZS52YWx1ZSwgcnEtPnVfcnEudXVpZCkpIHsKKwkJCUxPR19FUlJPUigiWyVzXSAgU3RyYXkgcmVxdWVzdCBmcm9tIGFub3RoZXIgbG9nICglcykiLAorCQkJCSAgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksCisJCQkJICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpKTsKKwkJCWZyZWUocnEpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKHJxLT51X3JxLnJlcXVlc3RfdHlwZSkgeworCQljYXNlIERNX1VMT0dfU0VUX1JFR0lPTl9TWU5DOgorCQkJLyoKKwkJCSAqIFNvbWUgcmVxdWVzdHMgc2ltcGx5IGRvIG5vdCBuZWVkIHRvIGJlIHJlc2VudC4KKwkJCSAqIElmIGl0IGlzIGEgcmVxdWVzdCB0aGF0IGp1c3QgY2hhbmdlcyBsb2cgc3RhdGUsCisJCQkgKiB0aGVuIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSByZXNlbnQgKGV2ZXJ5b25lIG1ha2VzCisJCQkgKiB1cGRhdGVzKS4KKwkJCSAqLworCQkJTE9HX0NPTkQobG9nX3Jlc2VuZF9yZXF1ZXN0cywKKwkJCQkgIlslc10gU2tpcHBpbmcgcmVzZW5kIG9mICVzLyMldS4uLiIsCisJCQkJIFNIT1JUX1VVSUQoZW50cnktPm5hbWUudmFsdWUpLAorCQkJCSBfUlFfVFlQRShycS0+dV9ycS5yZXF1ZXN0X3R5cGUpLAorCQkJCSBycS0+dV9ycS5zZXEpOworCQkJTE9HX1NQUklOVChlbnRyeSwgIiMjIyAgTm8gcmVzZW5kOiBbJXNdICVzLyV1ICMjIyIsCisJCQkJICAgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksCisJCQkJICAgX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlKSwKKwkJCQkgICBycS0+dV9ycS5zZXEpOworCisJCQlycS0+dV9ycS5kYXRhX3NpemUgPSAwOworCQkJaWYgKGtlcm5lbF9zZW5kKCZycS0+dV9ycSkpCisJCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVzcG9uZCB0byBrZXJuZWwgWyVzXSIsCisJCQkJCSAgUlFfVFlQRShycS0+dV9ycS5yZXF1ZXN0X3R5cGUpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogSWYgYW4gYWN0aW9uIG9yIGEgcmVzcG9uc2UgaXMgcmVxdWlyZWQsIHRoZW4KKwkJCSAqIHRoZSByZXF1ZXN0IG11c3QgYmUgcmVzZW50LgorCQkJICovCisJCQlMT0dfQ09ORChsb2dfcmVzZW5kX3JlcXVlc3RzLAorCQkJCSAiWyVzXSBSZXNlbmRpbmcgJXMoIyV1KSBkdWUgdG8gbmV3IHNlcnZlcigldSkiLAorCQkJCSBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwKKwkJCQkgX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlKSwKKwkJCQkgcnEtPnVfcnEuc2VxLCBlbnRyeS0+bG93ZXN0X2lkKTsKKwkJCUxPR19TUFJJTlQoZW50cnksICIqKiogIFJlc2VuZGluZzogWyVzXSAlcy8ldSAqKioiLAorCQkJCSAgIFNIT1JUX1VVSUQoZW50cnktPm5hbWUudmFsdWUpLAorCQkJCSAgIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkJICAgcnEtPnVfcnEuc2VxKTsKKwkJCXIgPSBjbHVzdGVyX3NlbmQocnEpOworCQkJaWYgKHIgPCAwKQorCQkJCUxPR19FUlJPUigiRmFpbGVkIHJlc2VuZCIpOworCQl9CisJCWZyZWUocnEpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGRvX2NsdXN0ZXJfd29yayh2b2lkICpkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWludCByID0gQ1NfT0s7CisJc3RydWN0IGNsb2dfY3BnICplbnRyeSwgKnRtcDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGVudHJ5LCB0bXAsICZjbG9nX2NwZ19saXN0KSB7CisJCXIgPSBjcGdfZGlzcGF0Y2goZW50cnktPmhhbmRsZSwgQ1NfRElTUEFUQ0hfQUxMKTsKKwkJaWYgKHIgIT0gQ1NfT0spIHsKKwkJCWlmICgociA9PSBDU19FUlJfQkFEX0hBTkRMRSkgJiYKKwkJCSAgICAoKGVudHJ5LT5zdGF0ZSA9PSBJTlZBTElEKSB8fAorCQkJICAgICAoZW50cnktPnN0YXRlID09IExFQVZJTkcpKSkKKwkJCQkvKiBJdCdzIG9rIGlmIHdlJ3ZlIGxlZnQgdGhlIGNsdXN0ZXIgKi8KKwkJCQlyID0gQ1NfT0s7CisJCQllbHNlCisJCQkJTE9HX0VSUk9SKCJjcGdfZGlzcGF0Y2ggZmFpbGVkOiAlcyIsCisJCQkJCSAgc3RyX2Fpc19lcnJvcihyKSk7CisJCX0KKworCQlpZiAoZW50cnktPmZyZWVfbWUpIHsKKwkJCWZyZWUoZW50cnkpOworCQkJY29udGludWU7CisJCX0KKwkJZG9fY2hlY2twb2ludHMoZW50cnksIDApOworCisJCXJlc2VuZF9yZXF1ZXN0cyhlbnRyeSk7CisJfQorCisJcmV0dXJuIChyID09IENTX09LKSA/IDAgOiAtMTsgIC8qIEZJWE1FOiBnb29kIGVycm9yIG51bWJlcj8gKi8KK30KKworc3RhdGljIGludCBmbHVzaF9zdGFydHVwX2xpc3Qoc3RydWN0IGNsb2dfY3BnICplbnRyeSkKK3sKKwlpbnQgciA9IDA7CisJaW50IGlfd2FzX3NlcnZlcjsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSwgKm47CisJc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqbmV3OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbl9zYWZlKHJxLCBuLCAmZW50cnktPnN0YXJ0dXBfbGlzdCwgdS5saXN0KSB7CisJCWRtX2xpc3RfZGVsKCZycS0+dS5saXN0KTsKKworCQlpZiAocnEtPnVfcnEucmVxdWVzdF90eXBlID09IERNX1VMT0dfTUVNQkVSX0pPSU4pIHsKKwkJCW5ldyA9IHByZXBhcmVfY2hlY2twb2ludChlbnRyeSwgcnEtPm9yaWdpbmF0b3IpOworCQkJaWYgKCFuZXcpIHsKKwkJCQkvKgorCQkJCSAqIEZJWE1FOiBOZWVkIGJldHRlciBlcnJvciBoYW5kbGluZy4gIE90aGVyIG5vZGVzCisJCQkJICogd2lsbCBiZSB0cnlpbmcgdG8gc2VuZCB0aGUgY2hlY2twb2ludCB0b28sIGFuZCB3ZQorCQkJCSAqIG11c3QgY29udGludWUgcHJvY2Vzc2luZyB0aGUgbGlzdDsgc28gcmVwb3J0IGVycm9yCisJCQkJICogYnV0IGNvbnRpbnVlLgorCQkJCSAqLworCQkJCUxPR19FUlJPUigiRmFpbGVkIHRvIHByZXBhcmUgY2hlY2twb2ludCBmb3IgJXUhISEiLAorCQkJCQkgIHJxLT5vcmlnaW5hdG9yKTsKKwkJCQlmcmVlKHJxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUxPR19TUFJJTlQoZW50cnksICJbJXNdIENoZWNrcG9pbnQgcHJlcGFyZWQgZm9yICV1IiwKKwkJCQkgICBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgcnEtPm9yaWdpbmF0b3IpOworCQkJTE9HX0NPTkQobG9nX2NoZWNrcG9pbnQsICJbJXNdIENoZWNrcG9pbnQgcHJlcGFyZWQgZm9yICV1IiwKKwkJCQkgU0hPUlRfVVVJRChlbnRyeS0+bmFtZS52YWx1ZSksIHJxLT5vcmlnaW5hdG9yKTsKKwkJCW5ldy0+bmV4dCA9IGVudHJ5LT5jaGVja3BvaW50X2xpc3Q7CisJCQllbnRyeS0+Y2hlY2twb2ludF9saXN0ID0gbmV3OworCQl9IGVsc2UgeworCQkJTE9HX0RCRygiWyVzXSBQcm9jZXNzaW5nIGRlbGF5ZWQgcmVxdWVzdDogJXMiLAorCQkJCVNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksCisJCQkJX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlKSk7CisJCQlpX3dhc19zZXJ2ZXIgPSAocnEtPnBpdF9zZXJ2ZXIgPT0gbXlfY2x1c3Rlcl9pZCkgPyAxIDogMDsKKwkJCXIgPSBoYW5kbGVfY2x1c3Rlcl9yZXF1ZXN0KGVudHJ5LCBycSwgaV93YXNfc2VydmVyKTsKKworCQkJaWYgKHIpCisJCQkJLyoKKwkJCQkgKiBGSVhNRTogSWYgd2UgZXJyb3Igb3V0IGhlcmUsIHdlIHdpbGwgbmV2ZXIgZ2V0CisJCQkJICogYW5vdGhlciBvcHBvcnR1bml0eSB0byByZXRyeSB0aGVzZSByZXF1ZXN0cworCQkJCSAqLworCQkJCUxPR19FUlJPUigiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBkZWxheWVkIENQRyBtZXNzYWdlIik7CisJCX0KKwkJZnJlZShycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwZ19tZXNzYWdlX2NhbGxiYWNrKGNwZ19oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHN0cnVjdCBjcGdfbmFtZSAqZ25hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHVpbnQzMl90IG5vZGVpZCwgdWludDMyX3QgcGlkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSB2b2lkICptc2csIHNpemVfdCBtc2dfbGVuKQoreworCWludCBpOworCWludCByID0gMDsKKwlpbnQgaV9hbV9zZXJ2ZXI7CisJaW50IHJlc3BvbnNlID0gMDsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSA9IG1zZzsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICp0bXBfcnEsICp0bXBfcnEyOworCXN0cnVjdCBjbG9nX2NwZyAqbWF0Y2g7CisKKwltYXRjaCA9IGZpbmRfY2xvZ19jcGcoaGFuZGxlKTsKKwlpZiAoIW1hdGNoKSB7CisJCUxPR19FUlJPUigiVW5hYmxlIHRvIGZpbmQgY2xvZ19jcGcgZm9yIGNsdXN0ZXIgbWVzc2FnZSIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQZXJmb3JtIG5lY2Vzc2FyeSBlbmRpYW4gYW5kIHZlcnNpb24gY29tcGF0aWJpbGl0eSBjb252ZXJzaW9ucworCSAqLworCWlmIChjbG9nX3JlcXVlc3RfZnJvbV9uZXR3b3JrKHJxLCBtc2dfbGVuKSA8IDApCisJCS8qIEFueSBlcnJvciBtZXNzYWdlcyBjb21lIGZyb20gJ2Nsb2dfcmVxdWVzdF9mcm9tX25ldHdvcmsnICovCisJCXJldHVybjsKKworCWlmICgobm9kZWlkID09IG15X2NsdXN0ZXJfaWQpICYmCisJICAgICEocnEtPnVfcnEucmVxdWVzdF90eXBlICYgRE1fVUxPR19SRVNQT05TRSkgJiYKKwkgICAgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSAhPSBETV9VTE9HX1JFU1VNRSkgJiYKKwkgICAgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSAhPSBETV9VTE9HX0NMRUFSX1JFR0lPTikgJiYKKwkgICAgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSAhPSBETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFkpKSB7CisJCXRtcF9ycSA9IG1hbGxvYyhETV9VTE9HX1JFUVVFU1RfU0laRSk7CisJCWlmICghdG1wX3JxKSB7CisJCQkvKgorCQkJICogRklYTUU6IEl0IG1heSBiZSBwb3NzaWJsZSB0byBjb250aW51ZS4uLiBidXQgd2UKKwkJCSAqIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlc2VuZCBhbnkgbWVzc2FnZXMgdGhhdCBtaWdodAorCQkJICogYmUgbmVjZXNzYXJ5IGR1cmluZyBtZW1iZXJzaGlwIGNoYW5nZXMKKwkJCSAqLworCQkJTE9HX0VSUk9SKCJbJXNdIFVuYWJsZSB0byByZWNvcmQgcmVxdWVzdDogLUVOT01FTSIsCisJCQkJICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpKTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1jcHkodG1wX3JxLCBycSwgc2l6ZW9mKCpycSkgKyBycS0+dV9ycS5kYXRhX3NpemUpOworCQlkbV9saXN0X2luaXQoJnRtcF9ycS0+dS5saXN0KTsKKwkJZG1fbGlzdF9hZGQoJm1hdGNoLT53b3JraW5nX2xpc3QsICZ0bXBfcnEtPnUubGlzdCk7CisJfQorCisJaWYgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSA9PSBETV9VTE9HX1BPU1RTVVNQRU5EKSB7CisJCS8qCisJCSAqIElmIHRoZSBzZXJ2ZXIgKGxvd2VzdF9pZCkgaW5kaWNhdGVzIGl0IGlzIGxlYXZpbmcsCisJCSAqIHRoZW4gd2UgbXVzdCByZXNlbmQgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzLiAgSG93ZXZlciwKKwkJICogd2UgZG8gbm90IHdhbnQgdG8gcmVzZW5kIHRoZW0gaWYgdGhlIG5leHQgc2VydmVyIGluCisJCSAqIGxpbmUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgbGVhdmluZy4KKwkJICovCisJCWlmIChub2RlaWQgPT0gbXlfY2x1c3Rlcl9pZCkgeworCQkJTE9HX0NPTkQobG9nX3Jlc2VuZF9yZXF1ZXN0cywgIlslc10gSSBhbSBsZWF2aW5nLjEuLi4uLiIsCisJCQkJIFNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCkpOworCQl9IGVsc2UgeworCQkJaWYgKG5vZGVpZCA8IG15X2NsdXN0ZXJfaWQpIHsKKwkJCQlpZiAobm9kZWlkID09IG1hdGNoLT5sb3dlc3RfaWQpIHsKKwkJCQkJbWF0Y2gtPnJlc2VuZF9yZXF1ZXN0cyA9IDE7CisJCQkJCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsICJbJXNdICV1IGlzIGxlYXZpbmcsIHJlc2VuZCByZXF1aXJlZCVzIiwKKwkJCQkJCSBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLCBub2RlaWQsCisJCQkJCQkgKGRtX2xpc3RfZW1wdHkoJm1hdGNoLT53b3JraW5nX2xpc3QpKSA/ICIgLS0gd29ya2luZ19saXN0IGVtcHR5IjogIiIpOworCisJCQkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4odG1wX3JxLCAmbWF0Y2gtPndvcmtpbmdfbGlzdCwgdS5saXN0KQorCQkJCQkJTE9HX0NPTkQobG9nX3Jlc2VuZF9yZXF1ZXN0cywKKwkJCQkJCQkgIlslc10gICAgICAgICAgICAgICAgJXMvJXUiLAorCQkJCQkJCSBTSE9SVF9VVUlEKHRtcF9ycS0+dV9ycS51dWlkKSwKKwkJCQkJCQkgX1JRX1RZUEUodG1wX3JxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkJCQkJIHRtcF9ycS0+dV9ycS5zZXEpOworCQkJCX0KKworCQkJCW1hdGNoLT5kZWxheSsrOworCQkJCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsICJbJXNdICV1IGlzIGxlYXZpbmcsIGRlbGF5ID0gJWQiLAorCQkJCQkgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgbm9kZWlkLCBtYXRjaC0+ZGVsYXkpOworCQkJfQorCQkJcnEtPm9yaWdpbmF0b3IgPSBub2RlaWQ7IC8qIGRvbid0IHJlYWxseSBuZWVkIHRoaXMsIGJ1dCBuaWNlIGZvciBkZWJ1ZyAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGNhbiByZWNlaXZlIG1lc3NhZ2VzIGFmdGVyIHdlIGRvIGEgY3BnX2xlYXZlIGJ1dCBiZWZvcmUgd2UKKwkgKiBnZXQgb3VyIGNvbmZpZyBjYWxsYmFjay4gIEhvd2V2ZXIsIHNpbmNlIHdlIGNhbid0IHJlc3BvbmQgYWZ0ZXIKKwkgKiBsZWF2aW5nLCB3ZSBzaW1wbHkgcmV0dXJuLgorCSAqLworCWlmIChtYXRjaC0+c3RhdGUgPT0gTEVBVklORykKKwkJcmV0dXJuOworCisJaV9hbV9zZXJ2ZXIgPSAobXlfY2x1c3Rlcl9pZCA9PSBtYXRjaC0+bG93ZXN0X2lkKSA/IDEgOiAwOworCisJaWYgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSA9PSBETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFkpIHsKKwkJaWYgKG15X2NsdXN0ZXJfaWQgPT0gcnEtPm9yaWdpbmF0b3IpIHsKKwkJCS8qIFJlZHVuZGFudCBjaGVja3BvaW50cyBpZ25vcmVkIGlmIG1hdGNoLT52YWxpZCAqLworCQkJTE9HX1NQUklOVChtYXRjaCwgIlslc10gQ0hFQ0tQT0lOVF9SRUFEWSBub3RpZmljYXRpb24gZnJvbSAldSIsCisJCQkJICAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgbm9kZWlkKTsKKwkJCWlmIChpbXBvcnRfY2hlY2twb2ludChtYXRjaCwKKwkJCQkJICAgICAgKG1hdGNoLT5zdGF0ZSAhPSBJTlZBTElEKSwgcnEpKSB7CisJCQkJTE9HX1NQUklOVChtYXRjaCwKKwkJCQkJICAgIlslc10gRmFpbGVkIHRvIGltcG9ydCBjaGVja3BvaW50IGZyb20gJXUiLAorCQkJCQkgICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLCBub2RlaWQpOworCQkJCUxPR19FUlJPUigiWyVzXSBGYWlsZWQgdG8gaW1wb3J0IGNoZWNrcG9pbnQgZnJvbSAldSIsCisJCQkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgbm9kZWlkKTsKKwkJCQlraWxsKGdldHBpZCgpLCBTSUdVU1IxKTsKKwkJCQkvKiBDb3VsZCB3ZSByZXRyeT8gKi8KKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSBpZiAobWF0Y2gtPnN0YXRlID09IElOVkFMSUQpIHsKKwkJCQlMT0dfU1BSSU5UKG1hdGNoLAorCQkJCQkgICAiWyVzXSBDaGVja3BvaW50IGRhdGEgcmVjZWl2ZWQgZnJvbSAldS4gIExvZyBpcyBub3cgdmFsaWQiLAorCQkJCQkgICBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSwgbm9kZWlkKTsKKwkJCQlMT0dfQ09ORChsb2dfY2hlY2twb2ludCwKKwkJCQkJICJbJXNdIENoZWNrcG9pbnQgZGF0YSByZWNlaXZlZCBmcm9tICV1LiAgTG9nIGlzIG5vdyB2YWxpZCIsCisJCQkJCSBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSwgbm9kZWlkKTsKKwkJCQltYXRjaC0+c3RhdGUgPSBWQUxJRDsKKworCQkJCWZsdXNoX3N0YXJ0dXBfbGlzdChtYXRjaCk7CisJCQl9IGVsc2UgeworCQkJCUxPR19TUFJJTlQobWF0Y2gsCisJCQkJCSAgICJbJXNdIFJlZHVuZGFudCBjaGVja3BvaW50IGZyb20gJXUgaWdub3JlZC4iLAorCQkJCQkgICBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLCBub2RlaWQpOworCQkJfQorCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmIChycS0+dV9ycS5yZXF1ZXN0X3R5cGUgJiBETV9VTE9HX1JFU1BPTlNFKSB7CisJCXJlc3BvbnNlID0gMTsKKwkJciA9IGhhbmRsZV9jbHVzdGVyX3Jlc3BvbnNlKG1hdGNoLCBycSk7CisJfSBlbHNlIHsKKwkJcnEtPm9yaWdpbmF0b3IgPSBub2RlaWQ7CisKKwkJaWYgKG1hdGNoLT5zdGF0ZSA9PSBMRUFWSU5HKSB7CisJCQlMT0dfRVJST1IoIlslc10gIElnbm9yaW5nICVzIGZyb20gJXUuICBSZWFzb246IEknbSBsZWF2aW5nIiwKKwkJCQkgIFNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkJICBycS0+b3JpZ2luYXRvcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtYXRjaC0+c3RhdGUgPT0gSU5WQUxJRCkgeworCQkJTE9HX0RCRygiTG9nIG5vdCB2YWxpZCB5ZXQsIHN0b3JpbmcgcmVxdWVzdCIpOworCQkJaWYgKCEodG1wX3JxMiA9IG1hbGxvYyhETV9VTE9HX1JFUVVFU1RfU0laRSkpKSB7CisJCQkJTE9HX0VSUk9SKCJjcGdfbWVzc2FnZV9jYWxsYmFjazogIFVuYWJsZSB0byIKKwkJCQkJICAiIGFsbG9jYXRlIHRyYW5zZmVyIHN0cnVjdHMiKTsKKwkJCQlyID0gLUVOT01FTTsgLyogRklYTUU6IEJldHRlciBlcnJvciAjPyAqLworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQltZW1jcHkodG1wX3JxMiwgcnEsIHNpemVvZigqcnEpICsgcnEtPnVfcnEuZGF0YV9zaXplKTsKKwkJCXRtcF9ycTItPnBpdF9zZXJ2ZXIgPSBtYXRjaC0+bG93ZXN0X2lkOworCQkJZG1fbGlzdF9pbml0KCZ0bXBfcnEyLT51Lmxpc3QpOworCQkJZG1fbGlzdF9hZGQoJm1hdGNoLT5zdGFydHVwX2xpc3QsICZ0bXBfcnEyLT51Lmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyID0gaGFuZGxlX2NsdXN0ZXJfcmVxdWVzdChtYXRjaCwgcnEsIGlfYW1fc2VydmVyKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBsb2cgaXMgbm93IHZhbGlkLCB3ZSBjYW4gcXVldWUgdGhlIGNoZWNrcG9pbnRzCisJICovCisJZm9yIChpID0gbWF0Y2gtPmNoZWNrcG9pbnRzX25lZWRlZDsgaTsgKSB7CisJCXN0cnVjdCBjaGVja3BvaW50X2RhdGEgKm5ldzsKKworCQlpZiAobG9nX2dldF9zdGF0ZSgmcnEtPnVfcnEpICE9IExPR19SRVNVTUVEKSB7CisJCQlMT0dfREJHKCJbJXNdIFdpdGhob2xkaW5nIGNoZWNrcG9pbnRzIHVudGlsIGxvZyBpcyB2YWxpZCAoJXMgZnJvbSAldSkiLAorCQkJCVNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksIG5vZGVpZCk7CisJCQlicmVhazsKKwkJfQorCisJCWktLTsKKwkJbmV3ID0gcHJlcGFyZV9jaGVja3BvaW50KG1hdGNoLCBtYXRjaC0+Y2hlY2twb2ludF9yZXF1ZXN0ZXJzW2ldKTsKKwkJaWYgKCFuZXcpIHsKKwkJCS8qIEZJWE1FOiBOZWVkIGJldHRlciBlcnJvciBoYW5kbGluZyAqLworCQkJTE9HX0VSUk9SKCJbJXNdIEZhaWxlZCB0byBwcmVwYXJlIGNoZWNrcG9pbnQgZm9yICV1ISEhIiwKKwkJCQkgIFNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksIG1hdGNoLT5jaGVja3BvaW50X3JlcXVlc3RlcnNbaV0pOworCQkJYnJlYWs7CisJCX0KKwkJTE9HX1NQUklOVChtYXRjaCwgIlslc10gQ2hlY2twb2ludCBwcmVwYXJlZCBmb3IgJXUqICglcykiLAorCQkJICAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgbWF0Y2gtPmNoZWNrcG9pbnRfcmVxdWVzdGVyc1tpXSwKKwkJCSAgIChsb2dfZ2V0X3N0YXRlKCZycS0+dV9ycSkgIT0gTE9HX1JFU1VNRUQpPyAiTE9HX1JFU1VNRUQiOiAiTE9HX1NVU1BFTkRFRCIpOworCQlMT0dfQ09ORChsb2dfY2hlY2twb2ludCwgIlslc10gQ2hlY2twb2ludCBwcmVwYXJlZCBmb3IgJXUqIiwKKwkJCSBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLCBtYXRjaC0+Y2hlY2twb2ludF9yZXF1ZXN0ZXJzW2ldKTsKKwkJbWF0Y2gtPmNoZWNrcG9pbnRzX25lZWRlZC0tOworCisJCW5ldy0+bmV4dCA9IG1hdGNoLT5jaGVja3BvaW50X2xpc3Q7CisJCW1hdGNoLT5jaGVja3BvaW50X2xpc3QgPSBuZXc7CisJfQorCitvdXQ6CisJLyogbm90aGluZyBoYXBwZW5zIGFmdGVyIHRoaXMgcG9pbnQuICBJdCBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgKi8KKwlpZiAocikgeworCQlMT0dfRVJST1IoIlslc10gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBDUEcgbWVzc2FnZSwgJXM6ICVzIiwKKwkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwKKwkJCSAgX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlICYgfkRNX1VMT0dfUkVTUE9OU0UpLAorCQkJICBzdHJlcnJvcigtcikpOworCQlMT0dfRVJST1IoIlslc10gICAgUmVzcG9uc2UgIDogJXMiLCBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLAorCQkJICAocmVzcG9uc2UpID8gIllFUyIgOiAiTk8iKTsKKwkJTE9HX0VSUk9SKCJbJXNdICAgIE9yaWdpbmF0b3I6ICV1IiwKKwkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgcnEtPm9yaWdpbmF0b3IpOworCQlpZiAocmVzcG9uc2UpCisJCQlMT0dfRVJST1IoIlslc10gICAgUmVzcG9uZGVyIDogJXUiLAorCQkJCSAgU0hPUlRfVVVJRChycS0+dV9ycS51dWlkKSwgbm9kZWlkKTsKKworCQlMT0dfRVJST1IoIkhJU1RPUlk6OiIpOworCQlmb3IgKGkgPSAwOyBpIDwgREVCVUdHSU5HX0hJU1RPUlk7IGkrKykgeworCQkJbWF0Y2gtPmlkeCsrOworCQkJbWF0Y2gtPmlkeCA9IG1hdGNoLT5pZHggJSBERUJVR0dJTkdfSElTVE9SWTsKKwkJCWlmIChtYXRjaC0+ZGVidWdnaW5nW21hdGNoLT5pZHhdWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisJCQlMT0dfRVJST1IoIiVkOiVkKSAlcyIsIGksIG1hdGNoLT5pZHgsCisJCQkJICBtYXRjaC0+ZGVidWdnaW5nW21hdGNoLT5pZHhdKTsKKwkJfQorCX0gZWxzZSBpZiAoIShycS0+dV9ycS5yZXF1ZXN0X3R5cGUgJiBETV9VTE9HX1JFU1BPTlNFKSB8fAorCQkgICAocnEtPm9yaWdpbmF0b3IgPT0gbXlfY2x1c3Rlcl9pZCkpIHsKKwkJaWYgKCFyZXNwb25zZSkKKwkJCUxPR19TUFJJTlQobWF0Y2gsICJTRVEjPSV1LCBVVUlEPSVzLCBUWVBFPSVzLCBPUklHPSV1LCBSRVNQPSVzIiwKKwkJCQkgICBycS0+dV9ycS5zZXEsIFNIT1JUX1VVSUQocnEtPnVfcnEudXVpZCksCisJCQkJICAgX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlKSwKKwkJCQkgICBycS0+b3JpZ2luYXRvciwgKHJlc3BvbnNlKSA/ICJZRVMiIDogIk5PIik7CisJCWVsc2UKKwkJCUxPR19TUFJJTlQobWF0Y2gsICJTRVEjPSV1LCBVVUlEPSVzLCBUWVBFPSVzLCBPUklHPSV1LCBSRVNQPSVzLCBSU1BSPSV1LCBlcnJvcj0lZCIsCisJCQkJICAgcnEtPnVfcnEuc2VxLCBTSE9SVF9VVUlEKHJxLT51X3JxLnV1aWQpLAorCQkJCSAgIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkJICAgcnEtPm9yaWdpbmF0b3IsIChyZXNwb25zZSkgPyAiWUVTIiA6ICJOTyIsCisJCQkJICAgbm9kZWlkLCBycS0+dV9ycS5lcnJvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcGdfam9pbl9jYWxsYmFjayhzdHJ1Y3QgY2xvZ19jcGcgKm1hdGNoLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpqb2luZWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgY3BnX2FkZHJlc3MgKm1lbWJlcl9saXN0LAorCQkJICAgICAgc2l6ZV90IG1lbWJlcl9saXN0X2VudHJpZXMpCit7CisJdW5zaWduZWQgaTsKKwl1aW50MzJfdCBteV9waWQgPSAodWludDMyX3QpZ2V0cGlkKCk7CisJdWludDMyX3QgbG93ZXN0ID0gbWF0Y2gtPmxvd2VzdF9pZDsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycTsKKwljaGFyIGRidWZbNjRdID0geyAwIH07CisJY2hhciAqZGJ1Zl9wID0gZGJ1ZjsKKwlzaXplX3QgZGJ1Zl9yZW0gPSBzaXplb2YgZGJ1ZjsKKworCS8qIEFzc2lnbiBteV9jbHVzdGVyX2lkICovCisJaWYgKChteV9jbHVzdGVyX2lkID09IDB4REVBRCkgJiYgKGpvaW5lZC0+cGlkID09IG15X3BpZCkpCisJCW15X2NsdXN0ZXJfaWQgPSBqb2luZWQtPm5vZGVpZDsKKworCS8qIEFtIEkgdGhlIHZlcnkgZmlyc3QgdG8gam9pbj8gKi8KKwlpZiAobWVtYmVyX2xpc3RfZW50cmllcyA9PSAxKSB7CisJCW1hdGNoLT5sb3dlc3RfaWQgPSBqb2luZWQtPm5vZGVpZDsKKwkJbWF0Y2gtPnN0YXRlID0gVkFMSUQ7CisJfQorCisJLyogSWYgSSBhbSBwYXJ0IG9mIHRoZSBqb2luaW5nIGxpc3QsIEkgZG8gbm90IHNlbmQgY2hlY2twb2ludHMgKi8KKwlpZiAoam9pbmVkLT5ub2RlaWQgPT0gbXlfY2x1c3Rlcl9pZCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtYmVyX2xpc3RfZW50cmllcyAtIDE7IGkrKykgeworCQlpbnQgd3JpdHRlbiA9IHNucHJpbnRmKGRidWZfcCwgZGJ1Zl9yZW0sICIldS0iLCBtZW1iZXJfbGlzdFtpXS5ub2RlaWQpOworCQlpZiAod3JpdHRlbiA8IDApIGNvbnRpbnVlOyAvKiBpbXBvc3NpYmxlICovCisJCWlmICgodW5zaWduZWQpd3JpdHRlbiA+PSBkYnVmX3JlbSkgeworCQkJZGJ1Zl9yZW0gPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZGJ1Zl9yZW0gLT0gd3JpdHRlbjsKKwkJZGJ1Zl9wICs9IHdyaXR0ZW47CisJfQorCXNucHJpbnRmKGRidWZfcCwgZGJ1Zl9yZW0sICIoJXUpIiwgam9pbmVkLT5ub2RlaWQpOworCUxPR19DT05EKGxvZ19jaGVja3BvaW50LCAiWyVzXSBKb2luaW5nIG5vZGUsICV1IG5lZWRzIGNoZWNrcG9pbnQgWyVzXSIsCisJCSBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSwgam9pbmVkLT5ub2RlaWQsIGRidWYpOworCisJLyoKKwkgKiBGSVhNRTogcmVtb3ZlIGNoZWNrcG9pbnRfcmVxdWVzdGVycy9jaGVja3BvaW50c19uZWVkZWQsIGFuZCB1c2UKKwkgKiB0aGUgc3RhcnR1cF9saXN0IGludGVyZmFjZSBleGNsdXNpdmVseQorCSAqLworCWlmIChkbV9saXN0X2VtcHR5KCZtYXRjaC0+c3RhcnR1cF9saXN0KSAmJiAobWF0Y2gtPnN0YXRlID09IFZBTElEKSAmJgorCSAgICAobWF0Y2gtPmNoZWNrcG9pbnRzX25lZWRlZCA8IE1BWF9DSEVDS1BPSU5UX1JFUVVFU1RFUlMpKSB7CisJCW1hdGNoLT5jaGVja3BvaW50X3JlcXVlc3RlcnNbbWF0Y2gtPmNoZWNrcG9pbnRzX25lZWRlZCsrXSA9IGpvaW5lZC0+bm9kZWlkOworCQlnb3RvIG91dDsKKwl9CisKKwlycSA9IG1hbGxvYyhETV9VTE9HX1JFUVVFU1RfU0laRSk7CisJaWYgKCFycSkgeworCQlMT0dfRVJST1IoImNwZ19jb25maWdfY2FsbGJhY2s6ICIKKwkJCSAgIlVuYWJsZSB0byBhbGxvY2F0ZSB0cmFuc2ZlciBzdHJ1Y3RzIik7CisJCUxPR19FUlJPUigiY3BnX2NvbmZpZ19jYWxsYmFjazogIgorCQkJICAiVW5hYmxlIHRvIHBlcmZvcm0gY2hlY2twb2ludCIpOworCQlnb3RvIG91dDsKKwl9CisJcnEtPnVfcnEucmVxdWVzdF90eXBlID0gRE1fVUxPR19NRU1CRVJfSk9JTjsKKwlycS0+b3JpZ2luYXRvciA9IGpvaW5lZC0+bm9kZWlkOworCWRtX2xpc3RfaW5pdCgmcnEtPnUubGlzdCk7CisJZG1fbGlzdF9hZGQoJm1hdGNoLT5zdGFydHVwX2xpc3QsICZycS0+dS5saXN0KTsKKworb3V0OgorCS8qIEZpbmQgdGhlIGxvd2VzdF9pZCwgaS5lLiB0aGUgc2VydmVyICovCisJbWF0Y2gtPmxvd2VzdF9pZCA9IG1lbWJlcl9saXN0WzBdLm5vZGVpZDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtYmVyX2xpc3RfZW50cmllczsgaSsrKQorCQlpZiAobWF0Y2gtPmxvd2VzdF9pZCA+IG1lbWJlcl9saXN0W2ldLm5vZGVpZCkKKwkJCW1hdGNoLT5sb3dlc3RfaWQgPSBtZW1iZXJfbGlzdFtpXS5ub2RlaWQ7CisKKwlpZiAobG93ZXN0ID09IDB4REVBRCkKKwkJTE9HX0NPTkQobG9nX21lbWJlcnNoaXBfY2hhbmdlLCAiWyVzXSAgU2VydmVyIGNoYW5nZSA8bm9uZT4gLT4gJXUgKCV1ICVzKSIsCisJCQkgU0hPUlRfVVVJRChtYXRjaC0+bmFtZS52YWx1ZSksIG1hdGNoLT5sb3dlc3RfaWQsCisJCQkgam9pbmVkLT5ub2RlaWQsIChtZW1iZXJfbGlzdF9lbnRyaWVzID09IDEpID8KKwkJCSAiaXMgZmlyc3QgdG8gam9pbiIgOiAiam9pbmVkIik7CisJZWxzZSBpZiAobG93ZXN0ICE9IG1hdGNoLT5sb3dlc3RfaWQpCisJCUxPR19DT05EKGxvZ19tZW1iZXJzaGlwX2NoYW5nZSwgIlslc10gIFNlcnZlciBjaGFuZ2UgJXUgLT4gJXUgKCV1IGpvaW5lZCkiLAorCQkJIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsb3dlc3QsCisJCQkgbWF0Y2gtPmxvd2VzdF9pZCwgam9pbmVkLT5ub2RlaWQpOworCWVsc2UKKwkJTE9HX0NPTkQobG9nX21lbWJlcnNoaXBfY2hhbmdlLCAiWyVzXSAgU2VydmVyIHVuY2hhbmdlZCBhdCAldSAoJXUgam9pbmVkKSIsCisJCQkgU0hPUlRfVVVJRChtYXRjaC0+bmFtZS52YWx1ZSksCisJCQkgbG93ZXN0LCBqb2luZWQtPm5vZGVpZCk7CisJTE9HX1NQUklOVChtYXRjaCwgIisrKyAgVVVJRD0lcyAgJXUgam9pbiAgKysrIiwKKwkJICAgU0hPUlRfVVVJRChtYXRjaC0+bmFtZS52YWx1ZSksIGpvaW5lZC0+bm9kZWlkKTsKK30KKworc3RhdGljIHZvaWQgY3BnX2xlYXZlX2NhbGxiYWNrKHN0cnVjdCBjbG9nX2NwZyAqbWF0Y2gsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpsZWZ0LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbWVtYmVyX2xpc3QsCisJCQkgICAgICAgc2l6ZV90IG1lbWJlcl9saXN0X2VudHJpZXMpCit7CisJdW5zaWduZWQgaTsKKwlpbnQgaiwgZmQ7CisJdWludDMyX3QgbG93ZXN0ID0gbWF0Y2gtPmxvd2VzdF9pZDsKKwlzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSwgKm47CisJc3RydWN0IGNoZWNrcG9pbnRfZGF0YSAqcF9jcCwgKmNfY3A7CisKKwlMT0dfU1BSSU5UKG1hdGNoLCAiLS0tICBVVUlEPSVzICAldSBsZWZ0ICAtLS0iLAorCQkgICBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSwgbGVmdC0+bm9kZWlkKTsKKworCS8qIEFtIEkgbGVhdmluZz8gKi8KKwlpZiAobXlfY2x1c3Rlcl9pZCA9PSBsZWZ0LT5ub2RlaWQpIHsKKwkJTE9HX0RCRygiRmluYWxpemluZyBsZWF2ZS4uLiIpOworCQlkbV9saXN0X2RlbCgmbWF0Y2gtPmxpc3QpOworCisJCWNwZ19mZF9nZXQobWF0Y2gtPmhhbmRsZSwgJmZkKTsKKwkJbGlua3NfdW5yZWdpc3RlcihmZCk7CisKKwkJY2x1c3Rlcl9wb3N0c3VzcGVuZChtYXRjaC0+bmFtZS52YWx1ZSwgbWF0Y2gtPmx1aWQpOworCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW5fc2FmZShycSwgbiwgJm1hdGNoLT53b3JraW5nX2xpc3QsIHUubGlzdCkgeworCQkJZG1fbGlzdF9kZWwoJnJxLT51Lmxpc3QpOworCisJCQlpZiAocnEtPnVfcnEucmVxdWVzdF90eXBlID09IERNX1VMT0dfUE9TVFNVU1BFTkQpCisJCQkJaWYgKGtlcm5lbF9zZW5kKCZycS0+dV9ycSkpCisJCQkJCUxPR19FUlJPUigiRmFpbGVkIHRvIHJlc3BvbmQgdG8ga2VybmVsIFslc10iLAorCQkJCQkJICBSUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSkpOworCQkJZnJlZShycSk7CisJCX0KKworCQljcGdfZmluYWxpemUobWF0Y2gtPmhhbmRsZSk7CisKKwkJbWF0Y2gtPmZyZWVfbWUgPSAxOworCQltYXRjaC0+bG93ZXN0X2lkID0gMHhERUFEOworCQltYXRjaC0+c3RhdGUgPSBJTlZBTElEOworCX0KKworCS8qIFJlbW92ZSBhbnkgcGVuZGluZyBjaGVja3BvaW50cyBmb3IgdGhlIGxlYXZpbmcgbm9kZS4gKi8KKwlmb3IgKHBfY3AgPSBOVUxMLCBjX2NwID0gbWF0Y2gtPmNoZWNrcG9pbnRfbGlzdDsKKwkgICAgIGNfY3AgJiYgKGNfY3AtPnJlcXVlc3RlciAhPSBsZWZ0LT5ub2RlaWQpOworCSAgICAgcF9jcCA9IGNfY3AsIGNfY3AgPSBjX2NwLT5uZXh0KTsKKwlpZiAoY19jcCkgeworCQlpZiAocF9jcCkKKwkJCXBfY3AtPm5leHQgPSBjX2NwLT5uZXh0OworCQllbHNlCisJCQltYXRjaC0+Y2hlY2twb2ludF9saXN0ID0gY19jcC0+bmV4dDsKKworCQlMT0dfQ09ORChsb2dfY2hlY2twb2ludCwKKwkJCSAiWyVzXSBSZW1vdmluZyBwZW5kaW5nIGNoZWNrcG9pbnQgKCV1IGlzIGxlYXZpbmcpIiwKKwkJCSBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSwgbGVmdC0+bm9kZWlkKTsKKwkJZnJlZV9jaGVja3BvaW50KGNfY3ApOworCX0KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfZ2VuX3NhZmUocnEsIG4sICZtYXRjaC0+c3RhcnR1cF9saXN0LCB1Lmxpc3QpIHsKKwkJaWYgKChycS0+dV9ycS5yZXF1ZXN0X3R5cGUgPT0gRE1fVUxPR19NRU1CRVJfSk9JTikgJiYKKwkJICAgIChycS0+b3JpZ2luYXRvciA9PSBsZWZ0LT5ub2RlaWQpKSB7CisJCQlMT0dfQ09ORChsb2dfY2hlY2twb2ludCwKKwkJCQkgIlslc10gUmVtb3ZpbmcgcGVuZGluZyBja3B0IGZyb20gc3RhcnR1cCBsaXN0ICgldSBpcyBsZWF2aW5nKSIsCisJCQkJIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsZWZ0LT5ub2RlaWQpOworCQkJZG1fbGlzdF9kZWwoJnJxLT51Lmxpc3QpOworCQkJZnJlZShycSk7CisJCX0KKwl9CisJZm9yIChpID0gMCwgaiA9IDA7IChpbnQpIGkgPCBtYXRjaC0+Y2hlY2twb2ludHNfbmVlZGVkOyBpKyssIGorKykgeworCQltYXRjaC0+Y2hlY2twb2ludF9yZXF1ZXN0ZXJzW2pdID0gbWF0Y2gtPmNoZWNrcG9pbnRfcmVxdWVzdGVyc1tpXTsKKwkJaWYgKG1hdGNoLT5jaGVja3BvaW50X3JlcXVlc3RlcnNbaV0gPT0gbGVmdC0+bm9kZWlkKSB7CisJCQlMT0dfRVJST1IoIlslc10gUmVtb3ZpbmcgcGVuZGluZyBja3B0IGZyb20gbmVlZGVkIGxpc3QgKCV1IGlzIGxlYXZpbmcpIiwKKwkJCQkgIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsZWZ0LT5ub2RlaWQpOworCQkJai0tOworCQl9CisJfQorCW1hdGNoLT5jaGVja3BvaW50c19uZWVkZWQgPSBqOworCisJaWYgKGxlZnQtPm5vZGVpZCA8IG15X2NsdXN0ZXJfaWQpIHsKKwkJbWF0Y2gtPmRlbGF5ID0gKG1hdGNoLT5kZWxheSA+IDApID8gbWF0Y2gtPmRlbGF5IC0gMSA6IDA7CisJCWlmICghbWF0Y2gtPmRlbGF5ICYmIGRtX2xpc3RfZW1wdHkoJm1hdGNoLT53b3JraW5nX2xpc3QpKQorCQkJbWF0Y2gtPnJlc2VuZF9yZXF1ZXN0cyA9IDA7CisJCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsICJbJXNdICV1IGhhcyBsZWZ0LCBkZWxheSA9ICVkJXMiLAorCQkJIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsZWZ0LT5ub2RlaWQsCisJCQkgbWF0Y2gtPmRlbGF5LCAoZG1fbGlzdF9lbXB0eSgmbWF0Y2gtPndvcmtpbmdfbGlzdCkpID8KKwkJCSAiIC0tIHdvcmtpbmdfbGlzdCBlbXB0eSI6ICIiKTsKKwl9CisKKwkvKiBGaW5kIHRoZSBsb3dlc3RfaWQsIGkuZS4gdGhlIHNlcnZlciAqLworCWlmICghbWVtYmVyX2xpc3RfZW50cmllcykgeworCQltYXRjaC0+bG93ZXN0X2lkID0gMHhERUFEOworCQlMT0dfQ09ORChsb2dfbWVtYmVyc2hpcF9jaGFuZ2UsICJbJXNdICBTZXJ2ZXIgY2hhbmdlICV1IC0+IDxub25lPiAiCisJCQkgIigldSBpcyBsYXN0IHRvIGxlYXZlKSIsCisJCQkgU0hPUlRfVVVJRChtYXRjaC0+bmFtZS52YWx1ZSksIGxlZnQtPm5vZGVpZCwKKwkJCSBsZWZ0LT5ub2RlaWQpOworCQlyZXR1cm47CisJfQorCisJbWF0Y2gtPmxvd2VzdF9pZCA9IG1lbWJlcl9saXN0WzBdLm5vZGVpZDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtYmVyX2xpc3RfZW50cmllczsgaSsrKQorCQlpZiAobWF0Y2gtPmxvd2VzdF9pZCA+IG1lbWJlcl9saXN0W2ldLm5vZGVpZCkKKwkJCW1hdGNoLT5sb3dlc3RfaWQgPSBtZW1iZXJfbGlzdFtpXS5ub2RlaWQ7CisKKwlpZiAobG93ZXN0ICE9IG1hdGNoLT5sb3dlc3RfaWQpIHsKKwkJTE9HX0NPTkQobG9nX21lbWJlcnNoaXBfY2hhbmdlLCAiWyVzXSAgU2VydmVyIGNoYW5nZSAldSAtPiAldSAoJXUgbGVmdCkiLAorCQkJIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsb3dlc3QsCisJCQkgbWF0Y2gtPmxvd2VzdF9pZCwgbGVmdC0+bm9kZWlkKTsKKwl9IGVsc2UKKwkJTE9HX0NPTkQobG9nX21lbWJlcnNoaXBfY2hhbmdlLCAiWyVzXSAgU2VydmVyIHVuY2hhbmdlZCBhdCAldSAoJXUgbGVmdCkiLAorCQkJIFNIT1JUX1VVSUQobWF0Y2gtPm5hbWUudmFsdWUpLCBsb3dlc3QsIGxlZnQtPm5vZGVpZCk7CisKKwlpZiAoKG1hdGNoLT5zdGF0ZSA9PSBJTlZBTElEKSAmJiAhbWF0Y2gtPmZyZWVfbWUpIHsKKwkJLyoKKwkJICogSWYgYWxsIENQRyBtZW1iZXJzIGFyZSB3YWl0aW5nIGZvciBjaGVja3BvaW50cyBhbmQgdGhleQorCQkgKiBhcmUgYWxsIHByZXNlbnQgaW4gbXkgc3RhcnR1cF9saXN0LCB0aGVuIEkgd2FzIHRoZSBmaXJzdCB0bworCQkgKiBqb2luIGFuZCBJIG11c3QgYXNzdW1lIGNvbnRyb2wuCisJCSAqCisJCSAqIFdlIGRvIG5vdCBub3JtYWxseSBlbmQgdXAgaGVyZSwgYnV0IGlmIHRoZXJlIHdhcyBhIHF1aWNrCisJCSAqICdyZXN1bWUgLT4gc3VzcGVuZCAtPiByZXN1bWUnIGFjcm9zcyB0aGUgY2x1c3Rlciwgd2UgbWF5CisJCSAqIGhhdmUgaW5pdGlhbGx5IHRob3VnaHQgd2Ugd2VyZSBub3QgdGhlIGZpcnN0IHRvIGpvaW4gYmVjYXVzZQorCQkgKiBvZiB0aGUgcHJlc2VuY2Ugb2Ygb3V0LWdvaW5nIChhbmQgdW5hYmxlIHRvIHJlc3BvbmQpIG1lbWJlcnMuCisJCSAqLworCisJCWkgPSAxOyAvKiBXZSBkbyBub3QgaGF2ZSBhIERNX1VMT0dfTUVNQkVSX0pPSU4gZW50cnkgb2Ygb3VyIG93biAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfZ2VuKHJxLCAmbWF0Y2gtPnN0YXJ0dXBfbGlzdCwgdS5saXN0KQorCQkJaWYgKHJxLT51X3JxLnJlcXVlc3RfdHlwZSA9PSBETV9VTE9HX01FTUJFUl9KT0lOKQorCQkJCWkrKzsKKworCQlpZiAoaSA9PSBtZW1iZXJfbGlzdF9lbnRyaWVzKSB7CisJCQkvKiAKKwkJCSAqIExhc3Qgbm9kZSB3aG8gY291bGQgaGF2ZSBnaXZlbiBtZSBhIGNoZWNrcG9pbnQganVzdCBsZWZ0LgorCQkJICogU2V0dGluZyBsb2cgc3RhdGUgdG8gVkFMSUQgYW5kIGFjdGluZyBhcyAnZmlyc3Qgam9pbicuCisJCQkgKi8KKwkJCW1hdGNoLT5zdGF0ZSA9IFZBTElEOworCQkJZmx1c2hfc3RhcnR1cF9saXN0KG1hdGNoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY3BnX2NvbmZpZ19jYWxsYmFjayhjcGdfaGFuZGxlX3QgaGFuZGxlLCBjb25zdCBzdHJ1Y3QgY3BnX25hbWUgKmduYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCWNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqbWVtYmVyX2xpc3QsCisJCQkJc2l6ZV90IG1lbWJlcl9saXN0X2VudHJpZXMsCisJCQkJY29uc3Qgc3RydWN0IGNwZ19hZGRyZXNzICpsZWZ0X2xpc3QsCisJCQkJc2l6ZV90IGxlZnRfbGlzdF9lbnRyaWVzLAorCQkJCWNvbnN0IHN0cnVjdCBjcGdfYWRkcmVzcyAqam9pbmVkX2xpc3QsCisJCQkJc2l6ZV90IGpvaW5lZF9saXN0X2VudHJpZXMpCit7CisJc3RydWN0IGNsb2dfY3BnICptYXRjaDsKKwlpbnQgZm91bmQgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1hdGNoLCAmY2xvZ19jcGdfbGlzdCkKKwkJaWYgKG1hdGNoLT5oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJaWYgKCFmb3VuZCkgeworCQlMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIG1hdGNoIGZvciBDUEcgY29uZmlnIGNhbGxiYWNrIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGpvaW5lZF9saXN0X2VudHJpZXMgKyBsZWZ0X2xpc3RfZW50cmllcykgPiAxKQorCQlMT0dfRVJST1IoIlslc10gIE1vcmUgdGhhbiBvbmUgbm9kZSBqb2luaW5nL2xlYXZpbmciLAorCQkJICBTSE9SVF9VVUlEKG1hdGNoLT5uYW1lLnZhbHVlKSk7CisKKwlpZiAoam9pbmVkX2xpc3RfZW50cmllcykKKwkJY3BnX2pvaW5fY2FsbGJhY2sobWF0Y2gsIGpvaW5lZF9saXN0LAorCQkJCSAgbWVtYmVyX2xpc3QsIG1lbWJlcl9saXN0X2VudHJpZXMpOworCWVsc2UKKwkJY3BnX2xlYXZlX2NhbGxiYWNrKG1hdGNoLCBsZWZ0X2xpc3QsCisJCQkJICAgbWVtYmVyX2xpc3QsIG1lbWJlcl9saXN0X2VudHJpZXMpOworfQorCitjcGdfY2FsbGJhY2tzX3QgY3BnX2NhbGxiYWNrcyA9IHsKKwkuY3BnX2RlbGl2ZXJfZm4gPSBjcGdfbWVzc2FnZV9jYWxsYmFjaywKKwkuY3BnX2NvbmZjaGdfZm4gPSBjcGdfY29uZmlnX2NhbGxiYWNrLAorfTsKKworLyoKKyAqIHJlbW92ZV9jaGVja3BvaW50CisgKiBAZW50cnkKKyAqCisgKiBSZXR1cm5zOiAxIGlmIGNoZWNrcG9pbnQgcmVtb3ZlZCwgMCBpZiBubyBjaGVja3BvaW50cywgLUVYWFggb24gZXJyb3IKKyAqLworc3RhdGljIGludCByZW1vdmVfY2hlY2twb2ludChzdHJ1Y3QgY2xvZ19jcGcgKmVudHJ5KQoreworI2lmIENNSVJST1JfSEFTX0NIRUNLUE9JTlQKKwlpbnQgbGVuOworCVNhTmFtZVQgbmFtZTsKKwlTYUFpc0Vycm9yVCBydjsKKwlTYUNrcHRDaGVja3BvaW50SGFuZGxlVCBoOworCisJbGVuID0gc25wcmludGYoKGNoYXIgKikobmFtZS52YWx1ZSksIFNBX01BWF9OQU1FX0xFTkdUSCwgImJpdG1hcHNfJXNfJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSwgbXlfY2x1c3Rlcl9pZCk7CisJbmFtZS5sZW5ndGggPSBsZW47CisKK29wZW5fcmV0cnk6CisJcnYgPSBzYUNrcHRDaGVja3BvaW50T3Blbihja3B0X2hhbmRsZSwgJm5hbWUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfQ0tQVF9DSEVDS1BPSU5UX1JFQUQsIDAsICZoKTsKKwlpZiAocnYgPT0gU0FfQUlTX0VSUl9UUllfQUdBSU4pIHsKKwkJTE9HX0VSUk9SKCJhYm9ydF9zdGFydHVwOiBja3B0IG9wZW4gcmV0cnkiKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgZ290byBvcGVuX3JldHJ5OworICAgICAgICB9CisKKwlpZiAocnYgIT0gU0FfQUlTX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJTE9HX0RCRygiWyVzXSAgUmVtb3ZpbmcgY2hlY2twb2ludCIsIFNIT1JUX1VVSUQoZW50cnktPm5hbWUudmFsdWUpKTsKK3VubGlua19yZXRyeToKKyAgICAgICAgcnYgPSBzYUNrcHRDaGVja3BvaW50VW5saW5rKGNrcHRfaGFuZGxlLCAmbmFtZSk7CisgICAgICAgIGlmIChydiA9PSBTQV9BSVNfRVJSX1RSWV9BR0FJTikgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiYWJvcnRfc3RhcnR1cDogY2twdCB1bmxpbmsgcmV0cnkiKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgZ290byB1bmxpbmtfcmV0cnk7CisgICAgICAgIH0KKworCWlmIChydiAhPSBTQV9BSVNfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlslc10gRmFpbGVkIHRvIHVubGluayBjaGVja3BvaW50OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUX1VVSUQoZW50cnktPm5hbWUudmFsdWUpLCBzdHJfYWlzX2Vycm9yKHJ2KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworCXNhQ2twdENoZWNrcG9pbnRDbG9zZShoKTsKKworCXJldHVybiAxOworI2Vsc2UKKwkvKiBObyBjaGVja3BvaW50IHRvIHJlbW92ZSwgc28gJ3N1Y2Nlc3MnICovCisJcmV0dXJuIDE7CisjZW5kaWYKK30KKworaW50IGNyZWF0ZV9jbHVzdGVyX2NwZyhjaGFyICp1dWlkLCB1aW50NjRfdCBsdWlkKQoreworCWludCByOworCXNpemVfdCBzaXplOworCXN0cnVjdCBjbG9nX2NwZyAqbmV3ID0gTlVMTDsKKwlzdHJ1Y3QgY2xvZ19jcGcgKnRtcDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh0bXAsICZjbG9nX2NwZ19saXN0KQorCQlpZiAoIXN0cm5jbXAodG1wLT5uYW1lLnZhbHVlLCB1dWlkLCBDUEdfTUFYX05BTUVfTEVOR1RIKSkgeworCQkJTE9HX0VSUk9SKCJMb2cgZW50cnkgYWxyZWFkeSBleGlzdHM6ICVzIiwgdXVpZCk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCisJbmV3ID0gbWFsbG9jKHNpemVvZigqbmV3KSk7CisJaWYgKCFuZXcpIHsKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjbG9nX2NwZyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKKwlkbV9saXN0X2luaXQoJm5ldy0+bGlzdCk7CisJbmV3LT5sb3dlc3RfaWQgPSAweERFQUQ7CisJZG1fbGlzdF9pbml0KCZuZXctPnN0YXJ0dXBfbGlzdCk7CisJZG1fbGlzdF9pbml0KCZuZXctPndvcmtpbmdfbGlzdCk7CisKKwlzaXplID0gKChzdHJsZW4odXVpZCkgKyAxKSA+IENQR19NQVhfTkFNRV9MRU5HVEgpID8KKwkJQ1BHX01BWF9OQU1FX0xFTkdUSCA6IChzdHJsZW4odXVpZCkgKyAxKTsKKwlzdHJuY3B5KG5ldy0+bmFtZS52YWx1ZSwgdXVpZCwgc2l6ZSk7CisJbmV3LT5uYW1lLmxlbmd0aCA9ICh1aW50MzJfdClzaXplOworCW5ldy0+bHVpZCA9IGx1aWQ7CisKKwkvKgorCSAqIEVuc3VyZSB0aGVyZSBhcmUgbm8gc3RhbGUgY2hlY2twb2ludHMgYXJvdW5kIGJlZm9yZSB3ZSBqb2luCisJICovCisJaWYgKHJlbW92ZV9jaGVja3BvaW50KG5ldykgPT0gMSkKKwkJTE9HX0NPTkQobG9nX2NoZWNrcG9pbnQsCisJCQkgIlslc10gIFJlbW92aW5nIGNoZWNrcG9pbnRzIGxlZnQgZnJvbSBwcmV2aW91cyBzZXNzaW9uIiwKKwkJCSBTSE9SVF9VVUlEKG5ldy0+bmFtZS52YWx1ZSkpOworCisJciA9IGNwZ19pbml0aWFsaXplKCZuZXctPmhhbmRsZSwgJmNwZ19jYWxsYmFja3MpOworCWlmIChyICE9IENTX09LKSB7CisJCUxPR19FUlJPUigiY3BnX2luaXRpYWxpemUgZmFpbGVkOiAgQ2Fubm90IGpvaW4gY2x1c3RlciIpOworCQlmcmVlKG5ldyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJciA9IGNwZ19qb2luKG5ldy0+aGFuZGxlLCAmbmV3LT5uYW1lKTsKKwlpZiAociAhPSBDU19PSykgeworCQlMT0dfRVJST1IoImNwZ19qb2luIGZhaWxlZDogIENhbm5vdCBqb2luIGNsdXN0ZXIiKTsKKwkJZnJlZShuZXcpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW5ldy0+Y3BnX3N0YXRlID0gVkFMSUQ7CisJZG1fbGlzdF9hZGQoJmNsb2dfY3BnX2xpc3QsICZuZXctPmxpc3QpOworCUxPR19EQkcoIk5ldyAgIGhhbmRsZTogJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3LT5oYW5kbGUpOworCUxPR19EQkcoIk5ldyAgIG5hbWU6ICVzIiwgbmV3LT5uYW1lLnZhbHVlKTsKKworCS8qIEZJWE1FOiBiZXR0ZXIgdmFyaWFibGUgKi8KKwljcGdfZmRfZ2V0KG5ldy0+aGFuZGxlLCAmcik7CisJbGlua3NfcmVnaXN0ZXIociwgImNsdXN0ZXIiLCBkb19jbHVzdGVyX3dvcmssIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFib3J0X3N0YXJ0dXAoc3RydWN0IGNsb2dfY3BnICpkZWwpCit7CisJc3RydWN0IGNsb2dfcmVxdWVzdCAqcnEsICpuOworCisJTE9HX0RCRygiWyVzXSAgQ1BHIHRlYXJkb3duIGJlZm9yZSBjaGVja3BvaW50IHJlY2VpdmVkIiwKKwkJU0hPUlRfVVVJRChkZWwtPm5hbWUudmFsdWUpKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW5fc2FmZShycSwgbiwgJmRlbC0+c3RhcnR1cF9saXN0LCB1Lmxpc3QpIHsKKwkJZG1fbGlzdF9kZWwoJnJxLT51Lmxpc3QpOworCisJCUxPR19EQkcoIlslc10gIElnbm9yaW5nIHJlcXVlc3QgZnJvbSAldTogJXMiLAorCQkJU0hPUlRfVVVJRChkZWwtPm5hbWUudmFsdWUpLCBycS0+b3JpZ2luYXRvciwKKwkJCV9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSkpOworCQlmcmVlKHJxKTsKKwl9CisKKwlyZW1vdmVfY2hlY2twb2ludChkZWwpOworfQorCitzdGF0aWMgaW50IF9kZXN0cm95X2NsdXN0ZXJfY3BnKHN0cnVjdCBjbG9nX2NwZyAqZGVsKQoreworCWludCByOworCWludCBzdGF0ZTsKKworCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsICJbJXNdIEkgYW0gbGVhdmluZy4yLi4uLi4iLAorCQkgU0hPUlRfVVVJRChkZWwtPm5hbWUudmFsdWUpKTsKKworCS8qCisJICogV2UgbXVzdCBzZW5kIGFueSBsZWZ0IG92ZXIgY2hlY2twb2ludHMgYmVmb3JlCisJICogbGVhdmluZy4gIElmIHdlIGRvbid0LCBhbiBpbmNvbWluZyBub2RlIGNvdWxkCisJICogYmUgc3R1Y2sgd2l0aCBubyBjaGVja3BvaW50IGFuZCBzdGFsbC4KKwkgZG9fY2hlY2twb2ludHMoZGVsKTsgLS0tIFRISVMgQ09VTEQgQkUgQ0FVU0lORyBPVVIgUFJPQkxFTVM6CisKKwkgLSBJbmNvbWluZyBub2RlIGRlbGV0ZXMgb2xkIGNoZWNrcG9pbnRzIGJlZm9yZSBqb2luaW5nCisJIC0gQSBzdGFsZSBjaGVja3BvaW50IGlzIGlzc3VlZCBoZXJlIGJ5IGxlYXZpbmcgbm9kZQorCSAtIChsZWF2aW5nIG5vZGUgbGVhdmVzKQorCSAtIEluY29taW5nIG5vZGUgam9pbnMgY2x1c3RlciBhbmQgZmluZHMgc3RhbGUgY2hlY2twb2ludC4KKwkgLSAobGVhdmluZyBub2RlIGxlYXZlcyAtIG9wdGlvbiAyKQorCSovCisJZG9fY2hlY2twb2ludHMoZGVsLCAxKTsKKworCXN0YXRlID0gZGVsLT5zdGF0ZTsKKworCWRlbC0+Y3BnX3N0YXRlID0gSU5WQUxJRDsKKwlkZWwtPnN0YXRlID0gTEVBVklORzsKKworCS8qCisJICogSWYgdGhlIHN0YXRlIGlzIFZBTElELCB3ZSBtaWdodCBiZSBwcm9jZXNzaW5nIHRoZQorCSAqIHN0YXJ0dXAgbGlzdC4gIElmIHNvLCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCB0bworCSAqIGNsZWFyIHRoZSBzdGFydHVwX2xpc3QgaGVyZSBieSBjYWxsaW5nIGFib3J0X3N0YXJ0dXAKKwkgKi8KKwlpZiAoIWRtX2xpc3RfZW1wdHkoJmRlbC0+c3RhcnR1cF9saXN0KSAmJiAoc3RhdGUgIT0gVkFMSUQpKQorCQlhYm9ydF9zdGFydHVwKGRlbCk7CisKKwlyID0gY3BnX2xlYXZlKGRlbC0+aGFuZGxlLCAmZGVsLT5uYW1lKTsKKwlpZiAociAhPSBDU19PSykKKwkJTE9HX0VSUk9SKCJFcnJvciBsZWF2aW5nIENQRyEiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRlc3Ryb3lfY2x1c3Rlcl9jcGcoY2hhciAqdXVpZCkKK3sKKwlzdHJ1Y3QgY2xvZ19jcGcgKmRlbCwgKnRtcDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGRlbCwgdG1wLCAmY2xvZ19jcGdfbGlzdCkKKwkJaWYgKCFzdHJuY21wKGRlbC0+bmFtZS52YWx1ZSwgdXVpZCwgQ1BHX01BWF9OQU1FX0xFTkdUSCkpCisJCQlfZGVzdHJveV9jbHVzdGVyX2NwZyhkZWwpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbml0X2NsdXN0ZXIodm9pZCkKK3sKKyNpZiBDTUlSUk9SX0hBU19DSEVDS1BPSU5UCisJU2FBaXNFcnJvclQgcnY7CisKKwlydiA9IHNhQ2twdEluaXRpYWxpemUoJmNrcHRfaGFuZGxlLCAmY2FsbGJhY2tzLCAmdmVyc2lvbik7CisKKwlpZiAocnYgIT0gU0FfQUlTX09LKQorCQlyZXR1cm4gRVhJVF9DTFVTVEVSX0NLUFRfSU5JVDsKKyNlbmRpZgorCWRtX2xpc3RfaW5pdCgmY2xvZ19jcGdfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9jbHVzdGVyKHZvaWQpCit7CisjaWYgQ01JUlJPUl9IQVNfQ0hFQ0tQT0lOVAorCVNhQWlzRXJyb3JUIGVycjsKKworCWVyciA9IHNhQ2twdEZpbmFsaXplKGNrcHRfaGFuZGxlKTsKKwlpZiAoZXJyICE9IFNBX0FJU19PSykKKwkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gZmluYWxpemUgY2hlY2twb2ludCBoYW5kbGUiKTsKKyNlbmRpZgorfQorCit2b2lkIGNsdXN0ZXJfZGVidWcodm9pZCkKK3sKKwlzdHJ1Y3QgY2hlY2twb2ludF9kYXRhICpjcDsKKwlzdHJ1Y3QgY2xvZ19jcGcgKmVudHJ5OworCXN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxOworCWludCBpOworCisJTE9HX0VSUk9SKCIiKTsKKwlMT0dfRVJST1IoIkNMVVNURVIgQ09NUE9ORU5UIERFQlVHR0lORzo6Iik7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGVudHJ5LCAmY2xvZ19jcGdfbGlzdCkgeworCQlMT0dfRVJST1IoIiVzOjoiLCBTSE9SVF9VVUlEKGVudHJ5LT5uYW1lLnZhbHVlKSk7CisJCUxPR19FUlJPUigiICBsb3dlc3RfaWQgICAgICAgICA6ICV1IiwgZW50cnktPmxvd2VzdF9pZCk7CisJCUxPR19FUlJPUigiICBzdGF0ZSAgICAgICAgICAgICA6ICVzIiwgKGVudHJ5LT5zdGF0ZSA9PSBJTlZBTElEKSA/CisJCQkgICJJTlZBTElEIiA6IChlbnRyeS0+c3RhdGUgPT0gVkFMSUQpID8gIlZBTElEIiA6CisJCQkgIChlbnRyeS0+c3RhdGUgPT0gTEVBVklORykgPyAiTEVBVklORyIgOiAiVU5LTk9XTiIpOworCQlMT0dfRVJST1IoIiAgY3BnX3N0YXRlICAgICAgICAgOiAlZCIsIGVudHJ5LT5jcGdfc3RhdGUpOworCQlMT0dfRVJST1IoIiAgZnJlZV9tZSAgICAgICAgICAgOiAlZCIsIGVudHJ5LT5mcmVlX21lKTsKKwkJTE9HX0VSUk9SKCIgIGRlbGF5ICAgICAgICAgICAgIDogJWQiLCBlbnRyeS0+ZGVsYXkpOworCQlMT0dfRVJST1IoIiAgcmVzZW5kX3JlcXVlc3RzICAgOiAlZCIsIGVudHJ5LT5yZXNlbmRfcmVxdWVzdHMpOworCQlMT0dfRVJST1IoIiAgY2hlY2twb2ludHNfbmVlZGVkOiAlZCIsIGVudHJ5LT5jaGVja3BvaW50c19uZWVkZWQpOworCQlmb3IgKGkgPSAwLCBjcCA9IGVudHJ5LT5jaGVja3BvaW50X2xpc3Q7CisJCSAgICAgaSA8IE1BWF9DSEVDS1BPSU5UX1JFUVVFU1RFUlM7IGkrKykKKwkJCWlmIChjcCkKKwkJCQljcCA9IGNwLT5uZXh0OworCQkJZWxzZQorCQkJCWJyZWFrOworCQlMT0dfRVJST1IoIiAgQ0tQVHMgd2FpdGluZyAgICAgOiAlZCIsIGkpOworCQlMT0dfRVJST1IoIiAgV29ya2luZyBsaXN0OiIpOworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfZ2VuKHJxLCAmZW50cnktPndvcmtpbmdfbGlzdCwgdS5saXN0KQorCQkJTE9HX0VSUk9SKCIgICVzLyV1IiwgX1JRX1RZUEUocnEtPnVfcnEucmVxdWVzdF90eXBlKSwKKwkJCQkgIHJxLT51X3JxLnNlcSk7CisKKwkJTE9HX0VSUk9SKCIgIFN0YXJ0dXAgbGlzdDoiKTsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbihycSwgJmVudHJ5LT5zdGFydHVwX2xpc3QsIHUubGlzdCkKKwkJCUxPR19FUlJPUigiICAlcy8ldSIsIF9SUV9UWVBFKHJxLT51X3JxLnJlcXVlc3RfdHlwZSksCisJCQkJICBycS0+dV9ycS5zZXEpOworCisJCUxPR19FUlJPUigiQ29tbWFuZCBIaXN0b3J5OiIpOworCQlmb3IgKGkgPSAwOyBpIDwgREVCVUdHSU5HX0hJU1RPUlk7IGkrKykgeworCQkJZW50cnktPmlkeCsrOworCQkJZW50cnktPmlkeCA9IGVudHJ5LT5pZHggJSBERUJVR0dJTkdfSElTVE9SWTsKKwkJCWlmIChlbnRyeS0+ZGVidWdnaW5nW2VudHJ5LT5pZHhdWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisJCQlMT0dfRVJST1IoIiVkOiVkKSAlcyIsIGksIGVudHJ5LT5pZHgsCisJCQkJICBlbnRyeS0+ZGVidWdnaW5nW2VudHJ5LT5pZHhdKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvY2x1c3Rlci5oIGIvZGFlbW9ucy9jbWlycm9yZC9jbHVzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZTU4YgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY21pcnJvcmQvY2x1c3Rlci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX0xWTV9DTE9HX0NMVVNURVJfSAorI2RlZmluZSBfTFZNX0NMT0dfQ0xVU1RFUl9ICisKKyNpbmNsdWRlICJkbS1sb2ctdXNlcnNwYWNlLmgiCisjaW5jbHVkZSAibGliZGV2bWFwcGVyLmgiCisKKyNkZWZpbmUgRE1fVUxPR19SRVNQT05TRSAweDEwMDBVIC8qIGluIGxhc3QgYnl0ZSBvZiAzMi1iaXQgdmFsdWUgKi8KKyNkZWZpbmUgRE1fVUxPR19DSEVDS1BPSU5UX1JFQURZIDIxCisjZGVmaW5lIERNX1VMT0dfTUVNQkVSX0pPSU4gICAgICAyMgorCisvKgorICogVGhlcmUgaXMgb3RoZXIgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gd2hhdCBjYW4KKyAqIGJlIGZvdW5kIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIHRoYXQgd2UKKyAqIG5lZWQgZm9yIHByb2Nlc3NpbmcuICAnY2xvZ19yZXF1ZXN0JyBpcyB0aGUgd3JhcHBpbmcKKyAqIHN0cnVjdHVyZSB3ZSB1c2UgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBmaWVsZHMKKyAqIGF2YWlsYWJsZS4KKyAqLworc3RydWN0IGNsb2dfcmVxdWVzdCB7CisJLyoKKwkgKiBJZiB3ZSBkb24ndCB1c2UgYSB1bmlvbiwgdGhlIHN0cnVjdHVyZSBzaXplIHdpbGwKKwkgKiB2YXJ5IGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgbWFjaGluZXMuICBTbywgd2UKKwkgKiBwYWNrIHR3byA2NC1iaXQgdmVyc2lvbiBudW1iZXJzIGluIHRoZXJlIHRvIGZvcmNlCisJICogdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSB0byBiZSB0aGUgc2FtZS4KKwkgKgorCSAqIFRoZSB0d28gdmVyc2lvbiBudW1iZXJzIGFsc28gaGVscCB1cyB3aXRoIGVuZGlhbgorCSAqIGlzc3Vlcy4gIFRoZSBmaXJzdCBpcyBhbHdheXMgbGl0dGxlIGVuZGlhbiwgd2hpbGUKKwkgKiB0aGUgc2Vjb25kIGlzIGluIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIHNlbmRpbmcKKwkgKiBtYWNoaW5lLiAgSWYgdGhlIHR3byBhcmUgZXF1YWwsIHRoZXJlIGlzIG5vIG5lZWQKKwkgKiB0byBkbyBlbmRpYW4gY29udmVyc2lvbnMuCisJICovCisJdW5pb24geworCQl1aW50NjRfdCB2ZXJzaW9uWzJdOyAvKiBMRSB2ZXJzaW9uIGFuZCBuYXRpdmUgdmVyc2lvbiAqLworCQlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCX0gdTsKKworCS8qCisJICogJ29yaWdpbmF0b3InIGlzIHRoZSBtYWNoaW5lIGZyb20gd2hpY2ggdGhlIHJlcXVlc3RzCisJICogd2FzIG1hZGUuCisJICovCisJdWludDMyX3Qgb3JpZ2luYXRvcjsKKworCS8qCisJICogJ3BpdF9zZXJ2ZXInIGlzIHRoZSAicG9pbnQtaW4tdGltZSIgc2VydmVyIGZvciB0aGUKKwkgKiByZXF1ZXN0LiAgKEkuZS4gIFRoZSBtYWNoaW5lIHRoYXQgd2FzIHRoZSBzZXJ2ZXIgYXQKKwkgKiB0aGUgdGltZSB0aGUgcmVxdWVzdCB3YXMgaXNzdWVkIC0gb25seSBpbXBvcnRhbnQgZHVyaW5nCisJICogc3RhcnR1cC4KKwkgKi8KKwl1aW50MzJfdCBwaXRfc2VydmVyOworCisJLyoKKwkgKiBUaGUgcmVxdWVzdCBmcm9tIHRoZSBrZXJuZWwgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQKKwkgKi8KKwlzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0IHVfcnE7Cit9OworCitpbnQgaW5pdF9jbHVzdGVyKHZvaWQpOwordm9pZCBjbGVhbnVwX2NsdXN0ZXIodm9pZCk7Cit2b2lkIGNsdXN0ZXJfZGVidWcodm9pZCk7CisKK2ludCBjcmVhdGVfY2x1c3Rlcl9jcGcoY2hhciAqdXVpZCwgdWludDY0X3QgbHVpZCk7CitpbnQgZGVzdHJveV9jbHVzdGVyX2NwZyhjaGFyICp1dWlkKTsKKworaW50IGNsdXN0ZXJfc2VuZChzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSk7CisKKyNlbmRpZiAvKiBfTFZNX0NMT0dfQ0xVU1RFUl9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2NtaXJyb3JkL2NvbW1vbi5oIGIvZGFlbW9ucy9jbWlycm9yZC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI4ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9jb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIF9MVk1fQ0xPR19DT01NT05fSAorI2RlZmluZSBfTFZNX0NMT0dfQ09NTU9OX0gKKworLyoKKyAqIElmIHRoZXJlIGFyZSBwcm9ibGVtcyB3aGVuIGZvcmtpbmcgb2ZmIHRvIGJlY29tZSBhIGRhZW1vbiwKKyAqIHRoZSBjaGlsZCB3aWxsIGV4aXN0IHdpdGggb25lIG9mIHRoZXNlIGNvZGVzLiAgVGhpcyBhbGxvd3MKKyAqIHRoZSBwYXJlbnQgdG8ga25vdyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhbmQgcHJpbnQgaXQKKyAqIHRvIHRoZSBsYXVuY2hpbmcgdGVybWluYWwuCisgKgorICogI2RlZmluZSBFWElUX1NVQ0NFU1MgMCAoZnJvbSBzdGRsaWIuaCkKKyAqICNkZWZpbmUgRVhJVF9GQUlMVVJFIDEgKGZyb20gc3RkbGliLmgpCisgKi8KKyNkZWZpbmUgRVhJVF9MT0NLRklMRSAgICAgICAgICAgICAgMgorI2RlZmluZSBFWElUX0tFUk5FTF9TT0NLRVQgICAgICAgICAzIC8qIEZhaWxlZCBuZXRsaW5rIHNvY2tldCBjcmVhdGUgKi8KKyNkZWZpbmUgRVhJVF9LRVJORUxfQklORCAgICAgICAgICAgNAorI2RlZmluZSBFWElUX0tFUk5FTF9TRVRTT0NLT1BUICAgICA1CisjZGVmaW5lIEVYSVRfQ0xVU1RFUl9DS1BUX0lOSVQgICAgIDYgLyogRmFpbGVkIHRvIGluaXQgY2hlY2twb2ludCAqLworI2RlZmluZSBFWElUX1FVRVVFX05PTUVNICAgICAgICAgICA3CisKKyNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX1NJWkUgMTAyNAorCisjZW5kaWYgLyogX0xWTV9DTE9HX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2NtaXJyb3JkL2NvbXBhdC5jIGIvZGFlbW9ucy9jbWlycm9yZC9jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY5NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9jb21wYXQuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworI2luY2x1ZGUgImxvZ2dpbmcuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAieGxhdGUuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qCisgKiBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgbG9nIGRhZW1vbiBjb21tdW5pY2F0ZSB3aXRoIGRpZmZlcmVudAorICogdmVyc2lvbnMgb2YgdGhlIGludGVyLW1hY2hpbmUgY29tbXVuaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoCisgKiB2YXJpZXMgaW4gc2l6ZSBhbmQgZmllbGRzLiAgVGhlIG9sZGVyIHZlcnNpb25zIGFwcGVuZCB0aGUKKyAqIHN0YW5kYXJkIHVwc3RyZWFtIHZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZSB0byBldmVyeSByZXF1ZXN0LgorICogQ09NUEFUX09GRlNFVCBpcyB3aGVyZSB0aGUgdXBzdHJlYW0gc3RydWN0dXJlIHN0YXJ0cy4KKyAqLworI2RlZmluZSBDT01QQVRfT0ZGU0VUIDI1NgorCitzdGF0aWMgdm9pZCB2NV9kYXRhX2VuZGlhbl9zd2l0Y2goc3RydWN0IGNsb2dfcmVxdWVzdCAqcnEsIGludCB0b19uZXR3b3JrIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWludCBpLCBlbmQ7CisJaW50NjRfdCAqcGk2NDsKKwl1aW50NjRfdCAqcHU2NDsKKwl1aW50MzJfdCBycV90eXBlID0gcnEtPnVfcnEucmVxdWVzdF90eXBlICYgfkRNX1VMT0dfUkVTUE9OU0U7CisKKwlpZiAocnEtPnVfcnEucmVxdWVzdF90eXBlICYgRE1fVUxPR19SRVNQT05TRSkgeworCQlzd2l0Y2ggKHJxX3R5cGUpIHsKKwkJY2FzZSBETV9VTE9HX0NUUjoKKwkJY2FzZSBETV9VTE9HX0RUUjoKKwkJCUxPR19FUlJPUigiSW52YWxpZCByZXNwb25zZSB0eXBlIGluIGVuZGlhbiBzd2l0Y2giKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKworCQljYXNlIERNX1VMT0dfUFJFU1VTUEVORDoKKwkJY2FzZSBETV9VTE9HX1BPU1RTVVNQRU5EOgorCQljYXNlIERNX1VMT0dfUkVTVU1FOgorCQljYXNlIERNX1VMT0dfRkxVU0g6CisJCWNhc2UgRE1fVUxPR19NQVJLX1JFR0lPTjoKKwkJY2FzZSBETV9VTE9HX0NMRUFSX1JFR0lPTjoKKwkJY2FzZSBETV9VTE9HX1NFVF9SRUdJT05fU1lOQzoKKwkJY2FzZSBETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFk6CisJCWNhc2UgRE1fVUxPR19NRU1CRVJfSk9JTjoKKwkJY2FzZSBETV9VTE9HX1NUQVRVU19JTkZPOgorCQljYXNlIERNX1VMT0dfU1RBVFVTX1RBQkxFOgorCQkJLyogTm8gb3V0Ym91bmQgZGF0YSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBETV9VTE9HX0dFVF9SRUdJT05fU0laRToKKwkJY2FzZSBETV9VTE9HX0dFVF9TWU5DX0NPVU5UOgorCQkJcHU2NCA9ICh1aW50NjRfdCAqKXJxLT51X3JxLmRhdGE7CisJCQkqcHU2NCA9IHhsYXRlNjQoKnB1NjQpOworCQkJYnJlYWs7CisJCWNhc2UgRE1fVUxPR19JU19DTEVBTjoKKwkJY2FzZSBETV9VTE9HX0lOX1NZTkM6CisJCQlwaTY0ID0gKGludDY0X3QgKilycS0+dV9ycS5kYXRhOworCQkJKnBpNjQgPSB4bGF0ZTY0KCpwaTY0KTsKKwkJCWJyZWFrOworCQljYXNlIERNX1VMT0dfR0VUX1JFU1lOQ19XT1JLOgorCQljYXNlIERNX1VMT0dfSVNfUkVNT1RFX1JFQ09WRVJJTkc6CisJCQlwaTY0ID0gKGludDY0X3QgKilycS0+dV9ycS5kYXRhOworCQkJcHU2NCA9ICgodWludDY0X3QgKilycS0+dV9ycS5kYXRhKSArIDE7CisJCQkqcGk2NCA9IHhsYXRlNjQoKnBpNjQpOworCQkJKnB1NjQgPSB4bGF0ZTY0KCpwdTY0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTE9HX0VSUk9SKCJVbmtub3duIHJlcXVlc3QgdHlwZSwgJXUiLCBycV90eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocnFfdHlwZSkgeworCQljYXNlIERNX1VMT0dfQ1RSOgorCQljYXNlIERNX1VMT0dfRFRSOgorCQkJTE9HX0VSUk9SKCJJbnZhbGlkIHJlcXVlc3QgdHlwZSBpbiBlbmRpYW4gc3dpdGNoIik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisKKwkJY2FzZSBETV9VTE9HX1BSRVNVU1BFTkQ6CisJCWNhc2UgRE1fVUxPR19QT1NUU1VTUEVORDoKKwkJY2FzZSBETV9VTE9HX1JFU1VNRToKKwkJY2FzZSBETV9VTE9HX0dFVF9SRUdJT05fU0laRToKKwkJY2FzZSBETV9VTE9HX0ZMVVNIOgorCQljYXNlIERNX1VMT0dfR0VUX1JFU1lOQ19XT1JLOgorCQljYXNlIERNX1VMT0dfR0VUX1NZTkNfQ09VTlQ6CisJCWNhc2UgRE1fVUxPR19TVEFUVVNfSU5GTzoKKwkJY2FzZSBETV9VTE9HX1NUQVRVU19UQUJMRToKKwkJY2FzZSBETV9VTE9HX0NIRUNLUE9JTlRfUkVBRFk6CisJCWNhc2UgRE1fVUxPR19NRU1CRVJfSk9JTjoKKwkJCS8qIE5vIGluY29taW5nIGRhdGEgKi8KKwkJCWJyZWFrOworCQljYXNlIERNX1VMT0dfSVNfQ0xFQU46CisJCWNhc2UgRE1fVUxPR19JTl9TWU5DOgorCQljYXNlIERNX1VMT0dfSVNfUkVNT1RFX1JFQ09WRVJJTkc6CisJCQlwdTY0ID0gKHVpbnQ2NF90ICopcnEtPnVfcnEuZGF0YTsKKwkJCSpwdTY0ID0geGxhdGU2NCgqcHU2NCk7CisJCQlicmVhazsKKwkJY2FzZSBETV9VTE9HX01BUktfUkVHSU9OOgorCQljYXNlIERNX1VMT0dfQ0xFQVJfUkVHSU9OOgorCQkJZW5kID0gcnEtPnVfcnEuZGF0YV9zaXplL3NpemVvZih1aW50NjRfdCk7CisKKwkJCXB1NjQgPSAodWludDY0X3QgKilycS0+dV9ycS5kYXRhOworCQkJZm9yIChpID0gMDsgaSA8IGVuZDsgaSsrKQorCQkJCXB1NjRbaV0gPSB4bGF0ZTY0KHB1NjRbaV0pOworCQkJYnJlYWs7CisJCWNhc2UgRE1fVUxPR19TRVRfUkVHSU9OX1NZTkM6CisJCQlwdTY0ID0gKHVpbnQ2NF90ICopcnEtPnVfcnEuZGF0YTsKKwkJCXBpNjQgPSAoKGludDY0X3QgKilycS0+dV9ycS5kYXRhKSArIDE7CisJCQkqcHU2NCA9IHhsYXRlNjQoKnB1NjQpOworCQkJKnBpNjQgPSB4bGF0ZTY0KCpwaTY0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTE9HX0VSUk9SKCJVbmtub3duIHJlcXVlc3QgdHlwZSwgJXUiLCBycV90eXBlKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB2NV9lbmRpYW5fdG9fbmV0d29yayhzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSkKK3sKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICp1X3JxID0gJnJxLT51X3JxOworCisJc2l6ZSA9IHNpemVvZigqcnEpICsgdV9ycS0+ZGF0YV9zaXplOworCisJdV9ycS0+ZXJyb3IgPSB4bGF0ZTMyKHVfcnEtPmVycm9yKTsKKwl1X3JxLT5zZXEgPSB4bGF0ZTMyKHVfcnEtPnNlcSk7CisKKwlycS0+b3JpZ2luYXRvciA9IHhsYXRlMzIocnEtPm9yaWdpbmF0b3IpOworCisJdjVfZGF0YV9lbmRpYW5fc3dpdGNoKHJxLCAxKTsKKworCXVfcnEtPnJlcXVlc3RfdHlwZSA9IHhsYXRlMzIodV9ycS0+cmVxdWVzdF90eXBlKTsKKwl1X3JxLT5kYXRhX3NpemUgPSB4bGF0ZTMyKHVfcnEtPmRhdGFfc2l6ZSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IGNsb2dfcmVxdWVzdF90b19uZXR3b3JrKHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCisJLyogRklYTUU6IFJlbW92ZSB0aGlzIHNhZmV0eSBjaGVjayAqLworCWlmIChycS0+dS52ZXJzaW9uWzBdICE9IHhsYXRlNjQocnEtPnUudmVyc2lvblsxXSkpIHsKKwkJTE9HX0VSUk9SKCJQcm9ncmFtbWVyIGVycm9yOiAgdmVyc2lvblswXSBtdXN0IGJlIExFIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwkvKgorCSAqIEFyZSB3ZSBhbHJlYWR5IHJ1bm5pbmcgaW4gdGhlIGVuZGlhbiBtb2RlIHdlIHNlbmQKKwkgKiBvdmVyIHRoZSB3aXJlPworCSAqLworCWlmIChycS0+dS52ZXJzaW9uWzBdID09IHJxLT51LnZlcnNpb25bMV0pCisJCXJldHVybiAwOworCisJciA9IHY1X2VuZGlhbl90b19uZXR3b3JrKHJxKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY1X2VuZGlhbl9mcm9tX25ldHdvcmsoc3RydWN0IGNsb2dfcmVxdWVzdCAqcnEpCit7CisJaW50IHNpemU7CisJc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqdV9ycSA9ICZycS0+dV9ycTsKKworCXVfcnEtPmVycm9yID0geGxhdGUzMih1X3JxLT5lcnJvcik7CisJdV9ycS0+c2VxID0geGxhdGUzMih1X3JxLT5zZXEpOworCXVfcnEtPnJlcXVlc3RfdHlwZSA9IHhsYXRlMzIodV9ycS0+cmVxdWVzdF90eXBlKTsKKwl1X3JxLT5kYXRhX3NpemUgPSB4bGF0ZTMyKHVfcnEtPmRhdGFfc2l6ZSk7CisKKwlycS0+b3JpZ2luYXRvciA9IHhsYXRlMzIocnEtPm9yaWdpbmF0b3IpOworCisJc2l6ZSA9IHNpemVvZigqcnEpICsgdV9ycS0+ZGF0YV9zaXplOworCisJdjVfZGF0YV9lbmRpYW5fc3dpdGNoKHJxLCAwKTsKKworCXJldHVybiBzaXplOworfQorCitpbnQgY2xvZ19yZXF1ZXN0X2Zyb21fbmV0d29yayh2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pCit7CisJdWludDY0X3QgKnZwID0gZGF0YTsKKwl1aW50NjRfdCB2ZXJzaW9uID0geGxhdGU2NCh2cFswXSk7CisJc3RydWN0IGNsb2dfcmVxdWVzdCAqcnEgPSBkYXRhOworCisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSA1OiAvKiBVcHN0cmVhbSAqLworCQlpZiAodmVyc2lvbiA9PSB2cFswXSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIDQ6IC8qIFJIRUwgNS5bNDVdICovCisJY2FzZSAzOiAvKiBSSEVMIDUuMyAqLworCWNhc2UgMjogLyogUkhFTCA1LjIgKi8KKwkJLyogRklYTUU6IHN0aWxsIG5lZWQgdG8gYWNjb3VudCBmb3IgcGF5bG9hZCAqLworCQlpZiAoZGF0YV9sZW4gPCAoQ09NUEFUX09GRlNFVCArIHNpemVvZigqcnEpKSkKKwkJCXJldHVybiAtRU5PU1BDOworCisJCXJxID0gKHN0cnVjdCBjbG9nX3JlcXVlc3QgKikoKGNoYXIgKilkYXRhICsgQ09NUEFUX09GRlNFVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR19FUlJPUigiVW5hYmxlIHRvIHByb2Nlc3MgY2x1c3RlciBtZXNzYWdlOiAiCisJCQkgICJJbmNvbXBhdGlibGUgdmVyc2lvbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2NV9lbmRpYW5fZnJvbV9uZXR3b3JrKHJxKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvY29tcGF0LmggYi9kYWVtb25zL2NtaXJyb3JkL2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGVkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL2NvbXBhdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKi8KKyNpZm5kZWYgX0xWTV9DTE9HX0NPTVBBVF9ICisjZGVmaW5lIF9MVk1fQ0xPR19DT01QQVRfSAorCisvKgorICogVGhlIGludGVybWFjaGluZSBjb21tdW5pY2F0aW9uIHN0cnVjdHVyZSB2ZXJzaW9uIGFyZToKKyAqCTA6IFVudXNlZAorICoJMTogTmV2ZXIgaW4gdGhlIHdpbGQKKyAqCTI6IFJIRUwgNS4yCisgKgkzOiBSSEVMIDUuMworICoJNDogUkhFTCA1LjQsIFJIRUwgNS41CisgKgk1OiBSSEVMIDYsIEN1cnJlbnQgVXBzdHJlYW0gRm9ybWF0CisgKi8KKyNkZWZpbmUgQ0xPR19URlJfVkVSU0lPTiA1CisKK2ludCBjbG9nX3JlcXVlc3RfdG9fbmV0d29yayhzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICpycSk7CitpbnQgY2xvZ19yZXF1ZXN0X2Zyb21fbmV0d29yayh2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pOworCisjZW5kaWYgLyogX0xWTV9DTE9HX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2NtaXJyb3JkL2Z1bmN0aW9ucy5jIGIvZGFlbW9ucy9jbWlycm9yZC9mdW5jdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdkOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9mdW5jdGlvbnMuYwpAQCAtMCwwICsxLDE5NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlICJsb2dnaW5nLmgiCisjaW5jbHVkZSAiZnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgQllURV9TSElGVCAzCisKKy8qCisgKiBNYWdpYyBmb3IgcGVyc2lzdGVudCBtaXJyb3JzOiAiTWlSciIKKyAqIEZvbGxvd2luZyBvbi1kaXNrIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzdG9sZW4gZnJvbQorICogZHJpdmVycy9tZC9kbS1sb2cuYworICovCisjZGVmaW5lIE1JUlJPUl9NQUdJQyAweDRENjk1MjcyCisjZGVmaW5lIE1JUlJPUl9ESVNLX1ZFUlNJT04gMgorI2RlZmluZSBMT0dfT0ZGU0VUIDIKKworI2RlZmluZSBSRVNZTkNfSElTVE9SWSA1MAorI2RlZmluZSBSRVNZTkNfQlVGTEVOIDEyOAorLy9zdGF0aWMgY2hhciByZXN5bmNfaGlzdG9yeVtSRVNZTkNfSElTVE9SWV1bMTI4XTsKKy8vc3RhdGljIGludCBpZHggPSAwOworI2RlZmluZSBMT0dfU1BSSU5UKF9sYywgZiwgYXJnLi4uKSBkbyB7CQkJCQlcCisJCWxjLT5pZHgrKzsJCQkJCQlcCisJCWxjLT5pZHggPSBsYy0+aWR4ICUgUkVTWU5DX0hJU1RPUlk7CQkJXAorCQlzbnByaW50ZihsYy0+cmVzeW5jX2hpc3RvcnlbbGMtPmlkeF0sIFJFU1lOQ19CVUZMRU4sIGYsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorCitzdHJ1Y3QgbG9nX2hlYWRlciB7CisgICAgICAgIHVpbnQzMl90IG1hZ2ljOworICAgICAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgICAgICB1aW50NjRfdCBucl9yZWdpb25zOworfTsKKworc3RydWN0IGxvZ19jIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJY2hhciB1dWlkW0RNX1VVSURfTEVOXTsKKwl1aW50NjRfdCBsdWlkOworCisJdGltZV90IGRlbGF5OyAvKiBsaW1pdHMgaG93IGZhc3QgYSByZXN1bWUgY2FuIGhhcHBlbiBhZnRlciBzdXNwZW5kICovCisJaW50IHRvdWNoZWQ7CisJaW50IGluX3N5bmM7ICAvKiBBbiBpbi1zeW5jIHRoYXQgc3RheXMgc2V0IHVudGlsIHN1c3BlbmQvcmVzdW1lICovCisJdWludDMyX3QgcmVnaW9uX3NpemU7CisJdWludDMyX3QgcmVnaW9uX2NvdW50OworCXVpbnQ2NF90IHN5bmNfY291bnQ7CisKKwlkbV9iaXRzZXRfdCBjbGVhbl9iaXRzOworCWRtX2JpdHNldF90IHN5bmNfYml0czsKKwl1aW50MzJfdCByZWNvdmVyZXI7CisJdWludDY0X3QgcmVjb3ZlcmluZ19yZWdpb247IC8qIC0xIG1lYW5zIG5vdCByZWNvdmVyaW5nICovCisJdWludDY0X3Qgc2tpcF9iaXRfd2FybmluZzsgLyogdXNlZCB0byB3YXJuIGlmIHJlZ2lvbiBza2lwcGVkICovCisJaW50IHN5bmNfc2VhcmNoOworCisJaW50IHJlc3VtZV9vdmVycmlkZTsKKworCXVpbnQzMl90IGJsb2NrX29uX2Vycm9yOworICAgICAgICBlbnVtIHN5bmMgeworICAgICAgICAgICAgICAgIERFRkFVTFRTWU5DLCAgICAvKiBTeW5jaHJvbml6ZSBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgICAgICBOT1NZTkMsICAgICAgICAgLyogRGV2aWNlcyBrbm93biB0byBiZSBhbHJlYWR5IGluIHN5bmMgKi8KKyAgICAgICAgICAgICAgICBGT1JDRVNZTkMsICAgICAgLyogRm9yY2UgYSBzeW5jIHRvIGhhcHBlbiAqLworICAgICAgICB9IHN5bmM7CisKKwl1aW50MzJfdCBzdGF0ZTsgICAgICAgICAvKiBjdXJyZW50IG9wZXJhdGlvbmFsIHN0YXRlIG9mIHRoZSBsb2cgKi8KKworCXN0cnVjdCBkbV9saXN0IG1hcmtfbGlzdDsKKworCXVpbnQzMl90IHJlY292ZXJ5X2hhbHRlZDsKKwlzdHJ1Y3QgcmVjb3ZlcnlfcmVxdWVzdCAqcmVjb3ZlcnlfcmVxdWVzdF9saXN0OworCisJaW50IGRpc2tfZmQ7ICAgICAgICAgICAgLyogLTEgbWVhbnMgbm8gZGlzayBsb2cgKi8KKwlpbnQgbG9nX2Rldl9mYWlsZWQ7CisJdWludDY0X3QgZGlza19ucl9yZWdpb25zOworCXNpemVfdCBkaXNrX3NpemU7ICAgICAgIC8qIHNpemUgb2YgZGlza19idWZmZXIgaW4gYnl0ZXMgKi8KKwl2b2lkICpkaXNrX2J1ZmZlcjsgICAgICAvKiBhbGlnbmVkIG1lbW9yeSBmb3IgT19ESVJFQ1QgKi8KKwlpbnQgaWR4OworCWNoYXIgcmVzeW5jX2hpc3RvcnlbUkVTWU5DX0hJU1RPUlldW1JFU1lOQ19CVUZMRU5dOworfTsKKworc3RydWN0IG1hcmtfZW50cnkgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJdWludDMyX3Qgbm9kZWlkOworCXVpbnQ2NF90IHJlZ2lvbjsKK307CisKK3N0cnVjdCByZWNvdmVyeV9yZXF1ZXN0IHsKKwl1aW50NjRfdCByZWdpb247CisJc3RydWN0IHJlY292ZXJ5X3JlcXVlc3QgKm5leHQ7Cit9OworCitzdGF0aWMgRE1fTElTVF9JTklUKGxvZ19saXN0KTsKK3N0YXRpYyBETV9MSVNUX0lOSVQobG9nX3BlbmRpbmdfbGlzdCk7CisKK3N0YXRpYyBpbnQgbG9nX3Rlc3RfYml0KGRtX2JpdHNldF90IGJzLCBpbnQgYml0KQoreworCXJldHVybiBkbV9iaXQoYnMsIGJpdCkgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQgbG9nX3NldF9iaXQoc3RydWN0IGxvZ19jICpsYywgZG1fYml0c2V0X3QgYnMsIGludCBiaXQpCit7CisJZG1fYml0X3NldChicywgYml0KTsKKwlsYy0+dG91Y2hlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19jbGVhcl9iaXQoc3RydWN0IGxvZ19jICpsYywgZG1fYml0c2V0X3QgYnMsIGludCBiaXQpCit7CisJZG1fYml0X2NsZWFyKGJzLCBiaXQpOworCWxjLT50b3VjaGVkID0gMTsKK30KKworc3RhdGljIHVpbnQ2NF90IGZpbmRfbmV4dF96ZXJvX2JpdChkbV9iaXRzZXRfdCBicywgdW5zaWduZWQgc3RhcnQpCit7CisJZm9yICg7IGRtX2JpdChicywgc3RhcnQpOyBzdGFydCsrKQorCQlpZiAoc3RhcnQgPj0gKmJzKQorCQkJcmV0dXJuICh1aW50NjRfdCktMTsKKworCXJldHVybiBzdGFydDsKK30KKworc3RhdGljIHVpbnQ2NF90IGNvdW50X2JpdHMzMihkbV9iaXRzZXRfdCBicykKK3sKKwl1bnNpZ25lZCBpLCBzaXplID0gYnNbMF0vKHVuc2lnbmVkKURNX0JJVFNfUEVSX0lOVCArIDE7CisJdW5zaWduZWQgY291bnQgPSAwOworCisJZm9yIChpID0gMTsgaSA8PSBzaXplOyBpKyspCisJCWNvdW50ICs9IGh3ZWlnaHQzMihic1tpXSk7CisKKwlyZXR1cm4gKHVpbnQ2NF90KWNvdW50OworfQorCisvKgorICogZ2V0X2xvZworICoKKyAqIFJldHVybnM6IGxvZyBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCBsb2dfYyAqZ2V0X2xvZyhjb25zdCBjaGFyICp1dWlkLCB1aW50NjRfdCBsdWlkKQoreworCXN0cnVjdCBsb2dfYyAqbGM7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGMsICZsb2dfbGlzdCkKKwkJaWYgKCFzdHJjbXAobGMtPnV1aWQsIHV1aWQpICYmCisJCSAgICAoIWx1aWQgfHwgKGx1aWQgPT0gbGMtPmx1aWQpKSkKKwkJCXJldHVybiBsYzsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2V0X3BlbmRpbmdfbG9nCisgKgorICogUGVuZGluZyBsb2dzIGFyZSBsb2dzIHRoYXQgaGF2ZSBiZWVuICdjbG9nX2N0cidlZCwgYnV0CisgKiBoYXZlIG5vdCBqb2luZWQgdGhlIENQRyAodmlhIGNsb2dfcmVzdW1lKS4KKyAqCisgKiBSZXR1cm5zOiBsb2cgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9nX2MgKmdldF9wZW5kaW5nX2xvZyhjb25zdCBjaGFyICp1dWlkLCB1aW50NjRfdCBsdWlkKQoreworCXN0cnVjdCBsb2dfYyAqbGM7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGMsICZsb2dfcGVuZGluZ19saXN0KQorCQlpZiAoIXN0cmNtcChsYy0+dXVpZCwgdXVpZCkgJiYKKwkJICAgICghbHVpZCB8fCAobHVpZCA9PSBsYy0+bHVpZCkpKQorCQkJcmV0dXJuIGxjOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhlYWRlcl90b19kaXNrKHN0cnVjdCBsb2dfaGVhZGVyICptZW0sIHN0cnVjdCBsb2dfaGVhZGVyICpkaXNrKQoreworCW1lbWNweShkaXNrLCBtZW0sIHNpemVvZihzdHJ1Y3QgbG9nX2hlYWRlcikpOworfQorCitzdGF0aWMgdm9pZCBoZWFkZXJfZnJvbV9kaXNrKHN0cnVjdCBsb2dfaGVhZGVyICptZW0sIHN0cnVjdCBsb2dfaGVhZGVyICpkaXNrKQoreworCW1lbWNweShtZW0sIGRpc2ssIHNpemVvZihzdHJ1Y3QgbG9nX2hlYWRlcikpOworfQorCitzdGF0aWMgaW50IHJ3X2xvZyhzdHJ1Y3QgbG9nX2MgKmxjLCBpbnQgZG9fd3JpdGUpCit7CisJaW50IHI7CisKKwlyID0gKGludClsc2VlayhsYy0+ZGlza19mZCwgMCwgU0VFS19TRVQpOworCWlmIChyIDwgMCkgeworCQlMT0dfRVJST1IoIlslc10gcndfbG9nOiAgbHNlZWsgZmFpbHVyZTogJXMiLAorCQkJICBTSE9SVF9VVUlEKGxjLT51dWlkKSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwlpZiAoZG9fd3JpdGUpIHsKKwkJLyogRklYTUUgQ29wZSB3aXRoIGZ1bGwgc2V0IG9mIG5vbi1lcnJvciBjb25kaXRpb25zICovCisJCXIgPSB3cml0ZShsYy0+ZGlza19mZCwgbGMtPmRpc2tfYnVmZmVyLCBsYy0+ZGlza19zaXplKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlMT0dfRVJST1IoIlslc10gcndfbG9nOiAgd3JpdGUgZmFpbHVyZTogJXMiLAorCQkJCSAgU0hPUlRfVVVJRChsYy0+dXVpZCksIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLUVJTzsgLyogRmFpbGVkIGRpc2sgd3JpdGUgKi8KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWFkICovCisJLyogRklYTUUgQ29wZSB3aXRoIGZ1bGwgc2V0IG9mIG5vbi1lcnJvciBjb25kaXRpb25zICovCisJciA9IHJlYWQobGMtPmRpc2tfZmQsIGxjLT5kaXNrX2J1ZmZlciwgbGMtPmRpc2tfc2l6ZSk7CisJaWYgKHIgPCAwKQorCQlMT0dfRVJST1IoIlslc10gcndfbG9nOiAgcmVhZCBmYWlsdXJlOiAlcyIsCisJCQkgIFNIT1JUX1VVSUQobGMtPnV1aWQpLCBzdHJlcnJvcihlcnJubykpOworCWlmIChyICE9IGxjLT5kaXNrX3NpemUpCisJCXJldHVybiAtRUlPOyAvKiBGYWlsZWQgZGlzayByZWFkICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkX2xvZworICogQGxjCisgKgorICogVmFsaWQgcmV0dXJuIGNvZGVzOgorICogICAtRUlOVkFMOiAgSW52YWxpZCBoZWFkZXIsIGJpdHMgbm90IGNvcGllZAorICogICAtRUlPOiAgICAgVW5hYmxlIHRvIHJlYWQgZGlzayBsb2cKKyAqICAgIDA6ICAgICAgIFZhbGlkIGhlYWRlciwgZGlzayBiaXQgLT4gbGMtPmNsZWFuX2JpdHMKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FWFhYIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCByZWFkX2xvZyhzdHJ1Y3QgbG9nX2MgKmxjKQoreworCXN0cnVjdCBsb2dfaGVhZGVyIGxoID0geyAwIH07CisJc2l6ZV90IGJpdHNldF9zaXplOworCisJaWYgKHJ3X2xvZyhsYywgMCkpCisJCXJldHVybiAtRUlPOyAvKiBGYWlsZWQgZGlzayByZWFkICovCisKKwloZWFkZXJfZnJvbV9kaXNrKCZsaCwgbGMtPmRpc2tfYnVmZmVyKTsKKwlpZiAobGgubWFnaWMgIT0gTUlSUk9SX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxjLT5kaXNrX25yX3JlZ2lvbnMgPSBsaC5ucl9yZWdpb25zOworCisJLyogUmVhZCBkaXNrIGJpdHMgaW50byBzeW5jX2JpdHMgKi8KKwliaXRzZXRfc2l6ZSA9IGxjLT5yZWdpb25fY291bnQgLyA4OworCWJpdHNldF9zaXplICs9IChsYy0+cmVnaW9uX2NvdW50ICUgOCkgPyAxIDogMDsKKworCS8qICdsYy0+Y2xlYW5fYml0cyArIDEnIGJlY2FzdWUgZG1fYml0c2V0X3QgbGVhZHMgd2l0aCBhIHVpbnQzMl90ICovCisJbWVtY3B5KGxjLT5jbGVhbl9iaXRzICsgMSwgKGNoYXIgKilsYy0+ZGlza19idWZmZXIgKyAxMDI0LCBiaXRzZXRfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdyaXRlX2xvZworICogQGxjCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUlPIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3cml0ZV9sb2coc3RydWN0IGxvZ19jICpsYykKK3sKKwlzdHJ1Y3QgbG9nX2hlYWRlciBsaDsKKwlzaXplX3QgYml0c2V0X3NpemU7CisKKwlsaC5tYWdpYyA9IE1JUlJPUl9NQUdJQzsKKwlsaC52ZXJzaW9uID0gTUlSUk9SX0RJU0tfVkVSU0lPTjsKKwlsaC5ucl9yZWdpb25zID0gbGMtPnJlZ2lvbl9jb3VudDsKKworCWhlYWRlcl90b19kaXNrKCZsaCwgbGMtPmRpc2tfYnVmZmVyKTsKKworCS8qIFdyaXRlIGRpc2sgYml0cyBmcm9tIGNsZWFuX2JpdHMgKi8KKwliaXRzZXRfc2l6ZSA9IGxjLT5yZWdpb25fY291bnQgLyA4OworCWJpdHNldF9zaXplICs9IChsYy0+cmVnaW9uX2NvdW50ICUgOCkgPyAxIDogMDsKKworCS8qICdsYy0+Y2xlYW5fYml0cyArIDEnIGJlY2FzdWUgZG1fYml0c2V0X3QgbGVhZHMgd2l0aCBhIHVpbnQzMl90ICovCisJbWVtY3B5KChjaGFyICopbGMtPmRpc2tfYnVmZmVyICsgMTAyNCwgbGMtPmNsZWFuX2JpdHMgKyAxLCBiaXRzZXRfc2l6ZSk7CisKKwlpZiAocndfbG9nKGxjLCAxKSkgeworCQlsYy0+bG9nX2Rldl9mYWlsZWQgPSAxOworCQlyZXR1cm4gLUVJTzsgLyogRmFpbGVkIGRpc2sgd3JpdGUgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FIFJld3JpdGUgdGhpcyBmdW5jdGlvbiB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSB1ZGV2IGNoYW5nZXMgKHdoZXJlIGluIHVzZSkgdG8gaW1wcm92ZSBpdHMgZWZmaWNpZW5jeSEgKi8KK3N0YXRpYyBpbnQgZmluZF9kaXNrX3BhdGgoY2hhciAqbWFqb3JfbWlub3Jfc3RyLCBjaGFyICpwYXRoX3J0biwgaW50ICp1bmxpbmtfcGF0aCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpbnQgcjsKKwlESVIgKmRwOworCXN0cnVjdCBkaXJlbnQgKmRlcDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBtYWpvciwgbWlub3I7CisKKwlpZiAoIXN0cnN0cihtYWpvcl9taW5vcl9zdHIsICI6IikpIHsKKwkJciA9IHN0YXQobWFqb3JfbWlub3Jfc3RyLCAmc3RhdGJ1Zik7CisJCWlmIChyKQorCQkJcmV0dXJuIC1lcnJubzsKKwkJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3ByaW50ZihwYXRoX3J0biwgIiVzIiwgbWFqb3JfbWlub3Jfc3RyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJciA9IHNzY2FuZihtYWpvcl9taW5vcl9zdHIsICIlZDolZCIsICZtYWpvciwgJm1pbm9yKTsKKwlpZiAociAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZJWE1FIGRtX2RpcigpICovCisJTE9HX0RCRygiQ2hlY2tpbmcgL2Rldi9tYXBwZXIgZm9yIGRldmljZSAlZDolZCIsIG1ham9yLCBtaW5vcik7CisJLyogQ2hlY2sgL2Rldi9tYXBwZXIgZGlyICovCisJZHAgPSBvcGVuZGlyKCIvZGV2L21hcHBlciIpOworCWlmICghZHApCisJCXJldHVybiAtRU5PRU5UOworCisJd2hpbGUgKChkZXAgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgeworCQkvKgorCQkgKiBGSVhNRTogVGhpcyBpcyByYWN5LiAgQnkgdGhlIHRpbWUgdGhlIHBhdGggaXMgdXNlZCwKKwkJICogaXQgbWF5IHBvaW50IHRvIHNvbWV0aGluZyBlbHNlLiAgJ2ZzdGF0JyB3aWxsIGJlCisJCSAqIHJlcXVpcmVkIHVwb24gb3BlbmluZyB0byBlbnN1cmUgd2UgZ290IHdoYXQgd2UKKwkJICogd2FudGVkLgorCQkgKi8KKworCQlzcHJpbnRmKHBhdGhfcnRuLCAiL2Rldi9tYXBwZXIvJXMiLCBkZXAtPmRfbmFtZSk7CisJCWlmIChzdGF0KHBhdGhfcnRuLCAmc3RhdGJ1ZikgPCAwKSB7CisJCQlMT0dfREJHKCJVbmFibGUgdG8gc3RhdCAlcyIsIHBhdGhfcnRuKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkgJiYKKwkJICAgIChtYWpvcihzdGF0YnVmLnN0X3JkZXYpID09IG1ham9yKSAmJgorCQkgICAgKG1pbm9yKHN0YXRidWYuc3RfcmRldikgPT0gbWlub3IpKSB7CisJCQlMT0dfREJHKCIgICVzOiBZRVMiLCBkZXAtPmRfbmFtZSk7CisJCQlpZiAoY2xvc2VkaXIoZHApKQorCQkJCUxPR19EQkcoIlVuYWJsZSB0byBjbG9zZWRpciAvZGV2L21hcHBlciAlcyIsCisJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCUxPR19EQkcoIiAgJXM6IE5PIiwgZGVwLT5kX25hbWUpOworCQl9CisJfQorCisJaWYgKGNsb3NlZGlyKGRwKSkKKwkJTE9HX0RCRygiVW5hYmxlIHRvIGNsb3NlZGlyIC9kZXYvbWFwcGVyICVzIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBGSVhNRSBGaW5kIG91dCB3aHkgdGhpcyB3YXMgaGVyZSBhbmQgZGVhbCB3aXRoIHVuZGVybHlpbmcgcHJvYmxlbS4gKi8KKwlMT0dfREJHKCJQYXRoIG5vdCBmb3VuZCBmb3IgJWQvJWQiLCBtYWpvciwgbWlub3IpOworCXJldHVybiAtRU5PRU5UOworCisJLy8gTE9HX0RCRygiQ3JlYXRpbmcgL2Rldi9tYXBwZXIvJWQtJWQiLCBtYWpvciwgbWlub3IpOworCS8vIHNwcmludGYocGF0aF9ydG4sICIvZGV2L21hcHBlci8lZC0lZCIsIG1ham9yLCBtaW5vcik7CisJLy8gciA9IG1rbm9kKHBhdGhfcnRuLCBTX0lGQkxLIHwgU19JUlVTUiB8IFNfSVdVU1IsIE1LREVWKG1ham9yLCBtaW5vcikpOworCS8qCisJICogSWYgd2UgaGF2ZSB0byBtYWtlIHRoZSBwYXRoLCB3ZSB1bmxpbmsgaXQgYWZ0ZXIgd2Ugb3BlbiBpdAorCSAqLworCS8vICp1bmxpbmtfcGF0aCA9IDE7CisJLy8gcmV0dXJuIHIgPyAtZXJybm8gOiAwOworfQorCitzdGF0aWMgaW50IF9jbG9nX2N0cihjaGFyICp1dWlkLCB1aW50NjRfdCBsdWlkLAorCQkgICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgdWludDY0X3QgZGV2aWNlX3NpemUpCit7CisJaW50IGk7CisJaW50IHIgPSAwOworCWNoYXIgKnA7CisJdWludDY0X3QgcmVnaW9uX3NpemU7CisJdWludDY0X3QgcmVnaW9uX2NvdW50OworCXN0cnVjdCBsb2dfYyAqbGMgPSBOVUxMOworCWVudW0gc3luYyBsb2dfc3luYyA9IERFRkFVTFRTWU5DOworCXVpbnQzMl90IGJsb2NrX29uX2Vycm9yID0gMDsKKworCWludCBkaXNrX2xvZzsKKwljaGFyIGRpc2tfcGF0aFsxMjhdOworCWludCB1bmxpbmtfcGF0aCA9IDA7CisJbG9uZyBwYWdlX3NpemU7CisJaW50IHBhZ2VzOworCisJLyogSWYgY29yZSBsb2cgcmVxdWVzdCwgdGhlbiBhcmd2WzBdIHdpbGwgYmUgcmVnaW9uX3NpemUgKi8KKwlpZiAoIXN0cnRvbGwoYXJndlswXSwgJnAsIDApIHx8ICpwKSB7CisJCWRpc2tfbG9nID0gMTsKKworCQlpZiAoKGFyZ2MgPCAyKSB8fCAoYXJnYyA+IDQpKSB7CisJCQlMT0dfRVJST1IoIlRvbyAlcyBhcmd1bWVudHMgdG8gY2x1c3RlcmVkLWRpc2sgbG9nIHR5cGUiLAorCQkJCSAgKGFyZ2MgPCAzKSA/ICJmZXciIDogIm1hbnkiKTsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisKKwkJciA9IGZpbmRfZGlza19wYXRoKGFyZ3ZbMF0sIGRpc2tfcGF0aCwgJnVubGlua19wYXRoKTsKKwkJaWYgKHIpIHsKKwkJCUxPR19FUlJPUigiVW5hYmxlIHRvIGZpbmQgcGF0aCB0byBkZXZpY2UgJXMiLCBhcmd2WzBdKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlMT0dfREJHKCJDbHVzdGVyZWQgbG9nIGRpc2sgaXMgJXMiLCBkaXNrX3BhdGgpOworCX0gZWxzZSB7CisJCWRpc2tfbG9nID0gMDsKKworCQlpZiAoKGFyZ2MgPCAxKSB8fCAoYXJnYyA+IDMpKSB7CisJCQlMT0dfRVJST1IoIlRvbyAlcyBhcmd1bWVudHMgdG8gY2x1c3RlcmVkLWNvcmUgbG9nIHR5cGUiLAorCQkJCSAgKGFyZ2MgPCAyKSA/ICJmZXciIDogIm1hbnkiKTsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKCEocmVnaW9uX3NpemUgPSBzdHJ0b2xsKGFyZ3ZbZGlza19sb2ddLCAmcCwgMCkpIHx8ICpwKSB7CisJCUxPR19FUlJPUigiSW52YWxpZCByZWdpb25fc2l6ZSBhcmd1bWVudCB0byBjbHVzdGVyZWQtJXMgbG9nIHR5cGUiLAorCQkJICAoZGlza19sb2cpID8gImRpc2siIDogImNvcmUiKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZWdpb25fY291bnQgPSBkZXZpY2Vfc2l6ZSAvIHJlZ2lvbl9zaXplOworCWlmIChkZXZpY2Vfc2l6ZSAlIHJlZ2lvbl9zaXplKSB7CisJCS8qCisJCSAqIEkgY2FuJ3QgcmVtZW1iZXIgaWYgZGV2aWNlX3NpemUgbXVzdCBiZSBhIG11bHRpcGxlCisJCSAqIG9mIHJlZ2lvbl9zaXplLCBzbyBjaGVjayBpdCBhbnl3YXkuCisJCSAqLworCQlyZWdpb25fY291bnQrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICJzeW5jIikpCisJCQlsb2dfc3luYyA9IEZPUkNFU1lOQzsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9zeW5jIikpCisJCQlsb2dfc3luYyA9IE5PU1lOQzsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiYmxvY2tfb25fZXJyb3IiKSkKKwkJCWJsb2NrX29uX2Vycm9yID0gMTsKKwl9CisKKwlsYyA9IGRtX3phbGxvYyhzaXplb2YoKmxjKSk7CisJaWYgKCFsYykgeworCQlMT0dfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBjbHVzdGVyIGxvZyBjb250ZXh0Iik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbGMtPnJlZ2lvbl9zaXplID0gcmVnaW9uX3NpemU7CisJbGMtPnJlZ2lvbl9jb3VudCA9IHJlZ2lvbl9jb3VudDsKKwlsYy0+c3luYyA9IGxvZ19zeW5jOworCWxjLT5ibG9ja19vbl9lcnJvciA9IGJsb2NrX29uX2Vycm9yOworCWxjLT5zeW5jX3NlYXJjaCA9IDA7CisJbGMtPnJlY292ZXJpbmdfcmVnaW9uID0gKHVpbnQ2NF90KS0xOworCWxjLT5za2lwX2JpdF93YXJuaW5nID0gcmVnaW9uX2NvdW50OworCWxjLT5kaXNrX2ZkID0gLTE7CisJbGMtPmxvZ19kZXZfZmFpbGVkID0gMDsKKwlzdHJuY3B5KGxjLT51dWlkLCB1dWlkLCBETV9VVUlEX0xFTik7CisJbGMtPmx1aWQgPSBsdWlkOworCisJaWYgKGdldF9sb2cobGMtPnV1aWQsIGxjLT5sdWlkKSB8fAorCSAgICBnZXRfcGVuZGluZ19sb2cobGMtPnV1aWQsIGxjLT5sdWlkKSkgeworCQlMT0dfRVJST1IoIlslcy8lIiBQUkl1NjQgInVdIExvZyBhbHJlYWR5IGV4aXN0cywgdW5hYmxlIHRvIGNyZWF0ZS4iLAorCQkJICBTSE9SVF9VVUlEKGxjLT51dWlkKSwgbGMtPmx1aWQpOworCQlkbV9mcmVlKGxjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG1fbGlzdF9pbml0KCZsYy0+bWFya19saXN0KTsKKworCWxjLT5jbGVhbl9iaXRzID0gZG1fYml0c2V0X2NyZWF0ZShOVUxMLCByZWdpb25fY291bnQpOworCWlmICghbGMtPmNsZWFuX2JpdHMpIHsKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgY2xlYW4gYml0c2V0Iik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbGMtPnN5bmNfYml0cyA9IGRtX2JpdHNldF9jcmVhdGUoTlVMTCwgcmVnaW9uX2NvdW50KTsKKwlpZiAoIWxjLT5zeW5jX2JpdHMpIHsKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgc3luYyBiaXRzZXQiKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGxvZ19zeW5jID09IE5PU1lOQykKKwkJZG1fYml0X3NldF9hbGwobGMtPnN5bmNfYml0cyk7CisKKwlsYy0+c3luY19jb3VudCA9IChsb2dfc3luYyA9PSBOT1NZTkMpID8gcmVnaW9uX2NvdW50IDogMDsKKworCWlmIChkaXNrX2xvZykgeworCQlpZiAoKHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKSkgPCAwKSB7CisJCQlMT0dfRVJST1IoIlVuYWJsZSB0byByZWFkIHBhZ2VzaXplOiAlcyIsCisJCQkJICBzdHJlcnJvcihlcnJubykpOworCQkJciA9IGVycm5vOworCQkJZ290byBmYWlsOworCQl9CisJCXBhZ2VzID0gKihsYy0+Y2xlYW5fYml0cykgLyBwYWdlX3NpemU7CisJCXBhZ2VzICs9ICoobGMtPmNsZWFuX2JpdHMpICUgcGFnZV9zaXplID8gMSA6IDA7CisJCXBhZ2VzICs9IDE7IC8qIGZvciBoZWFkZXIgKi8KKworCQlyID0gb3BlbihkaXNrX3BhdGgsIE9fUkRXUiB8IE9fRElSRUNUKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlMT0dfRVJST1IoIlVuYWJsZSB0byBvcGVuIGxvZyBkZXZpY2UsICVzOiAlcyIsCisJCQkJICBkaXNrX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyID0gZXJybm87CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHVubGlua19wYXRoKQorCQkJaWYgKHVubGluayhkaXNrX3BhdGgpIDwgMCkgeworCQkJCUxPR19EQkcoIldhcm5pbmc6IFVuYWJsZSB0byB1bmxpbmsgbG9nIGRldmljZSwgJXM6ICVzIiwKKwkJCQkJZGlza19wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCisJCWxjLT5kaXNrX2ZkID0gcjsKKwkJbGMtPmRpc2tfc2l6ZSA9IHBhZ2VzICogcGFnZV9zaXplOworCisJCXIgPSBwb3NpeF9tZW1hbGlnbigmKGxjLT5kaXNrX2J1ZmZlciksIHBhZ2Vfc2l6ZSwKKwkJCQkgICBsYy0+ZGlza19zaXplKTsKKwkJaWYgKHIpIHsKKwkJCUxPR19FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlza19idWZmZXIiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQltZW1zZXQobGMtPmRpc2tfYnVmZmVyLCAwLCBsYy0+ZGlza19zaXplKTsKKwkJTE9HX0RCRygiRGlzayBsb2cgcmVhZHkiKTsKKwl9CisKKwlkbV9saXN0X2FkZCgmbG9nX3BlbmRpbmdfbGlzdCwgJmxjLT5saXN0KTsKKworCXJldHVybiAwOworZmFpbDoKKwlpZiAobGMpIHsKKwkJaWYgKGxjLT5kaXNrX2ZkID49IDAgJiYgY2xvc2UobGMtPmRpc2tfZmQpKQorCQkJTE9HX0VSUk9SKCJDbG9zZSBkZXZpY2UgZXJyb3IsICVzOiAlcyIsCisJCQkJICBkaXNrX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCWZyZWUobGMtPmRpc2tfYnVmZmVyKTsKKwkJZG1fZnJlZShsYy0+c3luY19iaXRzKTsKKwkJZG1fZnJlZShsYy0+Y2xlYW5fYml0cyk7CisJCWRtX2ZyZWUobGMpOworCX0KKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIGNsb2dfY3RyCisgKiBAcnEKKyAqCisgKiBycS0+ZGF0YSBzaG91bGQgY29udGFpbiBjb25zdHJ1Y3RvciBzdHJpbmcgYXMgZm9sbG93czoKKyAqCTxsb2dfdHlwZT4gW2Rpc2tdIDxyZWdpb25fc2l6ZT4gW1tub11zeW5jXSA8ZGV2aWNlX2xlbj4KKyAqIFRoZSBrZXJuZWwgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgPGRldl9sZW4+IGFyZ3VtZW50CisgKiB0byB0aGUgZW5kOyBvdGhlcndpc2UsIHdlIGNhbm5vdCBjb21wdXRlIHRoZSByZWdpb25fY291bnQuCisgKgorICogRklYTUU6IEN1cnJlbnRseSByZWxpZXMgb24gY2FsbGVyIHRvIGZpbGwgaW4gcnEtPmVycm9yCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19kdHIoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpOworc3RhdGljIGludCBjbG9nX2N0cihzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlpbnQgYXJnYywgaSwgciA9IDA7CisJY2hhciAqcCwgKiphcmd2ID0gTlVMTDsKKwljaGFyICpkZXZfc2l6ZV9zdHI7CisJdWludDY0X3QgZGV2aWNlX3NpemU7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCFycS0+ZGF0YV9zaXplKSB7CisJCUxPR19FUlJPUigiUmVjZWl2ZWQgY29uc3RydWN0b3IgcmVxdWVzdCB3aXRoIG5vIGRhdGEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cmxlbihycS0+ZGF0YSkgPiBycS0+ZGF0YV9zaXplKSB7CisJCUxPR19FUlJPUigiUmVjZWl2ZWQgY29uc3RydWN0b3IgcmVxdWVzdCB3aXRoIGJhZCBkYXRhIik7CisJCUxPR19FUlJPUigic3RybGVuKHJxLT5kYXRhKVslZF0gIT0gcnEtPmRhdGFfc2l6ZVslbGx1XSIsCisJCQkgIChpbnQpc3RybGVuKHJxLT5kYXRhKSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+ZGF0YV9zaXplKTsKKwkJTE9HX0VSUk9SKCJycS0+ZGF0YSA9ICclcycgWyVkXSIsCisJCQkgIHJxLT5kYXRhLCAoaW50KXN0cmxlbihycS0+ZGF0YSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTcGxpdCB1cCBhcmdzICovCisJZm9yIChhcmdjID0gMCwgcCA9IHJxLT5kYXRhOyAocCA9IHN0cnN0cihwLCAiICIpKTsgcCsrLCBhcmdjKyspCisJCSpwID0gJ1wwJzsKKworCWlmICghYXJnYykgeworCQlMT0dfRVJST1IoIlJlY2VpdmVkIGNvbnN0cnVjdG9yIHJlcXVlc3Qgd2l0aCBiYWQgZGF0YSAlcyIsCisJCQkgIHJxLT5kYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXJndiA9IG1hbGxvYyhhcmdjICogc2l6ZW9mKGNoYXIgKikpOworCWlmICghYXJndikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwID0gZGV2X3NpemVfc3RyID0gcnEtPmRhdGE7CisJcCArPSBzdHJsZW4ocCkgKyAxOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyssIHAgPSBwICsgc3RybGVuKHApICsgMSkKKwkJYXJndltpXSA9IHA7CisKKwlpZiAoc3RyY21wKGFyZ3ZbMF0sICJjbHVzdGVyZWQtZGlzayIpICYmCisJICAgIHN0cmNtcChhcmd2WzBdLCAiY2x1c3RlcmVkLWNvcmUiKSkgeworCQlMT0dfRVJST1IoIlVuc3VwcG9ydGVkIHVzZXJzcGFjZSBsb2cgdHlwZSwgXCIlc1wiIiwgYXJndlswXSk7CisJCWZyZWUoYXJndik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKGRldmljZV9zaXplID0gc3RydG9sbChkZXZfc2l6ZV9zdHIsICZwLCAwKSkgfHwgKnApIHsKKwkJTE9HX0VSUk9SKCJJbnZhbGlkIGRldmljZSBzaXplIGFyZ3VtZW50OiAlcyIsIGRldl9zaXplX3N0cik7CisJCWZyZWUoYXJndik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBfY2xvZ19jdHIocnEtPnV1aWQsIHJxLT5sdWlkLCBhcmdjIC0gMSwgYXJndiArIDEsIGRldmljZV9zaXplKTsKKworCS8qIFdlIGpvaW4gdGhlIENQRyB3aGVuIHdlIHJlc3VtZSAqLworCisJLyogTm8gcmV0dXJuaW5nIGRhdGEgKi8KKwlpZiAoKHJxLT52ZXJzaW9uID4gMSkgJiYgIXN0cmNtcChhcmd2WzBdLCAiY2x1c3RlcmVkLWRpc2siKSkKKwkJcnEtPmRhdGFfc2l6ZSA9IHNwcmludGYocnEtPmRhdGEsICIlcyIsIGFyZ3ZbMV0pICsgMTsKKwllbHNlCisJCXJxLT5kYXRhX3NpemUgPSAwOworCisJaWYgKHIpIHsKKwkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGNsdXN0ZXIgbG9nICglcykiLCBycS0+dXVpZCk7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCQlMT0dfRVJST1IoImFyZ3ZbJWRdID0gJXMiLCBpLCBhcmd2W2ldKTsKKwl9CisJZWxzZQorCQlMT0dfREJHKCJbJXNdIENsdXN0ZXIgbG9nIGNyZWF0ZWQiLAorCQkJU0hPUlRfVVVJRChycS0+dXVpZCkpOworCisJZnJlZShhcmd2KTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIGNsb2dfZHRyCisgKiBAcnEKKyAqCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19kdHIoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IGxvZ19jICpsYyA9IGdldF9sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmIChsYykgeworCQkvKgorCQkgKiBUaGUgbG9nIHNob3VsZCBub3QgYmUgb24gdGhlIG9mZmljaWFsIGxpc3QuICBUaGVyZQorCQkgKiBzaG91bGQgaGF2ZSBiZWVuIGEgc3VzcGVuZCBmaXJzdC4KKwkJICovCisJCUxPR19FUlJPUigiWyVzXSBEVFIgYmVmb3JlIFNVUzogbGVhdmluZyBDUEciLAorCQkJICBTSE9SVF9VVUlEKHJxLT51dWlkKSk7CisJCWRlc3Ryb3lfY2x1c3Rlcl9jcGcocnEtPnV1aWQpOworCX0gZWxzZSBpZiAoIShsYyA9IGdldF9wZW5kaW5nX2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpKSkgeworCQlMT0dfRVJST1IoImNsb2dfZHRyIGNhbGxlZCBvbiBsb2cgdGhhdCBpcyBub3Qgb2ZmaWNpYWwgb3IgcGVuZGluZyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlMT0dfREJHKCJbJXNdIENsdXN0ZXIgbG9nIHJlbW92ZWQiLCBTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisKKwlkbV9saXN0X2RlbCgmbGMtPmxpc3QpOworCWlmIChsYy0+ZGlza19mZCAhPSAtMSAmJiBjbG9zZShsYy0+ZGlza19mZCkpCisJCUxPR19FUlJPUigiRmFpbGVkIHRvIGNsb3NlIGRpc2sgbG9nOiAlcyIsCisJCQkgIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGxjLT5kaXNrX2J1ZmZlcikKKwkJZnJlZShsYy0+ZGlza19idWZmZXIpOworCWRtX2ZyZWUobGMtPmNsZWFuX2JpdHMpOworCWRtX2ZyZWUobGMtPnN5bmNfYml0cyk7CisJZG1fZnJlZShsYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfcHJlc3VzcGVuZAorICogQHJxCisgKgorICovCitzdGF0aWMgaW50IGNsb2dfcHJlc3VzcGVuZChzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGMtPnRvdWNoZWQpCisJCUxPR19EQkcoIldBUk5JTkc6IGxvZyBzdGlsbCBtYXJrZWQgYXMgJ3RvdWNoZWQnIGR1cmluZyBzdXNwZW5kIik7CisKKwlsYy0+cmVjb3ZlcnlfaGFsdGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogY2xvZ19wb3N0c3VzcGVuZAorICogQHJxCisgKgorICovCitzdGF0aWMgaW50IGNsb2dfcG9zdHN1c3BlbmQoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IGxvZ19jICpsYyA9IGdldF9sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmICghbGMpCisJCXJldHVybiAtRUlOVkFMOworCisJTE9HX0RCRygiWyVzXSBjbG9nX3Bvc3RzdXNwZW5kOiBsZWF2aW5nIENQRyIsIFNIT1JUX1VVSUQobGMtPnV1aWQpKTsKKwlkZXN0cm95X2NsdXN0ZXJfY3BnKHJxLT51dWlkKTsKKworCWxjLT5zdGF0ZSA9IExPR19TVVNQRU5ERUQ7CisJbGMtPnJlY292ZXJpbmdfcmVnaW9uID0gKHVpbnQ2NF90KS0xOworCWxjLT5yZWNvdmVyZXIgPSAodWludDMyX3QpLTE7CisJbGMtPmRlbGF5ID0gdGltZShOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY2x1c3Rlcl9wb3N0c3VzcGVuZAorICogQHJxCisgKgorICovCitpbnQgY2x1c3Rlcl9wb3N0c3VzcGVuZChjaGFyICp1dWlkLCB1aW50NjRfdCBsdWlkKQoreworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHV1aWQsIGx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlMT0dfREJHKCJbJXNdIGNsb2dfcG9zdHN1c3BlbmQ6IGZpbmFsaXppbmciLCBTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJbGMtPnJlc3VtZV9vdmVycmlkZSA9IDA7CisKKwkvKiBtb3ZlIGxvZyB0byBwZW5kaW5nIGxpc3QgKi8KKwlkbV9saXN0X2RlbCgmbGMtPmxpc3QpOworCWRtX2xpc3RfYWRkKCZsb2dfcGVuZGluZ19saXN0LCAmbGMtPmxpc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjbG9nX3Jlc3VtZQorICogQHJxCisgKgorICogRG9lcyB0aGUgbWFpbiB3b3JrIG9mIHJlc3VtaW5nLgorICovCitzdGF0aWMgaW50IGNsb2dfcmVzdW1lKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKQoreworCXVpbnQzMl90IGk7CisJaW50IGNvbW1pdF9sb2cgPSAwOworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisKKwlpZiAoIWxjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxjLT5pbl9zeW5jID0gMDsKKwlzd2l0Y2ggKGxjLT5yZXN1bWVfb3ZlcnJpZGUpIHsKKwljYXNlIDEwMDA6CisJCUxPR19FUlJPUigiWyVzXSBBZGRpdGlvbmFsIHJlc3VtZSBpc3N1ZWQgYmVmb3JlIHN1c3BlbmQiLAorCQkJICBTSE9SVF9VVUlEKHJxLT51dWlkKSk7CisjaWZkZWYgREVCVUcKKwkJa2lsbChnZXRwaWQoKSwgU0lHVVNSMSk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJY2FzZSAwOgorCQlsYy0+cmVzdW1lX292ZXJyaWRlID0gMTAwMDsKKwkJaWYgKGxjLT5kaXNrX2ZkID09IC0xKSB7CisJCQlMT0dfREJHKCJbJXNdIE1hc3RlciByZXN1bWUuIiwKKwkJCQlTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJCQlnb3RvIG5vX2Rpc2s7CisJCX0KKworCQlMT0dfREJHKCJbJXNdIE1hc3RlciByZXN1bWU6IHJlYWRpbmcgZGlzayBsb2ciLAorCQkJU0hPUlRfVVVJRChsYy0+dXVpZCkpOworCQljb21taXRfbG9nID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlMT0dfRVJST1IoIkVycm9yOjogcGFydGlhbCBiaXQgbG9hZGluZyAoanVzdCBzeW5jX2JpdHMpIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgMjoKKwkJTE9HX0VSUk9SKCJFcnJvcjo6IHBhcnRpYWwgYml0IGxvYWRpbmcgKGp1c3QgY2xlYW5fYml0cykiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAzOgorCQlMT0dfREJHKCJbJXNdIE5vbi1tYXN0ZXIgcmVzdW1lOiBiaXRzIHByZS1sb2FkZWQiLAorCQkJU0hPUlRfVVVJRChsYy0+dXVpZCkpOworCQlsYy0+cmVzdW1lX292ZXJyaWRlID0gMTAwMDsKKwkJZ290byBvdXQ7CisJZGVmYXVsdDoKKwkJTE9HX0VSUk9SKCJFcnJvcjo6IG11bHRpcGxlIGxvYWRpbmcgb2YgYml0cyAoJWQpIiwKKwkJCSAgbGMtPnJlc3VtZV9vdmVycmlkZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsYy0+bG9nX2Rldl9mYWlsZWQpIHsKKwkJTE9HX0VSUk9SKCJMb2cgZGV2aWNlIGhhcyBmYWlsZWQsIHVuYWJsZSB0byByZWFkIGJpdHMiKTsKKwkJcnEtPmVycm9yID0gMDsgIC8qIFdlIGNhbiBoYW5kbGUgdGhpcyBzbyBmYXIgKi8KKwkJbGMtPmRpc2tfbnJfcmVnaW9ucyA9IDA7CisJfSBlbHNlCisJCXJxLT5lcnJvciA9IHJlYWRfbG9nKGxjKTsKKworCXN3aXRjaCAocnEtPmVycm9yKSB7CisJY2FzZSAwOgorCQlpZiAobGMtPmRpc2tfbnJfcmVnaW9ucyA8IGxjLT5yZWdpb25fY291bnQpCisJCQlMT0dfREJHKCJbJXNdIE1pcnJvciBoYXMgZ3Jvd24sIHVwZGF0aW5nIGxvZyBiaXRzIiwKKwkJCQlTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJCWVsc2UgaWYgKGxjLT5kaXNrX25yX3JlZ2lvbnMgPiBsYy0+cmVnaW9uX2NvdW50KQorCQkJTE9HX0RCRygiWyVzXSBNaXJyb3IgaGFzIHNocnVuaywgdXBkYXRpbmcgbG9nIGJpdHMiLAorCQkJCVNIT1JUX1VVSUQobGMtPnV1aWQpKTsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgorCQlMT0dfREJHKCJbJXNdIChSZSlpbml0aWFsaXppbmcgbWlycm9yIGxvZyAtIHJlc3luYyBpc3N1ZWQuIiwKKwkJCVNIT1JUX1VVSUQobGMtPnV1aWQpKTsKKwkJbGMtPmRpc2tfbnJfcmVnaW9ucyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgZGlzayBsb2ciKTsKKwkJbGMtPmRpc2tfbnJfcmVnaW9ucyA9IDA7CisJCWJyZWFrOworCX0KKworbm9fZGlzazoKKwkvKiBJZiBtaXJyb3IgaGFzIGdyb3duLCBzZXQgYml0cyBhcHByb3ByaWF0ZWx5ICovCisJaWYgKGxjLT5zeW5jID09IE5PU1lOQykKKwkJZm9yIChpID0gbGMtPmRpc2tfbnJfcmVnaW9uczsgaSA8IGxjLT5yZWdpb25fY291bnQ7IGkrKykKKwkJCWxvZ19zZXRfYml0KGxjLCBsYy0+Y2xlYW5fYml0cywgaSk7CisJZWxzZQorCQlmb3IgKGkgPSBsYy0+ZGlza19ucl9yZWdpb25zOyBpIDwgbGMtPnJlZ2lvbl9jb3VudDsgaSsrKQorCQkJbG9nX2NsZWFyX2JpdChsYywgbGMtPmNsZWFuX2JpdHMsIGkpOworCisJLyogQ2xlYXIgYW55IG9sZCBiaXRzIGlmIGRldmljZSBoYXMgc2hydW5rICovCisJZm9yIChpID0gbGMtPnJlZ2lvbl9jb3VudDsgaSAlIDMyOyBpKyspCisJCWxvZ19jbGVhcl9iaXQobGMsIGxjLT5jbGVhbl9iaXRzLCBpKTsKKworCS8qIGNvcHkgY2xlYW4gYWNyb3NzIHRvIHN5bmMgKi8KKwlkbV9iaXRfY29weShsYy0+c3luY19iaXRzLCBsYy0+Y2xlYW5fYml0cyk7CisKKwlpZiAoY29tbWl0X2xvZyAmJiAobGMtPmRpc2tfZmQgPj0gMCkpIHsKKwkJcnEtPmVycm9yID0gd3JpdGVfbG9nKGxjKTsKKwkJaWYgKHJxLT5lcnJvcikKKwkJCUxPR19FUlJPUigiRmFpbGVkIGluaXRpYWwgZGlzayBsb2cgd3JpdGUiKTsKKwkJZWxzZQorCQkJTE9HX0RCRygiRGlzayBsb2cgaW5pdGlhbGl6ZWQiKTsKKwkJbGMtPnRvdWNoZWQgPSAwOworCX0KK291dDoKKwkvKgorCSAqIENsZWFyIGFueSBvbGQgYml0cyBpZiBkZXZpY2UgaGFzIHNocnVuayAtIG5lY2Vzc2FyeQorCSAqIGZvciBub24tbWFzdGVyIHJlc3VtZQorCSAqLworCWZvciAoaSA9IGxjLT5yZWdpb25fY291bnQ7IGkgJSAzMjsgaSsrKSB7CisJCWxvZ19jbGVhcl9iaXQobGMsIGxjLT5jbGVhbl9iaXRzLCBpKTsKKwkJbG9nX2NsZWFyX2JpdChsYywgbGMtPnN5bmNfYml0cywgaSk7CisJfQorCisJbGMtPnN5bmNfY291bnQgPSBjb3VudF9iaXRzMzIobGMtPnN5bmNfYml0cyk7CisKKwlMT0dfU1BSSU5UKGxjLCAiWyVzXSBJbml0aWFsIHN5bmNfY291bnQgPSAlbGx1IiwKKwkJICAgU0hPUlRfVVVJRChsYy0+dXVpZCksICh1bnNpZ25lZCBsb25nIGxvbmcpbGMtPnN5bmNfY291bnQpOworCWxjLT5zeW5jX3NlYXJjaCA9IDA7CisJbGMtPnN0YXRlID0gTE9HX1JFU1VNRUQ7CisJbGMtPnJlY292ZXJ5X2hhbHRlZCA9IDA7CisKKwlyZXR1cm4gcnEtPmVycm9yOworfQorCisvKgorICogbG9jYWxfcmVzdW1lCisgKiBAcnEKKyAqCisgKiBJZiB0aGUgbG9nIGlzIHBlbmRpbmcsIHdlIG11c3QgZmlyc3Qgam9pbiB0aGUgY3BnIGFuZAorICogcHV0IHRoZSBsb2cgaW4gdGhlIG9mZmljaWFsIGxpc3QuCisgKgorICovCitpbnQgbG9jYWxfcmVzdW1lKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCXRpbWVfdCB0OworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisKKwlpZiAoIWxjKSB7CisJCS8qIElzIHRoZSBsb2cgaW4gdGhlIHBlbmRpbmcgbGlzdD8gKi8KKwkJbGMgPSBnZXRfcGVuZGluZ19sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKwkJaWYgKCFsYykgeworCQkJTE9HX0VSUk9SKCJjbG9nX3Jlc3VtZSBjYWxsZWQgb24gbG9nIHRoYXQgaXMgbm90IG9mZmljaWFsIG9yIHBlbmRpbmciKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdCA9IHRpbWUoTlVMTCk7CisJCXQgLT0gbGMtPmRlbGF5OworCQkvKgorCQkgKiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgdGVtcG9yYXJ5IGZpeC4gIEl0IGFkZHJlc3NlcworCQkgKiBhIHByb2JsZW0gdGhhdCBleGlzdHMgd2hlbiBub2RlcyBzdXNwZW5kL3Jlc3VtZSBpbiByYXBpZAorCQkgKiBzdWNjZXNzaW9uLiAgV2hpbGUgdGhlIHByb2JsZW0gaXMgdmVyeSByYXJlLCBpdCBoYXMgYmVlbgorCQkgKiBzZWVuIHRvIGhhcHBlbiBpbiByZWFsLXdvcmxkLWxpa2UgdGVzdGluZy4KKwkJICoKKwkJICogVGhlIHByb2JsZW06CisJCSAqIC0gTm9kZSBBIGpvaW5zIGNsdXN0ZXIKKwkJICogLSBOb2RlIEIgam9pbnMgY2x1c3RlcgorCQkgKiAtIE5vZGUgQSBwcmVwYXJlcyBjaGVja3BvaW50CisJCSAqIC0gTm9kZSBBIGdldHMgcmVhZHkgdG8gd3JpdGUgY2hlY2twb2ludAorCQkgKiAtIE5vZGUgQiBsZWF2ZXMKKwkJICogLSBOb2RlIEIgam9pbnMKKwkJICogLSBOb2RlIEEgZmluaXNoZXMgd3JpdGUgb2YgY2hlY2twb2ludAorCQkgKiAtIE5vZGUgQiByZWNlaXZlcyBjaGVja3BvaW50IG1lYW50IGZvciBwcmV2aW91cyBzZXNzaW9uCisJCSAqIC0tIE5vZGUgQiBjYW4gbm93IGJlIG5vbi1jb2hlcmVudAorCQkgKgorCQkgKiBUaGlzIHRpbWVyIHdpbGwgc29sdmUgdGhlIHByb2JsZW0gZm9yIG5vdywgYnV0IGNvdWxkIGJlCisJCSAqIHJlcGxhY2VkIGJ5IGEgZ2VuZXJhdGlvbiBudW1iZXIgc2VudCB3aXRoIHRoZSByZXN1bWUKKwkJICogY29tbWFuZCBmcm9tIHRoZSBrZXJuZWwuICBUaGUgZ2VuZXJhdGlvbiBudW1iZXIgd291bGQKKwkJICogYmUgaW5jbHVkZWQgaW4gdGhlIG5hbWUgb2YgdGhlIGNoZWNrcG9pbnQgdG8gcHJldmVudAorCQkgKiByZWFkaW5nIHN0YWxlIGRhdGEuCisJCSAqLworCQlpZiAoKHQgPCAzKSAmJiAodCA+PSAwKSkKKwkJCXNsZWVwKDMgLSB0KTsKKworCQkvKiBKb2luIHRoZSBDUEcgKi8KKwkJciA9IGNyZWF0ZV9jbHVzdGVyX2NwZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCQlpZiAocikgeworCQkJTE9HX0VSUk9SKCJjbG9nX3Jlc3VtZTogIEZhaWxlZCB0byBjcmVhdGUgY2x1c3RlciBDUEciKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJLyogbW92ZSBsb2cgdG8gb2ZmaWNpYWwgbGlzdCAqLworCQlkbV9saXN0X2RlbCgmbGMtPmxpc3QpOworCQlkbV9saXN0X2FkZCgmbG9nX2xpc3QsICZsYy0+bGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjbG9nX2dldF9yZWdpb25fc2l6ZQorICogQHJxCisgKgorICogU2luY2UgdGhpcyB2YWx1ZSBkb2Vzbid0IGNoYW5nZSwgdGhlIGtlcm5lbAorICogc2hvdWxkIG5vdCBuZWVkIHRvIHRhbGsgdG8gc2VydmVyIHRvIGdldCB0aGlzCisgKiBUaGUgZnVuY3Rpb24gaXMgaGVyZSBmb3IgY29tcGxldG5lc3MKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FWFhYIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBjbG9nX2dldF9yZWdpb25fc2l6ZShzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwl1aW50NjRfdCAqcnRuID0gKHVpbnQ2NF90ICopcnEtPmRhdGE7CisJc3RydWN0IGxvZ19jICpsYyA9IGdldF9sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmICghbGMgJiYgIShsYyA9IGdldF9wZW5kaW5nX2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqcnRuID0gbGMtPnJlZ2lvbl9zaXplOworCXJxLT5kYXRhX3NpemUgPSBzaXplb2YoKnJ0bik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfaXNfY2xlYW4KKyAqIEBycQorICoKKyAqIFJldHVybnM6IDEgaWYgY2xlYW4sIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19pc19jbGVhbihzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlpbnQ2NF90ICpydG4gPSAoaW50NjRfdCAqKXJxLT5kYXRhOworCXVpbnQ2NF90ICpyZWdpb24gPSAodWludDY0X3QgKilycS0+ZGF0YTsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqcnRuID0gbG9nX3Rlc3RfYml0KGxjLT5jbGVhbl9iaXRzLCAqcmVnaW9uKTsKKwlycS0+ZGF0YV9zaXplID0gc2l6ZW9mKCpydG4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjbG9nX2luX3N5bmMKKyAqIEBycQorICoKKyAqIFdlIGlnbm9yZSBhbnkgcmVxdWVzdCBmb3Igbm9uLWJsb2NrLiAgVGhhdAorICogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlLiAgKElmIHRoZSByZXF1ZXN0CisgKiBoYXMgY29tZSB0aGlzIGZhciwgaXQgaGFzIGFscmVhZHkgYmxvY2tlZC4pCisgKgorICogUmV0dXJuczogMSBpZiBpbi1zeW5jLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGNsb2dfaW5fc3luYyhzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlpbnQ2NF90ICpydG4gPSAoaW50NjRfdCAqKXJxLT5kYXRhOworCXVpbnQ2NF90ICpyZWdpb25fcCA9ICh1aW50NjRfdCAqKXJxLT5kYXRhOworCXVpbnQ2NF90IHJlZ2lvbiA9ICpyZWdpb25fcDsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVnaW9uID4gbGMtPnJlZ2lvbl9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqcnRuID0gbG9nX3Rlc3RfYml0KGxjLT5zeW5jX2JpdHMsIHJlZ2lvbik7CisKKwkvKgorCSAqIElmIHRoZSBtaXJyb3Igd2FzIHN1Y2Nlc3NmdWxseSByZWNvdmVyZWQsIHdlIHdhbnQgdG8gYWx3YXlzCisJICogZm9yY2UgZXZlcnkgbWFjaGluZSB0byB3cml0ZSB0byBhbGwgZGV2aWNlcyAtIG90aGVyd2lzZSwKKwkgKiBjb3JydXB0aW9uIHdpbGwgb2NjdXIuICBIZXJlJ3MgaG93OgorCSAqICAgIE5vZGUxIHN1ZmZlcnMgYSBmYWlsdXJlIGFuZCBtYXJrcyBhIHJlZ2lvbiBvdXQtb2Ytc3luYworCSAqICAgIE5vZGUyIGF0dGVtcHRzIGEgd3JpdGUsIGdldHMgYnkgaXNfcmVtb3RlX3JlY292ZXJpbmcsCisgICAJICogICAgICAgICAgYW5kIHF1ZXJpZXMgdGhlIHN5bmMgc3RhdHVzIG9mIHRoZSByZWdpb24gLSBmaW5kaW5nCisJICoJICAgIGl0IG91dC1vZi1zeW5jLgorCSAqICAgIE5vZGUyIHRoaW5rcyB0aGUgd3JpdGUgc2hvdWxkIGJlIGEgbm9zeW5jIHdyaXRlLCBidXQgaXQKKwkgKiAgICAgICAgICBoYXNuJ3Qgc3VmZmVyZWQgdGhlIGRyaXZlIGZhaWx1cmUgdGhhdCBOb2RlMSBoYXMgeWV0LgorCSAqICAgICAgICAgIEl0IHRoZW4gaXNzdWVzIGEgZ2VuZXJpY19tYWtlX3JlcXVlc3QgZGlyZWN0bHkgdG8KKwkgKiAgICAgICAgICB0aGUgcHJpbWFyeSBpbWFnZSBvbmx5IC0gd2hpY2ggaXMgZXhhY3RseSB0aGUgZGV2aWNlCisJICogICAgICAgICAgdGhhdCBoYXMgc3VmZmVyZWQgdGhlIGZhaWx1cmUuCisJICogICAgTm9kZTIgc3VmZmVycyBhIGxvc3Qgd3JpdGUgLSB3aGljaCBjb21wbGV0ZWx5IGJ5cGFzc2VzIHRoZQorCSAqICAgICAgICAgIG1pcnJvciBsYXllciBiZWNhdXNlIGl0IGhhZCBnb25lIHRocm91Z2ggZ2VuZXJpY19tX3IuCisJICogICAgVGhlIGZpbGUgc3lzdGVtIHdpbGwgbGlrZWx5IGV4cGxvZGUgYXQgdGhpcyBwb2ludCBkdWUgdG8KKwkgKiAgICBJL08gZXJyb3JzLiAgSWYgaXQgd2Fzbid0IHRoZSBwcmltYXJ5IHRoYXQgZmFpbGVkLCBpdCBpcworCSAqICAgIGVhc2lseSBwb3NzaWJsZSBpbiB0aGlzIGNhc2UgdG8gaXNzdWUgd3JpdGVzIHRvIGp1c3Qgb25lCisJICogICAgb2YgdGhlIHJlbWFpbmluZyBpbWFnZXMgLSBhbHNvIGxlYXZpbmcgdGhlIG1pcnJvciBpbmNvbnNpc3RlbnQuCisJICoKKwkgKiBXZSBsZXQgaW5fc3luYygpIHJldHVybiAxIGluIGEgY2x1c3RlciByZWdhcmRsZXNzIG9mIHdoYXQgaXMKKwkgKiBpbiB0aGUgYml0bWFwIG9uY2UgcmVjb3ZlcnkgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb24gYQorCSAqIG1pcnJvci4gIFRoaXMgZW5zdXJlcyB0aGUgbWlycm9yaW5nIGNvZGUgd2lsbCBjb250aW51ZSB0bworCSAqIGF0dGVtcHQgdG8gd3JpdGUgdG8gYWxsIG1pcnJvciBpbWFnZXMuICBUaGUgd29yc3QgdGhhdCBjYW4KKwkgKiBoYXBwZW4gZm9yIHJlYWRzIGlzIHRoYXQgYWRkaXRpb25hbCByZWFkIGF0dGVtcHRzIG1heSBiZQorCSAqIHRha2VuLgorCSAqCisJICogRnV0aGVyIGludmVzdGlnYXRpb24gbWF5IGJlIHJlcXVpcmVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUKKwkgKiBzaW1pbGFyIHBvc3NpYmxlIG91dGNvbWVzIHdoZW4gdGhlIG1pcnJvciBpcyBpbiB0aGUgcHJvY2VzcyBvZgorCSAqIHJlY292ZXJpbmcuICBJbiB0aGF0IGNhc2UsIGxjLT5pbl9zeW5jIHdvdWxkIG5vdCBoYXZlIGJlZW4gc2V0CisJICogeWV0LgorCSAqLworCWlmICghKnJ0biAmJiBsYy0+aW5fc3luYykKKwkJKnJ0biA9IDE7CisKKwlpZiAoKnJ0bikKKwkJTE9HX0RCRygiWyVzXSBSZWdpb24gaXMgaW4tc3luYzogJWxsdSIsCisJCQlTSE9SVF9VVUlEKGxjLT51dWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24pOworCWVsc2UKKwkJTE9HX0RCRygiWyVzXSBSZWdpb24gaXMgbm90IGluLXN5bmM6ICVsbHUiLAorCQkJU0hPUlRfVVVJRChsYy0+dXVpZCksICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uKTsKKworCXJxLT5kYXRhX3NpemUgPSBzaXplb2YoKnJ0bik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfZmx1c2gKKyAqIEBycQorICoKKyAqLworc3RhdGljIGludCBjbG9nX2ZsdXNoKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxLCBpbnQgc2VydmVyKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWxjLT50b3VjaGVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRG8gdGhlIGFjdHVhbCBmbHVzaGluZyBvZiB0aGUgbG9nIG9ubHkKKwkgKiBpZiB3ZSBhcmUgdGhlIHNlcnZlci4KKwkgKi8KKwlpZiAoc2VydmVyICYmIChsYy0+ZGlza19mZCA+PSAwKSkgeworCQlyID0gcnEtPmVycm9yID0gd3JpdGVfbG9nKGxjKTsKKwkJaWYgKHIpCisJCQlMT0dfRVJST1IoIlslc10gRXJyb3Igd3JpdGluZyB0byBkaXNrIGxvZyIsCisJCQkJICBTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJCWVsc2UgCisJCQlMT0dfREJHKCJbJXNdIERpc2sgbG9nIHdyaXR0ZW4iLCBTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJfQorCisJbGMtPnRvdWNoZWQgPSAwOworCisJcmV0dXJuIHI7CisKK30KKworLyoKKyAqIG1hcmtfcmVnaW9uCisgKiBAbGMKKyAqIEByZWdpb24KKyAqIEB3aG8KKyAqCisgKiBQdXQgYSBtYXJrIHJlZ2lvbiByZXF1ZXN0IGluIHRoZSB0cmVlIGZvciB0cmFja2luZy4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FWFhYIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbWFya19yZWdpb24oc3RydWN0IGxvZ19jICpsYywgdWludDY0X3QgcmVnaW9uLCB1aW50MzJfdCB3aG8pCit7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgbWFya19lbnRyeSAqbTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhtLCAmbGMtPm1hcmtfbGlzdCkKKwkJaWYgKG0tPnJlZ2lvbiA9PSByZWdpb24pIHsKKwkJCWZvdW5kID0gMTsKKwkJCWlmIChtLT5ub2RlaWQgPT0gd2hvKQorCQkJCXJldHVybiAwOworCQl9CisKKwlpZiAoIWZvdW5kKQorCQlsb2dfY2xlYXJfYml0KGxjLCBsYy0+Y2xlYW5fYml0cywgcmVnaW9uKTsKKworCS8qCisJICogU2F2ZSBhbGxvY2F0aW9uIHVudGlsIGhlcmUgLSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUsCisJICogYXQgbGVhc3Qgd2UgaGF2ZSBjbGVhcmVkIHRoZSBiaXQuCisJICovCisJbSA9IG1hbGxvYyhzaXplb2YoKm0pKTsKKwlpZiAoIW0pIHsKKwkJTE9HX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIG1hcmtfZW50cnk6ICVsbHUvJXUiLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbiwgd2hvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbS0+bm9kZWlkID0gd2hvOworCW0tPnJlZ2lvbiA9IHJlZ2lvbjsKKwlkbV9saXN0X2FkZCgmbGMtPm1hcmtfbGlzdCwgJm0tPmxpc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjbG9nX21hcmtfcmVnaW9uCisgKiBAcnEKKyAqCisgKiBycSBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIG1hcmsgcmVxdWVzdC4gIFdlCisgKiBjYW4gZGV0ZXJtaW5lIHRoZSBudW1iZXIgZnJvbSB0aGUgJ2RhdGFfc2l6ZScgZmllbGQuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRVhYWCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19tYXJrX3JlZ2lvbihzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSwgdWludDMyX3Qgb3JpZ2luYXRvcikKK3sKKwlpbnQgcjsKKwlpbnQgY291bnQ7CisJdWludDY0X3QgKnJlZ2lvbjsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocnEtPmRhdGFfc2l6ZSAlIHNpemVvZih1aW50NjRfdCkpIHsKKwkJTE9HX0VSUk9SKCJCYWQgZGF0YSBzaXplIGdpdmVuIGZvciBtYXJrX3JlZ2lvbiByZXF1ZXN0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvdW50ID0gcnEtPmRhdGFfc2l6ZSAvIHNpemVvZih1aW50NjRfdCk7CisJcmVnaW9uID0gKHVpbnQ2NF90ICopJnJxLT5kYXRhOworCisJZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSwgcmVnaW9uKyspIHsKKwkJciA9IG1hcmtfcmVnaW9uKGxjLCAqcmVnaW9uLCBvcmlnaW5hdG9yKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlycS0+ZGF0YV9zaXplID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsZWFyX3JlZ2lvbihzdHJ1Y3QgbG9nX2MgKmxjLCB1aW50NjRfdCByZWdpb24sIHVpbnQzMl90IHdobykKK3sKKwlpbnQgb3RoZXJfbWF0Y2hlcyA9IDA7CisJc3RydWN0IG1hcmtfZW50cnkgKm0sICpuOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUobSwgbiwgJmxjLT5tYXJrX2xpc3QpCisJCWlmIChtLT5yZWdpb24gPT0gcmVnaW9uKSB7CisJCQlpZiAobS0+bm9kZWlkID09IHdobykgeworCQkJCWRtX2xpc3RfZGVsKCZtLT5saXN0KTsKKwkJCQlmcmVlKG0pOworCQkJfSBlbHNlCisJCQkJb3RoZXJfbWF0Y2hlcyA9IDE7CisJCX0KKworCS8qCisJICogQ2xlYXIgcmVnaW9uIGlmOgorCSAqICAxKSBJdCBpcyBpbi1zeW5jCisJICogIDIpIFRoZXJlIGFyZSBubyBvdGhlciBtYWNoaW5lcyB0aGF0IGhhdmUgaXQgbWFya2VkCisJICovCisJaWYgKCFvdGhlcl9tYXRjaGVzICYmIGxvZ190ZXN0X2JpdChsYy0+c3luY19iaXRzLCByZWdpb24pKQorCQlsb2dfc2V0X2JpdChsYywgbGMtPmNsZWFuX2JpdHMsIHJlZ2lvbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfY2xlYXJfcmVnaW9uCisgKiBAcnEKKyAqCisgKiBycSBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIGNsZWFyIHJlcXVlc3QuICBXZQorICogY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIGZyb20gdGhlICdkYXRhX3NpemUnIGZpZWxkLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVYWFggb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGNsb2dfY2xlYXJfcmVnaW9uKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxLCB1aW50MzJfdCBvcmlnaW5hdG9yKQoreworCWludCByOworCWludCBjb3VudDsKKwl1aW50NjRfdCAqcmVnaW9uOworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisKKwlpZiAoIWxjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChycS0+ZGF0YV9zaXplICUgc2l6ZW9mKHVpbnQ2NF90KSkgeworCQlMT0dfRVJST1IoIkJhZCBkYXRhIHNpemUgZ2l2ZW4gZm9yIGNsZWFyX3JlZ2lvbiByZXF1ZXN0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvdW50ID0gcnEtPmRhdGFfc2l6ZSAvIHNpemVvZih1aW50NjRfdCk7CisJcmVnaW9uID0gKHVpbnQ2NF90ICopJnJxLT5kYXRhOworCisJZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSwgcmVnaW9uKyspIHsKKwkJciA9IGNsZWFyX3JlZ2lvbihsYywgKnJlZ2lvbiwgb3JpZ2luYXRvcik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcnEtPmRhdGFfc2l6ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfZ2V0X3Jlc3luY193b3JrCisgKiBAcnEKKyAqCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19nZXRfcmVzeW5jX3dvcmsoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEsIHVpbnQzMl90IG9yaWdpbmF0b3IpCit7CisJc3RydWN0IHsKKwkJaW50NjRfdCBpOworCQl1aW50NjRfdCByOworCX0gKnBrZyA9ICh2b2lkICopcnEtPmRhdGE7CisJc3RydWN0IGxvZ19jICpsYyA9IGdldF9sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmICghbGMpCisJCXJldHVybiAtRUlOVkFMOworCisJcnEtPmRhdGFfc2l6ZSA9IHNpemVvZigqcGtnKTsKKwlwa2ctPmkgPSAwOworCisJaWYgKGxjLT5zeW5jX3NlYXJjaCA+PSBsYy0+cmVnaW9uX2NvdW50KSB7CisJCS8qCisJCSAqIEZJWE1FOiBoYW5kbGUgaW50ZXJtaXR0ZW50IGVycm9ycyBkdXJpbmcgcmVjb3ZlcnkKKwkJICogYnkgcmVzZXR0aW5nIHN5bmNfc2VhcmNoLi4uIGJ1dCBub3QgdG8gbWFueSB0aW1lcy4KKwkJICovCisJCUxPR19TUFJJTlQobGMsICJHRVQgLSBTRVEjPSV1LCBVVUlEPSVzLCBub2RlaWQgPSAldTo6ICIKKwkJCSAgICJSZWNvdmVyeSBmaW5pc2hlZCIsCisJCQkgICBycS0+c2VxLCBTSE9SVF9VVUlEKGxjLT51dWlkKSwgb3JpZ2luYXRvcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsYy0+cmVjb3ZlcmluZ19yZWdpb24gIT0gKHVpbnQ2NF90KS0xKSB7CisJCWlmIChsYy0+cmVjb3ZlcmVyID09IG9yaWdpbmF0b3IpIHsKKwkJCUxPR19TUFJJTlQobGMsICJHRVQgLSBTRVEjPSV1LCBVVUlEPSVzLCBub2RlaWQgPSAldTo6ICIKKwkJCQkgICAiUmUtcmVxdWVzdGluZyB3b3JrICglbGx1KSIsCisJCQkJICAgcnEtPnNlcSwgU0hPUlRfVVVJRChsYy0+dXVpZCksIG9yaWdpbmF0b3IsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsYy0+cmVjb3ZlcmluZ19yZWdpb24pOworCQkJcGtnLT5yID0gbGMtPnJlY292ZXJpbmdfcmVnaW9uOworCQkJcGtnLT5pID0gMTsKKwkJCUxPR19DT05EKGxvZ19yZXNlbmRfcmVxdWVzdHMsICIqKioqKiBSRS1SRVFVRVNUICoqKioqIik7CisJCX0gZWxzZSB7CisJCQlMT0dfU1BSSU5UKGxjLCAiR0VUIC0gU0VRIz0ldSwgVVVJRD0lcywgbm9kZWlkID0gJXU6OiAiCisJCQkJICAgIlNvbWVvbmUgYWxyZWFkeSByZWNvdmVyaW5nICglbGx1KSIsCisJCQkJICAgcnEtPnNlcSwgU0hPUlRfVVVJRChsYy0+dXVpZCksIG9yaWdpbmF0b3IsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsYy0+cmVjb3ZlcmluZ19yZWdpb24pOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGxjLT5yZWNvdmVyeV9yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHJlY292ZXJ5X3JlcXVlc3QgKmRlbDsKKworCQlkZWwgPSBsYy0+cmVjb3ZlcnlfcmVxdWVzdF9saXN0OworCQlsYy0+cmVjb3ZlcnlfcmVxdWVzdF9saXN0ID0gZGVsLT5uZXh0OworCisJCXBrZy0+ciA9IGRlbC0+cmVnaW9uOworCQlmcmVlKGRlbCk7CisKKwkJaWYgKCFsb2dfdGVzdF9iaXQobGMtPnN5bmNfYml0cywgcGtnLT5yKSkgeworCQkJTE9HX1NQUklOVChsYywgIkdFVCAtIFNFUSM9JXUsIFVVSUQ9JXMsIG5vZGVpZCA9ICV1OjogIgorCQkJCSAgICJBc3NpZ25pbmcgcHJpb3JpdHkgcmVzeW5jIHdvcmsgKCVsbHUpIiwKKwkJCQkgICBycS0+c2VxLCBTSE9SVF9VVUlEKGxjLT51dWlkKSwgb3JpZ2luYXRvciwKKwkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBrZy0+cik7CisJCQlwa2ctPmkgPSAxOworCQkJbGMtPnJlY292ZXJpbmdfcmVnaW9uID0gcGtnLT5yOworCQkJbGMtPnJlY292ZXJlciA9IG9yaWdpbmF0b3I7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXBrZy0+ciA9IGZpbmRfbmV4dF96ZXJvX2JpdChsYy0+c3luY19iaXRzLCBsYy0+c3luY19zZWFyY2gpOworCisJaWYgKHBrZy0+ciA+PSBsYy0+cmVnaW9uX2NvdW50KSB7CisJCUxPR19TUFJJTlQobGMsICJHRVQgLSBTRVEjPSV1LCBVVUlEPSVzLCBub2RlaWQgPSAldTo6ICIKKwkJCSAgICJSZXN5bmMgd29yayBjb21wbGV0ZS4iLAorCQkJICAgcnEtPnNlcSwgU0hPUlRfVVVJRChsYy0+dXVpZCksIG9yaWdpbmF0b3IpOworCQlsYy0+c3luY19zZWFyY2ggPSBsYy0+cmVnaW9uX2NvdW50ICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGMtPnN5bmNfc2VhcmNoID0gcGtnLT5yICsgMTsKKworCUxPR19TUFJJTlQobGMsICJHRVQgLSBTRVEjPSV1LCBVVUlEPSVzLCBub2RlaWQgPSAldTo6ICIKKwkJICAgIkFzc2lnbmluZyByZXN5bmMgd29yayAoJWxsdSkiLAorCQkgICBycS0+c2VxLCBTSE9SVF9VVUlEKGxjLT51dWlkKSwgb3JpZ2luYXRvciwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwa2ctPnIpOworCXBrZy0+aSA9IDE7CisJbGMtPnJlY292ZXJpbmdfcmVnaW9uID0gcGtnLT5yOworCWxjLT5yZWNvdmVyZXIgPSBvcmlnaW5hdG9yOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjbG9nX3NldF9yZWdpb25fc3luYworICogQHJxCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19zZXRfcmVnaW9uX3N5bmMoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEsIHVpbnQzMl90IG9yaWdpbmF0b3IpCit7CisJc3RydWN0IHsKKwkJdWludDY0X3QgcmVnaW9uOworCQlpbnQ2NF90IGluX3N5bmM7CisJfSAqcGtnID0gKHZvaWQgKilycS0+ZGF0YTsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsYy0+cmVjb3ZlcmluZ19yZWdpb24gPSAodWludDY0X3QpLTE7CisKKwlpZiAocGtnLT5pbl9zeW5jKSB7CisJCWlmIChsb2dfdGVzdF9iaXQobGMtPnN5bmNfYml0cywgcGtnLT5yZWdpb24pKSB7CisJCQlMT0dfU1BSSU5UKGxjLCAiU0VUIC0gU0VRIz0ldSwgVVVJRD0lcywgbm9kZWlkID0gJXU6OiAiCisJCQkJICAgIlJlZ2lvbiBhbHJlYWR5IHNldCAoJWxsdSkiLAorCQkJCSAgIHJxLT5zZXEsIFNIT1JUX1VVSUQobGMtPnV1aWQpLCBvcmlnaW5hdG9yLAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGtnLT5yZWdpb24pOworCQl9IGVsc2UgeworCQkJbG9nX3NldF9iaXQobGMsIGxjLT5zeW5jX2JpdHMsIHBrZy0+cmVnaW9uKTsKKwkJCWxjLT5zeW5jX2NvdW50Kys7CisKKwkJCS8qIFRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiBpcyBhbGwgZm9yIGRlYnVnZ2luZyAqLworCQkJTE9HX1NQUklOVChsYywgIlNFVCAtIFNFUSM9JXUsIFVVSUQ9JXMsIG5vZGVpZCA9ICV1OjogIgorCQkJCSAgICJTZXR0aW5nIHJlZ2lvbiAoJWxsdSkiLAorCQkJCSAgIHJxLT5zZXEsIFNIT1JUX1VVSUQobGMtPnV1aWQpLCBvcmlnaW5hdG9yLAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGtnLT5yZWdpb24pOworCQkJaWYgKHBrZy0+cmVnaW9uID09IGxjLT5za2lwX2JpdF93YXJuaW5nKQorCQkJCWxjLT5za2lwX2JpdF93YXJuaW5nID0gbGMtPnJlZ2lvbl9jb3VudDsKKworCQkJaWYgKHBrZy0+cmVnaW9uID4gKGxjLT5za2lwX2JpdF93YXJuaW5nICsgNSkpIHsKKwkJCQlMT0dfU1BSSU5UKGxjLCAiKioqIFJlZ2lvbiAjJWxsdSBza2lwcGVkIGR1cmluZyByZWNvdmVyeSAqKioiLAorCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpbGMtPnNraXBfYml0X3dhcm5pbmcpOworCQkJCWxjLT5za2lwX2JpdF93YXJuaW5nID0gbGMtPnJlZ2lvbl9jb3VudDsKKyNpZmRlZiBERUJVRworCQkJCWtpbGwoZ2V0cGlkKCksIFNJR1VTUjEpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICghbG9nX3Rlc3RfYml0KGxjLT5zeW5jX2JpdHMsCisJCQkJCSAgKHBrZy0+cmVnaW9uKSA/IHBrZy0+cmVnaW9uIC0gMSA6IDApKSB7CisJCQkJTE9HX1NQUklOVChsYywgIioqKiBQcmV2aW91cyBiaXQgbm90IHNldCAqKioiKTsKKwkJCQlsYy0+c2tpcF9iaXRfd2FybmluZyA9IChwa2ctPnJlZ2lvbikgPworCQkJCQlwa2ctPnJlZ2lvbiAtIDEgOiAwOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChsb2dfdGVzdF9iaXQobGMtPnN5bmNfYml0cywgcGtnLT5yZWdpb24pKSB7CisJCWxjLT5zeW5jX2NvdW50LS07CisJCWxvZ19jbGVhcl9iaXQobGMsIGxjLT5zeW5jX2JpdHMsIHBrZy0+cmVnaW9uKTsKKwkJTE9HX1NQUklOVChsYywgIlNFVCAtIFNFUSM9JXUsIFVVSUQ9JXMsIG5vZGVpZCA9ICV1OjogIgorCQkJICAgIlVuc2V0dGluZyByZWdpb24gKCVsbHUpIiwKKwkJCSAgIHJxLT5zZXEsIFNIT1JUX1VVSUQobGMtPnV1aWQpLCBvcmlnaW5hdG9yLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwa2ctPnJlZ2lvbik7CisJfQorCisJaWYgKGxjLT5zeW5jX2NvdW50ICE9IGNvdW50X2JpdHMzMihsYy0+c3luY19iaXRzKSkgeworCQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzZXQgPSBjb3VudF9iaXRzMzIobGMtPnN5bmNfYml0cyk7CisKKwkJTE9HX1NQUklOVChsYywgIlNFVCAtIFNFUSM9JXUsIFVVSUQ9JXMsIG5vZGVpZCA9ICV1OjogIgorCQkJICAgInN5bmNfY291bnQoJWxsdSkgIT0gYml0bWFwIGNvdW50KCVsbHUpIiwKKwkJCSAgIHJxLT5zZXEsIFNIT1JUX1VVSUQobGMtPnV1aWQpLCBvcmlnaW5hdG9yLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsYy0+c3luY19jb3VudCwgcmVzZXQpOworI2lmZGVmIERFQlVHCisJCWtpbGwoZ2V0cGlkKCksIFNJR1VTUjEpOworI2VuZGlmCisJCWxjLT5zeW5jX2NvdW50ID0gcmVzZXQ7CisJfQorCisJaWYgKGxjLT5zeW5jX2NvdW50ID4gbGMtPnJlZ2lvbl9jb3VudCkKKwkJTE9HX1NQUklOVChsYywgIlNFVCAtIFNFUSM9JXUsIFVVSUQ9JXMsIG5vZGVpZCA9ICV1OjogIgorCQkJICAgIihsYy0+c3luY19jb3VudCA+IGxjLT5yZWdpb25fY291bnQpIC0gdGhpcyBpcyBiYWQiLAorCQkJICAgcnEtPnNlcSwgU0hPUlRfVVVJRChsYy0+dXVpZCksIG9yaWdpbmF0b3IpOworCisJaWYgKGxjLT5zeW5jX2NvdW50ID09IGxjLT5yZWdpb25fY291bnQpCisJCWxjLT5pbl9zeW5jID0gMTsKKworCXJxLT5kYXRhX3NpemUgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogY2xvZ19nZXRfc3luY19jb3VudAorICogQHJxCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19nZXRfc3luY19jb3VudChzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSwgdWludDMyX3Qgb3JpZ2luYXRvcikKK3sKKwl1aW50NjRfdCAqc3luY19jb3VudCA9ICh1aW50NjRfdCAqKXJxLT5kYXRhOworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisKKwkvKgorCSAqIEZJWE1FOiBNaXJyb3IgcmVxdWlyZXMgdXMgdG8gYmUgYWJsZSB0byBhc2sgZm9yCisJICogdGhlIHN5bmMgY291bnQgd2hpbGUgcGVuZGluZy4uLiBidXQgSSBkb24ndCBsaWtlCisJICogaXQgYmVjYXVzZSBvdGhlciBtYWNoaW5lcyBtYXkgbm90IGJlIHN1c3BlbmRlZCBhbmQKKwkgKiB0aGUgc3RvcmVkIHZhbHVlIG1heSBub3QgYmUgYWNjdXJhdGUuCisJICovCisJaWYgKCFsYykKKwkJbGMgPSBnZXRfcGVuZGluZ19sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmICghbGMpCisJCXJldHVybiAtRUlOVkFMOworCisJKnN5bmNfY291bnQgPSBsYy0+c3luY19jb3VudDsKKworCXJxLT5kYXRhX3NpemUgPSBzaXplb2YoKnN5bmNfY291bnQpOworCisJaWYgKGxjLT5zeW5jX2NvdW50ICE9IGNvdW50X2JpdHMzMihsYy0+c3luY19iaXRzKSkgeworCQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzZXQgPSBjb3VudF9iaXRzMzIobGMtPnN5bmNfYml0cyk7CisKKwkJTE9HX1NQUklOVChsYywgImdldF9zeW5jX2NvdW50IC0gU0VRIz0ldSwgVVVJRD0lcywgbm9kZWlkID0gJXU6OiAiCisJCQkgICAic3luY19jb3VudCglbGx1KSAhPSBiaXRtYXAgY291bnQoJWxsdSkiLAorCQkJICAgcnEtPnNlcSwgU0hPUlRfVVVJRChsYy0+dXVpZCksIG9yaWdpbmF0b3IsCisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWxjLT5zeW5jX2NvdW50LCByZXNldCk7CisjaWZkZWYgREVCVUcKKwkJa2lsbChnZXRwaWQoKSwgU0lHVVNSMSk7CisjZW5kaWYKKwkJbGMtPnN5bmNfY291bnQgPSByZXNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3JlX3N0YXR1c19pbmZvKHN0cnVjdCBsb2dfYyAqbGMgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCWNoYXIgKmRhdGEgPSAoY2hhciAqKXJxLT5kYXRhOworCisJciA9IHNwcmludGYoZGF0YSwgIjEgY2x1c3RlcmVkLWNvcmUiKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcnEtPmRhdGFfc2l6ZSA9IHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXNrX3N0YXR1c19pbmZvKHN0cnVjdCBsb2dfYyAqbGMsIHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCWNoYXIgKmRhdGEgPSAoY2hhciAqKXJxLT5kYXRhOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwlpZiAoZnN0YXQobGMtPmRpc2tfZmQsICZzdGF0YnVmKSkgeworCQlycS0+ZXJyb3IgPSAtZXJybm87CisJCXJldHVybiAtZXJybm87CisJfQorCisJciA9IHNwcmludGYoZGF0YSwgIjMgY2x1c3RlcmVkLWRpc2sgJWQ6JWQgJWMiLAorCQkgICAgbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KSwgbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KSwKKwkJICAgIChsYy0+bG9nX2Rldl9mYWlsZWQpID8gJ0QnIDogJ0EnKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcnEtPmRhdGFfc2l6ZSA9IHI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb2dfc3RhdHVzX2luZm8KKyAqIEBycQorICoKKyAqLworc3RhdGljIGludCBjbG9nX3N0YXR1c19pbmZvKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKQoreworCWludCByOworCXN0cnVjdCBsb2dfYyAqbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisKKwlpZiAoIWxjKQorCQlsYyA9IGdldF9wZW5kaW5nX2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGMtPmRpc2tfZmQgPT0gLTEpCisJCXIgPSBjb3JlX3N0YXR1c19pbmZvKGxjLCBycSk7CisJZWxzZQorCQlyID0gZGlza19zdGF0dXNfaW5mbyhsYywgcnEpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgY29yZV9zdGF0dXNfdGFibGUoc3RydWN0IGxvZ19jICpsYywgc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpCit7CisJaW50IHI7CisJY2hhciAqZGF0YSA9IChjaGFyICopcnEtPmRhdGE7CisKKwlyID0gc3ByaW50ZihkYXRhLCAiY2x1c3RlcmVkLWNvcmUgJXUgJXMlcyAiLAorCQkgICAgbGMtPnJlZ2lvbl9zaXplLAorCQkgICAgKGxjLT5zeW5jID09IERFRkFVTFRTWU5DKSA/ICIiIDoKKwkJICAgIChsYy0+c3luYyA9PSBOT1NZTkMpID8gIm5vc3luYyAiIDogInN5bmMgIiwKKwkJICAgIChsYy0+YmxvY2tfb25fZXJyb3IpID8gImJsb2NrX29uX2Vycm9yIiA6ICIiKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcnEtPmRhdGFfc2l6ZSA9IHI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlza19zdGF0dXNfdGFibGUoc3RydWN0IGxvZ19jICpsYywgc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpCit7CisJaW50IHI7CisJY2hhciAqZGF0YSA9IChjaGFyICopcnEtPmRhdGE7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCWlmIChmc3RhdChsYy0+ZGlza19mZCwgJnN0YXRidWYpKSB7CisJCXJxLT5lcnJvciA9IC1lcnJubzsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwlyID0gc3ByaW50ZihkYXRhLCAiY2x1c3RlcmVkLWRpc2sgJWQ6JWQgJXUgJXMlcyAiLAorCQkgICAgbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KSwgbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KSwKKwkJICAgIGxjLT5yZWdpb25fc2l6ZSwKKwkJICAgIChsYy0+c3luYyA9PSBERUZBVUxUU1lOQykgPyAiIiA6CisJCSAgICAobGMtPnN5bmMgPT0gTk9TWU5DKSA/ICJub3N5bmMgIiA6ICJzeW5jICIsCisJCSAgICAobGMtPmJsb2NrX29uX2Vycm9yKSA/ICJibG9ja19vbl9lcnJvciIgOiAiIik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXJxLT5kYXRhX3NpemUgPSByOworCXJldHVybiAwOworfQorCisvKgorICogY2xvZ19zdGF0dXNfdGFibGUKKyAqIEBycQorICoKKyAqLworc3RhdGljIGludCBjbG9nX3N0YXR1c190YWJsZShzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJbGMgPSBnZXRfcGVuZGluZ19sb2cocnEtPnV1aWQsIHJxLT5sdWlkKTsKKworCWlmICghbGMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxjLT5kaXNrX2ZkID09IC0xKQorCQlyID0gY29yZV9zdGF0dXNfdGFibGUobGMsIHJxKTsKKwllbHNlCisJCXIgPSBkaXNrX3N0YXR1c190YWJsZShsYywgcnEpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBjbG9nX2lzX3JlbW90ZV9yZWNvdmVyaW5nCisgKiBAcnEKKyAqCisgKi8KK3N0YXRpYyBpbnQgY2xvZ19pc19yZW1vdGVfcmVjb3ZlcmluZyhzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwl1aW50NjRfdCAqcmVnaW9uX3AgPSAodWludDY0X3QgKilycS0+ZGF0YTsKKwl1aW50NjRfdCByZWdpb24gPSAqcmVnaW9uX3A7CisJc3RydWN0IHsKKwkJaW50NjRfdCBpc19yZWNvdmVyaW5nOworCQl1aW50NjRfdCBpbl9zeW5jX2hpbnQ7CisJfSAqcGtnID0gKHZvaWQgKilycS0+ZGF0YTsKKwlzdHJ1Y3QgbG9nX2MgKmxjID0gZ2V0X2xvZyhycS0+dXVpZCwgcnEtPmx1aWQpOworCisJaWYgKCFsYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVnaW9uID4gbGMtPnJlZ2lvbl9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGMtPnJlY292ZXJ5X2hhbHRlZCkgeworCQlMT0dfREJHKCJbJXNdIFJlY292ZXJ5IGhhbHRlZC4uLiBbbm90IHJlbW90ZSByZWNvdmVyaW5nXTogJWxsdSIsCisJCQlTSE9SVF9VVUlEKGxjLT51dWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24pOworCQlwa2ctPmlzX3JlY292ZXJpbmcgPSAwOworCQlwa2ctPmluX3N5bmNfaGludCA9IGxjLT5yZWdpb25fY291bnQ7IC8qIG5vbmUgYXJlIHJlY292ZXJpbmcgKi8KKwl9IGVsc2UgeworCQlwa2ctPmlzX3JlY292ZXJpbmcgPSAhbG9nX3Rlc3RfYml0KGxjLT5zeW5jX2JpdHMsIHJlZ2lvbik7CisKKwkJLyoKKwkJICogUmVtZW1iZXIsICdsYy0+c3luY19zZWFyY2gnIGlzIDEgcGx1cyB0aGUgcmVnaW9uCisJCSAqIGN1cnJlbnRseSBiZWluZyByZWNvdmVyZWQuICBTbywgd2UgbXVzdCB0YWtlIG9mZiAxCisJCSAqIHRvIGFjY291bnQgZm9yIHRoYXQ7IGJ1dCBvbmx5IGlmICdzeW5jX3NlYXJjaCA+IDEnLgorCQkgKi8KKwkJcGtnLT5pbl9zeW5jX2hpbnQgPSBsYy0+c3luY19zZWFyY2ggPyAobGMtPnN5bmNfc2VhcmNoIC0gMSkgOiAwOworCQlMT0dfREJHKCJbJXNdIFJlZ2lvbiBpcyAlczogJWxsdSIsCisJCQlTSE9SVF9VVUlEKGxjLT51dWlkKSwKKwkJCShyZWdpb24gPT0gbGMtPnJlY292ZXJpbmdfcmVnaW9uKSA/CisJCQkiY3VycmVudGx5IHJlbW90ZSByZWNvdmVyaW5nIiA6CisJCQkocGtnLT5pc19yZWNvdmVyaW5nKSA/ICJwZW5kaW5nIHJlbW90ZSByZWNvdmVyeSIgOgorCQkJIm5vdCByZW1vdGUgcmVjb3ZlcmluZyIsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uKTsKKwl9CisKKwlpZiAocGtnLT5pc19yZWNvdmVyaW5nICYmCisJICAgIChyZWdpb24gIT0gbGMtPnJlY292ZXJpbmdfcmVnaW9uKSkgeworCQlzdHJ1Y3QgcmVjb3ZlcnlfcmVxdWVzdCAqcnI7CisKKwkJLyogQWxyZWFkeSBpbiB0aGUgbGlzdD8gKi8KKwkJZm9yIChyciA9IGxjLT5yZWNvdmVyeV9yZXF1ZXN0X2xpc3Q7IHJyOyByciA9IHJyLT5uZXh0KQorCQkJaWYgKHJyLT5yZWdpb24gPT0gcmVnaW9uKQorCQkJCWdvdG8gb3V0OworCisJCS8qIEZhaWx1cmUgdG8gYWxsb2NhdGVkIHNpbXBseSBtZWFucyB3ZSBjYW4ndCBwcmlvcml0aXplIGl0ICovCisJCXJyID0gbWFsbG9jKHNpemVvZigqcnIpKTsKKwkJaWYgKCFycikKKwkJCWdvdG8gb3V0OworCisJCUxPR19EQkcoIlslc10gQWRkaW5nIHJlZ2lvbiB0byBwcmlvcml0eSBsaXN0OiAlbGx1IiwKKwkJCVNIT1JUX1VVSUQobGMtPnV1aWQpLCAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbik7CisJCXJyLT5yZWdpb24gPSByZWdpb247CisJCXJyLT5uZXh0ID0gbGMtPnJlY292ZXJ5X3JlcXVlc3RfbGlzdDsKKwkJbGMtPnJlY292ZXJ5X3JlcXVlc3RfbGlzdCA9IHJyOworCX0KKworb3V0OgorCisJcnEtPmRhdGFfc2l6ZSA9IHNpemVvZigqcGtnKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBkb19yZXF1ZXN0CisgKiBAcnE6IHRoZSByZXF1ZXN0CisgKiBAc2VydmVyOiBpcyB0aGlzIHJlcXVlc3QgcGVyZm9ybWVkIGJ5IHRoZSBzZXJ2ZXIKKyAqCisgKiBBbiBpbmFiaWxpdHkgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yCisgKiBmcm9tIHRoaXMgZnVuY3Rpb24uICBIb3dldmVyLCBhbiBpbmFiaWxpdHkgdG8gc3VjY2Vzc2Z1bGx5CisgKiBwZXJmb3JtIHRoZSByZXF1ZXN0IHdpbGwgZmlsbCBpbiB0aGUgJ3JxLT5lcnJvcicgZmllbGQuCisgKgorICogJ3JxJyAob3IgbW9yZSBjb3JyZWN0bHksIHJxLT51X3JxLmRhdGEpIHNob3VsZCBiZSBvZiBzdWZmaWNpZW50CisgKiBzaXplIHRvIGhvbGQgYW55IHJldHVybmluZyBkYXRhLiAgQ3VycmVudGx5LCBsb2NhbC5jIHVzZXMgMmtpQgorICogdG8gaG9sZCAncnEnIC0gbGVhdmluZyB+MS41a2lCIGZvciByZXR1cm4gZGF0YS4uLiBtb3JlIHRoYW4KKyAqIGVub3VnaCBmb3IgYWxsIHRoZSBpbXBsZW1lbnRlZCBmdW5jdGlvbnMgaGVyZS4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FWFhYIG9uIGVycm9yCisgKi8KK2ludCBkb19yZXF1ZXN0KHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxLCBpbnQgc2VydmVyKQoreworCWludCByOworCisJaWYgKCFycSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocnEtPnVfcnEuZXJyb3IpCisJCUxPR19EQkcoIlByb2dyYW1tZXIgZXJyb3I6IHJxIHN0cnVjdCBoYXMgZXJyb3Igc2V0Iik7CisKKwlzd2l0Y2ggKHJxLT51X3JxLnJlcXVlc3RfdHlwZSkgeworCWNhc2UgRE1fVUxPR19DVFI6CisJCXIgPSBjbG9nX2N0cigmcnEtPnVfcnEpOworCQlicmVhazsKKwljYXNlIERNX1VMT0dfRFRSOgorCQlyID0gY2xvZ19kdHIoJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX1BSRVNVU1BFTkQ6CisJCXIgPSBjbG9nX3ByZXN1c3BlbmQoJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX1BPU1RTVVNQRU5EOgorCQlyID0gY2xvZ19wb3N0c3VzcGVuZCgmcnEtPnVfcnEpOworCQlicmVhazsKKwljYXNlIERNX1VMT0dfUkVTVU1FOgorCQlyID0gY2xvZ19yZXN1bWUoJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX0dFVF9SRUdJT05fU0laRToKKwkJciA9IGNsb2dfZ2V0X3JlZ2lvbl9zaXplKCZycS0+dV9ycSk7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19JU19DTEVBTjoKKwkJciA9IGNsb2dfaXNfY2xlYW4oJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX0lOX1NZTkM6CisJCXIgPSBjbG9nX2luX3N5bmMoJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX0ZMVVNIOgorCQlyID0gY2xvZ19mbHVzaCgmcnEtPnVfcnEsIHNlcnZlcik7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19NQVJLX1JFR0lPTjoKKwkJciA9IGNsb2dfbWFya19yZWdpb24oJnJxLT51X3JxLCBycS0+b3JpZ2luYXRvcik7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19DTEVBUl9SRUdJT046CisJCXIgPSBjbG9nX2NsZWFyX3JlZ2lvbigmcnEtPnVfcnEsIHJxLT5vcmlnaW5hdG9yKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX0dFVF9SRVNZTkNfV09SSzoKKwkJciA9IGNsb2dfZ2V0X3Jlc3luY193b3JrKCZycS0+dV9ycSwgcnEtPm9yaWdpbmF0b3IpOworCQlicmVhazsKKwljYXNlIERNX1VMT0dfU0VUX1JFR0lPTl9TWU5DOgorCQlyID0gY2xvZ19zZXRfcmVnaW9uX3N5bmMoJnJxLT51X3JxLCBycS0+b3JpZ2luYXRvcik7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19HRVRfU1lOQ19DT1VOVDoKKwkJciA9IGNsb2dfZ2V0X3N5bmNfY291bnQoJnJxLT51X3JxLCBycS0+b3JpZ2luYXRvcik7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19TVEFUVVNfSU5GTzoKKwkJciA9IGNsb2dfc3RhdHVzX2luZm8oJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX1NUQVRVU19UQUJMRToKKwkJciA9IGNsb2dfc3RhdHVzX3RhYmxlKCZycS0+dV9ycSk7CisJCWJyZWFrOworCWNhc2UgRE1fVUxPR19JU19SRU1PVEVfUkVDT1ZFUklORzoKKwkJciA9IGNsb2dfaXNfcmVtb3RlX3JlY292ZXJpbmcoJnJxLT51X3JxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HX0VSUk9SKCJVbmtub3duIHJlcXVlc3QiKTsKKwkJciA9IHJxLT51X3JxLmVycm9yID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHIgJiYgIXJxLT51X3JxLmVycm9yKQorCQlycS0+dV9ycS5lcnJvciA9IHI7CisJZWxzZSBpZiAociAhPSBycS0+dV9ycS5lcnJvcikKKwkJTE9HX0RCRygiV2FybmluZzogIGVycm9yIGZyb20gZnVuY3Rpb24gIT0gcnEtPnVfcnEuZXJyb3IiKTsKKworCWlmIChycS0+dV9ycS5lcnJvciAmJiBycS0+dV9ycS5kYXRhX3NpemUpIHsKKwkJLyogTWFrZSBzdXJlIEknbSBoYW5kbGluZyBlcnJvcnMgY29ycmVjdGx5IGFib3ZlICovCisJCUxPR19EQkcoIlByb2dyYW1tZXIgZXJyb3I6IHJxLT51X3JxLmVycm9yICYmIHJxLT51X3JxLmRhdGFfc2l6ZSIpOworCQlycS0+dV9ycS5kYXRhX3NpemUgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9iaXRzKGRtX2JpdHNldF90IGJzLCBpbnQgcHJpbnQpCit7CisJaW50IGksIHNpemU7CisJY2hhciBvdXRidWZbMTI4XSA9IHsgMCB9OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopKGJzICsgMSk7CisKKwlzaXplID0gKCpicyAlIDgpID8gMSA6IDA7CisJc2l6ZSArPSAoKmJzIC8gOCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICghKGkgJSAxNikpIHsKKwkJCWlmIChvdXRidWZbMF0gIT0gJ1wwJykgeworCQkJCWlmIChwcmludCkKKwkJCQkJTE9HX1BSSU5UKCIlcyIsIG91dGJ1Zik7CisJCQkJZWxzZQorCQkJCQlMT0dfREJHKCIlcyIsIG91dGJ1Zik7CisJCQl9CisJCQltZW1zZXQob3V0YnVmLCAwLCBzaXplb2Yob3V0YnVmKSk7CisJCQlzcHJpbnRmKG91dGJ1ZiwgIlslM2QgLSAlM2RdIiwgaSwgaSsxNSk7CisJCX0KKwkJc3ByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgIiAlLjJYIiwgKHVuc2lnbmVkIGNoYXIpYnVmW2ldKTsKKwl9CisJaWYgKG91dGJ1ZlswXSAhPSAnXDAnKSB7CisJCWlmIChwcmludCkKKwkJCUxPR19QUklOVCgiJXMiLCBvdXRidWYpOworCQllbHNlCisJCQlMT0dfREJHKCIlcyIsIG91dGJ1Zik7CisJfQorfQorCisvKiBpbnQgc3RvcmVfYml0cyhjb25zdCBjaGFyICp1dWlkLCBjb25zdCBjaGFyICp3aGljaCwgY2hhciAqKmJ1ZikqLworaW50IHB1c2hfc3RhdGUoY29uc3QgY2hhciAqdXVpZCwgdWludDY0X3QgbHVpZCwKKwkgICAgICAgY29uc3QgY2hhciAqd2hpY2gsIGNoYXIgKipidWYsIHVpbnQzMl90IGRlYnVnX3dobykKK3sKKwlpbnQgYml0c2V0X3NpemU7CisJc3RydWN0IGxvZ19jICpsYzsKKworCWlmICgqYnVmKQorCQlMT0dfRVJST1IoInN0b3JlX2JpdHM6ICpidWYgIT0gTlVMTCIpOworCisJbGMgPSBnZXRfbG9nKHV1aWQsIGx1aWQpOworCWlmICghbGMpIHsKKwkJTE9HX0VSUk9SKCJzdG9yZV9iaXRzOiBObyBsb2cgZm91bmQgZm9yICVzIiwgdXVpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghc3RyY21wKHdoaWNoLCAicmVjb3ZlcmluZ19yZWdpb24iKSkgeworCQkqYnVmID0gbWFsbG9jKDY0KTsgLyogZWFzaWx5IGhhbmRsZXMgdGhlIDIgd3JpdHRlbiBudW1iZXJzICovCisJCWlmICghKmJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlzcHJpbnRmKCpidWYsICIlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsYy0+cmVjb3ZlcmluZ19yZWdpb24sCisJCQlsYy0+cmVjb3ZlcmVyKTsKKworCQlMT0dfU1BSSU5UKGxjLCAiQ0tQVCBTRU5EIC0gU0VRIz1YLCBVVUlEPSVzLCBub2RlaWQgPSAldTo6ICIKKwkJCSAgICJyZWNvdmVyaW5nX3JlZ2lvbj0lbGx1LCByZWNvdmVyZXI9JXUsIHN5bmNfY291bnQ9JWxsdSIsCisJCQkgICBTSE9SVF9VVUlEKGxjLT51dWlkKSwgZGVidWdfd2hvLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsYy0+cmVjb3ZlcmluZ19yZWdpb24sCisJCQkgICBsYy0+cmVjb3ZlcmVyLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudF9iaXRzMzIobGMtPnN5bmNfYml0cykpOworCQlyZXR1cm4gNjQ7CisJfQorCisJLyogU2l6ZSBpbiAnaW50J3MgKi8KKwliaXRzZXRfc2l6ZSA9ICgqKGxjLT5jbGVhbl9iaXRzKSAvIERNX0JJVFNfUEVSX0lOVCkgKyAxOworCisJLyogU2l6ZSBpbiBieXRlcyAqLworCWJpdHNldF9zaXplICo9IDQ7CisKKwkqYnVmID0gbWFsbG9jKGJpdHNldF9zaXplKTsKKworCWlmICghKmJ1ZikgeworCQlMT0dfRVJST1IoInN0b3JlX2JpdHM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFzdHJuY21wKHdoaWNoLCAic3luY19iaXRzIiwgOSkpIHsKKwkJbWVtY3B5KCpidWYsIGxjLT5zeW5jX2JpdHMgKyAxLCBiaXRzZXRfc2l6ZSk7CisKKwkJTE9HX0RCRygiWyVzXSBzdG9yaW5nIHN5bmNfYml0cyAoc3luY19jb3VudCA9ICVsbHUpOiIsCisJCQlTSE9SVF9VVUlEKHV1aWQpLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJY291bnRfYml0czMyKGxjLT5zeW5jX2JpdHMpKTsKKworCQlwcmludF9iaXRzKGxjLT5zeW5jX2JpdHMsIDApOworCX0gZWxzZSBpZiAoIXN0cm5jbXAod2hpY2gsICJjbGVhbl9iaXRzIiwgOSkpIHsKKwkJbWVtY3B5KCpidWYsIGxjLT5jbGVhbl9iaXRzICsgMSwgYml0c2V0X3NpemUpOworCisJCUxPR19EQkcoIlslc10gc3RvcmluZyBjbGVhbl9iaXRzOiIsIFNIT1JUX1VVSUQobGMtPnV1aWQpKTsKKworCQlwcmludF9iaXRzKGxjLT5jbGVhbl9iaXRzLCAwKTsKKwl9CisKKwlyZXR1cm4gYml0c2V0X3NpemU7Cit9CisKKy8qaW50IGxvYWRfYml0cyhjb25zdCBjaGFyICp1dWlkLCBjb25zdCBjaGFyICp3aGljaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkqLworaW50IHB1bGxfc3RhdGUoY29uc3QgY2hhciAqdXVpZCwgdWludDY0X3QgbHVpZCwKKwkgICAgICAgY29uc3QgY2hhciAqd2hpY2gsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGJpdHNldF9zaXplOworCXN0cnVjdCBsb2dfYyAqbGM7CisKKwlpZiAoIWJ1ZikgeworCQlMT0dfRVJST1IoInB1bGxfc3RhdGU6IGJ1ZiA9PSBOVUxMIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjID0gZ2V0X2xvZyh1dWlkLCBsdWlkKTsKKwlpZiAoIWxjKSB7CisJCUxPR19FUlJPUigicHVsbF9zdGF0ZTogTm8gbG9nIGZvdW5kIGZvciAlcyIsIHV1aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXN0cm5jbXAod2hpY2gsICJyZWNvdmVyaW5nX3JlZ2lvbiIsIDE3KSkgeworCQlpZiAoc3NjYW5mKGJ1ZiwgIiVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nICopJmxjLT5yZWNvdmVyaW5nX3JlZ2lvbiwKKwkJCSAgICZsYy0+cmVjb3ZlcmVyKSAhPSAyKSB7CisJCQlMT0dfRVJST1IoImNhbm5vdCBwYXJzZSByZWNvdmVyaW5nIHJlZ2lvbiBmcm9tOiAlcyIsIGJ1Zik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlMT0dfU1BSSU5UKGxjLCAiQ0tQVCBJTklUIC0gU0VRIz1YLCBVVUlEPSVzLCBub2RlaWQgPSBYOjogIgorCQkJICAgInJlY292ZXJpbmdfcmVnaW9uPSVsbHUsIHJlY292ZXJlcj0ldSIsCisJCQkgICBTSE9SVF9VVUlEKGxjLT51dWlkKSwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGMtPnJlY292ZXJpbmdfcmVnaW9uLCBsYy0+cmVjb3ZlcmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2l6ZSBpbiAnaW50J3MgKi8KKwliaXRzZXRfc2l6ZSA9ICgqKGxjLT5jbGVhbl9iaXRzKSAvRE1fQklUU19QRVJfSU5UKSArIDE7CisKKwkvKiBTaXplIGluIGJ5dGVzICovCisJYml0c2V0X3NpemUgKj0gNDsKKworCWlmIChiaXRzZXRfc2l6ZSAhPSBzaXplKSB7CisJCUxPR19FUlJPUigicHVsbF9zdGF0ZSglcyk6IGJhZCBiaXRzZXRfc2l6ZSAoJWQgdnMgJWQpIiwKKwkJCSAgd2hpY2gsIHNpemUsIGJpdHNldF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFzdHJuY21wKHdoaWNoLCAic3luY19iaXRzIiwgOSkpIHsKKwkJbGMtPnJlc3VtZV9vdmVycmlkZSArPSAxOworCQltZW1jcHkobGMtPnN5bmNfYml0cyArIDEsIGJ1ZiwgYml0c2V0X3NpemUpOworCisJCUxPR19EQkcoIlslc10gbG9hZGluZyBzeW5jX2JpdHMgKHN5bmNfY291bnQgPSAlbGx1KToiLAorCQkJU0hPUlRfVVVJRChsYy0+dXVpZCksKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCWNvdW50X2JpdHMzMihsYy0+c3luY19iaXRzKSk7CisKKwkJcHJpbnRfYml0cyhsYy0+c3luY19iaXRzLCAwKTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHdoaWNoLCAiY2xlYW5fYml0cyIsIDkpKSB7CisJCWxjLT5yZXN1bWVfb3ZlcnJpZGUgKz0gMjsKKwkJbWVtY3B5KGxjLT5jbGVhbl9iaXRzICsgMSwgYnVmLCBiaXRzZXRfc2l6ZSk7CisKKwkJTE9HX0RCRygiWyVzXSBsb2FkaW5nIGNsZWFuX2JpdHM6IiwgU0hPUlRfVVVJRChsYy0+dXVpZCkpOworCisJCXByaW50X2JpdHMobGMtPmNsZWFuX2JpdHMsIDApOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbG9nX2dldF9zdGF0ZShzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgbG9nX2MgKmxjOworCisJbGMgPSBnZXRfbG9nKHJxLT51dWlkLCBycS0+bHVpZCk7CisJaWYgKCFsYykKKwkJLyogRklYTUUgQ2FsbGVycyBhcmUgaWdub3JpbmcgdGhpcyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAoaW50KWxjLT5zdGF0ZTsKK30KKworLyoKKyAqIGxvZ19zdGF0dXMKKyAqCisgKiBSZXR1cm5zOiAxIGlmIGxvZ3MgYXJlIHN0aWxsIHByZXNlbnQsIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBsb2dfc3RhdHVzKHZvaWQpCit7CisJaWYgKCFkbV9saXN0X2VtcHR5KCZsb2dfbGlzdCkgfHwgIWRtX2xpc3RfZW1wdHkoJmxvZ19wZW5kaW5nX2xpc3QpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxvZ19kZWJ1Zyh2b2lkKQoreworCXN0cnVjdCBsb2dfYyAqbGM7CisJdWludDY0X3QgcjsKKwlpbnQgaTsKKworCUxPR19FUlJPUigiIik7CisJTE9HX0VSUk9SKCJMT0cgQ09NUE9ORU5UIERFQlVHR0lORzo6Iik7CisJTE9HX0VSUk9SKCJPZmZpY2lhbCBsb2cgbGlzdDoiKTsKKwlMT0dfRVJST1IoIlBlbmRpbmcgbG9nIGxpc3Q6Iik7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxjLCAmbG9nX3BlbmRpbmdfbGlzdCkgeworCQlMT0dfRVJST1IoIiVzIiwgbGMtPnV1aWQpOworCQlMT0dfRVJST1IoInN5bmNfYml0czoiKTsKKwkJcHJpbnRfYml0cyhsYy0+c3luY19iaXRzLCAxKTsKKwkJTE9HX0VSUk9SKCJjbGVhbl9iaXRzOiIpOworCQlwcmludF9iaXRzKGxjLT5jbGVhbl9iaXRzLCAxKTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGMsICZsb2dfbGlzdCkgeworCQlMT0dfRVJST1IoIiVzIiwgbGMtPnV1aWQpOworCQlMT0dfRVJST1IoIiAgcmVjb3ZlcmVyICAgICAgICA6ICUiIFBSSXUzMiwgbGMtPnJlY292ZXJlcik7CisJCUxPR19FUlJPUigiICByZWNvdmVyaW5nX3JlZ2lvbjogJSIgUFJJdTY0LCBsYy0+cmVjb3ZlcmluZ19yZWdpb24pOworCQlMT0dfRVJST1IoIiAgcmVjb3ZlcnlfaGFsdGVkICA6ICVzIiwgKGxjLT5yZWNvdmVyeV9oYWx0ZWQpID8KKwkJCSAgIllFUyIgOiAiTk8iKTsKKwkJTE9HX0VSUk9SKCJzeW5jX2JpdHM6Iik7CisJCXByaW50X2JpdHMobGMtPnN5bmNfYml0cywgMSk7CisJCUxPR19FUlJPUigiY2xlYW5fYml0czoiKTsKKwkJcHJpbnRfYml0cyhsYy0+Y2xlYW5fYml0cywgMSk7CisKKwkJTE9HX0VSUk9SKCJWYWxpZGF0aW5nICVzOjoiLCBTSE9SVF9VVUlEKGxjLT51dWlkKSk7CisJCXIgPSBmaW5kX25leHRfemVyb19iaXQobGMtPnN5bmNfYml0cywgMCk7CisJCUxPR19FUlJPUigiICBsYy0+cmVnaW9uX2NvdW50ID0gJSIgUFJJdTMyLCBsYy0+cmVnaW9uX2NvdW50KTsKKwkJTE9HX0VSUk9SKCIgIGxjLT5zeW5jX2NvdW50ID0gJSIgUFJJdTY0LCBsYy0+c3luY19jb3VudCk7CisJCUxPR19FUlJPUigiICBuZXh0IHplcm8gYml0ICA9ICUiIFBSSXU2NCwgcik7CisJCWlmICgociA+IGxjLT5yZWdpb25fY291bnQpIHx8CisJCSAgICAoKHIgPT0gbGMtPnJlZ2lvbl9jb3VudCkgJiYgKGxjLT5zeW5jX2NvdW50ID4gbGMtPnJlZ2lvbl9jb3VudCkpKSB7CisJCQlMT0dfRVJST1IoIkFESlVTVElORyBTWU5DX0NPVU5UIik7CisJCQlsYy0+c3luY19jb3VudCA9IGxjLT5yZWdpb25fY291bnQ7CisJCX0KKworCQlMT0dfRVJST1IoIlJlc3luYyByZXF1ZXN0IGhpc3Rvcnk6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBSRVNZTkNfSElTVE9SWTsgaSsrKSB7CisJCQlsYy0+aWR4Kys7CisJCQlsYy0+aWR4ID0gbGMtPmlkeCAlIFJFU1lOQ19ISVNUT1JZOworCQkJaWYgKGxjLT5yZXN5bmNfaGlzdG9yeVtsYy0+aWR4XVswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCQkJTE9HX0VSUk9SKCIlZDolZCkgJXMiLCBpLCBsYy0+aWR4LAorCQkJCSAgbGMtPnJlc3luY19oaXN0b3J5W2xjLT5pZHhdKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvZnVuY3Rpb25zLmggYi9kYWVtb25zL2NtaXJyb3JkL2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjBmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX0xWTV9DTE9HX0ZVTkNUSU9OU19ICisjZGVmaW5lIF9MVk1fQ0xPR19GVU5DVElPTlNfSAorCisjaW5jbHVkZSAiZG0tbG9nLXVzZXJzcGFjZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKworI2RlZmluZSBMT0dfUkVTVU1FRCAgIDEKKyNkZWZpbmUgTE9HX1NVU1BFTkRFRCAyCisKK2ludCBsb2NhbF9yZXN1bWUoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqcnEpOworaW50IGNsdXN0ZXJfcG9zdHN1c3BlbmQoY2hhciAqLCB1aW50NjRfdCk7CisKK2ludCBkb19yZXF1ZXN0KHN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxLCBpbnQgc2VydmVyKTsKK2ludCBwdXNoX3N0YXRlKGNvbnN0IGNoYXIgKnV1aWQsIHVpbnQ2NF90IGx1aWQsCisJICAgICAgIGNvbnN0IGNoYXIgKndoaWNoLCBjaGFyICoqYnVmLCB1aW50MzJfdCBkZWJ1Z193aG8pOworaW50IHB1bGxfc3RhdGUoY29uc3QgY2hhciAqdXVpZCwgdWludDY0X3QgbHVpZCwKKwkgICAgICAgY29uc3QgY2hhciAqd2hpY2gsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCitpbnQgbG9nX2dldF9zdGF0ZShzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICpycSk7CitpbnQgbG9nX3N0YXR1cyh2b2lkKTsKK3ZvaWQgbG9nX2RlYnVnKHZvaWQpOworCisjZW5kaWYgLyogX0xWTV9DTE9HX0ZVTkNUSU9OU19IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2NtaXJyb3JkL2xpbmtfbW9uLmMgYi9kYWVtb25zL2NtaXJyb3JkL2xpbmtfbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjNDllNQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvY21pcnJvcmQvbGlua19tb24uYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImxvZ2dpbmcuaCIKKyNpbmNsdWRlICJsaW5rX21vbi5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0cnVjdCBsaW5rX2NhbGxiYWNrIHsKKwlpbnQgZmQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICpkYXRhOworCWludCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKTsKKworCXN0cnVjdCBsaW5rX2NhbGxiYWNrICpuZXh0OworfTsKKworc3RhdGljIHVuc2lnbmVkIHVzZWRfcGZkcyA9IDA7CitzdGF0aWMgdW5zaWduZWQgZnJlZV9wZmRzID0gMDsKK3N0YXRpYyBzdHJ1Y3QgcG9sbGZkICpwZmRzID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgbGlua19jYWxsYmFjayAqY2FsbGJhY2tzID0gTlVMTDsKKworaW50IGxpbmtzX3JlZ2lzdGVyKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGxpbmtfY2FsbGJhY2sgKmxjOworCisJZm9yIChpID0gMDsgaSA8IHVzZWRfcGZkczsgaSsrKSB7CisJCWlmIChmZCA9PSBwZmRzW2ldLmZkKSB7CisJCQlMT0dfRVJST1IoImxpbmtzX3JlZ2lzdGVyOiBEdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWxjID0gbWFsbG9jKHNpemVvZigqbGMpKTsKKwlpZiAoIWxjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxjLT5mZCA9IGZkOworCWxjLT5uYW1lID0gbmFtZTsKKwlsYy0+ZGF0YSA9IGRhdGE7CisJbGMtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKwlpZiAoIWZyZWVfcGZkcykgeworCQlzdHJ1Y3QgcG9sbGZkICp0bXA7CisJCXRtcCA9IHJlYWxsb2MocGZkcywgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogKCh1c2VkX3BmZHMqMikgKyAxKSk7CisJCWlmICghdG1wKSB7CisJCQlmcmVlKGxjKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcGZkcyA9IHRtcDsKKwkJZnJlZV9wZmRzID0gdXNlZF9wZmRzICsgMTsKKwl9CisKKwlmcmVlX3BmZHMtLTsKKwlwZmRzW3VzZWRfcGZkc10uZmQgPSBmZDsKKwlwZmRzW3VzZWRfcGZkc10uZXZlbnRzID0gUE9MTElOOworCXBmZHNbdXNlZF9wZmRzXS5yZXZlbnRzID0gMDsKKwl1c2VkX3BmZHMrKzsKKworCWxjLT5uZXh0ID0gY2FsbGJhY2tzOworCWNhbGxiYWNrcyA9IGxjOworCUxPR19EQkcoIkFkZGluZyAlcy8lZCIsIGxjLT5uYW1lLCBsYy0+ZmQpOworCUxPR19EQkcoIiB1c2VkX3BmZHMgPSAldSwgZnJlZV9wZmRzID0gJXUiLAorCQl1c2VkX3BmZHMsIGZyZWVfcGZkcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGxpbmtzX3VucmVnaXN0ZXIoaW50IGZkKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGxpbmtfY2FsbGJhY2sgKnAsICpjOworCisJZm9yIChpID0gMDsgaSA8IHVzZWRfcGZkczsgaSsrKQorCQlpZiAoZmQgPT0gcGZkc1tpXS5mZCkgeworCQkJLyogZW50aXJlIHN0cnVjdCBpcyBjb3BpZWQgKG92ZXJ3cml0dGVuKSAqLworCQkJcGZkc1tpXSA9IHBmZHNbdXNlZF9wZmRzIC0gMV07CisJCQl1c2VkX3BmZHMtLTsKKwkJCWZyZWVfcGZkcysrOworCQl9CisKKwlmb3IgKHAgPSBOVUxMLCBjID0gY2FsbGJhY2tzOyBjOyBwID0gYywgYyA9IGMtPm5leHQpCisJCWlmIChmZCA9PSBjLT5mZCkgeworCQkJTE9HX0RCRygiRnJlZWluZyB1cCAlcy8lZCIsIGMtPm5hbWUsIGMtPmZkKTsKKwkJCUxPR19EQkcoIiB1c2VkX3BmZHMgPSAldSwgZnJlZV9wZmRzID0gJXUiLAorCQkJCXVzZWRfcGZkcywgZnJlZV9wZmRzKTsKKwkJCWlmIChwKQorCQkJCXAtPm5leHQgPSBjLT5uZXh0OworCQkJZWxzZQorCQkJCWNhbGxiYWNrcyA9IGMtPm5leHQ7CisJCQlmcmVlKGMpOworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiAwOworfQorCitpbnQgbGlua3NfbW9uaXRvcih2b2lkKQoreworCXVuc2lnbmVkIGk7CisJaW50IHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9wZmRzOyBpKyspIHsKKwkJcGZkc1tpXS5yZXZlbnRzID0gMDsKKwl9CisKKwlyID0gcG9sbChwZmRzLCB1c2VkX3BmZHMsIC0xKTsKKwlpZiAociA8PSAwKQorCQlyZXR1cm4gcjsKKworCXIgPSAwOworCS8qIEZJWE1FOiBoYW5kbGUgUE9MTEhVUCAqLworCWZvciAoaSA9IDA7IGkgPCB1c2VkX3BmZHM7IGkrKykKKwkJaWYgKHBmZHNbaV0ucmV2ZW50cyAmIFBPTExJTikgeworCQkJTE9HX0RCRygiRGF0YSByZWFkeSBvbiAlZCIsIHBmZHNbaV0uZmQpOworCisJCQkvKiBGSVhNRTogQWRkIHRoaXMgYmFjayByZXR1cm4gMTsqLworCQkJcisrOworCQl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGxpbmtzX2lzc3VlX2NhbGxiYWNrcyh2b2lkKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGxpbmtfY2FsbGJhY2sgKmxjOworCisJZm9yIChpID0gMDsgaSA8IHVzZWRfcGZkczsgaSsrKQorCQlpZiAocGZkc1tpXS5yZXZlbnRzICYgUE9MTElOKQorCQkJZm9yIChsYyA9IGNhbGxiYWNrczsgbGM7IGxjID0gbGMtPm5leHQpCisJCQkJaWYgKHBmZHNbaV0uZmQgPT0gbGMtPmZkKSB7CisJCQkJCUxPR19EQkcoIklzc3VpbmcgY2FsbGJhY2sgb24gJXMvJWQiLAorCQkJCQkJbGMtPm5hbWUsIGxjLT5mZCk7CisJCQkJCWxjLT5jYWxsYmFjayhsYy0+ZGF0YSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvY21pcnJvcmQvbGlua19tb24uaCBiL2RhZW1vbnMvY21pcnJvcmQvbGlua19tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDU4YjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9saW5rX21vbi5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX0xWTV9DTE9HX0xJTktfTU9OX0gKKyNkZWZpbmUgX0xWTV9DTE9HX0xJTktfTU9OX0gKKworaW50IGxpbmtzX3JlZ2lzdGVyKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK2ludCBsaW5rc191bnJlZ2lzdGVyKGludCBmZCk7CitpbnQgbGlua3NfbW9uaXRvcih2b2lkKTsKK2ludCBsaW5rc19pc3N1ZV9jYWxsYmFja3Modm9pZCk7CisKKyNlbmRpZiAvKiBfTFZNX0NMT0dfTElOS19NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbWlycm9yZC9sb2NhbC5jIGIvZGFlbW9ucy9jbWlycm9yZC9sb2NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTI1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL2xvY2FsLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlICJsb2dnaW5nLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAibGlua19tb24uaCIKKyNpbmNsdWRlICJsb2NhbC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvY29ubmVjdG9yLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIENOX0lEWF9ETQorLyogS2VybmVsIDIuNi4zMSBpcyByZXF1aXJlZCB0byBydW4gdGhpcyBjb2RlICovCisjZGVmaW5lIENOX0lEWF9ETSAgICAgICAgICAgICAgICAgICAgICAgMHg3ICAgICAvKiBEZXZpY2UgTWFwcGVyICovCisjZGVmaW5lIENOX1ZBTF9ETV9VU0VSU1BBQ0VfTE9HICAgICAgICAgMHgxCisjZW5kaWYKKworc3RhdGljIGludCBjbl9mZCA9IC0xOyAgLyogQ29ubmVjdG9yIChuZXRsaW5rKSBzb2NrZXQgZmQgKi8KK3N0YXRpYyBjaGFyIHJlY3ZfYnVmWzIwNDhdOworc3RhdGljIGNoYXIgc2VuZF9idWZbMjA0OF07CisKKworLyogRklYTUU6IG1lcmdlIHRoaXMgZnVuY3Rpb24gd2l0aCBrZXJuZWxfc2VuZF9oZWxwZXIgKi8KK3N0YXRpYyBpbnQga2VybmVsX2Fjayh1aW50MzJfdCBzZXEsIGludCBlcnJvcikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilzZW5kX2J1ZjsKKwlzdHJ1Y3QgY25fbXNnICptc2cgPSBOTE1TR19EQVRBKG5saCk7CisKKwlpZiAoZXJyb3IgPCAwKSB7CisJCUxPR19FUlJPUigiUHJvZ3JhbW1lciBlcnJvcjogZXJyb3IgY29kZXMgbXVzdCBiZSBwb3NpdGl2ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoc2VuZF9idWYsIDAsIHNpemVvZihzZW5kX2J1ZikpOworCisJbmxoLT5ubG1zZ19zZXEgPSAwOworCW5saC0+bmxtc2dfcGlkID0gZ2V0cGlkKCk7CisJbmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRE9ORTsKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGNuX21zZykpOworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCisJbXNnLT5sZW4gPSAwOworCW1zZy0+aWQuaWR4ID0gQ05fSURYX0RNOworCW1zZy0+aWQudmFsID0gQ05fVkFMX0RNX1VTRVJTUEFDRV9MT0c7CisJbXNnLT5zZXEgPSBzZXE7CisJbXNnLT5hY2sgPSBlcnJvcjsKKworCXIgPSBzZW5kKGNuX2ZkLCBubGgsIE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGNuX21zZykpLCAwKTsKKwkvKiBGSVhNRTogZG8gYmV0dGVyIGVycm9yIHByb2Nlc3NpbmcgKi8KKwlpZiAociA8PSAwKQorCQlyZXR1cm4gLUVCQURFOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGtlcm5lbF9yZWN2CisgKiBAcnE6IHRoZSBuZXdseSBhbGxvY2F0ZWQgcmVxdWVzdCBmcm9tIGtlcm5lbAorICoKKyAqIFJlYWQgcmVxdWVzdHMgZnJvbSB0aGUga2VybmVsIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5ldyByZXF1ZXN0LgorICogSWYgdGhlcmUgaXMgbm8gcmVxdWVzdCBmcm9tIHRoZSBrZXJuZWwsICpycSBpcyBOVUxMLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlIGR1ZSB0byByZXR1cm5lZCBzdGFjayBwb2ludGVyLiAgSW4gZmFjdCwKKyAqIHRoZSByZXR1cm5lZCBwb2ludGVyIG11c3Qgbm90IGJlIGluLXVzZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVYWFggb24gZXJyb3IKKyAqLworc3RhdGljIGludCBrZXJuZWxfcmVjdihzdHJ1Y3QgY2xvZ19yZXF1ZXN0ICoqcnEpCit7CisJaW50IHIgPSAwOworCXNzaXplX3QgbGVuOworCWNoYXIgKmZvbzsKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisJc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqdV9ycTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5sbXNnX2g7CisKKwkqcnEgPSBOVUxMOworCW1lbXNldChyZWN2X2J1ZiwgMCwgc2l6ZW9mKHJlY3ZfYnVmKSk7CisKKwlsZW4gPSByZWN2KGNuX2ZkLCByZWN2X2J1Ziwgc2l6ZW9mKHJlY3ZfYnVmKSwgMCk7CisJaWYgKGxlbiA8IDApIHsKKwkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVjdiBtZXNzYWdlIGZyb20ga2VybmVsIik7CisJCXIgPSAtZXJybm87CisJCWdvdG8gZmFpbDsKKwl9CisKKwlubG1zZ19oID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlY3ZfYnVmOworCXN3aXRjaCAobmxtc2dfaC0+bmxtc2dfdHlwZSkgeworCWNhc2UgTkxNU0dfRVJST1I6CisJCUxPR19FUlJPUigiVW5hYmxlIHRvIHJlY3YgbWVzc2FnZSBmcm9tIGtlcm5lbDogTkxNU0dfRVJST1IiKTsKKwkJciA9IC1FQkFERTsKKwkJZ290byBmYWlsOworCWNhc2UgTkxNU0dfRE9ORToKKwkJbXNnID0gKHN0cnVjdCBjbl9tc2cgKilOTE1TR19EQVRBKChzdHJ1Y3Qgbmxtc2doZHIgKilyZWN2X2J1Zik7CisJCWxlbiAtPSAoc3NpemVfdClzaXplb2Yoc3RydWN0IG5sbXNnaGRyKTsKKworCQlpZiAobGVuIDwgKHNzaXplX3Qpc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKSB7CisJCQlMT0dfRVJST1IoIkluY29tcGxldGUgcmVxdWVzdCBmcm9tIGtlcm5lbCByZWNlaXZlZCIpOworCQkJciA9IC1FQkFERTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChtc2ctPmxlbiA+IERNX1VMT0dfUkVRVUVTVF9TSVpFKSB7CisJCQlMT0dfRVJST1IoIk5vdCBlbm91Z2ggc3BhY2UgdG8gcmVjZWl2ZSBrZXJuZWwgcmVxdWVzdCAoJWQvJWQpIiwKKwkJCQkgIG1zZy0+bGVuLCBETV9VTE9HX1JFUVVFU1RfU0laRSk7CisJCQlyID0gLUVCQURFOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKCFtc2ctPmxlbikKKwkJCUxPR19FUlJPUigiWmVybyBsZW5ndGggbWVzc2FnZSByZWNlaXZlZCIpOworCisJCWxlbiAtPSAoc3NpemVfdClzaXplb2Yoc3RydWN0IGNuX21zZyk7CisKKwkJaWYgKGxlbiA8IG1zZy0+bGVuKQorCQkJTE9HX0VSUk9SKCJsZW4gPSAlemQsIG1zZy0+bGVuID0gJSIgUFJJdTE2LCBsZW4sIG1zZy0+bGVuKTsKKworCQltc2ctPmRhdGFbbXNnLT5sZW5dID0gJ1wwJzsgLyogQ2xlYW5lciB3YXkgdG8gZW5zdXJlIHRoaXM/ICovCisJCXVfcnEgPSAoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqKW1zZy0+ZGF0YTsKKworCQlpZiAoIXVfcnEtPnJlcXVlc3RfdHlwZSkgeworCQkJTE9HX0RCRygiQmFkIHRyYW5zbWlzc2lvbiwgcmVxdWVzdGluZyByZXNlbmQgWyV1XSIsCisJCQkJbXNnLT5zZXEpOworCQkJciA9IC1FQUdBSU47CisKKwkJCWlmIChrZXJuZWxfYWNrKG1zZy0+c2VxLCBFQUdBSU4pKSB7CisJCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gTkFDSyBrZXJuZWwgdHJhbnNtaXNzaW9uIFsldV0iLAorCQkJCQkgIG1zZy0+c2VxKTsKKwkJCQlyID0gLUVCQURFOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogTm93IHdlJ3ZlIGdvdCBzaXplb2Yoc3RydWN0IGNuX21zZykgKyBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKQorCQkgKiB3b3J0aCBvZiBzcGFjZSB0aGF0IHByZWNlZGUgdGhlIHJlcXVlc3Qgc3RydWN0dXJlIGZyb20gdGhlCisJCSAqIGtlcm5lbC4gIFNpbmNlIHRoYXQgc3BhY2UgaXNuJ3QgZ29pbmcgdG8gYmUgdXNlZCBhZ2Fpbiwgd2UKKwkJICogY2FuIHRha2UgaXQgZm9yIG91ciBwdXJwb3NlczsgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIHdob2xlCisJCSAqIG5ldyBzdHJ1Y3R1cmUgYW5kIGRvaW5nIGEgbWVtY3B5LgorCQkgKgorCQkgKiBXZSBzaG91bGQgcmVhbGx5IG1ha2Ugc3VyZSAnY2xvZ19yZXF1ZXN0JyBkb2Vzbid0IGdyb3cKKwkJICogYmV5b25kIHdoYXQgaXMgYXZhaWxhYmxlIHRvIHVzLCBidXQgd2UgbmVlZCBvbmx5IGNoZWNrIGl0CisJCSAqIG9uY2UuLi4gcGVyaGFwcyBhdCBjb21waWxlIHRpbWU/CisJCSAqLworCQlmb28gPSAoY2hhciAqKXVfcnE7CisJCWZvbyAtPSAoc2l6ZW9mKHN0cnVjdCBjbG9nX3JlcXVlc3QpIC0gc2l6ZW9mKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QpKTsKKwkJKnJxID0gKHN0cnVjdCBjbG9nX3JlcXVlc3QgKikgZm9vOworCisJCS8qIENsZWFyIHRoZSB3cmFwcGVyIGNvbnRhaW5lciBmaWVsZHMgKi8KKwkJbWVtc2V0KCpycSwgMCwgKHNpemVfdCkoKGNoYXIgKil1X3JxIC0gKGNoYXIgKikoKnJxKSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dfRVJST1IoIlVua25vd24gbmxtc2dfdHlwZSIpOworCQlyID0gLUVCQURFOworCX0KKworZmFpbDoKKwlpZiAocikKKwkJKnJxID0gTlVMTDsKKworCXJldHVybiAociA9PSAtRUFHQUlOKSA/IDAgOiByOworfQorCitzdGF0aWMgaW50IGtlcm5lbF9zZW5kX2hlbHBlcih2b2lkICpkYXRhLCB1aW50MTZfdCBvdXRfc2l6ZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisKKwltZW1zZXQoc2VuZF9idWYsIDAsIHNpemVvZihzZW5kX2J1ZikpOworCisJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNlbmRfYnVmOworCW5saC0+bmxtc2dfc2VxID0gMDsgIC8qIEZJWE1FOiBJcyB0aGlzIHVzZWQ/ICovCisJbmxoLT5ubG1zZ19waWQgPSBnZXRwaWQoKTsKKwlubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19ET05FOworCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKG91dF9zaXplICsgc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gMDsKKworCW1zZyA9IE5MTVNHX0RBVEEobmxoKTsKKwltZW1jcHkobXNnLT5kYXRhLCBkYXRhLCBvdXRfc2l6ZSk7CisJbXNnLT5sZW4gPSBvdXRfc2l6ZTsKKwltc2ctPmlkLmlkeCA9IENOX0lEWF9ETTsKKwltc2ctPmlkLnZhbCA9IENOX1ZBTF9ETV9VU0VSU1BBQ0VfTE9HOworCW1zZy0+c2VxID0gMDsKKworCXIgPSBzZW5kKGNuX2ZkLCBubGgsIE5MTVNHX0xFTkdUSChvdXRfc2l6ZSArIHNpemVvZihzdHJ1Y3QgY25fbXNnKSksIDApOworCS8qIEZJWE1FOiBkbyBiZXR0ZXIgZXJyb3IgcHJvY2Vzc2luZyAqLworCWlmIChyIDw9IDApCisJCXJldHVybiAtRUJBREU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRvX2xvY2FsX3dvcmsKKyAqCisgKiBBbnkgcHJvY2Vzc2luZyBlcnJvcnMgYXJlIHBsYWNlZCBpbiB0aGUgJ3JxJworICogc3RydWN0dXJlIHRvIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIGtlcm5lbC4KKyAqIEl0IG1heSBiZSBwb2ludGxlc3MgZm9yIHRoaXMgZnVuY3Rpb24gdG8KKyAqIHJldHVybiBhbiBpbnQuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRVhYWCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZG9fbG9jYWxfd29yayh2b2lkICpkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWludCByOworCXN0cnVjdCBjbG9nX3JlcXVlc3QgKnJxOworCXN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnVfcnEgPSBOVUxMOworCisJciA9IGtlcm5lbF9yZWN2KCZycSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKCFycSkKKwkJcmV0dXJuIDA7CisKKwl1X3JxID0gJnJxLT51X3JxOworCUxPR19EQkcoIlslc10gIFJlcXVlc3QgZnJvbSBrZXJuZWwgcmVjZWl2ZWQ6IFslcy8ldV0iLAorCQlTSE9SVF9VVUlEKHVfcnEtPnV1aWQpLCBSUV9UWVBFKHVfcnEtPnJlcXVlc3RfdHlwZSksCisJCXVfcnEtPnNlcSk7CisJc3dpdGNoICh1X3JxLT5yZXF1ZXN0X3R5cGUpIHsKKwljYXNlIERNX1VMT0dfQ1RSOgorCWNhc2UgRE1fVUxPR19EVFI6CisJY2FzZSBETV9VTE9HX0dFVF9SRUdJT05fU0laRToKKwljYXNlIERNX1VMT0dfSU5fU1lOQzoKKwljYXNlIERNX1VMT0dfR0VUX1NZTkNfQ09VTlQ6CisJY2FzZSBETV9VTE9HX1NUQVRVU19UQUJMRToKKwljYXNlIERNX1VMT0dfUFJFU1VTUEVORDoKKwkJLyogV2UgZG8gbm90IHNwZWNpZnkgb3Vyc2VsdmVzIGFzIHNlcnZlciBoZXJlICovCisJCXIgPSBkb19yZXF1ZXN0KHJxLCAwKTsKKwkJaWYgKHIpCisJCQlMT0dfREJHKCJSZXR1cm5pbmcgZmFpbGVkIHJlcXVlc3QgdG8ga2VybmVsIFslc10iLAorCQkJCVJRX1RZUEUodV9ycS0+cmVxdWVzdF90eXBlKSk7CisJCXIgPSBrZXJuZWxfc2VuZCh1X3JxKTsKKwkJaWYgKHIpCisJCQlMT0dfRVJST1IoIkZhaWxlZCB0byByZXNwb25kIHRvIGtlcm5lbCBbJXNdIiwKKwkJCQkgIFJRX1RZUEUodV9ycS0+cmVxdWVzdF90eXBlKSk7CisKKwkJYnJlYWs7CisJY2FzZSBETV9VTE9HX1JFU1VNRToKKwkJLyoKKwkJICogUmVzdW1lIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgcmVxdWlyZXMgYSBsb2NhbAorCQkgKiBjb21wb25lbnQgdG8gam9pbiB0aGUgQ1BHLCBhbmQgYSBjbHVzdGVyIGNvbXBvbmVudAorCQkgKiB0byBoYW5kbGUgdGhlIHJlcXVlc3QuCisJCSAqLworCQlyID0gbG9jYWxfcmVzdW1lKHVfcnEpOworCQlpZiAocikgeworCQkJTE9HX0RCRygiUmV0dXJuaW5nIGZhaWxlZCByZXF1ZXN0IHRvIGtlcm5lbCBbJXNdIiwKKwkJCQlSUV9UWVBFKHVfcnEtPnJlcXVlc3RfdHlwZSkpOworCQkJciA9IGtlcm5lbF9zZW5kKHVfcnEpOworCQkJaWYgKHIpCisJCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVzcG9uZCB0byBrZXJuZWwgWyVzXSIsCisJCQkJCSAgUlFfVFlQRSh1X3JxLT5yZXF1ZXN0X3R5cGUpKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEVMU0UsIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRE1fVUxPR19JU19DTEVBTjoKKwljYXNlIERNX1VMT0dfRkxVU0g6CisJY2FzZSBETV9VTE9HX01BUktfUkVHSU9OOgorCWNhc2UgRE1fVUxPR19HRVRfUkVTWU5DX1dPUks6CisJY2FzZSBETV9VTE9HX1NFVF9SRUdJT05fU1lOQzoKKwljYXNlIERNX1VMT0dfU1RBVFVTX0lORk86CisJY2FzZSBETV9VTE9HX0lTX1JFTU9URV9SRUNPVkVSSU5HOgorCWNhc2UgRE1fVUxPR19QT1NUU1VTUEVORDoKKwkJciA9IGNsdXN0ZXJfc2VuZChycSk7CisJCWlmIChyKSB7CisJCQl1X3JxLT5kYXRhX3NpemUgPSAwOworCQkJdV9ycS0+ZXJyb3IgPSByOworCQkJaWYgKGtlcm5lbF9zZW5kKHVfcnEpKQorCQkJCUxPR19FUlJPUigiRmFpbGVkIHRvIHJlc3BvbmQgdG8ga2VybmVsIFslc10iLAorCQkJCQkgIFJRX1RZUEUodV9ycS0+cmVxdWVzdF90eXBlKSk7CisJCX0KKworCQlicmVhazsKKwljYXNlIERNX1VMT0dfQ0xFQVJfUkVHSU9OOgorCQlyID0ga2VybmVsX2Fjayh1X3JxLT5zZXEsIDApOworCisJCXIgPSBjbHVzdGVyX3NlbmQocnEpOworCQlpZiAocikgeworCQkJLyoKKwkJCSAqIEZJWE1FOiBzdG9yZSBlcnJvciBmb3IgZGVsaXZlcnkgb24gZmx1c2gKKwkJCSAqICAgICAgICBUaGlzIHdvdWxkIGFsbG93IHVzIHRvIG9wdGltaXplIE1BUktfUkVHSU9OCisJCQkgKiAgICAgICAgdG9vLgorCQkJICovCisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dfRVJST1IoIkludmFsaWQgbG9nIHJlcXVlc3QgcmVjZWl2ZWQgKCV1KSwgaWdub3JpbmcuIiwKKwkJCSAgdV9ycS0+cmVxdWVzdF90eXBlKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAociAmJiAhdV9ycS0+ZXJyb3IpCisJCXVfcnEtPmVycm9yID0gcjsKKworCXJldHVybiByOworfQorCisvKgorICoga2VybmVsX3NlbmQKKyAqIEB1X3JxOiByZXN1bHQgdG8gcGFzcyBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdV9ycSBzdHJ1Y3R1cmUKKyAqIChjb250YWluaW5nIHRoZSByZXN1bHRzKSB0byB0aGUga2VybmVsLgorICogSXQgdGhlbiBmcmVlcyB0aGUgc3RydWN0dXJlLgorICoKKyAqIFdBUk5JTkc6IHNob3VsZCB0aGUgc3RydWN0dXJlIGJlIGZyZWVkIGlmCisgKiB0aGVyZSBpcyBhbiBlcnJvcj8gIEkgdm90ZSAneWVzJy4gIElmIHRoZQorICoga2VybmVsIGRvZXNuJ3QgZ2V0IHRoZSByZXNwb25zZSwgaXQgc2hvdWxkCisgKiByZXNlbmQgdGhlIHJlcXVlc3QuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRVhYWCBvbiBmYWlsdXJlCisgKi8KK2ludCBrZXJuZWxfc2VuZChzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICp1X3JxKQoreworCWludCByOworCXVpbnQxNl90IHNpemU7CisKKwlpZiAoIXVfcnEpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9ICh1aW50MTZfdCkoc2l6ZW9mKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QpICsgdV9ycS0+ZGF0YV9zaXplKTsKKworCWlmICghdV9ycS0+ZGF0YV9zaXplICYmICF1X3JxLT5lcnJvcikgeworCQkvKiBBbiBBQ0sgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisKKwkJLyogRklYTUU6IGFkZCBBQ0sgY29kZSAqLworCX0gZWxzZSBpZiAoc2l6ZSA+IERNX1VMT0dfUkVRVUVTVF9TSVpFKSB7CisJCS8qCisJCSAqIElmIHdlIGdvdHRlbiBoZXJlLCB3ZSd2ZSBhbHJlYWR5IG92ZXJydW4KKwkJICogb3VyIGFsbG90dGVkIHNwYWNlIHNvbWV3aGVyZS4KKwkJICoKKwkJICogV2UgbXVzdCBkbyBzb21ldGhpbmcsIGJlY2F1c2UgdGhlIGtlcm5lbAorCQkgKiBpcyB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLgorCQkgKi8KKwkJTE9HX0VSUk9SKCJOb3QgZW5vdWdoIHNwYWNlIHRvIHJlc3BvbmQgdG8gc2VydmVyIik7CisJCXVfcnEtPmVycm9yID0gLUVOT1NQQzsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0KTsKKwl9CisKKwlyID0ga2VybmVsX3NlbmRfaGVscGVyKHVfcnEsIHNpemUpOworCWlmIChyKQorCQlMT0dfRVJST1IoIkZhaWxlZCB0byBzZW5kIG1zZyB0byBrZXJuZWwuIik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIGluaXRfbG9jYWwKKyAqCisgKiBJbml0aWFsaXplIGtlcm5lbCBjb21tdW5pY2F0aW9uIHNvY2tldCAobmV0bGluaykKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIHZhbHVlcyBmcm9tIGNvbW1vbi5oIG9uIGZhaWx1cmUKKyAqLworaW50IGluaXRfbG9jYWwodm9pZCkKK3sKKwlpbnQgciA9IDA7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOworCisJY25fZmQgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSwgTkVUTElOS19DT05ORUNUT1IpOworCWlmIChjbl9mZCA8IDApCisJCXJldHVybiBFWElUX0tFUk5FTF9TT0NLRVQ7CisKKwkvKiBtZW1zZXQgdG8gZml4IHZhbGdyaW5kIGNvbXBsYWludCAqLworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9ubCkpOworCisJYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCWFkZHIubmxfZ3JvdXBzID0gQ05fSURYX0RNOworCWFkZHIubmxfcGlkID0gMDsKKworCXIgPSBiaW5kKGNuX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyIDwgMCkgeworCQlpZiAoY2xvc2UoY25fZmQpKQorCQkJTE9HX0VSUk9SKCJGYWlsZWQgdG8gY2xvc2Ugc29ja2V0OiAlcyIsCisJCQkJICBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gRVhJVF9LRVJORUxfQklORDsKKwl9CisKKwlvcHQgPSBhZGRyLm5sX2dyb3VwczsKKwlyID0gc2V0c29ja29wdChjbl9mZCwgMjcwLCBORVRMSU5LX0FERF9NRU1CRVJTSElQLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJaWYgKHIpIHsKKwkJaWYgKGNsb3NlKGNuX2ZkKSkKKwkJCUxPR19FUlJPUigiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLAorCQkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIEVYSVRfS0VSTkVMX1NFVFNPQ0tPUFQ7CisJfQorCisJLyoKKwlyID0gZmNudGwoY25fZmQsIEZfU0VURkwsIEZOREVMQVkpOworCSovCisKKwlsaW5rc19yZWdpc3Rlcihjbl9mZCwgImxvY2FsIiwgZG9fbG9jYWxfd29yaywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsZWFudXBfbG9jYWwKKyAqCisgKiBDbGVhbiB1cCBiZWZvcmUgZXhpdGluZworICovCit2b2lkIGNsZWFudXBfbG9jYWwodm9pZCkKK3sKKwlsaW5rc191bnJlZ2lzdGVyKGNuX2ZkKTsKKwlpZiAoY25fZmQgPj0gMCAmJiBjbG9zZShjbl9mZCkpCisJCUxPR19FUlJPUigiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLAorCQkJICBzdHJlcnJvcihlcnJubykpOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbWlycm9yZC9sb2NhbC5oIGIvZGFlbW9ucy9jbWlycm9yZC9sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzllNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL2xvY2FsLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBfTFZNX0NMT0dfTE9DQUxfSAorI2RlZmluZSBfTFZNX0NMT0dfTE9DQUxfSAorCitpbnQgaW5pdF9sb2NhbCh2b2lkKTsKK3ZvaWQgY2xlYW51cF9sb2NhbCh2b2lkKTsKKworaW50IGtlcm5lbF9zZW5kKHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgKnJxKTsKKworI2VuZGlmIC8qIF9MVk1fQ0xPR19MT0NBTF9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2NtaXJyb3JkL2xvZ2dpbmcuYyBiL2RhZW1vbnMvY21pcnJvcmQvbG9nZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjY2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2NtaXJyb3JkL2xvZ2dpbmcuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAibG9nZ2luZy5oIgorCitjb25zdCBjaGFyICpfX3JxX3R5cGVzX29mZl9ieV9vbmVbXSA9IHsKKwkiRE1fVUxPR19DVFIiLAorCSJETV9VTE9HX0RUUiIsCisJIkRNX1VMT0dfUFJFU1VTUEVORCIsCisJIkRNX1VMT0dfUE9TVFNVU1BFTkQiLAorCSJETV9VTE9HX1JFU1VNRSIsCisJIkRNX1VMT0dfR0VUX1JFR0lPTl9TSVpFIiwKKwkiRE1fVUxPR19JU19DTEVBTiIsCisJIkRNX1VMT0dfSU5fU1lOQyIsCisJIkRNX1VMT0dfRkxVU0giLAorCSJETV9VTE9HX01BUktfUkVHSU9OIiwKKwkiRE1fVUxPR19DTEVBUl9SRUdJT04iLAorCSJETV9VTE9HX0dFVF9SRVNZTkNfV09SSyIsCisJIkRNX1VMT0dfU0VUX1JFR0lPTl9TWU5DIiwKKwkiRE1fVUxPR19HRVRfU1lOQ19DT1VOVCIsCisJIkRNX1VMT0dfU1RBVFVTX0lORk8iLAorCSJETV9VTE9HX1NUQVRVU19UQUJMRSIsCisJIkRNX1VMT0dfSVNfUkVNT1RFX1JFQ09WRVJJTkciLAorCU5VTEwKK307CisKK2ludCBsb2dfdGFiYmluZyA9IDA7CitpbnQgbG9nX2lzX29wZW4gPSAwOworCisvKgorICogVmFyaWFibGVzIGZvciB2YXJpb3VzIGNvbmRpdGlvbmFsIGxvZ2dpbmcKKyAqLworI2lmZGVmIE1FTUIKK2ludCBsb2dfbWVtYmVyc2hpcF9jaGFuZ2UgPSAxOworI2Vsc2UKK2ludCBsb2dfbWVtYmVyc2hpcF9jaGFuZ2UgPSAwOworI2VuZGlmCisKKyNpZmRlZiBDS1BUCitpbnQgbG9nX2NoZWNrcG9pbnQgPSAxOworI2Vsc2UKK2ludCBsb2dfY2hlY2twb2ludCA9IDA7CisjZW5kaWYKKworI2lmZGVmIFJFU0VORAoraW50IGxvZ19yZXNlbmRfcmVxdWVzdHMgPSAxOworI2Vsc2UKK2ludCBsb2dfcmVzZW5kX3JlcXVlc3RzID0gMDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9jbWlycm9yZC9sb2dnaW5nLmggYi9kYWVtb25zL2NtaXJyb3JkL2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRlMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9jbWlycm9yZC9sb2dnaW5nLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fQ0xPR19MT0dHSU5HX0gKKyNkZWZpbmUgX0xWTV9DTE9HX0xPR0dJTkdfSAorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKyNpbmNsdWRlICJjb25maWd1cmUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvKiBTSE9SVF9VVUlEIC0gcHJpbnQgbGFzdCA4IGNoYXJzIG9mIGEgc3RyaW5nICovCisjZGVmaW5lIFNIT1JUX1VVSUQoeCkgKHN0cmxlbih4KSA+IDgpID8gKCh4KSArIChzdHJsZW4oeCkgLSA4KSkgOiAoeCkKKworZXh0ZXJuIGNvbnN0IGNoYXIgKl9fcnFfdHlwZXNfb2ZmX2J5X29uZVtdOworI2RlZmluZSBSUV9UWVBFKHgpIF9fcnFfdHlwZXNfb2ZmX2J5X29uZVsoeCkgLSAxXQorCitleHRlcm4gaW50IGxvZ190YWJiaW5nOworZXh0ZXJuIGludCBsb2dfaXNfb3BlbjsKK2V4dGVybiBpbnQgbG9nX21lbWJlcnNoaXBfY2hhbmdlOworZXh0ZXJuIGludCBsb2dfY2hlY2twb2ludDsKK2V4dGVybiBpbnQgbG9nX3Jlc2VuZF9yZXF1ZXN0czsKKworI2RlZmluZSBMT0dfT1BFTihpZGVudCwgb3B0aW9uLCBmYWNpbGl0eSkgZG8geyBcCisJCW9wZW5sb2coaWRlbnQsIG9wdGlvbiwgZmFjaWxpdHkpOyBcCisJCWxvZ19pc19vcGVuID0gMTsJCSAgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX0NMT1NFKHZvaWQpIGRvIHsgXAorCQlsb2dfaXNfb3BlbiA9IDA7IFwKKwkJY2xvc2Vsb2coKTsJIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIExPR19PVVRQVVQobGV2ZWwsIGYsIGFyZy4uLikgZG8gewkJCQlcCisJCWludCBfX2k7CQkJCQkJXAorCQljaGFyIF9fYnVmZmVyWzE2XTsJCQkJCVwKKwkJRklMRSAqZnAgPSAobGV2ZWwgPiBMT0dfTk9USUNFKSA/IHN0ZGVyciA6IHN0ZG91dDsJXAorCQlpZiAobG9nX2lzX29wZW4pIHsJCQkJCVwKKwkJCWZvciAoX19pID0gMDsgKF9faSA8IGxvZ190YWJiaW5nKSAmJiAoX19pIDwgMTUpOyBfX2krKykgXAorCQkJCV9fYnVmZmVyW19faV0gPSAnXHQnOwkJCVwKKwkJCV9fYnVmZmVyW19faV0gPSAnXDAnOwkJCQlcCisJCQlzeXNsb2cobGV2ZWwsICIlcyIgZiAiXG4iLCBfX2J1ZmZlciwgIyMgYXJnKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCWZvciAoX19pID0gMDsgX19pIDwgbG9nX3RhYmJpbmc7IF9faSsrKQkJXAorCQkJCWZwcmludGYoZnAsICJcdCIpOwkJCVwKKwkJCWZwcmludGYoZnAsIGYgIlxuIiwgIyMgYXJnKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIExPR19EQkcoZiwgYXJnLi4uKSBMT0dfT1VUUFVUKExPR19ERUJVRywgZiwgIyMgYXJnKQorI2Vsc2UgLyogREVCVUcgKi8KKyNkZWZpbmUgTE9HX0RCRyhmLCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHICovCisKKyNkZWZpbmUgTE9HX0NPTkQoX19YLCBmLCBhcmcuLi4pIGRvIHtcCisJCWlmIChfX1gpIHsgCSAgICAgXAorCQkJTE9HX09VVFBVVChMT0dfTk9USUNFLCBmLCAjIyBhcmcpOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIExPR19QUklOVChmLCBhcmcuLi4pIExPR19PVVRQVVQoTE9HX05PVElDRSwgZiwgIyMgYXJnKQorI2RlZmluZSBMT0dfRVJST1IoZiwgYXJnLi4uKSBMT0dfT1VUUFVUKExPR19FUlIsIGYsICMjIGFyZykKKworI2VuZGlmIC8qIF9MVk1fQ0xPR19MT0dHSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvLmV4cG9ydGVkX3N5bWJvbHMgYi9kYWVtb25zL2RtZXZlbnRkLy5leHBvcnRlZF9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjc0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkLy5leHBvcnRlZF9zeW1ib2xzCkBAIC0wLDAgKzEsNCBAQAoraW5pdF9maWZvcworZmluaV9maWZvcworZGFlbW9uX3RhbGsKK2RtX2V2ZW50X2dldF92ZXJzaW9uCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkLy5naXRpZ25vcmUgYi9kYWVtb25zL2RtZXZlbnRkLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjY2E0YwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitkbWV2ZW50ZApkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvZG1ldmVudGQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlYzkzOAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IGxpYmRldm1hcHBlci1ldmVudC5jCitTT1VSQ0VTMiA9IGRtZXZlbnRkLmMKKworVEFSR0VUUyA9IGRtZXZlbnRkCisKKy5QSE9OWTogaW5zdGFsbF9saWJfZHluYW1pYyBpbnN0YWxsX2xpYl9zdGF0aWMgaW5zdGFsbF9pbmNsdWRlIFwKKwlpbnN0YWxsX3BrZ2NvbmZpZyBpbnN0YWxsX2RtZXZlbnRkX2R5bmFtaWMgaW5zdGFsbF9kbWV2ZW50ZF9zdGF0aWMgXAorCWluc3RhbGxfbGliIGluc3RhbGxfZG1ldmVudGQKKworSU5TVEFMTF9ETUVWRU5URF9UQVJHRVRTID0gaW5zdGFsbF9kbWV2ZW50ZF9keW5hbWljCitJTlNUQUxMX0xJQl9UQVJHRVRTID0gaW5zdGFsbF9saWJfZHluYW1pYworCitMSUJfTkFNRSA9IGxpYmRldm1hcHBlci1ldmVudAoraWZlcSAoIkBTVEFUSUNfTElOS0AiLCAieWVzIikKKyAgTElCX1NUQVRJQyA9ICQoTElCX05BTUUpLmEKKyAgVEFSR0VUUyArPSAkKExJQl9TVEFUSUMpIGRtZXZlbnRkLnN0YXRpYworICBJTlNUQUxMX0RNRVZFTlREX1RBUkdFVFMgKz0gaW5zdGFsbF9kbWV2ZW50ZF9zdGF0aWMKKyAgSU5TVEFMTF9MSUJfVEFSR0VUUyArPSBpbnN0YWxsX2xpYl9zdGF0aWMKK2VuZGlmCisKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9ETSkKK0xJQl9TSEFSRUQgPSAkKExJQl9OQU1FKS4kKExJQl9TVUZGSVgpCisKK0NMRUFOX1RBUkdFVFMgPSBkbWV2ZW50ZC5zdGF0aWMgJChMSUJfTkFNRSkuYQorCitpZm5lcSAoJChNQUtFQ01ER09BTFMpLGRldmljZS1tYXBwZXIpCisgIFNVQkRJUlMrPXBsdWdpbnMKK2VuZGlmCisKK0NGTE9XX0xJU1QgPSAkKFNPVVJDRVMpCitDRkxPV19MSVNUX1RBUkdFVCA9ICQoTElCX05BTUUpLmNmbG93CitDRkxPV19UQVJHRVQgPSBkbWV2ZW50ZAorCitFWFBPUlRFRF9IRUFERVIgPSAkKHNyY2RpcikvbGliZGV2bWFwcGVyLWV2ZW50LmgKK0VYUE9SVEVEX0ZOX1BSRUZJWCA9IGRtX2V2ZW50CisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCithbGw6IGRldmljZS1tYXBwZXIKK2RldmljZS1tYXBwZXI6ICQoVEFSR0VUUykKKworTElCUyArPSAtbGRldm1hcHBlcgorTFZNTElCUyArPSAtbGRldm1hcHBlci1ldmVudCAkKFBUSFJFQURfTElCUykKKworQ0ZMQUdTX2RtZXZlbnRkLm8gKz0gJChFWFRSQV9FWEVDX0NGTEFHUykKKworZG1ldmVudGQ6ICQoTElCX1NIQVJFRCkgZG1ldmVudGQubworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQoRVhUUkFfRVhFQ19MREZMQUdTKSAkKEVMREZMQUdTKSAtTC4gLW8gJEAgZG1ldmVudGQubyBcCisJJChETF9MSUJTKSAkKExWTUxJQlMpICQoTElCUykgLXJkeW5hbWljCisKK2RtZXZlbnRkLnN0YXRpYzogJChMSUJfU1RBVElDKSBkbWV2ZW50ZC5vICQoaW50ZXJmYWNlYnVpbGRkaXIpL2xpYmRldm1hcHBlci5hCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgJChFTERGTEFHUykgLXN0YXRpYyAtTC4gLUwkKGludGVyZmFjZWJ1aWxkZGlyKSAtbyAkQCBcCisJZG1ldmVudGQubyAkKERMX0xJQlMpICQoTFZNTElCUykgJChMSUJTKSAkKFNUQVRJQ19MSUJTKQorCitpZmVxICgiQFBLR0NPTkZJR0AiLCAieWVzIikKKyAgSU5TVEFMTF9MSUJfVEFSR0VUUyArPSBpbnN0YWxsX3BrZ2NvbmZpZworZW5kaWYKKworaWZuZXEgKCIkKENGTE9XX0NNRCkiLCAiIikKK0NGTE9XX1NPVVJDRVMgPSAkKGFkZHByZWZpeCAkKHNyY2RpcikvLCAkKFNPVVJDRVMpKQorLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2xpYmRtL2xpYmRldm1hcHBlci5jZmxvdworLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJsdm0taW50ZXJuYWwuY2Zsb3cKKy1pbmNsdWRlICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtMmNtZC5jZmxvdworLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQvJChMSUJfTkFNRSkuY2Zsb3cKKy1pbmNsdWRlICQodG9wX2J1aWxkZGlyKS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yLyQoTElCX05BTUUpLWx2bTJtaXJyb3IuY2Zsb3cKK2VuZGlmCisKK2luc3RhbGxfaW5jbHVkZTogJChzcmNkaXIpL2xpYmRldm1hcHBlci1ldmVudC5oCisJJChJTlNUQUxMX0RBVEEpIC1EICQ8ICQoaW5jbHVkZWRpcikvJCg8RikKKworaW5zdGFsbF9wa2djb25maWc6IGxpYmRldm1hcHBlci1ldmVudC5wYworCSQoSU5TVEFMTF9EQVRBKSAtRCAkPCAkKHBrZ2NvbmZpZ2RpcikvZGV2bWFwcGVyLWV2ZW50LnBjCisKK2luc3RhbGxfbGliX2R5bmFtaWM6IGluc3RhbGxfbGliX3NoYXJlZAorCitpbnN0YWxsX2xpYl9zdGF0aWM6ICQoTElCX1NUQVRJQykKKwkkKElOU1RBTExfREFUQSkgLUQgJDwgJCh1c3JsaWJkaXIpLyQoPEYpCisKK2luc3RhbGxfbGliOiAkKElOU1RBTExfTElCX1RBUkdFVFMpCisKK2luc3RhbGxfZG1ldmVudGRfZHluYW1pYzogZG1ldmVudGQKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChzYmluZGlyKS8kKDxGKQorCitpbnN0YWxsX2RtZXZlbnRkX3N0YXRpYzogZG1ldmVudGQuc3RhdGljCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQoc3RhdGljZGlyKS8kKDxGKQorCitpbnN0YWxsX2RtZXZlbnRkOiAkKElOU1RBTExfRE1FVkVOVERfVEFSR0VUUykKKworaW5zdGFsbDogaW5zdGFsbF9pbmNsdWRlIGluc3RhbGxfbGliIGluc3RhbGxfZG1ldmVudGQKKworaW5zdGFsbF9kZXZpY2UtbWFwcGVyOiBpbnN0YWxsX2luY2x1ZGUgaW5zdGFsbF9saWIgaW5zdGFsbF9kbWV2ZW50ZAorCitESVNUQ0xFQU5fVEFSR0VUUyArPSBsaWJkZXZtYXBwZXItZXZlbnQucGMKZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvZG1ldmVudGQuYyBiL2RhZW1vbnMvZG1ldmVudGQvZG1ldmVudGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWIzNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9kbWV2ZW50ZC5jCkBAIC0wLDAgKzEsMjI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIGRtZXZlbnRkIC0gZG0gZXZlbnQgZGFlbW9uIHRvIG1vbml0b3IgYWN0aXZlIG1hcHBlZCBkZXZpY2VzCisgKi8KKworI2luY2x1ZGUgImRtLWxvZ2dpbmcuaCIKKworI2luY2x1ZGUgImxpYmRldm1hcHBlci1ldmVudC5oIgorI2luY2x1ZGUgImRtZXZlbnRkLmgiCisKKyNpbmNsdWRlICJ0b29sLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkJLyogZm9yIGh0b25sLCBudG9obCAqLworI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgbXVzbCBsaWJjICovCisKKyNpZmRlZiBfX2xpbnV4X18KKy8qCisgKiBLZXJuZWwgdmVyc2lvbiAyLjYuMzYgYW5kIGhpZ2hlciBoYXMKKyAqIG5ldyBPT00ga2lsbGVyIGFkanVzdG1lbnQgaW50ZXJmYWNlLgorICovCisjICBkZWZpbmUgT09NX0FESl9GSUxFX09MRCAiL3Byb2Mvc2VsZi9vb21fYWRqIgorIyAgZGVmaW5lIE9PTV9BREpfRklMRSAiL3Byb2Mvc2VsZi9vb21fc2NvcmVfYWRqIgorCisvKiBGcm9tIGxpbnV4L29vbS5oICovCisvKiBPbGQgaW50ZXJmYWNlICovCisjICBkZWZpbmUgT09NX0RJU0FCTEUgKC0xNykKKyMgIGRlZmluZSBPT01fQURKVVNUX01JTiAoLTE2KQorLyogTmV3IGludGVyZmFjZSAqLworIyAgZGVmaW5lIE9PTV9TQ09SRV9BREpfTUlOICgtMTAwMCkKKworLyogU3lzdGVtZCBvbi1kZW1hbmQgYWN0aXZhdGlvbiBzdXBwb3J0ICovCisjICBkZWZpbmUgU0RfUlVOVElNRV9VTklUX0ZJTEVfRElSIERFRkFVTFRfRE1fUlVOX0RJUiAiL3N5c3RlbWQvc3lzdGVtLyIKKyMgIGRlZmluZSBTRF9BQ1RJVkFUSU9OX0VOVl9WQVJfTkFNRSAiU0RfQUNUSVZBVElPTiIKKyMgIGRlZmluZSBTRF9MSVNURU5fUElEX0VOVl9WQVJfTkFNRSAiTElTVEVOX1BJRCIKKyMgIGRlZmluZSBTRF9MSVNURU5fRkRTX0VOVl9WQVJfTkFNRSAiTElTVEVOX0ZEUyIKKyMgIGRlZmluZSBTRF9MSVNURU5fRkRTX1NUQVJUIDMKKyMgIGRlZmluZSBTRF9GRF9GSUZPX1NFUlZFUiBTRF9MSVNURU5fRkRTX1NUQVJUCisjICBkZWZpbmUgU0RfRkRfRklGT19DTElFTlQgKFNEX0xJU1RFTl9GRFNfU1RBUlQgKyAxKQorCisjZW5kaWYKKworI2luY2x1ZGUgPHN5c2xvZy5oPgorCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IF9leGl0X25vdyA9IDA7CS8qIHNldCB0byAnMScgd2hlbiBzaWduYWwgaXMgZ2l2ZW4gdG8gZXhpdCAqLworCisvKiBMaXN0ICh1bilsaW5rIG1hY3Jvcy4gKi8KKyNkZWZpbmUJTElOSyh4LCBoZWFkKQkJZG1fbGlzdF9hZGQoaGVhZCwgJih4KS0+bGlzdCkKKyNkZWZpbmUJTElOS19EU08oZHNvKQkJTElOSyhkc28sICZfZHNvX3JlZ2lzdHJ5KQorI2RlZmluZQlMSU5LX1RIUkVBRCh0aHJlYWQpCUxJTksodGhyZWFkLCAmX3RocmVhZF9yZWdpc3RyeSkKKworI2RlZmluZQlVTkxJTksoeCkJCWRtX2xpc3RfZGVsKCYoeCktPmxpc3QpCisjZGVmaW5lCVVOTElOS19EU08oeCkJCVVOTElOSyh4KQorI2RlZmluZQlVTkxJTktfVEhSRUFEKHgpCVVOTElOSyh4KQorCisjZGVmaW5lIERBRU1PTl9OQU1FICJkbWV2ZW50ZCIKKworLyoKKyAgR2xvYmFsIG11dGV4IGZvciB0aHJlYWQgbGlzdCBhY2Nlc3MuIEhhcyB0byBiZSBoZWxkIHdoZW46CisgIC0gaXRlcmF0aW5nIHRocmVhZCBsaXN0CisgIC0gYWRkaW5nIG9yIHJlbW92aW5nIGVsZW1lbnRzIGZyb20gdGhyZWFkIGxpc3QKKyAgLSBjaGFuZ2luZyBvciByZWFkaW5nIHRocmVhZF9zdGF0dXMncyBmaWVsZHM6CisgICAgcHJvY2Vzc2luZywgc3RhdHVzLCBldmVudHMKKyAgVXNlIF9sb2NrX211dGV4KCkgYW5kIF91bmxvY2tfbXV0ZXgoKSB0byBob2xkL3JlbGVhc2UgaXQKKyovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IF9nbG9iYWxfbXV0ZXg7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgVEhSRUFEX1NUQUNLX1NJWkUgPSAzMDAgKiAxMDI0OworCisvKiBEZWZhdWx0IGlkbGUgZXhpdCB0aW1lb3V0IDEgaG91ciAoaW4gc2Vjb25kcykgKi8KK3N0YXRpYyBjb25zdCB0aW1lX3QgRE1FVkVOVERfSURMRV9FWElUX1RJTUVPVVQgPSA2MCAqIDYwOworCitzdGF0aWMgaW50IF9kZWJ1Z19sZXZlbCA9IDA7CitzdGF0aWMgaW50IF91c2Vfc3lzbG9nID0gMTsKK3N0YXRpYyBpbnQgX3N5c3RlbWRfYWN0aXZhdGlvbiA9IDA7CitzdGF0aWMgaW50IF9mb3JlZ3JvdW5kID0gMDsKK3N0YXRpYyBpbnQgX3Jlc3RhcnQgPSAwOworc3RhdGljIHRpbWVfdCBfaWRsZV9zaW5jZSA9IDA7CitzdGF0aWMgY2hhciAqKl9pbml0aWFsX3JlZ2lzdHJhdGlvbnMgPSAwOworCisvKiBGSVhNRSBNYWtlIGNvbmZpZ3VyYWJsZSBhdCBydW50aW1lICovCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA0LCA1KSkpCitzdGF0aWMgdm9pZCBfZG1ldmVudGRfbG9nKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJZG1fZXZlbnRfbG9nKCJkbSIsIGxldmVsLCBmaWxlLCBsaW5lLCAwLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBERUJVR0xPRyAgbG9nX2RlYnVnCitzdGF0aWMgY29uc3QgY2hhciAqZGVjb2RlX2NtZCh1aW50MzJfdCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERNX0VWRU5UX0NNRF9BQ1RJVkU6CQkJcmV0dXJuICJBQ1RJVkUiOworCWNhc2UgRE1fRVZFTlRfQ01EX1JFR0lTVEVSX0ZPUl9FVkVOVDoJCXJldHVybiAiUkVHSVNURVJfRk9SX0VWRU5UIjsKKwljYXNlIERNX0VWRU5UX0NNRF9VTlJFR0lTVEVSX0ZPUl9FVkVOVDoJCXJldHVybiAiVU5SRUdJU1RFUl9GT1JfRVZFTlQiOworCWNhc2UgRE1fRVZFTlRfQ01EX0dFVF9SRUdJU1RFUkVEX0RFVklDRToJcmV0dXJuICJHRVRfUkVHSVNURVJFRF9ERVZJQ0UiOworCWNhc2UgRE1fRVZFTlRfQ01EX0dFVF9ORVhUX1JFR0lTVEVSRURfREVWSUNFOglyZXR1cm4gIkdFVF9ORVhUX1JFR0lTVEVSRURfREVWSUNFIjsKKwljYXNlIERNX0VWRU5UX0NNRF9TRVRfVElNRU9VVDoJCQlyZXR1cm4gIlNFVF9USU1FT1VUIjsKKwljYXNlIERNX0VWRU5UX0NNRF9HRVRfVElNRU9VVDoJCQlyZXR1cm4gIkdFVF9USU1FT1VUIjsKKwljYXNlIERNX0VWRU5UX0NNRF9IRUxMTzoJCQlyZXR1cm4gIkhFTExPIjsKKwljYXNlIERNX0VWRU5UX0NNRF9ESUU6CQkJCXJldHVybiAiRElFIjsKKwljYXNlIERNX0VWRU5UX0NNRF9HRVRfU1RBVFVTOgkJCXJldHVybiAiR0VUX1NUQVRVUyI7CisJY2FzZSBETV9FVkVOVF9DTURfR0VUX1BBUkFNRVRFUlM6CQlyZXR1cm4gIkdFVF9QQVJBTUVURVJTIjsKKwlkZWZhdWx0OgkJCQkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKyNlbHNlCisjICBkZWZpbmUgREVCVUdMT0coZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogRGF0YSBrZXB0IGFib3V0IGEgRFNPLiAqLworc3RydWN0IGRzb19kYXRhIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJY2hhciAqZHNvX25hbWU7CQkvKiBEU08gbmFtZSAoZWcsICJldm1zIiwgImRtcmFpZCIsICJsdm0yIikuICovCisKKwl2b2lkICpkc29faGFuZGxlOwkvKiBPcGFxdWUgaGFuZGxlIGFzIHJldHVybmVkIGZyb20gZGxvcGVuKCkuICovCisJdW5zaWduZWQgaW50IHJlZl9jb3VudDsJLyogTGlicmFyeSByZWZlcmVuY2UgY291bnQuICovCisKKwkvKgorCSAqIEV2ZW50IHByb2Nlc3NpbmcuCisJICoKKwkgKiBUaGUgRFNPIGNhbiBkbyB3aGF0ZXZlciBhcHByb3ByaWF0ZSBzdGVwcyBpZiBhbiBldmVudAorCSAqIGhhcHBlbnMgc3VjaCBhcyBjaGFuZ2luZyB0aGUgbWFwcGluZyBpbiBjYXNlIGEgbWlycm9yCisJICogZmFpbHMsIHVwZGF0ZSB0aGUgYXBwbGljYXRpb24gbWV0YWRhdGEgZXRjLgorCSAqCisJICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgZG1fdGFzayB0aGF0IGlzIGEgcmVzdWx0IG9mCisJICogRE1fREVWSUNFX1dBSVRFVkVOVCBpb2N0bCAocmVzdWx0cyBlcXVpdmFsZW50IHRvCisJICogRE1fREVWSUNFX1NUQVRVUykuIEl0IHNob3VsZCBub3QgZGVzdHJveSBpdC4KKwkgKiBUaGUgY2FsbGVyIG11c3QgZGlzcG9zZSBvZiB0aGUgdGFzay4KKwkgKi8KKwl2b2lkICgqcHJvY2Vzc19ldmVudCkoc3RydWN0IGRtX3Rhc2sgKmRtdCwgZW51bSBkbV9ldmVudF9tYXNrIGV2ZW50LCB2b2lkICoqdXNlcik7CisKKwkvKgorCSAqIERldmljZSByZWdpc3RyYXRpb24uCisJICoKKwkgKiBXaGVuIGFuIGFwcGxpY2F0aW9uIHJlZ2lzdGVycyBhIGRldmljZSBmb3IgYW4gZXZlbnQsIHRoZSBEU08KKwkgKiBjYW4gY2Fycnkgb3V0IGFwcHJvcHJpYXRlIHN0ZXBzIHNvIHRoYXQgYSBsYXRlciBjYWxsIHRvCisJICogdGhlIHByb2Nlc3NfZXZlbnQoKSBmdW5jdGlvbiBpcyBzYW5lIChlZywgcmVhZCBtZXRhZGF0YQorCSAqIGFuZCBhY3RpdmF0ZSBhIG1hcHBpbmcpLgorCSAqLworCWludCAoKnJlZ2lzdGVyX2RldmljZSkoY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICp1dWlkLCBpbnQgbWFqb3IsCisJCQkgICAgICAgaW50IG1pbm9yLCB2b2lkICoqdXNlcik7CisKKwkvKgorCSAqIERldmljZSB1bnJlZ2lzdHJhdGlvbi4KKwkgKgorCSAqIEluIGNhc2UgYWxsIGRldmljZXMgb2YgYSBtYXBwaW5nIChlZywgUkFJRDEwKSBhcmUgdW5yZWdpc3RlcmVkCisJICogZm9yIGV2ZW50cywgdGhlIERTTyBjYW4gcmVjb2duaXplIHRoaXMgYW5kIGNhcnJ5IG91dCBhcHByb3ByaWF0ZQorCSAqIHN0ZXBzIChlZywgZGVhY3RpdmF0ZSBtYXBwaW5nLCBtZXRhZGF0YSB1cGRhdGUpLgorCSAqLworCWludCAoKnVucmVnaXN0ZXJfZGV2aWNlKShjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKnV1aWQsCisJCQkJIGludCBtYWpvciwgaW50IG1pbm9yLCB2b2lkICoqdXNlcik7Cit9Oworc3RhdGljIERNX0xJU1RfSU5JVChfZHNvX3JlZ2lzdHJ5KTsKKworLyogU3RydWN0dXJlIHRvIGtlZXAgcGFyc2VkIHJlZ2lzdGVyIHZhcmlhYmxlcyBmcm9tIGNsaWVudCBtZXNzYWdlLiAqLworc3RydWN0IG1lc3NhZ2VfZGF0YSB7CisJY2hhciAqaWQ7CisJY2hhciAqZHNvX25hbWU7CQkvKiBOYW1lIG9mIERTTy4gKi8KKwljaGFyICpkZXZpY2VfdXVpZDsJLyogTWFwcGVkIGRldmljZSBwYXRoLiAqLworCWNoYXIgKmV2ZW50c19zdHI7CS8qIEV2ZW50cyBzdHJpbmcgYXMgZmV0Y2hlZCBmcm9tIG1lc3NhZ2UuICovCisJZW51bSBkbV9ldmVudF9tYXNrIGV2ZW50c19maWVsZDsJLyogRXZlbnRzIGJpdGZpZWxkLiAqLworCWNoYXIgKnRpbWVvdXRfc3RyOworCXVpbnQzMl90IHRpbWVvdXRfc2VjczsKKwlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgKm1zZzsJLyogUG9pbnRlciB0byBtZXNzYWdlIGJ1ZmZlci4gKi8KK307CisKKy8qIFRoZXJlIGFyZSB0aHJlZSBzdGF0ZXMgYSB0aHJlYWQgY2FuIGF0dGFpbi4gKi8KK2VudW0geworCURNX1RIUkVBRF9SRUdJU1RFUklORywJLyogUmVnaXN0ZXJpbmcsIHRyYW5zaXRpb25zIHRvIFJVTk5JTkcgKi8KKwlETV9USFJFQURfUlVOTklORywJLyogV29ya2luZyBvbiBldmVudHMsIHRyYW5zaXRpb25zIHRvIERPTkUgKi8KKwlETV9USFJFQURfRE9ORQkJLyogVGVybWluYXRlZCBhbmQgY2xlYW51cCBpcyBwZW5kaW5nICovCit9OworCisvKgorICogSG91c2VrZWVwaW5nIG9mIHRocmVhZCtkZXZpY2Ugc3RhdGVzLgorICoKKyAqIE9uZSB0aHJlYWQgcGVyIG1hcHBlZCBkZXZpY2Ugd2hpY2ggY2FuIGJsb2NrIG9uIGl0IHVudGlsIGFuIGV2ZW50CisgKiBvY2N1cnMgYW5kIHRoZSBldmVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9mIHRoZSBEU08gZ2V0cyBjYWxsZWQuCisgKi8KK3N0cnVjdCB0aHJlYWRfc3RhdHVzIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJcHRocmVhZF90IHRocmVhZDsKKworCXN0cnVjdCBkc29fZGF0YSAqZHNvX2RhdGE7CS8qIERTTyB0aGlzIHRocmVhZCBhY2Nlc3Nlcy4gKi8KKworCXN0cnVjdCB7CisJCWNoYXIgKnV1aWQ7CisJCWNoYXIgKm5hbWU7CisJCWludCBtYWpvciwgbWlub3I7CisJfSBkZXZpY2U7CisJaW50IHByb2Nlc3Npbmc7CQkvKiBTZXQgd2hlbiBldmVudCBpcyBiZWluZyBwcm9jZXNzZWQgKi8KKworCWludCBzdGF0dXM7CQkvKiBTZWUgRE1fVEhSRUFEX3tSRUdJU1RFUklORyxSVU5OSU5HLERPTkV9ICovCisKKwlpbnQgZXZlbnRzOwkJLyogYml0ZmllbGQgZm9yIGV2ZW50IGZpbHRlci4gKi8KKwlpbnQgY3VycmVudF9ldmVudHM7CS8qIGJpdGZpZWxkIGZvciBvY2N1cmVkIGV2ZW50cy4gKi8KKwlzdHJ1Y3QgZG1fdGFzayAqd2FpdF90YXNrOworCWludCBwZW5kaW5nOwkJLyogU2V0IHdoZW4gZXZlbnQgZmlsdGVyIGNoYW5nZSBpcyBwZW5kaW5nICovCisJdGltZV90IG5leHRfdGltZTsKKwl1aW50MzJfdCB0aW1lb3V0OworCXN0cnVjdCBkbV9saXN0IHRpbWVvdXRfbGlzdDsKKwl2b2lkICpkc29fcHJpdmF0ZTsgLyogZHNvIHBlci10aHJlYWQgc3RhdHVzIHZhcmlhYmxlICovCisJLyogVE9ETyBwZXItdGhyZWFkIG11dGV4ICovCit9OworCitzdGF0aWMgRE1fTElTVF9JTklUKF90aHJlYWRfcmVnaXN0cnkpOworc3RhdGljIERNX0xJU1RfSU5JVChfdGhyZWFkX3JlZ2lzdHJ5X3VudXNlZCk7CisKK3N0YXRpYyBpbnQgX3RpbWVvdXRfcnVubmluZzsKK3N0YXRpYyBETV9MSVNUX0lOSVQoX3RpbWVvdXRfcmVnaXN0cnkpOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBfdGltZW91dF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgX3RpbWVvdXRfY29uZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKKworCisvKioqKioqKioqKgorICogICBEU08KKyAqKioqKioqKioqLworCisvKiBEU08gZGF0YSBhbGxvY2F0ZS9mcmVlLiAqLworc3RhdGljIHZvaWQgX2ZyZWVfZHNvX2RhdGEoc3RydWN0IGRzb19kYXRhICpkYXRhKQoreworCWRtX2ZyZWUoZGF0YS0+ZHNvX25hbWUpOworCWRtX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNvX2RhdGEgKl9hbGxvY19kc29fZGF0YShzdHJ1Y3QgbWVzc2FnZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBkc29fZGF0YSAqcmV0ID0gKHR5cGVvZihyZXQpKSBkbV96YWxsb2Moc2l6ZW9mKCpyZXQpKTsKKworCWlmICghcmV0KQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHJldC0+ZHNvX25hbWUgPSBkbV9zdHJkdXAoZGF0YS0+ZHNvX25hbWUpKSkgeworCQlkbV9mcmVlKHJldCk7CisJCXJldHVybl9OVUxMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIERTTyByZWZlcmVuY2UgY291bnRpbmcuICovCitzdGF0aWMgdm9pZCBfbGliX2dldChzdHJ1Y3QgZHNvX2RhdGEgKmRhdGEpCit7CisJZGF0YS0+cmVmX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIF9saWJfcHV0KHN0cnVjdCBkc29fZGF0YSAqZGF0YSkKK3sKKwlpZiAoIS0tZGF0YS0+cmVmX2NvdW50KSB7CisJCWRsY2xvc2UoZGF0YS0+ZHNvX2hhbmRsZSk7CisJCVVOTElOS19EU08oZGF0YSk7CisJCV9mcmVlX2Rzb19kYXRhKGRhdGEpOworCisJCS8qIENsb3NlIGNvbnRyb2wgZGV2aWNlIGlmIHRoZXJlIGlzIG5vIHBsdWdpbiBpbi11c2UgKi8KKwkJaWYgKGRtX2xpc3RfZW1wdHkoJl9kc29fcmVnaXN0cnkpKSB7CisJCQlERUJVR0xPRygiVW5ob2xkaW5nIGNvbnRyb2wgZGV2aWNlLiIpOworCQkJZG1faG9sZF9jb250cm9sX2RldigwKTsKKwkJCWRtX2xpYl9yZWxlYXNlKCk7CisJCQlfaWRsZV9zaW5jZSA9IHRpbWUoTlVMTCk7CisJCX0KKwl9Cit9CisKKy8qIEZpbmQgRFNPIGRhdGEuICovCitzdGF0aWMgc3RydWN0IGRzb19kYXRhICpfbG9va3VwX2RzbyhzdHJ1Y3QgbWVzc2FnZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBkc29fZGF0YSAqZHNvX2RhdGEsICpyZXQgPSBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRzb19kYXRhLCAmX2Rzb19yZWdpc3RyeSkKKwkJaWYgKCFzdHJjbXAoZGF0YS0+ZHNvX25hbWUsIGRzb19kYXRhLT5kc29fbmFtZSkpIHsKKwkJCXJldCA9IGRzb19kYXRhOworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIExvb2t1cCBEU08gc3ltYm9scyB3ZSBuZWVkLiAqLworc3RhdGljIGludCBfbG9va3VwX3N5bWJvbCh2b2lkICpkbCwgdm9pZCAqKnN5bWJvbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoISgqc3ltYm9sID0gZGxzeW0oZGwsIG5hbWUpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbG9va3VwX3N5bWJvbHModm9pZCAqZGwsIHN0cnVjdCBkc29fZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gX2xvb2t1cF9zeW1ib2woZGwsICh2b2lkICopICZkYXRhLT5wcm9jZXNzX2V2ZW50LAorCQkJICAgICAicHJvY2Vzc19ldmVudCIpICYmCisJICAgIF9sb29rdXBfc3ltYm9sKGRsLCAodm9pZCAqKSAmZGF0YS0+cmVnaXN0ZXJfZGV2aWNlLAorCQkJICAicmVnaXN0ZXJfZGV2aWNlIikgJiYKKwkgICAgX2xvb2t1cF9zeW1ib2woZGwsICh2b2lkICopICZkYXRhLT51bnJlZ2lzdGVyX2RldmljZSwKKwkJCSAgInVucmVnaXN0ZXJfZGV2aWNlIik7Cit9CisKKy8qIExvYWQgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgRFNPLiAqLworc3RhdGljIHN0cnVjdCBkc29fZGF0YSAqX2xvYWRfZHNvKHN0cnVjdCBtZXNzYWdlX2RhdGEgKmRhdGEpCit7CisJdm9pZCAqZGw7CisJc3RydWN0IGRzb19kYXRhICpyZXQ7CisJY29uc3QgY2hhciAqZGxlcnI7CisKKwlpZiAoIShkbCA9IGRsb3BlbihkYXRhLT5kc29fbmFtZSwgUlRMRF9OT1cpKSkgeworCQlkbGVyciA9IGRsZXJyb3IoKTsKKwkJZ290b19iYWQ7CisJfQorCisJaWYgKCEocmV0ID0gX2FsbG9jX2Rzb19kYXRhKGRhdGEpKSkgeworCQlkbGNsb3NlKGRsKTsKKwkJZGxlcnIgPSAibm8gbWVtb3J5IjsKKwkJZ290b19iYWQ7CisJfQorCisJaWYgKCEoX2xvb2t1cF9zeW1ib2xzKGRsLCByZXQpKSkgeworCQlfZnJlZV9kc29fZGF0YShyZXQpOworCQlkbGNsb3NlKGRsKTsKKwkJZGxlcnIgPSAic3ltYm9scyBtaXNzaW5nIjsKKwkJZ290b19iYWQ7CisJfQorCisJLyogS2VlcCBjb250cm9sIGRldmljZSBvcGVuIHVudGlsIGxhc3QgdXNlciBjbG9zZXMgKi8KKwlpZiAoZG1fbGlzdF9lbXB0eSgmX2Rzb19yZWdpc3RyeSkpIHsKKwkJREVCVUdMT0coIkhvbGRpbmcgY29udHJvbCBkZXZpY2Ugb3Blbi4iKTsKKwkJZG1faG9sZF9jb250cm9sX2RldigxKTsKKwkJX2lkbGVfc2luY2UgPSAwOworCX0KKworCS8qCisJICogS2VlcCBoYW5kbGUgdG8gY2xvc2UgdGhlIGxpYnJhcnkgb25jZQorCSAqIHdlJ3ZlIGdvdCBubyByZWZlcmVuY2VzIHRvIGl0IGFueSBtb3JlLgorCSAqLworCXJldC0+ZHNvX2hhbmRsZSA9IGRsOworCUxJTktfRFNPKHJldCk7CisKKwlyZXR1cm4gcmV0OworYmFkOgorCWxvZ19lcnJvcigiZG1ldmVudGQgJXMgZGxvcGVuIGZhaWxlZDogJXMuIiwgZGF0YS0+ZHNvX25hbWUsIGRsZXJyKTsKKwlkYXRhLT5tc2ctPnNpemUgPSBkbV9hc3ByaW50ZigmKGRhdGEtPm1zZy0+ZGF0YSksICIlcyAlcyBkbG9wZW4gZmFpbGVkOiAlcyIsCisJCQkJICAgICAgZGF0YS0+aWQsIGRhdGEtPmRzb19uYW1lLCBkbGVycik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioKKyAqICBUSFJFQUQKKyAqKioqKioqKioqKiovCisKKy8qIEFsbG9jYXRlL2ZyZWUgdGhlIHRocmVhZCBzdGF0dXMgc3RydWN0dXJlIGZvciBhIG1vbml0b3JpbmcgdGhyZWFkLiAqLworc3RhdGljIHZvaWQgX2ZyZWVfdGhyZWFkX3N0YXR1cyhzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCisJX2xpYl9wdXQodGhyZWFkLT5kc29fZGF0YSk7CisJaWYgKHRocmVhZC0+d2FpdF90YXNrKQorCQlkbV90YXNrX2Rlc3Ryb3kodGhyZWFkLT53YWl0X3Rhc2spOworCWRtX2ZyZWUodGhyZWFkLT5kZXZpY2UudXVpZCk7CisJZG1fZnJlZSh0aHJlYWQtPmRldmljZS5uYW1lKTsKKwlkbV9mcmVlKHRocmVhZCk7Cit9CisKKy8qIE5vdGU6IGV2ZW50c19maWVsZCBtdXN0IG5vdCBiZSAwLCBlbnN1cmVkIGJ5IGNhbGxlciAqLworc3RhdGljIHN0cnVjdCB0aHJlYWRfc3RhdHVzICpfYWxsb2NfdGhyZWFkX3N0YXR1cyhjb25zdCBzdHJ1Y3QgbWVzc2FnZV9kYXRhICpkYXRhLAorCQkJCQkJICBzdHJ1Y3QgZHNvX2RhdGEgKmRzb19kYXRhKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisKKwlpZiAoISh0aHJlYWQgPSBkbV96YWxsb2Moc2l6ZW9mKCp0aHJlYWQpKSkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY3JlYXRlIG5ldyB0aHJlYWQsIG91dCBvZiBtZW1vcnkuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCV9saWJfZ2V0KGRzb19kYXRhKTsKKwl0aHJlYWQtPmRzb19kYXRhID0gZHNvX2RhdGE7CisKKwlpZiAoISh0aHJlYWQtPndhaXRfdGFzayA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9XQUlURVZFTlQpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X3V1aWQodGhyZWFkLT53YWl0X3Rhc2ssIGRhdGEtPmRldmljZV91dWlkKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoISh0aHJlYWQtPmRldmljZS51dWlkID0gZG1fc3RyZHVwKGRhdGEtPmRldmljZV91dWlkKSkpCisJCWdvdG9fb3V0OworCisJLyogVW50aWwgcmVhbCBuYW1lIHJlc29sdmVkLCB1c2UgVVVJRCAqLworCWlmICghKHRocmVhZC0+ZGV2aWNlLm5hbWUgPSBkbV9zdHJkdXAoZGF0YS0+ZGV2aWNlX3V1aWQpKSkKKwkJZ290b19vdXQ7CisKKwkvKiBydW5zIGlvY3RsIGFuZCBtYXkgcmVnaXN0ZXIgbHZtMiBwbHVnaW5nICovCisJdGhyZWFkLT5wcm9jZXNzaW5nID0gMTsKKwl0aHJlYWQtPnN0YXR1cyA9IERNX1RIUkVBRF9SRUdJU1RFUklORzsKKworCXRocmVhZC0+ZXZlbnRzID0gZGF0YS0+ZXZlbnRzX2ZpZWxkOworCXRocmVhZC0+cGVuZGluZyA9IERNX0VWRU5UX1JFR0lTVFJBVElPTl9QRU5ESU5HOworCXRocmVhZC0+dGltZW91dCA9IGRhdGEtPnRpbWVvdXRfc2VjczsKKwlkbV9saXN0X2luaXQoJnRocmVhZC0+dGltZW91dF9saXN0KTsKKworCXJldHVybiB0aHJlYWQ7CisKK291dDoKKwlfZnJlZV90aHJlYWRfc3RhdHVzKHRocmVhZCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGRldmljZSBtb25pdG9yaW5nIHRocmVhZC4KKyAqIE4uQi4gIEVycm9yIGNvZGVzIHJldHVybmVkIGFyZSBwb3NpdGl2ZS4KKyAqLworc3RhdGljIGludCBfcHRocmVhZF9jcmVhdGVfc21hbGxzdGFjayhwdGhyZWFkX3QgKnQsIHZvaWQgKigqZnVuKSh2b2lkICopLCB2b2lkICphcmcpCit7CisJaW50IHI7CisJcHRocmVhZF90IHRtcDsKKwlwdGhyZWFkX2F0dHJfdCBhdHRyOworCisJLyoKKwkgKiBGcm9tIHB0aHJlYWRfYXR0cl9pbml0IG1hbiBwYWdlOgorCSAqIFBPU0lYLjEtMjAwMSBkb2N1bWVudHMgYW4gRU5PTUVNIGVycm9yIGZvciBwdGhyZWFkX2F0dHJfaW5pdCgpOyBvbgorCSAqIExpbnV4IHRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgc3VjY2VlZCAoYnV0IHBvcnRhYmxlIGFuZCBmdXR1cmUtcHJvb2YKKwkgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVydGhlbGVzcyBoYW5kbGUgYSBwb3NzaWJsZSBlcnJvciByZXR1cm4pLgorCSAqLworCWlmICgociA9IHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKSkgIT0gMCkgeworCQlsb2dfc3lzX2Vycm9yKCJwdGhyZWFkX2F0dHJfaW5pdCIsICIiKTsKKwkJcmV0dXJuIHI7CisJfQorCisJLyoKKwkgKiBXZSB1c2UgYSBzbWFsbGVyIHN0YWNrIHNpbmNlIGl0IGdldHMgcHJlYWxsb2NhdGVkIGluIGl0cyBlbnRpcmV0eQorCSAqLworCXB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHIsIFRIUkVBRF9TVEFDS19TSVpFKTsKKworCS8qCisJICogSWYgbm8tb25lIHdpbGwgYmUgd2FpdGluZywgd2UgbmVlZCB0byBkZXRhY2guCisJICovCisJaWYgKCF0KSB7CisJCXB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworCQl0ID0gJnRtcDsKKwl9CisKKwlpZiAoKHIgPSBwdGhyZWFkX2NyZWF0ZSh0LCAmYXR0ciwgZnVuLCBhcmcpKSkKKwkJbG9nX3N5c19lcnJvcigicHRocmVhZF9jcmVhdGUiLCAiIik7CisKKwlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEZldGNoIGEgc3RyaW5nIG9mZiBzcmMgYW5kIGR1cGxpY2F0ZSBpdCBpbnRvICpwdHIuCisgKiBQYXkgYXR0ZW50aW9uIHRvIHplcm8tbGVuZ3RoIGFuZCAnZW1wdHknIHN0cmluZ3MgKCctJykuCisgKi8KKy8qIEZJWE1FPyBtb3ZlIHRvIGxpYmRldm1hcHBlciB0byBzaGFyZSB3aXRoIHRoZSBjbGllbnQgbGliIChuZWVkIHRvCisgICBtYWtlIGRlbGltaXRlciBhIHBhcmFtZXRlciB0aGVuKSAqLworc3RhdGljIGludCBfZmV0Y2hfc3RyaW5nKGNoYXIgKipwdHIsIGNoYXIgKipzcmMsIGNvbnN0IGludCBkZWxpbWl0ZXIpCit7CisJaW50IHJldCA9IDE7CisJY2hhciAqcDsKKwlzaXplX3QgbGVuOworCSpwdHIgPSBOVUxMOyAvKiBFbXB0eSBmaWVsZCByZXR1cm5zIE5VTEwgcG9pbnRlciAqLworCisJaWYgKCgqc3JjKVswXSA9PSAnLScpIHsKKwkJLyogQ291bGQgYmUgZW1wdHkgZmllbGQgJy0nLCBoYW5kbGUgd2l0aG91dCBhbGxvY2F0aW9uICovCisJCWlmICgoKnNyYylbMV0gPT0gJ1wwJykgeworCQkJKCpzcmMpKys7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmICgoKnNyYylbMV0gPT0gZGVsaW1pdGVyKSB7CisJCQkoKnNyYykgKz0gMjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKChwID0gc3RyY2hyKCpzcmMsIGRlbGltaXRlcikpKSB7CisJCWlmICgqc3JjIDwgcCkgeworCQkJKnAgPSAwOyAvKiBUZW1wb3JhcnkgZXhpdCB3aXRoIFwwICovCisJCQlpZiAoISgqcHRyID0gZG1fc3RyZHVwKCpzcmMpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZldGNoIGl0ZW0gJXMuIiwgKnNyYyk7CisJCQkJcmV0ID0gMDsgLyogQWxsb2NhdGlvbiBmYWlsICovCisJCQl9CisJCQkqcCA9IGRlbGltaXRlcjsKKwkJCSpzcmMgPSBwOworCQl9CisJCSgqc3JjKSsrOyAvKiBTa2lwIGRlbG1pdGVyLCBuZXh0IGZpZWxkICovCisJfSBlbHNlIGlmICgobGVuID0gc3RybGVuKCpzcmMpKSkgeworCQkvKiBObyBkZWxpbWl0ZXIsIGl0ZW0gZW5kcyB3aXRoICdcMCcgKi8KKwkJaWYgKCEoKnB0ciA9IGRtX3N0cmR1cCgqc3JjKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZldGNoIGxhc3QgaXRlbSAlcy4iLCAqc3JjKTsKKwkJCXJldCA9IDA7IC8qIEZhaWwgKi8KKwkJfQorCQkqc3JjICs9IGxlbiArIDE7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIEZyZWUgbWVzc2FnZSBtZW1vcnkuICovCitzdGF0aWMgdm9pZCBfZnJlZV9tZXNzYWdlKHN0cnVjdCBtZXNzYWdlX2RhdGEgKm1lc3NhZ2VfZGF0YSkKK3sKKwlkbV9mcmVlKG1lc3NhZ2VfZGF0YS0+aWQpOworCWRtX2ZyZWUobWVzc2FnZV9kYXRhLT5kc29fbmFtZSk7CisJZG1fZnJlZShtZXNzYWdlX2RhdGEtPmRldmljZV91dWlkKTsKKwlkbV9mcmVlKG1lc3NhZ2VfZGF0YS0+ZXZlbnRzX3N0cik7CisJZG1fZnJlZShtZXNzYWdlX2RhdGEtPnRpbWVvdXRfc3RyKTsKK30KKworLyogUGFyc2UgYSByZWdpc3RlciBtZXNzYWdlIGZyb20gdGhlIGNsaWVudC4gKi8KK3N0YXRpYyBpbnQgX3BhcnNlX21lc3NhZ2Uoc3RydWN0IG1lc3NhZ2VfZGF0YSAqbWVzc2FnZV9kYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnID0gbWVzc2FnZV9kYXRhLT5tc2c7CisJY2hhciAqcCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT5kYXRhKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogUmV0cmlldmUgYXBwbGljYXRpb24gaWRlbnRpZmllciwgbWFwcGVkIGRldmljZQorCSAqIHBhdGggYW5kIGV2ZW50cyAjIHN0cmluZyBmcm9tIG1lc3NhZ2UuCisJICovCisJaWYgKF9mZXRjaF9zdHJpbmcoJm1lc3NhZ2VfZGF0YS0+aWQsICZwLCAnICcpICYmCisJICAgIF9mZXRjaF9zdHJpbmcoJm1lc3NhZ2VfZGF0YS0+ZHNvX25hbWUsICZwLCAnICcpICYmCisJICAgIF9mZXRjaF9zdHJpbmcoJm1lc3NhZ2VfZGF0YS0+ZGV2aWNlX3V1aWQsICZwLCAnICcpICYmCisJICAgIF9mZXRjaF9zdHJpbmcoJm1lc3NhZ2VfZGF0YS0+ZXZlbnRzX3N0ciwgJnAsICcgJykgJiYKKwkgICAgX2ZldGNoX3N0cmluZygmbWVzc2FnZV9kYXRhLT50aW1lb3V0X3N0ciwgJnAsICcgJykpIHsKKwkJaWYgKG1lc3NhZ2VfZGF0YS0+ZXZlbnRzX3N0cikKKwkJCW1lc3NhZ2VfZGF0YS0+ZXZlbnRzX2ZpZWxkID0KKwkJCQlhdG9pKG1lc3NhZ2VfZGF0YS0+ZXZlbnRzX3N0cik7CisJCWlmIChtZXNzYWdlX2RhdGEtPnRpbWVvdXRfc3RyKQorCQkJbWVzc2FnZV9kYXRhLT50aW1lb3V0X3NlY3MgPQorCQkJCWF0b2kobWVzc2FnZV9kYXRhLT50aW1lb3V0X3N0cikKKwkJCQk/IDogRE1fRVZFTlRfREVGQVVMVF9USU1FT1VUOworCQlyZXQgPSAxOworCX0KKworCWRtX2ZyZWUobXNnLT5kYXRhKTsKKwltc2ctPmRhdGEgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworLyogR2xvYmFsIG11dGV4IHRvIGxvY2sgYWNjZXNzIHRvIGxpc3RzIGV0IGFsLiBTZWUgX2dsb2JhbF9tdXRleAorICAgYWJvdmUuICovCitzdGF0aWMgaW50IF9sb2NrX211dGV4KHZvaWQpCit7CisJcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jaygmX2dsb2JhbF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgX3VubG9ja19tdXRleCh2b2lkKQoreworCXJldHVybiBwdGhyZWFkX211dGV4X3VubG9jaygmX2dsb2JhbF9tdXRleCk7Cit9CisKKy8qIENoZWNrLCBpZiBhIGRldmljZSBleGlzdHMuICovCitzdGF0aWMgaW50IF9maWxsX2RldmljZV9kYXRhKHN0cnVjdCB0aHJlYWRfc3RhdHVzICp0cykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGRtaTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9JTkZPKSkpCisJCXJldHVybiAwOworCisJaWYgKCFkbV90YXNrX3NldF91dWlkKGRtdCwgdHMtPmRldmljZS51dWlkKSkKKwkJZ290byBmYWlsOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvIGZhaWw7CisKKwlkbV9mcmVlKHRzLT5kZXZpY2UubmFtZSk7CisJaWYgKCEodHMtPmRldmljZS5uYW1lID0gZG1fc3RyZHVwKGRtX3Rhc2tfZ2V0X25hbWUoZG10KSkpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmZG1pKSkKKwkJZ290byBmYWlsOworCisJdHMtPmRldmljZS5tYWpvciA9IGRtaS5tYWpvcjsKKwl0cy0+ZGV2aWNlLm1pbm9yID0gZG1pLm1pbm9yOworCWRtX3Rhc2tfc2V0X2V2ZW50X25yKHRzLT53YWl0X3Rhc2ssIGRtaS5ldmVudF9ucik7CisKKwlyZXQgPSAxOworZmFpbDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fdGFzayAqX2dldF9kZXZpY2Vfc3RhdHVzKHN0cnVjdCB0aHJlYWRfc3RhdHVzICp0cykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1NUQVRVUyk7CisKKwlpZiAoIWRtdCkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X3V1aWQoZG10LCB0cy0+ZGV2aWNlLnV1aWQpKSB7CisJCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwkvKiBOb24tYmxvY2tpbmcgc3RhdHVzIHJlYWQgKi8KKwlpZiAoIWRtX3Rhc2tfbm9fZmx1c2goZG10KSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENhbid0IHNldCBub19mbHVzaCBmb3IgZG0gc3RhdHVzLiIpOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKSB7CisJCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlyZXR1cm4gZG10OworfQorCisvKgorICogRmluZCBhbiBleGlzdGluZyB0aHJlYWQgZm9yIGEgZGV2aWNlLgorICoKKyAqIE11dGV4IG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqLworc3RhdGljIHN0cnVjdCB0aHJlYWRfc3RhdHVzICpfbG9va3VwX3RocmVhZF9zdGF0dXMoc3RydWN0IG1lc3NhZ2VfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHRocmVhZCwgJl90aHJlYWRfcmVnaXN0cnkpCisJCWlmICghc3RyY21wKGRhdGEtPmRldmljZV91dWlkLCB0aHJlYWQtPmRldmljZS51dWlkKSkKKwkJCXJldHVybiB0aHJlYWQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfZ2V0X3N0YXR1cyhzdHJ1Y3QgbWVzc2FnZV9kYXRhICptZXNzYWdlX2RhdGEpCit7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cgPSBtZXNzYWdlX2RhdGEtPm1zZzsKKwlzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkOworCWludCBpID0gMCwgajsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQgY291bnQ7CisJaW50IHNpemUgPSAwLCBjdXJyZW50OworCXNpemVfdCBsZW47CisJY2hhciAqKmJ1ZmZlcnM7CisJY2hhciAqbWVzc2FnZTsKKworCV9sb2NrX211dGV4KCk7CisJY291bnQgPSBkbV9saXN0X3NpemUoJl90aHJlYWRfcmVnaXN0cnkpOworCWJ1ZmZlcnMgPSBhbGxvY2Eoc2l6ZW9mKGNoYXIqKSAqIGNvdW50KTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModGhyZWFkLCAmX3RocmVhZF9yZWdpc3RyeSkgeworCQlpZiAoKGN1cnJlbnQgPSBkbV9hc3ByaW50ZihidWZmZXJzICsgaSwgIjA6JWQgJXMgJXMgJXUgJSIgUFJJdTMyICI7IiwKKwkJCQkJICAgaSwgdGhyZWFkLT5kc29fZGF0YS0+ZHNvX25hbWUsCisJCQkJCSAgIHRocmVhZC0+ZGV2aWNlLnV1aWQsIHRocmVhZC0+ZXZlbnRzLAorCQkJCQkgICB0aHJlYWQtPnRpbWVvdXQpKSA8IDApIHsKKwkJCV91bmxvY2tfbXV0ZXgoKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCSsraTsKKwkJc2l6ZSArPSBjdXJyZW50OyAvKiBjb3VudCB3aXRoIHRyYWlsaW5nICdcMCcgKi8KKwl9CisJX3VubG9ja19tdXRleCgpOworCisJbGVuID0gc3RybGVuKG1lc3NhZ2VfZGF0YS0+aWQpOworCW1zZy0+c2l6ZSA9IHNpemUgKyBsZW4gKyAxOworCWRtX2ZyZWUobXNnLT5kYXRhKTsKKwlpZiAoIShtc2ctPmRhdGEgPSBkbV9tYWxsb2MobXNnLT5zaXplKSkpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KG1zZy0+ZGF0YSwgbWVzc2FnZV9kYXRhLT5pZCwgbGVuKTsKKwltZXNzYWdlID0gbXNnLT5kYXRhICsgbGVuOworCSptZXNzYWdlKysgPSAnICc7CisJZm9yIChqID0gMDsgaiA8IGk7ICsraikgeworCQlsZW4gPSBzdHJsZW4oYnVmZmVyc1tqXSk7CisJCW1lbWNweShtZXNzYWdlLCBidWZmZXJzW2pdLCBsZW4pOworCQltZXNzYWdlICs9IGxlbjsKKwl9CisKKwlyZXQgPSAwOworIG91dDoKKwlmb3IgKGogPSAwOyBqIDwgaTsgKytqKQorCQlkbV9mcmVlKGJ1ZmZlcnNbal0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfZ2V0X3BhcmFtZXRlcnMoc3RydWN0IG1lc3NhZ2VfZGF0YSAqbWVzc2FnZV9kYXRhKSB7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cgPSBtZXNzYWdlX2RhdGEtPm1zZzsKKwlpbnQgc2l6ZTsKKworCWRtX2ZyZWUobXNnLT5kYXRhKTsKKwlpZiAoKHNpemUgPSBkbV9hc3ByaW50ZigmbXNnLT5kYXRhLCAiJXMgcGlkPSVkIGRhZW1vbj0lcyBleGVjX21ldGhvZD0lcyIsCisJCQkJbWVzc2FnZV9kYXRhLT5pZCwgZ2V0cGlkKCksCisJCQkJX2ZvcmVncm91bmQgPyAibm8iIDogInllcyIsCisJCQkJX3N5c3RlbWRfYWN0aXZhdGlvbiA/ICJzeXN0ZW1kIiA6ICJkaXJlY3QiKSkgPCAwKSB7CisJCXN0YWNrOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltc2ctPnNpemUgPSAodWludDMyX3QpIHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYW51cCBhdCBleGl0LiAqLworc3RhdGljIHZvaWQgX2V4aXRfZG1fbGliKHZvaWQpCit7CisJZG1fbGliX3JlbGVhc2UoKTsKKwlkbV9saWJfZXhpdCgpOworfQorCitzdGF0aWMgdm9pZCBfZXhpdF90aW1lb3V0KHZvaWQgKnVudXNlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlfdGltZW91dF9ydW5uaW5nID0gMDsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmX3RpbWVvdXRfbXV0ZXgpOworfQorCisvKiBXYWtlIHVwIG1vbml0b3IgdGhyZWFkcyBldmVyeSBzbyBvZnRlbi4gKi8KK3N0YXRpYyB2b2lkICpfdGltZW91dF90aHJlYWQodm9pZCAqdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisJc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CisJdGltZV90IGN1cnJfdGltZTsKKworCURFQlVHTE9HKCJUaW1lb3V0IHRocmVhZCBzdGFydGluZy4iKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaChfZXhpdF90aW1lb3V0LCBOVUxMKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJl90aW1lb3V0X211dGV4KTsKKworCXdoaWxlICghZG1fbGlzdF9lbXB0eSgmX3RpbWVvdXRfcmVnaXN0cnkpKSB7CisJCXRpbWVvdXQudHZfc2VjID0gMDsKKwkJdGltZW91dC50dl9uc2VjID0gMDsKKwkJY3Vycl90aW1lID0gdGltZShOVUxMKTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfZ2VuKHRocmVhZCwgJl90aW1lb3V0X3JlZ2lzdHJ5LCB0aW1lb3V0X2xpc3QpIHsKKwkJCWlmICh0aHJlYWQtPm5leHRfdGltZSA8PSBjdXJyX3RpbWUpIHsKKwkJCQl0aHJlYWQtPm5leHRfdGltZSA9IGN1cnJfdGltZSArIHRocmVhZC0+dGltZW91dDsKKwkJCQlfbG9ja19tdXRleCgpOworCQkJCWlmICh0aHJlYWQtPnByb2Nlc3NpbmcpIHsKKwkJCQkJLyogQ2Fubm90IHNpZ25hbCBwcm9jZXNzaW5nIG1vbml0b3JpbmcgdGhyZWFkICovCisJCQkJCWxvZ19kZWJ1ZygiU2tpcHBpbmcgU0lHQUxSTSB0byBwcm9jZXNzaW5nIFRociAleCBmb3IgdGltZW91dC4iLAorCQkJCQkJICAoaW50KSB0aHJlYWQtPnRocmVhZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREVCVUdMT0coIlNlbmRpbmcgU0lHQUxSTSB0byBUaHIgJXggZm9yIHRpbWVvdXQuIiwKKwkJCQkJCSAoaW50KSB0aHJlYWQtPnRocmVhZCk7CisJCQkJCXB0aHJlYWRfa2lsbCh0aHJlYWQtPnRocmVhZCwgU0lHQUxSTSk7CisJCQkJfQorCQkJCV91bmxvY2tfbXV0ZXgoKTsKKwkJCX0KKworCQkJaWYgKHRocmVhZC0+bmV4dF90aW1lIDwgdGltZW91dC50dl9zZWMgfHwgIXRpbWVvdXQudHZfc2VjKQorCQkJCXRpbWVvdXQudHZfc2VjID0gdGhyZWFkLT5uZXh0X3RpbWU7CisJCX0KKworCQlwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZfdGltZW91dF9jb25kLCAmX3RpbWVvdXRfbXV0ZXgsCisJCQkJICAgICAgICZ0aW1lb3V0KTsKKwl9CisKKwlERUJVR0xPRygiVGltZW91dCB0aHJlYWQgZmluaXNoZWQuIik7CisJcHRocmVhZF9jbGVhbnVwX3BvcCgxKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9yZWdpc3Rlcl9mb3JfdGltZW91dChzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCWludCByZXQgPSAwOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZfdGltZW91dF9tdXRleCk7CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmdGhyZWFkLT50aW1lb3V0X2xpc3QpKSB7CisJCXRocmVhZC0+bmV4dF90aW1lID0gdGltZShOVUxMKSArIHRocmVhZC0+dGltZW91dDsKKwkJZG1fbGlzdF9hZGQoJl90aW1lb3V0X3JlZ2lzdHJ5LCAmdGhyZWFkLT50aW1lb3V0X2xpc3QpOworCQlpZiAoX3RpbWVvdXRfcnVubmluZykKKwkJCXB0aHJlYWRfY29uZF9zaWduYWwoJl90aW1lb3V0X2NvbmQpOworCX0KKworCWlmICghX3RpbWVvdXRfcnVubmluZyAmJgorCSAgICAhKHJldCA9IF9wdGhyZWFkX2NyZWF0ZV9zbWFsbHN0YWNrKE5VTEwsIF90aW1lb3V0X3RocmVhZCwgTlVMTCkpKQorCQlfdGltZW91dF9ydW5uaW5nID0gMTsKKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfdGltZW91dF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfdW5yZWdpc3Rlcl9mb3JfdGltZW91dChzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX3RpbWVvdXRfbXV0ZXgpOworCWlmICghZG1fbGlzdF9lbXB0eSgmdGhyZWFkLT50aW1lb3V0X2xpc3QpKSB7CisJCWRtX2xpc3RfZGVsKCZ0aHJlYWQtPnRpbWVvdXRfbGlzdCk7CisJCWRtX2xpc3RfaW5pdCgmdGhyZWFkLT50aW1lb3V0X2xpc3QpOworCQlpZiAoZG1fbGlzdF9lbXB0eSgmX3RpbWVvdXRfcmVnaXN0cnkpKQorCQkJLyogTm8gbW9yZSB3b3JrIC0+IHdha2V1cCB0byBmaW5pc2ggcXVpY2tseSAqLworCQkJcHRocmVhZF9jb25kX3NpZ25hbCgmX3RpbWVvdXRfY29uZCk7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfdGltZW91dF9tdXRleCk7Cit9CisKKyNpZmRlZiBERUJVR19TSUdOQUxTCisvKiBQcmludCBsaXN0IG9mIHNpZ25hbHMgd2l0aGluIGEgc2lnbmFsIHNldCAqLworc3RhdGljIHZvaWQgX3ByaW50X3NpZ3NldChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IHNpZ3NldF90ICpzaWdzZXQpCit7CisJaW50IHNpZywgY250ID0gMDsKKworCWZvciAoc2lnID0gMTsgc2lnIDwgTlNJRzsgc2lnKyspCisJCWlmICghc2lnaXNtZW1iZXIoc2lnc2V0LCBzaWcpKSB7CisJCQljbnQrKzsKKwkJCWxvZ19kZWJ1ZygiJXMlZCAoJXMpIiwgcHJlZml4LCBzaWcsIHN0cnNpZ25hbChzaWcpKTsKKwkJfQorCisJaWYgKCFjbnQpCisJCWxvZ19kZWJ1ZygiJXM8ZW1wdHkgc2lnbmFsIHNldD4iLCBwcmVmaXgpOworfQorI2VuZGlmCisKK3N0YXRpYyBzaWdzZXRfdCBfdW5ibG9ja19zaWdhbHJtKHZvaWQpCit7CisJc2lnc2V0X3Qgc2V0LCBvbGQ7CisKKwlzaWdlbXB0eXNldCgmc2V0KTsKKwlzaWdhZGRzZXQoJnNldCwgU0lHQUxSTSk7CisJcHRocmVhZF9zaWdtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCAmb2xkKTsKKworCXJldHVybiBvbGQ7Cit9CisKK2VudW0geworCURNX1dBSVRfUkVUUlksCisJRE1fV0FJVF9JTlRSLAorCURNX1dBSVRfRkFUQUwKK307CisKKy8qIFdhaXQgb24gYSBkZXZpY2UgdW50aWwgYW4gZXZlbnQgb2NjdXJzLiAqLworc3RhdGljIGludCBfZXZlbnRfd2FpdChzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCXNpZ3NldF90IHNldDsKKwlpbnQgcmV0ID0gRE1fV0FJVF9SRVRSWTsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCisJLyogVE9ETzogYXVkaXQgbGliZG0gdGhyZWFkIHVzYWdlICovCisKKwkvKgorCSAqIFRoaXMgaXMgc28gdGhhdCB5b3UgY2FuIGJyZWFrIG91dCBvZiB3YWl0aW5nIG9uIGFuIGV2ZW50LAorCSAqIGVpdGhlciBmb3IgYSB0aW1lb3V0IGV2ZW50LCBvciB0byBjYW5jZWwgdGhlIHRocmVhZC4KKwkgKi8KKwlzZXQgPSBfdW5ibG9ja19zaWdhbHJtKCk7CisKKwlpZiAoZG1fdGFza19ydW4odGhyZWFkLT53YWl0X3Rhc2spKSB7CisJCXRocmVhZC0+Y3VycmVudF9ldmVudHMgfD0gRE1fRVZFTlRfREVWSUNFX0VSUk9SOworCQlyZXQgPSBETV9XQUlUX0lOVFI7CisJCS8qIFVwZGF0ZSBldmVudF9uciAqLworCQlpZiAoZG1fdGFza19nZXRfaW5mbyh0aHJlYWQtPndhaXRfdGFzaywgJmluZm8pKQorCQkJZG1fdGFza19zZXRfZXZlbnRfbnIodGhyZWFkLT53YWl0X3Rhc2ssIGluZm8uZXZlbnRfbnIpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoZG1fdGFza19nZXRfZXJybm8odGhyZWFkLT53YWl0X3Rhc2spKSB7CisJCWNhc2UgRU5YSU86CisJCQlsb2dfZXJyb3IoIiVzIGRpc2FwcGVhcmVkLCBkZXRhY2hpbmcuIiwKKwkJCQkgIHRocmVhZC0+ZGV2aWNlLm5hbWUpOworCQkJcmV0ID0gRE1fV0FJVF9GQVRBTDsKKwkJCWJyZWFrOworCQljYXNlIEVJTlRSOgorCQkJdGhyZWFkLT5jdXJyZW50X2V2ZW50cyB8PSBETV9FVkVOVF9USU1FT1VUOworCQkJcmV0ID0gRE1fV0FJVF9JTlRSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfc3lzX2Vycm9yKCJkbV90YXNrX3J1biIsICJ3YWl0ZXZlbnQiKTsKKwkJfQorCX0KKworCXB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJnNldCwgTlVMTCk7CisKKyNpZmRlZiBERUJVR19TSUdOQUxTCisJX3ByaW50X3NpZ3NldCgiZG1ldmVudGQgYmxvY2tpbmcgIiwgJnNldCk7CisjZW5kaWYKKwlERUJVR0xPRygiQ29tcGxldGVkIHdhaXRldmVudCB0YXNrIGZvciAlcy4iLCB0aHJlYWQtPmRldmljZS5uYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ2lzdGVyIGEgZGV2aWNlIHdpdGggdGhlIERTTy4gKi8KK3N0YXRpYyBpbnQgX2RvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCXJldHVybiB0aHJlYWQtPmRzb19kYXRhLT5yZWdpc3Rlcl9kZXZpY2UodGhyZWFkLT5kZXZpY2UubmFtZSwKKwkJCQkJCSB0aHJlYWQtPmRldmljZS51dWlkLAorCQkJCQkJIHRocmVhZC0+ZGV2aWNlLm1ham9yLAorCQkJCQkJIHRocmVhZC0+ZGV2aWNlLm1pbm9yLAorCQkJCQkJICYodGhyZWFkLT5kc29fcHJpdmF0ZSkpOworfQorCisvKiBVbnJlZ2lzdGVyIGEgZGV2aWNlIHdpdGggdGhlIERTTy4gKi8KK3N0YXRpYyBpbnQgX2RvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQpCit7CisJcmV0dXJuIHRocmVhZC0+ZHNvX2RhdGEtPnVucmVnaXN0ZXJfZGV2aWNlKHRocmVhZC0+ZGV2aWNlLm5hbWUsCisJCQkJCQkgICB0aHJlYWQtPmRldmljZS51dWlkLAorCQkJCQkJICAgdGhyZWFkLT5kZXZpY2UubWFqb3IsCisJCQkJCQkgICB0aHJlYWQtPmRldmljZS5taW5vciwKKwkJCQkJCSAgICYodGhyZWFkLT5kc29fcHJpdmF0ZSkpOworfQorCisvKiBQcm9jZXNzIGFuIGV2ZW50IGluIHRoZSBEU08uICovCitzdGF0aWMgdm9pZCBfZG9fcHJvY2Vzc19ldmVudChzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCXN0cnVjdCBkbV90YXNrICp0YXNrOworCisJLyogTk9URTogdGltZW91dCBldmVudCBnZXRzIHN0YXR1cyAqLworCXRhc2sgPSAodGhyZWFkLT5jdXJyZW50X2V2ZW50cyAmIERNX0VWRU5UX1RJTUVPVVQpCisJCT8gX2dldF9kZXZpY2Vfc3RhdHVzKHRocmVhZCkgOiB0aHJlYWQtPndhaXRfdGFzazsKKworCWlmICghdGFzaykKKwkJbG9nX2Vycm9yKCJMb3N0IGV2ZW50IGluIFRociAleC4iLCAoaW50KXRocmVhZC0+dGhyZWFkKTsKKwllbHNlIHsKKwkJdGhyZWFkLT5kc29fZGF0YS0+cHJvY2Vzc19ldmVudCh0YXNrLCB0aHJlYWQtPmN1cnJlbnRfZXZlbnRzLCAmKHRocmVhZC0+ZHNvX3ByaXZhdGUpKTsKKwkJaWYgKHRhc2sgIT0gdGhyZWFkLT53YWl0X3Rhc2spCisJCQlkbV90YXNrX2Rlc3Ryb3kodGFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfdGhyZWFkX3VudXNlZChzdHJ1Y3QgdGhyZWFkX3N0YXR1cyAqdGhyZWFkKQoreworCVVOTElOS19USFJFQUQodGhyZWFkKTsKKwlMSU5LKHRocmVhZCwgJl90aHJlYWRfcmVnaXN0cnlfdW51c2VkKTsKK30KKworLyogVGhyZWFkIGNsZWFudXAgaGFuZGxlciB0byB1bnJlZ2lzdGVyIGRldmljZS4gKi8KK3N0YXRpYyB2b2lkIF9tb25pdG9yX3VucmVnaXN0ZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQgPSBhcmcsICp0aHJlYWRfaXRlcjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh0aHJlYWRfaXRlciwgJl90aHJlYWRfcmVnaXN0cnkpCisJCWlmICh0aHJlYWRfaXRlciA9PSB0aHJlYWQpIHsKKwkJCS8qIFJlbGluayB0byBfdW51c2VkICovCisJCQlfdGhyZWFkX3VudXNlZCh0aHJlYWQpOworCQkJYnJlYWs7CisJCX0KKworCXRocmVhZC0+ZXZlbnRzID0gMDsJLyogRmlsdGVyIGlzIG5vdyBlbXB0eSAqLworCXRocmVhZC0+cGVuZGluZyA9IDA7CS8qIEV2ZW50IHBlbmRpbmcgcmVzb2x2ZWQgKi8KKwl0aHJlYWQtPnByb2Nlc3NpbmcgPSAxOwkvKiBQcm9jZXNzIHVucmVnaXN0ZXJpbmcgKi8KKworCV91bmxvY2tfbXV0ZXgoKTsKKworCURFQlVHTE9HKCJVbnJlZ2lzdGVyaW5nIG1vbml0b3IgZm9yICVzLiIsIHRocmVhZC0+ZGV2aWNlLm5hbWUpOworCV91bnJlZ2lzdGVyX2Zvcl90aW1lb3V0KHRocmVhZCk7CisKKwlpZiAoKHRocmVhZC0+c3RhdHVzICE9IERNX1RIUkVBRF9SRUdJU1RFUklORykgJiYKKwkgICAgIV9kb191bnJlZ2lzdGVyX2RldmljZSh0aHJlYWQpKQorCQlsb2dfZXJyb3IoIiVzOiAlcyB1bnJlZ2lzdGVyIGZhaWxlZC4iLCBfX2Z1bmNfXywKKwkJCSAgdGhyZWFkLT5kZXZpY2UubmFtZSk7CisKKwlERUJVR0xPRygiTWFya2luZyBUaHIgJXggYXMgRE9ORSBhbmQgdW51c2VkLiIsIChpbnQpdGhyZWFkLT50aHJlYWQpOworCisJX2xvY2tfbXV0ZXgoKTsKKwl0aHJlYWQtPnN0YXR1cyA9IERNX1RIUkVBRF9ET05FOyAvKiBMYXN0IGFjY2VzcyB0byB0aHJlYWQgbWVtb3J5ISAqLworCV91bmxvY2tfbXV0ZXgoKTsKK30KKworLyogRGV2aWNlIG1vbml0b3JpbmcgdGhyZWFkLiAqLworc3RhdGljIHZvaWQgKl9tb25pdG9yX3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IHRocmVhZF9zdGF0dXMgKnRocmVhZCA9IGFyZzsKKwlpbnQgcmV0OworCXNpZ3NldF90IHBlbmRtYXNrOworCisJcHRocmVhZF9zZXRjYW5jZWx0eXBlKFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELCBOVUxMKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaChfbW9uaXRvcl91bnJlZ2lzdGVyLCB0aHJlYWQpOworCisJaWYgKCFfZmlsbF9kZXZpY2VfZGF0YSh0aHJlYWQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbGwgZGV2aWNlIGRhdGEgZm9yICVzLiIsIHRocmVhZC0+ZGV2aWNlLnV1aWQpOworCQlfbG9ja19tdXRleCgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIV9kb19yZWdpc3Rlcl9kZXZpY2UodGhyZWFkKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJXMuIiwgdGhyZWFkLT5kZXZpY2UubmFtZSk7CisJCV9sb2NrX211dGV4KCk7CisJCWdvdG8gb3V0OworCX0KKworCV9sb2NrX211dGV4KCk7CisJdGhyZWFkLT5zdGF0dXMgPSBETV9USFJFQURfUlVOTklORzsKKwl0aHJlYWQtPnByb2Nlc3NpbmcgPSAwOworCisJLyogTG9vcCBhd2FpdGluZy9hbmFseXppbmcgZGV2aWNlIGV2ZW50cy4gKi8KKwl3aGlsZSAodGhyZWFkLT5ldmVudHMpIHsKKworCQl0aHJlYWQtPnBlbmRpbmcgPSAwOyAvKiBFdmVudCBpcyBubyBsb25nZXIgcGVuZGluZy4uLiAgKi8KKworCQkvKgorCQkgKiBDaGVjayBhZ2FpbnN0IGJpdG1hc2sgZmlsdGVyLgorCQkgKgorCQkgKiBJZiB0aGVyZSdzIGN1cnJlbnQgZXZlbnRzIGRlbGl2ZXJlZCBmcm9tIF9ldmVudF93YWl0KCkgQU5ECisJCSAqIHRoZSBkZXZpY2UgZ290IHJlZ2lzdGVyZWQgZm9yIHRob3NlIGV2ZW50cyBBTkQKKwkJICogdGhvc2UgZXZlbnRzIGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LCBjYWxsCisJCSAqIHRoZSBEU08ncyBwcm9jZXNzX2V2ZW50KCkgaGFuZGxlci4KKwkJICovCisJCWlmICh0aHJlYWQtPmV2ZW50cyAmIHRocmVhZC0+Y3VycmVudF9ldmVudHMpIHsKKwkJCXRocmVhZC0+cHJvY2Vzc2luZyA9IDE7ICAvKiBDYW5ub3QgYmUgcmVtb3ZlZC9zaWduYWxlZCAqLworCQkJX3VubG9ja19tdXRleCgpOworCisJCQlfZG9fcHJvY2Vzc19ldmVudCh0aHJlYWQpOworCQkJdGhyZWFkLT5jdXJyZW50X2V2ZW50cyA9IDA7IC8qIEN1cnJlbnQgZXZlbnRzIHByb2Nlc3NlZCAqLworCisJCQlfbG9ja19tdXRleCgpOworCQkJdGhyZWFkLT5wcm9jZXNzaW5nID0gMDsKKworCQkJLyoKKwkJCSAqIFRocmVhZCBjYW4gdGVybWluYXRlIGl0c2VsZiBmcm9tIHBsdWdpbiB2aWEgU0lHQUxSTQorCQkJICogVGltZXIgdGhyZWFkIHdpbGwgbm90IHNlbmQgc2lnbmFsIHdoaWxlIHByb2Nlc3NpbmcKKwkJCSAqIFRPRE86IG1heWJlIHdvcnRoIEFQSSBjaGFuZ2UgYW5kIHJldHVybiB2YWx1ZSBmb3IKKwkJCSAqICAgICAgIF9kb19wcm9jZXNzX2V2ZW50KCkgaW5zdGVhZCBvZiB0aGlzIHNpZ25hbCBzb2x1dGlvbgorCQkJICovCisJCQlpZiAoc2lncGVuZGluZygmcGVuZG1hc2spIDwgMCkKKwkJCQlsb2dfc3lzX2Vycm9yKCJzaWdwZW5kaW5nIiwgIiIpOworCQkJZWxzZSBpZiAoc2lnaXNtZW1iZXIoJnBlbmRtYXNrLCBTSUdBTFJNKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCV91bmxvY2tfbXV0ZXgoKTsKKworCQkJaWYgKChyZXQgPSBfZXZlbnRfd2FpdCh0aHJlYWQpKSA9PSBETV9XQUlUX1JFVFJZKQorCQkJCXVzbGVlcCgxMDApOyAvKiBBdm9pZCBidXN5IGxvb3AsIHdhaXQgd2l0aG91dCBtdXRleCAqLworCisJCQlfbG9ja19tdXRleCgpOworCisJCQlpZiAocmV0ID09IERNX1dBSVRfRkFUQUwpCisJCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJLyogJzsnIGZpeGVzIGdjYyBjb21waWxhdGlvbiBwcm9ibGVtIHdpdGggb2xkZXIgcHRocmVhZCBtYWNyb3MKKwkgKiAibGFiZWwgYXQgZW5kIG9mIGNvbXBvdW5kIHN0YXRlbWVudCIgKi8KKwk7CisKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDEpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIGRldmljZSBtb25pdG9yaW5nIHRocmVhZC4gKi8KK3N0YXRpYyBpbnQgX2NyZWF0ZV90aHJlYWQoc3RydWN0IHRocmVhZF9zdGF0dXMgKnRocmVhZCkKK3sKKwlyZXR1cm4gX3B0aHJlYWRfY3JlYXRlX3NtYWxsc3RhY2soJnRocmVhZC0+dGhyZWFkLCBfbW9uaXRvcl90aHJlYWQsIHRocmVhZCk7Cit9CisKKy8qIFVwZGF0ZSBldmVudHMgLSBuZWVkcyB0byBiZSBsb2NrZWQgKi8KK3N0YXRpYyBpbnQgX3VwZGF0ZV9ldmVudHMoc3RydWN0IHRocmVhZF9zdGF0dXMgKnRocmVhZCwgaW50IGV2ZW50cykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICh0aHJlYWQtPmV2ZW50cyA9PSBldmVudHMpCisJCXJldHVybiAwOyAvKiBOb3RoaW5nIGhhcyBjaGFuZ2VkICovCisKKwl0aHJlYWQtPmV2ZW50cyA9IGV2ZW50czsKKwl0aHJlYWQtPnBlbmRpbmcgPSBETV9FVkVOVF9SRUdJU1RSQVRJT05fUEVORElORzsKKworCS8qIE9ubHkgbm9uLXByb2Nlc3NpbmcgdGhyZWFkcyBjYW4gYmUgbm90aWZpZWQgKi8KKwlpZiAoIXRocmVhZC0+cHJvY2Vzc2luZykgeworCQlERUJVR0xPRygiU2VuZGluZyBTSUdBTFJNIHRvIHdha2V1cCBUaHIgJXguIiwgKGludCl0aHJlYWQtPnRocmVhZCk7CisKKwkJLyogTm90aWZ5IHRocmVhZCB3YWl0aW5nIGluIGlvY3RsICh0byBzcGVlZC11cCkgKi8KKwkJaWYgKChyZXQgPSBwdGhyZWFkX2tpbGwodGhyZWFkLT50aHJlYWQsIFNJR0FMUk0pKSkgeworCQkJaWYgKHJldCA9PSBFU1JDSCkKKwkJCQl0aHJlYWQtPmV2ZW50cyA9IDA7ICAvKiB0aHJlYWQgaXMgZ29uZSAqLworCQkJZWxzZQorCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHdha2V1cCB0aHJlYWQ6ICVzIiwKKwkJCQkJICBzdHJlcnJvcihyZXQpKTsKKwkJfQorCX0KKworCS8qIFRocmVhZHMgd2l0aCBubyBldmVudHMgaGFzIHRvIGJlIG1vdmVkIHRvIHVudXNlZCAqLworCWlmICghdGhyZWFkLT5ldmVudHMpCisJCV90aHJlYWRfdW51c2VkKHRocmVhZCk7CisKKwlyZXR1cm4gLXJldDsKK30KKworLyogUmV0dXJuIHN1Y2Nlc3Mgb24gZGFlbW9uIGFjdGl2ZSBjaGVjay4gKi8KK3N0YXRpYyBpbnQgX2FjdGl2ZShzdHJ1Y3QgbWVzc2FnZV9kYXRhICptZXNzYWdlX2RhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIGZvciBhbiBldmVudC4KKyAqCisgKiBPbmx5IG9uZSBjYWxsZXIgYXQgYSB0aW1lIGhlcmUgYXMgd2l0aCByZWdpc3Rlcl9mb3JfZXZlbnQoKS4KKyAqLworc3RhdGljIGludCBfdW5yZWdpc3Rlcl9mb3JfZXZlbnQoc3RydWN0IG1lc3NhZ2VfZGF0YSAqbWVzc2FnZV9kYXRhKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisJaW50IHJldDsKKworCS8qCisJICogQ2xlYXIgZXZlbnQgaW4gYml0ZmllbGQgYW5kIGRlYWN0aXZhdGUKKwkgKiBtb25pdG9yaW5nIHRocmVhZCBpbiBjYXNlIGJpdGZpZWxkIGlzIDAuCisJICovCisJX2xvY2tfbXV0ZXgoKTsKKworCWlmICghKHRocmVhZCA9IF9sb29rdXBfdGhyZWFkX3N0YXR1cyhtZXNzYWdlX2RhdGEpKSkgeworCQlfdW5sb2NrX211dGV4KCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFORCBtYXNrIGV2ZW50IH4jIGZyb20gZXZlbnRzIGJpdGZpZWxkLiAqLworCXJldCA9IF91cGRhdGVfZXZlbnRzKHRocmVhZCwgKHRocmVhZC0+ZXZlbnRzICYgfm1lc3NhZ2VfZGF0YS0+ZXZlbnRzX2ZpZWxkKSk7CisKKwlfdW5sb2NrX211dGV4KCk7CisKKwkvKiBJZiB0aGVyZSBhcmUgbm8gZXZlbnRzLCB0aHJlYWQgaXMgbGF0ZXIgZ2FyYmFnZQorCSAqIGNvbGxlY3RlZCBieSBfY2xlYW51cF91bnVzZWRfdGhyZWFkcyAqLworCWlmIChtZXNzYWdlX2RhdGEtPmV2ZW50c19maWVsZCAmIERNX0VWRU5UX1RJTUVPVVQpCisJCV91bnJlZ2lzdGVyX2Zvcl90aW1lb3V0KHRocmVhZCk7CisKKwlERUJVR0xPRygiVW5yZWdpc3RlcmVkIGV2ZW50IGZvciAlcy4iLCB0aHJlYWQtPmRldmljZS5uYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWdpc3RlciBmb3IgYW4gZXZlbnQuCisgKgorICogT25seSBvbmUgY2FsbGVyIGF0IGEgdGltZSBoZXJlLCBiZWNhdXNlIHdlIHVzZQorICogYSBGSUZPIGFuZCBsb2NrIGl0IGFnYWluc3QgbXVsdGlwbGUgYWNjZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgX3JlZ2lzdGVyX2Zvcl9ldmVudChzdHJ1Y3QgbWVzc2FnZV9kYXRhICptZXNzYWdlX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHRocmVhZF9zdGF0dXMgKnRocmVhZDsKKwlzdHJ1Y3QgZHNvX2RhdGEgKmRzb19kYXRhOworCisJaWYgKCEoZHNvX2RhdGEgPSBfbG9va3VwX2RzbyhtZXNzYWdlX2RhdGEpKSAmJgorCSAgICAhKGRzb19kYXRhID0gX2xvYWRfZHNvKG1lc3NhZ2VfZGF0YSkpKSB7CisJCXN0YWNrOworI2lmZGVmIEVMSUJBQ0MKKwkJcmV0ID0gRUxJQkFDQzsKKyNlbHNlCisJCXJldCA9IEVOT0RFVjsKKyNlbmRpZgorCQlyZXR1cm4gcmV0OworCX0KKworCV9sb2NrX211dGV4KCk7CisKKwlpZiAoKHRocmVhZCA9IF9sb29rdXBfdGhyZWFkX3N0YXR1cyhtZXNzYWdlX2RhdGEpKSkgeworCQkvKiBPUiBldmVudCAjIGludG8gZXZlbnRzIGJpdGZpZWxkLiAqLworCQlyZXQgPSBfdXBkYXRlX2V2ZW50cyh0aHJlYWQsICh0aHJlYWQtPmV2ZW50cyB8IG1lc3NhZ2VfZGF0YS0+ZXZlbnRzX2ZpZWxkKSk7CisJfSBlbHNlIHsKKwkJX3VubG9ja19tdXRleCgpOworCisJCS8qIE9ubHkgY3JlYXRpbmcgdGhyZWFkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nCisJCSAqIFJlbWFpbmluZyBpbml0aWFsaXphdGlvbiBoYXBwZW5zIHdpdGhpbiBtb25pdG9yaW5nIHRocmVhZCAqLworCQlpZiAoISh0aHJlYWQgPSBfYWxsb2NfdGhyZWFkX3N0YXR1cyhtZXNzYWdlX2RhdGEsIGRzb19kYXRhKSkpIHsKKwkJCXN0YWNrOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoKHJldCA9IF9jcmVhdGVfdGhyZWFkKHRocmVhZCkpKSB7CisJCQlzdGFjazsKKwkJCV9mcmVlX3RocmVhZF9zdGF0dXModGhyZWFkKTsKKwkJCXJldHVybiAtcmV0OworCQl9CisKKwkJX2xvY2tfbXV0ZXgoKTsKKwkJLyogTm90ZTogc2FtZSB1dWlkIGNhbid0IGJlIGFkZGVkIGluIHBhcmFsbGVsICovCisJCUxJTktfVEhSRUFEKHRocmVhZCk7CisJfQorCisJX3VubG9ja19tdXRleCgpOworCisJLyogSWYgY3JlYXRpb24gb2YgdGltZW91dCB0aHJlYWQgZmFpbHMgKGFzIGl0IG1heSksIHdlIGZhaWwKKwkgICBoZXJlIGNvbXBsZXRlbHkuIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGVpdGhlcgorCSAgIHJldHJ5aW5nIGxhdGVyIG9yIHRyeWluZyB0byByZWdpc3RlciB3aXRob3V0IHRpbWVvdXQKKwkgICBldmVudHMuIEhvd2V2ZXIsIGlmIHRpbWVvdXQgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkLCBpdAorCSAgIHVzdWFsbHkgbWVhbnMgd2UgYXJlIHNvIHN0YXJ2ZWQgb24gcmVzb3VyY2VzIHRoYXQgd2UgYXJlCisJICAgYWxtb3N0IGFzIGdvb2QgYXMgZGVhZCBhbHJlYWR5Li4uICovCisJaWYgKChtZXNzYWdlX2RhdGEtPmV2ZW50c19maWVsZCAmIERNX0VWRU5UX1RJTUVPVVQpICYmCisJICAgIChyZXQgPSBfcmVnaXN0ZXJfZm9yX3RpbWVvdXQodGhyZWFkKSkpIHsKKwkJc3RhY2s7CisJCV91bnJlZ2lzdGVyX2Zvcl9ldmVudChtZXNzYWdlX2RhdGEpOworCX0KKworCXJldHVybiAtcmV0OworfQorCisvKgorICogR2V0IHJlZ2lzdGVyZWQgZGV2aWNlLgorICoKKyAqIE9ubHkgb25lIGNhbGxlciBhdCBhIHRpbWUgaGVyZSBhcyB3aXRoIHJlZ2lzdGVyX2Zvcl9ldmVudCgpLgorICovCitzdGF0aWMgaW50IF9yZWdpc3RlcmVkX2RldmljZShzdHJ1Y3QgbWVzc2FnZV9kYXRhICptZXNzYWdlX2RhdGEsCisJCQkgICAgIHN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cgPSBtZXNzYWdlX2RhdGEtPm1zZzsKKworCWRtX2ZyZWUobXNnLT5kYXRhKTsKKworCWlmICgociA9IGRtX2FzcHJpbnRmKCYobXNnLT5kYXRhKSwgIiVzICVzICVzICV1IiwKKwkJCSAgICAgbWVzc2FnZV9kYXRhLT5pZCwKKwkJCSAgICAgdGhyZWFkLT5kc29fZGF0YS0+ZHNvX25hbWUsCisJCQkgICAgIHRocmVhZC0+ZGV2aWNlLnV1aWQsCisJCQkgICAgIHRocmVhZC0+ZXZlbnRzIHwgdGhyZWFkLT5wZW5kaW5nKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zZy0+c2l6ZSA9ICh1aW50MzJfdCkgcjsKKwlERUJVR0xPRygiUmVnaXN0ZXJlZCAlcy4iLCBtc2ctPmRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3dhbnRfcmVnaXN0ZXJlZF9kZXZpY2UoY2hhciAqZHNvX25hbWUsIGNoYXIgKmRldmljZV91dWlkLAorCQkJCSAgIHN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQpCit7CisJLyogSWYgRFNPIG5hbWVzIGFuZCBkZXZpY2UgcGF0aHMgYXJlIGVxdWFsLiAqLworCWlmIChkc29fbmFtZSAmJiBkZXZpY2VfdXVpZCkKKwkJcmV0dXJuICFzdHJjbXAoZHNvX25hbWUsIHRocmVhZC0+ZHNvX2RhdGEtPmRzb19uYW1lKSAmJgorCQkgICAgIXN0cmNtcChkZXZpY2VfdXVpZCwgdGhyZWFkLT5kZXZpY2UudXVpZCk7CisKKwkvKiBJZiBEU08gbmFtZXMgYXJlIGVxdWFsLiAqLworCWlmIChkc29fbmFtZSkKKwkJcmV0dXJuICFzdHJjbXAoZHNvX25hbWUsIHRocmVhZC0+ZHNvX2RhdGEtPmRzb19uYW1lKTsKKworCS8qIElmIGRldmljZSBwYXRocyBhcmUgZXF1YWwuICovCisJaWYgKGRldmljZV91dWlkKQorCQlyZXR1cm4gIXN0cmNtcChkZXZpY2VfdXVpZCwgdGhyZWFkLT5kZXZpY2UudXVpZCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZ2V0X3JlZ2lzdGVyZWRfZGV2KHN0cnVjdCBtZXNzYWdlX2RhdGEgKm1lc3NhZ2VfZGF0YSwgaW50IG5leHQpCit7CisJc3RydWN0IHRocmVhZF9zdGF0dXMgKnRocmVhZCwgKmhpdCA9IE5VTEw7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwlERUJVR0xPRygiR2V0JXMgZHNvOiVzICB1dWlkOiVzLiIsIG5leHQgPyAiIiA6ICJOZXh0IiwKKwkJIG1lc3NhZ2VfZGF0YS0+ZHNvX25hbWUsCisJCSBtZXNzYWdlX2RhdGEtPmRldmljZV91dWlkKTsKKwlfbG9ja19tdXRleCgpOworCisJLyogSXRlcmF0ZSBsaXN0IG9mIHRocmVhZHMgY2hlY2tpbmcgaWYgd2Ugd2FudCBhIHBhcnRpY3VsYXIgb25lLiAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh0aHJlYWQsICZfdGhyZWFkX3JlZ2lzdHJ5KQorCQlpZiAoX3dhbnRfcmVnaXN0ZXJlZF9kZXZpY2UobWVzc2FnZV9kYXRhLT5kc29fbmFtZSwKKwkJCQkJICAgIG1lc3NhZ2VfZGF0YS0+ZGV2aWNlX3V1aWQsCisJCQkJCSAgICB0aHJlYWQpKSB7CisJCQloaXQgPSB0aHJlYWQ7CisJCQlicmVhazsKKwkJfQorCisJLyoKKwkgKiBJZiB3ZSBnb3QgYSByZWdpc3RlcmVkIGRldmljZSBhbmQgd2FudCB0aGUgbmV4dCBvbmUgLT4KKwkgKiBmZXRjaCBuZXh0IGNvbmZvcm1pbmcgZWxlbWVudCBvZmYgdGhlIGxpc3QuCisJICovCisJaWYgKGhpdCAmJiAhbmV4dCkKKwkJZ290byByZWc7CisKKwkvKgorCSAqIElmIHdlIGRpZG4ndCBnZXQgYSBtYXRjaCwgdHJ5IHRoZSB0aHJlYWRzIHdhaXRpbmcgdG8gYmUgZGVsZXRlZC4KKwkgKiBGSVhNRSBEbyBzb21ldGhpbmcgc2ltaWxhciBpZiAnbmV4dCcgaXMgc2V0LgorCSAqLworCWlmICghaGl0ICYmICFuZXh0KQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXModGhyZWFkLCAmX3RocmVhZF9yZWdpc3RyeV91bnVzZWQpCisJCQlpZiAoX3dhbnRfcmVnaXN0ZXJlZF9kZXZpY2UobWVzc2FnZV9kYXRhLT5kc29fbmFtZSwKKwkJCQkJCSAgICBtZXNzYWdlX2RhdGEtPmRldmljZV91dWlkLCB0aHJlYWQpKSB7CisJCQkJaGl0ID0gdGhyZWFkOworCQkJCWdvdG8gcmVnOworCQkJfQorCisJaWYgKCFoaXQpIHsKKwkJREVCVUdMT0coIkdldCVzIG5vdCByZWdpc3RlcmVkIiwgbmV4dCA/ICIiIDogIk5leHQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaWYgKGRtX2xpc3RfZW5kKCZfdGhyZWFkX3JlZ2lzdHJ5LCAmdGhyZWFkLT5saXN0KSkKKwkJCWdvdG8gb3V0OworCisJCXRocmVhZCA9IGRtX2xpc3RfaXRlbSh0aHJlYWQtPmxpc3Qubiwgc3RydWN0IHRocmVhZF9zdGF0dXMpOworCQlpZiAoX3dhbnRfcmVnaXN0ZXJlZF9kZXZpY2UobWVzc2FnZV9kYXRhLT5kc29fbmFtZSwgTlVMTCwgdGhyZWFkKSkgeworCQkJaGl0ID0gdGhyZWFkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIHJlZzoKKwlyZXQgPSBfcmVnaXN0ZXJlZF9kZXZpY2UobWVzc2FnZV9kYXRhLCBoaXQpOworCisgICAgICBvdXQ6CisJX3VubG9ja19tdXRleCgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlKHN0cnVjdCBtZXNzYWdlX2RhdGEgKm1lc3NhZ2VfZGF0YSkKK3sKKwlyZXR1cm4gX2dldF9yZWdpc3RlcmVkX2RldihtZXNzYWdlX2RhdGEsIDApOworfQorCitzdGF0aWMgaW50IF9nZXRfbmV4dF9yZWdpc3RlcmVkX2RldmljZShzdHJ1Y3QgbWVzc2FnZV9kYXRhICptZXNzYWdlX2RhdGEpCit7CisJcmV0dXJuIF9nZXRfcmVnaXN0ZXJlZF9kZXYobWVzc2FnZV9kYXRhLCAxKTsKK30KKworc3RhdGljIGludCBfc2V0X3RpbWVvdXQoc3RydWN0IG1lc3NhZ2VfZGF0YSAqbWVzc2FnZV9kYXRhKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisKKwlfbG9ja19tdXRleCgpOworCXRocmVhZCA9IF9sb29rdXBfdGhyZWFkX3N0YXR1cyhtZXNzYWdlX2RhdGEpOworCV91bmxvY2tfbXV0ZXgoKTsKKworCWlmICghdGhyZWFkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIExldHMgcmVwcm9ncmFtIHRpbWVyICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZfdGltZW91dF9tdXRleCk7CisJdGhyZWFkLT50aW1lb3V0ID0gbWVzc2FnZV9kYXRhLT50aW1lb3V0X3NlY3M7CisJdGhyZWFkLT5uZXh0X3RpbWUgPSAwOworCXB0aHJlYWRfY29uZF9zaWduYWwoJl90aW1lb3V0X2NvbmQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfdGltZW91dF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZ2V0X3RpbWVvdXQoc3RydWN0IG1lc3NhZ2VfZGF0YSAqbWVzc2FnZV9kYXRhKQoreworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cgPSBtZXNzYWdlX2RhdGEtPm1zZzsKKworCV9sb2NrX211dGV4KCk7CisJdGhyZWFkID0gX2xvb2t1cF90aHJlYWRfc3RhdHVzKG1lc3NhZ2VfZGF0YSk7CisJX3VubG9ja19tdXRleCgpOworCisJaWYgKCF0aHJlYWQpCisJCXJldHVybiAtRU5PREVWOworCisJZG1fZnJlZShtc2ctPmRhdGEpOworCW1zZy0+c2l6ZSA9IGRtX2FzcHJpbnRmKCYobXNnLT5kYXRhKSwgIiVzICUiIFBSSXUzMiwKKwkJCQltZXNzYWdlX2RhdGEtPmlkLCB0aHJlYWQtPnRpbWVvdXQpOworCisJcmV0dXJuIChtc2ctPmRhdGEgJiYgbXNnLT5zaXplKSA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IF9vcGVuX2ZpZm8oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQgPSAtMTsKKyAKKyAJLyoKKwkgKiBGSVhNRSBFeHBsaWNpdGx5IHZlcmlmeSB0aGUgY29kZSdzIHJlcXVpcmVtZW50IHRoYXQgcGF0aCBpcyBzZWN1cmU6CisJICogLSBBbGwgcGFyZW50IGRpcmVjdG9yaWVzIG93bmVkIGJ5IHJvb3Qgd2l0aG91dCBncm91cC9vdGhlciB3cml0ZSBhY2Nlc3MgdW5sZXNzIHN0aWNreS4KKwkgKi8KKworCS8qIElmIHBhdGggZXhpc3RzLCBvbmx5IHVzZSBpdCBpZiBpdCBpcyByb290LW93bmVkIGZpZm8gbW9kZSAwNjAwICovCisJaWYgKChsc3RhdChwYXRoLCAmc3QpIDwgMCkpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJbG9nX3N5c19lcnJvcigic3RhdCIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIGlmICghU19JU0ZJRk8oc3Quc3RfbW9kZSkgfHwgc3Quc3RfdWlkIHx8CisJCSAgIChzdC5zdF9tb2RlICYgKFNfSUVYRUMgfCBTX0lSV1hHIHwgU19JUldYTykpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiAlcyBoYXMgd3JvbmcgYXR0cmlidXRlczogUmVwbGFjaW5nLiIsIHBhdGgpOworCQlpZiAodW5saW5rKHBhdGgpKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBmaWZvLiAqLworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChwYXRoLCBTX0lGSUZPKTsKKwlpZiAoKG1rZmlmbyhwYXRoLCAwNjAwKSA9PSAtMSkgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWxvZ19zeXNfZXJyb3IoIm1rZmlmbyIsIHBhdGgpOworCQkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisKKwkvKiBOZWVkIHRvIG9wZW4gcmVhZCt3cml0ZSBvciB3ZSB3aWxsIGJsb2NrIG9yIGZhaWwgKi8KKwlpZiAoKGZkID0gb3BlbihwYXRoLCBPX1JEV1IpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIHBhdGgpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogV2FybiBhYm91dCB3cm9uZyBwZXJtaXNzaW9ucyBpZiBhcHBsaWNhYmxlICovCisJaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJCWxvZ19zeXNfZXJyb3IoImZzdGF0IiwgcGF0aCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIVNfSVNGSUZPKHN0LnN0X21vZGUpIHx8IHN0LnN0X3VpZCB8fAorCSAgICAoc3Quc3RfbW9kZSAmIChTX0lFWEVDIHwgU19JUldYRyB8IFNfSVJXWE8pKSkgeworCQlsb2dfZXJyb3IoIiVzOiBmaWZvIGhhcyBpbmNvcnJlY3QgYXR0cmlidXRlcyIsIHBhdGgpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmY250bChGRF9DTE9FWEVDKSIsIHBhdGgpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIGZkOworCitmYWlsOgorCWlmICgoZmQgPj0gMCkgJiYgY2xvc2UoZmQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIHBhdGgpOworCisJcmV0dXJuIC0xOworfQorCisvKiBPcGVuIGZpZm9zIHVzZWQgZm9yIGNsaWVudCBjb21tdW5pY2F0aW9uLiAqLworc3RhdGljIGludCBfb3Blbl9maWZvcyhzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgKmZpZm9zKQoreworCS8qIENyZWF0ZSBjbGllbnQgZmlmby4gKi8KKwlpZiAoKGZpZm9zLT5jbGllbnQgPSBfb3Blbl9maWZvKGZpZm9zLT5jbGllbnRfcGF0aCkpIDwgMCkKKwkJZ290byBmYWlsOworCisJLyogQ3JlYXRlIHNlcnZlciBmaWZvLiAqLworCWlmICgoZmlmb3MtPnNlcnZlciA9IF9vcGVuX2ZpZm8oZmlmb3MtPnNlcnZlcl9wYXRoKSkgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMTsKKworZmFpbDoKKwlpZiAoZmlmb3MtPmNsaWVudCA+PSAwICYmIGNsb3NlKGZpZm9zLT5jbGllbnQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgbWVzc2FnZSBmcm9tIGNsaWVudCBtYWtpbmcgc3VyZSB0aGF0IGRhdGEgaXMgYXZhaWxhYmxlCisgKiBhbmQgYSBjb21wbGV0ZSBtZXNzYWdlIGlzIHJlYWQuICBNdXN0IG5vdCBibG9jayBpbmRlZmluaXRlbHkuCisgKi8KK3N0YXRpYyBpbnQgX2NsaWVudF9yZWFkKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MsCisJCQlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0OworCXVuc2lnbmVkIGJ5dGVzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlmZF9zZXQgZmRzOworCXNpemVfdCBzaXplID0gMiAqIHNpemVvZih1aW50MzJfdCk7CS8qIHN0YXR1cyArIHNpemUgKi8KKwl1aW50MzJfdCAqaGVhZGVyID0gYWxsb2NhKHNpemUpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopaGVhZGVyOworCisJbXNnLT5kYXRhID0gTlVMTDsKKworCWVycm5vID0gMDsKKwl3aGlsZSAoYnl0ZXMgPCBzaXplICYmIGVycm5vICE9IEVPRikgeworCQkvKiBXYXRjaCBjbGllbnQgcmVhZCBGSUZPIGZvciBpbnB1dC4gKi8KKwkJRkRfWkVSTygmZmRzKTsKKwkJRkRfU0VUKGZpZm9zLT5jbGllbnQsICZmZHMpOworCQl0LnR2X3NlYyA9IDE7CisJCXQudHZfdXNlYyA9IDA7CisJCXJldCA9IHNlbGVjdChmaWZvcy0+Y2xpZW50ICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgJnQpOworCisJCWlmICghcmV0ICYmICFieXRlcykJLyogbm90aGluZyB0byByZWFkICovCisJCQlyZXR1cm4gMDsKKworCQlpZiAoIXJldCkJLyogdHJ5aW5nIHRvIGZpbmlzaCByZWFkICovCisJCQljb250aW51ZTsKKworCQlpZiAocmV0IDwgMCkJLyogZXJyb3IgKi8KKwkJCXJldHVybiAwOworCisJCXJldCA9IHJlYWQoZmlmb3MtPmNsaWVudCwgYnVmICsgYnl0ZXMsIHNpemUgLSBieXRlcyk7CisJCWJ5dGVzICs9IHJldCA+IDAgPyByZXQgOiAwOworCQlpZiAoaGVhZGVyICYmIChieXRlcyA9PSAyICogc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJCW1zZy0+Y21kID0gbnRvaGwoaGVhZGVyWzBdKTsKKwkJCXNpemUgPSBtc2ctPnNpemUgPSBudG9obChoZWFkZXJbMV0pOworCQkJYnl0ZXMgPSAwOworCQkJaWYgKCFzaXplKQorCQkJCWJyZWFrOyAvKiBObyBkYXRhIC0+IGVycm9yICovCisJCQlidWYgPSBtc2ctPmRhdGEgPSBkbV9tYWxsb2MobXNnLT5zaXplKTsKKwkJCWlmICghYnVmKQorCQkJCWJyZWFrOyAvKiBObyBtZW0gLT4gZXJyb3IgKi8KKwkJCWhlYWRlciA9IDA7CisJCX0KKwl9CisKKwlpZiAoYnl0ZXMgIT0gc2l6ZSkgeworCQlkbV9mcmVlKG1zZy0+ZGF0YSk7CisJCW1zZy0+ZGF0YSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogV3JpdGUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQgbWFraW5nIHN1cmUgdGhhdCBpdCBpcyByZWFkeSB0byB3cml0ZS4KKyAqLworc3RhdGljIGludCBfY2xpZW50X3dyaXRlKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MsCisJCQlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgKm1zZykKK3sKKwl1aW50MzJfdCB0ZW1wWzJdOworCXVuc2lnbmVkIGJ5dGVzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlmZF9zZXQgZmRzOworCisJc2l6ZV90IHNpemUgPSAyICogc2l6ZW9mKHVpbnQzMl90KSArICgobXNnLT5kYXRhKSA/IG1zZy0+c2l6ZSA6IDApOworCXVpbnQzMl90ICpoZWFkZXIgPSBkbV9tYWxsb2Moc2l6ZSk7CisJY2hhciAqYnVmID0gKGNoYXIgKiloZWFkZXI7CisKKwlpZiAoIWhlYWRlcikgeworCQkvKiBSZXBseSB3aXRoIEVOT01FTSBtZXNzYWdlICovCisJCWhlYWRlciA9IHRlbXA7CisJCXNpemUgPSBzaXplb2YodGVtcCk7CisJCWhlYWRlclswXSA9IGh0b25sKC1FTk9NRU0pOworCQloZWFkZXJbMV0gPSAwOworCX0gZWxzZSB7CisJCWhlYWRlclswXSA9IGh0b25sKG1zZy0+Y21kKTsKKwkJaGVhZGVyWzFdID0gaHRvbmwoKG1zZy0+ZGF0YSkgPyBtc2ctPnNpemUgOiAwKTsKKwkJaWYgKG1zZy0+ZGF0YSkKKwkJCW1lbWNweShidWYgKyAyICogc2l6ZW9mKHVpbnQzMl90KSwgbXNnLT5kYXRhLCBtc2ctPnNpemUpOworCX0KKworCXdoaWxlIChieXRlcyA8IHNpemUpIHsKKwkJZG8geworCQkJLyogV2F0Y2ggY2xpZW50IHdyaXRlIEZJRk8gdG8gYmUgcmVhZHkgZm9yIG91dHB1dC4gKi8KKwkJCUZEX1pFUk8oJmZkcyk7CisJCQlGRF9TRVQoZmlmb3MtPnNlcnZlciwgJmZkcyk7CisJCX0gd2hpbGUgKHNlbGVjdChmaWZvcy0+c2VydmVyICsgMSwgTlVMTCwgJmZkcywgTlVMTCwgTlVMTCkgIT0gMSk7CisKKwkJaWYgKChyZXQgPSB3cml0ZShmaWZvcy0+c2VydmVyLCBidWYgKyBieXRlcywgc2l6ZSAtIGJ5dGVzKSkgPiAwKQorCQkJYnl0ZXMgKz0gcmV0OworCQllbHNlIGlmIChlcnJubyA9PSBFSU8pCisJCQlicmVhazsKKwl9CisKKwlpZiAoaGVhZGVyICE9IHRlbXApCisJCWRtX2ZyZWUoaGVhZGVyKTsKKworCXJldHVybiAoYnl0ZXMgPT0gc2l6ZSk7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBjbGllbnQgcmVxdWVzdC4KKyAqCisgKiBXZSBwdXQgdGhlIHJlcXVlc3QgaGFuZGxpbmcgZnVuY3Rpb25zIGludG8KKyAqIGEgbGlzdCBiZWNhdXNlIG9mIHRoZSBncm93aW5nIG51bWJlci4KKyAqLworc3RhdGljIGludCBfaGFuZGxlX3JlcXVlc3Qoc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2csCisJCQkgIHN0cnVjdCBtZXNzYWdlX2RhdGEgKm1lc3NhZ2VfZGF0YSkKK3sKKwlzd2l0Y2ggKG1zZy0+Y21kKSB7CisJY2FzZSBETV9FVkVOVF9DTURfUkVHSVNURVJfRk9SX0VWRU5UOgorCQlpZiAoIW1lc3NhZ2VfZGF0YS0+ZXZlbnRzX2ZpZWxkKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBfcmVnaXN0ZXJfZm9yX2V2ZW50KG1lc3NhZ2VfZGF0YSk7CisJY2FzZSBETV9FVkVOVF9DTURfVU5SRUdJU1RFUl9GT1JfRVZFTlQ6CisJCXJldHVybiBfdW5yZWdpc3Rlcl9mb3JfZXZlbnQobWVzc2FnZV9kYXRhKTsKKwljYXNlIERNX0VWRU5UX0NNRF9HRVRfUkVHSVNURVJFRF9ERVZJQ0U6CisJCXJldHVybiBfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlKG1lc3NhZ2VfZGF0YSk7CisJY2FzZSBETV9FVkVOVF9DTURfR0VUX05FWFRfUkVHSVNURVJFRF9ERVZJQ0U6CisJCXJldHVybiBfZ2V0X25leHRfcmVnaXN0ZXJlZF9kZXZpY2UobWVzc2FnZV9kYXRhKTsKKwljYXNlIERNX0VWRU5UX0NNRF9TRVRfVElNRU9VVDoKKwkJcmV0dXJuIF9zZXRfdGltZW91dChtZXNzYWdlX2RhdGEpOworCWNhc2UgRE1fRVZFTlRfQ01EX0dFVF9USU1FT1VUOgorCQlyZXR1cm4gX2dldF90aW1lb3V0KG1lc3NhZ2VfZGF0YSk7CisJY2FzZSBETV9FVkVOVF9DTURfQUNUSVZFOgorCQlyZXR1cm4gX2FjdGl2ZShtZXNzYWdlX2RhdGEpOworCWNhc2UgRE1fRVZFTlRfQ01EX0dFVF9TVEFUVVM6CisJCXJldHVybiBfZ2V0X3N0YXR1cyhtZXNzYWdlX2RhdGEpOworCS8qIGRtZXZlbnRkIHBhcmFtZXRlcnMgb2YgcnVubmluZyBkbWV2ZW50ZCwKKwkgKiByZXR1cm5zICdwaWQ9PHBpZD4gZGFlbW9uPTxuby95ZXM+IGV4ZWNfbWV0aG9kPTxkaXJlY3Qvc3lzdGVtZD4nCisJICogCXBpZCAtIHBpZGZpbGUgb2YgcnVubmluZyBkbWV2ZW50ZAorCSAqIAlkYWVtb24gLSBydW5uaW5nIGFzIGEgZGFlbW9uIG9yIG5vdCAoZm9yZWdyb3VuZCk/CisJICogCWV4ZWNfbWV0aG9kIC0gImRpcmVjdCIgaWYgZXhlY3V0ZWQgZGlyZWN0bHkgb3IKKwkgKiAJCSAgICAgICJzeXN0ZW1kIiBpZiBleGVjdXRlZCB2aWEgc3lzdGVtZAorCSAqLworCWNhc2UgRE1fRVZFTlRfQ01EX0dFVF9QQVJBTUVURVJTOgorCQlyZXR1cm4gX2dldF9wYXJhbWV0ZXJzKG1lc3NhZ2VfZGF0YSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKiBQcm9jZXNzIGEgcmVxdWVzdCBwYXNzZWQgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiB0aHJlYWQuICovCitzdGF0aWMgaW50IF9kb19wcm9jZXNzX3JlcXVlc3Qoc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cpCit7CisJaW50IHJldDsKKwljaGFyICphbnN3ZXI7CisJc3RydWN0IG1lc3NhZ2VfZGF0YSBtZXNzYWdlX2RhdGEgPSB7IC5tc2cgPSAgbXNnIH07CisKKwkvKiBQYXJzZSB0aGUgbWVzc2FnZS4gKi8KKwlpZiAobXNnLT5jbWQgPT0gRE1fRVZFTlRfQ01EX0hFTExPIHx8IG1zZy0+Y21kID09IERNX0VWRU5UX0NNRF9ESUUpICB7CisJCXJldCA9IDA7CisJCWFuc3dlciA9IG1zZy0+ZGF0YTsKKwkJaWYgKGFuc3dlcikgeworCQkJbXNnLT5zaXplID0gZG1fYXNwcmludGYoJihtc2ctPmRhdGEpLCAiJXMgJXMgJWQiLCBhbnN3ZXIsCisJCQkJCQkobXNnLT5jbWQgPT0gRE1fRVZFTlRfQ01EX0RJRSkgPyAiRFlJTkciIDogIkhFTExPIiwKKwkJCQkJCURNX0VWRU5UX1BST1RPQ09MX1ZFUlNJT04pOworCQkJZG1fZnJlZShhbnN3ZXIpOworCQl9CisJfSBlbHNlIGlmIChtc2ctPmNtZCAhPSBETV9FVkVOVF9DTURfQUNUSVZFICYmICFfcGFyc2VfbWVzc2FnZSgmbWVzc2FnZV9kYXRhKSkgeworCQlzdGFjazsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9IGVsc2UKKwkJcmV0ID0gX2hhbmRsZV9yZXF1ZXN0KG1zZywgJm1lc3NhZ2VfZGF0YSk7CisKKwltc2ctPmNtZCA9IHJldDsKKwlpZiAoIW1zZy0+ZGF0YSkKKwkJbXNnLT5zaXplID0gZG1fYXNwcmludGYoJihtc2ctPmRhdGEpLCAiJXMgJXMiLCBtZXNzYWdlX2RhdGEuaWQsIHN0cmVycm9yKC1yZXQpKTsKKworCV9mcmVlX21lc3NhZ2UoJm1lc3NhZ2VfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBPbmx5IG9uZSBjYWxsZXIgYXQgYSB0aW1lLiAqLworc3RhdGljIHZvaWQgX3Byb2Nlc3NfcmVxdWVzdChzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgKmZpZm9zKQoreworCXN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSBtc2cgPSB7IDAgfTsKKwlpbnQgY21kOworCS8qCisJICogUmVhZCB0aGUgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQgKGNsaWVudF9yZWFkLCBjbGllbnRfd3JpdGUKKwkgKiBnaXZlIHRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2Ugb24gZmFpbHVyZSkuCisJICovCisJaWYgKCFfY2xpZW50X3JlYWQoZmlmb3MsICZtc2cpKQorCQlyZXR1cm47CisKKwljbWQgPSBtc2cuY21kOworCisJREVCVUdMT0coIj4+PiBDTUQ6JXMgKDB4JXgpIHByb2Nlc3NpbmcuLi4iLCBkZWNvZGVfY21kKGNtZCksIGNtZCk7CisKKwkvKiBfZG9fcHJvY2Vzc19yZXF1ZXN0IGZpbGxzIGluIG1zZyAoaWYgbWVtb3J5IGFsbG93cyBmb3IKKwkgICBkYXRhLCBvdGhlcndpc2UganVzdCBjbWQgYW5kIHNpemUgPSAwKSAqLworCV9kb19wcm9jZXNzX3JlcXVlc3QoJm1zZyk7CisKKwlpZiAoIV9jbGllbnRfd3JpdGUoZmlmb3MsICZtc2cpKQorCQlzdGFjazsKKworCURFQlVHTE9HKCI8PDwgQ01EOiVzICgweCV4KSBjb21wbGV0ZWQgKHJlc3VsdCAlZCkuIiwgZGVjb2RlX2NtZChjbWQpLCBjbWQsIG1zZy5jbWQpOworCisJZG1fZnJlZShtc2cuZGF0YSk7CisKKwlpZiAoY21kID09IERNX0VWRU5UX0NNRF9ESUUpIHsKKwkJaWYgKHVubGluayhETUVWRU5URF9QSURGSUxFKSkKKwkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIERNRVZFTlREX1BJREZJTEUpOworCQlfZXhpdCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9wcm9jZXNzX2luaXRpYWxfcmVnaXN0cmF0aW9ucyh2b2lkKQoreworCWludCBpOworCWNoYXIgKnJlZzsKKwlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgbXNnID0geyAwIH07CisKKwlmb3IgKGkgPSAwOyAocmVnID0gX2luaXRpYWxfcmVnaXN0cmF0aW9uc1tpXSk7ICsraSkgeworCQltc2cuY21kID0gRE1fRVZFTlRfQ01EX1JFR0lTVEVSX0ZPUl9FVkVOVDsKKwkJaWYgKChtc2cuc2l6ZSA9IHN0cmxlbihyZWcpKSkgeworCQkJbXNnLmRhdGEgPSByZWc7CisJCQlfZG9fcHJvY2Vzc19yZXF1ZXN0KCZtc2cpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfY2xlYW51cF91bnVzZWRfdGhyZWFkcyh2b2lkKQoreworCXN0cnVjdCBkbV9saXN0ICpsOworCXN0cnVjdCB0aHJlYWRfc3RhdHVzICp0aHJlYWQ7CisJaW50IHJldDsKKworCV9sb2NrX211dGV4KCk7CisKKwl3aGlsZSAoKGwgPSBkbV9saXN0X2ZpcnN0KCZfdGhyZWFkX3JlZ2lzdHJ5X3VudXNlZCkpKSB7CisJCXRocmVhZCA9IGRtX2xpc3RfaXRlbShsLCBzdHJ1Y3QgdGhyZWFkX3N0YXR1cyk7CisJCWlmICh0aHJlYWQtPnN0YXR1cyAhPSBETV9USFJFQURfRE9ORSkgeworCQkJaWYgKHRocmVhZC0+cHJvY2Vzc2luZykKKwkJCQlicmVhazsgLyogY2xlYW51cCBvbiB0aGUgbmV4dCByb3VuZCAqLworCisJCQkvKiBTaWduYWwgcG9zc2libHkgc2xlZXBpbmcgdGhyZWFkICovCisJCQlyZXQgPSBwdGhyZWFkX2tpbGwodGhyZWFkLT50aHJlYWQsIFNJR0FMUk0pOworCQkJaWYgKCFyZXQgfHwgKHJldCAhPSBFU1JDSCkpCisJCQkJYnJlYWs7IC8qIGNoZWNrIGFnYWluIG9uIHRoZSBuZXh0IHJvdW5kICovCisKKwkJCS8qIHRocmVhZCBpcyBsaWtlbHkgZ29uZSAqLworCQl9CisKKwkJZG1fbGlzdF9kZWwobCk7CisJCV91bmxvY2tfbXV0ZXgoKTsKKworCQlERUJVR0xPRygiRGVzdHJveWluZyBUaHIgJXguIiwgKGludCl0aHJlYWQtPnRocmVhZCk7CisKKwkJaWYgKHB0aHJlYWRfam9pbih0aHJlYWQtPnRocmVhZCwgTlVMTCkpCisJCQlsb2dfc3lzX2Vycm9yKCJwdGhyZWFkX2pvaW4iLCAiIik7CisKKwkJX2ZyZWVfdGhyZWFkX3N0YXR1cyh0aHJlYWQpOworCQlfbG9ja19tdXRleCgpOworCX0KKworCV91bmxvY2tfbXV0ZXgoKTsKK30KKworc3RhdGljIHZvaWQgX3NpZ19hbGFybShpbnQgc2lnbnVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCS8qIGVtcHR5IFNJR19JR04gKi87Cit9CisKKy8qIEluaXQgdGhyZWFkIHNpZ25hbCBoYW5kbGluZy4gKi8KK3N0YXRpYyB2b2lkIF9pbml0X3RocmVhZF9zaWduYWxzKHZvaWQpCit7CisJc2lnc2V0X3QgbXlfc2lnc2V0OworCXN0cnVjdCBzaWdhY3Rpb24gYWN0ID0geyAuc2FfaGFuZGxlciA9IF9zaWdfYWxhcm0gfTsKKworCXNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0LCBOVUxMKTsKKwlzaWdmaWxsc2V0KCZteV9zaWdzZXQpOworCisJLyogVGhlc2UgYXJlIHVzZWQgZm9yIGV4aXRpbmcgKi8KKwlzaWdkZWxzZXQoJm15X3NpZ3NldCwgU0lHVEVSTSk7CisJc2lnZGVsc2V0KCZteV9zaWdzZXQsIFNJR0lOVCk7CisJc2lnZGVsc2V0KCZteV9zaWdzZXQsIFNJR0hVUCk7CisJc2lnZGVsc2V0KCZteV9zaWdzZXQsIFNJR1FVSVQpOworCisJcHRocmVhZF9zaWdtYXNrKFNJR19CTE9DSywgJm15X3NpZ3NldCwgTlVMTCk7Cit9CisKKy8qCisgKiBleGl0X2hhbmRsZXIKKyAqIEBzaWcKKyAqCisgKiBTZXQgdGhlIGdsb2JhbCB2YXJpYWJsZSB3aGljaCB0aGUgcHJvY2VzcyBzaG91bGQKKyAqIGJlIHdhdGNoaW5nIHRvIGRldGVybWluZSB3aGVuIHRvIGV4aXQuCisgKi8KK3N0YXRpYyB2b2lkIF9leGl0X2hhbmRsZXIoaW50IHNpZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlfZXhpdF9ub3cgPSAxOworfQorCisjaWZkZWYgX19saW51eF9fCitzdGF0aWMgaW50IF9zZXRfb29tX2Fkaihjb25zdCBjaGFyICpvb21fYWRqX3BhdGgsIGludCB2YWwpCit7CisJRklMRSAqZnA7CisKKwlpZiAoIShmcCA9IGZvcGVuKG9vbV9hZGpfcGF0aCwgInciKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIG9vbV9hZGpfcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCWZwcmludGYoZnAsICIlaSIsIHZhbCk7CisKKwlpZiAoZG1fZmNsb3NlKGZwKSkKKwkJbG9nX3N5c19lcnJvcigiZmNsb3NlIiwgb29tX2Fkal9wYXRoKTsKKworCXJldHVybiAxOworfQorCisvKgorICogUHJvdGVjdGlvbiBhZ2FpbnN0IE9PTSBraWxsZXIgaWYga2VybmVsIHN1cHBvcnRzIGl0CisgKi8KK3N0YXRpYyBpbnQgX3Byb3RlY3RfYWdhaW5zdF9vb21fa2lsbGVyKHZvaWQpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChPT01fQURKX0ZJTEUsICZzdCkgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWxvZ19zeXNfZXJyb3IoInN0YXQiLCBPT01fQURKX0ZJTEUpOworCisJCS8qIFRyeSBvbGQgb29tX2FkaiBpbnRlcmZhY2UgYXMgYSBmYWxsYmFjayAqLworCQlpZiAoc3RhdChPT01fQURKX0ZJTEVfT0xELCAmc3QpID09IC0xKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgT09NX0FESl9GSUxFX09MRCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXJldHVybiBfc2V0X29vbV9hZGooT09NX0FESl9GSUxFX09MRCwgT09NX0RJU0FCTEUpIHx8CisJCSAgICAgICBfc2V0X29vbV9hZGooT09NX0FESl9GSUxFX09MRCwgT09NX0FESlVTVF9NSU4pOworCX0KKworCXJldHVybiBfc2V0X29vbV9hZGooT09NX0FESl9GSUxFLCBPT01fU0NPUkVfQURKX01JTik7Cit9CisKK3N0YXRpYyBpbnQgX2hhbmRsZV9wcmVsb2FkZWRfZmlmbyhpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3RfZmQsIHN0X3BhdGg7CisJaW50IGZsYWdzOworCisJaWYgKChmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZEKSkgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChmbGFncyAmIEZEX0NMT0VYRUMpCisJCXJldHVybiAwOworCisJaWYgKGZzdGF0KGZkLCAmc3RfZmQpIDwgMCB8fCAhU19JU0ZJRk8oc3RfZmQuc3RfbW9kZSkpCisJCXJldHVybiAwOworCisJaWYgKHN0YXQocGF0aCwgJnN0X3BhdGgpIDwgMCB8fAorCSAgICBzdF9wYXRoLnN0X2RldiAhPSBzdF9mZC5zdF9kZXYgfHwKKwkgICAgc3RfcGF0aC5zdF9pbm8gIT0gc3RfZmQuc3RfaW5vKQorCQlyZXR1cm4gMDsKKworCWlmIChmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3N5c3RlbWRfaGFuZG92ZXIoc3RydWN0IGRtX2V2ZW50X2ZpZm9zICpmaWZvcykKK3sKKwljb25zdCBjaGFyICplOworCWNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyBlbnZfcGlkLCBlbnZfbGlzdGVuX2ZkczsKKwlpbnQgciA9IDA7CisKKwkvKiBTRF9BQ1RJVkFUSU9OIG11c3QgYmUgc2V0ISAqLworCWlmICghKGUgPSBnZXRlbnYoU0RfQUNUSVZBVElPTl9FTlZfVkFSX05BTUUpKSB8fCBzdHJjbXAoZSwgIjEiKSkKKwkJZ290byBvdXQ7CisKKwkvKiBMSVNURU5fUElEIG11c3QgYmUgZXF1YWwgdG8gb3VyIFBJRCEgKi8KKwlpZiAoIShlID0gZ2V0ZW52KFNEX0xJU1RFTl9QSURfRU5WX1ZBUl9OQU1FKSkpCisJCWdvdG8gb3V0OworCisJZXJybm8gPSAwOworCWVudl9waWQgPSBzdHJ0b3VsKGUsICZwLCAxMCk7CisJaWYgKGVycm5vIHx8ICFwIHx8ICpwIHx8IGVudl9waWQgPD0gMCB8fAorCSAgICBnZXRwaWQoKSAhPSAocGlkX3QpIGVudl9waWQpCisJCWdvdG8gb3V0OworCisJLyogTElTVEVOX0ZEUyBtdXN0IGJlIDIgYW5kIHRoZSBmZHMgbXVzdCBiZSBGSUZPU3MhICovCisJaWYgKCEoZSA9IGdldGVudihTRF9MSVNURU5fRkRTX0VOVl9WQVJfTkFNRSkpKQorCQlnb3RvIG91dDsKKworCWVycm5vID0gMDsKKwllbnZfbGlzdGVuX2ZkcyA9IHN0cnRvdWwoZSwgJnAsIDEwKTsKKwlpZiAoZXJybm8gfHwgIXAgfHwgKnAgfHwgZW52X2xpc3Rlbl9mZHMgIT0gMikKKwkJZ290byBvdXQ7CisKKwkvKiBDaGVjayBhbmQgaGFuZGxlIHRoZSBGSUZPcyBwYXNzZWQgaW4gKi8KKwlyID0gKF9oYW5kbGVfcHJlbG9hZGVkX2ZpZm8oU0RfRkRfRklGT19TRVJWRVIsIERNX0VWRU5UX0ZJRk9fU0VSVkVSKSAmJgorCSAgICAgX2hhbmRsZV9wcmVsb2FkZWRfZmlmbyhTRF9GRF9GSUZPX0NMSUVOVCwgRE1fRVZFTlRfRklGT19DTElFTlQpKTsKKworCWlmIChyKSB7CisJCWZpZm9zLT5zZXJ2ZXIgPSBTRF9GRF9GSUZPX1NFUlZFUjsKKwkJZmlmb3MtPnNlcnZlcl9wYXRoID0gRE1fRVZFTlRfRklGT19TRVJWRVI7CisJCWZpZm9zLT5jbGllbnQgPSBTRF9GRF9GSUZPX0NMSUVOVDsKKwkJZmlmb3MtPmNsaWVudF9wYXRoID0gRE1fRVZFTlRfRklGT19DTElFTlQ7CisJfQorCitvdXQ6CisJdW5zZXRlbnYoU0RfQUNUSVZBVElPTl9FTlZfVkFSX05BTUUpOworCXVuc2V0ZW52KFNEX0xJU1RFTl9QSURfRU5WX1ZBUl9OQU1FKTsKKwl1bnNldGVudihTRF9MSVNURU5fRkRTX0VOVl9WQVJfTkFNRSk7CisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2ZpbGVzX29uX2V4aXQodm9pZCkKK3sKKwlpZiAodW5saW5rKERNRVZFTlREX1BJREZJTEUpKQorCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBETUVWRU5URF9QSURGSUxFKTsKKworCWlmICghX3N5c3RlbWRfYWN0aXZhdGlvbikgeworCQlpZiAodW5saW5rKERNX0VWRU5UX0ZJRk9fQ0xJRU5UKSkKKwkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIERNX0VWRU5UX0ZJRk9fQ0xJRU5UKTsKKworCQlpZiAodW5saW5rKERNX0VWRU5UX0ZJRk9fU0VSVkVSKSkKKwkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIERNX0VWRU5UX0ZJRk9fU0VSVkVSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9kYWVtb25pemUodm9pZCkKK3sKKwlpbnQgY2hpbGRfc3RhdHVzOworCWludCBmZDsKKwlwaWRfdCBwaWQ7CisJc3RydWN0IHJsaW1pdCBybGltOworCXN0cnVjdCB0aW1ldmFsIHR2YWw7CisJc2lnc2V0X3QgbXlfc2lnc2V0OworCisJc2lnZW1wdHlzZXQoJm15X3NpZ3NldCk7CisJaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbXlfc2lnc2V0LCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcmVzdG9yZSBzaWduYWxzLlxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJc2lnbmFsKFNJR1RFUk0sICZfZXhpdF9oYW5kbGVyKTsKKworCXN3aXRjaCAocGlkID0gZm9yaygpKSB7CisJY2FzZSAtMToKKwkJbG9nX3N5c19lcnJvcigiZm9yayIsICIiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCWNhc2UgMDoJCS8qIENoaWxkICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSBjaGlsZCAqLworCQl3aGlsZSAoIXdhaXRwaWQocGlkLCAmY2hpbGRfc3RhdHVzLCBXTk9IQU5HKSAmJiAhX2V4aXRfbm93KSB7CisJCQl0dmFsLnR2X3NlYyA9IDA7CisJCQl0dmFsLnR2X3VzZWMgPSAyNTAwMDA7CS8qIC4yNSBzZWMgKi8KKwkJCXNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHZhbCk7CisJCX0KKworCQlpZiAoX2V4aXRfbm93KQkvKiBDaGlsZCBoYXMgc2lnbmFsZWQgaXQgaXMgb2sgLSB3ZSBjYW4gZXhpdCBub3cgKi8KKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworCQkvKiBQcm9ibGVtIHdpdGggY2hpbGQuICBEZXRlcm1pbmUgd2hhdCBpdCBpcyBieSBleGl0IGNvZGUgKi8KKwkJc3dpdGNoIChXRVhJVFNUQVRVUyhjaGlsZF9zdGF0dXMpKSB7CisJCWNhc2UgRVhJVF9ERVNDX0NMT1NFX0ZBSUxVUkU6CisJCWNhc2UgRVhJVF9ERVNDX09QRU5fRkFJTFVSRToKKwkJY2FzZSBFWElUX0ZJRk9fRkFJTFVSRToKKwkJY2FzZSBFWElUX0NIRElSX0ZBSUxVUkU6CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNoaWxkIGV4aXRlZCB3aXRoIGNvZGUgJWRcbiIsIFdFWElUU1RBVFVTKGNoaWxkX3N0YXR1cykpOworCQkJYnJlYWs7CisJCX0KKworCQlleGl0KFdFWElUU1RBVFVTKGNoaWxkX3N0YXR1cykpOworCX0KKworCWlmIChjaGRpcigiLyIpKQorCQlleGl0KEVYSVRfQ0hESVJfRkFJTFVSRSk7CisKKwlpZiAoZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybGltKSA8IDApCisJCWZkID0gMjU2OwkvKiBqdXN0IGhhdmUgdG8gZ3Vlc3MgKi8KKwllbHNlCisJCWZkID0gcmxpbS5ybGltX2N1cjsKKworCWZvciAoLS1mZDsgZmQgPj0gMDsgZmQtLSkgeworI2lmZGVmIF9fbGludXhfXworCQkvKiBEbyBub3QgY2xvc2UgZmRzIHByZWxvYWRlZCBieSBzeXN0ZW1kISAqLworCQlpZiAoX3N5c3RlbWRfYWN0aXZhdGlvbiAmJgorCQkgICAgKGZkID09IFNEX0ZEX0ZJRk9fU0VSVkVSIHx8IGZkID09IFNEX0ZEX0ZJRk9fQ0xJRU5UKSkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCSh2b2lkKSBjbG9zZShmZCk7CisJfQorCisJaWYgKChvcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSkgPCAwKSB8fAorCSAgICAob3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpIDwgMCkgfHwKKwkgICAgKG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKSA8IDApKQorCQlleGl0KEVYSVRfREVTQ19PUEVOX0ZBSUxVUkUpOworCisJc2V0c2lkKCk7Cit9CisKK3N0YXRpYyBpbnQgX3JlaW5zdGF0ZV9yZWdpc3RyYXRpb25zKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX2ZhaWxlZF9wYXJzaW5nX21zZ1tdID0gIkZhaWxlZCB0byBwYXJzZSBleGlzdGluZyBldmVudCByZWdpc3RyYXRpb24uXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpfZGVsaW0gPSAiICI7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlIG1zZyA9IHsgMCB9OworCWNoYXIgKmVuZHAsICpkc29fbmFtZSwgKmRldl9uYW1lLCAqbWFzaywgKnRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBtYXNrX3ZhbHVlLCB0aW1lb3V0X3ZhbHVlOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBkYWVtb25fdGFsayhmaWZvcywgJm1zZywgRE1fRVZFTlRfQ01EX0hFTExPLCBOVUxMLCBOVUxMLCAwLCAwKTsKKwlkbV9mcmVlKG1zZy5kYXRhKTsKKwltc2cuZGF0YSA9IE5VTEw7CisKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbW11bmljYXRlIHdpdGggbmV3IGluc3RhbmNlIG9mIGRtZXZlbnRkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IF9pbml0aWFsX3JlZ2lzdHJhdGlvbnNbaV07ICsraSkgeworCQlpZiAoIShzdHJ0b2soX2luaXRpYWxfcmVnaXN0cmF0aW9uc1tpXSwgX2RlbGltKSkgfHwKKwkJICAgICEoZHNvX25hbWUgPSBzdHJ0b2soTlVMTCwgX2RlbGltKSkgfHwKKwkJICAgICEoZGV2X25hbWUgPSBzdHJ0b2soTlVMTCwgX2RlbGltKSkgfHwKKwkJICAgICEobWFzayA9IHN0cnRvayhOVUxMLCBfZGVsaW0pKSB8fAorCQkgICAgISh0aW1lb3V0ID0gc3RydG9rKE5VTEwsIF9kZWxpbSkpKSB7CisJCQlmcHV0cyhfZmFpbGVkX3BhcnNpbmdfbXNnLCBzdGRlcnIpOworCQkJY29udGludWU7CisJCX0KKworCQllcnJubyA9IDA7CisJCW1hc2tfdmFsdWUgPSBzdHJ0b3VsKG1hc2ssICZlbmRwLCAxMCk7CisJCWlmIChlcnJubyB8fCAhZW5kcCB8fCAqZW5kcCkgeworCQkJZnB1dHMoX2ZhaWxlZF9wYXJzaW5nX21zZywgc3RkZXJyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJybm8gPSAwOworCQl0aW1lb3V0X3ZhbHVlID0gc3RydG91bCh0aW1lb3V0LCAmZW5kcCwgMTApOworCQlpZiAoZXJybm8gfHwgIWVuZHAgfHwgKmVuZHApIHsKKwkJCWZwdXRzKF9mYWlsZWRfcGFyc2luZ19tc2csIHN0ZGVycik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkYWVtb25fdGFsayhmaWZvcywgJm1zZywgRE1fRVZFTlRfQ01EX1JFR0lTVEVSX0ZPUl9FVkVOVCwKKwkJCQlkc29fbmFtZSwKKwkJCQlkZXZfbmFtZSwKKwkJCQkoZW51bSBkbV9ldmVudF9tYXNrKSBtYXNrX3ZhbHVlLAorCQkJCXRpbWVvdXRfdmFsdWUpKQorCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVpbnN0YXRlIG1vbml0b3JpbmcgZm9yIGRldmljZSAlcy5cbiIsIGRldl9uYW1lKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3Jlc3RhcnRfZG1ldmVudGQodm9pZCkKK3sKKwlzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgZmlmb3MgPSB7CisJCS5zZXJ2ZXIgPSAtMSwKKwkJLmNsaWVudCA9IC0xLAorCQkvKiBGSVhNRSBNYWtlIHRoZXNlIGVpdGhlciBjb25maWd1cmFibGUgb3IgZGVwZW5kIGRpcmVjdGx5IG9uIGRtZXZlbnRkX3BhdGggKi8KKwkJLmNsaWVudF9wYXRoID0gRE1fRVZFTlRfRklGT19DTElFTlQsCisJCS5zZXJ2ZXJfcGF0aCA9IERNX0VWRU5UX0ZJRk9fU0VSVkVSCisJfTsKKwlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgbXNnID0geyAwIH07CisJaW50IGksIGNvdW50ID0gMDsKKwljaGFyICptZXNzYWdlOworCWludCB2ZXJzaW9uOworCWNvbnN0IGNoYXIgKmU7CisKKwkvKiBHZXQgdGhlIGxpc3Qgb2YgcmVnaXN0cmF0aW9ucyBmcm9tIHRoZSBydW5uaW5nIGRhZW1vbi4gKi8KKwlpZiAoIWluaXRfZmlmb3MoJmZpZm9zKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IENvdWxkIG5vdCBpbml0aWF0ZSBjb21tdW5pY2F0aW9uIHdpdGggZXhpc3RpbmcgZG1ldmVudGQuXG4iKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWlmICghZG1fZXZlbnRfZ2V0X3ZlcnNpb24oJmZpZm9zLCAmdmVyc2lvbikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBDb3VsZCBub3QgY29tbXVuaWNhdGUgd2l0aCBleGlzdGluZyBkbWV2ZW50ZC5cbiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAodmVyc2lvbiA8IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBUaGUgcnVubmluZyBkbWV2ZW50ZCBpbnN0YW5jZSBpcyB0b28gb2xkLlxuIgorCQkJCSJQcm90b2NvbCB2ZXJzaW9uICVkIChyZXF1aXJlZDogMSkuIEFjdGlvbiBjYW5jZWxsZWQuXG4iLAorCQkJCXZlcnNpb24pOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoZGFlbW9uX3RhbGsoJmZpZm9zLCAmbXNnLCBETV9FVkVOVF9DTURfR0VUX1NUQVRVUywgIi0iLCAiLSIsIDAsIDApKQorCQlnb3RvIGJhZDsKKworCW1lc3NhZ2UgPSBzdHJjaHIobXNnLmRhdGEsICcgJykgKyAxOworCWZvciAoaSA9IDA7IG1zZy5kYXRhW2ldOyArK2kpCisJCWlmIChtc2cuZGF0YVtpXSA9PSAnOycpIHsKKwkJCW1zZy5kYXRhW2ldID0gMDsKKwkJCSsrY291bnQ7CisJCX0KKworCWlmICghKF9pbml0aWFsX3JlZ2lzdHJhdGlvbnMgPSBkbV9tYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIChjb3VudCArIDEpKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJNZW1vcnkgYWxsb2NhdGlvbiByZWdpc3RyYXRpb24gZmFpbGVkLlxuIik7CisJCWdvdG8gYmFkOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCWlmICghKF9pbml0aWFsX3JlZ2lzdHJhdGlvbnNbaV0gPSBkbV9zdHJkdXAobWVzc2FnZSkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk1lbW9yeSBhbGxvY2F0aW9uIGZvciBtZXNzYWdlIGZhaWxlZC5cbiIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJbWVzc2FnZSArPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCX0KKwlfaW5pdGlhbF9yZWdpc3RyYXRpb25zW2NvdW50XSA9IE5VTEw7CisKKwlpZiAodmVyc2lvbiA+PSAyKSB7CisJCWlmIChkYWVtb25fdGFsaygmZmlmb3MsICZtc2csIERNX0VWRU5UX0NNRF9HRVRfUEFSQU1FVEVSUywgIi0iLCAiLSIsIDAsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhY3F1aXJlIHBhcmFtZXRlcnMgZnJvbSBvbGQgZG1ldmVudGQuXG4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmIChzdHJzdHIobXNnLmRhdGEsICJleGVjX21ldGhvZD1zeXN0ZW1kIikpCisJCQlfc3lzdGVtZF9hY3RpdmF0aW9uID0gMTsKKwl9CisjaWZkZWYgX19saW51eF9fCisJLyoKKwkqIElmIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGlzIG9sZCwganVzdCBhc3N1bWUgdGhhdCBpZiBzeXN0ZW1kIGlzIHJ1bm5pbmcsCisJKiB0aGUgZG1ldmVudGQgaXMgYWxzbyBydW4gYXMgYSBzeXN0ZW1kIHNlcnZpY2UgdmlhIGZpZm8gYWN0aXZhdGlvbi4KKwkqLworCWlmICh2ZXJzaW9uIDwgMikgeworCQkvKiBUaGlzIGNoZWNrIGlzIGNvcGllZCBmcm9tIHNkLWRhZW1vbi5jLiAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKCFsc3RhdChTRF9SVU5USU1FX1VOSVRfRklMRV9ESVIsICZzdCkgJiYgISFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJX3N5c3RlbWRfYWN0aXZhdGlvbiA9IDE7CisJfQorI2VuZGlmCisKKwlpZiAoZGFlbW9uX3RhbGsoJmZpZm9zLCAmbXNnLCBETV9FVkVOVF9DTURfRElFLCAiLSIsICItIiwgMCwgMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJPbGQgZG1ldmVudGQgcmVmdXNlZCB0byBkaWUuXG4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFfc3lzdGVtZF9hY3RpdmF0aW9uICYmCisJICAgICgoZSA9IGdldGVudihTRF9BQ1RJVkFUSU9OX0VOVl9WQVJfTkFNRSkpICYmIHN0cmNtcChlLCAiMSIpKSkKKwkJX3N5c3RlbWRfYWN0aXZhdGlvbiA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgeworCQlpZiAoKGFjY2VzcyhETUVWRU5URF9QSURGSUxFLCBGX09LKSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpCisJCQlicmVhazsKKwkJdXNsZWVwKDEwKTsKKwl9CisKKwlpZiAoIV9zeXN0ZW1kX2FjdGl2YXRpb24pIHsKKwkJZmluaV9maWZvcygmZmlmb3MpOworCQlyZXR1cm47CisJfQorCisJLyogUmVvcGVuIGZpZm9zLiAqLworCWZpbmlfZmlmb3MoJmZpZm9zKTsKKwlpZiAoIWluaXRfZmlmb3MoJmZpZm9zKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBpbml0aWF0ZSBjb21tdW5pY2F0aW9uIHdpdGggbmV3IGluc3RhbmNlIG9mIGRtZXZlbnRkLlxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoIV9yZWluc3RhdGVfcmVnaXN0cmF0aW9ucygmZmlmb3MpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlaW5zdGF0ZSBtb25pdG9yaW5nIHdpdGggbmV3IGluc3RhbmNlIG9mIGRtZXZlbnRkLlxuIik7CisJCWdvdG8gYmFkOworCX0KKworCWZpbmlfZmlmb3MoJmZpZm9zKTsKKwlleGl0KEVYSVRfU1VDQ0VTUyk7CitiYWQ6CisJZmluaV9maWZvcygmZmlmb3MpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgX3VzYWdlKGNoYXIgKnByb2csIEZJTEUgKmZpbGUpCit7CisJZnByaW50ZihmaWxlLCAiVXNhZ2U6XG4iCisJCSIlcyBbLWQgWy1kIFstZF1dXSBbLWZdIFstaF0gWy1sXSBbLVJdIFstVl0gWy0/XVxuXG4iCisJCSIgICAtZCAgICAgICBMb2cgZGVidWcgbWVzc2FnZXMgdG8gc3lzbG9nICgtZCwgLWRkLCAtZGRkKVxuIgorCQkiICAgLWYgICAgICAgRG9uJ3QgZm9yaywgcnVuIGluIHRoZSBmb3JlZ3JvdW5kXG4iCisJCSIgICAtaCAgICAgICBTaG93IHRoaXMgaGVscCBpbmZvcm1hdGlvblxuIgorCQkiICAgLWwgICAgICAgTG9nIHRvIHN0ZG91dCxzdGRlcnIgaW5zdGVhZCBvZiBzeXNsb2dcbiIKKwkJIiAgIC0/ICAgICAgIFNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uIG9uIHN0ZGVyclxuIgorCQkiICAgLVIgICAgICAgUmVzdGFydCBkbWV2ZW50ZFxuIgorCQkiICAgLVYgICAgICAgU2hvdyB2ZXJzaW9uIG9mIGRtZXZlbnRkXG5cbiIsIHByb2cpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXNpZ25lZCBjaGFyIG9wdDsKKwlzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgZmlmb3MgPSB7CisJCS5jbGllbnQgPSAtMSwKKwkJLnNlcnZlciA9IC0xLAorCQkuY2xpZW50X3BhdGggPSBETV9FVkVOVF9GSUZPX0NMSUVOVCwKKwkJLnNlcnZlcl9wYXRoID0gRE1fRVZFTlRfRklGT19TRVJWRVIKKwl9OworCXRpbWVfdCBub3csIGlkbGVfZXhpdF90aW1lb3V0ID0gRE1FVkVOVERfSURMRV9FWElUX1RJTUVPVVQ7CisJb3B0ZXJyID0gMDsKKwlvcHRpbmQgPSAwOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIj9maFZkbFIiKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2gnOgorCQkJX3VzYWdlKGFyZ3ZbMF0sIHN0ZG91dCk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJz8nOgorCQkJX3VzYWdlKGFyZ3ZbMF0sIHN0ZGVycik7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJ1InOgorCQkJX3Jlc3RhcnQrKzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCV9mb3JlZ3JvdW5kKys7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlfZGVidWdfbGV2ZWwrKzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCV91c2Vfc3lzbG9nID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50ZigiZG1ldmVudGQgdmVyc2lvbjogJXNcbiIsIERNX0xJQl9WRVJTSU9OKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KKworCWlmICghX2ZvcmVncm91bmQgJiYgIV91c2Vfc3lzbG9nKSB7CisJCXByaW50ZigiV0FSTklORzogSWdub3JpbmcgbG9nZ2luZyB0byBzdGRvdXQsIG5lZWRzIG9wdGlvbnMgLWZcbiIpOworCQlfdXNlX3N5c2xvZyA9IDE7CisJfQorCS8qCisJICogU3dpdGNoIHRvIEMgbG9jYWxlIHRvIGF2b2lkIHJlYWRpbmcgbGFyZ2UgbG9jYWxlLWFyY2hpdmUgZmlsZQorCSAqIHVzZWQgYnkgc29tZSBnbGliYyAob24gc29tZSBkaXN0cmlidXRpb25zIGl0IHRha2VzIG92ZXIgMTAwTUIpLgorCSAqIERhZW1vbiBjdXJyZW50bHkgbmVlZHMgdG8gdXNlIG1sb2NrYWxsKCkuCisJICovCisJaWYgKHNldGVudigiTENfQUxMIiwgIkMiLCAxKSkKKwkJcGVycm9yKCJDYW5ub3Qgc2V0IExDX0FMTCB0byBDIik7CisKKwlpZiAoX3Jlc3RhcnQpCisJCV9yZXN0YXJ0X2RtZXZlbnRkKCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKwlfc3lzdGVtZF9hY3RpdmF0aW9uID0gX3N5c3RlbWRfaGFuZG92ZXIoJmZpZm9zKTsKKyNlbmRpZgorCisJaWYgKCFfZm9yZWdyb3VuZCkKKwkJX2RhZW1vbml6ZSgpOworCisJaWYgKF91c2Vfc3lzbG9nKQorCQlvcGVubG9nKCJkbWV2ZW50ZCIsIExPR19QSUQsIExPR19EQUVNT04pOworCisJZG1fZXZlbnRfbG9nX3NldChfZGVidWdfbGV2ZWwsIF91c2Vfc3lzbG9nKTsKKwlkbV9sb2dfaW5pdChfZG1ldmVudGRfbG9nKTsKKworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChETUVWRU5URF9QSURGSUxFLCBTX0lGUkVHKTsKKwlpZiAoZG1fY3JlYXRlX2xvY2tmaWxlKERNRVZFTlREX1BJREZJTEUpID09IDApCisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKworCWF0ZXhpdChfcmVtb3ZlX2ZpbGVzX29uX2V4aXQpOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKworCS8qIFNldCB0aGUgcmVzdCBvZiB0aGUgc2lnbmFscyB0byBjYXVzZSAnX2V4aXRfbm93JyB0byBiZSBzZXQgKi8KKwlzaWduYWwoU0lHVEVSTSwgJl9leGl0X2hhbmRsZXIpOworCXNpZ25hbChTSUdJTlQsICZfZXhpdF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHSFVQLCAmX2V4aXRfaGFuZGxlcik7CisJc2lnbmFsKFNJR1FVSVQsICZfZXhpdF9oYW5kbGVyKTsKKworI2lmZGVmIF9fbGludXhfXworCS8qIFN5c3RlbWQgaGFzIGFkanVzdGVkIG9vbSBraWxsZXIgZm9yIHVzIGFscmVhZHkgKi8KKwlpZiAoIV9zeXN0ZW1kX2FjdGl2YXRpb24gJiYgIV9wcm90ZWN0X2FnYWluc3Rfb29tX2tpbGxlcigpKQorCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHByb3RlY3QgYWdhaW5zdCBPT00ga2lsbGVyLiIpOworI2VuZGlmCisKKwlfaW5pdF90aHJlYWRfc2lnbmFscygpOworCisJcHRocmVhZF9tdXRleF9pbml0KCZfZ2xvYmFsX211dGV4LCBOVUxMKTsKKworCWlmICghX3N5c3RlbWRfYWN0aXZhdGlvbiAmJiAhX29wZW5fZmlmb3MoJmZpZm9zKSkKKwkJZXhpdChFWElUX0ZJRk9fRkFJTFVSRSk7CisKKwkvKiBTaWduYWwgcGFyZW50LCBsZXR0aW5nIHRoZW0ga25vdyB3ZSBhcmUgcmVhZHkgdG8gZ28uICovCisJaWYgKCFfZm9yZWdyb3VuZCkKKwkJa2lsbChnZXRwcGlkKCksIFNJR1RFUk0pOworCisJbG9nX25vdGljZSgiZG1ldmVudGQgcmVhZHkgZm9yIHByb2Nlc3NpbmcuIik7CisKKwlfaWRsZV9zaW5jZSA9IHRpbWUoTlVMTCk7CisKKwlpZiAoX2luaXRpYWxfcmVnaXN0cmF0aW9ucykKKwkJX3Byb2Nlc3NfaW5pdGlhbF9yZWdpc3RyYXRpb25zKCk7CisKKwlmb3IgKDs7KSB7CisJCWlmIChfaWRsZV9zaW5jZSkgeworCQkJaWYgKF9leGl0X25vdykgeworCQkJCWxvZ19pbmZvKCJkbWV2ZW50ZCBkZXRlY3RlZCBicmVhayB3aGlsZSBiZWluZyBpZGxlICIKKwkJCQkJICJmb3IgJWxkIHNlY29uZChzKSwgZXhpdGluZy4iLAorCQkJCQkgKGxvbmcpICh0aW1lKE5VTEwpIC0gX2lkbGVfc2luY2UpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoaWRsZV9leGl0X3RpbWVvdXQpIHsKKwkJCQlub3cgPSB0aW1lKE5VTEwpOworCQkJCWlmIChub3cgPCBfaWRsZV9zaW5jZSkKKwkJCQkJX2lkbGVfc2luY2UgPSBub3c7IC8qIGNsb2NrIGNoYW5nZT8gKi8KKwkJCQlub3cgLT0gX2lkbGVfc2luY2U7CisJCQkJaWYgKG5vdyA+PSBpZGxlX2V4aXRfdGltZW91dCkgeworCQkJCQlsb2dfaW5mbygiZG1ldmVudGQgd2FzIGlkbGUgZm9yICVsZCBzZWNvbmQocyksICIKKwkJCQkJCSAiZXhpdGluZy4iLCAobG9uZykgbm93KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKF9leGl0X25vdykgeworCQkJX2V4aXRfbm93ID0gMDsKKwkJCS8qCisJCQkgKiBXaGVuICdfZXhpdF9ub3cnIGlzIHNldCwgc2lnbmFsIGhhcyBiZWVuIHJlY2VpdmVkLAorCQkJICogYnV0IGNhbiBub3Qgc2ltcGx5IGV4aXQgdW5sZXNzIGFsbAorCQkJICogdGhyZWFkcyBhcmUgZG9uZSBwcm9jZXNzaW5nLgorCQkJICovCisJCQlsb2dfd2FybigiV0FSTklORzogVGhlcmUgYXJlIHN0aWxsIGRldmljZXMgYmVpbmcgbW9uaXRvcmVkLiIpOworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFJlZnVzaW5nIHRvIGV4aXQuIik7CisJCX0KKwkJX3Byb2Nlc3NfcmVxdWVzdCgmZmlmb3MpOworCQlfY2xlYW51cF91bnVzZWRfdGhyZWFkcygpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX2dsb2JhbF9tdXRleCk7CisKKwlsb2dfbm90aWNlKCJkbWV2ZW50ZCBzaHV0dGluZyBkb3duLiIpOworCisJaWYgKGZpZm9zLmNsaWVudCA+PSAwICYmIGNsb3NlKGZpZm9zLmNsaWVudCkpCisJCWxvZ19zeXNfZXJyb3IoImNsaWVudCBjbG9zZSIsIGZpZm9zLmNsaWVudF9wYXRoKTsKKwlpZiAoZmlmb3Muc2VydmVyID49IDAgJiYgY2xvc2UoZmlmb3Muc2VydmVyKSkKKwkJbG9nX3N5c19lcnJvcigic2VydmVyIGNsb3NlIiwgZmlmb3Muc2VydmVyX3BhdGgpOworCisJaWYgKF91c2Vfc3lzbG9nKQorCQljbG9zZWxvZygpOworCisJX2V4aXRfZG1fbGliKCk7CisKKwlleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL2RtZXZlbnRkLmggYi9kYWVtb25zL2RtZXZlbnRkL2RtZXZlbnRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlMGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvZG1ldmVudGQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9fRE1FVkVOVERfRE9UX0hfXworI2RlZmluZSBfX0RNRVZFTlREX0RPVF9IX18KKworLyogRklYTUUgVGhpcyBzdHVmZiBtdXN0IGJlIGNvbmZpZ3VyYWJsZS4gKi8KKworI2RlZmluZQlETV9FVkVOVF9GSUZPX0NMSUVOVAlERUZBVUxUX0RNX1JVTl9ESVIgIi9kbWV2ZW50ZC1jbGllbnQiCisjZGVmaW5lCURNX0VWRU5UX0ZJRk9fU0VSVkVSCURFRkFVTFRfRE1fUlVOX0RJUiAiL2RtZXZlbnRkLXNlcnZlciIKKworI2RlZmluZSBETV9FVkVOVF9ERUZBVUxUX1RJTUVPVVQgMTAKKworLyogQ29tbWFuZHMgZm9yIHRoZSBkYWVtb24gcGFzc2VkIGluIHRoZSBtZXNzYWdlIGJlbG93LiAqLworZW51bSBkbV9ldmVudF9jb21tYW5kIHsKKwlETV9FVkVOVF9DTURfQUNUSVZFID0gMSwKKwlETV9FVkVOVF9DTURfUkVHSVNURVJfRk9SX0VWRU5ULAorCURNX0VWRU5UX0NNRF9VTlJFR0lTVEVSX0ZPUl9FVkVOVCwKKwlETV9FVkVOVF9DTURfR0VUX1JFR0lTVEVSRURfREVWSUNFLAorCURNX0VWRU5UX0NNRF9HRVRfTkVYVF9SRUdJU1RFUkVEX0RFVklDRSwKKwlETV9FVkVOVF9DTURfU0VUX1RJTUVPVVQsCisJRE1fRVZFTlRfQ01EX0dFVF9USU1FT1VULAorCURNX0VWRU5UX0NNRF9IRUxMTywKKwlETV9FVkVOVF9DTURfRElFLAorCURNX0VWRU5UX0NNRF9HRVRfU1RBVFVTLAorCURNX0VWRU5UX0NNRF9HRVRfUEFSQU1FVEVSUywKK307CisKKy8qIE1lc3NhZ2UgcGFzc2VkIGJldHdlZW4gY2xpZW50IGFuZCBkYWVtb24uICovCitzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgeworCXVpbnQzMl90IGNtZDsKKwl1aW50MzJfdCBzaXplOworCWNoYXIgKmRhdGE7Cit9OworCisvKiBGSVhNRSBJcyB0aGlzIG1lYW50IHRvIGJlIGV4cG9ydGVkPyAgSSBjYW4ndCBzZWUgd2hlcmUgdGhlCisgICBpbnRlcmZhY2UgdXNlcyBpdC4gKi8KKy8qIEZpZm9zIGZvciBjbGllbnQvZGFlbW9uIGNvbW11bmljYXRpb24uICovCitzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgeworCWludCBjbGllbnQ7CisJaW50IHNlcnZlcjsKKwljb25zdCBjaGFyICpjbGllbnRfcGF0aDsKKwljb25zdCBjaGFyICpzZXJ2ZXJfcGF0aDsKK307CisKKy8qICAgICAgRVhJVF9TVUNDRVNTICAgICAgICAgICAgIDAgLS0gc3RkbGliLmggKi8KKy8qICAgICAgRVhJVF9GQUlMVVJFICAgICAgICAgICAgIDEgLS0gc3RkbGliLmggKi8KKy8qICAgICAgRVhJVF9MT0NLRklMRV9JTlVTRSAgICAgIDIgLS0gb2Jzb2xldGVkICovCisjZGVmaW5lIEVYSVRfREVTQ19DTE9TRV9GQUlMVVJFICAzCisjZGVmaW5lIEVYSVRfREVTQ19PUEVOX0ZBSUxVUkUgICA0CisvKiAgICAgIEVYSVRfT1BFTl9QSURfRkFJTFVSRSAgICA1IC0tIG9ic29sZXRlZCAqLworI2RlZmluZSBFWElUX0ZJRk9fRkFJTFVSRSAgICAgICAgNgorI2RlZmluZSBFWElUX0NIRElSX0ZBSUxVUkUgICAgICAgNworCisvKiBJbXBsZW1lbnRlZCBpbiBsaWJkZXZtYXBwZXItZXZlbnQuYywgYnV0IG5vdCBwYXJ0IG9mIHB1YmxpYyBBUEkuICovCisvLyBGSVhNRSAgbWlzdXNlIG9mIGJpdG1hc2sgYXMgZW51bQoraW50IGRhZW1vbl90YWxrKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MsCisJCXN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnLCBpbnQgY21kLAorCQljb25zdCBjaGFyICpkc29fbmFtZSwgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCWVudW0gZG1fZXZlbnRfbWFzayBldm1hc2ssIHVpbnQzMl90IHRpbWVvdXQpOworaW50IGluaXRfZmlmb3Moc3RydWN0IGRtX2V2ZW50X2ZpZm9zICpmaWZvcyk7Cit2b2lkIGZpbmlfZmlmb3Moc3RydWN0IGRtX2V2ZW50X2ZpZm9zICpmaWZvcyk7CitpbnQgZG1fZXZlbnRfZ2V0X3ZlcnNpb24oc3RydWN0IGRtX2V2ZW50X2ZpZm9zICpmaWZvcywgaW50ICp2ZXJzaW9uKTsKKworI2VuZGlmIC8qIF9fRE1FVkVOVERfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQuYyBiL2RhZW1vbnMvZG1ldmVudGQvbGliZGV2bWFwcGVyLWV2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5NWVkMwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvbGliZGV2bWFwcGVyLWV2ZW50LmMKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbS1sb2dnaW5nLmgiCisjaW5jbHVkZSAiZG1saWIuaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKyNpbmNsdWRlICJkbWV2ZW50ZC5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4JCS8qIGZvciBodG9ubCwgbnRvaGwgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisKK3N0YXRpYyBpbnQgX2RlYnVnX2xldmVsID0gMDsKK3N0YXRpYyBpbnQgX3VzZV9zeXNsb2cgPSAwOworc3RhdGljIGludCBfc2VxdWVuY2VfbnIgPSAwOworCitzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciB7CisJY2hhciAqZHNvOworCisJY2hhciAqZG1ldmVudGRfcGF0aDsKKworCWNoYXIgKmRldl9uYW1lOworCisJY2hhciAqdXVpZDsKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCXVpbnQzMl90IHRpbWVvdXQ7CisKKwllbnVtIGRtX2V2ZW50X21hc2sgbWFzazsKK307CisKK3N0YXRpYyB2b2lkIF9kbV9ldmVudF9oYW5kbGVyX2NsZWFyX2Rldl9pbmZvKHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlkbV9mcmVlKGRtZXZoLT5kZXZfbmFtZSk7CisJZG1fZnJlZShkbWV2aC0+dXVpZCk7CisJZG1ldmgtPmRldl9uYW1lID0gZG1ldmgtPnV1aWQgPSBOVUxMOworCWRtZXZoLT5tYWpvciA9IGRtZXZoLT5taW5vciA9IDA7Cit9CisKK3N0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbV9ldmVudF9oYW5kbGVyX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aDsKKworCWlmICghKGRtZXZoID0gZG1femFsbG9jKHNpemVvZigqZG1ldmgpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXZlbnQgaGFuZGxlci4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRtZXZoOworfQorCit2b2lkIGRtX2V2ZW50X2hhbmRsZXJfZGVzdHJveShzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpCit7CisJX2RtX2V2ZW50X2hhbmRsZXJfY2xlYXJfZGV2X2luZm8oZG1ldmgpOworCWRtX2ZyZWUoZG1ldmgtPmRzbyk7CisJZG1fZnJlZShkbWV2aC0+ZG1ldmVudGRfcGF0aCk7CisJZG1fZnJlZShkbWV2aCk7Cit9CisKK2ludCBkbV9ldmVudF9oYW5kbGVyX3NldF9kbWV2ZW50ZF9wYXRoKHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCwgY29uc3QgY2hhciAqZG1ldmVudGRfcGF0aCkKK3sKKwlpZiAoIWRtZXZlbnRkX3BhdGgpIC8qIG5vb3AgKi8KKwkJcmV0dXJuIDA7CisKKwlkbV9mcmVlKGRtZXZoLT5kbWV2ZW50ZF9wYXRoKTsKKworCWlmICghKGRtZXZoLT5kbWV2ZW50ZF9wYXRoID0gZG1fc3RyZHVwKGRtZXZlbnRkX3BhdGgpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2V2ZW50X2hhbmRsZXJfc2V0X2RzbyhzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKCFwYXRoKSAvKiBub29wICovCisJCXJldHVybiAwOworCisJZG1fZnJlZShkbWV2aC0+ZHNvKTsKKworCWlmICghKGRtZXZoLT5kc28gPSBkbV9zdHJkdXAocGF0aCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fZXZlbnRfaGFuZGxlcl9zZXRfZGV2X25hbWUoc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoLCBjb25zdCBjaGFyICpkZXZfbmFtZSkKK3sKKwlpZiAoIWRldl9uYW1lKQorCQlyZXR1cm4gMDsKKworCV9kbV9ldmVudF9oYW5kbGVyX2NsZWFyX2Rldl9pbmZvKGRtZXZoKTsKKworCWlmICghKGRtZXZoLT5kZXZfbmFtZSA9IGRtX3N0cmR1cChkZXZfbmFtZSkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fZXZlbnRfaGFuZGxlcl9zZXRfdXVpZChzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGNvbnN0IGNoYXIgKnV1aWQpCit7CisJaWYgKCF1dWlkKQorCQlyZXR1cm4gMDsKKworCV9kbV9ldmVudF9oYW5kbGVyX2NsZWFyX2Rldl9pbmZvKGRtZXZoKTsKKworCWlmICghKGRtZXZoLT51dWlkID0gZG1fc3RyZHVwKHV1aWQpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkbV9ldmVudF9oYW5kbGVyX3NldF9tYWpvcihzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCBtYWpvcikKK3sKKwlpbnQgbWlub3IgPSBkbWV2aC0+bWlub3I7CisKKwlfZG1fZXZlbnRfaGFuZGxlcl9jbGVhcl9kZXZfaW5mbyhkbWV2aCk7CisKKwlkbWV2aC0+bWFqb3IgPSBtYWpvcjsKKwlkbWV2aC0+bWlub3IgPSBtaW5vcjsKK30KKwordm9pZCBkbV9ldmVudF9oYW5kbGVyX3NldF9taW5vcihzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCBtaW5vcikKK3sKKwlpbnQgbWFqb3IgPSBkbWV2aC0+bWFqb3I7CisKKwlfZG1fZXZlbnRfaGFuZGxlcl9jbGVhcl9kZXZfaW5mbyhkbWV2aCk7CisKKwlkbWV2aC0+bWFqb3IgPSBtYWpvcjsKKwlkbWV2aC0+bWlub3IgPSBtaW5vcjsKK30KKwordm9pZCBkbV9ldmVudF9oYW5kbGVyX3NldF9ldmVudF9tYXNrKHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCwKKwkJCQkgICAgIGVudW0gZG1fZXZlbnRfbWFzayBldm1hc2spCit7CisJZG1ldmgtPm1hc2sgPSBldm1hc2s7Cit9CisKK3ZvaWQgZG1fZXZlbnRfaGFuZGxlcl9zZXRfdGltZW91dChzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCB0aW1lb3V0KQoreworCWRtZXZoLT50aW1lb3V0ID0gdGltZW91dDsKK30KKworY29uc3QgY2hhciAqZG1fZXZlbnRfaGFuZGxlcl9nZXRfZHNvKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlyZXR1cm4gZG1ldmgtPmRzbzsKK30KKworY29uc3QgY2hhciAqZG1fZXZlbnRfaGFuZGxlcl9nZXRfZGV2X25hbWUoY29uc3Qgc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoKQoreworCXJldHVybiBkbWV2aC0+ZGV2X25hbWU7Cit9CisKK2NvbnN0IGNoYXIgKmRtX2V2ZW50X2hhbmRsZXJfZ2V0X3V1aWQoY29uc3Qgc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoKQoreworCXJldHVybiBkbWV2aC0+dXVpZDsKK30KKworaW50IGRtX2V2ZW50X2hhbmRsZXJfZ2V0X21ham9yKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlyZXR1cm4gZG1ldmgtPm1ham9yOworfQorCitpbnQgZG1fZXZlbnRfaGFuZGxlcl9nZXRfbWlub3IoY29uc3Qgc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoKQoreworCXJldHVybiBkbWV2aC0+bWlub3I7Cit9CisKK2ludCBkbV9ldmVudF9oYW5kbGVyX2dldF90aW1lb3V0KGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlyZXR1cm4gZG1ldmgtPnRpbWVvdXQ7Cit9CisKK2VudW0gZG1fZXZlbnRfbWFzayBkbV9ldmVudF9oYW5kbGVyX2dldF9ldmVudF9tYXNrKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlyZXR1cm4gZG1ldmgtPm1hc2s7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX21lc3NhZ2VfaWQoc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cpCit7CisJaW50IHBpZCwgc2VxX25yOworCisJaWYgKChzc2NhbmYobXNnLT5kYXRhLCAiJWQ6JWQiLCAmcGlkLCAmc2VxX25yKSAhPSAyKSB8fAorCSAgICAocGlkICE9IGdldHBpZCgpKSB8fCAoc2VxX25yICE9IF9zZXF1ZW5jZV9ucikpIHsKKwkJbG9nX2Vycm9yKCJJZ25vcmluZyBvdXQtb2Ytc2VxdWVuY2UgcmVwbHkgZnJvbSBkbWV2ZW50ZC4gIgorCQkJICAiRXhwZWN0ZWQgJWQ6JWQgYnV0IHJlY2VpdmVkICVzLiIsIGdldHBpZCgpLAorCQkJICBfc2VxdWVuY2VfbnIsIG1zZy0+ZGF0YSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogZGFlbW9uX3JlYWQKKyAqIEBmaWZvcworICogQG1zZworICoKKyAqIFJlYWQgbWVzc2FnZSBmcm9tIGRhZW1vbi4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIGZhaWx1cmUsIDEgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IF9kYWVtb25fcmVhZChzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgKmZpZm9zLAorCQkJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlICptc2cpCit7CisJdW5zaWduZWQgYnl0ZXMgPSAwOworCWludCByZXQsIGk7CisJZmRfc2V0IGZkczsKKwlzaXplX3Qgc2l6ZSA9IDIgKiBzaXplb2YodWludDMyX3QpOwkvKiBzdGF0dXMgKyBzaXplICovCisJdWludDMyX3QgKmhlYWRlciA9IGFsbG9jYShzaXplKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWhlYWRlcjsKKworCXdoaWxlIChieXRlcyA8IHNpemUpIHsKKwkJZm9yIChpID0gMCwgcmV0ID0gMDsgKGkgPCAyMCkgJiYgKHJldCA8IDEpOyBpKyspIHsKKwkJCS8qIFdhdGNoIGRhZW1vbiByZWFkIEZJRk8gZm9yIGlucHV0LiAqLworCQkJc3RydWN0IHRpbWV2YWwgdHZhbCA9IHsgLnR2X3NlYyA9IDEgfTsKKwkJCUZEX1pFUk8oJmZkcyk7CisJCQlGRF9TRVQoZmlmb3MtPnNlcnZlciwgJmZkcyk7CisJCQlyZXQgPSBzZWxlY3QoZmlmb3MtPnNlcnZlciArIDEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dmFsKTsKKwkJCWlmIChyZXQgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVhZCBmcm9tIGV2ZW50IHNlcnZlci4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgocmV0ID09IDApICYmIChpID4gNCkgJiYgIWJ5dGVzKSB7CisJCQkJbG9nX2Vycm9yKCJObyBpbnB1dCBmcm9tIGV2ZW50IHNlcnZlci4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAocmV0IDwgMSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVhZCBmcm9tIGV2ZW50IHNlcnZlci4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0ID0gcmVhZChmaWZvcy0+c2VydmVyLCBidWYgKyBieXRlcywgc2l6ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoKGVycm5vID09IEVJTlRSKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlYWQgZnJvbSBldmVudCBzZXJ2ZXIuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlieXRlcyArPSByZXQ7CisJCWlmIChoZWFkZXIgJiYgKGJ5dGVzID09IDIgKiBzaXplb2YodWludDMyX3QpKSkgeworCQkJbXNnLT5jbWQgPSBudG9obChoZWFkZXJbMF0pOworCQkJbXNnLT5zaXplID0gbnRvaGwoaGVhZGVyWzFdKTsKKwkJCWJ1ZiA9IG1zZy0+ZGF0YSA9IGRtX21hbGxvYyhtc2ctPnNpemUpOworCQkJc2l6ZSA9IG1zZy0+c2l6ZTsKKwkJCWJ5dGVzID0gMDsKKwkJCWhlYWRlciA9IDA7CisJCX0KKwl9CisKKwlpZiAoYnl0ZXMgIT0gc2l6ZSkgeworCQlkbV9mcmVlKG1zZy0+ZGF0YSk7CisJCW1zZy0+ZGF0YSA9IE5VTEw7CisJfQorCXJldHVybiBieXRlcyA9PSBzaXplOworfQorCisvKiBXcml0ZSBtZXNzYWdlIHRvIGRhZW1vbi4gKi8KK3N0YXRpYyBpbnQgX2RhZW1vbl93cml0ZShzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgKmZpZm9zLAorCQkJIHN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnKQoreworCWludCByZXQ7CisJZmRfc2V0IGZkczsKKwlzaXplX3QgYnl0ZXMgPSAwOworCXNpemVfdCBzaXplID0gMiAqIHNpemVvZih1aW50MzJfdCkgKyBtc2ctPnNpemU7CisJdWludDMyX3QgKmhlYWRlciA9IGFsbG9jYShzaXplKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWhlYWRlcjsKKwljaGFyIGRyYWluYnVmWzEyOF07CisKKwloZWFkZXJbMF0gPSBodG9ubChtc2ctPmNtZCk7CisJaGVhZGVyWzFdID0gaHRvbmwobXNnLT5zaXplKTsKKwltZW1jcHkoYnVmICsgMiAqIHNpemVvZih1aW50MzJfdCksIG1zZy0+ZGF0YSwgbXNnLT5zaXplKTsKKworCS8qIGRyYWluIHRoZSBhbnN3ZXIgZmlmbyAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2YWwgPSB7IC50dl91c2VjID0gMTAwIH07CisJCUZEX1pFUk8oJmZkcyk7CisJCUZEX1NFVChmaWZvcy0+c2VydmVyLCAmZmRzKTsKKwkJcmV0ID0gc2VsZWN0KGZpZm9zLT5zZXJ2ZXIgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byB0YWxrIHRvIGV2ZW50IGRhZW1vbi4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChyZXQgPT0gMCkKKwkJCWJyZWFrOworCQlyZXQgPSByZWFkKGZpZm9zLT5zZXJ2ZXIsIGRyYWluYnVmLCBzaXplb2YoZHJhaW5idWYpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmICgoZXJybm8gPT0gRUlOVFIpIHx8IChlcnJubyA9PSBFQUdBSU4pKQorCQkJCWNvbnRpbnVlOworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gdGFsayB0byBldmVudCBkYWVtb24uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXdoaWxlIChieXRlcyA8IHNpemUpIHsKKwkJZG8geworCQkJLyogV2F0Y2ggZGFlbW9uIHdyaXRlIEZJRk8gdG8gYmUgcmVhZHkgZm9yIG91dHB1dC4gKi8KKwkJCUZEX1pFUk8oJmZkcyk7CisJCQlGRF9TRVQoZmlmb3MtPmNsaWVudCwgJmZkcyk7CisJCQlyZXQgPSBzZWxlY3QoZmlmb3MtPmNsaWVudCArIDEsIE5VTEwsICZmZHMsIE5VTEwsIE5VTEwpOworCQkJaWYgKChyZXQgPCAwKSAmJiAoZXJybm8gIT0gRUlOVFIpKSB7CisJCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gdGFsayB0byBldmVudCBkYWVtb24uIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gd2hpbGUgKHJldCA8IDEpOworCisJCXJldCA9IHdyaXRlKGZpZm9zLT5jbGllbnQsIGJ1ZiArIGJ5dGVzLCBzaXplIC0gYnl0ZXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKChlcnJubyA9PSBFSU5UUikgfHwgKGVycm5vID09IEVBR0FJTikpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byB0YWxrIHRvIGV2ZW50IGRhZW1vbi4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCWJ5dGVzICs9IHJldDsKKwl9CisKKwlyZXR1cm4gYnl0ZXMgPT0gc2l6ZTsKK30KKworaW50IGRhZW1vbl90YWxrKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MsCisJCXN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnLCBpbnQgY21kLAorCQljb25zdCBjaGFyICpkc29fbmFtZSwgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCWVudW0gZG1fZXZlbnRfbWFzayBldm1hc2ssIHVpbnQzMl90IHRpbWVvdXQpCit7CisJaW50IG1zZ19zaXplOworCW1lbXNldChtc2csIDAsIHNpemVvZigqbXNnKSk7CisKKwkvKgorCSAqIFNldCBjb21tYW5kIGFuZCBwYWNrIHRoZSBhcmd1bWVudHMKKwkgKiBpbnRvIEFTQ0lJIG1lc3NhZ2Ugc3RyaW5nLgorCSAqLworCWlmICgobXNnX3NpemUgPQorCSAgICAgKChjbWQgPT0gRE1fRVZFTlRfQ01EX0hFTExPKSA/CisJICAgICAgZG1fYXNwcmludGYoJihtc2ctPmRhdGEpLCAiJWQ6JWQgSEVMTE8iLCBnZXRwaWQoKSwgX3NlcXVlbmNlX25yKSA6CisJICAgICAgZG1fYXNwcmludGYoJihtc2ctPmRhdGEpLCAiJWQ6JWQgJXMgJXMgJXUgJSIgUFJJdTMyLAorCQkJICBnZXRwaWQoKSwgX3NlcXVlbmNlX25yLAorCQkJICBkc29fbmFtZSA/IDogIi0iLCBkZXZfbmFtZSA/IDogIi0iLCBldm1hc2ssIHRpbWVvdXQpKSkKKwkgICAgPCAwKSB7CisJCWxvZ19lcnJvcigiX2RhZW1vbl90YWxrOiBtZXNzYWdlIGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbXNnLT5jbWQgPSBjbWQ7CisJbXNnLT5zaXplID0gbXNnX3NpemU7CisKKwkvKgorCSAqIFdyaXRlIGNvbW1hbmQgYW5kIG1lc3NhZ2UgdG8gYW5kCisJICogcmVhZCBzdGF0dXMgcmV0dXJuIGNvZGUgZnJvbSBkYWVtb24uCisJICovCisJaWYgKCFfZGFlbW9uX3dyaXRlKGZpZm9zLCBtc2cpKSB7CisJCXN0YWNrOworCQlkbV9mcmVlKG1zZy0+ZGF0YSk7CisJCW1zZy0+ZGF0YSA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKworCWRvIHsKKwkJZG1fZnJlZShtc2ctPmRhdGEpOworCQltc2ctPmRhdGEgPSBOVUxMOworCisJCWlmICghX2RhZW1vbl9yZWFkKGZpZm9zLCBtc2cpKSB7CisJCQlzdGFjazsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSB3aGlsZSAoIV9jaGVja19tZXNzYWdlX2lkKG1zZykpOworCisJX3NlcXVlbmNlX25yKys7CisKKwlyZXR1cm4gKGludDMyX3QpIG1zZy0+Y21kOworfQorCisvKgorICogc3RhcnRfZGFlbW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBmb3JrcyBvZmYgYSBwcm9jZXNzIChkbWV2ZW50ZCkgdGhhdCB3aWxsIGhhbmRsZQorICogdGhlIGV2ZW50cy4gIEkgYW0gY3VycmVudGx5IHRlc3Qgb3BlbmluZyBvbmUgb2YgdGhlIGZpZm9zIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgZGFlbW9uIGlzIHJ1bm5pbmcgYW5kIGxpc3RlbmluZy4uLiAgSSB0aG91Z2h0CisgKiB0aGlzIHdvdWxkIGJlIGxlc3MgZXhwZW5zaXZlIHRoYW4gZm9yay9leGVjJ2luZyBldmVyeSB0aW1lLgorICogUGVyaGFwcyB0aGVyZSBpcyBhbiBldmVuIHF1aWNrZXIvYmV0dGVyIHdheSAobm8sIGNoZWNraW5nIHRoZQorICogbG9jayBmaWxlIGlzIF9ub3RfIGEgYmV0dGVyIHdheSkuCisgKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IF9zdGFydF9kYWVtb24oY2hhciAqZG1ldmVudGRfcGF0aCwgc3RydWN0IGRtX2V2ZW50X2ZpZm9zICpmaWZvcykKK3sKKwlpbnQgcGlkLCByZXQgPSAwOworCWludCBzdGF0dXM7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwljaGFyIGRlZmF1bHRfZG1ldmVudGRfcGF0aFtdID0gRE1FVkVOVERfUEFUSDsKKwljaGFyICphcmdzW10gPSB7IGRtZXZlbnRkX3BhdGggPyA6IGRlZmF1bHRfZG1ldmVudGRfcGF0aCwgTlVMTCB9OworCisJLyoKKwkgKiBGSVhNRSBFeHBsaWNpdGx5IHZlcmlmeSB0aGUgY29kZSdzIHJlcXVpcmVtZW50IHRoYXQgY2xpZW50X3BhdGggaXMgc2VjdXJlOgorCSAqIC0gQWxsIHBhcmVudCBkaXJlY3RvcmllcyBvd25lZCBieSByb290IHdpdGhvdXQgZ3JvdXAvb3RoZXIgd3JpdGUgYWNjZXNzIHVubGVzcyBzdGlja3kuCisJICovCisKKwkvKiBJZiBjbGllbnQgZmlmbyBwYXRoIGV4aXN0cywgb25seSB1c2UgaXQgaWYgaXQgaXMgcm9vdC1vd25lZCBmaWZvIG1vZGUgMDYwMCAqLworCWlmICgobHN0YXQoZmlmb3MtPmNsaWVudF9wYXRoLCAmc3RhdGJ1ZikgPCAwKSkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJLyogSnVtcCBhaGVhZCBpZiBmaWZvIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICovCisJCQlnb3RvIHN0YXJ0X3NlcnZlcjsKKwkJZWxzZSB7CisJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgZmlmb3MtPmNsaWVudF9wYXRoKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmICghU19JU0ZJRk8oc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQlsb2dfZXJyb3IoIiVzIG11c3QgYmUgYSBmaWZvLiIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc3RhdGJ1Zi5zdF91aWQpIHsKKwkJbG9nX2Vycm9yKCIlcyBtdXN0IGJlIG93bmVkIGJ5IHVpZCAwLiIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc3RhdGJ1Zi5zdF9tb2RlICYgKFNfSUVYRUMgfCBTX0lSV1hHIHwgU19JUldYTykpIHsKKwkJbG9nX2Vycm9yKCIlcyBtdXN0IGhhdmUgbW9kZSAwNjAwLiIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEFueW9uZSBsaXN0ZW5pbmc/ICBJZiBub3QsIGVycm5vIHdpbGwgYmUgRU5YSU8gKi8KKwlmaWZvcy0+Y2xpZW50ID0gb3BlbihmaWZvcy0+Y2xpZW50X3BhdGgsIE9fV1JPTkxZIHwgT19OT05CTE9DSyk7CisJaWYgKGZpZm9zLT5jbGllbnQgPj0gMCkgeworCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIGlmIGFsbCB0aGUgYWJvdmUgY2hlY2tzIHBhc3NlZC4gKi8KKwkJaWYgKChmc3RhdChmaWZvcy0+Y2xpZW50LCAmc3RhdGJ1ZikgPCAwKSB8fAorCQkgICAgIVNfSVNGSUZPKHN0YXRidWYuc3RfbW9kZSkgfHwgc3RhdGJ1Zi5zdF91aWQgfHwKKwkJICAgIChzdGF0YnVmLnN0X21vZGUgJiAoU19JRVhFQyB8IFNfSVJXWEcgfCBTX0lSV1hPKSkpIHsKKwkJCWxvZ19lcnJvcigiJXMgaXMgbm8gbG9uZ2VyIGEgc2VjdXJlIHJvb3Qtb3duZWQgZmlmbyB3aXRoIG1vZGUgMDYwMC4iLCBmaWZvcy0+Y2xpZW50X3BhdGgpOworCQkJaWYgKGNsb3NlKGZpZm9zLT5jbGllbnQpKQorCQkJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZmlmb3MtPmNsaWVudF9wYXRoKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogc2VydmVyIGlzIHJ1bm5pbmcgYW5kIGxpc3RlbmluZyAqLworCQlpZiAoY2xvc2UoZmlmb3MtPmNsaWVudCkpCisJCQlsb2dfc3lzX2RlYnVnKCJjbG9zZSIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoZXJybm8gIT0gRU5YSU8gJiYgZXJybm8gIT0gRU5PRU5UKSAgeworCQkvKiBwcm9ibGVtICovCisJCWxvZ19zeXNfZXJyb3IoIm9wZW4iLCBmaWZvcy0+Y2xpZW50X3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKK3N0YXJ0X3NlcnZlcjoKKwkvKiBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgKi8KKworCWlmICgoYXJnc1swXVswXSA9PSAnLycpICYmIHN0YXQoYXJnc1swXSwgJnN0YXRidWYpKSB7CisJCWxvZ19zeXNfZXJyb3IoInN0YXQiLCBhcmdzWzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGlkID0gZm9yaygpOworCisJaWYgKHBpZCA8IDApCisJCWxvZ19zeXNfZXJyb3IoImZvcmsiLCAiIik7CisKKwllbHNlIGlmICghcGlkKSB7CisJCWV4ZWN2cChhcmdzWzBdLCBhcmdzKTsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZXhlYyBkbWV2ZW50ZDogJXMuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9IGVsc2UgeworCQlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHN0YXJ0IGRtZXZlbnRkOiAlcy4iLAorCQkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZWxzZSBpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSkKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHN0YXJ0IGRtZXZlbnRkLiIpOworCQllbHNlCisJCQlyZXQgPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpbml0X2ZpZm9zKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MpCit7CisJLyogRklYTUU/IElzIGZpZm8gdGhlIG1vc3Qgc3VpdGFibGUgbWV0aG9kPyBXaHkgbm90IHNoYXJlCisJICAgY29tbXMvZGFlbW9uIGNvZGUgd2l0aCBzb21ldGhpbmcgZWxzZSBlLmcuIG11bHRpcGF0aD8gKi8KKworCS8qIE9wZW4gdGhlIGZpZm8gdXNlZCB0byByZWFkIGZyb20gdGhlIGRhZW1vbi4gKi8KKwlpZiAoKGZpZm9zLT5zZXJ2ZXIgPSBvcGVuKGZpZm9zLT5zZXJ2ZXJfcGF0aCwgT19SRFdSKSkgPCAwKSB7CisJCWxvZ19zeXNfZXJyb3IoIm9wZW4iLCBmaWZvcy0+c2VydmVyX3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMb2NrIG91dCBhbnlvbmUgZWxzZSB0cnlpbmcgdG8gZG8gY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkYWVtb24uICovCisJaWYgKGZsb2NrKGZpZm9zLT5zZXJ2ZXIsIExPQ0tfRVgpIDwgMCkgeworCQlsb2dfc3lzX2Vycm9yKCJmbG9jayIsIGZpZm9zLT5zZXJ2ZXJfcGF0aCk7CisJCWdvdG8gYmFkOworCX0KKworLyoJaWYgKChmaWZvcy0+Y2xpZW50ID0gb3BlbihmaWZvcy0+Y2xpZW50X3BhdGgsIE9fV1JPTkxZIHwgT19OT05CTE9DSykpIDwgMCkgeyovCisJaWYgKChmaWZvcy0+Y2xpZW50ID0gb3BlbihmaWZvcy0+Y2xpZW50X3BhdGgsIE9fUkRXUiB8IE9fTk9OQkxPQ0spKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIGZpZm9zLT5jbGllbnRfcGF0aCk7CisJCWdvdG8gYmFkOworCX0KKworCXJldHVybiAxOworYmFkOgorCWlmIChjbG9zZShmaWZvcy0+c2VydmVyKSkKKwkJbG9nX3N5c19kZWJ1ZygiY2xvc2UiLCBmaWZvcy0+c2VydmVyX3BhdGgpOworCWZpZm9zLT5zZXJ2ZXIgPSAtMTsKKworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIGNsaWVudC4gKi8KK3N0YXRpYyBpbnQgX2luaXRfY2xpZW50KGNoYXIgKmRtZXZlbnRkX3BhdGgsIHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MpCit7CisJaWYgKCFfc3RhcnRfZGFlbW9uKGRtZXZlbnRkX3BhdGgsIGZpZm9zKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gaW5pdF9maWZvcyhmaWZvcyk7Cit9CisKK3ZvaWQgZmluaV9maWZvcyhzdHJ1Y3QgZG1fZXZlbnRfZmlmb3MgKmZpZm9zKQoreworCWlmIChmaWZvcy0+Y2xpZW50ID49IDAgJiYgY2xvc2UoZmlmb3MtPmNsaWVudCkpCisJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZmlmb3MtPmNsaWVudF9wYXRoKTsKKworCWlmIChmaWZvcy0+c2VydmVyID49IDApIHsKKwkJaWYgKGZsb2NrKGZpZm9zLT5zZXJ2ZXIsIExPQ0tfVU4pKQorCQkJbG9nX3N5c19kZWJ1ZygiZmxvY2sgdW5sb2NrIiwgZmlmb3MtPnNlcnZlcl9wYXRoKTsKKworCQlpZiAoY2xvc2UoZmlmb3MtPnNlcnZlcikpCisJCQlsb2dfc3lzX2RlYnVnKCJjbG9zZSIsIGZpZm9zLT5zZXJ2ZXJfcGF0aCk7CisJfQorfQorCisvKiBHZXQgdXVpZCBvZiBhIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBkbV90YXNrICpfZ2V0X2RldmljZV9pbmZvKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfSU5GTykpKSB7CisJCWxvZ19lcnJvcigiX2dldF9kZXZpY2VfaW5mbzogZG1fdGFzayBjcmVhdGlvbiBmb3IgaW5mbyBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbWV2aC0+dXVpZCkgeworCQlpZiAoIWRtX3Rhc2tfc2V0X3V1aWQoZG10LCBkbWV2aC0+dXVpZCkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGRtZXZoLT5kZXZfbmFtZSkgeworCQlpZiAoIWRtX3Rhc2tfc2V0X25hbWUoZG10LCBkbWV2aC0+ZGV2X25hbWUpKQorCQkJZ290b19iYWQ7CisJfSBlbHNlIGlmIChkbWV2aC0+bWFqb3IgJiYgZG1ldmgtPm1pbm9yKSB7CisJCWlmICghZG1fdGFza19zZXRfbWFqb3IoZG10LCBkbWV2aC0+bWFqb3IpIHx8CisJCSAgICAhZG1fdGFza19zZXRfbWlub3IoZG10LCBkbWV2aC0+bWlub3IpKQorCQkJZ290b19iYWQ7CisJfQorCisJLyogRklYTUUgQWRkIG5hbWUgb3IgdXVpZCBvciBkZXZubyB0byBtZXNzYWdlcyAqLworCWlmICghZG1fdGFza19ydW4oZG10KSkgeworCQlsb2dfZXJyb3IoIl9nZXRfZGV2aWNlX2luZm86IGRtX3Rhc2tfcnVuKCkgZmFpbGVkLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykpIHsKKwkJbG9nX2Vycm9yKCJfZ2V0X2RldmljZV9pbmZvOiBmYWlsZWQgdG8gZ2V0IGluZm8gZm9yIGRldmljZS4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFpbmZvLmV4aXN0cykgeworCQlsb2dfZXJyb3IoIl9nZXRfZGV2aWNlX2luZm86ICVzJXMlcyUuMGQlcyUuMGQlcyVzOiBkZXZpY2Ugbm90IGZvdW5kLiIsCisJCQkgIGRtZXZoLT51dWlkID8gOiAiIiwKKwkJCSAgKCFkbWV2aC0+dXVpZCAmJiBkbWV2aC0+ZGV2X25hbWUpID8gZG1ldmgtPmRldl9uYW1lIDogIiIsCisJCQkgICghZG1ldmgtPnV1aWQgJiYgIWRtZXZoLT5kZXZfbmFtZSAmJiBkbWV2aC0+bWFqb3IgPiAwKSA/ICIoIiA6ICIiLAorCQkJICAoIWRtZXZoLT51dWlkICYmICFkbWV2aC0+ZGV2X25hbWUgJiYgZG1ldmgtPm1ham9yID4gMCkgPyBkbWV2aC0+bWFqb3IgOiAwLAorCQkJICAoIWRtZXZoLT51dWlkICYmICFkbWV2aC0+ZGV2X25hbWUgJiYgZG1ldmgtPm1ham9yID4gMCkgPyAiOiIgOiAiIiwKKwkJCSAgKCFkbWV2aC0+dXVpZCAmJiAhZG1ldmgtPmRldl9uYW1lICYmIGRtZXZoLT5taW5vciA+IDApID8gZG1ldmgtPm1pbm9yIDogMCwKKwkJCSAgKCFkbWV2aC0+dXVpZCAmJiAhZG1ldmgtPmRldl9uYW1lICYmIGRtZXZoLT5tYWpvciA+IDApICYmIGRtZXZoLT5taW5vciA9PSAwID8gIjAiIDogIiIsCisJCQkgICghZG1ldmgtPnV1aWQgJiYgIWRtZXZoLT5kZXZfbmFtZSAmJiBkbWV2aC0+bWFqb3IgPiAwKSA/ICIpICIgOiAiIik7CisJCWdvdG8gYmFkOworCX0KKworCXJldHVybiBkbXQ7CisKKyAgICAgIGJhZDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSGFuZGxlIHRoZSBldmVudCAoZGUpcmVnaXN0cmF0aW9uIGNhbGwgYW5kIHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2Rlcy4gKi8KK3N0YXRpYyBpbnQgX2RvX2V2ZW50KGludCBjbWQsIGNoYXIgKmRtZXZlbnRkX3BhdGgsIHN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnLAorCQkgICAgIGNvbnN0IGNoYXIgKmRzb19uYW1lLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICAgICBlbnVtIGRtX2V2ZW50X21hc2sgZXZtYXNrLCB1aW50MzJfdCB0aW1lb3V0KQoreworCWludCByZXQ7CisJc3RydWN0IGRtX2V2ZW50X2ZpZm9zIGZpZm9zID0geworCQkuc2VydmVyID0gLTEsCisJCS5jbGllbnQgPSAtMSwKKwkJLyogRklYTUUgTWFrZSB0aGVzZSBlaXRoZXIgY29uZmlndXJhYmxlIG9yIGRlcGVuZCBkaXJlY3RseSBvbiBkbWV2ZW50ZF9wYXRoICovCisJCS5jbGllbnRfcGF0aCA9IERNX0VWRU5UX0ZJRk9fQ0xJRU5ULAorCQkuc2VydmVyX3BhdGggPSBETV9FVkVOVF9GSUZPX1NFUlZFUgorCX07CisKKwlpZiAoIV9pbml0X2NsaWVudChkbWV2ZW50ZF9wYXRoLCAmZmlmb3MpKSB7CisJCXJldCA9IC1FU1JDSDsKKwkJZ290b19vdXQ7CisJfQorCisJcmV0ID0gZGFlbW9uX3RhbGsoJmZpZm9zLCBtc2csIERNX0VWRU5UX0NNRF9IRUxMTywgTlVMTCwgTlVMTCwgMCwgMCk7CisKKwlkbV9mcmVlKG1zZy0+ZGF0YSk7CisJbXNnLT5kYXRhID0gMDsKKworCWlmICghcmV0KQorCQlyZXQgPSBkYWVtb25fdGFsaygmZmlmb3MsIG1zZywgY21kLCBkc29fbmFtZSwgZGV2X25hbWUsIGV2bWFzaywgdGltZW91dCk7CitvdXQ6CisJLyogd2hhdCBpcyB0aGUgb3Bwb3NpdGUgb2YgaW5pdD8gKi8KKwlmaW5pX2ZpZm9zKCZmaWZvcyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBFeHRlcm5hbCBsaWJyYXJ5IGludGVyZmFjZS4gKi8KK2ludCBkbV9ldmVudF9yZWdpc3Rlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCkKK3sKKwlpbnQgcmV0ID0gMSwgZXJyOworCWNvbnN0IGNoYXIgKnV1aWQ7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1fZXZlbnRfZGFlbW9uX21lc3NhZ2UgbXNnID0geyAwIH07CisKKwlpZiAoIShkbXQgPSBfZ2V0X2RldmljZV9pbmZvKGRtZXZoKSkpCisJCXJldHVybl8wOworCisJdXVpZCA9IGRtX3Rhc2tfZ2V0X3V1aWQoZG10KTsKKworCWlmICghc3Ryc3RyKGRtZXZoLT5kc28sICJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnRoaW4uc28iKSAmJgorCSAgICAhc3Ryc3RyKGRtZXZoLT5kc28sICJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnNuYXBzaG90LnNvIikgJiYKKwkgICAgIXN0cnN0cihkbWV2aC0+ZHNvLCAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJtaXJyb3Iuc28iKSAmJgorCSAgICAhc3Ryc3RyKGRtZXZoLT5kc28sICJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnJhaWQuc28iKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6ICVzOiBkbWV2ZW50ZCBwbHVnaW5zIGFyZSBkZXByZWNhdGVkLiIsIGRtZXZoLT5kc28pOworCisKKwlpZiAoKGVyciA9IF9kb19ldmVudChETV9FVkVOVF9DTURfUkVHSVNURVJfRk9SX0VWRU5ULCBkbWV2aC0+ZG1ldmVudGRfcGF0aCwgJm1zZywKKwkJCSAgICAgZG1ldmgtPmRzbywgdXVpZCwgZG1ldmgtPm1hc2ssIGRtZXZoLT50aW1lb3V0KSkgPCAwKSB7CisJCWxvZ19lcnJvcigiJXM6IGV2ZW50IHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVzLiIsCisJCQkgIGRtX3Rhc2tfZ2V0X25hbWUoZG10KSwKKwkJCSAgbXNnLmRhdGEgPyBtc2cuZGF0YSA6IHN0cmVycm9yKC1lcnIpKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlkbV9mcmVlKG1zZy5kYXRhKTsKKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGRtX2V2ZW50X3VucmVnaXN0ZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpCit7CisJaW50IHJldCA9IDEsIGVycjsKKwljb25zdCBjaGFyICp1dWlkOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlIG1zZyA9IHsgMCB9OworCisJaWYgKCEoZG10ID0gX2dldF9kZXZpY2VfaW5mbyhkbWV2aCkpKQorCQlyZXR1cm5fMDsKKworCXV1aWQgPSBkbV90YXNrX2dldF91dWlkKGRtdCk7CisKKwlpZiAoKGVyciA9IF9kb19ldmVudChETV9FVkVOVF9DTURfVU5SRUdJU1RFUl9GT1JfRVZFTlQsIGRtZXZoLT5kbWV2ZW50ZF9wYXRoLCAmbXNnLAorCQkJICAgIGRtZXZoLT5kc28sIHV1aWQsIGRtZXZoLT5tYXNrLCBkbWV2aC0+dGltZW91dCkpIDwgMCkgeworCQlsb2dfZXJyb3IoIiVzOiBldmVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVzLiIsCisJCQkgIGRtX3Rhc2tfZ2V0X25hbWUoZG10KSwKKwkJCSAgbXNnLmRhdGEgPyBtc2cuZGF0YSA6IHN0cmVycm9yKC1lcnIpKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlkbV9mcmVlKG1zZy5kYXRhKTsKKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogRmV0Y2ggYSBzdHJpbmcgb2ZmIHNyYyBhbmQgZHVwbGljYXRlIGl0IGludG8gKmRlc3QuICovCisvKiBGSVhNRTogbW92ZSB0byBzZXBhcmF0ZSBtb2R1bGUgdG8gc2hhcmUgd2l0aCB0aGUgZGFlbW9uLiAqLworc3RhdGljIGNoYXIgKl9mZXRjaF9zdHJpbmcoY2hhciAqKnNyYywgY29uc3QgaW50IGRlbGltaXRlcikKK3sKKwljaGFyICpwLCAqcmV0OworCisJaWYgKChwID0gc3RyY2hyKCpzcmMsIGRlbGltaXRlcikpKQorCQkqcCA9IDA7CisKKwlpZiAoKHJldCA9IGRtX3N0cmR1cCgqc3JjKSkpCisJCSpzcmMgKz0gc3RybGVuKHJldCkgKyAxOworCisJaWYgKHApCisJCSpwID0gZGVsaW1pdGVyOworCisJcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgYSBkZXZpY2UgbWVzc2FnZSBmcm9tIHRoZSBkYWVtb24uICovCitzdGF0aWMgaW50IF9wYXJzZV9tZXNzYWdlKHN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSAqbXNnLCBjaGFyICoqZHNvX25hbWUsCisJCQkgY2hhciAqKnV1aWQsIGVudW0gZG1fZXZlbnRfbWFzayAqZXZtYXNrKQoreworCWNoYXIgKmlkOworCWNoYXIgKnAgPSBtc2ctPmRhdGE7CisKKwlpZiAoKGlkID0gX2ZldGNoX3N0cmluZygmcCwgJyAnKSkgJiYKKwkgICAgKCpkc29fbmFtZSA9IF9mZXRjaF9zdHJpbmcoJnAsICcgJykpICYmCisJICAgICgqdXVpZCA9IF9mZXRjaF9zdHJpbmcoJnAsICcgJykpKSB7CisJCSpldm1hc2sgPSBhdG9pKHApOworCQlkbV9mcmVlKGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fZnJlZShpZCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBSZXR1cm5zIDAgaWYgaGFuZGxlciBmb3VuZDsgZXJyb3IgKC1FTk9NRU0sIC1FTk9FTlQpIG90aGVyd2lzZS4KKyAqLworaW50IGRtX2V2ZW50X2dldF9yZWdpc3RlcmVkX2RldmljZShzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCBuZXh0KQoreworCWludCByZXQgPSAwOworCWNvbnN0IGNoYXIgKnV1aWQgPSBOVUxMOworCWNoYXIgKnJlcGx5X2RzbyA9IE5VTEwsICpyZXBseV91dWlkID0gTlVMTDsKKwllbnVtIGRtX2V2ZW50X21hc2sgcmVwbHlfbWFzayA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdCA9IE5VTEw7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlIG1zZyA9IHsgMCB9OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisKKwlpZiAoIShkbXQgPSBfZ2V0X2RldmljZV9pbmZvKGRtZXZoKSkpIHsKKwkJbG9nX2RlYnVnKCJEZXZpY2UgZG9lcyBub3QgZXhpc3RzICh1dWlkPSVzLCBuYW1lPSVzLCAlZDolZCkuIiwKKwkJCSAgZG1ldmgtPnV1aWQsIGRtZXZoLT5kZXZfbmFtZSwKKwkJCSAgZG1ldmgtPm1ham9yLCBkbWV2aC0+bWlub3IpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWw7CisJfQorCisJdXVpZCA9IGRtX3Rhc2tfZ2V0X3V1aWQoZG10KTsKKworCS8qIEZJWE1FIERpc3Rpbmd1aXNoIGVycm9ycyBjb25uZWN0aW5nIHRvIGRhZW1vbiAqLworCWlmIChfZG9fZXZlbnQobmV4dCA/IERNX0VWRU5UX0NNRF9HRVRfTkVYVF9SRUdJU1RFUkVEX0RFVklDRSA6CisJCSAgICAgIERNX0VWRU5UX0NNRF9HRVRfUkVHSVNURVJFRF9ERVZJQ0UsIGRtZXZoLT5kbWV2ZW50ZF9wYXRoLAorCQkgICAgICAmbXNnLCBkbWV2aC0+ZHNvLCB1dWlkLCBkbWV2aC0+bWFzaywgMCkpIHsKKwkJbG9nX2RlYnVnKCIlczogZGV2aWNlIG5vdCByZWdpc3RlcmVkLiIsIGRtX3Rhc2tfZ2V0X25hbWUoZG10KSk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBGSVhNRSB0aGlzIHdpbGwgcHJvYmFibHkgaG9ycmlibHkgYnJlYWsgaWYgd2UgZ2V0CisJICAgaWxsLWZvcm1hdHRlZCByZXBseSAqLworCXJldCA9IF9wYXJzZV9tZXNzYWdlKCZtc2csICZyZXBseV9kc28sICZyZXBseV91dWlkLCAmcmVwbHlfbWFzayk7CisKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlkbXQgPSBOVUxMOworCisJZG1fZnJlZShtc2cuZGF0YSk7CisJbXNnLmRhdGEgPSBOVUxMOworCisJX2RtX2V2ZW50X2hhbmRsZXJfY2xlYXJfZGV2X2luZm8oZG1ldmgpOworCWlmICghcmVwbHlfdXVpZCkgeworCQlyZXQgPSAtRU5YSU87IC8qIGRtZXZlbnRkIHByb2JhYmx5IGdhdmUgdXMgYm9ndXMgdXVpZCBiYWNrICovCisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIShkbWV2aC0+dXVpZCA9IGRtX3N0cmR1cChyZXBseV91dWlkKSkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghKGRtdCA9IF9nZXRfZGV2aWNlX2luZm8oZG1ldmgpKSkgeworCQlyZXQgPSAtRU5YSU87IC8qIGRtZXZlbnRkIHByb2JhYmx5IGdhdmUgdXMgYm9ndXMgdXVpZCBiYWNrICovCisJCWdvdG8gZmFpbDsKKwl9CisKKwlkbV9ldmVudF9oYW5kbGVyX3NldF9kc28oZG1ldmgsIHJlcGx5X2Rzbyk7CisJZG1fZXZlbnRfaGFuZGxlcl9zZXRfZXZlbnRfbWFzayhkbWV2aCwgcmVwbHlfbWFzayk7CisKKwlkbV9mcmVlKHJlcGx5X2Rzbyk7CisJcmVwbHlfZHNvID0gTlVMTDsKKworCWRtX2ZyZWUocmVwbHlfdXVpZCk7CisJcmVwbHlfdXVpZCA9IE5VTEw7CisKKwlpZiAoIShkbWV2aC0+ZGV2X25hbWUgPSBkbV9zdHJkdXAoZG1fdGFza19nZXRfbmFtZShkbXQpKSkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBmYWlsOworCX0KKworCWRtZXZoLT5tYWpvciA9IGluZm8ubWFqb3I7CisJZG1ldmgtPm1pbm9yID0gaW5mby5taW5vcjsKKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHJldDsKKworIGZhaWw6CisJZG1fZnJlZShtc2cuZGF0YSk7CisJZG1fZnJlZShyZXBseV9kc28pOworCWRtX2ZyZWUocmVwbHlfdXVpZCk7CisJX2RtX2V2ZW50X2hhbmRsZXJfY2xlYXJfZGV2X2luZm8oZG1ldmgpOworCWlmIChkbXQpCisJCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBZb3UgY2FuIChhbmQgaGF2ZSB0bykgY2FsbCB0aGlzIGF0IHRoZSBzdGFnZSBvZiB0aGUgcHJvdG9jb2wgd2hlcmUKKyAqICAgICBkYWVtb25fdGFsayhmaWZvcywgJm1zZywgRE1fRVZFTlRfQ01EX0hFTExPLCBOVUxMLCBOVUxMLCAwLCAwKQorICoKKyAqIHdvdWxkIGJlIG5vcm1hbGx5IHNlbnQuIFRoaXMgY2FsbCB3aWxsIHBhcnNlIHRoZSB2ZXJzaW9uIHJlcGx5IGZyb20KKyAqIGRtZXZlbnRkLCBpbiBhZGRpdGlvbiB0byBhYm92ZSBjYWxsLiBJdCBpcyBub3Qgc2FmZSB0byBjYWxsIHRoaXMgYXQgYW55CisgKiBvdGhlciBwbGFjZSBpbiB0aGUgcHJvdG9jb2wuCisgKgorICogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiwgbm90IGV4cG9zZWQgaW4gdGhlIHB1YmxpYyBBUEkuCisgKi8KKworaW50IGRtX2V2ZW50X2dldF92ZXJzaW9uKHN0cnVjdCBkbV9ldmVudF9maWZvcyAqZmlmb3MsIGludCAqdmVyc2lvbikgeworCWNoYXIgKnA7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlIG1zZyA9IHsgMCB9OworCisJaWYgKGRhZW1vbl90YWxrKGZpZm9zLCAmbXNnLCBETV9FVkVOVF9DTURfSEVMTE8sIE5VTEwsIE5VTEwsIDAsIDApKQorCQlyZXR1cm4gMDsKKwlwID0gbXNnLmRhdGE7CisJKnZlcnNpb24gPSAwOworCisJaWYgKCFwIHx8ICEocCA9IHN0cmNocihwLCAnICcpKSkgLyogTWVzc2FnZSBJRCAqLworCQlyZXR1cm4gMDsKKwlpZiAoIShwID0gc3RyY2hyKHAgKyAxLCAnICcpKSkgLyogSEVMTE8gKi8KKwkJcmV0dXJuIDA7CisJaWYgKChwID0gc3RyY2hyKHAgKyAxLCAnICcpKSkgLyogSEVMTE8sIG9uY2UgbW9yZSAqLworCQkqdmVyc2lvbiA9IGF0b2kocCk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkbV9ldmVudF9sb2dfc2V0KGludCBkZWJ1Z19sb2dfbGV2ZWwsIGludCB1c2Vfc3lzbG9nKQoreworCV9kZWJ1Z19sZXZlbCA9IGRlYnVnX2xvZ19sZXZlbDsKKwlfdXNlX3N5c2xvZyA9IHVzZV9zeXNsb2c7Cit9CisKK3ZvaWQgZG1fZXZlbnRfbG9nKGNvbnN0IGNoYXIgKnN1YnN5cywgaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLAorCQkgIGludCBsaW5lLCBpbnQgZG1fZXJybm9fb3JfY2xhc3MsCisJCSAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBwdGhyZWFkX211dGV4X3QgX2xvZ19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisJc3RhdGljIHRpbWVfdCBzdGFydCA9IDA7CisJY29uc3QgY2hhciAqaW5kZW50ID0gIiI7CisJRklMRSAqc3RyZWFtID0gc3Rkb3V0OworCWludCBwcmlvOworCXRpbWVfdCBub3c7CisKKwlzd2l0Y2ggKGxldmVsICYgfihfTE9HX1NUREVSUiB8IF9MT0dfT05DRSkpIHsKKwljYXNlIF9MT0dfREVCVUc6CisJCWlmIChfZGVidWdfbGV2ZWwgPCAzKQorCQkJcmV0dXJuOworCQlwcmlvID0gTE9HX0RFQlVHOworCQlpbmRlbnQgPSAiICAgICAgIjsKKwkJYnJlYWs7CisJY2FzZSBfTE9HX0lORk86CisJCWlmIChfZGVidWdfbGV2ZWwgPCAyKQorCQkJcmV0dXJuOworCQlwcmlvID0gTE9HX0lORk87CisJCWluZGVudCA9ICIgICAgIjsKKwkJYnJlYWs7CisJY2FzZSBfTE9HX05PVElDRToKKwkJaWYgKF9kZWJ1Z19sZXZlbCA8IDEpCisJCQlyZXR1cm47CisJCXByaW8gPSBMT0dfTk9USUNFOworCQlpbmRlbnQgPSAiICAiOworCQlicmVhazsKKwljYXNlIF9MT0dfV0FSTjoKKwkJcHJpbyA9IExPR19XQVJOSU5HOworCQlicmVhazsKKwljYXNlIF9MT0dfRVJSOgorCQlwcmlvID0gTE9HX0VSUjsKKwkJc3RyZWFtID0gc3RkZXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmlvID0gTE9HX0NSSVQ7CisJfQorCisJLyogU2VyaWFsaXplIHRvIGtlZXAgbGluZXMgcmVhZGFibGUgKi8KKwlwdGhyZWFkX211dGV4X2xvY2soJl9sb2dfbXV0ZXgpOworCisJaWYgKF91c2Vfc3lzbG9nKSB7CisJCXZzeXNsb2cocHJpbywgZm9ybWF0LCBhcCk7CisJfSBlbHNlIHsKKwkJbm93ID0gdGltZShOVUxMKTsKKwkJaWYgKCFzdGFydCkKKwkJCXN0YXJ0ID0gbm93OworCQlub3cgLT0gc3RhcnQ7CisJCWZwcmludGYoc3RyZWFtLCAiWyUyZDolMDJkXSAlOHg6JS02cyVzIiwKKwkJCShpbnQpbm93IC8gNjAsIChpbnQpbm93ICUgNjAsCisJCQkvLyBUT0RPOiBNYXliZSB1c2Ugc2hvcnRlciBJRAorCQkJLy8gKChpbnQpKHB0aHJlYWRfc2VsZigpKSA+PiA2KSAmIDB4ZmZmZiwKKwkJCShpbnQpcHRocmVhZF9zZWxmKCksIHN1YnN5cywKKwkJCShfZGVidWdfbGV2ZWwgPiAzKSA/ICIiIDogaW5kZW50KTsKKwkJaWYgKF9kZWJ1Z19sZXZlbCA+IDMpCisJCQlmcHJpbnRmKHN0cmVhbSwgIiUyOHM6JTRkICVzIiwgZmlsZSwgbGluZSwgaW5kZW50KTsKKwkJdmZwcmludGYoc3RyZWFtLCBfKGZvcm1hdCksIGFwKTsKKwkJZnB1dGMoJ1xuJywgc3RyZWFtKTsKKwkJZmZsdXNoKHN0cmVhbSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJl9sb2dfbXV0ZXgpOworfQorCisjaWYgMAkJCQkvKiBsZWZ0IG91dCBmb3Igbm93ICovCisKK3N0YXRpYyBjaGFyICpfc2tpcF9zdHJpbmcoY2hhciAqc3JjLCBjb25zdCBpbnQgZGVsaW1pdGVyKQoreworCXNyYyA9IHNydGNocihzcmMsIGRlbGltaXRlcik7CisJaWYgKHNyYyAmJiAqKHNyYyArIDEpKQorCQlyZXR1cm4gc3JjICsgMTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGRtX2V2ZW50X3NldF90aW1lb3V0KGNvbnN0IGNoYXIgKmRldmljZV9wYXRoLCB1aW50MzJfdCB0aW1lb3V0KQoreworCXN0cnVjdCBkbV9ldmVudF9kYWVtb25fbWVzc2FnZSBtc2cgPSB7IDAgfTsKKworCWlmICghZGV2aWNlX2V4aXN0cyhkZXZpY2VfcGF0aCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIF9kb19ldmVudChETV9FVkVOVF9DTURfU0VUX1RJTUVPVVQsICZtc2csCisJCQkgTlVMTCwgZGV2aWNlX3BhdGgsIDAsIHRpbWVvdXQpOworfQorCitpbnQgZG1fZXZlbnRfZ2V0X3RpbWVvdXQoY29uc3QgY2hhciAqZGV2aWNlX3BhdGgsIHVpbnQzMl90ICp0aW1lb3V0KQoreworCWludCByZXQ7CisJc3RydWN0IGRtX2V2ZW50X2RhZW1vbl9tZXNzYWdlIG1zZyA9IHsgMCB9OworCisJaWYgKCFkZXZpY2VfZXhpc3RzKGRldmljZV9wYXRoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIShyZXQgPSBfZG9fZXZlbnQoRE1fRVZFTlRfQ01EX0dFVF9USU1FT1VULCAmbXNnLCBOVUxMLCBkZXZpY2VfcGF0aCwKKwkJCSAgICAgMCwgMCkpKSB7CisJCWNoYXIgKnAgPSBfc2tpcF9zdHJpbmcobXNnLmRhdGEsICcgJyk7CisJCWlmICghcCkgeworCQkJbG9nX2Vycm9yKCJNYWxmb3JtZWQgcmVwbHkgZnJvbSBkbWV2ZW50ZCAnJXMnLiIsCisJCQkJICBtc2cuZGF0YSk7CisJCQlkbV9mcmVlKG1zZy5kYXRhKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCSp0aW1lb3V0ID0gYXRvaShwKTsKKwl9CisJZG1fZnJlZShtc2cuZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL2xpYmRldm1hcHBlci1ldmVudC5oIGIvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzk3MjIzCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIE5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgcmVsZWFzZWQgb25seSBhcyBwYXJ0IG9mIGEgdGVjaG5vbG9neSBwcmV2aWV3CisgKiBhbmQgaXRzIGNvbnRlbnRzIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHVwZGF0ZXMgaW4gd2F5cyB0aGF0IGRvIG5vdAorICogcHJlc2VydmUgY29tcGF0aWJpbGl0eS4KKyAqLworCisjaWZuZGVmIExJQl9ETUVWRU5UX0gKKyNkZWZpbmUgTElCX0RNRVZFTlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBFdmVudCBsaWJyYXJ5IGludGVyZmFjZS4KKyAqLworCitlbnVtIGRtX2V2ZW50X21hc2sgeworCURNX0VWRU5UX1NFVFRJTkdTX01BU0sgID0gMHgwMDAwRkYsCisJRE1fRVZFTlRfU0lOR0xFCQk9IDB4MDAwMDAxLCAvKiBSZXBvcnQgbXVsdGlwbGUgZXJyb3JzIGp1c3Qgb25jZS4gKi8KKwlETV9FVkVOVF9NVUxUSQkJPSAweDAwMDAwMiwgLyogUmVwb3J0IGFsbCBvZiB0aGVtLiAqLworCisJRE1fRVZFTlRfRVJST1JfTUFTSyAgICAgPSAweDAwRkYwMCwKKwlETV9FVkVOVF9TRUNUT1JfRVJST1IJPSAweDAwMDEwMCwgLyogRmFpbHVyZSBvbiBhIHBhcnRpY3VsYXIgc2VjdG9yLiAqLworCURNX0VWRU5UX0RFVklDRV9FUlJPUgk9IDB4MDAwMjAwLCAvKiBEZXZpY2UgZmFpbHVyZS4gKi8KKwlETV9FVkVOVF9QQVRIX0VSUk9SCT0gMHgwMDA0MDAsIC8qIEZhaWx1cmUgb24gYW4gaW8gcGF0aC4gKi8KKwlETV9FVkVOVF9BREFQVE9SX0VSUk9SCT0gMHgwMDA4MDAsIC8qIEZhaWx1cmUgb2YgYSBob3N0IGFkYXB0b3IuICovCisKKwlETV9FVkVOVF9TVEFUVVNfTUFTSyAgICA9IDB4RkYwMDAwLAorCURNX0VWRU5UX1NZTkNfU1RBVFVTCT0gMHgwMTAwMDAsIC8qIE1pcnJvciBzeW5jaHJvbml6YXRpb24gY29tcGxldGVkL2ZhaWxlZC4gKi8KKwlETV9FVkVOVF9USU1FT1VUCT0gMHgwMjAwMDAsIC8qIFRpbWVvdXQgaGFzIG9jY3VyZWQgKi8KKworCURNX0VWRU5UX1JFR0lTVFJBVElPTl9QRU5ESU5HID0gMHgxMDAwMDAwLCAvKiBNb25pdG9yIHRocmVhZCBpcyBzZXR0aW5nLXVwL3NodXR0aW5nLWRvd24gKi8KK307CisKKyNkZWZpbmUgRE1fRVZFTlRfQUxMX0VSUk9SUyBETV9FVkVOVF9FUlJPUl9NQVNLCisjZGVmaW5lIERNX0VWRU5UX1BST1RPQ09MX1ZFUlNJT04gMgorCitzdHJ1Y3QgZG1fdGFzazsKK3N0cnVjdCBkbV9ldmVudF9oYW5kbGVyOworCitzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1fZXZlbnRfaGFuZGxlcl9jcmVhdGUodm9pZCk7Cit2b2lkIGRtX2V2ZW50X2hhbmRsZXJfZGVzdHJveShzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworCisvKgorICogUGF0aCBvZiBzaGFyZWQgbGlicmFyeSB0byBoYW5kbGUgZXZlbnRzLgorICoKKyAqIEFsbCBvZiBkbWV2ZW50ZCwgZHNvLCBkZXZpY2VfbmFtZSBhbmQgdXVpZCBzdHJpbmdzIGFyZSBkdXBsaWNhdGVkIHNvCisgKiB5b3UgZG8gbm90IG5lZWQgdG8ga2VlcCB0aGUgcG9pbnRlcnMgdmFsaWQgYWZ0ZXIgdGhlIGNhbGwgc3VjY2VlZHMuCisgKiBUaGV5IG1heSByZXR1cm4gLUVOT01FTSB0aG91Z2guCisgKi8KK2ludCBkbV9ldmVudF9oYW5kbGVyX3NldF9kc28oc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoLCBjb25zdCBjaGFyICpwYXRoKTsKKworLyoKKyAqIFBhdGggb2YgZG1ldmVudGQgYmluYXJ5LgorICovCitpbnQgZG1fZXZlbnRfaGFuZGxlcl9zZXRfZG1ldmVudGRfcGF0aChzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGNvbnN0IGNoYXIgKmRtZXZlbnRkX3BhdGgpOworCisvKgorICogSWRlbnRpZnkgdGhlIGRldmljZSB0byBtb25pdG9yIGJ5IGV4YWN0bHkgb25lIG9mIGRldmljZV9uYW1lLCB1dWlkIG9yCisgKiBkZXZpY2UgbnVtYmVyLiBTdHJpbmcgYXJndW1lbnRzIGFyZSBkdXBsaWNhdGVkLCBzZWUgYWJvdmUuCisgKi8KK2ludCBkbV9ldmVudF9oYW5kbGVyX3NldF9kZXZfbmFtZShzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKworaW50IGRtX2V2ZW50X2hhbmRsZXJfc2V0X3V1aWQoc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoLCBjb25zdCBjaGFyICp1dWlkKTsKKwordm9pZCBkbV9ldmVudF9oYW5kbGVyX3NldF9tYWpvcihzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCBtYWpvcik7Cit2b2lkIGRtX2V2ZW50X2hhbmRsZXJfc2V0X21pbm9yKHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCwgaW50IG1pbm9yKTsKK3ZvaWQgZG1fZXZlbnRfaGFuZGxlcl9zZXRfdGltZW91dChzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgsIGludCB0aW1lb3V0KTsKKworLyoKKyAqIFNwZWNpZnkgbWFzayBmb3IgZXZlbnRzIHRvIG1vbml0b3IuCisgKi8KKy8vIEZJWE1FICBtaXN1c2Ugb2YgYml0bWFzayBhcyBlbnVtCit2b2lkIGRtX2V2ZW50X2hhbmRsZXJfc2V0X2V2ZW50X21hc2soc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoLAorCQkJCSAgICAgZW51bSBkbV9ldmVudF9tYXNrIGV2bWFzayk7CisKK2NvbnN0IGNoYXIgKmRtX2V2ZW50X2hhbmRsZXJfZ2V0X2Rzbyhjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworY29uc3QgY2hhciAqZG1fZXZlbnRfaGFuZGxlcl9nZXRfZGV2X25hbWUoY29uc3Qgc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoKTsKK2NvbnN0IGNoYXIgKmRtX2V2ZW50X2hhbmRsZXJfZ2V0X3V1aWQoY29uc3Qgc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoKTsKK2ludCBkbV9ldmVudF9oYW5kbGVyX2dldF9tYWpvcihjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworaW50IGRtX2V2ZW50X2hhbmRsZXJfZ2V0X21pbm9yKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCk7CitpbnQgZG1fZXZlbnRfaGFuZGxlcl9nZXRfdGltZW91dChjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworLy8gRklYTUUgIG1pc3VzZSBvZiBiaXRtYXNrIGFzIGVudW0KK2VudW0gZG1fZXZlbnRfbWFzayBkbV9ldmVudF9oYW5kbGVyX2dldF9ldmVudF9tYXNrKGNvbnN0IHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpkbWV2aCk7CisKKy8qIEZJWE1FIFJldmlldyBpbnRlcmZhY2UgKHdoYXQgYWJvdXQgdGhpcyBuZXh0IHRoaW5nPykgKi8KK2ludCBkbV9ldmVudF9nZXRfcmVnaXN0ZXJlZF9kZXZpY2Uoc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoLCBpbnQgbmV4dCk7CisKKy8qCisgKiBJbml0aWF0ZSBtb25pdG9yaW5nIHVzaW5nIGRtZXZlbnRkLgorICovCitpbnQgZG1fZXZlbnRfcmVnaXN0ZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworaW50IGRtX2V2ZW50X3VucmVnaXN0ZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmgpOworCisvKiBTZXQgZGVidWcgbGV2ZWwgZm9yIGxvZ2dpbmcsIGFuZCB3aGV0aGVyIHRvIGxvZyBvbiBzdGRvdXQvc3RkZXJyIG9yIHN5c2xvZyAqLwordm9pZCBkbV9ldmVudF9sb2dfc2V0KGludCBkZWJ1Z19sb2dfbGV2ZWwsIGludCB1c2Vfc3lzbG9nKTsKKworLyogTG9nIG1lc3NhZ2VzIGFjcm9kaW5nIHRvIGN1cnJlbnQgZGVidWcgbGV2ZWwgICovCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA2LCAwKSkpCit2b2lkIGRtX2V2ZW50X2xvZyhjb25zdCBjaGFyICpzdWJzeXMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwKKwkJICBpbnQgbGluZSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLAorCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisvKiBNYWNybyB0byByb3V0ZSBwcmludF9sb2cgZG8gZG1fZXZlbnRfbG9nKCkgKi8KKyNkZWZpbmUgRE1fRVZFTlRfTE9HX0ZOKHN1YnN5cykgXAordm9pZCBwcmludF9sb2coaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLFwKKwkgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pXAore1wKKwl2YV9saXN0IGFwO1wKKwl2YV9zdGFydChhcCwgZm9ybWF0KTtcCisJZG1fZXZlbnRfbG9nKHN1YnN5cywgbGV2ZWwsIGZpbGUsIGxpbmUsIGRtX2Vycm5vX29yX2NsYXNzLCBmb3JtYXQsIGFwKTtcCisJdmFfZW5kKGFwKTtcCit9CisKKy8qIFByb3RvdHlwZXMgZm9yIERTTyBpbnRlcmZhY2UsIHNlZSBkbWV2ZW50ZC5jLCBzdHJ1Y3QgZHNvX2RhdGEgZm9yCisgICBkZXRhaWxlZCBkZXNjcmlwdGlvbnMuICovCisvLyBGSVhNRSAgbWlzdXNlIG9mIGJpdG1hc2sgYXMgZW51bQordm9pZCBwcm9jZXNzX2V2ZW50KHN0cnVjdCBkbV90YXNrICpkbXQsIGVudW0gZG1fZXZlbnRfbWFzayBldm1hc2ssIHZvaWQgKip1c2VyKTsKK2ludCByZWdpc3Rlcl9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlX25hbWUsIGNvbnN0IGNoYXIgKnV1aWQsIGludCBtYWpvciwgaW50IG1pbm9yLCB2b2lkICoqdXNlcik7CitpbnQgdW5yZWdpc3Rlcl9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlX25hbWUsIGNvbnN0IGNoYXIgKnV1aWQsIGludCBtYWpvciwKKwkJICAgICAgaW50IG1pbm9yLCB2b2lkICoqdXNlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQucGMuaW4gYi9kYWVtb25zL2RtZXZlbnRkL2xpYmRldm1hcHBlci1ldmVudC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk0MzNmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGRldm1hcHBlci1ldmVudAorRGVzY3JpcHRpb246IGRldmljZS1tYXBwZXIgZXZlbnQgbGlicmFyeQorVmVyc2lvbjogQERNX0xJQl9QQVRDSExFVkVMQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZGV2bWFwcGVyLWV2ZW50CitSZXF1aXJlcy5wcml2YXRlOiBkZXZtYXBwZXIKZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY0MTUzCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitTVUJESVJTICs9IGx2bTIKKworaWZuZXEgKCJATUlSUk9SU0AiLCAibm9uZSIpCisgIFNVQkRJUlMgKz0gbWlycm9yCitlbmRpZgorCitpZm5lcSAoIkBTTkFQU0hPVFNAIiwgIm5vbmUiKQorICBTVUJESVJTICs9IHNuYXBzaG90CitlbmRpZgorCitpZm5lcSAoIkBSQUlEQCIsICJub25lIikKKyAgU1VCRElSUyArPSByYWlkCitlbmRpZgorCitpZm5lcSAoIkBUSElOQCIsICJub25lIikKKyAgU1VCRElSUyArPSB0aGluCitlbmRpZgorCitpZmVxICgkKE1BS0VDTURHT0FMUyksZGlzdGNsZWFuKQorICBTVUJESVJTID0gbHZtMiBtaXJyb3Igc25hcHNob3QgcmFpZCB0aGluCitlbmRpZgorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworc25hcHNob3Q6IGx2bTIKK21pcnJvcjogbHZtMgorcmFpZDogbHZtMgordGhpbjogbHZtMgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL2x2bTIvLmV4cG9ydGVkX3N5bWJvbHMgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZlNGNmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL2x2bTIvLmV4cG9ydGVkX3N5bWJvbHMKQEAgLTAsMCArMSw3IEBACitkbWV2ZW50ZF9sdm0yX2luaXQKK2RtZXZlbnRkX2x2bTJfZXhpdAorZG1ldmVudGRfbHZtMl9sb2NrCitkbWV2ZW50ZF9sdm0yX3VubG9jaworZG1ldmVudGRfbHZtMl9wb29sCitkbWV2ZW50ZF9sdm0yX3J1bgorZG1ldmVudGRfbHZtMl9jb21tYW5kCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmQzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK0NMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL3Rvb2xzCisKK1NPVVJDRVMgPSBkbWV2ZW50ZF9sdm0uYworCitMSUJfU0hBUkVEID0gbGliZGV2bWFwcGVyLWV2ZW50LWx2bTIuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK0xJQlMgKz0gQExWTTJDTURfTElCQCAtbGRldm1hcHBlciAkKFBUSFJFQURfTElCUykKKworaW5zdGFsbF9sdm0yOiBpbnN0YWxsX2xpYl9zaGFyZWQKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9kbWV2ZW50ZF9sdm0uYyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yL2RtZXZlbnRkX2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmZlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9kbWV2ZW50ZF9sdm0uYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkbWV2ZW50ZF9sdm0uaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKyNpbmNsdWRlICJsdm0yY21kLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8qCisgKiByZWdpc3Rlcl9kZXZpY2UoKSBpcyBjYWxsZWQgZmlyc3QgYW5kIHBlcmZvcm1zIGluaXRpYWxpc2F0aW9uLgorICogT25seSBvbmUgZGV2aWNlIG1heSBiZSByZWdpc3RlcmVkIG9yIHVucmVnaXN0ZXJlZCBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgX3JlZ2lzdGVyX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyoKKyAqIE51bWJlciBvZiBhY3RpdmUgcmVnaXN0cmF0aW9ucy4KKyAqLworc3RhdGljIGludCBfcmVnaXN0ZXJfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCBkbV9wb29sICpfbWVtX3Bvb2wgPSBOVUxMOworc3RhdGljIHZvaWQgKl9sdm1faGFuZGxlID0gTlVMTDsKKworRE1fRVZFTlRfTE9HX0ZOKCJsdm0iKQorCitzdGF0aWMgdm9pZCBfbHZtMl9wcmludF9sb2coaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCSAgICBpbnQgZG1fZXJybm9fb3JfY2xhc3MsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlwcmludF9sb2cobGV2ZWwsIGZpbGUsIGxpbmUsIGRtX2Vycm5vX29yX2NsYXNzLCAiJXMiLCBtc2cpOworfQorCisvKgorICogQ3VycmVudGx5IG9ubHkgb25lIGV2ZW50IGNhbiBiZSBwcm9jZXNzZWQgYXQgYSB0aW1lLgorICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IF9ldmVudF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3ZvaWQgZG1ldmVudGRfbHZtMl9sb2NrKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZfZXZlbnRfbXV0ZXgpOworfQorCit2b2lkIGRtZXZlbnRkX2x2bTJfdW5sb2NrKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF91bmxvY2soJl9ldmVudF9tdXRleCk7Cit9CisKK2ludCBkbWV2ZW50ZF9sdm0yX2luaXQodm9pZCkKK3sKKwlpbnQgciA9IDA7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJl9yZWdpc3Rlcl9tdXRleCk7CisKKwlpZiAoIV9sdm1faGFuZGxlKSB7CisJCWx2bTJfbG9nX2ZuKF9sdm0yX3ByaW50X2xvZyk7CisKKwkJaWYgKCEoX2x2bV9oYW5kbGUgPSBsdm0yX2luaXQoKSkpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBOZWVkIHNvbWUgc3BhY2UgZm9yIGFsbG9jYXRpb25zLiAgMTAyNCBzaG91bGQgYmUgbW9yZQorCQkgKiB0aGFuIGVub3VnaCBmb3Igd2hhdCB3ZSBuZWVkIChkZXZpY2UgbWFwcGVyIG5hbWUgc3BsaXR0aW5nKQorCQkgKi8KKwkJaWYgKCFfbWVtX3Bvb2wgJiYgIShfbWVtX3Bvb2wgPSBkbV9wb29sX2NyZWF0ZSgibWlycm9yX2RzbyIsIDEwMjQpKSkgeworCQkJbHZtMl9leGl0KF9sdm1faGFuZGxlKTsKKwkJCV9sdm1faGFuZGxlID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbHZtMl9kaXNhYmxlX2RtZXZlbnRkX21vbml0b3JpbmcoX2x2bV9oYW5kbGUpOworCQkvKiBGSVhNRSBUZW1wb3Jhcnk6IG1vdmUgdG8gZG1ldmVudGQgY29yZSAqLworCQlsdm0yX3J1bihfbHZtX2hhbmRsZSwgIl9tZW1sb2NrX2luYyIpOworCQlsb2dfZGVidWcoImx2bSBwbHVnaW4gaW5pdGlsaXplZC4iKTsKKwl9CisKKwlfcmVnaXN0ZXJfY291bnQrKzsKKwlyID0gMTsKKworb3V0OgorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfcmVnaXN0ZXJfbXV0ZXgpOworCXJldHVybiByOworfQorCit2b2lkIGRtZXZlbnRkX2x2bTJfZXhpdCh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX3JlZ2lzdGVyX211dGV4KTsKKworCWlmICghLS1fcmVnaXN0ZXJfY291bnQpIHsKKwkJbG9nX2RlYnVnKCJsdm0gcGx1Z2luIHNodXRpbmcgZG93bi4iKTsKKwkJbHZtMl9ydW4oX2x2bV9oYW5kbGUsICJfbWVtbG9ja19kZWMiKTsKKwkJZG1fcG9vbF9kZXN0cm95KF9tZW1fcG9vbCk7CisJCV9tZW1fcG9vbCA9IE5VTEw7CisJCWx2bTJfZXhpdChfbHZtX2hhbmRsZSk7CisJCV9sdm1faGFuZGxlID0gTlVMTDsKKwkJbG9nX2RlYnVnKCJsdm0gcGx1Z2luIGV4aXRlZC4iKTsKKwl9CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmX3JlZ2lzdGVyX211dGV4KTsKK30KKworc3RydWN0IGRtX3Bvb2wgKmRtZXZlbnRkX2x2bTJfcG9vbCh2b2lkKQoreworCXJldHVybiBfbWVtX3Bvb2w7Cit9CisKK2ludCBkbWV2ZW50ZF9sdm0yX3J1bihjb25zdCBjaGFyICpjbWRsaW5lKQoreworCXJldHVybiAobHZtMl9ydW4oX2x2bV9oYW5kbGUsIGNtZGxpbmUpID09IExWTTJfQ09NTUFORF9TVUNDRUVERUQpOworfQorCitpbnQgZG1ldmVudGRfbHZtMl9jb21tYW5kKHN0cnVjdCBkbV9wb29sICptZW0sIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgIGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqZGV2aWNlKQoreworCWNoYXIgKnZnID0gTlVMTCwgKmx2ID0gTlVMTCwgKmxheWVyOworCWludCByOworCisJaWYgKCFkbV9zcGxpdF9sdm1fbmFtZShtZW0sIGRldmljZSwgJnZnLCAmbHYsICZsYXllcikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIFZHIG5hbWUgZnJvbSAlcy4iLAorCQkJICBkZXZpY2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzdHJpcCBvZmYgdGhlIG1pcnJvciBjb21wb25lbnQgZGVzaWduYXRpb25zICovCisJaWYgKChsYXllciA9IHN0cnN0cihsdiwgIl9taW1hZ2V0bXAiKSkgfHwKKwkgICAgKGxheWVyID0gc3Ryc3RyKGx2LCAiX21sb2ciKSkpCisJCSpsYXllciA9ICdcMCc7CisKKwlyID0gZG1fc25wcmludGYoYnVmZmVyLCBzaXplLCAiJXMgJXMvJXMiLCBjbWQsIHZnLCBsdik7CisKKwlkbV9wb29sX2ZyZWUobWVtLCB2Zyk7CisKKwlpZiAociA8IDApIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZm9ybSBMVk0gY29tbWFuZC4gKHRvbyBsb25nKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9kbWV2ZW50ZF9sdm0uaCBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yL2RtZXZlbnRkX2x2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2EwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMi9kbWV2ZW50ZF9sdm0uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFdyYXBwZXJzIGFyb3VuZCBsaWJsdm0yY21kIGZ1bmN0aW9ucyBmb3IgZG1ldmVudGQgcGx1Zy1pbnMuCisgKgorICogbGlibHZtMmNtZCBpcyBub3QgdGhyZWFkLXNhZmUgc28gdGhlIGxvY2tpbmcgaW4gdGhpcyBsaWJyYXJ5IGhlbHBzIGRtZXZlbnRkCisgKiB0aHJlYWRzIHRvIGNvLW9wZXJhdGUgaW4gc2hhcmluZyBhIHNpbmdsZSBpbnN0YW5jZS4KKyAqCisgKiBGSVhNRSBFaXRoZXIgc3VwcG9ydCB0aGlzIHByb3Blcmx5IGFzIGEgZ2VuZXJpYyBsaWJsdm0yY21kIHdyYXBwZXIgb3IgbWFrZQorICogbGlibHZtMmNtZCB0aHJlYWQtc2FmZSBzbyB0aGlzIGNhbiBnbyBhd2F5LgorICovCisKKyNpZm5kZWYgX0RNRVZFTlREX0xWTVdSQVBfSAorI2RlZmluZSBfRE1FVkVOVERfTFZNV1JBUF9ICisKK3N0cnVjdCBkbV9wb29sOworCitpbnQgZG1ldmVudGRfbHZtMl9pbml0KHZvaWQpOwordm9pZCBkbWV2ZW50ZF9sdm0yX2V4aXQodm9pZCk7CitpbnQgZG1ldmVudGRfbHZtMl9ydW4oY29uc3QgY2hhciAqY21kbGluZSk7CisKK3ZvaWQgZG1ldmVudGRfbHZtMl9sb2NrKHZvaWQpOwordm9pZCBkbWV2ZW50ZF9sdm0yX3VubG9jayh2b2lkKTsKKworc3RydWN0IGRtX3Bvb2wgKmRtZXZlbnRkX2x2bTJfcG9vbCh2b2lkKTsKKworaW50IGRtZXZlbnRkX2x2bTJfY29tbWFuZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmRldmljZSk7CisKKyNkZWZpbmUgZG1ldmVudGRfbHZtMl9ydW5fd2l0aF9sb2NrKGNtZGxpbmUpIFwKKwkoe1wKKwkJaW50IHJjO1wKKwkJZG1ldmVudGRfbHZtMl9sb2NrKCk7XAorCQlyYyA9IGRtZXZlbnRkX2x2bTJfcnVuKGNtZGxpbmUpO1wKKwkJZG1ldmVudGRfbHZtMl91bmxvY2soKTtcCisJCXJjO1wKKwl9KQorCisjZGVmaW5lIGRtZXZlbnRkX2x2bTJfaW5pdF93aXRoX3Bvb2wobmFtZSwgc3QpIFwKKwkoe1wKKwkJc3RydWN0IGRtX3Bvb2wgKm1lbTtcCisJCXN0ID0gTlVMTDtcCisJCWlmIChkbWV2ZW50ZF9sdm0yX2luaXQoKSkge1wKKwkJCWlmICgobWVtID0gZG1fcG9vbF9jcmVhdGUobmFtZSwgMjA0OCkpICYmXAorCQkJICAgIChzdCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpzdCkpKSlcCisJCQkJc3QtPm1lbSA9IG1lbTtcCisJCQllbHNlIHtcCisJCQkJaWYgKG1lbSlcCisJCQkJCWRtX3Bvb2xfZGVzdHJveShtZW0pO1wKKwkJCQlkbWV2ZW50ZF9sdm0yX2V4aXQoKTtcCisJCQl9XAorCQl9XAorCQlzdDtcCisJfSkKKworI2RlZmluZSBkbWV2ZW50ZF9sdm0yX2V4aXRfd2l0aF9wb29sKHBvb2wpIFwKKwlkbyB7XAorCQlkbV9wb29sX2Rlc3Ryb3kocG9vbC0+bWVtKTtcCisJCWRtZXZlbnRkX2x2bTJfZXhpdCgpO1wKKwl9IHdoaWxlKDApCisKKyNlbmRpZiAvKiBfRE1FVkVOVERfTFZNV1JBUF9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yLy5leHBvcnRlZF9zeW1ib2xzIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhjNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxLDMgQEAKK3Byb2Nlc3NfZXZlbnQKK3JlZ2lzdGVyX2RldmljZQordW5yZWdpc3Rlcl9kZXZpY2UKZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9taXJyb3IvTWFrZWZpbGUuaW4gYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTY2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgMjAwOC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK0lOQ0xVREVTICs9IC1JJCh0b3Bfc3JjZGlyKS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMgorQ0xERkxBR1MgKz0gLUwkKHRvcF9idWlsZGRpcikvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL2x2bTIKKworU09VUkNFUyA9IGRtZXZlbnRkX21pcnJvci5jCisKK0xJQl9OQU1FID0gbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJtaXJyb3IKK0xJQl9TSEFSRUQgPSAkKExJQl9OQU1FKS4kKExJQl9TVUZGSVgpCitMSUJfVkVSU0lPTiA9ICQoTElCX1ZFUlNJT05fTFZNKQorCitDRkxPV19MSVNUID0gJChTT1VSQ0VTKQorQ0ZMT1dfTElTVF9UQVJHRVQgPSAkKExJQl9OQU1FKS5jZmxvdworCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworTElCUyArPSAtbGRldm1hcHBlci1ldmVudC1sdm0yIC1sZGV2bWFwcGVyCisKK2luc3RhbGxfbHZtMjogaW5zdGFsbF9kbV9wbHVnaW4KKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbWlycm9yL2RtZXZlbnRkX21pcnJvci5jIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci9kbWV2ZW50ZF9taXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEwODc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci9kbWV2ZW50ZF9taXJyb3IuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKyNpbmNsdWRlICJkbWV2ZW50ZF9sdm0uaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgkvKiBGb3IgVEFSR0VUX05BTUUqICovCisKKy8qIEZJWE1FIFJlZm9ybWF0IHRvIDgwIGNoYXIgbGluZXMuICovCisKKyNkZWZpbmUgTUVfSUdOT1JFICAgIDAKKyNkZWZpbmUgTUVfSU5TWU5DICAgIDEKKyNkZWZpbmUgTUVfRkFJTFVSRSAgIDIKKworc3RydWN0IGRzb19zdGF0ZSB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwljaGFyIGNtZF9sdnNjYW5bNTEyXTsKKwljaGFyIGNtZF9sdmNvbnZlcnRbNTEyXTsKK307CisKK0RNX0VWRU5UX0xPR19GTigibWlyciIpCisKK3N0YXRpYyB2b2lkIF9wcm9jZXNzX3N0YXR1c19jb2RlKGRtX3N0YXR1c19taXJyb3JfaGVhbHRoX3QgaGVhbHRoLAorCQkJCSB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkJIGNvbnN0IGNoYXIgKmRldl90eXBlLCBpbnQgKnIpCit7CisJLyoKKwkgKiAgICBBID0+IEFsaXZlIC0gTm8gZmFpbHVyZXMKKwkgKiAgICBEID0+IERlYWQgLSBBIHdyaXRlIGZhaWx1cmUgb2NjdXJyZWQgbGVhdmluZyBtaXJyb3Igb3V0LW9mLXN5bmMKKwkgKiAgICBGID0+IEZsdXNoIGZhaWxlZC4KKwkgKiAgICBTID0+IFN5bmMgLSBBIHN5Y2hyb25pemF0aW9uIGZhaWx1cmUgb2NjdXJyZWQsIG1pcnJvciBvdXQtb2Ytc3luYworCSAqICAgIFIgPT4gUmVhZCAtIEEgcmVhZCBmYWlsdXJlIG9jY3VycmVkLCBtaXJyb3IgZGF0YSB1bmFmZmVjdGVkCisJICogICAgVSA9PiBVbmNsYXNzaWZpZWQgZmFpbHVyZSAoYnVnKQorCSAqLyAKKwlzd2l0Y2ggKGhlYWx0aCkgeworCWNhc2UgRE1fU1RBVFVTX01JUlJPUl9BTElWRToKKwkJcmV0dXJuOworCWNhc2UgRE1fU1RBVFVTX01JUlJPUl9GTFVTSF9GQUlMRUQ6CisJCWxvZ19lcnJvcigiJXMgZGV2aWNlICV1OiV1IGZsdXNoIGZhaWxlZC4iLAorCQkJICBkZXZfdHlwZSwgbWFqb3IsIG1pbm9yKTsKKwkJKnIgPSBNRV9GQUlMVVJFOworCQlicmVhazsKKwljYXNlIERNX1NUQVRVU19NSVJST1JfU1lOQ19GQUlMRUQ6CisJCWxvZ19lcnJvcigiJXMgZGV2aWNlICV1OiV1IHN5bmMgZmFpbGVkLiIsCisJCQkgIGRldl90eXBlLCBtYWpvciwgbWlub3IpOworCQlicmVhazsKKwljYXNlIERNX1NUQVRVU19NSVJST1JfUkVBRF9GQUlMRUQ6CisJCWxvZ19lcnJvcigiJXMgZGV2aWNlICV1OiV1IHJlYWQgZmFpbGVkLiIsCisJCQkgIGRldl90eXBlLCBtYWpvciwgbWlub3IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIiVzIGRldmljZSAldToldSBoYXMgZmFpbGVkICglYykuIiwKKwkJCSAgZGV2X3R5cGUsIG1ham9yLCBtaW5vciwgKGNoYXIpaGVhbHRoKTsKKwkJKnIgPSBNRV9GQUlMVVJFOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX2dldF9taXJyb3JfZXZlbnQoc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUsIGNoYXIgKnBhcmFtcykKK3sKKwlpbnQgciA9IE1FX0lOU1lOQzsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBkbV9zdGF0dXNfbWlycm9yICptczsKKworCWlmICghZG1fZ2V0X3N0YXR1c19taXJyb3Ioc3RhdGUtPm1lbSwgcGFyYW1zLCAmbXMpKQorCQlnb3RvX291dDsKKworCS8qIENoZWNrIGZvciBiYWQgbWlycm9yIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXMtPmRldl9jb3VudDsgKytpKQorCQlfcHJvY2Vzc19zdGF0dXNfY29kZShtcy0+ZGV2c1tpXS5oZWFsdGgsCisJCQkJICAgICBtcy0+ZGV2c1tpXS5tYWpvciwgbXMtPmRldnNbaV0ubWlub3IsCisJCQkJICAgICBpID8gIlNlY29uZGFyeSBtaXJyb3IiIDogIlByaW1hcnkgbWlycm9yIiwgJnIpOworCisJLyogQ2hlY2sgZm9yIGJhZCBkaXNrIGxvZyBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXMtPmxvZ19jb3VudDsgKytpKQorCQlfcHJvY2Vzc19zdGF0dXNfY29kZShtcy0+bG9nc1tpXS5oZWFsdGgsCisJCQkJICAgICBtcy0+bG9nc1tpXS5tYWpvciwgbXMtPmxvZ3NbaV0ubWlub3IsCisJCQkJICAgICAiTG9nIiwgJnIpOworCisJLyogSWdub3JlIGlmIG5vdCBpbi1zeW5jICovCisJaWYgKChyID09IE1FX0lOU1lOQykgJiYgKG1zLT5pbnN5bmNfcmVnaW9ucyAhPSBtcy0+dG90YWxfcmVnaW9ucykpCisJCXIgPSBNRV9JR05PUkU7CisKKwlkbV9wb29sX2ZyZWUoc3RhdGUtPm1lbSwgbXMpOworCisJcmV0dXJuIHI7CisKK291dDoKKwlsb2dfZXJyb3IoIlVuYWJsZSB0byBwYXJzZSBtaXJyb3Igc3RhdHVzIHN0cmluZy4iKTsKKworCXJldHVybiBNRV9JR05PUkU7Cit9CisKK3N0YXRpYyBpbnQgX3JlbW92ZV9mYWlsZWRfZGV2aWNlcyhjb25zdCBjaGFyICpjbWRfbHZzY2FuLCBjb25zdCBjaGFyICpjbWRfbHZjb252ZXJ0KQoreworCWludCByOworCisJaWYgKCFkbWV2ZW50ZF9sdm0yX3J1bl93aXRoX2xvY2soY21kX2x2c2NhbikpCisJCWxvZ19pbmZvKCJSZS1zY2FuIG9mIG1pcnJvcmVkIGRldmljZSBmYWlsZWQuIik7CisKKwkvKiBpZiByZXBhaXIgZ29lcyBPSywgcmVwb3J0IHN1Y2Nlc3MgZXZlbiBpZiBsdnNjYW4gaGFzIGZhaWxlZCAqLworCXIgPSBkbWV2ZW50ZF9sdm0yX3J1bl93aXRoX2xvY2soY21kX2x2Y29udmVydCk7CisKKwlsb2dfaW5mbygiUmVwYWlyIG9mIG1pcnJvcmVkIGRldmljZSAlcy4iLAorCQkgKHIpID8gImZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIgOiAiZmFpbGVkIik7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBwcm9jZXNzX2V2ZW50KHN0cnVjdCBkbV90YXNrICpkbXQsCisJCSAgIGVudW0gZG1fZXZlbnRfbWFzayBldmVudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgdm9pZCAqKnVzZXIpCit7CisJc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUgPSAqdXNlcjsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnRhcmdldF90eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXM7CisJY29uc3QgY2hhciAqZGV2aWNlID0gZG1fdGFza19nZXRfbmFtZShkbXQpOworCisJZG8geworCQluZXh0ID0gZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLAorCQkJCQkgICZ0YXJnZXRfdHlwZSwgJnBhcmFtcyk7CisKKwkJaWYgKCF0YXJnZXRfdHlwZSkgeworCQkJbG9nX2luZm8oIiVzIG1hcHBpbmcgbG9zdC4iLCBkZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRhcmdldF90eXBlLCBUQVJHRVRfTkFNRV9NSVJST1IpKSB7CisJCQlsb2dfaW5mbygiJXMgaGFzIHVubWlycm9yZWQgcG9ydGlvbi4iLCBkZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2goX2dldF9taXJyb3JfZXZlbnQoc3RhdGUsIHBhcmFtcykpIHsKKwkJY2FzZSBNRV9JTlNZTkM6CisJCQkvKiBGSVhNRTogYWxsIHdlIHJlYWxseSBrbm93IGlzIHRoYXQgdGhpcworCQkJICAgX3BhcnRfIG9mIHRoZSBkZXZpY2UgaXMgaW4gc3luYworCQkJICAgQWxzbywgdGhpcyBpcyBub3QgYW4gZXJyb3IKKwkJCSovCisJCQlsb2dfbm90aWNlKCIlcyBpcyBub3cgaW4tc3luYy4iLCBkZXZpY2UpOworCQkJYnJlYWs7CisJCWNhc2UgTUVfRkFJTFVSRToKKwkJCWxvZ19lcnJvcigiRGV2aWNlIGZhaWx1cmUgaW4gJXMuIiwgZGV2aWNlKTsKKwkJCWlmICghX3JlbW92ZV9mYWlsZWRfZGV2aWNlcyhzdGF0ZS0+Y21kX2x2c2NhbiwKKwkJCQkJCSAgICBzdGF0ZS0+Y21kX2x2Y29udmVydCkpCisJCQkJLyogRklYTUUgV2h5IGFyZSBhbGwgdGhlIGVycm9yIHJldHVybiBjb2RlcyB1bnVzZWQ/IEdldCByaWQgb2YgdGhlbT8gKi8KKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZW1vdmUgZmF1bHR5IGRldmljZXMgaW4gJXMuIiwKKwkJCQkJICBkZXZpY2UpOworCQkJLyogU2hvdWxkIGNoZWNrIGJlZm9yZSB3YXJuaW5nIHVzZXIgdGhhdCBkZXZpY2UgaXMgbm93IGxpbmVhcgorCQkJZWxzZQorCQkJCWxvZ19ub3RpY2UoIiVzIGlzIG5vdyBhIGxpbmVhciBkZXZpY2UuIiwKKwkJCQkJICAgZGV2aWNlKTsKKwkJCSovCisJCQlicmVhazsKKwkJY2FzZSBNRV9JR05PUkU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEZJWE1FIFByb3ZpZGUgdmFsdWUgdGhlbiEgKi8KKwkJCWxvZ19pbmZvKCJVbmtub3duIGV2ZW50IHJlY2VpdmVkLiIpOworCQl9CisJfSB3aGlsZSAobmV4dCk7Cit9CisKK2ludCByZWdpc3Rlcl9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLAorCQkgICAgY29uc3QgY2hhciAqdXVpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgIGludCBtYWpvciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgIGludCBtaW5vciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgIHZvaWQgKip1c2VyKQoreworCXN0cnVjdCBkc29fc3RhdGUgKnN0YXRlOworCisJaWYgKCFkbWV2ZW50ZF9sdm0yX2luaXRfd2l0aF9wb29sKCJtaXJyb3Jfc3RhdGUiLCBzdGF0ZSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbWV2ZW50ZF9sdm0yX2NvbW1hbmQoc3RhdGUtPm1lbSwgc3RhdGUtPmNtZF9sdnNjYW4sIHNpemVvZihzdGF0ZS0+Y21kX2x2c2NhbiksCisJCQkJICAgImx2c2NhbiAtLWNhY2hlIiwgZGV2aWNlKSkgeworCQlkbWV2ZW50ZF9sdm0yX2V4aXRfd2l0aF9wb29sKHN0YXRlKTsKKwkJZ290b19iYWQ7CisJfQorCisJaWYgKCFkbWV2ZW50ZF9sdm0yX2NvbW1hbmQoc3RhdGUtPm1lbSwgc3RhdGUtPmNtZF9sdmNvbnZlcnQsIHNpemVvZihzdGF0ZS0+Y21kX2x2Y29udmVydCksCisJCQkJICAgImx2Y29udmVydCAtLXJlcGFpciAtLXVzZS1wb2xpY2llcyIsIGRldmljZSkpIHsKKwkJZG1ldmVudGRfbHZtMl9leGl0X3dpdGhfcG9vbChzdGF0ZSk7CisJCWdvdG9fYmFkOworCX0KKworCSp1c2VyID0gc3RhdGU7CisKKwlsb2dfaW5mbygiTW9uaXRvcmluZyBtaXJyb3IgZGV2aWNlICVzIGZvciBldmVudHMuIiwgZGV2aWNlKTsKKworCXJldHVybiAxOworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIG1vbml0b3IgbWlycm9yICVzLiIsIGRldmljZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVucmVnaXN0ZXJfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwKKwkJICAgICAgY29uc3QgY2hhciAqdXVpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IG1ham9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICBpbnQgbWlub3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIHZvaWQgKip1c2VyKQoreworCXN0cnVjdCBkc29fc3RhdGUgKnN0YXRlID0gKnVzZXI7CisKKwlkbWV2ZW50ZF9sdm0yX2V4aXRfd2l0aF9wb29sKHN0YXRlKTsKKwlsb2dfaW5mbygiTm8gbG9uZ2VyIG1vbml0b3JpbmcgbWlycm9yIGRldmljZSAlcyBmb3IgZXZlbnRzLiIsCisJCSBkZXZpY2UpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC8uZXhwb3J0ZWRfc3ltYm9scyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9yYWlkLy5leHBvcnRlZF9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGM3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxLDMgQEAKK3Byb2Nlc3NfZXZlbnQKK3JlZ2lzdGVyX2RldmljZQordW5yZWdpc3Rlcl9kZXZpY2UKZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9yYWlkL01ha2VmaWxlLmluIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3JhaWQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjYThiMgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9yYWlkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworSU5DTFVERVMgKz0gLUkkKHRvcF9zcmNkaXIpL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yCitDTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMgorCitTT1VSQ0VTID0gZG1ldmVudGRfcmFpZC5jCisKK0xJQl9OQU1FID0gbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJyYWlkCitMSUJfU0hBUkVEID0gJChMSUJfTkFNRSkuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworQ0ZMT1dfTElTVCA9ICQoU09VUkNFUykKK0NGTE9XX0xJU1RfVEFSR0VUID0gJChMSUJfTkFNRSkuY2Zsb3cKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK0xJQlMgKz0gLWxkZXZtYXBwZXItZXZlbnQtbHZtMiAtbGRldm1hcHBlcgorCitpbnN0YWxsX2x2bTI6IGluc3RhbGxfZG1fcGx1Z2luCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3JhaWQvZG1ldmVudGRfcmFpZC5jIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3JhaWQvZG1ldmVudGRfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGZiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvcmFpZC9kbWV2ZW50ZF9yYWlkLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZG1ldmVudGRfbHZtLmgiCisjaW5jbHVkZSAibGliZGV2bWFwcGVyLWV2ZW50LmgiCisKK3N0cnVjdCBkc29fc3RhdGUgeworCXN0cnVjdCBkbV9wb29sICptZW07CisJY2hhciBjbWRfbHZzY2FuWzUxMl07CisJY2hhciBjbWRfbHZjb252ZXJ0WzUxMl07CisJaW50IGZhaWxlZDsKK307CisKK0RNX0VWRU5UX0xPR19GTigicmFpZCIpCisKKy8qIEZJWE1FIFJlZm9ybWF0IHRvIDgwIGNoYXIgbGluZXMuICovCisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfcmFpZF9ldmVudChzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZSwgY2hhciAqcGFyYW1zLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisJc3RydWN0IGRtX3N0YXR1c19yYWlkICpzdGF0dXM7CisJY29uc3QgY2hhciAqZDsKKworCWlmICghZG1fZ2V0X3N0YXR1c19yYWlkKHN0YXRlLT5tZW0sIHBhcmFtcywgJnN0YXR1cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcHJvY2VzcyBzdGF0dXMgbGluZSBmb3IgJXMuIiwgZGV2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChkID0gc3RyY2hyKHN0YXR1cy0+ZGV2X2hlYWx0aCwgJ0QnKSkpIHsKKwkJaWYgKHN0YXRlLT5mYWlsZWQpCisJCQlnb3RvIG91dDsgLyogYWxyZWFkeSByZXBvcnRlZCAqLworCisJCWxvZ19lcnJvcigiRGV2aWNlICMlZCBvZiAlcyBhcnJheSwgJXMsIGhhcyBmYWlsZWQuIiwKKwkJCSAgKGludCkoZCAtIHN0YXR1cy0+ZGV2X2hlYWx0aCksCisJCQkgIHN0YXR1cy0+cmFpZF90eXBlLCBkZXZpY2UpOworCisJCXN0YXRlLT5mYWlsZWQgPSAxOworCQlpZiAoIWRtZXZlbnRkX2x2bTJfcnVuX3dpdGhfbG9jayhzdGF0ZS0+Y21kX2x2c2NhbikpCisJCQlsb2dfd2FybigiV0FSTklORzogUmUtc2NhbiBvZiBSQUlEIGRldmljZSAlcyBmYWlsZWQuIiwgZGV2aWNlKTsKKworCQkvKiBpZiByZXBhaXIgZ29lcyBPSywgcmVwb3J0IHN1Y2Nlc3MgZXZlbiBpZiBsdnNjYW4gaGFzIGZhaWxlZCAqLworCQlpZiAoIWRtZXZlbnRkX2x2bTJfcnVuX3dpdGhfbG9jayhzdGF0ZS0+Y21kX2x2Y29udmVydCkpIHsKKwkJCWxvZ19pbmZvKCJSZXBhaXIgb2YgUkFJRCBkZXZpY2UgJXMgZmFpbGVkLiIsIGRldmljZSk7CisJCQlkbV9wb29sX2ZyZWUoc3RhdGUtPm1lbSwgc3RhdHVzKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdGUtPmZhaWxlZCA9IDA7CisJCWxvZ19pbmZvKCIlcyBhcnJheSwgJXMsIGlzICVzIGluLXN5bmMuIiwKKwkJCSBzdGF0dXMtPnJhaWRfdHlwZSwgZGV2aWNlLAorCQkJIChzdGF0dXMtPmluc3luY19yZWdpb25zID09IHN0YXR1cy0+dG90YWxfcmVnaW9ucykgPyAibm93IiA6ICJub3QiKTsKKwl9CitvdXQ6CisJZG1fcG9vbF9mcmVlKHN0YXRlLT5tZW0sIHN0YXR1cyk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBwcm9jZXNzX2V2ZW50KHN0cnVjdCBkbV90YXNrICpkbXQsCisJCSAgIGVudW0gZG1fZXZlbnRfbWFzayBldmVudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgdm9pZCAqKnVzZXIpCit7CisJc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUgPSAqdXNlcjsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnRhcmdldF90eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXM7CisJY29uc3QgY2hhciAqZGV2aWNlID0gZG1fdGFza19nZXRfbmFtZShkbXQpOworCisJZG8geworCQluZXh0ID0gZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLAorCQkJCQkgICZ0YXJnZXRfdHlwZSwgJnBhcmFtcyk7CisKKwkJaWYgKCF0YXJnZXRfdHlwZSkgeworCQkJbG9nX2luZm8oIiVzIG1hcHBpbmcgbG9zdC4iLCBkZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRhcmdldF90eXBlLCAicmFpZCIpKSB7CisJCQlsb2dfaW5mbygiJXMgaGFzIG5vbi1yYWlkIHBvcnRpb24uIiwgZGV2aWNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFfcHJvY2Vzc19yYWlkX2V2ZW50KHN0YXRlLCBwYXJhbXMsIGRldmljZSkpCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBwcm9jZXNzIGV2ZW50IGZvciAlcy4iLAorCQkJCSAgZGV2aWNlKTsKKwl9IHdoaWxlIChuZXh0KTsKK30KKworaW50IHJlZ2lzdGVyX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UsCisJCSAgICBjb25zdCBjaGFyICp1dWlkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgaW50IG1ham9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgaW50IG1pbm9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgdm9pZCAqKnVzZXIpCit7CisJc3RydWN0IGRzb19zdGF0ZSAqc3RhdGU7CisKKwlpZiAoIWRtZXZlbnRkX2x2bTJfaW5pdF93aXRoX3Bvb2woInJhaWRfc3RhdGUiLCBzdGF0ZSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbWV2ZW50ZF9sdm0yX2NvbW1hbmQoc3RhdGUtPm1lbSwgc3RhdGUtPmNtZF9sdnNjYW4sIHNpemVvZihzdGF0ZS0+Y21kX2x2c2NhbiksCisJCQkJICAgImx2c2NhbiAtLWNhY2hlIiwgZGV2aWNlKSB8fAorCSAgICAhZG1ldmVudGRfbHZtMl9jb21tYW5kKHN0YXRlLT5tZW0sIHN0YXRlLT5jbWRfbHZjb252ZXJ0LCBzaXplb2Yoc3RhdGUtPmNtZF9sdmNvbnZlcnQpLAorCQkJCSAgICJsdmNvbnZlcnQgLS1jb25maWcgZGV2aWNlc3tpZ25vcmVfc3VzcGVuZGVkX2RldmljZXM9MX0gIgorCQkJCSAgICItLXJlcGFpciAtLXVzZS1wb2xpY2llcyIsIGRldmljZSkpIHsKKwkJZG1ldmVudGRfbHZtMl9leGl0X3dpdGhfcG9vbChzdGF0ZSk7CisJCWdvdG9fYmFkOworCX0KKworCSp1c2VyID0gc3RhdGU7CisKKwlsb2dfaW5mbygiTW9uaXRvcmluZyBSQUlEIGRldmljZSAlcyBmb3IgZXZlbnRzLiIsIGRldmljZSk7CisKKwlyZXR1cm4gMTsKK2JhZDoKKwlsb2dfZXJyb3IoIkZhaWxlZCB0byBtb25pdG9yIFJBSUQgJXMuIiwgZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCitpbnQgdW5yZWdpc3Rlcl9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLAorCQkgICAgICBjb25zdCBjaGFyICp1dWlkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICBpbnQgbWFqb3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIGludCBtaW5vciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgdm9pZCAqKnVzZXIpCit7CisJc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUgPSAqdXNlcjsKKworCWRtZXZlbnRkX2x2bTJfZXhpdF93aXRoX3Bvb2woc3RhdGUpOworCWxvZ19pbmZvKCJObyBsb25nZXIgbW9uaXRvcmluZyBSQUlEIGRldmljZSAlcyBmb3IgZXZlbnRzLiIsCisJCSBkZXZpY2UpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvc25hcHNob3QvLmV4cG9ydGVkX3N5bWJvbHMgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvc25hcHNob3QvLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4YzcwNQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxLDMgQEAKK3Byb2Nlc3NfZXZlbnQKK3JlZ2lzdGVyX2RldmljZQordW5yZWdpc3Rlcl9kZXZpY2UKZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI3YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3NuYXBzaG90L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworSU5DTFVERVMgKz0gLUkkKHRvcF9zcmNkaXIpL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yCitDTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvbHZtMgorCitTT1VSQ0VTID0gZG1ldmVudGRfc25hcHNob3QuYworCitMSUJfU0hBUkVEID0gbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJzbmFwc2hvdC4kKExJQl9TVUZGSVgpCitMSUJfVkVSU0lPTiA9ICQoTElCX1ZFUlNJT05fTFZNKQorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworTElCUyArPSAtbGRldm1hcHBlci1ldmVudC1sdm0yIC1sZGV2bWFwcGVyCisKK2luc3RhbGxfbHZtMjogaW5zdGFsbF9kbV9wbHVnaW4KKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvc25hcHNob3QvZG1ldmVudGRfc25hcHNob3QuYyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9zbmFwc2hvdC9kbWV2ZW50ZF9zbmFwc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDYwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvc25hcHNob3QvZG1ldmVudGRfc25hcHNob3QuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkbWV2ZW50ZF9sdm0uaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvKiBGaXJzdCB3YXJuaW5nIHdoZW4gc25hcHNob3QgaXMgODAlIGZ1bGwuICovCisjZGVmaW5lIFdBUk5JTkdfVEhSRVNICShETV9QRVJDRU5UXzEgKiA4MCkKKy8qIFJ1biBhIGNoZWNrIGV2ZXJ5IDUlLiAqLworI2RlZmluZSBDSEVDS19TVEVQCShETV9QRVJDRU5UXzEgKiAgNSkKKy8qIERvIG5vdCBib3RoZXIgY2hlY2tpbmcgc25hcHNob3RzIGxlc3MgdGhhbiA1MCUgZnVsbC4gKi8KKyNkZWZpbmUgQ0hFQ0tfTUlOSU1VTQkoRE1fUEVSQ0VOVF8xICogNTApCisKKyNkZWZpbmUgVU1PVU5UX0NPTU1BTkQgIi9iaW4vdW1vdW50IgorCitzdHJ1Y3QgZHNvX3N0YXRlIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCWRtX3BlcmNlbnRfdCBwZXJjZW50X2NoZWNrOworCXVpbnQ2NF90IGtub3duX3NpemU7CisJY2hhciBjbWRfbHZleHRlbmRbNTEyXTsKK307CisKK0RNX0VWRU5UX0xPR19GTigic25hcCIpCisKK3N0YXRpYyBpbnQgX3J1bihjb25zdCBjaGFyICpjbWQsIC4uLikKK3sKKyAgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICAgaW50IGFyZ2MgPSAxOyAvKiBmb3IgYXJndlswXSwgaS5lLiBjbWQgKi8KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBjb25zdCBjaGFyICoqYXJndjsKKyAgICAgICAgcGlkX3QgcGlkID0gZm9yaygpOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIGlmIChwaWQgPT0gMCkgeyAvKiBjaGlsZCAqLworICAgICAgICAgICAgICAgIHZhX3N0YXJ0KGFwLCBjbWQpOworICAgICAgICAgICAgICAgIHdoaWxlICh2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKikpCisgICAgICAgICAgICAgICAgICAgICAgICArKyBhcmdjOworICAgICAgICAgICAgICAgIHZhX2VuZChhcCk7CisKKyAgICAgICAgICAgICAgICAvKiArIDEgZm9yIHRoZSB0ZXJtaW5hdGluZyBOVUxMICovCisgICAgICAgICAgICAgICAgYXJndiA9IGFsbG9jYShzaXplb2YoY29uc3QgY2hhciAqKSAqIChhcmdjICsgMSkpOworCisgICAgICAgICAgICAgICAgYXJndlswXSA9IGNtZDsKKyAgICAgICAgICAgICAgICB2YV9zdGFydChhcCwgY21kKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGFyZ3ZbKytpXSA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKSkpOworICAgICAgICAgICAgICAgIHZhX2VuZChhcCk7CisKKyAgICAgICAgICAgICAgICBleGVjdnAoY21kLCAoY2hhciAqKilhcmd2KTsKKyAgICAgICAgICAgICAgICBsb2dfc3lzX2Vycm9yKCJleGVjIiwgY21kKTsKKyAgICAgICAgICAgICAgICBleGl0KDEyNyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGlkID4gMCkgeyAvKiBwYXJlbnQgKi8KKyAgICAgICAgICAgICAgICBpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiB3YWl0cGlkIGZhaWxlZCAqLworICAgICAgICAgICAgICAgIGlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiB0aGUgY2hpbGQgZmFpbGVkICovCisgICAgICAgIH0KKworICAgICAgICBpZiAocGlkIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogZm9yayBmYWlsZWQgKi8KKworICAgICAgICByZXR1cm4gMTsgLyogYWxsIGdvb2QgKi8KK30KKworc3RhdGljIGludCBfZXh0ZW5kKGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlsb2dfZGVidWcoIkV4dGVuZGluZyBzbmFwc2hvdCB2aWEgJXMuIiwgY21kKTsKKwlyZXR1cm4gZG1ldmVudGRfbHZtMl9ydW5fd2l0aF9sb2NrKGNtZCk7Cit9CisKKyNpZmRlZiBTTkFQU0hPVF9SRU1PVkUKKy8qIFJlbW92ZSBpbnZhbGlkIHNuYXBzaG90IGZyb20gZG0tdGFibGUgKi8KKy8qIEV4cGVyaW1lbnRhbCBmb3Igbm93IGFuZCBub3QgdXNlZCBieSBkZWZhdWx0ICovCitzdGF0aWMgaW50IF9yZW1vdmUoY29uc3QgY2hhciAqdXVpZCkKK3sKKwlpbnQgciA9IDE7CisJdWludDMyX3QgY29va2llID0gMDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1JFTU9WRSkpKQorCQlyZXR1cm4gMDsKKworCWlmICghZG1fdGFza19zZXRfdXVpZChkbXQsIHV1aWQpKSB7CisJCXIgPSAwOworCQlnb3RvX291dDsKKwl9CisKKwlkbV90YXNrX3JldHJ5X3JlbW92ZShkbXQpOworCisJaWYgKCFkbV90YXNrX3NldF9jb29raWUoZG10LCAmY29va2llLCAwKSkgeworCQlyID0gMDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKSB7CisJCXIgPSAwOworCQlnb3RvX291dDsKKwl9CitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKyNlbmRpZiAvKiBTTkFQU0hPVF9SRU1PVkUgKi8KKworc3RhdGljIHZvaWQgX3Vtb3VudChjb25zdCBjaGFyICpkZXZpY2UsIGludCBtYWpvciwgaW50IG1pbm9yKQoreworCUZJTEUgKm1vdW50czsKKwljaGFyIGJ1ZmZlcls0MDk2XTsKKwljaGFyICp3b3Jkc1szXTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyIHByb2Ntb3VudHNbXSA9ICIvcHJvYy9tb3VudHMiOworCisJaWYgKCEobW91bnRzID0gZm9wZW4ocHJvY21vdW50cywgInIiKSkpIHsKKwkJbG9nX3N5c19lcnJvcigiZm9wZW4iLCBwcm9jbW91bnRzKTsKKwkJbG9nX2Vycm9yKCJOb3QgdW1vdW50aW5nICVzLiIsIGRldmljZSk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoIWZlb2YobW91bnRzKSkgeworCQkvKiByZWFkIGEgbGluZSBvZiAvcHJvYy9tb3VudHMgKi8KKwkJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBtb3VudHMpKQorCQkJYnJlYWs7IC8qIGVvZiwgbGlrZWx5ICovCisKKwkJLyogd29yZHNbMF0gaXMgdGhlIG1vdW50IHBvaW50IGFuZCB3b3Jkc1sxXSBpcyB0aGUgZGV2aWNlIHBhdGggKi8KKwkJaWYgKGRtX3NwbGl0X3dvcmRzKGJ1ZmZlciwgMywgMCwgd29yZHMpIDwgMikKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgdGhlIG1ham9yL21pbm9yIG9mIHRoZSBkZXZpY2UgKi8KKwkJaWYgKHN0YXQod29yZHNbMF0sICZzdCkpCisJCQljb250aW51ZTsgLyogY2FuJ3Qgc3RhdCwgc2tpcCB0aGlzIG9uZSAqLworCisJCWlmIChTX0lTQkxLKHN0LnN0X21vZGUpICYmCisJCSAgICAoaW50KSBtYWpvcihzdC5zdF9yZGV2KSA9PSBtYWpvciAmJgorCQkgICAgKGludCkgbWlub3Ioc3Quc3RfcmRldikgPT0gbWlub3IpIHsKKwkJCWxvZ19lcnJvcigiVW5tb3VudGluZyBpbnZhbGlkIHNuYXBzaG90ICVzIGZyb20gJXMuIiwgZGV2aWNlLCB3b3Jkc1sxXSk7CisJCQlpZiAoIV9ydW4oVU1PVU5UX0NPTU1BTkQsICItZmwiLCB3b3Jkc1sxXSwgTlVMTCkpCisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdW1vdW50IHNuYXBzaG90ICVzIGZyb20gJXM6ICVzLiIsCisJCQkJCSAgZGV2aWNlLCB3b3Jkc1sxXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKworCWlmIChmY2xvc2UobW91bnRzKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBwcm9jbW91bnRzKTsKK30KKwordm9pZCBwcm9jZXNzX2V2ZW50KHN0cnVjdCBkbV90YXNrICpkbXQsCisJCSAgIGVudW0gZG1fZXZlbnRfbWFzayBldmVudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgdm9pZCAqKnVzZXIpCit7CisJc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUgPSAqdXNlcjsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnRhcmdldF90eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXM7CisJc3RydWN0IGRtX3N0YXR1c19zbmFwc2hvdCAqc3RhdHVzID0gTlVMTDsKKwljb25zdCBjaGFyICpkZXZpY2UgPSBkbV90YXNrX2dldF9uYW1lKGRtdCk7CisJaW50IHBlcmNlbnQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKworCS8qIE5vIGxvbmdlciBtb25pdG9yaW5nLCB3YWl0aW5nIGZvciByZW1vdmUgKi8KKwlpZiAoIXN0YXRlLT5wZXJjZW50X2NoZWNrKQorCQlyZXR1cm47CisKKwlkbV9nZXRfbmV4dF90YXJnZXQoZG10LCBuZXh0LCAmc3RhcnQsICZsZW5ndGgsICZ0YXJnZXRfdHlwZSwgJnBhcmFtcyk7CisJaWYgKCF0YXJnZXRfdHlwZSB8fCBzdHJjbXAodGFyZ2V0X3R5cGUsICJzbmFwc2hvdCIpKSB7CisJCWxvZ19lcnJvcigiVGFyZ2V0ICVzIGlzIG5vdCBzbmFwc2hvdC4iLCB0YXJnZXRfdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWRtX2dldF9zdGF0dXNfc25hcHNob3Qoc3RhdGUtPm1lbSwgcGFyYW1zLCAmc3RhdHVzKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBwYXJzZSBzbmFwc2hvdCAlcyBzdGF0ZTogJXMuIiwgZGV2aWNlLCBwYXJhbXMpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgc25hcHNob3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQgb3Igd2UgZmFpbGVkIHRvIHBhcnNlCisJICogdGhlIHN0YXR1cyBzdHJpbmcuIFJlcG9ydCB0aGUgZnVsbCBzdGF0dXMgc3RyaW5nIHRvIHN5c2xvZy4KKwkgKi8KKwlpZiAoc3RhdHVzLT5pbnZhbGlkIHx8IHN0YXR1cy0+b3ZlcmZsb3cgfHwgIXN0YXR1cy0+dG90YWxfc2VjdG9ycykgeworCQlsb2dfd2FybigiV0FSTklORzogU25hcHNob3QgJXMgY2hhbmdlZCBzdGF0ZSB0bzogJXMgYW5kIHNob3VsZCBiZSByZW1vdmVkLiIsCisJCQkgZGV2aWNlLCBwYXJhbXMpOworCQlzdGF0ZS0+cGVyY2VudF9jaGVjayA9IDA7CisJCWlmIChkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pKQorCQkJX3Vtb3VudChkZXZpY2UsIGluZm8ubWFqb3IsIGluZm8ubWlub3IpOworI2lmZGVmIFNOQVBTSE9UX1JFTU9WRQorCQkvKiBNYXliZSBjb25maWd1cmFibGUgPyAqLworCQlfcmVtb3ZlKGRtX3Rhc2tfZ2V0X3V1aWQoZG10KSk7CisjZW5kaWYKKwkJcHRocmVhZF9raWxsKHB0aHJlYWRfc2VsZigpLCBTSUdBTFJNKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlbmd0aCA8PSAoc3RhdHVzLT51c2VkX3NlY3RvcnMgLSBzdGF0dXMtPm1ldGFkYXRhX3NlY3RvcnMpKSB7CisJCS8qIFRPRE8gZXZlbnR1YWxseSByZWNvZ25pemUgZWFybGllciB3aGVuIHJvb20gaXMgZW5vdWdoICovCisJCWxvZ19pbmZvKCJEcm9wcGluZyBtb25pdG9yaW5nIG9mIGZ1bGx5IHByb3Zpc2lvbmVkIHNuYXBzaG90ICVzLiIsCisJCQkgZGV2aWNlKTsKKwkJcHRocmVhZF9raWxsKHB0aHJlYWRfc2VsZigpLCBTSUdBTFJNKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU25hcHNob3Qgc2l6ZSBoYWQgY2hhbmdlZC4gQ2xlYXIgdGhlIHRocmVzaG9sZC4gKi8KKwlpZiAoc3RhdGUtPmtub3duX3NpemUgIT0gc3RhdHVzLT50b3RhbF9zZWN0b3JzKSB7CisJCXN0YXRlLT5wZXJjZW50X2NoZWNrID0gQ0hFQ0tfTUlOSU1VTTsKKwkJc3RhdGUtPmtub3duX3NpemUgPSBzdGF0dXMtPnRvdGFsX3NlY3RvcnM7CisJfQorCisJcGVyY2VudCA9IGRtX21ha2VfcGVyY2VudChzdGF0dXMtPnVzZWRfc2VjdG9ycywgc3RhdHVzLT50b3RhbF9zZWN0b3JzKTsKKwlpZiAocGVyY2VudCA+PSBzdGF0ZS0+cGVyY2VudF9jaGVjaykgeworCQkvKiBVc2FnZSBoYXMgcmFpc2VkIG1vcmUgdGhhbiBDSEVDS19TVEVQIHNpbmNlIHRoZSBsYXN0CisJCSAgIHRpbWUuIFJ1biBhY3Rpb25zLiAqLworCQlzdGF0ZS0+cGVyY2VudF9jaGVjayA9IChwZXJjZW50IC8gQ0hFQ0tfU1RFUCkgKiBDSEVDS19TVEVQICsgQ0hFQ0tfU1RFUDsKKworCQlpZiAocGVyY2VudCA+PSBXQVJOSU5HX1RIUkVTSCkgLyogUHJpbnQgYSB3YXJuaW5nIHRvIHN5c2xvZy4gKi8KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBTbmFwc2hvdCAlcyBpcyBub3cgJS4yZiUlIGZ1bGwuIiwKKwkJCQkgZGV2aWNlLCBkbV9wZXJjZW50X3RvX2Zsb2F0KHBlcmNlbnQpKTsKKworCQkvKiBUcnkgdG8gZXh0ZW5kIHRoZSBzbmFwc2hvdCwgaW4gYWNjb3JkIHdpdGggdXNlci1zZXQgcG9saWNpZXMgKi8KKwkJaWYgKCFfZXh0ZW5kKHN0YXRlLT5jbWRfbHZleHRlbmQpKQorCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZXh0ZW5kIHNuYXBzaG90ICVzLiIsIGRldmljZSk7CisJfQorb3V0OgorCWRtX3Bvb2xfZnJlZShzdGF0ZS0+bWVtLCBzdGF0dXMpOworfQorCitpbnQgcmVnaXN0ZXJfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwKKwkJICAgIGNvbnN0IGNoYXIgKnV1aWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBpbnQgbWFqb3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBpbnQgbWlub3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICB2b2lkICoqdXNlcikKK3sKKwlzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZTsKKworCWlmICghZG1ldmVudGRfbHZtMl9pbml0X3dpdGhfcG9vbCgic25hcHNob3Rfc3RhdGUiLCBzdGF0ZSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbWV2ZW50ZF9sdm0yX2NvbW1hbmQoc3RhdGUtPm1lbSwgc3RhdGUtPmNtZF9sdmV4dGVuZCwKKwkJCQkgICBzaXplb2Yoc3RhdGUtPmNtZF9sdmV4dGVuZCksCisJCQkJICAgImx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzIiwgZGV2aWNlKSkgeworCQlkbWV2ZW50ZF9sdm0yX2V4aXRfd2l0aF9wb29sKHN0YXRlKTsKKwkJZ290b19iYWQ7CisJfQorCisJc3RhdGUtPnBlcmNlbnRfY2hlY2sgPSBDSEVDS19NSU5JTVVNOworCSp1c2VyID0gc3RhdGU7CisKKwlsb2dfaW5mbygiTW9uaXRvcmluZyBzbmFwc2hvdCAlcy4iLCBkZXZpY2UpOworCisJcmV0dXJuIDE7CitiYWQ6CisJbG9nX2Vycm9yKCJGYWlsZWQgdG8gbW9uaXRvciBzbmFwc2hvdCAlcy4iLCBkZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1bnJlZ2lzdGVyX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UsCisJCSAgICAgIGNvbnN0IGNoYXIgKnV1aWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIGludCBtYWpvciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IG1pbm9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICB2b2lkICoqdXNlcikKK3sKKwlzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZSA9ICp1c2VyOworCisJZG1ldmVudGRfbHZtMl9leGl0X3dpdGhfcG9vbChzdGF0ZSk7CisJbG9nX2luZm8oIk5vIGxvbmdlciBtb25pdG9yaW5nIHNuYXBzaG90ICVzLiIsIGRldmljZSk7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy90aGluLy5leHBvcnRlZF9zeW1ib2xzIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3RoaW4vLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4YzcwNQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy90aGluLy5leHBvcnRlZF9zeW1ib2xzCkBAIC0wLDAgKzEsMyBAQAorcHJvY2Vzc19ldmVudAorcmVnaXN0ZXJfZGV2aWNlCit1bnJlZ2lzdGVyX2RldmljZQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3RoaW4vTWFrZWZpbGUuaW4gYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRlZTJkCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL3RoaW4vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitJTkNMVURFUyArPSAtSSQodG9wX3NyY2RpcikvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL2x2bTIKK0NMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy9sdm0yCisKK1NPVVJDRVMgPSBkbWV2ZW50ZF90aGluLmMKKworTElCX05BTUUgPSBsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnRoaW4KK0xJQl9TSEFSRUQgPSAkKExJQl9OQU1FKS4kKExJQl9TVUZGSVgpCitMSUJfVkVSU0lPTiA9ICQoTElCX1ZFUlNJT05fTFZNKQorCitDRkxPV19MSVNUID0gJChTT1VSQ0VTKQorQ0ZMT1dfTElTVF9UQVJHRVQgPSAkKExJQl9OQU1FKS5jZmxvdworCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworTElCUyArPSAtbGRldm1hcHBlci1ldmVudC1sdm0yIC1sZGV2bWFwcGVyCisKK2luc3RhbGxfbHZtMjogaW5zdGFsbF9kbV9wbHVnaW4KKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9kbWV2ZW50ZF90aGluLmMgYi9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvdGhpbi9kbWV2ZW50ZF90aGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyOTEwZgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvZG1ldmVudGQvcGx1Z2lucy90aGluL2RtZXZlbnRkX3RoaW4uYwpAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIJLyogdXNpbmcgaGVyZSBsdm0gbG9nICovCisjaW5jbHVkZSAiZG1ldmVudGRfbHZtLmgiCisjaW5jbHVkZSAibGliZGV2bWFwcGVyLWV2ZW50LmgiCisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLyogVE9ETyAtIG1vdmUgdGhpcyBtb3VudGluZm8gY29kZSBpbnRvIGxpYnJhcnkgdG8gYmUgcmV1c2FibGUgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyMgIGluY2x1ZGUgImtkZXZfdC5oIgorI2Vsc2UKKyMgIGRlZmluZSBNQUpPUih4KSBtYWpvcigoeCkpCisjICBkZWZpbmUgTUlOT1IoeCkgbWlub3IoKHgpKQorI2VuZGlmCisKKy8qIEZpcnN0IHdhcm5pbmcgd2hlbiB0aGluIGRhdGEgb3IgbWV0YWRhdGEgaXMgODAlIGZ1bGwuICovCisjZGVmaW5lIFdBUk5JTkdfVEhSRVNICShETV9QRVJDRU5UXzEgKiA4MCkKKy8qIFVtb3VudCB0aGluIExWcyB3aGVuIHRoaW4gZGF0YSBvciBtZXRhZGF0YSBMViBpcyA+PQorICogYW5kIGx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzIGhhcyBmYWlsZWQuICovCisjZGVmaW5lIFVNT1VOVF9USFJFU0gJKERNX1BFUkNFTlRfMSAqIDk1KQorLyogUnVuIGEgY2hlY2sgZXZlcnkgNSUuICovCisjZGVmaW5lIENIRUNLX1NURVAJKERNX1BFUkNFTlRfMSAqICA1KQorLyogRG8gbm90IGJvdGhlciBjaGVja2luZyB0aGluIGRhdGEgb3IgbWV0YWRhdGEgaXMgbGVzcyB0aGFuIDUwJSBmdWxsLiAqLworI2RlZmluZSBDSEVDS19NSU5JTVVNCShETV9QRVJDRU5UXzEgKiA1MCkKKworI2RlZmluZSBVTU9VTlRfQ09NTUFORCAiL2Jpbi91bW91bnQiCisKKyNkZWZpbmUgTUFYX0ZBSUxTCSgxMCkKKworI2RlZmluZSBUSElOX0RFQlVHIDAKKworc3RydWN0IGRzb19zdGF0ZSB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlpbnQgbWV0YWRhdGFfcGVyY2VudF9jaGVjazsKKwlpbnQgZGF0YV9wZXJjZW50X2NoZWNrOworCXVpbnQ2NF90IGtub3duX21ldGFkYXRhX3NpemU7CisJdWludDY0X3Qga25vd25fZGF0YV9zaXplOworCXVuc2lnbmVkIGZhaWxzOworCWNoYXIgY21kX3N0clsxMDI0XTsKK307CisKK0RNX0VWRU5UX0xPR19GTigidGhpbiIpCisKKyNkZWZpbmUgVVVJRF9QUkVGSVggIkxWTS0iCisKKy8qIEZpZ3VyZSBvdXQgZGV2aWNlIFVVSUQgaGFzIExWTS0gcHJlZml4IGFuZCBpcyBPUEVOICovCitzdGF0aWMgaW50IF9oYXNfdW5tb3VudGFibGVfcHJlZml4KGludCBtYWpvciwgaW50IG1pbm9yKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwljb25zdCBjaGFyICp1dWlkOworCWludCByID0gMDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9JTkZPKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3NldF9tYWpvcl9taW5vcihkbXQsIG1ham9yLCBtaW5vciwgMSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX25vX2ZsdXNoKGRtdCkpCisJCXN0YWNrOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvIG91dDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWluZm8uZXhpc3RzIHx8ICFpbmZvLm9wZW5fY291bnQpCisJCWdvdG8gb3V0OyAvKiBOb3Qgb3BlbiAtPiBub3QgbW91bnRlZCAqLworCisJaWYgKCEodXVpZCA9IGRtX3Rhc2tfZ2V0X3V1aWQoZG10KSkpCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgaXQncyBwdWJsaWMgbW91bnRhYmxlIExWCisJICogaGFzIHByZWZpeCAgTFZNLSAgYW5kIFVVSUQgc2l6ZSBpcyA2OCBjaGFycyAqLworCWlmIChtZW1jbXAodXVpZCwgVVVJRF9QUkVGSVgsIHNpemVvZihVVUlEX1BSRUZJWCkgLSAxKSB8fAorCSAgICBzdHJsZW4odXVpZCkgIT0gNjgpCisJCWdvdG8gb3V0OworCisjaWYgVEhJTl9ERUJVRworCWxvZ19kZWJ1ZygiRm91bmQgbG9naWNhbCB2b2x1bWUgJXMgKCV1OiV1KS4iLCB1dWlkLCBtYWpvciwgbWlub3IpOworI2VuZGlmCisJciA9IDE7CitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworLyogR2V0IGRlcGVuZGVuY2llcyBmb3IgZGV2aWNlLCBhbmQgdHJ5IHRvIGZpbmQgbWF0Y2hpbmcgZGV2aWNlICovCitzdGF0aWMgaW50IF9oYXNfZGVwcyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdHBfbWFqb3IsIGludCB0cF9taW5vciwgaW50ICpkZXZfbWlub3IpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljb25zdCBzdHJ1Y3QgZG1fZGVwcyAqZGVwczsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCWludCBtYWpvciwgbWlub3I7CisJaW50IHIgPSAwOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0RFUFMpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X25hbWUoZG10LCBuYW1lKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvIG91dDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykpCisJCWdvdG8gb3V0OworCisJaWYgKCEoZGVwcyA9IGRtX3Rhc2tfZ2V0X2RlcHMoZG10KSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFpbmZvLmV4aXN0cyB8fCBkZXBzLT5jb3VudCAhPSAxKQorCQlnb3RvIG91dDsKKworCW1ham9yID0gKGludCkgTUFKT1IoZGVwcy0+ZGV2aWNlWzBdKTsKKwltaW5vciA9IChpbnQpIE1JTk9SKGRlcHMtPmRldmljZVswXSk7CisJaWYgKChtYWpvciAhPSB0cF9tYWpvcikgfHwgKG1pbm9yICE9IHRwX21pbm9yKSkKKwkJZ290byBvdXQ7CisKKwkqZGV2X21pbm9yID0gaW5mby5taW5vcjsKKworCWlmICghX2hhc191bm1vdW50YWJsZV9wcmVmaXgobWFqb3IsIGluZm8ubWlub3IpKQorCQlnb3RvIG91dDsKKworI2lmIFRISU5fREVCVUcKKwl7CisJCWNoYXIgZGV2X25hbWVbUEFUSF9NQVhdOworCQlpZiAoZG1fZGV2aWNlX2dldF9uYW1lKG1ham9yLCBtaW5vciwgMCwgZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSkpKQorCQkJbG9nX2RlYnVnKCJGb3VuZCAlcyAoJXU6JXUpIGRlcGVuZHMgb24gJXMuIiwKKwkJCQkgIG5hbWUsIG1ham9yLCAqZGV2X21pbm9yLCBkZXZfbmFtZSk7CisJfQorI2VuZGlmCisJciA9IDE7CitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworLyogR2V0IGFsbCBhY3RpdmUgZGV2aWNlcyAqLworc3RhdGljIGludCBfZmluZF9hbGxfZGV2cyhkbV9iaXRzZXRfdCBicywgaW50IHRwX21ham9yLCBpbnQgdHBfbWlub3IpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1fbmFtZXMgKm5hbWVzOworCXVuc2lnbmVkIG5leHQgPSAwOworCWludCBtaW5vciwgciA9IDE7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfTElTVCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkgeworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEobmFtZXMgPSBkbV90YXNrX2dldF9uYW1lcyhkbXQpKSkgeworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFuYW1lcy0+ZGV2KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJbmFtZXMgPSAoc3RydWN0IGRtX25hbWVzICopKChjaGFyICopIG5hbWVzICsgbmV4dCk7CisJCWlmIChfaGFzX2RlcHMobmFtZXMtPm5hbWUsIHRwX21ham9yLCB0cF9taW5vciwgJm1pbm9yKSkKKwkJCWRtX2JpdF9zZXQoYnMsIG1pbm9yKTsKKwkJbmV4dCA9IG5hbWVzLT5uZXh0OworCX0gd2hpbGUgKG5leHQpOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcnVuKGNvbnN0IGNoYXIgKmNtZCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IGFyZ2MgPSAxOyAvKiBmb3IgYXJndlswXSwgaS5lLiBjbWQgKi8KKwlpbnQgaSA9IDA7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJcGlkX3QgcGlkID0gZm9yaygpOworCWludCBzdGF0dXM7CisKKwlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJdmFfc3RhcnQoYXAsIGNtZCk7CisJCXdoaWxlICh2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKikpCisJCQkrK2FyZ2M7CisJCXZhX2VuZChhcCk7CisKKwkJLyogKyAxIGZvciB0aGUgdGVybWluYXRpbmcgTlVMTCAqLworCQlhcmd2ID0gYWxsb2NhKHNpemVvZihjb25zdCBjaGFyICopICogKGFyZ2MgKyAxKSk7CisKKwkJYXJndlswXSA9IGNtZDsKKwkJdmFfc3RhcnQoYXAsIGNtZCk7CisJCXdoaWxlICgoYXJndlsrK2ldID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopKSk7CisJCXZhX2VuZChhcCk7CisKKwkJZXhlY3ZwKGNtZCwgKGNoYXIgKiopYXJndik7CisJCWxvZ19zeXNfZXJyb3IoImV4ZWMiLCBjbWQpOworCQlleGl0KDEyNyk7CisJfQorCisJaWYgKHBpZCA+IDApIHsgLyogcGFyZW50ICovCisJCWlmICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgIT0gcGlkKQorCQkJcmV0dXJuIDA7IC8qIHdhaXRwaWQgZmFpbGVkICovCisJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSkKKwkJCXJldHVybiAwOyAvKiB0aGUgY2hpbGQgZmFpbGVkICovCisJfQorCisJaWYgKHBpZCA8IDApCisJCXJldHVybiAwOyAvKiBmb3JrIGZhaWxlZCAqLworCisJcmV0dXJuIDE7IC8qIGFsbCBnb29kICovCit9CisKK3N0cnVjdCBtb3VudGluZm9fcyB7CisJY29uc3QgY2hhciAqZGV2aWNlOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJZG1fYml0c2V0X3QgbWlub3JzOyAvKiBCaXRzZXQgZm9yIGFjdGl2ZSB0aGluIHBvb2wgbWlub3JzICovCit9OworCitzdGF0aWMgaW50IF91bW91bnRfZGV2aWNlKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbWFqb3IsIHVuc2lnbmVkIG1pbm9yLAorCQkJICBjaGFyICp0YXJnZXQsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG1vdW50aW5mb19zICpkYXRhID0gY2JfZGF0YTsKKwljaGFyICp3b3Jkc1sxMF07CisKKwlpZiAoKG1ham9yID09IGRhdGEtPmluZm8ubWFqb3IpICYmIGRtX2JpdChkYXRhLT5taW5vcnMsIG1pbm9yKSkgeworCQlpZiAoZG1fc3BsaXRfd29yZHMoYnVmZmVyLCBETV9BUlJBWV9TSVpFKHdvcmRzKSwgMCwgd29yZHMpIDwgRE1fQVJSQVlfU0laRSh3b3JkcykpCisJCQl3b3Jkc1s5XSA9IE5VTEw7IC8qIGp1c3QgZG9uJ3Qgc2hvdyBkZXZpY2UgbmFtZSAqLworCQlsb2dfaW5mbygiVW5tb3VudGluZyB0aGluICVzICglZDolZCkgb2YgdGhpbi1wb29sICVzICgldToldSkgZnJvbSBtb3VudCBwb2ludCBcIiVzXCIuIiwKKwkJCSB3b3Jkc1s5XSA/IDogIiIsIG1ham9yLCBtaW5vciwgZGF0YS0+ZGV2aWNlLAorCQkJIGRhdGEtPmluZm8ubWFqb3IsIGRhdGEtPmluZm8ubWlub3IsCisJCQkgdGFyZ2V0KTsKKwkJaWYgKCFfcnVuKFVNT1VOVF9DT01NQU5ELCAiLWZsIiwgdGFyZ2V0LCBOVUxMKSkKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGxhenkgdW1vdW50IHRoaW4gJXMgKCVkOiVkKSBmcm9tICVzOiAlcy4iLAorCQkJCSAgd29yZHNbOV0sIG1ham9yLCBtaW5vciwgdGFyZ2V0LCBzdHJlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogRmluZCBhbGwgdGhpbiBwb29sIExWIHVzZXJzIGFuZCB0cnkgdG8gdW1vdW50IHRoZW0uCisgKiBUT0RPOiB3b3JrIHdpdGggcmVhZC1vbmx5IHRoaW4gcG9vbCBzdXBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIF91bW91bnQoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwkvKiBUT0RPOiBDb252ZXJ0IHRvIHVzZSBoYXNoIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UgKi8KKwlzdGF0aWMgY29uc3Qgc2l6ZV90IE1JTk9SUyA9ICgxVSA8PCAyMCk7IC8qIDIwIGJpdCAqLworCXN0cnVjdCBtb3VudGluZm9fcyBkYXRhID0geyBOVUxMIH07CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmZGF0YS5pbmZvKSkKKwkJcmV0dXJuOworCisJZGF0YS5kZXZpY2UgPSBkbV90YXNrX2dldF9uYW1lKGRtdCk7CisKKwlpZiAoIShkYXRhLm1pbm9ycyA9IGRtX2JpdHNldF9jcmVhdGUoTlVMTCwgTUlOT1JTKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgYml0c2V0LiBOb3QgdW5tb3VudGluZyAlcy4iLCBkYXRhLmRldmljZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghX2ZpbmRfYWxsX2RldnMoZGF0YS5taW5vcnMsIGRhdGEuaW5mby5tYWpvciwgZGF0YS5pbmZvLm1pbm9yKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZXRlY3QgbW91bnRlZCB2b2x1bWVzIGZvciAlcy4iLCBkYXRhLmRldmljZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1fbW91bnRpbmZvX3JlYWQoX3Vtb3VudF9kZXZpY2UsICZkYXRhKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBtb3VudGluZm8gZmlsZS4iKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKGRhdGEubWlub3JzKQorCQlkbV9iaXRzZXRfZGVzdHJveShkYXRhLm1pbm9ycyk7Cit9CisKK3N0YXRpYyBpbnQgX3VzZV9wb2xpY3koc3RydWN0IGRtX3Rhc2sgKmRtdCwgc3RydWN0IGRzb19zdGF0ZSAqc3RhdGUpCit7CisjaWYgVEhJTl9ERUJVRworCWxvZ19pbmZvKCJkbWV2ZW50ZCBleGVjdXRlczogJXMuIiwgc3RhdGUtPmNtZF9zdHIpOworI2VuZGlmCisJaWYgKCFkbWV2ZW50ZF9sdm0yX3J1bl93aXRoX2xvY2soc3RhdGUtPmNtZF9zdHIpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGV4dGVuZCB0aGluIHBvb2wgJXMuIiwKKwkJCSAgZG1fdGFza19nZXRfbmFtZShkbXQpKTsKKwkJc3RhdGUtPmZhaWxzKys7CisJCXJldHVybiAwOworCX0KKworCXN0YXRlLT5mYWlscyA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgcHJvY2Vzc19ldmVudChzdHJ1Y3QgZG1fdGFzayAqZG10LAorCQkgICBlbnVtIGRtX2V2ZW50X21hc2sgZXZlbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgIHZvaWQgKip1c2VyKQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9IGRtX3Rhc2tfZ2V0X25hbWUoZG10KTsKKwlpbnQgcGVyY2VudDsKKwlzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZSA9ICp1c2VyOworCXN0cnVjdCBkbV9zdGF0dXNfdGhpbl9wb29sICp0cHMgPSBOVUxMOworCXZvaWQgKm5leHQgPSBOVUxMOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJY2hhciAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCWNoYXIgKnBhcmFtczsKKwlpbnQgbmVlZHNfcG9saWN5ID0gMDsKKwlpbnQgbmVlZHNfdW1vdW50ID0gMDsKKworI2lmIFRISU5fREVCVUcKKwlsb2dfZGVidWcoIldhdGNoIGZvciB0cC1kYXRhOiUuMmYlJSAgdHAtbWV0YWRhdGE6JS4yZiUlLiIsCisJCSAgZG1fcGVyY2VudF90b19mbG9hdChzdGF0ZS0+ZGF0YV9wZXJjZW50X2NoZWNrKSwKKwkJICBkbV9wZXJjZW50X3RvX2Zsb2F0KHN0YXRlLT5tZXRhZGF0YV9wZXJjZW50X2NoZWNrKSk7CisjZW5kaWYKKworI2lmIDAKKwkvKiBObyBsb25nZXIgbW9uaXRvcmluZywgd2FpdGluZyBmb3IgcmVtb3ZlICovCisJaWYgKCFzdGF0ZS0+bWV0YV9wZXJjZW50X2NoZWNrICYmICFzdGF0ZS0+ZGF0YV9wZXJjZW50X2NoZWNrKQorCQlyZXR1cm47CisjZW5kaWYKKwlpZiAoZXZlbnQgJiBETV9FVkVOVF9ERVZJQ0VfRVJST1IpIHsKKwkJLyogRXJyb3IgLT4gbm8gbmVlZCB0byBjaGVjayBhbmQgZG8gaW5zdGFudCByZXNpemUgKi8KKwkJaWYgKF91c2VfcG9saWN5KGRtdCwgc3RhdGUpKQorCQkJZ290byBvdXQ7CisKKwkJc3RhY2s7CisJfQorCisJZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLCAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCisJaWYgKCF0YXJnZXRfdHlwZSB8fCAoc3RyY21wKHRhcmdldF90eXBlLCAidGhpbi1wb29sIikgIT0gMCkpIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIHRhcmdldCB0eXBlLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX2dldF9zdGF0dXNfdGhpbl9wb29sKHN0YXRlLT5tZW0sIHBhcmFtcywgJnRwcykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2Ugc3RhdHVzLiIpOworCQluZWVkc191bW91bnQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiBUSElOX0RFQlVHCisJbG9nX2RlYnVnKCJUaGluIHBvb2wgc3RhdHVzICIgRk1UdTY0ICIvIiBGTVR1NjQgIiAgIgorCQkgIEZNVHU2NCAiLyIgRk1UdTY0ICIuIiwKKwkJICB0cHMtPnVzZWRfbWV0YWRhdGFfYmxvY2tzLCB0cHMtPnRvdGFsX21ldGFkYXRhX2Jsb2NrcywKKwkJICB0cHMtPnVzZWRfZGF0YV9ibG9ja3MsIHRwcy0+dG90YWxfZGF0YV9ibG9ja3MpOworI2VuZGlmCisKKwkvKiBUaGluIHBvb2wgc2l6ZSBoYWQgY2hhbmdlZC4gQ2xlYXIgdGhlIHRocmVzaG9sZC4gKi8KKwlpZiAoc3RhdGUtPmtub3duX21ldGFkYXRhX3NpemUgIT0gdHBzLT50b3RhbF9tZXRhZGF0YV9ibG9ja3MpIHsKKwkJc3RhdGUtPm1ldGFkYXRhX3BlcmNlbnRfY2hlY2sgPSBDSEVDS19NSU5JTVVNOworCQlzdGF0ZS0+a25vd25fbWV0YWRhdGFfc2l6ZSA9IHRwcy0+dG90YWxfbWV0YWRhdGFfYmxvY2tzOworCX0KKworCWlmIChzdGF0ZS0+a25vd25fZGF0YV9zaXplICE9IHRwcy0+dG90YWxfZGF0YV9ibG9ja3MpIHsKKwkJc3RhdGUtPmRhdGFfcGVyY2VudF9jaGVjayA9IENIRUNLX01JTklNVU07CisJCXN0YXRlLT5rbm93bl9kYXRhX3NpemUgPSB0cHMtPnRvdGFsX2RhdGFfYmxvY2tzOworCX0KKworCXBlcmNlbnQgPSBkbV9tYWtlX3BlcmNlbnQodHBzLT51c2VkX21ldGFkYXRhX2Jsb2NrcywgdHBzLT50b3RhbF9tZXRhZGF0YV9ibG9ja3MpOworCWlmIChwZXJjZW50ID49IHN0YXRlLT5tZXRhZGF0YV9wZXJjZW50X2NoZWNrKSB7CisJCS8qCisJCSAqIFVzYWdlIGhhcyByYWlzZWQgbW9yZSB0aGFuIENIRUNLX1NURVAgc2luY2UgdGhlIGxhc3QKKwkJICogdGltZS4gUnVuIGFjdGlvbnMuCisJCSAqLworCQlzdGF0ZS0+bWV0YWRhdGFfcGVyY2VudF9jaGVjayA9IChwZXJjZW50IC8gQ0hFQ0tfU1RFUCkgKiBDSEVDS19TVEVQICsgQ0hFQ0tfU1RFUDsKKworCQkvKiBGSVhNRTogZXh0ZW5zaW9uIG9mIG1ldGFkYXRhIG5lZWRzIHRvIGJlIHdyaXR0ZW4hICovCisJCWlmIChwZXJjZW50ID49IFdBUk5JTkdfVEhSRVNIKSAvKiBQcmludCBhIHdhcm5pbmcgdG8gc3lzbG9nLiAqLworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFRoaW4gcG9vbCAlcyBtZXRhZGF0YSBpcyBub3cgJS4yZiUlIGZ1bGwuIiwKKwkJCQkgZGV2aWNlLCBkbV9wZXJjZW50X3RvX2Zsb2F0KHBlcmNlbnQpKTsKKwkJbmVlZHNfcG9saWN5ID0gMTsKKworCQlpZiAocGVyY2VudCA+PSBVTU9VTlRfVEhSRVNIKQorCQkJbmVlZHNfdW1vdW50ID0gMTsKKwl9CisKKwlwZXJjZW50ID0gZG1fbWFrZV9wZXJjZW50KHRwcy0+dXNlZF9kYXRhX2Jsb2NrcywgdHBzLT50b3RhbF9kYXRhX2Jsb2Nrcyk7CisJaWYgKHBlcmNlbnQgPj0gc3RhdGUtPmRhdGFfcGVyY2VudF9jaGVjaykgeworCQkvKgorCQkgKiBVc2FnZSBoYXMgcmFpc2VkIG1vcmUgdGhhbiBDSEVDS19TVEVQIHNpbmNlCisJCSAqIHRoZSBsYXN0IHRpbWUuIFJ1biBhY3Rpb25zLgorCQkgKi8KKwkJc3RhdGUtPmRhdGFfcGVyY2VudF9jaGVjayA9IChwZXJjZW50IC8gQ0hFQ0tfU1RFUCkgKiBDSEVDS19TVEVQICsgQ0hFQ0tfU1RFUDsKKworCQlpZiAocGVyY2VudCA+PSBXQVJOSU5HX1RIUkVTSCkgLyogUHJpbnQgYSB3YXJuaW5nIHRvIHN5c2xvZy4gKi8KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBUaGluIHBvb2wgJXMgZGF0YSBpcyBub3cgJS4yZiUlIGZ1bGwuIiwKKwkJCQkgZGV2aWNlLCBkbV9wZXJjZW50X3RvX2Zsb2F0KHBlcmNlbnQpKTsKKwkJbmVlZHNfcG9saWN5ID0gMTsKKworCQlpZiAocGVyY2VudCA+PSBVTU9VTlRfVEhSRVNIKQorCQkJbmVlZHNfdW1vdW50ID0gMTsKKwl9CisKKwlpZiAobmVlZHNfcG9saWN5ICYmCisJICAgIF91c2VfcG9saWN5KGRtdCwgc3RhdGUpKQorCQluZWVkc191bW91bnQgPSAwOyAvKiBObyB1bW91bnQgd2hlbiBjb21tYW5kIHdhcyBzdWNjZXNzZnVsICovCitvdXQ6CisJaWYgKG5lZWRzX3Vtb3VudCkgeworCQlfdW1vdW50KGRtdCk7CisJCS8qIFVudGlsIHNvbWV0aGluZyBjaGFuZ2VzLCBkbyBub3QgcmV0cnkgYW55IG1vcmUgYWN0aW9ucyAqLworCQlzdGF0ZS0+ZGF0YV9wZXJjZW50X2NoZWNrID0gc3RhdGUtPm1ldGFkYXRhX3BlcmNlbnRfY2hlY2sgPSAoRE1fUEVSQ0VOVF8xICogMTAxKTsKKwl9CisKKwlpZiAodHBzKQorCQlkbV9wb29sX2ZyZWUoc3RhdGUtPm1lbSwgdHBzKTsKKworCWlmIChzdGF0ZS0+ZmFpbHMgPj0gTUFYX0ZBSUxTKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBEcm9wcGluZyBtb25pdG9yaW5nIG9mICVzLiAiCisJCQkgImx2bTIgY29tbWFuZCBmYWlscyB0b28gb2Z0ZW4gKCV1IHRpbWVzIGluIHJhdykuIiwKKwkJCSBkZXZpY2UsIHN0YXRlLT5mYWlscyk7CisJCXB0aHJlYWRfa2lsbChwdGhyZWFkX3NlbGYoKSwgU0lHQUxSTSk7CisJfQorfQorCitpbnQgcmVnaXN0ZXJfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwKKwkJICAgIGNvbnN0IGNoYXIgKnV1aWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBpbnQgbWFqb3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBpbnQgbWlub3IgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICB2b2lkICoqdXNlcikKK3sKKwlzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZTsKKworCWlmICghZG1ldmVudGRfbHZtMl9pbml0X3dpdGhfcG9vbCgidGhpbl9wb29sX3N0YXRlIiwgc3RhdGUpKQorCQlnb3RvX2JhZDsKKworCWlmICghZG1ldmVudGRfbHZtMl9jb21tYW5kKHN0YXRlLT5tZW0sIHN0YXRlLT5jbWRfc3RyLAorCQkJCSAgIHNpemVvZihzdGF0ZS0+Y21kX3N0ciksCisJCQkJICAgImx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzIiwKKwkJCQkgICBkZXZpY2UpKSB7CisJCWRtZXZlbnRkX2x2bTJfZXhpdF93aXRoX3Bvb2woc3RhdGUpOworCQlnb3RvX2JhZDsKKwl9CisKKwlzdGF0ZS0+bWV0YWRhdGFfcGVyY2VudF9jaGVjayA9IENIRUNLX01JTklNVU07CisJc3RhdGUtPmRhdGFfcGVyY2VudF9jaGVjayA9IENIRUNLX01JTklNVU07CisJKnVzZXIgPSBzdGF0ZTsKKworCWxvZ19pbmZvKCJNb25pdG9yaW5nIHRoaW4gJXMuIiwgZGV2aWNlKTsKKworCXJldHVybiAxOworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIG1vbml0b3IgdGhpbiAlcy4iLCBkZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1bnJlZ2lzdGVyX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UsCisJCSAgICAgIGNvbnN0IGNoYXIgKnV1aWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIGludCBtYWpvciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IG1pbm9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICB2b2lkICoqdXNlcikKK3sKKwlzdHJ1Y3QgZHNvX3N0YXRlICpzdGF0ZSA9ICp1c2VyOworCisJZG1ldmVudGRfbHZtMl9leGl0X3dpdGhfcG9vbChzdGF0ZSk7CisJbG9nX2luZm8oIk5vIGxvbmdlciBtb25pdG9yaW5nIHRoaW4gJXMuIiwgZGV2aWNlKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvbHZtZGJ1c2QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4MTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw2NyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworbHZtZGJ1c2RpciA9ICQocHl0aG9uM2RpcikvbHZtZGJ1c2QKKworTFZNREJVU19TUkNESVJfRklMRVMgPSBcCisJYXV0b21hdGVkcHJvcGVydGllcy5weSBcCisJYmFja2dyb3VuZC5weSBcCisJY2ZnLnB5IFwKKwljbWRoYW5kbGVyLnB5IFwKKwlmZXRjaC5weSBcCisJX19pbml0X18ucHkgXAorCWpvYi5weSBcCisJbG9hZGVyLnB5IFwKKwlsdm1kYi5weSBcCisJbWFpbi5weSBcCisJbHZtX3NoZWxsX3Byb3h5LnB5IFwKKwlsdi5weSBcCisJbWFuYWdlci5weSBcCisJb2JqZWN0bWFuYWdlci5weSBcCisJcHYucHkgXAorCXJlZnJlc2gucHkgXAorCXJlcXVlc3QucHkgXAorCXN0YXRlLnB5IFwKKwl1ZGV2d2F0Y2gucHkgXAorCXV0aWxzLnB5IFwKKwl2Zy5weQorCitMVk1EQlVTX0JVSUxERElSX0ZJTEVTID0gXAorCXBhdGgucHkKKworTFZNREJVU0QgPSAkKHNyY2RpcikvbHZtZGJ1c2QKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKKy5QSE9OWTogaW5zdGFsbF9sdm1kYnVzZAorCitpbnN0YWxsX2x2bWRidXNkOgorCSQoSU5TVEFMTF9ESVIpICQoc2JpbmRpcikKKwkkKElOU1RBTExfU0NSSVBUKSAkKExWTURCVVNEKSAkKHNiaW5kaXIpCisJJChJTlNUQUxMX0RJUikgJChERVNURElSKSQobHZtZGJ1c2RpcikKKwkoY2QgJChzcmNkaXIpOyAkKElOU1RBTExfREFUQSkgJChMVk1EQlVTX1NSQ0RJUl9GSUxFUykgJChERVNURElSKSQobHZtZGJ1c2RpcikpCisJJChJTlNUQUxMX0RBVEEpICQoTFZNREJVU19CVUlMRERJUl9GSUxFUykgJChERVNURElSKSQobHZtZGJ1c2RpcikKKwlQWVRIT049JChQWVRIT04zKSAkKFBZQ09NUElMRSkgLS1kZXN0ZGlyICIkKERFU1RESVIpIiAtLWJhc2VkaXIgIiQobHZtZGJ1c2RpcikiICQoTFZNREJVU19TUkNESVJfRklMRVMpICQoTFZNREJVU19CVUlMRERJUl9GSUxFUykKKwkkKENITU9EKSA3NTUgJChERVNURElSKSQobHZtZGJ1c2RpcikvX19weWNhY2hlX18KKwkkKENITU9EKSA0NDQgJChERVNURElSKSQobHZtZGJ1c2RpcikvX19weWNhY2hlX18vKi5weVtjb10KKworaW5zdGFsbF9sdm0yOiBpbnN0YWxsX2x2bWRidXNkCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMgorCitESVNUQ0xFQU5fVEFSR0VUUys9IFwKKwkkKExWTURCVVNfQlVJTERESVJfRklMRVMpCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL19faW5pdF9fLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRjZmRmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDEwIEBACisjIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2Zyb20gLm1haW4gaW1wb3J0IG1haW4KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvYXV0b21hdGVkcHJvcGVydGllcy5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvYXV0b21hdGVkcHJvcGVydGllcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY5MjBjCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9hdXRvbWF0ZWRwcm9wZXJ0aWVzLnB5CkBAIC0wLDAgKzEsMTc1IEBACisjIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2ltcG9ydCBkYnVzCitmcm9tIC4gaW1wb3J0IGNmZworZnJvbSAudXRpbHMgaW1wb3J0IGdldF9wcm9wZXJ0aWVzLCBhZGRfcHJvcGVydGllcywgZ2V0X29iamVjdF9wcm9wZXJ0eV9kaWZmLCBcCisJbG9nX2RlYnVnCitmcm9tIC5zdGF0ZSBpbXBvcnQgU3RhdGUKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcsUHlVbnJlc29sdmVkUmVmZXJlbmNlcworY2xhc3MgQXV0b21hdGVkUHJvcGVydGllcyhkYnVzLnNlcnZpY2UuT2JqZWN0KToKKwkiIiIKKwlUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG5lZWRlZCBpbnRlcmZhY2VzIGZvcjoKKwlvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzCisKKwlPdGhlciBjbGFzc2VzIGluaGVyaXQgZnJvbSBpdCB0byBnZXQgdGhlIHNhbWUgYmVoYXZpb3IKKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfcGF0aCwgc2VhcmNoX21ldGhvZD1Ob25lKToKKwkJZGJ1cy5zZXJ2aWNlLk9iamVjdC5fX2luaXRfXyhzZWxmLCBjZmcuYnVzLCBvYmplY3RfcGF0aCkKKwkJc2VsZi5fYXBfaW50ZXJmYWNlID0gW10KKwkJc2VsZi5fYXBfb19wYXRoID0gb2JqZWN0X3BhdGgKKwkJc2VsZi5fYXBfc2VhcmNoX21ldGhvZCA9IHNlYXJjaF9tZXRob2QKKwkJc2VsZi5zdGF0ZSA9IE5vbmUKKworCWRlZiBkYnVzX29iamVjdF9wYXRoKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXBfb19wYXRoCisKKwlkZWYgZW1pdF9kYXRhKHNlbGYpOgorCQlwcm9wcyA9IHt9CisKKwkJZm9yIGkgaW4gc2VsZi5pbnRlcmZhY2UoKToKKwkJCXByb3BzW2ldID0gc2VsZi5HZXRBbGwoaSkKKworCQlyZXR1cm4gc2VsZi5fYXBfb19wYXRoLCBwcm9wcworCisJZGVmIHNldF9pbnRlcmZhY2Uoc2VsZiwgaW50ZXJmYWNlKToKKwkJIiIiCisJCVdpdGggaW5oZXJpdGFuY2Ugd2UgY2FuJ3QgZWFzaWx5IHRlbGwgd2hhdCBpbnRlcmZhY2VzIGEgY2xhc3MgcHJvdmlkZXMKKwkJc28gd2Ugd2lsbCBoYXZlIGVhY2ggY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0ZWxsIHRoZQorCQliYXNlIEF1dG9tYXRlZFByb3BlcnRpZXMgd2hhdCBpdCBpcyB0aGV5IGRvIHByb3ZpZGUuICBUaGlzIGlzIGtpbmQgb2YKKwkJY2x1bmt5IGFuZCBwZXJoYXBzIHdlIGNhbiBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGxhdGVyLgorCQk6cGFyYW0gaW50ZXJmYWNlOiAgICAgICBBbiBpbnRlcmZhY2UgdGhlIG9iamVjdCBzdXBwb3J0cworCQk6cmV0dXJuOgorCQkiIiIKKwkJaWYgaW50ZXJmYWNlIG5vdCBpbiBzZWxmLl9hcF9pbnRlcmZhY2U6CisJCQlzZWxmLl9hcF9pbnRlcmZhY2UuYXBwZW5kKGludGVyZmFjZSkKKworCSMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwKKwlkZWYgaW50ZXJmYWNlKHNlbGYsIGFsbF9pbnRlcmZhY2VzPUZhbHNlKToKKwkJaWYgYWxsX2ludGVyZmFjZXM6CisJCQljcHkgPSBsaXN0KHNlbGYuX2FwX2ludGVyZmFjZSkKKwkJCWNweS5leHRlbmQoCisJCQkJWyJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSIsCisJCQkJCSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIl0pCisJCQlyZXR1cm4gY3B5CisKKwkJcmV0dXJuIHNlbGYuX2FwX2ludGVyZmFjZQorCisJIyBQcm9wZXJ0aWVzCisJIyBub2luc3BlY3Rpb24gUHlVbnVzZWRMb2NhbAorCUBkYnVzLnNlcnZpY2UubWV0aG9kKGRidXNfaW50ZXJmYWNlPWRidXMuUFJPUEVSVElFU19JRkFDRSwKKwkJCQkJCQlpbl9zaWduYXR1cmU9J3NzJywgb3V0X3NpZ25hdHVyZT0ndicpCisJZGVmIEdldChzZWxmLCBpbnRlcmZhY2VfbmFtZSwgcHJvcGVydHlfbmFtZSk6CisJCXZhbHVlID0gZ2V0YXR0cihzZWxmLCBwcm9wZXJ0eV9uYW1lKQorCQkjIE5vdGU6IElmIHdlIGdldCBhbiBleGNlcHRpb24gaW4gdGhpcyBoYW5kbGVyIHdlIHdvbid0IGtub3cgYWJvdXQgaXQsCisJCSMgb25seSB0aGUgc2lkZSBlZmZlY3Qgb2Ygbm8gcmV0dXJuZWQgdmFsdWUhCisJCWxvZ19kZWJ1ZygnR2V0ICglcyksIHR5cGUgKCVzKSwgdmFsdWUoJXMpJyAlCisJCQkJCShwcm9wZXJ0eV9uYW1lLCBzdHIodHlwZSh2YWx1ZSkpLCBzdHIodmFsdWUpKSkKKwkJcmV0dXJuIHZhbHVlCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZChkYnVzX2ludGVyZmFjZT1kYnVzLlBST1BFUlRJRVNfSUZBQ0UsCisJCQkJCQkJaW5fc2lnbmF0dXJlPSdzJywgb3V0X3NpZ25hdHVyZT0nYXtzdn0nKQorCWRlZiBHZXRBbGwoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgorCQlpZiBpbnRlcmZhY2VfbmFtZSBpbiBzZWxmLmludGVyZmFjZShUcnVlKToKKwkJCSMgVXNpbmcgaW50cm9zcGVjdGlvbiwgbGV0cyBidWlsZCB0aGlzIGR5bmFtaWNhbGx5CisJCQlwcm9wZXJ0aWVzID0gZ2V0X3Byb3BlcnRpZXMoc2VsZikKKwkJCWlmIGludGVyZmFjZV9uYW1lIGluIHByb3BlcnRpZXM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXNbaW50ZXJmYWNlX25hbWVdWzFdCisJCQlyZXR1cm4ge30KKwkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQlzZWxmLl9hcF9pbnRlcmZhY2UsCisJCQknVGhlIG9iamVjdCAlcyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlICVzIGludGVyZmFjZScKKwkJCSUgKHNlbGYuX19jbGFzc19fLCBpbnRlcmZhY2VfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZChkYnVzX2ludGVyZmFjZT1kYnVzLlBST1BFUlRJRVNfSUZBQ0UsCisJCQkJCQkJaW5fc2lnbmF0dXJlPSdzc3YnKQorCWRlZiBTZXQoc2VsZiwgaW50ZXJmYWNlX25hbWUsIHByb3BlcnR5X25hbWUsIG5ld192YWx1ZSk6CisJCXNldGF0dHIoc2VsZiwgcHJvcGVydHlfbmFtZSwgbmV3X3ZhbHVlKQorCQlzZWxmLlByb3BlcnRpZXNDaGFuZ2VkKGludGVyZmFjZV9uYW1lLAorCQkJCQkJCQl7cHJvcGVydHlfbmFtZTogbmV3X3ZhbHVlfSwgW10pCisKKwkjIEFzIGRidXMtcHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgaW50cm9zcGVjdGlvbiBmb3IgcHJvcGVydGllcyB3ZSB3aWxsCisJIyBnZXQgdGhlIGF1dG9nZW5lcmF0ZWQgeG1sIGFuZCB0aGVuIGFkZCBvdXIgd2FudGVkIHByb3BlcnRpZXMgdG8gaXQuCisJQGRidXMuc2VydmljZS5tZXRob2QoZGJ1c19pbnRlcmZhY2U9ZGJ1cy5JTlRST1NQRUNUQUJMRV9JRkFDRSwKKwkJCQkJCQlvdXRfc2lnbmF0dXJlPSdzJykKKwlkZWYgSW50cm9zcGVjdChzZWxmKToKKwkJciA9IGRidXMuc2VydmljZS5PYmplY3QuSW50cm9zcGVjdChzZWxmLCBzZWxmLl9hcF9vX3BhdGgsIGNmZy5idXMpCisJCSMgTG9vayBhdCB0aGUgcHJvcGVydGllcyBpbiB0aGUgY2xhc3MKKwkJcHJvcHMgPSBnZXRfcHJvcGVydGllcyhzZWxmKQorCisJCWZvciBpbnRfZiwgdiBpbiBwcm9wcy5pdGVtcygpOgorCQkJciA9IGFkZF9wcm9wZXJ0aWVzKHIsIGludF9mLCB2WzBdKQorCisJCXJldHVybiByCisKKwlAZGJ1cy5zZXJ2aWNlLnNpZ25hbChkYnVzX2ludGVyZmFjZT1kYnVzLlBST1BFUlRJRVNfSUZBQ0UsCisJCQkJCQkJc2lnbmF0dXJlPSdzYXtzdn1hcycpCisJZGVmIFByb3BlcnRpZXNDaGFuZ2VkKHNlbGYsIGludGVyZmFjZV9uYW1lLCBjaGFuZ2VkX3Byb3BlcnRpZXMsCisJCQkJCQkJaW52YWxpZGF0ZWRfcHJvcGVydGllcyk6CisJCWxvZ19kZWJ1ZygoJ1NJR05BTDogUHJvcGVydGllc0NoYW5nZWQoJXMsICVzLCAlcywgJXMpJyAlCisJCQkJCShzdHIoc2VsZi5fYXBfb19wYXRoKSwgc3RyKGludGVyZmFjZV9uYW1lKSwKKwkJCQkJc3RyKGNoYW5nZWRfcHJvcGVydGllcyksIHN0cihpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzKSkpKQorCisJZGVmIHJlZnJlc2goc2VsZiwgc2VhcmNoX2tleT1Ob25lLCBvYmplY3Rfc3RhdGU9Tm9uZSk6CisJCSIiIgorCQlUYWtlIHRoZSB2YWx1ZXMgKHByb3BlcnRpZXMpIG9mIGFuIG9iamVjdCBhbmQgdXBkYXRlIHRoZW0gd2l0aCB3aGF0CisJCWx2bSBjdXJyZW50bHkgaGFzLiAgWW91IGNhbiBlaXRoZXIgZmV0Y2ggdGhlIG5ldyBvbmVzIG9yIHN1cHBseSB0aGUKKwkJbmV3IHN0YXRlIHRvIGJlIHVwZGF0ZWQgd2l0aAorCQk6cGFyYW0gc2VhcmNoX2tleTogVGhlIHZhbHVlIHRvIHVzZSB0byBzZWFyY2ggZm9yCisJCTpwYXJhbSBvYmplY3Rfc3RhdGU6IFVzZSB0aGlzIGFzIHRoZSBuZXcgb2JqZWN0IHN0YXRlCisJCSIiIgorCQludW1fY2hhbmdlZCA9IDAKKworCQkjIElmIHdlIGNhbid0IGRvIGEgbG9va3VwLCBiYWlsIG5vdywgdGhpcyBoYXBwZW5zIGlmIHdlIGJsaW5kbHkgd2FsaworCQkjIHRocm91Z2ggYWxsIGRidXMgb2JqZWN0cyBhcyBzb21lIGRvbid0IGhhdmUgYSBzZWFyY2ggbWV0aG9kLCBsaWtlCisJCSMgJ01hbmFnZXInIG9iamVjdC4KKwkJaWYgbm90IHNlbGYuX2FwX3NlYXJjaF9tZXRob2Q6CisJCQlyZXR1cm4KKworCQlzZWFyY2ggPSBzZWxmLmx2bV9pZAorCQlpZiBzZWFyY2hfa2V5OgorCQkJc2VhcmNoID0gc2VhcmNoX2tleQorCisJCSMgRWl0aGVyIHdlIGhhdmUgdGhlIG5ldyBvYmplY3Qgc3RhdGUgb3Igd2UgbmVlZCB0byBnbyBmZXRjaCBpdAorCQlpZiBvYmplY3Rfc3RhdGU6CisJCQluZXdfc3RhdGUgPSBvYmplY3Rfc3RhdGUKKwkJZWxzZToKKwkJCW5ld19zdGF0ZSA9IHNlbGYuX2FwX3NlYXJjaF9tZXRob2QoW3NlYXJjaF0pWzBdCisJCQlhc3NlcnQgaXNpbnN0YW5jZShuZXdfc3RhdGUsIFN0YXRlKQorCisJCWFzc2VydCBuZXdfc3RhdGUKKworCQkjIFdoZW4gd2UgcmVmcmVzaCBhbiBvYmplY3QgdGhlIG9iamVjdCBpZGVudGlmaWVycyBtaWdodCBoYXZlIGNoYW5nZWQKKwkJIyBiZWNhdXNlIExWTSBhbGxvd3MgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZW0gKG5hbWUgJiB1dWlkKSwgdGh1cyBpZgorCQkjIHRoZXkgaGF2ZSBjaGFuZ2VkIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBvYmplY3QgbWFuYWdlciBzbyB0aGF0CisJCSMgbG9vay11cHMgd2lsbCBoYXBwZW4gY29ycmVjdGx5CisJCW9sZF9pZCA9IHNlbGYuc3RhdGUuaWRlbnRpZmllcnMoKQorCQluZXdfaWQgPSBuZXdfc3RhdGUuaWRlbnRpZmllcnMoKQorCQlpZiBvbGRfaWRbMF0gIT0gbmV3X2lkWzBdIG9yIG9sZF9pZFsxXSAhPSBuZXdfaWRbMV06CisJCQljZmcub20ubG9va3VwX3VwZGF0ZShzZWxmLCBuZXdfaWRbMF0sIG5ld19pZFsxXSkKKworCQkjIEdyYWIgdGhlIHByb3BlcnRpZXMgdmFsdWVzLCB0aGVuIHJlcGxhY2UgdGhlIHN0YXRlIG9mIHRoZSBvYmplY3QKKwkJIyBhbmQgcmV0cmlldmUgdGhlIG5ldyB2YWx1ZXMKKwkJIyBUT0RPOiBXZSBuZWVkIHRvIGFkZCBsb2NraW5nIHRvIHByZXZlbnQgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlCisJCSMgcHJvcGVydGllcyBzbyB0aGF0IGEgY2xpZW50IGlzIG5vdCBhY2Nlc3Npbmcgd2hpbGUgd2UgYXJlCisJCSMgcmVwbGFjaW5nLgorCQlvX3Byb3AgPSBnZXRfcHJvcGVydGllcyhzZWxmKQorCQlzZWxmLnN0YXRlID0gbmV3X3N0YXRlCisJCW5fcHJvcCA9IGdldF9wcm9wZXJ0aWVzKHNlbGYpCisKKwkJY2hhbmdlZCA9IGdldF9vYmplY3RfcHJvcGVydHlfZGlmZihvX3Byb3AsIG5fcHJvcCkKKworCQlpZiBjaGFuZ2VkOgorCQkJZm9yIGludF9mLCB2IGluIGNoYW5nZWQuaXRlbXMoKToKKwkJCQlzZWxmLlByb3BlcnRpZXNDaGFuZ2VkKGludF9mLCB2LCBbXSkKKwkJCW51bV9jaGFuZ2VkICs9IDEKKwkJcmV0dXJuIG51bV9jaGFuZ2VkCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL2JhY2tncm91bmQucHkgYi9kYWVtb25zL2x2bWRidXNkL2JhY2tncm91bmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3OGI2NgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvYmFja2dyb3VuZC5weQpAQCAtMCwwICsxLDIwMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgc3VicHJvY2VzcworZnJvbSAuIGltcG9ydCBjZmcKK2ltcG9ydCB0aW1lCitmcm9tIC5jbWRoYW5kbGVyIGltcG9ydCBvcHRpb25zX3RvX2NsaV9hcmdzCitpbXBvcnQgZGJ1cworZnJvbSAudXRpbHMgaW1wb3J0IHB2X3JhbmdlX2FwcGVuZCwgcHZfZGVzdF9yYW5nZXMsIGxvZ19lcnJvciwgbG9nX2RlYnVnCitpbXBvcnQgdHJhY2ViYWNrCisKK19ybG9jayA9IHRocmVhZGluZy5STG9jaygpCitfdGhyZWFkX2xpc3QgPSBsaXN0KCkKKworCitkZWYgcHZfbW92ZV9sdl9jbWQobW92ZV9vcHRpb25zLCBsdl9mdWxsX25hbWUsCisJCQkJCXB2X3NvdXJjZSwgcHZfc291cmNlX3JhbmdlLCBwdl9kZXN0X3JhbmdlX2xpc3QpOgorCWNtZCA9IFsncHZtb3ZlJywgJy1pJywgJzEnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhtb3ZlX29wdGlvbnMpKQorCisJaWYgbHZfZnVsbF9uYW1lOgorCQljbWQuZXh0ZW5kKFsnLW4nLCBsdl9mdWxsX25hbWVdKQorCisJcHZfcmFuZ2VfYXBwZW5kKGNtZCwgcHZfc291cmNlLCAqcHZfc291cmNlX3JhbmdlKQorCXB2X2Rlc3RfcmFuZ2VzKGNtZCwgcHZfZGVzdF9yYW5nZV9saXN0KQorCisJcmV0dXJuIGNtZAorCisKK2RlZiBsdl9tZXJnZV9jbWQobWVyZ2Vfb3B0aW9ucywgbHZfZnVsbF9uYW1lKToKKwljbWQgPSBbJ2x2Y29udmVydCcsICctLW1lcmdlJywgJy1pJywgJzEnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhtZXJnZV9vcHRpb25zKSkKKwljbWQuYXBwZW5kKGx2X2Z1bGxfbmFtZSkKKwlyZXR1cm4gY21kCisKKworZGVmIF9tb3ZlX21lcmdlKGludGVyZmFjZV9uYW1lLCBjbWQsIGpvYl9zdGF0ZSk6CisJYWRkKGNtZCwgam9iX3N0YXRlKQorCisJZG9uZSA9IGpvYl9zdGF0ZS5XYWl0KC0xKQorCWlmIG5vdCBkb25lOgorCQllYywgZXJyX21zZyA9IGpvYl9zdGF0ZS5HZXRFcnJvcgorCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCWludGVyZmFjZV9uYW1lLAorCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihlYyksIGVycl9tc2cpKQorCisJY2ZnLmxvYWQoKQorCXJldHVybiAnLycKKworCitkZWYgbW92ZShpbnRlcmZhY2VfbmFtZSwgbHZfbmFtZSwgcHZfc3JjX29iaiwgcHZfc291cmNlX3JhbmdlLAorCQkJcHZfZGVzdHNfYW5kX3JhbmdlcywgbW92ZV9vcHRpb25zLCBqb2Jfc3RhdGUpOgorCSIiIgorCUNvbW1vbiBjb2RlIGZvciB0aGUgcHZtb3ZlIGhhbmRsaW5nLgorCTpwYXJhbSBpbnRlcmZhY2VfbmFtZTogIFdoYXQgZGJ1cyBpbnRlcmZhY2Ugd2UgYXJlIHByb3ZpZGluZyBmb3IKKwk6cGFyYW0gbHZfbmFtZTogICAgIE9wdGlvbmFsIChOb25lIG9yIG5hbWUgb2YgTFYgdG8gbW92ZSkKKwk6cGFyYW0gcHZfc3JjX29iajogIGRidXMgb2JqZWN0IHBhdGNoIGZvciBzb3VyY2UgUFYKKwk6cGFyYW0gcHZfc291cmNlX3JhbmdlOiAoMCwwIHRvIGlnbm9yZSwgZWxzZSBzdGFydCwgZW5kIHNlZ21lbnRzKQorCTpwYXJhbSBwdl9kZXN0c19hbmRfcmFuZ2VzOiBBcnJheSBvZiBQViBvYmplY3QgcGF0aHMgYW5kIHN0YXJ0L2VuZCBzZWdzCisJOnBhcmFtIG1vdmVfb3B0aW9uczogSGFzaCB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50cworCTpwYXJhbSBqb2Jfc3RhdGU6IFVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIGFib3V0IGpvYnMgYmV0d2VlbiBwcm9jZXNzZXMKKwk6cmV0dXJuOiAnLycgV2hlbiBjb21wbGV0ZSwgdGhlIGVtcHR5IG9iamVjdCBwYXRoCisJIiIiCisJcHZfZGVzdHMgPSBbXQorCXB2X3NyYyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3BhdGgocHZfc3JjX29iaikKKwlpZiBwdl9zcmM6CisKKwkJIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGhhbmRsaW5nIGEgbW92ZSB0byBhIHNwZWNpZmljCisJCSMgZGVzdGluYXRpb24ocykKKwkJaWYgbGVuKHB2X2Rlc3RzX2FuZF9yYW5nZXMpOgorCQkJZm9yIHByIGluIHB2X2Rlc3RzX2FuZF9yYW5nZXM6CisJCQkJcHZfZGJ1c19vYmogPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKHByWzBdKQorCQkJCWlmIG5vdCBwdl9kYnVzX29iajoKKwkJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCQlpbnRlcmZhY2VfbmFtZSwKKwkJCQkJCSdQViBEZXN0aW5hdGlvbiAoJXMpIG5vdCBmb3VuZCcgJSBwclswXSkKKworCQkJCXB2X2Rlc3RzLmFwcGVuZCgocHZfZGJ1c19vYmoubHZtX2lkLCBwclsxXSwgcHJbMl0pKQorCisJCSMgR2VuZXJhdGUgdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhpcyBjb21tYW5kLCBidXQgZG9uJ3QKKwkJIyBleGVjdXRlIGl0LgorCQljbWQgPSBwdl9tb3ZlX2x2X2NtZChtb3ZlX29wdGlvbnMsCisJCQkJCQkJCWx2X25hbWUsCisJCQkJCQkJCXB2X3NyYy5sdm1faWQsCisJCQkJCQkJCXB2X3NvdXJjZV9yYW5nZSwKKwkJCQkJCQkJcHZfZGVzdHMpCisKKwkJcmV0dXJuIF9tb3ZlX21lcmdlKGludGVyZmFjZV9uYW1lLCBjbWQsIGpvYl9zdGF0ZSkKKwllbHNlOgorCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCWludGVyZmFjZV9uYW1lLCAncHZfc3JjX29iaiAoJXMpIG5vdCBmb3VuZCcgJSBwdl9zcmNfb2JqKQorCisKK2RlZiBtZXJnZShpbnRlcmZhY2VfbmFtZSwgbHZfdXVpZCwgbHZfbmFtZSwgbWVyZ2Vfb3B0aW9ucywgam9iX3N0YXRlKToKKwkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQobHZfdXVpZCwgbHZfbmFtZSkKKwlpZiBkYm86CisJCWNtZCA9IGx2X21lcmdlX2NtZChtZXJnZV9vcHRpb25zLCBkYm8ubHZtX2lkKQorCQlyZXR1cm4gX21vdmVfbWVyZ2UoaW50ZXJmYWNlX25hbWUsIGNtZCwgam9iX3N0YXRlKQorCWVsc2U6CisJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJaW50ZXJmYWNlX25hbWUsCisJCQknTFYgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJSAobHZfdXVpZCwgbHZfbmFtZSkpCisKKworZGVmIGJhY2tncm91bmRfcmVhcGVyKCk6CisJd2hpbGUgY2ZnLnJ1bi52YWx1ZSAhPSAwOgorCQl3aXRoIF9ybG9jazoKKwkJCW51bV90aHJlYWRzID0gbGVuKF90aHJlYWRfbGlzdCkgLSAxCisJCQlpZiBudW1fdGhyZWFkcyA+PSAwOgorCQkJCWZvciBpIGluIHJhbmdlKG51bV90aHJlYWRzLCAtMSwgLTEpOgorCQkJCQlfdGhyZWFkX2xpc3RbaV0uam9pbigwKQorCQkJCQlpZiBub3QgX3RocmVhZF9saXN0W2ldLmlzX2FsaXZlKCk6CisJCQkJCQlsb2dfZGVidWcoIlJlbW92aW5nIHRocmVhZDogJXMiICUgX3RocmVhZF9saXN0W2ldLm5hbWUpCisJCQkJCQlfdGhyZWFkX2xpc3QucG9wKGkpCisKKwkJdGltZS5zbGVlcCgzKQorCisKK2RlZiBiYWNrZ3JvdW5kX2V4ZWN1dGUoY29tbWFuZCwgYmFja2dyb3VuZF9qb2IpOgorCisJIyBXcmFwIHRoaXMgd2hvbGUgb3BlcmF0aW9uIGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLCBvdGhlcndpc2UgaWYgd2UKKwkjIGhpdCBhIGNvZGUgYnVnIHdlIHdpbGwgc2lsZW50bHkgZXhpdCB0aGlzIHRocmVhZCB3aXRob3V0IGFueW9uZSBiZWluZworCSMgdGhlIHdpc2VyLgorCXRyeToKKwkJcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKwkJCQkJCQkJCXN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorCQlsaW5lc19pdGVyYXRvciA9IGl0ZXIocHJvY2Vzcy5zdGRvdXQucmVhZGxpbmUsIGIiIikKKwkJZm9yIGxpbmUgaW4gbGluZXNfaXRlcmF0b3I6CisJCQlsaW5lX3N0ciA9IGxpbmUuZGVjb2RlKCJ1dGYtOCIpCisKKwkJCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBsaW5lIGhhcyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2VwYXJhdG9ycworCQkJdHJ5OgorCQkJCWlmIGxpbmVfc3RyLmNvdW50KCc6JykgPT0gMjoKKwkJCQkJKGRldmljZSwgaWdub3JlLCBwZXJjZW50YWdlKSA9IGxpbmVfc3RyLnNwbGl0KCc6JykKKwkJCQkJYmFja2dyb3VuZF9qb2IuUGVyY2VudCA9IFwKKwkJCQkJCXJvdW5kKGZsb2F0KHBlcmNlbnRhZ2Uuc3RyaXAoKVs6LTFdKSwgMSkKKwkJCWV4Y2VwdCBWYWx1ZUVycm9yOgorCQkJCWxvZ19lcnJvcigiVHJ5aW5nIHRvIHBhcnNlIHBlcmNlbnRhZ2Ugd2hpY2ggZmFpbGVkIGZvciAlcyIgJQorCQkJCQlsaW5lX3N0cikKKworCQlvdXQgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKworCQlpZiBwcm9jZXNzLnJldHVybmNvZGUgPT0gMDoKKwkJCWJhY2tncm91bmRfam9iLlBlcmNlbnQgPSAxMDAKKworCQliYWNrZ3JvdW5kX2pvYi5zZXRfcmVzdWx0KHByb2Nlc3MucmV0dXJuY29kZSwgb3V0WzFdKQorCisJZXhjZXB0IEV4Y2VwdGlvbjoKKwkJIyBJbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCB3ZSBibG93IHVwLCB3ZSBuZWVkIHRvIHVuYmxvY2sgY2FsbGVyIHdoaWNoCisJCSMgaXMgd2FpdGluZyBvbiBhbiBhbnN3ZXIuCisJCXN0ID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorCQllcnJvciA9ICJFeGNlcHRpb24gaW4gYmFja2dyb3VuZCB0aHJlYWQ6IFxuJXMiICUgc3QKKwkJbG9nX2Vycm9yKGVycm9yKQorCQliYWNrZ3JvdW5kX2pvYi5zZXRfcmVzdWx0KDEsIGVycm9yKQorCisKK2RlZiBhZGQoY29tbWFuZCwgcmVwb3J0aW5nX2pvYik6CisJIyBDcmVhdGUgdGhlIHRocmVhZCwgZ2V0IGl0IHJ1bm5pbmcgYW5kIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0CisJdCA9IHRocmVhZGluZy5UaHJlYWQoCisJCXRhcmdldD1iYWNrZ3JvdW5kX2V4ZWN1dGUsCisJCW5hbWU9InRocmVhZDogIiArICcgJy5qb2luKGNvbW1hbmQpLAorCQlhcmdzPShjb21tYW5kLCByZXBvcnRpbmdfam9iKSkKKwl0LnN0YXJ0KCkKKworCXdpdGggX3Jsb2NrOgorCQlfdGhyZWFkX2xpc3QuYXBwZW5kKHQpCisKKworZGVmIHdhaXRfdGhyZWFkKGpvYiwgdGltZW91dCwgY2IsIGNiZSk6CisJIyBXZSBuZWVkIHRvIHB1dCB0aGUgd2FpdCBvbiBpdCdzIG93biB0aHJlYWQsIHNvIHRoYXQgd2UgZG9uJ3QgYmxvY2sgdGhlCisJIyBlbnRpcmUgZGJ1cyBxdWV1ZSBwcm9jZXNzaW5nIHRocmVhZAorCXRyeToKKwkJY2Ioam9iLnN0YXRlLldhaXQodGltZW91dCkpCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorCQljYmUoIldhaXQgZXhjZXB0aW9uOiAlcyIgJSBzdHIoZSkpCisJcmV0dXJuIDAKKworCitkZWYgYWRkX3dhaXQoam9iLCB0aW1lb3V0LCBjYiwgY2JlKToKKworCWlmIHRpbWVvdXQgPT0gMDoKKwkJIyBVc2VycyBhcmUgYmFzaWNhbGx5IHBvbGxpbmcsIGRvIG5vdCBjcmVhdGUgdGhyZWFkCisJCWNiKGpvYi5Db21wbGV0ZSkKKwllbHNlOgorCQl0ID0gdGhyZWFkaW5nLlRocmVhZCgKKwkJCXRhcmdldD13YWl0X3RocmVhZCwKKwkJCW5hbWU9InRocmVhZCBqb2IuV2FpdDogJXMiICUgam9iLmRidXNfb2JqZWN0X3BhdGgoKSwKKwkJCWFyZ3M9KGpvYiwgdGltZW91dCwgY2IsIGNiZSkKKwkJKQorCisJCXQuc3RhcnQoKQorCQl3aXRoIF9ybG9jazoKKwkJCV90aHJlYWRfbGlzdC5hcHBlbmQodCkKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvY2ZnLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9jZmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYzhhZQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvY2ZnLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IG9zCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgcXVldWUKK2ltcG9ydCBpdGVydG9vbHMKK3RyeToKKwlmcm9tIC4gaW1wb3J0IHBhdGgKK2V4Y2VwdCBTeXN0ZW1FcnJvcjoKKwlpbXBvcnQgcGF0aAorCitMVk1fQ01EID0gb3MuZ2V0ZW52KCdMVk1fQklOQVJZJywgcGF0aC5MVk1fQklOQVJZKQorCisjIFRoaXMgaXMgdGhlIGdsb2JhbCBvYmplY3QgbWFuYWdlcgorb20gPSBOb25lCisKKyMgVGhpcyBpcyB0aGUgZ2xvYmFsIGJ1cyBjb25uZWN0aW9uCitidXMgPSBOb25lCisKKyMgU2hhcmVkIHN0YXRlIHZhcmlhYmxlIGFjcm9zcyBhbGwgcHJvY2Vzc2VzCitydW4gPSBtdWx0aXByb2Nlc3NpbmcuVmFsdWUoJ2knLCAxKQorCisjIERlYnVnCitERUJVRyA9IFRydWUKKworIyBVc2UgbHZtIHNoZWxsCitVU0VfU0hFTEwgPSBGYWxzZQorCisjIExvY2sgdXNlZCBieSBwcHJpbnQKK3N0ZG91dF9sb2NrID0gbXVsdGlwcm9jZXNzaW5nLkxvY2soKQorCitraWNrX3EgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUoKQord29ya2VyX3EgPSBxdWV1ZS5RdWV1ZSgpCisKKyMgTWFpbiBldmVudCBsb29wCitsb29wID0gTm9uZQorCitCQVNFX0lOVEVSRkFDRSA9ICdjb20ucmVkaGF0Lmx2bWRidXMxJworUFZfSU5URVJGQUNFID0gQkFTRV9JTlRFUkZBQ0UgKyAnLlB2JworVkdfSU5URVJGQUNFID0gQkFTRV9JTlRFUkZBQ0UgKyAnLlZnJworTFZfSU5URVJGQUNFID0gQkFTRV9JTlRFUkZBQ0UgKyAnLkx2JworTFZfQ09NTU9OX0lOVEVSRkFDRSA9IEJBU0VfSU5URVJGQUNFICsgJy5MdkNvbW1vbicKK1RISU5fUE9PTF9JTlRFUkZBQ0UgPSBCQVNFX0lOVEVSRkFDRSArICcuVGhpblBvb2wnCitDQUNIRV9QT09MX0lOVEVSRkFDRSA9IEJBU0VfSU5URVJGQUNFICsgJy5DYWNoZVBvb2wnCitMVl9DQUNIRUQgPSBCQVNFX0lOVEVSRkFDRSArICcuQ2FjaGVkTHYnCitTTkFQU0hPVF9JTlRFUkZBQ0UgPSBCQVNFX0lOVEVSRkFDRSArICcuU25hcHNob3QnCitNQU5BR0VSX0lOVEVSRkFDRSA9IEJBU0VfSU5URVJGQUNFICsgJy5NYW5hZ2VyJworSk9CX0lOVEVSRkFDRSA9IEJBU0VfSU5URVJGQUNFICsgJy5Kb2InCisKK0JBU0VfT0JKX1BBVEggPSAnLycgKyBCQVNFX0lOVEVSRkFDRS5yZXBsYWNlKCcuJywgJy8nKQorUFZfT0JKX1BBVEggPSBCQVNFX09CSl9QQVRIICsgJy9QdicKK1ZHX09CSl9QQVRIID0gQkFTRV9PQkpfUEFUSCArICcvVmcnCitMVl9PQkpfUEFUSCA9IEJBU0VfT0JKX1BBVEggKyAnL0x2JworVEhJTl9QT09MX1BBVEggPSBCQVNFX09CSl9QQVRIICsgIi9UaGluUG9vbCIKK0NBQ0hFX1BPT0xfUEFUSCA9IEJBU0VfT0JKX1BBVEggKyAiL0NhY2hlUG9vbCIKK0hJRERFTl9MVl9QQVRIID0gQkFTRV9PQkpfUEFUSCArICIvSGlkZGVuTHYiCitNQU5BR0VSX09CSl9QQVRIID0gQkFTRV9PQkpfUEFUSCArICcvTWFuYWdlcicKK0pPQl9PQkpfUEFUSCA9IEJBU0VfT0JKX1BBVEggKyAnL0pvYicKKworIyBDb3VudGVycyBmb3Igb2JqZWN0IHBhdGggZ2VuZXJhdGlvbgorcHZfaWQgPSBpdGVydG9vbHMuY291bnQoKQordmdfaWQgPSBpdGVydG9vbHMuY291bnQoKQorbHZfaWQgPSBpdGVydG9vbHMuY291bnQoKQordGhpbl9pZCA9IGl0ZXJ0b29scy5jb3VudCgpCitjYWNoZV9wb29sX2lkID0gaXRlcnRvb2xzLmNvdW50KCkKK2pvYl9pZCA9IGl0ZXJ0b29scy5jb3VudCgpCitoaWRkZW5fbHYgPSBpdGVydG9vbHMuY291bnQoKQorCisjIFVzZWQgdG8gcHJldmVudCBjaXJjdWxhciBpbXBvcnRzLi4uCitsb2FkID0gTm9uZQorCisjIEdsb2JhbCBjYWNoZWQgc3RhdGUKK2RiID0gTm9uZQorCisjIGx2bSBmbGlnaHQgcmVjb3JkZXIKK2JsYWNrYm94ID0gTm9uZQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9jbWRoYW5kbGVyLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9jbWRoYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzU4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWRidXNkL2NtZGhhbmRsZXIucHkKQEAgLTAsMCArMSw3MjQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQoraW1wb3J0IHRpbWUKK2ltcG9ydCB0aHJlYWRpbmcKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgoraW1wb3J0IGNvbGxlY3Rpb25zCisKK3RyeToKKwlmcm9tIC4gaW1wb3J0IGNmZworCWZyb20gLnV0aWxzIGltcG9ydCBwdl9kZXN0X3JhbmdlcywgbG9nX2RlYnVnLCBsb2dfZXJyb3IKKwlmcm9tIC5sdm1fc2hlbGxfcHJveHkgaW1wb3J0IExWTVNoZWxsUHJveHkKK2V4Y2VwdCBTeXN0ZW1FcnJvcjoKKwlpbXBvcnQgY2ZnCisJZnJvbSB1dGlscyBpbXBvcnQgcHZfZGVzdF9yYW5nZXMsIGxvZ19kZWJ1ZywgbG9nX2Vycm9yCisJZnJvbSBsdm1fc2hlbGxfcHJveHkgaW1wb3J0IExWTVNoZWxsUHJveHkKKwordHJ5OgorCWltcG9ydCBzaW1wbGVqc29uIGFzIGpzb24KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKwlpbXBvcnQganNvbgorCitTRVAgPSAne3x9JworCit0b3RhbF90aW1lID0gMC4wCit0b3RhbF9jb3VudCA9IDAKKworIyBXZSBuZWVkIHRvIHByZXZlbnQgZGlmZmVyZW50IHRocmVhZHMgZnJvbSB1c2luZyB0aGUgc2FtZSBsdm0gc2hlbGwKKyMgYXQgdGhlIHNhbWUgdGltZS4KK2NtZF9sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKKworIyBUaGUgYWN0dWFsIG1ldGhvZCB3aGljaCBnZXRzIGNhbGxlZCB0byBpbnZva2UgdGhlIGx2bSBjb21tYW5kLCBjYW4gdmFyeQorIyBmcm9tIGZvcmtpbmcgYSBuZXcgcHJvY2VzcyB0byB1c2luZyBsdm0gc2hlbGwKK190X2NhbGwgPSBOb25lCisKKworY2xhc3MgTHZtRXhlY3V0aW9uTWV0YShvYmplY3QpOgorCisJZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmRlZCwgY21kLCBlYywgc3Rkb3V0X3R4dCwgc3RkZXJyX3R4dCk6CisJCXNlbGYuc3RhcnQgPSBzdGFydAorCQlzZWxmLmVuZGVkID0gZW5kZWQKKwkJc2VsZi5jbWQgPSBjbWQKKwkJc2VsZi5lYyA9IGVjCisJCXNlbGYuc3Rkb3V0X3R4dCA9IHN0ZG91dF90eHQKKwkJc2VsZi5zdGRlcnJfdHh0ID0gc3RkZXJyX3R4dAorCisJZGVmIF9fc3RyX18oc2VsZik6CisJCXJldHVybiAiRUM9ICVkIGZvciAlc1xuIiBcCisJCQkiU1RBUlRFRDogJWYsIEVOREVEOiAlZlxuIiBcCisJCQkiU1RET1VUPSVzXG4iIFwKKwkJCSJTVERFUlI9JXNcbiIgJSBcCisJCQkoc2VsZi5lYywgc3RyKHNlbGYuY21kKSwgc2VsZi5zdGFydCwgc2VsZi5lbmRlZCwgc2VsZi5zdGRvdXRfdHh0LAorCQkJc2VsZi5zdGRlcnJfdHh0KQorCisKK2NsYXNzIEx2bUZsaWdodFJlY29yZGVyKG9iamVjdCk6CisKKwlkZWYgX19pbml0X18oc2VsZik6CisJCXNlbGYucXVldWUgPSBjb2xsZWN0aW9ucy5kZXF1ZShtYXhsZW49MTYpCisKKwlkZWYgYWRkKHNlbGYsIGx2bV9leGVjX21ldGEpOgorCQlzZWxmLnF1ZXVlLmFwcGVuZChsdm1fZXhlY19tZXRhKQorCisJZGVmIGR1bXAoc2VsZik6CisJCXdpdGggY21kX2xvY2s6CisJCQlsb2dfZXJyb3IoIkxWTSBkYnVzIGZsaWdodCByZWNvcmRlciBTVEFSVCIpCisJCQlmb3IgYyBpbiBzZWxmLnF1ZXVlOgorCQkJCWxvZ19lcnJvcihzdHIoYykpCisJCQlsb2dfZXJyb3IoIkxWTSBkYnVzIGZsaWdodCByZWNvcmRlciBFTkQiKQorCisKK2NmZy5ibGFja2JveCA9IEx2bUZsaWdodFJlY29yZGVyKCkKKworCitkZWYgX2RlYnVnX2MoY21kLCBleGl0X2NvZGUsIG91dCk6CisJbG9nX2Vycm9yKCdDTUQ9ICVzJyAlICcgJy5qb2luKGNtZCkpCisJbG9nX2Vycm9yKCgiRUM9ICVkIiAlIGV4aXRfY29kZSkpCisJbG9nX2Vycm9yKCgiU1RET1VUPVxuICVzXG4iICUgb3V0WzBdKSkKKwlsb2dfZXJyb3IoKCJTVERFUlI9XG4gJXNcbiIgJSBvdXRbMV0pKQorCisKK2RlZiBjYWxsX2x2bShjb21tYW5kLCBkZWJ1Zz1GYWxzZSk6CisJIiIiCisJQ2FsbCBhbiBleGVjdXRhYmxlIGFuZCByZXR1cm4gYSB0dXBsZSBvZiBleGl0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKKwk6cGFyYW0gY29tbWFuZDogICAgIENvbW1hbmQgdG8gZXhlY3V0ZQorCTpwYXJhbSBkZWJ1ZzogICAgICAgRHVtcCBkZWJ1ZyB0byBzdGRvdXQKKwkiIiIKKwkjIHByaW50ICdTVEFDSzonCisJIyBmb3IgbGluZSBpbiB0cmFjZWJhY2suZm9ybWF0X3N0YWNrKCk6CisJIyAgICBwcmludCBsaW5lLnN0cmlwKCkKKworCSMgUHJlcGVuZCB0aGUgZnVsbCBsdm0gZXhlY3V0YWJsZSBzbyB0aGF0IHdlIGNhbiBydW4gZGlmZmVyZW50IHZlcnNpb25zCisJIyBpbiBkaWZmZXJlbnQgbG9jYXRpb25zIG9uIHRoZSBzYW1lIGJveAorCWNvbW1hbmQuaW5zZXJ0KDAsIGNmZy5MVk1fQ01EKQorCisJcHJvY2VzcyA9IFBvcGVuKGNvbW1hbmQsIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwgY2xvc2VfZmRzPVRydWUpCisJb3V0ID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisKKwlzdGRvdXRfdGV4dCA9IGJ5dGVzKG91dFswXSkuZGVjb2RlKCJ1dGYtOCIpCisJc3RkZXJyX3RleHQgPSBieXRlcyhvdXRbMV0pLmRlY29kZSgidXRmLTgiKQorCisJaWYgZGVidWcgb3IgcHJvY2Vzcy5yZXR1cm5jb2RlICE9IDA6CisJCV9kZWJ1Z19jKGNvbW1hbmQsIHByb2Nlc3MucmV0dXJuY29kZSwgKHN0ZG91dF90ZXh0LCBzdGRlcnJfdGV4dCkpCisKKwlpZiBwcm9jZXNzLnJldHVybmNvZGUgPT0gMDoKKwkJaWYgY2ZnLkRFQlVHIGFuZCBvdXRbMV0gYW5kIGxlbihvdXRbMV0pIGFuZCAnaGVscCcgbm90IGluIGNvbW1hbmQ6CisJCQlsb2dfZXJyb3IoJ1dBUk5JTkc6IGx2bSBpcyBvdXQtcHV0dGluZyB0ZXh0IHRvIFNUREVSUiBvbiBzdWNjZXNzIScpCisJCQlfZGVidWdfYyhjb21tYW5kLCBwcm9jZXNzLnJldHVybmNvZGUsIChzdGRvdXRfdGV4dCwgc3RkZXJyX3RleHQpKQorCisJcmV0dXJuIHByb2Nlc3MucmV0dXJuY29kZSwgc3Rkb3V0X3RleHQsIHN0ZGVycl90ZXh0CisKKworZGVmIF9zaGVsbF9jZmcoKToKKwlnbG9iYWwgX3RfY2FsbAorCWxvZ19kZWJ1ZygnVXNpbmcgbHZtIHNoZWxsIScpCisJbHZtX3NoZWxsID0gTFZNU2hlbGxQcm94eSgpCisJX3RfY2FsbCA9IGx2bV9zaGVsbC5jYWxsX2x2bQorCisKK2lmIGNmZy5VU0VfU0hFTEw6CisJX3NoZWxsX2NmZygpCitlbHNlOgorCV90X2NhbGwgPSBjYWxsX2x2bQorCisKK2RlZiBzZXRfZXhlY3V0aW9uKHNoZWxsKToKKwlnbG9iYWwgX3RfY2FsbAorCXdpdGggY21kX2xvY2s6CisJCV90X2NhbGwgPSBOb25lCisJCWlmIHNoZWxsOgorCQkJbG9nX2RlYnVnKCdVc2luZyBsdm0gc2hlbGwhJykKKwkJCWx2bV9zaGVsbCA9IExWTVNoZWxsUHJveHkoKQorCQkJX3RfY2FsbCA9IGx2bV9zaGVsbC5jYWxsX2x2bQorCQllbHNlOgorCQkJX3RfY2FsbCA9IGNhbGxfbHZtCisKKworZGVmIHRpbWVfd3JhcHBlcihjb21tYW5kLCBkZWJ1Zz1GYWxzZSk6CisJZ2xvYmFsIHRvdGFsX3RpbWUKKwlnbG9iYWwgdG90YWxfY291bnQKKworCXdpdGggY21kX2xvY2s6CisJCXN0YXJ0ID0gdGltZS50aW1lKCkKKwkJcmVzdWx0cyA9IF90X2NhbGwoY29tbWFuZCwgZGVidWcpCisJCWVuZGVkID0gdGltZS50aW1lKCkKKwkJdG90YWxfdGltZSArPSAoZW5kZWQgLSBzdGFydCkKKwkJdG90YWxfY291bnQgKz0gMQorCQljZmcuYmxhY2tib3guYWRkKEx2bUV4ZWN1dGlvbk1ldGEoc3RhcnQsIGVuZGVkLCBjb21tYW5kLCAqcmVzdWx0cykpCisJcmV0dXJuIHJlc3VsdHMKKworCitjYWxsID0gdGltZV93cmFwcGVyCisKKworIyBEZWZhdWx0IGNtZAorIyBQbGFjZSBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgZXZlcnkgY29tbWFuZCBoZXJlLgorZGVmIF9kYyhjbWQsIGFyZ3MpOgorCWMgPSBbY21kLCAnLS1ub2hlYWRpbmcnLCAnLS1zZXBhcmF0b3InLCAnJXMnICUgU0VQLCAnLS1ub3N1ZmZpeCcsCisJCSctLXVuYnVmZmVyZWQnLCAnLS11bml0cycsICdiJ10KKwljLmV4dGVuZChhcmdzKQorCXJldHVybiBjCisKKworZGVmIHBhcnNlKG91dCk6CisJcmMgPSBbXQorCisJZm9yIGxpbmUgaW4gb3V0LnNwbGl0KCdcbicpOgorCQkjIFRoaXMgbGluZSBpbmNsdWRlcyBzZXBhcmF0b3JzLCBzbyBwcm9jZXNzIHRoZW0KKwkJaWYgU0VQIGluIGxpbmU6CisJCQllbGVtID0gbGluZS5zcGxpdChTRVApCisJCQljbGVhbmVkX2VsZW0gPSBbXQorCQkJZm9yIGUgaW4gZWxlbToKKwkJCQllID0gZS5zdHJpcCgpCisJCQkJY2xlYW5lZF9lbGVtLmFwcGVuZChlKQorCisJCQlpZiBsZW4oY2xlYW5lZF9lbGVtKSA+IDE6CisJCQkJcmMuYXBwZW5kKGNsZWFuZWRfZWxlbSkKKwkJZWxzZToKKwkJCXQgPSBsaW5lLnN0cmlwKCkKKwkJCWlmIGxlbih0KSA+IDA6CisJCQkJcmMuYXBwZW5kKHQpCisJcmV0dXJuIHJjCisKKworZGVmIHBhcnNlX2NvbHVtbl9uYW1lcyhvdXQsIGNvbHVtbl9uYW1lcyk6CisJbGluZXMgPSBwYXJzZShvdXQpCisJcmMgPSBbXQorCisJZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGxpbmVzKSk6CisJCWQgPSBkaWN0KGxpc3QoemlwKGNvbHVtbl9uYW1lcywgbGluZXNbaV0pKSkKKwkJcmMuYXBwZW5kKGQpCisKKwlyZXR1cm4gcmMKKworCitkZWYgb3B0aW9uc190b19jbGlfYXJncyhvcHRpb25zKToKKwlyYyA9IFtdCisJZm9yIGssIHYgaW4gbGlzdChkaWN0KG9wdGlvbnMpLml0ZW1zKCkpOgorCQlpZiBrLnN0YXJ0c3dpdGgoIi0iKToKKwkJCXJjLmFwcGVuZChrKQorCQllbHNlOgorCQkJcmMuYXBwZW5kKCItLSVzIiAlIGspCisJCWlmIHYgIT0gIiI6CisJCQlyYy5hcHBlbmQoc3RyKHYpKQorCXJldHVybiByYworCisKK2RlZiBwdl9yZW1vdmUoZGV2aWNlLCByZW1vdmVfb3B0aW9ucyk6CisJY21kID0gWydwdnJlbW92ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKHJlbW92ZV9vcHRpb25zKSkKKwljbWQuYXBwZW5kKGRldmljZSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIF90YWcob3BlcmF0aW9uLCB3aGF0LCBhZGQsIHJtLCB0YWdfb3B0aW9ucyk6CisJY21kID0gW29wZXJhdGlvbl0KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3ModGFnX29wdGlvbnMpKQorCisJaWYgaXNpbnN0YW5jZSh3aGF0LCBsaXN0KToKKwkJY21kLmV4dGVuZCh3aGF0KQorCWVsc2U6CisJCWNtZC5hcHBlbmQod2hhdCkKKworCWlmIGFkZDoKKwkJY21kLmV4dGVuZChsaXN0KGNoYWluLmZyb21faXRlcmFibGUoKCctLWFkZHRhZycsIHgpIGZvciB4IGluIGFkZCkpKQorCWlmIHJtOgorCQljbWQuZXh0ZW5kKGxpc3QoY2hhaW4uZnJvbV9pdGVyYWJsZSgoJy0tZGVsdGFnJywgeCkgZm9yIHggaW4gcm0pKSkKKworCXJldHVybiBjYWxsKGNtZCwgRmFsc2UpCisKKworZGVmIHB2X3RhZyhwdl9kZXZpY2VzLCBhZGQsIHJtLCB0YWdfb3B0aW9ucyk6CisJcmV0dXJuIF90YWcoJ3B2Y2hhbmdlJywgcHZfZGV2aWNlcywgYWRkLCBybSwgdGFnX29wdGlvbnMpCisKKworZGVmIHZnX3RhZyh2Z19uYW1lLCBhZGQsIHJtLCB0YWdfb3B0aW9ucyk6CisJcmV0dXJuIF90YWcoJ3ZnY2hhbmdlJywgdmdfbmFtZSwgYWRkLCBybSwgdGFnX29wdGlvbnMpCisKKworZGVmIGx2X3RhZyhsdl9uYW1lLCBhZGQsIHJtLCB0YWdfb3B0aW9ucyk6CisJcmV0dXJuIF90YWcoJ2x2Y2hhbmdlJywgbHZfbmFtZSwgYWRkLCBybSwgdGFnX29wdGlvbnMpCisKKworZGVmIHZnX3JlbmFtZSh2ZywgbmV3X25hbWUsIHJlbmFtZV9vcHRpb25zKToKKwljbWQgPSBbJ3ZncmVuYW1lJ10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MocmVuYW1lX29wdGlvbnMpKQorCWNtZC5leHRlbmQoW3ZnLCBuZXdfbmFtZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiB2Z19yZW1vdmUodmdfbmFtZSwgcmVtb3ZlX29wdGlvbnMpOgorCWNtZCA9IFsndmdyZW1vdmUnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhyZW1vdmVfb3B0aW9ucykpCisJY21kLmV4dGVuZChbJy1mJywgdmdfbmFtZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiB2Z19sdl9jcmVhdGUodmdfbmFtZSwgY3JlYXRlX29wdGlvbnMsIG5hbWUsIHNpemVfYnl0ZXMsIHB2X2Rlc3RzKToKKwljbWQgPSBbJ2x2Y3JlYXRlJ10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoY3JlYXRlX29wdGlvbnMpKQorCWNtZC5leHRlbmQoWyctLXNpemUnLCBzdHIoc2l6ZV9ieXRlcykgKyAnQiddKQorCWNtZC5leHRlbmQoWyctLW5hbWUnLCBuYW1lLCB2Z19uYW1lXSkKKwlwdl9kZXN0X3JhbmdlcyhjbWQsIHB2X2Rlc3RzKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgdmdfbHZfc25hcHNob3QodmdfbmFtZSwgc25hcHNob3Rfb3B0aW9ucywgbmFtZSwgc2l6ZV9ieXRlcyk6CisJY21kID0gWydsdmNyZWF0ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKHNuYXBzaG90X29wdGlvbnMpKQorCWNtZC5leHRlbmQoWyItcyJdKQorCisJaWYgc2l6ZV9ieXRlcyAhPSAwOgorCQljbWQuZXh0ZW5kKFsnLS1zaXplJywgc3RyKHNpemVfYnl0ZXMpICsgJ0InXSkKKworCWNtZC5leHRlbmQoWyctLW5hbWUnLCBuYW1lLCB2Z19uYW1lXSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIHZnX2x2X2NyZWF0ZV9saW5lYXIodmdfbmFtZSwgY3JlYXRlX29wdGlvbnMsIG5hbWUsIHNpemVfYnl0ZXMsIHRoaW5fcG9vbCk6CisJY21kID0gWydsdmNyZWF0ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGNyZWF0ZV9vcHRpb25zKSkKKworCWlmIG5vdCB0aGluX3Bvb2w6CisJCWNtZC5leHRlbmQoWyctLXNpemUnLCBzdHIoc2l6ZV9ieXRlcykgKyAnQiddKQorCWVsc2U6CisJCWNtZC5leHRlbmQoWyctLXRoaW4nLCAnLS1zaXplJywgc3RyKHNpemVfYnl0ZXMpICsgJ0InXSkKKwljbWQuZXh0ZW5kKFsnLS1uYW1lJywgbmFtZSwgdmdfbmFtZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiB2Z19sdl9jcmVhdGVfc3RyaXBlZCh2Z19uYW1lLCBjcmVhdGVfb3B0aW9ucywgbmFtZSwgc2l6ZV9ieXRlcywKKwkJCQkJCQludW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IsIHRoaW5fcG9vbCk6CisJY21kID0gWydsdmNyZWF0ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGNyZWF0ZV9vcHRpb25zKSkKKworCWlmIG5vdCB0aGluX3Bvb2w6CisJCWNtZC5leHRlbmQoWyctLXNpemUnLCBzdHIoc2l6ZV9ieXRlcykgKyAnQiddKQorCWVsc2U6CisJCWNtZC5leHRlbmQoWyctLXRoaW4nLCAnLS1zaXplJywgc3RyKHNpemVfYnl0ZXMpICsgJ0InXSkKKworCWNtZC5leHRlbmQoWyctLXN0cmlwZXMnLCBzdHIobnVtX3N0cmlwZXMpXSkKKworCWlmIHN0cmlwZV9zaXplX2tiICE9IDA6CisJCWNtZC5leHRlbmQoWyctLXN0cmlwZXNpemUnLCBzdHIoc3RyaXBlX3NpemVfa2IpXSkKKworCWNtZC5leHRlbmQoWyctLW5hbWUnLCBuYW1lLCB2Z19uYW1lXSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIF92Z19sdl9jcmVhdGVfcmFpZCh2Z19uYW1lLCBjcmVhdGVfb3B0aW9ucywgbmFtZSwgcmFpZF90eXBlLCBzaXplX2J5dGVzLAorCQkJCQkJbnVtX3N0cmlwZXMsIHN0cmlwZV9zaXplX2tiKToKKwljbWQgPSBbJ2x2Y3JlYXRlJ10KKworCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhjcmVhdGVfb3B0aW9ucykpCisKKwljbWQuZXh0ZW5kKFsnLS10eXBlJywgcmFpZF90eXBlXSkKKwljbWQuZXh0ZW5kKFsnLS1zaXplJywgc3RyKHNpemVfYnl0ZXMpICsgJ0InXSkKKworCWlmIG51bV9zdHJpcGVzICE9IDA6CisJCWNtZC5leHRlbmQoWyctLXN0cmlwZXMnLCBzdHIobnVtX3N0cmlwZXMpXSkKKworCWlmIHN0cmlwZV9zaXplX2tiICE9IDA6CisJCWNtZC5leHRlbmQoWyctLXN0cmlwZXNpemUnLCBzdHIoc3RyaXBlX3NpemVfa2IpXSkKKworCWNtZC5leHRlbmQoWyctLW5hbWUnLCBuYW1lLCB2Z19uYW1lXSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIHZnX2x2X2NyZWF0ZV9yYWlkKHZnX25hbWUsIGNyZWF0ZV9vcHRpb25zLCBuYW1lLCByYWlkX3R5cGUsIHNpemVfYnl0ZXMsCisJCQkJCQludW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IpOgorCWNtZCA9IFsnbHZjcmVhdGUnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhjcmVhdGVfb3B0aW9ucykpCisKKwlyZXR1cm4gX3ZnX2x2X2NyZWF0ZV9yYWlkKHZnX25hbWUsIGNyZWF0ZV9vcHRpb25zLCBuYW1lLCByYWlkX3R5cGUsCisJCQkJCQkJCXNpemVfYnl0ZXMsIG51bV9zdHJpcGVzLCBzdHJpcGVfc2l6ZV9rYikKKworCitkZWYgdmdfbHZfY3JlYXRlX21pcnJvcih2Z19uYW1lLCBjcmVhdGVfb3B0aW9ucywgbmFtZSwgc2l6ZV9ieXRlcywgbnVtX2NvcGllcyk6CisJY21kID0gWydsdmNyZWF0ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGNyZWF0ZV9vcHRpb25zKSkKKworCWNtZC5leHRlbmQoWyctLXR5cGUnLCAnbWlycm9yJ10pCisJY21kLmV4dGVuZChbJy0tbWlycm9ycycsIHN0cihudW1fY29waWVzKV0pCisJY21kLmV4dGVuZChbJy0tc2l6ZScsIHN0cihzaXplX2J5dGVzKSArICdCJ10pCisJY21kLmV4dGVuZChbJy0tbmFtZScsIG5hbWUsIHZnX25hbWVdKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgdmdfY3JlYXRlX2NhY2hlX3Bvb2wobWRfZnVsbF9uYW1lLCBkYXRhX2Z1bGxfbmFtZSwgY3JlYXRlX29wdGlvbnMpOgorCWNtZCA9IFsnbHZjb252ZXJ0J10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoY3JlYXRlX29wdGlvbnMpKQorCWNtZC5leHRlbmQoWyctLXR5cGUnLCAnY2FjaGUtcG9vbCcsICctLWZvcmNlJywgJy15JywKKwkJCQknLS1wb29sbWV0YWRhdGEnLCBtZF9mdWxsX25hbWUsIGRhdGFfZnVsbF9uYW1lXSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIHZnX2NyZWF0ZV90aGluX3Bvb2wobWRfZnVsbF9uYW1lLCBkYXRhX2Z1bGxfbmFtZSwgY3JlYXRlX29wdGlvbnMpOgorCWNtZCA9IFsnbHZjb252ZXJ0J10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoY3JlYXRlX29wdGlvbnMpKQorCWNtZC5leHRlbmQoWyctLXR5cGUnLCAndGhpbi1wb29sJywgJy0tZm9yY2UnLCAnLXknLAorCQkJCSctLXBvb2xtZXRhZGF0YScsIG1kX2Z1bGxfbmFtZSwgZGF0YV9mdWxsX25hbWVdKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgbHZfcmVtb3ZlKGx2X3BhdGgsIHJlbW92ZV9vcHRpb25zKToKKwljbWQgPSBbJ2x2cmVtb3ZlJ10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MocmVtb3ZlX29wdGlvbnMpKQorCWNtZC5leHRlbmQoWyctZicsIGx2X3BhdGhdKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgbHZfcmVuYW1lKGx2X3BhdGgsIG5ld19uYW1lLCByZW5hbWVfb3B0aW9ucyk6CisJY21kID0gWydsdnJlbmFtZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKHJlbmFtZV9vcHRpb25zKSkKKwljbWQuZXh0ZW5kKFtsdl9wYXRoLCBuZXdfbmFtZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiBsdl9yZXNpemUobHZfZnVsbF9uYW1lLCBzaXplX2NoYW5nZSwgcHZfZGVzdHMsCisJCQkJcmVzaXplX29wdGlvbnMpOgorCWNtZCA9IFsnbHZyZXNpemUnLCAnLS1mb3JjZSddCisKKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MocmVzaXplX29wdGlvbnMpKQorCisJaWYgc2l6ZV9jaGFuZ2UgPCAwOgorCQljbWQuYXBwZW5kKCItTC0lZEIiICUgKC1zaXplX2NoYW5nZSkpCisJZWxzZToKKwkJY21kLmFwcGVuZCgiLUwrJWRCIiAlIChzaXplX2NoYW5nZSkpCisKKwljbWQuYXBwZW5kKGx2X2Z1bGxfbmFtZSkKKwlwdl9kZXN0X3JhbmdlcyhjbWQsIHB2X2Rlc3RzKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgbHZfbHZfY3JlYXRlKGx2X2Z1bGxfbmFtZSwgY3JlYXRlX29wdGlvbnMsIG5hbWUsIHNpemVfYnl0ZXMpOgorCWNtZCA9IFsnbHZjcmVhdGUnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhjcmVhdGVfb3B0aW9ucykpCisJY21kLmV4dGVuZChbJy0tdmlydHVhbHNpemUnLCBzdHIoc2l6ZV9ieXRlcykgKyAnQicsICctVCddKQorCWNtZC5leHRlbmQoWyctLW5hbWUnLCBuYW1lLCBsdl9mdWxsX25hbWVdKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgbHZfY2FjaGVfbHYoY2FjaGVfcG9vbF9mdWxsX25hbWUsIGx2X2Z1bGxfbmFtZSwgY2FjaGVfb3B0aW9ucyk6CisJIyBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIC0tY2FjaGVwb29sIFZHL0NhY2hlUG9vbExWIFZHL09yaWdpbkxWCisJY21kID0gWydsdmNvbnZlcnQnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhjYWNoZV9vcHRpb25zKSkKKwljbWQuZXh0ZW5kKFsnLXknLCAnLS10eXBlJywgJ2NhY2hlJywgJy0tY2FjaGVwb29sJywKKwkJCQljYWNoZV9wb29sX2Z1bGxfbmFtZSwgbHZfZnVsbF9uYW1lXSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIGx2X2RldGFjaF9jYWNoZShsdl9mdWxsX25hbWUsIGRldGFjaF9vcHRpb25zLCBkZXN0cm95X2NhY2hlKToKKwljbWQgPSBbJ2x2Y29udmVydCddCisJaWYgZGVzdHJveV9jYWNoZToKKwkJb3B0aW9uID0gJy0tdW5jYWNoZScKKwllbHNlOgorCQkjIEN1cnJlbnRseSBmYWlybHkgZGFuZ2Vyb3VzCisJCSMgc2VlOiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTEyNDg5NzIKKwkJb3B0aW9uID0gJy0tc3BsaXRjYWNoZScKKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoZGV0YWNoX29wdGlvbnMpKQorCSMgbmVlZGVkIHRvIHByZXZlbnQgaW50ZXJhY3RpdmUgcXVlc3Rpb25zCisJY21kLmV4dGVuZChbIi0teWVzIiwgIi0tZm9yY2UiXSkKKwljbWQuZXh0ZW5kKFtvcHRpb24sIGx2X2Z1bGxfbmFtZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiBzdXBwb3J0c19qc29uKCk6CisJY21kID0gWydoZWxwJ10KKwlyYywgb3V0LCBlcnIgPSBjYWxsKGNtZCkKKwlpZiByYyA9PSAwOgorCQlpZiAnZnVsbHJlcG9ydCcgaW4gZXJyOgorCQkJcmV0dXJuIFRydWUKKwlyZXR1cm4gRmFsc2UKKworCitkZWYgbHZtX2Z1bGxfcmVwb3J0X2pzb24oKToKKwlwdl9jb2x1bW5zID0gWydwdl9uYW1lJywgJ3B2X3V1aWQnLCAncHZfZm10JywgJ3B2X3NpemUnLCAncHZfZnJlZScsCisJCQkJCSdwdl91c2VkJywgJ2Rldl9zaXplJywgJ3B2X21kYV9zaXplJywgJ3B2X21kYV9mcmVlJywKKwkJCQkJJ3B2X2JhX3N0YXJ0JywgJ3B2X2JhX3NpemUnLCAncGVfc3RhcnQnLCAncHZfcGVfY291bnQnLAorCQkJCQkncHZfcGVfYWxsb2NfY291bnQnLCAncHZfYXR0cicsICdwdl90YWdzJywgJ3ZnX25hbWUnLAorCQkJCQkndmdfdXVpZCddCisKKwlwdl9zZWdfY29sdW1ucyA9IFsncHZzZWdfc3RhcnQnLCAncHZzZWdfc2l6ZScsICdzZWd0eXBlJywKKwkJCQkJCSdwdl91dWlkJywgJ2x2X3V1aWQnLCAncHZfbmFtZSddCisKKwl2Z19jb2x1bW5zID0gWyd2Z19uYW1lJywgJ3ZnX3V1aWQnLCAndmdfZm10JywgJ3ZnX3NpemUnLCAndmdfZnJlZScsCisJCQkJCSd2Z19zeXNpZCcsICd2Z19leHRlbnRfc2l6ZScsICd2Z19leHRlbnRfY291bnQnLAorCQkJCQkndmdfZnJlZV9jb3VudCcsICd2Z19wcm9maWxlJywgJ21heF9sdicsICdtYXhfcHYnLAorCQkJCQkncHZfY291bnQnLCAnbHZfY291bnQnLCAnc25hcF9jb3VudCcsICd2Z19zZXFubycsCisJCQkJCSd2Z19tZGFfY291bnQnLCAndmdfbWRhX2ZyZWUnLCAndmdfbWRhX3NpemUnLAorCQkJCQkndmdfbWRhX3VzZWRfY291bnQnLCAndmdfYXR0cicsICd2Z190YWdzJ10KKworCWx2X2NvbHVtbnMgPSBbJ2x2X3V1aWQnLCAnbHZfbmFtZScsICdsdl9wYXRoJywgJ2x2X3NpemUnLAorCQkJCSd2Z19uYW1lJywgJ3Bvb2xfbHZfdXVpZCcsICdwb29sX2x2JywgJ29yaWdpbl91dWlkJywKKwkJCQknb3JpZ2luJywgJ2RhdGFfcGVyY2VudCcsCisJCQkJJ2x2X2F0dHInLCAnbHZfdGFncycsICd2Z191dWlkJywgJ2x2X2FjdGl2ZScsICdkYXRhX2x2JywKKwkJCQknbWV0YWRhdGFfbHYnLCAnbHZfcGFyZW50JywgJ2x2X3JvbGUnLCAnbHZfbGF5b3V0J10KKworCWx2X3NlZ19jb2x1bW5zID0gWydzZWdfcGVfcmFuZ2VzJywgJ3NlZ3R5cGUnLCAnbHZfdXVpZCddCisKKwljbWQgPSBfZGMoJ2Z1bGxyZXBvcnQnLCBbCisJCSctYScsCQkjIE5lZWQgaGlkZGVuIHRvbworCQknLS1jb25maWdyZXBvcnQnLCAncHYnLCAnLW8nLCAnLCcuam9pbihwdl9jb2x1bW5zKSwKKwkJJy0tY29uZmlncmVwb3J0JywgJ3ZnJywgJy1vJywgJywnLmpvaW4odmdfY29sdW1ucyksCisJCSctLWNvbmZpZ3JlcG9ydCcsICdsdicsICctbycsICcsJy5qb2luKGx2X2NvbHVtbnMpLAorCQknLS1jb25maWdyZXBvcnQnLCAnc2VnJywgJy1vJywgJywnLmpvaW4obHZfc2VnX2NvbHVtbnMpLAorCQknLS1jb25maWdyZXBvcnQnLCAncHZzZWcnLCAnLW8nLCAnLCcuam9pbihwdl9zZWdfY29sdW1ucyksCisJCSctLXJlcG9ydGZvcm1hdCcsICdqc29uJworCV0pCisKKwlyYywgb3V0LCBlcnIgPSBjYWxsKGNtZCkKKwlpZiByYyA9PSAwOgorCQlyZXR1cm4ganNvbi5sb2FkcyhvdXQpCisJcmV0dXJuIE5vbmUKKworCitkZWYgcHZfcmV0cmlldmVfd2l0aF9zZWdzKGRldmljZT1Ob25lKToKKwlkID0gW10KKwllcnIgPSAiIgorCW91dCA9ICIiCisJcmMgPSAwCisKKwljb2x1bW5zID0gWydwdl9uYW1lJywgJ3B2X3V1aWQnLCAncHZfZm10JywgJ3B2X3NpemUnLCAncHZfZnJlZScsCisJCQkJJ3B2X3VzZWQnLCAnZGV2X3NpemUnLCAncHZfbWRhX3NpemUnLCAncHZfbWRhX2ZyZWUnLAorCQkJCSdwdl9iYV9zdGFydCcsICdwdl9iYV9zaXplJywgJ3BlX3N0YXJ0JywgJ3B2X3BlX2NvdW50JywKKwkJCQkncHZfcGVfYWxsb2NfY291bnQnLCAncHZfYXR0cicsICdwdl90YWdzJywgJ3ZnX25hbWUnLAorCQkJCSd2Z191dWlkJywgJ3B2c2VnX3N0YXJ0JywgJ3B2c2VnX3NpemUnLCAnc2VndHlwZSddCisKKwkjIEx2bSBoYXMgc29tZSBpc3N1ZXMgd2hlcmUgaXQgcmV0dXJucyBmYWlsdXJlIHdoZW4gcXVlcnlpbmcgcHZzIHdoZW4gb3RoZXIKKwkjIG9wZXJhdGlvbnMgYXJlIGluIHByb2Nlc3MsIHNlZToKKwkjIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTI3NDA4NQorCWZvciBpIGluIHJhbmdlKDAsIDEwKToKKwkJY21kID0gX2RjKCdwdnMnLCBbJy1vJywgJywnLmpvaW4oY29sdW1ucyldKQorCisJCWlmIGRldmljZToKKwkJCWNtZC5leHRlbmQoZGV2aWNlKQorCisJCXJjLCBvdXQsIGVyciA9IGNhbGwoY21kKQorCisJCWlmIHJjID09IDA6CisJCQlkID0gcGFyc2VfY29sdW1uX25hbWVzKG91dCwgY29sdW1ucykKKwkJCWJyZWFrCisJCWVsc2U6CisJCQl0aW1lLnNsZWVwKDAuMikKKwkJCWxvZ19kZWJ1ZygiTFZNIEJ1ZyB3b3JrYXJvdW5kLCByZXRyeWluZyBwdnMgY29tbWFuZC4uLiIpCisKKwlpZiByYyAhPSAwOgorCQltc2cgPSAiV2Ugd2VyZSB1bmFibGUgdG8gZ2V0IHB2cyB0byByZXR1cm4gd2l0aG91dCBlcnJvciBhZnRlciAiIFwKKwkJCSJ0cnlpbmcgMTAgdGltZXMsIFJDPSVkLCBTVERFUlI9KCVzKSwgU1RET1VUPSglcykiICUgXAorCQkJKHJjLCBlcnIsIG91dCkKKwkJbG9nX2Vycm9yKG1zZykKKwkJcmFpc2UgUnVudGltZUVycm9yKG1zZykKKworCXJldHVybiBkCisKKworZGVmIHB2X3Jlc2l6ZShkZXZpY2UsIHNpemVfYnl0ZXMsIGNyZWF0ZV9vcHRpb25zKToKKwljbWQgPSBbJ3B2cmVzaXplJ10KKworCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhjcmVhdGVfb3B0aW9ucykpCisKKwlpZiBzaXplX2J5dGVzICE9IDA6CisJCWNtZC5leHRlbmQoWyctLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZScsIHN0cihzaXplX2J5dGVzKSArICdCJ10pCisKKwljbWQuZXh0ZW5kKFtkZXZpY2VdKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgcHZfY3JlYXRlKGNyZWF0ZV9vcHRpb25zLCBkZXZpY2VzKToKKwljbWQgPSBbJ3B2Y3JlYXRlJywgJy1mZiddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGNyZWF0ZV9vcHRpb25zKSkKKwljbWQuZXh0ZW5kKGRldmljZXMpCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiBwdl9hbGxvY2F0YWJsZShkZXZpY2UsIHllcywgYWxsb2NhdGlvbl9vcHRpb25zKToKKwl5biA9ICduJworCisJaWYgeWVzOgorCQl5biA9ICd5JworCisJY21kID0gWydwdmNoYW5nZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGFsbG9jYXRpb25fb3B0aW9ucykpCisJY21kLmV4dGVuZChbJy14JywgeW4sIGRldmljZV0pCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiBwdl9zY2FuKGFjdGl2YXRlLCBjYWNoZSwgZGV2aWNlX3BhdGhzLCBtYWpvcl9taW5vcnMsIHNjYW5fb3B0aW9ucyk6CisJY21kID0gWydwdnNjYW4nXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhzY2FuX29wdGlvbnMpKQorCisJaWYgYWN0aXZhdGU6CisJCWNtZC5leHRlbmQoWyctLWFjdGl2YXRlJywgImF5Il0pCisKKwlpZiBjYWNoZToKKwkJY21kLmFwcGVuZCgnLS1jYWNoZScpCisKKwkJaWYgbGVuKGRldmljZV9wYXRocykgPiAwOgorCQkJZm9yIGQgaW4gZGV2aWNlX3BhdGhzOgorCQkJCWNtZC5hcHBlbmQoZCkKKworCQlpZiBsZW4obWFqb3JfbWlub3JzKSA+IDA6CisJCQlmb3IgbW0gaW4gbWFqb3JfbWlub3JzOgorCQkJCWNtZC5hcHBlbmQoIiVzOiVzIiAlIChtbSkpCisKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIHZnX2NyZWF0ZShjcmVhdGVfb3B0aW9ucywgcHZfZGV2aWNlcywgbmFtZSk6CisJY21kID0gWyd2Z2NyZWF0ZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKGNyZWF0ZV9vcHRpb25zKSkKKwljbWQuYXBwZW5kKG5hbWUpCisJY21kLmV4dGVuZChwdl9kZXZpY2VzKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgdmdfY2hhbmdlKGNoYW5nZV9vcHRpb25zLCBuYW1lKToKKwljbWQgPSBbJ3ZnY2hhbmdlJ10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoY2hhbmdlX29wdGlvbnMpKQorCWNtZC5hcHBlbmQobmFtZSkKKwlyZXR1cm4gY2FsbChjbWQpCisKKworZGVmIHZnX3JlZHVjZSh2Z19uYW1lLCBtaXNzaW5nLCBwdl9kZXZpY2VzLCByZWR1Y2Vfb3B0aW9ucyk6CisJY21kID0gWyd2Z3JlZHVjZSddCisJY21kLmV4dGVuZChvcHRpb25zX3RvX2NsaV9hcmdzKHJlZHVjZV9vcHRpb25zKSkKKworCWlmIGxlbihwdl9kZXZpY2VzKSA9PSAwOgorCQljbWQuYXBwZW5kKCctLWFsbCcpCisJaWYgbWlzc2luZzoKKwkJY21kLmFwcGVuZCgnLS1yZW1vdmVtaXNzaW5nJykKKworCWNtZC5hcHBlbmQodmdfbmFtZSkKKwljbWQuZXh0ZW5kKHB2X2RldmljZXMpCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiB2Z19leHRlbmQodmdfbmFtZSwgZXh0ZW5kX2RldmljZXMsIGV4dGVuZF9vcHRpb25zKToKKwljbWQgPSBbJ3ZnZXh0ZW5kJ10KKwljbWQuZXh0ZW5kKG9wdGlvbnNfdG9fY2xpX2FyZ3MoZXh0ZW5kX29wdGlvbnMpKQorCWNtZC5hcHBlbmQodmdfbmFtZSkKKwljbWQuZXh0ZW5kKGV4dGVuZF9kZXZpY2VzKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgX3ZnX3ZhbHVlX3NldChuYW1lLCBhcmd1bWVudHMsIG9wdGlvbnMpOgorCWNtZCA9IFsndmdjaGFuZ2UnXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhvcHRpb25zKSkKKwljbWQuYXBwZW5kKG5hbWUpCisJY21kLmV4dGVuZChhcmd1bWVudHMpCisJcmV0dXJuIGNhbGwoY21kKQorCisKK2RlZiB2Z19hbGxvY2F0aW9uX3BvbGljeSh2Z19uYW1lLCBwb2xpY3ksIHBvbGljeV9vcHRpb25zKToKKwlyZXR1cm4gX3ZnX3ZhbHVlX3NldCh2Z19uYW1lLCBbJy0tYWxsb2MnLCBwb2xpY3ldLCBwb2xpY3lfb3B0aW9ucykKKworCitkZWYgdmdfbWF4X3B2KHZnX25hbWUsIG51bWJlciwgbWF4X29wdGlvbnMpOgorCXJldHVybiBfdmdfdmFsdWVfc2V0KHZnX25hbWUsIFsnLS1tYXhwaHlzaWNhbHZvbHVtZXMnLCBzdHIobnVtYmVyKV0sCisJCQkJCQkJbWF4X29wdGlvbnMpCisKKworZGVmIHZnX21heF9sdih2Z19uYW1lLCBudW1iZXIsIG1heF9vcHRpb25zKToKKwlyZXR1cm4gX3ZnX3ZhbHVlX3NldCh2Z19uYW1lLCBbJy1sJywgc3RyKG51bWJlcildLCBtYXhfb3B0aW9ucykKKworCitkZWYgdmdfdXVpZF9nZW4odmdfbmFtZSwgaWdub3JlLCBvcHRpb25zKToKKwlhc3NlcnQgaWdub3JlIGlzIE5vbmUKKwlyZXR1cm4gX3ZnX3ZhbHVlX3NldCh2Z19uYW1lLCBbJy0tdXVpZCddLCBvcHRpb25zKQorCisKK2RlZiBhY3RpdmF0ZV9kZWFjdGl2YXRlKG9wLCBuYW1lLCBhY3RpdmF0ZSwgY29udHJvbF9mbGFncywgb3B0aW9ucyk6CisJY21kID0gW29wXQorCWNtZC5leHRlbmQob3B0aW9uc190b19jbGlfYXJncyhvcHRpb25zKSkKKworCW9wID0gJy1hJworCisJaWYgY29udHJvbF9mbGFnczoKKwkJIyBBdXRvYWN0aXZhdGlvbgorCQlpZiAoMSA8PCAwKSAmIGNvbnRyb2xfZmxhZ3M6CisJCQlvcCArPSAnYScKKwkJIyBFeGNsdXNpdmUgbG9ja2luZyAoQ2x1c3RlcikKKwkJaWYgKDEgPDwgMSkgJiBjb250cm9sX2ZsYWdzOgorCQkJb3AgKz0gJ2UnCisKKwkJIyBMb2NhbCBub2RlIGFjdGl2YXRpb24KKwkJaWYgKDEgPDwgMikgJiBjb250cm9sX2ZsYWdzOgorCQkJb3AgKz0gJ2wnCisKKwkJIyBBY3RpdmF0aW9uIG1vZGVzCisJCWlmICgxIDw8IDMpICYgY29udHJvbF9mbGFnczoKKwkJCWNtZC5leHRlbmQoWyctLWFjdGl2YXRpb25tb2RlJywgJ2NvbXBsZXRlJ10pCisJCWVsaWYgKDEgPDwgNCkgJiBjb250cm9sX2ZsYWdzOgorCQkJY21kLmV4dGVuZChbJy0tYWN0aXZhdGlvbm1vZGUnLCAncGFydGlhbCddKQorCisJCSMgSWdub3JlIGFjdGl2YXRpb24gc2tpcAorCQlpZiAoMSA8PCA1KSAmIGNvbnRyb2xfZmxhZ3M6CisJCQljbWQuYXBwZW5kKCctLWlnbm9yZWFjdGl2YXRpb25za2lwJykKKworCWlmIGFjdGl2YXRlOgorCQlvcCArPSAneScKKwllbHNlOgorCQlvcCArPSAnbicKKworCWNtZC5hcHBlbmQob3ApCisJY21kLmFwcGVuZChuYW1lKQorCXJldHVybiBjYWxsKGNtZCkKKworCitkZWYgdmdfcmV0cmlldmUodmdfc3BlY2lmaWMpOgorCWlmIHZnX3NwZWNpZmljOgorCQlhc3NlcnQgaXNpbnN0YW5jZSh2Z19zcGVjaWZpYywgbGlzdCkKKworCWNvbHVtbnMgPSBbJ3ZnX25hbWUnLCAndmdfdXVpZCcsICd2Z19mbXQnLCAndmdfc2l6ZScsICd2Z19mcmVlJywKKwkJCQkndmdfc3lzaWQnLCAndmdfZXh0ZW50X3NpemUnLCAndmdfZXh0ZW50X2NvdW50JywKKwkJCQkndmdfZnJlZV9jb3VudCcsICd2Z19wcm9maWxlJywgJ21heF9sdicsICdtYXhfcHYnLAorCQkJCSdwdl9jb3VudCcsICdsdl9jb3VudCcsICdzbmFwX2NvdW50JywgJ3ZnX3NlcW5vJywKKwkJCQkndmdfbWRhX2NvdW50JywgJ3ZnX21kYV9mcmVlJywgJ3ZnX21kYV9zaXplJywKKwkJCQkndmdfbWRhX3VzZWRfY291bnQnLCAndmdfYXR0cicsICd2Z190YWdzJ10KKworCWNtZCA9IF9kYygndmdzJywgWyctbycsICcsJy5qb2luKGNvbHVtbnMpXSkKKworCWlmIHZnX3NwZWNpZmljOgorCQljbWQuZXh0ZW5kKHZnX3NwZWNpZmljKQorCisJZCA9IFtdCisJcmMsIG91dCwgZXJyID0gY2FsbChjbWQpCisJaWYgcmMgPT0gMDoKKwkJZCA9IHBhcnNlX2NvbHVtbl9uYW1lcyhvdXQsIGNvbHVtbnMpCisKKwlyZXR1cm4gZAorCisKK2RlZiBsdl9yZXRyaWV2ZV93aXRoX3NlZ21lbnRzKCk6CisJY29sdW1ucyA9IFsnbHZfdXVpZCcsICdsdl9uYW1lJywgJ2x2X3BhdGgnLCAnbHZfc2l6ZScsCisJCQkJJ3ZnX25hbWUnLCAncG9vbF9sdl91dWlkJywgJ3Bvb2xfbHYnLCAnb3JpZ2luX3V1aWQnLAorCQkJCSdvcmlnaW4nLCAnZGF0YV9wZXJjZW50JywKKwkJCQknbHZfYXR0cicsICdsdl90YWdzJywgJ3ZnX3V1aWQnLCAnbHZfYWN0aXZlJywgJ2RhdGFfbHYnLAorCQkJCSdtZXRhZGF0YV9sdicsICdzZWdfcGVfcmFuZ2VzJywgJ3NlZ3R5cGUnLCAnbHZfcGFyZW50JywKKwkJCQknbHZfcm9sZScsICdsdl9sYXlvdXQnXQorCisJY21kID0gX2RjKCdsdnMnLCBbJy1hJywgJy1vJywgJywnLmpvaW4oY29sdW1ucyldKQorCXJjLCBvdXQsIGVyciA9IGNhbGwoY21kKQorCisJZCA9IFtdCisKKwlpZiByYyA9PSAwOgorCQlkID0gcGFyc2VfY29sdW1uX25hbWVzKG91dCwgY29sdW1ucykKKworCXJldHVybiBkCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlwdl9kYXRhID0gcHZfcmV0cmlldmVfd2l0aF9zZWdzKCkKKworCWZvciBwIGluIHB2X2RhdGE6CisJCWxvZ19kZWJ1ZyhzdHIocCkpCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL2ZldGNoLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9mZXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWYxMzBmCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9mZXRjaC5weQpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2Zyb20gLnB2IGltcG9ydCBsb2FkX3B2cworZnJvbSAudmcgaW1wb3J0IGxvYWRfdmdzCitmcm9tIC5sdiBpbXBvcnQgbG9hZF9sdnMKK2Zyb20gLiBpbXBvcnQgY2ZnCisKKworZGVmIGxvYWQocmVmcmVzaD1UcnVlLCBlbWl0X3NpZ25hbD1UcnVlLCBjYWNoZV9yZWZyZXNoPVRydWUsIGxvZz1UcnVlKToKKwludW1fdG90YWxfY2hhbmdlcyA9IDAKKworCSMgR28gdGhyb3VnaCBhbmQgbG9hZCBhbGwgdGhlIFBWcywgVkdzIGFuZCBMVnMKKwlpZiBjYWNoZV9yZWZyZXNoOgorCQljZmcuZGIucmVmcmVzaChsb2cpCisKKwludW1fdG90YWxfY2hhbmdlcyArPSBsb2FkX3B2cyhyZWZyZXNoPXJlZnJlc2gsIGVtaXRfc2lnbmFsPWVtaXRfc2lnbmFsLAorCQkJCQkJCQkJY2FjaGVfcmVmcmVzaD1GYWxzZSlbMV0KKwludW1fdG90YWxfY2hhbmdlcyArPSBsb2FkX3ZncyhyZWZyZXNoPXJlZnJlc2gsIGVtaXRfc2lnbmFsPWVtaXRfc2lnbmFsLAorCQkJCQkJCQkJY2FjaGVfcmVmcmVzaD1GYWxzZSlbMV0KKwludW1fdG90YWxfY2hhbmdlcyArPSBsb2FkX2x2cyhyZWZyZXNoPXJlZnJlc2gsIGVtaXRfc2lnbmFsPWVtaXRfc2lnbmFsLAorCQkJCQkJCQkJY2FjaGVfcmVmcmVzaD1GYWxzZSlbMV0KKworCXJldHVybiBudW1fdG90YWxfY2hhbmdlcwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9qb2IucHkgYi9kYWVtb25zL2x2bWRidXNkL2pvYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBmOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9qb2IucHkKQEAgLTAsMCArMSwxNzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSAuYXV0b21hdGVkcHJvcGVydGllcyBpbXBvcnQgQXV0b21hdGVkUHJvcGVydGllcworZnJvbSAudXRpbHMgaW1wb3J0IGpvYl9vYmpfcGF0aF9nZW5lcmF0ZQorZnJvbSAuIGltcG9ydCBjZmcKK2Zyb20gLmNmZyBpbXBvcnQgSk9CX0lOVEVSRkFDRQoraW1wb3J0IGRidXMKK2ltcG9ydCB0aHJlYWRpbmcKK2Zyb20gLiBpbXBvcnQgYmFja2dyb3VuZAorCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgSm9iU3RhdGUob2JqZWN0KToKKwlkZWYgX19pbml0X18oc2VsZiwgcmVxdWVzdD1Ob25lKToKKwkJc2VsZi5ybG9jayA9IHRocmVhZGluZy5STG9jaygpCisKKwkJc2VsZi5fcGVyY2VudCA9IDAKKwkJc2VsZi5fY29tcGxldGUgPSBGYWxzZQorCQlzZWxmLl9yZXF1ZXN0ID0gcmVxdWVzdAorCQlzZWxmLl9jb25kID0gdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLnJsb2NrKQorCQlzZWxmLl9lYyA9IDAKKwkJc2VsZi5fc3RkZXJyID0gJycKKworCQkjIFRoaXMgaXMgYW4gbHZtIGNvbW1hbmQgdGhhdCBpcyBqdXN0IHRha2luZyB0b28gbG9uZyBhbmQgZG9lc24ndAorCQkjIHN1cHBvcnQgYmFja2dyb3VuZCBvcGVyYXRpb24KKwkJaWYgc2VsZi5fcmVxdWVzdDoKKwkJCSMgRmFraW5nIHRoZSBwZXJjZW50YWdlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBvbmUKKwkJCXNlbGYuX3BlcmNlbnQgPSAxCisKKwlAcHJvcGVydHkKKwlkZWYgUGVyY2VudChzZWxmKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJcmV0dXJuIHNlbGYuX3BlcmNlbnQKKworCUBQZXJjZW50LnNldHRlcgorCWRlZiBQZXJjZW50KHNlbGYsIHZhbHVlKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJc2VsZi5fcGVyY2VudCA9IHZhbHVlCisKKwlAcHJvcGVydHkKKwlkZWYgQ29tcGxldGUoc2VsZik6CisJCXdpdGggc2VsZi5ybG9jazoKKwkJCWlmIHNlbGYuX3JlcXVlc3Q6CisJCQkJc2VsZi5fY29tcGxldGUgPSBzZWxmLl9yZXF1ZXN0LmlzX2RvbmUoKQorCQkJCWlmIHNlbGYuX2NvbXBsZXRlOgorCQkJCQlzZWxmLl9wZXJjZW50ID0gMTAwCisKKwkJCXJldHVybiBzZWxmLl9jb21wbGV0ZQorCisJQENvbXBsZXRlLnNldHRlcgorCWRlZiBDb21wbGV0ZShzZWxmLCB2YWx1ZSk6CisJCXdpdGggc2VsZi5ybG9jazoKKwkJCXNlbGYuX2NvbXBsZXRlID0gdmFsdWUKKwkJCXNlbGYuX2NvbmQubm90aWZ5X2FsbCgpCisKKwlAcHJvcGVydHkKKwlkZWYgR2V0RXJyb3Ioc2VsZik6CisJCXdpdGggc2VsZi5ybG9jazoKKwkJCWlmIHNlbGYuQ29tcGxldGU6CisJCQkJaWYgc2VsZi5fcmVxdWVzdDoKKwkJCQkJKHJjLCBlcnJvcikgPSBzZWxmLl9yZXF1ZXN0LmdldF9lcnJvcnMoKQorCQkJCQlyZXR1cm4gKHJjLCBzdHIoZXJyb3IpKQorCQkJCWVsc2U6CisJCQkJCXJldHVybiAoc2VsZi5fZWMsIHNlbGYuX3N0ZGVycikKKwkJCWVsc2U6CisJCQkJcmV0dXJuICgtMSwgJ0pvYiBpcyBub3QgY29tcGxldGUhJykKKworCWRlZiBzZXRfcmVzdWx0KHNlbGYsIGVjLCBtc2cpOgorCQl3aXRoIHNlbGYucmxvY2s6CisJCQlzZWxmLkNvbXBsZXRlID0gVHJ1ZQorCQkJc2VsZi5fZWMgPSBlYworCQkJc2VsZi5fc3RkZXJyID0gbXNnCisKKwlkZWYgZHRvcihzZWxmKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJc2VsZi5fcmVxdWVzdCA9IE5vbmUKKworCWRlZiBXYWl0KHNlbGYsIHRpbWVvdXQpOgorCQl0cnk6CisJCQl3aXRoIHNlbGYuX2NvbmQ6CisJCQkJIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGRvbmUsIGJlZm9yZSB3ZSB3YWl0CisJCQkJaWYgbm90IHNlbGYuQ29tcGxldGU6CisJCQkJCWlmIHRpbWVvdXQgIT0gLTE6CisJCQkJCQlzZWxmLl9jb25kLndhaXQodGltZW91dCkKKwkJCQkJZWxzZToKKwkJCQkJCXNlbGYuX2NvbmQud2FpdCgpCisJCQkJcmV0dXJuIHNlbGYuQ29tcGxldGUKKwkJZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKwkJCXJldHVybiBGYWxzZQorCisJQHByb3BlcnR5CisJZGVmIFJlc3VsdChzZWxmKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJaWYgc2VsZi5fcmVxdWVzdDoKKwkJCQlyZXR1cm4gc2VsZi5fcmVxdWVzdC5yZXN1bHQoKQorCQkJcmV0dXJuICcvJworCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgSm9iKEF1dG9tYXRlZFByb3BlcnRpZXMpOgorCV9QZXJjZW50X21ldGEgPSAoJ3knLCBKT0JfSU5URVJGQUNFKQorCV9Db21wbGV0ZV9tZXRhID0gKCdiJywgSk9CX0lOVEVSRkFDRSkKKwlfUmVzdWx0X21ldGEgPSAoJ28nLCBKT0JfSU5URVJGQUNFKQorCV9HZXRFcnJvcl9tZXRhID0gKCcoaXMpJywgSk9CX0lOVEVSRkFDRSkKKworCWRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0LCBqb2Jfc3RhdGU9Tm9uZSk6CisJCXN1cGVyKEpvYiwgc2VsZikuX19pbml0X18oam9iX29ial9wYXRoX2dlbmVyYXRlKCkpCisJCXNlbGYuc2V0X2ludGVyZmFjZShKT0JfSU5URVJGQUNFKQorCisJCWlmIGpvYl9zdGF0ZToKKwkJCXNlbGYuc3RhdGUgPSBqb2Jfc3RhdGUKKwkJZWxzZToKKwkJCXNlbGYuc3RhdGUgPSBKb2JTdGF0ZShyZXF1ZXN0KQorCisJQHByb3BlcnR5CisJZGVmIFBlcmNlbnQoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLlBlcmNlbnQKKworCUBQZXJjZW50LnNldHRlcgorCWRlZiBQZXJjZW50KHNlbGYsIHZhbHVlKToKKwkJc2VsZi5zdGF0ZS5QZXJjZW50ID0gdmFsdWUKKworCUBwcm9wZXJ0eQorCWRlZiBDb21wbGV0ZShzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuQ29tcGxldGUKKworCUBDb21wbGV0ZS5zZXR0ZXIKKwlkZWYgQ29tcGxldGUoc2VsZiwgdmFsdWUpOgorCQlzZWxmLnN0YXRlLkNvbXBsZXRlID0gdmFsdWUKKworCUBwcm9wZXJ0eQorCWRlZiBHZXRFcnJvcihzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuR2V0RXJyb3IKKworCWRlZiBzZXRfcmVzdWx0KHNlbGYsIGVjLCBtc2cpOgorCQlzZWxmLnN0YXRlLnNldF9yZXN1bHQoZWMsIG1zZykKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKGRidXNfaW50ZXJmYWNlPUpPQl9JTlRFUkZBQ0UpCisJZGVmIFJlbW92ZShzZWxmKToKKwkJaWYgc2VsZi5zdGF0ZS5Db21wbGV0ZToKKwkJCWNmZy5vbS5yZW1vdmVfb2JqZWN0KHNlbGYsIFRydWUpCisJCQlzZWxmLnN0YXRlLmR0b3IoKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJSk9CX0lOVEVSRkFDRSwgJ0pvYiBpcyBub3QgY29tcGxldGUhJykKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKGRidXNfaW50ZXJmYWNlPUpPQl9JTlRFUkZBQ0UsCisJCQkJCQkJaW5fc2lnbmF0dXJlPSdpJywKKwkJCQkJCQlvdXRfc2lnbmF0dXJlPSdiJywKKwkJCQkJCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgV2FpdChzZWxmLCB0aW1lb3V0LCBjYiwgY2JlKToKKwkJYmFja2dyb3VuZC5hZGRfd2FpdChzZWxmLCB0aW1lb3V0LCBjYiwgY2JlKQorCisJQHByb3BlcnR5CisJZGVmIFJlc3VsdChzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuUmVzdWx0CisKKwlAcHJvcGVydHkKKwlkZWYgbHZtX2lkKHNlbGYpOgorCQlyZXR1cm4gc3RyKGlkKHNlbGYpKQorCisJQHByb3BlcnR5CisJZGVmIFV1aWQoc2VsZik6CisJCWltcG9ydCB1dWlkCisJCXJldHVybiB1dWlkLnV1aWQxKCkKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvbG9hZGVyLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9sb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0NjJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvbG9hZGVyLnB5CkBAIC0wLDAgKzEsODUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSAuIGltcG9ydCBjZmcKKworCitkZWYgX2NvbXBhcmVfY29uc3RydWN0aW9uKG9fc3RhdGUsIG5ld19zdGF0ZSk6CisJIyBXZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0cyB3b3VsZCBnZXQgY29uc3RydWN0ZWQKKwkjIHRoZSBzYW1lCisJZXhpc3RpbmdfY3RvciwgZXhpc3RpbmdfcGF0aCA9IG9fc3RhdGUuY3JlYXRpb25fc2lnbmF0dXJlKCkKKwluZXdfY3RvciwgbmV3X3BhdGggPSBuZXdfc3RhdGUuY3JlYXRpb25fc2lnbmF0dXJlKCkKKworCSMgcHJpbnQoIiVzID09ICVzIGFuZCAlcyA9PSAlcyIgJSAoc3RyKGV4aXN0aW5nX2N0b3IpLCBzdHIobmV3X2N0b3IpLAorCSMgICAgICBzdHIoZXhpc3RpbmdfcGF0aCksIHN0cihuZXdfcGF0aCkpKQorCisJcmV0dXJuICgoZXhpc3RpbmdfY3RvciA9PSBuZXdfY3RvcikgYW5kIChleGlzdGluZ19wYXRoID09IG5ld19wYXRoKSkKKworCitkZWYgY29tbW9uKHJldHJpZXZlLCBvX3R5cGUsIHNlYXJjaF9rZXlzLAorCQkJb2JqZWN0X3BhdGgsIHJlZnJlc2gsIGVtaXRfc2lnbmFsLCBjYWNoZV9yZWZyZXNoKToKKwludW1fY2hhbmdlcyA9IDAKKwlleGlzdGluZ19wYXRocyA9IFtdCisJcmMgPSBbXQorCisJaWYgc2VhcmNoX2tleXM6CisJCWFzc2VydCBpc2luc3RhbmNlKHNlYXJjaF9rZXlzLCBsaXN0KQorCisJaWYgY2FjaGVfcmVmcmVzaDoKKwkJY2ZnLmRiLnJlZnJlc2goKQorCisJb2JqZWN0cyA9IHJldHJpZXZlKHNlYXJjaF9rZXlzLCBjYWNoZV9yZWZyZXNoPUZhbHNlKQorCisJIyBJZiB3ZSBhcmUgZG9pbmcgYSByZWZyZXNoIHdlIG5lZWQgdG8ga25vdyB3aGF0IHdlIGhhdmUgaW4gbWVtb3J5LCB3aGF0J3MKKwkjIGluIGx2bSBhbmQgYWRkIHRob3NlIHRoYXQgYXJlIG5ldyBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgYXJlIGdvbmUhCisJaWYgcmVmcmVzaDoKKwkJZXhpc3RpbmdfcGF0aHMgPSBjZmcub20ub2JqZWN0X3BhdGhzX2J5X3R5cGUob190eXBlKQorCisJZm9yIG8gaW4gb2JqZWN0czoKKwkJIyBBc3N1bWUgd2UgbmVlZCB0byBhZGQgdGhpcyBvbmUgdG8gZGJ1cywgdW5sZXNzIHdlIGFyZSByZWZyZXNoaW5nCisJCSMgYW5kIGl0J3MgYWxyZWFkeSBwcmVzZW50CisJCXJldHVybl9vYmplY3QgPSBUcnVlCisKKwkJaWYgcmVmcmVzaDoKKwkJCSMgV2UgYXJlIHJlZnJlc2hpbmcgYWxsIHRoZSBQVnMgZnJvbSBMVk0sIGlmIHRoaXMgb25lIGV4aXN0cworCQkJIyB3ZSBuZWVkIHRvIHJlZnJlc2ggb3VyIHN0YXRlLgorCQkJZGJ1c19vYmplY3QgPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCgqby5pZGVudGlmaWVycygpKQorCisJCQlpZiBkYnVzX29iamVjdDoKKwkJCQlkZWwgZXhpc3RpbmdfcGF0aHNbZGJ1c19vYmplY3QuZGJ1c19vYmplY3RfcGF0aCgpXQorCisJCQkJIyBJZiB0aGUgb2xkIG9iamVjdCBzdGF0ZSBhbmQgbmV3IG9iamVjdCBzdGF0ZSB3b3VsZG4ndCBiZQorCQkJCSMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHBhdGggYW5kIHNhbWUgb2JqZWN0IGNvbnN0cnVjdG9yIHdlCisJCQkJIyBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIG9iamVjdCBhbmQgY29uc3RydWN0IHRoZSBuZXcgb25lCisJCQkJIyBpbnN0ZWFkIQorCQkJCWlmIG5vdCBfY29tcGFyZV9jb25zdHJ1Y3Rpb24oZGJ1c19vYmplY3Quc3RhdGUsIG8pOgorCQkJCQkjIFJlbW92ZSBleGlzdGluZyBhbmQgY29uc3RydWN0IG5ldyBvbmUKKwkJCQkJY2ZnLm9tLnJlbW92ZV9vYmplY3QoZGJ1c19vYmplY3QsIGVtaXRfc2lnbmFsKQorCQkJCQlkYnVzX29iamVjdCA9IG8uY3JlYXRlX2RidXNfb2JqZWN0KE5vbmUpCisJCQkJCWNmZy5vbS5yZWdpc3Rlcl9vYmplY3QoZGJ1c19vYmplY3QsIGVtaXRfc2lnbmFsKQorCQkJCQludW1fY2hhbmdlcyArPSAxCisJCQkJZWxzZToKKwkJCQkJbnVtX2NoYW5nZXMgKz0gZGJ1c19vYmplY3QucmVmcmVzaChvYmplY3Rfc3RhdGU9bykKKwkJCQlyZXR1cm5fb2JqZWN0ID0gRmFsc2UKKworCQlpZiByZXR1cm5fb2JqZWN0OgorCQkJZGJ1c19vYmplY3QgPSBvLmNyZWF0ZV9kYnVzX29iamVjdChvYmplY3RfcGF0aCkKKwkJCWNmZy5vbS5yZWdpc3Rlcl9vYmplY3QoZGJ1c19vYmplY3QsIGVtaXRfc2lnbmFsKQorCQkJcmMuYXBwZW5kKGRidXNfb2JqZWN0KQorCisJCW9iamVjdF9wYXRoID0gTm9uZQorCisJaWYgcmVmcmVzaDoKKwkJZm9yIGsgaW4gbGlzdChleGlzdGluZ19wYXRocy5rZXlzKCkpOgorCQkJY2ZnLm9tLnJlbW92ZV9vYmplY3QoY2ZnLm9tLmdldF9vYmplY3RfYnlfcGF0aChrKSwgVHJ1ZSkKKwkJCW51bV9jaGFuZ2VzICs9IDEKKworCW51bV9jaGFuZ2VzICs9IGxlbihyYykKKworCXJldHVybiByYywgbnVtX2NoYW5nZXMKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvbHYucHkgYi9kYWVtb25zL2x2bWRidXNkL2x2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NThkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWRidXNkL2x2LnB5CkBAIC0wLDAgKzEsODkzIEBACisjIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2Zyb20gLmF1dG9tYXRlZHByb3BlcnRpZXMgaW1wb3J0IEF1dG9tYXRlZFByb3BlcnRpZXMKKworZnJvbSAuIGltcG9ydCB1dGlscworZnJvbSAudXRpbHMgaW1wb3J0IHZnX29ial9wYXRoX2dlbmVyYXRlCitpbXBvcnQgZGJ1cworZnJvbSAuIGltcG9ydCBjbWRoYW5kbGVyCitmcm9tIC4gaW1wb3J0IGNmZworZnJvbSAuY2ZnIGltcG9ydCBMVl9JTlRFUkZBQ0UsIFRISU5fUE9PTF9JTlRFUkZBQ0UsIFNOQVBTSE9UX0lOVEVSRkFDRSwgXAorCUxWX0NPTU1PTl9JTlRFUkZBQ0UsIENBQ0hFX1BPT0xfSU5URVJGQUNFLCBMVl9DQUNIRUQKK2Zyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RFbnRyeQorZnJvbSAudXRpbHMgaW1wb3J0IG4sIG4zMgorZnJvbSAubG9hZGVyIGltcG9ydCBjb21tb24KK2Zyb20gLnN0YXRlIGltcG9ydCBTdGF0ZQorZnJvbSAuIGltcG9ydCBiYWNrZ3JvdW5kCitmcm9tIC51dGlscyBpbXBvcnQgcm91bmRfc2l6ZQorZnJvbSAuam9iIGltcG9ydCBKb2JTdGF0ZQorCisKKyMgVHJ5IGFuZCBidWlsZCBhIGtleSBmb3IgYSBMViwgc28gdGhhdCB3ZSBzb3J0IHRoZSBMVnMgd2l0aCBsZWFzdCBkZXBlbmRlbmNpZXMKKyMgZmlyc3QuICBUaGlzIG1heSBiZSBlcnJvciBwcm9uZSBiZWNhdXNlIG9mIHRoZSBmbGV4aWJpbGl0eSBMVk0KKyMgcHJvdmlkZXMgYW5kIHdoYXQgeW91IGNhbiBzdGFjay4KK2RlZiBnZXRfa2V5KGkpOgorCisJbmFtZSA9IGlbJ2x2X25hbWUnXQorCXBhcmVudCA9IGlbJ2x2X3BhcmVudCddCisJcG9vbCA9IGlbJ3Bvb2xfbHYnXQorCWExID0gIiIKKwlhMiA9ICIiCisKKwlpZiBuYW1lWzBdID09ICdbJzoKKwkJYTEgPSAnIycKKworCSMgV2UgaGF2ZSBhIHBhcmVudAorCWlmIHBhcmVudDoKKwkJIyBDaGVjayBpZiBwYXJlbnQgaXMgaGlkZGVuCisJCWlmIHBhcmVudFswXSA9PSAnWyc6CisJCQlhMiA9ICcjIycKKwkJZWxzZToKKwkJCWEyID0gJyMnCisKKwkjIElmIGEgTFYgaGFzIGEgcG9vbCwgdGhlbiBpdCBzaG91bGQgYmUgc29ydGVkL2xvYWRlZCBhZnRlciB0aGUgcG9vbAorCSMgbHYsIHVubGVzcyBpdCdzIGEgaGlkZGVuIHRvbywgdGhlbiBhZnRlciBvdGhlciBoaWRkZW4sIGJ1dCBiZWZvcmUgdmlzaWJsZQorCWlmIHBvb2w6CisJCWlmIHBvb2xbMF0gIT0gJ1snOgorCQkJYTIgKz0gJ34nCisJCWVsc2U6CisJCQlhMSA9ICckJyArIGExCisKKwlyZXR1cm4gIiVzJXMlcyIgJSAoYTEsIGEyLCBuYW1lKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwKK2RlZiBsdnNfc3RhdGVfcmV0cmlldmUoc2VsZWN0aW9uLCBjYWNoZV9yZWZyZXNoPVRydWUpOgorCXJjID0gW10KKworCWlmIGNhY2hlX3JlZnJlc2g6CisJCWNmZy5kYi5yZWZyZXNoKCkKKworCSMgV2hlbiBidWlsZGluZyB1cCB0aGUgbW9kZWwsIGl0J3MgYmVzdCB0byBwcm9jZXNzIExWcyB3aXRoIHRoZSBsZWFzdAorCSMgZGVwZW5kZW5jaWVzIHRvIHRob3NlIHRoYXQgYXJlIGRlcGVuZGFudCB1cG9uIG90aGVyIExWcy4gIE90aGVyd2lzZSwgd2hlbgorCSMgd2UgYXJlIHRyeWluZyB0byBnYXRoZXIgaW5mb3JtYXRpb24gd2UgY291bGQgYmUgaW4gYSBwb3NpdGlvbiB3aGVyZSB3ZQorCSMgZG9uJ3QgaGF2ZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgeWV0LgorCWx2cyA9IHNvcnRlZChjZmcuZGIuZmV0Y2hfbHZzKHNlbGVjdGlvbiksIGtleT1nZXRfa2V5KQorCisJZm9yIGwgaW4gbHZzOgorCQlyYy5hcHBlbmQoTHZTdGF0ZSgKKwkJCWxbJ2x2X3V1aWQnXSwgbFsnbHZfbmFtZSddLAorCQkJbFsnbHZfcGF0aCddLCBuKGxbJ2x2X3NpemUnXSksCisJCQlsWyd2Z19uYW1lJ10sCisJCQlsWyd2Z191dWlkJ10sIGxbJ3Bvb2xfbHZfdXVpZCddLAorCQkJbFsncG9vbF9sdiddLCBsWydvcmlnaW5fdXVpZCddLCBsWydvcmlnaW4nXSwKKwkJCW4zMihsWydkYXRhX3BlcmNlbnQnXSksIGxbJ2x2X2F0dHInXSwKKwkJCWxbJ2x2X3RhZ3MnXSwgbFsnbHZfYWN0aXZlJ10sIGxbJ2RhdGFfbHYnXSwKKwkJCWxbJ21ldGFkYXRhX2x2J10sIGxbJ3NlZ3R5cGUnXSwgbFsnbHZfcm9sZSddLAorCQkJbFsnbHZfbGF5b3V0J10pKQorCXJldHVybiByYworCisKK2RlZiBsb2FkX2x2cyhsdl9uYW1lPU5vbmUsIG9iamVjdF9wYXRoPU5vbmUsIHJlZnJlc2g9RmFsc2UsIGVtaXRfc2lnbmFsPUZhbHNlLAorCQkJCWNhY2hlX3JlZnJlc2g9VHJ1ZSk6CisJIyBub2luc3BlY3Rpb24gUHlVbnJlc29sdmVkUmVmZXJlbmNlcworCXJldHVybiBjb21tb24oCisJCWx2c19zdGF0ZV9yZXRyaWV2ZSwKKwkJKEx2Q29tbW9uLCBMdiwgTHZUaGluUG9vbCwgTHZTbmFwU2hvdCksCisJCWx2X25hbWUsIG9iamVjdF9wYXRoLCByZWZyZXNoLCBlbWl0X3NpZ25hbCwgY2FjaGVfcmVmcmVzaCkKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcsUHlVbnJlc29sdmVkUmVmZXJlbmNlcyxQeVVudXNlZExvY2FsCitjbGFzcyBMdlN0YXRlKFN0YXRlKToKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wdl9kZXZpY2VzKHV1aWQpOgorCQlyYyA9IFtdCisJCWZvciBwdiBpbiBzb3J0ZWQoY2ZnLmRiLmx2X2NvbnRhaW5lZF9wdih1dWlkKSk6CisJCQkocHZfdXVpZCwgcHZfbmFtZSwgcHZfc2VncykgPSBwdgorCQkJcHZfb2JqID0gY2ZnLm9tLmdldF9vYmplY3RfcGF0aF9ieV91dWlkX2x2bV9pZCgKKwkJCQlwdl91dWlkLCBwdl9uYW1lLCBnZW5fbmV3PUZhbHNlKQorCQkJcmMuYXBwZW5kKChwdl9vYmosIHB2X3NlZ3MpKQorCisJCXJldHVybiBkYnVzLkFycmF5KHJjLCBzaWduYXR1cmU9IihvYSh0dHMpKSIpCisKKwlkZWYgdmdfbmFtZV9sb29rdXAoc2VsZik6CisJCXJldHVybiBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKHNlbGYuVmcpLk5hbWUKKworCUBwcm9wZXJ0eQorCWRlZiBsdm1faWQoc2VsZik6CisJCXJldHVybiAiJXMvJXMiICUgKHNlbGYudmdfbmFtZV9sb29rdXAoKSwgc2VsZi5OYW1lKQorCisJZGVmIGlkZW50aWZpZXJzKHNlbGYpOgorCQlyZXR1cm4gKHNlbGYuVXVpZCwgc2VsZi5sdm1faWQpCisKKwlkZWYgX2dldF9oaWRkZW5fbHYoc2VsZik6CisJCXJjID0gZGJ1cy5BcnJheShbXSwgIm8iKQorCisJCXZnX25hbWUgPSBzZWxmLnZnX25hbWVfbG9va3VwKCkKKworCQlmb3IgbCBpbiBjZmcuZGIuaGlkZGVuX2x2cyhzZWxmLlV1aWQpOgorCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlICh2Z19uYW1lLCBsWzFdKQorCQkJb3AgPSBjZmcub20uZ2V0X29iamVjdF9wYXRoX2J5X3V1aWRfbHZtX2lkKAorCQkJCWxbMF0sIGZ1bGxfbmFtZSwgZ2VuX25ldz1GYWxzZSkKKwkJCWFzc2VydCBvcAorCQkJcmMuYXBwZW5kKG9wKQorCQlyZXR1cm4gcmMKKworCWRlZiBfX2luaXRfXyhzZWxmLCBVdWlkLCBOYW1lLCBQYXRoLCBTaXplQnl0ZXMsCisJCQl2Z19uYW1lLCB2Z191dWlkLCBwb29sX2x2X3V1aWQsIFBvb2xMdiwKKwkJCW9yaWdpbl91dWlkLCBPcmlnaW5MdiwgRGF0YVBlcmNlbnQsIEF0dHIsIFRhZ3MsIGFjdGl2ZSwKKwkJCWRhdGFfbHYsIG1ldGFkYXRhX2x2LCBzZWd0eXBlcywgcm9sZSwgbGF5b3V0KToKKwkJdXRpbHMuaW5pdF9jbGFzc19mcm9tX2FyZ3VtZW50cyhzZWxmKQorCisJCSMgVGhlIHNlZ3R5cGVzIGlzIHBvc3NpYmx5IGFuIGFycmF5IHdpdGggcG90ZW50aWFsbHkgZHVwZXMgb3IgYSBzaW5nbGUKKwkJIyB2YWx1ZQorCQlzZWxmLl9zZWdzID0gZGJ1cy5BcnJheShbXSwgc2lnbmF0dXJlPSdzJykKKwkJaWYgbm90IGlzaW5zdGFuY2Uoc2VndHlwZXMsIGxpc3QpOgorCQkJc2VsZi5fc2Vncy5hcHBlbmQoc2VndHlwZXMpCisJCWVsc2U6CisJCQlzZWxmLl9zZWdzLmV4dGVuZChzZXQoc2VndHlwZXMpKQorCisJCXNlbGYuVmcgPSBjZmcub20uZ2V0X29iamVjdF9wYXRoX2J5X3V1aWRfbHZtX2lkKAorCQkJdmdfdXVpZCwgdmdfbmFtZSwgdmdfb2JqX3BhdGhfZ2VuZXJhdGUpCisKKwkJc2VsZi5EZXZpY2VzID0gTHZTdGF0ZS5fcHZfZGV2aWNlcyhzZWxmLlV1aWQpCisKKwkJaWYgUG9vbEx2OgorCQkJZ2VuID0gdXRpbHMubHZfb2JqZWN0X3BhdGhfbWV0aG9kKE5hbWUsIChBdHRyLCBsYXlvdXQsIHJvbGUpKQorCisJCQlzZWxmLlBvb2xMdiA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQkJcG9vbF9sdl91dWlkLCAnJXMvJXMnICUgKHZnX25hbWUsIFBvb2xMdiksCisJCQkJZ2VuKQorCQllbHNlOgorCQkJc2VsZi5Qb29sTHYgPSAnLycKKworCQlpZiBPcmlnaW5MdjoKKwkJCXNlbGYuT3JpZ2luTHYgPSBcCisJCQkJY2ZnLm9tLmdldF9vYmplY3RfcGF0aF9ieV91dWlkX2x2bV9pZCgKKwkJCQkJb3JpZ2luX3V1aWQsICclcy8lcycgJSAodmdfbmFtZSwgT3JpZ2luTHYpLAorCQkJCQl2Z19vYmpfcGF0aF9nZW5lcmF0ZSkKKwkJZWxzZToKKwkJCXNlbGYuT3JpZ2luTHYgPSAnLycKKworCQlzZWxmLkhpZGRlbkx2cyA9IHNlbGYuX2dldF9oaWRkZW5fbHYoKQorCisJQHByb3BlcnR5CisJZGVmIFNlZ1R5cGUoc2VsZik6CisJCXJldHVybiBzZWxmLl9zZWdzCisKKwlkZWYgX29iamVjdF9wYXRoX2NyZWF0ZShzZWxmKToKKwkJcmV0dXJuIHV0aWxzLmx2X29iamVjdF9wYXRoX21ldGhvZCgKKwkJCXNlbGYuTmFtZSwgKHNlbGYuQXR0ciwgc2VsZi5sYXlvdXQsIHNlbGYucm9sZSkpCisKKwlkZWYgX29iamVjdF90eXBlX2NyZWF0ZShzZWxmKToKKwkJaWYgc2VsZi5BdHRyWzBdID09ICd0JzoKKwkJCXJldHVybiBMdlRoaW5Qb29sCisJCWVsaWYgc2VsZi5BdHRyWzBdID09ICdDJzoKKwkJCWlmICdwb29sJyBpbiBzZWxmLmxheW91dDoKKwkJCQlyZXR1cm4gTHZDYWNoZVBvb2wKKwkJCWVsc2U6CisJCQkJcmV0dXJuIEx2Q2FjaGVMdgorCQllbGlmIHNlbGYuTmFtZVswXSA9PSAnWyc6CisJCQlyZXR1cm4gTHZDb21tb24KKwkJZWxpZiBzZWxmLk9yaWdpbkx2ICE9ICcvJzoKKwkJCXJldHVybiBMdlNuYXBTaG90CisJCWVsc2U6CisJCQlyZXR1cm4gTHYKKworCWRlZiBjcmVhdGVfZGJ1c19vYmplY3Qoc2VsZiwgcGF0aCk6CisJCWlmIG5vdCBwYXRoOgorCQkJcGF0aCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQkJc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwgc2VsZi5fb2JqZWN0X3BhdGhfY3JlYXRlKCkpCisKKwkJb2JqX2N0b3IgPSBzZWxmLl9vYmplY3RfdHlwZV9jcmVhdGUoKQorCQlyZXR1cm4gb2JqX2N0b3IocGF0aCwgc2VsZikKKworCWRlZiBjcmVhdGlvbl9zaWduYXR1cmUoc2VsZik6CisJCWtsYXNzID0gc2VsZi5fb2JqZWN0X3R5cGVfY3JlYXRlKCkKKwkJcGF0aF9tZXRob2QgPSBzZWxmLl9vYmplY3RfcGF0aF9jcmVhdGUoKQorCQlyZXR1cm4gKGtsYXNzLCBwYXRoX21ldGhvZCkKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcKK0B1dGlscy5kYnVzX3Byb3BlcnR5KExWX0NPTU1PTl9JTlRFUkZBQ0UsICdVdWlkJywgJ3MnKQorQHV0aWxzLmRidXNfcHJvcGVydHkoTFZfQ09NTU9OX0lOVEVSRkFDRSwgJ05hbWUnLCAncycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnUGF0aCcsICdzJykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KExWX0NPTU1PTl9JTlRFUkZBQ0UsICdTaXplQnl0ZXMnLCAndCcpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnRGF0YVBlcmNlbnQnLCAndScpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnU2VnVHlwZScsICdhcycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnVmcnLCAnbycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnT3JpZ2luTHYnLCAnbycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnUG9vbEx2JywgJ28nKQorQHV0aWxzLmRidXNfcHJvcGVydHkoTFZfQ09NTU9OX0lOVEVSRkFDRSwgJ0RldmljZXMnLCAiYShvYSh0dHMpKSIpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShMVl9DT01NT05fSU5URVJGQUNFLCAnSGlkZGVuTHZzJywgImFvIikKK2NsYXNzIEx2Q29tbW9uKEF1dG9tYXRlZFByb3BlcnRpZXMpOgorCV9UYWdzX21ldGEgPSAoImFzIiwgTFZfQ09NTU9OX0lOVEVSRkFDRSkKKwlfUm9sZXNfbWV0YSA9ICgiYXMiLCBMVl9DT01NT05fSU5URVJGQUNFKQorCV9Jc1RoaW5Wb2x1bWVfbWV0YSA9ICgiYiIsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX0lzVGhpblBvb2xfbWV0YSA9ICgiYiIsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX0FjdGl2ZV9tZXRhID0gKCJiIiwgTFZfQ09NTU9OX0lOVEVSRkFDRSkKKwlfVm9sdW1lVHlwZV9tZXRhID0gKCIoc3MpIiwgTFZfQ09NTU9OX0lOVEVSRkFDRSkKKwlfUGVybWlzc2lvbnNfbWV0YSA9ICgiKHNzKSIsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX0FsbG9jYXRpb25Qb2xpY3lfbWV0YSA9ICgiKHNzKSIsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX1N0YXRlX21ldGEgPSAoIihzcykiLCBMVl9DT01NT05fSU5URVJGQUNFKQorCV9UYXJnZXRUeXBlX21ldGEgPSAoIihzcykiLCBMVl9DT01NT05fSU5URVJGQUNFKQorCV9IZWFsdGhfbWV0YSA9ICgiKHNzKSIsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX0ZpeGVkTWlub3JfbWV0YSA9ICgnYicsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX1plcm9CbG9ja3NfbWV0YSA9ICgnYicsIExWX0NPTU1PTl9JTlRFUkZBQ0UpCisJX1NraXBBY3RpdmF0aW9uX21ldGEgPSAoJ2InLCBMVl9DT01NT05fSU5URVJGQUNFKQorCisJIyBub2luc3BlY3Rpb24gUHlVbnVzZWRMb2NhbCxQeVBlcDhOYW1pbmcKKwlkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0X3BhdGgsIG9iamVjdF9zdGF0ZSk6CisJCXN1cGVyKEx2Q29tbW9uLCBzZWxmKS5fX2luaXRfXyhvYmplY3RfcGF0aCwgbHZzX3N0YXRlX3JldHJpZXZlKQorCQlzZWxmLnNldF9pbnRlcmZhY2UoTFZfQ09NTU9OX0lOVEVSRkFDRSkKKwkJc2VsZi5zdGF0ZSA9IG9iamVjdF9zdGF0ZQorCisJQHByb3BlcnR5CisJZGVmIFZvbHVtZVR5cGUoc2VsZik6CisJCXR5cGVfbWFwID0geydDJzogJ0NhY2hlJywgJ20nOiAnbWlycm9yZWQnLAorCQkJCQknTSc6ICdNaXJyb3JlZCB3aXRob3V0IGluaXRpYWwgc3luYycsICdvJzogJ29yaWdpbicsCisJCQkJCSdPJzogJ09yaWdpbiB3aXRoIG1lcmdpbmcgc25hcHNob3QnLCAncic6ICdyYWlkJywKKwkJCQkJJ1InOiAnUmFpZCB3aXRob3V0IGluaXRpYWwgc3luYycsICdzJzogJ3NuYXBzaG90JywKKwkJCQkJJ1MnOiAnbWVyZ2luZyBTbmFwc2hvdCcsICdwJzogJ3B2bW92ZScsCisJCQkJCSd2JzogJ3ZpcnR1YWwnLCAnaSc6ICdtaXJyb3IgIG9yICByYWlkICBpbWFnZScsCisJCQkJCSdJJzogJ21pcnJvciBvciByYWlkIEltYWdlIG91dC1vZi1zeW5jJywKKwkJCQkJJ2wnOiAnbWlycm9yIGxvZyBkZXZpY2UnLCAnYyc6ICd1bmRlciBjb252ZXJzaW9uJywKKwkJCQkJJ1YnOiAndGhpbiBWb2x1bWUnLCAndCc6ICd0aGluIHBvb2wnLCAnVCc6ICdUaGluIHBvb2wgZGF0YScsCisJCQkJCSdlJzogJ3JhaWQgb3IgcG9vbCBtZXRhZGF0YSBvciBwb29sIG1ldGFkYXRhIHNwYXJlJywKKwkJCQkJJy0nOiAnVW5zcGVjaWZpZWQnfQorCQlyZXR1cm4gKHNlbGYuc3RhdGUuQXR0clswXSwgdHlwZV9tYXBbc2VsZi5zdGF0ZS5BdHRyWzBdXSkKKworCUBwcm9wZXJ0eQorCWRlZiBQZXJtaXNzaW9ucyhzZWxmKToKKwkJdHlwZV9tYXAgPSB7J3cnOiAnd3JpdGFibGUnLCAncic6ICdyZWFkLW9ubHknLAorCQkJCQknUic6ICdSZWFkLW9ubHkgYWN0aXZhdGlvbiBvZiBub24tcmVhZC1vbmx5IHZvbHVtZScsCisJCQkJCSctJzogJ1Vuc3BlY2lmaWVkJ30KKwkJcmV0dXJuIChzZWxmLnN0YXRlLkF0dHJbMV0sIHR5cGVfbWFwW3NlbGYuc3RhdGUuQXR0clsxXV0pCisKKwlAcHJvcGVydHkKKwlkZWYgQWxsb2NhdGlvblBvbGljeShzZWxmKToKKwkJdHlwZV9tYXAgPSB7J2EnOiAnYW55d2hlcmUnLCAnQSc6ICdhbnl3aGVyZSBsb2NrZWQnLAorCQkJCQknYyc6ICdjb250aWd1b3VzJywgJ0MnOiAnY29udGlndW91cyBsb2NrZWQnLAorCQkJCQknaSc6ICdpbmhlcml0ZWQnLCAnSSc6ICdpbmhlcml0ZWQgbG9ja2VkJywKKwkJCQkJJ2wnOiAnY2xpbmcnLCAnTCc6ICdjbGluZyBsb2NrZWQnLAorCQkJCQknbic6ICdub3JtYWwnLCAnTic6ICdub3JtYWwgbG9ja2VkJywgJy0nOiAnVW5zcGVjaWZpZWQnfQorCQlyZXR1cm4gKHNlbGYuc3RhdGUuQXR0clsyXSwgdHlwZV9tYXBbc2VsZi5zdGF0ZS5BdHRyWzJdXSkKKworCUBwcm9wZXJ0eQorCWRlZiBGaXhlZE1pbm9yKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5zdGF0ZS5BdHRyWzNdID09ICdtJworCisJQHByb3BlcnR5CisJZGVmIFN0YXRlKHNlbGYpOgorCQl0eXBlX21hcCA9IHsnYSc6ICdhY3RpdmUnLCAncyc6ICdzdXNwZW5kZWQnLCAnSSc6ICdJbnZhbGlkIHNuYXBzaG90JywKKwkJCQkJJ1MnOiAnaW52YWxpZCBTdXNwZW5kZWQgc25hcHNob3QnLAorCQkJCQknbSc6ICdzbmFwc2hvdCBtZXJnZSBmYWlsZWQnLAorCQkJCQknTSc6ICdzdXNwZW5kZWQgc25hcHNob3QgKE0pZXJnZSBmYWlsZWQnLAorCQkJCQknZCc6ICdtYXBwZWQgZGV2aWNlIHByZXNlbnQgd2l0aG91dCAgdGFibGVzJywKKwkJCQkJJ2knOiAnbWFwcGVkIGRldmljZSBwcmVzZW50IHdpdGggaW5hY3RpdmUgdGFibGUnLAorCQkJCQknWCc6ICd1bmtub3duJywgJy0nOiAnVW5zcGVjaWZpZWQnfQorCQlyZXR1cm4gKHNlbGYuc3RhdGUuQXR0cls0XSwgdHlwZV9tYXBbc2VsZi5zdGF0ZS5BdHRyWzRdXSkKKworCUBwcm9wZXJ0eQorCWRlZiBUYXJnZXRUeXBlKHNlbGYpOgorCQl0eXBlX21hcCA9IHsnQyc6ICdDYWNoZScsICdtJzogJ21pcnJvcicsICdyJzogJ3JhaWQnLAorCQkJCQkncyc6ICdzbmFwc2hvdCcsICd0JzogJ3RoaW4nLCAndSc6ICd1bmtub3duJywKKwkJCQkJJ3YnOiAndmlydHVhbCcsICctJzogJ1Vuc3BlY2lmaWVkJ30KKwkJcmV0dXJuIChzZWxmLnN0YXRlLkF0dHJbNl0sIHR5cGVfbWFwW3NlbGYuc3RhdGUuQXR0cls2XV0pCisKKwlAcHJvcGVydHkKKwlkZWYgWmVyb0Jsb2NrcyhzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuQXR0cls3XSA9PSAneicKKworCUBwcm9wZXJ0eQorCWRlZiBIZWFsdGgoc2VsZik6CisJCXR5cGVfbWFwID0geydwJzogJ3BhcnRpYWwnLCAncic6ICdyZWZyZXNoJywKKwkJCQkJJ20nOiAnbWlzbWF0Y2hlcycsICd3JzogJ3dyaXRlbW9zdGx5JywKKwkJCQkJJ1gnOiAnWCB1bmtub3duJywgJy0nOiAnVW5zcGVjaWZpZWQnfQorCQlyZXR1cm4gKHNlbGYuc3RhdGUuQXR0cls4XSwgdHlwZV9tYXBbc2VsZi5zdGF0ZS5BdHRyWzhdXSkKKworCUBwcm9wZXJ0eQorCWRlZiBTa2lwQWN0aXZhdGlvbihzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuQXR0cls5XSA9PSAnaycKKworCWRlZiB2Z19uYW1lX2xvb2t1cChzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUudmdfbmFtZV9sb29rdXAoKQorCisJZGVmIGx2X2Z1bGxfbmFtZShzZWxmKToKKwkJcmV0dXJuICIlcy8lcyIgJSAoc2VsZi5zdGF0ZS52Z19uYW1lX2xvb2t1cCgpLCBzZWxmLnN0YXRlLk5hbWUpCisKKwlAcHJvcGVydHkKKwlkZWYgaWRlbnRpZmllcnMoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLmlkZW50aWZpZXJzCisKKwlAcHJvcGVydHkKKwlkZWYgVGFncyhzZWxmKToKKwkJcmV0dXJuIHV0aWxzLnBhcnNlX3RhZ3Moc2VsZi5zdGF0ZS5UYWdzKQorCisJQHByb3BlcnR5CisJZGVmIFJvbGVzKHNlbGYpOgorCQlyZXR1cm4gdXRpbHMucGFyc2VfdGFncyhzZWxmLnN0YXRlLnJvbGUpCisKKwlAcHJvcGVydHkKKwlkZWYgbHZtX2lkKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5zdGF0ZS5sdm1faWQKKworCUBwcm9wZXJ0eQorCWRlZiBJc1RoaW5Wb2x1bWUoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLkF0dHJbMF0gPT0gJ1YnCisKKwlAcHJvcGVydHkKKwlkZWYgSXNUaGluUG9vbChzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuQXR0clswXSA9PSAndCcKKworCUBwcm9wZXJ0eQorCWRlZiBBY3RpdmUoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLmFjdGl2ZSA9PSAiYWN0aXZlIgorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPUxWX0NPTU1PTl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0naWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycpCisJZGVmIF9GdXR1cmUoc2VsZiwgdG1vLCBvcGVuX29wdGlvbnMpOgorCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbihMVl9DT01NT05fSU5URVJGQUNFLCAnRG8gbm90IHVzZSEnKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgTHYoTHZDb21tb24pOgorCWRlZiBfZmV0Y2hfaGlkZGVuKHNlbGYsIG5hbWUpOgorCisJCSMgVGhlIG5hbWUgaXMgdmcvbmFtZQorCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKHNlbGYudmdfbmFtZV9sb29rdXAoKSwgbmFtZSkKKwkJcmV0dXJuIGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfbHZtX2lkKGZ1bGxfbmFtZSkKKworCWRlZiBfZ2V0X2RhdGFfbWV0YShzZWxmKToKKworCQkjIEdldCB0aGUgZGF0YQorCQlyZXR1cm4gKHNlbGYuX2ZldGNoX2hpZGRlbihzZWxmLnN0YXRlLmRhdGFfbHYpLAorCQkJCXNlbGYuX2ZldGNoX2hpZGRlbihzZWxmLnN0YXRlLm1ldGFkYXRhX2x2KSkKKworCSMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwsUHlQZXA4TmFtaW5nCisJZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdF9wYXRoLCBvYmplY3Rfc3RhdGUpOgorCQlzdXBlcihMdiwgc2VsZikuX19pbml0X18ob2JqZWN0X3BhdGgsIG9iamVjdF9zdGF0ZSkKKwkJc2VsZi5zZXRfaW50ZXJmYWNlKExWX0lOVEVSRkFDRSkKKwkJc2VsZi5zdGF0ZSA9IG9iamVjdF9zdGF0ZQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcmVtb3ZlKGx2X3V1aWQsIGx2X25hbWUsIHJlbW92ZV9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZChsdl91dWlkLCBsdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCSMgUmVtb3ZlIHRoZSBMViwgaWYgc3VjY2Vzc2Z1bCB0aGVuIHJlbW92ZSBmcm9tIHRoZSBtb2RlbAorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci5sdl9yZW1vdmUobHZfbmFtZSwgcmVtb3ZlX29wdGlvbnMpCisKKwkJCWlmIHJjID09IDA6CisJCQkJY2ZnLm9tLnJlbW92ZV9vYmplY3QoZGJvLCBUcnVlKQorCQkJCWNmZy5sb2FkKCkKKwkJCWVsc2U6CisJCQkJIyBOZWVkIHRvIHdvcmsgb24gZXJyb3IgaGFuZGxpbmcsIG5lZWQgY29uc2lzdGVudAorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTFZfSU5URVJGQUNFLAorCQkJCSdMViB3aXRoIHV1aWQgJXMgYW5kIG5hbWUgJXMgbm90IHByZXNlbnQhJyAlCisJCQkJKGx2X3V1aWQsIGx2X25hbWUpKQorCQlyZXR1cm4gJy8nCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J2lhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgUmVtb3ZlKHNlbGYsIHRtbywgcmVtb3ZlX29wdGlvbnMsIGNiLCBjYmUpOgorCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBMdi5fcmVtb3ZlLAorCQkJKHNlbGYuVXVpZCwgc2VsZi5sdm1faWQsIHJlbW92ZV9vcHRpb25zKSwKKwkJCWNiLCBjYmUsIEZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9yZW5hbWUobHZfdXVpZCwgbHZfbmFtZSwgbmV3X25hbWUsIHJlbmFtZV9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZChsdl91dWlkLCBsdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCSMgUmVuYW1lIHRoZSBsb2dpY2FsIHZvbHVtZQorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci5sdl9yZW5hbWUobHZfbmFtZSwgbmV3X25hbWUsCisJCQkJCQkJCQkJCQlyZW5hbWVfb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJY2ZnLmxvYWQoKQorCQkJZWxzZToKKwkJCQkjIE5lZWQgdG8gd29yayBvbiBlcnJvciBoYW5kbGluZywgbmVlZCBjb25zaXN0ZW50CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCUxWX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJJ0xWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkobHZfdXVpZCwgbHZfbmFtZSkpCisJCXJldHVybiAnLycKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1MVl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc2lhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgUmVuYW1lKHNlbGYsIG5hbWUsIHRtbywgcmVuYW1lX29wdGlvbnMsIGNiLCBjYmUpOgorCQl1dGlscy52YWxpZGF0ZV9sdl9uYW1lKExWX0lOVEVSRkFDRSwgc2VsZi52Z19uYW1lX2xvb2t1cCgpLCBuYW1lKQorCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Ll9yZW5hbWUsCisJCQkoc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwgbmFtZSwgcmVuYW1lX29wdGlvbnMpLAorCQkJY2IsIGNiZSwgRmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1MVl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nbyh0dClhKG90dClpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIE1vdmUoc2VsZiwgcHZfc3JjX29iaiwgcHZfc291cmNlX3JhbmdlLAorCQkJCXB2X2Rlc3RzX2FuZF9yYW5nZXMsCisJCQkJdG1vLCBtb3ZlX29wdGlvbnMsIGNiLCBjYmUpOgorCisJCWpvYl9zdGF0ZSA9IEpvYlN0YXRlKCkKKworCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJCXRtbywgYmFja2dyb3VuZC5tb3ZlLAorCQkJCShMVl9JTlRFUkZBQ0UsIHNlbGYubHZtX2lkLCBwdl9zcmNfb2JqLCBwdl9zb3VyY2VfcmFuZ2UsCisJCQkJcHZfZGVzdHNfYW5kX3JhbmdlcywgbW92ZV9vcHRpb25zLCBqb2Jfc3RhdGUpLCBjYiwgY2JlLCBGYWxzZSwKKwkJCQlqb2Jfc3RhdGUpCisKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfc25hcF9zaG90KGx2X3V1aWQsIGx2X25hbWUsIG5hbWUsIG9wdGlvbmFsX3NpemUsCisJCQlzbmFwc2hvdF9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZChsdl91dWlkLCBsdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCSMgSWYgeW91IHNwZWNpZnkgYSBzaXplIHlvdSBnZXQgYSAndGhpY2snIHNuYXBzaG90IGV2ZW4gaWYKKwkJCSMgaXQgaXMgYSB0aGluIGx2CisJCQlpZiBub3QgZGJvLklzVGhpblZvbHVtZToKKwkJCQlpZiBvcHRpb25hbF9zaXplID09IDA6CisJCQkJCXNwYWNlID0gZGJvLlNpemVCeXRlcyAvIDgwCisJCQkJCXJlbWFpbmRlciA9IHNwYWNlICUgNTEyCisJCQkJCW9wdGlvbmFsX3NpemUgPSBzcGFjZSArIDUxMiAtIHJlbWFpbmRlcgorCisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnZnX2x2X3NuYXBzaG90KAorCQkJCWx2X25hbWUsIHNuYXBzaG90X29wdGlvbnMsIG5hbWUsIG9wdGlvbmFsX3NpemUpCisJCQlpZiByYyA9PSAwOgorCQkJCXJldHVybl9wYXRoID0gJy8nCisJCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlIChkYm8udmdfbmFtZV9sb29rdXAoKSwgbmFtZSkKKwkJCQlsdnMgPSBsb2FkX2x2cyhbZnVsbF9uYW1lXSwgZW1pdF9zaWduYWw9VHJ1ZSlbMF0KKwkJCQlmb3IgbCBpbiBsdnM6CisJCQkJCXJldHVybl9wYXRoID0gbC5kYnVzX29iamVjdF9wYXRoKCkKKworCQkJCSMgUmVmcmVzaCBzZWxmIGFuZCBhbGwgaW5jbHVkZWQgUFZzCisJCQkJY2ZnLmxvYWQoY2FjaGVfcmVmcmVzaD1GYWxzZSkKKwkJCQlyZXR1cm4gcmV0dXJuX3BhdGgKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCUxWX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJJ0xWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkobHZfdXVpZCwgbHZfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3N0aWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBTbmFwc2hvdChzZWxmLCBuYW1lLCBvcHRpb25hbF9zaXplLCB0bW8sCisJCQlzbmFwc2hvdF9vcHRpb25zLCBjYiwgY2JlKToKKworCQl1dGlscy52YWxpZGF0ZV9sdl9uYW1lKExWX0lOVEVSRkFDRSwgc2VsZi52Z19uYW1lX2xvb2t1cCgpLCBuYW1lKQorCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Ll9zbmFwX3Nob3QsCisJCQkoc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwgbmFtZSwKKwkJCW9wdGlvbmFsX3NpemUsIHNuYXBzaG90X29wdGlvbnMpLCBjYiwgY2JlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9yZXNpemUobHZfdXVpZCwgbHZfbmFtZSwgbmV3X3NpemVfYnl0ZXMsIHB2X2Rlc3RzX2FuZF9yYW5nZXMsCisJCQkJcmVzaXplX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCXB2X2Rlc3RzID0gW10KKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQobHZfdXVpZCwgbHZfbmFtZSkKKworCQlpZiBkYm86CisJCQkjIElmIHdlIGhhdmUgUFZzLCB2ZXJpZnkgdGhlbQorCQkJaWYgbGVuKHB2X2Rlc3RzX2FuZF9yYW5nZXMpOgorCQkJCWZvciBwciBpbiBwdl9kZXN0c19hbmRfcmFuZ2VzOgorCQkJCQlwdl9kYnVzX29iaiA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3BhdGgocHJbMF0pCisJCQkJCWlmIG5vdCBwdl9kYnVzX29iajoKKwkJCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQkJCUxWX0lOVEVSRkFDRSwKKwkJCQkJCQknUFYgRGVzdGluYXRpb24gKCVzKSBub3QgZm91bmQnICUgcHJbMF0pCisKKwkJCQkJcHZfZGVzdHMuYXBwZW5kKChwdl9kYnVzX29iai5sdm1faWQsIHByWzFdLCBwclsyXSkpCisKKwkJCXNpemVfY2hhbmdlID0gbmV3X3NpemVfYnl0ZXMgLSBkYm8uU2l6ZUJ5dGVzCisKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIubHZfcmVzaXplKGRiby5sdm1faWQsIHNpemVfY2hhbmdlLAorCQkJCQkJCQkJCQkJcHZfZGVzdHMsIHJlc2l6ZV9vcHRpb25zKQorCisJCQlpZiByYyA9PSAwOgorCQkJCSMgUmVmcmVzaCB3aGF0J3MgY2hhbmdlZAorCQkJCWNmZy5sb2FkKCkKKwkJCQlyZXR1cm4gIi8iCisJCQllbHNlOgorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTFZfSU5URVJGQUNFLAorCQkJCSdMViB3aXRoIHV1aWQgJXMgYW5kIG5hbWUgJXMgbm90IHByZXNlbnQhJyAlCisJCQkJKGx2X3V1aWQsIGx2X25hbWUpKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPUxWX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSd0YShvdHQpaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBSZXNpemUoc2VsZiwgbmV3X3NpemVfYnl0ZXMsIHB2X2Rlc3RzX2FuZF9yYW5nZXMsIHRtbywKKwkJCXJlc2l6ZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJIiIiCisJCVJlc2l6ZSBhIExWCisJCTpwYXJhbSBuZXdfc2l6ZV9ieXRlczogVGhlIHJlcXVlc3RlZCBmaW5hbCBzaXplIGluIGJ5dGVzCisJCTpwYXJhbSBwdl9kZXN0c19hbmRfcmFuZ2VzOiBBbiBhcnJheSBvZiBwdiBvYmplY3QgcGF0aHMgYW5kIHNyYyAmCisJCQkJCQkJCQlkc3QuIHNlZ21lbnQgcmFuZ2VzCisJCTpwYXJhbSB0bW86IC0xIHRvIHdhaXQgZm9yZXZlciwgMCB0byByZXR1cm4gam9iIGltbWVkaWF0ZWx5LCBlbHNlCisJCQkJCW51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIG9wZXJhdGlvbiB0byBjb21wbGV0ZQorCQkJCQliZWZvcmUgZ2V0dGluZyBhIGpvYgorCQk6cGFyYW0gcmVzaXplX29wdGlvbnM6IGtleS92YWx1ZSBoYXNoIG9mIG9wdGlvbnMKKwkJOnBhcmFtIGNiOiAgVXNlZCBieSBmcmFtZXdvcmsgbm90IGNsaWVudCBmYWNpbmcgQVBJCisJCTpwYXJhbSBjYmU6IFVzZWQgYnkgZnJhbWV3b3JrIG5vdCBjbGllbnQgZmFjaW5nIEFQSQorCQk6cmV0dXJuOiAnLycgaWYgY29tcGxldGUsIGVsc2Ugam9iIG9iamVjdCBwYXRoCisJCSIiIgorCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBMdi5fcmVzaXplLAorCQkJKHNlbGYuVXVpZCwgc2VsZi5sdm1faWQsIHJvdW5kX3NpemUobmV3X3NpemVfYnl0ZXMpLAorCQkJcHZfZGVzdHNfYW5kX3JhbmdlcywKKwkJCXJlc2l6ZV9vcHRpb25zKSwgY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9sdl9hY3RpdmF0ZV9kZWFjdGl2YXRlKHV1aWQsIGx2X25hbWUsIGFjdGl2YXRlLCBjb250cm9sX2ZsYWdzLAorCQkJCQkJCQlvcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCBsdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIuYWN0aXZhdGVfZGVhY3RpdmF0ZSgKKwkJCQknbHZjaGFuZ2UnLCBsdl9uYW1lLCBhY3RpdmF0ZSwgY29udHJvbF9mbGFncywgb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJZGJvLnJlZnJlc2goKQorCQkJCXJldHVybiAnLycKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCUxWX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJJ0xWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgbHZfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3RpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIEFjdGl2YXRlKHNlbGYsIGNvbnRyb2xfZmxhZ3MsIHRtbywgYWN0aXZhdGVfb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Ll9sdl9hY3RpdmF0ZV9kZWFjdGl2YXRlLAorCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIFRydWUsCisJCQljb250cm9sX2ZsYWdzLCBhY3RpdmF0ZV9vcHRpb25zKSwKKwkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJIyBub2luc3BlY3Rpb24gUHlQcm90ZWN0ZWRNZW1iZXIKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3RpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIERlYWN0aXZhdGUoc2VsZiwgY29udHJvbF9mbGFncywgdG1vLCBhY3RpdmF0ZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSgKKwkJCXRtbywgTHYuX2x2X2FjdGl2YXRlX2RlYWN0aXZhdGUsCisJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwgRmFsc2UsCisJCQljb250cm9sX2ZsYWdzLCBhY3RpdmF0ZV9vcHRpb25zKSwKKwkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfYWRkX3JtX3RhZ3ModXVpZCwgbHZfbmFtZSwgdGFnc19hZGQsIHRhZ3NfZGVsLCB0YWdfb3B0aW9ucyk6CisJCSMgTWFrZSBzdXJlIHdlIGhhdmUgYSBkYnVzIG9iamVjdCByZXByZXNlbnRpbmcgaXQKKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgbHZfbmFtZSkKKworCQlpZiBkYm86CisKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIubHZfdGFnKAorCQkJCWx2X25hbWUsIHRhZ3NfYWRkLCB0YWdzX2RlbCwgdGFnX29wdGlvbnMpCisJCQlpZiByYyA9PSAwOgorCQkJCWRiby5yZWZyZXNoKCkKKwkJCQlyZXR1cm4gJy8nCisJCQllbHNlOgorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJJ0xWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgbHZfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J2FzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBUYWdzQWRkKHNlbGYsIHRhZ3MsIHRtbywgdGFnX29wdGlvbnMsIGNiLCBjYmUpOgorCisJCWZvciB0IGluIHRhZ3M6CisJCQl1dGlscy52YWxpZGF0ZV90YWcoTFZfSU5URVJGQUNFLCB0KQorCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Ll9hZGRfcm1fdGFncywKKwkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJdGFncywgTm9uZSwgdGFnX29wdGlvbnMpLAorCQkJY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TFZfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J2FzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBUYWdzRGVsKHNlbGYsIHRhZ3MsIHRtbywgdGFnX29wdGlvbnMsIGNiLCBjYmUpOgorCisJCWZvciB0IGluIHRhZ3M6CisJCQl1dGlscy52YWxpZGF0ZV90YWcoTFZfSU5URVJGQUNFLCB0KQorCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Ll9hZGRfcm1fdGFncywKKwkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJTm9uZSwgdGFncywgdGFnX29wdGlvbnMpLAorCQkJY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKworIyBub2luc3BlY3Rpb24gUHlQZXA4TmFtaW5nCitjbGFzcyBMdlRoaW5Qb29sKEx2KToKKwlfRGF0YUx2X21ldGEgPSAoIm8iLCBUSElOX1BPT0xfSU5URVJGQUNFKQorCV9NZXRhRGF0YUx2X21ldGEgPSAoIm8iLCBUSElOX1BPT0xfSU5URVJGQUNFKQorCisJZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdF9wYXRoLCBvYmplY3Rfc3RhdGUpOgorCQlzdXBlcihMdlRoaW5Qb29sLCBzZWxmKS5fX2luaXRfXyhvYmplY3RfcGF0aCwgb2JqZWN0X3N0YXRlKQorCQlzZWxmLnNldF9pbnRlcmZhY2UoVEhJTl9QT09MX0lOVEVSRkFDRSkKKwkJc2VsZi5fZGF0YV9sdiwgc2VsZi5fbWV0YWRhdGFfbHYgPSBzZWxmLl9nZXRfZGF0YV9tZXRhKCkKKworCUBwcm9wZXJ0eQorCWRlZiBEYXRhTHYoc2VsZik6CisJCXJldHVybiBzZWxmLl9kYXRhX2x2CisKKwlAcHJvcGVydHkKKwlkZWYgTWV0YURhdGFMdihzZWxmKToKKwkJcmV0dXJuIHNlbGYuX21ldGFkYXRhX2x2CisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9sdl9jcmVhdGUobHZfdXVpZCwgbHZfbmFtZSwgbmFtZSwgc2l6ZV9ieXRlcywgY3JlYXRlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKGx2X3V1aWQsIGx2X25hbWUpCisKKwkJbHZfY3JlYXRlZCA9ICcvJworCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIubHZfbHZfY3JlYXRlKAorCQkJCWx2X25hbWUsIGNyZWF0ZV9vcHRpb25zLCBuYW1lLCBzaXplX2J5dGVzKQorCQkJaWYgcmMgPT0gMDoKKwkJCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKGRiby52Z19uYW1lX2xvb2t1cCgpLCBuYW1lKQorCQkJCWx2cyA9IGxvYWRfbHZzKFtmdWxsX25hbWVdLCBlbWl0X3NpZ25hbD1UcnVlKVswXQorCQkJCWZvciBsIGluIGx2czoKKwkJCQkJbHZfY3JlYXRlZCA9IGwuZGJ1c19vYmplY3RfcGF0aCgpCisJCQllbHNlOgorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTFZfSU5URVJGQUNFLAorCQkJCSdMViB3aXRoIHV1aWQgJXMgYW5kIG5hbWUgJXMgbm90IHByZXNlbnQhJyAlCisJCQkJKGx2X3V1aWQsIGx2X25hbWUpKQorCQlyZXR1cm4gbHZfY3JlYXRlZAorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVRISU5fUE9PTF9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc3RpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPScob28pJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIEx2Q3JlYXRlKHNlbGYsIG5hbWUsIHNpemVfYnl0ZXMsIHRtbywgY3JlYXRlX29wdGlvbnMsIGNiLCBjYmUpOgorCQl1dGlscy52YWxpZGF0ZV9sdl9uYW1lKFRISU5fUE9PTF9JTlRFUkZBQ0UsIHNlbGYudmdfbmFtZV9sb29rdXAoKSwgbmFtZSkKKworCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBMdlRoaW5Qb29sLl9sdl9jcmVhdGUsCisJCQkoc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwgbmFtZSwKKwkJCXJvdW5kX3NpemUoc2l6ZV9ieXRlcyksIGNyZWF0ZV9vcHRpb25zKSwgY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgTHZDYWNoZVBvb2woTHYpOgorCV9EYXRhTHZfbWV0YSA9ICgibyIsIENBQ0hFX1BPT0xfSU5URVJGQUNFKQorCV9NZXRhRGF0YUx2X21ldGEgPSAoIm8iLCBDQUNIRV9QT09MX0lOVEVSRkFDRSkKKworCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfcGF0aCwgb2JqZWN0X3N0YXRlKToKKwkJc3VwZXIoTHZDYWNoZVBvb2wsIHNlbGYpLl9faW5pdF9fKG9iamVjdF9wYXRoLCBvYmplY3Rfc3RhdGUpCisJCXNlbGYuc2V0X2ludGVyZmFjZShDQUNIRV9QT09MX0lOVEVSRkFDRSkKKwkJc2VsZi5fZGF0YV9sdiwgc2VsZi5fbWV0YWRhdGFfbHYgPSBzZWxmLl9nZXRfZGF0YV9tZXRhKCkKKworCUBwcm9wZXJ0eQorCWRlZiBEYXRhTHYoc2VsZik6CisJCXJldHVybiBzZWxmLl9kYXRhX2x2CisKKwlAcHJvcGVydHkKKwlkZWYgTWV0YURhdGFMdihzZWxmKToKKwkJcmV0dXJuIHNlbGYuX21ldGFkYXRhX2x2CisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9jYWNoZV9sdihsdl91dWlkLCBsdl9uYW1lLCBsdl9vYmplY3RfcGF0aCwgY2FjaGVfb3B0aW9ucyk6CisKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBjYWNoZSBwb29sCisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKGx2X3V1aWQsIGx2X25hbWUpCisKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBkYnVzIG9iamVjdCByZXByZXNlbnRpbmcgbHYgdG8gY2FjaGUKKwkJbHZfdG9fY2FjaGUgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKGx2X29iamVjdF9wYXRoKQorCisJCWlmIGRibyBhbmQgbHZfdG9fY2FjaGU6CisJCQlmY24gPSBsdl90b19jYWNoZS5sdl9mdWxsX25hbWUoKQorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci5sdl9jYWNoZV9sdigKKwkJCQlkYm8ubHZfZnVsbF9uYW1lKCksIGZjbiwgY2FjaGVfb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJIyBXaGVuIHdlIGNhY2hlIGFuIExWLCB0aGUgY2FjaGUgcG9vbCBhbmQgdGhlIGx2IHRoYXQgaXMgZ2V0dGluZworCQkJCSMgY2FjaGVkIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBvYmplY3QgbWFuYWdlciBhbmQKKwkJCQkjIHJlLWNyZWF0ZWQgYXMgdGhlaXIgaW50ZXJmYWNlcyBoYXZlIGNoYW5nZWQhCisJCQkJY2ZnLm9tLnJlbW92ZV9vYmplY3QoZGJvLCBlbWl0X3NpZ25hbD1UcnVlKQorCQkJCWNmZy5vbS5yZW1vdmVfb2JqZWN0KGx2X3RvX2NhY2hlLCBlbWl0X3NpZ25hbD1UcnVlKQorCQkJCWNmZy5sb2FkKCkKKworCQkJCWx2X2NvbnZlcnRlZCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfbHZtX2lkKGZjbikKKworCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJTFZfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCW1zZyA9ICIiCisJCQlpZiBub3QgZGJvOgorCQkJCWRibyArPSAnQ2FjaGVQb29sIExWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUgXAorCQkJCQkobHZfdXVpZCwgbHZfbmFtZSkKKworCQkJaWYgbm90IGx2X3RvX2NhY2hlOgorCQkJCWRibyArPSAnTFYgdG8gY2FjaGUgd2l0aCBvYmplY3QgcGF0aCAlcyBub3QgcHJlc2VudCEnICUgXAorCQkJCQkobHZfb2JqZWN0X3BhdGgpCisKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKExWX0lOVEVSRkFDRSwgbXNnKQorCQlyZXR1cm4gbHZfY29udmVydGVkCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9Q0FDSEVfUE9PTF9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nb2lhe3N2fScsCisJCW91dF9zaWduYXR1cmU9JyhvbyknLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgQ2FjaGVMdihzZWxmLCBsdl9vYmplY3QsIHRtbywgY2FjaGVfb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Q2FjaGVQb29sLl9jYWNoZV9sdiwKKwkJCShzZWxmLlV1aWQsIHNlbGYubHZtX2lkLCBsdl9vYmplY3QsCisJCQljYWNoZV9vcHRpb25zKSwgY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgTHZDYWNoZUx2KEx2KToKKwlfQ2FjaGVQb29sX21ldGEgPSAoIm8iLCBMVl9DQUNIRUQpCisKKwlkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0X3BhdGgsIG9iamVjdF9zdGF0ZSk6CisJCXN1cGVyKEx2Q2FjaGVMdiwgc2VsZikuX19pbml0X18ob2JqZWN0X3BhdGgsIG9iamVjdF9zdGF0ZSkKKwkJc2VsZi5zZXRfaW50ZXJmYWNlKExWX0NBQ0hFRCkKKworCUBwcm9wZXJ0eQorCWRlZiBDYWNoZVBvb2woc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLlBvb2xMdgorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfZGV0YWNoX2x2KGx2X3V1aWQsIGx2X25hbWUsIGRldGFjaF9vcHRpb25zLCBkZXN0cm95X2NhY2hlKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBjYWNoZSBwb29sCisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKGx2X3V1aWQsIGx2X25hbWUpCisKKwkJaWYgZGJvOgorCisJCQkjIEdldCBjdXJyZW50IGNhY2hlIG5hbWUKKwkJCWNhY2hlX3Bvb2wgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKGRiby5DYWNoZVBvb2wpCisKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIubHZfZGV0YWNoX2NhY2hlKAorCQkJCWRiby5sdl9mdWxsX25hbWUoKSwgZGV0YWNoX29wdGlvbnMsIGRlc3Ryb3lfY2FjaGUpCisJCQlpZiByYyA9PSAwOgorCQkJCSMgVGhlIGNhY2hlIHBvb2wgZ2V0cyByZW1vdmVkIGFzIGhpZGRlbiBhbmQgcHV0IGJhY2sgdG8KKwkJCQkjIHZpc2libGUsIHNvIGxldHMgZGVsZXRlCisJCQkJY2ZnLm9tLnJlbW92ZV9vYmplY3QoY2FjaGVfcG9vbCwgZW1pdF9zaWduYWw9VHJ1ZSkKKwkJCQljZmcub20ucmVtb3ZlX29iamVjdChkYm8sIGVtaXRfc2lnbmFsPVRydWUpCisJCQkJY2ZnLmxvYWQoKQorCisJCQkJdW5jYWNoZWRfbHZfcGF0aCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfbHZtX2lkKGx2X25hbWUpCisJCQllbHNlOgorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlMVl9JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTFZfSU5URVJGQUNFLAorCQkJCSdMViB3aXRoIHV1aWQgJXMgYW5kIG5hbWUgJXMgbm90IHByZXNlbnQhJyAlCisJCQkJKGx2X3V1aWQsIGx2X25hbWUpKQorCQlyZXR1cm4gdW5jYWNoZWRfbHZfcGF0aAorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPUxWX0NBQ0hFRCwKKwkJaW5fc2lnbmF0dXJlPSdiaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBEZXRhY2hDYWNoZVBvb2woc2VsZiwgZGVzdHJveV9jYWNoZSwgdG1vLCBkZXRhY2hfb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIEx2Q2FjaGVMdi5fZGV0YWNoX2x2LAorCQkJKHNlbGYuVXVpZCwgc2VsZi5sdm1faWQsIGRldGFjaF9vcHRpb25zLAorCQkJZGVzdHJveV9jYWNoZSksIGNiLCBjYmUpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcKK2NsYXNzIEx2U25hcFNob3QoTHYpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfcGF0aCwgb2JqZWN0X3N0YXRlKToKKwkJc3VwZXIoTHZTbmFwU2hvdCwgc2VsZikuX19pbml0X18ob2JqZWN0X3BhdGgsIG9iamVjdF9zdGF0ZSkKKwkJc2VsZi5zZXRfaW50ZXJmYWNlKFNOQVBTSE9UX0lOVEVSRkFDRSkKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1TTkFQU0hPVF9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0naWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBNZXJnZShzZWxmLCB0bW8sIG1lcmdlX29wdGlvbnMsIGNiLCBjYmUpOgorCQlqb2Jfc3RhdGUgPSBKb2JTdGF0ZSgpCisKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIGJhY2tncm91bmQubWVyZ2UsCisJCQkJCQkJKFNOQVBTSE9UX0lOVEVSRkFDRSwgc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwKKwkJCQkJCQltZXJnZV9vcHRpb25zLCBqb2Jfc3RhdGUpLCBjYiwgY2JlLCBGYWxzZSwKKwkJCQkJCQlqb2Jfc3RhdGUpCisJCWNmZy53b3JrZXJfcS5wdXQocikKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvbHZtX3NoZWxsX3Byb3h5LnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9sdm1fc2hlbGxfcHJveHkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzgzNWM3NAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvbHZtX3NoZWxsX3Byb3h5LnB5CkBAIC0wLDAgKzEsMTg0IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQ29weXJpZ2h0IDIwMTUtMjAxNiwgVnJhdGlzbGF2IFBvZHppbWVrIDx2cG9kemltZUByZWRoYXQuY29tPgorCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHNobGV4Citmcm9tIGZjbnRsIGltcG9ydCBmY250bCwgRl9HRVRGTCwgRl9TRVRGTAorZnJvbSBvcyBpbXBvcnQgT19OT05CTE9DSworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHN5cworaW1wb3J0IHJlCisKK3RyeToKKwlmcm9tIC5jZmcgaW1wb3J0IExWTV9DTUQKKwlmcm9tIC51dGlscyBpbXBvcnQgbG9nX2RlYnVnLCBsb2dfZXJyb3IKK2V4Y2VwdDoKKwlmcm9tIGNmZyBpbXBvcnQgTFZNX0NNRAorCWZyb20gdXRpbHMgaW1wb3J0IGxvZ19kZWJ1ZywgbG9nX2Vycm9yCisKK1NIRUxMX1BST01QVCA9ICJsdm0+ICIKKworCitkZWYgX3F1b3RlX2FyZyhhcmcpOgorCWlmIGxlbihzaGxleC5zcGxpdChhcmcpKSA+IDE6CisJCXJldHVybiAnIiVzIicgJSBhcmcKKwllbHNlOgorCQlyZXR1cm4gYXJnCisKKworY2xhc3MgTFZNU2hlbGxQcm94eShvYmplY3QpOgorCWRlZiBfcmVhZF91bnRpbF9wcm9tcHQoc2VsZik6CisJCXByZXZfZWMgPSBOb25lCisJCXN0ZG91dCA9ICIiCisJCXdoaWxlIG5vdCBzdGRvdXQuZW5kc3dpdGgoU0hFTExfUFJPTVBUKToKKwkJCXRyeToKKwkJCQl0bXAgPSBzZWxmLmx2bV9zaGVsbC5zdGRvdXQucmVhZCgpCisJCQkJaWYgdG1wOgorCQkJCQlzdGRvdXQgKz0gdG1wLmRlY29kZSgidXRmLTgiKQorCQkJZXhjZXB0IElPRXJyb3I6CisJCQkJIyBub3RoaW5nIHdyaXR0ZW4geWV0CisJCQkJcGFzcworCisJCSMgc3RyaXAgdGhlIHByb21wdCBmcm9tIHRoZSBTVERPVVQgYmVmb3JlIHJldHVybmluZyBhbmQgZ3JhYiB0aGUgZXhpdAorCQkjIGNvZGUgaWYgaXQncyBhdmFpbGFibGUKKwkJbSA9IHNlbGYucmUubWF0Y2goc3Rkb3V0KQorCQlpZiBtOgorCQkJcHJldl9lYyA9IGludChtLmdyb3VwKDIpKQorCQkJc3RyaXBfaWR4ID0gLTEgKiBsZW4obS5ncm91cCgxKSkKKwkJZWxzZToKKwkJCXN0cmlwX2lkeCA9IC0xICogbGVuKFNIRUxMX1BST01QVCkKKworCQlyZXR1cm4gc3Rkb3V0WzpzdHJpcF9pZHhdLCBwcmV2X2VjCisKKwlkZWYgX3JlYWRfbGluZShzZWxmKToKKwkJd2hpbGUgVHJ1ZToKKwkJCXRyeToKKwkJCQl0bXAgPSBzZWxmLmx2bV9zaGVsbC5zdGRvdXQucmVhZGxpbmUoKQorCQkJCWlmIHRtcDoKKwkJCQkJcmV0dXJuIHRtcC5kZWNvZGUoInV0Zi04IikKKwkJCWV4Y2VwdCBJT0Vycm9yOgorCQkJCXBhc3MKKworCWRlZiBfZGlzY2FyZF9lY2hvKHNlbGYsIGV4cGVjdGVkKToKKwkJbGluZSA9ICIiCisJCXdoaWxlIGxpbmUgIT0gZXhwZWN0ZWQ6CisJCQkjIEdOVSByZWFkbGluZSBpbnNlcnRzIHNvbWUgaW50ZXJlc3RpbmcgY2hhcmFjdGVycyBhdCB0aW1lcy4uLgorCQkJbGluZSArPSBzZWxmLl9yZWFkX2xpbmUoKS5yZXBsYWNlKCcgXHInLCAnJykKKworCWRlZiBfd3JpdGVfY21kKHNlbGYsIGNtZCk6CisJCWNtZF9ieXRlcyA9IGJ5dGVzKGNtZCwgInV0Zi04IikKKwkJbnVtX3dyaXR0ZW4gPSBzZWxmLmx2bV9zaGVsbC5zdGRpbi53cml0ZShjbWRfYnl0ZXMpCisJCWFzc2VydCAobnVtX3dyaXR0ZW4gPT0gbGVuKGNtZF9ieXRlcykpCisJCXNlbGYubHZtX3NoZWxsLnN0ZGluLmZsdXNoKCkKKworCWRlZiBfbHZtX2VjaG9zKHNlbGYpOgorCQllY2hvID0gRmFsc2UKKwkJY21kID0gInZlcnNpb25cbiIKKwkJc2VsZi5fd3JpdGVfY21kKGNtZCkKKwkJbGluZSA9IHNlbGYuX3JlYWRfbGluZSgpCisKKwkJaWYgbGluZSA9PSBjbWQ6CisJCQllY2hvID0gVHJ1ZQorCisJCXNlbGYuX3JlYWRfdW50aWxfcHJvbXB0KCkKKworCQlyZXR1cm4gZWNobworCisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlzZWxmLnJlID0gcmUuY29tcGlsZSgiLiooXFsoLT9bMC05XSspXF0gbHZtPiAkKSIsIHJlLkRPVEFMTCkKKworCQkjIHJ1biB0aGUgbHZtIHNoZWxsCisJCXNlbGYubHZtX3NoZWxsID0gc3VicHJvY2Vzcy5Qb3BlbigKKwkJCVtMVk1fQ01EXSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorCQkJc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgY2xvc2VfZmRzPVRydWUpCisJCWZsYWdzID0gZmNudGwoc2VsZi5sdm1fc2hlbGwuc3Rkb3V0LCBGX0dFVEZMKQorCQlmY250bChzZWxmLmx2bV9zaGVsbC5zdGRvdXQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykKKwkJZmxhZ3MgPSBmY250bChzZWxmLmx2bV9zaGVsbC5zdGRlcnIsIEZfR0VURkwpCisJCWZjbnRsKHNlbGYubHZtX3NoZWxsLnN0ZGVyciwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKQorCisJCSMgd2FpdCBmb3IgdGhlIGZpcnN0IHByb21wdAorCQlzZWxmLl9yZWFkX3VudGlsX3Byb21wdCgpCisKKwkJIyBDaGVjayB0byBzZWUgaWYgdGhlIHZlcnNpb24gb2YgTFZNIHdlIGFyZSB1c2luZyBpcyBydW5uaW5nIHdpdGgKKwkJIyBnbnUgcmVhZGxpbmUgd2hpY2ggd2lsbCBlY2hvIG91ciB3cml0ZXMgZnJvbSBzdGRpbiB0byBzdGRvdXQKKwkJc2VsZi5lY2hvID0gc2VsZi5fbHZtX2VjaG9zKCkKKworCWRlZiBjYWxsX2x2bShzZWxmLCBhcmd2LCBkZWJ1Zz1GYWxzZSk6CisJCSMgY3JlYXRlIHRoZSBjb21tYW5kIHN0cmluZworCQljbWQgPSAiICIuam9pbihfcXVvdGVfYXJnKGFyZykgZm9yIGFyZyBpbiBhcmd2KQorCQljbWQgKz0gIlxuIgorCisJCSMgcnVuIHRoZSBjb21tYW5kIGJ5IHdyaXRpbmcgaXQgdG8gdGhlIHNoZWxsJ3MgU1RESU4KKwkJc2VsZi5fd3JpdGVfY21kKGNtZCkKKworCQkjIElmIGx2bSBpcyB1dGlsaXppbmcgZ251IHJlYWRsaW5lLCBpdCBlY2hvcyBzdGRpbiB0byBzdGRvdXQKKwkJaWYgc2VsZi5lY2hvOgorCQkJc2VsZi5fZGlzY2FyZF9lY2hvKGNtZCkKKworCQkjIHJlYWQgZXZlcnl0aGluZyBmcm9tIHRoZSBTVERPVVQgdG8gdGhlIG5leHQgcHJvbXB0CisJCXN0ZG91dCwgZXhpdF9jb2RlID0gc2VsZi5fcmVhZF91bnRpbF9wcm9tcHQoKQorCisJCSMgcmVhZCBldmVyeXRoaW5nIGZyb20gU1RERVJSIGlmIHRoZXJlJ3Mgc29tZXRoaW5nICh3ZSB3YWl0ZWQgZm9yIHRoZQorCQkjIHByb21wdCBvbiBTVERPVVQgc28gdGhlcmUgc2hvdWxkIGJlIGFsbCBvciBub3RoaW5nIGF0IHRoaXMgcG9pbnQgb24KKwkJIyBTVERFUlIpCisJCXN0ZGVyciA9IE5vbmUKKwkJdHJ5OgorCQkJdF9lcnJvciA9IHNlbGYubHZtX3NoZWxsLnN0ZGVyci5yZWFkKCkKKwkJCWlmIHRfZXJyb3I6CisJCQkJc3RkZXJyID0gdF9lcnJvci5kZWNvZGUoInV0Zi04IikKKwkJZXhjZXB0IElPRXJyb3I6CisJCQkjIG5vdGhpbmcgb24gU1RERVJSCisJCQlwYXNzCisKKwkJaWYgZXhpdF9jb2RlIGlzIG5vdCBOb25lOgorCQkJcmMgPSBleGl0X2NvZGUKKwkJZWxzZToKKwkJCSMgTFZNIGRvZXMgd3JpdGUgdG8gc3RkZXJyIGV2ZW4gd2hlbiBpdCBkaWQgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LAorCQkJIyBzbyB3aXRob3V0IGhhdmluZyB0aGUgZXhpdCBjb2RlIGluIHRoZSBwcm9tcHQgd2UgY2FuIG5ldmVyIGJlCisJCQkjIHN1cmUuCisJCQlpZiBzdGRlcnI6CisJCQkJcmMgPSAxCisJCQllbHNlOgorCQkJCXJjID0gMAorCisJCWlmIGRlYnVnIG9yIHJjICE9IDA6CisJCQlsb2dfZXJyb3IoKCdDTUQ6ICVzJyAlIGNtZCkpCisJCQlsb2dfZXJyb3IoKCJFQyA9ICVkIiAlIHJjKSkKKwkJCWxvZ19lcnJvcigoIlNURE9VVD1cbiAlc1xuIiAlIHN0ZG91dCkpCisJCQlsb2dfZXJyb3IoKCJTVERFUlI9XG4gJXNcbiIgJSBzdGRlcnIpKQorCisJCXJldHVybiAocmMsIHN0ZG91dCwgc3RkZXJyKQorCisJZGVmIF9fZGVsX18oc2VsZik6CisJCXNlbGYubHZtX3NoZWxsLnRlcm1pbmF0ZSgpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKwlzaGVsbCA9IExWTVNoZWxsUHJveHkoKQorCWluX2xpbmUgPSAic3RhcnQiCisJdHJ5OgorCQl3aGlsZSBpbl9saW5lOgorCQkJaW5fbGluZSA9IGlucHV0KCJsdm0+ICIpCisJCQlpZiBpbl9saW5lOgorCQkJCXJldCwgb3V0LCBlcnIsID0gc2hlbGwuY2FsbF9sdm0oaW5fbGluZS5zcGxpdCgpKQorCQkJCXByaW50KCgiUkVUOiAlZCIgJSByZXQpKQorCQkJCXByaW50KCgiT1VUOlxuJXMiICUgb3V0KSkKKwkJCQlwcmludCgoIkVSUjpcbiVzIiAlIGVycikpCisJZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorCQlwYXNzCisJZXhjZXB0IEVPRkVycm9yOgorCQlwYXNzCisJZXhjZXB0IEV4Y2VwdGlvbjoKKwkJdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPXN5cy5zdGRvdXQpCisJZmluYWxseToKKwkJcHJpbnQoKQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9sdm1kYi5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvbHZtZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmRjNTkzYgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvbHZtZGIucHkKQEAgLTAsMCArMSw1NDQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorCitpbXBvcnQgcHByaW50IGFzIHByZXR0eXByaW50CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKwordHJ5OgorCWZyb20gLiBpbXBvcnQgY21kaGFuZGxlcgorCWZyb20gLnV0aWxzIGltcG9ydCBsb2dfZGVidWcsIGxvZ19lcnJvcgorZXhjZXB0IFN5c3RlbUVycm9yOgorCWltcG9ydCBjbWRoYW5kbGVyCisJZnJvbSB1dGlscyBpbXBvcnQgbG9nX2RlYnVnCisKKworY2xhc3MgRGF0YVN0b3JlKG9iamVjdCk6CisJZGVmIF9faW5pdF9fKHNlbGYsIHVzZWpzb249Tm9uZSk6CisJCXNlbGYucHZzID0ge30KKwkJc2VsZi52Z3MgPSB7fQorCQlzZWxmLmx2cyA9IHt9CisJCXNlbGYucHZfbHZzID0ge30KKwkJc2VsZi5sdl9wdnMgPSB7fQorCQlzZWxmLmx2c19oaWRkZW4gPSB7fQorCisJCXNlbGYucHZfcGF0aF90b191dWlkID0ge30KKwkJc2VsZi52Z19uYW1lX3RvX3V1aWQgPSB7fQorCQlzZWxmLmx2X2Z1bGxfbmFtZV90b191dWlkID0ge30KKworCQlzZWxmLmx2c19pbl92Z3MgPSB7fQorCQlzZWxmLnB2c19pbl92Z3MgPSB7fQorCisJCSMgc2VsZi5yZWZyZXNoKCkKKwkJc2VsZi5udW1fcmVmcmVzaGVzID0gMAorCisJCWlmIHVzZWpzb24gaXMgTm9uZToKKwkJCXNlbGYuanNvbiA9IGNtZGhhbmRsZXIuc3VwcG9ydHNfanNvbigpCisJCWVsc2U6CisJCQlzZWxmLmpzb24gPSB1c2Vqc29uCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9pbnNlcnRfcmVjb3JkKHRhYmxlLCBrZXksIHJlY29yZCwgYWxsb3dlZF9tdWx0aXBsZSk6CisJCWlmIGtleSBpbiB0YWJsZToKKwkJCWV4aXN0aW5nID0gdGFibGVba2V5XQorCisJCQlmb3IgcmVjX2ssIHJlY192IGluIHJlY29yZC5pdGVtcygpOgorCQkJCWlmIHJlY19rIGluIGFsbG93ZWRfbXVsdGlwbGU6CisJCQkJCSMgVGhpcyBjb2x1bW4gbmFtZSBhbGxvd3MgdXMgdG8gc3RvcmUgbXVsdGlwbGUgdmFsdWUgZm9yCisJCQkJCSMgZWFjaCB0eXBlCisJCQkJCWlmIG5vdCBpc2luc3RhbmNlKGV4aXN0aW5nW3JlY19rXSwgbGlzdCk6CisJCQkJCQlleGlzdGluZ192YWx1ZSA9IGV4aXN0aW5nW3JlY19rXQorCQkJCQkJZXhpc3RpbmdbcmVjX2tdID0gW2V4aXN0aW5nX3ZhbHVlLCByZWNfdl0KKwkJCQkJZWxzZToKKwkJCQkJCWV4aXN0aW5nW3JlY19rXS5hcHBlbmQocmVjX3YpCisJCQkJZWxzZToKKwkJCQkJIyBJZiBzb21ldGhpbmcgaXMgbm90IGV4cGVjdGVkIHRvIGhhdmUgY2hhbmdpbmcgdmFsdWVzCisJCQkJCSMgbGV0cyBlbnN1cmUgdGhhdAorCQkJCQlpZiBleGlzdGluZ1tyZWNfa10gIT0gcmVjX3Y6CisJCQkJCQlyYWlzZSBSdW50aW1lRXJyb3IoCisJCQkJCQkJImV4aXN0aW5nWyVzXT0lcyAhPSAlcyIgJQorCQkJCQkJCShyZWNfaywgc3RyKGV4aXN0aW5nW3JlY19rXSksCisJCQkJCQkJc3RyKHJlY192KSkpCisJCWVsc2U6CisJCQl0YWJsZVtrZXldID0gcmVjb3JkCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wYXJzZV9wdnMoX3B2cyk6CisJCXB2cyA9IHNvcnRlZChfcHZzLCBrZXk9bGFtYmRhIHBrOiBwa1sncHZfbmFtZSddKQorCisJCWNfcHZzID0gT3JkZXJlZERpY3QoKQorCQljX2xvb2t1cCA9IHt9CisJCWNfcHZzX2luX3ZncyA9IHt9CisKKwkJZm9yIHAgaW4gcHZzOgorCQkJRGF0YVN0b3JlLl9pbnNlcnRfcmVjb3JkKAorCQkJCWNfcHZzLCBwWydwdl91dWlkJ10sIHAsCisJCQkJWydwdnNlZ19zdGFydCcsICdwdnNlZ19zaXplJywgJ3NlZ3R5cGUnXSkKKworCQlmb3IgcCBpbiBjX3B2cy52YWx1ZXMoKToKKwkJCSMgQ2FwdHVyZSB3aGljaCBQVnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB3aGljaCBWRworCQkJaWYgcFsndmdfdXVpZCddIG5vdCBpbiBjX3B2c19pbl92Z3M6CisJCQkJY19wdnNfaW5fdmdzW3BbJ3ZnX3V1aWQnXV0gPSBbXQorCisJCQlpZiBwWyd2Z19uYW1lJ106CisJCQkJY19wdnNfaW5fdmdzW3BbJ3ZnX3V1aWQnXV0uYXBwZW5kKAorCQkJCQkocFsncHZfbmFtZSddLCBwWydwdl91dWlkJ10pKQorCisJCQkjIExvb2t1cCBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiAvZGV2LzxuYW1lPiBhbmQgcHYgdXVpZAorCQkJY19sb29rdXBbcFsncHZfbmFtZSddXSA9IHBbJ3B2X3V1aWQnXQorCisJCXJldHVybiBjX3B2cywgY19sb29rdXAsIGNfcHZzX2luX3ZncworCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcGFyc2VfcHZzX2pzb24oX2FsbCk6CisKKwkJY19wdnMgPSBPcmRlcmVkRGljdCgpCisJCWNfbG9va3VwID0ge30KKwkJY19wdnNfaW5fdmdzID0ge30KKworCQkjIEVhY2ggaXRlbSBpdGVtIGluIHRoZSByZXBvcnQgaXMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcKKwkJIyB0byB0aGUgdmcKKwkJZm9yIHIgaW4gX2FsbFsncmVwb3J0J106CisJCQl0bXBfcHYgPSBbXQorCisJCQkjIEdldCB0aGUgcHYgZGF0YSBmb3IgdGhpcyBWRy4KKwkJCWlmICdwdicgaW4gcjoKKwkJCQl0bXBfcHYuZXh0ZW5kKHJbJ3B2J10pCisKKwkJCQkjIFNvcnQgdGhlbQorCQkJCXNvcnRlZF90bXBfcHYgPSBzb3J0ZWQodG1wX3B2LCBrZXk9bGFtYmRhIHBrOiBwa1sncHZfbmFtZSddKQorCisJCQkJIyBBZGQgdGhlbSB0byByZXN1bHQgc2V0CisJCQkJZm9yIHAgaW4gc29ydGVkX3RtcF9wdjoKKwkJCQkJY19wdnNbcFsncHZfdXVpZCddXSA9IHAKKworCQkJCWlmICdwdnNlZycgaW4gcjoKKwkJCQkJZm9yIHMgaW4gclsncHZzZWcnXToKKwkJCQkJCXIgPSBjX3B2c1tzWydwdl91dWlkJ11dCisJCQkJCQlyLnNldGRlZmF1bHQoJ3B2c2VnX3N0YXJ0JywgW10pLmFwcGVuZChzWydwdnNlZ19zdGFydCddKQorCQkJCQkJci5zZXRkZWZhdWx0KCdwdnNlZ19zaXplJywgW10pLmFwcGVuZChzWydwdnNlZ19zaXplJ10pCisJCQkJCQlyLnNldGRlZmF1bHQoJ3NlZ3R5cGUnLCBbXSkuYXBwZW5kKHNbJ3NlZ3R5cGUnXSkKKworCQkJCSMgVE9ETzogUmVtb3ZlIHRoaXMgYnVnIHdvcmsgYXJvdW5kIHdoZW4gd2UgaGF2ZSBvcnBoYW4gc2Vncy4KKwkJCQlmb3IgaSBpbiBjX3B2cy52YWx1ZXMoKToKKwkJCQkJaWYgJ3B2c2VnX3N0YXJ0JyBub3QgaW4gaToKKwkJCQkJCWlbJ3B2c2VnX3N0YXJ0J10gPSAnMCcKKwkJCQkJCWlbJ3B2c2VnX3NpemUnXSA9IGlbJ3B2X3BlX2NvdW50J10KKwkJCQkJCWlbJ3NlZ3R5cGUnXSA9ICdmcmVlJworCisJCWZvciBwIGluIGNfcHZzLnZhbHVlcygpOgorCQkJIyBDYXB0dXJlIHdoaWNoIFBWcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHdoaWNoIFZHCisJCQlpZiBwWyd2Z191dWlkJ10gbm90IGluIGNfcHZzX2luX3ZnczoKKwkJCQljX3B2c19pbl92Z3NbcFsndmdfdXVpZCddXSA9IFtdCisKKwkJCWlmIHBbJ3ZnX25hbWUnXToKKwkJCQljX3B2c19pbl92Z3NbcFsndmdfdXVpZCddXS5hcHBlbmQoCisJCQkJCShwWydwdl9uYW1lJ10sIHBbJ3B2X3V1aWQnXSkpCisKKwkJCSMgTG9va3VwIGZvciB0cmFuc2xhdGluZyBiZXR3ZWVuIC9kZXYvPG5hbWU+IGFuZCBwdiB1dWlkCisJCQljX2xvb2t1cFtwWydwdl9uYW1lJ11dID0gcFsncHZfdXVpZCddCisKKwkJcmV0dXJuIGNfcHZzLCBjX2xvb2t1cCwgY19wdnNfaW5fdmdzCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wYXJzZV92Z3MoX3Zncyk6CisJCXZncyA9IHNvcnRlZChfdmdzLCBrZXk9bGFtYmRhIHZrOiB2a1sndmdfbmFtZSddKQorCisJCWNfdmdzID0gT3JkZXJlZERpY3QoKQorCQljX2xvb2t1cCA9IHt9CisKKwkJZm9yIGkgaW4gdmdzOgorCQkJY19sb29rdXBbaVsndmdfbmFtZSddXSA9IGlbJ3ZnX3V1aWQnXQorCQkJRGF0YVN0b3JlLl9pbnNlcnRfcmVjb3JkKGNfdmdzLCBpWyd2Z191dWlkJ10sIGksIFtdKQorCisJCXJldHVybiBjX3ZncywgY19sb29rdXAKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3BhcnNlX3Znc19qc29uKF9hbGwpOgorCisJCXRtcF92ZyA9IFtdCisJCWZvciByIGluIF9hbGxbJ3JlcG9ydCddOgorCQkJIyBHZXQgdGhlIHB2IGRhdGEgZm9yIHRoaXMgVkcuCisJCQlpZiAndmcnIGluIHI6CisJCQkJdG1wX3ZnLmV4dGVuZChyWyd2ZyddKQorCisJCSMgU29ydCBmb3IgY29uc2lzdGVudCBvdXRwdXQsIGhvd2V2ZXIgdGhpcyBpcyBvcHRpb25hbAorCQl2Z3MgPSBzb3J0ZWQodG1wX3ZnLCBrZXk9bGFtYmRhIHZrOiB2a1sndmdfbmFtZSddKQorCisJCWNfdmdzID0gT3JkZXJlZERpY3QoKQorCQljX2xvb2t1cCA9IHt9CisKKwkJZm9yIGkgaW4gdmdzOgorCQkJY19sb29rdXBbaVsndmdfbmFtZSddXSA9IGlbJ3ZnX3V1aWQnXQorCQkJY192Z3NbaVsndmdfdXVpZCddXSA9IGkKKworCQlyZXR1cm4gY192Z3MsIGNfbG9va3VwCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wYXJzZV9sdnNfY29tbW9uKGNfbHZzLCBjX2x2X2Z1bGxfbG9va3VwKToKKworCQljX2x2c19pbl92Z3MgPSBPcmRlcmVkRGljdCgpCisJCWNfbHZzX2hpZGRlbiA9IE9yZGVyZWREaWN0KCkKKworCQlmb3IgaSBpbiBjX2x2cy52YWx1ZXMoKToKKwkJCWlmIGlbJ3ZnX3V1aWQnXSBub3QgaW4gY19sdnNfaW5fdmdzOgorCQkJCWNfbHZzX2luX3Znc1tpWyd2Z191dWlkJ11dID0gW10KKworCQkJY19sdnNfaW5fdmdzWworCQkJCWlbJ3ZnX3V1aWQnXV0uYXBwZW5kKAorCQkJCQkoaVsnbHZfbmFtZSddLAorCQkJCQkoaVsnbHZfYXR0ciddLCBpWydsdl9sYXlvdXQnXSwgaVsnbHZfcm9sZSddKSwKKwkJCQkJaVsnbHZfdXVpZCddKSkKKworCQkJaWYgaVsnbHZfcGFyZW50J106CisJCQkJIyBMb29rdXAgd2hhdCB0aGUgcGFyZW50IHJlZmVycyB0b28KKwkJCQlwYXJlbnRfbmFtZSA9IGlbJ2x2X3BhcmVudCddCisJCQkJZnVsbF9wYXJlbnRfbmFtZSA9ICIlcy8lcyIgJSAoaVsndmdfbmFtZSddLCBwYXJlbnRfbmFtZSkKKwkJCQlpZiBmdWxsX3BhcmVudF9uYW1lIG5vdCBpbiBjX2x2X2Z1bGxfbG9va3VwOgorCQkJCQlwYXJlbnRfbmFtZSA9ICdbJXNdJyAlIChwYXJlbnRfbmFtZSkKKwkJCQkJZnVsbF9wYXJlbnRfbmFtZSA9ICIlcy8lcyIgJSAoaVsndmdfbmFtZSddLCBwYXJlbnRfbmFtZSkKKworCQkJCXBhcmVudF91dWlkID0gY19sdl9mdWxsX2xvb2t1cFtmdWxsX3BhcmVudF9uYW1lXQorCisJCQkJaWYgcGFyZW50X3V1aWQgbm90IGluIGNfbHZzX2hpZGRlbjoKKwkJCQkJY19sdnNfaGlkZGVuW3BhcmVudF91dWlkXSA9IFtdCisKKwkJCQljX2x2c19oaWRkZW5bcGFyZW50X3V1aWRdLmFwcGVuZCgKKwkJCQkJKGlbJ2x2X3V1aWQnXSwgaVsnbHZfbmFtZSddKSkKKworCQlyZXR1cm4gY19sdnMsIGNfbHZzX2luX3ZncywgY19sdnNfaGlkZGVuLCBjX2x2X2Z1bGxfbG9va3VwCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wYXJzZV9sdnMoX2x2cyk6CisJCWx2cyA9IHNvcnRlZChfbHZzLCBrZXk9bGFtYmRhIHZrOiB2a1snbHZfbmFtZSddKQorCisJCWNfbHZzID0gT3JkZXJlZERpY3QoKQorCQljX2x2X2Z1bGxfbG9va3VwID0gT3JkZXJlZERpY3QoKQorCisJCWZvciBpIGluIGx2czoKKwkJCWZ1bGxfbmFtZSA9ICIlcy8lcyIgJSAoaVsndmdfbmFtZSddLCBpWydsdl9uYW1lJ10pCisJCQljX2x2X2Z1bGxfbG9va3VwW2Z1bGxfbmFtZV0gPSBpWydsdl91dWlkJ10KKwkJCURhdGFTdG9yZS5faW5zZXJ0X3JlY29yZCgKKwkJCQljX2x2cywgaVsnbHZfdXVpZCddLCBpLAorCQkJCVsnc2VnX3BlX3JhbmdlcycsICdzZWd0eXBlJ10pCisKKwkJcmV0dXJuIERhdGFTdG9yZS5fcGFyc2VfbHZzX2NvbW1vbihjX2x2cywgY19sdl9mdWxsX2xvb2t1cCkKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3BhcnNlX2x2c19qc29uKF9hbGwpOgorCisJCWNfbHZzID0gT3JkZXJlZERpY3QoKQorCQljX2x2X2Z1bGxfbG9va3VwID0ge30KKworCQkjIEVhY2ggaXRlbSBpdGVtIGluIHRoZSByZXBvcnQgaXMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcKKwkJIyB0byB0aGUgdmcKKwkJZm9yIHIgaW4gX2FsbFsncmVwb3J0J106CisJCQkjIEdldCB0aGUgbHYgZGF0YSBmb3IgdGhpcyBWRy4KKwkJCWlmICdsdicgaW4gcjoKKwkJCQkjIEFkZCB0aGVtIHRvIHJlc3VsdCBzZXQKKwkJCQlmb3IgaSBpbiByWydsdiddOgorCQkJCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKGlbJ3ZnX25hbWUnXSwgaVsnbHZfbmFtZSddKQorCQkJCQljX2x2X2Z1bGxfbG9va3VwW2Z1bGxfbmFtZV0gPSBpWydsdl91dWlkJ10KKwkJCQkJY19sdnNbaVsnbHZfdXVpZCddXSA9IGkKKworCQkJCSMgQWRkIGluIHRoZSBzZWdtZW50IGRhdGEKKwkJCQlpZiAnc2VnJyBpbiByOgorCQkJCQlmb3IgcyBpbiByWydzZWcnXToKKwkJCQkJCXIgPSBjX2x2c1tzWydsdl91dWlkJ11dCisJCQkJCQlyLnNldGRlZmF1bHQoJ3NlZ19wZV9yYW5nZXMnLCBbXSkuYXBwZW5kKHNbJ3NlZ19wZV9yYW5nZXMnXSkKKwkJCQkJCXIuc2V0ZGVmYXVsdCgnc2VndHlwZScsIFtdKS5hcHBlbmQoc1snc2VndHlwZSddKQorCisJCXJldHVybiBEYXRhU3RvcmUuX3BhcnNlX2x2c19jb21tb24oY19sdnMsIGNfbHZfZnVsbF9sb29rdXApCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9tYWtlX2xpc3QobCk6CisJCWlmIG5vdCBpc2luc3RhbmNlKGwsIGxpc3QpOgorCQkJbCA9IFtsXQorCQlyZXR1cm4gbAorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcGFyc2Vfc2VnX2VudHJ5KHNlLCBzZWd0eXBlKToKKwkJaWYgc2U6CisJCQkjIHByaW50KCJfcGFyc2Vfc2VnX2VudHJ5ICVzICVzIiAlIChzdHIoc2UpLCBzdHIoc2VndHlwZSkpKQorCQkJZGV2aWNlLCBzZWdzID0gc2Uuc3BsaXQoIjoiKQorCQkJc3RhcnQsIGVuZCA9IHNlZ3Muc3BsaXQoJy0nKQorCQkJcmV0dXJuIChkZXZpY2UsIChzdGFydCwgZW5kKSwgc2VndHlwZSkKKwkJZWxzZToKKwkJCXJldHVybiAoIiIsICgpLCBzZWd0eXBlKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfYnVpbGRfc2VnbWVudHMobCwgc2VnX3R5cGVzKToKKwkJcmMgPSBbXQorCQlsID0gRGF0YVN0b3JlLl9tYWtlX2xpc3QobCkKKwkJcyA9IERhdGFTdG9yZS5fbWFrZV9saXN0KHNlZ190eXBlcykKKworCQlhc3NlcnQgbGVuKGwpID09IGxlbihzKQorCQlscyA9IGxpc3QoemlwKGwsIHMpKQorCisJCWZvciBpIGluIGxzOgorCQkJaWYgJyAnIGluIGlbMF06CisJCQkJdG1wID0gaVswXS5zcGxpdCgnICcpCisJCQkJZm9yIHQgaW4gdG1wOgorCQkJCQlyYy5hcHBlbmQoRGF0YVN0b3JlLl9wYXJzZV9zZWdfZW50cnkodCwgaVsxXSkpCisJCQllbHNlOgorCQkJCXJjLmFwcGVuZChEYXRhU3RvcmUuX3BhcnNlX3NlZ19lbnRyeSgqaSkpCisJCXJldHVybiByYworCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcHZfZGV2aWNlX2x2X2VudHJ5KHRhYmxlLCBwdl9kZXZpY2UsIGx2X3V1aWQsIG1ldGEsIGx2X2F0dHIsCisJCQkJCQkJc2VnbWVudF9pbmZvKToKKworCQlpZiBwdl9kZXZpY2Ugbm90IGluIHRhYmxlOgorCQkJdGFibGVbcHZfZGV2aWNlXSA9IHt9CisKKwkJaWYgbHZfdXVpZCBub3QgaW4gdGFibGVbcHZfZGV2aWNlXToKKwkJCXRhYmxlW3B2X2RldmljZV1bbHZfdXVpZF0gPSB7fQorCQkJdGFibGVbcHZfZGV2aWNlXVtsdl91dWlkXVsnc2VncyddID0gW3NlZ21lbnRfaW5mb10KKwkJCXRhYmxlW3B2X2RldmljZV1bbHZfdXVpZF1bJ25hbWUnXSA9IG1ldGEKKwkJCXRhYmxlW3B2X2RldmljZV1bbHZfdXVpZF1bJ21ldGEnXSA9IGx2X2F0dHIKKwkJZWxzZToKKwkJCXRhYmxlW3B2X2RldmljZV1bbHZfdXVpZF1bJ3NlZ3MnXS5hcHBlbmQoc2VnbWVudF9pbmZvKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcHZfZGV2aWNlX2x2X2Zvcm1hdChwdl9kZXZpY2VfbHZzKToKKwkJcmMgPSB7fQorCisJCWZvciBwdl9kZXZpY2UsIHBkIGluIHB2X2RldmljZV9sdnMuaXRlbXMoKToKKwkJCWx2cyA9IFtdCisJCQlmb3IgbHZfdXVpZCwgbGQgaW4gc29ydGVkKHBkLml0ZW1zKCkpOgorCQkJCWx2cy5hcHBlbmQoKGx2X3V1aWQsIGxkWyduYW1lJ10sIGxkWydtZXRhJ10sIGxkWydzZWdzJ10pKQorCisJCQlyY1twdl9kZXZpY2VdID0gbHZzCisJCXJldHVybiByYworCisJQHN0YXRpY21ldGhvZAorCWRlZiBfbHZzX2RldmljZV9wdl9lbnRyeSh0YWJsZSwgbHZfdXVpZCwgcHZfZGV2aWNlLCBwdl91dWlkLCBzZWdtZW50X2luZm8pOgorCQlpZiBsdl91dWlkIG5vdCBpbiB0YWJsZToKKwkJCXRhYmxlW2x2X3V1aWRdID0ge30KKworCQlpZiBwdl9kZXZpY2Ugbm90IGluIHRhYmxlW2x2X3V1aWRdOgorCQkJdGFibGVbbHZfdXVpZF1bcHZfZGV2aWNlXSA9IHt9CisJCQl0YWJsZVtsdl91dWlkXVtwdl9kZXZpY2VdWydzZWdzJ10gPSBbc2VnbWVudF9pbmZvXQorCQkJdGFibGVbbHZfdXVpZF1bcHZfZGV2aWNlXVsncHZfdXVpZCddID0gcHZfdXVpZAorCQllbHNlOgorCQkJdGFibGVbbHZfdXVpZF1bcHZfZGV2aWNlXVsnc2VncyddLmFwcGVuZChzZWdtZW50X2luZm8pCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9sdnNfZGV2aWNlX3B2X2Zvcm1hdChsdnNfZGV2aWNlX3B2cyk6CisJCXJjID0ge30KKworCQlmb3IgbHZfdXVpZCwgbGQgaW4gbHZzX2RldmljZV9wdnMuaXRlbXMoKToKKwkJCXB2cyA9IFtdCisJCQlmb3IgcHZfZGV2aWNlLCBwZCBpbiBzb3J0ZWQobGQuaXRlbXMoKSk6CisJCQkJcHZzLmFwcGVuZCgocGRbJ3B2X3V1aWQnXSwgcHZfZGV2aWNlLCBwZFsnc2VncyddKSkKKworCQkJcmNbbHZfdXVpZF0gPSBwdnMKKwkJcmV0dXJuIHJjCisKKwlkZWYgX3BhcnNlX3B2X2luX2x2cyhzZWxmKToKKwkJcHZfZGV2aWNlX2x2cyA9IHt9ICAjIFdoYXQgTFZzIGFyZSBzdG9yZWQgb24gYSBQVgorCQlsdnNfZGV2aWNlX3B2ID0ge30gICMgV2hlcmUgTFYgZGF0YSBpcyBzdG9yZWQKKworCQlmb3IgaSBpbiBzZWxmLmx2cy52YWx1ZXMoKToKKwkJCXNlZ3MgPSBzZWxmLl9idWlsZF9zZWdtZW50cyhpWydzZWdfcGVfcmFuZ2VzJ10sIGlbJ3NlZ3R5cGUnXSkKKwkJCWZvciBzIGluIHNlZ3M6CisJCQkJIyBXZSBhcmUgcmVmZXJyaW5nIHRvIHBoeXNpY2FsIGRldmljZQorCQkJCWlmICcvZGV2LycgaW4gc1swXToKKwkJCQkJZGV2aWNlLCByLCBzZWdfdHlwZSA9IHMKKworCQkJCQlEYXRhU3RvcmUuX3B2X2RldmljZV9sdl9lbnRyeSgKKwkJCQkJCXB2X2RldmljZV9sdnMsIGRldmljZSwgaVsnbHZfdXVpZCddLCBpWydsdl9uYW1lJ10sCisJCQkJCQkoaVsnbHZfYXR0ciddLCBpWydsdl9sYXlvdXQnXSwgaVsnbHZfcm9sZSddKSwKKwkJCQkJCShyWzBdLCByWzFdLCBzZWdfdHlwZSkpCisKKwkJCQkJIyAocHZfbmFtZSwgcHZfc2VncywgcHZfdXVpZCkKKwkJCQkJRGF0YVN0b3JlLl9sdnNfZGV2aWNlX3B2X2VudHJ5KAorCQkJCQkJbHZzX2RldmljZV9wdiwgaVsnbHZfdXVpZCddLCBkZXZpY2UsCisJCQkJCQlzZWxmLnB2X3BhdGhfdG9fdXVpZFtkZXZpY2VdLCAoclswXSwgclsxXSwgc2VnX3R5cGUpKQorCQkJCWVsc2U6CisJCQkJCSMgVE9ETyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNlZ21lbnRzIHJlZmVyIHRvIGEgTFYKKwkJCQkJIyBhbmQgbm90IGEgUFYKKwkJCQkJcGFzcworCQkJCQkjIHByaW50KCJIYW5kbGUgdGhpcyAlcyAlcyAlcyIgJSAoc1swXSwgc1sxXSwgc1syXSkpCisKKwkJIyBDb252ZXJ0IGZvcm0gdG8gbmVlZGVkIHJlc3VsdCBmb3IgY29uc3VtcHRpb24KKwkJcHZfZGV2aWNlX2x2c19yZXN1bHQgPSBEYXRhU3RvcmUuX3B2X2RldmljZV9sdl9mb3JtYXQocHZfZGV2aWNlX2x2cykKKwkJbHZzX2RldmljZV9wdl9yZXN1bHQgPSBEYXRhU3RvcmUuX2x2c19kZXZpY2VfcHZfZm9ybWF0KGx2c19kZXZpY2VfcHYpCisKKwkJcmV0dXJuIHB2X2RldmljZV9sdnNfcmVzdWx0LCBsdnNfZGV2aWNlX3B2X3Jlc3VsdAorCisJZGVmIHJlZnJlc2goc2VsZiwgbG9nPVRydWUpOgorCQkiIiIKKwkJR28gb3V0IGFuZCBxdWVyeSBsdm0gZm9yIHRoZSBsYXRlc3QgZGF0YSBpbiBhcyBmZXcgdHJpcHMgYXMgcG9zc2libGUKKwkJOnBhcmFtIGxvZyAgQWRkIGRlYnVnIGxvZyBlbnRyeS9leGl0IG1lc3NhZ2VzCisJCTpyZXR1cm46IE5vbmUKKwkJIiIiCisJCXNlbGYubnVtX3JlZnJlc2hlcyArPSAxCisJCWlmIGxvZzoKKwkJCWxvZ19kZWJ1ZygibHZtZGIgLSByZWZyZXNoIGVudHJ5IikKKworCQkjIEdyYWIgZXZlcnl0aGluZyBmaXJzdCB0aGVuIHBhcnNlIGl0CisJCWlmIHNlbGYuanNvbjoKKwkJCSMgRG8gYSBzaW5nbGUgbHZtIHJldHJpZXZlIGZvciBldmVyeXRoaW5nIGluIGpzb24KKwkJCWEgPSBjbWRoYW5kbGVyLmx2bV9mdWxsX3JlcG9ydF9qc29uKCkKKworCQkJX3B2cywgX3B2c19sb29rdXAsIF9wdnNfaW5fdmdzID0gc2VsZi5fcGFyc2VfcHZzX2pzb24oYSkKKwkJCV92Z3MsIF92Z3NfbG9va3VwID0gc2VsZi5fcGFyc2VfdmdzX2pzb24oYSkKKwkJCV9sdnMsIF9sdnNfaW5fdmdzLCBfbHZzX2hpZGRlbiwgX2x2c19sb29rdXAgPSBzZWxmLl9wYXJzZV9sdnNfanNvbihhKQorCisJCWVsc2U6CisJCQlfcmF3X3B2cyA9IGNtZGhhbmRsZXIucHZfcmV0cmlldmVfd2l0aF9zZWdzKCkKKwkJCV9yYXdfdmdzID0gY21kaGFuZGxlci52Z19yZXRyaWV2ZShOb25lKQorCQkJX3Jhd19sdnMgPSBjbWRoYW5kbGVyLmx2X3JldHJpZXZlX3dpdGhfc2VnbWVudHMoKQorCisJCQlfcHZzLCBfcHZzX2xvb2t1cCwgX3B2c19pbl92Z3MgPSBzZWxmLl9wYXJzZV9wdnMoX3Jhd19wdnMpCisJCQlfdmdzLCBfdmdzX2xvb2t1cCA9IHNlbGYuX3BhcnNlX3ZncyhfcmF3X3ZncykKKwkJCV9sdnMsIF9sdnNfaW5fdmdzLCBfbHZzX2hpZGRlbiwgX2x2c19sb29rdXAgPSBzZWxmLl9wYXJzZV9sdnMoX3Jhd19sdnMpCisKKwkJIyBTZXQgYWxsCisJCXNlbGYucHZzID0gX3B2cworCQlzZWxmLnB2X3BhdGhfdG9fdXVpZCA9IF9wdnNfbG9va3VwCisJCXNlbGYudmdfbmFtZV90b191dWlkID0gX3Znc19sb29rdXAKKwkJc2VsZi5sdl9mdWxsX25hbWVfdG9fdXVpZCA9IF9sdnNfbG9va3VwCisKKwkJc2VsZi52Z3MgPSBfdmdzCisJCXNlbGYubHZzID0gX2x2cworCQlzZWxmLmx2c19pbl92Z3MgPSBfbHZzX2luX3ZncworCQlzZWxmLnB2c19pbl92Z3MgPSBfcHZzX2luX3ZncworCQlzZWxmLmx2c19oaWRkZW4gPSBfbHZzX2hpZGRlbgorCisJCSMgQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3Igd2hpY2ggTFYgYW5kIHNlZ21lbnRzIGFyZSBvbiBlYWNoIFBWCisJCXNlbGYucHZfbHZzLCBzZWxmLmx2X3B2cyA9IHNlbGYuX3BhcnNlX3B2X2luX2x2cygpCisKKwkJaWYgbG9nOgorCQkJbG9nX2RlYnVnKCJsdm1kYiAtIHJlZnJlc2ggZXhpdCIpCisKKwlkZWYgZmV0Y2hfcHZzKHNlbGYsIHB2X25hbWUpOgorCQlpZiBub3QgcHZfbmFtZToKKwkJCXJldHVybiBzZWxmLnB2cy52YWx1ZXMoKQorCQllbHNlOgorCQkJcmMgPSBbXQorCQkJZm9yIHMgaW4gcHZfbmFtZToKKwkJCQkjIFRocyB1c2VyIGNvdWxkIGJlIHVzaW5nIGEgc3ltbGluayBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwKKwkJCQkjIGJsb2NrIGRldmljZSwgbWFrZSBzdXJlIHdlIGFyZSB1c2luZyBhY3R1YWwgYmxvY2sgZGV2aWNlIGZpbGUKKwkJCQkjIGlmIHRoZSBwdiBuYW1lIGlzbid0IGluIHRoZSBsb29rdXAKKwkJCQlpZiBzIG5vdCBpbiBzZWxmLnB2X3BhdGhfdG9fdXVpZDoKKwkJCQkJcyA9IG9zLnBhdGgucmVhbHBhdGgocykKKwkJCQlyYy5hcHBlbmQoc2VsZi5wdnNbc2VsZi5wdl9wYXRoX3RvX3V1aWRbc11dKQorCQkJcmV0dXJuIHJjCisKKwlkZWYgZmV0Y2hfdmdzKHNlbGYsIHZnX25hbWUpOgorCQlpZiBub3QgdmdfbmFtZToKKwkJCXJldHVybiBzZWxmLnZncy52YWx1ZXMoKQorCQllbHNlOgorCQkJcmMgPSBbXQorCQkJZm9yIHMgaW4gdmdfbmFtZToKKwkJCQlyYy5hcHBlbmQoc2VsZi52Z3Nbc2VsZi52Z19uYW1lX3RvX3V1aWRbc11dKQorCQkJcmV0dXJuIHJjCisKKwlkZWYgZmV0Y2hfbHZzKHNlbGYsIGx2X25hbWVzKToKKwkJdHJ5OgorCQkJaWYgbm90IGx2X25hbWVzOgorCQkJCXJldHVybiBzZWxmLmx2cy52YWx1ZXMoKQorCQkJZWxzZToKKwkJCQlyYyA9IFtdCisJCQkJZm9yIHMgaW4gbHZfbmFtZXM6CisJCQkJCXJjLmFwcGVuZChzZWxmLmx2c1tzZWxmLmx2X2Z1bGxfbmFtZV90b191dWlkW3NdXSkKKwkJCQlyZXR1cm4gcmMKKwkJZXhjZXB0IEtleUVycm9yIGFzIGtlOgorCQkJbG9nX2Vycm9yKCJLZXkgJXMgbm90IGZvdW5kISIgJSAoc3RyKGx2X25hbWVzKSkpCisJCQlsb2dfZXJyb3IoImx2IG5hbWUgdG8gdXVpZCBsb29rdXAiKQorCQkJZm9yIGtleXMgaW4gc29ydGVkKHNlbGYubHZfZnVsbF9uYW1lX3RvX3V1aWQua2V5cygpKToKKwkJCQlsb2dfZXJyb3IoIiVzIiAlIChrZXlzKSkKKwkJCWxvZ19lcnJvcigibHZzIGVudHJpZXMgYnkgdXVpZCIpCisJCQlmb3Iga2V5cyBpbiBzb3J0ZWQoc2VsZi5sdnMua2V5cygpKToKKwkJCQlsb2dfZXJyb3IoIiVzIiAlIChrZXlzKSkKKwkJCXJhaXNlIGtlCisKKwlkZWYgcHZfcGVfc2VnbWVudHMoc2VsZiwgcHZfdXVpZCk6CisJCXB2ID0gc2VsZi5wdnNbcHZfdXVpZF0KKwkJcmV0dXJuIGxpc3QoemlwKHB2WydwdnNlZ19zdGFydCddLCBwdlsncHZzZWdfc2l6ZSddKSkKKworCWRlZiBwdl9jb250YWluZWRfbHYoc2VsZiwgcHZfZGV2aWNlKToKKwkJcmMgPSBbXQorCQlpZiBwdl9kZXZpY2UgaW4gc2VsZi5wdl9sdnM6CisJCQlyYyA9IHNlbGYucHZfbHZzW3B2X2RldmljZV0KKwkJcmV0dXJuIHJjCisKKwlkZWYgbHZfY29udGFpbmVkX3B2KHNlbGYsIGx2X3V1aWQpOgorCQlyYyA9IFtdCisJCWlmIGx2X3V1aWQgaW4gc2VsZi5sdl9wdnM6CisJCQlyYyA9IHNlbGYubHZfcHZzW2x2X3V1aWRdCisJCXJldHVybiByYworCisJZGVmIGx2c19pbl92ZyhzZWxmLCB2Z191dWlkKToKKwkJIyBSZXR1cm4gYW4gYXJyYXkgb2YKKwkJIyAobHZfbmFtZSwgKGx2X2F0dHIsIGx2X2xheW91dCwgbHZfcm9sZSksIGx2X3V1aWQpCisJCXJjID0gW10KKwkJaWYgdmdfdXVpZCBpbiBzZWxmLmx2c19pbl92Z3M6CisJCQlyYyA9IHNlbGYubHZzX2luX3Znc1t2Z191dWlkXQorCQlyZXR1cm4gcmMKKworCWRlZiBwdnNfaW5fdmcoc2VsZiwgdmdfdXVpZCk6CisJCSMgUmV0dXJucyBhbiBhcnJheSBvZiAocHZfbmFtZSwgcHZfdXVpZCkKKwkJcmMgPSBbXQorCQlpZiB2Z191dWlkIGluIHNlbGYucHZzX2luX3ZnczoKKwkJCXJjID0gc2VsZi5wdnNfaW5fdmdzW3ZnX3V1aWRdCisJCXJldHVybiByYworCisJZGVmIGhpZGRlbl9sdnMoc2VsZiwgbHZfdXVpZCk6CisJCSMgRm9yIGEgc3BlY2lmaWVkIExWLCByZXR1cm4gYSBsaXN0IG9mIGhpZGRlbiBsdl91dWlkLCBsdl9uYW1lCisJCSMgZm9yIGl0CisJCXJjID0gW10KKwkJaWYgbHZfdXVpZCBpbiBzZWxmLmx2c19oaWRkZW46CisJCQlyYyA9IHNlbGYubHZzX2hpZGRlbltsdl91dWlkXQorCQlyZXR1cm4gcmMKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCXBwID0gcHJldHR5cHJpbnQuUHJldHR5UHJpbnRlcihpbmRlbnQ9NCkKKworCXVzZV9qc29uID0gRmFsc2UKKworCWlmIGxlbihzeXMuYXJndikgIT0gMToKKwkJcHJpbnQobGVuKHN5cy5hcmd2KSkKKwkJdXNlX2pzb24gPSBUcnVlCisKKwlkcyA9IERhdGFTdG9yZSh1c2VfanNvbikKKwlkcy5yZWZyZXNoKCkKKworCXByaW50KCJQVlMiKQorCWZvciB2IGluIGRzLnB2cy52YWx1ZXMoKToKKwkJcHAucHByaW50KHYpCisKKwlwcmludCgiVkdTIikKKwlmb3IgdiBpbiBkcy52Z3MudmFsdWVzKCk6CisJCXBwLnBwcmludCh2KQorCisJcHJpbnQoIkxWUyIpCisJZm9yIHYgaW4gZHMubHZzLnZhbHVlcygpOgorCQlwcC5wcHJpbnQodikKKworCXByaW50KCJMVlMgaW4gVkciKQorCWZvciBrLCB2IGluIGRzLmx2c19pbl92Z3MuaXRlbXMoKToKKwkJcHJpbnQoIlZHIHV1aWQgPSAlcyIgJSAoaykpCisJCXBwLnBwcmludCh2KQorCisJcHJpbnQoInB2X2luX2x2cyIpCisJZm9yIGssIHYgaW4gZHMucHZfbHZzLml0ZW1zKCk6CisJCXByaW50KCJQViAlcyBjb250YWlucyBMVlM6IiAlIChrKSkKKwkJcHAucHByaW50KHYpCisKKwlmb3IgaywgdiBpbiBkcy5sdl9wdnMuaXRlbXMoKToKKwkJcHJpbnQoIkxWIGRldmljZSA9ICVzIiAlIChrKSkKKwkJcHAucHByaW50KHYpCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL2x2bWRidXNkIGIvZGFlbW9ucy9sdm1kYnVzZC9sdm1kYnVzZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZWEyNDNiCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9sdm1kYnVzZApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHN5cworaW1wb3J0IGx2bWRidXNkCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisJc3lzLmV4aXQobHZtZGJ1c2QubWFpbigpKQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9tYWluLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGI0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWRidXNkL21haW4ucHkKQEAgLTAsMCArMSwxODIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSAuIGltcG9ydCBjZmcKK2Zyb20gLiBpbXBvcnQgb2JqZWN0bWFuYWdlcgorZnJvbSAuIGltcG9ydCB1dGlscworZnJvbSAuY2ZnIGltcG9ydCBCQVNFX0lOVEVSRkFDRSwgQkFTRV9PQkpfUEFUSCwgTUFOQUdFUl9PQkpfUEFUSAoraW1wb3J0IHRocmVhZGluZworZnJvbSAuIGltcG9ydCBjbWRoYW5kbGVyCitpbXBvcnQgdGltZQoraW1wb3J0IHNpZ25hbAoraW1wb3J0IGRidXMKK2Zyb20gLiBpbXBvcnQgbHZtZGIKKyMgbm9pbnNwZWN0aW9uIFB5VW5yZXNvbHZlZFJlZmVyZW5jZXMKK2Zyb20gZ2kucmVwb3NpdG9yeSBpbXBvcnQgR0xpYgorZnJvbSAuZmV0Y2ggaW1wb3J0IGxvYWQKK2Zyb20gLm1hbmFnZXIgaW1wb3J0IE1hbmFnZXIKK2Zyb20gLmJhY2tncm91bmQgaW1wb3J0IGJhY2tncm91bmRfcmVhcGVyCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgcXVldWUKK2Zyb20gLiBpbXBvcnQgdWRldndhdGNoCitmcm9tIC51dGlscyBpbXBvcnQgbG9nX2RlYnVnCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworZnJvbSAucmVmcmVzaCBpbXBvcnQgaGFuZGxlX2V4dGVybmFsX2V2ZW50LCBldmVudF9jb21wbGV0ZQorCisKK2NsYXNzIEx2bShvYmplY3RtYW5hZ2VyLk9iamVjdE1hbmFnZXIpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfcGF0aCk6CisJCXN1cGVyKEx2bSwgc2VsZikuX19pbml0X18ob2JqZWN0X3BhdGgsIEJBU0VfSU5URVJGQUNFKQorCisKK2RlZiBfZGlzY2FyZF9wZW5kaW5nX3JlZnJlc2hlcygpOgorCSMgV2UganVzdCBoYW5kbGVkIGEgcmVmcmVzaCwgaWYgd2UgaGF2ZSBhbnkgaW4gdGhlIHF1ZXVlIHRoZXkgY2FuIGJlCisJIyByZW1vdmVkIGJlY2F1c2UgYnkgZGVmaW5pdGlvbiB0aGV5IGFyZSBvbGRlciB0aGFuIHRoZSByZWZyZXNoIHdlIGp1c3QgZGlkLgorCSMgQXMgd2UgbGltaXQgdGhlIG51bWJlciBvZiByZWZyZXNoZXMgZ2V0dGluZyBpbnRvIHRoZSBxdWV1ZQorCSMgd2Ugc2hvdWxkIG9ubHkgZXZlciBoYXZlIG9uZSB0byByZW1vdmUuCisJcmVxdWVzdHMgPSBbXQorCXdoaWxlIG5vdCBjZmcud29ya2VyX3EuZW1wdHkoKToKKwkJdHJ5OgorCQkJciA9IGNmZy53b3JrZXJfcS5nZXQoYmxvY2s9RmFsc2UpCisJCQlpZiByLm1ldGhvZCAhPSBoYW5kbGVfZXh0ZXJuYWxfZXZlbnQ6CisJCQkJcmVxdWVzdHMuYXBwZW5kKHIpCisJCQllbHNlOgorCQkJCSMgTWFrZSBzdXJlIHdlIG1ha2UgdGhpcyBldmVudCBjb21wbGV0ZSBldmVuIHRob3VnaCBpdCBkaWRuJ3QKKwkJCQkjIHJ1biwgb3RoZXJ3aXNlIG5vIG90aGVyIGV2ZW50cyB3aWxsIGdldCBwcm9jZXNzZWQKKwkJCQlldmVudF9jb21wbGV0ZSgpCisJCQkJYnJlYWsKKwkJZXhjZXB0IHF1ZXVlLkVtcHR5OgorCQkJYnJlYWsKKworCSMgQW55IHJlcXVlc3RzIHdlIHJlbW92ZWQsIGJ1dCBkaWQgbm90IGRpc2NhcmQgbmVlZCB0byBiZSByZS1xdWV1ZWQKKwlmb3IgciBpbiByZXF1ZXN0czoKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisKK2RlZiBwcm9jZXNzX3JlcXVlc3QoKToKKwl3aGlsZSBjZmcucnVuLnZhbHVlICE9IDA6CisJCXRyeToKKwkJCXJlcSA9IGNmZy53b3JrZXJfcS5nZXQoVHJ1ZSwgNSkKKworCQkJc3RhcnQgPSBjZmcuZGIubnVtX3JlZnJlc2hlcworCisJCQlsb2dfZGVidWcoCisJCQkJIlJ1bm5pbmcgbWV0aG9kOiAlcyB3aXRoIGFyZ3MgJXMiICUKKwkJCQkoc3RyKHJlcS5tZXRob2QpLCBzdHIocmVxLmFyZ3VtZW50cykpKQorCQkJcmVxLnJ1bl9jbWQoKQorCisJCQllbmQgPSBjZmcuZGIubnVtX3JlZnJlc2hlcworCisJCQludW1fcmVmcmVzaGVzID0gZW5kIC0gc3RhcnQKKworCQkJaWYgbnVtX3JlZnJlc2hlcyA+IDA6CisJCQkJX2Rpc2NhcmRfcGVuZGluZ19yZWZyZXNoZXMoKQorCisJCQkJaWYgbnVtX3JlZnJlc2hlcyA+IDE6CisJCQkJCWxvZ19kZWJ1ZygKKwkJCQkJCSJJbnNwZWN0IG1ldGhvZCAlcyBmb3IgdG9vIG1hbnkgcmVmcmVzaGVzIiAlCisJCQkJCQkoc3RyKHJlcS5tZXRob2QpKSkKKwkJCWxvZ19kZWJ1ZygiQ29tcGxldGUgIikKKwkJZXhjZXB0IHF1ZXVlLkVtcHR5OgorCQkJcGFzcworCQlleGNlcHQgRXhjZXB0aW9uOgorCQkJc3QgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisJCQl1dGlscy5sb2dfZXJyb3IoInByb2Nlc3NfcmVxdWVzdCBleGNlcHRpb246IFxuJXMiICUgc3QpCisKKworZGVmIG1haW4oKToKKwkjIEFkZCBzaW1wbGUgY29tbWFuZCBsaW5lIGhhbmRsaW5nCisJcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorCXBhcnNlci5hZGRfYXJndW1lbnQoIi0tdWRldiIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisJCQkJCQloZWxwPSJVc2UgdWRldiBmb3IgdXBkYXRpbmcgc3RhdGUiLCBkZWZhdWx0PUZhbHNlLAorCQkJCQkJZGVzdD0ndXNlX3VkZXYnKQorCXBhcnNlci5hZGRfYXJndW1lbnQoIi0tZGVidWciLCBhY3Rpb249J3N0b3JlX3RydWUnLAorCQkJCQkJaGVscD0iRHVtcCBkZWJ1ZyBtZXNzYWdlcyIsIGRlZmF1bHQ9RmFsc2UsCisJCQkJCQlkZXN0PSdkZWJ1ZycpCisKKwlwYXJzZXIuYWRkX2FyZ3VtZW50KCItLW5vanNvbiIsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorCQkJCQkJaGVscD0iRG8gbm90IHVzZSBMVk0gSlNPTiBvdXRwdXQiLCBkZWZhdWx0PU5vbmUsCisJCQkJCQlkZXN0PSd1c2VfanNvbicpCisKKwl1c2Vfc2Vzc2lvbiA9IG9zLmdldGVudignTFZNREJVU0RfVVNFX1NFU1NJT04nLCBGYWxzZSkKKworCSMgRW5zdXJlIHRoYXQgd2UgZ2V0IGNvbnNpc3RlbnQgb3V0cHV0IGZvciBwYXJzaW5nIHN0ZG91dC9zdGRlcnIKKwlvcy5lbnZpcm9uWyJMQ19BTEwiXSA9ICJDIgorCisJYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworCWNmZy5ERUJVRyA9IGFyZ3MuZGVidWcKKworCSMgTGlzdCBvZiB0aHJlYWRzIHRoYXQgd2Ugc3RhcnQgdXAKKwl0aHJlYWRfbGlzdCA9IFtdCisKKwlzdGFydCA9IHRpbWUudGltZSgpCisKKwkjIEluc3RhbGwgc2lnbmFsIGhhbmRsZXJzCisJZm9yIHMgaW4gW3NpZ25hbC5TSUdIVVAsIHNpZ25hbC5TSUdJTlRdOgorCQl0cnk6CisJCQlzaWduYWwuc2lnbmFsKHMsIHV0aWxzLmhhbmRsZXIpCisJCWV4Y2VwdCBSdW50aW1lRXJyb3I6CisJCQlwYXNzCisKKwlkYnVzLm1haW5sb29wLmdsaWIuREJ1c0dNYWluTG9vcChzZXRfYXNfZGVmYXVsdD1UcnVlKQorCWRidXMubWFpbmxvb3AuZ2xpYi50aHJlYWRzX2luaXQoKQorCisJaWYgdXNlX3Nlc3Npb246CisJCWNmZy5idXMgPSBkYnVzLlNlc3Npb25CdXMoKQorCWVsc2U6CisJCWNmZy5idXMgPSBkYnVzLlN5c3RlbUJ1cygpCisJIyBUaGUgYmFzZSBuYW1lIHZhcmlhYmxlIG5lZWRzIHRvIGV4aXN0IGZvciB0aGluZ3MgdG8gd29yay4KKwkjIG5vaW5zcGVjdGlvbiBQeVVudXNlZExvY2FsCisJYmFzZV9uYW1lID0gZGJ1cy5zZXJ2aWNlLkJ1c05hbWUoQkFTRV9JTlRFUkZBQ0UsIGNmZy5idXMpCisJY2ZnLm9tID0gTHZtKEJBU0VfT0JKX1BBVEgpCisJY2ZnLm9tLnJlZ2lzdGVyX29iamVjdChNYW5hZ2VyKE1BTkFHRVJfT0JKX1BBVEgpKQorCisJY2ZnLmxvYWQgPSBsb2FkCisKKwljZmcuZGIgPSBsdm1kYi5EYXRhU3RvcmUoYXJncy51c2VfanNvbikKKworCSMgU3RhcnQgdXAgdGhyZWFkIHRvIG1vbml0b3IgcHYgbW92ZXMKKwl0aHJlYWRfbGlzdC5hcHBlbmQoCisJCXRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWJhY2tncm91bmRfcmVhcGVyLCBuYW1lPSJwdl9tb3ZlX3JlYXBlciIpKQorCisJIyBVc2luZyBhIHRocmVhZCB0byBwcm9jZXNzIHJlcXVlc3RzLgorCXRocmVhZF9saXN0LmFwcGVuZCh0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1wcm9jZXNzX3JlcXVlc3QpKQorCisJY2ZnLmxvYWQocmVmcmVzaD1GYWxzZSwgZW1pdF9zaWduYWw9RmFsc2UpCisJY2ZnLmxvb3AgPSBHTGliLk1haW5Mb29wKCkKKworCWZvciBwcm9jZXNzIGluIHRocmVhZF9saXN0OgorCQlwcm9jZXNzLmRhbW9uID0gVHJ1ZQorCQlwcm9jZXNzLnN0YXJ0KCkKKworCWVuZCA9IHRpbWUudGltZSgpCisJbG9nX2RlYnVnKAorCQknU2VydmljZSByZWFkeSEgdG90YWwgdGltZT0gJS4yZiwgbHZtIHRpbWU9ICUuMmYgY291bnQ9ICVkJyAlCisJCShlbmQgLSBzdGFydCwgY21kaGFuZGxlci50b3RhbF90aW1lLCBjbWRoYW5kbGVyLnRvdGFsX2NvdW50KSwKKwkJJ2JnX2JsYWNrJywgJ2ZnX2xpZ2h0X2dyZWVuJykKKworCSMgQWRkIHVkZXYgd2F0Y2hpbmcKKwlpZiBhcmdzLnVzZV91ZGV2OgorCQlsb2dfZGVidWcoJ1V0aWxpemluZyB1ZGV2IHRvIHRyaWdnZXIgdXBkYXRlcycpCisJCXVkZXZ3YXRjaC5hZGQoKQorCisJdHJ5OgorCQlpZiBjZmcucnVuLnZhbHVlICE9IDA6CisJCQljZmcubG9vcC5ydW4oKQorCisJCQlpZiBhcmdzLnVzZV91ZGV2OgorCQkJCXVkZXZ3YXRjaC5yZW1vdmUoKQorCisJCQlmb3IgcHJvY2VzcyBpbiB0aHJlYWRfbGlzdDoKKwkJCQlwcm9jZXNzLmpvaW4oKQorCWV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKwkJdXRpbHMuaGFuZGxlcihzaWduYWwuU0lHSU5ULCBOb25lKQorCXJldHVybiAwCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL21hbmFnZXIucHkgYi9kYWVtb25zL2x2bWRidXNkL21hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4OGQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvbWFuYWdlci5weQpAQCAtMCwwICsxLDI0NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitmcm9tIC5hdXRvbWF0ZWRwcm9wZXJ0aWVzIGltcG9ydCBBdXRvbWF0ZWRQcm9wZXJ0aWVzCisKK2Zyb20gLiBpbXBvcnQgdXRpbHMKK2Zyb20gLmNmZyBpbXBvcnQgTUFOQUdFUl9JTlRFUkZBQ0UKK2ltcG9ydCBkYnVzCitmcm9tIC4gaW1wb3J0IGNmZworZnJvbSAuIGltcG9ydCBjbWRoYW5kbGVyCitmcm9tIC5mZXRjaCBpbXBvcnQgbG9hZF9wdnMsIGxvYWRfdmdzCitmcm9tIC5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0RW50cnkKK2Zyb20gLnJlZnJlc2ggaW1wb3J0IGV2ZW50X2FkZAorCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgTWFuYWdlcihBdXRvbWF0ZWRQcm9wZXJ0aWVzKToKKwlfVmVyc2lvbl9tZXRhID0gKCJ0IiwgTUFOQUdFUl9JTlRFUkZBQ0UpCisKKwlkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0X3BhdGgpOgorCQlzdXBlcihNYW5hZ2VyLCBzZWxmKS5fX2luaXRfXyhvYmplY3RfcGF0aCkKKwkJc2VsZi5zZXRfaW50ZXJmYWNlKE1BTkFHRVJfSU5URVJGQUNFKQorCisJQHByb3BlcnR5CisJZGVmIFZlcnNpb24oc2VsZik6CisJCXJldHVybiAnMS4wLjAnCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9wdl9jcmVhdGUoZGV2aWNlLCBjcmVhdGVfb3B0aW9ucyk6CisKKwkJIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGFscmVhZHkgdHJ5aW5nIHRvIGNyZWF0ZSBhIFBWIGZvciBhbiBleGlzdGluZworCQkjIFBWCisJCXB2ID0gY2ZnLm9tLmdldF9vYmplY3RfcGF0aF9ieV91dWlkX2x2bV9pZCgKKwkJCWRldmljZSwgZGV2aWNlLCBOb25lLCBGYWxzZSkKKwkJaWYgcHY6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlNQU5BR0VSX0lOVEVSRkFDRSwgIlBWIEFscmVhZHkgZXhpc3RzISIpCisKKwkJY3JlYXRlZF9wdiA9IFtdCisJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIucHZfY3JlYXRlKGNyZWF0ZV9vcHRpb25zLCBbZGV2aWNlXSkKKwkJaWYgcmMgPT0gMDoKKwkJCXB2cyA9IGxvYWRfcHZzKFtkZXZpY2VdLCBlbWl0X3NpZ25hbD1UcnVlKVswXQorCQkJZm9yIHAgaW4gcHZzOgorCQkJCWNyZWF0ZWRfcHYgPSBwLmRidXNfb2JqZWN0X3BhdGgoKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTUFOQUdFUl9JTlRFUkZBQ0UsCisJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisKKwkJcmV0dXJuIGNyZWF0ZWRfcHYKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBQdkNyZWF0ZShzZWxmLCBkZXZpY2UsIHRtbywgY3JlYXRlX29wdGlvbnMsIGNiLCBjYmUpOgorCQl1dGlscy52YWxpZGF0ZV9kZXZpY2VfcGF0aChNQU5BR0VSX0lOVEVSRkFDRSwgZGV2aWNlKQorCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBNYW5hZ2VyLl9wdl9jcmVhdGUsCisJCQkoZGV2aWNlLCBjcmVhdGVfb3B0aW9ucyksIGNiLCBjYmUpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX2NyZWF0ZV92ZyhuYW1lLCBwdl9vYmplY3RfcGF0aHMsIGNyZWF0ZV9vcHRpb25zKToKKwkJcHZfZGV2aWNlcyA9IFtdCisKKwkJZm9yIHAgaW4gcHZfb2JqZWN0X3BhdGhzOgorCQkJcHYgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKHApCisJCQlpZiBwdjoKKwkJCQlwdl9kZXZpY2VzLmFwcGVuZChwdi5OYW1lKQorCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJTUFOQUdFUl9JTlRFUkZBQ0UsICdvYmplY3QgcGF0aCA9ICVzIG5vdCBmb3VuZCcgJSBwKQorCisJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIudmdfY3JlYXRlKGNyZWF0ZV9vcHRpb25zLCBwdl9kZXZpY2VzLCBuYW1lKQorCQljcmVhdGVkX3ZnID0gIi8iCisKKwkJaWYgcmMgPT0gMDoKKwkJCXZncyA9IGxvYWRfdmdzKFtuYW1lXSwgZW1pdF9zaWduYWw9VHJ1ZSlbMF0KKwkJCWZvciB2IGluIHZnczoKKwkJCQljcmVhdGVkX3ZnID0gdi5kYnVzX29iamVjdF9wYXRoKCkKKworCQkJIyBVcGRhdGUgdGhlIFBWUworCQkJbG9hZF9wdnMocmVmcmVzaD1UcnVlLCBlbWl0X3NpZ25hbD1UcnVlLCBjYWNoZV9yZWZyZXNoPUZhbHNlKQorCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTUFOQUdFUl9JTlRFUkZBQ0UsCisJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCXJldHVybiBjcmVhdGVkX3ZnCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc2FvaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBWZ0NyZWF0ZShzZWxmLCBuYW1lLCBwdl9vYmplY3RfcGF0aHMsIHRtbywgY3JlYXRlX29wdGlvbnMsIGNiLCBjYmUpOgorCQl1dGlscy52YWxpZGF0ZV92Z19uYW1lKE1BTkFHRVJfSU5URVJGQUNFLCBuYW1lKQorCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBNYW5hZ2VyLl9jcmVhdGVfdmcsCisJCQkobmFtZSwgcHZfb2JqZWN0X3BhdGhzLCBjcmVhdGVfb3B0aW9ucywpLAorCQkJY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcmVmcmVzaCgpOgorCQl1dGlscy5sb2dfZGVidWcoJ01hbmFnZXIuUmVmcmVzaCAtIGVudHJ5JykKKworCQkjIFRoaXMgaXMgYSBkaWFnbm9zdGljIGFuZCBzaG91bGQgbm90IGJlIHJ1biBpbiBub3JtYWwgb3BlcmF0aW9uLCBzbworCQkjIGxldHMgcmVtb3ZlIHRoZSBsb2cgZW50cmllcyBmb3IgcmVmcmVzaCBhcyBpdCdzIGltcGxpZWQuCisJCXJjID0gY2ZnLmxvYWQobG9nPUZhbHNlKQorCisJCWlmIHJjICE9IDA6CisJCQl1dGlscy5sb2dfZGVidWcoJ01hbmFnZXIuUmVmcmVzaCAtIGV4aXQgJWQnICUgKHJjKSwKKwkJCQkJCQknYmdfYmxhY2snLCAnZmdfbGlnaHRfcmVkJykKKwkJZWxzZToKKwkJCXV0aWxzLmxvZ19kZWJ1ZygnTWFuYWdlci5SZWZyZXNoIC0gZXhpdCAlZCcgJSAocmMpKQorCQlyZXR1cm4gcmMKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRSwKKwkJb3V0X3NpZ25hdHVyZT0ndCcsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBSZWZyZXNoKHNlbGYsIGNiLCBjYmUpOgorCQkiIiIKKwkJVGFrZSBhbGwgdGhlIG9iamVjdHMgd2Uga25vdyBhYm91dCBhbmQgZ28gb3V0IGFuZCBncmFiIHRoZSBsYXRlc3QKKwkJbW9yZSBvZiBhIHRlc3QgbWV0aG9kIGF0IHRoZSBtb21lbnQgdG8gbWFrZSBzdXJlIHdlIGFyZSBoYW5kbGluZyBvYmplY3QKKwkJcGF0aHMgY29ycmVjdGx5LgorCisJCTpwYXJhbSBjYiAgIENhbGxiYWNrIGZvciByZXN1bHQKKwkJOnBhcmFtIGNiZSAgQ2FsbGJhY2sgZm9yIGVycm9ycworCisJCVJldHVybnMgdGhlIG51bWJlciBvZiBjaGFuZ2VzLCBvYmplY3QgYWRkL3JlbW92ZS9wcm9wZXJ0aWVzIGNoYW5nZWQKKwkJIiIiCisJCXIgPSBSZXF1ZXN0RW50cnkoLTEsIE1hbmFnZXIuX3JlZnJlc2gsICgpLCBjYiwgY2JlLCBGYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPU1BTkFHRVJfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3MnLAorCQlvdXRfc2lnbmF0dXJlPSdvJykKKwlkZWYgTG9va1VwQnlMdm1JZChzZWxmLCBrZXkpOgorCQkiIiIKKwkJR2l2ZW4gYSBsdm0gaWQgaW4gb25lIG9mIHRoZSBmb3JtczoKKworCQkvZGV2L3NkYQorCQlzb21lX3ZnCisJCXNvbWVfdmcvc29tZV9sdgorCQlPZTFyUFgtUGYwVy0xNUU1LW40MU4tWm10Ri1qWFMwLU9zZzhmbgorCisJCXJldHVybiB0aGUgb2JqZWN0IHBhdGggaW4gTygxKSB0aW1lLgorCisJCTpwYXJhbSBrZXk6IFRoZSBsb29rdXAgdmFsdWUKKwkJOnJldHVybjogUmV0dXJuIHRoZSBvYmplY3QgcGF0aC4gIElmIG9iamVjdCBub3QgZm91bmQgeW91IHdpbGwgZ2V0ICcvJworCQkiIiIKKwkJcCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQlrZXksIGtleSwgZ2VuX25ldz1GYWxzZSkKKwkJaWYgcDoKKwkJCXJldHVybiBwCisJCXJldHVybiAnLycKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdiJykKKwlkZWYgVXNlTHZtU2hlbGwoc2VsZiwgeWVzX25vKToKKwkJIiIiCisJCUFsbG93IHRoZSBjbGllbnQgdG8gZW5hYmxlL2Rpc2FibGUgbHZtIHNoZWxsLCB1c2VkIGZvciB0ZXN0aW5nCisJCTpwYXJhbSB5ZXNfbm86CisJCTpyZXR1cm46IE5vdGhpbmcKKwkJIiIiCisJCWNtZGhhbmRsZXIuc2V0X2V4ZWN1dGlvbih5ZXNfbm8pCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0ncycsIG91dF9zaWduYXR1cmU9J2knKQorCWRlZiBFeHRlcm5hbEV2ZW50KHNlbGYsIGNvbW1hbmQpOgorCisJCWV2ZW50X2FkZCgoY29tbWFuZCwpKQorCQlyZXR1cm4gZGJ1cy5JbnQzMigwKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcHZfc2NhbihhY3RpdmF0ZSwgY2FjaGUsIGRldmljZV9wYXRoLCBtYWpvcl9taW5vciwgc2Nhbl9vcHRpb25zKToKKworCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnB2X3NjYW4oCisJCQlhY3RpdmF0ZSwgY2FjaGUsIGRldmljZV9wYXRoLAorCQkJbWFqb3JfbWlub3IsIHNjYW5fb3B0aW9ucykKKworCQlpZiByYyA9PSAwOgorCQkJIyBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgc3RhdGUgcXVpdGUgYSBiaXQsIHNvIGxldHMKKwkJCSMgdXBkYXRlIGV2ZXJ5dGhpbmcgdG8gYmUgc2FmZQorCQkJY2ZnLmxvYWQoKQorCQkJcmV0dXJuICcvJworCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJTUFOQUdFUl9JTlRFUkZBQ0UsCisJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nYmJhc2EoaWkpaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBQdlNjYW4oc2VsZiwgYWN0aXZhdGUsIGNhY2hlLCBkZXZpY2VfcGF0aHMsIG1ham9yX21pbm9ycywKKwkJCXRtbywgc2Nhbl9vcHRpb25zLCBjYiwgY2JlKToKKwkJIiIiCisJCVNjYW4gYWxsIHN1cHBvcnRlZCBMVk0gYmxvY2sgZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGZvciBwaHlzaWNhbCB2b2x1bWVzCisJCU5PVEU6IG1ham9yX21pbm9ycyAmIGRldmljZV9wYXRocyBvbmx5IHVzYWJsZSB3aGVuIGNhY2hlID09IFRydWUKKwkJOnBhcmFtIGFjdGl2YXRlOiBJZiBUcnVlLCBhY3RpdmF0ZSBhbnkgbmV3bHkgZm91bmQgTFZzCisJCTpwYXJhbSBjYWNoZTogICAgSWYgVHJ1ZSwgdXBkYXRlIGx2bWV0YWQKKwkJOnBhcmFtIGRldmljZV9wYXRoczogQXJyYXkgb2YgZGV2aWNlIHBhdGhzIG9yIGVtcHR5CisJCTpwYXJhbSBtYWpvcl9taW5vcnM6IEFycmF5IG9mIHN0cnVjdHVyZXMgKG1ham9yLG1pbm9yKQorCQk6cGFyYW0gdG1vOiBUaW1lb3V0IGZvciBvcGVyYXRpb24KKwkJOnBhcmFtIHNjYW5fb3B0aW9uczogIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBwdnNjYW4KKwkJOnBhcmFtIGNiOiBOb3QgdmlzaWJsZSBpbiBBUEkgKHVzZWQgZm9yIGFzeW5jLiBjYWxsYmFjaykKKwkJOnBhcmFtIGNiZTogTm90IHZpc2libGUgaW4gQVBJICh1c2VkIGZvciBhc3luYy4gZXJyb3IgY2FsbGJhY2spCisJCTpyZXR1cm46ICcvJyBpZiBvcGVyYXRpb24gZG9uZSwgZWxzZSBqb2IgcGF0aAorCQkiIiIKKwkJZm9yIGQgaW4gZGV2aWNlX3BhdGhzOgorCQkJdXRpbHMudmFsaWRhdGVfZGV2aWNlX3BhdGgoTUFOQUdFUl9JTlRFUkZBQ0UsIGQpCisKKwkJciA9IFJlcXVlc3RFbnRyeSgKKwkJCXRtbywgTWFuYWdlci5fcHZfc2NhbiwKKwkJCShhY3RpdmF0ZSwgY2FjaGUsIGRldmljZV9wYXRocywgbWFqb3JfbWlub3JzLAorCQkJc2Nhbl9vcHRpb25zKSwgY2IsIGNiZSwgRmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBwcm9wZXJ0eQorCWRlZiBsdm1faWQoc2VsZik6CisJCSIiIgorCQlJbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzZXMgdGhhdCBpbmhlcml0CisJCSIiIgorCQlyZXR1cm4gc3RyKGlkKHNlbGYpKQorCisJQHByb3BlcnR5CisJZGVmIFV1aWQoc2VsZik6CisJCSIiIgorCQlJbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzZXMgdGhhdCBpbmhlcml0CisJCSIiIgorCQlpbXBvcnQgdXVpZAorCQlyZXR1cm4gdXVpZC51dWlkMSgpCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL29iamVjdG1hbmFnZXIucHkgYi9kYWVtb25zL2x2bWRidXNkL29iamVjdG1hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MDAzZQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2Qvb2JqZWN0bWFuYWdlci5weQpAQCAtMCwwICsxLDMwOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgc3lzCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgZGJ1cworaW1wb3J0IG9zCitmcm9tIC4gaW1wb3J0IGNmZworZnJvbSAudXRpbHMgaW1wb3J0IGxvZ19kZWJ1ZworZnJvbSAuYXV0b21hdGVkcHJvcGVydGllcyBpbXBvcnQgQXV0b21hdGVkUHJvcGVydGllcworCisKKyMgbm9pbnNwZWN0aW9uIFB5UGVwOE5hbWluZworY2xhc3MgT2JqZWN0TWFuYWdlcihBdXRvbWF0ZWRQcm9wZXJ0aWVzKToKKwkiIiIKKwlJbXBsZW1lbnRzIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyIGludGVyZmFjZQorCSIiIgorCisJZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdF9wYXRoLCBpbnRlcmZhY2UpOgorCQlzdXBlcihPYmplY3RNYW5hZ2VyLCBzZWxmKS5fX2luaXRfXyhvYmplY3RfcGF0aCwgaW50ZXJmYWNlKQorCQlzZWxmLnNldF9pbnRlcmZhY2UoaW50ZXJmYWNlKQorCQlzZWxmLl9hcF9vX3BhdGggPSBvYmplY3RfcGF0aAorCQlzZWxmLl9vYmplY3RzID0ge30KKwkJc2VsZi5faWRfdG9fb2JqZWN0X3BhdGggPSB7fQorCQlzZWxmLnJsb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlciIsCisJCW91dF9zaWduYXR1cmU9J2F7b2F7c2F7c3Z9fX0nKQorCWRlZiBHZXRNYW5hZ2VkT2JqZWN0cyhzZWxmKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJcmMgPSB7fQorCQkJdHJ5OgorCQkJCWZvciBrLCB2IGluIGxpc3Qoc2VsZi5fb2JqZWN0cy5pdGVtcygpKToKKwkJCQkJcGF0aCwgcHJvcHMgPSB2WzBdLmVtaXRfZGF0YSgpCisJCQkJCXJjW3BhdGhdID0gcHJvcHMKKwkJCWV4Y2VwdCBFeGNlcHRpb246CisJCQkJdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPXN5cy5zdGRvdXQpCisJCQkJc3lzLmV4aXQoMSkKKwkJCXJldHVybiByYworCisJZGVmIGxvY2tlZChzZWxmKToKKwkJIiIiCisJCUlmIHNvbWUgZXh0ZXJuYWwgY29kZSBuZWVkIHRvIHJ1biBhY3Jvc3MgYSBudW1iZXIgb2YgZGlmZmVyZW50CisJCWNhbGxzIGludG8gT2JqZWN0TWFuYWdlciB3aGlsZSBibG9ja2luZyBvdGhlcnMgdGhleSBjYW4gdXNlIHRoaXMgbWV0aG9kCisJCXRvIGxvY2sgb3RoZXJzIG91dC4KKwkJOnJldHVybjoKKwkJIiIiCisJCXJldHVybiBPYmplY3RNYW5hZ2VyTG9jayhzZWxmLnJsb2NrKQorCisJQGRidXMuc2VydmljZS5zaWduYWwoCisJCWRidXNfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyIiwKKwkJc2lnbmF0dXJlPSdvYXtzYXtzdn19JykKKwlkZWYgSW50ZXJmYWNlc0FkZGVkKHNlbGYsIG9iamVjdF9wYXRoLCBpbnRfbmFtZV9wcm9wX2RpY3QpOgorCQlsb2dfZGVidWcoCisJCQkoJ1NJR05BTDogSW50ZXJmYWNlc0FkZGVkKCVzLCAlcyknICUKKwkJCShzdHIob2JqZWN0X3BhdGgpLCBzdHIoaW50X25hbWVfcHJvcF9kaWN0KSkpKQorCisJQGRidXMuc2VydmljZS5zaWduYWwoCisJCWRidXNfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyIiwKKwkJc2lnbmF0dXJlPSdvYXMnKQorCWRlZiBJbnRlcmZhY2VzUmVtb3ZlZChzZWxmLCBvYmplY3RfcGF0aCwgaW50ZXJmYWNlX2xpc3QpOgorCQlsb2dfZGVidWcoKCdTSUdOQUw6IEludGVyZmFjZXNSZW1vdmVkKCVzLCAlcyknICUKKwkJCShzdHIob2JqZWN0X3BhdGgpLCBzdHIoaW50ZXJmYWNlX2xpc3QpKSkpCisKKwlkZWYgX2xvb2t1cF9hZGQoc2VsZiwgb2JqLCBwYXRoLCBsdm1faWQsIHV1aWQpOgorCQkiIiIKKwkJU3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSBhZGRlZCB0byB0aGUgY2FjaGVzIHNvIHRoYXQgd2UKKwkJY2FuIHJlbW92ZSBpdCBjbGVhbmx5CisJCTpwYXJhbSBvYmo6ICAgICBUaGUgZGJ1cyBvYmplY3Qgd2UgYXJlIHN0b3JpbmcKKwkJOnBhcmFtIGx2bV9pZDogIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBhc3NldAorCQk6cGFyYW0gdXVpZDogICAgVGhlIHV1aWQgZm9yIHRoZSBhc3NldAorCQk6cmV0dXJuOgorCQkiIiIKKwkJIyBOb3RlOiBPbmx5IGNhbGxlZCBpbnRlcm5hbGx5LCBsb2NrIGltcGxpZWQKKworCQkjIFdlIGNvdWxkIGhhdmUgYSB0ZW1wIGVudHJ5IGZyb20gdGhlIGZvcndhcmQgY3JlYXRpb24gb2YgYSBwYXRoCisJCXNlbGYuX2xvb2t1cF9yZW1vdmUocGF0aCkKKworCQlzZWxmLl9vYmplY3RzW3BhdGhdID0gKG9iaiwgbHZtX2lkLCB1dWlkKQorCQlzZWxmLl9pZF90b19vYmplY3RfcGF0aFtsdm1faWRdID0gcGF0aAorCisJCWlmIHV1aWQ6CisJCQlzZWxmLl9pZF90b19vYmplY3RfcGF0aFt1dWlkXSA9IHBhdGgKKworCWRlZiBfbG9va3VwX3JlbW92ZShzZWxmLCBvYmpfcGF0aCk6CisJCSMgTm90ZTogT25seSBjYWxsZWQgaW50ZXJuYWxseSwgbG9jayBpbXBsaWVkCisJCWlmIG9ial9wYXRoIGluIHNlbGYuX29iamVjdHM6CisJCQkob2JqLCBsdm1faWQsIHV1aWQpID0gc2VsZi5fb2JqZWN0c1tvYmpfcGF0aF0KKwkJCWRlbCBzZWxmLl9pZF90b19vYmplY3RfcGF0aFtsdm1faWRdCisJCQlkZWwgc2VsZi5faWRfdG9fb2JqZWN0X3BhdGhbdXVpZF0KKwkJCWRlbCBzZWxmLl9vYmplY3RzW29ial9wYXRoXQorCisJZGVmIGxvb2t1cF91cGRhdGUoc2VsZiwgZGJ1c19vYmosIG5ld191dWlkLCBuZXdfbHZtX2lkKToKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJb2JqX3BhdGggPSBkYnVzX29iai5kYnVzX29iamVjdF9wYXRoKCkKKwkJCXNlbGYuX2xvb2t1cF9yZW1vdmUob2JqX3BhdGgpCisJCQlzZWxmLl9sb29rdXBfYWRkKAorCQkJCWRidXNfb2JqLCBvYmpfcGF0aCwKKwkJCQluZXdfbHZtX2lkLCBuZXdfdXVpZCkKKworCWRlZiBvYmplY3RfcGF0aHNfYnlfdHlwZShzZWxmLCBvX3R5cGUpOgorCQl3aXRoIHNlbGYucmxvY2s6CisJCQlyYyA9IHt9CisKKwkJCWZvciBrLCB2IGluIGxpc3Qoc2VsZi5fb2JqZWN0cy5pdGVtcygpKToKKwkJCQlpZiBpc2luc3RhbmNlKHZbMF0sIG9fdHlwZSk6CisJCQkJCXJjW2tdID0gVHJ1ZQorCQkJcmV0dXJuIHJjCisKKwlkZWYgcmVnaXN0ZXJfb2JqZWN0KHNlbGYsIGRidXNfb2JqZWN0LCBlbWl0X3NpZ25hbD1GYWxzZSk6CisJCSIiIgorCQlHaXZlbiBhIGRidXMgb2JqZWN0IGFkZCBpdCB0byB0aGUgY29sbGVjdGlvbgorCQk6cGFyYW0gZGJ1c19vYmplY3Q6IERidXMgb2JqZWN0IHRvIHJlZ2lzdGVyCisJCTpwYXJhbSBlbWl0X3NpZ25hbDogSWYgdHJ1ZSBlbWl0IGEgc2lnbmFsIGZvciBpbnRlcmZhY2VzIGFkZGVkCisJCSIiIgorCQl3aXRoIHNlbGYucmxvY2s6CisJCQlwYXRoLCBwcm9wcyA9IGRidXNfb2JqZWN0LmVtaXRfZGF0YSgpCisKKwkJCSMgcHJpbnQoJ1JlZ2lzdGVyaW5nIG9iamVjdCBwYXRoICVzIGZvciAlcycgJQorCQkJIwkJKHBhdGgsIGRidXNfb2JqZWN0Lmx2bV9pZCkpCisKKwkJCSMgV2Ugd2FudCBmYXN0IGFjY2VzcyB0byB0aGUgb2JqZWN0IGJ5IGEgbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzCisJCQkjIHNvIHdlIHVzZSBtdWx0aXBsZSBoYXNocyB3aXRoIGRpZmZlcmVudCBrZXlzCisJCQlzZWxmLl9sb29rdXBfYWRkKGRidXNfb2JqZWN0LCBwYXRoLCBkYnVzX29iamVjdC5sdm1faWQsCisJCQkJZGJ1c19vYmplY3QuVXVpZCkKKworCQkJaWYgZW1pdF9zaWduYWw6CisJCQkJc2VsZi5JbnRlcmZhY2VzQWRkZWQocGF0aCwgcHJvcHMpCisKKwlkZWYgcmVtb3ZlX29iamVjdChzZWxmLCBkYnVzX29iamVjdCwgZW1pdF9zaWduYWw9RmFsc2UpOgorCQkiIiIKKwkJR2l2ZW4gYSBkYnVzIG9iamVjdCwgcmVtb3ZlIGl0IGZyb20gdGhlIGNvbGxlY3Rpb24gYW5kIHJlbW92ZSBpdAorCQlmcm9tIHRoZSBkYnVzIGZyYW1ld29yayBhcyB3ZWxsCisJCTpwYXJhbSBkYnVzX29iamVjdDogIERidXMgb2JqZWN0IHRvIHJlbW92ZQorCQk6cGFyYW0gZW1pdF9zaWduYWw6ICBJZiB0cnVlIGVtaXQgdGhlIGludGVyZmFjZXMgcmVtb3ZlZCBzaWduYWwKKwkJIiIiCisJCXdpdGggc2VsZi5ybG9jazoKKwkJCSMgU3RvcmUgb2ZmIHRoZSBvYmplY3QgcGF0aCBhbmQgdGhlIGludGVyZmFjZSBmaXJzdAorCQkJcGF0aCA9IGRidXNfb2JqZWN0LmRidXNfb2JqZWN0X3BhdGgoKQorCQkJaW50ZXJmYWNlcyA9IGRidXNfb2JqZWN0LmludGVyZmFjZSgpCisKKwkJCSMgcHJpbnQgJ1VOLVJlZ2lzdGVyaW5nIG9iamVjdCBwYXRoICVzIGZvciAlcycgJSBcCisJCQkjICAgICAgKHBhdGgsIGRidXNfb2JqZWN0Lmx2bV9pZCkKKworCQkJc2VsZi5fbG9va3VwX3JlbW92ZShwYXRoKQorCisJCQkjIFJlbW92ZSBmcm9tIGRidXMgbGlicmFyeQorCQkJZGJ1c19vYmplY3QucmVtb3ZlX2Zyb21fY29ubmVjdGlvbihjZmcuYnVzLCBwYXRoKQorCisJCQkjIE9wdGlvbmFsbHkgZW1pdCBhIHNpZ25hbAorCQkJaWYgZW1pdF9zaWduYWw6CisJCQkJc2VsZi5JbnRlcmZhY2VzUmVtb3ZlZChwYXRoLCBpbnRlcmZhY2VzKQorCisJZGVmIGdldF9vYmplY3RfYnlfcGF0aChzZWxmLCBwYXRoKToKKwkJIiIiCisJCUdpdmVuIGEgZGJ1cyBwYXRoIHJldHVybiB0aGUgb2JqZWN0IHJlZ2lzdGVyZWQgZm9yIGl0CisJCTpwYXJhbSBwYXRoOiBUaGUgZGJ1cyBwYXRoCisJCTpyZXR1cm46IFRoZSBvYmplY3QKKwkJIiIiCisJCXdpdGggc2VsZi5ybG9jazoKKwkJCWlmIHBhdGggaW4gc2VsZi5fb2JqZWN0czoKKwkJCQlyZXR1cm4gc2VsZi5fb2JqZWN0c1twYXRoXVswXQorCQkJcmV0dXJuIE5vbmUKKworCWRlZiBnZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHNlbGYsIHV1aWQsIGx2bV9pZCk6CisJCXdpdGggc2VsZi5ybG9jazoKKwkJCXJldHVybiBzZWxmLmdldF9vYmplY3RfYnlfcGF0aCgKKwkJCQlzZWxmLmdldF9vYmplY3RfcGF0aF9ieV91dWlkX2x2bV9pZCh1dWlkLCBsdm1faWQsIE5vbmUsIEZhbHNlKSkKKworCWRlZiBnZXRfb2JqZWN0X2J5X2x2bV9pZChzZWxmLCBsdm1faWQpOgorCQkiIiIKKwkJR2l2ZW4gYW4gbHZtIGlkZW50aWZpZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlZ2lzdGVyZWQgZm9yIGl0CisJCTpwYXJhbSBsdm1faWQ6IFRoZSBsdm0gaWRlbnRpZmllcgorCQkiIiIKKwkJd2l0aCBzZWxmLnJsb2NrOgorCQkJaWYgbHZtX2lkIGluIHNlbGYuX2lkX3RvX29iamVjdF9wYXRoOgorCQkJCXJldHVybiBzZWxmLmdldF9vYmplY3RfYnlfcGF0aChzZWxmLl9pZF90b19vYmplY3RfcGF0aFtsdm1faWRdKQorCQkJcmV0dXJuIE5vbmUKKworCWRlZiBnZXRfb2JqZWN0X3BhdGhfYnlfbHZtX2lkKHNlbGYsIGx2bV9pZCk6CisJCSIiIgorCQlHaXZlbiBhbiBsdm0gaWRlbnRpZmllciwgcmV0dXJuIHRoZSBvYmplY3QgcGF0aCBmb3IgaXQKKwkJOnBhcmFtIGx2bV9pZDogVGhlIGx2bSBpZGVudGlmaWVyCisJCTpyZXR1cm46IE9iamVjdCBwYXRoIG9yICcvJyBpZiBub3QgZm91bmQKKwkJIiIiCisJCXdpdGggc2VsZi5ybG9jazoKKwkJCWlmIGx2bV9pZCBpbiBzZWxmLl9pZF90b19vYmplY3RfcGF0aDoKKwkJCQlyZXR1cm4gc2VsZi5faWRfdG9fb2JqZWN0X3BhdGhbbHZtX2lkXQorCQkJcmV0dXJuICcvJworCisJZGVmIF91dWlkX3ZlcmlmeShzZWxmLCBwYXRoLCB1dWlkLCBsdm1faWQpOgorCQkiIiIKKwkJRW5zdXJlIHV1aWQgaXMgcHJlc2VudCBmb3IgYSBzdWNjZXNzZnVsIGx2bV9pZCBsb29rdXAKKwkJTk9URTogSW50ZXJuYWwgY2FsbCwgYXNzdW1lcyB1bmRlciBvYmplY3QgbWFuYWdlciBsb2NrCisJCTpwYXJhbSBwYXRoOiAJCVBhdGggdG8gb2JqZWN0IHdlIGxvb2tlZCB1cAorCQk6cGFyYW0gdXVpZDogCQlsdm0gdXVpZCB0byB2ZXJpZnkKKwkJOnBhcmFtIGx2bV9pZDoJCWx2bV9pZCB1c2VkIHRvIGZpbmQgb2JqZWN0CisJCTpyZXR1cm46IE5vbmUKKwkJIiIiCisJCSMgVGhpcyBnZXRzIGNhbGxlZCB3aGVuIHdlIGZvdW5kIGFuIG9iamVjdCBiYXNlZCBvbiBsdm1faWQsIGVuc3VyZQorCQkjIHV1aWQgaXMgY29ycmVjdCB0b28sIGFzIHRoZXkgY2FuIGNoYW5nZQorCQlpZiBsdm1faWQgIT0gdXVpZDoKKwkJCWlmIHV1aWQgbm90IGluIHNlbGYuX2lkX3RvX29iamVjdF9wYXRoOgorCQkJCW9iaiA9IHNlbGYuZ2V0X29iamVjdF9ieV9wYXRoKHBhdGgpCisJCQkJc2VsZi5fbG9va3VwX2FkZChvYmosIHBhdGgsIGx2bV9pZCwgdXVpZCkKKworCWRlZiBfcmV0dXJuX2xvb2t1cChzZWxmLCB1dWlkLCBsdm1faWRlbnRpZmllcik6CisJCSIiIgorCQlXZSBmb3VuZCBhbiBpZGVudGlmaWVyLCBzbyBsZXRzIHJldHVybiB0aGUgcGF0aCB0byB0aGUgZm91bmQgb2JqZWN0CisJCTpwYXJhbSB1dWlkOglUaGUgbHZtIHV1aWQKKwkJOnBhcmFtIGx2bV9pZGVudGlmaWVyOiBUaGUgbHZtX2lkIHVzZWQgdG8gZmluZCBvYmplY3QKKwkJOnJldHVybjoKKwkJIiIiCisJCXBhdGggPSBzZWxmLl9pZF90b19vYmplY3RfcGF0aFtsdm1faWRlbnRpZmllcl0KKwkJc2VsZi5fdXVpZF92ZXJpZnkocGF0aCwgdXVpZCwgbHZtX2lkZW50aWZpZXIpCisJCXJldHVybiBwYXRoCisKKwlkZWYgZ2V0X29iamVjdF9wYXRoX2J5X3V1aWRfbHZtX2lkKHNlbGYsIHV1aWQsIGx2bV9pZCwgcGF0aF9jcmVhdGU9Tm9uZSwKKwkJCQkJCQkJCQlnZW5fbmV3PVRydWUpOgorCQkiIiIKKwkJRm9yIGEgZ2l2ZW4gbHZtIGFzc2V0IHJldHVybiB0aGUgZGJ1cyBvYmplY3QgcmVnaXN0ZXJlZCB0byBpdC4gIElmIHRoZQorCQlvYmplY3QgaXMgbm90IGZvdW5kIGFuZCBnZW5fbmV3ID09IFRydWUgYW5kIHBhdGhfY3JlYXRlIGlzIGEgdmFsaWQKKwkJZnVuY3Rpb24gd2Ugd2lsbCBjcmVhdGUgYSBuZXcgcGF0aCwgcmVnaXN0ZXIgaXQgYW5kIHJldHVybiBpdC4KKwkJOnBhcmFtIHV1aWQ6IFRoZSB1dWlkIGZvciB0aGUgbHZtIG9iamVjdAorCQk6cGFyYW0gbHZtX2lkOiBUaGUgbHZtIG5hbWUKKwkJOnBhcmFtIHBhdGhfY3JlYXRlOiBJZiB0cnVlIGNyZWF0ZSBhbiBvYmplY3QgcGF0aCBpZiBub3QgZm91bmQKKwkJOnBhcmFtIGdlbl9uZXc6IFRoZSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IHBhdGgKKwkJIiIiCisJCXdpdGggc2VsZi5ybG9jazoKKwkJCWFzc2VydCBsdm1faWQKKwkJCWFzc2VydCB1dWlkCisKKwkJCWlmIGdlbl9uZXc6CisJCQkJYXNzZXJ0IHBhdGhfY3JlYXRlCisKKwkJCXBhdGggPSBOb25lCisKKwkJCWlmIGx2bV9pZCBpbiBzZWxmLl9pZF90b19vYmplY3RfcGF0aDoKKwkJCQlzZWxmLl9yZXR1cm5fbG9va3VwKHV1aWQsIGx2bV9pZCkKKworCQkJaWYgIi8iIGluIGx2bV9pZDoKKwkJCQl2ZywgbHYgPSBsdm1faWQuc3BsaXQoIi8iLCAxKQorCQkJCWludF9sdm1faWQgPSB2ZyArICIvIiArICgiWyVzXSIgJSBsdikKKwkJCQlpZiBpbnRfbHZtX2lkIGluIHNlbGYuX2lkX3RvX29iamVjdF9wYXRoOgorCQkJCQlzZWxmLl9yZXR1cm5fbG9va3VwKHV1aWQsIGludF9sdm1faWQpCisJCQkJZWxpZiBsdm1faWQuc3RhcnRzd2l0aCgnLycpOgorCQkJCQkjIFdlIGNvdWxkIGhhdmUgYSBwdiBkZXZpY2UgcGF0aCBsb29rdXAgdGhhdCBmYWlsZWQsCisJCQkJCSMgbGV0cyB0cnkgY2Fub25pY2FsIGZvcm0gYW5kIHRyeSBhZ2Fpbi4KKwkJCQkJY2Fub25pY2FsID0gb3MucGF0aC5yZWFscGF0aChsdm1faWQpCisJCQkJCWlmIGNhbm9uaWNhbCBpbiBzZWxmLl9pZF90b19vYmplY3RfcGF0aDoKKwkJCQkJCXNlbGYuX3JldHVybl9sb29rdXAodXVpZCwgY2Fub25pY2FsKQorCisJCQlpZiB1dWlkIGFuZCB1dWlkIGluIHNlbGYuX2lkX3RvX29iamVjdF9wYXRoOgorCQkJCSMgSWYgd2UgZ2V0IGhlcmUgaXQgaW5kaWNhdGVzIHRoYXQgd2UgZm91bmQgdGhlIG9iamVjdCwgYnV0CisJCQkJIyB0aGUgbHZtX2lkIGxvb2t1cCBmYWlsZWQuICBJbiB0aGUgY2FzZSBvZiBhIHJlbmFtZSwgdGhlIHV1aWQKKwkJCQkjIHdpbGwgYmUgY29ycmVjdCwgYnV0IHRoZSBsdm1faWQgd2lsbCBiZSB3cm9uZyBhbmQgdmlzZSB2ZXJzYS4KKwkJCQkjIElmIHRoZSBsdm1faWQgZG9lcyBub3QgZXF1YWwgdGhlIHV1aWQsIGxldHMgZml4IHVwIHRoZSB0YWJsZQorCQkJCSMgc28gdGhhdCBsb29rdXBzIHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJCQkJcGF0aCA9IHNlbGYuX2lkX3RvX29iamVjdF9wYXRoW3V1aWRdCisKKwkJCQkjIEluIHNvbWUgY2FzZXMgd2UgYXJlIGxvb2tpbmcgdXAgYnkgb25lIG9yIHRoZSBvdGhlciwgZG9uJ3QKKwkJCQkjIHVwZGF0ZSB3aGVuIHRoZXkgYXJlIHRoZSBzYW1lLgorCQkJCWlmIHV1aWQgIT0gbHZtX2lkOgorCQkJCQlvYmogPSBzZWxmLmdldF9vYmplY3RfYnlfcGF0aChwYXRoKQorCQkJCQlzZWxmLl9sb29rdXBfYWRkKG9iaiwgcGF0aCwgbHZtX2lkLCB1dWlkKQorCQkJZWxzZToKKwkJCQlpZiBnZW5fbmV3OgorCQkJCQlwYXRoID0gcGF0aF9jcmVhdGUoKQorCQkJCQlzZWxmLl9sb29rdXBfYWRkKE5vbmUsIHBhdGgsIGx2bV9pZCwgdXVpZCkKKworCQkJIyBwcHJpbnQoJ2dldF9vYmplY3RfcGF0aF9ieV9sdm1faWQoJXMsICVzLCAlcywgJXM6IHJldHVybiAlcycgJQorCQkJIyAgICAgICAodXVpZCwgbHZtX2lkLCBzdHIocGF0aF9jcmVhdGUpLCBzdHIoZ2VuX25ldyksIHBhdGgpKQorCisJCQlyZXR1cm4gcGF0aAorCisKK2NsYXNzIE9iamVjdE1hbmFnZXJMb2NrKG9iamVjdCk6CisJIiIiCisJVGhlIHNvbGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGFsbG93IG90aGVyIGNvZGUgdGhlIGFiaWxpdHkgdG8KKwlsb2NrIHRoZSBvYmplY3QgbWFuYWdlciB1c2luZyBhIGB3aXRoYCBzdGF0ZW1lbnQsIGVnLgorCisJd2l0aCBjZmcub20ubG9ja2VkKCk6CisJCSMgRG8gc3R1ZmYgd2l0aCBvYmplY3QgbWFuYWdlcgorCisJVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsb2NrIGlzIGFsd2F5cyByZWxlYXNlZCAoYXNzdW1pbmcgdGhpcyBpcyBkb25lCisJY29ycmVjdGx5KQorCSIiIgorCisJZGVmIF9faW5pdF9fKHNlbGYsIHJlY3Vyc2l2ZV9sb2NrKToKKwkJc2VsZi5fbG9jayA9IHJlY3Vyc2l2ZV9sb2NrCisKKwlkZWYgX19lbnRlcl9fKHNlbGYpOgorCQkjIEFjcXVpcmUgbG9jaworCQlzZWxmLl9sb2NrLmFjcXVpcmUoKQorCisJIyBub2luc3BlY3Rpb24gUHlVbnVzZWRMb2NhbAorCWRlZiBfX2V4aXRfXyhzZWxmLCBlX3R5cGUsIGVfdmFsdWUsIGVfdHJhY2ViYWNrKToKKwkJIyBSZWxlYXNlIGxvY2sKKwkJc2VsZi5fbG9jay5yZWxlYXNlKCkKKwkJc2VsZi5fbG9jayA9IE5vbmUKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvcGF0aC5weS5pbiBiL2RhZW1vbnMvbHZtZGJ1c2QvcGF0aC5weS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVmMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9wYXRoLnB5LmluCkBAIC0wLDAgKzEsMTAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworTFZNX0JJTkFSWSA9ICJATFZNX1BBVEhAIgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9wdi5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvcHYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkNzZmMQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvcHYucHkKQEAgLTAsMCArMSwyODIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSAuYXV0b21hdGVkcHJvcGVydGllcyBpbXBvcnQgQXV0b21hdGVkUHJvcGVydGllcworZnJvbSAuIGltcG9ydCB1dGlscworZnJvbSAuIGltcG9ydCBjZmcKK2ltcG9ydCBkYnVzCitmcm9tIC5jZmcgaW1wb3J0IFBWX0lOVEVSRkFDRQorZnJvbSAuIGltcG9ydCBjbWRoYW5kbGVyCitmcm9tIC51dGlscyBpbXBvcnQgdmdfb2JqX3BhdGhfZ2VuZXJhdGUsIG4sIHB2X29ial9wYXRoX2dlbmVyYXRlLCBcCisJbHZfb2JqZWN0X3BhdGhfbWV0aG9kCitmcm9tIC5sb2FkZXIgaW1wb3J0IGNvbW1vbgorZnJvbSAucmVxdWVzdCBpbXBvcnQgUmVxdWVzdEVudHJ5Citmcm9tIC5zdGF0ZSBpbXBvcnQgU3RhdGUKK2Zyb20gLnV0aWxzIGltcG9ydCByb3VuZF9zaXplCisKKworIyBub2luc3BlY3Rpb24gUHlVbnVzZWRMb2NhbAorZGVmIHB2c19zdGF0ZV9yZXRyaWV2ZShzZWxlY3Rpb24sIGNhY2hlX3JlZnJlc2g9VHJ1ZSk6CisJcmMgPSBbXQorCisJaWYgY2FjaGVfcmVmcmVzaDoKKwkJY2ZnLmRiLnJlZnJlc2goKQorCisJZm9yIHAgaW4gY2ZnLmRiLmZldGNoX3B2cyhzZWxlY3Rpb24pOgorCQlyYy5hcHBlbmQoCisJCQlQdlN0YXRlKAorCQkJCXBbInB2X25hbWUiXSwgcFsicHZfdXVpZCJdLCBwWyJwdl9uYW1lIl0sCisJCQkJcFsicHZfZm10Il0sIG4ocFsicHZfc2l6ZSJdKSwgbihwWyJwdl9mcmVlIl0pLAorCQkJCW4ocFsicHZfdXNlZCJdKSwgbihwWyJkZXZfc2l6ZSJdKSwgbihwWyJwdl9tZGFfc2l6ZSJdKSwKKwkJCQluKHBbInB2X21kYV9mcmVlIl0pLCBpbnQocFsicHZfYmFfc3RhcnQiXSksCisJCQkJbihwWyJwdl9iYV9zaXplIl0pLCBuKHBbInBlX3N0YXJ0Il0pLAorCQkJCWludChwWyJwdl9wZV9jb3VudCJdKSwgaW50KHBbInB2X3BlX2FsbG9jX2NvdW50Il0pLAorCQkJCXBbInB2X2F0dHIiXSwgcFsicHZfdGFncyJdLCBwWyJ2Z19uYW1lIl0sIHBbInZnX3V1aWQiXSkpCisJcmV0dXJuIHJjCisKKworZGVmIGxvYWRfcHZzKGRldmljZT1Ob25lLCBvYmplY3RfcGF0aD1Ob25lLCByZWZyZXNoPUZhbHNlLCBlbWl0X3NpZ25hbD1GYWxzZSwKKwkJY2FjaGVfcmVmcmVzaD1UcnVlKToKKwlyZXR1cm4gY29tbW9uKAorCQlwdnNfc3RhdGVfcmV0cmlldmUsIChQdiwpLCBkZXZpY2UsIG9iamVjdF9wYXRoLCByZWZyZXNoLAorCQllbWl0X3NpZ25hbCwgY2FjaGVfcmVmcmVzaCkKKworCisjIG5vaW5zcGVjdGlvbiBQeVVucmVzb2x2ZWRSZWZlcmVuY2VzCitjbGFzcyBQdlN0YXRlKFN0YXRlKToKKwlAcHJvcGVydHkKKwlkZWYgbHZtX2lkKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5sdm1fcGF0aAorCisJZGVmIF9sdl9vYmplY3RfbGlzdChzZWxmLCB2Z19uYW1lKToKKworCQkjIE5vdGUgd2UgYXJlIHJldHVybmluZyAiYShvYSh0dHMpKSIKKworCQlyYyA9IFtdCisJCWlmIHZnX25hbWU6CisJCQlmb3IgbHYgaW4gc29ydGVkKGNmZy5kYi5wdl9jb250YWluZWRfbHYoc2VsZi5sdm1faWQpKToKKwkJCQlsdl91dWlkLCBsdl9uYW1lLCBtZXRhLCBzZWdzID0gbHYKKwkJCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKHZnX25hbWUsIGx2X25hbWUpCisKKwkJCQlwYXRoX2NyZWF0ZSA9IGx2X29iamVjdF9wYXRoX21ldGhvZChsdl9uYW1lLCBtZXRhKQorCQkJCWx2X3BhdGggPSBjZmcub20uZ2V0X29iamVjdF9wYXRoX2J5X3V1aWRfbHZtX2lkKAorCQkJCQlsdl91dWlkLCBmdWxsX25hbWUsIHBhdGhfY3JlYXRlKQorCisJCQkJcmMuYXBwZW5kKChsdl9wYXRoLCBzZWdzKSkKKwkJcmV0dXJuIGRidXMuQXJyYXkocmMsIHNpZ25hdHVyZT0iKG9hKHR0cykpIikKKworCSMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwsUHlQZXA4TmFtaW5nCisJZGVmIF9faW5pdF9fKHNlbGYsIGx2bV9wYXRoLCBVdWlkLCBOYW1lLAorCQkJRm10LCBTaXplQnl0ZXMsIEZyZWVCeXRlcywgVXNlZEJ5dGVzLCBEZXZTaXplQnl0ZXMsCisJCQlNZGFTaXplQnl0ZXMsIE1kYUZyZWVCeXRlcywgQmFTdGFydCwgQmFTaXplQnl0ZXMsCisJCQlQZVN0YXJ0LCBQZUNvdW50LCBQZUFsbG9jQ291bnQsIGF0dHIsIFRhZ3MsIHZnX25hbWUsCisJCQl2Z191dWlkKToKKwkJdXRpbHMuaW5pdF9jbGFzc19mcm9tX2FyZ3VtZW50cyhzZWxmKQorCQlzZWxmLnBlX3NlZ21lbnRzID0gY2ZnLmRiLnB2X3BlX3NlZ21lbnRzKFV1aWQpCisKKwkJc2VsZi5sdiA9IHNlbGYuX2x2X29iamVjdF9saXN0KHZnX25hbWUpCisKKwkJaWYgdmdfbmFtZToKKwkJCXNlbGYudmdfcGF0aCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQkJdmdfdXVpZCwgdmdfbmFtZSwgdmdfb2JqX3BhdGhfZ2VuZXJhdGUpCisJCWVsc2U6CisJCQlzZWxmLnZnX3BhdGggPSAnLycKKworCWRlZiBpZGVudGlmaWVycyhzZWxmKToKKwkJcmV0dXJuIChzZWxmLlV1aWQsIHNlbGYubHZtX3BhdGgpCisKKwlkZWYgY3JlYXRlX2RidXNfb2JqZWN0KHNlbGYsIHBhdGgpOgorCQlpZiBub3QgcGF0aDoKKwkJCXBhdGggPSBjZmcub20uZ2V0X29iamVjdF9wYXRoX2J5X3V1aWRfbHZtX2lkKHNlbGYuVXVpZCwgc2VsZi5OYW1lLAorCQkJCQkJCQkJCQkJCQlwdl9vYmpfcGF0aF9nZW5lcmF0ZSkKKwkJcmV0dXJuIFB2KHBhdGgsIHNlbGYpCisKKwkjIG5vaW5zcGVjdGlvbiBQeU1ldGhvZE1heUJlU3RhdGljCisJZGVmIGNyZWF0aW9uX3NpZ25hdHVyZShzZWxmKToKKwkJcmV0dXJuIChQdiwgcHZfb2JqX3BhdGhfZ2VuZXJhdGUpCisKKworIyBub2luc3BlY3Rpb24gUHlQZXA4TmFtaW5nCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdVdWlkJywgJ3MnKSAgIyBQViBVVUlEL3B2X3V1aWQKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ05hbWUnLCAncycpICAjIFBWL3B2X25hbWUKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ0ZtdCcsICdzJykgICMgRm10L3B2X2ZtdAorQHV0aWxzLmRidXNfcHJvcGVydHkoUFZfSU5URVJGQUNFLCAnU2l6ZUJ5dGVzJywgJ3QnKSAgIyBQU2l6ZS9wdl9zaXplCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdGcmVlQnl0ZXMnLCAndCcpICAjIFBGcmVlL3B2X2ZyZWUKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ1VzZWRCeXRlcycsICd0JykgICMgVXNlZC9wdl91c2VkCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdEZXZTaXplQnl0ZXMnLCAndCcpICAjIERldlNpemUvZGV2X3NpemUKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ01kYVNpemVCeXRlcycsICd0JykgICMgUE1kYVNpemUvcHZfbWRhX3NpemUKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ01kYUZyZWVCeXRlcycsICd0JykgICMgUE1kYUZyZWUvcHZfbWRhX2ZyZWUKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ0JhU3RhcnQnLCAndCcpICAjIEJBIHN0YXJ0L3B2X2JhX3N0YXJ0CitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdCYVNpemVCeXRlcycsICd0JykgICMgQkEgc2l6ZS9wdl9iYV9zaXplCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdQZVN0YXJ0JywgJ3QnKSAgIyAxc3QgUEUvcGVfc3RhcnQKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFBWX0lOVEVSRkFDRSwgJ1BlQ291bnQnLCAndCcpICAjIFBFL3B2X3BlX2NvdW50CitAdXRpbHMuZGJ1c19wcm9wZXJ0eShQVl9JTlRFUkZBQ0UsICdQZUFsbG9jQ291bnQnLCAndCcpICAjIFBFIEFsbG9jYXRpb24gY291bnQKK2NsYXNzIFB2KEF1dG9tYXRlZFByb3BlcnRpZXMpOgorCSMgRm9yIHByb3BlcnRpZXMgdGhhdCB3ZSBuZWVkIGN1c3RvbSBoYW5kbGVycyB3ZSBuZWVkIHRoZXNlLCBvdGhlcndpc2UKKwkjIHdlIHdvbid0IGdldCBvdXIgaW50cm9zcGVjdGlvbiBkYXRhCisJX1RhZ3NfbWV0YSA9ICgiYXMiLCBQVl9JTlRFUkZBQ0UpCisJX1BlU2VnbWVudHNfbWV0YSA9ICgiYSh0dCkiLCBQVl9JTlRFUkZBQ0UpCisJX0V4cG9ydGFibGVfbWV0YSA9ICgiYiIsIFBWX0lOVEVSRkFDRSkKKwlfQWxsb2NhdGFibGVfbWV0YSA9ICgiYiIsIFBWX0lOVEVSRkFDRSkKKwlfTWlzc2luZ19tZXRhID0gKCJiIiwgUFZfSU5URVJGQUNFKQorCV9Mdl9tZXRhID0gKCJhKG9hKHR0cykpIiwgUFZfSU5URVJGQUNFKQorCV9WZ19tZXRhID0gKCJvIiwgUFZfSU5URVJGQUNFKQorCisJIyBub2luc3BlY3Rpb24gUHlVbnVzZWRMb2NhbCxQeVBlcDhOYW1pbmcKKwlkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0X3BhdGgsIHN0YXRlX29iaik6CisJCXN1cGVyKFB2LCBzZWxmKS5fX2luaXRfXyhvYmplY3RfcGF0aCwgcHZzX3N0YXRlX3JldHJpZXZlKQorCQlzZWxmLnNldF9pbnRlcmZhY2UoUFZfSU5URVJGQUNFKQorCQlzZWxmLnN0YXRlID0gc3RhdGVfb2JqCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9yZW1vdmUocHZfdXVpZCwgcHZfbmFtZSwgcmVtb3ZlX29wdGlvbnMpOgorCQkjIFJlbW92ZSB0aGUgUFYsIGlmIHN1Y2Nlc3NmdWwgdGhlbiByZW1vdmUgZnJvbSB0aGUgbW9kZWwKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZChwdl91dWlkLCBwdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIucHZfcmVtb3ZlKHB2X25hbWUsIHJlbW92ZV9vcHRpb25zKQorCQkJaWYgcmMgPT0gMDoKKwkJCQljZmcub20ucmVtb3ZlX29iamVjdChkYm8sIFRydWUpCisJCQllbHNlOgorCQkJCSMgTmVlZCB0byB3b3JrIG9uIGVycm9yIGhhbmRsaW5nLCBuZWVkIGNvbnNpc3RlbnQKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJUFZfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVBWX0lOVEVSRkFDRSwKKwkJCQknUFYgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCShwdl91dWlkLCBwdl9uYW1lKSkKKwkJcmV0dXJuICcvJworCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVBWX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIFJlbW92ZShzZWxmLCB0bW8sIHJlbW92ZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSgKKwkJCXRtbywgUHYuX3JlbW92ZSwKKwkJCShzZWxmLlV1aWQsIHNlbGYubHZtX2lkLCByZW1vdmVfb3B0aW9ucyksCisJCQljYiwgY2JlLCByZXR1cm5fdHVwbGU9RmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3Jlc2l6ZShwdl91dWlkLCBwdl9uYW1lLCBuZXdfc2l6ZV9ieXRlcywgcmVzaXplX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHB2X3V1aWQsIHB2X25hbWUpCisKKwkJaWYgZGJvOgorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci5wdl9yZXNpemUocHZfbmFtZSwgbmV3X3NpemVfYnl0ZXMsCisJCQkJCQkJCQkJCQlyZXNpemVfb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJZGJvLnJlZnJlc2goKQorCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJUFZfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVBWX0lOVEVSRkFDRSwKKwkJCQknUFYgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCShwdl91dWlkLCBwdl9uYW1lKSkKKwkJcmV0dXJuICcvJworCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVBWX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSd0aWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBSZVNpemUoc2VsZiwgbmV3X3NpemVfYnl0ZXMsIHRtbywgcmVzaXplX29wdGlvbnMsIGNiLCBjYmUpOgorCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBQdi5fcmVzaXplLAorCQkJKHNlbGYuVXVpZCwgc2VsZi5sdm1faWQsIHJvdW5kX3NpemUobmV3X3NpemVfYnl0ZXMpLAorCQkJcmVzaXplX29wdGlvbnMpLCBjYiwgY2JlLCBGYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfYWxsb2NhdGlvbl9lbmFibGVkKHB2X3V1aWQsIHB2X25hbWUsIHllc19ubywgYWxsb2NhdGlvbl9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZChwdl91dWlkLCBwdl9uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIucHZfYWxsb2NhdGFibGUoCisJCQkJcHZfbmFtZSwgeWVzX25vLCBhbGxvY2F0aW9uX29wdGlvbnMpCisJCQlpZiByYyA9PSAwOgorCQkJCWNmZy5sb2FkKCkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVBWX0lOVEVSRkFDRSwgJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlQVl9JTlRFUkZBQ0UsCisJCQkJJ1BWIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkocHZfdXVpZCwgcHZfbmFtZSkpCisJCXJldHVybiAnLycKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1QVl9JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nYmlhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgQWxsb2NhdGlvbkVuYWJsZWQoc2VsZiwgeWVzLCB0bW8sIGFsbG9jYXRpb25fb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIFB2Ll9hbGxvY2F0aW9uX2VuYWJsZWQsCisJCQkoc2VsZi5VdWlkLCBzZWxmLmx2bV9pZCwKKwkJCXllcywgYWxsb2NhdGlvbl9vcHRpb25zKSwKKwkJCWNiLCBjYmUsIEZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAcHJvcGVydHkKKwlkZWYgVGFncyhzZWxmKToKKwkJcmV0dXJuIHV0aWxzLnBhcnNlX3RhZ3Moc2VsZi5zdGF0ZS5UYWdzKQorCisJQHByb3BlcnR5CisJZGVmIFBlU2VnbWVudHMoc2VsZik6CisJCWlmIGxlbihzZWxmLnN0YXRlLnBlX3NlZ21lbnRzKToKKwkJCXJldHVybiBzZWxmLnN0YXRlLnBlX3NlZ21lbnRzCisJCXJldHVybiBkYnVzLkFycmF5KFtdLCAnKHR0KScpCisKKwlAcHJvcGVydHkKKwlkZWYgRXhwb3J0YWJsZShzZWxmKToKKwkJaWYgc2VsZi5zdGF0ZS5hdHRyWzFdID09ICd4JzoKKwkJCXJldHVybiBUcnVlCisJCXJldHVybiBGYWxzZQorCisJQHByb3BlcnR5CisJZGVmIEFsbG9jYXRhYmxlKHNlbGYpOgorCQlpZiBzZWxmLnN0YXRlLmF0dHJbMF0gPT0gJ2EnOgorCQkJcmV0dXJuIFRydWUKKwkJcmV0dXJuIEZhbHNlCisKKwlAcHJvcGVydHkKKwlkZWYgTWlzc2luZyhzZWxmKToKKwkJaWYgc2VsZi5zdGF0ZS5hdHRyWzJdID09ICdtJzoKKwkJCXJldHVybiBUcnVlCisJCXJldHVybiBGYWxzZQorCisJZGVmIG9iamVjdF9wYXRoKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fb2JqZWN0X3BhdGgKKworCUBwcm9wZXJ0eQorCWRlZiBsdm1faWQoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLmx2bV9pZAorCisJQHByb3BlcnR5CisJZGVmIGlkZW50aWZpZXJzKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5zdGF0ZS5pZGVudGlmaWVycygpCisKKwlAcHJvcGVydHkKKwlkZWYgTHYoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLmx2CisKKwlAcHJvcGVydHkKKwlkZWYgVmcoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLnZnX3BhdGgKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvcmVmcmVzaC5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvcmVmcmVzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjlhZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9yZWZyZXNoLnB5CkBAIC0wLDAgKzEsNDUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBUcnkgYW5kIG1pbmltaXplIHRoZSByZWZyZXNoZXMgd2UgZG8uCisKK2ltcG9ydCB0aHJlYWRpbmcKK2Zyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RFbnRyeQorZnJvbSAuIGltcG9ydCBjZmcKK2Zyb20gLiBpbXBvcnQgdXRpbHMKKworX3Jsb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKK19jb3VudCA9IDAKKworCitkZWYgaGFuZGxlX2V4dGVybmFsX2V2ZW50KGNvbW1hbmQpOgorCXV0aWxzLmxvZ19kZWJ1ZygiRXh0ZXJuYWwgZXZlbnQ6ICclcyciICUgY29tbWFuZCkKKwlldmVudF9jb21wbGV0ZSgpCisJY2ZnLmxvYWQoKQorCisKK2RlZiBldmVudF9hZGQocGFyYW1zKToKKwlnbG9iYWwgX3Jsb2NrCisJZ2xvYmFsIF9jb3VudAorCXdpdGggX3Jsb2NrOgorCQlpZiBfY291bnQgPT0gMDoKKwkJCV9jb3VudCArPSAxCisJCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJCS0xLCBoYW5kbGVfZXh0ZXJuYWxfZXZlbnQsCisJCQkJcGFyYW1zLCBOb25lLCBOb25lLCBGYWxzZSkKKwkJCWNmZy53b3JrZXJfcS5wdXQocikKKworCitkZWYgZXZlbnRfY29tcGxldGUoKToKKwlnbG9iYWwgX3Jsb2NrCisJZ2xvYmFsIF9jb3VudAorCXdpdGggX3Jsb2NrOgorCQlpZiBfY291bnQgPiAwOgorCQkJX2NvdW50IC09IDEKKwkJcmV0dXJuIF9jb3VudApkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC9yZXF1ZXN0LnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9yZXF1ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmE2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWRidXNkL3JlcXVlc3QucHkKQEAgLTAsMCArMSwxNTEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHRocmVhZGluZworIyBub2luc3BlY3Rpb24gUHlVbnJlc29sdmVkUmVmZXJlbmNlcworZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHTGliCitmcm9tIC5qb2IgaW1wb3J0IEpvYgorZnJvbSAuIGltcG9ydCBjZmcKK2ltcG9ydCB0cmFjZWJhY2sKK2Zyb20gLnV0aWxzIGltcG9ydCBsb2dfZXJyb3IKKworCitjbGFzcyBSZXF1ZXN0RW50cnkob2JqZWN0KToKKwlkZWYgX19pbml0X18oc2VsZiwgdG1vLCBtZXRob2QsIGFyZ3VtZW50cywgY2IsIGNiX2Vycm9yLAorCQkJcmV0dXJuX3R1cGxlPVRydWUsIGpvYl9zdGF0ZT1Ob25lKToKKwkJc2VsZi50bW8gPSB0bW8KKwkJc2VsZi5tZXRob2QgPSBtZXRob2QKKwkJc2VsZi5hcmd1bWVudHMgPSBhcmd1bWVudHMKKwkJc2VsZi5jYiA9IGNiCisJCXNlbGYuY2JfZXJyb3IgPSBjYl9lcnJvcgorCisJCXNlbGYudGltZXJfaWQgPSAtMQorCQlzZWxmLmxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorCQlzZWxmLmRvbmUgPSBGYWxzZQorCQlzZWxmLl9yZXN1bHQgPSBOb25lCisJCXNlbGYuX2pvYiA9IE5vbmUKKwkJc2VsZi5fcmMgPSAwCisJCXNlbGYuX3JjX2Vycm9yID0gTm9uZQorCQlzZWxmLl9yZXR1cm5fdHVwbGUgPSByZXR1cm5fdHVwbGUKKwkJc2VsZi5fam9iX3N0YXRlID0gam9iX3N0YXRlCisKKwkJaWYgc2VsZi50bW8gPCAwOgorCQkJIyBDbGllbnQgaXMgd2lsbGluZyB0byBibG9jayBmb3JldmVyCisJCQlwYXNzCisJCWVsaWYgdG1vID09IDA6CisJCQlzZWxmLl9yZXR1cm5fam9iKCkKKwkJZWxzZToKKwkJCXNlbGYudGltZXJfaWQgPSBHTGliLnRpbWVvdXRfYWRkX3NlY29uZHMoCisJCQkJdG1vLCBSZXF1ZXN0RW50cnkuX3JlcXVlc3RfdGltZW91dCwgc2VsZikKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3JlcXVlc3RfdGltZW91dChyKToKKwkJIiIiCisJCU1ldGhvZCB3aGljaCBnZXRzIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBydW5zIG91dCEKKwkJOnBhcmFtIHI6ICBSZXF1ZXN0RW50cnkgd2hpY2ggdGltZWQgb3V0CisJCTpyZXR1cm46IE5vdGhpbmcKKwkJIiIiCisJCXIudGltZXJfZXhwaXJlZCgpCisKKwlkZWYgX3JldHVybl9qb2Ioc2VsZik6CisJCXNlbGYuX2pvYiA9IEpvYihzZWxmLCBzZWxmLl9qb2Jfc3RhdGUpCisJCWNmZy5vbS5yZWdpc3Rlcl9vYmplY3Qoc2VsZi5fam9iLCBUcnVlKQorCQlpZiBzZWxmLl9yZXR1cm5fdHVwbGU6CisJCQlzZWxmLmNiKCgnLycsIHNlbGYuX2pvYi5kYnVzX29iamVjdF9wYXRoKCkpKQorCQllbHNlOgorCQkJc2VsZi5jYihzZWxmLl9qb2IuZGJ1c19vYmplY3RfcGF0aCgpKQorCisJZGVmIHJ1bl9jbWQoc2VsZik6CisJCXRyeToKKwkJCXJlc3VsdCA9IHNlbGYubWV0aG9kKCpzZWxmLmFyZ3VtZW50cykKKwkJCXNlbGYucmVnaXN0ZXJfcmVzdWx0KHJlc3VsdCkKKwkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorCQkJIyBVc2UgdGhlIHJlcXVlc3QgZW50cnkgdG8gcmV0dXJuIHRoZSByZXN1bHQgYXMgdGhlIGNsaWVudCBtYXkKKwkJCSMgaGF2ZSBnb3R0ZW4gYSBqb2IgYnkgdGhlIHRpbWUgd2UgaGl0IGFuIGVycm9yCisJCQkjIExldHMgZ2V0IHRoZSBzdGFja3RyYWNlIGFuZCBzZXQgdGhhdCB0byB0aGUgZXJyb3IgbWVzc2FnZQorCQkJc3QgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisJCQljZmcuYmxhY2tib3guZHVtcCgpCisJCQlsb2dfZXJyb3IoIkV4Y2VwdGlvbiByZXR1cm5lZCB0byBjbGllbnQ6IFxuJXMiICUgc3QpCisJCQlzZWxmLnJlZ2lzdGVyX2Vycm9yKC0xLCBzdHIoZSksIGUpCisKKwlkZWYgaXNfZG9uZShzZWxmKToKKwkJd2l0aCBzZWxmLmxvY2s6CisJCQlyYyA9IHNlbGYuZG9uZQorCQlyZXR1cm4gcmMKKworCWRlZiBnZXRfZXJyb3JzKHNlbGYpOgorCQl3aXRoIHNlbGYubG9jazoKKwkJCXJldHVybiAoc2VsZi5fcmMsIHNlbGYuX3JjX2Vycm9yKQorCisJZGVmIHJlc3VsdChzZWxmKToKKwkJd2l0aCBzZWxmLmxvY2s6CisJCQlpZiBzZWxmLmRvbmU6CisJCQkJcmV0dXJuIHNlbGYuX3Jlc3VsdAorCQkJcmV0dXJuICcvJworCisJZGVmIF9yZWdfZW5kaW5nKHNlbGYsIHJlc3VsdCwgZXJyb3JfcmM9MCwgZXJyb3JfbXNnPU5vbmUsCisJCQkJCWVycm9yX2V4Y2VwdGlvbj1Ob25lKToKKwkJd2l0aCBzZWxmLmxvY2s6CisJCQlzZWxmLmRvbmUgPSBUcnVlCisJCQlpZiBzZWxmLnRpbWVyX2lkICE9IC0xOgorCQkJCSMgVHJ5IHRvIHByZXZlbnQgdGhlIHRpbWVyIGZyb20gZmlyaW5nCisJCQkJR0xpYi5zb3VyY2VfcmVtb3ZlKHNlbGYudGltZXJfaWQpCisKKwkJCXNlbGYuX3Jlc3VsdCA9IHJlc3VsdAorCQkJc2VsZi5fcmMgPSBlcnJvcl9yYworCQkJc2VsZi5fcmNfZXJyb3IgPSBlcnJvcl9tc2cKKworCQkJaWYgbm90IHNlbGYuX2pvYjoKKwkJCQkjIFdlIGZpbmlzaGVkIGFuZCB0aGVyZSBpcyBubyBqb2IsIHNvIHJldHVybiByZXN1bHQgb3IgZXJyb3IKKwkJCQkjIG5vdyEKKwkJCQkjIE5vdGU6IElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBjYiBvciBjYmUsIHRoaXMgaW5kaWNhdGVzIGEKKwkJCQkjIHJlcXVlc3QgdGhhdCBkb2Vzbid0IG5lZWQgYSByZXNwb25zZSBhcyB3ZSBhbHJlYWR5IHJldHVybmVkCisJCQkJIyBvbmUgYmVmb3JlIHRoZSByZXF1ZXN0IHdhcyBwcm9jZXNzZWQuCisJCQkJaWYgZXJyb3JfcmMgPT0gMDoKKwkJCQkJaWYgc2VsZi5jYjoKKwkJCQkJCWlmIHNlbGYuX3JldHVybl90dXBsZToKKwkJCQkJCQlzZWxmLmNiKChyZXN1bHQsICcvJykpCisJCQkJCQllbHNlOgorCQkJCQkJCXNlbGYuY2IocmVzdWx0KQorCQkJCWVsc2U6CisJCQkJCWlmIHNlbGYuY2JfZXJyb3I6CisJCQkJCQlpZiBub3QgZXJyb3JfZXhjZXB0aW9uOgorCQkJCQkJCWlmIG5vdCBlcnJvcl9tc2c6CisJCQkJCQkJCWVycm9yX2V4Y2VwdGlvbiA9IEV4Y2VwdGlvbigKKwkJCQkJCQkJCSJBbiBlcnJvciBvY2N1cnJlZCwgYnV0IG5vIHJlYXNvbiB3YXMgIgorCQkJCQkJCQkJImdpdmVuLCBzZWUgc2VydmljZSBsb2dzISIpCisJCQkJCQkJZWxzZToKKwkJCQkJCQkJZXJyb3JfZXhjZXB0aW9uID0gRXhjZXB0aW9uKGVycm9yX21zZykKKworCQkJCQkJc2VsZi5jYl9lcnJvcihlcnJvcl9leGNlcHRpb24pCisJCQllbHNlOgorCQkJCSMgV2UgaGF2ZSBhIGpvYiBhbmQgaXQncyBjb21wbGV0ZSwgaW5kaWNhdGUgdGhhdCBpdCdzIGRvbmUuCisJCQkJIyBUT0RPOiBXZSBuZWVkIHRvIHNpZ25hbCB0aGUgam9iIGlzIGRvbmUgdG9vLgorCQkJCXNlbGYuX2pvYi5Db21wbGV0ZSA9IFRydWUKKwkJCQlzZWxmLl9qb2IgPSBOb25lCisKKwlkZWYgcmVnaXN0ZXJfZXJyb3Ioc2VsZiwgZXJyb3JfcmMsIGVycm9yX21lc3NhZ2UsIGVycm9yX2V4Y2VwdGlvbik6CisJCXNlbGYuX3JlZ19lbmRpbmcoTm9uZSwgZXJyb3JfcmMsIGVycm9yX21lc3NhZ2UsIGVycm9yX2V4Y2VwdGlvbikKKworCWRlZiByZWdpc3Rlcl9yZXN1bHQoc2VsZiwgcmVzdWx0KToKKwkJc2VsZi5fcmVnX2VuZGluZyhyZXN1bHQpCisKKwlkZWYgdGltZXJfZXhwaXJlZChzZWxmKToKKwkJd2l0aCBzZWxmLmxvY2s6CisJCQkjIFNldCB0aGUgdGltZXIgYmFjayB0byAtMSBhcyB3ZSB3aWxsIGdldCBhIHdhcm5pbmcgaWYgd2UgdHJ5CisJCQkjIHRvIHJlbW92ZSBhIHRpbWVyIHRoYXQgZG9lc24ndCBleGlzdAorCQkJc2VsZi50aW1lcl9pZCA9IC0xCisJCQlpZiBub3Qgc2VsZi5kb25lOgorCQkJCSMgQ3JlYXRlIGRidXMgam9iIG9iamVjdCBhbmQgcmV0dXJuIHBhdGggdG8gY2FsbGVyCisJCQkJc2VsZi5fcmV0dXJuX2pvYigpCisJCQllbHNlOgorCQkJCSMgVGhlIGpvYiBpcyBkb25lLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8KKwkJCQlwYXNzCisKKwkJcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWRidXNkL3N0YXRlLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC9zdGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmM1OTAxCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1kYnVzZC9zdGF0ZS5weQpAQCAtMCwwICsxLDI3IEBACisjIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2Zyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdG1ldGhvZAorCisKK2NsYXNzIFN0YXRlKG9iamVjdCwgbWV0YWNsYXNzPUFCQ01ldGEpOgorCUBhYnN0cmFjdG1ldGhvZAorCWRlZiBsdm1faWQoc2VsZik6CisJCXBhc3MKKworCUBhYnN0cmFjdG1ldGhvZAorCWRlZiBpZGVudGlmaWVycyhzZWxmKToKKwkJcGFzcworCisJQGFic3RyYWN0bWV0aG9kCisJZGVmIGNyZWF0ZV9kYnVzX29iamVjdChzZWxmLCBwYXRoKToKKwkJcGFzcworCisJZGVmIF9fc3RyX18oc2VsZik6CisJCXJldHVybiAnKioqKipcbicgKyBzdHIoc2VsZi5fX2RpY3RfXykgKyAnXG4qKioqKipcbicKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZGJ1c2QvdWRldndhdGNoLnB5IGIvZGFlbW9ucy9sdm1kYnVzZC91ZGV2d2F0Y2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNmU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvdWRldndhdGNoLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHB5dWRldgorZnJvbSAucmVmcmVzaCBpbXBvcnQgZXZlbnRfYWRkCitmcm9tIC4gaW1wb3J0IGNmZworCitvYnNlcnZlciA9IE5vbmUKKworCisjIG5vaW5zcGVjdGlvbiBQeVVudXNlZExvY2FsCitkZWYgZmlsdGVyX2V2ZW50KGFjdGlvbiwgZGV2aWNlKToKKwkjIEZpbHRlciBmb3IgZXZlbnRzIG9mIGludGVyZXN0IGFuZCBhZGQgYSByZXF1ZXN0IG9iamVjdCB0byBiZSBwcm9jZXNzZWQKKwkjIHdoZW4gYXBwcm9wcmlhdGUuCisJcmVmcmVzaCA9IEZhbHNlCisKKwlpZiAnLklEX0ZTX1RZUEVfTkVXJyBpbiBkZXZpY2U6CisJCWZzX3R5cGVfbmV3ID0gZGV2aWNlWycuSURfRlNfVFlQRV9ORVcnXQorCisJCWlmICdMVk0nIGluIGZzX3R5cGVfbmV3OgorCQkJcmVmcmVzaCA9IFRydWUKKwkJZWxpZiBmc190eXBlX25ldyA9PSAnJzoKKwkJCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2Ugd2FzIG9uZSB3ZSBrbmV3IGFib3V0CisJCQlpZiAnREVWTkFNRScgaW4gZGV2aWNlOgorCQkJCWZvdW5kID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfbHZtX2lkKGRldmljZVsnREVWTkFNRSddKQorCQkJCWlmIGZvdW5kOgorCQkJCQlyZWZyZXNoID0gVHJ1ZQorCisJaWYgJ0RNX0xWX05BTUUnIGluIGRldmljZToKKwkJcmVmcmVzaCA9IFRydWUKKworCWlmIHJlZnJlc2g6CisJCWV2ZW50X2FkZCgoJ3VkZXYnLCkpCisKKworZGVmIGFkZCgpOgorCWdsb2JhbCBvYnNlcnZlcgorCWNvbnRleHQgPSBweXVkZXYuQ29udGV4dCgpCisJbW9uaXRvciA9IHB5dWRldi5Nb25pdG9yLmZyb21fbmV0bGluayhjb250ZXh0KQorCW1vbml0b3IuZmlsdGVyX2J5KCdibG9jaycpCisJb2JzZXJ2ZXIgPSBweXVkZXYuTW9uaXRvck9ic2VydmVyKG1vbml0b3IsIGZpbHRlcl9ldmVudCkKKwlvYnNlcnZlci5zdGFydCgpCisKKworZGVmIHJlbW92ZSgpOgorCWdsb2JhbCBvYnNlcnZlcgorCW9ic2VydmVyLnN0b3AoKQorCW9ic2VydmVyID0gTm9uZQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC91dGlscy5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjYjM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvdXRpbHMucHkKQEAgLTAsMCArMSw0ODQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFdAoraW1wb3J0IHN5cworaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBjdHlwZXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworCitpbXBvcnQgZGJ1cworaW1wb3J0IGRidXMuc2VydmljZQoraW1wb3J0IGRidXMubWFpbmxvb3AuZ2xpYgorCit0cnk6CisJZnJvbSAuIGltcG9ydCBjZmcKK2V4Y2VwdCBTeXN0ZW1FcnJvcjoKKwlpbXBvcnQgY2ZnCisKK1NURE9VVF9UVFkgPSBvcy5pc2F0dHkoc3lzLnN0ZG91dC5maWxlbm8oKSkKKworCitkZWYgcnR5cGUoZGJ1c190eXBlKToKKwkiIiIKKwlEZWNvcmF0b3IgbWFraW5nIHN1cmUgdGhhdCB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBvZgorCXNwZWNpZmllZCB0eXBlLgorCTpwYXJhbSBkYnVzX3R5cGU6IFRoZSBzcGVjaWZpYyBkYnVzIHR5cGUgdG8gcmV0dXJuIHZhbHVlIGFzCisJIiIiCisKKwlkZWYgZGVjb3JhdG9yKGZuKToKKwkJZGVmIGRlY29yYXRlZCgqYXJncywgKiprd2FyZ3MpOgorCQkJcmV0dXJuIGRidXNfdHlwZShmbigqYXJncywgKiprd2FyZ3MpKQorCisJCXJldHVybiBkZWNvcmF0ZWQKKworCXJldHVybiBkZWNvcmF0b3IKKworCisjIEZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyLCBoYW5kbGUgdGhlIGNvcm5lciBjYXNlcyB3aGVuIHBhcnNpbmcKK0BydHlwZShkYnVzLlVJbnQ2NCkKK2RlZiBuKHYpOgorCWlmIG5vdCB2OgorCQlyZXR1cm4gMAorCXJldHVybiBpbnQoZmxvYXQodikpCisKKworQHJ0eXBlKGRidXMuVUludDMyKQorZGVmIG4zMih2KToKKwlpZiBub3QgdjoKKwkJcmV0dXJuIDAKKwlyZXR1cm4gaW50KGZsb2F0KHYpKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5UHJvdGVjdGVkTWVtYmVyCitkZWYgaW5pdF9jbGFzc19mcm9tX2FyZ3VtZW50cyhvYmpfaW5zdGFuY2UpOgorCWZvciBrLCB2IGluIGxpc3Qoc3lzLl9nZXRmcmFtZSgxKS5mX2xvY2Fscy5pdGVtcygpKToKKwkJaWYgayAhPSAnc2VsZic6CisJCQludCA9IGsKKworCQkJIyBJZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgaGFzIGEgdmFsdWUsIGJ1dCB0aGUgaW5jb21pbmcgZG9lcworCQkJIyBub3QsIGRvbid0IG92ZXJ3cml0ZSBpdC4gIE90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgb24gdGhlCisJCQkjIHByb3BlcnR5IGRlY29yYXRvciBkb24ndCB3b3JrIGFzIGV4cGVjdGVkLgorCQkJY3VyID0gZ2V0YXR0cihvYmpfaW5zdGFuY2UsIG50LCB2KQorCisJCQkjIHByaW50ICdJbml0IGNsYXNzICVzID0gJXMnICUgKG50LCBzdHIodikpCisJCQlpZiBub3QgKGN1ciBhbmQgbGVuKHN0cihjdXIpKSBhbmQgKHYgaXMgTm9uZSBvciBsZW4oc3RyKHYpKSkgPT0gMCk6CisJCQkJc2V0YXR0cihvYmpfaW5zdGFuY2UsIG50LCB2KQorCisKK2RlZiBnZXRfcHJvcGVydGllcyhmKToKKwkiIiIKKwlXYWxrcyB0aHJvdWdoIGFuIG9iamVjdCBpbnN0YW5jZSBvciBpdCdzIHBhcmVudCBjbGFzcyhlcykgYW5kIGRldGVybWluZXMKKwl3aGljaCBhdHRyaWJ1dGVzIGFyZSBwcm9wZXJ0aWVzIGFuZCBpZiB0aGV5IHdlcmUgY3JlYXRlZCB0byBiZSB1c2VkIGZvcgorCWRidXMuCisJOnBhcmFtIGY6ICAgT2JqZWN0IHRvIGluc3BlY3QKKwk6cmV0dXJuOiAgICBBIGRpY3Rpb25hcnkgb2YgdHVwbGVzIHdpdGggZWFjaCB0dXBsZSBiZWluZzoKKwkJCQkwID0gQW4gYXJyYXkgb2YgZGljdHMgd2l0aCB0aGUga2V5cyBiZWluZzogcF90LCBwX25hbWUsCisJCQkJcF9hY2Nlc3ModHlwZSwgbmFtZSwgYWNjZXNzKQorCQkJCTEgPSBIYXNoIG9mIHByb3BlcnR5IG5hbWVzIGFuZCBjdXJyZW50IHZhbHVlCisJIiIiCisJaW50ZXJmYWNlcyA9IGRpY3QoKQorCisJZm9yIGMgaW4gaW5zcGVjdC5nZXRtcm8oZi5fX2NsYXNzX18pOgorCisJCWggPSB2YXJzKGMpCisJCWZvciBwLCB2YWx1ZSBpbiBoLml0ZW1zKCk6CisJCQlpZiBpc2luc3RhbmNlKHZhbHVlLCBwcm9wZXJ0eSk6CisJCQkJIyBXZSBmb3VuZCBhIHByb3BlcnR5LCBzZWUgaWYgaXQgaGFzIGEgbWV0YWRhdGEgdHlwZQorCQkJCWtleSA9IGF0dHJpYnV0ZV90eXBlX25hbWUocCkKKwkJCQlpZiBrZXkgaW4gaDoKKwkJCQkJaW50ZXJmYWNlID0gaFtrZXldWzFdCisKKwkJCQkJaWYgaW50ZXJmYWNlIG5vdCBpbiBpbnRlcmZhY2VzOgorCQkJCQkJaW50ZXJmYWNlc1tpbnRlcmZhY2VdID0gKFtdLCB7fSkKKworCQkJCQlhY2Nlc3MgPSAnJworCQkJCQlpZiBnZXRhdHRyKGYuX19jbGFzc19fLCBwKS5mZ2V0OgorCQkJCQkJYWNjZXNzICs9ICdyZWFkJworCQkJCQlpZiBnZXRhdHRyKGYuX19jbGFzc19fLCBwKS5mc2V0OgorCQkJCQkJYWNjZXNzICs9ICd3cml0ZScKKworCQkJCQlpbnRlcmZhY2VzW2ludGVyZmFjZV1bMF0uYXBwZW5kKAorCQkJCQkJZGljdCgKKwkJCQkJCQlwX3Q9Z2V0YXR0cihmLCBrZXkpWzBdLAorCQkJCQkJCXBfbmFtZT1wLAorCQkJCQkJCXBfYWNjZXNzPWFjY2VzcykpCisKKwkJCQkJaW50ZXJmYWNlc1tpbnRlcmZhY2VdWzFdW3BdID0gZ2V0YXR0cihmLCBwKQorCisJcmV0dXJuIGludGVyZmFjZXMKKworCitkZWYgZ2V0X29iamVjdF9wcm9wZXJ0eV9kaWZmKG9fcHJvcCwgbl9wcm9wKToKKwkiIiIKKwlXYWxrIHRocm91Z2ggZWFjaCBvYmplY3QgcHJvcGVydGllcyBhbmQgcmVwb3J0IHdoYXQgaGFzIGNoYW5nZWQgYW5kIHdpdGgKKwl0aGUgbmV3IHZhbHVlcworCTpwYXJhbSBvX3Byb3A6ICAgT2xkIGtleXMvdmFsdWVzCisJOnBhcmFtIG5fcHJvcDogICBOZXcga2V5cy92YWx1ZXMKKwk6cmV0dXJuOiBoYXNoIG9mIHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQgYW5kIHRoZWlyIG5ldyB2YWx1ZQorCSIiIgorCXJjID0ge30KKworCWZvciBpbnRmX2ssIGludGZfdiBpbiBvX3Byb3AuaXRlbXMoKToKKwkJZm9yIGssIHYgaW4gbGlzdChpbnRmX3ZbMV0uaXRlbXMoKSk6CisJCQkjIHByaW50KCdDb21wYXJpbmcgJXM6JXMgdG8gJXM6JXMnICUKKwkJCSMgICAgICAoaywgb19wcm9wW2ludGZfa11bMV1ba10sIGssIHN0cihuX3Byb3BbaW50Zl9rXVsxXVtrXSkpKQorCQkJaWYgb19wcm9wW2ludGZfa11bMV1ba10gIT0gbl9wcm9wW2ludGZfa11bMV1ba106CisJCQkJbmV3X3ZhbHVlID0gbl9wcm9wW2ludGZfa11bMV1ba10KKworCQkJCWlmIGludGZfayBub3QgaW4gcmM6CisJCQkJCXJjW2ludGZfa10gPSBkaWN0KCkKKworCQkJCXJjW2ludGZfa11ba10gPSBuZXdfdmFsdWUKKwlyZXR1cm4gcmMKKworCitkZWYgYWRkX3Byb3BlcnRpZXMoeG1sLCBpbnRlcmZhY2UsIHByb3BzKToKKwkiIiIKKwlHaXZlbiB4bWwgdGhhdCBkZXNjcmliZXMgdGhlIGludGVyZmFjZSwgYWRkIHByb3BlcnR5IHZhbHVlcyB0byB0aGUgWE1MCisJZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgorCTpwYXJhbSB4bWw6ICAgICAgICAgWE1MIHRvIGVkaXQKKwk6cGFyYW0gaW50ZXJmYWNlOiAgIEludGVyZmFjZSB0byBhZGQgdGhlIHByb3BlcnRpZXMgdG9vCisJOnBhcmFtIHByb3BzOiAgICAgICBPdXRwdXQgZnJvbSBnZXRfcHJvcGVydGllcworCTpyZXR1cm46IHVwZGF0ZWQgWE1MIHN0cmluZworCSIiIgorCXJvb3QgPSBFdC5mcm9tc3RyaW5nKHhtbCkKKworCWlmIHByb3BzOgorCisJCWZvciBjIGluIHJvb3Q6CisJCQkjIHByaW50IGMuYXR0cmliWyduYW1lJ10KKwkJCWlmIGMuYXR0cmliWyduYW1lJ10gPT0gaW50ZXJmYWNlOgorCQkJCWZvciBwIGluIHByb3BzOgorCQkJCQl0ZW1wID0gJzxwcm9wZXJ0eSB0eXBlPSIlcyIgbmFtZT0iJXMiIGFjY2Vzcz0iJXMiLz5cbicgJSBcCisJCQkJCQkocFsncF90J10sIHBbJ3BfbmFtZSddLCBwWydwX2FjY2VzcyddKQorCQkJCQljLmFwcGVuZChFdC5mcm9tc3RyaW5nKHRlbXApKQorCisJCXJldHVybiBFdC50b3N0cmluZyhyb290LCBlbmNvZGluZz0ndXRmOCcpCisJcmV0dXJuIHhtbAorCisKK2RlZiBhdHRyaWJ1dGVfdHlwZV9uYW1lKG5hbWUpOgorCSIiIgorCUdpdmVuIHRoZSBwcm9wZXJ0eSBuYW1lLCByZXR1cm4gc3RyaW5nIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZQorCTpwYXJhbSBuYW1lOgorCTpyZXR1cm46CisJIiIiCisJcmV0dXJuICJfJXNfbWV0YSIgJSBuYW1lCisKKworX3R5cGVfbWFwID0gZGljdCgKKwlzPWRidXMuU3RyaW5nLAorCW89ZGJ1cy5PYmplY3RQYXRoLAorCXQ9ZGJ1cy5VSW50NjQsCisJeD1kYnVzLkludDY0LAorCXU9ZGJ1cy5VSW50MzIsCisJaT1kYnVzLkludDMyLAorCW49ZGJ1cy5JbnQxNiwKKwlxPWRidXMuVUludDE2LAorCWQ9ZGJ1cy5Eb3VibGUsCisJeT1kYnVzLkJ5dGUsCisJYj1kYnVzLkJvb2xlYW4pCisKKworZGVmIF9wYXNzX3Rocm91Z2godik6CisJIiIiCisJSWYgd2UgaGF2ZSBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgc2ltcGxlIHR5cGUgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbAorCXZhbHVlIHVuLXdyYXBwZWQuCisJOnBhcmFtIHY6CisJOnJldHVybjoKKwkiIiIKKwlyZXR1cm4gdgorCisKK2RlZiBfZGJ1c190eXBlKHQsIHZhbHVlKToKKwlyZXR1cm4gX3R5cGVfbWFwLmdldCh0LCBfcGFzc190aHJvdWdoKSh2YWx1ZSkKKworCitkZWYgZGJ1c19wcm9wZXJ0eShpbnRlcmZhY2VfbmFtZSwgbmFtZSwgZGJ1c190eXBlLCBkb2M9Tm9uZSk6CisJIiIiCisJQ3JlYXRlcyB0aGUgZ2V0L3NldCBwcm9wZXJ0aWVzIGZvciB0aGUgZ2l2ZW4gbmFtZS4gIEl0IGFzc3VtZXMgdGhhdCB0aGUKKwlhY3R1YWwgYXR0cmlidXRlIGlzICdfJyArIG5hbWUgYW5kIHRoZSBhdHRyaWJ1dGUgbWV0YWRhdGEgaXMgc3R1ZmZlZCBpbgorCV9uYW1lX3R5cGUuCisKKwlUaGVyZSBpcyBwcm9iYWJseSBhIGJldHRlciB3YXkgdG9kbyB0aGlzLgorCTpwYXJhbSBpbnRlcmZhY2VfbmFtZTogIERidXMgaW50ZXJmYWNlIHRoaXMgcHJvcGVydHkgaXMgYXNzb2NpYXRlZCB3aXRoCisJOnBhcmFtIG5hbWU6ICAgICAgICAgICAgTmFtZSBvZiBwcm9wZXJ0eQorCTpwYXJhbSBkYnVzX3R5cGU6ICAgICAgIGRidXMgc3RyaW5nIHR5cGUgZWcuIHMsdCxpLHgKKwk6cGFyYW0gZG9jOiAgICAgICAgICAgICBQeXRob24gX19kb2NfXyBmb3IgdGhlIHByb3BlcnR5CisJOnJldHVybjoKKwkiIiIKKwlhdHRyaWJ1dGVfbmFtZSA9ICdfJyArIG5hbWUKKworCWRlZiBnZXR0ZXIoc2VsZik6CisJCXQgPSBnZXRhdHRyKHNlbGYsIGF0dHJpYnV0ZV9uYW1lICsgJ19tZXRhJylbMF0KKwkJcmV0dXJuIF9kYnVzX3R5cGUodCwgZ2V0YXR0cihzZWxmLnN0YXRlLCBhdHRyaWJ1dGVfbmFtZVsxOl0pKQorCisJcHJvcCA9IHByb3BlcnR5KGdldHRlciwgTm9uZSwgTm9uZSwgZG9jKQorCisJZGVmIGRlY29yYXRvcihjbHMpOgorCQlzZXRhdHRyKGNscywgYXR0cmlidXRlX25hbWUgKyAnX21ldGEnLCAoZGJ1c190eXBlLCBpbnRlcmZhY2VfbmFtZSkpCisJCXNldGF0dHIoY2xzLCBuYW1lLCBwcm9wKQorCQlyZXR1cm4gY2xzCisKKwlyZXR1cm4gZGVjb3JhdG9yCisKKworZGVmIHBhcnNlX3RhZ3ModGFncyk6CisJaWYgbGVuKHRhZ3MpOgorCQlpZiAnLCcgaW4gdGFnczoKKwkJCXJldHVybiB0YWdzLnNwbGl0KCcsJykKKwkJcmV0dXJuIHNvcnRlZChbdGFnc10pCisJcmV0dXJuIGRidXMuQXJyYXkoW10sIHNpZ25hdHVyZT0ncycpCisKKworZGVmIF9jb21tb25fbG9nKG1zZywgKmF0dHJpYnV0ZXMpOgorCWNmZy5zdGRvdXRfbG9jay5hY3F1aXJlKCkKKwl0aWQgPSBjdHlwZXMuQ0RMTCgnbGliYy5zby42Jykuc3lzY2FsbCgxODYpCisKKwltc2cgPSAiJWQ6JWQgLSAlcyIgJSAob3MuZ2V0cGlkKCksIHRpZCwgbXNnKQorCisJaWYgU1RET1VUX1RUWSBhbmQgYXR0cmlidXRlczoKKwkJcHJpbnQoY29sb3IobXNnLCAqYXR0cmlidXRlcykpCisJZWxzZToKKwkJcHJpbnQobXNnKQorCisJY2ZnLnN0ZG91dF9sb2NrLnJlbGVhc2UoKQorCXN5cy5zdGRvdXQuZmx1c2goKQorCisKKyMgU2VyaWFsaXplcyBhY2Nlc3MgdG8gc3Rkb3V0IHRvIHByZXZlbnQgaW50ZXJsZWF2ZWQgb3V0cHV0CisjIEBwYXJhbSBtc2cgICAgTWVzc2FnZSB0byBvdXRwdXQgdG8gc3Rkb3V0CisjIEByZXR1cm4gTm9uZQorZGVmIGxvZ19kZWJ1Zyhtc2csICphdHRyaWJ1dGVzKToKKwlpZiBjZmcuREVCVUc6CisJCV9jb21tb25fbG9nKG1zZywgKmF0dHJpYnV0ZXMpCisKKworZGVmIGxvZ19lcnJvcihtc2csICphdHRyaWJ1dGVzKToKKwlfY29tbW9uX2xvZyhtc2csICphdHRyaWJ1dGVzKQorCisKKyMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwKK2RlZiBoYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorCWNmZy5ydW4udmFsdWUgPSAwCisJbG9nX2RlYnVnKCdTaWduYWwgaGFuZGxlciBjYWxsZWQgd2l0aCBzaWduYWwgJWQnICUgc2lnbnVtKQorCWlmIGNmZy5sb29wIGlzIG5vdCBOb25lOgorCQljZmcubG9vcC5xdWl0KCkKKworCitkZWYgcHZfb2JqX3BhdGhfZ2VuZXJhdGUoKToKKwlyZXR1cm4gY2ZnLlBWX09CSl9QQVRIICsgIi8lZCIgJSBuZXh0KGNmZy5wdl9pZCkKKworCitkZWYgdmdfb2JqX3BhdGhfZ2VuZXJhdGUoKToKKwlyZXR1cm4gY2ZnLlZHX09CSl9QQVRIICsgIi8lZCIgJSBuZXh0KGNmZy52Z19pZCkKKworCitkZWYgbHZfb2JqZWN0X3BhdGhfbWV0aG9kKG5hbWUsIG1ldGEpOgorCWlmIG5hbWVbMF0gPT0gJ1snOgorCQlyZXR1cm4gX2hpZGRlbl9sdl9vYmpfcGF0aF9nZW5lcmF0ZQorCWVsaWYgbWV0YVswXVswXSA9PSAndCc6CisJCXJldHVybiBfdGhpbl9wb29sX29ial9wYXRoX2dlbmVyYXRlCisJZWxpZiBtZXRhWzBdWzBdID09ICdDJyBhbmQgJ3Bvb2wnIGluIG1ldGFbMV06CisJCXJldHVybiBfY2FjaGVfcG9vbF9vYmpfcGF0aF9nZW5lcmF0ZQorCisJcmV0dXJuIF9sdl9vYmpfcGF0aF9nZW5lcmF0ZQorCisKKyMgTm90ZTogTm9uZSBvZiB0aGUgaW5kaXZpZHVhbCBMViBwYXRoIGdlbmVyYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkCisjIGRpcmVjdGx5LCB0aGV5IHNob3VsZCBvbmx5IGJlIGRpc3BhdGNoZWQgdGhyb3VnaCBsdl9vYmplY3RfcGF0aF9tZXRob2QKKworZGVmIF9sdl9vYmpfcGF0aF9nZW5lcmF0ZSgpOgorCXJldHVybiBjZmcuTFZfT0JKX1BBVEggKyAiLyVkIiAlIG5leHQoY2ZnLmx2X2lkKQorCisKK2RlZiBfdGhpbl9wb29sX29ial9wYXRoX2dlbmVyYXRlKCk6CisJcmV0dXJuIGNmZy5USElOX1BPT0xfUEFUSCArICIvJWQiICUgbmV4dChjZmcudGhpbl9pZCkKKworCitkZWYgX2NhY2hlX3Bvb2xfb2JqX3BhdGhfZ2VuZXJhdGUoKToKKwlyZXR1cm4gY2ZnLkNBQ0hFX1BPT0xfUEFUSCArICIvJWQiICUgbmV4dChjZmcuY2FjaGVfcG9vbF9pZCkKKworCitkZWYgX2hpZGRlbl9sdl9vYmpfcGF0aF9nZW5lcmF0ZSgpOgorCXJldHVybiBjZmcuSElEREVOX0xWX1BBVEggKyAiLyVkIiAlIG5leHQoY2ZnLmhpZGRlbl9sdikKKworCitkZWYgam9iX29ial9wYXRoX2dlbmVyYXRlKCk6CisJcmV0dXJuIGNmZy5KT0JfT0JKX1BBVEggKyAiLyVkIiAlIG5leHQoY2ZnLmpvYl9pZCkKKworCitkZWYgY29sb3IodGV4dCwgKnVzZXJfc3R5bGVzKToKKwlzdHlsZXMgPSB7CisJCSMgc3R5bGVzCisJCSdyZXNldCc6ICdcMDMzWzBtJywKKwkJJ2JvbGQnOiAnXDAzM1swMW0nLAorCQknZGlzYWJsZWQnOiAnXDAzM1swMm0nLAorCQkndW5kZXJsaW5lJzogJ1wwMzNbMDRtJywKKwkJJ3JldmVyc2UnOiAnXDAzM1swN20nLAorCQknc3RyaWtlX3Rocm91Z2gnOiAnXDAzM1swOW0nLAorCQknaW52aXNpYmxlJzogJ1wwMzNbMDhtJywKKwkJIyB0ZXh0IGNvbG9ycworCQknZmdfYmxhY2snOiAnXDAzM1szMG0nLAorCQknZmdfcmVkJzogJ1wwMzNbMzFtJywKKwkJJ2ZnX2dyZWVuJzogJ1wwMzNbMzJtJywKKwkJJ2ZnX29yYW5nZSc6ICdcMDMzWzMzbScsCisJCSdmZ19ibHVlJzogJ1wwMzNbMzRtJywKKwkJJ2ZnX3B1cnBsZSc6ICdcMDMzWzM1bScsCisJCSdmZ19jeWFuJzogJ1wwMzNbMzZtJywKKwkJJ2ZnX2xpZ2h0X2dyZXknOiAnXDAzM1szN20nLAorCQknZmdfZGFya19ncmV5JzogJ1wwMzNbOTBtJywKKwkJJ2ZnX2xpZ2h0X3JlZCc6ICdcMDMzWzkxbScsCisJCSdmZ19saWdodF9ncmVlbic6ICdcMDMzWzkybScsCisJCSdmZ195ZWxsb3cnOiAnXDAzM1s5M20nLAorCQknZmdfbGlnaHRfYmx1ZSc6ICdcMDMzWzk0bScsCisJCSdmZ19waW5rJzogJ1wwMzNbOTVtJywKKwkJJ2ZnX2xpZ2h0X2N5YW4nOiAnXDAzM1s5Nm0nLAorCQkjIGJhY2tncm91bmQgY29sb3JzCisJCSdiZ19ibGFjayc6ICdcMDMzWzQwbScsCisJCSdiZ19yZWQnOiAnXDAzM1s0MW0nLAorCQknYmdfZ3JlZW4nOiAnXDAzM1s0Mm0nLAorCQknYmdfb3JhbmdlJzogJ1wwMzNbNDNtJywKKwkJJ2JnX2JsdWUnOiAnXDAzM1s0NG0nLAorCQknYmdfcHVycGxlJzogJ1wwMzNbNDVtJywKKwkJJ2JnX2N5YW4nOiAnXDAzM1s0Nm0nLAorCQknYmdfbGlnaHRfZ3JleSc6ICdcMDMzWzQ3bScKKwl9CisKKwljb2xvcl90ZXh0ID0gJycKKwlmb3Igc3R5bGUgaW4gdXNlcl9zdHlsZXM6CisJCXRyeToKKwkJCWNvbG9yX3RleHQgKz0gc3R5bGVzW3N0eWxlXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlyZXR1cm4gJ2RlZiBjb2xvcjogcGFyYW1ldGVyIHt9IGRvZXMgbm90IGV4aXN0Jy5mb3JtYXQoc3R5bGUpCisJY29sb3JfdGV4dCArPSB0ZXh0CisJcmV0dXJuICdcMDMzWzBtezB9XDAzM1swbScuZm9ybWF0KGNvbG9yX3RleHQpCisKKworZGVmIHB2X3JhbmdlX2FwcGVuZChjbWQsIGRldmljZSwgc3RhcnQsIGVuZCk6CisJaWYgKHN0YXJ0LCBlbmQpID09ICgwLCAwKToKKwkJY21kLmFwcGVuZChkZXZpY2UpCisJZWxzZToKKwkJaWYgc3RhcnQgIT0gMCBhbmQgZW5kID09IDA6CisJCQljbWQuYXBwZW5kKCIlczolZC0iICUgKGRldmljZSwgc3RhcnQpKQorCQllbHNlOgorCQkJY21kLmFwcGVuZCgKKwkJCQkiJXM6JWQtJWQiICUKKwkJCQkoZGV2aWNlLCBzdGFydCwgZW5kKSkKKworCitkZWYgcHZfZGVzdF9yYW5nZXMoY21kLCBwdl9kZXN0X3JhbmdlX2xpc3QpOgorCWlmIGxlbihwdl9kZXN0X3JhbmdlX2xpc3QpOgorCQlmb3IgaSBpbiBwdl9kZXN0X3JhbmdlX2xpc3Q6CisJCQlwdl9yYW5nZV9hcHBlbmQoY21kLCAqaSkKKworCitkZWYgcm91bmRfc2l6ZShzaXplX2J5dGVzKToKKwlicyA9IDUxMgorCXJlbWFpbmRlciA9IHNpemVfYnl0ZXMgJSBicworCWlmIG5vdCByZW1haW5kZXI6CisJCXJldHVybiBzaXplX2J5dGVzCisJcmV0dXJuIHNpemVfYnl0ZXMgKyBicyAtIHJlbWFpbmRlcgorCisKK19BTExPV0FCTEVfQ0ggPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnIystLjo9QF9cLyUnCitfQUxMT1dBQkxFX0NIX1NFVCA9IHNldChfQUxMT1dBQkxFX0NIKQorCitfQUxMT1dBQkxFX1ZHX0xWX0NIID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgJy4tXysnCitfQUxMT1dBQkxFX1ZHX0xWX0NIX1NFVCA9IHNldChfQUxMT1dBQkxFX1ZHX0xWX0NIKQorX0xWX05BTUVfUkVTRVJWRUQgPSAoIl9jZGF0YSIsICJfY21ldGEiLCAiX2NvcmlnIiwgIl9taW1hZ2UiLCAiX21sb2ciLAorCSJfcG1zcGFyZSIsICJfcmltYWdlIiwgIl9ybWV0YSIsICJfdGRhdGEiLCAiX3RtZXRhIiwgIl92b3JpZ2luIikKKworIyBUYWdzIGNhbiBoYXZlIHRoZSBjaGFyYWN0ZXJzLCBiYXNlZCBvbiB0aGUgY29kZQorIyBhLXpBLVowLTkuXy0rLz0hOiYjCitfQUxMT1dBQkxFX1RBR19DSCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICIuXy0rLz0hOiYjIgorX0FMTE9XQUJMRV9UQUdfQ0hfU0VUID0gc2V0KF9BTExPV0FCTEVfVEFHX0NIKQorCisKK2RlZiBfYWxsb3dhYmxlX3RhZyh0YWdfbmFtZSk6CisJIyBMVk0gc2hvdWxkIGltcG9zZSBhIGxlbmd0aCByZXN0cmljdGlvbgorCXJldHVybiBzZXQodGFnX25hbWUpIDw9IF9BTExPV0FCTEVfVEFHX0NIX1NFVAorCisKK2RlZiBfYWxsb3dhYmxlX3ZnX25hbWUodmdfbmFtZSk6CisJaWYgdmdfbmFtZSBpcyBOb25lOgorCQlyYWlzZSBWYWx1ZUVycm9yKCJWRyBuYW1lIGlzIE5vbmUgb3IgZW1wdHkiKQorCisJdmdfbGVuID0gbGVuKHZnX25hbWUpCisJaWYgdmdfbGVuID09IDAgb3IgdmdfbGVuID4gMTI3OgorCQlyYWlzZSBWYWx1ZUVycm9yKCJWRyBuYW1lICglcykgbGVuZ3RoICglZCkgbm90IGluIHRoZSBkb21haW4gMS4uMTI3IiAlCisJCQkodmdfbmFtZSwgdmdfbGVuKSkKKworCWlmIG5vdCBzZXQodmdfbmFtZSkgPD0gX0FMTE9XQUJMRV9WR19MVl9DSF9TRVQ6CisJCXJhaXNlIFZhbHVlRXJyb3IoIlZHIG5hbWUgKCVzKSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciwgIgorCQkJImFsbG93YWJsZSBzZXQoJXMpIiAlICh2Z19uYW1lLCBfQUxMT1dBQkxFX1ZHX0xWX0NIKSkKKworCWlmIHZnX25hbWUgPT0gIi4iIG9yIHZnX25hbWUgPT0gIi4uIjoKKwkJcmFpc2UgVmFsdWVFcnJvcignVkcgbmFtZSAoJXMpIGNhbm5vdCBiZSAiLiIgb3IgIi4uIicgJSAodmdfbmFtZSkpCisKKworZGVmIF9hbGxvd2FibGVfbHZfbmFtZSh2Z19uYW1lLCBsdl9uYW1lKToKKworCWlmIGx2X25hbWUgaXMgTm9uZToKKwkJcmFpc2UgVmFsdWVFcnJvcigiTFYgbmFtZSBpcyBOb25lIG9yIGVtcHR5IikKKworCWx2X2xlbiA9IGxlbihsdl9uYW1lKQorCisJIyBUaGlzIGxlbmd0aCBpcyBkZXJpdmVkIGZyb20gZW1waXJpY2FsIHRlc3RpbmcKKwlpZiBsdl9sZW4gPT0gMCBvciAobGVuKHZnX25hbWUpICsgbHZfbGVuKSA+IDEyNToKKwkJcmFpc2UgVmFsdWVFcnJvcigiTFYgbmFtZSAoJXMpIGxlbmd0aCAoJWQpICsgVkcgbmFtZSBsZW5ndGggIgorCQkJIm5vdCBpbiB0aGUgZG9tYWluIDEuLjEyNSIgJSAobHZfbmFtZSwgbHZfbGVuKSkKKworCWlmIG5vdCBzZXQobHZfbmFtZSkgPD0gX0FMTE9XQUJMRV9WR19MVl9DSF9TRVQ6CisJCXJhaXNlIFZhbHVlRXJyb3IoIkxWIG5hbWUgKCVzKSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciwgIgorCQkJImFsbG93YWJsZSAoJXMpIiAlIChsdl9uYW1lLCBfQUxMT1dBQkxFX1ZHX0xWX0NIKSkKKworCWlmIGFueSh4IGluIGx2X25hbWUgZm9yIHggaW4gX0xWX05BTUVfUkVTRVJWRUQpOgorCQlyYWlzZSBWYWx1ZUVycm9yKCJMViBuYW1lICglcykgY29udGFpbnMgYSByZXNlcnZlZCB3b3JkLCAiCisJCQkicmVzZXJ2ZWQgc2V0KCVzKSIgJSAobHZfbmFtZSwgc3RyKF9MVl9OQU1FX1JFU0VSVkVEKSkpCisKKwlpZiBsdl9uYW1lLnN0YXJ0c3dpdGgoInNuYXBzaG90Iikgb3IgbHZfbmFtZS5zdGFydHN3aXRoKCJwdm1vdmUiKToKKwkJcmFpc2UgVmFsdWVFcnJvcigiTFYgbmFtZSAoJXMpIHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgd29yZCwgIgorCQkJInJlc2VydmVkIHNldCglcykiICUgKGx2X25hbWUsIHN0cihbInNuYXBzaG90IiwgInB2bW92ZSJdKSkpCisKKwlpZiBsdl9uYW1lWzBdID09ICctJzoKKwkJcmFpc2UgVmFsdWVFcnJvcigiTFYgbmFtZSAoJXMpIGNhbm5vdCBzdGFydCB3aXRoIGEgJy0nICIKKwkJCQkiY2hhcmFjdGVyIiAlIGx2X25hbWUpCisKKworZGVmIHZhbGlkYXRlX2RldmljZV9wYXRoKGludGVyZmFjZSwgZGV2aWNlKToKKwlpZiBub3Qgc2V0KGRldmljZSkgPD0gX0FMTE9XQUJMRV9DSF9TRVQ6CisJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJaW50ZXJmYWNlLCAnRGV2aWNlIHBhdGggKCVzKSBoYXMgaW52YWxpZCBjaGFyYWN0ZXJzLCAnCisJCQknYWxsb3dhYmxlICglcyknICUgKGRldmljZSwgX0FMTE9XQUJMRV9DSCkpCisKKworZGVmIHZhbGlkYXRlX3ZnX25hbWUoaW50ZXJmYWNlLCB2Z19uYW1lKToKKwl0cnk6CisJCV9hbGxvd2FibGVfdmdfbmFtZSh2Z19uYW1lKQorCWV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOgorCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCWludGVyZmFjZSwgc3RyKHZlKSkKKworCitkZWYgdmFsaWRhdGVfbHZfbmFtZShpbnRlcmZhY2UsIHZnX25hbWUsIGx2X25hbWUpOgorCXRyeToKKwkJX2FsbG93YWJsZV9sdl9uYW1lKHZnX25hbWUsIGx2X25hbWUpCisJZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CisJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJaW50ZXJmYWNlLCBzdHIodmUpKQorCisKK2RlZiB2YWxpZGF0ZV90YWcoaW50ZXJmYWNlLCB0YWcpOgorCWlmIG5vdCBfYWxsb3dhYmxlX3RhZyh0YWcpOgorCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCWludGVyZmFjZSwgJ3RhZyAoJXMpIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLCBhbGxvd2FibGUgc2V0KCVzKScKKwkJCSUgKHRhZywgX0FMTE9XQUJMRV9UQUdfQ0gpKQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1kYnVzZC92Zy5weSBiL2RhZW1vbnMvbHZtZGJ1c2QvdmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjOTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZGJ1c2QvdmcucHkKQEAgLTAsMCArMSw5NTkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZnJvbSAuYXV0b21hdGVkcHJvcGVydGllcyBpbXBvcnQgQXV0b21hdGVkUHJvcGVydGllcworCitmcm9tIC4gaW1wb3J0IHV0aWxzCitmcm9tIC51dGlscyBpbXBvcnQgcHZfb2JqX3BhdGhfZ2VuZXJhdGUsIHZnX29ial9wYXRoX2dlbmVyYXRlLCBuCitpbXBvcnQgZGJ1cworZnJvbSAuIGltcG9ydCBjZmcKK2Zyb20gLmNmZyBpbXBvcnQgVkdfSU5URVJGQUNFCitmcm9tIC4gaW1wb3J0IGNtZGhhbmRsZXIKK2Zyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RFbnRyeQorZnJvbSAubG9hZGVyIGltcG9ydCBjb21tb24KK2Zyb20gLnN0YXRlIGltcG9ydCBTdGF0ZQorZnJvbSAuIGltcG9ydCBiYWNrZ3JvdW5kCitmcm9tIC51dGlscyBpbXBvcnQgcm91bmRfc2l6ZQorZnJvbSAuam9iIGltcG9ydCBKb2JTdGF0ZQorCisKKyMgbm9pbnNwZWN0aW9uIFB5VW51c2VkTG9jYWwKK2RlZiB2Z3Nfc3RhdGVfcmV0cmlldmUoc2VsZWN0aW9uLCBjYWNoZV9yZWZyZXNoPVRydWUpOgorCXJjID0gW10KKworCWlmIGNhY2hlX3JlZnJlc2g6CisJCWNmZy5kYi5yZWZyZXNoKCkKKworCWZvciB2IGluIGNmZy5kYi5mZXRjaF92Z3Moc2VsZWN0aW9uKToKKwkJcmMuYXBwZW5kKAorCQkJVmdTdGF0ZSgKKwkJCQl2Wyd2Z191dWlkJ10sIHZbJ3ZnX25hbWUnXSwgdlsndmdfZm10J10sIG4odlsndmdfc2l6ZSddKSwKKwkJCQluKHZbJ3ZnX2ZyZWUnXSksIHZbJ3ZnX3N5c2lkJ10sIG4odlsndmdfZXh0ZW50X3NpemUnXSksCisJCQkJbih2Wyd2Z19leHRlbnRfY291bnQnXSksIG4odlsndmdfZnJlZV9jb3VudCddKSwKKwkJCQl2Wyd2Z19wcm9maWxlJ10sIG4odlsnbWF4X2x2J10pLCBuKHZbJ21heF9wdiddKSwKKwkJCQluKHZbJ3B2X2NvdW50J10pLCBuKHZbJ2x2X2NvdW50J10pLCBuKHZbJ3NuYXBfY291bnQnXSksCisJCQkJbih2Wyd2Z19zZXFubyddKSwgbih2Wyd2Z19tZGFfY291bnQnXSksCisJCQkJbih2Wyd2Z19tZGFfZnJlZSddKSwgbih2Wyd2Z19tZGFfc2l6ZSddKSwKKwkJCQluKHZbJ3ZnX21kYV91c2VkX2NvdW50J10pLCB2Wyd2Z19hdHRyJ10sIHZbJ3ZnX3RhZ3MnXSkpCisJcmV0dXJuIHJjCisKKworZGVmIGxvYWRfdmdzKHZnX3NwZWNpZmljPU5vbmUsIG9iamVjdF9wYXRoPU5vbmUsIHJlZnJlc2g9RmFsc2UsCisJCWVtaXRfc2lnbmFsPUZhbHNlLCBjYWNoZV9yZWZyZXNoPVRydWUpOgorCXJldHVybiBjb21tb24odmdzX3N0YXRlX3JldHJpZXZlLCAoVmcsKSwgdmdfc3BlY2lmaWMsIG9iamVjdF9wYXRoLCByZWZyZXNoLAorCQkJCQllbWl0X3NpZ25hbCwgY2FjaGVfcmVmcmVzaCkKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcsUHlVbnJlc29sdmVkUmVmZXJlbmNlcyxQeVVudXNlZExvY2FsCitjbGFzcyBWZ1N0YXRlKFN0YXRlKToKKwlAcHJvcGVydHkKKwlkZWYgbHZtX2lkKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5OYW1lCisKKwlkZWYgaWRlbnRpZmllcnMoc2VsZik6CisJCXJldHVybiAoc2VsZi5VdWlkLCBzZWxmLk5hbWUpCisKKwlkZWYgX2x2X3BhdGhzX2J1aWxkKHNlbGYpOgorCQlyYyA9IFtdCisJCWZvciBsdiBpbiBjZmcuZGIubHZzX2luX3ZnKHNlbGYuVXVpZCk6CisJCQkobHZfbmFtZSwgbWV0YSwgbHZfdXVpZCkgPSBsdgorCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlIChzZWxmLk5hbWUsIGx2X25hbWUpCisKKwkJCWdlbiA9IHV0aWxzLmx2X29iamVjdF9wYXRoX21ldGhvZChsdl9uYW1lLCBtZXRhKQorCisJCQlsdl9wYXRoID0gY2ZnLm9tLmdldF9vYmplY3RfcGF0aF9ieV91dWlkX2x2bV9pZCgKKwkJCQlsdl91dWlkLCBmdWxsX25hbWUsIGdlbikKKwkJCXJjLmFwcGVuZChsdl9wYXRoKQorCQlyZXR1cm4gZGJ1cy5BcnJheShyYywgc2lnbmF0dXJlPSdvJykKKworCWRlZiBfcHZfcGF0aHNfYnVpbGQoc2VsZik6CisJCXJjID0gW10KKwkJZm9yIHAgaW4gY2ZnLmRiLnB2c19pbl92ZyhzZWxmLlV1aWQpOgorCQkJKHB2X25hbWUsIHB2X3V1aWQpID0gcAorCQkJcmMuYXBwZW5kKGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQkJcHZfdXVpZCwgcHZfbmFtZSwgcHZfb2JqX3BhdGhfZ2VuZXJhdGUpKQorCQlyZXR1cm4gZGJ1cy5BcnJheShyYywgc2lnbmF0dXJlPSdvJykKKworCWRlZiBfX2luaXRfXyhzZWxmLCBVdWlkLCBOYW1lLCBGbXQsCisJCQlTaXplQnl0ZXMsIEZyZWVCeXRlcywgU3lzSWQsIEV4dGVudFNpemVCeXRlcywKKwkJCUV4dGVudENvdW50LCBGcmVlQ291bnQsIFByb2ZpbGUsIE1heEx2LCBNYXhQdiwgUHZDb3VudCwKKwkJCUx2Q291bnQsIFNuYXBDb3VudCwgU2Vxbm8sIE1kYUNvdW50LCBNZGFGcmVlLAorCQkJTWRhU2l6ZUJ5dGVzLCBNZGFVc2VkQ291bnQsIGF0dHIsIHRhZ3MpOgorCQl1dGlscy5pbml0X2NsYXNzX2Zyb21fYXJndW1lbnRzKHNlbGYpCisJCXNlbGYuUHZzID0gc2VsZi5fcHZfcGF0aHNfYnVpbGQoKQorCQlzZWxmLkx2cyA9IHNlbGYuX2x2X3BhdGhzX2J1aWxkKCkKKworCWRlZiBjcmVhdGVfZGJ1c19vYmplY3Qoc2VsZiwgcGF0aCk6CisJCWlmIG5vdCBwYXRoOgorCQkJcGF0aCA9IGNmZy5vbS5nZXRfb2JqZWN0X3BhdGhfYnlfdXVpZF9sdm1faWQoCisJCQkJc2VsZi5VdWlkLCBzZWxmLk5hbWUsIHZnX29ial9wYXRoX2dlbmVyYXRlKQorCQlyZXR1cm4gVmcocGF0aCwgc2VsZikKKworCSMgbm9pbnNwZWN0aW9uIFB5TWV0aG9kTWF5QmVTdGF0aWMKKwlkZWYgY3JlYXRpb25fc2lnbmF0dXJlKHNlbGYpOgorCQlyZXR1cm4gKFZnLCB2Z19vYmpfcGF0aF9nZW5lcmF0ZSkKKworCisjIG5vaW5zcGVjdGlvbiBQeVBlcDhOYW1pbmcKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ1V1aWQnLCAncycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdOYW1lJywgJ3MnKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnRm10JywgJ3MnKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnU2l6ZUJ5dGVzJywgJ3QnLCAwKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnRnJlZUJ5dGVzJywgJ3QnLCAwKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnU3lzSWQnLCAncycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdFeHRlbnRTaXplQnl0ZXMnLCAndCcpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdFeHRlbnRDb3VudCcsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ0ZyZWVDb3VudCcsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ1Byb2ZpbGUnLCAncycpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdNYXhMdicsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ01heFB2JywgJ3QnKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnUHZDb3VudCcsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ0x2Q291bnQnLCAndCcpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdTbmFwQ291bnQnLCAndCcpCitAdXRpbHMuZGJ1c19wcm9wZXJ0eShWR19JTlRFUkZBQ0UsICdTZXFubycsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ01kYUNvdW50JywgJ3QnKQorQHV0aWxzLmRidXNfcHJvcGVydHkoVkdfSU5URVJGQUNFLCAnTWRhRnJlZScsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ01kYVNpemVCeXRlcycsICd0JykKK0B1dGlscy5kYnVzX3Byb3BlcnR5KFZHX0lOVEVSRkFDRSwgJ01kYVVzZWRDb3VudCcsICd0JykKK2NsYXNzIFZnKEF1dG9tYXRlZFByb3BlcnRpZXMpOgorCV9UYWdzX21ldGEgPSAoImFzIiwgVkdfSU5URVJGQUNFKQorCV9QdnNfbWV0YSA9ICgiYW8iLCBWR19JTlRFUkZBQ0UpCisJX0x2c19tZXRhID0gKCJhbyIsIFZHX0lOVEVSRkFDRSkKKwlfV3JpdGVhYmxlX21ldGEgPSAoImIiLCBWR19JTlRFUkZBQ0UpCisJX1JlYWRhYmxlX21ldGEgPSAoImIiLCBWR19JTlRFUkZBQ0UpCisJX1Jlc2l6ZWFibGVfbWV0YSA9ICgiYiIsIFZHX0lOVEVSRkFDRSkKKwlfRXhwb3J0YWJsZV9tZXRhID0gKCdiJywgVkdfSU5URVJGQUNFKQorCV9QYXJ0aWFsX21ldGEgPSAoJ2InLCBWR19JTlRFUkZBQ0UpCisJX0FsbG9jQ29udGlndW91c19tZXRhID0gKCdiJywgVkdfSU5URVJGQUNFKQorCV9BbGxvY0NsaW5nX21ldGEgPSAoJ2InLCBWR19JTlRFUkZBQ0UpCisJX0FsbG9jTm9ybWFsX21ldGEgPSAoJ2InLCBWR19JTlRFUkZBQ0UpCisJX0FsbG9jQW55d2hlcmVfbWV0YSA9ICgnYicsIFZHX0lOVEVSRkFDRSkKKwlfQ2x1c3RlcmVkX21ldGEgPSAoJ2InLCBWR19JTlRFUkZBQ0UpCisKKwkjIG5vaW5zcGVjdGlvbiBQeVVudXNlZExvY2FsLFB5UGVwOE5hbWluZworCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfcGF0aCwgb2JqZWN0X3N0YXRlKToKKwkJc3VwZXIoVmcsIHNlbGYpLl9faW5pdF9fKG9iamVjdF9wYXRoLCB2Z3Nfc3RhdGVfcmV0cmlldmUpCisJCXNlbGYuc2V0X2ludGVyZmFjZShWR19JTlRFUkZBQ0UpCisJCXNlbGYuX29iamVjdF9wYXRoID0gb2JqZWN0X3BhdGgKKwkJc2VsZi5zdGF0ZSA9IG9iamVjdF9zdGF0ZQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBmZXRjaF9uZXdfbHYodmdfbmFtZSwgbHZfbmFtZSk6CisJCWNmZy5sb2FkKCkKKwkJcmV0dXJuIGNmZy5vbS5nZXRfb2JqZWN0X2J5X2x2bV9pZCgiJXMvJXMiICUgKHZnX25hbWUsIGx2X25hbWUpKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcmVuYW1lKHV1aWQsIHZnX25hbWUsIG5ld19uYW1lLCByZW5hbWVfb3B0aW9ucyk6CisJCSMgTWFrZSBzdXJlIHdlIGhhdmUgYSBkYnVzIG9iamVjdCByZXByZXNlbnRpbmcgaXQKKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgdmdfbmFtZSkKKworCQlpZiBkYm86CisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnZnX3JlbmFtZSh2Z19uYW1lLCBuZXdfbmFtZSwKKwkJCQkJCQkJCQkJCXJlbmFtZV9vcHRpb25zKQorCQkJaWYgcmMgPT0gMDoKKwkJCQljZmcubG9hZCgpCisJCQllbHNlOgorCQkJCSMgTmVlZCB0byB3b3JrIG9uIGVycm9yIGhhbmRsaW5nLCBuZWVkIGNvbnNpc3RlbnQKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQknVkcgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCSh1dWlkLCB2Z19uYW1lKSkKKwkJcmV0dXJuICcvJworCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdzaWF7c3Z9Jywgb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBSZW5hbWUoc2VsZiwgbmFtZSwgdG1vLCByZW5hbWVfb3B0aW9ucywgY2IsIGNiZSk6CisJCXV0aWxzLnZhbGlkYXRlX3ZnX25hbWUoVkdfSU5URVJGQUNFLCBuYW1lKQorCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX3JlbmFtZSwKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwgbmFtZSwKKwkJCQlyZW5hbWVfb3B0aW9ucyksIGNiLCBjYmUsIEZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9yZW1vdmUodXVpZCwgdmdfbmFtZSwgcmVtb3ZlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHV1aWQsIHZnX25hbWUpCisKKwkJaWYgZGJvOgorCQkJIyBSZW1vdmUgdGhlIFZHLCBpZiBzdWNjZXNzZnVsIHRoZW4gcmVtb3ZlIGZyb20gdGhlIG1vZGVsCisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnZnX3JlbW92ZSh2Z19uYW1lLCByZW1vdmVfb3B0aW9ucykKKworCQkJaWYgcmMgPT0gMDoKKwkJCQkjIFJlbW92ZSB0aGUgVkcKKwkJCQljZmcub20ucmVtb3ZlX29iamVjdChkYm8sIFRydWUpCisKKwkJCQkjIElmIGFuIExWIGhhcyBoaWRkZW4gTFZzLCB0aGluZ3MgY2FuIGdldCBxdWl0ZSBpbnZvbHZlZCwKKwkJCQkjIGVzcGVjaWFsbHkgaWYgaXQncyB0aGUgbGFzdCB0aGluIHBvb2wgdG8gZ2V0IHJlbW92ZWQsIHNvCisJCQkJIyBsZXRzIHJlZnJlc2ggYWxsCisJCQkJY2ZnLmxvYWQoKQorCisJCQllbHNlOgorCQkJCSMgTmVlZCB0byB3b3JrIG9uIGVycm9yIGhhbmRsaW5nLCBuZWVkIGNvbnNpc3RlbnQKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQknVkcgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCSh1dWlkLCB2Z19uYW1lKSkKKwkJcmV0dXJuICcvJworCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdpYXtzdn0nLCBvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIFJlbW92ZShzZWxmLCB0bW8sIHJlbW92ZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl9yZW1vdmUsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIHJlbW92ZV9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCBGYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfY2hhbmdlKHV1aWQsIHZnX25hbWUsIGNoYW5nZV9vcHRpb25zKToKKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgdmdfbmFtZSkKKworCQlpZiBkYm86CisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnZnX2NoYW5nZShjaGFuZ2Vfb3B0aW9ucywgdmdfbmFtZSkKKworCQkJIyBUbyB1c2UgYW4gZXhhbXBsZSB3aXRoIGQtZmVldCAoTWV0aG9kIGlucHV0KQorCQkJIyB7ImFjdGl2YXRlIjogX19pbXBvcnRfXygnZ2kucmVwb3NpdG9yeS5HTGliJywgZ2xvYmFscygpLAorCQkJIyBsb2NhbHMoKSwgWydWYXJpYW50J10pLlZhcmlhbnQoInMiLCAibiIpfQorCisJCQlpZiByYyA9PSAwOgorCQkJCWNmZy5sb2FkKCkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisJCXJldHVybiAnLycKKworCSMgVE9ETzogVGhpcyBzaG91bGQgYmUgYnJva2VuIGludG8gYSBudW1iZXIgb2YgZGlmZmVyZW50IG1ldGhvZHMKKwkjIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBtZXRob2QgdGhhdCB0YWtlcyBhIGhhc2ggZm9yIHBhcmFtZXRlcnMuICBTb21lIG9mCisJIyB0aGUgY2hhbmdlcyB0aGF0IHZnY2hhbmdlIGRvZXMgd29ya3Mgb24gZW50aXJlIHN5c3RlbSwgbm90IGp1c3QgYQorCSMgc3BlY2ZpYyB2ZywgdGh1cyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgTWFuYWdlciBpbnRlcmZhY2UuCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIENoYW5nZShzZWxmLCB0bW8sIGNoYW5nZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl9jaGFuZ2UsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIGNoYW5nZV9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCBGYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcmVkdWNlKHV1aWQsIHZnX25hbWUsIG1pc3NpbmcsIHB2X29iamVjdF9wYXRocywgcmVkdWNlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHV1aWQsIHZnX25hbWUpCisKKwkJaWYgZGJvOgorCQkJcHZfZGV2aWNlcyA9IFtdCisKKwkJCSMgSWYgcHZfb2JqZWN0X3BhdGhzIGlzIG5vdCBlbXB0eSwgdGhlbiBnZXQgdGhlIGRldmljZSBwYXRocworCQkJaWYgcHZfb2JqZWN0X3BhdGhzIGFuZCBsZW4ocHZfb2JqZWN0X3BhdGhzKSA+IDA6CisJCQkJZm9yIHB2X29wIGluIHB2X29iamVjdF9wYXRoczoKKwkJCQkJcHYgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKHB2X29wKQorCQkJCQlpZiBwdjoKKwkJCQkJCXB2X2RldmljZXMuYXBwZW5kKHB2Lmx2bV9pZCkKKwkJCQkJZWxzZToKKwkJCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJCQknUFYgT2JqZWN0IHBhdGggbm90IGZvdW5kID0gJXMhJyAlIHB2X29wKQorCisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnZnX3JlZHVjZSh2Z19uYW1lLCBtaXNzaW5nLCBwdl9kZXZpY2VzLAorCQkJCQkJCQkJCQkJcmVkdWNlX29wdGlvbnMpCisJCQlpZiByYyA9PSAwOgorCQkJCWNmZy5sb2FkKCkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwgJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisJCXJldHVybiAnLycKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nYmFvaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBSZWR1Y2Uoc2VsZiwgbWlzc2luZywgcHZfb2JqZWN0X3BhdGhzLCB0bW8sIHJlZHVjZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl9yZWR1Y2UsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIG1pc3NpbmcsCisJCQkJcHZfb2JqZWN0X3BhdGhzLCByZWR1Y2Vfb3B0aW9ucyksIGNiLCBjYmUsIEZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9leHRlbmQodXVpZCwgdmdfbmFtZSwgcHZfb2JqZWN0X3BhdGhzLCBleHRlbmRfb3B0aW9ucyk6CisJCSMgTWFrZSBzdXJlIHdlIGhhdmUgYSBkYnVzIG9iamVjdCByZXByZXNlbnRpbmcgaXQKKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgdmdfbmFtZSkKKworCQlpZiBkYm86CisJCQlleHRlbmRfZGV2aWNlcyA9IFtdCisKKwkJCWZvciBpIGluIHB2X29iamVjdF9wYXRoczoKKwkJCQlwdiA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3BhdGgoaSkKKwkJCQlpZiBwdjoKKwkJCQkJZXh0ZW5kX2RldmljZXMuYXBwZW5kKHB2Lmx2bV9pZCkKKwkJCQllbHNlOgorCQkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJCVZHX0lOVEVSRkFDRSwgJ1BWIE9iamVjdCBwYXRoIG5vdCBmb3VuZCA9ICVzIScgJSBpKQorCisJCQlpZiBsZW4oZXh0ZW5kX2RldmljZXMpOgorCQkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIudmdfZXh0ZW5kKHZnX25hbWUsIGV4dGVuZF9kZXZpY2VzLAorCQkJCQkJCQkJCQkJCWV4dGVuZF9vcHRpb25zKQorCQkJCWlmIHJjID09IDA6CisJCQkJCWNmZy5sb2FkKCkKKwkJCQllbHNlOgorCQkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLCAnTm8gcHZfb2JqZWN0X3BhdGhzIHByb3ZpZGVkIScpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisJCXJldHVybiAnLycKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nYW9pYXtzdn0nLCBvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIEV4dGVuZChzZWxmLCBwdl9vYmplY3RfcGF0aHMsIHRtbywgZXh0ZW5kX29wdGlvbnMsIGNiLCBjYmUpOgorCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX2V4dGVuZCwKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwgcHZfb2JqZWN0X3BhdGhzLAorCQkJCWV4dGVuZF9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCBGYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdvKHR0KWEob3R0KWlhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgTW92ZShzZWxmLCBwdl9zcmNfb2JqLCBwdl9zb3VyY2VfcmFuZ2UsIHB2X2Rlc3RzX2FuZF9yYW5nZXMsCisJCQl0bW8sIG1vdmVfb3B0aW9ucywgY2IsIGNiZSk6CisKKwkJam9iX3N0YXRlID0gSm9iU3RhdGUoKQorCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQkJdG1vLCBiYWNrZ3JvdW5kLm1vdmUsCisJCQkJKFZHX0lOVEVSRkFDRSwgTm9uZSwgcHZfc3JjX29iaiwgcHZfc291cmNlX3JhbmdlLAorCQkJCXB2X2Rlc3RzX2FuZF9yYW5nZXMsIG1vdmVfb3B0aW9ucywgam9iX3N0YXRlKSwgY2IsIGNiZSwgRmFsc2UsCisJCQkJam9iX3N0YXRlKQorCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX2x2X2NyZWF0ZSh1dWlkLCB2Z19uYW1lLCBuYW1lLCBzaXplX2J5dGVzLCBwdl9kZXN0c19hbmRfcmFuZ2VzLAorCQkJY3JlYXRlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCXB2X2Rlc3RzID0gW10KKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgdmdfbmFtZSkKKworCQlpZiBkYm86CisJCQlpZiBsZW4ocHZfZGVzdHNfYW5kX3Jhbmdlcyk6CisJCQkJZm9yIHByIGluIHB2X2Rlc3RzX2FuZF9yYW5nZXM6CisJCQkJCXB2X2RidXNfb2JqID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfcGF0aChwclswXSkKKwkJCQkJaWYgbm90IHB2X2RidXNfb2JqOgorCQkJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQkJCSdQViBEZXN0aW5hdGlvbiAoJXMpIG5vdCBmb3VuZCcgJSBwclswXSkKKworCQkJCQlwdl9kZXN0cy5hcHBlbmQoKHB2X2RidXNfb2JqLmx2bV9pZCwgcHJbMV0sIHByWzJdKSkKKworCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci52Z19sdl9jcmVhdGUoCisJCQkJdmdfbmFtZSwgY3JlYXRlX29wdGlvbnMsIG5hbWUsIHNpemVfYnl0ZXMsIHB2X2Rlc3RzKQorCisJCQlpZiByYyA9PSAwOgorCQkJCXJldHVybiBWZy5mZXRjaF9uZXdfbHYodmdfbmFtZSwgbmFtZSkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9VkdfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3N0YShvdHQpaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBMdkNyZWF0ZShzZWxmLCBuYW1lLCBzaXplX2J5dGVzLCBwdl9kZXN0c19hbmRfcmFuZ2VzLAorCQkJdG1vLCBjcmVhdGVfb3B0aW9ucywgY2IsIGNiZSk6CisJCSIiIgorCQlUaGlzIG9uZSBpdCBmb3IgdGhlIGFkdmFuY2VkIHVzZXJzIHRoYXQgd2FudCB0byByb2xsIHRoZWlyIG93bgorCQk6cGFyYW0gbmFtZTogICAgICAgICAgICBOYW1lIG9mIHRoZSBMVgorCQk6cGFyYW0gc2l6ZV9ieXRlczogICAgICBTaXplIG9mIExWIGluIGJ5dGVzCisJCTpwYXJhbSBwdl9kZXN0c19hbmRfcmFuZ2VzOiAgIE9wdGlvbmFsIGFycmF5IG9mIFBWIG9iamVjdCBwYXRocyBhbmQKKwkJCQkJCQkJCXJhbmdlcworCQk6cGFyYW0gdG1vOiAtMSA9PSBXYWl0IGZvcmV2ZXIsIDAgPT0gcmV0dXJuIGpvYiBpbW1lZGlhdGVseSwgPiAwID09CisJCQkJCQkJd2lsbGluZyB0byB3YWl0IHRoYXQgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlCisJCQkJCQkJZ2V0dGluZyBhIGpvYgorCQk6cGFyYW0gY3JlYXRlX29wdGlvbnM6ICBoYXNoIG9mIGtleS92YWx1ZSBwYWlycworCQk6cGFyYW0gY2I6IEludGVybmFsLCBub3QgYWNjZXNzaWJsZSBieSBkYnVzIEFQSSB1c2VyCisJCTpwYXJhbSBjYmU6IEludGVybmFsLCBub3QgYWNjZXNzaWJsZSBieSBkYnVzIEFQSSB1c2VyCisJCTpyZXR1cm46IChvbykgRmlyc3Qgb2JqZWN0IHBhdGggaXMgbmV3bHkgY3JlYXRlZCBvYmplY3QsIHNlY29uZCBpcworCQkJCQlqb2Igb2JqZWN0IHBhdGggaWYgY3JlYXRlZC4gIEVhY2ggPT0gJy8nIHdoZW4gaXQgZG9lc24ndAorCQkJCQlhcHBseS4KKwkJIiIiCisJCXV0aWxzLnZhbGlkYXRlX2x2X25hbWUoVkdfSU5URVJGQUNFLCBzZWxmLk5hbWUsIG5hbWUpCisJCXIgPSBSZXF1ZXN0RW50cnkodG1vLCBWZy5fbHZfY3JlYXRlLAorCQkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJCW5hbWUsIHJvdW5kX3NpemUoc2l6ZV9ieXRlcyksIHB2X2Rlc3RzX2FuZF9yYW5nZXMsCisJCQkJY3JlYXRlX29wdGlvbnMpLCBjYiwgY2JlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9sdl9jcmVhdGVfbGluZWFyKHV1aWQsIHZnX25hbWUsIG5hbWUsIHNpemVfYnl0ZXMsCisJCQl0aGluX3Bvb2wsIGNyZWF0ZV9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCB2Z19uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIudmdfbHZfY3JlYXRlX2xpbmVhcigKKwkJCQl2Z19uYW1lLCBjcmVhdGVfb3B0aW9ucywgbmFtZSwgc2l6ZV9ieXRlcywgdGhpbl9wb29sKQorCisJCQlpZiByYyA9PSAwOgorCQkJCWNyZWF0ZWRfbHYgPSBWZy5mZXRjaF9uZXdfbHYodmdfbmFtZSwgbmFtZSkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisKKwkJcmV0dXJuIGNyZWF0ZWRfbHYKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc3RiaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBMdkNyZWF0ZUxpbmVhcihzZWxmLCBuYW1lLCBzaXplX2J5dGVzLAorCQkJdGhpbl9wb29sLCB0bW8sIGNyZWF0ZV9vcHRpb25zLCBjYiwgY2JlKToKKwkJdXRpbHMudmFsaWRhdGVfbHZfbmFtZShWR19JTlRFUkZBQ0UsIHNlbGYuTmFtZSwgbmFtZSkKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl9sdl9jcmVhdGVfbGluZWFyLAorCQkJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsCisJCQkJCQluYW1lLCByb3VuZF9zaXplKHNpemVfYnl0ZXMpLCB0aGluX3Bvb2wsCisJCQkJCQljcmVhdGVfb3B0aW9ucyksIGNiLCBjYmUpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX2x2X2NyZWF0ZV9zdHJpcGVkKHV1aWQsIHZnX25hbWUsIG5hbWUsIHNpemVfYnl0ZXMsIG51bV9zdHJpcGVzLAorCQkJc3RyaXBlX3NpemVfa2IsIHRoaW5fcG9vbCwgY3JlYXRlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHV1aWQsIHZnX25hbWUpCisKKwkJaWYgZGJvOgorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci52Z19sdl9jcmVhdGVfc3RyaXBlZCgKKwkJCQl2Z19uYW1lLCBjcmVhdGVfb3B0aW9ucywgbmFtZSwgc2l6ZV9ieXRlcywKKwkJCQludW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IsIHRoaW5fcG9vbCkKKwkJCWlmIHJjID09IDA6CisJCQkJY3JlYXRlZF9sdiA9IFZnLmZldGNoX25ld19sdih2Z19uYW1lLCBuYW1lKQorCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwgJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisKKwkJcmV0dXJuIGNyZWF0ZWRfbHYKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc3R1dWJpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPScob28pJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIEx2Q3JlYXRlU3RyaXBlZChzZWxmLCBuYW1lLCBzaXplX2J5dGVzLCBudW1fc3RyaXBlcywKKwkJCQkJCXN0cmlwZV9zaXplX2tiLCB0aGluX3Bvb2wsIHRtbywgY3JlYXRlX29wdGlvbnMsCisJCQkJCQljYiwgY2JlKToKKwkJdXRpbHMudmFsaWRhdGVfbHZfbmFtZShWR19JTlRFUkZBQ0UsIHNlbGYuTmFtZSwgbmFtZSkKKwkJciA9IFJlcXVlc3RFbnRyeSgKKwkJCQl0bW8sIFZnLl9sdl9jcmVhdGVfc3RyaXBlZCwKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwgbmFtZSwKKwkJCQlyb3VuZF9zaXplKHNpemVfYnl0ZXMpLCBudW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IsCisJCQkJdGhpbl9wb29sLCBjcmVhdGVfb3B0aW9ucyksCisJCQkJY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfbHZfY3JlYXRlX21pcnJvcih1dWlkLCB2Z19uYW1lLCBuYW1lLCBzaXplX2J5dGVzLAorCQkJbnVtX2NvcGllcywgY3JlYXRlX29wdGlvbnMpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHV1aWQsIHZnX25hbWUpCisKKwkJaWYgZGJvOgorCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci52Z19sdl9jcmVhdGVfbWlycm9yKAorCQkJCXZnX25hbWUsIGNyZWF0ZV9vcHRpb25zLCBuYW1lLCBzaXplX2J5dGVzLCBudW1fY29waWVzKQorCQkJaWYgcmMgPT0gMDoKKwkJCQljcmVhdGVkX2x2ID0gVmcuZmV0Y2hfbmV3X2x2KHZnX25hbWUsIG5hbWUpCisJCQllbHNlOgorCQkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCQlWR19JTlRFUkZBQ0UsCisJCQkJCSdFeGl0IGNvZGUgJXMsIHN0ZGVyciA9ICVzJyAlIChzdHIocmMpLCBlcnIpKQorCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisKKwkJcmV0dXJuIGNyZWF0ZWRfbHYKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc3R1aWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nKG9vKScsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBMdkNyZWF0ZU1pcnJvcihzZWxmLCBuYW1lLCBzaXplX2J5dGVzLCBudW1fY29waWVzLAorCQkJdG1vLCBjcmVhdGVfb3B0aW9ucywgY2IsIGNiZSk6CisJCXV0aWxzLnZhbGlkYXRlX2x2X25hbWUoVkdfSU5URVJGQUNFLCBzZWxmLk5hbWUsIG5hbWUpCisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIFZnLl9sdl9jcmVhdGVfbWlycm9yLAorCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIG5hbWUsCisJCQlyb3VuZF9zaXplKHNpemVfYnl0ZXMpLCBudW1fY29waWVzLAorCQkJY3JlYXRlX29wdGlvbnMpLCBjYiwgY2JlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9sdl9jcmVhdGVfcmFpZCh1dWlkLCB2Z19uYW1lLCBuYW1lLCByYWlkX3R5cGUsIHNpemVfYnl0ZXMsCisJCQkJCQludW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IsIGNyZWF0ZV9vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCB2Z19uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIudmdfbHZfY3JlYXRlX3JhaWQoCisJCQkJdmdfbmFtZSwgY3JlYXRlX29wdGlvbnMsIG5hbWUsIHJhaWRfdHlwZSwgc2l6ZV9ieXRlcywKKwkJCQludW1fc3RyaXBlcywgc3RyaXBlX3NpemVfa2IpCisJCQlpZiByYyA9PSAwOgorCQkJCWNyZWF0ZWRfbHYgPSBWZy5mZXRjaF9uZXdfbHYodmdfbmFtZSwgbmFtZSkKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQknVkcgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCSh1dWlkLCB2Z19uYW1lKSkKKworCQlyZXR1cm4gY3JlYXRlZF9sdgorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdzc3R1dWlhe3N2fScsCisJCW91dF9zaWduYXR1cmU9JyhvbyknLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgTHZDcmVhdGVSYWlkKHNlbGYsIG5hbWUsIHJhaWRfdHlwZSwgc2l6ZV9ieXRlcywKKwkJCW51bV9zdHJpcGVzLCBzdHJpcGVfc2l6ZV9rYiwgdG1vLAorCQkJY3JlYXRlX29wdGlvbnMsIGNiLCBjYmUpOgorCQl1dGlscy52YWxpZGF0ZV9sdl9uYW1lKFZHX0lOVEVSRkFDRSwgc2VsZi5OYW1lLCBuYW1lKQorCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX2x2X2NyZWF0ZV9yYWlkLAorCQkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLCBuYW1lLAorCQkJCXJhaWRfdHlwZSwgcm91bmRfc2l6ZShzaXplX2J5dGVzKSwgbnVtX3N0cmlwZXMsCisJCQkJc3RyaXBlX3NpemVfa2IsIGNyZWF0ZV9vcHRpb25zKSwgY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfY3JlYXRlX3Bvb2wodXVpZCwgdmdfbmFtZSwgbWV0YV9kYXRhX2x2LCBkYXRhX2x2LAorCQkJCQkJY3JlYXRlX29wdGlvbnMsIGNyZWF0ZV9tZXRob2QpOgorCQkjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGJ1cyBvYmplY3QgcmVwcmVzZW50aW5nIGl0CisJCWRibyA9IGNmZy5vbS5nZXRfb2JqZWN0X2J5X3V1aWRfbHZtX2lkKHV1aWQsIHZnX25hbWUpCisKKwkJIyBSZXRyaWV2ZSB0aGUgZnVsbCBuYW1lcyBmb3IgdGhlIG1ldGFkYXRhIGFuZCBkYXRhIGx2CisJCW1kID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfcGF0aChtZXRhX2RhdGFfbHYpCisJCWRhdGEgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKGRhdGFfbHYpCisKKwkJaWYgZGJvIGFuZCBtZCBhbmQgZGF0YToKKworCQkJbmV3X25hbWUgPSBkYXRhLk5hbWUKKworCQkJcmMsIG91dCwgZXJyID0gY3JlYXRlX21ldGhvZCgKKwkJCQltZC5sdl9mdWxsX25hbWUoKSwgZGF0YS5sdl9mdWxsX25hbWUoKSwgY3JlYXRlX29wdGlvbnMpCisJCQlpZiByYyA9PSAwOgorCQkJCWNmZy5vbS5yZW1vdmVfb2JqZWN0KG1kLCBlbWl0X3NpZ25hbD1UcnVlKQorCQkJCWNmZy5vbS5yZW1vdmVfb2JqZWN0KGRhdGEsIGVtaXRfc2lnbmFsPVRydWUpCisKKwkJCQljYWNoZV9wb29sX2x2ID0gVmcuZmV0Y2hfbmV3X2x2KHZnX25hbWUsIG5ld19uYW1lKQorCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKworCQllbHNlOgorCQkJbXNnID0gIiIKKworCQkJaWYgbm90IGRibzoKKwkJCQltc2cgKz0gJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUgXAorCQkJCQkodXVpZCwgdmdfbmFtZSkKKworCQkJaWYgbm90IG1kOgorCQkJCW1zZyArPSAnTWV0YSBkYXRhIExWIHdpdGggb2JqZWN0IHBhdGggJXMgbm90IHByZXNlbnQhJyAlIFwKKwkJCQkJKG1ldGFfZGF0YV9sdikKKworCQkJaWYgbm90IGRhdGFfbHY6CisJCQkJbXNnICs9ICdEYXRhIExWIHdpdGggb2JqZWN0IHBhdGggJXMgbm90IHByZXNlbnQhJyAlIFwKKwkJCQkJKG1ldGFfZGF0YV9sdikKKworCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oVkdfSU5URVJGQUNFLCBtc2cpCisKKwkJcmV0dXJuIGNhY2hlX3Bvb2xfbHYKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nb29pYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPScob28pJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIENyZWF0ZUNhY2hlUG9vbChzZWxmLCBtZXRhX2RhdGFfbHYsIGRhdGFfbHYsIHRtbywgY3JlYXRlX29wdGlvbnMsCisJCQkJCQljYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSgKKwkJCXRtbywgVmcuX2NyZWF0ZV9wb29sLAorCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIG1ldGFfZGF0YV9sdiwKKwkJCWRhdGFfbHYsIGNyZWF0ZV9vcHRpb25zLCBjbWRoYW5kbGVyLnZnX2NyZWF0ZV9jYWNoZV9wb29sKSwgY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdvb2lhe3N2fScsCisJCW91dF9zaWduYXR1cmU9JyhvbyknLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgQ3JlYXRlVGhpblBvb2woc2VsZiwgbWV0YV9kYXRhX2x2LCBkYXRhX2x2LCB0bW8sIGNyZWF0ZV9vcHRpb25zLAorCQkJCQkJY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkoCisJCQl0bW8sIFZnLl9jcmVhdGVfcG9vbCwKKwkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLCBtZXRhX2RhdGFfbHYsCisJCQlkYXRhX2x2LCBjcmVhdGVfb3B0aW9ucywgY21kaGFuZGxlci52Z19jcmVhdGVfdGhpbl9wb29sKSwgY2IsIGNiZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfcHZfYWRkX3JtX3RhZ3ModXVpZCwgdmdfbmFtZSwgcHZfb2JqZWN0X3BhdGhzLCB0YWdzX2FkZCwKKwkJCQkJCXRhZ3NfZGVsLCB0YWdfb3B0aW9ucyk6CisJCXB2X2RldmljZXMgPSBbXQorCisJCSMgTWFrZSBzdXJlIHdlIGhhdmUgYSBkYnVzIG9iamVjdCByZXByZXNlbnRpbmcgaXQKKwkJZGJvID0gY2ZnLm9tLmdldF9vYmplY3RfYnlfdXVpZF9sdm1faWQodXVpZCwgdmdfbmFtZSkKKworCQlpZiBkYm86CisJCQkjIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgcHYgb2JqZWN0IHBhdGhzCisJCQlmb3IgcCBpbiBwdl9vYmplY3RfcGF0aHM6CisJCQkJcHYgPSBjZmcub20uZ2V0X29iamVjdF9ieV9wYXRoKHApCisJCQkJaWYgcHY6CisJCQkJCXB2X2RldmljZXMuYXBwZW5kKHB2Lk5hbWUpCisJCQkJZWxzZToKKwkJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCQlWR19JTlRFUkZBQ0UsICdQViBvYmplY3QgcGF0aCA9ICVzIG5vdCBmb3VuZCcgJSBwKQorCisJCQlyYywgb3V0LCBlcnIgPSBjbWRoYW5kbGVyLnB2X3RhZygKKwkJCQlwdl9kZXZpY2VzLCB0YWdzX2FkZCwgdGFnc19kZWwsIHRhZ19vcHRpb25zKQorCQkJaWYgcmMgPT0gMDoKKwkJCQljZmcubG9hZCgpCisJCQkJcmV0dXJuICcvJworCQkJZWxzZToKKwkJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQkJVkdfSU5URVJGQUNFLAorCQkJCQknRXhpdCBjb2RlICVzLCBzdGRlcnIgPSAlcycgJSAoc3RyKHJjKSwgZXJyKSkKKworCQllbHNlOgorCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJVkdfSU5URVJGQUNFLAorCQkJCSdWRyB3aXRoIHV1aWQgJXMgYW5kIG5hbWUgJXMgbm90IHByZXNlbnQhJyAlCisJCQkJKHV1aWQsIHZnX25hbWUpKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdhb2FzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBQdlRhZ3NBZGQoc2VsZiwgcHZzLCB0YWdzLCB0bW8sIHRhZ19vcHRpb25zLCBjYiwgY2JlKToKKworCQlmb3IgdCBpbiB0YWdzOgorCQkJdXRpbHMudmFsaWRhdGVfdGFnKFZHX0lOVEVSRkFDRSwgdCkKKworCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX3B2X2FkZF9ybV90YWdzLAorCQkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJCXB2cywgdGFncywgTm9uZSwgdGFnX29wdGlvbnMpLAorCQkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQGRidXMuc2VydmljZS5tZXRob2QoCisJCWRidXNfaW50ZXJmYWNlPVZHX0lOVEVSRkFDRSwKKwkJaW5fc2lnbmF0dXJlPSdhb2FzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBQdlRhZ3NEZWwoc2VsZiwgcHZzLCB0YWdzLCB0bW8sIHRhZ19vcHRpb25zLCBjYiwgY2JlKToKKworCQlmb3IgdCBpbiB0YWdzOgorCQkJdXRpbHMudmFsaWRhdGVfdGFnKFZHX0lOVEVSRkFDRSwgdCkKKworCQlyID0gUmVxdWVzdEVudHJ5KAorCQkJdG1vLCBWZy5fcHZfYWRkX3JtX3RhZ3MsCisJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwKKwkJCXB2cywgTm9uZSwgdGFncywgdGFnX29wdGlvbnMpLAorCQkJY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF92Z19hZGRfcm1fdGFncyh1dWlkLCB2Z19uYW1lLCB0YWdzX2FkZCwgdGFnc19kZWwsIHRhZ19vcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCB2Z19uYW1lKQorCisJCWlmIGRibzoKKworCQkJcmMsIG91dCwgZXJyID0gY21kaGFuZGxlci52Z190YWcoCisJCQkJdmdfbmFtZSwgdGFnc19hZGQsIHRhZ3NfZGVsLCB0YWdfb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJZGJvLnJlZnJlc2goKQorCQkJCXJldHVybiAnLycKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQknVkcgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCSh1dWlkLCB2Z19uYW1lKSkKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nYXNpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIFRhZ3NBZGQoc2VsZiwgdGFncywgdG1vLCB0YWdfb3B0aW9ucywgY2IsIGNiZSk6CisKKwkJZm9yIHQgaW4gdGFnczoKKwkJCXV0aWxzLnZhbGlkYXRlX3RhZyhWR19JTlRFUkZBQ0UsIHQpCisKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl92Z19hZGRfcm1fdGFncywKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwKKwkJCQl0YWdzLCBOb25lLCB0YWdfb3B0aW9ucyksCisJCQkJY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9VkdfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J2FzaWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBUYWdzRGVsKHNlbGYsIHRhZ3MsIHRtbywgdGFnX29wdGlvbnMsIGNiLCBjYmUpOgorCisJCWZvciB0IGluIHRhZ3M6CisJCQl1dGlscy52YWxpZGF0ZV90YWcoVkdfSU5URVJGQUNFLCB0KQorCisJCXIgPSBSZXF1ZXN0RW50cnkodG1vLCBWZy5fdmdfYWRkX3JtX3RhZ3MsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsCisJCQkJTm9uZSwgdGFncywgdGFnX29wdGlvbnMpLAorCQkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfdmdfY2hhbmdlX3NldCh1dWlkLCB2Z19uYW1lLCBtZXRob2QsIHZhbHVlLCBvcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCB2Z19uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IG1ldGhvZCh2Z19uYW1lLCB2YWx1ZSwgb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJZGJvLnJlZnJlc2goKQorCQkJCXJldHVybiAnLycKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisKKwkJZWxzZToKKwkJCXJhaXNlIGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKAorCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQknVkcgd2l0aCB1dWlkICVzIGFuZCBuYW1lICVzIG5vdCBwcmVzZW50IScgJQorCQkJCSh1dWlkLCB2Z19uYW1lKSkKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0nc2lhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgQWxsb2NhdGlvblBvbGljeVNldChzZWxmLCBwb2xpY3ksIHRtbywgcG9saWN5X29wdGlvbnMsIGNiLCBjYmUpOgorCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX3ZnX2NoYW5nZV9zZXQsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsCisJCQkJY21kaGFuZGxlci52Z19hbGxvY2F0aW9uX3BvbGljeSwKKwkJCQlwb2xpY3ksIHBvbGljeV9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCByZXR1cm5fdHVwbGU9RmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0ndGlhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgTWF4UHZTZXQoc2VsZiwgbnVtYmVyLCB0bW8sIG1heF9vcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl92Z19jaGFuZ2Vfc2V0LAorCQkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJCWNtZGhhbmRsZXIudmdfbWF4X3B2LCBudW1iZXIsIG1heF9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCByZXR1cm5fdHVwbGU9RmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0naWF7c3Z9JywKKwkJb3V0X3NpZ25hdHVyZT0nbycsCisJCWFzeW5jX2NhbGxiYWNrcz0oJ2NiJywgJ2NiZScpKQorCWRlZiBVdWlkR2VuZXJhdGUoc2VsZiwgdG1vLCBvcHRpb25zLCBjYiwgY2JlKToKKwkJciA9IFJlcXVlc3RFbnRyeSh0bW8sIFZnLl92Z19jaGFuZ2Vfc2V0LAorCQkJCShzZWxmLnN0YXRlLlV1aWQsIHNlbGYuc3RhdGUubHZtX2lkLAorCQkJCWNtZGhhbmRsZXIudmdfdXVpZF9nZW4sIE5vbmUsIG9wdGlvbnMpLAorCQkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJZGVmIF9hdHRyaWJ1dGUoc2VsZiwgcG9zLCBjaCk6CisJCWlmIHNlbGYuc3RhdGUuYXR0cltwb3NdID09IGNoOgorCQkJcmV0dXJuIFRydWUKKwkJcmV0dXJuIEZhbHNlCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9VkdfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3RpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIE1heEx2U2V0KHNlbGYsIG51bWJlciwgdG1vLCBtYXhfb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkodG1vLCBWZy5fdmdfY2hhbmdlX3NldCwKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwKKwkJCQljbWRoYW5kbGVyLnZnX21heF9sdiwgbnVtYmVyLCBtYXhfb3B0aW9ucyksCisJCQkJY2IsIGNiZSwgcmV0dXJuX3R1cGxlPUZhbHNlKQorCQljZmcud29ya2VyX3EucHV0KHIpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF92Z19hY3RpdmF0ZV9kZWFjdGl2YXRlKHV1aWQsIHZnX25hbWUsIGFjdGl2YXRlLCBjb250cm9sX2ZsYWdzLAorCQkJCQkJCQlvcHRpb25zKToKKwkJIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRidXMgb2JqZWN0IHJlcHJlc2VudGluZyBpdAorCQlkYm8gPSBjZmcub20uZ2V0X29iamVjdF9ieV91dWlkX2x2bV9pZCh1dWlkLCB2Z19uYW1lKQorCisJCWlmIGRibzoKKwkJCXJjLCBvdXQsIGVyciA9IGNtZGhhbmRsZXIuYWN0aXZhdGVfZGVhY3RpdmF0ZSgKKwkJCQkndmdjaGFuZ2UnLCB2Z19uYW1lLCBhY3RpdmF0ZSwgY29udHJvbF9mbGFncywgb3B0aW9ucykKKwkJCWlmIHJjID09IDA6CisJCQkJY2ZnLmxvYWQoKQorCQkJCXJldHVybiAnLycKKwkJCWVsc2U6CisJCQkJcmFpc2UgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24oCisJCQkJCVZHX0lOVEVSRkFDRSwKKwkJCQkJJ0V4aXQgY29kZSAlcywgc3RkZXJyID0gJXMnICUgKHN0cihyYyksIGVycikpCisJCWVsc2U6CisJCQlyYWlzZSBkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbigKKwkJCQlWR19JTlRFUkZBQ0UsCisJCQkJJ1ZHIHdpdGggdXVpZCAlcyBhbmQgbmFtZSAlcyBub3QgcHJlc2VudCEnICUKKwkJCQkodXVpZCwgdmdfbmFtZSkpCisKKwlAZGJ1cy5zZXJ2aWNlLm1ldGhvZCgKKwkJZGJ1c19pbnRlcmZhY2U9VkdfSU5URVJGQUNFLAorCQlpbl9zaWduYXR1cmU9J3RpYXtzdn0nLAorCQlvdXRfc2lnbmF0dXJlPSdvJywKKwkJYXN5bmNfY2FsbGJhY2tzPSgnY2InLCAnY2JlJykpCisJZGVmIEFjdGl2YXRlKHNlbGYsIGNvbnRyb2xfZmxhZ3MsIHRtbywgYWN0aXZhdGVfb3B0aW9ucywgY2IsIGNiZSk6CisJCXIgPSBSZXF1ZXN0RW50cnkodG1vLCBWZy5fdmdfYWN0aXZhdGVfZGVhY3RpdmF0ZSwKKwkJCQkoc2VsZi5zdGF0ZS5VdWlkLCBzZWxmLnN0YXRlLmx2bV9pZCwgVHJ1ZSwKKwkJCQljb250cm9sX2ZsYWdzLCBhY3RpdmF0ZV9vcHRpb25zKSwKKwkJCQljYiwgY2JlLCByZXR1cm5fdHVwbGU9RmFsc2UpCisJCWNmZy53b3JrZXJfcS5wdXQocikKKworCUBkYnVzLnNlcnZpY2UubWV0aG9kKAorCQlkYnVzX2ludGVyZmFjZT1WR19JTlRFUkZBQ0UsCisJCWluX3NpZ25hdHVyZT0ndGlhe3N2fScsCisJCW91dF9zaWduYXR1cmU9J28nLAorCQlhc3luY19jYWxsYmFja3M9KCdjYicsICdjYmUnKSkKKwlkZWYgRGVhY3RpdmF0ZShzZWxmLCBjb250cm9sX2ZsYWdzLCB0bW8sIGFjdGl2YXRlX29wdGlvbnMsIGNiLCBjYmUpOgorCQlyID0gUmVxdWVzdEVudHJ5KHRtbywgVmcuX3ZnX2FjdGl2YXRlX2RlYWN0aXZhdGUsCisJCQkJKHNlbGYuc3RhdGUuVXVpZCwgc2VsZi5zdGF0ZS5sdm1faWQsIEZhbHNlLAorCQkJCWNvbnRyb2xfZmxhZ3MsIGFjdGl2YXRlX29wdGlvbnMpLAorCQkJCWNiLCBjYmUsIHJldHVybl90dXBsZT1GYWxzZSkKKwkJY2ZnLndvcmtlcl9xLnB1dChyKQorCisJQHByb3BlcnR5CisJZGVmIFRhZ3Moc2VsZik6CisJCXJldHVybiB1dGlscy5wYXJzZV90YWdzKHNlbGYuc3RhdGUudGFncykKKworCUBwcm9wZXJ0eQorCWRlZiBQdnMoc2VsZik6CisJCXJldHVybiBzZWxmLnN0YXRlLlB2cworCisJQHByb3BlcnR5CisJZGVmIEx2cyhzZWxmKToKKwkJcmV0dXJuIHNlbGYuc3RhdGUuTHZzCisKKwlAcHJvcGVydHkKKwlkZWYgbHZtX2lkKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5zdGF0ZS5sdm1faWQKKworCUBwcm9wZXJ0eQorCWRlZiBXcml0ZWFibGUoc2VsZik6CisJCXJldHVybiBzZWxmLl9hdHRyaWJ1dGUoMCwgJ3cnKQorCisJQHByb3BlcnR5CisJZGVmIFJlYWRhYmxlKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDAsICdyJykKKworCUBwcm9wZXJ0eQorCWRlZiBSZXNpemVhYmxlKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDEsICd6JykKKworCUBwcm9wZXJ0eQorCWRlZiBFeHBvcnRhYmxlKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDIsICd4JykKKworCUBwcm9wZXJ0eQorCWRlZiBQYXJ0aWFsKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDMsICdwJykKKworCUBwcm9wZXJ0eQorCWRlZiBBbGxvY0NvbnRpZ3VvdXMoc2VsZik6CisJCXJldHVybiBzZWxmLl9hdHRyaWJ1dGUoNCwgJ2MnKQorCisJQHByb3BlcnR5CisJZGVmIEFsbG9jQ2xpbmcoc2VsZik6CisJCXJldHVybiBzZWxmLl9hdHRyaWJ1dGUoNCwgJ2wnKQorCisJQHByb3BlcnR5CisJZGVmIEFsbG9jTm9ybWFsKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDQsICduJykKKworCUBwcm9wZXJ0eQorCWRlZiBBbGxvY0FueXdoZXJlKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5fYXR0cmlidXRlKDQsICdhJykKKworCUBwcm9wZXJ0eQorCWRlZiBDbHVzdGVyZWQoc2VsZik6CisJCXJldHVybiBzZWxmLl9hdHRyaWJ1dGUoNSwgJ2MnKQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1ldGFkLy5naXRpZ25vcmUgYi9kYWVtb25zL2x2bWV0YWQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMwOTdlCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1ldGFkLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitsdm1ldGFkCitsdm1ldGFjdGwKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZXRhZC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvbHZtZXRhZC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNiZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1ldGFkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVMgPSBsdm1ldGFkLWNvcmUuYworU09VUkNFUzIgPSB0ZXN0Y2xpZW50LmMKKworVEFSR0VUUyA9IGx2bWV0YWQgbHZtZXRhY3RsCisKKy5QSE9OWTogaW5zdGFsbF9sdm1ldGFkCisKK0NGTE9XX0xJU1QgPSAkKFNPVVJDRVMpCitDRkxPV19MSVNUX1RBUkdFVCA9ICQoTElCX05BTUUpLmNmbG93CitDRkxPV19UQVJHRVQgPSBsdm1ldGFkCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitJTkNMVURFUyArPSAtSSQodG9wX3NyY2RpcikvbGliZGFlbW9uL3NlcnZlcgorTFZNTElCUyA9IC1sZGFlbW9uc2VydmVyICQoTFZNSU5URVJOQUxfTElCUykgLWxkZXZtYXBwZXIKKworTElCUyArPSAkKFBUSFJFQURfTElCUykKKworTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9saWJkYWVtb24vc2VydmVyICQoRVhUUkFfRVhFQ19MREZMQUdTKQorQ0xERkxBR1MgKz0gLUwkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlcgorQ0ZMQUdTICs9ICQoRVhUUkFfRVhFQ19DRkxBR1MpCisKK2x2bWV0YWQ6ICQoT0JKRUNUUykgJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9jbGllbnQvbGliZGFlbW9uY2xpZW50LmEgXAorCQkgICAgJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9zZXJ2ZXIvbGliZGFlbW9uc2VydmVyLmEKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpICQoTFZNTElCUykgJChMSUJTKQorCitsdm1ldGFjdGw6IGx2bWV0YWN0bC5vICQodG9wX2J1aWxkZGlyKS9saWJkYWVtb24vY2xpZW50L2xpYmRhZW1vbmNsaWVudC5hIFwKKwkkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlci9saWJkYWVtb25zZXJ2ZXIuYQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIGx2bWV0YWN0bC5vICQoTFZNTElCUykKKworQ0xFQU5fVEFSR0VUUyArPSBsdm1ldGFjdGwubworCisjIFRPRE86IE5vIGlkZWEuIE5vIGlkZWEgaG93IHRvIHRlc3QgZWl0aGVyLgorI2lmbmVxICgiJChDRkxPV19DTUQpIiwgIiIpCisjQ0ZMT1dfU09VUkNFUyA9ICQoYWRkcHJlZml4ICQoc3JjZGlyKS8sICQoU09VUkNFUykpCisjLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2xpYmRtL2xpYmRldm1hcHBlci5jZmxvdworIy1pbmNsdWRlICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmNmbG93CisjLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJsdm0yY21kLmNmbG93CisjLWluY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQvJChMSUJfTkFNRSkuY2Zsb3cKKyMtaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL21pcnJvci8kKExJQl9OQU1FKS1sdm0ybWlycm9yLmNmbG93CisjZW5kaWYKKworaW5zdGFsbF9sdm1ldGFkOiBsdm1ldGFkCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQoc2JpbmRpcikvJCg8RikKKworaW5zdGFsbF9sdm0yOiBpbnN0YWxsX2x2bWV0YWQKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWV0YWQvbHZtZXRhY3RsLmMgYi9kYWVtb25zL2x2bWV0YWQvbHZtZXRhY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyZWUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZXRhZC9sdm1ldGFjdGwuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICovCisKKyNpbmNsdWRlICJ0b29sLmgiCisKKyNpbmNsdWRlICJsdm1ldGFkLWNsaWVudC5oIgorCitkYWVtb25faGFuZGxlIGg7CisKK3N0YXRpYyB2b2lkIHByaW50X3JlcGx5KGRhZW1vbl9yZXBseSByZXBseSkKK3sKKwljb25zdCBjaGFyICphID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgTlVMTCk7CisJY29uc3QgY2hhciAqYiA9IGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJzdGF0dXMiLCBOVUxMKTsKKwljb25zdCBjaGFyICpjID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlYXNvbiIsIE5VTEwpOworCisJcHJpbnRmKCJyZXNwb25zZSBcIiVzXCIgc3RhdHVzIFwiJXNcIiByZWFzb24gXCIlc1wiXG4iLAorCSAgICAgICBhID8gYSA6ICIiLCBiID8gYiA6ICIiLCBjID8gYyA6ICIiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWRhZW1vbl9yZXBseSByZXBseTsKKwljaGFyICpjbWQ7CisJY2hhciAqdXVpZDsKKwljaGFyICpuYW1lOworCWludCB2YWw7CisJaW50IHZlcjsKKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYoImx2bWV0YWN0bCBkdW1wXG4iKTsKKwkJcHJpbnRmKCJsdm1ldGFjdGwgcHZfbGlzdFxuIik7CisJCXByaW50ZigibHZtZXRhY3RsIHZnX2xpc3RcbiIpOworCQlwcmludGYoImx2bWV0YWN0bCBnZXRfZ2xvYmFsX2luZm9cbiIpOworCQlwcmludGYoImx2bWV0YWN0bCB2Z19sb29rdXBfbmFtZSA8bmFtZT5cbiIpOworCQlwcmludGYoImx2bWV0YWN0bCB2Z19sb29rdXBfdXVpZCA8dXVpZD5cbiIpOworCQlwcmludGYoImx2bWV0YWN0bCBwdl9sb29rdXBfdXVpZCA8dXVpZD5cbiIpOworCQlwcmludGYoImx2bWV0YWN0bCBzZXRfZ2xvYmFsX2ludmFsaWQgMHwxXG4iKTsKKwkJcHJpbnRmKCJsdm1ldGFjdGwgc2V0X2dsb2JhbF9kaXNhYmxlIDB8MVxuIik7CisJCXByaW50ZigibHZtZXRhY3RsIHNldF92Z192ZXJzaW9uIDx1dWlkPiA8bmFtZT4gPHZlcnNpb24+XG4iKTsKKwkJcHJpbnRmKCJsdm1ldGFjdGwgdmdfbG9ja190eXBlIDx1dWlkPlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljbWQgPSBhcmd2WzFdOworCisJaCA9IGx2bWV0YWRfb3BlbihOVUxMKTsKKworCWlmICghc3RyY21wKGNtZCwgImR1bXAiKSkgeworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAiZHVtcCIsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50ZigiJXNcbiIsIHJlcGx5LmJ1ZmZlci5tZW0pOworCisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInB2X2xpc3QiKSkgeworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAicHZfbGlzdCIsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50ZigiJXNcbiIsIHJlcGx5LmJ1ZmZlci5tZW0pOworCisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInZnX2xpc3QiKSkgeworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAidmdfbGlzdCIsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50ZigiJXNcbiIsIHJlcGx5LmJ1ZmZlci5tZW0pOworCisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgImdldF9nbG9iYWxfaW5mbyIpKSB7CisJCXJlcGx5ID0gZGFlbW9uX3NlbmRfc2ltcGxlKGgsICJnZXRfZ2xvYmFsX2luZm8iLAorCQkJCQkgICAidG9rZW4gPSAlcyIsICJza2lwIiwKKwkJCQkJICAgInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClnZXRwaWQoKSwKKwkJCQkJICAgImNtZCA9ICVzIiwgImx2bWV0YWN0bCIsCisJCQkJCSAgIE5VTEwpOworCQlwcmludGYoIiVzXG4iLCByZXBseS5idWZmZXIubWVtKTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJzZXRfZ2xvYmFsX2ludmFsaWQiKSkgeworCQlpZiAoYXJnYyA8IDMpIHsKKwkJCXByaW50Zigic2V0X2dsb2JhbF9pbnZhbGlkIDB8MVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdmFsID0gYXRvaShhcmd2WzJdKTsKKworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAic2V0X2dsb2JhbF9pbmZvIiwKKwkJCQkJICAgImdsb2JhbF9pbnZhbGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSB2YWwsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50X3JlcGx5KHJlcGx5KTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJzZXRfZ2xvYmFsX2Rpc2FibGUiKSkgeworCQlpZiAoYXJnYyA8IDMpIHsKKwkJCXByaW50Zigic2V0X2dsb2JhbF9kaXNhYmxlIDB8MVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdmFsID0gYXRvaShhcmd2WzJdKTsKKworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAic2V0X2dsb2JhbF9pbmZvIiwKKwkJCQkJICAgImdsb2JhbF9kaXNhYmxlID0gIiBGTVRkNjQsIChpbnQ2NF90KSB2YWwsCisJCQkJCSAgICJkaXNhYmxlX3JlYXNvbiA9ICVzIiwgTFZNRVRBRF9ESVNBQkxFX1JFQVNPTl9ESVJFQ1QsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50X3JlcGx5KHJlcGx5KTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJzZXRfdmdfdmVyc2lvbiIpKSB7CisJCWlmIChhcmdjIDwgNSkgeworCQkJcHJpbnRmKCJzZXRfdmdfdmVyc2lvbiA8dXVpZD4gPG5hbWU+IDx2ZXI+XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl1dWlkID0gYXJndlsyXTsKKwkJbmFtZSA9IGFyZ3ZbM107CisJCXZlciA9IGF0b2koYXJndls0XSk7CisKKwkJaWYgKChzdHJsZW4odXVpZCkgPT0gMSkgJiYgKHV1aWRbMF0gPT0gJy0nKSkKKwkJCXV1aWQgPSBOVUxMOworCQlpZiAoKHN0cmxlbihuYW1lKSA9PSAxKSAmJiAobmFtZVswXSA9PSAnLScpKQorCQkJbmFtZSA9IE5VTEw7CisKKwkJaWYgKHV1aWQgJiYgbmFtZSkgeworCQkJcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoaCwgInNldF92Z19pbmZvIiwKKwkJCQkJCSAgICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJCQkJICAgIm5hbWUgPSAlcyIsIG5hbWUsCisJCQkJCQkgICAidmVyc2lvbiA9ICIgRk1UZDY0LCAoaW50NjRfdCkgdmVyLAorCQkJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkJICAgImNtZCA9ICVzIiwgImx2bWV0YWN0bCIsCisJCQkJCQkgICBOVUxMKTsKKwkJfSBlbHNlIGlmICh1dWlkKSB7CisJCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAic2V0X3ZnX2luZm8iLAorCQkJCQkJICAgInV1aWQgPSAlcyIsIHV1aWQsCisJCQkJCQkgICAidmVyc2lvbiA9ICIgRk1UZDY0LCAoaW50NjRfdCkgdmVyLAorCQkJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkJICAgImNtZCA9ICVzIiwgImx2bWV0YWN0bCIsCisJCQkJCQkgICBOVUxMKTsKKwkJfSBlbHNlIGlmIChuYW1lKSB7CisJCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAic2V0X3ZnX2luZm8iLAorCQkJCQkJICAgIm5hbWUgPSAlcyIsIG5hbWUsCisJCQkJCQkgICAidmVyc2lvbiA9ICIgRk1UZDY0LCAoaW50NjRfdCkgdmVyLAorCQkJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkJICAgImNtZCA9ICVzIiwgImx2bWV0YWN0bCIsCisJCQkJCQkgICBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigibmFtZSBvciB1dWlkIHJlcXVpcmVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXByaW50X3JlcGx5KHJlcGx5KTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICJ2Z19sb29rdXBfbmFtZSIpKSB7CisJCWlmIChhcmdjIDwgMykgeworCQkJcHJpbnRmKCJ2Z19sb29rdXBfbmFtZSA8bmFtZT5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW5hbWUgPSBhcmd2WzJdOworCisJCXJlcGx5ID0gZGFlbW9uX3NlbmRfc2ltcGxlKGgsICJ2Z19sb29rdXAiLAorCQkJCQkgICAibmFtZSA9ICVzIiwgbmFtZSwKKwkJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJCSAgICJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpZ2V0cGlkKCksCisJCQkJCSAgICJjbWQgPSAlcyIsICJsdm1ldGFjdGwiLAorCQkJCQkgICBOVUxMKTsKKwkJcHJpbnRmKCIlc1xuIiwgcmVwbHkuYnVmZmVyLm1lbSk7CisKKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAidmdfbG9va3VwX3V1aWQiKSkgeworCQlpZiAoYXJnYyA8IDMpIHsKKwkJCXByaW50ZigidmdfbG9va3VwX3V1aWQgPHV1aWQ+XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl1dWlkID0gYXJndlsyXTsKKworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAidmdfbG9va3VwIiwKKwkJCQkJICAgInV1aWQgPSAlcyIsIHV1aWQsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50ZigiJXNcbiIsIHJlcGx5LmJ1ZmZlci5tZW0pOworCisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInZnX2xvY2tfdHlwZSIpKSB7CisJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWV0YWRhdGE7CisJCWNvbnN0IGNoYXIgKmxvY2tfdHlwZTsKKworCQlpZiAoYXJnYyA8IDMpIHsKKwkJCXByaW50ZigidmdfbG9ja190eXBlIDx1dWlkPlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdXVpZCA9IGFyZ3ZbMl07CisKKwkJcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoaCwgInZnX2xvb2t1cCIsCisJCQkJCSAgICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJCQkgICAidG9rZW4gPSAlcyIsICJza2lwIiwKKwkJCQkJICAgInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClnZXRwaWQoKSwKKwkJCQkJICAgImNtZCA9ICVzIiwgImx2bWV0YWN0bCIsCisJCQkJCSAgIE5VTEwpOworCQkvKiBwcmludGYoIiVzXG4iLCByZXBseS5idWZmZXIubWVtKTsgKi8KKworCQltZXRhZGF0YSA9IGRtX2NvbmZpZ19maW5kX25vZGUocmVwbHkuY2Z0LT5yb290LCAibWV0YWRhdGEiKTsKKwkJaWYgKCFtZXRhZGF0YSkgeworCQkJcHJpbnRmKCJubyBtZXRhZGF0YVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxvY2tfdHlwZSA9IGRtX2NvbmZpZ19maW5kX3N0cihtZXRhZGF0YSwgIm1ldGFkYXRhL2xvY2tfdHlwZSIsIE5VTEwpOworCQlpZiAoIWxvY2tfdHlwZSkgeworCQkJcHJpbnRmKCJubyBsb2NrX3R5cGVcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpbnRmKCJsb2NrX3R5cGUgJXNcbiIsIGxvY2tfdHlwZSk7CisKKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAicHZfbG9va3VwX3V1aWQiKSkgeworCQlpZiAoYXJnYyA8IDMpIHsKKwkJCXByaW50ZigicHZfbG9va3VwX3V1aWQgPHV1aWQ+XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl1dWlkID0gYXJndlsyXTsKKworCQlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAicHZfbG9va3VwIiwKKwkJCQkJICAgInV1aWQgPSAlcyIsIHV1aWQsCisJCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgICAiY21kID0gJXMiLCAibHZtZXRhY3RsIiwKKwkJCQkJICAgTlVMTCk7CisJCXByaW50ZigiJXNcbiIsIHJlcGx5LmJ1ZmZlci5tZW0pOworCisJfSBlbHNlIHsKKwkJcHJpbnRmKCJ1bmtub3duIGNvbW1hbmRcbiIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CitvdXQ6CisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworb3V0X2Nsb3NlOgorCWRhZW1vbl9jbG9zZShoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZXRhZC9sdm1ldGFkLWNsaWVudC5oIGIvZGFlbW9ucy9sdm1ldGFkL2x2bWV0YWQtY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2YTM3OQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtZXRhZC9sdm1ldGFkLWNsaWVudC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTFZNRVRBRF9DTElFTlRfSAorI2RlZmluZSBfTFZNX0xWTUVUQURfQ0xJRU5UX0gKKworI2luY2x1ZGUgImRhZW1vbi1jbGllbnQuaCIKKworI2RlZmluZSBMVk1FVEFEX1NPQ0tFVCBERUZBVUxUX1JVTl9ESVIgIi9sdm1ldGFkLnNvY2tldCIKKworI2RlZmluZSBMVk1FVEFEX1RPS0VOX1VQREFURV9JTl9QUk9HUkVTUyAidXBkYXRlIGluIHByb2dyZXNzIgorCisjZGVmaW5lIExWTUVUQURfRElTQUJMRV9SRUFTT05fRElSRUNUCQkiRElSRUNUIgorI2RlZmluZSBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0xWTTEJCSJMVk0xIgorI2RlZmluZSBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0RVUExJQ0FURVMJIkRVUExJQ0FURVMiCisjZGVmaW5lIExWTUVUQURfRElTQUJMRV9SRUFTT05fVkdSRVNUT1JFCSJWR1JFU1RPUkUiCisKK3N0cnVjdCB2b2x1bWVfZ3JvdXA7CisKKy8qIERpZmZlcmVudCB0eXBlcyBvZiByZXBsaWVzIHdlIG1heSBnZXQgZnJvbSBsdm1ldGFkLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJZGFlbW9uX3JlcGx5IHI7CisJY29uc3QgY2hhciAqKnV1aWRzOyAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgKi8KK30gbHZtZXRhZF91dWlkbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRhZW1vbl9yZXBseSByOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworfSBsdm1ldGFkX3ZnOworCisvKiBHZXQgYSBsaXN0IG9mIFZHIFVVSURzIHRoYXQgbWF0Y2ggYSBnaXZlbiBWRyBuYW1lLiAqLworbHZtZXRhZF91dWlkbGlzdCBsdm1ldGFkX2xvb2t1cF92Z25hbWUoZGFlbW9uX2hhbmRsZSBoLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogR2V0IHRoZSBtZXRhZGF0YSBvZiBhIHNpbmdsZSBWRywgaWRlbnRpZmllZCBieSBVVUlELiAqLworbHZtZXRhZF92ZyBsdm1ldGFkX2dldF92ZyhkYWVtb25faGFuZGxlIGgsIGNvbnN0IGNoYXIgKnV1aWQpOworCisvKgorICogQWRkIGFuZCByZW1vdmUgUFZzIG9uIGRlbWFuZC4gVWRldi1kcml2ZW4gc3lzdGVtcyB3aWxsIHVzZSB0aGlzIGludGVyZmFjZQorICogaW5zdGVhZCBvZiBzY2FubmluZy4KKyAqLworZGFlbW9uX3JlcGx5IGx2bWV0YWRfYWRkX3B2KGRhZW1vbl9oYW5kbGUgaCwgY29uc3QgY2hhciAqcHZfdXVpZCwgY29uc3QgY2hhciAqbWRhX2NvbnRlbnQpOworZGFlbW9uX3JlcGx5IGx2bWV0YWRfcmVtb3ZlX3B2KGRhZW1vbl9oYW5kbGUgaCwgY29uc3QgY2hhciAqcHZfdXVpZCk7CisKKy8qIFRyaWdnZXIgYSBmdWxsIGRpc2sgc2NhbiwgdGhyb3dpbmcgYXdheSBhbGwgY2FjaGVzLiBYWFggZG8gd2UgZXZlbnR1YWxseSB3YW50CisgKiB0aGlzPyBQcm9iYWJseSBub3QgeWV0LCBhbnl3YXkuCisgKiAgICAgZGFlbW9uX3JlcGx5IGx2bWV0YWRfcmVzY2FuKGRhZW1vbl9oYW5kbGUgaCk7CisgKi8KKworLyoKKyAqIFVwZGF0ZSB0aGUgdmVyc2lvbiBvZiBtZXRhZGF0YSBvZiBhIHZvbHVtZSBncm91cC4gVGhlIFZHIGhhcyB0byBiZSBsb2NrZWQgZm9yCisgKiB3cml0aW5nIGZvciB0aGlzLCBhbmQgdGhlIFZHIG1ldGFkYXRhIGhlcmUgaGFzIHRvIG1hdGNoIHdoYXRldmVyIGhhcyBiZWVuCisgKiB3cml0dGVuIHRvIHRoZSBkaXNrICh1bmRlciB0aGlzIGxvY2spLiBUaGlzIGluaXRpYWxseSBhdm9pZHMgdGhlIHJlcXVpcmVtZW50CisgKiBmb3IgbHZtZXRhZCB0byB3cml0ZSB0byBkaXNrIChpbiBsYXRlciByZXZpc2lvbnMsIGx2bWV0YWRfc3VwZXJzZWRlX3ZnIG1heQorICogYWxzbyBkbyB0aGUgd3JpdGluZywgb3Igd2UgcHJvYmFibHkgYWRkIGFub3RoZXIgZnVuY3Rpb24gdG8gZG8gdGhhdCkuCisgKi8KK2RhZW1vbl9yZXBseSBsdm1ldGFkX3N1cGVyc2VkZV92ZyhkYWVtb25faGFuZGxlIGgsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworLyogV3JhcHBlcnMgdG8gb3Blbi9jbG9zZSBjb25uZWN0aW9uICovCisKK3N0YXRpYyBpbmxpbmUgZGFlbW9uX2hhbmRsZSBsdm1ldGFkX29wZW4oY29uc3QgY2hhciAqc29ja2V0KQoreworCWRhZW1vbl9pbmZvIGx2bWV0YWRfaW5mbyA9IHsKKwkJLnBhdGggPSAibHZtZXRhZCIsCisJCS5zb2NrZXQgPSBzb2NrZXQgPzogTFZNRVRBRF9TT0NLRVQsCisJCS5wcm90b2NvbCA9ICJsdm1ldGFkIiwKKwkJLnByb3RvY29sX3ZlcnNpb24gPSAxLAorCQkuYXV0b3N0YXJ0ID0gMAorCX07CisKKwlyZXR1cm4gZGFlbW9uX29wZW4obHZtZXRhZF9pbmZvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGx2bWV0YWRfY2xvc2UoZGFlbW9uX2hhbmRsZSBoKQoreworCXJldHVybiBkYWVtb25fY2xvc2UoaCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1ldGFkL2x2bWV0YWQtY29yZS5jIGIvZGFlbW9ucy9sdm1ldGFkL2x2bWV0YWQtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWV0YWQvbHZtZXRhZC1jb3JlLmMKQEAgLTAsMCArMSwzMDA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBfWE9QRU5fU09VUkNFIDUwMCAgLyogcHRocmVhZCAqLworCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1pby5oIgorI2luY2x1ZGUgImRhZW1vbi1zZXJ2ZXIuaCIKKyNpbmNsdWRlICJkYWVtb24tbG9nLmgiCisjaW5jbHVkZSAibHZtLXZlcnNpb24uaCIKKyNpbmNsdWRlICJsdm1ldGFkLWNsaWVudC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNkZWZpbmUgTFZNRVRBRF9TT0NLRVQgREVGQVVMVF9SVU5fRElSICIvbHZtZXRhZC5zb2NrZXQiCisKKy8qCisgKiBjYWNoZSBzdGF0ZXM6CisgKiAuIEVtcHR5OiBubyBkZXZpY2VzIHZpc2libGUgdG8gdGhlIHN5c3RlbSBoYXZlIGJlZW4gYWRkZWQgdG8gbHZtZXRhZAorICogLiBTY2FubmluZzogc29tZSBkZXZpY2VzIHZpc2libGUgdG8gdGhlIHN5c3RlbSBoYXZlIGJlZW4gYWRkZWQgdG8gbHZtZXRhZAorICogLiBJbml0aWFsaXplZDogYWxsIGRldmljZXMgdmlzaWJsZSB0byB0aGUgc3lzdGVtIGhhdmUgYmVlbiBhZGRlZCB0byBsdm1ldGFkCisgKiAuIE91dGRhdGVkOiBldmVudCBvbiBzeXN0ZW0gb3Igc3RvcmFnZSBpcyBub3QgeWV0IHByb2Nlc3NlZCBieSBsdm1ldGFkCisgKiAgIE91dGRhdGVkIHZhcmlhdGlvbnM6CisgKiAgIC0gTWlzc2luZ0RldjogZGV2aWNlIGFkZGVkIHRvIHN5c3RlbSwgbm90IHlldCBhZGRlZCB0byBsdm1ldGFkCisgKiAgIC0gUmVtb3ZlZERldjogZGV2aWNlIHJlbW92ZWQgZnJvbSBzeXN0ZW0sIG5vdCB5ZXQgcmVtb3ZlZCBmcm9tIGx2bWV0YWQKKyAqICAgLSBNaXNzaW5nVkc6IG5ldyB2ZyBpcyB3cml0dGVuIG9uIGRpc2ssIG5vdCB5ZXQgYWRkZWQgdG8gbHZtZXRhZAorICogICAtIFJlbW92ZWRWRzogdmcgaXMgcmVtb3ZlZCBvbiBkaXNrLCBub3QgeWV0IHJlbW92ZWQgaW4gbHZtZXRhZAorICogICAtIENoYW5nZWRWRzogdmcgbWV0YWRhdGEgaXMgY2hhbmdlZCBvbiBkaXNrLCBub3QgeWV0IHVwZGF0ZWQgaW4gbHZtZXRhZAorICogICAtIE1pc3NpbmdQVjogbmV3IHB2IGlzIHdyaXR0ZW4gb24gZGlzaywgbm90IHlldCBhZGRlZCB0byBpbiBsdm1ldGFkCisgKiAgIC0gUmVtb3ZlZFBWOiBwdiBpcyByZW1vdmVkIG9uIGRpc2ssIG5vdCB5ZXQgcmVtb3ZlZCBpbiBsdm1ldGFkCisgKiAgIC0gQ2hhbmdlZFBWOiBwdiBtZXRhZGF0YSBpcyBjaGFuZ2VkIG9uIGRpc2ssIG5vdCB5ZXQgdXBkYXRlZCBpbiBsdm1ldGFkCisgKiAuIFVwZGF0ZWQ6IGV2ZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IGx2bWV0YWQKKyAqCisgKiBzdGF0ZSB0cmFuc2l0aW9uczoKKyAqIC4gRW1wdHkgLT4gU2Nhbm5pbmcKKyAqIC4gU2Nhbm5pbmcgLT4gSW5pdGlhbGl6ZWQKKyAqIC4gSW5pdGlhbGl6ZWQgLT4gU2Nhbm5pbmcKKyAqIC4gSW5pdGlhbGl6ZWQgLT4gT3V0ZGF0ZWQKKyAqIC4gT3V0ZGF0ZWQgLT4gVXBkYXRlZAorICogLiBVcGRhdGVkIC0+IE91dGRhdGVkCisgKiAuIFVwZGF0ZWQgLT4gU2Nhbm5pbmcKKyAqIC4gT3V0ZGF0ZWQgLT4gU2Nhbm5pbmcKKyAqCisgKiBzdGF0ZSB0cmFuc2l0aW9ucyBjYXVzZWQgYnk6CisgKiAuIEVtcHR5IGlzIGNhdXNlZCBieToKKyAqICAgLSBzdGFydGluZy9yZXN0YXJ0aW5nIGx2bWV0YWQKKyAqIC4gU2Nhbm5pbmcgaXMgY2F1c2VkIGJ5OgorICogICAtIHJ1bm5pbmcgcHZzY2FuIC0tY2FjaGUKKyAqICAgLSBydW5uaW5nIGFueSBjb21tYW5kIHdpdGggZGlmZmVyZW50IGdsb2JhbF9maWx0ZXIgKHRva2VuIG1pc21hdGNoKQorICogICAtIHJ1bm5pbmcgYW55IGNvbW1hbmQgd2hpbGUgbHZtZXRhZCBpcyBFbXB0eQorICogICAtIHJ1bm5pbmcgYSByZXBvcnQvZGlzcGxheSBjb21tYW5kIHdpdGggLS1mb3JlaWduCisgKiAgIC0gcnVubmluZyBhIHJlcG9ydC9kaXNwbGF5IGNvbW1hbmQgd2l0aCAtLXNoYXJlZAorICogICAtIHJ1bm5pbmcgYSBjb21tYW5kIHVzaW5nIGx2bWxvY2tkIGdsb2JhbCBsb2NrIHdoZXJlIGdsb2JhbCBzdGF0ZSBpcyBjaGFuZ2VkCisgKiAuIEluaXRpYWxpemVkIGlzIGNhdXNlZCBieToKKyAqICAgLSBjb21wbGV0aW9uIG9mIFNjYW5uaW5nCisgKiAuIE91dGRhdGVkIGlzIGNhdXNlZCBieToKKyAqICAgLSBkZXZpY2UgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgc3lzdGVtCisgKiAgIC0gY3JlYXRpbmcvcmVtb3ZpbmcvY2hhbmdpbmcgYSBWRworICogICAtIGNyZWF0aW5nL3JlbW92aW5nL2NoYW5naW5nIGEgUFYKKyAqIC4gVXBkYXRlZCBpcyBjYXVzZWQgYnk6CisgKiAgIC0gcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIGFsbCBldmVudHMKKyAqCisgKiByZXF1ZXN0IGhhbmRsaW5nOgorICogLiBFbXB0eTogc2hvcnQgcGVyaW9kIGR1cmluZyBzdGFydHVwLCB0b2tlbiBlcnJvciByZXR1cm5lZAorICogLiBTY2FubmluZzogc2hvdWxkIGJlIHZlcnkgc2hvcnQsIGx2bWV0YWQgcmVzcG9uZHMgdG8gcmVxdWVzdHMgd2l0aAorICogICB0aGUgdG9rZW4gZXJyb3IgInVwZGF0aW5nIgorICogLiBJbml0aWFsaXplZDogbHZtZXRhZCByZXNwb25kcyB0byByZXF1ZXN0cworICogLiBVcGRhdGVkOiBsdm1ldGFkIHJlc3BvbmRzIHRvIHJlcXVlc3RzCisgKiAuIE91dGRhdGVkOiBzaG91bGQgYmUgdmVyeSBzaG9ydCwgbHZtZXRhZCByZXNwb25kcyB0byByZXF1ZXN0cworICoKKyAqIEluIGdlbmVyYWwsIHRoZSBjYWNoZSBzdGF0ZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0cmFuc2l0aW9uCisgKiAiVXBkYXRlZCAtPiBTY2FubmluZyAtPiBJbml0aWFsaXplZCIgc2hvdWxkIG1hdGNoLCB1bmxlc3MKKyAqIGV2ZW50cyBvY2N1ciBkdXJpbmcgdGhhdCB0cmFuc2l0aW9uLgorICoKKyAqIFRoZSBTY2FubmluZyBzdGF0ZSBpbmNsdWRlczoKKyAqIC4gcmVjZWl2ZSBhIHJlcXVlc3QgdG8gc2V0IHRoZSB0b2tlbiB0byAidXBkYXRpbmciIChTY2FubmluZyBzdGF0ZSBiZWdpbnMuKQorICogLiByZWNlaXZlIGEgcHZfY2xlYXJfYWxsIHJlcXVlc3QgdG8gY2xlYXIgY3VycmVudCBjYWNoZQorICogLiByZWNlaXZlIGEgbnVtYmVyIG9mIHB2X2ZvdW5kIGV2ZW50cyB0byByZXBvcHVsYXRlIGNhY2hlCisgKiAuIHJlY2VpdmUgYSByZXF1ZXN0IHRvIHNldCB0aGUgdG9rZW4gdG8gYSBoYXNoIHZhbHVlIChJbml0aWFsaXplZCBzdGF0ZSBiZWdpbnMuKQorICoKKyAqIFRoZSB0cmFuc2l0aW9uIGZyb20gT3V0ZGF0ZWQgdG8gVXBkYXRlZCBkZXBlbmRzIG9uIGx2bSBjb21tYW5kcworICogc2VuZGluZyBldmVudHMgdG8gbHZtZXRhZCwgaS5lLiBwdl9mb3VuZCwgcHZfZ29uZSwgdmdfdXBkYXRlLAorICogdmdfcmVtb3ZlLiAgUHJpb3IgdG8gcmVjZWl2aW5nIHRoZXNlIGV2ZW50cywgbHZtZXRhZCBpcyBub3QgYXdhcmUKKyAqIHRoYXQgaXQgaXMgaW4gdGhlIE91dGRhdGVkIHN0YXRlLgorICoKKyAqIFdoZW4gdXNpbmcgYSBzaGFyZWQgVkcgd2l0aCBsdm1sb2NrZCwgdGhlIE91dGRhdGVkIHN0YXRlIGNhbiBsYXN0IGEKKyAqIGxvbmdlciB0aW1lLCBidXQgaXQgd29uJ3QgYmUgdXNlZCBpbiB0aGF0IHN0YXRlLiAgbHZtbG9ja2QgZm9yY2VzIGEKKyAqIHRyYW5zaXRpb24gIk91dGRhdGVkIC0+IFNjYW5uaW5nIC0+IEluaXRpYWxpemVkIiBiZWZvcmUgdGhlIGNhY2hlCisgKiBpcyB1c2VkLgorICovCisKKworLyoKKyAqIHZhbGlkL2ludmFsaWQgc3RhdGUgb2YgY2FjaGVkIG1ldGFkYXRhCisgKgorICogTm9ybWFsbHkgd2hlbiB1c2luZyBsdm1ldGFkLCB0aGUgc3RhdGUgaXMga2VwdCB1cC10by1kYXRlIHRocm91Z2ggYQorICogY29tYmluYXRpb24gb2Ygbm90aWZpY2F0aW9ucyBmcm9tIGNsaWVudHMgYW5kIHVwZGF0ZXMgdHJpZ2dlcmVkIGJ5IHVldmVudHMuCisgKiBXaGVuIHVzaW5nIGx2bWxvY2tkLCB0aGUgbHZtZXRhZCBzdGF0ZSBpcyBleHBlY3RlZCB0byBiZWNvbWUgb3V0IG9mCisgKiBkYXRlIChpbnZhbGlkL3N0YWxlKSB3aGVuIG90aGVyIGhvc3RzIG1ha2UgY2hhbmdlcyB0byB0aGUgbWV0YWRhdGEgb24gZGlzay4KKyAqCisgKiBUbyBkZWFsIHdpdGggdGhpcywgdGhlIG1ldGFkYXRhIGNhY2hlZCBpbiBsdm1ldGFkIGNhbiBiZSBmbGFnZ2VkIGFzIGludmFsaWQuCisgKiBUaGlzIGludmFsaWQgZmxhZyBpcyByZXR1cm5lZCBhbG9uZyB3aXRoIHRoZSBtZXRhZGF0YSB3aGVuIHJlYWQgYnkgYQorICogY29tbWFuZC4gIFRoZSBjb21tYW5kIGNhbiBjaGVjayBmb3IgdGhlIGludmFsaWQgZmxhZyBhbmQgZGVjaWRlIHRoYXQgaXQKKyAqIHNob3VsZCBlaXRoZXIgdXNlIHRoZSBzdGFsZSBtZXRhZGF0YSAodW5jb21tb24pLCBvciByZWFkIHRoZSBsYXRlc3QgbWV0YWRhdGEKKyAqIGZyb20gZGlzayByYXRoZXIgdGhhbiB1c2luZyB0aGUgaW52YWxpZCBtZXRhZGF0YSB0aGF0IHdhcyByZXR1cm5lZC4gIElmIHRoZQorICogY29tbWFuZCByZWFkcyB0aGUgbGF0ZXN0IG1ldGFkYXRhIGZyb20gZGlzaywgaXQgY2FuIGNob29zZSB0byBzZW5kIGl0IHRvCisgKiBsdm1ldGFkIHRvIHVwZGF0ZSB0aGUgY2FjaGVkIGNvcHkgYW5kIGNsZWFyIHRoZSBpbnZhbGlkIGZsYWcgaW4gbHZtZXRhZC4KKyAqIE90aGVyd2lzZSwgdGhlIG5leHQgY29tbWFuZCB0byByZWFkIHRoZSBtZXRhZGF0YSBmcm9tIGx2bWV0YWQgd2lsbCBhbHNvCisgKiByZWNlaXZlIHRoZSBpbnZhbGlkIG1ldGFkYXRhIHdpdGggdGhlIGludmFsaWQgZmxhZyAoYW5kIGxpa2UgdGhlIHByZXZpb3VzCisgKiBjb21tYW5kLCBpdCB0b28gbWF5IGNob29zZSB0byByZWFkIHRoZSBsYXRlc3QgbWV0YWRhdGEgZnJvbSBkaXNrIGFuZCBjYW4KKyAqIHRoZW4gYWxzbyBjaG9vc2UgdG8gdXBkYXRlIHRoZSBsdm1ldGFkIGNvcHkuKQorICoKKyAqIEZvciBwdXJwb3NlcyBvZiB0cmFja2luZyB0aGUgaW52YWxpZCBzdGF0ZSwgTFZNIG1ldGFkYXRhIGlzIGNvbnNpZGVyZWQKKyAqIHRvIGJlIGVpdGhlciBWRy1zcGVjaWZpYyBvciBnbG9iYWwuICBWRy1zcGVjaWZpYyBtZXRhZGF0YSBpcyBtZXRhZGF0YQorICogdGhhdCBpcyBpc29sYXRlZCB0byBhIFZHLCBzdWNoIGFzIHRoZSBMVnMgaXQgY29udGFpbnMuICBHbG9iYWwKKyAqIG1ldGFkYXRhIGlzIG1ldGFkYXRhIHRoYXQgaXMgbm90IGlzb2xhdGVkIHRvIGEgc2luZ2xlIFZHLiAgR2xvYmFsCisgKiBtZXRkYXRhIGluY2x1ZGVzOgorICogLiB0aGUgVkcgbmFtZXNwYWNlICh3aGljaCBWRyBuYW1lcyBhcmUgdXNlZCkKKyAqIC4gdGhlIHNldCBvZiBvcnBoYW4gUFZzICh3aGljaCBQVnMgYXJlIGluIFZHcyBhbmQgd2hpY2ggYXJlIG5vdCkKKyAqIC4gcHJvcGVydGllcyBvZiBvcnBoYW4gUFZzICh0aGUgc2l6ZSBvZiBhbiBvcnBoYW4gUFYpCisgKgorICogSWYgdGhlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSBWRyBiZWNvbWVzIGludmFsaWQsIHRoZSBWR0ZMX0lOVkFMSUQKKyAqIGZsYWcgY2FuIGJlIHNldCBpbiB0aGUgdmdfaW5mbyBzdHJ1Y3QgZm9yIHRoYXQgVkcuICBJZiB0aGUgZ2xvYmFsCisgKiBtZXRkYXRhIGJlY29tZXMgaW52YWxpZCwgdGhlIEdMRkxfSU5WQUxJRCBmbGFnIGNhbiBiZSBzZXQgaW4gdGhlCisgKiBsdm1ldGFkIGRhZW1vbiBzdGF0ZS4KKyAqCisgKiBJZiBhIGNvbW1hbmQgcmVhZHMgVkcgbWV0YWRhdGEgYW5kIFZHRkxfSU5WQUxJRCBpcyBzZXQsIGFuCisgKiBleHRyYSBjb25maWcgbm9kZSBjYWxsZWQgInZnX2ludmFsaWQiIGlzIGFkZGVkIHRvIHRoZSBjb25maWcKKyAqIGRhdGEgcmV0dXJuZWQgdG8gdGhlIGNvbW1hbmQuCisgKgorICogSWYgYSBjb21tYW5kIHJlYWRzIGdsb2JhbCBtZXRkYXRhIGFuZCBHTEZMX0lOVkFMSUQgaXMgc2V0LCBhbgorICogZXh0cmEgY29uZmlnIG5vZGUgY2FsbGVkICJnbG9iYWxfaW52YWxpZCIgaXMgYWRkZWQgdG8gdGhlCisgKiBjb25maWcgZGF0YSByZXR1cm5lZCB0byB0aGUgY29tbWFuZC4KKyAqCisgKiBJZiBhIGNvbW1hbmQgc2VlcyB2Z19pbnZhbGlkLCBhbmQgd2FudHMgdGhlIGxhdGVzdCBWRyBtZXRhZGF0YSwKKyAqIGl0IG9ubHkgbmVlZHMgdG8gc2NhbiBkaXNrcyBvZiB0aGUgUFZzIGluIHRoYXQgVkcuCisgKiBJdCBjYW4gdGhlbiB1c2UgdmdfdXBkYXRlIHRvIHNlbmQgdGhlIGxhdGVzdCBtZXRhZGF0YSB0byBsdm1ldGFkCisgKiB3aGljaCBjbGVhcnMgdGhlIFZHRkxfSU5WQUxJRCBmbGFnLgorICoKKyAqIElmIGEgY29tbWFuZCBzZWVzIGdsb2JhbF9pbnZhbGlkLCBhbmQgd2FudHMgdGhlIGxhdGVzdCBtZXRhZGF0YSwKKyAqIGl0IHNob3VsZCBzY2FuIGFsbCBkZXZpY2VzIHRvIHVwZGF0ZSBsdm1ldGFkLCBhbmQgdGhlbiBzZW5kCisgKiBsdm1ldGFkIHRoZSAic2V0X2dsb2JhbF9pbmZvIGdsb2JhbF9pbnZhbGlkPTAiIG1lc3NhZ2UgdG8gY2xlYXIKKyAqIEdMRkxfSU5WQUxJRC4KKyAqCisgKiAoV2hlbiByZXNjYW5uaW5nIGRldmljZXMgdG8gdXBkYXRlIGx2bWV0YWQsIHRoZSBjb21tYW5kIG11c3QgdXNlCisgKiB0aGUgZ2xvYmFsIGZpbHRlciBjbWQtPmx2bWV0YWRfZmlsdGVyIHNvIHRoYXQgaXQgcHJvY2Vzc2VzIHRoZSBzYW1lCisgKiBkZXZpY2VzIHRoYXQgYXJlIHNlZW4gYnkgbHZtZXRhZC4pCisgKgorICogVGhlIGx2bWV0YWQgSU5WQUxJRCBmbGFncyBjYW4gYmUgc2V0IGJ5IHNlbmRpbmcgbHZtZXRhZCB0aGUgbWVzc2FnZXM6CisgKgorICogLiBzZXRfdmdfaW5mbyB3aXRoIHRoZSBsYXRlc3QgVkcgc2Vxbm8uICBJZiB0aGUgVkcgc2Vxbm8gaXMgbGFyZ2VyCisgKiAgIHRoYW4gdGhlIGNhY2hlZCBWRyBzZXFubywgVkdGTF9JTlZBTElEIGlzIHNldCBmb3IgdGhlIFZHLgorICoKKyAqIC4gc2V0X2dsb2JhbF9pbmZvIHdpdGggZ2xvYmFsX2ludmFsaWQ9MSBzZXRzIEdMRkxfSU5WQUxJRC4KKyAqCisgKiBEaWZmZXJlbnQgZW50aXRpZXMgY291bGQgdXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBpbnZhbGlkYXRlIG1ldGFkYXRhCisgKiBpZi93aGVuIHRoZXkgZGV0ZWN0ZWQgdGhhdCB0aGUgY2FjaGUgaXMgc3RhbGUuICBIb3cgdGhleSBkZXRlY3QgdGhhdAorICogdGhlIGNhY2hlIGlzIHN0YWxlIGRlcGVuZHMgb24gdGhlIGRldGFpbHMgb2YgdGhlIHNwZWNpZmljIGVudGl0eS4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBsdm1sb2NrZCwgaXQgZW1iZWRzIHZhbHVlcyBpbnRvIGl0cyBsb2NrcyB0byBrZWVwIHRyYWNrCisgKiBvZiB3aGVuIG90aGVyIG5vZGVzIGhhdmUgY2hhbmdlZCBtZXRhZGF0YSBvbiBkaXNrIHJlbGF0ZWQgdG8gdGhvc2UgbG9ja3MuCisgKiBXaGVuIGFjcXVyaW5nIGxvY2tzIGl0IGNhbiBsb29rIGF0IHRoZXNlIHZhbHVlcyBhbmQgZGV0ZWN0IHRoYXQKKyAqIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2sgaGFzIGJlZW4gY2hhbmdlZC4KKyAqIFdoZW4gdGhlIHZhbHVlcyBjaGFuZ2UsIGl0IHVzZXMgc2V0X3ZnX2luZm8vc2V0X2dsb2JhbF9pbmZvIHRvCisgKiBpbnZhbGlkYXRlIHRoZSBsdm1ldGFkIGNhY2hlLgorICoKKyAqIFRoZSB2YWx1ZXMgdGhhdCBsdm1sb2NrZCBkaXN0cmlidXRlcyB0aHJvdWdoIGl0cyBsb2NrcyBhcmUgdGhlCisgKiBsYXRlc3QgVkcgc2Vxbm8gaW4gVkcgbG9ja3MgYW5kIGEgZ2xvYmFsIGNvdW50ZXIgaW4gdGhlIGdsb2JhbCBsb2NrLgorICogV2hlbiBhIGhvc3QgYWNxdWlyZXMgYSBWRyBsb2NrIGFuZCBzZWVzIHRoYXQgdGhlIGVtYmVkZGVkIHNlcW5vIGlzCisgKiBsYXJnZXIgdGhhbiBpdCB3YXMgcHJldmlvdXNseSwgaXQga25vd3MgdGhhdCBpdCBzaG91bGQgaW52YWxpZGF0ZSB0aGUKKyAqIGx2bWV0YWQgY2FjaGUgZm9yIHRoZSBWRy4gIElmIHRoZSBob3N0IGFjcXVpcmVzIHRoZSBnbG9iYWwgbG9jaworICogYW5kIHNlZXMgdGhhdCB0aGUgY291bnRlciBpcyBsYXJnZXIgdGhhbiBwcmV2aW91c2x5LCBpdCBrbm93cyB0aGF0CisgKiBpdCBzaG91bGQgaW52YWxpZGF0ZSB0aGUgZ2xvYmFsIGluZm8gaW4gbHZtZXRhZC4gIFRoaXMgaW52YWxpZGF0aW9uCisgKiBpcyBkb25lIGJlZm9yZSB0aGUgbG9jayBpcyByZXR1cm5lZCB0byB0aGUgY29tbWFuZC4gIFRoaXMgd2F5IHRoZQorICogaW52YWxpZCBmbGFnIHdpbGwgYmUgc2V0IG9uIHRoZSBtZXRhZGF0YSBiZWZvcmUgdGhlIGNvbW1hbmQgcmVhZHMKKyAqIGl0IGZyb20gbHZtZXRhZC4KKyAqLworCitzdHJ1Y3QgdmdfaW5mbyB7CisJaW50NjRfdCBleHRlcm5hbF92ZXJzaW9uOworCXVpbnQzMl90IGZsYWdzOyAvKiBWR0ZMXyAqLworfTsKKworI2RlZmluZSBHTEZMX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTEZMX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTEZMX0RJU0FCTEVfUkVBU09OX0RJUkVDVCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTEZMX0RJU0FCTEVfUkVBU09OX0xWTTEgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTEZMX0RJU0FCTEVfUkVBU09OX0RVUExJQ0FURVMgMHgwMDAwMDAxMAorI2RlZmluZSBHTEZMX0RJU0FCTEVfUkVBU09OX1ZHUkVTVE9SRSAgMHgwMDAwMDAyMAorCisjZGVmaW5lIEdMRkxfRElTQUJMRV9SRUFTT05fQUxMIChHTEZMX0RJU0FCTEVfUkVBU09OX0RJUkVDVCB8IEdMRkxfRElTQUJMRV9SRUFTT05fTFZNMSB8IEdMRkxfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUyB8IEdMRkxfRElTQUJMRV9SRUFTT05fVkdSRVNUT1JFKQorCisjZGVmaW5lIFZHRkxfSU5WQUxJRCAweDAwMDAwMDAxCisKKyNkZWZpbmUgQ01EX05BTUVfU0laRSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisJZGFlbW9uX2lkbGUgKmlkbGU7CisJbG9nX3N0YXRlICpsb2c7IC8qIGNvbnZlbmllbmNlICovCisJY29uc3QgY2hhciAqbG9nX2NvbmZpZzsKKworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdmlkX3RvX3B2bWV0YTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqZGV2aWNlX3RvX3B2aWQ7IC8qIHNoYXJlcyBsb2NrcyB3aXRoIGFib3ZlICovCisKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdmdpZF90b19tZXRhZGF0YTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdmdpZF90b192Z25hbWU7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKnZnaWRfdG9fb3V0ZGF0ZWRfcHZzOworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICp2Z2lkX3RvX2luZm87CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKnZnbmFtZV90b192Z2lkOworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdmlkX3RvX3ZnaWQ7CisJY2hhciB0b2tlblsxMjhdOworCWNoYXIgdXBkYXRlX2NtZFtDTURfTkFNRV9TSVpFXTsKKwlpbnQgdXBkYXRlX3BpZDsKKwlpbnQgdXBkYXRlX3RpbWVvdXQ7CisJdWludDY0X3QgdXBkYXRlX2JlZ2luOworCXVpbnQzMl90IGZsYWdzOyAvKiBHTEZMXyAqLworCXB0aHJlYWRfbXV0ZXhfdCB0b2tlbl9sb2NrOworCXB0aHJlYWRfbXV0ZXhfdCBpbmZvX2xvY2s7CisJcHRocmVhZF9yd2xvY2tfdCBjYWNoZV9sb2NrOworfSBsdm1ldGFkX3N0YXRlOworCitzdGF0aWMgdWludDY0X3QgX21vbm90b25pY19zZWNvbmRzKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRzLnR2X3NlYzsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9tZXRhZGF0YV9oYXNoZXMobHZtZXRhZF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuID0gTlVMTDsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBzLT52Z2lkX3RvX21ldGFkYXRhKQorCQlkbV9jb25maWdfZGVzdHJveShkbV9oYXNoX2dldF9kYXRhKHMtPnZnaWRfdG9fbWV0YWRhdGEsIG4pKTsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBzLT52Z2lkX3RvX291dGRhdGVkX3B2cykKKwkJZG1fY29uZmlnX2Rlc3Ryb3koZG1faGFzaF9nZXRfZGF0YShzLT52Z2lkX3RvX291dGRhdGVkX3B2cywgbikpOworCisJZG1faGFzaF9pdGVyYXRlKG4sIHMtPnB2aWRfdG9fcHZtZXRhKQorCQlkbV9jb25maWdfZGVzdHJveShkbV9oYXNoX2dldF9kYXRhKHMtPnB2aWRfdG9fcHZtZXRhLCBuKSk7CisKKwlkbV9oYXNoX2Rlc3Ryb3kocy0+cHZpZF90b19wdm1ldGEpOworCWRtX2hhc2hfZGVzdHJveShzLT52Z2lkX3RvX21ldGFkYXRhKTsKKwlkbV9oYXNoX2Rlc3Ryb3kocy0+dmdpZF90b192Z25hbWUpOworCWRtX2hhc2hfZGVzdHJveShzLT52Z2lkX3RvX291dGRhdGVkX3B2cyk7CisJZG1faGFzaF9kZXN0cm95KHMtPnZnaWRfdG9faW5mbyk7CisJZG1faGFzaF9kZXN0cm95KHMtPnZnbmFtZV90b192Z2lkKTsKKworCWRtX2hhc2hfZGVzdHJveShzLT5kZXZpY2VfdG9fcHZpZCk7CisJZG1faGFzaF9kZXN0cm95KHMtPnB2aWRfdG9fdmdpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9tZXRhZGF0YV9oYXNoZXMobHZtZXRhZF9zdGF0ZSAqcykKK3sKKwlzLT5wdmlkX3RvX3B2bWV0YSA9IGRtX2hhc2hfY3JlYXRlKDMyKTsKKwlzLT5kZXZpY2VfdG9fcHZpZCA9IGRtX2hhc2hfY3JlYXRlKDMyKTsKKwlzLT52Z2lkX3RvX21ldGFkYXRhID0gZG1faGFzaF9jcmVhdGUoMzIpOworCXMtPnZnaWRfdG9fdmduYW1lID0gZG1faGFzaF9jcmVhdGUoMzIpOworCXMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzID0gZG1faGFzaF9jcmVhdGUoMzIpOworCXMtPnZnaWRfdG9faW5mbyA9IGRtX2hhc2hfY3JlYXRlKDMyKTsKKwlzLT5wdmlkX3RvX3ZnaWQgPSBkbV9oYXNoX2NyZWF0ZSgzMik7CisJcy0+dmduYW1lX3RvX3ZnaWQgPSBkbV9oYXNoX2NyZWF0ZSgzMik7Cit9CisKK3N0YXRpYyByZXNwb25zZSByZXBseV9mYWlsKGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZSgiZmFpbGVkIiwgInJlYXNvbiA9ICVzIiwgcmVhc29uLCBOVUxMKTsKK30KKworc3RhdGljIHJlc3BvbnNlIHJlcGx5X3Vua25vd24oY29uc3QgY2hhciAqcmVhc29uKQoreworCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJ1bmtub3duIiwgInJlYXNvbiA9ICVzIiwgcmVhc29uLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHZzKHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdmcpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwdiA9IGRtX2NvbmZpZ19maW5kX25vZGUodmcsICJtZXRhZGF0YS9waHlzaWNhbF92b2x1bWVzIik7CisJaWYgKHB2KQorCQlwdiA9IHB2LT5jaGlsZDsKKwlyZXR1cm4gcHY7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9tZXRhZGF0YShzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnZnKSB7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwdiA9IHB2cyh2Zyk7CisJd2hpbGUgKHB2KSB7CisJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqaXRlbSA9IHB2LT5jaGlsZDsKKwkJd2hpbGUgKGl0ZW0pIHsKKwkJCS8qIFJlbW92ZSB0aGUgYWR2aXNvcnkgZGV2aWNlIG5vZGVzLiAqLworCQkJaWYgKGl0ZW0tPnNpYiAmJiAhc3RyY21wKGl0ZW0tPnNpYi0+a2V5LCAiZGV2aWNlIikpCisJCQkJaXRlbS0+c2liID0gaXRlbS0+c2liLT5zaWI7CisJCQlpdGVtID0gaXRlbS0+c2liOworCQl9CisJCXB2ID0gcHYtPnNpYjsKKwl9CisJdmctPnNpYiA9IE5VTEw7IC8qIERyb3AgYW55IHRyYWlsaW5nIGdhcmJhZ2UuICovCit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX3B2bWV0YShzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2LCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2bWV0YSkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnRtcDsKKworCWlmICghcHZtZXRhKQorCQlyZXR1cm47CisKKwl0bXAgPSBwdm1ldGE7CisJd2hpbGUgKHRtcC0+c2liKSB7CisJCS8qIGRyb3AgdGhlIHJlZHVuZGFudCBJRCBhbmQgZGV2X3NpemUgbm9kZXMgKi8KKwkJaWYgKCFzdHJjbXAodG1wLT5zaWItPmtleSwgImlkIikgfHwgIXN0cmNtcCh0bXAtPnNpYi0+a2V5LCAiZGV2X3NpemUiKSkKKwkJCXRtcC0+c2liID0gdG1wLT5zaWItPnNpYjsKKwkJaWYgKCF0bXAtPnNpYikgYnJlYWs7CisJCXRtcCA9IHRtcC0+c2liOworCQl0bXAtPnBhcmVudCA9IHB2OworCX0KKwl0bXAtPnNpYiA9IHB2LT5jaGlsZDsKKwlwdi0+Y2hpbGQgPSBwdm1ldGE7CisJcHZtZXRhLT5wYXJlbnQgPSBwdjsKK30KKworLyoKKyAqIEVpdGhlciB0aGUgImJpZyIgdmdzIGxvY2ssIG9yIGEgcGVyLXZnIGxvY2sgbmVlZHMgdG8gYmUgaGVsZCBiZWZvcmUgZW50ZXJpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogY2Z0IGFuZCB2ZyBpcyBkYXRhIGJlaW5nIHNlbnQgdG8gdGhlIGNhbGxlci4KKyAqLworCitzdGF0aWMgaW50IHVwZGF0ZV9wdl9zdGF0dXMobHZtZXRhZF9zdGF0ZSAqcywKKwkJCSAgICBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCSAgICBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnZnKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHY7CisJY29uc3QgY2hhciAqdXVpZDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnB2bWV0YTsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2bWV0YV9jbjsKKwlpbnQgcmV0ID0gMTsKKworCWZvciAocHYgPSBwdnModmcpOyBwdjsgcHYgPSBwdi0+c2liKSB7CisJCWlmICghKHV1aWQgPSBkbV9jb25maWdfZmluZF9zdHIocHYtPmNoaWxkLCAiaWQiLCBOVUxMKSkpIHsKKwkJCUVSUk9SKHMsICJ1cGRhdGVfcHZfc3RhdHVzIGZvdW5kIG5vIHV1aWQgZm9yIFBWIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXB2bWV0YSA9IGRtX2hhc2hfbG9va3VwKHMtPnB2aWRfdG9fcHZtZXRhLCB1dWlkKTsKKworCQlzZXRfZmxhZyhjZnQsIHB2LCAic3RhdHVzIiwgIk1JU1NJTkciLCAhcHZtZXRhKTsKKworCQlpZiAocHZtZXRhKSB7CisJCQlpZiAoIShwdm1ldGFfY24gPSBkbV9jb25maWdfY2xvbmVfbm9kZShjZnQsIHB2bWV0YS0+cm9vdC0+Y2hpbGQsIDEpKSkgeworCQkJCUVSUk9SKHMsICJ1cGRhdGVfcHZfc3RhdHVzIG91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQltZXJnZV9wdm1ldGEocHYsIHB2bWV0YV9jbik7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqYWRkX2xhc3Rfbm9kZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqbm9kZV9uYW1lKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sICpsYXN0OworCisJY24gPSBjZnQtPnJvb3Q7CisJbGFzdCA9IGNuOworCisJd2hpbGUgKGNuLT5zaWIpIHsKKwkJbGFzdCA9IGNuLT5zaWI7CisJCWNuID0gbGFzdDsKKwl9CisKKwljbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShjZnQsIG5vZGVfbmFtZSk7CisJaWYgKCFjbikKKwkJcmV0dXJuIE5VTEw7CisKKwljbi0+diA9IE5VTEw7CisJY24tPnNpYiA9IE5VTEw7CisJY24tPnBhcmVudCA9IGNmdC0+cm9vdDsKKwlsYXN0LT5zaWIgPSBjbjsKKworCXJldHVybiBjbjsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWFrZV9wdl9ub2RlKGx2bWV0YWRfc3RhdGUgKnMsIGNvbnN0IGNoYXIgKnB2aWQsCisJCQkJCSAgIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkgICBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwKKwkJCQkJICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwcmVfc2liKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcHZtZXRhID0gZG1faGFzaF9sb29rdXAocy0+cHZpZF90b19wdm1ldGEsIHB2aWQpOworCWNvbnN0IGNoYXIgKnZnaWQgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3ZnaWQsIHB2aWQpLCAqdmduYW1lID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2OworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24gPSBOVUxMOworCisJaWYgKCFwdm1ldGEpCisJCXJldHVybiBOVUxMOworCisJaWYgKHZnaWQpIHsKKwkJdmduYW1lID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b192Z25hbWUsIHZnaWQpOworCX0KKworCS8qIE5pY2sgdGhlIHB2bWV0YSBjb25maWcgdHJlZS4gKi8KKwlpZiAoIShwdiA9IGRtX2NvbmZpZ19jbG9uZV9ub2RlKGNmdCwgcHZtZXRhLT5yb290LCAwKSkpCisJCXJldHVybiAwOworCisJaWYgKHByZV9zaWIpCisJCXByZV9zaWItPnNpYiA9IHB2OworCWlmIChwYXJlbnQgJiYgIXBhcmVudC0+Y2hpbGQpCisJCXBhcmVudC0+Y2hpbGQgPSBwdjsKKwlwdi0+cGFyZW50ID0gcGFyZW50OworCXB2LT5rZXkgPSBwdmlkOworCisJLyogQWRkIHRoZSAidmFyaWFibGUiIGJpdHMgdG8gaXQuICovCisKKwlpZiAodmdpZCAmJiBzdHJjbXAodmdpZCwgIiNvcnBoYW4iKSkKKwkJY24gPSBtYWtlX3RleHRfbm9kZShjZnQsICJ2Z2lkIiwgdmdpZCwgcHYsIGNuKTsKKwlpZiAodmduYW1lKQorCQljbiA9IG1ha2VfdGV4dF9ub2RlKGNmdCwgInZnbmFtZSIsIHZnbmFtZSwgcHYsIGNuKTsKKworCXJldHVybiBwdjsKK30KKworc3RhdGljIHJlc3BvbnNlIHB2X2xpc3QobHZtZXRhZF9zdGF0ZSAqcywgcmVxdWVzdCByKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24gPSBOVUxMLCAqY25fcHZzOworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisJY29uc3QgY2hhciAqaWQ7CisJcmVzcG9uc2UgcmVzID0geyAwIH07CisKKwlERUJVR0xPRyhzLCAicHZfbGlzdCIpOworCisJYnVmZmVyX2luaXQoICZyZXMuYnVmZmVyICk7CisKKwlpZiAoIShyZXMuY2Z0ID0gZG1fY29uZmlnX2NyZWF0ZSgpKSkKKwkJcmV0dXJuIHJlczsgLyogRklYTUUgZXJyb3IgcmVwb3J0aW5nICovCisKKwkvKiBUaGUgcmVzcG9uc2UgZmllbGQgKi8KKwlpZiAoIShyZXMuY2Z0LT5yb290ID0gbWFrZV90ZXh0X25vZGUocmVzLmNmdCwgInJlc3BvbnNlIiwgIk9LIiwgTlVMTCwgTlVMTCkpKQorCQlyZXR1cm4gcmVzOyAvKiBGSVhNRSBkb29tZWQgKi8KKworCWNuX3B2cyA9IG1ha2VfY29uZmlnX25vZGUocmVzLmNmdCwgInBoeXNpY2FsX3ZvbHVtZXMiLCBOVUxMLCByZXMuY2Z0LT5yb290KTsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBzLT5wdmlkX3RvX3B2bWV0YSkgeworCQlpZCA9IGRtX2hhc2hfZ2V0X2tleShzLT5wdmlkX3RvX3B2bWV0YSwgbik7CisJCWNuID0gbWFrZV9wdl9ub2RlKHMsIGlkLCByZXMuY2Z0LCBjbl9wdnMsIGNuKTsKKwl9CisKKwlpZiAocy0+ZmxhZ3MgJiBHTEZMX0lOVkFMSUQpCisJCWFkZF9sYXN0X25vZGUocmVzLmNmdCwgImdsb2JhbF9pbnZhbGlkIik7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgcmVzcG9uc2UgcHZfbG9va3VwKGx2bWV0YWRfc3RhdGUgKnMsIHJlcXVlc3QgcikKK3sKKwljb25zdCBjaGFyICpwdmlkID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHIsICJ1dWlkIiwgTlVMTCk7CisJaW50NjRfdCBkZXZ0ID0gZGFlbW9uX3JlcXVlc3RfaW50KHIsICJkZXZpY2UiLCAwKTsKKwlyZXNwb25zZSByZXMgPSB7IDAgfTsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2OworCisJREVCVUdMT0cocywgInB2X2xvb2t1cCBwdmlkICVzIiwgcHZpZCk7CisKKwlidWZmZXJfaW5pdCggJnJlcy5idWZmZXIgKTsKKworCWlmICghcHZpZCAmJiAhZGV2dCkKKwkJcmV0dXJuIHJlcGx5X2ZhaWwoIm5lZWQgUFZJRCBvciBkZXZpY2UiKTsKKworCWlmICghKHJlcy5jZnQgPSBkbV9jb25maWdfY3JlYXRlKCkpKQorCQlyZXR1cm4gcmVwbHlfZmFpbCgib3V0IG9mIG1lbW9yeSIpOworCisJaWYgKCEocmVzLmNmdC0+cm9vdCA9IG1ha2VfdGV4dF9ub2RlKHJlcy5jZnQsICJyZXNwb25zZSIsICJPSyIsIE5VTEwsIE5VTEwpKSkKKwkJcmV0dXJuIHJlcGx5X2ZhaWwoIm91dCBvZiBtZW1vcnkiKTsKKworCWlmICghcHZpZCAmJiBkZXZ0KQorCQlwdmlkID0gZG1faGFzaF9sb29rdXBfYmluYXJ5KHMtPmRldmljZV90b19wdmlkLCAmZGV2dCwgc2l6ZW9mKGRldnQpKTsKKworCWlmICghcHZpZCkgeworCQlXQVJOKHMsICJwdl9sb29rdXA6IGNvdWxkIG5vdCBmaW5kIGRldmljZSAlIiBQUkl1NjQsIGRldnQpOworCQlkbV9jb25maWdfZGVzdHJveShyZXMuY2Z0KTsKKwkJcmV0dXJuIHJlcGx5X3Vua25vd24oImRldmljZSBub3QgZm91bmQiKTsKKwl9CisKKwlwdiA9IG1ha2VfcHZfbm9kZShzLCBwdmlkLCByZXMuY2Z0LCBOVUxMLCByZXMuY2Z0LT5yb290KTsKKwlpZiAoIXB2KSB7CisJCWRtX2NvbmZpZ19kZXN0cm95KHJlcy5jZnQpOworCQlyZXR1cm4gcmVwbHlfdW5rbm93bigiUFYgbm90IGZvdW5kIik7CisJfQorCisJcHYtPmtleSA9ICJwaHlzaWNhbF92b2x1bWUiOworCisJaWYgKHMtPmZsYWdzICYgR0xGTF9JTlZBTElEKQorCQlhZGRfbGFzdF9ub2RlKHJlcy5jZnQsICJnbG9iYWxfaW52YWxpZCIpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHJlc3BvbnNlIHZnX2xpc3QobHZtZXRhZF9zdGF0ZSAqcywgcmVxdWVzdCByKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sICpjbl92Z3MsICpjbl9sYXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuOworCWNvbnN0IGNoYXIgKmlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJcmVzcG9uc2UgcmVzID0geyAwIH07CisKKwlERUJVR0xPRyhzLCAidmdfbGlzdCIpOworCisJYnVmZmVyX2luaXQoICZyZXMuYnVmZmVyICk7CisKKwlpZiAoIShyZXMuY2Z0ID0gZG1fY29uZmlnX2NyZWF0ZSgpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsgLyogRklYTUU6IGJldHRlciBlcnJvciByZXBvcnRpbmcgKi8KKworCS8qIFRoZSByZXNwb25zZSBmaWVsZCAqLworCXJlcy5jZnQtPnJvb3QgPSBjbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXMuY2Z0LCAicmVzcG9uc2UiKTsKKwlpZiAoIWNuKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkOyAvKiBGSVhNRSAqLworCWNuLT5wYXJlbnQgPSByZXMuY2Z0LT5yb290OworCWlmICghKGNuLT52ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShyZXMuY2Z0KSkpCisJCWdvdG8gYmFkOyAvKiBGSVhNRSAqLworCisJY24tPnYtPnR5cGUgPSBETV9DRkdfU1RSSU5HOworCWNuLT52LT52LnN0ciA9ICJPSyI7CisKKwljbl92Z3MgPSBjbiA9IGNuLT5zaWIgPSBkbV9jb25maWdfY3JlYXRlX25vZGUocmVzLmNmdCwgInZvbHVtZV9ncm91cHMiKTsKKwlpZiAoIWNuX3ZncykKKwkJZ290byBiYWQ7IC8qIEZJWE1FICovCisKKwljbi0+cGFyZW50ID0gcmVzLmNmdC0+cm9vdDsKKwljbi0+diA9IE5VTEw7CisJY24tPmNoaWxkID0gTlVMTDsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBzLT52Z2lkX3RvX3ZnbmFtZSkgeworCQlpZCA9IGRtX2hhc2hfZ2V0X2tleShzLT52Z2lkX3RvX3ZnbmFtZSwgbiksCisJCW5hbWUgPSBkbV9oYXNoX2dldF9kYXRhKHMtPnZnaWRfdG9fdmduYW1lLCBuKTsKKworCQlpZiAoIShjbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXMuY2Z0LCBpZCkpKQorCQkJZ290byBiYWQ7IC8qIEZJWE1FICovCisKKwkJaWYgKGNuX2xhc3QpCisJCQljbl9sYXN0LT5zaWIgPSBjbjsKKworCQljbi0+cGFyZW50ID0gY25fdmdzOworCQljbi0+c2liID0gTlVMTDsKKwkJY24tPnYgPSBOVUxMOworCisJCWlmICghKGNuLT5jaGlsZCA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXMuY2Z0LCAibmFtZSIpKSkKKwkJCWdvdG8gYmFkOyAvKiBGSVhNRSAqLworCisJCWNuLT5jaGlsZC0+cGFyZW50ID0gY247CisJCWNuLT5jaGlsZC0+c2liID0gMDsKKwkJaWYgKCEoY24tPmNoaWxkLT52ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShyZXMuY2Z0KSkpCisJCQlnb3RvIGJhZDsgLyogRklYTUUgKi8KKworCQljbi0+Y2hpbGQtPnYtPnR5cGUgPSBETV9DRkdfU1RSSU5HOworCQljbi0+Y2hpbGQtPnYtPnYuc3RyID0gbmFtZTsKKworCQlpZiAoIWNuX3Zncy0+Y2hpbGQpCisJCQljbl92Z3MtPmNoaWxkID0gY247CisJCWNuX2xhc3QgPSBjbjsKKwl9CisKKwlpZiAocy0+ZmxhZ3MgJiBHTEZMX0lOVkFMSUQpCisJCWFkZF9sYXN0X25vZGUocmVzLmNmdCwgImdsb2JhbF9pbnZhbGlkIik7CitiYWQ6CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbWFya19vdXRkYXRlZF9wdihsdm1ldGFkX3N0YXRlICpzLCBjb25zdCBjaGFyICp2Z2lkLCBjb25zdCBjaGFyICpwdmlkKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcHZtZXRhLCAqb3V0ZGF0ZWRfcHZzOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbGlzdCwgKmNmdF92Z2lkOworCXN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnY7CisKKwlwdm1ldGEgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3B2bWV0YSwgcHZpZCk7CisKKwkvKiBpZiB0aGUgTURBIGV4aXN0cyBhbmQgaXMgdXNlZCwgaXQgd2lsbCBoYXZlIGlnbm9yZT0wIHNldCAqLworCWlmICghcHZtZXRhIHx8CisJICAgIChkbV9jb25maWdfZmluZF9pbnQ2NChwdm1ldGEtPnJvb3QsICJwdm1ldGEvbWRhMC9pZ25vcmUiLCAxKSAmJgorCSAgICAgZG1fY29uZmlnX2ZpbmRfaW50NjQocHZtZXRhLT5yb290LCAicHZtZXRhL21kYTEvaWdub3JlIiwgMSkpKQorCQlyZXR1cm47CisKKwlFUlJPUihzLCAiUFYgJXMgaGFzIG91dGRhdGVkIG1ldGFkYXRhIGZvciBWRyAlcyIsIHB2aWQsIHZnaWQpOworCisJb3V0ZGF0ZWRfcHZzID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19vdXRkYXRlZF9wdnMsIHZnaWQpOworCWlmICghb3V0ZGF0ZWRfcHZzKSB7CisJCWlmICghKG91dGRhdGVkX3B2cyA9IGRtX2NvbmZpZ19mcm9tX3N0cmluZygib3V0ZGF0ZWRfcHZzL3B2X2xpc3QgPSBbXSIpKSB8fAorCQkgICAgIShjZnRfdmdpZCA9IG1ha2VfdGV4dF9ub2RlKG91dGRhdGVkX3B2cywgInZnaWQiLCBkbV9wb29sX3N0cmR1cChvdXRkYXRlZF9wdnMtPm1lbSwgdmdpZCksCisJCQkJCQlvdXRkYXRlZF9wdnMtPnJvb3QsIE5VTEwpKSkKKwkJCWFib3J0KCk7CisJCWlmICghZG1faGFzaF9pbnNlcnQocy0+dmdpZF90b19vdXRkYXRlZF9wdnMsIGNmdF92Z2lkLT52LT52LnN0ciwgb3V0ZGF0ZWRfcHZzKSkKKwkJCWFib3J0KCk7CisJCURFQlVHTE9HKHMsICJjcmVhdGVkIG91dGRhdGVkX3B2cyBsaXN0IGZvciBWRyAlcyIsIHZnaWQpOworCX0KKworCWxpc3QgPSBkbV9jb25maWdfZmluZF9ub2RlKG91dGRhdGVkX3B2cy0+cm9vdCwgIm91dGRhdGVkX3B2cy9wdl9saXN0Iik7CisJdiA9IGxpc3QtPnY7CisJd2hpbGUgKHYpIHsKKwkJaWYgKHYtPnR5cGUgIT0gRE1fQ0ZHX0VNUFRZX0FSUkFZICYmICFzdHJjbXAodi0+di5zdHIsIHB2aWQpKQorCQkJcmV0dXJuOworCQl2ID0gdi0+bmV4dDsKKwl9CisJaWYgKCEodiA9IGRtX2NvbmZpZ19jcmVhdGVfdmFsdWUob3V0ZGF0ZWRfcHZzKSkpCisJCWFib3J0KCk7CisJdi0+dHlwZSA9IERNX0NGR19TVFJJTkc7CisJdi0+di5zdHIgPSBkbV9wb29sX3N0cmR1cChvdXRkYXRlZF9wdnMtPm1lbSwgcHZpZCk7CisJdi0+bmV4dCA9IGxpc3QtPnY7CisJbGlzdC0+diA9IHY7Cit9CisKK3N0YXRpYyB2b2lkIGNoYWluX291dGRhdGVkX3B2cyhsdm1ldGFkX3N0YXRlICpzLCBjb25zdCBjaGFyICp2Z2lkLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKm1ldGFkYXRhX2NmdCwgc3RydWN0IGRtX2NvbmZpZ19ub2RlICptZXRhZGF0YSkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCB2Z2lkKSwgKnB2bWV0YTsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2LCAqcmVzLCAqb3V0X3B2cyA9IGNmdCA/IGRtX2NvbmZpZ19maW5kX25vZGUoY2Z0LT5yb290LCAib3V0ZGF0ZWRfcHZzL3B2X2xpc3QiKSA6IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqcHZzX3YgPSBvdXRfcHZzID8gb3V0X3B2cy0+diA6IE5VTEw7CisJaWYgKCFwdnNfdikKKwkJcmV0dXJuOworCWlmICghKHJlcyA9IG1ha2VfY29uZmlnX25vZGUobWV0YWRhdGFfY2Z0LCAib3V0ZGF0ZWRfcHZzIiwgbWV0YWRhdGFfY2Z0LT5yb290LCAwKSkpCisJCXJldHVybjsgLyogb29wcyAqLworCXJlcy0+c2liID0gbWV0YWRhdGEtPmNoaWxkOworCW1ldGFkYXRhLT5jaGlsZCA9IHJlczsKKwlmb3IgKDsgcHZzX3YgJiYgcHZzX3YtPnR5cGUgIT0gRE1fQ0ZHX0VNUFRZX0FSUkFZOyBwdnNfdiA9IHB2c192LT5uZXh0KSB7CisJCXB2bWV0YSA9IGRtX2hhc2hfbG9va3VwKHMtPnB2aWRfdG9fcHZtZXRhLCBwdnNfdi0+di5zdHIpOworCQlpZiAoIXB2bWV0YSkgeworCQkJV0FSTihzLCAibWV0YWRhdGEgZm9yIFBWICVzIG5vdCBmb3VuZCIsIHB2c192LT52LnN0cik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIShwdiA9IGRtX2NvbmZpZ19jbG9uZV9ub2RlKG1ldGFkYXRhX2NmdCwgcHZtZXRhLT5yb290LCAwKSkpCisJCQljb250aW51ZTsKKwkJcHYtPmtleSA9IGRtX2NvbmZpZ19maW5kX3N0cihwdiwgInB2bWV0YS9pZCIsIE5VTEwpOworCQlwdi0+c2liID0gcmVzLT5jaGlsZDsKKwkJcmVzLT5jaGlsZCA9IHB2OworCX0KK30KKworc3RhdGljIHJlc3BvbnNlIHZnX2xvb2t1cChsdm1ldGFkX3N0YXRlICpzLCByZXF1ZXN0IHIpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICptZXRhZGF0YSwgKm47CisJc3RydWN0IHZnX2luZm8gKmluZm87CisJcmVzcG9uc2UgcmVzID0geyAwIH07CisJY29uc3QgY2hhciAqdXVpZCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidXVpZCIsIE5VTEwpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgIm5hbWUiLCBOVUxMKTsKKwlpbnQgY291bnQgPSAwOworCisJYnVmZmVyX2luaXQoICZyZXMuYnVmZmVyICk7CisKKwlpZiAoIXV1aWQgJiYgIW5hbWUpIHsKKwkJRVJST1IocywgInZnX2xvb2t1cCB3aXRoIG5vIHV1aWQgb3IgbmFtZSIpOworCQlyZXR1cm4gcmVwbHlfdW5rbm93bigiVkcgbm90IGZvdW5kIik7CisKKwl9IGVsc2UgaWYgKCF1dWlkIHx8ICFuYW1lKSB7CisJCURFQlVHTE9HKHMsICJ2Z19sb29rdXAgdmdpZCAlcyBuYW1lICVzIG5lZWRzIGxvb2t1cCIsCisJCQkgdXVpZCA/OiAibm9uZSIsIG5hbWUgPzogIm5vbmUiKTsKKworCQlpZiAobmFtZSAmJiAhdXVpZCkKKwkJCXV1aWQgPSBkbV9oYXNoX2xvb2t1cF93aXRoX2NvdW50KHMtPnZnbmFtZV90b192Z2lkLCBuYW1lLCAmY291bnQpOworCQllbHNlIGlmICh1dWlkICYmICFuYW1lKQorCQkJbmFtZSA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fdmduYW1lLCB1dWlkKTsKKworCQlpZiAobmFtZSAmJiB1dWlkICYmIChjb3VudCA+IDEpKSB7CisJCQlERUJVR0xPRyhzLCAidmdfbG9va3VwIG5hbWUgJXMgdmdpZCAlcyBmb3VuZCAlZCB2Z2lkcyIsCisJCQkJIG5hbWUsIHV1aWQsIGNvdW50KTsKKwkJCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJtdWx0aXBsZSIsICJyZWFzb24gPSAlcyIsICJNdWx0aXBsZSBWR3MgZm91bmQgd2l0aCBzYW1lIG5hbWUiLCBOVUxMKTsKKwkJfQorCisJCWlmICghdXVpZCB8fCAhbmFtZSkKKwkJCXJldHVybiByZXBseV91bmtub3duKCJWRyBub3QgZm91bmQiKTsKKworCX0gZWxzZSB7CisJCWNoYXIgKm5hbWVfbG9va3VwID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b192Z25hbWUsIHV1aWQpOworCQljaGFyICp1dWlkX2xvb2t1cCA9IGRtX2hhc2hfbG9va3VwX3dpdGhfdmFsKHMtPnZnbmFtZV90b192Z2lkLCBuYW1lLCB1dWlkLCBzdHJsZW4odXVpZCkgKyAxKTsKKworCQkvKiBGSVhNRTogY29tbWVudCBvdXQgdGhlc2Ugc2FuaXR5IGNoZWNrcyB3aGVuIG5vdCB0ZXN0aW5nICovCisKKwkJaWYgKCFuYW1lX2xvb2t1cCB8fCAhdXVpZF9sb29rdXApIHsKKwkJCUVSUk9SKHMsICJ2Z19sb29rdXAgdmdpZCAlcyBuYW1lICVzIGZvdW5kIGluY29tcGxldGUgbWFwcGluZyB1dWlkICVzIG5hbWUgJXMiLAorCQkJICAgICAgdXVpZCwgbmFtZSwgdXVpZF9sb29rdXAgPzogIm5vbmUiLCBuYW1lX2xvb2t1cCA/OiAibm9uZSIpOworCQkJcmV0dXJuIHJlcGx5X3Vua25vd24oIlZHIG1hcHBpbmcgaW5jb21wbGV0ZSIpOworCQl9IGVsc2UgaWYgKHN0cmNtcChuYW1lX2xvb2t1cCwgbmFtZSkgfHwgc3RyY21wKHV1aWRfbG9va3VwLCB1dWlkKSkgeworCQkJRVJST1IocywgInZnX2xvb2t1cCB2Z2lkICVzIG5hbWUgJXMgZm91bmQgaW5jb25zaXN0ZW50IG1hcHBpbmcgdXVpZCAlcyBuYW1lICVzIiwKKwkJCSAgICAgIHV1aWQsIG5hbWUsIHV1aWRfbG9va3VwLCBuYW1lX2xvb2t1cCk7CisJCQlyZXR1cm4gcmVwbHlfdW5rbm93bigiVkcgbWFwcGluZyBpbmNvbnNpc3RlbnQiKTsKKwkJfQorCX0KKworCURFQlVHTE9HKHMsICJ2Z19sb29rdXAgdmdpZCAlcyBuYW1lICVzIiwgdXVpZCA/OiAibm9uZSIsIG5hbWUgPzogIm5vbmUiKTsKKworCWNmdCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fbWV0YWRhdGEsIHV1aWQpOworCWlmICghY2Z0IHx8ICFjZnQtPnJvb3QpIHsKKwkJcmV0dXJuIHJlcGx5X3Vua25vd24oIlVVSUQgbm90IGZvdW5kIik7CisJfQorCisJbWV0YWRhdGEgPSBjZnQtPnJvb3Q7CisJaWYgKCEocmVzLmNmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpCisJCWdvdG8gbm9tZW1fdW47CisKKwkvKiBUaGUgcmVzcG9uc2UgZmllbGQgKi8KKwlpZiAoIShyZXMuY2Z0LT5yb290ID0gbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXMuY2Z0LCAicmVzcG9uc2UiKSkpCisJCWdvdG8gbm9tZW1fdW47CisKKwlpZiAoIShuLT52ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShjZnQpKSkKKwkJZ290byBub21lbV91bjsKKworCW4tPnBhcmVudCA9IHJlcy5jZnQtPnJvb3Q7CisJbi0+di0+dHlwZSA9IERNX0NGR19TVFJJTkc7CisJbi0+di0+di5zdHIgPSAiT0siOworCisJaWYgKCEobiA9IG4tPnNpYiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXMuY2Z0LCAibmFtZSIpKSkKKwkJZ290byBub21lbV91bjsKKworCWlmICghKG4tPnYgPSBkbV9jb25maWdfY3JlYXRlX3ZhbHVlKHJlcy5jZnQpKSkKKwkJZ290byBub21lbV91bjsKKworCW4tPnBhcmVudCA9IHJlcy5jZnQtPnJvb3Q7CisJbi0+di0+dHlwZSA9IERNX0NGR19TVFJJTkc7CisJbi0+di0+di5zdHIgPSBuYW1lOworCisJLyogVGhlIG1ldGFkYXRhIHNlY3Rpb24gKi8KKwlpZiAoIShuID0gbi0+c2liID0gZG1fY29uZmlnX2Nsb25lX25vZGUocmVzLmNmdCwgbWV0YWRhdGEsIDEpKSkKKwkJZ290byBub21lbV91bjsKKwluLT5wYXJlbnQgPSByZXMuY2Z0LT5yb290OworCisJaWYgKCF1cGRhdGVfcHZfc3RhdHVzKHMsIHJlcy5jZnQsIG4pKQorCQlnb3RvIG5vbWVtOworCWNoYWluX291dGRhdGVkX3B2cyhzLCB1dWlkLCByZXMuY2Z0LCBuKTsKKworCWlmIChzLT5mbGFncyAmIEdMRkxfSU5WQUxJRCkKKwkJYWRkX2xhc3Rfbm9kZShyZXMuY2Z0LCAiZ2xvYmFsX2ludmFsaWQiKTsKKworCWluZm8gPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX2luZm8sIHV1aWQpOworCWlmIChpbmZvICYmIChpbmZvLT5mbGFncyAmIFZHRkxfSU5WQUxJRCkpIHsKKwkJaWYgKCFhZGRfbGFzdF9ub2RlKHJlcy5jZnQsICJ2Z19pbnZhbGlkIikpCisJCQlnb3RvIG5vbWVtOworCX0KKworCXJldHVybiByZXM7CisKK25vbWVtX3VuOgorbm9tZW06CisJcmVwbHlfZmFpbCgib3V0IG9mIG1lbW9yeSIpOworCUVSUk9SKHMsICJ2Z19sb29rdXAgdmdpZCAlcyBuYW1lICVzIG91dCBvZiBtZW1vcnkuIiwgdXVpZCA/OiAibm9uZSIsIG5hbWUgPzogIm5vbmUiKTsKKwlFUlJPUihzLCAibHZtZXRhZCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhbmQgaXMgYWJvcnRpbmcuIik7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgaW50IHZnX3JlbW92ZV9pZl9taXNzaW5nKGx2bWV0YWRfc3RhdGUgKnMsIGNvbnN0IGNoYXIgKnZnaWQsIGludCB1cGRhdGVfcHZpZHMpOworCitlbnVtIHVwZGF0ZV9wdmlkX21vZGUgeyBVUERBVEVfT05MWSwgUkVNT1ZFX0VNUFRZLCBNQVJLX09VVERBVEVEIH07CisKKy8qIFlvdSBuZWVkIHRvIGJlIGhvbGRpbmcgdGhlIHB2aWRfdG9fdmdpZCBsb2NrIGFscmVhZHkgdG8gY2FsbCB0aGlzLiAqLworc3RhdGljIGludCBfdXBkYXRlX3B2aWRfdG9fdmdpZChsdm1ldGFkX3N0YXRlICpzLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnZnLAorCQkJCWNvbnN0IGNoYXIgKnZnaWQsIGludCBtb2RlKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHY7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKnRvX2NoZWNrOworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisJY29uc3QgY2hhciAqcHZpZDsKKwljaGFyICp2Z2lkX29sZDsKKwljaGFyICp2Z2lkX2R1cDsKKwljb25zdCBjaGFyICpjaGVja192Z2lkOworCWludCByID0gMDsKKworCWlmICghdmdpZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoISh0b19jaGVjayA9IGRtX2hhc2hfY3JlYXRlKDMyKSkpCisJCWdvdG8gYWJvcnRfZGFlbW9uOworCisJZm9yIChwdiA9IHB2cyh2Zy0+cm9vdCk7IHB2OyBwdiA9IHB2LT5zaWIpIHsKKwkJaWYgKCEocHZpZCA9IGRtX2NvbmZpZ19maW5kX3N0cihwdi0+Y2hpbGQsICJpZCIsIE5VTEwpKSkgeworCQkJRVJST1IocywgIlBWIGhhcyBubyBpZCBmb3IgdXBkYXRlX3B2aWRfdG9fdmdpZCIpOworCQkJY29udGludWU7CisJCX0KKworCQl2Z2lkX29sZCA9IGRtX2hhc2hfbG9va3VwKHMtPnB2aWRfdG9fdmdpZCwgcHZpZCk7CisKKwkJaWYgKChtb2RlID09IFJFTU9WRV9FTVBUWSkgJiYgdmdpZF9vbGQpIHsKKwkJCS8qIFRoaXMgY29waWVzIHRoZSB2Z2lkX29sZCBzdHJpbmcsIGRvZXNuJ3QgcmVmZXJlbmNlIGl0LiAqLworCQkJaWYgKCFkbV9oYXNoX2luc2VydCh0b19jaGVjaywgdmdpZF9vbGQsICh2b2lkKikgMSkpIHsKKwkJCQlFUlJPUihzLCAidXBkYXRlX3B2aWRfdG9fdmdpZCBvdXQgb2YgbWVtb3J5IGZvciBoYXNoIGluc2VydCB2Z2lkX29sZCAlcyIsIHZnaWRfb2xkKTsKKwkJCQlnb3RvIGFib3J0X2RhZW1vbjsKKwkJCX0KKwkJfQorCisJCWlmIChtb2RlID09IE1BUktfT1VUREFURUQpCisJCQltYXJrX291dGRhdGVkX3B2KHMsIHZnaWQsIHB2aWQpOworCisJCWlmICghKHZnaWRfZHVwID0gZG1fc3RyZHVwKHZnaWQpKSkgeworCQkJRVJST1IocywgInVwZGF0ZV9wdmlkX3RvX3ZnaWQgb3V0IG9mIG1lbW9yeSBmb3IgdmdpZCAlcyIsIHZnaWQpOworCQkJZ290byBhYm9ydF9kYWVtb247CisJCX0KKworCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KHMtPnB2aWRfdG9fdmdpZCwgcHZpZCwgdmdpZF9kdXApKSB7CisJCQlFUlJPUihzLCAidXBkYXRlX3B2aWRfdG9fdmdpZCBvdXQgb2YgbWVtb3J5IGZvciBoYXNoIGluc2VydCB2Z2lkICVzIiwgdmdpZF9kdXApOworCQkJZG1fZnJlZSh2Z2lkX2R1cCk7CisJCQlnb3RvIGFib3J0X2RhZW1vbjsKKwkJfQorCisJCS8qIHB2aWRfdG9fdmdpZCBubyBsb25nZXIgcmVmZXJlbmNlcyB2Z2lkX29sZCAqLworCQlkbV9mcmVlKHZnaWRfb2xkKTsKKworCQlERUJVR0xPRyhzLCAibW92aW5nIFBWICVzIHRvIFZHICVzIiwgcHZpZCwgdmdpZCk7CisJfQorCisJZG1faGFzaF9pdGVyYXRlKG4sIHRvX2NoZWNrKSB7CisJCWNoZWNrX3ZnaWQgPSBkbV9oYXNoX2dldF9rZXkodG9fY2hlY2ssIG4pOworCQl2Z19yZW1vdmVfaWZfbWlzc2luZyhzLCBjaGVja192Z2lkLCAwKTsKKwl9CisKKwlyID0gMTsKKwlkbV9oYXNoX2Rlc3Ryb3kodG9fY2hlY2spOworCisJcmV0dXJuIHI7CisKK2Fib3J0X2RhZW1vbjoKKwlFUlJPUihzLCAibHZtZXRhZCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhbmQgaXMgYWJvcnRpbmcuIik7CisJaWYgKHRvX2NoZWNrKQorCQlkbV9oYXNoX2Rlc3Ryb3kodG9fY2hlY2spOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworLyogQSBwdmlkIG1hcCBsb2NrIG5lZWRzIHRvIGJlIGhlbGQgaWYgdXBkYXRlX3B2aWRzID0gMS4gKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX21ldGFkYXRhKGx2bWV0YWRfc3RhdGUgKnMsIGNvbnN0IGNoYXIgKnZnaWQsIGludCB1cGRhdGVfcHZpZHMpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICptZXRhX2xvb2t1cDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKm91dGRhdGVkX3B2c19sb29rdXA7CisJc3RydWN0IHZnX2luZm8gKmluZm9fbG9va3VwOworCWNoYXIgKm5hbWVfbG9va3VwID0gTlVMTDsKKwljaGFyICp2Z2lkX2xvb2t1cCA9IE5VTEw7CisKKwkvKiBnZXQgZGF0YSBwb2ludGVycyBmcm9tIGhhc2ggdGFibGUgc28gdGhleSBjYW4gYmUgZnJlZWQgKi8KKworCWluZm9fbG9va3VwID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19pbmZvLCB2Z2lkKTsKKwltZXRhX2xvb2t1cCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fbWV0YWRhdGEsIHZnaWQpOworCW5hbWVfbG9va3VwID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b192Z25hbWUsIHZnaWQpOworCW91dGRhdGVkX3B2c19sb29rdXAgPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX291dGRhdGVkX3B2cywgdmdpZCk7CisJaWYgKG5hbWVfbG9va3VwKQorCQl2Z2lkX2xvb2t1cCA9IGRtX2hhc2hfbG9va3VwX3dpdGhfdmFsKHMtPnZnbmFtZV90b192Z2lkLCBuYW1lX2xvb2t1cCwgdmdpZCwgc3RybGVuKHZnaWQpICsgMSk7CisKKwkvKiByZW1vdmUgaGFzaCB0YWJsZSBtYXBwaW5ncyAqLworCisJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b19pbmZvLCB2Z2lkKTsKKwlkbV9oYXNoX3JlbW92ZShzLT52Z2lkX3RvX21ldGFkYXRhLCB2Z2lkKTsKKwlkbV9oYXNoX3JlbW92ZShzLT52Z2lkX3RvX3ZnbmFtZSwgdmdpZCk7CisJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b19vdXRkYXRlZF9wdnMsIHZnaWQpOworCWlmIChuYW1lX2xvb2t1cCkKKwkJZG1faGFzaF9yZW1vdmVfd2l0aF92YWwocy0+dmduYW1lX3RvX3ZnaWQsIG5hbWVfbG9va3VwLCB2Z2lkLCBzdHJsZW4odmdpZCkgKyAxKTsKKworCS8qIHVwZGF0ZV9wdmlkX3RvX3ZnaWQgd2lsbCBjbGVhci9mcmVlIHRoZSBwdmlkX3RvX3ZnaWQgaGFzaCAqLworCWlmICh1cGRhdGVfcHZpZHMgJiYgbWV0YV9sb29rdXApCisJCSh2b2lkKSBfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBtZXRhX2xvb2t1cCwgIiNvcnBoYW4iLCAwKTsKKworCS8qIGZyZWUgdGhlIHVubWFwcGVkIGRhdGEgKi8KKworCWlmIChpbmZvX2xvb2t1cCkKKwkJZG1fZnJlZShpbmZvX2xvb2t1cCk7CisJaWYgKG1ldGFfbG9va3VwKQorCQlkbV9jb25maWdfZGVzdHJveShtZXRhX2xvb2t1cCk7CisJaWYgKG5hbWVfbG9va3VwKQorCQlkbV9mcmVlKG5hbWVfbG9va3VwKTsKKwlpZiAob3V0ZGF0ZWRfcHZzX2xvb2t1cCkKKwkJZG1fY29uZmlnX2Rlc3Ryb3kob3V0ZGF0ZWRfcHZzX2xvb2t1cCk7CisJaWYgKHZnaWRfbG9va3VwKQorCQlkbV9mcmVlKHZnaWRfbG9va3VwKTsKKwlyZXR1cm4gMTsKK30KKworLyogVGhlIFZHIG11c3QgYmUgbG9ja2VkLiAqLworc3RhdGljIGludCB2Z19yZW1vdmVfaWZfbWlzc2luZyhsdm1ldGFkX3N0YXRlICpzLCBjb25zdCBjaGFyICp2Z2lkLCBpbnQgdXBkYXRlX3B2aWRzKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqdmc7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwdjsKKwljb25zdCBjaGFyICp2Z2lkX2NoZWNrOworCWNvbnN0IGNoYXIgKnB2aWQ7CisJaW50IG1pc3NpbmcgPSAxOworCisJaWYgKCF2Z2lkKQorCQlyZXR1cm4gMDsKKworCWlmICghKHZnID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19tZXRhZGF0YSwgdmdpZCkpKQorCQlyZXR1cm4gMTsKKworCWZvciAocHYgPSBwdnModmctPnJvb3QpOyBwdjsgcHYgPSBwdi0+c2liKSB7CisJCWlmICghKHB2aWQgPSBkbV9jb25maWdfZmluZF9zdHIocHYtPmNoaWxkLCAiaWQiLCBOVUxMKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoKHZnaWRfY2hlY2sgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3ZnaWQsIHB2aWQpKSAmJgorCQkgICAgZG1faGFzaF9sb29rdXAocy0+cHZpZF90b19wdm1ldGEsIHB2aWQpICYmCisJCSAgICAhc3RyY21wKHZnaWQsIHZnaWRfY2hlY2spKQorCQkJbWlzc2luZyA9IDA7IC8qIGF0IGxlYXN0IG9uZSBQViBpcyBhcm91bmQgKi8KKwl9CisKKwlpZiAobWlzc2luZykgeworCQlERUJVR0xPRyhzLCAicmVtb3ZpbmcgZW1wdHkgVkcgJXMiLCB2Z2lkKTsKKwkJcmVtb3ZlX21ldGFkYXRhKHMsIHZnaWQsIHVwZGF0ZV9wdmlkcyk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZW1vdmUgYWxsIGhhc2ggdGFibGUgcmVmZXJlbmNlcyB0byBhcmdfbmFtZSBhbmQgYXJnX3ZnaWQKKyAqIHNvIHRoYXQgbmV3IG1ldGFkYXRhIHVzaW5nIHRoaXMgbmFtZSBhbmQvb3IgdmdpZCBjYW4gYmUgYWRkZWQKKyAqIHdpdGhvdXQgaW50ZXJmZXJlbmNlIHByZXZpb3VzIGRhdGEuCisgKgorICogVGhpcyBpcyB1c2VkIGlmIGEgY29tbWFuZCB1cGRhdGVzIG1ldGFkYXRhIGluIHRoZSBjYWNoZSwKKyAqIGJ1dCB1cGRhdGVfbWV0YWRhdGEgZmluZHMgdGhhdCB3aGF0J3MgaW4gdGhlIGNhY2hlIGlzIG5vdAorICogY29uc2lzdGVudCB3aXRoIGEgbm9ybWFsIHRyYW5zaXRpb24gYmV0d2VlbiBvbGQgYW5kIG5ldworICogbWV0YWRhdGEuICBJZiB0aGlzIGhhcHBlbnMsIGl0IGFzc3VtZXMgdGhhdCB0aGUgY29tbWFuZAorICogaXMgcHJvdmlkaW5nIHRoZSBjb3JyZWN0IG1ldGFkYXRhLCBzbyBpdCBmaXJzdCBjYWxscyB0aGlzCisgKiBmdW5jdGlvbiB0byBwdXJnZSBhbGwgcmVjb3JkcyBvZiB0aGUgb2xkIG1ldGFkYXRhIHNvIHRoZQorICogbmV3IG1ldGFkYXRhIGNhbiBiZSBhZGRlZC4KKyAqLworCitzdGF0aWMgdm9pZCBfcHVyZ2VfbWV0YWRhdGEobHZtZXRhZF9zdGF0ZSAqcywgY29uc3QgY2hhciAqYXJnX25hbWUsIGNvbnN0IGNoYXIgKmFyZ192Z2lkKQoreworCWNoYXIgKnJlbV92Z2lkOworCisJcmVtb3ZlX21ldGFkYXRhKHMsIGFyZ192Z2lkLCAxKTsKKworCWlmICgocmVtX3ZnaWQgPSBkbV9oYXNoX2xvb2t1cF93aXRoX3ZhbChzLT52Z25hbWVfdG9fdmdpZCwgYXJnX25hbWUsIGFyZ192Z2lkLCBzdHJsZW4oYXJnX3ZnaWQpICsgMSkpKSB7CisJCWRtX2hhc2hfcmVtb3ZlX3dpdGhfdmFsKHMtPnZnbmFtZV90b192Z2lkLCBhcmdfbmFtZSwgYXJnX3ZnaWQsIHN0cmxlbihhcmdfdmdpZCkgKyAxKTsKKwkJZG1fZnJlZShyZW1fdmdpZCk7CisJfQorfQorCisvKgorICogVXBkYXRlcyBmb3IgbmV3IHZnaWQgYW5kIG5ldyBtZXRhZGF0YS4KKyAqCisgKiBSZW1vdmUgYW55IGV4aXN0aW5nIHZnX2luZm8gc3RydWN0IHNpbmNlIGl0IHdpbGwgYmUKKyAqIHJlY3JlYXRlZCBieSBsdm1sb2NrZCBpZi93aGVuIG5lZWRlZC4KKyAqCisgKiBSZW1vdmUgYW55IGV4aXN0aW5nIG91dGRhdGVkIHB2cyBzaW5jZSB0aGVpciBtZXRhZGF0YQorICogd2lsbCBubyBsb25nZXIgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVkcuCisgKi8KKworc3RhdGljIGludCBfdXBkYXRlX21ldGFkYXRhX25ld192Z2lkKGx2bWV0YWRfc3RhdGUgKnMsCisJCQkJICAgICBjb25zdCBjaGFyICphcmdfbmFtZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm9sZF92Z2lkLAorCQkJCSAgICAgY29uc3QgY2hhciAqbmV3X3ZnaWQsCisJCQkJICAgICBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKm9sZF9tZXRhLAorCQkJCSAgICAgc3RydWN0IGRtX2NvbmZpZ190cmVlICpuZXdfbWV0YSkKK3sKKwlzdHJ1Y3QgdmdfaW5mbyAqcmVtX2luZm87CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpyZW1fb3V0ZGF0ZWQ7CisJY2hhciAqbmV3X3ZnaWRfZHVwID0gTlVMTDsKKwljaGFyICphcmdfbmFtZV9kdXAgPSBOVUxMOworCWludCBhYm9ydF9kYWVtb24gPSAwOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCEobmV3X3ZnaWRfZHVwID0gZG1fc3RyZHVwKG5ld192Z2lkKSkpCisJCWdvdG8gcmV0OworCisJaWYgKCEoYXJnX25hbWVfZHVwID0gZG1fc3RyZHVwKGFyZ19uYW1lKSkpCisJCWdvdG8gcmV0OworCisJLyoKKwkgKiBUZW1wb3JhcmlseSBvcnBoYW4gdGhlIFBWcyBpbiB0aGUgb2xkIG1ldGFkYXRhLgorCSAqLworCWlmICghX3VwZGF0ZV9wdmlkX3RvX3ZnaWQocywgb2xkX21ldGEsICIjb3JwaGFuIiwgMCkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfdmdpZCBmYWlsZWQgdG8gbW92ZSBQVnMgZm9yICVzIG9sZF92Z2lkICVzIiwgYXJnX25hbWUsIG9sZF92Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byByZXQ7CisJfQorCisJLyoKKwkgKiBSZW1vdmUgdGhpbmdzIHJlbGF0ZWQgdG8gdGhlIG9sZCB2Z2lkLiAobGlrZSByZW1vdmVfbWV0YWRhdGEpCisJICovCisKKwlpZiAoKHJlbV9pbmZvID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19pbmZvLCBvbGRfdmdpZCkpKSB7CisJCWRtX2hhc2hfcmVtb3ZlKHMtPnZnaWRfdG9faW5mbywgb2xkX3ZnaWQpOworCQlkbV9mcmVlKHJlbV9pbmZvKTsKKwl9CisKKwlpZiAoKHJlbV9vdXRkYXRlZCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCBvbGRfdmdpZCkpKSB7CisJCWRtX2hhc2hfcmVtb3ZlKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCBvbGRfdmdpZCk7CisJCWRtX2NvbmZpZ19kZXN0cm95KHJlbV9vdXRkYXRlZCk7CisJfQorCisJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b19tZXRhZGF0YSwgb2xkX3ZnaWQpOworCWRtX2NvbmZpZ19kZXN0cm95KG9sZF9tZXRhKTsKKwlvbGRfbWV0YSA9IE5VTEw7CisKKwlkbV9oYXNoX3JlbW92ZV93aXRoX3ZhbChzLT52Z25hbWVfdG9fdmdpZCwgYXJnX25hbWUsIG9sZF92Z2lkLCBzdHJsZW4ob2xkX3ZnaWQpICsgMSk7CisJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b192Z25hbWUsIG9sZF92Z2lkKTsKKwlkbV9mcmVlKChjaGFyICopb2xkX3ZnaWQpOworCW9sZF92Z2lkID0gTlVMTDsKKworCS8qCisJICogSW5zZXJ0IHRoaW5ncyB3aXRoIHRoZSBuZXcgdmdpZC4KKwkgKi8KKworCWlmICghZG1faGFzaF9pbnNlcnQocy0+dmdpZF90b19tZXRhZGF0YSwgbmV3X3ZnaWQsIG5ld19tZXRhKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX25ld192Z2lkIG91dCBvZiBtZW1vcnkgZm9yIG1ldGEgaGFzaCBpbnNlcnQgZm9yICVzICVzIiwgYXJnX25hbWUsIG5ld192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV9oYXNoX2luc2VydChzLT52Z2lkX3RvX3ZnbmFtZSwgbmV3X3ZnaWQsIGFyZ19uYW1lX2R1cCkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfdmdpZCBvdXQgb2YgbWVtb3J5IGZvciBuYW1lIGhhc2ggaW5zZXJ0IGZvciAlcyAlcyIsIGFyZ19uYW1lLCBuZXdfdmdpZCk7CisJCWFib3J0X2RhZW1vbiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1faGFzaF9pbnNlcnRfYWxsb3dfbXVsdGlwbGUocy0+dmduYW1lX3RvX3ZnaWQsIGFyZ19uYW1lLCBuZXdfdmdpZF9kdXAsIHN0cmxlbihuZXdfdmdpZF9kdXApICsgMSkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfdmdpZCBvdXQgb2YgbWVtb3J5IGZvciB2Z2lkIGhhc2ggaW5zZXJ0IGZvciAlcyAlcyIsIGFyZ19uYW1lLCBuZXdfdmdpZCk7CisJCWFib3J0X2RhZW1vbiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVhc3NpZ24gUFZzIGJhc2VkIG9uIHRoZSBuZXcgbWV0YWRhdGEuCisJICovCisJaWYgKCFfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBuZXdfbWV0YSwgbmV3X3ZnaWQsIDEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGFfbmV3X25hbWUgZmFpbGVkIHRvIHVwZGF0ZSBQVnMgZm9yICVzICVzIiwgYXJnX25hbWUsIG5ld192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfdmdpZCBpcyBkb25lIGZvciAlcyAlcyIsIGFyZ19uYW1lLCBuZXdfdmdpZCk7CisJcmV0dmFsID0gMTsKK291dDoKK3JldDoKKwlpZiAoIW5ld192Z2lkX2R1cCB8fCAhYXJnX25hbWVfZHVwIHx8IGFib3J0X2RhZW1vbikgeworCQlFUlJPUihzLCAibHZtZXRhZCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhbmQgaXMgYWJvcnRpbmcuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoIXJldHZhbCAmJiBuZXdfbWV0YSkKKwkJZG1fY29uZmlnX2Rlc3Ryb3kobmV3X21ldGEpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBVcGRhdGVzIGZvciBuZXcgbmFtZSBhbmQgbmV3IG1ldGFkYXRhLgorICoKKyAqIFJlbW92ZSBhbnkgZXhpc3RpbmcgdmdfaW5mbyBzdHJ1Y3Qgc2luY2UgaXQgd2lsbCBiZQorICogcmVjcmVhdGVkIGJ5IGx2bWxvY2tkIGlmL3doZW4gbmVlZGVkLgorICoKKyAqIFJlbW92ZSBhbnkgZXhpc3Rpbmcgb3V0ZGF0ZWQgcHZzIHNpbmNlIHRoZWlyIG1ldGFkYXRhCisgKiB3aWxsIG5vIGxvbmdlciBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBWRy4KKyAqLworCitzdGF0aWMgaW50IF91cGRhdGVfbWV0YWRhdGFfbmV3X25hbWUobHZtZXRhZF9zdGF0ZSAqcywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmFyZ192Z2lkLAorCQkJCSAgICAgY29uc3QgY2hhciAqb2xkX25hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSwKKwkJCQkgICAgIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqb2xkX21ldGEsCisJCQkJICAgICBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKm5ld19tZXRhKQoreworCXN0cnVjdCB2Z19pbmZvICpyZW1faW5mbzsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnJlbV9vdXRkYXRlZDsKKwljaGFyICpuZXdfbmFtZV9kdXAgPSBOVUxMOworCWNoYXIgKmFyZ192Z2lkX2R1cCA9IE5VTEw7CisJaW50IGFib3J0X2RhZW1vbiA9IDA7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIShuZXdfbmFtZV9kdXAgPSBkbV9zdHJkdXAobmV3X25hbWUpKSkKKwkJZ290byByZXQ7CisKKwlpZiAoIShhcmdfdmdpZF9kdXAgPSBkbV9zdHJkdXAoYXJnX3ZnaWQpKSkKKwkJZ290byByZXQ7CisKKwkvKgorCSAqIFRlbXBvcmFyaWx5IG9ycGhhbiB0aGUgUFZzIGluIHRoZSBvbGQgbWV0YWRhdGEuCisJICovCisJaWYgKCFfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBvbGRfbWV0YSwgIiNvcnBoYW4iLCAwKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX25ld19uYW1lIGZhaWxlZCB0byBtb3ZlIFBWcyBmb3Igb2xkX25hbWUgJXMgJXMiLCBvbGRfbmFtZSwgYXJnX3ZnaWQpOworCQlhYm9ydF9kYWVtb24gPSAxOworCQlnb3RvIHJldDsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGluZ3MgcmVsYXRlZCB0byB0aGUgb2xkIG5hbWUuCisJICovCisKKwlpZiAoKHJlbV9pbmZvID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19pbmZvLCBhcmdfdmdpZCkpKSB7CisJCWRtX2hhc2hfcmVtb3ZlKHMtPnZnaWRfdG9faW5mbywgYXJnX3ZnaWQpOworCQlkbV9mcmVlKHJlbV9pbmZvKTsKKwl9CisKKwlpZiAoKHJlbV9vdXRkYXRlZCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCBhcmdfdmdpZCkpKSB7CisJCWRtX2hhc2hfcmVtb3ZlKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCBhcmdfdmdpZCk7CisJCWRtX2NvbmZpZ19kZXN0cm95KHJlbV9vdXRkYXRlZCk7CisJfQorCisJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b19tZXRhZGF0YSwgYXJnX3ZnaWQpOworCWRtX2NvbmZpZ19kZXN0cm95KG9sZF9tZXRhKTsKKwlvbGRfbWV0YSA9IE5VTEw7CisKKwlkbV9oYXNoX3JlbW92ZShzLT52Z2lkX3RvX3ZnbmFtZSwgYXJnX3ZnaWQpOworCWRtX2hhc2hfcmVtb3ZlX3dpdGhfdmFsKHMtPnZnbmFtZV90b192Z2lkLCBvbGRfbmFtZSwgYXJnX3ZnaWQsIHN0cmxlbihhcmdfdmdpZCkgKyAxKTsKKwlkbV9mcmVlKChjaGFyICopb2xkX25hbWUpOworCW9sZF9uYW1lID0gTlVMTDsKKworCS8qCisJICogSW5zZXJ0IHRoaW5ncyB3aXRoIHRoZSBuZXcgbmFtZS4KKwkgKi8KKworCWlmICghZG1faGFzaF9pbnNlcnQocy0+dmdpZF90b19tZXRhZGF0YSwgYXJnX3ZnaWQsIG5ld19tZXRhKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX25ld19uYW1lIG91dCBvZiBtZW1vcnkgZm9yIG1ldGEgaGFzaCBpbnNlcnQgZm9yICVzICVzIiwgbmV3X25hbWUsIGFyZ192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV9oYXNoX2luc2VydChzLT52Z2lkX3RvX3ZnbmFtZSwgYXJnX3ZnaWQsIG5ld19uYW1lX2R1cCkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfbmFtZSBvdXQgb2YgbWVtb3J5IGZvciBuYW1lIGhhc2ggaW5zZXJ0IGZvciAlcyAlcyIsIG5ld19uYW1lLCBhcmdfdmdpZCk7CisJCWFib3J0X2RhZW1vbiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1faGFzaF9pbnNlcnRfYWxsb3dfbXVsdGlwbGUocy0+dmduYW1lX3RvX3ZnaWQsIG5ld19uYW1lLCBhcmdfdmdpZF9kdXAsIHN0cmxlbihhcmdfdmdpZF9kdXApICsgMSkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfbmFtZSBvdXQgb2YgbWVtb3J5IGZvciB2Z2lkIGhhc2ggaW5zZXJ0IGZvciAlcyAlcyIsIG5ld19uYW1lLCBhcmdfdmdpZCk7CisJCWFib3J0X2RhZW1vbiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVhc3NpZ24gUFZzIGJhc2VkIG9uIHRoZSBuZXcgbWV0YWRhdGEuCisJICovCisJaWYgKCFfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBuZXdfbWV0YSwgYXJnX3ZnaWQsIDEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGFfbmV3X25hbWUgZmFpbGVkIHRvIHVwZGF0ZSBQVnMgZm9yICVzICVzIiwgbmV3X25hbWUsIGFyZ192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YV9uZXdfbmFtZSBpcyBkb25lIGZvciAlcyAlcyIsIG5ld19uYW1lLCBhcmdfdmdpZCk7CisJcmV0dmFsID0gMTsKK291dDoKK3JldDoKKwlpZiAoIW5ld19uYW1lX2R1cCB8fCAhYXJnX3ZnaWRfZHVwIHx8IGFib3J0X2RhZW1vbikgeworCQlFUlJPUihzLCAibHZtZXRhZCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhbmQgaXMgYWJvcnRpbmcuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoIXJldHZhbCAmJiBuZXdfbWV0YSkKKwkJZG1fY29uZmlnX2Rlc3Ryb3kobmV3X21ldGEpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIEFkZCBuZXcgZW50cmllcyB0byBhbGwgaGFzaCB0YWJsZXMuCisgKi8KKworc3RhdGljIGludCBfdXBkYXRlX21ldGFkYXRhX2FkZF9uZXcobHZtZXRhZF9zdGF0ZSAqcywgY29uc3QgY2hhciAqbmV3X25hbWUsIGNvbnN0IGNoYXIgKm5ld192Z2lkLAorCQkJCSAgICBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKm5ld19tZXRhKQoreworCWNoYXIgKm5ld19uYW1lX2R1cCA9IE5VTEw7CisJY2hhciAqbmV3X3ZnaWRfZHVwID0gTlVMTDsKKwlpbnQgYWJvcnRfZGFlbW9uID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCURFQlVHTE9HKHMsICJ1cGRhdGVfbWV0YWRhdGFfYWRkX25ldyBmb3IgJXMgJXMiLCBuZXdfbmFtZSwgbmV3X3ZnaWQpOworCisJaWYgKCEobmV3X25hbWVfZHVwID0gZG1fc3RyZHVwKG5ld19uYW1lKSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoIShuZXdfdmdpZF9kdXAgPSBkbV9zdHJkdXAobmV3X3ZnaWQpKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICghZG1faGFzaF9pbnNlcnQocy0+dmdpZF90b19tZXRhZGF0YSwgbmV3X3ZnaWQsIG5ld19tZXRhKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX2FkZF9uZXcgb3V0IG9mIG1lbW9yeSBmb3IgbWV0YSBoYXNoIGluc2VydCBmb3IgJXMgJXMiLCBuZXdfbmFtZSwgbmV3X3ZnaWQpOworCQlhYm9ydF9kYWVtb24gPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX2hhc2hfaW5zZXJ0KHMtPnZnaWRfdG9fdmduYW1lLCBuZXdfdmdpZCwgbmV3X25hbWVfZHVwKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX2FkZF9uZXcgb3V0IG9mIG1lbW9yeSBmb3IgbmFtZSBoYXNoIGluc2VydCBmb3IgJXMgJXMiLCBuZXdfbmFtZSwgbmV3X3ZnaWQpOworCQlhYm9ydF9kYWVtb24gPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX2hhc2hfaW5zZXJ0X2FsbG93X211bHRpcGxlKHMtPnZnbmFtZV90b192Z2lkLCBuZXdfbmFtZSwgbmV3X3ZnaWRfZHVwLCBzdHJsZW4obmV3X3ZnaWRfZHVwKSArIDEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGFfYWRkX25ldyBvdXQgb2YgbWVtb3J5IGZvciB2Z2lkIGhhc2ggaW5zZXJ0IGZvciAlcyAlcyIsIG5ld19uYW1lLCBuZXdfdmdpZCk7CisJCWFib3J0X2RhZW1vbiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghX3VwZGF0ZV9wdmlkX3RvX3ZnaWQocywgbmV3X21ldGEsIG5ld192Z2lkLCAxKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhX2FkZF9uZXcgZmFpbGVkIHRvIHVwZGF0ZSBQVnMgZm9yICVzICVzIiwgbmV3X25hbWUsIG5ld192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YV9hZGRfbmV3IGlzIGRvbmUgZm9yICVzICVzIiwgbmV3X25hbWUsIG5ld192Z2lkKTsKKwlyZXR2YWwgPSAxOworb3V0Ogorb3V0X2ZyZWU6CisJaWYgKCFuZXdfbmFtZV9kdXAgfHwgIW5ld192Z2lkX2R1cCB8fCBhYm9ydF9kYWVtb24pIHsKKwkJaWYgKG5ld19uYW1lX2R1cCkKKwkJCWRtX2ZyZWUobmV3X25hbWVfZHVwKTsKKwkJaWYgKG5ld192Z2lkX2R1cCkKKwkJCWRtX2ZyZWUobmV3X3ZnaWRfZHVwKTsKKwkJRVJST1IocywgImx2bWV0YWQgY291bGQgbm90IGJlIHVwZGF0ZWQgYW5kIGlzIGFib3J0aW5nLiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKCFyZXR2YWwgJiYgbmV3X21ldGEpCisJCWRtX2NvbmZpZ19kZXN0cm95KG5ld19tZXRhKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogTm8gbG9ja3MgbmVlZCB0byBiZSBoZWxkLiBUaGUgcG9pbnRlcnMgYXJlIG5ldmVyIHVzZWQgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YKKyAqIHRoaXMgZnVuY3Rpb24sIHNvIHRoZXkgY2FuIGJlIHNhZmVseSBkZXN0cm95ZWQgYWZ0ZXIgdXBkYXRlX21ldGFkYXRhIHJldHVybnMKKyAqIChhbnl0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiByZXRhaW5lZCBpcyBjb3BpZWQpLgorICoKKyAqIFdoZW4gdGhpcyBpcyBjYWxsZWQgZnJvbSBwdl9mb3VuZCwgdGhlIG1ldGFkYXRhIHdhcyByZWFkIGZyb20gYSBzaW5nbGUKKyAqIFBWIHNwZWNpZmllZCBieSB0aGUgcHZpZCBhcmcgYW5kIHJldF9vbGRfc2VxIGlzIG5vdCBOVUxMLiAgVGhlIG1ldGFkYXRhCisgKiBzaG91bGQgbWF0Y2ggdGhlIGV4aXN0aW5nIG1ldGFkYXRhIChtYXRjaGluZyBzZXFubykuICBJZiB0aGUgbWV0YWRhdGEKKyAqIGZyb20gcHZfZm91bmQgaGFzIGEgc21hbGxlciBzZXFubywgaXQgbWVhbnMgdGhhdCB0aGUgUFYgaXMgb3V0ZGF0ZWQKKyAqICh3YXMgcHJldmlvdXNseSB1c2VkIGluIHRoZSBWRyBhbmQgbm93IHJlYXBwZWFyZWQgYWZ0ZXIgY2hhbmdlcyB0byB0aGUgVkcpLgorICogVGhlIG5leHQgY29tbWFuZCB0byBhY2Nlc3MgdGhlIFZHIHdpbGwgZXJhc2UgdGhlIG91dGRhdGVkIFBWIGFuZCB0aGVuIGNsZWFyCisgKiB0aGUgb3V0ZGF0ZWQgcHYgcmVjb3JkIGhlcmUuICBJZiB0aGUgbWV0YWRhdGEgZnJvbSBwdl9mb3VuZCBoYXMgYSBsYXJnZXIKKyAqIHNlcW5vIHRoYW4gdGhlIGV4aXN0aW5nIG1ldGFkYXRhLCBpdCBtZWFucyAuLi4gKGV4aXN0aW5nIHB2cyBhcmUgb3V0ZGF0ZWQ/KQorICoKKyAqIFdoZW4gdGhpcyBpcyBjYWxlbGQgZnJvbSB2Z191cGRhdGUsIHRoZSBtZXRhZGF0YSBpcyBmcm9tIGEgY29tbWFuZCB0aGF0CisgKiBoYXMgbmV3IG1ldGFkYXRhIHRoYXQgc2hvdWxkIHJlcGxhY2UgdGhlIGV4aXN0aW5nIG1ldGFkYXRhLgorICogcHZpZCBhbmQgcmV0X29sZF9zZXEgYXJlIGJvdGggTlVMTC4KKyAqLworCitzdGF0aWMgaW50IF91cGRhdGVfbWV0YWRhdGEobHZtZXRhZF9zdGF0ZSAqcywgY29uc3QgY2hhciAqYXJnX25hbWUsIGNvbnN0IGNoYXIgKmFyZ192Z2lkLAorCQkJICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbmV3X21ldGFkYXRhLCBpbnQgKnJldF9vbGRfc2VxLAorCQkJICAgIGNvbnN0IGNoYXIgKnB2aWQpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpvbGRfbWV0YSA9IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpuZXdfbWV0YSA9IE5VTEw7CisJY29uc3QgY2hhciAqYXJnX25hbWVfbG9va3VwOyAvKiBuYW1lIGxvb2t1cCByZXN1bHQgZnJvbSBhcmdfdmdpZCAqLworCWNvbnN0IGNoYXIgKmFyZ192Z2lkX2xvb2t1cDsgLyogdmdpZCBsb29rdXAgcmVzdWx0IGZyb20gYXJnX25hbWUgKi8KKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqbmV3X25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9sZF92Z2lkID0gTlVMTDsKKwljb25zdCBjaGFyICpuZXdfdmdpZCA9IE5VTEw7CisJY29uc3QgY2hhciAqbmV3X21ldGFkYXRhX3ZnaWQ7CisJaW50IG9sZF9zZXEgPSAtMTsKKwlpbnQgbmV3X3NlcSA9IC0xOworCWludCBuZWVkc19yZXBhaXIgPSAwOworCWludCBhYm9ydF9kYWVtb24gPSAwOworCWludCByZXR2YWwgPSAwOworCWludCBjb3VudCA9IDA7CisKKwlpZiAoIWFyZ192Z2lkIHx8ICFhcmdfbmFtZSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIG1pc3NpbmcgYXJncyBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBwdmlkICVzIiwKKwkJICAgICAgYXJnX3ZnaWQgPzogIm5vbmUiLCBhcmdfbmFtZSA/OiAibm9uZSIsIHB2aWQgPzogIm5vbmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBiZWdpbiBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBwdmlkICVzIiwKKwkJIGFyZ192Z2lkLCBhcmdfbmFtZSwgcHZpZCA/OiAibm9uZSIpOworCisJLyoKKwkgKiBCZWdpbiBieSBmaWd1cmluZyBvdXQgd2hhdCBoYXMgY2hhbmdlZDoKKwkgKiAuIHRoZSBWRyBjb3VsZCBiZSBuZXcgLSBmb3VuZCBubyBleGlzdGluZyByZWNvcmQgb2YgdGhlIHZnaWQgb3IgbmFtZS4KKwkgKiAuIHRoZSBWRyBjb3VsZCBoYXZlIGEgbmV3IHZnaWQgLSBmb3VuZCBhbiBleGlzdGluZyByZWNvcmQgb2YgdGhlIG5hbWUuCisJICogLiB0aGUgVkcgY291bGQgaGF2ZSBhIG5ldyBuYW1lIC0gZm91bmQgYW4gZXhpc3RpbmcgcmVjb3JkIG9mIHRoZSB2Z2lkLgorCSAqIC4gdGhlIFZHIGNvdWxkIGhhdmUgdW5jaGFuZ2VkIHZnaWQgYW5kIG5hbWUgLSBmb3VuZCBleGlzdGluZyByZWNvcmQgb2YgYm90aC4KKwkgKi8KKworCWFyZ19uYW1lX2xvb2t1cCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fdmduYW1lLCBhcmdfdmdpZCk7CisJYXJnX3ZnaWRfbG9va3VwID0gZG1faGFzaF9sb29rdXBfd2l0aF92YWwocy0+dmduYW1lX3RvX3ZnaWQsIGFyZ19uYW1lLCBhcmdfdmdpZCwgc3RybGVuKGFyZ192Z2lkKSArIDEpOworCisJLyoKKwkgKiBBIG5ldyBWRyB3aGVuIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlY29yZCBvZiB0aGUgbmFtZSBvciB2Z2lkIGFyZ3MuCisJICovCisJaWYgKCFhcmdfbmFtZV9sb29rdXAgJiYgIWFyZ192Z2lkX2xvb2t1cCkgeworCQluZXdfdmdpZCA9IGFyZ192Z2lkOworCQluZXdfbmFtZSA9IGFyZ19uYW1lOworCisJCURFQlVHTE9HKHMsICJ1cGRhdGVfbWV0YWRhdGEgbmV3IG5hbWUgJXMgYW5kIG5ldyB2Z2lkICVzIiwKKwkJCSBuZXdfbmFtZSwgbmV3X3ZnaWQpOworCQlnb3RvIHVwZGF0ZTsKKwl9CisKKwkvKgorCSAqIEFuIGV4aXN0aW5nIG5hbWUgaGFzIGEgbmV3IHZnaWQgKG5ld192Z2lkID0gYXJnX3ZnaWQpLgorCSAqIEEgbG9va3VwIG9mIHRoZSBuYW1lIGFyZyB3YXMgc3VjY2Vzc2Z1bCBpbiBmaW5kaW5nIGFyZ192Z2lkX2xvb2t1cCwKKwkgKiBidXQgdGhhdCByZXN1bHRpbmcgdmdpZCBkb2Vzbid0IG1hdGNoIHRoZSBhcmdfdmdpZC4KKwkgKi8KKwlpZiAoYXJnX3ZnaWRfbG9va3VwICYmIHN0cmNtcChhcmdfdmdpZF9sb29rdXAsIGFyZ192Z2lkKSkgeworCQlpZiAoYXJnX25hbWVfbG9va3VwKSB7CisJCQkvKgorCQkJICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLgorCQkJICogYXJnX3ZnaWQgc2hvdWxkIGJlIG5ldyBhbmQgc2hvdWxkIG5vdCBtYXAgdG8gYW55IG5hbWUuCisJCQkgKi8KKwkJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgYXJnX3ZnaWQgJXMgYXJnX25hbWUgJXMgdW5leHBlY3RlZCBhcmdfbmFtZV9sb29rdXAgJXMiLAorCQkJICAgICAgYXJnX3ZnaWQsIGFyZ19uYW1lLCBhcmdfbmFtZV9sb29rdXApOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJbmV3X3ZnaWQgPSBhcmdfdmdpZDsKKwkJb2xkX3ZnaWQgPSBkbV9oYXNoX2xvb2t1cF93aXRoX2NvdW50KHMtPnZnbmFtZV90b192Z2lkLCBhcmdfbmFtZSwgJmNvdW50KTsKKworCQkvKgorCQkgKiBGSVhNRTogdGhpcyBlbnN1cmVzIHRoYXQgYXJnX25hbWUgbWFwcyB0byBvbmx5IG9uZSBleGlzdGluZworCQkgKiBWRyAob2xkX3ZnaWQpLCBiZWNhdXNlIGlmIGl0IG1hcHMgdG8gbXVsdGlwbGUgdmdpZHMsIHRoZW4gd2UKKwkJICogZG9uJ3Qga25vdyB3aGljaCBvbmUgc2hvdWxkIGdldCB0aGUgbmV3IHZnaWQgKGFyZ192Z2lkKS4gIElmCisJCSAqIHRoaXMgZnVuY3Rpb24gd2FzIGdpdmVuIGJvdGggdGhlIGV4aXN0aW5nIG5hbWUgYW5kIGV4aXN0aW5nCisJCSAqIHZnaWQgdG8gaWRlbnRpZnkgdGhlIFZHLCB0aGVuIHRoaXMgd291bGRuJ3QgYmUgYSBwcm9ibGVtLgorCQkgKiBCdXQgYXMgaXQgaXMgbm93LCB0aGUgdmdpZCBhcmcgdG8gdGhpcyBmdW5jdGlvbiBpcyB0aGUgbmV3CisJCSAqIHZnaWQgYW5kIHRoZSBleGlzdGluZyBWRyBpcyBzcGVjaWZpZWQgb25seSBieSBuYW1lLgorCQkgKi8KKwkJaWYgKG9sZF92Z2lkICYmIChjb3VudCA+IDEpKSB7CisJCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGFyZ192Z2lkICVzIGFyZ19uYW1lICVzIGZvdW5kICVkIHZnaWRzIGZvciBuYW1lIiwKKwkJCSAgICAgIGFyZ192Z2lkLCBhcmdfbmFtZSwgY291bnQpOworCQkJb2xkX3ZnaWQgPSBOVUxMOworCQl9CisKKwkJaWYgKCFvbGRfdmdpZCkgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAqLworCQkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBubyBvbGRfdmdpZCIsCisJCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUpOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJaWYgKCEob2xkX21ldGEgPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX21ldGFkYXRhLCBvbGRfdmdpZCkpKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICovCisJCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGFyZ192Z2lkICVzIGFyZ19uYW1lICVzIG9sZF92Z2lkICVzIG5vIG9sZF9tZXRhIiwKKwkJCSAgICAgIGFyZ192Z2lkLCBhcmdfbmFtZSwgb2xkX3ZnaWQpOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBleGlzdGluZyBuYW1lICVzIGhhcyBuZXcgdmdpZCAlcyBvbGQgdmdpZCAlcyIsCisJCQkgYXJnX25hbWUsIG5ld192Z2lkLCBvbGRfdmdpZCk7CisJCWdvdG8gdXBkYXRlOworCX0KKworCS8qCisJICogQW4gZXhpc3RpbmcgdmdpZCBoYXMgYSBuZXcgbmFtZSAobmV3X25hbWUgPSBhcmdfbmFtZSkuCisJICogQSBsb29rdXAgb2YgdGhlIHZnaWQgYXJnIHdhcyBzdWNjZXNzZnVsIGluIGZpbmRpbmcgYXJnX25hbWVfbG9va3VwLAorCSAqIGJ1dCB0aGF0IHJlc3VsdGluZyBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlIGFyZ19uYW1lLgorCSAqLworCWlmIChhcmdfbmFtZV9sb29rdXAgJiYgc3RyY21wKGFyZ19uYW1lX2xvb2t1cCwgYXJnX25hbWUpKSB7CisJCWlmIChhcmdfdmdpZF9sb29rdXApIHsKKwkJCS8qCisJCQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uCisJCQkgKiBhcmdfbmFtZSBzaG91bGQgYmUgbmV3IGFuZCBzaG91bGQgbm90IG1hcCB0byBhbnkgdmdpZC4KKwkJCSAqLworCQkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyB1bmV4cGVjdGVkIGFyZ192Z2lkX2xvb2t1cCAlcyIsCisJCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUsIGFyZ192Z2lkX2xvb2t1cCk7CisJCQluZWVkc19yZXBhaXIgPSAxOworCQkJZ290byB1cGRhdGU7CisJCX0KKworCQluZXdfbmFtZSA9IGFyZ19uYW1lOworCQlvbGRfbmFtZSA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fdmduYW1lLCBhcmdfdmdpZCk7CisKKwkJaWYgKCFvbGRfbmFtZSkgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAqLworCQkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBubyBvbGRfbmFtZSIsCisJCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUpOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJaWYgKCEob2xkX21ldGEgPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX21ldGFkYXRhLCBhcmdfdmdpZCkpKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICovCisJCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGFyZ192Z2lkICVzIGFyZ19uYW1lICVzIG9sZF9uYW1lICVzIG5vIG9sZF9tZXRhIiwKKwkJCSAgICAgIGFyZ192Z2lkLCBhcmdfbmFtZSwgb2xkX25hbWUpOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBleGlzdGluZyB2Z2lkICVzIGhhcyBuZXcgbmFtZSAlcyBvbGQgbmFtZSAlcyIsCisJCQkgYXJnX3ZnaWQsIG5ld19uYW1lLCBvbGRfbmFtZSk7CisJCWdvdG8gdXBkYXRlOworCX0KKworCS8qCisJICogQW4gZXhpc3RpbmcgVkcgaGFzIHVuY2hhbmdlZCBuYW1lIGFuZCB2Z2lkLgorCSAqLworCWlmICghbmV3X3ZnaWQgJiYgIW5ld19uYW1lKSB7CisJCWlmICghYXJnX3ZnaWRfbG9va3VwIHx8ICFhcmdfbmFtZV9sb29rdXApIHsKKwkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gKi8KKwkJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgYXJnX3ZnaWQgJXMgYXJnX25hbWUgJXMgbWlzc2luZyBsb29rdXBzIHZnaWQgJXMgbmFtZSAlcyIsCisJCQkgICAgICBhcmdfdmdpZCA/OiAibm9uZSIsIGFyZ19uYW1lID86ICJub25lIiwgYXJnX3ZnaWRfbG9va3VwID86ICJub25lIiwgYXJnX25hbWVfbG9va3VwID86ICJub25lIik7CisJCQluZWVkc19yZXBhaXIgPSAxOworCQkJZ290byB1cGRhdGU7CisJCX0KKworCQlpZiAoc3RyY21wKGFyZ19uYW1lX2xvb2t1cCwgYXJnX25hbWUpKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICovCisJCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGFyZ192Z2lkICVzIGFyZ19uYW1lICVzIG1pc21hdGNoIGFyZ19uYW1lX2xvb2t1cCAlcyIsCisJCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUsIGFyZ19uYW1lX2xvb2t1cCk7CisJCQluZWVkc19yZXBhaXIgPSAxOworCQkJZ290byB1cGRhdGU7CisJCX0KKworCQlpZiAoc3RyY21wKGFyZ192Z2lkX2xvb2t1cCwgYXJnX3ZnaWQpKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICBUd28gVkdzIHdpdGggdGhlIHNhbWUgbmFtZSBpcyBoYW5kbGVkIGFib3ZlLiAqLworCQkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBtaXNtYXRjaCBhcmdfdmdpZF9sb29rdXAgJXMiLAorCQkJICAgICAgYXJnX3ZnaWQsIGFyZ19uYW1lLCBhcmdfdmdpZF9sb29rdXApOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJLyogb2xkX3ZnaWQgPT0gYXJnX3ZnaWQsIGFuZCBvbGRfbmFtZSA9PSBhcmdfbmFtZSAqLworCisJCWlmICghKG9sZF9tZXRhID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19tZXRhZGF0YSwgYXJnX3ZnaWQpKSkgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAqLworCQkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBhcmdfdmdpZCAlcyBhcmdfbmFtZSAlcyBubyBvbGRfbWV0YSIsCisJCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUpOworCQkJbmVlZHNfcmVwYWlyID0gMTsKKwkJCWdvdG8gdXBkYXRlOworCQl9CisKKwkJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBleGlzdGluZyB2Z2lkICVzIGFuZCBleGlzdGluZyBuYW1lICVzIiwKKwkJCSBhcmdfdmdpZCwgYXJnX25hbWUpOworCQlnb3RvIHVwZGF0ZTsKKwl9CisKKyB1cGRhdGU6CisJZmlsdGVyX21ldGFkYXRhKG5ld19tZXRhZGF0YSk7IC8qIHNhbml0aXplICovCisKKwkvKgorCSAqIEZJWE1FOiB2ZXJpZnkgdGhhdCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBQViBpbiBjb21tb24gYmV0d2VlbgorCSAqIHRoZSBvbGQgYW5kIG5ldyBtZXRhZGF0YT8KKwkgKi8KKworCWlmICghKG5ld19tZXRhID0gZG1fY29uZmlnX2NyZWF0ZSgpKSB8fAorCSAgICAhKG5ld19tZXRhLT5yb290ID0gZG1fY29uZmlnX2Nsb25lX25vZGUobmV3X21ldGEsIG5ld19tZXRhZGF0YSwgMCkpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgb3V0IG9mIG1lbW9yeSBmb3IgbmV3IG1ldGFkYXRhIGZvciAlcyAlcyIsCisJCSAgICAgIGFyZ19uYW1lLCBhcmdfdmdpZCk7CisJCS8qIEZJWE1FOiBzaG91bGQgd2UgcHVyZ2UgdGhlIG9sZCBtZXRhZGF0YSBoZXJlPyAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgc2Vxbm8gZnJvbSBleGlzdGluZyAob2xkKSBhbmQgbmV3IG1ldGFkYXRhIGFuZCBwZXJmb3JtCisJICogc2FuaXR5IGNoZWNrcyBmb3IgdHJhbnNpdGlvbnMgdGhhdCBnZW5lcmFsbHkgc2hvdWxkbid0IGhhcHBlbi4KKwkgKiBTb21ldGltZXMgaWdub3JlIHRoZSBuZXcgbWV0YWRhdGEgYW5kIGxlYXZlIHRoZSBleGlzdGluZyBtZXRhZGF0YQorCSAqIGFsb25lLCBhbmQgc29tZXRpbWVzIHB1cmdlIHRoZSBleGlzdGluZyBtZXRhZGF0YSBhbmQgYWRkIHRoZSBuZXcuCisJICogVGhpcyBvZnRlbiBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG5ldyBtZXRhZGF0YSBjb21lcyBmcm9tIGEgc2luZ2xlCisJICogUFYgKHZpYSBwdl9mb3VuZCkgdGhhdCdzIGJlZW4gc2Nhbm5lZCwgb3IgYSB2Z191cGRhdGUgc2VudCBmcm9tIGEKKwkgKiBjb21tYW5kLgorCSAqLworCisJbmV3X3NlcSA9IGRtX2NvbmZpZ19maW5kX2ludChuZXdfbWV0YWRhdGEsICJtZXRhZGF0YS9zZXFubyIsIC0xKTsKKworCWlmIChvbGRfbWV0YSkKKwkJb2xkX3NlcSA9IGRtX2NvbmZpZ19maW5kX2ludChvbGRfbWV0YS0+cm9vdCwgIm1ldGFkYXRhL3NlcW5vIiwgLTEpOworCisJaWYgKHJldF9vbGRfc2VxKQorCQkqcmV0X29sZF9zZXEgPSBvbGRfbWV0YSA/IG9sZF9zZXEgOiBuZXdfc2VxOworCisJLyoKKwkgKiBUaGUgbmV3IG1ldGFkYXRhIGhhcyBhbiBpbnZhbGlkIHNlcW5vLgorCSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsIGlnbm9yZSB0aGUgbmV3IG1ldGFkYXRhLgorCSAqLworCWlmIChuZXdfc2VxIDw9IDApIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBpZ25vcmUgbmV3IG1ldGFkYXRhIGJlY2F1c2Ugb2YgaW52YWxpZCBzZXFubyBmb3IgJXMgJXMiLAorCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUpOworCQlERUJVR0xPR19jZnQocywgIk5FVzogIiwgbmV3X21ldGFkYXRhKTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgbmV3IG1ldGFkYXRhIGlzIG1pc3NpbmcgYW4gaW50ZXJuYWwgdmdpZC4KKwkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCBpZ25vcmUgdGhlIG5ldyBtZXRhZGF0YS4KKwkgKi8KKwlpZiAoIShuZXdfbWV0YWRhdGFfdmdpZCA9IGRtX2NvbmZpZ19maW5kX3N0cihuZXdfbWV0YS0+cm9vdCwgIm1ldGFkYXRhL2lkIiwgTlVMTCkpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgaGFzIG5vIGludGVybmFsIHZnaWQgZm9yICVzICVzIiwKKwkJICAgICAgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJREVCVUdMT0dfY2Z0KHMsICJORVc6ICIsIG5ld19tZXRhZGF0YSk7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIG5ldyBtZXRhZGF0YSBpbnRlcm5hbCB2Z2lkIGRvZXNuJ3QgbWF0Y2ggdGhlIGFyZyB2Z2lkLgorCSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsIGlnbm9yZSB0aGUgbmV3IG1ldGFkYXRhLgorCSAqLworCWlmIChzdHJjbXAobmV3X21ldGFkYXRhX3ZnaWQsIGFyZ192Z2lkKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGhhcyBiYWQgaW50ZXJuYWwgdmdpZCAlcyBmb3IgJXMgJXMiLAorCQkgICAgICBuZXdfbWV0YWRhdGFfdmdpZCwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJREVCVUdMT0dfY2Z0KHMsICJORVc6ICIsIG5ld19tZXRhZGF0YSk7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQSBzaW5nbGUgUFYgYXBwZWFycyB3aXRoIG1ldGFkYXRhIHRoYXQncyBpbmNvbnNpc3RlbnQgd2l0aAorCSAqIGV4aXN0aW5nLCBpZ25vcmUgdGhlIFBWLiAgRklYTUU6IG1ha2UgaXQgb3V0ZGF0ZWQ/CisJICovCisJaWYgKHB2aWQgJiYgbmVlZHNfcmVwYWlyKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgaWdub3JlIGluY29uc2lzdGVudCBtZXRhZGF0YSBvbiBQViAlcyBzZXFubyAlZCBmb3IgJXMgJXMgc2Vxbm8gJWQiLAorCQkgICAgICBwdmlkLCBuZXdfc2VxLCBhcmdfdmdpZCwgYXJnX25hbWUsIG9sZF9zZXEpOworCQlpZiAob2xkX21ldGEpCisJCQlERUJVR0xPR19jZnQocywgIk9MRDogIiwgb2xkX21ldGEtPnJvb3QpOworCQlERUJVR0xPR19jZnQocywgIk5FVzogIiwgbmV3X21ldGFkYXRhKTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBIFZHIHVwZGF0ZSB3aXRoIG1ldGFkYXRhIHRoYXQncyBpbmNvbnNpc3RlbnQgd2l0aCBleGlzdGluZy4KKwkgKi8KKwlpZiAoIXB2aWQgJiYgbmVlZHNfcmVwYWlyKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgaW5jb25zaXN0ZW50IHdpdGggY2FjaGUgZm9yIHZnaWQgJXMgYW5kIG5hbWUgJXMiLAorCQkgICAgICBhcmdfdmdpZCwgYXJnX25hbWUpOworCQlpZiAob2xkX21ldGEpCisJCQlERUJVR0xPR19jZnQocywgIk9MRDogIiwgb2xkX21ldGEtPnJvb3QpOworCQlERUJVR0xPR19jZnQocywgIk5FVzogIiwgbmV3X21ldGFkYXRhKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBIHNpbmdsZSBQViBhcHBlYXJzIHdpdGggbWV0YWRhdGEgdGhhdCdzIG9sZGVyIHRoYW4gdGhlIGV4aXN0aW5nLAorCSAqIGUuZy4gYW4gUFYgdGhhdCBoYWQgYmVlbiBpbiB0aGUgVkcgaGFzIHJlYXBwZWFyZWQgYWZ0ZXIgdGhlIFZHIGNoYW5nZWQuCisJICogb2xkIFBWOiB0aGUgUFYgdGhhdCBsdm1ldGFkIHdhcyB0b2xkIGFib3V0IGZpcnN0CisJICogbmV3IFBWOiB0aGUgUFYgdGhhdCBsdm1ldGFkIGlzIGJlaW5nIHRvbGQgYWJvdXQgaGVyZSwgc2Vjb25kCisJICogb2xkX3NlcTogdGhlIGxhcmdlciBzZXFubyBvbiB0aGUgb2xkIFBWLCBmb3IgdGhlIG5ld2VyIHZlcnNpb24gb2YgdGhlIFZHCisJICogbmV3X3NlcTogdGhlIHNtYWxsZXIgc2Vxbm8gb24gdGhlIG5ldyBQViwgZm9yIHRoZSBvbGRlciB2ZXJzaW9uIG9mIHRoZSBWRworCSAqCisJICogU28sIHRoZSBuZXcgUFYgKGJ5IG5vdGlmaWNhdGlvbiBvcmRlcikgaXMgIm9sZGVyIiAoaW4gdGVybXMgb2YKKwkgKiBWRyBzZXFubykgdGhhbiB0aGUgb2xkIFBWLgorCSAqCisJICogTWFrZSB0aGUgbmV3IFBWIG91dGRhdGVkIHNvIGl0J2xsIGJlIGNsZWFyZWQgYW5kIGtlZXAgdGhlIGV4aXN0aW5nCisJICogbWV0YWRhdGEgZnJvbSB0aGUgb2xkIFBWLgorCSAqLworCWlmIChwdmlkICYmIChvbGRfc2VxID4gMCkgJiYgKG5ld19zZXEgPCBvbGRfc2VxKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGlnbm9yaW5nIG91dGRhdGVkIG1ldGFkYXRhIG9uIFBWICVzIHNlcW5vICVkIGZvciAlcyAlcyBzZXFubyAlZCIsCisJCSAgICAgIHB2aWQsIG5ld19zZXEsIGFyZ192Z2lkLCBhcmdfbmFtZSwgb2xkX3NlcSk7CisJCURFQlVHTE9HX2NmdChzLCAiT0xEOiAiLCBvbGRfbWV0YS0+cm9vdCk7CisJCURFQlVHTE9HX2NmdChzLCAiTkVXOiAiLCBuZXdfbWV0YWRhdGEpOworCQltYXJrX291dGRhdGVkX3B2KHMsIGFyZ192Z2lkLCBwdmlkKTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBIHNpbmdsZSBQViBhcHBlYXJzIHdpdGggbWV0YWRhdGEgdGhhdCdzIG5ld2VyIHRoYW4gdGhlIGV4aXN0aW5nLAorCSAqIGUuZy4gYSBQViBoYXMgYmVlbiBmb3VuZCB3aXRoIFZHIG1ldGFkYXRhIHRoYXQgaXMgbmV3ZXIgdGhhbiB0aGUKKwkgKiBWRyBtZXRkYXRhIHdlIGtub3cgYWJvdXQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBzY2FubmluZyBQVnMgYWZ0ZXIKKwkgKiBhbiBvdXRkYXRlZCBQViAod2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBWRyBtZXRhZGF0YSkgaGFzCisJICogcmVhcHBlYXJlZC4gIFRoZSByZXNjYW5uaW5nIG1heSBpbml0aWFsbHkgc2NhbiB0aGUgb3V0ZGF0ZWQgUFYKKwkgKiBhbmQgbm90aWZ5IGx2bWV0YWQgYWJvdXQgaXQsIGFuZCB0aGVuIHNjYW4gYSBjdXJyZW50IFBWIGZyb20KKwkgKiB0aGUgVkcgYW5kIG5vdGlmeSBsdm1ldGFkIGFib3V0IGl0LgorCSAqIG9sZCBQVjogdGhlIFBWIHRoYXQgbHZtZXRhZCB3YXMgdG9sZCBhYm91dCBmaXJzdAorCSAqIG5ldyBQVjogdGhlIFBWIHRoYXQgbHZtZXRhZCBpcyBiZWluZyB0b2xkIGFib3V0IGhlcmUsIHNlY29uZAorCSAqIG9sZF9zZXE6IHRoZSBzbWFsbGVyIHNlcW5vIG9uIHRoZSBvbGQgUFYsIGZvciB0aGUgb2xkZXIgdmVyc2lvbiBvZiB0aGUgVkcKKwkgKiBuZXdfc2VxOiB0aGUgbGFyZ2VyIHNlcW5vIG9uIHRoZSBuZXcgUFYsIGZvciB0aGUgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgVkcKKwkgKgorCSAqIE1ha2UgdGhlIGV4aXN0aW5nIFBWcyBvdXRkYXRlZCwgYW5kIHVzZSB0aGUgbmV3IG1ldGFkYXRhLgorCSAqLworCWlmIChwdmlkICYmIChvbGRfc2VxID4gMCkgJiYgKG5ld19zZXEgPiBvbGRfc2VxKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGZvdW5kIG5ld2VyIG1ldGFkYXRhIG9uIFBWICVzIHNlcW5vICVkIGZvciAlcyAlcyBzZXFubyAlZCIsCisJCSAgICAgIHB2aWQsIG5ld19zZXEsIGFyZ192Z2lkLCBhcmdfbmFtZSwgb2xkX3NlcSk7CisJCURFQlVHTE9HX2NmdChzLCAiT0xEOiAiLCBvbGRfbWV0YS0+cm9vdCk7CisJCURFQlVHTE9HX2NmdChzLCAiTkVXOiAiLCBuZXdfbWV0YWRhdGEpOworCQlfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBvbGRfbWV0YSwgYXJnX3ZnaWQsIE1BUktfT1VUREFURUQpOworCX0KKworCS8qCisJICogVGhlIGV4aXN0aW5nL29sZCBtZXRhZGF0YSBoYXMgYW4gaW52YWxpZCBzZXFuby4KKwkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCBwdXJnZSBvbGQgYW5kIGFkZCB0aGUgbmV3LgorCSAqLworCWlmIChvbGRfbWV0YSAmJiAob2xkX3NlcSA8PSAwKSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGJhZCBvbGQgc2Vxbm8gJWQgZm9yICVzICVzIiwKKwkJICAgICAgb2xkX3NlcSwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJREVCVUdMT0dfY2Z0KHMsICJPTEQ6ICIsIG9sZF9tZXRhLT5yb290KTsKKwkJX3B1cmdlX21ldGFkYXRhKHMsIGFyZ19uYW1lLCBhcmdfdmdpZCk7CisJCW5ld19uYW1lID0gYXJnX25hbWU7CisJCW5ld192Z2lkID0gYXJnX3ZnaWQ7CisJCW9sZF9uYW1lID0gTlVMTDsKKwkJb2xkX3ZnaWQgPSBOVUxMOworCQlvbGRfbWV0YSA9IE5VTEw7CisJCW9sZF9zZXEgPSAtMTsKKwl9CisKKwkvKgorCSAqIEEgc2luZ2xlIFBWIGFwcGVhcnMgd2l0aCBhIHNlcW5vIG1hdGNoaW5nIGV4aXN0aW5nIG1ldGFkYXRhLAorCSAqIGJ1dCB1bm1hdGNoaW5nIG1ldGFkYXRhIGNvbnRlbnQuICBUaGlzIHNob3VsZG4ndCBoYXBwZW4sCisJICogYnV0IGlmIGl0IGRvZXMsIGlnbm9yZSB0aGUgUFYuICBGSVhNRTogbWFrZSBpdCBvdXRkYXRlZD8KKwkgKi8KKwlpZiAocHZpZCAmJiAobmV3X3NlcSA9PSBvbGRfc2VxKSAmJiBjb21wYXJlX2NvbmZpZyhuZXdfbWV0YWRhdGEsIG9sZF9tZXRhLT5yb290KSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIGZyb20gcHYgJXMgc2FtZSBzZXFubyAlZCB3aXRoIHVubWF0Y2hpbmcgZGF0YSBmb3IgJXMgJXMiLAorCQkgICAgICBwdmlkLCBuZXdfc2VxLCBhcmdfbmFtZSwgYXJnX3ZnaWQpOworCQlERUJVR0xPR19jZnQocywgIk9MRDogIiwgb2xkX21ldGEtPnJvb3QpOworCQlERUJVR0xPR19jZnQocywgIk5FVzogIiwgbmV3X21ldGFkYXRhKTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBIFZHIHVwZGF0ZSB3aXRoIG1ldGFkYXRhIG1hdGNoaW5nIGV4aXN0aW5nIHNlcW5vIGJ1dCB1bm1hdGNoaW5nIGNvbnRlbnQuCisJICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgcHVyZ2UgZXhpc3RpbmcgYW5kIGFkZCB0aGUgbmV3LgorCSAqLworCWlmICghcHZpZCAmJiAobmV3X3NlcSA9PSBvbGRfc2VxKSAmJiBjb21wYXJlX2NvbmZpZyhuZXdfbWV0YWRhdGEsIG9sZF9tZXRhLT5yb290KSkgeworCQlFUlJPUihzLCAidXBkYXRlX21ldGFkYXRhIHNhbWUgc2Vxbm8gJWQgd2l0aCB1bm1hdGNoaW5nIGRhdGEgZm9yICVzICVzIiwKKwkJICAgICAgbmV3X3NlcSwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJREVCVUdMT0dfY2Z0KHMsICJPTEQ6ICIsIG9sZF9tZXRhLT5yb290KTsKKwkJREVCVUdMT0dfY2Z0KHMsICJORVc6ICIsIG5ld19tZXRhZGF0YSk7CisJCV9wdXJnZV9tZXRhZGF0YShzLCBhcmdfbmFtZSwgYXJnX3ZnaWQpOworCQluZXdfbmFtZSA9IGFyZ19uYW1lOworCQluZXdfdmdpZCA9IGFyZ192Z2lkOworCQlvbGRfbmFtZSA9IE5VTEw7CisJCW9sZF92Z2lkID0gTlVMTDsKKwkJb2xkX21ldGEgPSBOVUxMOworCQlvbGRfc2VxID0gLTE7CisJfQorCisJLyoKKwkgKiBBIFZHIHVwZGF0ZSB3aXRoIG1ldGFkYXRhIG9sZGVyIHRoYW4gZXhpc3RpbmcuICBWRyB1cGRhdGVzIHNob3VsZAorCSAqIGhhdmUgaW5jcmVhc2luZyBzZXFuby4gIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsCisJICogcHVyZ2UgZXhpc3RpbmcgYW5kIGFkZCB0aGUgbmV3LgorCSAqLworCWlmICghcHZpZCAmJiAobmV3X3NlcSA8IG9sZF9zZXEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgbmV3IHNlcW5vICVkIGxlc3MgdGhhbiBvbGQgc2Vxbm8gJWQgZm9yICVzICVzIiwKKwkJICAgICAgbmV3X3NlcSwgb2xkX3NlcSwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJREVCVUdMT0dfY2Z0KHMsICJPTEQ6ICIsIG9sZF9tZXRhLT5yb290KTsKKwkJREVCVUdMT0dfY2Z0KHMsICJORVc6ICIsIG5ld19tZXRhZGF0YSk7CisJCV9wdXJnZV9tZXRhZGF0YShzLCBhcmdfbmFtZSwgYXJnX3ZnaWQpOworCQluZXdfbmFtZSA9IGFyZ19uYW1lOworCQluZXdfdmdpZCA9IGFyZ192Z2lkOworCQlvbGRfbmFtZSA9IE5VTEw7CisJCW9sZF92Z2lkID0gTlVMTDsKKwkJb2xkX21ldGEgPSBOVUxMOworCQlvbGRfc2VxID0gLTE7CisJfQorCisJLyoKKwkgKiBBbGwgdGhlIGNoZWNrcyBhcmUgZG9uZSwgZG8gb25lIG9mIHRoZSBmb3VyIHBvc3NpYmxlIHVwZGF0ZXMKKwkgKiBvdXRsaW5lZCBhYm92ZToKKwkgKi8KKworCS8qCisJICogQWRkIG1ldGFkYXRhIGZvciBhIG5ldyBWRyB0byB0aGUgY2FjaGUuCisJICovCisJaWYgKG5ld19uYW1lICYmIG5ld192Z2lkKQorCQlyZXR1cm4gX3VwZGF0ZV9tZXRhZGF0YV9hZGRfbmV3KHMsIG5ld19uYW1lLCBuZXdfdmdpZCwgbmV3X21ldGEpOworCisJLyoKKwkgKiBVcGRhdGUgY2FjaGVkIG1ldGFkYXRhIGZvciBhIFZHIHdpdGggYSBuZXcgdmdpZC4KKwkgKi8KKwlpZiAobmV3X3ZnaWQpCisJCXJldHVybiBfdXBkYXRlX21ldGFkYXRhX25ld192Z2lkKHMsIGFyZ19uYW1lLCBvbGRfdmdpZCwgbmV3X3ZnaWQsIG9sZF9tZXRhLCBuZXdfbWV0YSk7CisKKwkvKgorCSAqIFVwZGF0ZSBjYWNoZWQgbWV0YWRhdGEgZm9yIGEgcmVuYW1lZCBWRy4KKwkgKi8KKwlpZiAobmV3X25hbWUpCisJCXJldHVybiBfdXBkYXRlX21ldGFkYXRhX25ld19uYW1lKHMsIGFyZ192Z2lkLCBvbGRfbmFtZSwgbmV3X25hbWUsIG9sZF9tZXRhLCBuZXdfbWV0YSk7CisKKwkvKgorCSAqIElmIHRoZSBvbGQgYW5kIG5ldyBzZXFub3MgYXJlIHRoZSBzYW1lLCB3ZSd2ZSBhbHJlYWR5IGNvbXBhcmVkIHRoZQorCSAqIG9sZC9uZXcgbWV0YWRhdGEgYW5kIHZlcmlmaWVkIGl0J3MgdGhlIHNhbWUsIHNvIHRoZXJlJ3Mgbm8gcmVhc29uCisJICogdG8gcmVwbGFjZSBvbGQgbWV0YSB3aXRoIG5ldyBtZXRhLgorCSAqLworCWlmIChvbGRfc2VxID09IG5ld19zZXEpIHsKKwkJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBza2lwcGVkIGZvciAlcyAlcyBzZXFubyAlZCBpcyB1bmNoYW5nZWQiLAorCQkJIGFyZ19uYW1lLCBhcmdfdmdpZCwgb2xkX3NlcSk7CisJCWRtX2NvbmZpZ19kZXN0cm95KG5ld19tZXRhKTsKKwkJbmV3X21ldGEgPSBOVUxMOworCQlyZXR2YWwgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBjYWNoZWQgbWV0ZGF0YSBmb3IgYSBWRyB3aXRoIHVuY2hhbmdlZCBuYW1lIGFuZCB2Z2lkLgorCSAqIFJlcGxhY2UgdGhlIG9sZCBtZXRhZGF0YSB3aXRoIHRoZSBuZXcgbWV0YWRhdGEuCisJICogb2xkX21ldGEgaXMgdGhlIG9sZCBjb3B5IG9mIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBjYWNoZS4KKwkgKiBuZXdfbWV0YSBpcyB0aGUgbmV3IGNvcHkgb2YgdGhlIG1ldGFkYXRhIGZyb20gdGhlIGNvbW1hbmQuCisJICovCisJREVCVUdMT0cocywgInVwZGF0ZV9tZXRhZGF0YSBmb3IgJXMgJXMgZnJvbSAlZCB0byAlZCIsIGFyZ19uYW1lLCBhcmdfdmdpZCwgb2xkX3NlcSwgbmV3X3NlcSk7CisKKwkvKgorCSAqIFRoZSBQVnMgaW4gdGhlIFZHIG1heSBoYXZlIGNoYW5nZWQgaW4gdGhlIG5ldyBtZXRhZGF0YSwgc28KKwkgKiB0ZW1wb3JhcmlseSBvcnBoYW4gYWxsIG9mIHRoZSBQVnMgaW4gdGhlIGV4aXN0aW5nIFZHLgorCSAqIFRoZSBQVnMgdGhhdCBhcmUgc3RpbGwgaW4gdGhlIFZHIHdpbGwgYmUgcmVhc3NpZ25lZCB0byB0aGlzCisJICogVkcgYmVsb3cgYnkgdGhlIG5leHQgY2FsbCB0byBfdXBkYXRlX3B2aWRfdG9fdmdpZCgpLgorCSAqLworCWlmICghX3VwZGF0ZV9wdmlkX3RvX3ZnaWQocywgb2xkX21ldGEsICIjb3JwaGFuIiwgMCkpIHsKKwkJRVJST1IocywgInVwZGF0ZV9tZXRhZGF0YSBmYWlsZWQgdG8gbW92ZSBQVnMgZm9yICVzICVzIiwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgb25seSBoYXNoIHRhYmxlIHVwZGF0ZSB0aGF0IGlzIG5lZWRlZCBpcyB0aGUgYWN0dWFsCisJICogbWV0YWRhdGEgY29uZmlnIHRyZWUgaW4gdmdpZF90b19tZXRhZGF0YS4gIFRoZSBWRyBuYW1lCisJICogYW5kIHZnaWQgYXJlIHVuY2hhbmdlZC4KKwkgKi8KKworCWRtX2hhc2hfcmVtb3ZlKHMtPnZnaWRfdG9fbWV0YWRhdGEsIGFyZ192Z2lkKTsKKwlkbV9jb25maWdfZGVzdHJveShvbGRfbWV0YSk7CisJb2xkX21ldGEgPSBOVUxMOworCisJaWYgKCFkbV9oYXNoX2luc2VydChzLT52Z2lkX3RvX21ldGFkYXRhLCBhcmdfdmdpZCwgbmV3X21ldGEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgb3V0IG9mIG1lbW9yeSBmb3IgaGFzaCBpbnNlcnQgZm9yICVzICVzIiwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBNYXAgdGhlIFBWcyBpbiB0aGUgbmV3IG1ldGFkYXRhIHRvIHRoZSB2Z2lkLgorCSAqIEFsbCBwcmUtZXhpc3RpbmcgUFZzIHdlcmUgdGVtcG9yYXJpbHkgb3JwaGFuZWQgYWJvdmUuCisJICogUHJldmlvdXMgUFZzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhlIFZHIHdpbGwgbm90CisJICogYmUgcmVtYXBwZWQuICBOZXcgUFZzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgVkcgd2lsbAorCSAqIGJlIG5ld2x5IG1hcHBlZCB0byB0aGlzIHZnaWQsIGFuZCBwcmV2aW91cyBQVnMgdGhhdAorCSAqIHJlbWFpbiBpbiB0aGUgVkcgd2lsbCBiZSByZW1hcHBlZCB0byB0aGUgVkcgYWdhaW4uCisJICovCisJaWYgKCFfdXBkYXRlX3B2aWRfdG9fdmdpZChzLCBuZXdfbWV0YSwgYXJnX3ZnaWQsIDEpKSB7CisJCUVSUk9SKHMsICJ1cGRhdGVfbWV0YWRhdGEgZmFpbGVkIHRvIHVwZGF0ZSBQVnMgZm9yICVzICVzIiwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJYWJvcnRfZGFlbW9uID0gMTsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCQlERUJVR0xPRyhzLCAidXBkYXRlX21ldGFkYXRhIGlzIGRvbmUgZm9yICVzICVzIiwgYXJnX25hbWUsIGFyZ192Z2lkKTsKKwkJcmV0dmFsID0gMTsKKwl9CisKK291dDoKKwlpZiAoYWJvcnRfZGFlbW9uKSB7CisJCUVSUk9SKHMsICJsdm1ldGFkIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGlzIGFib3J0aW5nLiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKCFyZXR2YWwgJiYgbmV3X21ldGEpCisJCWRtX2NvbmZpZ19kZXN0cm95KG5ld19tZXRhKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgcmVzcG9uc2UgcHZfZ29uZShsdm1ldGFkX3N0YXRlICpzLCByZXF1ZXN0IHIpCit7CisJY29uc3QgY2hhciAqYXJnX3B2aWQgPSBOVUxMOworCWNoYXIgKm9sZF9wdmlkID0gTlVMTDsKKwljb25zdCBjaGFyICpwdmlkOworCWludDY0X3QgZGV2aWNlOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcHZtZXRhOworCWNoYXIgKnZnaWQ7CisKKwlhcmdfcHZpZCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidXVpZCIsIE5VTEwpOworCWRldmljZSA9IGRhZW1vbl9yZXF1ZXN0X2ludChyLCAiZGV2aWNlIiwgMCk7CisKKwlpZiAoIWFyZ19wdmlkICYmIGRldmljZSA+IDApCisJCW9sZF9wdmlkID0gZG1faGFzaF9sb29rdXBfYmluYXJ5KHMtPmRldmljZV90b19wdmlkLCAmZGV2aWNlLCBzaXplb2YoZGV2aWNlKSk7CisKKwlpZiAoIWFyZ19wdmlkICYmICFvbGRfcHZpZCkgeworCQlERUJVR0xPRyhzLCAicHZfZ29uZSBkZXZpY2UgJSIgUFJJdTY0ICIgbm90IGZvdW5kIiwgZGV2aWNlKTsKKwkJcmV0dXJuIHJlcGx5X3Vua25vd24oImRldmljZSBub3QgaW4gY2FjaGUiKTsKKwl9CisKKwlwdmlkID0gYXJnX3B2aWQgPyBhcmdfcHZpZCA6IG9sZF9wdmlkOworCisJREVCVUdMT0cocywgInB2X2dvbmUgJXMgZGV2aWNlICUiIFBSSXU2NCwgcHZpZCA/OiAibm9uZSIsIGRldmljZSk7CisKKwlpZiAoIShwdm1ldGEgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3B2bWV0YSwgcHZpZCkpKSB7CisJCURFQlVHTE9HKHMsICJwdl9nb25lICVzIGRldmljZSAlIiBQUkl1NjQgIiBoYXMgbm8gUFYgbWV0YWRhdGEiLAorCQkJIHB2aWQgPzogIm5vbmUiLCBkZXZpY2UpOworCQlyZXR1cm4gcmVwbHlfdW5rbm93bigiUFZJRCBkb2VzIG5vdCBleGlzdCIpOworCX0KKworCXZnaWQgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3ZnaWQsIHB2aWQpOworCisJZG1faGFzaF9yZW1vdmVfYmluYXJ5KHMtPmRldmljZV90b19wdmlkLCAmZGV2aWNlLCBzaXplb2YoZGV2aWNlKSk7CisJZG1faGFzaF9yZW1vdmUocy0+cHZpZF90b19wdm1ldGEsIHB2aWQpOworCisJaWYgKHZnaWQpIHsKKwkJY2hhciAqdmdpZF9kdXA7CisJCS8qCisJCSAqIHZnX3JlbW92ZV9pZl9taXNzaW5nIHdpbGwgY2xlYXIgYW5kIGZyZWUgdGhlIHB2aWRfdG9fdmdpZAorCQkgKiBtYXBwaW5ncyBmb3IgdGhpcyB2Zywgd2hpY2ggd2lsbCBmcmVlIHRoZSAidmdpZCIgc3RyaW5nIHRoYXQKKwkJICogd2FzIHJldHVybmVkIGFib3ZlIGZyb20gdGhlIHB2aWRfdG9fdmdpZCBsb29rdXAuCisJCSAqLworCQlpZiAoISh2Z2lkX2R1cCA9IGRtX3N0cmR1cCh2Z2lkKSkpCisJCQlyZXR1cm4gcmVwbHlfZmFpbCgib3V0IG9mIG1lbW9yeSIpOworCisJCXZnX3JlbW92ZV9pZl9taXNzaW5nKHMsIHZnaWRfZHVwLCAxKTsKKwkJZG1fZnJlZSh2Z2lkX2R1cCk7CisJCXZnaWRfZHVwID0gTlVMTDsKKwkJdmdpZCA9IE5VTEw7CisJfQorCisJZG1fY29uZmlnX2Rlc3Ryb3kocHZtZXRhKTsKKwlpZiAob2xkX3B2aWQpCisJCWRtX2ZyZWUob2xkX3B2aWQpOworCisJcmV0dXJuIGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwgTlVMTCApOworfQorCitzdGF0aWMgcmVzcG9uc2UgcHZfY2xlYXJfYWxsKGx2bWV0YWRfc3RhdGUgKnMsIHJlcXVlc3QgcikKK3sKKwlERUJVR0xPRyhzLCAicHZfY2xlYXJfYWxsIik7CisKKwlkZXN0cm95X21ldGFkYXRhX2hhc2hlcyhzKTsKKwljcmVhdGVfbWV0YWRhdGFfaGFzaGVzKHMpOworCisJcmV0dXJuIGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwgTlVMTCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgUFYgbWV0YWRhdGEgZXhpc3RzIGZvciBhbGwgUFZzIGluIGEgVkcuCisgKi8KK3N0YXRpYyBpbnQgX3ZnX2lzX2NvbXBsZXRlKGx2bWV0YWRfc3RhdGUgKnMsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqdmdtZXRhKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqdmcgPSB2Z21ldGEtPnJvb3Q7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwdjsKKwlpbnQgY29tcGxldGUgPSAxOworCWNvbnN0IGNoYXIgKnB2aWQ7CisKKwlmb3IgKHB2ID0gcHZzKHZnKTsgcHY7IHB2ID0gcHYtPnNpYikgeworCQlpZiAoIShwdmlkID0gZG1fY29uZmlnX2ZpbmRfc3RyKHB2LT5jaGlsZCwgImlkIiwgTlVMTCkpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3B2bWV0YSwgcHZpZCkpIHsKKwkJCWNvbXBsZXRlID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNvbXBsZXRlOworfQorCisvKgorICogcHZfZm91bmQ6IGEgUFYgaGFzIGFwcGVhcmVkIGFuZCBiZWVuIHNjYW5uZWQKKyAqIEl0IGNvbnRhaW5zIFBWIG1ldGFkYXRhLCBhbmQgb3B0aW9uYWxseSBWRyBtZXRhZGF0YS4KKyAqIEJvdGgga2luZHMgb2YgbWV0YWRhdGEgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBjYWNoZQorICogYW5kIGhhc2ggdGFibGUgbWFwcGluZ3MgcmVsYXRlZCB0byB0aGUgUFYgYW5kIGRldmljZQorICogc2hvdWxkIGJlIHVwZGF0ZWQuCisgKgorICogSW5wdXQgdmFsdWVzIGZyb20gcmVxdWVzdDoKKyAqIC4gYXJnX3B2bWV0YTogIFBWIG1ldGFkYXRhIGZyb20gdGhlIGZvdW5kIHB2CisgKiAuIGFyZ19wdmlkOiAgICBwdmlkIGZyb20gYXJnX3B2bWV0YSAocHZtZXRhL2lkKQorICogLiBhcmdfZGV2aWNlOiAgZGV2aWNlIGZyb20gYXJnX3B2bWV0YSAocHZtZXRhL2RldmljZSkKKyAqIC4gYXJnX3ZnbWV0YTogIFZHIG1ldGFkYXRhIGZyb20gdGhlIGZvdW5kIHB2IChvcHRpb25hbCkKKyAqIC4gYXJnX25hbWU6ICAgIFZHIG5hbWUgZnJvbSBmb3VuZCBwdiAob3B0aW9uYWwpCisgKiAuIGFyZ192Z2lkOiAgICBWRyB2Z2lkIGZyb20gYXJnX3ZnbWV0YSAgKG9wdGlvbmFsKQorICoKKyAqIFNlYXJjaCBmb3IgZXhpc3RpbmcgbWFwcGluZ3MgaW4gaGFzaCB0YWJsZXM6CisgKiAuIHB2aWRfdG9fcHZtZXRhICh3aGljaCBwcm9kdWNlcyBwdmlkIHRvIGRldmljZSkKKyAqIC4gZGV2aWNlX3RvX3B2aWQKKyAqIC4gcHZpZF90b192Z2lkCisgKgorICogRXhpc3RpbmcgZGF0YSBmcm9tIGNhY2hlOgorICogLiBvbGRfcHZtZXRhOiAgICAgICAgIHJlc3VsdCBvZiBwdmlkX3RvX3B2bWV0YShhcmdfcHZpZCkKKyAqIC4gYXJnX2RldmljZV9sb29rdXA6ICByZXN1bHQgb2Ygb2xkX3B2bWV0YTpwdm1ldGEvZGV2aWNlIHVzaW5nIGFyZ19wdmlkCisgKiAuIGFyZ19wdmlkX2xvb2t1cDogICAgcmVzdWx0IG9mIGRldmljZV90b19wdmlkKGFyZ19kZXZpY2UpCisgKiAuIGFyZ192Z2lkX2xvb2t1cDogICAgcmVzdWx0IG9mIHB2aWRfdG9fdmdpZChhcmdfcHZpZCkKKyAqCisgKiBXaGVuIGFyZ19wdmlkIGRvZXNuJ3QgbWF0Y2ggYXJnX3B2aWRfbG9va3VwOgorICogLiBhIG5ldyBQViByZXBsYWNlcyBhIHByZXZpb3VzIFBWIG9uIGFyZ19kZXZpY2UKKyAqIC4gcHJldl9wdmlkX29uX2RldjogICBzZXQgdG8gYXJnX3B2aWRfbG9va3VwLCBwdmlkIG9mIHRoZSBwcmV2IFBWCisgKiAuIHByZXZfcHZtZXRhX29uX2RldjogcmVzdWx0IHB2aWRfdG9fcHZtZXRhKHByZXZfcHZpZF9vbl9kZXYpCisgKiAuIHByZXZfdmdpZF9vbl9kZXY6ICAgcmVzdWx0IG9mIHB2aWRfdG9fdmdpZChwcmV2X3B2aWRfb25fZGV2KQorICoKKyAqIE9sZCBQViBvbiBvbGQgZGV2aWNlCisgKiAuIG5vIFBWL2RldmljZSBtYXBwaW5ncyBoYXZlIGNoYW5nZWQKKyAqIC4gYXJnX3B2aWRfbG9va3VwID09IGFyZ19wdmlkICYmIGFyZ19kZXZpY2VfbG9va3VwID09IGFyZ19kZXZpY2UKKyAqIC4gYXJnX2RldmljZSB3YXMgdXNlZCB0byBsb29rIHVwIGEgUFYgYW5kIGZvdW5kIGEgUFYgd2l0aAorICogICB0aGUgc2FtZSBwdmlkIGFzIGFyZ19wdmlkCisgKiAuIGFyZ19wdmlkIHdhcyB1c2VkIHRvIGxvb2sgdXAgYSBQViBhbmQgZm91bmQgYSBQViBvbiB0aGUKKyAqICAgc2FtZSBkZXZpY2UgYXMgYXJnX2RldmljZQorICogLiBuZXdfcHZtZXRhIG1heSBiZSBtb3JlIHJlY2VudCB0aGFuIG9sZF9wdm1ldGEKKyAqCisgKiBOZXcgUFYgb24gbmV3IGRldmljZQorICogLiBhZGQgbmV3IG1hcHBpbmdzIGluIGhhc2ggdGFibGVzCisgKiAuICFhcmdfcHZpZF9sb29rdXAgJiYgIWFyZ19kZXZpY2VfbG9va3VwCisgKiAuIGFyZ19kZXZpY2Ugd2FzIHVzZWQgdG8gbG9vayB1cCBhIFBWIGFuZCBmb3VuZCBub3RoaW5nCisgKiAuIGFyZ19wdmlkIHdhcyB1c2VkIHRvIGxvb2sgdXAgYSBQViBhbmQgZm91bmQgbm90aGluZworICoKKyAqIE5ldyBQViBvbiBvbGQgZGV2aWNlCisgKiAuIGEgbmV3IFBWIHJlcGxhY2VzIGEgcHJldmlvdXMgUFYgb24gYSBkZXZpY2UKKyAqIC4gYXJnX3B2aWRfbG9va3VwICE9IGFyZ19wdmlkCisgKiAuIGFyZ19kZXZpY2Ugd2FzIHVzZWQgdG8gbG9vayB1cCBhIFBWIGFuZCBmb3VuZCBhIFBWIHdpdGgKKyAqICAgYSBkaWZmZXJlbnQgcHZpZCB0aGFuIGFyZ19wdmlkCisgKiAuIHJlcGxhY2UgZXhpc3RpbmcgbWFwcGluZ3MgZm9yIGFyZ19kZXZpY2UgYW5kIGFyZ19wdmlkCisgKiAuIHJlcGxhY2UgZXhpc3Rpbmcgb2xkX3B2bWV0YSB3aXRoIG5ld19wdm1ldGEKKyAqIC4gcmVtb3ZlIGFyZ19kZXZpY2UgYXNzb2NpYXRpb24gd2l0aCBwcmV2IFBWIChwcmV2X3B2aWRfb25fZGV2KQorICogLiBwb3NzaWJseSByZW1vdmUgcHJldiBQViAoaWYgYXJnX2RldmljZSB3YXMgcHJldmlvdXNseSBhIGR1cGxpY2F0ZSkKKyAqCisgKiBPbGQgUFYgb24gbmV3IGRldmljZQorICogLiBhIGR1cGxpY2F0ZSBQVgorICogLiBhcmdfZGV2aWNlX2xvb2t1cCAhPSBhcmdfZGV2aWNlCisgKiAuIGFyZ19wdmlkIHdhcyB1c2VkIHRvIGxvb2sgdXAgYSBQViwgYW5kIGZvdW5kIHRoYXQgdGhlIFBWCisgKiAgIGhhcyBhIGRpZmZlcmVudCBkZXZpY2UgdGhhbiBhcmdfZGV2aWNlLgorICovCisKK3N0YXRpYyByZXNwb25zZSBwdl9mb3VuZChsdm1ldGFkX3N0YXRlICpzLCByZXF1ZXN0IHIpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICphcmdfdmdtZXRhID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmFyZ19wdm1ldGEgPSBOVUxMOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqb2xkX3B2bWV0YSA9IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpuZXdfcHZtZXRhID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnByZXZfcHZtZXRhX29uX2RldiA9IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICp2Z21ldGEgPSBOVUxMOworCWNvbnN0IGNoYXIgKmFyZ19wdmlkID0gTlVMTDsKKwljb25zdCBjaGFyICphcmdfcHZpZF9sb29rdXAgPSBOVUxMOworCWNvbnN0IGNoYXIgKm5ld19wdmlkID0gTlVMTDsKKwljb25zdCBjaGFyICpuZXdfcHZpZF9kdXAgPSBOVUxMOworCWNvbnN0IGNoYXIgKmFyZ19uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICphcmdfdmdpZCA9IE5VTEw7CisJY29uc3QgY2hhciAqYXJnX3ZnaWRfbG9va3VwID0gTlVMTDsKKwljb25zdCBjaGFyICpwcmV2X3B2aWRfb25fZGV2ID0gTlVMTDsKKwljb25zdCBjaGFyICpwcmV2X3ZnaWRfb25fZGV2ID0gTlVMTDsKKwljb25zdCBjaGFyICp2Z19zdGF0dXMgPSBOVUxMOworCXVpbnQ2NF90IGFyZ19kZXZpY2UgPSAwOworCXVpbnQ2NF90IGFyZ19kZXZpY2VfbG9va3VwID0gMDsKKwl1aW50NjRfdCBuZXdfZGV2aWNlID0gMDsKKwl1aW50NjRfdCBvbGRfZGV2aWNlID0gMDsKKwlpbnQgYXJnX3NlcW5vID0gLTE7CisJaW50IG9sZF9zZXFubyA9IC0xOworCWludCB2Z19zdGF0dXNfc2Vxbm8gPSAtMTsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwkvKgorCSAqIE5ldyBpbnB1dCB2YWx1ZXMuCisJICovCisKKwlpZiAoIShhcmdfcHZtZXRhID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyLmNmdC0+cm9vdCwgInB2bWV0YSIpKSkgeworCQlFUlJPUihzLCAiSWdub3JlIFBWIHdpdGhvdXQgUFYgbWV0YWRhdGEiKTsKKwkJcmV0dXJuIHJlcGx5X2ZhaWwoIklnbm9yZSBQViB3aXRob3V0IFBWIG1ldGFkYXRhIik7CisJfQorCisJaWYgKCEoYXJnX3B2aWQgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgInB2bWV0YS9pZCIsIE5VTEwpKSkgeworCQlFUlJPUihzLCAiSWdub3JlIFBWIHdpdGhvdXQgUFYgVVVJRCIpOworCQlyZXR1cm4gcmVwbHlfZmFpbCgiSWdub3JlIFBWIHdpdGhvdXQgUFYgVVVJRCIpOworCX0KKworCWlmICghZG1fY29uZmlnX2dldF91aW50NjQoYXJnX3B2bWV0YSwgInB2bWV0YS9kZXZpY2UiLCAmYXJnX2RldmljZSkpIHsKKwkJRVJST1IocywgIklnbm9yZSBQViB3aXRob3V0IGRldmljZSBwdmlkICVzIiwgYXJnX3B2aWQpOworCQlyZXR1cm4gcmVwbHlfZmFpbCgiSWdub3JlIFBWIHdpdGhvdXQgZGV2aWNlIik7CisJfQorCisJaWYgKChhcmdfdmdtZXRhID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyLmNmdC0+cm9vdCwgIm1ldGFkYXRhIikpKSB7CisJCWFyZ19uYW1lID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHIsICJ2Z25hbWUiLCBOVUxMKTsKKwkJYXJnX3ZnaWQgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgIm1ldGFkYXRhL2lkIiwgTlVMTCk7CisJCWFyZ19zZXFubyA9IGRhZW1vbl9yZXF1ZXN0X2ludChyLCAibWV0YWRhdGEvc2Vxbm8iLCAtMSk7CisKKwkJaWYgKCFhcmdfbmFtZSB8fCAhYXJnX3ZnaWQgfHwgKGFyZ19zZXFubyA8IDApKQorCQkJRVJST1IocywgIklnbm9yZSBWRyBtZXRhZGF0YSBmcm9tIFBWICVzIiwgYXJnX3B2aWQpOworCQlpZiAoIWFyZ19uYW1lKQorCQkJcmV0dXJuIHJlcGx5X2ZhaWwoIklnbm9yZSBWRyBtZXRhZGF0YSBmcm9tIFBWIHdpdGhvdXQgVkcgbmFtZSIpOworCQlpZiAoIWFyZ192Z2lkKQorCQkJcmV0dXJuIHJlcGx5X2ZhaWwoIklnbm9yZSBWRyBtZXRhZGF0YSBmcm9tIFBWIHdpdGhvdXQgVkcgdmdpZCIpOworCQlpZiAoYXJnX3NlcW5vIDwgMCkKKwkJCXJldHVybiByZXBseV9mYWlsKCJJZ25vcmUgVkcgbWV0YWRhdGEgZnJvbSBQViB3aXRob3V0IFZHIHNlcW5vIik7CisJfQorCisJLyogTWFrZSBhIGNvcHkgb2YgdGhlIG5ldyBwdm1ldGEgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byBjYWNoZS4gKi8KKwlpZiAoIShuZXdfcHZtZXRhID0gZG1fY29uZmlnX2NyZWF0ZSgpKSB8fAorCSAgICAhKG5ld19wdm1ldGEtPnJvb3QgPSBkbV9jb25maWdfY2xvbmVfbm9kZShuZXdfcHZtZXRhLCBhcmdfcHZtZXRhLCAwKSkpIHsKKwkJRVJST1IocywgInB2X2ZvdW5kIG91dCBvZiBtZW1vcnkgZm9yIG5ldyBwdm1ldGEgJXMiLCBhcmdfcHZpZCk7CisJCWdvdG8gbm9tZW07CisJfQorCisJLyoKKwkgKiBFeGlzdGluZyAob2xkKSBjYWNoZSB2YWx1ZXMuCisJICovCisKKwlvbGRfcHZtZXRhID0gZG1faGFzaF9sb29rdXAocy0+cHZpZF90b19wdm1ldGEsIGFyZ19wdmlkKTsKKwlpZiAob2xkX3B2bWV0YSkKKwkJZG1fY29uZmlnX2dldF91aW50NjQob2xkX3B2bWV0YS0+cm9vdCwgInB2bWV0YS9kZXZpY2UiLCAmYXJnX2RldmljZV9sb29rdXApOworCisJYXJnX3B2aWRfbG9va3VwID0gZG1faGFzaF9sb29rdXBfYmluYXJ5KHMtPmRldmljZV90b19wdmlkLCAmYXJnX2RldmljZSwgc2l6ZW9mKGFyZ19kZXZpY2UpKTsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBmb3VyIHBvc3NpYmxlIGNoYW5nZXMgaXMgaGFwcGVuaW5nCisJICogYnkgY29tcGFyaW5nIHRoZSBleGlzdGluZy9vbGQgYW5kIG5ldyB2YWx1ZXM6CisJICogb2xkIFBWLCBvbGQgZGV2aWNlCisJICogbmV3IFBWLCBuZXcgZGV2aWNlCisJICogbmV3IFBWLCBvbGQgZGV2aWNlCisJICogb2xkIFBWLCBuZXcgZGV2aWNlCisJICovCisKKwlpZiAoYXJnX3B2aWRfbG9va3VwICYmIGFyZ19kZXZpY2VfbG9va3VwICYmCisJICAgIChhcmdfZGV2aWNlID09IGFyZ19kZXZpY2VfbG9va3VwKSAmJgorCSAgICAhc3RyY21wKGFyZ19wdmlkX2xvb2t1cCwgYXJnX3B2aWQpKSB7CisJCS8qCisJCSAqIE9sZCBQViBvbiBvbGQgZGV2aWNlIChleGlzdGluZyB2YWx1ZXMgdW5jaGFuZ2VkKQorCQkgKi8KKwkJbmV3X3B2aWQgPSBOVUxMOworCQluZXdfZGV2aWNlID0gMDsKKworCQlERUJVR0xPRyhzLCAicHZfZm91bmQgcHZpZCAlcyBvbiBkZXZpY2UgJSIgUFJJdTY0ICIgbWF0Y2hlcyBleGlzdGluZyIsCisJCQlhcmdfcHZpZCwgYXJnX2RldmljZSk7CisKKwl9IGVsc2UgaWYgKCFhcmdfcHZpZF9sb29rdXAgJiYgIWFyZ19kZXZpY2VfbG9va3VwKSB7CisJCS8qCisJCSAqIE5ldyBQViBvbiBuZXcgZGV2aWNlIChubyBleGlzdGluZyB2YWx1ZXMpCisJCSAqLworCQluZXdfcHZpZCA9IGFyZ19wdmlkOworCQluZXdfZGV2aWNlID0gYXJnX2RldmljZTsKKworCQlERUJVR0xPRyhzLCAicHZfZm91bmQgcHZpZCAlcyBvbiBkZXZpY2UgJSIgUFJJdTY0ICIgaXMgbmV3IiwKKwkJCWFyZ19wdmlkLCBhcmdfZGV2aWNlKTsKKworCX0gZWxzZSBpZiAoYXJnX3B2aWRfbG9va3VwICYmIHN0cmNtcChhcmdfcHZpZF9sb29rdXAsIGFyZ19wdmlkKSkgeworCQkvKgorCQkgKiBOZXcgUFYgb24gb2xkIGRldmljZSAoZXhpc3RpbmcgZGV2aWNlIHJldXNlZCBmb3IgbmV3IFBWKQorCQkgKi8KKwkJbmV3X3B2aWQgPSBhcmdfcHZpZDsKKwkJbmV3X2RldmljZSA9IDA7CisJCXByZXZfcHZpZF9vbl9kZXYgPSBhcmdfcHZpZF9sb29rdXA7CisJCXByZXZfcHZtZXRhX29uX2RldiA9IGRtX2hhc2hfbG9va3VwKHMtPnB2aWRfdG9fcHZtZXRhLCBhcmdfcHZpZF9sb29rdXApOworCQlwcmV2X3ZnaWRfb25fZGV2ID0gZG1faGFzaF9sb29rdXAocy0+cHZpZF90b192Z2lkLCBhcmdfcHZpZF9sb29rdXApOworCisJCURFQlVHTE9HKHMsICJwdl9mb3VuZCBwdmlkICVzIHZnaWQgJXMgb24gZGV2aWNlICUiIFBSSXU2NCAiIHByZXZpb3VzIHB2aWQgJXMgdmdpZCAlcyIsCisJCQlhcmdfcHZpZCwgYXJnX3ZnaWQgPzogIm5vbmUiLCBhcmdfZGV2aWNlLAorCQkJcHJldl9wdmlkX29uX2RldiwgcHJldl92Z2lkX29uX2RldiA/OiAibm9uZSIpOworCisJfSBlbHNlIGlmIChhcmdfZGV2aWNlX2xvb2t1cCAmJiAoYXJnX2RldmljZV9sb29rdXAgIT0gYXJnX2RldmljZSkpIHsKKwkJLyoKKwkJICogT2xkIFBWIG9uIG5ldyBkZXZpY2UgKGV4aXN0aW5nIFBWIG9uIGEgbmV3IGRldmljZSwgaS5lLiBkdXBsaWNhdGUpCisJCSAqLworCQluZXdfZGV2aWNlID0gYXJnX2RldmljZTsKKwkJbmV3X3B2aWQgPSBOVUxMOworCQlvbGRfZGV2aWNlID0gYXJnX2RldmljZV9sb29rdXA7CisKKwkJREVCVUdMT0cocywgInB2X2ZvdW5kIHB2aWQgJXMgdmdpZCAlcyBvbiBkZXZpY2UgJSIgUFJJdTY0ICIgZHVwbGljYXRlICUiIFBSSXU2NCwKKwkJCWFyZ19wdmlkLCBhcmdfdmdpZCA/OiAibm9uZSIsIGFyZ19kZXZpY2UsIGFyZ19kZXZpY2VfbG9va3VwKTsKKworCX0gZWxzZSB7CisJCUVSUk9SKHMsICJwdl9mb3VuZCBwdmlkICVzIHZnaWQgJXMgb24gZGV2aWNlICUiIFBSSXU2NCAiIHVua25vd24gbG9va3VwICVzICVzICUiIFBSSXU2NCwKKwkJICAgICAgYXJnX3B2aWQsCisJCSAgICAgIGFyZ192Z2lkID86ICJub25lIiwKKwkJICAgICAgYXJnX2RldmljZSwKKwkJICAgICAgYXJnX3B2aWRfbG9va3VwID86ICJub25lIiwKKwkJICAgICAgYXJnX3ZnaWRfbG9va3VwID86ICJub25lIiwKKwkJICAgICAgYXJnX2RldmljZV9sb29rdXApOworCQlyZXR1cm4gcmVwbHlfZmFpbCgiSWdub3JlIFBWIGZvciB1bmtub3duIHN0YXRlIik7CisJfQorCisJLyoKKwkgKiBNYWtlIGNoYW5nZXMgdG8gaGFzaGVzIGRldmljZV90b19wdmlkIGFuZCBwdmlkX3RvX3B2bWV0YSBmb3IgZWFjaCBjYXNlLgorCSAqLworCisJaWYgKCFuZXdfcHZpZCAmJiAhbmV3X2RldmljZSkgeworCQkvKgorCQkgKiBPbGQgUFYgb24gb2xkIGRldmljZSAodW5jaGFuZ2VkKQorCQkgKiAuIGFkZCBuZXdfcHZtZXRhLCByZXBsYWNpbmcgb2xkX3B2bWV0YQorCQkgKi8KKwkJaWYgKGNvbXBhcmVfY29uZmlnKG9sZF9wdm1ldGEtPnJvb3QsIG5ld19wdm1ldGEtPnJvb3QpKQorCQkJY2hhbmdlZCB8PSAxOworCisJCWlmICghZG1faGFzaF9pbnNlcnQocy0+cHZpZF90b19wdm1ldGEsIGFyZ19wdmlkLCBuZXdfcHZtZXRhKSkKKwkJCWdvdG8gbm9tZW1fZnJlZTE7CisKKwl9IGVsc2UgaWYgKG5ld19wdmlkICYmIG5ld19kZXZpY2UpIHsKKwkJLyoKKwkJICogTmV3IFBWIG9uIG5ldyBkZXZpY2UgKG5ldyBlbnRyeSkKKwkJICogLiBhZGQgbmV3X2RldmljZS9uZXdfcHZpZCBtYXBwaW5nCisJCSAqIC4gYWRkIG5ld19wdm1ldGEKKwkJICovCisJCWNoYW5nZWQgfD0gMTsKKworCQlERUJVR0xPRyhzLCAicHZfZm91bmQgbmV3IGVudHJ5IGRldmljZV90b19wdmlkICUiIFBSSXU2NCAiIHRvICVzIiwKKwkJCSBuZXdfZGV2aWNlLCBuZXdfcHZpZCk7CisKKwkJaWYgKCEobmV3X3B2aWRfZHVwID0gZG1fc3RyZHVwKG5ld19wdmlkKSkpCisJCQlnb3RvIG5vbWVtX2ZyZWUxOworCisJCWlmICghZG1faGFzaF9pbnNlcnRfYmluYXJ5KHMtPmRldmljZV90b19wdmlkLCAmbmV3X2RldmljZSwgc2l6ZW9mKG5ld19kZXZpY2UpLCAoY2hhciAqKW5ld19wdmlkX2R1cCkpCisJCQlnb3RvIG5vbWVtX2ZyZWUyOworCisJCWlmICghZG1faGFzaF9pbnNlcnQocy0+cHZpZF90b19wdm1ldGEsIG5ld19wdmlkLCBuZXdfcHZtZXRhKSkKKwkJCWdvdG8gbm9tZW1fZnJlZTE7CisKKwl9IGVsc2UgaWYgKG5ld19wdmlkICYmICFuZXdfZGV2aWNlKSB7CisJCS8qCisJCSAqIE5ldyBQViBvbiBvbGQgZGV2aWNlIChleGlzdGluZyBkZXZpY2UgcmV1c2VkIGZvciBuZXcgUFYpLgorCQkgKiBUaGUgcHJldmlvdXMgUFYgb24gYXJnX2RldmljZSBpcyByZXBsYWNlZCBieSB0aGUgbmV3IG9uZS4KKwkJICoKKwkJICogRG9uJ3QgZnJlZSBwcmV2X3B2aWQgb3IgcHJldl92Z2lkIHN0cmluZ3MgYmVjYXVzZSB0aGV5IGFyZQorCQkgKiB1c2VkIGF0IHRoZSBlbmQgdG8gY2hlY2sgdGhlIFZHIG1ldGFkYXRhLgorCQkgKi8KKwkJY2hhbmdlZCB8PSAxOworCisJCWlmIChwcmV2X3B2bWV0YV9vbl9kZXYpIHsKKwkJCURFQlVHTE9HKHMsICJwdl9mb3VuZCBuZXcgcHZpZCBkZXZpY2VfdG9fcHZpZCAlIiBQUkl1NjQgIiB0byAlcyByZW1vdmVzIHByZXYgcHZpZCAlcyIsCisJCQkJIGFyZ19kZXZpY2UsIG5ld19wdmlkLCBwcmV2X3B2aWRfb25fZGV2KTsKKworCQkJZG1faGFzaF9yZW1vdmUocy0+cHZpZF90b19wdm1ldGEsIHByZXZfcHZpZF9vbl9kZXYpOworCQkJZG1fY29uZmlnX2Rlc3Ryb3kocHJldl9wdm1ldGFfb25fZGV2KTsKKwkJCXByZXZfcHZtZXRhX29uX2RldiA9IE5VTEw7CisKKwkJCS8qIHJlbW92ZXMgYXJnX2RldmljZS9wcmV2X3B2aWRfb25fZGV2IG1hcHBpbmcgKi8KKwkJCWRtX2hhc2hfcmVtb3ZlX2JpbmFyeShzLT5kZXZpY2VfdG9fcHZpZCwgJmFyZ19kZXZpY2UsIHNpemVvZihhcmdfZGV2aWNlKSk7CisKKwkJCS8qCisJCQkgKiBUaGUgbmV3IFBWIHJlcGxhY2luZyB0aGUgcHJldiBQViB3YXMgY29waWVkIGZyb20KKwkJCSAqIGFub3RoZXIgZXhpc3RpbmcgUFYsIGNyZWF0aW5nIGEgZHVwbGljYXRlIFBWIHdoaWNoCisJCQkgKiB3ZSBpZ25vcmUuCisJCQkgKi8KKwkJCWlmIChkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3B2bWV0YSwgbmV3X3B2aWQpKSB7CisJCQkJREVCVUdMT0cocywgInB2X2ZvdW5kIGlnbm9yZSBkdXBsaWNhdGUgZGV2aWNlICUiIFBSSXU2NCAiIG9mIGV4aXN0aW5nIFBWIGZvciBwdmlkICVzIiwKKwkJCQkgICAgICAgICBhcmdfZGV2aWNlLCBhcmdfcHZpZCk7CisJCQkJZG1fY29uZmlnX2Rlc3Ryb3kobmV3X3B2bWV0YSk7CisJCQkJcy0+ZmxhZ3MgfD0gR0xGTF9ESVNBQkxFOworCQkJCXMtPmZsYWdzIHw9IEdMRkxfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUzsKKwkJCQlyZXR1cm4gcmVwbHlfZmFpbCgiSWdub3JlIGR1cGxpY2F0ZSBQViIpOworCQkJfQorCQl9CisKKworCQlpZiAoIShuZXdfcHZpZF9kdXAgPSBkbV9zdHJkdXAobmV3X3B2aWQpKSkKKwkJCWdvdG8gbm9tZW1fZnJlZTE7CisKKwkJaWYgKCFkbV9oYXNoX2luc2VydF9iaW5hcnkocy0+ZGV2aWNlX3RvX3B2aWQsICZhcmdfZGV2aWNlLCBzaXplb2YoYXJnX2RldmljZSksIChjaGFyICopbmV3X3B2aWRfZHVwKSkKKwkJCWdvdG8gbm9tZW1fZnJlZTI7CisKKwkJaWYgKCFkbV9oYXNoX2luc2VydChzLT5wdmlkX3RvX3B2bWV0YSwgbmV3X3B2aWQsIG5ld19wdm1ldGEpKQorCQkJZ290byBub21lbV9mcmVlMTsKKworCX0gZWxzZSBpZiAobmV3X2RldmljZSAmJiAhbmV3X3B2aWQpIHsKKwkJLyoKKwkJICogT2xkIFBWIG9uIG5ldyBkZXZpY2UgKGR1cGxpY2F0ZSkKKwkJICogSWdub3JlIGl0LgorCQkgKi8KKwkJREVCVUdMT0cocywgInB2X2ZvdW5kIGlnbm9yZSBkdXBsaWNhdGUgZGV2aWNlICUiIFBSSXU2NCAiIG9mIGV4aXN0aW5nIGRldmljZSAlIiBQUkl1NjQgIiBmb3IgcHZpZCAlcyIsCisJCQkgbmV3X2RldmljZSwgb2xkX2RldmljZSwgYXJnX3B2aWQpOworCQlkbV9jb25maWdfZGVzdHJveShuZXdfcHZtZXRhKTsKKwkJcy0+ZmxhZ3MgfD0gR0xGTF9ESVNBQkxFOworCQlzLT5mbGFncyB8PSBHTEZMX0RJU0FCTEVfUkVBU09OX0RVUExJQ0FURVM7CisJCXJldHVybiByZXBseV9mYWlsKCJJZ25vcmUgZHVwbGljYXRlIFBWIik7CisJfQorCisJaWYgKG9sZF9wdm1ldGEpCisJCWRtX2NvbmZpZ19kZXN0cm95KG9sZF9wdm1ldGEpOworCisJLyoKKwkgKiBVcGRhdGUgVkcgbWV0YWRhdGEgY2FjaGUgd2l0aCBhcmdfdmdtZXRhIGZyb20gdGhlIFBWLCBvcgorCSAqIGlmIHRoZSBQViBob2xkcyBubyBWRyBtZXRhZGF0YSwgdGhlbiBsb29rIHVwIHRoZSB2Z2lkIGFuZAorCSAqIG5hbWUgb2YgdGhlIFZHIHNvIHdlIGNhbiBjaGVjayBpZiB0aGUgVkcgaXMgY29tcGxldGUuCisJICovCisJaWYgKGFyZ192Z21ldGEpIHsKKwkJREVCVUdMT0cocywgInB2X2ZvdW5kIHB2aWQgJXMgaGFzIFZHICVzICVzIHNlcW5vICVkIiwgYXJnX3B2aWQsIGFyZ19uYW1lLCBhcmdfdmdpZCwgYXJnX3NlcW5vKTsKKworCQlpZiAoIV91cGRhdGVfbWV0YWRhdGEocywgYXJnX25hbWUsIGFyZ192Z2lkLCBhcmdfdmdtZXRhLCAmb2xkX3NlcW5vLCBhcmdfcHZpZCkpIHsKKwkJCUVSUk9SKHMsICJDYW5ub3QgdXNlIFZHIG1ldGFkYXRhIGZvciAlcyAlcyBmcm9tIFBWICVzIG9uICUiIFBSSXU2NCwKKwkJCSAgICAgIGFyZ19uYW1lLCBhcmdfdmdpZCwgYXJnX3B2aWQsIGFyZ19kZXZpY2UpOworCQl9CisKKwkJY2hhbmdlZCB8PSAob2xkX3NlcW5vICE9IGFyZ19zZXFubyk7CisJfSBlbHNlIHsKKwkJYXJnX3ZnaWQgPSBkbV9oYXNoX2xvb2t1cChzLT5wdmlkX3RvX3ZnaWQsIGFyZ19wdmlkKTsKKworCQlpZiAoYXJnX3ZnaWQpIHsKKwkJCWFyZ19uYW1lID0gZG1faGFzaF9sb29rdXAocy0+dmdpZF90b192Z25hbWUsIGFyZ192Z2lkKTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIFZHIGlzIGNvbXBsZXRlIChhbGwgUFZzIGhhdmUgYmVlbiBmb3VuZCkgYmVjYXVzZQorCSAqIHRoZSByZXBseSBpbmRpY2F0ZXMgaWYgdGhlIHRoZSBWRyBpcyBjb21wbGV0ZSBvciBwYXJ0aWFsLgorCSAqIFRoZSAidmdtZXRhIiBmcm9tIGRtX2hhc2hfbG9va3VwIHdpbGwgYmUgYSBjb3B5IG9mIGFyZ192Z21ldGEgdGhhdAorCSAqIHdhcyBjbG9uZWQgYW5kIGFkZGVkIHRvIHRoZSBjYWNoZSBieSB1cGRhdGVfbWV0YWRhdGEuCisJICovCisJaWYgKCFhcmdfdmdpZCB8fCAhc3RyY21wKGFyZ192Z2lkLCAiI29ycGhhbiIpKSB7CisJCURFQlVHTE9HKHMsICJwdl9mb3VuZCBwdmlkICVzIG9uICUiIFBSSXU2NCAiIG5vdCBpbiBWRyAlcyIsCisJCQkgYXJnX3B2aWQsIGFyZ19kZXZpY2UsIGFyZ192Z2lkID86ICIiKTsKKwkJdmdfc3RhdHVzID0gIm9ycGhhbiI7CisJCWdvdG8gcHJldl92YWxzOworCX0KKworCWlmICghKHZnbWV0YSA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fbWV0YWRhdGEsIGFyZ192Z2lkKSkpIHsKKwkJRVJST1IocywgInB2X2ZvdW5kICVzIG9uICUiIFBSSXU2NCAiIHZnaWQgJXMgbm8gVkcgbWV0YWRhdGEgZm91bmQiLAorCQkgICAgICBhcmdfcHZpZCwgYXJnX2RldmljZSwgYXJnX3ZnaWQpOworCX0gZWxzZSB7CisJCXZnX3N0YXR1cyA9IF92Z19pc19jb21wbGV0ZShzLCB2Z21ldGEpID8gImNvbXBsZXRlIiA6ICJwYXJ0aWFsIjsKKwkJdmdfc3RhdHVzX3NlcW5vID0gZG1fY29uZmlnX2ZpbmRfaW50KHZnbWV0YS0+cm9vdCwgIm1ldGFkYXRhL3NlcW5vIiwgLTEpOworCX0KKworIHByZXZfdmFsczoKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgcHJldmlvdXNseSBoZWxkIGEgZGlmZmVyZW50IFZHIChwcmV2X3ZnaWRfb25fZGV2KSwKKwkgKiB0aGVuIHRoYXQgVkcgc2hvdWxkIGJlIHJlbW92ZWQgaWYgbm8gZGV2aWNlcyBhcmUgbGVmdCBmb3IgaXQuCisJICoKKwkgKiBUaGUgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UncyBwcmV2aW91cyBwdmlkIHRvIHRoZSBwcmV2aW91cyB2Z2lkCisJICogaXMgcmVtb3ZlZC4KKwkgKi8KKworCWlmIChwcmV2X3B2aWRfb25fZGV2IHx8IHByZXZfdmdpZF9vbl9kZXYpIHsKKwkJREVCVUdMT0cocywgInB2X2ZvdW5kIHB2aWQgJXMgb24gJSIgUFJJdTY0ICIgaGFkIHByZXYgcHZpZCAlcyBwcmV2IHZnaWQgJXMiLAorCQkJIGFyZ19wdmlkLCBhcmdfZGV2aWNlLAorCQkJIHByZXZfcHZpZF9vbl9kZXYgPzogIm5vbmUiLAorCQkJIHByZXZfdmdpZF9vbl9kZXYgPzogIm5vbmUiKTsKKwl9CisKKwlpZiAocHJldl92Z2lkX29uX2RldikgeworCQljaGFyICp0bXBfdmdpZDsKKworCSAgICAgICAJaWYgKCFhcmdfdmdpZCB8fCBzdHJjbXAoYXJnX3ZnaWQsIHByZXZfdmdpZF9vbl9kZXYpKSB7CisJCQl0bXBfdmdpZCA9IGRtX3N0cmR1cChwcmV2X3ZnaWRfb25fZGV2KTsKKwkJCS8qIHZnX3JlbW92ZV9pZl9taXNzaW5nIHdpbGwgY2xlYXIgYW5kIGZyZWUKKwkJCSAgIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwcmV2X3ZnaWRfb25fZGV2LiAqLworCQkJdmdfcmVtb3ZlX2lmX21pc3NpbmcocywgdG1wX3ZnaWQsIDEpOworCQkJZG1fZnJlZSh0bXBfdmdpZCk7CisJCX0KKworCQkvKiB2Z19yZW1vdmVfaWZfbWlzc2luZyBtYXkgaGF2ZSByZW1hcHBlZCBwcmV2X3B2aWRfb25fZGV2IHRvIG9ycGhhbiAqLworCQlpZiAoKHRtcF92Z2lkID0gZG1faGFzaF9sb29rdXAocy0+cHZpZF90b192Z2lkLCBwcmV2X3B2aWRfb25fZGV2KSkpIHsKKwkJCWRtX2hhc2hfcmVtb3ZlKHMtPnB2aWRfdG9fdmdpZCwgcHJldl9wdmlkX29uX2Rldik7CisJCQlkbV9mcmVlKHRtcF92Z2lkKTsKKwkJfQorCX0KKworCS8qIFRoaXMgd2FzIHVuaGFzaGVkIGZyb20gZGV2aWNlX3RvX3B2aWQgYWJvdmUuICovCisJaWYgKHByZXZfcHZpZF9vbl9kZXYpCisJCWRtX2ZyZWUoKHZvaWQgKilwcmV2X3B2aWRfb25fZGV2KTsKKworCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJPSyIsCisJCQkJICAgInN0YXR1cyA9ICVzIiwgdmdfc3RhdHVzLAorCQkJCSAgICJjaGFuZ2VkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBjaGFuZ2VkLAorCQkJCSAgICJ2Z2lkID0gJXMiLCBhcmdfdmdpZCA/IGFyZ192Z2lkIDogIiNvcnBoYW4iLAorCQkJCSAgICJ2Z25hbWUgPSAlcyIsIGFyZ19uYW1lID8gYXJnX25hbWUgOiAiI29ycGhhbiIsCisJCQkJICAgInNlcW5vX2JlZm9yZSA9ICIgRk1UZDY0LCAoaW50NjRfdCkgb2xkX3NlcW5vLAorCQkJCSAgICJzZXFub19hZnRlciA9ICIgRk1UZDY0LCAoaW50NjRfdCkgdmdfc3RhdHVzX3NlcW5vLAorCQkJCSAgIE5VTEwpOworCisgbm9tZW1fZnJlZTI6CisJZG1fZnJlZSgoY2hhciAqKW5ld19wdmlkX2R1cCk7Cisgbm9tZW1fZnJlZTE6CisJZG1fY29uZmlnX2Rlc3Ryb3kobmV3X3B2bWV0YSk7Cisgbm9tZW06CisJRVJST1IocywgInB2X2ZvdW5kICVzIGlzIG91dCBvZiBtZW1vcnkuIiwgYXJnX3B2aWQpOworCUVSUk9SKHMsICJsdm1ldGFkIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGlzIGFib3J0aW5nLiIpOworCXJlcGx5X2ZhaWwoIm91dCBvZiBtZW1vcnkiKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyByZXNwb25zZSB2Z19jbGVhcl9vdXRkYXRlZF9wdnMobHZtZXRhZF9zdGF0ZSAqcywgcmVxdWVzdCByKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqb3V0ZGF0ZWRfcHZzOworCWNvbnN0IGNoYXIgKnZnaWQgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgInZnaWQiLCBOVUxMKTsKKworCWlmICghdmdpZCkKKwkJcmV0dXJuIHJlcGx5X2ZhaWwoIm5lZWQgVkcgVVVJRCIpOworCisJREVCVUdMT0cocywgInZnX2NsZWFyX291dGRhdGVkX3B2cyB2Z2lkICVzIiwgdmdpZCk7CisKKwlpZiAoKG91dGRhdGVkX3B2cyA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fb3V0ZGF0ZWRfcHZzLCB2Z2lkKSkpIHsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kob3V0ZGF0ZWRfcHZzKTsKKwkJZG1faGFzaF9yZW1vdmUocy0+dmdpZF90b19vdXRkYXRlZF9wdnMsIHZnaWQpOworCX0KKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZSgiT0siLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgdmdfaW5mb191cGRhdGUobHZtZXRhZF9zdGF0ZSAqcywgY29uc3QgY2hhciAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWV0YWRhdGEpCit7CisJc3RydWN0IHZnX2luZm8gKmluZm87CisJaW50NjRfdCBjYWNoZV92ZXJzaW9uOworCisJY2FjaGVfdmVyc2lvbiA9IGRtX2NvbmZpZ19maW5kX2ludDY0KG1ldGFkYXRhLCAibWV0YWRhdGEvc2Vxbm8iLCAtMSk7CisJaWYgKGNhY2hlX3ZlcnNpb24gPT0gLTEpCisJCXJldHVybjsKKworCWluZm8gPSAoc3RydWN0IHZnX2luZm8gKikgZG1faGFzaF9sb29rdXAocy0+dmdpZF90b19pbmZvLCB1dWlkKTsKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKworCWlmIChjYWNoZV92ZXJzaW9uID49IGluZm8tPmV4dGVybmFsX3ZlcnNpb24pCisJCWluZm8tPmZsYWdzICY9IH5WR0ZMX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyByZXNwb25zZSB2Z191cGRhdGUobHZtZXRhZF9zdGF0ZSAqcywgcmVxdWVzdCByKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWV0YWRhdGEgPSBkbV9jb25maWdfZmluZF9ub2RlKHIuY2Z0LT5yb290LCAibWV0YWRhdGEiKTsKKwljb25zdCBjaGFyICp2Z2lkID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHIsICJtZXRhZGF0YS9pZCIsIE5VTEwpOworCWNvbnN0IGNoYXIgKnZnbmFtZSA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidmduYW1lIiwgTlVMTCk7CisKKwlERUJVR0xPRyhzLCAidmdfdXBkYXRlIHZnaWQgJXMgbmFtZSAlcyIsIHZnaWQgPzogIm5vbmUiLCB2Z25hbWUgPzogIm5vbmUiKTsKKworCWlmIChtZXRhZGF0YSkgeworCQlpZiAoIXZnaWQpIHsKKwkJCUVSUk9SKHMsICJ2Z191cGRhdGUgZmFpbGVkOiBuZWVkIFZHIFVVSUQiKTsKKwkJCXJlcGx5X2ZhaWwoInZnX3VwZGF0ZTogbmVlZCBWRyBVVUlEIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKCF2Z25hbWUpIHsKKwkJCUVSUk9SKHMsICJ2Z191cGRhdGUgZmFpbGVkOiBuZWVkIFZHIG5hbWUiKTsKKwkJCXJlcGx5X2ZhaWwoInZnX3VwZGF0ZTogbmVlZCBWRyBuYW1lIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKGRhZW1vbl9yZXF1ZXN0X2ludChyLCAibWV0YWRhdGEvc2Vxbm8iLCAtMSkgPCAwKSB7CisJCQlFUlJPUihzLCAidmdfdXBkYXRlIGZhaWxlZDogbmVlZCBWRyBzZXFubyIpOworCQkJcmVwbHlfZmFpbCgidmdfdXBkYXRlOiBuZWVkIFZHIHNlcW5vIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQkvKiBUT0RPIGRlZmVyIG1ldGFkYXRhIHVwZGF0ZSBoZXJlOyBhZGQgYSBzZXBhcmF0ZSB2Z19jb21taXQKKwkJICogY2FsbDsgaWYgY2xpZW50IGRvZXMgbm90IGNvbW1pdCwgZGllICovCisKKwkJaWYgKCFfdXBkYXRlX21ldGFkYXRhKHMsIHZnbmFtZSwgdmdpZCwgbWV0YWRhdGEsIE5VTEwsIE5VTEwpKSB7CisJCQlFUlJPUihzLCAidmdfdXBkYXRlIGZhaWxlZDogbWV0YWRhdGEgdXBkYXRlIGZhaWxlZCIpOworCQkJcmVwbHlfZmFpbCgidmdfdXBkYXRlOiBmYWlsZWQgbWV0YWRhdGEgdXBkYXRlIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQl2Z19pbmZvX3VwZGF0ZShzLCB2Z2lkLCBtZXRhZGF0YSk7CisJfQorCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJPSyIsIE5VTEwpOworCitmYWlsOgorCUVSUk9SKHMsICJsdm1ldGFkIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGlzIGFib3J0aW5nLiIpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHJlc3BvbnNlIHZnX3JlbW92ZShsdm1ldGFkX3N0YXRlICpzLCByZXF1ZXN0IHIpCit7CisJY29uc3QgY2hhciAqdmdpZCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidXVpZCIsIE5VTEwpOworCisJaWYgKCF2Z2lkKQorCQlyZXR1cm4gcmVwbHlfZmFpbCgibmVlZCBWRyBVVUlEIik7CisKKwlERUJVR0xPRyhzLCAidmdfcmVtb3ZlOiAlcyIsIHZnaWQpOworCisJcmVtb3ZlX21ldGFkYXRhKHMsIHZnaWQsIDEpOworCisJcmV0dXJuIGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwgTlVMTCk7Cit9CisKKy8qCisgKiBXaGV0aGVyIGx2bWV0YWQgaXMgZGlzYWJsZWQgaXMgZGV0ZXJtaW5lZCBvbmx5IGJ5IHRoZSBzaW5nbGUKKyAqIGZsYWcgR0xGTF9ESVNBQkxFLiAgVGhlIFJFQVNPTiBmbGFncyBhcmUgb25seSBleHBsYW5hdG9yeQorICogYWRkaXRpb25zIHRvIEdMRkxfRElTQUJMRSwgYW5kIGRvIG5vdCBjb250cm9sIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKyAqIFRoZSBSRUFTT04gZmxhZ3MgY2FuIGFjY3VtdWxhdGUgaWYgbXVsdGlwbGUgcmVhc29ucyBleGlzdCBmb3IKKyAqIHRoZSBkaXNhYmxlZCBmbGFnLiAgV2hlbiBjbGVhcmluZyBHTEZMX0RJU0FCTEUsIGFsbCBSRUFTT04gZmxhZ3MKKyAqIGFyZSBjbGVhcmVkLiAgVGhlIGNhbGxlciBjbGVhcmluZyBHTEZMX0RJU0FCTEUgc2hvdWxkIG9ubHkgZG8gc28KKyAqIHdoZW4gYWxsIHRoZSByZWFzb25zIGZvciBpdCBoYXZlIGdvbmUuCisgKi8KKworc3RhdGljIHJlc3BvbnNlIHNldF9nbG9iYWxfaW5mbyhsdm1ldGFkX3N0YXRlICpzLCByZXF1ZXN0IHIpCit7CisJY29uc3QgaW50IGdsb2JhbF9pbnZhbGlkID0gZGFlbW9uX3JlcXVlc3RfaW50KHIsICJnbG9iYWxfaW52YWxpZCIsIC0xKTsKKwljb25zdCBpbnQgZ2xvYmFsX2Rpc2FibGUgPSBkYWVtb25fcmVxdWVzdF9pbnQociwgImdsb2JhbF9kaXNhYmxlIiwgLTEpOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKKwl1aW50MzJfdCByZWFzb25fZmxhZ3MgPSAwOworCisJaWYgKChyZWFzb24gPSBkYWVtb25fcmVxdWVzdF9zdHIociwgImRpc2FibGVfcmVhc29uIiwgTlVMTCkpKSB7CisJCWlmIChzdHJzdHIocmVhc29uLCBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0RJUkVDVCkpCisJCQlyZWFzb25fZmxhZ3MgfD0gR0xGTF9ESVNBQkxFX1JFQVNPTl9ESVJFQ1Q7CisJCWlmIChzdHJzdHIocmVhc29uLCBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0xWTTEpKQorCQkJcmVhc29uX2ZsYWdzIHw9IEdMRkxfRElTQUJMRV9SRUFTT05fTFZNMTsKKwkJaWYgKHN0cnN0cihyZWFzb24sIExWTUVUQURfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUykpCisJCQlyZWFzb25fZmxhZ3MgfD0gR0xGTF9ESVNBQkxFX1JFQVNPTl9EVVBMSUNBVEVTOworCQlpZiAoc3Ryc3RyKHJlYXNvbiwgTFZNRVRBRF9ESVNBQkxFX1JFQVNPTl9WR1JFU1RPUkUpKQorCQkJcmVhc29uX2ZsYWdzIHw9IEdMRkxfRElTQUJMRV9SRUFTT05fVkdSRVNUT1JFOworCX0KKworCWlmIChnbG9iYWxfaW52YWxpZCAhPSAtMSkgeworCQlERUJVR0xPRyhzLCAic2V0IGdsb2JhbCBpbmZvIGludmFsaWQgZnJvbSAlZCB0byAlZCIsCisJCQkgKHMtPmZsYWdzICYgR0xGTF9JTlZBTElEKSA/IDEgOiAwLCBnbG9iYWxfaW52YWxpZCk7CisJfQorCisJaWYgKGdsb2JhbF9kaXNhYmxlICE9IC0xKSB7CisJCURFQlVHTE9HKHMsICJzZXQgZ2xvYmFsIGluZm8gZGlzYWJsZSBmcm9tICVkIHRvICVkICVzIiwKKwkJCSAocy0+ZmxhZ3MgJiBHTEZMX0RJU0FCTEUpID8gMSA6IDAsIGdsb2JhbF9kaXNhYmxlLAorCQkJIHJlYXNvbiA/IHJlYXNvbiA6ICIiKTsKKwl9CisKKwlpZiAoZ2xvYmFsX2ludmFsaWQgPT0gMSkKKwkJcy0+ZmxhZ3MgfD0gR0xGTF9JTlZBTElEOworCisJZWxzZSBpZiAoZ2xvYmFsX2ludmFsaWQgPT0gMCkKKwkJcy0+ZmxhZ3MgJj0gfkdMRkxfSU5WQUxJRDsKKworCWlmIChnbG9iYWxfZGlzYWJsZSA9PSAxKSB7CisJCXMtPmZsYWdzIHw9IEdMRkxfRElTQUJMRTsKKwkJcy0+ZmxhZ3MgfD0gcmVhc29uX2ZsYWdzOworCisJfSBlbHNlIGlmIChnbG9iYWxfZGlzYWJsZSA9PSAwKSB7CisJCXMtPmZsYWdzICY9IH5HTEZMX0RJU0FCTEU7CisJCXMtPmZsYWdzICY9IH5HTEZMX0RJU0FCTEVfUkVBU09OX0FMTDsKKwl9CisKKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZSgiT0siLCBOVUxMKTsKK30KKworI2RlZmluZSBSRUFTT05fQlVGX1NJWkUgNjQKKworLyoKKyAqIFNhdmUgdGhlIHRpbWUgd2hlbiAidXBkYXRpbmciIGJlZ2lucywgYW5kIHRoZSBjb25maWcgc2V0dGluZyBmb3IgaG93IGxvbmcKKyAqIHRoZSB1cGRhdGUgaXMgYWxsb3dlZCB0byB0YWtlLiAgQmVmb3JlIHJldHVybmluZyAidXBkYXRpbmciIGFzIHRoZSB0b2tlbgorICogdmFsdWUgaW4gZ2V0X2dsb2JhbF9pbmZvLCBjaGVjayBpZiB0aGUgdXBkYXRlIGhhcyBleGNlZWRlZCB0aGUgbWF4IGFsbG93ZWQKKyAqIHRpbWUuICBJZiBzbywgdGhlbiByZXR1cm4gIm5vbmUiIGFzIHRoZSBjdXJyZW50IHRva2VuIHZhbHVlIChpLmUuCisgKiB1bmluaXRpYWxpemVkKSwgc28gdGhhdCB0aGUgY29tbWFuZCB3aWxsIHJlcG9wdWxhdGUgb3VyIGNhY2hlLgorICoKKyAqIFRoaXMgYXV0b21hdGljYWxseSBjbGVhcnMgYSBzdHVjayB1cGRhdGUsIHdoZXJlIGEgY29tbWFuZCBzdGFydGVkIHRvIHVwZGF0ZQorICogdGhlIGNhY2hlIGFuZCB0aGVuIGZhaWxlZCwgbGVhdmluZyB0aGUgdG9rZW4gc2V0IHRvICJ1cGRhdGUgaW4gcHJvZ3Jlc3MiLgorICovCisKK3N0YXRpYyByZXNwb25zZSBnZXRfZ2xvYmFsX2luZm8obHZtZXRhZF9zdGF0ZSAqcywgcmVxdWVzdCByKQoreworCWNoYXIgcmVhc29uW1JFQVNPTl9CVUZfU0laRV07CisJY2hhciBmbGFnX3N0cls2NF07CisJaW50IHBpZDsKKworCS8qIFRoaXMgYnVmZmVyIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlIHBvc3NpYmxlIHJlYXNvbnMuICovCisKKwltZW1zZXQocmVhc29uLCAwLCBzaXplb2YocmVhc29uKSk7CisKKwlwaWQgPSAoaW50KWRhZW1vbl9yZXF1ZXN0X2ludChyLCAicGlkIiwgMCk7CisKKwlpZiAocy0+ZmxhZ3MgJiBHTEZMX0RJU0FCTEUpIHsKKwkJc25wcmludGYocmVhc29uLCBSRUFTT05fQlVGX1NJWkUgLSAxLCAiJXMlcyVzJXMiLAorCQkJIChzLT5mbGFncyAmIEdMRkxfRElTQUJMRV9SRUFTT05fRElSRUNUKSAgICAgPyBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0RJUkVDVCAiLCIgOiAiIiwKKwkJCSAocy0+ZmxhZ3MgJiBHTEZMX0RJU0FCTEVfUkVBU09OX0xWTTEpICAgICAgID8gTFZNRVRBRF9ESVNBQkxFX1JFQVNPTl9MVk0xICIsIiA6ICIiLAorCQkJIChzLT5mbGFncyAmIEdMRkxfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUykgPyBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0RVUExJQ0FURVMgIiwiIDogIiIsCisJCQkgKHMtPmZsYWdzICYgR0xGTF9ESVNBQkxFX1JFQVNPTl9WR1JFU1RPUkUpICA/IExWTUVUQURfRElTQUJMRV9SRUFTT05fVkdSRVNUT1JFICIsIiA6ICIiKTsKKwl9CisKKwlpZiAoIXJlYXNvblswXSkKKwkJc3RyY3B5KHJlYXNvbiwgIm5vbmUiKTsKKworCS8qCisJICogSWYgdGhlIGN1cnJlbnQgdXBkYXRlIGhhcyB0aW1lZCBvdXQsIHRoZW4gcmV0dXJuCisJICogdG9rZW4gb2YgIm5vbmUiIHdoaWNoIG1lYW5zICJ1bmluaXRpYWxpemVkIiBzbyB0aGF0CisJICogdGhlIGNhbGxlciB3aWxsIHJlcG9wdWxhdGUgbHZtZXRhZC4KKwkgKi8KKwlpZiAocy0+dXBkYXRlX2JlZ2luICYmIHMtPnVwZGF0ZV90aW1lb3V0KSB7CisJCWlmIChfbW9ub3RvbmljX3NlY29uZHMoKSAtIHMtPnVwZGF0ZV9iZWdpbiA+PSBzLT51cGRhdGVfdGltZW91dCkgeworCQkJREVCVUdMT0cocywgImdsb2JhbCBpbmZvIGNhbmNlbCB1cGRhdGUgYWZ0ZXIgdGltZW91dCAlZCBsZW4gJWQgYmVnaW4gJWxsdSBwaWQgJWQgY21kICVzIiwKKwkJCQkgcy0+dXBkYXRlX3RpbWVvdXQsCisJCQkJIChpbnQpKF9tb25vdG9uaWNfc2Vjb25kcygpIC0gcy0+dXBkYXRlX2JlZ2luKSwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzLT51cGRhdGVfYmVnaW4sCisJCQkJIHMtPnVwZGF0ZV9waWQsIHMtPnVwZGF0ZV9jbWQpOworCQkJbWVtc2V0KHMtPnRva2VuLCAwLCBzaXplb2Yocy0+dG9rZW4pKTsKKwkJCXMtPnVwZGF0ZV9iZWdpbiA9IDA7CisJCQlzLT51cGRhdGVfdGltZW91dCA9IDA7CisJCQlzLT51cGRhdGVfcGlkID0gMDsKKwkJCW1lbXNldChzLT51cGRhdGVfY21kLCAwLCBDTURfTkFNRV9TSVpFKTsKKwkJfQorCX0KKworCW1lbXNldChmbGFnX3N0ciwgMCwgc2l6ZW9mKGZsYWdfc3RyKSk7CisJaWYgKHMtPmZsYWdzICYgR0xGTF9JTlZBTElEKQorCQlzdHJjYXQoZmxhZ19zdHIsICJJbnZhbGlkIik7CisJaWYgKHMtPmZsYWdzICYgR0xGTF9ESVNBQkxFKQorCQlzdHJjYXQoZmxhZ19zdHIsICJEaXNhYmxlIik7CisJaWYgKCFmbGFnX3N0clswXSkKKwkJc3RyY2F0KGZsYWdfc3RyLCAibm9uZSIpOworCisJREVCVUdMT0cocywgIiVkIGdsb2JhbCBpbmZvIGZsYWdzICVzIHJlYXNvbiAlcyB0b2tlbiAlcyB1cGRhdGVfcGlkICVkIiwKKwkJIHBpZCwgZmxhZ19zdHIsIHJlYXNvbiwgcy0+dG9rZW5bMF0gPyBzLT50b2tlbiA6ICJub25lIiwgcy0+dXBkYXRlX3BpZCk7CisKKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZSgiT0siLCAiZ2xvYmFsX2ludmFsaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpKChzLT5mbGFncyAmIEdMRkxfSU5WQUxJRCkgPyAxIDogMCksCisJCQkJCSAiZ2xvYmFsX2Rpc2FibGUgPSAiIEZNVGQ2NCwgKGludDY0X3QpKChzLT5mbGFncyAmIEdMRkxfRElTQUJMRSkgPyAxIDogMCksCisJCQkJCSAiZGlzYWJsZV9yZWFzb24gPSAlcyIsIHJlYXNvbiwKKwkJCQkJICJkYWVtb25fcGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCQkgInRva2VuID0gJXMiLCBzLT50b2tlblswXSA/IHMtPnRva2VuIDogIm5vbmUiLAorCQkJCQkgInVwZGF0ZV9jbWQgPSAlcyIsIHMtPnVwZGF0ZV9jbWQsCisJCQkJCSAidXBkYXRlX3BpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClzLT51cGRhdGVfcGlkLAorCQkJCQkgInVwZGF0ZV9iZWdpbiA9ICIgRk1UZDY0LCAoaW50NjRfdClzLT51cGRhdGVfYmVnaW4sCisJCQkJCSAidXBkYXRlX3RpbWVvdXQgPSAiIEZNVGQ2NCwgKGludDY0X3Qpcy0+dXBkYXRlX3RpbWVvdXQsCisJCQkJCSBOVUxMKTsKK30KKworc3RhdGljIHJlc3BvbnNlIHNldF92Z19pbmZvKGx2bWV0YWRfc3RhdGUgKnMsIHJlcXVlc3QgcikKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnZnOworCXN0cnVjdCB2Z19pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnV1aWQgPSBOVUxMOworCWNvbnN0IGludDY0X3QgbmV3X3ZlcnNpb24gPSBkYWVtb25fcmVxdWVzdF9pbnQociwgInZlcnNpb24iLCAtMSk7CisJaW50NjRfdCBjYWNoZV92ZXJzaW9uID0gLTE7CisKKwlpZiAobmV3X3ZlcnNpb24gPT0gLTEpCisJCWdvdG8gb3V0OworCisJaWYgKCEodXVpZCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidXVpZCIsIE5VTEwpKSkKKwkJZ290byB1c2VfbmFtZTsKKworCWlmICgodmcgPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX21ldGFkYXRhLCB1dWlkKSkpCisJCWdvdG8gdmVyczsKK3VzZV9uYW1lOgorCWlmICghKG5hbWUgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgIm5hbWUiLCBOVUxMKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCEodXVpZCA9IGRtX2hhc2hfbG9va3VwKHMtPnZnbmFtZV90b192Z2lkLCBuYW1lKSkpCisJCWdvdG8gb3V0OworCisJLyogCisJICogRklYTUU6IGlmIHdlIG9ubHkgaGF2ZSB0aGUgbmFtZSBhbmQgbXVsdGlwbGUgVkdzIGhhdmUgdGhhdCBuYW1lLAorCSAqIHRoZW4gaW52YWxpZGF0ZSBlYWNoIG9mIHRoZW0uCisJICovCisKKwlpZiAoISh2ZyA9IGRtX2hhc2hfbG9va3VwKHMtPnZnaWRfdG9fbWV0YWRhdGEsIHV1aWQpKSkKKwkJZ290byBvdXQ7Cit2ZXJzOgorCWlmICghbmV3X3ZlcnNpb24pCisJCWdvdG8gaW52YWw7CisKKwljYWNoZV92ZXJzaW9uID0gZG1fY29uZmlnX2ZpbmRfaW50NjQodmctPnJvb3QsICJtZXRhZGF0YS9zZXFubyIsIC0xKTsKKworCWlmIChjYWNoZV92ZXJzaW9uICE9IC0xICYmIG5ld192ZXJzaW9uICE9IC0xICYmIGNhY2hlX3ZlcnNpb24gPj0gbmV3X3ZlcnNpb24pCisJCWdvdG8gb3V0OworaW52YWw6CisJREVCVUdMT0cocywgInNldCBpbmZvIFZHIG5hbWUgJXMgdXVpZCAlcyBjYWNoZV92ZXJzaW9uICVkIG5ld192ZXJzaW9uICVkIiwKKwkJIG5hbWUgPzogIm5vbmUiLCB1dWlkID86ICJub25lIiwgKGludCljYWNoZV92ZXJzaW9uLCAoaW50KW5ld192ZXJzaW9uKTsKKworCWluZm8gPSBkbV9oYXNoX2xvb2t1cChzLT52Z2lkX3RvX2luZm8sIHV1aWQpOworCWlmICghaW5mbykgeworCQlpbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmdfaW5mbykpOworCQlpZiAoIWluZm8pCisJCQlnb3RvIGJhZDsKKwkJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdmdfaW5mbykpOworCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KHMtPnZnaWRfdG9faW5mbywgdXVpZCwgKHZvaWQqKWluZm8pKQorCQkJZ290byBiYWQ7CisJfQorCisJaW5mby0+ZXh0ZXJuYWxfdmVyc2lvbiA9IG5ld192ZXJzaW9uOworCWluZm8tPmZsYWdzIHw9IFZHRkxfSU5WQUxJRDsKKworb3V0OgorCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJPSyIsIE5VTEwpOworYmFkOgorCXJldHVybiByZXBseV9mYWlsKCJvdXQgb2YgbWVtb3J5Iik7Cit9CisKK3N0YXRpYyB2b2lkIF9kdW1wX2NmdChzdHJ1Y3QgYnVmZmVyICpidWYsIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpodCwgY29uc3QgY2hhciAqa2V5X2FkZHIpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBodCkgeworCQlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IGRtX2hhc2hfZ2V0X2RhdGEoaHQsIG4pOworCQljb25zdCBjaGFyICprZXlfYmFja3VwID0gY2Z0LT5yb290LT5rZXk7CisJCWNmdC0+cm9vdC0+a2V5ID0gZG1fY29uZmlnX2ZpbmRfc3RyKGNmdC0+cm9vdCwga2V5X2FkZHIsICJ1bmtub3duIik7CisJCSh2b2lkKSBkbV9jb25maWdfd3JpdGVfbm9kZShjZnQtPnJvb3QsIGJ1ZmZlcl9saW5lLCBidWYpOworCQljZnQtPnJvb3QtPmtleSA9IGtleV9iYWNrdXA7CisJfQorfQorCitzdGF0aWMgdm9pZCBfZHVtcF9wYWlycyhzdHJ1Y3QgYnVmZmVyICpidWYsIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpodCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGludF9rZXkpCit7CisJY2hhciAqYXBwZW5kOworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisKKwlidWZmZXJfYXBwZW5kKGJ1ZiwgbmFtZSk7CisJYnVmZmVyX2FwcGVuZChidWYsICIge1xuIik7CisKKwlkbV9oYXNoX2l0ZXJhdGUobiwgaHQpIHsKKwkJY29uc3QgY2hhciAqa2V5ID0gZG1faGFzaF9nZXRfa2V5KGh0LCBuKSwKKwkJCSAgICp2YWwgPSBkbV9oYXNoX2dldF9kYXRhKGh0LCBuKTsKKwkJYnVmZmVyX2FwcGVuZChidWYsICIgICAgIik7CisJCWlmIChpbnRfa2V5KQorCQkJKHZvaWQpIGRtX2FzcHJpbnRmKCZhcHBlbmQsICIlZCA9IFwiJXNcIiIsICooY29uc3QgaW50KilrZXksIHZhbCk7CisJCWVsc2UKKwkJCSh2b2lkKSBkbV9hc3ByaW50ZigmYXBwZW5kLCAiJXMgPSBcIiVzXCIiLCBrZXksIHZhbCk7CisJCWlmIChhcHBlbmQpCisJCQlidWZmZXJfYXBwZW5kKGJ1ZiwgYXBwZW5kKTsKKwkJYnVmZmVyX2FwcGVuZChidWYsICJcbiIpOworCQlkbV9mcmVlKGFwcGVuZCk7CisJfQorCWJ1ZmZlcl9hcHBlbmQoYnVmLCAifVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9kdW1wX2luZm9fdmVyc2lvbihzdHJ1Y3QgYnVmZmVyICpidWYsIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpodCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGludF9rZXkpCit7CisJY2hhciAqYXBwZW5kOworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm4gPSBkbV9oYXNoX2dldF9maXJzdChodCk7CisJc3RydWN0IHZnX2luZm8gKmluZm87CisKKwlidWZmZXJfYXBwZW5kKGJ1ZiwgbmFtZSk7CisJYnVmZmVyX2FwcGVuZChidWYsICIge1xuIik7CisKKwl3aGlsZSAobikgeworCQljb25zdCBjaGFyICprZXkgPSBkbV9oYXNoX2dldF9rZXkoaHQsIG4pOworCQlpbmZvID0gZG1faGFzaF9nZXRfZGF0YShodCwgbik7CisJCWJ1ZmZlcl9hcHBlbmQoYnVmLCAiICAgICIpOworCQkodm9pZCkgZG1fYXNwcmludGYoJmFwcGVuZCwgIiVzID0gJWxsZCIsIGtleSwgKGxvbmcgbG9uZylpbmZvLT5leHRlcm5hbF92ZXJzaW9uKTsKKwkJaWYgKGFwcGVuZCkKKwkJCWJ1ZmZlcl9hcHBlbmQoYnVmLCBhcHBlbmQpOworCQlidWZmZXJfYXBwZW5kKGJ1ZiwgIlxuIik7CisJCWRtX2ZyZWUoYXBwZW5kKTsKKwkJbiA9IGRtX2hhc2hfZ2V0X25leHQoaHQsIG4pOworCX0KKwlidWZmZXJfYXBwZW5kKGJ1ZiwgIn1cbiIpOworfQorCitzdGF0aWMgdm9pZCBfZHVtcF9pbmZvX2ZsYWdzKHN0cnVjdCBidWZmZXIgKmJ1Ziwgc3RydWN0IGRtX2hhc2hfdGFibGUgKmh0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW50X2tleSkKK3sKKwljaGFyICphcHBlbmQ7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbiA9IGRtX2hhc2hfZ2V0X2ZpcnN0KGh0KTsKKwlzdHJ1Y3QgdmdfaW5mbyAqaW5mbzsKKworCWJ1ZmZlcl9hcHBlbmQoYnVmLCBuYW1lKTsKKwlidWZmZXJfYXBwZW5kKGJ1ZiwgIiB7XG4iKTsKKworCXdoaWxlIChuKSB7CisJCWNvbnN0IGNoYXIgKmtleSA9IGRtX2hhc2hfZ2V0X2tleShodCwgbik7CisJCWluZm8gPSBkbV9oYXNoX2dldF9kYXRhKGh0LCBuKTsKKwkJYnVmZmVyX2FwcGVuZChidWYsICIgICAgIik7CisJCSh2b2lkKSBkbV9hc3ByaW50ZigmYXBwZW5kLCAiJXMgPSAlbGx4Iiwga2V5LCAobG9uZyBsb25nKWluZm8tPmZsYWdzKTsKKwkJaWYgKGFwcGVuZCkKKwkJCWJ1ZmZlcl9hcHBlbmQoYnVmLCBhcHBlbmQpOworCQlidWZmZXJfYXBwZW5kKGJ1ZiwgIlxuIik7CisJCWRtX2ZyZWUoYXBwZW5kKTsKKwkJbiA9IGRtX2hhc2hfZ2V0X25leHQoaHQsIG4pOworCX0KKwlidWZmZXJfYXBwZW5kKGJ1ZiwgIn1cbiIpOworfQorCitzdGF0aWMgcmVzcG9uc2UgZHVtcChsdm1ldGFkX3N0YXRlICpzKQoreworCXJlc3BvbnNlIHJlcyA9IHsgMCB9OworCXN0cnVjdCBidWZmZXIgKmIgPSAmcmVzLmJ1ZmZlcjsKKworCWJ1ZmZlcl9pbml0KGIpOworCisJLyogTG9jayBldmVyeXRoaW5nIHNvIHRoYXQgd2UgZ2V0IGEgY29uc2lzdGVudCBkdW1wLiAqLworCisJYnVmZmVyX2FwcGVuZChiLCAiIyBWRyBNRVRBREFUQVxuXG4iKTsKKwlfZHVtcF9jZnQoYiwgcy0+dmdpZF90b19tZXRhZGF0YSwgIm1ldGFkYXRhL2lkIik7CisKKwlidWZmZXJfYXBwZW5kKGIsICJcbiMgUFYgTUVUQURBVEFcblxuIik7CisJX2R1bXBfY2Z0KGIsIHMtPnB2aWRfdG9fcHZtZXRhLCAicHZtZXRhL2lkIik7CisKKwlidWZmZXJfYXBwZW5kKGIsICJcbiMgVkdJRCB0byBWR05BTUUgbWFwcGluZ1xuXG4iKTsKKwlfZHVtcF9wYWlycyhiLCBzLT52Z2lkX3RvX3ZnbmFtZSwgInZnaWRfdG9fdmduYW1lIiwgMCk7CisKKwlidWZmZXJfYXBwZW5kKGIsICJcbiMgVkdJRCB0byBvdXRkYXRlZCBQVnMgbWFwcGluZ1xuXG4iKTsKKwlfZHVtcF9jZnQoYiwgcy0+dmdpZF90b19vdXRkYXRlZF9wdnMsICJvdXRkYXRlZF9wdnMvdmdpZCIpOworCisJYnVmZmVyX2FwcGVuZChiLCAiXG4jIFZHTkFNRSB0byBWR0lEIG1hcHBpbmdcblxuIik7CisJX2R1bXBfcGFpcnMoYiwgcy0+dmduYW1lX3RvX3ZnaWQsICJ2Z25hbWVfdG9fdmdpZCIsIDApOworCisJYnVmZmVyX2FwcGVuZChiLCAiXG4jIFBWSUQgdG8gVkdJRCBtYXBwaW5nXG5cbiIpOworCV9kdW1wX3BhaXJzKGIsIHMtPnB2aWRfdG9fdmdpZCwgInB2aWRfdG9fdmdpZCIsIDApOworCisJYnVmZmVyX2FwcGVuZChiLCAiXG4jIERFVklDRSB0byBQVklEIG1hcHBpbmdcblxuIik7CisJX2R1bXBfcGFpcnMoYiwgcy0+ZGV2aWNlX3RvX3B2aWQsICJkZXZpY2VfdG9fcHZpZCIsIDEpOworCisJYnVmZmVyX2FwcGVuZChiLCAiXG4jIFZHSUQgdG8gSU5GTyB2ZXJzaW9uIG1hcHBpbmdcblxuIik7CisJX2R1bXBfaW5mb192ZXJzaW9uKGIsIHMtPnZnaWRfdG9faW5mbywgInZnaWRfdG9faW5mbyIsIDApOworCisJYnVmZmVyX2FwcGVuZChiLCAiXG4jIFZHSUQgdG8gSU5GTyBmbGFncyBtYXBwaW5nXG5cbiIpOworCV9kdW1wX2luZm9fZmxhZ3MoYiwgcy0+dmdpZF90b19pbmZvLCAidmdpZF90b19pbmZvIiwgMCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgcmVzcG9uc2UgaGFuZGxlcihkYWVtb25fc3RhdGUgcywgY2xpZW50X2hhbmRsZSBoLCByZXF1ZXN0IHIpCit7CisJcmVzcG9uc2UgcmVzOworCWx2bWV0YWRfc3RhdGUgKnN0YXRlID0gcy5wcml2YXRlOworCWNoYXIgcHJldl90b2tlblsxMjhdID0geyAwIH07CisJY29uc3QgY2hhciAqcnE7CisJY29uc3QgY2hhciAqdG9rZW47CisJY29uc3QgY2hhciAqY21kOworCWludCBwcmV2X2luX3Byb2dyZXNzLCB0aGlzX2luX3Byb2dyZXNzOworCWludCB1cGRhdGVfdGltZW91dDsKKwlpbnQgcGlkOworCWludCBjYWNoZV9sb2NrID0gMDsKKwlpbnQgaW5mb19sb2NrID0gMDsKKworCXJxID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHIsICJyZXF1ZXN0IiwgIk5PTkUiKTsKKwl0b2tlbiA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyLCAidG9rZW4iLCAiTk9ORSIpOworCXBpZCA9IChpbnQpZGFlbW9uX3JlcXVlc3RfaW50KHIsICJwaWQiLCAwKTsKKwljbWQgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgImNtZCIsICJOT05FIik7CisJdXBkYXRlX3RpbWVvdXQgPSAoaW50KWRhZW1vbl9yZXF1ZXN0X2ludChyLCAidXBkYXRlX3RpbWVvdXQiLCAwKTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhdGUtPnRva2VuX2xvY2spOworCisJLyoKKwkgKiB0b2tlbl91cGRhdGU6IHN0YXJ0IHBvcHVsYXRpbmcgdGhlIGNhY2hlLCBpLmUuIGEgZnVsbCB1cGRhdGUuCisJICogVG8gcG9wdWxhdGUgdGhlIGx2bWV0YWQgY2FjaGUsIGEgY29tbWFuZCBkb2VzOgorCSAqCisJICogLSB0b2tlbl91cGRhdGUsIHNldHRpbmcgdG9rZW4gdG8gInVwZGF0ZSBpbiBwcm9ncmVzcyIKKwkgKiAgIChmdXJ0aGVyIHJlcXVlc3RzIGR1cmluZyB0aGUgdXBkYXRlIGNvbnRpbnVlIHVzaW5nCisJICogICB0aGlzIHNhbWUgInVwZGF0ZSBpbiBwcm9ncmVzcyIgdG9rZW4pCisJICogLSBwdl9jbGVhcl9hbGwsIHRvIGNsZWFyIHRoZSBjdXJyZW50IGNhY2hlCisJICogLSBwdl9nb25lLCBmb3IgZWFjaCBQVgorCSAqIC0gcHZfZm91bmQsIGZvciBlYWNoIFBWIHRvIHBvcHVsYXRlIHRoZSBjYWNoZQorCSAqIC0gdG9rZW5fdXBkYXRlLCBzZXR0aW5nIHRva2VuIHRvIGZpbHRlciBoYXNoCisJICovCisJaWYgKCFzdHJjbXAocnEsICJ0b2tlbl91cGRhdGUiKSkgeworCQlwcmV2X2luX3Byb2dyZXNzID0gIXN0cmNtcChzdGF0ZS0+dG9rZW4sIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKTsKKwkJdGhpc19pbl9wcm9ncmVzcyA9ICFzdHJjbXAodG9rZW4sIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKTsKKworCQlpZiAoIXByZXZfaW5fcHJvZ3Jlc3MgJiYgdGhpc19pbl9wcm9ncmVzcykgeworCQkJLyogTmV3IHVwZGF0ZSBpcyBzdGFydGluZyAoZmlsdGVyIHRva2VuIGlzIHJlcGxhY2VkIGJ5IHVwZGF0ZSB0b2tlbikgKi8KKworCQkJbWVtY3B5KHByZXZfdG9rZW4sIHN0YXRlLT50b2tlbiwgMTI4KTsKKwkJCXN0cm5jcHkoc3RhdGUtPnRva2VuLCB0b2tlbiwgMTI4KTsKKwkJCXN0YXRlLT50b2tlblsxMjddID0gMDsKKwkJCXN0YXRlLT51cGRhdGVfYmVnaW4gPSBfbW9ub3RvbmljX3NlY29uZHMoKTsKKwkJCXN0YXRlLT51cGRhdGVfdGltZW91dCA9IHVwZGF0ZV90aW1lb3V0OworCQkJc3RhdGUtPnVwZGF0ZV9waWQgPSBwaWQ7CisJCQlzdHJuY3B5KHN0YXRlLT51cGRhdGVfY21kLCBjbWQsIENNRF9OQU1FX1NJWkUgLSAxKTsKKworCQkJREVCVUdMT0coc3RhdGUsICJ0b2tlbl91cGRhdGUgYmVnaW4gJWxsdSB0aW1lb3V0ICVkIHBpZCAlZCBjbWQgJXMiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXN0YXRlLT51cGRhdGVfYmVnaW4sCisJCQkJIHN0YXRlLT51cGRhdGVfdGltZW91dCwKKwkJCQkgc3RhdGUtPnVwZGF0ZV9waWQsCisJCQkJIHN0YXRlLT51cGRhdGVfY21kKTsKKworCQl9IGVsc2UgaWYgKHByZXZfaW5fcHJvZ3Jlc3MgJiYgdGhpc19pbl9wcm9ncmVzcykgeworCQkJLyogQ3VycmVudCB1cGRhdGUgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ldyB1cGRhdGUgKi8KKworCQkJREVCVUdMT0coc3RhdGUsICJ0b2tlbl91cGRhdGUgcmVwbGFjaW5nIHBpZCAlZCBiZWdpbiAlbGx1IGxlbiAlZCBjbWQgJXMiLAorCQkJCSBzdGF0ZS0+dXBkYXRlX3BpZCwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGF0ZS0+dXBkYXRlX2JlZ2luLAorCQkJCSAoaW50KShfbW9ub3RvbmljX3NlY29uZHMoKSAtIHN0YXRlLT51cGRhdGVfYmVnaW4pLAorCQkJCSBzdGF0ZS0+dXBkYXRlX2NtZCk7CisKKwkJCW1lbWNweShwcmV2X3Rva2VuLCBzdGF0ZS0+dG9rZW4sIDEyOCk7CisJCQlzdHJuY3B5KHN0YXRlLT50b2tlbiwgdG9rZW4sIDEyOCk7CisJCQlzdGF0ZS0+dG9rZW5bMTI3XSA9IDA7CisJCQlzdGF0ZS0+dXBkYXRlX2JlZ2luID0gX21vbm90b25pY19zZWNvbmRzKCk7CisJCQlzdGF0ZS0+dXBkYXRlX3RpbWVvdXQgPSB1cGRhdGVfdGltZW91dDsKKwkJCXN0YXRlLT51cGRhdGVfcGlkID0gcGlkOworCQkJc3RybmNweShzdGF0ZS0+dXBkYXRlX2NtZCwgY21kLCBDTURfTkFNRV9TSVpFIC0gMSk7CisKKwkJCURFQlVHTE9HKHN0YXRlLCAidG9rZW5fdXBkYXRlIGJlZ2luICVsbHUgdGltZW91dCAlZCBwaWQgJWQgY21kICVzIiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGF0ZS0+dXBkYXRlX2JlZ2luLAorCQkJCSBzdGF0ZS0+dXBkYXRlX3RpbWVvdXQsCisJCQkJIHN0YXRlLT51cGRhdGVfcGlkLAorCQkJCSBzdGF0ZS0+dXBkYXRlX2NtZCk7CisKKwkJfSBlbHNlIGlmIChwcmV2X2luX3Byb2dyZXNzICYmICF0aGlzX2luX3Byb2dyZXNzKSB7CisJCQkvKiBVcGRhdGUgaXMgZmluaXNoZWQsIHVwZGF0ZSB0b2tlbiBpcyByZXBsYWNlZCBieSBmaWx0ZXIgdG9rZW4gKi8KKworCQkJaWYgKHN0YXRlLT51cGRhdGVfcGlkICE9IHBpZCkgeworCQkJCS8qIElmIGEgcGlkIGRvaW5nIHVwZGF0ZSB3YXMgY2FuY2VsbGVkLCBpZ25vcmUgaXRzIHRva2VuIHVwZGF0ZSBhdCB0aGUgZW5kLiAqLworCQkJCURFQlVHTE9HKHN0YXRlLCAidG9rZW5fdXBkYXRlIGlnbm9yZWQgZnJvbSBjYW5jZWxsZWQgdXBkYXRlIHBpZCAlZCIsIHBpZCk7CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT50b2tlbl9sb2NrKTsKKworCQkJCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJ0b2tlbl9taXNtYXRjaCIsCisJCQkJCQkJICAgImV4cGVjdGVkID0gJXMiLCBzdGF0ZS0+dG9rZW4sCisJCQkJCQkJICAgInJlY2VpdmVkID0gJXMiLCB0b2tlbiwKKwkJCQkJCQkgICAidXBkYXRlX3BpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClzdGF0ZS0+dXBkYXRlX3BpZCwKKwkJCQkJCQkgICAicmVhc29uID0gJXMiLCAiYW5vdGhlciBjb21tYW5kIGhhcyBwb3B1bGF0ZWQgdGhlIGNhY2hlIik7CisJCQl9CisKKwkJCURFQlVHTE9HKHN0YXRlLCAidG9rZW5fdXBkYXRlIGVuZCBsZW4gJWQgcGlkICVkIG5ldyB0b2tlbiAlcyIsCisJCQkJIChpbnQpKF9tb25vdG9uaWNfc2Vjb25kcygpIC0gc3RhdGUtPnVwZGF0ZV9iZWdpbiksCisJCQkJIHN0YXRlLT51cGRhdGVfcGlkLCB0b2tlbik7CisKKwkJCW1lbWNweShwcmV2X3Rva2VuLCBzdGF0ZS0+dG9rZW4sIDEyOCk7CisJCQlzdHJuY3B5KHN0YXRlLT50b2tlbiwgdG9rZW4sIDEyOCk7CisJCQlzdGF0ZS0+dG9rZW5bMTI3XSA9IDA7CisJCQlzdGF0ZS0+dXBkYXRlX2JlZ2luID0gMDsKKwkJCXN0YXRlLT51cGRhdGVfdGltZW91dCA9IDA7CisJCQlzdGF0ZS0+dXBkYXRlX3BpZCA9IDA7CisJCQltZW1zZXQoc3RhdGUtPnVwZGF0ZV9jbWQsIDAsIENNRF9OQU1FX1NJWkUpOworCQl9CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+dG9rZW5fbG9jayk7CisKKwkJcmV0dXJuIGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwKKwkJCQkJICAgInByZXZfdG9rZW4gPSAlcyIsIHByZXZfdG9rZW4sCisJCQkJCSAgICJ1cGRhdGVfcGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KXN0YXRlLT51cGRhdGVfcGlkLAorCQkJCQkgICBOVUxMKTsKKwl9CisKKwlpZiAoc3RyY21wKHRva2VuLCBzdGF0ZS0+dG9rZW4pICYmIHN0cmNtcChycSwgImR1bXAiKSAmJiBzdHJjbXAodG9rZW4sICJza2lwIikpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT50b2tlbl9sb2NrKTsKKworCQlERUJVR0xPRyhzdGF0ZSwgInRva2VuX21pc21hdGNoIGN1cnJlbnQgXCIlc1wiIGdvdCBcIiVzXCIgZnJvbSBwaWQgJWQgY21kICVzIiwKKwkJCSBzdGF0ZS0+dG9rZW4sIHRva2VuLCBwaWQsIGNtZCA/OiAibm9uZSIpOworCisJCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJ0b2tlbl9taXNtYXRjaCIsCisJCQkJCSAgICJleHBlY3RlZCA9ICVzIiwgc3RhdGUtPnRva2VuLAorCQkJCQkgICAicmVjZWl2ZWQgPSAlcyIsIHRva2VuLAorCQkJCQkgICAidXBkYXRlX3BpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClzdGF0ZS0+dXBkYXRlX3BpZCwKKwkJCQkJICAgInJlYXNvbiA9ICVzIiwgImFub3RoZXIgY29tbWFuZCBoYXMgcG9wdWxhdGVkIHRoZSBjYWNoZSIpOworCX0KKworCS8qIElmIGEgcGlkIGRvaW5nIHVwZGF0ZSB3YXMgY2FuY2VsbGVkLCBpZ25vcmUgaXRzIHVwZGF0ZSBtZXNzYWdlcy4gKi8KKwlpZiAoIXN0cmNtcCh0b2tlbiwgTFZNRVRBRF9UT0tFTl9VUERBVEVfSU5fUFJPR1JFU1MpICYmCisJICAgIHN0YXRlLT51cGRhdGVfcGlkICYmIHBpZCAmJiAoc3RhdGUtPnVwZGF0ZV9waWQgIT0gcGlkKSkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmc3RhdGUtPnRva2VuX2xvY2spOworCisJCURFQlVHTE9HKHN0YXRlLCAidG9rZW5fbWlzbWF0Y2ggaWdub3JlIHVwZGF0ZSBmcm9tIHBpZCAlZCBjdXJyZW50IHVwZGF0ZSBwaWQgJWQiLAorCQkJIHBpZCwgc3RhdGUtPnVwZGF0ZV9waWQpOworCisJCXJldHVybiBkYWVtb25fcmVwbHlfc2ltcGxlKCJ0b2tlbl9taXNtYXRjaCIsCisJCQkJCSAgICJleHBlY3RlZCA9ICVzIiwgc3RhdGUtPnRva2VuLAorCQkJCQkgICAicmVjZWl2ZWQgPSAlcyIsIHRva2VuLAorCQkJCQkgICAidXBkYXRlX3BpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClzdGF0ZS0+dXBkYXRlX3BpZCwKKwkJCQkJICAgInJlYXNvbiA9ICVzIiwgImFub3RoZXIgY29tbWFuZCBoYXMgcG9wdWxhdGVkIHRoZSBsdm1ldGFkIGNhY2hlIik7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT50b2tlbl9sb2NrKTsKKworCisJaWYgKCFzdHJjbXAocnEsICJwdl9mb3VuZCIpIHx8CisJICAgICFzdHJjbXAocnEsICJwdl9nb25lIikgfHwKKwkgICAgIXN0cmNtcChycSwgInZnX3VwZGF0ZSIpIHx8CisJICAgICFzdHJjbXAocnEsICJ2Z19yZW1vdmUiKSB8fAorCSAgICAhc3RyY21wKHJxLCAic2V0X3ZnX2luZm8iKSB8fAorCSAgICAhc3RyY21wKHJxLCAicHZfY2xlYXJfYWxsIikgfHwKKwkgICAgIXN0cmNtcChycSwgInZnX2NsZWFyX291dGRhdGVkX3B2cyIpKSB7CisJCXB0aHJlYWRfcndsb2NrX3dybG9jaygmc3RhdGUtPmNhY2hlX2xvY2spOworCQljYWNoZV9sb2NrID0gMTsKKwkJZ290byBkb19ycTsKKwl9CisKKwlpZiAoIXN0cmNtcChycSwgInB2X2xvb2t1cCIpIHx8CisJICAgICFzdHJjbXAocnEsICJ2Z19sb29rdXAiKSB8fAorCSAgICAhc3RyY21wKHJxLCAicHZfbGlzdCIpIHx8CisJICAgICFzdHJjbXAocnEsICJ2Z19saXN0IikgfHwKKwkgICAgIXN0cmNtcChycSwgImR1bXAiKSkgeworCQlwdGhyZWFkX3J3bG9ja19yZGxvY2soJnN0YXRlLT5jYWNoZV9sb2NrKTsKKwkJY2FjaGVfbG9jayA9IDE7CisJCWdvdG8gZG9fcnE7CisJfQorCisJaWYgKCFzdHJjbXAocnEsICJzZXRfZ2xvYmFsX2luZm8iKSB8fAorCSAgICAhc3RyY21wKHJxLCAiZ2V0X2dsb2JhbF9pbmZvIikpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZzdGF0ZS0+aW5mb19sb2NrKTsKKwkJaW5mb19sb2NrID0gMTsKKwkJZ290byBkb19ycTsKKwl9CisKKyBkb19ycToKKworCWlmICghc3RyY21wKHJxLCAicHZfZm91bmQiKSkKKwkJcmVzID0gcHZfZm91bmQoc3RhdGUsIHIpOworCisJZWxzZSBpZiAoIXN0cmNtcChycSwgInB2X2dvbmUiKSkKKwkJcmVzID0gcHZfZ29uZShzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAicHZfY2xlYXJfYWxsIikpCisJCXJlcyA9IHB2X2NsZWFyX2FsbChzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAicHZfbG9va3VwIikpCisJCXJlcyA9IHB2X2xvb2t1cChzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAidmdfdXBkYXRlIikpCisJCXJlcyA9IHZnX3VwZGF0ZShzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAidmdfY2xlYXJfb3V0ZGF0ZWRfcHZzIikpCisJCXJlcyA9IHZnX2NsZWFyX291dGRhdGVkX3B2cyhzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAidmdfcmVtb3ZlIikpCisJCXJlcyA9IHZnX3JlbW92ZShzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAidmdfbG9va3VwIikpCisJCXJlcyA9IHZnX2xvb2t1cChzdGF0ZSwgcik7CisKKwllbHNlIGlmICghc3RyY21wKHJxLCAicHZfbGlzdCIpKQorCQlyZXMgPSBwdl9saXN0KHN0YXRlLCByKTsKKworCWVsc2UgaWYgKCFzdHJjbXAocnEsICJ2Z19saXN0IikpCisJCXJlcyA9IHZnX2xpc3Qoc3RhdGUsIHIpOworCisJZWxzZSBpZiAoIXN0cmNtcChycSwgInNldF9nbG9iYWxfaW5mbyIpKQorCQlyZXMgPSBzZXRfZ2xvYmFsX2luZm8oc3RhdGUsIHIpOworCisJZWxzZSBpZiAoIXN0cmNtcChycSwgImdldF9nbG9iYWxfaW5mbyIpKQorCQlyZXMgPSBnZXRfZ2xvYmFsX2luZm8oc3RhdGUsIHIpOworCisJZWxzZSBpZiAoIXN0cmNtcChycSwgInNldF92Z19pbmZvIikpCisJCXJlcyA9IHNldF92Z19pbmZvKHN0YXRlLCByKTsKKworCWVsc2UgaWYgKCFzdHJjbXAocnEsICJkdW1wIikpCisJCXJlcyA9IGR1bXAoc3RhdGUpOworCisJZWxzZQorCQlyZXMgPSByZXBseV9mYWlsKCJyZXF1ZXN0IG5vdCBpbXBsZW1lbnRlZCIpOworCisJaWYgKGNhY2hlX2xvY2spCisJCXB0aHJlYWRfcndsb2NrX3VubG9jaygmc3RhdGUtPmNhY2hlX2xvY2spOworCWlmIChpbmZvX2xvY2spCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aW5mb19sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgaW5pdChkYWVtb25fc3RhdGUgKnMpCit7CisJbHZtZXRhZF9zdGF0ZSAqbHMgPSBzLT5wcml2YXRlOworCWxzLT5sb2cgPSBzLT5sb2c7CisKKwlwdGhyZWFkX211dGV4X2luaXQoJmxzLT50b2tlbl9sb2NrLCBOVUxMKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmxzLT5pbmZvX2xvY2ssIE5VTEwpOworCXB0aHJlYWRfcndsb2NrX2luaXQoJmxzLT5jYWNoZV9sb2NrLCBOVUxMKTsKKwljcmVhdGVfbWV0YWRhdGFfaGFzaGVzKGxzKTsKKworCWxzLT50b2tlblswXSA9IDA7CisKKwkvKiBTZXQgdXAgc3RkZXJyIGxvZ2dpbmcgZGVwZW5kaW5nIG9uIHRoZSAtbCBvcHRpb24uICovCisJaWYgKCFkYWVtb25fbG9nX3BhcnNlKGxzLT5sb2csIERBRU1PTl9MT0dfT1VUTEVUX1NUREVSUiwgbHMtPmxvZ19jb25maWcsIDEpKQorCQlyZXR1cm4gMDsKKworCURFQlVHTE9HKHMsICJpbml0aWFsaXNlZCBzdGF0ZTogdmdpZF90b19tZXRhZGF0YSA9ICVwIiwgbHMtPnZnaWRfdG9fbWV0YWRhdGEpOworCWlmICghbHMtPnB2aWRfdG9fdmdpZCB8fCAhbHMtPnZnaWRfdG9fbWV0YWRhdGEpCisJCXJldHVybiAwOworCisJLyogaWYgKGxzLT5pbml0aWFsX3JlZ2lzdHJhdGlvbnMpCisJICAgX3Byb2Nlc3NfaW5pdGlhbF9yZWdpc3RyYXRpb25zKGRzLT5pbml0aWFsX3JlZ2lzdHJhdGlvbnMpOyAqLworCisJaWYgKGxzLT5pZGxlKQorCQlscy0+aWRsZS0+aXNfaWRsZSA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5pKGRhZW1vbl9zdGF0ZSAqcykKK3sKKwlsdm1ldGFkX3N0YXRlICpscyA9IHMtPnByaXZhdGU7CisKKwlERUJVR0xPRyhzLCAiZmluaSIpOworCWRlc3Ryb3lfbWV0YWRhdGFfaGFzaGVzKGxzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3RpbWVvdXRfYXJnKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgKm1heF90aW1lb3V0cykKK3sKKwljaGFyICplbmRwdHI7CisJdW5zaWduZWQgbG9uZyBsOworCisJZXJybm8gPSAwOworCWwgPSBzdHJ0b3VsKHN0ciwgJmVuZHB0ciwgMTApOworCWlmIChlcnJubyB8fCAqZW5kcHRyIHx8IGwgPj0gVUlOVF9NQVgpCisJCXJldHVybiAwOworCisJKm1heF90aW1lb3V0cyA9ICh1bnNpZ25lZCkgbDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpwcm9nLCBGSUxFICpmaWxlKQoreworCWZwcmludGYoZmlsZSwgIlVzYWdlOlxuIgorCQkiJXMgWy1WXSBbLWhdIFstZl0gWy1sIGxldmVsWyxsZXZlbCAuLi5dXSBbLXMgcGF0aF0gWy10IHNlY3NdXG5cbiIKKwkJIiAgIC1WICAgICAgIFNob3cgdmVyc2lvbiBvZiBsdm1ldGFkXG4iCisJCSIgICAtaCAgICAgICBTaG93IHRoaXMgaGVscCBpbmZvcm1hdGlvblxuIgorCQkiICAgLWYgICAgICAgRG9uJ3QgZm9yaywgcnVuIGluIHRoZSBmb3JlZ3JvdW5kXG4iCisJCSIgICAtbCAgICAgICBMb2dnaW5nIG1lc3NhZ2UgbGV2ZWxzIChhbGwsZmF0YWwsZXJyb3Isd2FybixpbmZvLHdpcmUsZGVidWcpXG4iCisJCSIgICAtcCAgICAgICBTZXQgcGF0aCB0byB0aGUgcGlkZmlsZVxuIgorCQkiICAgLXMgICAgICAgU2V0IHBhdGggdG8gdGhlIHNvY2tldCB0byBsaXN0ZW4gb25cbiIKKwkJIiAgIC10ICAgICAgIFRpbWUgdG8gd2FpdCBpbiBzZWNvbmRzIGJlZm9yZSBzaHV0ZG93biBvbiBpZGxlIChtaXNzaW5nIG9yIDAgPSBpbmlmaW5pdGUpXG5cbiIsIHByb2cpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXNpZ25lZCBjaGFyIG9wdDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCWRhZW1vbl9pZGxlIGRpID0geyAucHRpbWVvdXQgPSAmdGltZW91dCB9OworCWx2bWV0YWRfc3RhdGUgbHMgPSB7IC5sb2dfY29uZmlnID0gIiIgfTsKKwlkYWVtb25fc3RhdGUgcyA9IHsKKwkJLmRhZW1vbl9maW5pID0gZmluaSwKKwkJLmRhZW1vbl9pbml0ID0gaW5pdCwKKwkJLmhhbmRsZXIgPSBoYW5kbGVyLAorCQkubmFtZSA9ICJsdm1ldGFkIiwKKwkJLnBpZGZpbGUgPSBnZXRlbnYoIkxWTV9MVk1FVEFEX1BJREZJTEUiKSA/IDogTFZNRVRBRF9QSURGSUxFLAorCQkucHJpdmF0ZSA9ICZscywKKwkJLnByb3RvY29sID0gImx2bWV0YWQiLAorCQkucHJvdG9jb2xfdmVyc2lvbiA9IDEsCisJCS5zb2NrZXRfcGF0aCA9IGdldGVudigiTFZNX0xWTUVUQURfU09DS0VUIikgPyA6IExWTUVUQURfU09DS0VULAorCX07CisKKwkvLyB1c2UgZ2V0b3B0X2xvbmcKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiP2ZoVmw6cDpzOnQ6IikpICE9IEVPRikgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKGFyZ3ZbMF0sIHN0ZG91dCk7CisJCQlleGl0KDApOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0sIHN0ZGVycik7CisJCQlleGl0KDApOworCQljYXNlICdmJzoKKwkJCXMuZm9yZWdyb3VuZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlscy5sb2dfY29uZmlnID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcy5waWRmaWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOiAvLyAtLXNvY2tldAorCQkJcy5zb2NrZXRfcGF0aCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmICghcHJvY2Vzc190aW1lb3V0X2FyZyhvcHRhcmcsICZkaS5tYXhfdGltZW91dHMpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHZhbHVlIG9mIHRpbWVvdXQgcGFyYW1ldGVyLlxuIik7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJLyogMCBlcXVhbHMgdG8gd2FpdCBpbmRlZmluaXRlbHkgKi8KKwkJCWlmIChkaS5tYXhfdGltZW91dHMpCisJCQkJcy5pZGxlID0gbHMuaWRsZSA9ICZkaTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50ZigibHZtZXRhZCB2ZXJzaW9uOiAiIExWTV9WRVJTSU9OICJcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWRhZW1vbl9zdGFydChzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1ldGFkL3Rlc3Quc2ggYi9kYWVtb25zL2x2bWV0YWQvdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTM3NTYyCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1ldGFkL3Rlc3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL2Jhc2gKKworZXhwb3J0IExEX0xJQlJBUllfUEFUSD0iJDEiCisKK3Rlc3QgLW4gIiQyIiAmJiB7CisgICAgcm0gLWYgL3Zhci9ydW4vbHZtZXRhZC57c29ja2V0LHBpZH0KKyAgICBjaG1vZCArcnggbHZtZXRhZAorICAgIHZhbGdyaW5kIC4vbHZtZXRhZCAtZiAmCisgICAgUElEPSQhCisgICAgc2xlZXAgMQorICAgIC4vdGVzdGNsaWVudAorICAgIGtpbGwgJFBJRAorICAgIGV4aXQgMAorfQorCitzdWRvIC4vdGVzdC5zaCAiJDEiIC4KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtZXRhZC90ZXN0Y2xpZW50LmMgYi9kYWVtb25zL2x2bWV0YWQvdGVzdGNsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWZiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWV0YWQvdGVzdGNsaWVudC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImx2bWV0YWQtY2xpZW50LmgiCisjaW5jbHVkZSAibGFiZWwuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKK2NvbnN0IGNoYXIgKnV1aWQxID0gImFiY2QtZWZnaCI7Citjb25zdCBjaGFyICp1dWlkMiA9ICJiYmNkLWVmZ2giOworY29uc3QgY2hhciAqdmdpZCA9ICJ5YWRhLXlhZGEiOworY29uc3QgY2hhciAqdXVpZDMgPSAiY2JjZC1lZmdoIjsKKworY29uc3QgY2hhciAqbWV0YWRhdGEyID0gIntcbiIKKwkiaWQgPSBcInlhZGEteWFkYVwiXG4iCisJInNlcW5vID0gMTVcbiIKKwkic3RhdHVzID0gW1wiUkVBRFwiLCBcIldSSVRFXCJdXG4iCisJImZsYWdzID0gW11cbiIKKwkiZXh0ZW50X3NpemUgPSA4MTkyXG4iCisJInBoeXNpY2FsX3ZvbHVtZXMge1xuIgorCSIgICAgcHYwIHtcbiIKKwkiICAgICAgICBpZCA9IFwiYWJjZC1lZmdoXCJcbiIKKwkiICAgIH1cbiIKKwkiICAgIHB2MSB7XG4iCisJIiAgICAgICAgaWQgPSBcImJiY2QtZWZnaFwiXG4iCisJIiAgICB9XG4iCisJIiAgICBwdjIge1xuIgorCSIgICAgICAgIGlkID0gXCJjYmNkLWVmZ2hcIlxuIgorCSIgICAgfVxuIgorCSJ9XG4iCisJIn1cbiI7CisKK3ZvaWQgX2hhbmRsZV9yZXBseShkYWVtb25fcmVwbHkgcmVwbHkpIHsKKwljb25zdCBjaGFyICpyZXBsID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgTlVMTCk7CisJY29uc3QgY2hhciAqc3RhdHVzID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInN0YXR1cyIsIE5VTEwpOworCWNvbnN0IGNoYXIgKnZnaWQgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAidmdpZCIsIE5VTEwpOworCisJZnByaW50ZihzdGRlcnIsICJbQ10gUkVQTFk6ICVzXG4iLCByZXBsKTsKKwlpZiAoIXN0cmNtcChyZXBsLCAiZmFpbGVkIikpCisJCWZwcmludGYoc3RkZXJyLCAiW0NdIFJFQVNPTjogJXNcbiIsIGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZWFzb24iLCAidW5rbm93biIpKTsKKwlpZiAodmdpZCkKKwkJZnByaW50ZihzdGRlcnIsICJbQ10gVkdJRDogJXNcbiIsIHZnaWQpOworCWlmIChzdGF0dXMpCisJCWZwcmludGYoc3RkZXJyLCAiW0NdIFNUQVRVUzogJXNcbiIsIHN0YXR1cyk7CisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworfQorCit2b2lkIF9wdl9hZGQoZGFlbW9uX2hhbmRsZSBoLCBjb25zdCBjaGFyICp1dWlkLCBjb25zdCBjaGFyICptZXRhZGF0YSkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoaCwgInB2X2FkZCIsICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJCQkJICAgICAgICAgICAgICJtZXRhZGF0YSA9ICViIiwgbWV0YWRhdGEsCisJCQkJCQkgICAgICAgICAgICAgTlVMTCk7CisJX2hhbmRsZV9yZXBseShyZXBseSk7Cit9CisKK2ludCBzY2FuKGRhZW1vbl9oYW5kbGUgaCwgY2hhciAqZm4pIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfY2FjaGVfZ2V0KGZuLCBOVUxMKTsKKworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJaWYgKCFsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCAwKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIltDXSBubyBsYWJlbCBmb3VuZCBvbiAlc1xuIiwgZm4pOworCQlyZXR1cm47CisJfQorCisJY2hhciB1dWlkWzY0XTsKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdChkZXYtPnB2aWQsIHV1aWQsIDY0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIltDXSBGYWlsZWQgdG8gZm9ybWF0IFBWIFVVSUQgZm9yICVzIiwgZGV2X25hbWUoZGV2KSk7CisJCXJldHVybjsKKwl9CisJZnByaW50ZihzdGRlcnIsICJbQ10gZm91bmQgUFY6ICVzXG4iLCB1dWlkKTsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqKSBsYWJlbC0+aW5mbzsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lIHB2ID0geyAwLCB9OworCisJaWYgKCEoaW5mby0+Zm10LT5vcHMtPnB2X3JlYWQoaW5mby0+Zm10LCBkZXZfbmFtZShkZXYpLCAmcHYsIDApKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIltDXSBGYWlsZWQgdG8gcmVhZCBQViAlcyIsIGRldl9uYW1lKGRldikpOworCQlyZXR1cm47CisJfQorCisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggZmljOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCA9IGluZm8tPmZtdC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoaW5mby0+Zm10LCAmZmljKTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gTlVMTDsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmaW5mby0+bWRhcykgeworCQlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp0aGlzID0gbWRhLT5vcHMtPnZnX3JlYWQoZmlkLCAiIiwgbWRhKTsKKwkJaWYgKHRoaXMgJiYgIXZnIHx8IHRoaXMtPnNlcW5vID4gdmctPnNlcW5vKQorCQkJdmcgPSB0aGlzOworCX0KKwlpZiAodmcpIHsKKwkJY2hhciAqYnVmID0gTlVMTDsKKwkJLyogVE9ETy4gVGhpcyBpcyBub3QgZW50aXJlbHkgY29ycmVjdCwgc2luY2UgZXhwb3J0X3ZnX3RvX2J1ZmZlcgorCQkgKiBhZGRzIHRyYWlsaW5nIGdhcmJhZ2UgdG8gdGhlIGJ1ZmZlci4gV2UgbWF5IG5lZWQgdG8gdXNlCisJCSAqIGV4cG9ydF92Z190b19jb25maWdfdHJlZSBhbmQgZm9ybWF0IHRoZSBidWZmZXIgb3Vyc2VsdmVzLiBJdAorCQkgKiBkb2VzLCBob3dldmVyLCB3b3JrIGZvciBub3csIHNpbmNlIHRoZSBnYXJiYWdlIGlzIHdlbGwKKwkJICogZm9ybWF0dGVkIGFuZCBoYXMgbm8gY29uZmxpY3Rpbmcga2V5cyB3aXRoIHRoZSByZXN0IG9mIHRoZQorCQkgKiByZXF1ZXN0LiAgKi8KKwkJZXhwb3J0X3ZnX3RvX2J1ZmZlcih2ZywgJmJ1Zik7CisJCWRhZW1vbl9yZXBseSByZXBseSA9CisJCQlkYWVtb25fc2VuZF9zaW1wbGUoaCwgInB2X2FkZCIsICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJCQkgICAgICAibWV0YWRhdGEgPSAlYiIsIHN0cmNocihidWYsICd7JyksCisJCQkJCSAgICAgIE5VTEwpOworCQlfaGFuZGxlX3JlcGx5KHJlcGx5KTsKKwl9Cit9CisKK3ZvaWQgX2R1bXBfdmcoZGFlbW9uX2hhbmRsZSBoLCBjb25zdCBjaGFyICp1dWlkKQoreworCWRhZW1vbl9yZXBseSByZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShoLCAidmdfYnlfdXVpZCIsICJ1dWlkID0gJXMiLCB1dWlkLCBOVUxMKTsKKwlmcHJpbnRmKHN0ZGVyciwgIltDXSByZXBseSBidWZmZXI6ICVzXG4iLCByZXBseS5idWZmZXIpOworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisJZGFlbW9uX2hhbmRsZSBoID0gbHZtZXRhZF9vcGVuKCk7CisJLyogRklYTUUgTWlzc2luZyBlcnJvciBwYXRoICovCisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJaW50IGk7CisJCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gY3JlYXRlX3Rvb2xjb250ZXh0KDAsIE5VTEwsIDAsIDAsIDEsIDEpOworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisJCQljb25zdCBjaGFyICp1dWlkID0gTlVMTDsKKwkJCXNjYW4oaCwgYXJndltpXSk7CisJCX0KKwkJZGVzdHJveV90b29sY29udGV4dChjbWQpOworCQkvKiBGSVhNRSBNaXNzaW5nIGx2bWV0YWRfY2xvc2UoKSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlfcHZfYWRkKGgsIHV1aWQxLCBOVUxMKTsKKwlfcHZfYWRkKGgsIHV1aWQyLCBtZXRhZGF0YTIpOworCV9kdW1wX3ZnKGgsIHZnaWQpOworCV9wdl9hZGQoaCwgdXVpZDMsIE5VTEwpOworCisJZGFlbW9uX2Nsb3NlKGgpOwkvKiBGSVhNRSBsdm1ldGFkX2Nsb3NlPyAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1sb2NrZC8uZ2l0aWdub3JlIGIvZGFlbW9ucy9sdm1sb2NrZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTYxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWxvY2tkLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitsdm1sb2NrY3RsCitsdm1sb2NrZApkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1sb2NrZC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvbHZtbG9ja2QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5ZDc4NwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtbG9ja2QvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw2NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IGx2bWxvY2tkLWNvcmUuYworCitpZmVxICgiQEJVSUxEX0xPQ0tEU0FOTE9DS0AiLCAieWVzIikKKyAgU09VUkNFUyArPSBsdm1sb2NrZC1zYW5sb2NrLmMKK2VuZGlmCisKK2lmZXEgKCJAQlVJTERfTE9DS0RETE1AIiwgInllcyIpCisgIFNPVVJDRVMgKz0gbHZtbG9ja2QtZGxtLmMKK2VuZGlmCisKK1RBUkdFVFMgPSBsdm1sb2NrZCBsdm1sb2NrY3RsCisKKy5QSE9OWTogaW5zdGFsbF9sdm1sb2NrZAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworSU5DTFVERVMgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYmRhZW1vbi9zZXJ2ZXIKK0xWTUxJQlMgPSAtbGRhZW1vbnNlcnZlciAkKExWTUlOVEVSTkFMX0xJQlMpIC1sZGV2bWFwcGVyCisKK0xJQlMgKz0gJChQVEhSRUFEX0xJQlMpCisKK2lmZXEgKCJAQlVJTERfTE9DS0RTQU5MT0NLQCIsICJ5ZXMiKQorICBMSUJTICs9IC1sc2FubG9ja19jbGllbnQKK2VuZGlmCisKK2lmZXEgKCJAQlVJTERfTE9DS0RETE1AIiwgInllcyIpCisgIExJQlMgKz0gLWxkbG1fbHQKK2VuZGlmCisKK0xERkxBR1MgKz0gLUwkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlcgorQ0xERkxBR1MgKz0gLUwkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlcgorCitsdm1sb2NrZDogJChPQkpFQ1RTKSAkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL2NsaWVudC9saWJkYWVtb25jbGllbnQuYSBcCisJCSAgICAkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlci9saWJkYWVtb25zZXJ2ZXIuYQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAICQoT0JKRUNUUykgJChMVk1MSUJTKSAkKExJQlMpCisKK2x2bWxvY2tjdGw6IGx2bWxvY2tjdGwubyAkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL2NsaWVudC9saWJkYWVtb25jbGllbnQuYSBcCisJCSAgICAkKHRvcF9idWlsZGRpcikvbGliZGFlbW9uL3NlcnZlci9saWJkYWVtb25zZXJ2ZXIuYQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIGx2bWxvY2tjdGwubyAkKExWTUxJQlMpCisKK2luc3RhbGxfbHZtbG9ja2Q6IGx2bWxvY2tkCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQoc2JpbmRpcikvJCg8RikKKworaW5zdGFsbF9sdm1sb2NrY3RsOiBsdm1sb2NrY3RsCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQoc2JpbmRpcikvJCg8RikKKworaW5zdGFsbF9sdm0yOiBpbnN0YWxsX2x2bWxvY2tkIGluc3RhbGxfbHZtbG9ja2N0bAorCitpbnN0YWxsOiBpbnN0YWxsX2x2bTIKZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2N0bC5jIGIvZGFlbW9ucy9sdm1sb2NrZC9sdm1sb2NrY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0ZTA3MgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2N0bC5jCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworCisjaW5jbHVkZSAidG9vbC5oIgorCisjaW5jbHVkZSAibHZtbG9ja2QtY2xpZW50LmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCitzdGF0aWMgaW50IHF1aXQgPSAwOworc3RhdGljIGludCBpbmZvID0gMDsKK3N0YXRpYyBpbnQgZHVtcCA9IDA7CitzdGF0aWMgaW50IHdhaXRfb3B0ID0gMDsKK3N0YXRpYyBpbnQgZm9yY2Vfb3B0ID0gMDsKK3N0YXRpYyBpbnQga2lsbF92ZyA9IDA7CitzdGF0aWMgaW50IGRyb3BfdmcgPSAwOworc3RhdGljIGludCBnbF9lbmFibGUgPSAwOworc3RhdGljIGludCBnbF9kaXNhYmxlID0gMDsKK3N0YXRpYyBpbnQgc3RvcF9sb2Nrc3BhY2VzID0gMDsKK3N0YXRpYyBjaGFyICphcmdfdmdfbmFtZSA9IE5VTEw7CisKKyNkZWZpbmUgRFVNUF9TT0NLRVRfTkFNRSAibHZtbG9ja2QtZHVtcC5zb2NrIgorI2RlZmluZSBEVU1QX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKK3N0YXRpYyBjaGFyIGR1bXBfYnVmW0RVTVBfQlVGX1NJWkUrMV07CitzdGF0aWMgaW50IGR1bXBfbGVuOworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl91biBkdW1wX2FkZHI7CitzdGF0aWMgc29ja2xlbl90IGR1bXBfYWRkcmxlbjsKKworZGFlbW9uX2hhbmRsZSBfbHZtbG9ja2Q7CisKKyNkZWZpbmUgbG9nX2Vycm9yKGZtdCwgYXJncy4uLikgXAorZG8geyBcCisJcHJpbnRmKGZtdCAiXG4iLCAjI2FyZ3MpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BWF9MSU5FIDUxMgorCisvKiBjb3BpZWQgZnJvbSBsdm1sb2NrZC1pbnRlcm5hbC5oICovCisjZGVmaW5lIE1BWF9OQU1FIDY0CisjZGVmaW5lIE1BWF9BUkdTIDY0CisKKy8qCisgKiBsdm1sb2NrZCBkdW1wcyB0aGUgY2xpZW50IGluZm8gYmVmb3JlIHRoZSBsb2Nrc3BhY2VzLAorICogc28gd2UgY2FuIGxvb2sgdXAgY2xpZW50IGluZm8gd2hlbiBwcmludGluZyBsb2Nrc3BhY2UgaW5mby4KKyAqLworCisjZGVmaW5lIE1BWF9DTElFTlRTIDEwMAorCitzdHJ1Y3QgY2xpZW50X2luZm8geworCXVpbnQzMl90IGNsaWVudF9pZDsKKwlpbnQgcGlkOworCWNoYXIgbmFtZVtNQVhfTkFNRSsxXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xpZW50X2luZm8gY2xpZW50c1tNQVhfQ0xJRU5UU107CitzdGF0aWMgaW50IG51bV9jbGllbnRzOworCitzdGF0aWMgdm9pZCBzYXZlX2NsaWVudF9pbmZvKGNoYXIgKmxpbmUpCit7CisJdWludDMyX3QgcGlkID0gMDsKKwlpbnQgZmQgPSAwOworCWludCBwaSA9IDA7CisJdWludDMyX3QgY2xpZW50X2lkID0gMDsKKwljaGFyIG5hbWVbTUFYX05BTUUrMV0gPSB7IDAgfTsKKworCSh2b2lkKSBzc2NhbmYobGluZSwgImluZm89Y2xpZW50IHBpZD0ldSBmZD0lZCBwaT0lZCBpZD0ldSBuYW1lPSVzIiwKKwkgICAgICAgJnBpZCwgJmZkLCAmcGksICZjbGllbnRfaWQsIG5hbWUpOworCisJY2xpZW50c1tudW1fY2xpZW50c10uY2xpZW50X2lkID0gY2xpZW50X2lkOworCWNsaWVudHNbbnVtX2NsaWVudHNdLnBpZCA9IHBpZDsKKwlzdHJjcHkoY2xpZW50c1tudW1fY2xpZW50c10ubmFtZSwgbmFtZSk7CisJbnVtX2NsaWVudHMrKzsKK30KKworc3RhdGljIHZvaWQgZmluZF9jbGllbnRfaW5mbyh1aW50MzJfdCBjbGllbnRfaWQsIHVpbnQzMl90ICpwaWQsIGNoYXIgKmNsX25hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsaWVudHM7IGkrKykgeworCQlpZiAoY2xpZW50c1tpXS5jbGllbnRfaWQgPT0gY2xpZW50X2lkKSB7CisJCQkqcGlkID0gY2xpZW50c1tpXS5waWQ7CisJCQlzdHJjcHkoY2xfbmFtZSwgY2xpZW50c1tpXS5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBmaXJzdF9scyA9IDE7CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9pbmZvX2xzKGNoYXIgKmxpbmUpCit7CisJY2hhciBsc19uYW1lW01BWF9OQU1FKzFdID0geyAwIH07CisJY2hhciB2Z19uYW1lW01BWF9OQU1FKzFdID0geyAwIH07CisJY2hhciB2Z191dWlkW01BWF9OQU1FKzFdID0geyAwIH07CisJY2hhciB2Z19zeXNpZFtNQVhfTkFNRSsxXSA9IHsgMCB9OworCWNoYXIgbG9ja19hcmdzW01BWF9BUkdTKzFdID0geyAwIH07CisJY2hhciBsb2NrX3R5cGVbTUFYX05BTUUrMV0gPSB7IDAgfTsKKworCSh2b2lkKSBzc2NhbmYobGluZSwgImluZm89bHMgbHNfbmFtZT0lcyB2Z19uYW1lPSVzIHZnX3V1aWQ9JXMgdmdfc3lzaWQ9JXMgdmdfYXJncz0lcyBsbV90eXBlPSVzIiwKKwkgICAgICAgbHNfbmFtZSwgdmdfbmFtZSwgdmdfdXVpZCwgdmdfc3lzaWQsIGxvY2tfYXJncywgbG9ja190eXBlKTsKKworCWlmICghZmlyc3RfbHMpCisJCXByaW50ZigiXG4iKTsKKwlmaXJzdF9scyA9IDA7CisKKwlwcmludGYoIlZHICVzIGxvY2tfdHlwZT0lcyAlc1xuIiwgdmdfbmFtZSwgbG9ja190eXBlLCB2Z191dWlkKTsKKworCXByaW50ZigiTFMgJXMgJXNcbiIsIGxvY2tfdHlwZSwgbHNfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9pbmZvX2xzX2FjdGlvbihjaGFyICpsaW5lKQoreworCXVpbnQzMl90IGNsaWVudF9pZCA9IDA7CisJY2hhciBmbGFnc1tNQVhfTkFNRSsxXSA9IHsgMCB9OworCWNoYXIgdmVyc2lvbltNQVhfTkFNRSsxXSA9IHsgMCB9OworCWNoYXIgb3BbTUFYX05BTUUrMV0gPSB7IDAgfTsKKwl1aW50MzJfdCBwaWQgPSAwOworCWNoYXIgY2xfbmFtZVtNQVhfTkFNRSsxXSA9IHsgMCB9OworCisJKHZvaWQpIHNzY2FuZihsaW5lLCAiaW5mbz1sc19hY3Rpb24gY2xpZW50X2lkPSV1ICVzICVzIG9wPSVzIiwKKwkgICAgICAgJmNsaWVudF9pZCwgZmxhZ3MsIHZlcnNpb24sIG9wKTsKKworCWZpbmRfY2xpZW50X2luZm8oY2xpZW50X2lkLCAmcGlkLCBjbF9uYW1lKTsKKworCXByaW50ZigiT1AgJXMgcGlkICV1ICglcylcbiIsIG9wLCBwaWQsIGNsX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaW5mb19yKGNoYXIgKmxpbmUsIGNoYXIgKnJfbmFtZV9vdXQsIGNoYXIgKnJfdHlwZV9vdXQpCit7CisJY2hhciByX25hbWVbTUFYX05BTUUrMV0gPSB7IDAgfTsKKwljaGFyIHJfdHlwZVs0XSA9IHsgMCB9OworCWNoYXIgbW9kZVs0XSA9IHsgMCB9OworCWNoYXIgc2hfY291bnRbTUFYX05BTUUrMV0gPSB7IDAgfTsKKwl1aW50MzJfdCB2ZXIgPSAwOworCisJKHZvaWQpIHNzY2FuZihsaW5lLCAiaW5mbz1yIG5hbWU9JXMgdHlwZT0lcyBtb2RlPSVzICVzIHZlcnNpb249JXUiLAorCSAgICAgICByX25hbWUsIHJfdHlwZSwgbW9kZSwgc2hfY291bnQsICZ2ZXIpOworCisJc3RyY3B5KHJfbmFtZV9vdXQsIHJfbmFtZSk7CisJc3RyY3B5KHJfdHlwZV9vdXQsIHJfdHlwZSk7CisKKwkvKiB3aGVuIG1vZGUgaXMgbm90IHVuLCB3YWl0IGFuZCBwcmludCBlYWNoIGxrIGxpbmUgKi8KKwlpZiAoc3RyY21wKG1vZGUsICJ1biIpKQorCQlyZXR1cm47CisKKwkvKiB3aGVuIG1vZGUgaXMgdW4sIHRoZXJlIHdpbGwgYmUgbm8gbGsgbGluZXMsIHNvIHByaW50IG5vdyAqLworCisJaWYgKCFzdHJjbXAocl90eXBlLCAiZ2wiKSkgeworCQlwcmludGYoIkxLIEdMIHVuIHZlciAldVxuIiwgdmVyKTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChyX3R5cGUsICJ2ZyIpKSB7CisJCXByaW50ZigiTEsgVkcgdW4gdmVyICV1XG4iLCB2ZXIpOworCisJfSBlbHNlIGlmICghc3RyY21wKHJfdHlwZSwgImx2IikpIHsKKwkJcHJpbnRmKCJMSyBMViB1biAlc1xuIiwgcl9uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9pbmZvX2xrKGNoYXIgKmxpbmUsIGNoYXIgKnJfbmFtZSwgY2hhciAqcl90eXBlKQoreworCWNoYXIgbW9kZVs0XSA9IHsgMCB9OworCXVpbnQzMl90IHZlciA9IDA7CisJY2hhciBmbGFnc1tNQVhfTkFNRSsxXSA9IHsgMCB9OworCXVpbnQzMl90IGNsaWVudF9pZCA9IDA7CisJdWludDMyX3QgcGlkID0gMDsKKwljaGFyIGNsX25hbWVbTUFYX05BTUUrMV0gPSB7IDAgfTsKKworCWlmICghcl9uYW1lWzBdIHx8ICFyX3R5cGVbMF0pIHsKKwkJcHJpbnRmKCJmb3JtYXRfaW5mb19sayBlcnJvciByX25hbWUgJXMgcl90eXBlICVzXG4iLCByX25hbWUsIHJfdHlwZSk7CisJCXByaW50ZigiJXNcbiIsIGxpbmUpOworCQlyZXR1cm47CisJfQorCisJKHZvaWQpIHNzY2FuZihsaW5lLCAiaW5mbz1sayBtb2RlPSVzIHZlcnNpb249JXUgJXMgY2xpZW50X2lkPSV1IiwKKwkgICAgICAgbW9kZSwgJnZlciwgZmxhZ3MsICZjbGllbnRfaWQpOworCisJZmluZF9jbGllbnRfaW5mbyhjbGllbnRfaWQsICZwaWQsIGNsX25hbWUpOworCisJaWYgKCFzdHJjbXAocl90eXBlLCAiZ2wiKSkgeworCQlwcmludGYoIkxLIEdMICVzIHZlciAldSBwaWQgJXUgKCVzKVxuIiwgbW9kZSwgdmVyLCBwaWQsIGNsX25hbWUpOworCisJfSBlbHNlIGlmICghc3RyY21wKHJfdHlwZSwgInZnIikpIHsKKwkJcHJpbnRmKCJMSyBWRyAlcyB2ZXIgJXUgcGlkICV1ICglcylcbiIsIG1vZGUsIHZlciwgcGlkLCBjbF9uYW1lKTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChyX3R5cGUsICJsdiIpKSB7CisJCXByaW50ZigiTEsgTFYgJXMgJXNcbiIsIG1vZGUsIHJfbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaW5mb19yX2FjdGlvbihjaGFyICpsaW5lLCBjaGFyICpyX25hbWUsIGNoYXIgKnJfdHlwZSkKK3sKKwl1aW50MzJfdCBjbGllbnRfaWQgPSAwOworCWNoYXIgZmxhZ3NbTUFYX05BTUUrMV0gPSB7IDAgfTsKKwljaGFyIHZlcnNpb25bTUFYX05BTUUrMV0gPSB7IDAgfTsKKwljaGFyIG9wW01BWF9OQU1FKzFdID0geyAwIH07CisJY2hhciBydFs0XSA9IHsgMCB9OworCWNoYXIgbW9kZVs0XSA9IHsgMCB9OworCWNoYXIgbG1bTUFYX05BTUUrMV0gPSB7IDAgfTsKKwljaGFyIHJlc3VsdFtNQVhfTkFNRSsxXSA9IHsgMCB9OworCWNoYXIgbG1fcnZbTUFYX05BTUUrMV0gPSB7IDAgfTsKKwl1aW50MzJfdCBwaWQgPSAwOworCWNoYXIgY2xfbmFtZVtNQVhfTkFNRSsxXSA9IHsgMCB9OworCisJaWYgKCFyX25hbWVbMF0gfHwgIXJfdHlwZVswXSkgeworCQlwcmludGYoImZvcm1hdF9pbmZvX3JfYWN0aW9uIGVycm9yIHJfbmFtZSAlcyByX3R5cGUgJXNcbiIsIHJfbmFtZSwgcl90eXBlKTsKKwkJcHJpbnRmKCIlc1xuIiwgbGluZSk7CisJCXJldHVybjsKKwl9CisKKwkodm9pZCkgc3NjYW5mKGxpbmUsICJpbmZvPXJfYWN0aW9uIGNsaWVudF9pZD0ldSAlcyAlcyBvcD0lcyBydD0lcyBtb2RlPSVzICVzICVzICVzIiwKKwkgICAgICAgJmNsaWVudF9pZCwgZmxhZ3MsIHZlcnNpb24sIG9wLCBydCwgbW9kZSwgbG0sIHJlc3VsdCwgbG1fcnYpOworCisJZmluZF9jbGllbnRfaW5mbyhjbGllbnRfaWQsICZwaWQsIGNsX25hbWUpOworCisJaWYgKHN0cmNtcChvcCwgImxvY2siKSkgeworCQlwcmludGYoIk9QICVzIHBpZCAldSAoJXMpXG4iLCBvcCwgcGlkLCBjbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghc3RyY21wKHJfdHlwZSwgImdsIikpIHsKKwkJcHJpbnRmKCJMVyBHTCAlcyB2ZXIgJXUgcGlkICV1ICglcylcbiIsIG1vZGUsIDAsIHBpZCwgY2xfbmFtZSk7CisKKwl9IGVsc2UgaWYgKCFzdHJjbXAocl90eXBlLCAidmciKSkgeworCQlwcmludGYoIkxXIFZHICVzIHZlciAldSBwaWQgJXUgKCVzKVxuIiwgbW9kZSwgMCwgcGlkLCBjbF9uYW1lKTsKKworCX0gZWxzZSBpZiAoIXN0cmNtcChyX3R5cGUsICJsdiIpKSB7CisJCXByaW50ZigiTFcgTFYgJXMgJXNcbiIsIG1vZGUsIHJfbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaW5mb19saW5lKGNoYXIgKmxpbmUsIGNoYXIgKnJfbmFtZSwgY2hhciAqcl90eXBlKQoreworCWlmICghc3RybmNtcChsaW5lLCAiaW5mbz1zdHJ1Y3RzICIsIHN0cmxlbigiaW5mbz1zdHJ1Y3RzICIpKSkgeworCQkvKiBvbmx5IHByaW50IHRoaXMgaW4gdGhlIHJhdyBpbmZvIGR1bXAgKi8KKworCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgImluZm89Y2xpZW50ICIsIHN0cmxlbigiaW5mbz1jbGllbnQgIikpKSB7CisJCXNhdmVfY2xpZW50X2luZm8obGluZSk7CisKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJpbmZvPWxzICIsIHN0cmxlbigiaW5mbz1scyAiKSkpIHsKKwkJZm9ybWF0X2luZm9fbHMobGluZSk7CisKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJpbmZvPWxzX2FjdGlvbiAiLCBzdHJsZW4oImluZm89bHNfYWN0aW9uICIpKSkgeworCQlmb3JtYXRfaW5mb19sc19hY3Rpb24obGluZSk7CisKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJpbmZvPXIgIiwgc3RybGVuKCJpbmZvPXIgIikpKSB7CisJCS8qCisJCSAqIHJfbmFtZS9yX3R5cGUgYXJlIHJlc2V0IHdoZW4gYSBuZXcgcmVzb3VyY2UgaXMgZm91bmQuCisJCSAqIFRoZXkgYXJlIHJldXNlZCBmb3IgdGhlIGxvY2sgYW5kIGFjdGlvbiBsaW5lcyB0aGF0CisJCSAqIGZvbGxvdyBhIHJlc291cmNlIGxpbmUuCisJCSAqLworCQltZW1zZXQocl9uYW1lLCAwLCBNQVhfTkFNRSsxKTsKKwkJbWVtc2V0KHJfdHlwZSwgMCwgTUFYX05BTUUrMSk7CisJCWZvcm1hdF9pbmZvX3IobGluZSwgcl9uYW1lLCByX3R5cGUpOworCisJfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiaW5mbz1sayAiLCBzdHJsZW4oImluZm89bGsgIikpKSB7CisJCS8qIHdpbGwgdXNlIGluZm8gZnJvbSBwcmV2aW91cyByICovCisJCWZvcm1hdF9pbmZvX2xrKGxpbmUsIHJfbmFtZSwgcl90eXBlKTsKKworCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgImluZm89cl9hY3Rpb24gIiwgc3RybGVuKCJpbmZvPXJfYWN0aW9uICIpKSkgeworCQkvKiB3aWxsIHVzZSBpbmZvIGZyb20gcHJldmlvdXMgciAqLworCQlmb3JtYXRfaW5mb19yX2FjdGlvbihsaW5lLCByX25hbWUsIHJfdHlwZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJVTiAlc1xuIiwgbGluZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaW5mbyh2b2lkKQoreworCWNoYXIgbGluZVtNQVhfTElORV07CisJY2hhciByX25hbWVbTUFYX05BTUUrMV07CisJY2hhciByX3R5cGVbTUFYX05BTUUrMV07CisJaW50IGksIGo7CisKKwlqID0gMDsKKwltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKKworCWZvciAoaSA9IDA7IGkgPCBkdW1wX2xlbjsgaSsrKSB7CisJCWxpbmVbaisrXSA9IGR1bXBfYnVmW2ldOworCisJCWlmICgobGluZVtqLTFdID09ICdcbicpIHx8IChsaW5lW2otMV0gPT0gJ1wwJykpIHsKKwkJCWZvcm1hdF9pbmZvX2xpbmUobGluZSwgcl9uYW1lLCByX3R5cGUpOworCQkJaiA9IDA7CisJCQltZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgZGFlbW9uX3JlcGx5IF9sdm1sb2NrZF9zZW5kKGNvbnN0IGNoYXIgKnJlcV9uYW1lLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlkYWVtb25fcmVwbHkgcmVwbDsKKwlkYWVtb25fcmVxdWVzdCByZXE7CisKKwlyZXEgPSBkYWVtb25fcmVxdWVzdF9tYWtlKHJlcV9uYW1lKTsKKworCXZhX3N0YXJ0KGFwLCByZXFfbmFtZSk7CisJZGFlbW9uX3JlcXVlc3RfZXh0ZW5kX3YocmVxLCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJlcGwgPSBkYWVtb25fc2VuZChfbHZtbG9ja2QsIHJlcSk7CisKKwlkYWVtb25fcmVxdWVzdF9kZXN0cm95KHJlcSk7CisKKwlyZXR1cm4gcmVwbDsKK30KKworLyogU2VlIHRoZSBzYW1lIGluIGxpYi9sb2NraW5nL2x2bWxvY2tkLmMgKi8KKyNkZWZpbmUgTk9fTE9DS0RfUkVTVUxUIC0xMDAwCisKK3N0YXRpYyBpbnQgX2x2bWxvY2tkX3Jlc3VsdChkYWVtb25fcmVwbHkgcmVwbHksIGludCAqcmVzdWx0KQoreworCWludCByZXBseV9yZXN1bHQ7CisKKwlpZiAocmVwbHkuZXJyb3IpIHsKKwkJbG9nX2Vycm9yKCJsdm1sb2NrZF9yZXN1bHQgcmVwbHkgZXJyb3IgJWQiLCByZXBseS5lcnJvcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkgeworCQlsb2dfZXJyb3IoImx2bWxvY2tkX3Jlc3VsdCBiYWQgcmVzcG9uc2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVwbHlfcmVzdWx0ID0gZGFlbW9uX3JlcGx5X2ludChyZXBseSwgIm9wX3Jlc3VsdCIsIE5PX0xPQ0tEX1JFU1VMVCk7CisJaWYgKHJlcGx5X3Jlc3VsdCA9PSAtMTAwMCkgeworCQlsb2dfZXJyb3IoImx2bWxvY2tkX3Jlc3VsdCBubyBvcF9yZXN1bHQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnJlc3VsdCA9IHJlcGx5X3Jlc3VsdDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRvX3F1aXQodm9pZCkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJ2ID0gMDsKKworCXJlcGx5ID0gZGFlbW9uX3NlbmRfc2ltcGxlKF9sdm1sb2NrZCwgInF1aXQiLCBOVUxMKTsKKworCWlmIChyZXBseS5lcnJvcikgeworCQlsb2dfZXJyb3IoInJlcGx5IGVycm9yICVkIiwgcmVwbHkuZXJyb3IpOworCQlydiA9IHJlcGx5LmVycm9yOworCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfZHVtcF9zb2NrZXQodm9pZCkKK3sKKwlpbnQgcywgcnY7CisKKwlzID0gc29ja2V0KEFGX0xPQ0FMLCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAocyA8IDApCisJCXJldHVybiBzOworCisJbWVtc2V0KCZkdW1wX2FkZHIsIDAsIHNpemVvZihkdW1wX2FkZHIpKTsKKwlkdW1wX2FkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworCXN0cmNweSgmZHVtcF9hZGRyLnN1bl9wYXRoWzFdLCBEVU1QX1NPQ0tFVF9OQU1FKTsKKwlkdW1wX2FkZHJsZW4gPSBzaXplb2Yoc2FfZmFtaWx5X3QpICsgc3RybGVuKGR1bXBfYWRkci5zdW5fcGF0aCsxKSArIDE7CisKKwlydiA9IGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciAqKSAmZHVtcF9hZGRyLCBkdW1wX2FkZHJsZW4pOworCWlmIChydiA8IDApIHsKKwkJcnYgPSAtZXJybm87CisJCWlmICghY2xvc2UocykpCisJCQlsb2dfZXJyb3IoImZhaWxlZCB0byBjbG9zZSBkdW1wIHNvY2tldCIpOworCQlyZXR1cm4gcnY7CisJfQorCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgZG9fZHVtcChjb25zdCBjaGFyICpyZXFfbmFtZSkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgZmQsIHJ2ID0gMDsKKwlpbnQgY291bnQgPSAwOworCisJZmQgPSBzZXR1cF9kdW1wX3NvY2tldCgpOworCWlmIChmZCA8IDApIHsKKwkJbG9nX2Vycm9yKCJzb2NrZXQgZXJyb3IgJWQiLCBmZCk7CisJCXJldHVybiBmZDsKKwl9CisKKwlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShfbHZtbG9ja2QsIHJlcV9uYW1lLCBOVUxMKTsKKworCWlmIChyZXBseS5lcnJvcikgeworCQlsb2dfZXJyb3IoInJlcGx5IGVycm9yICVkIiwgcmVwbHkuZXJyb3IpOworCQlydiA9IHJlcGx5LmVycm9yOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXN1bHQgPSBkYWVtb25fcmVwbHlfaW50KHJlcGx5LCAicmVzdWx0IiwgMCk7CisJZHVtcF9sZW4gPSBkYWVtb25fcmVwbHlfaW50KHJlcGx5LCAiZHVtcF9sZW4iLCAwKTsKKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCXJ2ID0gcmVzdWx0OworCQlsb2dfZXJyb3IoInJlc3VsdCAlZCIsIHJlc3VsdCk7CisJfQorCisJaWYgKCFkdW1wX2xlbikKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoZHVtcF9idWYsIDAsIHNpemVvZihkdW1wX2J1ZikpOworCityZXRyeToKKwlydiA9IHJlY3Zmcm9tKGZkLCBkdW1wX2J1ZiArIGNvdW50LCBkdW1wX2xlbiAtIGNvdW50LCBNU0dfV0FJVEFMTCwKKwkJICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZkdW1wX2FkZHIsICZkdW1wX2FkZHJsZW4pOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJyZWN2ZnJvbSBlcnJvciAlZCAlZCIsIHJ2LCBlcnJubyk7CisJCXJ2ID0gLWVycm5vOworCQlnb3RvIG91dDsKKwl9CisJY291bnQgKz0gcnY7CisKKwlpZiAoY291bnQgPCBkdW1wX2xlbikKKwkJZ290byByZXRyeTsKKworCXJ2ID0gMDsKKwlpZiAoKGluZm8gJiYgZHVtcCkgfHwgIXN0cmNtcChyZXFfbmFtZSwgImR1bXAiKSkKKwkJcHJpbnRmKCIlc1xuIiwgZHVtcF9idWYpOworCWVsc2UKKwkJZm9ybWF0X2luZm8oKTsKK291dDoKKwlpZiAoY2xvc2UoZmQpKQorCQlsb2dfZXJyb3IoImZhaWxlZCB0byBjbG9zZSBkdW1wIHNvY2tldCAlZCIsIGZkKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWJsZShjb25zdCBjaGFyICpyZXFfbmFtZSkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgcnY7CisKKwlyZXBseSA9IF9sdm1sb2NrZF9zZW5kKHJlcV9uYW1lLAorCQkJCSJjbWQgPSAlcyIsICJsdm1sb2NrY3RsIiwKKwkJCQkicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBnZXRwaWQoKSwKKwkJCQkidmdfbmFtZSA9ICVzIiwgYXJnX3ZnX25hbWUsCisJCQkJTlVMTCk7CisKKwlpZiAoIV9sdm1sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQpKSB7CisJCWxvZ19lcnJvcigibHZtbG9ja2QgcmVzdWx0ICVkIiwgcmVzdWx0KTsKKwkJcnYgPSByZXN1bHQ7CisJfSBlbHNlIHsKKwkJcnYgPSAwOworCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgZG9fc3RvcF9sb2Nrc3BhY2VzKHZvaWQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNoYXIgb3B0c1szMl07CisJaW50IHJlc3VsdDsKKwlpbnQgcnY7CisKKwltZW1zZXQob3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKworCWlmICh3YWl0X29wdCkKKwkJc3RyY2F0KG9wdHMsICJ3YWl0ICIpOworCWlmIChmb3JjZV9vcHQpCisJCXN0cmNhdChvcHRzLCAiZm9yY2UgIik7CisKKwlyZXBseSA9IF9sdm1sb2NrZF9zZW5kKCJzdG9wX2FsbCIsCisJCQkJImNtZCA9ICVzIiwgImx2bWxvY2tjdGwiLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJvcHRzID0gJXMiLCBvcHRzWzBdID8gb3B0cyA6ICJub25lIiwKKwkJCQlOVUxMKTsKKworCWlmICghX2x2bWxvY2tkX3Jlc3VsdChyZXBseSwgJnJlc3VsdCkpIHsKKwkJbG9nX2Vycm9yKCJsdm1sb2NrZCByZXN1bHQgJWQiLCByZXN1bHQpOworCQlydiA9IHJlc3VsdDsKKwl9IGVsc2UgeworCQlydiA9IDA7CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBkb19raWxsKHZvaWQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQ7CisJaW50IHJ2OworCisJc3lzbG9nKExPR19FTUVSRywgIkxvc3QgYWNjZXNzIHRvIHNhbmxvY2sgbGVhc2Ugc3RvcmFnZSBpbiBWRyAlcy4iLCBhcmdfdmdfbmFtZSk7CisJLyogVGhlc2UgdHdvIGxpbmVzIGV4cGxhaW4gdGhlIG1hbnVhbCBhbHRlcm5hdGl2ZSB0byB0aGUgRklYTUUgYmVsb3cuICovCisJc3lzbG9nKExPR19FTUVSRywgIkltbWVkaWF0ZWx5IGRlYWN0aXZhdGUgTFZzIGluIFZHICVzLiIsIGFyZ192Z19uYW1lKTsKKwlzeXNsb2coTE9HX0VNRVJHLCAiT25jZSBWRyBpcyB1bnVzZWQsIHJ1biBsdm1sb2NrY3RsIC0tZHJvcCAlcy4iLCBhcmdfdmdfbmFtZSk7CisKKwkvKgorCSAqIEl0IG1heSBub3QgYmUgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIG5vdGlmeSBsdm1sb2NrZCBvZiB0aGUga2lsbCwgYnV0CisJICogbHZtbG9ja2QgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF2b2lkIGF0dGVtcHRpbmcgYW55IG5ldyBsb2NrCisJICogcmVxdWVzdHMgaW4gdGhlIFZHICh3aGljaCB3b3VsZCBmYWlsIGFueXdheSksIGFuZCBjYW4gcmV0dXJuIGFuCisJICogZXJyb3IgaW5kaWNhdGluZyB0aGF0IHRoZSBWRyBoYXMgYmVlbiBraWxsZWQuCisJICovCisKKwlyZXBseSA9IF9sdm1sb2NrZF9zZW5kKCJraWxsX3ZnIiwKKwkJCQkiY21kID0gJXMiLCAibHZtbG9ja2N0bCIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIGFyZ192Z19uYW1lLAorCQkJCU5VTEwpOworCisJaWYgKCFfbHZtbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0KSkgeworCQlsb2dfZXJyb3IoImx2bWxvY2tkIHJlc3VsdCAlZCIsIHJlc3VsdCk7CisJCXJ2ID0gcmVzdWx0OworCX0gZWxzZSB7CisJCXJ2ID0gMDsKKwl9CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwkvKgorCSAqIEZJWE1FOiBoZXJlIGlzIHdoZXJlIHdlIHNob3VsZCBpbXBsZW1lbnQgYSBzdHJvbmcgZm9ybSBvZgorCSAqIGJsa2RlYWN0aXZhdGUsIGFuZCBpZiBpdCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBhdXRvbWF0aWNhbGx5IGNhbGwKKwkgKiBkb19kcm9wKCkgYWZ0ZXJ3YXJkLiAgKFRoZSBkcm9wIHN0ZXAgbWF5IG5vdCBhbHdheXMgYmUgbmVjZXNzYXJ5CisJICogaWYgdGhlIGx2bSBjb21tYW5kcyBydW4gd2hpbGUgc2h1dHRpbmcgdGhpbmdzIGRvd24gcmVsZWFzZSBhbGwgdGhlCisJICogbGVhc2VzLikKKwkgKgorCSAqIHJ1bl9zdHJvbmdfYmxrZGVhY3RpdmF0ZSgpOworCSAqIGRvX2Ryb3AoKTsKKwkgKi8KKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBkb19kcm9wKHZvaWQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQ7CisJaW50IHJ2OworCisJc3lzbG9nKExPR19XQVJOSU5HLCAiRHJvcHBpbmcgbG9ja3MgZm9yIFZHICVzLiIsIGFyZ192Z19uYW1lKTsKKworCS8qCisJICogQ2hlY2sgZm9yIG1pc3VzZSBieSBsb29raW5nIGZvciBhbnkgYWN0aXZlIExWcyBpbiB0aGUgVkcKKwkgKiBhbmQgcmVmdXNpbmcgdGhpcyBvcGVyYXRpb24gaWYgZm91bmQ/ICBPbmUgcG9zc2libGUgd2F5CisJICogdG8ga2lsbCBMVnMgKGUuZy4gaWYgZnMgY2Fubm90IGJlIHVubW91bnRlZCkgaXMgdG8gc3VzcGVuZAorCSAqIHRoZW0sIG9yIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBlcnJvciB0YXJnZXQuICBJbiB0aGF0CisJICogY2FzZSB0aGUgTFYgd2lsbCBzdGlsbCBhcHBlYXIgdG8gYmUgYWN0aXZlLCBidXQgaXQgaXMKKwkgKiBzYWZlIHRvIHJlbGVhc2UgdGhlIGxvY2suCisJICovCisKKwlyZXBseSA9IF9sdm1sb2NrZF9zZW5kKCJkcm9wX3ZnIiwKKwkJCQkiY21kID0gJXMiLCAibHZtbG9ja2N0bCIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIGFyZ192Z19uYW1lLAorCQkJCU5VTEwpOworCisJaWYgKCFfbHZtbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0KSkgeworCQlsb2dfZXJyb3IoImx2bWxvY2tkIHJlc3VsdCAlZCIsIHJlc3VsdCk7CisJCXJ2ID0gcmVzdWx0OworCX0gZWxzZSB7CisJCXJ2ID0gMDsKKwl9CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKQoreworCXByaW50ZigibHZtbG9ja2N0bCBvcHRpb25zXG4iKTsKKwlwcmludGYoIk9wdGlvbnM6XG4iKTsKKwlwcmludGYoIi0taGVscCB8IC1oXG4iKTsKKwlwcmludGYoIiAgICAgIFNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uLlxuIik7CisJcHJpbnRmKCItLXF1aXQgfCAtcVxuIik7CisJcHJpbnRmKCIgICAgICBUZWxsIGx2bWxvY2tkIHRvIHF1aXQuXG4iKTsKKwlwcmludGYoIi0taW5mbyB8IC1pXG4iKTsKKwlwcmludGYoIiAgICAgIFByaW50IGxvY2sgc3RhdGUgaW5mb3JtYXRpb24gZnJvbSBsdm1sb2NrZC5cbiIpOworCXByaW50ZigiLS1kdW1wIHwgLWRcbiIpOworCXByaW50ZigiICAgICAgUHJpbnQgbG9nIGJ1ZmZlciBmcm9tIGx2bWxvY2tkLlxuIik7CisJcHJpbnRmKCItLXdhaXQgfCAtdyAwfDFcbiIpOworCXByaW50ZigiICAgICAgV2FpdCBvcHRpb24gZm9yIG90aGVyIGNvbW1hbmRzLlxuIik7CisJcHJpbnRmKCItLWZvcmNlIHwgLWYgMHwxPlxuIik7CisJcHJpbnRmKCIgICAgICBGb3JjZSBvcHRpb24gZm9yIG90aGVyIGNvbW1hbmRzLlxuIik7CisJcHJpbnRmKCItLWtpbGwgfCAtayA8dmduYW1lPlxuIik7CisJcHJpbnRmKCIgICAgICBLaWxsIGFjY2VzcyB0byB0aGUgVkcgd2hlbiBzYW5sb2NrIGNhbm5vdCByZW5ldyBsZWFzZS5cbiIpOworCXByaW50ZigiLS1kcm9wIHwgLXIgPHZnbmFtZT5cbiIpOworCXByaW50ZigiICAgICAgQ2xlYXIgbG9ja3MgZm9yIHRoZSBWRyB3aGVuIGl0IGlzIHVudXNlZCBhZnRlciBraWxsICgtaykuXG4iKTsKKwlwcmludGYoIi0tZ2wtZW5hYmxlIHwgLUUgPHZnbmFtZT5cbiIpOworCXByaW50ZigiICAgICAgVGVsbCBsdm1sb2NrZCB0byBlbmFibGUgdGhlIGdsb2JhbCBsb2NrIGluIGEgc2FubG9jayBWRy5cbiIpOworCXByaW50ZigiLS1nbC1kaXNhYmxlIHwgLUQgPHZnbmFtZT5cbiIpOworCXByaW50ZigiICAgICAgVGVsbCBsdm1sb2NrZCB0byBkaXNhYmxlIHRoZSBnbG9iYWwgbG9jayBpbiBhIHNhbmxvY2sgVkcuXG4iKTsKKwlwcmludGYoIi0tc3RvcC1sb2Nrc3BhY2VzIHwgLVNcbiIpOworCXByaW50ZigiICAgICAgU3RvcCBhbGwgbG9ja3NwYWNlcy5cbiIpOworfQorCitzdGF0aWMgaW50IHJlYWRfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCWludCBjOworCisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsiaGVscCIsICAgICAgICAgICAgbm9fYXJndW1lbnQsICAgICAgIDAsICAnaCcgfSwKKwkJeyJxdWl0IiwgICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgMCwgICdxJyB9LAorCQl7ImluZm8iLCAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAwLCAgJ2knIH0sCisJCXsiZHVtcCIsICAgICAgICAgICAgbm9fYXJndW1lbnQsICAgICAgIDAsICAnZCcgfSwKKwkJeyJ3YWl0IiwgICAgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgICd3JyB9LAorCQl7ImZvcmNlIiwgICAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAgJ2YnIH0sCisJCXsia2lsbCIsICAgICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICAnaycgfSwKKwkJeyJkcm9wIiwgICAgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgICdyJyB9LAorCQl7ImdsLWVuYWJsZSIsICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAgJ0UnIH0sCisJCXsiZ2wtZGlzYWJsZSIsICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICAnRCcgfSwKKwkJeyJzdG9wLWxvY2tzcGFjZXMiLCBub19hcmd1bWVudCwgICAgICAgMCwgICdTJyB9LAorCQl7MCwgMCwgMCwgMCB9CisJfTsKKworCWlmIChhcmdjID09IDEpIHsKKwkJcHJpbnRfdXNhZ2UoKTsKKwkJZXhpdCgwKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhxaWRFOkQ6dzprOnI6UyIsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJLyogLS1oZWxwICovCisJCQlwcmludF91c2FnZSgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncSc6CisJCQkvKiAtLXF1aXQgKi8KKwkJCXF1aXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJLyogLS1pbmZvICovCisJCQlpbmZvID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCS8qIC0tZHVtcCAqLworCQkJZHVtcCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3YWl0X29wdCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdrJzoKKwkJCWtpbGxfdmcgPSAxOworCQkJYXJnX3ZnX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWRyb3BfdmcgPSAxOworCQkJYXJnX3ZnX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdFJzoKKwkJCWdsX2VuYWJsZSA9IDE7CisJCQlhcmdfdmdfbmFtZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJZ2xfZGlzYWJsZSA9IDE7CisJCQlhcmdfdmdfbmFtZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJc3RvcF9sb2Nrc3BhY2VzID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJ2ID0gMDsKKworCXJ2ID0gcmVhZF9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCWlmIChydiA8IDApCisJCXJldHVybiBydjsKKworCV9sdm1sb2NrZCA9IGx2bWxvY2tkX29wZW4oTlVMTCk7CisKKwlpZiAoX2x2bWxvY2tkLnNvY2tldF9mZCA8IDAgfHwgX2x2bWxvY2tkLmVycm9yKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGNvbm5lY3QgdG8gbHZtbG9ja2QuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocXVpdCkgeworCQlydiA9IGRvX3F1aXQoKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGluZm8pIHsKKwkJcnYgPSBkb19kdW1wKCJpbmZvIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkdW1wKSB7CisJCXJ2ID0gZG9fZHVtcCgiZHVtcCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoa2lsbF92ZykgeworCQlydiA9IGRvX2tpbGwoKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRyb3BfdmcpIHsKKwkJcnYgPSBkb19kcm9wKCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChnbF9lbmFibGUpIHsKKwkJc3lzbG9nKExPR19JTkZPLCAiRW5hYmxpbmcgZ2xvYmFsIGxvY2sgaW4gVkcgJXMuIiwgYXJnX3ZnX25hbWUpOworCQlydiA9IGRvX2FibGUoImVuYWJsZV9nbCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZ2xfZGlzYWJsZSkgeworCQlzeXNsb2coTE9HX0lORk8sICJEaXNhYmxpbmcgZ2xvYmFsIGxvY2sgaW4gVkcgJXMuIiwgYXJnX3ZnX25hbWUpOworCQlydiA9IGRvX2FibGUoImRpc2FibGVfZ2wiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0b3BfbG9ja3NwYWNlcykgeworCQlydiA9IGRvX3N0b3BfbG9ja3NwYWNlcygpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlsdm1sb2NrZF9jbG9zZShfbHZtbG9ja2QpOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2QtY2xpZW50LmggYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmNiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWNsaWVudC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICovCisKKyNpZm5kZWYgX0xWTV9MVk1MT0NLRF9DTElFTlRfSAorI2RlZmluZSBfTFZNX0xWTUxPQ0tEX0NMSUVOVF9ICisKKyNpbmNsdWRlICJkYWVtb24tY2xpZW50LmgiCisKKyNkZWZpbmUgTFZNTE9DS0RfU09DS0VUIERFRkFVTFRfUlVOX0RJUiAiL2x2bWxvY2tkLnNvY2tldCIKKworLyogV3JhcHBlcnMgdG8gb3Blbi9jbG9zZSBjb25uZWN0aW9uICovCisKK3N0YXRpYyBpbmxpbmUgZGFlbW9uX2hhbmRsZSBsdm1sb2NrZF9vcGVuKGNvbnN0IGNoYXIgKnNvY2spCit7CisJZGFlbW9uX2luZm8gbHZtbG9ja2RfaW5mbyA9IHsKKwkJLnBhdGggPSAibHZtbG9ja2QiLAorCQkuc29ja2V0ID0gc29jayA/OiBMVk1MT0NLRF9TT0NLRVQsCisJCS5wcm90b2NvbCA9ICJsdm1sb2NrZCIsCisJCS5wcm90b2NvbF92ZXJzaW9uID0gMSwKKwkJLmF1dG9zdGFydCA9IDAKKwl9OworCisJcmV0dXJuIGRhZW1vbl9vcGVuKGx2bWxvY2tkX2luZm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbHZtbG9ja2RfY2xvc2UoZGFlbW9uX2hhbmRsZSBoKQoreworCXJldHVybiBkYWVtb25fY2xvc2UoaCk7Cit9CisKKy8qCisgKiBFcnJvcnMgcmV0dXJuZWQgYXMgdGhlIGx2bWxvY2tkIHJlc3VsdCB2YWx1ZS4KKyAqLworI2RlZmluZSBFTk9MUyAgICAgMjEwIC8qIGxvY2tzcGFjZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgRVNUQVJUSU5HIDIxMSAvKiBsb2Nrc3BhY2UgaXMgc3RhcnRpbmcgKi8KKyNkZWZpbmUgRUFSR1MgICAgIDIxMgorI2RlZmluZSBFSE9TVElEICAgMjEzCisjZGVmaW5lIEVNQU5BR0VSICAyMTQKKyNkZWZpbmUgRVBSRVBBUkUgIDIxNQorI2RlZmluZSBFTE9DS0QgICAgMjE2CisjZGVmaW5lIEVWR0tJTExFRCAyMTcgLyogc2FubG9jayBsb3N0IGFjY2VzcyB0byBsZWFzZXMgYW5kIFZHIGlzIGtpbGxlZC4gKi8KKyNkZWZpbmUgRUxPQ0tJTyAgIDIxOCAvKiBzYW5sb2NrIGlvIGVycm9ycyBkdXJpbmcgbG9jayBvcCwgbWF5IGJlIHRyYW5zaWVudC4gKi8KKyNkZWZpbmUgRVJFTU9WRUQgIDIxOQorCisjZW5kaWYJLyogX0xWTV9MVk1MT0NLRF9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1sb2NrZC9sdm1sb2NrZC1jb3JlLmMgYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmNiZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1sb2NrZC9sdm1sb2NrZC1jb3JlLmMKQEAgLTAsMCArMSw2MTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwICAvKiBwdGhyZWFkICovCisjZGVmaW5lIF9JU09DOTlfU09VUkNFCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1pby5oIgorI2luY2x1ZGUgImRhZW1vbi1zZXJ2ZXIuaCIKKyNpbmNsdWRlICJsdm0tdmVyc2lvbi5oIgorI2luY2x1ZGUgImx2bWV0YWQtY2xpZW50LmgiCisjaW5jbHVkZSAibHZtbG9ja2QtY2xpZW50LmgiCisKKy8qICNpbmNsdWRlIDxhc3NlcnQuaD4gKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjZGVmaW5lIEVYVEVSTgorI2luY2x1ZGUgImx2bWxvY2tkLWludGVybmFsLmgiCisKKy8qCisgKiBCYXNpYyBvcGVyYXRpb24gb2YgbHZtbG9ja2QKKyAqCisgKiBsdm1sb2NrZCBtYWluIHByb2Nlc3MgcnVucyBtYWluX2xvb3AoKSB3aGljaCB1c2VzIHBvbGwoKS4KKyAqIHBvbGwgbGlzdGVucyBmb3IgbmV3IGNvbm5lY3Rpb25zIGZyb20gbHZtIGNvbW1hbmRzIGFuZCBmb3IKKyAqIG1lc3NhZ2VzIGZyb20gZXhpc3RpbmcgY29ubmVjdGVkIGx2bSBjb21tYW5kcy4KKyAqCisgKiBsdm0gY29tbWFuZCBzdGFydHMgYW5kIGNvbm5lY3RzIHRvIGx2bWxvY2tkLgorICoKKyAqIGx2bWxvY2tkIHJlY2VpdmVzIGEgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gY29tbWFuZCBhbmQgYWRkcyBhCisgKiAnc3RydWN0IGNsaWVudCcgdG8ga2VlcCB0cmFjayBvZiB0aGUgY29ubmVjdGlvbiB0byB0aGUgY29tbWFuZC4KKyAqIFRoZSBjbGllbnQncyBmZCBpcyBhZGRlZCB0byB0aGUgc2V0IG9mIGZkJ3MgaW4gcG9sbCgpLgorICoKKyAqIGx2bSBjb21tYW5kIHNlbmRzIGEgbG9jayByZXF1ZXN0IHRvIGx2bWxvY2tkLiAgVGhlIGxvY2sgcmVxdWVzdAorICogY2FuIGJlIGZvciB0aGUgZ2xvYmFsIGxvY2ssIGEgdmcgbG9jaywgb3IgYW4gbHYgbG9jay4KKyAqCisgKiBsdm1sb2NrZCBtYWluX2xvb3AvcG9sbCBzZWVzIGEgbWVzc2FnZSBmcm9tIGFuIGV4aXN0aW5nIGNsaWVudC4KKyAqIEl0IHNldHMgY2xpZW50LnJlY3YgPSAxLCB0aGVuIHdha2VzIHVwIGNsaWVudF90aHJlYWRfbWFpbi4KKyAqCisgKiBjbGllbnRfdGhyZWFkX21haW4gaXRlcmF0ZXMgdGhyb3VnaCBjbGllbnQgc3RydWN0cyAoY2wpLCBsb29raW5nCisgKiBmb3IgYW55IHRoYXQgbmVlZCBwcm9jZXNzaW5nLCBmaW5kcyB0aGUgb25lIHdpdGggY2wtPnJlY3Ygc2V0LAorICogYW5kIGNhbGxzIGNsaWVudF9yZWN2X2FjdGlvbihjbCkuCisgKgorICogY2xpZW50X3JlY3ZfYWN0aW9uKGNsKSByZWFkcyB0aGUgbWVzc2FnZS9yZXF1ZXN0IGZyb20gdGhlIGNsaWVudCwKKyAqIGFsbG9jYXRlcyBhIG5ldyAnc3RydWN0IGFjdGlvbicgKGFjdCkgdG8gcmVwcmVzZW50IHRoZSByZXF1ZXN0LAorICogc2V0cyB0aGUgYWN0IHdpdGggd2hhdCBpcyBmb3VuZCBpbiB0aGUgcmVxdWVzdCwgdGhlbiBsb29rcyBhdAorICogdGhlIHNwZWNpZmljIG9wZXJhdGlvbiBpbiBhY3QtPm9wIChMRF9PUF9GT08pIHRvIGRlY2lkZSB3aGF0IHRvCisgKiBkbyB3aXRoIHRoZSBhY3Rpb246CisgKgorICogLiBJZiB0aGUgYWN0aW9uIGlzIHRvIHN0YXJ0IGEgbG9ja3NwYWNlLCBjcmVhdGUgYSBuZXcgdGhyZWFkCisgKiAgIHRvIG1hbmFnZSB0aGF0IGxvY2tzcGFjZTogYWRkX2xvY2tzcGFjZShhY3QpLgorICoKKyAqIC4gSWYgdGhlIGFjdGlvbiBpcyBhIGxvY2sgcmVxdWVzdCwgcGFzcyB0aGUgYWN0IHRvIHRoZSB0aHJlYWQKKyAqICAgdGhhdCBpcyBtYW5hZ2luZyB0aGF0IGxvY2tzcGFjZTogYWRkX2xvY2tfYWN0aW9uKGFjdCkuCisgKgorICogLiBPdGhlciBtaXNjIGFjdGlvbnMgYXJlIGFyZSBwYXNzZWQgdG8gdGhlIHdvcmtlcl90aHJlYWQ6CisgKiAgIGFkZF93b3JrX2FjdGlvbihhY3QpLgorICoKKyAqIE9uZWMgdGhlIGNsaWVudF90aHJlYWQgaGFzIHBhc3NlZCB0aGUgYWN0aW9uIG9mZiB0byBhbm90aGVyCisgKiB0aHJlYWQgdG8gcHJvY2VzcywgaXQgZ29lcyBiYWNrIHRvIHdhaXRpbmcgZm9yIG1vcmUgY2xpZW50CisgKiBoYW5kbGluZyB3b3JrIHRvIGRvLgorICoKKyAqIFRoZSB0aHJlYWQgdGhhdCB3YXMgZ2l2ZW4gdGhlIGFjdGlvbiBieSB0aGUgY2xpZW50X3RocmVhZAorICogbm93IHByb2Nlc3NlcyB0aGF0IGFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIG9wZXJhdGlvbiwgYWN0LT5vcC4KKyAqIFRoaXMgaXMgZWl0aGVyIGEgbG9ja3NwYWNlX3RocmVhZCAoZm9yIGxvY2sgb3BzIG9yIG9wcyB0aGF0CisgKiBhZGQvcmVtIGEgbG9ja3NwYWNlKSwgb3IgdGhlIHdvcmtlcl90aHJlYWQuICBTZWUgYmVsb3cgZm9yCisgKiBob3cgdGhlc2Ugb3BzIGFyZSBwcm9jZXNzZWQgYnkgdGhlc2UgdGhyZWFkcy4gIFdoZW4gdGhlCisgKiBnaXZlbiB0aHJlYWQgaXMgZG9uZSBwcm9jZXNzaW5nIHRoZSBhY3Rpb24sIHRoZSByZXN1bHQgaXMKKyAqIHNldCBpbiBhY3QtPnJlc3VsdCwgYW5kIHRoZSBhY3Qgc3RydWN0IGZvciB0aGUgY29tcGxldGVkIGFjdGlvbgorICogaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGNsaWVudF90aHJlYWQgKGNsaWVudF9yZXN1bHRzIGxpc3QpLgorICoKKyAqIFRoZSBjbGllbnRfdGhyZWFkIHRha2VzIGNvbXBsZXRlZCBhY3Rpb25zIChmcm9tIGNsaWVudF9yZXN1bHRzCisgKiBsaXN0KSwgYW5kIHNlbmRzIHRoZSByZXN1bHQgYmFjayB0byB0aGUgY2xpZW50IHRoYXQgc2VudCB0aGUKKyAqIHJlcXVlc3QgcmVwcmVzZW50ZWQgYnkgdGhlIGFjdGlvbi4gIFRoZSBhY3Qgc3RydWN0IGlzIHRoZW4gZnJlZWQuCisgKgorICogVGhpcyBjb21wbGV0ZXMgdGhlIGN5Y2xlIG9mIHdvcmsgYmV0d2VlbiBsdm0gY29tbWFuZHMgKGNsaWVudHMpCisgKiBhbmQgbHZtbG9ja2QuICBJbiBzdW1tYXJ5OgorICoKKyAqIC0gbWFpbiBwcm9jZXNzIHBvbGxzIGZvciBuZXcgY2xpZW50IGNvbm5lY3Rpb25zIGFuZCBuZXcgcmVxdWVzdHMKKyAqICAgZnJvbSBsdm0gY29tbWFuZHMKKyAqIC0gY2xpZW50X3RocmVhZCByZWFkcyByZXF1ZXN0cyBmcm9tIGNsaWVudHMKKyAqIC0gY2xpZW50X3RocmVhZCBjcmVhdGVzIGFuIGFjdGlvbiBzdHJ1Y3QgZm9yIGVhY2ggcmVxdWVzdAorICogLSBjbGllbnRfdGhyZWFkIHBhc3NlcyB0aGUgYWN0IHRvIGFub3RoZXIgdGhyZWFkIGZvciBwcm9jZXNzaW5nCisgKiAtIG90aGVyIHRocmVhZHMgcGFzcyBjb21wbGV0ZWQgYWN0IHN0cnVjdHMgYmFjayB0byBjbGllbnRfdGhyZWFkCisgKiAtIGNsaWVudF90aHJlYWQgc2VuZHMgdGhlIGFjdCByZXN1bHQgYmFjayB0byB0aGUgY2xpZW50IGFuZCBmcmVlcyB0aGUgYWN0CisgKgorICoKKyAqIExvY2tzcGFjZSB0aHJlYWRzOgorICogRWFjaCBsb2NrZCBWRyBoYXMgaXRzIG93biBsb2Nrc3BhY2UgdGhhdCBjb250YWlucyBsb2NrcyBmb3IgdGhhdCBWRy4KKyAqIEVhY2ggJ3N0cnVjdCBsb2Nrc3BhY2UnIGlzIG1hbmFnZWQgYnkgYSBzZXBhcmF0ZSBsb2Nrc3BhY2VfdGhyZWFkLgorICogV2hlbiB0aGUgbG9ja3NwYWNlX3RocmVhZCBpcyBmaXJzdCBjcmVhdGVkLCB0aGUgZmlyc3QgdGhpbmcgaXQgZG9lcworICogaXMgam9pbiB0aGUgbG9ja3NwYWNlIGluIHRoZSBsb2NrIG1hbmFnZXIuICBUaGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorICogSWYgdGhlIGpvaW4gZmFpbHMsIHRoZSB0aHJlYWQgZXhpdHMuICBBZnRlciB0aGUgam9pbiwgdGhlIHRocmVhZAorICogZW50ZXJzIGEgbG9vcCB3YWl0aW5nIGZvciBsb2NrIGFjdGlvbnMgdG8gcGVyZm9ybSBpbiB0aGUgbG9ja3NwYWNlLgorICoKKyAqIFRoZSByZXF1ZXN0IHRvIHJlbW92ZS9sZWF2ZSBhIGxvY2tzcGFjZSBjYXVzZXMgYSBmbGFnIHRvIGJlIHNldCBpbgorICogdGhlIGxvY2tzcGFjZSBzdHJ1Y3QuICBXaGVuIHRoZSBsb2Nrc3BhY2VfdGhyZWFkIHNlZXMgdGhpcyBmbGFnCisgKiBzZXQsIGl0IGxlYXZlcyB0aGUgbG9ja3NwYWNlLCBhbmQgZXhpdHMuCisgKgorICogV2hlbiB0aGUgY2xpZW50X3RocmVhZCBwYXNzZXMgYSBuZXcgYWN0aW9uIHRvIGEgbG9ja3NwYWNlX3RocmVhZCwKKyAqIGkuZS4gYSBuZXcgbG9jayByZXF1ZXN0LCB0aGUgbG9ja3NwYWNlX3RocmVhZCBpZGVudGlmaWVzIHdoaWNoIHJlc291cmNlCisgKiBpcyBiZWluZyBsb2NrZWQgKEdMLCBWRywgTFYpLCBhbmQgZ2V0cyB0aGUgJ3N0cnVjdCByZXNvdXJjZScgKHIpIGZvciBpdC4KKyAqIHItPnR5cGUgd2lsbCBiZSBMRF9SVF9HTCwgTERfUlRfVkcsIG9yIExEX1JUX0xWLiAgci0+bmFtZSBpcyB0aGUKKyAqIHJlc291cmNlIG5hbWUsIGFuZCBpcyBmaXhlZCBmb3IgR0wgYW5kIFZHIHJlc291cmNlcywgYnV0IGlzIGJhc2VkIG9uCisgKiB0aGUgTFYgbmFtZSBmb3IgTFYgcmVzb3VyY2VzLiAgVGhlIGFjdCBpcyBhZGRlZCB0byB0aGUgcmVzb3VyY2UncworICogbGlzdCBvZiBhY3Rpb25zOiByLT5hY3Rpb25zLCBpLmUuIG91dHN0YW5kaW5nIGxvY2sgcmVxdWVzdHMgb24gdGhlCisgKiByZXNvdXJjZS4KKyAqCisgKiBUaGUgbG9ja3NwYWNlIHRocmVhZCB0aGVuIGl0ZXJhdGVzIHRocm91Z2ggZWFjaCByZXNvdXJjZSBpbiB0aGUKKyAqIGxvY2tzcGFjZSwgcHJvY2Vzc2luZyBhbnkgb3V0c3RhbmRpbmcgYWN0aW9ucyBvbiBlYWNoOiByZXNfcHJvY2VzcyhscywgcikuCisgKgorICogcmVzX3Byb2Nlc3MoKSBjb21wYXJlcyB0aGUgb3V0c3RhbmRpbmcgYWN0aW9ucy9yZXF1ZXN0cyBpbiByLT5hY3Rpb25zCisgKiBhZ2FpbnN0IGFueSBleGlzdGluZyBsb2NrcyBvbiB0aGUgcmVzb3VyY2UgaW4gci0+bG9ja3MuICBJZiB0aGUKKyAqIGFjdGlvbiBpcyBibG9ja2VkIGJ5IGV4aXN0aW5nIGxvY2tzLCBpdCdzIGxlZnQgb24gci0+YWN0aW9ucy4gIElmIG5vdCwKKyAqIHRoZSBhY3Rpb24vcmVxdWVzdCBpcyBwYXNzZWQgdG8gdGhlIGxvY2sgbWFuYWdlci4gIElmIHRoZSByZXN1bHQgZnJvbQorICogdGhlIGxvY2sgbWFuYWdlciBpcyBzdWNjZXNzLCBhIG5ldyAnc3RydWN0IGxvY2snIGlzIGNyZWF0ZWQgZm9yIHRoZQorICogYWN0aW9uIGFuZCBzYXZlZCBvbiByLT5sb2Nrcy4gIFRoZSByZXN1bHQgaXMgc2V0IGluIGFjdC0+cmVzdWx0IGFuZAorICogdGhlIGFjdCBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2xpZW50X3RocmVhZCB0byBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpsdm1sb2NrZF9wcm90b2NvbCA9ICJsdm1sb2NrZCI7CitzdGF0aWMgY29uc3QgaW50IGx2bWxvY2tkX3Byb3RvY29sX3ZlcnNpb24gPSAxOworc3RhdGljIGludCBkYWVtb25fcXVpdDsKK3N0YXRpYyBpbnQgYWRvcHRfb3B0OworCitzdGF0aWMgZGFlbW9uX2hhbmRsZSBsdm1ldGFkX2hhbmRsZTsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbHZtZXRhZF9tdXRleDsKK3N0YXRpYyBpbnQgbHZtZXRhZF9jb25uZWN0ZWQ7CisKKy8qCisgKiBXZSB1c2UgYSBzZXBhcmF0ZSBzb2NrZXQgZm9yIGR1bXBpbmcgZGFlbW9uIGluZm8uCisgKiBUaGlzIHdpbGwgbm90IGludGVyZmVyZSB3aXRoIG5vcm1hbCBvcGVyYXRpb25zLCBhbmQgYWxsb3dzCisgKiBmcmVlLWZvcm0gZGVidWcgZGF0YSB0byBiZSBkdW1wZWQgaW5zdGVhZCBvZiB0aGUgbGliZGFlbW9uCisgKiBwcm90b2NvbCB0aGF0IHdhbnRzIGFsbCBkYXRhIGluIHRoZSBjZnQgZm9ybWF0LgorICogMU1CIHNob3VsZCBmaXQgYWxsIHRoZSBpbmZvIHdlIG5lZWQgdG8gZHVtcC4KKyAqLworI2RlZmluZSBEVU1QX1NPQ0tFVF9OQU1FICJsdm1sb2NrZC1kdW1wLnNvY2siCisjZGVmaW5lIERVTVBfQlVGX1NJWkUgKDEwMjQgKiAxMDI0KQorc3RhdGljIGNoYXIgZHVtcF9idWZbRFVNUF9CVUZfU0laRV07CitzdGF0aWMgc3RydWN0IHNvY2thZGRyX3VuIGR1bXBfYWRkcjsKK3N0YXRpYyBzb2NrbGVuX3QgZHVtcF9hZGRybGVuOworCisvKgorICogTWFpbiBwcm9ncmFtIHBvbGxzIGNsaWVudCBjb25uZWN0aW9ucywgYWRkcyBuZXcgY2xpZW50cywKKyAqIGFkZHMgd29yayBmb3IgY2xpZW50IHRocmVhZC4KKyAqCisgKiBwb2xsZmRfbXV0ZXggaXMgdXNlZCBmb3IgYWRkaW5nIHZzIHJlbW92aW5nIGVudHJpZXMsCisgKiBhbmQgZm9yIHJlc3VtZSB2cyByZWFsbG9jLgorICovCisjZGVmaW5lIFBPTExfRkRfVU5VU0VEIC0xCQkvKiBzbG90IGlmIGZyZWUgKi8KKyNkZWZpbmUgUE9MTF9GRF9JR05PUkUgLTIJCS8qIHNsb3QgaXMgdXNlZCBidXQgaWdub3JlIGluIHBvbGwgKi8KKyNkZWZpbmUgQUREX1BPTExfU0laRSAxNgkJLyogaW5jcmVtZW50IHNsb3RzIGJ5IHRoaXMgYW1vdW50ICovCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgcG9sbGZkX211dGV4Oworc3RhdGljIHN0cnVjdCBwb2xsZmQgKnBvbGxmZDsKK3N0YXRpYyBpbnQgcG9sbGZkX3NpemU7CitzdGF0aWMgaW50IHBvbGxmZF9tYXhpOworc3RhdGljIGludCBsaXN0ZW5fcGk7CitzdGF0aWMgaW50IGxpc3Rlbl9mZDsKK3N0YXRpYyBpbnQgcmVzdGFydF9waTsKK3N0YXRpYyBpbnQgcmVzdGFydF9mZHNbMl07CisKKy8qCisgKiBFYWNoIGxvY2tzcGFjZSBoYXMgaXRzIG93biB0aHJlYWQgdG8gZG8gbG9ja2luZy4KKyAqIFRoZSBsb2Nrc3BhY2UgdGhyZWFkIG1ha2VzIHN5bmNocm9ub3VzIGxvY2sgcmVxdWVzdHMgdG8gZGxtL3NhbmxvY2suCisgKiBFdmVyeSB2ZyB3aXRoIGEgbG9ja2QgdHlwZSwgaS5lLiAiZGxtIiwgInNhbmxvY2siLCBzaG91bGQgYmUgb24gdGhpcyBsaXN0LgorICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGxvY2tzcGFjZXNfbXV0ZXg7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsb2Nrc3BhY2VzOworCisvKgorICogQ2xpZW50IHRocmVhZCByZWFkcyBjbGllbnQgcmVxdWVzdHMgYW5kIHdyaXRlcyBjbGllbnQgcmVzdWx0cy4KKyAqLworc3RhdGljIHB0aHJlYWRfdCBjbGllbnRfdGhyZWFkOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBjbGllbnRfbXV0ZXg7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgY2xpZW50X2NvbmQ7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjbGllbnRfbGlzdDsgICAgLyogY29ubmVjdGVkIGNsaWVudHMgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGNsaWVudF9yZXN1bHRzOyAvKiBhY3Rpb25zIHRvIHNlbmQgYmFjayB0byBjbGllbnRzICovCitzdGF0aWMgdWludDMyX3QgY2xpZW50X2lkczsgICAgICAgICAgICAgLyogMCBhbmQgSU5URVJOQUxfQ0xJRU5UX0lEIGFyZSBza2lwcGVkICovCitzdGF0aWMgaW50IGNsaWVudF9zdG9wOyAgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgdGhyZWFkICovCitzdGF0aWMgaW50IGNsaWVudF93b3JrOyAgICAgICAgICAgICAgICAgLyogYSBjbGllbnQgb24gY2xpZW50X2xpc3QgaGFzIHdvcmsgdG8gZG8gKi8KKworI2RlZmluZSBJTlRFUk5BTF9DTElFTlRfSUQgMHhGRkZGRkZGRiAgIC8qIHNwZWNpYWwgY2xpZW50X2lkIGZvciBpbnRlcm5hbCBhY3Rpb25zICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZG9wdF9yZXN1bHRzOyAgLyogc3BlY2lhbCBzdGFydCBhY3Rpb25zIGZyb20gYWRvcHRfbG9ja3MoKSAqLworCisvKgorICogV29ya2VyIHRocmVhZCBwZXJmb3JtcyBtaXNjIG5vbi1sb2NraW5nIGFjdGlvbnMsIGUuZy4gaW5pdC9mcmVlLgorICovCitzdGF0aWMgcHRocmVhZF90IHdvcmtlcl90aHJlYWQ7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHdvcmtlcl9tdXRleDsKK3N0YXRpYyBwdGhyZWFkX2NvbmRfdCB3b3JrZXJfY29uZDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHdvcmtlcl9saXN0OyAgICAvKiBhY3Rpb25zIGZvciB3b3JrZXJfdGhyZWFkICovCitzdGF0aWMgaW50IHdvcmtlcl9zdG9wOyAgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgdGhyZWFkICovCitzdGF0aWMgaW50IHdvcmtlcl93YWtlOyAgICAgICAgICAgICAgICAgLyogd2FrZSB0aGUgdGhyZWFkIHdpdGhvdXQgYWRkaW5nIHdvcmsgKi8KKworLyoKKyAqIFRoZSBjb250ZW50IG9mIGV2ZXJ5IGxvZ19mb28oKSBzdGF0ZW1lbnQgaXMgc2F2ZWQgaW4gdGhlCisgKiBjaXJjdWxhciBidWZmZXIsIHdoaWNoIGNhbiBiZSBkdW1wZWQgdG8gYSBjbGllbnQgYW5kIHByaW50ZWQuCisgKi8KKyNkZWZpbmUgTE9HX0xJTkVfU0laRSAyNTYKKyNkZWZpbmUgTE9HX0RVTVBfU0laRSBEVU1QX0JVRl9TSVpFCisjZGVmaW5lIExPR19TWVNMT0dfUFJJTyBMT0dfV0FSTklORworc3RhdGljIGNoYXIgbG9nX2R1bXBbTE9HX0RVTVBfU0laRV07CitzdGF0aWMgdW5zaWduZWQgaW50IGxvZ19wb2ludDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nX3dyYXA7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGxvZ19tdXRleDsKK3N0YXRpYyBpbnQgc3lzbG9nX3ByaW9yaXR5ID0gTE9HX1NZU0xPR19QUklPOworCisvKgorICogU3RydWN0dXJlIHBvb2xzIHRvIGF2b2lkIHJlcGVhdGVkIG1hbGxvYy9mcmVlLgorICovCisjZGVmaW5lIE1BWF9VTlVTRURfQUNUSU9OIDY0CisjZGVmaW5lIE1BWF9VTlVTRURfQ0xJRU5UIDY0CisjZGVmaW5lIE1BWF9VTlVTRURfUkVTT1VSQ0UgNjQKKyNkZWZpbmUgTUFYX1VOVVNFRF9MT0NLIDY0CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHVudXNlZF9zdHJ1Y3RfbXV0ZXg7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1bnVzZWRfYWN0aW9uOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdW51c2VkX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVudXNlZF9yZXNvdXJjZTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVudXNlZF9sb2NrOworc3RhdGljIGludCB1bnVzZWRfYWN0aW9uX2NvdW50Oworc3RhdGljIGludCB1bnVzZWRfY2xpZW50X2NvdW50Oworc3RhdGljIGludCB1bnVzZWRfcmVzb3VyY2VfY291bnQ7CitzdGF0aWMgaW50IHVudXNlZF9sb2NrX2NvdW50Oworc3RhdGljIGludCByZXNvdXJjZV9sbV9kYXRhX3NpemU7IC8qIG1heCBzaXplIG9mIGxtX2RhdGEgZnJvbSBzYW5sb2NrfGRsbSAqLworc3RhdGljIGludCBhbGxvY19uZXdfc3RydWN0czsgLyogdXNlZCBmb3IgaW5pdGlhbGl6aW5nIGluIHNldHVwX3N0cnVjdHMgKi8KKworI2RlZmluZSBET19TVE9QIDEKKyNkZWZpbmUgTk9fU1RPUCAwCisjZGVmaW5lIERPX0ZSRUUgMQorI2RlZmluZSBOT19GUkVFIDAKKyNkZWZpbmUgRE9fRk9SQ0UgMQorI2RlZmluZSBOT19GT1JDRSAwCisKK3N0YXRpYyBpbnQgYWRkX2xvY2tfYWN0aW9uKHN0cnVjdCBhY3Rpb24gKmFjdCk7CitzdGF0aWMgaW50IHN0cl90b19sbShjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGludCBzZXR1cF9kdW1wX3NvY2tldCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNlbmRfZHVtcF9idWYoaW50IGZkLCBpbnQgZHVtcF9sZW4pOworc3RhdGljIGludCBkdW1wX2luZm8oaW50ICpkdW1wX2xlbik7CitzdGF0aWMgaW50IGR1bXBfbG9nKGludCAqZHVtcF9sZW4pOworCitzdGF0aWMgaW50IF9zeXNsb2dfbmFtZV90b19udW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNtcChuYW1lLCAiZW1lcmciKSkKKwkJcmV0dXJuIExPR19FTUVSRzsKKwlpZiAoIXN0cmNtcChuYW1lLCAiYWxlcnQiKSkKKwkJcmV0dXJuIExPR19BTEVSVDsKKwlpZiAoIXN0cmNtcChuYW1lLCAiY3JpdCIpKQorCQlyZXR1cm4gTE9HX0NSSVQ7CisJaWYgKCFzdHJjbXAobmFtZSwgImVyciIpIHx8ICFzdHJjbXAobmFtZSwgImVycm9yIikpCisJCXJldHVybiBMT0dfRVJSOworCWlmICghc3RyY21wKG5hbWUsICJ3YXJuaW5nIikgfHwgIXN0cmNtcChuYW1lLCAid2FybiIpKQorCQlyZXR1cm4gTE9HX1dBUk5JTkc7CisJaWYgKCFzdHJjbXAobmFtZSwgIm5vdGljZSIpKQorCQlyZXR1cm4gTE9HX05PVElDRTsKKwlpZiAoIXN0cmNtcChuYW1lLCAiaW5mbyIpKQorCQlyZXR1cm4gTE9HX0lORk87CisJaWYgKCFzdHJjbXAobmFtZSwgImRlYnVnIikpCisJCXJldHVybiBMT0dfREVCVUc7CisJcmV0dXJuIExPR19XQVJOSU5HOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX3N5c2xvZ19udW1fdG9fbmFtZShpbnQgbnVtKQoreworCXN3aXRjaCAobnVtKSB7CisJY2FzZSBMT0dfRU1FUkc6CisJCXJldHVybiAiZW1lcmciOworCWNhc2UgTE9HX0FMRVJUOgorCQlyZXR1cm4gImFsZXJ0IjsKKwljYXNlIExPR19DUklUOgorCQlyZXR1cm4gImNyaXQiOworCWNhc2UgTE9HX0VSUjoKKwkJcmV0dXJuICJlcnIiOworCWNhc2UgTE9HX1dBUk5JTkc6CisJCXJldHVybiAid2FybmluZyI7CisJY2FzZSBMT0dfTk9USUNFOgorCQlyZXR1cm4gIm5vdGljZSI7CisJY2FzZSBMT0dfSU5GTzoKKwkJcmV0dXJuICJpbmZvIjsKKwljYXNlIExPR19ERUJVRzoKKwkJcmV0dXJuICJkZWJ1ZyI7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBtb25vdGltZSh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSkgeworCQlsb2dfZXJyb3IoImNsb2NrX2dldHRpbWUgZmFpbGVkIHRvIGdldCB0aW1lc3RhbXAgJXMuIiwKKwkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJdHMudHZfc2VjID0gMDsKKwl9CisKKwlyZXR1cm4gdHMudHZfc2VjOworfQorCitzdGF0aWMgdm9pZCBsb2dfc2F2ZV9saW5lKGludCBsZW4sIGNoYXIgKmxpbmUsCisJCQkgIGNoYXIgKmxvZ19idWYsIHVuc2lnbmVkIGludCAqcG9pbnQsIHVuc2lnbmVkIGludCAqd3JhcCkKK3sKKwl1bnNpZ25lZCBpbnQgcCA9ICpwb2ludDsKKwl1bnNpZ25lZCBpbnQgdyA9ICp3cmFwOworCWludCBpOworCisJaWYgKGxlbiA8IChpbnQpIChMT0dfRFVNUF9TSVpFIC0gcCkpIHsKKwkJbWVtY3B5KGxvZ19idWYgKyBwLCBsaW5lLCBsZW4pOworCQlwICs9IGxlbjsKKworCQlpZiAocCA9PSBMT0dfRFVNUF9TSVpFKSB7CisJCQlwID0gMDsKKwkJCXcgPSAxOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlsb2dfYnVmW3ArK10gPSBsaW5lW2ldOworCisJCWlmIChwID09IExPR19EVU1QX1NJWkUpIHsKKwkJCXAgPSAwOworCQkJdyA9IDE7CisJCX0KKwl9Cisgb3V0OgorCSpwb2ludCA9IHA7CisJKndyYXAgPSB3OworfQorCit2b2lkIGxvZ19sZXZlbChpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgbGluZVtMT0dfTElORV9TSVpFXTsKKwl2YV9saXN0IGFwOworCWludCBsZW4gPSBMT0dfTElORV9TSVpFIC0gMTsKKwlpbnQgcmV0LCBwb3MgPSAwOworCisJbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CisKKwlyZXQgPSBzbnByaW50ZihsaW5lLCBsZW4sICIlbGx1ICIsICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZShOVUxMKSk7CisJcG9zICs9IHJldDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJldCA9IHZzbnByaW50ZihsaW5lICsgcG9zLCBsZW4gLSBwb3MsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlpZiAocmV0ID49IGxlbiAtIHBvcykKKwkJcG9zID0gbGVuIC0gMTsKKwllbHNlCisJCXBvcyArPSByZXQ7CisKKwlsaW5lW3BvcysrXSA9ICdcbic7CisJbGluZVtwb3MrK10gPSAnXDAnOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2dfbXV0ZXgpOworCWxvZ19zYXZlX2xpbmUocG9zIC0gMSwgbGluZSwgbG9nX2R1bXAsICZsb2dfcG9pbnQsICZsb2dfd3JhcCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvZ19tdXRleCk7CisKKwlpZiAobGV2ZWwgPD0gc3lzbG9nX3ByaW9yaXR5KQorCQlzeXNsb2cobGV2ZWwsICIlcyIsIGxpbmUpOworCisJaWYgKGRhZW1vbl9kZWJ1ZykKKwkJZnByaW50ZihzdGRlcnIsICIlcyIsIGxpbmUpOworfQorCitzdGF0aWMgaW50IGR1bXBfbG9nKGludCAqZHVtcF9sZW4pCit7CisJaW50IHRhaWxfbGVuOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2dfbXV0ZXgpOworCisJaWYgKCFsb2dfd3JhcCAmJiAhbG9nX3BvaW50KSB7CisJCSpkdW1wX2xlbiA9IDA7CisJfSBlbHNlIGlmIChsb2dfd3JhcCkgeworCQl0YWlsX2xlbiA9IExPR19EVU1QX1NJWkUgLSBsb2dfcG9pbnQ7CisJCW1lbWNweShkdW1wX2J1ZiwgbG9nX2R1bXArbG9nX3BvaW50LCB0YWlsX2xlbik7CisJCWlmIChsb2dfcG9pbnQpCisJCQltZW1jcHkoZHVtcF9idWYrdGFpbF9sZW4sIGxvZ19kdW1wLCBsb2dfcG9pbnQpOworCQkqZHVtcF9sZW4gPSBMT0dfRFVNUF9TSVpFOworCX0gZWxzZSB7CisJCW1lbWNweShkdW1wX2J1ZiwgbG9nX2R1bXAsIGxvZ19wb2ludC0xKTsKKwkJKmR1bXBfbGVuID0gbG9nX3BvaW50LTE7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2dfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsb2Nrc3BhY2UgKmFsbG9jX2xvY2tzcGFjZSh2b2lkKQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzOworCisJaWYgKCEobHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2Nrc3BhY2UpKSkpIHsKKwkJbG9nX2Vycm9yKCJvdXQgb2YgbWVtb3J5IGZvciBsb2Nrc3BhY2UiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KGxzLCAwLCBzaXplb2Yoc3RydWN0IGxvY2tzcGFjZSkpOworCUlOSVRfTElTVF9IRUFEKCZscy0+YWN0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJmxzLT5yZXNvdXJjZXMpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbHMtPm11dGV4LCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmbHMtPmNvbmQsIE5VTEwpOworCXJldHVybiBsczsKK30KKworc3RhdGljIHN0cnVjdCBhY3Rpb24gKmFsbG9jX2FjdGlvbih2b2lkKQoreworCXN0cnVjdCBhY3Rpb24gKmFjdDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdW51c2VkX3N0cnVjdF9tdXRleCk7CisJaWYgKCF1bnVzZWRfYWN0aW9uX2NvdW50IHx8IGFsbG9jX25ld19zdHJ1Y3RzKSB7CisJCWFjdCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGFjdGlvbikpOworCX0gZWxzZSB7CisJCWFjdCA9IGxpc3RfZmlyc3RfZW50cnkoJnVudXNlZF9hY3Rpb24sIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJdW51c2VkX2FjdGlvbl9jb3VudC0tOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmdW51c2VkX3N0cnVjdF9tdXRleCk7CisJaWYgKGFjdCkKKwkJbWVtc2V0KGFjdCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3Rpb24pKTsKKwllbHNlCisJCWxvZ19lcnJvcigib3V0IG9mIG1lbW9yeSBmb3IgYWN0aW9uIik7CisJcmV0dXJuIGFjdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGllbnQgKmFsbG9jX2NsaWVudCh2b2lkKQoreworCXN0cnVjdCBjbGllbnQgKmNsOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ1bnVzZWRfc3RydWN0X211dGV4KTsKKwlpZiAoIXVudXNlZF9jbGllbnRfY291bnQgfHwgYWxsb2NfbmV3X3N0cnVjdHMpIHsKKwkJY2wgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGllbnQpKTsKKwl9IGVsc2UgeworCQljbCA9IGxpc3RfZmlyc3RfZW50cnkoJnVudXNlZF9jbGllbnQsIHN0cnVjdCBjbGllbnQsIGxpc3QpOworCQlsaXN0X2RlbCgmY2wtPmxpc3QpOworCQl1bnVzZWRfY2xpZW50X2NvdW50LS07CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1bnVzZWRfc3RydWN0X211dGV4KTsKKwlpZiAoY2wpCisJCW1lbXNldChjbCwgMCwgc2l6ZW9mKHN0cnVjdCBjbGllbnQpKTsKKwllbHNlCisJCWxvZ19lcnJvcigib3V0IG9mIG1lbW9yeSBmb3IgY2xpZW50Iik7CisJcmV0dXJuIGNsOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlICphbGxvY19yZXNvdXJjZSh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdW51c2VkX3N0cnVjdF9tdXRleCk7CisJaWYgKCF1bnVzZWRfcmVzb3VyY2VfY291bnQgfHwgYWxsb2NfbmV3X3N0cnVjdHMpIHsKKwkJciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSArIHJlc291cmNlX2xtX2RhdGFfc2l6ZSk7CisJfSBlbHNlIHsKKwkJciA9IGxpc3RfZmlyc3RfZW50cnkoJnVudXNlZF9yZXNvdXJjZSwgc3RydWN0IHJlc291cmNlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJnItPmxpc3QpOworCQl1bnVzZWRfcmVzb3VyY2VfY291bnQtLTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworCWlmIChyKSB7CisJCW1lbXNldChyLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSArIHJlc291cmNlX2xtX2RhdGFfc2l6ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZyLT5sb2Nrcyk7CisJCUlOSVRfTElTVF9IRUFEKCZyLT5hY3Rpb25zKTsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoIm91dCBvZiBtZW1vcnkgZm9yIHJlc291cmNlIik7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGxvY2sgKmFsbG9jX2xvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgbG9jayAqbGs7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworCWlmICghdW51c2VkX2xvY2tfY291bnQgfHwgYWxsb2NfbmV3X3N0cnVjdHMpIHsKKwkJbGsgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NrKSk7CisJfSBlbHNlIHsKKwkJbGsgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ1bnVzZWRfbG9jaywgc3RydWN0IGxvY2ssIGxpc3QpOworCQlsaXN0X2RlbCgmbGstPmxpc3QpOworCQl1bnVzZWRfbG9ja19jb3VudC0tOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmdW51c2VkX3N0cnVjdF9tdXRleCk7CisJaWYgKGxrKQorCQltZW1zZXQobGssIDAsIHNpemVvZihzdHJ1Y3QgbG9jaykpOworCWVsc2UKKwkJbG9nX2Vycm9yKCJvdXQgb2YgbWVtb3J5IGZvciBsb2NrIik7CisJcmV0dXJuIGxrOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2FjdGlvbihzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZ1bnVzZWRfc3RydWN0X211dGV4KTsKKwlpZiAodW51c2VkX2FjdGlvbl9jb3VudCA+PSBNQVhfVU5VU0VEX0FDVElPTikgeworCQlmcmVlKGFjdCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmdW51c2VkX2FjdGlvbik7CisJCXVudXNlZF9hY3Rpb25fY291bnQrKzsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NsaWVudChzdHJ1Y3QgY2xpZW50ICpjbCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworCWlmICh1bnVzZWRfY2xpZW50X2NvdW50ID49IE1BWF9VTlVTRURfQ0xJRU5UKSB7CisJCWZyZWUoY2wpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJmNsLT5saXN0LCAmdW51c2VkX2NsaWVudCk7CisJCXVudXNlZF9jbGllbnRfY291bnQrKzsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworCWlmICh1bnVzZWRfcmVzb3VyY2VfY291bnQgPj0gTUFYX1VOVVNFRF9SRVNPVVJDRSkgeworCQlmcmVlKHIpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJnItPmxpc3QsICZ1bnVzZWRfcmVzb3VyY2UpOworCQl1bnVzZWRfcmVzb3VyY2VfY291bnQrKzsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xvY2soc3RydWN0IGxvY2sgKmxrKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdW51c2VkX3N0cnVjdF9tdXRleCk7CisJaWYgKHVudXNlZF9sb2NrX2NvdW50ID49IE1BWF9VTlVTRURfTE9DSykgeworCQlmcmVlKGxrKTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZsay0+bGlzdCwgJnVudXNlZF9sb2NrKTsKKwkJdW51c2VkX2xvY2tfY291bnQrKzsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHNldHVwX3N0cnVjdHModm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aW9uICphY3Q7CisJc3RydWN0IGNsaWVudCAqY2w7CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBsb2NrICpsazsKKwlpbnQgZGF0YV9zYW4gPSBsbV9kYXRhX3NpemVfc2FubG9jaygpOworCWludCBkYXRhX2RsbSA9IGxtX2RhdGFfc2l6ZV9kbG0oKTsKKwlpbnQgaTsKKworCXJlc291cmNlX2xtX2RhdGFfc2l6ZSA9IGRhdGFfc2FuID4gZGF0YV9kbG0gPyBkYXRhX3NhbiA6IGRhdGFfZGxtOworCisJcHRocmVhZF9tdXRleF9pbml0KCZ1bnVzZWRfc3RydWN0X211dGV4LCBOVUxMKTsKKwlJTklUX0xJU1RfSEVBRCgmdW51c2VkX2FjdGlvbik7CisJSU5JVF9MSVNUX0hFQUQoJnVudXNlZF9jbGllbnQpOworCUlOSVRfTElTVF9IRUFEKCZ1bnVzZWRfcmVzb3VyY2UpOworCUlOSVRfTElTVF9IRUFEKCZ1bnVzZWRfbG9jayk7CisKKwkvKgorCSAqIEZvciBzZXR1cCwgZm9yY2UgdGhlIGFsbG9jXyBmdW5jdGlvbnMgdG8gYWxsb2MgbmV3IHN0cnVjdHMgaW5zdGVhZAorCSAqIG9mIHRha2luZyB0aGVtIHVudXNlZC4gIFRoaXMgYWxsb3dzIGFsbG9jX3N0cnVjdC9mcmVlX3N0cnVjdCBsb29wIHRvCisJICogcG9wdWxhdGUgdGhlIHVudXNlZCBsaXN0cy4KKwkgKi8KKwlhbGxvY19uZXdfc3RydWN0cyA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VOVVNFRF9BQ1RJT04vMjsgaSsrKSB7CisJCWlmICghKGFjdCA9IGFsbG9jX2FjdGlvbigpKSkKKwkJCWdvdG8gZmFpbDsKKwkJZnJlZV9hY3Rpb24oYWN0KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VOVVNFRF9DTElFTlQvMjsgaSsrKSB7CisJCWlmICghKGNsID0gYWxsb2NfY2xpZW50KCkpKQorCQkJZ290byBmYWlsOworCQlmcmVlX2NsaWVudChjbCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9VTlVTRURfUkVTT1VSQ0UvMjsgaSsrKSB7CisJCWlmICghKHIgPSBhbGxvY19yZXNvdXJjZSgpKSkKKwkJCWdvdG8gZmFpbDsKKwkJZnJlZV9yZXNvdXJjZShyKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VOVVNFRF9MT0NLLzI7IGkrKykgeworCQlpZiAoIShsayA9IGFsbG9jX2xvY2soKSkpCisJCQlnb3RvIGZhaWw7CisJCWZyZWVfbG9jayhsayk7CisJfQorCisJYWxsb2NfbmV3X3N0cnVjdHMgPSAwOworCXJldHVybiAwOworZmFpbDoKKwlhbGxvY19uZXdfc3RydWN0cyA9IDA7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BvbGxmZChpbnQgZmQpCit7CisJaW50IGksIG5ld19zaXplOworCXN0cnVjdCBwb2xsZmQgKnRtcF9wb2xsZmQ7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnBvbGxmZF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IHBvbGxmZF9zaXplOyBpKyspIHsKKwkJaWYgKHBvbGxmZFtpXS5mZCAhPSBQT0xMX0ZEX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCXBvbGxmZFtpXS5mZCA9IGZkOworCQlwb2xsZmRbaV0uZXZlbnRzID0gUE9MTElOOworCQlwb2xsZmRbaV0ucmV2ZW50cyA9IDA7CisKKwkJaWYgKGkgPiBwb2xsZmRfbWF4aSkKKwkJCXBvbGxmZF9tYXhpID0gaTsKKworCQlwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbGZkX211dGV4KTsKKwkJcmV0dXJuIGk7CisJfQorCisJbmV3X3NpemUgPSBwb2xsZmRfc2l6ZSArIEFERF9QT0xMX1NJWkU7CisKKwl0bXBfcG9sbGZkID0gcmVhbGxvYyhwb2xsZmQsIG5ld19zaXplICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwlpZiAoIXRtcF9wb2xsZmQpIHsKKwkJbG9nX2Vycm9yKCJjYW4ndCBhbGxvYyBuZXcgc2l6ZSAlZCBmb3IgcG9sbGZkIiwgbmV3X3NpemUpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbGZkX211dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBvbGxmZCA9IHRtcF9wb2xsZmQ7CisKKwlmb3IgKGkgPSBwb2xsZmRfc2l6ZTsgaSA8IG5ld19zaXplOyBpKyspIHsKKwkJcG9sbGZkW2ldLmZkID0gUE9MTF9GRF9VTlVTRUQ7CisJCXBvbGxmZFtpXS5ldmVudHMgPSAwOworCQlwb2xsZmRbaV0ucmV2ZW50cyA9IDA7CisJfQorCisJaSA9IHBvbGxmZF9zaXplOworCXBvbGxmZFtpXS5mZCA9IGZkOworCXBvbGxmZFtpXS5ldmVudHMgPSBQT0xMSU47CisJcG9sbGZkW2ldLnJldmVudHMgPSAwOworCXBvbGxmZF9tYXhpID0gaTsKKworCXBvbGxmZF9zaXplID0gbmV3X3NpemU7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbGZkX211dGV4KTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgcmVtX3BvbGxmZChpbnQgcGkpCit7CisJaWYgKHBpIDwgMCkgeworCQlsb2dfZXJyb3IoInJlbV9wb2xsZmQgJWQiLCBwaSk7CisJCXJldHVybjsKKwl9CisJcHRocmVhZF9tdXRleF9sb2NrKCZwb2xsZmRfbXV0ZXgpOworCXBvbGxmZFtwaV0uZmQgPSBQT0xMX0ZEX1VOVVNFRDsKKwlwb2xsZmRbcGldLmV2ZW50cyA9IDA7CisJcG9sbGZkW3BpXS5yZXZlbnRzID0gMDsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbGZkX211dGV4KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmxtX3N0cihpbnQgeCkKK3sKKwlzd2l0Y2ggKHgpIHsKKwljYXNlIExEX0xNX05PTkU6CisJCXJldHVybiAibm9uZSI7CisJY2FzZSBMRF9MTV9ETE06CisJCXJldHVybiAiZGxtIjsKKwljYXNlIExEX0xNX1NBTkxPQ0s6CisJCXJldHVybiAic2FubG9jayI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJsbV91bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpydF9zdHIoaW50IHgpCit7CisJc3dpdGNoICh4KSB7CisJY2FzZSBMRF9SVF9HTDoKKwkJcmV0dXJuICJnbCI7CisJY2FzZSBMRF9SVF9WRzoKKwkJcmV0dXJuICJ2ZyI7CisJY2FzZSBMRF9SVF9MVjoKKwkJcmV0dXJuICJsdiI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICIuIjsKKwl9OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqb3Bfc3RyKGludCB4KQoreworCXN3aXRjaCAoeCkgeworCWNhc2UgTERfT1BfSU5JVDoKKwkJcmV0dXJuICJpbml0IjsKKwljYXNlIExEX09QX0ZSRUU6CisJCXJldHVybiAiZnJlZSI7CisJY2FzZSBMRF9PUF9TVEFSVDoKKwkJcmV0dXJuICJzdGFydCI7CisJY2FzZSBMRF9PUF9TVE9QOgorCQlyZXR1cm4gInN0b3AiOworCWNhc2UgTERfT1BfTE9DSzoKKwkJcmV0dXJuICJsb2NrIjsKKwljYXNlIExEX09QX1VQREFURToKKwkJcmV0dXJuICJ1cGRhdGUiOworCWNhc2UgTERfT1BfQ0xPU0U6CisJCXJldHVybiAiY2xvc2UiOworCWNhc2UgTERfT1BfRU5BQkxFOgorCQlyZXR1cm4gImVuYWJsZSI7CisJY2FzZSBMRF9PUF9ESVNBQkxFOgorCQlyZXR1cm4gImRpc2FibGUiOworCWNhc2UgTERfT1BfU1RBUlRfV0FJVDoKKwkJcmV0dXJuICJzdGFydF93YWl0IjsKKwljYXNlIExEX09QX1NUT1BfQUxMOgorCQlyZXR1cm4gInN0b3BfYWxsIjsKKwljYXNlIExEX09QX1JFTkFNRV9CRUZPUkU6CisJCXJldHVybiAicmVuYW1lX2JlZm9yZSI7CisJY2FzZSBMRF9PUF9SRU5BTUVfRklOQUw6CisJCXJldHVybiAicmVuYW1lX2ZpbmFsIjsKKwljYXNlIExEX09QX1JVTk5JTkdfTE06CisJCXJldHVybiAicnVubmluZ19sbSI7CisJY2FzZSBMRF9PUF9GSU5EX0ZSRUVfTE9DSzoKKwkJcmV0dXJuICJmaW5kX2ZyZWVfbG9jayI7CisJY2FzZSBMRF9PUF9LSUxMX1ZHOgorCQlyZXR1cm4gImtpbGxfdmciOworCWNhc2UgTERfT1BfRFJPUF9WRzoKKwkJcmV0dXJuICJkcm9wX3ZnIjsKKwljYXNlIExEX09QX0RVTVBfTE9HOgorCQlyZXR1cm4gImR1bXBfbG9nIjsKKwljYXNlIExEX09QX0RVTVBfSU5GTzoKKwkJcmV0dXJuICJkdW1wX2luZm8iOworCWNhc2UgTERfT1BfQlVTWToKKwkJcmV0dXJuICJidXN5IjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIm9wX3Vua25vd24iOworCX07Cit9CisKK2ludCBsYXN0X3N0cmluZ19mcm9tX2FyZ3MoY2hhciAqYXJnc19pbiwgY2hhciAqbGFzdCkKK3sKKwljb25zdCBjaGFyICphcmdzID0gYXJnc19pbjsKKwljb25zdCBjaGFyICpjb2xvbiwgKnN0ciA9IE5VTEw7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIWFyZ3MgfHwgKCphcmdzID09ICdcMCcpKQorCQkJYnJlYWs7CisJCWNvbG9uID0gc3Ryc3RyKGFyZ3MsICI6Iik7CisJCWlmICghY29sb24pCisJCQlicmVhazsKKwkJc3RyID0gY29sb247CisJCWFyZ3MgPSBjb2xvbiArIDE7CisgICAgICAgIH0KKworCWlmIChzdHIpIHsKKwkJc25wcmludGYobGFzdCwgTUFYX0FSR1MsICIlcyIsIHN0ciArIDEpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgdmVyc2lvbl9mcm9tX2FyZ3MoY2hhciAqYXJncywgdW5zaWduZWQgaW50ICptYWpvciwgdW5zaWduZWQgaW50ICptaW5vciwgdW5zaWduZWQgaW50ICpwYXRjaCkKK3sKKwljaGFyIHZlcnNpb25bTUFYX0FSR1MrMV07CisJY2hhciAqbWFqb3Jfc3RyLCAqbWlub3Jfc3RyLCAqcGF0Y2hfc3RyOworCWNoYXIgKm4sICpkMSwgKmQyOworCisJbWVtc2V0KHZlcnNpb24sIDAsIHNpemVvZih2ZXJzaW9uKSk7CisJc3RybmNweSh2ZXJzaW9uLCBhcmdzLCBNQVhfQVJHUyk7CisJdmVyc2lvbltNQVhfQVJHU10gPSAnXDAnOworCisJbiA9IHN0cnN0cih2ZXJzaW9uLCAiOiIpOworCWlmIChuKQorCQkqbiA9ICdcMCc7CisKKwlkMSA9IHN0cnN0cih2ZXJzaW9uLCAiLiIpOworCWlmICghZDEpCisJCXJldHVybiAtMTsKKworCWQyID0gc3Ryc3RyKGQxICsgMSwgIi4iKTsKKwlpZiAoIWQyKQorCQlyZXR1cm4gLTE7CisKKwltYWpvcl9zdHIgPSB2ZXJzaW9uOworCW1pbm9yX3N0ciA9IGQxICsgMTsKKwlwYXRjaF9zdHIgPSBkMiArIDE7CisKKwkqZDEgPSAnXDAnOworCSpkMiA9ICdcMCc7CisKKwlpZiAobWFqb3IpCisJCSptYWpvciA9IGF0b2kobWFqb3Jfc3RyKTsKKwlpZiAobWlub3IpCisJCSptaW5vciA9IGF0b2kobWlub3Jfc3RyKTsKKwlpZiAocGF0Y2gpCisJCSpwYXRjaCA9IGF0b2kocGF0Y2hfc3RyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlc2UgYXJlIGZldyBlbm91Z2ggdGhhdCBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgY2FuCisgKiBiZSBhdm9pZGVkLgorICovCisKK3N0YXRpYyBpbnQgbG1fcHJlcGFyZV9sb2Nrc3BhY2Uoc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlpbnQgcnY7CisKKwlpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKQorCQlydiA9IGxtX3ByZXBhcmVfbG9ja3NwYWNlX2RsbShscyk7CisJZWxzZSBpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fU0FOTE9DSykKKwkJcnYgPSBsbV9wcmVwYXJlX2xvY2tzcGFjZV9zYW5sb2NrKGxzKTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChhY3QpCisJCWFjdC0+bG1fcnYgPSBydjsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgbG1fYWRkX2xvY2tzcGFjZShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IGFjdGlvbiAqYWN0LCBpbnQgYWRvcHQpCit7CisJaW50IHJ2OworCisJaWYgKGxzLT5sbV90eXBlID09IExEX0xNX0RMTSkKKwkJcnYgPSBsbV9hZGRfbG9ja3NwYWNlX2RsbShscywgYWRvcHQpOworCWVsc2UgaWYgKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spCisJCXJ2ID0gbG1fYWRkX2xvY2tzcGFjZV9zYW5sb2NrKGxzLCBhZG9wdCk7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYWN0KQorCQlhY3QtPmxtX3J2ID0gcnY7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGxtX3JlbV9sb2Nrc3BhY2Uoc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCBhY3Rpb24gKmFjdCwgaW50IGZyZWVfdmcpCit7CisJaW50IHJ2OworCisJaWYgKGxzLT5sbV90eXBlID09IExEX0xNX0RMTSkKKwkJcnYgPSBsbV9yZW1fbG9ja3NwYWNlX2RsbShscywgZnJlZV92Zyk7CisJZWxzZSBpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fU0FOTE9DSykKKwkJcnYgPSBsbV9yZW1fbG9ja3NwYWNlX3NhbmxvY2sobHMsIGZyZWVfdmcpOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKGFjdCkKKwkJYWN0LT5sbV9ydiA9IHJ2OworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBsbV9sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsIGludCBtb2RlLCBzdHJ1Y3QgYWN0aW9uICphY3QsCisJCSAgIHN0cnVjdCB2YWxfYmxrICp2Yl9vdXQsIGludCAqcmV0cnksIGludCBhZG9wdCkKK3sKKwlpbnQgcnY7CisKKwlpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKQorCQlydiA9IGxtX2xvY2tfZGxtKGxzLCByLCBtb2RlLCB2Yl9vdXQsIGFkb3B0KTsKKwllbHNlIGlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9TQU5MT0NLKQorCQlydiA9IGxtX2xvY2tfc2FubG9jayhscywgciwgbW9kZSwgdmJfb3V0LCByZXRyeSwgYWRvcHQpOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKGFjdCkKKwkJYWN0LT5sbV9ydiA9IHJ2OworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBsbV9jb252ZXJ0KHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgICAgIGludCBtb2RlLCBzdHJ1Y3QgYWN0aW9uICphY3QsIHVpbnQzMl90IHJfdmVyc2lvbikKK3sKKwlpbnQgcnY7CisKKwlpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKQorCQlydiA9IGxtX2NvbnZlcnRfZGxtKGxzLCByLCBtb2RlLCByX3ZlcnNpb24pOworCWVsc2UgaWYgKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spCisJCXJ2ID0gbG1fY29udmVydF9zYW5sb2NrKGxzLCByLCBtb2RlLCByX3ZlcnNpb24pOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKGFjdCkKKwkJYWN0LT5sbV9ydiA9IHJ2OworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBsbV91bmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgc3RydWN0IGFjdGlvbiAqYWN0LAorCQkgICAgIHVpbnQzMl90IHJfdmVyc2lvbiwgdWludDMyX3QgbG11X2ZsYWdzKQoreworCWludCBydjsKKworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0pCisJCXJ2ID0gbG1fdW5sb2NrX2RsbShscywgciwgcl92ZXJzaW9uLCBsbXVfZmxhZ3MpOworCWVsc2UgaWYgKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spCisJCXJ2ID0gbG1fdW5sb2NrX3NhbmxvY2sobHMsIHIsIHJfdmVyc2lvbiwgbG11X2ZsYWdzKTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChhY3QpCisJCWFjdC0+bG1fcnYgPSBydjsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgbG1faG9zdHMoc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBub3RpZnkpCit7CisJaWYgKGxzLT5sbV90eXBlID09IExEX0xNX0RMTSkKKwkJcmV0dXJuIGxtX2hvc3RzX2RsbShscywgbm90aWZ5KTsKKwllbHNlIGlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9TQU5MT0NLKQorCQlyZXR1cm4gbG1faG9zdHNfc2FubG9jayhscywgbm90aWZ5KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGxtX3JlbV9yZXNvdXJjZShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyKQoreworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0pCisJCWxtX3JlbV9yZXNvdXJjZV9kbG0obHMsIHIpOworCWVsc2UgaWYgKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spCisJCWxtX3JlbV9yZXNvdXJjZV9zYW5sb2NrKGxzLCByKTsKK30KKworc3RhdGljIGludCBsbV9maW5kX2ZyZWVfbG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgdWludDY0X3QgKmZyZWVfb2Zmc2V0KQoreworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0pCisJCXJldHVybiAwOworCWVsc2UgaWYgKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spCisJCXJldHVybiBsbV9maW5kX2ZyZWVfbG9ja19zYW5sb2NrKGxzLCBmcmVlX29mZnNldCk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogV2hpbGUgYWRvcHRpbmcgbG9ja3MsIGFjdGlvbnMgb3JpZ2luYXRlIGZyb20gdGhlIGFkb3B0X2xvY2tzKCkKKyAqIGZ1bmN0aW9uLCBub3QgZnJvbSBhIGNsaWVudC4gIFNvLCB0aGVzZSBhY3Rpb25zIChmbGFnZ2VkIEFET1BUKSwKKyAqIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgYWRvcHRfbG9ja3MoKSBmdW5jdGlvbiB0aHJvdWdoIHRoZQorICogYWRvcHRfcmVzdWx0cyBsaXN0LCBhbmQgbm90IGJlIHNlbnQgYmFjayB0byBhIGNsaWVudCB2aWEgdGhlCisgKiBjbGllbnRfbGlzdC9jbGllbnRfdGhyZWFkLgorICovCisKK3N0YXRpYyB2b2lkIGFkZF9jbGllbnRfcmVzdWx0KHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlpZiAoYWN0LT5mbGFncyAmIExEX0FGX05PX0NMSUVOVCkgeworCQlsb2dfZGVidWcoImludGVybmFsIGFjdGlvbiBkb25lIG9wICVzIG1vZGUgJXMgcmVzdWx0ICVkIHZnICVzIiwKKwkJCSAgb3Bfc3RyKGFjdC0+b3ApLCBtb2RlX3N0cihhY3QtPm1vZGUpLCBhY3QtPnJlc3VsdCwgYWN0LT52Z19uYW1lKTsKKwkJZnJlZV9hY3Rpb24oYWN0KTsKKwkJcmV0dXJuOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKKwlpZiAoYWN0LT5mbGFncyAmIExEX0FGX0FET1BUKQorCQlsaXN0X2FkZF90YWlsKCZhY3QtPmxpc3QsICZhZG9wdF9yZXN1bHRzKTsKKwllbHNlCisJCWxpc3RfYWRkX3RhaWwoJmFjdC0+bGlzdCwgJmNsaWVudF9yZXN1bHRzKTsKKwlwdGhyZWFkX2NvbmRfc2lnbmFsKCZjbGllbnRfY29uZCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9jayAqZmluZF9sb2NrX2NsaWVudChzdHJ1Y3QgcmVzb3VyY2UgKnIsIHVpbnQzMl90IGNsaWVudF9pZCkKK3sKKwlzdHJ1Y3QgbG9jayAqbGs7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrLCAmci0+bG9ja3MsIGxpc3QpIHsKKwkJaWYgKGxrLT5jbGllbnRfaWQgPT0gY2xpZW50X2lkKQorCQkJcmV0dXJuIGxrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrICpmaW5kX2xvY2tfcGVyc2lzdGVudChzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJc3RydWN0IGxvY2sgKmxrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsaywgJnItPmxvY2tzLCBsaXN0KSB7CisJCWlmIChsay0+ZmxhZ3MgJiBMRF9MRl9QRVJTSVNURU5UKQorCQkJcmV0dXJuIGxrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhY3Rpb24gKmZpbmRfYWN0aW9uX2NsaWVudChzdHJ1Y3QgcmVzb3VyY2UgKnIsIHVpbnQzMl90IGNsaWVudF9pZCkKK3sKKwlzdHJ1Y3QgYWN0aW9uICphY3Q7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjdCwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGFjdC0+Y2xpZW50X2lkICE9IGNsaWVudF9pZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gYWN0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYWRkX3dvcmtfYWN0aW9uKHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJndvcmtlcl9tdXRleCk7CisJaWYgKCF3b3JrZXJfc3RvcCkgeworCQlsaXN0X2FkZF90YWlsKCZhY3QtPmxpc3QsICZ3b3JrZXJfbGlzdCk7CisJCXB0aHJlYWRfY29uZF9zaWduYWwoJndvcmtlcl9jb25kKTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl9tdXRleCk7Cit9CisKK3N0YXRpYyBkYWVtb25fcmVwbHkgc2VuZF9sdm1ldGFkKGNvbnN0IGNoYXIgKmlkLCAuLi4pCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXZhX2xpc3QgYXA7CisJaW50IHJldHJpZXMgPSAwOworCWludCBlcnI7CisKKwl2YV9zdGFydChhcCwgaWQpOworCisJLyoKKwkgKiBtdXRleCBpcyB1c2VkIGJlY2F1c2UgYWxsIHRocmVhZHMgc2hhcmUgYSBzaW5nbGUKKwkgKiBsdm1ldGFkIGNvbm5lY3Rpb24vaGFuZGxlLgorCSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHZtZXRhZF9tdXRleCk7CityZXRyeToKKwlpZiAoIWx2bWV0YWRfY29ubmVjdGVkKSB7CisJCWx2bWV0YWRfaGFuZGxlID0gbHZtZXRhZF9vcGVuKE5VTEwpOworCQlpZiAobHZtZXRhZF9oYW5kbGUuZXJyb3IgfHwgbHZtZXRhZF9oYW5kbGUuc29ja2V0X2ZkIDwgMCkgeworCQkJZXJyID0gbHZtZXRhZF9oYW5kbGUuZXJyb3IgPzogbHZtZXRhZF9oYW5kbGUuc29ja2V0X2ZkOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bWV0YWRfbXV0ZXgpOworCQkJbG9nX2Vycm9yKCJsdm1ldGFkX29wZW4gcmVjb25uZWN0IGVycm9yICVkIiwgZXJyKTsKKwkJCW1lbXNldCgmcmVwbHksIDAsIHNpemVvZihyZXBseSkpOworCQkJcmVwbHkuZXJyb3IgPSBlcnI7CisJCQl2YV9lbmQoYXApOworCQkJcmV0dXJuIHJlcGx5OworCQl9IGVsc2UgeworCQkJbG9nX2RlYnVnKCJsdm1ldGFkIHJlY29ubmVjdGVkIik7CisJCQlsdm1ldGFkX2Nvbm5lY3RlZCA9IDE7CisJCX0KKwl9CisKKwlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZV92KGx2bWV0YWRfaGFuZGxlLCBpZCwgYXApOworCisJLyogbHZtZXRhZCBtYXkgaGF2ZSBiZWVuIHJlc3RhcnRlZCAqLworCWlmICgocmVwbHkuZXJyb3IgPT0gRUNPTk5SRVNFVCkgJiYgKHJldHJpZXMgPCAyKSkgeworCQlkYWVtb25fY2xvc2UobHZtZXRhZF9oYW5kbGUpOworCQlsdm1ldGFkX2Nvbm5lY3RlZCA9IDA7CisJCXJldHJpZXMrKzsKKwkJZ290byByZXRyeTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmx2bWV0YWRfbXV0ZXgpOworCisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmVwbHk7Cit9CisKK3N0YXRpYyBpbnQgcmVzX2xvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgc3RydWN0IGFjdGlvbiAqYWN0LCBpbnQgKnJldHJ5KQoreworCXN0cnVjdCBsb2NrICpsazsKKwlzdHJ1Y3QgdmFsX2JsayB2YjsKKwl1aW50MzJfdCBuZXdfdmVyc2lvbiA9IDA7CisJaW50IGludmFsX21ldGE7CisJaW50IHJ2ID0gMDsKKworCW1lbXNldCgmdmIsIDAsIHNpemVvZih2YikpOworCisJci0+bGFzdF9jbGllbnRfaWQgPSBhY3QtPmNsaWVudF9pZDsKKworCWlmIChyLT50eXBlID09IExEX1JUX0xWKQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBjbCAldSBtb2RlICVzICglcykiLCBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQsIG1vZGVfc3RyKGFjdC0+bW9kZSksIGFjdC0+bHZfbmFtZSk7CisJZWxzZQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBjbCAldSBtb2RlICVzIiwgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkLCBtb2RlX3N0cihhY3QtPm1vZGUpKTsKKworCWlmIChyLT5tb2RlID09IExEX0xLX1NIICYmIGFjdC0+bW9kZSA9PSBMRF9MS19TSCkKKwkJZ290byBhZGRfbGs7CisKKwlpZiAoci0+dHlwZSA9PSBMRF9SVF9MViAmJiBhY3QtPmx2X2FyZ3NbMF0pCisJCW1lbWNweShyLT5sdl9hcmdzLCBhY3QtPmx2X2FyZ3MsIE1BWF9BUkdTKTsKKworCXJ2ID0gbG1fbG9jayhscywgciwgYWN0LT5tb2RlLCBhY3QsICZ2YiwgcmV0cnksIGFjdC0+ZmxhZ3MgJiBMRF9BRl9BRE9QVCk7CisKKwlpZiAoci0+dXNlX3ZiKQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBydiAlZCByZWFkIHZiICV4ICV4ICV1IiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHJ2LCB2Yi52ZXJzaW9uLCB2Yi5mbGFncywgdmIucl92ZXJzaW9uKTsKKwllbHNlCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19sb2NrIHJ2ICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKworCWlmIChydiA8IDApCisJCXJldHVybiBydjsKKworCWlmIChzYW5sb2NrX2dsX2R1cCAmJiBscy0+c2FubG9ja19nbF9lbmFibGVkKQorCQlhY3QtPmZsYWdzIHw9IExEX0FGX0RVUF9HTF9MUzsKKworCS8qCisJICogQ2hlY2sgbmV3IGx2YiB2YWx1ZXMgdG8gZGVjaWRlIGlmIGx2bWV0YWQgY2FjaGUgc2hvdWxkCisJICogYmUgaW52YWxpZGF0ZWQuICBXaGVuIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgbHZtZXRhZAorCSAqIGNhY2hlLCBidXQgZG9uJ3QgaGF2ZSBhIHVzYWJsZSByX3ZlcnNpb24gZnJvbSB0aGUgbHZiLAorCSAqIHNlbmQgbHZtZXRhZCBuZXdfdmVyc2lvbiAwIHdoaWNoIGNhdXNlcyBpdCB0byBpbnZhbGlkYXRlCisJICogdGhlIFZHIG1ldGRhdGEgd2l0aG91dCBjb21wYXJpbmcgYWdhaW5zdCB0aGUgY3VycmVudGx5CisJICogY2FjaGVkIFZHIHNlcW5vLgorCSAqLworCisJaW52YWxfbWV0YSA9IDA7CisKKwlpZiAoIXItPnVzZV92YikgeworCQkvKiBMViBsb2NrcyBkb24ndCB1c2UgYW4gbHZiLiAqLworCisJfSBlbHNlIGlmICh2Yi52ZXJzaW9uICYmICgodmIudmVyc2lvbiAmIDB4RkYwMCkgPiAoVkFMX0JMS19WRVJTSU9OICYgMHhGRjAwKSkpIHsKKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgcmVzX2xvY2sgaW52YWxpZCB2YWxfYmxrIHZlcnNpb24gJXggZmxhZ3MgJXggcl92ZXJzaW9uICV1IiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHZiLnZlcnNpb24sIHZiLmZsYWdzLCB2Yi5yX3ZlcnNpb24pOworCQlpbnZhbF9tZXRhID0gMTsKKwkJbmV3X3ZlcnNpb24gPSAwOworCQlydiA9IC1FSU5WQUw7CisKKwl9IGVsc2UgaWYgKHZiLnJfdmVyc2lvbiAmJiAodmIucl92ZXJzaW9uID09IHItPnZlcnNpb24pKSB7CisJCS8qCisJCSAqIENvbW1vbiBjYXNlIHdoZW4gdGhlIHZlcnNpb24gaGFzbid0IGNoYW5nZWQuCisJCSAqIERvIG5vdGhpbmcuCisJCSAqLworCX0gZWxzZSBpZiAoci0+dmVyc2lvbiAmJiB2Yi5yX3ZlcnNpb24gJiYgKHZiLnJfdmVyc2lvbiA+IHItPnZlcnNpb24pKSB7CisJCS8qCisJCSAqIENvbW1vbiBjYXNlIHdoZW4gdGhlIHZlcnNpb24gaGFzIGNoYW5nZWQuICBBbm90aGVyIGhvc3QKKwkJICogaGFzIGNoYW5nZWQgdGhlIGRhdGEgcHJvdGVjdGVkIGJ5IHRoZSBsb2NrIHNpbmNlIHdlIGxhc3QKKwkJICogYWNxdWlyZWQgaXQsIGFuZCBpbmNyZWFzZWQgcl92ZXJzaW9uIHNvIHdlIGtub3cgdGhhdCBvdXIKKwkJICogY2FjaGUgaXMgaW52YWxpZC4KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19sb2NrIGdvdCB2ZXJzaW9uICV1IG91ciAldSIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCB2Yi5yX3ZlcnNpb24sIHItPnZlcnNpb24pOworCQlyLT52ZXJzaW9uID0gdmIucl92ZXJzaW9uOworCQluZXdfdmVyc2lvbiA9IHZiLnJfdmVyc2lvbjsKKwkJci0+dmVyc2lvbl96ZXJvX3ZhbGlkID0gMDsKKwkJaW52YWxfbWV0YSA9IDE7CisKKwl9IGVsc2UgaWYgKHItPnZlcnNpb25femVyb192YWxpZCAmJiAhdmIucl92ZXJzaW9uKSB7CisJCS8qCisJCSAqIFRoZSBsdmIgaXMgaW4gYSBwZXJzaXN0ZW50IHplcm8gc3RhdGUsIHdoaWNoIHdpbGwgZW5kCisJCSAqIG9uY2Ugc29tZW9uZSB1c2VzIHRoZSBsb2NrIGFuZCB3cml0ZXMgYSBuZXcgbHZiIHZhbHVlLgorCQkgKiBEbyBub3RoaW5nLgorCQkgKi8KKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX2xvY2sgdmVyc2lvbl96ZXJvX3ZhbGlkIHN0aWxsIHplcm8iLCBscy0+bmFtZSwgci0+bmFtZSk7CisKKwl9IGVsc2UgaWYgKHItPnZlcnNpb25femVyb192YWxpZCAmJiB2Yi5yX3ZlcnNpb24pIHsKKwkJLyoKKwkJICogU29tZW9uZSBoYXMgd3JpdHRlbiB0byB0aGUgbHZiIGFmdGVyIGl0IHdhcyBpbiBhCisJCSAqIHBlcnNpc3RlbnQgemVybyBzdGF0ZS4gIEJlZ2luIHRyYWNraW5nIG5vcm1hbAorCQkgKiBub24temVybyBjaGFuZ2VzLiAgV2UgbWF5IG9yIG1heSBub3QgaGF2ZSBrbm93bgorCQkgKiBhYm91dCBhIHByZXZpb3VzIG5vbi16ZXJvIHZlcnNpb24gKGluIHItPnZlcnNpb24pLgorCQkgKiBJZiB3ZSBkaWQsIGl0IG1lYW5zIHRoZSBsdmIgY29udGVudCB3YXMgbG9zdCBhbmQKKwkJICogaGFzIG5vdyBiZWVuIHJlaW5pdGlhbGl6ZWQuCisJCSAqCisJCSAqIElmIHRoZSBuZXcgcmVpbml0aWFsaXplZCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlCisJCSAqIHByZXZpb3VzIG5vbi16ZXJvIHZhbHVlIGluIHItPnZlcnNpb24sIHRoZW4gc29tZXRoaW5nCisJCSAqIHVudXN1YWwgaGFzIGhhcHBlbmVkLiAgRm9yIGEgVkcgbG9jaywgaXQgcHJvYmFibHkKKwkJICogbWVhbnMgdGhlIFZHIHdhcyByZW1vdmVkIGFuZCByZWNyZWF0ZWQuICBJbnZhbGlkYXRlCisJCSAqIG91ciBjYWNoZSBhbmQgYmVnaW4gdXNpbmcgdGhlIG5ldyBWRyB2ZXJzaW9uLiAgRm9yCisJCSAqIGEgR0wgbG9jaywgYW5vdGhlciBob3N0IG1heSBoYXZlIHJlaW5pdGlhbGl6ZWQgYQorCQkgKiBsb3N0L3plcm8gbHZiIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gd2UnZCBzZWVuCisJCSAqIGJlZm9yZS4gIEludmFsaWRhdGUgdGhlIGNhY2hlLCBhbmQgYmVnaW4gdXNpbmcKKwkJICogdGhlIGxvd2VyIHZlcnNpb24gKG9yIGNvbnRpbnVlIHVzaW5nIG91ciBvbGQKKwkJICogbGFyZ2VyIHZlcnNpb24/KQorCQkgKi8KKwkJaWYgKHItPnZlcnNpb24gJiYgKHItPnZlcnNpb24gPj0gdmIucl92ZXJzaW9uKSkgeworCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX2xvY2sgdmVyc2lvbl96ZXJvX3ZhbGlkIGdvdCB2ZXJzaW9uICV1IGxlc3MgdGhhbiBvdXIgJXUiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHZiLnJfdmVyc2lvbiwgci0+dmVyc2lvbik7CisJCQluZXdfdmVyc2lvbiA9IDA7CisJCX0gZWxzZSB7CisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayB2ZXJzaW9uX3plcm9fdmFsaWQgZ290IHZlcnNpb24gJXUgb3VyICV1IiwKKwkJCQlscy0+bmFtZSwgci0+bmFtZSwgdmIucl92ZXJzaW9uLCByLT52ZXJzaW9uKTsKKwkJCW5ld192ZXJzaW9uID0gdmIucl92ZXJzaW9uOworCQl9CisJCXItPnZlcnNpb24gPSB2Yi5yX3ZlcnNpb247CisJCXItPnZlcnNpb25femVyb192YWxpZCA9IDA7CisJCWludmFsX21ldGEgPSAxOworCisJfSBlbHNlIGlmICghci0+dmVyc2lvbiAmJiB2Yi5yX3ZlcnNpb24pIHsKKwkJLyoKKwkJICogVGhlIGZpcnN0IHRpbWUgd2UndmUgYWNxdWlyZWQgdGhlIGxvY2sgYW5kIHNlZW4gdGhlIGx2Yi4KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19sb2NrIGluaXRpYWwgdmVyc2lvbiAldSIsIGxzLT5uYW1lLCByLT5uYW1lLCB2Yi5yX3ZlcnNpb24pOworCQlyLT52ZXJzaW9uID0gdmIucl92ZXJzaW9uOworCQlpbnZhbF9tZXRhID0gMTsKKwkJbmV3X3ZlcnNpb24gPSB2Yi5yX3ZlcnNpb247CisJCXItPnZlcnNpb25femVyb192YWxpZCA9IDA7CisKKwl9IGVsc2UgaWYgKCFyLT52ZXJzaW9uICYmICF2Yi5yX3ZlcnNpb24pIHsKKwkJLyoKKwkJICogVGhlIGxvY2sgbWF5IGhhdmUgbmV2ZXIgYmVlbiB1c2VkIHRvIGNoYW5nZSBzb21ldGhpbmcuCisJCSAqIChlLmcuIGEgbmV3IHNhbmxvY2sgR0w/KQorCQkgKi8KKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX2xvY2sgYWxsIHZlcnNpb25zIHplcm8iLCBscy0+bmFtZSwgci0+bmFtZSk7CisJCWlmICghci0+dmVyc2lvbl96ZXJvX3ZhbGlkKSB7CisJCQlpbnZhbF9tZXRhID0gMTsKKwkJCW5ld192ZXJzaW9uID0gMDsKKwkJfQorCQlyLT52ZXJzaW9uX3plcm9fdmFsaWQgPSAxOworCisJfSBlbHNlIGlmIChyLT52ZXJzaW9uICYmICF2Yi5yX3ZlcnNpb24pIHsKKwkJLyoKKwkJICogVGhlIGx2YiBjb250ZW50IGhhcyBiZWVuIGxvc3Qgb3IgbmV2ZXIgYmVlbiBpbml0aWFsaXplZC4KKwkJICogSXQgY2FuIGJlIGxvc3QgZHVyaW5nIGRsbSByZWNvdmVyeSB3aGVuIHRoZSBtYXN0ZXIgbm9kZQorCQkgKiBpcyByZW1vdmVkLgorCQkgKgorCQkgKiBJZiB3ZSdyZSB0aGUgbmV4dCB0byB3cml0ZSB0aGUgbHZiLCByZWluaXRpYWx6ZSBpdCB0byB0aGUKKwkJICogbmV3IFZHIHNlcW5vLCBvciBhIG5ldyBHTCBjb3VudGVyIGxhcmdlciB0aGFuIHdhcyBzZWVuIGJ5CisJCSAqIGFueSBob3N0cyBiZWZvcmUgKGhvdyB0byBlc3RpbWF0ZSB0aGF0PykKKwkJICoKKwkJICogSWYgd2Ugc2VlIG5vbi16ZXJvIHZhbHVlcyBiZWZvcmUgd2UgbmV4dCB3cml0ZSB0byBpdCwgdXNlCisJCSAqIHRob3NlIHZhbHVlcy4KKwkJICoKKwkJICogV2hpbGUgdGhlIGx2YiB2YWx1ZXMgcmVtYWluIHplcm8sIHRoZSBkYXRhIGZvciB0aGUgbG9jaworCQkgKiBpcyB1bmNoYW5nZWQgYW5kIHdlIGRvbid0IG5lZWQgdG8gaW52YWxpZGF0ZSBtZXRhZGF0YS4KKwkJICovCisJCWlmICgobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKSAmJiAhdmIudmVyc2lvbiAmJiAhdmIuZmxhZ3MpCisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBhbGwgbHZiIGNvbnRlbnQgaXMgYmxhbmsiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUpOworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBvdXIgdmVyc2lvbiAldSBnb3QgdmIgJXggJXggJXUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgci0+dmVyc2lvbiwgdmIudmVyc2lvbiwgdmIuZmxhZ3MsIHZiLnJfdmVyc2lvbik7CisJCXItPnZlcnNpb25femVyb192YWxpZCA9IDE7CisJCWludmFsX21ldGEgPSAxOworCQluZXdfdmVyc2lvbiA9IDA7CisKKwl9IGVsc2UgaWYgKHItPnZlcnNpb24gJiYgdmIucl92ZXJzaW9uICYmICh2Yi5yX3ZlcnNpb24gPCByLT52ZXJzaW9uKSkgeworCQkvKgorCQkgKiBUaGUgbHZiIHZhbHVlIGhhcyBnb25lIGJhY2t3YXJkcywgd2hpY2ggc2hvdWxkbid0IGdlbmVyYWxseSBoYXBwZW4sCisJCSAqIGJ1dCBjb3VsZCB3aGVuIHRoZSBkbG0gbHZiIGlzIGxvc3QgYW5kIHJlaW5pdGlhbGl6ZWQsIG9yIHRoZSBWRworCQkgKiBpcyByZW1vdmVkIGFuZCByZWNyZWF0ZWQuCisJCSAqCisJCSAqIElmIHRoaXMgaXMgYSBWRyBsb2NrLCBpdCBwcm9iYWJseSBtZWFucyB0aGUgVkcgaGFzIGJlZW4gcmVtb3ZlZAorCQkgKiBhbmQgcmVjcmVhdGVkIHdoaWxlIHdlIGhhZCB0aGUgZGxtIGxvY2tzcGFjZSBydW5uaW5nLgorCQkgKiBGSVhNRTogaG93IGRvZXMgdGhlIGNhY2hlIHZhbGlkYXRpb24gYW5kIHJlcGxhY2VtZW50IGluIGx2bWV0YWQKKwkJICogd29yayBpbiB0aGlzIGNhc2U/CisJCSAqLworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBnb3QgdmVyc2lvbiAldSBsZXNzIHRoYW4gb3VyIHZlcnNpb24gJXUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgdmIucl92ZXJzaW9uLCByLT52ZXJzaW9uKTsKKwkJci0+dmVyc2lvbiA9IHZiLnJfdmVyc2lvbjsKKwkJaW52YWxfbWV0YSA9IDE7CisJCW5ld192ZXJzaW9uID0gMDsKKwkJci0+dmVyc2lvbl96ZXJvX3ZhbGlkID0gMDsKKwl9IGVsc2UgeworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayB1bmRlZmluZWQgdmIgY29uZGl0aW9uIHZ6diAlZCBvdXIgdmVyc2lvbiAldSB2YiAleCAleCAldSIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCByLT52ZXJzaW9uX3plcm9fdmFsaWQsIHItPnZlcnNpb24sCisJCQkgIHZiLnZlcnNpb24sIHZiLmZsYWdzLCB2Yi5yX3ZlcnNpb24pOworCX0KKworCWlmICh2Yi52ZXJzaW9uICYmIHZiLnJfdmVyc2lvbiAmJiAodmIuZmxhZ3MgJiBWQkZfUkVNT1ZFRCkpIHsKKwkJLyogU2hvdWxkIHdlIHNldCBscy0+dGhyZWFkX3N0b3AgPSAxID8gKi8KKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX2xvY2sgdmIgZmxhZyBSRU1PVkVEIiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUpOworCQlydiA9IC1FUkVNT1ZFRDsKKwl9CisKKwkvKgorCSAqIHIgaXMgdmdsazogdGVsbCBsdm1ldGFkIHRvIHNldCB0aGUgdmcgaW52YWxpZAorCSAqIGZsYWcsIGFuZCBwcm92aWRlIHRoZSBuZXcgcl92ZXJzaW9uLiAgSWYgbHZtZXRhZCBmaW5kcworCSAqIHRoYXQgaXRzIGNhY2hlZCB2ZyBoYXMgc2Vxbm8gbGVzcyB0aGFuIHRoZSB2YWx1ZQorCSAqIHdlIHNlbmQgaGVyZSwgaXQgd2lsbCBzZXQgdGhlIHZnIGludmFsaWQgZmxhZy4KKwkgKiBsdm0gY29tbWFuZHMgdGhhdCByZWFkIHRoZSB2ZyBmcm9tIGx2bWV0YWQsIHdpbGwKKwkgKiBzZWUgdGhlIGludmFsaWQgZmxhZyByZXR1cm5lZCwgd2lsbCByZXJlYWQgdGhlCisJICogdmcgZnJvbSBkaXNrLCB1cGRhdGUgdGhlIGx2bWV0YWQgY29weSwgYW5kIGdvIG9uLgorCSAqCisJICogciBpcyBnbG9iYWw6IHRlbGwgbHZtZXRhZCB0byBzZXQgdGhlIGdsb2JhbCBpbnZhbGlkCisJICogZmxhZy4gIFdoZW4gY29tbWFuZHMgc2VlIHRoaXMgZmxhZyByZXR1cm5lZCBmcm9tIGx2bWV0YWQsCisJICogdGhleSB3aWxsIHJlcmVhZCBtZXRhZGF0YSBmcm9tIGRpc2ssIHVwZGF0ZSB0aGUgbHZtZXRhZAorCSAqIGNhY2hlcywgYW5kIHRlbGwgbHZtZXRhZCB0byBzZXQgZ2xvYmFsIGludmFsaWQgdG8gMC4KKwkgKi8KKworCWlmIChpbnZhbF9tZXRhICYmIChyLT50eXBlID09IExEX1JUX1ZHKSkgeworCQlkYWVtb25fcmVwbHkgcmVwbHk7CisJCWNoYXIgKnV1aWQ7CisKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX2xvY2sgc2V0IGx2bWV0YWQgdmcgdmVyc2lvbiAldSIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBuZXdfdmVyc2lvbik7CisJCisJCWlmICghbHMtPnZnX3V1aWRbMF0gfHwgIXN0cmNtcChscy0+dmdfdXVpZCwgIm5vbmUiKSkKKwkJCXV1aWQgPSAoY2hhciAqKSJub25lIjsKKwkJZWxzZQorCQkJdXVpZCA9IGxzLT52Z191dWlkOworCisJCXJlcGx5ID0gc2VuZF9sdm1ldGFkKCJzZXRfdmdfaW5mbyIsCisJCQkJICAgICAidG9rZW4gPSAlcyIsICJza2lwIiwKKwkJCQkgICAgICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJCSAgICAgIm5hbWUgPSAlcyIsIGxzLT52Z19uYW1lLAorCQkJCSAgICAgInZlcnNpb24gPSAiIEZNVGQ2NCwgKGludDY0X3QpbmV3X3ZlcnNpb24sCisJCQkJICAgICBOVUxMKTsKKworCQlpZiAocmVwbHkuZXJyb3IgfHwgc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZXNwb25zZSIsICIiKSwgIk9LIikpCisJCQlsb2dfZXJyb3IoInNldF92Z19pbmZvIGluIGx2bWV0YWQgZmFpbGVkICVkIiwgcmVwbHkuZXJyb3IpOworCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJfQorCisJaWYgKGludmFsX21ldGEgJiYgKHItPnR5cGUgPT0gTERfUlRfR0wpKSB7CisJCWRhZW1vbl9yZXBseSByZXBseTsKKworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBzZXQgbHZtZXRhZCBnbG9iYWwgaW52YWxpZCIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lKTsKKworCQlyZXBseSA9IHNlbmRfbHZtZXRhZCgic2V0X2dsb2JhbF9pbmZvIiwKKwkJCQkgICAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCSAgICAgImdsb2JhbF9pbnZhbGlkID0gIiBGTVRkNjQsIElOVDY0X0MoMSksCisJCQkJICAgICBOVUxMKTsKKworCQlpZiAocmVwbHkuZXJyb3IgfHwgc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZXNwb25zZSIsICIiKSwgIk9LIikpCisJCQlsb2dfZXJyb3IoInNldF9nbG9iYWxfaW5mbyBpbiBsdm1ldGFkIGZhaWxlZCAlZCIsIHJlcGx5LmVycm9yKTsKKwkJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCX0KKworCS8qCisJICogUmVjb3JkIHRoZSBuZXcgbG9jayBzdGF0ZS4KKwkgKi8KKworCXItPm1vZGUgPSBhY3QtPm1vZGU7CisKK2FkZF9sazoKKwlpZiAoci0+bW9kZSA9PSBMRF9MS19TSCkKKwkJci0+c2hfY291bnQrKzsKKworCWlmICghKGxrID0gYWxsb2NfbG9jaygpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsay0+Y2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisJbGstPm1vZGUgPSBhY3QtPm1vZGU7CisKKwlpZiAoYWN0LT5mbGFncyAmIExEX0FGX1BFUlNJU1RFTlQpIHsKKwkJbGstPmZsYWdzIHw9IExEX0xGX1BFUlNJU1RFTlQ7CisJCWxrLT5jbGllbnRfaWQgPSAwOworCX0KKworCS8qCisJICogTFZfTE9DSyBtZWFucyB0aGUgYWN0aW9uIGFjcXVpcmVkIHRoZSBsdiBsb2NrIGluIHRoZSBsb2NrIG1hbmFnZXIKKwkgKiAoYXMgb3Bwb3NlZCB0byBmaW5kaW5nIHRoYXQgdGhlIGx2IGxvY2sgd2FzIGFscmVhZHkgaGVsZCkuICBJZgorCSAqIHRoZSBjbGllbnQgZm9yIHRoaXMgTFZfTE9DSyBhY3Rpb24gZmFpbHMgYmVmb3JlIHdlIHNlbmQgdGhlIHJlc3VsdCwKKwkgKiB0aGVuIHdlIGF1dG9tYXRpY2FsbHkgdW5sb2NrIHRoZSBsdiBzaW5jZSB0aGUgbHYgd2Fzbid0IGFjdGl2YXRlZC4KKwkgKiAoVGhlcmUgd2lsbCBhbHdheXMgYmUgYW4gb2RkIGNoYW5jZSB0aGUgbHYgbG9jayBpcyBoZWxkIHdoaWxlIHRoZQorCSAqIGx2IGlzIG5vdCBhY3RpdmUsIGJ1dCB0aGlzIGhlbHBzLikgIFRoZSBtb3N0IGNvbW1vbiBjYXNlIHdoZXJlIHRoaXMKKwkgKiBpcyBoZWxwZnVsIGlzIHdoZW4gdGhlIGx2IGxvY2sgb3BlcmF0aW9uIGlzIHNsb3cvZGVsYXllZCBhbmQgdGhlCisJICogY29tbWFuZCBpcyBjYW5jZWxlZCBieSB0aGUgdXNlci4KKwkgKgorCSAqIExWX1VOTE9DSyBtZWFucyB0aGUgbHYgdW5sb2NrIGFjdGlvbiB3YXMgZ2VuZXJhdGVkIGJ5IGx2bWxvY2tkIHdoZW4KKwkgKiBpdCB0cmllZCB0byBzZW5kIHRoZSByZXBseSBmb3IgYW4gbHYgbG9jayBhY3Rpb24gKHdpdGggTFZfTE9DSyBzZXQpLAorCSAqIGFuZCBmYWlsZWQgdG8gc2VuZCB0aGUgcmVwbHkgdG8gdGhlIGNsaWVudC9jb21tYW5kLiAgVGhlCisJICogbGFzdF9jbGllbnRfaWQgc2F2ZWQgb24gdGhlIHJlc291cmNlIGlzIGNvbXBhcmVkIHRvIHRoaXMgTFZfVU5MT0NLCisJICogYWN0aW9uIGJlZm9yZSB0aGUgYXV0byB1bmxvY2sgaXMgZG9uZSBpbiBjYXNlIGFub3RoZXIgYWN0aW9uIGxvY2tlZAorCSAqIHRoZSBsdiBiZXR3ZWVuIHRoZSBmYWlsZWQgY2xpZW50IGxvY2sgYWN0aW9uIGFuZCB0aGUgYXV0byB1bmxvY2suCisJICovCisJaWYgKHItPnR5cGUgPT0gTERfUlRfTFYpCisJCWFjdC0+ZmxhZ3MgfD0gTERfQUZfTFZfTE9DSzsKKworCWxpc3RfYWRkX3RhaWwoJmxrLT5saXN0LCAmci0+bG9ja3MpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHJlc19jb252ZXJ0KHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgICAgICBzdHJ1Y3QgbG9jayAqbGssIHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwl1aW50MzJfdCByX3ZlcnNpb247CisJaW50IHJ2OworCisJci0+bGFzdF9jbGllbnRfaWQgPSBhY3QtPmNsaWVudF9pZDsKKworCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19jb252ZXJ0IGNsICV1IG1vZGUgJXMiLCBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQsIG1vZGVfc3RyKGFjdC0+bW9kZSkpOworCisJaWYgKGFjdC0+bW9kZSA9PSBMRF9MS19FWCAmJiBsay0+bW9kZSA9PSBMRF9MS19TSCAmJiByLT5zaF9jb3VudCA+IDEpCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBsbV9jb252ZXJ0KCkgd3JpdGVzIG5ldyB2ZXJzaW9uIChmcm9tIGV4KQorCSAqIFNhbWUgYXMgbG1fdW5sb2NrKCkKKwkgKi8KKworICAgICAgICBpZiAoKHItPnR5cGUgPT0gTERfUlRfR0wpICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCQlyLT52ZXJzaW9uKys7CisJCWxrLT52ZXJzaW9uID0gci0+dmVyc2lvbjsKKwkJcl92ZXJzaW9uID0gci0+dmVyc2lvbjsKKwkJci0+dmVyc2lvbl96ZXJvX3ZhbGlkID0gMDsKKworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfY29udmVydCByX3ZlcnNpb24gaW5jICV1IiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHJfdmVyc2lvbik7CisKKwl9IGVsc2UgaWYgKChyLT50eXBlID09IExEX1JUX1ZHKSAmJiAoci0+bW9kZSA9PSBMRF9MS19FWCkgJiYgKGxrLT52ZXJzaW9uID4gci0+dmVyc2lvbikpIHsKKwkJci0+dmVyc2lvbiA9IGxrLT52ZXJzaW9uOworCQlyX3ZlcnNpb24gPSByLT52ZXJzaW9uOworCQlyLT52ZXJzaW9uX3plcm9fdmFsaWQgPSAwOworCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19jb252ZXJ0IHJfdmVyc2lvbiBuZXcgJXUiLCBscy0+bmFtZSwgci0+bmFtZSwgcl92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlyX3ZlcnNpb24gPSAwOworCX0KKworCXJ2ID0gbG1fY29udmVydChscywgciwgYWN0LT5tb2RlLCBhY3QsIHJfdmVyc2lvbik7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyByZXNfY29udmVydCBsbSBlcnJvciAlZCIsIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisJCXJldHVybiBydjsKKwl9CisKKwlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfY29udmVydCBsbSBkb25lIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCisJaWYgKGxrLT5tb2RlID09IExEX0xLX0VYICYmIGFjdC0+bW9kZSA9PSBMRF9MS19TSCkgeworCQlyLT5zaF9jb3VudCA9IDE7CisJfSBlbHNlIGlmIChsay0+bW9kZSA9PSBMRF9MS19TSCAmJiBhY3QtPm1vZGUgPT0gTERfTEtfRVgpIHsKKwkJci0+c2hfY291bnQgPSAwOworCX0gZWxzZSB7CisJCS8qIHNob3VsZCBub3QgYmUgcG9zc2libGUgKi8KKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgcmVzX2NvbnZlcnQgaW52YWxpZCBtb2RlcyAlZCAlZCIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBsay0+bW9kZSwgYWN0LT5tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXItPm1vZGUgPSBhY3QtPm1vZGU7CisJbGstPm1vZGUgPSBhY3QtPm1vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNfY2FuY2VsKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgICAgIHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlzdHJ1Y3QgYWN0aW9uICpjYWN0OworCisJLyoKKwkgKiBhIGNsaWVudCBjYW4gY2FuY2VsIGl0cyBvd24gbm9uLXBlcnNpc3RlbnQgbG9jayByZXF1ZXN0cywKKwkgKiB3aGVuIGNvdWxkIHRoaXMgaGFwcGVuPworCSAqCisJICogYSBjbGllbnQgY2FuIGNhbmNlbCBvdGhlciBjbGllbnQncyBwZXJzaXN0ZW50IGxvY2sgcmVxdWVzdHMsCisJICogd2hlbiBjb3VsZCB0aGlzIGhhcHBlbj8KKwkgKi8KKworCWlmIChhY3QtPmZsYWdzICYgTERfQUZfUEVSU0lTVEVOVCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY3QsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCQlpZiAoIShjYWN0LT5mbGFncyAmIExEX0FGX1BFUlNJU1RFTlQpKQorCQkJCWNvbnRpbnVlOworCQkJZ290byBkb19jYW5jZWw7CisJCX0KKwl9IGVsc2UgeworCQljYWN0ID0gZmluZF9hY3Rpb25fY2xpZW50KHIsIGFjdC0+Y2xpZW50X2lkKTsKKwkJaWYgKGNhY3QpCisJCQlnb3RvIGRvX2NhbmNlbDsKKwl9CisKKwlyZXR1cm4gLUVOT0VOVDsKKworZG9fY2FuY2VsOgorCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19jYW5jZWwgY2wgJXUiLCBscy0+bmFtZSwgci0+bmFtZSwgY2FjdC0+Y2xpZW50X2lkKTsKKwljYWN0LT5yZXN1bHQgPSAtRUNBTkNFTEVEOworCWxpc3RfZGVsKCZjYWN0LT5saXN0KTsKKwlhZGRfY2xpZW50X3Jlc3VsdChjYWN0KTsKKworCXJldHVybiAtRUNBTkNFTEVEOworfQorCisvKgorICogbG1fdW5sb2NrKCkgd3JpdGVzIG5ldyBhIHJfdmVyc2lvbiAoZnJvbSBleCkKKyAqCisgKiBUaGUgcl92ZXJzaW9uIG9mIHRoZSB2ZyByZXNvdXJjZSBpcyBpbmNyZW1lbnRlZCBpZgorICogYW4gInVwZGF0ZSIgd2FzIHJlY2VpdmVkIGZvciB0aGUgdmcgbG9jay4gIFRoZSB1cGRhdGUKKyAqIGNvbnRhaW5zIHRoZSBuZXcgdmcgc2Vxbm8gZnJvbSB0aGUgdmcgbWV0YWRhdGEgd2hpY2ggaXMKKyAqIHVzZWQgYXMgdGhlIHJfdmVyc2lvbi4KKyAqCisgKiBUaGUgcl92ZXJzaW9uIG9mIHRoZSBnbG9iYWwgcmVzb3VyY2UgaXMgYXV0b21hdGljYWxseQorICogaW5jcmVtZW50ZWQgd2hlbiBpdCBpcyB1bmxvY2tlZCBmcm9tIGV4IG1vZGUuCisgKgorICogcl92ZXJzaW9uIGlzIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgYSBjb21tYW5kIHJlbGVhc2VzCisgKiB0aGUgZ2xvYmFsIGxvY2sgZnJvbSBleC4KKyAqLworCisvKgorICogcGVyc2lzdGVudCBsb2NrcyB3aWxsIG5vdCBiZSB1bmxvY2tlZCBmb3IgT1BfQ0xPU0UvYWN0X2Nsb3NlCisgKiBiZWNhdXNlIGFjdF9jbG9zZS0+ZmxhZ3MgZG9lcyBub3QgaGF2ZSB0aGUgUEVSU0lTVEVOVCBmbGFnCisgKiBzZXQsIGFuZCBhIHBlcnNpc3RlbnQgbGstPmNsaWVudF9pZCBpcyB6ZXJvLCB3aGljaCB3aWxsIG5vdAorICogbWF0Y2ggdGhlIGNsaWVudCBpbiBhY3RfY2xvc2UtPmNsaWVudF9pZC4KKyAqLworCitzdGF0aWMgaW50IHJlc191bmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICAgICAgc3RydWN0IGFjdGlvbiAqYWN0KQoreworCXN0cnVjdCBsb2NrICpsazsKKwl1aW50MzJfdCByX3ZlcnNpb247CisJaW50IHJ2OworCisJaWYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9QRVJTSVNURU5UKSB7CisJCWxrID0gZmluZF9sb2NrX3BlcnNpc3RlbnQocik7CisJCWlmIChsaykKKwkJCWdvdG8gZG9fdW5sb2NrOworCX0gZWxzZSB7CisJCWxrID0gZmluZF9sb2NrX2NsaWVudChyLCBhY3QtPmNsaWVudF9pZCk7CisJCWlmIChsaykKKwkJCWdvdG8gZG9fdW5sb2NrOworCX0KKworCWlmIChhY3QtPm9wICE9IExEX09QX0NMT1NFKQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfdW5sb2NrIGNsICV1IG5vIGxvY2tzIiwgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkKTsKKwlyZXR1cm4gLUVOT0VOVDsKKworZG9fdW5sb2NrOgorCWlmICgoYWN0LT5mbGFncyAmIExEX0FGX0xWX1VOTE9DSykgJiYgKHItPmxhc3RfY2xpZW50X2lkICE9IGFjdC0+Y2xpZW50X2lkKSkgeworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfdW5sb2NrIGNsICV1IGZvciBmYWlsZWQgY2xpZW50IGlnbm9yZWQsIGxhc3QgY2xpZW50ICV1IiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkLCByLT5sYXN0X2NsaWVudF9pZCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXItPmxhc3RfY2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisKKwlpZiAoYWN0LT5vcCA9PSBMRF9PUF9DTE9TRSkKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX3VubG9jayBjbCAldSBmcm9tIGNsb3NlIiwgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkKTsKKwllbHNlIGlmIChyLT50eXBlID09IExEX1JUX0xWKQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfdW5sb2NrIGNsICV1ICglcykiLCBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQsIGFjdC0+bHZfbmFtZSk7CisJZWxzZQorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfdW5sb2NrIGNsICV1IiwgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkKTsKKworCS8qIHNlbmQgdW5sb2NrIHRvIGxtIHdoZW4gbGFzdCBzaCBsb2NrIGlzIHVubG9ja2VkICovCisJaWYgKGxrLT5tb2RlID09IExEX0xLX1NIKSB7CisJCXItPnNoX2NvdW50LS07CisJCWlmIChyLT5zaF9jb3VudCA+IDApIHsKKwkJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc191bmxvY2sgc2hfY291bnQgJXUiLCBscy0+bmFtZSwgci0+bmFtZSwgci0+c2hfY291bnQpOworCQkJZ290byByZW1fbGs7CisJCX0KKwl9CisKKwlpZiAoKHItPnR5cGUgPT0gTERfUlRfR0wpICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCQlyLT52ZXJzaW9uKys7CisJCWxrLT52ZXJzaW9uID0gci0+dmVyc2lvbjsKKwkJcl92ZXJzaW9uID0gci0+dmVyc2lvbjsKKwkJci0+dmVyc2lvbl96ZXJvX3ZhbGlkID0gMDsKKworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfdW5sb2NrIHJfdmVyc2lvbiBpbmMgJXUiLCBscy0+bmFtZSwgci0+bmFtZSwgcl92ZXJzaW9uKTsKKworCX0gZWxzZSBpZiAoKHItPnR5cGUgPT0gTERfUlRfVkcpICYmIChyLT5tb2RlID09IExEX0xLX0VYKSAmJiAobGstPnZlcnNpb24gPiByLT52ZXJzaW9uKSkgeworCQlyLT52ZXJzaW9uID0gbGstPnZlcnNpb247CisJCXJfdmVyc2lvbiA9IHItPnZlcnNpb247CisJCXItPnZlcnNpb25femVyb192YWxpZCA9IDA7CisKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX3VubG9jayByX3ZlcnNpb24gbmV3ICV1IiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHJfdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJcl92ZXJzaW9uID0gMDsKKwl9CisKKwlydiA9IGxtX3VubG9jayhscywgciwgYWN0LCByX3ZlcnNpb24sIDApOworCWlmIChydiA8IDApIHsKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgcmV0cnk/ICovCisJCWxvZ19lcnJvcigiUyAlcyBSICVzIHJlc191bmxvY2sgbG0gZXJyb3IgJWQiLCBscy0+bmFtZSwgci0+bmFtZSwgcnYpOworCQlyZXR1cm4gcnY7CisJfQorCisJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX3VubG9jayBsbSBkb25lIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCityZW1fbGs6CisJbGlzdF9kZWwoJmxrLT5saXN0KTsKKwlmcmVlX2xvY2sobGspOworCisJaWYgKGxpc3RfZW1wdHkoJnItPmxvY2tzKSkKKwkJci0+bW9kZSA9IExEX0xLX1VOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzX3VwZGF0ZShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyLAorCQkgICAgICBzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJc3RydWN0IGxvY2sgKmxrOworCisJbGsgPSBmaW5kX2xvY2tfY2xpZW50KHIsIGFjdC0+Y2xpZW50X2lkKTsKKwlpZiAoIWxrKSB7CisJCWxvZ19lcnJvcigiUyAlcyBSICVzIHJlc191cGRhdGUgY2wgJXUgbG9jayBub3QgZm91bmQiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoci0+bW9kZSAhPSBMRF9MS19FWCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyByZXNfdXBkYXRlIGNsICV1IHZlcnNpb24gb24gbm9uLWV4IGxvY2siLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBsayB2ZXJzaW9uIHdpbGwgYmUgd3JpdHRlbiB0byBsbSBieSB1bmxvY2sgKi8KKworCWlmIChhY3QtPmZsYWdzICYgTERfQUZfTkVYVF9WRVJTSU9OKQorCQlsay0+dmVyc2lvbiA9IHItPnZlcnNpb24gKyAxOworCWVsc2UgeworCQlpZiAoci0+dmVyc2lvbiA+PSBhY3QtPnZlcnNpb24pIHsKKwkJCS8qCisJCQkgKiBUaGlzIHVwZGF0ZSBpcyBkb25lIGZyb20gdmdfd3JpdGUuIElmIHRoZSBtZXRhZGF0YSB3aXRoCisJCQkgKiB0aGlzIHNlcW5vIGlzIG5vdCBjb21taXR0ZWQgYnkgdmdfY29tbWl0LCB0aGVuIG5leHQKKwkJCSAqIHZnX3dyaXRlIGNhbiB1c2UgdGhlIHNhbWUgc2Vxbm8sIGNhdXNpbmcgdXMgdG8gc2VlIG5vCisJCQkgKiBpbmNyZWFzZSBpbiBzZXFubyBoZXJlIGFzIGV4cGVjdGVkLgorCQkJICogRklYTUU6IEluIHRoaXMgY2FzZSwgZG8gc29tZXRoaW5nIGxpa2Ugc2V0dGluZyB0aGUgbHZiCisJCQkgKiB2ZXJzaW9uIHRvIDAgdG8gaW5zdGVhZCBvZiB0aGUgc2FtZSBzZXFubyB3aGljaCB3aWxsCisJCQkgKiBmb3JjZSBhbiBpbnZhbGlkYXRpb24gb24gb3RoZXIgaG9zdHMuICBUaGUgbmV4dCBjaGFuZ2UKKwkJCSAqIHdpbGwgcmV0dXJuIHRvIHVzaW5nIHRoZSBzZXFubyBhZ2Fpbi4KKwkJCSAqLworCQkJbG9nX2Vycm9yKCJTICVzIFIgJXMgcmVzX3VwZGF0ZSBjbCAldSBvbGQgdmVyc2lvbiAldSBuZXcgdmVyc2lvbiAldSB0b28gc21hbGwiLAorCQkJICAJICBscy0+bmFtZSwgci0+bmFtZSwgYWN0LT5jbGllbnRfaWQsIHItPnZlcnNpb24sIGFjdC0+dmVyc2lvbik7CisJCX0KKwkJbGstPnZlcnNpb24gPSBhY3QtPnZlcnNpb247CisJfQorCisJbG9nX2RlYnVnKCJTICVzIFIgJXMgcmVzX3VwZGF0ZSBjbCAldSBsayB2ZXJzaW9uIHRvICV1IiwgbHMtPm5hbWUsIHItPm5hbWUsIGFjdC0+Y2xpZW50X2lkLCBsay0+dmVyc2lvbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZXJlIGlzIG5vdGhpbmcgdG8gZGVhbGxvY2F0ZSB3aGVuIGZyZWVpbmcgYSBkbG0gTFYsIHRoZSBMVgorICogd2lsbCBzaW1wbHkgYmUgdW5sb2NrZWQgYnkgcmVtX3Jlc291cmNlLgorICovCisKK3N0YXRpYyBpbnQgZnJlZV9sdihzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyKQoreworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9TQU5MT0NLKQorCQlyZXR1cm4gbG1fZnJlZV9sdl9zYW5sb2NrKGxzLCByKTsKKwllbHNlIGlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0pCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBOQi4gd2UgY2FuJ3QgZG8gdGhpcyBpZiBzYW5sb2NrIGlzIGhvbGRpbmcgYW55IGxvY2tzIG9uCisgKiB0aGUgcmVzb3VyY2U7IHdlJ2QgYmUgcmV3cml0aW5nIHRoZSByZXNvdXJjZSBmcm9tIHVuZGVyCisgKiBzYW5sb2NrIGFuZCB3b3VsZCBjb25mdXNlIG9yIGJyZWFrIGl0IGJhZGx5LiAgV2UgZG9uJ3QKKyAqIGtub3cgd2hhdCBhbm90aGVyIGhvc3QgaXMgZG9pbmcsIHNvIHRoZXNlIG11c3QgYmUgdXNlZAorICogdmVyeSBjYXJlZnVsbHkuCisgKi8KKworc3RhdGljIGludCByZXNfYWJsZShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyLAorCQkgICAgc3RydWN0IGFjdGlvbiAqYWN0KQoreworCWludCBydjsKKworCWlmIChscy0+bG1fdHlwZSAhPSBMRF9MTV9TQU5MT0NLKSB7CisJCWxvZ19lcnJvcigiZW5hYmxlL2Rpc2FibGUgb25seSBhcHBsaWVzIHRvIHNhbmxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHItPnR5cGUgIT0gTERfUlRfR0wpIHsKKwkJbG9nX2Vycm9yKCJlbmFibGUvZGlzYWJsZSBvbmx5IGFwcGxpZXMgdG8gZ2xvYmFsIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHItPm1vZGUgIT0gTERfTEtfVU4pIHsKKwkJbG9nX2Vycm9yKCJlbmFibGUvZGlzYWJsZSBvbmx5IGFsbG93ZWQgb24gdW5sb2NrZWQgcmVzb3VyY2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFjdC0+b3AgPT0gTERfT1BfRU5BQkxFICYmIGdsX2xzbmFtZV9zYW5sb2NrWzBdKSB7CisJCWxvZ19lcnJvcigiZGlzYWJsZSBnbG9iYWwgbG9jayBpbiAlcyBiZWZvcmUgZW5hYmxlIGluICVzIiwKKwkJCSAgZ2xfbHNuYW1lX3NhbmxvY2ssIGxzLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChhY3QtPm9wID09IExEX09QX0RJU0FCTEUpICYmIChhY3QtPmZsYWdzICYgTERfQUZfRVhfRElTQUJMRSkpIHsKKwkJcnYgPSBsbV9leF9kaXNhYmxlX2dsX3NhbmxvY2sobHMpOworCQlnb3RvIG91dDsKKwl9CisKKwlydiA9IGxtX2FibGVfZ2xfc2FubG9jayhscywgYWN0LT5vcCA9PSBMRF9PUF9FTkFCTEUpOworCisJaWYgKCFydiAmJiAoYWN0LT5vcCA9PSBMRF9PUF9FTkFCTEUpKQorCQlnbF92Z19yZW1vdmVkID0gMDsKK291dDoKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBHbyB0aHJvdWdoIHF1ZXVlZCBhY3Rpb25zLCBhbmQgbWFrZSBsb2NrL3VubG9jayBjYWxscyBvbiB0aGUgcmVzb3VyY2UKKyAqIGJhc2VkIG9uIHRoZSBhY3Rpb25zIGFuZCB0aGUgZXhpc3RpbmcgbG9jayBzdGF0ZS4KKyAqCisgKiBBbGwgbG9jayBvcGVyYXRpb25zIHNlbnQgdG8gdGhlIGxvY2sgbWFuYWdlciBhcmUgbm9uLWJsb2NraW5nLgorICogVGhpcyBpcyBiZWNhdXNlIHNhbmxvY2sgZG9lcyBub3Qgc3VwcG9ydCBsb2NrIHF1ZXVlaW5nLgorICogRXZlbnR1YWxseSB3ZSBjb3VsZCBlbmhhbmNlIHRoaXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbG9jaworICogcXVldWVpbmcgd2hlbiBhdmFpbGFibGUgKGkuZS4gZm9yIHRoZSBkbG0pLgorICoKKyAqIGFjdF9jbG9zZV9saXN0OiBsaXN0IG9mIENMT1NFIGFjdGlvbnMsIGlkZW50aWZ5aW5nIGNsaWVudHMgdGhhdCBoYXZlCisgKiBjbG9zZWQvdGVybWluYXRlZCB0aGVpciBsdm1sb2NrZCBjb25uZWN0aW9uLCBhbmQgd2hvc2UgbG9ja3Mgc2hvdWxkCisgKiBiZSByZWxlYXNlZC4gIERvIG5vdCByZW1vdmUgdGhlc2UgYWN0aW9ucyBmcm9tIGFjdF9jbG9zZV9saXN0LgorICoKKyAqIHJldHJ5X291dDogc2V0IHRvIDEgaWYgdGhlIGxvY2sgbWFuYWdlciBzYWlkIHdlIHNob3VsZCByZXRyeSwKKyAqIG1lYW5pbmcgd2Ugc2hvdWxkIGNhbGwgcmVzX3Byb2Nlc3MoKSBhZ2FpbiBpbiBhIHNob3J0IHdoaWxlIHRvIHJldHJ5LgorICovCisKK3N0YXRpYyB2b2lkIHJlc19wcm9jZXNzKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICphY3RfY2xvc2VfbGlzdCwgaW50ICpyZXRyeV9vdXQpCit7CisJc3RydWN0IGFjdGlvbiAqYWN0LCAqc2FmZSwgKmFjdF9jbG9zZTsKKwlzdHJ1Y3QgbG9jayAqbGs7CisJaW50IGxtX3JldHJ5OworCWludCBydjsKKworCS8qCisJICogaGFuZGxlIHZlcnNpb24gdXBkYXRlcyBmb3IgZXggbG9ja3MKKwkgKiAobmV3IHZlcnNpb24gd2lsbCBiZSB3cml0dGVuIGJ5IHVubG9jaykKKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3QsIHNhZmUsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCWlmIChhY3QtPm9wID09IExEX09QX1VQREFURSkgeworCQkJcnYgPSByZXNfdXBkYXRlKGxzLCByLCBhY3QpOworCQkJYWN0LT5yZXN1bHQgPSBydjsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJfQorCX0KKworCS8qCisJICogaGFuZGxlIGV4cGxpY2l0IHVubG9jayBhY3Rpb25zCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmci0+YWN0aW9ucywgbGlzdCkgeworCQlpZiAoKGFjdC0+b3AgPT0gTERfT1BfTE9DSykgJiYKKwkJICAgIChhY3QtPm1vZGUgPT0gTERfTEtfSVYgfHwgYWN0LT5tb2RlID09IExEX0xLX05MKSkgeworCQkJYWN0LT5yZXN1bHQgPSAtRUlOVkFMOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQl9CisKKwkJaWYgKGFjdC0+b3AgPT0gTERfT1BfTE9DSyAmJiBhY3QtPm1vZGUgPT0gTERfTEtfVU4pIHsKKwkJCXJ2ID0gcmVzX3VubG9jayhscywgciwgYWN0KTsKKworCQkJaWYgKHJ2ID09IC1FTk9FTlQgJiYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9VTkxPQ0tfQ0FOQ0VMKSkKKwkJCQlydiA9IHJlc19jYW5jZWwobHMsIHIsIGFjdCk7CisKKwkJCS8qCisJCQkgKiBwb3NzaWJsZSB1bmxvY2sgcmVzdWx0czoKKwkJCSAqIDA6IHVubG9jayBzdWNjZWVkZWQKKwkJCSAqIC1FQ0FOQ0VMRUQ6IGNhbmNlbCBzdWNjZWVkZWQKKwkJCSAqIC1FTk9FTlQ6IG5vdGhpbmcgdG8gdW5sb2NrIG9yIGNhbmNlbAorCQkJICovCisKKwkJCWFjdC0+cmVzdWx0ID0gcnY7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIGhhbmRsZSBpbXBsaWNpdCB1bmxvY2tzIGR1ZSB0byBjbGllbnQgZXhpdCwKKwkgKiBhbHNvIGNsZWFyIGFueSBvdXRzdGFuZGluZyBhY3Rpb25zIGZvciB0aGUgY2xpZW50CisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjdF9jbG9zZSwgYWN0X2Nsb3NlX2xpc3QsIGxpc3QpIHsKKwkJcmVzX3VubG9jayhscywgciwgYWN0X2Nsb3NlKTsKKwkJcmVzX2NhbmNlbChscywgciwgYWN0X2Nsb3NlKTsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSBmcmVlaW5nIGEgbG9jayBmb3IgYW4gbHYgdGhhdCBoYXMgYmVlbiByZW1vdmVkCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmci0+YWN0aW9ucywgbGlzdCkgeworCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9GUkVFICYmIGFjdC0+cnQgPT0gTERfUlRfTFYpIHsKKwkJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGZyZWVfbHYiLCBscy0+bmFtZSwgci0+bmFtZSk7CisJCQlydiA9IGZyZWVfbHYobHMsIHIpOworCQkJYWN0LT5yZXN1bHQgPSBydjsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCWdvdG8gcl9mcmVlOworCisJCX0KKwl9CisKKwkvKgorCSAqIGhhbmRsZSBlbmFibGUvZGlzYWJsZQorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgc2FmZSwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGFjdC0+b3AgPT0gTERfT1BfRU5BQkxFIHx8IGFjdC0+b3AgPT0gTERfT1BfRElTQUJMRSkgeworCQkJcnYgPSByZXNfYWJsZShscywgciwgYWN0KTsKKwkJCWFjdC0+cmVzdWx0ID0gcnY7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisKKwkJCWlmICghcnYgJiYgYWN0LT5vcCA9PSBMRF9PUF9ESVNBQkxFKSB7CisJCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgZnJlZSBkaXNhYmxlZCIsIGxzLT5uYW1lLCByLT5uYW1lKTsKKwkJCQlnb3RvIHJfZnJlZTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogdHJhbnNpZW50IHJlcXVlc3RzIG9uIGV4aXN0aW5nIHRyYW5zaWVudCBsb2NrcworCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgc2FmZSwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9QRVJTSVNURU5UKQorCQkJY29udGludWU7CisKKwkJbGsgPSBmaW5kX2xvY2tfY2xpZW50KHIsIGFjdC0+Y2xpZW50X2lkKTsKKwkJaWYgKCFsaykKKwkJCWNvbnRpbnVlOworCisJCWlmIChsay0+bW9kZSAhPSBhY3QtPm1vZGUpIHsKKwkJCS8qIGNvbnZlcnQgYmVsb3cgKi8KKwkJCS8qCisJCQlhY3QtPnJlc3VsdCA9IC1FRVhJU1Q7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCQkqLworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQkvKiBzdWNjZXNzICovCisJCQlyLT5sYXN0X2NsaWVudF9pZCA9IGFjdC0+Y2xpZW50X2lkOworCQkJYWN0LT5yZXN1bHQgPSAtRUFMUkVBRFk7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHBlcnNpc3RlbnQgcmVxdWVzdHMgb24gZXhpc3RpbmcgcGVyc2lzdGVudCBsb2NrcworCSAqCisJICogcGVyc2lzdGVudCBsb2NrcyBhcmUgbm90IG93bmVkIGJ5IGEgY2xpZW50LCBzbyBhbnkKKwkgKiBleGlzdGluZyB3aXRoIG1hdGNoaW5nIG1vZGUgc2F0aXNmaWVzIGEgcmVxdWVzdC4KKwkgKiBvbmx5IG9uZSBwZXJzaXN0ZW50IGxvY2sgaXMga2VwdCBvbiBhIHJlc291cmNlLgorCSAqIGEgc2luZ2xlICJ1bm93bmVkIiBwZXJzaXN0ZW50IGxvY2sgc2F0aXNmaWVzCisJICogYW55L211bHRpcGxlIGNsaWVudCByZXF1ZXN0cyBmb3IgYSBwZXJzaXN0ZW50IGxvY2suCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmci0+YWN0aW9ucywgbGlzdCkgeworCQlpZiAoIShhY3QtPmZsYWdzICYgTERfQUZfUEVSU0lTVEVOVCkpCisJCQljb250aW51ZTsKKworCQlsayA9IGZpbmRfbG9ja19wZXJzaXN0ZW50KHIpOworCQlpZiAoIWxrKQorCQkJY29udGludWU7CisKKwkJaWYgKGxrLT5tb2RlICE9IGFjdC0+bW9kZSkgeworCQkJLyogY29udmVydCBiZWxvdyAqLworCQkJLyoKKwkJCWFjdC0+cmVzdWx0ID0gLUVFWElTVDsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCSovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN1Y2Nlc3MgKi8KKwkJCXItPmxhc3RfY2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisJCQlhY3QtPnJlc3VsdCA9IC1FQUxSRUFEWTsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJfQorCX0KKworCS8qCisJICogdHJhbnNpZW50IHJlcXVlc3RzIHdpdGggZXhpc3RpbmcgcGVyc2lzdGVudCBsb2NrcworCSAqCisJICogSnVzdCBncmFudCB0aGUgdHJhbnNpZW50IHJlcXVlc3QgYW5kIGRvIG5vdAorCSAqIGtlZXAgYSByZWNvcmQgb2YgaXQuICBBc3N1bWUgdGhhdCB0aGUgcGVyc2lzdGVudAorCSAqIGxvY2sgd2lsbCBub3QgZ28gYXdheSB3aGlsZSB0aGUgdHJhbnNpZW50IGxvY2sKKwkgKiBpcyBuZWVkZWQuCisJICoKKwkgKiBUaGlzIHdvdWxkIGJlIHVzZWQgd2hlbiBhbiBleCwgcGVyc2lzdGVudCBsdiBsb2NrCisJICogZXhpc3RzIGZyb20gYWN0aXZhdGlvbiwgYW5kIHRoZW4gc29tZXRoaW5nIGxpa2UKKwkgKiBsdmV4dGVuZCBhc2tzIGZvciBhIHRyYW5zaWVudCBleCBsb2NrIHRvIGNoYW5nZQorCSAqIHRoZSBsdi4gIFRoZSBsdiBjb3VsZCBub3QgYmUgdW5sb2NrZWQgYnkgZGVhY3RpdmF0aW9uCisJICogd2hpbGUgdGhlIGx2ZXh0ZW5kIHdhcyBydW5uaW5nLgorCSAqCisJICogVGhlIGxvZ2ljIGhlcmUgZm9yIG1peGluZyBUL1AgbG9ja3MgaXMgbm90IGdlbmVyYWwKKwkgKiBzdXBwb3J0OyB0aGVyZSBhcmUgYSBudW1iZXIgb2YgY2FzZXMgd2hlcmUgaXQgd2lsbAorCSAqIG5vdCB3b3JrOiB1cGRhdGluZyB2ZXJzaW9uIG51bWJlciAobHYgbG9ja3MgaGF2ZQorCSAqIG5vbmUpLCBleCBsb2NrcyBmcm9tIG11bHRpcGxlIGNsaWVudHMgd2lsbCBub3QKKwkgKiBjb25mbGljdCwgZXhwbGljaXQgdW4gb2YgdGhlIHRyYW5zaWVudCBsb2NrIHdpbGwgZmFpbC4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3QsIHNhZmUsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCWlmIChhY3QtPmZsYWdzICYgTERfQUZfUEVSU0lTVEVOVCkKKwkJCWNvbnRpbnVlOworCisJCWxrID0gZmluZF9sb2NrX3BlcnNpc3RlbnQocik7CisJCWlmICghbGspCisJCQljb250aW51ZTsKKworCQlpZiAoKGxrLT5tb2RlID09IExEX0xLX0VYKSB8fAorCQkgICAgKGxrLT5tb2RlID09IExEX0xLX1NIICYmIGFjdC0+bW9kZSA9PSBMRF9MS19TSCkpIHsKKwkJCXItPmxhc3RfY2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisJCQlhY3QtPnJlc3VsdCA9IDA7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCX0gZWxzZSB7CisJCQkvKiBwZXJzaXN0ZW50IGxvY2sgaXMgc2gsIHRyYW5zaWVudCByZXF1ZXN0IGlzIGV4ICovCisJCQkvKiBGSVhNRTogY2FuIHdlIHJlbW92ZSB0aGlzIGNhc2U/IGRvIGEgY29udmVydCBoZXJlPyAqLworCQkJbG9nX2RlYnVnKCJyZXNfcHJvY2VzcyAlcyBleGlzdGluZyBwZXJzaXN0ZW50IGxvY2sgbmV3IHRyYW5zaWVudCIsIHItPm5hbWUpOworCQkJci0+bGFzdF9jbGllbnRfaWQgPSBhY3QtPmNsaWVudF9pZDsKKwkJCWFjdC0+cmVzdWx0ID0gLUVFWElTVDsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJfQorCX0KKworCS8qCisJICogcGVyc2lzdGVudCByZXF1ZXN0cyB3aXRoIGV4aXN0aW5nIHRyYW5zaWVudCBsb2NrcworCSAqCisJICogSWYgYSBjbGllbnQgcmVxdWVzdHMgYSBQIChwZXJzaXN0ZW50KSBsb2NrIGZvciBhIFQgKHRyYW5zaWVudCkKKwkgKiBsb2NrIGl0IGFscmVhZHkgaG9sZHMsIHdlIGNhbiBqdXN0IGNoYW5nZSBUIHRvIFAuICBGYWlsIGlmIHRoZQorCSAqIHNhbWUgaGFwcGVucyBmb3IgbG9ja3MgZnJvbSBkaWZmZXJlbnQgY2xpZW50cy4gIENoYW5naW5nCisJICogYW5vdGhlciBjbGllbnQncyBsb2NrIGZyb20gVCB0byBQIG1heSBjYXVzZSBwcm9ibGVtcworCSAqIGlmIHRoYXQgY2xpZW50IHRyaWVzIHRvIHVubG9jayBvciB1cGRhdGUgdmVyc2lvbi4KKwkgKgorCSAqIEkgZG9uJ3QgdGhpbmsgdGhpcyBQL1QgY29tYmluYXRpb24gd2lsbCBiZSB1c2VkLgorCSAqIEl0IG1pZ2h0IGJlIHVzZWQgaWYgYSBjb21tYW5kIHdhcyBhYmxlIHRvIHRha2UgYSBQCisJICogdmcgbG9jaywgaW4gd2hpY2ggY2FzZSB0aGUgVCB2ZyBsb2NrIHdvdWxkIGFscmVhZHkKKwkgKiBiZSBoZWxkIGZvciByZWFkaW5nLiAgSWYgdGhlIFQgbG9jayB3YXMgc2gsIGl0IHdvdWxkCisJICogYmUgY29udmVydGVkIHRvIFAgZXguICBJZiB0aGUgVC9QIG1vZGVzIG1hdGNoZWQsIHRoZQorCSAqIGxvY2sgY291bGQganVzdCBiZSBjaGFuZ2VkIGZyb20gVCB0byBQLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgc2FmZSwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKCEoYWN0LT5mbGFncyAmIExEX0FGX1BFUlNJU1RFTlQpKQorCQkJY29udGludWU7CisKKwkJbGsgPSBmaW5kX2xvY2tfY2xpZW50KHIsIGFjdC0+Y2xpZW50X2lkKTsKKwkJaWYgKCFsaykKKwkJCWNvbnRpbnVlOworCisJCWlmIChsay0+bW9kZSAhPSBhY3QtPm1vZGUpIHsKKwkJCS8qIEZJWE1FOiBjb252ZXJ0IGFuZCBjaGFuZ2UgdG8gcGVyc2lzdGVudD8gKi8KKwkJCWxvZ19kZWJ1ZygicmVzX3Byb2Nlc3MgJXMgZXhpc3RpbmcgdHJhbnNpZW50IGxvY2sgbmV3IHBlcnNpc3RlbnQiLCByLT5uYW1lKTsKKwkJCXItPmxhc3RfY2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisJCQlhY3QtPnJlc3VsdCA9IC1FRVhJU1Q7CisJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCX0gZWxzZSB7CisJCQlyLT5sYXN0X2NsaWVudF9pZCA9IGFjdC0+Y2xpZW50X2lkOworCQkJbGstPmZsYWdzIHw9IExEX0xGX1BFUlNJU1RFTlQ7CisJCQlsay0+Y2xpZW50X2lkID0gMDsKKwkJCWFjdC0+cmVzdWx0ID0gMDsKKwkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJfQorCX0KKworCS8qCisJICogY29udmVydCBtb2RlIG9mIGV4aXN0aW5nIGxvY2tzCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmci0+YWN0aW9ucywgbGlzdCkgeworCQlpZiAoYWN0LT5mbGFncyAmIExEX0FGX1BFUlNJU1RFTlQpCisJCQlsayA9IGZpbmRfbG9ja19wZXJzaXN0ZW50KHIpOworCQllbHNlCisJCQlsayA9IGZpbmRfbG9ja19jbGllbnQociwgYWN0LT5jbGllbnRfaWQpOworCQlpZiAoIWxrKQorCQkJY29udGludWU7CisKKwkJaWYgKGxrLT5tb2RlID09IGFjdC0+bW9kZSkgeworCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2hvdWxkIGJlIGZvdW5kIGFib3ZlICovCisJCQlsb2dfZXJyb3IoImNvbnZlcnQgc2FtZSBtb2RlIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGNvbnZlcnQgZmFpbHMgaW1tZWRpYXRlbHksIG5vIEVBR0FJTiByZXRyeSAqLworCQlydiA9IHJlc19jb252ZXJ0KGxzLCByLCBsaywgYWN0KTsKKwkJYWN0LT5yZXN1bHQgPSBydjsKKwkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJfQorCisJLyoKKwkgKiBDYXNlcyBhYm92ZSBhcmUgYWxsIHJlcXVlc3RzIGFkZHJlc3NlZCBieSBleGlzdGluZyBsb2Nrcy4KKwkgKiBCZWxvdyBoYW5kbGVzIHRoZSByZXN0LiAgVHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGFyZQorCSAqIGhhbmRsZWQgdGhlIHNhbWUsIGV4Y2VwdAorCSAqIC0gaWYgbW9kZSBvZiBleGlzdGluZyBsb2NrIGlzIGluY29tcGF0IHdpdGggcmVxdWVzdGVkLAorCSAqICAgbGVhdmUgdGhlIGFjdCBvbiByLT5hY3Rpb25zCisJICogLSBpZiByIG1vZGUgaXMgRVgsIGFueSBsb2NrIGFjdGlvbiBpcyBibG9ja2VkLCBqdXN0IHF1aXQKKwkgKgorCSAqIFJldHJ5IGEgbG9jayByZXF1ZXN0IHRoYXQgZmFpbHMgZHVlIHRvIGEgbG9jayBjb25mbGljdCAoLUVBR0FJTik6CisJICogaWYgd2UgaGF2ZSBub3QgZXhjZWVkZWQgbWF4IHJldHJpZXMgYW5kIGxtIHNldHMgbG1fcmV0cnkgKHNhbmxvY2sKKwkgKiB0cmFuc2llbnQgY29uZmxpY3RzIGZyb20gc2hhcmVkIGxvY2sgaW1wbGVtZW50YXRpb24pLCBvciByIHR5cGUKKwkgKiBpcyBnbCBvciB2ZyAodHJhbnNpZW50IHJlYWwgY29uZmxpY3RzIHdlIHdhbnQgdG8gaGlkZSBmcm9tIGNvbW1hbmQpLgorCSAqIGx2IGxvY2sgY29uZmxpY3RzIHdvbid0IGJlIHRyYW5zaWVudCBzbyBkb24ndCByZXRyeSB0aGVtLgorCSAqLworCisJaWYgKHItPm1vZGUgPT0gTERfTEtfRVgpCisJCXJldHVybjsKKworCS8qCisJICogciBtb2RlIGlzIFNIIG9yIFVOLCBwYXNzIGxvY2stc2ggYWN0aW9ucyB0byBsbQorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgc2FmZSwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJLyogZ3JhbnQgaW4gb3JkZXIsIHNvIGJyZWFrIGhlcmUgKi8KKwkJaWYgKGFjdC0+b3AgPT0gTERfT1BfTE9DSyAmJiBhY3QtPm1vZGUgPT0gTERfTEtfRVgpCisJCQlicmVhazsKKworCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9MT0NLICYmIGFjdC0+bW9kZSA9PSBMRF9MS19TSCkgeworCQkJbG1fcmV0cnkgPSAwOworCisJCQlydiA9IHJlc19sb2NrKGxzLCByLCBhY3QsICZsbV9yZXRyeSk7CisJCQlpZiAoKHJ2ID09IC1FQUdBSU4pICYmCisJCQkgICAgKGFjdC0+cmV0cmllcyA8PSBhY3QtPm1heF9yZXRyaWVzKSAmJgorCQkJICAgIChsbV9yZXRyeSB8fCAoci0+dHlwZSAhPSBMRF9SVF9MVikpKSB7CisJCQkJLyogbGVhdmUgYWN0IG9uIGxpc3QgKi8KKwkJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfbG9jayBFQUdBSU4gcmV0cnkiLCBscy0+bmFtZSwgci0+bmFtZSk7CisJCQkJYWN0LT5yZXRyaWVzKys7CisJCQkJKnJldHJ5X291dCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWFjdC0+cmVzdWx0ID0gcnY7CisJCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCX0KKwkJCWlmIChydiA9PSAtRVVOQVRDSCkKKwkJCQlnb3RvIHJfZnJlZTsKKwkJfQorCX0KKworCS8qCisJICogciBtb2RlIGlzIFNILCBhbnkgZXggbG9jayBhY3Rpb24gaXMgYmxvY2tlZCwganVzdCBxdWl0CisJICovCisKKwlpZiAoci0+bW9kZSA9PSBMRF9MS19TSCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiByIG1vZGUgaXMgVU4sIHBhc3MgbG9jay1leCBhY3Rpb24gdG8gbG0KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3QsIHNhZmUsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCWlmIChhY3QtPm9wID09IExEX09QX0xPQ0sgJiYgYWN0LT5tb2RlID09IExEX0xLX0VYKSB7CisJCQlsbV9yZXRyeSA9IDA7CisKKwkJCXJ2ID0gcmVzX2xvY2sobHMsIHIsIGFjdCwgJmxtX3JldHJ5KTsKKwkJCWlmICgocnYgPT0gLUVBR0FJTikgJiYKKwkJCSAgICAoYWN0LT5yZXRyaWVzIDw9IGFjdC0+bWF4X3JldHJpZXMpICYmCisJCQkgICAgKGxtX3JldHJ5IHx8IChyLT50eXBlICE9IExEX1JUX0xWKSkpIHsKKwkJCQkvKiBsZWF2ZSBhY3Qgb24gbGlzdCAqLworCQkJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlc19sb2NrIEVBR0FJTiByZXRyeSIsIGxzLT5uYW1lLCByLT5uYW1lKTsKKwkJCQlhY3QtPnJldHJpZXMrKzsKKwkJCQkqcmV0cnlfb3V0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJYWN0LT5yZXN1bHQgPSBydjsKKwkJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQkJfQorCQkJaWYgKHJ2ID09IC1FVU5BVENIKQorCQkJCWdvdG8gcl9mcmVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm47CisKK3JfZnJlZToKKwkvKiBGb3IgdGhlIEVVTkFUQ0ggY2FzZSBpdCBtYXkgYmUgcG9zc2libGUgdGhlcmUgYXJlIHF1ZXVlZCBhY3Rpb25zPyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3QsIHNhZmUsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCWxvZ19lcnJvcigiUyAlcyBSICVzIHJlc19wcm9jZXNzIHJfZnJlZSBjYW5jZWwgJXMgY2xpZW50ICVkIiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIG9wX3N0cihhY3QtPm9wKSwgYWN0LT5jbGllbnRfaWQpOworCQlhY3QtPnJlc3VsdCA9IC1FQ0FOQ0VMRUQ7CisJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCX0KKwlsb2dfZGVidWcoIlMgJXMgUiAlcyByZXNfcHJvY2VzcyBmcmVlIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCWxtX3JlbV9yZXNvdXJjZShscywgcik7CisJbGlzdF9kZWwoJnItPmxpc3QpOworCWZyZWVfcmVzb3VyY2Uocik7Cit9CisKKyNkZWZpbmUgTE9DS1NfRVhJU1RfQU5ZIDEKKyNkZWZpbmUgTE9DS1NfRVhJU1RfR0wgIDIKKyNkZWZpbmUgTE9DS1NfRVhJU1RfVkcgIDMKKyNkZWZpbmUgTE9DS1NfRVhJU1RfTFYgIDQKKworc3RhdGljIGludCBmb3JfZWFjaF9sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgbG9ja3NfZG8pCit7CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBsb2NrICpsazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmxzLT5yZXNvdXJjZXMsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsaywgJnItPmxvY2tzLCBsaXN0KSB7CisJCQlpZiAobG9ja3NfZG8gPT0gTE9DS1NfRVhJU1RfQU5ZKQorCQkJCXJldHVybiAxOworCisJCQlpZiAobG9ja3NfZG8gPT0gTE9DS1NfRVhJU1RfR0wgJiYgci0+dHlwZSA9PSBMRF9SVF9HTCkKKwkJCQlyZXR1cm4gMTsKKworCQkJaWYgKGxvY2tzX2RvID09IExPQ0tTX0VYSVNUX1ZHICYmIHItPnR5cGUgPT0gTERfUlRfVkcpCisJCQkJcmV0dXJuIDE7CisKKwkJCWlmIChsb2Nrc19kbyA9PSBMT0NLU19FWElTVF9MViAmJiByLT50eXBlID09IExEX1JUX0xWKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfbG9ja3Moc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBmcmVlX3ZnLCBpbnQgZHJvcF92ZykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpyX3NhZmU7CisJc3RydWN0IGxvY2sgKmxrLCAqbGtfc2FmZTsKKwlzdHJ1Y3QgYWN0aW9uICphY3QsICphY3Rfc2FmZTsKKwl1aW50MzJfdCBsa192ZXJzaW9uOworCXVpbnQzMl90IHJfdmVyc2lvbjsKKwlpbnQgbGtfY291bnQgPSAwOworCWludCBydjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyLCByX3NhZmUsICZscy0+cmVzb3VyY2VzLCBsaXN0KSB7CisJCWxrX3ZlcnNpb24gPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaywgbGtfc2FmZSwgJnItPmxvY2tzLCBsaXN0KSB7CisJCQlsa19jb3VudCsrOworCisJCQkvKgorCQkJICogU3RvcHBpbmcgYSBsb2Nrc3BhY2Ugc2hvdWxkbid0IGhhcHBlbiB3aXRoIExWIGxvY2tzCisJCQkgKiBzdGlsbCBoZWxkLCBidXQgaXQgd2lsbCBiZSBzdG9wcGVkIHdpdGggR0wgYW5kIFZHCisJCQkgKiBsb2NrcyBoZWxkLiAgVGhlIGRyb3BfdmcgY2FzZSBtYXkgc2VlIExWIGxvY2tzLgorCQkJICovCisKKwkJCWlmIChsay0+ZmxhZ3MgJiBMRF9MRl9QRVJTSVNURU5UICYmICFkcm9wX3ZnKQorCQkJCWxvZ19lcnJvcigiUyAlcyBSICVzIGNsZWFyIGxvY2sgcGVyc2lzdGVudCIsIGxzLT5uYW1lLCByLT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBjbGVhciBsb2NrIG1vZGUgJXMgY2xpZW50ICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIG1vZGVfc3RyKGxrLT5tb2RlKSwgbGstPmNsaWVudF9pZCk7CisKKwkJCWlmIChsay0+dmVyc2lvbiA+IGxrX3ZlcnNpb24pCisJCQkJbGtfdmVyc2lvbiA9IGxrLT52ZXJzaW9uOworCisJCQlsaXN0X2RlbCgmbGstPmxpc3QpOworCQkJZnJlZV9sb2NrKGxrKTsKKwkJfQorCisJCWlmIChyLT5tb2RlID09IExEX0xLX1VOKQorCQkJZ290byByX2ZyZWU7CisKKwkJaWYgKChyLT50eXBlID09IExEX1JUX0dMKSAmJiAoci0+bW9kZSA9PSBMRF9MS19FWCkpIHsKKwkJCXItPnZlcnNpb24rKzsKKwkJCXJfdmVyc2lvbiA9IHItPnZlcnNpb247CisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBjbGVhcl9sb2NrcyByX3ZlcnNpb24gaW5jICV1IiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCByX3ZlcnNpb24pOworCisJCX0gZWxzZSBpZiAoKHItPnR5cGUgPT0gTERfUlRfVkcpICYmIChyLT5tb2RlID09IExEX0xLX0VYKSAmJiAobGtfdmVyc2lvbiA+IHItPnZlcnNpb24pKSB7CisJCQlyLT52ZXJzaW9uID0gbGtfdmVyc2lvbjsKKwkJCXJfdmVyc2lvbiA9IHItPnZlcnNpb247CisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBjbGVhcl9sb2NrcyByX3ZlcnNpb24gbmV3ICV1IiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCByX3ZlcnNpb24pOworCisJCX0gZWxzZSB7CisJCQlyX3ZlcnNpb24gPSAwOworCQl9CisKKwkJcnYgPSBsbV91bmxvY2sobHMsIHIsIE5VTEwsIHJfdmVyc2lvbiwgZnJlZV92ZyA/IExNVUZfRlJFRV9WRyA6IDApOworCQlpZiAocnYgPCAwKSB7CisJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBjbGVhcl9sb2NrcyBmcmVlICVkIGRyb3AgJWQgbG0gdW5sb2NrIGVycm9yICVkIiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBmcmVlX3ZnLCBkcm9wX3ZnLCBydik7CisJCX0KKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBhY3Rfc2FmZSwgJnItPmFjdGlvbnMsIGxpc3QpIHsKKwkJCWxvZ19lcnJvcigiUyAlcyBSICVzIGNsZWFyX2xvY2tzIGNhbmNlbCAlcyBjbGllbnQgJWQiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIG9wX3N0cihhY3QtPm9wKSwgYWN0LT5jbGllbnRfaWQpOworCQkJYWN0LT5yZXN1bHQgPSAtRUNBTkNFTEVEOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQl9Cisgcl9mcmVlOgorCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBmcmVlIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCQlsbV9yZW1fcmVzb3VyY2UobHMsIHIpOworCQlsaXN0X2RlbCgmci0+bGlzdCk7CisJCWZyZWVfcmVzb3VyY2Uocik7CisJfQorCisJcmV0dXJuIGxrX2NvdW50OworfQorCisvKgorICogZmluZCBhbmQgcmV0dXJuIHRoZSByZXNvdXJjZSB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGFjdGlvbgorICogLSB0aGVyZSBpcyBhIHNpbmdsZSBnbCByZXNvdXJjZSBwZXIgbG9ja3NwYWNlCisgKiAtIHRoZXJlIGlzIGEgc2luZ2xlIHZnIHJlc291cmNlIHBlciBsb2Nrc3BhY2UKKyAqIC0gdGhlcmUgY2FuIGJlIG1hbnkgbHYgcmVzb3VyY2VzIHBlciBsb2Nrc3BhY2UsIGNvbXBhcmUgbmFtZXMKKyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpmaW5kX3Jlc291cmNlX2FjdChzdHJ1Y3QgbG9ja3NwYWNlICpscywKKwkJCQkJICBzdHJ1Y3QgYWN0aW9uICphY3QsCisJCQkJCSAgaW50IG5vY3JlYXRlKQoreworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmxzLT5yZXNvdXJjZXMsIGxpc3QpIHsKKwkJaWYgKHItPnR5cGUgIT0gYWN0LT5ydCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyLT50eXBlID09IExEX1JUX0dMICYmIGFjdC0+cnQgPT0gTERfUlRfR0wpCisJCQlyZXR1cm4gcjsKKworCQlpZiAoci0+dHlwZSA9PSBMRF9SVF9WRyAmJiBhY3QtPnJ0ID09IExEX1JUX1ZHKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKHItPnR5cGUgPT0gTERfUlRfTFYgJiYgYWN0LT5ydCA9PSBMRF9SVF9MViAmJgorCQkgICAgIXN0cmNtcChyLT5uYW1lLCBhY3QtPmx2X3V1aWQpKQorCQkJcmV0dXJuIHI7CisJfQorCisJaWYgKG5vY3JlYXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHIgPSBhbGxvY19yZXNvdXJjZSgpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyLT50eXBlID0gYWN0LT5ydDsKKwlyLT5tb2RlID0gTERfTEtfVU47CisKKwlpZiAoci0+dHlwZSA9PSBMRF9SVF9HTCkgeworCQlzdHJuY3B5KHItPm5hbWUsIFJfTkFNRV9HTCwgTUFYX05BTUUpOworCQlyLT51c2VfdmIgPSAxOworCX0gZWxzZSBpZiAoci0+dHlwZSA9PSBMRF9SVF9WRykgeworCQlzdHJuY3B5KHItPm5hbWUsIFJfTkFNRV9WRywgTUFYX05BTUUpOworCQlyLT51c2VfdmIgPSAxOworCX0gZWxzZSBpZiAoci0+dHlwZSA9PSBMRF9SVF9MVikgeworCQlzdHJuY3B5KHItPm5hbWUsIGFjdC0+bHZfdXVpZCwgTUFYX05BTUUpOworCQlyLT51c2VfdmIgPSAwOworCX0KKworCWxpc3RfYWRkX3RhaWwoJnItPmxpc3QsICZscy0+cmVzb3VyY2VzKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xzX3Jlc291cmNlcyhzdHJ1Y3QgbG9ja3NwYWNlICpscykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpyX3NhZmU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9zYWZlLCAmbHMtPnJlc291cmNlcywgbGlzdCkgeworCQlsbV9yZW1fcmVzb3VyY2UobHMsIHIpOworCQlsaXN0X2RlbCgmci0+bGlzdCk7CisJCWZyZWVfcmVzb3VyY2Uocik7CisJfQorfQorCisvKgorICogbHMgaXMgdGhlIHZnIGJlaW5nIHJlbW92ZWQgdGhhdCBob2xkcyB0aGUgZ2xvYmFsIGxvY2suCisgKiBjaGVjayBpZiBhbnkgb3RoZXIgdmdzIHdpbGwgYmUgbGVmdCB3aXRob3V0IGEgZ2xvYmFsIGxvY2suCisgKi8KKworc3RhdGljIGludCBvdGhlcl9zYW5sb2NrX3Znc19leGlzdChzdHJ1Y3QgbG9ja3NwYWNlICpsc19yZW0pCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbG9ja3NwYWNlcywgbGlzdCkgeworCQlpZiAobHMtPmxtX3R5cGUgIT0gTERfTE1fU0FOTE9DSykKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cmNtcChscy0+bmFtZSwgbHNfcmVtLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlsb2dfZGVidWcoIm90aGVyIHNhbmxvY2sgdmcgZXhpc3RzICVzIiwgbHMtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExPQ0sgaXMgdGhlIG1haW4gdGhpbmcgd2UncmUgaW50ZXJlc3RlZCBpbjsgdGhlIG90aGVycyBhcmUgdW5saWtlbHkuCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX29wX2R1cmluZ19raWxsKHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlpZiAoYWN0LT5vcCA9PSBMRF9PUF9MT0NLICYmIGFjdC0+bW9kZSA9PSBMRF9MS19VTikKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKGFjdC0+b3ApIHsKKwljYXNlIExEX09QX0xPQ0s6CisJY2FzZSBMRF9PUF9FTkFCTEU6CisJY2FzZSBMRF9PUF9ESVNBQkxFOgorCWNhc2UgTERfT1BfVVBEQVRFOgorCWNhc2UgTERfT1BfUkVOQU1FX0JFRk9SRToKKwljYXNlIExEX09QX1JFTkFNRV9GSU5BTDoKKwljYXNlIExEX09QX0ZJTkRfRlJFRV9MT0NLOgorCQlyZXR1cm4gMDsKKwl9OworCXJldHVybiAxOworfQorCisvKgorICogUHJvY2VzcyBhY3Rpb25zIHF1ZXVlZCBmb3IgdGhpcyBsb2Nrc3BhY2UgYnkKKyAqIGNsaWVudF9yZWN2X2FjdGlvbiAvIGFkZF9sb2NrX2FjdGlvbi4KKyAqCisgKiBUaGUgbG9ja3NwYWNlX3RocmVhZCBjYW4gdG91Y2ggaXRzIG93biBscyBzdHJ1Y3Qgd2l0aG91dCBob2xkaW5nCisgKiBsb2Nrc3BhY2VzX211dGV4IHVudGlsIGl0IHNldHMgbHMtPnRocmVhZF9kb25lLCBhZnRlciB3aGljaCBpdAorICogY2Fubm90IHRvdWNoIGxzIHdpdGhvdXQgaG9sZGluZyBsb2Nrc3BhY2VzX211dGV4LgorICovCisKKyNkZWZpbmUgTE9DS19SRVRSWV9NUyAxMDAwIC8qIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZXR3ZWVuIHJldHJ5ICovCisKK3N0YXRpYyB2b2lkICpsb2Nrc3BhY2VfdGhyZWFkX21haW4odm9pZCAqYXJnX2luKQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzID0gYXJnX2luOworCXN0cnVjdCByZXNvdXJjZSAqciwgKnIyOworCXN0cnVjdCBhY3Rpb24gKmFkZF9hY3QsICphY3QsICpzYWZlOworCXN0cnVjdCBhY3Rpb24gKmFjdF9vcF9mcmVlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9hY3Q7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RfY2xvc2U7CisJY2hhciB0bXBfbmFtZVtNQVhfTkFNRSsxXTsKKwlpbnQgZnJlZV92ZyA9IDA7CisJaW50IGRyb3BfdmcgPSAwOworCWludCBlcnJvciA9IDA7CisJaW50IGFkb3B0X2ZsYWcgPSAwOworCWludCB3YWl0X2ZsYWcgPSAwOworCWludCByZXRyeTsKKwlpbnQgcnY7CisKKwlJTklUX0xJU1RfSEVBRCgmYWN0X2Nsb3NlKTsKKworCS8qIGZpcnN0IGFjdGlvbiBtYXkgYmUgY2xpZW50IGFkZCAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwlhY3QgPSBOVUxMOworCWFkZF9hY3QgPSBOVUxMOworCWlmICghbGlzdF9lbXB0eSgmbHMtPmFjdGlvbnMpKSB7CisJCWFjdCA9IGxpc3RfZmlyc3RfZW50cnkoJmxzLT5hY3Rpb25zLCBzdHJ1Y3QgYWN0aW9uLCBsaXN0KTsKKwkJaWYgKGFjdC0+b3AgPT0gTERfT1BfU1RBUlQpIHsKKwkJCWFkZF9hY3QgPSBhY3Q7CisJCQlsaXN0X2RlbCgmYWRkX2FjdC0+bGlzdCk7CisKKwkJCWlmIChhZGRfYWN0LT5mbGFncyAmIExEX0FGX1dBSVQpCisJCQkJd2FpdF9mbGFnID0gMTsKKwkJCWlmIChhZGRfYWN0LT5mbGFncyAmIExEX0FGX0FET1BUKQorCQkJCWFkb3B0X2ZsYWcgPSAxOworCQl9CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCisJbG9nX2RlYnVnKCJTICVzIGxtX2FkZF9sb2Nrc3BhY2UgJXMgd2FpdCAlZCBhZG9wdCAlZCIsCisJCSAgbHMtPm5hbWUsIGxtX3N0cihscy0+bG1fdHlwZSksIHdhaXRfZmxhZywgYWRvcHRfZmxhZyk7CisKKwkvKgorCSAqIFRoZSBwcmVwYXJlIHN0ZXAgZG9lcyBub3Qgd2FpdCBmb3IgYW55dGhpbmcgYW5kIGlzIHF1aWNrOworCSAqIGl0IHRlbGxzIHVzIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBhbmQgdGhlIGxtIGlzIHJ1bm5pbmcuCisJICovCisJZXJyb3IgPSBsbV9wcmVwYXJlX2xvY2tzcGFjZShscywgYWRkX2FjdCk7CisKKwlpZiAoYWRkX2FjdCAmJiAoIXdhaXRfZmxhZyB8fCBlcnJvcikpIHsKKwkJLyogc2VuZCBpbml0aWFsIGpvaW4gcmVzdWx0IGJhY2sgdG8gY2xpZW50ICovCisJCWFkZF9hY3QtPnJlc3VsdCA9IGVycm9yOworCQlhZGRfY2xpZW50X3Jlc3VsdChhZGRfYWN0KTsKKwkJYWRkX2FjdCA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBUaGUgYWN0dWFsIGxvY2tzcGFjZSBqb2luIGNhbiB0YWtlIGEgd2hpbGUuCisJICovCisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IGxtX2FkZF9sb2Nrc3BhY2UobHMsIGFkZF9hY3QsIGFkb3B0X2ZsYWcpOworCisJCWxvZ19kZWJ1ZygiUyAlcyBsbV9hZGRfbG9ja3NwYWNlIGRvbmUgJWQiLCBscy0+bmFtZSwgZXJyb3IpOworCisJCWlmIChscy0+c2FubG9ja19nbF9lbmFibGVkICYmIGdsX2xzbmFtZV9zYW5sb2NrWzBdICYmCisJCSAgICBzdHJjbXAobHMtPm5hbWUsIGdsX2xzbmFtZV9zYW5sb2NrKSkKKwkJCXNhbmxvY2tfZ2xfZHVwID0gMTsKKworCQlpZiAoYWRkX2FjdCkgeworCQkJLyogc2VuZCBmaW5hbCBqb2luIHJlc3VsdCBiYWNrIHRvIGNsaWVudCAqLworCQkJYWRkX2FjdC0+cmVzdWx0ID0gZXJyb3I7CisJCQlhZGRfY2xpZW50X3Jlc3VsdChhZGRfYWN0KTsKKwkJfQorCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwlpZiAoZXJyb3IpIHsKKwkJbHMtPnRocmVhZF9zdG9wID0gMTsKKwkJbHMtPmNyZWF0ZV9mYWlsID0gMTsKKwl9IGVsc2UgeworCQlscy0+Y3JlYXRlX2RvbmUgPSAxOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHMtPm11dGV4KTsKKworCWlmIChlcnJvcikKKwkJZ290byBvdXRfYWN0OworCisJd2hpbGUgKDEpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZscy0+bXV0ZXgpOworCQl3aGlsZSAoIWxzLT50aHJlYWRfd29yaykgeworCQkJaWYgKGxzLT50aHJlYWRfc3RvcCkgeworCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCQkJCWdvdG8gb3V0X3JlbTsKKwkJCX0KKwkJCXB0aHJlYWRfY29uZF93YWl0KCZscy0+Y29uZCwgJmxzLT5tdXRleCk7CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIGFsbCB0aGUgYWN0aW9ucyBxdWV1ZWQgZm9yIHRoaXMgbG9ja3NwYWNlLgorCQkgKiBUaGUgY2xpZW50IHRocmVhZCBxdWV1ZXMgYWN0aW9ucyBvbiBscy0+YWN0aW9ucy4KKwkJICoKKwkJICogSGVyZSwgdGFrZSBhbGwgdGhlIGFjdGlvbnMgb2ZmIG9mIGxzLT5hY3Rpb25zLCBhbmQ6CisJCSAqCisJCSAqIC0gRm9yIGxvY2sgb3BlcmF0aW9ucywgbW92ZSB0aGUgYWN0IHRvIHItPmFjdGlvbnMuCisJCSAqICAgVGhlc2UgbG9jayBhY3Rpb25zL29wZXJhdGlvbnMgcHJvY2Vzc2VkIGJ5IHJlc19wcm9jZXNzKCkuCisJCSAqCisJCSAqIC0gRm9yIG5vbi1sb2NrIG9wZXJhdGlvbnMsIGUuZy4gcmVsYXRlZCB0byBtYW5hZ2luZworCQkgKiAgIHRoZSBsb2Nrc3BhY2UsIHByb2Nlc3MgdGhlbSBpbiB0aGlzIGxvb3AuCisJCSAqLworCisJCXdoaWxlICgxKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmbHMtPmFjdGlvbnMpKSB7CisJCQkJbHMtPnRocmVhZF93b3JrID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYWN0ID0gbGlzdF9maXJzdF9lbnRyeSgmbHMtPmFjdGlvbnMsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCisJCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9LSUxMX1ZHICYmIGFjdC0+cnQgPT0gTERfUlRfVkcpIHsKKwkJCQkvKiBDb250aW51ZSBwcm9jZXNzaW5nIHVudGlsIERST1BfVkcgYXJyaXZlcy4gKi8KKwkJCQlsb2dfZGVidWcoIlMgJXMga2lsbF92ZyIsIGxzLT5uYW1lKTsKKwkJCQlscy0+a2lsbF92ZyA9IDE7CisJCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQkJYWN0LT5yZXN1bHQgPSAwOworCQkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChscy0+a2lsbF92ZyAmJiAhcHJvY2Vzc19vcF9kdXJpbmdfa2lsbChhY3QpKSB7CisJCQkJbG9nX2RlYnVnKCJTICVzIGRpc2FsbG93IG9wICVzIGFmdGVyIGtpbGxfdmciLCBscy0+bmFtZSwgb3Bfc3RyKGFjdC0+b3ApKTsKKwkJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCQlhY3QtPnJlc3VsdCA9IC1FVkdLSUxMRUQ7CisJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGFjdC0+b3AgPT0gTERfT1BfRFJPUF9WRyAmJiBhY3QtPnJ0ID09IExEX1JUX1ZHKSB7CisJCQkJLyoKKwkJCQkgKiBJZiBsZWFzZXMgYXJlIHJlbGVhc2VkIGFmdGVyIGkvbyBlcnJvcnMgYmVnaW4KKwkJCQkgKiBidXQgYmVmb3JlIGx2bWxvY2tjdGwgLS1raWxsLCB0aGVuIHRoZSBWRyBpcyBub3QKKwkJCQkgKiBraWxsZWQsIGJ1dCBkcm9wIGlzIHN0aWxsIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUKKwkJCQkgKiBWRywgc28gaW4gdGhhdCBjYXNlIHRoZXJlIHdvdWxkIGJlIGEgZHJvcCBvcCB3aXRob3V0CisJCQkJICogYSBwcmVjZWRpbmcga2lsbCBvcC4KKwkJCQkgKi8KKwkJCQlpZiAoIWxzLT5raWxsX3ZnKQorCQkJCQlsb2dfZGVidWcoIlMgJXMgcmVjZWl2ZWQgZHJvcCB3aXRob3V0IGtpbGwiLCBscy0+bmFtZSk7CisJCQkJbG9nX2RlYnVnKCJTICVzIGRyb3BfdmciLCBscy0+bmFtZSk7CisJCQkJbHMtPnRocmVhZF93b3JrID0gMDsKKwkJCQlscy0+dGhyZWFkX3N0b3AgPSAxOworCQkJCWRyb3BfdmcgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9TVE9QKSB7CisJCQkJLyogdGhyZWFkX3N0b3AgaXMgYWxyZWFkeSBzZXQgKi8KKwkJCQlscy0+dGhyZWFkX3dvcmsgPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9GUkVFICYmIGFjdC0+cnQgPT0gTERfUlRfVkcpIHsKKwkJCQkvKiB2Z3JlbW92ZSAqLworCQkJCWxvZ19kZWJ1ZygiUyAlcyBjaGVja2luZyBmb3IgbG9ja3NwYWNlIGhvc3RzIiwgbHMtPm5hbWUpOworCQkJCXJ2ID0gbG1faG9zdHMobHMsIDEpOworCQkJCWlmIChydikgeworCQkJCQkvKgorCQkJCQkgKiBDaGVja2luZyBmb3IgaG9zdHMgaGVyZSBpbiBhZGRpdGlvbiB0byBhZnRlciB0aGUKKwkJCQkJICogbWFpbiBsb29wIGFsbG93cyB2Z3JlbW92ZSB0byBmYWlsIGFuZCBiZSByZXJ1bgorCQkJCQkgKiBhZnRlciB0aGUgbHMgaXMgc3RvcHBlZCBvbiBvdGhlciBob3N0cy4KKwkJCQkJICovCisJCQkJCWxvZ19lcnJvcigiUyAlcyBsb2Nrc3BhY2UgaG9zdHMgJWQiLCBscy0+bmFtZSwgcnYpOworCQkJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCQkJYWN0LT5yZXN1bHQgPSAtRUJVU1k7CisJCQkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlscy0+dGhyZWFkX3dvcmsgPSAwOworCQkJCWxzLT50aHJlYWRfc3RvcCA9IDE7CisJCQkJZnJlZV92ZyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChhY3QtPm9wID09IExEX09QX0JVU1kgJiYgYWN0LT5ydCA9PSBMRF9SVF9WRykgeworCQkJCWxvZ19kZWJ1ZygiUyAlcyBjaGVja2luZyBpZiBsb2Nrc3BhY2UgaXMgYnVzeSIsIGxzLT5uYW1lKTsKKwkJCQlydiA9IGxtX2hvc3RzKGxzLCAwKTsKKwkJCQlpZiAocnYpCisJCQkJCWFjdC0+cmVzdWx0ID0gLUVCVVNZOworCQkJCWVsc2UKKwkJCQkJYWN0LT5yZXN1bHQgPSAwOworCQkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChhY3QtPm9wID09IExEX09QX1JFTkFNRV9CRUZPUkUgJiYgYWN0LT5ydCA9PSBMRF9SVF9WRykgeworCQkJCS8qIHZncmVuYW1lICovCisJCQkJbG9nX2RlYnVnKCJTICVzIGNoZWNraW5nIGZvciBsb2Nrc3BhY2UgaG9zdHMiLCBscy0+bmFtZSk7CisJCQkJcnYgPSBsbV9ob3N0cyhscywgMSk7CisJCQkJaWYgKHJ2KSB7CisJCQkJCWxvZ19lcnJvcigiUyAlcyBsb2Nrc3BhY2UgaG9zdHMgJWQiLCBscy0+bmFtZSwgcnYpOworCQkJCQlsaXN0X2RlbCgmYWN0LT5saXN0KTsKKwkJCQkJYWN0LT5yZXN1bHQgPSAtRUJVU1k7CisJCQkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlscy0+dGhyZWFkX3dvcmsgPSAwOworCQkJCWxzLT50aHJlYWRfc3RvcCA9IDE7CisJCQkJLyogRG8gd2Ugd2FudCB0byBjaGVjayBob3N0cyBhZ2FpbiBiZWxvdyBsaWtlIHZncmVtb3ZlPyAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9GSU5EX0ZSRUVfTE9DSyAmJiBhY3QtPnJ0ID09IExEX1JUX1ZHKSB7CisJCQkJdWludDY0X3QgZnJlZV9vZmZzZXQgPSAwOworCQkJCWxvZ19kZWJ1ZygiUyAlcyBmaW5kIGZyZWUgbG9jayIsIGxzLT5uYW1lKTsKKwkJCQlydiA9IGxtX2ZpbmRfZnJlZV9sb2NrKGxzLCAmZnJlZV9vZmZzZXQpOworCQkJCWxvZ19kZWJ1ZygiUyAlcyBmaW5kIGZyZWUgbG9jayAlZCBvZmZzZXQgJWxsdSIsCisJCQkJCSAgbHMtPm5hbWUsIHJ2LCAodW5zaWduZWQgbG9uZyBsb25nKWZyZWVfb2Zmc2V0KTsKKwkJCQlscy0+ZnJlZV9sb2NrX29mZnNldCA9IGZyZWVfb2Zmc2V0OworCQkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJCWFjdC0+cmVzdWx0ID0gcnY7CisJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisKKwkJCS8qIGFwcGxpZXMgdG8gYWxsIHJlc291cmNlcyAqLworCQkJaWYgKGFjdC0+b3AgPT0gTERfT1BfQ0xPU0UpIHsKKwkJCQlsaXN0X2FkZCgmYWN0LT5saXN0LCAmYWN0X2Nsb3NlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEFsbCB0aGUgb3RoZXIgb3AncyBhcmUgZm9yIGxvY2tpbmcuCisJCQkgKiBGaW5kIHRoZSBzcGVjaWZpYyByZXNvdXJjZSB0aGF0IHRoZSBsb2NrIG9wIGlzIGZvciwKKwkJCSAqIGFuZCBhZGQgdGhlIGFjdCB0byB0aGUgcmVzb3VyY2UncyBsaXN0IG9mIGxvY2sgb3BzLgorCQkJICoKKwkJCSAqIChUaGlzIGNyZWF0ZXMgYSBuZXcgcmVzb3VyY2UgaWYgdGhlIG9uZSBuYW1lZCBpbgorCQkJICogdGhlIGFjdCBpcyBub3QgZm91bmQuKQorCQkJICovCisKKwkJCXIgPSBmaW5kX3Jlc291cmNlX2FjdChscywgYWN0LCAoYWN0LT5vcCA9PSBMRF9PUF9GUkVFKSA/IDEgOiAwKTsKKwkJCWlmICghcikgeworCQkJCWFjdC0+cmVzdWx0ID0gKGFjdC0+b3AgPT0gTERfT1BfRlJFRSkgPyAtRU5PRU5UIDogLUVOT01FTTsKKwkJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlsaXN0X2FkZF90YWlsKCZhY3QtPmxpc3QsICZyLT5hY3Rpb25zKTsKKworCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgYWN0aW9uICVzICVzIiwgbHMtPm5hbWUsIHItPm5hbWUsCisJCQkJICBvcF9zdHIoYWN0LT5vcCksIG1vZGVfc3RyKGFjdC0+bW9kZSkpOworCQl9CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCisJCS8qCisJCSAqIFByb2Nlc3MgdGhlIGxvY2sgb3BlcmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGVhY2gKKwkJICogcmVzb3VyY2UuCisJCSAqLworCisJCXJldHJ5ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcjIsICZscy0+cmVzb3VyY2VzLCBsaXN0KQorCQkJcmVzX3Byb2Nlc3MobHMsIHIsICZhY3RfY2xvc2UsICZyZXRyeSk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgc2FmZSwgJmFjdF9jbG9zZSwgbGlzdCkgeworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQlmcmVlX2FjdGlvbihhY3QpOworCQl9CisKKwkJaWYgKHJldHJ5KSB7CisJCQlscy0+dGhyZWFkX3dvcmsgPSAxOworCQkJdXNsZWVwKExPQ0tfUkVUUllfTVMgKiAxMDAwKTsKKwkJfQorCX0KKworb3V0X3JlbToKKwlsb2dfZGVidWcoIlMgJXMgc3RvcHBpbmciLCBscy0+bmFtZSk7CisKKwkvKgorCSAqIEZvciBzYW5sb2NrLCB3ZSBuZWVkIHRvIHVubG9jayBhbnkgZXhpc3RpbmcgbG9ja3MKKwkgKiBiZWZvcmUgcmVtb3ZpbmcgdGhlIGxvY2tzcGFjZSwgb3RoZXJ3aXNlIHRoZSBzYW5sb2NrCisJICogZGFlbW9uIHdpbGwga2lsbCB1cyB3aGVuIHRoZSBsb2Nrc3BhY2UgZ29lcyBhd2F5LgorCSAqIEZvciBkbG0sIHdlIGxlYXZlIHdpdGggZm9yY2UsIHNvIGFsbCBsb2NrcyB3aWxsCisJICogYXV0b21hdGljYWxseSBiZSBkcm9wcGVkIHdoZW4gd2UgbGVhdmUgdGhlIGxvY2tzcGFjZSwKKwkgKiBzbyB1bmxvY2tpbmcgYWxsIGJlZm9yZSBsZWF2aW5nIGNvdWxkIGJlIHNraXBwZWQuCisJICoKKwkgKiBCbGluZGx5IGRyb3BwaW5nIGFsbCBleGlzdGluZyBsb2NrcyBtdXN0IG9ubHkgYmUKKwkgKiBhbGxvd2VkIGluIGVtZXJnZW5jeS9mb3JjZSBzaXR1YXRpb25zLCBvdGhlcndpc2UgaXQncworCSAqIG9idmlvdXNseSBkYW5nZXJvdXMsIHNpbmNlIHRoZSBsb2NrIGhvbGRlcnMgYXJlIHN0aWxsCisJICogb3BlcmF0aW5nIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhleSBob2xkIHRoZSBsb2NrLgorCSAqIGRyb3BfdmcgZHJvcHMgYWxsIGV4aXN0aW5nIGxvY2tzLCBidXQgc2hvdWxkIG9ubHkKKwkgKiBoYXBwZW4gd2hlbiB0aGUgVkcgYWNjZXNzIGhhcyBiZWVuIGZvcmNpYmx5IGFuZAorCSAqIHN1Y2Nlc2Z1bGx5IHRlcm1pbmF0ZWQuCisJICoKKwkgKiBGb3IgdmdyZW1vdmUgb2YgYSBzYW5sb2NrIHZnLCB0aGUgdmcgbG9jayB3aWxsIGJlIGhlbGQsCisJICogYW5kIHBvc3NpYmx5IHRoZSBnbCBsb2NrIGlmIHRoaXMgdmcgaG9sZHMgdGhlIGdsLgorCSAqIHNhbmxvY2sgdmdyZW1vdmUgd2FudHMgdG8gdW5sb2NrLXJlbmFtZSB0aGVzZSBsb2Nrcy4KKwkgKi8KKworCWxvZ19kZWJ1ZygiUyAlcyBjbGVhcmluZyBsb2NrcyIsIGxzLT5uYW1lKTsKKworCXJ2ID0gY2xlYXJfbG9ja3MobHMsIGZyZWVfdmcsIGRyb3BfdmcpOworCisJLyoKKwkgKiBUZWxsIGFueSBvdGhlciBob3N0cyBpbiB0aGUgbG9ja3NwYWNlIHRvIGxlYXZlIGl0CisJICogYmVmb3JlIHdlIHJlbW92ZSBpdCAoZm9yIHZncmVtb3ZlKS4gIFdlIGRvIHRoaXMKKwkgKiBiZWZvcmUgbGVhdmluZyB0aGUgbG9ja3NwYWNlIG91cnNlbGYgYmVjYXVzZSB3ZQorCSAqIG5lZWQgdG8gYmUgaW4gdGhlIGxvY2tzcGFjZSB0byBzZWUgb3RoZXJzLgorCSAqLworCisJaWYgKGZyZWVfdmcpIHsKKwkJbG9nX2RlYnVnKCJTICVzIGNoZWNraW5nIGZvciBsb2Nrc3BhY2UgaG9zdHMiLCBscy0+bmFtZSk7CisJCXJ2ID0gbG1faG9zdHMobHMsIDEpOworCQlpZiAocnYpCisJCQlsb2dfZXJyb3IoIlMgJXMgb3RoZXIgbG9ja3NwYWNlIGhvc3RzICVkIiwgbHMtPm5hbWUsIHJ2KTsKKwl9CisKKwkvKgorCSAqIExlYXZlIHRoZSBsb2Nrc3BhY2UuCisJICovCisKKwlydiA9IGxtX3JlbV9sb2Nrc3BhY2UobHMsIE5VTEwsIGZyZWVfdmcpOworCisJbG9nX2RlYnVnKCJTICVzIHJlbV9sb2Nrc3BhY2UgZG9uZSAlZCIsIGxzLT5uYW1lLCBydik7CisKK291dF9hY3Q6CisJLyoKKwkgKiBNb3ZlIHJlbWFpbmluZyBhY3Rpb25zIHRvIHJlc3VsdHM7IHRoaXMgd2lsbCB1c3VhbGx5IChhbHdheXM/KQorCSAqIGJlIG9ubHkgdGhlIHN0b3AgYWN0aW9uLgorCSAqLworCUlOSVRfTElTVF9IRUFEKCZ0bXBfYWN0KTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmbHMtPmFjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGFjdC0+b3AgPT0gTERfT1BfRlJFRSkgeworCQkJYWN0X29wX2ZyZWUgPSBhY3Q7CisJCQlhY3QtPnJlc3VsdCA9IDA7CisJCX0gZWxzZSBpZiAoYWN0LT5vcCA9PSBMRF9PUF9TVE9QKQorCQkJYWN0LT5yZXN1bHQgPSAwOworCQllbHNlIGlmIChhY3QtPm9wID09IExEX09QX0RST1BfVkcpCisJCQlhY3QtPnJlc3VsdCA9IDA7CisJCWVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfUkVOQU1FX0JFRk9SRSkKKwkJCWFjdC0+cmVzdWx0ID0gMDsKKwkJZWxzZQorCQkJYWN0LT5yZXN1bHQgPSAtRU5PTFM7CisJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZhY3QtPmxpc3QsICZ0bXBfYWN0KTsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxzLT5tdXRleCk7CisKKwkvKgorCSAqIElmIHRoaXMgZnJlZWQgYSBzYW5sb2NrIHZnIHRoYXQgaGFkIGdsIGVuYWJsZWQsIGFuZCBvdGhlciBzYW5sb2NrCisJICogdmdzIGV4aXN0LCByZXR1cm4gYSBmbGFnIHNvIHRoZSBjb21tYW5kIGNhbiB3YXJuIHRoYXQgdGhlIGdsIGhhcworCSAqIGJlZW4gcmVtb3ZlZCBhbmQgbWF5IG5lZWQgdG8gYmUgZW5hYmxlZCBpbiBhbm90aGVyIHNhbmxvY2sgdmcuCisJICovCisKKwlpZiAoZnJlZV92ZyAmJiBscy0+c2FubG9ja19nbF9lbmFibGVkICYmIGFjdF9vcF9mcmVlKSB7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCWlmIChvdGhlcl9zYW5sb2NrX3Znc19leGlzdChscykpIHsKKwkJCWFjdF9vcF9mcmVlLT5mbGFncyB8PSBMRF9BRl9XQVJOX0dMX1JFTU9WRUQ7CisJCQlnbF92Z19yZW1vdmVkID0gMTsKKwkJfQorCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3QsIHNhZmUsICZ0bXBfYWN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZhY3QtPmxpc3QsICZjbGllbnRfcmVzdWx0cyk7CisJfQorCXB0aHJlYWRfY29uZF9zaWduYWwoJmNsaWVudF9jb25kKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJbHMtPnRocmVhZF9kb25lID0gMTsKKwlscy0+ZnJlZV92ZyA9IGZyZWVfdmc7CisJbHMtPmRyb3BfdmcgPSBkcm9wX3ZnOworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0gJiYgIXN0cmNtcChscy0+bmFtZSwgZ2xfbHNuYW1lX2RsbSkpCisJCWdsb2JhbF9kbG1fbG9ja3NwYWNlX2V4aXN0cyA9IDA7CisJLyogQXZvaWQgYSBuYW1lIGNvbGxpc2lvbiBvZiB0aGUgc2FtZSBsb2Nrc3BhY2UgaXMgYWRkZWQgYWdhaW4gYmVmb3JlIHRoaXMgdGhyZWFkIGlzIGNsZWFuZWQgdXAuICovCisJbWVtc2V0KHRtcF9uYW1lLCAwLCBzaXplb2YodG1wX25hbWUpKTsKKwlzbnByaW50Zih0bXBfbmFtZSwgTUFYX05BTUUsICJSRU06JXMiLCBscy0+bmFtZSk7CisJbWVtY3B5KGxzLT5uYW1lLCB0bXBfbmFtZSwgTUFYX05BTUUpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKworCS8qIHdvcmtlcl90aHJlYWQgd2lsbCBqb2luIHRoaXMgdGhyZWFkLCBhbmQgZnJlZSB0aGUgbHMgKi8KKwlwdGhyZWFkX211dGV4X2xvY2soJndvcmtlcl9tdXRleCk7CisJd29ya2VyX3dha2UgPSAxOworCXB0aHJlYWRfY29uZF9zaWduYWwoJndvcmtlcl9jb25kKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyX211dGV4KTsKKworCXJldHVybiBOVUxMOworfQorCitpbnQgbG9ja3NwYWNlc19lbXB0eSh2b2lkKQoreworCWludCBydjsKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCXJ2ID0gbGlzdF9lbXB0eSgmbG9ja3NwYWNlcyk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCXJldHVybiBydjsKK30KKworLyoKKyAqIGxvY2tzcGFjZXNfbXV0ZXggaXMgbG9ja2VkCisgKgorICogV2hlbiBkdXBsaWNhdGUgc2FubG9jayBnbG9iYWwgbG9ja3MgaGF2ZSBiZWVuIHNlZW4sCisgKiB0aGlzIGZ1bmN0aW9uIGhhcyBhIHNlY29uZGFyeSBqb2Igb2YgY291bnRpbmcgdGhlCisgKiBudW1iZXIgb2YgbG9ja3NwYWNlcyB0aGF0IGV4aXN0IHdpdGggdGhlIGdsIGVuYWJsZWQsCisgKiB3aXRoIHRoZSBzaWRlIGVmZmVjdCBvZiBzZXR0aW5nIHNhbmxvY2tfZ2xfZHVwIGJhY2sgdG8KKyAqIHplcm8gd2hlbiB0aGUgZHVwbGljYXRlcyBoYXZlIGJlZW4gcmVtb3ZlZC9kaXNhYmxlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IGxvY2tzcGFjZSAqZmluZF9sb2Nrc3BhY2VfbmFtZShjaGFyICpsc19uYW1lKQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzX2ZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgbG9ja3NwYWNlICpsczsKKwlpbnQgZ2xfY291bnQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJmxvY2tzcGFjZXMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAobHMtPm5hbWUsIGxzX25hbWUpKQorCQkJbHNfZm91bmQgPSBsczsKKworCQlpZiAoIXNhbmxvY2tfZ2xfZHVwICYmIGxzX2ZvdW5kKQorCQkJcmV0dXJuIGxzX2ZvdW5kOworCisJCWlmIChzYW5sb2NrX2dsX2R1cCAmJiBscy0+c2FubG9ja19nbF9lbmFibGVkKQorCQkJZ2xfY291bnQrKzsKKwl9CisKKwkvKiB0aGlzIGlzIHRoZSBzaWRlIGVmZmVjdCB3ZSB3YW50IGZyb20gdGhpcyBmdW5jdGlvbiAqLworCWlmIChzYW5sb2NrX2dsX2R1cCAmJiBnbF9jb3VudCA8IDIpCisJCXNhbmxvY2tfZ2xfZHVwID0gMDsKKworCXJldHVybiBsc19mb3VuZDsKK30KKworLyoKKyAqIElmIGx2bV88dmdfbmFtZT4gaXMgbG9uZ2VyIHRoYW4gbWF4IGxvY2tzcGFjZSBuYW1lICg2NCkgd2UganVzdCBpZ25vcmUgdGhlCisgKiBleHRyYSBjaGFyYWN0ZXJzLiAgRm9yIHNhbmxvY2sgdmdzLCB0aGUgbmFtZSBpcyBzaG9ydGVuZWQgZnVydGhlciB0byA0OCBpbgorICogdGhlIHNhbmxvY2sgY29kZS4KKyAqLworCitzdGF0aWMgaW50IHZnX2xzX25hbWUoY29uc3QgY2hhciAqdmdfbmFtZSwgY2hhciAqbHNfbmFtZSkKK3sKKwlpZiAoc3RybGVuKHZnX25hbWUpICsgNCA+IE1BWF9OQU1FKSB7CisJCWxvZ19lcnJvcigidmcgbmFtZSB0b28gbG9uZyAlcyIsIHZnX25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYobHNfbmFtZSwgTUFYX05BTUUsICIlcyVzIiwgTFZNX0xTX1BSRUZJWCwgdmdfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FOiBhZGQgbXV0ZXggZm9yIGdsX2xzbmFtZV8gPyAqLworCitzdGF0aWMgdm9pZCBnbF9sc19uYW1lKGNoYXIgKmxzX25hbWUpCit7CisJaWYgKGdsX3VzZV9kbG0pCisJCW1lbWNweShsc19uYW1lLCBnbF9sc25hbWVfZGxtLCBNQVhfTkFNRSk7CisJZWxzZSBpZiAoZ2xfdXNlX3NhbmxvY2spCisJCW1lbWNweShsc19uYW1lLCBnbF9sc25hbWVfc2FubG9jaywgTUFYX05BTUUpOworCWVsc2UKKwkJbWVtc2V0KGxzX25hbWUsIDAsIE1BWF9OQU1FKTsKK30KKworLyoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yLCB0aGUgY2FsbGVyIG5lZWRzIHRvIGRlYWwKKyAqIHdpdGggYWN0IChpbiB0aGUgY2FzZXMgd2hlcmUgYWN0IGV4aXN0cykuCisgKi8KKworc3RhdGljIGludCBhZGRfbG9ja3NwYWNlX3RocmVhZChjb25zdCBjaGFyICpsc19uYW1lLAorCQkJCWNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJY29uc3QgY2hhciAqdmdfdXVpZCwKKwkJCQlpbnQgbG1fdHlwZSwgY29uc3QgY2hhciAqdmdfYXJncywKKwkJCQlzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHMsICpsczI7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCBydjsKKworCWxvZ19kZWJ1ZygiYWRkX2xvY2tzcGFjZV90aHJlYWQgJXMgJXMgdmVyc2lvbiAldSIsCisJCSAgbG1fc3RyKGxtX3R5cGUpLCBsc19uYW1lLCBhY3QgPyBhY3QtPnZlcnNpb24gOiAwKTsKKworCWlmICghKGxzID0gYWxsb2NfbG9ja3NwYWNlKCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cm5jcHkobHMtPm5hbWUsIGxzX25hbWUsIE1BWF9OQU1FKTsKKwlscy0+bG1fdHlwZSA9IGxtX3R5cGU7CisKKwlpZiAoYWN0KQorCQlscy0+c3RhcnRfY2xpZW50X2lkID0gYWN0LT5jbGllbnRfaWQ7CisKKwlpZiAodmdfdXVpZCkKKwkJc3RybmNweShscy0+dmdfdXVpZCwgdmdfdXVpZCwgNjQpOworCisJaWYgKHZnX25hbWUpCisJCXN0cm5jcHkobHMtPnZnX25hbWUsIHZnX25hbWUsIE1BWF9OQU1FKTsKKworCWlmICh2Z19hcmdzKQorCQlzdHJuY3B5KGxzLT52Z19hcmdzLCB2Z19hcmdzLCBNQVhfQVJHUyk7CisKKwlpZiAoYWN0KQorCQlscy0+aG9zdF9pZCA9IGFjdC0+aG9zdF9pZDsKKworCWlmICghKHIgPSBhbGxvY19yZXNvdXJjZSgpKSkgeworCQlmcmVlKGxzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJci0+dHlwZSA9IExEX1JUX1ZHOworCXItPm1vZGUgPSBMRF9MS19VTjsKKwlyLT51c2VfdmIgPSAxOworCXN0cm5jcHkoci0+bmFtZSwgUl9OQU1FX1ZHLCBNQVhfTkFNRSk7CisJbGlzdF9hZGRfdGFpbCgmci0+bGlzdCwgJmxzLT5yZXNvdXJjZXMpOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwlsczIgPSBmaW5kX2xvY2tzcGFjZV9uYW1lKGxzLT5uYW1lKTsKKwlpZiAobHMyKSB7CisJCWlmIChsczItPnRocmVhZF9zdG9wKSB7CisJCQlsb2dfZGVidWcoImFkZF9sb2Nrc3BhY2VfdGhyZWFkICVzIGV4aXN0cyBhbmQgc3RvcHBpbmciLCBscy0+bmFtZSk7CisJCQlydiA9IC1FQUdBSU47CisJCX0gZWxzZSB7CisJCQlsb2dfZGVidWcoImFkZF9sb2Nrc3BhY2VfdGhyZWFkICVzIGV4aXN0cyIsIGxzLT5uYW1lKTsKKwkJCXJ2ID0gLUVFWElTVDsKKwkJfQorCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCWZyZWVfcmVzb3VyY2Uocik7CisJCWZyZWUobHMpOworCQlyZXR1cm4gcnY7CisJfQorCisJLyoKKwkgKiBhY3Qgd2lsbCBiZSBudWxsIHdoZW4gdGhpcyBsb2Nrc3BhY2UgaXMgYWRkZWQgYXV0b21hdGljYWxseS9pbnRlcm5hbGx5CisJICogYW5kIG5vdCBieSBhbiBleHBsaWNpdCBjbGllbnQgYWN0aW9uIHRoYXQgd2FudHMgYSByZXN1bHQuCisJICovCisJaWYgKGFjdCkKKwkJbGlzdF9hZGQoJmFjdC0+bGlzdCwgJmxzLT5hY3Rpb25zKTsKKworCWlmIChscy0+bG1fdHlwZSA9PSBMRF9MTV9ETE0gJiYgIXN0cmNtcChscy0+bmFtZSwgZ2xfbHNuYW1lX2RsbSkpCisJCWdsb2JhbF9kbG1fbG9ja3NwYWNlX2V4aXN0cyA9IDE7CisJbGlzdF9hZGRfdGFpbCgmbHMtPmxpc3QsICZsb2Nrc3BhY2VzKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisKKwlydiA9IHB0aHJlYWRfY3JlYXRlKCZscy0+dGhyZWFkLCBOVUxMLCBsb2Nrc3BhY2VfdGhyZWFkX21haW4sIGxzKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiYWRkX2xvY2tzcGFjZV90aHJlYWQgJXMgcHRocmVhZCBlcnJvciAlZCAlZCIsIGxzLT5uYW1lLCBydiwgZXJybm8pOworCQlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCQlsaXN0X2RlbCgmbHMtPmxpc3QpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCWZyZWVfcmVzb3VyY2Uocik7CisJCWZyZWUobHMpOworCQlyZXR1cm4gcnY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVyZSBpcyBubyBhZGRfc2FubG9ja19nbG9iYWxfbG9ja3NwYWNlIG9yCisgKiByZW1fc2FubG9ja19nbG9iYWxfbG9ja3NwYWNlIGJlY2F1c2Ugd2l0aCBzYW5sb2NrLAorICogdGhlIGdsb2JhbCBsb2Nrc3BhY2UgaXMgb25lIG9mIHRoZSB2ZyBsb2Nrc3BhY2VzLgorICovCisKK3N0YXRpYyBpbnQgYWRkX2RsbV9nbG9iYWxfbG9ja3NwYWNlKHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlpbnQgcnY7CisKKwlpZiAoZ2xvYmFsX2RsbV9sb2Nrc3BhY2VfZXhpc3RzKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRklYTUU6IGlmIHRoZSBkbG0gZ2xvYmFsIGxvY2tzcGFjZSBpcyBzdGFydGVkIHdpdGhvdXQgYSBnbG9iYWwKKwkgKiBsb2NrIHJlcXVlc3QsIGluc2VydCBhbiBpbnRlcm5hbCBnbCBzaCBsb2NrIHJlcXVlc3Q/CisJICovCisKKwlydiA9IGFkZF9sb2Nrc3BhY2VfdGhyZWFkKGdsX2xzbmFtZV9kbG0sIE5VTEwsIE5VTEwsIExEX0xNX0RMTSwgTlVMTCwgYWN0KTsKKwlpZiAocnYgPCAwKQorCQlsb2dfZGVidWcoImFkZF9kbG1fZ2xvYmFsX2xvY2tzcGFjZSBhZGRfbG9ja3NwYWNlX3RocmVhZCAlZCIsIHJ2KTsKKworCS8qCisJICogRUFHQUlOIG1heSBiZSByZXR1cm5lZCBmb3IgYSBzaG9ydCBwZXJpb2QgYmVjYXVzZQorCSAqIGdsb2JhbF9kbG1fbG9ja3NwYWNlX2V4aXN0cyBpcyBzZXQgdG8gMCBiZWZvcmUgdGhlCisJICogbHMgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsb2Nrc3BhY2VzIGxpc3QgYnkgdGhlCisJICogd29ya2VyX3RocmVhZC4KKwkgKi8KKworCXJldHVybiBydjsKK30KKworLyoKKyAqIElmIGRsbSBnbCBsb2Nrc3BhY2UgaXMgdGhlIG9ubHkgb25lIGxlZnQsIHRoZW4gc3RvcCBpdC4KKyAqIFRoaXMgaXMgbm90IHVzZWQgZm9yIGFuIGV4cGxpY2l0IHJlbV9sb2Nrc3BhY2UgYWN0aW9uIGZyb20KKyAqIHRoZSBjbGllbnQsIG9ubHkgZm9yIGF1dG8gcmVtb3ZlLgorICovCisKK3N0YXRpYyBpbnQgcmVtX2RsbV9nbG9iYWxfbG9ja3NwYWNlKHZvaWQpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHMsICpsc19nbCA9IE5VTEw7CisJaW50IG90aGVycyA9IDA7CisJaW50IHJ2ID0gMDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJmxvY2tzcGFjZXMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAobHMtPm5hbWUsIGdsX2xzbmFtZV9kbG0pKSB7CisJCQlsc19nbCA9IGxzOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxzLT50aHJlYWRfc3RvcCkKKwkJCWNvbnRpbnVlOworCQlvdGhlcnMrKzsKKwkJYnJlYWs7CisJfQorCisJaWYgKG90aGVycykgeworCQlydiA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbHNfZ2wpIHsKKwkJcnYgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwlscyA9IGxzX2dsOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwlscy0+dGhyZWFkX3N0b3AgPSAxOworCWxzLT50aHJlYWRfd29yayA9IDE7CisJcHRocmVhZF9jb25kX3NpZ25hbCgmbHMtPmNvbmQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCXJ2ID0gMDsKK291dDoKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogV2hlbiB0aGUgZmlyc3QgZGxtIGxvY2tzcGFjZSBpcyBhZGRlZCBmb3IgYSB2ZywgYXV0b21hdGljYWxseSBhZGQgYSBzZXBhcmF0ZQorICogZGxtIGxvY2tzcGFjZSBmb3IgdGhlIGdsb2JhbCBsb2NrLgorICoKKyAqIEZvciBzYW5sb2NrLCBhIHNlcGFyYXRlIGxvY2tzcGFjZSBpcyBub3QgdXNlZCBmb3IgdGhlIGdsb2JhbCBsb2NrLCBidXQgdGhlCisgKiBnbCBsb2NrIGxpdmVzIGluIGEgdmcgbG9ja3NwYWNlLCAoYWx0aG91Z2ggaXQncyByZWNvbW1lbmRlZCB0byBjcmVhdGUgYQorICogc3BlY2lhbCB2ZyBkZWRpY2F0ZWQgdG8gaG9sZGluZyB0aGUgZ2wpLgorICovCisKK3N0YXRpYyBpbnQgYWRkX2xvY2tzcGFjZShzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJY2hhciBsc19uYW1lW01BWF9OQU1FKzFdOworCWludCBydjsKKworCW1lbXNldChsc19uYW1lLCAwLCBzaXplb2YobHNfbmFtZSkpOworCisJLyoKKwkgKiBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIGlzIHVzZWQgYW55IG1vcmUuCisJICogUmVtb3ZlIGl0LCBvciBhZGQgdGhlIGFiaWxpdHkgdG8gc3RhcnQgdGhlIGdsb2JhbAorCSAqIGRsbSBsb2Nrc3BhY2UgdXNpbmcgbHZtbG9ja2N0bD8KKwkgKi8KKwlpZiAoYWN0LT5ydCA9PSBMRF9SVF9HTCkgeworCQlpZiAoZ2xfdXNlX2RsbSkgeworCQkJcnYgPSBhZGRfZGxtX2dsb2JhbF9sb2Nrc3BhY2UoYWN0KTsKKwkJCXJldHVybiBydjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGFjdC0+cnQgPT0gTERfUlRfVkcpIHsKKwkJaWYgKGdsX3VzZV9kbG0pCisJCQlhZGRfZGxtX2dsb2JhbF9sb2Nrc3BhY2UoTlVMTCk7CisKKwkJdmdfbHNfbmFtZShhY3QtPnZnX25hbWUsIGxzX25hbWUpOworCisJCXJ2ID0gYWRkX2xvY2tzcGFjZV90aHJlYWQobHNfbmFtZSwgYWN0LT52Z19uYW1lLCBhY3QtPnZnX3V1aWQsCisJCQkJCSAgYWN0LT5sbV90eXBlLCBhY3QtPnZnX2FyZ3MsCisJCQkJCSAgYWN0KTsKKwkJaWYgKHJ2KQorCQkJbG9nX2RlYnVnKCJhZGRfbG9ja3NwYWNlICVzIGFkZF9sb2Nrc3BhY2VfdGhyZWFkICVkIiwgbHNfbmFtZSwgcnYpOworCQlyZXR1cm4gcnY7CisJfQorCisJbG9nX2Vycm9yKCJhZGRfbG9ja3NwYWNlIGJhZCB0eXBlICVkIiwgYWN0LT5ydCk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogdmdjaGFuZ2UgLS1sb2NrLXN0b3AgdmduYW1lIHdpbGwgbG9jayB0aGUgdmcgZXgsIHRoZW4gc2VuZCBhIHN0b3AsCisgKiBzbyB3ZSBleGVjdCB0byBmaW5kIHRoZSBleCB2ZyBsb2NrIGhlbGQgaGVyZSwgYW5kIHdpbGwgYXV0b21hdGljYWxseQorICogdW5sb2NrIGl0IHdoZW4gc3RvcHBpbmcuCisgKgorICogU2hvdWxkIHdlIGF0dGVtcHQgdG8gc3RvcCB0aGUgbG9ja3NwYWNlIGNvbnRhaW5pbmcgdGhlIGdsIGxhc3Q/CisgKi8KKworc3RhdGljIGludCByZW1fbG9ja3NwYWNlKHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwlzdHJ1Y3QgbG9ja3NwYWNlICpsczsKKwljaGFyIGxzX25hbWVbTUFYX05BTUUrMV07CisJaW50IGZvcmNlID0gYWN0LT5mbGFncyAmIExEX0FGX0ZPUkNFOworCWludCBydCA9IGFjdC0+cnQ7CisKKwlpZiAoYWN0LT5ydCA9PSBMRF9SVF9HTCAmJiBhY3QtPmxtX3R5cGUgIT0gTERfTE1fRExNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChsc19uYW1lLCAwLCBzaXplb2YobHNfbmFtZSkpOworCisJaWYgKGFjdC0+cnQgPT0gTERfUlRfR0wpCisJCWdsX2xzX25hbWUobHNfbmFtZSk7CisJZWxzZQorCQl2Z19sc19uYW1lKGFjdC0+dmdfbmFtZSwgbHNfbmFtZSk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCWxzID0gZmluZF9sb2Nrc3BhY2VfbmFtZShsc19uYW1lKTsKKwlpZiAoIWxzKSB7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwkJcmV0dXJuIC1FTk9MUzsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxzLT5tdXRleCk7CisJaWYgKGxzLT50aHJlYWRfc3RvcCkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbHMtPm11dGV4KTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwlpZiAoIWZvcmNlICYmIGZvcl9lYWNoX2xvY2sobHMsIExPQ0tTX0VYSVNUX0xWKSkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbHMtPm11dGV4KTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlscy0+dGhyZWFkX3dvcmsgPSAxOworCWxzLT50aHJlYWRfc3RvcCA9IDE7CisJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmbHMtPmFjdGlvbnMpOworCXB0aHJlYWRfY29uZF9zaWduYWwoJmxzLT5jb25kKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbHMtPm11dGV4KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisKKwkvKgorCSAqIFRoZSBkbG0gZ2xvYmFsIGxvY2tzcGFjZSB3YXMgYXV0b21hdGljYWxseSBhZGRlZCB3aGVuCisJICogdGhlIGZpcnN0IGRsbSB2ZyBsb2Nrc3BhY2Ugd2FzIGFkZGVkLCBub3cgcmV2ZXJzZSB0aGF0CisJICogYnkgYXV0b21hdGljYWxseSByZW1vdmluZyB0aGUgZGxtIGdsb2JhbCBsb2Nrc3BhY2Ugd2hlbgorCSAqIHRoZSBsYXN0IGRsbSB2ZyBsb2Nrc3BhY2UgaXMgcmVtb3ZlZC4KKwkgKi8KKworCWlmIChydCA9PSBMRF9SVF9WRyAmJiBnbF91c2VfZGxtKQorCQlyZW1fZGxtX2dsb2JhbF9sb2Nrc3BhY2UoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY291bnQgaG93IG1hbnkgbG9ja3NwYWNlcyBzdGFydGVkIGJ5IHRoaXMgY2xpZW50IGFyZSBzdGlsbCBzdGFydGluZzsKKyAqIHRoZSBjbGllbnQgd2lsbCB1c2UgdGhpcyB0byB3YWl0IGZvciBhbGwgaXRzIHN0YXJ0IG9wZXJhdGlvbnMgdG8gZmluaXNoCisgKiAoU1RBUlRfV0FJVCkuCisgKi8KKworc3RhdGljIGludCBjb3VudF9sb2Nrc3BhY2Vfc3RhcnRpbmcodWludDMyX3QgY2xpZW50X2lkKQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzOworCWludCBjb3VudCA9IDA7CisJaW50IGRvbmUgPSAwOworCWludCBmYWlsID0gMDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJmxvY2tzcGFjZXMsIGxpc3QpIHsKKwkJaWYgKGxzLT5zdGFydF9jbGllbnRfaWQgIT0gY2xpZW50X2lkKQorCQkJY29udGludWU7CisKKwkJaWYgKCFscy0+Y3JlYXRlX2RvbmUgJiYgIWxzLT5jcmVhdGVfZmFpbCkgeworCQkJY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxzLT5jcmVhdGVfZG9uZSkKKwkJCWRvbmUrKzsKKwkJaWYgKGxzLT5jcmVhdGVfZmFpbCkKKwkJCWZhaWwrKzsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCisJbG9nX2RlYnVnKCJjb3VudF9sb2Nrc3BhY2Vfc3RhcnRpbmcgY2xpZW50ICV1IGNvdW50ICVkIGRvbmUgJWQgZmFpbCAlZCIsCisJCSAgY2xpZW50X2lkLCBjb3VudCwgZG9uZSwgZmFpbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBMb29wIHRocm91Z2ggYWxsIGxvY2tzcGFjZXMsIGFuZDoKKyAqIC0gaWYgZG9fc3RvcCBpcyBzZXQsIHN0b3AgYW55IHRoYXQgYXJlIG5vdCBzdG9wcGVkCisgKiAtIGlmIGRvX2ZyZWUgaXMgc2V0LCBqb2luIGFueSB0aGF0IGFyZSBkb25lIHN0b3BwaW5nIChhbmQgZnJlZSBscykKKyAqCisgKiBkb19zdG9wIHdpbGwgbm90IHN0b3AgYW4gbHMgd2l0aCBsdiBsb2NrcyB1bmxlc3MgZm9yY2UgaXMgc2V0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYmxvY2sgb3Igd2FpdCBmb3IgYW55dGhpbmcuCisgKgorICogZG9fc3RvcCAobm8gZG9fZnJlZSk6CisgKiByZXR1cm5zIGNvdW50IG9mIGxvY2tzcGFjZXMgdGhhdCBuZWVkIHN0b3AgKGhhdmUgbG9ja3MgYW5kIG5vIGZvcmNlKQorICoKKyAqIGRvX2ZyZWUgKG5vIGRvX3N0b3ApOgorICogcmV0dXJucyBjb3VudCBvZiBsb2Nrc3BhY2VzIHRoYXQgYXJlIHN0b3BwZWQgYW5kIG5lZWQgZnJlZWluZworICoKKyAqIGRvX3N0b3AgYW5kIGRvX2ZyZWU6CisgKiByZXR1cm5zIHN1bSBvZiB0aGUgcHJldmlvdXMgdHdvCisgKi8KKworc3RhdGljIGludCBmb3JfZWFjaF9sb2Nrc3BhY2UoaW50IGRvX3N0b3AsIGludCBkb19mcmVlLCBpbnQgZG9fZm9yY2UpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHMsICpzYWZlOworCWludCBuZWVkX3N0b3AgPSAwOworCWludCBuZWVkX2ZyZWUgPSAwOworCWludCBzdG9wX2NvdW50ID0gMDsKKwlpbnQgZnJlZV9jb3VudCA9IDA7CisJaW50IGRvbmU7CisJaW50IHN0b3A7CisJaW50IHBlcnJubzsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisKKwlpZiAoZG9fc3RvcCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbG9ja3NwYWNlcywgbGlzdCkgeworCisJCQlwdGhyZWFkX211dGV4X2xvY2soJmxzLT5tdXRleCk7CisJCQlpZiAobHMtPnRocmVhZF9zdG9wKSB7CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmxzLT5tdXRleCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghZG9fZm9yY2UgJiYgZm9yX2VhY2hfbG9jayhscywgTE9DS1NfRVhJU1RfQU5ZKSkgeworCQkJCW5lZWRfc3RvcCsrOworCQkJfSBlbHNlIHsKKwkJCQlscy0+dGhyZWFkX3dvcmsgPSAxOworCQkJCWxzLT50aHJlYWRfc3RvcCA9IDE7CisJCQkJcHRocmVhZF9jb25kX3NpZ25hbCgmbHMtPmNvbmQpOworCQkJCXN0b3BfY291bnQrKzsKKwkJCX0KKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCQl9CisJfQorCisJaWYgKGRvX2ZyZWUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzLCBzYWZlLCAmbG9ja3NwYWNlcywgbGlzdCkgeworCisJCQlwdGhyZWFkX211dGV4X2xvY2soJmxzLT5tdXRleCk7CisJCQlkb25lID0gbHMtPnRocmVhZF9kb25lOworCQkJc3RvcCA9IGxzLT50aHJlYWRfc3RvcDsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCisJCQkvKiBUaGlzIGxzIGhhcyBsb2NrcyBhbmQgZm9yY2UgaXMgbm90IHNldC4gKi8KKwkJCWlmICghc3RvcCkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIE9uY2UgdGhyZWFkX2RvbmUgaXMgc2V0LCB3ZSBrbm93IHRoYXQgdGhlIGxvY2tzcGFjZV90aHJlYWQKKwkJCSAqIHdpbGwgbm90IGJlIHVzaW5nL3RvdWNoaW5nIHRoZSBscyBzdHJ1Y3QuICBBbnkgb3RoZXIKKwkJCSAqIHRocmVhZCB0b3VjaGVzIHRoZSBscyBzdHJ1Y3QgdW5kZXIgbG9ja3NwYWNlc19tdXRleC4KKwkJCSAqLworCQkJaWYgKGRvbmUpIHsKKwkJCQlpZiAoKHBlcnJubyA9IHB0aHJlYWRfam9pbihscy0+dGhyZWFkLCBOVUxMKSkpCisJCQkJCWxvZ19lcnJvcigicHRocmVhZF9qb2luIGVycm9yICVkIiwgcGVycm5vKTsKKworCQkJCWxpc3RfZGVsKCZscy0+bGlzdCk7CisKKwkJCQkvKiBGSVhNRTogd2lsbCBmcmVlX3ZnIGV2ZXIgbm90IGJlIHNldD8gKi8KKworCQkJCWxvZ19kZWJ1ZygiZnJlZSBscyAlcyIsIGxzLT5uYW1lKTsKKworCQkJCWlmIChscy0+ZnJlZV92ZykgeworCQkJCQkvKiBJbiBmdXR1cmUgd2UgbWF5IG5lZWQgdG8gZnJlZSBscy0+YWN0aW9ucyBoZXJlICovCisJCQkJCWZyZWVfbHNfcmVzb3VyY2VzKGxzKTsKKwkJCQkJZnJlZShscyk7CisJCQkJCWZyZWVfY291bnQrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5lZWRfZnJlZSsrOworCQkJfQorCQl9CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmxvY2tzcGFjZXMpKSB7CisJCWlmICghZ2xfdHlwZV9zdGF0aWMpIHsKKwkJCWdsX3VzZV9kbG0gPSAwOworCQkJZ2xfdXNlX3NhbmxvY2sgPSAwOworCQl9CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKworCWlmIChzdG9wX2NvdW50IHx8IGZyZWVfY291bnQgfHwgbmVlZF9zdG9wIHx8IG5lZWRfZnJlZSkgeworCQlsb2dfZGVidWcoImZvcl9lYWNoX2xvY2tzcGFjZSBkb19zdG9wICVkIGRvX2ZyZWUgJWQgIgorCQkJICAic3RvcF9jb3VudCAlZCBmcmVlX2NvdW50ICVkIG5lZWRfc3RvcCAlZCBuZWVkX2ZyZWUgJWQiLAorCQkJICBkb19zdG9wLCBkb19mcmVlLCBzdG9wX2NvdW50LCBmcmVlX2NvdW50LCBuZWVkX3N0b3AsIG5lZWRfZnJlZSk7CisJfQorCisJcmV0dXJuIG5lZWRfc3RvcCArIG5lZWRfZnJlZTsKK30KKworLyoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgZGFlbW9uIGlzIGV4aXRpbmcgc28gdGhlIHNsZWVwL3JldHJ5CisgKiBsb29wIGRvZXNuJ3QgaGF2ZSBhbnkgYWR2ZXJzZSBpbXBhY3QuCisgKi8KKworc3RhdGljIHZvaWQgZm9yX2VhY2hfbG9ja3NwYWNlX3JldHJ5KGludCBkb19zdG9wLCBpbnQgZG9fZnJlZSwgaW50IGRvX2ZvcmNlKQoreworCWludCBjb3VudDsKKworCXdoaWxlICgxKSB7CisJCWNvdW50ID0gZm9yX2VhY2hfbG9ja3NwYWNlKGRvX3N0b3AsIGRvX2ZyZWUsIGRvX2ZvcmNlKTsKKwkJaWYgKCFjb3VudCkKKwkJCWJyZWFrOworCisJCWxvZ19kZWJ1ZygiZm9yX2VhY2hfbG9ja3NwYWNlX3JldHJ5IHJlbWFpbmluZyAlZCIsIGNvdW50KTsKKwkJc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgaW50IHdvcmtfaW5pdF92ZyhzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHM7CisJY2hhciBsc19uYW1lW01BWF9OQU1FKzFdOworCWludCBydiA9IDA7CisKKwltZW1zZXQobHNfbmFtZSwgMCwgc2l6ZW9mKGxzX25hbWUpKTsKKworCXZnX2xzX25hbWUoYWN0LT52Z19uYW1lLCBsc19uYW1lKTsKKworCS8qCisJICogVGhlIG1heCBkbG0gbHMgbmFtZSBpcyA2NCBhbmQgdGhlIG1heCBzYW5sb2NrIGxzIG5hbWUgaXMgNDguICBTbywKKwkgKiBhZnRlciB0aGUgImx2bV8iIHByZWZpeCwgb25seSB0aGUgZmlyc3QgNjAvNDQgY2hhcmFjdGVycyBvZiB0aGUgVkcKKwkgKiBuYW1lIGFyZSB1c2VkIGZvciB0aGUgbG9ja3NwYWNlIG5hbWUuICBUaGlzIHdpbGwgY2F1c2UgYSBjb2xsaXNpb24KKwkgKiBpbiB0aGUgbG9jayBtYW5hZ2VyIGlmIHR3byBkaWZmZXJlbnQgVkcgbmFtZXMgaGF2ZSB0aGUgZmlyc3QgNjAvNDQKKwkgKiBjaGFycyBpbiBjb21tb24uICBBdCB0aGUgdGltZSBvZiB2Z2NyZWF0ZSAoaGVyZSksIGNoZWNrIGlmIGFueSBvdGhlcgorCSAqIFZHJ3MgYXJlIGtub3duIHRoYXQgd291bGQgY29sbGlkZS4gIElmIHRoZSBjb2xsaXNpb24gaXMgbm90IGRldGVjdGVkCisJICogYXQgdmdjcmVhdGUgdGltZSwgaXQgd2lsbCBiZSBkZXRlY3RlZCBhdCBzdGFydCB0aW1lIGFuZCBhZGRfbG9ja3NwYWNlCisJICogd2lsbCBmYWlsIGZvciB0aGUgc2Vjb25kIG9mIHRoZSB0d28gbWF0Y2hpbmcgbHMgbmFtZXMuCisJICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbG9ja3NwYWNlcywgbGlzdCkgeworCQlpZiAoKGxzLT5sbV90eXBlID09IExEX0xNX1NBTkxPQ0spICYmICFzdHJuY21wKGxzLT5uYW1lLCBsc19uYW1lLCA0OCkpIHsKKwkJCXJ2ID0gLUVFWElTVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKSAmJiAhc3RyY21wKGxzLT5uYW1lLCBsc19uYW1lKSkgeworCQkJcnYgPSAtRUVYSVNUOworCQkJYnJlYWs7CisJCX0KKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCisJaWYgKHJ2ID09IC1FRVhJU1QpIHsKKwkJbG9nX2Vycm9yKCJFeGlzdGluZyBsb2Nrc3BhY2UgbmFtZSAlcyBtYXRjaGVzIG5ldyAlcyBWRyBuYW1lcyAlcyAlcyIsCisJCQkgIGxzLT5uYW1lLCBsc19uYW1lLCBscy0+dmdfbmFtZSwgYWN0LT52Z19uYW1lKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCWlmIChhY3QtPmxtX3R5cGUgPT0gTERfTE1fU0FOTE9DSykKKwkJcnYgPSBsbV9pbml0X3ZnX3NhbmxvY2sobHNfbmFtZSwgYWN0LT52Z19uYW1lLCBhY3QtPmZsYWdzLCBhY3QtPnZnX2FyZ3MpOworCWVsc2UgaWYgKGFjdC0+bG1fdHlwZSA9PSBMRF9MTV9ETE0pCisJCXJ2ID0gbG1faW5pdF92Z19kbG0obHNfbmFtZSwgYWN0LT52Z19uYW1lLCBhY3QtPmZsYWdzLCBhY3QtPnZnX2FyZ3MpOworCWVsc2UKKwkJcnYgPSAtRUlOVkFMOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHdvcmtfcmVuYW1lX3ZnKHN0cnVjdCBhY3Rpb24gKmFjdCkKK3sKKwljaGFyIGxzX25hbWVbTUFYX05BTUUrMV07CisJaW50IHJ2ID0gMDsKKworCW1lbXNldChsc19uYW1lLCAwLCBzaXplb2YobHNfbmFtZSkpOworCisJdmdfbHNfbmFtZShhY3QtPnZnX25hbWUsIGxzX25hbWUpOworCisJaWYgKGFjdC0+bG1fdHlwZSA9PSBMRF9MTV9TQU5MT0NLKQorCQlydiA9IGxtX3JlbmFtZV92Z19zYW5sb2NrKGxzX25hbWUsIGFjdC0+dmdfbmFtZSwgYWN0LT5mbGFncywgYWN0LT52Z19hcmdzKTsKKwllbHNlIGlmIChhY3QtPmxtX3R5cGUgPT0gTERfTE1fRExNKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJ2ID0gLUVJTlZBTDsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgd29ya190ZXN0X2dsKHZvaWQpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHM7CisJaW50IGlzX2VuYWJsZWQgPSAwOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbG9ja3NwYWNlcywgbGlzdCkgeworCQlpZiAobHMtPmxtX3R5cGUgIT0gTERfTE1fU0FOTE9DSykKKwkJCWNvbnRpbnVlOworCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwkJaWYgKGxzLT5jcmVhdGVfZG9uZSAmJiAhbHMtPnRocmVhZF9zdG9wKSB7CisJCQlpc19lbmFibGVkID0gbG1fZ2xfaXNfZW5hYmxlZChscyk7CisJCQlpZiAoaXNfZW5hYmxlZCkgeworCQkJCWxvZ19kZWJ1ZygiUyAlcyB3b3JrZXIgZm91bmQgZ2xfaXNfZW5hYmxlZCIsIGxzLT5uYW1lKTsKKwkJCQlzdHJuY3B5KGdsX2xzbmFtZV9zYW5sb2NrLCBscy0+bmFtZSwgTUFYX05BTUUpOworCQkJfQorCQl9CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCisJCWlmIChpc19lbmFibGVkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc19lbmFibGVkKQorCQlsb2dfZGVidWcoIndvcmtlciBmb3VuZCBubyBnbF9pc19lbmFibGVkIik7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHdvcmtfaW5pdF9sdihzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJc3RydWN0IGxvY2tzcGFjZSAqbHM7CisJY2hhciBsc19uYW1lW01BWF9OQU1FKzFdOworCWNoYXIgdmdfYXJnc1tNQVhfQVJHUysxXTsKKwljaGFyIGx2X2FyZ3NbTUFYX0FSR1MrMV07CisJdWludDY0X3QgZnJlZV9vZmZzZXQgPSAwOworCWludCBsbV90eXBlID0gMDsKKwlpbnQgcnYgPSAwOworCisJbWVtc2V0KGxzX25hbWUsIDAsIHNpemVvZihsc19uYW1lKSk7CisJbWVtc2V0KHZnX2FyZ3MsIDAsIHNpemVvZih2Z19hcmdzKSk7CisJbWVtc2V0KGx2X2FyZ3MsIDAsIHNpemVvZihsdl9hcmdzKSk7CisKKwl2Z19sc19uYW1lKGFjdC0+dmdfbmFtZSwgbHNfbmFtZSk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCWxzID0gZmluZF9sb2Nrc3BhY2VfbmFtZShsc19uYW1lKTsKKwlpZiAobHMpIHsKKwkJbG1fdHlwZSA9IGxzLT5sbV90eXBlOworCQltZW1jcHkodmdfYXJncywgbHMtPnZnX2FyZ3MsIE1BWF9BUkdTKTsKKwkJZnJlZV9vZmZzZXQgPSBscy0+ZnJlZV9sb2NrX29mZnNldDsKKwkJbHMtPmZyZWVfbG9ja19vZmZzZXQgPSAwOworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisKKwlpZiAoIWxzKSB7CisJCWxtX3R5cGUgPSBhY3QtPmxtX3R5cGU7CisJCW1lbWNweSh2Z19hcmdzLCBhY3QtPnZnX2FyZ3MsIE1BWF9BUkdTKTsKKwl9CisKKwlpZiAoYWN0LT5sbV90eXBlICE9IGxtX3R5cGUpIHsKKwkJbG9nX2Vycm9yKCJpbml0X2x2IGxzX25hbWUgJXMgd3JvbmcgbG1fdHlwZSAlZCAlZCIsCisJCQkgIGxzX25hbWUsIGFjdC0+bG1fdHlwZSwgbG1fdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsbV90eXBlID09IExEX0xNX1NBTkxPQ0spIHsKKwkJcnYgPSBsbV9pbml0X2x2X3NhbmxvY2sobHNfbmFtZSwgYWN0LT52Z19uYW1lLCBhY3QtPmx2X3V1aWQsCisJCQkJCXZnX2FyZ3MsIGx2X2FyZ3MsIGZyZWVfb2Zmc2V0KTsKKworCQltZW1jcHkoYWN0LT5sdl9hcmdzLCBsdl9hcmdzLCBNQVhfQVJHUyk7CisJCXJldHVybiBydjsKKworCX0gZWxzZSBpZiAoYWN0LT5sbV90eXBlID09IExEX0xNX0RMTSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoImluaXRfbHYgbHNfbmFtZSAlcyBiYWQgbG1fdHlwZSAlZCIsIGxzX25hbWUsIGFjdC0+bG1fdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIFdoZW4gYW4gYWN0aW9uIGlzIHF1ZXVlZCBmb3IgdGhlIHdvcmtlcl90aHJlYWQsIGl0IGlzIHByb2Nlc3NlZCByaWdodCBhd2F5LgorICogQWZ0ZXIgcHJvY2Vzc2luZywgc29tZSBhY3Rpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2FpbiBpbiBhIHNob3J0IHdoaWxlLgorICogVGhlc2UgYWN0aW9ucyBhcmUgcHV0IG9uIHRoZSBkZWxheWVkX2xpc3QsIGFuZCB0aGUgd29ya2VyX3RocmVhZCB3aWxsCisgKiBwcm9jZXNzIHRoZXNlIGRlbGF5ZWQgYWN0aW9ucyBhZ2FpbiBpbiBTSE9SVF9ERUxBWV9QRVJJT0QuCisgKi8KKworI2RlZmluZSBTSE9SVF9ERUxBWV9QRVJJT0QgMgorI2RlZmluZSBMT05HX0RFTEFZX1BFUklPRCA2MAorCitzdGF0aWMgdm9pZCAqd29ya2VyX3RocmVhZF9tYWluKHZvaWQgKmFyZ19pbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGF5ZWRfbGlzdDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IGFjdGlvbiAqYWN0LCAqc2FmZTsKKwl1aW50NjRfdCBsYXN0X2RlbGF5ZWRfdGltZSA9IDA7CisJaW50IGRlbGF5X3NlYyA9IExPTkdfREVMQVlfUEVSSU9EOworCWludCBydjsKKworCUlOSVRfTElTVF9IRUFEKCZkZWxheWVkX2xpc3QpOworCisJd2hpbGUgKDEpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXJfbXV0ZXgpOworCQlpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSkgeworCQkJbG9nX2Vycm9yKCJjbG9ja19nZXR0aW1lIGZhaWxlZC4iKTsKKwkJCXRzLnR2X3NlYyA9IHRzLnR2X25zZWMgPSAwOworCQl9CisJCXRzLnR2X3NlYyArPSBkZWxheV9zZWM7CisJCXJ2ID0gMDsKKwkJYWN0ID0gTlVMTDsKKworCQl3aGlsZSAobGlzdF9lbXB0eSgmd29ya2VyX2xpc3QpICYmICF3b3JrZXJfc3RvcCAmJiAhd29ya2VyX3dha2UgJiYgIXJ2KSB7CisJCQlydiA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJndvcmtlcl9jb25kLCAmd29ya2VyX211dGV4LCAmdHMpOworCQl9CisJCXdvcmtlcl93YWtlID0gMDsKKworCQlpZiAod29ya2VyX3N0b3ApIHsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfbXV0ZXgpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJndvcmtlcl9saXN0KSkgeworCQkJYWN0ID0gbGlzdF9maXJzdF9lbnRyeSgmd29ya2VyX2xpc3QsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl9tdXRleCk7CisKKwkJLyoKKwkJICogRG8gbmV3IHdvcmsgYWN0aW9ucyBiZWZvcmUgcHJvY2Vzc2luZyBkZWxheWVkIHdvcmsgYWN0aW9ucy4KKwkJICovCisKKwkJaWYgKCFhY3QpCisJCQlnb3RvIGRlbGF5ZWRfd29yazsKKworCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9SVU5OSU5HX0xNKSB7CisJCQlpbnQgcnVuX3NhbmxvY2sgPSBsbV9pc19ydW5uaW5nX3NhbmxvY2soKTsKKwkJCWludCBydW5fZGxtID0gbG1faXNfcnVubmluZ19kbG0oKTsKKworCQkJaWYgKGRhZW1vbl90ZXN0KSB7CisJCQkJcnVuX3NhbmxvY2sgPSBnbF91c2Vfc2FubG9jazsKKwkJCQlydW5fZGxtID0gZ2xfdXNlX2RsbTsKKwkJCX0KKworCQkJaWYgKHJ1bl9zYW5sb2NrICYmIHJ1bl9kbG0pCisJCQkJYWN0LT5yZXN1bHQgPSAtRVhGVUxMOworCQkJZWxzZSBpZiAoIXJ1bl9zYW5sb2NrICYmICFydW5fZGxtKQorCQkJCWFjdC0+cmVzdWx0ID0gLUVOT0xDSzsKKwkJCWVsc2UgaWYgKHJ1bl9zYW5sb2NrKQorCQkJCWFjdC0+cmVzdWx0ID0gTERfTE1fU0FOTE9DSzsKKwkJCWVsc2UgaWYgKHJ1bl9kbG0pCisJCQkJYWN0LT5yZXN1bHQgPSBMRF9MTV9ETE07CisJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCisJCX0gZWxzZSBpZiAoKGFjdC0+b3AgPT0gTERfT1BfTE9DSykgJiYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9TRUFSQ0hfTFMpKSB7CisJCQkvKgorCQkJICogd29ya2VyX3RocmVhZCB1c2VkIGFzIGEgaGVscGVyIHRvIHNlYXJjaCBleGlzdGluZworCQkJICogc2FubG9jayB2Z3MgZm9yIGFuIGVuYWJsZWQgZ2wuCisJCQkgKi8KKwkJCWxvZ19kZWJ1Zygid29yayBzZWFyY2ggZm9yIGdsIik7CisJCQl3b3JrX3Rlc3RfZ2woKTsKKworCQkJLyogdHJ5IGFnYWluIHRvIGZpbmQgYSBnbCBsb2Nrc3BhY2UgZm9yIHRoaXMgYWN0ICovCisJCQlydiA9IGFkZF9sb2NrX2FjdGlvbihhY3QpOworCQkJaWYgKHJ2IDwgMCkgeworCQkJCWFjdC0+cmVzdWx0ID0gcnY7CisJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKChhY3QtPm9wID09IExEX09QX0lOSVQpICYmIChhY3QtPnJ0ID09IExEX1JUX1ZHKSkgeworCQkJbG9nX2RlYnVnKCJ3b3JrIGluaXRfdmcgJXMiLCBhY3QtPnZnX25hbWUpOworCQkJYWN0LT5yZXN1bHQgPSB3b3JrX2luaXRfdmcoYWN0KTsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisKKwkJfSBlbHNlIGlmICgoYWN0LT5vcCA9PSBMRF9PUF9JTklUKSAmJiAoYWN0LT5ydCA9PSBMRF9SVF9MVikpIHsKKwkJCWxvZ19kZWJ1Zygid29yayBpbml0X2x2ICVzLyVzIHV1aWQgJXMiLCBhY3QtPnZnX25hbWUsIGFjdC0+bHZfbmFtZSwgYWN0LT5sdl91dWlkKTsKKwkJCWFjdC0+cmVzdWx0ID0gd29ya19pbml0X2x2KGFjdCk7CisJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCisJCX0gZWxzZSBpZiAoKGFjdC0+b3AgPT0gTERfT1BfUkVOQU1FX0ZJTkFMKSAmJiAoYWN0LT5ydCA9PSBMRF9SVF9WRykpIHsKKwkJCWxvZ19kZWJ1Zygid29yayByZW5hbWVfdmcgJXMiLCBhY3QtPnZnX25hbWUpOworCQkJYWN0LT5yZXN1bHQgPSB3b3JrX3JlbmFtZV92ZyhhY3QpOworCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKworCQl9IGVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfU1RBUlRfV0FJVCkgeworCQkJYWN0LT5yZXN1bHQgPSBjb3VudF9sb2Nrc3BhY2Vfc3RhcnRpbmcoYWN0LT5jbGllbnRfaWQpOworCQkJaWYgKCFhY3QtPnJlc3VsdCkKKwkJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQkJZWxzZQorCQkJCWxpc3RfYWRkKCZhY3QtPmxpc3QsICZkZWxheWVkX2xpc3QpOworCisJCX0gZWxzZSBpZiAoYWN0LT5vcCA9PSBMRF9PUF9TVE9QX0FMTCkgeworCQkJYWN0LT5yZXN1bHQgPSBmb3JfZWFjaF9sb2Nrc3BhY2UoRE9fU1RPUCwgRE9fRlJFRSwgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9GT1JDRSkgPyBET19GT1JDRSA6IE5PX0ZPUkNFKTsKKwkJCWlmICghYWN0LT5yZXN1bHQgfHwgIShhY3QtPmZsYWdzICYgTERfQUZfV0FJVCkpCisJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCWVsc2UKKwkJCQlsaXN0X2FkZCgmYWN0LT5saXN0LCAmZGVsYXllZF9saXN0KTsKKworCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJ3b3JrIHVua25vd24gb3AgJWQiLCBhY3QtPm9wKTsKKwkJCWFjdC0+cmVzdWx0ID0gLUVJTlZBTDsKKwkJCWFkZF9jbGllbnRfcmVzdWx0KGFjdCk7CisJCX0KKworIGRlbGF5ZWRfd29yazoKKwkJLyoKKwkJICogV2UgbWF5IHdhbnQgdG8gdHJhY2sgcmV0cnkgdGltZXMgcGVyIGFjdGlvbiBzbyB0aGF0CisJCSAqIHdlIGNhbiBkZWxheSBkaWZmZXJlbnQgYWN0aW9ucyBieSBkaWZmZXJlbnQgYW1vdW50cy4KKwkJICovCisKKwkJaWYgKG1vbm90aW1lKCkgLSBsYXN0X2RlbGF5ZWRfdGltZSA8IFNIT1JUX0RFTEFZX1BFUklPRCkgeworCQkJZGVsYXlfc2VjID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxhc3RfZGVsYXllZF90aW1lID0gbW9ub3RpbWUoKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmZGVsYXllZF9saXN0LCBsaXN0KSB7CisJCQlpZiAoYWN0LT5vcCA9PSBMRF9PUF9TVEFSVF9XQUlUKSB7CisJCQkJbG9nX2RlYnVnKCJ3b3JrIGRlbGF5ZWQgc3RhcnRfd2FpdCBmb3IgY2xpZW50ICV1IiwgYWN0LT5jbGllbnRfaWQpOworCQkJCWFjdC0+cmVzdWx0ID0gY291bnRfbG9ja3NwYWNlX3N0YXJ0aW5nKGFjdC0+Y2xpZW50X2lkKTsKKwkJCQlpZiAoIWFjdC0+cmVzdWx0KSB7CisJCQkJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQkJCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQkJCX0KKworCQkJfSBlbHNlIGlmIChhY3QtPm9wID09IExEX09QX1NUT1BfQUxMKSB7CisJCQkJbG9nX2RlYnVnKCJ3b3JrIGRlbGF5ZWQgc3RvcF9hbGwiKTsKKwkJCQlhY3QtPnJlc3VsdCA9IGZvcl9lYWNoX2xvY2tzcGFjZShET19TVE9QLCBET19GUkVFLCAoYWN0LT5mbGFncyAmIExEX0FGX0ZPUkNFKSA/IERPX0ZPUkNFIDogTk9fRk9SQ0UpOworCQkJCWlmICghYWN0LT5yZXN1bHQpIHsKKwkJCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQkJCWFjdC0+cmVzdWx0ID0gMDsKKwkJCQkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBleHBsaWNpdGx5IHF1ZXVlZCB3b3JrLCBhbmQgbm90IGRlbGF5ZWQgd29yaywKKwkJICogYnV0IGxvY2tzcGFjZSB0aHJlYWQgY2xlYW51cCB0aGF0J3MgbmVlZGVkIHdoZW4gYQorCQkgKiBsb2Nrc3BhY2UgaGFzIGJlZW4gc3RvcHBlZC9yZW1vdmVkIG9yIGZhaWxlZCB0byBzdGFydC4KKwkJICovCisKKwkJZm9yX2VhY2hfbG9ja3NwYWNlKE5PX1NUT1AsIERPX0ZSRUUsIE5PX0ZPUkNFKTsKKworCQlpZiAobGlzdF9lbXB0eSgmZGVsYXllZF9saXN0KSkKKwkJCWRlbGF5X3NlYyA9IExPTkdfREVMQVlfUEVSSU9EOworCQllbHNlCisJCQlkZWxheV9zZWMgPSAxOworCX0KK291dDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmZGVsYXllZF9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZhY3QtPmxpc3QpOworCQlmcmVlX2FjdGlvbihhY3QpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmd29ya2VyX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCBzYWZlLCAmd29ya2VyX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCWZyZWVfYWN0aW9uKGFjdCk7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfbXV0ZXgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNldHVwX3dvcmtlcl90aHJlYWQodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlJTklUX0xJU1RfSEVBRCgmd29ya2VyX2xpc3QpOworCisJcHRocmVhZF9tdXRleF9pbml0KCZ3b3JrZXJfbXV0ZXgsIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZ3b3JrZXJfY29uZCwgTlVMTCk7CisKKwlydiA9IHB0aHJlYWRfY3JlYXRlKCZ3b3JrZXJfdGhyZWFkLCBOVUxMLCB3b3JrZXJfdGhyZWFkX21haW4sIE5VTEwpOworCWlmIChydikKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV93b3JrZXJfdGhyZWFkKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXJfbXV0ZXgpOworCXdvcmtlcl9zdG9wID0gMTsKKwlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3b3JrZXJfY29uZCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl9tdXRleCk7CisJcHRocmVhZF9qb2luKHdvcmtlcl90aHJlYWQsIE5VTEwpOworfQorCisvKiBjbGllbnRfbXV0ZXggaXMgbG9ja2VkICovCitzdGF0aWMgc3RydWN0IGNsaWVudCAqZmluZF9jbGllbnRfd29yayh2b2lkKQoreworCXN0cnVjdCBjbGllbnQgKmNsOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmNsaWVudF9saXN0LCBsaXN0KSB7CisJCWlmIChjbC0+cmVjdiB8fCBjbC0+ZGVhZCkKKwkJCXJldHVybiBjbDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNsaWVudF9tdXRleCBpcyBsb2NrZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xpZW50ICpmaW5kX2NsaWVudF9pZCh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2wsICZjbGllbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoY2wtPmlkID09IGlkKQorCQkJcmV0dXJuIGNsOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogY2xpZW50X211dGV4IGlzIGxvY2tlZCAqLworc3RhdGljIHN0cnVjdCBjbGllbnQgKmZpbmRfY2xpZW50X3BpKGludCBwaSkKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2wsICZjbGllbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoY2wtPnBpID09IHBpKQorCQkJcmV0dXJuIGNsOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHdha2UgdXAgcG9sbCgpIGJlY2F1c2Ugd2UgaGF2ZSBhZGRlZCBhbiBmZAorICogYmFjayBpbnRvIHBvbGxmZCBhbmQgcG9sbCgpIG5lZWRzIHRvIGJlIHJlc3RhcnRlZAorICogdG8gcmVjb2duaXplIGl0LgorICovCitzdGF0aWMgdm9pZCByZXN0YXJ0X3BvbGwodm9pZCkKK3sKKwlpbnQgcnY7CisJcnYgPSB3cml0ZShyZXN0YXJ0X2Zkc1sxXSwgInciLCAxKTsKKwlpZiAoIXJ2IHx8IHJ2IDwgMCkKKwkJbG9nX2RlYnVnKCJyZXN0YXJ0X3BvbGwgd3JpdGUgJWQiLCBlcnJubyk7Cit9CisKKy8qIHBvbGwgd2lsbCB0YWtlIHJlcXVlc3RzIGZyb20gY2xpZW50IGFnYWluLCBjbC0+bXV0ZXggbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBjbGllbnRfcmVzdW1lKHN0cnVjdCBjbGllbnQgKmNsKQoreworCWlmIChjbC0+ZGVhZCkKKwkJcmV0dXJuOworCisJaWYgKCFjbC0+cG9sbF9pZ25vcmUgfHwgY2wtPmZkID09IC0xIHx8IGNsLT5waSA9PSAtMSkgeworCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCWxvZ19lcnJvcigiY2xpZW50X3Jlc3VtZSAldSBiYWQgc3RhdGUgaWcgJWQgZmQgJWQgcGkgJWQiLAorCQkJICBjbC0+aWQsIGNsLT5wb2xsX2lnbm9yZSwgY2wtPmZkLCBjbC0+cGkpOworCQlyZXR1cm47CisJfQorCisJcHRocmVhZF9tdXRleF9sb2NrKCZwb2xsZmRfbXV0ZXgpOworCWlmIChwb2xsZmRbY2wtPnBpXS5mZCAhPSBQT0xMX0ZEX0lHTk9SRSkgeworCQlsb2dfZXJyb3IoImNsaWVudF9yZXN1bWUgJXUgcGkgJWQgZmQgJWQgbm90IElHTk9SRSIsCisJCQkgIGNsLT5pZCwgY2wtPnBpLCBjbC0+ZmQpOworCX0KKwlwb2xsZmRbY2wtPnBpXS5mZCA9IGNsLT5mZDsKKwlwb2xsZmRbY2wtPnBpXS5ldmVudHMgPSBQT0xMSU47CisJcHRocmVhZF9tdXRleF91bmxvY2soJnBvbGxmZF9tdXRleCk7CisKKwlyZXN0YXJ0X3BvbGwoKTsKK30KKworLyogY2FsbGVkIGZyb20gY2xpZW50X3RocmVhZCwgY2wtPm11dGV4IGlzIGhlbGQgKi8KK3N0YXRpYyBpbnQgY2xpZW50X3NlbmRfcmVzdWx0KHN0cnVjdCBjbGllbnQgKmNsLCBzdHJ1Y3QgYWN0aW9uICphY3QpCit7CisJcmVzcG9uc2UgcmVzOworCWNoYXIgcmVzdWx0X2ZsYWdzWzEyOF07CisJaW50IGR1bXBfbGVuID0gMDsKKwlpbnQgZHVtcF9mZCA9IC0xOworCWludCBydiA9IDA7CisKKwlpZiAoY2wtPmRlYWQpIHsKKwkJbG9nX2RlYnVnKCJzZW5kIGNsICV1IHNraXAgZGVhZCIsIGNsLT5pZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQocmVzdWx0X2ZsYWdzLCAwLCBzaXplb2YocmVzdWx0X2ZsYWdzKSk7CisKKwlidWZmZXJfaW5pdCgmcmVzLmJ1ZmZlcik7CisKKwkvKgorCSAqIEVVTkFUQ0ggaXMgcmV0dXJuZWQgd2hlbiB0aGUgZ2xvYmFsIGxvY2sgZXhpc3RlZCwKKwkgKiBidXQgaGFkIGJlZW4gZGlzYWJsZWQgd2hlbiB3ZSB0cmllZCB0byBsb2NrIGl0LAorCSAqIHNvIHdlIHJlbW92ZWQgaXQsIGFuZCBubyBsb25nZXIgaGF2ZSBhIGdsIHRvIGxvY2suCisJICovCisKKwlpZiAoYWN0LT5yZXN1bHQgPT0gLUVVTkFUQ0gpCisJCWFjdC0+cmVzdWx0ID0gLUVOT0xTOworCisJLyoKKwkgKiBpbml0X3ZnIHdpdGggZGxtfHNhbmxvY2sgcmV0dXJucyB2Z19hcmdzCisJICogaW5pdF9sdiB3aXRoIHNhbmxvY2sgcmV0dXJucyBsdl9hcmdzCisJICovCisKKwlpZiAoYWN0LT5yZXN1bHQgPT0gLUVOT0xTKSB7CisJCS8qCisJCSAqIFRoZSBsb2Nrc3BhY2UgY291bGQgbm90IGJlIGZvdW5kLCBpbiB3aGljaCBjYXNlCisJCSAqIHRoZSBjYWxsZXIgbWF5IHdhbnQgdG8ga25vdyBpZiBhbnkgbG9ja3NwYWNlcyBleGlzdAorCQkgKiBvciBpZiBsb2Nrc3BhY2VzIGV4aXN0LCBidXQgbm90IG9uZSB3aXRoIHRoZSBnbG9iYWwgbG9jay4KKwkJICogR2l2ZW4gdGhpcyBkZXRhaWwsIGl0IG1heSBiZSBhYmxlIHRvIHByb2NlZGUgd2l0aG91dAorCQkgKiB0aGUgbG9jay4KKwkJICovCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCWlmIChsaXN0X2VtcHR5KCZsb2Nrc3BhY2VzKSkKKwkJCXN0cmNhdChyZXN1bHRfZmxhZ3MsICJOT19MT0NLU1BBQ0VTLCIpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisKKwkJaWYgKGdsX3VzZV9zYW5sb2NrKSB7CisJCQlpZiAoIWdsX2xzbmFtZV9zYW5sb2NrWzBdKQorCQkJCXN0cmNhdChyZXN1bHRfZmxhZ3MsICJOT19HTF9MUywiKTsKKwkJfSBlbHNlIGlmIChnbF91c2VfZGxtKSB7CisJCQlpZiAoIWdsX2xzbmFtZV9kbG1bMF0pCisJCQkJc3RyY2F0KHJlc3VsdF9mbGFncywgIk5PX0dMX0xTLCIpOworCQl9IGVsc2UgeworCQkJc3RyY2F0KHJlc3VsdF9mbGFncywgIk5PX0dMX0xTLCIpOworCQl9CisJfQorCisJaWYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9EVVBfR0xfTFMpCisJCXN0cmNhdChyZXN1bHRfZmxhZ3MsICJEVVBfR0xfTFMsIik7CisKKwlpZiAoKGFjdC0+ZmxhZ3MgJiBMRF9BRl9XQVJOX0dMX1JFTU9WRUQpIHx8IGdsX3ZnX3JlbW92ZWQpCisJCXN0cmNhdChyZXN1bHRfZmxhZ3MsICJXQVJOX0dMX1JFTU9WRUQsIik7CisJCisJaWYgKGFjdC0+b3AgPT0gTERfT1BfSU5JVCkgeworCQkvKgorCQkgKiBpbml0IGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGxvY2sgYXJncyBuZWVkCisJCSAqIHRvIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjbGllbnQuCisJCSAqLworCQljb25zdCBjaGFyICp2Z19hcmdzID0gIm5vbmUiOworCQljb25zdCBjaGFyICpsdl9hcmdzID0gIm5vbmUiOworCisJCWlmIChhY3QtPnZnX2FyZ3NbMF0pCisJCQl2Z19hcmdzID0gYWN0LT52Z19hcmdzOworCisJCWlmIChhY3QtPmx2X2FyZ3NbMF0pCisJCQlsdl9hcmdzID0gYWN0LT5sdl9hcmdzOworCisJCWxvZ19kZWJ1Zygic2VuZCAlc1slZF0gY2wgJXUgJXMgJXMgcnYgJWQgdmdfYXJncyAlcyBsdl9hcmdzICVzIiwKKwkJCSAgY2wtPm5hbWVbMF0gPyBjbC0+bmFtZSA6ICJjbGllbnQiLCBjbC0+cGlkLCBjbC0+aWQsCisJCQkgIG9wX3N0cihhY3QtPm9wKSwgcnRfc3RyKGFjdC0+cnQpLAorCQkJICBhY3QtPnJlc3VsdCwgdmdfYXJncyA/IHZnX2FyZ3MgOiAiIiwgbHZfYXJncyA/IGx2X2FyZ3MgOiAiIik7CisKKwkJcmVzID0gZGFlbW9uX3JlcGx5X3NpbXBsZSgiT0siLAorCQkJCQkgICJvcCA9ICIgRk1UZDY0LCAoaW50NjRfdClhY3QtPm9wLAorCQkJCQkgICJvcF9yZXN1bHQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGFjdC0+cmVzdWx0LAorCQkJCQkgICJsbV9yZXN1bHQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGFjdC0+bG1fcnYsCisJCQkJCSAgInZnX2xvY2tfYXJncyA9ICVzIiwgdmdfYXJncywKKwkJCQkJICAibHZfbG9ja19hcmdzID0gJXMiLCBsdl9hcmdzLAorCQkJCQkgICJyZXN1bHRfZmxhZ3MgPSAlcyIsIHJlc3VsdF9mbGFnc1swXSA/IHJlc3VsdF9mbGFncyA6ICJub25lIiwKKwkJCQkJICBOVUxMKTsKKworCX0gZWxzZSBpZiAoYWN0LT5vcCA9PSBMRF9PUF9EVU1QX0xPRyB8fCBhY3QtPm9wID09IExEX09QX0RVTVBfSU5GTykgeworCQkvKgorCQkgKiBsdm1sb2NrY3RsIGNyZWF0ZXMgdGhlIHVuaXggc29ja2V0IHRoZW4gYXNrcyB1cyB0byB3cml0ZSB0byBpdC4KKwkJICogRklYTUU6IG1vdmUgcHJvY2Vzc2luZyB0aGlzIHRvIGEgbmV3IGRlZGljYXRlZCBxdWVyeSB0aHJlYWQgdG8KKwkJICogYXZvaWQgaGF2aW5nIGEgbGFyZ2UgZGF0YSBkdW1wIGludGVyZmVyZSB3aXRoIG5vcm1hbCBvcGVyYXRpb24KKwkJICogb2YgdGhlIGNsaWVudCB0aHJlYWQ/CisJCSAqLworCisJCWR1bXBfZmQgPSBzZXR1cF9kdW1wX3NvY2tldCgpOworCQlpZiAoZHVtcF9mZCA8IDApCisJCQlhY3QtPnJlc3VsdCA9IGR1bXBfZmQ7CisJCWVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfRFVNUF9MT0cpCisJCQlhY3QtPnJlc3VsdCA9IGR1bXBfbG9nKCZkdW1wX2xlbik7CisJCWVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfRFVNUF9JTkZPKQorCQkJYWN0LT5yZXN1bHQgPSBkdW1wX2luZm8oJmR1bXBfbGVuKTsKKwkJZWxzZQorCQkJYWN0LT5yZXN1bHQgPSAtRUlOVkFMOworCisJCWxvZ19kZWJ1Zygic2VuZCAlc1slZF0gY2wgJXUgZHVtcCByZXN1bHQgJWQgZHVtcF9sZW4gJWQiLAorCQkJICBjbC0+bmFtZVswXSA/IGNsLT5uYW1lIDogImNsaWVudCIsIGNsLT5waWQsIGNsLT5pZCwKKwkJCSAgYWN0LT5yZXN1bHQsIGR1bXBfbGVuKTsKKworCQlyZXMgPSBkYWVtb25fcmVwbHlfc2ltcGxlKCJPSyIsCisJCQkJCSAgInJlc3VsdCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgYWN0LT5yZXN1bHQsCisJCQkJCSAgImR1bXBfbGVuID0gIiBGTVRkNjQsIChpbnQ2NF90KSBkdW1wX2xlbiwKKwkJCQkJICBOVUxMKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBIG5vcm1hbCByZXBseS4KKwkJICovCisKKwkJbG9nX2RlYnVnKCJzZW5kICVzWyVkXSBjbCAldSAlcyAlcyBydiAlZCAlcyAlcyIsCisJCQkgIGNsLT5uYW1lWzBdID8gY2wtPm5hbWUgOiAiY2xpZW50IiwgY2wtPnBpZCwgY2wtPmlkLAorCQkJICBvcF9zdHIoYWN0LT5vcCksIHJ0X3N0cihhY3QtPnJ0KSwKKwkJCSAgYWN0LT5yZXN1bHQsIChhY3QtPnJlc3VsdCA9PSAtRU5PTFMpID8gIkVOT0xTIiA6ICIiLCByZXN1bHRfZmxhZ3MpOworCisJCXJlcyA9IGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwKKwkJCQkJICAib3AgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGFjdC0+b3AsCisJCQkJCSAgImxvY2tfdHlwZSA9ICVzIiwgbG1fc3RyKGFjdC0+bG1fdHlwZSksCisJCQkJCSAgIm9wX3Jlc3VsdCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgYWN0LT5yZXN1bHQsCisJCQkJCSAgImxtX3Jlc3VsdCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgYWN0LT5sbV9ydiwKKwkJCQkJICAicmVzdWx0X2ZsYWdzID0gJXMiLCByZXN1bHRfZmxhZ3NbMF0gPyByZXN1bHRfZmxhZ3MgOiAibm9uZSIsCisJCQkJCSAgTlVMTCk7CisJfQorCisJaWYgKCFidWZmZXJfd3JpdGUoY2wtPmZkLCAmcmVzLmJ1ZmZlcikpIHsKKwkJcnYgPSAtZXJybm87CisJCWlmIChydiA+PSAwKQorCQkJcnYgPSAtMTsKKwkJbG9nX2RlYnVnKCJzZW5kIGNsICV1IGZkICVkIGVycm9yICVkIiwgY2wtPmlkLCBjbC0+ZmQsIHJ2KTsKKwl9CisKKwlidWZmZXJfZGVzdHJveSgmcmVzLmJ1ZmZlcik7CisKKwljbGllbnRfcmVzdW1lKGNsKTsKKworCWlmIChkdW1wX2ZkID49IDApIHsKKwkJLyogVG8gYXZvaWQgZGVhZGxvY2ssIHNlbmQgZGF0YSBoZXJlIGFmdGVyIHRoZSByZXBseS4gKi8KKwkJc2VuZF9kdW1wX2J1ZihkdW1wX2ZkLCBkdW1wX2xlbik7CisJCWNsb3NlKGR1bXBfZmQpOworCX0KKworCXJldHVybiBydjsKK30KKworLyogY2FsbGVkIGZyb20gY2xpZW50X3RocmVhZCAqLworc3RhdGljIHZvaWQgY2xpZW50X3B1cmdlKHN0cnVjdCBjbGllbnQgKmNsKQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzOworCXN0cnVjdCBhY3Rpb24gKmFjdDsKKworCS8qCisJICogSWYgdGhlIGNsaWVudCBtYWRlIG5vIGxvY2sgcmVxdWVzdHMsIHRoZXJlIGNhbiBiZQorCSAqIG5vIGxvY2tzIHRvIHJlbGVhc2UgZm9yIGl0LgorCSAqLworCWlmICghY2wtPmxvY2tfb3BzKQorCQlyZXR1cm47CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZsb2Nrc3BhY2VzLCBsaXN0KSB7CisJCWlmICghKGFjdCA9IGFsbG9jX2FjdGlvbigpKSkKKwkJCWNvbnRpbnVlOworCisJCWFjdC0+b3AgPSBMRF9PUF9DTE9TRTsKKwkJYWN0LT5jbGllbnRfaWQgPSBjbC0+aWQ7CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZscy0+bXV0ZXgpOworCQlpZiAoIWxzLT50aHJlYWRfc3RvcCkgeworCQkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmbHMtPmFjdGlvbnMpOworCQkJbHMtPnRocmVhZF93b3JrID0gMTsKKwkJCXB0aHJlYWRfY29uZF9zaWduYWwoJmxzLT5jb25kKTsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfYWN0aW9uKGFjdCk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxzLT5tdXRleCk7CisJfQorCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKK30KKworc3RhdGljIGludCBhZGRfbG9ja19hY3Rpb24oc3RydWN0IGFjdGlvbiAqYWN0KQoreworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzID0gTlVMTDsKKwljaGFyIGxzX25hbWVbTUFYX05BTUUrMV07CisKKwltZW1zZXQobHNfbmFtZSwgMCwgc2l6ZW9mKGxzX25hbWUpKTsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoaWNoIGxvY2tzcGFjZSB0aGlzIGFjdGlvbiBpcyBmb3IsIGFuZCBzZXQgbHNfbmFtZS4KKwkgKi8KKworCWlmIChhY3QtPnJ0ID09IExEX1JUX0dMKSB7CisJCS8qIEdsb2JhbCBsb2NrIGlzIHJlcXVlc3RlZCAqLworCQlpZiAoZ2xfdXNlX3NhbmxvY2sgJiYgKGFjdC0+b3AgPT0gTERfT1BfRU5BQkxFIHx8IGFjdC0+b3AgPT0gTERfT1BfRElTQUJMRSkpIHsKKwkJCXZnX2xzX25hbWUoYWN0LT52Z19uYW1lLCBsc19uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghZ2xfdXNlX2RsbSAmJiAhZ2xfdXNlX3NhbmxvY2spIHsKKwkJCQlpZiAobG1faXNfcnVubmluZ19kbG0oKSkKKwkJCQkJZ2xfdXNlX2RsbSA9IDE7CisJCQkJZWxzZSBpZiAobG1faXNfcnVubmluZ19zYW5sb2NrKCkpCisJCQkJCWdsX3VzZV9zYW5sb2NrID0gMTsKKwkJCX0KKwkJCWdsX2xzX25hbWUobHNfbmFtZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBWRyBsb2NrIGlzIHJlcXVlc3RlZCAqLworCQl2Z19sc19uYW1lKGFjdC0+dmdfbmFtZSwgbHNfbmFtZSk7CisJfQorCisgcmV0cnk6CisJcHRocmVhZF9tdXRleF9sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwlpZiAobHNfbmFtZVswXSkKKwkJbHMgPSBmaW5kX2xvY2tzcGFjZV9uYW1lKGxzX25hbWUpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwlpZiAoIWxzKSB7CisJCWlmIChhY3QtPm9wID09IExEX09QX1VQREFURSAmJiBhY3QtPnJ0ID09IExEX1JUX1ZHKSB7CisJCQlsb2dfZGVidWcoImxvY2tzcGFjZSBcIiVzXCIgbm90IGZvdW5kIGlnbm9yZWQgZm9yIHZnIHVwZGF0ZSIsIGxzX25hbWUpOworCQkJcmV0dXJuIC1FTk9MUzsKKworCQl9IGVsc2UgaWYgKGFjdC0+ZmxhZ3MgJiBMRF9BRl9TRUFSQ0hfTFMpIHsKKwkJCS8qCisJCQkgKiBGYWlsIGlmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgc2VhcmNoaW5nIGZvciB0aGUgbG9ja3NwYWNlLgorCQkJICovCisJCQlsb2dfZGVidWcoImxvY2tzcGFjZSBcIiVzXCIgbm90IGZvdW5kIGFmdGVyIHNlYXJjaCIsIGxzX25hbWUpOworCQkJcmV0dXJuIC1FTk9MUzsKKworCQl9IGVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfTE9DSyAmJiBhY3QtPnJ0ID09IExEX1JUX0dMICYmIGdsX3VzZV9zYW5sb2NrKSB7CisJCQkvKgorCQkJICogVGhlIHNhbmxvY2sgZ2xvYmFsIGxvY2sgbWF5IGhhdmUgYmVlbiBlbmFibGVkIGluIGFuIGV4aXN0aW5nIFZHLAorCQkJICogc28gc2VhcmNoIGV4aXN0aW5nIFZHcyBmb3IgYW4gZW5hYmxlZCBnbG9iYWwgbG9jay4KKwkJCSAqLworCQkJbG9nX2RlYnVnKCJsb2Nrc3BhY2UgXCIlc1wiIG5vdCBmb3VuZCBmb3Igc2FubG9jayBnbCwgc2VhcmNoaW5nLi4uIiwgbHNfbmFtZSk7CisJCQlhY3QtPmZsYWdzIHw9IExEX0FGX1NFQVJDSF9MUzsKKwkJCWFkZF93b3JrX2FjdGlvbihhY3QpOworCQkJcmV0dXJuIDA7CisKKwkJfSBlbHNlIGlmIChhY3QtPm9wID09IExEX09QX0xPQ0sgJiYgYWN0LT5ydCA9PSBMRF9SVF9HTCAmJiBhY3QtPm1vZGUgIT0gTERfTEtfVU4gJiYgZ2xfdXNlX2RsbSkgeworCQkJLyoKKwkJCSAqIEF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIGRsbSBnbG9iYWwgbG9ja3NwYWNlIHdoZW4KKwkJCSAqIGEgY29tbWFuZCB0cmllcyB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jay4KKwkJCSAqLworCQkJbG9nX2RlYnVnKCJsb2Nrc3BhY2UgXCIlc1wiIG5vdCBmb3VuZCBmb3IgZGxtIGdsLCBhZGRpbmcuLi4iLCBsc19uYW1lKTsKKwkJCWFjdC0+ZmxhZ3MgfD0gTERfQUZfU0VBUkNIX0xTOworCQkJYWN0LT5mbGFncyB8PSBMRF9BRl9XQUlUX1NUQVJUSU5HOworCQkJYWRkX2RsbV9nbG9iYWxfbG9ja3NwYWNlKE5VTEwpOworCQkJZ290byByZXRyeTsKKworCQl9IGVsc2UgaWYgKGFjdC0+b3AgPT0gTERfT1BfTE9DSyAmJiBhY3QtPm1vZGUgPT0gTERfTEtfVU4pIHsKKwkJCWxvZ19kZWJ1ZygibG9ja3NwYWNlIFwiJXNcIiBub3QgZm91bmQgZm9yIHVubG9jayBpZ25vcmVkIiwgbHNfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0xTOworCisJCX0gZWxzZSB7CisJCQlsb2dfZGVidWcoImxvY2tzcGFjZSBcIiVzXCIgbm90IGZvdW5kIiwgbHNfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0xTOworCQl9CisJfQorCisJaWYgKGFjdC0+bG1fdHlwZSA9PSBMRF9MTV9OT05FKSB7CisJCS8qIHJldHVybiB0byB0aGUgY29tbWFuZCB0aGUgdHlwZSB3ZSBhcmUgdXNpbmcgKi8KKwkJYWN0LT5sbV90eXBlID0gbHMtPmxtX3R5cGU7CisJfSBlbHNlIGlmIChhY3QtPmxtX3R5cGUgIT0gbHMtPmxtX3R5cGUpIHsKKwkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJbG9nX2Vycm9yKCJTICVzIGFkZF9sb2NrX2FjdGlvbiBiYWQgbG1fdHlwZSAlZCBscyAlZCIsCisJCQkgIGxzX25hbWUsIGFjdC0+bG1fdHlwZSwgbHMtPmxtX3R5cGUpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbHMtPm11dGV4KTsKKwlpZiAobHMtPnRocmVhZF9zdG9wKSB7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCWxvZ19lcnJvcigibG9ja3NwYWNlIGlzIHN0b3BwaW5nICVzIiwgbHNfbmFtZSk7CisJCXJldHVybiAtRVNUQUxFOworCX0KKworCWlmICghbHMtPmNyZWF0ZV9mYWlsICYmICFscy0+Y3JlYXRlX2RvbmUgJiYgIShhY3QtPmZsYWdzICYgTERfQUZfV0FJVF9TVEFSVElORykpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxzLT5tdXRleCk7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKwkJbG9nX2RlYnVnKCJsb2Nrc3BhY2UgaXMgc3RhcnRpbmcgJXMiLCBsc19uYW1lKTsKKwkJcmV0dXJuIC1FU1RBUlRJTkc7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmbHMtPmFjdGlvbnMpOworCWxzLT50aHJlYWRfd29yayA9IDE7CisJcHRocmVhZF9jb25kX3NpZ25hbCgmbHMtPmNvbmQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZscy0+bXV0ZXgpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nrc3BhY2VzX211dGV4KTsKKworCS8qIGxvY2tzcGFjZV90aHJlYWRfbWFpbiAvIHJlc19wcm9jZXNzIHRha2UgaXQgZnJvbSBoZXJlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHJfdG9fb3BfcnQoY29uc3QgY2hhciAqcmVxX25hbWUsIGludCAqb3AsIGludCAqcnQpCit7CisJaWYgKCFyZXFfbmFtZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgImhlbGxvIikpIHsKKwkJKm9wID0gTERfT1BfSEVMTE87CisJCSpydCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgInF1aXQiKSkgeworCQkqb3AgPSBMRF9PUF9RVUlUOworCQkqcnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJpbmZvIikpIHsKKwkJKm9wID0gTERfT1BfRFVNUF9JTkZPOworCQkqcnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJkdW1wIikpIHsKKwkJKm9wID0gTERfT1BfRFVNUF9MT0c7CisJCSpydCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgImluaXRfdmciKSkgeworCQkqb3AgPSBMRF9PUF9JTklUOworCQkqcnQgPSBMRF9SVF9WRzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAiaW5pdF9sdiIpKSB7CisJCSpvcCA9IExEX09QX0lOSVQ7CisJCSpydCA9IExEX1JUX0xWOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJmcmVlX3ZnIikpIHsKKwkJKm9wID0gTERfT1BfRlJFRTsKKwkJKnJ0ID0gTERfUlRfVkc7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgImJ1c3lfdmciKSkgeworCQkqb3AgPSBMRF9PUF9CVVNZOworCQkqcnQgPSBMRF9SVF9WRzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAiZnJlZV9sdiIpKSB7CisJCSpvcCA9IExEX09QX0ZSRUU7CisJCSpydCA9IExEX1JUX0xWOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJzdGFydF92ZyIpKSB7CisJCSpvcCA9IExEX09QX1NUQVJUOworCQkqcnQgPSBMRF9SVF9WRzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAic3RvcF92ZyIpKSB7CisJCSpvcCA9IExEX09QX1NUT1A7CisJCSpydCA9IExEX1JUX1ZHOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJzdGFydF93YWl0IikpIHsKKwkJKm9wID0gTERfT1BfU1RBUlRfV0FJVDsKKwkJKnJ0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAic3RvcF9hbGwiKSkgeworCQkqb3AgPSBMRF9PUF9TVE9QX0FMTDsKKwkJKnJ0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAibG9ja19nbCIpKSB7CisJCSpvcCA9IExEX09QX0xPQ0s7CisJCSpydCA9IExEX1JUX0dMOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJsb2NrX3ZnIikpIHsKKwkJKm9wID0gTERfT1BfTE9DSzsKKwkJKnJ0ID0gTERfUlRfVkc7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgImxvY2tfbHYiKSkgeworCQkqb3AgPSBMRF9PUF9MT0NLOworCQkqcnQgPSBMRF9SVF9MVjsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAidmdfdXBkYXRlIikpIHsKKwkJKm9wID0gTERfT1BfVVBEQVRFOworCQkqcnQgPSBMRF9SVF9WRzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAiZW5hYmxlX2dsIikpIHsKKwkJKm9wID0gTERfT1BfRU5BQkxFOworCQkqcnQgPSBMRF9SVF9HTDsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAiZGlzYWJsZV9nbCIpKSB7CisJCSpvcCA9IExEX09QX0RJU0FCTEU7CisJCSpydCA9IExEX1JUX0dMOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJyZW5hbWVfdmdfYmVmb3JlIikpIHsKKwkJKm9wID0gTERfT1BfUkVOQU1FX0JFRk9SRTsKKwkJKnJ0ID0gTERfUlRfVkc7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgInJlbmFtZV92Z19maW5hbCIpKSB7CisJCSpvcCA9IExEX09QX1JFTkFNRV9GSU5BTDsKKwkJKnJ0ID0gTERfUlRfVkc7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChyZXFfbmFtZSwgInJ1bm5pbmdfbG0iKSkgeworCQkqb3AgPSBMRF9PUF9SVU5OSU5HX0xNOworCQkqcnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJmaW5kX2ZyZWVfbG9jayIpKSB7CisJCSpvcCA9IExEX09QX0ZJTkRfRlJFRV9MT0NLOworCQkqcnQgPSBMRF9SVF9WRzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHJlcV9uYW1lLCAia2lsbF92ZyIpKSB7CisJCSpvcCA9IExEX09QX0tJTExfVkc7CisJCSpydCA9IExEX1JUX1ZHOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAocmVxX25hbWUsICJkcm9wX3ZnIikpIHsKKwkJKm9wID0gTERfT1BfRFJPUF9WRzsKKwkJKnJ0ID0gTERfUlRfVkc7CisJCXJldHVybiAwOworCX0KK291dDoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc3RyX3RvX21vZGUoY29uc3QgY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlnb3RvIG91dDsKKwlpZiAoIXN0cmNtcChzdHIsICJ1biIpKQorCQlyZXR1cm4gTERfTEtfVU47CisJaWYgKCFzdHJjbXAoc3RyLCAibmwiKSkKKwkJcmV0dXJuIExEX0xLX05MOworCWlmICghc3RyY21wKHN0ciwgInNoIikpCisJCXJldHVybiBMRF9MS19TSDsKKwlpZiAoIXN0cmNtcChzdHIsICJleCIpKQorCQlyZXR1cm4gTERfTEtfRVg7CitvdXQ6CisJcmV0dXJuIExEX0xLX0lWOworfQorCitzdGF0aWMgaW50IHN0cl90b19sbShjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCFzdHIgfHwgIXN0cmNtcChzdHIsICJub25lIikpCisJCXJldHVybiBMRF9MTV9OT05FOworCWlmICghc3RyY21wKHN0ciwgInNhbmxvY2siKSkKKwkJcmV0dXJuIExEX0xNX1NBTkxPQ0s7CisJaWYgKCFzdHJjbXAoc3RyLCAiZGxtIikpCisJCXJldHVybiBMRF9MTV9ETE07CisJcmV0dXJuIC0yOyAKK30KKworc3RhdGljIHVpbnQzMl90IHN0cl90b19vcHRzKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1aW50MzJfdCBmbGFncyA9IDA7CisKKwlpZiAoIXN0cikKKwkJZ290byBvdXQ7CisJaWYgKHN0cnN0cihzdHIsICJwZXJzaXN0ZW50IikpCisJCWZsYWdzIHw9IExEX0FGX1BFUlNJU1RFTlQ7CisJaWYgKHN0cnN0cihzdHIsICJ1bmxvY2tfY2FuY2VsIikpCisJCWZsYWdzIHw9IExEX0FGX1VOTE9DS19DQU5DRUw7CisJaWYgKHN0cnN0cihzdHIsICJuZXh0X3ZlcnNpb24iKSkKKwkJZmxhZ3MgfD0gTERfQUZfTkVYVF9WRVJTSU9OOworCWlmIChzdHJzdHIoc3RyLCAid2FpdCIpKQorCQlmbGFncyB8PSBMRF9BRl9XQUlUOworCWlmIChzdHJzdHIoc3RyLCAiZm9yY2UiKSkKKwkJZmxhZ3MgfD0gTERfQUZfRk9SQ0U7CisJaWYgKHN0cnN0cihzdHIsICJleF9kaXNhYmxlIikpCisJCWZsYWdzIHw9IExEX0FGX0VYX0RJU0FCTEU7CisJaWYgKHN0cnN0cihzdHIsICJlbmFibGUiKSkKKwkJZmxhZ3MgfD0gTERfQUZfRU5BQkxFOworCWlmIChzdHJzdHIoc3RyLCAiZGlzYWJsZSIpKQorCQlmbGFncyB8PSBMRF9BRl9ESVNBQkxFOworb3V0OgorCXJldHVybiBmbGFnczsKK30KKworLyoKKyAqIGR1bXAgaW5mbworICogY2xpZW50X2xpc3Q6IGVhY2ggY2xpZW50IHN0cnVjdAorICogbG9ja3NwYWNlczogZWFjaCBsb2Nrc3BhY2Ugc3RydWN0CisgKiBsb2Nrc3BhY2UgYWN0aW9uczogZWFjaCBhY3Rpb24gc3RydWN0CisgKiBsb2Nrc3BhY2UgcmVzb3VyY2VzOiBlYWNoIHJlc291cmNlIHN0cnVjdAorICogbG9ja3NwYWNlIHJlc291cmNlIGFjdGlvbnM6IGVhY2ggYWN0aW9uIHN0cnVjdAorICogbG9ja3NwYWNlIHJlc291cmNlIGxvY2tzOiBlYWNoIGxvY2sgc3RydWN0CisgKi8KKworc3RhdGljIGludCBzZXR1cF9kdW1wX3NvY2tldCh2b2lkKQoreworCWludCBzOworCisJcyA9IHNvY2tldChBRl9MT0NBTCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm4gczsKKworCW1lbXNldCgmZHVtcF9hZGRyLCAwLCBzaXplb2YoZHVtcF9hZGRyKSk7CisJZHVtcF9hZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKwlzdHJjcHkoJmR1bXBfYWRkci5zdW5fcGF0aFsxXSwgRFVNUF9TT0NLRVRfTkFNRSk7CisJZHVtcF9hZGRybGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KSArIHN0cmxlbihkdW1wX2FkZHIuc3VuX3BhdGgrMSkgKyAxOworCisJcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgTUFYX1NFTkRfTEVOIDY1NTM2CisjZGVmaW5lIFJFU0VORF9ERUxBWV9VUyAxMDAwCisjZGVmaW5lIFJFU0VORF9ERUxBWV9VU19NQVggNTAwMDAwCisKK3N0YXRpYyB2b2lkIHNlbmRfZHVtcF9idWYoaW50IGZkLCBpbnQgZHVtcF9sZW4pCit7CisJaW50IHBvcyA9IDA7CisJaW50IHJldDsKKwlpbnQgc2VuZF9sZW47CisJaW50IGRlbGF5ID0gMDsKKworCWlmICghZHVtcF9sZW4pCisJCXJldHVybjsKK3JlcGVhdDoKKwlpZiAoZHVtcF9sZW4gLSBwb3MgPCBNQVhfU0VORF9MRU4pCisJCXNlbmRfbGVuID0gZHVtcF9sZW4gLSBwb3M7CisJZWxzZQorCQlzZW5kX2xlbiA9IE1BWF9TRU5EX0xFTjsKKworCXJldCA9IHNlbmR0byhmZCwgZHVtcF9idWYgKyBwb3MsIHNlbmRfbGVuLCBNU0dfTk9TSUdOQUwgfCBNU0dfRE9OVFdBSVQsCisJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZkdW1wX2FkZHIsIGR1bXBfYWRkcmxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpICYmIChkZWxheSA8IFJFU0VORF9ERUxBWV9VU19NQVgpKSB7CisJCQl1c2xlZXAoUkVTRU5EX0RFTEFZX1VTKTsKKwkJCWRlbGF5ICs9IFJFU0VORF9ERUxBWV9VUzsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWxvZ19lcnJvcigic2VuZF9kdW1wX2J1ZiBkZWxheSAlZCBlcnJubyAlZCIsIGRlbGF5LCBlcnJubyk7CisJCXJldHVybjsKKwl9CisKKwlwb3MgKz0gcmV0OworCisJaWYgKHBvcyA8IGR1bXBfbGVuKQorCQlnb3RvIHJlcGVhdDsKKworCWxvZ19kZWJ1Zygic2VuZF9kdW1wX2J1ZiBkZWxheSAlZCB0b3RhbCAlZCIsIGRlbGF5LCBwb3MpOworfQorCitzdGF0aWMgaW50IHByaW50X3N0cnVjdHMoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcG9zLCBpbnQgbGVuKQoreworCXJldHVybiBzbnByaW50ZihkdW1wX2J1ZiArIHBvcywgbGVuIC0gcG9zLAorCQkJImluZm89JXMgIgorCQkJInVudXNlZF9hY3Rpb25fY291bnQ9JWQgIgorCQkJInVudXNlZF9jbGllbnRfY291bnQ9JWQgIgorCQkJInVudXNlZF9yZXNvdXJjZV9jb3VudD0lZCAiCisJCQkidW51c2VkX2xvY2tfY291bnQ9JWRcbiIsCisJCQlwcmVmaXgsCisJCQl1bnVzZWRfYWN0aW9uX2NvdW50LAorCQkJdW51c2VkX2NsaWVudF9jb3VudCwKKwkJCXVudXNlZF9yZXNvdXJjZV9jb3VudCwKKwkJCXVudXNlZF9sb2NrX2NvdW50KTsKK30KKworc3RhdGljIGludCBwcmludF9jbGllbnQoc3RydWN0IGNsaWVudCAqY2wsIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHBvcywgaW50IGxlbikKK3sKKwlyZXR1cm4gc25wcmludGYoZHVtcF9idWYgKyBwb3MsIGxlbiAtIHBvcywKKwkJCSJpbmZvPSVzICIKKwkJCSJwaWQ9JWQgIgorCQkJImZkPSVkICIKKwkJCSJwaT0lZCAiCisJCQkiaWQ9JXUgIgorCQkJIm5hbWU9JXNcbiIsCisJCQlwcmVmaXgsCisJCQljbC0+cGlkLAorCQkJY2wtPmZkLAorCQkJY2wtPnBpLAorCQkJY2wtPmlkLAorCQkJY2wtPm5hbWVbMF0gPyBjbC0+bmFtZSA6ICIuIik7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfbG9ja3NwYWNlKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwb3MsIGludCBsZW4pCit7CisJcmV0dXJuIHNucHJpbnRmKGR1bXBfYnVmICsgcG9zLCBsZW4gLSBwb3MsCisJCQkiaW5mbz0lcyAiCisJCQkibHNfbmFtZT0lcyAiCisJCQkidmdfbmFtZT0lcyAiCisJCQkidmdfdXVpZD0lcyAiCisJCQkidmdfc3lzaWQ9JXMgIgorCQkJInZnX2FyZ3M9JXMgIgorCQkJImxtX3R5cGU9JXMgIgorCQkJImhvc3RfaWQ9JWxsdSAiCisJCQkiY3JlYXRlX2ZhaWw9JWQgIgorCQkJImNyZWF0ZV9kb25lPSVkICIKKwkJCSJ0aHJlYWRfd29yaz0lZCAiCisJCQkidGhyZWFkX3N0b3A9JWQgIgorCQkJInRocmVhZF9kb25lPSVkICIKKwkJCSJraWxsX3ZnPSVkICIKKwkJCSJkcm9wX3ZnPSVkICIKKwkJCSJzYW5sb2NrX2dsX2VuYWJsZWQ9JWRcbiIsCisJCQlwcmVmaXgsCisJCQlscy0+bmFtZSwKKwkJCWxzLT52Z19uYW1lLAorCQkJbHMtPnZnX3V1aWQsCisJCQlscy0+dmdfc3lzaWRbMF0gPyBscy0+dmdfc3lzaWQgOiAiLiIsCisJCQlscy0+dmdfYXJncywKKwkJCWxtX3N0cihscy0+bG1fdHlwZSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxzLT5ob3N0X2lkLAorCQkJbHMtPmNyZWF0ZV9mYWlsID8gMSA6IDAsCisJCQlscy0+Y3JlYXRlX2RvbmUgPyAxIDogMCwKKwkJCWxzLT50aHJlYWRfd29yayA/IDEgOiAwLAorCQkJbHMtPnRocmVhZF9zdG9wID8gMSA6IDAsCisJCQlscy0+dGhyZWFkX2RvbmUgPyAxIDogMCwKKwkJCWxzLT5raWxsX3ZnLAorCQkJbHMtPmRyb3BfdmcsCisJCQlscy0+c2FubG9ja19nbF9lbmFibGVkID8gMSA6IDApOworfQorCitzdGF0aWMgaW50IHByaW50X2FjdGlvbihzdHJ1Y3QgYWN0aW9uICphY3QsIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHBvcywgaW50IGxlbikKK3sKKwlyZXR1cm4gc25wcmludGYoZHVtcF9idWYgKyBwb3MsIGxlbiAtIHBvcywKKwkJCSJpbmZvPSVzICIKKwkJCSJjbGllbnRfaWQ9JXUgIgorCQkJImZsYWdzPTB4JXggIgorCQkJInZlcnNpb249JXUgIgorCQkJIm9wPSVzICIKKwkJCSJydD0lcyAiCisJCQkibW9kZT0lcyAiCisJCQkibG1fdHlwZT0lcyAiCisJCQkicmVzdWx0PSVkICIKKwkJCSJsbV9ydj0lZFxuIiwKKwkJCXByZWZpeCwKKwkJCWFjdC0+Y2xpZW50X2lkLAorCQkJYWN0LT5mbGFncywKKwkJCWFjdC0+dmVyc2lvbiwKKwkJCW9wX3N0cihhY3QtPm9wKSwKKwkJCXJ0X3N0cihhY3QtPnJ0KSwKKwkJCW1vZGVfc3RyKGFjdC0+bW9kZSksCisJCQlsbV9zdHIoYWN0LT5sbV90eXBlKSwKKwkJCWFjdC0+cmVzdWx0LAorCQkJYWN0LT5sbV9ydik7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwb3MsIGludCBsZW4pCit7CisJcmV0dXJuIHNucHJpbnRmKGR1bXBfYnVmICsgcG9zLCBsZW4gLSBwb3MsCisJCQkiaW5mbz0lcyAiCisJCQkibmFtZT0lcyAiCisJCQkidHlwZT0lcyAiCisJCQkibW9kZT0lcyAiCisJCQkic2hfY291bnQ9JWQgIgorCQkJInZlcnNpb249JXVcbiIsCisJCQlwcmVmaXgsCisJCQlyLT5uYW1lLAorCQkJcnRfc3RyKHItPnR5cGUpLAorCQkJbW9kZV9zdHIoci0+bW9kZSksCisJCQlyLT5zaF9jb3VudCwKKwkJCXItPnZlcnNpb24pOworfQorCitzdGF0aWMgaW50IHByaW50X2xvY2soc3RydWN0IGxvY2sgKmxrLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwb3MsIGludCBsZW4pCit7CisJcmV0dXJuIHNucHJpbnRmKGR1bXBfYnVmICsgcG9zLCBsZW4gLSBwb3MsCisJCQkiaW5mbz0lcyAiCisJCQkibW9kZT0lcyAiCisJCQkidmVyc2lvbj0ldSAiCisJCQkiZmxhZ3M9MHgleCAiCisJCQkiY2xpZW50X2lkPSV1XG4iLAorCQkJcHJlZml4LAorCQkJbW9kZV9zdHIobGstPm1vZGUpLAorCQkJbGstPnZlcnNpb24sCisJCQlsay0+ZmxhZ3MsCisJCQlsay0+Y2xpZW50X2lkKTsKK30KKworc3RhdGljIGludCBkdW1wX2luZm8oaW50ICpkdW1wX2xlbikKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbDsKKwlzdHJ1Y3QgbG9ja3NwYWNlICpsczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJc3RydWN0IGxvY2sgKmxrOworCXN0cnVjdCBhY3Rpb24gKmFjdDsKKwlpbnQgbGVuLCBwb3MsIHJldDsKKwlpbnQgcnYgPSAwOworCisJbWVtc2V0KGR1bXBfYnVmLCAwLCBzaXplb2YoZHVtcF9idWYpKTsKKwlsZW4gPSBzaXplb2YoZHVtcF9idWYpOworCXBvcyA9IDA7CisKKwkvKgorCSAqIG1lbW9yeQorCSAqLworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ1bnVzZWRfc3RydWN0X211dGV4KTsKKwlyZXQgPSBwcmludF9zdHJ1Y3RzKCJzdHJ1Y3RzIiwgcG9zLCBsZW4pOworCWlmIChyZXQgPj0gbGVuIC0gcG9zKSB7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1bnVzZWRfc3RydWN0X211dGV4KTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCXBvcyArPSByZXQ7CisJcHRocmVhZF9tdXRleF91bmxvY2soJnVudXNlZF9zdHJ1Y3RfbXV0ZXgpOworCisJLyoKKwkgKiBjbGllbnRzCisJICovCisKKwlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmNsaWVudF9saXN0LCBsaXN0KSB7CisJCXJldCA9IHByaW50X2NsaWVudChjbCwgImNsaWVudCIsIHBvcywgbGVuKTsKKwkJaWYgKHJldCA+PSBsZW4gLSBwb3MpIHsKKwkJCSBydiA9IC1FTk9TUEM7CisJCQkgYnJlYWs7CisJCX0KKwkJcG9zICs9IHJldDsKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisKKwkvKgorCSAqIGxvY2tzcGFjZXMgd2l0aCB0aGVpciBhY3Rpb24vcmVzb3VyY2UvbG9jayBpbmZvCisJICovCisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZsb2Nrc3BhY2VzLCBsaXN0KSB7CisKKwkJcmV0ID0gcHJpbnRfbG9ja3NwYWNlKGxzLCAibHMiLCBwb3MsIGxlbik7CisJCWlmIChyZXQgPj0gbGVuIC0gcG9zKSB7CisJCQkgcnYgPSAtRU5PU1BDOworCQkJIGdvdG8gb3V0OworCQl9CisJCXBvcyArPSByZXQ7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3QsICZscy0+YWN0aW9ucywgbGlzdCkgeworCQkJcmV0ID0gcHJpbnRfYWN0aW9uKGFjdCwgImxzX2FjdGlvbiIsIHBvcywgbGVuKTsKKwkJCWlmIChyZXQgPj0gbGVuIC0gcG9zKSB7CisJCQkJcnYgPSAtRU5PU1BDOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcG9zICs9IHJldDsKKwkJfQorCisJCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmxzLT5yZXNvdXJjZXMsIGxpc3QpIHsKKwkJCXJldCA9IHByaW50X3Jlc291cmNlKHIsICJyIiwgcG9zLCBsZW4pOworCQkJaWYgKHJldCA+PSBsZW4gLSBwb3MpIHsKKwkJCQlydiA9IC1FTk9TUEM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwb3MgKz0gcmV0OworCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrLCAmci0+bG9ja3MsIGxpc3QpIHsKKwkJCQlyZXQgPSBwcmludF9sb2NrKGxrLCAibGsiLCBwb3MsIGxlbik7CisJCQkJaWYgKHJldCA+PSBsZW4gLSBwb3MpIHsKKwkJCQkJcnYgPSAtRU5PU1BDOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJcG9zICs9IHJldDsKKwkJCX0KKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3QsICZyLT5hY3Rpb25zLCBsaXN0KSB7CisJCQkJcmV0ID0gcHJpbnRfYWN0aW9uKGFjdCwgInJfYWN0aW9uIiwgcG9zLCBsZW4pOworCQkJCWlmIChyZXQgPj0gbGVuIC0gcG9zKSB7CisJCQkJCXJ2ID0gLUVOT1NQQzsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXBvcyArPSByZXQ7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tzcGFjZXNfbXV0ZXgpOworCisJKmR1bXBfbGVuID0gcG9zOworCisJcmV0dXJuIHJ2OworfQorCisvKiBjYWxsZWQgZnJvbSBjbGllbnRfdGhyZWFkLCBjbC0+bXV0ZXggaXMgaGVsZCAqLworc3RhdGljIHZvaWQgY2xpZW50X3JlY3ZfYWN0aW9uKHN0cnVjdCBjbGllbnQgKmNsKQoreworCXJlcXVlc3QgcmVxOworCXJlc3BvbnNlIHJlczsKKwlzdHJ1Y3QgYWN0aW9uICphY3Q7CisJY29uc3QgY2hhciAqY2xfbmFtZTsKKwljb25zdCBjaGFyICp2Z19uYW1lOworCWNvbnN0IGNoYXIgKnZnX3V1aWQ7CisJY29uc3QgY2hhciAqdmdfc3lzaWQ7CisJY29uc3QgY2hhciAqc3RyOworCWludDY0X3QgdmFsOworCXVpbnQzMl90IG9wdHMgPSAwOworCWludCByZXN1bHQgPSAwOworCWludCBjbF9waWQ7CisJaW50IG9wLCBydCwgbG0sIG1vZGU7CisJaW50IHJ2OworCisJYnVmZmVyX2luaXQoJnJlcS5idWZmZXIpOworCisJcnYgPSBidWZmZXJfcmVhZChjbC0+ZmQsICZyZXEuYnVmZmVyKTsKKwlpZiAoIXJ2KSB7CisJCWlmIChlcnJubyA9PSBFQ09OTlJFU0VUKSB7CisJCQlsb2dfZGVidWcoImNsaWVudCByZWN2ICV1IEVDT05OUkVTRVQiLCBjbC0+aWQpOworCQkJY2wtPmRlYWQgPSAxOworCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJjbGllbnQgcmVjdiAldSBidWZmZXJfcmVhZCBlcnJvciAlZCIsIGNsLT5pZCwgZXJybm8pOworCQl9CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKwkJY2xpZW50X3Jlc3VtZShjbCk7CisJCXJldHVybjsKKwl9CisKKwlyZXEuY2Z0ID0gZG1fY29uZmlnX2Zyb21fc3RyaW5nKHJlcS5idWZmZXIubWVtKTsKKwlpZiAoIXJlcS5jZnQpIHsKKwkJbG9nX2Vycm9yKCJjbGllbnQgcmVjdiAldSBjb25maWdfZnJvbV9zdHJpbmcgZXJyb3IiLCBjbC0+aWQpOworCQlidWZmZXJfZGVzdHJveSgmcmVxLmJ1ZmZlcik7CisJCWNsaWVudF9yZXN1bWUoY2wpOworCQlyZXR1cm47CisJfQorCisJc3RyID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgInJlcXVlc3QiLCBOVUxMKTsKKwlydiA9IHN0cl90b19vcF9ydChzdHIsICZvcCwgJnJ0KTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiY2xpZW50IHJlY3YgJXUgYmFkIHJlcXVlc3QgbmFtZSBcIiVzXCIiLCBjbC0+aWQsIHN0ciA/IHN0ciA6ICIiKTsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kocmVxLmNmdCk7CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKwkJY2xpZW50X3Jlc3VtZShjbCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAob3AgPT0gTERfT1BfSEVMTE8gfHwgb3AgPT0gTERfT1BfUVVJVCkgeworCisJCS8qCisJCSAqIEZJWE1FOiBhZGQgdGhlIGNsaWVudCBjb21tYW5kIG5hbWUgdG8gdGhlIGhlbGxvIG1lc3NhZ2VzCisJCSAqIHNvIGl0IGNhbiBiZSBzYXZlZCBpbiBjbC0+bmFtZSBoZXJlLgorCQkgKi8KKworCQlyZXN1bHQgPSAwOworCisJCWlmIChvcCA9PSBMRF9PUF9RVUlUKSB7CisJCQlsb2dfZGVidWcoIm9wIHF1aXQiKTsKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCSAgICAgICAJaWYgKGxpc3RfZW1wdHkoJmxvY2tzcGFjZXMpKQorCQkJCWRhZW1vbl9xdWl0ID0gMTsKKwkJCWVsc2UKKwkJCQlyZXN1bHQgPSAtRUJVU1k7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9ja3NwYWNlc19tdXRleCk7CisJCX0KKworCQlidWZmZXJfaW5pdCgmcmVzLmJ1ZmZlcik7CisKKwkJcmVzID0gZGFlbW9uX3JlcGx5X3NpbXBsZSgiT0siLAorCQkJCQkgICJyZXN1bHQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIHJlc3VsdCwKKwkJCQkJICAicHJvdG9jb2wgPSAlcyIsIGx2bWxvY2tkX3Byb3RvY29sLAorCQkJCQkgICJ2ZXJzaW9uID0gIiBGTVRkNjQsIChpbnQ2NF90KSBsdm1sb2NrZF9wcm90b2NvbF92ZXJzaW9uLAorCQkJCQkgIE5VTEwpOworCQlidWZmZXJfd3JpdGUoY2wtPmZkLCAmcmVzLmJ1ZmZlcik7CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXMuYnVmZmVyKTsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kocmVxLmNmdCk7CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKwkJY2xpZW50X3Jlc3VtZShjbCk7CisJCXJldHVybjsKKwl9CisKKwljbF9uYW1lID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgImNtZCIsIE5VTEwpOworCWNsX3BpZCA9IGRhZW1vbl9yZXF1ZXN0X2ludChyZXEsICJwaWQiLCAwKTsKKwl2Z19uYW1lID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgInZnX25hbWUiLCBOVUxMKTsKKwl2Z191dWlkID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgInZnX3V1aWQiLCBOVUxMKTsKKwl2Z19zeXNpZCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsICJ2Z19zeXNpZCIsIE5VTEwpOworCXN0ciA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsICJtb2RlIiwgTlVMTCk7CisJbW9kZSA9IHN0cl90b19tb2RlKHN0cik7CisJc3RyID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgIm9wdHMiLCBOVUxMKTsKKwlvcHRzID0gc3RyX3RvX29wdHMoc3RyKTsKKwlzdHIgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCAidmdfbG9ja190eXBlIiwgTlVMTCk7CisJbG0gPSBzdHJfdG9fbG0oc3RyKTsKKworCWlmIChjbF9waWQgJiYgY2xfcGlkICE9IGNsLT5waWQpCisJCWxvZ19lcnJvcigiY2xpZW50IHJlY3YgYmFkIG1lc3NhZ2UgcGlkICVkIGNsaWVudCAlZCIsIGNsX3BpZCwgY2wtPnBpZCk7CisKKwkvKiBGSVhNRTogZG8gdGhpcyBpbiBoZWxsbyBtZXNzYWdlIGluc3RlYWQgKi8KKwlpZiAoIWNsLT5uYW1lWzBdICYmIGNsX25hbWUpCisJCXN0cm5jcHkoY2wtPm5hbWUsIGNsX25hbWUsIE1BWF9OQU1FKTsKKworCWlmICghZ2xfdXNlX2RsbSAmJiAhZ2xfdXNlX3NhbmxvY2sgJiYgKGxtID4gMCkpIHsKKwkJaWYgKGxtID09IExEX0xNX0RMTSAmJiBsbV9zdXBwb3J0X2RsbSgpKQorCQkJZ2xfdXNlX2RsbSA9IDE7CisJCWVsc2UgaWYgKGxtID09IExEX0xNX1NBTkxPQ0sgJiYgbG1fc3VwcG9ydF9zYW5sb2NrKCkpCisJCQlnbF91c2Vfc2FubG9jayA9IDE7CisKKwkJbG9nX2RlYnVnKCJzZXQgZ2xfdXNlXyVzIiwgbG1fc3RyKGxtKSk7CisJfQorCisJaWYgKCEoYWN0ID0gYWxsb2NfYWN0aW9uKCkpKSB7CisJCWxvZ19lcnJvcigiTm8gbWVtb3J5IGZvciBhY3Rpb24iKTsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kocmVxLmNmdCk7CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKwkJY2xpZW50X3Jlc3VtZShjbCk7CisJCXJldHVybjsKKwl9CisKKwlhY3QtPmNsaWVudF9pZCA9IGNsLT5pZDsKKwlhY3QtPm9wID0gb3A7CisJYWN0LT5ydCA9IHJ0OworCWFjdC0+bW9kZSA9IG1vZGU7CisJYWN0LT5mbGFncyA9IG9wdHM7CisJYWN0LT5sbV90eXBlID0gbG07CisKKwlpZiAodmdfbmFtZSAmJiBzdHJjbXAodmdfbmFtZSwgIm5vbmUiKSkKKwkJc3RybmNweShhY3QtPnZnX25hbWUsIHZnX25hbWUsIE1BWF9OQU1FKTsKKworCWlmICh2Z191dWlkICYmIHN0cmNtcCh2Z191dWlkLCAibm9uZSIpKQorCQlzdHJuY3B5KGFjdC0+dmdfdXVpZCwgdmdfdXVpZCwgNjQpOworCisJaWYgKHZnX3N5c2lkICYmIHN0cmNtcCh2Z19zeXNpZCwgIm5vbmUiKSkKKwkJc3RybmNweShhY3QtPnZnX3N5c2lkLCB2Z19zeXNpZCwgTUFYX05BTUUpOworCisJc3RyID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgImx2X25hbWUiLCBOVUxMKTsKKwlpZiAoc3RyICYmIHN0cmNtcChzdHIsICJub25lIikpCisJCXN0cm5jcHkoYWN0LT5sdl9uYW1lLCBzdHIsIE1BWF9OQU1FKTsKKworCXN0ciA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsICJsdl91dWlkIiwgTlVMTCk7CisJaWYgKHN0ciAmJiBzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlzdHJuY3B5KGFjdC0+bHZfdXVpZCwgc3RyLCBNQVhfTkFNRSk7CisKKwl2YWwgPSBkYWVtb25fcmVxdWVzdF9pbnQocmVxLCAidmVyc2lvbiIsIDApOworCWlmICh2YWwpCisJCWFjdC0+dmVyc2lvbiA9ICh1aW50MzJfdCl2YWw7CisKKwlzdHIgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCAidmdfbG9ja19hcmdzIiwgTlVMTCk7CisJaWYgKHN0ciAmJiBzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlzdHJuY3B5KGFjdC0+dmdfYXJncywgc3RyLCBNQVhfQVJHUyk7CisKKwlzdHIgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCAibHZfbG9ja19hcmdzIiwgTlVMTCk7CisJaWYgKHN0ciAmJiBzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlzdHJuY3B5KGFjdC0+bHZfYXJncywgc3RyLCBNQVhfQVJHUyk7CisKKwkvKiBzdGFydF92ZyB3aWxsIGluY2x1ZGUgbHZtbG9jYWwuY29uZiBsb2NhbC9ob3N0X2lkIGhlcmUgKi8KKwl2YWwgPSBkYWVtb25fcmVxdWVzdF9pbnQocmVxLCAiaG9zdF9pZCIsIDApOworCWlmICh2YWwpCisJCWFjdC0+aG9zdF9pZCA9IHZhbDsKKworCWFjdC0+bWF4X3JldHJpZXMgPSBkYWVtb25fcmVxdWVzdF9pbnQocmVxLCAibWF4X3JldHJpZXMiLCBERUZBVUxUX01BWF9SRVRSSUVTKTsKKworCWRtX2NvbmZpZ19kZXN0cm95KHJlcS5jZnQpOworCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKworCWxvZ19kZWJ1ZygicmVjdiAlc1slZF0gY2wgJXUgJXMgJXMgXCIlc1wiIG1vZGUgJXMgZmxhZ3MgJXgiLAorCQkgIGNsLT5uYW1lWzBdID8gY2wtPm5hbWUgOiAiY2xpZW50IiwgY2wtPnBpZCwgY2wtPmlkLAorCQkgIG9wX3N0cihhY3QtPm9wKSwgcnRfc3RyKGFjdC0+cnQpLCBhY3QtPnZnX25hbWUsIG1vZGVfc3RyKGFjdC0+bW9kZSksIG9wdHMpOworCisJaWYgKGxtID09IExEX0xNX0RMTSAmJiAhbG1fc3VwcG9ydF9kbG0oKSkgeworCQlsb2dfZGVidWcoImRsbSBub3Qgc3VwcG9ydGVkIik7CisJCXJ2ID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxtID09IExEX0xNX1NBTkxPQ0sgJiYgIWxtX3N1cHBvcnRfc2FubG9jaygpKSB7CisJCWxvZ19kZWJ1Zygic2FubG9jayBub3Qgc3VwcG9ydGVkIik7CisJCXJ2ID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFjdC0+b3AgPT0gTERfT1BfTE9DSyAmJiBhY3QtPm1vZGUgIT0gTERfTEtfVU4pCisJCWNsLT5sb2NrX29wcyA9IDE7CisKKwlzd2l0Y2ggKGFjdC0+b3ApIHsKKwljYXNlIExEX09QX1NUQVJUOgorCQlydiA9IGFkZF9sb2Nrc3BhY2UoYWN0KTsKKwkJYnJlYWs7CisJY2FzZSBMRF9PUF9TVE9QOgorCQlydiA9IHJlbV9sb2Nrc3BhY2UoYWN0KTsKKwkJYnJlYWs7CisJY2FzZSBMRF9PUF9EVU1QX0xPRzoKKwljYXNlIExEX09QX0RVTVBfSU5GTzoKKwkJLyogVGhlIGNsaWVudCB0aHJlYWQgcmVwbHkgd2lsbCBjb3B5IGFuZCBzZW5kIHRoZSBkdW1wLiAqLworCQlhZGRfY2xpZW50X3Jlc3VsdChhY3QpOworCQlydiA9IDA7CisJCWJyZWFrOworCWNhc2UgTERfT1BfSU5JVDoKKwljYXNlIExEX09QX1NUQVJUX1dBSVQ6CisJY2FzZSBMRF9PUF9TVE9QX0FMTDoKKwljYXNlIExEX09QX1JFTkFNRV9GSU5BTDoKKwljYXNlIExEX09QX1JVTk5JTkdfTE06CisJCWFkZF93b3JrX2FjdGlvbihhY3QpOworCQlydiA9IDA7CisJCWJyZWFrOworCWNhc2UgTERfT1BfTE9DSzoKKwljYXNlIExEX09QX1VQREFURToKKwljYXNlIExEX09QX0VOQUJMRToKKwljYXNlIExEX09QX0RJU0FCTEU6CisJY2FzZSBMRF9PUF9GUkVFOgorCWNhc2UgTERfT1BfUkVOQU1FX0JFRk9SRToKKwljYXNlIExEX09QX0ZJTkRfRlJFRV9MT0NLOgorCWNhc2UgTERfT1BfS0lMTF9WRzoKKwljYXNlIExEX09QX0RST1BfVkc6CisJY2FzZSBMRF9PUF9CVVNZOgorCQlydiA9IGFkZF9sb2NrX2FjdGlvbihhY3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydiA9IC1FSU5WQUw7CisJfTsKKworb3V0OgorCWlmIChydiA8IDApIHsKKwkJYWN0LT5yZXN1bHQgPSBydjsKKwkJYWRkX2NsaWVudF9yZXN1bHQoYWN0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICpjbGllbnRfdGhyZWFkX21haW4odm9pZCAqYXJnX2luKQoreworCXN0cnVjdCBjbGllbnQgKmNsOworCXN0cnVjdCBhY3Rpb24gKmFjdDsKKwlzdHJ1Y3QgYWN0aW9uICphY3RfdW47CisJaW50IHJ2OworCisJd2hpbGUgKDEpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOworCQl3aGlsZSAoIWNsaWVudF93b3JrICYmIGxpc3RfZW1wdHkoJmNsaWVudF9yZXN1bHRzKSkgeworCQkJaWYgKGNsaWVudF9zdG9wKSB7CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwdGhyZWFkX2NvbmRfd2FpdCgmY2xpZW50X2NvbmQsICZjbGllbnRfbXV0ZXgpOworCQl9CisKKwkJLyoKKwkJICogU2VuZCBvdXRnb2luZyByZXN1bHRzIGJhY2sgdG8gY2xpZW50cworCQkgKi8KKworCQlpZiAoIWxpc3RfZW1wdHkoJmNsaWVudF9yZXN1bHRzKSkgeworCQkJYWN0ID0gbGlzdF9maXJzdF9lbnRyeSgmY2xpZW50X3Jlc3VsdHMsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCQljbCA9IGZpbmRfY2xpZW50X2lkKGFjdC0+Y2xpZW50X2lkKTsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOworCisJCQlpZiAoY2wpIHsKKwkJCQlwdGhyZWFkX211dGV4X2xvY2soJmNsLT5tdXRleCk7CisJCQkJcnYgPSBjbGllbnRfc2VuZF9yZXN1bHQoY2wsIGFjdCk7CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsLT5tdXRleCk7CisJCQl9IGVsc2UgeworCQkJCWxvZ19kZWJ1Zygibm8gY2xpZW50ICV1IGZvciByZXN1bHQiLCBhY3QtPmNsaWVudF9pZCk7CisJCQkJcnYgPSAtMTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBjbGllbnQgZmFpbGVkIGFmdGVyIHdlIGFjcXVpcmVkIGFuIExWIGxvY2sgZm9yCisJCQkgKiBpdCwgYnV0IGJlZm9yZSBnZXR0aW5nIHRoaXMgcmVwbHkgc2F5aW5nIGl0J3MgZG9uZS4KKwkJCSAqIFNvIHRoZSBsdiB3aWxsIG5vdCBiZSBhY3RpdmUgYW5kIHdlIHNob3VsZCByZWxlYXNlCisJCQkgKiB0aGUgbHYgbG9jayBpdCByZXF1ZXN0ZWQuCisJCQkgKi8KKwkJCWlmICgocnYgPCAwKSAmJiAoYWN0LT5mbGFncyAmIExEX0FGX0xWX0xPQ0spKSB7CisJCQkJbG9nX2RlYnVnKCJhdXRvIHVubG9jayBsdiBmb3IgZmFpbGVkIGNsaWVudCAldSIsIGFjdC0+Y2xpZW50X2lkKTsKKwkJCQlpZiAoKGFjdF91biA9IGFsbG9jX2FjdGlvbigpKSkgeworCQkJCQltZW1jcHkoYWN0X3VuLCBhY3QsIHNpemVvZihzdHJ1Y3QgYWN0aW9uKSk7CisJCQkJCWFjdF91bi0+bW9kZSA9IExEX0xLX1VOOworCQkJCQlhY3RfdW4tPmZsYWdzIHw9IExEX0FGX0xWX1VOTE9DSzsKKwkJCQkJYWN0X3VuLT5mbGFncyAmPSB+TERfQUZfTFZfTE9DSzsKKwkJCQkJYWRkX2xvY2tfYWN0aW9uKGFjdF91bik7CisJCQkJfQorCQkJfQorCisJCQlmcmVlX2FjdGlvbihhY3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBRdWV1ZSBpbmNvbWluZyBhY3Rpb25zIGZvciBsb2Nrc3BhY2UgdGhyZWFkcworCQkgKi8KKworCQlpZiAoY2xpZW50X3dvcmspIHsKKwkJCWNsID0gZmluZF9jbGllbnRfd29yaygpOworCQkJaWYgKCFjbCkKKwkJCQljbGllbnRfd29yayA9IDA7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKKworCQkJaWYgKCFjbCkKKwkJCQljb250aW51ZTsKKworCQkJcHRocmVhZF9tdXRleF9sb2NrKCZjbC0+bXV0ZXgpOworCisJCQlpZiAoY2wtPnJlY3YpIHsKKwkJCQljbC0+cmVjdiA9IDA7CisJCQkJY2xpZW50X3JlY3ZfYWN0aW9uKGNsKTsKKwkJCX0KKworCQkJaWYgKGNsLT5kZWFkKSB7CisJCQkJLyoKKwkJCQlsb2dfZGVidWcoImNsaWVudCByZW0gJWQgcGkgJWQgZmQgJWQgaWcgJWQiLAorCQkJCQkgIGNsLT5pZCwgY2wtPnBpLCBjbC0+ZmQsIGNsLT5wb2xsX2lnbm9yZSk7CisJCQkJKi8KKworCQkJCS8qCisJCQkJICogSWYgY2wtPmRlYWQgd2FzIHNldCBpbiBtYWluX2xvb3AsIHRoZW4gdGhlCisJCQkJICogZmQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgYW5kIHRoZSBwb2xsZmQKKwkJCQkgKiBlbnRyeSBpcyBhbHJlYWR5IHVudXNlZC4KKwkJCQkgKiBtYWluX2xvb3Agc2V0IGRlYWQ9MSwgaWdub3JlPTAsIHBpPS0xLCBmZD0tMQorCQkJCSAqCisJCQkJICogaWYgY2wtPmRlYWQgd2FzIG5vdCBzZXQgaW4gbWFpbl9sb29wLCBidXQKKwkJCQkgKiBzZXQgaW4gY2xpZW50X3JlY3ZfYWN0aW9uLCB0aGVuIHRoZSBtYWluX2xvb3AKKwkJCQkgKiBzaG91bGQgYmUgaWdub3JpbmcgdGhpcyBjbGllbnQgZmQuCisJCQkJICogbWFpbl9sb29wIHNldCBpZ25vcmU9MQorCQkJCSAqLworCisJCQkJaWYgKGNsLT5wb2xsX2lnbm9yZSkgeworCQkJCQlsb2dfZGVidWcoImNsaWVudCBjbG9zZSAlZCBwaSAlZCBmZCAlZCIsCisJCQkJCQkgIGNsLT5pZCwgY2wtPnBpLCBjbC0+ZmQpOworCQkJCQkvKiBhc3NlcnQgY2wtPnBpICE9IC0xICovCisJCQkJCS8qIGFzc2VydCBwb2xsZmRbcGldLmZkID09IEZEX0lHTk9SRSAqLworCQkJCQlpZiAoY2xvc2UoY2wtPmZkKSkKKwkJCQkJCWxvZ19lcnJvcigiY2xpZW50IGNsb3NlICVkIHBpICVkIGZkICVkIGZhaWxlZCIsCisJCQkJCQkJICBjbC0+aWQsIGNsLT5waSwgY2wtPmZkKTsKKwkJCQkJcmVtX3BvbGxmZChjbC0+cGkpOworCQkJCQljbC0+cGkgPSAtMTsKKwkJCQkJY2wtPmZkID0gLTE7CisJCQkJCWNsLT5wb2xsX2lnbm9yZSA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogbWFpbiB0aHJlYWQgc2hvdWxkIGhhdmUgY2xvc2VkICovCisJCQkJCWlmIChjbC0+cGkgIT0gLTEgfHwgY2wtPmZkICE9IC0xKSB7CisJCQkJCQlsb2dfZXJyb3IoImNsaWVudCAlZCBiYWQgc3RhdGUgcGkgJWQgZmQgJWQiLAorCQkJCQkJCSAgY2wtPmlkLCBjbC0+cGksIGNsLT5mZCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsLT5tdXRleCk7CisKKwkJCQlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJCQkJbGlzdF9kZWwoJmNsLT5saXN0KTsKKwkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKKworCQkJCWNsaWVudF9wdXJnZShjbCk7CisKKwkJCQlmcmVlX2NsaWVudChjbCk7CisJCQl9IGVsc2UgeworCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbC0+bXV0ZXgpOworCQkJfQorCQl9CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOworCX0KK291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzZXR1cF9jbGllbnRfdGhyZWFkKHZvaWQpCit7CisJaW50IHJ2OworCisJSU5JVF9MSVNUX0hFQUQoJmNsaWVudF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2xpZW50X3Jlc3VsdHMpOworCisJcHRocmVhZF9tdXRleF9pbml0KCZjbGllbnRfbXV0ZXgsIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZjbGllbnRfY29uZCwgTlVMTCk7CisKKwlydiA9IHB0aHJlYWRfY3JlYXRlKCZjbGllbnRfdGhyZWFkLCBOVUxMLCBjbGllbnRfdGhyZWFkX21haW4sIE5VTEwpOworCWlmIChydikKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9jbGllbnRfdGhyZWFkKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOworCWNsaWVudF9zdG9wID0gMTsKKwlwdGhyZWFkX2NvbmRfc2lnbmFsKCZjbGllbnRfY29uZCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisJcHRocmVhZF9qb2luKGNsaWVudF90aHJlYWQsIE5VTEwpOworfQorCisvKgorICogR2V0IGEgbGlzdCBvZiBhbGwgVkdzIHdpdGggYSBsb2NrZCB0eXBlIChzYW5sb2NrfGRsbSkgZnJvbSBsdm1ldGFkLgorICogV2UnbGwgbWF0Y2ggdGhpcyBsaXN0IGFnYWluc3QgYSBsaXN0IG9mIGV4aXN0aW5nIGxvY2tzcGFjZXMgdGhhdCBhcmUKKyAqIGZvdW5kIGluIHRoZSBsb2NrIG1hbmFnZXIuCisgKgorICogRm9yIGVhY2ggb2YgdGhlc2UgVkdzLCBhbHNvIGNyZWF0ZSBhIHN0cnVjdCByZXNvdXJjZSBvbiBscy0+cmVzb3VyY2VzIHRvCisgKiByZXByZXNlbnQgZWFjaCBMViBpbiB0aGUgVkcgdGhhdCB1c2VzIGEgbG9jay4gIEZvciBlYWNoIG9mIHRoZXNlIExWcworICogdGhhdCBhcmUgYWN0aXZlLCB3ZSdsbCBhdHRlbXB0IHRvIGFkb3B0IGEgbG9jay4KKyAqLworCitzdGF0aWMgaW50IGdldF9sb2NrZF92Z3Moc3RydWN0IGxpc3RfaGVhZCAqdmdfbG9ja2QpCit7CisJc3RydWN0IGxpc3RfaGVhZCB1cGRhdGVfdmdzOworCWRhZW1vbl9yZXBseSByZXBseTsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWV0YWRhdGE7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICptZF9jbjsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmx2X2NuOworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzLCAqc2FmZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICp2Z191dWlkOworCWNvbnN0IGNoYXIgKmx2X3V1aWQ7CisJY29uc3QgY2hhciAqbG9ja190eXBlOworCWNvbnN0IGNoYXIgKmxvY2tfYXJnczsKKwljaGFyIGZpbmRfc3RyX3BhdGhbUEFUSF9NQVhdOworCWludCBydiA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmdXBkYXRlX3Zncyk7CisKKwlyZXBseSA9IHNlbmRfbHZtZXRhZCgidmdfbGlzdCIsICJ0b2tlbiA9ICVzIiwgInNraXAiLCBOVUxMKTsKKworCWlmIChyZXBseS5lcnJvciB8fCBzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkgeworCQlsb2dfZXJyb3IoInZnX2xpc3QgZnJvbSBsdm1ldGFkIGZhaWxlZCAlZCIsIHJlcGx5LmVycm9yKTsKKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIGRlc3Ryb3k7CisJfQorCisJaWYgKCEoY24gPSBkbV9jb25maWdfZmluZF9ub2RlKHJlcGx5LmNmdC0+cm9vdCwgInZvbHVtZV9ncm91cHMiKSkpIHsKKwkJbG9nX2Vycm9yKCJnZXRfbG9ja2RfdmdzIG5vIHZncyIpOworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gZGVzdHJveTsKKwl9CisKKwkvKiBjcmVhdGUgYW4gdXBkYXRlX3ZncyBsaXN0IG9mIGFsbCB2ZyB1dWlkcyAqLworCisJZm9yIChjbiA9IGNuLT5jaGlsZDsgY247IGNuID0gY24tPnNpYikgeworCQl2Z191dWlkID0gY24tPmtleTsKKworCQlpZiAoIShscyA9IGFsbG9jX2xvY2tzcGFjZSgpKSkgeworCQkJcnYgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlzdHJuY3B5KGxzLT52Z191dWlkLCB2Z191dWlkLCA2NCk7CisJCWxpc3RfYWRkX3RhaWwoJmxzLT5saXN0LCAmdXBkYXRlX3Zncyk7CisJCWxvZ19kZWJ1ZygiZ2V0X2xvY2tkX3ZncyAlcyIsIHZnX3V1aWQpOworCX0KKyBkZXN0cm95OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCWlmIChydiA8IDApCisJCWdvdG8gb3V0OworCisJLyogZ2V0IHZnX25hbWUgYW5kIGxvY2tfdHlwZSBmb3IgZWFjaCB2ZyB1dWlkIGVudHJ5IGluIHVwZGF0ZV92Z3MgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZ1cGRhdGVfdmdzLCBsaXN0KSB7CisJCXJlcGx5ID0gc2VuZF9sdm1ldGFkKCJ2Z19sb29rdXAiLAorCQkJCSAgICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJICAgICAidXVpZCA9ICVzIiwgbHMtPnZnX3V1aWQsCisJCQkJICAgICBOVUxMKTsKKworCQlpZiAocmVwbHkuZXJyb3IgfHwgc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZXNwb25zZSIsICIiKSwgIk9LIikpIHsKKwkJCWxvZ19lcnJvcigidmdfbG9va3VwIGZyb20gbHZtZXRhZCBmYWlsZWQgJWQiLCByZXBseS5lcnJvcik7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQl2Z19uYW1lID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgIm5hbWUiLCBOVUxMKTsKKwkJaWYgKCF2Z19uYW1lKSB7CisJCQlsb2dfZXJyb3IoImdldF9sb2NrZF92Z3MgJXMgbm8gbmFtZSIsIGxzLT52Z191dWlkKTsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCXN0cm5jcHkobHMtPnZnX25hbWUsIHZnX25hbWUsIE1BWF9OQU1FKTsKKworCQltZXRhZGF0YSA9IGRtX2NvbmZpZ19maW5kX25vZGUocmVwbHkuY2Z0LT5yb290LCAibWV0YWRhdGEiKTsKKwkJaWYgKCFtZXRhZGF0YSkgeworCQkJbG9nX2Vycm9yKCJnZXRfbG9ja2RfdmdzICVzIG5hbWUgJXMgbm8gbWV0YWRhdGEiLAorCQkJCSAgbHMtPnZnX3V1aWQsIGxzLT52Z19uYW1lKTsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWxvY2tfdHlwZSA9IGRtX2NvbmZpZ19maW5kX3N0cihtZXRhZGF0YSwgIm1ldGFkYXRhL2xvY2tfdHlwZSIsIE5VTEwpOworCQlscy0+bG1fdHlwZSA9IHN0cl90b19sbShsb2NrX3R5cGUpOworCisJCWlmICgobHMtPmxtX3R5cGUgIT0gTERfTE1fU0FOTE9DSykgJiYgKGxzLT5sbV90eXBlICE9IExEX0xNX0RMTSkpIHsKKwkJCWxvZ19kZWJ1ZygiZ2V0X2xvY2tkX3ZncyAlcyBub3QgbG9ja2QgdHlwZSIsIGxzLT52Z19uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbG9ja19hcmdzID0gZG1fY29uZmlnX2ZpbmRfc3RyKG1ldGFkYXRhLCAibWV0YWRhdGEvbG9ja19hcmdzIiwgTlVMTCk7CisJCWlmIChsb2NrX2FyZ3MpCisJCQlzdHJuY3B5KGxzLT52Z19hcmdzLCBsb2NrX2FyZ3MsIE1BWF9BUkdTKTsKKworCQlsb2dfZGVidWcoImdldF9sb2NrZF92Z3MgJXMgbG9ja190eXBlICVzIGxvY2tfYXJncyAlcyIsCisJCQkgIGxzLT52Z19uYW1lLCBsb2NrX3R5cGUsIGxvY2tfYXJncyA/OiAibm9uZSIpOworCisJCS8qCisJCSAqIE1ha2UgYSByZWNvcmQgKHN0cnVjdCByZXNvdXJjZSkgb2YgZWFjaCBsdiB0aGF0IHVzZXMgYSBsb2NrLgorCQkgKiBGb3IgYW55IGx2IHRoYXQgdXNlcyBhIGxvY2ssIHdlJ2xsIGNoZWNrIGlmIHRoZSBsdiBpcyBhY3RpdmUKKwkJICogYW5kIGlmIHNvIHRyeSB0byBhZG9wdCBhIGxvY2sgZm9yIGl0LgorCQkgKi8KKworCQlmb3IgKG1kX2NuID0gbWV0YWRhdGEtPmNoaWxkOyBtZF9jbjsgbWRfY24gPSBtZF9jbi0+c2liKSB7CisJCQlpZiAoc3RyY21wKG1kX2NuLT5rZXksICJsb2dpY2FsX3ZvbHVtZXMiKSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChsdl9jbiA9IG1kX2NuLT5jaGlsZDsgbHZfY247IGx2X2NuID0gbHZfY24tPnNpYikgeworCQkJCXNucHJpbnRmKGZpbmRfc3RyX3BhdGgsIFBBVEhfTUFYLCAiJXMvbG9ja190eXBlIiwgbHZfY24tPmtleSk7CisJCQkJbG9ja190eXBlID0gZG1fY29uZmlnX2ZpbmRfc3RyKGx2X2NuLCBmaW5kX3N0cl9wYXRoLCBOVUxMKTsKKworCQkJCWlmICghbG9ja190eXBlKQorCQkJCQljb250aW51ZTsKKworCQkJCXNucHJpbnRmKGZpbmRfc3RyX3BhdGgsIFBBVEhfTUFYLCAiJXMvbG9ja19hcmdzIiwgbHZfY24tPmtleSk7CisJCQkJbG9ja19hcmdzID0gZG1fY29uZmlnX2ZpbmRfc3RyKGx2X2NuLCBmaW5kX3N0cl9wYXRoLCBOVUxMKTsKKworCQkJCXNucHJpbnRmKGZpbmRfc3RyX3BhdGgsIFBBVEhfTUFYLCAiJXMvaWQiLCBsdl9jbi0+a2V5KTsKKwkJCQlsdl91dWlkID0gZG1fY29uZmlnX2ZpbmRfc3RyKGx2X2NuLCBmaW5kX3N0cl9wYXRoLCBOVUxMKTsKKworCQkJCWlmICghbHZfdXVpZCkgeworCQkJCQlsb2dfZXJyb3IoImdldF9sb2NrX3ZncyBubyBsdiBpZCBmb3IgbmFtZSAlcyIsIGx2X2NuLT5rZXkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIShyID0gYWxsb2NfcmVzb3VyY2UoKSkpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCisJCQkJci0+dXNlX3ZiID0gMDsKKwkJCQlyLT50eXBlID0gTERfUlRfTFY7CisJCQkJc3RybmNweShyLT5uYW1lLCBsdl91dWlkLCBNQVhfTkFNRSk7CisJCQkJaWYgKGxvY2tfYXJncykKKwkJCQkJc3RybmNweShyLT5sdl9hcmdzLCBsb2NrX2FyZ3MsIE1BWF9BUkdTKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZyLT5saXN0LCAmbHMtPnJlc291cmNlcyk7CisJCQkJbG9nX2RlYnVnKCJnZXRfbG9ja2RfdmdzICVzIGx2ICVzICVzIChuYW1lICVzKSIsCisJCQkJCSAgbHMtPnZnX25hbWUsIHItPm5hbWUsIGxvY2tfYXJncyA/IGxvY2tfYXJncyA6ICIiLCBsdl9jbi0+a2V5KTsKKwkJCX0KKwkJfQorIG5leHQ6CisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCQlpZiAocnYgPCAwKQorCQkJYnJlYWs7CisJfQorb3V0OgorCS8qIFJldHVybiBsb2NrZCBWRydzIG9uIHRoZSB2Z19sb2NrZCBsaXN0LiAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzLCBzYWZlLCAmdXBkYXRlX3ZncywgbGlzdCkgeworCQlsaXN0X2RlbCgmbHMtPmxpc3QpOworCisJCWlmICgobHMtPmxtX3R5cGUgPT0gTERfTE1fU0FOTE9DSykgfHwgKGxzLT5sbV90eXBlID09IExEX0xNX0RMTSkpCisJCQlsaXN0X2FkZF90YWlsKCZscy0+bGlzdCwgdmdfbG9ja2QpOworCQllbHNlCisJCQlmcmVlKGxzKTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBjaGFyIF9kbV91dWlkWzY0XTsKKworc3RhdGljIGNoYXIgKmdldF9kbV91dWlkKGNoYXIgKmRtX25hbWUpCit7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWNvbnN0IGNoYXIgKnV1aWQ7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfSU5GTykpKQorCQlnb3RvIGZhaWxfb3V0OworCisJaWYgKCFkbV90YXNrX3NldF9uYW1lKGRtdCwgZG1fbmFtZSkpCisJCWdvdG8gZmFpbDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290byBmYWlsOworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIWluZm8uZXhpc3RzKQorCQlnb3RvIGZhaWw7CisKKwl1dWlkID0gZG1fdGFza19nZXRfdXVpZChkbXQpOworCWlmICghdXVpZCkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgdXVpZCBmb3IgZGV2aWNlICVzIiwgZG1fbmFtZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoc3RybmNtcCh1dWlkLCAiTFZNIiwgMykpIHsKKwkJbG9nX2RlYnVnKCJkbSBkZXZpY2UgJXMgaXMgbm90IGZyb20gTFZNIiwgZG1fbmFtZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZW1zZXQoX2RtX3V1aWQsIDAsIHNpemVvZihfZG1fdXVpZCkpOworCXN0cm5jcHkoX2RtX3V1aWQsIHV1aWQsIHNpemVvZihfZG1fdXVpZCktMSk7CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIF9kbV91dWlkOworCitmYWlsOgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworZmFpbF9vdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBkbSByZXBvcnRzIHRoZSBMViB1dWlkIGFzOgorICogTFZNLXlkcFJJZERXQkRYMjV1cG1qMmswRDRkZWF0Nm94SDhlcjAzVDBmNHhNOHJQSVY4WHFJaHd2M2g4WTd4UldqTXIKKyAqCisgKiB0aGUgbG9jayBuYW1lIGZvciB0aGUgTFYgaXM6CisgKiByMDNUMGYtNHhNOC1yUElWLThYcUktaHd2My1oOFk3LXhSV2pNcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBib3RoIGFzOgorICogcjAzVDBmNHhNOHJQSVY4WHFJaHd2M2g4WTd4UldqTXIKKyAqCisgKiBhbmQgcmV0dXJucyAxIGlmIHRoZXkgbWF0Y2guCisgKi8KKworc3RhdGljIGludCBtYXRjaF9kbV91dWlkKGNoYXIgKmRtX3V1aWQsIGNoYXIgKmx2X2xvY2tfdXVpZCkKK3sKKwljaGFyIGJ1ZjFbNjRdOworCWNoYXIgYnVmMls2NF07CisJaW50IGksIGo7CisKKwltZW1zZXQoYnVmMSwgMCwgc2l6ZW9mKGJ1ZjEpKTsKKwltZW1zZXQoYnVmMiwgMCwgc2l6ZW9mKGJ1ZjIpKTsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgc3RybGVuKGx2X2xvY2tfdXVpZCk7IGkrKykgeworCQlpZiAobHZfbG9ja191dWlkW2ldID09ICctJykKKwkJCWNvbnRpbnVlOworCQlidWYxW2pdID0gbHZfbG9ja191dWlkW2ldOworCQlqKys7CisJfQorCisJZm9yIChpID0gMzYsIGogPSAwOyBpIDwgNjk7IGkrKykgeworCQlidWYyW2pdID0gZG1fdXVpZFtpXTsKKwkJaisrOworCX0KKworCWlmICghc3RyY21wKGJ1ZjEsIGJ1ZjIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbCBMVnMgd2l0aCBhIGxvY2tfdHlwZSBhcmUgb24gbHMtPnJlc291cmNlcy4KKyAqIFJlbW92ZSBhbnkgdGhhdCBhcmUgbm90IGFjdGl2ZS4gIFRoZSByZW1haW5pbmcKKyAqIHdpbGwgaGF2ZSBsb2NrcyBhZG9wdGVkLgorICovCisKK3N0YXRpYyBpbnQgcmVtb3ZlX2luYWN0aXZlX2x2cyhzdHJ1Y3QgbGlzdF9oZWFkICp2Z19sb2NrZCkKK3sKKwlzdHJ1Y3QgbG9ja3NwYWNlICpsczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpyc2FmZTsKKwlzdHJ1Y3QgZG1fbmFtZXMgKm5hbWVzOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJY2hhciAqZG1fdXVpZDsKKwljaGFyICp2Z25hbWUsICpsdm5hbWUsICpsYXllcjsKKwljaGFyIG5hbWVidWZbTUFYX05BTUUrMV07CisJdW5zaWduZWQgbmV4dCA9IDA7CisJaW50IHJ2ID0gMDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9MSVNUKSkpCisJCXJldHVybiAtMTsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgZG0gZGV2aWNlcyIpOworCQlydiA9IC0xOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAoIShuYW1lcyA9IGRtX3Rhc2tfZ2V0X25hbWVzKGRtdCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBkbSBuYW1lcyIpOworCQlydiA9IC0xOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAoIW5hbWVzLT5kZXYpIHsKKwkJbG9nX2RlYnVnKCJkbSBuYW1lcyBub25lIGZvdW5kIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRm9yIGVhY2ggZG0gbmFtZSwgY29tcGFyZSBpdCB0byBlYWNoIGx2IGluIGVhY2ggbG9ja2QgdmcuCisJICovCisKKwlkbyB7CisJCW5hbWVzID0gKHN0cnVjdCBkbV9uYW1lcyAqKSgoY2hhciAqKSBuYW1lcyArIG5leHQpOworCisJCWRtX3V1aWQgPSBnZXRfZG1fdXVpZChuYW1lcy0+bmFtZSk7CisJCWlmICghZG1fdXVpZCkKKwkJCWdvdG8gbmV4dF9kbW5hbWU7CisKKwkJdmduYW1lID0gTlVMTDsKKwkJbHZuYW1lID0gTlVMTDsKKwkJbGF5ZXIgPSBOVUxMOworCisJCW1lbXNldChuYW1lYnVmLCAwLCBzaXplb2YobmFtZWJ1ZikpOworCQlzdHJuY3B5KG5hbWVidWYsIG5hbWVzLT5uYW1lLCBNQVhfTkFNRSk7CisJCXZnbmFtZSA9IG5hbWVidWY7CisKKwkJaWYgKCFkbV9zcGxpdF9sdm1fbmFtZShOVUxMLCBuYW1lYnVmLCAmdmduYW1lLCAmbHZuYW1lLCAmbGF5ZXIpKSB7CisJCQlsb2dfZXJyb3IoImZhaWxlZCB0byBzcGxpdCBkbSBuYW1lICVzIiwgbmFtZWJ1Zik7CisJCQlnb3RvIG5leHRfZG1uYW1lOworCQl9CisKKwkJbG9nX2RlYnVnKCJhZG9wdCByZW1vdmVfaW5hY3RpdmUgZG0gbmFtZSAlcyBkbSB1dWlkICVzIHZnbmFtZSAlcyBsdm5hbWUgJXMiLAorCQkJICBuYW1lcy0+bmFtZSwgZG1fdXVpZCwgdmduYW1lLCBsdm5hbWUpOworCisJCWlmICghdmduYW1lIHx8ICFsdm5hbWUpIHsKKwkJCWxvZ19kZWJ1ZygiZG0gbmFtZSAlcyBpbnZhbGlkIHNwbGl0IHZnICVzIGx2ICVzIGxheWVyICVzIiwKKwkJCQkgIG5hbWVzLT5uYW1lLCB2Z25hbWUgPyB2Z25hbWUgOiAiIiwgbHZuYW1lID8gbHZuYW1lIDogIiIsIGxheWVyID8gbGF5ZXIgOiAiIik7CisJCQlnb3RvIG5leHRfZG1uYW1lOworCQl9CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgdmdfbG9ja2QsIGxpc3QpIHsKKwkJCWlmIChzdHJjbXAodmduYW1lLCBscy0+dmdfbmFtZSkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghc3RyY21wKGx2bmFtZSwgImx2bWxvY2siKSkKKwkJCQljb250aW51ZTsKKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmbHMtPnJlc291cmNlcywgbGlzdCkgeworCQkJCWlmICghbWF0Y2hfZG1fdXVpZChkbV91dWlkLCByLT5uYW1lKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKiBGb3VuZCBhbiBhY3RpdmUgTFYgaW4gYSBsb2NrZCBWRy4gKi8KKwkJCQlsb2dfZGVidWcoImRtIGRldmljZSAlcyBhZG9wdCBpbiB2ZyAlcyBsdiAlcyIsCisJCQkJCSAgbmFtZXMtPm5hbWUsIGxzLT52Z19uYW1lLCByLT5uYW1lKTsKKwkJCQlyLT5hZG9wdCA9IDE7CisJCQkJZ290byBuZXh0X2RtbmFtZTsKKwkJCX0KKwkJfQorbmV4dF9kbW5hbWU6CisJCW5leHQgPSBuYW1lcy0+bmV4dDsKKwl9IHdoaWxlIChuZXh0KTsKKworb3V0OgorCS8qIFJlbW92ZSBhbnkgc3RydWN0IHJlc291cmNlcyB0aGF0IGRvIG5vdCBuZWVkIGxvY2tzIGFkb3B0ZWQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgdmdfbG9ja2QsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHJzYWZlLCAmbHMtPnJlc291cmNlcywgbGlzdCkgeworCQkJaWYgKHItPmFkb3B0KSB7CisJCQkJci0+YWRvcHQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZGVidWcoImxvY2tkIHZnICVzIHJlbW92ZSBpbmFjdGl2ZSBsdiAlcyIsIGxzLT52Z19uYW1lLCByLT5uYW1lKTsKKwkJCQlsaXN0X2RlbCgmci0+bGlzdCk7CisJCQkJZnJlZV9yZXNvdXJjZShyKTsKKwkJCX0KKwkJfQorCX0KK3JldDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGFkb3B0X2xvY2tzKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCBsc19mb3VuZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZnX2xvY2tkOworCXN0cnVjdCBsaXN0X2hlYWQgdG9fdW5sb2NrOworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzLCAqbHNhZmU7CisJc3RydWN0IGxvY2tzcGFjZSAqbHMxLCAqbDFzYWZlOworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzMiwgKmwyc2FmZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpyc2FmZTsKKwlzdHJ1Y3QgYWN0aW9uICphY3QsICphc2FmZTsKKwlpbnQgY291bnRfc3RhcnQgPSAwLCBjb3VudF9zdGFydF9kb25lID0gMCwgY291bnRfc3RhcnRfZmFpbCA9IDA7CisJaW50IGNvdW50X2Fkb3B0ID0gMCwgY291bnRfYWRvcHRfZG9uZSA9IDAsIGNvdW50X2Fkb3B0X2ZhaWwgPSAwOworCWludCBmb3VuZCwgcnY7CisKKwlJTklUX0xJU1RfSEVBRCgmYWRvcHRfcmVzdWx0cyk7CisKKwlJTklUX0xJU1RfSEVBRCgmbHNfZm91bmQpOworCUlOSVRfTElTVF9IRUFEKCZ2Z19sb2NrZCk7CisJSU5JVF9MSVNUX0hFQUQoJnRvX3VubG9jayk7CisKKwkvKgorCSAqIEdldCBsaXN0IG9mIGxvY2tzcGFjZXMgZnJvbSBsb2NrIG1hbmFnZXJzLgorCSAqIEdldCBsaXN0IG9mIFZHcyBmcm9tIGx2bWV0YWQgd2l0aCBhIGxvY2tkIHR5cGUuCisJICogR2V0IGxpc3Qgb2YgYWN0aXZlIGxvY2tkIHR5cGUgTFZzIGZyb20gL2Rldi4KKwkgKgorCSAqIEVDT05OUkVGVVNFRCBtZWFucyB0aGUgbG9jayBtYW5hZ2VyIGlzIG5vdCBydW5uaW5nLgorCSAqIFRoaXMgaXMgZXhwZWN0ZWQgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGVtLgorCSAqLworCisJaWYgKGxtX3N1cHBvcnRfZGxtKCkpIHsKKwkJcnYgPSBsbV9nZXRfbG9ja3NwYWNlc19kbG0oJmxzX2ZvdW5kKTsKKwkJaWYgKChydiA8IDApICYmIChydiAhPSAtRUNPTk5SRUZVU0VEKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAobG1fc3VwcG9ydF9zYW5sb2NrKCkpIHsKKwkJcnYgPSBsbV9nZXRfbG9ja3NwYWNlc19zYW5sb2NrKCZsc19mb3VuZCk7CisJCWlmICgocnYgPCAwKSAmJiAocnYgIT0gLUVDT05OUkVGVVNFRCkpCisJCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmxzX2ZvdW5kKSkgeworCQlsb2dfZGVidWcoIk5vIGxvY2tzcGFjZXMgZm91bmQgdG8gYWRvcHQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQWRkcyBhIHN0cnVjdCBsb2Nrc3BhY2UgdG8gdmdfbG9ja2QgZm9yIGVhY2ggbG9ja2QgVkcuCisJICogQWRkcyBhIHN0cnVjdCByZXNvdXJjZSB0byBscy0+cmVzb3VyY2VzIGZvciBlYWNoIExWLgorCSAqLworCXJ2ID0gZ2V0X2xvY2tkX3ZncygmdmdfbG9ja2QpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJhZG9wdF9sb2NrcyBnZXRfbG9ja2RfdmdzIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBGb3IgZWFjaCByZXNvdXJjZSBvbiBlYWNoIGxvY2tzcGFjZSwgY2hlY2sgaWYgdGhlCisJICogY29ycmVzcG9uZGluZyBMViBpcyBhY3RpdmUuICBJZiBzbywgbGVhdmUgdGhlCisJICogcmVzb3VyY2Ugc3RydWN0LCBpZiBub3QgZnJlZSB0aGUgcmVzb3VyY2Ugc3RydWN0LgorCSAqIFRoZSByZW1haW4gZW50cmllcyBuZWVkIHRvIGhhdmUgbG9ja3MgYWRvcHRlZC4KKwkgKi8KKwlydiA9IHJlbW92ZV9pbmFjdGl2ZV9sdnMoJnZnX2xvY2tkKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiYWRvcHRfbG9ja3MgcmVtb3ZlX2luYWN0aXZlX2x2cyBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZsc19mb3VuZCwgbGlzdCkgeworCQlpZiAobHMtPmxtX3R5cGUgPT0gTERfTE1fRExNKQorCQkJZ2xfdXNlX2RsbSA9IDE7CisKKwkJbG9nX2RlYnVnKCJhZG9wdCAlcyBsb2Nrc3BhY2UgJXMgdmcgJXMiLAorCQkJICBsbV9zdHIobHMtPmxtX3R5cGUpLCBscy0+bmFtZSwgbHMtPnZnX25hbWUpOworCX0KKworCWlmICghZ2xfdXNlX2RsbSkKKwkJZ2xfdXNlX3NhbmxvY2sgPSAxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJnZnX2xvY2tkLCBsaXN0KSB7CisJCWxvZ19kZWJ1ZygiYWRvcHQgbHZtZXRhZCB2ZyAlcyBsb2NrX3R5cGUgJXMgbG9ja19hcmdzICVzIiwKKwkJCSAgbHMtPnZnX25hbWUsIGxtX3N0cihscy0+bG1fdHlwZSksIGxzLT52Z19hcmdzKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZscy0+cmVzb3VyY2VzLCBsaXN0KQorCQkJbG9nX2RlYnVnKCJhZG9wdCBsdiAlcyAlcyIsIGxzLT52Z19uYW1lLCByLT5uYW1lKTsKKwl9CisKKwkvKgorCSAqIENvbXBhcmUgYW5kIG1lcmdlIHRoZSBsaXN0IG9mIGxvY2tzcGFjZXMgaW4gbHNfZm91bmQKKwkgKiBhbmQgdGhlIGxpc3Qgb2YgbG9ja2QgVkdzIGluIHZnX2xvY2tkLgorCSAqCisJICogQW4gbHMgZnJvbSBsc19mb3VuZCBtYXkgbm90IGhhdmUgaGFkIGFueSBhY3RpdmUgbHZzIHdoZW4KKwkgKiBwcmV2aW91cyBsdm1sb2NrZCBkaWVkLCBidXQgdGhlIGxzIHNob3VsZCBzdGlsbCBiZSBqb2luZWQsCisJICogYW5kIGNoZWNrZWQgZm9yIEdML1ZHIGxvY2tzLgorCSAqCisJICogQW4gbHMgZnJvbSB2Z19sb2NrZCB3aXRoIGFjdGl2ZSBsdnMgc2hvdWxkIGJlIGluIGxzX2ZvdW5kLgorCSAqIElmIGl0J3Mgbm90IHRoZW4gd2UgbWlnaHQgd2FudCB0byBqb2luIHRoZSBscyBhbmQgYWNxdWlyZSBsb2NrcworCSAqIGZvciB0aGUgYWN0aXZlIGx2cyAoYXMgb3Bwb3NlZCB0byBhZG9wdGluZyBvcnBoYW5zIGZvciB0aGVtLikKKwkgKiBUaGUgb3JwaGFuIGxvY2sgaW4gdGhlIGxzIHNob3VsZCBoYXZlIHByZXZlbnRlZCB0aGUgbHMgaW4KKwkgKiB0aGUgbG9jayBtYW5hZ2VyIGZyb20gZ29pbmcgYXdheS4KKwkgKgorCSAqIElmIGFuIGxzIGluIHZnX2xvY2tkIGhhcyBubyBhY3RpdmUgbHZzIGFuZCBkb2VzIG5vdCBoYXZlCisJICogYSBtYXRjaGluZyBlbnRyeSBpbiBsc19mb3VuZCwgdGhlbiBza2lwIGl0LgorCSAqIAorCSAqIEFuIGxzIGluIGxzX2ZvdW5kIHNob3VsZCBhbHdheXMgaGF2ZSBhIG1hdGNoaW5nIGxzIGluCisJICogdmdfbG9ja2QuICBJZiBpdCBkb2Vzbid0LCB0aGVuIG1heWJlIHRoZSB2ZyBoYXMgYmVlbgorCSAqIHJlbW92ZWQgZXZlbiB0aG91Z2ggdGhlIGxvY2tzcGFjZSBmb3IgdGhlIHZnIGlzIHN0aWxsCisJICogaW4gdGhlIGxvY2sgbWFuYWdlci4gIEp1c3QgbGVhdmUgdGhlIGxzIGluIHRoZSBsbQorCSAqIGFsb25lLCBhbmQgc2tpcCB0aGUgbHNfZm91bmQgZW50cnkuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHMxLCBsMXNhZmUsICZsc19mb3VuZCwgbGlzdCkgeworCisJCS8qIFRoZSBkbG0gZ2xvYmFsIGxvY2tzcGFjZSBpcyBzcGVjaWFsIGFuZCBkb2Vzbid0IG1hdGNoIGEgVkcuICovCisJCWlmICghc3RyY21wKGxzMS0+bmFtZSwgZ2xfbHNuYW1lX2RsbSkpIHsKKwkJCWxpc3RfZGVsKCZsczEtPmxpc3QpOworCQkJZnJlZShsczEpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3VuZCA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzMiwgbDJzYWZlLCAmdmdfbG9ja2QsIGxpc3QpIHsKKwkJCWlmIChzdHJjbXAobHMxLT52Z19uYW1lLCBsczItPnZnX25hbWUpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkgCSAqIExTIGluIGJvdGggbHNfZm91bmQgYW5kIHZnX2xvY2tkLgorCQkgCSAqLworCQkJbG9nX2RlYnVnKCJscyAlcyBtYXRjaGVzIHZnICVzIiwgbHMxLT5uYW1lLCBsczItPnZnX25hbWUpOworCQkJbWVtY3B5KGxzMS0+dmdfdXVpZCwgbHMyLT52Z191dWlkLCA2NCk7CisJCQltZW1jcHkobHMxLT52Z19hcmdzLCBsczItPnZnX2FyZ3MsIE1BWF9BUkdTKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyLCByc2FmZSwgJmxzMi0+cmVzb3VyY2VzLCBsaXN0KSB7CisJCQkJbGlzdF9kZWwoJnItPmxpc3QpOworCQkJCWxpc3RfYWRkKCZyLT5saXN0LCAmbHMxLT5yZXNvdXJjZXMpOworCQkJfQorCQkJbGlzdF9kZWwoJmxzMi0+bGlzdCk7CisJCQlmcmVlKGxzMik7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIExTIGluIGxzX2ZvdW5kLCBub3QgaW4gdmdfbG9ja2QuCisJCSAqIEFuIGx2bSBsb2Nrc3BhY2UgZm91bmQgaW4gdGhlIGxvY2sgbWFuYWdlciBoYXMgbm8KKwkJICogY29ycmVzcG9uZGluZyBWRyBpbiBsdm1ldGFkLiAgVGhpcyBzaG91bGRuJ3QgdXN1YWxseQorCQkgKiBoYXBwZW4sIGJ1dCBpdCdzIHBvc3NpYmxlIHRoZSBWRyBjb3VsZCBoYXZlIGJlZW4gcmVtb3ZlZAorCQkgKiB3aGlsZSB0aGUgb3JwaGFuZWQgbG9ja3NwYWNlIGZyb20gaXQgd2FzIHN0aWxsIGFyb3VuZC4KKwkJICogUmVwb3J0IGFuIGVycm9yIGFuZCBsZWF2ZSB0aGUgbHMgaW4gdGhlIGxtIGFsb25lLgorCQkgKi8KKwkJaWYgKCFmb3VuZCkgeworCQkJbG9nX2Vycm9yKCJObyBWRyAlcyBmb3VuZCBmb3IgbG9ja3NwYWNlICVzICVzIiwKKwkJCQkgIGxzMS0+dmdfbmFtZSwgbHMxLT5uYW1lLCBsbV9zdHIobHMxLT5sbV90eXBlKSk7CisJCQlsaXN0X2RlbCgmbHMxLT5saXN0KTsKKwkJCWZyZWUobHMxKTsKKwkJfQorCX0KKworCS8qCisJICogTFMgaW4gdmdfbG9ja2QsIG5vdCBpbiBsc19mb3VuZC4KKwkgKiBsb2NrZCB2Z3MgZnJvbSBsdm1ldGFkIHRoYXQgZG8gbm90IGhhdmUgYW4gZXhpc3RpbmcgbG9ja3NwYWNlLgorCSAqIFRoaXMgd291bGRuJ3QgYmUgdW51c3VhbDsgd2UganVzdCBza2lwIHRoZSB2Zy4KKwkgKiBCdXQsIGlmIHRoZSB2ZyBoYXMgYWN0aXZlIGx2cywgdGhlbiBpdCBzaG91bGQgaGF2ZSBoYWQgbG9ja3MKKwkgKiBhbmQgYSBsb2Nrc3BhY2UuICBTaG91bGQgd2UgYXR0ZW1wdCB0byBqb2luIHRoZSBsb2Nrc3BhY2UgYW5kCisJICogYWNxdWlyZSAobm90IGFkb3B0KSBsb2NrcyBmb3IgdGhlc2UgTFZzPworCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzLCBsc2FmZSwgJnZnX2xvY2tkLCBsaXN0KSB7CisJCWlmICghbGlzdF9lbXB0eSgmbHMtPnJlc291cmNlcykpIHsKKwkJCS8qIFdlIHNob3VsZCBoYXZlIGZvdW5kIGEgbG9ja3NwYWNlLiAqLworCQkJLyogYWRkIHRoaXMgbHMgYW5kIGFjcXVpcmUgbG9ja3MgZm9yIGxzLT5yZXNvdXJjZXM/ICovCisJCQlsb2dfZXJyb3IoIk5vIGxvY2tzcGFjZSAlcyAlcyBmb3VuZCBmb3IgVkcgJXMgd2l0aCBhY3RpdmUgTFZzIiwKKwkJCQkgIGxzLT5uYW1lLCBsbV9zdHIobHMtPmxtX3R5cGUpLCBscy0+dmdfbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgVkcgd2Fzbid0IHN0YXJ0ZWQgaW4gdGhlIHByZXZpb3VzIGx2bWxvY2tkLiAqLworCQkJbG9nX2RlYnVnKCJObyBscyBmb3VuZCBmb3IgdmcgJXMiLCBscy0+dmdfbmFtZSk7CisJCX0KKwkJCisJCWxpc3RfZGVsKCZscy0+bGlzdCk7CisJCWZyZWUobHMpOworCX0KKworCS8qCisJICogQ3JlYXRlIGFuZCBxdWV1ZSBzdGFydCBhY3Rpb25zIHRvIGFkZCBsb2Nrc3BhY2VzLgorCSAqLworCisJaWYgKGdsX3VzZV9kbG0pIHsKKwkJaWYgKCEoYWN0ID0gYWxsb2NfYWN0aW9uKCkpKQorCQkJZ290byBmYWlsOworCQlsb2dfZGVidWcoImFkb3B0IGFkZCBkbG0gZ2xvYmFsIGxvY2tzcGFjZSIpOworCQlhY3QtPm9wID0gTERfT1BfU1RBUlQ7CisJCWFjdC0+ZmxhZ3MgPSAoTERfQUZfQURPUFQgfCBMRF9BRl9XQUlUKTsKKwkJYWN0LT5ydCA9IExEX1JUX0dMOworCQlhY3QtPmxtX3R5cGUgPSBMRF9MTV9ETE07CisJCWFjdC0+Y2xpZW50X2lkID0gSU5URVJOQUxfQ0xJRU5UX0lEOworCQlhZGRfZGxtX2dsb2JhbF9sb2Nrc3BhY2UoYWN0KTsKKwkJY291bnRfc3RhcnQrKzsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHMsIGxzYWZlLCAmbHNfZm91bmQsIGxpc3QpIHsKKwkJaWYgKCEoYWN0ID0gYWxsb2NfYWN0aW9uKCkpKQorCQkJZ290byBmYWlsOworCQlhY3QtPm9wID0gTERfT1BfU1RBUlQ7CisJCWFjdC0+ZmxhZ3MgPSAoTERfQUZfQURPUFQgfCBMRF9BRl9XQUlUKTsKKwkJYWN0LT5ydCA9IExEX1JUX1ZHOworCQlhY3QtPmxtX3R5cGUgPSBscy0+bG1fdHlwZTsKKwkJYWN0LT5jbGllbnRfaWQgPSBJTlRFUk5BTF9DTElFTlRfSUQ7CisJCXN0cm5jcHkoYWN0LT52Z19uYW1lLCBscy0+dmdfbmFtZSwgTUFYX05BTUUpOworCQltZW1jcHkoYWN0LT52Z191dWlkLCBscy0+dmdfdXVpZCwgNjQpOworCQltZW1jcHkoYWN0LT52Z19hcmdzLCBscy0+dmdfYXJncywgTUFYX0FSR1MpOworCQlhY3QtPmhvc3RfaWQgPSBscy0+aG9zdF9pZDsKKworCQkvKiBzZXQgYWN0LT52ZXJzaW9uIGZyb20gbHZtZXRhZCBkYXRhPyAqLworCisJCWxvZ19kZWJ1ZygiYWRvcHQgYWRkICVzIHZnIGxvY2tzcGFjZSAlcyIsIGxtX3N0cihhY3QtPmxtX3R5cGUpLCBhY3QtPnZnX25hbWUpOworCisJCXJ2ID0gYWRkX2xvY2tzcGFjZV90aHJlYWQobHMtPm5hbWUsIGFjdC0+dmdfbmFtZSwgYWN0LT52Z191dWlkLAorCQkJCQkgIGFjdC0+bG1fdHlwZSwgYWN0LT52Z19hcmdzLCBhY3QpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgbG9ja3NwYWNlIHRocmVhZCBmb3IgVkcgJXMiLCBscy0+dmdfbmFtZSk7CisJCQlsaXN0X2RlbCgmbHMtPmxpc3QpOworCQkJZnJlZShscyk7CisJCQlmcmVlX2FjdGlvbihhY3QpOworCQkJY291bnRfc3RhcnRfZmFpbCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBXaGVuIHRoZSBsb2Nrc3BhY2VfdGhyZWFkIGlzIGRvbmUgd2l0aCB0aGUgc3RhcnQgYWN0LAorCQkgKiBpdCB3aWxsIHNlZSB0aGUgYWN0IEFET1BUIGZsYWcgYW5kIG1vdmUgdGhlIGFjdCBvbnRvCisJCSAqIHRoZSBhZG9wdF9yZXN1bHRzIGxpc3QgZm9yIHVzIHRvIGNvbGxlY3QgYmVsb3cuCisJCSAqLworCQljb3VudF9zdGFydCsrOworCX0KKworCWxvZ19kZWJ1ZygiYWRvcHQgc3RhcnRpbmcgJWQgbG9ja3NwYWNlcyIsIGNvdW50X3N0YXJ0KTsKKworCS8qCisJICogV2FpdCBmb3IgYWxsIHN0YXJ0L3Jlam9pbiBhY3Rpb25zIHRvIGNvbXBsZXRlLiAgRWFjaCBzdGFydCBhY3Rpb24KKwkgKiBxdWV1ZWQgYWJvdmUgd2lsbCBhcHBlYXIgb24gdGhlIGFkb3B0X3Jlc3VsdHMgbGlzdCB3aGVuIGZpbmlzaGVkLgorCSAqLworCisJd2hpbGUgKGNvdW50X3N0YXJ0X2RvbmUgPCBjb3VudF9zdGFydCkgeworCQlzbGVlcCgxKTsKKwkJYWN0ID0gTlVMTDsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJCWlmICghbGlzdF9lbXB0eSgmYWRvcHRfcmVzdWx0cykpIHsKKwkJCWFjdCA9IGxpc3RfZmlyc3RfZW50cnkoJmFkb3B0X3Jlc3VsdHMsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKKwkJaWYgKCFhY3QpCisJCQljb250aW51ZTsKKworCQlpZiAoYWN0LT5yZXN1bHQgPCAwKSB7CisJCQlsb2dfZXJyb3IoImFkb3B0IGFkZCBsb2Nrc3BhY2UgZmFpbGVkIHZnICVzICVkIiwgYWN0LT52Z19uYW1lLCBhY3QtPnJlc3VsdCk7CisJCQljb3VudF9zdGFydF9mYWlsKys7CisJCX0KKworCQlmcmVlX2FjdGlvbihhY3QpOworCQljb3VudF9zdGFydF9kb25lKys7CisJfQorCisJbG9nX2RlYnVnKCJhZG9wdCBzdGFydGVkICVkIGxvY2tzcGFjZXMgZG9uZSAlZCBmYWlsICVkIiwKKwkJICBjb3VudF9zdGFydCwgY291bnRfc3RhcnRfZG9uZSwgY291bnRfc3RhcnRfZmFpbCk7CisKKwkvKgorCSAqIENyZWF0ZSBsb2NrLWFkb3B0IGFjdGlvbnMgZm9yIGFjdGl2ZSBMVnMgKGxzLT5yZXNvdXJjZXMpLAorCSAqIGFuZCBHTC9WRyBsb2NrcyAod2UgZG9uJ3Qga25vdyBpZiB0aGVzZSBsb2NrcyB3ZXJlIGhlbGQKKwkgKiBhbmQgb3JwaGFuZWQgYnkgdGhlIGxhc3QgbHZtbG9ja2QsIHNvIHRyeSB0byBhZG9wdCB0aGVtCisJICogdG8gc2VlLikKKwkgKgorCSAqIEEgcHJvcGVyIHN0cnVjdCBsb2Nrc3BhY2Ugbm93IGV4aXN0cyBvbiB0aGUgbG9ja3NwYWNlcyBsaXN0CisJICogZm9yIGVhY2ggbHMgaW4gbHNfZm91bmQuICBMb2NrIG9wcyBmb3Igb25lIG9mIHRob3NlCisJICogbG9ja3NwYWNlcyBjYW4gYmUgZG9uZSBhcyBPUF9MT0NLIGFjdGlvbnMgcXVldWVkIHVzaW5nCisJICogYWRkX2xvY2tfYWN0aW9uKCk7CisJICoKKwkgKiBTdGFydCBieSBhdHRlbXB0aW5nIHRvIGFkb3B0IHRoZSBsb2NrIGluIHRoZSBtb3N0IGxpa2VseQorCSAqIG1vZGUgaXQgd2FzIGxlZnQgaW4gKGV4IGZvciBsdnMsIHNoIGZvciB2Zy9nbCkuICBJZgorCSAqIHRoZSBtb2RlIGlzIHdyb25nLCB0aGUgbG0gd2lsbCByZXR1cm4gYW4gZXJyb3IgYW5kIHdlCisJICogdHJ5IGFnYWluIHdpdGggdGhlIG90aGVyIG1vZGUuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbHNfZm91bmQsIGxpc3QpIHsKKworCQkvKgorCQkgKiBBZG9wdCBvcnBoYW4gTFYgbG9ja3MuCisJCSAqLworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmxzLT5yZXNvdXJjZXMsIGxpc3QpIHsKKwkJCWlmICghKGFjdCA9IGFsbG9jX2FjdGlvbigpKSkKKwkJCQlnb3RvIGZhaWw7CisJCQlhY3QtPm9wID0gTERfT1BfTE9DSzsKKwkJCWFjdC0+cnQgPSBMRF9SVF9MVjsKKwkJCWFjdC0+bW9kZSA9IExEX0xLX0VYOworCQkJYWN0LT5mbGFncyA9IChMRF9BRl9BRE9QVCB8IExEX0FGX1BFUlNJU1RFTlQpOworCQkJYWN0LT5jbGllbnRfaWQgPSBJTlRFUk5BTF9DTElFTlRfSUQ7CisJCQlhY3QtPmxtX3R5cGUgPSBscy0+bG1fdHlwZTsKKwkJCXN0cm5jcHkoYWN0LT52Z19uYW1lLCBscy0+dmdfbmFtZSwgTUFYX05BTUUpOworCQkJc3RybmNweShhY3QtPmx2X3V1aWQsIHItPm5hbWUsIE1BWF9OQU1FKTsKKwkJCXN0cm5jcHkoYWN0LT5sdl9hcmdzLCByLT5sdl9hcmdzLCBNQVhfQVJHUyk7CisKKwkJCWxvZ19kZWJ1ZygiYWRvcHQgbG9jayBmb3IgbHYgJXMgJXMiLCBhY3QtPnZnX25hbWUsIGFjdC0+bHZfdXVpZCk7CisKKwkJCXJ2ID0gYWRkX2xvY2tfYWN0aW9uKGFjdCk7CisJCQlpZiAocnYgPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJhZG9wdCBhZGRfbG9ja19hY3Rpb24gbHYgJXMgJXMgZXJyb3IgJWQiLCBhY3QtPnZnX25hbWUsIGFjdC0+bHZfdXVpZCwgcnYpOworCQkJCWNvdW50X2Fkb3B0X2ZhaWwrKzsKKwkJCQlmcmVlX2FjdGlvbihhY3QpOworCQkJfSBlbHNlIHsKKwkJCQljb3VudF9hZG9wdCsrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogQWRvcHQgb3JwaGFuIFZHIGxvY2suCisJCSAqLworCisJCWlmICghKGFjdCA9IGFsbG9jX2FjdGlvbigpKSkKKwkJCWdvdG8gZmFpbDsKKwkJYWN0LT5vcCA9IExEX09QX0xPQ0s7CisJCWFjdC0+cnQgPSBMRF9SVF9WRzsKKwkJYWN0LT5tb2RlID0gTERfTEtfU0g7CisJCWFjdC0+ZmxhZ3MgPSBMRF9BRl9BRE9QVDsKKwkJYWN0LT5jbGllbnRfaWQgPSBJTlRFUk5BTF9DTElFTlRfSUQ7CisJCWFjdC0+bG1fdHlwZSA9IGxzLT5sbV90eXBlOworCQlzdHJuY3B5KGFjdC0+dmdfbmFtZSwgbHMtPnZnX25hbWUsIE1BWF9OQU1FKTsKKworCQlsb2dfZGVidWcoImFkb3B0IGxvY2sgZm9yIHZnICVzIiwgYWN0LT52Z19uYW1lKTsKKworCQlydiA9IGFkZF9sb2NrX2FjdGlvbihhY3QpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoImFkb3B0IGFkZF9sb2NrX2FjdGlvbiB2ZyAlcyBlcnJvciAlZCIsIGFjdC0+dmdfbmFtZSwgcnYpOworCQkJY291bnRfYWRvcHRfZmFpbCsrOworCQkJZnJlZV9hY3Rpb24oYWN0KTsKKwkJfSBlbHNlIHsKKwkJCWNvdW50X2Fkb3B0Kys7CisJCX0KKwl9CisKKwkvKgorCSAqIEFkb3B0IG9ycGhhbiBHTCBsb2NrLgorCSAqLworCisJaWYgKCEoYWN0ID0gYWxsb2NfYWN0aW9uKCkpKQorCQlnb3RvIGZhaWw7CisJYWN0LT5vcCA9IExEX09QX0xPQ0s7CisJYWN0LT5ydCA9IExEX1JUX0dMOworCWFjdC0+bW9kZSA9IExEX0xLX1NIOworCWFjdC0+ZmxhZ3MgPSBMRF9BRl9BRE9QVDsKKwlhY3QtPmNsaWVudF9pZCA9IElOVEVSTkFMX0NMSUVOVF9JRDsKKwlhY3QtPmxtX3R5cGUgPSAoZ2xfdXNlX3NhbmxvY2sgPyBMRF9MTV9TQU5MT0NLIDogTERfTE1fRExNKTsKKworCWxvZ19kZWJ1ZygiYWRvcHQgbG9jayBmb3IgZ2wiKTsKKworCXJ2ID0gYWRkX2xvY2tfYWN0aW9uKGFjdCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoImFkb3B0IGFkZF9sb2NrX2FjdGlvbiBnbCAlcyBlcnJvciAlZCIsIGFjdC0+dmdfbmFtZSwgcnYpOworCQljb3VudF9hZG9wdF9mYWlsKys7CisJCWZyZWVfYWN0aW9uKGFjdCk7CisJfSBlbHNlIHsKKwkJY291bnRfYWRvcHQrKzsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIGxvY2stYWRvcHQgYWN0aW9ucyB0byBjb21wbGV0ZS4gIFRoZSBjb21wbGV0ZWQKKwkgKiBhY3Rpb25zIGFyZSBwYXNzZWQgYmFjayBoZXJlIHZpYSB0aGUgYWRvcHRfcmVzdWx0cyBsaXN0LgorCSAqLworCisJd2hpbGUgKGNvdW50X2Fkb3B0X2RvbmUgPCBjb3VudF9hZG9wdCkgeworCQlzbGVlcCgxKTsKKwkJYWN0ID0gTlVMTDsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJCWlmICghbGlzdF9lbXB0eSgmYWRvcHRfcmVzdWx0cykpIHsKKwkJCWFjdCA9IGxpc3RfZmlyc3RfZW50cnkoJmFkb3B0X3Jlc3VsdHMsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKKwkJaWYgKCFhY3QpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBsb2NrIGFkb3B0IHJlc3VsdHMgCisJCSAqLworCisJCWlmIChhY3QtPnJlc3VsdCA9PSAtRVVDTEVBTikgeworCQkJLyoKKwkJCSAqIEFkb3B0IGZhaWxlZCBiZWNhdXNlIHRoZSBvcnBoYW4gaGFzIGEgZGlmZmVyZW50IG1vZGUKKwkJCSAqIHRoYW4gaW5pdGlhbGx5IHJlcXVlc3RlZC4gIFJlcGVhdCB0aGUgbG9jay1hZG9wdCBvcGVyYXRpb24KKwkJCSAqIHdpdGggdGhlIG90aGVyIG1vZGUuICBOLkIuIHRoaXMgbG9naWMgZGVwZW5kcyBvbiBmaXJzdAorCQkJICogdHJ5aW5nIHNoIHRoZW4gZXggZm9yIEdML1ZHIGxvY2tzLCBhbmQgZXggdGhlbiBzaCBmb3IKKwkJCSAqIExWIGxvY2tzLgorCQkJICovCisKKwkJCWlmICgoYWN0LT5ydCAhPSBMRF9SVF9MVikgJiYgKGFjdC0+bW9kZSA9PSBMRF9MS19TSCkpIHsKKwkJCQkvKiBHTC9WRyBsb2NrczogYXR0ZW1wdCB0byBhZG9wdCBleCBhZnRlciBzaCBmYWlsZWQuICovCisJCQkJYWN0LT5tb2RlID0gTERfTEtfRVg7CisJCQkJcnYgPSBhZGRfbG9ja19hY3Rpb24oYWN0KTsKKworCQkJfSBlbHNlIGlmICgoYWN0LT5ydCA9PSBMRF9SVF9MVikgJiYgKGFjdC0+bW9kZSA9PSBMRF9MS19FWCkpIHsKKwkJCQkvKiBMViBsb2NrczogYXR0ZW1wdCB0byBhZG9wdCBzaCBhZnRlciBleCBmYWlsZWQuICovCisJCQkJYWN0LT5tb2RlID0gTERfTEtfU0g7CisJCQkJcnYgPSBhZGRfbG9ja19hY3Rpb24oYWN0KTsKKworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZG9wdCAlcyBsb2NrIGluIHZnICVzIGVycm9yICVkIiwKKwkJCQkJICBydF9zdHIoYWN0LT5ydCksIGFjdC0+dmdfbmFtZSwgYWN0LT5yZXN1bHQpOworCQkJCWNvdW50X2Fkb3B0X2ZhaWwrKzsKKwkJCQljb3VudF9hZG9wdF9kb25lKys7CisJCQkJZnJlZV9hY3Rpb24oYWN0KTsKKwkJCQlydiA9IDA7CisJCQl9CisKKwkJCWlmIChydiA8IDApIHsKKwkJCQlsb2dfZXJyb3IoImFkb3B0IGFkZF9sb2NrX2FjdGlvbiBhZ2FpbiAlcyIsIGFjdC0+dmdfbmFtZSk7CisJCQkJY291bnRfYWRvcHRfZmFpbCsrOworCQkJCWNvdW50X2Fkb3B0X2RvbmUrKzsKKwkJCQlmcmVlX2FjdGlvbihhY3QpOworCQkJfQorCisJCX0gZWxzZSBpZiAoYWN0LT5yZXN1bHQgPT0gLUVOT0VOVCkgeworCQkJLyoKKwkJCSAqIE5vIG9ycGhhbiBsb2NrIGV4aXN0cy4gIFRoaXMgaXMgY29tbW9uIGZvciBHTC9WRyBsb2NrcworCQkJICogYmVjYXVzZSB0aGV5IG1heSBub3QgaGF2ZSBiZWVuIGhlbGQgd2hlbiBsdm1sb2NrZCBleGl0ZWQuCisJCQkgKiBJdCdzIGFsc28gZXhwZWN0ZWQgZm9yIExWIHR5cGVzIHRoYXQgZG8gbm90IHVzZSBhIGxvY2suCisJCQkgKi8KKworCQkJaWYgKGFjdC0+cnQgPT0gTERfUlRfTFYpIHsKKwkJCQkvKiBVbmV4cGVjdGVkLCB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBhbiBvcnBoYW4uICovCisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRvcHQgTFYgbG9jayBmb3IgJXMgJXMgZXJyb3IgJWQiLAorCQkJCQkgIGFjdC0+dmdfbmFtZSwgYWN0LT5sdl91dWlkLCBhY3QtPnJlc3VsdCk7CisJCQkJY291bnRfYWRvcHRfZmFpbCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOb3JtYWwsIG5vIEdML1ZHIGxvY2sgd2FzIG9ycGhhbmVkLiAqLworCQkJCWxvZ19kZWJ1ZygiRGlkIG5vdCBhZG9wdCAlcyBsb2NrIGluIHZnICVzIGVycm9yICVkIiwKKwkJCQkJICAgcnRfc3RyKGFjdC0+cnQpLCBhY3QtPnZnX25hbWUsIGFjdC0+cmVzdWx0KTsKKwkJCX0KKworCQkJY291bnRfYWRvcHRfZG9uZSsrOworCQkJZnJlZV9hY3Rpb24oYWN0KTsKKworCQl9IGVsc2UgaWYgKGFjdC0+cmVzdWx0IDwgMCkgeworCQkJLyoKKwkJCSAqIFNvbWUgdW5leHBlY3RlZCBlcnJvci4KKwkJCSAqLworCisJCQlsb2dfZXJyb3IoImFkb3B0IGxvY2sgcnQgJXMgdmcgJXMgbHYgJXMgZXJyb3IgJWQiLAorCQkJCSAgcnRfc3RyKGFjdC0+cnQpLCBhY3QtPnZnX25hbWUsIGFjdC0+bHZfdXVpZCwgYWN0LT5yZXN1bHQpOworCQkJY291bnRfYWRvcHRfZmFpbCsrOworCQkJY291bnRfYWRvcHRfZG9uZSsrOworCQkJZnJlZV9hY3Rpb24oYWN0KTsKKworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEFkb3B0IHN1Y2Nlc3MuCisJCQkgKi8KKworCQkJaWYgKGFjdC0+cnQgPT0gTERfUlRfTFYpIHsKKwkJCQlsb2dfZGVidWcoImFkb3B0IHN1Y2Nlc3MgbHYgJXMgJXMgJXMiLCBhY3QtPnZnX25hbWUsIGFjdC0+bHZfdXVpZCwgbW9kZV9zdHIoYWN0LT5tb2RlKSk7CisJCQkJZnJlZV9hY3Rpb24oYWN0KTsKKwkJCX0gZWxzZSBpZiAoYWN0LT5ydCA9PSBMRF9SVF9WRykgeworCQkJCWxvZ19kZWJ1ZygiYWRvcHQgc3VjY2VzcyB2ZyAlcyAlcyIsIGFjdC0+dmdfbmFtZSwgbW9kZV9zdHIoYWN0LT5tb2RlKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmdG9fdW5sb2NrKTsKKwkJCX0gZWxzZSBpZiAoYWN0LT5ydCA9PSBMRF9SVF9HTCkgeworCQkJCWxvZ19kZWJ1ZygiYWRvcHQgc3VjY2VzcyBnbCAlcyAlcyIsIGFjdC0+dmdfbmFtZSwgbW9kZV9zdHIoYWN0LT5tb2RlKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmdG9fdW5sb2NrKTsKKwkJCX0KKwkJCWNvdW50X2Fkb3B0X2RvbmUrKzsKKwkJfQorCX0KKworCS8qCisJICogUmVsZWFzZSBhZG9wdGVkIEdML1ZHIGxvY2tzLgorCSAqIFRoZSB0b191bmxvY2sgYWN0aW9ucyB3ZXJlIHRoZSBvbmVzIHVzZWQgdG8gbG9jay1hZG9wdCB0aGUgR0wvVkcgbG9ja3M7CisJICogbm93IHVzZSB0aGVtIHRvIGRvIHRoZSB1bmxvY2tzLiAgVGhlc2UgYWN0aW9ucyB3aWxsIGFnYWluIGJlIHBsYWNlZAorCSAqIG9uIGFkb3B0X3Jlc3VsdHMgZm9yIHVzIHRvIGNvbGxlY3QgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIEFET1BUIGZsYWcgc2V0LgorCSAqLworCisJY291bnRfYWRvcHQgPSAwOworCWNvdW50X2Fkb3B0X2RvbmUgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdCwgYXNhZmUsICZ0b191bmxvY2ssIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisKKwkJaWYgKGFjdC0+bW9kZSA9PSBMRF9MS19FWCkgeworCQkJLyoKKwkJCSAqIEZJWE1FOiB3ZSBwcm9iYWJseSB3YW50IHRvIGNoZWNrIHNvbWVob3cgdGhhdAorCQkJICogdGhlcmUncyBubyBsdm0gY29tbWFuZCBzdGlsbCBydW5uaW5nIHRoYXQncworCQkJICogdXNpbmcgdGhpcyBleCBsb2NrIGFuZCBjaGFuZ2luZyB0aGluZ3MuCisJCQkgKi8KKwkJCWxvZ193YXJuKCJhZG9wdCByZWxlYXNpbmcgZXggJXMgbG9jayAlcyIsCisJCQkJIHJ0X3N0cihhY3QtPnJ0KSwgYWN0LT52Z19uYW1lKTsKKwkJfQorCisJCWFjdC0+bW9kZSA9IExEX0xLX1VOOworCisJCWxvZ19kZWJ1ZygiYWRvcHQgdW5sb2NrIGZvciAlcyAlcyIsIHJ0X3N0cihhY3QtPnJ0KSwgYWN0LT52Z19uYW1lKTsKKworCQlydiA9IGFkZF9sb2NrX2FjdGlvbihhY3QpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoImFkb3B0IHVubG9jayBhZGRfbG9ja19hY3Rpb24gZXJyb3IgJWQiLCBydik7CisJCQlmcmVlX2FjdGlvbihhY3QpOworCQl9IGVsc2UgeworCQkJY291bnRfYWRvcHQrKzsKKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIHRoZSB1bmxvY2tzIHRvIGNvbXBsZXRlLiAqLworCisJd2hpbGUgKGNvdW50X2Fkb3B0X2RvbmUgPCBjb3VudF9hZG9wdCkgeworCQlzbGVlcCgxKTsKKwkJYWN0ID0gTlVMTDsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJCWlmICghbGlzdF9lbXB0eSgmYWRvcHRfcmVzdWx0cykpIHsKKwkJCWFjdCA9IGxpc3RfZmlyc3RfZW50cnkoJmFkb3B0X3Jlc3VsdHMsIHN0cnVjdCBhY3Rpb24sIGxpc3QpOworCQkJbGlzdF9kZWwoJmFjdC0+bGlzdCk7CisJCX0KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKKwkJaWYgKCFhY3QpCisJCQljb250aW51ZTsKKworCQlpZiAoYWN0LT5yZXN1bHQgPCAwKQorCQkJbG9nX2Vycm9yKCJhZG9wdCB1bmxvY2sgZXJyb3IgJWQiLCBhY3QtPnJlc3VsdCk7CisKKwkJY291bnRfYWRvcHRfZG9uZSsrOworCQlmcmVlX2FjdGlvbihhY3QpOworCX0KKworCisJLyogRklYTUU6IHB1cmdlIGFueSByZW1haW5pbmcgb3JwaGFuIGxvY2tzIGluIGVhY2ggcmVqb2luZWQgbHM/ICovCisKKwlpZiAoY291bnRfc3RhcnRfZmFpbCB8fCBjb3VudF9hZG9wdF9mYWlsKQorCQlnb3RvIGZhaWw7CisKKwlsb2dfZGVidWcoImFkb3B0X2xvY2tzIGRvbmUiKTsKKwlyZXR1cm47CisKK2ZhaWw6CisJbG9nX2Vycm9yKCJhZG9wdF9sb2NrcyBmYWlsZWQsIHJlc2V0IGhvc3QiKTsKK30KKworc3RhdGljIGludCBnZXRfcGVlcl9waWQoaW50IGZkKQoreworCXN0cnVjdCB1Y3JlZCBjcmVkOworCXVuc2lnbmVkIGludCBsZW4gPSBzaXplb2YoY3JlZCk7CisKKwlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUEVFUkNSRUQsICZjcmVkLCAmbGVuKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gY3JlZC5waWQ7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbGlzdGVuZXIoaW50IHBvbGxfZmQpCit7CisJc3RydWN0IGNsaWVudCAqY2w7CisJaW50IGZkLCBwaTsKKworCS8qIGFzc2VydCBwb2xsX2ZkID09IGxpc3Rlbl9mZCAqLworCisJZmQgPSBhY2NlcHQobGlzdGVuX2ZkLCBOVUxMLCBOVUxMKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShjbCA9IGFsbG9jX2NsaWVudCgpKSkgeworCQlpZiAoIWNsb3NlKGZkKSkKKwkJCWxvZ19lcnJvcigiZmFpbGVkIHRvIGNsb3NlIGxvY2tkIHBvbGwgZmQiKTsKKwkJcmV0dXJuOworCX0KKworCXBpID0gYWRkX3BvbGxmZChmZCk7CisJaWYgKHBpIDwgMCkgeworCQlsb2dfZXJyb3IoInByb2Nlc3NfbGlzdGVuZXIgYWRkX3BvbGxmZCBlcnJvciAlZCIsIHBpKTsKKwkJZnJlZV9jbGllbnQoY2wpOworCQlyZXR1cm47CisJfQorCisJY2wtPnBpID0gcGk7CisJY2wtPmZkID0gZmQ7CisJY2wtPnBpZCA9IGdldF9wZWVyX3BpZChmZCk7CisKKwlwdGhyZWFkX211dGV4X2luaXQoJmNsLT5tdXRleCwgTlVMTCk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CisJY2xpZW50X2lkcysrOworCisJaWYgKGNsaWVudF9pZHMgPT0gSU5URVJOQUxfQ0xJRU5UX0lEKQorCQljbGllbnRfaWRzKys7CisJaWYgKCFjbGllbnRfaWRzKQorCQljbGllbnRfaWRzKys7CisKKwljbC0+aWQgPSBjbGllbnRfaWRzOworCWxpc3RfYWRkX3RhaWwoJmNsLT5saXN0LCAmY2xpZW50X2xpc3QpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOworCisJbG9nX2RlYnVnKCJuZXcgY2wgJXUgcGkgJWQgZmQgJWQiLCBjbC0+aWQsIGNsLT5waSwgY2wtPmZkKTsKK30KKworLyoKKyAqIG1haW4gbG9vcCBwb2xscyBvbiBwaXBlWzBdIHNvIHRoYXQgYSB0aHJlYWQgY2FuCisgKiByZXN0YXJ0IHRoZSBwb2xsIGJ5IHdyaXRpbmcgdG8gcGlwZVsxXS4KKyAqLworc3RhdGljIGludCBzZXR1cF9yZXN0YXJ0KHZvaWQpCit7CisJaWYgKHBpcGUocmVzdGFydF9mZHMpKSB7CisJCWxvZ19lcnJvcigic2V0dXBfcmVzdGFydCBwaXBlIGVycm9yICVkIiwgZXJybm8pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdGFydF9waSA9IGFkZF9wb2xsZmQocmVzdGFydF9mZHNbMF0pOworCWlmIChyZXN0YXJ0X3BpIDwgMCkKKwkJcmV0dXJuIHJlc3RhcnRfcGk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRocmVhZCB3cm90ZSAndycgdG8gcmVzdGFydF9mZHNbMV0gdG8gcmVzdGFydCBwb2xsKCkKKyAqIGFmdGVyIGFkZGluZyBhbiBmZCBiYWNrIGludG8gcG9sbGZkLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Jlc3RhcnQoaW50IGZkKQoreworCWNoYXIgd2FrZVsxXTsKKwlpbnQgcnY7CisKKwkvKiBhc3NlcnQgZmQgPT0gcmVzdGFydF9mZHNbMF0gKi8KKworCXJ2ID0gcmVhZChyZXN0YXJ0X2Zkc1swXSwgd2FrZSwgMSk7CisJaWYgKCFydiB8fCBydiA8IDApCisJCWxvZ19kZWJ1ZygicHJvY2Vzc19yZXN0YXJ0IGVycm9yICVkIiwgZXJybm8pOworfQorCitzdGF0aWMgdm9pZCBzaWd0ZXJtX2hhbmRsZXIoaW50IHNpZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlkYWVtb25fcXVpdCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgbWFpbl9sb29wKGRhZW1vbl9zdGF0ZSAqZHNfYXJnKQoreworCXN0cnVjdCBjbGllbnQgKmNsOworCWludCBpLCBydiwgaXNfcmVjdiwgaXNfZGVhZDsKKworCXNpZ25hbChTSUdURVJNLCAmc2lndGVybV9oYW5kbGVyKTsKKworCXJ2ID0gc2V0dXBfc3RydWN0cygpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCXN0cmNweShnbF9sc25hbWVfZGxtLCBTX05BTUVfR0xfRExNKTsKKworCUlOSVRfTElTVF9IRUFEKCZsb2Nrc3BhY2VzKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmxvY2tzcGFjZXNfbXV0ZXgsIE5VTEwpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmcG9sbGZkX211dGV4LCBOVUxMKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmxvZ19tdXRleCwgTlVMTCk7CisKKwlvcGVubG9nKCJsdm1sb2NrZCIsIExPR19DT05TIHwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJbG9nX3dhcm4oImx2bWxvY2tkIHN0YXJ0ZWQiKTsKKworCWxpc3Rlbl9mZCA9IGRzX2FyZy0+c29ja2V0X2ZkOworCWxpc3Rlbl9waSA9IGFkZF9wb2xsZmQobGlzdGVuX2ZkKTsKKworCXNldHVwX2NsaWVudF90aHJlYWQoKTsKKwlzZXR1cF93b3JrZXJfdGhyZWFkKCk7CisJc2V0dXBfcmVzdGFydCgpOworCisJcHRocmVhZF9tdXRleF9pbml0KCZsdm1ldGFkX211dGV4LCBOVUxMKTsKKwlsdm1ldGFkX2hhbmRsZSA9IGx2bWV0YWRfb3BlbihOVUxMKTsKKwlpZiAobHZtZXRhZF9oYW5kbGUuZXJyb3IgfHwgbHZtZXRhZF9oYW5kbGUuc29ja2V0X2ZkIDwgMCkKKwkJbG9nX2Vycm9yKCJsdm1ldGFkX29wZW4gZXJyb3IgJWQiLCBsdm1ldGFkX2hhbmRsZS5lcnJvcik7CisJZWxzZQorCQlsdm1ldGFkX2Nvbm5lY3RlZCA9IDE7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gcmVqb2luIGxvY2tzcGFjZXMgYW5kIGFkb3B0IGxvY2tzIGZyb20gYSBwcmV2aW91cworCSAqIGluc3RhbmNlIG9mIGx2bWxvY2tkIHRoYXQgbGVmdCBiZWhpbmQgbG9ja3NwYWNlcy9sb2Nrcy4KKwkgKi8KKwlpZiAoYWRvcHRfb3B0KQorCQlhZG9wdF9sb2NrcygpOworCisJd2hpbGUgKDEpIHsKKwkJcnYgPSBwb2xsKHBvbGxmZCwgcG9sbGZkX21heGkgKyAxLCAtMSk7CisJCWlmICgocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHx8IGRhZW1vbl9xdWl0KSB7CisJCQlpZiAoZGFlbW9uX3F1aXQpIHsKKwkJCQlpbnQgY291bnQ7CisJCQkJLyogZmlyc3Qgc2lndGVybSB3b3VsZCB0cmlnZ2VyIHN0b3BzLCBhbmQKKwkJCQkgICBzZWNvbmQgc2lndGVybSBtYXkgZmluaXNoIHRoZSBqb2lucy4gKi8KKwkJCQljb3VudCA9IGZvcl9lYWNoX2xvY2tzcGFjZShET19TVE9QLCBET19GUkVFLCBOT19GT1JDRSk7CisJCQkJaWYgKCFjb3VudCkKKwkJCQkJYnJlYWs7CisJCQkJbG9nX2RlYnVnKCJpZ25vcmUgc2h1dGRvd24gZm9yICVkIGxvY2tzcGFjZXMiLCBjb3VudCk7CisJCQkJZGFlbW9uX3F1aXQgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJ2IDwgMCkgeworCQkJbG9nX2Vycm9yKCJwb2xsIGVycm5vICVkIiwgZXJybm8pOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDw9IHBvbGxmZF9tYXhpOyBpKyspIHsKKwkJCWlmIChwb2xsZmRbaV0uZmQgPCAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpc19yZWN2ID0gMDsKKwkJCWlzX2RlYWQgPSAwOworCisJCQlpZiAocG9sbGZkW2ldLnJldmVudHMgJiBQT0xMSU4pCisJCQkJaXNfcmVjdiA9IDE7CisJCQlpZiAocG9sbGZkW2ldLnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMTlZBTCkpCisJCQkJaXNfZGVhZCA9IDE7CisKKwkJCWlmICghaXNfcmVjdiAmJiAhaXNfZGVhZCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGkgPT0gbGlzdGVuX3BpKSB7CisJCQkJcHJvY2Vzc19saXN0ZW5lcihwb2xsZmRbaV0uZmQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoaSA9PSByZXN0YXJ0X3BpKSB7CisJCQkJcHJvY2Vzc19yZXN0YXJ0KHBvbGxmZFtpXS5mZCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQlsb2dfZGVidWcoInBvbGwgcGkgJWQgZmQgJWQgcmV2ZW50cyAleCIsCisJCQkJICBpLCBwb2xsZmRbaV0uZmQsIHBvbGxmZFtpXS5yZXZlbnRzKTsKKwkJCSovCisKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKKwkJCWNsID0gZmluZF9jbGllbnRfcGkoaSk7CisJCQlpZiAoY2wpIHsKKwkJCQlwdGhyZWFkX211dGV4X2xvY2soJmNsLT5tdXRleCk7CisKKwkJCQlpZiAoY2wtPnJlY3YpIHsKKwkJCQkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCQkJbG9nX2Vycm9yKCJtYWluIGNsaWVudCAldSBhbHJlYWR5IHJlY3YiLCBjbC0+aWQpOworCisJCQkJfSBlbHNlIGlmIChjbC0+ZGVhZCkgeworCQkJCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJCQlsb2dfZXJyb3IoIm1haW4gY2xpZW50ICV1IGFscmVhZHkgZGVhZCIsIGNsLT5pZCk7CisKKwkJCQl9IGVsc2UgaWYgKGlzX2RlYWQpIHsKKwkJCQkJbG9nX2RlYnVnKCJjbG9zZSAlc1slZF0gY2wgJXUgZmQgJWQiLAorCQkJCQkJICBjbC0+bmFtZVswXSA/IGNsLT5uYW1lIDogImNsaWVudCIsCisJCQkJCQkgIGNsLT5waWQsIGNsLT5pZCwgY2wtPmZkKTsKKwkJCQkJY2wtPmRlYWQgPSAxOworCQkJCQljbC0+cGkgPSAtMTsKKwkJCQkJY2wtPmZkID0gLTE7CisJCQkJCWNsLT5wb2xsX2lnbm9yZSA9IDA7CisJCQkJCWlmIChjbG9zZShwb2xsZmRbaV0uZmQpKQorCQkJCQkJbG9nX2Vycm9yKCJjbG9zZSBmZCAlZCBmYWlsZWQiLCBwb2xsZmRbaV0uZmQpOworCQkJCQlwb2xsZmRbaV0uZmQgPSBQT0xMX0ZEX1VOVVNFRDsKKwkJCQkJcG9sbGZkW2ldLmV2ZW50cyA9IDA7CisJCQkJCXBvbGxmZFtpXS5yZXZlbnRzID0gMDsKKworCQkJCX0gZWxzZSBpZiAoaXNfcmVjdikgeworCQkJCQljbC0+cmVjdiA9IDE7CisJCQkJCWNsLT5wb2xsX2lnbm9yZSA9IDE7CisJCQkJCXBvbGxmZFtpXS5mZCA9IFBPTExfRkRfSUdOT1JFOworCQkJCQlwb2xsZmRbaV0uZXZlbnRzID0gMDsKKwkJCQkJcG9sbGZkW2ldLnJldmVudHMgPSAwOworCQkJCX0KKworCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbC0+bXV0ZXgpOworCisJCQkJY2xpZW50X3dvcmsgPSAxOworCQkJCXB0aHJlYWRfY29uZF9zaWduYWwoJmNsaWVudF9jb25kKTsKKworCQkJCS8qIGNsaWVudF90aHJlYWQgd2lsbCBwaWNrIHVwIGFuZCB3b3JrIG9uIGFueQorCQkJCSAgIGNsaWVudCB3aXRoIGNsLT5yZWN2IG9yIGNsLT5kZWFkIHNldCAqLworCisJCQl9IGVsc2UgeworCQkJCS8qIGRvbid0IHRoaW5rIHRoaXMgY2FuIGhhcHBlbiAqLworCQkJCWxvZ19lcnJvcigibm8gY2xpZW50IGZvciBpbmRleCAlZCBmZCAlZCIsCisJCQkJCSAgaSwgcG9sbGZkW2ldLmZkKTsKKwkJCQlpZiAoY2xvc2UocG9sbGZkW2ldLmZkKSkKKwkJCQkJbG9nX2Vycm9yKCJjbG9zZSBmZCAlZCBmYWlsZWQiLCBwb2xsZmRbaV0uZmQpOworCQkJCXBvbGxmZFtpXS5mZCA9IFBPTExfRkRfVU5VU0VEOworCQkJCXBvbGxmZFtpXS5ldmVudHMgPSAwOworCQkJCXBvbGxmZFtpXS5yZXZlbnRzID0gMDsKKwkJCX0KKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOworCisJCQkvKiBBZnRlciBzZXRfZGVhZCwgc2hvdWxkIHdlIHNjYW4gcG9sbGZkIGZvcgorCQkJICAgbGFzdCB1bnVzZWQgc2xvdCBhbmQgcmVkdWNlIHBvbGxmZF9tYXhpPyAqLworCQl9CisJfQorCisJZm9yX2VhY2hfbG9ja3NwYWNlX3JldHJ5KERPX1NUT1AsIERPX0ZSRUUsIERPX0ZPUkNFKTsKKwljbG9zZV93b3JrZXJfdGhyZWFkKCk7CisJY2xvc2VfY2xpZW50X3RocmVhZCgpOworCWNsb3NlbG9nKCk7CisJZGFlbW9uX2Nsb3NlKGx2bWV0YWRfaGFuZGxlKTsKKwlyZXR1cm4gMTsgLyogbGliZGFlbW9uIHVzZXMgMSBmb3Igc3VjY2VzcyAqLworfQorCitzdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwcm9nLCBGSUxFICpmaWxlKQoreworCWZwcmludGYoZmlsZSwgIlVzYWdlOlxuIik7CisJZnByaW50ZihmaWxlLCAiJXMgW29wdGlvbnNdXG5cbiIsIHByb2cpOworCWZwcmludGYoZmlsZSwgIiAgLS1oZWxwIHwgLWhcbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgU2hvdyB0aGlzIGhlbHAgaW5mb3JtYXRpb24uXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tdmVyc2lvbiB8IC1WXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgICAgICAgIFNob3cgdmVyc2lvbiBvZiBsdm1sb2NrZC5cbiIpOworCWZwcmludGYoZmlsZSwgIiAgLS10ZXN0IHwgLVRcbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgVGVzdCBtb2RlLCBkbyBub3QgY2FsbCBsb2NrIG1hbmFnZXIuXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tZm9yZWdyb3VuZCB8IC1mXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgICAgICAgIERvbid0IGZvcmsuXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tZGFlbW9uLWRlYnVnIHwgLURcbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgRG9uJ3QgZm9yayBhbmQgcHJpbnQgZGVidWdnaW5nIHRvIHN0ZG91dC5cbiIpOworCWZwcmludGYoZmlsZSwgIiAgLS1waWQtZmlsZSB8IC1wIDxwYXRoPlxuIik7CisJZnByaW50ZihmaWxlLCAiICAgICAgICBTZXQgcGF0aCB0byB0aGUgcGlkIGZpbGUuIFslc11cbiIsIExWTUxPQ0tEX1BJREZJTEUpOworCWZwcmludGYoZmlsZSwgIiAgLS1zb2NrZXQtcGF0aCB8IC1zIDxwYXRoPlxuIik7CisJZnByaW50ZihmaWxlLCAiICAgICAgICBTZXQgcGF0aCB0byB0aGUgc29ja2V0IHRvIGxpc3RlbiBvbi4gWyVzXVxuIiwgTFZNTE9DS0RfU09DS0VUKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tc3lzbG9nLXByaW9yaXR5IHwgLVMgZXJyfHdhcm5pbmd8ZGVidWdcbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgV3JpdGUgbG9nIG1lc3NhZ2VzIGZyb20gdGhpcyBsZXZlbCB1cCB0byBzeXNsb2cuIFslc11cbiIsIF9zeXNsb2dfbnVtX3RvX25hbWUoTE9HX1NZU0xPR19QUklPKSk7CisJZnByaW50ZihmaWxlLCAiICAtLWdsLXR5cGUgfCAtZyA8c3RyPlxuIik7CisJZnByaW50ZihmaWxlLCAiICAgICAgICBTZXQgZ2xvYmFsIGxvY2sgdHlwZSB0byBiZSBkbG18c2FubG9jay5cbiIpOworCWZwcmludGYoZmlsZSwgIiAgLS1ob3N0LWlkIHwgLWkgPG51bT5cbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgU2V0IHRoZSBsb2NhbCBzYW5sb2NrIGhvc3QgaWQuXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0taG9zdC1pZC1maWxlIHwgLUYgPHBhdGg+XG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgICAgICAgIEEgZmlsZSBjb250YWluaW5nIHRoZSBsb2NhbCBzYW5sb2NrIGhvc3RfaWQuXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tc2FubG9jay10aW1lb3V0IHwgLW8gPHNlY29uZHM+XG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgICAgICAgIFNldCB0aGUgc2FubG9jayBsb2Nrc3BhY2UgSS9PIHRpbWVvdXQuXG4iKTsKKwlmcHJpbnRmKGZpbGUsICIgIC0tYWRvcHQgfCAtQSAwfDFcbiIpOworCWZwcmludGYoZmlsZSwgIiAgICAgICAgQWRvcHQgbG9ja3MgZnJvbSBhIHByZXZpb3VzIGluc3RhbmNlIG9mIGx2bWxvY2tkLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZGFlbW9uX3N0YXRlIGRzID0geworCQkuZGFlbW9uX21haW4gPSBtYWluX2xvb3AsCisJCS5kYWVtb25faW5pdCA9IE5VTEwsCisJCS5kYWVtb25fZmluaSA9IE5VTEwsCisJCS5waWRmaWxlID0gZ2V0ZW52KCJMVk1fTFZNTE9DS0RfUElERklMRSIpLAorCQkuc29ja2V0X3BhdGggPSBnZXRlbnYoIkxWTV9MVk1MT0NLRF9TT0NLRVQiKSwKKwkJLnByb3RvY29sID0gbHZtbG9ja2RfcHJvdG9jb2wsCisJCS5wcm90b2NvbF92ZXJzaW9uID0gbHZtbG9ja2RfcHJvdG9jb2xfdmVyc2lvbiwKKwkJLm5hbWUgPSAibHZtbG9ja2QiLAorCX07CisKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyJoZWxwIiwgICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgMCwgJ2gnIH0sCisJCXsidmVyc2lvbiIsICAgICAgICAgbm9fYXJndW1lbnQsICAgICAgIDAsICdWJyB9LAorCQl7InRlc3QiLCAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAwLCAnVCcgfSwKKwkJeyJmb3JlZ3JvdW5kIiwgICAgICBub19hcmd1bWVudCwgICAgICAgMCwgJ2YnIH0sCisJCXsiZGFlbW9uLWRlYnVnIiwgICAgbm9fYXJndW1lbnQsICAgICAgIDAsICdEJyB9LAorCQl7InBpZC1maWxlIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncCcgfSwKKwkJeyJzb2NrZXQtcGF0aCIsICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnIH0sCisJCXsiZ2wtdHlwZSIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdnJyB9LAorCQl7Imhvc3QtaWQiLCAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaScgfSwKKwkJeyJob3N0LWlkLWZpbGUiLCAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnIH0sCisJCXsiYWRvcHQiLCAgICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdBJyB9LAorCQl7InN5c2xvZy1wcmlvcml0eSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUycgfSwKKwkJeyJzYW5sb2NrLXRpbWVvdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ28nIH0sCisJCXswLCAwLCAwLCAwIH0KKwl9OworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCWludCBsbTsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDA7CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoVlRmRHA6czpsOmc6UzpJOkE6bzoiLAorCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJzAnOgorCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJdXNhZ2UoYXJndlswXSwgc3Rkb3V0KTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJY2FzZSAnVic6CisJCQlwcmludGYoImx2bWxvY2tkIHZlcnNpb246ICIgTFZNX1ZFUlNJT04gIlxuIik7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJ1QnOgorCQkJZGFlbW9uX3Rlc3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZHMuZm9yZWdyb3VuZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlkcy5mb3JlZ3JvdW5kID0gMTsKKwkJCWRhZW1vbl9kZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlkcy5waWRmaWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlkcy5zb2NrZXRfcGF0aCA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJbG0gPSBzdHJfdG9fbG0ob3B0YXJnKTsKKwkJCWlmIChsbSA9PSBMRF9MTV9ETE0gJiYgbG1fc3VwcG9ydF9kbG0oKSkKKwkJCQlnbF91c2VfZGxtID0gMTsKKwkJCWVsc2UgaWYgKGxtID09IExEX0xNX1NBTkxPQ0sgJiYgbG1fc3VwcG9ydF9zYW5sb2NrKCkpCisJCQkJZ2xfdXNlX3NhbmxvY2sgPSAxOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGdsLXR5cGUgb3B0aW9uXG4iKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlkYWVtb25faG9zdF9pZCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdGJzoKKwkJCWRhZW1vbl9ob3N0X2lkX2ZpbGUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCXNhbmxvY2tfaW9fdGltZW91dCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdBJzoKKwkJCWFkb3B0X29wdCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXN5c2xvZ19wcmlvcml0eSA9IF9zeXNsb2dfbmFtZV90b19udW0ob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGFyZ3ZbMF0sIHN0ZG91dCk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlpZiAoIWRzLnBpZGZpbGUpCisJCWRzLnBpZGZpbGUgPSBMVk1MT0NLRF9QSURGSUxFOworCisJaWYgKCFkcy5zb2NrZXRfcGF0aCkKKwkJZHMuc29ja2V0X3BhdGggPSBMVk1MT0NLRF9TT0NLRVQ7CisKKwkvKiBydW5zIGRhZW1vbl9tYWluL21haW5fbG9vcCAqLworCWRhZW1vbl9zdGFydChkcyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2QtZGxtLmMgYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWRsbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGNmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWRsbS5jCkBAIC0wLDAgKzEsNzc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwICAvKiBwdGhyZWFkICovCisjZGVmaW5lIF9JU09DOTlfU09VUkNFCisKKyNpbmNsdWRlICJ0b29sLmgiCisKKyNpbmNsdWRlICJkYWVtb24tc2VydmVyLmgiCisjaW5jbHVkZSAieGxhdGUuaCIKKworI2luY2x1ZGUgImx2bWxvY2tkLWludGVybmFsLmgiCisjaW5jbHVkZSAibHZtbG9ja2QtY2xpZW50LmgiCisKKy8qCisgKiBVc2luZyBzeW5jaHJvbm91cyBfd2FpdCBkbG0gYXBpcyBzbyBkbyBub3QgZGVmaW5lIF9SRUVOVFJBTlQgYW5kCisgKiBsaW5rIHdpdGggbm9uLXRocmVhZGVkIHZlcnNpb24gb2YgbGlicmFyeSwgbGliZGxtX2x0LgorICovCisjaW5jbHVkZSAibGliZGxtLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKK3N0cnVjdCBsbV9kbG0geworCWRsbV9sc2hhbmRsZV90ICpkaDsKK307CisKK3N0cnVjdCByZF9kbG0geworCXN0cnVjdCBkbG1fbGtzYiBsa3NiOworCXN0cnVjdCB2YWxfYmxrICp2YjsKK307CisKK2ludCBsbV9kYXRhX3NpemVfZGxtKHZvaWQpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmRfZGxtKTsKK30KKworLyoKKyAqIGxvY2tfYXJncyBmb3JtYXQKKyAqCisgKiB2Z19sb2NrX2FyZ3MgZm9ybWF0IGZvciBkbG0gaXMKKyAqIHZnX3ZlcnNpb25fc3RyaW5nOnVuZGVmaW5lZDpjbHVzdGVyX25hbWUKKyAqCisgKiBsdl9sb2NrX2FyZ3MgYXJlIG5vdCB1c2VkIGZvciBkbG0KKyAqCisgKiB2ZXJzaW9uX3N0cmluZyBpcyBNQUpPUi5NSU5PUi5QQVRDSAorICogdW5kZWZpbmVkIG1heSBjb250YWluICI6IgorICovCisKKyNkZWZpbmUgVkdfTE9DS19BUkdTX01BSk9SIDEKKyNkZWZpbmUgVkdfTE9DS19BUkdTX01JTk9SIDAKKyNkZWZpbmUgVkdfTE9DS19BUkdTX1BBVENIIDAKKworc3RhdGljIGludCBkbG1faGFzX2x2Yl9idWc7CisKK3N0YXRpYyBpbnQgY2x1c3Rlcl9uYW1lX2Zyb21fYXJncyhjaGFyICp2Z19hcmdzLCBjaGFyICpjbHVzdGVybmFtZSkKK3sKKwlyZXR1cm4gbGFzdF9zdHJpbmdfZnJvbV9hcmdzKHZnX2FyZ3MsIGNsdXN0ZXJuYW1lKTsKK30KKworc3RhdGljIGludCBjaGVja19hcmdzX3ZlcnNpb24oY2hhciAqdmdfYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOworCWludCBydjsKKworCXJ2ID0gdmVyc2lvbl9mcm9tX2FyZ3ModmdfYXJncywgJm1ham9yLCBOVUxMLCBOVUxMKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiY2hlY2tfYXJnc192ZXJzaW9uICVzIGVycm9yICVkIiwgdmdfYXJncywgcnYpOworCQlyZXR1cm4gcnY7CisJfQorCisJaWYgKG1ham9yID4gVkdfTE9DS19BUkdTX01BSk9SKSB7CisJCWxvZ19lcnJvcigiY2hlY2tfYXJnc192ZXJzaW9uICVzIG1ham9yICVkICVkIiwgdmdfYXJncywgbWFqb3IsIFZHX0xPQ0tfQVJHU19NQUpPUik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB3aWxsIGJlIHNldCBhZnRlciBkbG1fY29udHJvbGQgaXMgc3RhcnRlZC4gKi8KKyNkZWZpbmUgRExNX0NMVVNURVJfTkFNRV9QQVRIICIvc3lzL2tlcm5lbC9jb25maWcvZGxtL2NsdXN0ZXIvY2x1c3Rlcl9uYW1lIgorCitzdGF0aWMgaW50IHJlYWRfY2x1c3Rlcl9uYW1lKGNoYXIgKmNsdXN0ZXJuYW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGNsb3NlX2Vycm9yX21zZ1tdID0gInJlYWRfY2x1c3Rlcl9uYW1lOiBjbG9zZV9lcnJvciAlZCI7CisJY2hhciAqbjsKKwlpbnQgZmQ7CisJaW50IHJ2OworCisJaWYgKGRhZW1vbl90ZXN0KSB7CisJCXNwcmludGYoY2x1c3Rlcm5hbWUsICIlcyIsICJ0ZXN0Iik7CisJCXJldHVybiAwOworCX0KKworCWZkID0gb3BlbihETE1fQ0xVU1RFUl9OQU1FX1BBVEgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWxvZ19kZWJ1ZygicmVhZF9jbHVzdGVyX25hbWU6IG9wZW4gZXJyb3IgJWQsIGNoZWNrIGRsbV9jb250cm9sZCIsIGZkKTsKKwkJcmV0dXJuIGZkOworCX0KKworCXJ2ID0gcmVhZChmZCwgY2x1c3Rlcm5hbWUsIE1BWF9BUkdTKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigicmVhZF9jbHVzdGVyX25hbWU6IGNsdXN0ZXIgbmFtZSByZWFkIGVycm9yICVkLCBjaGVjayBkbG1fY29udHJvbGQiLCBmZCk7CisJCWlmIChjbG9zZShmZCkpCisJCQlsb2dfZXJyb3IoY2xvc2VfZXJyb3JfbXNnLCBmZCk7CisJCXJldHVybiBydjsKKwl9CisKKwluID0gc3Ryc3RyKGNsdXN0ZXJuYW1lLCAiXG4iKTsKKwlpZiAobikKKwkJKm4gPSAnXDAnOworCWlmIChjbG9zZShmZCkpCisJCWxvZ19lcnJvcihjbG9zZV9lcnJvcl9tc2csIGZkKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxtX2luaXRfdmdfZGxtKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIHVpbnQzMl90IGZsYWdzLCBjaGFyICp2Z19hcmdzKQoreworCWNoYXIgY2x1c3Rlcm5hbWVbTUFYX0FSR1MrMV07CisJY2hhciBsb2NrX2FyZ3NfdmVyc2lvbltNQVhfQVJHUysxXTsKKwlpbnQgcnY7CisKKwltZW1zZXQoY2x1c3Rlcm5hbWUsIDAsIHNpemVvZihjbHVzdGVybmFtZSkpOworCW1lbXNldChsb2NrX2FyZ3NfdmVyc2lvbiwgMCwgc2l6ZW9mKGxvY2tfYXJnc192ZXJzaW9uKSk7CisKKwlzbnByaW50Zihsb2NrX2FyZ3NfdmVyc2lvbiwgTUFYX0FSR1MsICIldS4ldS4ldSIsCisJCSBWR19MT0NLX0FSR1NfTUFKT1IsIFZHX0xPQ0tfQVJHU19NSU5PUiwgVkdfTE9DS19BUkdTX1BBVENIKTsKKworCXJ2ID0gcmVhZF9jbHVzdGVyX25hbWUoY2x1c3Rlcm5hbWUpOworCWlmIChydiA8IDApCisJCXJldHVybiAtRU1BTkFHRVI7CisKKwlpZiAoc3RybGVuKGNsdXN0ZXJuYW1lKSArIHN0cmxlbihsb2NrX2FyZ3NfdmVyc2lvbikgKyAyID4gTUFYX0FSR1MpIHsKKwkJbG9nX2Vycm9yKCJpbml0X3ZnX2RsbSBhcmdzIHRvbyBsb25nIik7CisJCXJldHVybiAtRUFSR1M7CisJfQorCisJc25wcmludGYodmdfYXJncywgTUFYX0FSR1MsICIlczolcyIsIGxvY2tfYXJnc192ZXJzaW9uLCBjbHVzdGVybmFtZSk7CisJcnYgPSAwOworCisJbG9nX2RlYnVnKCJpbml0X3ZnX2RsbSBkb25lICVzIHZnX2FyZ3MgJXMiLCBsc19uYW1lLCB2Z19hcmdzKTsKKwlyZXR1cm4gcnY7Cit9CisKK2ludCBsbV9wcmVwYXJlX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMpCit7CisJY2hhciBzeXNfY2x1c3Rlcm5hbWVbTUFYX0FSR1MrMV07CisJY2hhciBhcmdfY2x1c3Rlcm5hbWVbTUFYX0FSR1MrMV07CisJdWludDMyX3QgbWFqb3IgPSAwLCBtaW5vciA9IDAsIHBhdGNoID0gMDsKKwlzdHJ1Y3QgbG1fZGxtICpsbWQ7CisJaW50IHJ2OworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlnb3RvIHNraXBfYXJnczsKKworCW1lbXNldChzeXNfY2x1c3Rlcm5hbWUsIDAsIHNpemVvZihzeXNfY2x1c3Rlcm5hbWUpKTsKKwltZW1zZXQoYXJnX2NsdXN0ZXJuYW1lLCAwLCBzaXplb2YoYXJnX2NsdXN0ZXJuYW1lKSk7CisKKwlydiA9IHJlYWRfY2x1c3Rlcl9uYW1lKHN5c19jbHVzdGVybmFtZSk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIC1FTUFOQUdFUjsKKworCXJ2ID0gZGxtX2tlcm5lbF92ZXJzaW9uKCZtYWpvciwgJm1pbm9yLCAmcGF0Y2gpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJwcmVwYXJlX2xvY2tzcGFjZV9kbG0ga2VybmVsX3ZlcnNpb24gbm90IGRldGVjdGVkICVkIiwgcnYpOworCQlkbG1faGFzX2x2Yl9idWcgPSAxOworCX0KKworCWlmICgobWFqb3IgPT0gNikgJiYgKG1pbm9yID09IDApICYmIChwYXRjaCA9PSAxKSkgeworCQlsb2dfZGVidWcoImRsbSBrZXJuZWwgdmVyc2lvbiAldS4ldS4ldSBoYXMgbHZiIGJ1ZyIsIG1ham9yLCBtaW5vciwgcGF0Y2gpOworCQlkbG1faGFzX2x2Yl9idWcgPSAxOworCX0KKworCWlmICghbHMtPnZnX2FyZ3NbMF0pIHsKKwkJLyogZ2xvYmFsIGxvY2tzcGFjZSBoYXMgbm8gdmcgYXJncyAqLworCQlnb3RvIHNraXBfYXJnczsKKwl9CisKKwlydiA9IGNoZWNrX2FyZ3NfdmVyc2lvbihscy0+dmdfYXJncyk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIC1FQVJHUzsKKworCXJ2ID0gY2x1c3Rlcl9uYW1lX2Zyb21fYXJncyhscy0+dmdfYXJncywgYXJnX2NsdXN0ZXJuYW1lKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigicHJlcGFyZV9sb2Nrc3BhY2VfZGxtICVzIG5vIGNsdXN0ZXIgbmFtZSBmcm9tIGFyZ3MgJXMiLCBscy0+bmFtZSwgbHMtPnZnX2FyZ3MpOworCQlyZXR1cm4gLUVBUkdTOworCX0KKworCWlmIChzdHJjbXAoc3lzX2NsdXN0ZXJuYW1lLCBhcmdfY2x1c3Rlcm5hbWUpKSB7CisJCWxvZ19lcnJvcigicHJlcGFyZV9sb2Nrc3BhY2VfZGxtICVzIG1pc21hdGNoaW5nIGNsdXN0ZXIgbmFtZXMgc3lzICVzIGFyZyAlcyIsCisJCQkgIGxzLT5uYW1lLCBzeXNfY2x1c3Rlcm5hbWUsIGFyZ19jbHVzdGVybmFtZSk7CisJCXJldHVybiAtRUFSR1M7CisJfQorCisgc2tpcF9hcmdzOgorCWxtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGxtX2RsbSkpOworCWlmICghbG1kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxzLT5sbV9kYXRhID0gbG1kOworCXJldHVybiAwOworfQorCitpbnQgbG1fYWRkX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBhZG9wdCkKK3sKKwlzdHJ1Y3QgbG1fZGxtICpsbWQgPSAoc3RydWN0IGxtX2RsbSAqKWxzLT5sbV9kYXRhOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCWlmIChhZG9wdCkKKwkJbG1kLT5kaCA9IGRsbV9vcGVuX2xvY2tzcGFjZShscy0+bmFtZSk7CisJZWxzZQorCQlsbWQtPmRoID0gZGxtX25ld19sb2Nrc3BhY2UobHMtPm5hbWUsIDA2MDAsIERMTV9MU0ZMX05FV0VYQ0wpOworCisJaWYgKCFsbWQtPmRoKSB7CisJCWxvZ19lcnJvcigiYWRkX2xvY2tzcGFjZV9kbG0gJXMgYWRvcHQgJWQgZXJyb3IiLCBscy0+bmFtZSwgYWRvcHQpOworCQlmcmVlKGxtZCk7CisJCWxzLT5sbV9kYXRhID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbG1fcmVtX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBmcmVlX3ZnKQoreworCXN0cnVjdCBsbV9kbG0gKmxtZCA9IChzdHJ1Y3QgbG1fZGxtICopbHMtPmxtX2RhdGE7CisJaW50IHJ2OworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgZnJlZV92ZyBpcyBzZXQsIGl0IG1lYW5zIHdlIGFyZSBkb2luZyB2Z3JlbW92ZSwgYW5kIHdlIG1heSB3YW50CisJICogdG8gdGVsbCBhbnkgb3RoZXIgbm9kZXMgdG8gbGVhdmUgdGhlIGxvY2tzcGFjZS4gIFRoaXMgaXMgbm90IHJlYWxseQorCSAqIG5lY2Vzc2FyeSBzaW5jZSB0aGVyZSBzaG91bGQgYmUgbm8gaGFybSBpbiBoYXZpbmcgYW4gdW51c2VkCisJICogbG9ja3NwYWNlIHNpdHRpbmcgYXJvdW5kLiAgQSBuZXcgIm5vdGlmaWNhdGlvbiBsb2NrIiB3b3VsZCBuZWVkIHRvCisJICogYmUgYWRkZWQgd2l0aCBhIGNhbGxiYWNrIHRvIHNpZ25hbCB0aGlzLiAKKwkgKi8KKworCXJ2ID0gZGxtX3JlbGVhc2VfbG9ja3NwYWNlKGxzLT5uYW1lLCBsbWQtPmRoLCAxKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigicmVtX2xvY2tzcGFjZV9kbG0gZXJyb3IgJWQiLCBydik7CisJCXJldHVybiBydjsKKwl9Cisgb3V0OgorCWZyZWUobG1kKTsKKwlscy0+bG1fZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG1fYWRkX3Jlc291cmNlX2RsbShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyLCBpbnQgd2l0aF9sb2NrX25sKQoreworCXN0cnVjdCBsbV9kbG0gKmxtZCA9IChzdHJ1Y3QgbG1fZGxtICopbHMtPmxtX2RhdGE7CisJc3RydWN0IHJkX2RsbSAqcmRkID0gKHN0cnVjdCByZF9kbG0gKilyLT5sbV9kYXRhOworCXVpbnQzMl90IGZsYWdzID0gMDsKKwljaGFyICpidWY7CisJaW50IHJ2OworCisJaWYgKHItPnR5cGUgPT0gTERfUlRfR0wgfHwgci0+dHlwZSA9PSBMRF9SVF9WRykgeworCQlidWYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2YWxfYmxrKSArIERMTV9MVkJfTEVOKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCB2YWxfYmxrKSArIERMTV9MVkJfTEVOKTsKKworCQlyZGQtPnZiID0gKHN0cnVjdCB2YWxfYmxrICopYnVmOworCQlyZGQtPmxrc2Iuc2JfbHZicHRyID0gYnVmICsgc2l6ZW9mKHN0cnVjdCB2YWxfYmxrKTsKKworCQlmbGFncyB8PSBMS0ZfVkFMQkxLOworCX0KKworCWlmICghd2l0aF9sb2NrX25sKQorCQlnb3RvIG91dDsKKworCS8qIGJlY2F1c2UgdGhpcyBpcyBhIG5ldyBOTCBsb2NrIHJlcXVlc3QgKi8KKwlmbGFncyB8PSBMS0ZfRVhQRURJVEU7CisKKwlpZiAoZGFlbW9uX3Rlc3QpCisJCWdvdG8gb3V0OworCisJcnYgPSBkbG1fbHNfbG9ja193YWl0KGxtZC0+ZGgsIExLTV9OTE1PREUsICZyZGQtPmxrc2IsIGZsYWdzLAorCQkJICAgICAgci0+bmFtZSwgc3RybGVuKHItPm5hbWUpLAorCQkJICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBhZGRfcmVzb3VyY2VfZGxtIGxvY2sgZXJyb3IgJWQiLCBscy0+bmFtZSwgci0+bmFtZSwgcnYpOworCQlyZXR1cm4gcnY7CisJfQorIG91dDoKKwlyZXR1cm4gMDsKK30KKworaW50IGxtX3JlbV9yZXNvdXJjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlzdHJ1Y3QgbG1fZGxtICpsbWQgPSAoc3RydWN0IGxtX2RsbSAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9kbG0gKnJkZCA9IChzdHJ1Y3QgcmRfZGxtICopci0+bG1fZGF0YTsKKwlzdHJ1Y3QgZGxtX2xrc2IgKmxrc2I7CisJaW50IHJ2ID0gMDsKKworCWlmIChkYWVtb25fdGVzdCkKKwkJZ290byBvdXQ7CisKKwlsa3NiID0gJnJkZC0+bGtzYjsKKworCWlmICghbGtzYi0+c2JfbGtpZCkKKwkJZ290byBvdXQ7CisKKwlydiA9IGRsbV9sc191bmxvY2tfd2FpdChsbWQtPmRoLCBsa3NiLT5zYl9sa2lkLCAwLCBsa3NiKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBSICVzIHJlbV9yZXNvdXJjZV9kbG0gdW5sb2NrIGVycm9yICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKwl9Cisgb3V0OgorCWlmIChyZGQtPnZiKQorCQlmcmVlKHJkZC0+dmIpOworCisJbWVtc2V0KHJkZCwgMCwgc2l6ZW9mKHN0cnVjdCByZF9kbG0pKTsKKwlyLT5sbV9pbml0ID0gMDsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgdG9fZGxtX21vZGUoaW50IGxkX21vZGUpCit7CisJc3dpdGNoIChsZF9tb2RlKSB7CisJY2FzZSBMRF9MS19FWDoKKwkJcmV0dXJuIExLTV9FWE1PREU7CisJY2FzZSBMRF9MS19TSDoKKwkJcmV0dXJuIExLTV9QUk1PREU7CisJfTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbG1fYWRvcHRfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsIGludCBsZF9tb2RlLAorCQkJc3RydWN0IHZhbF9ibGsgKnZiX291dCkKK3sKKwlzdHJ1Y3QgbG1fZGxtICpsbWQgPSAoc3RydWN0IGxtX2RsbSAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9kbG0gKnJkZCA9IChzdHJ1Y3QgcmRfZGxtICopci0+bG1fZGF0YTsKKwlzdHJ1Y3QgZGxtX2xrc2IgKmxrc2I7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCWludCBtb2RlOworCWludCBydjsKKworCW1lbXNldCh2Yl9vdXQsIDAsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCisJaWYgKCFyLT5sbV9pbml0KSB7CisJCXJ2ID0gbG1fYWRkX3Jlc291cmNlX2RsbShscywgciwgMCk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gcnY7CisJCXItPmxtX2luaXQgPSAxOworCX0KKworCWxrc2IgPSAmcmRkLT5sa3NiOworCisJZmxhZ3MgfD0gTEtGX1BFUlNJU1RFTlQ7CisJZmxhZ3MgfD0gTEtGX09SUEhBTjsKKworCWlmIChyZGQtPnZiKQorCQlmbGFncyB8PSBMS0ZfVkFMQkxLOworCisJbW9kZSA9IHRvX2RsbV9tb2RlKGxkX21vZGUpOworCWlmIChtb2RlIDwgMCkgeworCQlsb2dfZXJyb3IoImFkb3B0X2RsbSBpbnZhbGlkIG1vZGUgJWQiLCBsZF9tb2RlKTsKKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJbG9nX2RlYnVnKCJTICVzIFIgJXMgYWRvcHRfZGxtIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZGxtIHJldHVybnMgMCBmb3Igc3VjY2VzcywgLUVBR0FJTiBpZiBhbiBvcnBoYW4gaXMKKwkgKiBmb3VuZCB3aXRoIGFub3RoZXIgbW9kZSwgYW5kIC1FTk9FTlQgaWYgbm8gb3JwaGFuLgorCSAqCisJICogY2FzdC9iYXN0L3BhcmFtIGFyZSAodm9pZCAqKTEgYmVjYXVzZSB0aGUga2VybmVsCisJICogcmV0dXJucyBlcnJvcnMgaWYgc29tZSBhcmUgbnVsbC4KKwkgKi8KKworCXJ2ID0gZGxtX2xzX2xvY2t4KGxtZC0+ZGgsIG1vZGUsIGxrc2IsIGZsYWdzLAorCQkJICByLT5uYW1lLCBzdHJsZW4oci0+bmFtZSksIDAsCisJCQkgICh2b2lkICopMSwgKHZvaWQgKikxLCAodm9pZCAqKTEsCisJCQkgIE5VTEwsIE5VTEwpOworCisJaWYgKHJ2ID09IC0xICYmIGVycm5vID09IC1FQUdBSU4pIHsKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgYWRvcHRfZGxtIGFkb3B0IG1vZGUgJWQgdHJ5IG90aGVyIG1vZGUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgbGRfbW9kZSk7CisJCXJ2ID0gLUVVQ0xFQU47CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBhZG9wdF9kbG0gbW9kZSAlZCBmbGFncyAleCBlcnJvciAlZCBlcnJubyAlZCIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBtb2RlLCBmbGFncywgcnYsIGVycm5vKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogRklYTUU6IEZvciBHTC9WRyBsb2NrcyB3ZSBwcm9iYWJseSB3YW50IHRvIHJlYWQgdGhlIGx2YiwKKwkgKiBlc3BlY2lhbGx5IGlmIGFkb3B0aW5nIGFuIGV4IGxvY2ssIGJlY2F1c2Ugd2hlbiB3ZQorCSAqIHJlbGVhc2UgdGhpcyBhZG9wdGVkIGV4IGxvY2sgd2UgbWF5IHdhbnQgdG8gd3JpdGUgbmV3CisJICogbHZiIHZhbHVlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsdmIgdmFsdWVzIChhdCBsZWFzZQorCSAqIGluIHRoZSBHTCBjYXNlIHdoZXJlIHdlIGluY3JlbWVudCB0aGUgY3VycmVudCB2YWx1ZXMuKQorCSAqCisJICogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlYWQgdGhlIGx2YiBieSByZXF1ZXN0aW5nCisJICogdGhpcyBsb2NrIGluIHRoZSBzYW1lIG1vZGUgaXQncyBhbHJlYWR5IGluLgorCSAqLworCisJcmV0dXJuIHJ2OworCisgZmFpbDoKKwlsbV9yZW1fcmVzb3VyY2VfZGxtKGxzLCByKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBVc2UgUEVSU0lTVEVOVCBzbyB0aGF0IGlmIGx2bWxvY2tkIGV4aXRzIHdoaWxlIGhvbGRpbmcgbG9ja3MsCisgKiB0aGUgbG9ja3Mgd2lsbCByZW1haW4gb3JwaGFuZWQgaW4gdGhlIGRsbSwgc3RpbGwgcHJvdGVjdGluZyB3aGF0CisgKiB0aGV5IHdlcmUgYWNxdWlyZWQgdG8gcHJvdGVjdC4KKyAqLworCitpbnQgbG1fbG9ja19kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IGxkX21vZGUsCisJCXN0cnVjdCB2YWxfYmxrICp2Yl9vdXQsIGludCBhZG9wdCkKK3sKKwlzdHJ1Y3QgbG1fZGxtICpsbWQgPSAoc3RydWN0IGxtX2RsbSAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9kbG0gKnJkZCA9IChzdHJ1Y3QgcmRfZGxtICopci0+bG1fZGF0YTsKKwlzdHJ1Y3QgZGxtX2xrc2IgKmxrc2I7CisJc3RydWN0IHZhbF9ibGsgdmI7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCWludCBtb2RlOworCWludCBydjsKKworCWlmIChhZG9wdCkgeworCQkvKiBXaGVuIGFkb3B0aW5nLCB3ZSBkb24ndCBmb2xsb3cgdGhlIG5vcm1hbCBtZXRob2QKKwkJICAgb2YgYWNxdWlyaW5nIGEgTkwgbG9jayB0aGVuIGNvbnZlcnRpbmcgaXQgdG8gdGhlCisJCSAgIGRlc2lyZWQgbW9kZS4gKi8KKwkJcmV0dXJuIGxtX2Fkb3B0X2RsbShscywgciwgbGRfbW9kZSwgdmJfb3V0KTsKKwl9CisKKwlpZiAoIXItPmxtX2luaXQpIHsKKwkJcnYgPSBsbV9hZGRfcmVzb3VyY2VfZGxtKGxzLCByLCAxKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwkJci0+bG1faW5pdCA9IDE7CisJfQorCisJbGtzYiA9ICZyZGQtPmxrc2I7CisKKwlmbGFncyB8PSBMS0ZfQ09OVkVSVDsKKwlmbGFncyB8PSBMS0ZfTk9RVUVVRTsKKwlmbGFncyB8PSBMS0ZfUEVSU0lTVEVOVDsKKworCWlmIChyZGQtPnZiKQorCQlmbGFncyB8PSBMS0ZfVkFMQkxLOworCisJbW9kZSA9IHRvX2RsbV9tb2RlKGxkX21vZGUpOworCWlmIChtb2RlIDwgMCkgeworCQlsb2dfZXJyb3IoImxvY2tfZGxtIGludmFsaWQgbW9kZSAlZCIsIGxkX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2dfZGVidWcoIlMgJXMgUiAlcyBsb2NrX2RsbSIsIGxzLT5uYW1lLCByLT5uYW1lKTsKKworCWlmIChkYWVtb25fdGVzdCkgeworCQlpZiAocmRkLT52YikgeworCQkJdmJfb3V0LT52ZXJzaW9uID0gbGUxNl90b19jcHUocmRkLT52Yi0+dmVyc2lvbik7CisJCQl2Yl9vdXQtPmZsYWdzID0gbGUxNl90b19jcHUocmRkLT52Yi0+ZmxhZ3MpOworCQkJdmJfb3V0LT5yX3ZlcnNpb24gPSBsZTMyX3RvX2NwdShyZGQtPnZiLT5yX3ZlcnNpb24pOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhlIGRsbSBsdmIgYnVnIG1lYW5zIHRoYXQgY29udmVydGluZyBOTC0+RVggd2lsbCBub3QgcmV0dXJuIAorCSAqIHRoZSBsYXRlc3QgbHZiLCBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQgTkwtPlBSLT5FWCB0byByZXJlYWQgaXQuCisJICovCisJaWYgKGRsbV9oYXNfbHZiX2J1ZyAmJiAobGRfbW9kZSA9PSBMRF9MS19FWCkpIHsKKwkJcnYgPSBkbG1fbHNfbG9ja193YWl0KGxtZC0+ZGgsIExLTV9QUk1PREUsIGxrc2IsIGZsYWdzLAorCQkJCSAgICAgIHItPm5hbWUsIHN0cmxlbihyLT5uYW1lKSwKKwkJCQkgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJ2ID09IC0xKSB7CisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBsb2NrX2RsbSBhY3F1aXJlIG1vZGUgUFIgZm9yICVkIHJ2ICVkIiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBtb2RlLCBydik7CisJCQlnb3RvIGxvY2tydjsKKwkJfQorCisJCS8qIEZhbGwgdGhyb3VnaCB0byByZXF1ZXN0IEVYLiAqLworCX0KKworCXJ2ID0gZGxtX2xzX2xvY2tfd2FpdChsbWQtPmRoLCBtb2RlLCBsa3NiLCBmbGFncywKKwkJCSAgICAgIHItPm5hbWUsIHN0cmxlbihyLT5uYW1lKSwKKwkJCSAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworbG9ja3J2OgorCWlmIChydiA9PSAtMSAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgbG9ja19kbG0gYWNxdWlyZSBtb2RlICVkIHJ2IEVBR0FJTiIsIGxzLT5uYW1lLCByLT5uYW1lLCBtb2RlKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgbG9ja19kbG0gYWNxdWlyZSBlcnJvciAlZCBlcnJubyAlZCIsIGxzLT5uYW1lLCByLT5uYW1lLCBydiwgZXJybm8pOworCQlyZXR1cm4gcnY7CisJfQorCisJaWYgKHJkZC0+dmIpIHsKKwkJaWYgKGxrc2ItPnNiX2ZsYWdzICYgRExNX1NCRl9WQUxOT1RWQUxJRCkgeworCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgbG9ja19kbG0gVkFMTk9UVkFMSUQiLCBscy0+bmFtZSwgci0+bmFtZSk7CisJCQltZW1zZXQocmRkLT52YiwgMCwgc2l6ZW9mKHN0cnVjdCB2YWxfYmxrKSk7CisJCQltZW1zZXQodmJfb3V0LCAwLCBzaXplb2Yoc3RydWN0IHZhbF9ibGspKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogJ3ZiJyBjb250YWlucyBkaXNrIGVuZGlhbiB2YWx1ZXMsIG5vdCBob3N0IGVuZGlhbi4KKwkJICogSXQgaXMgY29waWVkIGRpcmVjdGx5IHRvIHJkZC0+dmIgd2hpY2ggaXMgYWxzbyBrZXB0CisJCSAqIGluIGRpc2sgZW5kaWFuIGZvcm0uCisJCSAqIHZiX291dCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGluIGhvc3QgZW5kaWFuIGZvcm0uCisJCSAqLworCQltZW1jcHkoJnZiLCBsa3NiLT5zYl9sdmJwdHIsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCQltZW1jcHkocmRkLT52YiwgJnZiLCBzaXplb2YodmIpKTsKKworCQl2Yl9vdXQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdSh2Yi52ZXJzaW9uKTsKKwkJdmJfb3V0LT5mbGFncyA9IGxlMTZfdG9fY3B1KHZiLmZsYWdzKTsKKwkJdmJfb3V0LT5yX3ZlcnNpb24gPSBsZTMyX3RvX2NwdSh2Yi5yX3ZlcnNpb24pOworCX0KK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50IGxtX2NvbnZlcnRfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgIGludCBsZF9tb2RlLCB1aW50MzJfdCByX3ZlcnNpb24pCit7CisJc3RydWN0IGxtX2RsbSAqbG1kID0gKHN0cnVjdCBsbV9kbG0gKilscy0+bG1fZGF0YTsKKwlzdHJ1Y3QgcmRfZGxtICpyZGQgPSAoc3RydWN0IHJkX2RsbSAqKXItPmxtX2RhdGE7CisJc3RydWN0IGRsbV9sa3NiICpsa3NiID0gJnJkZC0+bGtzYjsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IGZsYWdzID0gMDsKKwlpbnQgcnY7CisKKwlsb2dfZGVidWcoIlMgJXMgUiAlcyBjb252ZXJ0X2RsbSIsIGxzLT5uYW1lLCByLT5uYW1lKTsKKworCWZsYWdzIHw9IExLRl9DT05WRVJUOworCWZsYWdzIHw9IExLRl9OT1FVRVVFOworCWZsYWdzIHw9IExLRl9QRVJTSVNURU5UOworCisJaWYgKHJkZC0+dmIgJiYgcl92ZXJzaW9uICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCQlpZiAoIXJkZC0+dmItPnZlcnNpb24pIHsKKwkJCS8qIGZpcnN0IHRpbWUgdmIgaGFzIGJlZW4gd3JpdHRlbiAqLworCQkJcmRkLT52Yi0+dmVyc2lvbiA9IGNwdV90b19sZTE2KFZBTF9CTEtfVkVSU0lPTik7CisJCX0KKwkJcmRkLT52Yi0+cl92ZXJzaW9uID0gY3B1X3RvX2xlMzIocl92ZXJzaW9uKTsKKwkJbWVtY3B5KGxrc2ItPnNiX2x2YnB0ciwgcmRkLT52Yiwgc2l6ZW9mKHN0cnVjdCB2YWxfYmxrKSk7CisKKwkJbG9nX2RlYnVnKCJTICVzIFIgJXMgY29udmVydF9kbG0gc2V0IHJfdmVyc2lvbiAldSIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCByX3ZlcnNpb24pOworCisJCWZsYWdzIHw9IExLRl9WQUxCTEs7CisJfQorCisJbW9kZSA9IHRvX2RsbV9tb2RlKGxkX21vZGUpOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCXJ2ID0gZGxtX2xzX2xvY2tfd2FpdChsbWQtPmRoLCBtb2RlLCBsa3NiLCBmbGFncywKKwkJCSAgICAgIHItPm5hbWUsIHN0cmxlbihyLT5uYW1lKSwKKwkJCSAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmIChydiA9PSAtMSAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKwkJLyogRklYTUU6IFdoZW4gZG9lcyB0aGlzIGhhcHBlbj8gIFNob3VsZCBzb21ldGhpbmcgZGlmZmVyZW50IGJlIGRvbmU/ICovCisJCWxvZ19lcnJvcigiUyAlcyBSICVzIGNvbnZlcnRfZGxtIG1vZGUgJWQgcnYgRUFHQUlOIiwgbHMtPm5hbWUsIHItPm5hbWUsIG1vZGUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBjb252ZXJ0X2RsbSBlcnJvciAlZCIsIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisJfQorCXJldHVybiBydjsKK30KKworaW50IGxtX3VubG9ja19kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICB1aW50MzJfdCByX3ZlcnNpb24sIHVpbnQzMl90IGxtdV9mbGFncykKK3sKKwlzdHJ1Y3QgbG1fZGxtICpsbWQgPSAoc3RydWN0IGxtX2RsbSAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9kbG0gKnJkZCA9IChzdHJ1Y3QgcmRfZGxtICopci0+bG1fZGF0YTsKKwlzdHJ1Y3QgZGxtX2xrc2IgKmxrc2IgPSAmcmRkLT5sa3NiOworCXN0cnVjdCB2YWxfYmxrIHZiX3ByZXY7CisJc3RydWN0IHZhbF9ibGsgdmJfbmV4dDsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJaW50IG5ld192YiA9IDA7CisJaW50IHJ2OworCisJLyoKKwkgKiBEbyBub3Qgc2V0IFBFUlNJU1RFTlQsIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBhbiBvcnBoYW4KKwkgKiBOTCBsb2NrIHRvIHByb3RlY3QgYW55dGhpbmcuCisJICovCisKKwlmbGFncyB8PSBMS0ZfQ09OVkVSVDsKKworCWlmIChyZGQtPnZiICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCisJCS8qIHZiX3ByZXYgYW5kIHZiX25leHQgYXJlIGluIGRpc2sgZW5kaWFuIGZvcm0gKi8KKwkJbWVtY3B5KCZ2Yl9wcmV2LCByZGQtPnZiLCBzaXplb2Yoc3RydWN0IHZhbF9ibGspKTsKKwkJbWVtY3B5KCZ2Yl9uZXh0LCByZGQtPnZiLCBzaXplb2Yoc3RydWN0IHZhbF9ibGspKTsKKworCQlpZiAoIXZiX3ByZXYudmVyc2lvbikgeworCQkJdmJfbmV4dC52ZXJzaW9uID0gY3B1X3RvX2xlMTYoVkFMX0JMS19WRVJTSU9OKTsKKwkJCW5ld192YiA9IDE7CisJCX0KKworCQlpZiAoKGxtdV9mbGFncyAmIExNVUZfRlJFRV9WRykgJiYgKHItPnR5cGUgPT0gTERfUlRfVkcpKSB7CisJCQl2Yl9uZXh0LmZsYWdzID0gY3B1X3RvX2xlMTYoVkJGX1JFTU9WRUQpOworCQkJbmV3X3ZiID0gMTsKKwkJfQorCisJCWlmIChyX3ZlcnNpb24pIHsKKwkJCXZiX25leHQucl92ZXJzaW9uID0gY3B1X3RvX2xlMzIocl92ZXJzaW9uKTsKKwkJCW5ld192YiA9IDE7CisJCX0KKworCQlpZiAobmV3X3ZiKSB7CisJCQltZW1jcHkocmRkLT52YiwgJnZiX25leHQsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCQkJbWVtY3B5KGxrc2ItPnNiX2x2YnB0ciwgJnZiX25leHQsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCisJCQlsb2dfZGVidWcoIlMgJXMgUiAlcyB1bmxvY2tfZGxtIHZiIG9sZCAleCAleCAldSBuZXcgJXggJXggJXUiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUsCisJCQkJICBsZTE2X3RvX2NwdSh2Yl9wcmV2LnZlcnNpb24pLAorCQkJCSAgbGUxNl90b19jcHUodmJfcHJldi5mbGFncyksCisJCQkJICBsZTMyX3RvX2NwdSh2Yl9wcmV2LnJfdmVyc2lvbiksCisJCQkJICBsZTE2X3RvX2NwdSh2Yl9uZXh0LnZlcnNpb24pLAorCQkJCSAgbGUxNl90b19jcHUodmJfbmV4dC5mbGFncyksCisJCQkJICBsZTMyX3RvX2NwdSh2Yl9uZXh0LnJfdmVyc2lvbikpOworCQl9IGVsc2UgeworCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgdW5sb2NrX2RsbSB2YiB1bmNoYW5nZWQiLCBscy0+bmFtZSwgci0+bmFtZSk7CisJCX0KKworCQlmbGFncyB8PSBMS0ZfVkFMQkxLOworCX0gZWxzZSB7CisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHVubG9ja19kbG0iLCBscy0+bmFtZSwgci0+bmFtZSk7CisJfQorCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCXJ2ID0gZGxtX2xzX2xvY2tfd2FpdChsbWQtPmRoLCBMS01fTkxNT0RFLCBsa3NiLCBmbGFncywKKwkJCSAgICAgIHItPm5hbWUsIHN0cmxlbihyLT5uYW1lKSwKKwkJCSAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgdW5sb2NrX2RsbSBlcnJvciAlZCIsIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisJfQorCisJcmV0dXJuIHJ2OworfQorCisvKgorICogVGhpcyBsaXN0IGNvdWxkIGJlIHJlYWQgZnJvbSBkbG1fY29udHJvbGQgdmlhIGxpYmRsbWNvbnRyb2wsCisgKiBidXQgaXQncyBzaW1wbGVyIHRvIGdldCBpdCBmcm9tIHN5c2ZzLgorICovCisKKyNkZWZpbmUgRExNX0xPQ0tTUEFDRVNfUEFUSCAiL3N5cy9rZXJuZWwvY29uZmlnL2RsbS9jbHVzdGVyL3NwYWNlcyIKKworLyoKKyAqIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseS4KKyAqIEl0J3Mgbm90IG5pY2UgdG8gdXNlIGFuIGFzcGVjdCBvZiB0aGUgZGxtIGNsdXN0ZXJpbmcKKyAqIGltcGxlbWVudGF0aW9uLCB3aGljaCBjb3VsZCBjaGFuZ2UuICBJdCB3b3VsZCBiZQorICogYmV0dGVyIHRvIGRvIHNvbWV0aGluZyBsaWtlIHVzZSBhIHNwZWNpYWwgbG9jayBpbiB0aGUKKyAqIGxvY2tzcGFjZSB0aGF0IHdhcyBoZWxkIFBSIGJ5IGFsbCBub2RlcywgYW5kIHRoZW4gYW4KKyAqIEVYIHJlcXVlc3Qgb24gaXQgY291bGQgY2hlY2sgaWYgaXQncyBzdGFydGVkIChhbmQKKyAqIHBvc3NpYmx5IGFsc28gbm90aWZ5IG90aGVycyB0byBzdG9wIGl0IGF1dG9tYXRpY2FsbHkpLgorICogT3IsIHBvc3NpYmx5IGFuIGVuaGFuY2VtZW50IHRvIGxpYmRsbSB0aGF0IHdvdWxkIGdpdmUKKyAqIGluZm8gYWJvdXQgbG9ja3NwYWNlIG1lbWJlcnMuCisgKgorICogKFdlIGNvdWxkIGxldCB0aGUgVkcgYmUgcmVtb3ZlZCB3aGlsZSBvdGhlcnMgc3RpbGwKKyAqIGhhdmUgdGhlIGxvY2tzcGFjZSBydW5uaW5nLCB3aGljaCBsYXJnZWx5IHdvcmtzLCBidXQKKyAqIGludHJvZHVjZXMgcHJvYmxlbXMgaWYgYW5vdGhlciBWRyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMKKyAqIHJlY3JlYXRlZCB3aGlsZSBvdGhlcnMgc3RpbGwgaGF2ZSB0aGUgbG9ja3NwYWNlIHJ1bm5pbmcKKyAqIGZvciB0aGUgcHJldmlvdXMgVkcuICBXZSdkIGFsc28gd2FudCBhIHdheSB0byBjbGVhbiB1cAorICogdGhlIHN0YWxlIGxvY2tzcGFjZXMgb24gdGhlIG90aGVycyBldmVudHVhbGx5LikKKyAqLworCitpbnQgbG1faG9zdHNfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgbm90aWZ5KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGNsb3NlZGlyX2Vycl9tc2dbXSA9ICJsbV9ob3N0c19kbG06IGNsb3NlZGlyIGZhaWxlZCI7CisJY2hhciBsc19ub2Rlc19wYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwlESVIgKmxzX2RpcjsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCW1lbXNldChsc19ub2Rlc19wYXRoLCAwLCBzaXplb2YobHNfbm9kZXNfcGF0aCkpOworCXNucHJpbnRmKGxzX25vZGVzX3BhdGgsIFBBVEhfTUFYLTEsICIlcy8lcy9ub2RlcyIsCisJCSBETE1fTE9DS1NQQUNFU19QQVRILCBscy0+bmFtZSk7CisKKwlpZiAoIShsc19kaXIgPSBvcGVuZGlyKGxzX25vZGVzX3BhdGgpKSkKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihsc19kaXIpKSkgeworCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoY2xvc2VkaXIobHNfZGlyKSkKKwkJbG9nX2Vycm9yKGNsb3NlZGlyX2Vycl9tc2cpOworCisJaWYgKCFjb3VudCkgeworCQlsb2dfZXJyb3IoImxtX2hvc3RzX2RsbSBmb3VuZCBubyBub2RlcyBpbiAlcyIsIGxzX25vZGVzX3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFzc3VtZSB0aGF0IGEgY291bnQgb2Ygb25lIG5vZGUgcmVwcmVzZW50cyBvdXJzZWxmLAorCSAqIGFuZCBhbnkgdmFsdWUgb3ZlciBvbmUgcmVwcmVzZW50cyBvdGhlciBub2Rlcy4KKwkgKi8KKworCXJldHVybiBjb3VudCAtIDE7Cit9CisKK2ludCBsbV9nZXRfbG9ja3NwYWNlc19kbG0oc3RydWN0IGxpc3RfaGVhZCAqbHNfcmVqb2luKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGNsb3NlZGlyX2Vycl9tc2dbXSA9ICJsbV9nZXRfbG9ja3NwYWNlX2RsbTogY2xvc2VkaXIgZmFpbGVkIjsKKwlzdHJ1Y3QgbG9ja3NwYWNlICpsczsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwlESVIgKmxzX2RpcjsKKworCWlmICghKGxzX2RpciA9IG9wZW5kaXIoRExNX0xPQ0tTUEFDRVNfUEFUSCkpKQorCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKworCXdoaWxlICgoZGUgPSByZWFkZGlyKGxzX2RpcikpKSB7CisJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJuY21wKGRlLT5kX25hbWUsIExWTV9MU19QUkVGSVgsIHN0cmxlbihMVk1fTFNfUFJFRklYKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIShscyA9IGFsbG9jX2xvY2tzcGFjZSgpKSkgeworCQkJaWYgKGNsb3NlZGlyKGxzX2RpcikpCisJCQkJbG9nX2Vycm9yKGNsb3NlZGlyX2Vycl9tc2cpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlscy0+bG1fdHlwZSA9IExEX0xNX0RMTTsKKwkJc3RybmNweShscy0+bmFtZSwgZGUtPmRfbmFtZSwgTUFYX05BTUUpOworCQlzdHJuY3B5KGxzLT52Z19uYW1lLCBscy0+bmFtZSArIHN0cmxlbihMVk1fTFNfUFJFRklYKSwgTUFYX05BTUUpOworCQlsaXN0X2FkZF90YWlsKCZscy0+bGlzdCwgbHNfcmVqb2luKTsKKwl9CisKKwlpZiAoY2xvc2VkaXIobHNfZGlyKSkKKwkJbG9nX2Vycm9yKGNsb3NlZGlyX2Vycl9tc2cpOworCXJldHVybiAwOworfQorCitpbnQgbG1faXNfcnVubmluZ19kbG0odm9pZCkKK3sKKwljaGFyIHN5c19jbHVzdGVybmFtZVtNQVhfQVJHUysxXTsKKwlpbnQgcnY7CisKKwlpZiAoZGFlbW9uX3Rlc3QpCisJCXJldHVybiBnbF91c2VfZGxtOworCisJbWVtc2V0KHN5c19jbHVzdGVybmFtZSwgMCwgc2l6ZW9mKHN5c19jbHVzdGVybmFtZSkpOworCisJcnYgPSByZWFkX2NsdXN0ZXJfbmFtZShzeXNfY2x1c3Rlcm5hbWUpOworCWlmIChydiA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWludGVybmFsLmggYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyODBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2QtaW50ZXJuYWwuaApAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKi8KKworI2lmbmRlZiBfTFZNX0xWTUxPQ0tEX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0xWTV9MVk1MT0NLRF9JTlRFUk5BTF9ICisKKyNkZWZpbmUgTUFYX05BTUUgNjQKKyNkZWZpbmUgTUFYX0FSR1MgNjQKKworI2RlZmluZSBSX05BTUVfR0xfRElTQUJMRUQgIl9HTExLX2Rpc2FibGVkIgorI2RlZmluZSBSX05BTUVfR0wgICAgICAgICAgIkdMTEsiCisjZGVmaW5lIFJfTkFNRV9WRyAgICAgICAgICAiVkdMSyIKKyNkZWZpbmUgU19OQU1FX0dMX0RMTSAgICAgICJsdm1fZ2xvYmFsIgorI2RlZmluZSBMVk1fTFNfUFJFRklYICAgICAgImx2bV8iICAgICAgICAgICAvKiBscyBuYW1lIGlzIHByZWZpeCArIHZnX25hbWUgKi8KKy8qIGdsb2JhbCBsb2Nrc3BhY2UgbmFtZSBmb3Igc2FubG9jayBpcyBhIHZnIG5hbWUgKi8KKworLyogbG9jayBtYW5hZ2VyIHR5cGVzICovCitlbnVtIHsKKwlMRF9MTV9OT05FID0gMCwKKwlMRF9MTV9VTlVTRUQgPSAxLCAvKiBwbGFjZSBob2xkZXIgc28gdmFsdWVzIG1hdGNoIGxpYi9sb2NraW5nL2x2bWxvY2tkLmggKi8KKwlMRF9MTV9ETE0gPSAyLAorCUxEX0xNX1NBTkxPQ0sgPSAzLAorfTsKKworLyogb3BlcmF0aW9uIHR5cGVzICovCitlbnVtIHsKKwlMRF9PUF9IRUxMTyA9IDEsCisJTERfT1BfUVVJVCwKKwlMRF9PUF9JTklULAorCUxEX09QX0ZSRUUsCisJTERfT1BfU1RBUlQsCisJTERfT1BfU1RPUCwKKwlMRF9PUF9MT0NLLAorCUxEX09QX1VQREFURSwKKwlMRF9PUF9DTE9TRSwKKwlMRF9PUF9FTkFCTEUsCisJTERfT1BfRElTQUJMRSwKKwlMRF9PUF9TVEFSVF9XQUlULAorCUxEX09QX1NUT1BfQUxMLAorCUxEX09QX0RVTVBfSU5GTywKKwlMRF9PUF9EVU1QX0xPRywKKwlMRF9PUF9SRU5BTUVfQkVGT1JFLAorCUxEX09QX1JFTkFNRV9GSU5BTCwKKwlMRF9PUF9SVU5OSU5HX0xNLAorCUxEX09QX0ZJTkRfRlJFRV9MT0NLLAorCUxEX09QX0tJTExfVkcsCisJTERfT1BfRFJPUF9WRywKKwlMRF9PUF9CVVNZLAorfTsKKworLyogcmVzb3VyY2UgdHlwZXMgKi8KK2VudW0geworCUxEX1JUX0dMID0gMSwKKwlMRF9SVF9WRywKKwlMRF9SVF9MViwKK307CisKKy8qIGxvY2sgbW9kZXMsIG1vcmUgcmVzdHJpY3RpdmUgbXVzdCBiZSBsYXJnZXIgdmFsdWUgKi8KK2VudW0geworCUxEX0xLX0lWID0gLTEsCisJTERfTEtfVU4gPSAwLAorCUxEX0xLX05MID0gMSwKKwlMRF9MS19TSCA9IDIsCisJTERfTEtfRVggPSAzLAorfTsKKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCitzdHJ1Y3QgY2xpZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJcHRocmVhZF9tdXRleF90IG11dGV4OworCWludCBwaWQ7CisJaW50IGZkOworCWludCBwaTsKKwl1aW50MzJfdCBpZDsKKwl1bnNpZ25lZCBpbnQgcmVjdiA6IDE7CisJdW5zaWduZWQgaW50IGRlYWQgOiAxOworCXVuc2lnbmVkIGludCBwb2xsX2lnbm9yZSA6IDE7CisJdW5zaWduZWQgaW50IGxvY2tfb3BzIDogMTsKKwljaGFyIG5hbWVbTUFYX05BTUUrMV07Cit9OworCisjZGVmaW5lIExEX0FGX1BFUlNJU1RFTlQgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTERfQUZfTk9fQ0xJRU5UICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBMRF9BRl9VTkxPQ0tfQ0FOQ0VMICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIExEX0FGX05FWFRfVkVSU0lPTiAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTERfQUZfV0FJVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBMRF9BRl9GT1JDRSAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIExEX0FGX0VYX0RJU0FCTEUgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTERfQUZfRU5BQkxFICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBMRF9BRl9ESVNBQkxFICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIExEX0FGX1NFQVJDSF9MUyAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTERfQUZfV0FJVF9TVEFSVElORyAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBMRF9BRl9EVVBfR0xfTFMgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIExEX0FGX0FET1BUICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTERfQUZfV0FSTl9HTF9SRU1PVkVECSAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgTERfQUZfTFZfTE9DSyAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBMRF9BRl9MVl9VTkxPQ0sgICAgICAgICAgICAweDAwMDgwMDAwCisKKy8qCisgKiBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IGEgbG9jayByZXF1ZXN0IGFmdGVyCisgKiBhIGxvY2sgY29uZmxpY3QgKC1FQUdBSU4pIGlmIHVuc3BlY2lmaWVkIGluIHRoZQorICogcmVxdWVzdC4KKyAqLworI2RlZmluZSBERUZBVUxUX01BWF9SRVRSSUVTIDQKKworc3RydWN0IGFjdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVpbnQzMl90IGNsaWVudF9pZDsKKwl1aW50MzJfdCBmbGFnczsJCQkvKiBMRF9BRl8gKi8KKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQ2NF90IGhvc3RfaWQ7CisJaW50OF90IG9wOwkJCS8qIG9wZXJhdGlvbiB0eXBlIExEX09QXyAqLworCWludDhfdCBydDsJCQkvKiByZXNvdXJjZSB0eXBlIExEX1JUXyAqLworCWludDhfdCBtb2RlOwkJCS8qIGxvY2sgbW9kZSBMRF9MS18gKi8KKwlpbnQ4X3QgbG1fdHlwZTsJCQkvKiBsb2NrIG1hbmFnZXI6IExNX0RMTSwgTE1fU0FOTE9DSyAqLworCWludCByZXRyaWVzOworCWludCBtYXhfcmV0cmllczsKKwlpbnQgcmVzdWx0OworCWludCBsbV9ydjsJCQkvKiByZXR1cm4gdmFsdWUgZnJvbSBsbV8gZnVuY3Rpb24gKi8KKwljaGFyIHZnX3V1aWRbNjRdOworCWNoYXIgdmdfbmFtZVtNQVhfTkFNRSsxXTsKKwljaGFyIGx2X25hbWVbTUFYX05BTUUrMV07CisJY2hhciBsdl91dWlkW01BWF9OQU1FKzFdOworCWNoYXIgdmdfYXJnc1tNQVhfQVJHUysxXTsKKwljaGFyIGx2X2FyZ3NbTUFYX0FSR1MrMV07CisJY2hhciB2Z19zeXNpZFtNQVhfTkFNRSsxXTsKK307CisKK3N0cnVjdCByZXNvdXJjZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbG9ja3NwYWNlLnJlc291cmNlcyAqLworCWNoYXIgbmFtZVtNQVhfTkFNRSsxXTsJCS8qIHZnIG5hbWUgb3IgbHYgbmFtZSAqLworCWludDhfdCB0eXBlOwkJCS8qIHJlc291cmNlIHR5cGUgTERfUlRfICovCisJaW50OF90IG1vZGU7CisJdW5zaWduZWQgaW50IHNoX2NvdW50OwkJLyogbnVtYmVyIG9mIHNoIGxvY2tzIG9uIGxvY2tzIGxpc3QgKi8KKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IGxhc3RfY2xpZW50X2lkOwkvKiBsYXN0IGNsaWVudF9pZCB0byBsb2NrIG9yIHVubG9jayByZXNvdXJjZSAqLworCXVuc2lnbmVkIGludCBsbV9pbml0IDogMTsJLyogbG1fZGF0YSBpcyBpbml0aWFsaXplZCAqLworCXVuc2lnbmVkIGludCBhZG9wdCA6IDE7CQkvKiB0ZW1wIGZsYWcgaW4gcmVtb3ZlX2luYWN0aXZlX2x2cyAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uX3plcm9fdmFsaWQgOiAxOworCXVuc2lnbmVkIGludCB1c2VfdmIgOiAxOworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja3M7CisJc3RydWN0IGxpc3RfaGVhZCBhY3Rpb25zOworCWNoYXIgbHZfYXJnc1tNQVhfQVJHUysxXTsKKwljaGFyIGxtX2RhdGFbMF07CQkvKiBsb2NrIG1hbmFnZXIgc3BlY2lmaWMgZGF0YSAqLworfTsKKworI2RlZmluZSBMRF9MRl9QRVJTSVNURU5UIDB4MDAwMDAwMDEKKworc3RydWN0IGxvY2sgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIHJlc291cmNlLmxvY2tzICovCisJaW50OF90IG1vZGU7CQkJLyogbG9jayBtb2RlIExEX0xLXyAqLworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgZmxhZ3M7CQkJLyogTERfTEZfICovCisJdWludDMyX3QgY2xpZW50X2lkOyAvKiBtYXkgYmUgMCBmb3IgcGVyc2lzdGVudCBvciBpbnRlcm5hbCBsb2NrcyAqLworfTsKKworc3RydWN0IGxvY2tzcGFjZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbG9ja3NwYWNlcyAqLworCWNoYXIgbmFtZVtNQVhfTkFNRSsxXTsKKwljaGFyIHZnX25hbWVbTUFYX05BTUUrMV07CisJY2hhciB2Z191dWlkWzY0XTsKKwljaGFyIHZnX2FyZ3NbTUFYX0FSR1MrMV07CS8qIGxvY2sgbWFuYWdlciBzcGVjaWZpYyBhcmdzICovCisJY2hhciB2Z19zeXNpZFtNQVhfTkFNRSsxXTsKKwlpbnQ4X3QgbG1fdHlwZTsJCQkvKiBsb2NrIG1hbmFnZXI6IExNX0RMTSwgTE1fU0FOTE9DSyAqLworCXZvaWQgKmxtX2RhdGE7CisJdWludDY0X3QgaG9zdF9pZDsKKwl1aW50NjRfdCBmcmVlX2xvY2tfb2Zmc2V0OwkvKiBzdGFydCBzZWFyY2ggZm9yIGZyZWUgbG9jayBoZXJlICovCisKKwl1aW50MzJfdCBzdGFydF9jbGllbnRfaWQ7CS8qIGNsaWVudF9pZCB0aGF0IHN0YXJ0ZWQgdGhlIGxvY2tzcGFjZSAqLworCXB0aHJlYWRfdCB0aHJlYWQ7CQkvKiBtYWtlcyBzeW5jaHJvbm91cyBsb2NrIHJlcXVlc3RzICovCisJcHRocmVhZF9jb25kX3QgY29uZDsKKwlwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisJdW5zaWduZWQgaW50IGNyZWF0ZV9mYWlsIDogMTsKKwl1bnNpZ25lZCBpbnQgY3JlYXRlX2RvbmUgOiAxOworCXVuc2lnbmVkIGludCB0aHJlYWRfd29yayA6IDE7CisJdW5zaWduZWQgaW50IHRocmVhZF9zdG9wIDogMTsKKwl1bnNpZ25lZCBpbnQgdGhyZWFkX2RvbmUgOiAxOworCXVuc2lnbmVkIGludCBzYW5sb2NrX2dsX2VuYWJsZWQ6IDE7CisJdW5zaWduZWQgaW50IHNhbmxvY2tfZ2xfZHVwOiAxOworCXVuc2lnbmVkIGludCBmcmVlX3ZnOiAxOworCXVuc2lnbmVkIGludCBraWxsX3ZnOiAxOworCXVuc2lnbmVkIGludCBkcm9wX3ZnOiAxOworCisJc3RydWN0IGxpc3RfaGVhZCBhY3Rpb25zOwkvKiBuZXcgY2xpZW50IGFjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc291cmNlczsJLyogcmVzb3VyY2UvbG9jayBzdGF0ZSBmb3IgZ2wvdmcvbHYgKi8KK307CisKKy8qIHZhbF9ibGsgdmVyc2lvbiAqLworI2RlZmluZSBWQUxfQkxLX1ZFUlNJT04gMHgwMTAxCisKKy8qIHZhbF9ibGsgZmxhZ3MgKi8KKyNkZWZpbmUgVkJGX1JFTU9WRUQgMHgwMDAxCisKK3N0cnVjdCB2YWxfYmxrIHsKKwl1aW50MTZfdCB2ZXJzaW9uOworCXVpbnQxNl90IGZsYWdzOworCXVpbnQzMl90IHJfdmVyc2lvbjsKK307CisKKy8qIGxtX3VubG9jayBmbGFncyAqLworI2RlZmluZSBMTVVGX0ZSRUVfVkcgMHgwMDAwMDAwMQorCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBJTklUX0xJU1RfSEVBRChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCWxpc3QtPm5leHQgPSBsaXN0OworCWxpc3QtPnByZXYgPSBsaXN0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+bmV4dCA9IG5leHQ7CisJbmV3LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eShjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5uZXh0ID09IGhlYWQ7Cit9CisKKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJbGlzdF9lbnRyeSgocHRyKS0+bmV4dCwgdHlwZSwgbWVtYmVyKQorCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOyAgICAgIFwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7ICAgIFwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sIGhlYWQsIG1lbWJlcikgICAgICAgICAgICAgICAgICBcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLCAgICAgIFwKKwkgICAgIG4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsgXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworCisvKiB0byBpbXByb3ZlIHJlYWRhYmlsaXR5ICovCisjZGVmaW5lIFdBSVQgICAgIDEKKyNkZWZpbmUgTk9fV0FJVCAgMAorI2RlZmluZSBGT1JDRSAgICAxCisjZGVmaW5lIE5PX0ZPUkNFIDAKKworLyoKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisjaWZuZGVmIEVYVEVSTgorI2RlZmluZSBFWFRFUk4gZXh0ZXJuCisjZGVmaW5lIElOSVQoWCkKKyNlbHNlCisjdW5kZWYgRVhURVJOCisjZGVmaW5lIEVYVEVSTgorI2RlZmluZSBJTklUKFgpID1YCisjZW5kaWYKKworLyoKKyAqIGdsX3R5cGVfc3RhdGljIGFuZCBnbF91c2VfIGFyZSBzZXQgYnkgY29tbWFuZCBsaW5lIG9yIGNvbmZpZyBmaWxlCisgKiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGdsb2JhbCBsb2NrIGNvbWVzIGZyb20gZGxtIG9yIHNhbmxvY2suCisgKiBXaXRob3V0IGEgc3RhdGljIHNldHRpbmcsIGx2bWxvY2tkIHdpbGwgZmlndXJlIG91dCB3aGVyZSB0aGUKKyAqIGdsb2JhbCBsb2NrIHNob3VsZCBiZSAoYnV0IGl0IGNvdWxkIGdldCBtaXhlZCB1cCBpbiBjYXNlcyB3aGVyZQorICogYm90aCBzYW5sb2NrIGFuZCBkbG0gdmdzIGV4aXN0LikKKyAqCisgKiBnbF91c2VfZGxtIG1lYW5zIHRoYXQgdGhlIGdsIHNob3VsZCBjb21lIGZyb20gbG9ja3NwYWNlIGdsX2xzbmFtZV9kbG0KKyAqIGdsX3VzZV9zYW5sb2NrIG1lYW5zIHRoYXQgdGhlIGdsIHNob3VsZCBjb21lIGZyb20gbG9ja3NwYWNlIGdsX2xzbmFtZV9zYW5sb2NrCisgKgorICogZ2xfdXNlX2RsbSBoYXMgcHJlY2VkZW5jZSBvdmVyIGdsX3VzZV9zYW5sb2NrLCBzbyBpZiBhIG5vZGUgc2VlcyBib3RoCisgKiBkbG0gYW5kIHNhbmxvY2sgdmdzLCBpdCB3aWxsIHVzZSB0aGUgZGxtIGdsLgorICoKKyAqIGdsX3VzZV8gaXMgc2V0IHdoZW4gdGhlIGZpcnN0IGV2aWRlbmNlIG9mIHRoYXQgbG1fdHlwZSBpcyBzZWVuCisgKiBpbiBhbnkgY29tbWFuZC4KKyAqCisgKiBnbF9sc25hbWVfc2FubG9jayBpcyBzZXQgd2hlbiB0aGUgZmlyc3QgdmcgaXMgc2VlbiBpbiB3aGljaCBhbgorICogZW5hYmxlZCBnbCBpcyBleGlzdHMsIG9yIHdoZW4gaW5pdF92ZyBjcmVhdGVzIGEgdmcgd2l0aCBnbCBlbmFibGVkLAorICogb3Igd2hlbiBlbmFibGVfZ2wgaXMgdXNlZC4KKyAqCisgKiBnbF9sc25hbWVfc2FubG9jayBpcyBjbGVhcmVkIHdoZW4gZnJlZV92ZyBkZWxldGVzIGEgdmcgd2l0aCBnbCBlbmFibGVkCisgKiBvciB3aGVuIGRpc2FibGVfZ2wgbWF0Y2hlcy4KKyAqLworCitFWFRFUk4gaW50IGdsX3R5cGVfc3RhdGljOworRVhURVJOIGludCBnbF91c2VfZGxtOworRVhURVJOIGludCBnbF91c2Vfc2FubG9jazsKK0VYVEVSTiBpbnQgZ2xfdmdfcmVtb3ZlZDsKK0VYVEVSTiBjaGFyIGdsX2xzbmFtZV9kbG1bTUFYX05BTUUrMV07CitFWFRFUk4gY2hhciBnbF9sc25hbWVfc2FubG9ja1tNQVhfTkFNRSsxXTsKK0VYVEVSTiBpbnQgZ2xvYmFsX2RsbV9sb2Nrc3BhY2VfZXhpc3RzOworCitFWFRFUk4gaW50IGRhZW1vbl90ZXN0OyAvKiBydW4gYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0IGEgbGl2ZSBsb2NrIG1hbmFnZXIgKi8KK0VYVEVSTiBpbnQgZGFlbW9uX2RlYnVnOworRVhURVJOIGludCBkYWVtb25faG9zdF9pZDsKK0VYVEVSTiBjb25zdCBjaGFyICpkYWVtb25faG9zdF9pZF9maWxlOworRVhURVJOIGludCBzYW5sb2NrX2lvX3RpbWVvdXQ7CisKKy8qCisgKiBUaGlzIGZsYWcgaXMgc2V0IHRvIDEgaWYgd2Ugc2VlIG11bHRpcGxlIHZncyB3aXRoIHRoZSBnbG9iYWwKKyAqIGxvY2sgZW5hYmxlZC4gIFdoaWxlIHRoaXMgaXMgc2V0LCB3ZSByZXR1cm4gYSBzcGVjaWFsIGZsYWcKKyAqIHdpdGggdGhlIHZnIGxvY2sgcmVzdWx0IGluZGljYXRpbmcgdG8gdGhlIGx2bSBjb21tYW5kIHRoYXQKKyAqIHRoZXJlIGlzIGEgZHVwbGljYXRlIGdsIGluIHRoZSB2ZyB3aGljaCBzaG91bGQgYmUgcmVzb2x2ZWQuCisgKiBXaGlsZSB0aGlzIGlzIHNldCwgZmluZF9sb2Nrc3BhY2VfbmFtZSBoYXMgdGhlIHNpZGUgam9iIG9mCisgKiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGxvY2tzcGFjZXMgd2l0aCBlbmFibGVkIGdsJ3Mgc28gdGhhdAorICogdGhpcyBjYW4gYmUgc2V0IGJhY2sgdG8gemVybyB3aGVuIHRoZSBkdXBsaWNhdGVzIGFyZSBkaXNhYmxlZC4KKyAqLworRVhURVJOIGludCBzYW5sb2NrX2dsX2R1cDsKKwordm9pZCBsb2dfbGV2ZWwoaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLikgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisjZGVmaW5lIGxvZ19kZWJ1ZyhmbXQsIGFyZ3MuLi4pIGxvZ19sZXZlbChMT0dfREVCVUcsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBsb2dfZXJyb3IoZm10LCBhcmdzLi4uKSBsb2dfbGV2ZWwoTE9HX0VSUiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGxvZ193YXJuKGZtdCwgYXJncy4uLikgbG9nX2xldmVsKExPR19XQVJOSU5HLCBmbXQsICMjYXJncykKKworc3RydWN0IGxvY2tzcGFjZSAqYWxsb2NfbG9ja3NwYWNlKHZvaWQpOworaW50IGxvY2tzcGFjZXNfZW1wdHkodm9pZCk7CitpbnQgbGFzdF9zdHJpbmdfZnJvbV9hcmdzKGNoYXIgKmFyZ3NfaW4sIGNoYXIgKmxhc3QpOworaW50IHZlcnNpb25fZnJvbV9hcmdzKGNoYXIgKmFyZ3MsIHVuc2lnbmVkIGludCAqbWFqb3IsIHVuc2lnbmVkIGludCAqbWlub3IsIHVuc2lnbmVkIGludCAqcGF0Y2gpOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm1vZGVfc3RyKGludCB4KQoreworCXN3aXRjaCAoeCkgeworCWNhc2UgTERfTEtfSVY6CisJCXJldHVybiAiaXYiOworCWNhc2UgTERfTEtfVU46CisJCXJldHVybiAidW4iOworCWNhc2UgTERfTEtfTkw6CisJCXJldHVybiAibmwiOworCWNhc2UgTERfTEtfU0g6CisJCXJldHVybiAic2giOworCWNhc2UgTERfTEtfRVg6CisJCXJldHVybiAiZXgiOworCWRlZmF1bHQ6CisJCXJldHVybiAiLiI7CisJfTsKK30KKworI2lmZGVmIExPQ0tERExNX1NVUFBPUlQKKworaW50IGxtX2luaXRfdmdfZGxtKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIHVpbnQzMl90IGZsYWdzLCBjaGFyICp2Z19hcmdzKTsKK2ludCBsbV9wcmVwYXJlX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMpOworaW50IGxtX2FkZF9sb2Nrc3BhY2VfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgYWRvcHQpOworaW50IGxtX3JlbV9sb2Nrc3BhY2VfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgZnJlZV92Zyk7CitpbnQgbG1fbG9ja19kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IGxkX21vZGUsCisJCXN0cnVjdCB2YWxfYmxrICp2Yl9vdXQsIGludCBhZG9wdCk7CitpbnQgbG1fY29udmVydF9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICAgaW50IGxkX21vZGUsIHVpbnQzMl90IHJfdmVyc2lvbik7CitpbnQgbG1fdW5sb2NrX2RsbShzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyLAorCQkgIHVpbnQzMl90IHJfdmVyc2lvbiwgdWludDMyX3QgbG11X2ZsYWdzKTsKK2ludCBsbV9yZW1fcmVzb3VyY2VfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworaW50IGxtX2dldF9sb2Nrc3BhY2VzX2RsbShzdHJ1Y3QgbGlzdF9oZWFkICpsc19yZWpvaW4pOworaW50IGxtX2RhdGFfc2l6ZV9kbG0odm9pZCk7CitpbnQgbG1faXNfcnVubmluZ19kbG0odm9pZCk7CitpbnQgbG1faG9zdHNfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgbm90aWZ5KTsKKworc3RhdGljIGlubGluZSBpbnQgbG1fc3VwcG9ydF9kbG0odm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgbG1faW5pdF92Z19kbG0oY2hhciAqbHNfbmFtZSwgY2hhciAqdmdfbmFtZSwgdWludDMyX3QgZmxhZ3MsIGNoYXIgKnZnX2FyZ3MpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9wcmVwYXJlX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9hZGRfbG9ja3NwYWNlX2RsbShzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IGFkb3B0KQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fcmVtX2xvY2tzcGFjZV9kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBmcmVlX3ZnKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fbG9ja19kbG0oc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IGxkX21vZGUsCisJCXN0cnVjdCB2YWxfYmxrICp2Yl9vdXQsIGludCBhZG9wdCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2NvbnZlcnRfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgIGludCBsZF9tb2RlLCB1aW50MzJfdCByX3ZlcnNpb24pCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV91bmxvY2tfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgdWludDMyX3Qgcl92ZXJzaW9uLCB1aW50MzJfdCBsbXVfZmxhZ3MpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9yZW1fcmVzb3VyY2VfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9nZXRfbG9ja3NwYWNlc19kbG0oc3RydWN0IGxpc3RfaGVhZCAqbHNfcmVqb2luKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fZGF0YV9zaXplX2RsbSh2b2lkKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1faXNfcnVubmluZ19kbG0odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fc3VwcG9ydF9kbG0odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1faG9zdHNfZGxtKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgbm90aWZ5KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGxtIHN1cHBvcnQgKi8KKworI2lmZGVmIExPQ0tEU0FOTE9DS19TVVBQT1JUCisKK2ludCBsbV9pbml0X3ZnX3NhbmxvY2soY2hhciAqbHNfbmFtZSwgY2hhciAqdmdfbmFtZSwgdWludDMyX3QgZmxhZ3MsIGNoYXIgKnZnX2FyZ3MpOworaW50IGxtX2luaXRfbHZfc2FubG9jayhjaGFyICpsc19uYW1lLCBjaGFyICp2Z19uYW1lLCBjaGFyICpsdl9uYW1lLCBjaGFyICp2Z19hcmdzLCBjaGFyICpsdl9hcmdzLCB1aW50NjRfdCBmcmVlX29mZnNldCk7CitpbnQgbG1fZnJlZV9sdl9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworaW50IGxtX3JlbmFtZV92Z19zYW5sb2NrKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIHVpbnQzMl90IGZsYWdzLCBjaGFyICp2Z19hcmdzKTsKK2ludCBsbV9wcmVwYXJlX2xvY2tzcGFjZV9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzKTsKK2ludCBsbV9hZGRfbG9ja3NwYWNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBhZG9wdCk7CitpbnQgbG1fcmVtX2xvY2tzcGFjZV9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgZnJlZV92Zyk7CitpbnQgbG1fbG9ja19zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsIGludCBsZF9tb2RlLAorCQkgICAgc3RydWN0IHZhbF9ibGsgKnZiX291dCwgaW50ICpyZXRyeSwgaW50IGFkb3B0KTsKK2ludCBsbV9jb252ZXJ0X3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICAgICAgIGludCBsZF9tb2RlLCB1aW50MzJfdCByX3ZlcnNpb24pOworaW50IGxtX3VubG9ja19zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgICAgIHVpbnQzMl90IHJfdmVyc2lvbiwgdWludDMyX3QgbG11X2ZsYWdzKTsKK2ludCBsbV9hYmxlX2dsX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBlbmFibGUpOworaW50IGxtX2V4X2Rpc2FibGVfZ2xfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscyk7CitpbnQgbG1faG9zdHNfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IG5vdGlmeSk7CitpbnQgbG1fcmVtX3Jlc291cmNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqcik7CitpbnQgbG1fZ2xfaXNfZW5hYmxlZChzdHJ1Y3QgbG9ja3NwYWNlICpscyk7CitpbnQgbG1fZ2V0X2xvY2tzcGFjZXNfc2FubG9jayhzdHJ1Y3QgbGlzdF9oZWFkICpsc19yZWpvaW4pOworaW50IGxtX2RhdGFfc2l6ZV9zYW5sb2NrKHZvaWQpOworaW50IGxtX2lzX3J1bm5pbmdfc2FubG9jayh2b2lkKTsKK2ludCBsbV9maW5kX2ZyZWVfbG9ja19zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCB1aW50NjRfdCAqZnJlZV9vZmZzZXQpOworCitzdGF0aWMgaW5saW5lIGludCBsbV9zdXBwb3J0X3NhbmxvY2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgbG1faW5pdF92Z19zYW5sb2NrKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIHVpbnQzMl90IGZsYWdzLCBjaGFyICp2Z19hcmdzKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1faW5pdF9sdl9zYW5sb2NrKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIGNoYXIgKmx2X25hbWUsIGNoYXIgKnZnX2FyZ3MsIGNoYXIgKmx2X2FyZ3MsIHVpbnQ2NF90IGZyZWVfb2Zmc2V0KQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fZnJlZV9sdl9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9yZW5hbWVfdmdfc2FubG9jayhjaGFyICpsc19uYW1lLCBjaGFyICp2Z19uYW1lLCB1aW50MzJfdCBmbGFncywgY2hhciAqdmdfYXJncykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX3ByZXBhcmVfbG9ja3NwYWNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9hZGRfbG9ja3NwYWNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBhZG9wdCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX3JlbV9sb2Nrc3BhY2Vfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IGZyZWVfdmcpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9sb2NrX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IGxkX21vZGUsCisJCSAgICBzdHJ1Y3QgdmFsX2JsayAqdmJfb3V0LCBpbnQgKnJldHJ5LCBpbnQgYWRvcHQpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9jb252ZXJ0X3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICAgICAgIGludCBsZF9tb2RlLCB1aW50MzJfdCByX3ZlcnNpb24pCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV91bmxvY2tfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyLAorCQkgICAgICB1aW50MzJfdCByX3ZlcnNpb24sIHVpbnQzMl90IGxtdV9mbGFncykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2FibGVfZ2xfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2V4X2Rpc2FibGVfZ2xfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2hvc3RzX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIGludCBub3RpZnkpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9yZW1fcmVzb3VyY2Vfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fZ2xfaXNfZW5hYmxlZChzdHJ1Y3QgbG9ja3NwYWNlICpscykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2dldF9sb2Nrc3BhY2VzX3NhbmxvY2soc3RydWN0IGxpc3RfaGVhZCAqbHNfcmVqb2luKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG1fZGF0YV9zaXplX3NhbmxvY2sodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtX2lzX3J1bm5pbmdfc2FubG9jayh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9maW5kX2ZyZWVfbG9ja19zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCB1aW50NjRfdCAqZnJlZV9vZmZzZXQpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbV9zdXBwb3J0X3NhbmxvY2sodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIHNhbmxvY2sgc3VwcG9ydCAqLworCisjZW5kaWYJLyogX0xWTV9MVk1MT0NLRF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLXNhbmxvY2suYyBiL2RhZW1vbnMvbHZtbG9ja2QvbHZtbG9ja2Qtc2FubG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDRjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bWxvY2tkL2x2bWxvY2tkLXNhbmxvY2suYwpAQCAtMCwwICsxLDE4NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA1MDAgIC8qIHB0aHJlYWQgKi8KKyNkZWZpbmUgX0lTT0M5OV9TT1VSQ0UKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1zZXJ2ZXIuaCIKKyNpbmNsdWRlICJ4bGF0ZS5oIgorCisjaW5jbHVkZSAibHZtbG9ja2QtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC1jbGllbnQuaCIKKworI2luY2x1ZGUgInNhbmxvY2suaCIKKyNpbmNsdWRlICJzYW5sb2NrX3J2LmgiCisjaW5jbHVkZSAic2FubG9ja19hZG1pbi5oIgorI2luY2x1ZGUgInNhbmxvY2tfcmVzb3VyY2UuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIGVhY2ggVkcsIGx2bWxvY2tkIGNyZWF0ZXMgYSBzYW5sb2NrIGxvY2tzcGFjZSB0aGF0IGhvbGRzIHRoZSBsZWFzZXMgZm9yCit0aGF0IFZHLiAgVGhlcmUncyBhIGxlYXNlIGZvciB0aGUgVkcgbG9jaywgYW5kIHRoZXJlJ3MgYSBsZWFzZSBmb3IgZWFjaCBhY3RpdmUKK0xWLiAgc2FubG9jayBtYWludGFpbnMgKHJlYWRzL3dyaXRlcykgdGhlc2UgbGVhc2VzLCB3aGljaCBleGlzdCBvbiBzdG9yYWdlLgorVGhhdCBzdG9yYWdlIGlzIGEgaGlkZGVuIExWIHdpdGhpbiB0aGUgVkc6IC9kZXYvdmcvbHZtbG9jay4gIGx2bWxvY2tkIGdpdmVzIHRoZQorcGF0aCBvZiB0aGlzIGludGVybmFsIExWIHRvIHNhbmxvY2ssIHdoaWNoIHRoZW4gcmVhZHMvd3JpdGVzIHRoZSBsZWFzZXMgb24gaXQuCisKKyMgbHZzIC1hIGNjIC1vK3V1aWQKKyAgTFYgICAgICAgIFZHICAgQXR0ciAgICAgICBMU2l6ZSAgIExWIFVVSUQKKyAgbHYxICAgICAgIGNjICAgLXdpLWEtLS0tLSAgIDIuMDBnIDd4b0R0dS15dk5NLWl3UXgtQzk0dC1CYllzLVV6QmwtbzhoQUlhCisgIGx2MiAgICAgICBjYyAgIC13aS1hLS0tLS0gMTAwLjAwZyBleHhOUFgtd1pkTy11Q055LXlpR2EtYUpHVC1KS1ZsLWFyZmNZVAorICBbbHZtbG9ja10gY2MgICAtd2ktYW8tLS0tIDI1Ni4wMG0gaUxwRGVsLWhSMFQtaEozdS1yblZvLVBjRGgtbWNqdC1zRjllZ00KKworIyBzYW5sb2NrIHN0YXR1cworcyBsdm1fY2M6MTovZGV2L21hcHBlci9jYy1sdm1sb2NrOjAKK3IgbHZtX2NjOmV4eE5QWC13WmRPLXVDTnkteWlHYS1hSkdULUpLVmwtYXJmY1lUOi9kZXYvbWFwcGVyL2NjLWx2bWxvY2s6NzEzMDMxNjg6MTMgcCAyNjA5OQorciBsdm1fY2M6N3hvRHR1LXl2Tk0taXdReC1DOTR0LUJiWXMtVXpCbC1vOGhBSWE6L2Rldi9tYXBwZXIvY2MtbHZtbG9jazo3MDI1NDU5MjozIHAgMjYwOTkKKworVGhpcyBzaG93cyB0aGF0IHNhbmxvY2sgaXMgbWFpbnRhaW5pbmcgbGVhc2VzIG9uIC9kZXYvbWFwcGVyL2NjLWx2bWxvY2suCisKK3NhbmxvY2sgYWNxdWlyZXMgYSBsb2Nrc3BhY2UgbGVhc2Ugd2hlbiB0aGUgbG9ja3NwYWNlIGlzIGpvaW5lZCwgaS5lLiB3aGVuIHRoZQorVkcgaXMgc3RhcnRlZCBieSAndmdjaGFuZ2UgLS1sb2NrLXN0YXJ0IGNjJy4gIFRoaXMgbG9ja3NwYWNlIGxlYXNlIGV4aXN0cyBhdAorL2Rldi9tYXBwZXIvY2MtbHZtbG9jayBvZmZzZXQgMCwgYW5kIHNhbmxvY2sgcmVndWxhcmx5IHdyaXRlcyB0byBpdCB0byBtYWludGFpbgorb3duZXJzaGlwIG9mIGl0LiAgSm9pbmluZyB0aGUgbG9ja3NwYWNlIChieSBhY3F1aXJpbmcgdGhlIGxvY2tzcGFjZSBsZWFzZSBpbgoraXQpIHRoZW4gYWxsb3dzIHN0YW5kYXJkIHJlc291cmNlIGxlYXNlcyB0byBiZSBhY3F1aXJlZCBpbiB0aGUgbG9ja3NwYWNlIGZvcgord2hhdGV2ZXIgdGhlIGFwcGxpY2F0aW9uIHdhbnRzLiAgbHZtbG9ja2QgdXNlcyByZXNvdXJjZSBsZWFzZXMgZm9yIHRoZSBWRyBsb2NrCithbmQgTFYgbG9ja3MuCisKK3NhbmxvY2sgYWNxdWlyZXMgYSByZXNvdXJjZSBsZWFzZSBmb3IgZWFjaCBhY3R1YWwgbG9jayB0aGF0IGx2bSBjb21tYW5kcyB1c2UuCitBYm92ZSwgdGhlcmUgYXJlIHR3byBMViBsb2NrcyB0aGF0IGFyZSBoZWxkIGJlY2F1c2UgdGhlIHR3byBMVnMgYXJlIGFjdGl2ZS4KK1RoZXNlIGFyZSBvbiAvZGV2L21hcHBlci9jYy1sdm1sb2NrIGF0IG9mZnNldHMgNzEzMDMxNjggYW5kIDcwMjU0NTkyLiAgc2FubG9jaworZG9lcyBub3Qgd3JpdGUgdG8gdGhlc2UgcmVzb3VyY2UgbGVhc2VzIGV4Y2VwdCB3aGVuIGFjcXVpcmluZyBhbmQgcmVsZWFzaW5nCit0aGVtIChlLmcuIGx2Y2hhbmdlIC1heS8tYW4pLiAgVGhlIHJlbmV3YWwgb2YgdGhlIGxvY2tzcGFjZSBsZWFzZSBtYWludGFpbnMKK293bmVyc2hpcCBvZiBhbGwgdGhlIHJlc291cmNlIGxlYXNlcyBpbiB0aGUgbG9ja3NwYWNlLgorCitJZiB0aGUgaG9zdCBsb3NlcyBhY2Nlc3MgdG8gdGhlIGRpc2sgdGhhdCB0aGUgc2FubG9jayBsdiBsaXZlcyBvbiwgdGhlbiBzYW5sb2NrCitjYW4gbm8gbG9uZ2VyIHJlbmV3IGl0cyBsb2Nrc3BhY2UgbGVhc2UuICBUaGUgbG9ja3NwYWNlIGxlYXNlIHdpbGwgZXZlbnR1YWxseQorZXhwaXJlLCBhdCB3aGljaCBwb2ludCB0aGUgaG9zdCB3aWxsIGxvc2Ugb3duZXJzaGlwIG9mIGl0LCBhbmQgb2YgYWxsIHJlc291cmNlCitsZWFzZXMgaXQgaG9sZHMgaW4gdGhlIGxvY2tzcGFjZS4gIEV2ZW50dWFsbHksIG90aGVyIGhvc3RzIHdpbGwgYmUgYWJsZSB0bworYWNxdWlyZSB0aG9zZSBsZWFzZXMuICBzYW5sb2NrIGVuc3VyZXMgdGhhdCBhbm90aGVyIGhvc3Qgd2lsbCBub3QgYmUgYWJsZSB0bworYWNxdWlyZSBvbmUgb2YgdGhlIGV4cGlyZWQgbGVhc2VzIHVudGlsIHRoZSBjdXJyZW50IGhvc3QgaGFzIHF1aXQgdXNpbmcgaXQuCisKK0l0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBob3N0ICJxdWl0IHVzaW5nIiB0aGUgbGVhc2VzIGl0IGlzIGhvbGRpbmcgaWYgdGhlCitzYW5sb2NrIHN0b3JhZ2UgaXMgbG9zdCBhbmQgdGhleSBiZWdpbiBleHBpcmluZy4gIElmIHRoZSBob3N0IGNhbm5vdCBxdWl0IHVzaW5nCit0aGUgbGVhc2VzIGFuZCByZWxlYXNlIHRoZW0gd2l0aGluIGEgbGltaXRlZCB0aW1lLCB0aGVuIHNhbmxvY2sgd2lsbCB1c2UgdGhlCitsb2NhbCB3YXRjaGRvZyB0byBmb3JjaWJseSByZXNldCB0aGUgaG9zdCBiZWZvcmUgYW55IG90aGVyIGhvc3QgY2FuIGFjcXVpcmUKK3RoZW0uICBUaGlzIGlzIHNldmVyZSwgYnV0IHByZWZlcmFibGUgdG8gcG9zc2libHkgY29ycnVwdGluZyB0aGUgZGF0YSBwcm90ZWN0ZWQKK2J5IHRoZSBsZWFzZS4gIEl0IGVuc3VyZXMgdGhhdCB0d28gbm9kZXMgd2lsbCBub3QgYmUgdXNpbmcgdGhlIHNhbWUgbGVhc2UgYXQKK29uY2UuICBGb3IgTFYgbGVhc2VzLCB0aGF0IG1lYW5zIHRoYXQgYW5vdGhlciBob3N0IHdpbGwgbm90IGJlIGFibGUgdG8gYWN0aXZhdGUKK3RoZSBMViB3aGlsZSBhbm90aGVyIGhvc3Qgc3RpbGwgaGFzIGl0IGFjdGl2ZS4KKworc2FubG9jayBub3RpZmllcyB0aGUgYXBwbGljYXRpb24gdGhhdCBpdCBjYW5ub3QgcmVuZXcgdGhlIGxvY2tzcGFjZSBsZWFzZS4gIFRoZQorYXBwbGljYXRpb24gbmVlZHMgdG8gcXVpdCB1c2luZyBhbGwgbGVhc2VzIGluIHRoZSBsb2Nrc3BhY2UgYW5kIHJlbGVhc2UgdGhlbSBhcworcXVpY2tseSBhcyBwb3NzaWJsZS4gIEluIHRoZSBpbml0aWFsIHZlcnNpb24sIGx2bWxvY2tkIGlnbm9yZWQgdGhpcworbm90aWZpY2F0aW9uLCBzbyBzYW5sb2NrIHdvdWxkIGV2ZW50dWFsbHkgcmVhY2ggdGhlIHBvaW50IHdoZXJlIGl0IHdvdWxkIHVzZQordGhlIGxvY2FsIHdhdGNoZG9nIHRvIHJlc2V0IHRoZSBob3N0LiAgSG93ZXZlciwgaXQncyBiZXR0ZXIgdG8gYXR0ZW1wdCBhCityZXNwb25zZS4gIElmIHRoYXQgcmVzcG9uc2Ugc3VjY2VlZHMsIHRoZSBob3N0IGNhbiBhdm9pZCBiZWluZyByZXNldC4gIElmIHRoZQorcmVzcG9uc2UgZmFpbHMsIHRoZW4gc2FubG9jayB3aWxsIGV2ZW50dWFsbHkgcmVzZXQgdGhlIGhvc3QgYXMgdGhlIGxhc3QgcmVzb3J0Lgorc2FubG9jayBnaXZlcyB0aGUgYXBwbGljYXRpb24gYWJvdXQgNDAgc2Vjb25kcyB0byBjb21wbGV0ZSBpdHMgcmVzcG9uc2UgYW5kCityZWxlYXNlIGl0cyBsZWFzZXMgYmVmb3JlIHJlc2V0dGluZyB0aGUgaG9zdC4KKworQW4gYXBwbGljYXRpb24gY2FuIHNwZWNpZnkgdGhlIHBhdGggYW5kIGFyZ3Mgb2YgYSBwcm9ncmFtIHRoYXQgc2FubG9jayBzaG91bGQKK3J1biB0byBub3RpZnkgaXQgaWYgdGhlIGxvY2tzcGFjZSBsZWFzZSBjYW5ub3QgYmUgcmVuZXdlZC4gIFRoaXMgcHJvZ3JhbSBzaG91bGQKK2NhcnJ5IG91dCB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zZSB0byB0aGUgZXhwaXJpbmcgbGVhc2VzOiBhdHRlbXB0IHRvIHF1aXQKK3VzaW5nIHRoZSBsZWFzZXMgYW5kIHRoZW4gcmVsZWFzZSB0aGVtLiAgbHZtbG9ja2QgZ2l2ZXMgdGhpcyBjb21tYW5kIHRvIHNhbmxvY2sKK2ZvciBlYWNoIFZHIHdoZW4gdGhhdCBWRyBpcyBzdGFydGVkOiAnbHZtbG9ja2N0bCAtLWtpbGwgdmdfbmFtZScKKworSWYgc2FubG9jayBsb3NlcyBhY2Nlc3MgdG8gbGVhc2Ugc3RvcmFnZSBpbiB0aGF0IFZHLCBpdCBydW5zIGx2bWxvY2tjdGwgLS1raWxsLAord2hpY2g6CisKKzEuIFVzZXMgc3lzbG9nIHRvIGV4cGxhaW4gd2hhdCBpcyBoYXBwZW5pbmcuCisKKzIuIE5vdGlmaWVzIGx2bWxvY2tkIHRoYXQgdGhlIFZHIGlzIGJlaW5nIGtpbGxlZCwgc28gbHZtbG9ja2QgY2FuCisgICBpbW1lZGlhdGxleSByZXR1cm4gYW4gZXJyb3IgZm9yIHRoaXMgY29uZGl0aW9uIGlmIGFueSBuZXcgbG9jaworICAgcmVxdWVzdHMgYXJlIG1hZGUuICAoVGhpcyBzdGVwIHdvdWxkIG5vdCBiZSBzdHJpY3RseSBuZWNlc3NhcnkuKQorCiszLiBBdHRlbXB0cyB0byBxdWl0IHVzaW5nIHRoZSBWRy4gIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCwgYnV0CisgICB3aWxsIGV2ZW50dWFsbHkgdXNlIGJsa2RlYWN0aXZhdGUgb24gdGhlIFZHIChvciBhIG1vcmUgZm9yY2VmdWwKKyAgIGVxdWl2YWxlbnQuKQorCis0LiBJZiBzdGVwIDMgd2FzIHN1Y2Nlc3NmdWwgYXQgdGVybWluYXRpbmcgYWxsIHVzZSBvZiB0aGUgVkcsIHRoZW4KKyAgIGx2bWxvY2tkIGlzIHRvbGQgdG8gcmVsZWFzZSBhbGwgdGhlIGxlYXNlcyBmb3IgdGhlIFZHLiAgSWYgdGhpcworICAgaXMgYWxsIGRvbmUgd2l0aG91dCBhYm91dCA0MCBzZWNvbmRzLCB0aGUgaG9zdCBjYW4gYXZvaWQgYmVpbmcKKyAgIHJlc2V0LgorCitVbnRpbCBzdGVwcyAzIGFuZCA0IGFyZSBmdWxseSBpbXBsZW1lbnRlZCwgbWFudWFsIHN0ZXBzIGNhbiBiZSBzdWJzdGl0dXRlZC4KK1RoaXMgaXMgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIHNpbmNlIHRoZSBwcm9ibGVtIG5lZWRzIHRvIGJlIG5vdGljZWQgYW5kCityZXNwb25kZWQgdG8gaW4gYSB2ZXJ5IHNob3J0IHRpbWUuICBUaGUgbWFudWFsIGFsdGVybmF0aXZlIHRvIHN0ZXAgMyBpcyB0byBraWxsCithbnkgcHJvY2Vzc2VzIHVzaW5nIGZpbGUgc3lzdGVtcyBvbiBMVidzIGluIHRoZSBWRywgdW5tb3VudCBhbGwgZmlsZSBzeXN0ZW1zIG9uCit0aGUgTFZzLCBhbmQgZGVhY3RpdmF0ZSBhbGwgdGhlIExWcy4gIE9uY2UgdGhpcyBpcyBkb25lLCB0aGUgbWFudWFsIGFsdGVybmF0aXZlCit0byBzdGVwIDQgaXMgdG8gcnVuICdsdm1sb2NrY3RsIC0tZHJvcCB2Z19uYW1lJywgd2hpY2ggdGVsbHMgbHZtbG9ja2QgdG8KK3JlbGVhc2UgYWxsIHRoZSBsZWFzZXMgZm9yIHRoZSBWRy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKworLyoKKyAqIEVhY2ggbG9ja3NwYWNlIHRocmVhZCBoYXMgaXRzIG93biBzYW5sb2NrIGRhZW1vbiBjb25uZWN0aW9uLgorICogSWYgdGhleSBzaGFyZWQgb25lLCBzYW5sb2NrIGFjcXVpcmUvcmVsZWFzZSBjYWxscyB3b3VsZCBiZQorICogc2VyaWFsaXplZC4gIFNvbWUgYXNwZWN0cyBvZiBzYW5sb2NrIGV4cGVjdCBhIHNpbmdsZSBjb25uZWN0aW9uCisgKiBmcm9tIGVhY2ggcGlkOiBzaWduYWxzIGR1ZSB0byBhIHNhbmxvY2tfcmVxdWVzdCwgYW5kCisgKiBhY3F1aXJlL3JlbGVhc2UvY29udmVydC9pbnF1aXJlLiAgVGhlIGxhdGVyIGNhbiBwcm9iYWJseSBiZQorICogYWRkcmVzc2VkIHdpdGggYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHBpZCBmaWVsZCBzaG91bGQgYmUKKyAqIGludGVycHJldHRlZCBhcyAnY2knICh3aGljaCB0aGUgY2FsbGVyIHdvdWxkIG5lZWQgdG8gZmlndXJlCisgKiBvdXQgc29tZWhvdy4pCisgKi8KKworc3RydWN0IGxtX3NhbmxvY2sgeworCXN0cnVjdCBzYW5sa19sb2Nrc3BhY2Ugc3M7CisJaW50IGFsaWduX3NpemU7CisJaW50IHNvY2s7IC8qIHNhbmxvY2sgZGFlbW9uIGNvbm5lY3Rpb24gKi8KK307CisKK3N0cnVjdCByZF9zYW5sb2NrIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBzYW5sa19yZXNvdXJjZSByczsKKwkJY2hhciBidWZbc2l6ZW9mKHN0cnVjdCBzYW5sa19yZXNvdXJjZSkgKyBzaXplb2Yoc3RydWN0IHNhbmxrX2Rpc2spXTsKKwl9OworCXN0cnVjdCB2YWxfYmxrICp2YjsKK307CisKK3N0cnVjdCBzYW5sa19yZXNvdXJjZWQgeworCXVuaW9uIHsKKwkJc3RydWN0IHNhbmxrX3Jlc291cmNlIHJzOworCQljaGFyIGJ1ZltzaXplb2Yoc3RydWN0IHNhbmxrX3Jlc291cmNlKSArIHNpemVvZihzdHJ1Y3Qgc2FubGtfZGlzayldOworCX07Cit9OworCitpbnQgbG1fZGF0YV9zaXplX3NhbmxvY2sodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByZF9zYW5sb2NrKTsKK30KKworLyoKKyAqIGxvY2tfYXJncyBmb3JtYXQKKyAqCisgKiB2Z19sb2NrX2FyZ3MgZm9ybWF0IGZvciBzYW5sb2NrIGlzCisgKiB2Z192ZXJzaW9uX3N0cmluZzp1bmRlZmluZWQ6bG9ja19sdl9uYW1lCisgKgorICogbHZfbG9ja19hcmdzIGZvcm1hdCBmb3Igc2FubG9jayBpcworICogbHZfdmVyc2lvbl9zdHJpbmc6dW5kZWZpbmVkOm9mZnNldAorICoKKyAqIHZlcnNpb25fc3RyaW5nIGlzIE1BSk9SLk1JTk9SLlBBVENICisgKiB1bmRlZmluZWQgbWF5IGNvbnRhaW4gIjoiCisgKgorICogSWYgYSBuZXcgdmVyc2lvbiBvZiB0aGUgbG9ja19hcmdzIHN0cmluZyBjYW5ub3QgYmUKKyAqIGhhbmRsZWQgYnkgYW4gb2xkIHZlcnNpb24gb2YgbHZtbG9ja2QsIHRoZW4gdGhlCisgKiBuZXcgbG9ja19hcmdzIHN0cmluZyBzaG91bGQgY29udGFpbiBhIGxhcmdlciBtYWpvciBudW1iZXIuCisgKi8KKworI2RlZmluZSBWR19MT0NLX0FSR1NfTUFKT1IgMQorI2RlZmluZSBWR19MT0NLX0FSR1NfTUlOT1IgMAorI2RlZmluZSBWR19MT0NLX0FSR1NfUEFUQ0ggMAorCisjZGVmaW5lIExWX0xPQ0tfQVJHU19NQUpPUiAxCisjZGVmaW5lIExWX0xPQ0tfQVJHU19NSU5PUiAwCisjZGVmaW5lIExWX0xPQ0tfQVJHU19QQVRDSCAwCisKKy8qCisgKiBvZmZzZXQgMCBpcyBsb2Nrc3BhY2UKKyAqIG9mZnNldCBhbGlnbl9zaXplICogMSBpcyB1bnVzZWQKKyAqIG9mZnNldCBhbGlnbl9zaXplICogMiBpcyB1bnVzZWQKKyAqIC4uLgorICogb2Zmc2V0IGFsaWduX3NpemUgKiA2NCBpcyB1bnVzZWQKKyAqIG9mZnNldCBhbGlnbl9zaXplICogNjUgaXMgZ2wgbG9jaworICogb2Zmc2V0IGFsaWduX3NpemUgKiA2NiBpcyB2ZyBsb2NrCisgKiBvZmZzZXQgYWxpZ25fc2l6ZSAqIDY3IGlzIGZpcnN0IGx2IGxvY2sKKyAqIG9mZnNldCBhbGlnbl9zaXplICogNjggaXMgc2Vjb25kIGx2IGxvY2sKKyAqIC4uLgorICovCisKKyNkZWZpbmUgTFNfQkVHSU4gMAorI2RlZmluZSBHTF9MT0NLX0JFR0lOIFVJTlQ2NF9DKDY1KQorI2RlZmluZSBWR19MT0NLX0JFR0lOIFVJTlQ2NF9DKDY2KQorI2RlZmluZSBMVl9MT0NLX0JFR0lOIFVJTlQ2NF9DKDY3KQorCitzdGF0aWMgdWludDY0X3QgZGFlbW9uX3Rlc3RfbHZfY291bnQ7CisKK3N0YXRpYyBpbnQgbG9ja19sdl9uYW1lX2Zyb21fYXJncyhjaGFyICp2Z19hcmdzLCBjaGFyICpsb2NrX2x2X25hbWUpCit7CisJcmV0dXJuIGxhc3Rfc3RyaW5nX2Zyb21fYXJncyh2Z19hcmdzLCBsb2NrX2x2X25hbWUpOworfQorCitzdGF0aWMgaW50IGxvY2tfbHZfb2Zmc2V0X2Zyb21fYXJncyhjaGFyICpsdl9hcmdzLCB1aW50NjRfdCAqbG9ja19sdl9vZmZzZXQpCit7CisJY2hhciBvZmZzZXRfc3RyW01BWF9BUkdTKzFdOworCWludCBydjsKKworCW1lbXNldChvZmZzZXRfc3RyLCAwLCBzaXplb2Yob2Zmc2V0X3N0cikpOworCisJcnYgPSBsYXN0X3N0cmluZ19mcm9tX2FyZ3MobHZfYXJncywgb2Zmc2V0X3N0cik7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIHJ2OworCisJKmxvY2tfbHZfb2Zmc2V0ID0gc3RydG91bGwob2Zmc2V0X3N0ciwgTlVMTCwgMTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FyZ3NfdmVyc2lvbihjaGFyICphcmdzLCB1bnNpZ25lZCBpbnQgb3VyX21ham9yKQoreworCXVuc2lnbmVkIGludCBtYWpvciA9IDA7CisJaW50IHJ2OworCisJcnYgPSB2ZXJzaW9uX2Zyb21fYXJncyhhcmdzLCAmbWFqb3IsIE5VTEwsIE5VTEwpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJjaGVja19hcmdzX3ZlcnNpb24gJXMgZXJyb3IgJWQiLCBhcmdzLCBydik7CisJCXJldHVybiBydjsKKwl9CisKKwlpZiAobWFqb3IgPiBvdXJfbWFqb3IpIHsKKwkJbG9nX2Vycm9yKCJjaGVja19hcmdzX3ZlcnNpb24gJXMgbWFqb3IgJXUgJXUiLCBhcmdzLCBtYWpvciwgb3VyX21ham9yKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9MSU5FIDY0CisKK3N0YXRpYyBpbnQgcmVhZF9ob3N0X2lkX2ZpbGUodm9pZCkKK3sKKwlGSUxFICpmaWxlOworCWNoYXIgbGluZVtNQVhfTElORV07CisJY2hhciBrZXlfc3RyW01BWF9MSU5FXTsKKwljaGFyIHZhbF9zdHJbTUFYX0xJTkVdOworCWNoYXIgKmtleSwgKnZhbCwgKnNlcDsKKwlpbnQgaG9zdF9pZCA9IDA7CisKKwlmaWxlID0gZm9wZW4oZGFlbW9uX2hvc3RfaWRfZmlsZSwgInIiKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGZnZXRzKGxpbmUsIE1BWF9MSU5FLCBmaWxlKSkgeworCQlpZiAobGluZVswXSA9PSAnIycgfHwgbGluZVswXSA9PSAnXG4nKQorCQkJY29udGludWU7CisKKwkJa2V5ID0gbGluZTsKKwkJc2VwID0gc3Ryc3RyKGxpbmUsICI9Iik7CisJCXZhbCA9IHNlcCArIDE7CisKKwkJaWYgKCFzZXAgfHwgIXZhbCkKKwkJCWNvbnRpbnVlOworCisJCSpzZXAgPSAnXDAnOworCQltZW1zZXQoa2V5X3N0ciwgMCwgc2l6ZW9mKGtleV9zdHIpKTsKKwkJbWVtc2V0KHZhbF9zdHIsIDAsIHNpemVvZih2YWxfc3RyKSk7CisJCSh2b2lkKSBzc2NhbmYoa2V5LCAiJXMiLCBrZXlfc3RyKTsKKwkJKHZvaWQpIHNzY2FuZih2YWwsICIlcyIsIHZhbF9zdHIpOworCisJCWlmICghc3RyY21wKGtleV9zdHIsICJob3N0X2lkIikpIHsKKwkJCWhvc3RfaWQgPSBhdG9pKHZhbF9zdHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZjbG9zZShmaWxlKSkKKwkJbG9nX2Vycm9yKCJmYWlsZWQgdG8gY2xvc2UgaG9zdCBpZCBmaWxlICVzIiwgZGFlbW9uX2hvc3RfaWRfZmlsZSk7CitvdXQ6CisJbG9nX2RlYnVnKCJob3N0X2lkICVkIGZyb20gJXMiLCBob3N0X2lkLCBkYWVtb25faG9zdF9pZF9maWxlKTsKKwlyZXR1cm4gaG9zdF9pZDsKK30KKworLyoKKyAqIHZnY3JlYXRlCisgKgorICogRm9yIGluaXRfdmcsIHZnY3JlYXRlIHBhc3NlcyB0aGUgaW50ZXJuYWwgbHYgbmFtZSBhcyB2Z19hcmdzLgorICogVGhpcyBjb25zdHJ1Y3RzIHRoZSBmdWxsL3Byb3BlciB2Z19hcmdzIGZvcm1hdCwgY29udGFpbmluZyB0aGUKKyAqIHZlcnNpb24gYW5kIGx2IG5hbWUsIGFuZCByZXR1cm5zIHRoZSByZWFsIGxvY2tfYXJncyBpbiB2Z19hcmdzLgorICovCisKK2ludCBsbV9pbml0X3ZnX3NhbmxvY2soY2hhciAqbHNfbmFtZSwgY2hhciAqdmdfbmFtZSwgdWludDMyX3QgZmxhZ3MsIGNoYXIgKnZnX2FyZ3MpCit7CisJc3RydWN0IHNhbmxrX2xvY2tzcGFjZSBzczsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2VkIHJkOworCXN0cnVjdCBzYW5sa19kaXNrIGRpc2s7CisJY2hhciBsb2NrX2x2X25hbWVbTUFYX0FSR1MrMV07CisJY2hhciBsb2NrX2FyZ3NfdmVyc2lvbltNQVhfQVJHUysxXTsKKwljb25zdCBjaGFyICpnbF9uYW1lID0gTlVMTDsKKwl1aW50MzJfdCBkYWVtb25fdmVyc2lvbjsKKwl1aW50MzJfdCBkYWVtb25fcHJvdG87CisJdWludDY0X3Qgb2Zmc2V0OworCWludCBhbGlnbl9zaXplOworCWludCBpLCBydjsKKworCW1lbXNldCgmc3MsIDAsIHNpemVvZihzcykpOworCW1lbXNldCgmcmQsIDAsIHNpemVvZihyZCkpOworCW1lbXNldCgmZGlzaywgMCwgc2l6ZW9mKGRpc2spKTsKKwltZW1zZXQobG9ja19sdl9uYW1lLCAwLCBzaXplb2YobG9ja19sdl9uYW1lKSk7CisJbWVtc2V0KGxvY2tfYXJnc192ZXJzaW9uLCAwLCBzaXplb2YobG9ja19hcmdzX3ZlcnNpb24pKTsKKworCWlmICghdmdfYXJncyB8fCAhdmdfYXJnc1swXSB8fCAhc3RyY21wKHZnX2FyZ3MsICJub25lIikpIHsKKwkJbG9nX2Vycm9yKCJTICVzIGluaXRfdmdfc2FuIHZnX2FyZ3MgbWlzc2luZyIsIGxzX25hbWUpOworCQlyZXR1cm4gLUVBUkdTOworCX0KKworCXNucHJpbnRmKGxvY2tfYXJnc192ZXJzaW9uLCBNQVhfQVJHUywgIiV1LiV1LiV1IiwKKwkJIFZHX0xPQ0tfQVJHU19NQUpPUiwgVkdfTE9DS19BUkdTX01JTk9SLCBWR19MT0NLX0FSR1NfUEFUQ0gpOworCisJLyogc2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgaW5wdXQgdmdfYXJncyBiZWluZyBvbmx5IGxvY2tfbHZfbmFtZSAqLworCXNucHJpbnRmKGxvY2tfbHZfbmFtZSwgTUFYX0FSR1MsICIlcyIsIHZnX2FyZ3MpOworCisJaWYgKHN0cmxlbihsb2NrX2x2X25hbWUpICsgc3RybGVuKGxvY2tfYXJnc192ZXJzaW9uKSArIDIgPiBNQVhfQVJHUykKKwkJcmV0dXJuIC1FQVJHUzsKKworCXNucHJpbnRmKGRpc2sucGF0aCwgU0FOTEtfUEFUSF9MRU4tMSwgIi9kZXYvbWFwcGVyLyVzLSVzIiwgdmdfbmFtZSwgbG9ja19sdl9uYW1lKTsKKworCWxvZ19kZWJ1ZygiUyAlcyBpbml0X3ZnX3NhbiBwYXRoICVzIiwgbHNfbmFtZSwgZGlzay5wYXRoKTsKKworCWlmIChkYWVtb25fdGVzdCkgeworCQlpZiAoIWdsX2xzbmFtZV9zYW5sb2NrWzBdKQorCQkJc3RybmNweShnbF9sc25hbWVfc2FubG9jaywgbHNfbmFtZSwgTUFYX05BTUUpOworCQlzbnByaW50Zih2Z19hcmdzLCBNQVhfQVJHUywgIiVzOiVzIiwgbG9ja19hcmdzX3ZlcnNpb24sIGxvY2tfbHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJ2ID0gc2FubG9ja192ZXJzaW9uKDAsICZkYWVtb25fdmVyc2lvbiwgJmRhZW1vbl9wcm90byk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgaW5pdF92Z19zYW4gZmFpbGVkIHRvIGNvbm5lY3QgdG8gc2FubG9jayBkYWVtb24iLCBsc19uYW1lKTsKKwkJcmV0dXJuIC1FTUFOQUdFUjsKKwl9CisKKwlsb2dfZGVidWcoInNhbmxvY2sgZGFlbW9uIHZlcnNpb24gJTA4eCBwcm90byAlMDh4IiwKKwkJICBkYWVtb25fdmVyc2lvbiwgZGFlbW9uX3Byb3RvKTsKKworCWFsaWduX3NpemUgPSBzYW5sb2NrX2FsaWduKCZkaXNrKTsKKwlpZiAoYWxpZ25fc2l6ZSA8PSAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBpbml0X3ZnX3NhbiBiYWQgZGlzayBhbGlnbiBzaXplICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgYWxpZ25fc2l6ZSwgZGlzay5wYXRoKTsKKwkJcmV0dXJuIC1FQVJHUzsKKwl9CisKKwlzdHJuY3B5KHNzLm5hbWUsIGxzX25hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwltZW1jcHkoc3MuaG9zdF9pZF9kaXNrLnBhdGgsIGRpc2sucGF0aCwgU0FOTEtfUEFUSF9MRU4pOworCXNzLmhvc3RfaWRfZGlzay5vZmZzZXQgPSBMU19CRUdJTiAqIGFsaWduX3NpemU7CisKKwlydiA9IHNhbmxvY2tfd3JpdGVfbG9ja3NwYWNlKCZzcywgMCwgMCwgc2FubG9ja19pb190aW1lb3V0KTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBpbml0X3ZnX3NhbiB3cml0ZV9sb2Nrc3BhY2UgZXJyb3IgJWQgJXMiLAorCQkJICBsc19uYW1lLCBydiwgc3MuaG9zdF9pZF9kaXNrLnBhdGgpOworCQlyZXR1cm4gcnY7CisJfQorCQorCS8qCisJICogV2Ugd2FudCB0byBjcmVhdGUgdGhlIGdsb2JhbCBsb2NrIGluIHRoZSBmaXJzdCBzYW5sb2NrIHZnLgorCSAqIElmIG90aGVyIHNhbmxvY2sgdmdzIGV4aXN0LCB0aGVuIG9uZSBvZiB0aGVtIG11c3QgY29udGFpbgorCSAqIHRoZSBnbC4gIElmIGdsX2xzbmFtZV9zYW5sb2NrIGlzIG5vdCBzZXQsIHRoZW4gcGVyaGFwcworCSAqIHRoZSBzYW5sb2NrIHZnIHdpdGggdGhlIGdsIGhhcyBiZWVuIHJlbW92ZWQgb3IgaGFzIG5vdCB5ZXQKKwkgKiBiZWVuIHNlZW4uIChXb3VsZCB2Z2NyZWF0ZSBnZXQgdGhpcyBmYXIgaW4gdGhhdCBjYXNlPykKKwkgKiBJZiBkbG0gdmdzIGV4aXN0LCB0aGVuIHdlIGNob29zZSB0byB1c2UgdGhlIGRsbSBnbCBhbmQKKwkgKiBub3QgYSBzYW5sb2NrIGdsLgorCSAqLworCisJaWYgKGZsYWdzICYgTERfQUZfRU5BQkxFKQorCQlnbF9uYW1lID0gUl9OQU1FX0dMOworCWVsc2UgaWYgKGZsYWdzICYgTERfQUZfRElTQUJMRSkKKwkJZ2xfbmFtZSA9IFJfTkFNRV9HTF9ESVNBQkxFRDsKKwllbHNlIGlmICghZ2xfdXNlX3NhbmxvY2sgfHwgZ2xfbHNuYW1lX3NhbmxvY2tbMF0gfHwgIWxvY2tzcGFjZXNfZW1wdHkoKSkKKwkJZ2xfbmFtZSA9IFJfTkFNRV9HTF9ESVNBQkxFRDsKKwllbHNlCisJCWdsX25hbWUgPSBSX05BTUVfR0w7CisKKwltZW1jcHkocmQucnMubG9ja3NwYWNlX25hbWUsIHNzLm5hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwlzdHJuY3B5KHJkLnJzLm5hbWUsIGdsX25hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwltZW1jcHkocmQucnMuZGlza3NbMF0ucGF0aCwgZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTik7CisJcmQucnMuZGlza3NbMF0ub2Zmc2V0ID0gYWxpZ25fc2l6ZSAqIEdMX0xPQ0tfQkVHSU47CisJcmQucnMubnVtX2Rpc2tzID0gMTsKKworCXJ2ID0gc2FubG9ja193cml0ZV9yZXNvdXJjZSgmcmQucnMsIDAsIDAsIDApOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIGluaXRfdmdfc2FuIHdyaXRlX3Jlc291cmNlIGdsIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHJkLnJzLmRpc2tzWzBdLnBhdGgpOworCQlyZXR1cm4gcnY7CisJfQorCisJbWVtY3B5KHJkLnJzLmxvY2tzcGFjZV9uYW1lLCBzcy5uYW1lLCBTQU5MS19OQU1FX0xFTik7CisJc3RybmNweShyZC5ycy5uYW1lLCBSX05BTUVfVkcsIFNBTkxLX05BTUVfTEVOKTsKKwltZW1jcHkocmQucnMuZGlza3NbMF0ucGF0aCwgZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTik7CisJcmQucnMuZGlza3NbMF0ub2Zmc2V0ID0gYWxpZ25fc2l6ZSAqIFZHX0xPQ0tfQkVHSU47CisJcmQucnMubnVtX2Rpc2tzID0gMTsKKworCXJ2ID0gc2FubG9ja193cml0ZV9yZXNvdXJjZSgmcmQucnMsIDAsIDAsIDApOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIGluaXRfdmdfc2FuIHdyaXRlX3Jlc291cmNlIHZnIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHJkLnJzLmRpc2tzWzBdLnBhdGgpOworCQlyZXR1cm4gcnY7CisJfQorCisJaWYgKCFzdHJjbXAoZ2xfbmFtZSwgUl9OQU1FX0dMKSkKKwkJc3RybmNweShnbF9sc25hbWVfc2FubG9jaywgbHNfbmFtZSwgTUFYX05BTUUpOworIAorCXNucHJpbnRmKHZnX2FyZ3MsIE1BWF9BUkdTLCAiJXM6JXMiLCBsb2NrX2FyZ3NfdmVyc2lvbiwgbG9ja19sdl9uYW1lKTsKKworCWxvZ19kZWJ1ZygiUyAlcyBpbml0X3ZnX3NhbiBkb25lIHZnX2FyZ3MgJXMiLCBsc19uYW1lLCB2Z19hcmdzKTsKKworCS8qCisJICogR28gdGhyb3VnaCBhbGwgbHYgcmVzb3VyY2Ugc2xvdHMgYW5kIGluaXRpYWxpemUgdGhlbSB3aXRoIHRoZQorCSAqIGNvcnJlY3QgbG9ja3NwYWNlIG5hbWUgYnV0IGEgc3BlY2lhbCByZXNvdXJjZSBuYW1lIHRoYXQgaW5kaWNhdGVzCisJICogaXQgaXMgdW51c2VkLgorCSAqLworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHJkKSk7CisJcmQucnMubnVtX2Rpc2tzID0gMTsKKwltZW1jcHkocmQucnMuZGlza3NbMF0ucGF0aCwgZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTik7CisJc3RybmNweShyZC5ycy5sb2Nrc3BhY2VfbmFtZSwgbHNfbmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCXN0cmNweShyZC5ycy5uYW1lLCAiI3VudXNlZCIpOworCisJb2Zmc2V0ID0gYWxpZ25fc2l6ZSAqIExWX0xPQ0tfQkVHSU47CisKKwlsb2dfZGVidWcoIlMgJXMgaW5pdF92Z19zYW4gY2xlYXJpbmcgbHYgbGVhc2UgYXJlYXMiLCBsc19uYW1lKTsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXJkLnJzLmRpc2tzWzBdLm9mZnNldCA9IG9mZnNldDsKKworCQlydiA9IHNhbmxvY2tfd3JpdGVfcmVzb3VyY2UoJnJkLnJzLCAwLCAwLCAwKTsKKwkJaWYgKHJ2ID09IC1FTVNHU0laRSB8fCBydiA9PSAtRU5PU1BDKSB7CisJCQkvKiBUaGlzIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBkZXZpY2UgaXMgcmVhY2hlZC4gKi8KKwkJCXJ2ID0gLUVNU0dTSVpFOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocnYpIHsKKwkJCWxvZ19lcnJvcigiY2xlYXIgbHYgcmVzb3VyY2UgYXJlYSAlbGx1IGVycm9yICVkIiwKKwkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0LCBydik7CisJCQlicmVhazsKKwkJfQorCQlvZmZzZXQgKz0gYWxpZ25fc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGx2Y3JlYXRlCisgKgorICogVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgbHYgbGVhc2UgaXMgd3JpdHRlbiBpcyBwYXNzZWQKKyAqIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGx2Y3JlYXRlIGNvbW1hbmQgc28gdGhhdCBpdAorICogY2FuIGJlIHNhdmVkIGluIHRoZSBsdidzIGxvY2tfYXJncyBpbiB0aGUgdmcgbWV0YWRhdGEuCisgKi8KKworaW50IGxtX2luaXRfbHZfc2FubG9jayhjaGFyICpsc19uYW1lLCBjaGFyICp2Z19uYW1lLCBjaGFyICpsdl9uYW1lLAorCQkgICAgICAgY2hhciAqdmdfYXJncywgY2hhciAqbHZfYXJncywgdWludDY0X3QgZnJlZV9vZmZzZXQpCit7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlZCByZDsKKwljaGFyIGxvY2tfbHZfbmFtZVtNQVhfQVJHUysxXTsKKwljaGFyIGxvY2tfYXJnc192ZXJzaW9uW01BWF9BUkdTKzFdOworCXVpbnQ2NF90IG9mZnNldDsKKwlpbnQgYWxpZ25fc2l6ZTsKKwlpbnQgcnY7CisKKwltZW1zZXQoJnJkLCAwLCBzaXplb2YocmQpKTsKKwltZW1zZXQobG9ja19sdl9uYW1lLCAwLCBzaXplb2YobG9ja19sdl9uYW1lKSk7CisJbWVtc2V0KGxvY2tfYXJnc192ZXJzaW9uLCAwLCBzaXplb2YobG9ja19hcmdzX3ZlcnNpb24pKTsKKworCXJ2ID0gbG9ja19sdl9uYW1lX2Zyb21fYXJncyh2Z19hcmdzLCBsb2NrX2x2X25hbWUpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIGluaXRfbHZfc2FuIGxvY2tfbHZfbmFtZV9mcm9tX2FyZ3MgZXJyb3IgJWQgJXMiLAorCQkJICBsc19uYW1lLCBydiwgdmdfYXJncyk7CisJCXJldHVybiBydjsKKwl9CisKKwlzbnByaW50Zihsb2NrX2FyZ3NfdmVyc2lvbiwgTUFYX0FSR1MsICIldS4ldS4ldSIsCisJCSBMVl9MT0NLX0FSR1NfTUFKT1IsIExWX0xPQ0tfQVJHU19NSU5PUiwgTFZfTE9DS19BUkdTX1BBVENIKTsKKworCWlmIChkYWVtb25fdGVzdCkgeworCQlhbGlnbl9zaXplID0gMTA0ODU3NjsKKwkJc25wcmludGYobHZfYXJncywgTUFYX0FSR1MsICIlczolbGx1IiwKKwkJCSBsb2NrX2FyZ3NfdmVyc2lvbiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSgoYWxpZ25fc2l6ZSAqIExWX0xPQ0tfQkVHSU4pICsgKGFsaWduX3NpemUgKiBkYWVtb25fdGVzdF9sdl9jb3VudCkpKTsKKwkJZGFlbW9uX3Rlc3RfbHZfY291bnQrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RybmNweShyZC5ycy5sb2Nrc3BhY2VfbmFtZSwgbHNfbmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCXJkLnJzLm51bV9kaXNrcyA9IDE7CisJc25wcmludGYocmQucnMuZGlza3NbMF0ucGF0aCwgU0FOTEtfUEFUSF9MRU4tMSwgIi9kZXYvbWFwcGVyLyVzLSVzIiwgdmdfbmFtZSwgbG9ja19sdl9uYW1lKTsKKworCWFsaWduX3NpemUgPSBzYW5sb2NrX2FsaWduKCZyZC5ycy5kaXNrc1swXSk7CisJaWYgKGFsaWduX3NpemUgPD0gMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgaW5pdF9sdl9zYW4gYWxpZ24gZXJyb3IgJWQiLCBsc19uYW1lLCBhbGlnbl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZyZWVfb2Zmc2V0KQorCQlvZmZzZXQgPSBmcmVlX29mZnNldDsKKwllbHNlCisJCW9mZnNldCA9IGFsaWduX3NpemUgKiBMVl9MT0NLX0JFR0lOOworCXJkLnJzLmRpc2tzWzBdLm9mZnNldCA9IG9mZnNldDsKKworCXdoaWxlICgxKSB7CisJCXJkLnJzLmRpc2tzWzBdLm9mZnNldCA9IG9mZnNldDsKKworCQltZW1zZXQocmQucnMubmFtZSwgMCwgU0FOTEtfTkFNRV9MRU4pOworCisJCXJ2ID0gc2FubG9ja19yZWFkX3Jlc291cmNlKCZyZC5ycywgMCk7CisJCWlmIChydiA9PSAtRU1TR1NJWkUgfHwgcnYgPT0gLUVOT1NQQykgeworCQkJLyogVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgZGV2aWNlIGlzIHJlYWNoZWQuICovCisJCQlsb2dfZGVidWcoIlMgJXMgaW5pdF9sdl9zYW4gcmVhZCBsaW1pdCBvZmZzZXQgJWxsdSIsCisJCQkJICBsc19uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJCQlydiA9IC1FTVNHU0laRTsKKwkJCXJldHVybiBydjsKKwkJfQorCisJCWlmIChydiAmJiBydiAhPSBTQU5MS19MRUFERVJfTUFHSUMpIHsKKwkJCWxvZ19lcnJvcigiUyAlcyBpbml0X2x2X3NhbiByZWFkIGVycm9yICVkIG9mZnNldCAlbGx1IiwKKwkJCQkgIGxzX25hbWUsIHJ2LCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghc3RybmNtcChyZC5ycy5uYW1lLCBsdl9uYW1lLCBTQU5MS19OQU1FX0xFTikpIHsKKwkJCWxvZ19lcnJvcigiUyAlcyBpbml0X2x2X3NhbiByZXNvdXJjZSBuYW1lICVzIGFscmVhZHkgZXhpc3RzIGF0ICVsbHUiLAorCQkJCSAgbHNfbmFtZSwgbHZfbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSByZWFkIG5ld2x5IGV4dGVuZGVkIHNwYWNlLCBpdCB3aWxsIG5vdCBiZSBpbml0aWFsaXplZAorCQkgKiB3aXRoIGFuICIjdW51c2VkIiByZXNvdXJjZSwgYnV0IHdpbGwgcmV0dXJuIFNBTkxLX0xFQURFUl9NQUdJQworCQkgKiBpbmRpY2F0aW5nIGFuIHVuaW5pdGlhbGl6ZWQgcGF4b3Mgc3RydWN0dXJlIG9uIGRpc2suCisJCSAqLworCQlpZiAoKHJ2ID09IFNBTkxLX0xFQURFUl9NQUdJQykgfHwgIXN0cmNtcChyZC5ycy5uYW1lLCAiI3VudXNlZCIpKSB7CisJCQlsb2dfZGVidWcoIlMgJXMgaW5pdF9sdl9zYW4gJXMgZm91bmQgdW51c2VkIGFyZWEgYXQgJWxsdSIsCisJCQkJICBsc19uYW1lLCBsdl9uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisKKwkJCXN0cm5jcHkocmQucnMubmFtZSwgbHZfbmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCisJCQlydiA9IHNhbmxvY2tfd3JpdGVfcmVzb3VyY2UoJnJkLnJzLCAwLCAwLCAwKTsKKwkJCWlmICghcnYpIHsKKwkJCQlzbnByaW50Zihsdl9hcmdzLCBNQVhfQVJHUywgIiVzOiVsbHUiLAorCQkJCSAgICAgICAgIGxvY2tfYXJnc192ZXJzaW9uLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJCQl9IGVsc2UgeworCQkJCWxvZ19lcnJvcigiUyAlcyBpbml0X2x2X3NhbiB3cml0ZSBlcnJvciAlZCBvZmZzZXQgJWxsdSIsCisJCQkJCSAgbHNfbmFtZSwgcnYsICh1bnNpZ25lZCBsb25nIGxvbmcpcnYpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlvZmZzZXQgKz0gYWxpZ25fc2l6ZTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBsb2Nrc3BhY2UgYW5kIGVhY2ggcmVzb3VyY2UsIHJlcGxhY2UgdGhlIGxvY2tzcGFjZSBuYW1lLAorICogYW5kIHdyaXRlIGl0IGJhY2suCisgKi8KKworaW50IGxtX3JlbmFtZV92Z19zYW5sb2NrKGNoYXIgKmxzX25hbWUsIGNoYXIgKnZnX25hbWUsIHVpbnQzMl90IGZsYWdzLCBjaGFyICp2Z19hcmdzKQoreworCXN0cnVjdCBzYW5sa19sb2Nrc3BhY2Ugc3M7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlZCByZDsKKwlzdHJ1Y3Qgc2FubGtfZGlzayBkaXNrOworCWNoYXIgbG9ja19sdl9uYW1lW01BWF9BUkdTKzFdOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50MzJfdCBpb190aW1lb3V0OworCWludCBhbGlnbl9zaXplOworCWludCBpLCBydjsKKworCW1lbXNldCgmZGlzaywgMCwgc2l6ZW9mKGRpc2spKTsKKwltZW1zZXQobG9ja19sdl9uYW1lLCAwLCBzaXplb2YobG9ja19sdl9uYW1lKSk7CisKKwlpZiAoIXZnX2FyZ3MgfHwgIXZnX2FyZ3NbMF0gfHwgIXN0cmNtcCh2Z19hcmdzLCAibm9uZSIpKSB7CisJCWxvZ19lcnJvcigiUyAlcyByZW5hbWVfdmdfc2FuIHZnX2FyZ3MgbWlzc2luZyIsIGxzX25hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlydiA9IGxvY2tfbHZfbmFtZV9mcm9tX2FyZ3ModmdfYXJncywgbG9ja19sdl9uYW1lKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBpbml0X2x2X3NhbiBsb2NrX2x2X25hbWVfZnJvbV9hcmdzIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHZnX2FyZ3MpOworCQlyZXR1cm4gcnY7CisJfQorCisJc25wcmludGYoZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTi0xLCAiL2Rldi9tYXBwZXIvJXMtJXMiLCB2Z19uYW1lLCBsb2NrX2x2X25hbWUpOworCisJbG9nX2RlYnVnKCJTICVzIHJlbmFtZV92Z19zYW4gcGF0aCAlcyIsIGxzX25hbWUsIGRpc2sucGF0aCk7CisKKwlpZiAoZGFlbW9uX3Rlc3QpCisJCXJldHVybiAwOworCisJLyogRklYTUU6IGRldmljZSBpcyBub3QgYWx3YXlzIHJlYWR5IGZvciB1cyBoZXJlICovCisJc2xlZXAoMSk7CisKKwlhbGlnbl9zaXplID0gc2FubG9ja19hbGlnbigmZGlzayk7CisJaWYgKGFsaWduX3NpemUgPD0gMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgcmVuYW1lX3ZnX3NhbiBiYWQgYWxpZ24gc2l6ZSAlZCAlcyIsCisJCQkgIGxzX25hbWUsIGFsaWduX3NpemUsIGRpc2sucGF0aCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogTG9ja3NwYWNlCisJICovCisKKwltZW1zZXQoJnNzLCAwLCBzaXplb2Yoc3MpKTsKKwltZW1jcHkoc3MuaG9zdF9pZF9kaXNrLnBhdGgsIGRpc2sucGF0aCwgU0FOTEtfUEFUSF9MRU4pOworCXNzLmhvc3RfaWRfZGlzay5vZmZzZXQgPSBMU19CRUdJTiAqIGFsaWduX3NpemU7CisKKwlydiA9IHNhbmxvY2tfcmVhZF9sb2Nrc3BhY2UoJnNzLCAwLCAmaW9fdGltZW91dCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgcmVuYW1lX3ZnX3NhbiByZWFkX2xvY2tzcGFjZSBlcnJvciAlZCAlcyIsCisJCQkgIGxzX25hbWUsIHJ2LCBzcy5ob3N0X2lkX2Rpc2sucGF0aCk7CisJCXJldHVybiBydjsKKwl9CisKKwlzdHJuY3B5KHNzLm5hbWUsIGxzX25hbWUsIFNBTkxLX05BTUVfTEVOKTsKKworCXJ2ID0gc2FubG9ja193cml0ZV9sb2Nrc3BhY2UoJnNzLCAwLCAwLCBzYW5sb2NrX2lvX3RpbWVvdXQpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHJlbmFtZV92Z19zYW4gd3JpdGVfbG9ja3NwYWNlIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHNzLmhvc3RfaWRfZGlzay5wYXRoKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCS8qCisJICogR0wgcmVzb3VyY2UKKwkgKi8KKworCW1lbXNldCgmcmQsIDAsIHNpemVvZihyZCkpOworCW1lbWNweShyZC5ycy5kaXNrc1swXS5wYXRoLCBkaXNrLnBhdGgsIFNBTkxLX1BBVEhfTEVOKTsKKwlyZC5ycy5kaXNrc1swXS5vZmZzZXQgPSBhbGlnbl9zaXplICogR0xfTE9DS19CRUdJTjsKKwlyZC5ycy5udW1fZGlza3MgPSAxOworCisJcnYgPSBzYW5sb2NrX3JlYWRfcmVzb3VyY2UoJnJkLnJzLCAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyByZW5hbWVfdmdfc2FuIHJlYWRfcmVzb3VyY2UgZ2wgZXJyb3IgJWQgJXMiLAorCQkJICBsc19uYW1lLCBydiwgcmQucnMuZGlza3NbMF0ucGF0aCk7CisJCXJldHVybiBydjsKKwl9CisKKwlzdHJuY3B5KHJkLnJzLmxvY2tzcGFjZV9uYW1lLCBzcy5uYW1lLCBTQU5MS19OQU1FX0xFTik7CisKKwlydiA9IHNhbmxvY2tfd3JpdGVfcmVzb3VyY2UoJnJkLnJzLCAwLCAwLCAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyByZW5hbWVfdmdfc2FuIHdyaXRlX3Jlc291cmNlIGdsIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHJkLnJzLmRpc2tzWzBdLnBhdGgpOworCQlyZXR1cm4gcnY7CisJfQorCisJLyoKKwkgKiBWRyByZXNvdXJjZQorCSAqLworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHJkKSk7CisJbWVtY3B5KHJkLnJzLmRpc2tzWzBdLnBhdGgsIGRpc2sucGF0aCwgU0FOTEtfUEFUSF9MRU4pOworCXJkLnJzLmRpc2tzWzBdLm9mZnNldCA9IGFsaWduX3NpemUgKiBWR19MT0NLX0JFR0lOOworCXJkLnJzLm51bV9kaXNrcyA9IDE7CisKKwlydiA9IHNhbmxvY2tfcmVhZF9yZXNvdXJjZSgmcmQucnMsIDApOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHJlbmFtZV92Z19zYW4gd3JpdGVfcmVzb3VyY2UgdmcgZXJyb3IgJWQgJXMiLAorCQkJICBsc19uYW1lLCBydiwgcmQucnMuZGlza3NbMF0ucGF0aCk7CisJCXJldHVybiBydjsKKwl9CisKKwlzdHJuY3B5KHJkLnJzLmxvY2tzcGFjZV9uYW1lLCBzcy5uYW1lLCBTQU5MS19OQU1FX0xFTik7CisKKwlydiA9IHNhbmxvY2tfd3JpdGVfcmVzb3VyY2UoJnJkLnJzLCAwLCAwLCAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyByZW5hbWVfdmdfc2FuIHdyaXRlX3Jlc291cmNlIHZnIGVycm9yICVkICVzIiwKKwkJCSAgbHNfbmFtZSwgcnYsIHJkLnJzLmRpc2tzWzBdLnBhdGgpOworCQlyZXR1cm4gcnY7CisJfQorCisJLyoKKwkgKiBMViByZXNvdXJjZXMKKwkgKi8KKworCW9mZnNldCA9IGFsaWduX3NpemUgKiBMVl9MT0NLX0JFR0lOOworCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHJkKSk7CisJCW1lbWNweShyZC5ycy5kaXNrc1swXS5wYXRoLCBkaXNrLnBhdGgsIFNBTkxLX1BBVEhfTEVOKTsKKwkJcmQucnMuZGlza3NbMF0ub2Zmc2V0ID0gb2Zmc2V0OworCQlyZC5ycy5udW1fZGlza3MgPSAxOworCisJCXJ2ID0gc2FubG9ja19yZWFkX3Jlc291cmNlKCZyZC5ycywgMCk7CisJCWlmIChydiA9PSAtRU1TR1NJWkUgfHwgcnYgPT0gLUVOT1NQQykgeworCQkJLyogVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgZGV2aWNlIGlzIHJlYWNoZWQuICovCisJCQlydiA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJ2IDwgMCkgeworCQkJbG9nX2Vycm9yKCJTICVzIHJlbmFtZV92Z19zYW4gcmVhZF9yZXNvdXJjZSByZXNvdXJjZSBhcmVhICVsbHUgZXJyb3IgJWQiLAorCQkJCSAgbHNfbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsIHJ2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3RybmNweShyZC5ycy5sb2Nrc3BhY2VfbmFtZSwgc3MubmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCisJCXJ2ID0gc2FubG9ja193cml0ZV9yZXNvdXJjZSgmcmQucnMsIDAsIDAsIDApOworCQlpZiAocnYpIHsKKwkJCWxvZ19lcnJvcigiUyAlcyByZW5hbWVfdmdfc2FuIHdyaXRlX3Jlc291cmNlIHJlc291cmNlIGFyZWEgJWxsdSBlcnJvciAlZCIsCisJCQkJICBsc19uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCwgcnYpOworCQkJYnJlYWs7CisJCX0KKwkJb2Zmc2V0ICs9IGFsaWduX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGx2cmVtb3ZlICovCitpbnQgbG1fZnJlZV9sdl9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJc3RydWN0IHJkX3NhbmxvY2sgKnJkcyA9IChzdHJ1Y3QgcmRfc2FubG9jayAqKXItPmxtX2RhdGE7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlICpycyA9ICZyZHMtPnJzOworCWludCBydjsKKworCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGZyZWVfbHZfc2FuIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlyZXR1cm4gMDsKKworCXN0cmNweShycy0+bmFtZSwgIiN1bnVzZWQiKTsKKworCXJ2ID0gc2FubG9ja193cml0ZV9yZXNvdXJjZShycywgMCwgMCwgMCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBmcmVlX2x2X3NhbiB3cml0ZSBlcnJvciAlZCIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitpbnQgbG1fZXhfZGlzYWJsZV9nbF9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzKQoreworCXN0cnVjdCBsbV9zYW5sb2NrICpsbXMgPSAoc3RydWN0IGxtX3NhbmxvY2sgKilscy0+bG1fZGF0YTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2VkIHJkMTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2VkIHJkMjsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKnJzMTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKnJzMjsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKipyc19hcmdzOworCWludCBydjsKKworCWlmIChkYWVtb25fdGVzdCkKKwkJcmV0dXJuIDA7CisKKwlyc19hcmdzID0gbWFsbG9jKDIgKiBzaXplb2Yoc3RydWN0IHNhbmxrX3Jlc291cmNlICopKTsKKwlpZiAoIXJzX2FyZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJcnMxID0gJnJkMS5yczsKKwlyczIgPSAmcmQyLnJzOworCisJbWVtc2V0KCZyZDEsIDAsIHNpemVvZihyZDEpKTsKKwltZW1zZXQoJnJkMiwgMCwgc2l6ZW9mKHJkMikpOworCisJc3RybmNweShyZDEucnMubG9ja3NwYWNlX25hbWUsIGxzLT5uYW1lLCBTQU5MS19OQU1FX0xFTik7CisJc3RybmNweShyZDEucnMubmFtZSwgUl9OQU1FX0dMLCBTQU5MS19OQU1FX0xFTik7CisKKwlzdHJuY3B5KHJkMi5ycy5sb2Nrc3BhY2VfbmFtZSwgbHMtPm5hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwlzdHJuY3B5KHJkMi5ycy5uYW1lLCBSX05BTUVfR0xfRElTQUJMRUQsIFNBTkxLX05BTUVfTEVOKTsKKworCXJkMS5ycy5udW1fZGlza3MgPSAxOworCXN0cm5jcHkocmQxLnJzLmRpc2tzWzBdLnBhdGgsIGxtcy0+c3MuaG9zdF9pZF9kaXNrLnBhdGgsIFNBTkxLX1BBVEhfTEVOLTEpOworCXJkMS5ycy5kaXNrc1swXS5vZmZzZXQgPSBsbXMtPmFsaWduX3NpemUgKiBHTF9MT0NLX0JFR0lOOworCisJcnYgPSBzYW5sb2NrX2FjcXVpcmUobG1zLT5zb2NrLCAtMSwgMCwgMSwgJnJzMSwgTlVMTCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgZXhfZGlzYWJsZV9nbF9zYW4gYWNxdWlyZSBlcnJvciAlZCIsCisJCQkgIGxzLT5uYW1lLCBydik7CisJCWdvdG8gb3V0OworCX0KKworCXJzX2FyZ3NbMF0gPSByczE7CisJcnNfYXJnc1sxXSA9IHJzMjsKKworCXJ2ID0gc2FubG9ja19yZWxlYXNlKGxtcy0+c29jaywgLTEsIFNBTkxLX1JFTF9SRU5BTUUsIDIsIHJzX2FyZ3MpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIGV4X2Rpc2FibGVfZ2xfc2FuIHJlbGVhc2VfcmVuYW1lIGVycm9yICVkIiwKKwkJCSAgbHMtPm5hbWUsIHJ2KTsKKwl9CisKK291dDoKKwlmcmVlKHJzX2FyZ3MpOworCXJldHVybiBydjsKK30KKworLyoKKyAqIGVuYWJsZS9kaXNhYmxlIGV4aXN0IGJlY2F1c2UgZWFjaCB2ZyBjb250YWlucyBhIGdsb2JhbCBsb2NrLAorICogYnV0IHdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGdsIGZyb20gb25lIG9mIHRoZW0uICBUaGUgZmlyc3QKKyAqIHNhbmxvY2sgdmcgY3JlYXRlZCwgaGFzIGl0cyBnbCBlbmFibGVkLCBhbmQgc3Vic2VxdWVudAorICogc2FubG9jayB2Z3MgaGF2ZSB0aGVpciBnbCBkaXNhYmxlZC4gIElmIHRoZSB2ZyBjb250YWluaW5nIHRoZQorICogZ2wgaXMgcmVtb3ZlZCwgdGhlIGdsIGZyb20gYW5vdGhlciBzYW5sb2NrIHZnIG5lZWRzIHRvIGJlCisgKiBlbmFibGVkLiAgT3IsIGlmIGdsIGluIG11bHRpcGxlIHZncyBhcmUgc29tZWhvdyBlbmFibGVkLCB3ZQorICogd2FudCB0byBiZSBhYmxlIHRvIGRpc2FibGUgb25lIG9mIHRoZW0uCisgKgorICogRGlzYWJsZSB3b3JrcyBieSBuYW1pbmcvcmVuYW1pbmcgdGhlIGdsIHJlc291cmNlIHRvIGhhdmUgYQorICogbmFtZSB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwcmVkZWZpbmVkIG5hbWUuCisgKiBXaGVuIGEgaG9zdCBhdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBnbCB3aXRoIGl0cyBzdGFuZGFyZAorICogcHJlZGVmaW5lZCBuYW1lLCBpdCB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgcmVzb3VyY2UncyBuYW1lCisgKiBvbiBkaXNrIGRvZXNuJ3QgbWF0Y2guCisgKi8KKworaW50IGxtX2FibGVfZ2xfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbG1fc2FubG9jayAqbG1zID0gKHN0cnVjdCBsbV9zYW5sb2NrICopbHMtPmxtX2RhdGE7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlZCByZDsKKwljb25zdCBjaGFyICpnbF9uYW1lOworCWludCBydjsKKworCWlmIChlbmFibGUpCisJCWdsX25hbWUgPSBSX05BTUVfR0w7CisJZWxzZQorCQlnbF9uYW1lID0gUl9OQU1FX0dMX0RJU0FCTEVEOworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlnb3RvIG91dDsKKworCW1lbXNldCgmcmQsIDAsIHNpemVvZihyZCkpOworCisJc3RybmNweShyZC5ycy5sb2Nrc3BhY2VfbmFtZSwgbHMtPm5hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwlzdHJuY3B5KHJkLnJzLm5hbWUsIGdsX25hbWUsIFNBTkxLX05BTUVfTEVOKTsKKworCXJkLnJzLm51bV9kaXNrcyA9IDE7CisJc3RybmNweShyZC5ycy5kaXNrc1swXS5wYXRoLCBsbXMtPnNzLmhvc3RfaWRfZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTi0xKTsKKwlyZC5ycy5kaXNrc1swXS5vZmZzZXQgPSBsbXMtPmFsaWduX3NpemUgKiBHTF9MT0NLX0JFR0lOOworCisJcnYgPSBzYW5sb2NrX3dyaXRlX3Jlc291cmNlKCZyZC5ycywgMCwgMCwgMCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgYWJsZV9nbCAlZCB3cml0ZV9yZXNvdXJjZSBnbCBlcnJvciAlZCAlcyIsCisJCQkgIGxzLT5uYW1lLCBlbmFibGUsIHJ2LCByZC5ycy5kaXNrc1swXS5wYXRoKTsKKwkJcmV0dXJuIHJ2OworCX0KK291dDoKKwlsb2dfZGVidWcoIlMgJXMgYWJsZV9nbCAlcyIsIGxzLT5uYW1lLCBnbF9uYW1lKTsKKworCWxzLT5zYW5sb2NrX2dsX2VuYWJsZWQgPSBlbmFibGU7CisKKwlpZiAoZW5hYmxlKQorCQlzdHJuY3B5KGdsX2xzbmFtZV9zYW5sb2NrLCBscy0+bmFtZSwgTUFYX05BTUUpOworCisJaWYgKCFlbmFibGUgJiYgIXN0cmNtcChnbF9sc25hbWVfc2FubG9jaywgbHMtPm5hbWUpKQorCQltZW1zZXQoZ2xfbHNuYW1lX3NhbmxvY2ssIDAsIHNpemVvZihnbF9sc25hbWVfc2FubG9jaykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2xfaXNfZW5hYmxlZChzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IGxtX3NhbmxvY2sgKmxtcykKK3sKKwljaGFyIHN0cm5hbWVbU0FOTEtfTkFNRV9MRU4gKyAxXTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2VkIHJkOworCXVpbnQ2NF90IG9mZnNldDsKKwlpbnQgcnY7CisKKwlpZiAoZGFlbW9uX3Rlc3QpCisJCXJldHVybiAxOworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHJkKSk7CisKKwlzdHJuY3B5KHJkLnJzLmxvY2tzcGFjZV9uYW1lLCBscy0+bmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCisJLyogbGVhdmUgcnMubmFtZSBlbXB0eSwgaXQgaXMgd2hhdCB3ZSdyZSBjaGVja2luZyAqLworCisJcmQucnMubnVtX2Rpc2tzID0gMTsKKwlzdHJuY3B5KHJkLnJzLmRpc2tzWzBdLnBhdGgsIGxtcy0+c3MuaG9zdF9pZF9kaXNrLnBhdGgsIFNBTkxLX1BBVEhfTEVOLTEpOworCisJb2Zmc2V0ID0gbG1zLT5hbGlnbl9zaXplICogR0xfTE9DS19CRUdJTjsKKwlyZC5ycy5kaXNrc1swXS5vZmZzZXQgPSBvZmZzZXQ7CisKKwlydiA9IHNhbmxvY2tfcmVhZF9yZXNvdXJjZSgmcmQucnMsIDApOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJnbF9pc19lbmFibGVkIHJlYWRfcmVzb3VyY2UgZXJyb3IgJWQiLCBydik7CisJCXJldHVybiBydjsKKwl9CisKKwltZW1zZXQoc3RybmFtZSwgMCwgc2l6ZW9mKHN0cm5hbWUpKTsKKwltZW1jcHkoc3RybmFtZSwgcmQucnMubmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCisJaWYgKCFzdHJjbXAoc3RybmFtZSwgUl9OQU1FX0dMX0RJU0FCTEVEKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcChzdHJuYW1lLCBSX05BTUVfR0wpKSB7CisJCXJldHVybiAxOworCX0KKworCWxvZ19lcnJvcigiZ2xfaXNfZW5hYmxlZCBpbnZhbGlkIGdsIG5hbWUgJXMiLCBzdHJuYW1lKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBsbV9nbF9pc19lbmFibGVkKHN0cnVjdCBsb2Nrc3BhY2UgKmxzKQoreworCWludCBydjsKKwlydiA9IGdsX2lzX2VuYWJsZWQobHMsIGxzLT5sbV9kYXRhKTsKKwlscy0+c2FubG9ja19nbF9lbmFibGVkID0gcnY7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBsdmNyZWF0ZSB0bworICogZW5zdXJlIHRoZXJlIGlzIGZyZWUgc3BhY2UgZm9yIGEgbmV3IExWIGxvY2suCisgKiBJZiBub3QsIGx2Y3JlYXRlIHdpbGwgZXh0ZW5kIHRoZSBsdm1sb2NrIGx2CisgKiBiZWZvcmUgY29udGludWluZyB3aXRoIGNyZWF0aW5nIHRoZSBuZXcgTFYuCisgKiBUaGlzIHdheSwgbG1faW5pdF9sdl9zYW4oKSBzaG91bGQgZmluZCBhIGZyZWUKKyAqIGxvY2sgKHVubGVzcyB0aGUgYXV0b2V4dGVuZCBvZiBsdm1sb2NrIGx2IGhhcworICogYmVlbiBkaXNhYmxlZC4pCisgKi8KKworaW50IGxtX2ZpbmRfZnJlZV9sb2NrX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHVpbnQ2NF90ICpmcmVlX29mZnNldCkKK3sKKwlzdHJ1Y3QgbG1fc2FubG9jayAqbG1zID0gKHN0cnVjdCBsbV9zYW5sb2NrICopbHMtPmxtX2RhdGE7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlZCByZDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJaW50IHJ2OworCisJaWYgKGRhZW1vbl90ZXN0KSB7CisJCSpmcmVlX29mZnNldCA9ICgxMDQ4NTc2ICogTFZfTE9DS19CRUdJTikgKyAoMTA0ODU3NiAqIChkYWVtb25fdGVzdF9sdl9jb3VudCArIDEpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHJkKSk7CisKKwlzdHJuY3B5KHJkLnJzLmxvY2tzcGFjZV9uYW1lLCBscy0+bmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCXJkLnJzLm51bV9kaXNrcyA9IDE7CisJc3RybmNweShyZC5ycy5kaXNrc1swXS5wYXRoLCBsbXMtPnNzLmhvc3RfaWRfZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTi0xKTsKKworCW9mZnNldCA9IGxtcy0+YWxpZ25fc2l6ZSAqIExWX0xPQ0tfQkVHSU47CisKKwl3aGlsZSAoMSkgeworCQlyZC5ycy5kaXNrc1swXS5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJbWVtc2V0KHJkLnJzLm5hbWUsIDAsIFNBTkxLX05BTUVfTEVOKTsKKworCQlydiA9IHNhbmxvY2tfcmVhZF9yZXNvdXJjZSgmcmQucnMsIDApOworCQlpZiAocnYgPT0gLUVNU0dTSVpFIHx8IHJ2ID09IC1FTk9TUEMpIHsKKwkJCS8qIFRoaXMgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIGRldmljZSBpcyByZWFjaGVkLiAqLworCQkJbG9nX2RlYnVnKCJTICVzIGZpbmRfZnJlZV9sb2NrX3NhbiByZWFkIGxpbWl0IG9mZnNldCAlbGx1IiwKKwkJCQkgIGxzLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UgcmVhZCBuZXdseSBleHRlbmRlZCBzcGFjZSwgaXQgd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQKKwkJICogd2l0aCBhbiAiI3VudXNlZCIgcmVzb3VyY2UsIGJ1dCB3aWxsIHJldHVybiBhbiBlcnJvciBhYm91dAorCQkgKiBhbiBpbnZhbGlkIHBheG9zIHN0cnVjdHVyZSBvbiBkaXNrLgorCQkgKi8KKwkJaWYgKHJ2ID09IFNBTkxLX0xFQURFUl9NQUdJQykgeworCQkJbG9nX2RlYnVnKCJTICVzIGZpbmRfZnJlZV9sb2NrX3NhbiBmb3VuZCBlbXB0eSBhcmVhIGF0ICVsbHUiLAorCQkJCSAgbHMtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0KTsKKwkJCSpmcmVlX29mZnNldCA9IG9mZnNldDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHJ2KSB7CisJCQlsb2dfZXJyb3IoIlMgJXMgZmluZF9mcmVlX2xvY2tfc2FuIHJlYWQgZXJyb3IgJWQgb2Zmc2V0ICVsbHUiLAorCQkJCSAgbHMtPm5hbWUsIHJ2LCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghc3RyY21wKHJkLnJzLm5hbWUsICIjdW51c2VkIikpIHsKKwkJCWxvZ19kZWJ1ZygiUyAlcyBmaW5kX2ZyZWVfbG9ja19zYW4gZm91bmQgdW51c2VkIGFyZWEgYXQgJWxsdSIsCisJCQkJICBscy0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQpOworCQkJKmZyZWVfb2Zmc2V0ID0gb2Zmc2V0OworCQkJcmV0dXJuIDA7CisJCX0KKworCQlvZmZzZXQgKz0gbG1zLT5hbGlnbl9zaXplOworCX0KKworCXJldHVybiBydjsKK30KKworLyoKKyAqIGhvc3QgQTogc3RhcnRfdmcvYWRkX2xvY2tzcGFjZQorICogaG9zdCBCOiB2Z3JlbW92ZQorICoKKyAqIFRoZSBnbG9iYWwgbG9jayBjYW5ub3QgYWx3YXlzIGJlIGhlbGQgYXJvdW5kIHN0YXJ0X3ZnCisgKiBvbiBob3N0IEEgYmVjYXVzZSB0aGUgZ2wgaXMgaW4gYSB2ZyB0aGF0IG1heSBub3QgYmUKKyAqIHN0YXJ0ZWQgeWV0LCBvciBtYXkgYmUgaW4gdGhlIHZnIHdlIGFyZSBzdGFydGluZy4KKyAqCisgKiBJZiBCIHJlbW92ZXMgdGhlIHZnLCBkZXN0cm95aW5nIHRoZSBkZWx0YSBsZWFzZXMsCisgKiB3aGlsZSBBIGlzIGEgbG9ja3NwYWNlIG1lbWJlciwgaXQgd2lsbCBjYXVzZSBBJ3MKKyAqIHNhbmxvY2sgZGVsdGEgbGVhc2UgcmVuZXdhbCB0byBmYWlsLCBhbmQgbG9ja3NwYWNlCisgKiByZWNvdmVyeS4KKyAqCisgKiBJIGV4cGVjdCB0aGlzIG92ZXJsYXAgd291bGQgdXN1YWxseSBjYXVzZSBhIGZhaWx1cmUKKyAqIGluIHRoZSBhZGRfbG9ja3NwYWNlKCkgb24gaG9zdCBBIHdoZW4gaXQgc2VlcyB0aGF0CisgKiB0aGUgbG9ja3NwYWNlIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGNsb2JiZXJlZCBieSBCLgorICogSGF2aW5nIGFkZF9sb2Nrc3BhY2UoKSBmYWlsIHNob3VsZCBiZSBhIGZpbmUgcmVzdWx0LgorICoKKyAqIElmIGFkZF9sb2Nrc3BhY2Ugd2FzIHNvbWVob3cgYWJsZSB0byBmaW5pc2gsIHRoZQorICogc3Vic2VxdWVudCByZW5ld2FsIHdvdWxkIHByb2JhYmx5IGZhaWwgaW5zdGVhZC4KKyAqIFRoaXMgc2hvdWxkIGFsc28gbm90IGNyZWF0ZSBhbnkgbWFqb3IgcHJvYmxlbXMuCisgKi8KKworaW50IGxtX3ByZXBhcmVfbG9ja3NwYWNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGxtX3NhbmxvY2sgKmxtcyA9IE5VTEw7CisJY2hhciBsb2NrX2x2X25hbWVbTUFYX0FSR1MrMV07CisJY2hhciBsc25hbWVbU0FOTEtfTkFNRV9MRU4gKyAxXTsKKwljaGFyIGRpc2tfcGF0aFtTQU5MS19QQVRIX0xFTl07CisJY2hhciBraWxscGF0aFtTQU5MS19QQVRIX0xFTl07CisJY2hhciBraWxsYXJnc1tTQU5MS19QQVRIX0xFTl07CisJaW50IGdsX2ZvdW5kOworCWludCByZXQsIHJ2OworCisJbWVtc2V0KGRpc2tfcGF0aCwgMCwgc2l6ZW9mKGRpc2tfcGF0aCkpOworCW1lbXNldChsb2NrX2x2X25hbWUsIDAsIHNpemVvZihsb2NrX2x2X25hbWUpKTsKKworCS8qCisJICogQ29uc3RydWN0IHRoZSBwYXRoIHRvIGx2bWxvY2tjdGwgYnkgdXNpbmcgdGhlIHBhdGggdG8gdGhlIGx2bSBiaW5hcnkKKwkgKiBhbmQgYXBwZW5kaW5nICJsb2NrY3RsIiB0byBnZXQgL3BhdGgvdG8vbHZtbG9ja2N0bC4KKwkgKi8KKwltZW1zZXQoa2lsbHBhdGgsIDAsIHNpemVvZihraWxscGF0aCkpOworCXNucHJpbnRmKGtpbGxwYXRoLCBTQU5MS19QQVRIX0xFTiAtIDEsICIlc2xvY2tjdGwiLCBMVk1fUEFUSCk7CisKKwltZW1zZXQoa2lsbGFyZ3MsIDAsIHNpemVvZihraWxsYXJncykpOworCXNucHJpbnRmKGtpbGxhcmdzLCBTQU5MS19QQVRIX0xFTiAtIDEsICItLWtpbGwgJXMiLCBscy0+dmdfbmFtZSk7CisKKwlydiA9IGNoZWNrX2FyZ3NfdmVyc2lvbihscy0+dmdfYXJncywgVkdfTE9DS19BUkdTX01BSk9SKTsKKwlpZiAocnYgPCAwKSB7CisJCXJldCA9IC1FQVJHUzsKKwkJZ290byBmYWlsOworCX0KKworCXJ2ID0gbG9ja19sdl9uYW1lX2Zyb21fYXJncyhscy0+dmdfYXJncywgbG9ja19sdl9uYW1lKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBwcmVwYXJlX2xvY2tzcGFjZV9zYW4gbG9ja19sdl9uYW1lX2Zyb21fYXJncyBlcnJvciAlZCAlcyIsCisJCQkgIGxzLT5uYW1lLCBydiwgbHMtPnZnX2FyZ3MpOworCQlyZXQgPSAtRUFSR1M7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzbnByaW50ZihkaXNrX3BhdGgsIFNBTkxLX1BBVEhfTEVOLTEsICIvZGV2L21hcHBlci8lcy0lcyIsCisJCSBscy0+dmdfbmFtZSwgbG9ja19sdl9uYW1lKTsKKworCS8qCisJICogV2hlbiBhIHZnIGlzIHN0YXJ0ZWQsIHRoZSBpbnRlcm5hbCBzYW5sb2NrIGx2IHNob3VsZCBiZQorCSAqIGFjdGl2YXRlZCBiZWZvcmUgbHZtbG9ja2QgaXMgYXNrZWQgdG8gYWRkIHRoZSBsb2Nrc3BhY2UuCisJICogKHNhbmxvY2sgbmVlZHMgdG8gdXNlIHRoZSBsdi4pCisJICoKKwkgKiBJbiB0aGUgZnV0dXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYXNrIHNvbWV0aGluZyBvbiB0aGUgc3lzdGVtCisJICogdG8gYWN0aXZhdGUgdGhlIHNhbmxvY2sgbHYgZnJvbSBoZXJlLCBhbmQgd2l0aCB0aGF0IHdlIG1pZ2h0IGJlCisJICogYWJsZSB0byBzdGFydCBzYW5sb2NrIFZHcyB3aXRob3V0IHJlcXVpcmluZyBhCisJICogdmdjaGFuZ2UgLS1sb2NrLXN0YXJ0IGNvbW1hbmQuCisJICovCisKKwkvKiBGSVhNRTogZGV2aWNlIGlzIG5vdCBhbHdheXMgcmVhZHkgZm9yIHVzIGhlcmUgKi8KKwlzbGVlcCgxKTsKKworCXJ2ID0gc3RhdChkaXNrX3BhdGgsICZzdCk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgcHJlcGFyZV9sb2Nrc3BhY2Vfc2FuIHN0YXQgZXJyb3IgJWQgZGlza19wYXRoICVzIiwKKwkJCSAgbHMtPm5hbWUsIGVycm5vLCBkaXNrX3BhdGgpOworCQlyZXQgPSAtRUFSR1M7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWxzLT5ob3N0X2lkKSB7CisJCWlmIChkYWVtb25faG9zdF9pZCkKKwkJCWxzLT5ob3N0X2lkID0gZGFlbW9uX2hvc3RfaWQ7CisJCWVsc2UgaWYgKGRhZW1vbl9ob3N0X2lkX2ZpbGUpCisJCQlscy0+aG9zdF9pZCA9IHJlYWRfaG9zdF9pZF9maWxlKCk7CisJfQorCisJaWYgKCFscy0+aG9zdF9pZCB8fCBscy0+aG9zdF9pZCA+IDIwMDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiBpbnZhbGlkIGhvc3RfaWQgJWxsdSIsCisJCQkgIGxzLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWxzLT5ob3N0X2lkKTsKKwkJcmV0ID0gLUVIT1NUSUQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsbXMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbV9zYW5sb2NrKSk7CisJaWYgKCFsbXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW1lbXNldChsc25hbWUsIDAsIHNpemVvZihsc25hbWUpKTsKKwlzdHJuY3B5KGxzbmFtZSwgbHMtPm5hbWUsIFNBTkxLX05BTUVfTEVOKTsKKworCW1lbXNldChsbXMsIDAsIHNpemVvZihzdHJ1Y3QgbG1fc2FubG9jaykpOworCW1lbWNweShsbXMtPnNzLm5hbWUsIGxzbmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCWxtcy0+c3MuaG9zdF9pZF9kaXNrLm9mZnNldCA9IDA7CisJbG1zLT5zcy5ob3N0X2lkID0gbHMtPmhvc3RfaWQ7CisJc3RybmNweShsbXMtPnNzLmhvc3RfaWRfZGlzay5wYXRoLCBkaXNrX3BhdGgsIFNBTkxLX1BBVEhfTEVOLTEpOworCisJaWYgKGRhZW1vbl90ZXN0KSB7CisJCWlmICghZ2xfbHNuYW1lX3NhbmxvY2tbMF0pIHsKKwkJCXN0cm5jcHkoZ2xfbHNuYW1lX3NhbmxvY2ssIGxzbmFtZSwgTUFYX05BTUUpOworCQkJbG9nX2RlYnVnKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiB1c2UgZ2xvYmFsIGxvY2siLCBsc25hbWUpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWxtcy0+c29jayA9IHNhbmxvY2tfcmVnaXN0ZXIoKTsKKwlpZiAobG1zLT5zb2NrIDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgcHJlcGFyZV9sb2Nrc3BhY2Vfc2FuIHJlZ2lzdGVyIGVycm9yICVkIiwgbHNuYW1lLCBsbXMtPnNvY2spOworCQlsbXMtPnNvY2sgPSAwOworCQlyZXQgPSAtRU1BTkFHRVI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsb2dfZGVidWcoInNldCBraWxscGF0aCB0byAlcyAlcyIsIGtpbGxwYXRoLCBraWxsYXJncyk7CisKKwlydiA9IHNhbmxvY2tfa2lsbHBhdGgobG1zLT5zb2NrLCAwLCBraWxscGF0aCwga2lsbGFyZ3MpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIGtpbGxwYXRoIGVycm9yICVkIiwgbHNuYW1lLCBydik7CisJCXJldCA9IC1FTUFOQUdFUjsKKwkJZ290byBmYWlsOworCX0KKworCXJ2ID0gc2FubG9ja19yZXN0cmljdChsbXMtPnNvY2ssIFNBTkxLX1JFU1RSSUNUX1NJR0tJTEwpOworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHJlc3RyaWN0IGVycm9yICVkIiwgbHNuYW1lLCBydik7CisJCXJldCA9IC1FTUFOQUdFUjsKKwkJZ290byBmYWlsOworCX0KKworCWxtcy0+YWxpZ25fc2l6ZSA9IHNhbmxvY2tfYWxpZ24oJmxtcy0+c3MuaG9zdF9pZF9kaXNrKTsKKwlpZiAobG1zLT5hbGlnbl9zaXplIDw9IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiBhbGlnbiBlcnJvciAlZCIsIGxzbmFtZSwgbG1zLT5hbGlnbl9zaXplKTsKKwkJcmV0ID0gLUVNQU5BR0VSOworCQlnb3RvIGZhaWw7CisJfQorCisJZ2xfZm91bmQgPSBnbF9pc19lbmFibGVkKGxzLCBsbXMpOworCWlmIChnbF9mb3VuZCA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiBnbF9lbmFibGVkIGVycm9yICVkIiwgbHNuYW1lLCBnbF9mb3VuZCk7CisJCXJldCA9IC1FQVJHUzsKKwkJZ290byBmYWlsOworCX0KKworCWxzLT5zYW5sb2NrX2dsX2VuYWJsZWQgPSBnbF9mb3VuZDsKKworCWlmIChnbF9mb3VuZCkgeworCQlpZiAoZ2xfdXNlX2RsbSkgeworCQkJbG9nX2Vycm9yKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiBnbF91c2VfZGxtIGlzIHNldCIsIGxzbmFtZSk7CisJCX0gZWxzZSBpZiAoZ2xfbHNuYW1lX3NhbmxvY2tbMF0gJiYgc3RyY21wKGdsX2xzbmFtZV9zYW5sb2NrLCBsc25hbWUpKSB7CisJCQlsb2dfZXJyb3IoIlMgJXMgcHJlcGFyZV9sb2Nrc3BhY2Vfc2FuIG11bHRpcGxlIHNhbmxvY2sgZ2xvYmFsIGxvY2tzIGN1cnJlbnQgJXMiLAorCQkJCSAgbHNuYW1lLCBnbF9sc25hbWVfc2FubG9jayk7CisJCX0gZWxzZSB7CisJCQlzdHJuY3B5KGdsX2xzbmFtZV9zYW5sb2NrLCBsc25hbWUsIE1BWF9OQU1FKTsKKwkJCWxvZ19kZWJ1ZygiUyAlcyBwcmVwYXJlX2xvY2tzcGFjZV9zYW4gdXNlIGdsb2JhbCBsb2NrICVzIiwKKwkJCQkgIGxzbmFtZSwgZ2xfbHNuYW1lX3NhbmxvY2spOworCQl9CisJfQorCitvdXQ6CisJbHMtPmxtX2RhdGEgPSBsbXM7CisJbG9nX2RlYnVnKCJTICVzIHByZXBhcmVfbG9ja3NwYWNlX3NhbiBkb25lIiwgbHNuYW1lKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAobG1zICYmIGxtcy0+c29jaykKKwkJY2xvc2UobG1zLT5zb2NrKTsKKwlpZiAobG1zKQorCQlmcmVlKGxtcyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGxtX2FkZF9sb2Nrc3BhY2Vfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IGFkb3B0KQoreworCXN0cnVjdCBsbV9zYW5sb2NrICpsbXMgPSAoc3RydWN0IGxtX3NhbmxvY2sgKilscy0+bG1fZGF0YTsKKwlpbnQgcnY7CisKKwlpZiAoZGFlbW9uX3Rlc3QpIHsKKwkJc2xlZXAoMik7CisJCWdvdG8gb3V0OworCX0KKworCXJ2ID0gc2FubG9ja19hZGRfbG9ja3NwYWNlX3RpbWVvdXQoJmxtcy0+c3MsIDAsIHNhbmxvY2tfaW9fdGltZW91dCk7CisJaWYgKHJ2ID09IC1FRVhJU1QgJiYgYWRvcHQpIHsKKwkJLyogV2UgY291bGQgYWx0ZXJuYXRpdmVseSBqdXN0IHNraXAgdGhlIHNhbmxvY2sgY2FsbCBmb3IgYWRvcHQuICovCisJCWxvZ19kZWJ1ZygiUyAlcyBhZGRfbG9ja3NwYWNlX3NhbiBhZG9wdCBmb3VuZCBscyIsIGxzLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChydiA8IDApIHsKKwkJLyogcmV0cnkgZm9yIHNvbWUgZXJyb3JzPyAqLworCQlsb2dfZXJyb3IoIlMgJXMgYWRkX2xvY2tzcGFjZV9zYW4gYWRkX2xvY2tzcGFjZSBlcnJvciAlZCIsIGxzLT5uYW1lLCBydik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIERvbid0IGxldCB0aGUgbG9ja3NwYWNlIGJlIGNsZWFubHkgcmVsZWFzZWQgaWYgb3JwaGFuIGxvY2tzCisJICogZXhpc3QsIGJlY2F1c2UgdGhlIG9ycGhhbiBsb2NrcyBhcmUgc3RpbGwgcHJvdGVjdGluZyByZXNvdXJjZXMKKwkgKiB0aGF0IGFyZSBiZWluZyB1c2VkIG9uIHRoZSBob3N0LCBlLmcuIGFjdGl2ZSBsdnMuICBJZiB0aGUKKwkgKiBsb2Nrc3BhY2UgaXMgY2xlYW5seSByZWxlYXNlZCwgYW5vdGhlciBob3N0IGNvdWxkIGFjcXVpcmUgdGhlCisJICogb3JwaGFuIGxlYXNlcy4KKwkgKi8KKworCXJ2ID0gc2FubG9ja19zZXRfY29uZmlnKGxzLT5uYW1lLCAwLCBTQU5MS19DT05GSUdfVVNFRF9CWV9PUlBIQU5TLCBOVUxMKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBhZGRfbG9ja3NwYWNlX3NhbiBzZXRfY29uZmlnIGVycm9yICVkIiwgbHMtPm5hbWUsIHJ2KTsKKwkJc2FubG9ja19yZW1fbG9ja3NwYWNlKCZsbXMtPnNzLCAwKTsKKwkJZ290byBmYWlsOworCX0KKworb3V0OgorCWxvZ19kZWJ1ZygiUyAlcyBhZGRfbG9ja3NwYWNlX3NhbiBkb25lIiwgbHMtPm5hbWUpOworCXJldHVybiAwOworCitmYWlsOgorCWlmIChjbG9zZShsbXMtPnNvY2spKQorCQlsb2dfZXJyb3IoImZhaWxlZCB0byBjbG9zZSBzYW5sb2NrIGRhZW1vbiBzb2NrZXQgY29ubmVjdGlvbiIpOworCWZyZWUobG1zKTsKKwlscy0+bG1fZGF0YSA9IE5VTEw7CisJcmV0dXJuIHJ2OworfQorCitpbnQgbG1fcmVtX2xvY2tzcGFjZV9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBpbnQgZnJlZV92ZykKK3sKKwlzdHJ1Y3QgbG1fc2FubG9jayAqbG1zID0gKHN0cnVjdCBsbV9zYW5sb2NrICopbHMtPmxtX2RhdGE7CisJaW50IHJ2OworCisJaWYgKGRhZW1vbl90ZXN0KQorCQlnb3RvIG91dDsKKworCXJ2ID0gc2FubG9ja19yZW1fbG9ja3NwYWNlKCZsbXMtPnNzLCAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyByZW1fbG9ja3NwYWNlX3NhbiBlcnJvciAlZCIsIGxzLT5uYW1lLCBydik7CisJCXJldHVybiBydjsKKwl9CisKKwlpZiAoZnJlZV92ZykgeworCQkvKgorCQkgKiBEZXN0cm95IHNhbmxvY2sgbG9ja3NwYWNlIChkZWx0YSBsZWFzZXMpLiAgRm9yY2VzIGZhaWx1cmUgZm9yIGFueQorCQkgKiBvdGhlciBob3N0IHRoYXQgaXMgc3RpbGwgdXNpbmcgb3IgYXR0ZW1wdHMgdG8gdXNlIHRoaXMgbG9ja3NwYWNlLgorCQkgKiBUaGlzIHNob3VsZG4ndCBiZSBnZW5lcmFsbHkgbmVjZXNzYXJ5LCBidXQgdGhlcmUgbWF5IHNvbWUgcmFjZXMKKwkJICogYmV0d2VlbiBub2RlcyBzdGFydGluZyBhbmQgcmVtb3ZpbmcgYSB2ZyB3aGljaCB0aGlzIGNvdWxkIGhlbHAuCisJCSAqLworCQlzdHJuY3B5KGxtcy0+c3MubmFtZSwgIiN1bnVzZWQiLCBTQU5MS19OQU1FX0xFTik7CisKKwkJcnYgPSBzYW5sb2NrX3dyaXRlX2xvY2tzcGFjZSgmbG1zLT5zcywgMCwgMCwgc2FubG9ja19pb190aW1lb3V0KTsKKwkJaWYgKHJ2IDwgMCkgeworCQkJbG9nX2Vycm9yKCJTICVzIHJlbV9sb2Nrc3BhY2UgZnJlZV92ZyB3cml0ZV9sb2Nrc3BhY2UgZXJyb3IgJWQgJXMiLAorCQkJCSAgbHMtPm5hbWUsIHJ2LCBsbXMtPnNzLmhvc3RfaWRfZGlzay5wYXRoKTsKKwkJfQorCX0KKworCWlmIChjbG9zZShsbXMtPnNvY2spKQorCQlsb2dfZXJyb3IoImZhaWxlZCB0byBjbG9zZSBzYW5sb2NrIGRhZW1vbiBzb2NrZXQgY29ubmVjdGlvbiIpOworb3V0OgorCWZyZWUobG1zKTsKKwlscy0+bG1fZGF0YSA9IE5VTEw7CisKKwkvKiBGSVhNRTogc2hvdWxkIHdlIG9ubHkgY2xlYXIgZ2xfbHNuYW1lIHdoZW4gZG9pbmcgZnJlZV92Zz8gKi8KKworCWlmICghc3RyY21wKGxzLT5uYW1lLCBnbF9sc25hbWVfc2FubG9jaykpCisJCW1lbXNldChnbF9sc25hbWVfc2FubG9jaywgMCwgc2l6ZW9mKGdsX2xzbmFtZV9zYW5sb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbV9hZGRfcmVzb3VyY2Vfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgc3RydWN0IHJlc291cmNlICpyKQoreworCXN0cnVjdCBsbV9zYW5sb2NrICpsbXMgPSAoc3RydWN0IGxtX3NhbmxvY2sgKilscy0+bG1fZGF0YTsKKwlzdHJ1Y3QgcmRfc2FubG9jayAqcmRzID0gKHN0cnVjdCByZF9zYW5sb2NrICopci0+bG1fZGF0YTsKKworCXN0cm5jcHkocmRzLT5ycy5sb2Nrc3BhY2VfbmFtZSwgbHMtPm5hbWUsIFNBTkxLX05BTUVfTEVOKTsKKwlzdHJuY3B5KHJkcy0+cnMubmFtZSwgci0+bmFtZSwgU0FOTEtfTkFNRV9MRU4pOworCXJkcy0+cnMubnVtX2Rpc2tzID0gMTsKKwltZW1jcHkocmRzLT5ycy5kaXNrc1swXS5wYXRoLCBsbXMtPnNzLmhvc3RfaWRfZGlzay5wYXRoLCBTQU5MS19QQVRIX0xFTik7CisKKwlpZiAoci0+dHlwZSA9PSBMRF9SVF9HTCkKKwkJcmRzLT5ycy5kaXNrc1swXS5vZmZzZXQgPSBHTF9MT0NLX0JFR0lOICogbG1zLT5hbGlnbl9zaXplOworCWVsc2UgaWYgKHItPnR5cGUgPT0gTERfUlRfVkcpCisJCXJkcy0+cnMuZGlza3NbMF0ub2Zmc2V0ID0gVkdfTE9DS19CRUdJTiAqIGxtcy0+YWxpZ25fc2l6ZTsKKworCS8qIExEX1JUX0xWIG9mZnNldCBpcyBzZXQgaW4gZWFjaCBsbV9sb2NrIGNhbGwgZnJvbSBsdl9hcmdzLiAqLworCisJaWYgKHItPnR5cGUgPT0gTERfUlRfR0wgfHwgci0+dHlwZSA9PSBMRF9SVF9WRykgeworCQlyZHMtPnZiID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCQlpZiAoIXJkcy0+dmIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KHJkcy0+dmIsIDAsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbG1fcmVtX3Jlc291cmNlX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlzdHJ1Y3QgcmRfc2FubG9jayAqcmRzID0gKHN0cnVjdCByZF9zYW5sb2NrICopci0+bG1fZGF0YTsKKworCS8qIEZJWE1FOiBhc3NlcnQgci0+bW9kZSA9PSBVTiBvciB1bmxvY2sgaWYgaXQncyBub3Q/ICovCisKKwlpZiAocmRzLT52YikKKwkJZnJlZShyZHMtPnZiKTsKKworCW1lbXNldChyZHMsIDAsIHNpemVvZihzdHJ1Y3QgcmRfc2FubG9jaykpOworCXItPmxtX2luaXQgPSAwOworCXJldHVybiAwOworfQorCitpbnQgbG1fbG9ja19zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsIGludCBsZF9tb2RlLAorCQkgICAgc3RydWN0IHZhbF9ibGsgKnZiX291dCwgaW50ICpyZXRyeSwgaW50IGFkb3B0KQoreworCXN0cnVjdCBsbV9zYW5sb2NrICpsbXMgPSAoc3RydWN0IGxtX3NhbmxvY2sgKilscy0+bG1fZGF0YTsKKwlzdHJ1Y3QgcmRfc2FubG9jayAqcmRzID0gKHN0cnVjdCByZF9zYW5sb2NrICopci0+bG1fZGF0YTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKnJzOworCXN0cnVjdCBzYW5sa19vcHRpb25zIG9wdDsKKwl1aW50NjRfdCBsb2NrX2x2X29mZnNldDsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJc3RydWN0IHZhbF9ibGsgdmI7CisJaW50IGFkZGVkID0gMDsKKwlpbnQgcnY7CisKKwlpZiAoIXItPmxtX2luaXQpIHsKKwkJcnYgPSBsbV9hZGRfcmVzb3VyY2Vfc2FubG9jayhscywgcik7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gcnY7CisJCXItPmxtX2luaXQgPSAxOworCQlhZGRlZCA9IDE7CisJfQorCisJcnMgPSAmcmRzLT5yczsKKworCS8qCisJICogV2hpbGUgdGhlcmUgYXJlIGR1cGxpY2F0ZSBnbG9iYWwgbG9ja3MsIGtlZXAgY2hlY2tpbmcKKwkgKiB0byBzZWUgaWYgYW55IGhhdmUgYmVlbiBkaXNhYmxlZC4KKwkgKi8KKwlpZiAoc2FubG9ja19nbF9kdXAgJiYgbHMtPnNhbmxvY2tfZ2xfZW5hYmxlZCAmJgorCSAgICAoci0+dHlwZSA9PSBMRF9SVF9HTCB8fCByLT50eXBlID09IExEX1JUX1ZHKSkKKwkJbHMtPnNhbmxvY2tfZ2xfZW5hYmxlZCA9IGdsX2lzX2VuYWJsZWQobHMsIGxzLT5sbV9kYXRhKTsKKworCWlmIChyLT50eXBlID09IExEX1JUX0xWKSB7CisJCS8qCisJCSAqIFRoZSBsdiBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgYW5kIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGxlYXNlCisJCSAqIG9mZnNldCwgc28gd2UgbmVlZCB0byBnZXQgdGhlIG9mZnNldCBmcm9tIGx2X2FyZ3MgZWFjaCB0aW1lCisJCSAqIGluc3RlYWQgb2YgcmV1c2luZyB0aGUgdmFsdWUgdGhhdCB3ZSBsYXN0IHNldCBpbiByZHMtPnJzLgorCQkgKiBhY3QtPmx2X2FyZ3MgaXMgY29waWVkIHRvIHItPmx2X2FyZ3MgYmVmb3JlIGV2ZXJ5IGxtX2xvY2soKS4KKwkJICovCisKKwkJcnYgPSBjaGVja19hcmdzX3ZlcnNpb24oci0+bHZfYXJncywgTFZfTE9DS19BUkdTX01BSk9SKTsKKwkJaWYgKHJ2IDwgMCkgeworCQkJbG9nX2Vycm9yKCJTICVzIFIgJXMgbG9ja19zYW4gd3JvbmcgbHZfYXJncyB2ZXJzaW9uICVzIiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCByLT5sdl9hcmdzKTsKKwkJCXJldHVybiBydjsKKwkJfQorCisJCXJ2ID0gbG9ja19sdl9vZmZzZXRfZnJvbV9hcmdzKHItPmx2X2FyZ3MsICZsb2NrX2x2X29mZnNldCk7CisJCWlmIChydiA8IDApIHsKKwkJCWxvZ19lcnJvcigiUyAlcyBSICVzIGxvY2tfc2FuIGx2X29mZnNldF9mcm9tX2FyZ3MgZXJyb3IgJWQgJXMiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHJ2LCByLT5sdl9hcmdzKTsKKwkJCXJldHVybiBydjsKKwkJfQorCisJCWlmICghYWRkZWQgJiYgKHJkcy0+cnMuZGlza3NbMF0ub2Zmc2V0ICE9IGxvY2tfbHZfb2Zmc2V0KSkgeworCQkJbG9nX2RlYnVnKCJTICVzIFIgJXMgbG9ja19zYW4gb2Zmc2V0IG9sZCAlbGx1IG5ldyAlbGx1IiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZHMtPnJzLmRpc2tzWzBdLm9mZnNldCwKKwkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpbG9ja19sdl9vZmZzZXQpOworCQl9CisKKwkJcmRzLT5ycy5kaXNrc1swXS5vZmZzZXQgPSBsb2NrX2x2X29mZnNldDsKKwl9CisKKwlpZiAobGRfbW9kZSA9PSBMRF9MS19TSCkgeworCQlycy0+ZmxhZ3MgfD0gU0FOTEtfUkVTX1NIQVJFRDsKKwl9IGVsc2UgaWYgKGxkX21vZGUgPT0gTERfTEtfRVgpIHsKKwkJcnMtPmZsYWdzICY9IH5TQU5MS19SRVNfU0hBUkVEOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcigibG9ja19zYW4gaW52YWxpZCBtb2RlICVkIiwgbGRfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVXNlIFBFUlNJU1RFTlQgYmVjYXVzZSBpZiBsdm1sb2NrZCBleGl0cyB3aGlsZSBob2xkaW5nCisJICogYSBsb2NrLCBpdCdzIG5vdCBzYWZlIHRvIHNpbXBseSBjbGVhci9kcm9wIHRoZSBsb2NrIHdoaWxlCisJICogYSBjb21tYW5kIG9yIGx2IGlzIHVzaW5nIGl0LgorCSAqLworCisJcnMtPmZsYWdzIHw9IFNBTkxLX1JFU19QRVJTSVNURU5UOworCisJbG9nX2RlYnVnKCJTICVzIFIgJXMgbG9ja19zYW4gJXMgYXQgJXM6JWxsdSIsCisJCSAgbHMtPm5hbWUsIHItPm5hbWUsIG1vZGVfc3RyKGxkX21vZGUpLCBycy0+ZGlza3NbMF0ucGF0aCwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKXJzLT5kaXNrc1swXS5vZmZzZXQpOworCisJaWYgKGRhZW1vbl90ZXN0KSB7CisJCWlmIChyZHMtPnZiKSB7CisJCQl2Yl9vdXQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdShyZHMtPnZiLT52ZXJzaW9uKTsKKwkJCXZiX291dC0+ZmxhZ3MgPSBsZTE2X3RvX2NwdShyZHMtPnZiLT5mbGFncyk7CisJCQl2Yl9vdXQtPnJfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KHJkcy0+dmItPnJfdmVyc2lvbik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJkcy0+dmIpCisJCWZsYWdzIHw9IFNBTkxLX0FDUVVJUkVfTFZCOworCWlmIChhZG9wdCkKKwkJZmxhZ3MgfD0gU0FOTEtfQUNRVUlSRV9PUlBIQU5fT05MWTsKKworCS8qCisJICogRG9uJ3QgYmxvY2sgd2FpdGluZyBmb3IgYSBmYWlsZWQgbGVhc2UgdG8gZXhwaXJlIHNpbmNlIGl0IGNhdXNlcworCSAqIHNhbmxvY2tfYWNxdWlyZSB0byBibG9jayBmb3IgYSBsb25nIHRpbWUsIHdoaWNoIHdvdWxkIHByZXZlbnQgdGhpcworCSAqIHRocmVhZCBmcm9tIHByb2Nlc3Npbmcgb3RoZXIgbG9jayByZXF1ZXN0cy4KKwkgKi8KKwlmbGFncyB8PSBTQU5MS19BQ1FVSVJFX09XTkVSX05PV0FJVDsKKworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7CisJc3ByaW50ZihvcHQub3duZXJfbmFtZSwgIiVzIiwgImx2bWxvY2tkIik7CisKKwlydiA9IHNhbmxvY2tfYWNxdWlyZShsbXMtPnNvY2ssIC0xLCBmbGFncywgMSwgJnJzLCAmb3B0KTsKKworCWlmIChydiA9PSAtRUFHQUlOKSB7CisJCS8qCisJCSAqIEl0IGFwcGVhcnMgdGhhdCBzYW5sb2NrX2FjcXVpcmUgcmV0dXJucyBFQUdBSU4gd2hlbiB3ZSByZXF1ZXN0CisJCSAqIGEgc2hhcmVkIGxvY2sgYnV0IHRoZSBsb2NrIGlzIGhlbGQgZXggYnkgYW5vdGhlciBob3N0LgorCQkgKiBUaGVyZSdzIG5vIHBvaW50IGluIHJldHJ5aW5nIHRoaXMgY2FzZSwganVzdCByZXR1cm4gYW4gZXJyb3IuCisJCSAqLworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBsb2NrX3NhbiBhY3F1aXJlIG1vZGUgJWQgcnYgRUFHQUlOIiwgbHMtPm5hbWUsIHItPm5hbWUsIGxkX21vZGUpOworCQkqcmV0cnkgPSAwOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoKHJ2ID09IC1FTVNHU0laRSkgJiYgKHItPnR5cGUgPT0gTERfUlRfTFYpKSB7CisJCS8qCisJCSAqIHNhbmxvY2sgdHJpZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZGV2aWNlLAorCQkgKiBzbyB0aGUgb2Zmc2V0IG9mIHRoZSBsdiBsZWFzZSBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKwkJICogZGV2aWNlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBsZWFzZSBsdiB3YXMgZXh0ZW5kZWQsIGFuZAorCQkgKiB0aGUgbGVhc2UgZm9yIHRoaXMgbHYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgbmV3IHNwYWNlLgorCQkgKiBUaGUgbHZtIGNvbW1hbmQgd2lsbCBzZWUgdGhpcyBlcnJvciwgcmVmcmVzaCB0aGUgbHZtbG9jaworCQkgKiBsdiwgYW5kIHRyeSBhZ2Fpbi4KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGxvY2tfc2FuIGFjcXVpcmUgb2Zmc2V0ICVsbHUgcnYgRU1TR1NJWkUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylycy0+ZGlza3NbMF0ub2Zmc2V0KTsKKwkJKnJldHJ5ID0gMDsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwlpZiAoYWRvcHQgJiYgKHJ2ID09IC1FVUNMRUFOKSkgeworCQkvKgorCQkgKiBUaGUgb3JwaGFuIGxvY2sgZXhpc3RzIGJ1dCBpbiBhIGRpZmZlcmVudCBtb2RlIHRoYW4gd2UgYXNrZWQKKwkJICogZm9yLCBzbyB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4gd2l0aCB0aGUgb3RoZXIgbW9kZS4KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGxvY2tfc2FuIGFkb3B0IG1vZGUgJWQgdHJ5IG90aGVyIG1vZGUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgbGRfbW9kZSk7CisJCSpyZXRyeSA9IDA7CisJCXJldHVybiAtRVVDTEVBTjsKKwl9CisKKwlpZiAoYWRvcHQgJiYgKHJ2ID09IC1FTk9FTlQpKSB7CisJCS8qCisJCSAqIE5vIG9ycGhhbiBsb2NrIGV4aXN0cy4KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGxvY2tfc2FuIGFkb3B0IG1vZGUgJWQgbm8gb3JwaGFuIGZvdW5kIiwKKwkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIGxkX21vZGUpOworCQkqcmV0cnkgPSAwOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAocnYgPT0gU0FOTEtfQUNRVUlSRV9JRExJVkUgfHwgcnYgPT0gU0FOTEtfQUNRVUlSRV9PV05FRCB8fCBydiA9PSBTQU5MS19BQ1FVSVJFX09USEVSKSB7CisJCS8qCisJCSAqIFRoZSBsb2NrIGlzIGhlbGQgYnkgYW5vdGhlciBob3N0LiAgVGhlc2UgZmFpbHVyZXMgY2FuCisJCSAqIGhhcHBlbiB3aGlsZSBtdWx0aXBsZSBob3N0cyBhcmUgY29uY3VycmVudGx5IGFjcXVpcmluZworCQkgKiBzaGFyZWQgbG9ja3MuICBXZSB3YW50IHRvIHJldHJ5IGEgY291cGxlIHRpbWVzIGluIHRoaXMKKwkJICogY2FzZSBiZWNhdXNlIHdlJ2xsIHByb2JhYmx5IGdldCB0aGUgc2ggbG9jay4KKwkJICoKKwkJICogSSBiZWxpZXZlIHRoZXNlIGFyZSBhbHNvIHRoZSBlcnJvcnMgd2hlbiByZXF1ZXN0aW5nIGFuCisJCSAqIGV4IGxvY2sgdGhhdCBhbm90aGVyIGhvc3QgaG9sZHMgZXguICBXZSB3YW50IHRvIHJlcG9ydAorCQkgKiBzb21ldGhpbmcgbGlrZTogImxvY2sgaXMgaGVsZCBieSBhbm90aGVyIGhvc3QiIGluIHRoaXMgY2FzZS4KKwkJICogUmV0cnkgaXMgcG9pbnRsZXNzIGhlcmUuCisJCSAqCisJCSAqIFdlIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBjYXNlcyBhYm92ZSwKKwkJICogc28gaWYgcmVxdWVzdGluZyBhIHNoIGxvY2ssIHJldHJ5IGEgY291cGxlIHRpbWVzLAorCQkgKiBvdGhlcndpc2UgZG9uJ3QuCisJCSAqLworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyBsb2NrX3NhbiBhY3F1aXJlIG1vZGUgJWQgcnYgJWQiLCBscy0+bmFtZSwgci0+bmFtZSwgbGRfbW9kZSwgcnYpOworCQkqcmV0cnkgPSAobGRfbW9kZSA9PSBMRF9MS19TSCkgPyAxIDogMDsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaWYgKHJ2ID09IFNBTkxLX0FDUVVJUkVfT1dORURfUkVUUlkpIHsKKwkJLyoKKwkJICogVGhlIGxvY2sgaXMgaGVsZCBieSBhIGZhaWxlZCBob3N0LCBhbmQgd2lsbCBldmVudHVhbGx5CisJCSAqIGV4cGlyZS4gIElmIHdlIHJldHJ5IHdlJ2xsIGV2ZW50dWFsbHkgYWNxdWlyZSB0aGUgbG9jaworCQkgKiAob3IgZmluZCBzb21lb25lIGVsc2UgaGFzIGFjcXVpcmVkIGl0KS4gIFRoZSBFQUdBSU4gcmV0cnkKKwkJICogYXR0ZW1wdHMgZm9yIFNIIGxvY2tzIGFib3ZlIHdvdWxkIG5vdCBiZSBzdWZmaWNpZW50IGZvcgorCQkgKiB0aGUgbGVuZ3RoIG9mIGV4cGlyYXRpb24gdGltZS4gIFdlIGNvdWxkIGFkZCBhIGxvbmdlcgorCQkgKiByZXRyeSB0aW1lIGhlcmUgdG8gY292ZXIgdGhlIGZ1bGwgZXhwaXJhdGlvbiB0aW1lIGFuZCBibG9jaworCQkgKiB0aGUgYWN0aXZhdGlvbiBjb21tYW5kIGZvciB0aGF0IGxvbmcuICBGb3Igbm93IGp1c3QgcmV0dXJuCisJCSAqIHRoZSBzdGFuZGFyZCBlcnJvciBpbmRpY2F0aW5nIHRoYXQgYW5vdGhlciBob3N0IHN0aWxsIG93bnMKKwkJICogdGhlIGxlYXNlLiAgRklYTUU6IHJldHVybiBhIGRpZmZlcmVudCBlcnJvciBudW1iZXIgc28gdGhlCisJCSAqIGNvbW1hbmQgY2FuIHByaW50IGFuIGRpZmZlcmVudCBlcnJvciBpbmRpY2F0aW5nIHRoYXQgdGhlCisJCSAqIG93bmVyIG9mIHRoZSBsZWFzZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBleHBpcmluZz8KKwkJICovCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGxvY2tfc2FuIGFjcXVpcmUgbW9kZSAlZCBydiAlZCIsIGxzLT5uYW1lLCByLT5uYW1lLCBsZF9tb2RlLCBydik7CisJCSpyZXRyeSA9IDA7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgbG9ja19zYW4gYWNxdWlyZSBlcnJvciAlZCIsCisJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisKKwkJLyogaWYgdGhlIGdsIGhhcyBiZWVuIGRpc2FibGVkLCByZW1vdmUgYW5kIGZyZWUgdGhlIGdsIHJlc291cmNlICovCisJCWlmICgocnYgPT0gU0FOTEtfTEVBREVSX1JFU09VUkNFKSAmJiAoci0+dHlwZSA9PSBMRF9SVF9HTCkpIHsKKwkJCWlmICghbG1fZ2xfaXNfZW5hYmxlZChscykpIHsKKwkJCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBsb2NrX3NhbiBnbCBoYXMgYmVlbiBkaXNhYmxlZCIsCisJCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUpOworCQkJCWlmICghc3RyY21wKGdsX2xzbmFtZV9zYW5sb2NrLCBscy0+bmFtZSkpCisJCQkJCW1lbXNldChnbF9sc25hbWVfc2FubG9jaywgMCwgc2l6ZW9mKGdsX2xzbmFtZV9zYW5sb2NrKSk7CisJCQkJcmV0dXJuIC1FVU5BVENIOworCQkJfQorCQl9CisKKwkJaWYgKGFkZGVkKQorCQkJbG1fcmVtX3Jlc291cmNlX3NhbmxvY2sobHMsIHIpOworCisJCS8qIHNhbmxvY2sgZ2V0cyBpL28gZXJyb3JzIHRyeWluZyB0byByZWFkL3dyaXRlIHRoZSBsZWFzZXMuICovCisJCWlmIChydiA9PSAtRUlPKQorCQkJcnYgPSAtRUxPQ0tJTzsKKworCQkvKgorCQkgKiBUaGUgc2FubG9jayBsb2Nrc3BhY2UgY2FuIGRpc2FwcGVhciBpZiB0aGUgbGVhc2Ugc3RvcmFnZSBmYWlscywKKwkJICogdGhlIGRlbHRhIGxlYXNlIHJlbmV3YWxzIGZhaWwsIHRoZSBsb2Nrc3BhY2UgZW50ZXJzIHJlY292ZXJ5LAorCQkgKiBsdm1sb2NrZCBob2xkcyBubyBsZWFzZXMgaW4gdGhlIGxvY2tzcGFjZSwgc28gc2FubG9jayBjYW4KKwkJICogc3RvcCBhbmQgZnJlZSB0aGUgbG9ja3NwYWNlLgorCQkgKi8KKwkJaWYgKHJ2ID09IC1FTk9TUEMpCisJCQlydiA9IC1FTE9DS0lPOworCisJCXJldHVybiBydjsKKwl9CisKKwlpZiAocmRzLT52YikgeworCQlydiA9IHNhbmxvY2tfZ2V0X2x2YigwLCBycywgKGNoYXIgKikmdmIsIHNpemVvZih2YikpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBsb2NrX3NhbiBnZXRfbHZiIGVycm9yICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKwkJCW1lbXNldChyZHMtPnZiLCAwLCBzaXplb2Yoc3RydWN0IHZhbF9ibGspKTsKKwkJCW1lbXNldCh2Yl9vdXQsIDAsIHNpemVvZihzdHJ1Y3QgdmFsX2JsaykpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiAndmInIGNvbnRhaW5zIGRpc2sgZW5kaWFuIHZhbHVlcywgbm90IGhvc3QgZW5kaWFuLgorCQkgKiBJdCBpcyBjb3BpZWQgZGlyZWN0bHkgdG8gcnJzLT52YiB3aGljaCBpcyBhbHNvIGtlcHQKKwkJICogaW4gZGlzayBlbmRpYW4gZm9ybS4KKwkJICogdmJfb3V0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgaW4gaG9zdCBlbmRpYW4gZm9ybS4KKwkJICovCisKKwkJbWVtY3B5KHJkcy0+dmIsICZ2Yiwgc2l6ZW9mKHZiKSk7CisKKwkJdmJfb3V0LT52ZXJzaW9uID0gbGUxNl90b19jcHUodmIudmVyc2lvbik7CisJCXZiX291dC0+ZmxhZ3MgPSBsZTE2X3RvX2NwdSh2Yi5mbGFncyk7CisJCXZiX291dC0+cl92ZXJzaW9uID0gbGUzMl90b19jcHUodmIucl92ZXJzaW9uKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJ2OworfQorCitpbnQgbG1fY29udmVydF9zYW5sb2NrKHN0cnVjdCBsb2Nrc3BhY2UgKmxzLCBzdHJ1Y3QgcmVzb3VyY2UgKnIsCisJCSAgICAgICBpbnQgbGRfbW9kZSwgdWludDMyX3Qgcl92ZXJzaW9uKQoreworCXN0cnVjdCBsbV9zYW5sb2NrICpsbXMgPSAoc3RydWN0IGxtX3NhbmxvY2sgKilscy0+bG1fZGF0YTsKKwlzdHJ1Y3QgcmRfc2FubG9jayAqcmRzID0gKHN0cnVjdCByZF9zYW5sb2NrICopci0+bG1fZGF0YTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKnJzID0gJnJkcy0+cnM7CisJc3RydWN0IHZhbF9ibGsgdmI7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCWludCBydjsKKworCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGNvbnZlcnRfc2FuICVzIHRvICVzIiwKKwkJICBscy0+bmFtZSwgci0+bmFtZSwgbW9kZV9zdHIoci0+bW9kZSksIG1vZGVfc3RyKGxkX21vZGUpKTsKKworCWlmIChkYWVtb25fdGVzdCkKKwkJZ290byByc19mbGFnOworCisJaWYgKHJkcy0+dmIgJiYgcl92ZXJzaW9uICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCQlpZiAoIXJkcy0+dmItPnZlcnNpb24pIHsKKwkJCS8qIGZpcnN0IHRpbWUgdmIgaGFzIGJlZW4gd3JpdHRlbiAqLworCQkJcmRzLT52Yi0+dmVyc2lvbiA9IGNwdV90b19sZTE2KFZBTF9CTEtfVkVSU0lPTik7CisJCX0KKwkJaWYgKHJfdmVyc2lvbikKKwkJCXJkcy0+dmItPnJfdmVyc2lvbiA9IGNwdV90b19sZTMyKHJfdmVyc2lvbik7CisJCW1lbWNweSgmdmIsIHJkcy0+dmIsIHNpemVvZih2YikpOworCisJCWxvZ19kZWJ1ZygiUyAlcyBSICVzIGNvbnZlcnRfc2FuIHNldCByX3ZlcnNpb24gJXUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgcl92ZXJzaW9uKTsKKworCQlydiA9IHNhbmxvY2tfc2V0X2x2YigwLCBycywgKGNoYXIgKikmdmIsIHNpemVvZih2YikpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBjb252ZXJ0X3NhbiBzZXRfbHZiIGVycm9yICVkIiwKKwkJCQkgIGxzLT5uYW1lLCByLT5uYW1lLCBydik7CisJCX0KKwl9CisKKyByc19mbGFnOgorCWlmIChsZF9tb2RlID09IExEX0xLX1NIKQorCQlycy0+ZmxhZ3MgfD0gU0FOTEtfUkVTX1NIQVJFRDsKKwllbHNlCisJCXJzLT5mbGFncyAmPSB+U0FOTEtfUkVTX1NIQVJFRDsKKworCWlmIChkYWVtb25fdGVzdCkKKwkJcmV0dXJuIDA7CisKKwlydiA9IHNhbmxvY2tfY29udmVydChsbXMtPnNvY2ssIC0xLCBmbGFncywgcnMpOworCWlmIChydiA9PSAtRUFHQUlOKSB7CisJCS8qIEZJWE1FOiBXaGVuIGNvdWxkIHRoaXMgaGFwcGVuPyAgU2hvdWxkIHNvbWV0aGluZyBkaWZmZXJlbnQgYmUgZG9uZT8gKi8KKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgY29udmVydF9zYW4gRUFHQUlOIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyBjb252ZXJ0X3NhbiBjb252ZXJ0IGVycm9yICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgcmVsZWFzZV9yZW5hbWUoc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlzdHJ1Y3QgcmRfc2FubG9jayByZDE7CisJc3RydWN0IHJkX3NhbmxvY2sgcmQyOworCXN0cnVjdCBzYW5sa19yZXNvdXJjZSAqcmVzMTsKKwlzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKnJlczI7CisJc3RydWN0IHNhbmxrX3Jlc291cmNlICoqcmVzX2FyZ3M7CisJc3RydWN0IGxtX3NhbmxvY2sgKmxtcyA9IChzdHJ1Y3QgbG1fc2FubG9jayAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9zYW5sb2NrICpyZHMgPSAoc3RydWN0IHJkX3NhbmxvY2sgKilyLT5sbV9kYXRhOworCWludCBydjsKKworCWxvZ19kZWJ1ZygiUyAlcyBSICVzIHJlbGVhc2UgcmVuYW1lIiwgbHMtPm5hbWUsIHItPm5hbWUpOworCisJcmVzX2FyZ3MgPSBtYWxsb2MoMiAqIHNpemVvZihzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKikpOworCWlmICghcmVzX2FyZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KCZyZDEsIHJkcywgc2l6ZW9mKHN0cnVjdCByZF9zYW5sb2NrKSk7CisJbWVtY3B5KCZyZDIsIHJkcywgc2l6ZW9mKHN0cnVjdCByZF9zYW5sb2NrKSk7CisKKwlyZXMxID0gKHN0cnVjdCBzYW5sa19yZXNvdXJjZSAqKSZyZDE7CisJcmVzMiA9IChzdHJ1Y3Qgc2FubGtfcmVzb3VyY2UgKikmcmQyOworCisJc3RyY3B5KHJlczItPm5hbWUsICJpbnZhbGlkX3JlbW92ZWQiKTsKKworCXJlc19hcmdzWzBdID0gcmVzMTsKKwlyZXNfYXJnc1sxXSA9IHJlczI7CisKKwlydiA9IHNhbmxvY2tfcmVsZWFzZShsbXMtPnNvY2ssIC0xLCBTQU5MS19SRUxfUkVOQU1FLCAyLCByZXNfYXJncyk7CisJaWYgKHJ2IDwgMCkgeworCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyB1bmxvY2tfc2FuIHJlbGVhc2UgcmVuYW1lIGVycm9yICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKwl9CisKKwlmcmVlKHJlc19hcmdzKTsKKworCXJldHVybiBydjsKK30KKworLyoKKyAqIHJkcy0+dmIgaXMgc3RvcmVkIGluIGxlCisgKiAKKyAqIHJfdmVyc2lvbiBpcyByLT52ZXJzaW9uCisgKgorICogZm9yIEdMIGxvY2tzIGx2bWxvY2tkIGp1c3QgaW5jcmVtZW50cyB0aGlzIHZhbHVlCisgKiBlYWNoIHRpbWUgdGhlIGdsb2JhbCBsb2NrIGlzIHJlbGVhc2VkIGZyb20gZXguCisgKgorICogZm9yIFZHIGxvY2tzIGl0IGlzIHRoZSBzZXFubyBmcm9tIHRoZSB2ZyBtZXRhZGF0YS4KKyAqLworCitpbnQgbG1fdW5sb2NrX3NhbmxvY2soc3RydWN0IGxvY2tzcGFjZSAqbHMsIHN0cnVjdCByZXNvdXJjZSAqciwKKwkJICAgICAgdWludDMyX3Qgcl92ZXJzaW9uLCB1aW50MzJfdCBsbXVfZmxhZ3MpCit7CisJc3RydWN0IGxtX3NhbmxvY2sgKmxtcyA9IChzdHJ1Y3QgbG1fc2FubG9jayAqKWxzLT5sbV9kYXRhOworCXN0cnVjdCByZF9zYW5sb2NrICpyZHMgPSAoc3RydWN0IHJkX3NhbmxvY2sgKilyLT5sbV9kYXRhOworCXN0cnVjdCBzYW5sa19yZXNvdXJjZSAqcnMgPSAmcmRzLT5yczsKKwlzdHJ1Y3QgdmFsX2JsayB2YjsKKwlpbnQgcnY7CisKKwlsb2dfZGVidWcoIlMgJXMgUiAlcyB1bmxvY2tfc2FuICVzIHJfdmVyc2lvbiAldSBmbGFncyAleCIsCisJCSAgbHMtPm5hbWUsIHItPm5hbWUsIG1vZGVfc3RyKHItPm1vZGUpLCByX3ZlcnNpb24sIGxtdV9mbGFncyk7CisKKwlpZiAoZGFlbW9uX3Rlc3QpIHsKKwkJaWYgKHJkcy0+dmIgJiYgcl92ZXJzaW9uICYmIChyLT5tb2RlID09IExEX0xLX0VYKSkgeworCQkJaWYgKCFyZHMtPnZiLT52ZXJzaW9uKQorCQkJCXJkcy0+dmItPnZlcnNpb24gPSBjcHVfdG9fbGUxNihWQUxfQkxLX1ZFUlNJT04pOworCQkJaWYgKHJfdmVyc2lvbikKKwkJCQlyZHMtPnZiLT5yX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihyX3ZlcnNpb24pOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChyZHMtPnZiICYmIHJfdmVyc2lvbiAmJiAoci0+bW9kZSA9PSBMRF9MS19FWCkpIHsKKwkJaWYgKCFyZHMtPnZiLT52ZXJzaW9uKSB7CisJCQkvKiBmaXJzdCB0aW1lIHZiIGhhcyBiZWVuIHdyaXR0ZW4gKi8KKwkJCXJkcy0+dmItPnZlcnNpb24gPSBjcHVfdG9fbGUxNihWQUxfQkxLX1ZFUlNJT04pOworCQl9CisJCWlmIChyX3ZlcnNpb24pCisJCQlyZHMtPnZiLT5yX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihyX3ZlcnNpb24pOworCQltZW1jcHkoJnZiLCByZHMtPnZiLCBzaXplb2YodmIpKTsKKworCQlsb2dfZGVidWcoIlMgJXMgUiAlcyB1bmxvY2tfc2FuIHNldCByX3ZlcnNpb24gJXUiLAorCQkJICBscy0+bmFtZSwgci0+bmFtZSwgcl92ZXJzaW9uKTsKKworCQlydiA9IHNhbmxvY2tfc2V0X2x2YigwLCBycywgKGNoYXIgKikmdmIsIHNpemVvZih2YikpOworCQlpZiAocnYgPCAwKSB7CisJCQlsb2dfZXJyb3IoIlMgJXMgUiAlcyB1bmxvY2tfc2FuIHNldF9sdmIgZXJyb3IgJWQiLAorCQkJCSAgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKwkJfQorCX0KKworCS8qCisJICogRm9yIHZncmVtb3ZlIChGUkVFX1ZHKSB3ZSB1bmxvY2stcmVuYW1lIHRoZSB2ZyBhbmQgZ2wgbG9ja3MKKwkgKiBzbyB0aGV5IGNhbm5vdCBiZSByZWFjcXVpcmVkLgorCSAqLworCWlmICgobG11X2ZsYWdzICYgTE1VRl9GUkVFX1ZHKSAmJgorCSAgICAoci0+dHlwZSA9PSBMRF9SVF9HTCB8fCByLT50eXBlID09IExEX1JUX1ZHKSkgeworCQlyZXR1cm4gcmVsZWFzZV9yZW5hbWUobHMsIHIpOworCX0KKworCXJ2ID0gc2FubG9ja19yZWxlYXNlKGxtcy0+c29jaywgLTEsIDAsIDEsICZycyk7CisJaWYgKHJ2IDwgMCkKKwkJbG9nX2Vycm9yKCJTICVzIFIgJXMgdW5sb2NrX3NhbiByZWxlYXNlIGVycm9yICVkIiwgbHMtPm5hbWUsIHItPm5hbWUsIHJ2KTsKKworCWlmIChydiA9PSAtRUlPKQorCQlydiA9IC1FTE9DS0lPOworCisJcmV0dXJuIHJ2OworfQorCitpbnQgbG1faG9zdHNfc2FubG9jayhzdHJ1Y3QgbG9ja3NwYWNlICpscywgaW50IG5vdGlmeSkKK3sKKwlzdHJ1Y3Qgc2FubGtfaG9zdCAqaHNzID0gTlVMTDsKKwlzdHJ1Y3Qgc2FubGtfaG9zdCAqaHM7CisJdWludDMyX3Qgc3RhdGU7CisJaW50IGhzc19jb3VudCA9IDA7CisJaW50IGZvdW5kX3NlbGYgPSAwOworCWludCBmb3VuZF9vdGhlcnMgPSAwOworCWludCBpLCBydjsKKworCWlmIChkYWVtb25fdGVzdCkKKwkJcmV0dXJuIDA7CisKKwlydiA9IHNhbmxvY2tfZ2V0X2hvc3RzKGxzLT5uYW1lLCAwLCAmaHNzLCAmaHNzX2NvdW50LCAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWxvZ19lcnJvcigiUyAlcyBob3N0c19zYW4gZ2V0X2hvc3RzIGVycm9yICVkIiwgbHMtPm5hbWUsIHJ2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFoc3MgfHwgIWhzc19jb3VudCkgeworCQlsb2dfZXJyb3IoIlMgJXMgaG9zdHNfc2FuIHplcm8gaG9zdHMiLCBscy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWhzID0gaHNzOworCisJZm9yIChpID0gMDsgaSA8IGhzc19jb3VudDsgaSsrKSB7CisJCWxvZ19kZWJ1ZygiUyAlcyBob3N0c19zYW4gaG9zdF9pZCAlbGx1IGdlbiAlbGx1IGZsYWdzICV4IiwKKwkJCSAgbHMtPm5hbWUsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaHMtPmhvc3RfaWQsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaHMtPmdlbmVyYXRpb24sCisJCQkgIGhzLT5mbGFncyk7CisKKwkJaWYgKGhzLT5ob3N0X2lkID09IGxzLT5ob3N0X2lkKSB7CisJCQlmb3VuZF9zZWxmID0gMTsKKwkJCWhzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN0YXRlID0gaHMtPmZsYWdzICYgU0FOTEtfSE9TVF9NQVNLOworCQlpZiAoc3RhdGUgPT0gU0FOTEtfSE9TVF9MSVZFKQorCQkJZm91bmRfb3RoZXJzKys7CisJCWhzKys7CisJfQorCWZyZWUoaHNzKTsKKworCWlmIChmb3VuZF9vdGhlcnMgJiYgbm90aWZ5KSB7CisJCS8qCisJCSAqIFdlIGNvdWxkIHVzZSB0aGUgc2FubG9jayBldmVudCBtZWNoYW5pc20gdG8gbm90aWZ5IGx2bWxvY2tkCisJCSAqIG9uIG90aGVyIGhvc3RzIHRvIHN0b3AgdGhpcyBWRy4gIGx2bWxvY2tkIHdvdWxkIG5lZWQgdG8KKwkJICogcmVnaXN0ZXIgZm9yIGFuZCBsaXN0ZW4gZm9yIHNhbmxvY2sgZXZlbnRzIGluIHRoZSBtYWluIGxvb3AuCisJCSAqIFRoZSBldmVudHMgYXJlIHNsb3cgdG8gcHJvcGFnYXRlLiAgV2UnZCBuZWVkIHRvIHJldHJ5IGZvciBhCisJCSAqIHdoaWxlIGJlZm9yZSBhbGwgdGhlIGhvc3RzIHNlZSB0aGUgZXZlbnQgYW5kIHN0b3AgdGhlIFZHLgorCQkgKiBzYW5sb2NrX3NldF9ldmVudChscy0+bmFtZSwgJmhlLCBTQU5MS19TRVRFVl9BTExfSE9TVFMpOworCQkgKgorCQkgKiBXYWl0IHRvIHRyeSB0aGlzIHVudGlsIHRoZXJlIGFwcGVhcnMgdG8gYmUgcmVhbCB2YWx1ZS9pbnRlcmVzdAorCQkgKiBpbiBkb2luZyBpdC4KKwkJICovCisJfQorCisJaWYgKCFmb3VuZF9zZWxmKSB7CisJCWxvZ19lcnJvcigiUyAlcyBob3N0c19zYW4gc2VsZiBub3QgZm91bmQgb3RoZXJzICVkIiwgbHMtPm5hbWUsIGZvdW5kX290aGVycyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBmb3VuZF9vdGhlcnM7Cit9CisKK2ludCBsbV9nZXRfbG9ja3NwYWNlc19zYW5sb2NrKHN0cnVjdCBsaXN0X2hlYWQgKmxzX3Jlam9pbikKK3sKKwlzdHJ1Y3Qgc2FubGtfbG9ja3NwYWNlICpzc19hbGwgPSBOVUxMOworCXN0cnVjdCBzYW5sa19sb2Nrc3BhY2UgKnNzOworCXN0cnVjdCBsb2Nrc3BhY2UgKmxzOworCWludCBzc19jb3VudCA9IDA7CisJaW50IGksIHJ2OworCisJcnYgPSBzYW5sb2NrX2dldF9sb2Nrc3BhY2VzKCZzc19hbGwsICZzc19jb3VudCwgMCk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIHJ2OworCisJaWYgKCFzc19hbGwgfHwgIXNzX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXNzID0gc3NfYWxsOworCisJZm9yIChpID0gMDsgaSA8IHNzX2NvdW50OyBpKyspIHsKKworCQlpZiAoc3RybmNtcChzcy0+bmFtZSwgTFZNX0xTX1BSRUZJWCwgc3RybGVuKExWTV9MU19QUkVGSVgpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGxzID0gYWxsb2NfbG9ja3NwYWNlKCkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbHMtPmxtX3R5cGUgPSBMRF9MTV9TQU5MT0NLOworCQlscy0+aG9zdF9pZCA9IHNzLT5ob3N0X2lkOworCQlzdHJuY3B5KGxzLT5uYW1lLCBzcy0+bmFtZSwgTUFYX05BTUUpOworCQlzdHJuY3B5KGxzLT52Z19uYW1lLCBzcy0+bmFtZSArIHN0cmxlbihMVk1fTFNfUFJFRklYKSwgTUFYX05BTUUpOworCQlsaXN0X2FkZF90YWlsKCZscy0+bGlzdCwgbHNfcmVqb2luKTsKKworCQlzcysrOworCX0KKworCWZyZWUoc3NfYWxsKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxtX2lzX3J1bm5pbmdfc2FubG9jayh2b2lkKQoreworCXVpbnQzMl90IGRhZW1vbl92ZXJzaW9uOworCXVpbnQzMl90IGRhZW1vbl9wcm90bzsKKwlpbnQgcnY7CisKKwlpZiAoZGFlbW9uX3Rlc3QpCisJCXJldHVybiBnbF91c2Vfc2FubG9jazsKKworCXJ2ID0gc2FubG9ja192ZXJzaW9uKDAsICZkYWVtb25fdmVyc2lvbiwgJmRhZW1vbl9wcm90byk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkLy5naXRpZ25vcmUgYi9kYWVtb25zL2x2bXBvbGxkLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmYWQwYQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtcG9sbGQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitsdm1wb2xsZApkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1wb2xsZC9NYWtlZmlsZS5pbiBiL2RhZW1vbnMvbHZtcG9sbGQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtcG9sbGQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0OCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IGx2bXBvbGxkLWNvcmUuYyBsdm1wb2xsZC1kYXRhLXV0aWxzLmMgbHZtcG9sbGQtY21kLXV0aWxzLmMKKworVEFSR0VUUyA9IGx2bXBvbGxkCisKKy5QSE9OWTogaW5zdGFsbF9sdm1wb2xsZAorCitDRkxPV19MSVNUID0gJChTT1VSQ0VTKQorQ0ZMT1dfTElTVF9UQVJHRVQgPSAkKExJQl9OQU1FKS5jZmxvdworQ0ZMT1dfVEFSR0VUID0gbHZtcG9sbGQKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK0lOQ0xVREVTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWJkYWVtb24vc2VydmVyCitMVk1MSUJTID0gLWxkYWVtb25zZXJ2ZXIgJChMVk1JTlRFUk5BTF9MSUJTKSAtbGRldm1hcHBlcgorCitMSUJTICs9ICQoUFRIUkVBRF9MSUJTKQorCitMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9zZXJ2ZXIgJChEQUVNT05fTERGTEFHUykKK0NMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9zZXJ2ZXIKK0NGTEFHUyArPSAkKERBRU1PTl9DRkxBR1MpCisKK2x2bXBvbGxkOiAkKE9CSkVDVFMpICQodG9wX2J1aWxkZGlyKS9saWJkYWVtb24vY2xpZW50L2xpYmRhZW1vbmNsaWVudC5hIFwKKwkJICAgICQodG9wX2J1aWxkZGlyKS9saWJkYWVtb24vc2VydmVyL2xpYmRhZW1vbnNlcnZlci5hCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJChPQkpFQ1RTKSAkKExWTUxJQlMpICQoTElCUykKKworaW5zdGFsbF9sdm1wb2xsZDogbHZtcG9sbGQKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChzYmluZGlyKS8kKDxGKQorCitpbnN0YWxsX2x2bTI6IGluc3RhbGxfbHZtcG9sbGQKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWNtZC11dGlscy5jIGIvZGFlbW9ucy9sdm1wb2xsZC9sdm1wb2xsZC1jbWQtdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBmZDBkCi0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1wb2xsZC9sdm1wb2xsZC1jbWQtdXRpbHMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibHZtcG9sbGQtY29tbW9uLmgiCisKKy8qIGV4dHJhY3QgdGhpcyBpbmZvIGZyb20gYXV0b2NvbmYvYXV0b21ha2UgZmlsZXMgKi8KKyNkZWZpbmUgTFZQT0xMX0NNRCAibHZwb2xsIgorCisjZGVmaW5lIE1JTl9BUkdWX1NJWkUgIDgKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbnN0IHBvbGxpbmdfb3BzW10gPSB7IFtQVk1PVkVdID0gTFZNUERfUkVRX1BWTU9WRSwKKwkJCQkJCSBbQ09OVkVSVF0gPSBMVk1QRF9SRVFfQ09OVkVSVCwKKwkJCQkJCSBbTUVSR0VdID0gTFZNUERfUkVRX01FUkdFLAorCQkJCQkJIFtNRVJHRV9USElOXSA9IExWTVBEX1JFUV9NRVJHRV9USElOIH07CisKK2NvbnN0IGNoYXIgKnBvbGxpbmdfb3AoZW51bSBwb2xsX3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gdHlwZSA8IFBPTExfVFlQRV9NQVggPyBwb2xsaW5nX29wc1t0eXBlXSA6ICI8dW5kZWZpbmVkPiI7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RvX2NtZF9hcnIoY29uc3QgY2hhciAqKipjbWRhcmd2LCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkICppbmQpCit7CisJY29uc3QgY2hhciAqKm5ld2FyZ3Y7CisKKwlpZiAoKmluZCAmJiAhKCppbmQgJSBNSU5fQVJHVl9TSVpFKSkgeworCQluZXdhcmd2ID0gZG1fcmVhbGxvYygqY21kYXJndiwgKCppbmQgLyBNSU5fQVJHVl9TSVpFICsgMSkgKiBNSU5fQVJHVl9TSVpFICogc2l6ZW9mKGNoYXIgKikpOworCQlpZiAoIW5ld2FyZ3YpCisJCQlyZXR1cm4gMDsKKwkJKmNtZGFyZ3YgPSBuZXdhcmd2OworCX0KKworCSooKmNtZGFyZ3YgKyAoKmluZCkrKykgPSBzdHI7CisKKwlyZXR1cm4gMTsKK30KKworY29uc3QgY2hhciAqKmNtZGFyZ3ZfY3RyKGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdiwgY29uc3QgY2hhciAqbHZtX2JpbmFyeSwgdW5zaWduZWQgYWJvcnRfcG9sbGluZywgdW5zaWduZWQgaGFuZGxlX21pc3NpbmdfcHZzKQoreworCXVuc2lnbmVkIGkgPSAwOworCWNvbnN0IGNoYXIgKipjbWRfYXJndiA9IGRtX21hbGxvYyhNSU5fQVJHVl9TSVpFICogc2l6ZW9mKGNoYXIgKikpOworCisJaWYgKCFjbWRfYXJndikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBwYXRoIHRvIGx2bTIgYmluYXJ5ICovCisJaWYgKCFhZGRfdG9fY21kX2FycigmY21kX2FyZ3YsIGx2bV9iaW5hcnksICZpKSkKKwkJZ290byBlcnI7CisKKwkvKiBjbWQgdG8gZXhlY3V0ZSAqLworCWlmICghYWRkX3RvX2NtZF9hcnIoJmNtZF9hcmd2LCBMVlBPTExfQ01ELCAmaSkpCisJCWdvdG8gZXJyOworCisJLyogdHJhbnNmZXIgaW50ZXJuYWwgcG9sbGluZyBpbnRlcnZhbCAqLworCWlmIChwZGx2LT5zaW50ZXJ2YWwgJiYKKwkgICAgKCFhZGRfdG9fY21kX2FycigmY21kX2FyZ3YsICItLWludGVydmFsIiwgJmkpIHx8CisJICAgICAhYWRkX3RvX2NtZF9hcnIoJmNtZF9hcmd2LCBwZGx2LT5zaW50ZXJ2YWwsICZpKSkpCisJCWdvdG8gZXJyOworCisJLyogcGFzcyBhYm9ydCBwYXJhbSAqLworCWlmIChhYm9ydF9wb2xsaW5nICYmCisJICAgICFhZGRfdG9fY21kX2FycigmY21kX2FyZ3YsICItLWFib3J0IiwgJmkpKQorCQlnb3RvIGVycjsKKworCS8qIHBhc3MgaGFuZGxlLW1pc3NpbmctcHZzLiB1c2VkIGJ5IG1pcnJvciBwb2xsaW5nIG9wZXJhdGlvbiAqLworCWlmIChoYW5kbGVfbWlzc2luZ19wdnMgJiYKKwkgICAgIWFkZF90b19jbWRfYXJyKCZjbWRfYXJndiwgIi0taGFuZGxlbWlzc2luZ3B2cyIsICZpKSkKKwkJZ290byBlcnI7CisKKwkvKiBvbmUgb2Y6ICJjb252ZXJ0IiwgInB2bW92ZSIsICJtZXJnZSIsICJtZXJnZV90aGluIiAqLworCWlmICghYWRkX3RvX2NtZF9hcnIoJmNtZF9hcmd2LCAiLS1wb2xsb3BlcmF0aW9uIiwgJmkpIHx8CisJICAgICFhZGRfdG9fY21kX2FycigmY21kX2FyZ3YsIHBvbGxpbmdfb3BzW3BkbHYtPnR5cGVdLCAmaSkpCisJCWdvdG8gZXJyOworCisJLyogdmcvbHYgbmFtZSAqLworCWlmICghYWRkX3RvX2NtZF9hcnIoJmNtZF9hcmd2LCBwZGx2LT5sdm5hbWUsICZpKSkKKwkJZ290byBlcnI7CisKKwkvKiBkaXNhYmxlIG1ldGFkYXRhIGJhY2t1cCAqLworCWlmICghYWRkX3RvX2NtZF9hcnIoJmNtZF9hcmd2LCAiLUFuIiwgJmkpKQorCQlnb3RvIGVycjsKKworCS8qIHRlcm1pbmF0aW5nIE5VTEwgKi8KKwlpZiAoIWFkZF90b19jbWRfYXJyKCZjbWRfYXJndiwgTlVMTCwgJmkpKQorCQlnb3RvIGVycjsKKworCXJldHVybiBjbWRfYXJndjsKK2VycjoKKwlkbV9mcmVlKGNtZF9hcmd2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRklYTUU6IGluIGZhY3QgZXhjbHVkZSBzaG91bGQgYmUgdmEgbGlzdCAqLworc3RhdGljIGludCBjb3B5X2Vudihjb25zdCBjaGFyICoqKmNtZF9lbnZwLCB1bnNpZ25lZCAqaSwgY29uc3QgY2hhciAqZXhjbHVkZSkKK3sKKwljb25zdCBjaGFyICogY29uc3QqIHRtcCA9IChjb25zdCBjaGFyICogY29uc3QqKSBlbnZpcm9uOworCisJaWYgKCF0bXApCisJCXJldHVybiAwOworCisJd2hpbGUgKCp0bXApIHsKKwkJaWYgKHN0cm5jbXAoKnRtcCwgZXhjbHVkZSwgc3RybGVuKGV4Y2x1ZGUpKSAmJiAhYWRkX3RvX2NtZF9hcnIoY21kX2VudnAsICp0bXAsIGkpKQorCQkJcmV0dXJuIDA7CisJCXRtcCsrOworCX0KKworCXJldHVybiAxOworfQorCitjb25zdCBjaGFyICoqY21kZW52cF9jdHIoY29uc3Qgc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2KQoreworCXVuc2lnbmVkIGkgPSAwOworCWNvbnN0IGNoYXIgKipjbWRfZW52cCA9IGRtX21hbGxvYyhNSU5fQVJHVl9TSVpFICogc2l6ZW9mKGNoYXIgKikpOworCisJaWYgKCFjbWRfZW52cCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3B5IHdob2xlIGVudmlyb25tZW50IGZyb20gbHZtcG9sbGQsIGV4Y2x1ZGUgTFZNX1NZU1RFTV9ESVIgaWYgc2V0ICovCisJaWYgKCFjb3B5X2VudigmY21kX2VudnAsICZpLCAiTFZNX1NZU1RFTV9ESVI9IikpCisJCWdvdG8gZXJyOworCisJLyogQWRkIHBlciBjbGllbnQgTFZNX1NZU1RFTV9ESVIgdmFyaWFibGUgaWYgc2V0ICovCisJaWYgKCpwZGx2LT5sdm1fc3lzdGVtX2Rpcl9lbnYgJiYgIWFkZF90b19jbWRfYXJyKCZjbWRfZW52cCwgcGRsdi0+bHZtX3N5c3RlbV9kaXJfZW52LCAmaSkpCisJCWdvdG8gZXJyOworCisJLyogdGVybWluYXRpbmcgTlVMTCAqLworCWlmICghYWRkX3RvX2NtZF9hcnIoJmNtZF9lbnZwLCBOVUxMLCAmaSkpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIGNtZF9lbnZwOworZXJyOgorCWRtX2ZyZWUoY21kX2VudnApOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGFlbW9ucy9sdm1wb2xsZC9sdm1wb2xsZC1jbWQtdXRpbHMuaCBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtY21kLXV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhMTc4MwotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtY21kLXV0aWxzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTFZNUE9MTERfQ01EX1VUSUxTX0gKKyNkZWZpbmUgX0xWTV9MVk1QT0xMRF9DTURfVVRJTFNfSAorCisjaW5jbHVkZSAibHZtcG9sbGQtZGF0YS11dGlscy5oIgorCitjb25zdCBjaGFyICoqY21kYXJndl9jdHIoY29uc3Qgc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2LCBjb25zdCBjaGFyICpsdm1fYmluYXJ5LCB1bnNpZ25lZCBhYm9ydCwgdW5zaWduZWQgaGFuZGxlX21pc3NpbmdfcHZzKTsKK2NvbnN0IGNoYXIgKipjbWRlbnZwX2N0cihjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpOworCitjb25zdCBjaGFyICpwb2xsaW5nX29wKGVudW0gcG9sbF90eXBlKTsKKworI2VuZGlmIC8qIF9MVk1fTFZNUE9MTERfQ01EX1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtY29tbW9uLmggYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTA4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWNvbW1vbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgZmlyc3QgYnkgZXZlcnkgbHZtcG9sbGQgc291cmNlIGZpbGUuCisgKi8KKyNpZm5kZWYgX0xWTV9MVk1QT0xMRF9DT01NT05fSAorI2RlZmluZSBfTFZNX0xWTVBPTExEX0NPTU1PTl9ICisKKyNkZWZpbmUgX1JFRU5UUkFOVAorCisjaW5jbHVkZSAidG9vbC5oIgorCisjaW5jbHVkZSAibHZtcG9sbGQtY21kLXV0aWxzLmgiCisjaW5jbHVkZSAibHZtcG9sbGQtcHJvdG9jb2wuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNlbmRpZgkvKiBfTFZNX0xWTVBPTExEX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWNvcmUuYyBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzMyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWNvcmUuYwpAQCAtMCwwICsxLDk5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsdm1wb2xsZC1jb21tb24uaCIKKworI2luY2x1ZGUgImx2bS12ZXJzaW9uLmgiCisjaW5jbHVkZSAiZGFlbW9uLXNlcnZlci5oIgorI2luY2x1ZGUgImRhZW1vbi1sb2cuaCIKKworI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDx3YWl0Lmg+CisKKyNkZWZpbmUgTFZNUE9MTERfU09DS0VUIERFRkFVTFRfUlVOX0RJUiAiL2x2bXBvbGxkLnNvY2tldCIKKworI2RlZmluZSBQRF9MT0dfUFJFRklYICJMVk1QT0xMRCIKKyNkZWZpbmUgTFZNMl9MT0dfUFJFRklYICJcdExWUE9MTCIKKworLyogcHJlZGVmaW5lZCByZWFzb24gZm9yIHJlc3BvbnNlID0gImZhaWxlZCIgY2FzZSAqLworI2RlZmluZSBSRUFTT05fUkVRX05PVF9JTVBMRU1FTlRFRCAicmVxdWVzdCBub3QgaW1wbGVtZW50ZWQiCisjZGVmaW5lIFJFQVNPTl9NSVNTSU5HX0xWSUQgInJlcXVlc3QgcmVxdWlyZXMgbHZpZCBzZXQiCisjZGVmaW5lIFJFQVNPTl9NSVNTSU5HX0xWTkFNRSAicmVxdWVzdCByZXF1aXJlcyBsdm5hbWUgc2V0IgorI2RlZmluZSBSRUFTT05fTUlTU0lOR19WR05BTUUgInJlcXVlc3QgcmVxdWlyZXMgdmduYW1lIHNldCIKKyNkZWZpbmUgUkVBU09OX1BPTExJTkdfRkFJTEVEICJwb2xsaW5nIG9mIGx2bSBjb21tYW5kIGZhaWxlZCIKKyNkZWZpbmUgUkVBU09OX0lMTEVHQUxfQUJPUlRfUkVRVUVTVCAiYWJvcnQgb25seSBzdXBwb3J0ZWQgd2l0aCBQVk1PVkUgcG9sbGluZyBvcGVyYXRpb24iCisjZGVmaW5lIFJFQVNPTl9ESUZGRVJFTlRfT1BFUkFUSU9OX0lOX1BST0dSRVNTICJEaWZmZXJlbnQgb3BlcmF0aW9uIG9uIExWIGFscmVhZHkgaW4gcHJvZ3Jlc3MiCisjZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lOVEVSVkFMICJyZXF1ZXN0IHJlcXVpcmVzIGludGVydmFsIHNldCIKKyNkZWZpbmUgUkVBU09OX0VOT01FTSAibm90IGVub3VnaCBtZW1vcnkiCisKK3N0cnVjdCBsdm1wb2xsZF9zdGF0ZSB7CisJZGFlbW9uX2lkbGUgKmlkbGU7CisJbG9nX3N0YXRlICpsb2c7CisJY29uc3QgY2hhciAqbG9nX2NvbmZpZzsKKwljb25zdCBjaGFyICpsdm1fYmluYXJ5OworCisJc3RydWN0IGx2bXBvbGxkX3N0b3JlICppZF90b19wZGx2X2Fib3J0OworCXN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqaWRfdG9fcGRsdl9wb2xsOworfTsKKworc3RhdGljIHB0aHJlYWRfa2V5X3Qga2V5OworCitzdGF0aWMgY29uc3QgY2hhciAqX3N0cmVycm9yX3IoaW50IGVycm51bSwgc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpkYXRhKQoreworI2lmZGVmIF9HTlVfU09VUkNFCisJcmV0dXJuIHN0cmVycm9yX3IoZXJybnVtLCBkYXRhLT5idWYsIHNpemVvZihkYXRhLT5idWYpKTsgLyogbmV2ZXIgcmV0dXJucyBOVUxMICovCisjZWxpZiAoX1BPU0lYX0NfU09VUkNFID49IDIwMDExMkwgfHwgX1hPUEVOX1NPVVJDRSA+PSA2MDApCisJcmV0dXJuIHN0cmVycm9yX3IoZXJybnVtLCBkYXRhLT5idWYsIHNpemVvZihkYXRhLT5idWYpKSA/ICIiIDogZGF0YS0+YnVmOworI2Vsc2UKKyMJd2FybmluZyAiQ2FuJ3QgZGVjaWRlIHByb3BlciBzdHJlcnJvcl9yIGltcGxlbWVudGF0aW9uLiBsdm1wb2xsZCB3aWxsIG5vdCBpc3N1ZSBzcGVjaWZpYyBzeXN0ZW0gZXJyb3IgbWVzc2FnZXMiCisJcmV0dXJuICIiOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF91c2FnZShjb25zdCBjaGFyICpwcm9nLCBGSUxFICpmaWxlKQoreworCWZwcmludGYoZmlsZSwgIlVzYWdlOlxuIgorCQkiJXMgWy1WXSBbLWhdIFstZl0gWy1sIHthbGx8d2lyZXxkZWJ1Z31dIFstcyBwYXRoXSBbLUIgcGF0aF0gWy1wIHBhdGhdIFstdCBzZWNzXVxuIgorCQkiJXMgLS1kdW1wIFstcyBwYXRoXVxuIgorCQkiICAgLVZ8LS12ZXJzaW9uICAgICBTaG93IHZlcnNpb24gaW5mb1xuIgorCQkiICAgLWh8LS1oZWxwICAgICAgICBTaG93IHRoaXMgaGVscCBpbmZvcm1hdGlvblxuIgorCQkiICAgLWZ8LS1mb3JlZ3JvdW5kICBEb24ndCBmb3JrLCBydW4gaW4gdGhlIGZvcmVncm91bmRcbiIKKwkJIiAgIC0tZHVtcCAgICAgICAgICAgRHVtcCBmdWxsIGx2bXBvbGxkIHN0YXRlXG4iCisJCSIgICAtbHwtLWxvZyAgICAgICAgIExvZ2dpbmcgbWVzc2FnZSBsZXZlbCAoLWwge2FsbHx3aXJlfGRlYnVnfSlcbiIKKwkJIiAgIC1wfC0tcGlkZmlsZSAgICAgU2V0IHBhdGggdG8gdGhlIHBpZGZpbGVcbiIKKwkJIiAgIC1zfC0tc29ja2V0ICAgICAgU2V0IHBhdGggdG8gdGhlIGNvbW11bmljYXRpb24gc29ja2V0XG4iCisJCSIgICAtQnwtLWJpbmFyeSAgICAgIFBhdGggdG8gbHZtMiBiaW5hcnlcbiIKKwkJIiAgIC10fC0tdGltZW91dCAgICAgVGltZSB0byB3YWl0IGluIHNlY29uZHMgYmVmb3JlIHNodXRkb3duIG9uIGlkbGUgKG1pc3Npbmcgb3IgMCA9IGluaWZpbml0ZSlcblxuIiwgcHJvZywgcHJvZyk7Cit9CisKK3N0YXRpYyBpbnQgX2luaXQoc3RydWN0IGRhZW1vbl9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzID0gcy0+cHJpdmF0ZTsKKwlscy0+bG9nID0gcy0+bG9nOworCisJLyoKKwkgKiBsb2cgd2FybmluZ3MgdG8gc3RkZXJyIGJ5IGRlZmF1bHQuIE90aGVyd2lzZSB3ZSB3b3VsZCBtaXNzIGFueSBsdnBvbGwKKwkgKiBlcnJvciBtZXNzYWdlcyBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlkYWVtb25fbG9nX2VuYWJsZShscy0+bG9nLCBEQUVNT05fTE9HX09VVExFVF9TVERFUlIsIERBRU1PTl9MT0dfV0FSTiwgIDEpOworCisJaWYgKCFkYWVtb25fbG9nX3BhcnNlKGxzLT5sb2csIERBRU1PTl9MT0dfT1VUTEVUX1NUREVSUiwgbHMtPmxvZ19jb25maWcsIDEpKQorCQlyZXR1cm4gMDsKKworCWlmIChwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgbHZtcG9sbGRfdGhyZWFkX2RhdGFfZGVzdHJveSkpIHsKKwkJRkFUQUwobHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAiRmFpbGVkIHRvIGNyZWF0ZSBwdGhyZWFkIGtleSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlscy0+aWRfdG9fcGRsdl9wb2xsID0gcGRzdF9pbml0KCJwb2xsaW5nIik7CisJbHMtPmlkX3RvX3BkbHZfYWJvcnQgPSBwZHN0X2luaXQoImFib3J0Iik7CisKKwlpZiAoIWxzLT5pZF90b19wZGx2X3BvbGwgfHwgIWxzLT5pZF90b19wZGx2X2Fib3J0KSB7CisJCUZBVEFMKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHMtPmx2bV9iaW5hcnkgPSBscy0+bHZtX2JpbmFyeSA/OiBMVk1fUEFUSDsKKworCWlmIChhY2Nlc3MobHMtPmx2bV9iaW5hcnksIFhfT0spKSB7CisJCUZBVEFMKGxzLCAiJXM6ICVzICVzIiwgUERfTE9HX1BSRUZJWCwgIkV4ZWN1dGUgYWNjZXNzIHJpZ2h0cyBkZW5pZWQgb24iLCBscy0+bHZtX2JpbmFyeSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChscy0+aWRsZSkKKwkJbHMtPmlkbGUtPmlzX2lkbGUgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9sdm1wb2xsZF9zdG9yZXNfbG9jayhzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzKQoreworCXBkc3RfbG9jayhscy0+aWRfdG9fcGRsdl9wb2xsKTsKKwlwZHN0X2xvY2sobHMtPmlkX3RvX3BkbHZfYWJvcnQpOworfQorCitzdGF0aWMgdm9pZCBfbHZtcG9sbGRfc3RvcmVzX3VubG9jayhzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzKQoreworCXBkc3RfdW5sb2NrKGxzLT5pZF90b19wZGx2X2Fib3J0KTsKKwlwZHN0X3VubG9jayhscy0+aWRfdG9fcGRsdl9wb2xsKTsKK30KKworc3RhdGljIHZvaWQgX2x2bXBvbGxkX2dsb2JhbF9sb2NrKHN0cnVjdCBsdm1wb2xsZF9zdGF0ZSAqbHMpCit7CisJX2x2bXBvbGxkX3N0b3Jlc19sb2NrKGxzKTsKKworCXBkc3RfbG9ja2VkX2xvY2tfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X3BvbGwpOworCXBkc3RfbG9ja2VkX2xvY2tfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X2Fib3J0KTsKK30KKworc3RhdGljIHZvaWQgX2x2bXBvbGxkX2dsb2JhbF91bmxvY2soc3RydWN0IGx2bXBvbGxkX3N0YXRlICpscykKK3sKKwlwZHN0X2xvY2tlZF91bmxvY2tfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X2Fib3J0KTsKKwlwZHN0X2xvY2tlZF91bmxvY2tfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X3BvbGwpOworCisJX2x2bXBvbGxkX3N0b3Jlc191bmxvY2sobHMpOworfQorCitzdGF0aWMgaW50IF9maW5pKHN0cnVjdCBkYWVtb25fc3RhdGUgKnMpCit7CisJaW50IGRvbmU7CisJY29uc3Qgc3RydWN0IHRpbWVzcGVjIHQgPSB7IC50dl9uc2VjID0gMjUwMDAwMDAwIH07IC8qIC4yNSBzZWMgKi8KKwlzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzID0gcy0+cHJpdmF0ZTsKKworCURFQlVHTE9HKHMsICJmaW5pIik7CisKKwlERUJVR0xPRyhzLCAic2VuZGluZyBjYW5jZWwgcmVxdWVzdHMiKTsKKworCV9sdm1wb2xsZF9nbG9iYWxfbG9jayhscyk7CisJcGRzdF9sb2NrZWRfc2VuZF9jYW5jZWwobHMtPmlkX3RvX3BkbHZfcG9sbCk7CisJcGRzdF9sb2NrZWRfc2VuZF9jYW5jZWwobHMtPmlkX3RvX3BkbHZfYWJvcnQpOworCV9sdm1wb2xsZF9nbG9iYWxfdW5sb2NrKGxzKTsKKworCURFQlVHTE9HKHMsICJ3YWl0aW5nIGZvciBiYWNrZ3JvdW5kIHRocmVhZHMgdG8gZmluaXNoIik7CisKKwl3aGlsZSgxKSB7CisJCV9sdm1wb2xsZF9zdG9yZXNfbG9jayhscyk7CisJCWRvbmUgPSAhcGRzdF9sb2NrZWRfZ2V0X2FjdGl2ZV9jb3VudChscy0+aWRfdG9fcGRsdl9wb2xsKSAmJgorCQkgICAgICAgIXBkc3RfbG9ja2VkX2dldF9hY3RpdmVfY291bnQobHMtPmlkX3RvX3BkbHZfYWJvcnQpOworCQlfbHZtcG9sbGRfc3RvcmVzX3VubG9jayhscyk7CisJCWlmIChkb25lKQorCQkJYnJlYWs7CisJCW5hbm9zbGVlcCgmdCwgTlVMTCk7CisJfQorCisJREVCVUdMT0cocywgImRlc3Ryb3lpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIik7CisKKwlfbHZtcG9sbGRfc3RvcmVzX2xvY2sobHMpOworCXBkc3RfbG9ja2VkX2Rlc3Ryb3lfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X3BvbGwpOworCXBkc3RfbG9ja2VkX2Rlc3Ryb3lfYWxsX3BkbHZzKGxzLT5pZF90b19wZGx2X2Fib3J0KTsKKwlfbHZtcG9sbGRfc3RvcmVzX3VubG9jayhscyk7CisKKwlwZHN0X2Rlc3Ryb3kobHMtPmlkX3RvX3BkbHZfcG9sbCk7CisJcGRzdF9kZXN0cm95KGxzLT5pZF90b19wZGx2X2Fib3J0KTsKKworCXB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyByZXNwb25zZSByZXBseShjb25zdCBjaGFyICpyZXMsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZShyZXMsICJyZWFzb24gPSAlcyIsIHJlYXNvbiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zaW5nbGVfbGluZShzdHJ1Y3QgbHZtcG9sbGRfdGhyZWFkX2RhdGEgKmRhdGEsIGludCBlcnIpCit7CisJc3NpemVfdCByID0gZ2V0bGluZSgmZGF0YS0+bGluZSwgJmRhdGEtPmxpbmVfc2l6ZSwgZXJyID8gZGF0YS0+ZmVyciA6IGRhdGEtPmZvdXQpOworCisJaWYgKHIgPiAwICYmICooZGF0YS0+bGluZSArIHIgLSAxKSA9PSAnXG4nKQorCQkqKGRhdGEtPmxpbmUgKyByIC0gMSkgPSAnXDAnOworCisJcmV0dXJuIChyID4gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9pZGxlX3N0YXRlKHN0cnVjdCBsdm1wb2xsZF9zdGF0ZSAqbHMpCit7CisJaWYgKCFscy0+aWRsZSkKKwkJcmV0dXJuOworCisJX2x2bXBvbGxkX3N0b3Jlc19sb2NrKGxzKTsKKworCWxzLT5pZGxlLT5pc19pZGxlID0gIXBkc3RfbG9ja2VkX2dldF9hY3RpdmVfY291bnQobHMtPmlkX3RvX3BkbHZfcG9sbCkgJiYKKwkJCSAgICAhcGRzdF9sb2NrZWRfZ2V0X2FjdGl2ZV9jb3VudChscy0+aWRfdG9fcGRsdl9hYm9ydCk7CisKKwlfbHZtcG9sbGRfc3RvcmVzX3VubG9jayhscyk7CisKKwlERUJVR0xPRyhscywgIiVzOiAlcyAlcyVzIiwgUERfTE9HX1BSRUZJWCwgImRhZW1vbiBpcyIsIGxzLT5pZGxlLT5pc19pZGxlID8gIiIgOiAibm90ICIsICJpZGxlIik7Cit9CisKKy8qIG1ha2UgdGhpcyBjb25maWd1cmFibGUgKi8KKyNkZWZpbmUgTUFYX1RJTUVPVVQgMgorCitzdGF0aWMgaW50IHBvbGxfZm9yX291dHB1dChzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYsIHN0cnVjdCBsdm1wb2xsZF90aHJlYWRfZGF0YSAqZGF0YSkKK3sKKwlpbnQgY2hfc3RhdCwgciwgZXJyID0gMSwgZmRzX2NvdW50ID0gMiwgdGltZW91dCA9IDA7CisJcGlkX3QgcGlkOworCXN0cnVjdCBsdm1wb2xsZF9jbWRfc3RhdCBjbWRfc3RhdGUgPSB7IC5yZXRjb2RlID0gLTEsIC5zaWduYWwgPSAwIH07CisJc3RydWN0IHBvbGxmZCBmZHNbXSA9IHsgeyAuZmQgPSBkYXRhLT5vdXRwaXBlWzBdLCAuZXZlbnRzID0gUE9MTElOIH0sCisJCQkJeyAuZmQgPSBkYXRhLT5lcnJwaXBlWzBdLCAuZXZlbnRzID0gUE9MTElOIH0gfTsKKworCWlmICghKGRhdGEtPmZvdXQgPSBmZG9wZW4oZGF0YS0+b3V0cGlwZVswXSwgInIiKSkgfHwgIShkYXRhLT5mZXJyID0gZmRvcGVuKGRhdGEtPmVycnBpcGVbMF0sICJyIikpKSB7CisJCUVSUk9SKHBkbHYtPmxzLCAiJXM6ICVzOiAoJWQpICVzIiwgUERfTE9HX1BSRUZJWCwgImZhaWxlZCB0byBvcGVuIGZpbGUgc3RyZWFtIiwKKwkJICAgICAgZXJybm8sIF9zdHJlcnJvcl9yKGVycm5vLCBkYXRhKSk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlICgxKSB7CisJCWRvIHsKKwkJCXIgPSBwb2xsKGZkcywgMiwgcGRsdl9nZXRfdGltZW91dChwZGx2KSAqIDEwMDApOworCQl9IHdoaWxlIChyIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwkJREVCVUdMT0cocGRsdi0+bHMsICIlczogJXMgJWQiLCBQRF9MT0dfUFJFRklYLCAicG9sbCgpIHJldHVybmVkIiwgcik7CisJCWlmIChyIDwgMCkgeworCQkJRVJST1IocGRsdi0+bHMsICIlczogJXMgKFBJRCAlZCkgZmFpbGVkOiAoJWQpICVzIiwKKwkJCSAgICAgIFBEX0xPR19QUkVGSVgsICJwb2xsKCkgZm9yIExWTTIgY21kIiwgcGRsdi0+Y21kX3BpZCwKKwkJCSAgICAgIGVycm5vLCBfc3RyZXJyb3JfcihlcnJubywgZGF0YSkpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoIXIpIHsKKwkJCXRpbWVvdXQrKzsKKworCQkJV0FSTihwZGx2LT5scywgIiVzOiAlcyAoUElEICVkKSAlcyIsIFBEX0xPR19QUkVGSVgsCisJCQkgICAgICJwb2xsaW5nIGZvciBvdXRwdXQgb2YgdGhlIGx2bSBjbWQiLCBwZGx2LT5jbWRfcGlkLAorCQkJICAgICAiaGFzIHRpbWVkIG91dCIpOworCisJCQlpZiAodGltZW91dCA+IE1BWF9USU1FT1VUKSB7CisJCQkJRVJST1IocGRsdi0+bHMsICIlczogJXMgKFBJRCAlZCkgKG5vIG91dHB1dCBmb3IgJWQgc2Vjb25kcykiLAorCQkJCSAgICAgIFBEX0xPR19QUkVGSVgsCisJCQkJICAgICAgIkxWTTIgY21kIGlzIHVucmVzcG9uc2l2ZSB0b28gbG9uZyIsCisJCQkJICAgICAgcGRsdi0+Y21kX3BpZCwKKwkJCQkgICAgICB0aW1lb3V0ICogcGRsdl9nZXRfdGltZW91dChwZGx2KSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWNvbnRpbnVlOyAvKiB3aGlsZSgxKSAqLworCQl9CisKKwkJdGltZW91dCA9IDA7CisKKwkJLyogaGFuZGxlIHRoZSBjb21tYW5kJ3MgU1RET1VUICovCisJCWlmIChmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgeworCQkJREVCVUdMT0cocGRsdi0+bHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAiY2F1Z2h0IGlucHV0IGRhdGEgaW4gU1RET1VUIik7CisKKwkJCWFzc2VydChyZWFkX3NpbmdsZV9saW5lKGRhdGEsIDApKTsgLyogbWF5IGJsb2NrIGluZGVmLiBhbnl3YXkgKi8KKwkJCUlORk8ocGRsdi0+bHMsICIlczogUElEICVkOiAlczogJyVzJyIsIExWTTJfTE9HX1BSRUZJWCwKKwkJCSAgICAgcGRsdi0+Y21kX3BpZCwgIlNURE9VVCIsIGRhdGEtPmxpbmUpOworCQl9IGVsc2UgaWYgKGZkc1swXS5yZXZlbnRzKSB7CisJCQlpZiAoZmRzWzBdLnJldmVudHMgJiBQT0xMSFVQKQorCQkJCURFQlVHTE9HKHBkbHYtPmxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgImNhdWdodCBQT0xMSFVQIik7CisJCQllbHNlCisJCQkJV0FSTihwZGx2LT5scywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICJwb2xsIGZvciBjb21tYW5kJ3MgU1RET1VUIGZhaWxlZCIpOworCisJCQlmZHNbMF0uZmQgPSAtMTsKKwkJCWZkc19jb3VudC0tOworCQl9CisKKwkJLyogaGFuZGxlIHRoZSBjb21tYW5kJ3MgU1RERVJSICovCisJCWlmIChmZHNbMV0ucmV2ZW50cyAmIFBPTExJTikgeworCQkJREVCVUdMT0cocGRsdi0+bHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLAorCQkJCSAiY2F1Z2h0IGlucHV0IGRhdGEgaW4gU1RERVJSIik7CisKKwkJCWFzc2VydChyZWFkX3NpbmdsZV9saW5lKGRhdGEsIDEpKTsgLyogbWF5IGJsb2NrIGluZGVmLiBhbnl3YXkgKi8KKwkJCVdBUk4ocGRsdi0+bHMsICIlczogUElEICVkOiAlczogJyVzJyIsIExWTTJfTE9HX1BSRUZJWCwKKwkJCSAgICAgcGRsdi0+Y21kX3BpZCwgIlNUREVSUiIsIGRhdGEtPmxpbmUpOworCQl9IGVsc2UgaWYgKGZkc1sxXS5yZXZlbnRzKSB7CisJCQlpZiAoZmRzWzFdLnJldmVudHMgJiBQT0xMSFVQKQorCQkJCURFQlVHTE9HKHBkbHYtPmxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgImNhdWdodCBlcnIgUE9MTEhVUCIpOworCQkJZWxzZQorCQkJCVdBUk4ocGRsdi0+bHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAicG9sbCBmb3IgY29tbWFuZCdzIFNURE9VVCBmYWlsZWQiKTsKKworCQkJZmRzWzFdLmZkID0gLTE7CisJCQlmZHNfY291bnQtLTsKKwkJfQorCisJCWRvIHsKKwkJCS8qCisJCQkgKiBmZHNfY291bnQgPT0gMCBtZWFucyBwb2xsaW5nIHJlYWNoZWQgRU9GCisJCQkgKiBvciByZWNlaXZlZCBlcnJvciBvbiBib3RoIGRlc2NyaXB0b3JzLgorCQkJICogSW4gc3VjaCBjYXNlLCBqdXN0IHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoCisJCQkgKi8KKwkJCXBpZCA9IHdhaXRwaWQocGRsdi0+Y21kX3BpZCwgJmNoX3N0YXQsIGZkc19jb3VudCA/IFdOT0hBTkcgOiAwKTsKKwkJfSB3aGlsZSAocGlkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwkJaWYgKHBpZCkgeworCQkJaWYgKHBpZCA8IDApIHsKKwkJCQlFUlJPUihwZGx2LT5scywgIiVzOiAlcyAoUElEICVkKSBmYWlsZWQ6ICglZCkgJXMiLAorCQkJCSAgICAgIFBEX0xPR19QUkVGSVgsICJ3YWl0cGlkKCkgZm9yIGx2bTIgY21kIiwKKwkJCQkgICAgICBwZGx2LT5jbWRfcGlkLCBlcnJubywKKwkJCQkgICAgICBfc3RyZXJyb3JfcihlcnJubywgZGF0YSkpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJREVCVUdMT0cocGRsdi0+bHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAiY2hpbGQgZXhpdGVkIik7CisJCQlicmVhazsKKwkJfQorCX0gLyogd2hpbGUoMSkgKi8KKworCURFQlVHTE9HKHBkbHYtPmxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgImFib3V0IHRvIGNvbGxlY3QgcmVtYWluaW5nIGxpbmVzIik7CisJaWYgKGZkc1swXS5mZCA+PSAwKQorCQl3aGlsZSAocmVhZF9zaW5nbGVfbGluZShkYXRhLCAwKSkgeworCQkJYXNzZXJ0KHIgPiAwKTsKKwkJCUlORk8ocGRsdi0+bHMsICIlczogUElEICVkOiAlczogJXMiLCBMVk0yX0xPR19QUkVGSVgsIHBkbHYtPmNtZF9waWQsICJTVERPVVQiLCBkYXRhLT5saW5lKTsKKwkJfQorCWlmIChmZHNbMV0uZmQgPj0gMCkKKwkJd2hpbGUgKHJlYWRfc2luZ2xlX2xpbmUoZGF0YSwgMSkpIHsKKwkJCWFzc2VydChyID4gMCk7CisJCQlXQVJOKHBkbHYtPmxzLCAiJXM6IFBJRCAlZDogJXM6ICVzIiwgTFZNMl9MT0dfUFJFRklYLCBwZGx2LT5jbWRfcGlkLCAiU1RERVJSIiwgZGF0YS0+bGluZSk7CisJCX0KKworCWlmIChXSUZFWElURUQoY2hfc3RhdCkpIHsKKwkJY21kX3N0YXRlLnJldGNvZGUgPSBXRVhJVFNUQVRVUyhjaF9zdGF0KTsKKwkJaWYgKGNtZF9zdGF0ZS5yZXRjb2RlKQorCQkJRVJST1IocGRsdi0+bHMsICIlczogJXMgKFBJRCAlZCkgJXMgKHJldGNvZGU6ICVkKSIsIFBEX0xPR19QUkVGSVgsCisJCQkgICAgICJsdm0yIGNtZCIsIHBkbHYtPmNtZF9waWQsICJmYWlsZWQiLCBjbWRfc3RhdGUucmV0Y29kZSk7CisJCWVsc2UKKwkJCUlORk8ocGRsdi0+bHMsICIlczogJXMgKFBJRCAlZCkgJXMiLCBQRF9MT0dfUFJFRklYLAorCQkJICAgICAibHZtMiBjbWQiLCBwZGx2LT5jbWRfcGlkLCAiZmluaXNoZWQgc3VjY2Vzc2Z1bGx5Iik7CisJfSBlbHNlIGlmIChXSUZTSUdOQUxFRChjaF9zdGF0KSkgeworCQlFUlJPUihwZGx2LT5scywgIiVzOiAlcyAoUElEICVkKSAlcyAoJWQpIiwgUERfTE9HX1BSRUZJWCwKKwkJICAgICAibHZtMiBjbWQiLCBwZGx2LT5jbWRfcGlkLCAiZ290IHRlcm1pbmF0ZWQgYnkgc2lnbmFsIiwKKwkJICAgICBXVEVSTVNJRyhjaF9zdGF0KSk7CisJCWNtZF9zdGF0ZS5zaWduYWwgPSBXVEVSTVNJRyhjaF9zdGF0KTsKKwl9CisKKwllcnIgPSAwOworb3V0OgorCWlmICghZXJyKQorCQlwZGx2X3NldF9jbWRfc3RhdGUocGRsdiwgJmNtZF9zdGF0ZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludChzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzLCBjb25zdCBjaGFyICogY29uc3QqIHB0cikKK3sKKwljb25zdCBjaGFyICogY29uc3QqIHRtcCA9IHB0cjsKKworCWlmICghdG1wKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKnRtcCkgeworCQlERUJVR0xPRyhscywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICp0bXApOworCQl0bXArKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICpmb3JrX2FuZF9wb2xsKHZvaWQgKmFyZ3MpCit7CisJaW50IG91dGZkLCBlcnJmZCwgc3RhdGU7CisJc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpkYXRhOworCXBpZF90IHI7CisKKwlpbnQgZXJyb3IgPSAxOworCXN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdiA9IChzdHJ1Y3QgbHZtcG9sbGRfbHYgKikgYXJnczsKKwlzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzID0gcGRsdi0+bHM7CisKKwlwdGhyZWFkX3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUsICZzdGF0ZSk7CisJZGF0YSA9IGx2bXBvbGxkX3RocmVhZF9kYXRhX2NvbnN0cnVjdG9yKHBkbHYpOworCXB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCBkYXRhKTsKKwlwdGhyZWFkX3NldGNhbmNlbHN0YXRlKHN0YXRlLCAmc3RhdGUpOworCisJaWYgKCFkYXRhKSB7CisJCUVSUk9SKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgIkZhaWxlZCB0byBpbml0aWFsaXplIHBlci10aHJlYWQgZGF0YSIpOworCQlnb3RvIGVycjsKKwl9CisKKwlERUJVR0xPRyhscywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICJjbWQgbGluZSBhcmd1bWVudHM6Iik7CisJZGVidWdfcHJpbnQobHMsIHBkbHYtPmNtZGFyZ3YpOworCURFQlVHTE9HKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgIi0tLWVuZC0tLSIpOworCisJREVCVUdMT0cobHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAiY21kIGVudmlyb25tZW50IHZhcmlhYmxlczoiKTsKKwlkZWJ1Z19wcmludChscywgcGRsdi0+Y21kZW52cCk7CisJREVCVUdMT0cobHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAiLS0tZW5kLS0tIik7CisKKwlvdXRmZCA9IGRhdGEtPm91dHBpcGVbMV07CisJZXJyZmQgPSBkYXRhLT5lcnJwaXBlWzFdOworCisJciA9IGZvcmsoKTsKKwlpZiAoIXIpIHsKKwkJLyogY2hpbGQgKi8KKwkJLyogISEhIERvIG5vdCB0b3VjaCBhbnkgcG9zaXggdGhyZWFkIHByaW1pdGl2ZXMgISEhICovCisKKwkJaWYgKChkdXAyKG91dGZkLCBTVERPVVRfRklMRU5PICkgIT0gU1RET1VUX0ZJTEVOTykgfHwKKwkJICAgIChkdXAyKGVycmZkLCBTVERFUlJfRklMRU5PICkgIT0gU1RERVJSX0ZJTEVOTykpCisJCQlfZXhpdChMVk1QRF9SRVRfRFVQX0ZBSUxFRCk7CisKKwkJZXhlY3ZlKCoocGRsdi0+Y21kYXJndiksIChjaGFyICpjb25zdCAqKXBkbHYtPmNtZGFyZ3YsIChjaGFyICpjb25zdCAqKXBkbHYtPmNtZGVudnApOworCisJCV9leGl0KExWTVBEX1JFVF9FWENfRkFJTEVEKTsKKwl9IGVsc2UgeworCQkvKiBwYXJlbnQgKi8KKwkJaWYgKHIgPT0gLTEpIHsKKwkJCUVSUk9SKGxzLCAiJXM6ICVzOiAoJWQpICVzIiwgUERfTE9HX1BSRUZJWCwgImZvcmsgZmFpbGVkIiwKKwkJCSAgICAgIGVycm5vLCBfc3RyZXJyb3JfcihlcnJubywgZGF0YSkpOworCQkJZ290byBlcnI7CisJCX0KKworCQlJTkZPKGxzLCAiJXM6IExWTTIgY21kIFwiJXNcIiAoUElEOiAlZCkiLCBQRF9MT0dfUFJFRklYLCAqKHBkbHYtPmNtZGFyZ3YpLCByKTsKKworCQlwZGx2LT5jbWRfcGlkID0gcjsKKworCQkvKiBmYWlsdXJlIHRvIGNsb3NlIHdyaXRlIGVuZCBvZiBhbnkgcGlwZSB3aWxsIHJlc3VsdCBpbiBicm9rZW4gcG9sbGluZyAqLworCQlpZiAoY2xvc2UoZGF0YS0+b3V0cGlwZVsxXSkpIHsKKwkJCUVSUk9SKGxzLCAiJXM6ICVzOiAoJWQpICVzIiwgUERfTE9HX1BSRUZJWCwgImZhaWxlZCB0byBjbG9zZSB3cml0ZSBlbmQgb2YgcGlwZSIsCisJCQkgICAgICBlcnJubywgX3N0cmVycm9yX3IoZXJybm8sIGRhdGEpKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRhdGEtPm91dHBpcGVbMV0gPSAtMTsKKworCQlpZiAoY2xvc2UoZGF0YS0+ZXJycGlwZVsxXSkpIHsKKwkJCUVSUk9SKGxzLCAiJXM6ICVzOiAoJWQpICVzIiwgUERfTE9HX1BSRUZJWCwgImZhaWxlZCB0byBjbG9zZSB3cml0ZSBlbmQgb2YgZXJyIHBpcGUiLAorCQkJICAgICAgZXJybm8sIF9zdHJlcnJvcl9yKGVycm5vLCBkYXRhKSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlkYXRhLT5lcnJwaXBlWzFdID0gLTE7CisKKwkJZXJyb3IgPSBwb2xsX2Zvcl9vdXRwdXQocGRsdiwgZGF0YSk7CisJCURFQlVHTE9HKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgInBvbGxpbmcgZm9yIGx2cG9sbCBvdXRwdXQgaGFzIGZpbmlzaGVkIik7CisJfQorCitlcnI6CisJciA9IDA7CisKKwlwZHN0X2xvY2socGRsdi0+cGRzdCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyogbGFzdCByZWFkZXIgaXMgcmVzcG9uc2libGUgZm9yIHBkbHYgY2xlYW51cCAqLworCQlyID0gcGRsdi0+Y21kX3BpZDsKKwkJcGRsdl9zZXRfZXJyb3IocGRsdiwgMSk7CisJfQorCisJcGRsdl9zZXRfcG9sbGluZ19maW5pc2hlZChwZGx2LCAxKTsKKwlpZiAoZGF0YSkKKwkJZGF0YS0+cGRsdiA9IE5VTEw7CisKKwlwZHN0X2xvY2tlZF9kZWMocGRsdi0+cGRzdCk7CisKKwlwZHN0X3VubG9jayhwZGx2LT5wZHN0KTsKKworCXB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgJnN0YXRlKTsKKwlsdm1wb2xsZF90aHJlYWRfZGF0YV9kZXN0cm95KGRhdGEpOworCXB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCBOVUxMKTsKKwlwdGhyZWFkX3NldGNhbmNlbHN0YXRlKHN0YXRlLCAmc3RhdGUpOworCisJdXBkYXRlX2lkbGVfc3RhdGUobHMpOworCisJLyoKKwkgKiBUaGlzIGlzIHVuZm9ydHVuYXRlIGNhc2Ugd2hlcmUgd2UKKwkgKiBrbm93IG5vdGhpbmcgYWJvdXQgc3RhdGUgb2YgbHZtIGNtZCBhbmQKKwkgKiAoZXZlbnR1YWxseSkgb25nb2luZyBwcm9ncmVzcy4KKwkgKgorCSAqIGhhcnZlc3Qgem9tYmllcworCSAqLworCWlmIChyKQorCQl3aGlsZSh3YWl0cGlkKHIsIE5VTEwsIDApIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHJlc3BvbnNlIHByb2dyZXNzX2luZm8oY2xpZW50X2hhbmRsZSBoLCBzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzLCByZXF1ZXN0IHJlcSkKK3sKKwljaGFyICppZDsKKwlzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHY7CisJc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0OworCXN0cnVjdCBsdm1wb2xsZF9sdl9zdGF0ZSBzdDsKKwlyZXNwb25zZSByOworCWNvbnN0IGNoYXIgKmx2aWQgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCBMVk1QRF9QQVJNX0xWSUQsIE5VTEwpOworCWNvbnN0IGNoYXIgKnN5c2RpciA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsIExWTVBEX1BBUk1fU1lTRElSLCBOVUxMKTsKKwl1bnNpZ25lZCBhYm9ydF9wb2xsaW5nID0gZGFlbW9uX3JlcXVlc3RfaW50KHJlcSwgTFZNUERfUEFSTV9BQk9SVCwgMCk7CisKKwlpZiAoIWx2aWQpCisJCXJldHVybiByZXBseShMVk1QRF9SRVNQX0ZBSUxFRCwgUkVBU09OX01JU1NJTkdfTFZJRCk7CisKKwlpZCA9IGNvbnN0cnVjdF9pZChzeXNkaXIsIGx2aWQpOworCWlmICghaWQpIHsKKwkJRVJST1IobHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAicHJvZ3Jlc3NfaW5mbyByZXF1ZXN0IGZhaWxlZCB0byBjb25zdHJ1Y3QgSUQuIik7CisJCXJldHVybiByZXBseShMVk1QRF9SRVNQX0ZBSUxFRCwgUkVBU09OX0VOT01FTSk7CisJfQorCisJREVCVUdMT0cobHMsICIlczogJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgIklEIiwgaWQpOworCisJcGRzdCA9IGFib3J0X3BvbGxpbmcgPyBscy0+aWRfdG9fcGRsdl9hYm9ydCA6IGxzLT5pZF90b19wZGx2X3BvbGw7CisKKwlwZHN0X2xvY2socGRzdCk7CisKKwlwZGx2ID0gcGRzdF9sb2NrZWRfbG9va3VwKHBkc3QsIGlkKTsKKwlpZiAocGRsdikgeworCQkvKgorCQkgKiB3aXRoIHN0b3JlIGxvY2sgaGVsZCwgSSdtIHRoZSBvbmx5IHJlYWRlciBhY2Nlc3NpbmcgdGhlIHBkbHYKKwkJICovCisJCXN0ID0gcGRsdl9nZXRfc3RhdHVzKHBkbHYpOworCisJCWlmIChzdC5lcnJvciB8fCBzdC5wb2xsaW5nX2ZpbmlzaGVkKSB7CisJCQlJTkZPKGxzLCAiJXM6ICVzICVzIiwgUERfTE9HX1BSRUZJWCwKKwkJCSAgICAgIlBvbGxpbmcgZmluaXNoZWQuIFJlbW92aW5nIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgZm9yIExWIiwKKwkJCSAgICAgbHZpZCk7CisJCQlwZHN0X2xvY2tlZF9yZW1vdmUocGRzdCwgaWQpOworCQkJcGRsdl9kZXN0cm95KHBkbHYpOworCQl9CisJfQorCS8qIHBkbHYgbXVzdCBub3QgYmUgZGVyZWZlcmVuY2VkIGZyb20gbm93IG9uICovCisKKwlwZHN0X3VubG9jayhwZHN0KTsKKworCWRtX2ZyZWUoaWQpOworCisJaWYgKHBkbHYpIHsKKwkJaWYgKHN0LmVycm9yKQorCQkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRkFJTEVELCBSRUFTT05fUE9MTElOR19GQUlMRUQpOworCisJCWlmIChzdC5wb2xsaW5nX2ZpbmlzaGVkKQorCQkJciA9IGRhZW1vbl9yZXBseV9zaW1wbGUoTFZNUERfUkVTUF9GSU5JU0hFRCwKKwkJCQkJCSJyZWFzb24gPSAlcyIsIHN0LmNtZF9zdGF0ZS5zaWduYWwgPyBMVk1QRF9SRUFTX1NJR05BTCA6IExWTVBEX1JFQVNfUkVUQ09ERSwKKwkJCQkJCUxWTVBEX1BBUk1fVkFMVUUgIiA9ICIgRk1UZDY0LCAoaW50NjRfdCkoc3QuY21kX3N0YXRlLnNpZ25hbCA/OiBzdC5jbWRfc3RhdGUucmV0Y29kZSksCisJCQkJCQlOVUxMKTsKKwkJZWxzZQorCQkJciA9IGRhZW1vbl9yZXBseV9zaW1wbGUoTFZNUERfUkVTUF9JTl9QUk9HUkVTUywgTlVMTCk7CisJfQorCWVsc2UKKwkJciA9IGRhZW1vbl9yZXBseV9zaW1wbGUoTFZNUERfUkVTUF9OT1RfRk9VTkQsIE5VTEwpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbHZtcG9sbGRfbHYgKmNvbnN0cnVjdF9wZGx2KHJlcXVlc3QgcmVxLCBzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzLAorCQkJCSAgICAgc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0LAorCQkJCSAgICAgY29uc3QgY2hhciAqaW50ZXJ2YWwsIGNvbnN0IGNoYXIgKmlkLAorCQkJCSAgICAgY29uc3QgY2hhciAqdmduYW1lLCBjb25zdCBjaGFyICpsdm5hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICpzeXNkaXIsIGVudW0gcG9sbF90eXBlIHR5cGUsCisJCQkJICAgICB1bnNpZ25lZCBhYm9ydF9wb2xsaW5nLCB1bnNpZ25lZCB1aW50ZXJ2YWwpCit7CisJY29uc3QgY2hhciAqKmNtZGFyZ3YsICoqY21kZW52cDsKKwlzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHY7CisJdW5zaWduZWQgaGFuZGxlX21pc3NpbmdfcHZzID0gZGFlbW9uX3JlcXVlc3RfaW50KHJlcSwgTFZNUERfUEFSTV9IQU5ETEVfTUlTU0lOR19QVlMsIDApOworCisJcGRsdiA9IHBkbHZfY3JlYXRlKGxzLCBpZCwgdmduYW1lLCBsdm5hbWUsIHN5c2RpciwgdHlwZSwKKwkJCSAgIGludGVydmFsLCB1aW50ZXJ2YWwsIHBkc3QpOworCisJaWYgKCFwZGx2KSB7CisJCUVSUk9SKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgImZhaWxlZCB0byBjcmVhdGUgaW50ZXJuYWwgTFYgZGF0YSBzdHJ1Y3R1cmUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNtZGFyZ3YgPSBjbWRhcmd2X2N0cihwZGx2LCBwZGx2LT5scy0+bHZtX2JpbmFyeSwgYWJvcnRfcG9sbGluZywgaGFuZGxlX21pc3NpbmdfcHZzKTsKKwlpZiAoIWNtZGFyZ3YpIHsKKwkJcGRsdl9kZXN0cm95KHBkbHYpOworCQlFUlJPUihscywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICJmYWlsZWQgdG8gY29uc3RydWN0IGNtZCBhcmd1bWVudHMgZm9yIGx2cG9sbCBjb21tYW5kIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXBkbHYtPmNtZGFyZ3YgPSBjbWRhcmd2OworCisJY21kZW52cCA9IGNtZGVudnBfY3RyKHBkbHYpOworCWlmICghY21kZW52cCkgeworCQlwZGx2X2Rlc3Ryb3kocGRsdik7CisJCUVSUk9SKGxzLCAiJXM6ICVzIiwgUERfTE9HX1BSRUZJWCwgImZhaWxlZCB0byBjb25zdHJ1Y3QgY21kIGVudmlyb25tZW50IGZvciBsdnBvbGwgY29tbWFuZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZGx2LT5jbWRlbnZwID0gY21kZW52cDsKKworCXJldHVybiBwZGx2OworfQorCitzdGF0aWMgaW50IHNwYXduX2RldGFjaGVkX3RocmVhZChzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJaW50IHI7CisJcHRocmVhZF9hdHRyX3QgYXR0cjsKKworCWlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gcHRocmVhZF9jcmVhdGUoJnBkbHYtPnRpZCwgJmF0dHIsIGZvcmtfYW5kX3BvbGwsICh2b2lkICopcGRsdik7CisKKwlpZiAocHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpICE9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuICFyOworfQorCitzdGF0aWMgcmVzcG9uc2UgcG9sbF9pbml0KGNsaWVudF9oYW5kbGUgaCwgc3RydWN0IGx2bXBvbGxkX3N0YXRlICpscywgcmVxdWVzdCByZXEsIGVudW0gcG9sbF90eXBlIHR5cGUpCit7CisJY2hhciAqaWQ7CisJc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2OworCXN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdDsKKwl1bnNpZ25lZCB1aW50ZXJ2YWw7CisKKwljb25zdCBjaGFyICppbnRlcnZhbCA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsIExWTVBEX1BBUk1fSU5URVJWQUwsIE5VTEwpOworCWNvbnN0IGNoYXIgKmx2aWQgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCBMVk1QRF9QQVJNX0xWSUQsIE5VTEwpOworCWNvbnN0IGNoYXIgKmx2bmFtZSA9IGRhZW1vbl9yZXF1ZXN0X3N0cihyZXEsIExWTVBEX1BBUk1fTFZOQU1FLCBOVUxMKTsKKwljb25zdCBjaGFyICp2Z25hbWUgPSBkYWVtb25fcmVxdWVzdF9zdHIocmVxLCBMVk1QRF9QQVJNX1ZHTkFNRSwgTlVMTCk7CisJY29uc3QgY2hhciAqc3lzZGlyID0gZGFlbW9uX3JlcXVlc3Rfc3RyKHJlcSwgTFZNUERfUEFSTV9TWVNESVIsIE5VTEwpOworCXVuc2lnbmVkIGFib3J0X3BvbGxpbmcgPSBkYWVtb25fcmVxdWVzdF9pbnQocmVxLCBMVk1QRF9QQVJNX0FCT1JULCAwKTsKKworCWFzc2VydCh0eXBlIDwgUE9MTF9UWVBFX01BWCk7CisKKwlpZiAoYWJvcnRfcG9sbGluZyAmJiB0eXBlICE9IFBWTU9WRSkKKwkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRUlOVkFMLCBSRUFTT05fSUxMRUdBTF9BQk9SVF9SRVFVRVNUKTsKKworCWlmICghaW50ZXJ2YWwgfHwgc3RycGJyayhpbnRlcnZhbCwgIi0iKSB8fCBzc2NhbmYoaW50ZXJ2YWwsICIldSIsICZ1aW50ZXJ2YWwpICE9IDEpCisJCXJldHVybiByZXBseShMVk1QRF9SRVNQX0VJTlZBTCwgUkVBU09OX0lOVkFMSURfSU5URVJWQUwpOworCisJaWYgKCFsdm5hbWUpCisJCXJldHVybiByZXBseShMVk1QRF9SRVNQX0ZBSUxFRCwgUkVBU09OX01JU1NJTkdfTFZOQU1FKTsKKworCWlmICghbHZpZCkKKwkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRkFJTEVELCBSRUFTT05fTUlTU0lOR19MVklEKTsKKworCWlmICghdmduYW1lKQorCQlyZXR1cm4gcmVwbHkoTFZNUERfUkVTUF9GQUlMRUQsIFJFQVNPTl9NSVNTSU5HX1ZHTkFNRSk7CisKKwlpZCA9IGNvbnN0cnVjdF9pZChzeXNkaXIsIGx2aWQpOworCWlmICghaWQpIHsKKwkJRVJST1IobHMsICIlczogJXMiLCBQRF9MT0dfUFJFRklYLCAicG9sbF9pbml0IHJlcXVlc3QgZmFpbGVkIHRvIGNvbnN0cnVjdCBJRC4iKTsKKwkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRkFJTEVELCBSRUFTT05fRU5PTUVNKTsKKwl9CisKKwlERUJVR0xPRyhscywgIiVzOiAlcz0lcyIsIFBEX0xPR19QUkVGSVgsICJJRCIsIGlkKTsKKworCXBkc3QgPSBhYm9ydF9wb2xsaW5nID8gbHMtPmlkX3RvX3BkbHZfYWJvcnQgOiBscy0+aWRfdG9fcGRsdl9wb2xsOworCisJcGRzdF9sb2NrKHBkc3QpOworCisJcGRsdiA9IHBkc3RfbG9ja2VkX2xvb2t1cChwZHN0LCBpZCk7CisJaWYgKHBkbHYgJiYgcGRsdl9nZXRfcG9sbGluZ19maW5pc2hlZChwZGx2KSkgeworCQlXQVJOKGxzLCAiJXM6ICVzICVzIiwgUERfTE9HX1BSRUZJWCwgIkZvcmNlIHJlbW92YWwgb2YgdW5jb2xsZWN0ZWQgaW5mbyBmb3IgTFYiLAorCQkJIGx2aWQpOworCQkvKiAKKwkJICogbHZtcG9sbGQgaGFzIHRvIHJlbW92ZSB1bmNvbGxlY3RlZCByZXN1bHRzIGluIHRoaXMgY2FzZS4KKwkJICogb3RoZXJ3aXNlIGl0IHdvdWxkIGhhdmUgdG8gcmVmdXNlIHJlcXVlc3QgZm9yIG5ldyBwb2xsaW5nCisJCSAqIGx2IHdpdGggc2FtZSBpZC4KKwkJICovCisJCXBkc3RfbG9ja2VkX3JlbW92ZShwZHN0LCBpZCk7CisJCXBkbHZfZGVzdHJveShwZGx2KTsKKwkJcGRsdiA9IE5VTEw7CisJfQorCisJaWYgKHBkbHYpIHsKKwkJaWYgKCFwZGx2X2lzX3R5cGUocGRsdiwgdHlwZSkpIHsKKwkJCXBkc3RfdW5sb2NrKHBkc3QpOworCQkJRVJST1IobHMsICIlczogJXMgJyVzJzogZXhwZWN0ZWQ6ICVzLCByZXF1ZXN0ZWQ6ICVzIiwKKwkJCSAgICAgIFBEX0xPR19QUkVGSVgsICJwb2xsIG9wZXJhdGlvbiB0eXBlIG1pc21hdGNoIG9uIExWIGlkZW50aWZpZWQgYnkiLAorCQkJICAgICAgaWQsCisJCQkgICAgICBwb2xsaW5nX29wKHBkbHZfZ2V0X3R5cGUocGRsdikpLCBwb2xsaW5nX29wKHR5cGUpKTsKKwkJCWRtX2ZyZWUoaWQpOworCQkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRUlOVkFMLAorCQkJCSAgICAgUkVBU09OX0RJRkZFUkVOVF9PUEVSQVRJT05fSU5fUFJPR1JFU1MpOworCQl9CisJCXBkbHYtPmluaXRfcnFfY291bnQrKzsgLyogc2FmZS4gcHJvdGVjdGVkIGJ5IHN0b3JlIGxvY2sgKi8KKwl9IGVsc2UgeworCQlwZGx2ID0gY29uc3RydWN0X3BkbHYocmVxLCBscywgcGRzdCwgaW50ZXJ2YWwsIGlkLCB2Z25hbWUsCisJCQkJICAgICAgbHZuYW1lLCBzeXNkaXIsIHR5cGUsIGFib3J0X3BvbGxpbmcsIDIgKiB1aW50ZXJ2YWwpOworCQlpZiAoIXBkbHYpIHsKKwkJCXBkc3RfdW5sb2NrKHBkc3QpOworCQkJZG1fZnJlZShpZCk7CisJCQlyZXR1cm4gcmVwbHkoTFZNUERfUkVTUF9GQUlMRUQsIFJFQVNPTl9FTk9NRU0pOworCQl9CisJCWlmICghcGRzdF9sb2NrZWRfaW5zZXJ0KHBkc3QsIGlkLCBwZGx2KSkgeworCQkJcGRsdl9kZXN0cm95KHBkbHYpOworCQkJcGRzdF91bmxvY2socGRzdCk7CisJCQlFUlJPUihscywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICJjb3VsZG4ndCBzdG9yZSBpbnRlcm5hbCBMViBkYXRhIHN0cnVjdHVyZSIpOworCQkJZG1fZnJlZShpZCk7CisJCQlyZXR1cm4gcmVwbHkoTFZNUERfUkVTUF9GQUlMRUQsIFJFQVNPTl9FTk9NRU0pOworCQl9CisJCWlmICghc3Bhd25fZGV0YWNoZWRfdGhyZWFkKHBkbHYpKSB7CisJCQlFUlJPUihscywgIiVzOiAlcyIsIFBEX0xPR19QUkVGSVgsICJmYWlsZWQgdG8gc3Bhd24gZGV0YWNoZWQgbW9uaXRvcmluZyB0aHJlYWQiKTsKKwkJCXBkc3RfbG9ja2VkX3JlbW92ZShwZHN0LCBpZCk7CisJCQlwZGx2X2Rlc3Ryb3kocGRsdik7CisJCQlwZHN0X3VubG9jayhwZHN0KTsKKwkJCWRtX2ZyZWUoaWQpOworCQkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRkFJTEVELCBSRUFTT05fRU5PTUVNKTsKKwkJfQorCisJCXBkc3RfbG9ja2VkX2luYyhwZHN0KTsKKwkJaWYgKGxzLT5pZGxlKQorCQkJbHMtPmlkbGUtPmlzX2lkbGUgPSAwOworCX0KKworCXBkc3RfdW5sb2NrKHBkc3QpOworCisJZG1fZnJlZShpZCk7CisKKwlyZXR1cm4gZGFlbW9uX3JlcGx5X3NpbXBsZShMVk1QRF9SRVNQX09LLCBOVUxMKTsKK30KKworc3RhdGljIHJlc3BvbnNlIGR1bXBfc3RhdGUoY2xpZW50X2hhbmRsZSBoLCBzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzLCByZXF1ZXN0IHIpCit7CisJcmVzcG9uc2UgcmVzID0geyAwIH07CisJc3RydWN0IGJ1ZmZlciAqYiA9ICZyZXMuYnVmZmVyOworCisJYnVmZmVyX2luaXQoYik7CisKKwlfbHZtcG9sbGRfZ2xvYmFsX2xvY2sobHMpOworCisJYnVmZmVyX2FwcGVuZChiLCAiIyBSZWdpc3RlcmVkIHBvbGxpbmcgb3BlcmF0aW9uc1xuXG4iKTsKKwlidWZmZXJfYXBwZW5kKGIsICJwb2xsIHtcbiIpOworCXBkc3RfbG9ja2VkX2R1bXAobHMtPmlkX3RvX3BkbHZfcG9sbCwgYik7CisJYnVmZmVyX2FwcGVuZChiLCAifVxuXG4iKTsKKworCWJ1ZmZlcl9hcHBlbmQoYiwgIiMgUmVnaXN0ZXJlZCBhYm9ydCBvcGVyYXRpb25zXG5cbiIpOworCWJ1ZmZlcl9hcHBlbmQoYiwgImFib3J0IHtcbiIpOworCXBkc3RfbG9ja2VkX2R1bXAobHMtPmlkX3RvX3BkbHZfYWJvcnQsIGIpOworCWJ1ZmZlcl9hcHBlbmQoYiwgIn0iKTsKKworCV9sdm1wb2xsZF9nbG9iYWxfdW5sb2NrKGxzKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyByZXNwb25zZSBfaGFuZGxlcihzdHJ1Y3QgZGFlbW9uX3N0YXRlIHMsIGNsaWVudF9oYW5kbGUgaCwgcmVxdWVzdCByKQoreworCXN0cnVjdCBsdm1wb2xsZF9zdGF0ZSAqbHMgPSBzLnByaXZhdGU7CisJY29uc3QgY2hhciAqcnEgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgInJlcXVlc3QiLCAiTk9ORSIpOworCisJaWYgKCFzdHJjbXAocnEsIExWTVBEX1JFUV9QVk1PVkUpKQorCQlyZXR1cm4gcG9sbF9pbml0KGgsIGxzLCByLCBQVk1PVkUpOworCWVsc2UgaWYgKCFzdHJjbXAocnEsIExWTVBEX1JFUV9DT05WRVJUKSkKKwkJcmV0dXJuIHBvbGxfaW5pdChoLCBscywgciwgQ09OVkVSVCk7CisJZWxzZSBpZiAoIXN0cmNtcChycSwgTFZNUERfUkVRX01FUkdFKSkKKwkJcmV0dXJuIHBvbGxfaW5pdChoLCBscywgciwgTUVSR0UpOworCWVsc2UgaWYgKCFzdHJjbXAocnEsIExWTVBEX1JFUV9NRVJHRV9USElOKSkKKwkJcmV0dXJuIHBvbGxfaW5pdChoLCBscywgciwgTUVSR0VfVEhJTik7CisJZWxzZSBpZiAoIXN0cmNtcChycSwgTFZNUERfUkVRX1BST0dSRVNTKSkKKwkJcmV0dXJuIHByb2dyZXNzX2luZm8oaCwgbHMsIHIpOworCWVsc2UgaWYgKCFzdHJjbXAocnEsIExWTVBEX1JFUV9EVU1QKSkKKwkJcmV0dXJuIGR1bXBfc3RhdGUoaCwgbHMsIHIpOworCWVsc2UKKwkJcmV0dXJuIHJlcGx5KExWTVBEX1JFU1BfRUlOVkFMLCBSRUFTT05fUkVRX05PVF9JTVBMRU1FTlRFRCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc190aW1lb3V0X2FyZyhjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkICptYXhfdGltZW91dHMpCit7CisJY2hhciAqZW5kcHRyOworCXVuc2lnbmVkIGxvbmcgbDsKKworCWVycm5vID0gMDsKKwlsID0gc3RydG91bChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZXJybm8gfHwgKmVuZHB0ciB8fCBsID49IFVJTlRfTUFYKQorCQlyZXR1cm4gMDsKKworCSptYXhfdGltZW91dHMgPSAodW5zaWduZWQpIGw7CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2xpZW50IGZ1bmN0aW9uYWxpdHkgKi8KK3R5cGVkZWYgaW50ICgqYWN0aW9uX2ZuX3QpICh2b2lkICphcmdzKTsKKworc3RydWN0IGxvZ19saW5lX2JhdG9uIHsKKwljb25zdCBjaGFyICpwcmVmaXg7Cit9OworCitkYWVtb25faGFuZGxlIF9sdm1wb2xsZCA9IHsgLmVycm9yID0gMCB9OworCitzdGF0aWMgZGFlbW9uX2hhbmRsZSBfbHZtcG9sbGRfb3Blbihjb25zdCBjaGFyICpzb2NrZXQpCit7CisJZGFlbW9uX2luZm8gbHZtcG9sbGRfaW5mbyA9IHsKKwkJLnBhdGggPSAibHZtcG9sbGQiLAorCQkuc29ja2V0ID0gc29ja2V0ID86IERFRkFVTFRfUlVOX0RJUiAiL2x2bXBvbGxkLnNvY2tldCIsCisJCS5wcm90b2NvbCA9IExWTVBPTExEX1BST1RPQ09MLAorCQkucHJvdG9jb2xfdmVyc2lvbiA9IExWTVBPTExEX1BST1RPQ09MX1ZFUlNJT04KKwl9OworCisJcmV0dXJuIGRhZW1vbl9vcGVuKGx2bXBvbGxkX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfbG9nX2xpbmUoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pIHsKKwlzdHJ1Y3QgbG9nX2xpbmVfYmF0b24gKmIgPSBiYXRvbjsKKwlmcHJpbnRmKHN0ZG91dCwgIiVzJXNcbiIsIGItPnByZWZpeCwgbGluZSk7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRvdXRfcmF3X3Jlc3BvbnNlKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbXNnKQoreworCXN0cnVjdCBsb2dfbGluZV9iYXRvbiBiID0geyAucHJlZml4ID0gcHJlZml4IH07CisJY2hhciAqYnVmOworCWNoYXIgKnBvczsKKworCWJ1ZiA9IGRtX3N0cmR1cChtc2cpOworCXBvcyA9IGJ1ZjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChwb3MpIHsKKwkJY2hhciAqbmV4dCA9IHN0cmNocihwb3MsICdcbicpOworCQlpZiAobmV4dCkKKwkJCSpuZXh0ID0gMDsKKwkJX2xvZ19saW5lKHBvcywgJmIpOworCQlwb3MgPSBuZXh0ID8gbmV4dCArIDEgOiAwOworCX0KKwlkbV9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gMTsKK30KKworLyogcGxhY2UgYWxsIGFjdGlvbiBpbXBsZW1lbnRhdGlvbnMgYmVsb3cgKi8KKworc3RhdGljIGludCBhY3Rpb25fZHVtcCh2b2lkICphcmdzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWRhZW1vbl9yZXF1ZXN0IHJlcTsKKwlkYWVtb25fcmVwbHkgcmVwbDsKKwlpbnQgciA9IDA7CisKKwlyZXEgPSBkYWVtb25fcmVxdWVzdF9tYWtlKExWTVBEX1JFUV9EVU1QKTsKKwlpZiAoIXJlcS5jZnQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIGx2bXBvbGxkICIgTFZNUERfUkVRX0RVTVAgIiByZXF1ZXN0LlxuIik7CisJCWdvdG8gb3V0X3JlcTsKKwl9CisKKwlyZXBsID0gZGFlbW9uX3NlbmQoX2x2bXBvbGxkLCByZXEpOworCWlmIChyZXBsLmVycm9yKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHNlbmQgYSByZXF1ZXN0IG9yIHJlY2VpdmUgcmVzcG9uc2UuXG4iKTsKKwkJZ290byAgb3V0X3JlcDsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgZHVtYiBjb3B5ICYgcGFzdGUgZnJvbSBsaWJkYWVtb24gbG9nIHJvdXRpbmVzLgorCSAqLworCWlmICghcHJpbnRvdXRfcmF3X3Jlc3BvbnNlKCIgICIsIHJlcGwuYnVmZmVyLm1lbSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcHJpbnQgb3V0IHRoZSByZXNwb25zZS5cbiIpOworCQlnb3RvICBvdXRfcmVwOworCX0KKworCXIgPSAxOworCitvdXRfcmVwOgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGwpOworb3V0X3JlcToKKwlkYWVtb25fcmVxdWVzdF9kZXN0cm95KHJlcSk7CisKKwlyZXR1cm4gcjsKK30KKworZW51bSBhY3Rpb25faW5kZXggeworCUFDVElPTl9EVU1QID0gMCwKKwlBQ1RJT05fTUFYIC8qIGtlZXAgYXQgdGhlIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IGFjdGlvbl9mbl90IGFjdGlvbnNbQUNUSU9OX01BWF0gPSB7IFtBQ1RJT05fRFVNUF0gPSBhY3Rpb25fZHVtcCB9OworCitzdGF0aWMgaW50IF9tYWtlX2FjdGlvbihlbnVtIGFjdGlvbl9pbmRleCBpZHgsIHZvaWQgKmFyZ3MpCit7CisJcmV0dXJuIGlkeCA8IEFDVElPTl9NQVggPyBhY3Rpb25zW2lkeF0oYXJncykgOiAwOworfQorCitzdGF0aWMgaW50IF9sdm1wb2xsZF9jbGllbnQoY29uc3QgY2hhciAqc29ja2V0LCB1bnNpZ25lZCBhY3Rpb24pCit7CisJaW50IHI7CisKKwlfbHZtcG9sbGQgPSBfbHZtcG9sbGRfb3Blbihzb2NrZXQpOworCisJaWYgKF9sdm1wb2xsZC5lcnJvciB8fCBfbHZtcG9sbGQuc29ja2V0X2ZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiB3aXRoIGx2bXBvbGxkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXIgPSBfbWFrZV9hY3Rpb24oYWN0aW9uLCBOVUxMKTsKKworCWRhZW1vbl9jbG9zZShfbHZtcG9sbGQpOworCisJcmV0dXJuIHIgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7Cit9CisKK3N0YXRpYyBpbnQgYWN0aW9uX2lkeCA9IEFDVElPTl9NQVg7CitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkvKiBIYXZlIGFjdGlvbnMgYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiAqLworCXsiZHVtcCIsCW5vX2FyZ3VtZW50LAkJJmFjdGlvbl9pZHgsCUFDVElPTl9EVU1QIH0sIC8qIG9yIGFuIG9wdGlvbl9pbmRleCA/ICovCisKKwkvKiBvdGhlciBvcHRpb25zICovCisJeyJiaW5hcnkiLAlyZXF1aXJlZF9hcmd1bWVudCwJMCwJCSdCJyB9LAorCXsiZm9yZWdyb3VuZCIsCW5vX2FyZ3VtZW50LAkJMCwJCSdmJyB9LAorCXsiaGVscCIsCW5vX2FyZ3VtZW50LAkJMCwJCSdoJyB9LAorCXsibG9nIiwJCXJlcXVpcmVkX2FyZ3VtZW50LAkwLAkJJ2wnIH0sCisJeyJwaWRmaWxlIiwJcmVxdWlyZWRfYXJndW1lbnQsCTAsCQkncCcgfSwKKwl7InNvY2tldCIsCXJlcXVpcmVkX2FyZ3VtZW50LAkwLAkJJ3MnIH0sCisJeyJ0aW1lb3V0IiwJcmVxdWlyZWRfYXJndW1lbnQsCTAsCQkndCcgfSwKKwl7InZlcnNpb24iLAlub19hcmd1bWVudCwJCTAsCQknVicgfSwKKwl7MCwJCTAsCQkJMCwJCTAgfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgb3B0OworCWludCBvcHRpb25faW5kZXggPSAwOworCWludCBjbGllbnQgPSAwLCBzZXJ2ZXIgPSAwOworCXVuc2lnbmVkIGFjdGlvbiA9IEFDVElPTl9NQVg7CisJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKwlkYWVtb25faWRsZSBkaSA9IHsgLnB0aW1lb3V0ID0gJnRpbWVvdXQgfTsKKwlzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgbHMgPSB7IC5sb2dfY29uZmlnID0gIiIgfTsKKwlkYWVtb25fc3RhdGUgcyA9IHsKKwkJLmRhZW1vbl9maW5pID0gX2ZpbmksCisJCS5kYWVtb25faW5pdCA9IF9pbml0LAorCQkuaGFuZGxlciA9IF9oYW5kbGVyLAorCQkubmFtZSA9ICJsdm1wb2xsZCIsCisJCS5waWRmaWxlID0gZ2V0ZW52KCJMVk1fTFZNUE9MTERfUElERklMRSIpID86IExWTVBPTExEX1BJREZJTEUsCisJCS5wcml2YXRlID0gJmxzLAorCQkucHJvdG9jb2wgPSBMVk1QT0xMRF9QUk9UT0NPTCwKKwkJLnByb3RvY29sX3ZlcnNpb24gPSBMVk1QT0xMRF9QUk9UT0NPTF9WRVJTSU9OLAorCQkuc29ja2V0X3BhdGggPSBnZXRlbnYoIkxWTV9MVk1QT0xMRF9TT0NLRVQiKSA/OiBMVk1QT0xMRF9TT0NLRVQsCisJfTsKKworCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImZoVmw6cDpzOkI6dDoiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlIDAgOgorCQkJaWYgKGFjdGlvbiA8IEFDVElPTl9NQVgpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHBlcmZvcm0gbW9yZSBhY3Rpb25zLiBBY3Rpb24gYWxyZWFkeSByZXF1ZXN0ZWQ6ICVzXG4iLAorCQkJCQlsb25nX29wdGlvbnNbYWN0aW9uXS5uYW1lKTsKKwkJCQlfdXNhZ2UoYXJndlswXSwgc3RkZXJyKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlhY3Rpb24gPSBhY3Rpb25faWR4OworCQkJY2xpZW50ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCV91c2FnZShhcmd2WzBdLCBzdGRlcnIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQljYXNlICdCJzogLyogLS1iaW5hcnkgKi8KKwkJCWxzLmx2bV9iaW5hcnkgPSBvcHRhcmc7CisJCQlzZXJ2ZXIgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOiAvKiAtLXZlcnNpb24gKi8KKwkJCXByaW50ZigibHZtcG9sbGQgdmVyc2lvbjogIiBMVk1fVkVSU0lPTiAiXG4iKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJY2FzZSAnZic6IC8qIC0tZm9yZWdyb3VuZCAqLworCQkJcy5mb3JlZ3JvdW5kID0gMTsKKwkJCXNlcnZlciA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6IC8qIC0taGVscCAqLworCQkJX3VzYWdlKGFyZ3ZbMF0sIHN0ZG91dCk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJ2wnOiAvKiAtLWxvZyAqLworCQkJbHMubG9nX2NvbmZpZyA9IG9wdGFyZzsKKwkJCXNlcnZlciA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6IC8qIC0tcGlkZmlsZSAqLworCQkJcy5waWRmaWxlID0gb3B0YXJnOworCQkJc2VydmVyID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzogLyogLS1zb2NrZXQgKi8KKwkJCXMuc29ja2V0X3BhdGggPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndCc6IC8qIC0tdGltZW91dCBpbiBzZWNvbmRzICovCisJCQlpZiAoIXByb2Nlc3NfdGltZW91dF9hcmcob3B0YXJnLCAmZGkubWF4X3RpbWVvdXRzKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB2YWx1ZSBvZiB0aW1lb3V0IHBhcmFtZXRlci5cbiIpOworCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCS8qIDAgZXF1YWxzIHRvIHdhaXQgaW5kZWZpbml0ZWx5ICovCisJCQlpZiAoZGkubWF4X3RpbWVvdXRzKQorCQkJCXMuaWRsZSA9IGxzLmlkbGUgPSAmZGk7CisJCQlzZXJ2ZXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2xpZW50ICYmIHNlcnZlcikgeworCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgY29tYmluYXRpb24gb2YgY2xpZW50IGFuZCBzZXJ2ZXIgcGFyYW1ldGVycy5cblxuIik7CisJCV91c2FnZShhcmd2WzBdLCBzdGRvdXQpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKGNsaWVudCkKKwkJcmV0dXJuIF9sdm1wb2xsZF9jbGllbnQocy5zb2NrZXRfcGF0aCwgYWN0aW9uKTsKKworCS8qIFNlcnZlciAqLworCWRhZW1vbl9zdGFydChzKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWRhdGEtdXRpbHMuYyBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtZGF0YS11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODgzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWRhdGEtdXRpbHMuYwpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsdm1wb2xsZC1jb21tb24uaCIKKworI2luY2x1ZGUgImNvbmZpZy11dGlsLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgY2hhciAqX2NvbnN0cnVjdF9mdWxsX2x2bmFtZShjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKmx2bmFtZSkKK3sKKwljaGFyICpuYW1lOworCXNpemVfdCBsOworCisJbCA9IHN0cmxlbih2Z25hbWUpICsgc3RybGVuKGx2bmFtZSkgKyAyOyAvKiB2Zy9sdiBhbmQgXDAgKi8KKwluYW1lID0gKGNoYXIgKikgZG1fbWFsbG9jKGwgKiBzaXplb2YoY2hhcikpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZG1fc25wcmludGYobmFtZSwgbCwgIiVzLyVzIiwgdmduYW1lLCBsdm5hbWUpIDwgMCkgeworCQlkbV9mcmVlKG5hbWUpOworCQluYW1lID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNoYXIgKl9jb25zdHJ1Y3RfbHZtX3N5c3RlbV9kaXJfZW52KGNvbnN0IGNoYXIgKnN5c2RpcikKK3sKKwkvKgorCSAqICBTdG9yZSBlaXRoZXIgIkxWTV9TWVNURU1fRElSPS9wYXRoL3RvLi4uIgorCSAqCQkgICAgLSBvciAtCisJICogIGp1c3Qgc2luZ2xlIGNoYXIgdG8gc3RvcmUgTlVMTCBieXRlCisJICovCisJc2l6ZV90IGwgPSBzeXNkaXIgPyBzdHJsZW4oc3lzZGlyKSArIDE2IDogMTsKKwljaGFyICplbnYgPSAoY2hhciAqKSBkbV9tYWxsb2MobCAqIHNpemVvZihjaGFyKSk7CisKKwlpZiAoIWVudikKKwkJcmV0dXJuIE5VTEw7CisKKwkqZW52ID0gJ1wwJzsKKworCWlmIChzeXNkaXIgJiYgZG1fc25wcmludGYoZW52LCBsLCAiTFZNX1NZU1RFTV9ESVI9JXMiLCBzeXNkaXIpIDwgMCkgeworCQlkbV9mcmVlKGVudik7CisJCWVudiA9IE5VTEw7CisJfQorCisJcmV0dXJuIGVudjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRfbHZpZChjb25zdCBjaGFyICpsdm1wb2xsZF9pZCwgY29uc3QgY2hhciAqc3lzZGlyKQoreworCXJldHVybiBsdm1wb2xsZF9pZCA/IChsdm1wb2xsZF9pZCArIChzeXNkaXIgPyBzdHJsZW4oc3lzZGlyKSA6IDApKSA6IE5VTEw7Cit9CisKK2NoYXIgKmNvbnN0cnVjdF9pZChjb25zdCBjaGFyICpzeXNkaXIsIGNvbnN0IGNoYXIgKnV1aWQpCit7CisJY2hhciAqaWQ7CisJaW50IHI7CisJc2l6ZV90IGw7CisKKwlsID0gc3RybGVuKHV1aWQpICsgKHN5c2RpciA/IHN0cmxlbihzeXNkaXIpIDogMCkgKyAxOworCWlkID0gKGNoYXIgKikgZG1fbWFsbG9jKGwgKiBzaXplb2YoY2hhcikpOworCWlmICghaWQpCisJCXJldHVybiBOVUxMOworCisJciA9IHN5c2RpciA/IGRtX3NucHJpbnRmKGlkLCBsLCAiJXMlcyIsIHN5c2RpciwgdXVpZCkgOgorCQkgICAgIGRtX3NucHJpbnRmKGlkLCBsLCAiJXMiLCB1dWlkKTsKKworCWlmIChyIDwgMCkgeworCQlkbV9mcmVlKGlkKTsKKwkJaWQgPSBOVUxMOworCX0KKworCXJldHVybiBpZDsKK30KKworc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2X2NyZWF0ZShzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmxzLCBjb25zdCBjaGFyICppZCwKKwkJCSAgIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqbHZuYW1lLAorCQkJICAgY29uc3QgY2hhciAqc3lzZGlyLCBlbnVtIHBvbGxfdHlwZSB0eXBlLAorCQkJICAgY29uc3QgY2hhciAqc2ludGVydmFsLCB1bnNpZ25lZCBwZHRpbWVvdXQsCisJCQkgICBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpCit7CisJY2hhciAqbHZtcG9sbGRfaWQgPSBkbV9zdHJkdXAoaWQpLCAvKiBjb3B5ICovCisJICAgICAqZnVsbF9sdm5hbWUgPSBfY29uc3RydWN0X2Z1bGxfbHZuYW1lKHZnbmFtZSwgbHZuYW1lKSwgLyogY29weSAqLworCSAgICAgKmx2bV9zeXN0ZW1fZGlyX2VudiA9IF9jb25zdHJ1Y3RfbHZtX3N5c3RlbV9kaXJfZW52KHN5c2Rpcik7IC8qIGNvcHkgKi8KKworCXN0cnVjdCBsdm1wb2xsZF9sdiB0bXAgPSB7CisJCS5scyA9IGxzLAorCQkudHlwZSA9IHR5cGUsCisJCS5sdm1wb2xsZF9pZCA9IGx2bXBvbGxkX2lkLAorCQkubHZpZCA9IF9nZXRfbHZpZChsdm1wb2xsZF9pZCwgc3lzZGlyKSwKKwkJLmx2bmFtZSA9IGZ1bGxfbHZuYW1lLAorCQkubHZtX3N5c3RlbV9kaXJfZW52ID0gbHZtX3N5c3RlbV9kaXJfZW52LAorCQkuc2ludGVydmFsID0gZG1fc3RyZHVwKHNpbnRlcnZhbCksIC8qIGNvcHkgKi8KKwkJLnBkdGltZW91dCA9IHBkdGltZW91dCA8IE1JTl9QT0xMSU5HX1RJTUVPVVQgPyBNSU5fUE9MTElOR19USU1FT1VUIDogcGR0aW1lb3V0LAorCQkuY21kX3N0YXRlID0geyAucmV0Y29kZSA9IC0xLCAuc2lnbmFsID0gMCB9LAorCQkucGRzdCA9IHBkc3QsCisJCS5pbml0X3JxX2NvdW50ID0gMQorCX0sICpwZGx2ID0gKHN0cnVjdCBsdm1wb2xsZF9sdiAqKSBkbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBsdm1wb2xsZF9sdikpOworCisJaWYgKCFwZGx2IHx8ICF0bXAubHZpZCB8fCAhdG1wLmx2bmFtZSB8fCAhdG1wLmx2bV9zeXN0ZW1fZGlyX2VudiB8fCAhdG1wLnNpbnRlcnZhbCkKKwkJZ290byBlcnI7CisKKwltZW1jcHkocGRsdiwgJnRtcCwgc2l6ZW9mKCpwZGx2KSk7CisKKwlpZiAocHRocmVhZF9tdXRleF9pbml0KCZwZGx2LT5sb2NrLCBOVUxMKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcGRsdjsKKworZXJyOgorCWRtX2ZyZWUoKHZvaWQgKilmdWxsX2x2bmFtZSk7CisJZG1fZnJlZSgodm9pZCAqKWx2bXBvbGxkX2lkKTsKKwlkbV9mcmVlKCh2b2lkICopbHZtX3N5c3RlbV9kaXJfZW52KTsKKwlkbV9mcmVlKCh2b2lkICopdG1wLnNpbnRlcnZhbCk7CisJZG1fZnJlZSgodm9pZCAqKXBkbHYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgcGRsdl9kZXN0cm95KHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdikKK3sKKwlkbV9mcmVlKCh2b2lkICopcGRsdi0+bHZtcG9sbGRfaWQpOworCWRtX2ZyZWUoKHZvaWQgKilwZGx2LT5sdm5hbWUpOworCWRtX2ZyZWUoKHZvaWQgKilwZGx2LT5zaW50ZXJ2YWwpOworCWRtX2ZyZWUoKHZvaWQgKilwZGx2LT5sdm1fc3lzdGVtX2Rpcl9lbnYpOworCWRtX2ZyZWUoKHZvaWQgKilwZGx2LT5jbWRhcmd2KTsKKwlkbV9mcmVlKCh2b2lkICopcGRsdi0+Y21kZW52cCk7CisKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBkbHYtPmxvY2spOworCisJZG1fZnJlZSgodm9pZCAqKXBkbHYpOworfQorCit1bnNpZ25lZCBwZGx2X2dldF9wb2xsaW5nX2ZpbmlzaGVkKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdikKK3sKKwl1bnNpZ25lZCByZXQ7CisKKwlwZGx2X2xvY2socGRsdik7CisJcmV0ID0gcGRsdi0+cG9sbGluZ19maW5pc2hlZDsKKwlwZGx2X3VubG9jayhwZGx2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBsdm1wb2xsZF9sdl9zdGF0ZSBwZGx2X2dldF9zdGF0dXMoc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2KQoreworCXN0cnVjdCBsdm1wb2xsZF9sdl9zdGF0ZSByOworCisJcGRsdl9sb2NrKHBkbHYpOworCXIuZXJyb3IgPSBwZGx2X2xvY2tlZF9lcnJvcihwZGx2KTsKKwlyLnBvbGxpbmdfZmluaXNoZWQgPSBwZGx2X2xvY2tlZF9wb2xsaW5nX2ZpbmlzaGVkKHBkbHYpOworCXIuY21kX3N0YXRlID0gcGRsdl9sb2NrZWRfY21kX3N0YXRlKHBkbHYpOworCXBkbHZfdW5sb2NrKHBkbHYpOworCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgcGRsdl9zZXRfY21kX3N0YXRlKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdiwgY29uc3Qgc3RydWN0IGx2bXBvbGxkX2NtZF9zdGF0ICpjbWRfc3RhdGUpCit7CisJcGRsdl9sb2NrKHBkbHYpOworCXBkbHYtPmNtZF9zdGF0ZSA9ICpjbWRfc3RhdGU7CisJcGRsdl91bmxvY2socGRsdik7Cit9CisKK3ZvaWQgcGRsdl9zZXRfZXJyb3Ioc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2LCB1bnNpZ25lZCBlcnJvcikKK3sKKwlwZGx2X2xvY2socGRsdik7CisJcGRsdi0+ZXJyb3IgPSBlcnJvcjsKKwlwZGx2X3VubG9jayhwZGx2KTsKK30KKwordm9pZCBwZGx2X3NldF9wb2xsaW5nX2ZpbmlzaGVkKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdiwgdW5zaWduZWQgZmluaXNoZWQpCit7CisJcGRsdl9sb2NrKHBkbHYpOworCXBkbHYtPnBvbGxpbmdfZmluaXNoZWQgPSBmaW5pc2hlZDsKKwlwZGx2X3VubG9jayhwZGx2KTsKK30KKworc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0X2luaXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QgPSAoc3RydWN0IGx2bXBvbGxkX3N0b3JlICopIGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IGx2bXBvbGxkX3N0b3JlKSk7CisJaWYgKCFwZHN0KQorCQlyZXR1cm4gTlVMTDsKKworCXBkc3QtPnN0b3JlID0gZG1faGFzaF9jcmVhdGUoMzIpOworCWlmICghcGRzdC0+c3RvcmUpCisJCWdvdG8gZXJyX2hhc2g7CisJaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmcGRzdC0+bG9jaywgTlVMTCkpCisJCWdvdG8gZXJyX211dGV4OworCisJcGRzdC0+bmFtZSA9IG5hbWU7CisJcGRzdC0+YWN0aXZlX3BvbGxpbmdfY291bnQgPSAwOworCisJcmV0dXJuIHBkc3Q7CisKK2Vycl9tdXRleDoKKwlkbV9oYXNoX2Rlc3Ryb3kocGRzdC0+c3RvcmUpOworZXJyX2hhc2g6CisJZG1fZnJlZShwZHN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBwZHN0X2Rlc3Ryb3koc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0KQoreworCWlmICghcGRzdCkKKwkJcmV0dXJuOworCisJZG1faGFzaF9kZXN0cm95KHBkc3QtPnN0b3JlKTsKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBkc3QtPmxvY2spOworCWRtX2ZyZWUocGRzdCk7Cit9CisKK3ZvaWQgcGRzdF9sb2NrZWRfbG9ja19hbGxfcGRsdnMoY29uc3Qgc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0KQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisKKwlkbV9oYXNoX2l0ZXJhdGUobiwgcGRzdC0+c3RvcmUpCisJCXBkbHZfbG9jayhkbV9oYXNoX2dldF9kYXRhKHBkc3QtPnN0b3JlLCBuKSk7Cit9CisKK3ZvaWQgcGRzdF9sb2NrZWRfdW5sb2NrX2FsbF9wZGx2cyhjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBwZHN0LT5zdG9yZSkKKwkJcGRsdl91bmxvY2soZG1faGFzaF9nZXRfZGF0YShwZHN0LT5zdG9yZSwgbikpOworfQorCitzdGF0aWMgdm9pZCBfcGRsdl9sb2NrZWRfZHVtcChzdHJ1Y3QgYnVmZmVyICpidWZmLCBjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJY2hhciB0bXBbMTAyNF07CisJY29uc3Qgc3RydWN0IGx2bXBvbGxkX2NtZF9zdGF0ICpjbWRfc3RhdGUgPSAmcGRsdi0+Y21kX3N0YXRlOworCisJLyogcGRsdi1zZWN0aW9uIHsgKi8KKwlpZiAoZG1fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlx0JXMge1xuIiwgcGRsdi0+bHZtcG9sbGRfaWQpID4gMCkKKwkJYnVmZmVyX2FwcGVuZChidWZmLCB0bXApOworCisJaWYgKGRtX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJcdFx0bHZpZD1cIiVzXCJcbiIsIHBkbHYtPmx2aWQpID4gMCkKKwkJYnVmZmVyX2FwcGVuZChidWZmLCB0bXApOworCWlmIChkbV9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiXHRcdHR5cGU9XCIlc1wiXG4iLCBwb2xsaW5nX29wKHBkbHYtPnR5cGUpKSA+IDApCisJCWJ1ZmZlcl9hcHBlbmQoYnVmZiwgdG1wKTsKKwlpZiAoZG1fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlx0XHRsdm5hbWU9XCIlc1wiXG4iLCBwZGx2LT5sdm5hbWUpID4gMCkKKwkJYnVmZmVyX2FwcGVuZChidWZmLCB0bXApOworCWlmIChkbV9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiXHRcdGx2bXBvbGxkX2ludGVybmFsX3RpbWVvdXQ9JWRcbiIsIHBkbHYtPnBkdGltZW91dCkgPiAwKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsIHRtcCk7CisJaWYgKGRtX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJcdFx0bHZtX2NvbW1hbmRfaW50ZXJ2YWw9XCIlc1wiXG4iLCBwZGx2LT5zaW50ZXJ2YWwgPzogIjx1bmRlZmluZWQ+IikgPiAwKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsIHRtcCk7CisJaWYgKGRtX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJcdFx0TFZNX1NZU1RFTV9ESVI9XCIlc1wiXG4iLAorCQkJKCpwZGx2LT5sdm1fc3lzdGVtX2Rpcl9lbnYgPyAocGRsdi0+bHZtX3N5c3RlbV9kaXJfZW52ICsgc3RybGVuKCJMVk1fU1lTVEVNX0RJUj0iKSkgOiAiPHVuZGVmaW5lZD4iKSkgPiAwKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsIHRtcCk7CisJaWYgKGRtX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJcdFx0bHZtX2NvbW1hbmRfcGlkPSVkXG4iLCBwZGx2LT5jbWRfcGlkKSA+IDApCisJCWJ1ZmZlcl9hcHBlbmQoYnVmZiwgdG1wKTsKKwlpZiAoZG1fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlx0XHRwb2xsaW5nX2ZpbmlzaGVkPSVkXG4iLCBwZGx2LT5wb2xsaW5nX2ZpbmlzaGVkKSA+IDApCisJCWJ1ZmZlcl9hcHBlbmQoYnVmZiwgdG1wKTsKKwlpZiAoZG1fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlx0XHRlcnJvcl9vY2N1cmVkPSVkXG4iLCBwZGx2LT5lcnJvcikgPiAwKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsIHRtcCk7CisJaWYgKGRtX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJcdFx0aW5pdF9yZXF1ZXN0c19jb3VudD0lZFxuIiwgcGRsdi0+aW5pdF9ycV9jb3VudCkgPiAwKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsIHRtcCk7CisKKwkvKiBsdm1fY29tbW1hbmQtc2VjdGlvbiB7ICovCisJYnVmZmVyX2FwcGVuZChidWZmLCAiXHRcdGx2bV9jb21tYW5kIHtcbiIpOworCWlmIChjbWRfc3RhdGUtPnJldGNvZGUgPT0gLTEgJiYgIWNtZF9zdGF0ZS0+c2lnbmFsKQorCQlidWZmZXJfYXBwZW5kKGJ1ZmYsICJcdFx0XHRzdGF0ZT1cIiIgTFZNUERfUkVTUF9JTl9QUk9HUkVTUyAiXCJcbiIpOworCWVsc2UgeworCQlidWZmZXJfYXBwZW5kKGJ1ZmYsICJcdFx0XHRzdGF0ZT1cIiIgTFZNUERfUkVTUF9GSU5JU0hFRCAiXCJcbiIpOworCQlpZiAoZG1fc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlx0XHRcdHJlYXNvbj1cIiVzXCJcblx0XHRcdHZhbHVlPSVkXG4iLAorCQkJCShjbWRfc3RhdGUtPnNpZ25hbCA/IExWTVBEX1JFQVNfU0lHTkFMIDogTFZNUERfUkVBU19SRVRDT0RFKSwKKwkJCQkoY21kX3N0YXRlLT5zaWduYWwgPzogY21kX3N0YXRlLT5yZXRjb2RlKSkgPiAwKQorCQkJYnVmZmVyX2FwcGVuZChidWZmLCB0bXApOworCX0KKwlidWZmZXJfYXBwZW5kKGJ1ZmYsICJcdFx0fVxuIik7CisJLyogfSBsdm1fY29tbW1hbmQtc2VjdGlvbiAqLworCisJYnVmZmVyX2FwcGVuZChidWZmLCAiXHR9XG4iKTsKKwkvKiB9IHBkbHYtc2VjdGlvbiAqLworfQorCit2b2lkIHBkc3RfbG9ja2VkX2R1bXAoY29uc3Qgc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0LCBzdHJ1Y3QgYnVmZmVyICpidWZmKQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisKKwlkbV9oYXNoX2l0ZXJhdGUobiwgcGRzdC0+c3RvcmUpCisJCV9wZGx2X2xvY2tlZF9kdW1wKGJ1ZmYsIGRtX2hhc2hfZ2V0X2RhdGEocGRzdC0+c3RvcmUsIG4pKTsKK30KKwordm9pZCBwZHN0X2xvY2tlZF9zZW5kX2NhbmNlbChjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpCit7CisJc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2OworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisKKwlkbV9oYXNoX2l0ZXJhdGUobiwgcGRzdC0+c3RvcmUpIHsKKwkJcGRsdiA9IGRtX2hhc2hfZ2V0X2RhdGEocGRzdC0+c3RvcmUsIG4pOworCQlpZiAoIXBkbHZfbG9ja2VkX3BvbGxpbmdfZmluaXNoZWQocGRsdikpCisJCQlwdGhyZWFkX2NhbmNlbChwZGx2LT50aWQpOworCX0KK30KKwordm9pZCBwZHN0X2xvY2tlZF9kZXN0cm95X2FsbF9wZGx2cyhjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKworCWRtX2hhc2hfaXRlcmF0ZShuLCBwZHN0LT5zdG9yZSkKKwkJcGRsdl9kZXN0cm95KGRtX2hhc2hfZ2V0X2RhdGEocGRzdC0+c3RvcmUsIG4pKTsKK30KKworc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpsdm1wb2xsZF90aHJlYWRfZGF0YV9jb25zdHJ1Y3RvcihzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpkYXRhID0gKHN0cnVjdCBsdm1wb2xsZF90aHJlYWRfZGF0YSAqKSBkbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBsdm1wb2xsZF90aHJlYWRfZGF0YSkpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhLT5wZGx2ID0gTlVMTDsKKwlkYXRhLT5saW5lID0gTlVMTDsKKwlkYXRhLT5saW5lX3NpemUgPSAwOworCWRhdGEtPmZvdXQgPSBkYXRhLT5mZXJyID0gTlVMTDsKKwlkYXRhLT5vdXRwaXBlWzBdID0gZGF0YS0+b3V0cGlwZVsxXSA9IGRhdGEtPmVycnBpcGVbMF0gPSBkYXRhLT5lcnJwaXBlWzFdID0gLTE7CisKKwlpZiAocGlwZShkYXRhLT5vdXRwaXBlKSB8fCBwaXBlKGRhdGEtPmVycnBpcGUpKSB7CisJCWx2bXBvbGxkX3RocmVhZF9kYXRhX2Rlc3Ryb3koZGF0YSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChmY250bChkYXRhLT5vdXRwaXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSB8fAorCSAgICBmY250bChkYXRhLT5vdXRwaXBlWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSB8fAorCSAgICBmY250bChkYXRhLT5lcnJwaXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSB8fAorCSAgICBmY250bChkYXRhLT5lcnJwaXBlWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKSkgeworCQlsdm1wb2xsZF90aHJlYWRfZGF0YV9kZXN0cm95KGRhdGEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkYXRhLT5wZGx2ID0gcGRsdjsKKworCXJldHVybiBkYXRhOworfQorCit2b2lkIGx2bXBvbGxkX3RocmVhZF9kYXRhX2Rlc3Ryb3kodm9pZCAqdGhyZWFkX3ByaXZhdGUpCit7CisJc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpkYXRhID0gKHN0cnVjdCBsdm1wb2xsZF90aHJlYWRfZGF0YSAqKSB0aHJlYWRfcHJpdmF0ZTsKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWlmIChkYXRhLT5wZGx2KSB7CisJCXBkc3RfbG9jayhkYXRhLT5wZGx2LT5wZHN0KTsKKwkJLyoKKwkJICogRklYTUU6IHNraXAgdGhpcyBzdGVwIGlmIGx2bXBvbGxkIGlzIGFjdGl2YXRlZAorCQkgKiAJICBieSBzeXN0ZW1kLgorCQkgKi8KKwkJaWYgKCFwZGx2X2dldF9wb2xsaW5nX2ZpbmlzaGVkKGRhdGEtPnBkbHYpKQorCQkJa2lsbChkYXRhLT5wZGx2LT5jbWRfcGlkLCBTSUdURVJNKTsKKwkJcGRsdl9zZXRfcG9sbGluZ19maW5pc2hlZChkYXRhLT5wZGx2LCAxKTsKKwkJcGRzdF9sb2NrZWRfZGVjKGRhdGEtPnBkbHYtPnBkc3QpOworCQlwZHN0X3VubG9jayhkYXRhLT5wZGx2LT5wZHN0KTsKKwl9CisKKwkvKiBtYXkgZ2V0IHJlYWxsb2NhdGVkIGluIGdldGxpbmUoKS4gZG1fZnJlZSBtdXN0IG5vdCBiZSB1c2VkICovCisJZnJlZShkYXRhLT5saW5lKTsKKworCWlmIChkYXRhLT5mb3V0ICYmICFmY2xvc2UoZGF0YS0+Zm91dCkpCisJCWRhdGEtPm91dHBpcGVbMF0gPSAtMTsKKworCWlmIChkYXRhLT5mZXJyICYmICFmY2xvc2UoZGF0YS0+ZmVycikpCisJCWRhdGEtPmVycnBpcGVbMF0gPSAtMTsKKworCWlmIChkYXRhLT5vdXRwaXBlWzBdID49IDApCisJCSh2b2lkKSBjbG9zZShkYXRhLT5vdXRwaXBlWzBdKTsKKworCWlmIChkYXRhLT5vdXRwaXBlWzFdID49IDApCisJCSh2b2lkKSBjbG9zZShkYXRhLT5vdXRwaXBlWzFdKTsKKworCWlmIChkYXRhLT5lcnJwaXBlWzBdID49IDApCisJCSh2b2lkKSBjbG9zZShkYXRhLT5lcnJwaXBlWzBdKTsKKworCWlmIChkYXRhLT5lcnJwaXBlWzFdID49IDApCisJCSh2b2lkKSBjbG9zZShkYXRhLT5lcnJwaXBlWzFdKTsKKworCWRtX2ZyZWUoZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWRhdGEtdXRpbHMuaCBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtZGF0YS11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjVjODYKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLWRhdGEtdXRpbHMuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9MVk1QT0xMRF9EQVRBX1VUSUxTX0gKKyNkZWZpbmUgX0xWTV9MVk1QT0xMRF9EQVRBX1VUSUxTX0gKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworc3RydWN0IGJ1ZmZlcjsKK3N0cnVjdCBsdm1wb2xsZF9zdGF0ZTsKKworZW51bSBwb2xsX3R5cGUgeworCVBWTU9WRSA9IDAsCisJQ09OVkVSVCwKKwlNRVJHRSwKKwlNRVJHRV9USElOLAorCVBPTExfVFlQRV9NQVgKK307CisKK3N0cnVjdCBsdm1wb2xsZF9jbWRfc3RhdCB7CisJaW50IHJldGNvZGU7CisJaW50IHNpZ25hbDsKK307CisKK3N0cnVjdCBsdm1wb2xsZF9zdG9yZSB7CisJcHRocmVhZF9tdXRleF90IGxvY2s7CisJdm9pZCAqc3RvcmU7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBhY3RpdmVfcG9sbGluZ19jb3VudDsKK307CisKK3N0cnVjdCBsdm1wb2xsZF9sdiB7CisJLyoKKwkgKiBhY2Nlc3NpbmcgZm9sbG93aW5nIHZhcnMgZG9lc24ndAorCSAqIHJlcXVpcmUgc3RydWN0IGx2bXBvbGxkX2x2IGxvY2sKKwkgKi8KKwlzdHJ1Y3QgbHZtcG9sbGRfc3RhdGUgKmNvbnN0IGxzOworCWNvbnN0IGVudW0gcG9sbF90eXBlIHR5cGU7CisJY29uc3QgY2hhciAqY29uc3QgbHZpZDsKKwljb25zdCBjaGFyICpjb25zdCBsdm1wb2xsZF9pZDsKKwljb25zdCBjaGFyICpjb25zdCBsdm5hbWU7IC8qIGZ1bGwgdmcvbHYgbmFtZSAqLworCWNvbnN0IHVuc2lnbmVkIHBkdGltZW91dDsgLyogaW4gc2Vjb25kcyAqLworCWNvbnN0IGNoYXIgKmNvbnN0IHNpbnRlcnZhbDsKKwljb25zdCBjaGFyICpjb25zdCBsdm1fc3lzdGVtX2Rpcl9lbnY7CisJc3RydWN0IGx2bXBvbGxkX3N0b3JlICpjb25zdCBwZHN0OworCWNvbnN0IGNoYXIgKmNvbnN0ICpjbWRhcmd2OworCWNvbnN0IGNoYXIgKmNvbnN0ICpjbWRlbnZwOworCisJLyogb25seSB1c2VkIGJ5IHdyaXRlICovCisJcGlkX3QgY21kX3BpZDsKKwlwdGhyZWFkX3QgdGlkOworCisJcHRocmVhZF9tdXRleF90IGxvY2s7CisKKwkvKiBibG9jayBvZiBzaGFyZWQgdmFyaWFibGVzIHByb3RlY3RlZCBieSBsb2NrICovCisJc3RydWN0IGx2bXBvbGxkX2NtZF9zdGF0IGNtZF9zdGF0ZTsKKwl1bnNpZ25lZCBpbml0X3JxX2NvdW50OyAvKiBmb3IgZGVidWdpbmcgcHVycG9zZXMgb25seSAqLworCXVuc2lnbmVkIHBvbGxpbmdfZmluaXNoZWQ6MTsgLyogbm8gbW9yZSB1cGRhdGVzICovCisJdW5zaWduZWQgZXJyb3I6MTsgLyogdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGluIGx2bXBvbGxkICovCit9OworCit0eXBlZGVmIHZvaWQgKCpsdm1wb2xsZF9wYXJzZV9vdXRwdXRfZm5fdCkgKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdiwgY29uc3QgY2hhciAqbGluZSk7CisKKy8qIFRPRE86IHJlcGxhY2Ugd2l0aCBjb25maWd1cmF0aW9uIG9wdGlvbiAqLworI2RlZmluZSBNSU5fUE9MTElOR19USU1FT1VUIDYwCisKK3N0cnVjdCBsdm1wb2xsZF9sdl9zdGF0ZSB7CisJdW5zaWduZWQgZXJyb3I6MTsKKwl1bnNpZ25lZCBwb2xsaW5nX2ZpbmlzaGVkOjE7CisJc3RydWN0IGx2bXBvbGxkX2NtZF9zdGF0IGNtZF9zdGF0ZTsKK307CisKK3N0cnVjdCBsdm1wb2xsZF90aHJlYWRfZGF0YSB7CisJY2hhciAqbGluZTsKKwlzaXplX3QgbGluZV9zaXplOworCWludCBvdXRwaXBlWzJdOworCWludCBlcnJwaXBlWzJdOworCUZJTEUgKmZvdXQ7CisJRklMRSAqZmVycjsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHY7Cit9OworCitjaGFyICpjb25zdHJ1Y3RfaWQoY29uc3QgY2hhciAqc3lzZGlyLCBjb25zdCBjaGFyICpsdmlkKTsKKworLyogTFZNUE9MTERfTFZfVCBzZWN0aW9uICovCisKKy8qIG9ubHkgY2FsbCB3aXRoIGFwcHJvcHJpYXRlIHN0cnVjdCBsdm1wb2xsZF9zdG9yZSBsb2NrIGhlbGQgKi8KK3N0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdl9jcmVhdGUoc3RydWN0IGx2bXBvbGxkX3N0YXRlICpscywgY29uc3QgY2hhciAqaWQsCisJCQkgICBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKmx2bmFtZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnN5c2RpciwgZW51bSBwb2xsX3R5cGUgdHlwZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnNpbnRlcnZhbCwgdW5zaWduZWQgcGR0aW1lb3V0LAorCQkJICAgc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0KTsKKworLyogb25seSBjYWxsIHdpdGggYXBwcm9wcmlhdGUgc3RydWN0IGx2bXBvbGxkX3N0b3JlIGxvY2sgaGVsZCAqLwordm9pZCBwZGx2X2Rlc3Ryb3koc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2KTsKKworc3RhdGljIGlubGluZSB2b2lkIHBkbHZfbG9jayhzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZwZGx2LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBkbHZfdW5sb2NrKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdikKK3sKKwlwdGhyZWFkX211dGV4X3VubG9jaygmcGRsdi0+bG9jayk7Cit9CisKKy8qCisgKiBubyBzdHJ1Y3QgbHZtcG9sbGRfbHYgbG9jayByZXF1aXJlZCBzZWN0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBkbHZfaXNfdHlwZShjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYsIGVudW0gcG9sbF90eXBlIHR5cGUpCit7CisJcmV0dXJuIHBkbHYtPnR5cGUgPT0gdHlwZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBwZGx2X2dldF90aW1lb3V0KGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdikKK3sKKwlyZXR1cm4gcGRsdi0+cGR0aW1lb3V0OworfQorCitzdGF0aWMgaW5saW5lIGVudW0gcG9sbF90eXBlIHBkbHZfZ2V0X3R5cGUoY29uc3Qgc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2KQoreworCXJldHVybiBwZGx2LT50eXBlOworfQorCit1bnNpZ25lZCBwZGx2X2dldF9wb2xsaW5nX2ZpbmlzaGVkKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdik7CitzdHJ1Y3QgbHZtcG9sbGRfbHZfc3RhdGUgcGRsdl9nZXRfc3RhdHVzKHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRsdik7Cit2b2lkIHBkbHZfc2V0X2NtZF9zdGF0ZShzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYsIGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9jbWRfc3RhdCAqY21kX3N0YXRlKTsKK3ZvaWQgcGRsdl9zZXRfZXJyb3Ioc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2LCB1bnNpZ25lZCBlcnJvcik7Cit2b2lkIHBkbHZfc2V0X3BvbGxpbmdfZmluaXNoZWQoc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2LCB1bnNpZ25lZCBmaW5pc2hlZCk7CisKKy8qCisgKiBzdHJ1Y3QgbHZtcG9sbGRfbHYgbG9jayByZXF1aXJlZCBzZWN0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGx2bXBvbGxkX2NtZF9zdGF0IHBkbHZfbG9ja2VkX2NtZF9zdGF0ZShjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJcmV0dXJuIHBkbHYtPmNtZF9zdGF0ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGRsdl9sb2NrZWRfcG9sbGluZ19maW5pc2hlZChjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJcmV0dXJuIHBkbHYtPnBvbGxpbmdfZmluaXNoZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcGRsdl9sb2NrZWRfZXJyb3IoY29uc3Qgc3RydWN0IGx2bXBvbGxkX2x2ICpwZGx2KQoreworCXJldHVybiBwZGx2LT5lcnJvcjsKK30KKworLyogc3RydWN0IGx2bXBvbGxkX3N0b3JlIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLworCitzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3RfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgcGRzdF9kZXN0cm95KHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCk7CisKK3ZvaWQgcGRzdF9sb2NrZWRfZHVtcChjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QsIHN0cnVjdCBidWZmZXIgKmJ1ZmYpOwordm9pZCBwZHN0X2xvY2tlZF9sb2NrX2FsbF9wZGx2cyhjb25zdCBzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpOwordm9pZCBwZHN0X2xvY2tlZF91bmxvY2tfYWxsX3BkbHZzKGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCk7Cit2b2lkIHBkc3RfbG9ja2VkX2Rlc3Ryb3lfYWxsX3BkbHZzKGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCk7Cit2b2lkIHBkc3RfbG9ja2VkX3NlbmRfY2FuY2VsKGNvbnN0IHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZHN0X2xvY2soc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0KQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmcGRzdC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZHN0X3VubG9jayhzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QpCit7CisJcHRocmVhZF9tdXRleF91bmxvY2soJnBkc3QtPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRzdF9sb2NrZWRfaW5jKHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCkKK3sKKwlwZHN0LT5hY3RpdmVfcG9sbGluZ19jb3VudCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRzdF9sb2NrZWRfZGVjKHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCkKK3sKKwlwZHN0LT5hY3RpdmVfcG9sbGluZ19jb3VudC0tOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBkc3RfbG9ja2VkX2dldF9hY3RpdmVfY291bnQoY29uc3Qgc3RydWN0IGx2bXBvbGxkX3N0b3JlICpwZHN0KQoreworCXJldHVybiBwZHN0LT5hY3RpdmVfcG9sbGluZ19jb3VudDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGRzdF9sb2NrZWRfaW5zZXJ0KHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCwgY29uc3QgY2hhciAqa2V5LCBzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpCit7CisJcmV0dXJuIGRtX2hhc2hfaW5zZXJ0KHBkc3QtPnN0b3JlLCBrZXksIHBkbHYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsdm1wb2xsZF9sdiAqcGRzdF9sb2NrZWRfbG9va3VwKHN0cnVjdCBsdm1wb2xsZF9zdG9yZSAqcGRzdCwgY29uc3QgY2hhciAqa2V5KQoreworCXJldHVybiBkbV9oYXNoX2xvb2t1cChwZHN0LT5zdG9yZSwga2V5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBkc3RfbG9ja2VkX3JlbW92ZShzdHJ1Y3QgbHZtcG9sbGRfc3RvcmUgKnBkc3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlkbV9oYXNoX3JlbW92ZShwZHN0LT5zdG9yZSwga2V5KTsKK30KKworc3RydWN0IGx2bXBvbGxkX3RocmVhZF9kYXRhICpsdm1wb2xsZF90aHJlYWRfZGF0YV9jb25zdHJ1Y3RvcihzdHJ1Y3QgbHZtcG9sbGRfbHYgKnBkbHYpOwordm9pZCBsdm1wb2xsZF90aHJlYWRfZGF0YV9kZXN0cm95KHZvaWQgKnRocmVhZF9wcml2YXRlKTsKKworI2VuZGlmIC8qIF9MVk1fTFZNUE9MTERfREFUQV9VVElMU19IICovCmRpZmYgLS1naXQgYS9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLXByb3RvY29sLmggYi9kYWVtb25zL2x2bXBvbGxkL2x2bXBvbGxkLXByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2YWU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtcHJvdG9jb2wuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9MVk1QT0xMRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9MVk1fTFZNUE9MTERfUFJPVE9DT0xfSAorCisjaW5jbHVkZSAicG9sbGluZ19vcHMuaCIKKworI2RlZmluZSBMVk1QT0xMRF9QUk9UT0NPTCAibHZtcG9sbGQiCisjZGVmaW5lIExWTVBPTExEX1BST1RPQ09MX1ZFUlNJT04gMQorCisjZGVmaW5lIExWTVBEX1JFUV9DT05WRVJUCUNPTlZFUlRfUE9MTAorI2RlZmluZSBMVk1QRF9SRVFfRFVNUAkJImR1bXAiCisjZGVmaW5lIExWTVBEX1JFUV9NRVJHRQkJTUVSR0VfUE9MTAorI2RlZmluZSBMVk1QRF9SRVFfTUVSR0VfVEhJTglNRVJHRV9USElOX1BPTEwKKyNkZWZpbmUgTFZNUERfUkVRX1BST0dSRVNTCSJwcm9ncmVzc19pbmZvIgorI2RlZmluZSBMVk1QRF9SRVFfUFZNT1ZFCVBWTU9WRV9QT0xMCisKKyNkZWZpbmUgTFZNUERfUEFSTV9BQk9SVAkJImFib3J0IgorI2RlZmluZSBMVk1QRF9QQVJNX0hBTkRMRV9NSVNTSU5HX1BWUwkiaGFuZGxlX21pc3NpbmdfcHZzIgorI2RlZmluZSBMVk1QRF9QQVJNX0lOVEVSVkFMCQkiaW50ZXJ2YWwiCisjZGVmaW5lIExWTVBEX1BBUk1fTFZJRAkJCSJsdmlkIgorI2RlZmluZSBMVk1QRF9QQVJNX0xWTkFNRQkJImx2bmFtZSIKKyNkZWZpbmUgTFZNUERfUEFSTV9TWVNESVIJCSJzeXNkaXIiCisjZGVmaW5lIExWTVBEX1BBUk1fVkFMVUUJCSJ2YWx1ZSIgLyogZWl0aGVyIHJldGNvZGUgb3Igc2lnbmFsIHZhbHVlICovCisjZGVmaW5lIExWTVBEX1BBUk1fVkdOQU1FCQkidmduYW1lIgorCisjZGVmaW5lIExWTVBEX1JFU1BfRkFJTEVECSJmYWlsZWQiCisjZGVmaW5lIExWTVBEX1JFU1BfRklOSVNIRUQJImZpbmlzaGVkIgorI2RlZmluZSBMVk1QRF9SRVNQX0lOX1BST0dSRVNTCSJpbl9wcm9ncmVzcyIKKyNkZWZpbmUgTFZNUERfUkVTUF9FSU5WQUwJImludmFsaWQiCisjZGVmaW5lIExWTVBEX1JFU1BfTk9UX0ZPVU5ECSJub3RfZm91bmQiCisjZGVmaW5lIExWTVBEX1JFU1BfT0sJCSJPSyIKKworI2RlZmluZSBMVk1QRF9SRUFTX1JFVENPREUJInJldGNvZGUiIC8qIGx2bSBjbWQgcmV0IGNvZGUgKi8KKyNkZWZpbmUgTFZNUERfUkVBU19TSUdOQUwJInNpZ25hbCIgLyogbHZtIGNtZCB0ZXJtaW5hdGluZyBzaW5nYWwgKi8KKworI2RlZmluZSBMVk1QRF9SRVRfRFVQX0ZBSUxFRAkxMDAKKyNkZWZpbmUgTFZNUERfUkVUX0VYQ19GQUlMRUQJMTAxCisKKyNlbmRpZiAvKiBfTFZNX0xWTVBPTExEX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2RhZW1vbnMvbHZtcG9sbGQvcG9sbGluZ19vcHMuaCBiL2RhZW1vbnMvbHZtcG9sbGQvcG9sbGluZ19vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlkMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGFlbW9ucy9sdm1wb2xsZC9wb2xsaW5nX29wcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVE9PTF9QT0xMSU5HX09QU19ICisjZGVmaW5lIF9MVk1fVE9PTF9QT0xMSU5HX09QU19ICisKKy8qIHRoaXMgZmlsZSBpcyBhbHNvIHBhcnQgb2YgbHZtcG9sbGQgcHJvdG9jb2wgKi8KKworI2RlZmluZSBQVk1PVkVfUE9MTCAicHZtb3ZlIgorI2RlZmluZSBDT05WRVJUX1BPTEwgImNvbnZlcnQiCisjZGVmaW5lIE1FUkdFX1BPTEwgIm1lcmdlIgorI2RlZmluZSBNRVJHRV9USElOX1BPTEwgIm1lcmdlX3RoaW4iCisKKyNlbmRpZiAvKiBfTFZNX1RPT0xfUE9MTElOR19PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZG9jLy5naXRpZ25vcmUgYi9kb2MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTVhOTkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorZXhhbXBsZS5jb25mCmRpZmYgLS1naXQgYS9kb2MvY2FjaGluZ19mb3JlaWduX3Zncy50eHQgYi9kb2MvY2FjaGluZ19mb3JlaWduX3Zncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmZmVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jYWNoaW5nX2ZvcmVpZ25fdmdzLnR4dApAQCAtMCwwICsxLDg2IEBACitROiBXaHkgc2hvdWxkIGx2bWV0YWQgY2FjaGUgZm9yZWlnbiBWR3M/CitBOiBJdCdzIHRoZSBtb3N0IHVzZWZ1bCBiZWhhdmlvciBpbiB0aGUgInN0ZWFkeSBzdGF0ZSIuCisKK0hvdyB0byBhcnJpdmUgYXQgdGhhdCBjb25jbHVzaW9uLgorRm91ciBjb2RlIGNvbmZpZ3VyYXRpb25zIHRvIGNvbnNpZGVyLCBlYWNoIGluIHR3byBkaWZmZXJlbnQgY2lyY3Vtc3RhbmNlcy4KKworY29uZmlndXJhdGlvbnM6CisKKzEuIGx2bSBub3QgdXNpbmcgbHZtZXRhZAorMi4gbHZtIHVzaW5nIGx2bWV0YWQgYW5kIGx2bWxvY2tkCiszLiBsdm0gdXNpbmcgbHZtZXRhZCwgYW5kIGx2bWV0YWQgZG9lcyBub3QgY2FjaGUgZm9yZWlnbiBWR3MKKyAgIChOb3QgY3VycmVudGx5IGltcGxlbWVudGVkLikKKzQuIGx2bSB1c2luZyBsdm1ldGFkLCBhbmQgbHZtZXRhZCBjYWNoZXMgZm9yZWlnbiBWR3MKKworY2lyY3Vtc3RhbmNlczoKKworQS4gc3RlYWR5IHN0YXRlOiBQVnMgYXJlIG5vdCBhZGRlZCBvciByZW1vdmVkIHRvL2Zyb20gZm9yZWlnbiBWR3MKK0IuIHRyYW5zaWVudCBzdGF0ZTogUFZzIGFyZSBhZGRlZCBvciByZW1vdmVkIHRvL2Zyb20gZm9yZWlnbiBWR3MKKworY29tYmluYXRpb25zOgorCisxLkEuIEEgUFYgaXMgY29ycmVjdGx5IHNob3duIGluIHRoZSBmb3JlaWduIFZHLgorMS5CLiBBIFBWIGlzIGNvcnJlY3RseSBzaG93biBpbiB0aGUgZm9yZWlnbiBWRy4KKworVGhlIG1vc3QgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24sIGF0IHRoZSBjb3N0IG9mIGFsd2F5cyBzY2FubmluZyBkaXNrcy4KKworCisyLkEuIEEgUFYgaXMgY29ycmVjdGx5IHNob3duIGluIHRoZSBmb3JlaWduIFZHLgorMi5CLiBBIFBWIGlzIGNvcnJlY3RseSBzaG93biBpbiB0aGUgZm9yZWlnbiBWRy4KKworVGhlIG1vc3QgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24sIGF0IHRoZSBjb3N0IG9mIHVzaW5nIGx2bWxvY2tkLgorCisKKzMuQS4gQSBQViBpbiBhIGZvcmVpZ24gVkcgaXMgc2hvd24gYXMgdW51c2VkLgorMy5CLiBBIFBWIGluIGEgZm9yZWlnbiBWRyBpcyBzaG93biBhcyB1bnVzZWQuCisKK0lmIGx2bWV0YWQgaWdub3JlcyBmb3JlaWduIFZHcyBhbmQgZG9lcyBub3QgY2FjaGUgdGhlbSwgdGhlIFBWcyBpbiB0aGUKK2ZvcmVpZ24gVkdzIGFwcGVhciB0byBiZSB1bnVzZWQuICBUaGlzIGxhcmdlbHkgZGVmZWF0cyB0aGUgcHVycG9zZSBvZgorc3lzdGVtX2lkLCB3aGljaCBpcyBtZWFudCB0byB0cmVhdCBWR3MvUFZzIGFzIGZvcmVpZ24gaW5zdGVhZCBvZiBmcmVlCisoYWxiZWl0IGltcGVyZmVjdGx5LCBzZWUgYmVsb3cuKQorCisKKzQuQS4gQSBQViBpcyBjb3JyZWN0bHkgc2hvd24gaW4gdGhlIGZvcmVpZ24gVkcuCis0LkIuIEEgUFYgaXMgbm90IGNvcnJlY3RseSBzaG93biBpbiB0aGUgZm9yZWlnbiBWRy4KKworVGhpcyBhdm9pZHMgdGhlIGNvc3Qgb2YgYWx3YXlzIHNjYW5uaW5nIGRpc2tzLCBhbmQgYXZvaWRzIHRoZSBjb3N0IG9mCit1c2luZyBsdm1sb2NrZC4gIFRoZSBzdGVhZHkgc3RhdGUgNC5BLiBpcyBhbiBpbXByb3ZlbWVudCBvdmVyIHRoZSBzdGVhZHkKK3N0YXRlIDMuQS4gIFdoZW4gdGhlIHN0ZWFkeSBzdGF0ZSBpcyB0aGUgY29tbW9uIGNhc2UsIHRoaXMgaXMgYSBiaWcKK2FkdmFudGFnZS4gIFdoZW4gdGhlIHN0ZWFkeSBzdGF0ZSBpcyAqbm90KiB0aGUgY29tbW9uIGNhc2UsIHRoZSBmb3JlaWduIFZHCitjb25jZXB0IGlzIG5vdCBhcyB1c2VmdWwgKGlmIHNoYXJlZCBkZXZpY2VzIGFyZSB0aGlzIGR5bmFtaWMsIGx2bWxvY2tkCitzaG91bGQgYmUgY29uc2lkZXJlZC4pCisKK1RoZSBsaW1pdGF0aW9ucyByZWxhdGVkIHRvIHRoZSB0cmFuc2llbnQgc3RhdGUgNC5CLiBhcmUgZXhwbGFpbmVkIGluCitsdm1zeXN0ZW1pZCg3KSwgYWxvbmcgd2l0aCBob3cgdG8gaGFuZGxlIGl0LiAgVGhlIHNwZWNpZmljIGluYWNjdXJhY2llcworcG9zc2libGUgaW4gNC5CLiBhcmU6CisKKy4gUFYgaXMgc2hvd24gYXMgYmVsb25naW5nIHRvIGEgZm9yZWlnbiBWRywgYnV0IGlzIGFjdHVhbGx5IHVudXNlZC4KKy4gUFYgaXMgc2hvd24gYXMgdW51c2VkLCBidXQgYWN0dWFsbHkgYmVsb25ncyB0byBhIGZvcmVpZ24gVkcuCisKK1RvIHJlc29sdmUgdGhlIGluYWNjdXJhY2llcyBpbiB0aGUgdHJhbnNpZW50IHN0YXRlICg0LkIuKSwgYW5kIHJldHVybiB0aGUKK3N5c3RlbSB0byBhbiBhY2N1cmF0ZSBzdGVhZHkgc3RhdGUgKDQuQS4pLCB0aGUgZGlza3MgbmVlZCB0byBiZSBzY2FubmVkLAord2hpY2ggdXBkYXRlcyBsdm1ldGFkLiAgVGhlIHNjYW5uaW5nL3VwZGF0aW5nIGlzIGEgbWFudWFsIHN0ZXAsIGkuZS4KK3J1bm5pbmcgJ3B2c2NhbiAtLWNhY2hlJywgd2hpY2ggYnkgZGVmaW5pdGlvbiBzY2FucyBkaXNrcyBhbmQgdXBkYXRlcworbHZtZXRhZC4KKworLS0KKworVGhlIC0tZm9yZWlnbiBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciByZXBvcnQvZGlzcGxheSBjb21tYW5kcworKHZncy9sdnMvcHZzL3ZnZGlzcGxheS9sdmRpc3BsYXkvcHZkaXNwbGF5KSBpcyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0bword2hldGhlciBvciBub3QgbHZtZXRhZCBjYWNoZXMgZm9yZWlnbiBWR3MuCisKK0J5IGRlZmF1bHQsIGZvcmVpZ24gVkdzIGFyZSBzaWxlbnRseSBpZ25vcmVkIGFuZCBub3QgcHJpbnRlZCBieSB0aGVzZQorY29tbWFuZHMuICBIb3dldmVyLCB3aGVuIHRoZSAtLWZvcmVpZ24gb3B0aW9uIGlzIHVzZWQsIHRoZXNlIGNvbW1hbmRzIGRvCitwcm9kdWNlIG91dHB1dCBhYm91dCBmb3JlaWduIFZHcy4KKworKFdoZW4gLS1mb3JlaWduIGlzIG5vdCB1c2VkLCBhbmQgdGhlIGNvbW1hbmQgc3BlY2lmaWNhbGx5IHJlcXVlc3RzIGEKK2ZvcmVpZ24gVkcgYnkgbmFtZSwgYW4gZXJyb3IgaXMgcHJvZHVjZWQgYWJvdXQgbm90IGFjY2Vzc2luZyBmb3JlaWduIFZHcywKK2FuZCB0aGUgZm9yZWlnbiBWRyBpcyBub3QgZGlzcGxheWVkLikKKworVGhlIGRlY2lzaW9uIHRvIHJlcG9ydC9kaXNwbGF5IGZvcmVpZ24gVkdzIG9yIG5vdCBpcyBpbmRlcGVuZGVudCBvZgord2hldGhlciBsdm1ldGFkIGlzIGNhY2hpbmcgdGhvc2UgVkdzLiAgV2hlbiBsdm1ldGFkIGlzIGNhY2hpbmcgdGhlIGZvcmVpZ24KK1ZHLCBhIHJlcG9ydC9kaXNwbGF5IGNvbW1hbmQgcnVuIHdpdGggLS1mb3JlaWduIHdpbGwgc2NhbiBkaXNrcyB0byByZWFkCit0aGUgZm9yZWlnbiBWRyBhbmQgZ2l2ZSB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgaXQgKHRoZSBjb3B5IG9mIHRoZQorZm9yZWlnbiBWRyBpbiBsdm1ldGFkIG1heSBiZSBvdXQgb2YgZGF0ZSBkdWUgdG8gY2hhbmdlcyB0byB0aGUgVkcgYnkgdGhlCitmb3JlaWduIGhvc3QuKQorCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZV9jbWRsaWIuYyBiL2RvYy9leGFtcGxlX2NtZGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTM1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZV9jbWRsaWIuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImx2bTJjbWQuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBBbGwgb3V0cHV0IGdldHMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gbGluZS1ieS1saW5lICovCit2b2lkIHRlc3RfbG9nX2ZuKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCSBpbnQgZG1fZXJybm8sIGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKwkvKiBFeHRyYWN0IGFuZCBwcm9jZXNzIG91dHB1dCBoZXJlIHJhdGhlciB0aGFuIHByaW50aW5nIGl0ICovCisKKwlpZiAobGV2ZWwgIT0gNCkKKwkJcmV0dXJuOworCisJcHJpbnRmKCIlc1xuIiwgZm9ybWF0KTsKKwlyZXR1cm47Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl2b2lkICpoYW5kbGU7CisJaW50IHI7CisKKwlsdm0yX2xvZ19mbih0ZXN0X2xvZ19mbik7CisKKwloYW5kbGUgPSBsdm0yX2luaXQoKTsKKworCWx2bTJfbG9nX2xldmVsKGhhbmRsZSwgMSk7CisJciA9IGx2bTJfcnVuKGhhbmRsZSwgInZncyAtLW5vaGVhZGluZ3MgdmcxIik7CisKKwkvKiBNb3JlIGNvbW1hbmRzIGhlcmUgKi8KKworCWx2bTJfZXhpdChoYW5kbGUpOworCisJcmV0dXJuIHI7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvY2FjaGUtcG9saWNpZXMudHh0IGIvZG9jL2tlcm5lbC9jYWNoZS1wb2xpY2llcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjYThhZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvY2FjaGUtcG9saWNpZXMudHh0CkBAIC0wLDAgKzEsMTIxIEBACitHdWlkYW5jZSBmb3Igd3JpdGluZyBwb2xpY2llcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVHJ5IHRvIGtlZXAgdHJhbnNhY3Rpb25hbGl0eSBvdXQgb2YgaXQuICBUaGUgY29yZSBpcyBjYXJlZnVsIHRvCithdm9pZCBhc2tpbmcgYWJvdXQgYW55dGhpbmcgdGhhdCBpcyBtaWdyYXRpbmcuICBUaGlzIGlzIGEgcGFpbiwgYnV0CittYWtlcyBpdCBlYXNpZXIgdG8gd3JpdGUgdGhlIHBvbGljaWVzLgorCitNYXBwaW5ncyBhcmUgbG9hZGVkIGludG8gdGhlIHBvbGljeSBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KKworRXZlcnkgYmlvIHRoYXQgaXMgbWFwcGVkIGJ5IHRoZSB0YXJnZXQgaXMgcmVmZXJyZWQgdG8gdGhlIHBvbGljeS4KK1RoZSBwb2xpY3kgY2FuIHJldHVybiBhIHNpbXBsZSBISVQgb3IgTUlTUyBvciBpc3N1ZSBhIG1pZ3JhdGlvbi4KKworQ3VycmVudGx5IHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgcG9saWN5IHRvIGlzc3VlIGJhY2tncm91bmQgd29yaywKK2UuZy4gdG8gc3RhcnQgd3JpdGluZyBiYWNrIGRpcnR5IGJsb2NrcyB0aGF0IGFyZSBnb2luZyB0byBiZSBldmljdGVkCitzb29uLgorCitCZWNhdXNlIHdlIG1hcCBiaW9zLCByYXRoZXIgdGhhbiByZXF1ZXN0cyBpdCdzIGVhc3kgZm9yIHRoZSBwb2xpY3kKK3RvIGdldCBmb29sZWQgYnkgbWFueSBzbWFsbCBiaW9zLiAgRm9yIHRoaXMgcmVhc29uIHRoZSBjb3JlIHRhcmdldAoraXNzdWVzIHBlcmlvZGljIHRpY2tzIHRvIHRoZSBwb2xpY3kuICBJdCdzIHN1Z2dlc3RlZCB0aGF0IHRoZSBwb2xpY3kKK2RvZXNuJ3QgdXBkYXRlIHN0YXRlcyAoZWcsIGhpdCBjb3VudHMpIGZvciBhIGJsb2NrIG1vcmUgdGhhbiBvbmNlCitmb3IgZWFjaCB0aWNrLiAgVGhlIGNvcmUgdGlja3MgYnkgd2F0Y2hpbmcgYmlvcyBjb21wbGV0ZSwgYW5kIHNvCit0cnlpbmcgdG8gc2VlIHdoZW4gdGhlIGlvIHNjaGVkdWxlciBoYXMgbGV0IHRoZSBpb3MgcnVuLgorCisKK092ZXJ2aWV3IG9mIHN1cHBsaWVkIGNhY2hlIHJlcGxhY2VtZW50IHBvbGljaWVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCittdWx0aXF1ZXVlIChtcSkKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHBvbGljeSBpcyBub3cgYW4gYWxpYXMgZm9yIHNtcSAoc2VlIGJlbG93KS4KKworVGhlIGZvbGxvd2luZyB0dW5hYmxlcyBhcmUgYWNjZXB0ZWQsIGJ1dCBoYXZlIG5vIGVmZmVjdDoKKworCSdzZXF1ZW50aWFsX3RocmVzaG9sZCA8I25yX3NlcXVlbnRpYWxfaW9zPicKKwkncmFuZG9tX3RocmVzaG9sZCA8I25yX3JhbmRvbV9pb3M+JworCSdyZWFkX3Byb21vdGVfYWRqdXN0bWVudCA8dmFsdWU+JworCSd3cml0ZV9wcm9tb3RlX2FkanVzdG1lbnQgPHZhbHVlPicKKwknZGlzY2FyZF9wcm9tb3RlX2FkanVzdG1lbnQgPHZhbHVlPicKKworU3RvY2hhc3RpYyBtdWx0aXF1ZXVlIChzbXEpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwb2xpY3kgaXMgdGhlIGRlZmF1bHQuCisKK1RoZSBzdG9jaGFzdGljIG11bHRpLXF1ZXVlIChzbXEpIHBvbGljeSBhZGRyZXNzZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMKK3dpdGggdGhlIG11bHRpcXVldWUgKG1xKSBwb2xpY3kuCisKK1RoZSBzbXEgcG9saWN5ICh2cyBtcSkgb2ZmZXJzIHRoZSBwcm9taXNlIG9mIGxlc3MgbWVtb3J5IHV0aWxpemF0aW9uLAoraW1wcm92ZWQgcGVyZm9ybWFuY2UgYW5kIGluY3JlYXNlZCBhZGFwdGFiaWxpdHkgaW4gdGhlIGZhY2Ugb2YgY2hhbmdpbmcKK3dvcmtsb2Fkcy4gIHNtcSBhbHNvIGRvZXMgbm90IGhhdmUgYW55IGN1bWJlcnNvbWUgdHVuaW5nIGtub2JzLgorCitVc2VycyBtYXkgc3dpdGNoIGZyb20gIm1xIiB0byAic21xIiBzaW1wbHkgYnkgYXBwcm9wcmlhdGVseSByZWxvYWRpbmcgYQorRE0gdGFibGUgdGhhdCBpcyB1c2luZyB0aGUgY2FjaGUgdGFyZ2V0LiAgRG9pbmcgc28gd2lsbCBjYXVzZSBhbGwgb2YgdGhlCittcSBwb2xpY3kncyBoaW50cyB0byBiZSBkcm9wcGVkLiAgQWxzbywgcGVyZm9ybWFuY2Ugb2YgdGhlIGNhY2hlIG1heQorZGVncmFkZSBzbGlnaHRseSB1bnRpbCBzbXEgcmVjYWxjdWxhdGVzIHRoZSBvcmlnaW4gZGV2aWNlJ3MgaG90c3BvdHMKK3RoYXQgc2hvdWxkIGJlIGNhY2hlZC4KKworTWVtb3J5IHVzYWdlOgorVGhlIG1xIHBvbGljeSB1c2VkIGEgbG90IG9mIG1lbW9yeTsgODggYnl0ZXMgcGVyIGNhY2hlIGJsb2NrIG9uIGEgNjQKK2JpdCBtYWNoaW5lLgorCitzbXEgdXNlcyAyOGJpdCBpbmRleGVzIHRvIGltcGxlbWVudCBpdCdzIGRhdGEgc3RydWN0dXJlcyByYXRoZXIgdGhhbgorcG9pbnRlcnMuICBJdCBhdm9pZHMgc3RvcmluZyBhbiBleHBsaWNpdCBoaXQgY291bnQgZm9yIGVhY2ggYmxvY2suICBJdAoraGFzIGEgJ2hvdHNwb3QnIHF1ZXVlLCByYXRoZXIgdGhhbiBhIHByZS1jYWNoZSwgd2hpY2ggdXNlcyBhIHF1YXJ0ZXIgb2YKK3RoZSBlbnRyaWVzIChlYWNoIGhvdHNwb3QgYmxvY2sgY292ZXJzIGEgbGFyZ2VyIGFyZWEgdGhhbiBhIHNpbmdsZQorY2FjaGUgYmxvY2spLgorCitBbGwgdGhpcyBtZWFucyBzbXEgdXNlcyB+MjVieXRlcyBwZXIgY2FjaGUgYmxvY2suICBTdGlsbCBhIGxvdCBvZgorbWVtb3J5LCBidXQgYSBzdWJzdGFudGlhbCBpbXByb3ZlbWVudCBub250aGVsZXNzLgorCitMZXZlbCBiYWxhbmNpbmc6CittcSBwbGFjZWQgZW50cmllcyBpbiBkaWZmZXJlbnQgbGV2ZWxzIG9mIHRoZSBtdWx0aXF1ZXVlIHN0cnVjdHVyZXMKK2Jhc2VkIG9uIHRoZWlyIGhpdCBjb3VudCAofmxuKGhpdCBjb3VudCkpLiAgVGhpcyBtZWFudCB0aGUgYm90dG9tCitsZXZlbHMgZ2VuZXJhbGx5IGhhZCB0aGUgbW9zdCBlbnRyaWVzLCBhbmQgdGhlIHRvcCBvbmVzIGhhZCB2ZXJ5CitmZXcuICBIYXZpbmcgdW5iYWxhbmNlZCBsZXZlbHMgbGlrZSB0aGlzIHJlZHVjZWQgdGhlIGVmZmljYWN5IG9mIHRoZQorbXVsdGlxdWV1ZS4KKworc21xIGRvZXMgbm90IG1haW50YWluIGEgaGl0IGNvdW50LCBpbnN0ZWFkIGl0IHN3YXBzIGhpdCBlbnRyaWVzIHdpdGgKK3RoZSBsZWFzdCByZWNlbnRseSB1c2VkIGVudHJ5IGZyb20gdGhlIGxldmVsIGFib3ZlLiAgVGhlIG92ZXJhbGwKK29yZGVyaW5nIGJlaW5nIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBzdG9jaGFzdGljIHByb2Nlc3MuICBXaXRoIHRoaXMKK3NjaGVtZSB3ZSBjYW4gZGVjaWRlIGhvdyBtYW55IGVudHJpZXMgb2NjdXB5IGVhY2ggbXVsdGlxdWV1ZSBsZXZlbCwKK3Jlc3VsdGluZyBpbiBiZXR0ZXIgcHJvbW90aW9uL2RlbW90aW9uIGRlY2lzaW9ucy4KKworQWRhcHRhYmlsaXR5OgorVGhlIG1xIHBvbGljeSBtYWludGFpbmVkIGEgaGl0IGNvdW50IGZvciBlYWNoIGNhY2hlIGJsb2NrLiAgRm9yIGEKK2RpZmZlcmVudCBibG9jayB0byBnZXQgcHJvbW90ZWQgdG8gdGhlIGNhY2hlIGl0J3MgaGl0IGNvdW50IGhhcyB0bworZXhjZWVkIHRoZSBsb3dlc3QgY3VycmVudGx5IGluIHRoZSBjYWNoZS4gIFRoaXMgbWVhbnQgaXQgY291bGQgdGFrZSBhCitsb25nIHRpbWUgZm9yIHRoZSBjYWNoZSB0byBhZGFwdCBiZXR3ZWVuIHZhcnlpbmcgSU8gcGF0dGVybnMuCisKK3NtcSBkb2Vzbid0IG1haW50YWluIGhpdCBjb3VudHMsIHNvIGEgbG90IG9mIHRoaXMgcHJvYmxlbSBqdXN0IGdvZXMKK2F3YXkuICBJbiBhZGRpdGlvbiBpdCB0cmFja3MgcGVyZm9ybWFuY2Ugb2YgdGhlIGhvdHNwb3QgcXVldWUsIHdoaWNoCitpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBibG9ja3MgdG8gcHJvbW90ZS4gIElmIHRoZSBob3RzcG90IHF1ZXVlIGlzCitwZXJmb3JtaW5nIGJhZGx5IHRoZW4gaXQgc3RhcnRzIG1vdmluZyBlbnRyaWVzIG1vcmUgcXVpY2tseSBiZXR3ZWVuCitsZXZlbHMuICBUaGlzIGxldHMgaXQgYWRhcHQgdG8gbmV3IElPIHBhdHRlcm5zIHZlcnkgcXVpY2tseS4KKworUGVyZm9ybWFuY2U6CitUZXN0aW5nIHNtcSBzaG93cyBzdWJzdGFudGlhbGx5IGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIG1xLgorCitjbGVhbmVyCistLS0tLS0tCisKK1RoZSBjbGVhbmVyIHdyaXRlcyBiYWNrIGFsbCBkaXJ0eSBibG9ja3MgaW4gYSBjYWNoZSB0byBkZWNvbW1pc3Npb24gaXQuCisKK0V4YW1wbGVzCis9PT09PT09PQorCitUaGUgc3ludGF4IGZvciBhIHRhYmxlIGlzOgorCWNhY2hlIDxtZXRhZGF0YSBkZXY+IDxjYWNoZSBkZXY+IDxvcmlnaW4gZGV2PiA8YmxvY2sgc2l6ZT4KKwk8I2ZlYXR1cmVfYXJncz4gWzxmZWF0dXJlIGFyZz5dKgorCTxwb2xpY3k+IDwjcG9saWN5X2FyZ3M+IFs8cG9saWN5IGFyZz5dKgorCitUaGUgc3ludGF4IHRvIHNlbmQgYSBtZXNzYWdlIHVzaW5nIHRoZSBkbXNldHVwIGNvbW1hbmQgaXM6CisJZG1zZXR1cCBtZXNzYWdlIDxtYXBwZWQgZGV2aWNlPiAwIHNlcXVlbnRpYWxfdGhyZXNob2xkIDEwMjQKKwlkbXNldHVwIG1lc3NhZ2UgPG1hcHBlZCBkZXZpY2U+IDAgcmFuZG9tX3RocmVzaG9sZCA4CisKK1VzaW5nIGRtc2V0dXA6CisJZG1zZXR1cCBjcmVhdGUgYmxhaCAtLXRhYmxlICIwIDI2ODQzNTQ1NiBjYWNoZSAvZGV2L3NkYiAvZGV2L3NkYyBcCisJICAgIC9kZXYvc2RkIDUxMiAwIG1xIDQgc2VxdWVudGlhbF90aHJlc2hvbGQgMTAyNCByYW5kb21fdGhyZXNob2xkIDgiCisJY3JlYXRlcyBhIDEyOEdCIGxhcmdlIG1hcHBlZCBkZXZpY2UgbmFtZWQgJ2JsYWgnIHdpdGggdGhlCisJc2VxdWVudGlhbCB0aHJlc2hvbGQgc2V0IHRvIDEwMjQgYW5kIHRoZSByYW5kb21fdGhyZXNob2xkIHNldCB0byA4LgpkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9jYWNoZS50eHQgYi9kb2Mva2VybmVsL2NhY2hlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODVlYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9jYWNoZS50eHQKQEAgLTAsMCArMSwzMDkgQEAKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK2RtLWNhY2hlIGlzIGEgZGV2aWNlIG1hcHBlciB0YXJnZXQgd3JpdHRlbiBieSBKb2UgVGhvcm5iZXIsIEhlaW56CitNYXVlbHNoYWdlbiwgYW5kIE1pa2UgU25pdHplci4KKworSXQgYWltcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGEgYmxvY2sgZGV2aWNlIChlZywgYSBzcGluZGxlKSBieQorZHluYW1pY2FsbHkgbWlncmF0aW5nIHNvbWUgb2YgaXRzIGRhdGEgdG8gYSBmYXN0ZXIsIHNtYWxsZXIgZGV2aWNlCisoZWcsIGFuIFNTRCkuCisKK1RoaXMgZGV2aWNlLW1hcHBlciBzb2x1dGlvbiBhbGxvd3MgdXMgdG8gaW5zZXJ0IHRoaXMgY2FjaGluZyBhdAorZGlmZmVyZW50IGxldmVscyBvZiB0aGUgZG0gc3RhY2ssIGZvciBpbnN0YW5jZSBhYm92ZSB0aGUgZGF0YSBkZXZpY2UgZm9yCithIHRoaW4tcHJvdmlzaW9uaW5nIHBvb2wuICBDYWNoaW5nIHNvbHV0aW9ucyB0aGF0IGFyZSBpbnRlZ3JhdGVkIG1vcmUKK2Nsb3NlbHkgd2l0aCB0aGUgdmlydHVhbCBtZW1vcnkgc3lzdGVtIHNob3VsZCBnaXZlIGJldHRlciBwZXJmb3JtYW5jZS4KKworVGhlIHRhcmdldCByZXVzZXMgdGhlIG1ldGFkYXRhIGxpYnJhcnkgdXNlZCBpbiB0aGUgdGhpbi1wcm92aXNpb25pbmcKK2xpYnJhcnkuCisKK1RoZSBkZWNpc2lvbiBhcyB0byB3aGF0IGRhdGEgdG8gbWlncmF0ZSBhbmQgd2hlbiBpcyBsZWZ0IHRvIGEgcGx1Zy1pbgorcG9saWN5IG1vZHVsZS4gIFNldmVyYWwgb2YgdGhlc2UgaGF2ZSBiZWVuIHdyaXR0ZW4gYXMgd2UgZXhwZXJpbWVudCwKK2FuZCB3ZSBob3BlIG90aGVyIHBlb3BsZSB3aWxsIGNvbnRyaWJ1dGUgb3RoZXJzIGZvciBzcGVjaWZpYyBpbworc2NlbmFyaW9zIChlZy4gYSB2bSBpbWFnZSBzZXJ2ZXIpLgorCitHbG9zc2FyeQorPT09PT09PT0KKworICBNaWdyYXRpb24gLSAgTW92ZW1lbnQgb2YgdGhlIHByaW1hcnkgY29weSBvZiBhIGxvZ2ljYWwgYmxvY2sgZnJvbSBvbmUKKwkgICAgICAgZGV2aWNlIHRvIHRoZSBvdGhlci4KKyAgUHJvbW90aW9uIC0gIE1pZ3JhdGlvbiBmcm9tIHNsb3cgZGV2aWNlIHRvIGZhc3QgZGV2aWNlLgorICBEZW1vdGlvbiAgLSAgTWlncmF0aW9uIGZyb20gZmFzdCBkZXZpY2UgdG8gc2xvdyBkZXZpY2UuCisKK1RoZSBvcmlnaW4gZGV2aWNlIGFsd2F5cyBjb250YWlucyBhIGNvcHkgb2YgdGhlIGxvZ2ljYWwgYmxvY2ssIHdoaWNoCittYXkgYmUgb3V0IG9mIGRhdGUgb3Iga2VwdCBpbiBzeW5jIHdpdGggdGhlIGNvcHkgb24gdGhlIGNhY2hlIGRldmljZQorKGRlcGVuZGluZyBvbiBwb2xpY3kpLgorCitEZXNpZ24KKz09PT09PQorCitTdWItZGV2aWNlcworLS0tLS0tLS0tLS0KKworVGhlIHRhcmdldCBpcyBjb25zdHJ1Y3RlZCBieSBwYXNzaW5nIHRocmVlIGRldmljZXMgdG8gaXQgKGFsb25nIHdpdGgKK290aGVyIHBhcmFtZXRlcnMgZGV0YWlsZWQgbGF0ZXIpOgorCisxLiBBbiBvcmlnaW4gZGV2aWNlIC0gdGhlIGJpZywgc2xvdyBvbmUuCisKKzIuIEEgY2FjaGUgZGV2aWNlIC0gdGhlIHNtYWxsLCBmYXN0IG9uZS4KKworMy4gQSBzbWFsbCBtZXRhZGF0YSBkZXZpY2UgLSByZWNvcmRzIHdoaWNoIGJsb2NrcyBhcmUgaW4gdGhlIGNhY2hlLAorICAgd2hpY2ggYXJlIGRpcnR5LCBhbmQgZXh0cmEgaGludHMgZm9yIHVzZSBieSB0aGUgcG9saWN5IG9iamVjdC4KKyAgIFRoaXMgaW5mb3JtYXRpb24gY291bGQgYmUgcHV0IG9uIHRoZSBjYWNoZSBkZXZpY2UsIGJ1dCBoYXZpbmcgaXQKKyAgIHNlcGFyYXRlIGFsbG93cyB0aGUgdm9sdW1lIG1hbmFnZXIgdG8gY29uZmlndXJlIGl0IGRpZmZlcmVudGx5LAorICAgZS5nLiBhcyBhIG1pcnJvciBmb3IgZXh0cmEgcm9idXN0bmVzcy4gIFRoaXMgbWV0YWRhdGEgZGV2aWNlIG1heSBvbmx5CisgICBiZSB1c2VkIGJ5IGEgc2luZ2xlIGNhY2hlIGRldmljZS4KKworRml4ZWQgYmxvY2sgc2l6ZQorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgb3JpZ2luIGlzIGRpdmlkZWQgdXAgaW50byBibG9ja3Mgb2YgYSBmaXhlZCBzaXplLiAgVGhpcyBibG9jayBzaXplCitpcyBjb25maWd1cmFibGUgd2hlbiB5b3UgZmlyc3QgY3JlYXRlIHRoZSBjYWNoZS4gIFR5cGljYWxseSB3ZSd2ZSBiZWVuCit1c2luZyBibG9jayBzaXplcyBvZiAyNTZLQiAtIDEwMjRLQi4gIFRoZSBibG9jayBzaXplIG11c3QgYmUgYmV0d2VlbiA2NAorKDMyS0IpIGFuZCAyMDk3MTUyICgxR0IpIGFuZCBhIG11bHRpcGxlIG9mIDY0ICgzMktCKS4KKworSGF2aW5nIGEgZml4ZWQgYmxvY2sgc2l6ZSBzaW1wbGlmaWVzIHRoZSB0YXJnZXQgYSBsb3QuICBCdXQgaXQgaXMKK3NvbWV0aGluZyBvZiBhIGNvbXByb21pc2UuICBGb3IgaW5zdGFuY2UsIGEgc21hbGwgcGFydCBvZiBhIGJsb2NrIG1heSBiZQorZ2V0dGluZyBoaXQgYSBsb3QsIHlldCB0aGUgd2hvbGUgYmxvY2sgd2lsbCBiZSBwcm9tb3RlZCB0byB0aGUgY2FjaGUuCitTbyBsYXJnZSBibG9jayBzaXplcyBhcmUgYmFkIGJlY2F1c2UgdGhleSB3YXN0ZSBjYWNoZSBzcGFjZS4gIEFuZCBzbWFsbAorYmxvY2sgc2l6ZXMgYXJlIGJhZCBiZWNhdXNlIHRoZXkgaW5jcmVhc2UgdGhlIGFtb3VudCBvZiBtZXRhZGF0YSAoYm90aAoraW4gY29yZSBhbmQgb24gZGlzaykuCisKK0NhY2hlIG9wZXJhdGluZyBtb2RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBjYWNoZSBoYXMgdGhyZWUgb3BlcmF0aW5nIG1vZGVzOiB3cml0ZWJhY2ssIHdyaXRldGhyb3VnaCBhbmQKK3Bhc3N0aHJvdWdoLgorCitJZiB3cml0ZWJhY2ssIHRoZSBkZWZhdWx0LCBpcyBzZWxlY3RlZCB0aGVuIGEgd3JpdGUgdG8gYSBibG9jayB0aGF0IGlzCitjYWNoZWQgd2lsbCBnbyBvbmx5IHRvIHRoZSBjYWNoZSBhbmQgdGhlIGJsb2NrIHdpbGwgYmUgbWFya2VkIGRpcnR5IGluCit0aGUgbWV0YWRhdGEuCisKK0lmIHdyaXRldGhyb3VnaCBpcyBzZWxlY3RlZCB0aGVuIGEgd3JpdGUgdG8gYSBjYWNoZWQgYmxvY2sgd2lsbCBub3QKK2NvbXBsZXRlIHVudGlsIGl0IGhhcyBoaXQgYm90aCB0aGUgb3JpZ2luIGFuZCBjYWNoZSBkZXZpY2VzLiAgQ2xlYW4KK2Jsb2NrcyBzaG91bGQgcmVtYWluIGNsZWFuLgorCitJZiBwYXNzdGhyb3VnaCBpcyBzZWxlY3RlZCwgdXNlZnVsIHdoZW4gdGhlIGNhY2hlIGNvbnRlbnRzIGFyZSBub3Qga25vd24KK3RvIGJlIGNvaGVyZW50IHdpdGggdGhlIG9yaWdpbiBkZXZpY2UsIHRoZW4gYWxsIHJlYWRzIGFyZSBzZXJ2ZWQgZnJvbQordGhlIG9yaWdpbiBkZXZpY2UgKGFsbCByZWFkcyBtaXNzIHRoZSBjYWNoZSkgYW5kIGFsbCB3cml0ZXMgYXJlCitmb3J3YXJkZWQgdG8gdGhlIG9yaWdpbiBkZXZpY2U7IGFkZGl0aW9uYWxseSwgd3JpdGUgaGl0cyBjYXVzZSBjYWNoZQorYmxvY2sgaW52YWxpZGF0ZXMuICBUbyBlbmFibGUgcGFzc3Rocm91Z2ggbW9kZSB0aGUgY2FjaGUgbXVzdCBiZSBjbGVhbi4KK1Bhc3N0aHJvdWdoIG1vZGUgYWxsb3dzIGEgY2FjaGUgZGV2aWNlIHRvIGJlIGFjdGl2YXRlZCB3aXRob3V0IGhhdmluZyB0bword29ycnkgYWJvdXQgY29oZXJlbmN5LiAgQ29oZXJlbmN5IHRoYXQgZXhpc3RzIGlzIG1haW50YWluZWQsIGFsdGhvdWdoCit0aGUgY2FjaGUgd2lsbCBncmFkdWFsbHkgY29vbCBhcyB3cml0ZXMgdGFrZSBwbGFjZS4gIElmIHRoZSBjb2hlcmVuY3kgb2YKK3RoZSBjYWNoZSBjYW4gbGF0ZXIgYmUgdmVyaWZpZWQsIG9yIGVzdGFibGlzaGVkIHRocm91Z2ggdXNlIG9mIHRoZQorImludmFsaWRhdGVfY2Jsb2NrcyIgbWVzc2FnZSwgdGhlIGNhY2hlIGRldmljZSBjYW4gYmUgdHJhbnNpdGlvbmVkIHRvCit3cml0ZXRocm91Z2ggb3Igd3JpdGViYWNrIG1vZGUgd2hpbGUgc3RpbGwgd2FybS4gIE90aGVyd2lzZSwgdGhlIGNhY2hlCitjb250ZW50cyBjYW4gYmUgZGlzY2FyZGVkIHByaW9yIHRvIHRyYW5zaXRpb25pbmcgdG8gdGhlIGRlc2lyZWQKK29wZXJhdGluZyBtb2RlLgorCitBIHNpbXBsZSBjbGVhbmVyIHBvbGljeSBpcyBwcm92aWRlZCwgd2hpY2ggd2lsbCBjbGVhbiAod3JpdGUgYmFjaykgYWxsCitkaXJ0eSBibG9ja3MgaW4gYSBjYWNoZS4gIFVzZWZ1bCBmb3IgZGVjb21taXNzaW9uaW5nIGEgY2FjaGUgb3Igd2hlbgorc2hyaW5raW5nIGEgY2FjaGUuICBTaHJpbmtpbmcgdGhlIGNhY2hlJ3MgZmFzdCBkZXZpY2UgcmVxdWlyZXMgYWxsIGNhY2hlCitibG9ja3MsIGluIHRoZSBhcmVhIG9mIHRoZSBjYWNoZSBiZWluZyByZW1vdmVkLCB0byBiZSBjbGVhbi4gIElmIHRoZQorYXJlYSBiZWluZyByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHN0aWxsIGNvbnRhaW5zIGRpcnR5IGJsb2NrcyB0aGUgcmVzaXplCit3aWxsIGZhaWwuICBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbmV2ZXIgcmVkdWNlIHRoZSB2b2x1bWUgdXNlZCBmb3IgdGhlCitjYWNoZSdzIGZhc3QgZGV2aWNlIHVudGlsIHRoZSBjYWNoZSBpcyBjbGVhbi4gIFRoaXMgaXMgb2YgcGFydGljdWxhcgoraW1wb3J0YW5jZSBpZiB3cml0ZWJhY2sgbW9kZSBpcyB1c2VkLiAgV3JpdGV0aHJvdWdoIGFuZCBwYXNzdGhyb3VnaAorbW9kZXMgYWxyZWFkeSBtYWludGFpbiBhIGNsZWFuIGNhY2hlLiAgRnV0dXJlIHN1cHBvcnQgdG8gcGFydGlhbGx5IGNsZWFuCit0aGUgY2FjaGUsIGFib3ZlIGEgc3BlY2lmaWVkIHRocmVzaG9sZCwgd2lsbCBhbGxvdyBmb3Iga2VlcGluZyB0aGUgY2FjaGUKK3dhcm0gYW5kIGluIHdyaXRlYmFjayBtb2RlIGR1cmluZyByZXNpemUuCisKK01pZ3JhdGlvbiB0aHJvdHRsaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaWdyYXRpbmcgZGF0YSBiZXR3ZWVuIHRoZSBvcmlnaW4gYW5kIGNhY2hlIGRldmljZSB1c2VzIGJhbmR3aWR0aC4KK1RoZSB1c2VyIGNhbiBzZXQgYSB0aHJvdHRsZSB0byBwcmV2ZW50IG1vcmUgdGhhbiBhIGNlcnRhaW4gYW1vdW50IG9mCittaWdyYXRpb24gb2NjdXJyaW5nIGF0IGFueSBvbmUgdGltZS4gIEN1cnJlbnRseSB3ZSdyZSBub3QgdGFraW5nIGFueQorYWNjb3VudCBvZiBub3JtYWwgaW8gdHJhZmZpYyBnb2luZyB0byB0aGUgZGV2aWNlcy4gIE1vcmUgd29yayBuZWVkcworZG9pbmcgaGVyZSB0byBhdm9pZCBtaWdyYXRpbmcgZHVyaW5nIHRob3NlIHBlYWsgaW8gbW9tZW50cy4KKworRm9yIHRoZSB0aW1lIGJlaW5nLCBhIG1lc3NhZ2UgIm1pZ3JhdGlvbl90aHJlc2hvbGQgPCNzZWN0b3JzPiIKK2NhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VjdG9ycyBiZWluZyBtaWdyYXRlZCwKK3RoZSBkZWZhdWx0IGJlaW5nIDIwNDgwMCBzZWN0b3JzIChvciAxMDBNQikuCisKK1VwZGF0aW5nIG9uLWRpc2sgbWV0YWRhdGEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT24tZGlzayBtZXRhZGF0YSBpcyBjb21taXR0ZWQgZXZlcnkgdGltZSBhIEZMVVNIIG9yIEZVQSBiaW8gaXMgd3JpdHRlbi4KK0lmIG5vIHN1Y2ggcmVxdWVzdHMgYXJlIG1hZGUgdGhlbiBjb21taXRzIHdpbGwgb2NjdXIgZXZlcnkgc2Vjb25kLiAgVGhpcworbWVhbnMgdGhlIGNhY2hlIGJlaGF2ZXMgbGlrZSBhIHBoeXNpY2FsIGRpc2sgdGhhdCBoYXMgYSB2b2xhdGlsZSB3cml0ZQorY2FjaGUuICBJZiBwb3dlciBpcyBsb3N0IHlvdSBtYXkgbG9zZSBzb21lIHJlY2VudCB3cml0ZXMuICBUaGUgbWV0YWRhdGEKK3Nob3VsZCBhbHdheXMgYmUgY29uc2lzdGVudCBpbiBzcGl0ZSBvZiBhbnkgY3Jhc2guCisKK1RoZSAnZGlydHknIHN0YXRlIGZvciBhIGNhY2hlIGJsb2NrIGNoYW5nZXMgZmFyIHRvbyBmcmVxdWVudGx5IGZvciB1cwordG8ga2VlcCB1cGRhdGluZyBpdCBvbiB0aGUgZmx5LiAgU28gd2UgdHJlYXQgaXQgYXMgYSBoaW50LiAgSW4gbm9ybWFsCitvcGVyYXRpb24gaXQgd2lsbCBiZSB3cml0dGVuIHdoZW4gdGhlIGRtIGRldmljZSBpcyBzdXNwZW5kZWQuICBJZiB0aGUKK3N5c3RlbSBjcmFzaGVzIGFsbCBjYWNoZSBibG9ja3Mgd2lsbCBiZSBhc3N1bWVkIGRpcnR5IHdoZW4gcmVzdGFydGVkLgorCitQZXItYmxvY2sgcG9saWN5IGhpbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BvbGljeSBwbHVnLWlucyBjYW4gc3RvcmUgYSBjaHVuayBvZiBkYXRhIHBlciBjYWNoZSBibG9jay4gIEl0J3MgdXAgdG8KK3RoZSBwb2xpY3kgaG93IGJpZyB0aGlzIGNodW5rIGlzLCBidXQgaXQgc2hvdWxkIGJlIGtlcHQgc21hbGwuICBMaWtlIHRoZQorZGlydHkgZmxhZ3MgdGhpcyBkYXRhIGlzIGxvc3QgaWYgdGhlcmUncyBhIGNyYXNoIHNvIGEgc2FmZSBmYWxsYmFjawordmFsdWUgc2hvdWxkIGFsd2F5cyBiZSBwb3NzaWJsZS4KKworRm9yIGluc3RhbmNlLCB0aGUgJ21xJyBwb2xpY3ksIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgZGVmYXVsdCBwb2xpY3ksCit1c2VzIHRoaXMgZmFjaWxpdHkgdG8gc3RvcmUgdGhlIGhpdCBjb3VudCBvZiB0aGUgY2FjaGUgYmxvY2tzLiAgSWYKK3RoZXJlJ3MgYSBjcmFzaCB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdCwgd2hpY2ggbWVhbnMgdGhlIGNhY2hlCittYXkgYmUgbGVzcyBlZmZpY2llbnQgdW50aWwgdGhvc2UgaGl0IGNvdW50cyBhcmUgcmVnZW5lcmF0ZWQuCisKK1BvbGljeSBoaW50cyBhZmZlY3QgcGVyZm9ybWFuY2UsIG5vdCBjb3JyZWN0bmVzcy4KKworUG9saWN5IG1lc3NhZ2luZworLS0tLS0tLS0tLS0tLS0tLQorCitQb2xpY2llcyB3aWxsIGhhdmUgZGlmZmVyZW50IHR1bmFibGVzLCBzcGVjaWZpYyB0byBlYWNoIG9uZSwgc28gd2UKK25lZWQgYSBnZW5lcmljIHdheSBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZXNlLiAgRGV2aWNlLW1hcHBlcgorbWVzc2FnZXMgYXJlIHVzZWQuICBSZWZlciB0byBjYWNoZS1wb2xpY2llcy50eHQuCisKK0Rpc2NhcmQgYml0c2V0IHJlc29sdXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UgY2FuIGF2b2lkIGNvcHlpbmcgZGF0YSBkdXJpbmcgbWlncmF0aW9uIGlmIHdlIGtub3cgdGhlIGJsb2NrIGhhcworYmVlbiBkaXNjYXJkZWQuICBBIHByaW1lIGV4YW1wbGUgb2YgdGhpcyBpcyB3aGVuIG1rZnMgZGlzY2FyZHMgdGhlCit3aG9sZSBibG9jayBkZXZpY2UuICBXZSBzdG9yZSBhIGJpdHNldCB0cmFja2luZyB0aGUgZGlzY2FyZCBzdGF0ZSBvZgorYmxvY2tzLiAgSG93ZXZlciwgd2UgYWxsb3cgdGhpcyBiaXRzZXQgdG8gaGF2ZSBhIGRpZmZlcmVudCBibG9jayBzaXplCitmcm9tIHRoZSBjYWNoZSBibG9ja3MuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byB0cmFjayB0aGUgZGlzY2FyZAorc3RhdGUgZm9yIGFsbCBvZiB0aGUgb3JpZ2luIGRldmljZSAoY29tcGFyZSB3aXRoIHRoZSBkaXJ0eSBiaXRzZXQKK3doaWNoIGlzIGp1c3QgZm9yIHRoZSBzbWFsbGVyIGNhY2hlIGRldmljZSkuCisKK1RhcmdldCBpbnRlcmZhY2UKKz09PT09PT09PT09PT09PT0KKworQ29uc3RydWN0b3IKKy0tLS0tLS0tLS0tCisKKyBjYWNoZSA8bWV0YWRhdGEgZGV2PiA8Y2FjaGUgZGV2PiA8b3JpZ2luIGRldj4gPGJsb2NrIHNpemU+CisgICAgICAgPCNmZWF0dXJlIGFyZ3M+IFs8ZmVhdHVyZSBhcmc+XSoKKyAgICAgICA8cG9saWN5PiA8I3BvbGljeSBhcmdzPiBbcG9saWN5IGFyZ3NdKgorCisgbWV0YWRhdGEgZGV2ICAgIDogZmFzdCBkZXZpY2UgaG9sZGluZyB0aGUgcGVyc2lzdGVudCBtZXRhZGF0YQorIGNhY2hlIGRldgkgOiBmYXN0IGRldmljZSBob2xkaW5nIGNhY2hlZCBkYXRhIGJsb2NrcworIG9yaWdpbiBkZXYJIDogc2xvdyBkZXZpY2UgaG9sZGluZyBvcmlnaW5hbCBkYXRhIGJsb2NrcworIGJsb2NrIHNpemUgICAgICA6IGNhY2hlIHVuaXQgc2l6ZSBpbiBzZWN0b3JzCisKKyAjZmVhdHVyZSBhcmdzICAgOiBudW1iZXIgb2YgZmVhdHVyZSBhcmd1bWVudHMgcGFzc2VkCisgZmVhdHVyZSBhcmdzICAgIDogd3JpdGV0aHJvdWdoIG9yIHBhc3N0aHJvdWdoIChUaGUgZGVmYXVsdCBpcyB3cml0ZWJhY2suKQorCisgcG9saWN5ICAgICAgICAgIDogdGhlIHJlcGxhY2VtZW50IHBvbGljeSB0byB1c2UKKyAjcG9saWN5IGFyZ3MgICAgOiBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgICAgICAgICAgIGtleS92YWx1ZSBwYWlycyBwYXNzZWQgdG8gdGhlIHBvbGljeQorIHBvbGljeSBhcmdzICAgICA6IGtleS92YWx1ZSBwYWlycyBwYXNzZWQgdG8gdGhlIHBvbGljeQorCQkgICBFLmcuICdzZXF1ZW50aWFsX3RocmVzaG9sZCAxMDI0JworCQkgICBTZWUgY2FjaGUtcG9saWNpZXMudHh0IGZvciBkZXRhaWxzLgorCitPcHRpb25hbCBmZWF0dXJlIGFyZ3VtZW50cyBhcmU6CisgICB3cml0ZXRocm91Z2ggIDogd3JpdGUgdGhyb3VnaCBjYWNoaW5nIHRoYXQgcHJvaGliaXRzIGNhY2hlIGJsb2NrCisJCSAgIGNvbnRlbnQgZnJvbSBiZWluZyBkaWZmZXJlbnQgZnJvbSBvcmlnaW4gYmxvY2sgY29udGVudC4KKwkJICAgV2l0aG91dCB0aGlzIGFyZ3VtZW50LCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gd3JpdGUKKwkJICAgYmFjayBjYWNoZSBibG9jayBjb250ZW50cyBsYXRlciBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKKwkJICAgc28gdGhleSBtYXkgZGlmZmVyIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb3JpZ2luIGJsb2Nrcy4KKworICAgcGFzc3Rocm91Z2gJIDogYSBkZWdyYWRlZCBtb2RlIHVzZWZ1bCBmb3IgdmFyaW91cyBjYWNoZSBjb2hlcmVuY3kKKwkJICAgc2l0dWF0aW9ucyAoZS5nLiwgcm9sbGluZyBiYWNrIHNuYXBzaG90cyBvZgorCQkgICB1bmRlcmx5aW5nIHN0b3JhZ2UpLgkgUmVhZHMgYW5kIHdyaXRlcyBhbHdheXMgZ28gdG8KKwkJICAgdGhlIG9yaWdpbi4JSWYgYSB3cml0ZSBnb2VzIHRvIGEgY2FjaGVkIG9yaWdpbgorCQkgICBibG9jaywgdGhlbiB0aGUgY2FjaGUgYmxvY2sgaXMgaW52YWxpZGF0ZWQuCisJCSAgIFRvIGVuYWJsZSBwYXNzdGhyb3VnaCBtb2RlIHRoZSBjYWNoZSBtdXN0IGJlIGNsZWFuLgorCitBIHBvbGljeSBjYWxsZWQgJ2RlZmF1bHQnIGlzIGFsd2F5cyByZWdpc3RlcmVkLiAgVGhpcyBpcyBhbiBhbGlhcyBmb3IKK3RoZSBwb2xpY3kgd2UgY3VycmVudGx5IHRoaW5rIGlzIGdpdmluZyBiZXN0IGFsbCByb3VuZCBwZXJmb3JtYW5jZS4KKworQXMgdGhlIGRlZmF1bHQgcG9saWN5IGNvdWxkIHZhcnkgYmV0d2VlbiBrZXJuZWxzLCBpZiB5b3UgYXJlIHJlbHlpbmcgb24KK3RoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwb2xpY3ksIGFsd2F5cyByZXF1ZXN0IGl0IGJ5IG5hbWUuCisKK1N0YXR1cworLS0tLS0tCisKKzxtZXRhZGF0YSBibG9jayBzaXplPiA8I3VzZWQgbWV0YWRhdGEgYmxvY2tzPi88I3RvdGFsIG1ldGFkYXRhIGJsb2Nrcz4KKzxjYWNoZSBibG9jayBzaXplPiA8I3VzZWQgY2FjaGUgYmxvY2tzPi88I3RvdGFsIGNhY2hlIGJsb2Nrcz4KKzwjcmVhZCBoaXRzPiA8I3JlYWQgbWlzc2VzPiA8I3dyaXRlIGhpdHM+IDwjd3JpdGUgbWlzc2VzPgorPCNkZW1vdGlvbnM+IDwjcHJvbW90aW9ucz4gPCNkaXJ0eT4gPCNmZWF0dXJlcz4gPGZlYXR1cmVzPioKKzwjY29yZSBhcmdzPiA8Y29yZSBhcmdzPiogPHBvbGljeSBuYW1lPiA8I3BvbGljeSBhcmdzPiA8cG9saWN5IGFyZ3M+KgorPGNhY2hlIG1ldGFkYXRhIG1vZGU+CisKK21ldGFkYXRhIGJsb2NrIHNpemUJIDogRml4ZWQgYmxvY2sgc2l6ZSBmb3IgZWFjaCBtZXRhZGF0YSBibG9jayBpbgorCQkJICAgICBzZWN0b3JzCisjdXNlZCBtZXRhZGF0YSBibG9ja3MJIDogTnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyB1c2VkCisjdG90YWwgbWV0YWRhdGEgYmxvY2tzCSA6IFRvdGFsIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MKK2NhY2hlIGJsb2NrIHNpemUJIDogQ29uZmlndXJhYmxlIGJsb2NrIHNpemUgZm9yIHRoZSBjYWNoZSBkZXZpY2UKKwkJCSAgICAgaW4gc2VjdG9ycworI3VzZWQgY2FjaGUgYmxvY2tzCSA6IE51bWJlciBvZiBibG9ja3MgcmVzaWRlbnQgaW4gdGhlIGNhY2hlCisjdG90YWwgY2FjaGUgYmxvY2tzCSA6IFRvdGFsIG51bWJlciBvZiBjYWNoZSBibG9ja3MKKyNyZWFkIGhpdHMJCSA6IE51bWJlciBvZiB0aW1lcyBhIFJFQUQgYmlvIGhhcyBiZWVuIG1hcHBlZAorCQkJICAgICB0byB0aGUgY2FjaGUKKyNyZWFkIG1pc3NlcwkJIDogTnVtYmVyIG9mIHRpbWVzIGEgUkVBRCBiaW8gaGFzIGJlZW4gbWFwcGVkCisJCQkgICAgIHRvIHRoZSBvcmlnaW4KKyN3cml0ZSBoaXRzCQkgOiBOdW1iZXIgb2YgdGltZXMgYSBXUklURSBiaW8gaGFzIGJlZW4gbWFwcGVkCisJCQkgICAgIHRvIHRoZSBjYWNoZQorI3dyaXRlIG1pc3NlcwkJIDogTnVtYmVyIG9mIHRpbWVzIGEgV1JJVEUgYmlvIGhhcyBiZWVuCisJCQkgICAgIG1hcHBlZCB0byB0aGUgb3JpZ2luCisjZGVtb3Rpb25zCQkgOiBOdW1iZXIgb2YgdGltZXMgYSBibG9jayBoYXMgYmVlbiByZW1vdmVkCisJCQkgICAgIGZyb20gdGhlIGNhY2hlCisjcHJvbW90aW9ucwkJIDogTnVtYmVyIG9mIHRpbWVzIGEgYmxvY2sgaGFzIGJlZW4gbW92ZWQgdG8KKwkJCSAgICAgdGhlIGNhY2hlCisjZGlydHkJCQkgOiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBjYWNoZSB0aGF0IGRpZmZlcgorCQkJICAgICBmcm9tIHRoZSBvcmlnaW4KKyNmZWF0dXJlIGFyZ3MJCSA6IE51bWJlciBvZiBmZWF0dXJlIGFyZ3MgdG8gZm9sbG93CitmZWF0dXJlIGFyZ3MJCSA6ICd3cml0ZXRocm91Z2gnIChvcHRpb25hbCkKKyNjb3JlIGFyZ3MJCSA6IE51bWJlciBvZiBjb3JlIGFyZ3VtZW50cyAobXVzdCBiZSBldmVuKQorY29yZSBhcmdzCQkgOiBLZXkvdmFsdWUgcGFpcnMgZm9yIHR1bmluZyB0aGUgY29yZQorCQkJICAgICBlLmcuIG1pZ3JhdGlvbl90aHJlc2hvbGQKK3BvbGljeSBuYW1lCQkgOiBOYW1lIG9mIHRoZSBwb2xpY3kKKyNwb2xpY3kgYXJncwkJIDogTnVtYmVyIG9mIHBvbGljeSBhcmd1bWVudHMgdG8gZm9sbG93IChtdXN0IGJlIGV2ZW4pCitwb2xpY3kgYXJncwkJIDogS2V5L3ZhbHVlIHBhaXJzIGUuZy4gc2VxdWVudGlhbF90aHJlc2hvbGQKK2NhY2hlIG1ldGFkYXRhIG1vZGUgICAgICA6IHJvIGlmIHJlYWQtb25seSwgcncgaWYgcmVhZC13cml0ZQorCUluIHNlcmlvdXMgY2FzZXMgd2hlcmUgZXZlbiBhIHJlYWQtb25seSBtb2RlIGlzIGRlZW1lZCB1bnNhZmUKKwlubyBmdXJ0aGVyIEkvTyB3aWxsIGJlIHBlcm1pdHRlZCBhbmQgdGhlIHN0YXR1cyB3aWxsIGp1c3QKKwljb250YWluIHRoZSBzdHJpbmcgJ0ZhaWwnLiAgVGhlIHVzZXJzcGFjZSByZWNvdmVyeSB0b29scworCXNob3VsZCB0aGVuIGJlIHVzZWQuCituZWVkc19jaGVjawkJIDogJ25lZWRzX2NoZWNrJyBpZiBzZXQsICctJyBpZiBub3Qgc2V0CisJQSBtZXRhZGF0YSBvcGVyYXRpb24gaGFzIGZhaWxlZCwgcmVzdWx0aW5nIGluIHRoZSBuZWVkc19jaGVjaworCWZsYWcgYmVpbmcgc2V0IGluIHRoZSBtZXRhZGF0YSdzIHN1cGVyYmxvY2suICBUaGUgbWV0YWRhdGEKKwlkZXZpY2UgbXVzdCBiZSBkZWFjdGl2YXRlZCBhbmQgY2hlY2tlZC9yZXBhaXJlZCBiZWZvcmUgdGhlCisJY2FjaGUgY2FuIGJlIG1hZGUgZnVsbHkgb3BlcmF0aW9uYWwgYWdhaW4uICAnLScgaW5kaWNhdGVzCisJbmVlZHNfY2hlY2sgaXMgbm90IHNldC4KKworTWVzc2FnZXMKKy0tLS0tLS0tCisKK1BvbGljaWVzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgdHVuYWJsZXMsIHNwZWNpZmljIHRvIGVhY2ggb25lLCBzbyB3ZQorbmVlZCBhIGdlbmVyaWMgd2F5IG9mIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlc2UuICBEZXZpY2UtbWFwcGVyCittZXNzYWdlcyBhcmUgdXNlZC4gIChBIHN5c2ZzIGludGVyZmFjZSB3b3VsZCBhbHNvIGJlIHBvc3NpYmxlLikKKworVGhlIG1lc3NhZ2UgZm9ybWF0IGlzOgorCisgICA8a2V5PiA8dmFsdWU+CisKK0UuZy4KKyAgIGRtc2V0dXAgbWVzc2FnZSBteV9jYWNoZSAwIHNlcXVlbnRpYWxfdGhyZXNob2xkIDEwMjQKKworCitJbnZhbGlkYXRpb24gaXMgcmVtb3ZpbmcgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgd2l0aG91dCB3cml0aW5nIGl0CitiYWNrLiAgQ2FjaGUgYmxvY2tzIGNhbiBiZSBpbnZhbGlkYXRlZCB2aWEgdGhlIGludmFsaWRhdGVfY2Jsb2NrcworbWVzc2FnZSwgd2hpY2ggdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBjYmxvY2sgcmFuZ2VzLiAgRWFjaCBjYmxvY2sKK3JhbmdlJ3MgZW5kIHZhbHVlIGlzICJvbmUgcGFzdCB0aGUgZW5kIiwgbWVhbmluZyA1LTEwIGV4cHJlc3NlcyBhIHJhbmdlCitvZiB2YWx1ZXMgZnJvbSA1IHRvIDkuICBFYWNoIGNibG9jayBtdXN0IGJlIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwKK3ZhbHVlLCBpbiB0aGUgZnV0dXJlIGEgdmFyaWFudCBtZXNzYWdlIHRoYXQgdGFrZXMgY2Jsb2NrIHJhbmdlcworZXhwcmVzc2VkIGluIGhleGlkZWNpbWFsIG1heSBiZSBuZWVkZWQgdG8gYmV0dGVyIHN1cHBvcnQgZWZmaWNpZW50CitpbnZhbGlkYXRpb24gb2YgbGFyZ2VyIGNhY2hlcy4gIFRoZSBjYWNoZSBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUKK3doZW4gaW52YWxpZGF0ZV9jYmxvY2tzIGlzIHVzZWQuCisKKyAgIGludmFsaWRhdGVfY2Jsb2NrcyBbPGNibG9jaz58PGNibG9jayBiZWdpbj4tPGNibG9jayBlbmQ+XSoKKworRS5nLgorICAgZG1zZXR1cCBtZXNzYWdlIG15X2NhY2hlIDAgaW52YWxpZGF0ZV9jYmxvY2tzIDIzNDUgMzQ1Ni00NTY3IDU2NzgtNjc4OQorCitFeGFtcGxlcworPT09PT09PT0KKworVGhlIHRlc3Qgc3VpdGUgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHBzOi8vZ2l0aHViLmNvbS9qdGhvcm5iZXIvZGV2aWNlLW1hcHBlci10ZXN0LXN1aXRlCisKK2Rtc2V0dXAgY3JlYXRlIG15X2NhY2hlIC0tdGFibGUgJzAgNDE5NDMwNDAgY2FjaGUgL2Rldi9tYXBwZXIvbWV0YWRhdGEgXAorCS9kZXYvbWFwcGVyL3NzZCAvZGV2L21hcHBlci9vcmlnaW4gNTEyIDEgd3JpdGViYWNrIGRlZmF1bHQgMCcKK2Rtc2V0dXAgY3JlYXRlIG15X2NhY2hlIC0tdGFibGUgJzAgNDE5NDMwNDAgY2FjaGUgL2Rldi9tYXBwZXIvbWV0YWRhdGEgXAorCS9kZXYvbWFwcGVyL3NzZCAvZGV2L21hcHBlci9vcmlnaW4gMTAyNCAxIHdyaXRlYmFjayBcCisJbXEgNCBzZXF1ZW50aWFsX3RocmVzaG9sZCAxMDI0IHJhbmRvbV90aHJlc2hvbGQgOCcKZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvY3J5cHQudHh0IGIvZG9jL2tlcm5lbC9jcnlwdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMTcxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvY3J5cHQudHh0CkBAIC0wLDAgKzEsOTYgQEAKK2RtLWNyeXB0Cis9PT09PT09PT0KKworRGV2aWNlLU1hcHBlcidzICJjcnlwdCIgdGFyZ2V0IHByb3ZpZGVzIHRyYW5zcGFyZW50IGVuY3J5cHRpb24gb2YgYmxvY2sgZGV2aWNlcwordXNpbmcgdGhlIGtlcm5lbCBjcnlwdG8gQVBJLgorCitGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHNlZToKK2h0dHBzOi8vZ2l0bGFiLmNvbS9jcnlwdHNldHVwL2NyeXB0c2V0dXAvd2lraXMvRE1DcnlwdAorCitQYXJhbWV0ZXJzOiA8Y2lwaGVyPiA8a2V5PiA8aXZfb2Zmc2V0PiA8ZGV2aWNlIHBhdGg+IFwKKwkgICAgICA8b2Zmc2V0PiBbPCNvcHRfcGFyYW1zPiA8b3B0X3BhcmFtcz5dCisKKzxjaXBoZXI+CisgICAgRW5jcnlwdGlvbiBjaXBoZXIgYW5kIGFuIG9wdGlvbmFsIElWIGdlbmVyYXRpb24gbW9kZS4KKyAgICAoSW4gZm9ybWF0IGNpcGhlcls6a2V5Y291bnRdLWNoYWlubW9kZS1pdm1vZGVbOml2b3B0c10pLgorICAgIEV4YW1wbGVzOgorICAgICAgIGRlcworICAgICAgIGFlcy1jYmMtZXNzaXY6c2hhMjU2CisgICAgICAgdHdvZmlzaC1lY2IKKworICAgIC9wcm9jL2NyeXB0byBjb250YWlucyBzdXBwb3J0ZWQgY3J5cHRvIG1vZGVzCisKKzxrZXk+CisgICAgS2V5IHVzZWQgZm9yIGVuY3J5cHRpb24uIEl0IGlzIGVuY29kZWQgYXMgYSBoZXhhZGVjaW1hbCBudW1iZXIuCisgICAgWW91IGNhbiBvbmx5IHVzZSBrZXkgc2l6ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBzZWxlY3RlZCBjaXBoZXIKKyAgICBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBzZWxlY3RlZCBpdiBtb2RlLgorICAgIE5vdGUgdGhhdCBmb3Igc29tZSBpdiBtb2RlcyB0aGUga2V5IHN0cmluZyBjYW4gY29udGFpbiBhZGRpdGlvbmFsCisgICAga2V5cyAoZm9yIGV4YW1wbGUgSVYgc2VlZCkgc28gdGhlIGtleSBjb250YWlucyBtb3JlIHBhcnRzIGNvbmNhdGVuYXRlZAorICAgIGludG8gYSBzaW5nbGUgc3RyaW5nLgorCis8a2V5Y291bnQ+CisgICAgTXVsdGkta2V5IGNvbXBhdGliaWxpdHkgbW9kZS4gWW91IGNhbiBkZWZpbmUgPGtleWNvdW50PiBrZXlzIGFuZAorICAgIHRoZW4gc2VjdG9ycyBhcmUgZW5jcnlwdGVkIGFjY29yZGluZyB0byB0aGVpciBvZmZzZXRzIChzZWN0b3IgMCB1c2VzIGtleTA7CisgICAgc2VjdG9yIDEgdXNlcyBrZXkxIGV0Yy4pLiAgPGtleWNvdW50PiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorCis8aXZfb2Zmc2V0PgorICAgIFRoZSBJViBvZmZzZXQgaXMgYSBzZWN0b3IgY291bnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgc2VjdG9yIG51bWJlcgorICAgIGJlZm9yZSBjcmVhdGluZyB0aGUgSVYuCisKKzxkZXZpY2UgcGF0aD4KKyAgICBUaGlzIGlzIHRoZSBkZXZpY2UgdGhhdCBpcyBnb2luZyB0byBiZSB1c2VkIGFzIGJhY2tlbmQgYW5kIGNvbnRhaW5zIHRoZQorICAgIGVuY3J5cHRlZCBkYXRhLiAgWW91IGNhbiBzcGVjaWZ5IGl0IGFzIGEgcGF0aCBsaWtlIC9kZXYveHh4IG9yIGEgZGV2aWNlCisgICAgbnVtYmVyIDxtYWpvcj46PG1pbm9yPi4KKworPG9mZnNldD4KKyAgICBTdGFydGluZyBzZWN0b3Igd2l0aGluIHRoZSBkZXZpY2Ugd2hlcmUgdGhlIGVuY3J5cHRlZCBkYXRhIGJlZ2lucy4KKworPCNvcHRfcGFyYW1zPgorICAgIE51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzLiBJZiB0aGVyZSBhcmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycywKKyAgICB0aGUgb3B0aW9uYWwgcGFyYW1hdGVycyBzZWN0aW9uIGNhbiBiZSBza2lwcGVkIG9yICNvcHRfcGFyYW1zIGNhbiBiZSB6ZXJvLgorICAgIE90aGVyd2lzZSAjb3B0X3BhcmFtcyBpcyB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZyBhcmd1bWVudHMuCisKKyAgICBFeGFtcGxlIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgc2VjdGlvbjoKKyAgICAgICAgMyBhbGxvd19kaXNjYXJkcyBzYW1lX2NwdV9jcnlwdCBzdWJtaXRfZnJvbV9jcnlwdF9jcHVzCisKK2FsbG93X2Rpc2NhcmRzCisgICAgQmxvY2sgZGlzY2FyZCByZXF1ZXN0cyAoYS5rLmEuIFRSSU0pIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgY3J5cHQgZGV2aWNlLgorICAgIFRoZSBkZWZhdWx0IGlzIHRvIGlnbm9yZSBkaXNjYXJkIHJlcXVlc3RzLgorCisgICAgV0FSTklORzogQXNzZXNzIHRoZSBzcGVjaWZpYyBzZWN1cml0eSByaXNrcyBjYXJlZnVsbHkgYmVmb3JlIGVuYWJsaW5nIHRoaXMKKyAgICBvcHRpb24uICBGb3IgZXhhbXBsZSwgYWxsb3dpbmcgZGlzY2FyZHMgb24gZW5jcnlwdGVkIGRldmljZXMgbWF5IGxlYWQgdG8KKyAgICB0aGUgbGVhayBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2lwaGVydGV4dCBkZXZpY2UgKGZpbGVzeXN0ZW0gdHlwZSwKKyAgICB1c2VkIHNwYWNlIGV0Yy4pIGlmIHRoZSBkaXNjYXJkZWQgYmxvY2tzIGNhbiBiZSBsb2NhdGVkIGVhc2lseSBvbiB0aGUKKyAgICBkZXZpY2UgbGF0ZXIuCisKK3NhbWVfY3B1X2NyeXB0CisgICAgUGVyZm9ybSBlbmNyeXB0aW9uIHVzaW5nIHRoZSBzYW1lIGNwdSB0aGF0IElPIHdhcyBzdWJtaXR0ZWQgb24uCisgICAgVGhlIGRlZmF1bHQgaXMgdG8gdXNlIGFuIHVuYm91bmQgd29ya3F1ZXVlIHNvIHRoYXQgZW5jcnlwdGlvbiB3b3JrCisgICAgaXMgYXV0b21hdGljYWxseSBiYWxhbmNlZCBiZXR3ZWVuIGF2YWlsYWJsZSBDUFVzLgorCitzdWJtaXRfZnJvbV9jcnlwdF9jcHVzCisgICAgRGlzYWJsZSBvZmZsb2FkaW5nIHdyaXRlcyB0byBhIHNlcGFyYXRlIHRocmVhZCBhZnRlciBlbmNyeXB0aW9uLgorICAgIFRoZXJlIGFyZSBzb21lIHNpdHVhdGlvbnMgd2hlcmUgb2ZmbG9hZGluZyB3cml0ZSBiaW9zIGZyb20gdGhlCisgICAgZW5jcnlwdGlvbiB0aHJlYWRzIHRvIGEgc2luZ2xlIHRocmVhZCBkZWdyYWRlcyBwZXJmb3JtYW5jZQorICAgIHNpZ25pZmljYW50bHkuICBUaGUgZGVmYXVsdCBpcyB0byBvZmZsb2FkIHdyaXRlIGJpb3MgdG8gdGhlIHNhbWUKKyAgICB0aHJlYWQgYmVjYXVzZSBpdCBiZW5lZml0cyBDRlEgdG8gaGF2ZSB3cml0ZXMgc3VibWl0dGVkIHVzaW5nIHRoZQorICAgIHNhbWUgY29udGV4dC4KKworRXhhbXBsZSBzY3JpcHRzCis9PT09PT09PT09PT09PT0KK0xVS1MgKExpbnV4IFVuaWZpZWQgS2V5IFNldHVwKSBpcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2V0IHVwIGRpc2sKK2VuY3J5cHRpb24gd2l0aCBkbS1jcnlwdCB1c2luZyB0aGUgJ2NyeXB0c2V0dXAnIHV0aWxpdHksIHNlZQoraHR0cHM6Ly9naXRsYWIuY29tL2NyeXB0c2V0dXAvY3J5cHRzZXR1cAorCitbWworIyEvYmluL3NoCisjIENyZWF0ZSBhIGNyeXB0IGRldmljZSB1c2luZyBkbXNldHVwCitkbXNldHVwIGNyZWF0ZSBjcnlwdDEgLS10YWJsZSAiMCBgYmxvY2tkZXYgLS1nZXRzaXplICQxYCBjcnlwdCBhZXMtY2JjLWVzc2l2OnNoYTI1NiBiYWJlYmFiZWJhYmViYWJlYmFiZWJhYmViYWJlYmFiZSAwICQxIDAiCitdXQorCitbWworIyEvYmluL3NoCisjIENyZWF0ZSBhIGNyeXB0IGRldmljZSB1c2luZyBjcnlwdHNldHVwIGFuZCBMVUtTIGhlYWRlciB3aXRoIGRlZmF1bHQgY2lwaGVyCitjcnlwdHNldHVwIGx1a3NGb3JtYXQgJDEKK2NyeXB0c2V0dXAgbHVrc09wZW4gJDEgY3J5cHQxCitdXQpkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9kZWxheS50eHQgYi9kb2Mva2VybmVsL2RlbGF5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdiNTkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9kZWxheS50eHQKQEAgLTAsMCArMSwyNyBAQAorZG0tZGVsYXkKKz09PT09PT09CisKK0RldmljZS1NYXBwZXIncyAiZGVsYXkiIHRhcmdldCBkZWxheXMgcmVhZHMgYW5kL29yIHdyaXRlcworYW5kIG1hcHMgdGhlbSB0byBkaWZmZXJlbnQgZGV2aWNlcy4KKworUGFyYW1ldGVyczoKKyAgICA8ZGV2aWNlPiA8b2Zmc2V0PiA8ZGVsYXk+IFs8d3JpdGVfZGV2aWNlPiA8d3JpdGVfb2Zmc2V0PiA8d3JpdGVfZGVsYXk+XQorCitXaXRoIHNlcGFyYXRlIHdyaXRlIHBhcmFtZXRlcnMsIHRoZSBmaXJzdCBzZXQgaXMgb25seSB1c2VkIGZvciByZWFkcy4KK09mZnNldHMgYXJlIHNwZWNpZmllZCBpbiBzZWN0b3JzLgorRGVsYXlzIGFyZSBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgorCitFeGFtcGxlIHNjcmlwdHMKKz09PT09PT09PT09PT09PQorW1sKKyMhL2Jpbi9zaAorIyBDcmVhdGUgZGV2aWNlIGRlbGF5aW5nIHJ3IG9wZXJhdGlvbiBmb3IgNTAwbXMKK2VjaG8gIjAgYGJsb2NrZGV2IC0tZ2V0c2l6ZSAkMWAgZGVsYXkgJDEgMCA1MDAiIHwgZG1zZXR1cCBjcmVhdGUgZGVsYXllZAorXV0KKworW1sKKyMhL2Jpbi9zaAorIyBDcmVhdGUgZGV2aWNlIGRlbGF5aW5nIG9ubHkgd3JpdGUgb3BlcmF0aW9uIGZvciA1MDBtcyBhbmQKKyMgc3BsaXR0aW5nIHJlYWRzIGFuZCB3cml0ZXMgdG8gZGlmZmVyZW50IGRldmljZXMgJDEgJDIKK2VjaG8gIjAgYGJsb2NrZGV2IC0tZ2V0c2l6ZSAkMWAgZGVsYXkgJDEgMCAwICQyIDAgNTAwIiB8IGRtc2V0dXAgY3JlYXRlIGRlbGF5ZWQKK11dCmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL2VyYS50eHQgYi9kb2Mva2VybmVsL2VyYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZDAxYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvZXJhLnR4dApAQCAtMCwwICsxLDEwOCBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworZG0tZXJhIGlzIGEgdGFyZ2V0IHRoYXQgYmVoYXZlcyBzaW1pbGFyIHRvIHRoZSBsaW5lYXIgdGFyZ2V0LiAgSW4KK2FkZGl0aW9uIGl0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIGJsb2NrcyB3ZXJlIHdyaXR0ZW4gd2l0aGluIGEgdXNlcgorZGVmaW5lZCBwZXJpb2Qgb2YgdGltZSBjYWxsZWQgYW4gJ2VyYScuICBFYWNoIGVyYSB0YXJnZXQgaW5zdGFuY2UKK21haW50YWlucyB0aGUgY3VycmVudCBlcmEgYXMgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgMzItYml0Citjb3VudGVyLgorCitVc2UgY2FzZXMgaW5jbHVkZSB0cmFja2luZyBjaGFuZ2VkIGJsb2NrcyBmb3IgYmFja3VwIHNvZnR3YXJlLCBhbmQKK3BhcnRpYWxseSBpbnZhbGlkYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgY2FjaGUgdG8gcmVzdG9yZSBjYWNoZQorY29oZXJlbmN5IGFmdGVyIHJvbGxpbmcgYmFjayBhIHZlbmRvciBzbmFwc2hvdC4KKworQ29uc3RydWN0b3IKKz09PT09PT09PT09CisKKyBlcmEgPG1ldGFkYXRhIGRldj4gPG9yaWdpbiBkZXY+IDxibG9jayBzaXplPgorCisgbWV0YWRhdGEgZGV2ICAgIDogZmFzdCBkZXZpY2UgaG9sZGluZyB0aGUgcGVyc2lzdGVudCBtZXRhZGF0YQorIG9yaWdpbiBkZXYJIDogZGV2aWNlIGhvbGRpbmcgZGF0YSBibG9ja3MgdGhhdCBtYXkgY2hhbmdlCisgYmxvY2sgc2l6ZSAgICAgIDogYmxvY2sgc2l6ZSBvZiBvcmlnaW4gZGF0YSBkZXZpY2UsIGdyYW51bGFyaXR5IHRoYXQgaXMKKwkJICAgICB0cmFja2VkIGJ5IHRoZSB0YXJnZXQKKworTWVzc2FnZXMKKz09PT09PT09CisKK05vbmUgb2YgdGhlIGRtIG1lc3NhZ2VzIHRha2UgYW55IGFyZ3VtZW50cy4KKworY2hlY2twb2ludAorLS0tLS0tLS0tLQorCitQb3NzaWJseSBtb3ZlIHRvIGEgbmV3IGVyYS4gIFlvdSBzaG91bGRuJ3QgYXNzdW1lIHRoZSBlcmEgaGFzCitpbmNyZW1lbnRlZC4gIEFmdGVyIHNlbmRpbmcgdGhpcyBtZXNzYWdlLCB5b3Ugc2hvdWxkIGNoZWNrIHRoZQorY3VycmVudCBlcmEgdmlhIHRoZSBzdGF0dXMgbGluZS4KKwordGFrZV9tZXRhZGF0YV9zbmFwCistLS0tLS0tLS0tLS0tLS0tLS0KKworQ3JlYXRlIGEgY2xvbmUgb2YgdGhlIG1ldGFkYXRhLCB0byBhbGxvdyBhIHVzZXJsYW5kIHByb2Nlc3MgdG8gcmVhZCBpdC4KKworZHJvcF9tZXRhZGF0YV9zbmFwCistLS0tLS0tLS0tLS0tLS0tLS0KKworRHJvcCB0aGUgbWV0YWRhdGEgc25hcHNob3QuCisKK1N0YXR1cworPT09PT09CisKKzxtZXRhZGF0YSBibG9jayBzaXplPiA8I3VzZWQgbWV0YWRhdGEgYmxvY2tzPi88I3RvdGFsIG1ldGFkYXRhIGJsb2Nrcz4KKzxjdXJyZW50IGVyYT4gPGhlbGQgbWV0YWRhdGEgcm9vdCB8ICctJz4KKworbWV0YWRhdGEgYmxvY2sgc2l6ZQkgOiBGaXhlZCBibG9jayBzaXplIGZvciBlYWNoIG1ldGFkYXRhIGJsb2NrIGluCisJCQkgICAgIHNlY3RvcnMKKyN1c2VkIG1ldGFkYXRhIGJsb2NrcwkgOiBOdW1iZXIgb2YgbWV0YWRhdGEgYmxvY2tzIHVzZWQKKyN0b3RhbCBtZXRhZGF0YSBibG9ja3MJIDogVG90YWwgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcworY3VycmVudCBlcmEJCSA6IFRoZSBjdXJyZW50IGVyYQoraGVsZCBtZXRhZGF0YSByb290CSA6IFRoZSBsb2NhdGlvbiwgaW4gYmxvY2tzLCBvZiB0aGUgbWV0YWRhdGEgcm9vdAorCQkJICAgICB0aGF0IGhhcyBiZWVuICdoZWxkJyBmb3IgdXNlcnNwYWNlIHJlYWQKKwkJCSAgICAgYWNjZXNzLiAnLScgaW5kaWNhdGVzIHRoZXJlIGlzIG5vIGhlbGQgcm9vdAorCitEZXRhaWxlZCB1c2UgY2FzZQorPT09PT09PT09PT09PT09PT0KKworVGhlIHNjZW5hcmlvIG9mIGludmFsaWRhdGluZyBhIGNhY2hlIHdoZW4gcm9sbGluZyBiYWNrIGEgdmVuZG9yCitzbmFwc2hvdCB3YXMgdGhlIHByaW1hcnkgdXNlIGNhc2Ugd2hlbiBkZXZlbG9waW5nIHRoaXMgdGFyZ2V0OgorCitUYWtpbmcgYSB2ZW5kb3Igc25hcHNob3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIFNlbmQgYSBjaGVja3BvaW50IG1lc3NhZ2UgdG8gdGhlIGVyYSB0YXJnZXQKKy0gTWFrZSBhIG5vdGUgb2YgdGhlIGN1cnJlbnQgZXJhIGluIGl0cyBzdGF0dXMgbGluZQorLSBUYWtlIHZlbmRvciBzbmFwc2hvdCAodGhlIGVyYSBhbmQgc25hcHNob3Qgc2hvdWxkIGJlIGZvcmV2ZXIKKyAgYXNzb2NpYXRlZCBub3cpLgorCitSb2xsaW5nIGJhY2sgdG8gYW4gdmVuZG9yIHNuYXBzaG90CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQ2FjaGUgZW50ZXJzIHBhc3N0aHJvdWdoIG1vZGUgKHNlZTogZG0tY2FjaGUncyBkb2NzIGluIGNhY2hlLnR4dCkKKy0gUm9sbGJhY2sgdmVuZG9yIHN0b3JhZ2UKKy0gVGFrZSBtZXRhZGF0YSBzbmFwc2hvdAorLSBBc2NlcnRhaW4gd2hpY2ggYmxvY2tzIGhhdmUgYmVlbiB3cml0dGVuIHNpbmNlIHRoZSBzbmFwc2hvdCB3YXMgdGFrZW4KKyAgYnkgY2hlY2tpbmcgZWFjaCBibG9jaydzIGVyYQorLSBJbnZhbGlkYXRlIHRob3NlIGJsb2NrcyBpbiB0aGUgY2FjaGluZyBzb2Z0d2FyZQorLSBDYWNoZSByZXR1cm5zIHRvIHdyaXRlYmFjay93cml0ZXRocm91Z2ggbW9kZQorCitNZW1vcnkgdXNhZ2UKKz09PT09PT09PT09PQorCitUaGUgdGFyZ2V0IHVzZXMgYSBiaXRzZXQgdG8gcmVjb3JkIHdyaXRlcyBpbiB0aGUgY3VycmVudCBlcmEuICBJdCBhbHNvCitoYXMgYSBzcGFyZSBiaXRzZXQgcmVhZHkgZm9yIHN3aXRjaGluZyBvdmVyIHRvIGEgbmV3IGVyYS4gIE90aGVyIHRoYW4KK3RoYXQgaXQgdXNlcyBhIGZldyA0ayBibG9ja3MgZm9yIHVwZGF0aW5nIG1ldGFkYXRhLgorCisgICAoNCAqIG5yX2Jsb2NrcykgYnl0ZXMgKyBidWZmZXJzCisKK1Jlc2lsaWVuY2UKKz09PT09PT09PT0KKworTWV0YWRhdGEgaXMgdXBkYXRlZCBvbiBkaXNrIGJlZm9yZSBhIHdyaXRlIHRvIGEgcHJldmlvdXNseSB1bndyaXR0ZW4KK2Jsb2NrIGlzIHBlcmZvcm1lZC4gIEFzIHN1Y2ggZG0tZXJhIHNob3VsZCBub3QgYmUgZWZmZWN0ZWQgYnkgYSBoYXJkCitjcmFzaCBzdWNoIGFzIHBvd2VyIGZhaWx1cmUuCisKK1VzZXJsYW5kIHRvb2xzCis9PT09PT09PT09PT09PQorCitVc2VybGFuZCB0b29scyBhcmUgZm91bmQgaW4gdGhlIGluY3JlYXNpbmdseSBwb29ybHkgbmFtZWQKK3RoaW4tcHJvdmlzaW9uaW5nLXRvb2xzIHByb2plY3Q6CisKKyAgICBodHRwczovL2dpdGh1Yi5jb20vanRob3JuYmVyL3RoaW4tcHJvdmlzaW9uaW5nLXRvb2xzCmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL2ZsYWtleS50eHQgYi9kb2Mva2VybmVsL2ZsYWtleS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmNWMyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvZmxha2V5LnR4dApAQCAtMCwwICsxLDUzIEBACitkbS1mbGFrZXkKKz09PT09PT09PQorCitUaGlzIHRhcmdldCBpcyB0aGUgc2FtZSBhcyB0aGUgbGluZWFyIHRhcmdldCBleGNlcHQgdGhhdCBpdCBleGhpYml0cwordW5yZWxpYWJsZSBiZWhhdmlvdXIgcGVyaW9kaWNhbGx5LiAgSXQncyBiZWVuIGZvdW5kIHVzZWZ1bCBpbiBzaW11bGF0aW5nCitmYWlsaW5nIGRldmljZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisKK1N0YXJ0aW5nIGZyb20gdGhlIHRpbWUgdGhlIHRhYmxlIGlzIGxvYWRlZCwgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgZm9yCis8dXAgaW50ZXJ2YWw+IHNlY29uZHMsIHRoZW4gZXhoaWJpdHMgdW5yZWxpYWJsZSBiZWhhdmlvdXIgZm9yIDxkb3duCitpbnRlcnZhbD4gc2Vjb25kcywgYW5kIHRoZW4gdGhpcyBjeWNsZSByZXBlYXRzLgorCitBbHNvLCBjb25zaWRlciB1c2luZyB0aGlzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGRtLWRlbGF5IHRhcmdldCB0b28sCit3aGljaCBjYW4gZGVsYXkgcmVhZHMgYW5kIHdyaXRlcyBhbmQvb3Igc2VuZCB0aGVtIHRvIGRpZmZlcmVudAordW5kZXJseWluZyBkZXZpY2VzLgorCitUYWJsZSBwYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tCisgIDxkZXYgcGF0aD4gPG9mZnNldD4gPHVwIGludGVydmFsPiA8ZG93biBpbnRlcnZhbD4gXAorICAgIFs8bnVtX2ZlYXR1cmVzPiBbPGZlYXR1cmUgYXJndW1lbnRzPl1dCisKK01hbmRhdG9yeSBwYXJhbWV0ZXJzOgorICAgIDxkZXYgcGF0aD46IEZ1bGwgcGF0aG5hbWUgdG8gdGhlIHVuZGVybHlpbmcgYmxvY2stZGV2aWNlLCBvciBhCisgICAgICAgICAgICAgICAgIm1ham9yOm1pbm9yIiBkZXZpY2UtbnVtYmVyLgorICAgIDxvZmZzZXQ+OiBTdGFydGluZyBzZWN0b3Igd2l0aGluIHRoZSBkZXZpY2UuCisgICAgPHVwIGludGVydmFsPjogTnVtYmVyIG9mIHNlY29uZHMgZGV2aWNlIGlzIGF2YWlsYWJsZS4KKyAgICA8ZG93biBpbnRlcnZhbD46IE51bWJlciBvZiBzZWNvbmRzIGRldmljZSByZXR1cm5zIGVycm9ycy4KKworT3B0aW9uYWwgZmVhdHVyZSBwYXJhbWV0ZXJzOgorICBJZiBubyBmZWF0dXJlIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQsIGR1cmluZyB0aGUgcGVyaW9kcyBvZgorICB1bnJlbGlhYmlsaXR5LCBhbGwgSS9PIHJldHVybnMgZXJyb3JzLgorCisgIGRyb3Bfd3JpdGVzOgorCUFsbCB3cml0ZSBJL08gaXMgc2lsZW50bHkgaWdub3JlZC4KKwlSZWFkIEkvTyBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKworICBjb3JydXB0X2Jpb19ieXRlIDxOdGhfYnl0ZT4gPGRpcmVjdGlvbj4gPHZhbHVlPiA8ZmxhZ3M+OgorCUR1cmluZyA8ZG93biBpbnRlcnZhbD4sIHJlcGxhY2UgPE50aF9ieXRlPiBvZiB0aGUgZGF0YSBvZgorCWVhY2ggbWF0Y2hpbmcgYmlvIHdpdGggPHZhbHVlPi4KKworICAgIDxOdGhfYnl0ZT46IFRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgdG8gcmVwbGFjZS4KKwkJQ291bnRpbmcgc3RhcnRzIGF0IDEsIHRvIHJlcGxhY2UgdGhlIGZpcnN0IGJ5dGUuCisgICAgPGRpcmVjdGlvbj46IEVpdGhlciAncicgdG8gY29ycnVwdCByZWFkcyBvciAndycgdG8gY29ycnVwdCB3cml0ZXMuCisJCSAndycgaXMgaW5jb21wYXRpYmxlIHdpdGggZHJvcF93cml0ZXMuCisgICAgPHZhbHVlPjogVGhlIHZhbHVlIChmcm9tIDAtMjU1KSB0byB3cml0ZS4KKyAgICA8ZmxhZ3M+OiBQZXJmb3JtIHRoZSByZXBsYWNlbWVudCBvbmx5IGlmIGJpby0+YmlfcncgaGFzIGFsbCB0aGUKKwkgICAgIHNlbGVjdGVkIGZsYWdzIHNldC4KKworRXhhbXBsZXM6CisgIGNvcnJ1cHRfYmlvX2J5dGUgMzIgciAxIDAKKwktIHJlcGxhY2VzIHRoZSAzMm5kIGJ5dGUgb2YgUkVBRCBiaW9zIHdpdGggdGhlIHZhbHVlIDEKKworICBjb3JydXB0X2Jpb19ieXRlIDIyNCB3IDAgMzIKKwktIHJlcGxhY2VzIHRoZSAyMjR0aCBieXRlIG9mIFJFUV9NRVRBICg9MzIpIGJpb3Mgd2l0aCB0aGUgdmFsdWUgMApkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9pby50eHQgYi9kb2Mva2VybmVsL2lvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjVkOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9pby50eHQKQEAgLTAsMCArMSw3NSBAQAorZG0taW8KKz09PT09CisKK0RtLWlvIHByb3ZpZGVzIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgSS9PIHNlcnZpY2VzLiBUaGVyZSBhcmUgdGhyZWUKK3R5cGVzIG9mIEkvTyBzZXJ2aWNlcyBhdmFpbGFibGUsIGFuZCBlYWNoIHR5cGUgaGFzIGEgc3luYyBhbmQgYW4gYXN5bmMKK3ZlcnNpb24uCisKK1RoZSB1c2VyIG11c3Qgc2V0IHVwIGFuIGlvX3JlZ2lvbiBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGRlc2lyZWQgbG9jYXRpb24KK29mIHRoZSBJL08uIEVhY2ggaW9fcmVnaW9uIGluZGljYXRlcyBhIGJsb2NrLWRldmljZSBhbG9uZyB3aXRoIHRoZSBzdGFydGluZworc2VjdG9yIGFuZCBzaXplIG9mIHRoZSByZWdpb24uCisKKyAgIHN0cnVjdCBpb19yZWdpb24geworICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKyAgICAgIHNlY3Rvcl90IHNlY3RvcjsKKyAgICAgIHNlY3Rvcl90IGNvdW50OworICAgfTsKKworRG0taW8gY2FuIHJlYWQgZnJvbSBvbmUgaW9fcmVnaW9uIG9yIHdyaXRlIHRvIG9uZSBvciBtb3JlIGlvX3JlZ2lvbnMuIFdyaXRlcwordG8gbXVsdGlwbGUgcmVnaW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIGFycmF5IG9mIGlvX3JlZ2lvbiBzdHJ1Y3R1cmVzLgorCitUaGUgZmlyc3QgSS9PIHNlcnZpY2UgdHlwZSB0YWtlcyBhIGxpc3Qgb2YgbWVtb3J5IHBhZ2VzIGFzIHRoZSBkYXRhIGJ1ZmZlciBmb3IKK3RoZSBJL08sIGFsb25nIHdpdGggYW4gb2Zmc2V0IGludG8gdGhlIGZpcnN0IHBhZ2UuCisKKyAgIHN0cnVjdCBwYWdlX2xpc3QgeworICAgICAgc3RydWN0IHBhZ2VfbGlzdCAqbmV4dDsKKyAgICAgIHN0cnVjdCBwYWdlICpwYWdlOworICAgfTsKKworICAgaW50IGRtX2lvX3N5bmModW5zaWduZWQgaW50IG51bV9yZWdpb25zLCBzdHJ1Y3QgaW9fcmVnaW9uICp3aGVyZSwgaW50IHJ3LAorICAgICAgICAgICAgICAgICAgc3RydWN0IHBhZ2VfbGlzdCAqcGwsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICplcnJvcl9iaXRzKTsKKyAgIGludCBkbV9pb19hc3luYyh1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHN0cnVjdCBpb19yZWdpb24gKndoZXJlLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhZ2VfbGlzdCAqcGwsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgaW9fbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKKworVGhlIHNlY29uZCBJL08gc2VydmljZSB0eXBlIHRha2VzIGFuIGFycmF5IG9mIGJpbyB2ZWN0b3JzIGFzIHRoZSBkYXRhIGJ1ZmZlcgorZm9yIHRoZSBJL08uIFRoaXMgc2VydmljZSBjYW4gYmUgaGFuZHkgaWYgdGhlIGNhbGxlciBoYXMgYSBwcmUtYXNzZW1ibGVkIGJpbywKK2J1dCB3YW50cyB0byBkaXJlY3QgZGlmZmVyZW50IHBvcnRpb25zIG9mIHRoZSBiaW8gdG8gZGlmZmVyZW50IGRldmljZXMuCisKKyAgIGludCBkbV9pb19zeW5jX2J2ZWModW5zaWduZWQgaW50IG51bV9yZWdpb25zLCBzdHJ1Y3QgaW9fcmVnaW9uICp3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ3LCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqZXJyb3JfYml0cyk7CisgICBpbnQgZG1faW9fYXN5bmNfYnZlYyh1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHN0cnVjdCBpb19yZWdpb24gKndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ3LCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCk7CisKK1RoZSB0aGlyZCBJL08gc2VydmljZSB0eXBlIHRha2VzIGEgcG9pbnRlciB0byBhIHZtYWxsb2MnZCBtZW1vcnkgYnVmZmVyIGFzIHRoZQorZGF0YSBidWZmZXIgZm9yIHRoZSBJL08uIFRoaXMgc2VydmljZSBjYW4gYmUgaGFuZHkgaWYgdGhlIGNhbGxlciBuZWVkcyB0byBkbworSS9PIHRvIGEgbGFyZ2UgcmVnaW9uIGJ1dCBkb2Vzbid0IHdhbnQgdG8gYWxsb2NhdGUgYSBsYXJnZSBudW1iZXIgb2YgaW5kaXZpZHVhbAorbWVtb3J5IHBhZ2VzLgorCisgICBpbnQgZG1faW9fc3luY192bSh1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHN0cnVjdCBpb19yZWdpb24gKndoZXJlLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICplcnJvcl9iaXRzKTsKKyAgIGludCBkbV9pb19hc3luY192bSh1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHN0cnVjdCBpb19yZWdpb24gKndoZXJlLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW9fbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKKworQ2FsbGVycyBvZiB0aGUgYXN5bmNocm9ub3VzIEkvTyBzZXJ2aWNlcyBtdXN0IGluY2x1ZGUgdGhlIG5hbWUgb2YgYSBjb21wbGV0aW9uCitjYWxsYmFjayByb3V0aW5lIGFuZCBhIHBvaW50ZXIgdG8gc29tZSBjb250ZXh0IGRhdGEgZm9yIHRoZSBJL08uCisKKyAgIHR5cGVkZWYgdm9pZCAoKmlvX25vdGlmeV9mbikodW5zaWduZWQgbG9uZyBlcnJvciwgdm9pZCAqY29udGV4dCk7CisKK1RoZSAiZXJyb3IiIHBhcmFtZXRlciBpbiB0aGlzIGNhbGxiYWNrLCBhcyB3ZWxsIGFzIHRoZSAiKmVycm9yIiBwYXJhbWV0ZXIgaW4KK2FsbCBvZiB0aGUgc3luY2hyb25vdXMgdmVyc2lvbnMsIGlzIGEgYml0c2V0IChpbnN0ZWFkIG9mIGEgc2ltcGxlIGVycm9yIHZhbHVlKS4KK0luIHRoZSBjYXNlIG9mIGFuIHdyaXRlLUkvTyB0byBtdWx0aXBsZSByZWdpb25zLCB0aGlzIGJpdHNldCBhbGxvd3MgZG0taW8gdG8KK2luZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvbiBlYWNoIGluZGl2aWR1YWwgcmVnaW9uLgorCitCZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBkbS1pbyBzZXJ2aWNlcywgdGhlIHVzZXIgc2hvdWxkIGNhbGwgZG1faW9fZ2V0KCkKK2FuZCBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgcGFnZXMgdGhleSBleHBlY3QgdG8gcGVyZm9ybSBJL08gb24gY29uY3VycmVudGx5LgorRG0taW8gd2lsbCBhdHRlbXB0IHRvIHJlc2l6ZSBpdHMgbWVtcG9vbCB0byBtYWtlIHN1cmUgZW5vdWdoIHBhZ2VzIGFyZQorYWx3YXlzIGF2YWlsYWJsZSBpbiBvcmRlciB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3YWl0aW5nIHdoaWxlIHBlcmZvcm1pbmcgSS9PLgorCitXaGVuIHRoZSB1c2VyIGlzIGZpbmlzaGVkIHVzaW5nIHRoZSBkbS1pbyBzZXJ2aWNlcywgdGhleSBzaG91bGQgY2FsbAorZG1faW9fcHV0KCkgYW5kIHNwZWNpZnkgdGhlIHNhbWUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBnaXZlbiBvbiB0aGUKK2RtX2lvX2dldCgpIGNhbGwuCisKZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwva2NvcHlkLnR4dCBiL2RvYy9rZXJuZWwva2NvcHlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjAzODJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9rY29weWQudHh0CkBAIC0wLDAgKzEsNDcgQEAKK2tjb3B5ZAorPT09PT09CisKK0tjb3B5ZCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjb3B5IGEgcmFuZ2Ugb2Ygc2VjdG9ycyBmcm9tIG9uZSBibG9jay1kZXZpY2UKK3RvIG9uZSBvciBtb3JlIG90aGVyIGJsb2NrLWRldmljZXMsIHdpdGggYW4gYXN5bmNocm9ub3VzIGNvbXBsZXRpb24KK25vdGlmaWNhdGlvbi4gSXQgaXMgdXNlZCBieSBkbS1zbmFwc2hvdCBhbmQgZG0tbWlycm9yLgorCitVc2VycyBvZiBrY29weWQgbXVzdCBmaXJzdCBjcmVhdGUgYSBjbGllbnQgYW5kIGluZGljYXRlIGhvdyBtYW55IG1lbW9yeSBwYWdlcwordG8gc2V0IGFzaWRlIGZvciB0aGVpciBjb3B5IGpvYnMuIFRoaXMgaXMgZG9uZSB3aXRoIGEgY2FsbCB0bwora2NvcHlkX2NsaWVudF9jcmVhdGUoKS4KKworICAgaW50IGtjb3B5ZF9jbGllbnRfY3JlYXRlKHVuc2lnbmVkIGludCBudW1fcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGtjb3B5ZF9jbGllbnQgKipyZXN1bHQpOworCitUbyBzdGFydCBhIGNvcHkgam9iLCB0aGUgdXNlciBtdXN0IHNldCB1cCBpb19yZWdpb24gc3RydWN0dXJlcyB0byBkZXNjcmliZQordGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb25zIG9mIHRoZSBjb3B5LiBFYWNoIGlvX3JlZ2lvbiBpbmRpY2F0ZXMgYQorYmxvY2stZGV2aWNlIGFsb25nIHdpdGggdGhlIHN0YXJ0aW5nIHNlY3RvciBhbmQgc2l6ZSBvZiB0aGUgcmVnaW9uLiBUaGUgc291cmNlCitvZiB0aGUgY29weSBpcyBnaXZlbiBhcyBvbmUgaW9fcmVnaW9uIHN0cnVjdHVyZSwgYW5kIHRoZSBkZXN0aW5hdGlvbnMgb2YgdGhlCitjb3B5IGFyZSBnaXZlbiBhcyBhbiBhcnJheSBvZiBpb19yZWdpb24gc3RydWN0dXJlcy4KKworICAgc3RydWN0IGlvX3JlZ2lvbiB7CisgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworICAgICAgc2VjdG9yX3Qgc2VjdG9yOworICAgICAgc2VjdG9yX3QgY291bnQ7CisgICB9OworCitUbyBzdGFydCB0aGUgY29weSwgdGhlIHVzZXIgY2FsbHMga2NvcHlkX2NvcHkoKSwgcGFzc2luZyBpbiB0aGUgY2xpZW50Citwb2ludGVyLCBwb2ludGVycyB0byB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBpb19yZWdpb25zLCB0aGUgbmFtZSBvZiBhCitjb21wbGV0aW9uIGNhbGxiYWNrIHJvdXRpbmUsIGFuZCBhIHBvaW50ZXIgdG8gc29tZSBjb250ZXh0IGRhdGEgZm9yIHRoZSBjb3B5LgorCisgICBpbnQga2NvcHlkX2NvcHkoc3RydWN0IGtjb3B5ZF9jbGllbnQgKmtjLCBzdHJ1Y3QgaW9fcmVnaW9uICpmcm9tLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fZGVzdHMsIHN0cnVjdCBpb19yZWdpb24gKmRlc3RzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywga2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCk7CisKKyAgIHR5cGVkZWYgdm9pZCAoKmtjb3B5ZF9ub3RpZnlfZm4pKGludCByZWFkX2VyciwgdW5zaWduZWQgaW50IHdyaXRlX2VyciwKKwkJCQkgICAgdm9pZCAqY29udGV4dCk7CisKK1doZW4gdGhlIGNvcHkgY29tcGxldGVzLCBrY29weWQgd2lsbCBjYWxsIHRoZSB1c2VyJ3MgY29tcGxldGlvbiByb3V0aW5lLAorcGFzc2luZyBiYWNrIHRoZSB1c2VyJ3MgY29udGV4dCBwb2ludGVyLiBJdCB3aWxsIGFsc28gaW5kaWNhdGUgaWYgYSByZWFkIG9yCit3cml0ZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGNvcHkuCisKK1doZW4gYSB1c2VyIGlzIGRvbmUgd2l0aCBhbGwgdGhlaXIgY29weSBqb2JzLCB0aGV5IHNob3VsZCBjYWxsCitrY29weWRfY2xpZW50X2Rlc3Ryb3koKSB0byBkZWxldGUgdGhlIGtjb3B5ZCBjbGllbnQsIHdoaWNoIHdpbGwgcmVsZWFzZSB0aGUKK2Fzc29jaWF0ZWQgbWVtb3J5IHBhZ2VzLgorCisgICB2b2lkIGtjb3B5ZF9jbGllbnRfZGVzdHJveShzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2MpOworCmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL2xpbmVhci50eHQgYi9kb2Mva2VybmVsL2xpbmVhci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzMDdkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvbGluZWFyLnR4dApAQCAtMCwwICsxLDYxIEBACitkbS1saW5lYXIKKz09PT09PT09PQorCitEZXZpY2UtTWFwcGVyJ3MgImxpbmVhciIgdGFyZ2V0IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgdGhlIERldmljZS1NYXBwZXIKK2RldmljZSBvbnRvIGEgbGluZWFyIHJhbmdlIG9mIGFub3RoZXIgZGV2aWNlLiAgVGhpcyBpcyB0aGUgYmFzaWMgYnVpbGRpbmcKK2Jsb2NrIG9mIGxvZ2ljYWwgdm9sdW1lIG1hbmFnZXJzLgorCitQYXJhbWV0ZXJzOiA8ZGV2IHBhdGg+IDxvZmZzZXQ+CisgICAgPGRldiBwYXRoPjogRnVsbCBwYXRobmFtZSB0byB0aGUgdW5kZXJseWluZyBibG9jay1kZXZpY2UsIG9yIGEKKyAgICAgICAgICAgICAgICAibWFqb3I6bWlub3IiIGRldmljZS1udW1iZXIuCisgICAgPG9mZnNldD46IFN0YXJ0aW5nIHNlY3RvciB3aXRoaW4gdGhlIGRldmljZS4KKworCitFeGFtcGxlIHNjcmlwdHMKKz09PT09PT09PT09PT09PQorW1sKKyMhL2Jpbi9zaAorIyBDcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGluZyBmb3IgYSBkZXZpY2UKK2VjaG8gIjAgYGJsb2NrZGV2IC0tZ2V0c2l6ZSAkMWAgbGluZWFyICQxIDAiIHwgZG1zZXR1cCBjcmVhdGUgaWRlbnRpdHkKK11dCisKKworW1sKKyMhL2Jpbi9zaAorIyBKb2luIDIgZGV2aWNlcyB0b2dldGhlcgorc2l6ZTE9YGJsb2NrZGV2IC0tZ2V0c2l6ZSAkMWAKK3NpemUyPWBibG9ja2RldiAtLWdldHNpemUgJDJgCitlY2hvICIwICRzaXplMSBsaW5lYXIgJDEgMAorJHNpemUxICRzaXplMiBsaW5lYXIgJDIgMCIgfCBkbXNldHVwIGNyZWF0ZSBqb2luZWQKK11dCisKKworW1sKKyMhL3Vzci9iaW4vcGVybCAtdworIyBTcGxpdCBhIGRldmljZSBpbnRvIDRNIGNodW5rcyBhbmQgdGhlbiBqb2luIHRoZW0gdG9nZXRoZXIgaW4gcmV2ZXJzZSBvcmRlci4KKworbXkgJG5hbWUgPSAicmV2ZXJzZSI7CitteSAkZXh0ZW50X3NpemUgPSA0ICogMTAyNCAqIDI7CitteSAkZGV2ID0gJEFSR1ZbMF07CitteSAkdGFibGUgPSAiIjsKK215ICRjb3VudCA9IDA7CisKK2lmICghZGVmaW5lZCgkZGV2KSkgeworICAgICAgICBkaWUoIlBsZWFzZSBzcGVjaWZ5IGEgZGV2aWNlLlxuIik7Cit9CisKK215ICRkZXZfc2l6ZSA9IGBibG9ja2RldiAtLWdldHNpemUgJGRldmA7CitteSAkZXh0ZW50cyA9IGludCgkZGV2X3NpemUgLyAkZXh0ZW50X3NpemUpIC0KKyAgICAgICAgICAgICAgKCgkZGV2X3NpemUgJSAkZXh0ZW50X3NpemUpID8gMSA6IDApOworCit3aGlsZSAoJGV4dGVudHMgPiAwKSB7CisgICAgICAgIG15ICR0aGlzX3N0YXJ0ID0gJGNvdW50ICogJGV4dGVudF9zaXplOworICAgICAgICAkZXh0ZW50cy0tOworICAgICAgICAkY291bnQrKzsKKyAgICAgICAgbXkgJHRoaXNfb2Zmc2V0ID0gJGV4dGVudHMgKiAkZXh0ZW50X3NpemU7CisKKyAgICAgICAgJHRhYmxlIC49ICIkdGhpc19zdGFydCAkZXh0ZW50X3NpemUgbGluZWFyICRkZXYgJHRoaXNfb2Zmc2V0XG4iOworfQorCitgZWNobyBcIiR0YWJsZVwiIHwgZG1zZXR1cCBjcmVhdGUgJG5hbWVgOworXV0KZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvbG9nLXdyaXRlcy50eHQgYi9kb2Mva2VybmVsL2xvZy13cml0ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL2xvZy13cml0ZXMudHh0CkBAIC0wLDAgKzEsMTQwIEBACitkbS1sb2ctd3JpdGVzCis9PT09PT09PT09PT09CisKK1RoaXMgdGFyZ2V0IHRha2VzIDIgZGV2aWNlcywgb25lIHRvIHBhc3MgYWxsIElPIHRvIG5vcm1hbGx5LCBhbmQgb25lIHRvIGxvZyBhbGwKK29mIHRoZSB3cml0ZSBvcGVyYXRpb25zIHRvLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgZmlsZSBzeXN0ZW0gZGV2ZWxvcGVycyB3aXNoaW5nCit0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiBtZXRhZGF0YSBvciBkYXRhIGFzIHRoZSBmaWxlIHN5c3RlbSBpcyB3cml0dGVuIHRvLgorVGhlcmUgaXMgYSBsb2dfd3JpdGVfZW50cnkgd3JpdHRlbiBmb3IgZXZlcnkgV1JJVEUgcmVxdWVzdCBhbmQgdGhlIHRhcmdldCBpcworYWJsZSB0byB0YWtlIGFyYml0cmFyeSBkYXRhIGZyb20gdXNlcnNwYWNlIHRvIGluc2VydCBpbnRvIHRoZSBsb2cuICBUaGUgZGF0YQordGhhdCBpcyBpbiB0aGUgV1JJVEUgcmVxdWVzdHMgaXMgY29waWVkIGludG8gdGhlIGxvZyB0byBtYWtlIHRoZSByZXBsYXkgaGFwcGVuCitleGFjdGx5IGFzIGl0IGhhcHBlbmVkIG9yaWdpbmFsbHkuCisKK0xvZyBPcmRlcmluZworPT09PT09PT09PT09CisKK1dlIGxvZyB0aGluZ3MgaW4gb3JkZXIgb2YgY29tcGxldGlvbiBvbmNlIHdlIGFyZSBzdXJlIHRoZSB3cml0ZSBpcyBubyBsb25nZXIgaW4KK2NhY2hlLiAgVGhpcyBtZWFucyB0aGF0IG5vcm1hbCBXUklURSByZXF1ZXN0cyBhcmUgbm90IGFjdHVhbGx5IGxvZ2dlZCB1bnRpbCB0aGUKK25leHQgUkVRX0ZMVVNIIHJlcXVlc3QuICBUaGlzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB1c2Vyc3BhY2UgdG8gcmVwbGF5IHRoZQorbG9nIGluIGEgd2F5IHRoYXQgY29ycmVsYXRlcyB0byB3aGF0IGlzIG9uIGRpc2sgYW5kIG5vdCB3aGF0IGlzIGluIGNhY2hlLCB0bworbWFrZSBpdCBlYXNpZXIgdG8gZGV0ZWN0IGltcHJvcGVyIHdhaXRpbmcvZmx1c2hpbmcuCisKK1RoaXMgd29ya3MgYnkgYXR0YWNoaW5nIGFsbCBXUklURSByZXF1ZXN0cyB0byBhIGxpc3Qgb25jZSB0aGUgd3JpdGUgY29tcGxldGVzLgorT25jZSB3ZSBzZWUgYSBSRVFfRkxVU0ggcmVxdWVzdCB3ZSBzcGxpY2UgdGhpcyBsaXN0IG9udG8gdGhlIHJlcXVlc3QgYW5kIG9uY2UKK3RoZSBGTFVTSCByZXF1ZXN0IGNvbXBsZXRlcyB3ZSBsb2cgYWxsIG9mIHRoZSBXUklURXMgYW5kIHRoZW4gdGhlIEZMVVNILiAgT25seQorY29tcGxldGVkIFdSSVRFcywgYXQgdGhlIHRpbWUgdGhlIFJFUV9GTFVTSCBpcyBpc3N1ZWQsIGFyZSBhZGRlZCBpbiBvcmRlciB0bworc2ltdWxhdGUgdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8gd2l0aCByZWdhcmQgdG8gcG93ZXIgZmFpbHVyZXMuICBDb25zaWRlciB0aGUKK2ZvbGxvd2luZyBleGFtcGxlIChXIG1lYW5zIHdyaXRlLCBDIG1lYW5zIGNvbXBsZXRlKToKKworVzEsVzIsVzMsQzMsQzIsV2ZsdXNoLEMxLENmbHVzaAorCitUaGUgbG9nIHdvdWxkIHNob3cgdGhlIGZvbGxvd2luZworCitXMyxXMixmbHVzaCxXMS4uLi4KKworQWdhaW4gdGhpcyBpcyB0byBzaW11bGF0ZSB3aGF0IGlzIGFjdHVhbGx5IG9uIGRpc2ssIHRoaXMgYWxsb3dzIHVzIHRvIGRldGVjdAorY2FzZXMgd2hlcmUgYSBwb3dlciBmYWlsdXJlIGF0IGEgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIHdvdWxkIGNyZWF0ZSBhbgoraW5jb25zaXN0ZW50IGZpbGUgc3lzdGVtLgorCitBbnkgUkVRX0ZVQSByZXF1ZXN0cyBieXBhc3MgdGhpcyBmbHVzaGluZyBtZWNoYW5pc20gYW5kIGFyZSBsb2dnZWQgYXMgc29vbiBhcwordGhleSBjb21wbGV0ZSBhcyB0aG9zZSByZXF1ZXN0cyB3aWxsIG9idmlvdXNseSBieXBhc3MgdGhlIGRldmljZSBjYWNoZS4KKworQW55IFJFUV9ESVNDQVJEIHJlcXVlc3RzIGFyZSB0cmVhdGVkIGxpa2UgV1JJVEUgcmVxdWVzdHMuICBPdGhlcndpc2Ugd2Ugd291bGQKK2hhdmUgYWxsIHRoZSBESVNDQVJEIHJlcXVlc3RzLCBhbmQgdGhlbiB0aGUgV1JJVEUgcmVxdWVzdHMgYW5kIHRoZW4gdGhlIEZMVVNICityZXF1ZXN0LiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCitXUklURSBibG9jayAxLCBESVNDQVJEIGJsb2NrIDEsIEZMVVNICisKK0lmIHdlIGxvZ2dlZCBESVNDQVJEIHdoZW4gaXQgY29tcGxldGVkLCB0aGUgcmVwbGF5IHdvdWxkIGxvb2sgbGlrZSB0aGlzCisKK0RJU0NBUkQgMSwgV1JJVEUgMSwgRkxVU0gKKword2hpY2ggaXNuJ3QgcXVpdGUgd2hhdCBoYXBwZW5lZCBhbmQgd291bGRuJ3QgYmUgY2F1Z2h0IGR1cmluZyB0aGUgbG9nIHJlcGxheS4KKworVGFyZ2V0IGludGVyZmFjZQorPT09PT09PT09PT09PT09PQorCitpKSBDb25zdHJ1Y3RvcgorCisgICBsb2ctd3JpdGVzIDxkZXZfcGF0aD4gPGxvZ19kZXZfcGF0aD4KKworICAgZGV2X3BhdGgJOiBEZXZpY2UgdGhhdCBhbGwgb2YgdGhlIElPIHdpbGwgZ28gdG8gbm9ybWFsbHkuCisgICBsb2dfZGV2X3BhdGggOiBEZXZpY2Ugd2hlcmUgdGhlIGxvZyBlbnRyaWVzIGFyZSB3cml0dGVuIHRvLgorCitpaSkgU3RhdHVzCisKKyAgICA8I2xvZ2dlZCBlbnRyaWVzPiA8aGlnaGVzdCBhbGxvY2F0ZWQgc2VjdG9yPgorCisgICAgI2xvZ2dlZCBlbnRyaWVzCSAgICAgICA6IE51bWJlciBvZiBsb2dnZWQgZW50cmllcworICAgIGhpZ2hlc3QgYWxsb2NhdGVkIHNlY3RvciAgIDogSGlnaGVzdCBhbGxvY2F0ZWQgc2VjdG9yCisKK2lpaSkgTWVzc2FnZXMKKworICAgIG1hcmsgPGRlc2NyaXB0aW9uPgorCisJWW91IGNhbiB1c2UgYSBkbXNldHVwIG1lc3NhZ2UgdG8gc2V0IGFuIGFyYml0cmFyeSBtYXJrIGluIGEgbG9nLgorCUZvciBleGFtcGxlIHNheSB5b3Ugd2FudCB0byBmc2NrIGEgZmlsZSBzeXN0ZW0gYWZ0ZXIgZXZlcnkKKwl3cml0ZSwgYnV0IGZpcnN0IHlvdSBuZWVkIHRvIHJlcGxheSB1cCB0byB0aGUgbWtmcyB0byBtYWtlIHN1cmUKKwl3ZSdyZSBmc2NrJ2luZyBzb21ldGhpbmcgcmVhc29uYWJsZSwgeW91IHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlCisJdGhpczoKKworCSAgbWtmcy5idHJmcyAtZiAvZGV2L21hcHBlci9sb2cKKwkgIGRtc2V0dXAgbWVzc2FnZSBsb2cgMCBtYXJrIG1rZnMKKwkgIDxydW4gdGVzdD4KKworCSAgVGhpcyB3b3VsZCBhbGxvdyB5b3UgdG8gcmVwbGF5IHRoZSBsb2cgdXAgdG8gdGhlIG1rZnMgbWFyayBhbmQKKwkgIHRoZW4gcmVwbGF5IGZyb20gdGhhdCBwb2ludCBvbiBkb2luZyB0aGUgZnNjayBjaGVjayBpbiB0aGUKKwkgIGludGVydmFsIHRoYXQgeW91IHdhbnQuCisKKwlFdmVyeSBsb2cgaGFzIGEgbWFyayBhdCB0aGUgZW5kIGxhYmVsZWQgImRtLWxvZy13cml0ZXMtZW5kIi4KKworVXNlcnNwYWNlIGNvbXBvbmVudAorPT09PT09PT09PT09PT09PT09PQorCitUaGVyZSBpcyBhIHVzZXJzcGFjZSB0b29sIHRoYXQgd2lsbCByZXBsYXkgdGhlIGxvZyBmb3IgeW91IGluIHZhcmlvdXMgd2F5cy4KK0l0IGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vam9zZWZiYWNpay9sb2ctd3JpdGVzCisKK0V4YW1wbGUgdXNhZ2UKKz09PT09PT09PT09PT0KKworU2F5IHlvdSB3YW50IHRvIHRlc3QgZnN5bmMgb24geW91ciBmaWxlIHN5c3RlbS4gIFlvdSB3b3VsZCBkbyBzb21ldGhpbmcgbGlrZQordGhpczoKKworVEFCTEU9IjAgJChibG9ja2RldiAtLWdldHN6IC9kZXYvc2RiKSBsb2ctd3JpdGVzIC9kZXYvc2RiIC9kZXYvc2RjIgorZG1zZXR1cCBjcmVhdGUgbG9nIC0tdGFibGUgIiRUQUJMRSIKK21rZnMuYnRyZnMgLWYgL2Rldi9tYXBwZXIvbG9nCitkbXNldHVwIG1lc3NhZ2UgbG9nIDAgbWFyayBta2ZzCisKK21vdW50IC9kZXYvbWFwcGVyL2xvZyAvbW50L2J0cmZzLXRlc3QKKzxzb21lIHRlc3QgdGhhdCBkb2VzIGZzeW5jIGF0IHRoZSBlbmQ+CitkbXNldHVwIG1lc3NhZ2UgbG9nIDAgbWFyayBmc3luYworbWQ1c3VtIC9tbnQvYnRyZnMtdGVzdC9mb28KK3Vtb3VudCAvbW50L2J0cmZzLXRlc3QKKworZG1zZXR1cCByZW1vdmUgbG9nCityZXBsYXktbG9nIC0tbG9nIC9kZXYvc2RjIC0tcmVwbGF5IC9kZXYvc2RiIC0tZW5kLW1hcmsgZnN5bmMKK21vdW50IC9kZXYvc2RiIC9tbnQvYnRyZnMtdGVzdAorbWQ1c3VtIC9tbnQvYnRyZnMtdGVzdC9mb28KKzx2ZXJpZnkgbWQ1c3VtJ3MgYXJlIGNvcnJlY3Q+CisKK0Fub3RoZXIgb3B0aW9uIGlzIHRvIGRvIGEgY29tcGxpY2F0ZWQgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uIGFuZCB2ZXJpZnkgdGhlIGZpbGUKK3N5c3RlbSBpcyBjb25zaXN0ZW50IGR1cmluZyB0aGUgZW50aXJlIG9wZXJhdGlvbi4gIFlvdSBjb3VsZCBkbyB0aGlzIHdpdGg6CisKK1RBQkxFPSIwICQoYmxvY2tkZXYgLS1nZXRzeiAvZGV2L3NkYikgbG9nLXdyaXRlcyAvZGV2L3NkYiAvZGV2L3NkYyIKK2Rtc2V0dXAgY3JlYXRlIGxvZyAtLXRhYmxlICIkVEFCTEUiCitta2ZzLmJ0cmZzIC1mIC9kZXYvbWFwcGVyL2xvZworZG1zZXR1cCBtZXNzYWdlIGxvZyAwIG1hcmsgbWtmcworCittb3VudCAvZGV2L21hcHBlci9sb2cgL21udC9idHJmcy10ZXN0Cis8ZnNzdHJlc3MgdG8gZGlydHkgdGhlIGZzPgorYnRyZnMgZmlsZXN5c3RlbSBiYWxhbmNlIC9tbnQvYnRyZnMtdGVzdAordW1vdW50IC9tbnQvYnRyZnMtdGVzdAorZG1zZXR1cCByZW1vdmUgbG9nCisKK3JlcGxheS1sb2cgLS1sb2cgL2Rldi9zZGMgLS1yZXBsYXkgL2Rldi9zZGIgLS1lbmQtbWFyayBta2ZzCitidHJmc2NrIC9kZXYvc2RiCityZXBsYXktbG9nIC0tbG9nIC9kZXYvc2RjIC0tcmVwbGF5IC9kZXYvc2RiIC0tc3RhcnQtbWFyayBta2ZzIFwKKwktLWZzY2sgImJ0cmZzY2sgL2Rldi9zZGIiIC0tY2hlY2sgZnVhCisKK0FuZCB0aGF0IHdpbGwgcmVwbGF5IHRoZSBsb2cgdW50aWwgaXQgc2VlcyBhIEZVQSByZXF1ZXN0LCBydW4gdGhlIGZzY2sgY29tbWFuZAorYW5kIGlmIHRoZSBmc2NrIHBhc3NlcyBpdCB3aWxsIHJlcGxheSB0byB0aGUgbmV4dCBGVUEsIHVudGlsIGl0IGlzIGNvbXBsZXRlZCBvcgordGhlIGZzY2sgY29tbWFuZCBleGlzdHMgYWJub3JtYWxseS4KZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvbG9nLnR4dCBiL2RvYy9rZXJuZWwvbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU1YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9sb2cudHh0CkBAIC0wLDAgKzEsNTQgQEAKK0RldmljZS1NYXBwZXIgTG9nZ2luZworPT09PT09PT09PT09PT09PT09PT09CitUaGUgZGV2aWNlLW1hcHBlciBsb2dnaW5nIGNvZGUgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBkZXZpY2UtbWFwcGVyCitSQUlEIHRhcmdldHMgdG8gdHJhY2sgcmVnaW9ucyBvZiB0aGUgZGlzayB0aGF0IGFyZSBub3QgY29uc2lzdGVudC4KK0EgcmVnaW9uIChvciBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzIHNwYWNlKSBvZiB0aGUgZGlzayBtYXkgYmUKK2luY29uc2lzdGVudCBiZWNhdXNlIGEgUkFJRCBzdHJpcGUgaXMgY3VycmVudGx5IGJlaW5nIG9wZXJhdGVkIG9uIG9yCithIG1hY2hpbmUgZGllZCB3aGlsZSB0aGUgcmVnaW9uIHdhcyBiZWluZyBhbHRlcmVkLiAgSW4gdGhlIGNhc2Ugb2YKK21pcnJvcnMsIGEgcmVnaW9uIHdvdWxkIGJlIGNvbnNpZGVyZWQgZGlydHkvaW5jb25zaXN0ZW50IHdoaWxlIHlvdQorYXJlIHdyaXRpbmcgdG8gaXQgYmVjYXVzZSB0aGUgd3JpdGVzIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBmb3IgYWxsCit0aGUgbGVncyBvZiB0aGUgbWlycm9yIGFuZCBtYXkgbm90IHJlYWNoIHRoZSBsZWdzIGF0IHRoZSBzYW1lIHRpbWUuCitPbmNlIGFsbCB3cml0ZXMgYXJlIGNvbXBsZXRlLCB0aGUgcmVnaW9uIGlzIGNvbnNpZGVyZWQgY2xlYW4gYWdhaW4uCisKK1RoZXJlIGlzIGEgZ2VuZXJpYyBsb2dnaW5nIGludGVyZmFjZSB0aGF0IHRoZSBkZXZpY2UtbWFwcGVyIFJBSUQKK2ltcGxlbWVudGF0aW9ucyB1c2UgdG8gcGVyZm9ybSBsb2dnaW5nIG9wZXJhdGlvbnMgKHNlZQorZG1fZGlydHlfbG9nX3R5cGUgaW4gaW5jbHVkZS9saW51eC9kbS1kaXJ0eS1sb2cuaCkuICBWYXJpb3VzIGRpZmZlcmVudAorbG9nZ2luZyBpbXBsZW1lbnRhdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgcHJvdmlkZSBkaWZmZXJlbnQKK2NhcGFiaWxpdGllcy4gIFRoZSBsaXN0IGluY2x1ZGVzOgorCitUeXBlCQlGaWxlcworPT09PQkJPT09PT0KK2Rpc2sJCWRyaXZlcnMvbWQvZG0tbG9nLmMKK2NvcmUJCWRyaXZlcnMvbWQvZG0tbG9nLmMKK3VzZXJzcGFjZQlkcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UqIGluY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCisKK1RoZSAiZGlzayIgbG9nIHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgbG9nIGltcGxlbWVudGF0aW9uIGNvbW1pdHMgdGhlIGxvZyBzdGF0ZSB0byBkaXNrLiAgVGhpcyB3YXksIHRoZQorbG9nZ2luZyBzdGF0ZSBzdXJ2aXZlcyByZWJvb3RzL2NyYXNoZXMuCisKK1RoZSAiY29yZSIgbG9nIHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgbG9nIGltcGxlbWVudGF0aW9uIGtlZXBzIHRoZSBsb2cgc3RhdGUgaW4gbWVtb3J5LiAgVGhlIGxvZyBzdGF0ZQord2lsbCBub3Qgc3Vydml2ZSBhIHJlYm9vdCBvciBjcmFzaCwgYnV0IHRoZXJlIG1heSBiZSBhIHNtYWxsIGJvb3N0IGluCitwZXJmb3JtYW5jZS4gIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgaWYgbm8gc3RvcmFnZSBkZXZpY2UgaXMKK2F2YWlsYWJsZSBmb3Igc3RvcmluZyBsb2cgc3RhdGUuCisKK1RoZSAidXNlcnNwYWNlIiBsb2cgdHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGxvZyB0eXBlIHNpbXBseSBwcm92aWRlcyBhIHdheSB0byBleHBvcnQgdGhlIGxvZyBBUEkgdG8gdXNlcnNwYWNlLAorc28gbG9nIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgZG9uZSB0aGVyZS4gIFRoaXMgaXMgZG9uZSBieSBmb3J3YXJkaW5nIG1vc3QKK2xvZ2dpbmcgcmVxdWVzdHMgdG8gdXNlcnNwYWNlLCB3aGVyZSBhIGRhZW1vbiByZWNlaXZlcyBhbmQgcHJvY2Vzc2VzIHRoZQorcmVxdWVzdC4KKworVGhlIHN0cnVjdHVyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4ga2VybmVsIGFuZCB1c2Vyc3BhY2UgYXJlCitsb2NhdGVkIGluIGluY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oLiAgRHVlIHRvIHRoZSBmcmVxdWVuY3ksCitkaXZlcnNpdHksIGFuZCAyLXdheSBjb21tdW5pY2F0aW9uIG5hdHVyZSBvZiB0aGUgZXhjaGFuZ2VzIGJldHdlZW4KK2tlcm5lbCBhbmQgdXNlcnNwYWNlLCAnY29ubmVjdG9yJyBpcyB1c2VkIGFzIHRoZSBpbnRlcmZhY2UgZm9yCitjb21tdW5pY2F0aW9uLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHR3byB1c2Vyc3BhY2UgbG9nIGltcGxlbWVudGF0aW9ucyB0aGF0IGxldmVyYWdlIHRoaXMKK2ZyYW1ld29yayAtICJjbHVzdGVyZWQtZGlzayIgYW5kICJjbHVzdGVyZWQtY29yZSIuICBUaGVzZSBpbXBsZW1lbnRhdGlvbnMKK3Byb3ZpZGUgYSBjbHVzdGVyLWNvaGVyZW50IGxvZyBmb3Igc2hhcmVkLXN0b3JhZ2UuICBEZXZpY2UtbWFwcGVyIG1pcnJvcmluZworY2FuIGJlIHVzZWQgaW4gYSBzaGFyZWQtc3RvcmFnZSBlbnZpcm9ubWVudCB3aGVuIHRoZSBjbHVzdGVyIGxvZyBpbXBsZW1lbnRhdGlvbnMKK2FyZSBlbXBsb3llZC4KZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvcGVyc2lzdGVudC1kYXRhLnR4dCBiL2RvYy9rZXJuZWwvcGVyc2lzdGVudC1kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzMzYmNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9wZXJzaXN0ZW50LWRhdGEudHh0CkBAIC0wLDAgKzEsODQgQEAKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RoZSBtb3JlLXNvcGhpc3RpY2F0ZWQgZGV2aWNlLW1hcHBlciB0YXJnZXRzIHJlcXVpcmUgY29tcGxleCBtZXRhZGF0YQordGhhdCBpcyBtYW5hZ2VkIGluIGtlcm5lbC4gIEluIGxhdGUgMjAxMCB3ZSB3ZXJlIHNlZWluZyB0aGF0IHZhcmlvdXMKK2RpZmZlcmVudCB0YXJnZXRzIHdlcmUgcm9sbGluZyB0aGVpciBvd24gZGF0YSBzdHJ1Y3R1cmVzLCBmb3IgZXhhbXBsZToKKworLSBNaWt1bGFzIFBhdG9ja2EncyBtdWx0aXNuYXAgaW1wbGVtZW50YXRpb24KKy0gSGVpbnogTWF1ZWxzaGFnZW4ncyB0aGluIHByb3Zpc2lvbmluZyB0YXJnZXQKKy0gQW5vdGhlciBidHJlZS1iYXNlZCBjYWNoaW5nIHRhcmdldCBwb3N0ZWQgdG8gZG0tZGV2ZWwKKy0gQW5vdGhlciBtdWx0aS1zbmFwc2hvdCB0YXJnZXQgYmFzZWQgb24gYSBkZXNpZ24gb2YgRGFuaWVsIFBoaWxsaXBzCisKK01haW50YWluaW5nIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB0YWtlcyBhIGxvdCBvZiB3b3JrLCBzbyBpZiBwb3NzaWJsZQord2UnZCBsaWtlIHRvIHJlZHVjZSB0aGUgbnVtYmVyLgorCitUaGUgcGVyc2lzdGVudC1kYXRhIGxpYnJhcnkgaXMgYW4gYXR0ZW1wdCB0byBwcm92aWRlIGEgcmUtdXNhYmxlCitmcmFtZXdvcmsgZm9yIHBlb3BsZSB3aG8gd2FudCB0byBzdG9yZSBtZXRhZGF0YSBpbiBkZXZpY2UtbWFwcGVyCit0YXJnZXRzLiAgSXQncyBjdXJyZW50bHkgdXNlZCBieSB0aGUgdGhpbi1wcm92aXNpb25pbmcgdGFyZ2V0IGFuZCBhbgordXBjb21pbmcgaGllcmFyY2hpY2FsIHN0b3JhZ2UgdGFyZ2V0LgorCitPdmVydmlldworPT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiB0aGUgaGVhZGVyIGZpbGVzIHdoaWNoIGNhbiBhbGwgYmUgZm91bmQKK3VuZGVyIGRyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhLgorCitUaGUgYmxvY2sgbWFuYWdlcgorLS0tLS0tLS0tLS0tLS0tLS0KKworZG0tYmxvY2stbWFuYWdlci5baGNdCisKK1RoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIG9uIGRpc2sgaW4gZml4ZWQgc2l6ZWQtYmxvY2tzLiAgVGhlcmUKK2lzIGEgcmVhZC93cml0ZSBsb2NraW5nIGludGVyZmFjZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzZXMsIGFuZAora2VlcCBkYXRhIHRoYXQgaXMgYmVpbmcgdXNlZCBpbiB0aGUgY2FjaGUuCisKK0NsaWVudHMgb2YgcGVyc2lzdGVudC1kYXRhIGFyZSB1bmxpa2VseSB0byB1c2UgdGhpcyBkaXJlY3RseS4KKworVGhlIHRyYW5zYWN0aW9uIG1hbmFnZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RtLXRyYW5zYWN0aW9uLW1hbmFnZXIuW2hjXQorCitUaGlzIHJlc3RyaWN0cyBhY2Nlc3MgdG8gYmxvY2tzIGFuZCBlbmZvcmNlcyBjb3B5LW9uLXdyaXRlIHNlbWFudGljcy4KK1RoZSBvbmx5IHdheSB5b3UgY2FuIGdldCBob2xkIG9mIGEgd3JpdGFibGUgYmxvY2sgdGhyb3VnaCB0aGUKK3RyYW5zYWN0aW9uIG1hbmFnZXIgaXMgYnkgc2hhZG93aW5nIGFuIGV4aXN0aW5nIGJsb2NrIChpZS4gZG9pbmcKK2NvcHktb24td3JpdGUpIG9yIGFsbG9jYXRpbmcgYSBmcmVzaCBvbmUuICBTaGFkb3dpbmcgaXMgZWxpZGVkIHdpdGhpbgordGhlIHNhbWUgdHJhbnNhY3Rpb24gc28gcGVyZm9ybWFuY2UgaXMgcmVhc29uYWJsZS4gIFRoZSBjb21taXQgbWV0aG9kCitlbnN1cmVzIHRoYXQgYWxsIGRhdGEgaXMgZmx1c2hlZCBiZWZvcmUgaXQgd3JpdGVzIHRoZSBzdXBlcmJsb2NrLgorT24gcG93ZXIgZmFpbHVyZSB5b3VyIG1ldGFkYXRhIHdpbGwgYmUgYXMgaXQgd2FzIHdoZW4gbGFzdCBjb21taXR0ZWQuCisKK1RoZSBTcGFjZSBNYXBzCistLS0tLS0tLS0tLS0tLQorCitkbS1zcGFjZS1tYXAuaAorZG0tc3BhY2UtbWFwLW1ldGFkYXRhLltoY10KK2RtLXNwYWNlLW1hcC1kaXNrLltoY10KKworT24tZGlzayBkYXRhIHN0cnVjdHVyZXMgdGhhdCBrZWVwIHRyYWNrIG9mIHJlZmVyZW5jZSBjb3VudHMgb2YgYmxvY2tzLgorQWxzbyBhY3RzIGFzIHRoZSBhbGxvY2F0b3Igb2YgbmV3IGJsb2Nrcy4gIEN1cnJlbnRseSB0d28KK2ltcGxlbWVudGF0aW9uczogYSBzaW1wbGVyIG9uZSBmb3IgbWFuYWdpbmcgYmxvY2tzIG9uIGEgZGlmZmVyZW50CitkZXZpY2UgKGVnLiB0aGlubHktcHJvdmlzaW9uZWQgZGF0YSBibG9ja3MpOyBhbmQgb25lIGZvciBtYW5hZ2luZwordGhlIG1ldGFkYXRhIHNwYWNlLiAgVGhlIGxhdHRlciBpcyBjb21wbGljYXRlZCBieSB0aGUgbmVlZCB0byBzdG9yZQoraXRzIG93biBkYXRhIHdpdGhpbiB0aGUgc3BhY2UgaXQncyBtYW5hZ2luZy4KKworVGhlIGRhdGEgc3RydWN0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkbS1idHJlZS5baGNdCitkbS1idHJlZS1yZW1vdmUuYworZG0tYnRyZWUtc3BpbmUuYworZG0tYnRyZWUtaW50ZXJuYWwuaAorCitDdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgZGF0YSBzdHJ1Y3R1cmUsIGEgaGllcmFyY2hpY2FsIGJ0cmVlLgorVGhlcmUgYXJlIHBsYW5zIHRvIGFkZCBtb3JlLiAgRm9yIGV4YW1wbGUsIHNvbWV0aGluZyB3aXRoIGFuCithcnJheS1saWtlIGludGVyZmFjZSB3b3VsZCBzZWUgYSBsb3Qgb2YgdXNlLgorCitUaGUgYnRyZWUgaXMgJ2hpZXJhcmNoaWNhbCcgaW4gdGhhdCB5b3UgY2FuIGRlZmluZSBpdCB0byBiZSBjb21wb3NlZAorb2YgbmVzdGVkIGJ0cmVlcywgYW5kIHRha2UgbXVsdGlwbGUga2V5cy4gIEZvciBleGFtcGxlLCB0aGUKK3RoaW4tcHJvdmlzaW9uaW5nIHRhcmdldCB1c2VzIGEgYnRyZWUgd2l0aCB0d28gbGV2ZWxzIG9mIG5lc3RpbmcuCitUaGUgZmlyc3QgbWFwcyBhIGRldmljZSBpZCB0byBhIG1hcHBpbmcgdHJlZSwgYW5kIHRoYXQgaW4gdHVybiBtYXBzIGEKK3ZpcnR1YWwgYmxvY2sgdG8gYSBwaHlzaWNhbCBibG9jay4KKworVmFsdWVzIHN0b3JlZCBpbiB0aGUgYnRyZWVzIGNhbiBoYXZlIGFyYml0cmFyeSBzaXplLiAgS2V5cyBhcmUgYWx3YXlzCis2NGJpdHMsIGFsdGhvdWdoIG5lc3RpbmcgYWxsb3dzIHlvdSB0byB1c2UgbXVsdGlwbGUga2V5cy4KZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvcXVldWUtbGVuZ3RoLnR4dCBiL2RvYy9rZXJuZWwvcXVldWUtbGVuZ3RoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRiMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9xdWV1ZS1sZW5ndGgudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2RtLXF1ZXVlLWxlbmd0aAorPT09PT09PT09PT09PT09CisKK2RtLXF1ZXVlLWxlbmd0aCBpcyBhIHBhdGggc2VsZWN0b3IgbW9kdWxlIGZvciBkZXZpY2UtbWFwcGVyIHRhcmdldHMsCit3aGljaCBzZWxlY3RzIGEgcGF0aCB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2YgaW4tZmxpZ2h0IEkvT3MuCitUaGUgcGF0aCBzZWxlY3RvciBuYW1lIGlzICdxdWV1ZS1sZW5ndGgnLgorCitUYWJsZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHBhdGg6IFs8cmVwZWF0X2NvdW50Pl0KKwk8cmVwZWF0X2NvdW50PjogVGhlIG51bWJlciBvZiBJL09zIHRvIGRpc3BhdGNoIHVzaW5nIHRoZSBzZWxlY3RlZAorCQkJcGF0aCBiZWZvcmUgc3dpdGNoaW5nIHRvIHRoZSBuZXh0IHBhdGguCisJCQlJZiBub3QgZ2l2ZW4sIGludGVybmFsIGRlZmF1bHQgaXMgdXNlZC4gVG8gY2hlY2sKKwkJCXRoZSBkZWZhdWx0IHZhbHVlLCBzZWUgdGhlIGFjdGl2YXRlZCB0YWJsZS4KKworU3RhdHVzIGZvciBlYWNoIHBhdGg6IDxzdGF0dXM+IDxmYWlsLWNvdW50PiA8aW4tZmxpZ2h0PgorCTxzdGF0dXM+OiAnQScgaWYgdGhlIHBhdGggaXMgYWN0aXZlLCAnRicgaWYgdGhlIHBhdGggaXMgZmFpbGVkLgorCTxmYWlsLWNvdW50PjogVGhlIG51bWJlciBvZiBwYXRoIGZhaWx1cmVzLgorCTxpbi1mbGlnaHQ+OiBUaGUgbnVtYmVyIG9mIGluLWZsaWdodCBJL09zIG9uIHRoZSBwYXRoLgorCisKK0FsZ29yaXRobQorPT09PT09PT09CisKK2RtLXF1ZXVlLWxlbmd0aCBpbmNyZW1lbnRzL2RlY3JlbWVudHMgJ2luLWZsaWdodCcgd2hlbiBhbiBJL08gaXMKK2Rpc3BhdGNoZWQvY29tcGxldGVkIHJlc3BlY3RpdmVseS4KK2RtLXF1ZXVlLWxlbmd0aCBzZWxlY3RzIGEgcGF0aCB3aXRoIHRoZSBtaW5pbXVtICdpbi1mbGlnaHQnLgorCisKK0V4YW1wbGVzCis9PT09PT09PQorSW4gY2FzZSB0aGF0IDIgcGF0aHMgKHNkYSBhbmQgc2RiKSBhcmUgdXNlZCB3aXRoIHJlcGVhdF9jb3VudCA9PSAxMjguCisKKyMgZWNobyAiMCAxMCBtdWx0aXBhdGggMCAwIDEgMSBxdWV1ZS1sZW5ndGggMCAyIDEgODowIDEyOCA4OjE2IDEyOCIgXAorICBkbXNldHVwIGNyZWF0ZSB0ZXN0CisjCisjIGRtc2V0dXAgdGFibGUKK3Rlc3Q6IDAgMTAgbXVsdGlwYXRoIDAgMCAxIDEgcXVldWUtbGVuZ3RoIDAgMiAxIDg6MCAxMjggODoxNiAxMjgKKyMKKyMgZG1zZXR1cCBzdGF0dXMKK3Rlc3Q6IDAgMTAgbXVsdGlwYXRoIDIgMCAwIDAgMSAxIEUgMCAyIDEgODowIEEgMCAwIDg6MTYgQSAwIDAKZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvcmFpZC50eHQgYi9kb2Mva2VybmVsL3JhaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmQ2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL3JhaWQudHh0CkBAIC0wLDAgKzEsMjU5IEBACitkbS1yYWlkCis9PT09PT09CisKK1RoZSBkZXZpY2UtbWFwcGVyIFJBSUQgKGRtLXJhaWQpIHRhcmdldCBwcm92aWRlcyBhIGJyaWRnZSBmcm9tIERNIHRvIE1ELgorSXQgYWxsb3dzIHRoZSBNRCBSQUlEIGRyaXZlcnMgdG8gYmUgYWNjZXNzZWQgdXNpbmcgYSBkZXZpY2UtbWFwcGVyCitpbnRlcmZhY2UuCisKKworTWFwcGluZyBUYWJsZSBJbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgdGFyZ2V0IGlzIG5hbWVkICJyYWlkIiBhbmQgaXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKyAgPHJhaWRfdHlwZT4gPCNyYWlkX3BhcmFtcz4gPHJhaWRfcGFyYW1zPiBcCisgICAgPCNyYWlkX2RldnM+IDxtZXRhZGF0YV9kZXYwPiA8ZGV2MD4gWy4uIDxtZXRhZGF0YV9kZXZOPiA8ZGV2Tj5dCisKKzxyYWlkX3R5cGU+OgorICByYWlkMQkJUkFJRDEgbWlycm9yaW5nCisgIHJhaWQ0CQlSQUlENCBkZWRpY2F0ZWQgcGFyaXR5IGRpc2sKKyAgcmFpZDVfbGEJUkFJRDUgbGVmdCBhc3ltbWV0cmljCisJCS0gcm90YXRpbmcgcGFyaXR5IDAgd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgorICByYWlkNV9yYQlSQUlENSByaWdodCBhc3ltbWV0cmljCisJCS0gcm90YXRpbmcgcGFyaXR5IE4gd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgorICByYWlkNV9scwlSQUlENSBsZWZ0IHN5bW1ldHJpYworCQktIHJvdGF0aW5nIHBhcml0eSAwIHdpdGggZGF0YSByZXN0YXJ0CisgIHJhaWQ1X3JzIAlSQUlENSByaWdodCBzeW1tZXRyaWMKKwkJLSByb3RhdGluZyBwYXJpdHkgTiB3aXRoIGRhdGEgcmVzdGFydAorICByYWlkNl96cglSQUlENiB6ZXJvIHJlc3RhcnQKKwkJLSByb3RhdGluZyBwYXJpdHkgemVybyAobGVmdC10by1yaWdodCkgd2l0aCBkYXRhIHJlc3RhcnQKKyAgcmFpZDZfbnIJUkFJRDYgTiByZXN0YXJ0CisJCS0gcm90YXRpbmcgcGFyaXR5IE4gKHJpZ2h0LXRvLWxlZnQpIHdpdGggZGF0YSByZXN0YXJ0CisgIHJhaWQ2X25jCVJBSUQ2IE4gY29udGludWUKKwkJLSByb3RhdGluZyBwYXJpdHkgTiAocmlnaHQtdG8tbGVmdCkgd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgorICByYWlkMTAgICAgICAgIFZhcmlvdXMgUkFJRDEwIGluc3BpcmVkIGFsZ29yaXRobXMgY2hvc2VuIGJ5IGFkZGl0aW9uYWwgcGFyYW1zCisJCS0gUkFJRDEwOiBTdHJpcGVkIE1pcnJvcnMgKGFrYSAnU3RyaXBpbmcgb24gdG9wIG9mIG1pcnJvcnMnKQorCQktIFJBSUQxRTogSW50ZWdyYXRlZCBBZGphY2VudCBTdHJpcGUgTWlycm9yaW5nCisJCS0gUkFJRDFFOiBJbnRlZ3JhdGVkIE9mZnNldCBTdHJpcGUgTWlycm9yaW5nCisJCS0gIGFuZCBvdGhlciBzaW1pbGFyIFJBSUQxMCB2YXJpYW50cworCisgIFJlZmVyZW5jZTogQ2hhcHRlciA0IG9mCisgIGh0dHA6Ly93d3cuc25pYS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9TTklBX0RERl9UZWNobmljYWxfUG9zaXRpb25fdjIuMC5wZGYKKworPCNyYWlkX3BhcmFtcz46IFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGF0IGZvbGxvdy4KKworPHJhaWRfcGFyYW1zPiBjb25zaXN0cyBvZgorICAgIE1hbmRhdG9yeSBwYXJhbWV0ZXJzOgorICAgICAgICA8Y2h1bmtfc2l6ZT46IENodW5rIHNpemUgaW4gc2VjdG9ycy4gIFRoaXMgcGFyYW1ldGVyIGlzIG9mdGVuIGtub3duIGFzCisJCSAgICAgICJzdHJpcGUgc2l6ZSIuICBJdCBpcyB0aGUgb25seSBtYW5kYXRvcnkgcGFyYW1ldGVyIGFuZAorCQkgICAgICBpcyBwbGFjZWQgZmlyc3QuCisKKyAgICBmb2xsb3dlZCBieSBvcHRpb25hbCBwYXJhbWV0ZXJzIChpbiBhbnkgb3JkZXIpOgorCVtzeW5jfG5vc3luY10gICBGb3JjZSBvciBwcmV2ZW50IFJBSUQgaW5pdGlhbGl6YXRpb24uCisKKwlbcmVidWlsZCA8aWR4Pl0JUmVidWlsZCBkcml2ZSBudW1iZXIgJ2lkeCcgKGZpcnN0IGRyaXZlIGlzIDApLgorCisJW2RhZW1vbl9zbGVlcCA8bXM+XQorCQlJbnRlcnZhbCBiZXR3ZWVuIHJ1bnMgb2YgdGhlIGJpdG1hcCBkYWVtb24gdGhhdAorCQljbGVhciBiaXRzLiAgQSBsb25nZXIgaW50ZXJ2YWwgbWVhbnMgbGVzcyBiaXRtYXAgSS9PIGJ1dAorCQlyZXN5bmNpbmcgYWZ0ZXIgYSBmYWlsdXJlIGlzIGxpa2VseSB0byB0YWtlIGxvbmdlci4KKworCVttaW5fcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorCVttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorCVt3cml0ZV9tb3N0bHkgPGlkeD5dCQkgICBNYXJrIGRyaXZlIGluZGV4ICdpZHgnIHdyaXRlLW1vc3RseS4KKwlbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dICAgICAgIFNlZSAnLS13cml0ZS1iZWhpbmQ9JyAobWFuIG1kYWRtKQorCVtzdHJpcGVfY2FjaGUgPHNlY3RvcnM+XSAgICAgICAgICAgU3RyaXBlIGNhY2hlIHNpemUgKFJBSUQgNC81LzYgb25seSkKKwlbcmVnaW9uX3NpemUgPHNlY3RvcnM+XQorCQlUaGUgcmVnaW9uX3NpemUgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgaXMgdGhlCisJCWxvZ2ljYWwgc2l6ZSBvZiB0aGUgYXJyYXkuICBUaGUgYml0bWFwIHJlY29yZHMgdGhlIGRldmljZQorCQlzeW5jaHJvbmlzYXRpb24gc3RhdGUgZm9yIGVhY2ggcmVnaW9uLgorCisgICAgICAgIFtyYWlkMTBfY29waWVzICAgPCMgY29waWVzPl0KKyAgICAgICAgW3JhaWQxMF9mb3JtYXQgICA8bmVhcnxmYXJ8b2Zmc2V0Pl0KKwkJVGhlc2UgdHdvIG9wdGlvbnMgYXJlIHVzZWQgdG8gYWx0ZXIgdGhlIGRlZmF1bHQgbGF5b3V0IG9mCisJCWEgUkFJRDEwIGNvbmZpZ3VyYXRpb24uICBUaGUgbnVtYmVyIG9mIGNvcGllcyBpcyBjYW4gYmUKKwkJc3BlY2lmaWVkLCBidXQgdGhlIGRlZmF1bHQgaXMgMi4gIFRoZXJlIGFyZSBhbHNvIHRocmVlCisJCXZhcmlhdGlvbnMgdG8gaG93IHRoZSBjb3BpZXMgYXJlIGxhaWQgZG93biAtIHRoZSBkZWZhdWx0CisJCWlzICJuZWFyIi4gIE5lYXIgY29waWVzIGFyZSB3aGF0IG1vc3QgcGVvcGxlIHRoaW5rIG9mIHdpdGgKKwkJcmVzcGVjdCB0byBtaXJyb3JpbmcuICBJZiB0aGVzZSBvcHRpb25zIGFyZSBsZWZ0IHVuc3BlY2lmaWVkLAorCQlvciAncmFpZDEwX2NvcGllcyAyJyBhbmQvb3IgJ3JhaWQxMF9mb3JtYXQgbmVhcicgYXJlIGdpdmVuLAorCQl0aGVuIHRoZSBsYXlvdXRzIGZvciAyLCAzIGFuZCA0IGRldmljZXMJYXJlOgorCQkyIGRyaXZlcyAgICAgICAgIDMgZHJpdmVzICAgICAgICAgIDQgZHJpdmVzCisJCS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0KKwkJQTEgIEExICAgICAgICAgICBBMSAgQTEgIEEyICAgICAgICBBMSAgQTEgIEEyICBBMgorCQlBMiAgQTIgICAgICAgICAgIEEyICBBMyAgQTMgICAgICAgIEEzICBBMyAgQTQgIEE0CisJCUEzICBBMyAgICAgICAgICAgQTQgIEE0ICBBNSAgICAgICAgQTUgIEE1ICBBNiAgQTYKKwkJQTQgIEE0ICAgICAgICAgICBBNSAgQTYgIEE2ICAgICAgICBBNyAgQTcgIEE4ICBBOAorCQkuLiAgLi4gICAgICAgICAgIC4uICAuLiAgLi4gICAgICAgIC4uICAuLiAgLi4gIC4uCisJCVRoZSAyLWRldmljZSBsYXlvdXQgaXMgZXF1aXZhbGVudCAyLXdheSBSQUlEMS4gIFRoZSA0LWRldmljZQorCQlsYXlvdXQgaXMgd2hhdCBhIHRyYWRpdGlvbmFsIFJBSUQxMCB3b3VsZCBsb29rIGxpa2UuICBUaGUKKwkJMy1kZXZpY2UgbGF5b3V0IGlzIHdoYXQgbWlnaHQgYmUgY2FsbGVkIGEgJ1JBSUQxRSAtIEludGVncmF0ZWQKKwkJQWRqYWNlbnQgU3RyaXBlIE1pcnJvcmluZycuCisKKwkJSWYgJ3JhaWQxMF9jb3BpZXMgMicgYW5kICdyYWlkMTBfZm9ybWF0IGZhcicsIHRoZW4gdGhlIGxheW91dHMKKwkJZm9yIDIsIDMgYW5kIDQgZGV2aWNlcyBhcmU6CisJCTIgZHJpdmVzICAgICAgICAgICAgIDMgZHJpdmVzICAgICAgICAgICAgIDQgZHJpdmVzCisJCS0tLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUExICBBMiAgICAgICAgICAgICAgIEExICAgQTIgICBBMyAgICAgICAgIEExICAgQTIgICBBMyAgIEE0CisJCUEzICBBNCAgICAgICAgICAgICAgIEE0ICAgQTUgICBBNiAgICAgICAgIEE1ICAgQTYgICBBNyAgIEE4CisJCUE1ICBBNiAgICAgICAgICAgICAgIEE3ICAgQTggICBBOSAgICAgICAgIEE5ICAgQTEwICBBMTEgIEExMgorCQkuLiAgLi4gICAgICAgICAgICAgICAuLiAgIC4uICAgLi4gICAgICAgICAuLiAgIC4uICAgLi4gICAuLgorCQlBMiAgQTEgICAgICAgICAgICAgICBBMyAgIEExICAgQTIgICAgICAgICBBMiAgIEExICAgQTQgICBBMworCQlBNCAgQTMgICAgICAgICAgICAgICBBNiAgIEE0ICAgQTUgICAgICAgICBBNiAgIEE1ICAgQTggICBBNworCQlBNiAgQTUgICAgICAgICAgICAgICBBOSAgIEE3ICAgQTggICAgICAgICBBMTAgIEE5ICAgQTEyICBBMTEKKwkJLi4gIC4uICAgICAgICAgICAgICAgLi4gICAuLiAgIC4uICAgICAgICAgLi4gICAuLiAgIC4uICAgLi4KKworCQlJZiAncmFpZDEwX2NvcGllcyAyJyBhbmQgJ3JhaWQxMF9mb3JtYXQgb2Zmc2V0JywgdGhlbiB0aGUKKwkJbGF5b3V0cyBmb3IgMiwgMyBhbmQgNCBkZXZpY2VzIGFyZToKKwkJMiBkcml2ZXMgICAgICAgMyBkcml2ZXMgICAgICAgICAgIDQgZHJpdmVzCisJCS0tLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQorCQlBMSAgQTIgICAgICAgICBBMSAgQTIgIEEzICAgICAgICAgQTEgIEEyICBBMyAgQTQKKwkJQTIgIEExICAgICAgICAgQTMgIEExICBBMiAgICAgICAgIEEyICBBMSAgQTQgIEEzCisJCUEzICBBNCAgICAgICAgIEE0ICBBNSAgQTYgICAgICAgICBBNSAgQTYgIEE3ICBBOAorCQlBNCAgQTMgICAgICAgICBBNiAgQTQgIEE1ICAgICAgICAgQTYgIEE1ICBBOCAgQTcKKwkJQTUgIEE2ICAgICAgICAgQTcgIEE4ICBBOSAgICAgICAgIEE5ICBBMTAgQTExIEExMgorCQlBNiAgQTUgICAgICAgICBBOSAgQTcgIEE4ICAgICAgICAgQTEwIEE5ICBBMTIgQTExCisJCS4uICAuLiAgICAgICAgIC4uICAuLiAgLi4gICAgICAgICAuLiAgLi4gIC4uICAuLgorCQlIZXJlIHdlIHNlZSBsYXlvdXRzIGNsb3NlbHkgYWtpbiB0byAnUkFJRDFFIC0gSW50ZWdyYXRlZAorCQlPZmZzZXQgU3RyaXBlIE1pcnJvcmluZycuCisKKzwjcmFpZF9kZXZzPjogVGhlIG51bWJlciBvZiBkZXZpY2VzIGNvbXBvc2luZyB0aGUgYXJyYXkuCisJRWFjaCBkZXZpY2UgY29uc2lzdHMgb2YgdHdvIGVudHJpZXMuICBUaGUgZmlyc3QgaXMgdGhlIGRldmljZQorCWNvbnRhaW5pbmcgdGhlIG1ldGFkYXRhIChpZiBhbnkpOyB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgY29udGFpbmluZyB0aGUKKwlkYXRhLgorCisJSWYgYSBkcml2ZSBoYXMgZmFpbGVkIG9yIGlzIG1pc3NpbmcgYXQgY3JlYXRpb24gdGltZSwgYSAnLScgY2FuIGJlCisJZ2l2ZW4gZm9yIGJvdGggdGhlIG1ldGFkYXRhIGFuZCBkYXRhIGRyaXZlcyBmb3IgYSBnaXZlbiBwb3NpdGlvbi4KKworCitFeGFtcGxlIFRhYmxlcworLS0tLS0tLS0tLS0tLS0KKyMgUkFJRDQgLSA0IGRhdGEgZHJpdmVzLCAxIHBhcml0eSAobm8gbWV0YWRhdGEgZGV2aWNlcykKKyMgTm8gbWV0YWRhdGEgZGV2aWNlcyBzcGVjaWZpZWQgdG8gaG9sZCBzdXBlcmJsb2NrL2JpdG1hcCBpbmZvCisjIENodW5rIHNpemUgb2YgMU1pQgorIyAoTGluZXMgc2VwYXJhdGVkIGZvciBlYXN5IHJlYWRpbmcpCisKKzAgMTk2MDg5MzY0OCByYWlkIFwKKyAgICAgICAgcmFpZDQgMSAyMDQ4IFwKKyAgICAgICAgNSAtIDg6MTcgLSA4OjMzIC0gODo0OSAtIDg6NjUgLSA4OjgxCisKKyMgUkFJRDQgLSA0IGRhdGEgZHJpdmVzLCAxIHBhcml0eSAod2l0aCBtZXRhZGF0YSBkZXZpY2VzKQorIyBDaHVuayBzaXplIG9mIDFNaUIsIGZvcmNlIFJBSUQgaW5pdGlhbGl6YXRpb24sCisjICAgICAgIG1pbiByZWNvdmVyeSByYXRlIGF0IDIwIGtpQi9zZWMvZGlzaworCiswIDE5NjA4OTM2NDggcmFpZCBcCisgICAgICAgIHJhaWQ0IDQgMjA0OCBzeW5jIG1pbl9yZWNvdmVyeV9yYXRlIDIwIFwKKyAgICAgICAgNSA4OjE3IDg6MTggODozMyA4OjM0IDg6NDkgODo1MCA4OjY1IDg6NjYgODo4MSA4OjgyCisKKworU3RhdHVzIE91dHB1dAorLS0tLS0tLS0tLS0tLQorJ2Rtc2V0dXAgdGFibGUnIGRpc3BsYXlzIHRoZSB0YWJsZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbWFwcGluZy4KK1RoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBhbHdheXMgcHJpbnRlZCBpbiB0aGUgb3JkZXIgbGlzdGVkCithYm92ZSB3aXRoICJzeW5jIiBvciAibm9zeW5jIiBhbHdheXMgb3V0cHV0IGFoZWFkIG9mIHRoZSBvdGhlcgorYXJndW1lbnRzLCByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciB1c2VkIHdoZW4gb3JpZ2luYWxseSBsb2FkaW5nIHRoZSB0YWJsZS4KK0FyZ3VtZW50cyB0aGF0IGNhbiBiZSByZXBlYXRlZCBhcmUgb3JkZXJlZCBieSB2YWx1ZS4KKworCisnZG1zZXR1cCBzdGF0dXMnIHlpZWxkcyBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhdGUgYW5kIGhlYWx0aCBvZiB0aGUgYXJyYXkuCitUaGUgb3V0cHV0IGlzIGFzIGZvbGxvd3MgKG5vcm1hbGx5IGEgc2luZ2xlIGxpbmUsIGJ1dCBleHBhbmRlZCBoZXJlIGZvcgorY2xhcml0eSk6CisxOiA8cz4gPGw+IHJhaWQgXAorMjogICAgICA8cmFpZF90eXBlPiA8I2RldmljZXM+IDxoZWFsdGhfY2hhcnM+IFwKKzM6ICAgICAgPHN5bmNfcmF0aW8+IDxzeW5jX2FjdGlvbj4gPG1pc21hdGNoX2NudD4KKworTGluZSAxIGlzIHRoZSBzdGFuZGFyZCBvdXRwdXQgcHJvZHVjZWQgYnkgZGV2aWNlLW1hcHBlci4KK0xpbmUgMiAmIDMgYXJlIHByb2R1Y2VkIGJ5IHRoZSByYWlkIHRhcmdldCBhbmQgYXJlIGJlc3QgZXhwbGFpbmVkIGJ5IGV4YW1wbGU6CisgICAgICAgIDAgMTk2MDg5MzY0OCByYWlkIHJhaWQ0IDUgQUFBQUEgMi80OTAyMjE1NjggaW5pdCAwCitIZXJlIHdlIGNhbiBzZWUgdGhlIFJBSUQgdHlwZSBpcyByYWlkNCwgdGhlcmUgYXJlIDUgZGV2aWNlcyAtIGFsbCBvZgord2hpY2ggYXJlICdBJ2xpdmUsIGFuZCB0aGUgYXJyYXkgaXMgMi80OTAyMjE1NjggY29tcGxldGUgd2l0aCBpdHMgaW5pdGlhbAorcmVjb3ZlcnkuICBIZXJlIGlzIGEgZnVsbGVyIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGZpZWxkczoKKwk8cmFpZF90eXBlPiAgICAgU2FtZSBhcyB0aGUgPHJhaWRfdHlwZT4gdXNlZCB0byBjcmVhdGUgdGhlIGFycmF5LgorCTxoZWFsdGhfY2hhcnM+ICBPbmUgY2hhciBmb3IgZWFjaCBkZXZpY2UsIGluZGljYXRpbmc6ICdBJyA9IGFsaXZlIGFuZAorCQkJaW4tc3luYywgJ2EnID0gYWxpdmUgYnV0IG5vdCBpbi1zeW5jLCAnRCcgPSBkZWFkL2ZhaWxlZC4KKwk8c3luY19yYXRpbz4gICAgVGhlIHJhdGlvIGluZGljYXRpbmcgaG93IG11Y2ggb2YgdGhlIGFycmF5IGhhcyB1bmRlcmdvbmUKKwkJCXRoZSBwcm9jZXNzIGRlc2NyaWJlZCBieSAnc3luY19hY3Rpb24nLiAgSWYgdGhlCisJCQknc3luY19hY3Rpb24nIGlzICJjaGVjayIgb3IgInJlcGFpciIsIHRoZW4gdGhlIHByb2Nlc3MKKwkJCW9mICJyZXN5bmMiIG9yICJyZWNvdmVyIiBjYW4gYmUgY29uc2lkZXJlZCBjb21wbGV0ZS4KKwk8c3luY19hY3Rpb24+ICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgc3RhdGVzOgorCQkJaWRsZSAgICAtIE5vIHN5bmNocm9uaXphdGlvbiBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLgorCQkJZnJvemVuICAtIFRoZSBjdXJyZW50IGFjdGlvbiBoYXMgYmVlbiBoYWx0ZWQuCisJCQlyZXN5bmMgIC0gQXJyYXkgaXMgdW5kZXJnb2luZyBpdHMgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24KKwkJCQkgIG9yIGlzIHJlc3luY2hyb25pemluZyBhZnRlciBhbiB1bmNsZWFuIHNodXRkb3duCisJCQkJICAocG9zc2libHkgYWlkZWQgYnkgYSBiaXRtYXApLgorCQkJcmVjb3ZlciAtIEEgZGV2aWNlIGluIHRoZSBhcnJheSBpcyBiZWluZyByZWJ1aWx0IG9yCisJCQkJICByZXBsYWNlZC4KKwkJCWNoZWNrICAgLSBBIHVzZXItaW5pdGlhdGVkIGZ1bGwgY2hlY2sgb2YgdGhlIGFycmF5IGlzCisJCQkJICBiZWluZyBwZXJmb3JtZWQuICBBbGwgYmxvY2tzIGFyZSByZWFkIGFuZAorCQkJCSAgY2hlY2tlZCBmb3IgY29uc2lzdGVuY3kuICBUaGUgbnVtYmVyIG9mCisJCQkJICBkaXNjcmVwYW5jaWVzIGZvdW5kIGFyZSByZWNvcmRlZCBpbgorCQkJCSAgPG1pc21hdGNoX2NudD4uICBObyBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZQorCQkJCSAgYXJyYXkgYnkgdGhpcyBhY3Rpb24uCisJCQlyZXBhaXIgIC0gVGhlIHNhbWUgYXMgImNoZWNrIiwgYnV0IGRpc2NyZXBhbmNpZXMgYXJlCisJCQkJICBjb3JyZWN0ZWQuCisJCQlyZXNoYXBlIC0gVGhlIGFycmF5IGlzIHVuZGVyZ29pbmcgYSByZXNoYXBlLgorCTxtaXNtYXRjaF9jbnQ+ICBUaGUgbnVtYmVyIG9mIGRpc2NyZXBhbmNpZXMgZm91bmQgYmV0d2VlbiBtaXJyb3IgY29waWVzCisJCQlpbiBSQUlEMS8xMCBvciB3cm9uZyBwYXJpdHkgdmFsdWVzIGZvdW5kIGluIFJBSUQ0LzUvNi4KKwkJCVRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSBhZnRlciBhICJjaGVjayIgb2YgdGhlIGFycmF5CisJCQlpcyBwZXJmb3JtZWQuICBBIGhlYWx0aHkgYXJyYXkgaGFzIGEgJ21pc21hdGNoX2NudCcgb2YgMC4KKworTWVzc2FnZSBJbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZG0tcmFpZCB0YXJnZXQgd2lsbCBhY2NlcHQgY2VydGFpbiBhY3Rpb25zIHRocm91Z2ggdGhlICdtZXNzYWdlJyBpbnRlcmZhY2UuCisoJ21hbiBkbXNldHVwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbWVzc2FnZSBpbnRlcmZhY2UuKSAgVGhlc2UgYWN0aW9ucworaW5jbHVkZToKKwkiaWRsZSIgICAtIEhhbHQgdGhlIGN1cnJlbnQgc3luYyBhY3Rpb24uCisJImZyb3plbiIgLSBGcmVlemUgdGhlIGN1cnJlbnQgc3luYyBhY3Rpb24uCisJInJlc3luYyIgLSBJbml0aWF0ZS9jb250aW51ZSBhIHJlc3luYy4KKwkicmVjb3ZlciItIEluaXRpYXRlL2NvbnRpbnVlIGEgcmVjb3ZlciBwcm9jZXNzLgorCSJjaGVjayIgIC0gSW5pdGlhdGUgYSBjaGVjayAoaS5lLiBhICJzY3J1YiIpIG9mIHRoZSBhcnJheS4KKwkicmVwYWlyIiAtIEluaXRpYXRlIGEgcmVwYWlyIG9mIHRoZSBhcnJheS4KKwkicmVzaGFwZSItIEN1cnJlbnRseSB1bnN1cHBvcnRlZCAoLUVJTlZBTCkuCisKKworRGlzY2FyZCBTdXBwb3J0CistLS0tLS0tLS0tLS0tLS0KK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaXNjYXJkIHN1cHBvcnQgYW1vbmcgaGFyZHdhcmUgdmVuZG9ycyB2YXJpZXMuCitXaGVuIGEgYmxvY2sgaXMgZGlzY2FyZGVkLCBzb21lIHN0b3JhZ2UgZGV2aWNlcyB3aWxsIHJldHVybiB6ZXJvZXMgd2hlbgordGhlIGJsb2NrIGlzIHJlYWQuICBUaGVzZSBkZXZpY2VzIHNldCB0aGUgJ2Rpc2NhcmRfemVyb2VzX2RhdGEnCithdHRyaWJ1dGUuICBPdGhlciBkZXZpY2VzIHdpbGwgcmV0dXJuIHJhbmRvbSBkYXRhLiAgQ29uZnVzaW5nbHksIHNvbWUKK2RldmljZXMgdGhhdCBhZHZlcnRpc2UgJ2Rpc2NhcmRfemVyb2VzX2RhdGEnIHdpbGwgbm90IHJlbGlhYmx5IHJldHVybgoremVyb2VzIHdoZW4gZGlzY2FyZGVkIGJsb2NrcyBhcmUgcmVhZCEgIFNpbmNlIFJBSUQgNC81LzYgdXNlcyBibG9ja3MKK2Zyb20gYSBudW1iZXIgb2YgZGV2aWNlcyB0byBjYWxjdWxhdGUgcGFyaXR5IGJsb2NrcyBhbmQgKGZvciBwZXJmb3JtYW5jZQorcmVhc29ucykgcmVsaWVzIG9uICdkaXNjYXJkX3plcm9lc19kYXRhJyBiZWluZyByZWxpYWJsZSwgaXQgaXMgaW1wb3J0YW50Cit0aGF0IHRoZSBkZXZpY2VzIGJlIGNvbnNpc3RlbnQuICBCbG9ja3MgbWF5IGJlIGRpc2NhcmRlZCBpbiB0aGUgbWlkZGxlCitvZiBhIFJBSUQgNC81LzYgc3RyaXBlIGFuZCBpZiBzdWJzZXF1ZW50IHJlYWQgcmVzdWx0cyBhcmUgbm90Citjb25zaXN0ZW50LCB0aGUgcGFyaXR5IGJsb2NrcyBtYXkgYmUgY2FsY3VsYXRlZCBkaWZmZXJlbnRseSBhdCBhbnkgdGltZTsKK21ha2luZyB0aGUgcGFyaXR5IGJsb2NrcyB1c2VsZXNzIGZvciByZWR1bmRhbmN5LiAgSXQgaXMgaW1wb3J0YW50IHRvCit1bmRlcnN0YW5kIGhvdyB5b3VyIGhhcmR3YXJlIGJlaGF2ZXMgd2l0aCBkaXNjYXJkcyBpZiB5b3UgYXJlIGdvaW5nIHRvCitlbmFibGUgZGlzY2FyZHMgd2l0aCBSQUlEIDQvNS82LgorCitTaW5jZSB0aGUgYmVoYXZpb3Igb2Ygc3RvcmFnZSBkZXZpY2VzIGlzIHVucmVsaWFibGUgaW4gdGhpcyByZXNwZWN0LAorZXZlbiB3aGVuIHJlcG9ydGluZyAnZGlzY2FyZF96ZXJvZXNfZGF0YScsIGJ5IGRlZmF1bHQgUkFJRCA0LzUvNgorZGlzY2FyZCBzdXBwb3J0IGlzIGRpc2FibGVkIC0tIHRoaXMgZW5zdXJlcyBkYXRhIGludGVncml0eSBhdCB0aGUKK2V4cGVuc2Ugb2YgbG9zaW5nIHNvbWUgcGVyZm9ybWFuY2UuCisKK1N0b3JhZ2UgZGV2aWNlcyB0aGF0IHByb3Blcmx5IHN1cHBvcnQgJ2Rpc2NhcmRfemVyb2VzX2RhdGEnIGFyZQoraW5jcmVhc2luZ2x5IHdoaXRlbGlzdGVkIGluIHRoZSBrZXJuZWwgYW5kIGNhbiB0aHVzIGJlIHRydXN0ZWQuCisKK0ZvciB0cnVzdGVkIGRldmljZXMsIHRoZSBmb2xsb3dpbmcgZG0tcmFpZCBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZSBzZXQKK3RvIHNhZmVseSBlbmFibGUgZGlzY2FyZCBzdXBwb3J0IGZvciBSQUlEIDQvNS82OgorICAgICdkZXZpY2VzX2hhbmRsZV9kaXNjYXJkc19zYWZlbHknCisKKworVmVyc2lvbiBIaXN0b3J5CistLS0tLS0tLS0tLS0tLS0KKzEuMC4wCUluaXRpYWwgdmVyc2lvbi4gIFN1cHBvcnQgZm9yIFJBSUQgNC81LzYKKzEuMS4wCUFkZGVkIHN1cHBvcnQgZm9yIFJBSUQgMQorMS4yLjAJSGFuZGxlIGNyZWF0aW9uIG9mIGFycmF5cyB0aGF0IGNvbnRhaW4gZmFpbGVkIGRldmljZXMuCisxLjMuMAlBZGRlZCBzdXBwb3J0IGZvciBSQUlEIDEwCisxLjMuMQlBbGxvdyBkZXZpY2UgcmVwbGFjZW1lbnQvcmVidWlsZCBmb3IgUkFJRCAxMAorMS4zLjIgICBGaXgvaW1wcm92ZSByZWR1bmRhbmN5IGNoZWNraW5nIGZvciBSQUlEMTAKKzEuNC4wCU5vbi1mdW5jdGlvbmFsIGNoYW5nZS4gIFJlbW92ZXMgYXJnIGZyb20gbWFwcGluZyBmdW5jdGlvbi4KKzEuNC4xICAgUkFJRDEwIGZpeCByZWR1bmRhbmN5IHZhbGlkYXRpb24gY2hlY2tzIChjb21taXQgNTVlYmJiNSkuCisxLjQuMiAgIEFkZCBSQUlEMTAgImZhciIgYW5kICJvZmZzZXQiIGFsZ29yaXRobSBzdXBwb3J0LgorMS41LjAgICBBZGQgbWVzc2FnZSBpbnRlcmZhY2UgdG8gYWxsb3cgbWFuaXB1bGF0aW9uIG9mIHRoZSBzeW5jX2FjdGlvbi4KKwlOZXcgc3RhdHVzIChTVEFUVVNUWVBFX0lORk8pIGZpZWxkczogc3luY19hY3Rpb24gYW5kIG1pc21hdGNoX2NudC4KKzEuNS4xICAgQWRkIGFiaWxpdHkgdG8gcmVzdG9yZSB0cmFuc2llbnRseSBmYWlsZWQgZGV2aWNlcyBvbiByZXN1bWUuCisxLjUuMiAgICdtaXNtYXRjaF9jbnQnIGlzIHplcm8gdW5sZXNzIFtsYXN0X11zeW5jX2FjdGlvbiBpcyAiY2hlY2siLgorMS42LjAgICBBZGQgZGlzY2FyZCBzdXBwb3J0IChhbmQgZGV2aWNlc19oYW5kbGVfZGlzY2FyZF9zYWZlbHkgbW9kdWxlIHBhcmFtKS4KKzEuNy4wICAgQWRkIHN1cHBvcnQgZm9yIE1EIFJBSUQwIG1hcHBpbmdzLgpkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9zZXJ2aWNlLXRpbWUudHh0IGIvZG9jL2tlcm5lbC9zZXJ2aWNlLXRpbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWQ0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL3NlcnZpY2UtdGltZS50eHQKQEAgLTAsMCArMSw5MSBAQAorZG0tc2VydmljZS10aW1lCis9PT09PT09PT09PT09PT0KKworZG0tc2VydmljZS10aW1lIGlzIGEgcGF0aCBzZWxlY3RvciBtb2R1bGUgZm9yIGRldmljZS1tYXBwZXIgdGFyZ2V0cywKK3doaWNoIHNlbGVjdHMgYSBwYXRoIHdpdGggdGhlIHNob3J0ZXN0IGVzdGltYXRlZCBzZXJ2aWNlIHRpbWUgZm9yCit0aGUgaW5jb21pbmcgSS9PLgorCitUaGUgc2VydmljZSB0aW1lIGZvciBlYWNoIHBhdGggaXMgZXN0aW1hdGVkIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBzaXplCitvZiBpbi1mbGlnaHQgSS9PcyBvbiBhIHBhdGggd2l0aCB0aGUgcGVyZm9ybWFuY2UgdmFsdWUgb2YgdGhlIHBhdGguCitUaGUgcGVyZm9ybWFuY2UgdmFsdWUgaXMgYSByZWxhdGl2ZSB0aHJvdWdocHV0IHZhbHVlIGFtb25nIGFsbCBwYXRocworaW4gYSBwYXRoLWdyb3VwLCBhbmQgaXQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHRhYmxlIGFyZ3VtZW50LgorCitUaGUgcGF0aCBzZWxlY3RvciBuYW1lIGlzICdzZXJ2aWNlLXRpbWUnLgorCitUYWJsZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHBhdGg6IFs8cmVwZWF0X2NvdW50PiBbPHJlbGF0aXZlX3Rocm91Z2hwdXQ+XV0KKwk8cmVwZWF0X2NvdW50PjogVGhlIG51bWJlciBvZiBJL09zIHRvIGRpc3BhdGNoIHVzaW5nIHRoZSBzZWxlY3RlZAorCQkJcGF0aCBiZWZvcmUgc3dpdGNoaW5nIHRvIHRoZSBuZXh0IHBhdGguCisJCQlJZiBub3QgZ2l2ZW4sIGludGVybmFsIGRlZmF1bHQgaXMgdXNlZC4gIFRvIGNoZWNrCisJCQl0aGUgZGVmYXVsdCB2YWx1ZSwgc2VlIHRoZSBhY3RpdmF0ZWQgdGFibGUuCisJPHJlbGF0aXZlX3Rocm91Z2hwdXQ+OiBUaGUgcmVsYXRpdmUgdGhyb3VnaHB1dCB2YWx1ZSBvZiB0aGUgcGF0aAorCQkJYW1vbmcgYWxsIHBhdGhzIGluIHRoZSBwYXRoLWdyb3VwLgorCQkJVGhlIHZhbGlkIHJhbmdlIGlzIDAtMTAwLgorCQkJSWYgbm90IGdpdmVuLCBtaW5pbXVtIHZhbHVlICcxJyBpcyB1c2VkLgorCQkJSWYgJzAnIGlzIGdpdmVuLCB0aGUgcGF0aCBpc24ndCBzZWxlY3RlZCB3aGlsZQorCQkJb3RoZXIgcGF0aHMgaGF2aW5nIGEgcG9zaXRpdmUgdmFsdWUgYXJlIGF2YWlsYWJsZS4KKworU3RhdHVzIGZvciBlYWNoIHBhdGg6IDxzdGF0dXM+IDxmYWlsLWNvdW50PiA8aW4tZmxpZ2h0LXNpemU+IFwKKwkJICAgICAgPHJlbGF0aXZlX3Rocm91Z2hwdXQ+CisJPHN0YXR1cz46ICdBJyBpZiB0aGUgcGF0aCBpcyBhY3RpdmUsICdGJyBpZiB0aGUgcGF0aCBpcyBmYWlsZWQuCisJPGZhaWwtY291bnQ+OiBUaGUgbnVtYmVyIG9mIHBhdGggZmFpbHVyZXMuCisJPGluLWZsaWdodC1zaXplPjogVGhlIHNpemUgb2YgaW4tZmxpZ2h0IEkvT3Mgb24gdGhlIHBhdGguCisJPHJlbGF0aXZlX3Rocm91Z2hwdXQ+OiBUaGUgcmVsYXRpdmUgdGhyb3VnaHB1dCB2YWx1ZSBvZiB0aGUgcGF0aAorCQkJYW1vbmcgYWxsIHBhdGhzIGluIHRoZSBwYXRoLWdyb3VwLgorCisKK0FsZ29yaXRobQorPT09PT09PT09CisKK2RtLXNlcnZpY2UtdGltZSBhZGRzIHRoZSBJL08gc2l6ZSB0byAnaW4tZmxpZ2h0LXNpemUnIHdoZW4gdGhlIEkvTyBpcworZGlzcGF0Y2hlZCBhbmQgc3VidHJhY3RzIHdoZW4gY29tcGxldGVkLgorQmFzaWNhbGx5LCBkbS1zZXJ2aWNlLXRpbWUgc2VsZWN0cyBhIHBhdGggaGF2aW5nIG1pbmltdW0gc2VydmljZSB0aW1lCit3aGljaCBpcyBjYWxjdWxhdGVkIGJ5OgorCisJKCdpbi1mbGlnaHQtc2l6ZScgKyAnc2l6ZS1vZi1pbmNvbWluZy1pbycpIC8gJ3JlbGF0aXZlX3Rocm91Z2hwdXQnCisKK0hvd2V2ZXIsIHNvbWUgb3B0aW1pemF0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIGNhbGN1bGF0aW9uCithcyBtdWNoIGFzIHBvc3NpYmxlLgorCisJMS4gSWYgdGhlIHBhdGhzIGhhdmUgdGhlIHNhbWUgJ3JlbGF0aXZlX3Rocm91Z2hwdXQnLCBza2lwCisJICAgdGhlIGRpdmlzaW9uIGFuZCBqdXN0IGNvbXBhcmUgdGhlICdpbi1mbGlnaHQtc2l6ZScuCisKKwkyLiBJZiB0aGUgcGF0aHMgaGF2ZSB0aGUgc2FtZSAnaW4tZmxpZ2h0LXNpemUnLCBza2lwIHRoZSBkaXZpc2lvbgorCSAgIGFuZCBqdXN0IGNvbXBhcmUgdGhlICdyZWxhdGl2ZV90aHJvdWdocHV0Jy4KKworCTMuIElmIHNvbWUgcGF0aHMgaGF2ZSBub24temVybyAncmVsYXRpdmVfdGhyb3VnaHB1dCcgYW5kIG90aGVycworCSAgIGhhdmUgemVybyAncmVsYXRpdmVfdGhyb3VnaHB1dCcsIGlnbm9yZSB0aG9zZSBwYXRocyB3aXRoIHplcm8KKwkgICAncmVsYXRpdmVfdGhyb3VnaHB1dCcuCisKK0lmIHN1Y2ggb3B0aW1pemF0aW9ucyBjYW4ndCBiZSBhcHBsaWVkLCBjYWxjdWxhdGUgc2VydmljZSB0aW1lLCBhbmQKK2NvbXBhcmUgc2VydmljZSB0aW1lLgorSWYgY2FsY3VsYXRlZCBzZXJ2aWNlIHRpbWUgaXMgZXF1YWwsIHRoZSBwYXRoIGhhdmluZyBtYXhpbXVtCisncmVsYXRpdmVfdGhyb3VnaHB1dCcgbWF5IGJlIGJldHRlci4gIFNvIGNvbXBhcmUgJ3JlbGF0aXZlX3Rocm91Z2hwdXQnCit0aGVuLgorCisKK0V4YW1wbGVzCis9PT09PT09PQorSW4gY2FzZSB0aGF0IDIgcGF0aHMgKHNkYSBhbmQgc2RiKSBhcmUgdXNlZCB3aXRoIHJlcGVhdF9jb3VudCA9PSAxMjgKK2FuZCBzZGEgaGFzIGFuIGF2ZXJhZ2UgdGhyb3VnaHB1dCAxR0IvcyBhbmQgc2RiIGhhcyA0R0IvcywKKydyZWxhdGl2ZV90aHJvdWdocHV0JyB2YWx1ZSBtYXkgYmUgJzEnIGZvciBzZGEgYW5kICc0JyBmb3Igc2RiLgorCisjIGVjaG8gIjAgMTAgbXVsdGlwYXRoIDAgMCAxIDEgc2VydmljZS10aW1lIDAgMiAyIDg6MCAxMjggMSA4OjE2IDEyOCA0IiBcCisgIGRtc2V0dXAgY3JlYXRlIHRlc3QKKyMKKyMgZG1zZXR1cCB0YWJsZQordGVzdDogMCAxMCBtdWx0aXBhdGggMCAwIDEgMSBzZXJ2aWNlLXRpbWUgMCAyIDIgODowIDEyOCAxIDg6MTYgMTI4IDQKKyMKKyMgZG1zZXR1cCBzdGF0dXMKK3Rlc3Q6IDAgMTAgbXVsdGlwYXRoIDIgMCAwIDAgMSAxIEUgMCAyIDIgODowIEEgMCAwIDEgODoxNiBBIDAgMCA0CisKKworT3IgJzInIGZvciBzZGEgYW5kICc4JyBmb3Igc2RiIHdvdWxkIGJlIGFsc28gdHJ1ZS4KKworIyBlY2hvICIwIDEwIG11bHRpcGF0aCAwIDAgMSAxIHNlcnZpY2UtdGltZSAwIDIgMiA4OjAgMTI4IDIgODoxNiAxMjggOCIgXAorICBkbXNldHVwIGNyZWF0ZSB0ZXN0CisjCisjIGRtc2V0dXAgdGFibGUKK3Rlc3Q6IDAgMTAgbXVsdGlwYXRoIDAgMCAxIDEgc2VydmljZS10aW1lIDAgMiAyIDg6MCAxMjggMiA4OjE2IDEyOCA4CisjCisjIGRtc2V0dXAgc3RhdHVzCit0ZXN0OiAwIDEwIG11bHRpcGF0aCAyIDAgMCAwIDEgMSBFIDAgMiAyIDg6MCBBIDAgMCAyIDg6MTYgQSAwIDAgOApkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9zbmFwc2hvdC50eHQgYi9kb2Mva2VybmVsL3NuYXBzaG90LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY5NDliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9zbmFwc2hvdC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0RldmljZS1tYXBwZXIgc25hcHNob3Qgc3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RldmljZS1tYXBwZXIgYWxsb3dzIHlvdSwgd2l0aG91dCBtYXNzaXZlIGRhdGEgY29weWluZzoKKworKikgVG8gY3JlYXRlIHNuYXBzaG90cyBvZiBhbnkgYmxvY2sgZGV2aWNlIGkuZS4gbW91bnRhYmxlLCBzYXZlZCBzdGF0ZXMgb2YKK3RoZSBibG9jayBkZXZpY2Ugd2hpY2ggYXJlIGFsc28gd3JpdGFibGUgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZQorb3JpZ2luYWwgY29udGVudDsKKyopIFRvIGNyZWF0ZSBkZXZpY2UgImZvcmtzIiwgaS5lLiBtdWx0aXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCitzYW1lIGRhdGEgc3RyZWFtLgorKikgVG8gbWVyZ2UgYSBzbmFwc2hvdCBvZiBhIGJsb2NrIGRldmljZSBiYWNrIGludG8gdGhlIHNuYXBzaG90J3Mgb3JpZ2luCitkZXZpY2UuCisKK0luIHRoZSBmaXJzdCB0d28gY2FzZXMsIGRtIGNvcGllcyBvbmx5IHRoZSBjaHVua3Mgb2YgZGF0YSB0aGF0IGdldAorY2hhbmdlZCBhbmQgdXNlcyBhIHNlcGFyYXRlIGNvcHktb24td3JpdGUgKENPVykgYmxvY2sgZGV2aWNlIGZvcgorc3RvcmFnZS4KKworRm9yIHNuYXBzaG90IG1lcmdlIHRoZSBjb250ZW50cyBvZiB0aGUgQ09XIHN0b3JhZ2UgYXJlIG1lcmdlZCBiYWNrIGludG8KK3RoZSBvcmlnaW4gZGV2aWNlLgorCisKK1RoZXJlIGFyZSB0aHJlZSBkbSB0YXJnZXRzIGF2YWlsYWJsZToKK3NuYXBzaG90LCBzbmFwc2hvdC1vcmlnaW4sIGFuZCBzbmFwc2hvdC1tZXJnZS4KKworKikgc25hcHNob3Qtb3JpZ2luIDxvcmlnaW4+CisKK3doaWNoIHdpbGwgbm9ybWFsbHkgaGF2ZSBvbmUgb3IgbW9yZSBzbmFwc2hvdHMgYmFzZWQgb24gaXQuCitSZWFkcyB3aWxsIGJlIG1hcHBlZCBkaXJlY3RseSB0byB0aGUgYmFja2luZyBkZXZpY2UuIEZvciBlYWNoIHdyaXRlLCB0aGUKK29yaWdpbmFsIGRhdGEgd2lsbCBiZSBzYXZlZCBpbiB0aGUgPENPVyBkZXZpY2U+IG9mIGVhY2ggc25hcHNob3QgdG8ga2VlcAoraXRzIHZpc2libGUgY29udGVudCB1bmNoYW5nZWQsIGF0IGxlYXN0IHVudGlsIHRoZSA8Q09XIGRldmljZT4gZmlsbHMgdXAuCisKKworKikgc25hcHNob3QgPG9yaWdpbj4gPENPVyBkZXZpY2U+IDxwZXJzaXN0ZW50Pz4gPGNodW5rc2l6ZT4KKworQSBzbmFwc2hvdCBvZiB0aGUgPG9yaWdpbj4gYmxvY2sgZGV2aWNlIGlzIGNyZWF0ZWQuIENoYW5nZWQgY2h1bmtzIG9mCis8Y2h1bmtzaXplPiBzZWN0b3JzIHdpbGwgYmUgc3RvcmVkIG9uIHRoZSA8Q09XIGRldmljZT4uICBXcml0ZXMgd2lsbAorb25seSBnbyB0byB0aGUgPENPVyBkZXZpY2U+LiAgUmVhZHMgd2lsbCBjb21lIGZyb20gdGhlIDxDT1cgZGV2aWNlPiBvcgorZnJvbSA8b3JpZ2luPiBmb3IgdW5jaGFuZ2VkIGRhdGEuICA8Q09XIGRldmljZT4gd2lsbCBvZnRlbiBiZQorc21hbGxlciB0aGFuIHRoZSBvcmlnaW4gYW5kIGlmIGl0IGZpbGxzIHVwIHRoZSBzbmFwc2hvdCB3aWxsIGJlY29tZQordXNlbGVzcyBhbmQgYmUgZGlzYWJsZWQsIHJldHVybmluZyBlcnJvcnMuICBTbyBpdCBpcyBpbXBvcnRhbnQgdG8gbW9uaXRvcgordGhlIGFtb3VudCBvZiBmcmVlIHNwYWNlIGFuZCBleHBhbmQgdGhlIDxDT1cgZGV2aWNlPiBiZWZvcmUgaXQgZmlsbHMgdXAuCisKKzxwZXJzaXN0ZW50Pz4gaXMgUCAoUGVyc2lzdGVudCkgb3IgTiAoTm90IHBlcnNpc3RlbnQgLSB3aWxsIG5vdCBzdXJ2aXZlCithZnRlciByZWJvb3QpLiAgTyAoT3ZlcmZsb3cpIGNhbiBiZSBhZGRlZCBhcyBhIHBlcnNpc3RlbnQgc3RvcmUgb3B0aW9uCit0byBhbGxvdyB1c2Vyc3BhY2UgdG8gYWR2ZXJ0aXNlIGl0cyBzdXBwb3J0IGZvciBzZWVpbmcgIk92ZXJmbG93IiBpbiB0aGUKK3NuYXBzaG90IHN0YXR1cy4gIFNvIHN1cHBvcnRlZCBzdG9yZSB0eXBlcyBhcmUgIlAiLCAiUE8iIGFuZCAiTiIuCisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gcGVyc2lzdGVudCBhbmQgdHJhbnNpZW50IGlzIHdpdGggdHJhbnNpZW50CitzbmFwc2hvdHMgbGVzcyBtZXRhZGF0YSBtdXN0IGJlIHNhdmVkIG9uIGRpc2sgLSB0aGV5IGNhbiBiZSBrZXB0IGluCittZW1vcnkgYnkgdGhlIGtlcm5lbC4KKworCisqIHNuYXBzaG90LW1lcmdlIDxvcmlnaW4+IDxDT1cgZGV2aWNlPiA8cGVyc2lzdGVudD4gPGNodW5rc2l6ZT4KKwordGFrZXMgdGhlIHNhbWUgdGFibGUgYXJndW1lbnRzIGFzIHRoZSBzbmFwc2hvdCB0YXJnZXQgZXhjZXB0IGl0IG9ubHkKK3dvcmtzIHdpdGggcGVyc2lzdGVudCBzbmFwc2hvdHMuICBUaGlzIHRhcmdldCBhc3N1bWVzIHRoZSByb2xlIG9mIHRoZQorInNuYXBzaG90LW9yaWdpbiIgdGFyZ2V0IGFuZCBtdXN0IG5vdCBiZSBsb2FkZWQgaWYgdGhlICJzbmFwc2hvdC1vcmlnaW4iCitpcyBzdGlsbCBwcmVzZW50IGZvciA8b3JpZ2luPi4KKworQ3JlYXRlcyBhIG1lcmdpbmcgc25hcHNob3QgdGhhdCB0YWtlcyBjb250cm9sIG9mIHRoZSBjaGFuZ2VkIGNodW5rcworc3RvcmVkIGluIHRoZSA8Q09XIGRldmljZT4gb2YgYW4gZXhpc3Rpbmcgc25hcHNob3QsIHRocm91Z2ggYSBoYW5kb3ZlcgorcHJvY2VkdXJlLCBhbmQgbWVyZ2VzIHRoZXNlIGNodW5rcyBiYWNrIGludG8gdGhlIDxvcmlnaW4+LiAgT25jZSBtZXJnaW5nCitoYXMgc3RhcnRlZCAoaW4gdGhlIGJhY2tncm91bmQpIHRoZSA8b3JpZ2luPiBtYXkgYmUgb3BlbmVkIGFuZCB0aGUgbWVyZ2UKK3dpbGwgY29udGludWUgd2hpbGUgSS9PIGlzIGZsb3dpbmcgdG8gaXQuICBDaGFuZ2VzIHRvIHRoZSA8b3JpZ2luPiBhcmUKK2RlZmVycmVkIHVudGlsIHRoZSBtZXJnaW5nIHNuYXBzaG90J3MgY29ycmVzcG9uZGluZyBjaHVuayhzKSBoYXZlIGJlZW4KK21lcmdlZC4gIE9uY2UgbWVyZ2luZyBoYXMgc3RhcnRlZCB0aGUgc25hcHNob3QgZGV2aWNlLCBhc3NvY2lhdGVkIHdpdGgKK3RoZSAic25hcHNob3QiIHRhcmdldCwgd2lsbCByZXR1cm4gLUVJTyB3aGVuIGFjY2Vzc2VkLgorCisKK0hvdyBzbmFwc2hvdCBpcyB1c2VkIGJ5IExWTTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1doZW4geW91IGNyZWF0ZSB0aGUgZmlyc3QgTFZNMiBzbmFwc2hvdCBvZiBhIHZvbHVtZSwgZm91ciBkbSBkZXZpY2VzIGFyZSB1c2VkOgorCisxKSBhIGRldmljZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXBwaW5nIHRhYmxlIG9mIHRoZSBzb3VyY2Ugdm9sdW1lOworMikgYSBkZXZpY2UgdXNlZCBhcyB0aGUgPENPVyBkZXZpY2U+OworMykgYSAic25hcHNob3QiIGRldmljZSwgY29tYmluaW5nICMxIGFuZCAjMiwgd2hpY2ggaXMgdGhlIHZpc2libGUgc25hcHNob3QKKyAgIHZvbHVtZTsKKzQpIHRoZSAib3JpZ2luYWwiIHZvbHVtZSAod2hpY2ggdXNlcyB0aGUgZGV2aWNlIG51bWJlciB1c2VkIGJ5IHRoZSBvcmlnaW5hbAorICAgc291cmNlIHZvbHVtZSksIHdob3NlIHRhYmxlIGlzIHJlcGxhY2VkIGJ5IGEgInNuYXBzaG90LW9yaWdpbiIgbWFwcGluZworICAgZnJvbSBkZXZpY2UgIzEuCisKK0EgZml4ZWQgbmFtaW5nIHNjaGVtZSBpcyB1c2VkLCBzbyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKK2x2Y3JlYXRlIC1MIDFHIC1uIGJhc2Ugdm9sdW1lR3JvdXAKK2x2Y3JlYXRlIC1MIDEwME0gLS1zbmFwc2hvdCAtbiBzbmFwIHZvbHVtZUdyb3VwL2Jhc2UKKword2UnbGwgaGF2ZSB0aGlzIHNpdHVhdGlvbiAod2l0aCB2b2x1bWVzIGluIGFib3ZlIG9yZGVyKToKKworIyBkbXNldHVwIHRhYmxlfGdyZXAgdm9sdW1lR3JvdXAKKwordm9sdW1lR3JvdXAtYmFzZS1yZWFsOiAwIDIwOTcxNTIgbGluZWFyIDg6MTkgMzg0Cit2b2x1bWVHcm91cC1zbmFwLWNvdzogMCAyMDQ4MDAgbGluZWFyIDg6MTkgMjA5NzUzNgordm9sdW1lR3JvdXAtc25hcDogMCAyMDk3MTUyIHNuYXBzaG90IDI1NDoxMSAyNTQ6MTIgUCAxNgordm9sdW1lR3JvdXAtYmFzZTogMCAyMDk3MTUyIHNuYXBzaG90LW9yaWdpbiAyNTQ6MTEKKworIyBscyAtbEwgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtKgorYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAxMSAyOSBhZ28gMTg6MTUgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtYmFzZS1yZWFsCiticnctLS0tLS0tICAxIHJvb3Qgcm9vdCAyNTQsIDEyIDI5IGFnbyAxODoxNSAvZGV2L21hcHBlci92b2x1bWVHcm91cC1zbmFwLWNvdworYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAxMyAyOSBhZ28gMTg6MTUgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtc25hcAorYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAxMCAyOSBhZ28gMTg6MTQgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtYmFzZQorCisKK0hvdyBzbmFwc2hvdC1tZXJnZSBpcyB1c2VkIGJ5IExWTTIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0EgbWVyZ2luZyBzbmFwc2hvdCBhc3N1bWVzIHRoZSByb2xlIG9mIHRoZSAic25hcHNob3Qtb3JpZ2luIiB3aGlsZQorbWVyZ2luZy4gIEFzIHN1Y2ggdGhlICJzbmFwc2hvdC1vcmlnaW4iIGlzIHJlcGxhY2VkIHdpdGgKKyJzbmFwc2hvdC1tZXJnZSIuICBUaGUgIi1yZWFsIiBkZXZpY2UgaXMgbm90IGNoYW5nZWQgYW5kIHRoZSAiLWNvdyIKK2RldmljZSBpcyByZW5hbWVkIHRvIDxvcmlnaW4gbmFtZT4tY293IHRvIGFpZCBMVk0yJ3MgY2xlYW51cCBvZiB0aGUKK21lcmdpbmcgc25hcHNob3QgYWZ0ZXIgaXQgY29tcGxldGVzLiAgVGhlICJzbmFwc2hvdCIgdGhhdCBoYW5kcyBvdmVyIGl0cworQ09XIGRldmljZSB0byB0aGUgInNuYXBzaG90LW1lcmdlIiBpcyBkZWFjdGl2YXRlZCAodW5sZXNzIHVzaW5nIGx2Y2hhbmdlCistLXJlZnJlc2gpOyBidXQgaWYgaXQgaXMgbGVmdCBhY3RpdmUgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIEkvTyBlcnJvcnMuCisKK0Egc25hcHNob3Qgd2lsbCBtZXJnZSBpbnRvIGl0cyBvcmlnaW4gd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKK2x2Y29udmVydCAtLW1lcmdlIHZvbHVtZUdyb3VwL3NuYXAKKword2UnbGwgbm93IGhhdmUgdGhpcyBzaXR1YXRpb246CisKKyMgZG1zZXR1cCB0YWJsZXxncmVwIHZvbHVtZUdyb3VwCisKK3ZvbHVtZUdyb3VwLWJhc2UtcmVhbDogMCAyMDk3MTUyIGxpbmVhciA4OjE5IDM4NAordm9sdW1lR3JvdXAtYmFzZS1jb3c6IDAgMjA0ODAwIGxpbmVhciA4OjE5IDIwOTc1MzYKK3ZvbHVtZUdyb3VwLWJhc2U6IDAgMjA5NzE1MiBzbmFwc2hvdC1tZXJnZSAyNTQ6MTEgMjU0OjEyIFAgMTYKKworIyBscyAtbEwgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtKgorYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAxMSAyOSBhZ28gMTg6MTUgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtYmFzZS1yZWFsCiticnctLS0tLS0tICAxIHJvb3Qgcm9vdCAyNTQsIDEyIDI5IGFnbyAxODoxNiAvZGV2L21hcHBlci92b2x1bWVHcm91cC1iYXNlLWNvdworYnJ3LS0tLS0tLSAgMSByb290IHJvb3QgMjU0LCAxMCAyOSBhZ28gMTg6MTYgL2Rldi9tYXBwZXIvdm9sdW1lR3JvdXAtYmFzZQorCisKK0hvdyB0byBkZXRlcm1pbmUgd2hlbiBhIG1lcmdpbmcgaXMgY29tcGxldGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBzbmFwc2hvdC1tZXJnZSBhbmQgc25hcHNob3Qgc3RhdHVzIGxpbmVzIGVuZCB3aXRoOgorICA8c2VjdG9yc19hbGxvY2F0ZWQ+Lzx0b3RhbF9zZWN0b3JzPiA8bWV0YWRhdGFfc2VjdG9ycz4KKworQm90aCA8c2VjdG9yc19hbGxvY2F0ZWQ+IGFuZCA8dG90YWxfc2VjdG9ycz4gaW5jbHVkZSBib3RoIGRhdGEgYW5kIG1ldGFkYXRhLgorRHVyaW5nIG1lcmdpbmcsIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBhbGxvY2F0ZWQgZ2V0cyBzbWFsbGVyIGFuZAorc21hbGxlci4gIE1lcmdpbmcgaGFzIGZpbmlzaGVkIHdoZW4gdGhlIG51bWJlciBvZiBzZWN0b3JzIGhvbGRpbmcgZGF0YQoraXMgemVybywgaW4gb3RoZXIgd29yZHMgPHNlY3RvcnNfYWxsb2NhdGVkPiA9PSA8bWV0YWRhdGFfc2VjdG9ycz4uCisKK0hlcmUgaXMgYSBwcmFjdGljYWwgZXhhbXBsZSAodXNpbmcgYSBoeWJyaWQgb2YgbHZtIGFuZCBkbXNldHVwIGNvbW1hbmRzKToKKworIyBsdnMKKyAgTFYgICAgICBWRyAgICAgICAgICBBdHRyICAgTFNpemUgT3JpZ2luICBTbmFwJSAgTW92ZSBMb2cgQ29weSUgIENvbnZlcnQKKyAgYmFzZSAgICB2b2x1bWVHcm91cCBvd2ktYS0gNC4wMGcKKyAgc25hcCAgICB2b2x1bWVHcm91cCBzd2ktYS0gMS4wMGcgYmFzZSAgMTguOTcKKworIyBkbXNldHVwIHN0YXR1cyB2b2x1bWVHcm91cC1zbmFwCiswIDgzODg2MDggc25hcHNob3QgMzk3ODk2LzIwOTcxNTIgMTU2MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4gbWV0YWRhdGEgc2VjdG9ycworCisjIGx2Y29udmVydCAtLW1lcmdlIC1iIHZvbHVtZUdyb3VwL3NuYXAKKyAgTWVyZ2luZyBvZiB2b2x1bWUgc25hcCBzdGFydGVkLgorCisjIGx2cyB2b2x1bWVHcm91cC9zbmFwCisgIExWICAgICAgVkcgICAgICAgICAgQXR0ciAgIExTaXplIE9yaWdpbiAgU25hcCUgIE1vdmUgTG9nIENvcHklICBDb252ZXJ0CisgIGJhc2UgICAgdm9sdW1lR3JvdXAgT3dpLWEtIDQuMDBnICAgICAgICAgIDE3LjIzCisKKyMgZG1zZXR1cCBzdGF0dXMgdm9sdW1lR3JvdXAtYmFzZQorMCA4Mzg4NjA4IHNuYXBzaG90LW1lcmdlIDI4MTY4OC8yMDk3MTUyIDExMDQKKworIyBkbXNldHVwIHN0YXR1cyB2b2x1bWVHcm91cC1iYXNlCiswIDgzODg2MDggc25hcHNob3QtbWVyZ2UgMTgwNDgwLzIwOTcxNTIgNzEyCisKKyMgZG1zZXR1cCBzdGF0dXMgdm9sdW1lR3JvdXAtYmFzZQorMCA4Mzg4NjA4IHNuYXBzaG90LW1lcmdlIDE2LzIwOTcxNTIgMTYKKworTWVyZ2luZyBoYXMgZmluaXNoZWQuCisKKyMgbHZzCisgIExWICAgICAgVkcgICAgICAgICAgQXR0ciAgIExTaXplIE9yaWdpbiAgU25hcCUgIE1vdmUgTG9nIENvcHklICBDb252ZXJ0CisgIGJhc2UgICAgdm9sdW1lR3JvdXAgb3dpLWEtIDQuMDBnCmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL3N0YXRpc3RpY3MudHh0IGIvZG9jL2tlcm5lbC9zdGF0aXN0aWNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzBhYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC9zdGF0aXN0aWNzLnR4dApAQCAtMCwwICsxLDIyMyBAQAorRE0gc3RhdGlzdGljcworPT09PT09PT09PT09PQorCitEZXZpY2UgTWFwcGVyIHN1cHBvcnRzIHRoZSBjb2xsZWN0aW9uIG9mIEkvTyBzdGF0aXN0aWNzIG9uIHVzZXItZGVmaW5lZAorcmVnaW9ucyBvZiBhIERNIGRldmljZS4JIElmIG5vIHJlZ2lvbnMgYXJlIGRlZmluZWQgbm8gc3RhdGlzdGljcyBhcmUKK2NvbGxlY3RlZCBzbyB0aGVyZSBpc24ndCBhbnkgcGVyZm9ybWFuY2UgaW1wYWN0LiAgT25seSBiaW8tYmFzZWQgRE0KK2RldmljZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKK0VhY2ggdXNlci1kZWZpbmVkIHJlZ2lvbiBzcGVjaWZpZXMgYSBzdGFydGluZyBzZWN0b3IsIGxlbmd0aCBhbmQgc3RlcC4KK0luZGl2aWR1YWwgc3RhdGlzdGljcyB3aWxsIGJlIGNvbGxlY3RlZCBmb3IgZWFjaCBzdGVwLXNpemVkIGFyZWEgd2l0aGluCit0aGUgcmFuZ2Ugc3BlY2lmaWVkLgorCitUaGUgSS9PIHN0YXRpc3RpY3MgY291bnRlcnMgZm9yIGVhY2ggc3RlcC1zaXplZCBhcmVhIG9mIGEgcmVnaW9uIGFyZQoraW4gdGhlIHNhbWUgZm9ybWF0IGFzIC9zeXMvYmxvY2svKi9zdGF0IG9yIC9wcm9jL2Rpc2tzdGF0cyAoc2VlOgorRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dCkuICBCdXQgdHdvIGV4dHJhIGNvdW50ZXJzICgxMiBhbmQgMTMpIGFyZQorcHJvdmlkZWQ6IHRvdGFsIHRpbWUgc3BlbnQgcmVhZGluZyBhbmQgd3JpdGluZy4gIFdoZW4gdGhlIGhpc3RvZ3JhbQorYXJndW1lbnQgaXMgdXNlZCwgdGhlIDE0dGggcGFyYW1ldGVyIGlzIHJlcG9ydGVkIHRoYXQgcmVwcmVzZW50cyB0aGUKK2hpc3RvZ3JhbSBvZiBsYXRlbmNpZXMuICBBbGwgdGhlc2UgY291bnRlcnMgbWF5IGJlIGFjY2Vzc2VkIGJ5IHNlbmRpbmcKK3RoZSBAc3RhdHNfcHJpbnQgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgRE0gZGV2aWNlIHZpYSBkbXNldHVwLgorCitUaGUgcmVwb3J0ZWQgdGltZXMgYXJlIGluIG1pbGxpc2Vjb25kcyBhbmQgdGhlIGdyYW51bGFyaXR5IGRlcGVuZHMgb24KK3RoZSBrZXJuZWwgdGlja3MuICBXaGVuIHRoZSBvcHRpb24gcHJlY2lzZV90aW1lc3RhbXBzIGlzIHVzZWQsIHRoZQorcmVwb3J0ZWQgdGltZXMgYXJlIGluIG5hbm9zZWNvbmRzLgorCitFYWNoIHJlZ2lvbiBoYXMgYSBjb3JyZXNwb25kaW5nIHVuaXF1ZSBpZGVudGlmaWVyLCB3aGljaCB3ZSBjYWxsIGEKK3JlZ2lvbl9pZCwgdGhhdCBpcyBhc3NpZ25lZCB3aGVuIHRoZSByZWdpb24gaXMgY3JlYXRlZC4JIFRoZSByZWdpb25faWQKK211c3QgYmUgc3VwcGxpZWQgd2hlbiBxdWVyeWluZyBzdGF0aXN0aWNzIGFib3V0IHRoZSByZWdpb24sIGRlbGV0aW5nIHRoZQorcmVnaW9uLCBldGMuICBVbmlxdWUgcmVnaW9uX2lkcyBlbmFibGUgbXVsdGlwbGUgdXNlcnNwYWNlIHByb2dyYW1zIHRvCityZXF1ZXN0IGFuZCBwcm9jZXNzIHN0YXRpc3RpY3MgZm9yIHRoZSBzYW1lIERNIGRldmljZSB3aXRob3V0IHN0ZXBwaW5nCitvbiBlYWNoIG90aGVyJ3MgZGF0YS4KKworVGhlIGNyZWF0aW9uIG9mIERNIHN0YXRpc3RpY3Mgd2lsbCBhbGxvY2F0ZSBtZW1vcnkgdmlhIGttYWxsb2Mgb3IKK2ZhbGxiYWNrIHRvIHVzaW5nIHZtYWxsb2Mgc3BhY2UuICBBdCBtb3N0LCAxLzQgb2YgdGhlIG92ZXJhbGwgc3lzdGVtCittZW1vcnkgbWF5IGJlIGFsbG9jYXRlZCBieSBETSBzdGF0aXN0aWNzLiAgVGhlIGFkbWluIGNhbiBzZWUgaG93IG11Y2gKK21lbW9yeSBpcyB1c2VkIGJ5IHJlYWRpbmcKKy9zeXMvbW9kdWxlL2RtX21vZC9wYXJhbWV0ZXJzL3N0YXRzX2N1cnJlbnRfYWxsb2NhdGVkX2J5dGVzCisKK01lc3NhZ2VzCis9PT09PT09PQorCisgICAgQHN0YXRzX2NyZWF0ZSA8cmFuZ2U+IDxzdGVwPgorCQlbPG51bWJlcl9vZl9vcHRpb25hbF9hcmd1bWVudHM+IDxvcHRpb25hbF9hcmd1bWVudHM+Li4uXQorCQlbPHByb2dyYW1faWQ+IFs8YXV4X2RhdGE+XV0KKworCUNyZWF0ZSBhIG5ldyByZWdpb24gYW5kIHJldHVybiB0aGUgcmVnaW9uX2lkLgorCisJPHJhbmdlPgorCSAgIi0iIC0gd2hvbGUgZGV2aWNlCisJICAiPHN0YXJ0X3NlY3Rvcj4rPGxlbmd0aD4iIC0gYSByYW5nZSBvZiA8bGVuZ3RoPiA1MTItYnl0ZSBzZWN0b3JzCisJCQkJICAgICAgc3RhcnRpbmcgd2l0aCA8c3RhcnRfc2VjdG9yPi4KKworCTxzdGVwPgorCSAgIjxhcmVhX3NpemU+IiAtIHRoZSByYW5nZSBpcyBzdWJkaXZpZGVkIGludG8gYXJlYXMgZWFjaCBjb250YWluaW5nCisJCQkgIDxhcmVhX3NpemU+IHNlY3RvcnMuCisJICAiLzxudW1iZXJfb2ZfYXJlYXM+IiAtIHRoZSByYW5nZSBpcyBzdWJkaXZpZGVkIGludG8gdGhlIHNwZWNpZmllZAorCQkJCSBudW1iZXIgb2YgYXJlYXMuCisKKwk8bnVtYmVyX29mX29wdGlvbmFsX2FyZ3VtZW50cz4KKwkgIFRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgYXJndW1lbnRzCisKKwk8b3B0aW9uYWxfYXJndW1lbnRzPgorCSAgVGhlIGZvbGxvd2luZyBvcHRpb25hbCBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZAorCSAgcHJlY2lzZV90aW1lc3RhbXBzIC0gdXNlIHByZWNpc2UgdGltZXIgd2l0aCBuYW5vc2Vjb25kIHJlc29sdXRpb24KKwkJaW5zdGVhZCBvZiB0aGUgImppZmZpZXMiIHZhcmlhYmxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzCisJCXVzZWQsIHRoZSByZXN1bHRpbmcgdGltZXMgYXJlIGluIG5hbm9zZWNvbmRzIGluc3RlYWQgb2YKKwkJbWlsbGlzZWNvbmRzLiAgUHJlY2lzZSB0aW1lc3RhbXBzIGFyZSBhIGxpdHRsZSBiaXQgc2xvd2VyCisJCXRvIG9idGFpbiB0aGFuIGppZmZpZXMtYmFzZWQgdGltZXN0YW1wcy4KKwkgIGhpc3RvZ3JhbTpuMSxuMixuMyxuNCwuLi4gLSBjb2xsZWN0IGhpc3RvZ3JhbSBvZiBsYXRlbmNpZXMuICBUaGUKKwkJbnVtYmVycyBuMSwgbjIsIGV0YyBhcmUgdGltZXMgdGhhdCByZXByZXNlbnQgdGhlIGJvdW5kYXJpZXMKKwkJb2YgdGhlIGhpc3RvZ3JhbS4gIElmIHByZWNpc2VfdGltZXN0YW1wcyBpcyBub3QgdXNlZCwgdGhlCisJCXRpbWVzIGFyZSBpbiBtaWxsaXNlY29uZHMsIG90aGVyd2lzZSB0aGV5IGFyZSBpbgorCQluYW5vc2Vjb25kcy4gIEZvciBlYWNoIHJhbmdlLCB0aGUga2VybmVsIHdpbGwgcmVwb3J0IHRoZQorCQludW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBjb21wbGV0ZWQgd2l0aGluIHRoaXMgcmFuZ2UuIEZvcgorCQlleGFtcGxlLCBpZiB3ZSB1c2UgImhpc3RvZ3JhbToxMCwyMCwzMCIsIHRoZSBrZXJuZWwgd2lsbAorCQlyZXBvcnQgZm91ciBudW1iZXJzIGE6YjpjOmQuIGEgaXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cworCQl0aGF0IHRvb2sgMC0xMCBtcyB0byBjb21wbGV0ZSwgYiBpcyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzCisJCXRoYXQgdG9vayAxMC0yMCBtcyB0byBjb21wbGV0ZSwgYyBpcyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzCisJCXRoYXQgdG9vayAyMC0zMCBtcyB0byBjb21wbGV0ZSBhbmQgZCBpcyB0aGUgbnVtYmVyIG9mCisJCXJlcXVlc3RzIHRoYXQgdG9vayBtb3JlIHRoYW4gMzAgbXMgdG8gY29tcGxldGUuCisKKwk8cHJvZ3JhbV9pZD4KKwkgIEFuIG9wdGlvbmFsIHBhcmFtZXRlci4gIEEgbmFtZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMKKwkgIHRoZSB1c2Vyc3BhY2Ugb3duZXIgb2YgdGhlIHJhbmdlLiAgVGhpcyBncm91cHMgcmFuZ2VzIHRvZ2V0aGVyCisJICBzbyB0aGF0IHVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gaWRlbnRpZnkgdGhlIHJhbmdlcyB0aGV5CisJICBjcmVhdGVkIGFuZCBpZ25vcmUgdGhvc2UgY3JlYXRlZCBieSBvdGhlcnMuCisJICBUaGUga2VybmVsIHJldHVybnMgdGhpcyBzdHJpbmcgYmFjayBpbiB0aGUgb3V0cHV0IG9mCisJICBAc3RhdHNfbGlzdCBtZXNzYWdlLCBidXQgaXQgZG9lc24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIGVsc2UuCisJICBJZiB3ZSBvbWl0IHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLCBwcm9ncmFtIGlkIG11c3Qgbm90CisJICBiZSBhIG51bWJlciwgb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGludGVycHJldGVkIGFzIHRoZSBudW1iZXIgb2YKKwkgIG9wdGlvbmFsIGFyZ3VtZW50cy4KKworCTxhdXhfZGF0YT4KKwkgIEFuIG9wdGlvbmFsIHBhcmFtZXRlci4gIEEgd29yZCB0aGF0IHByb3ZpZGVzIGF1eGlsaWFyeSBkYXRhCisJICB0aGF0IGlzIHVzZWZ1bCB0byB0aGUgY2xpZW50IHByb2dyYW0gdGhhdCBjcmVhdGVkIHRoZSByYW5nZS4KKwkgIFRoZSBrZXJuZWwgcmV0dXJucyB0aGlzIHN0cmluZyBiYWNrIGluIHRoZSBvdXRwdXQgb2YKKwkgIEBzdGF0c19saXN0IG1lc3NhZ2UsIGJ1dCBpdCBkb2Vzbid0IHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZy4KKworICAgIEBzdGF0c19kZWxldGUgPHJlZ2lvbl9pZD4KKworCURlbGV0ZSB0aGUgcmVnaW9uIHdpdGggdGhlIHNwZWNpZmllZCBpZC4KKworCTxyZWdpb25faWQ+CisJICByZWdpb25faWQgcmV0dXJuZWQgZnJvbSBAc3RhdHNfY3JlYXRlCisKKyAgICBAc3RhdHNfY2xlYXIgPHJlZ2lvbl9pZD4KKworCUNsZWFyIGFsbCB0aGUgY291bnRlcnMgZXhjZXB0IHRoZSBpbi1mbGlnaHQgaS9vIGNvdW50ZXJzLgorCisJPHJlZ2lvbl9pZD4KKwkgIHJlZ2lvbl9pZCByZXR1cm5lZCBmcm9tIEBzdGF0c19jcmVhdGUKKworICAgIEBzdGF0c19saXN0IFs8cHJvZ3JhbV9pZD5dCisKKwlMaXN0IGFsbCByZWdpb25zIHJlZ2lzdGVyZWQgd2l0aCBAc3RhdHNfY3JlYXRlLgorCisJPHByb2dyYW1faWQ+CisJICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIuCisJICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgbWF0Y2hpbmcgcmVnaW9ucworCSAgYXJlIHJldHVybmVkLgorCSAgSWYgaXQgaXMgbm90IHNwZWNpZmllZCwgYWxsIHJlZ2lvbnMgYXJlIHJldHVybmVkLgorCisJT3V0cHV0IGZvcm1hdDoKKwkgIDxyZWdpb25faWQ+OiA8c3RhcnRfc2VjdG9yPis8bGVuZ3RoPiA8c3RlcD4gPHByb2dyYW1faWQ+IDxhdXhfZGF0YT4KKwkgICAgICAgIHByZWNpc2VfdGltZXN0YW1wcyBoaXN0b2dyYW06bjEsbjIsbjMsLi4uCisKKwlUaGUgc3RyaW5ncyAicHJlY2lzZV90aW1lc3RhbXBzIiBhbmQgImhpc3RvZ3JhbSIgYXJlIHByaW50ZWQgb25seQorCWlmIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyB0aGUgcmVnaW9uLgorCisgICAgQHN0YXRzX3ByaW50IDxyZWdpb25faWQ+IFs8c3RhcnRpbmdfbGluZT4gPG51bWJlcl9vZl9saW5lcz5dCisKKwlQcmludCBjb3VudGVycyBmb3IgZWFjaCBzdGVwLXNpemVkIGFyZWEgb2YgYSByZWdpb24uCisKKwk8cmVnaW9uX2lkPgorCSAgcmVnaW9uX2lkIHJldHVybmVkIGZyb20gQHN0YXRzX2NyZWF0ZQorCisJPHN0YXJ0aW5nX2xpbmU+CisJICBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIGxpbmUgaW4gdGhlIG91dHB1dC4KKwkgIElmIG9taXR0ZWQsIGFsbCBsaW5lcyBhcmUgcmV0dXJuZWQuCisKKwk8bnVtYmVyX29mX2xpbmVzPgorCSAgVGhlIG51bWJlciBvZiBsaW5lcyB0byBpbmNsdWRlIGluIHRoZSBvdXRwdXQuCisJICBJZiBvbWl0dGVkLCBhbGwgbGluZXMgYXJlIHJldHVybmVkLgorCisJT3V0cHV0IGZvcm1hdCBmb3IgZWFjaCBzdGVwLXNpemVkIGFyZWEgb2YgYSByZWdpb246CisKKwkgIDxzdGFydF9zZWN0b3I+KzxsZW5ndGg+IGNvdW50ZXJzCisKKwkgIFRoZSBmaXJzdCAxMSBjb3VudGVycyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMKKwkgIC9zeXMvYmxvY2svKi9zdGF0IG9yIC9wcm9jL2Rpc2tzdGF0cy4KKworCSAgUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vaW9zdGF0cy50eHQgZm9yIGRldGFpbHMuCisKKwkgIDEuIHRoZSBudW1iZXIgb2YgcmVhZHMgY29tcGxldGVkCisJICAyLiB0aGUgbnVtYmVyIG9mIHJlYWRzIG1lcmdlZAorCSAgMy4gdGhlIG51bWJlciBvZiBzZWN0b3JzIHJlYWQKKwkgIDQuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IHJlYWRpbmcKKwkgIDUuIHRoZSBudW1iZXIgb2Ygd3JpdGVzIGNvbXBsZXRlZAorCSAgNi4gdGhlIG51bWJlciBvZiB3cml0ZXMgbWVyZ2VkCisJICA3LiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgd3JpdHRlbgorCSAgOC4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgd3JpdGluZworCSAgOS4gdGhlIG51bWJlciBvZiBJL09zIGN1cnJlbnRseSBpbiBwcm9ncmVzcworCSAgMTAuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGRvaW5nIEkvT3MKKwkgIDExLiB0aGUgd2VpZ2h0ZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBkb2luZyBJL09zCisKKwkgIEFkZGl0aW9uYWwgY291bnRlcnM6CisJICAxMi4gdGhlIHRvdGFsIHRpbWUgc3BlbnQgcmVhZGluZyBpbiBtaWxsaXNlY29uZHMKKwkgIDEzLiB0aGUgdG90YWwgdGltZSBzcGVudCB3cml0aW5nIGluIG1pbGxpc2Vjb25kcworCisgICAgQHN0YXRzX3ByaW50X2NsZWFyIDxyZWdpb25faWQ+IFs8c3RhcnRpbmdfbGluZT4gPG51bWJlcl9vZl9saW5lcz5dCisKKwlBdG9taWNhbGx5IHByaW50IGFuZCB0aGVuIGNsZWFyIGFsbCB0aGUgY291bnRlcnMgZXhjZXB0IHRoZQorCWluLWZsaWdodCBpL28gY291bnRlcnMuCSBVc2VmdWwgd2hlbiB0aGUgY2xpZW50IGNvbnN1bWluZyB0aGUKKwlzdGF0aXN0aWNzIGRvZXMgbm90IHdhbnQgdG8gbG9zZSBhbnkgc3RhdGlzdGljcyAodGhvc2UgdXBkYXRlZAorCWJldHdlZW4gcHJpbnRpbmcgYW5kIGNsZWFyaW5nKS4KKworCTxyZWdpb25faWQ+CisJICByZWdpb25faWQgcmV0dXJuZWQgZnJvbSBAc3RhdHNfY3JlYXRlCisKKwk8c3RhcnRpbmdfbGluZT4KKwkgIFRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgbGluZSBpbiB0aGUgb3V0cHV0LgorCSAgSWYgb21pdHRlZCwgYWxsIGxpbmVzIGFyZSBwcmludGVkIGFuZCB0aGVuIGNsZWFyZWQuCisKKwk8bnVtYmVyX29mX2xpbmVzPgorCSAgVGhlIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLgorCSAgSWYgb21pdHRlZCwgYWxsIGxpbmVzIGFyZSBwcmludGVkIGFuZCB0aGVuIGNsZWFyZWQuCisKKyAgICBAc3RhdHNfc2V0X2F1eCA8cmVnaW9uX2lkPiA8YXV4X2RhdGE+CisKKwlTdG9yZSBhdXhpbGlhcnkgZGF0YSBhdXhfZGF0YSBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24uCisKKwk8cmVnaW9uX2lkPgorCSAgcmVnaW9uX2lkIHJldHVybmVkIGZyb20gQHN0YXRzX2NyZWF0ZQorCisJPGF1eF9kYXRhPgorCSAgVGhlIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgZGF0YSB3aGljaCBpcyB1c2VmdWwgdG8gdGhlIGNsaWVudAorCSAgcHJvZ3JhbSB0aGF0IGNyZWF0ZWQgdGhlIHJhbmdlLiAgVGhlIGtlcm5lbCByZXR1cm5zIHRoaXMKKwkgIHN0cmluZyBiYWNrIGluIHRoZSBvdXRwdXQgb2YgQHN0YXRzX2xpc3QgbWVzc2FnZSwgYnV0IGl0CisJICBkb2Vzbid0IHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZy4KKworRXhhbXBsZXMKKz09PT09PT09CisKK1N1YmRpdmlkZSB0aGUgRE0gZGV2aWNlICd2b2wnIGludG8gMTAwIHBpZWNlcyBhbmQgc3RhcnQgY29sbGVjdGluZworc3RhdGlzdGljcyBvbiB0aGVtOgorCisgIGRtc2V0dXAgbWVzc2FnZSB2b2wgMCBAc3RhdHNfY3JlYXRlIC0gLzEwMAorCitTZXQgdGhlIGF1eGlsaWFyeSBkYXRhIHN0cmluZyB0byAiZm9vIGJhciBiYXoiICh0aGUgZXNjYXBlIGZvciBlYWNoCitzcGFjZSBtdXN0IGFsc28gYmUgZXNjYXBlZCwgb3RoZXJ3aXNlIHRoZSBzaGVsbCB3aWxsIGNvbnN1bWUgdGhlbSk6CisKKyAgZG1zZXR1cCBtZXNzYWdlIHZvbCAwIEBzdGF0c19zZXRfYXV4IDAgZm9vXFwgYmFyXFwgYmF6CisKK0xpc3QgdGhlIHN0YXRpc3RpY3M6CisKKyAgZG1zZXR1cCBtZXNzYWdlIHZvbCAwIEBzdGF0c19saXN0CisKK1ByaW50IHRoZSBzdGF0aXN0aWNzOgorCisgIGRtc2V0dXAgbWVzc2FnZSB2b2wgMCBAc3RhdHNfcHJpbnQgMAorCitEZWxldGUgdGhlIHN0YXRpc3RpY3M6CisKKyAgZG1zZXR1cCBtZXNzYWdlIHZvbCAwIEBzdGF0c19kZWxldGUgMApkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9zdHJpcGVkLnR4dCBiL2RvYy9rZXJuZWwvc3RyaXBlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmM2I5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9rZXJuZWwvc3RyaXBlZC50eHQKQEAgLTAsMCArMSw1NyBAQAorZG0tc3RyaXBlCis9PT09PT09PT0KKworRGV2aWNlLU1hcHBlcidzICJzdHJpcGVkIiB0YXJnZXQgaXMgdXNlZCB0byBjcmVhdGUgYSBzdHJpcGVkIChpLmUuIFJBSUQtMCkKK2RldmljZSBhY3Jvc3Mgb25lIG9yIG1vcmUgdW5kZXJseWluZyBkZXZpY2VzLiBEYXRhIGlzIHdyaXR0ZW4gaW4gImNodW5rcyIsCit3aXRoIGNvbnNlY3V0aXZlIGNodW5rcyByb3RhdGluZyBhbW9uZyB0aGUgdW5kZXJseWluZyBkZXZpY2VzLiBUaGlzIGNhbgorcG90ZW50aWFsbHkgcHJvdmlkZSBpbXByb3ZlZCBJL08gdGhyb3VnaHB1dCBieSB1dGlsaXppbmcgc2V2ZXJhbCBwaHlzaWNhbAorZGV2aWNlcyBpbiBwYXJhbGxlbC4KKworUGFyYW1ldGVyczogPG51bSBkZXZzPiA8Y2h1bmsgc2l6ZT4gWzxkZXYgcGF0aD4gPG9mZnNldD5dKworICAgIDxudW0gZGV2cz46IE51bWJlciBvZiB1bmRlcmx5aW5nIGRldmljZXMuCisgICAgPGNodW5rIHNpemU+OiBTaXplIG9mIGVhY2ggY2h1bmsgb2YgZGF0YS4gTXVzdCBiZSBhdCBsZWFzdCBhcworICAgICAgICAgICAgICAgICAgbGFyZ2UgYXMgdGhlIHN5c3RlbSdzIFBBR0VfU0laRS4KKyAgICA8ZGV2IHBhdGg+OiBGdWxsIHBhdGhuYW1lIHRvIHRoZSB1bmRlcmx5aW5nIGJsb2NrLWRldmljZSwgb3IgYQorICAgICAgICAgICAgICAgICJtYWpvcjptaW5vciIgZGV2aWNlLW51bWJlci4KKyAgICA8b2Zmc2V0PjogU3RhcnRpbmcgc2VjdG9yIHdpdGhpbiB0aGUgZGV2aWNlLgorCitPbmUgb3IgbW9yZSB1bmRlcmx5aW5nIGRldmljZXMgY2FuIGJlIHNwZWNpZmllZC4gVGhlIHN0cmlwZWQgZGV2aWNlIHNpemUgbXVzdAorYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2h1bmsgc2l6ZSBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgdW5kZXJseWluZyBkZXZpY2VzLgorCisKK0V4YW1wbGUgc2NyaXB0cworPT09PT09PT09PT09PT09CisKK1tbCisjIS91c3IvYmluL3BlcmwgLXcKKyMgQ3JlYXRlIGEgc3RyaXBlZCBkZXZpY2UgYWNyb3NzIGFueSBudW1iZXIgb2YgdW5kZXJseWluZyBkZXZpY2VzLiBUaGUgZGV2aWNlCisjIHdpbGwgYmUgY2FsbGVkICJzdHJpcGVfZGV2IiBhbmQgaGF2ZSBhIGNodW5rLXNpemUgb2YgMTI4ay4KKworbXkgJGNodW5rX3NpemUgPSAxMjggKiAyOworbXkgJGRldl9uYW1lID0gInN0cmlwZV9kZXYiOworbXkgJG51bV9kZXZzID0gQEFSR1Y7CitteSBAZGV2cyA9IEBBUkdWOworbXkgKCRtaW5fZGV2X3NpemUsICRzdHJpcGVfZGV2X3NpemUsICRpKTsKKworaWYgKCEkbnVtX2RldnMpIHsKKyAgICAgICAgZGllKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBkZXZpY2VcbiIpOworfQorCiskbWluX2Rldl9zaXplID0gYGJsb2NrZGV2IC0tZ2V0c2l6ZSAkZGV2c1swXWA7Citmb3IgKCRpID0gMTsgJGkgPCAkbnVtX2RldnM7ICRpKyspIHsKKyAgICAgICAgbXkgJHRoaXNfc2l6ZSA9IGBibG9ja2RldiAtLWdldHNpemUgJGRldnNbJGldYDsKKyAgICAgICAgJG1pbl9kZXZfc2l6ZSA9ICgkbWluX2Rldl9zaXplIDwgJHRoaXNfc2l6ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJG1pbl9kZXZfc2l6ZSA6ICR0aGlzX3NpemU7Cit9CisKKyRzdHJpcGVfZGV2X3NpemUgPSAkbWluX2Rldl9zaXplICogJG51bV9kZXZzOworJHN0cmlwZV9kZXZfc2l6ZSAtPSAkc3RyaXBlX2Rldl9zaXplICUgKCRjaHVua19zaXplICogJG51bV9kZXZzKTsKKworJHRhYmxlID0gIjAgJHN0cmlwZV9kZXZfc2l6ZSBzdHJpcGVkICRudW1fZGV2cyAkY2h1bmtfc2l6ZSI7Citmb3IgKCRpID0gMDsgJGkgPCAkbnVtX2RldnM7ICRpKyspIHsKKyAgICAgICAgJHRhYmxlIC49ICIgJGRldnNbJGldIDAiOworfQorCitgZWNobyAkdGFibGUgfCBkbXNldHVwIGNyZWF0ZSAkZGV2X25hbWVgOworXV0KKwpkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC9zd2l0Y2gudHh0IGIvZG9jL2tlcm5lbC9zd2l0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDgzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL3N3aXRjaC50eHQKQEAgLTAsMCArMSwxMzggQEAKK2RtLXN3aXRjaAorPT09PT09PT09CisKK1RoZSBkZXZpY2UtbWFwcGVyIHN3aXRjaCB0YXJnZXQgY3JlYXRlcyBhIGRldmljZSB0aGF0IHN1cHBvcnRzIGFuCithcmJpdHJhcnkgbWFwcGluZyBvZiBmaXhlZC1zaXplIHJlZ2lvbnMgb2YgSS9PIGFjcm9zcyBhIGZpeGVkIHNldCBvZgorcGF0aHMuICBUaGUgcGF0aCB1c2VkIGZvciBhbnkgc3BlY2lmaWMgcmVnaW9uIGNhbiBiZSBzd2l0Y2hlZAorZHluYW1pY2FsbHkgYnkgc2VuZGluZyB0aGUgdGFyZ2V0IGEgbWVzc2FnZS4KKworSXQgbWFwcyBJL08gdG8gdW5kZXJseWluZyBibG9jayBkZXZpY2VzIGVmZmljaWVudGx5IHdoZW4gdGhlcmUgaXMgYSBsYXJnZQorbnVtYmVyIG9mIGZpeGVkLXNpemVkIGFkZHJlc3MgcmVnaW9ucyBidXQgdGhlcmUgaXMgbm8gc2ltcGxlIHBhdHRlcm4KK3RoYXQgd291bGQgYWxsb3cgZm9yIGEgY29tcGFjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWFwcGluZyBzdWNoIGFzCitkbS1zdHJpcGUuCisKK0JhY2tncm91bmQKKy0tLS0tLS0tLS0KKworRGVsbCBFcXVhbExvZ2ljIGFuZCBzb21lIG90aGVyIGlTQ1NJIHN0b3JhZ2UgYXJyYXlzIHVzZSBhIGRpc3RyaWJ1dGVkCitmcmFtZWxlc3MgYXJjaGl0ZWN0dXJlLiAgSW4gdGhpcyBhcmNoaXRlY3R1cmUsIHRoZSBzdG9yYWdlIGdyb3VwCitjb25zaXN0cyBvZiBhIG51bWJlciBvZiBkaXN0aW5jdCBzdG9yYWdlIGFycmF5cyAoIm1lbWJlcnMiKSBlYWNoIGhhdmluZworaW5kZXBlbmRlbnQgY29udHJvbGxlcnMsIGRpc2sgc3RvcmFnZSBhbmQgbmV0d29yayBhZGFwdGVycy4gIFdoZW4gYSBMVU4KK2lzIGNyZWF0ZWQgaXQgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBtZW1iZXJzLiAgVGhlIGRldGFpbHMgb2YgdGhlCitzcHJlYWRpbmcgYXJlIGhpZGRlbiBmcm9tIGluaXRpYXRvcnMgY29ubmVjdGVkIHRvIHRoaXMgc3RvcmFnZSBzeXN0ZW0uCitUaGUgc3RvcmFnZSBncm91cCBleHBvc2VzIGEgc2luZ2xlIHRhcmdldCBkaXNjb3ZlcnkgcG9ydGFsLCBubyBtYXR0ZXIKK2hvdyBtYW55IG1lbWJlcnMgYXJlIGJlaW5nIHVzZWQuICBXaGVuIGlTQ1NJIHNlc3Npb25zIGFyZSBjcmVhdGVkLCBlYWNoCitzZXNzaW9uIGlzIGNvbm5lY3RlZCB0byBhbiBldGggcG9ydCBvbiBhIHNpbmdsZSBtZW1iZXIuICBEYXRhIHRvIGEgTFVOCitjYW4gYmUgc2VudCBvbiBhbnkgaVNDU0kgc2Vzc2lvbiwgYW5kIGlmIHRoZSBibG9ja3MgYmVpbmcgYWNjZXNzZWQgYXJlCitzdG9yZWQgb24gYW5vdGhlciBtZW1iZXIgdGhlIEkvTyB3aWxsIGJlIGZvcndhcmRlZCBhcyByZXF1aXJlZC4gIFRoaXMKK2ZvcndhcmRpbmcgaXMgaW52aXNpYmxlIHRvIHRoZSBpbml0aWF0b3IuICBUaGUgc3RvcmFnZSBsYXlvdXQgaXMgYWxzbworZHluYW1pYywgYW5kIHRoZSBibG9ja3Mgc3RvcmVkIG9uIGRpc2sgbWF5IGJlIG1vdmVkIGZyb20gbWVtYmVyIHRvCittZW1iZXIgYXMgbmVlZGVkIHRvIGJhbGFuY2UgdGhlIGxvYWQuCisKK1RoaXMgYXJjaGl0ZWN0dXJlIHNpbXBsaWZpZXMgdGhlIG1hbmFnZW1lbnQgYW5kIGNvbmZpZ3VyYXRpb24gb2YgYm90aAordGhlIHN0b3JhZ2UgZ3JvdXAgYW5kIGluaXRpYXRvcnMuICBJbiBhIG11bHRpcGF0aGluZyBjb25maWd1cmF0aW9uLCBpdAoraXMgcG9zc2libGUgdG8gc2V0IHVwIG11bHRpcGxlIGlTQ1NJIHNlc3Npb25zIHRvIHVzZSBtdWx0aXBsZSBuZXR3b3JrCitpbnRlcmZhY2VzIG9uIGJvdGggdGhlIGhvc3QgYW5kIHRhcmdldCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUKK2luY3JlYXNlZCBuZXR3b3JrIGJhbmR3aWR0aC4gIEFuIGluaXRpYXRvciBjb3VsZCB1c2UgYSBzaW1wbGUgcm91bmQKK3JvYmluIGFsZ29yaXRobSB0byBzZW5kIEkvTyBhY3Jvc3MgYWxsIHBhdGhzIGFuZCBsZXQgdGhlIHN0b3JhZ2UgYXJyYXkKK21lbWJlcnMgZm9yd2FyZCBpdCBhcyBuZWNlc3NhcnksIGJ1dCB0aGVyZSBpcyBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSB0bworc2VuZGluZyBkYXRhIGRpcmVjdGx5IHRvIHRoZSBjb3JyZWN0IG1lbWJlci4KKworQSBkZXZpY2UtbWFwcGVyIHRhYmxlIGFscmVhZHkgbGV0cyB5b3UgbWFwIGRpZmZlcmVudCByZWdpb25zIG9mIGEKK2RldmljZSBvbnRvIGRpZmZlcmVudCB0YXJnZXRzLiAgSG93ZXZlciBpbiB0aGlzIGFyY2hpdGVjdHVyZSB0aGUgTFVOIGlzCitzcHJlYWQgd2l0aCBhbiBhZGRyZXNzIHJlZ2lvbiBzaXplIG9uIHRoZSBvcmRlciBvZiAxMHMgb2YgTUJzLCB3aGljaAorbWVhbnMgdGhlIHJlc3VsdGluZyB0YWJsZSBjb3VsZCBoYXZlIG1vcmUgdGhhbiBhIG1pbGxpb24gZW50cmllcyBhbmQKK2NvbnN1bWUgZmFyIHRvbyBtdWNoIG1lbW9yeS4KKworVXNpbmcgdGhpcyBkZXZpY2UtbWFwcGVyIHN3aXRjaCB0YXJnZXQgd2UgY2FuIG5vdyBidWlsZCBhIHR3by1sYXllcgorZGV2aWNlIGhpZXJhcmNoeToKKworICAgIFVwcGVyIFRpZXIgLSBEZXRlcm1pbmUgd2hpY2ggYXJyYXkgbWVtYmVyIHRoZSBJL08gc2hvdWxkIGJlIHNlbnQgdG8uCisgICAgTG93ZXIgVGllciAtIExvYWQgYmFsYW5jZSBhbW9uZ3N0IHBhdGhzIHRvIGEgcGFydGljdWxhciBtZW1iZXIuCisKK1RoZSBsb3dlciB0aWVyIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRtIG11bHRpcGF0aCBkZXZpY2UgZm9yIGVhY2ggbWVtYmVyLgorRWFjaCBvZiB0aGVzZSBtdWx0aXBhdGggZGV2aWNlcyBjb250YWlucyB0aGUgc2V0IG9mIHBhdGhzIGRpcmVjdGx5IHRvCit0aGUgYXJyYXkgbWVtYmVyIGluIG9uZSBwcmlvcml0eSBncm91cCwgYW5kIGxldmVyYWdlcyBleGlzdGluZyBwYXRoCitzZWxlY3RvcnMgdG8gbG9hZCBiYWxhbmNlIGFtb25nc3QgdGhlc2UgcGF0aHMuICBXZSBhbHNvIGJ1aWxkIGEKK25vbi1wcmVmZXJyZWQgcHJpb3JpdHkgZ3JvdXAgY29udGFpbmluZyBwYXRocyB0byBvdGhlciBhcnJheSBtZW1iZXJzIGZvcgorZmFpbG92ZXIgcmVhc29ucy4KKworVGhlIHVwcGVyIHRpZXIgY29uc2lzdHMgb2YgYSBzaW5nbGUgZG0tc3dpdGNoIGRldmljZS4gIFRoaXMgZGV2aWNlIHVzZXMKK2EgYml0bWFwIHRvIGxvb2sgdXAgdGhlIGxvY2F0aW9uIG9mIHRoZSBJL08gYW5kIGNob29zZSB0aGUgYXBwcm9wcmlhdGUKK2xvd2VyIHRpZXIgZGV2aWNlIHRvIHJvdXRlIHRoZSBJL08uICBCeSB1c2luZyBhIGJpdG1hcCB3ZSBhcmUgYWJsZSB0bwordXNlIDQgYml0cyBmb3IgZWFjaCBhZGRyZXNzIHJhbmdlIGluIGEgMTYgbWVtYmVyIGdyb3VwICh3aGljaCBpcyB2ZXJ5CitsYXJnZSBmb3IgdXMpLiAgVGhpcyBpcyBhIG11Y2ggZGVuc2VyIHJlcHJlc2VudGF0aW9uIHRoYW4gdGhlIGRtIHRhYmxlCitiLXRyZWUgY2FuIGFjaGlldmUuCisKK0NvbnN0cnVjdGlvbiBQYXJhbWV0ZXJzCis9PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgPG51bV9wYXRocz4gPHJlZ2lvbl9zaXplPiA8bnVtX29wdGlvbmFsX2FyZ3M+IFs8b3B0aW9uYWxfYXJncz4uLi5dCisgICAgWzxkZXZfcGF0aD4gPG9mZnNldD5dKworCis8bnVtX3BhdGhzPgorICAgIFRoZSBudW1iZXIgb2YgcGF0aHMgYWNyb3NzIHdoaWNoIHRvIGRpc3RyaWJ1dGUgdGhlIEkvTy4KKworPHJlZ2lvbl9zaXplPgorICAgIFRoZSBudW1iZXIgb2YgNTEyLWJ5dGUgc2VjdG9ycyBpbiBhIHJlZ2lvbi4gRWFjaCByZWdpb24gY2FuIGJlIHJlZGlyZWN0ZWQKKyAgICB0byBhbnkgb2YgdGhlIGF2YWlsYWJsZSBwYXRocy4KKworPG51bV9vcHRpb25hbF9hcmdzPgorICAgIFRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLiBDdXJyZW50bHksIG5vIG9wdGlvbmFsIGFyZ3VtZW50cworICAgIGFyZSBzdXBwb3J0ZWQgYW5kIHNvIHRoaXMgbXVzdCBiZSB6ZXJvLgorCis8ZGV2X3BhdGg+CisgICAgVGhlIGJsb2NrIGRldmljZSB0aGF0IHJlcHJlc2VudHMgYSBzcGVjaWZpYyBwYXRoIHRvIHRoZSBkZXZpY2UuCisKKzxvZmZzZXQ+CisgICAgVGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgZGF0YSBvbiB0aGUgc3BlY2lmaWMgPGRldl9wYXRoPiAoaW4gdW5pdHMKKyAgICBvZiA1MTItYnl0ZSBzZWN0b3JzKS4gVGhpcyBudW1iZXIgaXMgYWRkZWQgdG8gdGhlIHNlY3RvciBudW1iZXIgd2hlbgorICAgIGZvcndhcmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmljIHBhdGguIFR5cGljYWxseSBpdCBpcyB6ZXJvLgorCitNZXNzYWdlcworPT09PT09PT0KKworc2V0X3JlZ2lvbl9tYXBwaW5ncyA8aW5kZXg+OjxwYXRoX25yPiBbPGluZGV4Pl06PHBhdGhfbnI+IFs8aW5kZXg+XTo8cGF0aF9ucj4uLi4KKworTW9kaWZ5IHRoZSByZWdpb24gdGFibGUgYnkgc3BlY2lmeWluZyB3aGljaCByZWdpb25zIGFyZSByZWRpcmVjdGVkIHRvCit3aGljaCBwYXRocy4KKworPGluZGV4PgorICAgIFRoZSByZWdpb24gbnVtYmVyIChyZWdpb24gc2l6ZSB3YXMgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMpLgorICAgIElmIGluZGV4IGlzIG9taXR0ZWQsIHRoZSBuZXh0IHJlZ2lvbiAocHJldmlvdXMgaW5kZXggKyAxKSBpcyB1c2VkLgorICAgIEV4cHJlc3NlZCBpbiBoZXhhZGVjaW1hbCAoV0lUSE9VVCBhbnkgcHJlZml4IGxpa2UgMHgpLgorCis8cGF0aF9ucj4KKyAgICBUaGUgcGF0aCBudW1iZXIgaW4gdGhlIHJhbmdlIDAgLi4uICg8bnVtX3BhdGhzPiAtIDEpLgorICAgIEV4cHJlc3NlZCBpbiBoZXhhZGVjaW1hbCAoV0lUSE9VVCBhbnkgcHJlZml4IGxpa2UgMHgpLgorCitSPG4+LDxtPgorICAgIFRoaXMgcGFyYW1ldGVyIGFsbG93cyByZXBldGl0aXZlIHBhdHRlcm5zIHRvIGJlIGxvYWRlZCBxdWlja2x5LiA8bj4gYW5kIDxtPgorICAgIGFyZSBoZXhhZGVjaW1hbCBudW1iZXJzLiBUaGUgbGFzdCA8bj4gbWFwcGluZ3MgYXJlIHJlcGVhdGVkIGluIHRoZSBuZXh0IDxtPgorICAgIHNsb3RzLgorCitTdGF0dXMKKz09PT09PQorCitObyBzdGF0dXMgbGluZSBpcyByZXBvcnRlZC4KKworRXhhbXBsZQorPT09PT09PQorCitBc3N1bWUgdGhhdCB5b3UgaGF2ZSB2b2x1bWVzIHZnMS9zd2l0Y2gwIHZnMS9zd2l0Y2gxIHZnMS9zd2l0Y2gyIHdpdGgKK3RoZSBzYW1lIHNpemUuCisKK0NyZWF0ZSBhIHN3aXRjaCBkZXZpY2Ugd2l0aCA2NGtCIHJlZ2lvbiBzaXplOgorICAgIGRtc2V0dXAgY3JlYXRlIHN3aXRjaCAtLXRhYmxlICIwIGBibG9ja2RldiAtLWdldHNpemUgL2Rldi92ZzEvc3dpdGNoMGAKKwlzd2l0Y2ggMyAxMjggMCAvZGV2L3ZnMS9zd2l0Y2gwIDAgL2Rldi92ZzEvc3dpdGNoMSAwIC9kZXYvdmcxL3N3aXRjaDIgMCIKKworU2V0IG1hcHBpbmdzIGZvciB0aGUgZmlyc3QgNyBlbnRyaWVzIHRvIHBvaW50IHRvIGRldmljZXMgc3dpdGNoMCwgc3dpdGNoMSwKK3N3aXRjaDIsIHN3aXRjaDAsIHN3aXRjaDEsIHN3aXRjaDIsIHN3aXRjaDE6CisgICAgZG1zZXR1cCBtZXNzYWdlIHN3aXRjaCAwIHNldF9yZWdpb25fbWFwcGluZ3MgMDowIDoxIDoyIDowIDoxIDoyIDoxCisKK1NldCByZXBldGl0aXZlIG1hcHBpbmcuIFRoaXMgY29tbWFuZDoKKyAgICBkbXNldHVwIG1lc3NhZ2Ugc3dpdGNoIDAgc2V0X3JlZ2lvbl9tYXBwaW5ncyAxMDAwOjEgOjIgUjIsMTAKK2lzIGVxdWl2YWxlbnQgdG86CisgICAgZG1zZXR1cCBtZXNzYWdlIHN3aXRjaCAwIHNldF9yZWdpb25fbWFwcGluZ3MgMTAwMDoxIDoyIDoxIDoyIDoxIDoyIDoxIDoyIFwKKwk6MSA6MiA6MSA6MiA6MSA6MiA6MSA6MiA6MSA6MgorCmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL3RoaW4tcHJvdmlzaW9uaW5nLnR4dCBiL2RvYy9rZXJuZWwvdGhpbi1wcm92aXNpb25pbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTlhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL3RoaW4tcHJvdmlzaW9uaW5nLnR4dApAQCAtMCwwICsxLDM5NiBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYSBjb2xsZWN0aW9uIG9mIGRldmljZS1tYXBwZXIgdGFyZ2V0cyB0aGF0CitiZXR3ZWVuIHRoZW0gaW1wbGVtZW50IHRoaW4tcHJvdmlzaW9uaW5nIGFuZCBzbmFwc2hvdHMuCisKK1RoZSBtYWluIGhpZ2hsaWdodCBvZiB0aGlzIGltcGxlbWVudGF0aW9uLCBjb21wYXJlZCB0byB0aGUgcHJldmlvdXMKK2ltcGxlbWVudGF0aW9uIG9mIHNuYXBzaG90cywgaXMgdGhhdCBpdCBhbGxvd3MgbWFueSB2aXJ0dWFsIGRldmljZXMgdG8KK2JlIHN0b3JlZCBvbiB0aGUgc2FtZSBkYXRhIHZvbHVtZS4gIFRoaXMgc2ltcGxpZmllcyBhZG1pbmlzdHJhdGlvbiBhbmQKK2FsbG93cyB0aGUgc2hhcmluZyBvZiBkYXRhIGJldHdlZW4gdm9sdW1lcywgdGh1cyByZWR1Y2luZyBkaXNrIHVzYWdlLgorCitBbm90aGVyIHNpZ25pZmljYW50IGZlYXR1cmUgaXMgc3VwcG9ydCBmb3IgYW4gYXJiaXRyYXJ5IGRlcHRoIG9mCityZWN1cnNpdmUgc25hcHNob3RzIChzbmFwc2hvdHMgb2Ygc25hcHNob3RzIG9mIHNuYXBzaG90cyAuLi4pLiAgVGhlCitwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiBzbmFwc2hvdHMgZGlkIHRoaXMgYnkgY2hhaW5pbmcgdG9nZXRoZXIKK2xvb2t1cCB0YWJsZXMsIGFuZCBzbyBwZXJmb3JtYW5jZSB3YXMgTyhkZXB0aCkuICBUaGlzIG5ldworaW1wbGVtZW50YXRpb24gdXNlcyBhIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSB0byBhdm9pZCB0aGlzIGRlZ3JhZGF0aW9uCit3aXRoIGRlcHRoLiAgRnJhZ21lbnRhdGlvbiBtYXkgc3RpbGwgYmUgYW4gaXNzdWUsIGhvd2V2ZXIsIGluIHNvbWUKK3NjZW5hcmlvcy4KKworTWV0YWRhdGEgaXMgc3RvcmVkIG9uIGEgc2VwYXJhdGUgZGV2aWNlIGZyb20gZGF0YSwgZ2l2aW5nIHRoZQorYWRtaW5pc3RyYXRvciBzb21lIGZyZWVkb20sIGZvciBleGFtcGxlIHRvOgorCistIEltcHJvdmUgbWV0YWRhdGEgcmVzaWxpZW5jZSBieSBzdG9yaW5nIG1ldGFkYXRhIG9uIGEgbWlycm9yZWQgdm9sdW1lCisgIGJ1dCBkYXRhIG9uIGEgbm9uLW1pcnJvcmVkIG9uZS4KKworLSBJbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IHN0b3JpbmcgdGhlIG1ldGFkYXRhIG9uIFNTRC4KKworU3RhdHVzCis9PT09PT0KKworVGhlc2UgdGFyZ2V0cyBhcmUgdmVyeSBtdWNoIHN0aWxsIGluIHRoZSBFWFBFUklNRU5UQUwgc3RhdGUuICBQbGVhc2UKK2RvIG5vdCB5ZXQgcmVseSBvbiB0aGVtIGluIHByb2R1Y3Rpb24uICBCdXQgZG8gZXhwZXJpbWVudCBhbmQgb2ZmZXIgdXMKK2ZlZWRiYWNrLiAgRGlmZmVyZW50IHVzZSBjYXNlcyB3aWxsIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlCitjaGFyYWN0ZXJpc3RpY3MsIGZvciBleGFtcGxlIGR1ZSB0byBmcmFnbWVudGF0aW9uIG9mIHRoZSBkYXRhIHZvbHVtZS4KKworSWYgeW91IGZpbmQgdGhpcyBzb2Z0d2FyZSBpcyBub3QgcGVyZm9ybWluZyBhcyBleHBlY3RlZCBwbGVhc2UgbWFpbAorZG0tZGV2ZWxAcmVkaGF0LmNvbSB3aXRoIGRldGFpbHMgYW5kIHdlJ2xsIHRyeSBvdXIgYmVzdCB0byBpbXByb3ZlCit0aGluZ3MgZm9yIHlvdS4KKworVXNlcnNwYWNlIHRvb2xzIGZvciBjaGVja2luZyBhbmQgcmVwYWlyaW5nIHRoZSBtZXRhZGF0YSBhcmUgdW5kZXIKK2RldmVsb3BtZW50LgorCitDb29rYm9vaworPT09PT09PT0KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIHF1aWNrIHJlY2lwZXMgZm9yIHVzaW5nIHRoaW4gcHJvdmlzaW9uaW5nLgorVGhleSB1c2UgdGhlIGRtc2V0dXAgcHJvZ3JhbSB0byBjb250cm9sIHRoZSBkZXZpY2UtbWFwcGVyIGRyaXZlcgorZGlyZWN0bHkuICBFbmQgdXNlcnMgd2lsbCBiZSBhZHZpc2VkIHRvIHVzZSBhIGhpZ2hlci1sZXZlbCB2b2x1bWUKK21hbmFnZXIgc3VjaCBhcyBMVk0yIG9uY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KKworUG9vbCBkZXZpY2UKKy0tLS0tLS0tLS0tCisKK1RoZSBwb29sIGRldmljZSB0aWVzIHRvZ2V0aGVyIHRoZSBtZXRhZGF0YSB2b2x1bWUgYW5kIHRoZSBkYXRhIHZvbHVtZS4KK0l0IG1hcHMgSS9PIGxpbmVhcmx5IHRvIHRoZSBkYXRhIHZvbHVtZSBhbmQgdXBkYXRlcyB0aGUgbWV0YWRhdGEgdmlhCit0d28gbWVjaGFuaXNtczoKKworLSBGdW5jdGlvbiBjYWxscyBmcm9tIHRoZSB0aGluIHRhcmdldHMKKworLSBEZXZpY2UtbWFwcGVyICdtZXNzYWdlcycgZnJvbSB1c2Vyc3BhY2Ugd2hpY2ggY29udHJvbCB0aGUgY3JlYXRpb24gb2YgbmV3CisgIHZpcnR1YWwgZGV2aWNlcyBhbW9uZ3N0IG90aGVyIHRoaW5ncy4KKworU2V0dGluZyB1cCBhIGZyZXNoIHBvb2wgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2V0dGluZyB1cCBhIHBvb2wgZGV2aWNlIHJlcXVpcmVzIGEgdmFsaWQgbWV0YWRhdGEgZGV2aWNlLCBhbmQgYQorZGF0YSBkZXZpY2UuICBJZiB5b3UgZG8gbm90IGhhdmUgYW4gZXhpc3RpbmcgbWV0YWRhdGEgZGV2aWNlIHlvdSBjYW4KK21ha2Ugb25lIGJ5IHplcm9pbmcgdGhlIGZpcnN0IDRrIHRvIGluZGljYXRlIGVtcHR5IG1ldGFkYXRhLgorCisgICAgZGQgaWY9L2Rldi96ZXJvIG9mPSRtZXRhZGF0YV9kZXYgYnM9NDA5NiBjb3VudD0xCisKK1RoZSBhbW91bnQgb2YgbWV0YWRhdGEgeW91IG5lZWQgd2lsbCB2YXJ5IGFjY29yZGluZyB0byBob3cgbWFueSBibG9ja3MKK2FyZSBzaGFyZWQgYmV0d2VlbiB0aGluIGRldmljZXMgKGkuZS4gdGhyb3VnaCBzbmFwc2hvdHMpLiAgSWYgeW91IGhhdmUKK2xlc3Mgc2hhcmluZyB0aGFuIGF2ZXJhZ2UgeW91J2xsIG5lZWQgYSBsYXJnZXItdGhhbi1hdmVyYWdlIG1ldGFkYXRhIGRldmljZS4KKworQXMgYSBndWlkZSwgd2Ugc3VnZ2VzdCB5b3UgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGluIHRoZQorbWV0YWRhdGEgZGV2aWNlIGFzIDQ4ICogJGRhdGFfZGV2X3NpemUgLyAkZGF0YV9ibG9ja19zaXplIGJ1dCByb3VuZCBpdCB1cAordG8gMk1CIGlmIHRoZSBhbnN3ZXIgaXMgc21hbGxlci4gIElmIHlvdSdyZSBjcmVhdGluZyBsYXJnZSBudW1iZXJzIG9mCitzbmFwc2hvdHMgd2hpY2ggYXJlIHJlY29yZGluZyBsYXJnZSBhbW91bnRzIG9mIGNoYW5nZSwgeW91IG1heSBmaW5kIHlvdQorbmVlZCB0byBpbmNyZWFzZSB0aGlzLgorCitUaGUgbGFyZ2VzdCBzaXplIHN1cHBvcnRlZCBpcyAxNkdCOiBJZiB0aGUgZGV2aWNlIGlzIGxhcmdlciwKK2Egd2FybmluZyB3aWxsIGJlIGlzc3VlZCBhbmQgdGhlIGV4Y2VzcyBzcGFjZSB3aWxsIG5vdCBiZSB1c2VkLgorCitSZWxvYWRpbmcgYSBwb29sIHRhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBtYXkgcmVsb2FkIGEgcG9vbCdzIHRhYmxlLCBpbmRlZWQgdGhpcyBpcyBob3cgdGhlIHBvb2wgaXMgcmVzaXplZAoraWYgaXQgcnVucyBvdXQgb2Ygc3BhY2UuICAoTi5CLiBXaGlsZSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IG1ldGFkYXRhCitkZXZpY2Ugd2hlbiByZWxvYWRpbmcgaXMgbm90IGZvcmJpZGRlbiBhdCB0aGUgbW9tZW50LCB0aGluZ3Mgd2lsbCBnbword3JvbmcgaWYgaXQgZG9lcyBub3Qgcm91dGUgSS9PIHRvIGV4YWN0bHkgdGhlIHNhbWUgb24tZGlzayBsb2NhdGlvbiBhcworcHJldmlvdXNseS4pCisKK1VzaW5nIGFuIGV4aXN0aW5nIHBvb2wgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZG1zZXR1cCBjcmVhdGUgcG9vbCBcCisJLS10YWJsZSAiMCAyMDk3MTUyMCB0aGluLXBvb2wgJG1ldGFkYXRhX2RldiAkZGF0YV9kZXYgXAorCQkgJGRhdGFfYmxvY2tfc2l6ZSAkbG93X3dhdGVyX21hcmsiCisKKyRkYXRhX2Jsb2NrX3NpemUgZ2l2ZXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgZGlzayBzcGFjZSB0aGF0IGNhbiBiZQorYWxsb2NhdGVkIGF0IGEgdGltZSBleHByZXNzZWQgaW4gdW5pdHMgb2YgNTEyLWJ5dGUgc2VjdG9ycy4KKyRkYXRhX2Jsb2NrX3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEyOCAoNjRLQikgYW5kIDIwOTcxNTIgKDFHQikgYW5kIGEKK211bHRpcGxlIG9mIDEyOCAoNjRLQikuICAkZGF0YV9ibG9ja19zaXplIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZQordGhpbi1wb29sIGlzIGNyZWF0ZWQuICBQZW9wbGUgcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4gdGhpbiBwcm92aXNpb25pbmcKK21heSB3YW50IHRvIHVzZSBhIHZhbHVlIHN1Y2ggYXMgMTAyNCAoNTEyS0IpLiAgUGVvcGxlIGRvaW5nIGxvdHMgb2YKK3NuYXBzaG90dGluZyBtYXkgd2FudCBhIHNtYWxsZXIgdmFsdWUgc3VjaCBhcyAxMjggKDY0S0IpLiAgSWYgeW91IGFyZQorbm90IHplcm9pbmcgbmV3bHktYWxsb2NhdGVkIGRhdGEsIGEgbGFyZ2VyICRkYXRhX2Jsb2NrX3NpemUgaW4gdGhlCityZWdpb24gb2YgMjU2MDAwICgxMjhNQikgaXMgc3VnZ2VzdGVkLgorCiskbG93X3dhdGVyX21hcmsgaXMgZXhwcmVzc2VkIGluIGJsb2NrcyBvZiBzaXplICRkYXRhX2Jsb2NrX3NpemUuICBJZgorZnJlZSBzcGFjZSBvbiB0aGUgZGF0YSBkZXZpY2UgZHJvcHMgYmVsb3cgdGhpcyBsZXZlbCB0aGVuIGEgZG0gZXZlbnQKK3dpbGwgYmUgdHJpZ2dlcmVkIHdoaWNoIGEgdXNlcnNwYWNlIGRhZW1vbiBzaG91bGQgY2F0Y2ggYWxsb3dpbmcgaXQgdG8KK2V4dGVuZCB0aGUgcG9vbCBkZXZpY2UuICBPbmx5IG9uZSBzdWNoIGV2ZW50IHdpbGwgYmUgc2VudC4KK1Jlc3VtaW5nIGEgZGV2aWNlIHdpdGggYSBuZXcgdGFibGUgaXRzZWxmIHRyaWdnZXJzIGFuIGV2ZW50IHNvIHRoZQordXNlcnNwYWNlIGRhZW1vbiBjYW4gdXNlIHRoaXMgdG8gZGV0ZWN0IGEgc2l0dWF0aW9uIHdoZXJlIGEgbmV3IHRhYmxlCithbHJlYWR5IGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4KKworQSBsb3cgd2F0ZXIgbWFyayBmb3IgdGhlIG1ldGFkYXRhIGRldmljZSBpcyBtYWludGFpbmVkIGluIHRoZSBrZXJuZWwgYW5kCit3aWxsIHRyaWdnZXIgYSBkbSBldmVudCBpZiBmcmVlIHNwYWNlIG9uIHRoZSBtZXRhZGF0YSBkZXZpY2UgZHJvcHMgYmVsb3cKK2l0LgorCitVcGRhdGluZyBvbi1kaXNrIG1ldGFkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uLWRpc2sgbWV0YWRhdGEgaXMgY29tbWl0dGVkIGV2ZXJ5IHRpbWUgYSBGTFVTSCBvciBGVUEgYmlvIGlzIHdyaXR0ZW4uCitJZiBubyBzdWNoIHJlcXVlc3RzIGFyZSBtYWRlIHRoZW4gY29tbWl0cyB3aWxsIG9jY3VyIGV2ZXJ5IHNlY29uZC4gIFRoaXMKK21lYW5zIHRoZSB0aGluLXByb3Zpc2lvbmluZyB0YXJnZXQgYmVoYXZlcyBsaWtlIGEgcGh5c2ljYWwgZGlzayB0aGF0IGhhcworYSB2b2xhdGlsZSB3cml0ZSBjYWNoZS4gIElmIHBvd2VyIGlzIGxvc3QgeW91IG1heSBsb3NlIHNvbWUgcmVjZW50Cit3cml0ZXMuICBUaGUgbWV0YWRhdGEgc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50IGluIHNwaXRlIG9mIGFueSBjcmFzaC4KKworSWYgZGF0YSBzcGFjZSBpcyBleGhhdXN0ZWQgdGhlIHBvb2wgd2lsbCBlaXRoZXIgZXJyb3Igb3IgcXVldWUgSU8KK2FjY29yZGluZyB0byB0aGUgY29uZmlndXJhdGlvbiAoc2VlOiBlcnJvcl9pZl9ub19zcGFjZSkuICBJZiBtZXRhZGF0YQorc3BhY2UgaXMgZXhoYXVzdGVkIG9yIGEgbWV0YWRhdGEgb3BlcmF0aW9uIGZhaWxzOiB0aGUgcG9vbCB3aWxsIGVycm9yIElPCit1bnRpbCB0aGUgcG9vbCBpcyB0YWtlbiBvZmZsaW5lIGFuZCByZXBhaXIgaXMgcGVyZm9ybWVkIHRvIDEpIGZpeCBhbnkKK3BvdGVudGlhbCBpbmNvbnNpc3RlbmNpZXMgYW5kIDIpIGNsZWFyIHRoZSBmbGFnIHRoYXQgaW1wb3NlcyByZXBhaXIuCitPbmNlIHRoZSBwb29sJ3MgbWV0YWRhdGEgZGV2aWNlIGlzIHJlcGFpcmVkIGl0IG1heSBiZSByZXNpemVkLCB3aGljaAord2lsbCBhbGxvdyB0aGUgcG9vbCB0byByZXR1cm4gdG8gbm9ybWFsIG9wZXJhdGlvbi4gIE5vdGUgdGhhdCBpZiBhIHBvb2wKK2lzIGZsYWdnZWQgYXMgbmVlZGluZyByZXBhaXIsIHRoZSBwb29sJ3MgZGF0YSBhbmQgbWV0YWRhdGEgZGV2aWNlcworY2Fubm90IGJlIHJlc2l6ZWQgdW50aWwgcmVwYWlyIGlzIHBlcmZvcm1lZC4gIEl0IHNob3VsZCBhbHNvIGJlIG5vdGVkCit0aGF0IHdoZW4gdGhlIHBvb2wncyBtZXRhZGF0YSBzcGFjZSBpcyBleGhhdXN0ZWQgdGhlIGN1cnJlbnQgbWV0YWRhdGEKK3RyYW5zYWN0aW9uIGlzIGFib3J0ZWQuICBHaXZlbiB0aGF0IHRoZSBwb29sIHdpbGwgY2FjaGUgSU8gd2hvc2UKK2NvbXBsZXRpb24gbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZCB0byB1cHBlciBJTyBsYXllcnMKKyhlLmcuIGZpbGVzeXN0ZW0pIGl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGNvbnNpc3RlbmN5IGNoZWNrcworKGUuZy4gZnNjaykgYmUgcGVyZm9ybWVkIG9uIHRob3NlIGxheWVycyB3aGVuIHJlcGFpciBvZiB0aGUgcG9vbCBpcworcmVxdWlyZWQuCisKK1RoaW4gcHJvdmlzaW9uaW5nCistLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDcmVhdGluZyBhIG5ldyB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRvIGNyZWF0ZSBhIG5ldyB0aGlubHktIHByb3Zpc2lvbmVkIHZvbHVtZSB5b3UgbXVzdCBzZW5kIGEgbWVzc2FnZSB0byBhbgorICBhY3RpdmUgcG9vbCBkZXZpY2UsIC9kZXYvbWFwcGVyL3Bvb2wgaW4gdGhpcyBleGFtcGxlLgorCisgICAgZG1zZXR1cCBtZXNzYWdlIC9kZXYvbWFwcGVyL3Bvb2wgMCAiY3JlYXRlX3RoaW4gMCIKKworICBIZXJlICcwJyBpcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICBJdCdzIHVwCisgIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgYW5kIG1hbmFnZSB0aGVzZSBpZGVudGlmaWVycy4gIElmIHRoZQorICBpZGVudGlmaWVyIGlzIGFscmVhZHkgaW4gdXNlLCB0aGUgbWVzc2FnZSB3aWxsIGZhaWwgd2l0aCAtRUVYSVNULgorCitpaSkgVXNpbmcgYSB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRoaW5seS1wcm92aXNpb25lZCB2b2x1bWVzIGFyZSBhY3RpdmF0ZWQgdXNpbmcgdGhlICd0aGluJyB0YXJnZXQ6CisKKyAgICBkbXNldHVwIGNyZWF0ZSB0aGluIC0tdGFibGUgIjAgMjA5NzE1MiB0aGluIC9kZXYvbWFwcGVyL3Bvb2wgMCIKKworICBUaGUgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB0aGlucCBkZXZpY2UuCisKK0ludGVybmFsIHNuYXBzaG90cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK2kpIENyZWF0aW5nIGFuIGludGVybmFsIHNuYXBzaG90LgorCisgIFNuYXBzaG90cyBhcmUgY3JlYXRlZCB3aXRoIGFub3RoZXIgbWVzc2FnZSB0byB0aGUgcG9vbC4KKworICBOLkIuICBJZiB0aGUgb3JpZ2luIGRldmljZSB0aGF0IHlvdSB3aXNoIHRvIHNuYXBzaG90IGlzIGFjdGl2ZSwgeW91CisgIG11c3Qgc3VzcGVuZCBpdCBiZWZvcmUgY3JlYXRpbmcgdGhlIHNuYXBzaG90IHRvIGF2b2lkIGNvcnJ1cHRpb24uCisgIFRoaXMgaXMgTk9UIGVuZm9yY2VkIGF0IHRoZSBtb21lbnQsIHNvIHBsZWFzZSBiZSBjYXJlZnVsIQorCisgICAgZG1zZXR1cCBzdXNwZW5kIC9kZXYvbWFwcGVyL3RoaW4KKyAgICBkbXNldHVwIG1lc3NhZ2UgL2Rldi9tYXBwZXIvcG9vbCAwICJjcmVhdGVfc25hcCAxIDAiCisgICAgZG1zZXR1cCByZXN1bWUgL2Rldi9tYXBwZXIvdGhpbgorCisgIEhlcmUgJzEnIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICAnMCcgaXMgdGhlCisgIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW4gZGV2aWNlLgorCitpaSkgVXNpbmcgYW4gaW50ZXJuYWwgc25hcHNob3QuCisKKyAgT25jZSBjcmVhdGVkLCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55IGNvbm5lY3Rpb24KKyAgYmV0d2VlbiB0aGUgb3JpZ2luIGFuZCB0aGUgc25hcHNob3QuICBJbmRlZWQgdGhlIHNuYXBzaG90IGlzIG5vCisgIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgZGV2aWNlIGFuZCBjYW4gYmUKKyAgc25hcHNob3R0ZWQgaXRzZWxmIHZpYSB0aGUgc2FtZSBtZXRob2QuICBJdCdzIHBlcmZlY3RseSBsZWdhbCB0bworICBoYXZlIG9ubHkgb25lIG9mIHRoZW0gYWN0aXZlLCBhbmQgdGhlcmUncyBubyBvcmRlcmluZyByZXF1aXJlbWVudCBvbgorICBhY3RpdmF0aW5nIG9yIHJlbW92aW5nIHRoZW0gYm90aC4gIChUaGlzIGRpZmZlcnMgZnJvbSBjb252ZW50aW9uYWwKKyAgZGV2aWNlLW1hcHBlciBzbmFwc2hvdHMuKQorCisgIEFjdGl2YXRlIGl0IGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lOgorCisgICAgZG1zZXR1cCBjcmVhdGUgc25hcCAtLXRhYmxlICIwIDIwOTcxNTIgdGhpbiAvZGV2L21hcHBlci9wb29sIDEiCisKK0V4dGVybmFsIHNuYXBzaG90cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gdXNlIGFuIGV4dGVybmFsIF9yZWFkIG9ubHlfIGRldmljZSBhcyBhbiBvcmlnaW4gZm9yIGEKK3RoaW5seS1wcm92aXNpb25lZCB2b2x1bWUuICBBbnkgcmVhZCB0byBhbiB1bnByb3Zpc2lvbmVkIGFyZWEgb2YgdGhlCit0aGluIGRldmljZSB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBvcmlnaW4uICBXcml0ZXMgdHJpZ2dlcgordGhlIGFsbG9jYXRpb24gb2YgbmV3IGJsb2NrcyBhcyB1c3VhbC4KKworT25lIHVzZSBjYXNlIGZvciB0aGlzIGlzIFZNIGhvc3RzIHRoYXQgd2FudCB0byBydW4gZ3Vlc3RzIG9uCit0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lcyBidXQgaGF2ZSB0aGUgYmFzZSBpbWFnZSBvbiBhbm90aGVyIGRldmljZQorKHBvc3NpYmx5IHNoYXJlZCBiZXR3ZWVuIG1hbnkgVk1zKS4KKworWW91IG11c3Qgbm90IHdyaXRlIHRvIHRoZSBvcmlnaW4gZGV2aWNlIGlmIHlvdSB1c2UgdGhpcyB0ZWNobmlxdWUhCitPZiBjb3Vyc2UsIHlvdSBtYXkgd3JpdGUgdG8gdGhlIHRoaW4gZGV2aWNlIGFuZCB0YWtlIGludGVybmFsIHNuYXBzaG90cworb2YgdGhlIHRoaW4gdm9sdW1lLgorCitpKSBDcmVhdGluZyBhIHNuYXBzaG90IG9mIGFuIGV4dGVybmFsIGRldmljZQorCisgIFRoaXMgaXMgdGhlIHNhbWUgYXMgY3JlYXRpbmcgYSB0aGluIGRldmljZS4KKyAgWW91IGRvbid0IG1lbnRpb24gdGhlIG9yaWdpbiBhdCB0aGlzIHN0YWdlLgorCisgICAgZG1zZXR1cCBtZXNzYWdlIC9kZXYvbWFwcGVyL3Bvb2wgMCAiY3JlYXRlX3RoaW4gMCIKKworaWkpIFVzaW5nIGEgc25hcHNob3Qgb2YgYW4gZXh0ZXJuYWwgZGV2aWNlLgorCisgIEFwcGVuZCBhbiBleHRyYSBwYXJhbWV0ZXIgdG8gdGhlIHRoaW4gdGFyZ2V0IHNwZWNpZnlpbmcgdGhlIG9yaWdpbjoKKworICAgIGRtc2V0dXAgY3JlYXRlIHNuYXAgLS10YWJsZSAiMCAyMDk3MTUyIHRoaW4gL2Rldi9tYXBwZXIvcG9vbCAwIC9kZXYvaW1hZ2UiCisKKyAgTi5CLiBBbGwgZGVzY2VuZGFudHMgKGludGVybmFsIHNuYXBzaG90cykgb2YgdGhpcyBzbmFwc2hvdCByZXF1aXJlIHRoZQorICBzYW1lIGV4dHJhIG9yaWdpbiBwYXJhbWV0ZXIuCisKK0RlYWN0aXZhdGlvbgorLS0tLS0tLS0tLS0tCisKK0FsbCBkZXZpY2VzIHVzaW5nIGEgcG9vbCBtdXN0IGJlIGRlYWN0aXZhdGVkIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYKK2NhbiBiZS4KKworICAgIGRtc2V0dXAgcmVtb3ZlIHRoaW4KKyAgICBkbXNldHVwIHJlbW92ZSBzbmFwCisgICAgZG1zZXR1cCByZW1vdmUgcG9vbAorCitSZWZlcmVuY2UKKz09PT09PT09PQorCisndGhpbi1wb29sJyB0YXJnZXQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDb25zdHJ1Y3RvcgorCisgICAgdGhpbi1wb29sIDxtZXRhZGF0YSBkZXY+IDxkYXRhIGRldj4gPGRhdGEgYmxvY2sgc2l6ZSAoc2VjdG9ycyk+IFwKKwkgICAgICA8bG93IHdhdGVyIG1hcmsgKGJsb2Nrcyk+IFs8bnVtYmVyIG9mIGZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisKKyAgICBPcHRpb25hbCBmZWF0dXJlIGFyZ3VtZW50czoKKworICAgICAgc2tpcF9ibG9ja196ZXJvaW5nOiBTa2lwIHRoZSB6ZXJvaW5nIG9mIG5ld2x5LXByb3Zpc2lvbmVkIGJsb2Nrcy4KKworICAgICAgaWdub3JlX2Rpc2NhcmQ6IERpc2FibGUgZGlzY2FyZCBzdXBwb3J0LgorCisgICAgICBub19kaXNjYXJkX3Bhc3Nkb3duOiBEb24ndCBwYXNzIGRpc2NhcmRzIGRvd24gdG8gdGhlIHVuZGVybHlpbmcKKwkJCSAgIGRhdGEgZGV2aWNlLCBidXQganVzdCByZW1vdmUgdGhlIG1hcHBpbmcuCisKKyAgICAgIHJlYWRfb25seTogRG9uJ3QgYWxsb3cgYW55IGNoYW5nZXMgdG8gYmUgbWFkZSB0byB0aGUgcG9vbAorCQkgbWV0YWRhdGEuCisKKyAgICAgIGVycm9yX2lmX25vX3NwYWNlOiBFcnJvciBJT3MsIGluc3RlYWQgb2YgcXVldWVpbmcsIGlmIG5vIHNwYWNlLgorCisgICAgRGF0YSBibG9jayBzaXplIG11c3QgYmUgYmV0d2VlbiA2NEtCICgxMjggc2VjdG9ycykgYW5kIDFHQgorICAgICgyMDk3MTUyIHNlY3RvcnMpIGluY2x1c2l2ZS4KKworCitpaSkgU3RhdHVzCisKKyAgICA8dHJhbnNhY3Rpb24gaWQ+IDx1c2VkIG1ldGFkYXRhIGJsb2Nrcz4vPHRvdGFsIG1ldGFkYXRhIGJsb2Nrcz4KKyAgICA8dXNlZCBkYXRhIGJsb2Nrcz4vPHRvdGFsIGRhdGEgYmxvY2tzPiA8aGVsZCBtZXRhZGF0YSByb290PgorICAgIFtub19dZGlzY2FyZF9wYXNzZG93biByb3xydworCisgICAgdHJhbnNhY3Rpb24gaWQ6CisJQSA2NC1iaXQgbnVtYmVyIHVzZWQgYnkgdXNlcnNwYWNlIHRvIGhlbHAgc3luY2hyb25pc2Ugd2l0aCBtZXRhZGF0YQorCWZyb20gdm9sdW1lIG1hbmFnZXJzLgorCisgICAgdXNlZCBkYXRhIGJsb2NrcyAvIHRvdGFsIGRhdGEgYmxvY2tzCisJSWYgdGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBkcm9wcyBiZWxvdyB0aGUgcG9vbCdzIGxvdyB3YXRlciBtYXJrIGEKKwlkbSBldmVudCB3aWxsIGJlIHNlbnQgdG8gdXNlcnNwYWNlLiAgVGhpcyBldmVudCBpcyBlZGdlLXRyaWdnZXJlZCBhbmQKKwlpdCB3aWxsIG9jY3VyIG9ubHkgb25jZSBhZnRlciBlYWNoIHJlc3VtZSBzbyB2b2x1bWUgbWFuYWdlciB3cml0ZXJzCisJc2hvdWxkIHJlZ2lzdGVyIGZvciB0aGUgZXZlbnQgYW5kIHRoZW4gY2hlY2sgdGhlIHRhcmdldCdzIHN0YXR1cy4KKworICAgIGhlbGQgbWV0YWRhdGEgcm9vdDoKKwlUaGUgbG9jYXRpb24sIGluIGJsb2Nrcywgb2YgdGhlIG1ldGFkYXRhIHJvb3QgdGhhdCBoYXMgYmVlbgorCSdoZWxkJyBmb3IgdXNlcnNwYWNlIHJlYWQgYWNjZXNzLiAgJy0nIGluZGljYXRlcyB0aGVyZSBpcyBubworCWhlbGQgcm9vdC4KKworICAgIGRpc2NhcmRfcGFzc2Rvd258bm9fZGlzY2FyZF9wYXNzZG93bgorCVdoZXRoZXIgb3Igbm90IGRpc2NhcmRzIGFyZSBhY3R1YWxseSBiZWluZyBwYXNzZWQgZG93biB0byB0aGUKKwl1bmRlcmx5aW5nIGRldmljZS4gIFdoZW4gdGhpcyBpcyBlbmFibGVkIHdoZW4gbG9hZGluZyB0aGUgdGFibGUsCisJaXQgY2FuIGdldCBkaXNhYmxlZCBpZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGl0LgorCisgICAgcm98cnd8b3V0X29mX2RhdGFfc3BhY2UKKwlJZiB0aGUgcG9vbCBlbmNvdW50ZXJzIGNlcnRhaW4gdHlwZXMgb2YgZGV2aWNlIGZhaWx1cmVzIGl0IHdpbGwKKwlkcm9wIGludG8gYSByZWFkLW9ubHkgbWV0YWRhdGEgbW9kZSBpbiB3aGljaCBubyBjaGFuZ2VzIHRvCisJdGhlIHBvb2wgbWV0YWRhdGEgKGxpa2UgYWxsb2NhdGluZyBuZXcgYmxvY2tzKSBhcmUgcGVybWl0dGVkLgorCisJSW4gc2VyaW91cyBjYXNlcyB3aGVyZSBldmVuIGEgcmVhZC1vbmx5IG1vZGUgaXMgZGVlbWVkIHVuc2FmZQorCW5vIGZ1cnRoZXIgSS9PIHdpbGwgYmUgcGVybWl0dGVkIGFuZCB0aGUgc3RhdHVzIHdpbGwganVzdAorCWNvbnRhaW4gdGhlIHN0cmluZyAnRmFpbCcuICBUaGUgdXNlcnNwYWNlIHJlY292ZXJ5IHRvb2xzCisJc2hvdWxkIHRoZW4gYmUgdXNlZC4KKworICAgIGVycm9yX2lmX25vX3NwYWNlfHF1ZXVlX2lmX25vX3NwYWNlCisJSWYgdGhlIHBvb2wgcnVucyBvdXQgb2YgZGF0YSBvciBtZXRhZGF0YSBzcGFjZSwgdGhlIHBvb2wgd2lsbAorCWVpdGhlciBxdWV1ZSBvciBlcnJvciB0aGUgSU8gZGVzdGluZWQgdG8gdGhlIGRhdGEgZGV2aWNlLiAgVGhlCisJZGVmYXVsdCBpcyB0byBxdWV1ZSB0aGUgSU8gdW50aWwgbW9yZSBzcGFjZSBpcyBhZGRlZCBvciB0aGUKKwknbm9fc3BhY2VfdGltZW91dCcgZXhwaXJlcy4gIFRoZSAnbm9fc3BhY2VfdGltZW91dCcgZG0tdGhpbi1wb29sCisJbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyB0aW1lb3V0IC0tIGl0CisJZGVmYXVsdHMgdG8gNjAgc2Vjb25kcyBidXQgbWF5IGJlIGRpc2FibGVkIHVzaW5nIGEgdmFsdWUgb2YgMC4KKworICAgIG5lZWRzX2NoZWNrCisJQSBtZXRhZGF0YSBvcGVyYXRpb24gaGFzIGZhaWxlZCwgcmVzdWx0aW5nIGluIHRoZSBuZWVkc19jaGVjaworCWZsYWcgYmVpbmcgc2V0IGluIHRoZSBtZXRhZGF0YSdzIHN1cGVyYmxvY2suICBUaGUgbWV0YWRhdGEKKwlkZXZpY2UgbXVzdCBiZSBkZWFjdGl2YXRlZCBhbmQgY2hlY2tlZC9yZXBhaXJlZCBiZWZvcmUgdGhlCisJdGhpbi1wb29sIGNhbiBiZSBtYWRlIGZ1bGx5IG9wZXJhdGlvbmFsIGFnYWluLiAgJy0nIGluZGljYXRlcworCW5lZWRzX2NoZWNrIGlzIG5vdCBzZXQuCisKK2lpaSkgTWVzc2FnZXMKKworICAgIGNyZWF0ZV90aGluIDxkZXYgaWQ+CisKKwlDcmVhdGUgYSBuZXcgdGhpbmx5LXByb3Zpc2lvbmVkIGRldmljZS4KKwk8ZGV2IGlkPiBpcyBhbiBhcmJpdHJhcnkgdW5pcXVlIDI0LWJpdCBpZGVudGlmaWVyIGNob3NlbiBieQorCXRoZSBjYWxsZXIuCisKKyAgICBjcmVhdGVfc25hcCA8ZGV2IGlkPiA8b3JpZ2luIGlkPgorCisJQ3JlYXRlIGEgbmV3IHNuYXBzaG90IG9mIGFub3RoZXIgdGhpbmx5LXByb3Zpc2lvbmVkIGRldmljZS4KKwk8ZGV2IGlkPiBpcyBhbiBhcmJpdHJhcnkgdW5pcXVlIDI0LWJpdCBpZGVudGlmaWVyIGNob3NlbiBieQorCXRoZSBjYWxsZXIuCisJPG9yaWdpbiBpZD4gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2UKKwlvZiB3aGljaCB0aGUgbmV3IGRldmljZSB3aWxsIGJlIGEgc25hcHNob3QuCisKKyAgICBkZWxldGUgPGRldiBpZD4KKworCURlbGV0ZXMgYSB0aGluIGRldmljZS4gIElycmV2ZXJzaWJsZS4KKworICAgIHNldF90cmFuc2FjdGlvbl9pZCA8Y3VycmVudCBpZD4gPG5ldyBpZD4KKworCVVzZXJsYW5kIHZvbHVtZSBtYW5hZ2Vycywgc3VjaCBhcyBMVk0sIG5lZWQgYSB3YXkgdG8KKwlzeW5jaHJvbmlzZSB0aGVpciBleHRlcm5hbCBtZXRhZGF0YSB3aXRoIHRoZSBpbnRlcm5hbCBtZXRhZGF0YSBvZiB0aGUKKwlwb29sIHRhcmdldC4gIFRoZSB0aGluLXBvb2wgdGFyZ2V0IG9mZmVycyB0byBzdG9yZSBhbgorCWFyYml0cmFyeSA2NC1iaXQgdHJhbnNhY3Rpb24gaWQgYW5kIHJldHVybiBpdCBvbiB0aGUgdGFyZ2V0J3MKKwlzdGF0dXMgbGluZS4gIFRvIGF2b2lkIHJhY2VzIHlvdSBtdXN0IHByb3ZpZGUgd2hhdCB5b3UgdGhpbmsKKwl0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZCBpcyB3aGVuIHlvdSBjaGFuZ2UgaXQgd2l0aCB0aGlzCisJY29tcGFyZS1hbmQtc3dhcCBtZXNzYWdlLgorCisgICAgcmVzZXJ2ZV9tZXRhZGF0YV9zbmFwCisKKyAgICAgICAgUmVzZXJ2ZSBhIGNvcHkgb2YgdGhlIGRhdGEgbWFwcGluZyBidHJlZSBmb3IgdXNlIGJ5IHVzZXJsYW5kLgorICAgICAgICBUaGlzIGFsbG93cyB1c2VybGFuZCB0byBpbnNwZWN0IHRoZSBtYXBwaW5ncyBhcyB0aGV5IHdlcmUgd2hlbgorICAgICAgICB0aGlzIG1lc3NhZ2Ugd2FzIGV4ZWN1dGVkLiAgVXNlIHRoZSBwb29sJ3Mgc3RhdHVzIGNvbW1hbmQgdG8KKyAgICAgICAgZ2V0IHRoZSByb290IGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0YWRhdGEgc25hcHNob3QuCisKKyAgICByZWxlYXNlX21ldGFkYXRhX3NuYXAKKworICAgICAgICBSZWxlYXNlIGEgcHJldmlvdXNseSByZXNlcnZlZCBjb3B5IG9mIHRoZSBkYXRhIG1hcHBpbmcgYnRyZWUuCisKKyd0aGluJyB0YXJnZXQKKy0tLS0tLS0tLS0tLS0KKworaSkgQ29uc3RydWN0b3IKKworICAgIHRoaW4gPHBvb2wgZGV2PiA8ZGV2IGlkPiBbPGV4dGVybmFsIG9yaWdpbiBkZXY+XQorCisgICAgcG9vbCBkZXY6CisJdGhlIHRoaW4tcG9vbCBkZXZpY2UsIGUuZy4gL2Rldi9tYXBwZXIvbXlfcG9vbCBvciAyNTM6MAorCisgICAgZGV2IGlkOgorCXRoZSBpbnRlcm5hbCBkZXZpY2UgaWRlbnRpZmllciBvZiB0aGUgZGV2aWNlIHRvIGJlCisJYWN0aXZhdGVkLgorCisgICAgZXh0ZXJuYWwgb3JpZ2luIGRldjoKKwlhbiBvcHRpb25hbCBibG9jayBkZXZpY2Ugb3V0c2lkZSB0aGUgcG9vbCB0byBiZSB0cmVhdGVkIGFzIGEKKwlyZWFkLW9ubHkgc25hcHNob3Qgb3JpZ2luOiByZWFkcyB0byB1bnByb3Zpc2lvbmVkIGFyZWFzIG9mIHRoZQorCXRoaW4gdGFyZ2V0IHdpbGwgYmUgbWFwcGVkIHRvIHRoaXMgZGV2aWNlLgorCitUaGUgcG9vbCBkb2Vzbid0IHN0b3JlIGFueSBzaXplIGFnYWluc3QgdGhlIHRoaW4gZGV2aWNlcy4gIElmIHlvdQorbG9hZCBhIHRoaW4gdGFyZ2V0IHRoYXQgaXMgc21hbGxlciB0aGFuIHlvdSd2ZSBiZWVuIHVzaW5nIHByZXZpb3VzbHksCit0aGVuIHlvdSdsbCBoYXZlIG5vIGFjY2VzcyB0byBibG9ja3MgbWFwcGVkIGJleW9uZCB0aGUgZW5kLiAgSWYgeW91Citsb2FkIGEgdGFyZ2V0IHRoYXQgaXMgYmlnZ2VyIHRoYW4gYmVmb3JlLCB0aGVuIGV4dHJhIGJsb2NrcyB3aWxsIGJlCitwcm92aXNpb25lZCBhcyBhbmQgd2hlbiBuZWVkZWQuCisKK2lpKSBTdGF0dXMKKworICAgICA8bnIgbWFwcGVkIHNlY3RvcnM+IDxoaWdoZXN0IG1hcHBlZCBzZWN0b3I+CisKKwlJZiB0aGUgcG9vbCBoYXMgZW5jb3VudGVyZWQgZGV2aWNlIGVycm9ycyBhbmQgZmFpbGVkLCB0aGUgc3RhdHVzCisJd2lsbCBqdXN0IGNvbnRhaW4gdGhlIHN0cmluZyAnRmFpbCcuICBUaGUgdXNlcnNwYWNlIHJlY292ZXJ5CisJdG9vbHMgc2hvdWxkIHRoZW4gYmUgdXNlZC4KZGlmZiAtLWdpdCBhL2RvYy9rZXJuZWwvdWV2ZW50LnR4dCBiL2RvYy9rZXJuZWwvdWV2ZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VkYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC91ZXZlbnQudHh0CkBAIC0wLDAgKzEsOTcgQEAKK1RoZSBkZXZpY2UtbWFwcGVyIHVldmVudCBjb2RlIGFkZHMgdGhlIGNhcGFiaWxpdHkgdG8gZGV2aWNlLW1hcHBlciB0byBjcmVhdGUKK2FuZCBzZW5kIGtvYmplY3QgdWV2ZW50cyAodWV2ZW50cykuICBQcmV2aW91c2x5IGRldmljZS1tYXBwZXIgZXZlbnRzIHdlcmUgb25seQorYXZhaWxhYmxlIHRocm91Z2ggdGhlIGlvY3RsIGludGVyZmFjZS4gIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHVldmVudHMgaW50ZXJmYWNlCitpcyB0aGUgZXZlbnQgY29udGFpbnMgZW52aXJvbm1lbnQgYXR0cmlidXRlcyBwcm92aWRpbmcgaW5jcmVhc2VkIGNvbnRleHQgZm9yCit0aGUgZXZlbnQgYXZvaWRpbmcgdGhlIG5lZWQgdG8gcXVlcnkgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UtbWFwcGVyIGRldmljZSBhZnRlcgordGhlIGV2ZW50IGlzIHJlY2VpdmVkLgorCitUaGVyZSBhcmUgdHdvIGZ1bmN0aW9ucyBjdXJyZW50bHkgZm9yIGRldmljZS1tYXBwZXIgZXZlbnRzLiAgVGhlIGZpcnN0IGZ1bmN0aW9uCitsaXN0ZWQgY3JlYXRlcyB0aGUgZXZlbnQgYW5kIHRoZSBzZWNvbmQgZnVuY3Rpb24gc2VuZHMgdGhlIGV2ZW50KHMpLgorCit2b2lkIGRtX3BhdGhfdWV2ZW50KGVudW0gZG1fdWV2ZW50X3R5cGUgZXZlbnRfdHlwZSwgc3RydWN0IGRtX3RhcmdldCAqdGksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIG5yX3ZhbGlkX3BhdGhzKQorCit2b2lkIGRtX3NlbmRfdWV2ZW50cyhzdHJ1Y3QgbGlzdF9oZWFkICpldmVudHMsIHN0cnVjdCBrb2JqZWN0ICprb2JqKQorCisKK1RoZSB2YXJpYWJsZXMgYWRkZWQgdG8gdGhlIHVldmVudCBlbnZpcm9ubWVudCBhcmU6CisKK1ZhcmlhYmxlIE5hbWU6IERNX1RBUkdFVAorVWV2ZW50IEFjdGlvbihzKTogS09CSl9DSEFOR0UKK1R5cGU6IHN0cmluZworRGVzY3JpcHRpb246CitWYWx1ZTogTmFtZSBvZiBkZXZpY2UtbWFwcGVyIHRhcmdldCB0aGF0IGdlbmVyYXRlZCB0aGUgZXZlbnQuCisKK1ZhcmlhYmxlIE5hbWU6IERNX0FDVElPTgorVWV2ZW50IEFjdGlvbihzKTogS09CSl9DSEFOR0UKK1R5cGU6IHN0cmluZworRGVzY3JpcHRpb246CitWYWx1ZTogRGV2aWNlLW1hcHBlciBzcGVjaWZpYyBhY3Rpb24gdGhhdCBjYXVzZWQgdGhlIHVldmVudCBhY3Rpb24uCisJUEFUSF9GQUlMRUQgLSBBIHBhdGggaGFzIGZhaWxlZC4KKwlQQVRIX1JFSU5TVEFURUQgLSBBIHBhdGggaGFzIGJlZW4gcmVpbnN0YXRlZC4KKworVmFyaWFibGUgTmFtZTogRE1fU0VRTlVNCitVZXZlbnQgQWN0aW9uKHMpOiBLT0JKX0NIQU5HRQorVHlwZTogdW5zaWduZWQgaW50ZWdlcgorRGVzY3JpcHRpb246IEEgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGlzIHNwZWNpZmljIGRldmljZS1tYXBwZXIgZGV2aWNlLgorVmFsdWU6IFZhbGlkIHVuc2lnbmVkIGludGVnZXIgcmFuZ2UuCisKK1ZhcmlhYmxlIE5hbWU6IERNX1BBVEgKK1VldmVudCBBY3Rpb24ocyk6IEtPQkpfQ0hBTkdFCitUeXBlOiBzdHJpbmcKK0Rlc2NyaXB0aW9uOiBNYWpvciBhbmQgbWlub3IgbnVtYmVyIG9mIHRoZSBwYXRoIGRldmljZSBwZXJ0YWluaW5nIHRvIHRoaXMKK2V2ZW50LgorVmFsdWU6IFBhdGggbmFtZSBpbiB0aGUgZm9ybSBvZiAiTWFqb3I6TWlub3IiCisKK1ZhcmlhYmxlIE5hbWU6IERNX05SX1ZBTElEX1BBVEhTCitVZXZlbnQgQWN0aW9uKHMpOiBLT0JKX0NIQU5HRQorVHlwZTogdW5zaWduZWQgaW50ZWdlcgorRGVzY3JpcHRpb246CitWYWx1ZTogVmFsaWQgdW5zaWduZWQgaW50ZWdlciByYW5nZS4KKworVmFyaWFibGUgTmFtZTogRE1fTkFNRQorVWV2ZW50IEFjdGlvbihzKTogS09CSl9DSEFOR0UKK1R5cGU6IHN0cmluZworRGVzY3JpcHRpb246IE5hbWUgb2YgdGhlIGRldmljZS1tYXBwZXIgZGV2aWNlLgorVmFsdWU6IE5hbWUKKworVmFyaWFibGUgTmFtZTogRE1fVVVJRAorVWV2ZW50IEFjdGlvbihzKTogS09CSl9DSEFOR0UKK1R5cGU6IHN0cmluZworRGVzY3JpcHRpb246IFVVSUQgb2YgdGhlIGRldmljZS1tYXBwZXIgZGV2aWNlLgorVmFsdWU6IFVVSUQuIChFbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXNuJ3Qgb25lLikKKworQW4gZXhhbXBsZSBvZiB0aGUgdWV2ZW50cyBnZW5lcmF0ZWQgYXMgY2FwdHVyZWQgYnkgdWRldm1vbml0b3IgaXMgc2hvd24KK2JlbG93LgorCisxLikgUGF0aCBmYWlsdXJlLgorVUVWRU5UWzExOTI1MjEwMDkuNzExMjE1XSBjaGFuZ2VAL2Jsb2NrL2RtLTMKK0FDVElPTj1jaGFuZ2UKK0RFVlBBVEg9L2Jsb2NrL2RtLTMKK1NVQlNZU1RFTT1ibG9jaworRE1fVEFSR0VUPW11bHRpcGF0aAorRE1fQUNUSU9OPVBBVEhfRkFJTEVECitETV9TRVFOVU09MQorRE1fUEFUSD04OjMyCitETV9OUl9WQUxJRF9QQVRIUz0wCitETV9OQU1FPW1wYXRoMgorRE1fVVVJRD1tcGF0aC0zNTMzMzMzMzAwMDAwMjMyOAorTUlOT1I9MworTUFKT1I9MjUzCitTRVFOVU09MTEzMAorCisyLikgUGF0aCByZWluc3RhdGUuCitVRVZFTlRbMTE5MjUyMTEzMi45ODk5MjddIGNoYW5nZUAvYmxvY2svZG0tMworQUNUSU9OPWNoYW5nZQorREVWUEFUSD0vYmxvY2svZG0tMworU1VCU1lTVEVNPWJsb2NrCitETV9UQVJHRVQ9bXVsdGlwYXRoCitETV9BQ1RJT049UEFUSF9SRUlOU1RBVEVECitETV9TRVFOVU09MgorRE1fUEFUSD04OjMyCitETV9OUl9WQUxJRF9QQVRIUz0xCitETV9OQU1FPW1wYXRoMgorRE1fVVVJRD1tcGF0aC0zNTMzMzMzMzAwMDAwMjMyOAorTUlOT1I9MworTUFKT1I9MjUzCitTRVFOVU09MTEzMQpkaWZmIC0tZ2l0IGEvZG9jL2tlcm5lbC92ZXJpdHkudHh0IGIvZG9jL2tlcm5lbC92ZXJpdHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmQ4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mva2VybmVsL3Zlcml0eS50eHQKQEAgLTAsMCArMSwyMDggQEAKK2RtLXZlcml0eQorPT09PT09PT09PQorCitEZXZpY2UtTWFwcGVyJ3MgInZlcml0eSIgdGFyZ2V0IHByb3ZpZGVzIHRyYW5zcGFyZW50IGludGVncml0eSBjaGVja2luZyBvZgorYmxvY2sgZGV2aWNlcyB1c2luZyBhIGNyeXB0b2dyYXBoaWMgZGlnZXN0IHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4KK1RoaXMgdGFyZ2V0IGlzIHJlYWQtb25seS4KKworQ29uc3RydWN0aW9uIFBhcmFtZXRlcnMKKz09PT09PT09PT09PT09PT09PT09PT09CisgICAgPHZlcnNpb24+IDxkZXY+IDxoYXNoX2Rldj4KKyAgICA8ZGF0YV9ibG9ja19zaXplPiA8aGFzaF9ibG9ja19zaXplPgorICAgIDxudW1fZGF0YV9ibG9ja3M+IDxoYXNoX3N0YXJ0X2Jsb2NrPgorICAgIDxhbGdvcml0aG0+IDxkaWdlc3Q+IDxzYWx0PgorICAgIFs8I29wdF9wYXJhbXM+IDxvcHRfcGFyYW1zPl0KKworPHZlcnNpb24+CisgICAgVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgb24tZGlzayBoYXNoIGZvcm1hdC4KKworICAgIDAgaXMgdGhlIG9yaWdpbmFsIGZvcm1hdCB1c2VkIGluIHRoZSBDaHJvbWl1bSBPUy4KKyAgICAgIFRoZSBzYWx0IGlzIGFwcGVuZGVkIHdoZW4gaGFzaGluZywgZGlnZXN0cyBhcmUgc3RvcmVkIGNvbnRpbnVvdXNseSBhbmQKKyAgICAgIHRoZSByZXN0IG9mIHRoZSBibG9jayBpcyBwYWRkZWQgd2l0aCB6ZXJvZXMuCisKKyAgICAxIGlzIHRoZSBjdXJyZW50IGZvcm1hdCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBuZXcgZGV2aWNlcy4KKyAgICAgIFRoZSBzYWx0IGlzIHByZXBlbmRlZCB3aGVuIGhhc2hpbmcgYW5kIGVhY2ggZGlnZXN0IGlzCisgICAgICBwYWRkZWQgd2l0aCB6ZXJvZXMgdG8gdGhlIHBvd2VyIG9mIHR3by4KKworPGRldj4KKyAgICBUaGlzIGlzIHRoZSBkZXZpY2UgY29udGFpbmluZyBkYXRhLCB0aGUgaW50ZWdyaXR5IG9mIHdoaWNoIG5lZWRzIHRvIGJlCisgICAgY2hlY2tlZC4gIEl0IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBwYXRoLCBsaWtlIC9kZXYvc2RhWCwgb3IgYSBkZXZpY2UgbnVtYmVyLAorICAgIDxtYWpvcj46PG1pbm9yPi4KKworPGhhc2hfZGV2PgorICAgIFRoaXMgaXMgdGhlIGRldmljZSB0aGF0IHN1cHBsaWVzIHRoZSBoYXNoIHRyZWUgZGF0YS4gIEl0IG1heSBiZQorICAgIHNwZWNpZmllZCBzaW1pbGFybHkgdG8gdGhlIGRldmljZSBwYXRoIGFuZCBtYXkgYmUgdGhlIHNhbWUgZGV2aWNlLiAgSWYgdGhlCisgICAgc2FtZSBkZXZpY2UgaXMgdXNlZCwgdGhlIGhhc2hfc3RhcnQgc2hvdWxkIGJlIG91dHNpZGUgdGhlIGNvbmZpZ3VyZWQKKyAgICBkbS12ZXJpdHkgZGV2aWNlLgorCis8ZGF0YV9ibG9ja19zaXplPgorICAgIFRoZSBibG9jayBzaXplIG9uIGEgZGF0YSBkZXZpY2UgaW4gYnl0ZXMuCisgICAgRWFjaCBibG9jayBjb3JyZXNwb25kcyB0byBvbmUgZGlnZXN0IG9uIHRoZSBoYXNoIGRldmljZS4KKworPGhhc2hfYmxvY2tfc2l6ZT4KKyAgICBUaGUgc2l6ZSBvZiBhIGhhc2ggYmxvY2sgaW4gYnl0ZXMuCisKKzxudW1fZGF0YV9ibG9ja3M+CisgICAgVGhlIG51bWJlciBvZiBkYXRhIGJsb2NrcyBvbiB0aGUgZGF0YSBkZXZpY2UuICBBZGRpdGlvbmFsIGJsb2NrcyBhcmUKKyAgICBpbmFjY2Vzc2libGUuICBZb3UgY2FuIHBsYWNlIGhhc2hlcyB0byB0aGUgc2FtZSBwYXJ0aXRpb24gYXMgZGF0YSwgaW4gdGhpcworICAgIGNhc2UgaGFzaGVzIGFyZSBwbGFjZWQgYWZ0ZXIgPG51bV9kYXRhX2Jsb2Nrcz4uCisKKzxoYXNoX3N0YXJ0X2Jsb2NrPgorICAgIFRoaXMgaXMgdGhlIG9mZnNldCwgaW4gPGhhc2hfYmxvY2tfc2l6ZT4tYmxvY2tzLCBmcm9tIHRoZSBzdGFydCBvZiBoYXNoX2RldgorICAgIHRvIHRoZSByb290IGJsb2NrIG9mIHRoZSBoYXNoIHRyZWUuCisKKzxhbGdvcml0aG0+CisgICAgVGhlIGNyeXB0b2dyYXBoaWMgaGFzaCBhbGdvcml0aG0gdXNlZCBmb3IgdGhpcyBkZXZpY2UuICBUaGlzIHNob3VsZAorICAgIGJlIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0sIGxpa2UgInNoYTEiLgorCis8ZGlnZXN0PgorICAgIFRoZSBoZXhhZGVjaW1hbCBlbmNvZGluZyBvZiB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIG9mIHRoZSByb290IGhhc2ggYmxvY2sKKyAgICBhbmQgdGhlIHNhbHQuICBUaGlzIGhhc2ggc2hvdWxkIGJlIHRydXN0ZWQgYXMgdGhlcmUgaXMgbm8gb3RoZXIgYXV0aGVudGljaXR5CisgICAgYmV5b25kIHRoaXMgcG9pbnQuCisKKzxzYWx0PgorICAgIFRoZSBoZXhhZGVjaW1hbCBlbmNvZGluZyBvZiB0aGUgc2FsdCB2YWx1ZS4KKworPCNvcHRfcGFyYW1zPgorICAgIE51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzLiBJZiB0aGVyZSBhcmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycywKKyAgICB0aGUgb3B0aW9uYWwgcGFyYW1hdGVycyBzZWN0aW9uIGNhbiBiZSBza2lwcGVkIG9yICNvcHRfcGFyYW1zIGNhbiBiZSB6ZXJvLgorICAgIE90aGVyd2lzZSAjb3B0X3BhcmFtcyBpcyB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZyBhcmd1bWVudHMuCisKKyAgICBFeGFtcGxlIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgc2VjdGlvbjoKKyAgICAgICAgMSBpZ25vcmVfY29ycnVwdGlvbgorCitpZ25vcmVfY29ycnVwdGlvbgorICAgIExvZyBjb3JydXB0ZWQgYmxvY2tzLCBidXQgYWxsb3cgcmVhZCBvcGVyYXRpb25zIHRvIHByb2NlZWQgbm9ybWFsbHkuCisKK3Jlc3RhcnRfb25fY29ycnVwdGlvbgorICAgIFJlc3RhcnQgdGhlIHN5c3RlbSB3aGVuIGEgY29ycnVwdGVkIGJsb2NrIGlzIGRpc2NvdmVyZWQuIFRoaXMgb3B0aW9uIGlzCisgICAgbm90IGNvbXBhdGlibGUgd2l0aCBpZ25vcmVfY29ycnVwdGlvbiBhbmQgcmVxdWlyZXMgdXNlciBzcGFjZSBzdXBwb3J0IHRvCisgICAgYXZvaWQgcmVzdGFydCBsb29wcy4KKworaWdub3JlX3plcm9fYmxvY2tzCisgICAgRG8gbm90IHZlcmlmeSBibG9ja3MgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbiB6ZXJvZXMgYW5kIGFsd2F5cyByZXR1cm4KKyAgICB6ZXJvZXMgaW5zdGVhZC4gVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHRoZSBwYXJ0aXRpb24gY29udGFpbnMgdW51c2VkIGJsb2NrcworICAgIHRoYXQgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGNvbnRhaW4gemVyb2VzLgorCit1c2VfZmVjX2Zyb21fZGV2aWNlIDxmZWNfZGV2PgorICAgIFVzZSBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKEZFQykgdG8gcmVjb3ZlciBmcm9tIGNvcnJ1cHRpb24gaWYgaGFzaAorICAgIHZlcmlmaWNhdGlvbiBmYWlscy4gVXNlIGVuY29kaW5nIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGRldmljZS4gVGhpcworICAgIG1heSBiZSB0aGUgc2FtZSBkZXZpY2Ugd2hlcmUgZGF0YSBhbmQgaGFzaCBibG9ja3MgcmVzaWRlLCBpbiB3aGljaCBjYXNlCisgICAgZmVjX3N0YXJ0IG11c3QgYmUgb3V0c2lkZSBkYXRhIGFuZCBoYXNoIGFyZWFzLgorCisgICAgSWYgdGhlIGVuY29kaW5nIGRhdGEgY292ZXJzIGFkZGl0aW9uYWwgbWV0YWRhdGEsIGl0IG11c3QgYmUgYWNjZXNzaWJsZQorICAgIG9uIHRoZSBoYXNoIGRldmljZSBhZnRlciB0aGUgaGFzaCBibG9ja3MuCisKKyAgICBOb3RlOiBibG9jayBzaXplcyBmb3IgZGF0YSBhbmQgaGFzaCBkZXZpY2VzIG11c3QgbWF0Y2guIEFsc28sIGlmIHRoZQorICAgIHZlcml0eSA8ZGV2PiBpcyBlbmNyeXB0ZWQgdGhlIDxmZWNfZGV2PiBzaG91bGQgYmUgdG9vLgorCitmZWNfcm9vdHMgPG51bT4KKyAgICBOdW1iZXIgb2YgZ2VuZXJhdG9yIHJvb3RzLiBUaGlzIGVxdWFscyB0byB0aGUgbnVtYmVyIG9mIHBhcml0eSBieXRlcyBpbgorICAgIHRoZSBlbmNvZGluZyBkYXRhLiBGb3IgZXhhbXBsZSwgaW4gUlMoTSwgTikgZW5jb2RpbmcsIHRoZSBudW1iZXIgb2Ygcm9vdHMKKyAgICBpcyBNLU4uCisKK2ZlY19ibG9ja3MgPG51bT4KKyAgICBUaGUgbnVtYmVyIG9mIGVuY29kaW5nIGRhdGEgYmxvY2tzIG9uIHRoZSBGRUMgZGV2aWNlLiBUaGUgYmxvY2sgc2l6ZSBmb3IKKyAgICB0aGUgRkVDIGRldmljZSBpcyA8ZGF0YV9ibG9ja19zaXplPi4KKworZmVjX3N0YXJ0IDxvZmZzZXQ+CisgICAgVGhpcyBpcyB0aGUgb2Zmc2V0LCBpbiA8ZGF0YV9ibG9ja19zaXplPiBibG9ja3MsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICAgIEZFQyBkZXZpY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZW5jb2RpbmcgZGF0YS4KKworCitUaGVvcnkgb2Ygb3BlcmF0aW9uCis9PT09PT09PT09PT09PT09PT09CisKK2RtLXZlcml0eSBpcyBtZWFudCB0byBiZSBzZXQgdXAgYXMgcGFydCBvZiBhIHZlcmlmaWVkIGJvb3QgcGF0aC4gIFRoaXMKK21heSBiZSBhbnl0aGluZyByYW5naW5nIGZyb20gYSBib290IHVzaW5nIHRib290IG9yIHRydXN0ZWRncnViIHRvIGp1c3QKK2Jvb3RpbmcgZnJvbSBhIGtub3duLWdvb2QgZGV2aWNlIChsaWtlIGEgVVNCIGRyaXZlIG9yIENEKS4KKworV2hlbiBhIGRtLXZlcml0eSBkZXZpY2UgaXMgY29uZmlndXJlZCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY2FsbGVyCitoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGluIHNvbWUgd2F5IChjcnlwdG9ncmFwaGljIHNpZ25hdHVyZXMsIGV0YykuCitBZnRlciBpbnN0YW50aWF0aW9uLCBhbGwgaGFzaGVzIHdpbGwgYmUgdmVyaWZpZWQgb24tZGVtYW5kIGR1cmluZworZGlzayBhY2Nlc3MuICBJZiB0aGV5IGNhbm5vdCBiZSB2ZXJpZmllZCB1cCB0byB0aGUgcm9vdCBub2RlIG9mIHRoZQordHJlZSwgdGhlIHJvb3QgaGFzaCwgdGhlbiB0aGUgSS9PIHdpbGwgZmFpbC4gIFRoaXMgc2hvdWxkIGRldGVjdAordGFtcGVyaW5nIHdpdGggYW55IGRhdGEgb24gdGhlIGRldmljZSBhbmQgdGhlIGhhc2ggZGF0YS4KKworQ3J5cHRvZ3JhcGhpYyBoYXNoZXMgYXJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRldmljZSBvbiBhCitwZXItYmxvY2sgYmFzaXMuIFRoaXMgYWxsb3dzIGZvciBhIGxpZ2h0d2VpZ2h0IGhhc2ggY29tcHV0YXRpb24gb24gZmlyc3QgcmVhZAoraW50byB0aGUgcGFnZSBjYWNoZS4gQmxvY2sgaGFzaGVzIGFyZSBzdG9yZWQgbGluZWFybHksIGFsaWduZWQgdG8gdGhlIG5lYXJlc3QKK2Jsb2NrIHNpemUuCisKK0lmIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoRkVDKSBzdXBwb3J0IGlzIGVuYWJsZWQgYW55IHJlY292ZXJ5IG9mCitjb3JydXB0ZWQgZGF0YSB3aWxsIGJlIHZlcmlmaWVkIHVzaW5nIHRoZSBjcnlwdG9ncmFwaGljIGhhc2ggb2YgdGhlCitjb3JyZXNwb25kaW5nIGRhdGEuIFRoaXMgaXMgd2h5IGNvbWJpbmluZyBlcnJvciBjb3JyZWN0aW9uIHdpdGgKK2ludGVncml0eSBjaGVja2luZyBpcyBlc3NlbnRpYWwuCisKK0hhc2ggVHJlZQorLS0tLS0tLS0tCisKK0VhY2ggbm9kZSBpbiB0aGUgdHJlZSBpcyBhIGNyeXB0b2dyYXBoaWMgaGFzaC4gIElmIGl0IGlzIGEgbGVhZiBub2RlLCB0aGUgaGFzaAorb2Ygc29tZSBkYXRhIGJsb2NrIG9uIGRpc2sgaXMgY2FsY3VsYXRlZC4gSWYgaXQgaXMgYW4gaW50ZXJtZWRpYXJ5IG5vZGUsCit0aGUgaGFzaCBvZiBhIG51bWJlciBvZiBjaGlsZCBub2RlcyBpcyBjYWxjdWxhdGVkLgorCitFYWNoIGVudHJ5IGluIHRoZSB0cmVlIGlzIGEgY29sbGVjdGlvbiBvZiBuZWlnaGJvcmluZyBub2RlcyB0aGF0IGZpdCBpbiBvbmUKK2Jsb2NrLiAgVGhlIG51bWJlciBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIGJsb2NrX3NpemUgYW5kIHRoZSBzaXplIG9mIHRoZQorc2VsZWN0ZWQgY3J5cHRvZ3JhcGhpYyBkaWdlc3QgYWxnb3JpdGhtLiAgVGhlIGhhc2hlcyBhcmUgbGluZWFybHktb3JkZXJlZCBpbgordGhpcyBlbnRyeSBhbmQgYW55IHVuYWxpZ25lZCB0cmFpbGluZyBzcGFjZSBpcyBpZ25vcmVkIGJ1dCBpbmNsdWRlZCB3aGVuCitjYWxjdWxhdGluZyB0aGUgcGFyZW50IG5vZGUuCisKK1RoZSB0cmVlIGxvb2tzIHNvbWV0aGluZyBsaWtlOgorCithbGcgPSBzaGEyNTYsIG51bV9ibG9ja3MgPSAzMjc2OCwgYmxvY2tfc2l6ZSA9IDQwOTYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgIHJvb3QgICAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgIC4gLiAuICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIFtlbnRyeV8wXSAgICAgICAgICAgICAgICAgW2VudHJ5XzFdCisgICAgICAgICAgICAgICAgICAgIC8gIC4gLiAuICBcICAgICAgICAgICAgICAgICAuIC4gLiAgIFwKKyAgICAgICAgIFtlbnRyeV8wXzBdICAgLiAuIC4gIFtlbnRyeV8wXzEyN10gICAgLiAuIC4gLiAgW2VudHJ5XzFfMTI3XQorICAgICAgICAgICAvIC4uLiBcICAgICAgICAgICAgIC8gICAuIC4gLiAgXCAgICAgICAgICAgICAvICAgICAgICAgICBcCisgICAgIGJsa18wIC4uLiBibGtfMTI3ICBibGtfMTYyNTYgICBibGtfMTYzODMgICAgICBibGtfMzI2NDAgLiAuIC4gYmxrXzMyNzY3CisKKworT24tZGlzayBmb3JtYXQKKz09PT09PT09PT09PT09CisKK1RoZSB2ZXJpdHkga2VybmVsIGNvZGUgZG9lcyBub3QgcmVhZCB0aGUgdmVyaXR5IG1ldGFkYXRhIG9uLWRpc2sgaGVhZGVyLgorSXQgb25seSByZWFkcyB0aGUgaGFzaCBibG9ja3Mgd2hpY2ggZGlyZWN0bHkgZm9sbG93IHRoZSBoZWFkZXIuCitJdCBpcyBleHBlY3RlZCB0aGF0IGEgdXNlci1zcGFjZSB0b29sIHdpbGwgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlCit2ZXJpdHkgaGVhZGVyLgorCitBbHRlcm5hdGl2ZWx5LCB0aGUgaGVhZGVyIGNhbiBiZSBvbWl0dGVkIGFuZCB0aGUgZG1zZXR1cCBwYXJhbWV0ZXJzIGNhbgorYmUgcGFzc2VkIHZpYSB0aGUga2VybmVsIGNvbW1hbmQtbGluZSBpbiBhIHJvb3RlZCBjaGFpbiBvZiB0cnVzdCB3aGVyZQordGhlIGNvbW1hbmQtbGluZSBpcyB2ZXJpZmllZC4KKworRGlyZWN0bHkgZm9sbG93aW5nIHRoZSBoZWFkZXIgKGFuZCB3aXRoIHNlY3RvciBudW1iZXIgcGFkZGVkIHRvIHRoZSBuZXh0IGhhc2gKK2Jsb2NrIGJvdW5kYXJ5KSBhcmUgdGhlIGhhc2ggYmxvY2tzIHdoaWNoIGFyZSBzdG9yZWQgYSBkZXB0aCBhdCBhIHRpbWUKKyhzdGFydGluZyBmcm9tIHRoZSByb290KSwgc29ydGVkIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgaW5kZXguCisKK1RoZSBmdWxsIHNwZWNpZmljYXRpb24gb2Yga2VybmVsIHBhcmFtZXRlcnMgYW5kIG9uLWRpc2sgbWV0YWRhdGEgZm9ybWF0CitpcyBhdmFpbGFibGUgYXQgdGhlIGNyeXB0c2V0dXAgcHJvamVjdCdzIHdpa2kgcGFnZQorICBodHRwczovL2dpdGxhYi5jb20vY3J5cHRzZXR1cC9jcnlwdHNldHVwL3dpa2lzL0RNVmVyaXR5CisKK1N0YXR1cworPT09PT09CitWIChmb3IgVmFsaWQpIGlzIHJldHVybmVkIGlmIGV2ZXJ5IGNoZWNrIHBlcmZvcm1lZCBzbyBmYXIgd2FzIHZhbGlkLgorSWYgYW55IGNoZWNrIGZhaWxlZCwgQyAoZm9yIENvcnJ1cHRpb24pIGlzIHJldHVybmVkLgorCitFeGFtcGxlCis9PT09PT09CitTZXQgdXAgYSBkZXZpY2U6CisgICMgZG1zZXR1cCBjcmVhdGUgdnJvb3QgLS1yZWFkb25seSAtLXRhYmxlIFwKKyAgICAiMCAyMDk3MTUyIHZlcml0eSAxIC9kZXYvc2RhMSAvZGV2L3NkYTIgNDA5NiA0MDk2IDI2MjE0NCAxIHNoYTI1NiAiXAorICAgICI0MzkyNzEyYmEwMTM2OGVmZGYxNGIwNWM3NmY5ZTRkZjBkNTM2NjQ2MzBiNWQ0ODYzMmVkMTdhMTM3ZjM5MDc2ICJcCisgICAgIjEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCisKK0EgY29tbWFuZCBsaW5lIHRvb2wgdmVyaXR5c2V0dXAgaXMgYXZhaWxhYmxlIHRvIGNvbXB1dGUgb3IgdmVyaWZ5Cit0aGUgaGFzaCB0cmVlIG9yIGFjdGl2YXRlIHRoZSBrZXJuZWwgZGV2aWNlLiBUaGlzIGlzIGF2YWlsYWJsZSBmcm9tCit0aGUgY3J5cHRzZXR1cCB1cHN0cmVhbSByZXBvc2l0b3J5IGh0dHBzOi8vZ2l0bGFiLmNvbS9jcnlwdHNldHVwL2NyeXB0c2V0dXAvCisoYXMgYSBsaWJjcnlwdHNldHVwIGV4dGVuc2lvbikuCisKK0NyZWF0ZSBoYXNoIG9uIHRoZSBkZXZpY2U6CisgICMgdmVyaXR5c2V0dXAgZm9ybWF0IC9kZXYvc2RhMSAvZGV2L3NkYTIKKyAgLi4uCisgIFJvb3QgaGFzaDogNDM5MjcxMmJhMDEzNjhlZmRmMTRiMDVjNzZmOWU0ZGYwZDUzNjY0NjMwYjVkNDg2MzJlZDE3YTEzN2YzOTA3NgorCitBY3RpdmF0ZSB0aGUgZGV2aWNlOgorICAjIHZlcml0eXNldHVwIGNyZWF0ZSB2cm9vdCAvZGV2L3NkYTEgL2Rldi9zZGEyIFwKKyAgICA0MzkyNzEyYmEwMTM2OGVmZGYxNGIwNWM3NmY5ZTRkZjBkNTM2NjQ2MzBiNWQ0ODYzMmVkMTdhMTM3ZjM5MDc2CmRpZmYgLS1naXQgYS9kb2Mva2VybmVsL3plcm8udHh0IGIvZG9jL2tlcm5lbC96ZXJvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZiMzhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2tlcm5lbC96ZXJvLnR4dApAQCAtMCwwICsxLDM3IEBACitkbS16ZXJvCis9PT09PT09CisKK0RldmljZS1NYXBwZXIncyAiemVybyIgdGFyZ2V0IHByb3ZpZGVzIGEgYmxvY2stZGV2aWNlIHRoYXQgYWx3YXlzIHJldHVybnMKK3plcm8nZCBkYXRhIG9uIHJlYWRzIGFuZCBzaWxlbnRseSBkcm9wcyB3cml0ZXMuIFRoaXMgaXMgc2ltaWxhciBiZWhhdmlvciB0bworL2Rldi96ZXJvLCBidXQgYXMgYSBibG9jay1kZXZpY2UgaW5zdGVhZCBvZiBhIGNoYXJhY3Rlci1kZXZpY2UuCisKK0RtLXplcm8gaGFzIG5vIHRhcmdldC1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorCitPbmUgdmVyeSBpbnRlcmVzdGluZyB1c2Ugb2YgZG0temVybyBpcyBmb3IgY3JlYXRpbmcgInNwYXJzZSIgZGV2aWNlcyBpbgorY29uanVuY3Rpb24gd2l0aCBkbS1zbmFwc2hvdC4gQSBzcGFyc2UgZGV2aWNlIHJlcG9ydHMgYSBkZXZpY2Utc2l6ZSBsYXJnZXIKK3RoYW4gdGhlIGFtb3VudCBvZiBhY3R1YWwgc3RvcmFnZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRoYXQgZGV2aWNlLiBBIHVzZXIgY2FuCit3cml0ZSBkYXRhIGFueXdoZXJlIHdpdGhpbiB0aGUgc3BhcnNlIGRldmljZSBhbmQgcmVhZCBpdCBiYWNrIGxpa2UgYSBub3JtYWwKK2RldmljZS4gUmVhZHMgdG8gcHJldmlvdXNseSB1bndyaXR0ZW4gYXJlYXMgd2lsbCByZXR1cm4gYSB6ZXJvJ2QgYnVmZmVyLiBXaGVuCitlbm91Z2ggZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGZpbGwgdXAgdGhlIGFjdHVhbCBzdG9yYWdlIHNwYWNlLCB0aGUgc3BhcnNlCitkZXZpY2UgaXMgZGVhY3RpdmF0ZWQuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciB0ZXN0aW5nIGRldmljZSBhbmQKK2ZpbGVzeXN0ZW0gbGltaXRhdGlvbnMuCisKK1RvIGNyZWF0ZSBhIHNwYXJzZSBkZXZpY2UsIHN0YXJ0IGJ5IGNyZWF0aW5nIGEgZG0temVybyBkZXZpY2UgdGhhdCdzIHRoZQorZGVzaXJlZCBzaXplIG9mIHRoZSBzcGFyc2UgZGV2aWNlLiBGb3IgdGhpcyBleGFtcGxlLCB3ZSdsbCBhc3N1bWUgYSAxMFRCCitzcGFyc2UgZGV2aWNlLgorCitURU5fVEVSQUJZVEVTPWBleHByIDEwIFwqIDEwMjQgXCogMTAyNCBcKiAxMDI0IFwqIDJgICAgIyAxMCBUQiBpbiBzZWN0b3JzCitlY2hvICIwICRURU5fVEVSQUJZVEVTIHplcm8iIHwgZG1zZXR1cCBjcmVhdGUgemVybzEKKworVGhlbiBjcmVhdGUgYSBzbmFwc2hvdCBvZiB0aGUgemVybyBkZXZpY2UsIHVzaW5nIGFueSBhdmFpbGFibGUgYmxvY2stZGV2aWNlIGFzCit0aGUgQ09XIGRldmljZS4gVGhlIHNpemUgb2YgdGhlIENPVyBkZXZpY2Ugd2lsbCBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiByZWFsCitzcGFjZSBhdmFpbGFibGUgdG8gdGhlIHNwYXJzZSBkZXZpY2UuIEZvciB0aGlzIGV4YW1wbGUsIHdlJ2xsIGFzc3VtZSAvZGV2L3NkYjEKK2lzIGFuIGF2YWlsYWJsZSAxMEdCIHBhcnRpdGlvbi4KKworZWNobyAiMCAkVEVOX1RFUkFCWVRFUyBzbmFwc2hvdCAvZGV2L21hcHBlci96ZXJvMSAvZGV2L3NkYjEgcCAxMjgiIHwgXAorICAgZG1zZXR1cCBjcmVhdGUgc3BhcnNlMQorCitUaGlzIHdpbGwgY3JlYXRlIGEgMTBUQiBzcGFyc2UgZGV2aWNlIGNhbGxlZCAvZGV2L21hcHBlci9zcGFyc2UxIHRoYXQgaGFzCisxMEdCIG9mIGFjdHVhbCBzdG9yYWdlIHNwYWNlIGF2YWlsYWJsZS4gSWYgbW9yZSB0aGFuIDEwR0Igb2YgZGF0YSBpcyB3cml0dGVuCit0byB0aGlzIGRldmljZSwgaXQgd2lsbCBzdGFydCByZXR1cm5pbmcgSS9PIGVycm9ycy4KKwpkaWZmIC0tZ2l0IGEvZG9jL2x2bTItcmFpZC50eHQgYi9kb2MvbHZtMi1yYWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYwOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2x2bTItcmFpZC50eHQKQEAgLTAsMCArMSw0NzUgQEAKKz09PT09PT09PT09PT09PT09PT09PT09Cis9IExWTSBSQUlEIERlc2lnbiBEb2MgPQorPT09PT09PT09PT09PT09PT09PT09PT0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hhcHRlciAxOiBVc2VyLUludGVyZmFjZSAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisqKioqKioqKioqKioqKioqKiBDUkVBVElORyBBIFJBSUQgREVWSUNFICoqKioqKioqKioqKioqKioqKgorCiswMTogbHZjcmVhdGUgLS10eXBlIDxSQUlEIHR5cGU+IFwKKzAyOgkgICAgIFstLXJlZ2lvbnNpemUgPHNpemU+XSBcCiswMzoJICAgICBbLWkvLS1zdHJpcGVzIDwjPl0gWy1JLC0tc3RyaXBlc2l6ZSA8c2l6ZT5dIFwKKzA0OgkgICAgIFstbS8tLW1pcnJvcnMgPCM+XSBcCiswNToJICAgICBbLS1bbWlufG1heF1yZWNvdmVyeXJhdGUgPGtCL3NlYy9kaXNrPl0gXAorMDY6CSAgICAgWy0tc3RyaXBlY2FjaGUgPHNpemU+XSBcCiswNzoJICAgICBbLS13cml0ZW1vc3RseSA8ZGV2aWNlcz5dIFwKKzA4OgkgICAgIFstLW1heHdyaXRlYmVoaW5kIDxzaXplPl0gXAorMDk6CSAgICAgW1tub11zeW5jXSBcCisxMDoJICAgICA8T3RoZXIgbm9ybWFsIGFyZ3MsIGxpa2U6IC1MIDVHIC1uIGx2IHZnPiBcCisxMToJICAgICBbZGV2aWNlc10KKworTGluZSAwMToKK0kgZG9uJ3QgaW50ZW5kIGZvciB0aGVyZSB0byBiZSBzaG9ydGhhbmQgb3B0aW9ucyBmb3Igc3BlY2lmeWluZyB0aGUKK3NlZ21lbnQgdHlwZS4gIFRoZSBhdmFpbGFibGUgUkFJRCB0eXBlcyBhcmU6CisJInJhaWQwIiAgLSBTdHJpcGUgW05PVCBJTVBMRU1FTlRFRF0KKwkicmFpZDEiICAtIHNob3VsZCByZXBsYWNlIERNIE1pcnJvcmluZworCSJyYWlkMTAiIC0gc3RyaXBlZCBtaXJyb3JzLCBbTk9UIElNUExFTUVOVEVEXQorCSJyYWlkNCIgIC0gUkFJRDQKKwkicmFpZDUiICAtIFNhbWUgYXMgInJhaWQ1X2xzIiAoU2FtZSBkZWZhdWx0IGFzIE1EKQorCSJyYWlkNV9sYSIgLSBSQUlENSBSb3RhdGluZyBwYXJpdHkgMCB3aXRoIGRhdGEgY29udGludWF0aW9uCisJInJhaWQ1X3JhIiAtIFJBSUQ1IFJvdGF0aW5nIHBhcml0eSBOIHdpdGggZGF0YSBjb250aW51YXRpb24KKwkicmFpZDVfbHMiIC0gUkFJRDUgUm90YXRpbmcgcGFyaXR5IDAgd2l0aCBkYXRhIHJlc3RhcnQKKwkicmFpZDVfcnMiIC0gUkFJRDUgUm90YXRpbmcgcGFyaXR5IE4gd2l0aCBkYXRhIHJlc3RhcnQKKwkicmFpZDYiICAgIC0gU2FtZSBhcyAicmFpZDZfenIiCisJInJhaWQ2X3pyIiAtIFJBSUQ2IFJvdGF0aW5nIHBhcml0eSAwIHdpdGggZGF0YSByZXN0YXJ0CisJInJhaWQ2X25yIiAtIFJBSUQ2IFJvdGF0aW5nIHBhcml0eSBOIHdpdGggZGF0YSByZXN0YXJ0CisJInJhaWQ2X25jIiAtIFJBSUQ2IFJvdGF0aW5nIHBhcml0eSBOIHdpdGggZGF0YSBjb250aW51YXRpb24KK1RoZSBleGNlcHRpb24gdG8gJ25vIHNob3J0aGFuZCBvcHRpb25zJyB3aWxsIGJlIHdoZXJlIHRoZSBSQUlEIGltcGxlbWVudGF0aW9ucworY2FuIGRpc3BsYWNlIHRyYWRpdGlvbmFsIHRhZ2V0cy4gIFRoaXMgaXMgdGhlIGNhc2Ugd2l0aCAnbWlycm9yJyBhbmQgJ3JhaWQxJy4KK0luIHRoaXMgY2FzZSwgIm1pcnJvcl9zZWd0eXBlX2RlZmF1bHQiIC0gZm91bmQgdW5kZXIgdGhlICJnbG9iYWwiIHNlY3Rpb24gaW4KK2x2bS5jb25mIC0gY2FuIGJlIHNldCB0byAibWlycm9yIiBvciAicmFpZDEiLiAgVGhlIHNlZ21lbnQgdHlwZSBpbmZlcnJlZCB3aGVuCit0aGUgJy1tJyBvcHRpb24gaXMgdXNlZCB3aWxsIGJlIHRha2VuIGZyb20gdGhpcyBzZXR0aW5nLiAgVGhlIGRlZmF1bHQgc2VnbWVudAordHlwZXMgY2FuIGJlIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZSBieSB1c2luZyB0aGUgJy0tdHlwZScgYXJndW1lbnQuCisKK0xpbmUgMDI6CitSZWdpb24gc2l6ZSBpcyByZWxldmFudCBmb3IgYWxsIFJBSUQgdHlwZXMuICBJdCBkZWZpbmVzIHRoZSBncmFudWxhcml0eSBmb3IKK3doaWNoIHRoZSBiaXRtYXAgd2lsbCB0cmFjayB0aGUgYWN0aXZlIGFyZWFzIG9mIGRpc2suICBUaGUgZGVmYXVsdCBpcyBjdXJyZW50bHkKKzRNaUIuICBJIHNlZSBubyByZWFzb24gdG8gY2hhbmdlIHRoaXMgdW5sZXNzIGl0IGlzIGEgcHJvYmxlbSBmb3IgTUQgcGVyZm9ybWFuY2UuCitNRCBkb2VzIGltcG9zZSBhIHJlc3RyaWN0aW9uIG9mIDJeMjEgcmVnaW9ucyBmb3IgYSBnaXZlbiBkZXZpY2UsIGhvd2V2ZXIuICBUaGlzCittZWFucyB0d28gdGhpbmdzOiAxKSB3ZSBzaG91bGQgbmV2ZXIgbmVlZCBhIG1ldGFkYXRhIGFyZWEgbGFyZ2VyIHRoYW4KKzhraUIrc2l6ZW9mKHN1cGVyYmxvY2spK2JpdG1hcF9vZmZzZXQgKElPVywgcHJldHR5IHNtYWxsKSBhbmQgMikgdGhlIHJlZ2lvbgorc2l6ZSB3aWxsIGhhdmUgdG8gYmUgdXB3YXJkbHkgcmV2aXNlZCBpZiB0aGUgZGV2aWNlIGlzIGxhcmdlciB0aGFuIDhUaUIKKyhhc3N1bWluZyBkZWZhdWx0cykuCisKK0xpbmUgMDMvMDQ6CitUaGUgJy1tLy0tbWlycm9ycycgb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gUkFJRDEgYW5kIHdpbGwgYmUgdXNlZCBqdXN0IGxpa2UKK2l0IGlzIHRvZGF5IGZvciBETSBtaXJyb3JpbmcuICBGb3IgYWxsIG90aGVyIFJBSUQgdHlwZXMsIC1pLy0tc3RyaXBlcyBhbmQKKy1JLy0tc3RyaXBlc2l6ZSBhcmUgcmVsZXZhbnQuICBUaGUgZm9ybWVyIHdpbGwgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGRhdGEKK2RldmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHN0cmlwaW5nLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIHNwZWNpZmllcworJy0tdHlwZSByYWlkMCAtaSAzJywgdGhlbiAzIGRldmljZXMgYXJlIG5lZWRlZC4gIElmIHRoZSB1c2VyIHNwZWNpZmllcworJy0tdHlwZSByYWlkNiAtaSAzJywgdGhlbiA1IGRldmljZXMgYXJlIG5lZWRlZC4gIFRoZSAtSS8tLXN0cmlwZXNpemUgbWF5IGJlCitjb25mdXNpbmcgdG8gTUQgdXNlcnMsIGFzIHRoZXkgdXNlIHRoZSB0ZXJtICJjaHVua3NpemUiLiAgSSB0aGluayB0aGV5IHdpbGwKK2FkYXB0IHdpdGhvdXQgaXNzdWUgYW5kIEkgZG9uJ3Qgd2lzaCB0byBjcmVhdGUgYSBjb25mbGljdCB3aXRoIHRoZSB0ZXJtCisiY2h1bmtzaXplIiB0aGF0IHdlIHVzZSBmb3Igc25hcHNob3RzLgorCitMaW5lIDA1LzA2LzA3OgorSSdtIHN0aWxsIG5vdCBjbGVhciBvbiBob3cgdG8gc3BlY2lmeSB0aGVzZSBvcHRpb25zLiAgU29tZSBhcmUgZWFzaWVyIHRoYW4KK290aGVycy4gICctLXdyaXRlbW9zdGx5JyBpcyBwYXJ0aWN1bGFybHkgaGFyZCBiZWNhdXNlIGl0IGludm9sdmVzIHNwZWNpZnlpbmcKK3doaWNoIGRldmljZXMgc2hhbGwgYmUgJ3dyaXRlLW1vc3RseScgYW5kIHRodXMsIGFsc28gaGF2ZSAnbWF4LXdyaXRlLWJlaGluZCcKK2FwcGxpZWQgdG8gdGhlbS4gIEl0IGhhcyBiZWVuIHN1Z2dlc3RlZCB0aGF0IGEgJy0tcmVhZG1vc3RseScvJy0tcmVhZGZhdm9yZWQnCitvciBzaW1pbGFyIG9wdGlvbiBjb3VsZCBiZSBpbnRyb2R1Y2VkIGFzIGEgd2F5IHRvIHNwZWNpZnkgYSBwcmltYXJ5IGRpc2sgdnMuCitzcGVjaWZ5aW5nIGFsbCB0aGUgbm9uLXByaW1hcnkgZGlza3MgdmlhICctLXdyaXRlbW9zdGx5Jy4gIEkgbGlrZSB0aGlzIGlkZWEsCitidXQgaGF2ZW4ndCBjb21lIHVwIHdpdGggYSBnb29kIG5hbWUgeWV0LiAgVGh1cywgdGhlc2Ugd2lsbCByZW1haW4KK3VuaW1wbGVtZW50ZWQgdW50aWwgZnV0dXJlIHNwZWNpZmljYXRpb24uCisKK0xpbmUgMDkvMTAvMTE6CitUaGVzZSBhcmUgZmFtaWxpYXIuCisKK0Z1cnRoZXIgY3JlYXRpb24gcmVsYXRlZCBpZGVhczoKK1RvZGF5LCB5b3UgY2FuIHNwZWNpZnkgJy0tdHlwZSBtaXJyb3InIHdpdGhvdXQgYW4gJy1tLy0tbWlycm9ycycgYXJndW1lbnQKK25lY2Vzc2FyeS4gIFRoZSBudW1iZXIgb2YgZGV2aWNlcyBkZWZhdWx0cyB0byB0d28gKGFuZCB0aGUgbG9nIGRlZmF1bHRzIHRvCisnZGlzaycpLiAgQSBzaW1pbGFyIHRoaW5nIHNob3VsZCBoYXBwZW4gd2l0aCB0aGUgUkFJRCB0eXBlcy4gIEFsbCBvZiB0aGVtCitzaG91bGQgZGVmYXVsdCB0byBoYXZpbmcgdHdvIGRhdGEgZGV2aWNlcyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gIFRoaXMKK3dvdWxkIG1lYW4gYSB0b3RhbCBudW1iZXIgb2YgMiBkZXZpY2VzIGZvciBSQUlEIDAvMSwgMyBkZXZpY2VzIGZvciBSQUlEIDQvNSwKK2FuZCA0IGRldmljZXMgZm9yIFJBSUQgNi8xMC4KKworCisqKioqKioqKioqKioqKioqKiBDT05WRVJUSU5HIEEgUkFJRCBERVZJQ0UgKioqKioqKioqKioqKioqKioqCisKKzAxOiBsdmNvbnZlcnQgWy0tdHlwZSA8UkFJRCB0eXBlPl0gXAorMDI6CSAgICAgIFstUi8tLXJlZ2lvbnNpemUgPHNpemU+XSBcCiswMzoJICAgICAgWy1pLy0tc3RyaXBlcyA8Iz5dIFstSSwtLXN0cmlwZXNpemUgPHNpemU+XSBcCiswNDoJICAgICAgWy1tLy0tbWlycm9ycyA8Iz5dIFwKKzA1OgkgICAgICBbLS1tZXJnZV0KKzA2OgkgICAgICBbLS1zcGxpdG1pcnJvcnMgPCM+IFstLXRyYWNrY2hhbmdlc11dIFwKKzA3OgkgICAgICBbLS1yZXBsYWNlIDxzdWJfbHZ8ZGV2aWNlPl0gXAorMDg6CSAgICAgIFstLVttaW58bWF4XXJlY292ZXJ5cmF0ZSA8a0Ivc2VjL2Rpc2s+XSBcCiswOToJICAgICAgWy0tc3RyaXBlY2FjaGUgPHNpemU+XSBcCisxMDoJICAgICAgWy0td3JpdGVtb3N0bHkgPGRldmljZXM+XSBcCisxMToJICAgICAgWy0tbWF4d3JpdGViZWhpbmQgPHNpemU+XSBcCisxMjoJICAgICAgdmcvbHYKKzEzOgkgICAgICBbZGV2aWNlc10KKworbHZjb252ZXJ0IHNob3VsZCB3b3JrIGV4YWN0bHkgYXMgaXQgZG9lcyBub3cgd2hlbiBkZWFsaW5nIHdpdGggbWlycm9ycyAtCitldmVuIGlmKHdoZW4pIHdlIHN3aXRjaCB0byBNRCBSQUlEMS4gIE9mIGNvdXJzZSwgdGhlcmUgYXJlIG5vIHBsYW5zIHRvCithbGxvdyB0aGUgcHJlc2Vuc2Ugb2YgdGhlIG1ldGFkYXRhIGFyZWEgdG8gYmUgY29uZmlndXJhYmxlIChlLmcuIC0tY29yZWxvZykuCitJdCB3aWxsIGJlIHNpbXBsZSBlbm91Z2ggdG8gZGV0ZWN0IGlmIHRoZSBMViBiZWluZyB1cC9kb3duLWNvbnZlcnRlZCBpcworbmV3IG9yIG9sZC1zdHlsZSBtaXJyb3JpbmcuCisKK0lmIHdlIGNob29zZSB0byB1c2UgTUQgUkFJRDAgYXMgd2VsbCwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlCitudW1iZXIgb2Ygc3RyaXBlcyBhbmQgdGhlIHN0cmlwZXNpemUuICBJdCBpcyB0aGVyZWZvcmUgY29uY2VpdmFibGUgdG8gc2VlCitzb21ldGhpbmcgbGlrZSwgJ2x2Y29udmVydCAtaSArMSB2Zy9sdicuCisKK0xpbmUgMDE6CitJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIFJBSUQgdHlwZSBvZiBhbiBMViAtIGV2ZW4gaWYgdGhhdCBMViBpcyBhbHJlYWR5CithIFJBSUQgZGV2aWNlIG9mIGEgZGlmZmVyZW50IHR5cGUuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGNoYW5nZSBmcm9tCitSQUlENCB0byBSQUlENSBvciBSQUlENSB0byBSQUlENi4KKworTGluZSAwMi8wMy8wNDoKK1RoZXNlIGFyZSBmYW1pbGlhciBvcHRpb25zIC0gYWxsIG9mIHdoaWNoIHdvdWxkIG5vdyBiZSBhdmFpbGFibGUgYXMgb3B0aW9ucworZm9yIGNoYW5nZS4gIChIb3dldmVyLCBpdCdkIGJlIG5pY2UgaWYgd2UgZGlkbid0IGhhdmUgcmVnaW9uc2l6ZSBpbiB0aGVyZS4KK0l0J3Mgc2ltcGxlIG9uIHRoZSBrZXJuZWwgc2lkZSwgYnV0IGlzIGp1c3QgYW4gZXh0cmEgLSBvZnRlbiB1bmVjZXNzYXJ5IC0KK3BhcmFtZXRlciB0byBtYW55IGZ1bmN0aW9ucyBpbiB0aGUgTFZNIGNvZGViYXNlLikKKworTGluZSAwNToKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gbWVyZ2UgYW4gTFYgYmFjayBpbnRvIGEgUkFJRDEgYXJyYXkgLSBwcm92aWRlZCBpdCB3YXMKK3NwbGl0IGZvciB0ZW1wb3JhcnkgcmVhZC1vbmx5IHVzZSBieSAnLS1zcGxpdG1pcnJvcnMgMSAtLXRyYWNrY2hhbmdlcycuCisKK0xpbmUgMDY6CitUaGUgJy0tc3BsaXRtaXJyb3JzIDwjPicgYXJndW1lbnQgc2hvdWxkIGJlIGZhbWlsaWFyIGZyb20gdGhlICJtaXJyb3IiIHNlZ21lbnQKK3R5cGUuICBJdCBhbGxvd3MgUkFJRDEgaW1hZ2VzIHRvIGJlIHNwbGl0IGZyb20gdGhlIGFycmF5IHRvIGZvcm0gYSBuZXcgTFYuCitFaXRoZXIgdGhlIG9yaWdpbmFsIExWIG9yIHRoZSBzcGxpdCBMViAtIG9yIGJvdGggLSBjb3VsZCBiZWNvbWUgYSBsaW5lYXIgTFYgYXMKK2EgcmVzdWx0LiAgSWYgdGhlICctLXRyYWNrY2hhbmdlcycgYXJndW1lbnQgaXMgc3BlY2lmaWVkIGluIGFkZGl0aW9uIHRvCisnLS1zcGxpdG1pcnJvcnMnLCBhbiBMViB3aWxsIGJlIHNwbGl0IGZyb20gdGhlIGFycmF5LiAgSXQgd2lsbCBiZSByZWFkLW9ubHkuCitUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9yaWdpbmFsIGFycmF5IC0gZXhjZXB0IHRoYXQgaXQgdXNlcyBhbiBlbXB0eQorc2xvdCB0byBob2xkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3BsaXQgTFYgd2hpY2ggaXQgZXhwZWN0cyB0byByZXR1cm4gaW4gdGhlCitmdXR1cmUgKHNlZSB0aGUgJy0tbWVyZ2UnIGFyZ3VtZW50KS4gIEl0IHRyYWNrcyBhbnkgY2hhbmdlcyB0aGF0IG9jY3VyIHRvIHRoZQorYXJyYXkgd2hpbGUgdGhlIHNsb3QgaXMga2VwdCBpbiByZXNlcnZlLiAgSWYgdGhlIExWIGlzIG1lcmdlZCBiYWNrIGludG8gdGhlCithcnJheSwgb25seSB0aGUgY2hhbmdlcyBhcmUgcmVzeW5jJ2VkIHRvIHRoZSByZXR1cm5pbmcgaW1hZ2UuICBSZXBlYXRpbmcgdGhlCisnbHZjb252ZXJ0JyBvcGVyYXRpb24gd2l0aG91dCB0aGUgJy0tdHJhY2tjaGFuZ2VzJyBvcHRpb24gd2lsbCBjb21wbGV0ZSB0aGUKK3NwbGl0IG9mIHRoZSBMViBwZXJtYW5lbnRseS4KKworTGluZSAwNzoKK1RoaXMgb3B0aW9uIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgc3ViX2x2IChlLmcuIGEgbWlycm9yIGltYWdlKSBvcgorYSBwYXJ0aWN1bGFyIGRldmljZSBmb3IgcmVwbGFjZW1lbnQuICBUaGUgZGV2aWNlIChvciBhbGwgdGhlIGRldmljZXMgaW4KK3RoZSBzdWJfbHYpIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCBkaWZmZXJlbnQgZGV2aWNlcyBmcm9tIHRoZQorVkcuCisKK0xpbmUgMDgvMDkvMTAvMTE6CitJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYWx0ZXIgdGhlc2UgcGFyYW1ldGVycyBvZiBhIFJBSUQgZGV2aWNlLiAgQXMgd2l0aAorbHZjcmVhdGUsIGhvd2V2ZXIsIEknbSBub3QgZW50aXJlbHkgY2VydGFpbiBob3cgdG8gYmVzdCBkZWZpbmUgc29tZSBvZiB0aGVzZS4KK1dlIGRvbid0IG5lZWQgYWxsIHRoZSBjYXBhYmlsaXRpZXMgYXQgb25jZSB0aG91Z2gsIHNvIGl0IGlzbid0IGEgcHJlc3NpbmcKK2lzc3VlLgorCitMaW5lIDEyOgorVGhlIExWIHRvIG9wZXJhdGUgb24uCisKK0xpbmUgMTM6CitEZXZpY2VzIHRoYXQgYXJlIHRvIGJlIHVzZWQgdG8gc2F0aXNmeSB0aGUgY29udmVyc2lvbiByZXF1ZXN0LiAgSWYgdGhlCitvcGVyYXRpb24gcmVtb3ZlcyBkZXZpY2VzIG9yIHNwbGl0cyBhIG1pcnJvciwgdGhlbiB0aGUgZGV2aWNlcyBzcGVjaWZpZWQKK2Zvcm0gdGhlIGxpc3Qgb2YgY2FuZGlkYXRlcyBmb3IgcmVtb3ZhbC4gIElmIHRoZSBvcGVyYXRpb24gYWRkcyBvciByZXBsYWNlcworZGV2aWNlcywgdGhlbiB0aGUgZGV2aWNlcyBzcGVjaWZpZWQgZm9ybSB0aGUgbGlzdCBvZiBjYW5kaWRhdGVzIGZvciBhbGxvY2F0aW9uLgorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hhcHRlciAyOiBMVk0gUkFJRCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgc29tZXdoYXQgbGlrZSBtaXJyb3JpbmcsIGJ1dCB3aXRoIGFsdGVyYXRpb25zCitmb3IgdGhlIGRpZmZlcmVudCBtZXRhZGF0YSBjb21wb25lbnRzLiAgTFZNIG1pcnJvcmluZyBoYXMgYSBzaW5nbGUgbG9nIExWLAorYnV0IFJBSUQgd2lsbCBoYXZlIG9uZSBmb3IgZWFjaCBkYXRhIGRldmljZS4gIEJlY2F1c2Ugb2YgdGhpcywgSSd2ZSBhZGRlZCBhCituZXcgJ2FyZWFzJyBsaXN0IHRvIHRoZSAnc3RydWN0IGx2X3NlZ21lbnQnIC0gJ21ldGFfYXJlYXMnLiAgVGhlcmUgaXMgZXhhY3RseQorYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuICdhcmVhcycgYW5kICdtZXRhX2FyZWFzJy4gIFRoZSAnYXJlYXMnIGFycmF5CitzdGlsbCBob2xkcyB0aGUgZGF0YSBzdWItbHYncyAoc2ltaWxhciB0byBtaXJyb3JpbmcpLCB3aGlsZSB0aGUgJ21ldGFfYXJlYXMnCithcnJheSBob2xkcyB0aGUgbWV0YWRhdGEgc3ViLWx2J3MgKGFraW4gdG8gdGhlIG1pcnJvcmluZyBsb2cgZGV2aWNlKS4KKworVGhlIHN1Yl9sdnMgd2lsbCBiZSBuYW1lZCAnJXNfcmltYWdlXyVkJyBpbnN0ZWFkIG9mICclc19taW1hZ2VfJWQnIGFzIGl0IGlzCitmb3IgbWlycm9yaW5nLCBhbmQgJyVzX3JtZXRhXyVkJyBpbnN0ZWFkIG9mICclc19tbG9nJy4gIFRodXMsIHlvdSBjYW4gaW1hZ2luZQorYW4gTFYgbmFtZWQgJ2Zvbycgd2l0aCB0aGUgZm9sbG93aW5nIGxheW91dDoKK2ZvbworW2ZvbydzIGx2X3NlZ21lbnRdCit8Cit8LT4gZm9vX3JpbWFnZV8wIChhcmVhc1swXSkKK3wgICBbZm9vX3JpbWFnZV8wJ3MgbHZfc2VnbWVudF0KK3wtPiBmb29fcmltYWdlXzEgKGFyZWFzWzFdKQorfCAgIFtmb29fcmltYWdlXzEncyBsdl9zZWdtZW50XQorfAorfC0+IGZvb19ybWV0YV8wIChtZXRhX2FyZWFzWzBdKQorfCAgIFtmb29fcm1ldGFfMCdzIGx2X3NlZ21lbnRdCit8LT4gZm9vX3JtZXRhXzEgKG1ldGFfYXJlYXNbMV0pCit8ICAgW2Zvb19ybWV0YV8xJ3MgbHZfc2VnbWVudF0KKworTFZNIE1ldGEtZGF0YSBmb3JtYXQKKz09PT09PT09PT09PT09PT09PT09CitUaGUgUkFJRCBmb3JtYXQgd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gc3RvcmUgcGFyYW1ldGVycyB0aGF0IGFyZSB1bmlxdWUgdG8KK1JBSUQgYW5kIHVuaXF1ZSB0byBzcGVjaWZpYyBSQUlEIHN1Yi1kZXZpY2VzLiAgSXQgd2lsbCBiZSBtb2RlbGVkIGFmdGVyIHRoYXQKK29mIG1pcnJvcmluZy4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBtaXJyb3JpbmcgbGF5b3V0OgorbHYgeworCWlkID0gImFnTDF2UC0xQjhaLTV2bkItNDFjUy1saEJKLUdjdnotZGgzTDNIIgorCXN0YXR1cyA9IFsiUkVBRCIsICJXUklURSIsICJWSVNJQkxFIl0KKwlmbGFncyA9IFtdCisJc2VnbWVudF9jb3VudCA9IDEKKworCXNlZ21lbnQxIHsKKwkJc3RhcnRfZXh0ZW50ID0gMAorCQlleHRlbnRfY291bnQgPSAxMjUgICAgICAjIDUwMCBNZWdhYnl0ZXMKKworCQl0eXBlID0gIm1pcnJvciIKKwkJbWlycm9yX2NvdW50ID0gMgorCQltaXJyb3JfbG9nID0gImx2X21sb2ciCisJCXJlZ2lvbl9zaXplID0gMTAyNAorCisJCW1pcnJvcnMgPSBbCisJCQkibHZfbWltYWdlXzAiLCAwLAorCQkJImx2X21pbWFnZV8xIiwgMAorCQldCisJfQorfQorCitUaGUgcmVhbCB0cmljayBpcyBkZWFsaW5nIHdpdGggdGhlIG1ldGFkYXRhIGRldmljZXMuICBNaXJyb3JpbmcgaGFzIGFuIGVudHJ5LAorJ21pcnJvcl9sb2cnLCBpbiB0aGUgdG9wLWxldmVsIHNlZ21lbnQuICBUaGlzIHdvbid0IHdvcmsgZm9yIFJBSUQgYmVjYXVzZSB0aGVyZQoraXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbiB0aGUgZGF0YSBkZXZpY2VzIGFuZCB0aGUgbWV0YWRhdGEgZGV2aWNlcy4gIFRoZQorbWlycm9yIGRldmljZXMgYXJlIGxheWVkLW91dCBpbiBzdWItZGV2aWNlL2xlIHBhaXJzLiAgVGhlICdsZScgcGFyYW1ldGVyIGlzCityZWR1bmRhbnQgc2luY2UgaXQgd2lsbCBhbHdheXMgYmUgemVyby4gIFNvIGZvciBSQUlELCBJIGhhdmUgc2ltcGxlIHB1dCB0aGUKK21ldGFkYXRhIGFuZCBkYXRhIGRldmljZXMgaW4gcGFpcnMgd2l0aG91dCB0aGUgJ2xlJyBwYXJhbWV0ZXIuCisKK1JBSUQgbWV0YWRhdGE6CitsdiB7CisJaWQgPSAiRW5wcUFNLTVQRWctaTl3Qi01YW1uLVAxMTYtMVQ4ay1uUzNHZkQiCisJc3RhdHVzID0gWyJSRUFEIiwgIldSSVRFIiwgIlZJU0lCTEUiXQorCWZsYWdzID0gW10KKwlzZWdtZW50X2NvdW50ID0gMQorCisJc2VnbWVudDEgeworCQlzdGFydF9leHRlbnQgPSAwCisJCWV4dGVudF9jb3VudCA9IDEyNSAgICAgICMgNTAwIE1lZ2FieXRlcworCisJCXR5cGUgPSAicmFpZDEiCisJCWRldmljZV9jb3VudCA9IDIKKwkJcmVnaW9uX3NpemUgPSAxMDI0CisKKwkJcmFpZHMgPSBbCisJCQkibHZfcm1ldGFfMCIsICJsdl9yaW1hZ2VfMCIsCisJCQkibHZfcm1ldGFfMSIsICJsdl9yaW1hZ2VfMSIsCisJCV0KKwl9Cit9CisKK1RoZSBtZXRhZGF0YSBhbHNvIG11c3QgYmUgY2FwYWJsZSBvZiByZXByZXNlbnRpbmcgdGhlIHZhcmlvdXMgdHVuYWJsZXMuICBXZQorYWxyZWFkeSBoYXZlIGEgZ29vZCBleGFtcGxlIGZvciBvbmUgZnJvbSBtaXJyb3JpbmcsIHJlZ2lvbl9zaXplLgorJ21heF93cml0ZV9iZWhpbmQnLCAnc3RyaXBlX2NhY2hlJywgYW5kICdbbWlufG1heF1fcmVjb3ZlcnlfcmF0ZScgY291bGQgYWxzbworYmUgaGFuZGxlZCBpbiB0aGlzIHdheS4gIEhvd2V2ZXIsICd3cml0ZV9tb3N0bHknIGNhbm5vdCBiZSBoYW5kbGVkIGluIHRoaXMKK3dheSwgYmVjYXVzZSBpdCBpcyBhIGNoYXJhY3RlcmlzdGljIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ViX2x2cywgbm90IHRoZQorYXJyYXkgYXMgYSB3aG9sZS4gIEluIHRoZXNlIGNhc2VzLCB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoZSBzdWItbHYncyB0aGVtc2VsdmVzCit3aWxsIGhvbGQgdGhlc2UgZmxhZ3MgLSB0aGUgbWVhbmluZyBiZWluZyBvbmx5IHVzZWZ1bCBpbiB0aGUgbGFyZ2VyIGNvbnRleHQuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGFwdGVyIDM6IExWTSBSQUlEIGltcGxlbWVudGF0aW9uIGRldGFpbHMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitOZXcgU2VnbWVudCBUeXBlKHMpCis9PT09PT09PT09PT09PT09PT09CitJJ3ZlIGNyZWF0ZWQgYSBuZXcgZmlsZSAnbGliL3JhaWQvcmFpZC5jJyB0aGF0IHdpbGwgaGFuZGxlIHRoZSB2YXJpb3VzIGRpZmZlcmVudAorUkFJRCB0eXBlcy4gIFdoaWxlIHRoZXJlIHdpbGwgYmUgYSB1bmlxdWUgc2VnbWVudCB0eXBlIGZvciBlYWNoIFJBSUQgdmFyaWFudCwKK3RoZXkgd2lsbCBhbGwgc2hhcmUgYSBjb21tb24gYmFja2VuZCAtIHNlZ3R5cGVfaGFuZGxlciBmdW5jdGlvbnMgYW5kCitzZWd0eXBlLT5mbGFncyA9IFNFR19SQUlELgorCitJJ20gYWxzbyBhZGRpbmcgYSBuZXcgZmllbGQgdG8gJ3N0cnVjdCBzZWdtZW50X3R5cGUnLCBwYXJpdHlfZGV2cy4gIEZvciBldmVyeQorc2VnbWVudF90eXBlIGV4Y2VwdCBSQUlENC81LzYsIHRoaXMgd2lsbCBiZSAwLiAgVGhpcyBmaWVsZCBmYWNpbGl0YXRlcyBpbgorYWxsb2NhdGlvbiBhbmQgc2l6ZSBjYWxjdWxhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIGx2Y3JlYXRlIGZvciBSQUlENSB3b3VsZAorbG9vayBzb21ldGhpbmcgbGlrZToKK34+IGx2Y3JlYXRlIC0tdHlwZSByYWlkNSAtTCAzMEcgLWkgMyAtbiBteV9yYWlkNSBteV92Zworb3IKK34+IGx2Y3JlYXRlIC0tdHlwZSByYWlkNSAtbiBteV9yYWlkNSBteV92ZyAvZGV2L3NkW2JjZGVmXTEKKworSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgc3RyaXBlIGNvdW50ICgzKSBhbmQgZGV2aWNlIHNpemUgYXJlIGNvbXB1dGVkLCBhbmQKK3RoZW4gJ3NlZ3R5cGUtPnBhcml0eV9kZXZzJyBleHRyYSBkZXZpY2VzIGFyZSBhbGxvY2F0ZWQgb2YgdGhlIHNhbWUgc2l6ZS4gIEluCit0aGUgbGF0dGVyIGNhc2UsIHRoZSBudW1iZXIgb2YgUFZzIGlzIGRldGVybWluZWQgYW5kICdzZWd0eXBlLT5wYXJpdHlfZGV2cycgaXMKK3N1YnRyYWN0ZWQgb2ZmIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN0cmlwZXMuCisKK1RoaXMgc2hvdWxkIGFsc28gd29yayBpbiB0aGUgY2FzZSBvZiBSQUlEMTAgYW5kIGRvaW5nIHRoaW5ncyBpbiB0aGlzIG1hbm9yCitzaG91bGQgbm90IGFmZmVjdCB0aGUgd2F5IHNpemUgaXMgY2FsY3VsYXRlZCB2aWEgdGhlIGFyZWFfbXVsdGlwbGUuCisKK0FsbG9jYXRpb24KKz09PT09PT09PT0KK1doZW4gYSBSQUlEIGRldmljZSBpcyBjcmVhdGVkLCBtZXRhZGF0YSBMVnMgbXVzdCBiZSBjcmVhdGVkIGFsb25nIHdpdGggdGhlCitkYXRhIExWcyB0aGF0IHdpbGwgdWx0aW1hdGVseSBjb21wb3NlIHRoZSB0b3AtbGV2ZWwgUkFJRCBhcnJheS4gIEZvciB0aGUKK2ZvcmVzZWVhYmxlIGZ1dHVyZSwgdGhlIG1ldGFkYXRhIExWcyBtdXN0IHJlc2lkZSBvbiB0aGUgc2FtZSBkZXZpY2UgYXMgKG9yCithdCBsZWFzdCBvbmUgb2YgdGhlIGRldmljZXMgdGhhdCBjb21wb3NlKSB0aGUgZGF0YSBMVi4gIFdlIHVzZSB0aGlzIHByb3BlcnR5Cit0byBzaW1wbGlmeSB0aGUgYWxsb2NhdGlvbiBwcm9jZXNzLiAgUmF0aGVyIHRoYW4gYWxsb2NhdGluZyBmb3IgdGhlIGRhdGEgTFZzCithbmQgdGhlbiBhc2tpbmcgZm9yIGEgc21hbGwgY2h1bmsgb2Ygc3BhY2Ugb24gdGhlIHNhbWUgZGV2aWNlIChvciB0aGUgb3RoZXIKK3dheSBhcm91bmQpLCB3ZSBzaW1wbHkgYXNrIGZvciB0aGUgYWdncmVnYXRlIHNpemUgb2YgdGhlIGRhdGEgTFYgcGx1cyB0aGUKK21ldGFkYXRhIExWLiAgT25jZSB3ZSBoYXZlIHRoZSBzcGFjZSBhbGxvY2F0ZWQsIHdlIGRpdmlkZSBpdCBiZXR3ZWVuIHRoZQorbWV0YWRhdGEgYW5kIGRhdGEgTFZzLiAgVGhpcyBhbHNvIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgcHJvY2VzcyBvZiBmaW5kaW5nCitwYXJhbGxlbCBzcGFjZSBmb3IgYWxsIHRoZSBkYXRhIExWcyB0aGF0IHdpbGwgY29tcG9zZSB0aGUgUkFJRCBhcnJheS4gIFdoZW4KK2EgUkFJRCBkZXZpY2UgaXMgcmVzaXplZCwgd2Ugd2lsbCBub3QgbmVlZCB0byB0YWtlIHRoZSBtZXRhZGF0YSBMViBpbnRvCithY2NvdW50LCBiZWNhdXNlIGl0IHdpbGwgYWxyZWFkeSBiZSBwcmVzZW50LgorCitBcGFydCBmcm9tIHRoZSBtZXRhZGF0YSBhcmVhcywgdGhlIG90aGVyIHVuaXF1ZSBjaGFyYWN0ZXJpc3RpYyBvZiBSQUlECitkZXZpY2VzIGlzIHRoZSBwYXJpdHkgZGV2aWNlIGNvdW50LiAgVGhlIG51bWJlciBvZiBwYXJpdHkgZGV2aWNlcyBkb2VzIG5vdGhpbmcKK3RvIHRoZSBjYWxjdWxhdGlvbiBvZiBzaXplLXBlci1kZXZpY2UuICBUaGUgJ2FyZWFfbXVsdGlwbGUnIG1lYW5zIG5vdGhpbmcKK2hlcmUuICBUaGUgcGFyaXR5IGRldmljZXMgd2lsbCBzaW1wbHkgYmUgdGhlIHNhbWUgc2l6ZSBhcyBhbGwgdGhlIG90aGVyIGRldmljZXMKK2FuZCB3aWxsIGFsc28gcmVxdWlyZSBhIG1ldGFkYXRhIExWIChpLmUuIGl0IGlzIHRyZWF0ZWQgbm8gZGlmZmVyZW50bHkgdGhhbgordGhlIG90aGVyIGRldmljZXMpLgorCitUaGVyZWZvcmUsIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBSQUlEIGRldmljZXMsIHdlIG5lZWQgdG8ga25vdyB0d28gdGhpbmdzOgorMSkgaG93IG1hbnkgcGFyaXR5IGRldmljZXMgYXJlIHJlcXVpcmVkIGFuZCAyKSBkb2VzIGFuIGFsbG9jYXRlZCBhcmVhIG5lZWQgdG8KK2JlIHNwbGl0IG91dCBmb3IgdGhlIG1ldGFkYXRhIExWcyBhZnRlciBmaW5kaW5nIHRoZSBzcGFjZSB0byBmaWxsIHRoZSByZXF1ZXN0LgorV2Ugc2ltcGx5IGFkZCB0aGVzZSB0d28gZmllbGRzIHRvIHRoZSAnYWxsb2NfaGFuZGxlJyBkYXRhIHN0cnVjdHVyZSBhcywKKydwYXJpdHlfY291bnQnIGFuZCAnYWxsb2NfYW5kX3NwbGl0X21ldGEnLiAgVGhlc2UgdHdvIGZpZWxkcyBnZXQgc2V0IGluCisnX2FsbG9jX2luaXQnLiAgIFRoZSAnc2VndHlwZS0+cGFyaXR5X2RldnMnIGhvbGRzIHRoZSBudW1iZXIgb2YgcGFyaXR5Citkcml2ZXMgYW5kIGNhbiBiZSBkaXJlY3RseSBjb3BpZWQgdG8gJ2FoLT5wYXJpdHlfY291bnQnIGFuZAorJ2FsbG9jX2FuZF9zcGxpdF9tZXRhJyBpcyBzZXQgd2hlbiBhIFJBSUQgc2VndHlwZSBpcyBkZXRlY3RlZCBhbmQKKydtZXRhZGF0YV9hcmVhX2NvdW50JyBoYXMgYmVlbiBzcGVjaWZpZWQuICBXaXRoIHRoZXNlIHR3byB2YXJpYWJsZXMgc2V0LCB3ZQorY2FuIGNhbGN1bGF0ZSBob3cgbWFueSBhbGxvY2F0ZWQgYXJlYXMgd2UgbmVlZC4gIEFsc28sIGluIHRoZSByb3V0aW5lcyB0aGF0CitmaW5kIHRoZSBhY3R1YWwgc3BhY2UsIHRoZXkgc3RvcCBub3Qgd2hlbiB0aGV5IGhhdmUgZm91bmQgYWgtPmFyZWFfY291bnQgYnV0Cit3aGVuIHRoZXkgaGF2ZSBmb3VuZCAoYWgtPmFyZWFfY291bnQgKyBhaC0+cGFyaXR5X2NvdW50KS4KKworQ29udmVyc2lvbgorPT09PT09PT09PQorUkFJRCAtPiBSQUlELCBhZGRpbmcgaW1hZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gYWRkaW5nIGltYWdlcyB0byBhIFJBSUQgYXJyYXksIG1ldGFkYXRhIGFuZCBkYXRhIGNvbXBvbmVudHMgbXVzdCBiZSBhZGRlZAorYXMgYSBwYWlyLiAgSXQgaXMgYmVzdCB0byBwZXJmb3JtIGFzIG1hbnkgb3BlcmF0aW9ucyBhcyBwb3NzaWJsZSBiZWZvcmUgd3JpdGluZworbmV3IExWTSBtZXRhZGF0YS4gIFRoaXMgYWxsb3dzIHVzIHRvIGVycm9yLW91dCB3aXRob3V0IGhhdmluZyB0byB1bndpbmQgYW55CitjaGFuZ2VzLiAgSXQgYWxzbyBtYWtlcyB0aGluZ3MgZWFzaWVyIGlmIHRoZSBtYWNoaW5lIHNob3VsZCBjcmFzaCBkdXJpbmcgYQorY29udmVyc2lvbiBvcGVyYXRpb24uICBUaHVzLCB0aGUgYWN0aW9ucyBwZXJmb3JtZWQgd2hlbiBhZGRpbmcgYSBuZXcgaW1hZ2UgYXJlOgorICAgICAgICAxKSBBbGxvY2F0ZSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIG1ldGFkYXRhL2RhdGEgcGFpcnMgdXNpbmcgdGhlIG1ldGhvZAorCSAgIGRlc2NyaWJlIGFib3ZlIGluICdBbGxvY2F0aW9uJyAoaS5lLiBmaW5kIHRoZSBtZXRhZGF0YS9kYXRhIHNwYWNlCisJICAgYXMgb25lIHVuaXQgYW5kIHNwbGl0IHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0gYWZ0ZXIgZm91bmQgLSB0aGlzIGtlZXBzCisJICAgdGhlbSB0b2dldGhlciBvbiB0aGUgc2FtZSBkZXZpY2UpLgorCTIpIEZvcm0gdGhlIG1ldGFkYXRhL2RhdGEgTFZzIGZyb20gdGhlIGFsbG9jYXRlZCBzcGFjZSAobGVhdmUgdGhlbQorCSAgIHZpc2libGUpIC0gc2V0dGluZyByZXF1aXJlZCBSQUlEX1tJTUFHRSB8IE1FVEFdIGZsYWdzIGFzIGFwcHJvcHJpYXRlLgorCTMpIFdyaXRlIHRoZSBMVk0gbWV0YWRhdGEKKwk0KSBBY3RpdmF0ZSBhbmQgY2xlYXIgdGhlIG1ldGFkYXRhIExWcy4gIFRoZSBjbGVhcmluZyBvZiB0aGUgbWV0YWRhdGEKKwkgICByZXF1aXJlcyB0aGUgTFZNIG1ldGFkYXRhIGJlIHdyaXR0ZW4gKHN0ZXAgMykgYW5kIGlzIGEgcmVxdWlyZW1lbnQKKwkgICBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgbWV0YWRhdGEgTFZzIHRvIHRoZSBhcnJheS4gIElmIHRoZSBtZXRhZGF0YQorCSAgIGlzIG5vdCBjbGVhcmVkLCBpdCBjYXJyeSByZXNpZHVhbCBzdXBlcmJsb2NrIHN0YXRlIGZyb20gYSBwcmV2aW91cworCSAgIGFycmF5IHRoZSBkZXZpY2UgbWF5IGhhdmUgYmVlbiBwYXJ0IG9mLgorCTUpIERlYWN0aXZhdGUgbmV3IHN1Yi1MVnMgYW5kIHNldCB0aGVtICJoaWRkZW4iLgorCTYpIGV4cGFuZCB0aGUgJ2ZpcnN0X3NlZyhyYWlkX2x2KS0+YXJlYXMnIGFuZCAnLT5tZXRhX2FyZWFzJyBhcnJheQorCSAgIGZvciBpbmNsdXNpb24gb2YgdGhlIG5ldyBzdWItTFZzCisJNykgQWRkIG5ldyBzdWItTFZzIGFuZCB1cGRhdGUgJ2ZpcnN0X3NlZyhyYWlkX2x2KS0+YXJlYV9jb3VudCcKKwk4KSBDb21taXQgbmV3IExWTSBtZXRhZGF0YQorRmFpbHVyZSBkdXJpbmcgYW55IG9mIHRoZXNlIHN0ZXBzIHdpbGwgbm90IGFmZmVjdCB0aGUgb3JpZ2luYWwgUkFJRCBhcnJheS4gIEluCit0aGUgd29yc3Qgc2NlbmFyaW8sIHRoZSB1c2VyIG1heSBoYXZlIHRvIHJlbW92ZSB0aGUgbmV3IHN1Yi1MVnMgdGhhdCBkaWQgbm90Cit5ZXQgbWFrZSBpdCBpbnRvIHRoZSBhcnJheS4KKworUkFJRCAtPiBSQUlELCByZW1vdmluZyBpbWFnZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUbyByZW1vdmUgaW1hZ2VzIGZyb20gYSBSQUlELCB0aGUgbWV0YWRhdGEvZGF0YSBMViBwYWlycyBtdXN0IGJlIHJlbW92ZWQKK3RvZ2V0aGVyLiAgVGhpcyBpcyBwcmV0dHkgc3RyYWlnaHQtZm9yd2FyZCwgYnV0IG9uZSBwbGFjZSB3aGVyZSBSQUlEIHJlYWxseQorZGlmZmVycyBmcm9tIHRoZSAibWlycm9yIiBzZWdtZW50IHR5cGUgaXMgaG93IHRoZSByZXN1bHRpbmcgImhvbGVzIiBhcmUgZmlsbGVkLgorV2hlbiBhIGRldmljZSBpcyByZW1vdmVkIGZyb20gYSAibWlycm9yIiBzZWdtZW50IHR5cGUsIGl0IGlzIGlkZW50aWZpZWQsIG1vdmVkCit0byB0aGUgZW5kIG9mIHRoZSAnbWlycm9yZWRfc2VnLT5hcmVhcycgYXJyYXksIGFuZCB0aGVuIHJlbW92ZWQuICBUaGlzIGFjdGlvbgorY2F1c2VzIHRoZSBvdGhlciBpbWFnZXMgdG8gc2hpZnQgZG93biBhbmQgZmlsbCB0aGUgcG9zaXRpb24gb2YgdGhlIGRldmljZSB3aGljaAord2FzIHJlbW92ZWQuICBXaGlsZSAicmFpZDEiIGNvdWxkIGJlIGhhbmRsZWQgaW4gdGhpcyB3YXksIHRoZSBvdGhlciBSQUlEIHR5cGVzCitjb3VsZCBub3QgYmUgLSBpdCB3b3VsZCBjb3JydXB0IHRoZSBvcmRlcmluZyBvZiB0aGUgZGF0YSBvbiB0aGUgYXJyYXkuICBUaHVzLAord2hlbiBhIGRldmljZSBpcyByZW1vdmVkIGZyb20gYSBSQUlEIGFycmF5LCB0aGUgY29ycmVzcG9uZGluZyBtZXRhZGF0YS9kYXRhCitzdWItTFZzIGFyZSByZW1vdmVkIGZyb20gdGhlICdyYWlkX3NlZy0+bWV0YV9hcmVhcycgYW5kICdyYWlkX3NlZy0+YXJlYXMnIGFycmF5cy4KK1RoZSBzbG90IGluIHRoZXNlICdsdl9zZWdtZW50X2FyZWEnIGFycmF5cyBhcmUgc2V0IHRvICdBUkVBX1VOQVNTSUdORUQnLiAgUkFJRAoraXMgcGVyZmVjdGx5IGhhcHB5IHRvIGNvbnN0cnVjdCBhIERNIHRhYmxlIG1hcHBpbmcgd2l0aCAnLSAtJyBpZiBpdCBjb21lcyBhY3Jvc3MKK2FyZWEgYXNzaWduZWQgaW4gc3VjaCBhIHdheS4gIFRoZSBwYWlyIG9mIGRhc2hlcyBpcyBhIHZhbGlkIHdheSB0byB0ZWxsIHRoZSBSQUlECitrZXJuZWwgdGFyZ2V0IHRoYXQgdGhlIHNsb3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZW1wdHkuICBTbywgd2UgY2FuIHJlbW92ZQorZGV2aWNlcyBmcm9tIGEgUkFJRCBhcnJheSB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29ycmVjdCBvcGVyYXRpb24gb2YgdGhlIFJBSUQuCisoSXQgYWxzbyBiZWNvbWVzIGVhc3kgdG8gcmVwbGFjZSB0aGUgZW1wdHkgc2xvdHMgcHJvcGVybHkgaWYgYSBzcGFyZSBkZXZpY2UgaXMKK2F2YWlsYWJsZS4pICBJbiB0aGUgY2FzZSBvZiBSQUlEMSBkZXZpY2UgcmVtb3ZhbCwgdGhlIGVtcHR5IHNsb3QgY2FuIGJlIHNhZmVseQorZWxpbWluYXRlZC4gIFRoaXMgaXMgZG9uZSBieSBzaGlmdGluZyB0aGUgaGlnaGVyIGluZGV4ZWQgZGV2aWNlcyBkb3duIHRvIGZpbGwKK3RoZSBzbG90LiAgRXZlbiB0aGUgbmFtZXMgb2YgdGhlIGltYWdlcyB3aWxsIGJlIHJlbmFtZWQgdG8gcHJvcGVybHkgcmVmbGVjdAordGhlaXIgaW5kZXggaW4gdGhlIGFycmF5LiAgVW5saWtlIHRoZSAibWlycm9yIiBzZWdtZW50IHR5cGUsIHlvdSB3aWxsIG5ldmVyIGhhdmUKK2FuIGltYWdlIG5hbWVkICIqX3JpbWFnZV8xIiBvY2N1cHlpbmcgdGhlIGluZGV4IHBvc2l0aW9uIDAuCisKK0FzIHdpdGggYWRkaW5nIGltYWdlcywgcmVtb3ZpbmcgaW1hZ2VzIGhvbGRzIG9mZiBvbiBjb21taXRpbmcgTFZNIG1ldGFkYXRhCit1bnRpbCBhbGwgcG9zc2libGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4gIFRoaXMgcmVkdWNlcyB0aGUgbGlrZWx5aG9vZCBvZiBiYWQKK2ludGVybWVkaWF0ZSBzdGFnZXMgYmVpbmcgbGVmdCBkdWUgdG8gYSBmYWlsdXJlIG9mIG9wZXJhdGlvbiBvciBtYWNoaW5lIGNyYXNoLgorCitSQUlEMSAnLS1zcGxpdG1pcnJvcnMnLCAnLS10cmFja2NoYW5nZXMnLCBhbmQgJy0tbWVyZ2UnIG9wZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBzdWl0ZSBvZiBvcGVyYXRpb25zIGlzIG9ubHkgYXZhaWxhYmxlIHRvIHRoZSAicmFpZDEiIHNlZ21lbnQgdHlwZS4KKworU3BsaXR0aW5nIGFuIGltYWdlIGZyb20gYSBSQUlEMSBhcnJheSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSByZW1vdmFsIG9mCithbiBpbWFnZSBkZXNjcmliZWQgYWJvdmUuICBIb3dldmVyLCB0aGUgbWV0YWRhdGEgTFYgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGxpdAoraW1hZ2UgaXMgcmVtb3ZlZCBhbmQgdGhlIGRhdGEgTFYgaXMga2VwdCBhbmQgcHJvbW90ZWQgdG8gYSB0b3AtbGV2ZWwgZGV2aWNlLgorKGkuZS4gIEl0IGlzIG1hZGUgdmlzaWJsZSBhbmQgc3RyaXBwZWQgb2YgaXRzIFJBSURfSU1BR0Ugc3RhdHVzIGZsYWdzLikKKworV2hlbiB0aGUgJy0tdHJhY2tjaGFuZ2VzJyBvcHRpb24gaXMgZ2l2ZW4gYWxvbmcgd2l0aCB0aGUgJy0tc3BsaXRtaXJyb3JzJworYXJndW1lbnQsIHRoZSBtZXRhZGF0YSBMViBpcyBsZWZ0IGFzIHBhcnQgb2YgdGhlIG9yaWdpbmFsIGFycmF5LiAgVGhlIGRhdGEgTFYKK2lzIHNldCBhcyAnVklTSUJMRScgYW5kIHJlYWQtb25seSAofkxWTV9XUklURSkuICBXaGVuIHRoZSBhcnJheSBETSB0YWJsZSBpcworYmVpbmcgY3JlYXRlZCwgaXQgbm90aWNlcyB0aGUgcmVhZC1vbmx5LCBWSVNJQkxFIG5hdHVyZSBvZiB0aGUgc3ViLUxWIGFuZCBwdXRzCitpbiB0aGUgJy0gLScgc2VudGluZWwuICBPbmx5IGEgc2luZ2xlIGltYWdlIGNhbiBiZSBzcGxpdCBmcm9tIHRoZSBtaXJyb3IgYW5kCit0aGUgbmFtZSBvZiB0aGUgc3ViLUxWIGNhbm5vdCBiZSBjaGFuZ2VkLiAgVW5saWtlICctLXNwbGl0bWlycm9ycycgb24gaXRzIG93biwKK3RoZSAnLS1uYW1lJyBhcmd1bWVudCBtdXN0IG5vdCBiZSBzcGVjaWZpZWQuICBUaGVyZWZvcmUsIHRoZSBuYW1lIG9mIHRoZSBuZXdseQorc3BsaXQgTFYgd2lsbCByZW1haW4gdGhlIHNhbWUgJzxsdj5fcmltYWdlXzxOPicsIHdoZXJlICdOJyBpcyB0aGUgaW5kZXggb2YgdGhlCitzbG90IGluIHRoZSBhcnJheSBmb3Igd2hpY2ggaXQgaXMgYXNzb2NpYXRlZC4KKworV2hlbiBhbiBMViB3aGljaCB3YXMgc3BsaXQgZnJvbSBhIFJBSUQxIGFycmF5IHdpdGggdGhlICctLXRyYWNrY2hhbmdlcycgb3B0aW9uCitpcyBtZXJnZWQgYmFjayBpbnRvIHRoZSBhcnJheSwgaXRzIHJlYWQvd3JpdGUgc3RhdHVzIGlzIHJlc3RvcmVkIGFuZCBpdCBpcworc2V0IGFzICJoaWRkZW4iIGFnYWluLiAgUmVjeWNsaW5nIHRoZSBhcnJheSAoc3VzcGVuZC9yZXN1bWUpIHJlc3RvcmVzIHRoZSBzdWItTFYKK3RvIGl0cyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkgYW5kIGJlZ2lucyB0aGUgcHJvY2VzcyBvZiBzeW5jJ2luZyB0aGUgY2hhbmdlcyB0aGF0Cit3ZXJlIG1hZGUgc2luY2UgdGhlIHRpbWUgaXQgd2FzIHNwbGl0IGZyb20gdGhlIGFycmF5LgorCitSQUlEIGRldmljZSByZXBsYWNlbWVudCB3aXRoICctLXJlcGxhY2UnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIG9wdGlvbiBpcyBhdmFpbGFibGUgdG8gYWxsIFJBSUQgc2VnbWVudCB0eXBlcy4KKworVGhlICctLXJlcGxhY2UnIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZW1vdmUgYSBwYXJ0aWN1bGFyIGRldmljZSBmcm9tIGEgUkFJRAorbG9naWNhbCB2b2x1bWUgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIGRpZmZlcmVudCBvbmUgaW4gb25lIGFjdGlvbiAoQ0xJIGNvbW1hbmQpLgorVGhlIGRldmljZSBkZXZpY2UgdG8gYmUgcmVtb3ZlZCBpcyBzcGVjaWZpZWQgYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSAnLS1yZXBsYWNlJworb3B0aW9uLiAgVGhpcyBvcHRpb24gY2FuIGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBpbiBhIHNpbmdsZSBjb21tYW5kLAorYWxsb3dpbmcgbXVsdGlwbGUgZGV2aWNlcyB0byBiZSByZXBsYWNlZCBhdCB0aGUgc2FtZSB0aW1lIC0gcHJvdmlkZWQgdGhlIFJBSUQKK2xvZ2ljYWwgdm9sdW1lIGhhcyB0aGUgbmVjZXNzYXJ5IHJlZHVuZGFuY3kgdG8gYWxsb3cgdGhlIGFjdGlvbi4gIFRoZSBkZXZpY2VzCit0byBiZSB1c2VkIGFzIHJlcGxhY2VtZW50cyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvbW1hbmQ7IHNpbWlsYXIgdG8gdGhlCit3YXkgYWxsb2NhdGFibGUgZGV2aWNlcyBhcmUgc3BlY2lmaWVkIGR1cmluZyBhbiB1cC1jb252ZXJ0LgorCitFeGFtcGxlPiBsdmNvbnZlcnQgLS1yZXBsYWNlIC9kZXYvc2RkMSAtLXJlcGxhY2UgL2Rldi9zZGUxIHZnL2x2IC9kZXYvc2RbYmNdMQorCitSQUlEICctLXJlcGFpcicKKy0tLS0tLS0tLS0tLS0tLQorVGhpcyAnbHZjb252ZXJ0JyBvcHRpb24gaXMgYXZhaWxhYmxlIHRvIGFsbCBSQUlEIHNlZ21lbnQgdHlwZXMgYW5kIGlzIGRlc2NyaWJlZAordW5kZXIgIlJBSUQgRmF1bHQgSGFuZGxpbmciLgorCisKK1JBSUQgRmF1bHQgSGFuZGxpbmcKKz09PT09PT09PT09PT09PT09PT0KK1JBSUQgaXMgbm90IGxpa2UgdHJhZGl0aW9uYWwgTFZNIG1pcnJvcmluZyAoaS5lLiB0aGUgIm1pcnJvciIgc2VnbWVudCB0eXBlKS4KK0xWTSBtaXJyb3JpbmcgcmVxdWlyZWQgZmFpbGVkIGRldmljZXMgdG8gYmUgcmVtb3ZlZCBvciB0aGUgbG9naWNhbCB2b2x1bWUgd291bGQKK3NpbXBseSBoYW5nLiAgUkFJRCBhcnJheXMgY2FuIGtlZXAgb24gcnVubmluZyB3aXRoIGZhaWxlZCBkZXZpY2VzLiAgSW4gZmFjdCwgZm9yCitSQUlEIHR5cGVzIG90aGVyIHRoYW4gUkFJRDEgcmVtb3ZpbmcgYSBkZXZpY2Ugd291bGQgbWVhbiBzdWJzdGl0dXRpbmcgYW4gZXJyb3IKK3RhcmdldCBvciBjb252ZXJ0aW5nIHRvIGEgbG93ZXIgbGV2ZWwgUkFJRCAoZS5nLiBSQUlENiAtPiBSQUlENSwgb3IgUkFJRDQvNSB0bworUkFJRDApLiAgVGhlcmVmb3JlLCByYXRoZXIgdGhhbiByZW1vdmluZyBhIGZhaWxlZCBkZXZpY2UgdW5jb25kaXRpb25hbGx5LCB0aGUKK3VzZXIgaGFzIGEgY291cGxlIG9mIG9wdGlvbnMgdG8gY2hvb3NlIGZyb20uCisKK1RoZSBhdXRvbWF0ZWQgcmVzcG9uc2UgdG8gYSBkZXZpY2UgZmFpbHVyZSBpcyBoYW5kbGVkIGFjY29yZGluZyB0byB0aGUgdXNlcidzCitwcmVmZXJlbmNlIGRlZmluZWQgaW4gbHZtLmNvbmY6YWN0aXZhdGlvbi5yYWlkX2ZhdWx0X3BvbGljeS4gIFRoZSBvcHRpb25zIGFyZToKKyAgICAjICJ3YXJuIiAgICAtIFVzZSB0aGUgc3lzdGVtIGxvZyB0byB3YXJuIHRoZSB1c2VyIHRoYXQgYSBkZXZpY2UgaW4gdGhlIFJBSUQKKyAgICAjICAgICAgICAgICAgIGxvZ2ljYWwgdm9sdW1lIGhhcyBmYWlsZWQuICBJdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIHJ1bgorICAgICMgICAgICAgICAgICAgJ2x2Y29udmVydCAtLXJlcGFpcicgbWFudWFsbHkgdG8gcmVtb3ZlIG9yIHJlcGxhY2UgdGhlIGZhaWxlZAorICAgICMgICAgICAgICAgICAgZGV2aWNlLiAgQXMgbG9uZyBhcyB0aGUgbnVtYmVyIG9mIGZhaWxlZCBkZXZpY2VzIGRvZXMgbm90CisgICAgIyAgICAgICAgICAgICBleGNlZWQgdGhlIHJlZHVuZGFuY3kgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lICgxIGRldmljZSBmb3IKKyAgICAjICAgICAgICAgICAgIHJhaWQ0LzUsIDIgZm9yIHJhaWQ2LCBldGMpIHRoZSBsb2dpY2FsIHZvbHVtZSB3aWxsIHJlbWFpbgorICAgICMgICAgICAgICAgICAgdXNhYmxlLgorICAgICMKKyAgICAjICJyZW1vdmUiICAtIE5PVCBDVVJSRU5UTFkgSU1QTEVNRU5URUQgT1IgRE9DVU1FTlRFRCBJTiBleGFtcGxlLmNvbmYuaW4uCisgICAgIyAgICAgICAgICAgICBSZW1vdmUgdGhlIGZhaWxlZCBkZXZpY2UgYW5kIHJlZHVjZSB0aGUgUkFJRCBsb2dpY2FsIHZvbHVtZQorICAgICMgICAgICAgICAgICAgYWNjb3JkaW5nbHkuICBJZiBhIHNpbmdsZSBkZXZpY2UgZGllcyBpbiBhIDMtd2F5IG1pcnJvciwKKyAgICAjICAgICAgICAgICAgIHJlbW92ZSBpdCBhbmQgcmVkdWNlIHRoZSBtaXJyb3IgdG8gMi13YXkuICBJZiBhIHNpbmdsZSBkZXZpY2UKKyAgICAjICAgICAgICAgICAgIGRpZXMgaW4gYSBSQUlEIDQvNSBsb2dpY2FsIHZvbHVtZSwgcmVzaGFwZSBpdCB0byBhIHN0cmlwZWQKKyAgICAjICAgICAgICAgICAgIHZvbHVtZSwgZXRjIC0gUkFJRCA2IC0+IFJBSUQgNC81IC0+IFJBSUQgMC4gIElmIGRldmljZXMKKyAgICAjICAgICAgICAgICAgIGNhbm5vdCBiZSByZW1vdmVkIGZvciBsYWNrIG9mIHJlZHVuZGFuY3ksIGZhaWwuCisgICAgIyAgICAgICAgICAgICBUSElTIE9QVElPTiBDQU5OT1QgWUVUIEJFIElNUExFTUVOVEVEIEJFQ0FVU0UgUkVTSEFQRSBJUyBOT1QKKyAgICAjICAgICAgICAgICAgIFlFVCBTVVBQT1JURUQgSU4gbGludXgvZHJpdmVycy9tZC9kbS1yYWlkLmMuICBUaGUgc3VwZXJibG9jaworICAgICMgICAgICAgICAgICAgZG9lcyBub3QgeWV0IGhvbGQgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHN1cHBvcnQgcmVzaGFwaW5nLgorICAgICMKKyAgICAjICJhbGxvY2F0ZSIgLSBBdHRlbXB0IHRvIHVzZSBhbnkgZXh0cmEgcGh5c2ljYWwgdm9sdW1lcyBpbiB0aGUgdm9sdW1lCisgICAgIyAgICAgICAgICAgICBncm91cCBhcyBzcGFyZXMgYW5kIHJlcGxhY2UgZmF1bHR5IGRldmljZXMuCisKK0lmIG1hbnVhbCBpbnRlcnZlbnRpb24gaXMgdGFrZW4sIGVpdGhlciBpbiByZXNwb25zZSB0byB0aGUgYXV0b21hdGVkIHNvbHV0aW9uJ3MKKyJ3YXJuIiBtb2RlIG9yIHNpbXBseSBiZWNhdXNlIGRtZXZlbnRkIGhhZG4ndCBydW4sIHRoZW4gdGhlIHVzZXIgY2FuIGNhbGwKKydsdmNvbnZlcnQgLS1yZXBhaXIgdmcvbHYnIGFuZCBmb2xsb3cgdGhlIHByb21wdHMuICBUaGV5IHdpbGwgYmUgcHJvbXB0ZWQKK3doZXRoZXIgb3Igbm90IHRvIHJlcGxhY2UgdGhlIGRldmljZSBhbmQgY2F1c2UgYSBmdWxsIHJlY292ZXJ5IG9mIHRoZSBmYWlsZWQKK2RldmljZS4KKworSWYgcmVwbGFjZW1lbnQgaXMgY2hvc2VuIHZpYSB0aGUgbWFudWFsIG1ldGhvZCBvciAiYWxsb2NhdGUiIGlzIHRoZSBwb2xpY3kgdGFrZW4KK2J5IHRoZSBhdXRvbWF0ZWQgcmVzcG9uc2UsIHRoZW4gJ2x2Y29udmVydCAtLXJlcGxhY2UnIGlzIHRoZSBtZWNoYW5pc20gdXNlZCB0bworYXR0ZW1wdCB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIGZhaWxlZCBkZXZpY2UuCisKKyd2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcnIGlzIGluZWZmZWN0dWFsIGF0IHJlcGFpcmluZyBSQUlEIGxvZ2ljYWwgdm9sdW1lcy4gIEl0Cit3aWxsIHJlbW92ZSB0aGUgZmFpbGVkIGRldmljZSwgYnV0IHRoZSBSQUlEIGxvZ2ljYWwgdm9sdW1lIHdpbGwgc2ltcGx5IGNvbnRpbnVlCit0byBvcGVyYXRlIHdpdGggYW4gPHVua25vd24+IHN1Yi1MVi4gIFRoZSB1c2VyIHNob3VsZCBjbGVhciB0aGUgZmFpbGVkIGRldmljZQord2l0aCAnbHZjb252ZXJ0IC0tcmVwYWlyJy4KZGlmZiAtLWdpdCBhL2RvYy9sdm1fZmF1bHRfaGFuZGxpbmcudHh0IGIvZG9jL2x2bV9mYXVsdF9oYW5kbGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiNDQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sdm1fZmF1bHRfaGFuZGxpbmcudHh0CkBAIC0wLDAgKzEsMjAyIEBACitMVk0gZGV2aWNlIGZhdWx0IGhhbmRsaW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCitUaGlzIGRvY3VtZW50IGlzIHRvIHNlcnZlIGFzIHRoZSBkZWZpbml0aXZlIHNvdXJjZSBmb3IgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyB0aGUgcG9saWNpZXMgYW5kIHByb2NlZHVyZXMgc3Vycm91bmRpbmcgZGV2aWNlIGZhaWx1cmVzCitpbiBMVk0uICBJdCBjb2RpZmllcyBMVk0ncyByZXNwb25zZXMgdG8gZGV2aWNlIGZhaWx1cmVzIGFzIHdlbGwgYXMKK3RoZSByZXNwb25zaWJpbGl0aWVzIG9mIGFkbWluaXN0cmF0b3JzLgorCitEZXZpY2UgZmFpbHVyZXMgY2FuIGJlIHBlcm1hbmVudCBvciB0cmFuc2llbnQuICBBIHBlcm1hbmVudCBmYWlsdXJlCitpcyBvbmUgd2hlcmUgYSBkZXZpY2UgYmVjb21lcyBpbmFjY2Vzc2libGUgYW5kIHdpbGwgbmV2ZXIgYmUKK3Jldml2ZWQuICBBIHRyYW5zaWVudCBmYWlsdXJlIGlzIGEgZmFpbHVyZSB0aGF0IGNhbiBiZSByZWNvdmVyZWQKK2Zyb20gKGUuZy4gYSBwb3dlciBmYWlsdXJlLCBpbnRlcm1pdHRlbnQgbmV0d29yayBvdXRhZ2UsIGJsb2NrCityZWxvY2F0aW9uLCBldGMpLiAgVGhlIHBvbGljaWVzIGZvciBoYW5kbGluZyBib3RoIHR5cGVzIG9mIGZhaWx1cmVzCitpcyBkZXNjcmliZWQgaGVyZWluLgorCitVc2VycyBuZWVkIHRvIGJlIGF3YXJlIHRoYXQgdGhlcmUgYXJlIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgUkFJRDEgaW4gTFZNLgorVGhlIGZpcnN0IGlzIGRlZmluZWQgYnkgdGhlICJtaXJyb3IiIHNlZ21lbnQgdHlwZS4gIFRoZSBzZWNvbmQgaXMgZGVmaW5lZCBieQordGhlICJyYWlkMSIgc2VnbWVudCB0eXBlLiAgVGhlIGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIG9mIHRoZXNlIGFyZSBkZWZpbmVkCitpbiBsdm0uY29uZiB1bmRlciAnbWlycm9yX3NlZ3R5cGVfZGVmYXVsdCcgLSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5nIHVzZWQgdG8KK2lkZW50aWZ5IHRoZSBkZWZhdWx0IFJBSUQxIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIExWTSBvcGVyYXRpb25zLgorCitBdmFpbGFibGUgT3BlcmF0aW9ucyBEdXJpbmcgYSBEZXZpY2UgRmFpbHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gdGhlcmUgaXMgYSBkZXZpY2UgZmFpbHVyZSwgTFZNIGJlaGF2ZXMgc29tZXdoYXQgZGlmZmVyZW50bHkgYmVjYXVzZQorb25seSBhIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIGRldmljZXMgd2lsbCBiZSBmb3VuZCBmb3IgdGhlIHBhcnRpY3VsYXIKK3ZvbHVtZSBncm91cC4gIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBhdmFpbGFibGUgdG8gdGhlIGFkbWluaXN0cmF0b3IKK2lzIGRpbWluaXNoZWQuICBJdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG5ldyBsb2dpY2FsIHZvbHVtZXMgd2hpbGUKK1BWcyBjYW5ub3QgYmUgYWNjZXNzZWQsIGZvciBleGFtcGxlLiAgT3BlcmF0aW9ucyB0aGF0IGNyZWF0ZSwgY29udmVydCwgb3IKK3Jlc2l6ZSBsb2dpY2FsIHZvbHVtZXMgYXJlIGRpc2FsbG93ZWQsIHN1Y2ggYXM6CistIGx2Y3JlYXRlCistIGx2cmVzaXplCistIGx2cmVkdWNlCistIGx2ZXh0ZW5kCistIGx2Y29udmVydCAodW5sZXNzICctLXJlcGFpcicgaXMgdXNlZCkKK09wZXJhdGlvbnMgdGhhdCBhY3RpdmF0ZSwgZGVhY3RpdmF0ZSwgcmVtb3ZlLCByZXBvcnQsIG9yIHJlcGFpciBsb2dpY2FsCit2b2x1bWVzIGFyZSBhbGxvd2VkLCBzdWNoIGFzOgorLSBsdnJlbW92ZQorLSB2Z3JlbW92ZSAod2lsbCByZW1vdmUgYWxsIExWcywgYnV0IG5vdCB0aGUgVkcgdW50aWwgY29uc2lzdGVudCkKKy0gcHZzCistIHZncworLSBsdnMKKy0gbHZjaGFuZ2UgLWEgW3luXQorLSB2Z2NoYW5nZSAtYSBbeW5dCitPcGVyYXRpb25zIHNwZWNpZmljIHRvIHRoZSBoYW5kbGluZyBvZiBmYWlsZWQgZGV2aWNlcyBhcmUgYWxsb3dlZCBhbmQKK2FyZSBhcyBmb2xsb3dzOgorCistICd2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgPFZHPic6ICBUaGlzIGFjdGlvbiBpcyBkZXNpZ25lZCB0byByZW1vdmUKKyAgdGhlIHJlZmVyZW5jZSBvZiBhIGZhaWxlZCBkZXZpY2UgZnJvbSB0aGUgTFZNIG1ldGFkYXRhIHN0b3JlZCBvbiB0aGUKKyAgcmVtYWluaW5nIGRldmljZXMuICBJZiB0aGVyZSBhcmUgKHBvcnRpb25zIG9mKSBsb2dpY2FsIHZvbHVtZXMgb24gdGhlCisgIGZhaWxlZCBkZXZpY2VzLCB0aGUgYWJpbGl0eSBvZiB0aGUgb3BlcmF0aW9uIHRvIHByb2NlZWQgd2lsbCBkZXBlbmQKKyAgb24gdGhlIHR5cGUgb2YgbG9naWNhbCB2b2x1bWVzIGZvdW5kLiAgSWYgYW4gaW1hZ2UgKGkuZSBsZWcgb3Igc2lkZSkKKyAgb2YgYSBtaXJyb3IgaXMgbG9jYXRlZCBvbiB0aGUgZGV2aWNlLCB0aGF0IGltYWdlL2xlZyBvZiB0aGUgbWlycm9yCisgIGlzIGVsaW1pbmF0ZWQgYWxvbmcgd2l0aCB0aGUgZmFpbGVkIGRldmljZS4gIFRoZSByZXN1bHQgb2Ygc3VjaCBhCisgIG1pcnJvciByZWR1Y3Rpb24gY291bGQgYmUgYSBuby1sb25nZXItcmVkdW5kYW50IGxpbmVhciBkZXZpY2UuICBJZgorICBhIGxpbmVhciwgc3RyaXBlLCBvciBzbmFwc2hvdCBkZXZpY2UgaXMgbG9jYXRlZCBvbiB0aGUgZmFpbGVkIGRldmljZQorICB0aGUgY29tbWFuZCB3aWxsIG5vdCBwcm9jZWVkIHdpdGhvdXQgYSAnLS1mb3JjZScgb3B0aW9uLiAgVGhlIHJlc3VsdAorICBvZiB1c2luZyB0aGUgJy0tZm9yY2UnIG9wdGlvbiBpcyB0aGUgZW50aXJlIHJlbW92YWwgYW5kIGNvbXBsZXRlCisgIGxvc3Mgb2YgdGhlIG5vbi1yZWR1bmRhbnQgbG9naWNhbCB2b2x1bWUuICBJZiBhbiBpbWFnZSBvciBtZXRhZGF0YSBhcmVhCisgIG9mIGEgUkFJRCBsb2dpY2FsIHZvbHVtZSBpcyBvbiB0aGUgZmFpbGVkIGRldmljZSwgdGhlIHN1Yi1MViBhZmZlY3RlZCBpcworICByZXBsYWNlIHdpdGggYW4gZXJyb3IgdGFyZ2V0IGRldmljZSAtIGFwcGVhcmluZyBhcyA8dW5rbm93bj4gaW4gJ2x2cycKKyAgb3V0cHV0LiAgUkFJRCBsb2dpY2FsIHZvbHVtZXMgY2Fubm90IGJlIGNvbXBsZXRlbHkgcmVwYWlyZWQgYnkgdmdyZWR1Y2UgLQorICAnbHZjb252ZXJ0IC0tcmVwYWlyJyAobGlzdGVkIGJlbG93KSBtdXN0IGJlIHVzZWQuICBPbmNlIHRoaXMgb3BlcmF0aW9uIGlzCisgIGNvbXBsZXRlIG9uIHZvbHVtZSBncm91cHMgbm90IGNvbnRhaW5pbmcgUkFJRCBsb2dpY2FsIHZvbHVtZXMsIHRoZSB2b2x1bWUKKyAgZ3JvdXAgd2lsbCBhZ2FpbiBoYXZlIGEgY29tcGxldGUgYW5kIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZGV2aWNlcyBpdAorICBjb250YWlucy4gIFRodXMsIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgcGVybWl0dGVkIC0gaW5jbHVkaW5nIGNyZWF0aW9uLAorICBjb252ZXJzaW9uLCBhbmQgcmVzaXppbmcgb3BlcmF0aW9ucy4gIEl0IGlzIGN1cnJlbnRseSB0aGUgcHJlZmVycmVkIG1ldGhvZAorICB0byBjYWxsICdsdmNvbnZlcnQgLS1yZXBhaXInIG9uIHRoZSBpbmRpdmlkdWFsIGxvZ2ljYWwgdm9sdW1lcyB0byByZXBhaXIKKyAgdGhlbSBmb2xsb3dlZCBieSAndmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nJyB0byBleHRyYWN0IHRoZSBwaHlzaWNhbCB2b2x1bWUncworICByZXByZXNlbnRhdGlvbiBpbiB0aGUgdm9sdW1lIGdyb3VwLgorCistICdsdmNvbnZlcnQgLS1yZXBhaXIgPFZHL0xWPic6ICBUaGlzIGFjdGlvbiBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkKKyAgdG8gb3BlcmF0ZSBvbiBpbmRpdmlkdWFsIGxvZ2ljYWwgdm9sdW1lcy4gIElmLCBmb3IgZXhhbXBsZSwgYSBmYWlsZWQKKyAgZGV2aWNlIGhhcHBlbmVkIHRvIGNvbnRhaW4gdGhlIGltYWdlcyBvZiBmb3VyIGRpc3RpbmN0IG1pcnJvcnMsIGl0IHdvdWxkCisgIGJlIG5lY2Vzc2FyeSB0byBydW4gJ2x2Y29udmVydCAtLXJlcGFpcicgb24gZWFjaCBvZiB0aGVtLiAgVGhlIHVsdGltYXRlCisgIHJlc3VsdCBpcyB0byBsZWF2ZSB0aGUgZmF1bHR5IGRldmljZSBpbiB0aGUgdm9sdW1lIGdyb3VwLCBidXQgaGF2ZSBubyBsb2dpY2FsCisgIHZvbHVtZXMgcmVmZXJlbmNpbmcgaXQuICAoVGhpcyBhbGxvd3MgZm9yICd2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcnIHRvCisgIHJlbW92ZWQgdGhlIHBoeXNpY2FsIHZvbHVtZXMgY2xlYW5seS4pICBJbiBhZGRpdGlvbiB0byByZW1vdmluZyBtaXJyb3Igb3IKKyAgUkFJRCBpbWFnZXMgdGhhdCByZXNpZGUgb24gZmFpbGVkIGRldmljZXMsICdsdmNvbnZlcnQgLS1yZXBhaXInIGNhbiBhbHNvCisgIHJlcGxhY2UgdGhlIGZhaWxlZCBkZXZpY2UgaWYgdGhlcmUgYXJlIHNwYXJlIGRldmljZXMgYXZhaWxhYmxlIGluIHRoZQorICB2b2x1bWUgZ3JvdXAuICBUaGUgdXNlciBpcyBwcm9tcHRlZCB3aGV0aGVyIHRvIHNpbXBseSByZW1vdmUgdGhlIGZhaWxlZAorICBwb3J0aW9ucyBvZiB0aGUgbWlycm9yIG9yIHRvIGFsc28gYWxsb2NhdGUgYSByZXBsYWNlbWVudCwgaWYgcnVuIGZyb20gdGhlCisgIGNvbW1hbmQtbGluZS4gIE9wdGlvbmFsbHksIHRoZSAnLS11c2UtcG9saWNpZXMnIGZsYWcgY2FuIGJlIHNwZWNpZmllZCB3aGljaAorICB3aWxsIGNhdXNlIHRoZSBvcGVyYXRpb24gbm90IHRvIHByb21wdCB0aGUgdXNlciwgYnV0IGluc3RlYWQgcmVzcGVjdAorICB0aGUgcG9saWNpZXMgb3V0bGluZWQgaW4gdGhlIExWTSBjb25maWd1cmF0aW9uIGZpbGUgLSB1c3VhbGx5LAorICAvZXRjL2x2bS9sdm0uY29uZi4gIE9uY2UgdGhpcyBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRoZSBsb2dpY2FsIHZvbHVtZXMKKyAgd2lsbCBiZSBjb25zaXN0ZW50LiAgSG93ZXZlciwgdGhlIHZvbHVtZSBncm91cCB3aWxsIHN0aWxsIGJlIGluY29uc2lzdGVudCAtCisgIGR1ZSB0byB0aGUgcmVmZXJuY2VkLWJ1dC1taXNzaW5nIGRldmljZS9QViAtIGFuZCBvcGVyYXRpb25zIHdpbGwgc3RpbGwgYmUKKyAgcmVzdHJpY3RlZCB0byB0aGUgYWZvcm1lbnRpb25lZCBhY3Rpb25zIHVudGlsIGVpdGhlciB0aGUgZGV2aWNlIGlzCisgIHJlc3RvcmVkIG9yICd2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcnIGlzIHJ1bi4KKworRGV2aWNlIFJldml2YWwgKHRyYW5zaWVudCBmYWlsdXJlcyk6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0R1cmluZyBhIGRldmljZSBmYWlsdXJlLCB0aGUgYWJvdmUgc2VjdGlvbiBkZXNjcmliZXMgd2hhdCBsaW1pdGF0aW9ucworYSB1c2VyIGNhbiBleHBlY3QuICBIb3dldmVyLCBpZiB0aGUgZGV2aWNlIHJldHVybnMgYWZ0ZXIgYSBwZXJpb2Qgb2YKK3RpbWUsIHdoYXQgdG8gZXhwZWN0IHdpbGwgZGVwZW5kIG9uIHdoYXQgaGFzIGhhcHBlbmVkIGR1cmluZyB0aGUgdGltZQorcGVyaW9kIHdoZW4gdGhlIGRldmljZSB3YXMgZmFpbGVkLiAgSWYgbm8gYXV0b21hdGVkIGFjdGlvbnMgKGRlc2NyaWJlZAorYmVsb3cpIG9yIHVzZXIgYWN0aW9ucyB3ZXJlIG5lY2Vzc2FyeSBvciBwZXJmb3JtZWQsIHRoZW4gbm8gY2hhbmdlIGluCitvcGVyYXRpb25zIG9yIGxvZ2ljYWwgdm9sdW1lIGxheW91dCB3aWxsIG9jY3VyLiAgSG93ZXZlciwgaWYgYW4KK2F1dG9tYXRlZCBhY3Rpb24gb3Igb25lIG9mIHRoZSBhZm9yZW1lbnRpb25lZCByZXBhaXIgY29tbWFuZHMgd2FzCittYW51YWxseSBydW4sIHRoZSByZXR1cm5pbmcgZGV2aWNlIHdpbGwgYmUgcGVyY2VpdmVkIGFzIGhhdmluZyBzdGFsZQorTFZNIG1ldGFkYXRhLiAgSW4gdGhpcyBjYXNlLCB0aGUgdXNlciBjYW4gZXhwZWN0IHRvIHNlZSBhIHdhcm5pbmcKK2NvbmNlcm5pbmcgaW5jb25zaXN0ZW50IG1ldGFkYXRhLiAgVGhlIG1ldGFkYXRhIG9uIHRoZSByZXR1cm5pbmcKK2RldmljZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbGF0ZXN0IGNvcHkgb2YgdGhlCitMVk0gbWV0YWRhdGEgLSByZXN0b3JpbmcgY29uc2lzdGVuY3kuICBOb3RlLCB3aGlsZSBtb3N0IExWTSBjb21tYW5kcword2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgbWV0YWRhdGEgb24gYSByZXN0b3JlZCBkZXZpY2VzLCB0aGUKK2ZvbGxvd2luZyBwb3NzaWJsZSBleGNlcHRpb25zIGV4aXN0OgorLSBwdnMgKHdoZW4gaXQgZG9lcyBub3QgcmVhZC91cGRhdGUgVkcgbWV0YWRhdGEpCisKK0F1dG9tYXRlZCBUYXJnZXQgUmVzcG9uc2UgdG8gRmFpbHVyZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIG9ubHkgTFZNIHRhcmdldCB0eXBlcyAoaS5lLiAicGVyc29uYWxpdGllcyIpIHRoYXQgaGF2ZSBhbiBhdXRvbWF0ZWQKK3Jlc3BvbnNlIHRvIGZhaWx1cmVzIGFyZSB0aGUgbWlycm9yIGFuZCBSQUlEIGxvZ2ljYWwgdm9sdW1lcy4gIFRoZSBvdGhlciB0YXJnZXQKK3R5cGVzIChsaW5lYXIsIHN0cmlwZSwgc25hcHNob3QsIGV0Yykgd2lsbCBzaW1wbHkgcHJvcGFnYXRlIHRoZSBmYWlsdXJlLgorW0Egc25hcHNob3QgYmVjb21lcyBpbnZhbGlkIGlmIGl0cyB1bmRlcmx5aW5nIGRldmljZSBmYWlscywgYnV0IHRoZQorb3JpZ2luIHdpbGwgcmVtYWluIHZhbGlkIC0gcHJlc3VtaW5nIHRoZSBvcmlnaW4gZGV2aWNlIGhhcyBub3QgZmFpbGVkLl0KKworU3RhcnRpbmcgd2l0aCB0aGUgIm1pcnJvciIgc2VnbWVudCB0eXBlLCB0aGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgZXJyb3JzIHRoYXQKK2EgbWlycm9yIGNhbiBzdWZmZXIgLSByZWFkLCB3cml0ZSwgYW5kIHJlc3luY2hyb25pemF0aW9uIGVycm9ycy4gIEVhY2ggaXMKK2Rlc2NyaWJlZCBpbiBkZXB0aCBiZWxvdy4KKworTWlycm9yIHJlYWQgZmFpbHVyZXM6CitJZiBhIG1pcnJvciBpcyAnaW4tc3luYycgKGkuZS4gYWxsIGltYWdlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYW5kCithcmUgaWRlbnRpY2FsKSwgYSByZWFkIGZhaWx1cmUgd2lsbCBvbmx5IHByb2R1Y2UgYSB3YXJuaW5nLiAgRGF0YSBpcworc2ltcGx5IHB1bGxlZCBmcm9tIG9uZSBvZiB0aGUgb3RoZXIgaW1hZ2VzIGFuZCB0aGUgZmF1bHQgaXMgcmVjb3JkZWQuCitTb21ldGltZXMgLSBsaWtlIGluIHRoZSBjYXNlIG9mIGJhZCBibG9jayByZWxvY2F0aW9uIC0gcmVhZCBlcnJvcnMgY2FuCitiZSByZWNvdmVyZWQgZnJvbSBieSB0aGUgc3RvcmFnZSBoYXJkd2FyZS4gIFRoZXJlZm9yZSwgaXQgaXMgdXAgdG8gdGhlCit1c2VyIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHJlY29uZmlndXJlIHRoZSBtaXJyb3IgYW5kIHJlbW92ZSB0aGUgZGV2aWNlCit0aGF0IGNhdXNlZCB0aGUgZXJyb3IuICBNYW5hZ2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSBtaXJyb3IgaXMgZG9uZSB3aXRoCisnbHZjb252ZXJ0JyBhbmQgcmVtb3ZpbmcgYSBkZXZpY2UgZnJvbSBhIHZvbHVtZSBncm91cCBjYW4gYmUgZG9uZSB3aXRoCisndmdyZWR1Y2UnLgorCitJZiBhIG1pcnJvciBpcyBub3QgJ2luLXN5bmMnLCBhIHJlYWQgZmFpbHVyZSB3aWxsIHByb2R1Y2UgYW4gSS9PIGVycm9yLgorVGhpcyBlcnJvciB3aWxsIHByb3BhZ2F0ZSBhbGwgdGhlIHdheSB1cCB0byB0aGUgYXBwbGljYXRpb25zIGFib3ZlIHRoZQorbG9naWNhbCB2b2x1bWUgKGUuZy4gdGhlIGZpbGUgc3lzdGVtKS4gIE5vIGF1dG9tYXRpYyBpbnRlcnZlbnRpb24gd2lsbAordGFrZSBwbGFjZSBpbiB0aGlzIGNhc2UgZWl0aGVyLiAgSXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZGVjaWRlIHdoYXQKK2NhbiBiZSBkb25lL3NhbHZhZ2VkIGluIHRoaXMgc2VuYXJpby4gIElmIHRoZSB1c2VyIGlzIGNvbmZpZGVudCB0aGF0IHRoZQoraW1hZ2VzIG9mIHRoZSBtaXJyb3IgYXJlIHRoZSBzYW1lIChvciB0aGV5IGFyZSB3aWxsaW5nIHRvIHNpbXBseSBhdHRlbXB0Cit0byByZXRyZWl2ZSB3aGF0ZXZlciBkYXRhIHRoZXkgY2FuKSwgJ2x2Y29udmVydCcgY2FuIGJlIHVzZWQgdG8gZWxpbWluYXRlCit0aGUgZmFpbGVkIGltYWdlIGFuZCBwcm9jZWVkLgorCitNaXJyb3IgcmVzeW5jaHJvbml6YXRpb24gZXJyb3JzOgorQSByZXN5bmNocm9uaXphdGlvbiBlcnJvciBpcyBvbmUgdGhhdCBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gaW5pdGlhbGl6ZQorYWxsIG1pcnJvciBpbWFnZXMgdG8gYmUgdGhlIHNhbWUuICBJdCBjYW4gaGFwcGVuIGR1ZSB0byBhIGZhaWx1cmUgdG8KK3JlYWQgdGhlIHByaW1hcnkgaW1hZ2UgKHRoZSBpbWFnZSBjb25zaWRlcmVkIHRvIGhhdmUgdGhlICdnb29kJyBkYXRhKSwgb3IKK2R1ZSB0byBhIGZhaWx1cmUgdG8gd3JpdGUgdGhlIHNlY29uZGFyeSBpbWFnZXMuICBUaGlzIHR5cGUgb2YgZmFpbHVyZQorb25seSBwcm9kdWNlcyBhIHdhcm5pbmcsIGFuZCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byB0YWtlIGFjdGlvbiBpbiB0aGlzCitjYXNlLiAgSWYgdGhlIGVycm9yIGlzIHRyYW5zaWVudCwgdGhlIHVzZXIgY2FuIHNpbXBseSByZWFjdGl2YXRlIHRoZQorbWlycm9yZWQgbG9naWNhbCB2b2x1bWUgdG8gbWFrZSBhbm90aGVyIGF0dGVtcHQgYXQgcmVzeW5jaHJvbml6YXRpb24uCitJZiBhdHRlbXB0cyB0byBmaW5pc2ggcmVzeW5jaHJvbml6YXRpb24gZmFpbCwgJ2x2Y29udmVydCcgY2FuIGJlIHVzZWQgdG8KK3JlbW92ZSB0aGUgZmF1bHR5IGRldmljZSBmcm9tIHRoZSBtaXJyb3IuCisKK1RPRE8uLi4KK1NvbWUgc29ydCBvZiByZXNwb25zZSB0byB0aGlzIHR5cGUgb2YgZXJyb3IgY291bGQgYmUgYXV0b21hdGVkLgorU2luY2UgdGhpcyBkb2N1bWVudCBpcyB0aGUgZGVmaW5pdGl2ZSBzb3VyY2UgZm9yIGhvdyB0byBoYW5kbGUgZGV2aWNlCitmYWlsdXJlcywgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIGRlZmluZWQgaGVyZS4gIElmIHRoZSBwcm9jZXNzIGlzIGRlZmluZWQKK2J1dCBub3QgaW1wbGVtZW50ZWQsIGl0IHNob3VsZCBiZSBub3RlZCBhcyBzdWNoLiAgT25lIGlkZWEgbWlnaHQgYmUgdG8KK21ha2UgYSBzaW5nbGUgYXR0ZW1wdCB0byBzdXNwZW5kL3Jlc3VtZSB0aGUgbWlycm9yIGluIGFuIGF0dGVtcHQgdG8KK3JlZG8gdGhlIHN5bmMgb3BlcmF0aW9uIHRoYXQgZmFpbGVkLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZXJlIGlzCithIHBlcm1hbmVudCBmYWlsdXJlLCBpdCBtYXkgc2ltcGx5IGJlIGJlc3QgdG8gd2FpdCBmb3IgdGhlIHVzZXIgb3IgdGhlCithdXRvbWF0ZWQgcmVzcG9uc2UgdGhhdCBpcyBzdXJlIHRvIGZvbGxvdyBmcm9tIGEgd3JpdGUgZmFpbHVyZS4KKy4uLlRPRE8KKworTWlycm9yIHdyaXRlIGZhaWx1cmVzOgorV2hlbiBhIHdyaXRlIGVycm9yIG9jY3VycyBvbiBhIG1pcnJvciBjb25zdGl0dWVudCBkZXZpY2UsIGFuIGF0dGVtcHQKK3RvIGhhbmRsZSB0aGUgZmFpbHVyZSBpcyBhdXRvbWF0aWNhbGx5IG1hZGUuICBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZworJ2x2Y29udmVydCAtLXJlcGFpciAtLXVzZS1wb2xpY2llcycuICBUaGUgcG9saWNpZXMgaW1wbGllZCBieSB0aGlzCitjb21tYW5kIGFyZSBzZXQgaW4gdGhlIExWTSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGV5IGFyZToKKy0gbWlycm9yX2xvZ19mYXVsdF9wb2xpY3k6ICBUaGlzIGRlZmluZXMgd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuCisgIGlmIHRoZSBkZXZpY2UgY29udGFpbmluZyB0aGUgbG9nIGZhaWxzLiAgVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZQorICAicmVtb3ZlIiBhbmQgImFsbG9jYXRlIi4gIEVpdGhlciBvZiB0aGVzZSBvcHRpb25zIHdpbGwgY2F1c2UgdGhlCisgIGZhdWx0eSBsb2cgZGV2aWNlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWlycm9yLiAgVGhlICJhbGxvY2F0ZSIKKyAgcG9saWN5IHdpbGwgYXR0ZW1wdCB0aGUgZnVydGhlciBhY3Rpb24gb2YgdHJ5aW5nIHRvIHJlcGxhY2UgdGhlCisgIGZhaWxlZCBkaXNrIGxvZyBieSB1c2luZyBzcGFjZSB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiB0aGUKKyAgdm9sdW1lIGdyb3VwLiAgSWYgdGhlIGFsbG9jYXRpb24gZmFpbHMgKG9yIHRoZSAicmVtb3ZlIiBwb2xpY3kKKyAgaXMgc3BlY2lmaWVkKSwgdGhlIG1pcnJvciBsb2cgd2lsbCBiZSBtYWludGFpbmVkIGluIG1lbW9yeS4gIFNob3VsZAorICB0aGUgbWFjaGluZSBiZSByZWJvb3RlZCBvciB0aGUgbG9naWNhbCB2b2x1bWUgZGVhY3RpdmF0ZWQsIGEKKyAgY29tcGxldGUgcmVzeW5jaHJvbml6YXRpb24gb2YgdGhlIG1pcnJvciB3aWxsIGJlIG5lY2Vzc2FyeSB1cG9uCisgIHRoZSBmb2xsb3cgYWN0aXZhdGlvbiAtIHN1Y2ggaXMgdGhlIG5hdHVyZSBvZiBhIG1pcnJvciB3aXRoIGEgJ2NvcmUnCisgIGxvZy4gIFRoZSBkZWZhdWx0IHBvbGljeSBmb3IgaGFuZGxpbmcgbG9nIGZhaWx1cmVzIGlzICJhbGxvY2F0ZSIuCisgIFRoZSBzZXJ2aWNlIGRpc3J1cHRpb24gaW5jdXJyZWQgYnkgcmVwbGFjaW5nIHRoZSBmYWlsZWQgbG9nIGlzCisgIG5lZ2xpZ2libGUsIHdoaWxlIHRoZSBiZW5lZml0cyBvZiBoYXZpbmcgcGVyc2lzdGVudCBsb2cgaXMKKyAgcHJvbm91bmNlZC4KKy0gbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeTogIFRoaXMgZGVmaW5lcyB3aGF0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4KKyAgaWYgYSBkZXZpY2UgY29udGFpbmluZyBhbiBpbWFnZSBmYWlscy4gIEFnYWluLCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMKKyAgYXJlICJyZW1vdmUiIGFuZCAiYWxsb2NhdGUiLiAgQm90aCBvZiB0aGVzZSBvcHRpb25zIHdpbGwgY2F1c2UgdGhlCisgIGZhdWx0eSBpbWFnZSBkZXZpY2UgdG8gYmUgcmVtb3ZlZCAtIGFkanVzdGluZyB0aGUgbG9naWNhbCB2b2x1bWUKKyAgYWNjb3JkaW5nbHkuICBGb3IgZXhhbXBsZSwgaWYgb25lIGltYWdlIG9mIGEgMi13YXkgbWlycm9yIGZhaWxzLCB0aGUKKyAgbWlycm9yIHdpbGwgYmUgY29udmVydGVkIHRvIGEgbGluZWFyIGRldmljZS4gIElmIG9uZSBpbWFnZSBvZiBhCisgIDMtd2F5IG1pcnJvciBmYWlscywgdGhlIG1pcnJvciB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIDItd2F5IG1pcnJvci4KKyAgVGhlICJhbGxvY2F0ZSIgcG9saWN5IHRha2VzIHRoZSBmdXJ0aGVyIGFjdGlvbiBvZiB0cnlpbmcgdG8gcmVwbGFjZQorICB0aGUgZmFpbGVkIGltYWdlIHVzaW5nIHNwYWNlIHRoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSB2b2x1bWUgZ3JvdXAuCisgIFJlcGxhY2luZyBhIGZhaWxlZCBtaXJyb3IgaW1hZ2Ugd2lsbCBpbmN1cmUgdGhlIGNvc3Qgb2YKKyAgcmVzeW5jaHJvbml6aW5nIC0gZGVncmFkaW5nIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbWlycm9yLiAgVGhlCisgIGRlZmF1bHQgcG9saWN5IGZvciBoYW5kbGluZyBhbiBpbWFnZSBmYWlsdXJlIGlzICJyZW1vdmUiLiAgVGhpcworICBhbGxvd3MgdGhlIG1pcnJvciB0byBzdGlsbCBmdW5jdGlvbiwgYnV0IGdpdmVzIHRoZSBhZG1pbmlzdHJhdG9yIHRoZQorICBjaG9pY2Ugb2Ygd2hlbiB0byBpbmN1cmUgdGhlIGV4dHJhIHBlcmZvcm1hbmNlIGNvc3RzIG9mIHJlcGxhY2luZworICB0aGUgZmFpbGVkIGltYWdlLgorCitSQUlEIGxvZ2ljYWwgdm9sdW1lIGRldmljZSBmYWlsdXJlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmcm9tIHRoZSAibWlycm9yIgorc2VnbWVudCB0eXBlLiAgRGlzY3Vzc2lvbiBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiBsdm0yLXJhaWQudHh0LgpkaWZmIC0tZ2l0IGEvZG9jL2x2bWV0YWRfZGVzaWduLnR4dCBiL2RvYy9sdm1ldGFkX2Rlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2MWNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9sdm1ldGFkX2Rlc2lnbi50eHQKQEAgLTAsMCArMSwyMDggQEAKK1RoZSBkZXNpZ24gb2YgTFZNZXRhRAorPT09PT09PT09PT09PT09PT09PT09CisKK0ludm9jYXRpb24gYW5kIHNldHVwCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZGFlbW9uIHNob3VsZCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZpcnN0IExWTSBjb21tYW5kIGlzc3VlZCBvbgordGhlIHN5c3RlbSwgd2hlbiBuZWVkZWQuIFRoZSB1c2FnZSBvZiB0aGUgZGFlbW9uIHNob3VsZCBiZSBjb25maWd1cmFibGUgaW4KK2x2bS5jb25mLCBwcm9iYWJseSB3aXRoIGl0cyBvd24gc2VjdGlvbi4gU2F5CisKKyAgICBsdm1ldGFkIHsKKyAgICAgICAgZW5hYmxlZCA9IDEgIyBkZWZhdWx0CisgICAgICAgIGF1dG9zdGFydCA9IDEgIyBkZWZhdWx0CisgICAgICAgIHNvY2tldCA9ICIvcGF0aC90by9zb2NrZXQiICMgZGVmYXVsdHMgdG8gL3Zhci9ydW4vbHZtZXRhZCBvciBzdWNoCisgICAgfQorCitMaWJyYXJ5IGludGVncmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gYSBjb21tYW5kIG5lZWRzIHRvIGFjY2VzcyBtZXRhZGF0YSwgaXQgY3VycmVudGx5IG5lZWRzIHRvIHBlcmZvcm0gYSBzY2FuCitvZiB0aGUgcGh5c2ljYWwgZGV2aWNlcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gVGhpcyBpcyBhIHBvc3NpYmx5IHF1aXRlCitleHBlbnNpdmUgb3BlcmF0aW9uLCBlc3BlY2lhbGx5IGlmIG1hbnkgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbS4gSW4KK21vc3QgY2FzZXMsIExWTSBuZWVkcyBhIGNvbXBsZXRlIGltYWdlIG9mIHRoZSBzeXN0ZW0ncyBQVnMgdG8gb3BlcmF0ZQorY29ycmVjdGx5LCBzbyBhbGwgZGV2aWNlcyBuZWVkIHRvIGJlIHJlYWQsIHRvIGF0IGxlYXN0IGRldGVybWluZSBwcmVzZW5jZSAoYW5kCitjb250ZW50KSBvZiBhIFBWIGxhYmVsLiBBZGRpdGlvbmFsIElPIGlzIGRvbmUgdG8gb2J0YWluIG9yIHdyaXRlIG1ldGFkYXRhCithcmVhcywgYnV0IHRoaXMgaXMgb25seSBtYXJnaW5hbGx5IHJlbGF0ZWQgYW5kIGFkZHJlc3NlZCBieSBEYXZlJ3MKK21ldGFkYXRhLWJhbGFuY2luZyB3b3JrLgorCitJbiB0aGUgZXhpc3Rpbmcgc2Nhbm5pbmcgY29kZSwgYSBjYWNoZSBsYXllciBleGlzdHMsIHVuZGVyCitsaWIvY2FjaGUvbHZtY2FjaGUuW2hjXS4gVGhpcyBsYXllciBpcyBrZWVwaW5nIGEgdGV4dHVhbCBjb3B5IG9mIHRoZSBtZXRhZGF0YQorZm9yIGEgZ2l2ZW4gdm9sdW1lIGdyb3VwLCBpbiBhIGZvcm1hdF90ZXh0IGZvcm0sIGFzIGEgY2hhcmFjdGVyIHN0cmluZy4gV2UgY2FuCitwbHVnIHRoZSBsdm1ldGFkIGludGVyZmFjZSBhdCB0aGlzIGxldmVsOiBpbiBsdm1jYWNoZV9nZXRfdmcsIHdoaWNoIGlzCityZXNwb25zaWJsZSBmb3IgbG9va2luZyB1cCBtZXRhZGF0YSBpbiBhIGxvY2FsIGNhY2hlLCB3ZSBjYW4sIGlmIHRoZSBtZXRhZGF0YQoraXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgY2FjaGUsIHF1ZXJ5IGx2bWV0YWQuIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLAord2hlbiBhIFZHIGlzIG5vdCBjYWNoZWQgeWV0LCB0aGlzIG9wZXJhdGlvbiBmYWlscyBhbmQgcHJvbXB0cyB0aGUgY2FsbGVyIHRvCitwZXJmb3JtIGEgc2Nhbi4gVW5kZXIgdGhlIGx2bWV0YWQgZW5hYmxlZCBzY2VuYXJpbywgdGhpcyB3b3VsZCBuZXZlciBoYXBwZW4gYW5kCit0aGUgZmFsbC10aHJvdWdoIHdvdWxkIG9ubHkgYmUgYWN0aXZhdGVkIHdoZW4gbHZtZXRhZCBpcyBkaXNhYmxlZCwgd2hpY2ggd291bGQKK2xlYWQgdG8gbG9jYWwgY2FjaGUgYmVpbmcgcG9wdWxhdGVkIGFzIHVzdWFsIHRocm91Z2ggYSBsb2NhbGx5IGV4ZWN1dGVkIHNjYW4uCisKK1RoZXJlZm9yZSwgZXhpc3Rpbmcgc3RhbmQtYWxvbmUgKGkuZS4gbm8gbHZtZXRhZCkgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdG9vbHMKK3dvdWxkIGJlIG5vdCBjb21wcm9taXNlZCBieSBhZGRpbmcgbHZtZXRhZC4gV2l0aCBsdm1ldGFkIGVuYWJsZWQsIGhvd2V2ZXIsCitzaWduaWZpY2FudCBwb3J0aW9ucyBvZiB0aGUgY29kZSB3b3VsZCBiZSBzaG9ydC1jaXJjdWl0ZWQuCisKK1NjYW5uaW5nCistLS0tLS0tLQorCitJbml0aWFsbHkgKGF0IGxlYXN0KSwgdGhlIGx2bWV0YWQgd2lsbCBiZSBub3QgYWxsb3dlZCB0byByZWFkIGRpc2tzOiBpdCB3aWxsCityZWx5IG9uIGFuIGV4dGVybmFsIHByb2dyYW0gdG8gcHJvdmlkZSB0aGUgbWV0YWRhdGEuIEluIHRoZSBpZGVhbCBjYXNlLCB0aGlzCit3aWxsIGJlIHRyaWdnZXJlZCBieSB1ZGV2LiBUaGUgcm9sZSBvZiBsdm1ldGFkIGlzIHRoZW4gdG8gY29sbGVjdCBhbmQgbWFpbnRhaW4KK2FuIGFjY3VyYXRlICh1cCB0byB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQpIGltYWdlIG9mIHRoZSBWR3MgYXZhaWxhYmxlIGluIHRoZQorc3lzdGVtLiBJIGltYWdpbmUgd2UgY291bGQgZXh0ZW5kIHRoZSBwdnNjYW4gY29tbWFuZCAob3IgYWRkIGEgbmV3IG9uZSwgc2F5Citsdm1ldGFkX2NsaWVudCwgaWYgcHZzY2FuIGlzIGZvdW5kIHRvIGJlIGluYXBwcm9wcmlhdGUpOgorCisgICAgJCBwdnNjYW4gLS1jYWNoZSAvZGV2L2ZvbworICAgICQgcHZzY2FuIC0tY2FjaGUgLS1yZW1vdmUgL2Rldi9mb28KKworVGhlc2UgY29tbWFuZHMgd291bGQgc2ltcGx5IHJlYWQgdGhlIGxhYmVsIGFuZCB0aGUgTURBIChpZiBhcHBsaWNhYmxlKSBmcm9tIHRoZQorZ2l2ZW4gUFYgYW5kIGZlZWQgdGhhdCBkYXRhIHRvIHRoZSBydW5uaW5nIGx2bWV0YWQsIHVzaW5nCitsdm1ldGFkX3thZGQscmVtb3ZlfV9wdiAoc2VlIGx2bWV0YWRfY2xpZW50LmgpLgorCitXZSBob3dldmVyIG5lZWQgdG8gZW5zdXJlIGEgY291cGxlIG9mIHRoaW5ncyBoZXJlOgorCisxKSBvbmx5IExWTSBjb21tYW5kcyBldmVyIHRvdWNoIFBWIGxhYmVscyBhbmQgVkcgbWV0YWRhdGEKKzIpIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQgb3IgcmVtb3ZlZCwgdWRldiBmaXJlcyBhIHJ1bGUgdG8gbm90aWZ5IGx2bWV0YWQKKworV2hpbGUgdGhlIGxhdHRlciBpcyBzdHJhaWdodGZvcndhcmQsIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgZmlyc3QuIFdlCisqbWlnaHQqIHdhbnQgdG8gaW52b2tlIHRoZSBkcmVhZGVkICJ3YXRjaCIgdWRldiBydWxlIGluIHRoaXMgY2FzZSwgaG93ZXZlciBpdAorZW5kcyB1cCBiZWluZyBpbXBsZW1lbnRlZC4gT2YgY291cnNlLCB3ZSBjYW4gYWxzbyByZWx5IG9uIHRoZSBzeXNhZG1pbiB0byBiZQorcmVhc29uYWJsZSBhbmQgbm90IHdyaXRlIG92ZXIgZXhpc3RpbmcgTFZNIG1ldGFkYXRhIHdpdGhvdXQgZmlyc3QgdGVsbGluZyBMVk0KK3RvIGxldCBnbyBvZiB0aGUgcmVzcGVjdGl2ZSBkZXZpY2UocykuCisKK0V2ZW4gaWYgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgcHJvYmxlbSwgbWV0YWRhdGEgd3JpdGUgc2hvdWxkIGZhaWwgaW4gdGhlc2UKK2Nhc2VzLCBzbyB0aGUgYWRtaW4gc2hvdWxkIGJlIHVuYWJsZSB0byBkbyBzdWJzdGFudGlhbCBkYW1hZ2UgdG8gdGhlIHN5c3RlbS4gSWYKK3RoZXJlIHdlcmUgYWN0aXZlIExWcyBvbiB0b3Agb2YgdGhlIHZhbmlzaGVkIFBWLCB0aGV5IGFyZSBpbiB0cm91YmxlIG5vIG1hdHRlcgord2hhdCBoYXBwZW5zIHRoZXJlLgorCitJbmNyZW1lbnRhbCBzY2FuCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBzb21lIG5ldyBpc3N1ZXMgYXJpc2luZyB3aXRoIHRoZSAidWRldiIgc2NhbiBtb2RlLiBOYW1lbHksIHRoZQorZGV2aWNlcyBvZiBhIHZvbHVtZSBncm91cCB3aWxsIGJlIGFwcGVhcmluZyBvbmUgYnkgb25lLiBUaGUgYmVoYXZpb3VyIGluIHRoaXMKK2Nhc2Ugd2lsbCBiZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGN1cnJlbnQgYmVoYXZpb3VyIHdoZW4gZGV2aWNlcyBhcmUgbWlzc2luZzoKK3RoZSB2b2x1bWUgZ3JvdXAsIHVudGlsICphbGwqIGl0cyBwaHlzaWNhbCB2b2x1bWVzIGhhdmUgYmVlbiBkaXNjb3ZlcmVkIGFuZAorYW5ub3VuY2VkIGJ5IHVkZXYsIHdpbGwgYmUgaW4gYSBzdGF0ZSB3aXRoIHNvbWUgb2YgaXRzIGRldmljZXMgZmxhZ2dlZCBhcworTUlTU0lOR19QVi4gVGhpcyBtZWFucyB0aGF0IHRoZSB2b2x1bWUgZ3JvdXAgd2lsbCBiZSwgZm9yIG1vc3QgcHVycG9zZXMsCityZWFkLW9ubHkgdW50aWwgaXQgaXMgY29tcGxldGUgYW5kIExWcyByZXNpZGluZyBvbiB5ZXQtdW5rbm93biBQVnMgd29uJ3QKK2FjdGl2YXRlIHdpdGhvdXQgLS1wYXJ0aWFsLiBVbmRlciB1c3VhbCBjaXJjdW1zdGFuY2VzLCB0aGlzIGlzIG5vdCBhIHByb2JsZW0KK2FuZCB0aGUgY3VycmVudCBjb2RlIGZvciBkZWFsaW5nIHdpdGggTUlTU0lOR19QVnMgc2hvdWxkIGJlIGFkZXF1YXRlLgorCitIb3dldmVyLCB0aGUgY29kZSBmb3IgcmVhZGluZyB2b2x1bWUgZ3JvdXBzIGZyb20gZGlza3Mgd2lsbCBuZWVkIHRvIGJlIGFkYXB0ZWQsCitzaW5jZSBpdCBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBpbmNyZW1lbnRhbGx5LiBTdWNoIHN1cHBvcnQgd2lsbCBuZWVkIHRvIHRyYWNrCittZXRhZGF0YS1sZXNzIFBWcyB0aGF0IGhhdmUgYmVlbiBlbmNvdW50ZXJlZCBzbyBmYXIgYW5kIHRvIHByb3ZpZGUgYSB3YXkgdG8KK3VwZGF0ZSBhbiBleGlzdGluZyB2b2x1bWUgZ3JvdXAuIFdoZW4gdGhlIGZpcnN0IFBWIHdpdGggbWV0YWRhdGEgb2YgYSBnaXZlbiBWRworaXMgZW5jb3VudGVyZWQsIHRoZSBWRyBpcyBjcmVhdGVkIGluIGx2bWV0YWQgKHByb2JhYmx5IGluIHRoZSBmb3JtIG9mICJzdHJ1Y3QKK3ZvbHVtZV9ncm91cCIpIGFuZCBpdCBpcyBhc3NpZ25lZCBhbnkgcHJldmlvdXNseSBjYWNoZWQgbWV0YWRhdGEtbGVzcyBQVnMgaXQgaXMKK3JlZmVyZW5jaW5nLiBBbnkgUFZzIHRoYXQgd2VyZSBub3QgeWV0IGVuY291bnRlcmVkIHdpbGwgYmUgbWFya2VkIGFzIE1JU1NJTkdfUFYKK2luIHRoZSAic3RydWN0IHZvbHVtZV9ncm91cCIuIFVwb24gc2Nhbm5pbmcgYSBuZXcgUFYsIGlmIGl0IGJlbG9uZ3MgdG8gYW55CithbHJlYWR5LWtub3duIHZvbHVtZSBncm91cCwgdGhpcyBQViBpcyBjaGVja2VkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBhbHJlYWR5CitjYWNoZWQgbWV0YWRhdGEgKGluIGEgY2FzZSBvZiBtaXNtYXRjaCwgdGhlIFZHIG5lZWRzIHRvIGJlIHJlY292ZXJlZCBvcgorZGVjbGFyZWQgY29uZmxpY3RlZCksIGFuZCBpcyBzdWJzZXF1ZW50bHkgdW5tYXJrZWQgTUlTU0lOR19QVi4gQ2FyZSBuZWVkIGJlCit0YWtlbiBub3QgdG8gdW5tYXJrIE1JU1NJTkdfUFYgb24gUFZzIHRoYXQgaGF2ZSB0aGlzIGZsYWcgaW4gdGhlaXIgcGVyc2lzdGVudAorbWV0YWRhdGEsIHRob3VnaC4KKworVGhlIG1vc3QgcHJvYmxlbWF0aWMgYXNwZWN0IG9mIHRoZSB3aG9sZSBkZXNpZ24gbWF5IGJlIG9ycGhhbiBQVnMuIEF0IGFueSBnaXZlbgorcG9pbnQsIGEgbWV0YWRhdGEtbGVzcyBQViBtYXkgYXBwZWFyIG9ycGhhbmVkLCBpZiBhIFBWIG9mIGl0cyBWRyB3aXRoIG1ldGFkYXRhCitoYXMgbm90IGJlZW4gc2Nhbm5lZCB5ZXQuIEV2ZW50dWFsbHksIHdlIHdpbGwgaGF2ZSB0byBkZWNpZGUgdGhhdCB0aGlzIFBWIGlzCityZWFsbHkgYW4gb3JwaGFuIGFuZCBlbmFibGUgaXRzIHVzYWdlIGZvciBjcmVhdGluZyBvciBleHRlbmRpbmcgVkdzLiBJbgorcHJhY3RpY2UsIHRoZSBkZWNpc2lvbiBtaWdodCBiZSBnb3Zlcm5lZCBieSBhIHRpbWVvdXQgb3IgYXNzdW1lZCBpbW1lZGlhdGVseSAtLQordGhlIGZvcm1lciBjYXNlIGlzIGEgbGl0dGxlIHNhZmVyLCB0aGUgbGF0dGVyIGlzIHByb2JhYmx5IG1vcmUgdHJhbnNwYXJlbnQuIEkKK2FtIG5vdCB2ZXJ5IGtlZW4gb24gdXNpbmcgdGltZW91dHMgYW5kIHdlIGNhbiBwcm9iYWJseSBhc3N1bWUgdGhhdCB0aGUgYWRtaW4KK3dvbid0IGJsaW5kbHkgdHJ5IHRvIHJlLXVzZSBkZXZpY2VzIGluIGEgd2F5IHRoYXQgd291bGQgdHJpcCB1cCBMVk0gaW4gdGhpcworcmVzcGVjdC4gSSB3b3VsZCBiZSBpbiBmYXZvdXIgb2YganVzdCBhc3N1bWluZyB0aGF0IG1ldGFkYXRhLWxlc3MgVkdzIHdpdGggbm8KK2tub3duIHJlZmVyZW5jaW5nIFZHcyBhcmUgb3JwaGFucyAtLSBhZnRlciBhbGwsIHRoaXMgaXMgdGhlIHNhbWUgYXBwcm9hY2ggYXMgd2UKK3VzZSB0b2RheS4gVGhlIG1ldGFkYXRhIGJhbGFuY2luZyBzdXBwb3J0IG1heSBzdHJlc3MgdGhpcyBhIGJpdCBtb3JlIHRoYW4gdGhlCit1c3VhbCBjb250ZW1wb3Jhcnkgc2V0dXBzIGRvLCB0aG91Z2guCisKK0F1dG9tYXRpYyBhY3RpdmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBtYXkgYWxzbyBiZSBwcnVkZW50IHRvIHByb3ZpZGUgYSBjb21tYW5kIHRoYXQgd2lsbCBibG9jayB1bnRpbCBhIHZvbHVtZQorZ3JvdXAgaXMgY29tcGxldGUsIHNvIHRoYXQgc2NyaXB0cyBjYW4gcmVsaWFibHkgYWN0aXZhdGUvbW91bnQgTFZzIGFuZCBzdWNoLiBPZgorY291cnNlLCBzb21lIFBWcyBtYXkgbmV2ZXIgYXBwZWFyLCBzbyBhIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LiBBZ2FpbiwgdGhpcyBpcworc29tZXRoaW5nIG5vdCBoYW5kbGVkIGJ5IGN1cnJlbnQgdG9vbHMsIGJ1dCBtYXkgYmVjb21lIG1vcmUgaW1wb3J0YW50IGluCitmdXR1cmUuIEl0IHByb2JhYmx5IGRvZXMgbm90IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgcmlnaHQgYXdheSB0aG91Z2guCisKK1RoZSBvdGhlciBhc3BlY3Qgb2YgdGhlIHByb2dyZXNzaXZlIFZHIGFzc2VtYmx5IGlzIGF1dG9tYXRpYyBhY3RpdmF0aW9uLiBUaGUKK2N1cnJlbnRseSBvbmx5IHByb2JsZW0gd2l0aCB0aGF0IGlzIHRoYXQgd2Ugd291bGQgbGlrZSB0byBhdm9pZCBoYXZpbmcKK2FjdGl2YXRpb24gY29kZSBpbiBsdm1ldGFkLCBzbyB3ZSB3b3VsZCBwcmVmZXIgdG8gZmlyZSB1cCBhbiBldmVudCBvZiBzb21lIHNvcnQKK2FuZCBsZXQgc29tZW9uZSBlbHNlIGhhbmRsZSB0aGUgYWN0aXZhdGlvbiBhbmQgd2hhdG5vdC4KKworQ2x1c3RlciBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0KKworV2hlbiB3b3JraW5nIGluIGEgY2x1c3RlciwgY2x2bWQgaW50ZWdyYXRpb24gd2lsbCBiZSBuZWNlc3Nhcnk6IGNsdm1kIHdpbGwgbmVlZAordG8gaW5zdHJ1Y3QgbHZtZXRhZCB0byByZS1yZWFkIG1ldGFkYXRhIGFzIGFwcHJvcHJpYXRlIGR1ZSB0byB3cml0ZXMgb24gcmVtb3RlCitob3N0cy4gT3ZlcmFsbCwgdGhpcyBpcyBub3QgaGFyZCwgYnV0IHRoZSBkZXZpbCBpcyBpbiB0aGUgZGV0YWlscy4gSSB3b3VsZAorcG9zc2libHkgZGlzYWJsZSBsdm1ldGFkIGZvciBjbHVzdGVyZWQgdm9sdW1lIGdyb3VwcyBpbiB0aGUgZmlyc3QgcGhhc2UgYW5kCitvbmx5IHByb2NlZWQgd2hlbiB0aGUgbG9jYWwgbW9kZSBpcyByb2J1c3QgYW5kIHdlbGwgdGVzdGVkLgorCitXaXRoIGx2bWxvY2tkLCBsdm1ldGFkIHN0YXRlIGlzIGtlcHQgdXAgdG8gZGF0ZSBieSBmbGFnZ2luZyBlaXRoZXIgYW4KK2luZGl2aWR1YWwgVkcgYXMgImludmFsaWQiLCBvciB0aGUgZ2xvYmFsIHN0YXRlIGFzICJpbnZhbGlkIi4gIFdoZW4gZWl0aGVyCit0aGUgVkcgb3IgdGhlIGdsb2JhbCBzdGF0ZSBhcmUgcmVhZCwgdGhpcyBpbnZhbGlkIGZsYWcgaXMgcmV0dXJuZWQgYWxvbmcKK3dpdGggdGhlIGRhdGEuICBUaGUgY2xpZW50IGNvbW1hbmQgY2FuIGNoZWNrIGZvciB0aGlzIGludmFsaWQgc3RhdGUgYW5kCitkZWNpZGUgdG8gcmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbSBkaXNrIHJhdGhlciB0aGFuIHVzZSB0aGUgc3RhbGUgY2FjaGVkCitkYXRhLiAgQWZ0ZXIgdGhlIGxhdGVzdCBkYXRhIGlzIHJlYWQgZnJvbSBkaXNrLCB0aGUgY29tbWFuZCBtYXkgY2hvb3NlIHRvCitzZW5kIGl0IHRvIGx2bWV0YWQgdG8gdXBkYXRlIHRoZSBjYWNoZS4gIGx2bWxvY2tkIHVzZXMgdmVyc2lvbiBudW1iZXJzCitlbWJlZGRlZCBpbiBpdHMgVkcgYW5kIGdsb2JhbCBsb2NrcyB0byBkZXRlY3Qgd2hlbiBjYWNoZWQgZGF0YSBiZWNvbWVzCitpbnZhbGlkLCBhbmQgaXQgdGhlbiB0ZWxscyBsdm1ldGFkIHRvIHNldCB0aGUgcmVsYXRlZCBpbnZhbGlkIGZsYWcuCitkY3QsIDIwMTUtMDYtMjMKKworUHJvdG9jb2wgJiBjby4KKy0tLS0tLS0tLS0tLS0tCisKK0kgZXhwZWN0IGEgc2ltcGxlIHRleHQtYmFzZWQgcHJvdG9jb2wgZXhlY3V0ZWQgb24gdG9wIG9mIGFuIFVuaXggRG9tYWluIFNvY2tldAordG8gYmUgdGhlIGNvbW11bmljYXRpb24gaW50ZXJmYWNlIGZvciBsdm1ldGFkLiBJZGVhbGx5LCB0aGUgcmVxdWVzdHMgYW5kCityZXBsaWVzIHdpbGwgYmUgd2VsbC1mb3JtZWQgImNvbmZpZyBmaWxlIiBzdHlsZSBzdHJpbmdzLCBzbyB3ZSBjYW4gcmUtdXNlCitleGlzdGluZyBwYXJzaW5nIGluZnJhc3RydWN0dXJlLgorCitTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdHdvIGRhZW1vbnMsIEkgd291bGQgcHJvYmFibHkgbG9vayBpbnRvIGZhY3RvcmluZyBzb21lCitjb21tb24gY29kZSBmb3IgZGFlbW9uLXkgdGhpbmdzLCBsaWtlIHNvY2tldHMsIGNvbW11bmljYXRpb24gKGluY2x1ZGluZyB0aHJlYWQKK21hbmFnZW1lbnQpIGFuZCBtYXliZSBsb2dnaW5nIGFuZCByZS11c2luZyBpdCBpbiBhbGwgdGhlIGRhZW1vbnMgKGNsdm1kLAorZG1ldmVudGQgYW5kIGx2bWV0YWQpLiBUaGlzIHNoYXJlZCBpbmZyYXN0cnVjdHVyZSBzaG91bGQgbGl2ZSB1bmRlcgorZGFlbW9ucy9jb21tb24sIGFuZCB0aGUgZXhpc3RpbmcgZGFlbW9ucyBzaGFsbCBiZSBncmFkdWFsbHkgbWlncmF0ZWQgdG8gdGhlCitzaGFyZWQgY29kZS4KKworRnV0dXJlIGV4dGVuc2lvbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhYm92ZSBzaG91bGQgYmFzaWNhbGx5IGNvdmVyIHRoZSB1c2Ugb2YgbHZtZXRhZCBhcyBhIGNhY2hlLW9ubHkKK2RhZW1vbi4gV3JpdGVzIGNvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkIGxvY2FsbHksIGFuZCB0aGUgbmV3IG1ldGFkYXRhIHZlcnNpb24KK2NhbiBiZSBwcm92aWRlZCB0byBsdm1ldGFkIHRocm91Z2ggdGhlIHNvY2tldCB0aGUgdXN1YWwgd2F5LiBUaGlzIGlzIGZhaXJseQorbmF0dXJhbCBhbmQgaW4gbXkgb3BpbmlvbiByZWFzb25hYmxlLiBUaGUgbHZtZXRhZCBhY3RzIGxpa2UgYSBjYWNoZSB0aGF0IHdpbGwKK2hvbGQgbWV0YWRhdGEsIG5vIG1vcmUgbm8gbGVzcy4KKworQWJvdmUgdGhpcywgdGhlcmUgaXMgYSBjb3VwbGUgb2YgdGhpbmdzIHRoYXQgY291bGQgYmUgd29ya2VkIG9uIGxhdGVyLCB3aGVuIHRoZQorYWJvdmUgYmFzaWMgZGVzaWduIGlzIGZpbmlzaGVkIGFuZCBpbXBsZW1lbnRlZC4KKworX01ldGFkYXRhIHdyaXRpbmdfOiBXZSBtYXkgd2FudCB0byBzdXBwb3J0IHdyaXRpbmcgbmV3IG1ldGFkYXRhIHRocm91Z2gKK2x2bWV0YWQuIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgYSBiZXR0ZXIgZGVzaWduLCBidXQgdGhlIHdyaXRlIGl0c2VsZiBzaG91bGQgYmUKK21vcmUgb3IgbGVzcyBvcnRob2dvbmFsIHRvIHRoZSByZXN0IG9mIHRoZSBzdG9yeSBvdXRsaW5lZCBhYm92ZS4KKworX0xvY2tpbmdfOiBPdGhlciB0aGFuIGRpcmVjdGluZyBtZXRhZGF0YSB3cml0ZXMgdGhyb3VnaCBsdm1ldGFkLCBvbmUgY291bGQKK2NvbmNlaXZhYmx5IGFsc28gdHJhY2sgVkcvTFYgbG9ja2luZyB0aHJvdWdoIHRoZSBzYW1lLgorCitfQ2x1c3RlcmluZ186IEEgZGVlcGVyIGludGVncmF0aW9uIG9mIGx2bWV0YWQgd2l0aCBjbHZtZCBtaWdodCBiZSBwb3NzaWJsZSBhbmQKK21heWJlIGRlc2lyYWJsZS4gU2luY2UgY2x2bWQgY29tbXVuaWNhdGVzIG92ZXIgdGhlIG5ldHdvcmsgd2l0aCBvdGhlciBjbHZtZAoraW5zdGFuY2VzLCB0aGlzIGNvdWxkIGJlIGV4dGVuZGVkIHRvIG1ldGFkYXRhIGV4Y2hhbmdlIGJldHdlZW4gbHZtZXRhZCdzLAorZnVydGhlciBjdXR0aW5nIGRvd24gc2Nhbm5pbmcgY29zdHMuIFRoaXMgd291bGQgY29tYmluZSB3ZWxsIHdpdGggdGhlCit3cml0ZS10aHJvdWdoLWx2bWV0YWQgYXBwcm9hY2guCisKK1Rlc3RpbmcKKy0tLS0tLS0KKworU2luY2UgKGF0IGxlYXN0IGJhcmUtYm9uZXMpIGx2bWV0YWQgaGFzIG5vIGRpc2sgaW50ZXJhY3Rpb24gYW5kIGlzIGZlZCBtZXRhZGF0YQorZXh0ZXJuYWxseSwgaXQgc2hvdWxkIGJlIHZlcnkgYW1lbmFibGUgdG8gYXV0b21hdGVkIHRlc3RpbmcuIFdlIG5lZWQgdG8gcHJvdmlkZQorYSBjbGllbnQgdGhhdCBjYW4gZmVlZCBhcmJpdHJhcnksIHN5bnRoZXRpYyBtZXRhZGF0YSB0byB0aGUgZGFlbW9uIGFuZCByZXF1ZXN0Cit0aGUgZGF0YSBiYWNrLCBwcm92aWRpbmcgcmVhc29uYWJsZSAobmVhcmx5IHVuaXQtbGV2ZWwpIHRlc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuCisKK0JhdHRsZSBwbGFuICYgY29kZSBsYXlvdXQKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworLSBjb25maWdfdHJlZSBmcm9tIGxpYi9jb25maWcgbmVlZHMgdG8gbW92ZSB0byBsaWJkbS8KKy0gZGFlbW9uL2NvbW1vbiAqY2xpZW50KiBjb2RlIGNhbiBnbyB0byBsaWJkbS8gYXMgd2VsbCAoc2F5CisgIGxpYmRtL2xpYmRtLWRhZW1vbi57aCxjfSBvciBzdWNoKQorLSBkYWVtb24vY29tbW9uICpzZXJ2ZXIqIGNvZGUgc3RheXMsIGlzIGJ1aWx0IGluIGRhZW1vbi8gdG9wbGV2ZWwgYXMgYSBzdGF0aWMKKyAgbGlicmFyeSwgc2F5IGxpYmRhZW1vbi1jb21tb24uYQorLSBkYWVtb24vbHZtZXRhZCAqY2xpZW50KiBjb2RlIGdvZXMgdG8gbGliL2x2bWV0YWQKKy0gZGFlbW9uL2x2bWV0YWQgKnNlcnZlciogY29kZSBzdGF5cyAobGlua3MgaW4gZGFlbW9uL2xpYmRhZW1vbl9jb21tb24uYSkKZGlmZiAtLWdpdCBhL2RvYy9sdm1wb2xsZF9vdmVydmlldy50eHQgYi9kb2MvbHZtcG9sbGRfb3ZlcnZpZXcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjZlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbHZtcG9sbGRfb3ZlcnZpZXcudHh0CkBAIC0wLDAgKzEsODEgQEAKK0xWTSBwb2xsIGRhZW1vbiBvdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09CisKKyhsYXN0IHVwZGF0ZWQ6IDIwMTUtMDUtMDkpCisKK0xWTSBwb2xsIGRhZW1vbiAobHZtcG9sbGQpIGlzIHRoZSBhbHRlcm5hdGl2ZSBmb3IgbHZtMiBjbGFzc2ljYWwgcG9sbGluZworbWVjaGFuaXNtcy4gVGhlIG1vdGl2YXRpb24gYmVoaW5kIG5ldyBsdm1wb2xsZCB3YXMgdG8gY3JlYXRlIHBlcnNpc3RlbnQKK3N5c3RlbSBzZXJ2aWNlIHRoYXQgd291bGQgYmUgbW9yZSBkdXJhYmxlIGFuZCB0cmFuc3BhcmVudC4gSXQncyBzdWl0ZWQKK3BhcnRpY3VsYXJseSBmb3IgYW55IHN5c3RlbWQgZW5hYmxlZCBkaXN0cmlidXRpb24uCisKK0JlZm9yZSBsdm1wb2xsZCBhbnkgYmFja2dyb3VuZCBwb2xsaW5nIHByb2Nlc3Mgb3JpZ2luYXRpbmcgaW4gYSBsdm0yIGNvbW1hbmQKK2luaXRpYXRlZCBpbnNpZGUgY2dyb3VwIG9mIGEgc3lzdGVtZCBzZXJ2aWNlIGNvdWxkIGdldCBraWxsZWQgaWYgdGhlIG1haW4KK3Byb2Nlc3MgKHNlcnZpY2UpIGV4aXRlZCBpbiBzdWNoIGNncm91cC4gVGhhdCBjb3VsZCBsZWFkIHRvIHByZW1hdHVyZSB0ZXJtaW5hdGlvbgorb2Ygc3VjaCBsdm0yIHBvbGxpbmcgcHJvY2Vzcy4KKworQWxzbyB3aXRob3V0IGx2bXBvbGxkIHRoZXJlIHdlcmUgbm8gbWVhbnMgdG8gZGV0ZWN0IGEgcGFydGljdWxhciBwb2xsaW5nIHByb2Nlc3MKK3N1aXRlZCBmb3IgbW9uaXRvcmluZyBvZiBzcGVjaWZpYyBvcGVyYXRpb24gaXMgYWxyZWFkeSBpbi1wcm9ncmVzcyBhbmQgdGhlcmVmb3JlCitpdCdzIG5vdCBkZXNpcmFibGUgdG8gc3RhcnQgbmV4dCBvbmUgd2l0aCBleGFjdGx5IHNhbWUgdGFzay4gbHZtcG9sbGQgaXMgYWJsZSB0bworZGV0ZWN0IHN1Y2ggZHVwbGljYXRlIHJlcXVlc3RzIGFuZCBub3Qgc3Bhd24gc3VjaCByZWR1bmRhbnQgcHJvY2Vzcy4KKworbHZtcG9sbGQgaXMgcHJpbWFyaWx5IHRhcmdldGVkIGZvciBzeXN0ZW1zIHdpdGggc3lzdGVtZCBhcyBpbml0IHByb2Nlc3MuIEZvciBzeXN0ZW1zCit3aXRob3V0IHN5c3RlbWQgdGhlcmUncyBubyBuZWVkIHRvIGluc3RhbGwgbHZtcG9sbGQgYmVjYXVzZSB0aGVyZSBpcyBubyBpc3N1ZQord2l0aCBvYnNlcnZhdGlvbiBkZXNjcmliZWQgaW4gc2Vjb25kIHBhcmFncmFwaC4gWW91IGNhbiBzdGlsbCBiZW5lZml0IGZyb20KK2F2b2lkaW5nIGR1cGxpY2F0ZSBwb2xsaW5nIHByb2Nlc3MgYmVpbmcgc3Bhd25lZCwgYnV0IHdpdGhvdXQgc3lzdGVtZCBsdm1wb2xsZAorY2FuJ3QgZWFzaWx5IGJlIHJ1biBvbi1kZW1hbmQgKGFjdGl2YXRlZCBieSBhIHNvY2tldCBtYWludGFpbmVkIGJ5IHN5c3RlbWQpLgorCitsdm1wb2xsZCBpbXBsZW1lbnQgc2h1dGRvd24gb24gaWRsZSBhbmQgY2FuIHNodXRkb3duIGF1dG9tYXRpY2FsbHkgd2hlbiBpZGxlCitmb3IgcmVxdWVzdGVkIHRpbWUuIDYwIHNlY29uZCBpcyByZWNvbW1lbmRlZCBkZWZhdWx0IGhlcmUuIFRoaXMgYmVoYXZpb3VyIGNhbiBiZQordHVybmVkIG9mZiBpZiBmb3VuZCB1c2VsZXNzLgorCitEYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLQorCithKSBMb2dpY2FsIFZvbHVtZSAoc3RydWN0IGx2bXBvbGxkX2x2KQorCitFYWNoIG9wZXJhdGlvbiBpcyBpZGVudGlmaWVkIGJ5IExWLiBJbnRlcm5hbCBpZGVudGlmaWVyIHdpdGhpbiBsdm1wb2xsZAoraXMgZnVsbCBMViB1dWlkICh2Z191dWlkK2x2X3V1aWQpIHByZWZpeGVkIHdpdGggTFZNX1NZU1RFTV9ESVIgaWYgc2V0IGJ5IGNsaWVudC4KKworc3VjaCBmdWxsIGlkZW50aWZpZXIgbWF5IGxvb2sgbGlrZToKKworICAiL2V0Yy9sdm0vbHZtLmNvbmZXRmQyZFU2N1M4QXYyOUljSkNuWXpxUWlyZGZFbG54emhDZHpFaDdFSnJmQ245UjFUSVFqSWo1OHdlVVpEcmU0IgorCitvciB3aXRob3V0IExWTV9TWVNURU1fRElSIGJlaW5nIHNldCBleHBsaWNpdGx5OgorCisgICJXRmQyZFU2N1M4QXYyOUljSkNuWXpxUWlyZGZFbG54emhDZHpFaDdFSnJmQ245UjFUSVFqSWo1OHdlVVpEcmU0IgorCisKK0xWIGNhcnJpZXMgdmFyaW91cyBtZXRhZGF0YSBhYm91dCBwb2xsaW5nIG9wZXJhdGlvbi4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYXJlOgorCitWRyBuYW1lCitMViBuYW1lCitwb2xsaW5nIGludGVydmFsICh1c3VhbGx5IC0taW50ZXJ2YWwgcGFzc2VkIHRvIGx2bTIgY29tbWFuZCBvciBkZWZhdWx0IGZyb20gbHZtMiAKKwkJICBjb25maWd1cmF0aW9uKQorb3BlcmF0aW9uIHR5cGUgKG9uZSBvZjogcHZtb3ZlLCBjb252ZXJ0LCBtZXJnZSwgdGhpbl9tZXJnZSkKK0xWTV9TWVNURU1fRElSIChpZiBzZXQsIHRoaXMgaXMgYWxzbyBwYXNzZWQgYW1vbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIGx2cG9sbAorCQljb21tYW5kIHNwYXduZWQgYnkgbHZtcG9sbGQpCisKK2IpIExWIHN0b3JlcyAoc3RydWN0IGx2bXBvbGxkX3N0b3JlKQorCitsdm1wb2xsZCB1c2VzIHR3byBzdG9yZXMgZm9yIExvZ2ljYWwgdm9sdW1lcyAoc3RydWN0IGx2bXBvbGxkX2x2KS4gT25lIHN0b3JlIGZvciBwb2xsaW5nCitvcGVyYXRpb25zIGluLXByb2dyZXNzLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBhcyBvZiBub3c6IFBWIG1vdmUsIG1pcnJvciB1cC1jb252ZXJzaW9uLAorY2xhc3NpY2FsIHNuYXBzaG90IG1lcmdlLCB0aGluIHNuYXBzaG90IG1lcmdlLgorCitUaGUgc2Vjb25kIHN0b3JlIGlzIHN1aXRlZCBvbmx5IGZvciBwdm1vdmUgLS1hYm9ydCBvcGVyYXRpb25zIGluLXByb2dyZXNzLiBCb3RoCitzdG9yZXMgYXJlIGluZGVwZW5kZW50IGFuZCBpZGVudGljYWwgTFZzIChwdm1vdmUgL2Rldi9zZGEzIGFuZCBwdm1vdmUgLS1hYm9ydCAvZGV2L3NkYTMpCitjYW4gYmUgcnVuIGNvbmN1cmVudGx5IGZyb20gbHZtcG9sbGQgcG9pbnQgb2YgdmlldyAob24gbHZtMiBzaWRlIHRoZSBjb25zaXN0ZW5jeSBpcworZ3VhcmFudGVlZCBieSBsdm0yIGxvY2tpbmcgbWVjaGFuaXNtKS4KKworTG9ja2luZyBvcmRlcgorLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxvY2tzIGluIGx2bXBvbGxkLiBFYWNoIHN0b3JlIGhhcyBvd24gc3RvcmUgbG9jayBhbmQgZWFjaCBMViBoYXMKK293biBsdiBsb2NrLgorCitMb2NraW5nIG9yZGVyIGlzOgorMSkgc3RvcmUgbG9jaworMikgTFYgbG9jaworCitFYWNoIExWIGhhcyB0byBiZSBpbnNpZGUgYSBzdG9yZS4gV2hlbiBkYWVtb24gcmVxdWlyZXMgdG8gdGFrZSBib3RoIGxvY2tzIGl0IGhhcwordG8gdGFrZSBhIHN0b3JlIGxvY2sgZmlyc3QgYW5kIExWIGxvY2sgaGFzIHRvIGJlIHRha2VuIGFmdGVyd2FyZHMgKGFmdGVyIHRoZQorYXBwcm9wcmlhdGUgc3RvcmUgbG9jayB3aGVyZSB0aGUgTFYgaXMgYmVpbmcgc3RvcmVkIDopKQpkaWZmIC0tZ2l0IGEvZG9jL3B2bW92ZV9vdXRsaW5lLnR4dCBiL2RvYy9wdm1vdmVfb3V0bGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NmI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9wdm1vdmVfb3V0bGluZS50eHQKQEAgLTAsMCArMSw1MiBAQAorTGV0J3Mgc2F5IHdlIGhhdmUgYW4gTFYsIG1hZGUgdXAgb2YgdGhyZWUgc2VnbWVudHMgb2YgZGlmZmVyZW50IFBWJ3MsCitJJ3ZlIGFsc28gYWRkZWQgaW4gdGhlIGRldmljZSBtYWpvcjptaW5vciBhcyB0aGlzIHdpbGwgYmUgdXNlZnVsCitsYXRlcjoKKworKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCAgUFYxICAgICB8ICAgUFYyICAgfCAgIFBWMyAgfCAyNTQ6MworKy0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworCisKK05vdyBvdXIgaGVybyBkZWNpZGVzIHRvIFBWIG1vdmUgUFYyIHRvIFBWNDoKKworMS4gU3VzcGVuZCBvdXIgTFYgKDI1NDozKSwgdGhpcyBzdGFydHMgcXVldWVpbmcgYWxsIGlvLCBhbmQgZmx1c2hlcworICAgYWxsIHBlbmRpbmcgaW8uICBPbmNlIHRoZSBzdXNwZW5kIGhhcyBjb21wbGV0ZWQgd2UgYXJlIGZyZWUgdG8gY2hhbmdlCisgICB0aGUgbWFwcGluZyB0YWJsZS4KKworMi4gU2V0IHVwICphbm90aGVyKiAoMjU0OjQpIGRldmljZSB3aXRoIHRoZSBtYXBwaW5nIHRhYmxlIG9mIG91ciBMVi4KKworMy4gTG9hZCBhIG5ldyBtYXBwaW5nIHRhYmxlIGludG8gKDI1NDozKSB0aGF0IGhhcyBpZGVudGl0eSB0YXJnZXRzIGZvcgorICAgcGFydHMgdGhhdCBhcmVuJ3QgbW92aW5nLCBhbmQgYSBtaXJyb3IgdGFyZ2V0IGZvciBwYXJ0cyB0aGF0IGFyZS4KKworNC4gVW5zdXNwZW5kICgyNTQ6MykKKworU28gbm93IHdlIGhhdmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiBjb3B5CisgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tPi0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArIC0tLS0tLS0tLS0tKworfCBJZGVudGl0eSB8IG1pcnJvciAgfCBJZGVudC4gfCAyNTQ6MyAgICAgICAgIHwgICAgUFY0ICAgICB8CisrLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgfCAgICAgICAgIHwgICAgICAgICB8CisgICAgIFwvICAgICAgICBcLyAgICAgICAgXC8KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgIFBWMSAgICAgfCAgIFBWMiAgIHwgICBQVjMgIHwgMjU0OjQKKystLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKworQW55IHdyaXRlcyB0byBzZWdtZW50MiBvZiB0aGUgTFYgZ2V0IGludGVyY2VwdGVkIGJ5IHRoZSBtaXJyb3IgdGFyZ2V0Cit3aG8gY2hlY2tzIHRoYXQgdGhhdCBjaHVuayBoYXMgYmVlbiBjb3BpZWQgdG8gdGhlIG5ldyBkZXN0aW5hdGlvbiwgaWYKK2l0IGhhc24ndCBpdCBxdWV1ZXMgdGhlIGluaXRpYWwgY29weSBhbmQgZGVmZXJzIHRoZSBjdXJyZW50IGlvIHVudGlsCitpdCBoYXMgZmluaXNoZWQuICBUaGVuIHRoZSBjdXJyZW50IGlvIGlzIHdyaXR0ZW4gdG8gKmJvdGgqIFBWMiBhbmQgdGhlCitQVjQuCisKKzUuIFdoZW4gdGhlIGNvcHlpbmcgaGFzIGNvbXBsZXRlZCAyNTQ6MyBpcyBzdXNwZW5kZWQvcGVuZGluZyBmbHVzaGVkLgorCis2LiAyNTQ6NCBpcyB0YWtlbiBkb3duCisKKzcuIG1ldGFkYXRhIGlzIHVwZGF0ZWQgb24gZGlzaworCis4LiAyNTQ6MyBoYXMgbmV3IG1hcHBpbmcgdGFibGUgbG9hZGVkOgorCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8ICBQVjEgICAgIHwgICBQVjQgICB8ICAgUFYzICB8IDI1NDozCisrLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9kb2MvdGFnZ2luZy50eHQgYi9kb2MvdGFnZ2luZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2ZTBlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90YWdnaW5nLnR4dApAQCAtMCwwICsxLDE2NSBAQAorVGFnZ2luZyBhaW1zCis9PT09PT09PT09PT0KKyAgMSkgQWJpbGl0eSB0byBhdHRhY2ggYW4gdW5vcmRlcmVkIGxpc3Qgb2YgdGFncyB0byBMVk0gbWV0YWRhdGEgb2JqZWN0cy4KKyAgMikgQWJpbGl0eSB0byBhZGQgb3IgcmVtb3ZlIHRhZ3MgZWFzaWx5LgorICAzKSBBYmlsaXR5IHRvIHNlbGVjdCBMVk0gb2JqZWN0cyBmb3IgcHJvY2Vzc2luZyBhY2NvcmRpbmcgdG8gcHJlc2VuY2UvYWJzZW5jZQorICAgICBvZiBzcGVjaWZpYyB0YWdzLgorICA0KSBBYmlsaXR5IHRvIGNvbnRyb2wgdGhyb3VnaCB0aGUgY29uZmlnIGZpbGUgd2hpY2ggVkdzL0xWcyBhcmUgYWN0aXZhdGVkIAorICAgICBvbiBkaWZmZXJlbnQgbWFjaGluZXMgdXNpbmcgbmFtZXMgb3IgdGFncy4KKyAgNSkgQWJpbGl0eSB0byBvdmVybGF5IHNldHRpbmdzIGZyb20gZGlmZmVyZW50IGNvbmZpZyBmaWxlcyBlLmcuIG92ZXJyaWRlCisgICAgIHNvbWUgc2V0dGluZ3MgaW4gYSBnbG9iYWwgY29uZmlnIGZpbGUgbG9jYWxseS4KKworQ2xhcmlmaWNhdGlvbnMKKz09PT09PT09PT09PT09CisgIDEpIFRhZyBjaGFyYWN0ZXIgc2V0OiBBLVphLXowLTlfKy4tIAorICAgICBDYW4ndCBzdGFydCB3aXRoIGh5cGhlbiAmIG1heCBsZW5ndGggaXMgMTI4IChOQU1FX0xFTikuCisgIDIpIExWTSBvYmplY3QgdHlwZXMgdGhhdCBjYW4gYmUgdGFnZ2VkOgorICAgICAgIFZHLCBMViwgTFYgc2VnbWVudAorICAgICAgIFBWIC0gdGFncyBhcmUgc3RvcmVkIGluIFZHIG1ldGFkYXRhIHNvIGRpc2FwcGVhciB3aGVuIFBWIGJlY29tZXMgb3JwaGFuZWQKKyAgICAgU25hcHNob3RzIGNhbid0IGJlIHRhZ2dlZCwgYnV0IHRoZWlyIG9yaWdpbiBtYXkgYmUuCisgIDMpIEEgdGFnIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFueSBjb21tYW5kIGxpbmUgTFZNIG9iamVjdCByZWZlcmVuY2UgdGhhdAorICAgICBhY2NlcHRzIChhKSBhIGxpc3Qgb2Ygb2JqZWN0czsgb3IgKGIpIGEgc2luZ2xlIG9iamVjdCBhcyBsb25nIGFzIHRoZQorICAgICB0YWcgZXhwYW5kcyB0byBhIHNpbmdsZSBvYmplY3QuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZSB5ZXQuCisgICAgIER1cGxpY2F0ZSBhcmd1bWVudHMgaW4gYSBsaXN0IGFmdGVyIGFyZ3VtZW50IGV4cGFuc2lvbiBtYXkgZ2V0IHJlbW92ZWQgCisgICAgIHJldGFpbmluZyB0aGUgZmlyc3QgY29weSBvZiBlYWNoIGFyZ3VtZW50LgorICA0KSBXaGVyZXZlciB0aGVyZSBtYXkgYmUgYW1iaWd1aXR5IG9mIGFyZ3VtZW50IHR5cGUsIGEgdGFnIG11c3QgYmUgcHJlZml4ZWQgCisgICAgIGJ5ICdAJzsgZWxzZXdoZXJlIGFuICdAJyBwcmVmaXggaXMgb3B0aW9uYWwuCisgIDUpIExWTTEgb2JqZWN0cyBjYW5ub3QgYmUgdGFnZ2VkLCBhcyB0aGUgZGlzayBmb3JtYXQgZG9lc24ndCBzdXBwb3J0IGl0LgorICA2KSBUYWdzIGNhbiBiZSBhZGRlZCBvciByZW1vdmVkIHdpdGggLS1hZGR0YWcgb3IgLS1kZWx0YWcuCisKK0NvbmZpZyBmaWxlIEV4dGVuc2lvbnMKKz09PT09PT09PT09PT09PT09PT09PT0KKyAgVG8gZGVmaW5lIGhvc3QgdGFncyBpbiBjb25maWcgZmlsZToKKworICB0YWdzIHsKKyAgCSMgU2V0IGEgdGFnIHdpdGggdGhlIGhvc3RuYW1lCisJaG9zdHRhZ3MgPSAxCisKKwl0YWcxIHsgfQorCisgIAl0YWcyIHsKKwkJIyBJZiBubyBleGFjdCBtYXRjaCwgdGFnIGlzIG5vdCBzZXQuCisJCWhvc3RfbGlzdCA9IFsgImhvc3RuYW1lIiwgImRiYXNlIiBdCisJfQorICB9CisKK0FjdGl2YXRpb24gY29uZmlnIGZpbGUgZXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIGFjdGl2YXRpb24geworICAgICAgdm9sdW1lX2xpc3QgPSBbICJ2ZzEvbHZvbDAiLCAiQGRhdGFiYXNlIiBdCisgIH0KKworICBNYXRjaGVzIGFnYWluc3QgdmduYW1lLCB2Z25hbWUvbHZuYW1lIG9yIEB0YWcgc2V0IGluICptZXRhZGF0YSouCisgIEAqIG1hdGNoZXMgZXhhY3RseSBhZ2FpbnN0ICphbnkqIHRhZyBzZXQgb24gdGhlIGhvc3QuCisgIFRoZSBWRyBvciBMViBvbmx5IGdldHMgYWN0aXZhdGVkIGlmIGEgbWV0YWRhdGEgdGFnIG1hdGNoZXMuCisgIFRoZSBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vIG1hdGNoIGlzIG5vdCB0byBhY3RpdmF0ZS4KKyAgSWYgdm9sdW1lX2xpc3QgaXMgbm90IHByZXNlbnQgYW5kIGFueSB0YWdzIGFyZSBkZWZpbmVkIG9uIHRoZSBob3N0IAorICB0aGVuIGl0IG9ubHkgYWN0aXZhdGVzIGlmIGEgaG9zdCB0YWcgbWF0Y2hlcyBhIG1ldGFkYXRhIHRhZy4KKyAgSWYgdm9sdW1lX2xpc3QgaXMgbm90IHByZXNlbnQgYW5kIG5vIHRhZ3MgYXJlIGRlZmluZWQgb24gdGhlIGhvc3QgCisgIHRoZW4gaXQgZG9lcyBhY3RpdmF0ZS4KKworTXVsdGlwbGUgY29uZmlnIGZpbGVzCis9PT09PT09PT09PT09PT09PT09PT0KKyAgKGEpIGx2bS5jb25mCisgIChiKSBsdm1fPGhvc3RfdGFnPi5jb25mCisKKyAgQXQgc3RhcnR1cCwgbG9hZCBsdm0uY29uZi4KKyAgUHJvY2VzcyB0YWcgc2V0dGluZ3MuCisgIElmIGFueSBob3N0IHRhZ3Mgd2VyZSBkZWZpbmVkLCBsb2FkIGx2bV90YWcuY29uZiBmb3IgZWFjaCB0YWcsIGlmIHByZXNlbnQuCisKKyAgV2hlbiBzZWFyY2hpbmcgZm9yIGEgc3BlY2lmaWMgY29uZmlnIGZpbGUgZW50cnksIHNlYXJjaCBvcmRlciBpcyAoYikKKyAgdGhlbiAoYSksIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBtYXRjaC4gIAorICBXaXRoaW4gKGIpIHVzZSByZXZlcnNlIG9yZGVyIHRhZ3MgZ290IHNldCwgc28gZmlsZSBmb3IgbGFzdCB0YWcgc2V0IGlzCisgIHNlYXJjaGVkIGZpcnN0LgorICBOZXcgdGFncyBzZXQgaW4gKGIpICpkbyogdHJpZ2dlciBhZGRpdGlvbmFsIGNvbmZpZyBmaWxlIGxvYWRzLiAKKworVXNhZ2UgRXhhbXBsZXMKKz09PT09PT09PT09PT09CisgIDEpIFNpbXBsZSBhY3RpdmF0aW9uIGNvbnRyb2wgdmlhIG1ldGFkYXRhIHdpdGggc3RhdGljIGNvbmZpZyBmaWxlcworCisgIGx2bS5jb25mOiAgKElkZW50aWNhbCBvbiBldmVyeSBtYWNoaW5lIC0gZ2xvYmFsIHNldHRpbmdzKQorICAgIHRhZ3MgeworICAgICAgaG9zdHRhZ3MgPSAxCisgICAgfQorCisgIEZyb20gYW55IG1hY2hpbmUgaW4gdGhlIGNsdXN0ZXIsIGFkZCBkYjEgdG8gdGhlIGxpc3Qgb2YgbWFjaGluZXMgdGhhdAorICBhY3RpdmF0ZSB2ZzEvbHZvbDI6CisKKyAgbHZjaGFuZ2UgLS1hZGR0YWcgQGRiMSB2ZzEvbHZvbDIKKyAgKGZvbGxvd2VkIGJ5IGx2Y2hhbmdlIC1heSB0byBhY3R1YWxseSBhY3RpdmF0ZSBpdCkKKworCisgIDIpIE11bHRpcGxlIGhvc3RzLiAgCisKKyAgICBBY3RpdmF0ZSB2ZzEgb25seSBvbiB0aGUgZGF0YWJhc2UgaG9zdHMsIGRiMSBhbmQgZGIyLgorICAgIEFjdGl2YXRlIHZnMiBvbmx5IG9uIHRoZSBmaWxlc2VydmVyIGhvc3QgZnMxLgorICAgIEFjdGl2YXRlIG5vdGhpbmcgaW5pdGlhbGx5IG9uIHRoZSBmaWxlc2VydmVyIGJhY2t1cCBob3N0IGZzYjEsIGJ1dCBiZQorICAgIHByZXBhcmVkIGZvciBpdCB0byB0YWtlIG92ZXIgZnJvbSBmczEuCisKKyAgT3B0aW9uIChpKSAtIGNlbnRyYWxpc2VkIGFkbWluLCBzdGF0aWMgY29uZmlndXJhdGlvbiByZXBsaWNhdGVkIGJldHdlZW4gaG9zdHMgIAorICAgICMgQWRkIEBkYXRhYmFzZSB0YWcgdG8gdmcxJ3MgbWV0YWRhdGEKKyAgICB2Z2NoYW5nZSAtLWFkZHRhZyBAZGF0YWJhc2UgdmcxCisKKyAgICAjIEFkZCBAZmlsZXNlcnZlciB0YWcgdG8gdmcyJ3MgbWV0YWRhdGEKKyAgICB2Z2NoYW5nZSAtLWFkZHRhZyBAZmlsZXNlcnZlciB2ZzIKKworICAgIGx2bS5jb25mOiAgKElkZW50aWNhbCBvbiBldmVyeSBtYWNoaW5lKQorICAgICAgdGFncyB7CisgICAgICAgIGRhdGFiYXNlIHsKKyAgICAgICAgICBob3N0X2xpc3QgPSBbICJkYjEiLCAiZGIyIiBdCisgICAgICAgIH0KKyAgICAgICAgZmlsZXNlcnZlciB7CisJICBob3N0X2xpc3QgPSBbICJmczEiIF0KKyAgICAgICAgfQorICAgICAgICBmaWxlc2VydmVyYmFja3VwIHsKKyAgICAgICAgICBob3N0X2xpc3QgPSBbICJmc2IxIiBdCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYWN0aXZhdGlvbiB7CisgICAgICAgICMgT25seSBhY3RpdmF0ZSBpZiBob3N0IGhhcyBhIHRhZyB0aGF0IG1hdGNoZXMgYSBtZXRhZGF0YSB0YWcKKyAgICAgICAgdm9sdW1lX2xpc3QgPSBbICJAKiIgXQorICAgICAgfQorICAKKyAgSW4gdGhlIGV2ZW50IG9mIHRoZSBmaWxlc2VydmVyIGhvc3QgZ29pbmcgZG93biwgdmcyIGNhbiBiZSBicm91Z2h0IHVwCisgIG9uIGZzYjEgYnkgcnVubmluZyAqb24gYW55IG5vZGUqICd2Z2NoYW5nZSAtLWFkZHRhZyBAZmlsZXNlcnZlcmJhY2t1cCB2ZzInCisgIGZvbGxvd2VkIGJ5ICd2Z2NoYW5nZSAtYXkgdmcyJworICAKKyAgCisgIE9wdGlvbiAoaWkpIC0gbG9jYWxpc2VkIGFkbWluICYgY29uZmlndWF0aW9uCisgIChpLmUuIGVhY2ggaG9zdCBob2xkcyAqbG9jYWxseSogd2hpY2ggY2xhc3NlcyBvZiB2b2x1bWVzIHRvIGFjdGl2YXRlKQorICAgICMgQWRkIEBkYXRhYmFzZSB0YWcgdG8gdmcxJ3MgbWV0YWRhdGEKKyAgICB2Z2NoYW5nZSAtLWFkZHRhZyBAZGF0YWJhc2UgdmcxCisgIAorICAgICMgQWRkIEBmaWxlc2VydmVyIHRhZyB0byB2ZzIncyBtZXRhZGF0YQorICAgIHZnY2hhbmdlIC0tYWRkdGFnIEBmaWxlc2VydmVyIHZnMgorICAKKyAgICBsdm0uY29uZjogIChJZGVudGljYWwgb24gZXZlcnkgbWFjaGluZSAtIGdsb2JhbCBzZXR0aW5ncykKKyAgICAgIHRhZ3MgeworICAgICAgICBob3N0dGFncyA9IDEKKyAgICAgIH0KKyAgCisgICAgbHZtX2RiMS5jb25mOiAob25seSBuZWVkcyB0byBiZSBvbiBkYjEgLSBjb3VsZCBiZSBzeW1saW5rIHRvIGx2bV9kYi5jb25mKQorICAgICAgYWN0aXZhdGlvbiB7CisgICAgICAgIHZvbHVtZV9saXN0ID0gWyAiQGRhdGFiYXNlIiBdCisgICAgICB9CisgIAorICAgIGx2bV9kYjIuY29uZjogKG9ubHkgbmVlZHMgdG8gYmUgb24gZGIyIC0gY291bGQgYmUgc3ltbGluayB0byBsdm1fZGIuY29uZikKKyAgICAgIGFjdGl2YXRpb24geworICAgICAgICB2b2x1bWVfbGlzdCA9IFsgIkBkYXRhYmFzZSIgXQorICAgICAgfQorICAKKyAgICBsdm1fZnMxLmNvbmY6IChvbmx5IG5lZWRzIHRvIGJlIG9uIGZzMSAtIGNvdWxkIGJlIHN5bWxpbmsgdG8gbHZtX2ZzLmNvbmYpCisgICAgICBhY3RpdmF0aW9uIHsKKyAgICAgICAgdm9sdW1lX2xpc3QgPSBbICJAZmlsZXNlcnZlciIgXQorICAgICAgfQorICAKKyAgICBJZiBmaWxlc2VydmVyIGdvZXMgZG93biwgdG8gYnJpbmcgYSBzcGFyZSBtYWNoaW5lIGZzYjEgaW4gYXMgZmlsZXNlcnZlciwKKyAgICBjcmVhdGUgbHZtX2ZzYjEuY29uZiBvbiBmc2IxIChvciBzeW1saW5rIHRvIGx2bV9mcy5jb25mKToKKworICAgICAgYWN0aXZhdGlvbiB7CisgICAgICAgIHZvbHVtZV9saXN0ID0gWyAiQGZpbGVzZXJ2ZXIiIF0KKyAgICAgIH0KKworICAgIGFuZCBydW4gJ3ZnY2hhbmdlIC1heSB2ZzInIG9yICd2Z2NoYW5nZSAtYXkgQGZpbGVzZXJ2ZXInCisKZGlmZiAtLWdpdCBhL2RvYy90ZXN0aW5nLnR4dCBiL2RvYy90ZXN0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQ0MzVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rlc3RpbmcudHh0CkBAIC0wLDAgKzEsNDEgQEAKK0hlcmUncyBob3cgSSB0ZXN0IG5ldyBMVk0yIGJ1aWxkcyB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIHN0YWJsZQorTFZNMiB0aGF0IGlzIHJ1bm5pbmcgdGhlIExWJ3Mgb24gbXkgZGV2ZWxvcG1lbnQgYm94LgorCisxKSBDcmVhdGUgYSBzZXQgb2YgbG9vcGJhY2sgZGV2aWNlcy4KKworMikgQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSB0byBjb250YWluIHRoZSBMVk0yIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yCisgICB0aGlzIHNldHVwLiAgKEkgdXNlIC9ldGMvbHZtX2xvb3BzKQorCiszKSBXcml0ZSBhIHN1aXRhYmxlIGx2bS5jb25mIGZpbGUsIHRoaXMgZ29lcyBpbiB0aGUgZGlyZWN0b3J5IHlvdSBqdXN0CisgICBjcmVhdGVkLiAgZWcsIG15IC9ldGMvbHZtX2xvb3BzL2x2bS5jb25mIGxvb2tzIGxpa2U6CisKKyAgIGxvZyB7CisgICAgICAgIGZpbGU9Ii90bXAvbHZtMl9sb29wLmxvZyIKKyAgICAgICAgbGV2ZWw9OQorICAgICAgICB2ZXJib3NlPTAKKyAgICAgICAgb3ZlcndyaXRlPTEKKyAgIH0KKworICAgZGV2aWNlcyB7CisgICAgICAgIHNjYW4gPSAiL2RldiIKKyAgICAgICAgZmlsdGVyID0gWyJhL2xvb3AvIiwgInIvLiovIl0KKyAgIH0KKworCisgICBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIG5vdGUgaXMgdGhlIGRldmljZXMgc2VjdGlvbiB3aGljaCBtYWtlcyBzdXJlCisgICB0aGF0IG9ubHkgdGhlIGxvb3BiYWNrIGRldmljZXMgYXJlIGNvbnNpZGVyZWQgZm9yIExWTTIgb3BlcmF0aW9ucy4KKworNCkgV2hlbiB5b3Ugd2FudCB0byB1c2UgdGhpcyB0ZXN0IHNldHVwIGp1c3Qgc2V0IHRoZSBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgTFZNX1NZU1RFTV9ESVIgdG8gcG9pbnQgdG8geW91ciBjb25maWcgZGlyZWN0b3J5CisgICAoL2V0Yy9sdm1fbG9vcHMgaW4gbXkgY2FzZSkuCisKKzUpIEl0J3MgYSBnb29kIGlkZWEgdG8gZG8gYSB2Z3NjYW4gdG8gaW5pdGlhbGlzZSB0aGUgZmlsdGVyczoKKworICAgZXhwb3J0IExWTV9TWVNURU1fRElSPS9ldGMvbHZtX2xvb3BzCisgICAuL2x2bSB2Z3NjYW4KKworICAgd2hlcmUgLi9sdm0gaXMgdGhlIG5ldyBidWlsZCBvZiBMVk0yIHRoYXQgSSdtIHRyeWluZyBvdXQuCisKKzcpIFRlc3QgYXdheS4gIE1ha2Ugc3VyZSB0aGF0IHlvdSBhcmUgZXhwbGljaXQgYWJvdXQgd2hpY2ggbHZtCisgICBleGVjdXRhYmxlIHlvdSB3YW50IHRvIGV4ZWN1dGUgKGVnLCAuL2x2bSBpZiB5b3UgYXJlIGluCisgICBMVk0yL3Rvb2xzKS4KZGlmZiAtLWdpdCBhL2RvYy91ZGV2X2Fzc2VtYmx5LnR4dCBiL2RvYy91ZGV2X2Fzc2VtYmx5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg2NDAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZXZfYXNzZW1ibHkudHh0CkBAIC0wLDAgKzEsODMgQEAKK0F1dG9tYXRpYyBkZXZpY2UgYXNzZW1ibHkgYnkgdWRldgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlIHdhbnQgdG8gYXN5bmNocm9ub3VzbHkgYXNzZW1ibGUgYW5kIGFjdGl2YXRlIGRldmljZXMgYXMgdGhlaXIgY29tcG9uZW50cworYmVjb21lIGF2YWlsYWJsZS4gRXZlbnR1YWxseSwgdGhlIGNvbXBsZXRlIHN0b3JhZ2Ugc3RhY2sgc2hvdWxkIGJlIGNvdmVyZWQsCitpbmNsdWRpbmc6IG11bHRpcGF0aCwgY3J5cHRzZXR1cCwgTFZNLCBtZGFkbS4gRWFjaCBvZiB0aGVzZSBjYW4gYmUgYWRkcmVzc2VkCittb3JlIG9yIGxlc3Mgc2VwYXJhdGVseS4KKworVGhlIGdlbmVyYWwgcGxhbiBvZiBhY3Rpb24gaXMgdG8gc2ltcGx5IHByb3ZpZGUgdWRldiBydWxlcyBmb3IgZWFjaCBvZiB0aGUKK2RldmljZSAidHlwZSI6IGZvciBNRCBjb21wb25lbnQgZGV2aWNlcywgUFZzLCBMVUtTL2NyeXB0byB2b2x1bWVzIGFuZCBmb3IKK211bHRpcGF0aGVkIFNDU0kgZGV2aWNlcy4gVGhlcmUncyBubyBjb21wZWxsaW5nIHJlYXNvbiB0byBoYXZlIGEgZGFlbW9uIGRvIHRoZXNlCit0aGluZ3M6IGFsbCBzeXN0ZW1zIHRoYXQgYWN0dWFsbHkgbmVlZCB0byBhc3NlbWJsZSBtdWx0aXBsZSBkZXZpY2VzIGludG8gYQorc2luZ2xlIGVudGl0eSBhbHJlYWR5IGVpdGhlciBzdXBwb3J0IGluY3JlbWVudGFsIGFzc2VtYmx5IG9yIHdpbGwgZG8gc28gc2hvcnRseS4KKworV2hlbmV2ZXIgaW4gdGhpcyBkb2N1bWVudCB3ZSB0YWxrIGFib3V0IHVkZXYgcnVsZXMsIHRoZXNlIG1heSBpbmNsdWRlIGhlbHBlcgorcHJvZ3JhbXMgdGhhdCBpbXBsZW1lbnQgYSBtdWx0aS1zdGVwIHByb2Nlc3MuIEluIG1hbnkgY2FzZXMsIGl0IGNhbiBiZSBleHBlY3RlZAordGhhdCB0aGUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gY291cGxlIGxpbmVzIG9mIHNoZWxsIChvciBjb3VwbGUKK2h1bmRyZWQgb2YgQykuCisKK011bHRpcGF0aAorLS0tLS0tLS0tCisKK0ZvciBtdWx0aXBhdGgsIHdlIHdpbGwgbmVlZCB0byByZWx5IG9uIFNDU0kgSURzIGZvciBub3csIHVudGlsIHdlIGhhdmUgYSBiZXR0ZXIKK3NjaGVtZSBvZiB0aGluZ3MsIHNpbmNlIG11bHRpcGF0aCBkZXZpY2VzIGNhbid0IGJlIGlkZW50aWZpZWQgdW50aWwgdGhlIHNlY29uZAorcGF0aCBhcHBlYXJzLCBhbmQgdW5mb3J0dW5hdGVseSB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIGEgZGV2aWNlIGlzIG11bHRpcGF0aAord2hlbiB0aGUgKmZpcnN0KiBwYXRoIGFwcGVhcnMuIEFueXdheSwgdGhlIG11bHRpcGF0aCBmb2xrcyBuZWVkIHRvIHNvcnQgdGhpcworb3V0LCBidXQgaXQgc2hvdWxkbid0IGJlZSB0b28gaGFyZC4gSnVzdCBicmluZyB1cCBtdWx0aXBhdGhpbmcgb24gYW55dGhpbmcgdGhhdAorYXBwZWFycyBhbmQgaXMgc2V0IHVwIGZvciBtdWx0aXBhdGhpbmcuCisKK0xWTQorLS0tCisKK0ZvciBMVk0sIHRoZSBjcnVjaWFsIHBpZWNlIG9mIHRoZSBwdXp6bGUgaXMgbHZtZXRhZCwgd2hpY2ggYWxsb3dzIHVzIHRvIGJ1aWxkIHVwCitWR3MgZnJvbSBQVnMgYXMgdGhleSBhcHBlYXIsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIGNvbGxlY3QgaW5mb3JtYXRpb24gb24gd2hhdCBpcworYWxyZWFkeSBhdmFpbGFibGUuIEEgY29tbWFuZCwgcHZzY2FuIC0tY2FjaGUgaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCB0bworaW1wbGVtZW50IHVkZXYgcnVsZXMuIEl0IGlzIHJlbGF0aXZlbHkgZWFzeSB0byBtYWtlIHRoaXMgY29tbWFuZCBwcmludCBvdXQgYQorbGlzdCBvZiBWR3MgKGFuZCBwb3NzaWJseSBMVnMpIHRoYXQgaGF2ZSBiZWVuIG1hZGUgYXZhaWxhYmxlIGJ5IGFkZGluZyBhbnkKK3BhcnRpY3VsYXIgZGV2aWNlIHRvIHRoZSBzZXQgb2YgdmlzaWJsZSBkZXZpY2VzLiBJbiBvdGhlIHdvcmRzLCB1ZGV2IHNheXMgImhleSwKKy9kZXYvc2RiIGp1c3QgYXBwZWFyZWQiLCBjYWxscyBwdnNjYW4gLS1jYWNoZSwgd2hpY2ggdGFsa3MgdG8gbHZtZXRhZCwgd2hpY2gKK3NheXMgImNvb2wsIHRoYXQgbWFrZXMgdmcwIGNvbXBsZXRlIi4gUHZzY2FuIHRha2VzIHRoaXMgaW5mbyBhbmQgcHJpbnRzIGl0IG91dCwKK2FuZCB0aGUgdWRldiBydWxlIGNhbiB0aGVuIHNvbWVob3cgZGVjaWRlIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gYmUgZG9uZQorYWJvdXQgdGhpcyAidmcwIi4gUHJlc3VtYWJseSBhIHRhYmxlIG9mIGRldmljZXMgdGhhdCBuZWVkIHRvIGJlIGFjdGl2YXRlZAorYXV0b21hdGljYWxseSBpcyBtYWRlIGF2YWlsYWJsZSBzb21ld2hlcmUgaW4gL2V0YyAocHJvYmFibHkganVzdCBhIHNpbXBsZSBsaXN0CitvZiB2b2x1bWUgZ3JvdXBzIG9yIGxvZ2ljYWwgdm9sdW1lcywgZ2l2ZW4gYnkgbmFtZSBvciBVVUlELCBnbG9iYmluZworcG9zc2libGUpLiBUaGUgdWRldiBydWxlIGNhbiB0aGVuIGNvbnN1bHQgdGhpcyBmaWxlLgorCitDcnlwdHNldHVwCistLS0tLS0tLS0tCisKK1RoaXMgbWF5IGJlIHRoZSB0cmlja2llc3Qgb2YgdGhlIGxvdDogdGhlIG9idmlvdXMgaHVyZGxlIGhlcmUgaXMgdGhhdCBjcnlwdG8KK3ZvbHVtZXMgbmVlZCB0byBzb21laG93IG9idGFpbiBhIGtleSAocGFzc3BocmFzZSwgcGh5c2ljYWwgdG9rZW4gb3Igc3VjaCksCittZWFuaW5nIHRoZXJlIGlzIGludGVyYWN0aXZpdHkgaW52b2x2ZWQuIE9uIHRoZSB1cHNpZGUsIGRtLWNyeXB0IGlzIGEgMToxCitzeXN0ZW06IG9uZSBlbmNyeXB0ZWQgZGV2aWNlIHJlc3VsdHMgaW4gb25lIGRlY3J5cHRlZCBkZXZpY2UsIHNvIG5vIGFzc2VtYmx5IG9yCitub3RpZmljYXRpb24gbmVlZHMgdG8gYmUgZG9uZS4gV2hpbGUgaW50ZXJhY3Rpdml0eSBpcyBhIGNoYWxsZW5nZSwgdGhlcmUgYXJlIGF0CitsZWFzdCBwYXJ0aWFsIHNvbHV0aW9ucyBhcm91bmQuIChUT0RPOiBNaWxhbiBzaG91bGQgcHJvYmFibHkgZWxhYm9yYXRlIGhlcmUuKQorCisoRm9yIExVS1MgZGV2aWNlcywgdGhlc2UgY2FuIHByb2JhYmx5IGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuIEkgc3VwcG9zZSB0aGF0Citub24tTFVLUyBkZXZpY2VzIGNhbiBiZSBsb29rZWQgdXAgaW4gY3J5cHR0YWIgYnkgdGhlIHJ1bGUsIHRvIGRlY2lkZSB3aGF0IGlzIHRoZQorYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UuKQorCitNRAorLS0KKworRm9ydHVuYXRlbHksIE1EIChuYW1lbHkgbWRhZG0pIGFscmVhZHkgY29tZXMgd2l0aCBhIG1lY2hhbmlzbSBmb3IgaW5jcmVtZW50YWwKK2Fzc2VtYmx5IChtZGFkbSAtSSBvciBzdWNoKS4gV2UgY2FuIGFzc3VtZSB0aGF0IHRoaXMgZml0cyB3aXRoIHRoZSByZXN0IG9mIHN0YWNrCituaWNlbHkuCisKKworRmlsZXN5c3RlbSAmYy4gZGlzY292ZXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29uc2lkZXJpbmcgb3RoZXIgcmVxdWlyZW1lbnRzIHRoYXQgZXhpc3QgZm9yIHN0b3JhZ2Ugc3lzdGVtcyAobmFtZWx5CitsYXJnZS1zY2FsZSBzdG9yYWdlIGRlcGxveW1lbnRzKSwgaXQgaXMgYWJzb2x1dGVseSBub3QgZmVhc2libGUgdG8gaGF2ZSB0aGUKK3N5c3RlbSBodW50IGF1dG9tYXRpY2FsbHkgZm9yIGZpbGVzeXN0ZW1zIGJhc2VkIG9uIHRoZWlyIFVVSURzLiBJbiBhIG51bWJlciBvZgorY2FzZXMsIHRoaXMgY291bGQgbWVhbiBhY3RpdmF0aW5nIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHZvbHVtZXMuIE9uIHNtYWxsCitzeXN0ZW1zLCBhc2tpbmcgZm9yIGFsbCB2b2x1bWVzIHRvIGJlIGJyb3VnaHQgdXAgYXV0b21hdGljYWxseSBpcyBwcm9iYWJseSB0aGUKK2Jlc3Qgcm91dGUgYW55d2F5LCBhbmQgb25jZSBhbGwgc3RvcmFnZSBkZXZpY2VzIGFyZSBhY3RpdmF0ZWQsIHNjYW5uaW5nIGZvcgorZmlsZXN5c3RlbXMgaXMgbm8gZGlmZmVyZW50IGZyb20gdG9kYXkuCisKK0luIGVmZmVjdCwgbm8gYWN0aW9uIGlzIHJlcXVpcmVkIG9uIHRoaXMgY291bnQ6IG9ubHkgZmlsZXN5c3RlbXMgdGhhdCBhcmUKK2F2YWlsYWJsZSBvbiBhbHJlYWR5IGFjdGl2ZSBkZXZpY2VzIGNhbiBiZSBtb3VudGVkIGJ5IHRoZWlyIFVVSUQuIEFjdGl2YXRpbmcKK3ZvbHVtZXMgYnkgbmFtaW5nIGEgZmlsZXN5c3RlbSBVVUlEIGlzIHVzZWxlc3MsIHNpbmNlIHRvIHJlYWQgdGhlIFVVSUQgdGhlCit2b2x1bWUgbmVlZHMgdG8gYmUgYWN0aXZlIGZpcnN0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS8uZ2l0aWdub3JlIGIvaW5jbHVkZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NzFlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACisuc3ltbGlua3MKKy5zeW1saW5rc19jcmVhdGVkCisKKyouaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS8uc3ltbGlua3MuaW4gYi9pbmNsdWRlLy5zeW1saW5rcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNjODI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS8uc3ltbGlua3MuaW4KQEAgLTAsMCArMSw3OCBAQAorQHRvcF9zcmNkaXJAL2RhZW1vbnMvY2x2bWQvY2x2bS5oCitAdG9wX3NyY2RpckAvZGFlbW9ucy9kbWV2ZW50ZC9saWJkZXZtYXBwZXItZXZlbnQuaAorQHRvcF9zcmNkaXJAL2RhZW1vbnMvbHZtZXRhZC9sdm1ldGFkLWNsaWVudC5oCitAdG9wX3NyY2RpckAvZGFlbW9ucy9sdm1sb2NrZC9sdm1sb2NrZC1jbGllbnQuaAorQHRvcF9zcmNkaXJAL2RhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQtcHJvdG9jb2wuaAorQHRvcF9zcmNkaXJAL2RhZW1vbnMvbHZtcG9sbGQvcG9sbGluZ19vcHMuaAorQHRvcF9zcmNkaXJAL2xpYi9hY3RpdmF0ZS9hY3RpdmF0ZS5oCitAdG9wX3NyY2RpckAvbGliL2FjdGl2YXRlL3RhcmdldHMuaAorQHRvcF9zcmNkaXJAL2xpYi9jYWNoZS9sdm1jYWNoZS5oCitAdG9wX3NyY2RpckAvbGliL2NhY2hlL2x2bWV0YWQuaAorQHRvcF9zcmNkaXJAL2xpYi9jb21tYW5kcy90b29sY29udGV4dC5oCitAdG9wX3NyY2RpckAvbGliL2NvbmZpZy9jb25maWcuaAorQHRvcF9zcmNkaXJAL2xpYi9jb25maWcvY29uZmlnX3NldHRpbmdzLmgKK0B0b3Bfc3JjZGlyQC9saWIvY29uZmlnL2RlZmF1bHRzLmgKK0B0b3Bfc3JjZGlyQC9saWIvZGF0YXN0cnVjdC9idHJlZS5oCitAdG9wX3NyY2RpckAvbGliL2RhdGFzdHJ1Y3Qvc3RyX2xpc3QuaAorQHRvcF9zcmNkaXJAL2xpYi9kZXZpY2UvZGV2LWNhY2hlLmgKK0B0b3Bfc3JjZGlyQC9saWIvZGV2aWNlL2Rldi1leHQtdWRldi1jb25zdGFudHMuaAorQHRvcF9zcmNkaXJAL2xpYi9kZXZpY2UvZGV2LXR5cGUuaAorQHRvcF9zcmNkaXJAL2xpYi9kZXZpY2UvZGV2aWNlLXR5cGVzLmgKK0B0b3Bfc3JjZGlyQC9saWIvZGV2aWNlL2RldmljZS5oCitAdG9wX3NyY2RpckAvbGliL2Rpc3BsYXkvZGlzcGxheS5oCitAdG9wX3NyY2RpckAvbGliL2ZpbHRlcnMvZmlsdGVyLmgKK0B0b3Bfc3JjZGlyQC9saWIvZm9ybWF0MS9mb3JtYXQxLmgKK0B0b3Bfc3JjZGlyQC9saWIvZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuaAorQHRvcF9zcmNkaXJAL2xpYi9mb3JtYXRfdGV4dC9hcmNoaXZlci5oCitAdG9wX3NyY2RpckAvbGliL2Zvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmgKK0B0b3Bfc3JjZGlyQC9saWIvZm9ybWF0X3RleHQvdGV4dF9leHBvcnQuaAorQHRvcF9zcmNkaXJAL2xpYi9mb3JtYXRfdGV4dC90ZXh0X2ltcG9ydC5oCitAdG9wX3NyY2RpckAvbGliL2xhYmVsL2xhYmVsLmgKK0B0b3Bfc3JjZGlyQC9saWIvbG9ja2luZy9sb2NraW5nLmgKK0B0b3Bfc3JjZGlyQC9saWIvbG9ja2luZy9sdm1sb2NrZC5oCitAdG9wX3NyY2RpckAvbGliL2xvZy9sb2cuaAorQHRvcF9zcmNkaXJAL2xpYi9sb2cvbHZtLWxvZ2dpbmcuaAorQHRvcF9zcmNkaXJAL2xpYi9sdm1wb2xsZC9sdm1wb2xsZC1jbGllbnQuaAorQHRvcF9zcmNkaXJAL2xpYi9sdm1wb2xsZC9wb2xsZGFlbW9uLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWV0YWRhdGEvbHYuaAorQHRvcF9zcmNkaXJAL2xpYi9tZXRhZGF0YS9sdl9hbGxvYy5oCitAdG9wX3NyY2RpckAvbGliL21ldGFkYXRhL21ldGFkYXRhLWV4cG9ydGVkLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWV0YWRhdGEvbWV0YWRhdGEuaAorQHRvcF9zcmNkaXJAL2xpYi9tZXRhZGF0YS9wdi5oCitAdG9wX3NyY2RpckAvbGliL21ldGFkYXRhL3B2X2FsbG9jLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWV0YWRhdGEvc2VndHlwZS5oCitAdG9wX3NyY2RpckAvbGliL21ldGFkYXRhL3ZnLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWlzYy9jcmMuaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL2ludGwuaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL2xhc3QtcGF0aC1jb21wb25lbnQuaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL2xpYi5oCitAdG9wX3NyY2RpckAvbGliL21pc2MvbHZtLWV4ZWMuaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL2x2bS1maWxlLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWlzYy9sdm0tZmxvY2suaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL2x2bS1nbG9iYWxzLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWlzYy9sdm0tcGVyY2VudC5oCitAdG9wX3NyY2RpckAvbGliL21pc2MvbHZtLXNpZ25hbC5oCitAdG9wX3NyY2RpckAvbGliL21pc2MvbHZtLXN0cmluZy5oCitAdG9wX3NyY2RpckAvbGliL21pc2MvbHZtLXdyYXBwZXJzLmgKK0B0b3Bfc3JjZGlyQC9saWIvbWlzYy9zaGFyZWRsaWIuaAorQHRvcF9zcmNkaXJAL2xpYi9taXNjL3V0aWwuaAorQHRvcF9zcmNkaXJAL2xpYi9tbS9tZW1sb2NrLmgKK0B0b3Bfc3JjZGlyQC9saWIvbW0veGxhdGUuaAorQHRvcF9zcmNkaXJAL2xpYi9ub3RpZnkvbHZtbm90aWZ5LmgKK0B0b3Bfc3JjZGlyQC9saWIvcHJvcGVydGllcy9wcm9wX2NvbW1vbi5oCitAdG9wX3NyY2RpckAvbGliL3JlcG9ydC9wcm9wZXJ0aWVzLmgKK0B0b3Bfc3JjZGlyQC9saWIvcmVwb3J0L3JlcG9ydC5oCitAdG9wX3NyY2RpckAvbGliL3V1aWQvdXVpZC5oCitAdG9wX3NyY2RpckAvbGliZGFlbW9uL2NsaWVudC9jb25maWctdXRpbC5oCitAdG9wX3NyY2RpckAvbGliZGFlbW9uL2NsaWVudC9kYWVtb24tY2xpZW50LmgKK0B0b3Bfc3JjZGlyQC9saWJkYWVtb24vY2xpZW50L2RhZW1vbi1pby5oCitAdG9wX3NyY2RpckAvbGliZG0vbGliZGV2bWFwcGVyLmgKK0B0b3Bfc3JjZGlyQC9saWJkbS9taXNjL2RtLWlvY3RsLmgKK0B0b3Bfc3JjZGlyQC9saWJkbS9taXNjL2RtLWxvZy11c2Vyc3BhY2UuaAorQHRvcF9zcmNkaXJAL2xpYmRtL21pc2MvZG0tbG9nZ2luZy5oCitAdG9wX3NyY2RpckAvbGliZG0vbWlzYy9kbWxpYi5oCitAdG9wX3NyY2RpckAvbGliZG0vbWlzYy9rZGV2X3QuaAorQHRvcF9zcmNkaXJAL2xpYmx2bS9sdm0yYXBwLmgKK0B0b3Bfc3JjZGlyQC9wby9wb2dlbi5oCitAdG9wX3NyY2RpckAvdG9vbHMvbHZtMmNtZC5oCitAdG9wX3NyY2RpckAvdG9vbHMvdG9vbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmluIGIvaW5jbHVkZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU3MWZkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDM5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2FsbDogLnN5bWxpbmtzX2NyZWF0ZWQKKworTElOS1MgOj0gJChzaGVsbCBmaW5kIC4gLW1heGRlcHRoIDEgLXR5cGUgbCkKKworLnN5bWxpbmtzX2NyZWF0ZWQ6IC5zeW1saW5rcworaWZuZXEgKCwkKGZpcnN0d29yZCAkKExJTktTKSkpCisJJChSTSkgJChMSU5LUykKK2VuZGlmCisJZm9yIGkgaW4gYGNhdCAkPGA7IGRvICQoTE5fUykgJCRpIDsgZG9uZQorCXRvdWNoICRACisKK3BvZmlsZTogYWxsCisKK2RldmljZS1tYXBwZXI6IGFsbAorCitjZmxvdzogYWxsCisKK0RJU1RDTEVBTl9UQVJHRVRTICs9IC5zeW1saW5rcyBjb25maWd1cmUuaCBsdm0tdmVyc2lvbi5oCitDTEVBTl9UQVJHRVRTICs9ICQoTElOS1MpIC5pbmNsdWRlX3N5bWxpbmtzIC5zeW1saW5rc19jcmVhdGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3VyZS5oLmluIGIvaW5jbHVkZS9jb25maWd1cmUuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQzYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWd1cmUuaC5pbgpAQCAtMCwwICsxLDgyMyBAQAorLyogaW5jbHVkZS9jb25maWd1cmUuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgdG8gdXNlIGxpYmJsa2lkIGRldGVjdGlvbiBvZiBzaWduYXR1cmVzIHdoZW4gd2lwaW5nLiAqLworI3VuZGVmIEJMS0lEX1dJUElOR19TVVBQT1JUCisKKy8qIFRoZSBwYXRoIHRvICdjYWNoZV9jaGVjaycsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBDQUNIRV9DSEVDS19DTUQKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIGV4dGVybmFsICdjYWNoZV9jaGVjaycgdG9vbCByZXF1aXJlcyB0aGUKKyAgIC0tY2xlYXItbmVlZHMtY2hlY2stZmxhZyBvcHRpb24gKi8KKyN1bmRlZiBDQUNIRV9DSEVDS19ORUVEU19DSEVDSworCisvKiBUaGUgcGF0aCB0byAnY2FjaGVfZHVtcCcsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBDQUNIRV9EVU1QX0NNRAorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIGNhY2hlLiAqLworI3VuZGVmIENBQ0hFX0lOVEVSTkFMCisKKy8qIFRoZSBwYXRoIHRvICdjYWNoZV9yZXBhaXInLCBpZiBhdmFpbGFibGUuICovCisjdW5kZWYgQ0FDSEVfUkVQQUlSX0NNRAorCisvKiBUaGUgcGF0aCB0byAnY2FjaGVfcmVzdG9yZScsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBDQUNIRV9SRVNUT1JFX0NNRAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgYGNsb3NlZGlyJyBmdW5jdGlvbiByZXR1cm5zIHZvaWQgaW5zdGVhZCBvZiBgaW50Jy4gKi8KKyN1bmRlZiBDTE9TRURJUl9WT0lECisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgY2x1c3RlcmVkIExWTSBsb2NraW5nLiAqLworI3VuZGVmIENMVVNURVJfTE9DS0lOR19JTlRFUk5BTAorCisvKiBQYXRoIHRvIGNsdm1kIGJpbmFyeS4gKi8KKyN1bmRlZiBDTFZNRF9QQVRICisKKy8qIFBhdGggdG8gY2x2bWQgcGlkZmlsZS4gKi8KKyN1bmRlZiBDTFZNRF9QSURGSUxFCisKKy8qIFBhdGggdG8gY21pcnJvcmQgcGlkZmlsZS4gKi8KKyN1bmRlZiBDTUlSUk9SRF9QSURGSUxFCisKKy8qIERlZmluZSB0byAwIHRvIGV4Y2x1ZGUgbGliU2FDa3B0LiAqLworI3VuZGVmIENNSVJST1JfSEFTX0NIRUNLUE9JTlQKKworLyogRGVmaW5lIHRvIG9uZSBvZiBgX2dldGI2NycsIGBHRVRCNjcnLCBgZ2V0YjY3JyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUAorICAgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYGFsbG9jYS5jJyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuCisgICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSB0byAxIGlmIHVzaW5nIGBhbGxvY2EuYycuICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogTmFtZSBvZiBkZWZhdWx0IG1ldGFkYXRhIGFyY2hpdmUgc3ViZGlyZWN0b3J5LiAqLworI3VuZGVmIERFRkFVTFRfQVJDSElWRV9TVUJESVIKKworLyogTmFtZSBvZiBkZWZhdWx0IG1ldGFkYXRhIGJhY2t1cCBzdWJkaXJlY3RvcnkuICovCisjdW5kZWYgREVGQVVMVF9CQUNLVVBfU1VCRElSCisKKy8qIE5hbWUgb2YgZGVmYXVsdCBtZXRhZGF0YSBjYWNoZSBzdWJkaXJlY3RvcnkuICovCisjdW5kZWYgREVGQVVMVF9DQUNIRV9TVUJESVIKKworLyogRGVmYXVsdCBkYXRhIGFsaWdubWVudC4gKi8KKyN1bmRlZiBERUZBVUxUX0RBVEFfQUxJR05NRU5UCisKKy8qIERlZmluZSBkZWZhdWx0IG5vZGUgY3JlYXRpb24gYmVoYXZpb3Igd2l0aCBkbXNldHVwIGNyZWF0ZSAqLworI3VuZGVmIERFRkFVTFRfRE1fQUREX05PREUKKworLyogRGVmaW5lIGRlZmF1bHQgbmFtZSBtYW5nbGluZyBiZWhhdmlvdXIgKi8KKyN1bmRlZiBERUZBVUxUX0RNX05BTUVfTUFOR0xJTkcKKworLyogRGVmYXVsdCBETSBydW4gZGlyZWN0b3J5LiAqLworI3VuZGVmIERFRkFVTFRfRE1fUlVOX0RJUgorCisvKiBEZWZhdWx0IHN5c3RlbSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4gKi8KKyN1bmRlZiBERUZBVUxUX0VUQ19ESVIKKworLyogRmFsbCBiYWNrIHRvIExWTTEgYnkgZGVmYXVsdCBpZiBkZXZpY2UtbWFwcGVyIGlzIG1pc3NpbmcgZnJvbSB0aGUga2VybmVsLgorICAgKi8KKyN1bmRlZiBERUZBVUxUX0ZBTExCQUNLX1RPX0xWTTEKKworLyogTmFtZSBvZiBkZWZhdWx0IGxvY2tpbmcgZGlyZWN0b3J5LiAqLworI3VuZGVmIERFRkFVTFRfTE9DS19ESVIKKworLyogRGVmYXVsdCBzZWd0eXBlIHVzZWQgZm9yIG1pcnJvciB2b2x1bWVzLiAqLworI3VuZGVmIERFRkFVTFRfTUlSUk9SX1NFR1RZUEUKKworLyogRGVmYXVsdCBkaXJlY3RvcnkgdG8ga2VlcCBQSUQgZmlsZXMgaW4uICovCisjdW5kZWYgREVGQVVMVF9QSURfRElSCisKKy8qIE5hbWUgb2YgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb2ZpbGUgc3ViZGlyZWN0b3J5LiAqLworI3VuZGVmIERFRkFVTFRfUFJPRklMRV9TVUJESVIKKworLyogRGVmYXVsdCBzZWd0eXBlIHVzZWQgZm9yIHJhaWQxMCB2b2x1bWVzLiAqLworI3VuZGVmIERFRkFVTFRfUkFJRDEwX1NFR1RZUEUKKworLyogRGVmYXVsdCBMVk0gcnVuIGRpcmVjdG9yeS4gKi8KKyN1bmRlZiBERUZBVUxUX1JVTl9ESVIKKworLyogRGVmaW5lIHRvIDAgdG8gcmVpbnN0YXRlIHRoZSBwcmUtMi4wMi41NCBoYW5kbGluZyBvZiB1bml0IHN1ZmZpeGVzLiAqLworI3VuZGVmIERFRkFVTFRfU0lfVU5JVF9DT05TSVNURU5DWQorCisvKiBEZWZhdWx0IHNlZ3R5cGUgdXNlZCBmb3Igc3BhcnNlIHZvbHVtZXMuICovCisjdW5kZWYgREVGQVVMVF9TUEFSU0VfU0VHVFlQRQorCisvKiBQYXRoIHRvIExWTSBzeXN0ZW0gZGlyZWN0b3J5LiAqLworI3VuZGVmIERFRkFVTFRfU1lTX0RJUgorCisvKiBVc2UgYmxraWQgd2lwaW5nIGJ5IGRlZmF1bHQuICovCisjdW5kZWYgREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HCisKKy8qIFVzZSBsdm1ldGFkIGJ5IGRlZmF1bHQuICovCisjdW5kZWYgREVGQVVMVF9VU0VfTFZNRVRBRAorCisvKiBVc2UgbHZtbG9ja2QgYnkgZGVmYXVsdC4gKi8KKyN1bmRlZiBERUZBVUxUX1VTRV9MVk1MT0NLRAorCisvKiBVc2UgbHZtcG9sbGQgYnkgZGVmYXVsdC4gKi8KKyN1bmRlZiBERUZBVUxUX1VTRV9MVk1QT0xMRAorCisvKiBEZWZpbmUgdG8gMSB0byBlbmFibGUgTFZNMiBkZXZpY2UtbWFwcGVyIGludGVyYWN0aW9uLiAqLworI3VuZGVmIERFVk1BUFBFUl9TVVBQT1JUCisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSB0aGUgZGV2aWNlLW1hcHBlciBldmVudCBkYWVtb24uICovCisjdW5kZWYgRE1FVkVOVEQKKworLyogUGF0aCB0byBkbWV2ZW50ZCBiaW5hcnkuICovCisjdW5kZWYgRE1FVkVOVERfUEFUSAorCisvKiBQYXRoIHRvIGRtZXZlbnRkIHBpZGZpbGUuICovCisjdW5kZWYgRE1FVkVOVERfUElERklMRQorCisvKiBEZWZpbmUgdG8gZW5hYmxlIGNvbXBhdCBwcm90b2NvbCAqLworI3VuZGVmIERNX0NPTVBBVAorCisvKiBEZWZpbmUgZGVmYXVsdCBncm91cCBmb3IgZGV2aWNlIG5vZGUgKi8KKyN1bmRlZiBETV9ERVZJQ0VfR0lECisKKy8qIERlZmluZSBkZWZhdWx0IG1vZGUgZm9yIGRldmljZSBub2RlICovCisjdW5kZWYgRE1fREVWSUNFX01PREUKKworLyogRGVmaW5lIGRlZmF1bHQgb3duZXIgZm9yIGRldmljZSBub2RlICovCisjdW5kZWYgRE1fREVWSUNFX1VJRAorCisvKiBEZWZpbmUgdG8gZW5hYmxlIGlvY3RscyBjYWxscyB0byBrZXJuZWwgKi8KKyN1bmRlZiBETV9JT0NUTFMKKworLyogTGlicmFyeSB2ZXJzaW9uICovCisjdW5kZWYgRE1fTElCX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BTEFSTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBgYWxsb2NhJywgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuCisgICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcnBhL2luZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9BUlBBX0lORVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzbS9ieXRlb3JkZXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9BU01fQllURU9SREVSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhc3NlcnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9BU1NFUlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0ZXhpdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BVEVYSVQKKworLyogRGVmaW5lIHRvIDEgaWYgY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBpcyBhdmFpbGFibGUuICovCisjdW5kZWYgSEFWRV9DQU5PTklDQUxJWkVfRklMRV9OQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIHdvcmtpbmcgYGNob3duJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NIT1dOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2xvY2tfZ2V0dGltZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y29yb3N5bmMvY21hcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0NPUk9TWU5DX0NNQVBfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvcm9zeW5jL2NvbmZkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0NPUk9TWU5DX0NPTkZEQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DVFlQRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgc3RyZXJyb3JfcicsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1NUUkVSUk9SX1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ESVJFTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgZG9uJ3QgaGF2ZSBgdnByaW50ZicgYnV0IGRvIGhhdmUgYF9kb3BybnQuJyAqLworI3VuZGVmIEhBVkVfRE9QUk5UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZHVwMicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9EVVAyCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9FUlJOT19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmxvYXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GTE9BVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm9yaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GT1JLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRydW5jYXRlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZUUlVOQ0FURQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RuYW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEhPU1ROQU1FCisKKy8qIERlZmluZSB0byAxIGlmIGdldGxpbmUgaXMgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfR0VUTElORQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG1udGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRNTlRFTlQKKworLyogRGVmaW5lIHRvIDEgaWYgZ2V0b3B0X2xvbmcgaXMgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfR0VUT1BUTE9ORworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGdldG9wdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0dFVE9QVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGFuZ2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MQU5HSU5GT19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliY21hbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQkNNQU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiBkeW5hbWljIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfTElCREwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJkbG0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSUJETE1fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmdlbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQkdFTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliaW50bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQklOVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB1ZGV2X2RldmljZV9nZXRfaXNfaW5pdGlhbGl6ZWQgaXMgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfTElCVURFVl9VREVWX0RFVklDRV9HRVRfSVNfSU5JVElBTElaRUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2ZpZW1hcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0ZJRU1BUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvZnMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU5VWF9GU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvbWFnaWMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU5VWF9NQUdJQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTE9DQUxFX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2NhbHRpbWVfcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9MT0NBTFRJTUVfUgorCisvKiBEZWZpbmUgdG8gMSBpZiBgbHN0YXQnIGhhcyB0aGUgYnVnIHRoYXQgaXQgc3VjY2VlZHMgd2hlbiBnaXZlbiB0aGUKKyAgIHplcm8tbGVuZ3RoIGZpbGUgbmFtZSBhcmd1bWVudC4gKi8KKyN1bmRlZiBIQVZFX0xTVEFUX0VNUFRZX1NUUklOR19CVUcKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL2VuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01BQ0hJTkVfRU5ESUFOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgbWFsbG9jJyBmdW5jdGlvbiwgYW5kCisgICB0byAwIG90aGVyd2lzZS4gKi8KKyN1bmRlZiBIQVZFX01BTExPQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01BTExPQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTUNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNTU9WRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTVNFVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZGlyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01LRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtmaWZvJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01LRklGTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1udGVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01OVEVOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbXVubWFwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLiAqLworI3VuZGVmIEhBVkVfTkRJUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVREQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVElORVRfSU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5sX2xhbmdpbmZvJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX05MX0xBTkdJTkZPCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGF0aHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QQVRIU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQURfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgcHRyZGlmZl90Jy4gKi8KKyN1bmRlZiBIQVZFX1BUUkRJRkZfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9SRUFETElORV9ISVNUT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxyZWFkbGluZS9yZWFkbGluZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1JFQURMSU5FX1JFQURMSU5FX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgcmVhbGxvYycgZnVuY3Rpb24sCisgICBhbmQgdG8gMCBvdGhlcndpc2UuICovCisjdW5kZWYgSEFWRV9SRUFMTE9DCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhbHBhdGgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVBTFBBVEgKKworLyogRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciByZWFsdGltZSBjbG9jay4gKi8KKyN1bmRlZiBIQVZFX1JFQUxUSU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmxfY29tcGxldGlvbl9tYXRjaGVzJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fTUFUQ0hFUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJtZGlyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JNRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2VhcmNoLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0VBUkNIX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZWxlY3QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VMRUNUCisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc2VsaW51eC4gKi8KKyN1bmRlZiBIQVZFX1NFTElOVVgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWxpbnV4L2xhYmVsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0VMSU5VWF9MQUJFTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2VsaW51eC9zZWxpbnV4Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0VMSU5VWF9TRUxJTlVYX0gKKworLyogRGVmaW5lIHRvIDEgaWYgc2Vwb2xfY2hlY2tfY29udGV4dCBpcyBhdmFpbGFibGUuICovCisjdW5kZWYgSEFWRV9TRVBPTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0lHTkFMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU09DS0VUCisKKy8qIERlZmluZSB0byAxIGlmIGBzdGF0JyBoYXMgdGhlIGJ1ZyB0aGF0IGl0IHN1Y2NlZWRzIHdoZW4gZ2l2ZW4gdGhlCisgICB6ZXJvLWxlbmd0aCBmaWxlIG5hbWUgYXJndW1lbnQuICovCisjdW5kZWYgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcKKworLyogRGVmaW5lIGlmIHN0cnVjdCBzdGF0IGhhcyBhIGZpZWxkIHN0X2N0aW0gd2l0aCB0aW1lc3BlYyBmb3IgY3RpbWUgKi8KKyN1bmRlZiBIQVZFX1NUQVRfU1RfQ1RJTQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUREFSR19ICisKKy8qIERlZmluZSB0byAxIGlmIHN0ZGJvb2wuaCBjb25mb3JtcyB0byBDOTkuICovCisjdW5kZWYgSEFWRV9TVERCT09MX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJT19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjaHInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY3NwbicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJDU1BOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkRVUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJFUlJPUl9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTkNBU0VDTVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJuZHVwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUk5EVVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJwYnJrJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlBCUksKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlJDSFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzcG4nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSU1BOCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc3RyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlNUUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPVUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT1VMTAorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfcmRldicgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TVEFUX1NUX1JERVYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNsb2cuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNMT0dfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyN1bmRlZiBIQVZFX1NZU19ESVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXNrLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0RJU0tfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19JT0NUTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lwYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19JUENfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX01NQU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tb3VudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19NT1VOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyN1bmRlZiBIQVZFX1NZU19ORElSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZW0uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU0VNX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXR2ZnMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVFZGU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWVyZmQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVElNRVJGRF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdWlvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1VJT19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1VOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdXRzbmFtZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19VVFNOQU1FX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvd2FpdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19XQUlUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtaW9zLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVEVSTUlPU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1RJTUVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuYW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1VOQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dG1weC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VUTVBYX0gKKworLyogdmFsZ3JpbmQuaCBmb3VuZCAqLworI3VuZGVmIEhBVkVfVkFMR1JJTkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2Zm9yaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9WRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZmb3JrLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVkZPUktfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZwcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVlBSSU5URgorCisvKiBEZWZpbmUgdG8gMSBpZiBgZm9yaycgd29ya3MuICovCisjdW5kZWYgSEFWRV9XT1JLSU5HX0ZPUksKKworLyogRGVmaW5lIHRvIDEgaWYgYHZmb3JrJyB3b3Jrcy4gKi8KKyN1bmRlZiBIQVZFX1dPUktJTkdfVkZPUksKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYF9Cb29sJy4gKi8KKyN1bmRlZiBIQVZFX19CT09MCisKKy8qIEludGVybmFsaXphdGlvbiBwYWNrYWdlICovCisjdW5kZWYgSU5UTF9QQUNLQUdFCisKKy8qIExvY2FsZS1kZXBlbmRlbnQgZGF0YSAqLworI3VuZGVmIExPQ0FMRURJUgorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bWxvY2tkIGRsbSBvcHRpb24uICovCisjdW5kZWYgTE9DS0RETE1fU1VQUE9SVAorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bWxvY2tkIHNhbmxvY2sgb3B0aW9uLiAqLworI3VuZGVmIExPQ0tEU0FOTE9DS19TVVBQT1JUCisKKy8qIERlZmluZSB0byAxIGlmIGBsc3RhdCcgZGVyZWZlcmVuY2VzIGEgc3ltbGluayBzcGVjaWZpZWQgd2l0aCBhIHRyYWlsaW5nCisgICBzbGFzaC4gKi8KKyN1bmRlZiBMU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOSworCisvKiBEZWZpbmUgdG8gMSBpZiAnbHZtJyBzaG91bGQgZmFsbCBiYWNrIHRvIHVzaW5nIExWTTEgYmluYXJpZXMgaWYKKyAgIGRldmljZS1tYXBwZXIgaXMgbWlzc2luZyBmcm9tIHRoZSBrZXJuZWwgKi8KKyN1bmRlZiBMVk0xX0ZBTExCQUNLCisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgTFZNMSBtZXRhZGF0YS4gKi8KKyN1bmRlZiBMVk0xX0lOVEVSTkFMCisKKy8qIFBhdGggdG8gbHZtZXRhZCBwaWRmaWxlLiAqLworI3VuZGVmIExWTUVUQURfUElERklMRQorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bWV0YWQuICovCisjdW5kZWYgTFZNRVRBRF9TVVBQT1JUCisKKy8qIFBhdGggdG8gbHZtbG9ja2QgcGlkZmlsZS4gKi8KKyN1bmRlZiBMVk1MT0NLRF9QSURGSUxFCisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgY29kZSB0aGF0IHVzZXMgbHZtbG9ja2QuICovCisjdW5kZWYgTFZNTE9DS0RfU1VQUE9SVAorCisvKiBQYXRoIHRvIGx2bXBvbGxkIHBpZGZpbGUuICovCisjdW5kZWYgTFZNUE9MTERfUElERklMRQorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGNvZGUgdGhhdCB1c2VzIGx2bXBvbGxkLiAqLworI3VuZGVmIExWTVBPTExEX1NVUFBPUlQKKworLyogUGF0aCB0byBsdm0gYmluYXJ5LiAqLworI3VuZGVmIExWTV9QQVRICisKKy8qIERlZmluZSB0byAxIGlmIGBtYWpvcicsIGBtaW5vcicsIGFuZCBgbWFrZWRldicgYXJlIGRlY2xhcmVkIGluIDxta2Rldi5oPi4KKyAgICovCisjdW5kZWYgTUFKT1JfSU5fTUtERVYKKworLyogRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JyBhcmUgZGVjbGFyZWQgaW4KKyAgIDxzeXNtYWNyb3MuaD4uICovCisjdW5kZWYgTUFKT1JfSU5fU1lTTUFDUk9TCisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbWlycm9ycy4gKi8KKyN1bmRlZiBNSVJST1JFRF9JTlRFUk5BTAorCisvKiBUaGUgcGF0aCB0byAnbW9kcHJvYmUnLCBpZiBhdmFpbGFibGUuICovCisjdW5kZWYgTU9EUFJPQkVfQ01ECisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgY29kZSB0aGF0IHVzZXMgZGJ1cyBub3RpZmljYXRpb24uICovCisjdW5kZWYgTk9USUZZREJVU19TVVBQT1JUCisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSBPX0RJUkVDVCBzdXBwb3J0LiAqLworI3VuZGVmIE9fRElSRUNUX1NVUFBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSB0byAxIHRvIGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgR0ZTIHBvb2wgbWV0YWRhdGEuICovCisjdW5kZWYgUE9PTF9JTlRFUk5BTAorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIHJhaWQuICovCisjdW5kZWYgUkFJRF9JTlRFUk5BTAorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIHRoZSBMVk0gcmVhZGxpbmUgc2hlbGwuICovCisjdW5kZWYgUkVBRExJTkVfU1VQUE9SVAorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIHJlcGxpY2F0b3JzLiAqLworI3VuZGVmIFJFUExJQ0FUT1JfSU5URVJOQUwKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYXJnIDEgZm9yIGBzZWxlY3QnLiAqLworI3VuZGVmIFNFTEVDVF9UWVBFX0FSRzEKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZ3MgMiwgMyBhbmQgNCBmb3IgYHNlbGVjdCcuICovCisjdW5kZWYgU0VMRUNUX1RZUEVfQVJHMjM0CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhcmcgNSBmb3IgYHNlbGVjdCcuICovCisjdW5kZWYgU0VMRUNUX1RZUEVfQVJHNQorCisvKiBEZWZpbmUgdG8gMSB0byBpbmNsdWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIHNuYXBzaG90cy4gKi8KKyN1bmRlZiBTTkFQU0hPVF9JTlRFUk5BTAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bnRpbWUuCisJU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI3VuZGVmIFNUUkVSUk9SX1JfQ0hBUl9QCisKKy8qIFBhdGggdG8gdGVzdHN1aXRlIGRhdGEgKi8KKyN1bmRlZiBURVNUU1VJVEVfREFUQQorCisvKiBUaGUgcGF0aCB0byAndGhpbl9jaGVjaycsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBUSElOX0NIRUNLX0NNRAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgZXh0ZXJuYWwgJ3RoaW5fY2hlY2snIHRvb2wgcmVxdWlyZXMgdGhlCisgICAtLWNsZWFyLW5lZWRzLWNoZWNrLWZsYWcgb3B0aW9uICovCisjdW5kZWYgVEhJTl9DSEVDS19ORUVEU19DSEVDSworCisvKiBUaGUgcGF0aCB0byAndGhpbl9kdW1wJywgaWYgYXZhaWxhYmxlLiAqLworI3VuZGVmIFRISU5fRFVNUF9DTUQKKworLyogRGVmaW5lIHRvIDEgdG8gaW5jbHVkZSBidWlsdC1pbiBzdXBwb3J0IGZvciB0aGluIHByb3Zpc2lvbmluZy4gKi8KKyN1bmRlZiBUSElOX0lOVEVSTkFMCisKKy8qIFRoZSBwYXRoIHRvICd0aGluX3JlcGFpcicsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBUSElOX1JFUEFJUl9DTUQKKworLyogVGhlIHBhdGggdG8gJ3RoaW5fcmVzdG9yZScsIGlmIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBUSElOX1JFU1RPUkVfQ01ECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLworI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtJy4gKi8KKyN1bmRlZiBUTV9JTl9TWVNfVElNRQorCisvKiBEZWZpbmUgdG8gMSB0byBlbmFibGUgc3luY2hyb25pc2F0aW9uIHdpdGggdWRldiBwcm9jZXNzaW5nLiAqLworI3VuZGVmIFVERVZfU1lOQ19TVVBQT1JUCisKKy8qIEVuYWJsZSBhIHZhbGdyaW5kIGF3YXJlIGJ1aWxkIG9mIHBvb2wgKi8KKyN1bmRlZiBWQUxHUklORF9QT09MCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDMyX3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisjdW5kZWYgX1VJTlQzMl9UCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDY0X3QgdHlwZWRlZiBmcm9tIDxzeXMvc3luY2guaD4sCisgICA8cHRocmVhZC5oPiwgb3IgPHNlbWFwaG9yZS5oPiBpcyBub3QgdXNlZC4gSWYgdGhlIHR5cGVkZWYgd2VyZSBhbGxvd2VkLCB0aGUKKyAgICNkZWZpbmUgYmVsb3cgd291bGQgY2F1c2UgYSBzeW50YXggZXJyb3IuICovCisjdW5kZWYgX1VJTlQ2NF9UCisKKy8qIERlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludDhfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKyN1bmRlZiBfVUlOVDhfVAorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gKi8KKyN1bmRlZiBnaWRfdAorCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworI3VuZGVmIGlubGluZQorI2VuZGlmCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAxNiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworI3VuZGVmIGludDE2X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGEgc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgaW50MzJfdAorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgNjQgYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKyN1bmRlZiBpbnQ2NF90CisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA4IGJpdHMgaWYgc3VjaAorICAgYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgaW50OF90CisKKy8qIERlZmluZSB0byBycGxfbWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KKyN1bmRlZiBtYWxsb2MKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIG1vZGVfdAorCisvKiBEZWZpbmUgdG8gYGxvbmcgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgcGlkX3QKKworLyogRGVmaW5lIHRvIHJwbF9yZWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KKyN1bmRlZiByZWFsbG9jCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNzaXplX3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICovCisjdW5kZWYgdWlkX3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDE2IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDE2X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDMyX3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDY0IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisjdW5kZWYgdWludDY0X3QKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDggYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKyN1bmRlZiB1aW50OF90CisKKy8qIERlZmluZSBhcyBgZm9yaycgaWYgYHZmb3JrJyBkb2VzIG5vdCB3b3JrLiAqLworI3VuZGVmIHZmb3JrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2x2bS12ZXJzaW9uLmguaW4gYi9pbmNsdWRlL2x2bS12ZXJzaW9uLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxZDVlOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbHZtLXZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVkVSU0lPTl9ICisvKioKKyAqIFRoZSBMVk0gdmVyc2lvbiBudW1iZXIKKyAqCisgKiBMVk1fTUFKT1IuTFZNX01JTk9SLkxWTV9QQVRDSExFVkVMKExWTV9MSUJBUEkpWy1MVk1fUkVMRUFTRV0KKyAqLworCisjZGVmaW5lIExWTV9WRVJTSU9OIEBMVk1fVkVSU0lPTkAKKyNkZWZpbmUgTFZNX01BSk9SIEBMVk1fTUFKT1JACisjZGVmaW5lIExWTV9NSU5PUiBATFZNX01JTk9SQAorI2RlZmluZSBMVk1fUEFUQ0hMRVZFTCBATFZNX1BBVENITEVWRUxACisjZGVmaW5lIExWTV9MSUJBUEkgQExWTV9MSUJBUElACisjZGVmaW5lIExWTV9SRUxFQVNFIEBMVk1fUkVMRUFTRUAKKyNkZWZpbmUgTFZNX1JFTEVBU0VfREFURSBATFZNX1JFTEVBU0VfREFURUAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmluIGIvbGliL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MWQ5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyMzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitpZmVxICgiQExWTTFAIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgPSBmb3JtYXQxCitlbmRpZgorCitpZmVxICgiQFBPT0xAIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgKz0gZm9ybWF0X3Bvb2wKK2VuZGlmCisKK2lmZXEgKCJAU05BUFNIT1RTQCIsICJzaGFyZWQiKQorICBTVUJESVJTICs9IHNuYXBzaG90CitlbmRpZgorCitpZmVxICgiQE1JUlJPUlNAIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgKz0gbWlycm9yCitlbmRpZgorCitpZmVxICgiQFJBSURAIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgKz0gcmFpZAorZW5kaWYKKworaWZlcSAoIkBSRVBMSUNBVE9SU0AiLCAic2hhcmVkIikKKyAgU1VCRElSUyArPSByZXBsaWNhdG9yCitlbmRpZgorCitpZmVxICgiQFRISU5AIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgKz0gdGhpbgorZW5kaWYKKworaWZlcSAoIkBDQUNIRUAiLCAic2hhcmVkIikKKyAgU1VCRElSUyArPSBjYWNoZV9zZWd0eXBlCitlbmRpZgorCitTT1VSQ0VTID1cCisJYWN0aXZhdGUvYWN0aXZhdGUuYyBcCisJY2FjaGUvbHZtY2FjaGUuYyBcCisJY29tbWFuZHMvdG9vbGNvbnRleHQuYyBcCisJY29uZmlnL2NvbmZpZy5jIFwKKwlkYXRhc3RydWN0L2J0cmVlLmMgXAorCWRhdGFzdHJ1Y3Qvc3RyX2xpc3QuYyBcCisJZGV2aWNlL2Rldi1jYWNoZS5jIFwKKwlkZXZpY2UvZGV2LWV4dC5jIFwKKwlkZXZpY2UvZGV2LWlvLmMgXAorCWRldmljZS9kZXYtbWQuYyBcCisJZGV2aWNlL2Rldi1zd2FwLmMgXAorCWRldmljZS9kZXYtdHlwZS5jIFwKKwlkZXZpY2UvZGV2LWx1a3MuYyBcCisJZGV2aWNlL2Rldi1kYXNkLmMgXAorCWRpc3BsYXkvZGlzcGxheS5jIFwKKwllcnJvci9lcnJzZWcuYyBcCisJdW5rbm93bi91bmtub3duLmMgXAorCWZpbHRlcnMvZmlsdGVyLWNvbXBvc2l0ZS5jIFwKKwlmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmMgXAorCWZpbHRlcnMvZmlsdGVyLXJlZ2V4LmMgXAorCWZpbHRlcnMvZmlsdGVyLXN5c2ZzLmMgXAorCWZpbHRlcnMvZmlsdGVyLW1kLmMgXAorCWZpbHRlcnMvZmlsdGVyLWZ3cmFpZC5jIFwKKwlmaWx0ZXJzL2ZpbHRlci1tcGF0aC5jIFwKKwlmaWx0ZXJzL2ZpbHRlci1wYXJ0aXRpb25lZC5jIFwKKwlmaWx0ZXJzL2ZpbHRlci10eXBlLmMgXAorCWZpbHRlcnMvZmlsdGVyLXVzYWJsZS5jIFwKKwlmaWx0ZXJzL2ZpbHRlci1pbnRlcm5hbC5jIFwKKwlmb3JtYXRfdGV4dC9hcmNoaXZlLmMgXAorCWZvcm1hdF90ZXh0L2FyY2hpdmVyLmMgXAorCWZvcm1hdF90ZXh0L2V4cG9ydC5jIFwKKwlmb3JtYXRfdGV4dC9mbGFncy5jIFwKKwlmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jIFwKKwlmb3JtYXRfdGV4dC9pbXBvcnQuYyBcCisJZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYyBcCisJZm9ybWF0X3RleHQvdGV4dF9sYWJlbC5jIFwKKwlmcmVlc2VnL2ZyZWVzZWcuYyBcCisJbGFiZWwvbGFiZWwuYyBcCisJbG9ja2luZy9maWxlX2xvY2tpbmcuYyBcCisJbG9ja2luZy9sb2NraW5nLmMgXAorCWxvY2tpbmcvbm9fbG9ja2luZy5jIFwKKwlsb2cvbG9nLmMgXAorCW1ldGFkYXRhL2NhY2hlX21hbmlwLmMgXAorCW1ldGFkYXRhL2x2LmMgXAorCW1ldGFkYXRhL2x2X21hbmlwLmMgXAorCW1ldGFkYXRhL21lcmdlLmMgXAorCW1ldGFkYXRhL21ldGFkYXRhLmMgXAorCW1ldGFkYXRhL21pcnJvci5jIFwKKwltZXRhZGF0YS9wb29sX21hbmlwLmMgXAorCW1ldGFkYXRhL3B2LmMgXAorCW1ldGFkYXRhL3B2X21hbmlwLmMgXAorCW1ldGFkYXRhL3B2X21hcC5jIFwKKwltZXRhZGF0YS9yYWlkX21hbmlwLmMgXAorCW1ldGFkYXRhL3JlcGxpY2F0b3JfbWFuaXAuYyBcCisJbWV0YWRhdGEvc2VndHlwZS5jIFwKKwltZXRhZGF0YS9zbmFwc2hvdF9tYW5pcC5jIFwKKwltZXRhZGF0YS90aGluX21hbmlwLmMgXAorCW1ldGFkYXRhL3ZnLmMgXAorCW1pc2MvY3JjLmMgXAorCW1pc2MvbHZtLWV4ZWMuYyBcCisJbWlzYy9sdm0tZmlsZS5jIFwKKwltaXNjL2x2bS1mbG9jay5jIFwKKwltaXNjL2x2bS1nbG9iYWxzLmMgXAorCW1pc2MvbHZtLXNpZ25hbC5jIFwKKwltaXNjL2x2bS1zdHJpbmcuYyBcCisJbWlzYy9sdm0td3JhcHBlcnMuYyBcCisJbWlzYy9sdm0tcGVyY2VudC5jIFwKKwltbS9tZW1sb2NrLmMgXAorCW5vdGlmeS9sdm1ub3RpZnkuYyBcCisJcHJvcGVydGllcy9wcm9wX2NvbW1vbi5jIFwKKwlyZXBvcnQvcHJvcGVydGllcy5jIFwKKwlyZXBvcnQvcmVwb3J0LmMgXAorCXN0cmlwZWQvc3RyaXBlZC5jIFwKKwl1dWlkL3V1aWQuYyBcCisJemVyby96ZXJvLmMKKworaWZlcSAoIkBMVk0xQCIsICJpbnRlcm5hbCIpCisgIFNPVVJDRVMgKz1cCisJZm9ybWF0MS9kaXNrLXJlcC5jIFwKKwlmb3JtYXQxL2Zvcm1hdDEuYyBcCisJZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmMgXAorCWZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYyBcCisJZm9ybWF0MS9sYXlvdXQuYyBcCisJZm9ybWF0MS9sdm0xLWxhYmVsLmMgXAorCWZvcm1hdDEvdmdfbnVtYmVyLmMKK2VuZGlmCisKK2lmZXEgKCJAUE9PTEAiLCAiaW50ZXJuYWwiKQorICBTT1VSQ0VTICs9XAorCWZvcm1hdF9wb29sL2Rpc2tfcmVwLmMgXAorCWZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmMgXAorCWZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYyBcCisJZm9ybWF0X3Bvb2wvcG9vbF9sYWJlbC5jCitlbmRpZgorCitpZmVxICgiQENMVVNURVJAIiwgImludGVybmFsIikKKyAgU09VUkNFUyArPSBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jCitlbmRpZgorCitpZmVxICgiQENMVVNURVJAIiwgInNoYXJlZCIpCisgIFNVQkRJUlMgKz0gbG9ja2luZworZW5kaWYKKworaWZlcSAoIkBTTkFQU0hPVFNAIiwgImludGVybmFsIikKKyAgU09VUkNFUyArPSBzbmFwc2hvdC9zbmFwc2hvdC5jCitlbmRpZgorCitpZmVxICgiQE1JUlJPUlNAIiwgImludGVybmFsIikKKyAgU09VUkNFUyArPSBtaXJyb3IvbWlycm9yZWQuYworZW5kaWYKKworaWZlcSAoIkBSQUlEQCIsICJpbnRlcm5hbCIpCisgIFNPVVJDRVMgKz0gcmFpZC9yYWlkLmMKK2VuZGlmCisKK2lmZXEgKCJAUkVQTElDQVRPUlNAIiwgImludGVybmFsIikKKyAgU09VUkNFUyArPSByZXBsaWNhdG9yL3JlcGxpY2F0b3IuYworZW5kaWYKKworaWZlcSAoIkBUSElOQCIsICJpbnRlcm5hbCIpCisgIFNPVVJDRVMgKz0gdGhpbi90aGluLmMKK2VuZGlmCisKK2lmZXEgKCJAQ0FDSEVAIiwgImludGVybmFsIikKKyAgU09VUkNFUyArPSBjYWNoZV9zZWd0eXBlL2NhY2hlLmMKK2VuZGlmCisKK2lmZXEgKCJAREVWTUFQUEVSQCIsICJ5ZXMiKQorICBTT1VSQ0VTICs9XAorCWFjdGl2YXRlL2Rldl9tYW5hZ2VyLmMgXAorCWFjdGl2YXRlL2ZzLmMKK2VuZGlmCisKK2lmZXEgKCJASEFWRV9MSUJETEAiLCAieWVzIikKKyAgU09VUkNFUyArPVwKKwlsb2NraW5nL2V4dGVybmFsX2xvY2tpbmcuYyBcCisJbWlzYy9zaGFyZWRsaWIuYworZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1FVEFEQCIsICJ5ZXMiKQorICBTT1VSQ0VTICs9XAorCWNhY2hlL2x2bWV0YWQuYworZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1QT0xMREAiLCAieWVzIikKKyAgU09VUkNFUyArPVwKKwlsdm1wb2xsZC9sdm1wb2xsZC1jbGllbnQuYworZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1MT0NLREAiLCAieWVzIikKKyAgU09VUkNFUyArPVwKKwlsb2NraW5nL2x2bWxvY2tkLmMKK2VuZGlmCisKK2lmZXEgKCJARE1FVkVOVERAIiwgInllcyIpCisgIENMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQKKyAgTElCUyArPSAtbGRldm1hcHBlci1ldmVudAorZW5kaWYKKworTElCX05BTUUgPSBsaWJsdm0taW50ZXJuYWwKK0xJQl9TVEFUSUMgPSAkKExJQl9OQU1FKS5hCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0Y2xlYW4pCisgIFNVQkRJUlMgPVwKKwlmb3JtYXQxIFwKKwlmb3JtYXRfcG9vbCBcCisJc25hcHNob3QgXAorCW1pcnJvciBcCisJbm90aWZ5IFwKKwlyYWlkIFwKKwlyZXBsaWNhdG9yIFwKKwl0aGluIFwKKwljYWNoZV9zZWd0eXBlIFwKKwlsb2NraW5nCitlbmRpZgorCitDRkxPV19MSVNUID0gJChTT1VSQ0VTKQorQ0ZMT1dfTElTVF9UQVJHRVQgPSAkKExJQl9OQU1FKS5jZmxvdworCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworQ0ZMQUdTICs9ICQoQkxLSURfQ0ZMQUdTKSAkKFVERVZfQ0ZMQUdTKSAkKFZBTEdSSU5EX0NGTEFHUykKKworJChTVUJESVJTKTogJChMSUJfU1RBVElDKQorCitDTEVBTl9UQVJHRVRTICs9IG1pc2MvY29uZmlndXJlLmggbWlzYy9sdm0tdmVyc2lvbi5oCmRpZmYgLS1naXQgYS9saWIvYWN0aXZhdGUvYWN0aXZhdGUuYyBiL2xpYi9hY3RpdmF0ZS9hY3RpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzI5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYWN0aXZhdGUvYWN0aXZhdGUuYwpAQCAtMCwwICsxLDI0ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgIm1lbWxvY2suaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlICJsdm0tZXhlYy5oIgorI2luY2x1ZGUgImx2bS1maWxlLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAiZGV2X21hbmFnZXIuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJzaGFyZWRsaWIuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgX3NraXAoZm10LCBhcmdzLi4uKSBsb2dfdmVyeV92ZXJib3NlKCJTa2lwcGluZzogIiBmbXQgLCAjIyBhcmdzKQorCitpbnQgbHZtMV9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2x2bS9nbG9iYWwiLCBjbWQtPnByb2NfZGlyKQorCSAgICA8IDApIHsKKwkJbG9nX2Vycm9yKCJMVk0xIHByb2MgZ2xvYmFsIHNucHJpbnRmIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKHBhdGhfZXhpc3RzKHBhdGgpKSA/IDEgOiAwOworfQorCitpbnQgbGlzdF9zZWdtZW50X21vZHVsZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCSBzdHJ1Y3QgZG1fbGlzdCAqbW9kdWxlcykKK3sKKwl1bnNpZ25lZCBpbnQgczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnMiwgKnNuYXBfc2VnOworCXN0cnVjdCBkbV9saXN0ICpzbmg7CisKKwlpZiAoc2VnLT5zZWd0eXBlLT5vcHMtPm1vZHVsZXNfbmVlZGVkICYmCisJICAgICFzZWctPnNlZ3R5cGUtPm9wcy0+bW9kdWxlc19uZWVkZWQobWVtLCBzZWcsIG1vZHVsZXMpKSB7CisJCWxvZ19lcnJvcigibW9kdWxlIHN0cmluZyBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfb3JpZ2luKHNlZy0+bHYpKQorCQlkbV9saXN0X2l0ZXJhdGUoc25oLCAmc2VnLT5sdi0+c25hcHNob3Rfc2VncykKKwkJCWlmICghbGlzdF9sdl9tb2R1bGVzKG1lbSwKKwkJCQkJICAgICBkbV9saXN0X3N0cnVjdF9iYXNlKHNuaCwKKwkJCQkJCQkgICAgICBzdHJ1Y3QgbHZfc2VnbWVudCwKKwkJCQkJCQkgICAgICBvcmlnaW5fbGlzdCktPmNvdywKKwkJCQkJICAgICBtb2R1bGVzKSkKKwkJCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19jb3coc2VnLT5sdikpIHsKKwkJc25hcF9zZWcgPSBmaW5kX3NuYXBzaG90KHNlZy0+bHYpOworCQlpZiAoc25hcF9zZWctPnNlZ3R5cGUtPm9wcy0+bW9kdWxlc19uZWVkZWQgJiYKKwkJICAgICFzbmFwX3NlZy0+c2VndHlwZS0+b3BzLT5tb2R1bGVzX25lZWRlZChtZW0sIHNuYXBfc2VnLAorCQkJCQkJCSAgICBtb2R1bGVzKSkgeworCQkJbG9nX2Vycm9yKCJzbmFwX3NlZyBtb2R1bGUgc3RyaW5nIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlzd2l0Y2ggKHNlZ190eXBlKHNlZywgcykpIHsKKwkJY2FzZSBBUkVBX0xWOgorCQkJc2VnMiA9IGZpbmRfc2VnX2J5X2xlKHNlZ19sdihzZWcsIHMpLCBzZWdfbGUoc2VnLCBzKSk7CisJCQlpZiAoc2VnMiAmJiAhbGlzdF9zZWdtZW50X21vZHVsZXMobWVtLCBzZWcyLCBtb2R1bGVzKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWJyZWFrOworCQljYXNlIEFSRUFfUFY6CisJCWNhc2UgQVJFQV9VTkFTU0lHTkVEOgorCQkJOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBsaXN0X2x2X21vZHVsZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKQorCQlpZiAoIWxpc3Rfc2VnbWVudF9tb2R1bGVzKG1lbSwgc2VnLCBtb2R1bGVzKSkKKwkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2X3Bhc3Nlc192b2x1bWVzX2ZpbHRlcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGludCBjZmdfaWQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJY29uc3QgY2hhciAqc3RyOworCXN0YXRpYyBjaGFyIGNvbmZpZ19wYXRoW1BBVEhfTUFYXTsKKwlzaXplX3QgbGVuID0gc3RybGVuKGx2LT52Zy0+bmFtZSk7CisKKwljb25maWdfZGVmX2dldF9wYXRoKGNvbmZpZ19wYXRoLCBzaXplb2YoY29uZmlnX3BhdGgpLCBjZmdfaWQpOworCWxvZ192ZXJib3NlKCIlcyBjb25maWd1cmF0aW9uIHNldHRpbmcgZGVmaW5lZDogIgorCQkgICAgIkNoZWNraW5nIHRoZSBsaXN0IHRvIG1hdGNoICVzLiIsCisJCSAgICBjb25maWdfcGF0aCwgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCWZvciAoY3YgPSBjbi0+djsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKKwkJaWYgKGN2LT50eXBlID09IERNX0NGR19FTVBUWV9BUlJBWSkKKwkJCWdvdG8gb3V0OworCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIklnbm9yaW5nIGludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlICVzLiIsCisJCQkJCQljb25maWdfcGF0aCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzdHIgPSBjdi0+di5zdHI7CisJCWlmICghKnN0cikgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIklnbm9yaW5nIGVtcHR5IHN0cmluZyBpbiBjb25maWcgZmlsZSAlcy4iLAorCQkJCQkJY29uZmlnX3BhdGgpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUYWc/ICovCisJCWlmICgqc3RyID09ICdAJykgeworCQkJc3RyKys7CisJCQlpZiAoISpzdHIpIHsKKwkJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiSWdub3JpbmcgZW1wdHkgdGFnIGluIGNvbmZpZyBmaWxlICVzIiwKKwkJCQkJCQljb25maWdfcGF0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBJZiBhbnkgaG9zdCB0YWcgbWF0Y2hlcyBhbnkgTFYgb3IgVkcgdGFnLCBhY3RpdmF0ZSAqLworCQkJaWYgKCFzdHJjbXAoc3RyLCAiKiIpKSB7CisJCQkJaWYgKHN0cl9saXN0X21hdGNoX2xpc3QoJmNtZC0+dGFncywgJmx2LT50YWdzLCBOVUxMKQorCQkJCSAgICB8fCBzdHJfbGlzdF9tYXRjaF9saXN0KCZjbWQtPnRhZ3MsCisJCQkJCQkJICAgJmx2LT52Zy0+dGFncywgTlVMTCkpCisJCQkJCSAgICByZXR1cm4gMTsKKwkJCQllbHNlCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogSWYgc3VwcGxpZWQgdGFnIG1hdGNoZXMgTFYgb3IgVkcgdGFnLCBhY3RpdmF0ZSAqLworCQkJaWYgKHN0cl9saXN0X21hdGNoX2l0ZW0oJmx2LT50YWdzLCBzdHIpIHx8CisJCQkgICAgc3RyX2xpc3RfbWF0Y2hfaXRlbSgmbHYtPnZnLT50YWdzLCBzdHIpKQorCQkJCXJldHVybiAxOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogSWYgc3VwcGxpZWQgbmFtZSBpcyB2Z25hbWVbL2x2bmFtZV0gKi8KKwkJaWYgKChzdHJuY21wKHN0ciwgbHYtPnZnLT5uYW1lLCBsZW4pID09IDApICYmCisJCSAgICAoIXN0cltsZW5dIHx8CisJCSAgICAgKChzdHJbbGVuXSA9PSAnLycpICYmCisJCSAgICAgICFzdHJjbXAoc3RyICsgbGVuICsgMSwgbHYtPm5hbWUpKSkpCisJCQlyZXR1cm4gMTsKKwl9CisKK291dDoKKwlsb2dfdmVyYm9zZSgiTm8gaXRlbSBzdXBwbGllZCBpbiAlcyBjb25maWd1cmF0aW9uIHNldHRpbmcgbWF0Y2hlcyAlcy4iLAorCQkgICAgY29uZmlnX3BhdGgsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGx2X3Bhc3Nlc19hdXRvX2FjdGl2YXRpb25fZmlsdGVyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBhY3RpdmF0aW9uX2F1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdF9DRkcsIE5VTEwpKSkgeworCQlsb2dfdmVyYm9zZSgiYWN0aXZhdGlvbi9hdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3QgY29uZmlndXJhdGlvbiBzZXR0aW5nICIKKwkJCSAgICAibm90IGRlZmluZWQ6IEFsbCBsb2dpY2FsIHZvbHVtZXMgd2lsbCBiZSBhdXRvLWFjdGl2YXRlZC4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIF9sdl9wYXNzZXNfdm9sdW1lc19maWx0ZXIoY21kLCBsdiwgY24sIGFjdGl2YXRpb25fYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0X0NGRyk7Cit9CisKKyNpZm5kZWYgREVWTUFQUEVSX1NVUFBPUlQKK3ZvaWQgc2V0X2FjdGl2YXRpb24oaW50IGFjdCwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgaW50IHdhcm5lZCA9IDA7CisKKwlpZiAod2FybmVkIHx8ICFhY3QpCisJCXJldHVybjsKKworCWxvZ19lcnJvcigiQ29tcGlsZWQgd2l0aG91dCBsaWJkZXZtYXBwZXIgc3VwcG9ydC4gIgorCQkgICJDYW4ndCBlbmFibGUgYWN0aXZhdGlvbi4iKTsKKworCXdhcm5lZCA9IDE7Cit9CitpbnQgYWN0aXZhdGlvbih2b2lkKQoreworCXJldHVybiAwOworfQoraW50IGxpYnJhcnlfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBkcml2ZXJfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCB0YXJnZXRfdmVyc2lvbihjb25zdCBjaGFyICp0YXJnZXRfbmFtZSwgdWludDMyX3QgKm1haiwKKwkJICAgdWludDMyX3QgKm1pbiwgdWludDMyX3QgKnBhdGNobGV2ZWwpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgdGFyZ2V0X3ByZXNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAorCQkgICBpbnQgdXNlX21vZHByb2JlKQoreworCXJldHVybiAwOworfQoraW50IGx2bV9kbV9wcmVmaXhfY2hlY2soaW50IG1ham9yLCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9pbmZvKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgdXNlX2xheWVyLAorCSAgICBzdHJ1Y3QgbHZpbmZvICppbmZvLCBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKQoreworCXJldHVybiAwOworfQoraW50IGx2X2luZm9fYnlfbHZpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLCBpbnQgdXNlX2xheWVyLAorCQkgICAgc3RydWN0IGx2aW5mbyAqaW5mbywgaW50IHdpdGhfb3Blbl9jb3VudCwgaW50IHdpdGhfcmVhZF9haGVhZCkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9pbmZvX3dpdGhfc2VnX3N0YXR1cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZfc2VnLCBpbnQgdXNlX2xheWVyLAorCQkJICAgIHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKnN0YXR1cywKKwkJCSAgICBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKQoreworCXJldHVybiAwOworfQoraW50IGx2X3N0YXR1cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKmx2X3NlZywKKwkgICAgICBpbnQgdXNlX2xheWVyLCBzdHJ1Y3QgbHZfc2VnX3N0YXR1cyAqbHZfc2VnX3N0YXR1cykKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9jYWNoZV9zdGF0dXMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9sdiwKKwkJICAgIHN0cnVjdCBsdl9zdGF0dXNfY2FjaGUgKipzdGF0dXMpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfY2hlY2tfbm90X2luX3VzZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgZXJyb3JfaWZfdXNlZCkKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CitpbnQgbHZfc25hcHNob3RfcGVyY2VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBkbV9wZXJjZW50X3QgKnBlcmNlbnQpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfbWlycm9yX3BlcmNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIGludCB3YWl0LCBkbV9wZXJjZW50X3QgKnBlcmNlbnQsIHVpbnQzMl90ICpldmVudF9ucikKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9yYWlkX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgZG1fcGVyY2VudF90ICpwZXJjZW50KQoreworCXJldHVybiAwOworfQoraW50IGx2X3JhaWRfZGV2X2hlYWx0aChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjaGFyICoqZGV2X2hlYWx0aCkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9yYWlkX21pc21hdGNoX2NvdW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQ2NF90ICpjbnQpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfcmFpZF9zeW5jX2FjdGlvbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjaGFyICoqc3luY19hY3Rpb24pCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfcmFpZF9tZXNzYWdlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl90aGluX3Bvb2xfcGVyY2VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgbWV0YWRhdGEsCisJCQkgZG1fcGVyY2VudF90ICpwZXJjZW50KQoreworCXJldHVybiAwOworfQoraW50IGx2X3RoaW5fcGVyY2VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgbWFwcGVkLAorCQkgICAgZG1fcGVyY2VudF90ICpwZXJjZW50KQoreworCXJldHVybiAwOworfQoraW50IGx2X3RoaW5fcG9vbF90cmFuc2FjdGlvbl9pZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCXVpbnQ2NF90ICp0cmFuc2FjdGlvbl9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl90aGluX2RldmljZV9pZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCAqZGV2aWNlX2lkKQoreworCXJldHVybiAwOworfQoraW50IGx2c19pbl92Z19hY3RpdmF0ZWQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZzX2luX3ZnX29wZW5lZChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gMDsKK30KKy8qKioqKioKK2ludCBsdl9zdXNwZW5kKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MpCit7CisJcmV0dXJuIDE7Cit9CisqKioqKioqLworaW50IGx2X3N1c3BlbmRfaWZfYWN0aXZlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIHVuc2lnbmVkIG9yaWdpbl9vbmx5LCB1bnNpZ25lZCBleGNsdXNpdmUsCisJCQkgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9wcmUpCit7CisJcmV0dXJuIDE7Cit9CitpbnQgbHZfcmVzdW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIHVuc2lnbmVkIG9yaWdpbl9vbmx5LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAxOworfQoraW50IGx2X3Jlc3VtZV9pZl9hY3RpdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywgdW5zaWduZWQgb3JpZ2luX29ubHksCisJCQl1bnNpZ25lZCBleGNsdXNpdmUsIHVuc2lnbmVkIHJldmVydCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gMTsKK30KK2ludCBsdl9kZWFjdGl2YXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDE7Cit9CitpbnQgbHZfYWN0aXZhdGlvbl9maWx0ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywKKwkJCSBpbnQgKmFjdGl2YXRlX2x2LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAxOworfQoraW50IGx2X2FjdGl2YXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCBleGNsdXNpdmUsIGludCBub3NjYW4sCisJCWludCB0ZW1wb3JhcnksIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDE7Cit9CitpbnQgbHZfYWN0aXZhdGVfd2l0aF9maWx0ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywgaW50IGV4Y2x1c2l2ZSwKKwkJCSAgICBpbnQgbm9zY2FuLCBpbnQgdGVtcG9yYXJ5LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAxOworfQoraW50IGx2X21rbm9kZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDE7Cit9CitpbnQgcHZfdXNlc192ZyhzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIDA7Cit9Cit2b2lkIGFjdGl2YXRpb25fcmVsZWFzZSh2b2lkKQoreworfQordm9pZCBhY3RpdmF0aW9uX2V4aXQodm9pZCkKK3sKK30KKworaW50IGx2X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAwOworfQoraW50IGx2X2lzX2FjdGl2ZV9sb2NhbGx5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfaXNfYWN0aXZlX3JlbW90ZWx5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbHZfaXNfYWN0aXZlX2J1dF9ub3RfbG9jYWxseShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAwOworfQoraW50IGx2X2lzX2FjdGl2ZV9leGNsdXNpdmUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX3JlbW90ZWx5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsdl9jaGVja190cmFuc2llbnQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gMTsKK30KK2ludCBtb25pdG9yX2Rldl9mb3JfZXZlbnRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IG1vbml0b3IpCit7CisJcmV0dXJuIDE7Cit9CisvKiBmcy5jICovCit2b2lkIGZzX3VubG9jayh2b2lkKQoreworfQorLyogZGV2X21hbmFnZXIuYyAqLworI2luY2x1ZGUgInRhcmdldHMuaCIKK2ludCBhZGRfYXJlYXNfbGluZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50MzJfdCBzdGFydF9hcmVhLAorCQkgICB1aW50MzJfdCBhcmVhcykKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CitpbnQgZGV2aWNlX2lzX3VzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfdXNhYmxlX2NoZWNrX3BhcmFtcyBjaGVjaykKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CitpbnQgbHZfaGFzX3RhcmdldF90eXBlKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgICBjb25zdCBjaGFyICpsYXllciwgY29uc3QgY2hhciAqdGFyZ2V0X3R5cGUpCit7CisgICAgICAgIHJldHVybiAwOworfQorI2Vsc2UJCQkJLyogREVWTUFQUEVSX1NVUFBPUlQgKi8KKworc3RhdGljIGludCBfYWN0aXZhdGlvbiA9IDE7CisKK3ZvaWQgc2V0X2FjdGl2YXRpb24oaW50IGFjdCwgaW50IHNpbGVudCkKK3sKKwlpZiAoYWN0ID09IF9hY3RpdmF0aW9uKQorCQlyZXR1cm47CisKKwlfYWN0aXZhdGlvbiA9IGFjdDsKKwlpZiAoX2FjdGl2YXRpb24pCisJCWxvZ192ZXJib3NlKCJBY3RpdmF0aW9uIGVuYWJsZWQuIERldmljZS1tYXBwZXIga2VybmVsICIKKwkJCSAgICAiZHJpdmVyIHdpbGwgYmUgdXNlZC4iKTsKKwllbHNlIGlmICghc2lsZW50KQorCQlsb2dfd2FybigiV0FSTklORzogQWN0aXZhdGlvbiBkaXNhYmxlZC4gTm8gZGV2aWNlLW1hcHBlciAiCisJCQkgICJpbnRlcmFjdGlvbiB3aWxsIGJlIGF0dGVtcHRlZC4iKTsKKwllbHNlCisJCWxvZ192ZXJib3NlKCJBY3RpdmF0aW9uIGRpc2FibGVkLiBObyBkZXZpY2UtbWFwcGVyICIKKwkJCSAgICAiaW50ZXJhY3Rpb24gd2lsbCBiZSBhdHRlbXB0ZWQuIik7Cit9CisKK2ludCBhY3RpdmF0aW9uKHZvaWQpCit7CisJcmV0dXJuIF9hY3RpdmF0aW9uOworfQorCitzdGF0aWMgaW50IF9wYXNzZXNfYWN0aXZhdGlvbl9maWx0ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBhY3RpdmF0aW9uX3ZvbHVtZV9saXN0X0NGRywgTlVMTCkpKSB7CisJCWxvZ192ZXJib3NlKCJhY3RpdmF0aW9uL3ZvbHVtZV9saXN0IGNvbmZpZ3VyYXRpb24gc2V0dGluZyAiCisJCQkgICAgIm5vdCBkZWZpbmVkOiBDaGVja2luZyBvbmx5IGhvc3QgdGFncyBmb3IgJXMuIiwKKwkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCisJCS8qIElmIG5vIGhvc3QgdGFncyBkZWZpbmVkLCBhY3RpdmF0ZSAqLworCQlpZiAoZG1fbGlzdF9lbXB0eSgmY21kLT50YWdzKSkKKwkJCXJldHVybiAxOworCisJCS8qIElmIGFueSBob3N0IHRhZyBtYXRjaGVzIGFueSBMViBvciBWRyB0YWcsIGFjdGl2YXRlICovCisJCWlmIChzdHJfbGlzdF9tYXRjaF9saXN0KCZjbWQtPnRhZ3MsICZsdi0+dGFncywgTlVMTCkgfHwKKwkJICAgIHN0cl9saXN0X21hdGNoX2xpc3QoJmNtZC0+dGFncywgJmx2LT52Zy0+dGFncywgTlVMTCkpCisJCQlyZXR1cm4gMTsKKworCQlsb2dfdmVyYm9zZSgiTm8gaG9zdCB0YWcgbWF0Y2hlcyAlcyIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwkJLyogRG9uJ3QgYWN0aXZhdGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIF9sdl9wYXNzZXNfdm9sdW1lc19maWx0ZXIoY21kLCBsdiwgY24sIGFjdGl2YXRpb25fdm9sdW1lX2xpc3RfQ0ZHKTsKK30KKworc3RhdGljIGludCBfcGFzc2VzX3JlYWRvbmx5X2ZpbHRlcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBhY3RpdmF0aW9uX3JlYWRfb25seV92b2x1bWVfbGlzdF9DRkcsIE5VTEwpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gX2x2X3Bhc3Nlc192b2x1bWVzX2ZpbHRlcihjbWQsIGx2LCBjbiwgYWN0aXZhdGlvbl9yZWFkX29ubHlfdm9sdW1lX2xpc3RfQ0ZHKTsKK30KKworaW50IGxpYnJhcnlfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG1fZ2V0X2xpYnJhcnlfdmVyc2lvbih2ZXJzaW9uLCBzaXplKTsKK30KKworaW50IGRyaXZlcl92ZXJzaW9uKGNoYXIgKnZlcnNpb24sIHNpemVfdCBzaXplKQoreworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkdldHRpbmcgZHJpdmVyIHZlcnNpb24iKTsKKworCXJldHVybiBkbV9kcml2ZXJfdmVyc2lvbih2ZXJzaW9uLCBzaXplKTsKK30KKworaW50IHRhcmdldF92ZXJzaW9uKGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLCB1aW50MzJfdCAqbWFqLAorCQkgICB1aW50MzJfdCAqbWluLCB1aW50MzJfdCAqcGF0Y2hsZXZlbCkKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1fdmVyc2lvbnMgKnRhcmdldCwgKmxhc3RfdGFyZ2V0OworCisJbG9nX3ZlcnlfdmVyYm9zZSgiR2V0dGluZyB0YXJnZXQgdmVyc2lvbiBmb3IgJXMiLCB0YXJnZXRfbmFtZSk7CisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0xJU1RfVkVSU0lPTlMpKSkKKwkJcmV0dXJuXzA7CisKKyAgICAgICAgaWYgKGFjdGl2YXRpb25fY2hlY2tzKCkgJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorICAgICAgICAgICAgICAgIGdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJGYWlsZWQgdG8gZ2V0ICVzIHRhcmdldCB2ZXJzaW9uIiwgdGFyZ2V0X25hbWUpOworCQkvKiBBc3N1bWUgdGhpcyB3YXMgYmVjYXVzZSBMSVNUX1ZFUlNJT05TIGlzbid0IHN1cHBvcnRlZCAqLworCQkqbWFqID0gMDsKKwkJKm1pbiA9IDA7CisJCSpwYXRjaGxldmVsID0gMDsKKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCXRhcmdldCA9IGRtX3Rhc2tfZ2V0X3ZlcnNpb25zKGRtdCk7CisKKwlkbyB7CisJCWxhc3RfdGFyZ2V0ID0gdGFyZ2V0OworCisJCWlmICghc3RyY21wKHRhcmdldF9uYW1lLCB0YXJnZXQtPm5hbWUpKSB7CisJCQlyID0gMTsKKwkJCSptYWogPSB0YXJnZXQtPnZlcnNpb25bMF07CisJCQkqbWluID0gdGFyZ2V0LT52ZXJzaW9uWzFdOworCQkJKnBhdGNobGV2ZWwgPSB0YXJnZXQtPnZlcnNpb25bMl07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXRhcmdldCA9IChzdHJ1Y3QgZG1fdmVyc2lvbnMgKikoKGNoYXIgKikgdGFyZ2V0ICsgdGFyZ2V0LT5uZXh0KTsKKwl9IHdoaWxlIChsYXN0X3RhcmdldCAhPSB0YXJnZXQpOworCisgICAgICBvdXQ6CisJaWYgKHIpCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkZvdW5kICVzIHRhcmdldCAiCisJCQkJICJ2JSIgUFJJdTMyICIuJSIgUFJJdTMyICIuJSIgUFJJdTMyICIuIiwKKwkJCQkgdGFyZ2V0X25hbWUsICptYWosICptaW4sICpwYXRjaGxldmVsKTsKKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBsdm1fZG1fcHJlZml4X2NoZWNrKGludCBtYWpvciwgaW50IG1pbm9yLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljb25zdCBjaGFyICp1dWlkOworCWludCByOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1NUQVRVUykpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fdGFza19zZXRfbWlub3IoZG10LCBtaW5vcikgfHwKKwkgICAgIWRtX3Rhc2tfc2V0X21ham9yKGRtdCwgbWFqb3IpIHx8CisJICAgICFkbV90YXNrX3J1bihkbXQpIHx8CisJICAgICEodXVpZCA9IGRtX3Rhc2tfZ2V0X3V1aWQoZG10KSkpIHsKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisJCXJldHVybiAwOworCX0KKworCXIgPSBzdHJuY2FzZWNtcCh1dWlkLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByID8gMCA6IDE7Cit9CisKK2ludCBtb2R1bGVfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdGFyZ2V0X25hbWUpCit7CisJaW50IHJldCA9IDA7CisjaWZkZWYgTU9EUFJPQkVfQ01ECisJY2hhciBtb2R1bGVbMTI4XTsKKwljb25zdCBjaGFyICphcmd2W10gPSB7IE1PRFBST0JFX0NNRCwgbW9kdWxlLCBOVUxMIH07CisjZW5kaWYKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWludCBpID0gZG1fc25wcmludGYocGF0aCwgKHNpemVvZihwYXRoKSAtIDEpLCAiJXNtb2R1bGUvZG1fJXMiLAorCQkJICAgIGRtX3N5c2ZzX2RpcigpLCB0YXJnZXRfbmFtZSk7CisKKwlpZiAoaSA+IDApIHsKKwkJd2hpbGUgKHBhdGhbLS1pXSAhPSAnLycpICAvKiBzdG9wIG9uIGRtXyAqLworCQkJaWYgKHBhdGhbaV0gPT0gJy0nKQorCQkJCXBhdGhbaV0gPSAnXyc7IC8qIHJlcGxhY2UgJy0nIHdpdGggJ18nICovCisKKwkJaWYgKChsc3RhdChwYXRoLCAmc3QpID09IDApICYmIFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJNb2R1bGUgZGlyZWN0b3J5ICVzIGV4aXN0cy4iLCBwYXRoKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisjaWZkZWYgTU9EUFJPQkVfQ01ECisJaWYgKGRtX3NucHJpbnRmKG1vZHVsZSwgc2l6ZW9mKG1vZHVsZSksICJkbS0lcyIsIHRhcmdldF9uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJtb2R1bGVfcHJlc2VudCBtb2R1bGUgbmFtZSB0b28gbG9uZzogJXMiLAorCQkJICB0YXJnZXRfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGV4ZWNfY21kKGNtZCwgYXJndiwgTlVMTCwgMCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdGFyZ2V0X3ByZXNlbnRfdmVyc2lvbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdGFyZ2V0X25hbWUsCisJCQkgICBpbnQgdXNlX21vZHByb2JlLAorCQkJICAgdWludDMyX3QgKm1haiwgdWludDMyX3QgKm1pbiwgdWludDMyX3QgKnBhdGNobGV2ZWwpCit7CisJaWYgKCFhY3RpdmF0aW9uKCkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJUYXJnZXQgcHJlc2VudCB2ZXJzaW9uIGNhbGxlZCB3aGVuIGFjdGl2YXRpb24gaXMgZGlzYWJsZWQuIik7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBNT0RQUk9CRV9DTUQKKwlpZiAodXNlX21vZHByb2JlKSB7CisJCWlmICh0YXJnZXRfdmVyc2lvbih0YXJnZXRfbmFtZSwgbWFqLCBtaW4sIHBhdGNobGV2ZWwpKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKCFtb2R1bGVfcHJlc2VudChjbWQsIHRhcmdldF9uYW1lKSkKKwkJCXJldHVybl8wOworCX0KKyNlbmRpZgorCXJldHVybiB0YXJnZXRfdmVyc2lvbih0YXJnZXRfbmFtZSwgbWFqLCBtaW4sIHBhdGNobGV2ZWwpOworfQorCitpbnQgdGFyZ2V0X3ByZXNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAorCQkgICBpbnQgdXNlX21vZHByb2JlKQoreworCXVpbnQzMl90IG1haiwgbWluLCBwYXRjaGxldmVsOworCisJcmV0dXJuIHRhcmdldF9wcmVzZW50X3ZlcnNpb24oY21kLCB0YXJnZXRfbmFtZSwgdXNlX21vZHByb2JlLAorCQkJCSAgICAgICZtYWosICZtaW4sICZwYXRjaGxldmVsKTsKK30KKworc3RhdGljIGludCBfbHZfaW5mbyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIGludCB1c2VfbGF5ZXIsIHN0cnVjdCBsdmluZm8gKmluZm8sCisJCSAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgc3RydWN0IGx2X3NlZ19zdGF0dXMgKnNlZ19zdGF0dXMsCisJCSAgICBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKQoreworCXN0cnVjdCBkbV9pbmZvIGRtaW5mbzsKKworCS8qCisJICogSWYgb3Blbl9jb3VudCBpbmZvIGlzIHJlcXVlc3RlZCBhbmQgd2UgaGF2ZSB0byBiZSBzdXJlIG91ciBvd24gdWRldgorCSAqIHRyYW5zYWN0aW9ucyBhcmUgZmluaXNoZWQKKwkgKiBGb3Igbm9uLWNsdXN0ZXJlZCBsb2NraW5nIHR5cGUgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBmb3Igbm9uLWRlbGV0ZSBvcGVyYXRpb24KKwkgKiBpbiBwcm9ncmVzcyAtIGFzIG9ubHkgdGhvc2UgY291bGQgbGVhZCB0byBvcGVuZWQgZmlsZXMKKwkgKi8KKwlpZiAod2l0aF9vcGVuX2NvdW50KSB7CisJCWlmIChsb2NraW5nX2lzX2NsdXN0ZXJlZCgpICYmICFzeW5jX2xvY2FsX2Rldl9uYW1lcyhjbWQpKSAvKiBXYWl0IHRvIGhhdmUgdWRldiBpbiBzeW5jICovCisJCQlyZXR1cm5fMDsKKwkJZWxzZSBpZiAoZnNfaGFzX25vbl9kZWxldGVfb3BzKCkpCisJCQlmc191bmxvY2soKTsgLyogRm9yIG5vbiBjbHVzdGVyZWQgLSB3YWl0IGlmIHRoZXJlIGFyZSBub24tZGVsZXRlIG9wcyAqLworCX0KKworCS8qIE5ldyB0aGluLXBvb2wgaGFzIG5vIGxheWVyLCBidXQgLXRwb29sIHN1ZmZpeCBuZWVkcyB0byBiZSBxdWVyaWVkICovCisJaWYgKCF1c2VfbGF5ZXIgJiYgbHZfaXNfbmV3X3RoaW5fcG9vbChsdikpIHsKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXNuJ3QgZXhpc3Rpbmcgb2xkIHRoaW4gcG9vbCBtYXBwaW5nIGluIHRoZSB0YWJsZSAqLworCQlpZiAoIWRldl9tYW5hZ2VyX2luZm8oY21kLCBsdiwgTlVMTCwgMCwgMCwgJmRtaW5mbywgTlVMTCwgTlVMTCkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFkbWluZm8uZXhpc3RzKQorCQkJdXNlX2xheWVyID0gMTsKKwl9CisKKwlpZiAoc2VnX3N0YXR1cykgeworCQkvKiBUT0RPOiBmb3Igbm93IGl0J3MgbWVzcyB3aXRoIHNlZ19zdGF0dXMgKi8KKwkJc2VnX3N0YXR1cy0+c2VnID0gc2VnOworCQlpZiAobHZfaXNfbWVyZ2luZ19jb3cobHYpKSB7CisJCQlpZiAobHZfaGFzX3RhcmdldF90eXBlKGNtZC0+bWVtLCBvcmlnaW5fZnJvbV9jb3cobHYpLCBOVUxMLCBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkpIHsKKwkJCQkvKgorCQkJCSAqIFdoZW4gdGhlIHNuYXBzaG90LW1lcmdlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHF1ZXJ5IENPVyBMVnMgYXMgaXMuCisJCQkJICogV2hlbiBtZXJnZSBpcyBpbiBwcm9ncmVzcywgcXVlcnkgbWVyZ2luZyBvcmlnaW4gTFYgaW5zdGVhZC4KKwkJCQkgKiBDT1cgdm9sdW1lIGlzIGFscmVhZHkgbWFwcGVkIGFzIGVycm9yIHRhcmdldCBpbiB0aGlzIGNhc2UuCisJCQkJICovCisJCQkJbHYgPSBvcmlnaW5fZnJvbV9jb3cobHYpOworCQkJCXNlZ19zdGF0dXMtPnNlZyA9IGZpcnN0X3NlZyhsdik7CisJCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlNuYXBzaG90IG1lcmdlIGlzIGluIHByb2dyZXNzLCBxdWVyeWluZyBzdGF0dXMgb2YgJXMgaW5zdGVhZC4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJfQorCQl9IGVsc2UgaWYgKCF1c2VfbGF5ZXIgJiYgbHZfaXNfb3JpZ2luKGx2KSAmJiAhbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkgeworCQkJLyoKKwkJCSAqIFF1ZXJ5IHN0YXR1cyBmb3IgJ2xheWVyZWQnICgtcmVhbCkgZGV2aWNlIG1vc3Qgb2YgdGhlIHRpbWUsCisJCQkgKiBvbmx5IHdoZW4gc25hcHNob3QgbWVyZ2Ugc3RhcnRlZCwgcXVlcnkgaXRzIHByb2dyZXNzLgorCQkJICogVE9ETzogc2luZ2xlIExWIG1heSBuZWVkIGNvdXBsZSBzdGF0dXMgdG8gYmUgZXhwb3NlZCBhdCBvbmNlLi4uLgorCQkJICogICAgICAgYnV0IHRoaXMgbmVlZHMgbW9yZSBsb2dpY2FsIGJhY2tncm91bmQKKwkJCSAqLworCQkJaWYgKCFsdl9pc19tZXJnaW5nX29yaWdpbihsdikgfHwKKwkJCSAgICAhbHZfaGFzX3RhcmdldF90eXBlKGNtZC0+bWVtLCBvcmlnaW5fZnJvbV9jb3cobHYpLCBOVUxMLCBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkpCisJCQkJdXNlX2xheWVyID0gMTsKKwkJfSBlbHNlIGlmIChsdl9pc19jb3cobHYpKSB7CisJCQkvKiBIYWRsZSBmaWN0aW9uYWwgbHZtMiBzbmFwc2hvdCBhbmQgcXVlcnkgc25hcHNob3RYIHZvbHVtZSAqLworCQkJc2VnX3N0YXR1cy0+c2VnID0gZmluZF9zbmFwc2hvdChsdik7CisJCX0KKwl9CisKKwlpZiAoIWRldl9tYW5hZ2VyX2luZm8oY21kLCBsdiwKKwkJCSAgICAgICh1c2VfbGF5ZXIpID8gbHZfbGF5ZXIobHYpIDogTlVMTCwKKwkJCSAgICAgIHdpdGhfb3Blbl9jb3VudCwgd2l0aF9yZWFkX2FoZWFkLAorCQkJICAgICAgJmRtaW5mbywgKGluZm8pID8gJmluZm8tPnJlYWRfYWhlYWQgOiBOVUxMLAorCQkJICAgICAgc2VnX3N0YXR1cykpCisJCXJldHVybl8wOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gZG1pbmZvLmV4aXN0czsKKworCWluZm8tPmV4aXN0cyA9IGRtaW5mby5leGlzdHM7CisJaW5mby0+c3VzcGVuZGVkID0gZG1pbmZvLnN1c3BlbmRlZDsKKwlpbmZvLT5vcGVuX2NvdW50ID0gZG1pbmZvLm9wZW5fY291bnQ7CisJaW5mby0+bWFqb3IgPSBkbWluZm8ubWFqb3I7CisJaW5mby0+bWlub3IgPSBkbWluZm8ubWlub3I7CisJaW5mby0+cmVhZF9vbmx5ID0gZG1pbmZvLnJlYWRfb25seTsKKwlpbmZvLT5saXZlX3RhYmxlID0gZG1pbmZvLmxpdmVfdGFibGU7CisJaW5mby0+aW5hY3RpdmVfdGFibGUgPSBkbWluZm8uaW5hY3RpdmVfdGFibGU7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBpbmZvIHN0cnVjdHVyZSBwb3B1bGF0ZWQsIGVsc2UgMCBvbiBmYWlsdXJlLgorICogV2hlbiBsdmluZm8qIGlzIE5VTEwsIGl0IHJldHVybnMgMSBpZiB0aGUgZGV2aWNlIGlzIGxvY2FsbHkgYWN0aXZlLCAwIG90aGVyd2lzZS4KKyAqLworaW50IGx2X2luZm8oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCB1c2VfbGF5ZXIsCisJICAgIHN0cnVjdCBsdmluZm8gKmluZm8sIGludCB3aXRoX29wZW5fY291bnQsIGludCB3aXRoX3JlYWRfYWhlYWQpCit7CisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9sdl9pbmZvKGNtZCwgbHYsIHVzZV9sYXllciwgaW5mbywgTlVMTCwgTlVMTCwgd2l0aF9vcGVuX2NvdW50LCB3aXRoX3JlYWRfYWhlYWQpOworfQorCitpbnQgbHZfaW5mb19ieV9sdmlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCB1c2VfbGF5ZXIsCisJCSAgICBzdHJ1Y3QgbHZpbmZvICppbmZvLCBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKQoreworCWludCByOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisKKwlpZiAoIShsdiA9IGx2X2Zyb21fbHZpZChjbWQsIGx2aWRfcywgMCkpKQorCQlyZXR1cm4gMDsKKworCXIgPSBsdl9pbmZvKGNtZCwgbHYsIHVzZV9sYXllciwgaW5mbywgd2l0aF9vcGVuX2NvdW50LCB3aXRoX3JlYWRfYWhlYWQpOworCXJlbGVhc2VfdmcobHYtPnZnKTsKKworCXJldHVybiByOworfQorCisvKgorICogUmV0dXJucyAxIGlmIGx2X3NlZ19zdGF0dXMgc3RydWN0dXJlIHBvcHVsYXRlZCwKKyAqIGVsc2UgMCBvbiBmYWlsdXJlIG9yIGlmIGRldmljZSBub3QgYWN0aXZlIGxvY2FsbHkuCisgKi8KK2ludCBsdl9zdGF0dXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpsdl9zZWcsCisJICAgICAgaW50IHVzZV9sYXllciwgc3RydWN0IGx2X3NlZ19zdGF0dXMgKmx2X3NlZ19zdGF0dXMpCit7CisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9sdl9pbmZvKGNtZCwgbHZfc2VnLT5sdiwgdXNlX2xheWVyLCBOVUxMLCBsdl9zZWcsIGx2X3NlZ19zdGF0dXMsIDAsIDApOworfQorCisvKgorICogUmV0dXJucyAxIGlmIGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyBzdHJ1Y3R1cmUgcG9wdWxhdGVkLAorICogZWxzZSAwIG9uIGZhaWx1cmUgb3IgaWYgZGV2aWNlIG5vdCBhY3RpdmUgbG9jYWxseS4KKyAqCisgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgbHZfaW5mbyBhbmQgbHZfc3RhdHVzLAorICogYnV0KiBpdCdzIGRvbmUgaW4gb25lIGdvIHdpdGggb25lIGlvY3RsIGlmIHBvc3NpYmxlISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgKi8KK2ludCBsdl9pbmZvX3dpdGhfc2VnX3N0YXR1cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZfc2VnLCBpbnQgdXNlX2xheWVyLAorCQkJICAgIHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKnN0YXR1cywKKwkJCSAgICBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKQoreworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWlmIChsdiA9PSBsdl9zZWctPmx2KQorCQlyZXR1cm4gX2x2X2luZm8oY21kLCBsdiwgdXNlX2xheWVyLCAmc3RhdHVzLT5pbmZvLCBsdl9zZWcsICZzdGF0dXMtPnNlZ19zdGF0dXMsCisJCQkJd2l0aF9vcGVuX2NvdW50LCB3aXRoX3JlYWRfYWhlYWQpOworCisJLyoKKwkgKiBJZiB0aGUgaW5mbyBpcyByZXF1ZXN0ZWQgZm9yIGFuIExWIGFuZCBzZWdtZW50CisJICogc3RhdHVzIGZvciBzZWdtZW50IHRoYXQgYmVsb25nIHRvIGFub3RoZXIgTFYsCisJICogd2UgbmVlZCB0byBhY3F1aXJlIGluZm8gYW5kIHN0YXR1cyBzZXBhcmF0ZWx5IQorCSAqLworCXJldHVybiBfbHZfaW5mbyhjbWQsIGx2LCB1c2VfbGF5ZXIsICZzdGF0dXMtPmluZm8sIE5VTEwsIE5VTEwsIHdpdGhfb3Blbl9jb3VudCwgd2l0aF9yZWFkX2FoZWFkKSAmJgorCSAgICAgICBfbHZfaW5mbyhjbWQsIGx2X3NlZy0+bHYsIHVzZV9sYXllciwgTlVMTCwgbHZfc2VnLCAmc3RhdHVzLT5zZWdfc3RhdHVzLCAwLCAwKTsKK30KKworI2RlZmluZSBPUEVOX0NPVU5UX0NIRUNLX1JFVFJJRVMgMjUKKyNkZWZpbmUgT1BFTl9DT1VOVF9DSEVDS19VU0xFRVBfREVMQVkgMjAwMDAwCisKKy8qIE9ubHkgcmVwb3J0IGVycm9yIGlmIGVycm9yX2lmX3VzZWQgaXMgc2V0ICovCitpbnQgbHZfY2hlY2tfbm90X2luX3VzZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgZXJyb3JfaWZfdXNlZCkKK3sKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisJdW5zaWduZWQgaW50IG9wZW5fY291bnRfY2hlY2tfcmV0cmllczsKKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsICZpbmZvLCAxLCAwKSB8fCAhaW5mby5leGlzdHMgfHwgIWluZm8ub3Blbl9jb3VudCkKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiBzeXNmcyBpcyBub3QgdXNlZCwgdXNlIG9wZW5fY291bnQgaW5mb3JtYXRpb24gb25seS4gKi8KKwlpZiAoZG1fc3lzZnNfZGlyKCkpIHsKKwkJaWYgKGRtX2RldmljZV9oYXNfaG9sZGVycyhpbmZvLm1ham9yLCBpbmZvLm1pbm9yKSkgeworCQkJaWYgKGVycm9yX2lmX3VzZWQpCisJCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBpcyB1c2VkIGJ5IGFub3RoZXIgZGV2aWNlLiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWVsc2UKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiTG9naWNhbCB2b2x1bWUgJXMgaXMgdXNlZCBieSBhbm90aGVyIGRldmljZS4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzKGluZm8ubWFqb3IsIGluZm8ubWlub3IpKSB7CisJCQlpZiAoZXJyb3JfaWZfdXNlZCkKKwkJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGNvbnRhaW5zIGEgZmlsZXN5c3RlbSBpbiB1c2UuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJZWxzZQorCQkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJMb2dpY2FsIHZvbHVtZSAlcyBjb250YWlucyBhIGZpbGVzeXN0ZW0gaW4gdXNlLiIsCisJCQkJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCW9wZW5fY291bnRfY2hlY2tfcmV0cmllcyA9IHJldHJ5X2RlYWN0aXZhdGlvbigpID8gT1BFTl9DT1VOVF9DSEVDS19SRVRSSUVTIDogMTsKKwl3aGlsZSAoaW5mby5vcGVuX2NvdW50ID4gMCAmJiBvcGVuX2NvdW50X2NoZWNrX3JldHJpZXMtLSkgeworCQlpZiAoIW9wZW5fY291bnRfY2hlY2tfcmV0cmllcykgeworCQkJaWYgKGVycm9yX2lmX3VzZWQpCisJCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBpbiB1c2UuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWVsc2UKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiTG9naWNhbCB2b2x1bWUgJXMgaW4gdXNlLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVzbGVlcChPUEVOX0NPVU5UX0NIRUNLX1VTTEVFUF9ERUxBWSk7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJSZXRyeWluZyBvcGVuX2NvdW50IGNoZWNrIGZvciAlcy4iLAorCQkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJaWYgKCFsdl9pbmZvKGx2LT52Zy0+Y21kLCBsdiwgMCwgJmluZm8sIDEsIDApKSB7CisJCQlzdGFjazsgLyogZGV2aWNlIGRpc3NhcHBlYXJlZD8gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgcGVyY2VudCBzZXQsIGVsc2UgMCBvbiBmYWlsdXJlLgorICovCitpbnQgbHZfY2hlY2tfdHJhbnNpZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHI7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDaGVja2luZyB0cmFuc2llbnQgc3RhdHVzIGZvciBMViAlcy4iLAorCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHIgPSBkZXZfbWFuYWdlcl90cmFuc2llbnQoZG0sIGx2KSkpCisJCXN0YWNrOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBwZXJjZW50IHNldCwgZWxzZSAwIG9uIGZhaWx1cmUuCisgKi8KK2ludCBsdl9zbmFwc2hvdF9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGRtX3BlcmNlbnRfdCAqcGVyY2VudCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtOworCisJaWYgKCFsdl9pbmZvKGx2LT52Zy0+Y21kLCBsdiwgMCwgTlVMTCwgMCwgMCkpCisJCXJldHVybiAwOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNoZWNraW5nIHNuYXBzaG90IHBlcmNlbnQgZm9yIExWICVzLiIsCisJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlpZiAoIShkbSA9IGRldl9tYW5hZ2VyX2NyZWF0ZShsdi0+dmctPmNtZCwgbHYtPnZnLT5uYW1lLCAxKSkpCisJCXJldHVybl8wOworCisJaWYgKCEociA9IGRldl9tYW5hZ2VyX3NuYXBzaG90X3BlcmNlbnQoZG0sIGx2LCBwZXJjZW50KSkpCisJCXN0YWNrOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gcjsKK30KKworLyogRklYTUUgTWVyZ2Ugd2l0aCBzbmFwc2hvdF9wZXJjZW50ICovCitpbnQgbHZfbWlycm9yX3BlcmNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIGludCB3YWl0LCBkbV9wZXJjZW50X3QgKnBlcmNlbnQsIHVpbnQzMl90ICpldmVudF9ucikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtOworCisJLyogSWYgbWlycm9yZWQgTFYgaXMgdGVtcG9yYXJpbHkgc2hyaW5rZWQgdG8gMSBhcmVhICg9IGxpbmVhciksCisJICogaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW4tc3luYy4gKi8KKwlpZiAoZG1fbGlzdF9zaXplKCZsdi0+c2VnbWVudHMpID09IDEgJiYgZmlyc3Rfc2VnKGx2KS0+YXJlYV9jb3VudCA9PSAxKSB7CisJCSpwZXJjZW50ID0gRE1fUEVSQ0VOVF8xMDA7CisJCXJldHVybiAxOworCX0KKworCWlmICghbHZfaW5mbyhjbWQsIGx2LCAwLCBOVUxMLCAwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQ2hlY2tpbmcgbWlycm9yIHBlcmNlbnQgZm9yIExWICVzLiIsCisJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlpZiAoIShkbSA9IGRldl9tYW5hZ2VyX2NyZWF0ZShsdi0+dmctPmNtZCwgbHYtPnZnLT5uYW1lLCAxKSkpCisJCXJldHVybl8wOworCisJaWYgKCEociA9IGRldl9tYW5hZ2VyX21pcnJvcl9wZXJjZW50KGRtLCBsdiwgd2FpdCwgcGVyY2VudCwgZXZlbnRfbnIpKSkKKwkJc3RhY2s7CisKKwlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKworCXJldHVybiByOworfQorCitpbnQgbHZfcmFpZF9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGRtX3BlcmNlbnRfdCAqcGVyY2VudCkKK3sKKwlyZXR1cm4gbHZfbWlycm9yX3BlcmNlbnQobHYtPnZnLT5jbWQsIGx2LCAwLCBwZXJjZW50LCBOVUxMKTsKK30KKworaW50IGx2X3JhaWRfZGV2X2hlYWx0aChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjaGFyICoqZGV2X2hlYWx0aCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtOworCXN0cnVjdCBkbV9zdGF0dXNfcmFpZCAqc3RhdHVzOworCisJKmRldl9oZWFsdGggPSBOVUxMOworCisJaWYgKCFsdl9pbmZvKGx2LT52Zy0+Y21kLCBsdiwgMCwgTlVMTCwgMCwgMCkpCisJCXJldHVybiAwOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNoZWNraW5nIHJhaWQgZGV2aWNlIGhlYWx0aCBmb3IgTFYgJXMuIiwKKwkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCWlmICghKGRtID0gZGV2X21hbmFnZXJfY3JlYXRlKGx2LT52Zy0+Y21kLCBsdi0+dmctPm5hbWUsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyID0gZGV2X21hbmFnZXJfcmFpZF9zdGF0dXMoZG0sIGx2LCAmc3RhdHVzKSkgfHwKKwkgICAgISgqZGV2X2hlYWx0aCA9IGRtX3Bvb2xfc3RyZHVwKGx2LT52Zy0+Y21kLT5tZW0sCisJCQkJCSAgIHN0YXR1cy0+ZGV2X2hlYWx0aCkpKSB7CisJCWRldl9tYW5hZ2VyX2Rlc3Ryb3koZG0pOworCQlyZXR1cm5fMDsKKwl9CisKKwlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKworCXJldHVybiByOworfQorCitpbnQgbHZfcmFpZF9taXNtYXRjaF9jb3VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50NjRfdCAqY250KQoreworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisJc3RydWN0IGRtX3N0YXR1c19yYWlkICpzdGF0dXM7CisKKwkqY250ID0gMDsKKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsIE5VTEwsIDAsIDApKQorCQlyZXR1cm4gMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDaGVja2luZyByYWlkIG1pc21hdGNoIGNvdW50IGZvciBMViAlcy4iLAorCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghZGV2X21hbmFnZXJfcmFpZF9zdGF0dXMoZG0sIGx2LCAmc3RhdHVzKSkgeworCQlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKwkJcmV0dXJuXzA7CisJfQorCSpjbnQgPSBzdGF0dXMtPm1pc21hdGNoX2NvdW50OworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGx2X3JhaWRfc3luY19hY3Rpb24oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY2hhciAqKnN5bmNfYWN0aW9uKQoreworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisJc3RydWN0IGRtX3N0YXR1c19yYWlkICpzdGF0dXM7CisJY2hhciAqYWN0aW9uOworCisJKnN5bmNfYWN0aW9uID0gTlVMTDsKKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsIE5VTEwsIDAsIDApKQorCQlyZXR1cm4gMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDaGVja2luZyByYWlkIHN5bmNfYWN0aW9uIGZvciBMViAlcy4iLAorCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCS8qIHN0YXR1cy0+c3luY19hY3Rpb24gY2FuIGJlIE5VTEwgaWYgZG0tcmFpZCB2ZXJzaW9uIDwgMS41LjAgKi8KKwlpZiAoIWRldl9tYW5hZ2VyX3JhaWRfc3RhdHVzKGRtLCBsdiwgJnN0YXR1cykgfHwKKwkgICAgIXN0YXR1cy0+c3luY19hY3Rpb24gfHwKKwkgICAgIShhY3Rpb24gPSBkbV9wb29sX3N0cmR1cChsdi0+dmctPmNtZC0+bWVtLAorCQkJCSAgICAgIHN0YXR1cy0+c3luY19hY3Rpb24pKSkgeworCQlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKwkJcmV0dXJuXzA7CisJfQorCisJKnN5bmNfYWN0aW9uID0gYWN0aW9uOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGx2X3JhaWRfbWVzc2FnZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBjaGFyICptc2cpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisJc3RydWN0IGRtX3N0YXR1c19yYWlkICpzdGF0dXM7CisKKwlpZiAoIXNlZ19pc19yYWlkKGZpcnN0X3NlZyhsdikpKSB7CisJCS8qCisJCSAqIE1ha2UgaXQgZWFzaWVyIGZvciB1c2VyIHRvIGtub3cgd2hhdCB0byBkbyB3aGVuCisJCSAqIHRoZXkgYXJlIHVzaW5nIHRoaW5wb29sLgorCQkgKi8KKwkJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikgJiYKKwkJICAgIChsdl9pc19yYWlkKHNlZ19sdihmaXJzdF9zZWcobHYpLCAwKSkgfHwKKwkJICAgICBsdl9pc19yYWlkKGZpcnN0X3NlZyhsdiktPm1ldGFkYXRhX2x2KSkpIHsKKwkJCWxvZ19lcnJvcigiVGhpbiBwb29sIGRhdGEgb3IgbWV0YWRhdGEgdm9sdW1lICIKKwkJCQkgICJtdXN0IGJlIHNwZWNpZmllZC4gKEUuZy4gXCIlc190ZGF0YVwiKSIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX2Vycm9yKCIlcyBtdXN0IGJlIGEgUkFJRCBsb2dpY2FsIHZvbHVtZSB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsIE5VTEwsIDAsIDApKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNlbmQgbWVzc2FnZSB0byBhbiBpbmFjdGl2ZSBsb2dpY2FsIHZvbHVtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHIgPSBkZXZfbWFuYWdlcl9yYWlkX3N0YXR1cyhkbSwgbHYsICZzdGF0dXMpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBzdGF0dXMgb2YgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFzdGF0dXMtPnN5bmNfYWN0aW9uKSB7CisJCWxvZ19lcnJvcigiS2VybmVsIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYWN0aW9uOiAlcyIsIG1zZyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTm90ZSB0aGF0ICdkZXZfbWFuYWdlcl9yYWlkX21lc3NhZ2UnIGFsbG93cyB1cyB0byBwYXNzIGRvd24gYW55CisJICogY3VycmVudGx5IHZhbGlkIG1lc3NhZ2UuICBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIHJlc3RyaWN0cyB0aGUKKwkgKiBudW1iZXIgb2YgdXNlciBhdmFpbGFibGUgY29tYmluYXRpb25zIHRvIGEgbWluaW11bS4gIFNwZWNpZmljYWxseSwKKwkgKiAgICAgImlkbGUiIC0+ICJjaGVjayIKKwkgKiAgICAgImlkbGUiIC0+ICJyZXBhaXIiCisJICogKFRoZSBzdGF0ZSBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIHRvICJpZGxlIiB3aGVuIGEgc3luYyBwcm9jZXNzIGlzCisJICogY29tcGxldGUuKQorCSAqLworCWlmIChzdHJjbXAobXNnLCAiY2hlY2siKSAmJiBzdHJjbXAobXNnLCAicmVwYWlyIikpIHsKKwkJLyoKKwkJICogTUQgYWxsb3dzICJmcm96ZW4iIHRvIG9wZXJhdGUgaW4gYSB0b2dnbGluZyBmYXNoaW9uLgorCQkgKiBXZSBjb3VsZCBhbGxvdyB0aGlzIGlmIHdlIGxpa2UuLi4KKwkJICovCisJCWxvZ19lcnJvcigiXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCBzeW5jIG9wZXJhdGlvbi4iLCBtc2cpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHN0cmNtcChzdGF0dXMtPnN5bmNfYWN0aW9uLCAiaWRsZSIpKSB7CisJCWxvZ19lcnJvcigiJXMgc3RhdGUgaXMgY3VycmVudGx5IFwiJXNcIi4gIFVuYWJsZSB0byBzd2l0Y2ggdG8gXCIlc1wiLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgc3RhdHVzLT5zeW5jX2FjdGlvbiwgbXNnKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IGRldl9tYW5hZ2VyX3JhaWRfbWVzc2FnZShkbSwgbHYsIG1zZyk7CitvdXQ6CisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHVybiBkbV9zdGF0dXNfY2FjaGUgZm9yIGNhY2hlIHZvbHVtZSwgYWNjZXB0IGFsc28gY2FjaGUgcG9vbAorICoKKyAqIEFzIHRoZXJlIGFyZSB0b28gbWFueSB2YXJpYWJsZSBmb3IgY2FjaGUgdm9sdW1lcywgYW5kIGl0IGhhcmQKKyAqIHRvIG1ha2UgZ29vZCBBUEkgLSBzbyBsZXQncyBvYnRhaW4gZG1fc3RhdHVzX2NhY2hlIGFuZCByZXR1cm4KKyAqIGFsbCBpbmZvIHdlIGhhdmUgLSB1c2VyIGp1c3QgaGFzIHRvIHJlbGVhc2Ugc3RydWN0IGFmdGVyIGl0cyB1c2UuCisgKi8KK2ludCBsdl9jYWNoZV9zdGF0dXMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9sdiwKKwkJICAgIHN0cnVjdCBsdl9zdGF0dXNfY2FjaGUgKipzdGF0dXMpCit7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqY2FjaGVfc2VnOworCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2woY2FjaGVfbHYpKSB7CisJCWlmIChkbV9saXN0X2VtcHR5KCZjYWNoZV9sdi0+c2Vnc191c2luZ190aGlzX2x2KSB8fAorCQkgICAgIShjYWNoZV9zZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYoY2FjaGVfbHYpKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW5ub3QgY2hlY2sgc3RhdHVzIGZvciB1bnVzZWQgY2FjaGUgcG9vbCAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUoY2FjaGVfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhY2hlX2x2ID0gY2FjaGVfc2VnLT5sdjsKKwl9CisKKwlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUoY2FjaGVfbHYpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGNoZWNrIHN0YXR1cyBmb3IgZGVsZXRlZCBjYWNoZSB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoY2FjaGVfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsdl9pbmZvKGNhY2hlX2x2LT52Zy0+Y21kLCBjYWNoZV9sdiwgMCwgTlVMTCwgMCwgMCkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY2hlY2sgc3RhdHVzIGZvciBsb2NhbGx5IGluYWN0aXZlIGNhY2hlIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQ2hlY2tpbmcgc3RhdHVzIGZvciBjYWNoZSB2b2x1bWUgJXMuIiwKKwkJCSAgICAgZGlzcGxheV9sdm5hbWUoY2FjaGVfbHYpKTsKKworCWlmICghKGRtID0gZGV2X21hbmFnZXJfY3JlYXRlKGNhY2hlX2x2LT52Zy0+Y21kLCBjYWNoZV9sdi0+dmctPm5hbWUsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRldl9tYW5hZ2VyX2NhY2hlX3N0YXR1cyhkbSwgY2FjaGVfbHYsIHN0YXR1cykpIHsKKwkJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisJCXJldHVybl8wOworCX0KKwkvKiBVc2VyIGhhcyB0byBjYWxsIGRtX3Bvb2xfZGVzdHJveShzdGF0dXMtPm1lbSkhICovCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgZGF0YSBvciBtZXRhZGF0YSBwZXJjZW50IHVzYWdlLCBkZXBlbmRzIG9uIG1ldGFkYXRhIDAvMS4KKyAqIFJldHVybnMgMSBpZiBwZXJjZW50IHNldCwgZWxzZSAwIG9uIGZhaWx1cmUuCisgKi8KK2ludCBsdl90aGluX3Bvb2xfcGVyY2VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgbWV0YWRhdGEsCisJCQkgZG1fcGVyY2VudF90ICpwZXJjZW50KQoreworCWludCByOworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisKKwlpZiAoIWx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAxLCBOVUxMLCAwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQ2hlY2tpbmcgdGhpbiAlc2RhdGEgcGVyY2VudCBmb3IgTFYgJXMuIiwKKwkJCSAgICAgKG1ldGFkYXRhKSA/ICJtZXRhIiA6ICIiLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHIgPSBkZXZfbWFuYWdlcl90aGluX3Bvb2xfcGVyY2VudChkbSwgbHYsIG1ldGFkYXRhLCBwZXJjZW50KSkpCisJCXN0YWNrOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBwZXJjZW50IHNldCwgZWxzZSAwIG9uIGZhaWx1cmUuCisgKi8KK2ludCBsdl90aGluX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIGludCBtYXBwZWQsIGRtX3BlcmNlbnRfdCAqcGVyY2VudCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtOworCisJaWYgKCFsdl9pbmZvKGx2LT52Zy0+Y21kLCBsdiwgMCwgTlVMTCwgMCwgMCkpCisJCXJldHVybiAwOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNoZWNraW5nIHRoaW4gcGVyY2VudCBmb3IgTFYgJXMuIiwKKwkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCWlmICghKGRtID0gZGV2X21hbmFnZXJfY3JlYXRlKGx2LT52Zy0+Y21kLCBsdi0+dmctPm5hbWUsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyID0gZGV2X21hbmFnZXJfdGhpbl9wZXJjZW50KGRtLCBsdiwgbWFwcGVkLCBwZXJjZW50KSkpCisJCXN0YWNrOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiB0cmFuc2FjdGlvbl9pZCBzZXQsIGVsc2UgMCBvbiBmYWlsdXJlLgorICovCitpbnQgbHZfdGhpbl9wb29sX3RyYW5zYWN0aW9uX2lkKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJdWludDY0X3QgKnRyYW5zYWN0aW9uX2lkKQoreworCWludCByOworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisJc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKnN0YXR1czsKKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDEsIE5VTEwsIDAsIDApKQorCQlyZXR1cm4gMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDaGVja2luZyB0aGluLXBvb2wgdHJhbnNhY3Rpb24gaWQgZm9yIExWICVzLiIsCisJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlpZiAoIShkbSA9IGRldl9tYW5hZ2VyX2NyZWF0ZShsdi0+dmctPmNtZCwgbHYtPnZnLT5uYW1lLCAxKSkpCisJCXJldHVybl8wOworCisJaWYgKCEociA9IGRldl9tYW5hZ2VyX3RoaW5fcG9vbF9zdGF0dXMoZG0sIGx2LCAmc3RhdHVzLCAwKSkpCisJCXN0YWNrOworCWVsc2UKKwkJKnRyYW5zYWN0aW9uX2lkID0gc3RhdHVzLT50cmFuc2FjdGlvbl9pZDsKKworCWRldl9tYW5hZ2VyX2Rlc3Ryb3koZG0pOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBsdl90aGluX2RldmljZV9pZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCAqZGV2aWNlX2lkKQoreworCWludCByOworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisKKwlpZiAoIWx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAwLCBOVUxMLCAwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQ2hlY2tpbmcgZGV2aWNlIGlkIGZvciBMViAlcy4iLAorCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHIgPSBkZXZfbWFuYWdlcl90aGluX2RldmljZV9pZChkbSwgbHYsIGRldmljZV9pZCkpKQorCQlzdGFjazsKKworCWRldl9tYW5hZ2VyX2Rlc3Ryb3koZG0pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2x2X2FjdGl2ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisKKwlpZiAoIWx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDAsIDApKSB7CisJCWxvZ19kZWJ1ZygiQ2Fubm90IGRldGVybWluZSBhY3RpdmF0aW9uIHN0YXR1cyBvZiAlcyVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCSAgYWN0aXZhdGlvbigpID8gIiIgOiAiIChubyBkZXZpY2UgZHJpdmVyKSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gaW5mby5leGlzdHM7Cit9CisKK3N0YXRpYyBpbnQgX2x2X29wZW5fY291bnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCisJaWYgKCFsdl9pbmZvKGNtZCwgbHYsIDAsICZpbmZvLCAxLCAwKSkgeworCQlzdGFjazsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBpbmZvLm9wZW5fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgX2x2X2FjdGl2YXRlX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpCit7CisJaW50IHI7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKworCWlmICghKGRtID0gZGV2X21hbmFnZXJfY3JlYXRlKGx2LT52Zy0+Y21kLCBsdi0+dmctPm5hbWUsICFsdl9pc19wdm1vdmUobHYpKSkpCisJCXJldHVybl8wOworCisJaWYgKCEociA9IGRldl9tYW5hZ2VyX2FjdGl2YXRlKGRtLCBsdiwgbGFvcHRzKSkpCisJCXN0YWNrOworCisJZGV2X21hbmFnZXJfZGVzdHJveShkbSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2x2X3ByZWxvYWQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJICAgICAgIGludCAqZmx1c2hfcmVxdWlyZWQpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkZXZfbWFuYWdlciAqZG07CisJaW50IG9sZF9yZWFkb25seSA9IGxhb3B0cy0+cmVhZF9vbmx5OworCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgIWx2X2lzX3B2bW92ZShsdikpKSkKKwkJZ290b19vdXQ7CisKKwlsYW9wdHMtPnJlYWRfb25seSA9IF9wYXNzZXNfcmVhZG9ubHlfZmlsdGVyKGx2LT52Zy0+Y21kLCBsdik7CisKKwlpZiAoIShyID0gZGV2X21hbmFnZXJfcHJlbG9hZChkbSwgbHYsIGxhb3B0cywgZmx1c2hfcmVxdWlyZWQpKSkKKwkJc3RhY2s7CisKKwlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKworCWxhb3B0cy0+cmVhZF9vbmx5ID0gb2xkX3JlYWRvbmx5Oworb3V0OgorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9sdl9kZWFjdGl2YXRlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHI7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKworCWlmICghKGRtID0gZGV2X21hbmFnZXJfY3JlYXRlKGx2LT52Zy0+Y21kLCBsdi0+dmctPm5hbWUsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyID0gZGV2X21hbmFnZXJfZGVhY3RpdmF0ZShkbSwgbHYpKSkKKwkJc3RhY2s7CisKKwlkZXZfbWFuYWdlcl9kZXN0cm95KGRtKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfbHZfc3VzcGVuZF9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzLAorCQkJICBpbnQgbG9ja2ZzLCBpbnQgZmx1c2hfcmVxdWlyZWQpCit7CisJaW50IHI7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKworCWxhb3B0cy0+cmVhZF9vbmx5ID0gX3Bhc3Nlc19yZWFkb25seV9maWx0ZXIobHYtPnZnLT5jbWQsIGx2KTsKKworCS8qCisJICogV2hlbiB3ZSBhcmUgYXNrZWQgdG8gbWFuaXB1bGF0ZSAobm9ybWFsbHkgc3VzcGVuZC9yZXN1bWUpIHRoZSBQVk1PVkUKKwkgKiBkZXZpY2UgZGlyZWN0bHksIHdlIGRvbid0IHdhbnQgdG8gdG91Y2ggdGhlIGRldmljZXMgdGhhdCB1c2UgaXQuCisJICovCisJaWYgKCEoZG0gPSBkZXZfbWFuYWdlcl9jcmVhdGUobHYtPnZnLT5jbWQsIGx2LT52Zy0+bmFtZSwgIWx2X2lzX3B2bW92ZShsdikpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyID0gZGV2X21hbmFnZXJfc3VzcGVuZChkbSwgbHYsIGxhb3B0cywgbG9ja2ZzLCBmbHVzaF9yZXF1aXJlZCkpKQorCQlzdGFjazsKKworCWRldl9tYW5hZ2VyX2Rlc3Ryb3koZG0pOworCXJldHVybiByOworfQorCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyByZXR1cm4gdGhlIG51bWJlciBvZiB2aXNpYmxlIExWcyBpbiB0aGUgc3RhdGUsCisgKiBvciAtMSBvbiBlcnJvci4gIEZJWE1FIENoZWNrIHRoaXMuCisgKi8KK2ludCBsdnNfaW5fdmdfYWN0aXZhdGVkKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IGNvdW50ID0gMDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAobHZfaXNfdmlzaWJsZShsdmwtPmx2KSkKKwkJCWNvdW50ICs9IChfbHZfYWN0aXZlKHZnLT5jbWQsIGx2bC0+bHYpID09IDEpOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNvdW50ZWQgJWQgYWN0aXZlIExWcyBpbiBWRyAlcyIsIGNvdW50LCB2Zy0+bmFtZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBsdnNfaW5fdmdfb3BlbmVkKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWNvbnN0IHN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IGNvdW50ID0gMDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAobHZfaXNfdmlzaWJsZShsdmwtPmx2KSkKKwkJCWNvdW50ICs9IChfbHZfb3Blbl9jb3VudCh2Zy0+Y21kLCBsdmwtPmx2KSA+IDApOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNvdW50ZWQgJWQgb3BlbiBMVnMgaW4gVkcgJXMuIiwgY291bnQsIHZnLT5uYW1lKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIF9sdl9pc19hY3RpdmUKKyAqIEBsdjogICAgICAgIGxvZ2ljYWwgdm9sdW1lIGJlaW5nIHF1ZXJpZWQKKyAqIEBsb2NhbGx5OiAgIHNldCBpZiBhY3RpdmUgbG9jYWxseSAod2hlbiBwcm92aWRlZCkKKyAqIEByZW1vdGVseTogIHNldCBpZiBhY3RpdmUgcmVtb3RlbHkgKHdoZW4gcHJvdmlkZWQpCisgKiBAZXhjbHVzaXZlOiBzZXQgaWYgYWN0aXZlIGV4Y2x1c2l2ZWx5ICh3aGVuIHByb3ZpZGVkKQorICoKKyAqIERldGVybWluZSB3aGV0aGVyIGFuIExWIGlzIGFjdGl2ZSBsb2NhbGx5IG9yIGluIGEgY2x1c3Rlci4KKyAqIEluIGFkZGl0aW9uIHRvIHRoZSByZXR1cm4gY29kZSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvcgorICogbm90IHRoZSBMViBpcyBhY3RpdmUgc29tZXdoZXJlLCB0d28gb3RoZXIgdmFsdWVzIGFyZSBzZXQKKyAqIHRvIHlpZWxkIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgYWN0aXZhdGlvbjoKKyAqCisgKglyZXR1cm4JbG9jYWxseQlleGNsdXNpdmVseQlzdGF0dXMKKyAqCT09PT09PQk9PT09PT09CT09PT09PT09PT09CT09PT09PQorICoJICAgMAkgICAwCSAgICAwCQlub3QgYWN0aXZlCisgKgkgICAxCSAgIDAJICAgIDAJCWFjdGl2ZSByZW1vdGVseQorICoJICAgMQkgICAwCSAgICAxCQlleGNsdXNpdmUgcmVtb3RlbHkKKyAqCSAgIDEJICAgMQkgICAgMAkJYWN0aXZlIGxvY2FsbHkgYW5kIHBvc3NpYmx5IHJlbW90ZWx5CisgKgkgICAxCSAgIDEJICAgIDEJCWV4Y2x1c2l2ZSBsb2NhbGx5IChvciBsb2NhbCAmJiAhY2x1c3RlcikKKyAqIFRoZSBWRyBsb2NrIG11c3QgYmUgaGVsZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczogMCBvciAxCisgKi8KK3N0YXRpYyBpbnQgX2x2X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJIGludCAqbG9jYWxseSwgaW50ICpyZW1vdGVseSwgaW50ICpleGNsdXNpdmUpCit7CisJaW50IHIsIGwsIGU7IC8qIHJlbW90ZSwgbG9jYWwsIGFuZCBleGNsdXNpdmUgKi8KKwlpbnQgc2tpcF9jbHVzdGVyX3F1ZXJ5ID0gMDsKKworCXIgPSBsID0gZSA9IDA7CisKKwlpZiAoX2x2X2FjdGl2ZShsdi0+dmctPmNtZCwgbHYpKQorCQlsID0gMTsKKworCWlmICghdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpIHsKKwkJaWYgKGwpCisJCQllID0gMTsgIC8qIGV4Y2x1c2l2ZSBieSBkZWZpbml0aW9uICovCisJCWdvdG8gb3V0OworCX0KKworCS8qIEFjdGl2ZSBsb2NhbGx5LCBhbmQgdGhlIGNhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgZXhjbHVzaXZlIG9yIHJlbW90ZWx5ICovCisJaWYgKGwgJiYgIWV4Y2x1c2l2ZSAmJiAhcmVtb3RlbHkpCisJCXNraXBfY2x1c3Rlcl9xdWVyeSA9IDE7CisKKwlpZiAoc2tpcF9jbHVzdGVyX3F1ZXJ5KQorCQlnb3RvIG91dDsKKworCWlmICgociA9IGNsdXN0ZXJfbG9ja19oZWxkKGx2LT5sdmlkLnMsICIiLCAmZSkpID49IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiBsb2NrIHF1ZXJ5IGlzIG5vdCBzdXBwb3J0ZWQgKGR1ZSB0byBpbnRlcmZhY2luZyB3aXRoIG9sZAorCSAqIGNvZGUpLCB0aGVuIHdlIGNhbm5vdCBldmFsdWF0ZSBleGNsdXNpdml0eSBwcm9wZXJseS4KKwkgKgorCSAqIE9sZCB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgYWZmZWN0ZWQgYnkgdGhpcywKKwkgKiBzaW5jZSB0aGV5IGFyZSBvbmx5IGNvbmNlcm5lZCBhYm91dCBhY3RpdmUgdnMuIG5vdCBhY3RpdmUuCisJICogTmV3IHVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gd2hvIHNwZWNpZmljYWxseSBhc2sgZm9yICdleGNsdXNpdmUnCisJICogd2lsbCBiZSBnaXZlbiBhIHdhcm5pbmcgbWVzc2FnZS4KKwkgKi8KKwlsb2dfd2FybigiV0FSTklORzogVW5hYmxlIHRvIGRldGVybWluZSBleGNsdXNpdml0eSBvZiAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJZSA9IDA7CisKKwkvKiBBbHNvIHNldCByZW1vdGVseSBhcyBhIHByZWNhdXRpb24sIGFzIHdlIGRvbid0IGtub3cgKi8KKwlyID0gMTsKKworCS8qCisJICogV2UgdXNlZCB0byBhdHRlbXB0IGFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwobHYtPnZnLT5jbWQsIGx2KSBoZXJlLAorCSAqIGJ1dCBpdCdzIHVucmVsaWFibGUuCisJICovCisKK291dDoKKwlpZiAobG9jYWxseSkKKwkJKmxvY2FsbHkgPSBsOworCWlmIChleGNsdXNpdmUpCisJCSpleGNsdXNpdmUgPSBlOworCWlmIChyZW1vdGVseSkKKwkJKnJlbW90ZWx5ID0gcjsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIGlzICVzYWN0aXZlJXMlcyVzJXMiLAorCQkJIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCSAociB8fCBsKSA/ICIiIDogIm5vdCAiLAorCQkJIChleGNsdXNpdmUgJiYgZSkgPyAiIGV4Y2x1c2l2ZSIgOiAiIiwKKwkJCSBsID8gIiBsb2NhbGx5IiA6ICIiLAorCQkJICghc2tpcF9jbHVzdGVyX3F1ZXJ5ICYmIGwgJiYgcikgPyAiIGFuZCIgOiAiIiwKKwkJCSAoIXNraXBfY2x1c3Rlcl9xdWVyeSAmJiByKSA/ICIgcmVtb3RlbHkiIDogIiIpOworCisJcmV0dXJuIHIgfHwgbDsKK30KKworaW50IGx2X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfbHZfaXNfYWN0aXZlKGx2LCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworaW50IGx2X2lzX2FjdGl2ZV9sb2NhbGx5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IGw7CisKKwlyZXR1cm4gX2x2X2lzX2FjdGl2ZShsdiwgJmwsIE5VTEwsIE5VTEwpICYmIGw7Cit9CisKK2ludCBsdl9pc19hY3RpdmVfcmVtb3RlbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgcjsKKworCXJldHVybiBfbHZfaXNfYWN0aXZlKGx2LCBOVUxMLCAmciwgTlVMTCkgJiYgcjsKK30KKworaW50IGx2X2lzX2FjdGl2ZV9idXRfbm90X2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgbDsKKworCXJldHVybiBfbHZfaXNfYWN0aXZlKGx2LCAmbCwgTlVMTCwgTlVMTCkgJiYgIWw7Cit9CisKK2ludCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IGU7CisKKwlyZXR1cm4gX2x2X2lzX2FjdGl2ZShsdiwgTlVMTCwgTlVMTCwgJmUpICYmIGU7Cit9CisKK2ludCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgbCwgZTsKKworCXJldHVybiBfbHZfaXNfYWN0aXZlKGx2LCAmbCwgTlVMTCwgJmUpICYmIGwgJiYgZTsKK30KKworaW50IGx2X2lzX2FjdGl2ZV9leGNsdXNpdmVfcmVtb3RlbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgbCwgZTsKKworCXJldHVybiBfbHZfaXNfYWN0aXZlKGx2LCAmbCwgTlVMTCwgJmUpICYmICFsICYmIGU7Cit9CisKKyNpZmRlZiBETUVWRU5URAorc3RhdGljIHN0cnVjdCBkbV9ldmVudF9oYW5kbGVyICpfY3JlYXRlX2RtX2V2ZW50X2hhbmRsZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRtdXVpZCwgY29uc3QgY2hhciAqZHNvLAorCQkJCQkJCSBjb25zdCBpbnQgdGltZW91dCwgZW51bSBkbV9ldmVudF9tYXNrIG1hc2spCit7CisJc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoOworCisJaWYgKCEoZG1ldmggPSBkbV9ldmVudF9oYW5kbGVyX2NyZWF0ZSgpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoZG1fZXZlbnRfaGFuZGxlcl9zZXRfZG1ldmVudGRfcGF0aChkbWV2aCwgZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBkbWV2ZW50ZF9leGVjdXRhYmxlX0NGRywgTlVMTCkpKQorCQlnb3RvX2JhZDsKKworCWlmIChkbV9ldmVudF9oYW5kbGVyX3NldF9kc28oZG1ldmgsIGRzbykpCisJCWdvdG9fYmFkOworCisJaWYgKGRtX2V2ZW50X2hhbmRsZXJfc2V0X3V1aWQoZG1ldmgsIGRtdXVpZCkpCisJCWdvdG9fYmFkOworCisJZG1fZXZlbnRfaGFuZGxlcl9zZXRfdGltZW91dChkbWV2aCwgdGltZW91dCk7CisJZG1fZXZlbnRfaGFuZGxlcl9zZXRfZXZlbnRfbWFzayhkbWV2aCwgbWFzayk7CisKKwlyZXR1cm4gZG1ldmg7CisKK2JhZDoKKwlkbV9ldmVudF9oYW5kbGVyX2Rlc3Ryb3koZG1ldmgpOworCXJldHVybiBOVUxMOworfQorCitjaGFyICpnZXRfbW9uaXRvcl9kc29fcGF0aChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbGlicGF0aCkKK3sKKwljaGFyICpwYXRoOworCisJaWYgKCEocGF0aCA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIFBBVEhfTUFYKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZG1ldmVudGQgbGlicmFyeSBwYXRoLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlnZXRfc2hhcmVkX2xpYnJhcnlfcGF0aChjbWQsIGxpYnBhdGgsIHBhdGgsIFBBVEhfTUFYKTsKKworCXJldHVybiBwYXRoOworfQorCitzdGF0aWMgY2hhciAqX2J1aWxkX3RhcmdldF91dWlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IGNoYXIgKmxheWVyOworCisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpCisJCWxheWVyID0gInRwb29sIjsgLyogTW9uaXRvciAidHBvb2wiIGZvciB0aGUgInRoaW4gcG9vbCIuICovCisJZWxzZSBpZiAobHZfaXNfb3JpZ2luKGx2KSkKKwkJbGF5ZXIgPSAicmVhbCI7IC8qIE1vbml0b3IgInJlYWwiIGZvciAic25hcHNob3Qtb3JpZ2luIi4gKi8KKwllbHNlCisJCWxheWVyID0gTlVMTDsKKworCXJldHVybiBidWlsZF9kbV91dWlkKGNtZC0+bWVtLCBsdiwgbGF5ZXIpOworfQorCitpbnQgdGFyZ2V0X3JlZ2lzdGVyZWRfd2l0aF9kbWV2ZW50ZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZHNvLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgKnBlbmRpbmcpCit7CisJY2hhciAqdXVpZDsKKwllbnVtIGRtX2V2ZW50X21hc2sgZXZtYXNrID0gMDsKKwlzdHJ1Y3QgZG1fZXZlbnRfaGFuZGxlciAqZG1ldmg7CisJKnBlbmRpbmcgPSAwOworCisJaWYgKCFkc28pCisJCXJldHVybl8wOworCisJaWYgKCEodXVpZCA9IF9idWlsZF90YXJnZXRfdXVpZChjbWQsIGx2KSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG1ldmggPSBfY3JlYXRlX2RtX2V2ZW50X2hhbmRsZXIoY21kLCB1dWlkLCBkc28sIDAsIERNX0VWRU5UX0FMTF9FUlJPUlMpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZG1fZXZlbnRfZ2V0X3JlZ2lzdGVyZWRfZGV2aWNlKGRtZXZoLCAwKSkgeworCQlkbV9ldmVudF9oYW5kbGVyX2Rlc3Ryb3koZG1ldmgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlldm1hc2sgPSBkbV9ldmVudF9oYW5kbGVyX2dldF9ldmVudF9tYXNrKGRtZXZoKTsKKwlpZiAoZXZtYXNrICYgRE1fRVZFTlRfUkVHSVNUUkFUSU9OX1BFTkRJTkcpIHsKKwkJKnBlbmRpbmcgPSAxOworCQlldm1hc2sgJj0gfkRNX0VWRU5UX1JFR0lTVFJBVElPTl9QRU5ESU5HOworCX0KKworCWRtX2V2ZW50X2hhbmRsZXJfZGVzdHJveShkbWV2aCk7CisKKwlyZXR1cm4gZXZtYXNrOworfQorCitpbnQgdGFyZ2V0X3JlZ2lzdGVyX2V2ZW50cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZHNvLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIGludCBldm1hc2sgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGludCBzZXQsIGludCB0aW1lb3V0KQoreworCWNoYXIgKnV1aWQ7CisJc3RydWN0IGRtX2V2ZW50X2hhbmRsZXIgKmRtZXZoOworCWludCByOworCisJaWYgKCFkc28pCisJCXJldHVybl8wOworCisJLyogV2UgYWx3YXlzIG1vbml0b3IgdGhlICJyZWFsIiBkZXZpY2UsIG5ldmVyIHRoZSAic25hcHNob3Qtb3JpZ2luIiBpdHNlbGYuICovCisJaWYgKCEodXVpZCA9IF9idWlsZF90YXJnZXRfdXVpZChjbWQsIGx2KSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG1ldmggPSBfY3JlYXRlX2RtX2V2ZW50X2hhbmRsZXIoY21kLCB1dWlkLCBkc28sIHRpbWVvdXQsCisJCQkJCSAgICAgICBETV9FVkVOVF9BTExfRVJST1JTIHwgKHRpbWVvdXQgPyBETV9FVkVOVF9USU1FT1VUIDogMCkpKSkKKwkJcmV0dXJuXzA7CisKKwlyID0gc2V0ID8gZG1fZXZlbnRfcmVnaXN0ZXJfaGFuZGxlcihkbWV2aCkgOiBkbV9ldmVudF91bnJlZ2lzdGVyX2hhbmRsZXIoZG1ldmgpOworCisJZG1fZXZlbnRfaGFuZGxlcl9kZXN0cm95KGRtZXZoKTsKKworCWlmICghcikKKwkJcmV0dXJuXzA7CisKKwlsb2dfaW5mbygiJXMgJXMgZm9yIGV2ZW50cyIsIHNldCA/ICJNb25pdG9yZWQiIDogIlVubW9uaXRvcmVkIiwgdXVpZCk7CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIDAgaWYgYW4gYXR0ZW1wdCB0byAodW4pbW9uaXRvciB0aGUgZGV2aWNlIGZhaWxlZC4KKyAqIFJldHVybnMgMSBvdGhlcndpc2UuCisgKi8KK2ludCBtb25pdG9yX2Rldl9mb3JfZXZlbnRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IG1vbml0b3IpCit7CisjaWZkZWYgRE1FVkVOVEQKKwlpbnQgaSwgcGVuZGluZyA9IDAsIG1vbml0b3JlZDsKKwlpbnQgciA9IDE7CisJc3RydWN0IGRtX2xpc3QgKnNuaCwgKnNuaHQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqbG9nX3NlZzsKKwlpbnQgKCptb25pdG9yX2ZuKSAoc3RydWN0IGx2X3NlZ21lbnQgKnMsIGludCBlKTsKKwl1aW50MzJfdCBzOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyB6bGFvcHRzID0geyAwIH07CisJc3RydWN0IGx2aW5mbyBpbmZvOworCisJaWYgKCFsYW9wdHMpCisJCWxhb3B0cyA9ICZ6bGFvcHRzOworCisJLyogc2tpcCBkbWV2ZW50ZCBjb2RlIGFsdG9nZXRoZXIgKi8KKwlpZiAoZG1ldmVudGRfbW9uaXRvcl9tb2RlKCkgPT0gRE1FVkVOVERfTU9OSVRPUl9JR05PUkUpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvIGlmIGRtZXZlbnRkIGNvbmZpZ3VyZWQgbm90IHRvIGJlIHVzZWQuCisJICovCisJaWYgKG1vbml0b3IgJiYgIWRtZXZlbnRkX21vbml0b3JfbW9kZSgpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQWxsb3cgdG8gdW5tb25pdG9yIHRoaW4gcG9vbCB2aWEgZXhwbGljaXQgcG9vbCB1bm1vbml0b3IKKwkgKiBvciB1bm1vbml0b3IgYmVmb3JlIHRoZSBsYXN0IHRoaW4gcG9vbCB1c2VyIGRlYWN0aXZhdGlvbgorCSAqIFNraXAgdW5tb25pdG9yLCBpZiBpbnZva2VkIHZpYSBkZWFjdGl2YXRpb24gb2YgdGhpbiB2b2x1bWUKKwkgKiBhbmQgdGhlcmUgaXMgYW5vdGhlciB0aGluIHBvb2wgdXNlciAob3Blbl9jb3VudCA+IDEpCisJICogRklYTUUgIHRoaW5rIGFib3V0IHdhdGNoIHJ1bGVyIGluZmx1ZW5jZS4KKwkgKi8KKwlpZiAobGFvcHRzLT5za2lwX2luX3VzZSAmJiBsdl9pc190aGluX3Bvb2wobHYpICYmCisJICAgIGx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAxLCAmaW5mbywgMSwgMCkgJiYgKGluZm8ub3Blbl9jb3VudCA+IDEpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJTa2lwcGluZyB1bm1vbml0b3Igb2Ygb3BlbmVkICVzIChvcGVuOiVkKSIsCisJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdiksIGluZm8ub3Blbl9jb3VudCk7CisJCXJldHVybiAxOworCX0KKworCS8qIERvIG5vdCBtb25pdG9yIHNuYXBzaG90IHRoYXQgYWxyZWFkeSBjb3ZlcnMgb3JpZ2luICovCisJaWYgKG1vbml0b3IgJiYgbHZfaXNfY293X2NvdmVyaW5nX29yaWdpbihsdikpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlNraXBwaW5nIG1vbml0b3Igb2Ygc25hcHNob3QgbGFyZ2VyICIKKwkJCQkgICAgICJ0aGVuIG9yaWdpbiAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgYSBzbmFwc2hvdCBkZXZpY2UsIHdlIG1vbml0b3IgbHYtPnNuYXBzaG90LT5sdiwKKwkgKiBub3QgdGhlIGFjdHVhbCBMViBpdHNlbGYuCisJICovCisJaWYgKGx2X2lzX2NvdyhsdikgJiYgKGxhb3B0cy0+bm9fbWVyZ2luZyB8fCAhbHZfaXNfbWVyZ2luZ19jb3cobHYpKSkgeworCQlpZiAoIShyID0gbW9uaXRvcl9kZXZfZm9yX2V2ZW50cyhjbWQsIGx2LT5zbmFwc2hvdC0+bHYsIE5VTEwsIG1vbml0b3IpKSkKKwkJCXN0YWNrOworCQlyZXR1cm4gcjsKKwl9CisKKwkvKgorCSAqIEluIGNhc2UgdGhpcyBMViBpcyBhIHNuYXBzaG90IG9yaWdpbiwgd2UgaW5zdGVhZCBtb25pdG9yCisJICogZWFjaCBvZiBpdHMgcmVzcGVjdGl2ZSBzbmFwc2hvdHMuICBUaGUgb3JpZ2luIGl0c2VsZiBtYXkKKwkgKiBhbHNvIG5lZWQgdG8gYmUgbW9uaXRvcmVkIGlmIGl0IGlzIGEgbWlycm9yLCBmb3IgZXhhbXBsZS4KKwkgKi8KKwlpZiAoIWxhb3B0cy0+b3JpZ2luX29ubHkgJiYgbHZfaXNfb3JpZ2luKGx2KSkKKwkJZG1fbGlzdF9pdGVyYXRlX3NhZmUoc25oLCBzbmh0LCAmbHYtPnNuYXBzaG90X3NlZ3MpCisJCQlpZiAoIW1vbml0b3JfZGV2X2Zvcl9ldmVudHMoY21kLCBkbV9saXN0X3N0cnVjdF9iYXNlKHNuaCwKKwkJCQlzdHJ1Y3QgbHZfc2VnbWVudCwgb3JpZ2luX2xpc3QpLT5jb3csIE5VTEwsIG1vbml0b3IpKSB7CisJCQkJc3RhY2s7CisJCQkJciA9IDA7CisJCQl9CisKKwkvKgorCSAqIElmIHRoZSB2b2x1bWUgaXMgbWlycm9yZWQgYW5kIGl0cyBsb2cgaXMgYWxzbyBtaXJyb3JlZCwgbW9uaXRvcgorCSAqIHRoZSBsb2cgdm9sdW1lIGFzIHdlbGwuCisJICovCisJaWYgKChzZWcgPSBmaXJzdF9zZWcobHYpKSAhPSBOVUxMICYmIHNlZy0+bG9nX2x2ICE9IE5VTEwgJiYKKwkgICAgKGxvZ19zZWcgPSBmaXJzdF9zZWcoc2VnLT5sb2dfbHYpKSAhPSBOVUxMICYmCisJICAgIHNlZ19pc19taXJyb3JlZChsb2dfc2VnKSkKKwkJaWYgKCFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgc2VnLT5sb2dfbHYsIE5VTEwsIG1vbml0b3IpKSB7CisJCQlzdGFjazsKKwkJCXIgPSAwOworCQl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCS8qIFJlY3Vyc2UgZm9yIEFSRUFfTFYgKi8KKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSAhPSBBUkVBX0xWKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgc2VnX2x2KHNlZywgcyksIE5VTEwsCisJCQkJCQkgICAgbW9uaXRvcikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byAlc21vbml0b3IgJXMiLAorCQkJCQkgIG1vbml0b3IgPyAiIiA6ICJ1biIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUoc2VnX2x2KHNlZywgcykpKTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHJlcXVlc3RlZCB1bm1vbml0b3Jpbmcgb2YgdGhpbiB2b2x1bWUsIHByZXNlcnZlIHNraXBfaW5fdXNlIGZsYWcuCisJCSAqCisJCSAqIEZJWE1FOiBjb2RlIGhlcmUgbG9va3MgbGlrZSBfbHZfcG9zdG9yZGVyKCkKKwkJICovCisJCWlmIChzZWctPnBvb2xfbHYgJiYKKwkJICAgICFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgc2VnLT5wb29sX2x2LAorCQkJCQkgICAgKCFtb25pdG9yKSA/IGxhb3B0cyA6IE5VTEwsIG1vbml0b3IpKSB7CisJCQlzdGFjazsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKHNlZy0+bWV0YWRhdGFfbHYgJiYKKwkJICAgICFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgc2VnLT5tZXRhZGF0YV9sdiwgTlVMTCwgbW9uaXRvcikpIHsKKwkJCXN0YWNrOworCQkJciA9IDA7CisJCX0KKworCQlpZiAoIXNlZ19tb25pdG9yZWQoc2VnKSB8fAorCQkgICAgKHNlZy0+c3RhdHVzICYgUFZNT1ZFKSB8fAorCQkgICAgIXNlZy0+c2VndHlwZS0+b3BzLT50YXJnZXRfbW9uaXRvcmVkKSAvKiBkb2Vzbid0IHN1cHBvcnQgcmVnaXN0cmF0aW9uICovCisJCQljb250aW51ZTsKKworCQltb25pdG9yZWQgPSBzZWctPnNlZ3R5cGUtPm9wcy0+dGFyZ2V0X21vbml0b3JlZChzZWcsICZwZW5kaW5nKTsKKworCQkvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSB0cnkgYWdhaW4gaWYgcGVuZGluZyAqLworCQltb25pdG9yZWQgPSAocGVuZGluZykgPyAwIDogbW9uaXRvcmVkOworCisJCW1vbml0b3JfZm4gPSBOVUxMOworCisJCWlmIChtb25pdG9yKSB7CisJCQlpZiAobW9uaXRvcmVkKQorCQkJCWxvZ192ZXJib3NlKCIlcyBhbHJlYWR5IG1vbml0b3JlZC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJZWxzZSBpZiAoc2VnLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9tb25pdG9yX2V2ZW50cykKKwkJCQltb25pdG9yX2ZuID0gc2VnLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9tb25pdG9yX2V2ZW50czsKKwkJfSBlbHNlIHsKKwkJCWlmICghbW9uaXRvcmVkKQorCQkJCWxvZ192ZXJib3NlKCIlcyBhbHJlYWR5IG5vdCBtb25pdG9yZWQuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWVsc2UgaWYgKHNlZy0+c2VndHlwZS0+b3BzLT50YXJnZXRfdW5tb25pdG9yX2V2ZW50cykKKwkJCQltb25pdG9yX2ZuID0gc2VnLT5zZWd0eXBlLT5vcHMtPnRhcmdldF91bm1vbml0b3JfZXZlbnRzOworCQl9CisKKwkJLyogRG8gW3VuXW1vbml0b3IgKi8KKwkJaWYgKCFtb25pdG9yX2ZuKQorCQkJY29udGludWU7CisKKwkJbG9nX3ZlcmJvc2UoIiVzb25pdG9yaW5nICVzJXMiLCBtb25pdG9yID8gIk0iIDogIk5vdCBtIiwgZGlzcGxheV9sdm5hbWUobHYpLAorCQkJICAgIHRlc3RfbW9kZSgpID8gIiBbVGVzdCBtb2RlOiBza2lwcGluZyB0aGlzXSIgOiAiIik7CisKKwkJLyogRklYTUUgVGVzdCBtb2RlIHNob3VsZCByZWFsbHkgY29udGludWUgYSBiaXQgZnVydGhlci4gKi8KKwkJaWYgKHRlc3RfbW9kZSgpKQorCQkJY29udGludWU7CisKKwkJLyogRklYTUUgc3BlY2lmeSBldmVudHMgKi8KKwkJaWYgKCFtb25pdG9yX2ZuKHNlZywgMCkpIHsKKwkJCWxvZ19lcnJvcigiJXM6ICVzIHNlZ21lbnQgbW9uaXRvcmluZyBmdW5jdGlvbiBmYWlsZWQuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgc2VnLT5zZWd0eXBlLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogQ2hlY2sgW3VuXW1vbml0b3IgcmVzdWx0cyAqLworCQkvKiBUcnkgYSBjb3VwbGUgdGltZXMgaWYgcGVuZGluZywgYnV0IG5vdCBmb3JldmVyLi4uICovCisJCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKSB7CisJCQlwZW5kaW5nID0gMDsKKwkJCW1vbml0b3JlZCA9IHNlZy0+c2VndHlwZS0+b3BzLT50YXJnZXRfbW9uaXRvcmVkKHNlZywgJnBlbmRpbmcpOworCQkJaWYgKHBlbmRpbmcgfHwKKwkJCSAgICAoIW1vbml0b3JlZCAmJiBtb25pdG9yKSB8fAorCQkJICAgIChtb25pdG9yZWQgJiYgIW1vbml0b3IpKQorCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzICVzbW9uaXRvcmluZyBzdGlsbCBwZW5kaW5nOiB3YWl0aW5nLi4uIiwKKwkJCQkJCSBkaXNwbGF5X2x2bmFtZShsdiksIG1vbml0b3IgPyAiIiA6ICJ1biIpOworCQkJZWxzZQorCQkJCWJyZWFrOworCQkJdXNsZWVwKDEwMDAwICogaSk7CisJCX0KKworCQlpZiAocikKKwkJCXIgPSAobW9uaXRvcmVkICYmIG1vbml0b3IpIHx8ICghbW9uaXRvcmVkICYmICFtb25pdG9yKTsKKwl9CisKKwlpZiAoIXIgJiYgIWVycm9yX21lc3NhZ2VfcHJvZHVjZWQoKSkKKwkJbG9nX2Vycm9yKCIlc29uaXRvcmluZyAlcyBmYWlsZWQuIiwgbW9uaXRvciA/ICJNIiA6ICJOb3QgbSIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJcmV0dXJuIHI7CisjZWxzZQorCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0cnVjdCBkZXRhY2hlZF9sdl9kYXRhIHsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3ByZTsKKwlzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzOworCWludCAqZmx1c2hfcmVxdWlyZWQ7Cit9OworCitzdGF0aWMgaW50IF9wcmVsb2FkX2RldGFjaGVkX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldGFjaGVkX2x2X2RhdGEgKmRldGFjaGVkID0gZGF0YTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3ByZTsKKworCS8qIENoZWNrIGFuZCBwcmVsb2FkIHJlbW92ZWQgcmFpZCBpbWFnZSBsZWcgb3IgbWV0YWRhdGEgKi8KKwlpZiAobHZfaXNfcmFpZF9pbWFnZShsdikpIHsKKwkJaWYgKChsdl9wcmUgPSBmaW5kX2x2X2luX3ZnX2J5X2x2aWQoZGV0YWNoZWQtPmx2X3ByZS0+dmcsICZsdi0+bHZpZCkpICYmCisJCSAgICAhbHZfaXNfcmFpZF9pbWFnZShsdl9wcmUpICYmIGx2X2lzX2FjdGl2ZShsdikgJiYKKwkJICAgICFfbHZfcHJlbG9hZChsdl9wcmUsIGRldGFjaGVkLT5sYW9wdHMsIGRldGFjaGVkLT5mbHVzaF9yZXF1aXJlZCkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpKSB7CisJCWlmICgobHZfcHJlID0gZmluZF9sdl9pbl92Z19ieV9sdmlkKGRldGFjaGVkLT5sdl9wcmUtPnZnLCAmbHYtPmx2aWQpKSAmJgorCQkgICAgIWx2X2lzX3JhaWRfbWV0YWRhdGEobHZfcHJlKSAmJiBsdl9pc19hY3RpdmUobHYpICYmCisJCSAgICAhX2x2X3ByZWxvYWQobHZfcHJlLCBkZXRhY2hlZC0+bGFvcHRzLCBkZXRhY2hlZC0+Zmx1c2hfcmVxdWlyZWQpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogRklYTUU6IGNvbmRpdGlvbiBoZXJlIHNob3VsZCBiZSBmYXIgbW9yZSBsaW1pdGluZyB0byByZWFsbHkKKwkgKiAgICAgICAgZGV0ZWN0IGRldGFjaGVkIExWcyAqLworCWlmICgobHZfcHJlID0gZmluZF9sdihkZXRhY2hlZC0+bHZfcHJlLT52ZywgbHYtPm5hbWUpKSkgeworCQlpZiAobHZfaXNfdmlzaWJsZShsdl9wcmUpICYmIGx2X2lzX2FjdGl2ZShsdikgJiYKKwkJICAgICFsdl9pc19wb29sKGx2KSAmJgorCQkgICAgKCFsdl9pc19jb3cobHYpIHx8ICFsdl9pc19jb3cobHZfcHJlKSkgJiYKKwkJICAgICFfbHZfcHJlbG9hZChsdl9wcmUsIGRldGFjaGVkLT5sYW9wdHMsIGRldGFjaGVkLT5mbHVzaF9yZXF1aXJlZCkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZfc3VzcGVuZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLAorCQkgICAgICAgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IGVycm9yX2lmX25vdF9zdXNwZW5kZWQsCisJICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9wcmUpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwdm1vdmVfbHYgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfdG9fZnJlZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9wcmVfdG9fZnJlZSA9IE5VTEw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9wcmVfdG1wOworCXN0cnVjdCBzZWdfbGlzdCAqc2w7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNuYXBfc2VnOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlpbnQgciA9IDAsIGxvY2tmcyA9IDAsIGZsdXNoX3JlcXVpcmVkID0gMDsKKwlzdHJ1Y3QgZGV0YWNoZWRfbHZfZGF0YSBkZXRhY2hlZDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMTsKKworCS8qIGx2IGNvbWVzIGZyb20gY29tbWl0dGVkIG1ldGFkYXRhICovCisJaWYgKCFsdiAmJiAhKGx2X3RvX2ZyZWUgPSBsdiA9IGx2X2Zyb21fbHZpZChjbWQsIGx2aWRfcywgMCkpKQorCQlnb3RvX291dDsKKworCS8qIFVzZSBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaWYgcHJlc2VudCAqLworCWlmICghbHZfcHJlICYmICEobHZfcHJlX3RvX2ZyZWUgPSBsdl9wcmUgPSBsdl9mcm9tX2x2aWQoY21kLCBsdmlkX3MsIDEpKSkKKwkJZ290b19vdXQ7CisKKwkvKiBJZ25vcmUgb3JpZ2luX29ubHkgdW5sZXNzIExWIGlzIG9yaWdpbiBpbiBib3RoIG9sZCBhbmQgbmV3IG1ldGFkYXRhICovCisJLyogb3IgTFYgaXMgdGhpbiBvciB0aGluIHBvb2wgdm9sdW1lICovCisJaWYgKCFsdl9pc190aGluX3ZvbHVtZShsdikgJiYgIWx2X2lzX3RoaW5fcG9vbChsdikgJiYKKwkgICAgIShsdl9pc19vcmlnaW4obHYpICYmIGx2X2lzX29yaWdpbihsdl9wcmUpKSkKKwkJbGFvcHRzLT5vcmlnaW5fb25seSA9IDA7CisKKwlpZiAodGVzdF9tb2RlKCkpIHsKKwkJX3NraXAoIlN1c3BlbmRpbmcgJXMlcy4iLCBkaXNwbGF5X2x2bmFtZShsdiksCisJCSAgICAgIGxhb3B0cy0+b3JpZ2luX29ubHkgPyAiIG9yaWdpbiB3aXRob3V0IHNuYXBzaG90cyIgOiAiIik7CisJCXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWx2X2luZm8oY21kLCBsdiwgbGFvcHRzLT5vcmlnaW5fb25seSwgJmluZm8sIDAsIDApKQorCQlnb3RvX291dDsKKworCWlmICghaW5mby5leGlzdHMgfHwgaW5mby5zdXNwZW5kZWQpIHsKKwkJaWYgKCFlcnJvcl9pZl9ub3Rfc3VzcGVuZGVkKSB7CisJCQlyID0gMTsKKwkJCWlmIChpbmZvLnN1c3BlbmRlZCkKKwkJCQljcml0aWNhbF9zZWN0aW9uX2luYyhjbWQsICJhbHJlYWR5IHN1c3BlbmRlZCIpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbHZfcmVhZF9yZXBsaWNhdG9yX3ZncyhsdikpCisJCWdvdG9fb3V0OworCisJbHZfY2FsY3VsYXRlX3JlYWRhaGVhZChsdiwgTlVMTCk7CisKKwkvKgorCSAqIFByZWxvYWQgZGV2aWNlcyBmb3IgdGhlIExWLgorCSAqIElmIHRoZSBQVk1PVkUgTFYgaXMgYmVpbmcgcmVtb3ZlZCwgaXQncyBvbmx5IHByZXNlbnQgaW4gdGhlIG9sZAorCSAqIG1ldGFkYXRhIGFuZCBub3QgdGhlIG5ldywgc28gd2UgbXVzdCBleHBsaWNpdGx5IGFkZCB0aGUgbmV3CisJICogdGFibGVzIGZvciBhbGwgdGhlIGNoYW5nZWQgTFZzIGhlcmUsIGFzIHRoZSByZWxhdGlvbnNoaXBzCisJICogYXJlIG5vdCBmb3VuZCBieSB3YWxraW5nIHRoZSBuZXcgbWV0YWRhdGEuCisJICovCisJaWYgKGx2X2lzX2xvY2tlZChsdikgJiYgIWx2X2lzX2xvY2tlZChsdl9wcmUpICYmCisJICAgIChwdm1vdmVfbHYgPSBmaW5kX3B2bW92ZV9sdl9pbl9sdihsdikpKSB7CisJCS8qIFByZWxvYWQgYWxsIHRoZSBMVnMgYWJvdmUgdGhlIFBWTU9WRSBMViAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZwdm1vdmVfbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikgeworCQkJaWYgKCEobHZfcHJlX3RtcCA9IGZpbmRfbHYobHZfcHJlLT52Zywgc2wtPnNlZy0+bHYtPm5hbWUpKSkgeworCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgbWlzc2luZyBmcm9tIHByZWxvYWQgbWV0YWRhdGEuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShzbC0+c2VnLT5sdikpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKCFfbHZfcHJlbG9hZChsdl9wcmVfdG1wLCBsYW9wdHMsICZmbHVzaF9yZXF1aXJlZCkpCisJCQkJZ290b19vdXQ7CisJCX0KKwkJLyogTm93IHByZWxvYWQgdGhlIFBWTU9WRSBMViBpdHNlbGYgKi8KKwkJaWYgKCEobHZfcHJlX3RtcCA9IGZpbmRfbHYobHZfcHJlLT52ZywgcHZtb3ZlX2x2LT5uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgbWlzc2luZyBmcm9tIHByZWxvYWQgbWV0YWRhdGEuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHB2bW92ZV9sdikpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFfbHZfcHJlbG9hZChsdl9wcmVfdG1wLCBsYW9wdHMsICZmbHVzaF9yZXF1aXJlZCkpCisJCQlnb3RvX291dDsKKwl9IGVsc2UgeworCQlpZiAoIV9sdl9wcmVsb2FkKGx2X3ByZSwgbGFvcHRzLCAmZmx1c2hfcmVxdWlyZWQpKQorCQkJLyogRklYTUUgUmV2ZXJ0IHByZWxvYWRpbmcgKi8KKwkJCWdvdG9fb3V0OworCisJCS8qCisJCSAqIFNlYXJjaCBmb3IgZXhpc3RpbmcgTFZzIHRoYXQgaGF2ZSBiZWNvbWUgZGV0YWNoZWQgYW5kIHByZWxvYWQgdGhlbS4KKwkJICovCisJCWRldGFjaGVkLmx2X3ByZSA9IGx2X3ByZTsKKwkJZGV0YWNoZWQubGFvcHRzID0gbGFvcHRzOworCQlkZXRhY2hlZC5mbHVzaF9yZXF1aXJlZCA9ICZmbHVzaF9yZXF1aXJlZDsKKworCQlpZiAoIWZvcl9lYWNoX3N1Yl9sdigoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopbHYsICZfcHJlbG9hZF9kZXRhY2hlZF9sdiwgJmRldGFjaGVkKSkKKwkJCWdvdG9fb3V0OworCisJCS8qCisJCSAqIFByZWxvYWQgYW55IHNuYXBzaG90cyB0aGF0IGFyZSBiZWluZyByZW1vdmVkLgorCQkgKi8KKwkJaWYgKCFsYW9wdHMtPm9yaWdpbl9vbmx5ICYmIGx2X2lzX29yaWdpbihsdikpIHsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4oc25hcF9zZWcsICZsdi0+c25hcHNob3Rfc2Vncywgb3JpZ2luX2xpc3QpIHsKKwkJCQlpZiAoIShsdl9wcmVfdG1wID0gZmluZF9sdl9pbl92Z19ieV9sdmlkKGx2X3ByZS0+dmcsICZzbmFwX3NlZy0+Y293LT5sdmlkKSkpIHsKKwkJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyAoJXMpIG1pc3NpbmcgZnJvbSBwcmVsb2FkIG1ldGFkYXRhLiIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKHNuYXBfc2VnLT5jb3cpLAorCQkJCQkJICBzbmFwX3NlZy0+Y293LT5sdmlkLmlkWzFdLnV1aWQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCFsdl9pc19jb3cobHZfcHJlX3RtcCkgJiYKKwkJCQkgICAgIV9sdl9wcmVsb2FkKGx2X3ByZV90bXAsIGxhb3B0cywgJmZsdXNoX3JlcXVpcmVkKSkKKwkJCQkJZ290b19vdXQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGbHVzaCBpcyBBVE0gcmVxdWlyZWQgZm9yIHRoZSB0ZXN0ZWQgY2FzZXMKKwkgKiBOT1RFOiBNaXJyb3IgcmVwYWlyIHJlcXVpcmVzIG5vZmx1c2ggZm9yIHByb3BlciByZXBhaXIhCisJICogVE9ETzogUmVsYXggdGhpcyBsaW1pdGluZyBjb25kaXRpb24gZnVydGhlciAqLworCWlmICghZmx1c2hfcmVxdWlyZWQgJiYKKwkgICAgKGx2X2lzX3B2bW92ZShsdikgfHwKKwkgICAgICghbHZfaXNfbWlycm9yKGx2KSAmJiAhbHZfaXNfdGhpbl9wb29sKGx2KSAmJiAhbHZfaXNfdGhpbl92b2x1bWUobHYpKSkpIHsKKwkJbG9nX2RlYnVnKCJSZXF1aXJpbmcgZmx1c2ggZm9yIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWZsdXNoX3JlcXVpcmVkID0gMTsKKwl9CisKKwlpZiAoIW1vbml0b3JfZGV2X2Zvcl9ldmVudHMoY21kLCBsdiwgbGFvcHRzLCAwKSkKKwkJLyogRklYTUUgQ29uc2lkZXIgYWJvcnRpbmcgaGVyZSAqLworCQlzdGFjazsKKworCWNyaXRpY2FsX3NlY3Rpb25faW5jKGNtZCwgInN1c3BlbmRpbmciKTsKKwlpZiAocHZtb3ZlX2x2KQorCQljcml0aWNhbF9zZWN0aW9uX2luYyhjbWQsICJzdXNwZW5kaW5nIHB2bW92ZSBMViIpOworCisJaWYgKCFsYW9wdHMtPm9yaWdpbl9vbmx5ICYmCisJICAgIChsdl9pc19vcmlnaW4obHZfcHJlKSB8fCBsdl9pc19jb3cobHZfcHJlKSkpCisJCWxvY2tmcyA9IDE7CisKKwkvKiBDb252ZXJ0aW5nIG5vbi10aGluIExWIHRvIHRoaW4gZXh0ZXJuYWwgb3JpZ2luID8gKi8KKwlpZiAoIWx2X2lzX3RoaW5fdm9sdW1lKGx2KSAmJiBsdl9pc190aGluX3ZvbHVtZShsdl9wcmUpKQorCQlsb2NrZnMgPSAxOyAvKiBTeW5jIGJlZm9yZSBjb252ZXJzaW9uICovCisKKwlpZiAobGFvcHRzLT5vcmlnaW5fb25seSAmJiBsdl9pc190aGluX3ZvbHVtZShsdikgJiYgbHZfaXNfdGhpbl92b2x1bWUobHZfcHJlKSkKKwkJbG9ja2ZzID0gMTsKKworCS8qCisJICogU3VzcGVuZGluZyBhbiBMViBkaXJlY3RseSBhYm92ZSBhIFBWTU9WRSBMViBhbHNvCisgCSAqIHN1c3BlbmRzIG90aGVyIExWcyB1c2luZyB0aGF0IHNhbWUgUFZNT1ZFIExWLgorCSAqIEZJWE1FIFJlbW92ZSB0aGlzIGFuZCBkZWxheSB0aGUgJ2NsZWFyIG5vZGUnIHVudGlsCisgCSAqIGFmdGVyIHRoZSBjb2RlIGtub3dzIHdoZXRoZXIgdGhlcmUncyBhIGRpZmZlcmVudAorIAkgKiBpbmFjdGl2ZSB0YWJsZSB0byBsb2FkIG9yIG5vdCBpbnN0ZWFkIHNvIGx2X3N1c3BlbmQKKyAJICogY2FuIGJlIGNhbGxlZCBzZXBhcmF0ZWx5IGZvciBlYWNoIExWIHNhZmVseS4KKyAJICovCisJaWYgKChsdl9wcmUtPnZnLT5zdGF0dXMgJiBQUkVDT01NSVRURUQpICYmCisJICAgIGx2X2lzX2xvY2tlZChsdl9wcmUpICYmIGZpbmRfcHZtb3ZlX2x2X2luX2x2KGx2X3ByZSkpIHsKKwkJaWYgKCFfbHZfc3VzcGVuZF9sdihsdl9wcmUsIGxhb3B0cywgbG9ja2ZzLCBmbHVzaF9yZXF1aXJlZCkpIHsKKwkJCWNyaXRpY2FsX3NlY3Rpb25fZGVjKGNtZCwgImZhaWxlZCBwcmVjb21taXR0ZWQgc3VzcGVuZCIpOworCQkJaWYgKHB2bW92ZV9sdikKKwkJCQljcml0aWNhbF9zZWN0aW9uX2RlYyhjbWQsICJmYWlsZWQgcHJlY29tbWl0dGVkIHN1c3BlbmQgKHB2bW92ZSkiKTsKKwkJCWdvdG9fb3V0OworCQl9CisJfSBlbHNlIHsKKwkJLyogTm9ybWFsIHN1c3BlbmQgKi8KKwkJaWYgKCFfbHZfc3VzcGVuZF9sdihsdiwgbGFvcHRzLCBsb2NrZnMsIGZsdXNoX3JlcXVpcmVkKSkgeworCQkJY3JpdGljYWxfc2VjdGlvbl9kZWMoY21kLCAiZmFpbGVkIHN1c3BlbmQiKTsKKwkJCWlmIChwdm1vdmVfbHYpCisJCQkJY3JpdGljYWxfc2VjdGlvbl9kZWMoY21kLCAiZmFpbGVkIHN1c3BlbmQgKHB2bW92ZSkiKTsKKwkJCWdvdG9fb3V0OworCQl9CisJfQorCisJciA9IDE7CitvdXQ6CisJaWYgKGx2X3ByZV90b19mcmVlKQorCQlyZWxlYXNlX3ZnKGx2X3ByZV90b19mcmVlLT52Zyk7CisJaWYgKGx2X3RvX2ZyZWUpIHsKKwkJbHZfcmVsZWFzZV9yZXBsaWNhdG9yX3Zncyhsdl90b19mcmVlKTsKKwkJcmVsZWFzZV92Zyhsdl90b19mcmVlLT52Zyk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBJbiBhIGNsdXN0ZXIsIHNldCBleGNsdXNpdmUgdG8gaW5kaWNhdGUgdGhhdCBvbmx5IG9uZSBub2RlIGlzIHVzaW5nIHRoZQorICogZGV2aWNlLiAgQW55IHByZWxvYWRlZCB0YWJsZXMgbWF5IHRoZW4gdXNlIG5vbi1jbHVzdGVyZWQgdGFyZ2V0cy4KKyAqCisgKiBSZXR1cm5zIHN1Y2Nlc3MgaWYgdGhlIGRldmljZSBpcyBub3QgYWN0aXZlCisgKi8KK2ludCBsdl9zdXNwZW5kX2lmX2FjdGl2ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLCB1bnNpZ25lZCBvcmlnaW5fb25seSwgdW5zaWduZWQgZXhjbHVzaXZlLAorCQkJIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfcHJlKQoreworCXN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzIGxhb3B0cyA9IHsKKwkJLm9yaWdpbl9vbmx5ID0gb3JpZ2luX29ubHksCisJCS5leGNsdXNpdmUgPSBleGNsdXNpdmUKKwl9OworCisJcmV0dXJuIF9sdl9zdXNwZW5kKGNtZCwgbHZpZF9zLCAmbGFvcHRzLCAwLCBsdiwgbHZfcHJlKTsKK30KKworCitzdGF0aWMgaW50IF9sdl9yZXN1bWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywKKwkJICAgICAgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IGVycm9yX2lmX25vdF9hY3RpdmUsCisJICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfdG9fZnJlZSA9IE5VTEw7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCWludCByID0gMDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMTsKKworCWlmICghbHYgJiYgIShsdl90b19mcmVlID0gbHYgPSBsdl9mcm9tX2x2aWQoY21kLCBsdmlkX3MsIDApKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWx2X2lzX29yaWdpbihsdikgJiYgIWx2X2lzX3RoaW5fdm9sdW1lKGx2KSAmJiAhbHZfaXNfdGhpbl9wb29sKGx2KSkKKwkJbGFvcHRzLT5vcmlnaW5fb25seSA9IDA7CisKKwlpZiAodGVzdF9tb2RlKCkpIHsKKwkJX3NraXAoIlJlc3VtaW5nICVzJXMlcy4iLCBkaXNwbGF5X2x2bmFtZShsdiksCisJCSAgICAgIGxhb3B0cy0+b3JpZ2luX29ubHkgPyAiIHdpdGhvdXQgc25hcHNob3RzIiA6ICIiLAorCQkgICAgICBsYW9wdHMtPnJldmVydCA/ICIgKHJldmVydGluZykiIDogIiIpOworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlJlc3VtaW5nIExWICVzJXMlcyVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCSAgICAgZXJyb3JfaWZfbm90X2FjdGl2ZSA/ICIiIDogIiBpZiBhY3RpdmUiLAorCQkJICAgICBsYW9wdHMtPm9yaWdpbl9vbmx5ID8KKwkJCSAgICAgKGx2X2lzX3RoaW5fcG9vbChsdikgPyAiIHBvb2wgb25seSIgOgorCQkJICAgICAgbHZfaXNfdGhpbl92b2x1bWUobHYpID8gIiB0aGluIG9ubHkiIDogIiB3aXRob3V0IHNuYXBzaG90cyIpIDogIiIsCisJCQkgICAgIGxhb3B0cy0+cmV2ZXJ0ID8gIiAocmV2ZXJ0aW5nKSIgOiAiIik7CisKKwlpZiAoIWx2X2luZm8oY21kLCBsdiwgbGFvcHRzLT5vcmlnaW5fb25seSwgJmluZm8sIDAsIDApKQorCQlnb3RvX291dDsKKworCWlmICghaW5mby5leGlzdHMgfHwgIWluZm8uc3VzcGVuZGVkKSB7CisJCWlmIChlcnJvcl9pZl9ub3RfYWN0aXZlKQorCQkJZ290b19vdXQ7CisJCXIgPSAxOworCQlpZiAoIWluZm8uc3VzcGVuZGVkKQorCQkJY3JpdGljYWxfc2VjdGlvbl9kZWMoY21kLCAiYWxyZWFkeSByZXN1bWVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWxhb3B0cy0+cmVhZF9vbmx5ID0gX3Bhc3Nlc19yZWFkb25seV9maWx0ZXIoY21kLCBsdik7CisJbGFvcHRzLT5yZXN1bWluZyA9IDE7CisKKwlpZiAoIV9sdl9hY3RpdmF0ZV9sdihsdiwgbGFvcHRzKSkKKwkJZ290b19vdXQ7CisKKwljcml0aWNhbF9zZWN0aW9uX2RlYyhjbWQsICJyZXN1bWVkIik7CisKKwlpZiAoIW1vbml0b3JfZGV2X2Zvcl9ldmVudHMoY21kLCBsdiwgbGFvcHRzLCAxKSkKKwkJc3RhY2s7CisKKwlyID0gMTsKK291dDoKKwlpZiAobHZfdG9fZnJlZSkKKwkJcmVsZWFzZV92Zyhsdl90b19mcmVlLT52Zyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEluIGEgY2x1c3Rlciwgc2V0IGV4Y2x1c2l2ZSB0byBpbmRpY2F0ZSB0aGF0IG9ubHkgb25lIG5vZGUgaXMgdXNpbmcgdGhlCisgKiBkZXZpY2UuICBBbnkgdGFibGVzIGxvYWRlZCBtYXkgdGhlbiB1c2Ugbm9uLWNsdXN0ZXJlZCB0YXJnZXRzLgorICoKKyAqIEBvcmlnaW5fb25seQorICogQGV4Y2x1c2l2ZSAgIFRoaXMgcGFyYW1ldGVyIG9ubHkgaGFzIGFuIGFmZmVjdCBpbiBjbHVzdGVyLWNvbnRleHQuCisgKiAgICAgICAgICAgICAgSXQgZm9yY2VzIGxvY2FsIHRhcmdldCB0eXBlIHRvIGJlIHVzZWQgKGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICBjbHVzdGVyLWF3YXJlIHR5cGUpLgorICogUmV0dXJucyBzdWNjZXNzIGlmIHRoZSBkZXZpY2UgaXMgbm90IGFjdGl2ZQorICovCitpbnQgbHZfcmVzdW1lX2lmX2FjdGl2ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLAorCQkJdW5zaWduZWQgb3JpZ2luX29ubHksIHVuc2lnbmVkIGV4Y2x1c2l2ZSwKKwkJCXVuc2lnbmVkIHJldmVydCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyBsYW9wdHMgPSB7CisJCS5vcmlnaW5fb25seSA9IG9yaWdpbl9vbmx5LAorCQkuZXhjbHVzaXZlID0gZXhjbHVzaXZlLAorCQkucmV2ZXJ0ID0gcmV2ZXJ0CisJfTsKKworCXJldHVybiBfbHZfcmVzdW1lKGNtZCwgbHZpZF9zLCAmbGFvcHRzLCAwLCBsdik7Cit9CisKK2ludCBsdl9yZXN1bWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywgdW5zaWduZWQgb3JpZ2luX29ubHksCisJICAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyBsYW9wdHMgPSB7IC5vcmlnaW5fb25seSA9IG9yaWdpbl9vbmx5LCB9OworCisJcmV0dXJuIF9sdl9yZXN1bWUoY21kLCBsdmlkX3MsICZsYW9wdHMsIDEsIGx2KTsKK30KKworc3RhdGljIGludCBfbHZfaGFzX29wZW5fc25hcHNob3RzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNuYXBfc2VnOworCWludCByID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4oc25hcF9zZWcsICZsdi0+c25hcHNob3Rfc2Vncywgb3JpZ2luX2xpc3QpCisJCWlmICghbHZfY2hlY2tfbm90X2luX3VzZShzbmFwX3NlZy0+Y293LCAxKSkKKwkJCXIrKzsKKworCWlmIChyKQorCQlsb2dfZXJyb3IoIkxWICVzIGhhcyBvcGVuICVkIHNuYXBzaG90KHMpLCBub3QgZGVhY3RpdmF0aW5nLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgcik7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGx2X2RlYWN0aXZhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3RvX2ZyZWUgPSBOVUxMOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgbGFvcHRzID0geyAuc2tpcF9pbl91c2UgPSAxIH07CisJc3RydWN0IGRtX2xpc3QgKnNuaDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWx2ICYmICEobHZfdG9fZnJlZSA9IGx2ID0gbHZfZnJvbV9sdmlkKGNtZCwgbHZpZF9zLCAwKSkpCisJCWdvdG8gb3V0OworCisJaWYgKHRlc3RfbW9kZSgpKSB7CisJCV9za2lwKCJEZWFjdGl2YXRpbmcgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJEZWFjdGl2YXRpbmcgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCWlmICghbHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFpbmZvLmV4aXN0cykgeworCQlyID0gMTsKKwkJLyogQ2hlY2sgYXR0YWNoZWQgc25hcHNob3Qgc2VnbWVudHMgYXJlIGFsc28gaW5hY3RpdmUgKi8KKwkJZG1fbGlzdF9pdGVyYXRlKHNuaCwgJmx2LT5zbmFwc2hvdF9zZWdzKSB7CisJCQlpZiAoIWx2X2luZm8oY21kLCBkbV9saXN0X3N0cnVjdF9iYXNlKHNuaCwgc3RydWN0IGx2X3NlZ21lbnQsIG9yaWdpbl9saXN0KS0+Y293LAorCQkJCSAgICAgMCwgJmluZm8sIDAsIDApKQorCQkJCWdvdG9fb3V0OworCQkJaWYgKGluZm8uZXhpc3RzKSB7CisJCQkJciA9IDA7IC8qIFNuYXBzaG90IGxlZnQgaW4gdGFibGU/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChsdl9pc192aXNpYmxlKGx2KSB8fCBsdl9pc192aXJ0dWFsX29yaWdpbihsdikgfHwKKwkgICAgbHZfaXNfbWVyZ2luZ190aGluX3NuYXBzaG90KGx2KSkgeworCQlpZiAoIWx2X2NoZWNrX25vdF9pbl91c2UobHYsIDEpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKGx2X2lzX29yaWdpbihsdikgJiYgX2x2X2hhc19vcGVuX3NuYXBzaG90cyhsdikpCisJCQlnb3RvX291dDsKKwl9CisKKwlpZiAoIWx2X3JlYWRfcmVwbGljYXRvcl92Z3MobHYpKQorCQlnb3RvX291dDsKKworCWlmICghbW9uaXRvcl9kZXZfZm9yX2V2ZW50cyhjbWQsIGx2LCAmbGFvcHRzLCAwKSkKKwkJc3RhY2s7CisKKwljcml0aWNhbF9zZWN0aW9uX2luYyhjbWQsICJkZWFjdGl2YXRpbmciKTsKKwlyID0gX2x2X2RlYWN0aXZhdGUobHYpOworCWNyaXRpY2FsX3NlY3Rpb25fZGVjKGNtZCwgImRlYWN0aXZhdGVkIik7CisKKwlpZiAoIWx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDAsIDApIHx8IGluZm8uZXhpc3RzKSB7CisJCS8qIFR1cm4gaW50byBsb2dfZXJyb3IsIGJ1dCB3ZSBkbyBub3QgbG9nIGVycm9yICovCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJEZWFjdGl2YXRlZCB2b2x1bWUgaXMgc3RpbGwgJXMgcHJlc2VudC4iLAorCQkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJciA9IDA7CisJfQorb3V0OgorCWlmIChsdl90b19mcmVlKSB7CisJCWx2X3JlbGVhc2VfcmVwbGljYXRvcl92Z3MobHZfdG9fZnJlZSk7CisJCXJlbGVhc2VfdmcobHZfdG9fZnJlZS0+dmcpOworCX0KKworCXJldHVybiByOworfQorCisvKiBUZXN0IGlmIExWIHBhc3NlcyBmaWx0ZXIgKi8KK2ludCBsdl9hY3RpdmF0aW9uX2ZpbHRlcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLAorCQkJIGludCAqYWN0aXZhdGVfbHYsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl90b19mcmVlID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkgeworCQkqYWN0aXZhdGVfbHYgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWx2ICYmICEobHZfdG9fZnJlZSA9IGx2ID0gbHZfZnJvbV9sdmlkKGNtZCwgbHZpZF9zLCAwKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfcGFzc2VzX2FjdGl2YXRpb25fZmlsdGVyKGNtZCwgbHYpKSB7CisJCWxvZ192ZXJib3NlKCJOb3QgYWN0aXZhdGluZyAlcyBzaW5jZSBpdCBkb2VzIG5vdCBwYXNzICIKKwkJCSAgICAiYWN0aXZhdGlvbiBmaWx0ZXIuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJKmFjdGl2YXRlX2x2ID0gMDsKKwl9IGVsc2UKKwkJKmFjdGl2YXRlX2x2ID0gMTsKKwlyID0gMTsKK291dDoKKwlpZiAobHZfdG9fZnJlZSkKKwkJcmVsZWFzZV92Zyhsdl90b19mcmVlLT52Zyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfbHZfYWN0aXZhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywKKwkJCXN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsIGludCBmaWx0ZXIsCisJICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl90b19mcmVlID0gTlVMTDsKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisJaW50IHIgPSAwOworCisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAxOworCisJaWYgKCFsdiAmJiAhKGx2X3RvX2ZyZWUgPSBsdiA9IGx2X2Zyb21fbHZpZChjbWQsIGx2aWRfcywgMCkpKQorCQlnb3RvIG91dDsKKworCWlmIChmaWx0ZXIgJiYgIV9wYXNzZXNfYWN0aXZhdGlvbl9maWx0ZXIoY21kLCBsdikpIHsKKwkJbG9nX3ZlcmJvc2UoIk5vdCBhY3RpdmF0aW5nICVzIHNpbmNlIGl0IGRvZXMgbm90IHBhc3MgIgorCQkJICAgICJhY3RpdmF0aW9uIGZpbHRlci4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCghbHYtPnZnLT5jbWQtPnBhcnRpYWxfYWN0aXZhdGlvbikgJiYgbHZfaXNfcGFydGlhbChsdikpIHsKKwkJaWYgKCFsdl9pc19yYWlkX3R5cGUobHYpIHx8ICFwYXJ0aWFsX3JhaWRfbHZfc3VwcG9ydHNfZGVncmFkZWRfYWN0aXZhdGlvbihsdikpIHsKKwkJCWxvZ19lcnJvcigiUmVmdXNpbmcgYWN0aXZhdGlvbiBvZiBwYXJ0aWFsIExWICVzLiAgIgorCQkJCSAgIlVzZSAnLS1hY3RpdmF0aW9ubW9kZSBwYXJ0aWFsJyB0byBvdmVycmlkZS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFsdi0+dmctPmNtZC0+ZGVncmFkZWRfYWN0aXZhdGlvbikgeworCQkJbG9nX2Vycm9yKCJSZWZ1c2luZyBhY3RpdmF0aW9uIG9mIHBhcnRpYWwgTFYgJXMuICAiCisJCQkJICAiVHJ5ICctLWFjdGl2YXRpb25tb2RlIGRlZ3JhZGVkJy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGx2X2hhc191bmtub3duX3NlZ21lbnRzKGx2KSkgeworCQlsb2dfZXJyb3IoIlJlZnVzaW5nIGFjdGl2YXRpb24gb2YgTFYgJXMgY29udGFpbmluZyAiCisJCQkgICJhbiB1bnJlY29nbmlzZWQgc2VnbWVudC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIGNtaXJyb3JkIGlzIHJ1bm5pbmcgZm9yIGNsdXN0ZXJlZCBtaXJyb3JzLgorCSAqLworCWlmICghbGFvcHRzLT5leGNsdXNpdmUgJiYgdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykgJiYKKwkgICAgbHZfaXNfbWlycm9yKGx2KSAmJiAhbHZfaXNfcmFpZChsdikgJiYKKwkgICAgIWNsdXN0ZXJfbWlycm9yX2lzX2F2YWlsYWJsZShsdi0+dmctPmNtZCkpIHsKKwkJbG9nX2Vycm9yKCJTaGFyZWQgY2x1c3RlciBtaXJyb3JzIGFyZSBub3QgYXZhaWxhYmxlLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGVzdF9tb2RlKCkpIHsKKwkJX3NraXAoIkFjdGl2YXRpbmcgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChmaWx0ZXIpCisJCWxhb3B0cy0+cmVhZF9vbmx5ID0gX3Bhc3Nlc19yZWFkb25seV9maWx0ZXIoY21kLCBsdik7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQWN0aXZhdGluZyAlcyVzJXMlcyVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCSAgICAgbGFvcHRzLT5leGNsdXNpdmUgPyAiIGV4Y2x1c2l2ZWx5IiA6ICIiLAorCQkJICAgICBsYW9wdHMtPnJlYWRfb25seSA/ICIgcmVhZC1vbmx5IiA6ICIiLAorCQkJICAgICBsYW9wdHMtPm5vc2NhbiA/ICIgbm9zY2FuIiA6ICIiLAorCQkJICAgICBsYW9wdHMtPnRlbXBvcmFyeSA/ICIgdGVtcG9yYXJ5IiA6ICIiKTsKKworCWlmICghbHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkpCisJCWdvdG9fb3V0OworCisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvPworCSAqLworCWlmIChpbmZvLmV4aXN0cyAmJiAhaW5mby5zdXNwZW5kZWQgJiYgaW5mby5saXZlX3RhYmxlICYmCisJICAgIChpbmZvLnJlYWRfb25seSA9PSByZWFkX29ubHlfbHYobHYsIGxhb3B0cykpKSB7CisJCXIgPSAxOworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiTFYgJXMgaXMgYWxyZWFkeSBhY3RpdmUuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFsdl9yZWFkX3JlcGxpY2F0b3JfdmdzKGx2KSkKKwkJZ290b19vdXQ7CisKKwlsdl9jYWxjdWxhdGVfcmVhZGFoZWFkKGx2LCBOVUxMKTsKKworCWNyaXRpY2FsX3NlY3Rpb25faW5jKGNtZCwgImFjdGl2YXRpbmciKTsKKwlpZiAoIShyID0gX2x2X2FjdGl2YXRlX2x2KGx2LCBsYW9wdHMpKSkKKwkJc3RhY2s7CisJY3JpdGljYWxfc2VjdGlvbl9kZWMoY21kLCAiYWN0aXZhdGVkIik7CisKKwlpZiAociAmJiAhbW9uaXRvcl9kZXZfZm9yX2V2ZW50cyhjbWQsIGx2LCBsYW9wdHMsIDEpKQorCQlzdGFjazsKKworb3V0OgorCWlmIChsdl90b19mcmVlKSB7CisJCWx2X3JlbGVhc2VfcmVwbGljYXRvcl92Z3MobHZfdG9fZnJlZSk7CisJCXJlbGVhc2VfdmcobHZfdG9fZnJlZS0+dmcpOworCX0KKworCXJldHVybiByOworfQorCisvKiBBY3RpdmF0ZSBMViAqLworaW50IGx2X2FjdGl2YXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCBleGNsdXNpdmUsCisJCWludCBub3NjYW4sIGludCB0ZW1wb3JhcnksIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgbGFvcHRzID0geyAuZXhjbHVzaXZlID0gZXhjbHVzaXZlLAorCQkJCQkgICAubm9zY2FuID0gbm9zY2FuLAorCQkJCQkgICAudGVtcG9yYXJ5ID0gdGVtcG9yYXJ5IH07CisKKwlpZiAoIV9sdl9hY3RpdmF0ZShjbWQsIGx2aWRfcywgJmxhb3B0cywgMCwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKiBBY3RpdmF0ZSBMViBvbmx5IGlmIGl0IHBhc3NlcyBmaWx0ZXIgKi8KK2ludCBsdl9hY3RpdmF0ZV93aXRoX2ZpbHRlcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLCBpbnQgZXhjbHVzaXZlLAorCQkJICAgIGludCBub3NjYW4sIGludCB0ZW1wb3JhcnksIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgbGFvcHRzID0geyAuZXhjbHVzaXZlID0gZXhjbHVzaXZlLAorCQkJCQkgICAubm9zY2FuID0gbm9zY2FuLAorCQkJCQkgICAudGVtcG9yYXJ5ID0gdGVtcG9yYXJ5IH07CisKKwlpZiAoIV9sdl9hY3RpdmF0ZShjbWQsIGx2aWRfcywgJmxhb3B0cywgMSwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgbHZfbWtub2RlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgcjsKKworCWlmICghbHYpIHsKKwkJciA9IGRtX21rbm9kZXMoTlVMTCk7CisJCWZzX3VubG9jaygpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDE7CisKKwlyID0gZGV2X21hbmFnZXJfbWtub2Rlcyhsdik7CisKKwlmc191bmxvY2soKTsKKworCXJldHVybiByOworfQorCisvKgorICogRG9lcyBQViB1c2UgVkcgc29tZXdoZXJlIGluIGl0cyBjb25zdHJ1Y3Rpb24/CisgKiBSZXR1cm5zIDEgb24gZmFpbHVyZS4KKyAqLworaW50IHB2X3VzZXNfdmcoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmICghYWN0aXZhdGlvbigpIHx8ICFwdi0+ZGV2KQorCQlyZXR1cm4gMDsKKworCWlmICghZG1faXNfZG1fbWFqb3IoTUFKT1IocHYtPmRldi0+ZGV2KSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRldl9tYW5hZ2VyX2RldmljZV91c2VzX3ZnKHB2LT5kZXYsIHZnKTsKK30KKwordm9pZCBhY3RpdmF0aW9uX3JlbGVhc2Uodm9pZCkKK3sKKwlpZiAoY3JpdGljYWxfc2VjdGlvbigpKQorCQkvKiBNYXkgbGVhayBzdGFja2VkIG9wZXJhdGlvbiAqLworCQlsb2dfZXJyb3IoIlJlbGVhc2luZyBhY3RpdmF0aW9uIGluIGNyaXRpY2FsIHNlY3Rpb24uIik7CisKKwlmc191bmxvY2soKTsgLyogSW1wbGljaXQgZGV2X21hbmFnZXJfcmVsZWFzZSgpOyAqLworfQorCit2b2lkIGFjdGl2YXRpb25fZXhpdCh2b2lkKQoreworCWFjdGl2YXRpb25fcmVsZWFzZSgpOworCWRldl9tYW5hZ2VyX2V4aXQoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2FjdGl2YXRlL2FjdGl2YXRlLmggYi9saWIvYWN0aXZhdGUvYWN0aXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThkN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2FjdGl2YXRlL2FjdGl2YXRlLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgTFZNX0FDVElWQVRFX0gKKyNkZWZpbmUgTFZNX0FDVElWQVRFX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisKK3N0cnVjdCBsdmluZm8geworCWludCBleGlzdHM7CisJaW50IHN1c3BlbmRlZDsKKwl1bnNpZ25lZCBpbnQgb3Blbl9jb3VudDsKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCByZWFkX29ubHk7CisJaW50IGxpdmVfdGFibGU7CisJaW50IGluYWN0aXZlX3RhYmxlOworCXVpbnQzMl90IHJlYWRfYWhlYWQ7Cit9OworCit0eXBlZGVmIGVudW0geworCVNFR19TVEFUVVNfTk9ORSwKKwlTRUdfU1RBVFVTX0NBQ0hFLAorCVNFR19TVEFUVVNfUkFJRCwKKwlTRUdfU1RBVFVTX1NOQVBTSE9ULAorCVNFR19TVEFUVVNfVEhJTiwKKwlTRUdfU1RBVFVTX1RISU5fUE9PTCwKKwlTRUdfU1RBVFVTX1VOS05PV04KK30gbHZfc2VnX3N0YXR1c190eXBlX3Q7CisKK3N0cnVjdCBsdl9zZWdfc3RhdHVzIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOwkJCS8qIGlucHV0ICovCisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsJCS8qIGlucHV0ICovCisJbHZfc2VnX3N0YXR1c190eXBlX3QgdHlwZTsJCS8qIG91dHB1dCAqLworCXVuaW9uIHsKKwkJc3RydWN0IGRtX3N0YXR1c19jYWNoZSAqY2FjaGU7CisJCXN0cnVjdCBkbV9zdGF0dXNfcmFpZCAqcmFpZDsKKwkJc3RydWN0IGRtX3N0YXR1c19zbmFwc2hvdCAqc25hcHNob3Q7CisJCXN0cnVjdCBkbV9zdGF0dXNfdGhpbiAqdGhpbjsKKwkJc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKnRoaW5fcG9vbDsKKwl9OworfTsKKworc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyB7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsJLyogaW5wdXQgKi8KKwlpbnQgaW5mb19vazsKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CQkJLyogb3V0cHV0ICovCisJaW50IHNlZ19wYXJ0X29mX2x2OwkJCS8qIG91dHB1dCAqLworCXN0cnVjdCBsdl9zZWdfc3RhdHVzIHNlZ19zdGF0dXM7CS8qIGlucHV0L291dHB1dCwgc2VlIGx2X3NlZ19zdGF0dXMgKi8KK307CisKK3N0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzIHsKKwlpbnQgZXhjbHVzaXZlOworCWludCBvcmlnaW5fb25seTsKKwlpbnQgbm9fbWVyZ2luZzsKKwlpbnQgc2VuZF9tZXNzYWdlczsKKwlpbnQgc2tpcF9pbl91c2U7CisJdW5zaWduZWQgcmV2ZXJ0OworCXVuc2lnbmVkIHJlYWRfb25seTsKKwl1bnNpZ25lZCBub3NjYW47CS8qIE1hcmsgdGhpcyBMViB0byBhdm9pZCBpdHMgc2Nhbm5pbmcuIFRoaXMgYWxzbworCQkJCSAgIGRpcmVjdHMgdWRldiB0byB1c2UgcHJvcGVyIHVkZXYgZmxhZyB0byBhdm9pZAorCQkJCSAgIGFueSBzY2FubmluZyBpbiB1ZGV2LiBUaGlzIHVkZXYgZmxhZyBpcyBhdXRvbWF0aWNhbGx5CisJCQkJICAgZHJvcHBlZCBpbiB1ZGV2IGRiIG9uIGFueSBzcHVyaW91cyBldmVudCB0aGF0IGZvbGxvd3MuICovCisJdW5zaWduZWQgdGVtcG9yYXJ5OwkvKiBNYXJrIHRoaXMgTFYgYXMgdGVtcG9yYXJ5LiBJdCBtZWFucywgdGhlIExWCisJCQkJICogaXMgY3JlYXRlZCwgdXNlZCBhbmQgZGVhY3RpdmF0ZWQgd2l0aGluIHNpbmdsZQorCQkJCSAqIExWTSBjb21tYW5kIGV4ZWN1dGlvbi4gU3VjaCBMVnMgYXJlIG1vc3RseSBoZWxwZXIKKwkJCQkgKiBMVnMgdG8gZG8gc29tZSBhY3Rpb24gb3IgY2xlYW51cCBiZWZvcmUgdGhlIHByb3BlcgorCQkJCSAqIExWIGlzIGNyZWF0ZWQuIFRoaXMgYWxzbyBkaXJlY3RzIHVkZXYgdG8gdXNlIHByb3BlcgorCQkJCSAqIHNldCBvZiBmbGFncyB0byBhdm9pZCBhbnkgc2Nhbm5pbmcgaW4gdWRldi4gVGhlc2UgdWRldgorCQkJCSAqIGZsYWdzIGFyZSBwZXJzaXN0ZW50IGluIHVkZXYgZGIgZm9yIGFueSBzcHVyaW91cyBldmVudAorCQkJCSAqIHRoYXQgZm9sbG93cy4gKi8KKwl1bnNpZ25lZCByZXN1bWluZzsJLyogU2V0IHdoZW4gcmVzdW1pbmcgYWZ0ZXIgYSBzdXNwZW5kLiAqLworfTsKKwordm9pZCBzZXRfYWN0aXZhdGlvbihpbnQgYWN0aXZhdGlvbiwgaW50IHNpbGVudCk7CitpbnQgYWN0aXZhdGlvbih2b2lkKTsKKworaW50IGRyaXZlcl92ZXJzaW9uKGNoYXIgKnZlcnNpb24sIHNpemVfdCBzaXplKTsKK2ludCBsaWJyYXJ5X3ZlcnNpb24oY2hhciAqdmVyc2lvbiwgc2l6ZV90IHNpemUpOworaW50IGx2bTFfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKK2ludCBtb2R1bGVfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdGFyZ2V0X25hbWUpOworaW50IHRhcmdldF9wcmVzZW50X3ZlcnNpb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAorCQkJICAgaW50IHVzZV9tb2Rwcm9iZSwgdWludDMyX3QgKm1haiwKKwkJCSAgIHVpbnQzMl90ICptaW4sIHVpbnQzMl90ICpwYXRjaGxldmVsKTsKK2ludCB0YXJnZXRfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdGFyZ2V0X25hbWUsCisJCSAgIGludCB1c2VfbW9kcHJvYmUpOworaW50IHRhcmdldF92ZXJzaW9uKGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLCB1aW50MzJfdCAqbWFqLAorCQkgICB1aW50MzJfdCAqbWluLCB1aW50MzJfdCAqcGF0Y2hsZXZlbCk7CitpbnQgbHZtX2RtX3ByZWZpeF9jaGVjayhpbnQgbWFqb3IsIGludCBtaW5vciwgY29uc3QgY2hhciAqcHJlZml4KTsKK2ludCBsaXN0X3NlZ21lbnRfbW9kdWxlcyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKTsKK2ludCBsaXN0X2x2X21vZHVsZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKTsKKwordm9pZCBhY3RpdmF0aW9uX3JlbGVhc2Uodm9pZCk7Cit2b2lkIGFjdGl2YXRpb25fZXhpdCh2b2lkKTsKKworLyogaW50IGx2X3N1c3BlbmQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcyk7ICovCitpbnQgbHZfc3VzcGVuZF9pZl9hY3RpdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywgdW5zaWduZWQgb3JpZ2luX29ubHksIHVuc2lnbmVkIGV4Y2x1c2l2ZSwKKwkJCSBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3ByZSk7CitpbnQgbHZfcmVzdW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIHVuc2lnbmVkIG9yaWdpbl9vbmx5LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9yZXN1bWVfaWZfYWN0aXZlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsCisJCQl1bnNpZ25lZCBvcmlnaW5fb25seSwgdW5zaWduZWQgZXhjbHVzaXZlLCB1bnNpZ25lZCByZXZlcnQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2FjdGl2YXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCBleGNsdXNpdmUsCisJCWludCBub3NjYW4sIGludCB0ZW1wb3JhcnksIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2FjdGl2YXRlX3dpdGhfZmlsdGVyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCBleGNsdXNpdmUsCisJCQkgICAgaW50IG5vc2NhbiwgaW50IHRlbXBvcmFyeSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfZGVhY3RpdmF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbHZpZF9zLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGx2X21rbm9kZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKgorICogUmV0dXJucyAxIGlmIGluZm8gc3RydWN0dXJlIGhhcyBiZWVuIHBvcHVsYXRlZCwgZWxzZSAwIG9uIGZhaWx1cmUuCisgKiBXaGVuIGx2aW5mbyogaXMgTlVMTCwgaXQgcmV0dXJucyAxIGlmIHRoZSBkZXZpY2UgaXMgbG9jYWxseSBhY3RpdmUsIDAgb3RoZXJ3aXNlLgorICovCitpbnQgbHZfaW5mbyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IHVzZV9sYXllciwKKwkgICAgc3RydWN0IGx2aW5mbyAqaW5mbywgaW50IHdpdGhfb3Blbl9jb3VudCwgaW50IHdpdGhfcmVhZF9haGVhZCk7CitpbnQgbHZfaW5mb19ieV9sdmlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdmlkX3MsIGludCB1c2VfbGF5ZXIsCisJCSAgICBzdHJ1Y3QgbHZpbmZvICppbmZvLCBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBsdl9zZWdfc3RhdHVzIHN0cnVjdHVyZSBoYXMgYmVlbiBwb3B1bGF0ZWQsCisgKiBlbHNlIDAgb24gZmFpbHVyZSBvciBpZiBkZXZpY2Ugbm90IGFjdGl2ZSBsb2NhbGx5LgorICovCitpbnQgbHZfc3RhdHVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZfc2VnLAorCSAgICAgIGludCB1c2VfbGF5ZXIsIHN0cnVjdCBsdl9zZWdfc3RhdHVzICpsdl9zZWdfc3RhdHVzKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBsdl9pbmZvX2FuZF9zZWdfc3RhdHVzIHN0cnVjdHVyZSBoYXMgYmVlbiBwb3B1bGF0ZWQsCisgKiBlbHNlIDAgb24gZmFpbHVyZSBvciBpZiBkZXZpY2Ugbm90IGFjdGl2ZSBsb2NhbGx5LgorICoKKyAqIGx2X2luZm9fd2l0aF9zZWdfc3RhdHVzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgbHZfaW5mbyBhbmQgdGhlbiBsdl9zdGF0dXMsCisgKiBidXQgdGhpcyBmbiB0cmllcyB0byBkbyB0aGF0IHdpdGggb25lIGlvY3RsIGlmIHBvc3NpYmxlLgorICovCitpbnQgbHZfaW5mb193aXRoX3NlZ19zdGF0dXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKmx2X3NlZywgaW50IHVzZV9sYXllciwKKwkJCSAgICBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpzdGF0dXMsCisJCQkgICAgaW50IHdpdGhfb3Blbl9jb3VudCwgaW50IHdpdGhfcmVhZF9haGVhZCk7CisKK2ludCBsdl9jaGVja19ub3RfaW5fdXNlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBlcnJvcl9pZl91c2VkKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBhY3RpdmF0ZV9sdiBoYXMgYmVlbiBzZXQ6IDEgPSBhY3RpdmF0ZTsgMCA9IGRvbid0LgorICovCitpbnQgbHZfYWN0aXZhdGlvbl9maWx0ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywKKwkJCSBpbnQgKmFjdGl2YXRlX2x2LCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKy8qCisgKiBDaGVja3MgYWdhaW5zdCB0aGUgYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0IGFuZAorICogcmV0dXJucyAxIGlmIHRoZSBMViBzaG91bGQgYmUgYWN0aXZhdGVkLCAwIG90aGVyd2lzZS4KKyAqLworaW50IGx2X3Bhc3Nlc19hdXRvX2FjdGl2YXRpb25fZmlsdGVyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGx2X2NoZWNrX3RyYW5zaWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKy8qCisgKiBSZXR1cm5zIDEgaWYgcGVyY2VudCBoYXMgYmVlbiBzZXQsIGVsc2UgMC4KKyAqLworaW50IGx2X3NuYXBzaG90X3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgZG1fcGVyY2VudF90ICpwZXJjZW50KTsKK2ludCBsdl9taXJyb3JfcGVyY2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgaW50IHdhaXQsIGRtX3BlcmNlbnRfdCAqcGVyY2VudCwgdWludDMyX3QgKmV2ZW50X25yKTsKK2ludCBsdl9yYWlkX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgZG1fcGVyY2VudF90ICpwZXJjZW50KTsKK2ludCBsdl9yYWlkX2Rldl9oZWFsdGgoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY2hhciAqKmRldl9oZWFsdGgpOworaW50IGx2X3JhaWRfbWlzbWF0Y2hfY291bnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDY0X3QgKmNudCk7CitpbnQgbHZfcmFpZF9zeW5jX2FjdGlvbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjaGFyICoqc3luY19hY3Rpb24pOworaW50IGx2X3JhaWRfbWVzc2FnZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBjaGFyICptc2cpOworaW50IGx2X2NhY2hlX3N0YXR1cyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgc3RydWN0IGx2X3N0YXR1c19jYWNoZSAqKnN0YXR1cyk7CitpbnQgbHZfdGhpbl9wb29sX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IG1ldGFkYXRhLAorCQkJIGRtX3BlcmNlbnRfdCAqcGVyY2VudCk7CitpbnQgbHZfdGhpbl9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBtYXBwZWQsCisJCSAgICBkbV9wZXJjZW50X3QgKnBlcmNlbnQpOworaW50IGx2X3RoaW5fcG9vbF90cmFuc2FjdGlvbl9pZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCXVpbnQ2NF90ICp0cmFuc2FjdGlvbl9pZCk7CitpbnQgbHZfdGhpbl9kZXZpY2VfaWQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDMyX3QgKmRldmljZV9pZCk7CisKKy8qCisgKiBSZXR1cm4gbnVtYmVyIG9mIExWcyBpbiB0aGUgVkcgdGhhdCBhcmUgYWN0aXZlLgorICovCitpbnQgbHZzX2luX3ZnX2FjdGl2YXRlZChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgbHZzX2luX3ZnX29wZW5lZChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKK2ludCBsdl9pc19hY3RpdmUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfYWN0aXZlX2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfYWN0aXZlX3JlbW90ZWx5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2lzX2FjdGl2ZV9idXRfbm90X2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9yZW1vdGVseShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGx2X2hhc190YXJnZXRfdHlwZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICAgY29uc3QgY2hhciAqbGF5ZXIsIGNvbnN0IGNoYXIgKnRhcmdldF90eXBlKTsKKworaW50IG1vbml0b3JfZGV2X2Zvcl9ldmVudHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICBjb25zdCBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzLCBpbnQgZG9fcmVnKTsKKworI2lmZGVmIERNRVZFTlRECisjICBpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKK2NoYXIgKmdldF9tb25pdG9yX2Rzb19wYXRoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsaWJwYXRoKTsKK2ludCB0YXJnZXRfcmVnaXN0ZXJlZF93aXRoX2RtZXZlbnRkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsaWJwYXRoLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgKnBlbmRpbmcpOworaW50IHRhcmdldF9yZWdpc3Rlcl9ldmVudHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRzbywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBpbnQgZXZtYXNrIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBpbnQgc2V0LCBpbnQgdGltZW91dCk7CisjZW5kaWYKKworaW50IGFkZF9saW5lYXJfYXJlYV90b19kdHJlZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50NjRfdCBzaXplLAorCQkJICAgICB1aW50MzJfdCBleHRlbnRfc2l6ZSwgaW50IHVzZV9saW5lYXJfdGFyZ2V0LAorCQkJICAgICBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKmx2bmFtZSk7CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgUFYgaGFzIGEgZGVwZW5kZW5jeSB0cmVlIHRoYXQgdXNlcyBhbnl0aGluZyBpbiBWRy4KKyAqLworaW50IHB2X3VzZXNfdmcoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworc3RydWN0IGRldl91c2FibGVfY2hlY2tfcGFyYW1zIHsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfZW1wdHk6MTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfYmxvY2tlZDoxOworCXVuc2lnbmVkIGludCBjaGVja19zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfZXJyb3JfdGFyZ2V0OjE7CisJdW5zaWduZWQgaW50IGNoZWNrX3Jlc2VydmVkOjE7Cit9OworCisvKgorICogUmV0dXJucyAxIGlmIG1hcHBlZCBkZXZpY2UgaXMgbm90IHN1c3BlbmRlZCwgYmxvY2tlZCBvcgorICogaXMgdXNpbmcgYSByZXNlcnZlZCBuYW1lLgorICovCitpbnQgZGV2aWNlX2lzX3VzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfdXNhYmxlX2NoZWNrX3BhcmFtcyBjaGVjayk7CisKKy8qCisgKiBEZWNsYXJhdGlvbiBtb3ZlZCBoZXJlIGZyb20gZnMuaCB0byBrZWVwIGhlYWRlciBmcy5oIGhpZGRlbgorICovCit2b2lkIGZzX3VubG9jayh2b2lkKTsKKworI2RlZmluZSBUQVJHRVRfTkFNRV9DQUNIRSAiY2FjaGUiCisjZGVmaW5lIFRBUkdFVF9OQU1FX0VSUk9SICJlcnJvciIKKyNkZWZpbmUgVEFSR0VUX05BTUVfRVJST1JfT0xEICJlcnJvIgkvKiBUcnVuY2F0ZWQgaW4gb2xkZXIga2VybmVscyAqLworI2RlZmluZSBUQVJHRVRfTkFNRV9MSU5FQVIgImxpbmVhciIKKyNkZWZpbmUgVEFSR0VUX05BTUVfTUlSUk9SICJtaXJyb3IiCisjZGVmaW5lIFRBUkdFVF9OQU1FX1JBSUQgInJhaWQiCisjZGVmaW5lIFRBUkdFVF9OQU1FX1NOQVBTSE9UICJzbmFwc2hvdCIKKyNkZWZpbmUgVEFSR0VUX05BTUVfU05BUFNIT1RfTUVSR0UgInNuYXBzaG90LW1lcmdlIgorI2RlZmluZSBUQVJHRVRfTkFNRV9TTkFQU0hPVF9PUklHSU4gInNuYXBzaG90LW9yaWdpbiIKKyNkZWZpbmUgVEFSR0VUX05BTUVfU1RSSVBFRCAic3RyaXBlZCIKKyNkZWZpbmUgVEFSR0VUX05BTUVfVEhJTiAidGhpbiIKKyNkZWZpbmUgVEFSR0VUX05BTUVfVEhJTl9QT09MICJ0aGluLXBvb2wiCisjZGVmaW5lIFRBUkdFVF9OQU1FX1pFUk8gInplcm8iCisKKyNkZWZpbmUgTU9EVUxFX05BTUVfQ0xVU1RFUkVEX01JUlJPUiAiY2xvZyIKKyNkZWZpbmUgTU9EVUxFX05BTUVfQ0FDSEUgVEFSR0VUX05BTUVfQ0FDSEUKKyNkZWZpbmUgTU9EVUxFX05BTUVfRVJST1IgVEFSR0VUX05BTUVfRVJST1IKKyNkZWZpbmUgTU9EVUxFX05BTUVfTE9HX0NMVVNURVJFRCAibG9nLWNsdXN0ZXJlZCIKKyNkZWZpbmUgTU9EVUxFX05BTUVfTE9HX1VTRVJTUEFDRSAibG9nLXVzZXJzcGFjZSIKKyNkZWZpbmUgTU9EVUxFX05BTUVfTUlSUk9SIFRBUkdFVF9OQU1FX01JUlJPUgorI2RlZmluZSBNT0RVTEVfTkFNRV9TTkFQU0hPVCBUQVJHRVRfTkFNRV9TTkFQU0hPVAorI2RlZmluZSBNT0RVTEVfTkFNRV9SQUlEIFRBUkdFVF9OQU1FX1JBSUQKKyNkZWZpbmUgTU9EVUxFX05BTUVfWkVSTyBUQVJHRVRfTkFNRV9aRVJPCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2FjdGl2YXRlL2Rldl9tYW5hZ2VyLmMgYi9saWIvYWN0aXZhdGUvZGV2X21hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzNhMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2FjdGl2YXRlL2Rldl9tYW5hZ2VyLmMKQEAgLTAsMCArMSwzMjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRldl9tYW5hZ2VyLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgImZzLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAidGFyZ2V0cy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAibHZtLWV4ZWMuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNkZWZpbmUgTUFYX1RBUkdFVF9QQVJBTVNJWkUgNTAwMDAKKyNkZWZpbmUgTFZNX1VERVZfTk9TQ0FOX0ZMQUcgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzAKKwordHlwZWRlZiBlbnVtIHsKKwlQUkVMT0FELAorCUFDVElWQVRFLAorCURFQUNUSVZBVEUsCisJU1VTUEVORCwKKwlTVVNQRU5EX1dJVEhfTE9DS0ZTLAorCUNMRUFOCit9IGFjdGlvbl90OworCisvKiBUaGlzIGxpc3QgbXVzdCBtYXRjaCBsaWIvbWlzYy9sdm0tc3RyaW5nLmM6YnVpbGRfZG1fdXVpZCgpLiAqLworY29uc3QgY2hhciAqdXVpZF9zdWZmaXhfbGlzdFtdID0geyAicG9vbCIsICJjZGF0YSIsICJjbWV0YSIsICJ0ZGF0YSIsICJ0bWV0YSIsIE5VTEx9OworCitzdHJ1Y3QgZGxpZF9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNvbnN0IGNoYXIgKmRsaWQ7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKK307CisKK3N0cnVjdCBkZXZfbWFuYWdlciB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCisJdm9pZCAqdGFyZ2V0X3N0YXRlOworCXVpbnQzMl90IHB2bW92ZV9taXJyb3JfY291bnQ7CisJaW50IGZsdXNoX3JlcXVpcmVkOworCWludCBhY3RpdmF0aW9uOyAgICAgICAgICAgICAgICAgLyogYnVpbGRpbmcgYWN0aXZhdGlvbiB0cmVlICovCisJaW50IHN1c3BlbmQ7CQkJLyogYnVpbGRpbmcgc3VzcGVuZCB0cmVlICovCisJaW50IHNraXBfZXh0ZXJuYWxfbHY7CisJc3RydWN0IGRtX2xpc3QgcGVuZGluZ19kZWxldGU7CS8qIHN0cl9saXN0IG9mIGRsaWQocykgd2l0aCBwZW5kaW5nIGRlbGV0ZSAqLworCXVuc2lnbmVkIHRyYWNrX3BlbmRpbmdfZGVsZXRlOworCXVuc2lnbmVkIHRyYWNrX3B2bW92ZV9kZXBzOworCisJY29uc3QgY2hhciAqdmdfbmFtZTsKK307CisKK3N0cnVjdCBsdl9sYXllciB7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwljb25zdCBjaGFyICpvbGRfbmFtZTsKK307CisKK2ludCByZWFkX29ubHlfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cykKK3sKKwlyZXR1cm4gKGxhb3B0cy0+cmVhZF9vbmx5IHx8ICEobHYtPnN0YXR1cyAmIExWTV9XUklURSkpOworfQorCisvKgorICogTG93IGxldmVsIGRldmljZS1sYXllciBvcGVyYXRpb25zLgorICovCitzdGF0aWMgc3RydWN0IGRtX3Rhc2sgKl9zZXR1cF90YXNrKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnV1aWQsCisJCQkJICAgdWludDMyX3QgKmV2ZW50X25yLCBpbnQgdGFzaywKKwkJCQkgICB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkJICAgaW50IHdpdGhfb3Blbl9jb3VudCwKKwkJCQkgICBpbnQgd2l0aF9mbHVzaCkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUodGFzaykpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmIChuYW1lICYmICFkbV90YXNrX3NldF9uYW1lKGRtdCwgbmFtZSkpCisJCWdvdG9fb3V0OworCisJaWYgKHV1aWQgJiYgKnV1aWQgJiYgIWRtX3Rhc2tfc2V0X3V1aWQoZG10LCB1dWlkKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoZXZlbnRfbnIgJiYgIWRtX3Rhc2tfc2V0X2V2ZW50X25yKGRtdCwgKmV2ZW50X25yKSkKKwkJZ290b19vdXQ7CisKKwlpZiAobWFqb3IgJiYgIWRtX3Rhc2tfc2V0X21ham9yX21pbm9yKGRtdCwgbWFqb3IsIG1pbm9yLCAxKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoYWN0aXZhdGlvbl9jaGVja3MoKSAmJiAhZG1fdGFza19lbmFibGVfY2hlY2tzKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCF3aXRoX29wZW5fY291bnQgJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIGRpc2FibGUgb3Blbl9jb3VudC4iKTsKKworCWlmICghd2l0aF9mbHVzaCAmJiAhZG1fdGFza19ub19mbHVzaChkbXQpKQorCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHNldCBub19mbHVzaC4iKTsKKworCXJldHVybiBkbXQ7CisgICAgICBvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9zZWdtZW50X3N0YXR1c19mcm9tX3RhcmdldF9wYXJhbXMoY29uc3QgY2hhciAqdGFyZ2V0X25hbWUsCisJCQkJCQkgIGNvbnN0IGNoYXIgKnBhcmFtcywKKwkJCQkJCSAgc3RydWN0IGx2X3NlZ19zdGF0dXMgKnNlZ19zdGF0dXMpCit7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCXNlZ19zdGF0dXMtPnR5cGUgPSBTRUdfU1RBVFVTX1VOS05PV047CisKKwkvKgorCSAqIFRPRE86IEFkZCBzdXBwb3J0IGZvciBvdGhlciBzZWdtZW50IHR5cGVzIHRvbyEKKwkgKiBUaGUgc2VnbWVudCB0byByZXBvcnQgc3RhdHVzIGZvciBtdXN0IGJlIHByb3Blcmx5CisJICogc2VsZWN0ZWQgZm9yIGFsbCB0aGUgb3RoZXIgdHlwZXMgLSBtYWlubHkgbWFrZSBzdXJlCisJICogbGluZWFyL3N0cmlwZWQsIG9sZCBzbmFwc2hvdHMgYW5kIHJhaWRzIGhhdmUgcHJvcGVyCisJICogc2VnbWVudCBzZWxlY3RlZCBmb3Igc3RhdHVzIQorCSAqLworCWlmICghc3RyY21wKHRhcmdldF9uYW1lLCBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkgJiYKKwkgICAgbHZfaXNfbWVyZ2luZ19vcmlnaW4oc2VnX3N0YXR1cy0+c2VnLT5sdikpIHsKKwkJLyogU25hcHNob3QgbWVyZ2UgaGFzIHN0YXJ0ZWQsIGNoZWNrIHNuYXBzaG90IHN0YXR1cyAqLworCQlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoc2VnX3N0YXR1cy0+c2VnLT5sdi0+dmctPmNtZCwgVEFSR0VUX05BTUVfU05BUFNIT1QpKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCWlmIChzdHJjbXAodGFyZ2V0X25hbWUsIFRBUkdFVF9OQU1FX0NBQ0hFKSAmJgorCQkgICAgc3RyY21wKHRhcmdldF9uYW1lLCBUQVJHRVRfTkFNRV9TTkFQU0hPVCkgJiYKKwkJICAgIHN0cmNtcCh0YXJnZXRfbmFtZSwgVEFSR0VUX05BTUVfVEhJTl9QT09MKSAmJgorCQkgICAgc3RyY21wKHRhcmdldF9uYW1lLCBUQVJHRVRfTkFNRV9USElOKSkKKwkJCXJldHVybiAxOyAvKiBUT0RPOiBEbyBub3Qga25vdyBob3cgdG8gaGFuZGxlIHlldCAqLworCisJCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhzZWdfc3RhdHVzLT5zZWctPmx2LT52Zy0+Y21kLCB0YXJnZXRfbmFtZSkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKHNlZ3R5cGUgIT0gc2VnX3N0YXR1cy0+c2VnLT5zZWd0eXBlKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9nZXRfc2VnbWVudF9zdGF0dXNfZnJvbV90YXJnZXRfcGFyYW1zOiAiCisJCQkJICAic2VnbWVudCB0eXBlICVzIGZvdW5kIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNlZ21lbnQgdHlwZSAlcyIsCisJCQkJICBzZWd0eXBlLT5uYW1lLCBzZWdfc3RhdHVzLT5zZWctPnNlZ3R5cGUtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoc2VndHlwZV9pc19jYWNoZShzZWd0eXBlKSkgeworCQlpZiAoIWRtX2dldF9zdGF0dXNfY2FjaGUoc2VnX3N0YXR1cy0+bWVtLCBwYXJhbXMsICYoc2VnX3N0YXR1cy0+Y2FjaGUpKSkKKwkJCXJldHVybl8wOworCQlzZWdfc3RhdHVzLT50eXBlID0gU0VHX1NUQVRVU19DQUNIRTsKKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfcmFpZChzZWd0eXBlKSkgeworCQlpZiAoIWRtX2dldF9zdGF0dXNfcmFpZChzZWdfc3RhdHVzLT5tZW0sIHBhcmFtcywgJnNlZ19zdGF0dXMtPnJhaWQpKQorCQkJcmV0dXJuXzA7CisJCXNlZ19zdGF0dXMtPnR5cGUgPSBTRUdfU1RBVFVTX1JBSUQ7CisJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3RoaW5fdm9sdW1lKHNlZ3R5cGUpKSB7CisJCWlmICghZG1fZ2V0X3N0YXR1c190aGluKHNlZ19zdGF0dXMtPm1lbSwgcGFyYW1zLCAmc2VnX3N0YXR1cy0+dGhpbikpCisJCQlyZXR1cm5fMDsKKwkJc2VnX3N0YXR1cy0+dHlwZSA9IFNFR19TVEFUVVNfVEhJTjsKKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfdGhpbl9wb29sKHNlZ3R5cGUpKSB7CisJCWlmICghZG1fZ2V0X3N0YXR1c190aGluX3Bvb2woc2VnX3N0YXR1cy0+bWVtLCBwYXJhbXMsICZzZWdfc3RhdHVzLT50aGluX3Bvb2wpKQorCQkJcmV0dXJuXzA7CisJCXNlZ19zdGF0dXMtPnR5cGUgPSBTRUdfU1RBVFVTX1RISU5fUE9PTDsKKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfc25hcHNob3Qoc2VndHlwZSkpIHsKKwkJaWYgKCFkbV9nZXRfc3RhdHVzX3NuYXBzaG90KHNlZ19zdGF0dXMtPm1lbSwgcGFyYW1zLCAmc2VnX3N0YXR1cy0+c25hcHNob3QpKQorCQkJcmV0dXJuXzA7CisJCXNlZ19zdGF0dXMtPnR5cGUgPSBTRUdfU1RBVFVTX1NOQVBTSE9UOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5zdXBwb3J0ZWQgc2VnbWVudCB0eXBlICVzLiIsIHNlZ3R5cGUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordHlwZWRlZiBlbnVtIHsKKwlJTkZPLAkvKiBETV9ERVZJQ0VfSU5GTyBpb2N0bCAqLworCVNUQVRVUywgLyogRE1fREVWSUNFX1NUQVRVUyBpb2N0bCAqLworCU1LTk9ERVMKK30gaW5mb190eXBlX3Q7CisKK3N0YXRpYyBpbnQgX2luZm9fcnVuKGluZm9fdHlwZV90IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRsaWQsCisJCSAgICAgc3RydWN0IGRtX2luZm8gKmRtaW5mbywgdWludDMyX3QgKnJlYWRfYWhlYWQsCisJCSAgICAgc3RydWN0IGx2X3NlZ19zdGF0dXMgKnNlZ19zdGF0dXMsCisJCSAgICAgaW50IHdpdGhfb3Blbl9jb3VudCwgaW50IHdpdGhfcmVhZF9haGVhZCwKKwkJICAgICB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJaW50IGRtdGFzazsKKwl2b2lkICp0YXJnZXQgPSBOVUxMOworCXVpbnQ2NF90IHRhcmdldF9zdGFydCwgdGFyZ2V0X2xlbmd0aDsKKwljaGFyICp0YXJnZXRfbmFtZSwgKnRhcmdldF9wYXJhbXMsICpwYXJhbXNfdG9fcHJvY2VzcyA9IE5VTEw7CisJdWludDMyX3QgZXh0ZW50X3NpemU7CisJaW50IHdpdGhfZmx1c2ggPSAxOyAvKiBUT0RPOiBhcmcgZm9yIF9pbmZvX3J1biAqLworCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSU5GTzoKKwkJCWRtdGFzayA9IERNX0RFVklDRV9JTkZPOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVFVTOgorCQkJZG10YXNrID0gRE1fREVWSUNFX1NUQVRVUzsKKwkJCXdpdGhfZmx1c2ggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTUtOT0RFUzoKKwkJCWRtdGFzayA9IERNX0RFVklDRV9NS05PREVTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9pbmZvX3J1bjogdW5oYW5kbGVkIGluZm8gdHlwZSIpOworCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soKHR5cGUgPT0gTUtOT0RFUykgPyBuYW1lIDogTlVMTCwgZGxpZCwgMCwgZG10YXNrLAorCQkJCW1ham9yLCBtaW5vciwgd2l0aF9vcGVuX2NvdW50LCB3aXRoX2ZsdXNoKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsIGRtaW5mbykpCisJCWdvdG9fb3V0OworCisJaWYgKHdpdGhfcmVhZF9haGVhZCAmJiBkbWluZm8tPmV4aXN0cykgeworCQlpZiAoIWRtX3Rhc2tfZ2V0X3JlYWRfYWhlYWQoZG10LCByZWFkX2FoZWFkKSkKKwkJCWdvdG9fb3V0OworCX0gZWxzZSBpZiAocmVhZF9haGVhZCkKKwkJKnJlYWRfYWhlYWQgPSBETV9SRUFEX0FIRUFEX05PTkU7CisKKwlpZiAodHlwZSA9PSBTVEFUVVMpIHsKKwkJZXh0ZW50X3NpemUgPSBzZWdfc3RhdHVzLT5zZWctPmx2LT52Zy0+ZXh0ZW50X3NpemU7CisJCWRvIHsKKwkJCXRhcmdldCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIHRhcmdldCwgJnRhcmdldF9zdGFydCwKKwkJCQkJCSAgICAmdGFyZ2V0X2xlbmd0aCwgJnRhcmdldF9uYW1lLCAmdGFyZ2V0X3BhcmFtcyk7CisJCQlpZiAoKCh1aW50NjRfdCkgc2VnX3N0YXR1cy0+c2VnLT5sZSAqIGV4dGVudF9zaXplID09IHRhcmdldF9zdGFydCkgJiYKKwkJCSAgICAoKHVpbnQ2NF90KSBzZWdfc3RhdHVzLT5zZWctPmxlbiAqIGV4dGVudF9zaXplID09IHRhcmdldF9sZW5ndGgpKSB7CisJCQkJcGFyYW1zX3RvX3Byb2Nlc3MgPSB0YXJnZXRfcGFyYW1zOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICh0YXJnZXQpOworCisJCWlmIChwYXJhbXNfdG9fcHJvY2VzcyAmJgorCQkgICAgIV9nZXRfc2VnbWVudF9zdGF0dXNfZnJvbV90YXJnZXRfcGFyYW1zKHRhcmdldF9uYW1lLCBwYXJhbXNfdG9fcHJvY2Vzcywgc2VnX3N0YXR1cykpCisJCQlnb3RvX291dDsKKwl9CisKKwlyID0gMTsKKworICAgICAgb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByOworfQorCisvKgorICogaWdub3JlX2Jsb2NrZWRfbWlycm9yX2RldmljZXMKKyAqIEBkZXYKKyAqIEBzdGFydAorICogQGxlbmd0aAorICogQG1pcnJvcl9zdGF0dXNfc3RyCisgKgorICogV2hlbiBhIERNICdtaXJyb3InIHRhcmdldCBpcyBjcmVhdGVkIHdpdGggJ2Jsb2NrX29uX2Vycm9yJyBvcgorICogJ2hhbmRsZV9lcnJvcnMnLCBpdCB3aWxsIGJsb2NrIEkvTyBpZiB0aGVyZSBpcyBhIGRldmljZSBmYWlsdXJlCisgKiB1bnRpbCB0aGUgbWlycm9yIGlzIHJlY29uZmlndXJlZC4gIFRodXMsIExWTSBzaG91bGQgbmV2ZXIgYXR0ZW1wdAorICogdG8gcmVhZCBsYWJlbHMgZnJvbSBhIG1pcnJvciB0aGF0IGhhcyBhIGZhaWxlZCBkZXZpY2UuICAoTFZNCisgKiBjb21tYW5kcyBhcmUgaXNzdWVkIHRvIHJlcGFpciBtaXJyb3JzOyBhbmQgaWYgTFZNIGlzIGJsb2NrZWQKKyAqIGF0dGVtcHRpbmcgdG8gcmVhZCBhIG1pcnJvciwgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdvdWxkIGJlIGNyZWF0ZWQuKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBzbGltbWVkLWRvd24gdmVyc2lvbiBvZiBsaWIvbWlycm9yL21pcnJvcmVkLmM6CisgKiBfbWlycm9yZWRfdHJhbnNpZW50X3N0YXR1cygpLgorICoKKyAqIElmIGEgZmFpbGVkIGRldmljZSBpcyBkZXRlY3RlZCBpbiB0aGUgc3RhdHVzIHN0cmluZywgdGhlbiBpdCBtdXN0IGJlCisgKiBkZXRlcm1pbmVkIGlmICdibG9ja19vbl9lcnJvcicgb3IgJ2hhbmRsZV9lcnJvcnMnIHdhcyB1c2VkIHdoZW4KKyAqIGNyZWF0aW5nIHRoZSBtaXJyb3IuICBUaGlzIGluZm8gY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBtaXJyb3IKKyAqIHRhYmxlLiAgVGhlICdkZXYnLCAnc3RhcnQnLCAnbGVuZ3RoJyB0cmlvIGFsbG93IHVzIHRvIGNvcnJlbGF0ZSB0aGUKKyAqICdtaXJyb3Jfc3RhdHVzX3N0cicgd2l0aCB0aGUgY29ycmVjdCBkZXZpY2UgdGFibGUgaW4gb3JkZXIgdG8gY2hlY2sKKyAqIGZvciBibG9ja2luZy4KKyAqCisgKiBSZXR1cm5zOiAxIGlmIG1pcnJvciBzaG91bGQgYmUgaWdub3JlZCwgMCBpZiBzYWZlIHRvIHVzZQorICovCitzdGF0aWMgaW50IF9pZ25vcmVfYmxvY2tlZF9taXJyb3JfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwKKwkJCQkJICBjaGFyICptaXJyb3Jfc3RhdHVzX3N0cikKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBkbV9zdGF0dXNfbWlycm9yICpzbTsKKwl1bnNpZ25lZCBpLCBjaGVja19mb3JfYmxvY2tpbmcgPSAwOworCXVpbnQ2NF90IHMsbDsKKwljaGFyICpwLCAqcGFyYW1zLCAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCXZvaWQgKm5leHQgPSBOVUxMOworCXN0cnVjdCBkbV90YXNrICpkbXQgPSBOVUxMOworCWludCByID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICp0bXBfZGV2OworCWNoYXIgYnVmWzE2XTsKKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJibG9ja2VkX21pcnJvcnMiLCAxMjgpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX2dldF9zdGF0dXNfbWlycm9yKG1lbSwgbWlycm9yX3N0YXR1c19zdHIsICZzbSkpCisJCWdvdG9fb3V0OworCisJZm9yIChpID0gMDsgaSA8IHNtLT5kZXZfY291bnQ7ICsraSkKKwkJaWYgKHNtLT5kZXZzW2ldLmhlYWx0aCAhPSBETV9TVEFUVVNfTUlSUk9SX0FMSVZFKSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IE1pcnJvciBpbWFnZSAlZCBtYXJrZWQgYXMgZmFpbGVkIiwKKwkJCQkJICAgICBkZXZfbmFtZShkZXYpLCBpKTsKKwkJCWNoZWNrX2Zvcl9ibG9ja2luZyA9IDE7CisJCX0KKworCWlmICghY2hlY2tfZm9yX2Jsb2NraW5nICYmIHNtLT5sb2dfY291bnQpIHsKKwkJaWYgKHNtLT5sb2dzWzBdLmhlYWx0aCAhPSBETV9TVEFUVVNfTUlSUk9SX0FMSVZFKSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IE1pcnJvciBsb2cgZGV2aWNlIG1hcmtlZCBhcyBmYWlsZWQiLAorCQkJCQkgICAgIGRldl9uYW1lKGRldikpOworCQkJY2hlY2tfZm9yX2Jsb2NraW5nID0gMTsKKwkJfSBlbHNlIHsKKworCQkJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldToldSIsCisJCQkJCXNtLT5sb2dzWzBdLm1ham9yLCBzbS0+bG9nc1swXS5taW5vcikgPCAwKQorCQkJCWdvdG9fb3V0OworCisJCQlpZiAoISh0bXBfZGV2ID0gZGV2X2NyZWF0ZV9maWxlKGJ1ZiwgTlVMTCwgTlVMTCwgMCkpKQorCQkJCWdvdG9fb3V0OworCisJCQl0bXBfZGV2LT5kZXYgPSBNS0RFVigoZGV2X3Qpc20tPmxvZ3NbMF0ubWFqb3IsIChkZXZfdClzbS0+bG9nc1swXS5taW5vcik7CisJCQlpZiAoZGV2aWNlX2lzX3VzYWJsZSh0bXBfZGV2LCAoc3RydWN0IGRldl91c2FibGVfY2hlY2tfcGFyYW1zKQorCQkJCQkgICAgIHsgLmNoZWNrX2VtcHR5ID0gMSwKKwkJCQkJICAgICAgIC5jaGVja19ibG9ja2VkID0gMSwKKwkJCQkJICAgICAgIC5jaGVja19zdXNwZW5kZWQgPSBpZ25vcmVfc3VzcGVuZGVkX2RldmljZXMoKSwKKwkJCQkJICAgICAgIC5jaGVja19lcnJvcl90YXJnZXQgPSAxLAorCQkJCQkgICAgICAgLmNoZWNrX3Jlc2VydmVkID0gMCB9KSkKKwkJCQlnb3RvIG91dDsgLyogc2FmZSB0byB1c2UgKi8KKwkJCXN0YWNrOworCQl9CisJfQorCisJaWYgKCFjaGVja19mb3JfYmxvY2tpbmcpIHsKKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2UgYXZvaWQgYW5vdGhlciBzeXN0ZW0gY2FsbCBpZiB3ZSBjYW4sIGJ1dCBpZiBhIGRldmljZSBpcworCSAqIGRlYWQsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBsb29rIHVwIHRoZSB0YWJsZSB0b28uCisJICovCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soTlVMTCwgTlVMTCwgTlVMTCwgRE1fREVWSUNFX1RBQkxFLAorCQkJCU1BSk9SKGRldi0+ZGV2KSwgTUlOT1IoZGV2LT5kZXYpLCAwLCAxKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzLCAmbCwKKwkJCQkJICAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCQlpZiAoKHMgPT0gc3RhcnQpICYmIChsID09IGxlbmd0aCkgJiYKKwkJICAgIHRhcmdldF90eXBlICYmIHBhcmFtcykgeworCQkJaWYgKHN0cmNtcCh0YXJnZXRfdHlwZSwgVEFSR0VUX05BTUVfTUlSUk9SKSkKKwkJCQlnb3RvX291dDsKKworCQkJaWYgKCgocCA9IHN0cnN0cihwYXJhbXMsICIgYmxvY2tfb25fZXJyb3IiKSkgJiYKKwkJCSAgICAgKHBbMTVdID09ICdcMCcgfHwgcFsxNV0gPT0gJyAnKSkgfHwKKwkJCSAgICAoKHAgPSBzdHJzdHIocGFyYW1zLCAiIGhhbmRsZV9lcnJvcnMiKSkgJiYKKwkJCSAgICAgKHBbMTRdID09ICdcMCcgfHwgcFsxNF0gPT0gJyAnKSkpIHsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IEkvTyBibG9ja2VkIHRvIG1pcnJvciBkZXZpY2UiLAorCQkJCQkJICAgICBkZXZfbmFtZShkZXYpKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKG5leHQpOworCisJciA9IDE7CitvdXQ6CisJaWYgKGRtdCkKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9kZXZpY2VfaXNfc3VzcGVuZGVkKGludCBtYWpvciwgaW50IG1pbm9yKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShkbXQgPSBfc2V0dXBfdGFzayhOVUxMLCBOVUxMLCBOVUxMLCBETV9ERVZJQ0VfSU5GTywKKwkJCQltYWpvciwgbWlub3IsIDAsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkgfHwKKwkgICAgIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IGluZm8gZm9yIGRldmljZSAlZDolZCIsIG1ham9yLCBtaW5vcik7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSBpbmZvLmV4aXN0cyAmJiBpbmZvLnN1c3BlbmRlZDsKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfaWdub3JlX3N1c3BlbmRlZF9zbmFwc2hvdF9jb21wb25lbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJdm9pZCAqbmV4dCA9IE5VTEw7CisJY2hhciAqcGFyYW1zLCAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJaW50IG1ham9yMSwgbWlub3IxLCBtYWpvcjIsIG1pbm9yMjsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShkbXQgPSBfc2V0dXBfdGFzayhOVUxMLCBOVUxMLCBOVUxMLCBETV9ERVZJQ0VfVEFCTEUsCisJCQkJTUFKT1IoZGV2LT5kZXYpLCBNSU5PUihkZXYtPmRldiksIDAsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IHN0YXRlIG9mIHNuYXBzaG90IG9yIHNuYXBzaG90IG9yaWdpbiBkZXZpY2UiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQluZXh0ID0gZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLCAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCQlpZiAoIXRhcmdldF90eXBlIHx8ICFzdHJjbXAodGFyZ2V0X3R5cGUsIFRBUkdFVF9OQU1FX1NOQVBTSE9UKSkgeworCQkJaWYgKCFwYXJhbXMgfHwgc3NjYW5mKHBhcmFtcywgIiVkOiVkICVkOiVkIiwgJm1ham9yMSwgJm1pbm9yMSwgJm1ham9yMiwgJm1pbm9yMikgIT0gNCkgeworCQkJCWxvZ19lcnJvcigiSW5jb3JyZWN0IHNuYXBzaG90IHRhYmxlIGZvdW5kIik7CisJCQkJZ290b19vdXQ7CisJCQl9CisJCQlyID0gciB8fCBfZGV2aWNlX2lzX3N1c3BlbmRlZChtYWpvcjEsIG1pbm9yMSkgfHwgX2RldmljZV9pc19zdXNwZW5kZWQobWFqb3IyLCBtaW5vcjIpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGFyZ2V0X3R5cGUsIFRBUkdFVF9OQU1FX1NOQVBTSE9UX09SSUdJTikpIHsKKwkJCWlmICghcGFyYW1zIHx8IHNzY2FuZihwYXJhbXMsICIlZDolZCIsICZtYWpvcjEsICZtaW5vcjEpICE9IDIpIHsKKwkJCQlsb2dfZXJyb3IoIkluY29ycmVjdCBzbmFwc2hvdC1vcmlnaW4gdGFibGUgZm91bmQiKTsKKwkJCQlnb3RvX291dDsKKwkJCX0KKwkJCXIgPSByIHx8IF9kZXZpY2VfaXNfc3VzcGVuZGVkKG1ham9yMSwgbWlub3IxKTsKKwkJfQorCX0gd2hpbGUgKG5leHQpOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2lnbm9yZV91bnVzYWJsZV90aGlucyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogVE9ETyBtYWtlIGZ1bmN0aW9uIGZvciB0aGluIHRlc3RpbmcgKi8KKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBkbV9zdGF0dXNfdGhpbl9wb29sICpzdGF0dXM7CisJc3RydWN0IGRtX3Rhc2sgKmRtdCA9IE5VTEw7CisJdm9pZCAqbmV4dCA9IE5VTEw7CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aDsKKwljaGFyICp0YXJnZXRfdHlwZSA9IE5VTEw7CisJY2hhciAqcGFyYW1zOworCWludCBtaW5vciwgbWFqb3I7CisJaW50IHIgPSAwOworCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoInVudXNhYmxlX3RoaW5zIiwgMTI4KSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soTlVMTCwgTlVMTCwgTlVMTCwgRE1fREVWSUNFX1RBQkxFLAorCQkJCU1BSk9SKGRldi0+ZGV2KSwgTUlOT1IoZGV2LT5kZXYpLCAwLCAxKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBzdGF0ZSBvZiBtYXBwZWQgZGV2aWNlLiIpOworCQlnb3RvIG91dDsKKwl9CisJZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLCAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCWlmICghcGFyYW1zIHx8IHNzY2FuZihwYXJhbXMsICIlZDolZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCB0aGluLXBvb2wgbWFqb3I6bWlub3IgZm9yIHRoaW4gZGV2aWNlICVkOiVkLiIsCisJCQkgIChpbnQpTUFKT1IoZGV2LT5kZXYpLCAoaW50KU1JTk9SKGRldi0+ZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKE5VTEwsIE5VTEwsIE5VTEwsIERNX0RFVklDRV9TVEFUVVMsCisJCQkJbWFqb3IsIG1pbm9yLCAwLCAwKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBzdGF0ZSBvZiBtYXBwZWQgZGV2aWNlLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlkbV9nZXRfbmV4dF90YXJnZXQoZG10LCBuZXh0LCAmc3RhcnQsICZsZW5ndGgsICZ0YXJnZXRfdHlwZSwgJnBhcmFtcyk7CisJaWYgKCFkbV9nZXRfc3RhdHVzX3RoaW5fcG9vbChtZW0sIHBhcmFtcywgJnN0YXR1cykpCisJCWdvdG9fb3V0OworCisJaWYgKHN0YXR1cy0+cmVhZF9vbmx5IHx8IHN0YXR1cy0+b3V0X29mX2RhdGFfc3BhY2UpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6ICVzOiBUaGluJ3MgdGhpbi1wb29sIG5lZWRzIGluc3BlY3Rpb24uIiwKKwkJCSBkZXZfbmFtZShkZXYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CitvdXQ6CisJaWYgKGRtdCkKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKworICAgICAgICByZXR1cm4gcjsKK30KKworLyoKKyAqIGRldmljZV9pc191c2FibGUKKyAqIEBkZXYKKyAqIEBjaGVja19sdl9uYW1lcworICoKKyAqIEEgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbm90IHVzYWJsZSBpZiBpdCBpczoKKyAqICAgICAxKSBBbiBlbXB0eSBkZXZpY2UgKG5vIHRhcmdldHMpCisgKiAgICAgMikgQSBibG9ja2VkIG1pcnJvciAoaS5lLiBhIG1pcnJvciB3aXRoIGEgZmFpbHVyZSBhbmQgYmxvY2tfb25fZXJyb3Igc2V0KQorICogICAgIDMpIGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyBpcyBzZXQgYW5kCisgKiAgICAgICAgYSkgdGhlIGRldmljZSBpcyBzdXNwZW5kZWQKKyAqICAgICAgICBiKSBpdCBpcyBhIHNuYXBzaG90IG9yaWdpbgorICogICAgIDQpIGFuIGVycm9yIHRhcmdldAorICogICAgIDUpIHRoZSBMViBuYW1lIGlzIGEgcmVzZXJ2ZWQgbmFtZS4KKyAqCisgKiBSZXR1cm5zOiAxIGlmIHVzYWJsZSwgMCBvdGhlcndpc2UKKyAqLworaW50IGRldmljZV9pc191c2FibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2X3VzYWJsZV9jaGVja19wYXJhbXMgY2hlY2spCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCWNvbnN0IGNoYXIgKm5hbWUsICp1dWlkOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJY2hhciAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCWNoYXIgKnBhcmFtcywgKnZnbmFtZSA9IE5VTEwsICpsdm5hbWUsICpsYXllcjsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKwlpbnQgb25seV9lcnJvcl90YXJnZXQgPSAxOworCWludCByID0gMDsKKworCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKE5VTEwsIE5VTEwsIE5VTEwsIERNX0RFVklDRV9TVEFUVVMsCisJCQkJTUFKT1IoZGV2LT5kZXYpLCBNSU5PUihkZXYtPmRldiksIDAsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IHN0YXRlIG9mIG1hcHBlZCBkZXZpY2UiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pKQorCQlnb3RvX291dDsKKworCWlmICghaW5mby5leGlzdHMpCisJCWdvdG8gb3V0OworCisJbmFtZSA9IGRtX3Rhc2tfZ2V0X25hbWUoZG10KTsKKwl1dWlkID0gZG1fdGFza19nZXRfdXVpZChkbXQpOworCisJaWYgKGNoZWNrLmNoZWNrX2VtcHR5ICYmICFpbmZvLnRhcmdldF9jb3VudCkgeworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IEVtcHR5IGRldmljZSAlcyBub3QgdXNhYmxlLiIsIGRldl9uYW1lKGRldiksIG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY2hlY2suY2hlY2tfc3VzcGVuZGVkICYmIGluZm8uc3VzcGVuZGVkKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogU3VzcGVuZGVkIGRldmljZSAlcyBub3QgdXNhYmxlLiIsIGRldl9uYW1lKGRldiksIG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBpbnRlcm5hbCBsdm0gZGV2aWNlcyAqLworCWlmIChjaGVjay5jaGVja19yZXNlcnZlZCAmJgorCSAgICB1dWlkICYmICFzdHJuY21wKHV1aWQsIFVVSURfUFJFRklYLCBzaXplb2YoVVVJRF9QUkVGSVgpIC0gMSkpIHsKKwkJaWYgKHN0cmxlbih1dWlkKSA+IChzaXplb2YoVVVJRF9QUkVGSVgpICsgMiAqIElEX0xFTikpIHsgLyogNjggKi8KKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogUmVzZXJ2ZWQgdXVpZCAlcyBvbiBpbnRlcm5hbCBMViBkZXZpY2UgJXMgbm90IHVzYWJsZS4iLAorCQkJCQkgICAgIGRldl9uYW1lKGRldiksIHV1aWQsIG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoISh2Z25hbWUgPSBkbV9zdHJkdXAobmFtZSkpIHx8CisJCSAgICAhZG1fc3BsaXRfbHZtX25hbWUoTlVMTCwgTlVMTCwgJnZnbmFtZSwgJmx2bmFtZSwgJmxheWVyKSkKKwkJCWdvdG9fb3V0OworCisJCS8qIEZJWE1FOiBmYWlscyB0byBoYW5kbGUgZGV2IGFsaWFzZXMgaS5lLiAvZGV2L2RtLTUsIHJlcGxhY2Ugd2l0aCBVVUlEIHN1ZmZpeCAqLworCQlpZiAobHZuYW1lICYmIChpc19yZXNlcnZlZF9sdm5hbWUobHZuYW1lKSB8fCAqbGF5ZXIpKSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IFJlc2VydmVkIGludGVybmFsIExWIGRldmljZSAlcy8lcyVzJXMgbm90IHVzYWJsZS4iLAorCQkJCQkgICAgIGRldl9uYW1lKGRldiksIHZnbmFtZSwgbHZuYW1lLCAqbGF5ZXIgPyAiLSIgOiAiIiwgbGF5ZXIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBGSVhNRSBBbHNvIGNoZWNrIGZvciBtcGF0aCBubyBwYXRocyAqLworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwKKwkJCQkJICAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCisJCWlmIChjaGVjay5jaGVja19ibG9ja2VkICYmIHRhcmdldF90eXBlICYmICFzdHJjbXAodGFyZ2V0X3R5cGUsIFRBUkdFVF9OQU1FX01JUlJPUikpIHsKKwkJCWlmIChpZ25vcmVfbHZtX21pcnJvcnMoKSkgeworCQkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogU2Nhbm5pbmcgbWlycm9yIGRldmljZXMgaXMgZGlzYWJsZWQuIiwgZGV2X25hbWUoZGV2KSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoIV9pZ25vcmVfYmxvY2tlZF9taXJyb3JfZGV2aWNlcyhkZXYsIHN0YXJ0LAorCQkJCQkJCSAgICBsZW5ndGgsIHBhcmFtcykpIHsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IE1pcnJvciBkZXZpY2UgJXMgbm90IHVzYWJsZS4iLAorCQkJCQkJICAgICBkZXZfbmFtZShkZXYpLCBuYW1lKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIEZJWE1FOiBTbmFwc2hvdCBvcmlnaW4gY291bGQgYmUgc2l0dGluZyBvbiB0b3Agb2YgYSBtaXJyb3IKKwkJICogd2hpY2ggY291bGQgYmUgYmxvY2tpbmcgSS9PLiBXZSBzaG91bGQgYWRkIGEgY2hlY2sgZm9yIHRoZQorCQkgKiBzdGFjayBoZXJlIGFuZCBzZWUgaWYgdGhlcmUncyBibG9ja2VkIG1pcnJvciB1bmRlcm5lYXRoLgorCQkgKiBDdXJyZW50bHksIG1pcnJvcnMgdXNlZCBhcyBvcmlnaW4gb3Igc25hcHNob3QgaXMgbm90CisJCSAqIHN1cHBvcnRlZCBhbnltb3JlIGFuZCBpbiBnZW5lcmFsIHVzaW5nIG1pcnJvcnMgaW4gYSBzdGFjaworCQkgKiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICh3aXRoIGEgd2FybmluZyB0aGF0IGlmIGVuYWJsZWQsCisJCSAqIGl0IGNvdWxkIGNhdXNlIHZhcmlvdXMgZGVhZGxvY2tzKS4KKwkJICogU2ltaWxhciBzaXR1YXRpb24gY2FuIGhhcHBlbiB3aXRoIFJBSUQgZGV2aWNlcyB3aGVyZQorCQkgKiBhIFJBSUQgZGV2aWNlIGNhbiBiZSBzbmFwc2hvdHRlZC4KKwkJICogSWYgb25lIG9mIHRoZSBSQUlEIGxlZ3MgYXJlIGRvd24gYW5kIHdlJ3JlIGRvaW5nCisJCSAqIGx2Y29udmVydCAtLXJlcGFpciwgdGhlcmUncyBhIHRpbWUgcGVyaW9kIGluIHdoaWNoCisJCSAqIHNuYXBzaG90IGNvbXBvbmVudHMgYXJlIChiZXNpZGVzIG90aGVyIGRldnMpIHN1c3BlbmRlZC4KKwkJICogU2VlIGFsc28gaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjE5MjIyCisJCSAqIGZvciBhbiBleGFtcGxlIHdoZXJlIHRoaXMgY2F1c2VzIHByb2JsZW1zLgorCQkgKgorCQkgKiBUaGlzIGlzIGEgcXVpY2sgY2hlY2sgZm9yIG5vdywgYnV0IHJlcGxhY2UgaXQgd2l0aCBtb3JlCisJCSAqIHJvYnVzdCBhbmQgYmV0dGVyIGNoZWNrIHRoYXQgd291bGQgY2hlY2sgdGhlIHN0YWNrCisJCSAqIGNvcnJlY3RseSwgbm90IGp1c3Qgc25hcHNob3RzIGJ1dCBhbnkgY29iaW1uYXRpb24gcG9zc2libGUKKwkJICogaW4gYSBzdGFjayAtIHVzZSBwcm9wZXIgZG0gdHJlZSB0byBjaGVjayB0aGlzIGluc3RlYWQuCisJCSAqLworCQlpZiAoY2hlY2suY2hlY2tfc3VzcGVuZGVkICYmIHRhcmdldF90eXBlICYmCisJCSAgICAoIXN0cmNtcCh0YXJnZXRfdHlwZSwgVEFSR0VUX05BTUVfU05BUFNIT1QpIHx8ICFzdHJjbXAodGFyZ2V0X3R5cGUsIFRBUkdFVF9OQU1FX1NOQVBTSE9UX09SSUdJTikpICYmCisJCSAgICBfaWdub3JlX3N1c3BlbmRlZF9zbmFwc2hvdF9jb21wb25lbnQoZGV2KSkgeworCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIiVzOiAlcyBkZXZpY2UgJXMgbm90IHVzYWJsZS4iLCBkZXZfbmFtZShkZXYpLCB0YXJnZXRfdHlwZSwgbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFRPRE86IGV4dGVuZCBjaGVjayBzdHJ1Y3QgPyAqLworCQlpZiAodGFyZ2V0X3R5cGUgJiYgIXN0cmNtcCh0YXJnZXRfdHlwZSwgVEFSR0VUX05BTUVfVEhJTikgJiYKKwkJICAgICFfaWdub3JlX3VudXNhYmxlX3RoaW5zKGRldikpIHsKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogJXMgZGV2aWNlICVzIG5vdCB1c2FibGUuIiwgZGV2X25hbWUoZGV2KSwgdGFyZ2V0X3R5cGUsIG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAodGFyZ2V0X3R5cGUgJiYgc3RyY21wKHRhcmdldF90eXBlLCBUQVJHRVRfTkFNRV9FUlJPUikpCisJCQlvbmx5X2Vycm9yX3RhcmdldCA9IDA7CisJfSB3aGlsZSAobmV4dCk7CisKKwkvKiBTa2lwIGRldmljZXMgY29uc2lzdGluZyBlbnRpcmVseSBvZiBlcnJvciB0YXJnZXRzLiAqLworCS8qIEZJWE1FIERlYWwgd2l0aCBkZXZpY2Ugc3RhY2tlZCBhYm92ZSBlcnJvciB0YXJnZXRzPyAqLworCWlmIChjaGVjay5jaGVja19lcnJvcl90YXJnZXQgJiYgb25seV9lcnJvcl90YXJnZXQpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIiVzOiBFcnJvciBkZXZpY2UgJXMgbm90IHVzYWJsZS4iLAorCQkJCSAgICAgZGV2X25hbWUoZGV2KSwgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEZJWE1FIEFsc28gY2hlY2sgZGVwZW5kZW5jaWVzPyAqLworCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlkbV9mcmVlKHZnbmFtZSk7CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBJZiBhY3RpdmUgTFZzIHdlcmUgYWN0aXZhdGVkIGJ5IGEgdmVyc2lvbiBvZiBMVk0yIGJlZm9yZSAyLjAyLjAwIHdlIG11c3QKKyAqIHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgdG8gZmluZCB0aGVtIGJlY2F1c2UgdGhleSBkbyBub3QgaGF2ZSB0aGUgTFZNLQorICogcHJlZml4IG9uIHRoZWlyIGRtIHV1aWRzLgorICogQXMgb2YgMi4wMi4xNTAsIHdlJ3ZlIGNob3NlbiB0byBkaXNhYmxlIHRoaXMgY29tcGF0aWJpbGl0eSBhcmJpdHJhcmlseSBpZgorICogd2UncmUgcnVubmluZyBrZXJuZWwgdmVyc2lvbiAzIG9yIGFib3ZlLgorICovCisjZGVmaW5lIE1JTl9LRVJORUxfTUFKT1IgMworCitzdGF0aWMgaW50IF9vcmlnaW5hbF91dWlkX2Zvcm1hdF9jaGVja19yZXF1aXJlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdGF0aWMgaW50IF9rZXJuZWxfbWFqb3IgPSAwOworCisJaWYgKCFfa2VybmVsX21ham9yKSB7CisJCWlmICgoc3NjYW5mKGNtZC0+a2VybmVsX3ZzbiwgIiVkIiwgJl9rZXJuZWxfbWFqb3IpID09IDEpICYmCisJCSAgICAoX2tlcm5lbF9tYWpvciA+PSBNSU5fS0VSTkVMX01BSk9SKSkKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJTa2lwcGluZyBjaGVja3MgZm9yIG9sZCBkZXZpY2VzIHdpdGhvdXQgIiBVVUlEX1BSRUZJWAorCQkJCQkgICAgICIgZG0gdXVpZCBwcmVmaXggKGtlcm5lbCB2c24gJWQgPj0gJWQpLiIsIF9rZXJuZWxfbWFqb3IsIE1JTl9LRVJORUxfTUFKT1IpOworCQllbHNlCisJCQlfa2VybmVsX21ham9yID0gLTE7CisJfQorCisJcmV0dXJuIChfa2VybmVsX21ham9yID09IC0xKTsKK30KKworc3RhdGljIGludCBfaW5mbyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGxpZCwgaW50IHdpdGhfb3Blbl9jb3VudCwgaW50IHdpdGhfcmVhZF9haGVhZCwKKwkJIHN0cnVjdCBkbV9pbmZvICpkbWluZm8sIHVpbnQzMl90ICpyZWFkX2FoZWFkLAorCQkgc3RydWN0IGx2X3NlZ19zdGF0dXMgKnNlZ19zdGF0dXMpCit7CisJaW50IHIgPSAwOworCWNoYXIgb2xkX3N0eWxlX2RsaWRbc2l6ZW9mKFVVSURfUFJFRklYKSArIDIgKiBJRF9MRU5dOworCWNvbnN0IGNoYXIgKnN1ZmZpeCwgKnN1ZmZpeF9wb3NpdGlvbjsKKwl1bnNpZ25lZCBpID0gMDsKKworCS8qIENoZWNrIGZvciBkbGlkICovCisJaWYgKChyID0gX2luZm9fcnVuKHNlZ19zdGF0dXMgPyBTVEFUVVMgOiBJTkZPLCBOVUxMLCBkbGlkLCBkbWluZm8sIHJlYWRfYWhlYWQsCisJCQkgICBzZWdfc3RhdHVzLCB3aXRoX29wZW5fY291bnQsIHdpdGhfcmVhZF9haGVhZCwgMCwgMCkpICYmIGRtaW5mby0+ZXhpc3RzKQorCQlyZXR1cm4gMTsKKworCS8qIENoZWNrIGZvciBvcmlnaW5hbCB2ZXJzaW9uIG9mIGRsaWQgYmVmb3JlIHRoZSBzdWZmaXhlcyBnb3QgYWRkZWQgaW4gMi4wMi4xMDYgKi8KKwlpZiAoKHN1ZmZpeF9wb3NpdGlvbiA9IHJpbmRleChkbGlkLCAnLScpKSkgeworCQl3aGlsZSAoKHN1ZmZpeCA9IHV1aWRfc3VmZml4X2xpc3RbaSsrXSkpIHsKKwkJCWlmIChzdHJjbXAoc3VmZml4X3Bvc2l0aW9uICsgMSwgc3VmZml4KSkKKwkJCQljb250aW51ZTsKKworCQkJKHZvaWQpIHN0cm5jcHkob2xkX3N0eWxlX2RsaWQsIGRsaWQsIHNpemVvZihvbGRfc3R5bGVfZGxpZCkpOworCQkJb2xkX3N0eWxlX2RsaWRbc2l6ZW9mKG9sZF9zdHlsZV9kbGlkKSAtIDFdID0gJ1wwJzsKKwkJCWlmICgociA9IF9pbmZvX3J1bihzZWdfc3RhdHVzID8gU1RBVFVTIDogSU5GTywgTlVMTCwgb2xkX3N0eWxlX2RsaWQsIGRtaW5mbywKKwkJCQkJICAgcmVhZF9haGVhZCwgc2VnX3N0YXR1cywgd2l0aF9vcGVuX2NvdW50LAorCQkJCQkgICB3aXRoX3JlYWRfYWhlYWQsIDAsIDApKSAmJiBkbWluZm8tPmV4aXN0cykKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIE11c3Qgd2Ugc3RpbGwgY2hlY2sgZm9yIHRoZSBwcmUtMi4wMi4wMCBkbSB1dWlkIGZvcm1hdD8gKi8KKwlpZiAoIV9vcmlnaW5hbF91dWlkX2Zvcm1hdF9jaGVja19yZXF1aXJlZChjbWQpKQorCQlyZXR1cm4gcjsKKworCS8qIENoZWNrIGZvciBkbGlkIGJlZm9yZSBVVUlEX1BSRUZJWCB3YXMgYWRkZWQgKi8KKwlpZiAoKHIgPSBfaW5mb19ydW4oc2VnX3N0YXR1cyA/IFNUQVRVUyA6IElORk8sIE5VTEwsIGRsaWQgKyBzaXplb2YoVVVJRF9QUkVGSVgpIC0gMSwKKwkJCQlkbWluZm8sIHJlYWRfYWhlYWQsIHNlZ19zdGF0dXMsIHdpdGhfb3Blbl9jb3VudCwKKwkJCQl3aXRoX3JlYWRfYWhlYWQsIDAsIDApKSAmJiBkbWluZm8tPmV4aXN0cykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfaW5mb19ieV9kZXYodWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLCBzdHJ1Y3QgZG1faW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gX2luZm9fcnVuKElORk8sIE5VTEwsIE5VTEwsIGluZm8sIE5VTEwsIDAsIDAsIDAsIG1ham9yLCBtaW5vcik7Cit9CisKK2ludCBkZXZfbWFuYWdlcl9pbmZvKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIGNvbnN0IGNoYXIgKmxheWVyLAorCQkgICAgIGludCB3aXRoX29wZW5fY291bnQsIGludCB3aXRoX3JlYWRfYWhlYWQsCisJCSAgICAgc3RydWN0IGRtX2luZm8gKmRtaW5mbywgdWludDMyX3QgKnJlYWRfYWhlYWQsCisJCSAgICAgc3RydWN0IGx2X3NlZ19zdGF0dXMgKnNlZ19zdGF0dXMpCit7CisJY2hhciAqZGxpZCwgKm5hbWU7CisJaW50IHI7CisKKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShjbWQtPm1lbSwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSwgbGF5ZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbGlkID0gYnVpbGRfZG1fdXVpZChjbWQtPm1lbSwgbHYsIGxheWVyKSkpIHsKKwkJciA9IDA7CisJCWdvdG9fb3V0OworCX0KKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJHZXR0aW5nIGRldmljZSBpbmZvIGZvciAlcyBbJXNdIiwgbmFtZSwgZGxpZCk7CisJciA9IF9pbmZvKGNtZCwgZGxpZCwgd2l0aF9vcGVuX2NvdW50LCB3aXRoX3JlYWRfYWhlYWQsCisJCSAgZG1pbmZvLCByZWFkX2FoZWFkLCBzZWdfc3RhdHVzKTsKK291dDoKKwlkbV9wb29sX2ZyZWUoY21kLT5tZW0sIG5hbWUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1faW5mbyAqX2NhY2hlZF9kbV9pbmZvKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCSAgICAgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgICAgY29uc3QgY2hhciAqbGF5ZXIpCit7CisJY2hhciAqZGxpZDsKKwljb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZTsKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqZGluZm8gPSBOVUxMOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQobWVtLCBsdiwgbGF5ZXIpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIShkbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQoZHRyZWUsIGRsaWQpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShkaW5mbyA9IGRtX3RyZWVfbm9kZV9nZXRfaW5mbyhkbm9kZSkpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBDYW5ub3QgZ2V0IGluZm8gZnJvbSB0cmVlIG5vZGUgZm9yICVzLiIsCisJCQkgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkaW5mby0+ZXhpc3RzKQorCQlkaW5mbyA9IE5VTEw7CitvdXQ6CisJZG1fcG9vbF9mcmVlKG1lbSwgZGxpZCk7CisKKwlyZXR1cm4gZGluZm87Cit9CisKK2ludCBsdl9oYXNfdGFyZ2V0X3R5cGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmxheWVyLCBjb25zdCBjaGFyICp0YXJnZXRfdHlwZSkKK3sKKwlpbnQgciA9IDA7CisJY2hhciAqZGxpZDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJdm9pZCAqbmV4dCA9IE5VTEw7CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aDsKKwljaGFyICp0eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQobWVtLCBsdiwgbGF5ZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbXQgPSBfc2V0dXBfdGFzayhOVUxMLCBkbGlkLCAwLCBETV9ERVZJQ0VfU1RBVFVTLCAwLCAwLCAwLCAwKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSB8fCAhaW5mby5leGlzdHMpCisJCWdvdG9fb3V0OworCisJLyogSWYgdGhlcmUgaXMgYSBwcmVsb2FkZWQgdGFibGUsIHVzZSB0aGF0IGluIHByZWZlcmVuY2UuICovCisJaWYgKGluZm8uaW5hY3RpdmVfdGFibGUpIHsKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwkJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soTlVMTCwgZGxpZCwgMCwgRE1fREVWSUNFX1NUQVRVUywgMCwgMCwgMCwgMCkpKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKCFkbV90YXNrX3F1ZXJ5X2luYWN0aXZlX3RhYmxlKGRtdCkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzIHx8ICFpbmZvLmluYWN0aXZlX3RhYmxlKQorCQkJZ290b19vdXQ7CisJfQorCisJZG8geworCQluZXh0ID0gZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnN0YXJ0LCAmbGVuZ3RoLAorCQkJCQkgICZ0eXBlLCAmcGFyYW1zKTsKKwkJaWYgKHR5cGUgJiYgIXN0cm5jbXAodHlwZSwgdGFyZ2V0X3R5cGUsIHN0cmxlbih0YXJnZXRfdHlwZSkpKSB7CisJCQlyID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAobmV4dCk7CisKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKK2JhZDoKKwlkbV9wb29sX2ZyZWUobWVtLCBkbGlkKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF90aGluX2x2X2hhc19kZXZpY2VfaWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIGNvbnN0IGNoYXIgKmxheWVyLCB1bnNpZ25lZCBkZXZpY2VfaWQpCit7CisJY2hhciAqZGxpZDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJdm9pZCAqbmV4dCA9IE5VTEw7CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aDsKKwljaGFyICp0eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCXVuc2lnbmVkIGlkID0gfjA7CisKKwlpZiAoIShkbGlkID0gYnVpbGRfZG1fdXVpZChtZW0sIGx2LCBsYXllcikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKE5VTEwsIGRsaWQsIDAsIERNX0RFVklDRV9UQUJMRSwgMCwgMCwgMCwgMSkpKQorCQlnb3RvX2JhZDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCS8qIElmIHRoZXJlIGlzIGEgcHJlbG9hZGVkIHRhYmxlLCB1c2UgdGhhdCBpbiBwcmVmZXJlbmNlLiAqLworCWlmIChpbmZvLmluYWN0aXZlX3RhYmxlKSB7CisJCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKE5VTEwsIGRsaWQsIDAsIERNX0RFVklDRV9UQUJMRSwgMCwgMCwgMCwgMSkpKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKCFkbV90YXNrX3F1ZXJ5X2luYWN0aXZlX3RhYmxlKGRtdCkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzIHx8ICFpbmZvLmluYWN0aXZlX3RhYmxlKQorCQkJZ290b19vdXQ7CisJfQorCisJKHZvaWQpIGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwgJnR5cGUsICZwYXJhbXMpOworCisJaWYgKCF0eXBlIHx8IHN0cmNtcCh0eXBlLCBUQVJHRVRfTkFNRV9USElOKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIXBhcmFtcyB8fCBzc2NhbmYocGFyYW1zLCAiJSp1OiUqdSAldSIsICZpZCkgIT0gMSkKKwkJZ290b19vdXQ7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXNvYWRlZCB0aGluIHZvbHVtZSAlcyB3aXRoIGlkICV1IGlzICVzbWF0Y2hpbmcgaWQgJXUuIiwKKwkJCSAgICAgaW5mby5pbmFjdGl2ZV90YWJsZSAgPyAiUHJlbCIgOiAiTCIsCisJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgaWQsCisJCQkgICAgIChkZXZpY2VfaWQgIT0gaWQpID8gIm5vdCAiIDogIiIsIGRldmljZV9pZCk7CitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CitiYWQ6CisJZG1fcG9vbF9mcmVlKG1lbSwgZGxpZCk7CisKKwlyZXR1cm4gKGRldmljZV9pZCA9PSBpZCk7Cit9CisKK2ludCBhZGRfbGluZWFyX2FyZWFfdG9fZHRyZWUoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDY0X3Qgc2l6ZSwgdWludDMyX3QgZXh0ZW50X3NpemUsIGludCB1c2VfbGluZWFyX3RhcmdldCwgY29uc3QgY2hhciAqdmduYW1lLCBjb25zdCBjaGFyICpsdm5hbWUpCit7CisJdWludDMyX3QgcGFnZV9zaXplOworCisJLyoKKwkgKiBVc2Ugc3RyaXBlZCBvciBsaW5lYXIgdGFyZ2V0PworCSAqLworCWlmICghdXNlX2xpbmVhcl90YXJnZXQpIHsKKwkJcGFnZV9zaXplID0gbHZtX2dldHBhZ2VzaXplKCkgPj4gU0VDVE9SX1NISUZUOworCisJCS8qCisJCSAqIFdlJ2xsIHVzZSB0aGUgZXh0ZW50IHNpemUgYXMgdGhlIHN0cmlwZSBzaXplLgorCQkgKiBFeHRlbnQgc2l6ZSBhbmQgcGFnZSBzaXplIGFyZSBhbHdheXMgcG93ZXJzIG9mIDIuCisJCSAqIFRoZSBzdHJpcGVkIHRhcmdldCByZXF1aXJlcyB0aGF0IHRoZSBzdHJpcGUgc2l6ZSBpcworCQkgKiBkaXZpc2libGUgYnkgdGhlIHBhZ2Ugc2l6ZS4KKwkJICovCisJCWlmIChleHRlbnRfc2l6ZSA+PSBwYWdlX3NpemUpIHsKKwkJCS8qIFVzZSBzdHJpcGVkIHRhcmdldCAqLworCQkJaWYgKCFkbV90cmVlX25vZGVfYWRkX3N0cmlwZWRfdGFyZ2V0KG5vZGUsIHNpemUsIGV4dGVudF9zaXplKSkKKwkJCQlyZXR1cm5fMDsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCS8qIFNvbWUgZXhvdGljIGNhc2VzIGFyZSB1bnN1cHBvcnRlZCBieSBzdHJpcGVkLiAqLworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFVzaW5nIGxpbmVhciB0YXJnZXQgZm9yICVzLyVzOiBTdHJpcGVkIHJlcXVpcmVzIGV4dGVudCBzaXplICglIiBQUkl1MzIgIiBzZWN0b3JzKSA+PSBwYWdlIHNpemUgKCUiIFBSSXUzMiAiKS4iLAorCQkJCSB2Z25hbWUsIGx2bmFtZSwgZXh0ZW50X3NpemUsIHBhZ2Vfc2l6ZSk7CisJfQorCisJLyoKKwkgKiBVc2UgbGluZWFyIHRhcmdldC4KKwkgKi8KKwlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfbGluZWFyX3RhcmdldChub2RlLCBzaXplKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGRtX3BlcmNlbnRfcmFuZ2VfdCBfY29tYmluZV9wZXJjZW50KGRtX3BlcmNlbnRfdCBhLCBkbV9wZXJjZW50X3QgYiwKKwkJCQkJICAgdWludDMyX3QgbnVtZXJhdG9yLCB1aW50MzJfdCBkZW5vbWluYXRvcikKK3sKKwlpZiAoYSA9PSBMVk1fUEVSQ0VOVF9NRVJHRV9GQUlMRUQgfHwgYiA9PSBMVk1fUEVSQ0VOVF9NRVJHRV9GQUlMRUQpCisJCXJldHVybiBMVk1fUEVSQ0VOVF9NRVJHRV9GQUlMRUQ7CisKKwlpZiAoYSA9PSBETV9QRVJDRU5UX0lOVkFMSUQgfHwgYiA9PSBETV9QRVJDRU5UX0lOVkFMSUQpCisJCXJldHVybiBETV9QRVJDRU5UX0lOVkFMSUQ7CisKKwlpZiAoYSA9PSBETV9QRVJDRU5UXzEwMCAmJiBiID09IERNX1BFUkNFTlRfMTAwKQorCQlyZXR1cm4gRE1fUEVSQ0VOVF8xMDA7CisKKwlpZiAoYSA9PSBETV9QRVJDRU5UXzAgJiYgYiA9PSBETV9QRVJDRU5UXzApCisJCXJldHVybiBETV9QRVJDRU5UXzA7CisKKwlyZXR1cm4gKGRtX3BlcmNlbnRfcmFuZ2VfdCkgZG1fbWFrZV9wZXJjZW50KG51bWVyYXRvciwgZGVub21pbmF0b3IpOworfQorCitzdGF0aWMgaW50IF9wZXJjZW50X3J1bihzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3QgY2hhciAqZGxpZCwKKwkJCWNvbnN0IGNoYXIgKnRhcmdldF90eXBlLCBpbnQgd2FpdCwKKwkJCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGRtX3BlcmNlbnRfdCAqb3ZlcmFsbF9wZXJjZW50LAorCQkJdWludDMyX3QgKmV2ZW50X25yLCBpbnQgZmFpbF9pZl9wZXJjZW50X3Vuc3VwcG9ydGVkKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJdm9pZCAqbmV4dCA9IE5VTEw7CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aDsKKwljaGFyICp0eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBkbV9saXN0ICpzZWdoID0gbHYgPyAmbHYtPnNlZ21lbnRzIDogTlVMTDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gTlVMTDsKKwlpbnQgZmlyc3RfdGltZSA9IDE7CisJZG1fcGVyY2VudF90IHBlcmNlbnQgPSBETV9QRVJDRU5UX0lOVkFMSUQ7CisJdWludDY0X3QgdG90YWxfbnVtZXJhdG9yID0gMCwgdG90YWxfZGVub21pbmF0b3IgPSAwOworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisKKwkqb3ZlcmFsbF9wZXJjZW50ID0gcGVyY2VudDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhkbS0+Y21kLCB0YXJnZXRfdHlwZSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKG5hbWUsIGRsaWQsIGV2ZW50X25yLAorCQkJCXdhaXQgPyBETV9ERVZJQ0VfV0FJVEVWRU5UIDogRE1fREVWSUNFX1NUQVRVUywgMCwgMCwgMCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCWlmIChldmVudF9ucikKKwkJKmV2ZW50X25yID0gaW5mby5ldmVudF9ucjsKKworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwgJnR5cGUsCisJCQkJCSAgJnBhcmFtcyk7CisJCWlmIChsdikgeworCQkJaWYgKCEoc2VnaCA9IGRtX2xpc3RfbmV4dCgmbHYtPnNlZ21lbnRzLCBzZWdoKSkpIHsKKwkJCQlsb2dfZXJyb3IoIk51bWJlciBvZiBzZWdtZW50cyBpbiBhY3RpdmUgTFYgJXMgIgorCQkJCQkgICJkb2VzIG5vdCBtYXRjaCBtZXRhZGF0YS4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzZWcgPSBkbV9saXN0X2l0ZW0oc2VnaCwgc3RydWN0IGx2X3NlZ21lbnQpOworCQl9CisKKwkJaWYgKCF0eXBlIHx8ICFwYXJhbXMpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RyY21wKHR5cGUsIHRhcmdldF90eXBlKSkgeworCQkJLyogSWYga2VybmVsJ3MgdHlwZSBpc24ndCBhbiBleGFjdCBtYXRjaCBpcyBpdCBjb21wYXRpYmxlPyAqLworCQkJaWYgKCFzZWd0eXBlLT5vcHMtPnRhcmdldF9zdGF0dXNfY29tcGF0aWJsZSB8fAorCQkJICAgICFzZWd0eXBlLT5vcHMtPnRhcmdldF9zdGF0dXNfY29tcGF0aWJsZSh0eXBlKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc2VndHlwZS0+b3BzLT50YXJnZXRfcGVyY2VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc2VndHlwZS0+b3BzLT50YXJnZXRfcGVyY2VudCgmZG0tPnRhcmdldF9zdGF0ZSwKKwkJCQkJCSAgJnBlcmNlbnQsIGRtLT5tZW0sCisJCQkJCQkgIGRtLT5jbWQsIHNlZywgcGFyYW1zLAorCQkJCQkJICAmdG90YWxfbnVtZXJhdG9yLAorCQkJCQkJICAmdG90YWxfZGVub21pbmF0b3IpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKGZpcnN0X3RpbWUpIHsKKwkJCSpvdmVyYWxsX3BlcmNlbnQgPSBwZXJjZW50OworCQkJZmlyc3RfdGltZSA9IDA7CisJCX0gZWxzZQorCQkJKm92ZXJhbGxfcGVyY2VudCA9CisJCQkJX2NvbWJpbmVfcGVyY2VudCgqb3ZlcmFsbF9wZXJjZW50LCBwZXJjZW50LAorCQkJCQkJIHRvdGFsX251bWVyYXRvciwgdG90YWxfZGVub21pbmF0b3IpOworCX0gd2hpbGUgKG5leHQpOworCisJaWYgKGx2ICYmIGRtX2xpc3RfbmV4dCgmbHYtPnNlZ21lbnRzLCBzZWdoKSkgeworCQlsb2dfZXJyb3IoIk51bWJlciBvZiBzZWdtZW50cyBpbiBhY3RpdmUgTFYgJXMgZG9lcyBub3QgIgorCQkJICAibWF0Y2ggbWV0YWRhdGEuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZpcnN0X3RpbWUpIHsKKwkJLyogYWJvdmUgLT50YXJnZXRfcGVyY2VudCgpIHdhcyBub3QgZXhlY3V0ZWQhICovCisJCS8qIEZJWE1FIHdoeSByZXR1cm4gUEVSQ0VOVF8xMDAgZXQuIGFsLiBpbiB0aGlzIGNhc2U/ICovCisJCSpvdmVyYWxsX3BlcmNlbnQgPSBETV9QRVJDRU5UXzEwMDsKKwkJaWYgKGZhaWxfaWZfcGVyY2VudF91bnN1cHBvcnRlZCkKKwkJCWdvdG9fb3V0OworCX0KKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJMViBwZXJjZW50OiAlLjJmIiwgZG1fcGVyY2VudF90b19mbG9hdCgqb3ZlcmFsbF9wZXJjZW50KSk7CisJciA9IDE7CisKKyAgICAgIG91dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcGVyY2VudChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkbGlkLAorCQkgICAgY29uc3QgY2hhciAqdGFyZ2V0X3R5cGUsIGludCB3YWl0LAorCQkgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgZG1fcGVyY2VudF90ICpwZXJjZW50LAorCQkgICAgdWludDMyX3QgKmV2ZW50X25yLCBpbnQgZmFpbF9pZl9wZXJjZW50X3Vuc3VwcG9ydGVkKQoreworCWlmIChkbGlkICYmICpkbGlkKSB7CisJCWlmIChfcGVyY2VudF9ydW4oZG0sIE5VTEwsIGRsaWQsIHRhcmdldF90eXBlLCB3YWl0LCBsdiwgcGVyY2VudCwKKwkJCQkgZXZlbnRfbnIsIGZhaWxfaWZfcGVyY2VudF91bnN1cHBvcnRlZCkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSBpZiAoX29yaWdpbmFsX3V1aWRfZm9ybWF0X2NoZWNrX3JlcXVpcmVkKGRtLT5jbWQpICYmCisJCQkgX3BlcmNlbnRfcnVuKGRtLCBOVUxMLCBkbGlkICsgc2l6ZW9mKFVVSURfUFJFRklYKSAtIDEsCisJCQkJICAgICAgdGFyZ2V0X3R5cGUsIHdhaXQsIGx2LCBwZXJjZW50LAorCQkJCSAgICAgIGV2ZW50X25yLCBmYWlsX2lmX3BlcmNlbnRfdW5zdXBwb3J0ZWQpKQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKG5hbWUgJiYgX3BlcmNlbnRfcnVuKGRtLCBuYW1lLCBOVUxMLCB0YXJnZXRfdHlwZSwgd2FpdCwgbHYsIHBlcmNlbnQsCisJCQkJIGV2ZW50X25yLCBmYWlsX2lmX3BlcmNlbnRfdW5zdXBwb3J0ZWQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybl8wOworfQorCisvKiBGSVhNRSBNZXJnZSB3aXRoIHRoZSBwZXJjZW50IGZ1bmN0aW9uICovCitpbnQgZGV2X21hbmFnZXJfdHJhbnNpZW50KHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnR5cGUgPSBOVUxMOworCWNoYXIgKnBhcmFtcyA9IE5VTEw7CisJY2hhciAqZGxpZCA9IE5VTEw7CisJY29uc3QgY2hhciAqbGF5ZXIgPSBsdl9sYXllcihsdik7CisJY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNlZ2ggPSAmbHYtPnNlZ21lbnRzOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBOVUxMOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGxheWVyKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soMCwgZGxpZCwgTlVMTCwgRE1fREVWSUNFX1NUQVRVUywgMCwgMCwgMCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwgJnR5cGUsCisJCQkJCSAgJnBhcmFtcyk7CisKKwkJaWYgKCEoc2VnaCA9IGRtX2xpc3RfbmV4dCgmbHYtPnNlZ21lbnRzLCBzZWdoKSkpIHsKKwkJICAgIGxvZ19lcnJvcigiTnVtYmVyIG9mIHNlZ21lbnRzIGluIGFjdGl2ZSBMViAlcyAiCisJCQkgICAgICAiZG9lcyBub3QgbWF0Y2ggbWV0YWRhdGEuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJICAgIGdvdG8gb3V0OworCQl9CisJCXNlZyA9IGRtX2xpc3RfaXRlbShzZWdoLCBzdHJ1Y3QgbHZfc2VnbWVudCk7CisKKwkJaWYgKCF0eXBlIHx8ICFwYXJhbXMpCisJCQljb250aW51ZTsKKworCQlpZiAoIXNlZykgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJTZWdtZW50IGlzIG5vdCBzZWxlY3RlZC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHNlZy0+c2VndHlwZS0+b3BzLT5jaGVja190cmFuc2llbnRfc3RhdHVzICYmCisJCSAgICAhc2VnLT5zZWd0eXBlLT5vcHMtPmNoZWNrX3RyYW5zaWVudF9zdGF0dXMoZG0tPm1lbSwgc2VnLCBwYXJhbXMpKQorCQkJZ290b19vdXQ7CisKKwl9IHdoaWxlIChuZXh0KTsKKworCWlmIChkbV9saXN0X25leHQoJmx2LT5zZWdtZW50cywgc2VnaCkpIHsKKwkJbG9nX2Vycm9yKCJOdW1iZXIgb2Ygc2VnbWVudHMgaW4gYWN0aXZlIExWICVzIGRvZXMgbm90ICIKKwkJCSAgIm1hdGNoIG1ldGFkYXRhLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSAxOworCisgICAgICBvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBkZXZfbWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IGRldl9tYW5hZ2VyICpkZXZfbWFuYWdlcl9jcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJICAgICAgIHVuc2lnbmVkIHRyYWNrX3B2bW92ZV9kZXBzKQoreworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJkZXZfbWFuYWdlciIsIDE2ICogMTAyNCkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKGRtID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKmRtKSkpKQorCQlnb3RvX2JhZDsKKworCWRtLT5jbWQgPSBjbWQ7CisJZG0tPm1lbSA9IG1lbTsKKwlkbS0+dmdfbmFtZSA9IHZnX25hbWU7CisKKwkvKgorCSAqIFdoZW4gd2UgbWFuaXB1bGF0ZSAobm9ybWFsbHkgc3VzcGVuZC9yZXN1bWUpIHRoZSBQVk1PVkUKKwkgKiBkZXZpY2UgZGlyZWN0bHksIHRoZXJlJ3Mgbm8gbmVlZCB0byB0b3VjaCB0aGUgTFZzIGFib3ZlLgorCSAqLworCWRtLT50cmFja19wdm1vdmVfZGVwcyA9IHRyYWNrX3B2bW92ZV9kZXBzOworCisJZG0tPnRhcmdldF9zdGF0ZSA9IE5VTEw7CisKKwlkbV91ZGV2X3NldF9zeW5jX3N1cHBvcnQoY21kLT5jdXJyZW50X3NldHRpbmdzLnVkZXZfc3luYyk7CisKKwlkbV9saXN0X2luaXQoJmRtLT5wZW5kaW5nX2RlbGV0ZSk7CisKKwlyZXR1cm4gZG07CisKKyAgICAgIGJhZDoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBkZXZfbWFuYWdlcl9kZXN0cm95KHN0cnVjdCBkZXZfbWFuYWdlciAqZG0pCit7CisJZG1fcG9vbF9kZXN0cm95KGRtLT5tZW0pOworfQorCit2b2lkIGRldl9tYW5hZ2VyX3JlbGVhc2Uodm9pZCkKK3sKKwlkbV9saWJfcmVsZWFzZSgpOworfQorCit2b2lkIGRldl9tYW5hZ2VyX2V4aXQodm9pZCkKK3sKKwlkbV9saWJfZXhpdCgpOworfQorCitpbnQgZGV2X21hbmFnZXJfc25hcHNob3RfcGVyY2VudChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBkbV9wZXJjZW50X3QgKnBlcmNlbnQpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzbmFwX2x2OworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGxpZDsKKwlpbnQgZmFpbF9pZl9wZXJjZW50X3Vuc3VwcG9ydGVkID0gMDsKKworCWlmIChsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJLyoKKwkJICogU2V0ICdmYWlsX2lmX3BlcmNlbnRfdW5zdXBwb3J0ZWQnLCBvdGhlcndpc2UgcGFzc2luZworCQkgKiB1bnN1cHBvcnRlZCBMViB0eXBlcyB0byBfcGVyY2VudCB3aWxsIGxlYWQgdG8gYSBkZWZhdWx0CisJCSAqIHN1Y2Nlc3NmdWwgcmV0dXJuIHdpdGggcGVyY2VudF9yYW5nZSBhcyBQRVJDRU5UXzEwMC4KKwkJICogLSBGb3IgYSBtZXJnaW5nIG9yaWdpbiwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHBvbGxkYWVtb24KKwkJICogICB0aGF0IHJ1bnMgaW5maW5pdGVseSAoYmVjYXVzZSBjb21wbGV0aW9uIGlzIFBFUkNFTlRfMCkKKwkJICogLSBXZSB1bmZvcnR1bmF0ZWx5IGRvbid0IHlldCBfa25vd18gaWYgYSBzbmFwc2hvdC1tZXJnZQorCQkgKiAgIHRhcmdldCBpcyBhY3RpdmUgKGFjdGl2YXRpb24gaXMgZGVmZXJyZWQgaWYgZGV2IGlzIG9wZW4pOworCQkgKiAgIHNvIHdlIGNhbid0IHNob3J0LWNpcmN1aXQgb3JpZ2luIGRldmljZXMgYmFzZWQgcHVyZWx5IG9uCisJCSAqICAgZXhpc3RpbmcgTFZNIExWIGF0dHJpYnV0ZXMuCisJCSAqLworCQlmYWlsX2lmX3BlcmNlbnRfdW5zdXBwb3J0ZWQgPSAxOworCX0KKworCWlmIChsdl9pc19tZXJnaW5nX2NvdyhsdikpIHsKKwkJLyogbXVzdCBjaGVjayBwZXJjZW50IG9mIG9yaWdpbiBmb3IgYSBtZXJnaW5nIHNuYXBzaG90ICovCisJCXNuYXBfbHYgPSBvcmlnaW5fZnJvbV9jb3cobHYpOworCX0gZWxzZQorCQlzbmFwX2x2ID0gbHY7CisKKwkvKgorCSAqIEJ1aWxkIGEgbmFtZSBmb3IgdGhlIHRvcCBsYXllci4KKwkgKi8KKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShkbS0+bWVtLCBzbmFwX2x2LT52Zy0+bmFtZSwgc25hcF9sdi0+bmFtZSwgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIHNuYXBfbHYsIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIFRyeSBhbmQgZ2V0IHNvbWUgaW5mbyBvbiB0aGlzIGRldmljZS4KKwkgKi8KKwlpZiAoIV9wZXJjZW50KGRtLCBuYW1lLCBkbGlkLCBUQVJHRVRfTkFNRV9TTkFQU0hPVCwgMCwgTlVMTCwgcGVyY2VudCwKKwkJICAgICAgTlVMTCwgZmFpbF9pZl9wZXJjZW50X3Vuc3VwcG9ydGVkKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBJZiB0aGUgc25hcHNob3QgaXNuJ3QgYXZhaWxhYmxlLCBwZXJjZW50IHdpbGwgYmUgLTEgKi8KKwlyZXR1cm4gMTsKK30KKworLyogRklYTUUgTWVyZ2Ugd2l0aCBzbmFwc2hvdF9wZXJjZW50LCBhdXRvLWRldGVjdGluZyB0YXJnZXQgdHlwZSAqLworLyogRklYTUUgQ29wZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGFyZ2V0ICovCitpbnQgZGV2X21hbmFnZXJfbWlycm9yX3BlcmNlbnQoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgd2FpdCwKKwkJCSAgICAgICBkbV9wZXJjZW50X3QgKnBlcmNlbnQsIHVpbnQzMl90ICpldmVudF9ucikKK3sKKwljaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmRsaWQ7CisJY29uc3QgY2hhciAqdGFyZ2V0X3R5cGUgPSBmaXJzdF9zZWcobHYpLT5zZWd0eXBlLT5uYW1lOworCWNvbnN0IGNoYXIgKmxheWVyID0gbHZfbGF5ZXIobHYpOworCisJLyoKKwkgKiBCdWlsZCBhIG5hbWUgZm9yIHRoZSB0b3AgbGF5ZXIuCisJICovCisJaWYgKCEobmFtZSA9IGRtX2J1aWxkX2RtX25hbWUoZG0tPm1lbSwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSwgbGF5ZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbGlkID0gYnVpbGRfZG1fdXVpZChkbS0+bWVtLCBsdiwgbGF5ZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiR2V0dGluZyBkZXZpY2UgJXMgc3RhdHVzIHBlcmNlbnRhZ2UgZm9yICVzIiwKKwkJCSAgICAgdGFyZ2V0X3R5cGUsIG5hbWUpOworCWlmICghX3BlcmNlbnQoZG0sIG5hbWUsIGRsaWQsIHRhcmdldF90eXBlLCB3YWl0LCBsdiwgcGVyY2VudCwKKwkJICAgICAgZXZlbnRfbnIsIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZGV2X21hbmFnZXJfcmFpZF9zdGF0dXMoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIHN0cnVjdCBkbV9zdGF0dXNfcmFpZCAqKnN0YXR1cykKK3sKKwlpbnQgciA9IDA7CisJY29uc3QgY2hhciAqZGxpZDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aDsKKwljaGFyICp0eXBlID0gTlVMTDsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCWNvbnN0IGNoYXIgKmxheWVyID0gbHZfbGF5ZXIobHYpOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGxheWVyKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soTlVMTCwgZGxpZCwgMCwgRE1fREVWSUNFX1NUQVRVUywgMCwgMCwgMCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCWRtX2dldF9uZXh0X3RhcmdldChkbXQsIE5VTEwsICZzdGFydCwgJmxlbmd0aCwgJnR5cGUsICZwYXJhbXMpOworCisJaWYgKCF0eXBlIHx8IHN0cmNtcCh0eXBlLCAicmFpZCIpKSB7CisJCWxvZ19lcnJvcigiRXhwZWN0ZWQgcmFpZCBzZWdtZW50IHR5cGUgYnV0IGdvdCAlcyBpbnN0ZWFkIiwKKwkJCSAgdHlwZSA/IHR5cGUgOiAiTlVMTCIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGSVhNRSBDaGVjayB0aGVyZSdzIG9ubHkgb25lIHRhcmdldCAqLworCisJaWYgKCFkbV9nZXRfc3RhdHVzX3JhaWQoZG0tPm1lbSwgcGFyYW1zLCBzdGF0dXMpKQorCQlnb3RvX291dDsKKworCXIgPSAxOworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkZXZfbWFuYWdlcl9yYWlkX21lc3NhZ2Uoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgY29uc3QgY2hhciAqbXNnKQoreworCWludCByID0gMDsKKwljb25zdCBjaGFyICpkbGlkOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJY29uc3QgY2hhciAqbGF5ZXIgPSBsdl9sYXllcihsdik7CisKKwlpZiAoIWx2X2lzX3JhaWQobHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgaXMgbm90IGEgUkFJRCBsb2dpY2FsIHZvbHVtZSIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIFJBSUQgbWVzc2FnZXMgZm9yIGRtLXJhaWQgdjEuNS4wICovCisJaWYgKHN0cmNtcChtc2csICJpZGxlIikgJiYKKwkgICAgc3RyY21wKG1zZywgImZyb3plbiIpICYmCisJICAgIHN0cmNtcChtc2csICJyZXN5bmMiKSAmJgorCSAgICBzdHJjbXAobXNnLCAicmVjb3ZlciIpICYmCisJICAgIHN0cmNtcChtc2csICJjaGVjayIpICYmCisJICAgIHN0cmNtcChtc2csICJyZXBhaXIiKSAmJgorCSAgICBzdHJjbXAobXNnLCAicmVzaGFwZSIpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5rbm93biBSQUlEIG1lc3NhZ2U6ICVzIiwgbXNnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGxheWVyKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZG10ID0gX3NldHVwX3Rhc2soTlVMTCwgZGxpZCwgMCwgRE1fREVWSUNFX1RBUkdFVF9NU0csIDAsIDAsIDAsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21lc3NhZ2UoZG10LCBtc2cpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlyID0gMTsKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitpbnQgZGV2X21hbmFnZXJfY2FjaGVfc3RhdHVzKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgIHN0cnVjdCBsdl9zdGF0dXNfY2FjaGUgKipzdGF0dXMpCit7CisJaW50IHIgPSAwOworCWNvbnN0IGNoYXIgKmRsaWQ7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJY2hhciAqdHlwZSA9IE5VTEw7CisJY2hhciAqcGFyYW1zID0gTlVMTDsKKwlzdHJ1Y3QgZG1fc3RhdHVzX2NhY2hlICpjOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKCpzdGF0dXMgPSBkbV9wb29sX3phbGxvYyhkbS0+bWVtLCBzaXplb2Yoc3RydWN0IGx2X3N0YXR1c19jYWNoZSkpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbXQgPSBfc2V0dXBfdGFzayhOVUxMLCBkbGlkLCAwLCBETV9ERVZJQ0VfU1RBVFVTLCAwLCAwLCAwLCAwKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSB8fCAhaW5mby5leGlzdHMpCisJCWdvdG9fb3V0OworCisJZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgTlVMTCwgJnN0YXJ0LCAmbGVuZ3RoLCAmdHlwZSwgJnBhcmFtcyk7CisKKwlpZiAoIXR5cGUgfHwgc3RyY21wKHR5cGUsIFRBUkdFVF9OQU1FX0NBQ0hFKSkgeworCQlsb2dfZXJyb3IoIkV4cGVjdGVkIGNhY2hlIHNlZ21lbnQgdHlwZSBidXQgZ290ICVzIGluc3RlYWQiLAorCQkJICB0eXBlID8gdHlwZSA6ICJOVUxMIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRklYTUU6CisJICogLT50YXJnZXRfcGVyY2VudCgpIEFQSSBpcyBhYmxlIHRvIHRyYW5zZmVyIG9ubHkgYSBzaW5nbGUgdmFsdWUuCisJICogTmVlZHMgdG8gYmUgYWJsZSB0byBwYXNzIHdob2xlIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoIWRtX2dldF9zdGF0dXNfY2FjaGUoZG0tPm1lbSwgcGFyYW1zLCAmYykpCisJCWdvdG9fb3V0OworCisJKCpzdGF0dXMpLT5jYWNoZSA9IGM7CisJKCpzdGF0dXMpLT5tZW0gPSBkbS0+bWVtOyAvKiBVc2VyIGhhcyB0byBkZXN0cm95IHRoaXMgbWVtIHBvb2wgbGF0ZXIgKi8KKwlpZiAoYy0+ZmFpbCB8fCBjLT5lcnJvcikgeworCQkoKnN0YXR1cyktPmRhdGFfdXNhZ2UgPQorCQkJKCpzdGF0dXMpLT5tZXRhZGF0YV91c2FnZSA9CisJCQkoKnN0YXR1cyktPmRpcnR5X3VzYWdlID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCX0gZWxzZSB7CisJCSgqc3RhdHVzKS0+ZGF0YV91c2FnZSA9IGRtX21ha2VfcGVyY2VudChjLT51c2VkX2Jsb2NrcywKKwkJCQkJCQljLT50b3RhbF9ibG9ja3MpOworCQkoKnN0YXR1cyktPm1ldGFkYXRhX3VzYWdlID0gZG1fbWFrZV9wZXJjZW50KGMtPm1ldGFkYXRhX3VzZWRfYmxvY2tzLAorCQkJCQkJCSAgICBjLT5tZXRhZGF0YV90b3RhbF9ibG9ja3MpOworCQkoKnN0YXR1cyktPmRpcnR5X3VzYWdlID0gZG1fbWFrZV9wZXJjZW50KGMtPmRpcnR5X2Jsb2NrcywKKwkJCQkJCQkgYy0+dXNlZF9ibG9ja3MpOworCX0KKwlyID0gMTsKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitpbnQgZGV2X21hbmFnZXJfdGhpbl9wb29sX3N0YXR1cyhzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgZG1fc3RhdHVzX3RoaW5fcG9vbCAqKnN0YXR1cywKKwkJCQkgaW50IGZsdXNoKQoreworCWNvbnN0IGNoYXIgKmRsaWQ7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJY2hhciAqdHlwZSA9IE5VTEw7CisJY2hhciAqcGFyYW1zID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwkvKiBCdWlsZCBkbGlkIGZvciB0aGUgdGhpbiBwb29sIGxheWVyICovCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRtdCA9IF9zZXR1cF90YXNrKE5VTEwsIGRsaWQsIDAsIERNX0RFVklDRV9TVEFUVVMsIDAsIDAsIDAsIGZsdXNoKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSB8fCAhaW5mby5leGlzdHMpCisJCWdvdG9fb3V0OworCisJZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgTlVMTCwgJnN0YXJ0LCAmbGVuZ3RoLCAmdHlwZSwgJnBhcmFtcyk7CisKKwkvKiBGSVhNRSBDaGVjayBmb3IgdGhpbiBhbmQgY2hlY2sgdGhlcmUncyBleGFjdGx5IG9uZSB0YXJnZXQgKi8KKworCWlmICghZG1fZ2V0X3N0YXR1c190aGluX3Bvb2woZG0tPm1lbSwgcGFyYW1zLCBzdGF0dXMpKQorCQlnb3RvX291dDsKKworCXIgPSAxOworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkZXZfbWFuYWdlcl90aGluX3Bvb2xfcGVyY2VudChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIGludCBtZXRhZGF0YSwgZG1fcGVyY2VudF90ICpwZXJjZW50KQoreworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGxpZDsKKworCS8qIEJ1aWxkIGEgbmFtZSBmb3IgdGhlIHRvcCBsYXllciAqLworCWlmICghKG5hbWUgPSBkbV9idWlsZF9kbV9uYW1lKGRtLT5tZW0sIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsCisJCQkJICAgICAgbHZfbGF5ZXIobHYpKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJHZXR0aW5nIGRldmljZSBzdGF0dXMgcGVyY2VudGFnZSBmb3IgJXMiLCBuYW1lKTsKKwlpZiAoIShfcGVyY2VudChkbSwgbmFtZSwgZGxpZCwgVEFSR0VUX05BTUVfVEhJTl9QT09MLCAwLAorCQkgICAgICAgKG1ldGFkYXRhKSA/IGx2IDogTlVMTCwgcGVyY2VudCwgTlVMTCwgMSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZGV2X21hbmFnZXJfdGhpbl9wZXJjZW50KHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgIGludCBtYXBwZWQsIGRtX3BlcmNlbnRfdCAqcGVyY2VudCkKK3sKKwljaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmRsaWQ7CisJY29uc3QgY2hhciAqbGF5ZXIgPSBsdl9sYXllcihsdik7CisKKwkvKiBCdWlsZCBhIG5hbWUgZm9yIHRoZSB0b3AgbGF5ZXIgKi8KKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShkbS0+bWVtLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLCBsYXllcikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIGx2LCBsYXllcikpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJHZXR0aW5nIGRldmljZSBzdGF0dXMgcGVyY2VudGFnZSBmb3IgJXMiLCBuYW1lKTsKKwlpZiAoIShfcGVyY2VudChkbSwgbmFtZSwgZGxpZCwgVEFSR0VUX05BTUVfVEhJTiwgMCwKKwkJICAgICAgIChtYXBwZWQpID8gTlVMTCA6IGx2LCBwZXJjZW50LCBOVUxMLCAxKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkZXZfbWFuYWdlcl90aGluX2RldmljZV9pZChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgdWludDMyX3QgKmRldmljZV9pZCkKK3sKKwljb25zdCBjaGFyICpkbGlkOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnBhcmFtcywgKnRhcmdldF90eXBlID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwkvKiBCdWlsZCBkbGlkIGZvciB0aGUgdGhpbiBsYXllciAqLworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIGx2LCBsdl9sYXllcihsdikpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbXQgPSBfc2V0dXBfdGFzayhOVUxMLCBkbGlkLCAwLCBETV9ERVZJQ0VfVEFCTEUsIDAsIDAsIDAsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pIHx8ICFpbmZvLmV4aXN0cykKKwkJZ290b19vdXQ7CisKKwlpZiAoZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgTlVMTCwgJnN0YXJ0LCAmbGVuZ3RoLAorCQkJICAgICAgICZ0YXJnZXRfdHlwZSwgJnBhcmFtcykpIHsKKwkJbG9nX2Vycm9yKCJNb3JlIHRoZW4gb25lIHRhYmxlIGxpbmUgZm91bmQgZm9yICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghdGFyZ2V0X3R5cGUgfHwgc3RyY21wKHRhcmdldF90eXBlLCBUQVJHRVRfTkFNRV9USElOKSkgeworCQlsb2dfZXJyb3IoIlVuZXhwZWN0ZWQgdGFyZ2V0IHR5cGUgJXMgZm91bmQgZm9yIHRoaW4gJXMuIiwKKwkJCSAgdGFyZ2V0X3R5cGUsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcGFyYW1zIHx8IHNzY2FuZihwYXJhbXMsICIlKnU6JSp1ICV1IiwgZGV2aWNlX2lkKSAhPSAxKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHBhcnNlIHRhYmxlIGxpa2UgcGFyYW1ldGVycyAlcyBmb3IgJXMuIiwKKwkJCSAgcGFyYW1zLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlnb3RvIG91dDsKKwl9CisKKwlyID0gMTsKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE5FVyBDT0RFIFNUQVJUUyBIRVJFICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfZGV2X21hbmFnZXJfbHZfbWtub2Rlcyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNoYXIgKm5hbWU7CisKKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShsdi0+dmctPmNtZC0+bWVtLCBsdi0+dmctPm5hbWUsCisJCQkJICAgICAgbHYtPm5hbWUsIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gZnNfYWRkX2x2KGx2LCBuYW1lKTsKK30KKworc3RhdGljIGludCBfZGV2X21hbmFnZXJfbHZfcm1ub2Rlcyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBmc19kZWxfbHYobHYpOworfQorCitzdGF0aWMgaW50IF9sdl9oYXNfbWtub2RlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIChsdl9pc192aXNpYmxlKGx2KSAmJgorCQkoIWx2X2lzX3RoaW5fcG9vbChsdikgfHwgbHZfaXNfbmV3X3RoaW5fcG9vbChsdikpKTsKK30KKworaW50IGRldl9tYW5hZ2VyX21rbm9kZXMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgZG1faW5mbyBkbWluZm87CisJY2hhciAqbmFtZTsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShsdi0+dmctPmNtZC0+bWVtLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJaWYgKChyID0gX2luZm9fcnVuKE1LTk9ERVMsIG5hbWUsIE5VTEwsICZkbWluZm8sIE5VTEwsIE5VTEwsIDAsIDAsIDAsIDApKSkgeworCQlpZiAoZG1pbmZvLmV4aXN0cykgeworCQkJaWYgKF9sdl9oYXNfbWtub2RlKGx2KSkKKwkJCQlyID0gX2Rldl9tYW5hZ2VyX2x2X21rbm9kZXMobHYpOworCQl9IGVsc2UKKwkJCXIgPSBfZGV2X21hbmFnZXJfbHZfcm1ub2Rlcyhsdik7CisJfQorCisJZG1fcG9vbF9mcmVlKGx2LT52Zy0+Y21kLT5tZW0sIG5hbWUpOworCXJldHVybiByOworfQorCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKKy8qCisgKiBVbnRpbCB0aGUgRE1fVUVWRU5UX0dFTkVSQVRFRF9GTEFHIHdhcyBpbnRyb2R1Y2VkIGluIGtlcm5lbCBwYXRjaAorICogODU2YTZmMWRiZDg5NDBlNzI3NTVhZjE0NWViY2Q4MDY0MDhlY2VkZAorICogc29tZSBvcGVyYXRpb25zIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYnkgdWRldiwgcmVxdWlyaW5nIG91ciBmYWxsYmFjayBjb2RlLgorICovCitzdGF0aWMgaW50IF9kbV9kcml2ZXJfaGFzX3N0YWJsZV91ZGV2X3N1cHBvcnQodm9pZCkKK3sKKwljaGFyIHZzbls4MF07CisJdW5zaWduZWQgbWFqLCBtaW4sIHBhdGNobGV2ZWw7CisKKwlyZXR1cm4gZHJpdmVyX3ZlcnNpb24odnNuLCBzaXplb2YodnNuKSkgJiYKKwkgICAgICAgKHNzY2FuZih2c24sICIldS4ldS4ldSIsICZtYWosICZtaW4sICZwYXRjaGxldmVsKSA9PSAzKSAmJgorCSAgICAgICAobWFqID09IDQgPyBtaW4gPj0gMTggOiBtYWogPiA0KTsKK30KKworc3RhdGljIGludCBfY2hlY2tfdWRldl9mYWxsYmFjayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgY29uZmlnX2luZm8gKnNldHRpbmdzID0gJmNtZC0+Y3VycmVudF9zZXR0aW5nczsKKworCWlmIChzZXR0aW5ncy0+dWRldl9mYWxsYmFjayAhPSAtMSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFVzZSB1ZGV2IGZhbGxiYWNrIGF1dG9tYXRpY2FsbHkgaW4gY2FzZSB1ZGV2CisJICogaXMgZGlzYWJsZWQgdmlhIERNX0RJU0FCTEVfVURFViBlbnZpcm9ubWVudAorCSAqIHZhcmlhYmxlIG9yIHVkZXYgcnVsZXMgYXJlIHN3aXRjaGVkIG9mZi4KKwkgKi8KKwlzZXR0aW5ncy0+dWRldl9mYWxsYmFjayA9ICFzZXR0aW5ncy0+dWRldl9ydWxlcyA/IDEgOgorCQlmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhY3RpdmF0aW9uX3ZlcmlmeV91ZGV2X29wZXJhdGlvbnNfQ0ZHLCBOVUxMKTsKKworCS8qIERvIG5vdCByZWx5IGZ1bGx5IG9uIHVkZXYgaWYgdGhlIHVkZXYgc3VwcG9ydCBpcyBrbm93biB0byBiZSBpbmNvbXBsZXRlLiAqLworCWlmICghc2V0dGluZ3MtPnVkZXZfZmFsbGJhY2sgJiYgIV9kbV9kcml2ZXJfaGFzX3N0YWJsZV91ZGV2X3N1cHBvcnQoKSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJLZXJuZWwgZHJpdmVyIGhhcyBpbmNvbXBsZXRlIHVkZXYgc3VwcG9ydCBzbyAiCisJCQkJICJMVk0gd2lsbCBjaGVjayBhbmQgcGVyZm9ybSBzb21lIG9wZXJhdGlvbnMgaXRzZWxmLiIpOworCQlzZXR0aW5ncy0+dWRldl9mYWxsYmFjayA9IDE7CisJfQorb3V0OgorCXJldHVybiBzZXR0aW5ncy0+dWRldl9mYWxsYmFjazsKK30KKworI2Vsc2UgLyogVURFVl9TWU5DX1NVUFBPUlQgKi8KKworc3RhdGljIGludCBfY2hlY2tfdWRldl9mYWxsYmFjayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwkvKiBXZSBtdXN0IHVzZSBvbGQgbm9kZS9zeW1saW5rIGNyZWF0aW9uIGNvZGUgaWYgbm90IGNvbXBpbGVkIHdpdGggdWRldiBzdXBwb3J0IGF0IGFsbCEgKi8KKwlyZXR1cm4gY21kLT5jdXJyZW50X3NldHRpbmdzLnVkZXZfZmFsbGJhY2sgPSAxOworfQorCisjZW5kaWYgLyogVURFVl9TWU5DX1NVUFBPUlQgKi8KKworc3RhdGljIHVpbnQxNl90IF9nZXRfdWRldl9mbGFncyhzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCWNvbnN0IGNoYXIgKmxheWVyLCBpbnQgbm9zY2FuLCBpbnQgdGVtcG9yYXJ5KQoreworCXVpbnQxNl90IHVkZXZfZmxhZ3MgPSAwOworCisJLyoKKwkgKiBJbnN0cnVjdCBhbHNvIGxpYmRldm1hcHBlciB0byBkaXNhYmxlIHVkZXYKKwkgKiBmYWxsYmFjayBpbiBhY2NvcmRhbmNlIHRvIExWTTIgc2V0dGluZ3MuCisJICovCisJaWYgKCFfY2hlY2tfdWRldl9mYWxsYmFjayhkbS0+Y21kKSkKKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0RJU0FCTEVfTElCUkFSWV9GQUxMQkFDSzsKKworCS8qCisJICogSXMgdGhpcyB0b3AtbGV2ZWwgYW5kIHZpc2libGUgZGV2aWNlPworCSAqIElmIG5vdCwgY3JlYXRlIGp1c3QgdGhlIC9kZXYvbWFwcGVyIGNvbnRlbnQuCisJICovCisJLyogRklYTUU6IGFkZCB0YXJnZXQncyBtZXRob2QgZm9yIHRoaXMgKi8KKwlpZiAobHZfaXNfbmV3X3RoaW5fcG9vbChsdikpCisJCS8qIE5ldyB0aGluLXBvb2wgaXMgcmVndWxhciBMViB3aXRoIC10cG9vbCBVVUlEIHN1ZmZpeC4gKi8KKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHIHwKKwkJICAgICAgICAgICAgICBETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBRzsKKwllbHNlIGlmIChsYXllciB8fCAhbHZfaXNfdmlzaWJsZShsdikgfHwgbHZfaXNfdGhpbl9wb29sKGx2KSkKKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUcgfAorCQkJICAgICAgRE1fVURFVl9ESVNBQkxFX0RJU0tfUlVMRVNfRkxBRyB8CisJCQkgICAgICBETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBRzsKKwkvKgorCSAqIFRoZXJlJ3Mgbm8gbmVlZCBmb3Igb3RoZXIgdWRldiBydWxlcyB0byB0b3VjaCBzcGVjaWFsIExWcyB3aXRoCisJICogcmVzZXJ2ZWQgbmFtZXMuIFdlIGRvbid0IG5lZWQgdG8gcG9wdWxhdGUgL2Rldi9kaXNrIGhlcmUgZWl0aGVyLgorCSAqIEV2ZW4gaWYgdGhleSBoYXBwZW4gdG8gYmUgdmlzaWJsZSBhbmQgdG9wLWxldmVsLgorCSAqLworCWVsc2UgaWYgKGlzX3Jlc2VydmVkX2x2bmFtZShsdi0+bmFtZSkpCisJCXVkZXZfZmxhZ3MgfD0gRE1fVURFVl9ESVNBQkxFX0RJU0tfUlVMRVNfRkxBRyB8CisJCQkgICAgICBETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBRzsKKworCS8qCisJICogU25hcHNob3RzIGFuZCBvcmlnaW5zIGNvdWxkIGhhdmUgdGhlIHNhbWUgcnVsZSBhcHBsaWVkIHRoYXQgd2lsbAorCSAqIGdpdmUgc3ltbGlua3MgZXhhY3RseSB0aGUgc2FtZSBuYW1lIChlLmcuIGEgbmFtZSBiYXNlZCBvbgorCSAqIGZpbGVzeXN0ZW0gVVVJRCkuIFdlIGdpdmUgcHJlZmVyZW5jZSB0byBvcmlnaW5zIHRvIG1ha2Ugc3VjaAorCSAqIG5hbWluZyBkZXRlcm1pbmlzdGljIChlLmcuIHN5bWxpbmtzIGluIC9kZXYvZGlzay9ieS11dWlkKS4KKwkgKi8KKwlpZiAobHZfaXNfY293KGx2KSkKKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0xPV19QUklPUklUWV9GTEFHOworCisJLyoKKwkgKiBGaW5hbGx5LCBhZGQgZmxhZ3MgdG8gZGlzYWJsZSAvZGV2L21hcHBlciBhbmQgL2Rldi88dmduYW1lPiBjb250ZW50CisJICogdG8gYmUgY3JlYXRlZCBieSB1ZGV2IGlmIGl0IGlzIHJlcXVlc3RlZCBieSB1c2VyJ3MgY29uZmlndXJhdGlvbi4KKwkgKiBUaGlzIGlzIGJhc2ljYWxseSBhbiBleHBsaWNpdCBmYWxsYmFjayB0byBvbGQgbm9kZS9zeW1saW5rIGNyZWF0aW9uCisJICogd2l0aG91dCB1ZGV2LgorCSAqLworCWlmICghZG0tPmNtZC0+Y3VycmVudF9zZXR0aW5ncy51ZGV2X3J1bGVzKQorCQl1ZGV2X2ZsYWdzIHw9IERNX1VERVZfRElTQUJMRV9ETV9SVUxFU19GTEFHIHwKKwkJCSAgICAgIERNX1VERVZfRElTQUJMRV9TVUJTWVNURU1fUlVMRVNfRkxBRzsKKworCS8qCisJICogTFZNIHN1YnN5c3RlbSBzcGVjaWZpYyBmbGFncy4KKwkgKi8KKwlpZiAobm9zY2FuKQorCQl1ZGV2X2ZsYWdzIHw9IERNX1NVQlNZU1RFTV9VREVWX0ZMQUcwOworCisJaWYgKHRlbXBvcmFyeSkKKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHIHwKKwkJCSAgICAgIERNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHOworCisJcmV0dXJuIHVkZXZfZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9kZXZfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBjaGFyICpsYXllcikKK3sKKwljaGFyICpkbGlkLCAqbmFtZTsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvLCBpbmZvMjsKKworCWlmICghKG5hbWUgPSBkbV9idWlsZF9kbV9uYW1lKGRtLT5tZW0sIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsIGxheWVyKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGxheWVyKSkpCisJCXJldHVybl8wOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkdldHRpbmcgZGV2aWNlIGluZm8gZm9yICVzIFslc10iLCBuYW1lLCBkbGlkKTsKKwlpZiAoIV9pbmZvKGRtLT5jbWQsIGRsaWQsIDEsIDAsICZpbmZvLCBOVUxMLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgaW5mbyBmb3IgJXMgWyVzXS4iLCBuYW1lLCBkbGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGb3IgdG9wIGxldmVsIHZvbHVtZXMgdmVyaWZ5IHRoYXQgZXhpc3RpbmcgZGV2aWNlIG1hdGNoCisJICogcmVxdWVzdGVkIG1ham9yL21pbm9yIGFuZCB0aGF0IG1ham9yL21pbm9yIHBhaXIgaXMgYXZhaWxhYmxlIGZvciB1c2UKKwkgKi8KKwlpZiAoIWxheWVyICYmIGx2LT5tYWpvciAhPSAtMSAmJiBsdi0+bWlub3IgIT0gLTEpIHsKKwkJLyoKKwkJICogRklYTUUgY29tcGFyZSBpbmZvLm1ham9yIHdpdGggbHYtPm1ham9yIGlmIG11bHRpcGxlIG1ham9yIHN1cHBvcnQKKwkJICovCisJCWlmIChpbmZvLmV4aXN0cyAmJiAoKGludCkgaW5mby5taW5vciAhPSBsdi0+bWlub3IpKSB7CisJCQlsb2dfZXJyb3IoIlZvbHVtZSAlcyAoJSIgUFJJdTMyICI6JSIgUFJJdTMyIikiCisJCQkJICAiIGRpZmZlcnMgZnJvbSBhbHJlYWR5IGFjdGl2ZSBkZXZpY2UgIgorCQkJCSAgIiglIiBQUkl1MzIgIjolIiBQUkl1MzIiKSIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdiksIGx2LT5tYWpvciwgbHYtPm1pbm9yLAorCQkJCSAgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWluZm8uZXhpc3RzICYmIF9pbmZvX2J5X2Rldihsdi0+bWFqb3IsIGx2LT5taW5vciwgJmluZm8yKSAmJgorCQkgICAgaW5mbzIuZXhpc3RzKSB7CisJCQlsb2dfZXJyb3IoIlRoZSByZXF1ZXN0ZWQgbWFqb3I6bWlub3IgcGFpciAiCisJCQkJICAiKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiIpIGlzIGFscmVhZHkgdXNlZCIsCisJCQkJICBsdi0+bWFqb3IsIGx2LT5taW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChpbmZvLmV4aXN0cyAmJiAhZG1fdHJlZV9hZGRfZGV2X3dpdGhfdWRldl9mbGFncyhkdHJlZSwgaW5mby5tYWpvciwgaW5mby5taW5vciwKKwkJCQkJCQlfZ2V0X3VkZXZfZmxhZ3MoZG0sIGx2LCBsYXllciwgMCwgMCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCBkZXZpY2UgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiIpIHRvIGR0cmVlIiwKKwkJCSAgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbmZvLmV4aXN0cyAmJiBkbS0+dHJhY2tfcGVuZGluZ19kZWxldGUpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlRyYWNraW5nIHBlbmRpbmcgZGVsZXRlIGZvciAlcyAoJXMpLiIsCisJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdiksIGRsaWQpOworCQlpZiAoIXN0cl9saXN0X2FkZChkbS0+bWVtLCAmZG0tPnBlbmRpbmdfZGVsZXRlLCBkbGlkKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQWRkIHJlcGxpY2F0b3IgZGV2aWNlcworICoKKyAqIFVzaW5nIF9hZGRfZGV2X3RvX2R0cmVlKCkgZGlyZWN0bHkgaW5zdGVhZCBvZiBfYWRkX2x2X3RvX2R0cmVlKCkKKyAqIHRvIGF2b2lkIGV4dHJhIGNoZWNrcyB3aXRoIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9wYXJ0aWFsX3JlcGxpY2F0b3JfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkJICAgIHN0cnVjdCBkbV90cmVlICpkdHJlZSwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpybHYgPSBmaXJzdF9zZWcobHYpLT5yZXBsaWNhdG9yOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldjsKKwlzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlICpyc2l0ZTsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpyZXBfbm9kZSwgKnJkZXZfbm9kZTsKKwljb25zdCBjaGFyICp1dWlkOworCisJaWYgKCFsdl9pc19hY3RpdmVfcmVwbGljYXRvcl9kZXYobHYpKSB7CisJCWlmICghX2FkZF9kZXZfdG9fZHRyZWUoZG0sIGR0cmVlLCBsdi0+cmRldmljZS0+bHYsCisJCQkJICAgICAgTlVMTCkpCisJCQlyZXR1cm5fMDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogQWRkIF9ybG9nIGFuZCByZXBsaWNhdG9yIGRldmljZSAqLworCWlmICghX2FkZF9kZXZfdG9fZHRyZWUoZG0sIGR0cmVlLCBmaXJzdF9zZWcocmx2KS0+cmxvZ19sdiwgTlVMTCkpCisJCXJldHVybl8wOworCisJaWYgKCFfYWRkX2Rldl90b19kdHJlZShkbSwgZHRyZWUsIHJsdiwgTlVMTCkpCisJCXJldHVybl8wOworCisJaWYgKCEodXVpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgcmx2LCBOVUxMKSkpCisJCXJldHVybl8wOworCisJcmVwX25vZGUgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKGR0cmVlLCB1dWlkKTsKKworCS8qIEFkZCBhbGwgcmVsYXRlZCBkZXZpY2VzIGZvciByZXBsaWNhdG9yICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlLCAmcmx2LT5yc2l0ZXMpCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKSB7CisJCQlpZiAocnNpdGUtPnN0YXRlID09IFJFUExJQ0FUT1JfU1RBVEVfQUNUSVZFKSB7CisJCQkJLyogQWRkIF9yaW1hZ2UgTFYgKi8KKwkJCQlpZiAoIV9hZGRfZGV2X3RvX2R0cmVlKGRtLCBkdHJlZSwgcmRldi0+bHYsIE5VTEwpKQorCQkJCQlyZXR1cm5fMDsKKworCQkJCS8qIEFkZCByZXBsaWNhdG9yLWRldiBMViwgZXhjZXB0IG9mIHRoZSBhbHJlYWR5IGFkZGVkIG9uZSAqLworCQkJCWlmICgobHYgIT0gcmRldi0+cmVwbGljYXRvcl9kZXYtPmx2KSAmJgorCQkJCSAgICAhX2FkZF9kZXZfdG9fZHRyZWUoZG0sIGR0cmVlLAorCQkJCQkJICAgICAgIHJkZXYtPnJlcGxpY2F0b3JfZGV2LT5sdiwgTlVMTCkpCisJCQkJCXJldHVybl8wOworCisJCQkJLyogSWYgcmVwbGljYXRvciBleGlzdHMgLSB0cnkgY29ubmVjdCBleGlzdGluZyBoZWFkcyAqLworCQkJCWlmIChyZXBfbm9kZSkgeworCQkJCQl1dWlkID0gYnVpbGRfZG1fdXVpZChkbS0+bWVtLAorCQkJCQkJCSAgICAgcmRldi0+cmVwbGljYXRvcl9kZXYtPmx2LAorCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJCWlmICghdXVpZCkKKwkJCQkJCXJldHVybl8wOworCisJCQkJCXJkZXZfbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQoZHRyZWUsIHV1aWQpOworCQkJCQlpZiAocmRldl9ub2RlKQorCQkJCQkJZG1fdHJlZV9ub2RlX3NldF9wcmVzdXNwZW5kX25vZGUocmRldl9ub2RlLAorCQkJCQkJCQkJCSByZXBfbm9kZSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIXJkZXYtPnJzaXRlLT52Z19uYW1lKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIV9hZGRfZGV2X3RvX2R0cmVlKGRtLCBkdHJlZSwgcmRldi0+bHYsIE5VTEwpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAocmRldi0+c2xvZyAmJgorCQkJICAgICFfYWRkX2Rldl90b19kdHJlZShkbSwgZHRyZWUsIHJkZXYtPnNsb2csIE5VTEwpKQorCQkJCXJldHVybl8wOworCQl9CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHBvb2xfY2JfZGF0YSB7CisJc3RydWN0IGRldl9tYW5hZ2VyICpkbTsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHY7CisKKwlpbnQgc2tpcF96ZXJvOyAgLyogdG8gc2tpcCB6ZXJvZWQgZGV2aWNlIGhlYWRlciAoY2hlY2sgZmlyc3QgNjRCKSAqLworCWludCBleGVjOyAgICAgICAvKiB3aGljaCBiaW5hcnkgdG8gY2FsbCAqLworCWludCBvcHRzOworCWNvbnN0IGNoYXIgKmdsb2JhbDsKK307CisKK3N0YXRpYyBpbnQgX3Bvb2xfY2FsbGJhY2soc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgZG1fbm9kZV9jYWxsYmFja190IHR5cGUsIHZvaWQgKmNiX2RhdGEpCit7CisJaW50IHJldCwgc3RhdHVzLCBmZDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCWNvbnN0IHN0cnVjdCBwb29sX2NiX2RhdGEgKmRhdGEgPSBjYl9kYXRhOworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiA9IGRhdGEtPnBvb2xfbHY7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptbHYgPSBmaXJzdF9zZWcocG9vbF9sdiktPm1ldGFkYXRhX2x2OworCWxvbmcgYnVmWzY0IC8gc2l6ZW9mKGxvbmcpXTsgLyogYnVmZmVyIGZvciBzaG9ydCBkaXNrIGhlYWRlciAoNjRCKSAqLworCWludCBhcmdzID0gMDsKKwljb25zdCBjaGFyICphcmd2WzE5XSA9IHsgLyogTWF4IHN1cHBvcnRlZCAxNSBhcmdzICovCisJCWZpbmRfY29uZmlnX3RyZWVfc3RyX2FsbG93X2VtcHR5KHBvb2xfbHYtPnZnLT5jbWQsIGRhdGEtPmV4ZWMsIE5VTEwpIC8qIGFyZ3ZbMF0gKi8KKwl9OworCisJaWYgKCEqYXJndlswXSkKKwkJcmV0dXJuIDE7IC8qIENoZWNraW5nIGRpc2FibGVkICovCisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkobWx2LT52Zy0+Y21kLCBkYXRhLT5vcHRzLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmFibGUgdG8gZmluZCBjb25maWd1cmF0aW9uIGZvciBwb29sIGNoZWNrIG9wdGlvbnMuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoY3YgPSBjbi0+djsgY3YgJiYgYXJncyA8IDE2OyBjdiA9IGN2LT5uZXh0KSB7CisJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlOiAiCisJCQkJICAiZ2xvYmFsLyVzX2NoZWNrX29wdGlvbnMiLAorCQkJCSAgZGF0YS0+Z2xvYmFsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWFyZ3ZbKythcmdzXSA9IGN2LT52LnN0cjsKKwl9CisKKwlpZiAoYXJncyA9PSAxNikgeworCQlsb2dfZXJyb3IoIlRvbyBtYW55IG9wdGlvbnMgZm9yICVzIGNvbW1hbmQuIiwgYXJndlswXSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGFyZ3ZbKythcmdzXSA9IGx2X2RtcGF0aF9kdXAoZGF0YS0+ZG0tPm1lbSwgbWx2KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYnVpbGQgcG9vbCBtZXRhZGF0YSBwYXRoLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGF0YS0+c2tpcF96ZXJvKSB7CisJCWlmICgoZmQgPSBvcGVuKGFyZ3ZbYXJnc10sIE9fUkRPTkxZKSkgPCAwKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJvcGVuIiwgYXJndlthcmdzXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBsZXQncyBhc3N1bWUgdGhlcmUgaXMgbm8gcHJvYmxlbSB0byByZWFkIDY0IGJ5dGVzICovCisJCWlmIChyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA8IChpbnQpc2l6ZW9mKGJ1ZikpIHsKKwkJCWxvZ19zeXNfZXJyb3IoInJlYWQiLCBhcmd2W2FyZ3NdKTsKKwkJCWlmIChjbG9zZShmZCkpCisJCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBhcmd2W2FyZ3NdKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZvciAocmV0ID0gMDsgcmV0IDwgKGludCkgRE1fQVJSQVlfU0laRShidWYpOyArK3JldCkKKwkJCWlmIChidWZbcmV0XSkKKwkJCQlicmVhazsKKworCQlpZiAoY2xvc2UoZmQpKQorCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBhcmd2W2FyZ3NdKTsKKworCQlpZiAocmV0ID09IChpbnQpIERNX0FSUkFZX1NJWkUoYnVmKSkgeworCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIiVzIHNraXBwZWQsIGRldGVjdCBlbXB0eSBkaXNrIGhlYWRlciBvbiAlcy4iLAorCQkJCQkgICAgIGFyZ3ZbMF0sIGFyZ3ZbYXJnc10pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoIShyZXQgPSBleGVjX2NtZChwb29sX2x2LT52Zy0+Y21kLCAoY29uc3QgY2hhciAqIGNvbnN0ICopYXJndiwKKwkJCSAgICAgJnN0YXR1cywgMCkpKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIERNX05PREVfQ0FMTEJBQ0tfUFJFTE9BREVEOgorCQkJbG9nX2Vycl9vbmNlKCJDaGVjayBvZiBwb29sICVzIGZhaWxlZCAoc3RhdHVzOiVkKS4gIgorCQkJCSAgICAgIk1hbnVhbCByZXBhaXIgcmVxdWlyZWQhIiwKKwkJCQkgICAgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfd2FybigiV0FSTklORzogSW50ZWdyaXR5IGNoZWNrIG9mIG1ldGFkYXRhIGZvciBwb29sICIKKwkJCQkgIiVzIGZhaWxlZC4iLCBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCX0KKwkJLyoKKwkJICogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/PworCQkgKgorCQkgKiBNYXliZSBtYXJrIHRoZSBub2RlLCBzbyBpdCdzIG5vdCBhY3RpdmF0aW5nCisJCSAqIGFzIHBvb2wgYnV0IGFzIGVycm9yL2xpbmVhciBhbmQgbGV0IHRoZQorCQkgKiBkbSB0cmVlIHJlc29sdmUgdGhlIGlzc3VlLgorCQkgKi8KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9wb29sX3JlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sCisJCQkJICAgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBwb29sX2NiX2RhdGEgKmRhdGE7CisKKwkvKiBEbyBub3Qgc2tpcCBtZXRhZGF0YSBvZiB0ZXN0aW5nIGV2ZW4gZm9yIHVudXNlZCB0aGluIHBvb2xzICovCisjaWYgMAorCS8qIFNraXAgbWV0YWRhdGEgdGVzdGluZyBmb3IgdW51c2VkIHRoaW4gcG9vbC4gKi8KKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSAmJgorCSAgICAoIWZpcnN0X3NlZyhsdiktPnRyYW5zYWN0aW9uX2lkIHx8CisJICAgICAoKGZpcnN0X3NlZyhsdiktPnRyYW5zYWN0aW9uX2lkID09IDEpICYmCisJICAgICAgcG9vbF9oYXNfbWVzc2FnZShmaXJzdF9zZWcobHYpLCBOVUxMLCAwKSkpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJaWYgKCEoZGF0YSA9IGRtX3Bvb2xfemFsbG9jKGRtLT5tZW0sIHNpemVvZigqZGF0YSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZWQgcGF0aCBmb3IgY2FsbGJhY2suIik7CisJCXJldHVybiAwOworCX0KKworCWRhdGEtPmRtID0gZG07CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQlkYXRhLT5wb29sX2x2ID0gbHY7CisJCWRhdGEtPnNraXBfemVybyA9IDE7CisJCWRhdGEtPmV4ZWMgPSBnbG9iYWxfdGhpbl9jaGVja19leGVjdXRhYmxlX0NGRzsKKwkJZGF0YS0+b3B0cyA9IGdsb2JhbF90aGluX2NoZWNrX29wdGlvbnNfQ0ZHOworCQlkYXRhLT5nbG9iYWwgPSAidGhpbiI7CisJfSBlbHNlIGlmIChsdl9pc19jYWNoZShsdikpIHsgLyogY2FjaGUgcG9vbCAqLworCQlkYXRhLT5wb29sX2x2ID0gZmlyc3Rfc2VnKGx2KS0+cG9vbF9sdjsKKwkJZGF0YS0+c2tpcF96ZXJvID0gMTsgLyogY2hlYXAgcmVhZC1lcnJvciBkZXRlY3Rpb24gKi8KKwkJZGF0YS0+ZXhlYyA9IGdsb2JhbF9jYWNoZV9jaGVja19leGVjdXRhYmxlX0NGRzsKKwkJZGF0YS0+b3B0cyA9IGdsb2JhbF9jYWNoZV9jaGVja19vcHRpb25zX0NGRzsKKwkJZGF0YS0+Z2xvYmFsID0gImNhY2hlIjsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlJlZ2lzdGVyaW5nIHVuc3VwcG9ydGVkIHBvb2wgY2FsbGJhY2suIik7CisJCXJldHVybiAwOworCX0KKworCWRtX3RyZWVfbm9kZV9zZXRfY2FsbGJhY2sobm9kZSwgX3Bvb2xfY2FsbGJhY2ssIGRhdGEpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIERlY2xhcmF0aW9uIHRvIHJlc29sdmUgc3VzcGVuZCB0cmVlIGFuZCBtZXNzYWdlIHBhc3NpbmcgZm9yIHRoaW4tcG9vbCAqLworc3RhdGljIGludCBfYWRkX3RhcmdldF90b19kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCXN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cyk7CisvKgorICogQWRkIExWIGFuZCBhbnkga25vd24gZGVwZW5kZW5jaWVzCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9sdl90b19kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUsCisJCQkgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IG9yaWdpbl9vbmx5KQoreworCXVpbnQzMl90IHM7CisJc3RydWN0IHNlZ19saXN0ICpzbDsKKwlzdHJ1Y3QgZG1fbGlzdCAqc25oOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZTsKKwljb25zdCBjaGFyICp1dWlkOworCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2wobHYpKSB7CisJCWlmICghZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpIHsKKwkJCWlmICghX2FkZF9sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZ19sdihmaXJzdF9zZWcobHYpLCAwKSwgMCkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBmaXJzdF9zZWcobHYpLT5tZXRhZGF0YV9sdiwgMCkpCisJCQkJcmV0dXJuXzA7CisJCQkvKiBDYWNoZSBwb29sIGRvZXMgbm90IGhhdmUgYSByZWFsIGRldmljZSBub2RlICovCisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBVbnVzZWQgY2FjaGUgcG9vbCBpcyBhY3RpdmF0ZWQgYXMgbWV0YWRhdGEgKi8KKwl9CisKKwlpZiAoIW9yaWdpbl9vbmx5ICYmICFfYWRkX2Rldl90b19kdHJlZShkbSwgZHRyZWUsIGx2LCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRSBDYW4gd2UgYXZvaWQgZG9pbmcgdGhpcyBldmVyeSB0aW1lPyAqLworCS8qIFJldXNlZCBhbHNvIGZvciBsdl9pc19leHRlcm5hbF9vcmlnaW4obHYpICovCisJaWYgKCFfYWRkX2Rldl90b19kdHJlZShkbSwgZHRyZWUsIGx2LCAicmVhbCIpKQorCQlyZXR1cm5fMDsKKworCWlmICghb3JpZ2luX29ubHkgJiYgIV9hZGRfZGV2X3RvX2R0cmVlKGRtLCBkdHJlZSwgbHYsICJjb3ciKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAob3JpZ2luX29ubHkgJiYgbHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCWlmICghX2FkZF9kZXZfdG9fZHRyZWUoZG0sIGR0cmVlLCBsdiwgbHZfbGF5ZXIobHYpKSkKKwkJCXJldHVybl8wOworI2lmIDAKKwkJLyogPyBVc2Ugb3JpZ2luX29ubHkgdG8gYXZvaWQgJ2RlZXAnIHRoaW4gcG9vbCBzdXNwZW5kID8gKi8KKwkJLyogRklYTUUgSW1wbGVtZW50IGRtX3RyZWVfbm9kZV9za2lwX2NoaWxkcmVucyBvcHRpbWlzYXRpb24gKi8KKwkJaWYgKCEodXVpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQkJcmV0dXJuXzA7CisJCWlmICgobm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQoZHRyZWUsIHV1aWQpKSkKKwkJCWRtX3RyZWVfbm9kZV9za2lwX2NoaWxkcmVucyhub2RlLCAxKTsKKyNlbmRpZgorCX0KKworCWlmIChvcmlnaW5fb25seSAmJiBkbS0+YWN0aXZhdGlvbiAmJiAhZG0tPnNraXBfZXh0ZXJuYWxfbHYgJiYKKwkgICAgbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkgeworCQkvKiBGaW5kIHBvc3NpYmxlIHVzZXJzIG9mIGV4dGVybmFsIG9yaWdpbiBsdiAqLworCQlkbS0+c2tpcF9leHRlcm5hbF9sdiA9IDE7IC8qIGF2b2lkIHJlY3Vyc2lvbiAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KQorCQkJLyogTWF0Y2ggb25seSBleHRlcm5hbF9sdiB1c2VycyAqLworCQkJaWYgKChzbC0+c2VnLT5leHRlcm5hbF9sdiA9PSBsdikgJiYKKwkJCSAgICAhX2FkZF9sdl90b19kdHJlZShkbSwgZHRyZWUsIHNsLT5zZWctPmx2LCAxKSkKKwkJCQlyZXR1cm5fMDsKKwkJZG0tPnNraXBfZXh0ZXJuYWxfbHYgPSAwOworCX0KKworCWlmIChsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCS8qCisJCSAqIEZvciBib3RoIG9yaWdpbl9vbmx5IGFuZCAhb3JpZ2luX29ubHkKKwkJICogc2tpcHMgdGVzdCBmb3IgLXRwb29sLXJlYWwgYW5kIHRwb29sLWNvdworCQkgKi8KKwkJaWYgKCFfYWRkX2Rldl90b19kdHJlZShkbSwgZHRyZWUsIGx2LCBsdl9sYXllcihsdikpKQorCQkJcmV0dXJuXzA7CisKKwkJLyoKKwkJICogVE9ETzogY2hhbmdlIEFQSSBhbmQgbW92ZSB0aGlzIGNvZGUKKwkJICogQ291bGQgYmUgZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGluIF9hZGRfZGV2X3RvX2R0cmVlKCkKKwkJICogYW5kIGJhc2UgdGhpcyBhY2NvcmRpbmcgdG8gaW5mby5leGlzdHMgPworCQkgKi8KKwkJaWYgKCFkbS0+YWN0aXZhdGlvbikgeworCQkJaWYgKCEodXVpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQkJCXJldHVybl8wOworCQkJaWYgKChub2RlID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChkdHJlZSwgdXVpZCkpKSB7CisJCQkJaWYgKG9yaWdpbl9vbmx5KSB7CisJCQkJCXN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzIGxhb3B0cyA9IHsKKwkJCQkJCS5vcmlnaW5fb25seSA9IDEsCisJCQkJCQkuc2VuZF9tZXNzYWdlcyA9IDEgLyogTm9kZSB3aXRoIG1lc3NhZ2VzICovCisJCQkJCX07CisJCQkJCS8qCisJCQkJCSAqIEFkZCBzb21lIG1lc3NzYWdlcyBpZiByaWdodCBub2RlIGV4aXN0IGluIHRoZSB0YWJsZSBvbmx5CisJCQkJCSAqIHdoZW4gYnVpbGRpbmcgU1VTUEVORCB0cmVlIGZvciBvcmlnaW4tb25seSB0aGluLXBvb2wuCisJCQkJCSAqCisJCQkJCSAqIFRPRE86IEZpeCBjYWxsIG9mICdfYWRkX3RhcmdldF90b19kdHJlZSgpJyB0byBhZGQgbWVzc2FnZQorCQkJCQkgKiB0byB0aGluLXBvb2wgbm9kZSBhcyB3ZSBhbHJlYWR5IGtub3cgdGhlIHBvb2wgbm9kZSBleGlzdHMKKwkJCQkJICogaW4gdGhlIHRhYmxlLiBBbnkgYmV0dGVyL2NsZWFuZXIgQVBJIHdheSA/CisJCQkJCSAqCisJCQkJCSAqIFByb2JhYmx5IHNvbWUgJ25ldycgdGFyZ2V0IG1ldGhvZCB0byBhZGQgbWVzc2FnZXMgZm9yIGFueSBub2RlPworCQkJCQkgKi8KKwkJCQkJaWYgKGRtLT5zdXNwZW5kICYmCisJCQkJCSAgICAhZG1fbGlzdF9lbXB0eSgmKGZpcnN0X3NlZyhsdiktPnRoaW5fbWVzc2FnZXMpKSAmJgorCQkJCQkgICAgIV9hZGRfdGFyZ2V0X3RvX2R0cmVlKGRtLCBub2RlLCBmaXJzdF9zZWcobHYpLCAmbGFvcHRzKSkKKwkJCQkJCXJldHVybl8wOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNldHVwIGNhbGxiYWNrIGZvciBub24tYWN0aXZhdGlvbiBwYXJ0aWFsIHRyZWUgKi8KKwkJCQkJLyogQWN0aXZhdGlvbiBnZXRzIG93biBjYWxsYmFjayB3aGVuIG5lZWRlZCAqLworCQkJCQkvKiBUT0RPOiBleHRlbmQgX2NhY2hlZF9kbV9pbmZvKCkgdG8gcmV0dXJuIGRub2RlICovCisJCQkJCWlmICghX3Bvb2xfcmVnaXN0ZXJfY2FsbGJhY2soZG0sIG5vZGUsIGx2KSkKKwkJCQkJCXJldHVybl8wOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChsdl9pc19jYWNoZShsdikpIHsKKwkJaWYgKCFvcmlnaW5fb25seSAmJiAhZG0tPmFjdGl2YXRpb24gJiYgIWRtLT50cmFja19wZW5kaW5nX2RlbGV0ZSkgeworCQkJLyogU2V0dXAgY2FsbGJhY2sgZm9yIG5vbi1hY3RpdmF0aW9uIHBhcnRpYWwgdHJlZSAqLworCQkJLyogQWN0aXZhdGlvbiBnZXRzIG93biBjYWxsYmFjayB3aGVuIG5lZWRlZCAqLworCQkJLyogVE9ETzogZXh0ZW5kIF9jYWNoZWRfZG1faW5mbygpIHRvIHJldHVybiBkbm9kZSAqLworCQkJaWYgKCEodXVpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsIGx2X2xheWVyKGx2KSkpKQorCQkJCXJldHVybl8wOworCQkJaWYgKChub2RlID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChkdHJlZSwgdXVpZCkpICYmCisJCQkgICAgIV9wb29sX3JlZ2lzdGVyX2NhbGxiYWNrKGRtLCBub2RlLCBsdikpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwkvKiBBZGQgYW55IHNuYXBzaG90cyBvZiB0aGlzIExWICovCisJaWYgKCFvcmlnaW5fb25seSAmJiBsdl9pc19vcmlnaW4obHYpKQorCQlkbV9saXN0X2l0ZXJhdGUoc25oLCAmbHYtPnNuYXBzaG90X3NlZ3MpCisJCQlpZiAoIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBkbV9saXN0X3N0cnVjdF9iYXNlKHNuaCwgc3RydWN0IGx2X3NlZ21lbnQsIG9yaWdpbl9saXN0KS0+Y293LCAwKSkKKwkJCQlyZXR1cm5fMDsKKworCWlmIChkbS0+YWN0aXZhdGlvbiAmJiAhb3JpZ2luX29ubHkgJiYgbHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpICYmCisJICAgICFfYWRkX2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwgZmluZF9zbmFwc2hvdChsdiktPmx2LCAxKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgYW55IExWcyByZWZlcmVuY2luZyBhIFBWTU9WRSBMViB1bmxlc3MgdG9sZCBub3QgdG8uICovCisJaWYgKGRtLT50cmFja19wdm1vdmVfZGVwcyAmJiBsdl9pc19wdm1vdmUobHYpKSB7CisJCWRtLT50cmFja19wdm1vdmVfZGVwcyA9IDA7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJCQlpZiAoIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzbC0+c2VnLT5sdiwgb3JpZ2luX29ubHkpKQorCQkJCXJldHVybl8wOworCQlkbS0+dHJhY2tfcHZtb3ZlX2RlcHMgPSAxOworCX0KKworCWlmICghZG0tPnRyYWNrX3BlbmRpbmdfZGVsZXRlKQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KSB7CisJCQlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUoc2wtPnNlZy0+bHYpKSB7CisJCQkJLyogTFYgaXMgcmVmZXJlbmNlZCBieSAnY2FjaGUgcGVuZGluZyBkZWxldGUgTFYgKi8KKwkJCQlkbS0+dHJhY2tfcGVuZGluZ19kZWxldGUgPSAxOworCQkJCWlmICghX2FkZF9sdl90b19kdHJlZShkbSwgZHRyZWUsIHNsLT5zZWctPmx2LCBvcmlnaW5fb25seSkpCisJCQkJCXJldHVybl8wOworCQkJCWRtLT50cmFja19wZW5kaW5nX2RlbGV0ZSA9IDA7CisJCQl9CisJCX0KKworCS8qIEFkZGluZyBMViBoZWFkIG9mIHJlcGxpY2F0b3IgYWRkcyBhbGwgb3RoZXIgcmVsYXRlZCBkZXZzICovCisJaWYgKGx2X2lzX3JlcGxpY2F0b3JfZGV2KGx2KSAmJgorCSAgICAhX2FkZF9wYXJ0aWFsX3JlcGxpY2F0b3JfdG9fZHRyZWUoZG0sIGR0cmVlLCBsdikpCisJCXJldHVybl8wOworCisJLyogQWRkIGFueSBMVnMgdXNlZCBieSBzZWdtZW50cyBpbiB0aGlzIExWICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlpZiAoc2VnLT5leHRlcm5hbF9sdiAmJiAhZG0tPnNraXBfZXh0ZXJuYWxfbHYgJiYKKwkJICAgICFfYWRkX2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwgc2VnLT5leHRlcm5hbF9sdiwgMSkpIC8qIHN0YWNrICovCisJCQlyZXR1cm5fMDsKKwkJaWYgKHNlZy0+bG9nX2x2ICYmCisJCSAgICAhX2FkZF9sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZy0+bG9nX2x2LCAwKSkKKwkJCXJldHVybl8wOworCQlpZiAoc2VnLT5tZXRhZGF0YV9sdiAmJgorCQkgICAgIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWctPm1ldGFkYXRhX2x2LCAwKSkKKwkJCXJldHVybl8wOworCQlpZiAoc2VnLT5wb29sX2x2ICYmCisJCSAgICAobHZfaXNfY2FjaGVfcG9vbChzZWctPnBvb2xfbHYpIHx8ICFkbS0+c2tpcF9leHRlcm5hbF9sdikgJiYKKwkJICAgIC8qIFdoZW4gYWN0aXZhdGluZyBhbmQgbm90IG9yaWdpbl9vbmx5IGRldGVjdCBsaW5lYXIgJ292ZXJsYXknIG92ZXIgcG9vbCAqLworCQkgICAgIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWctPnBvb2xfbHYsIGRtLT5hY3RpdmF0aW9uID8gb3JpZ2luX29ubHkgOiAxKSkKKwkJCXJldHVybl8wOworCisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ190eXBlKHNlZywgcykgPT0gQVJFQV9MViAmJiBzZWdfbHYoc2VnLCBzKSAmJgorCQkJICAgIC8qIG9yaWdpbiBvbmx5IGZvciBjYWNoZSB3aXRob3V0IHBlbmRpbmcgZGVsZXRlICovCisJCQkgICAgKCFkbS0+dHJhY2tfcGVuZGluZ19kZWxldGUgfHwgIWx2X2lzX2NhY2hlKGx2KSkgJiYKKwkJCSAgICAhX2FkZF9sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZ19sdihzZWcsIHMpLCAwKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmIChzZWdfaXNfcmFpZF93aXRoX21ldGEoc2VnKSAmJiBzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcsIHMpICYmCisJCQkgICAgIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWdfbWV0YWx2KHNlZywgcyksIDApKQorCQkJCXJldHVybl8wOworCQl9CisKKwkJLyogV2hlbiBhY3RpdmF0aW5nLCBkZXRlY3QgbWVyZ2luZyBMViBwcmVzZW5jZSAqLworCQlpZiAoZG0tPmFjdGl2YXRpb24gJiYgc2VnLT5tZXJnZV9sdiAmJgorCQkgICAgIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWctPm1lcmdlX2x2LCAxKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRtX3RyZWUgKl9jcmVhdGVfcGFydGlhbF9kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgb3JpZ2luX29ubHkpCit7CisJc3RydWN0IGRtX3RyZWUgKmR0cmVlOworCisJaWYgKCEoZHRyZWUgPSBkbV90cmVlX2NyZWF0ZSgpKSkgeworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUGFydGlhbCBkdHJlZSBjcmVhdGlvbiBmYWlsZWQgZm9yICVzLiIsCisJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV90cmVlX3NldF9vcHRpb25hbF91dWlkX3N1ZmZpeGVzKGR0cmVlLCAmdXVpZF9zdWZmaXhfbGlzdFswXSk7CisKKwlpZiAoIV9hZGRfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBsdiwgKGx2X2lzX29yaWdpbihsdikgfHwgbHZfaXNfdGhpbl92b2x1bWUobHYpIHx8IGx2X2lzX3RoaW5fcG9vbChsdikpID8gb3JpZ2luX29ubHkgOiAwKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gZHRyZWU7CisKK2JhZDoKKwlkbV90cmVlX2ZyZWUoZHRyZWUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqX2FkZF9lcnJvcl9kZXZpY2Uoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJICAgICAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCBzKQoreworCWNoYXIgKmRsaWQsICpuYW1lOworCWNoYXIgZXJyaWRbMzJdOworCXN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGU7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZ19pOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJaW50IHNlZ25vID0gLTEsIGkgPSAwOworCXVpbnQ2NF90IHNpemUgPSAodWludDY0X3QpIHNlZy0+bGVuICogc2VnLT5sdi0+dmctPmV4dGVudF9zaXplOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZ19pLCAmc2VnLT5sdi0+c2VnbWVudHMpIHsKKwkJaWYgKHNlZyA9PSBzZWdfaSkKKwkJCXNlZ25vID0gaTsKKwkJKytpOworCX0KKworCWlmIChzZWdubyA8IDApIHsKKwkJbG9nX2Vycm9yKCJfYWRkX2Vycm9yX2RldmljZSBjYWxsZWQgd2l0aCBiYWQgc2VnbWVudCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcHJpbnRmKGVycmlkLCAibWlzc2luZ18lZF8lZCIsIHNlZ25vLCBzKTsKKworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIHNlZy0+bHYsIGVycmlkKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEobmFtZSA9IGRtX2J1aWxkX2RtX25hbWUoZG0tPm1lbSwgc2VnLT5sdi0+dmctPm5hbWUsCisJCQkJICAgICAgc2VnLT5sdi0+bmFtZSwgZXJyaWQpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiR2V0dGluZyBkZXZpY2UgaW5mbyBmb3IgJXMgWyVzXSIsIG5hbWUsIGRsaWQpOworCWlmICghX2luZm8oZG0tPmNtZCwgZGxpZCwgMSwgMCwgJmluZm8sIE5VTEwsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBpbmZvIGZvciAlcyBbJXNdLiIsIG5hbWUsIGRsaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWluZm8uZXhpc3RzKSB7CisJCS8qIENyZWF0ZSBuZXcgbm9kZSAqLworCQlpZiAoIShub2RlID0gZG1fdHJlZV9hZGRfbmV3X2RldihkdHJlZSwgbmFtZSwgZGxpZCwgMCwgMCwgMCwgMCwgMCkpKQorCQkJcmV0dXJuX05VTEw7CisJCWlmICghZG1fdHJlZV9ub2RlX2FkZF9lcnJvcl90YXJnZXQobm9kZSwgc2l6ZSkpCisJCQlyZXR1cm5fTlVMTDsKKwl9IGVsc2UgeworCQkvKiBBbHJlYWR5IGV4aXN0cyAqLworCQlpZiAoIWRtX3RyZWVfYWRkX2RldihkdHJlZSwgaW5mby5tYWpvciwgaW5mby5taW5vcikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCBkZXZpY2UgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiIpIHRvIGR0cmVlIiwKKwkJCQkgIGluZm8ubWFqb3IsIGluZm8ubWlub3IpOworCQkJcmV0dXJuX05VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gZGxpZDsKK30KKworc3RhdGljIGludCBfYWRkX2Vycm9yX2FyZWEoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCBzKQoreworCWNoYXIgKmRsaWQ7CisJdWludDY0X3QgZXh0ZW50X3NpemUgPSBzZWctPmx2LT52Zy0+ZXh0ZW50X3NpemU7CisKKwlpZiAoIXN0cmNtcChkbS0+Y21kLT5zdHJpcGVfZmlsbGVyLCBUQVJHRVRfTkFNRV9FUlJPUikpIHsKKwkJLyoKKwkJICogRklYTUUsIHRoZSB0cmVlIHBvaW50ZXIgaXMgZmlyc3QgZmllbGQgb2YgZG1fdHJlZV9ub2RlLCBidXQKKwkJICogd2UgZG9uJ3QgaGF2ZSB0aGUgc3RydWN0IGRlZmluaXRpb24gYXZhaWxhYmxlLgorCQkgKi8KKwkJc3RydWN0IGRtX3RyZWUgKip0cmVlID0gKHN0cnVjdCBkbV90cmVlICoqKSBub2RlOworCQlpZiAoIShkbGlkID0gX2FkZF9lcnJvcl9kZXZpY2UoZG0sICp0cmVlLCBzZWcsIHMpKSkKKwkJCXJldHVybl8wOworCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEobm9kZSwgTlVMTCwgZGxpZCwgZXh0ZW50X3NpemUgKiBzZWdfbGUoc2VnLCBzKSkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UKKwkJaWYgKCFkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhKG5vZGUsIGRtLT5jbWQtPnN0cmlwZV9maWxsZXIsIE5VTEwsIFVJTlQ2NF9DKDApKSkKKwkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBhZGRfYXJlYXNfbGluZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50MzJfdCBzdGFydF9hcmVhLAorCQkgICB1aW50MzJfdCBhcmVhcykKK3sKKwl1aW50NjRfdCBleHRlbnRfc2l6ZSA9IHNlZy0+bHYtPnZnLT5leHRlbnRfc2l6ZTsKKwl1aW50MzJfdCBzOworCWNoYXIgKmRsaWQ7CisJc3RydWN0IHN0YXQgaW5mbzsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIG51bV9lcnJvcl9hcmVhcyA9IDA7CisJdW5zaWduZWQgbnVtX2V4aXN0aW5nX2FyZWFzID0gMDsKKworCS8qIEZJWE1FIEF2b2lkIHJlcGVhdGluZyBpZGVudGljYWwgc3RhdCBpbiBkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhICovCisJZm9yIChzID0gc3RhcnRfYXJlYTsgcyA8IGFyZWFzOyBzKyspIHsKKwkJaWYgKChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfUFYgJiYKKwkJICAgICAoIXNlZ19wdnNlZyhzZWcsIHMpIHx8ICFzZWdfcHYoc2VnLCBzKSB8fCAhc2VnX2RldihzZWcsIHMpIHx8CisJCSAgICAgICAhKG5hbWUgPSBkZXZfbmFtZShzZWdfZGV2KHNlZywgcykpKSB8fCAhKm5hbWUgfHwKKwkJICAgICAgIHN0YXQobmFtZSwgJmluZm8pIDwgMCB8fCAhU19JU0JMSyhpbmZvLnN0X21vZGUpKSkgfHwKKwkJICAgIChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfTFYgJiYgIXNlZ19sdihzZWcsIHMpKSkgeworCQkJaWYgKCFzZWctPmx2LT52Zy0+Y21kLT5wYXJ0aWFsX2FjdGl2YXRpb24pIHsKKwkJCQlpZiAoIXNlZy0+bHYtPnZnLT5jbWQtPmRlZ3JhZGVkX2FjdGl2YXRpb24gfHwKKwkJCQkgICAgIWx2X2lzX3JhaWRfdHlwZShzZWctPmx2KSkgeworCQkJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiAgTFYgJXMgaXMgbm93IGluY29tcGxldGUgIgorCQkJCQkJICAiYW5kICctLWFjdGl2YXRpb25tb2RlIHBhcnRpYWwnIHdhcyBub3Qgc3BlY2lmaWVkLiIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJaWYgKCFfYWRkX2Vycm9yX2FyZWEoZG0sIG5vZGUsIHNlZywgcykpCisJCQkJcmV0dXJuXzA7CisJCQludW1fZXJyb3JfYXJlYXMrKzsKKwkJfSBlbHNlIGlmIChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfUFYpIHsKKwkJCWlmICghZG1fdHJlZV9ub2RlX2FkZF90YXJnZXRfYXJlYShub2RlLCBkZXZfbmFtZShzZWdfZGV2KHNlZywgcykpLCBOVUxMLAorCQkJCSAgICAoc2VnX3B2KHNlZywgcyktPnBlX3N0YXJ0ICsgKGV4dGVudF9zaXplICogc2VnX3BlKHNlZywgcykpKSkpCisJCQkJcmV0dXJuXzA7CisJCQludW1fZXhpc3RpbmdfYXJlYXMrKzsKKwkJfSBlbHNlIGlmIChzZWdfaXNfcmFpZChzZWcpKSB7CisJCQkvKgorCQkJICogUkFJRCBjYW4gaGFuZGxlIHVuYXNzaWduZWQgYXJlYXMuICBJdCBzaW1wbGUgcHV0cworCQkJICogJy0gLScgaW4gZm9yIHRoZSBtZXRhZGF0YS9kYXRhIGRldmljZSBwYWlyLiAgVGhpcworCQkJICogaXMgYSB2YWxpZCB3YXkgdG8gaW5kaWNhdGUgdG8gdGhlIFJBSUQgdGFyZ2V0IHRoYXQKKwkJCSAqIHRoZSBkZXZpY2UgaXMgbWlzc2luZy4KKwkJCSAqCisJCQkgKiBJZiBhbiBpbWFnZSBpcyBtYXJrZWQgYXMgVklTSUJMRV9MViBhbmQgIUxWTV9XUklURSwKKwkJCSAqIGl0IG1lYW5zIHRoZSBkZXZpY2UgaGFzIHRlbXBvcmFyaWx5IGJlZW4gZXh0cmFjdGVkCisJCQkgKiBmcm9tIHRoZSBhcnJheS4gIEl0IG1heSBjb21lIGJhY2sgYXQgYSBmdXR1cmUgZGF0ZSwKKwkJCSAqIHNvIHRoZSBiaXRtYXAgbXVzdCB0cmFjayBkaWZmZXJlbmNlcy4gIEFnYWluLCAnLSAtJworCQkJICogaXMgdXNlZCBpbiB0aGUgQ1RSIHRhYmxlLgorCQkJICovCisJCQlpZiAoKHNlZ190eXBlKHNlZywgcykgPT0gQVJFQV9VTkFTU0lHTkVEKSB8fAorCQkJICAgIChsdl9pc192aXNpYmxlKHNlZ19sdihzZWcsIHMpKSAmJgorCQkJICAgICAhKHNlZ19sdihzZWcsIHMpLT5zdGF0dXMgJiBMVk1fV1JJVEUpKSkgeworCQkJCS8qIE9uZSBlYWNoIGZvciBtZXRhZGF0YSBhcmVhIGFuZCBkYXRhIGFyZWEgKi8KKwkJCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfbnVsbF9hcmVhKG5vZGUsIDApIHx8CisJCQkJICAgICFkbV90cmVlX25vZGVfYWRkX251bGxfYXJlYShub2RlLCAwKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcsIHMpKSB7CisJCQkJaWYgKCEoZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgc2VnX21ldGFsdihzZWcsIHMpLCBOVUxMKSkpCisJCQkJCXJldHVybl8wOworCQkJCWlmICghZG1fdHJlZV9ub2RlX2FkZF90YXJnZXRfYXJlYShub2RlLCBOVUxMLCBkbGlkLCBleHRlbnRfc2l6ZSAqIHNlZ19tZXRhbGUoc2VnLCBzKSkpCisJCQkJCXJldHVybl8wOworCQkJfSBlbHNlIGlmICghZG1fdHJlZV9ub2RlX2FkZF9udWxsX2FyZWEobm9kZSwgMCkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIHNlZ19sdihzZWcsIHMpLCBOVUxMKSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEobm9kZSwgTlVMTCwgZGxpZCwgZXh0ZW50X3NpemUgKiBzZWdfbGUoc2VnLCBzKSkpCisJCQkJcmV0dXJuXzA7CisJCX0gZWxzZSBpZiAoc2VnX3R5cGUoc2VnLCBzKSA9PSBBUkVBX0xWKSB7CisKKwkJCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIHNlZ19sdihzZWcsIHMpLCBOVUxMKSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEobm9kZSwgTlVMTCwgZGxpZCwgZXh0ZW50X3NpemUgKiBzZWdfbGUoc2VnLCBzKSkpCisJCQkJcmV0dXJuXzA7CisJCX0gZWxzZSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuYXNzaWduZWQgYXJlYSBmb3VuZCBpbiBMViAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUoc2VnLT5sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKyAgICAgICAgaWYgKG51bV9lcnJvcl9hcmVhcykgeworCQkvKiBUaGlucyBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcGFydGlhbCBhY3RpdmF0aW9uICovCisJCWlmIChsdl9pc190aGluX3R5cGUoc2VnLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlICVzOiBwb29sIGluY29tcGxldGUuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9sYXllcl90YXJnZXRfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IGNoYXIgKmxheWVyX2RsaWQ7CisKKwlpZiAoIShsYXllcl9kbGlkID0gYnVpbGRfZG1fdXVpZChkbS0+bWVtLCBsdiwgbHZfbGF5ZXIobHYpKSkpCisJCXJldHVybl8wOworCisJLyogQWRkIGxpbmVhciBtYXBwaW5nIG92ZXIgbGF5ZXJlZCBMViAqLworCWlmICghYWRkX2xpbmVhcl9hcmVhX3RvX2R0cmVlKGRub2RlLCBsdi0+c2l6ZSwgbHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkgICAgICBsdi0+dmctPmNtZC0+dXNlX2xpbmVhcl90YXJnZXQsCisJCQkJICAgICAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSkgfHwKKwkgICAgIWRtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEoZG5vZGUsIE5VTEwsIGxheWVyX2RsaWQsIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfb3JpZ2luX3RhcmdldF90b19kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljb25zdCBjaGFyICpyZWFsX2RsaWQ7CisKKwlpZiAoIShyZWFsX2RsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIGx2LCAicmVhbCIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfc25hcHNob3Rfb3JpZ2luX3RhcmdldChkbm9kZSwgbHYtPnNpemUsIHJlYWxfZGxpZCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9zbmFwc2hvdF9tZXJnZV90YXJnZXRfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkJICAgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljb25zdCBjaGFyICpvcmlnaW5fZGxpZCwgKmNvd19kbGlkLCAqbWVyZ2VfZGxpZDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqbWVyZ2luZ19zbmFwX3NlZyA9IGZpbmRfc25hcHNob3QobHYpOworCisJaWYgKCFsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBpcyBub3QgbWVyZ2luZyBzbmFwc2hvdC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShvcmlnaW5fZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbHYsICJyZWFsIikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGNvd19kbGlkID0gYnVpbGRfZG1fdXVpZChkbS0+bWVtLCBtZXJnaW5nX3NuYXBfc2VnLT5jb3csICJjb3ciKSkpCisJCXJldHVybl8wOworCisJaWYgKCEobWVyZ2VfZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgbWVyZ2luZ19zbmFwX3NlZy0+Y293LCBOVUxMKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90cmVlX25vZGVfYWRkX3NuYXBzaG90X21lcmdlX3RhcmdldChkbm9kZSwgbHYtPnNpemUsIG9yaWdpbl9kbGlkLAorCQkJCQkJICAgIGNvd19kbGlkLCBtZXJnZV9kbGlkLAorCQkJCQkJICAgIG1lcmdpbmdfc25hcF9zZWctPmNodW5rX3NpemUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfc25hcHNob3RfdGFyZ2V0X3RvX2R0cmVlKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sCisJCQkJCSBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkJIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzKQoreworCWNvbnN0IGNoYXIgKm9yaWdpbl9kbGlkOworCWNvbnN0IGNoYXIgKmNvd19kbGlkOworCXN0cnVjdCBsdl9zZWdtZW50ICpzbmFwX3NlZzsKKwl1aW50NjRfdCBzaXplOworCisJaWYgKCEoc25hcF9zZWcgPSBmaW5kX3NuYXBzaG90KGx2KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIHNuYXBzaG90IGZvciAnJXMnLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKG9yaWdpbl9kbGlkID0gYnVpbGRfZG1fdXVpZChkbS0+bWVtLCBzbmFwX3NlZy0+b3JpZ2luLCAicmVhbCIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShjb3dfZGxpZCA9IGJ1aWxkX2RtX3V1aWQoZG0tPm1lbSwgc25hcF9zZWctPmNvdywgImNvdyIpKSkKKwkJcmV0dXJuXzA7CisKKwlzaXplID0gKHVpbnQ2NF90KSBzbmFwX3NlZy0+bGVuICogc25hcF9zZWctPm9yaWdpbi0+dmctPmV4dGVudF9zaXplOworCisJaWYgKCFsYW9wdHMtPm5vX21lcmdpbmcgJiYgbHZfaXNfbWVyZ2luZ19jb3cobHYpKSB7CisJCS8qIGNvdyBpcyB0byBiZSBtZXJnZWQgc28gbG9hZCB0aGUgZXJyb3IgdGFyZ2V0ICovCisJCWlmICghZG1fdHJlZV9ub2RlX2FkZF9lcnJvcl90YXJnZXQoZG5vZGUsIHNpemUpKQorCQkJcmV0dXJuXzA7CisJfQorCWVsc2UgaWYgKCFkbV90cmVlX25vZGVfYWRkX3NuYXBzaG90X3RhcmdldChkbm9kZSwgc2l6ZSwgb3JpZ2luX2RsaWQsCisJCQkJCQkgICBjb3dfZGxpZCwgMSwgc25hcF9zZWctPmNodW5rX3NpemUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfdGFyZ2V0X3RvX2R0cmVlKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sCisJCQkJc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQlzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzKQoreworCXVpbnQ2NF90IGV4dGVudF9zaXplID0gc2VnLT5sdi0+dmctPmV4dGVudF9zaXplOworCisJaWYgKCFzZWctPnNlZ3R5cGUtPm9wcy0+YWRkX3RhcmdldF9saW5lKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2VtaXRfdGFyZ2V0IGNhbm5vdCBoYW5kbGUgIgorCQkJICAic2VnbWVudCB0eXBlICVzIiwgc2VnLT5zZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHNlZy0+c2VndHlwZS0+b3BzLT5hZGRfdGFyZ2V0X2xpbmUoZG0sIGRtLT5tZW0sIGRtLT5jbWQsCisJCQkJCQkgICZkbS0+dGFyZ2V0X3N0YXRlLCBzZWcsCisJCQkJCQkgIGxhb3B0cywgZG5vZGUsCisJCQkJCQkgIGV4dGVudF9zaXplICogc2VnLT5sZW4sCisJCQkJCQkgICZkbS0+cHZtb3ZlX21pcnJvcl9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9uZXdfbHZfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJCQljb25zdCBjaGFyICpsYXllcik7CisKKy8qIEFkZCBhbGwgcmVwbGljYXRvcnMnIExWcyAqLworc3RhdGljIGludCBfYWRkX3JlcGxpY2F0b3JfZGV2X3RhcmdldF90b19kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCQkgICAgICAgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCQkgICAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkJICAgICAgIHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpCit7CisJc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2OworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJLyogRm9yIGluYWN0aXZlIHJlcGxpY2F0b3IgYWRkIGxpbmVhciBtYXBwaW5nICovCisJaWYgKCFsdl9pc19hY3RpdmVfcmVwbGljYXRvcl9kZXYoc2VnLT5sdikpIHsKKwkJaWYgKCFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZy0+bHYtPnJkZXZpY2UtPmx2LCBsYW9wdHMsIE5VTEwpKQorCQkJcmV0dXJuXzA7CisJCXJldHVybiAxOworCX0KKworCS8qIEFkZCBybG9nIGFuZCByZXBsaWNhdG9yIG5vZGVzICovCisJaWYgKCFzZWctPnJlcGxpY2F0b3IgfHwKKwkgICAgIWZpcnN0X3NlZyhzZWctPnJlcGxpY2F0b3IpLT5ybG9nX2x2IHx8CisJICAgICFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsCisJCQkJICBmaXJzdF9zZWcoc2VnLT5yZXBsaWNhdG9yKS0+cmxvZ19sdiwKKwkJCQkgIGxhb3B0cywgTlVMTCkgfHwKKwkgICAgIV9hZGRfbmV3X2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwgc2VnLT5yZXBsaWNhdG9yLCBsYW9wdHMsIE5VTEwpKQorCSAgICByZXR1cm5fMDsKKworCS8qIEFjdGl2YXRpb24gb2Ygb25lIHJlcGxpY2F0b3JfZGV2IG5vZGUgYWN0aXZhdGVzIGFsbCBvdGhlciBub2RlcyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnNlZy0+cmVwbGljYXRvci0+cnNpdGVzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKSB7CisJCQlpZiAocmRldi0+bHYgJiYKKwkJCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCByZGV2LT5sdiwKKwkJCQkJCSAgbGFvcHRzLCBOVUxMKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJaWYgKHJkZXYtPnNsb2cgJiYKKwkJCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCByZGV2LT5zbG9nLAorCQkJCQkJICBsYW9wdHMsIE5VTEwpKQorCQkJCXJldHVybl8wOworCQl9CisJfQorCS8qIEFkZCByZW1haW5pbmcgcmVwbGljYXRvci1kZXYgbm9kZXMgaW4gdGhlIHNlY29uZCBsb29wCisJICogdG8gYXZvaWQgbXVsdGlwbGUgcmV0cmllcyBmb3IgaW5zZXJ0aW5nIGFsbCBlbGVtZW50cyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnNlZy0+cmVwbGljYXRvci0+cnNpdGVzKSB7CisJCWlmIChyc2l0ZS0+c3RhdGUgIT0gUkVQTElDQVRPUl9TVEFURV9BQ1RJVkUpCisJCQljb250aW51ZTsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJkZXYsICZyc2l0ZS0+cmRldmljZXMpIHsKKwkJCWlmIChyZGV2LT5yZXBsaWNhdG9yX2Rldi0+bHYgPT0gc2VnLT5sdikKKwkJCQljb250aW51ZTsKKwkJCWlmICghcmRldi0+cmVwbGljYXRvcl9kZXYtPmx2IHx8CisJCQkgICAgIV9hZGRfbmV3X2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwKKwkJCQkJCSAgcmRldi0+cmVwbGljYXRvcl9kZXYtPmx2LAorCQkJCQkJICBsYW9wdHMsIE5VTEwpKQorCQkJCXJldHVybl8wOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9uZXdfZXh0ZXJuYWxfbHZfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkJIHN0cnVjdCBkbV90cmVlICpkdHJlZSwKKwkJCQkJIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZXh0ZXJuYWxfbHYsCisJCQkJCSBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzKQoreworCXN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwkvKiBEbyBub3Qgd2FudCB0byByZWN1cnNpdmVseSBhZGQgZXh0ZXJuYWxzIGFnYWluICovCisJaWYgKGRtLT5za2lwX2V4dGVybmFsX2x2KQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQW55IExWIGNhbiBoYXZlIG9ubHkgMSBleHRlcm5hbCBvcmlnaW4sIHNvIHdlIHdpbGwKKwkgKiBwcm9jZXNzIGFsbCBMVnMgcmVsYXRlZCB0byB0aGlzIExWLCBhbmQgd2Ugd2FudCB0bworCSAqIHNraXAgcmVwZWF0ZWQgaW52b2NhdGlvbiBvZiBleHRlcm5hbCBsdiBwcm9jZXNzaW5nCisJICovCisJZG0tPnNraXBfZXh0ZXJuYWxfbHYgPSAxOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkFkZGluZyBleHRlcm5hbCBvcmlnaW4gTFYgJXMgYW5kIGFsbCBhY3RpdmUgdXNlcnMuIiwKKwkJCSAgICAgZGlzcGxheV9sdm5hbWUoZXh0ZXJuYWxfbHYpKTsKKworCWlmICghX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBleHRlcm5hbF9sdiwgbGFvcHRzLAorCQkJCSAgbHZfbGF5ZXIoZXh0ZXJuYWxfbHYpKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIEFkZCBhbGwgQUNUSVZFIExWcyB1c2luZyB0aGlzIGV4dGVybmFsIG9yaWdpbiBMVi4gVGhpcyBpcworCSAqIG5lZWRlZCBiZWNhdXNlIG9mIGNvbnZlcnNpb24gb2YgdGhpbiB3aGljaCBjb3VsZCBoYXZlIGJlZW4KKwkgKiBhbHNvIGFuIG9sZC1zbmFwc2hvdCB0byBleHRlcm5hbCBvcmlnaW4uCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmZXh0ZXJuYWxfbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikKKwkJaWYgKChzbC0+c2VnLT5leHRlcm5hbF9sdiA9PSBleHRlcm5hbF9sdikgJiYKKwkJICAgIC8qIEFkZCBvbmx5IGFjdGl2ZSBsYXllcmVkIGRldmljZXMgKGFsc28gYXZvaWRzIGxvb3ApICovCisJCSAgICBfY2FjaGVkX2RtX2luZm8oZG0tPm1lbSwgZHRyZWUsIHNsLT5zZWctPmx2LAorCQkJCSAgICBsdl9sYXllcihzbC0+c2VnLT5sdikpICYmCisJCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzbC0+c2VnLT5sdiwKKwkJCQkJICBsYW9wdHMsIGx2X2xheWVyKHNsLT5zZWctPmx2KSkpCisJCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJGaW5pc2hlZCBhZGRpbmcgZXh0ZXJuYWwgb3JpZ2luIExWICVzIGFuZCBhbGwgYWN0aXZlIHVzZXJzLiIsCisJCQkgICAgIGRpc3BsYXlfbHZuYW1lKGV4dGVybmFsX2x2KSk7CisKKwlkbS0+c2tpcF9leHRlcm5hbF9sdiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX3NlZ21lbnRfdG9fZHRyZWUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCSBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJCQkgY29uc3QgY2hhciAqbGF5ZXIpCit7CisJdWludDMyX3QgczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX3ByZXNlbnQ7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwljb25zdCBjaGFyICp0YXJnZXRfbmFtZTsKKworCS8qIEVuc3VyZSByZXF1aXJlZCBkZXZpY2UtbWFwcGVyIHRhcmdldHMgYXJlIGxvYWRlZCAqLworCXNlZ19wcmVzZW50ID0gZmluZF9zbmFwc2hvdChzZWctPmx2KSA/IDogc2VnOworCXNlZ3R5cGUgPSBzZWdfcHJlc2VudC0+c2VndHlwZTsKKworCXRhcmdldF9uYW1lID0gKHNlZ3R5cGUtPm9wcy0+dGFyZ2V0X25hbWUgPworCQkgICAgICAgc2VndHlwZS0+b3BzLT50YXJnZXRfbmFtZShzZWdfcHJlc2VudCwgbGFvcHRzKSA6CisJCSAgICAgICBzZWd0eXBlLT5uYW1lKTsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDaGVja2luZyBrZXJuZWwgc3VwcG9ydHMgJXMgc2VnbWVudCB0eXBlIGZvciAlcyVzJXMiLAorCQkJICAgICB0YXJnZXRfbmFtZSwgZGlzcGxheV9sdm5hbWUoc2VnLT5sdiksCisJCQkgICAgIGxheWVyID8gIi0iIDogIiIsIGxheWVyID8gOiAiIik7CisKKwlpZiAoc2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudCAmJgorCSAgICAhc2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudChzZWdfcHJlc2VudC0+bHYtPnZnLT5jbWQsCisJCQkJCSAgc2VnX3ByZXNlbnQsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcHJvY2VzcyBMViAlczogJXMgdGFyZ2V0IHN1cHBvcnQgbWlzc2luZyAiCisJCQkgICJmcm9tIGtlcm5lbD8iLCBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSwgdGFyZ2V0X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBZGQgZXh0ZXJuYWwgb3JpZ2luIGxheWVyICovCisJaWYgKHNlZy0+ZXh0ZXJuYWxfbHYgJiYKKwkgICAgIV9hZGRfbmV3X2V4dGVybmFsX2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwgc2VnLT5leHRlcm5hbF9sdiwgbGFvcHRzKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgbWlycm9yIGxvZyAqLworCWlmIChzZWctPmxvZ19sdiAmJgorCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWctPmxvZ19sdiwgbGFvcHRzLCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgcG9vbCBtZXRhZGF0YSAqLworCWlmIChzZWctPm1ldGFkYXRhX2x2ICYmCisJICAgICFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZy0+bWV0YWRhdGFfbHYsIGxhb3B0cywgTlVMTCkpCisJCXJldHVybl8wOworCisJLyogQWRkIHBvb2wgbGF5ZXIgKi8KKwlpZiAoc2VnLT5wb29sX2x2ICYmICFsYW9wdHMtPm9yaWdpbl9vbmx5ICYmCisJICAgICFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIHNlZy0+cG9vbF9sdiwgbGFvcHRzLAorCQkJCSAgbHZfbGF5ZXIoc2VnLT5wb29sX2x2KSkpCisJCXJldHVybl8wOworCisJaWYgKHNlZ19pc19yZXBsaWNhdG9yX2RldihzZWcpKSB7CisJCWlmICghX2FkZF9yZXBsaWNhdG9yX2Rldl90YXJnZXRfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWcsIGxhb3B0cykpCisJCQlyZXR1cm5fMDsKKwl9CisKKwkvKiBBZGQgYW55IExWcyB1c2VkIGJ5IHRoaXMgc2VnbWVudCAqLworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7ICsrcykgeworCQlpZiAoKHNlZ190eXBlKHNlZywgcykgPT0gQVJFQV9MVikgJiYKKwkJICAgIC8qIG9yaWdpbiBvbmx5IGZvciBjYWNoZSB3aXRob3V0IHBlbmRpbmcgZGVsZXRlICovCisJCSAgICAoIWRtLT50cmFja19wZW5kaW5nX2RlbGV0ZSB8fCAhc2VnX2lzX2NhY2hlKHNlZykpICYmCisJCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWdfbHYoc2VnLCBzKSwKKwkJCQkJICBsYW9wdHMsIE5VTEwpKQorCQkJcmV0dXJuXzA7CisJCWlmIChzZWdfaXNfcmFpZF93aXRoX21ldGEoc2VnKSAmJiBzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcsIHMpICYmCisJCSAgICAhX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWdfbWV0YWx2KHNlZywgcyksCisJCQkJCSAgbGFvcHRzLCBOVUxMKSkKKwkJCXJldHVybl8wOworCX0KKworCWlmIChkbS0+dHJhY2tfcGVuZGluZ19kZWxldGUpIHsKKwkJLyogUmVwbGFjZSB0YXJnZXQgYW5kIGFsbCBpdHMgdXNlZCBkZXZzIHdpdGggZXJyb3IgbWFwcGluZyAqLworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiVXNpbmcgZXJyb3IgZm9yIHBlbmRpbmcgZGVsZXRlICVzLiIsCisJCQkJICAgICBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSk7CisJCWlmICghZG1fdHJlZV9ub2RlX2FkZF9lcnJvcl90YXJnZXQoZG5vZGUsICh1aW50NjRfdClzZWctPmx2LT52Zy0+ZXh0ZW50X3NpemUgKiBzZWctPmxlbikpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKCFfYWRkX3RhcmdldF90b19kdHJlZShkbSwgZG5vZGUsIHNlZywgbGFvcHRzKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX25ld19sdl90b19kdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUsCisJCQkJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJCQljb25zdCBjaGFyICpsYXllcikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBsdl9sYXllciAqbHZsYXllcjsKKwlzdHJ1Y3Qgc2VnX2xpc3QgKnNsOworCXN0cnVjdCBkbV9saXN0ICpzbmg7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGU7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmRpbmZvOworCWNoYXIgKm5hbWUsICpkbGlkOworCXVpbnQzMl90IG1heF9zdHJpcGVfc2l6ZSA9IFVJTlQzMl9DKDApOworCXVpbnQzMl90IHJlYWRfYWhlYWQgPSBsdi0+cmVhZF9haGVhZDsKKwl1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzID0gVUlOVDMyX0MoMCk7CisJaW50IHNhdmVfcGVuZGluZ19kZWxldGUgPSBkbS0+dHJhY2tfcGVuZGluZ19kZWxldGU7CisJaW50IG1lcmdlX2luX3Byb2dyZXNzID0gMDsKKworCS8qIExWIHdpdGggcGVuZGluZyBkZWxldGUgaXMgbmV2ZXIgcHV0IG5ldyBpbnRvIGEgdGFibGUgKi8KKwlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUobHYpICYmICFfY2FjaGVkX2RtX2luZm8oZG0tPm1lbSwgZHRyZWUsIGx2LCBOVUxMKSkKKwkJcmV0dXJuIDE7IC8qIFJlcGxhY2Ugd2l0aCBlcnJvciBvbmx5IHdoZW4gYWxyZWFkeSBleGlzdHMgKi8KKworCWlmIChsdl9pc19jYWNoZV9wb29sKGx2KSAmJgorCSAgICAhZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpIHsKKwkJLyogY2FjaGUgcG9vbCBpcyAnbWV0YScgTFYgYW5kIGRvZXMgbm90IGhhdmUgYSByZWFsIGRldmljZSBub2RlICovCisJCWlmICghX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBzZWdfbHYoZmlyc3Rfc2VnKGx2KSwgMCksIGxhb3B0cywgTlVMTCkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIGZpcnN0X3NlZyhsdiktPm1ldGFkYXRhX2x2LCBsYW9wdHMsIE5VTEwpKQorCQkJcmV0dXJuXzA7CisJCXJldHVybiAxOworCX0KKworCS8qIEZJWE1FIFNlZWsgYSBzaW1wbGVyIHdheSB0byBsYXkgb3V0IHRoZSBzbmFwc2hvdC1tZXJnZSB0cmVlLiAqLworCisJaWYgKCFsYXllciAmJiBsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJc2VnID0gZmluZF9zbmFwc2hvdChsdik7CisJCS8qCisJCSAqIFByZXZlbnQgbWVyZ2UgaWYgbWVyZ2UgaXNuJ3QgY3VycmVudGx5IHBvc3NpYmxlOgorCQkgKiBlaXRoZXIgb3JpZ2luIG9yIG1lcmdpbmcgc25hcHNob3QgYXJlIG9wZW4KKwkJICogLSBmb3Igb2xkIHNuYXBzIHVzZSAic25hcHNob3QtbWVyZ2UiIGlmIGl0IGlzIGFscmVhZHkgaW4gdXNlCisJCSAqIC0gb3Blbl9jb3VudCBpcyBhbHdheXMgcmV0cmlldmVkIChhcyBvZiBkbS1pb2N0bCA0LjcuMCkKKwkJICogICBzbyBqdXN0IHVzZSB0aGUgdHJlZSdzIGV4aXN0aW5nIG5vZGVzJyBpbmZvCisJCSAqLworCQlpZiAoKGRpbmZvID0gX2NhY2hlZF9kbV9pbmZvKGRtLT5tZW0sIGR0cmVlLCBsdiwgTlVMTCkpKSB7CisJCQkvKiBNZXJnaW5nIG9yaWdpbiBMViBpcyBwcmVzZW50LCBjaGVjayBpZiBtZXJnaW5zIGlzIGFscmVhZHkgcnVubmluZy4gKi8KKwkJCWlmICgoc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykgJiYgX3RoaW5fbHZfaGFzX2RldmljZV9pZChkbS0+bWVtLCBsdiwgTlVMTCwgc2VnLT5kZXZpY2VfaWQpKSB8fAorCQkJICAgICghc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykgJiYgbHZfaGFzX3RhcmdldF90eXBlKGRtLT5tZW0sIGx2LCBOVUxMLCBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkpKSB7CisJCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIk1lcmdpbmcgb2Ygc25hcHNob3Qgdm9sdW1lICVzIHRvIG9yaWdpbiAlcyBpcyBpbiBwcm9ncmVzcy4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSwgZGlzcGxheV9sdm5hbWUoc2VnLT5sdikpOworCQkJCW1lcmdlX2luX3Byb2dyZXNzID0gMTsgLyogTWVyZ2UgaXMgYWxyZWFkeSBydW5uaW5nICovCisJCQl9IC8qIE1lcmdlIGlzIG5vdCB5ZXQgcnVubmluZywgc28gY2hlY2sgaWYgaXQgY2FuIGJlIHN0YXJ0ZWQgKi8KKwkJCWVsc2UgaWYgKGxhb3B0cy0+cmVzdW1pbmcpIHsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUG9zdHBvbmluZyBwZW5kaW5nIHNuYXBzaG90IG1lcmdlIGZvciBvcmlnaW4gJXMsICIKKwkJCQkJCSAgICAgIm1lcmdlIHdhcyBub3Qgc3RhcnRlZCBiZWZvcmUgc3VzcGVuZC4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCWxhb3B0cy0+bm9fbWVyZ2luZyA9IDE7IC8qIENhbm5vdCBiZSByZWxvYWRlZCBpbiBzdXNwZW5kICovCisJCQl9IC8qIE5vbi1yZXN1bWluZyBtZXJnZSByZXF1aXJlcyBvcmlnaW4gdG8gYmUgdW51c2VkICovCisJCQllbHNlIGlmIChkaW5mby0+b3Blbl9jb3VudCkgeworCQkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJQb3N0cG9uaW5nIHBlbmRpbmcgc25hcHNob3QgbWVyZ2UgZm9yIG9yaWdpbiAlcywgIgorCQkJCQkJICAgICAib3JpZ2luIHZvbHVtZSBpcyBvcGVuZWQuIiwKKwkJCQkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlsYW9wdHMtPm5vX21lcmdpbmcgPSAxOworCQkJfQorCQl9CisKKwkJLyogSWYgbWVyZ2Ugd291bGQgYmUgc3RpbGwgdW5kZWNpZGVkLCBsb29rIGFzIHNuYXBzaG90ICovCisJCWlmICghbWVyZ2VfaW5fcHJvZ3Jlc3MgJiYgIWxhb3B0cy0+bm9fbWVyZ2luZyAmJgorCQkgICAgKGRpbmZvID0gX2NhY2hlZF9kbV9pbmZvKGRtLT5tZW0sIGR0cmVlLAorCQkJCQkgICAgIHNlZ19pc190aGluX3ZvbHVtZShzZWcpID8KKwkJCQkJICAgICBzZWctPmx2IDogc2VnLT5jb3csIE5VTEwpKSkgeworCQkJaWYgKHNlZ19pc190aGluX3ZvbHVtZShzZWcpKSB7CisJCQkJLyogQWN0aXZlIHRoaW4gc25hcHNob3QgcHJldmVudHMgbWVyZ2UgKi8KKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUG9zdHBvbmluZyBwZW5kaW5nIHNuYXBzaG90IG1lcmdlIGZvciBvcmlnaW4gdm9sdW1lICVzLCAiCisJCQkJCQkgICAgICJtZXJnaW5nIHRoaW4gc25hcHNob3Qgdm9sdW1lICVzIGlzIGFjdGl2ZS4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdiksIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpKTsKKwkJCQlsYW9wdHMtPm5vX21lcmdpbmcgPSAxOworCQkJfSBlbHNlIGlmIChkaW5mby0+b3Blbl9jb3VudCkgeworCQkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJQb3N0cG9uaW5nIHBlbmRpbmcgc25hcHNob3QgbWVyZ2UgZm9yIG9yaWdpbiB2b2x1bWUgJXMsICIKKwkJCQkJCSAgICAgIm1lcmdpbmcgc25hcHNob3Qgdm9sdW1lICVzIGlzIG9wZW5lZC4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShsdiksIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpKTsKKwkJCQlsYW9wdHMtPm5vX21lcmdpbmcgPSAxOworCQkJfQorCQl9CisJfQorCisJaWYgKCEobmFtZSA9IGRtX2J1aWxkX2RtX25hbWUoZG0tPm1lbSwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSwgbGF5ZXIpKSkKKwkJcmV0dXJuXzA7CisKKyAgICAgICAgLyogRXZlbiB1bnVzZWQgdGhpbi1wb29sIHN0aWxsIG5lZWRzIHRvIGdldCBsYXllcmVkICBVVUlEIC1zdWZmaXggKi8KKwlpZiAoIWxheWVyICYmIGx2X2lzX25ld190aGluX3Bvb2wobHYpKQorCQlsYXllciA9IGx2X2xheWVyKGx2KTsKKworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIGx2LCBsYXllcikpKQorCQlyZXR1cm5fMDsKKworCS8qIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgbm9kZSBpZiBpdCBhbHJlYWR5IGhhcyBhIGNvbnRleHQgcHRyICovCisJaWYgKChkbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQoZHRyZWUsIGRsaWQpKSAmJgorCSAgICBkbV90cmVlX25vZGVfZ2V0X2NvbnRleHQoZG5vZGUpKQorCQlyZXR1cm4gMTsKKworCWlmICghKGx2bGF5ZXIgPSBkbV9wb29sX2FsbG9jKGRtLT5tZW0sIHNpemVvZigqbHZsYXllcikpKSkgeworCQlsb2dfZXJyb3IoIl9hZGRfbmV3X2x2X3RvX2R0cmVlOiBwb29sIGFsbG9jIGZhaWxlZCBmb3IgJXMgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBsYXllcik7CisJCXJldHVybiAwOworCX0KKworCWx2bGF5ZXItPmx2ID0gbHY7CisKKwkvKgorCSAqIEFkZCBMViB0byBkdHJlZS4KKwkgKiBJZiB3ZSdyZSB3b3JraW5nIHdpdGggcHJlY29tbWl0dGVkIG1ldGFkYXRhLCBjbGVhciBhbnkKKwkgKiBleGlzdGluZyBpbmFjdGl2ZSB0YWJsZSBsZWZ0IGJlaGluZC4KKwkgKiBNYWpvci9taW5vciBzZXR0aW5ncyBvbmx5IGFwcGx5IHRvIHRoZSB2aXNpYmxlIGxheWVyLgorCSAqLworCS8qIEZJWE1FIE1vdmUgdGhlIGNsZWFyIGZyb20gaGVyZSB1bnRpbCBsYXRlciwgc28gd2UgY2FuIGxlYXZlCisJICogaWRlbnRpY2FsIGluYWN0aXZlIHRhYmxlcyB1bnRvdWNoZWQuIChGb3IgcHZtb3ZlLikKKwkgKi8KKwlpZiAoIShkbm9kZSA9IGRtX3RyZWVfYWRkX25ld19kZXZfd2l0aF91ZGV2X2ZsYWdzKGR0cmVlLCBuYW1lLCBkbGlkLAorCQkJCQkgICAgIGxheWVyID8gVUlOVDMyX0MoMCkgOiAodWludDMyX3QpIGx2LT5tYWpvciwKKwkJCQkJICAgICBsYXllciA/IFVJTlQzMl9DKDApIDogKHVpbnQzMl90KSBsdi0+bWlub3IsCisJCQkJCSAgICAgcmVhZF9vbmx5X2x2KGx2LCBsYW9wdHMpLAorCQkJCQkgICAgICgobHYtPnZnLT5zdGF0dXMgJiBQUkVDT01NSVRURUQpIHwgbGFvcHRzLT5yZXZlcnQpID8gMSA6IDAsCisJCQkJCSAgICAgbHZsYXllciwKKwkJCQkJICAgICBfZ2V0X3VkZXZfZmxhZ3MoZG0sIGx2LCBsYXllciwgbGFvcHRzLT5ub3NjYW4sIGxhb3B0cy0+dGVtcG9yYXJ5KSkpKQorCQlyZXR1cm5fMDsKKworCS8qIFN0b3JlIGV4aXN0aW5nIG5hbWUgc28gd2UgY2FuIGRvIHJlbmFtZSBsYXRlciAqLworCWx2bGF5ZXItPm9sZF9uYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKGRub2RlKTsKKworCS8qIENyZWF0ZSB0YWJsZSAqLworCWRtLT5wdm1vdmVfbWlycm9yX2NvdW50ID0gMHU7CisKKwlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUobHYpKQorCQkvKiBIYW5kbGUgTFZzIHdpdGggcGVuZGluZyBkZWxldGUgKi8KKwkJLyogRm93IG5vdyB1c2VkIG9ubHkgYnkgY2FjaGUgc2VndHlwZSwgVE9ETyBzbmFwc2hvdHMgKi8KKwkJZG0tPnRyYWNrX3BlbmRpbmdfZGVsZXRlID0gMTsKKworCS8qIFRoaXMgaXMgdW51c2VkIGNhY2hlLXBvb2wgLSBtYWtlIG1ldGFkYXRhIGFjY2Vzc2libGUgKi8KKwlpZiAobHZfaXNfY2FjaGVfcG9vbChsdikpCisJCWx2ID0gZmlyc3Rfc2VnKGx2KS0+bWV0YWRhdGFfbHY7CisKKwkvKiBJZiB0aGlzIGlzIGEgc25hcHNob3Qgb3JpZ2luLCBhZGQgcmVhbCBMViAqLworCS8qIElmIHRoaXMgaXMgYSBzbmFwc2hvdCBvcmlnaW4gKyBtZXJnaW5nIHNuYXBzaG90LCBhZGQgY293ICsgcmVhbCBMViAqLworCS8qIFNuYXBzaG90IG9yaWdpbiBjb3VsZCBiZSBhbHNvIGV4dGVybmFsIG9yaWdpbiAqLworCWlmIChsdl9pc19vcmlnaW4obHYpICYmICFsYXllcikgeworCQlpZiAoIV9hZGRfbmV3X2x2X3RvX2R0cmVlKGRtLCBkdHJlZSwgbHYsIGxhb3B0cywgInJlYWwiKSkKKwkJCXJldHVybl8wOworCQlpZiAoIWxhb3B0cy0+bm9fbWVyZ2luZyAmJiBsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJCWlmICghX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLAorCQkJCQkJICBmaW5kX3NuYXBzaG90KGx2KS0+Y293LCBsYW9wdHMsICJjb3ciKSkKKwkJCQlyZXR1cm5fMDsKKwkJCS8qCisJCQkgKiBNdXN0IGFsc28gYWRkICJyZWFsIiBMViBmb3IgdXNlIHdoZW4KKwkJCSAqIHNuYXBzaG90LW1lcmdlIHRhcmdldCBpcyBhZGRlZAorCQkJICovCisJCQlpZiAoIV9hZGRfc25hcHNob3RfbWVyZ2VfdGFyZ2V0X3RvX2R0cmVlKGRtLCBkbm9kZSwgbHYpKQorCQkJCXJldHVybl8wOworCQl9IGVsc2UgaWYgKCFfYWRkX29yaWdpbl90YXJnZXRfdG9fZHRyZWUoZG0sIGRub2RlLCBsdikpCisJCQlyZXR1cm5fMDsKKworCQkvKiBBZGQgYW55IHNuYXBzaG90cyBvZiB0aGlzIExWICovCisJCWRtX2xpc3RfaXRlcmF0ZShzbmgsICZsdi0+c25hcHNob3Rfc2VncykKKwkJCWlmICghX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLAorCQkJCQkJICBkbV9saXN0X3N0cnVjdF9iYXNlKHNuaCwgc3RydWN0IGx2X3NlZ21lbnQsCisJCQkJCQkJCSAgICAgIG9yaWdpbl9saXN0KS0+Y293LAorCQkJCQkJICBsYW9wdHMsIE5VTEwpKQorCQkJCXJldHVybl8wOworCX0gZWxzZSBpZiAobHZfaXNfY293KGx2KSAmJiAhbGF5ZXIpIHsKKwkJaWYgKCFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIGx2LCBsYW9wdHMsICJjb3ciKSkKKwkJCXJldHVybl8wOworCQlpZiAoIV9hZGRfc25hcHNob3RfdGFyZ2V0X3RvX2R0cmVlKGRtLCBkbm9kZSwgbHYsIGxhb3B0cykpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKCFsYXllciAmJiAoKGx2X2lzX3RoaW5fcG9vbChsdikgJiYgIWx2X2lzX25ld190aGluX3Bvb2wobHYpKSB8fAorCQkJICAgICAgbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkpIHsKKwkJLyogRXh0ZXJuYWwgb3JpZ2luIG9yICd1c2VkJyBUaGluIHBvb2wgaXMgdXNpbmcgbGF5ZXIgKi8KKwkJaWYgKCFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIGx2LCBsYW9wdHMsIGx2X2xheWVyKGx2KSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFfYWRkX2xheWVyX3RhcmdldF90b19kdHJlZShkbSwgZG5vZGUsIGx2KSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCS8qIEFkZCAncmVhbCcgc2VnbWVudHMgZm9yIExWcyAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCQlpZiAoIV9hZGRfc2VnbWVudF90b19kdHJlZShkbSwgZHRyZWUsIGRub2RlLCBzZWcsIGxhb3B0cywgbGF5ZXIpKQorCQkJCXJldHVybl8wOworCQkJaWYgKG1heF9zdHJpcGVfc2l6ZSA8IHNlZy0+c3RyaXBlX3NpemUgKiBzZWctPmFyZWFfY291bnQpCisJCQkJbWF4X3N0cmlwZV9zaXplID0gc2VnLT5zdHJpcGVfc2l6ZSAqIHNlZy0+YXJlYV9jb3VudDsKKwkJfQorCX0KKworCS8qIFNldHVwIHRoaW4gcG9vbCBjYWxsYmFjayAqLworCWlmIChsdl9pc190aGluX3Bvb2wobHYpICYmIGxheWVyICYmCisJICAgICFfcG9vbF9yZWdpc3Rlcl9jYWxsYmFjayhkbSwgZG5vZGUsIGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfaXNfY2FjaGUobHYpICYmCisJICAgICFfcG9vbF9yZWdpc3Rlcl9jYWxsYmFjayhkbSwgZG5vZGUsIGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAocmVhZF9haGVhZCA9PSBETV9SRUFEX0FIRUFEX0FVVE8pIHsKKwkJLyogd2UgbmVlZCBSQSBhdCBsZWFzdCB0d2ljZSBhIHdob2xlIHN0cmlwZSAtIHNlZSB0aGUgY29tbWVudCBpbiBtZC9yYWlkMC5jICovCisJCXJlYWRfYWhlYWQgPSBtYXhfc3RyaXBlX3NpemUgKiAyOworCQkvKiBGSVhNRTogbGF5ZXJlZCBkZXZpY2UgcmVhZC1haGVhZCAqLworCQlpZiAoIXJlYWRfYWhlYWQpCisJCQlsdl9jYWxjdWxhdGVfcmVhZGFoZWFkKGx2LCAmcmVhZF9haGVhZCk7CisJCXJlYWRfYWhlYWRfZmxhZ3MgPSBETV9SRUFEX0FIRUFEX01JTklNVU1fRkxBRzsKKwl9CisKKwlkbV90cmVlX25vZGVfc2V0X3JlYWRfYWhlYWQoZG5vZGUsIHJlYWRfYWhlYWQsIHJlYWRfYWhlYWRfZmxhZ3MpOworCisJLyogQWRkIGFueSBMVnMgcmVmZXJlbmNpbmcgYSBQVk1PVkUgTFYgdW5sZXNzIHRvbGQgbm90IHRvICovCisJaWYgKGRtLT50cmFja19wdm1vdmVfZGVwcyAmJiBsdl9pc19wdm1vdmUobHYpKQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KQorCQkJaWYgKCFfYWRkX25ld19sdl90b19kdHJlZShkbSwgZHRyZWUsIHNsLT5zZWctPmx2LCBsYW9wdHMsIE5VTEwpKQorCQkJCXJldHVybl8wOworCisJZG0tPnRyYWNrX3BlbmRpbmdfZGVsZXRlID0gc2F2ZV9wZW5kaW5nX2RlbGV0ZTsgLyogcmVzdG9yZSAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qIEZJWE1FOiBzeW1saW5rcyBzaG91bGQgYmUgY3JlYXRlZC9kZXN0cm95ZWQgYXQgdGhlIHNhbWUgdGltZQorICogYXMgdGhlIGtlcm5lbCBkZXZpY2VzIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0IGZyb20gd2l0aGluIGxpYmRldm1hcHBlcgorICogYXQgcHJlc2VudCBzbyB3ZSBtdXN0IHdhbGsgdGhlIHRyZWUgdHdpY2UgaW5zdGVhZC4gKi8KKworLyoKKyAqIENyZWF0ZSBMViBzeW1saW5rcyBmb3IgY2hpbGRyZW4gb2Ygc3VwcGxpZWQgcm9vdCBub2RlLgorICovCitzdGF0aWMgaW50IF9jcmVhdGVfbHZfc3ltbGlua3Moc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWVfbm9kZSAqcm9vdCkKK3sKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkOworCXN0cnVjdCBsdl9sYXllciAqbHZsYXllcjsKKwljaGFyICpvbGRfdmduYW1lLCAqb2xkX2x2bmFtZSwgKm9sZF9sYXllcjsKKwljaGFyICpuZXdfdmduYW1lLCAqbmV3X2x2bmFtZSwgKm5ld19sYXllcjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByID0gMTsKKworCS8qIE5vdGhpbmcgdG8gZG8gaWYgdWRldiBmYWxsYmFjayBpcyBkaXNhYmxlZC4gKi8KKwlpZiAoIV9jaGVja191ZGV2X2ZhbGxiYWNrKGRtLT5jbWQpKSB7CisJCWZzX3NldF9jcmVhdGUoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKChjaGlsZCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCByb290LCAwKSkpIHsKKwkJaWYgKCEobHZsYXllciA9IGRtX3RyZWVfbm9kZV9nZXRfY29udGV4dChjaGlsZCkpKQorCQkJY29udGludWU7CisKKwkJLyogRGV0ZWN0IHJlbmFtZSAqLworCQluYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKGNoaWxkKTsKKworCQlpZiAobmFtZSAmJiBsdmxheWVyLT5vbGRfbmFtZSAmJiAqbHZsYXllci0+b2xkX25hbWUgJiYgc3RyY21wKG5hbWUsIGx2bGF5ZXItPm9sZF9uYW1lKSkgeworCQkJaWYgKCFkbV9zcGxpdF9sdm1fbmFtZShkbS0+bWVtLCBsdmxheWVyLT5vbGRfbmFtZSwgJm9sZF92Z25hbWUsICZvbGRfbHZuYW1lLCAmb2xkX2xheWVyKSkgeworCQkJCWxvZ19lcnJvcigiX2NyZWF0ZV9sdl9zeW1saW5rczogQ291bGRuJ3Qgc3BsaXQgdXAgb2xkIGRldmljZSBuYW1lICVzIiwgbHZsYXllci0+b2xkX25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFkbV9zcGxpdF9sdm1fbmFtZShkbS0+bWVtLCBuYW1lLCAmbmV3X3ZnbmFtZSwgJm5ld19sdm5hbWUsICZuZXdfbGF5ZXIpKSB7CisJCQkJbG9nX2Vycm9yKCJfY3JlYXRlX2x2X3N5bWxpbmtzOiBDb3VsZG4ndCBzcGxpdCB1cCBuZXcgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghZnNfcmVuYW1lX2x2KGx2bGF5ZXItPmx2LCBuYW1lLCBvbGRfdmduYW1lLCBvbGRfbHZuYW1lKSkKKwkJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChfbHZfaGFzX21rbm9kZShsdmxheWVyLT5sdikpIHsKKwkJCWlmICghX2Rldl9tYW5hZ2VyX2x2X21rbm9kZXMobHZsYXllci0+bHYpKQorCQkJCXIgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFfZGV2X21hbmFnZXJfbHZfcm1ub2RlcyhsdmxheWVyLT5sdikpCisJCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJlbW92ZSBMViBzeW1saW5rcyBmb3IgY2hpbGRyZW4gb2Ygc3VwcGxpZWQgcm9vdCBub2RlLgorICovCitzdGF0aWMgaW50IF9yZW1vdmVfbHZfc3ltbGlua3Moc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3RyZWVfbm9kZSAqcm9vdCkKK3sKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkOworCWNoYXIgKnZnbmFtZSwgKmx2bmFtZSwgKmxheWVyOworCWludCByID0gMTsKKworCS8qIE5vdGhpbmcgdG8gZG8gaWYgdWRldiBmYWxsYmFjayBpcyBkaXNhYmxlZC4gKi8KKwlpZiAoIV9jaGVja191ZGV2X2ZhbGxiYWNrKGRtLT5jbWQpKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgoY2hpbGQgPSBkbV90cmVlX25leHRfY2hpbGQoJmhhbmRsZSwgcm9vdCwgMCkpKSB7CisJCWlmICghZG1fc3BsaXRfbHZtX25hbWUoZG0tPm1lbSwgZG1fdHJlZV9ub2RlX2dldF9uYW1lKGNoaWxkKSwgJnZnbmFtZSwgJmx2bmFtZSwgJmxheWVyKSkgeworCQkJciA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKnZnbmFtZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIG9ubHkgdG9wIGxldmVsIGxheWVyIGhhcyBzeW1saW5rcyAqLworCQlpZiAoKmxheWVyKQorCQkJY29udGludWU7CisKKwkJZnNfZGVsX2x2X2J5bmFtZShkbS0+Y21kLT5kZXZfZGlyLCB2Z25hbWUsIGx2bmFtZSwKKwkJCQkgZG0tPmNtZC0+Y3VycmVudF9zZXR0aW5ncy51ZGV2X3J1bGVzKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfY2xlYW5fdHJlZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpyb290LCBjb25zdCBjaGFyICpub25fdG9wbGV2ZWxfdHJlZV9kbGlkKQoreworCXZvaWQgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqY2hpbGQ7CisJY2hhciAqdmduYW1lLCAqbHZuYW1lLCAqbGF5ZXI7CisJY29uc3QgY2hhciAqbmFtZSwgKnV1aWQ7CisJc3RydWN0IGRtX3N0cl9saXN0ICpkbDsKKworCS8qIERlYWN0aXZhdGUgYW55IHRyYWNrZWQgcGVuZGluZyBkZWxldGUgbm9kZXMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsICZkbS0+cGVuZGluZ19kZWxldGUpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkRlbGV0aW5nIHRyYWNrZWQgVVVJRCAlcy4iLCBkbC0+c3RyKTsKKwkJaWYgKCFkbV90cmVlX2RlYWN0aXZhdGVfY2hpbGRyZW4ocm9vdCwgZGwtPnN0ciwgc3RybGVuKGRsLT5zdHIpKSkKKwkJCXJldHVybl8wOworCX0KKworCXdoaWxlICgoY2hpbGQgPSBkbV90cmVlX25leHRfY2hpbGQoJmhhbmRsZSwgcm9vdCwgMCkpKSB7CisJCWlmICghKG5hbWUgPSBkbV90cmVlX25vZGVfZ2V0X25hbWUoY2hpbGQpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoY2hpbGQpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZG1fc3BsaXRfbHZtX25hbWUoZG0tPm1lbSwgbmFtZSwgJnZnbmFtZSwgJmx2bmFtZSwgJmxheWVyKSkgeworCQkJbG9nX2Vycm9yKCJfY2xlYW5fdHJlZTogQ291bGRuJ3Qgc3BsaXQgdXAgZGV2aWNlIG5hbWUgJXMuIiwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIE5vdCBtZWFudCB0byBiZSB0b3AgbGV2ZWw/ICovCisJCWlmICghKmxheWVyKQorCQkJY29udGludWU7CisKKwkJLyogSWYgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQgb24gYSBwYXJ0aWFsIHRyZWUsIGRvbid0IHJlbW92ZSBpdCAqLworCQlpZiAobm9uX3RvcGxldmVsX3RyZWVfZGxpZCAmJiAhc3RyY21wKG5vbl90b3BsZXZlbF90cmVlX2RsaWQsIHV1aWQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFkbV90cmVlX2RlYWN0aXZhdGVfY2hpbGRyZW4ocm9vdCwgdXVpZCwgc3RybGVuKHV1aWQpKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90cmVlX2FjdGlvbihzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgYWN0aW9uX3QgYWN0aW9uKQoreworCXN0YXRpYyBjb25zdCBjaGFyIF9hY3Rpb25fbmFtZXNbXVsyNF0gPSB7CisJCSJQUkVMT0FEIiwgIkFDVElWQVRFIiwgIkRFQUNUSVZBVEUiLCAiU1VTUEVORCIsICJTVVNQRU5EX1dJVEhfTE9DS0ZTIiwgIkNMRUFOIgorCX07CisJY29uc3Qgc2l6ZV90IERMSURfU0laRSA9IElEX0xFTiArIHNpemVvZihVVUlEX1BSRUZJWCkgLSAxOworCXN0cnVjdCBkbV90cmVlICpkdHJlZTsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpyb290OworCWNoYXIgKmRsaWQ7CisJaW50IHIgPSAwOworCisJaWYgKGFjdGlvbiA8IERNX0FSUkFZX1NJWkUoX2FjdGlvbl9uYW1lcykpCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDcmVhdGluZyAlcyVzIHRyZWUgZm9yICVzLiIsCisJCQkJICAgICBfYWN0aW9uX25hbWVzW2FjdGlvbl0sCisJCQkJICAgICAobGFvcHRzLT5vcmlnaW5fb25seSkgPyAiIG9yaWdpbi1vbmx5IiA6ICIiLAorCQkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCS8qIFNvbWUgTFYgY2FuIGJlIHVzZWQgZm9yIHRvcCBsZXZlbCB0cmVlICovCisJLyogVE9ETzogYWRkIG1vcmUuLi4uICovCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2wobHYpICYmICFkbV9saXN0X2VtcHR5KCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNhbm5vdCBjcmVhdGUgdHJlZSBmb3IgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFNvbWUgdGFyZ2V0cyBtYXkgYnVpbGQgYmlnZ2VyIHRyZWUgZm9yIGFjdGl2YXRpb24gKi8KKwlkbS0+YWN0aXZhdGlvbiA9ICgoYWN0aW9uID09IFBSRUxPQUQpIHx8IChhY3Rpb24gPT0gQUNUSVZBVEUpKTsKKwlkbS0+c3VzcGVuZCA9IChhY3Rpb24gPT0gU1VTUEVORF9XSVRIX0xPQ0tGUykgfHwgKGFjdGlvbiA9PSBTVVNQRU5EKTsKKworCWlmICghKGR0cmVlID0gX2NyZWF0ZV9wYXJ0aWFsX2R0cmVlKGRtLCBsdiwgbGFvcHRzLT5vcmlnaW5fb25seSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJvb3QgPSBkbV90cmVlX2ZpbmRfbm9kZShkdHJlZSwgMCwgMCkpKSB7CisJCWxvZ19lcnJvcigiTG9zdCBkZXBlbmRlbmN5IHRyZWUgcm9vdCBub2RlIik7CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCisJLyogUmVzdG9yZSBmcyBjb29raWUgKi8KKwlkbV90cmVlX3NldF9jb29raWUocm9vdCwgZnNfZ2V0X2Nvb2tpZSgpKTsKKworCWlmICghKGRsaWQgPSBidWlsZF9kbV91dWlkKGRtLT5tZW0sIGx2LCBsYW9wdHMtPm9yaWdpbl9vbmx5ID8gbHZfbGF5ZXIobHYpIDogTlVMTCkpKQorCQlnb3RvX291dDsKKworCS8qIE9ubHkgcHJvY2VzcyBub2RlcyB3aXRoIHV1aWQgb2YgIkxWTS0iIHBsdXMgVkcgaWQuICovCisJc3dpdGNoKGFjdGlvbikgeworCWNhc2UgQ0xFQU46CisJCWlmIChyZXRyeV9kZWFjdGl2YXRpb24oKSkKKwkJCWRtX3RyZWVfcmV0cnlfcmVtb3ZlKHJvb3QpOworCQkvKiBEZWFjdGl2YXRlIGFueSB1bnVzZWQgbm9uLXRvcGxldmVsIG5vZGVzICovCisJCWlmICghX2NsZWFuX3RyZWUoZG0sIHJvb3QsIGxhb3B0cy0+b3JpZ2luX29ubHkgPyBkbGlkIDogTlVMTCkpCisJCQlnb3RvX291dDsKKwkJYnJlYWs7CisJY2FzZSBERUFDVElWQVRFOgorCQlpZiAocmV0cnlfZGVhY3RpdmF0aW9uKCkpCisJCQlkbV90cmVlX3JldHJ5X3JlbW92ZShyb290KTsKKwkJLyogRGVhY3RpdmF0ZSBMViBhbmQgYWxsIGRldmljZXMgaXQgcmVmZXJlbmNlcyB0aGF0IG5vdGhpbmcgZWxzZSBoYXMgb3Blbi4gKi8KKwkJaWYgKCFkbV90cmVlX2RlYWN0aXZhdGVfY2hpbGRyZW4ocm9vdCwgZGxpZCwgRExJRF9TSVpFKSkKKwkJCWdvdG9fb3V0OworCQlpZiAoIV9yZW1vdmVfbHZfc3ltbGlua3MoZG0sIHJvb3QpKQorCQkJbG9nX3dhcm4oIkZhaWxlZCB0byByZW1vdmUgYWxsIGRldmljZSBzeW1saW5rcyBhc3NvY2lhdGVkIHdpdGggJXMuIiwKKwkJCQkgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJYnJlYWs7CisJY2FzZSBTVVNQRU5EOgorCQlkbV90cmVlX3NraXBfbG9ja2ZzKHJvb3QpOworCQlpZiAoIWRtLT5mbHVzaF9yZXF1aXJlZCkKKwkJCWRtX3RyZWVfdXNlX25vX2ZsdXNoX3N1c3BlbmQocm9vdCk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgU1VTUEVORF9XSVRIX0xPQ0tGUzoKKwkJaWYgKCFkbV90cmVlX3N1c3BlbmRfY2hpbGRyZW4ocm9vdCwgZGxpZCwgRExJRF9TSVpFKSkKKwkJCWdvdG9fb3V0OworCQlicmVhazsKKwljYXNlIFBSRUxPQUQ6CisJY2FzZSBBQ1RJVkFURToKKwkJLyogQWRkIGFsbCByZXF1aXJlZCBuZXcgZGV2aWNlcyB0byB0cmVlICovCisJCWlmICghX2FkZF9uZXdfbHZfdG9fZHRyZWUoZG0sIGR0cmVlLCBsdiwgbGFvcHRzLAorCQkJCQkgIChsdl9pc19vcmlnaW4obHYpICYmIGxhb3B0cy0+b3JpZ2luX29ubHkpID8gInJlYWwiIDoKKwkJCQkJICAobHZfaXNfdGhpbl9wb29sKGx2KSAmJiBsYW9wdHMtPm9yaWdpbl9vbmx5KSA/ICJ0cG9vbCIgOiBOVUxMKSkKKwkJCWdvdG9fb3V0OworCisJCS8qIFByZWxvYWQgYW55IGRldmljZXMgcmVxdWlyZWQgYmVmb3JlIGFueSBzdXNwZW5zaW9ucyAqLworCQlpZiAoIWRtX3RyZWVfcHJlbG9hZF9jaGlsZHJlbihyb290LCBkbGlkLCBETElEX1NJWkUpKQorCQkJZ290b19vdXQ7CisKKwkJLy9pZiAoYWN0aW9uID09IFBSRUxPQUQpIHsgbG9nX2RlYnVnKCJTTEVFUCIpOyBzbGVlcCg3KTsgfQorCisJCWlmICgoZG1fdHJlZV9ub2RlX3NpemVfY2hhbmdlZChyb290KSA8IDApKQorCQkJZG0tPmZsdXNoX3JlcXVpcmVkID0gMTsKKwkJLyogQ3VycmVudGx5IGtlZXAgdGhlIGNvZGUgcmVxdWlyZSBmbHVzaCBmb3IgYW55CisJCSAqIG5vbiAndGhpbiBwb29sL3ZvbHVtZScgYW5kICBzaXplIGluY3JlYXNlICovCisJCWVsc2UgaWYgKCFsdl9pc190aGluX3ZvbHVtZShsdikgJiYKKwkJCSAhbHZfaXNfdGhpbl9wb29sKGx2KSAmJgorCQkJIGRtX3RyZWVfbm9kZV9zaXplX2NoYW5nZWQocm9vdCkpCisJCQlkbS0+Zmx1c2hfcmVxdWlyZWQgPSAxOworCisJCWlmIChhY3Rpb24gPT0gQUNUSVZBVEUpIHsKKwkJCWlmICghZG1fdHJlZV9hY3RpdmF0ZV9jaGlsZHJlbihyb290LCBkbGlkLCBETElEX1NJWkUpKQorCQkJCWdvdG9fb3V0OworCQkJaWYgKCFfY3JlYXRlX2x2X3N5bWxpbmtzKGRtLCByb290KSkKKwkJCQlsb2dfd2FybigiRmFpbGVkIHRvIGNyZWF0ZSBzeW1saW5rcyBmb3IgJXMuIiwKKwkJCQkJIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl90cmVlX2FjdGlvbjogQWN0aW9uICV1IG5vdCBzdXBwb3J0ZWQuIiwgYWN0aW9uKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CisKK291dDoKKwkvKiBTYXZlIGZzIGNvb2tpZSBmb3IgdWRldiBzZXR0bGUsIGRvIG5vdCB3YWl0IGhlcmUgKi8KKwlmc19zZXRfY29va2llKGRtX3RyZWVfZ2V0X2Nvb2tpZShyb290KSk7CitvdXRfbm9fcm9vdDoKKwlkbV90cmVlX2ZyZWUoZHRyZWUpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIG9yaWdpbl9vbmx5IG1heSBvbmx5IGJlIHNldCBpZiB3ZSBhcmUgcmVzdW1pbmcgKG5vdCBhY3RpdmF0aW5nKSBhbiBvcmlnaW4gTFYgKi8KK2ludCBkZXZfbWFuYWdlcl9hY3RpdmF0ZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJIHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpCit7CisJaWYgKCFfdHJlZV9hY3Rpb24oZG0sIGx2LCBsYW9wdHMsIEFDVElWQVRFKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV90cmVlX2FjdGlvbihkbSwgbHYsIGxhb3B0cywgQ0xFQU4pKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKiBvcmlnaW5fb25seSBtYXkgb25seSBiZSBzZXQgaWYgd2UgYXJlIHJlc3VtaW5nIChub3QgYWN0aXZhdGluZykgYW4gb3JpZ2luIExWICovCitpbnQgZGV2X21hbmFnZXJfcHJlbG9hZChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50ICpmbHVzaF9yZXF1aXJlZCkKK3sKKwlkbS0+Zmx1c2hfcmVxdWlyZWQgPSAqZmx1c2hfcmVxdWlyZWQ7CisKKwlpZiAoIV90cmVlX2FjdGlvbihkbSwgbHYsIGxhb3B0cywgUFJFTE9BRCkpCisJCXJldHVybl8wOworCisJKmZsdXNoX3JlcXVpcmVkID0gZG0tPmZsdXNoX3JlcXVpcmVkOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkZXZfbWFuYWdlcl9kZWFjdGl2YXRlKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgbGFvcHRzID0geyAwIH07CisKKwlpZiAoIV90cmVlX2FjdGlvbihkbSwgbHYsICZsYW9wdHMsIERFQUNUSVZBVEUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZGV2X21hbmFnZXJfc3VzcGVuZChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IGxvY2tmcywgaW50IGZsdXNoX3JlcXVpcmVkKQoreworCWRtLT5mbHVzaF9yZXF1aXJlZCA9IGZsdXNoX3JlcXVpcmVkOworCisJaWYgKCFfdHJlZV9hY3Rpb24oZG0sIGx2LCBsYW9wdHMsIGxvY2tmcyA/IFNVU1BFTkRfV0lUSF9MT0NLRlMgOiBTVVNQRU5EKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERvZXMgZGV2aWNlIHVzZSBWRyBzb21ld2hlcmUgaW4gaXRzIGNvbnN0cnVjdGlvbj8KKyAqIFJldHVybnMgMSBpZiB1bmNlcnRhaW4uCisgKi8KK2ludCBkZXZfbWFuYWdlcl9kZXZpY2VfdXNlc192ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGRtX3RyZWUgKmR0cmVlOworCXN0cnVjdCBkbV90cmVlX25vZGUgKnJvb3Q7CisJY2hhciBkbGlkW3NpemVvZihVVUlEX1BSRUZJWCkgKyBzaXplb2Yoc3RydWN0IGlkKSAtIDFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlpbnQgciA9IDE7CisKKwlpZiAoIShkdHJlZSA9IGRtX3RyZWVfY3JlYXRlKCkpKSB7CisJCWxvZ19lcnJvcigicGFydGlhbCBkdHJlZSBjcmVhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIHI7CisJfQorCisJZG1fdHJlZV9zZXRfb3B0aW9uYWxfdXVpZF9zdWZmaXhlcyhkdHJlZSwgJnV1aWRfc3VmZml4X2xpc3RbMF0pOworCisJaWYgKCFkbV90cmVlX2FkZF9kZXYoZHRyZWUsICh1aW50MzJfdCkgTUFKT1IoZGV2LT5kZXYpLCAodWludDMyX3QpIE1JTk9SKGRldi0+ZGV2KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIGRldmljZSAlcyAoJSIgUFJJdTMyICI6JSIgUFJJdTMyIikgdG8gZHRyZWUiLAorCQkJICBkZXZfbmFtZShkZXYpLCAodWludDMyX3QpIE1BSk9SKGRldi0+ZGV2KSwgKHVpbnQzMl90KSBNSU5PUihkZXYtPmRldikpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoZGxpZCwgVVVJRF9QUkVGSVgsIHNpemVvZihVVUlEX1BSRUZJWCkgLSAxKTsKKwltZW1jcHkoZGxpZCArIHNpemVvZihVVUlEX1BSRUZJWCkgLSAxLCAmdmctPmlkLnV1aWRbMF0sIHNpemVvZih2Zy0+aWQpKTsKKworCWlmICghKHJvb3QgPSBkbV90cmVlX2ZpbmRfbm9kZShkdHJlZSwgMCwgMCkpKSB7CisJCWxvZ19lcnJvcigiTG9zdCBkZXBlbmRlbmN5IHRyZWUgcm9vdCBub2RlIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkbV90cmVlX2NoaWxkcmVuX3VzZV91dWlkKHJvb3QsIGRsaWQsIHNpemVvZihVVUlEX1BSRUZJWCkgKyBzaXplb2YodmctPmlkKSAtIDEpKQorCQlnb3RvX291dDsKKworCXIgPSAwOworCitvdXQ6CisJZG1fdHJlZV9mcmVlKGR0cmVlKTsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2xpYi9hY3RpdmF0ZS9kZXZfbWFuYWdlci5oIGIvbGliL2FjdGl2YXRlL2Rldl9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExOThmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hY3RpdmF0ZS9kZXZfbWFuYWdlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fREVWX01BTkFHRVJfSAorI2RlZmluZSBfTFZNX0RFVl9NQU5BR0VSX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZTsKK3N0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzOworc3RydWN0IHZvbHVtZV9ncm91cDsKK3N0cnVjdCBjbWRfY29udGV4dDsKK3N0cnVjdCBkZXZfbWFuYWdlcjsKK3N0cnVjdCBkbV9pbmZvOworc3RydWN0IGRldmljZTsKK3N0cnVjdCBsdl9zZWdfc3RhdHVzOworCitpbnQgcmVhZF9vbmx5X2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpOworCisvKgorICogQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IuCisgKi8KK3N0cnVjdCBkZXZfbWFuYWdlciAqZGV2X21hbmFnZXJfY3JlYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgICBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJCSAgICAgICB1bnNpZ25lZCB0cmFja19wdm1vdmVfZGVwcyk7Cit2b2lkIGRldl9tYW5hZ2VyX2Rlc3Ryb3koc3RydWN0IGRldl9tYW5hZ2VyICpkbSk7Cit2b2lkIGRldl9tYW5hZ2VyX3JlbGVhc2Uodm9pZCk7Cit2b2lkIGRldl9tYW5hZ2VyX2V4aXQodm9pZCk7CisKKy8qCisgKiBUaGUgZGV2aWNlIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFsbCB0aGUgbGF5ZXJlZAorICogZG0gZGV2aWNlcywgYW5kIGVuc3VyaW5nIHRoYXQgYWxsIGNvbnN0cmFpbnRzIGFyZSBtYWludGFpbmVkCisgKiAoZWcsIGFuIG9yaWdpbiBpcyBjcmVhdGVkIGJlZm9yZSBpdHMgc25hcHNob3QsIGJ1dCBpcyBub3QKKyAqIHVuc3VzcGVuZGVkIHVudGlsIHRoZSBzbmFwc2hvdCBpcyBhbHNvIGNyZWF0ZWQuKQorICovCitpbnQgZGV2X21hbmFnZXJfaW5mbyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICBjb25zdCBjaGFyICpsYXllciwKKwkJICAgICBpbnQgd2l0aF9vcGVuX2NvdW50LCBpbnQgd2l0aF9yZWFkX2FoZWFkLAorCQkgICAgIHN0cnVjdCBkbV9pbmZvICpkbWluZm8sIHVpbnQzMl90ICpyZWFkX2FoZWFkLAorCQkgICAgIHN0cnVjdCBsdl9zZWdfc3RhdHVzICpzZWdfc3RhdHVzKTsKKworaW50IGRldl9tYW5hZ2VyX3NuYXBzaG90X3BlcmNlbnQoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgZG1fcGVyY2VudF90ICpwZXJjZW50KTsKK2ludCBkZXZfbWFuYWdlcl9taXJyb3JfcGVyY2VudChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCB3YWl0LAorCQkJICAgICAgIGRtX3BlcmNlbnRfdCAqcGVyY2VudCwgdWludDMyX3QgKmV2ZW50X25yKTsKK2ludCBkZXZfbWFuYWdlcl9yYWlkX3N0YXR1cyhzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgc3RydWN0IGRtX3N0YXR1c19yYWlkICoqc3RhdHVzKTsKK2ludCBkZXZfbWFuYWdlcl9yYWlkX21lc3NhZ2Uoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgY29uc3QgY2hhciAqbXNnKTsKK2ludCBkZXZfbWFuYWdlcl9jYWNoZV9zdGF0dXMoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgc3RydWN0IGx2X3N0YXR1c19jYWNoZSAqKnN0YXR1cyk7CitpbnQgZGV2X21hbmFnZXJfdGhpbl9wb29sX3N0YXR1cyhzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgZG1fc3RhdHVzX3RoaW5fcG9vbCAqKnN0YXR1cywKKwkJCQkgaW50IGZsdXNoKTsKK2ludCBkZXZfbWFuYWdlcl90aGluX3Bvb2xfcGVyY2VudChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIGludCBtZXRhZGF0YSwgZG1fcGVyY2VudF90ICpwZXJjZW50KTsKK2ludCBkZXZfbWFuYWdlcl90aGluX3BlcmNlbnQoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgaW50IG1hcHBlZCwgZG1fcGVyY2VudF90ICpwZXJjZW50KTsKK2ludCBkZXZfbWFuYWdlcl90aGluX2RldmljZV9pZChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgdWludDMyX3QgKmRldmljZV9pZCk7CitpbnQgZGV2X21hbmFnZXJfc3VzcGVuZChzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywgaW50IGxvY2tmcywgaW50IGZsdXNoX3JlcXVpcmVkKTsKK2ludCBkZXZfbWFuYWdlcl9hY3RpdmF0ZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJIHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpOworaW50IGRldl9tYW5hZ2VyX3ByZWxvYWQoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCXN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsIGludCAqZmx1c2hfcmVxdWlyZWQpOworaW50IGRldl9tYW5hZ2VyX2RlYWN0aXZhdGUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgZGV2X21hbmFnZXJfdHJhbnNpZW50KHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpIF9fYXR0cmlidXRlX18oKG5vbm51bGwoMSwgMikpKTsKKworaW50IGRldl9tYW5hZ2VyX21rbm9kZXMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisKKy8qCisgKiBQdXQgdGhlIGRlc2lyZWQgY2hhbmdlcyBpbnRvIGVmZmVjdC4KKyAqLworaW50IGRldl9tYW5hZ2VyX2V4ZWN1dGUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSk7CisKK2ludCBkZXZfbWFuYWdlcl9kZXZpY2VfdXNlc192ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9hY3RpdmF0ZS9mcy5jIGIvbGliL2FjdGl2YXRlL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0NTViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hY3RpdmF0ZS9mcy5jCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImZzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJsdm0tZmlsZS5oIgorI2luY2x1ZGUgIm1lbWxvY2suaCIKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworLyoKKyAqIExpYnJhcnkgY29va2llIHRvIGNvbWJpbmUgbXVsdGlwbGUgZnMgdHJhbnNhY3Rpb25zLgorICogU3VwcG9ydHMgdG8gd2FpdCBmb3IgdWRldiBkZXZpY2Ugc2V0dGxlIG9ubHkgd2hlbiBuZWVkZWQuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfZnNfY29va2llID0gRE1fQ09PS0lFX0FVVE9fQ1JFQVRFOworc3RhdGljIGludCBfZnNfY3JlYXRlID0gMDsKKworc3RhdGljIGludCBfbWtfZGlyKGNvbnN0IGNoYXIgKmRldl9kaXIsIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RhdGljIGNoYXIgdmdfcGF0aFtQQVRIX01BWF07CisJbW9kZV90IG9sZF91bWFzazsKKworCWlmIChkbV9zbnByaW50Zih2Z19wYXRoLCBzaXplb2YodmdfcGF0aCksICIlcyVzIiwKKwkJCSBkZXZfZGlyLCB2Z19uYW1lKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNvbnN0cnVjdCBuYW1lIG9mIHZvbHVtZSAiCisJCQkgICJncm91cCBkaXJlY3RvcnkuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkaXJfZXhpc3RzKHZnX3BhdGgpKQorCQlyZXR1cm4gMTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkNyZWF0aW5nIGRpcmVjdG9yeSAlcyIsIHZnX3BhdGgpOworCisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KHZnX3BhdGgsIFNfSUZESVIpOworCW9sZF91bWFzayA9IHVtYXNrKERNX0RFVl9ESVJfVU1BU0spOworCWlmIChta2Rpcih2Z19wYXRoLCAwNzc3KSkgeworCQlsb2dfc3lzX2Vycm9yKCJta2RpciIsIHZnX3BhdGgpOworCQl1bWFzayhvbGRfdW1hc2spOworCQkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJCXJldHVybiAwOworCX0KKwl1bWFzayhvbGRfdW1hc2spOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9ybV9kaXIoY29uc3QgY2hhciAqZGV2X2RpciwgY29uc3QgY2hhciAqdmdfbmFtZSkKK3sKKwlzdGF0aWMgY2hhciB2Z19wYXRoW1BBVEhfTUFYXTsKKworCWlmIChkbV9zbnByaW50Zih2Z19wYXRoLCBzaXplb2YodmdfcGF0aCksICIlcyVzIiwKKwkJCSBkZXZfZGlyLCB2Z19uYW1lKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNvbnN0cnVjdCBuYW1lIG9mIHZvbHVtZSAiCisJCQkgICJncm91cCBkaXJlY3RvcnkuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkaXJfZXhpc3RzKHZnX3BhdGgpICYmIGlzX2VtcHR5X2Rpcih2Z19wYXRoKSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJSZW1vdmluZyBkaXJlY3RvcnkgJXMiLCB2Z19wYXRoKTsKKwkJcm1kaXIodmdfcGF0aCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9ybV9ibGtzKGNvbnN0IGNoYXIgKmRpcikKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJRElSICpkOworCisJaWYgKCEoZCA9IG9wZW5kaXIoZGlyKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbmRpciIsIGRpcik7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZCkpKSB7CisJCW5hbWUgPSBkaXJlbnQtPmRfbmFtZTsKKworCQlpZiAoIXN0cmNtcChuYW1lLCAiLiIpIHx8ICFzdHJjbXAobmFtZSwgIi4uIikpCisJCQljb250aW51ZTsKKworCQlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvJXMiLCBkaXIsIG5hbWUpID09IC0xKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwYXRoIGZvciAlcyIsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWxzdGF0KHBhdGgsICZidWYpKSB7CisJCQlpZiAoIVNfSVNCTEsoYnVmLnN0X21vZGUpKQorCQkJCWNvbnRpbnVlOworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiUmVtb3ZpbmcgJXMiLCBwYXRoKTsKKwkJCWlmICh1bmxpbmsocGF0aCkgPCAwKQorCQkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIHBhdGgpOworCQl9CisJfQorCisJaWYgKGNsb3NlZGlyKGQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZWRpciIsIGRpcik7Cit9CisKK3N0YXRpYyBpbnQgX21rX2xpbmsoY29uc3QgY2hhciAqZGV2X2RpciwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgIGNvbnN0IGNoYXIgKmx2X25hbWUsIGNvbnN0IGNoYXIgKmRldiwgaW50IGNoZWNrX3VkZXYpCit7CisJc3RhdGljIGNoYXIgbHZfcGF0aFtQQVRIX01BWF0sIGxpbmtfcGF0aFtQQVRIX01BWF0sIGx2bTFfZ3JvdXBfcGF0aFtQQVRIX01BWF07CisJc3RhdGljIGNoYXIgdmdfcGF0aFtQQVRIX01BWF07CisJc3RydWN0IHN0YXQgYnVmLCBidWZfbHA7CisKKwlpZiAoZG1fc25wcmludGYodmdfcGF0aCwgc2l6ZW9mKHZnX3BhdGgpLCAiJXMlcyIsCisJCQkgZGV2X2RpciwgdmdfbmFtZSkgPT0gLTEpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgcGF0aCBmb3Igdm9sdW1lIGdyb3VwIGRpciAlcyIsCisJCQkgIHZnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYobHZfcGF0aCwgc2l6ZW9mKGx2X3BhdGgpLCAiJXMvJXMiLCB2Z19wYXRoLAorCQkJIGx2X25hbWUpID09IC0xKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNvdXJjZSBwYXRobmFtZSBmb3IgIgorCQkJICAibG9naWNhbCB2b2x1bWUgbGluayAlcyIsIGx2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYobGlua19wYXRoLCBzaXplb2YobGlua19wYXRoKSwgIiVzLyVzIiwKKwkJCSBkbV9kaXIoKSwgZGV2KSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBkZXN0aW5hdGlvbiBwYXRobmFtZSBmb3IgIgorCQkJICAibG9naWNhbCB2b2x1bWUgbGluayBmb3IgJXMiLCBsdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRtX3NucHJpbnRmKGx2bTFfZ3JvdXBfcGF0aCwgc2l6ZW9mKGx2bTFfZ3JvdXBfcGF0aCksICIlcy9ncm91cCIsCisJCQkgdmdfcGF0aCkgPT0gLTEpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgcGF0aG5hbWUgZm9yIExWTTEgZ3JvdXAgZmlsZSBmb3IgJXMiLAorCQkJICB2Z19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVG8gcmVhY2ggdGhpcyBwb2ludCwgdGhlIFZHIG11c3QgaGF2ZSBiZWVuIGxvY2tlZC4KKwkgKiBBcyBsb2NraW5nIGZhaWxzIGlmIHRoZSBWRyBpcyBhY3RpdmUgdW5kZXIgTFZNMSwgaXQncworCSAqIG5vdyBzYWZlIHRvIHJlbW92ZSBhbnkgTFZNMSBkZXZpY2VzIHdlIGZpbmQgaGVyZQorCSAqIChhcyB3ZWxsIGFzIGFueSBleGlzdGluZyBMVk0yIHN5bWxpbmspLiAqLworCWlmICghbHN0YXQobHZtMV9ncm91cF9wYXRoLCAmYnVmKSkgeworCQlpZiAoIVNfSVNDSFIoYnVmLnN0X21vZGUpKSB7CisJCQlsb2dfZXJyb3IoIk5vbi1MVk0xIGNoYXJhY3RlciBkZXZpY2UgZm91bmQgYXQgJXMiLAorCQkJCSAgbHZtMV9ncm91cF9wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCV9ybV9ibGtzKHZnX3BhdGgpOworCisJCQlsb2dfdmVyeV92ZXJib3NlKCJSZW1vdmluZyAlcyIsIGx2bTFfZ3JvdXBfcGF0aCk7CisJCQlpZiAodW5saW5rKGx2bTFfZ3JvdXBfcGF0aCkgPCAwKQorCQkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIGx2bTFfZ3JvdXBfcGF0aCk7CisJCX0KKwl9CisKKwlpZiAoIWxzdGF0KGx2X3BhdGgsICZidWYpKSB7CisJCWlmICghU19JU0xOSyhidWYuc3RfbW9kZSkgJiYgIVNfSVNCTEsoYnVmLnN0X21vZGUpKSB7CisJCQlsb2dfZXJyb3IoIlN5bWJvbGljIGxpbmsgJXMgbm90IGNyZWF0ZWQ6IGZpbGUgZXhpc3RzIiwKKwkJCQkgIGxpbmtfcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChkbV91ZGV2X2dldF9zeW5jX3N1cHBvcnQoKSAmJiB1ZGV2X2NoZWNraW5nKCkgJiYgY2hlY2tfdWRldikgeworCQkJLyogQ2hlY2sgdWRldiBjcmVhdGVkIHRoZSBjb3JyZWN0IGxpbmsuICovCisJCQlpZiAoIXN0YXQobGlua19wYXRoLCAmYnVmX2xwKSAmJgorCQkJICAgICFzdGF0KGx2X3BhdGgsICZidWYpKSB7CisJCQkJaWYgKGJ1Zl9scC5zdF9yZGV2ID09IGJ1Zi5zdF9yZGV2KQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlCisJCQkJCWxvZ193YXJuKCJTeW1saW5rICVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiAiCisJCQkJCQkgImNyZWF0ZWQgYnkgdWRldiBkb2VzIG5vdCBoYXZlICIKKwkJCQkJCSAiY29ycmVjdCB0YXJnZXQuIEZhbGxpbmcgYmFjayB0byAiCisJCQkJCQkgImRpcmVjdCBsaW5rIGNyZWF0aW9uIiwgbHZfcGF0aCk7CisJCQl9IGVsc2UKKwkJCQlsb2dfd2FybigiU3ltbGluayAlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gIgorCQkJCQkgImNyZWF0ZWQgYnkgdWRldiBjb3VsZCBub3QgYmUgY2hlY2tlZCAiCisJCQkJCSAiZm9yIGl0cyBjb3JyZWN0bmVzcy4gRmFsbGluZyBiYWNrIHRvICIKKwkJCQkJICJkaXJlY3QgbGluayBjcmVhdGlvbi4iLCBsdl9wYXRoKTsKKworCQl9CisKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiUmVtb3ZpbmcgJXMiLCBsdl9wYXRoKTsKKwkJaWYgKHVubGluayhsdl9wYXRoKSA8IDApIHsKKwkJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIGx2X3BhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpICYmIHVkZXZfY2hlY2tpbmcoKSAmJiBjaGVja191ZGV2KQorCQlsb2dfd2FybigiVGhlIGxpbmsgJXMgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHVkZXYgIgorCQkJICAiYnV0IGl0IHdhcyBub3QgZm91bmQuIEZhbGxpbmcgYmFjayB0byAiCisJCQkgICJkaXJlY3QgbGluayBjcmVhdGlvbi4iLCBsdl9wYXRoKTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkxpbmtpbmcgJXMgLT4gJXMiLCBsdl9wYXRoLCBsaW5rX3BhdGgpOworCisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KGx2X3BhdGgsIFNfSUZMTkspOworCWlmIChzeW1saW5rKGxpbmtfcGF0aCwgbHZfcGF0aCkgPCAwKSB7CisJCWxvZ19zeXNfZXJyb3IoInN5bWxpbmsiLCBsdl9wYXRoKTsKKwkJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCQlyZXR1cm4gMDsKKwl9CisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JtX2xpbmsoY29uc3QgY2hhciAqZGV2X2RpciwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgIGNvbnN0IGNoYXIgKmx2X25hbWUsIGludCBjaGVja191ZGV2KQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlzdGF0aWMgY2hhciBsdl9wYXRoW1BBVEhfTUFYXTsKKworCWlmIChkbV9zbnByaW50Zihsdl9wYXRoLCBzaXplb2YobHZfcGF0aCksICIlcyVzLyVzIiwKKwkJCSBkZXZfZGlyLCB2Z19uYW1lLCBsdl9uYW1lKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGRldGVybWluZSBsaW5rIHBhdGhuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHN0YXQobHZfcGF0aCwgJmJ1ZikpIHsKKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiAxOworCQlsb2dfc3lzX2Vycm9yKCJsc3RhdCIsIGx2X3BhdGgpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpICYmIHVkZXZfY2hlY2tpbmcoKSAmJiBjaGVja191ZGV2KQorCQlsb2dfd2FybigiVGhlIGxpbmsgJXMgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIGJ5IHVkZXYgIgorCQkJICJidXQgaXQgaXMgc3RpbGwgcHJlc2VudC4gRmFsbGluZyBiYWNrIHRvICIKKwkJCSAiZGlyZWN0IGxpbmsgcmVtb3ZhbC4iLCBsdl9wYXRoKTsKKworCWlmICghU19JU0xOSyhidWYuc3RfbW9kZSkpIHsKKwkJbG9nX2Vycm9yKCIlcyBub3Qgc3ltYm9saWMgbGluayAtIG5vdCByZW1vdmluZyIsIGx2X3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCJSZW1vdmluZyBsaW5rICVzIiwgbHZfcGF0aCk7CisJaWYgKHVubGluayhsdl9wYXRoKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigidW5saW5rIiwgbHZfcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCit0eXBlZGVmIGVudW0geworCUZTX0FERCwKKwlGU19ERUwsCisJRlNfUkVOQU1FLAorCU5VTV9GU19PUFMKK30gZnNfb3BfdDsKKworc3RhdGljIGludCBfZG9fZnNfb3AoZnNfb3BfdCB0eXBlLCBjb25zdCBjaGFyICpkZXZfZGlyLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICAgIGNvbnN0IGNoYXIgKmx2X25hbWUsIGNvbnN0IGNoYXIgKmRldiwKKwkJICAgICBjb25zdCBjaGFyICpvbGRfbHZfbmFtZSwgaW50IGNoZWNrX3VkZXYpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBGU19BREQ6CisJCWlmICghX21rX2RpcihkZXZfZGlyLCB2Z19uYW1lKSB8fAorCQkgICAgIV9ta19saW5rKGRldl9kaXIsIHZnX25hbWUsIGx2X25hbWUsIGRldiwgY2hlY2tfdWRldikpCisJCQlyZXR1cm5fMDsKKwkJYnJlYWs7CisJY2FzZSBGU19ERUw6CisJCWlmICghX3JtX2xpbmsoZGV2X2RpciwgdmdfbmFtZSwgbHZfbmFtZSwgY2hlY2tfdWRldikgfHwKKwkJICAgICFfcm1fZGlyKGRldl9kaXIsIHZnX25hbWUpKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCQkvKiBGSVhNRSBVc2UgcmVuYW1lKCkgKi8KKwljYXNlIEZTX1JFTkFNRToKKwkJaWYgKG9sZF9sdl9uYW1lICYmICFfcm1fbGluayhkZXZfZGlyLCB2Z19uYW1lLCBvbGRfbHZfbmFtZSwKKwkJCQkJICAgICBjaGVja191ZGV2KSkKKwkJCXN0YWNrOworCisJCWlmICghX21rX2xpbmsoZGV2X2RpciwgdmdfbmFtZSwgbHZfbmFtZSwgZGV2LCBjaGVja191ZGV2KSkKKwkJCXN0YWNrOworCWRlZmF1bHQ6CisJCTsgLyogTk9UUkVBQ0hFRCAqLworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgRE1fTElTVF9JTklUKF9mc19vcHMpOworLyoKKyAqIENvdW50IG51bWJlciBvZiBzdGFja2VkIGZzX29wX3Qgb3BlcmF0aW9ucyB0byBhbGxvdyB0byBza2lwIGRtX2xpc3Qgc2VhcmNoLgorICogRklYTUU6IGhhbmRsaW5nIG9mIEZTX1JFTkFNRQorICovCitzdGF0aWMgaW50IF9jb3VudF9mc19vcHNbTlVNX0ZTX09QU107CisKK3N0cnVjdCBmc19vcF9wYXJtcyB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlmc19vcF90IHR5cGU7CisJaW50IGNoZWNrX3VkZXY7CisJY2hhciAqZGV2X2RpcjsKKwljaGFyICp2Z19uYW1lOworCWNoYXIgKmx2X25hbWU7CisJY2hhciAqZGV2OworCWNoYXIgKm9sZF9sdl9uYW1lOworCWNoYXIgbmFtZXNbMF07Cit9OworCitzdGF0aWMgdm9pZCBfc3RvcmVfc3RyKGNoYXIgKipwb3MsIGNoYXIgKipwdHIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJjcHkoKnBvcywgc3RyKTsKKwkqcHRyID0gKnBvczsKKwkqcG9zICs9IHN0cmxlbigqcHRyKSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9kZWxfZnNfb3Aoc3RydWN0IGZzX29wX3Bhcm1zICpmc3ApCit7CisJX2NvdW50X2ZzX29wc1tmc3AtPnR5cGVdLS07CisJZG1fbGlzdF9kZWwoJmZzcC0+bGlzdCk7CisJZG1fZnJlZShmc3ApOworfQorCisvKiBDaGVjayBpZiB0aGVyZSBpcyBvdGhlciB0aGUgdHlwZSBvZiBmcyBvcGVyYXRpb24gc3RhY2tlZCAqLworc3RhdGljIGludCBfb3RoZXJfZnNfb3BzKGZzX29wX3QgdHlwZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GU19PUFM7IGkrKykKKwkJaWYgKHR5cGUgIT0gaSAmJiBfY291bnRfZnNfb3BzW2ldKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGlmIHVkZXYgaXMgc3VwcG9zZWQgdG8gY3JlYXRlIG5vZGVzICovCitzdGF0aWMgaW50IF9jaGVja191ZGV2KGludCBjaGVja191ZGV2KQoreworICAgIHJldHVybiBjaGVja191ZGV2ICYmIGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpICYmIGRtX3VkZXZfZ2V0X2NoZWNraW5nKCk7Cit9CisKKy8qIEZJWE1FOiBkdXBsaWNhdGlvbiBvZiB0aGUgIGNvZGUgZnJvbSBsaWJkbS1jb21tb24uYyAqLworc3RhdGljIGludCBfc3RhY2tfZnNfb3AoZnNfb3BfdCB0eXBlLCBjb25zdCBjaGFyICpkZXZfZGlyLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJY29uc3QgY2hhciAqbHZfbmFtZSwgY29uc3QgY2hhciAqZGV2LAorCQkJY29uc3QgY2hhciAqb2xkX2x2X25hbWUsIGludCBjaGVja191ZGV2KQoreworCXN0cnVjdCBkbV9saXN0ICpmc3BoLCAqZnNwaHQ7CisJc3RydWN0IGZzX29wX3Bhcm1zICpmc3A7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihkZXZfZGlyKSArIHN0cmxlbih2Z19uYW1lKSArIHN0cmxlbihsdl9uYW1lKSArCisJICAgIHN0cmxlbihkZXYpICsgc3RybGVuKG9sZF9sdl9uYW1lKSArIDU7CisJY2hhciAqcG9zOworCisJaWYgKCh0eXBlID09IEZTX0RFTCkgJiYgX290aGVyX2ZzX29wcyh0eXBlKSkKKwkJLyoKKwkJICogSWdub3JlIGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zIG9uIHRoZSBmc19vcCBpZiBkZWxldGluZyBpdC4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGZzcGgsIGZzcGh0LCAmX2ZzX29wcykgeworCQkJZnNwID0gZG1fbGlzdF9pdGVtKGZzcGgsIHN0cnVjdCBmc19vcF9wYXJtcyk7CisJCQlpZiAoIXN0cmNtcChsdl9uYW1lLCBmc3AtPmx2X25hbWUpICYmCisJCQkgICAgIXN0cmNtcCh2Z19uYW1lLCBmc3AtPnZnX25hbWUpKSB7CisJCQkJX2RlbF9mc19vcChmc3ApOworCQkJCWlmICghX290aGVyX2ZzX29wcyh0eXBlKSkKKwkJCQkJYnJlYWs7IC8qIG5vIG90aGVyIG5vbiBERUwgb3BzICovCisJCQl9CisJCX0KKwllbHNlIGlmICgodHlwZSA9PSBGU19BREQpICYmIF9jb3VudF9mc19vcHNbRlNfREVMXSAmJiBfY2hlY2tfdWRldihjaGVja191ZGV2KSkKKwkJLyoKKwkJICogSWYgdWRldiBpcyBydW5uaW5nIGlnbm9yZSBwcmV2aW91cyBERUwgb3BlcmF0aW9uIG9uIGFkZGVkIGZzX29wLgorCQkgKiAoTm8gb3RoZXIgb3BlcmF0aW9ucyBmb3IgdGhpcyBkZXZpY2UgdGhlbiBERUwgY291bGQgYmUgc3RhY2tlZCBoZXJlKS4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGZzcGgsIGZzcGh0LCAmX2ZzX29wcykgeworCQkJZnNwID0gZG1fbGlzdF9pdGVtKGZzcGgsIHN0cnVjdCBmc19vcF9wYXJtcyk7CisJCQlpZiAoKGZzcC0+dHlwZSA9PSBGU19ERUwpICYmCisJCQkgICAgIXN0cmNtcChsdl9uYW1lLCBmc3AtPmx2X25hbWUpICYmCisJCQkgICAgIXN0cmNtcCh2Z19uYW1lLCBmc3AtPnZnX25hbWUpKSB7CisJCQkJX2RlbF9mc19vcChmc3ApOworCQkJCWJyZWFrOyAvKiBubyBvdGhlciBERUwgb3BzICovCisJCQl9CisJCX0KKwllbHNlIGlmICgodHlwZSA9PSBGU19SRU5BTUUpICYmIF9jaGVja191ZGV2KGNoZWNrX3VkZXYpKQorCQkvKgorCQkgKiBJZiB1ZGV2IGlzIHJ1bm5pbmcgaWdub3JlIGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zIGlmIHJlbmFtaW5nIGl0LgorCQkgKgorCQkgKiBDdXJyZW50bHkgUkVOQU1FIG9wZXJhdGlvbiBoYXBwZW5zIHRocm91Z2ggJ3N1c3BlbmQgLT4gcmVzdW1lJy4KKwkJICogT24gJ3Jlc3VtZScgZGV2aWNlIGlzIGFkZGVkIHdpdGggcmVhZF9haGVhZCBzZXR0aW5ncywgc28gaXQKKwkJICogc2FmZSB0byByZW1vdmUgYW55IHN0YWNrZWQgQURELCBSRU5BTUUsIFJFQURfQUhFQUQgb3BlcmF0aW9uCisJCSAqIFRoZXJlIGNhbm5vdCBiZSBhbnkgREVMIG9wZXJhdGlvbiBvbiB0aGUgcmVuYW1lZCBkZXZpY2UuCisJCSAqLworCQlkbV9saXN0X2l0ZXJhdGVfc2FmZShmc3BoLCBmc3BodCwgJl9mc19vcHMpIHsKKwkJCWZzcCA9IGRtX2xpc3RfaXRlbShmc3BoLCBzdHJ1Y3QgZnNfb3BfcGFybXMpOworCQkJaWYgKCFzdHJjbXAob2xkX2x2X25hbWUsIGZzcC0+bHZfbmFtZSkgJiYKKwkJCSAgICAhc3RyY21wKHZnX25hbWUsIGZzcC0+dmdfbmFtZSkpCisJCQkJX2RlbF9mc19vcChmc3ApOworCQl9CisKKwlpZiAoIShmc3AgPSBkbV9tYWxsb2Moc2l6ZW9mKCpmc3ApICsgbGVuKSkpIHsKKwkJbG9nX2Vycm9yKCJObyBzcGFjZSB0byBzdGFjayBmcyBvcGVyYXRpb24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9zID0gZnNwLT5uYW1lczsKKwlmc3AtPnR5cGUgPSB0eXBlOworCWZzcC0+Y2hlY2tfdWRldiA9IGNoZWNrX3VkZXY7CisKKwlfc3RvcmVfc3RyKCZwb3MsICZmc3AtPmRldl9kaXIsIGRldl9kaXIpOworCV9zdG9yZV9zdHIoJnBvcywgJmZzcC0+dmdfbmFtZSwgdmdfbmFtZSk7CisJX3N0b3JlX3N0cigmcG9zLCAmZnNwLT5sdl9uYW1lLCBsdl9uYW1lKTsKKwlfc3RvcmVfc3RyKCZwb3MsICZmc3AtPmRldiwgZGV2KTsKKwlfc3RvcmVfc3RyKCZwb3MsICZmc3AtPm9sZF9sdl9uYW1lLCBvbGRfbHZfbmFtZSk7CisKKwlfY291bnRfZnNfb3BzW3R5cGVdKys7CisJZG1fbGlzdF9hZGQoJl9mc19vcHMsICZmc3AtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9wb3BfZnNfb3BzKHZvaWQpCit7CisJc3RydWN0IGRtX2xpc3QgKmZzcGgsICpmc3BodDsKKwlzdHJ1Y3QgZnNfb3BfcGFybXMgKmZzcDsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGZzcGgsIGZzcGh0LCAmX2ZzX29wcykgeworCQlmc3AgPSBkbV9saXN0X2l0ZW0oZnNwaCwgc3RydWN0IGZzX29wX3Bhcm1zKTsKKwkJX2RvX2ZzX29wKGZzcC0+dHlwZSwgZnNwLT5kZXZfZGlyLCBmc3AtPnZnX25hbWUsIGZzcC0+bHZfbmFtZSwKKwkJCSAgZnNwLT5kZXYsIGZzcC0+b2xkX2x2X25hbWUsIGZzcC0+Y2hlY2tfdWRldik7CisJCV9kZWxfZnNfb3AoZnNwKTsKKwl9CisKKwlfZnNfY3JlYXRlID0gMDsKK30KKworc3RhdGljIGludCBfZnNfb3AoZnNfb3BfdCB0eXBlLCBjb25zdCBjaGFyICpkZXZfZGlyLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgIGNvbnN0IGNoYXIgKmx2X25hbWUsIGNvbnN0IGNoYXIgKmRldiwgY29uc3QgY2hhciAqb2xkX2x2X25hbWUsCisJCSAgaW50IGNoZWNrX3VkZXYpCit7CisJaWYgKGNyaXRpY2FsX3NlY3Rpb24oKSkgeworCQlpZiAoIV9zdGFja19mc19vcCh0eXBlLCBkZXZfZGlyLCB2Z19uYW1lLCBsdl9uYW1lLCBkZXYsCisJCQkJICBvbGRfbHZfbmFtZSwgY2hlY2tfdWRldikpCisJCQlyZXR1cm5fMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIF9kb19mc19vcCh0eXBlLCBkZXZfZGlyLCB2Z19uYW1lLCBsdl9uYW1lLCBkZXYsCisJCQkgb2xkX2x2X25hbWUsIGNoZWNrX3VkZXYpOworfQorCitpbnQgZnNfYWRkX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmRldikKK3sKKwlyZXR1cm4gX2ZzX29wKEZTX0FERCwgbHYtPnZnLT5jbWQtPmRldl9kaXIsIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsCisJCSAgICAgIGRldiwgIiIsIGx2LT52Zy0+Y21kLT5jdXJyZW50X3NldHRpbmdzLnVkZXZfcnVsZXMpOworfQorCitpbnQgZnNfZGVsX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9mc19vcChGU19ERUwsIGx2LT52Zy0+Y21kLT5kZXZfZGlyLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLAorCQkgICAgICAiIiwgIiIsIGx2LT52Zy0+Y21kLT5jdXJyZW50X3NldHRpbmdzLnVkZXZfcnVsZXMpOworfQorCitpbnQgZnNfZGVsX2x2X2J5bmFtZShjb25zdCBjaGFyICpkZXZfZGlyLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICAgIGNvbnN0IGNoYXIgKmx2X25hbWUsIGludCBjaGVja191ZGV2KQoreworCXJldHVybiBfZnNfb3AoRlNfREVMLCBkZXZfZGlyLCB2Z19uYW1lLCBsdl9uYW1lLCAiIiwgIiIsIGNoZWNrX3VkZXYpOworfQorCitpbnQgZnNfcmVuYW1lX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmRldiwKKwkJIGNvbnN0IGNoYXIgKm9sZF92Z25hbWUsIGNvbnN0IGNoYXIgKm9sZF9sdm5hbWUpCit7CisJaWYgKHN0cmNtcChvbGRfdmduYW1lLCBsdi0+dmctPm5hbWUpKSB7CisJCXJldHVybgorCQkJKF9mc19vcChGU19ERUwsIGx2LT52Zy0+Y21kLT5kZXZfZGlyLCBvbGRfdmduYW1lLAorCQkJCW9sZF9sdm5hbWUsICIiLCAiIiwgbHYtPnZnLT5jbWQtPmN1cnJlbnRfc2V0dGluZ3MudWRldl9ydWxlcykgJiYKKwkJCSBfZnNfb3AoRlNfQURELCBsdi0+dmctPmNtZC0+ZGV2X2RpciwgbHYtPnZnLT5uYW1lLAorCQkJCWx2LT5uYW1lLCBkZXYsICIiLCBsdi0+dmctPmNtZC0+Y3VycmVudF9zZXR0aW5ncy51ZGV2X3J1bGVzKSk7CisJfQorCWVsc2UgCisJCXJldHVybiBfZnNfb3AoRlNfUkVOQU1FLCBsdi0+dmctPmNtZC0+ZGV2X2RpciwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSwKKwkJCSAgICAgIGRldiwgb2xkX2x2bmFtZSwgbHYtPnZnLT5jbWQtPmN1cnJlbnRfc2V0dGluZ3MudWRldl9ydWxlcyk7Cit9CisKK3ZvaWQgZnNfdW5sb2NrKHZvaWQpCit7CisJaWYgKCFjcml0aWNhbF9zZWN0aW9uKCkpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlN5bmNpbmcgZGV2aWNlIG5hbWVzIik7CisJCS8qIFdhaXQgZm9yIGFsbCBwcm9jZXNzZWQgdWRldiBkZXZpY2VzICovCisJCWlmICghZG1fdWRldl93YWl0KF9mc19jb29raWUpKQorCQkJc3RhY2s7CisJCV9mc19jb29raWUgPSBETV9DT09LSUVfQVVUT19DUkVBVEU7IC8qIFJlc2V0IGNvb2tpZSAqLworCQlkbV9saWJfcmVsZWFzZSgpOworCQlfcG9wX2ZzX29wcygpOworCX0KK30KKwordWludDMyX3QgZnNfZ2V0X2Nvb2tpZSh2b2lkKQoreworCXJldHVybiBfZnNfY29va2llOworfQorCit2b2lkIGZzX3NldF9jb29raWUodWludDMyX3QgY29va2llKQoreworCV9mc19jb29raWUgPSBjb29raWU7Cit9CisKK3ZvaWQgZnNfc2V0X2NyZWF0ZSh2b2lkKQoreworCV9mc19jcmVhdGUgPSAxOworfQorCitpbnQgZnNfaGFzX25vbl9kZWxldGVfb3BzKHZvaWQpCit7CisJcmV0dXJuIF9mc19jcmVhdGUgfHwgX290aGVyX2ZzX29wcyhGU19ERUwpOworfQpkaWZmIC0tZ2l0IGEvbGliL2FjdGl2YXRlL2ZzLmggYi9saWIvYWN0aXZhdGUvZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkzOGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FjdGl2YXRlL2ZzLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0ZTX0gKKyNkZWZpbmUgX0xWTV9GU19ICisKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorCisvKgorICogVGhlc2UgY2FsbHMsIHByaXZhdGUgdG8gdGhlIGFjdGl2YXRlIHVuaXQsIHNldAorICogdXAgdGhlIHZvbHVtZSBncm91cCBkaXJlY3RvcnkgaW4gL2RldiBhbmQgdGhlCisgKiBzeW1ib2xpYyBsaW5rcyB0byB0aGUgZG0gZGV2aWNlLgorICovCitpbnQgZnNfYWRkX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmRldik7CitpbnQgZnNfZGVsX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGZzX2RlbF9sdl9ieW5hbWUoY29uc3QgY2hhciAqZGV2X2RpciwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgICBjb25zdCBjaGFyICpsdl9uYW1lLCBpbnQgY2hlY2tfdWRldik7CitpbnQgZnNfcmVuYW1lX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmRldiwKKwkJIGNvbnN0IGNoYXIgKm9sZF92Z25hbWUsIGNvbnN0IGNoYXIgKm9sZF9sdm5hbWUpOworLyogdm9pZCBmc191bmxvY2sodm9pZCk7ICBtb3ZlZCB0byBhY3RpdmF0ZS5oICovCit1aW50MzJfdCBmc19nZXRfY29va2llKHZvaWQpOwordm9pZCBmc19zZXRfY29va2llKHVpbnQzMl90IGNvb2tpZSk7Cit2b2lkIGZzX3NldF9jcmVhdGUodm9pZCk7CitpbnQgZnNfaGFzX25vbl9kZWxldGVfb3BzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9hY3RpdmF0ZS90YXJnZXRzLmggYi9saWIvYWN0aXZhdGUvdGFyZ2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDk0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYWN0aXZhdGUvdGFyZ2V0cy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9UQVJHRVRTX0gKKyNkZWZpbmUgX0xWTV9UQVJHRVRTX0gKKworc3RydWN0IGRldl9tYW5hZ2VyOworc3RydWN0IGx2X3NlZ21lbnQ7CisKK2ludCBjb21wb3NlX2FyZWFzX2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJICAgICAgIGNoYXIgKnBhcmFtcywgc2l6ZV90IHBhcmFtc2l6ZSwgaW50ICpwb3MsCisJCSAgICAgICBpbnQgc3RhcnRfYXJlYSwgaW50IGFyZWFzKTsKKworaW50IGFkZF9hcmVhc19saW5lKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0sIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDMyX3Qgc3RhcnRfYXJlYSwgdWludDMyX3QgYXJlYXMpOworCitpbnQgYnVpbGRfZGV2X3N0cmluZyhzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBjaGFyICpkbGlkLCBjaGFyICpkZXZidWYsCisJCSAgICAgc2l6ZV90IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKmRlc2MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jYWNoZS9sdm1jYWNoZS5jIGIvbGliL2NhY2hlL2x2bWNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNzc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jYWNoZS9sdm1jYWNoZS5jCkBAIC0wLDAgKzEsMjc2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAiZGV2LWNhY2hlLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisjaW5jbHVkZSAiZm9ybWF0LXRleHQuaCIKKyNpbmNsdWRlICJmb3JtYXRfcG9vbC5oIgorI2luY2x1ZGUgImZvcm1hdDEuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImx2bWV0YWQuaCIKKyNpbmNsdWRlICJsdm1ldGFkLWNsaWVudC5oIgorCisjZGVmaW5lIENBQ0hFX0lOVkFMSUQJMHgwMDAwMDAwMQorI2RlZmluZSBDQUNIRV9MT0NLRUQJMHgwMDAwMDAwMgorCisvKiBPbmUgcGVyIGRldmljZSAqLworc3RydWN0IGx2bWNhY2hlX2luZm8geworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CS8qIEpvaW4gVkcgbWVtYmVycyB0b2dldGhlciAqLworCXN0cnVjdCBkbV9saXN0IG1kYXM7CS8qIGxpc3QgaGVhZCBmb3IgbWV0YWRhdGEgYXJlYXMgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBkYXM7CS8qIGxpc3QgaGVhZCBmb3IgZGF0YSBhcmVhcyAqLworCXN0cnVjdCBkbV9saXN0IGJhczsJLyogbGlzdCBoZWFkIGZvciBib290bG9hZGVyIGFyZWFzICovCisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOwkvKiBOVUxMID09IHVua25vd24gKi8KKwlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1aW50NjRfdCBkZXZpY2Vfc2l6ZTsJLyogQnl0ZXMgKi8KKwl1aW50MzJfdCBleHRfdmVyc2lvbjsgICAvKiBFeHRlbnNpb24gdmVyc2lvbiAqLworCXVpbnQzMl90IGV4dF9mbGFnczsJLyogRXh0ZW5zaW9uIGZsYWdzICovCisJdWludDMyX3Qgc3RhdHVzOworfTsKKworLyogT25lIHBlciBWRyAqLworc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsJLyogSm9pbiB0aGVzZSB2Z2luZm9zIHRvZ2V0aGVyICovCisJc3RydWN0IGRtX2xpc3QgaW5mb3M7CS8qIExpc3QgaGVhZCBmb3IgbHZtY2FjaGVfaW5mb3MgKi8KKwljb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKwljaGFyICp2Z25hbWU7CQkvKiAiIiA9PSBvcnBoYW4gKi8KKwl1aW50MzJfdCBzdGF0dXM7CisJY2hhciB2Z2lkW0lEX0xFTiArIDFdOworCWNoYXIgX3BhZGRpbmdbN107CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqbmV4dDsgLyogQW5vdGhlciBWRyB3aXRoIHNhbWUgbmFtZT8gKi8KKwljaGFyICpjcmVhdGlvbl9ob3N0OworCWNoYXIgKnN5c3RlbV9pZDsKKwljaGFyICpsb2NrX3R5cGU7CisJdWludDMyX3QgbWRhX2NoZWNrc3VtOworCXNpemVfdCBtZGFfc2l6ZTsKKwlzaXplX3QgdmdtZXRhZGF0YV9zaXplOworCWNoYXIgKnZnbWV0YWRhdGE7CS8qIENvcHkgb2YgVkcgbWV0YWRhdGEgYXMgZm9ybWF0X3RleHQgc3RyaW5nICovCisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7IC8qIENvbmZpZyB0cmVlIGNyZWF0ZWQgZnJvbSB2Z21ldGFkYXRhICovCisJCQkJICAgIC8qIExpZmV0aW1lIGlzIGRpcmVjdGx5IHRpZWQgdG8gdmdtZXRhZGF0YSAqLworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKmNhY2hlZF92ZzsKKwl1bnNpZ25lZCBob2xkZXJzOworCXVuc2lnbmVkIHZnX3VzZV9jb3VudDsJLyogQ291bnRlciBvZiB2ZyByZXVzYWdlICovCisJdW5zaWduZWQgcHJlY29tbWl0dGVkOwkvKiBJcyB2Z21ldGFkYXRhIGxpdmUgb3IgcHJlY29tbWl0dGVkPyAqLworCXVuc2lnbmVkIGNhY2hlZF92Z19pbnZhbGlkYXRlZDsJLyogU2lnbmFsIHRvIHJlZ2VuZXJhdGUgY2FjaGVkX3ZnICovCit9OworCitzdGF0aWMgc3RydWN0IGRtX2hhc2hfdGFibGUgKl9wdmlkX2hhc2ggPSBOVUxMOworc3RhdGljIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpfdmdpZF9oYXNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX3ZnbmFtZV9oYXNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX2xvY2tfaGFzaCA9IE5VTEw7CitzdGF0aWMgRE1fTElTVF9JTklUKF92Z2luZm9zKTsKK3N0YXRpYyBETV9MSVNUX0lOSVQoX2ZvdW5kX2R1cGxpY2F0ZV9kZXZzKTsKK3N0YXRpYyBETV9MSVNUX0lOSVQoX3VudXNlZF9kdXBsaWNhdGVfZGV2cyk7CitzdGF0aWMgaW50IF9zY2FubmluZ19pbl9wcm9ncmVzcyA9IDA7CitzdGF0aWMgaW50IF9oYXNfc2Nhbm5lZCA9IDA7CitzdGF0aWMgaW50IF92Z3NfbG9ja2VkID0gMDsKK3N0YXRpYyBpbnQgX3ZnX2dsb2JhbF9sb2NrX2hlbGQgPSAwOwkvKiBHbG9iYWwgbG9jayBoZWxkIHdoZW4gY2FjaGUgd2lwZWQ/ICovCitzdGF0aWMgaW50IF9mb3VuZF9kdXBsaWNhdGVfcHZzID0gMDsJLyogSWYgd2UgbmV2ZXIgc2VlIGEgZHVwbGljYXRlIFBWIHdlIGNhbiBza2lwIGNoZWNraW5nIGZvciB0aGVtIGxhdGVyLiAqLworc3RhdGljIGludCBfc3VwcHJlc3NfbG9ja19vcmRlcmluZyA9IDA7CisKK2ludCBsdm1jYWNoZV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBGSVhNRSBhZGQgYSBwcm9wZXIgbHZtY2FjaGVfbG9ja2luZ19yZXNldCgpIHRoYXQKKwkgKiByZXNldHMgdGhlIGNhY2hlIHNvIG5vIHByZXZpb3VzIGxvY2tzIGFyZSBsb2NrZWQKKwkgKi8KKwlfdmdzX2xvY2tlZCA9IDA7CisKKwlkbV9saXN0X2luaXQoJl92Z2luZm9zKTsKKwlkbV9saXN0X2luaXQoJl9mb3VuZF9kdXBsaWNhdGVfZGV2cyk7CisJZG1fbGlzdF9pbml0KCZfdW51c2VkX2R1cGxpY2F0ZV9kZXZzKTsKKworCWlmICghKF92Z25hbWVfaGFzaCA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghKF92Z2lkX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShfcHZpZF9oYXNoID0gZG1faGFzaF9jcmVhdGUoMTI4KSkpCisJCXJldHVybiAwOworCisJaWYgKCEoX2xvY2tfaGFzaCA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogUmVpbml0aWFsaXNpbmcgdGhlIGNhY2hlIGNsZWFycyB0aGUgaW50ZXJuYWwgcmVjb3JkIG9mCisJICogd2hpY2ggbG9ja3MgYXJlIGhlbGQuICBUaGUgZ2xvYmFsIGxvY2sgY2FuIGJlIGhlbGQgZHVyaW5nCisJICogdGhpcyBvcGVyYXRpb24gc28gaXRzIHN0YXRlIG11c3QgYmUgcmVzdG9yZWQgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwlpZiAoX3ZnX2dsb2JhbF9sb2NrX2hlbGQpIHsKKwkJbHZtY2FjaGVfbG9ja192Z25hbWUoVkdfR0xPQkFMLCAwKTsKKwkJX3ZnX2dsb2JhbF9sb2NrX2hlbGQgPSAwOworCX0KKworCXJldHVybiAxOworfQorCit2b2lkIGx2bWNhY2hlX3NlZWRfaW5mb3NfZnJvbV9sdm1ldGFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWlmICghbHZtZXRhZF91c2VkKCkgfHwgX2hhc19zY2FubmVkKQorCQlyZXR1cm47CisKKwlpZiAoIWx2bWV0YWRfcHZfbGlzdF90b19sdm1jYWNoZShjbWQpKSB7CisJCXN0YWNrOworCQlyZXR1cm47CisJfQorCisJX2hhc19zY2FubmVkID0gMTsKK30KKworLyogVm9sdW1lIEdyb3VwIG1ldGFkYXRhIGNhY2hlIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgX2ZyZWVfY2FjaGVkX3ZnbWV0YWRhdGEoc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvKQoreworCWlmICghdmdpbmZvIHx8ICF2Z2luZm8tPnZnbWV0YWRhdGEpCisJCXJldHVybjsKKworCWRtX2ZyZWUodmdpbmZvLT52Z21ldGFkYXRhKTsKKworCXZnaW5mby0+dmdtZXRhZGF0YSA9IE5VTEw7CisKKwkvKiBSZWxlYXNlIGFsc28gY2FjaGVkIGNvbmZpZyB0cmVlICovCisJaWYgKHZnaW5mby0+Y2Z0KSB7CisJCWRtX2NvbmZpZ19kZXN0cm95KHZnaW5mby0+Y2Z0KTsKKwkJdmdpbmZvLT5jZnQgPSBOVUxMOworCX0KKworCWxvZ19kZWJ1Z19jYWNoZSgiTWV0YWRhdGEgY2FjaGU6IFZHICVzIHdpcGVkLiIsIHZnaW5mby0+dmduYW1lKTsKKworCXJlbGVhc2VfdmcodmdpbmZvLT5jYWNoZWRfdmcpOworfQorCisvKgorICogQ2FjaGUgVkcgbWV0YWRhdGEgYWdhaW5zdCB0aGUgdmdpbmZvIHdpdGggbWF0Y2hpbmcgdmdpZC4KKyAqLworc3RhdGljIHZvaWQgX3N0b3JlX21ldGFkYXRhKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1bnNpZ25lZCBwcmVjb21taXR0ZWQpCit7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCWNoYXIgKmRhdGE7CisJc2l6ZV90IHNpemU7CisKKwlpZiAoISh2Z2luZm8gPSBsdm1jYWNoZV92Z2luZm9fZnJvbV92Z2lkKChjb25zdCBjaGFyICopJnZnLT5pZCkpKSB7CisJCXN0YWNrOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoc2l6ZSA9IGV4cG9ydF92Z190b19idWZmZXIodmcsICZkYXRhKSkpIHsKKwkJc3RhY2s7CisJCV9mcmVlX2NhY2hlZF92Z21ldGFkYXRhKHZnaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBdm9pZCByZXBhcnNpbmcgb2YgdGhlIHNhbWUgZGF0YSBzdHJpbmcgKi8KKwlpZiAodmdpbmZvLT52Z21ldGFkYXRhICYmIHZnaW5mby0+dmdtZXRhZGF0YV9zaXplID09IHNpemUgJiYKKwkgICAgc3RyY21wKHZnaW5mby0+dmdtZXRhZGF0YSwgZGF0YSkgPT0gMCkKKwkJZG1fZnJlZShkYXRhKTsKKwllbHNlIHsKKwkJX2ZyZWVfY2FjaGVkX3ZnbWV0YWRhdGEodmdpbmZvKTsKKwkJdmdpbmZvLT52Z21ldGFkYXRhX3NpemUgPSBzaXplOworCQl2Z2luZm8tPnZnbWV0YWRhdGEgPSBkYXRhOworCX0KKworCXZnaW5mby0+cHJlY29tbWl0dGVkID0gcHJlY29tbWl0dGVkOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoKGNvbnN0IHN0cnVjdCBpZCAqKXZnaW5mby0+dmdpZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkgeworCQlzdGFjazsKKwkJcmV0dXJuOworCX0KKworCWxvZ19kZWJ1Z19jYWNoZSgiTWV0YWRhdGEgY2FjaGU6IFZHICVzICglcykgc3RvcmVkICglIiBQUklzaXplX3QgIiBieXRlcyVzKS4iLAorCQkJdmdpbmZvLT52Z25hbWUsIHV1aWQsIHNpemUsCisJCQlwcmVjb21taXR0ZWQgPyAiLCBwcmVjb21taXR0ZWQiIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBfdXBkYXRlX2NhY2hlX2luZm9fbG9ja19zdGF0ZShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywKKwkJCQkJICBpbnQgbG9ja2VkLAorCQkJCQkgIGludCAqY2FjaGVkX3ZnbWV0YWRhdGFfdmFsaWQpCit7CisJaW50IHdhc19sb2NrZWQgPSAoaW5mby0+c3RhdHVzICYgQ0FDSEVfTE9DS0VEKSA/IDEgOiAwOworCisJLyoKKwkgKiBDYWNoZSBiZWNvbWVzIGludmFsaWQgd2hlbmV2ZXIgbG9jayBzdGF0ZSBjaGFuZ2VzIHVubGVzcworCSAqIGV4Y2x1c2l2ZSBWR19HTE9CQUwgaXMgaGVsZCAoaS5lLiB3aGlsZSBzY2FubmluZykuCisJICovCisJaWYgKCFsdm1jYWNoZV92Z25hbWVfaXNfbG9ja2VkKFZHX0dMT0JBTCkgJiYgKHdhc19sb2NrZWQgIT0gbG9ja2VkKSkgeworCQlpbmZvLT5zdGF0dXMgfD0gQ0FDSEVfSU5WQUxJRDsKKwkJKmNhY2hlZF92Z21ldGFkYXRhX3ZhbGlkID0gMDsKKwl9CisKKwlpZiAobG9ja2VkKQorCQlpbmZvLT5zdGF0dXMgfD0gQ0FDSEVfTE9DS0VEOworCWVsc2UKKwkJaW5mby0+c3RhdHVzICY9IH5DQUNIRV9MT0NLRUQ7Cit9CisKK3N0YXRpYyB2b2lkIF91cGRhdGVfY2FjaGVfdmdpbmZvX2xvY2tfc3RhdGUoc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvLAorCQkJCQkgICAgaW50IGxvY2tlZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlpbnQgY2FjaGVkX3ZnbWV0YWRhdGFfdmFsaWQgPSAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGluZm8sICZ2Z2luZm8tPmluZm9zKQorCQlfdXBkYXRlX2NhY2hlX2luZm9fbG9ja19zdGF0ZShpbmZvLCBsb2NrZWQsCisJCQkJCSAgICAgICZjYWNoZWRfdmdtZXRhZGF0YV92YWxpZCk7CisKKwlpZiAoIWNhY2hlZF92Z21ldGFkYXRhX3ZhbGlkKQorCQlfZnJlZV9jYWNoZWRfdmdtZXRhZGF0YSh2Z2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfdXBkYXRlX2NhY2hlX2xvY2tfc3RhdGUoY29uc3QgY2hhciAqdmduYW1lLCBpbnQgbG9ja2VkKQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKworCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z25hbWUsIE5VTEwpKSkKKwkJcmV0dXJuOworCisJX3VwZGF0ZV9jYWNoZV92Z2luZm9fbG9ja19zdGF0ZSh2Z2luZm8sIGxvY2tlZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcm9wX21ldGFkYXRhKGNvbnN0IGNoYXIgKnZnbmFtZSwgaW50IGRyb3BfcHJlY29tbWl0dGVkKQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKworCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z25hbWUsIE5VTEwpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGNhY2hlZCBQViBsYWJlbHMuCisJICogSWYgY2FjaGVkIHByZWNvbW1pdHRlZCBtZXRhZGF0YSBleGlzdHMgdGhhdCBtZWFucyB3ZQorCSAqIGFscmVhZHkgaW52YWxpZGF0ZWQgdGhlIFBWIGxhYmVscyAoYmVmb3JlIGNhY2hpbmcgaXQpCisJICogYW5kIHdlIG11c3Qgbm90IGRvIGl0IGFnYWluLgorCSAqLworCWlmICghZHJvcF9wcmVjb21taXR0ZWQgJiYgdmdpbmZvLT5wcmVjb21taXR0ZWQgJiYgIXZnaW5mby0+dmdtZXRhZGF0YSkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJtZXRhZGF0YSBjb21taXQgKG9yIHJldmVydCkgbWlzc2luZyBiZWZvcmUgIgorCQkJICAiZHJvcHBpbmcgbWV0YWRhdGEgZnJvbSBjYWNoZS4iKTsKKworCWlmIChkcm9wX3ByZWNvbW1pdHRlZCB8fCAhdmdpbmZvLT5wcmVjb21taXR0ZWQpCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhpbmZvLCAmdmdpbmZvLT5pbmZvcykKKwkJCWluZm8tPnN0YXR1cyB8PSBDQUNIRV9JTlZBTElEOworCisJX2ZyZWVfY2FjaGVkX3ZnbWV0YWRhdGEodmdpbmZvKTsKKworCS8qIFZHIHJldmVydCAqLworCWlmIChkcm9wX3ByZWNvbW1pdHRlZCkKKwkJdmdpbmZvLT5wcmVjb21taXR0ZWQgPSAwOworfQorCisvKgorICogUmVtb3RlIG5vZGUgdXNlcyB0aGlzIHRvIHVwZ3JhZGUgcHJlY29tbWl0dGVkIG1ldGFkYXRhIHRvIGNvbW1pdGVkIHN0YXRlCisgKiB3aGVuIHJlY2VpdmVzIHZnX2NvbW1pdCBub3RpZmljYXRpb24uCisgKiAoTm90ZSB0aGF0IGRldmljZXMgY2FuIGJlIHN1c3BlbmRlZCBoZXJlLCBpZiBzbywgcHJlY29tbWl0dGVkIG1ldGFkYXRhIGFyZSBhbHJlYWR5IHJlYWQuKQorICovCit2b2lkIGx2bWNhY2hlX2NvbW1pdF9tZXRhZGF0YShjb25zdCBjaGFyICp2Z25hbWUpCit7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCisJaWYgKCEodmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKHZnbmFtZSwgTlVMTCkpKQorCQlyZXR1cm47CisKKwlpZiAodmdpbmZvLT5wcmVjb21taXR0ZWQpIHsKKwkJbG9nX2RlYnVnX2NhY2hlKCJQcmVjb21taXR0ZWQgbWV0YWRhdGEgY2FjaGU6IFZHICVzIHVwZ3JhZGVkIHRvIGNvbW1pdHRlZC4iLAorCQkJCXZnaW5mby0+dmduYW1lKTsKKwkJdmdpbmZvLT5wcmVjb21taXR0ZWQgPSAwOworCX0KK30KKwordm9pZCBsdm1jYWNoZV9kcm9wX21ldGFkYXRhKGNvbnN0IGNoYXIgKnZnbmFtZSwgaW50IGRyb3BfcHJlY29tbWl0dGVkKQoreworCWlmIChsdm1jYWNoZV92Z25hbWVfaXNfbG9ja2VkKFZHX0dMT0JBTCkpCisJCXJldHVybjsKKworCS8qIEZvciBWR19PUlBIQU5TLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgYWxsIGxhYmVscyBvbiBvcnBoYW4gUFZzLiAqLworCWlmICghc3RyY21wKHZnbmFtZSwgVkdfT1JQSEFOUykpIHsKKwkJX2Ryb3BfbWV0YWRhdGEoRk1UX1RFWFRfT1JQSEFOX1ZHX05BTUUsIDApOworCQlfZHJvcF9tZXRhZGF0YShGTVRfTFZNMV9PUlBIQU5fVkdfTkFNRSwgMCk7CisJCV9kcm9wX21ldGFkYXRhKEZNVF9QT09MX09SUEhBTl9WR19OQU1FLCAwKTsKKworCQkvKiBJbmRpY2F0ZSB0aGF0IFBWcyBjb3VsZCBub3cgYmUgbWlzc2luZyBmcm9tIHRoZSBjYWNoZSAqLworCQlpbml0X2Z1bGxfc2Nhbl9kb25lKDApOworCX0gZWxzZQorCQlfZHJvcF9tZXRhZGF0YSh2Z25hbWUsIGRyb3BfcHJlY29tbWl0dGVkKTsKK30KKworLyoKKyAqIEVuc3VyZSB2Z25hbWUyIGNvbWVzIGFmdGVyIHZnbmFtZTEgYWxwaGFiZXRpY2FsbHkuCisgKiBPcnBoYW4gbG9ja3MgY29tZSBsYXN0LgorICogVkdfR0xPQkFMIGNvbWVzIGZpcnN0LgorICovCitzdGF0aWMgaW50IF92Z25hbWVfb3JkZXJfY29ycmVjdChjb25zdCBjaGFyICp2Z25hbWUxLCBjb25zdCBjaGFyICp2Z25hbWUyKQoreworCWlmIChpc19nbG9iYWxfdmcodmduYW1lMSkpCisJCXJldHVybiAxOworCisJaWYgKGlzX2dsb2JhbF92Zyh2Z25hbWUyKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaXNfb3JwaGFuX3ZnKHZnbmFtZTEpKQorCQlyZXR1cm4gMDsKKworCWlmIChpc19vcnBoYW5fdmcodmduYW1lMikpCisJCXJldHVybiAxOworCisJaWYgKHN0cmNtcCh2Z25hbWUxLCB2Z25hbWUyKSA8IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbHZtY2FjaGVfbG9ja19vcmRlcmluZyhpbnQgZW5hYmxlKQoreworCV9zdXBwcmVzc19sb2NrX29yZGVyaW5nID0gIWVuYWJsZTsKK30KKworLyoKKyAqIEVuc3VyZSBWRyBsb2NrcyBhcmUgYWNxdWlyZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICovCitpbnQgbHZtY2FjaGVfdmVyaWZ5X2xvY2tfb3JkZXIoY29uc3QgY2hhciAqdmduYW1lKQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisJY29uc3QgY2hhciAqdmduYW1lMjsKKworCWlmIChfc3VwcHJlc3NfbG9ja19vcmRlcmluZykKKwkJcmV0dXJuIDE7CisKKwlpZiAoIV9sb2NrX2hhc2gpCisJCXJldHVybl8wOworCisJZG1faGFzaF9pdGVyYXRlKG4sIF9sb2NrX2hhc2gpIHsKKwkJaWYgKCFkbV9oYXNoX2dldF9kYXRhKF9sb2NrX2hhc2gsIG4pKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCEodmduYW1lMiA9IGRtX2hhc2hfZ2V0X2tleShfbG9ja19oYXNoLCBuKSkpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgbG9jayAlcyBoaXRzIE5VTEwuIiwKKwkJCQkgdmduYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFfdmduYW1lX29yZGVyX2NvcnJlY3QodmduYW1lMiwgdmduYW1lKSkgeworCQkJbG9nX2Vycm5vKEVERUFETEssIElOVEVSTkFMX0VSUk9SICJWRyBsb2NrICVzIG11c3QgIgorCQkJCSAgImJlIHJlcXVlc3RlZCBiZWZvcmUgJXMsIG5vdCBhZnRlci4iLAorCQkJCSAgdmduYW1lLCB2Z25hbWUyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbHZtY2FjaGVfbG9ja192Z25hbWUoY29uc3QgY2hhciAqdmduYW1lLCBpbnQgcmVhZF9vbmx5IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWlmICghX2xvY2tfaGFzaCAmJiAhbHZtY2FjaGVfaW5pdCgpKSB7CisJCWxvZ19lcnJvcigiSW50ZXJuYWwgY2FjaGUgaW5pdGlhbGlzYXRpb24gZmFpbGVkIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZG1faGFzaF9sb29rdXAoX2xvY2tfaGFzaCwgdmduYW1lKSkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJOZXN0ZWQgbG9ja2luZyBhdHRlbXB0ZWQgb24gVkcgJXMuIiwKKwkJCSAgdmduYW1lKTsKKworCWlmICghZG1faGFzaF9pbnNlcnQoX2xvY2tfaGFzaCwgdmduYW1lLCAodm9pZCAqKSAxKSkKKwkJbG9nX2Vycm9yKCJDYWNoZSBsb2NraW5nIGZhaWx1cmUgZm9yICVzIiwgdmduYW1lKTsKKworCWlmIChzdHJjbXAodmduYW1lLCBWR19HTE9CQUwpKSB7CisJCV91cGRhdGVfY2FjaGVfbG9ja19zdGF0ZSh2Z25hbWUsIDEpOworCQlfdmdzX2xvY2tlZCsrOworCX0KK30KKworaW50IGx2bWNhY2hlX3ZnbmFtZV9pc19sb2NrZWQoY29uc3QgY2hhciAqdmduYW1lKQoreworCWlmICghX2xvY2tfaGFzaCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG1faGFzaF9sb29rdXAoX2xvY2tfaGFzaCwgaXNfb3JwaGFuX3ZnKHZnbmFtZSkgPyBWR19PUlBIQU5TIDogdmduYW1lKSA/IDEgOiAwOworfQorCit2b2lkIGx2bWNhY2hlX3VubG9ja192Z25hbWUoY29uc3QgY2hhciAqdmduYW1lKQoreworCWlmICghZG1faGFzaF9sb29rdXAoX2xvY2tfaGFzaCwgdmduYW1lKSkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJBdHRlbXB0IHRvIHVubG9jayB1bmxvY2tlZCBWRyAlcy4iLAorCQkJICB2Z25hbWUpOworCisJaWYgKHN0cmNtcCh2Z25hbWUsIFZHX0dMT0JBTCkpCisJCV91cGRhdGVfY2FjaGVfbG9ja19zdGF0ZSh2Z25hbWUsIDApOworCisJZG1faGFzaF9yZW1vdmUoX2xvY2tfaGFzaCwgdmduYW1lKTsKKworCS8qIEZJWE1FIERvIHRoaXMgcGVyLVZHICovCisJaWYgKHN0cmNtcCh2Z25hbWUsIFZHX0dMT0JBTCkgJiYgIS0tX3Znc19sb2NrZWQpIHsKKwkJZGV2X2Nsb3NlX2FsbCgpOworCQlkZXZfc2l6ZV9zZXFub19pbmMoKTsgLyogaW52YWxpZGF0ZSBhbGwgY2FjaGVkIGRldiBzaXplcyAqLworCX0KK30KKworaW50IGx2bWNhY2hlX3Znc19sb2NrZWQodm9pZCkKK3sKKwlyZXR1cm4gX3Znc19sb2NrZWQ7Cit9CisKKy8qCisgKiBXaGVuIGx2bWNhY2hlIHNlZXMgYSBkdXBsaWNhdGUgUFYsIHRoaXMgaXMgc2V0LgorICogcHJvY2Vzc19lYWNoX3B2KCkgY2FuIGF2b2lkIHNlYXJjaGluZyBmb3IgZHVwbGljYXRlcworICogYnkgY2hlY2tpbmcgdGhpcyBhbmQgc2VlaW5nIHRoYXQgbm8gZHVwbGljYXRlIFBWcyBleGlzdC4KKyAqCisgKgorICogZm91bmRfZHVwbGljYXRlX3B2cyB0ZWxscyB0aGUgcHJvY2Vzc19lYWNoX3B2IGNvZGUKKyAqIHRvIHNlYXJjaCB0aGUgZGV2aWNlcyBsaXN0IGZvciBkdXBsaWNhdGVzLCBzbyB0aGF0CisgKiBkZXZpY2VzIGNhbiBiZSBwcm9jZXNzZWQgdG9nZXRoZXIgd2l0aCB0aGVpcgorICogZHVwbGljYXRlcyAod2hpbGUgcHJvY2Vzc2luZyB0aGUgVkcsIHJhdGhlciB0aGFuCisgKiByZXBvcnRpbmcgcHYtPmRldiB1bmRlciB0aGUgVkcsIGFuZCBpdHMgZHVwbGljYXRlCisgKiBvdXRzaWRlIHRoZSBWRyBjb250ZXh0LikKKyAqLworaW50IGx2bWNhY2hlX2ZvdW5kX2R1cGxpY2F0ZV9wdnModm9pZCkKK3sKKwlyZXR1cm4gX2ZvdW5kX2R1cGxpY2F0ZV9wdnM7Cit9CisKK2ludCBsdm1jYWNoZV9nZXRfdW51c2VkX2R1cGxpY2F0ZV9kZXZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmwsICpkZXZsMjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkZXZsLCAmX3VudXNlZF9kdXBsaWNhdGVfZGV2cykgeworCQlpZiAoIShkZXZsMiA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHNpemVvZigqZGV2bDIpKSkpIHsKKwkJCWxvZ19lcnJvcigiZGV2aWNlX2xpc3QgZWxlbWVudCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGV2bDItPmRldiA9IGRldmwtPmRldjsKKwkJZG1fbGlzdF9hZGQoaGVhZCwgJmRldmwyLT5saXN0KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbHZtY2FjaGVfcmVtb3ZlX3VuY2hvc2VuX2R1cGxpY2F0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9saXN0ICpkZXZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRldmwsICZfdW51c2VkX2R1cGxpY2F0ZV9kZXZzKSB7CisJCWlmIChkZXZsLT5kZXYgPT0gZGV2KSB7CisJCQlkbV9saXN0X2RlbCgmZGV2bC0+bGlzdCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95X2R1cGxpY2F0ZV9kZXZpY2VfbGlzdChzdHJ1Y3QgZG1fbGlzdCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmwsICpkZXZsMjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGRldmwsIGRldmwyLCBoZWFkKSB7CisJCWRtX2xpc3RfZGVsKCZkZXZsLT5saXN0KTsKKwkJZG1fZnJlZShkZXZsKTsKKwl9CisJZG1fbGlzdF9pbml0KGhlYWQpOworfQorCitzdGF0aWMgdm9pZCBfdmdpbmZvX2F0dGFjaF9pbmZvKHN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbywKKwkJCQlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoIXZnaW5mbykKKwkJcmV0dXJuOworCisJaW5mby0+dmdpbmZvID0gdmdpbmZvOworCWRtX2xpc3RfYWRkKCZ2Z2luZm8tPmluZm9zLCAmaW5mby0+bGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIF92Z2luZm9fZGV0YWNoX2luZm8oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJaWYgKCFkbV9saXN0X2VtcHR5KCZpbmZvLT5saXN0KSkgeworCQlkbV9saXN0X2RlbCgmaW5mby0+bGlzdCk7CisJCWRtX2xpc3RfaW5pdCgmaW5mby0+bGlzdCk7CisJfQorCisJaW5mby0+dmdpbmZvID0gTlVMTDsKK30KKworLyogSWYgdmdpZCBzdXBwbGllZCwgcmVxdWlyZSBhIG1hdGNoLiAqLworc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisKKwlpZiAoIXZnbmFtZSkKKwkJcmV0dXJuIGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnaWQodmdpZCk7CisKKwlpZiAoIV92Z25hbWVfaGFzaCkgeworCQlsb2dfZGVidWdfY2FjaGUoSU5URVJOQUxfRVJST1IgIkludGVybmFsIGx2bWNhY2hlIGlzIG5vIHlldCBpbml0aWFsaXplZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEodmdpbmZvID0gZG1faGFzaF9sb29rdXAoX3ZnbmFtZV9oYXNoLCB2Z25hbWUpKSkgeworCQlsb2dfZGVidWdfY2FjaGUoImx2bWNhY2hlIGhhcyBubyBpbmZvIGZvciB2Z25hbWUgXCIlc1wiJXMiIEZNVFZHSUQgIi4iLAorCQkJCXZnbmFtZSwgKHZnaWQpID8gIiB3aXRoIFZHSUQgIiA6ICIiLCAodmdpZCkgPyA6ICIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHZnaWQpCisJCWRvCisJCQlpZiAoIXN0cm5jbXAodmdpZCwgdmdpbmZvLT52Z2lkLCBJRF9MRU4pKQorCQkJCXJldHVybiB2Z2luZm87CisJCXdoaWxlICgodmdpbmZvID0gdmdpbmZvLT5uZXh0KSk7CisKKwlpZiAgKCF2Z2luZm8pCisJCWxvZ19kZWJ1Z19jYWNoZSgibHZtY2FjaGUgaGFzIG5vdCBmb3VuZCB2Z25hbWUgXCIlc1wiJXMiIEZNVFZHSUQgIi4iLAorCQkJCXZnbmFtZSwgKHZnaWQpID8gIiB3aXRoIFZHSUQgIiA6ICIiLCAodmdpZCkgPyA6ICIiKTsKKworCXJldHVybiB2Z2luZm87Cit9CisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqbHZtY2FjaGVfZm10X2Zyb21fdmduYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgY29uc3QgY2hhciAqdmduYW1lLCBjb25zdCBjaGFyICp2Z2lkLAorCQkJCQkJICAgdW5zaWduZWQgcmV2YWxpZGF0ZV9sYWJlbHMpCit7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJc3RydWN0IGRtX2xpc3QgKmRldmgsICp0bXA7CisJc3RydWN0IGRtX2xpc3QgZGV2czsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisJY2hhciB2Z2lkX2ZvdW5kW0lEX0xFTiArIDFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z25hbWUsIHZnaWQpKSkgeworCQlpZiAoIWx2bWV0YWRfdXNlZCgpKQorCQkJcmV0dXJuIE5VTEw7IC8qIHRvbyBiYWQgKi8KKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgaW5mbyBidXQgd2UgaGF2ZSBsdm1ldGFkLCB3ZSBjYW4gYXNrCisJCSAqIHRoZXJlIGJlZm9yZSBmYWlsaW5nLiAqLworCQlpZiAoKHZnID0gbHZtZXRhZF92Z19sb29rdXAoY21kLCB2Z25hbWUsIHZnaWQpKSkgeworCQkJZm10ID0gdmctPmZpZC0+Zm10OworCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQlyZXR1cm4gZm10OworCQl9CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcmVwZWF0ZWRseSwgb25seSB0aGUgZmlyc3Qgb25lIG5lZWRzIHRvIHJldmFsaWRhdGUuCisJICovCisJaWYgKCFyZXZhbGlkYXRlX2xhYmVscykKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgY2FsbGVkIGJlZm9yZSByZWFkaW5nIG1ldGFkYXRhIHNvCisgCSAqIHdlIGNoZWNrIGNhY2hlZCBsYWJlbHMgaGVyZS4gVW5mb3J0dW5hdGVseSB2Z2luZm8gaXMgdm9sYXRpbGUuCisgCSAqLworCWRtX2xpc3RfaW5pdCgmZGV2cyk7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGluZm8sICZ2Z2luZm8tPmluZm9zKSB7CisJCWlmICghKGRldmwgPSBkbV9tYWxsb2Moc2l6ZW9mKCpkZXZsKSkpKSB7CisJCQlsb2dfZXJyb3IoImRldmljZV9saXN0IGVsZW1lbnQgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRldmwtPmRldiA9IGluZm8tPmRldjsKKwkJZG1fbGlzdF9hZGQoJmRldnMsICZkZXZsLT5saXN0KTsKKwl9CisKKwltZW1jcHkodmdpZF9mb3VuZCwgdmdpbmZvLT52Z2lkLCBzaXplb2YodmdpZF9mb3VuZCkpOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUoZGV2aCwgdG1wLCAmZGV2cykgeworCQlkZXZsID0gZG1fbGlzdF9pdGVtKGRldmgsIHN0cnVjdCBkZXZpY2VfbGlzdCk7CisJCSh2b2lkKSBsYWJlbF9yZWFkKGRldmwtPmRldiwgJmxhYmVsLCBVSU5UNjRfQygwKSk7CisJCWRtX2xpc3RfZGVsKCZkZXZsLT5saXN0KTsKKwkJZG1fZnJlZShkZXZsKTsKKwl9CisKKwkvKiBJZiB2Z2luZm8gY2hhbmdlZCwgY2FsbGVyIG5lZWRzIHRvIHJlc2NhbiAqLworCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z25hbWUsIHZnaWRfZm91bmQpKSB8fAorCSAgICBzdHJuY21wKHZnaW5mby0+dmdpZCwgdmdpZF9mb3VuZCwgSURfTEVOKSkKKwkJcmV0dXJuIE5VTEw7CisKK291dDoKKwlyZXR1cm4gdmdpbmZvLT5mbXQ7Cit9CisKK3N0cnVjdCBsdm1jYWNoZV92Z2luZm8gKmx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnaWQoY29uc3QgY2hhciAqdmdpZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisJY2hhciBpZFtJRF9MRU4gKyAxXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKKwlpZiAoIV92Z2lkX2hhc2ggfHwgIXZnaWQpIHsKKwkJbG9nX2RlYnVnX2NhY2hlKElOVEVSTkFMX0VSUk9SICJJbnRlcm5hbCBjYWNoZSBjYW5ub3QgbG9va3VwIHZnaWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHZnaWQgbm90IG5lY2Vzc2FyaWx5IE5VTEwtdGVybWluYXRlZCAqLworCXN0cm5jcHkoJmlkWzBdLCB2Z2lkLCBJRF9MRU4pOworCWlkW0lEX0xFTl0gPSAnXDAnOworCisJaWYgKCEodmdpbmZvID0gZG1faGFzaF9sb29rdXAoX3ZnaWRfaGFzaCwgaWQpKSkgeworCQlsb2dfZGVidWdfY2FjaGUoIk1ldGFkYXRhIGNhY2hlIGhhcyBubyBpbmZvIGZvciB2Z2lkIFwiJXNcIiIsIGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHZnaW5mbzsKK30KKworY29uc3QgY2hhciAqbHZtY2FjaGVfdmduYW1lX2Zyb21fdmdpZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICp2Z2lkKQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKwljb25zdCBjaGFyICp2Z25hbWUgPSBOVUxMOworCisJaWYgKCh2Z2luZm8gPSBsdm1jYWNoZV92Z2luZm9fZnJvbV92Z2lkKHZnaWQpKSkKKwkJdmduYW1lID0gdmdpbmZvLT52Z25hbWU7CisKKwlpZiAobWVtICYmIHZnbmFtZSkKKwkJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKG1lbSwgdmduYW1lKTsKKworCXJldHVybiB2Z25hbWU7Cit9CisKK2NvbnN0IGNoYXIgKmx2bWNhY2hlX3ZnaWRfZnJvbV92Z25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisKKwlpZiAoISh2Z2luZm8gPSBkbV9oYXNoX2xvb2t1cChfdmduYW1lX2hhc2gsIHZnbmFtZSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghdmdpbmZvLT5uZXh0KQorCQlyZXR1cm4gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnaW5mby0+dmdpZCk7CisKKwkvKgorCSAqIFRoZXJlIGFyZSBtdWx0aXBsZSBWR3Mgd2l0aCB0aGlzIG5hbWUgdG8gY2hvb3NlIGZyb20uCisJICogUmV0dXJuIGFuIGVycm9yIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBWRyBpcyBpbnRlbmRlZC4KKwkgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfaW5mb19pc192YWxpZChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+c3RhdHVzICYgQ0FDSEVfSU5WQUxJRCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBWRyBsb2NrIHRvIG1hbmlwdWxhdGUgbWV0YWRhdGEuCisJICogSW4gYSBjbHVzdGVyLCByZW1vdGUgbm9kZXMgc29tZXRpbWVzIHJlYWQgbWV0YWRhdGEgaW4gdGhlCisJICoga25vd2xlZGdlIHRoYXQgdGhlIGNvbnRyb2xsaW5nIG5vZGUgaXMgaG9sZGluZyB0aGUgbG9jay4KKwkgKiBTbyBpZiB0aGUgVkcgYXBwZWFycyB0byBiZSB1bmxvY2tlZCBoZXJlLCBpdCBzaG91bGQgYmUgc2FmZQorCSAqIHRvIHVzZSB0aGUgY2FjaGVkIHZhbHVlLgorCSAqLworCWlmIChpbmZvLT52Z2luZm8gJiYgIWx2bWNhY2hlX3ZnbmFtZV9pc19sb2NrZWQoaW5mby0+dmdpbmZvLT52Z25hbWUpKQorCQlyZXR1cm4gMTsKKworCWlmICghKGluZm8tPnN0YXR1cyAmIENBQ0hFX0xPQ0tFRCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnaW5mb19pc192YWxpZChzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8pCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisKKwkvKiBJbnZhbGlkIGlmIGFueSBpbmZvIGlzIGludmFsaWQgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpCisJCWlmICghX2luZm9faXNfdmFsaWQoaW5mbykpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiB2Z2luZm8gaXMgaW52YWxpZCBpZiBpdCBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWxpZCBpbmZvICovCitzdGF0aWMgaW50IF92Z2luZm9faXNfaW52YWxpZChzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8pCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpCisJCWlmIChfaW5mb19pc192YWxpZChpbmZvKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJZiB2YWxpZF9vbmx5IGlzIHNldCwgZGF0YSB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaWYgdGhlIGNhY2hlZCBkYXRhIGlzCisgKiBrbm93biBzdGlsbCB0byBiZSB2YWxpZC4KKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgYmVpbmcgd29ya2VkIHdpdGggaXMga25vd24sIHBhc3MgdGhhdCBkZXYgYXMgdGhlIHNlY29uZCBhcmcuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGR1cGxpY2F0ZXMgZXhpc3QsIHRoZSB3cm9uZyBkZXYgaXNuJ3QgdXNlZC4KKyAqLworc3RydWN0IGx2bWNhY2hlX2luZm8gKmx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGNvbnN0IGNoYXIgKnB2aWQsIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHZhbGlkX29ubHkpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJY2hhciBpZFtJRF9MRU4gKyAxXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKKwlpZiAoIV9wdmlkX2hhc2ggfHwgIXB2aWQpCisJCXJldHVybiBOVUxMOworCisJc3RybmNweSgmaWRbMF0sIHB2aWQsIElEX0xFTik7CisJaWRbSURfTEVOXSA9ICdcMCc7CisKKwlpZiAoIShpbmZvID0gZG1faGFzaF9sb29rdXAoX3B2aWRfaGFzaCwgaWQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIFdoZW4gaGFuZGxpbmcgZHVwbGljYXRlIFBWcywgbW9yZSB0aGFuIG9uZSBkZXZpY2UgY2FuIGhhdmUgdGhpcyBwdmlkLgorCSAqLworCWlmIChkZXYgJiYgaW5mby0+ZGV2ICYmIChpbmZvLT5kZXYgIT0gZGV2KSkgeworCQlsb2dfZGVidWdfY2FjaGUoIklnbm9yaW5nIGx2bWNhY2hlIGluZm8gZm9yIGRldiAlcyBiZWNhdXNlIGRldiAlcyB3YXMgcmVxdWVzdGVkIGZvciBQVklEICVzLiIsCisJCQkJZGV2X25hbWUoaW5mby0+ZGV2KSwgZGV2X25hbWUoZGV2KSwgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodmFsaWRfb25seSAmJiAhX2luZm9faXNfdmFsaWQoaW5mbykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGluZm87Cit9CisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqbHZtY2FjaGVfZm10X2Zyb21faW5mbyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gaW5mby0+Zm10OworfQorCitjb25zdCBjaGFyICpsdm1jYWNoZV92Z25hbWVfZnJvbV9pbmZvKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT52Z2luZm8pCisJCXJldHVybiBpbmZvLT52Z2luZm8tPnZnbmFtZTsKKwlyZXR1cm4gTlVMTDsKK30KKworY2hhciAqbHZtY2FjaGVfdmduYW1lX2Zyb21fcHZpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcHZpZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwljaGFyICp2Z25hbWU7CisKKwlpZiAoIWx2bWNhY2hlX2RldmljZV9mcm9tX3B2aWQoY21kLCAoY29uc3Qgc3RydWN0IGlkICopcHZpZCwgTlVMTCwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIGRldmljZSB3aXRoIHV1aWQgJXMuIiwgcHZpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmlkLCBOVUxMLCAwKTsKKwlpZiAoIWluZm8pCisJCXJldHVybl9OVUxMOworCisJaWYgKCEodmduYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGluZm8tPnZnaW5mby0+dmduYW1lKSkpIHsKKwkJbG9nX2Vycm5vKEVOT01FTSwgInZnbmFtZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHZnbmFtZTsKK30KKworc3RhdGljIHZvaWQgX3Jlc2Nhbl9lbnRyeShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCisJaWYgKGluZm8tPnN0YXR1cyAmIENBQ0hFX0lOVkFMSUQpCisJCSh2b2lkKSBsYWJlbF9yZWFkKGluZm8tPmRldiwgJmxhYmVsLCBVSU5UNjRfQygwKSk7Cit9CisKK3N0YXRpYyBpbnQgX3NjYW5faW52YWxpZCh2b2lkKQoreworCWRtX2hhc2hfaXRlcihfcHZpZF9oYXNoLCAoZG1faGFzaF9pdGVyYXRlX2ZuKSBfcmVzY2FuX2VudHJ5KTsKKworCXJldHVybiAxOworfQorCisvKgorICogbHZtY2FjaGVfbGFiZWxfc2NhbigpIHJlbWVtYmVycyB0aGF0IGl0IGhhcyBhbHJlYWR5CisgKiBiZWVuIGNhbGxlZCwgYW5kIHdpbGwgbm90IHNjYW4gbGFiZWxzIGlmIGl0J3MgY2FsbGVkCisgKiBhZ2Fpbi4gIChJdCB3aWxsIHJlc2NhbiAiSU5WQUxJRCIgZGV2aWNlcyBpZiBjYWxsZWQgYWdhaW4uKQorICoKKyAqIFRvIGZvcmNlIGx2bWNhY2hlX2xhYmVsX3NjYW4oKSB0byByZXNjYW4gbGFiZWxzIG9uIGFsbCBkZXZpY2VzLAorICogY2FsbCBsdm1jYWNoZV9mb3JjZV9uZXh0X2xhYmVsX3NjYW4oKSBiZWZvcmUgY2FsbGluZworICogbHZtY2FjaGVfbGFiZWxfc2NhbigpLgorICovCisKK3N0YXRpYyBpbnQgX2ZvcmNlX2xhYmVsX3NjYW47CisKK3ZvaWQgbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKHZvaWQpCit7CisJX2ZvcmNlX2xhYmVsX3NjYW4gPSAxOworfQorCisvKgorICogQ2hlY2sgaWYgYW55IFBWcyBpbiB2Zy0+cHZzIGhhdmUgdGhlIHNhbWUgUFZJRCBhcyBhbnkKKyAqIGVudHJpZXMgaW4gX3VudXNlZF9kdXBsaWNhdGVfZGV2aWNlcy4KKyAqLworCitpbnQgdmdfaGFzX2R1cGxpY2F0ZV9wdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGV2bCwgJl91bnVzZWRfZHVwbGljYXRlX2RldnMpIHsKKwkJCWlmIChpZF9lcXVhbCgmcHZsLT5wdi0+aWQsIChjb25zdCBzdHJ1Y3QgaWQgKilkZXZsLT5kZXYtPnB2aWQpKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kZXZfaW5fZGV2aWNlX2xpc3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGV2bCwgaGVhZCkgeworCQlpZiAoZGV2bC0+ZGV2ID09IGRldikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGx2bWNhY2hlX2Rldl9pc191bmNob3Nlbl9kdXBsaWNhdGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfZGV2X2luX2RldmljZV9saXN0KGRldiwgJl91bnVzZWRfZHVwbGljYXRlX2RldnMpOworfQorCisvKgorICogQ29tcGFyZSBfZm91bmRfZHVwbGljYXRlX2RldnMgZW50cmllcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGR1cGxpY2F0ZSBkZXYKKyAqIGluIGx2bWNhY2hlLiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIGR1cGxpY2F0ZXMgaW4gX2ZvdW5kX2R1cGxpY2F0ZV9kZXZzIGZvcgorICogYSBnaXZlbiBwdmlkLiAgSWYgYSBkZXYgZnJvbSBfZm91bmRfZHVwbGljYXRlX2RldnMgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGRldgorICogaW4gbHZtY2FjaGUsIHRoZW4gZHJvcCB0aGUgZGV2IGluIGx2bWNhY2hlIGFuZCByZXNjYW4gdGhlIHByZWZlcnJlZCBkZXYgdG8KKyAqIGFkZCBpdCB0byBsdm1jYWNoZS4KKyAqCisgKiBfZm91bmRfZHVwbGljYXRlX2RldnM6IGR1cGxpY2F0ZSBkZXZzIGZvdW5kIGR1cmluZyBpbml0aWFsIHNjYW4uCisgKiBUaGVzZSBhcmUgY29tcGFyZWQgdG8gbHZtY2FjaGUgZGV2cyB0byBzZWUgaWYgYW55IGFyZSBwcmVmZXJyZWQuCisgKgorICogX3VudXNlZF9kdXBsaWNhdGVfZGV2czogZHVwbGljYXRlIGRldnMgbm90IGNob3NlbiB0byBiZSB1c2VkLgorICogVGhlc2UgYXJlIF9mb3VuZF9kdXBsaWNhdGVfZGV2cyBlbnRyaWVzIHRoYXQgd2VyZSBub3QgY2hvc2VuLAorICogb3IgdW5wcmVmZXJyZWQgbHZtY2FjaGUgZGV2cyB0aGF0IHdlcmUgZHJvcHBlZC4KKyAqCisgKiBkZWxfY2FjaGVfZGV2czogZGV2aWNlcyB0byBkcm9wIGZyb20gbHZtY2FjaGUKKyAqIGFkZF9jYWNoZV9kZXZzOiBkZXZpY2VzIHRvIHNjYW4gdG8gYWRkIHRvIGx2bWNhY2hlCisgKi8KKworc3RhdGljIHZvaWQgX2Nob29zZV9wcmVmZXJyZWRfZGV2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqZGVsX2NhY2hlX2RldnMsCisJCQkJICAgc3RydWN0IGRtX2xpc3QgKmFkZF9jYWNoZV9kZXZzKQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWNvbnN0IGNoYXIgKnJlYXNvbiA9ICJub25lIjsKKwlzdHJ1Y3QgZG1fbGlzdCBhbHRkZXZzOworCXN0cnVjdCBkbV9saXN0IG5ld191bnVzZWQ7CisJc3RydWN0IGRldl90eXBlcyAqZHQgPSBjbWQtPmRldl90eXBlczsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmwsICpkZXZsX3NhZmUsICphbHQsICpkZWw7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IGRldmljZSAqZGV2MSwgKmRldjI7CisJdWludDMyX3QgZGV2MV9tYWpvciwgZGV2MV9taW5vciwgZGV2Ml9tYWpvciwgZGV2Ml9taW5vcjsKKwl1aW50NjRfdCBpbmZvX3NpemUsIGRldjFfc2l6ZSwgZGV2Ml9zaXplOworCWludCBpbl9zdWJzeXMxLCBpbl9zdWJzeXMyOworCWludCBpc19kbTEsIGlzX2RtMjsKKwlpbnQgaGFzX2ZzMSwgaGFzX2ZzMjsKKwlpbnQgaGFzX2x2MSwgaGFzX2x2MjsKKwlpbnQgc2FtZV9zaXplMSwgc2FtZV9zaXplMjsKKwlpbnQgcHJldl91bmNob3NlbjEsIHByZXZfdW5jaG9zZW4yOworCWludCBjaGFuZ2U7CisKKwlkbV9saXN0X2luaXQoJm5ld191bnVzZWQpOworCisJLyoKKwkgKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCBhbHRlcm5hdGUgZGV2cyBmb3IgdGhlIHNhbWUgcHZpZDogYWx0ZGV2cy4KKwkgKi8KK25leHQ6CisJZG1fbGlzdF9pbml0KCZhbHRkZXZzKTsKKwlhbHQgPSBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZGV2bCwgZGV2bF9zYWZlLCAmX2ZvdW5kX2R1cGxpY2F0ZV9kZXZzKSB7CisJCWlmICghYWx0KSB7CisJCQlkbV9saXN0X21vdmUoJmFsdGRldnMsICZkZXZsLT5saXN0KTsKKwkJCWFsdCA9IGRldmw7CisJCX0gZWxzZSB7CisJCQlpZiAoIXN0cmNtcChhbHQtPmRldi0+cHZpZCwgZGV2bC0+ZGV2LT5wdmlkKSkKKwkJCQlkbV9saXN0X21vdmUoJmFsdGRldnMsICZkZXZsLT5saXN0KTsKKwkJfQorCX0KKworCWlmICghYWx0KSB7CisJCV9kZXN0cm95X2R1cGxpY2F0ZV9kZXZpY2VfbGlzdCgmX3VudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisJCWRtX2xpc3Rfc3BsaWNlKCZfdW51c2VkX2R1cGxpY2F0ZV9kZXZzLCAmbmV3X3VudXNlZCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEZpbmQgdGhlIGRldmljZSBmb3IgdGhlIHB2aWQgdGhhdCdzIGN1cnJlbnRseSBpbiBsdm1jYWNoZS4KKwkgKi8KKworCWlmICghKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChhbHQtPmRldi0+cHZpZCwgTlVMTCwgMCkpKSB7CisJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgb24gZHVwbGljYXRlIGRldmljZSAlcyBub3QgZm91bmQgaW4gY2FjaGUuIiwKKwkJCSBhbHQtPmRldi0+cHZpZCwgZGV2X25hbWUoYWx0LT5kZXYpKTsKKwkJZ290byBuZXh0OworCX0KKworCS8qCisJICogQ29tcGFyZSBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gcHZpZCB0byBmaW5kIG9uZSB0aGF0J3MgcHJlZmVycmVkLgorCSAqICJkZXYxIiBpcyB0aGUgY3VycmVudGx5IHByZWZlcnJlZCBkZXZpY2UsIHN0YXJ0aW5nIHdpdGggdGhlIGRldmljZQorCSAqIGN1cnJlbnRseSBpbiBsdm1jYWNoZS4KKwkgKi8KKworCWRldjEgPSBpbmZvLT5kZXY7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGV2bCwgJmFsdGRldnMpIHsKKwkJZGV2MiA9IGRldmwtPmRldjsKKworCQlpZiAoZGV2MSA9PSBkZXYyKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCWxvZ193YXJuKCJTYW1lIGR1cGxpY2F0ZSBkZXZpY2UgcmVwZWF0ZWQgJXMiLCBkZXZfbmFtZShkZXYxKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByZXZfdW5jaG9zZW4xID0gX2Rldl9pbl9kZXZpY2VfbGlzdChkZXYxLCAmX3VudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisJCXByZXZfdW5jaG9zZW4yID0gX2Rldl9pbl9kZXZpY2VfbGlzdChkZXYyLCAmX3VudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisKKwkJaWYgKCFwcmV2X3VuY2hvc2VuMSAmJiAhcHJldl91bmNob3NlbjIpIHsKKwkJCS8qCisJCQkgKiBUaGUgY21kIGxpc3Qgc2F2ZXMgdGhlIHVuY2hvc2VuIHByZWZlcmVuY2UgYWNyb3NzCisJCQkgKiBsdm1jYWNoZV9kZXN0cm95LiAgU29tZXRpbWVzIGEgc2luZ2xlIGNvbW1hbmQgd2lsbAorCQkJICogZmlsbCBsdm1jYWNoZSwgZGVzdHJveSBpdCwgYW5kIHJlZmlsbCBpdCwgYW5kIHdlCisJCQkgKiB3YW50IHRoZSBzYW1lIGR1cGxpY2F0ZSBwcmVmZXJlbmNlIHRvIGJlIHByZXNlcnZlZAorCQkJICogaW4gZWFjaCBpbnN0YW5jZSBvZiBsdm1jYWNoZSBmb3IgYSBzaW5nbGUgY29tbWFuZC4KKwkJCSAqLworCQkJcHJldl91bmNob3NlbjEgPSBfZGV2X2luX2RldmljZV9saXN0KGRldjEsICZjbWQtPnVudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisJCQlwcmV2X3VuY2hvc2VuMiA9IF9kZXZfaW5fZGV2aWNlX2xpc3QoZGV2MiwgJmNtZC0+dW51c2VkX2R1cGxpY2F0ZV9kZXZzKTsKKwkJfQorCisJCWRldjFfbWFqb3IgPSBNQUpPUihkZXYxLT5kZXYpOworCQlkZXYxX21pbm9yID0gTUlOT1IoZGV2MS0+ZGV2KTsKKwkJZGV2Ml9tYWpvciA9IE1BSk9SKGRldjItPmRldik7CisJCWRldjJfbWlub3IgPSBNSU5PUihkZXYyLT5kZXYpOworCisJCWlmICghZGV2X2dldF9zaXplKGRldjEsICZkZXYxX3NpemUpKQorCQkJZGV2MV9zaXplID0gMDsKKwkJaWYgKCFkZXZfZ2V0X3NpemUoZGV2MiwgJmRldjJfc2l6ZSkpCisJCQlkZXYyX3NpemUgPSAwOworCisJCWhhc19sdjEgPSAoZGV2MS0+ZmxhZ3MgJiBERVZfVVNFRF9GT1JfTFYpID8gMSA6IDA7CisJCWhhc19sdjIgPSAoZGV2Mi0+ZmxhZ3MgJiBERVZfVVNFRF9GT1JfTFYpID8gMSA6IDA7CisKKwkJaW5fc3Vic3lzMSA9IGRldl9zdWJzeXN0ZW1fcGFydF9tYWpvcihkdCwgZGV2MSk7CisJCWluX3N1YnN5czIgPSBkZXZfc3Vic3lzdGVtX3BhcnRfbWFqb3IoZHQsIGRldjIpOworCisJCWlzX2RtMSA9IGRtX2lzX2RtX21ham9yKGRldjFfbWFqb3IpOworCQlpc19kbTIgPSBkbV9pc19kbV9tYWpvcihkZXYyX21ham9yKTsKKworCQloYXNfZnMxID0gZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzKGRldjFfbWFqb3IsIGRldjFfbWlub3IpOworCQloYXNfZnMyID0gZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzKGRldjJfbWFqb3IsIGRldjJfbWlub3IpOworCisJCWluZm9fc2l6ZSA9IGluZm8tPmRldmljZV9zaXplID4+IFNFQ1RPUl9TSElGVDsKKwkJc2FtZV9zaXplMSA9IChkZXYxX3NpemUgPT0gaW5mb19zaXplKTsKKwkJc2FtZV9zaXplMiA9IChkZXYyX3NpemUgPT0gaW5mb19zaXplKTsKKworCQlsb2dfZGVidWdfY2FjaGUoIlBWICVzIGNvbXBhcmUgZHVwbGljYXRlczogJXMgJXU6JXUuICVzICV1OiV1LiIsCisJCQkJZGV2bC0+ZGV2LT5wdmlkLAorCQkJCWRldl9uYW1lKGRldjEpLCBkZXYxX21ham9yLCBkZXYxX21pbm9yLAorCQkJCWRldl9uYW1lKGRldjIpLCBkZXYyX21ham9yLCBkZXYyX21pbm9yKTsKKworCQlsb2dfZGVidWdfY2FjaGUoIlBWICVzOiB3YW50cyBzaXplICVsbHUuICVzIGlzICVsbHUuICVzIGlzICVsbHUuIiwKKwkJCQlkZXZsLT5kZXYtPnB2aWQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpbmZvX3NpemUsCisJCQkJZGV2X25hbWUoZGV2MSksICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2MV9zaXplLAorCQkJCWRldl9uYW1lKGRldjIpLCAodW5zaWduZWQgbG9uZyBsb25nKWRldjJfc2l6ZSk7CisKKwkJbG9nX2RlYnVnX2NhY2hlKCJQViAlczogJXMgd2FzIHByZXYgJXMuICVzIHdhcyBwcmV2ICVzLiIsCisJCQkJZGV2bC0+ZGV2LT5wdmlkLAorCQkJCWRldl9uYW1lKGRldjEpLCBwcmV2X3VuY2hvc2VuMSA/ICJub3QgY2hvc2VuIiA6ICI8bm9uZT4iLAorCQkJCWRldl9uYW1lKGRldjIpLCBwcmV2X3VuY2hvc2VuMiA/ICJub3QgY2hvc2VuIiA6ICI8bm9uZT4iKTsKKworCQlsb2dfZGVidWdfY2FjaGUoIlBWICVzOiAlcyAlcyBzdWJzeXN0ZW0uICVzICVzIHN1YnN5c3RlbS4iLAorCQkJCWRldmwtPmRldi0+cHZpZCwKKwkJCQlkZXZfbmFtZShkZXYxKSwgaW5fc3Vic3lzMSA/ICJpcyBpbiIgOiAiaXMgbm90IGluIiwKKwkJCQlkZXZfbmFtZShkZXYyKSwgaW5fc3Vic3lzMiA/ICJpcyBpbiIgOiAiaXMgbm90IGluIik7CisKKwkJbG9nX2RlYnVnX2NhY2hlKCJQViAlczogJXMgJXMgZG0uICVzICVzIGRtLiIsCisJCQkJZGV2bC0+ZGV2LT5wdmlkLAorCQkJCWRldl9uYW1lKGRldjEpLCBpc19kbTEgPyAiaXMiIDogImlzIG5vdCIsCisJCQkJZGV2X25hbWUoZGV2MiksIGlzX2RtMiA/ICJpcyIgOiAiaXMgbm90Iik7CisKKwkJbG9nX2RlYnVnX2NhY2hlKCJQViAlczogJXMgJXMgbW91bnRlZCBmcy4gJXMgJXMgbW91bnRlZCBmcy4iLAorCQkJCWRldmwtPmRldi0+cHZpZCwKKwkJCQlkZXZfbmFtZShkZXYxKSwgaGFzX2ZzMSA/ICJoYXMiIDogImhhcyBubyIsCisJCQkJZGV2X25hbWUoZGV2MiksIGhhc19mczIgPyAiaGFzIiA6ICJoYXMgbm8iKTsKKworCQlsb2dfZGVidWdfY2FjaGUoIlBWICVzOiAlcyAlcyBMVi4gJXMgJXMgTFYuIiwKKwkJCQlkZXZsLT5kZXYtPnB2aWQsCisJCQkJZGV2X25hbWUoZGV2MSksIGhhc19sdjEgPyAiaXMgdXNlZCBmb3IiIDogImlzIG5vdCB1c2VkIGZvciIsCisJCQkJZGV2X25hbWUoZGV2MiksIGhhc19sdjIgPyAiaXMgdXNlZCBmb3IiIDogImlzIG5vdCB1c2VkIGZvciIpOworCisJCWNoYW5nZSA9IDA7CisKKwkJaWYgKHByZXZfdW5jaG9zZW4xICYmICFwcmV2X3VuY2hvc2VuMikgeworCQkJLyogY2hhbmdlIHRvIDIgKE5CIHdoZW4gdW5jaG9zZW4gaXMgc2V0IHdlIHVucHJlZmVyKSAqLworCQkJY2hhbmdlID0gMTsKKwkJCXJlYXNvbiA9ICJvZiBwcmV2aW91cyBwcmVmZXJlbmNlIjsKKwkJfSBlbHNlIGlmIChwcmV2X3VuY2hvc2VuMiAmJiAhcHJldl91bmNob3NlbjEpIHsKKwkJCS8qIGtlZXAgMSAoTkIgd2hlbiB1bmNob3NlbiBpcyBzZXQgd2UgdW5wcmVmZXIpICovCisJCQlyZWFzb24gPSAib2YgcHJldmlvdXMgcHJlZmVyZW5jZSI7CisJCX0gZWxzZSBpZiAoaGFzX2x2MSAmJiAhaGFzX2x2MikgeworCQkJLyoga2VlcCAxICovCisJCQlyZWFzb24gPSAiZGV2aWNlIGlzIHVzZWQgYnkgTFYiOworCQl9IGVsc2UgaWYgKGhhc19sdjIgJiYgIWhhc19sdjEpIHsKKwkJCS8qIGNoYW5nZSB0byAyICovCisJCQljaGFuZ2UgPSAxOworCQkJcmVhc29uID0gImRldmljZSBpcyB1c2VkIGJ5IExWIjsKKwkJfSBlbHNlIGlmIChzYW1lX3NpemUxICYmICFzYW1lX3NpemUyKSB7CisJCQkvKiBrZWVwIDEgKi8KKwkJCXJlYXNvbiA9ICJkZXZpY2Ugc2l6ZSBpcyBjb3JyZWN0IjsKKwkJfSBlbHNlIGlmIChzYW1lX3NpemUyICYmICFzYW1lX3NpemUxKSB7CisJCQkvKiBjaGFuZ2UgdG8gMiAqLworCQkJY2hhbmdlID0gMTsKKwkJCXJlYXNvbiA9ICJkZXZpY2Ugc2l6ZSBpcyBjb3JyZWN0IjsKKwkJfSBlbHNlIGlmIChoYXNfZnMxICYmICFoYXNfZnMyKSB7CisJCQkvKiBrZWVwIDEgKi8KKwkJCXJlYXNvbiA9ICJkZXZpY2UgaGFzIGZzIG1vdW50ZWQiOworCQl9IGVsc2UgaWYgKGhhc19mczIgJiYgIWhhc19mczEpIHsKKwkJCS8qIGNoYW5nZSB0byAyICovCisJCQljaGFuZ2UgPSAxOworCQkJcmVhc29uID0gImRldmljZSBoYXMgZnMgbW91bnRlZCI7CisJCX0gZWxzZSBpZiAoaXNfZG0xICYmICFpc19kbTIpIHsKKwkJCS8qIGtlZXAgMSAqLworCQkJcmVhc29uID0gImRldmljZSBpcyBpbiBkbSBzdWJzeXN0ZW0iOworCQl9IGVsc2UgaWYgKGlzX2RtMiAmJiAhaXNfZG0xKSB7CisJCQkvKiBjaGFuZ2UgdG8gMiAqLworCQkJY2hhbmdlID0gMTsKKwkJCXJlYXNvbiA9ICJkZXZpY2UgaXMgaW4gZG0gc3Vic3lzdGVtIjsKKwkJfSBlbHNlIGlmIChpbl9zdWJzeXMxICYmICFpbl9zdWJzeXMyKSB7CisJCQkvKiBrZWVwIDEgKi8KKwkJCXJlYXNvbiA9ICJkZXZpY2UgaXMgaW4gc3Vic3lzdGVtIjsKKwkJfSBlbHNlIGlmIChpbl9zdWJzeXMyICYmICFpbl9zdWJzeXMxKSB7CisJCQkvKiBjaGFuZ2UgdG8gMiAqLworCQkJY2hhbmdlID0gMTsKKwkJCXJlYXNvbiA9ICJkZXZpY2UgaXMgaW4gc3Vic3lzdGVtIjsKKwkJfSBlbHNlIHsKKwkJCXJlYXNvbiA9ICJkZXZpY2Ugd2FzIHNlZW4gZmlyc3QiOworCQl9CisKKwkJaWYgKGNoYW5nZSkgeworCQkJZGV2MSA9IGRldjI7CisJCQlhbHQgPSBkZXZsOworCQl9CisKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoKGNvbnN0IHN0cnVjdCBpZCAqKWRldjEtPnB2aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCQlzdGFjazsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFBWICVzIHByZWZlcnMgZGV2aWNlICVzIGJlY2F1c2UgJXMuIiwgdXVpZCwgZGV2X25hbWUoZGV2MSksIHJlYXNvbik7CisJfQorCisJaWYgKGRldjEgIT0gaW5mby0+ZGV2KSB7CisJCWxvZ19kZWJ1Z19jYWNoZSgiUFYgJXM6IHN3aXRjaGluZyB0byBkZXZpY2UgJXMgaW5zdGVhZCBvZiBkZXZpY2UgJXMuIiwKKwkJCQkgZGV2MS0+cHZpZCwgZGV2X25hbWUoZGV2MSksIGRldl9uYW1lKGluZm8tPmRldikpOworCQkvKgorCQkgKiBNb3ZlIHRoZSBwcmVmZXJyZWQgZGV2aWNlIGZyb20gYWx0ZGV2cyB0byBhZGRfY2FjaGVfZGV2cy4KKwkJICogQ3JlYXRlIGEgZGVsX2NhY2hlX2RldnMgZW50cnkgZm9yIHRoZSBjdXJyZW50IGx2bWNhY2hlCisJCSAqIGRldmljZSB0byBkcm9wLgorCQkgKi8KKworCQlkbV9saXN0X21vdmUoYWRkX2NhY2hlX2RldnMsICZhbHQtPmxpc3QpOworCisJCWlmICgoZGVsID0gZG1femFsbG9jKHNpemVvZigqZGVsKSkpKSB7CisJCQlkZWwtPmRldiA9IGluZm8tPmRldjsKKwkJCWRtX2xpc3RfYWRkKGRlbF9jYWNoZV9kZXZzLCAmZGVsLT5saXN0KTsKKwkJfQorCisJfSBlbHNlIHsKKwkJbG9nX2RlYnVnX2NhY2hlKCJQViAlczoga2VlcGluZyBjdXJyZW50IGRldmljZSAlcy4iLCBkZXYxLT5wdmlkLCBkZXZfbmFtZShpbmZvLT5kZXYpKTsKKwl9CisKKwkvKgorCSAqIGFsdCBkZXZzIG5vdCBjaG9zZW4gYXJlIG1vdmVkIHRvIF91bnVzZWRfZHVwbGljYXRlX2RldnMuCisJICogZGVsX2NhY2hlX2RldnMgYmVpbmcgZHJvcHBlZCBhcmUgbW92ZWQgdG8gX3VudXNlZF9kdXBsaWNhdGVfZGV2cworCSAqIGFmdGVyIGJlaW5nIGRyb3BwZWQuICBTbywgX3VudXNlZF9kdXBsaWNhdGVfZGV2cyByZXByZXNlbnRzIGFsbAorCSAqIGR1cGxpY2F0ZXMgbm90IGJlaW5nIHVzZWQgaW4gbHZtY2FjaGUuCisJICovCisKKwlkbV9saXN0X3NwbGljZSgmbmV3X3VudXNlZCwgJmFsdGRldnMpOworCisJZ290byBuZXh0OworfQorCitpbnQgbHZtY2FjaGVfbGFiZWxfc2NhbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCBkZWxfY2FjaGVfZGV2czsKKwlzdHJ1Y3QgZG1fbGlzdCBhZGRfY2FjaGVfZGV2czsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisJc3RydWN0IGxhYmVsICpsYWJlbDsKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBmb3JtYXRfdHlwZSAqZm10OworCWludCBkZXZfY291bnQgPSAwOworCisJaW50IHIgPSAwOworCisJaWYgKGx2bWV0YWRfdXNlZCgpKQorCQlyZXR1cm4gMTsKKworCS8qIEF2b2lkIHJlY3Vyc2lvbiB3aGVuIGEgUFZJRCBjYW4ndCBiZSBmb3VuZCEgKi8KKwlpZiAoX3NjYW5uaW5nX2luX3Byb2dyZXNzKQorCQlyZXR1cm4gMDsKKworCV9zY2FubmluZ19pbl9wcm9ncmVzcyA9IDE7CisKKwlpZiAoIV92Z25hbWVfaGFzaCAmJiAhbHZtY2FjaGVfaW5pdCgpKSB7CisJCWxvZ19lcnJvcigiSW50ZXJuYWwgY2FjaGUgaW5pdGlhbGlzYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChfaGFzX3NjYW5uZWQgJiYgIV9mb3JjZV9sYWJlbF9zY2FuKSB7CisJCXIgPSBfc2Nhbl9pbnZhbGlkKCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChfZm9yY2VfbGFiZWxfc2NhbiAmJiAoY21kLT5mdWxsX2ZpbHRlciAmJiAhY21kLT5mdWxsX2ZpbHRlci0+dXNlX2NvdW50KSAmJiAhcmVmcmVzaF9maWx0ZXJzKGNtZCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFjbWQtPmZ1bGxfZmlsdGVyIHx8ICEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShjbWQtPmZ1bGxfZmlsdGVyLCBfZm9yY2VfbGFiZWxfc2NhbikpKSB7CisJCWxvZ19lcnJvcigiZGV2X2l0ZXIgY3JlYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlNjYW5uaW5nIGRldmljZSBsYWJlbHMiKTsKKworCS8qCisJICogRHVwbGljYXRlcyBmb3VuZCBkdXJpbmcgdGhpcyBsYWJlbCBzY2FuIGFyZSBhZGRlZCB0byBfZm91bmRfZHVwbGljYXRlX2RldnMoKS4KKwkgKi8KKwlfZGVzdHJveV9kdXBsaWNhdGVfZGV2aWNlX2xpc3QoJl9mb3VuZF9kdXBsaWNhdGVfZGV2cyk7CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpIHsKKwkJKHZvaWQpIGxhYmVsX3JlYWQoZGV2LCAmbGFiZWwsIFVJTlQ2NF9DKDApKTsKKwkJZGV2X2NvdW50Kys7CisJfQorCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlNjYW5uZWQgJWQgZGV2aWNlIGxhYmVscyIsIGRldl9jb3VudCk7CisKKwkvKgorCSAqIF9jaG9vc2VfcHJlZmVycmVkX2RldnMoKSByZXR1cm5zOgorCSAqCisJICogLiBkZWxfY2FjaGVfZGV2czogYSBsaXN0IG9mIGRldnMgY3VycmVudGx5IGluIGx2bWNhY2hlIHRoYXQgc2hvdWxkCisJICogYmUgcmVtb3ZlZCBmcm9tIGx2bWNhY2hlIGJlY2F1c2UgdGhleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKKwkgKiBhbHRlcm5hdGl2ZSBkZXZzIGZvciB0aGUgc2FtZSBQVi4KKwkgKgorCSAqIC4gYWRkX2NhY2hlX2RldnM6IGEgbGlzdCBvZiBkZXZzIHRoYXQgYXJlIHByZWZlcnJlZCBvdmVyIGRldnMgaW4KKwkgKiBsdm1jYWNoZSBmb3IgdGhlIHNhbWUgUFYuICBUaGVzZSBkZXZpY2VzIHNob3VsZCBiZSByZXNjYW5uZWQgdG8KKwkgKiBwb3B1bGF0ZSBsdm1jYWNoZSBmcm9tIHRoZW0uCisJICoKKwkgKiBGaXJzdCByZW1vdmUgbHZtY2FjaGUgaW5mbyBmb3IgdGhlIGRldnMgdG8gYmUgZHJvcHBlZCwgdGhlbiByZXNjYW4KKwkgKiB0aGUgZGV2cyB0aGF0IGFyZSBwcmVmZXJyZWQgdG8gYWRkIHRoZW0gdG8gbHZtY2FjaGUuCisJICoKKwkgKiBLZWVwIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgZGV2cyB0aGF0IGFyZSB1bnVzZWQgYnkgbW92aW5nIHRoZQorCSAqIGRlbF9jYWNoZV9kZXZzIG9udG8gX3VudXNlZF9kdXBsaWNhdGVfZGV2cy4KKwkgKi8KKworCWlmICghZG1fbGlzdF9lbXB0eSgmX2ZvdW5kX2R1cGxpY2F0ZV9kZXZzKSkgeworCQlkbV9saXN0X2luaXQoJmRlbF9jYWNoZV9kZXZzKTsKKwkJZG1fbGlzdF9pbml0KCZhZGRfY2FjaGVfZGV2cyk7CisKKwkJX2Nob29zZV9wcmVmZXJyZWRfZGV2cyhjbWQsICZkZWxfY2FjaGVfZGV2cywgJmFkZF9jYWNoZV9kZXZzKTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGV2bCwgJmRlbF9jYWNoZV9kZXZzKSB7CisJCQlsb2dfZGVidWdfY2FjaGUoIkRyb3AgZHVwbGljYXRlIGRldmljZSAlcyBpbiBsdm1jYWNoZSIsIGRldl9uYW1lKGRldmwtPmRldikpOworCQkJaWYgKChpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoZGV2bC0+ZGV2LT5wdmlkLCBOVUxMLCAwKSkpCisJCQkJbHZtY2FjaGVfZGVsKGluZm8pOworCQl9CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRldmwsICZhZGRfY2FjaGVfZGV2cykgeworCQkJbG9nX2RlYnVnX2NhY2hlKCJSZXNjYW4gcHJlZmVycmVkIGRldmljZSAlcyBmb3IgbHZtY2FjaGUiLCBkZXZfbmFtZShkZXZsLT5kZXYpKTsKKwkJCSh2b2lkKSBsYWJlbF9yZWFkKGRldmwtPmRldiwgJmxhYmVsLCBVSU5UNjRfQygwKSk7CisJCX0KKworCQlkbV9saXN0X3NwbGljZSgmX3VudXNlZF9kdXBsaWNhdGVfZGV2cywgJmRlbF9jYWNoZV9kZXZzKTsKKwl9CisKKwlfaGFzX3NjYW5uZWQgPSAxOworCisJLyogUGVyZm9ybSBhbnkgZm9ybWF0LXNwZWNpZmljIHNjYW5uaW5nIGUuZy4gdGV4dCBmaWxlcyAqLworCWlmIChjbWQtPmluZGVwZW5kZW50X21ldGFkYXRhX2FyZWFzKQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZm10LCAmY21kLT5mb3JtYXRzKQorCQkJaWYgKGZtdC0+b3BzLT5zY2FuICYmICFmbXQtPm9wcy0+c2NhbihmbXQsIE5VTEwpKQorCQkJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB3ZSBhcmUgYSBsb25nLWxpdmVkIHByb2Nlc3MsIHdyaXRlIG91dCB0aGUgdXBkYXRlZCBwZXJzaXN0ZW50CisJICogZGV2aWNlIGNhY2hlIGZvciB0aGUgYmVuZWZpdCBvZiBzaG9ydC1saXZlZCBwcm9jZXNzZXMuCisJICovCisJaWYgKF9mb3JjZV9sYWJlbF9zY2FuICYmIGNtZC0+aXNfbG9uZ19saXZlZCAmJgorCSAgICBjbWQtPmR1bXBfZmlsdGVyICYmIGNtZC0+ZnVsbF9maWx0ZXIgJiYgY21kLT5mdWxsX2ZpbHRlci0+ZHVtcCAmJgorCSAgICAhY21kLT5mdWxsX2ZpbHRlci0+ZHVtcChjbWQtPmZ1bGxfZmlsdGVyLCAwKSkKKwkJc3RhY2s7CisKKwlyID0gMTsKKworICAgICAgb3V0OgorCV9zY2FubmluZ19pbl9wcm9ncmVzcyA9IDA7CisJX2ZvcmNlX2xhYmVsX3NjYW4gPSAwOworCisJcmV0dXJuIHI7Cit9CisKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKmx2bWNhY2hlX2dldF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmduYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqdmdpZCwgdW5zaWduZWQgcHJlY29tbWl0dGVkKQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IE5VTEw7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4IGZpYzsKKworCS8qCisJICogV2UgY3VycmVudGx5IGRvIG5vdCBzdG9yZSBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaW4gbHZtZXRhZCBhdAorCSAqIGFsbC4gVGhpcyBtZWFucyB0aGF0IGFueSByZXF1ZXN0IGZvciBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaXMgc2VydmVkCisJICogdXNpbmcgdGhlIGNsYXNzaWMgc2Nhbm5pbmcgbWVjaGFuaWNzLCBhbmQgcmVhZCBmcm9tIGRpc2sgb3IgZnJvbQorCSAqIGx2bWNhY2hlLgorCSAqLworCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAhcHJlY29tbWl0dGVkKSB7CisJCS8qIFN0aWxsIHNlcnZlIHRoZSBsb2NhbGx5IGNhY2hlZCBWRyBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKHZnaWQgJiYgKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnaWQodmdpZCkpICYmCisJCSAgICB2Z2luZm8tPnZnbWV0YWRhdGEgJiYgKHZnID0gdmdpbmZvLT5jYWNoZWRfdmcpKQorCQkJZ290byBvdXQ7CisJCXJldHVybiBsdm1ldGFkX3ZnX2xvb2t1cChjbWQsIHZnbmFtZSwgdmdpZCk7CisJfQorCisJaWYgKCF2Z2lkIHx8ICEodmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmdpZCh2Z2lkKSkgfHwgIXZnaW5mby0+dmdtZXRhZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIV92Z2luZm9faXNfdmFsaWQodmdpbmZvKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIERvbid0IHJldHVybiBjYWNoZWQgZGF0YSBpZiBlaXRoZXI6CisJICogKGkpICBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaXMgcmVxdWVzdGVkIGJ1dCB3ZSBkb24ndCBoYXZlIGl0IGNhY2hlZAorCSAqICAgICAgLSBjYWxsZXIgc2hvdWxkIHJlYWQgaXQgb2ZmIGRpc2s7CisJICogKGlpKSBsaXZlIG1ldGFkYXRhIGlzIHJlcXVlc3RlZCBidXQgd2UgaGF2ZSBwcmVjb21taXR0ZWQgbWV0YWRhdGEgY2FjaGVkCisJICogICAgICBhbmQgbm8gZGV2aWNlcyBhcmUgc3VzcGVuZGVkIHNvIGNhbGxlciBtYXkgcmVhZCBpdCBvZmYgZGlzay4KKwkgKgorCSAqIElmIGxpdmUgbWV0YWRhdGEgaXMgcmVxdWVzdGVkIGJ1dCB3ZSBoYXZlIHByZWNvbW1pdHRlZCBtZXRhZGF0YSBjYWNoZWQKKwkgKiBhbmQgZGV2aWNlcyBhcmUgc3VzcGVuZGVkLCB3ZSBhc3N1bWUgdGhpcyBwcmVjb21taXR0ZWQgbWV0YWRhdGEgaGFzCisJICogYWxyZWFkeSBiZWVuIHByZWxvYWRlZCBhbmQgY29tbWl0dGVkIHNvIGl0J3MgT0sgdG8gcmV0dXJuIGl0IGFzIGxpdmUuCisJICogTm90ZSB0aGF0IHdlIGRvIG5vdCBjbGVhciB0aGUgUFJFQ09NTUlUVEVEIGZsYWcuCisJICovCisJaWYgKChwcmVjb21taXR0ZWQgJiYgIXZnaW5mby0+cHJlY29tbWl0dGVkKSB8fAorCSAgICAoIXByZWNvbW1pdHRlZCAmJiB2Z2luZm8tPnByZWNvbW1pdHRlZCAmJiAhY3JpdGljYWxfc2VjdGlvbigpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBVc2UgYWxyZWFkeS1jYWNoZWQgVkcgc3RydWN0IHdoZW4gYXZhaWxhYmxlICovCisJaWYgKCh2ZyA9IHZnaW5mby0+Y2FjaGVkX3ZnKSAmJiAhdmdpbmZvLT5jYWNoZWRfdmdfaW52YWxpZGF0ZWQpCisJCWdvdG8gb3V0OworCisJcmVsZWFzZV92Zyh2Z2luZm8tPmNhY2hlZF92Zyk7CisKKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9NREFTIHwgRk1UX0lOU1RBTkNFX0FVWF9NREFTOworCWZpYy5jb250ZXh0LnZnX3JlZi52Z19uYW1lID0gdmdpbmZvLT52Z25hbWU7CisJZmljLmNvbnRleHQudmdfcmVmLnZnX2lkID0gdmdpZDsKKwlpZiAoIShmaWQgPSB2Z2luZm8tPmZtdC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UodmdpbmZvLT5mbXQsICZmaWMpKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBCdWlsZCBjb25maWcgdHJlZSBmcm9tIHZnbWV0YWRhdGEsIGlmIG5vdCB5ZXQgY2FjaGVkICovCisJaWYgKCF2Z2luZm8tPmNmdCAmJgorCSAgICAhKHZnaW5mby0+Y2Z0ID0KKwkgICAgICBkbV9jb25maWdfZnJvbV9zdHJpbmcodmdpbmZvLT52Z21ldGFkYXRhKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCEodmcgPSBpbXBvcnRfdmdfZnJvbV9jb25maWdfdHJlZSh2Z2luZm8tPmNmdCwgZmlkKSkpCisJCWdvdG9fYmFkOworCisJLyogQ2FjaGUgVkcgc3RydWN0IGZvciByZXVzZSAqLworCXZnaW5mby0+Y2FjaGVkX3ZnID0gdmc7CisJdmdpbmZvLT5ob2xkZXJzID0gMTsKKwl2Z2luZm8tPnZnX3VzZV9jb3VudCA9IDA7CisJdmdpbmZvLT5jYWNoZWRfdmdfaW52YWxpZGF0ZWQgPSAwOworCXZnLT52Z2luZm8gPSB2Z2luZm87CisKKwlpZiAoIWRtX3Bvb2xfbG9jayh2Zy0+dmdtZW0sIGRldGVjdF9pbnRlcm5hbF92Z19jYWNoZV9jb3JydXB0aW9uKCkpKQorCQlnb3RvX2JhZDsKKworb3V0OgorCXZnaW5mby0+aG9sZGVycysrOworCXZnaW5mby0+dmdfdXNlX2NvdW50Kys7CisJbG9nX2RlYnVnX2NhY2hlKCJVc2luZyBjYWNoZWQgJXNtZXRhZGF0YSBmb3IgVkcgJXMgd2l0aCAldSBob2xkZXIocykuIiwKKwkJCXZnaW5mby0+cHJlY29tbWl0dGVkID8gInByZS1jb21taXR0ZWQgIiA6ICIiLAorCQkJdmdpbmZvLT52Z25hbWUsIHZnaW5mby0+aG9sZGVycyk7CisKKwlyZXR1cm4gdmc7CisKK2JhZDoKKwlfZnJlZV9jYWNoZWRfdmdtZXRhZGF0YSh2Z2luZm8pOworCXJldHVybiBOVUxMOworfQorCisvLyAjaWYgMAoraW50IGx2bWNhY2hlX3ZnaW5mb19ob2xkZXJzX2RlY19hbmRfdGVzdF9mb3JfemVybyhzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8pCit7CisJbG9nX2RlYnVnX2NhY2hlKCJWRyAlcyBkZWNyZW1lbnRpbmcgJWQgaG9sZGVyKHMpIGF0ICVwLiIsCisJCQl2Z2luZm8tPmNhY2hlZF92Zy0+bmFtZSwgdmdpbmZvLT5ob2xkZXJzLCB2Z2luZm8tPmNhY2hlZF92Zyk7CisKKwlpZiAoLS12Z2luZm8tPmhvbGRlcnMpCisJCXJldHVybiAwOworCisJaWYgKHZnaW5mby0+dmdfdXNlX2NvdW50ID4gMSkKKwkJbG9nX2RlYnVnX2NhY2hlKCJWRyAlcyByZXVzZWQgJWQgdGltZXMuIiwKKwkJCQl2Z2luZm8tPmNhY2hlZF92Zy0+bmFtZSwgdmdpbmZvLT52Z191c2VfY291bnQpOworCisJLyogRGVidWcgcGVyZm9ybSBjcmMgY2hlY2sgb25seSB3aGVuIGl0J3MgYmVlbiB1c2VkIG1vcmUgdGhlbiBvbmNlICovCisJaWYgKCFkbV9wb29sX3VubG9jayh2Z2luZm8tPmNhY2hlZF92Zy0+dmdtZW0sCisJCQkgICAgZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24oKSAmJgorCQkJICAgICh2Z2luZm8tPnZnX3VzZV9jb3VudCA+IDEpKSkKKwkJc3RhY2s7CisKKwl2Z2luZm8tPmNhY2hlZF92Zy0+dmdpbmZvID0gTlVMTDsKKwl2Z2luZm8tPmNhY2hlZF92ZyA9IE5VTEw7CisKKwlyZXR1cm4gMTsKK30KKy8vICNlbmRpZgorCitpbnQgbHZtY2FjaGVfZ2V0X3ZnbmFtZWlkcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGluY2x1ZGVfaW50ZXJuYWwsCisJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqdmduYW1laWRzKQoreworCXN0cnVjdCB2Z25hbWVpZF9saXN0ICp2Z25sOworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKworCWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh2Z2luZm8sICZfdmdpbmZvcykgeworCQlpZiAoIWluY2x1ZGVfaW50ZXJuYWwgJiYgaXNfb3JwaGFuX3ZnKHZnaW5mby0+dmduYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKHZnbmwgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnZnbmwpKSkpIHsKKwkJCWxvZ19lcnJvcigidmduYW1laWRfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdmdubC0+dmdpZCA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z2luZm8tPnZnaWQpOworCQl2Z25sLT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnaW5mby0+dmduYW1lKTsKKworCQlpZiAoIXZnbmwtPnZnaWQgfHwgIXZnbmwtPnZnX25hbWUpIHsKKwkJCWxvZ19lcnJvcigidmduYW1laWRfbGlzdCBtZW1iZXIgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRtX2xpc3RfYWRkKHZnbmFtZWlkcywgJnZnbmwtPmxpc3QpOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZtY2FjaGVfZ2V0X3ZnaWRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIGludCBpbmNsdWRlX2ludGVybmFsKQoreworCXN0cnVjdCBkbV9saXN0ICp2Z2lkczsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisKKwkvLyBUT0RPIHBsdWcgaW50byBsdm1ldGFkIGhlcmUgYXV0b21hZ2ljYWxseT8KKwlsdm1jYWNoZV9sYWJlbF9zY2FuKGNtZCk7CisKKwlpZiAoISh2Z2lkcyA9IHN0cl9saXN0X2NyZWF0ZShjbWQtPm1lbSkpKSB7CisJCWxvZ19lcnJvcigidmdpZHMgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModmdpbmZvLCAmX3ZnaW5mb3MpIHsKKwkJaWYgKCFpbmNsdWRlX2ludGVybmFsICYmIGlzX29ycGhhbl92Zyh2Z2luZm8tPnZnbmFtZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgdmdpZHMsCisJCQkJICBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmdpbmZvLT52Z2lkKSkpIHsKKwkJCWxvZ19lcnJvcigic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gdmdpZHM7Cit9CisKK3N0cnVjdCBkbV9saXN0ICpsdm1jYWNoZV9nZXRfdmduYW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgIGludCBpbmNsdWRlX2ludGVybmFsKQoreworCXN0cnVjdCBkbV9saXN0ICp2Z25hbWVzOworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKworCWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKTsKKworCWlmICghKHZnbmFtZXMgPSBzdHJfbGlzdF9jcmVhdGUoY21kLT5tZW0pKSkgeworCQlsb2dfZXJybm8oRU5PTUVNLCAidmduYW1lcyBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh2Z2luZm8sICZfdmdpbmZvcykgeworCQlpZiAoIWluY2x1ZGVfaW50ZXJuYWwgJiYgaXNfb3JwaGFuX3ZnKHZnaW5mby0+dmduYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bWVtLCB2Z25hbWVzLAorCQkJCSAgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnaW5mby0+dmduYW1lKSkpIHsKKwkJCWxvZ19lcnJubyhFTk9NRU0sICJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiB2Z25hbWVzOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZtY2FjaGVfZ2V0X3B2aWRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJY29uc3QgY2hhciAqdmdpZCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZpZHM7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCisJaWYgKCEocHZpZHMgPSBzdHJfbGlzdF9jcmVhdGUoY21kLT5tZW0pKSkgeworCQlsb2dfZXJyb3IoInB2aWRzIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEodmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKHZnbmFtZSwgdmdpZCkpKQorCQlyZXR1cm4gcHZpZHM7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIHB2aWRzLAorCQkJCSAgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGluZm8tPmRldi0+cHZpZCkpKSB7CisJCQlsb2dfZXJyb3IoInN0cmxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHB2aWRzOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSAqX2RldmljZV9mcm9tX3B2aWQoY29uc3Qgc3RydWN0IGlkICpwdmlkLAorCQkJCQl1aW50NjRfdCAqbGFiZWxfc2VjdG9yKQoreworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisKKwlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZCgoY29uc3QgY2hhciAqKSBwdmlkLCBOVUxMLCAwKSkpIHsKKwkJaWYgKGx2bWV0YWRfdXNlZCgpKSB7CisJCQlpZiAoaW5mby0+bGFiZWwgJiYgbGFiZWxfc2VjdG9yKQorCQkJCSpsYWJlbF9zZWN0b3IgPSBpbmZvLT5sYWJlbC0+c2VjdG9yOworCQkJcmV0dXJuIGluZm8tPmRldjsKKwkJfQorCisJCWlmIChsYWJlbF9yZWFkKGluZm8tPmRldiwgJmxhYmVsLCBVSU5UNjRfQygwKSkpIHsKKwkJCWluZm8gPSAoc3RydWN0IGx2bWNhY2hlX2luZm8gKikgbGFiZWwtPmluZm87CisJCQlpZiAoaWRfZXF1YWwocHZpZCwgKHN0cnVjdCBpZCAqKSAmaW5mby0+ZGV2LT5wdmlkKSkgeworCQkJCWlmIChsYWJlbF9zZWN0b3IpCisJCQkJCSpsYWJlbF9zZWN0b3IgPSBsYWJlbC0+c2VjdG9yOworCQkJCXJldHVybiBpbmZvLT5kZXY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBkZXZpY2UgKmx2bWNhY2hlX2RldmljZV9mcm9tX3B2aWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBpZCAqcHZpZCwKKwkJCQl1bnNpZ25lZCAqc2Nhbl9kb25lX29uY2UsIHVpbnQ2NF90ICpsYWJlbF9zZWN0b3IpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJLyogQWxyZWFkeSBjYWNoZWQgPyAqLworCWRldiA9IF9kZXZpY2VfZnJvbV9wdmlkKHB2aWQsIGxhYmVsX3NlY3Rvcik7CisJaWYgKGRldikKKwkJcmV0dXJuIGRldjsKKworCWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKTsKKworCS8qIFRyeSBhZ2FpbiAqLworCWRldiA9IF9kZXZpY2VfZnJvbV9wdmlkKHB2aWQsIGxhYmVsX3NlY3Rvcik7CisJaWYgKGRldikKKwkJcmV0dXJuIGRldjsKKworCWlmIChjcml0aWNhbF9zZWN0aW9uKCkgfHwgKHNjYW5fZG9uZV9vbmNlICYmICpzY2FuX2RvbmVfb25jZSkpCisJCXJldHVybiBOVUxMOworCisJbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKCk7CisJbHZtY2FjaGVfbGFiZWxfc2NhbihjbWQpOworCWlmIChzY2FuX2RvbmVfb25jZSkKKwkJKnNjYW5fZG9uZV9vbmNlID0gMTsKKworCS8qIFRyeSBhZ2FpbiAqLworCWRldiA9IF9kZXZpY2VfZnJvbV9wdmlkKHB2aWQsIGxhYmVsX3NlY3Rvcik7CisJaWYgKGRldikKKwkJcmV0dXJuIGRldjsKKworCXJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICpsdm1jYWNoZV9wdmlkX2Zyb21fZGV2bmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGxhYmVsICpsYWJlbDsKKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQoZGV2bmFtZSwgY21kLT5maWx0ZXIpKSkgeworCQlsb2dfZXJyb3IoIiVzOiBDb3VsZG4ndCBmaW5kIGRldmljZS4gIENoZWNrIHlvdXIgZmlsdGVycz8iLAorCQkJICBkZXZuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobGFiZWxfcmVhZChkZXYsICZsYWJlbCwgVUlOVDY0X0MoMCkpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZGV2LT5wdmlkOworfQorCitpbnQgbHZtY2FjaGVfcHZpZF9pbl91bmNob3Nlbl9kdXBsaWNhdGVzKGNvbnN0IGNoYXIgKnB2aWQpCit7CisJc3RydWN0IGRldmljZV9saXN0ICpkZXZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRldmwsICZfdW51c2VkX2R1cGxpY2F0ZV9kZXZzKSB7CisJCWlmICghc3RybmNtcChkZXZsLT5kZXYtPnB2aWQsIHB2aWQsIElEX0xFTikpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2ZyZWVfdmdpbmZvKHN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbykKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICpwcmltYXJ5X3ZnaW5mbywgKnZnaW5mbzI7CisJaW50IHIgPSAxOworCisJX2ZyZWVfY2FjaGVkX3ZnbWV0YWRhdGEodmdpbmZvKTsKKworCXZnaW5mbzIgPSBwcmltYXJ5X3ZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z2luZm8tPnZnbmFtZSwgTlVMTCk7CisKKwlpZiAodmdpbmZvID09IHByaW1hcnlfdmdpbmZvKSB7CisJCWRtX2hhc2hfcmVtb3ZlKF92Z25hbWVfaGFzaCwgdmdpbmZvLT52Z25hbWUpOworCQlpZiAodmdpbmZvLT5uZXh0ICYmICFkbV9oYXNoX2luc2VydChfdmduYW1lX2hhc2gsIHZnaW5mby0+dmduYW1lLAorCQkJCQkJICAgIHZnaW5mby0+bmV4dCkpIHsKKwkJCWxvZ19lcnJvcigiX3ZnbmFtZV9oYXNoIHJlLWluc2VydGlvbiBmb3IgJXMgZmFpbGVkIiwKKwkJCQkgIHZnaW5mby0+dmduYW1lKTsKKwkJCXIgPSAwOworCQl9CisJfSBlbHNlCisJCXdoaWxlICh2Z2luZm8yKSB7CisJCQlpZiAodmdpbmZvMi0+bmV4dCA9PSB2Z2luZm8pIHsKKwkJCQl2Z2luZm8yLT5uZXh0ID0gdmdpbmZvLT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQkJdmdpbmZvMiA9IHZnaW5mbzItPm5leHQ7CisJCX0KKworCWRtX2ZyZWUodmdpbmZvLT5zeXN0ZW1faWQpOworCWRtX2ZyZWUodmdpbmZvLT52Z25hbWUpOworCWRtX2ZyZWUodmdpbmZvLT5jcmVhdGlvbl9ob3N0KTsKKworCWlmICgqdmdpbmZvLT52Z2lkICYmIF92Z2lkX2hhc2ggJiYKKwkgICAgbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmdpZCh2Z2luZm8tPnZnaWQpID09IHZnaW5mbykKKwkJZG1faGFzaF9yZW1vdmUoX3ZnaWRfaGFzaCwgdmdpbmZvLT52Z2lkKTsKKworCWRtX2xpc3RfZGVsKCZ2Z2luZm8tPmxpc3QpOworCisJZG1fZnJlZSh2Z2luZm8pOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiB2Z2luZm8gbXVzdCBiZSBpbmZvLT52Z2luZm8gdW5sZXNzIGluZm8gaXMgTlVMTAorICovCitzdGF0aWMgaW50IF9kcm9wX3ZnaW5mbyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvKQoreworCWlmIChpbmZvKQorCQlfdmdpbmZvX2RldGFjaF9pbmZvKGluZm8pOworCisJLyogdmdpbmZvIHN0aWxsIHJlZmVyZW5jZWQ/ICovCisJaWYgKCF2Z2luZm8gfHwgaXNfb3JwaGFuX3ZnKHZnaW5mby0+dmduYW1lKSB8fAorCSAgICAhZG1fbGlzdF9lbXB0eSgmdmdpbmZvLT5pbmZvcykpCisJCXJldHVybiAxOworCisJaWYgKCFfZnJlZV92Z2luZm8odmdpbmZvKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBsdm1jYWNoZV9kZWwoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJaWYgKGluZm8tPmRldi0+cHZpZFswXSAmJiBfcHZpZF9oYXNoKQorCQlkbV9oYXNoX3JlbW92ZShfcHZpZF9oYXNoLCBpbmZvLT5kZXYtPnB2aWQpOworCisJX2Ryb3BfdmdpbmZvKGluZm8sIGluZm8tPnZnaW5mbyk7CisKKwlpbmZvLT5sYWJlbC0+bGFiZWxsZXItPm9wcy0+ZGVzdHJveV9sYWJlbChpbmZvLT5sYWJlbC0+bGFiZWxsZXIsCisJCQkJCQkgIGluZm8tPmxhYmVsKTsKKwlkbV9mcmVlKGluZm8pOworCisJcmV0dXJuOworfQorCisvKgorICogdmdpbmZvIG11c3QgYmUgaW5mby0+dmdpbmZvIHVubGVzcyBpbmZvIGlzIE5VTEwgKG9ycGhhbnMpCisgKi8KK3N0YXRpYyBpbnQgX2x2bWNhY2hlX3VwZGF0ZV92Z2lkKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8sCisJCQkJIGNvbnN0IGNoYXIgKnZnaWQpCit7CisJaWYgKCF2Z2lkIHx8ICF2Z2luZm8gfHwKKwkgICAgIXN0cm5jbXAodmdpbmZvLT52Z2lkLCB2Z2lkLCBJRF9MRU4pKQorCQlyZXR1cm4gMTsKKworCWlmICh2Z2luZm8gJiYgKnZnaW5mby0+dmdpZCkKKwkJZG1faGFzaF9yZW1vdmUoX3ZnaWRfaGFzaCwgdmdpbmZvLT52Z2lkKTsKKwlpZiAoIXZnaWQpIHsKKwkJLyogRklYTUU6IHVucmVhY2hhYmxlIGNvZGUgcGF0aCAqLworCQlsb2dfZGVidWdfY2FjaGUoImx2bWNhY2hlOiAlczogY2xlYXJpbmcgVkdJRCIsIGluZm8gPyBkZXZfbmFtZShpbmZvLT5kZXYpIDogdmdpbmZvLT52Z25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzdHJuY3B5KHZnaW5mby0+dmdpZCwgdmdpZCwgSURfTEVOKTsKKwl2Z2luZm8tPnZnaWRbSURfTEVOXSA9ICdcMCc7CisJaWYgKCFkbV9oYXNoX2luc2VydChfdmdpZF9oYXNoLCB2Z2luZm8tPnZnaWQsIHZnaW5mbykpIHsKKwkJbG9nX2Vycm9yKCJfbHZtY2FjaGVfdXBkYXRlOiB2Z2lkIGhhc2ggaW5zZXJ0aW9uIGZhaWxlZDogJXMiLAorCQkJICB2Z2luZm8tPnZnaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlzX29ycGhhbl92Zyh2Z2luZm8tPnZnbmFtZSkpCisJCWxvZ19kZWJ1Z19jYWNoZSgibHZtY2FjaGUgJXM6IFZHICVzOiBzZXQgVkdJRCB0byAiIEZNVFZHSUQgIi4iLAorCQkJCShpbmZvKSA/IGRldl9uYW1lKGluZm8tPmRldikgOiAiIiwKKwkJCQl2Z2luZm8tPnZnbmFtZSwgdmdpbmZvLT52Z2lkKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbnNlcnRfdmdpbmZvKHN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKm5ld192Z2luZm8sIGNvbnN0IGNoYXIgKnZnaWQsCisJCQkgIHVpbnQzMl90IHZnc3RhdHVzLCBjb25zdCBjaGFyICpjcmVhdGlvbl9ob3N0LAorCQkJICBzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICpwcmltYXJ5X3ZnaW5mbykKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICpsYXN0X3ZnaW5mbyA9IHByaW1hcnlfdmdpbmZvOworCWNoYXIgdXVpZF9wcmltYXJ5WzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY2hhciB1dWlkX25ld1s2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWludCB1c2VfbmV3ID0gMDsKKworCS8qIFByZS1leGlzdGluZyBWRyB0YWtlcyBwcmVjZWRlbmNlLiBVbmV4cG9ydGVkIFZHIHRha2VzIHByZWNlZGVuY2UuICovCisJaWYgKHByaW1hcnlfdmdpbmZvKSB7CisJCWlmICghaWRfd3JpdGVfZm9ybWF0KChjb25zdCBzdHJ1Y3QgaWQgKil2Z2lkLCB1dWlkX25ldywgc2l6ZW9mKHV1aWRfbmV3KSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkICopJnByaW1hcnlfdmdpbmZvLT52Z2lkLCB1dWlkX3ByaW1hcnksCisJCQkJICAgICBzaXplb2YodXVpZF9wcmltYXJ5KSkpCisJCQlyZXR1cm5fMDsKKworCQkvKgorCQkgKiB2Z2luZm8gaXMga2VwdCBmb3IgZWFjaCBWRyB3aXRoIHRoZSBzYW1lIG5hbWUuCisJCSAqIFRoZXkgYXJlIHNhdmVkIHdpdGggdGhlIHZnaW5mby0+bmV4dCBsaXN0LgorCQkgKiBUaGVzZSBjaGVja3MganVzdCBkZWNpZGUgdGhlIG9yZGVyaW5nIG9mCisJCSAqIHRoYXQgbGlzdC4KKwkJICoKKwkJICogRklYTUU6IGl0IHNob3VsZCBubyBsb25nZXIgbWF0dGVyIHdoYXQgb3JkZXIKKwkJICogdGhlIHZnaW5mbydzIGFyZSBrZXB0IGluLCBzbyB3ZSBjYW4gcHJvYmFibHkKKwkJICogcmVtb3ZlIHRoZXNlIGNvbXBhcmlzb25zIGFuZCByZW9yZGVyaW5nIGVudGlyZWx5LgorCQkgKgorCQkgKiBJZiAgIFByaW1hcnkgbm90IGV4cG9ydGVkLCBuZXcgZXhwb3J0ZWQgPT4ga2VlcAorCQkgKiBFbHNlIFByaW1hcnkgZXhwb3J0ZWQsIG5ldyBub3QgZXhwb3J0ZWQgPT4gY2hhbmdlCisJCSAqIEVsc2UgUHJpbWFyeSBoYXMgaG9zdG5hbWUgZm9yIHRoaXMgbWFjaGluZSA9PiBrZWVwCisJCSAqIEVsc2UgUHJpbWFyeSBoYXMgbm8gaG9zdG5hbWUsIG5ldyBoYXMgb25lID0+IGNoYW5nZQorCQkgKiBFbHNlIE5ldyBoYXMgaG9zdG5hbWUgZm9yIHRoaXMgbWFjaGluZSA9PiBjaGFuZ2UKKwkJICogRWxzZSBLZWVwIHByaW1hcnkuCisJCSAqLworCQlpZiAoIShwcmltYXJ5X3ZnaW5mby0+c3RhdHVzICYgRVhQT1JURURfVkcpICYmCisJCSAgICAodmdzdGF0dXMgJiBFWFBPUlRFRF9WRykpCisJCQlsb2dfdmVyYm9zZSgiQ2FjaGU6IER1cGxpY2F0ZSBWRyBuYW1lICVzOiAiCisJCQkJICAgICJFeGlzdGluZyAlcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgIgorCQkJCSAgICAiZXhwb3J0ZWQgJXMiLCBuZXdfdmdpbmZvLT52Z25hbWUsCisJCQkJICAgIHV1aWRfcHJpbWFyeSwgdXVpZF9uZXcpOworCQllbHNlIGlmICgocHJpbWFyeV92Z2luZm8tPnN0YXR1cyAmIEVYUE9SVEVEX1ZHKSAmJgorCQkJICAgISh2Z3N0YXR1cyAmIEVYUE9SVEVEX1ZHKSkgeworCQkJbG9nX3ZlcmJvc2UoIkNhY2hlOiBEdXBsaWNhdGUgVkcgbmFtZSAlczogIgorCQkJCSAgICAiJXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV4cG9ydGVkICVzIiwKKwkJCQkgICAgbmV3X3ZnaW5mby0+dmduYW1lLCB1dWlkX25ldywKKwkJCQkgICAgdXVpZF9wcmltYXJ5KTsKKwkJCXVzZV9uZXcgPSAxOworCQl9IGVsc2UgaWYgKHByaW1hcnlfdmdpbmZvLT5jcmVhdGlvbl9ob3N0ICYmCisJCQkgICAhc3RyY21wKHByaW1hcnlfdmdpbmZvLT5jcmVhdGlvbl9ob3N0LAorCQkJCSAgIHByaW1hcnlfdmdpbmZvLT5mbXQtPmNtZC0+aG9zdG5hbWUpKQorCQkJbG9nX3ZlcmJvc2UoIkNhY2hlOiBEdXBsaWNhdGUgVkcgbmFtZSAlczogIgorCQkJCSAgICAiRXhpc3RpbmcgJXMgKGNyZWF0ZWQgaGVyZSkgdGFrZXMgcHJlY2VkZW5jZSAiCisJCQkJICAgICJvdmVyICVzIiwgbmV3X3ZnaW5mby0+dmduYW1lLCB1dWlkX3ByaW1hcnksCisJCQkJICAgIHV1aWRfbmV3KTsKKwkJZWxzZSBpZiAoIXByaW1hcnlfdmdpbmZvLT5jcmVhdGlvbl9ob3N0ICYmIGNyZWF0aW9uX2hvc3QpIHsKKwkJCWxvZ192ZXJib3NlKCJDYWNoZTogRHVwbGljYXRlIFZHIG5hbWUgJXM6ICIKKwkJCQkgICAgIiVzICh3aXRoIGNyZWF0aW9uX2hvc3QpIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAlcyIsCisJCQkJICAgIG5ld192Z2luZm8tPnZnbmFtZSwgdXVpZF9uZXcsCisJCQkJICAgIHV1aWRfcHJpbWFyeSk7CisJCQl1c2VfbmV3ID0gMTsKKwkJfSBlbHNlIGlmIChjcmVhdGlvbl9ob3N0ICYmCisJCQkgICAhc3RyY21wKGNyZWF0aW9uX2hvc3QsCisJCQkJICAgcHJpbWFyeV92Z2luZm8tPmZtdC0+Y21kLT5ob3N0bmFtZSkpIHsKKwkJCWxvZ192ZXJib3NlKCJDYWNoZTogRHVwbGljYXRlIFZHIG5hbWUgJXM6ICIKKwkJCQkgICAgIiVzIChjcmVhdGVkIGhlcmUpIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAlcyIsCisJCQkJICAgIG5ld192Z2luZm8tPnZnbmFtZSwgdXVpZF9uZXcsCisJCQkJICAgIHV1aWRfcHJpbWFyeSk7CisJCQl1c2VfbmV3ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWxvZ192ZXJib3NlKCJDYWNoZTogRHVwbGljYXRlIFZHIG5hbWUgJXM6ICIKKwkJCQkgICAgIlByZWZlciBleGlzdGluZyAlcyB2cyBuZXcgJXMiLAorCQkJCSAgICBuZXdfdmdpbmZvLT52Z25hbWUsIHV1aWRfcHJpbWFyeSwgdXVpZF9uZXcpOworCQl9CisKKwkJaWYgKCF1c2VfbmV3KSB7CisJCQl3aGlsZSAobGFzdF92Z2luZm8tPm5leHQpCisJCQkJbGFzdF92Z2luZm8gPSBsYXN0X3ZnaW5mby0+bmV4dDsKKwkJCWxhc3RfdmdpbmZvLT5uZXh0ID0gbmV3X3ZnaW5mbzsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZG1faGFzaF9yZW1vdmUoX3ZnbmFtZV9oYXNoLCBwcmltYXJ5X3ZnaW5mby0+dmduYW1lKTsKKwl9CisKKwlpZiAoIWRtX2hhc2hfaW5zZXJ0KF92Z25hbWVfaGFzaCwgbmV3X3ZnaW5mby0+dmduYW1lLCBuZXdfdmdpbmZvKSkgeworCQlsb2dfZXJyb3IoImNhY2hlX3VwZGF0ZTogdmcgaGFzaCBpbnNlcnRpb24gZmFpbGVkOiAlcyIsCisJCSAgCW5ld192Z2luZm8tPnZnbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcmltYXJ5X3ZnaW5mbykKKwkJbmV3X3ZnaW5mby0+bmV4dCA9IHByaW1hcnlfdmdpbmZvOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2bWNhY2hlX3VwZGF0ZV92Z25hbWUoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sCisJCQkJICAgY29uc3QgY2hhciAqdmduYW1lLCBjb25zdCBjaGFyICp2Z2lkLAorCQkJCSAgIHVpbnQzMl90IHZnc3RhdHVzLCBjb25zdCBjaGFyICpjcmVhdGlvbl9ob3N0LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbywgKnByaW1hcnlfdmdpbmZvLCAqb3JwaGFuX3ZnaW5mbzsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzIsICppbmZvMzsKKwljaGFyIG1kYWJ1ZlszMl07CisJLy8gc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAgKm9sZF92Z2luZm8sICpuZXh0OworCisJaWYgKCF2Z25hbWUgfHwgKGluZm8gJiYgaW5mby0+dmdpbmZvICYmICFzdHJjbXAoaW5mby0+dmdpbmZvLT52Z25hbWUsIHZnbmFtZSkpKQorCQlyZXR1cm4gMTsKKworCS8qIFJlbW92ZSBleGlzdGluZyB2Z2luZm8gZW50cnkgKi8KKwlpZiAoaW5mbykKKwkJX2Ryb3BfdmdpbmZvKGluZm8sIGluZm8tPnZnaW5mbyk7CisKKwkvKiBHZXQgZXhpc3RpbmcgdmdpbmZvIG9yIGNyZWF0ZSBuZXcgb25lICovCisJaWYgKCEodmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKHZnbmFtZSwgdmdpZCkpKSB7CisvKioqIEZJWE1FIC0gdmdpbmZvIGVuZHMgdXAgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIHJlbmFtZWQuCisJCS8vIFJlbmFtaW5nPyAgVGhpcyBsb29rdXAgZmFpbHMuCisJCWlmICgodmdpbmZvID0gdmdpbmZvX2Zyb21fdmdpZCh2Z2lkKSkpIHsKKwkJCW5leHQgPSB2Z2luZm8tPm5leHQ7CisJCQlvbGRfdmdpbmZvID0gdmdpbmZvX2Zyb21fdmduYW1lKHZnaW5mby0+dmduYW1lLCBOVUxMKTsKKwkJCWlmIChvbGRfdmdpbmZvID09IHZnaW5mbykgeworCQkJCWRtX2hhc2hfcmVtb3ZlKF92Z25hbWVfaGFzaCwgb2xkX3ZnaW5mby0+dmduYW1lKTsKKwkJCQlpZiAob2xkX3ZnaW5mby0+bmV4dCkgeworCQkJCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KF92Z25hbWVfaGFzaCwgb2xkX3ZnaW5mby0+dmduYW1lLCBvbGRfdmdpbmZvLT5uZXh0KSkgeworCQkJCQkJbG9nX2Vycm9yKCJ2ZyBoYXNoIHJlLWluc2VydGlvbiBmYWlsZWQ6ICVzIiwKKwkJCQkJCQkgIG9sZF92Z2luZm8tPnZnbmFtZSk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBkbyB7CisJCQkJaWYgKG9sZF92Z2luZm8tPm5leHQgPT0gdmdpbmZvKSB7CisJCQkJCW9sZF92Z2luZm8tPm5leHQgPSB2Z2luZm8tPm5leHQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gd2hpbGUgKChvbGRfdmdpbmZvID0gb2xkX3ZnaW5mby0+bmV4dCkpOworCQkJdmdpbmZvLT5uZXh0ID0gTlVMTDsKKworCQkJZG1fZnJlZSh2Z2luZm8tPnZnbmFtZSk7CisJCQlpZiAoISh2Z2luZm8tPnZnbmFtZSA9IGRtX3N0cmR1cCh2Z25hbWUpKSkgeworCQkJCWxvZ19lcnJvcigiY2FjaGUgdmduYW1lIGFsbG9jIGZhaWxlZCBmb3IgJXMiLCB2Z25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvLyBSZW5hbWUgc28gY2FuIGFzc3VtZSBuZXcgbmFtZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisJCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KF92Z25hbWVfaGFzaCwgdmdpbmZvLT52Z25hbWUsIHZnaW5mby0+bmV4dCkpIHsKKwkJCQlsb2dfZXJyb3IoInZnIGhhc2ggcmUtaW5zZXJ0aW9uIGZhaWxlZDogJXMiLAorCQkJCQkgIHZnaW5mby0+dmduYW1lKTsKKwkJICAgICAgCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKyoqKi8KKwkJaWYgKCEodmdpbmZvID0gZG1femFsbG9jKHNpemVvZigqdmdpbmZvKSkpKSB7CisJCQlsb2dfZXJyb3IoImx2bWNhY2hlX3VwZGF0ZV92Z25hbWU6IGxpc3QgYWxsb2MgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoISh2Z2luZm8tPnZnbmFtZSA9IGRtX3N0cmR1cCh2Z25hbWUpKSkgeworCQkJZG1fZnJlZSh2Z2luZm8pOworCQkJbG9nX2Vycm9yKCJjYWNoZSB2Z25hbWUgYWxsb2MgZmFpbGVkIGZvciAlcyIsIHZnbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkbV9saXN0X2luaXQoJnZnaW5mby0+aW5mb3MpOworCisJCS8qCisJCSAqIElmIHdlJ3JlIHNjYW5uaW5nIGFuZCB0aGVyZSdzIGFuIGludmFsaWRhdGVkIGVudHJ5LCByZW1vdmUgaXQuCisJCSAqIE90aGVyd2lzZSB3ZSByaXNrIGJvZ3VzIHdhcm5pbmdzIG9mIGR1cGxpY2F0ZSBWR3MuCisJCSAqLworCQl3aGlsZSAoKHByaW1hcnlfdmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKHZnbmFtZSwgTlVMTCkpICYmCisJCSAgICAgICBfc2Nhbm5pbmdfaW5fcHJvZ3Jlc3MgJiYgX3ZnaW5mb19pc19pbnZhbGlkKHByaW1hcnlfdmdpbmZvKSkgeworCQkJb3JwaGFuX3ZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZShwcmltYXJ5X3ZnaW5mby0+Zm10LT5vcnBoYW5fdmdfbmFtZSwgTlVMTCk7CisJCQlpZiAoIW9ycGhhbl92Z2luZm8pIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk9ycGhhbiB2Z2luZm8gJXMgbG9zdCBmcm9tIGNhY2hlLiIsCisJCQkJCSAgcHJpbWFyeV92Z2luZm8tPmZtdC0+b3JwaGFuX3ZnX25hbWUpOworCQkJCWRtX2ZyZWUodmdpbmZvLT52Z25hbWUpOworCQkJCWRtX2ZyZWUodmdpbmZvKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGluZm8yLCBpbmZvMywgJnByaW1hcnlfdmdpbmZvLT5pbmZvcykgeworCQkJCV92Z2luZm9fZGV0YWNoX2luZm8oaW5mbzIpOworCQkJCV92Z2luZm9fYXR0YWNoX2luZm8ob3JwaGFuX3ZnaW5mbywgaW5mbzIpOworCQkJCWlmIChpbmZvMi0+bWRhcy5uKQorCQkJCQlzcHJpbnRmKG1kYWJ1ZiwgIiB3aXRoICV1IG1kYXMiLAorCQkJCQkJZG1fbGlzdF9zaXplKCZpbmZvMi0+bWRhcykpOworCQkJCWVsc2UKKwkJCQkJbWRhYnVmWzBdID0gJ1wwJzsKKwkJCQlsb2dfZGVidWdfY2FjaGUoImx2bWNhY2hlOiAlczogbm93IGluIFZHICVzJXMlcyVzJXMiLAorCQkJCQkJZGV2X25hbWUoaW5mbzItPmRldiksCisJCQkJCQl2Z25hbWUsIG9ycGhhbl92Z2luZm8tPnZnaWRbMF0gPyAiICgiIDogIiIsCisJCQkJCQlvcnBoYW5fdmdpbmZvLT52Z2lkWzBdID8gb3JwaGFuX3ZnaW5mby0+dmdpZCA6ICIiLAorCQkJCQkJb3JwaGFuX3ZnaW5mby0+dmdpZFswXSA/ICIpIiA6ICIiLCBtZGFidWYpOworCQkJfQorCisJCQlpZiAoIV9kcm9wX3ZnaW5mbyhOVUxMLCBwcmltYXJ5X3ZnaW5mbykpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlpZiAoIV9pbnNlcnRfdmdpbmZvKHZnaW5mbywgdmdpZCwgdmdzdGF0dXMsIGNyZWF0aW9uX2hvc3QsCisJCQkJICAgIHByaW1hcnlfdmdpbmZvKSkgeworCQkJZG1fZnJlZSh2Z2luZm8tPnZnbmFtZSk7CisJCQlkbV9mcmVlKHZnaW5mbyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBFbnN1cmUgb3JwaGFucyBhcHBlYXIgbGFzdCBvbiBsaXN0X2l0ZXJhdGUgKi8KKwkJaWYgKGlzX29ycGhhbl92Zyh2Z25hbWUpKQorCQkJZG1fbGlzdF9hZGQoJl92Z2luZm9zLCAmdmdpbmZvLT5saXN0KTsKKwkJZWxzZQorCQkJZG1fbGlzdF9hZGRfaCgmX3ZnaW5mb3MsICZ2Z2luZm8tPmxpc3QpOworLyoqKgorCQl9CisqKiovCisJfQorCisJaWYgKGluZm8pCisJCV92Z2luZm9fYXR0YWNoX2luZm8odmdpbmZvLCBpbmZvKTsKKwllbHNlIGlmICghX2x2bWNhY2hlX3VwZGF0ZV92Z2lkKE5VTEwsIHZnaW5mbywgdmdpZCkpIC8qIE9ycGhhbnMgKi8KKwkJcmV0dXJuXzA7CisKKwlfdXBkYXRlX2NhY2hlX3ZnaW5mb19sb2NrX3N0YXRlKHZnaW5mbywgbHZtY2FjaGVfdmduYW1lX2lzX2xvY2tlZCh2Z25hbWUpKTsKKworCS8qIEZJWE1FIENoZWNrIGNvbnNpc3RlbmN5IG9mIGxpc3QhICovCisJdmdpbmZvLT5mbXQgPSBmbXQ7CisKKwlpZiAoaW5mbykgeworCQlpZiAoaW5mby0+bWRhcy5uKQorCQkJc3ByaW50ZihtZGFidWYsICIgd2l0aCAldSBtZGEocykiLCBkbV9saXN0X3NpemUoJmluZm8tPm1kYXMpKTsKKwkJZWxzZQorCQkJbWRhYnVmWzBdID0gJ1wwJzsKKwkJbG9nX2RlYnVnX2NhY2hlKCJsdm1jYWNoZSAlczogbm93IGluIFZHICVzJXMlcyVzJXMuIiwKKwkJCQlkZXZfbmFtZShpbmZvLT5kZXYpLAorCQkJCXZnbmFtZSwgdmdpbmZvLT52Z2lkWzBdID8gIiAoIiA6ICIiLAorCQkJCXZnaW5mby0+dmdpZFswXSA/IHZnaW5mby0+dmdpZCA6ICIiLAorCQkJCXZnaW5mby0+dmdpZFswXSA/ICIpIiA6ICIiLCBtZGFidWYpOworCX0gZWxzZQorCQlsb2dfZGVidWdfY2FjaGUoImx2bWNhY2hlIGluaXRpYWxpc2VkIFZHICVzLiIsIHZnbmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZtY2FjaGVfdXBkYXRlX3Znc3RhdHVzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB1aW50MzJfdCB2Z3N0YXR1cywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNyZWF0aW9uX2hvc3QsIGNvbnN0IGNoYXIgKmxvY2tfdHlwZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnN5c3RlbV9pZCkKK3sKKwlpZiAoIWluZm8gfHwgIWluZm8tPnZnaW5mbykKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGluZm8tPnZnaW5mby0+c3RhdHVzICYgRVhQT1JURURfVkcpICE9ICh2Z3N0YXR1cyAmIEVYUE9SVEVEX1ZHKSkKKwkJbG9nX2RlYnVnX2NhY2hlKCJsdm1jYWNoZSAlczogVkcgJXMgJXMgZXhwb3J0ZWQuIiwKKwkJCQlkZXZfbmFtZShpbmZvLT5kZXYpLCBpbmZvLT52Z2luZm8tPnZnbmFtZSwKKwkJCQl2Z3N0YXR1cyAmIEVYUE9SVEVEX1ZHID8gIm5vdyIgOiAibm8gbG9uZ2VyIik7CisKKwlpbmZvLT52Z2luZm8tPnN0YXR1cyA9IHZnc3RhdHVzOworCisJaWYgKCFjcmVhdGlvbl9ob3N0KQorCQlnb3RvIHNldF9sb2NrX3R5cGU7CisKKwlpZiAoaW5mby0+dmdpbmZvLT5jcmVhdGlvbl9ob3N0ICYmICFzdHJjbXAoY3JlYXRpb25faG9zdCwKKwkJCQkJCSAgIGluZm8tPnZnaW5mby0+Y3JlYXRpb25faG9zdCkpCisJCWdvdG8gc2V0X2xvY2tfdHlwZTsKKworCWlmIChpbmZvLT52Z2luZm8tPmNyZWF0aW9uX2hvc3QpCisJCWRtX2ZyZWUoaW5mby0+dmdpbmZvLT5jcmVhdGlvbl9ob3N0KTsKKworCWlmICghKGluZm8tPnZnaW5mby0+Y3JlYXRpb25faG9zdCA9IGRtX3N0cmR1cChjcmVhdGlvbl9ob3N0KSkpIHsKKwkJbG9nX2Vycm9yKCJjYWNoZSBjcmVhdGlvbiBob3N0IGFsbG9jIGZhaWxlZCBmb3IgJXMuIiwKKwkJCSAgY3JlYXRpb25faG9zdCk7CisJCXJldHVybiAwOworCX0KKworCWxvZ19kZWJ1Z19jYWNoZSgibHZtY2FjaGUgJXM6IFZHICVzOiBzZXQgY3JlYXRpb24gaG9zdCB0byAlcy4iLAorCQkJZGV2X25hbWUoaW5mby0+ZGV2KSwgaW5mby0+dmdpbmZvLT52Z25hbWUsIGNyZWF0aW9uX2hvc3QpOworCitzZXRfbG9ja190eXBlOgorCisJaWYgKCFsb2NrX3R5cGUpCisJCWdvdG8gc2V0X3N5c3RlbV9pZDsKKworCWlmIChpbmZvLT52Z2luZm8tPmxvY2tfdHlwZSAmJiAhc3RyY21wKGxvY2tfdHlwZSwgaW5mby0+dmdpbmZvLT5sb2NrX3R5cGUpKQorCQlnb3RvIHNldF9zeXN0ZW1faWQ7CisKKwlpZiAoaW5mby0+dmdpbmZvLT5sb2NrX3R5cGUpCisJCWRtX2ZyZWUoaW5mby0+dmdpbmZvLT5sb2NrX3R5cGUpOworCisJaWYgKCEoaW5mby0+dmdpbmZvLT5sb2NrX3R5cGUgPSBkbV9zdHJkdXAobG9ja190eXBlKSkpIHsKKwkJbG9nX2Vycm9yKCJjYWNoZSBsb2NrX3R5cGUgYWxsb2MgZmFpbGVkIGZvciAlcyIsIGxvY2tfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWxvZ19kZWJ1Z19jYWNoZSgibHZtY2FjaGUgJXM6IFZHICVzOiBzZXQgbG9ja190eXBlIHRvICVzLiIsCisJCQlkZXZfbmFtZShpbmZvLT5kZXYpLCBpbmZvLT52Z2luZm8tPnZnbmFtZSwgbG9ja190eXBlKTsKKworc2V0X3N5c3RlbV9pZDoKKworCWlmICghc3lzdGVtX2lkKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT52Z2luZm8tPnN5c3RlbV9pZCAmJiAhc3RyY21wKHN5c3RlbV9pZCwgaW5mby0+dmdpbmZvLT5zeXN0ZW1faWQpKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT52Z2luZm8tPnN5c3RlbV9pZCkKKwkJZG1fZnJlZShpbmZvLT52Z2luZm8tPnN5c3RlbV9pZCk7CisKKwlpZiAoIShpbmZvLT52Z2luZm8tPnN5c3RlbV9pZCA9IGRtX3N0cmR1cChzeXN0ZW1faWQpKSkgeworCQlsb2dfZXJyb3IoImNhY2hlIHN5c3RlbV9pZCBhbGxvYyBmYWlsZWQgZm9yICVzIiwgc3lzdGVtX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2NhY2hlKCJsdm1jYWNoZSAlczogVkcgJXM6IHNldCBzeXN0ZW1faWQgdG8gJXMuIiwKKwkJCWRldl9uYW1lKGluZm8tPmRldiksIGluZm8tPnZnaW5mby0+dmduYW1lLCBzeXN0ZW1faWQpOworCitvdXQ6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2bWNhY2hlX3VwZGF0ZV92Z19tZGFfaW5mbyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgdWludDMyX3QgbWRhX2NoZWNrc3VtLAorCQkJCQlzaXplX3QgbWRhX3NpemUpCit7CisJaWYgKCFpbmZvIHx8ICFpbmZvLT52Z2luZm8gfHwgIW1kYV9zaXplKQorCQlyZXR1cm4gMTsKKworCWlmIChpbmZvLT52Z2luZm8tPm1kYV9jaGVja3N1bSA9PSBtZGFfY2hlY2tzdW0gfHwgaW5mby0+dmdpbmZvLT5tZGFfc2l6ZSA9PSBtZGFfc2l6ZSkgCisJCXJldHVybiAxOworCisJaW5mby0+dmdpbmZvLT5tZGFfY2hlY2tzdW0gPSBtZGFfY2hlY2tzdW07CisJaW5mby0+dmdpbmZvLT5tZGFfc2l6ZSA9IG1kYV9zaXplOworCisJLyogRklYTUUgQWRkIGNoZWNrc3VtIGluZGV4ICovCisKKwlsb2dfZGVidWdfY2FjaGUoImx2bWNhY2hlICVzOiBWRyAlczogc3RvcmVkIG1ldGFkYXRhIGNoZWNrc3VtIDB4JTA4IgorCQkJUFJJeDMyICIgd2l0aCBzaXplICUiIFBSSXNpemVfdCAiLiIsCisJCQlkZXZfbmFtZShpbmZvLT5kZXYpLCBpbmZvLT52Z2luZm8tPnZnbmFtZSwKKwkJCW1kYV9jaGVja3N1bSwgbWRhX3NpemUpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV9hZGRfb3JwaGFuX3ZnaW5mbyhjb25zdCBjaGFyICp2Z25hbWUsIHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCWlmICghX2xvY2tfaGFzaCAmJiAhbHZtY2FjaGVfaW5pdCgpKSB7CisJCWxvZ19lcnJvcigiSW50ZXJuYWwgY2FjaGUgaW5pdGlhbGlzYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfbHZtY2FjaGVfdXBkYXRlX3ZnbmFtZShOVUxMLCB2Z25hbWUsIHZnbmFtZSwgMCwgIiIsIGZtdCk7Cit9CisKK2ludCBsdm1jYWNoZV91cGRhdGVfdmduYW1lX2FuZF9pZChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSAqdmdzdW1tYXJ5KQoreworCWNvbnN0IGNoYXIgKnZnbmFtZSA9IHZnc3VtbWFyeS0+dmduYW1lOworCWNvbnN0IGNoYXIgKnZnaWQgPSAoY2hhciAqKSZ2Z3N1bW1hcnktPnZnaWQ7CisKKwlpZiAoIXZnbmFtZSAmJiAhaW5mby0+dmdpbmZvKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTlVMTCB2Z25hbWUgaGFuZGVkIHRvIGNhY2hlIik7CisJCS8qIEZJWE1FIFJlbW92ZSB0aGlzICovCisJCXZnbmFtZSA9IGluZm8tPmZtdC0+b3JwaGFuX3ZnX25hbWU7CisJCXZnaWQgPSB2Z25hbWU7CisJfQorCisJLyogSWYgUFYgd2l0aG91dCBtZGFzIGlzIGFscmVhZHkgaW4gYSByZWFsIFZHLCBkb24ndCBtYWtlIGl0IG9ycGhhbiAqLworCWlmIChpc19vcnBoYW5fdmcodmduYW1lKSAmJiBpbmZvLT52Z2luZm8gJiYKKwkgICAgbWRhc19lbXB0eV9vcl9pZ25vcmVkKCZpbmZvLT5tZGFzKSAmJgorCSAgICAhaXNfb3JwaGFuX3ZnKGluZm8tPnZnaW5mby0+dmduYW1lKSAmJiBjcml0aWNhbF9zZWN0aW9uKCkpCisJCXJldHVybiAxOworCisJLyogSWYgbWFraW5nIGEgUFYgaW50byBhbiBvcnBoYW4sIGFueSBjYWNoZWQgVkcgbWV0YWRhdGEgbWF5IGJlY29tZQorCSAqIGludmFsaWQsIGluY29ycmVjdGx5IHN0aWxsIHJlZmVyZW5jaW5nIGRldmljZSBzdHJ1Y3RzLgorCSAqIChFeGFtcGxlOiBwdmNyZWF0ZSAtZmYpICovCisJaWYgKGlzX29ycGhhbl92Zyh2Z25hbWUpICYmIGluZm8tPnZnaW5mbyAmJiAhaXNfb3JwaGFuX3ZnKGluZm8tPnZnaW5mby0+dmduYW1lKSkKKwkJaW5mby0+dmdpbmZvLT5jYWNoZWRfdmdfaW52YWxpZGF0ZWQgPSAxOworCisJLyogSWYgbW92aW5nIFBWIGZyb20gb3JwaGFuIHRvIHJlYWwgVkcsIGFsd2F5cyBtYXJrIGl0IHZhbGlkICovCisJaWYgKCFpc19vcnBoYW5fdmcodmduYW1lKSkKKwkJaW5mby0+c3RhdHVzICY9IH5DQUNIRV9JTlZBTElEOworCisJaWYgKCFfbHZtY2FjaGVfdXBkYXRlX3ZnbmFtZShpbmZvLCB2Z25hbWUsIHZnaWQsIHZnc3VtbWFyeS0+dmdzdGF0dXMsCisJCQkJICAgICB2Z3N1bW1hcnktPmNyZWF0aW9uX2hvc3QsIGluZm8tPmZtdCkgfHwKKwkgICAgIV9sdm1jYWNoZV91cGRhdGVfdmdpZChpbmZvLCBpbmZvLT52Z2luZm8sIHZnaWQpIHx8CisJICAgICFfbHZtY2FjaGVfdXBkYXRlX3Znc3RhdHVzKGluZm8sIHZnc3VtbWFyeS0+dmdzdGF0dXMsIHZnc3VtbWFyeS0+Y3JlYXRpb25faG9zdCwgdmdzdW1tYXJ5LT5sb2NrX3R5cGUsIHZnc3VtbWFyeS0+c3lzdGVtX2lkKSB8fAorCSAgICAhX2x2bWNhY2hlX3VwZGF0ZV92Z19tZGFfaW5mbyhpbmZvLCB2Z3N1bW1hcnktPm1kYV9jaGVja3N1bSwgdmdzdW1tYXJ5LT5tZGFfc2l6ZSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV91cGRhdGVfdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVuc2lnbmVkIHByZWNvbW1pdHRlZCkKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWNoYXIgcHZpZF9zW0lEX0xFTiArIDFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5IHZnc3VtbWFyeSA9IHsKKwkJLnZnbmFtZSA9IHZnLT5uYW1lLAorCQkudmdzdGF0dXMgPSB2Zy0+c3RhdHVzLAorCQkudmdpZCA9IHZnLT5pZCwKKwkJLnN5c3RlbV9pZCA9IHZnLT5zeXN0ZW1faWQsCisJCS5sb2NrX3R5cGUgPSB2Zy0+bG9ja190eXBlCisJfTsKKworCXB2aWRfc1tzaXplb2YocHZpZF9zKSAtIDFdID0gJ1wwJzsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCXN0cm5jcHkocHZpZF9zLCAoY2hhciAqKSAmcHZsLT5wdi0+aWQsIHNpemVvZihwdmlkX3MpIC0gMSk7CisJCS8qIEZJWE1FIENvdWxkIHB2bC0+cHYtPmRldi0+cHZpZCBldmVyIGJlIGRpZmZlcmVudD8gKi8KKwkJaWYgKChpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQocHZpZF9zLCBwdmwtPnB2LT5kZXYsIDApKSAmJgorCQkgICAgIWx2bWNhY2hlX3VwZGF0ZV92Z25hbWVfYW5kX2lkKGluZm8sICZ2Z3N1bW1hcnkpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogc3RvcmUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB2ZyB0byBjYWNoZSAqLworCWlmICh2Zy0+Y21kLT5jdXJyZW50X3NldHRpbmdzLmNhY2hlX3ZnbWV0YWRhdGEpCisJCV9zdG9yZV9tZXRhZGF0YSh2ZywgcHJlY29tbWl0dGVkKTsKKworCXJldHVybiAxOworfQorCisvKgorICogV2UgY2FuIHNlZSBtdWx0aXBsZSBkaWZmZXJlbnQgZGV2aWNlcyB3aXRoIHRoZQorICogc2FtZSBwdmlkLCBpLmUuIGR1cGxpY2F0ZXMuCisgKgorICogVGhlcmUgbWF5IGJlIGRpZmZlcmVudCByZWFzb25zIGZvciBzZWVpbmcgdHdvCisgKiBkZXZpY2VzIHdpdGggdGhlIHNhbWUgcHZpZDoKKyAqIC0gbXVsdGlwYXRoIHNob3dpbmcgdHdvIHBhdGhzIHRvIHRoZSBzYW1lIHRoaW5nCisgKiAtIG9uZSBkZXZpY2UgY29waWVkIHRvIGFub3RoZXIsIGUuZy4gd2l0aCBkZCwKKyAqICAgYWxzbyByZWZlcnJlZCB0byBhcyBjbG9uZWQgZGV2aWNlcy4KKyAqIC0gYSAic3Vic3lzdGVtIiB0YWtpbmcgYSBkZXZpY2UgYW5kIGNyZWF0aW5nCisgKiAgIGFub3RoZXIgZGV2aWNlIG9mIGl0cyBvd24gdGhhdCByZXByZXNlbnRzIHRoZQorICogICB1bmRlcmx5aW5nIGRldmljZSBpdCBpcyB1c2luZywgZS5nLiB1c2luZyBkbQorICogICB0byBjcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGluZyBvZiBhIFBWLgorICoKKyAqIEdpdmVuIGR1cGxpY2F0ZSBkZXZpY2VzLCB3ZSBoYXZlIHRvIGNob29zZSBvbmUKKyAqIG9mIHRoZW0gdG8gYmUgdGhlICJwcmVmZXJyZWQiIGRldiwgaS5lLiB0aGUgb25lCisgKiB0aGF0IHdpbGwgYmUgcmVmZXJlbmNlZCBpbiBsdm1jYWNoZSwgYnkgcHYtPmRldi4KKyAqIFdlIGNhbiBrZWVwIHRoZSBleGlzdGluZyBkZXYsIHRoYXQncyBjdXJyZW50bHkKKyAqIHVzZWQgaW4gbHZtY2FjaGUsIG9yIHdlIGNhbiByZXBsYWNlIHRoZSBleGlzdGluZworICogZGV2IHdpdGggdGhlIG5ldyBkdXBsaWNhdGUuCisgKgorICogUmVnYXJkbGVzcyBvZiB3aGljaCBkZXZpY2UgaXMgcHJlZmVycmVkLCB3ZSBuZWVkCisgKiB0byBwcmludCBtZXNzYWdlcyBleHBsYWluaW5nIHdoaWNoIGRldmljZXMgd2VyZQorICogZm91bmQgc28gdGhhdCBhIHVzZXIgY2FuIHNvcnQgb3V0IGZvciB0aGVtc2VsdmVzCisgKiB3aGF0IGhhcyBoYXBwZW5lZCBpZiB0aGUgcHJlZmVycmVkIGRldmljZSBpcyBub3QKKyAqIHRoZSBvbmUgdGhleSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAqCisgKiBJZiBhIHVzZXIgd2FudHMgdG8gdXNlIHRoZSBub24tcHJlZmVycmVkIGRldmljZSwKKyAqIHRoZXkgd2lsbCBuZWVkIHRvIGZpbHRlciBvdXQgdGhlIGRldmljZSB0aGF0CisgKiBsdm0gaXMgcHJlZmVycmluZy4KKyAqCisgKiBUaGUgZGV2X3N1YnN5c3RlbSBjYWxscyBjaGVjayBpZiB0aGUgbWFqb3IgbnVtYmVyCisgKiBvZiB0aGUgZGV2IGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gbGlrZSBETS9NRC9EUkJELgorICogQSBkZXYgdGhhdCdzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gaXMgcHJlZmVycmVkIG92ZXIgYQorICogZHVwbGljYXRlIG9mIHRoYXQgZGV2IHRoYXQgaXMgbm90IHBhcnQgb2YgYQorICogc3Vic3lzdGVtLgorICoKKyAqIEZJWE1FOiB0aGVyZSBtYXkgYmUgb3RoZXIgcmVhc29ucyB0byBwcmVmZXIgb25lCisgKiBkZXZpY2Ugb3ZlciBhbm90aGVyOgorICoKKyAqIC4gYXJlIHRoZXJlIG90aGVyIHVzZS9vcGVuIGNvdW50cyB3ZSBjb3VsZCBjaGVjaworICogICBiZXlvbmQgdGhlIGhvbGRlcnM/CisgKgorICogLiBjaGVjayBpZiBlaXRoZXIgaXMgYmFkL3VzYWJsZSBhbmQgcHJlZmVyCisgKiAgIHRoZSBnb29kIG9uZT8KKyAqCisgKiAuIHByZWZlciB0aGUgb25lIHdpdGggc21hbGxlciBtaW5vciBudW1iZXI/CisgKiAgIE1pZ2h0IGF2b2lkIGRpc3R1cmJpbmcgdGhpbmdzIGR1ZSB0byBhIG5ldworICogICB0cmFuc2llbnQgZHVwbGljYXRlPworICovCisKK3N0YXRpYyBzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqIF9jcmVhdGVfaW5mbyhzdHJ1Y3QgbGFiZWxsZXIgKmxhYmVsbGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IGxhYmVsICpsYWJlbDsKKworCWlmICghKGxhYmVsID0gbGFiZWxfY3JlYXRlKGxhYmVsbGVyKSkpCisJCXJldHVybl9OVUxMOworCWlmICghKGluZm8gPSBkbV96YWxsb2Moc2l6ZW9mKCppbmZvKSkpKSB7CisJCWxvZ19lcnJvcigibHZtY2FjaGVfaW5mbyBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlsYWJlbF9kZXN0cm95KGxhYmVsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5mby0+ZGV2ID0gZGV2OworCWluZm8tPmZtdCA9IGxhYmVsbGVyLT5mbXQ7CisKKwlsYWJlbC0+aW5mbyA9IGluZm87CisJaW5mby0+bGFiZWwgPSBsYWJlbDsKKworCWRtX2xpc3RfaW5pdCgmaW5mby0+bGlzdCk7CisJbHZtY2FjaGVfZGVsX21kYXMoaW5mbyk7CisJbHZtY2FjaGVfZGVsX2RhcyhpbmZvKTsKKwlsdm1jYWNoZV9kZWxfYmFzKGluZm8pOworCisJcmV0dXJuIGluZm87Cit9CisKK3N0cnVjdCBsdm1jYWNoZV9pbmZvICpsdm1jYWNoZV9hZGQoc3RydWN0IGxhYmVsbGVyICpsYWJlbGxlciwKKwkJCQkgICBjb25zdCBjaGFyICpwdmlkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgY29uc3QgY2hhciAqdmduYW1lLCBjb25zdCBjaGFyICp2Z2lkLCB1aW50MzJfdCB2Z3N0YXR1cykKK3sKKwljaGFyIHB2aWRfc1tJRF9MRU4gKyAxXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSB2Z3N1bW1hcnkgPSB7IDAgfTsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mb19sb29rdXA7CisJc3RydWN0IGRldmljZV9saXN0ICpkZXZsOworCWludCBjcmVhdGVkID0gMDsKKworCXN0cm5jcHkocHZpZF9zLCBwdmlkLCBzaXplb2YocHZpZF9zKSAtIDEpOworCXB2aWRfc1tzaXplb2YocHZpZF9zKSAtIDFdID0gJ1wwJzsKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkICopJnB2aWRfcywgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJc3RhY2s7CisKKwkvKgorCSAqIEZpbmQgZXhpc3RpbmcgaW5mbyBzdHJ1Y3QgaW4gX3B2aWRfaGFzaCBvciBjcmVhdGUgYSBuZXcgb25lLgorCSAqCisJICogRG9uJ3QgcGFzcyB0aGUga25vd24gImRldiIgYXMgYW4gYXJnIGhlcmUuICBUaGUgbWlzbWF0Y2hpbmcKKwkgKiBkZXZzIGZvciB0aGUgZHVwbGljYXRlIGNhc2UgaXMgY2hlY2tlZCBiZWxvdy4KKwkgKi8KKworCWluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmlkX3MsIE5VTEwsIDApOworCisJaWYgKCFpbmZvKQorCQlpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoZGV2LT5wdmlkLCBOVUxMLCAwKTsKKworCWlmICghaW5mbykgeworCQlpbmZvID0gX2NyZWF0ZV9pbmZvKGxhYmVsbGVyLCBkZXYpOworCQljcmVhdGVkID0gMTsKKwl9CisKKwlpZiAoIWluZm8pCisJCXJldHVybl9OVUxMOworCisJLyoKKwkgKiBJZiBhbiBleGlzdGluZyBpbmZvIHN0cnVjdCB3YXMgZm91bmQsIGNoZWNrIGlmIGFueSB2YWx1ZXMgYXJlIG5ldy4KKwkgKi8KKwlpZiAoIWNyZWF0ZWQpIHsKKwkJaWYgKGluZm8tPmRldiAhPSBkZXYpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBQViAlcyBvbiAlcyB3YXMgYWxyZWFkeSBmb3VuZCBvbiAlcy4iLAorCQkJCSAgdXVpZCwgZGV2X25hbWUoZGV2KSwgZGV2X25hbWUoaW5mby0+ZGV2KSk7CisKKwkJCWlmICghX2ZvdW5kX2R1cGxpY2F0ZV9wdnMgJiYgbHZtZXRhZF91c2VkKCkpIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogRGlzYWJsaW5nIGx2bWV0YWQgY2FjaGUgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBkdXBsaWNhdGUgUFZzLiIpOyAKKwkJCQlsdm1ldGFkX3NldF9kaXNhYmxlZChsYWJlbGxlci0+Zm10LT5jbWQsIExWTUVUQURfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUyk7CisJCQl9CisJCQlfZm91bmRfZHVwbGljYXRlX3B2cyA9IDE7CisKKwkJCXN0cm5jcHkoZGV2LT5wdmlkLCBwdmlkX3MsIHNpemVvZihkZXYtPnB2aWQpKTsKKworCQkJLyoKKwkJCSAqIEtlZXAgdGhlIGV4aXN0aW5nIFBWL2RldiBpbiBsdm1jYWNoZSwgYW5kIHNhdmUgdGhlCisJCQkgKiBuZXcgZHVwbGljYXRlIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuICBBZnRlcgorCQkJICogc2Nhbm5pbmcgaXMgY29tcGxldGUsIGNvbXBhcmUgdGhlIGR1cGxpY2F0ZSBkZXZzCisJCQkgKiB3aXRoIHRob3NlIGluIGx2bWNhY2hlIHRvIGNoZWNrIGlmIG9uZSBvZiB0aGUKKwkJCSAqIGR1cGxpY2F0ZXMgaXMgcHJlZmVycmVkIGFuZCBpZiBzbyBzd2l0Y2ggbHZtY2FjaGUgdG8KKwkJCSAqIHVzZSBpdC4KKwkJCSAqLworCisJCQlpZiAoIShkZXZsID0gZG1femFsbG9jKHNpemVvZigqZGV2bCkpKSkKKwkJCQlyZXR1cm5fTlVMTDsKKwkJCWRldmwtPmRldiA9IGRldjsKKworCQkJZG1fbGlzdF9hZGQoJl9mb3VuZF9kdXBsaWNhdGVfZGV2cywgJmRldmwtPmxpc3QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoaW5mby0+ZGV2LT5wdmlkWzBdICYmIHB2aWRbMF0gJiYgc3RyY21wKHB2aWRfcywgaW5mby0+ZGV2LT5wdmlkKSkgeworCQkJLyogVGhpcyBoYXBwZW5zIHdoZW4gcnVubmluZyBwdmNyZWF0ZSBvbiBhbiBleGlzdGluZyBQVi4gKi8KKwkJCWxvZ192ZXJib3NlKCJDaGFuZ2luZyBwdmlkIG9uIGRldiAlcyBmcm9tICVzIHRvICVzIiwKKwkJCQkgICAgZGV2X25hbWUoaW5mby0+ZGV2KSwgaW5mby0+ZGV2LT5wdmlkLCBwdmlkX3MpOworCQl9CisKKwkJaWYgKGluZm8tPmxhYmVsLT5sYWJlbGxlciAhPSBsYWJlbGxlcikgeworCQkJbG9nX3ZlcmJvc2UoIkNoYW5naW5nIGxhYmVsbGVyIG9uIGRldiAlcyBmcm9tICVzIHRvICVzIiwKKwkJCQkgICAgZGV2X25hbWUoaW5mby0+ZGV2KSwKKwkJCQkgICAgaW5mby0+bGFiZWwtPmxhYmVsbGVyLT5mbXQtPm5hbWUsCisJCQkJICAgIGxhYmVsbGVyLT5mbXQtPm5hbWUpOworCQkJbGFiZWxfZGVzdHJveShpbmZvLT5sYWJlbCk7CisJCQlpZiAoIShpbmZvLT5sYWJlbCA9IGxhYmVsX2NyZWF0ZShsYWJlbGxlcikpKQorCQkJCXJldHVybl9OVUxMOworCQkJaW5mby0+bGFiZWwtPmluZm8gPSBpbmZvOworCQl9CisJfQorCisJaW5mby0+c3RhdHVzIHw9IENBQ0hFX0lOVkFMSUQ7CisKKwkvKgorCSAqIEFkZCBvciB1cGRhdGUgdGhlIF9wdmlkX2hhc2ggbWFwcGluZywgcHZpZCB0byBpbmZvLgorCSAqLworCisJaW5mb19sb29rdXAgPSBkbV9oYXNoX2xvb2t1cChfcHZpZF9oYXNoLCBwdmlkX3MpOworCWlmICgoaW5mb19sb29rdXAgPT0gaW5mbykgJiYgIXN0cmNtcChpbmZvLT5kZXYtPnB2aWQsIHB2aWRfcykpCisJCWdvdG8gdXBkYXRlX3ZnaW5mbzsKKworCWlmIChpbmZvLT5kZXYtPnB2aWRbMF0pCisJCWRtX2hhc2hfcmVtb3ZlKF9wdmlkX2hhc2gsIGluZm8tPmRldi0+cHZpZCk7CisKKwlzdHJuY3B5KGluZm8tPmRldi0+cHZpZCwgcHZpZF9zLCBzaXplb2YoaW5mby0+ZGV2LT5wdmlkKSk7CisKKwlpZiAoIWRtX2hhc2hfaW5zZXJ0KF9wdmlkX2hhc2gsIHB2aWRfcywgaW5mbykpIHsKKwkJbG9nX2Vycm9yKCJBZGRpbmcgcHZpZCB0byBoYXNoIGZhaWxlZCAlcyIsIHB2aWRfcyk7CisJCXJldHVybiBOVUxMOworCX0KKwordXBkYXRlX3ZnaW5mbzoKKwl2Z3N1bW1hcnkudmdzdGF0dXMgPSB2Z3N0YXR1czsKKwl2Z3N1bW1hcnkudmduYW1lID0gdmduYW1lOworCWlmICh2Z2lkKQorCQlzdHJuY3B5KChjaGFyICopJnZnc3VtbWFyeS52Z2lkLCB2Z2lkLCBzaXplb2YodmdzdW1tYXJ5LnZnaWQpKTsKKworCWlmICghbHZtY2FjaGVfdXBkYXRlX3ZnbmFtZV9hbmRfaWQoaW5mbywgJnZnc3VtbWFyeSkpIHsKKwkJaWYgKGNyZWF0ZWQpIHsKKwkJCWRtX2hhc2hfcmVtb3ZlKF9wdmlkX2hhc2gsIHB2aWRfcyk7CisJCQlzdHJjcHkoaW5mby0+ZGV2LT5wdmlkLCAiIik7CisJCQlkbV9mcmVlKGluZm8tPmxhYmVsKTsKKwkJCWRtX2ZyZWUoaW5mbyk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyB2b2lkIF9sdm1jYWNoZV9kZXN0cm95X2VudHJ5KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKQoreworCV92Z2luZm9fZGV0YWNoX2luZm8oaW5mbyk7CisJaW5mby0+ZGV2LT5wdmlkWzBdID0gMDsKKwlsYWJlbF9kZXN0cm95KGluZm8tPmxhYmVsKTsKKwlkbV9mcmVlKGluZm8pOworfQorCitzdGF0aWMgdm9pZCBfbHZtY2FjaGVfZGVzdHJveV92Z25hbWVsaXN0KHN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbykKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICpuZXh0OworCisJZG8geworCQluZXh0ID0gdmdpbmZvLT5uZXh0OworCQlpZiAoIV9mcmVlX3ZnaW5mbyh2Z2luZm8pKQorCQkJc3RhY2s7CisJfSB3aGlsZSAoKHZnaW5mbyA9IG5leHQpKTsKK30KKworc3RhdGljIHZvaWQgX2x2bWNhY2hlX2Rlc3Ryb3lfbG9ja25hbWUoc3RydWN0IGRtX2hhc2hfbm9kZSAqbikKK3sKKwljaGFyICp2Z25hbWU7CisKKwlpZiAoIWRtX2hhc2hfZ2V0X2RhdGEoX2xvY2tfaGFzaCwgbikpCisJCXJldHVybjsKKworCXZnbmFtZSA9IGRtX2hhc2hfZ2V0X2tleShfbG9ja19oYXNoLCBuKTsKKworCWlmICghc3RyY21wKHZnbmFtZSwgVkdfR0xPQkFMKSkKKwkJX3ZnX2dsb2JhbF9sb2NrX2hlbGQgPSAxOworCWVsc2UKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJWb2x1bWUgR3JvdXAgJXMgd2FzIG5vdCB1bmxvY2tlZCIsCisJCQkgIGRtX2hhc2hfZ2V0X2tleShfbG9ja19oYXNoLCBuKSk7Cit9CisKK3ZvaWQgbHZtY2FjaGVfZGVzdHJveShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IHJldGFpbl9vcnBoYW5zLCBpbnQgcmVzZXQpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKwlsb2dfdmVyYm9zZSgiV2lwaW5nIGludGVybmFsIFZHIGNhY2hlIik7CisKKwlfaGFzX3NjYW5uZWQgPSAwOworCisJaWYgKF92Z2lkX2hhc2gpIHsKKwkJZG1faGFzaF9kZXN0cm95KF92Z2lkX2hhc2gpOworCQlfdmdpZF9oYXNoID0gTlVMTDsKKwl9CisKKwlpZiAoX3B2aWRfaGFzaCkgeworCQlkbV9oYXNoX2l0ZXIoX3B2aWRfaGFzaCwgKGRtX2hhc2hfaXRlcmF0ZV9mbikgX2x2bWNhY2hlX2Rlc3Ryb3lfZW50cnkpOworCQlkbV9oYXNoX2Rlc3Ryb3koX3B2aWRfaGFzaCk7CisJCV9wdmlkX2hhc2ggPSBOVUxMOworCX0KKworCWlmIChfdmduYW1lX2hhc2gpIHsKKwkJZG1faGFzaF9pdGVyKF92Z25hbWVfaGFzaCwKKwkJCSAgKGRtX2hhc2hfaXRlcmF0ZV9mbikgX2x2bWNhY2hlX2Rlc3Ryb3lfdmduYW1lbGlzdCk7CisJCWRtX2hhc2hfZGVzdHJveShfdmduYW1lX2hhc2gpOworCQlfdmduYW1lX2hhc2ggPSBOVUxMOworCX0KKworCWlmIChfbG9ja19oYXNoKSB7CisJCWlmIChyZXNldCkKKwkJCV92Z19nbG9iYWxfbG9ja19oZWxkID0gMDsKKwkJZWxzZQorCQkJZG1faGFzaF9pdGVyYXRlKG4sIF9sb2NrX2hhc2gpCisJCQkJX2x2bWNhY2hlX2Rlc3Ryb3lfbG9ja25hbWUobik7CisJCWRtX2hhc2hfZGVzdHJveShfbG9ja19oYXNoKTsKKwkJX2xvY2tfaGFzaCA9IE5VTEw7CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZfdmdpbmZvcykpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX3ZnaW5mb3MgbGlzdCBzaG91bGQgYmUgZW1wdHkiKTsKKwlkbV9saXN0X2luaXQoJl92Z2luZm9zKTsKKworCS8qCisJICogQ29weSB0aGUgY3VycmVudCBfdW51c2VkX2R1cGxpY2F0ZV9kZXZzIGludG8gYSBjbWQgbGlzdCBiZWZvcmUKKwkgKiBkZXN0cm95aW5nIF91bnVzZWRfZHVwbGljYXRlX2RldnMuCisJICoKKwkgKiBPbmUgY29tbWFuZCBjYW4gaW5pdC9wb3B1bGF0ZS9kZXN0cm95IGx2bWNhY2hlIG11bHRpcGxlIHRpbWVzLiAgRWFjaAorCSAqIHRpbWUgaXQgd2lsbCBlbmNvdW50ZXIgZHVwbGljYXRlcyBhbmQgY2hvb3NlIHRoZSBwcmVmZXJycmVkIGRldnMuCisJICogV2Ugd2FudCB0aGUgc2FtZSBwcmVmZXJyZWQgZGV2aWNlcyB0byBiZSBjaG9zZW4gZWFjaCB0aW1lLCBzbyBzYXZlCisJICogdGhlIHVucHJlZmVycmVkIGRldnMgaGVyZSBzbyB0aGF0IF9jaG9vc2VfcHJlZmVycmVkX2RldnMgY2FuIHVzZQorCSAqIHRoaXMgdG8gbWFrZSB0aGUgc2FtZSBjaG9pY2UgZWFjaCB0aW1lLgorCSAqLworCWRtX2xpc3RfaW5pdCgmY21kLT51bnVzZWRfZHVwbGljYXRlX2RldnMpOworCWx2bWNhY2hlX2dldF91bnVzZWRfZHVwbGljYXRlX2RldnMoY21kLCAmY21kLT51bnVzZWRfZHVwbGljYXRlX2RldnMpOworCV9kZXN0cm95X2R1cGxpY2F0ZV9kZXZpY2VfbGlzdCgmX3VudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisJX2Rlc3Ryb3lfZHVwbGljYXRlX2RldmljZV9saXN0KCZfZm91bmRfZHVwbGljYXRlX2RldnMpOyAvKiBzaG91bGQgYmUgZW1wdHkgYW55d2F5ICovCisJX2ZvdW5kX2R1cGxpY2F0ZV9wdnMgPSAwOworCisJaWYgKHJldGFpbl9vcnBoYW5zKQorCQlpZiAoIWluaXRfbHZtY2FjaGVfb3JwaGFucyhjbWQpKQorCQkJc3RhY2s7Cit9CisKK2ludCBsdm1jYWNoZV9wdmlkX2lzX2xvY2tlZChjb25zdCBjaGFyICpwdmlkKSB7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKHB2aWQsIE5VTEwsIDApOworCWlmICghaW5mbyB8fCAhaW5mby0+dmdpbmZvKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBsdm1jYWNoZV92Z25hbWVfaXNfbG9ja2VkKGluZm8tPnZnaW5mby0+dmduYW1lKTsKK30KKworaW50IGx2bWNhY2hlX2ZpZF9hZGRfbWRhcyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJICBjb25zdCBjaGFyICppZCwgaW50IGlkX2xlbikKK3sKKwlyZXR1cm4gZmlkX2FkZF9tZGFzKGZpZCwgJmluZm8tPm1kYXMsIGlkLCBpZF9sZW4pOworfQorCitpbnQgbHZtY2FjaGVfZmlkX2FkZF9tZGFzX3B2KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQpCit7CisJcmV0dXJuIGx2bWNhY2hlX2ZpZF9hZGRfbWRhcyhpbmZvLCBmaWQsIGluZm8tPmRldi0+cHZpZCwgSURfTEVOKTsKK30KKworaW50IGx2bWNhY2hlX2ZpZF9hZGRfbWRhc192ZyhzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8sIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpIHsKKwkJaWYgKCFsdm1jYWNoZV9maWRfYWRkX21kYXNfcHYoaW5mbywgZmlkKSkKKwkJCXJldHVybl8wOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZ2V0X3B2X2lmX2luX3ZnKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCWNoYXIgdmduYW1lW05BTUVfTEVOICsgMV07CisJY2hhciB2Z2lkW0lEX0xFTiArIDFdOworCisJaWYgKGluZm8tPnZnaW5mbyAmJiBpbmZvLT52Z2luZm8tPnZnbmFtZSAmJgorCSAgICAhaXNfb3JwaGFuX3ZnKGluZm8tPnZnaW5mby0+dmduYW1lKSkgeworCQkvKgorCQkgKiBnZXRfcHZfZnJvbV92Z19ieV9pZCgpIG1heSBjYWxsCisJCSAqIGx2bWNhY2hlX2xhYmVsX3NjYW4oKSBhbmQgZHJvcCBjYWNoZWQKKwkJICogdmdpbmZvIHNvIG1ha2UgYSBsb2NhbCBjb3B5IG9mIHN0cmluZy4KKwkJICovCisJCSh2b2lkKSBkbV9zdHJuY3B5KHZnbmFtZSwgaW5mby0+dmdpbmZvLT52Z25hbWUsIHNpemVvZih2Z25hbWUpKTsKKwkJbWVtY3B5KHZnaWQsIGluZm8tPnZnaW5mby0+dmdpZCwgc2l6ZW9mKHZnaWQpKTsKKworCQlpZiAoZ2V0X3B2X2Zyb21fdmdfYnlfaWQoaW5mby0+Zm10LCB2Z25hbWUsIHZnaWQsCisJCQkJCSBpbmZvLT5kZXYtPnB2aWQsIHB2KSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbHZtY2FjaGVfcG9wdWxhdGVfcHZfZmllbGRzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCWludCBzY2FuX2xhYmVsX29ubHkpCit7CisJc3RydWN0IGRhdGFfYXJlYV9saXN0ICpkYTsKKworCS8qIEhhdmUgd2UgYWxyZWFkeSBjYWNoZWQgdmduYW1lPyAqLworCWlmICghc2Nhbl9sYWJlbF9vbmx5ICYmIF9nZXRfcHZfaWZfaW5fdmcoaW5mbywgcHYpKQorCQlyZXR1cm4gMTsKKworCS8qIFBlcmZvcm0gZnVsbCBzY2FuIChqdXN0IHRoZSBmaXJzdCB0aW1lKSBhbmQgdHJ5IGFnYWluICovCisJaWYgKCFzY2FuX2xhYmVsX29ubHkgJiYgIWNyaXRpY2FsX3NlY3Rpb24oKSAmJiAhZnVsbF9zY2FuX2RvbmUoKSkgeworCQlsdm1jYWNoZV9mb3JjZV9uZXh0X2xhYmVsX3NjYW4oKTsKKwkJbHZtY2FjaGVfbGFiZWxfc2NhbihpbmZvLT5mbXQtPmNtZCk7CisKKwkJaWYgKF9nZXRfcHZfaWZfaW5fdmcoaW5mbywgcHYpKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogT3JwaGFuICovCisJcHYtPmRldiA9IGluZm8tPmRldjsKKwlwdi0+Zm10ID0gaW5mby0+Zm10OworCXB2LT5zaXplID0gaW5mby0+ZGV2aWNlX3NpemUgPj4gU0VDVE9SX1NISUZUOworCXB2LT52Z19uYW1lID0gRk1UX1RFWFRfT1JQSEFOX1ZHX05BTUU7CisJbWVtY3B5KCZwdi0+aWQsICZpbmZvLT5kZXYtPnB2aWQsIHNpemVvZihwdi0+aWQpKTsKKworCS8qIEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgZXhhY3RseSBvbmUgZGF0YSBhcmVhICovCisJaWYgKGRtX2xpc3Rfc2l6ZSgmaW5mby0+ZGFzKSAhPSAxKSB7CisJCWxvZ19lcnJvcigiTXVzdCBiZSBleGFjdGx5IG9uZSBkYXRhIGFyZWEgKGZvdW5kICVkKSBvbiBQViAlcyIsCisJCQkgIGRtX2xpc3Rfc2l6ZSgmaW5mby0+ZGFzKSwgZGV2X25hbWUoaW5mby0+ZGV2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgb25lIGJvb3Rsb2FkZXIgYXJlYSBhdCBtb3N0ICovCisJaWYgKGRtX2xpc3Rfc2l6ZSgmaW5mby0+YmFzKSA+IDEpIHsKKwkJbG9nX2Vycm9yKCJNdXN0IGJlIGF0IG1vc3Qgb25lIGJvb3Rsb2FkZXIgYXJlYSAoZm91bmQgJWQpIG9uIFBWICVzIiwKKwkJCSAgZG1fbGlzdF9zaXplKCZpbmZvLT5iYXMpLCBkZXZfbmFtZShpbmZvLT5kZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRhLCAmaW5mby0+ZGFzKQorCQlwdi0+cGVfc3RhcnQgPSBkYS0+ZGlza19sb2NuLm9mZnNldCA+PiBTRUNUT1JfU0hJRlQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGEsICZpbmZvLT5iYXMpIHsKKwkJcHYtPmJhX3N0YXJ0ID0gZGEtPmRpc2tfbG9jbi5vZmZzZXQgPj4gU0VDVE9SX1NISUZUOworCQlwdi0+YmFfc2l6ZSA9IGRhLT5kaXNrX2xvY24uc2l6ZSA+PiBTRUNUT1JfU0hJRlQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV9jaGVja19mb3JtYXQoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCWlmIChpbmZvLT5mbXQgIT0gZm10KSB7CisJCWxvZ19lcnJvcigiUFYgJXMgaXMgYSBkaWZmZXJlbnQgZm9ybWF0IChzZXFubyAlcykiLAorCQkJICBkZXZfbmFtZShpbmZvLT5kZXYpLCBpbmZvLT5mbXQtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbHZtY2FjaGVfZGVsX21kYXMoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJaWYgKGluZm8tPm1kYXMubikKKwkJZGVsX21kYXMoJmluZm8tPm1kYXMpOworCWRtX2xpc3RfaW5pdCgmaW5mby0+bWRhcyk7Cit9CisKK3ZvaWQgbHZtY2FjaGVfZGVsX2RhcyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+ZGFzLm4pCisJCWRlbF9kYXMoJmluZm8tPmRhcyk7CisJZG1fbGlzdF9pbml0KCZpbmZvLT5kYXMpOworfQorCit2b2lkIGx2bWNhY2hlX2RlbF9iYXMoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJaWYgKGluZm8tPmJhcy5uKQorCQlkZWxfYmFzKCZpbmZvLT5iYXMpOworCWRtX2xpc3RfaW5pdCgmaW5mby0+YmFzKTsKK30KKworaW50IGx2bWNhY2hlX2FkZF9tZGEoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3Qgc2l6ZSwgdW5zaWduZWQgaWdub3JlZCkKK3sKKwlyZXR1cm4gYWRkX21kYShpbmZvLT5mbXQsIE5VTEwsICZpbmZvLT5tZGFzLCBkZXYsIHN0YXJ0LCBzaXplLCBpZ25vcmVkKTsKK30KKworaW50IGx2bWNhY2hlX2FkZF9kYShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUpCit7CisJcmV0dXJuIGFkZF9kYShOVUxMLCAmaW5mby0+ZGFzLCBzdGFydCwgc2l6ZSk7Cit9CisKK2ludCBsdm1jYWNoZV9hZGRfYmEoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKQoreworCXJldHVybiBhZGRfYmEoTlVMTCwgJmluZm8tPmJhcywgc3RhcnQsIHNpemUpOworfQorCit2b2lkIGx2bWNhY2hlX3VwZGF0ZV9wdihzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQljb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCkKK3sKKwlpbmZvLT5kZXZpY2Vfc2l6ZSA9IHB2LT5zaXplIDw8IFNFQ1RPUl9TSElGVDsKKwlpbmZvLT5mbXQgPSBmbXQ7Cit9CisKK2ludCBsdm1jYWNoZV91cGRhdGVfZGFzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlzdHJ1Y3QgZGF0YV9hcmVhX2xpc3QgKmRhOworCWlmIChpbmZvLT5kYXMubikgeworCQlpZiAoIXB2LT5wZV9zdGFydCkKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkYSwgJmluZm8tPmRhcykKKwkJCQlwdi0+cGVfc3RhcnQgPSBkYS0+ZGlza19sb2NuLm9mZnNldCA+PiBTRUNUT1JfU0hJRlQ7CisJCWRlbF9kYXMoJmluZm8tPmRhcyk7CisJfSBlbHNlCisJCWRtX2xpc3RfaW5pdCgmaW5mby0+ZGFzKTsKKworCWlmICghYWRkX2RhKE5VTEwsICZpbmZvLT5kYXMsIHB2LT5wZV9zdGFydCA8PCBTRUNUT1JfU0hJRlQsIDAgLypwdi0+c2l6ZSA8PCBTRUNUT1JfU0hJRlQqLykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV91cGRhdGVfYmFzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlzdHJ1Y3QgZGF0YV9hcmVhX2xpc3QgKmJhOworCWlmIChpbmZvLT5iYXMubikgeworCQlpZiAoIXB2LT5iYV9zdGFydCAmJiAhcHYtPmJhX3NpemUpCisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoYmEsICZpbmZvLT5iYXMpIHsKKwkJCQlwdi0+YmFfc3RhcnQgPSBiYS0+ZGlza19sb2NuLm9mZnNldCA+PiBTRUNUT1JfU0hJRlQ7CisJCQkJcHYtPmJhX3NpemUgPSBiYS0+ZGlza19sb2NuLnNpemUgPj4gU0VDVE9SX1NISUZUOworCQkJfQorCQlkZWxfZGFzKCZpbmZvLT5iYXMpOworCX0gZWxzZQorCQlkbV9saXN0X2luaXQoJmluZm8tPmJhcyk7CisKKwlpZiAoIWFkZF9iYShOVUxMLCAmaW5mby0+YmFzLCBwdi0+YmFfc3RhcnQgPDwgU0VDVE9SX1NISUZULCBwdi0+YmFfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgbHZtY2FjaGVfZm9yZWFjaF9wdihzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm8sCisJCQlpbnQgKCpmdW4pKHN0cnVjdCBsdm1jYWNoZV9pbmZvICosIHZvaWQgKiksCisJCQl2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpIHsKKwkJaWYgKCFmdW4oaW5mbywgYmF0b24pKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX21kYShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywKKwkJCSBpbnQgKCpmdW4pKHN0cnVjdCBtZXRhZGF0YV9hcmVhICosIHZvaWQgKiksCisJCQkgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmaW5mby0+bWRhcykgeworCQlpZiAoIWZ1bihtZGEsIGJhdG9uKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBsdm1jYWNoZV9tZGFfY291bnQoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJcmV0dXJuIGRtX2xpc3Rfc2l6ZSgmaW5mby0+bWRhcyk7Cit9CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX2RhKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJaW50ICgqZnVuKShzdHJ1Y3QgZGlza19sb2NuICosIHZvaWQgKiksCisJCQl2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgZGF0YV9hcmVhX2xpc3QgKmRhOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkYSwgJmluZm8tPmRhcykgeworCQlpZiAoIWZ1bigmZGEtPmRpc2tfbG9jbiwgYmF0b24pKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX2JhKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJIGludCAoKmZ1bikoc3RydWN0IGRpc2tfbG9jbiAqLCB2b2lkICopLAorCQkJIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBkYXRhX2FyZWFfbGlzdCAqYmE7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGJhLCAmaW5mby0+YmFzKSB7CisJCWlmICghZnVuKCZiYS0+ZGlza19sb2NuLCBiYXRvbikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZSBsaWZldGltZSBvZiB0aGUgbGFiZWwgcmV0dXJuZWQgaXMgdGllZCB0byB0aGUgbGlmZXRpbWUgb2YgdGhlCisgKiBsdm1jYWNoZV9pbmZvIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGx2bWNhY2hlIGl0c2VsZi4KKyAqLworc3RydWN0IGxhYmVsICpsdm1jYWNoZV9nZXRfbGFiZWwoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pIHsKKwlyZXR1cm4gaW5mby0+bGFiZWw7Cit9CisKK3ZvaWQgbHZtY2FjaGVfbWFrZV92YWxpZChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykgeworCWluZm8tPnN0YXR1cyAmPSB+Q0FDSEVfSU5WQUxJRDsKK30KKwordWludDY0X3QgbHZtY2FjaGVfZGV2aWNlX3NpemUoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pIHsKKwlyZXR1cm4gaW5mby0+ZGV2aWNlX3NpemU7Cit9CisKK3ZvaWQgbHZtY2FjaGVfc2V0X2RldmljZV9zaXplKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB1aW50NjRfdCBzaXplKSB7CisJaW5mby0+ZGV2aWNlX3NpemUgPSBzaXplOworfQorCitzdHJ1Y3QgZGV2aWNlICpsdm1jYWNoZV9kZXZpY2Uoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pIHsKKwlyZXR1cm4gaW5mby0+ZGV2OworfQordm9pZCBsdm1jYWNoZV9zZXRfZXh0X3ZlcnNpb24oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHVpbnQzMl90IHZlcnNpb24pCit7CisJaW5mby0+ZXh0X3ZlcnNpb24gPSB2ZXJzaW9uOworfQorCit1aW50MzJfdCBsdm1jYWNoZV9leHRfdmVyc2lvbihzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykgeworCXJldHVybiBpbmZvLT5leHRfdmVyc2lvbjsKK30KKwordm9pZCBsdm1jYWNoZV9zZXRfZXh0X2ZsYWdzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB1aW50MzJfdCBmbGFncykgeworCWluZm8tPmV4dF9mbGFncyA9IGZsYWdzOworfQorCit1aW50MzJfdCBsdm1jYWNoZV9leHRfZmxhZ3Moc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pIHsKKwlyZXR1cm4gaW5mby0+ZXh0X2ZsYWdzOworfQorCitpbnQgbHZtY2FjaGVfaXNfb3JwaGFuKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKSB7CisJaWYgKCFpbmZvLT52Z2luZm8pCisJCXJldHVybiAxOyAvKiBGSVhNRT8gKi8KKwlyZXR1cm4gaXNfb3JwaGFuX3ZnKGluZm8tPnZnaW5mby0+dmduYW1lKTsKK30KKworaW50IGx2bWNhY2hlX3ZnaWRfaXNfY2FjaGVkKGNvbnN0IGNoYXIgKnZnaWQpIHsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisKKwlpZiAobHZtZXRhZF91c2VkKCkpCisJCXJldHVybiAxOworCisJdmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmdpZCh2Z2lkKTsKKworCWlmICghdmdpbmZvIHx8ICF2Z2luZm8tPnZnbmFtZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaXNfb3JwaGFuX3ZnKHZnaW5mby0+dmduYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGZpbmQgb3V0IGZyb20gdGhpcyBpbmZvIGFsb25lIHdoZXRoZXIgdGhlCisgKiBQViBpbiBxdWVzdGlvbiBpcyBvciBpcyBub3QgYW4gb3JwaGFuLgorICovCitpbnQgbHZtY2FjaGVfdW5jZXJ0YWluX293bmVyc2hpcChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykgeworCXJldHVybiBtZGFzX2VtcHR5X29yX2lnbm9yZWQoJmluZm8tPm1kYXMpOworfQorCit1aW50NjRfdCBsdm1jYWNoZV9zbWFsbGVzdF9tZGFfc2l6ZShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8pCisJCXJldHVybiBVSU5UNjRfQygwKTsKKworCXJldHVybiBmaW5kX21pbl9tZGFfc2l6ZSgmaW5mby0+bWRhcyk7Cit9CisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqbHZtY2FjaGVfZm10KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKSB7CisJcmV0dXJuIGluZm8tPmZtdDsKK30KKworaW50IGx2bWNhY2hlX2xvb2t1cF9tZGEoc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSAqdmdzdW1tYXJ5KQoreworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKworCWlmICghdmdzdW1tYXJ5LT5tZGFfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRSBJbmRleCB0aGUgY2hlY2tzdW1zICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZnaW5mbywgJl92Z2luZm9zKSB7CisJCWlmICh2Z3N1bW1hcnktPm1kYV9jaGVja3N1bSA9PSB2Z2luZm8tPm1kYV9jaGVja3N1bSAmJgorCQkgICAgdmdzdW1tYXJ5LT5tZGFfc2l6ZSA9PSB2Z2luZm8tPm1kYV9zaXplICYmCisJCSAgICAhaXNfb3JwaGFuX3ZnKHZnaW5mby0+dmduYW1lKSkgeworCQkJdmdzdW1tYXJ5LT52Z25hbWUgPSB2Z2luZm8tPnZnbmFtZTsKKwkJCXZnc3VtbWFyeS0+Y3JlYXRpb25faG9zdCA9IHZnaW5mby0+Y3JlYXRpb25faG9zdDsKKwkJCXZnc3VtbWFyeS0+dmdzdGF0dXMgPSB2Z2luZm8tPnN0YXR1czsKKwkJCS8qIHZnaW5mby0+dmdpZCBoYXMgMSBleHRyYSBieXRlIHRoZW4gdmdzdW1tYXJ5LT52Z2lkICovCisJCQltZW1jcHkoJnZnc3VtbWFyeS0+dmdpZCwgdmdpbmZvLT52Z2lkLCBzaXplb2YodmdzdW1tYXJ5LT52Z2lkKSk7CisKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBsdm1jYWNoZV9jb250YWluc19sb2NrX3R5cGVfc2FubG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModmdpbmZvLCAmX3ZnaW5mb3MpIHsKKwkJaWYgKHZnaW5mby0+bG9ja190eXBlICYmICFzdHJjbXAodmdpbmZvLT5sb2NrX3R5cGUsICJzYW5sb2NrIikpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBsdm1jYWNoZV9nZXRfbWF4X25hbWVfbGVuZ3RocyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICB1bnNpZ25lZCAqcHZfbWF4X25hbWVfbGVuLAorCQkJCSAgIHVuc2lnbmVkICp2Z19tYXhfbmFtZV9sZW4pCit7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXVuc2lnbmVkIGxlbjsKKworCSp2Z19tYXhfbmFtZV9sZW4gPSAwOworCSpwdl9tYXhfbmFtZV9sZW4gPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZnaW5mbywgJl92Z2luZm9zKSB7CisJCWxlbiA9IHN0cmxlbih2Z2luZm8tPnZnbmFtZSk7CisJCWlmICgqdmdfbWF4X25hbWVfbGVuIDwgbGVuKQorCQkJKnZnX21heF9uYW1lX2xlbiA9IGxlbjsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaW5mbywgJnZnaW5mby0+aW5mb3MpIHsKKwkJCWxlbiA9IHN0cmxlbihkZXZfbmFtZShpbmZvLT5kZXYpKTsKKwkJCWlmICgqcHZfbWF4X25hbWVfbGVuIDwgbGVuKQorCQkJCSpwdl9tYXhfbmFtZV9sZW4gPSBsZW47CisJCX0KKwl9Cit9CisKK2ludCBsdm1jYWNoZV92Z19pc19mb3JlaWduKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKnZnaWQpCit7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCWludCByZXQgPSAwOworCisJaWYgKGx2bWV0YWRfdXNlZCgpKQorCQlyZXR1cm4gbHZtZXRhZF92Z19pc19mb3JlaWduKGNtZCwgdmduYW1lLCB2Z2lkKTsKKworCWlmICgodmdpbmZvID0gbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmdpZCh2Z2lkKSkpCisJCXJldCA9ICFpc19zeXN0ZW1faWRfYWxsb3dlZChjbWQsIHZnaW5mby0+c3lzdGVtX2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jYWNoZS9sdm1jYWNoZS5oIGIvbGliL2NhY2hlL2x2bWNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4Yjk0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jYWNoZS9sdm1jYWNoZS5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fQ0FDSEVfSAorI2RlZmluZSBfTFZNX0NBQ0hFX0gKKworI2luY2x1ZGUgImRldi1jYWNoZS5oIgorI2luY2x1ZGUgImRldi10eXBlLmgiCisjaW5jbHVkZSAidXVpZC5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisjZGVmaW5lIE9SUEhBTl9QUkVGSVggVkdfT1JQSEFOUworI2RlZmluZSBPUlBIQU5fVkdfTkFNRShmbXQpIE9SUEhBTl9QUkVGSVggIl8iIGZtdAorCisvKiBMVk0gc3BlY2lmaWMgcGVyLXZvbHVtZSBpbmZvICovCisvKiBFdmVudHVhbCByZXBsYWNlbWVudCBmb3Igc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSBwZXJoYXBzPyAqLworCitzdHJ1Y3QgY21kX2NvbnRleHQ7CitzdHJ1Y3QgZm9ybWF0X3R5cGU7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwOworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZTsKK3N0cnVjdCBkbV9jb25maWdfdHJlZTsKK3N0cnVjdCBmb3JtYXRfaW5zdGFuY2U7CitzdHJ1Y3QgbWV0YWRhdGFfYXJlYTsKK3N0cnVjdCBkaXNrX2xvY247CisKK3N0cnVjdCBsdm1jYWNoZV92Z2luZm87CisKKy8qCisgKiB2Z3N1bW1hcnkgcmVwcmVzZW50cyBhIHN1bW1hcnkgb2YgdGhlIFZHIHRoYXQgaXMgcmVhZAorICogd2l0aG91dCBhIGxvY2suICBUaGUgaW5mbyBkb2VzIG5vdCBjb21lIHRocm91Z2ggdmdfcmVhZCgpLAorICogYnV0IHRocm91Z2ggcmVhZGluZyBtZGFzLiAgSXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBWRyB0aGF0IGlzIG5lZWRlZCB0byBsb2NrIHRoZSBWRyBhbmQgdGhlbiByZWFkIGl0IGZ1bGx5CisgKiB3aXRoIHZnX3JlYWQoKSwgYWZ0ZXIgd2hpY2ggdGhlIFZHIHN1bW1hcnkgc2hvdWxkIGJlIGNoZWNrZWQKKyAqIGFnYWluc3QgdGhlIGZ1bGwgVkcgbWV0YWRhdGEgdG8gdmVyaWZ5IGl0IHdhcyBjb3JyZWN0IChzaW5jZQorICogaXQgd2FzIHJlYWQgd2l0aG91dCBhIGxvY2suKQorICoKKyAqIE9uY2UgcmVhZCwgdmdzdW1tYXJ5IGluZm9ybWF0aW9uIGlzIHNhdmVkIGluIGx2bWNhY2hlX3ZnaW5mby4KKyAqLworc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSB7CisJY29uc3QgY2hhciAqdmduYW1lOworCXN0cnVjdCBpZCB2Z2lkOworCXVpbnQ2NF90IHZnc3RhdHVzOworCWNoYXIgKmNyZWF0aW9uX2hvc3Q7CisJY29uc3QgY2hhciAqc3lzdGVtX2lkOworCWNvbnN0IGNoYXIgKmxvY2tfdHlwZTsKKwl1aW50MzJfdCBtZGFfY2hlY2tzdW07CisJc2l6ZV90IG1kYV9zaXplOworfTsKKworaW50IGx2bWNhY2hlX2luaXQodm9pZCk7Cit2b2lkIGx2bWNhY2hlX2FsbG93X3JlYWRzX3dpdGhfbHZtZXRhZCh2b2lkKTsKKwordm9pZCBsdm1jYWNoZV9kZXN0cm95KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgcmV0YWluX29ycGhhbnMsIGludCByZXNldCk7CisKKy8qCisgKiBsdm1jYWNoZV9sYWJlbF9zY2FuKCkgd2lsbCBzY2FuIGxhYmVscyB0aGUgZmlyc3QgdGltZSBpdCdzCisgKiBjYWxsZWQsIGJ1dCBub3Qgb24gc3Vic2VxdWVudCBjYWxscywgdW5sZXNzCisgKiBsdm1jYWNoZV9mb3JjZV9uZXh0X2xhYmVsX3NjYW4oKSBpcyBjYWxsZWQgZmlyc3QKKyAqIHRvIGZvcmNlIHRoZSBuZXh0IGx2bWNhY2hlX2xhYmVsX3NjYW4oKSB0byBzY2FuIGFnYWluLgorICovCit2b2lkIGx2bWNhY2hlX2ZvcmNlX25leHRfbGFiZWxfc2Nhbih2b2lkKTsKK2ludCBsdm1jYWNoZV9sYWJlbF9zY2FuKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworLyogQWRkL2RlbGV0ZSBhIGRldmljZSAqLworc3RydWN0IGx2bWNhY2hlX2luZm8gKmx2bWNhY2hlX2FkZChzdHJ1Y3QgbGFiZWxsZXIgKmxhYmVsbGVyLCBjb25zdCBjaGFyICpwdmlkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKnZnaWQsCisJCQkJICAgdWludDMyX3QgdmdzdGF0dXMpOworaW50IGx2bWNhY2hlX2FkZF9vcnBoYW5fdmdpbmZvKGNvbnN0IGNoYXIgKnZnbmFtZSwgc3RydWN0IGZvcm1hdF90eXBlICpmbXQpOwordm9pZCBsdm1jYWNoZV9kZWwoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOworCisvKiBVcGRhdGUgdGhpbmdzICovCitpbnQgbHZtY2FjaGVfdXBkYXRlX3ZnbmFtZV9hbmRfaWQoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5ICp2Z3N1bW1hcnkpOworaW50IGx2bWNhY2hlX3VwZGF0ZV92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdW5zaWduZWQgcHJlY29tbWl0dGVkKTsKKwordm9pZCBsdm1jYWNoZV9sb2NrX3ZnbmFtZShjb25zdCBjaGFyICp2Z25hbWUsIGludCByZWFkX29ubHkpOwordm9pZCBsdm1jYWNoZV91bmxvY2tfdmduYW1lKGNvbnN0IGNoYXIgKnZnbmFtZSk7CitpbnQgbHZtY2FjaGVfdmVyaWZ5X2xvY2tfb3JkZXIoY29uc3QgY2hhciAqdmduYW1lKTsKKworLyogUXVlcmllcyAqLworY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpsdm1jYWNoZV9mbXRfZnJvbV92Z25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCwgdW5zaWduZWQgcmV2YWxpZGF0ZV9sYWJlbHMpOworaW50IGx2bWNhY2hlX2xvb2t1cF9tZGEoc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSAqdmdzdW1tYXJ5KTsKKworLyogRGVjcmVtZW50IGFuZCB0ZXN0IGlmIHRoZXJlIGFyZSBzdGlsbCB2ZyBob2xkZXJzIGluIHZnaW5mby4gKi8KK2ludCBsdm1jYWNoZV92Z2luZm9faG9sZGVyc19kZWNfYW5kX3Rlc3RfZm9yX3plcm8oc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvKTsKKworc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqbHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKGNvbnN0IGNoYXIgKnZnbmFtZSwKKwkJCQkJICAgY29uc3QgY2hhciAqdmdpZCk7CitzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICpsdm1jYWNoZV92Z2luZm9fZnJvbV92Z2lkKGNvbnN0IGNoYXIgKnZnaWQpOworc3RydWN0IGx2bWNhY2hlX2luZm8gKmx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGNvbnN0IGNoYXIgKnB2aWQsIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHZhbGlkX29ubHkpOworY29uc3QgY2hhciAqbHZtY2FjaGVfdmduYW1lX2Zyb21fdmdpZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICp2Z2lkKTsKK2NvbnN0IGNoYXIgKmx2bWNhY2hlX3ZnaWRfZnJvbV92Z25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSk7CitzdHJ1Y3QgZGV2aWNlICpsdm1jYWNoZV9kZXZpY2VfZnJvbV9wdmlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgaWQgKnB2aWQsCisJCQkJdW5zaWduZWQgKnNjYW5fZG9uZV9vbmNlLCB1aW50NjRfdCAqbGFiZWxfc2VjdG9yKTsKK2NvbnN0IGNoYXIgKmx2bWNhY2hlX3B2aWRfZnJvbV9kZXZuYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkZXZuYW1lKTsKK2NoYXIgKmx2bWNhY2hlX3ZnbmFtZV9mcm9tX3B2aWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnB2aWQpOworY29uc3QgY2hhciAqbHZtY2FjaGVfdmduYW1lX2Zyb21faW5mbyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyk7Citjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmx2bWNhY2hlX2ZtdF9mcm9tX2luZm8oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOworaW50IGx2bWNhY2hlX3Znc19sb2NrZWQodm9pZCk7CitpbnQgbHZtY2FjaGVfdmduYW1lX2lzX2xvY2tlZChjb25zdCBjaGFyICp2Z25hbWUpOworCit2b2lkIGx2bWNhY2hlX3NlZWRfaW5mb3NfZnJvbV9sdm1ldGFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworLyogUmV0dXJucyBsaXN0IG9mIHN0cnVjdCBkbV9zdHJfbGlzdCBjb250YWluaW5nIHBvb2wtYWxsb2NhdGVkIGNvcHkgb2YgdmduYW1lcyAqLworLyogSWYgaW5jbHVkZV9pbnRlcm5hbCBpcyBub3Qgc2V0LCByZXR1cm4gb25seSBwcm9wZXIgdmcgbmFtZXMuICovCitzdHJ1Y3QgZG1fbGlzdCAqbHZtY2FjaGVfZ2V0X3ZnbmFtZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICBpbnQgaW5jbHVkZV9pbnRlcm5hbCk7CisKKy8qIFJldHVybnMgbGlzdCBvZiBzdHJ1Y3QgZG1fc3RyX2xpc3QgY29udGFpbmluZyBwb29sLWFsbG9jYXRlZCBjb3B5IG9mIHZnaWRzICovCisvKiBJZiBpbmNsdWRlX2ludGVybmFsIGlzIG5vdCBzZXQsIHJldHVybiBvbmx5IHByb3BlciB2ZyBpZHMuICovCitzdHJ1Y3QgZG1fbGlzdCAqbHZtY2FjaGVfZ2V0X3ZnaWRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIGludCBpbmNsdWRlX2ludGVybmFsKTsKKworaW50IGx2bWNhY2hlX2dldF92Z25hbWVpZHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBpbmNsdWRlX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZG1fbGlzdCAqdmduYW1laWRzKTsKKworLyogUmV0dXJucyBsaXN0IG9mIHN0cnVjdCBkbV9zdHJfbGlzdCBjb250YWluaW5nIHBvb2wtYWxsb2NhdGVkIGNvcHkgb2YgcHZpZHMgKi8KK3N0cnVjdCBkbV9saXN0ICpsdm1jYWNoZV9nZXRfcHZpZHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwKKwkJCQljb25zdCBjaGFyICp2Z2lkKTsKKworLyogUmV0dXJucyBjYWNoZWQgdm9sdW1lIGdyb3VwIG1ldGFkYXRhLiAqLworc3RydWN0IHZvbHVtZV9ncm91cCAqbHZtY2FjaGVfZ2V0X3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICp2Z2lkLCB1bnNpZ25lZCBwcmVjb21taXR0ZWQpOwordm9pZCBsdm1jYWNoZV9kcm9wX21ldGFkYXRhKGNvbnN0IGNoYXIgKnZnbmFtZSwgaW50IGRyb3BfcHJlY29tbWl0dGVkKTsKK3ZvaWQgbHZtY2FjaGVfY29tbWl0X21ldGFkYXRhKGNvbnN0IGNoYXIgKnZnbmFtZSk7CisKK2ludCBsdm1jYWNoZV9wdmlkX2lzX2xvY2tlZChjb25zdCBjaGFyICpwdmlkKTsKK2ludCBsdm1jYWNoZV9maWRfYWRkX21kYXMoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCSAgY29uc3QgY2hhciAqaWQsIGludCBpZF9sZW4pOworaW50IGx2bWNhY2hlX2ZpZF9hZGRfbWRhc19wdihzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkKTsKK2ludCBsdm1jYWNoZV9maWRfYWRkX21kYXNfdmcoc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvLCBzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQpOworaW50IGx2bWNhY2hlX3BvcHVsYXRlX3B2X2ZpZWxkcyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQlpbnQgc2Nhbl9sYWJlbF9vbmx5KTsKK2ludCBsdm1jYWNoZV9jaGVja19mb3JtYXQoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KTsKK3ZvaWQgbHZtY2FjaGVfZGVsX21kYXMoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOwordm9pZCBsdm1jYWNoZV9kZWxfZGFzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKTsKK3ZvaWQgbHZtY2FjaGVfZGVsX2JhcyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyk7CitpbnQgbHZtY2FjaGVfYWRkX21kYShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplLCB1bnNpZ25lZCBpZ25vcmVkKTsKK2ludCBsdm1jYWNoZV9hZGRfZGEoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKK2ludCBsdm1jYWNoZV9hZGRfYmEoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKKwordm9pZCBsdm1jYWNoZV9zZXRfZXh0X3ZlcnNpb24oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHVpbnQzMl90IHZlcnNpb24pOwordWludDMyX3QgbHZtY2FjaGVfZXh0X3ZlcnNpb24oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOwordm9pZCBsdm1jYWNoZV9zZXRfZXh0X2ZsYWdzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB1aW50MzJfdCBmbGFncyk7Cit1aW50MzJfdCBsdm1jYWNoZV9leHRfZmxhZ3Moc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOworCitjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmx2bWNhY2hlX2ZtdChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyk7CitzdHJ1Y3QgbGFiZWwgKmx2bWNhY2hlX2dldF9sYWJlbChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyk7CisKK3ZvaWQgbHZtY2FjaGVfdXBkYXRlX3B2KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KTsKK2ludCBsdm1jYWNoZV91cGRhdGVfZGFzKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CitpbnQgbHZtY2FjaGVfdXBkYXRlX2JhcyhzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworaW50IGx2bWNhY2hlX2ZvcmVhY2hfbWRhKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJIGludCAoKmZ1bikoc3RydWN0IG1ldGFkYXRhX2FyZWEgKiwgdm9pZCAqKSwKKwkJCSB2b2lkICpiYXRvbik7CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX2RhKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJaW50ICgqZnVuKShzdHJ1Y3QgZGlza19sb2NuICosIHZvaWQgKiksCisJCQl2b2lkICpiYXRvbik7CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX2JhKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLAorCQkJaW50ICgqZnVuKShzdHJ1Y3QgZGlza19sb2NuICosIHZvaWQgKiksCisJCQl2b2lkICpiYXRvbik7CisKK2ludCBsdm1jYWNoZV9mb3JlYWNoX3B2KHN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnLAorCQkJaW50ICgqZnVuKShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqLCB2b2lkICopLCB2b2lkICogYmF0b24pOworCit1aW50NjRfdCBsdm1jYWNoZV9kZXZpY2Vfc2l6ZShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyk7Cit2b2lkIGx2bWNhY2hlX3NldF9kZXZpY2Vfc2l6ZShzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgdWludDY0X3Qgc2l6ZSk7CitzdHJ1Y3QgZGV2aWNlICpsdm1jYWNoZV9kZXZpY2Uoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOwordm9pZCBsdm1jYWNoZV9tYWtlX3ZhbGlkKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKTsKK2ludCBsdm1jYWNoZV9pc19vcnBoYW4oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOworaW50IGx2bWNhY2hlX3VuY2VydGFpbl9vd25lcnNoaXAoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pOwordW5zaWduZWQgbHZtY2FjaGVfbWRhX2NvdW50KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKTsKK2ludCBsdm1jYWNoZV92Z2lkX2lzX2NhY2hlZChjb25zdCBjaGFyICp2Z2lkKTsKK3VpbnQ2NF90IGx2bWNhY2hlX3NtYWxsZXN0X21kYV9zaXplKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKTsKKworaW50IGx2bWNhY2hlX2ZvdW5kX2R1cGxpY2F0ZV9wdnModm9pZCk7CisKK2ludCBsdm1jYWNoZV9nZXRfdW51c2VkX2R1cGxpY2F0ZV9kZXZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCk7CisKK2ludCB2Z19oYXNfZHVwbGljYXRlX3B2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKK2ludCBsdm1jYWNoZV9jb250YWluc19sb2NrX3R5cGVfc2FubG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKK3ZvaWQgbHZtY2FjaGVfZ2V0X21heF9uYW1lX2xlbmd0aHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQl1bnNpZ25lZCAqcHZfbWF4X25hbWVfbGVuLCB1bnNpZ25lZCAqdmdfbWF4X25hbWVfbGVuKTsKKworaW50IGx2bWNhY2hlX3ZnX2lzX2ZvcmVpZ24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCk7CisKK3ZvaWQgbHZtY2FjaGVfbG9ja19vcmRlcmluZyhpbnQgZW5hYmxlKTsKKworaW50IGx2bWNhY2hlX2Rldl9pc191bmNob3Nlbl9kdXBsaWNhdGUoc3RydWN0IGRldmljZSAqZGV2KTsKKwordm9pZCBsdm1jYWNoZV9yZW1vdmVfdW5jaG9zZW5fZHVwbGljYXRlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBsdm1jYWNoZV9wdmlkX2luX3VuY2hvc2VuX2R1cGxpY2F0ZXMoY29uc3QgY2hhciAqcHZpZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NhY2hlL2x2bWV0YWQuYyBiL2xpYi9jYWNoZS9sdm1ldGFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwM2Q5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jYWNoZS9sdm1ldGFkLmMKQEAgLTAsMCArMSwyODU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAibHZtZXRhZC5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAibHZtZXRhZC1jbGllbnQuaCIKKyNpbmNsdWRlICJmb3JtYXQtdGV4dC5oIiAvLyBUT0RPIGZvciBkaXNrX2xvY24sIHVzZWQgYXMgYSBEQSByZXByZXNlbnRhdGlvbgorI2luY2x1ZGUgImNyYy5oIgorI2luY2x1ZGUgImx2bS1zaWduYWwuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyBkYWVtb25faGFuZGxlIF9sdm1ldGFkID0geyAuZXJyb3IgPSAwIH07CitzdGF0aWMgaW50IF9sdm1ldGFkX3VzZSA9IDA7CitzdGF0aWMgaW50IF9sdm1ldGFkX2Nvbm5lY3RlZCA9IDA7CitzdGF0aWMgaW50IF9sdm1ldGFkX2RhZW1vbl9waWQgPSAwOworCitzdGF0aWMgY2hhciAqX2x2bWV0YWRfdG9rZW4gPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKl9sdm1ldGFkX3NvY2tldCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGNtZF9jb250ZXh0ICpfbHZtZXRhZF9jbWQgPSBOVUxMOworc3RhdGljIGludDY0X3QgX2x2bWV0YWRfdXBkYXRlX3RpbWVvdXQ7CisKK3N0YXRpYyBpbnQgX2ZvdW5kX2x2bTFfbWV0YWRhdGEgPSAwOworCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqbHZtZXRhZF9wdnNjYW5fdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworc3RhdGljIHVpbnQ2NF90IF9tb25vdG9uaWNfc2Vjb25kcyh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCWlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiB0cy50dl9zZWM7Cit9CisKK3N0YXRpYyBpbnQgX2xvZ19kZWJ1Z19pbmVxdWFsaXR5KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqYSwgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpiKQoreworCWludCByZXN1bHQgPSAwOworCWludCBmaW5hbF9yZXN1bHQgPSAwOworCisJaWYgKGEtPnYgJiYgYi0+dikgeworCQlyZXN1bHQgPSBjb21wYXJlX3ZhbHVlKGEtPnYsIGItPnYpOworCQlpZiAocmVzdWx0KSB7CisJCQlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICphdiA9IGEtPnY7CisJCQlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpidiA9IGItPnY7CisKKwkJCWlmICghc3RyY21wKGEtPmtleSwgYi0+a2V5KSkgeworCQkJCWlmIChhLT52LT50eXBlID09IERNX0NGR19TVFJJTkcgJiYgYi0+di0+dHlwZSA9PSBETV9DRkdfU1RSSU5HKQorCQkJCQlsb2dfZGVidWdfbHZtZXRhZCgiVkcgJXMgbWV0YWRhdGEgaW5lcXVhbGl0eSBhdCAlcyAvICVzOiAlcyAvICVzIiwKKwkJCQkJCQkgIG5hbWUsIGEtPmtleSwgYi0+a2V5LCBhdi0+di5zdHIsIGJ2LT52LnN0cik7CisJCQkJZWxzZSBpZiAoYS0+di0+dHlwZSA9PSBETV9DRkdfSU5UICYmIGItPnYtPnR5cGUgPT0gRE1fQ0ZHX0lOVCkKKwkJCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlZHICVzIG1ldGFkYXRhIGluZXF1YWxpdHkgYXQgJXMgLyAlczogIiBGTVRpNjQgIiAvICIgRk1UaTY0LAorCQkJCQkJCSAgbmFtZSwgYS0+a2V5LCBiLT5rZXksIGF2LT52LmksIGJ2LT52LmkpOworCQkJCWVsc2UKKwkJCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlZHICVzIG1ldGFkYXRhIGluZXF1YWxpdHkgYXQgJXMgLyAlczogdHlwZSAlZCAvIHR5cGUgJWQiLAorCQkJCQkJCSAgbmFtZSwgYS0+a2V5LCBiLT5rZXksIGF2LT50eXBlLCBidi0+dHlwZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZ19kZWJ1Z19sdm1ldGFkKCJWRyAlcyBtZXRhZGF0YSBpbmVxdWFsaXR5IGF0ICVzIC8gJXMiLCBuYW1lLCBhLT5rZXksIGItPmtleSk7CisJCQl9CisJCQlmaW5hbF9yZXN1bHQgPSByZXN1bHQ7CisJCX0KKwl9CisKKwlpZiAoYS0+diAmJiAhYi0+dikgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiVkcgJXMgbWV0YWRhdGEgaW5lcXVhbGl0eSBhdCAlcyAvICVzIiwgbmFtZSwgYS0+a2V5LCBiLT5rZXkpOworCQlmaW5hbF9yZXN1bHQgPSAxOworCX0KKworCWlmICghYS0+diAmJiBiLT52KSB7CisJCWxvZ19kZWJ1Z19sdm1ldGFkKCJWRyAlcyBtZXRhZGF0YSBpbmVxdWFsaXR5IGF0ICVzIC8gJXMiLCBuYW1lLCBhLT5rZXksIGItPmtleSk7CisJCWZpbmFsX3Jlc3VsdCA9IC0xOworCX0KKworCWlmIChhLT5jaGlsZCAmJiBiLT5jaGlsZCkgeworCQlyZXN1bHQgPSBfbG9nX2RlYnVnX2luZXF1YWxpdHkobmFtZSwgYS0+Y2hpbGQsIGItPmNoaWxkKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWZpbmFsX3Jlc3VsdCA9IHJlc3VsdDsKKwl9CisKKwlpZiAoYS0+c2liICYmIGItPnNpYikgeworCQlyZXN1bHQgPSBfbG9nX2RlYnVnX2luZXF1YWxpdHkobmFtZSwgYS0+c2liLCBiLT5zaWIpOworCQlpZiAocmVzdWx0KQorCQkJZmluYWxfcmVzdWx0ID0gcmVzdWx0OworCX0KKwkKKworCWlmIChhLT5zaWIgJiYgIWItPnNpYikgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiVkcgJXMgbWV0YWRhdGEgaW5lcXVhbGl0eSBhdCAlcyAvICVzIiwgbmFtZSwgYS0+a2V5LCBiLT5rZXkpOworCQlmaW5hbF9yZXN1bHQgPSAxOworCX0KKworCWlmICghYS0+c2liICYmIGItPnNpYikgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiVkcgJXMgbWV0YWRhdGEgaW5lcXVhbGl0eSBhdCAlcyAvICVzIiwgbmFtZSwgYS0+a2V5LCBiLT5rZXkpOworCQlmaW5hbF9yZXN1bHQgPSAtMTsKKwl9CisKKwlyZXR1cm4gZmluYWxfcmVzdWx0OworfQorCit2b2lkIGx2bWV0YWRfZGlzY29ubmVjdCh2b2lkKQoreworCWlmIChfbHZtZXRhZF9jb25uZWN0ZWQpCisJCWRhZW1vbl9jbG9zZShfbHZtZXRhZCk7CisKKwlfbHZtZXRhZF9jb25uZWN0ZWQgPSAwOworCV9sdm1ldGFkX3VzZSA9IDA7CisJX2x2bWV0YWRfY21kID0gTlVMTDsKK30KKworaW50IGx2bWV0YWRfY29ubmVjdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpZiAoIWx2bWV0YWRfc29ja2V0X3ByZXNlbnQoKSkgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gbHZtZXRhZDogc29ja2V0IG5vdCBwcmVzZW50LiIpOworCQlfbHZtZXRhZF9jb25uZWN0ZWQgPSAwOworCQlfbHZtZXRhZF91c2UgPSAwOworCQlfbHZtZXRhZF9jbWQgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlfbHZtZXRhZF91cGRhdGVfdGltZW91dCA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgZ2xvYmFsX2x2bWV0YWRfdXBkYXRlX3dhaXRfdGltZV9DRkcsIE5VTEwpOworCisJX2x2bWV0YWQgPSBsdm1ldGFkX29wZW4oX2x2bWV0YWRfc29ja2V0KTsKKworCWlmIChfbHZtZXRhZC5zb2NrZXRfZmQgPj0gMCAmJiAhX2x2bWV0YWQuZXJyb3IpIHsKKwkJbG9nX2RlYnVnX2x2bWV0YWQoIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gbHZtZXRhZCBvbiBmZCAlZC4iLAorCQkJCSAgX2x2bWV0YWQuc29ja2V0X2ZkKTsKKwkJX2x2bWV0YWRfY29ubmVjdGVkID0gMTsKKwkJX2x2bWV0YWRfdXNlID0gMTsKKwkJX2x2bWV0YWRfY21kID0gY21kOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gbHZtZXRhZDogJXMiLCBzdHJlcnJvcihfbHZtZXRhZC5lcnJvcikpOworCQlfbHZtZXRhZF9jb25uZWN0ZWQgPSAwOworCQlfbHZtZXRhZF91c2UgPSAwOworCQlfbHZtZXRhZF9jbWQgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBsdm1ldGFkX3VzZWQodm9pZCkKK3sKKwlyZXR1cm4gX2x2bWV0YWRfdXNlOworfQorCit2b2lkIGx2bWV0YWRfbWFrZV91bnVzZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJbHZtZXRhZF9kaXNjb25uZWN0KCk7CisKKwlpZiAoY21kICYmICFyZWZyZXNoX2ZpbHRlcnMoY21kKSkKKwkJc3RhY2s7Cit9CisKK2ludCBsdm1ldGFkX3BpZGZpbGVfcHJlc2VudCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnBpZGZpbGUgPSBnZXRlbnYoIkxWTV9MVk1FVEFEX1BJREZJTEUiKSA/OiBMVk1FVEFEX1BJREZJTEU7CisKKwlyZXR1cm4gIWFjY2VzcyhwaWRmaWxlLCBGX09LKTsKK30KKworaW50IGx2bWV0YWRfc29ja2V0X3ByZXNlbnQodm9pZCkKK3sKKwljb25zdCBjaGFyICpzb2NrZXQgPSBfbHZtZXRhZF9zb2NrZXQgPzogTFZNRVRBRF9TT0NLRVQ7CisJaW50IHI7CisKKwlpZiAoKHIgPSBhY2Nlc3Moc29ja2V0LCBGX09LKSkgJiYgZXJybm8gIT0gRU5PRU5UKQorCQlsb2dfc3lzX2Vycm9yKCJhY2Nlc3MiLCBzb2NrZXQpOworCisJcmV0dXJuICFyOworfQorCit2b2lkIGx2bWV0YWRfc2V0X3NvY2tldChjb25zdCBjaGFyICpzb2NrKQoreworCV9sdm1ldGFkX3NvY2tldCA9IHNvY2s7Cit9CisKKy8qCisgKiBVc2UgYSBjcmMgb2YgdGhlIHN0cmluZ3MgaW4gdGhlIGZpbHRlciBhcyB0aGUgbHZtZXRhZCB0b2tlbi4KKyAqLwordm9pZCBsdm1ldGFkX3NldF90b2tlbihjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpmaWx0ZXIpCit7CisJaW50IGZ0ID0gMDsKKworCWRtX2ZyZWUoX2x2bWV0YWRfdG9rZW4pOworCisJd2hpbGUgKGZpbHRlciAmJiBmaWx0ZXItPnR5cGUgPT0gRE1fQ0ZHX1NUUklORykgeworCQlmdCA9IGNhbGNfY3JjKGZ0LCAoY29uc3QgdWludDhfdCAqKSBmaWx0ZXItPnYuc3RyLCBzdHJsZW4oZmlsdGVyLT52LnN0cikpOworCQlmaWx0ZXIgPSBmaWx0ZXItPm5leHQ7CisJfQorCisJaWYgKGRtX2FzcHJpbnRmKCZfbHZtZXRhZF90b2tlbiwgImZpbHRlcjoldSIsIGZ0KSA8IDApCisJCWxvZ193YXJuKCJXQVJOSU5HOiBGYWlsZWQgdG8gc2V0IGx2bWV0YWQgdG9rZW4uIE91dCBvZiBtZW1vcnk/Iik7Cit9CisKK3ZvaWQgbHZtZXRhZF9yZWxlYXNlX3Rva2VuKHZvaWQpCit7CisJZG1fZnJlZShfbHZtZXRhZF90b2tlbik7CisJX2x2bWV0YWRfdG9rZW4gPSBOVUxMOworfQorCisvKgorICogQ2hlY2sgaWYgbHZtZXRhZCdzIHRva2VuIG1hdGNoZXMgb3VyIHRva2VuLiAgVGhlIHRva2VuIGlzIGEgaGFzaCBvZiB0aGUKKyAqIGdsb2JhbCBmaWx0ZXIgdXNlZCB0byBwb3B1bGF0ZSBsdm1ldGFkLiAgVGhlIGx2bWV0YWQgdG9rZW4gd2FzIHNldCBieSB0aGUKKyAqIGxhc3QgY29tbWFuZCB0byBwb3B1bGF0ZSBsdm1ldGFkLCBhbmQgaXQgd2FzIHNldCB0byB0aGUgaGFzaCBvZiB0aGUgZ2xvYmFsCisgKiBmaWx0ZXIgdGhhdCBjb21tYW5kIHVzZWQgd2hlbiBzY2FubmluZyB0byBwb3B1bGF0ZSBsdm1ldGFkLgorICoKKyAqIE91ciB0b2tlbiBpcyBhIGhhc2ggb2YgdGhlIGdsb2JhbCBmaWx0ZXIgdGhpcyBjb21tYW5kIGlzIHVzaW5nLgorICoKKyAqIElmIHRoZSBsdm1ldGFkIHRva2VuIGlzIG5vdCBzZXQgKG9yICJub25lIiksIHRoZW4gbHZtZXRhZCBoYXMgbm90IGJlZW4KKyAqIHBvcHVsYXRlZC4gIElmIHRoZSBsdm1ldGFkIHRva2VuIGlzICJ1cGRhdGUgaW4gcHJvZ3Jlc3MiLCB0aGVuIGx2bWV0YWQgaXMKKyAqIGN1cnJlbnRseSBiZWluZyBwb3B1bGF0ZWQgLS0gdGhpcyBzaG91bGQgYmUgdGVtcG9yYXJ5LCBzbyB3YWl0IGZvciBhIHdoaWxlCisgKiBmb3IgdGhlIGN1cnJlbnQgdXBkYXRlIHRvIGZpbmlzaCBhbmQgdGhlbiBjb21wYXJlIG91ciB0b2tlbiB3aXRoIHRoZSBuZXcgb25lCisgKiAoaG9wZWZ1bGx5IGl0IHdpbGwgbWF0Y2gpLiAgSWYgdGhlIGx2bWV0YWQgdG9rZW4gb3RoZXJ3aXNlIGRpZmZlcnMgZnJvbQorICogb3VycywgdGhlbiBsdm1ldGFkIHdhcyBwb3B1bGF0ZWQgdXNpbmcgYSBkaWZmZXJlbnQgZ2xvYmFsIGZpbHRlciB0aGF0IHdlIGFyZQorICogdXNpbmcuCisgKgorICogUmV0dXJuIDEgaWYgdGhlIGx2bWV0YWQgdG9rZW4gbWF0Y2hlcyBvdXJzLiAgV2UgY2FuIHVzZSBpdCBhcyBpcy4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgbHZtZXRhZCB0b2tlbiBkb2VzIG5vdCBtYXRjaCBvdXJzIChsdm1ldGFkIGlzIGVtcHR5IG9yCisgKiBwb3B1bGF0ZWQgdXNpbmcgYSBkaWZmZXJlbnQgZ2xvYmFsIGZpbHRlcikuICBUaGUgY2FsbGVyIHdpbGwgcmVwb3B1bGF0ZQorICogbHZtZXRhZCAodmlhIGx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKSBiZWZvcmUgdXNpbmcgbHZtZXRhZC4KKyAqCisgKiBJZiB3ZSB0aW1lIG91dCB3YWl0aW5nIGZvciBhbiBsdm1ldGFkIHVwZGF0ZSB0byBmaW5pc2gsIHRoZW4gZGlzYWJsZSB0aGlzCisgKiBjb21tYW5kJ3MgdXNlIG9mIGx2bWV0YWQgYW5kIHJldHVybiAwLgorICovCisKK2ludCBsdm1ldGFkX3Rva2VuX21hdGNoZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNvbnN0IGNoYXIgKmRhZW1vbl90b2tlbjsKKwl1bnNpZ25lZCBpbnQgZGVsYXlfdXNlYyA9IDA7CisJdW5zaWduZWQgaW50IHdhaXRfc2VjID0gMDsKKwl1aW50NjRfdCBub3cgPSAwLCB3YWl0X3N0YXJ0ID0gMDsKKwlpbnQgcmV0ID0gMTsKKworCXdhaXRfc2VjID0gKHVuc2lnbmVkIGludClfbHZtZXRhZF91cGRhdGVfdGltZW91dDsKKworcmV0cnk6CisJbG9nX2RlYnVnX2x2bWV0YWQoIlNlbmRpbmcgbHZtZXRhZCBnZXRfZ2xvYmFsX2luZm8iKTsKKworCXJlcGx5ID0gZGFlbW9uX3NlbmRfc2ltcGxlKF9sdm1ldGFkLCAiZ2V0X2dsb2JhbF9pbmZvIiwKKwkJCQkgICAidG9rZW4gPSAlcyIsICJza2lwIiwKKwkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCSAgICJjbWQgPSAlcyIsIGdldF9jbWRfbmFtZSgpLAorCQkJCSAgIE5VTEwpOworCWlmIChyZXBseS5lcnJvcikgeworCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYWZ0ZXIgc2VuZCBlcnJvciAoJWQpLiIsIHJlcGx5LmVycm9yKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkgeworCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYWZ0ZXIgcmVzcG9uc2UgZXJyb3IuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIShkYWVtb25fdG9rZW4gPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAidG9rZW4iLCBOVUxMKSkpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIHdpdGggb2xkZXIgdmVyc2lvbi4iKTsgCisJCWdvdG8gZmFpbDsKKwl9CisKKwlfbHZtZXRhZF9kYWVtb25fcGlkID0gKGludClkYWVtb25fcmVwbHlfaW50KHJlcGx5LCAiZGFlbW9uX3BpZCIsIDApOworCisJLyoKKwkgKiBJZiBsdm1ldGFkIGlzIGJlaW5nIHVwZGF0ZWQgYnkgYW5vdGhlciBjb21tYW5kLCB0aGVuIHNsZWVwIGFuZCByZXRyeQorCSAqIHVudGlsIHRoZSB0b2tlbiBzaG93cyB0aGUgdXBkYXRlIGlzIGRvbmUsIGFuZCBnbyBvbiB0byB0aGUgdG9rZW4KKwkgKiBjb21wYXJpc29uLgorCSAqCisJICogQmV0d2VlbiByZXRyaWVzLCBzbGVlcCBmb3IgYSByYW5kb20gcGVyaW9kIGJldHdlZW4gMSBhbmQgMiBzZWNvbmRzLgorCSAqIFJldHJ5IGluIHRoaXMgd2F5IGZvciB1cCB0byBhIGNvbmZpZ3VyYWJsZSBwZXJpb2Qgb2YgdGltZS4KKwkgKi8KKwlpZiAoIXN0cmNtcChkYWVtb25fdG9rZW4sIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKSkgeworCQlpZiAoIShub3cgPSBfbW9ub3RvbmljX3NlY29uZHMoKSkpCisJCQlnb3RvIGZhaWw7CisKKwkJaWYgKCF3YWl0X3N0YXJ0KQorCQkJd2FpdF9zdGFydCA9IG5vdzsKKworCQlpZiAobm93IC0gd2FpdF9zdGFydCA+IHdhaXRfc2VjKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYWZ0ZXIgJXUgc2VjIGx2bWV0YWRfdXBkYXRlX3dhaXRfdGltZS4iLCB3YWl0X3NlYyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlsb2dfd2FybigiV0FSTklORzogbHZtZXRhZCBpcyBiZWluZyB1cGRhdGVkLCByZXRyeWluZyAoc2V0dXApIGZvciAldSBtb3JlIHNlY29uZHMuIiwKKwkJCSB3YWl0X3NlYyAtICh1bnNpZ25lZCBpbnQpKG5vdyAtIHdhaXRfc3RhcnQpKTsKKworCQkvKiBEZWxheSBhIHJhbmRvbSBwZXJpb2QgYmV0d2VlbiAxIGFuZCAyIHNlY29uZHMuICovCisJCWRlbGF5X3VzZWMgPSAxMDAwMDAwICsgbHZtX2V2ZW5fcmFuZCgmX2x2bWV0YWRfY21kLT5yYW5kX3NlZWQsIDEwMDAwMDApOworCQl1c2xlZXAoZGVsYXlfdXNlYyk7CisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIGx2bWV0YWQgaXMgZW1wdHksIG5vdCB5ZXQgcG9wdWxhdGVkLgorCSAqIFRoZSBjYWxsZXIgc2hvdWxkIGRvIGEgZGlzayBzY2FuIHRvIHBvcHVsYXRlIGx2bWV0YWQuCisJICovCisJaWYgKCFzdHJjbXAoZGFlbW9uX3Rva2VuLCAibm9uZSIpKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogbHZtZXRhZCBoYXMgYW4gdW5tYXRjaGluZyB0b2tlbjsgaXQgd2FzIGxhc3QgcG9wdWxhdGVkIHVzaW5nCisJICogYSBkaWZmZXJlbnQgZ2xvYmFsIGZpbHRlci4KKwkgKiBUaGUgY2FsbGVyIHNob3VsZCBkbyBhIGRpc2sgc2NhbiB0byBwb3B1bGF0ZSBsdm1ldGFkIHdpdGgKKwkgKiBvdXIgZ2xvYmFsIGZpbHRlci4KKwkgKi8KKwlpZiAoc3RyY21wKGRhZW1vbl90b2tlbiwgX2x2bWV0YWRfdG9rZW4pKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcmV0OworCitmYWlsOgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkvKiBUaGUgY29tbWFuZCB3aWxsIG5vdCB1c2UgbHZtZXRhZCBhbmQgd2lsbCByZXZlcnQgdG8gc2Nhbm5pbmcuICovCisJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCXJldHVybiAwOworfQorCisvKgorICogV2FpdCB1cCB0byBsdm1ldGFkX3VwZGF0ZV93YWl0X3RpbWUgZm9yIHRoZSBsdm1ldGFkIHVwZGF0aW5nIHN0YXRlIHRvIGJlCisgKiBmaW5pc2hlZC4KKyAqCisgKiBSZXR1cm4gMCBpZiBsdm1ldGFkIGlzIG5vdCB1cGRhdGluZyBvciB0aGVyZSdzIGFuIGVycm9yIGFuZCB3ZSBjYW4ndCB0ZWxsLgorICogUmV0dXJuIDEgaWYgbHZtZXRhZCBpcyB1cGRhdGluZy4KKyAqLworc3RhdGljIGludCBfbHZtZXRhZF9pc191cGRhdGluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGRvX3dhaXQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNvbnN0IGNoYXIgKmRhZW1vbl90b2tlbjsKKwl1bnNpZ25lZCBpbnQgd2FpdF9zZWMgPSAwOworCXVpbnQ2NF90IG5vdyA9IDAsIHdhaXRfc3RhcnQgPSAwOworCWludCByZXQgPSAwOworCisJd2FpdF9zZWMgPSAodW5zaWduZWQgaW50KV9sdm1ldGFkX3VwZGF0ZV90aW1lb3V0OworcmV0cnk6CisJbG9nX2RlYnVnX2x2bWV0YWQoIlNlbmRpbmcgbHZtZXRhZCBnZXRfZ2xvYmFsX2luZm8iKTsKKworCXJlcGx5ID0gZGFlbW9uX3NlbmRfc2ltcGxlKF9sdm1ldGFkLCAiZ2V0X2dsb2JhbF9pbmZvIiwKKwkJCQkgICAidG9rZW4gPSAlcyIsICJza2lwIiwKKwkJCQkgICAicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KWdldHBpZCgpLAorCQkJCSAgICJjbWQgPSAlcyIsIGdldF9jbWRfbmFtZSgpLAorCQkJCSAgIE5VTEwpOworCWlmIChyZXBseS5lcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZXNwb25zZSIsICIiKSwgIk9LIikpCisJCWdvdG8gb3V0OworCisJaWYgKCEoZGFlbW9uX3Rva2VuID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInRva2VuIiwgTlVMTCkpKQorCQlnb3RvIG91dDsKKworCWlmICghc3RyY21wKGRhZW1vbl90b2tlbiwgTFZNRVRBRF9UT0tFTl9VUERBVEVfSU5fUFJPR1JFU1MpKSB7CisJCXJldCA9IDE7CisKKwkJaWYgKCFkb193YWl0KQorCQkJZ290byBvdXQ7CisKKwkJaWYgKCEobm93ID0gX21vbm90b25pY19zZWNvbmRzKCkpKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKCF3YWl0X3N0YXJ0KQorCQkJd2FpdF9zdGFydCA9IG5vdzsKKworCQlpZiAobm93IC0gd2FpdF9zdGFydCA+PSB3YWl0X3NlYykKKwkJCWdvdG8gb3V0OworCisJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIGlzIGJlaW5nIHVwZGF0ZWQsIHdhaXRpbmcgZm9yICV1IG1vcmUgc2Vjb25kcy4iLAorCQkJIHdhaXRfc2VjIC0gKHVuc2lnbmVkIGludCkobm93IC0gd2FpdF9zdGFydCkpOworCisJCXVzbGVlcCgxMDAwMDAwKTsKKwkJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCQlnb3RvIHJldHJ5OworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQorCitvdXQ6CisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBkYWVtb25fcmVwbHkgX2x2bWV0YWRfc2VuZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqaWQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWRhZW1vbl9yZXBseSByZXBseSA9IHsgMCB9OworCWRhZW1vbl9yZXF1ZXN0IHJlcTsKKwljb25zdCBjaGFyICp0b2tlbl9leHBlY3RlZDsKKwl1bnNpZ25lZCBpbnQgZGVsYXlfdXNlYzsKKwl1bnNpZ25lZCBpbnQgd2FpdF9zZWMgPSAwOworCXVpbnQ2NF90IG5vdyA9IDAsIHdhaXRfc3RhcnQgPSAwOworCWludCBkYWVtb25faW5fdXBkYXRlOworCWludCB3ZV9hcmVfaW5fdXBkYXRlOworCisJaWYgKCFfbHZtZXRhZF9jb25uZWN0ZWQgfHwgIV9sdm1ldGFkX3VzZSkgeworCQlyZXBseS5lcnJvciA9IEVDT05OUkVTRVQ7CisJCXJldHVybiByZXBseTsKKwl9CisKKwl3YWl0X3NlYyA9ICh1bnNpZ25lZCBpbnQpX2x2bWV0YWRfdXBkYXRlX3RpbWVvdXQ7CityZXRyeToKKwlyZXEgPSBkYWVtb25fcmVxdWVzdF9tYWtlKGlkKTsKKworCWlmICghZGFlbW9uX3JlcXVlc3RfZXh0ZW5kKHJlcSwKKwkJCQkgICAidG9rZW4gPSAlcyIsIF9sdm1ldGFkX3Rva2VuID86ICJub25lIiwKKwkJCQkgICAidXBkYXRlX3RpbWVvdXQgPSAiIEZNVGQ2NCwgKGludDY0X3Qpd2FpdF9zZWMsCisJCQkJICAgInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClnZXRwaWQoKSwKKwkJCQkgICAiY21kID0gJXMiLCBnZXRfY21kX25hbWUoKSwKKwkJCQkgICBOVUxMKSkgeworCQlyZXBseS5lcnJvciA9IEVOT01FTTsKKwkJcmV0dXJuIHJlcGx5OworCX0KKworCXZhX3N0YXJ0KGFwLCBpZCk7CisJZGFlbW9uX3JlcXVlc3RfZXh0ZW5kX3YocmVxLCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJlcGx5ID0gZGFlbW9uX3NlbmQoX2x2bWV0YWQsIHJlcSk7CisKKwlkYWVtb25fcmVxdWVzdF9kZXN0cm95KHJlcSk7CisKKwlpZiAocmVwbHkuZXJyb3IgPT0gRUNPTk5SRVNFVCkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IGx2bWV0YWQgY29ubmVjdGlvbiBmYWlsZWQsIGNhbm5vdCByZWNvbm5lY3QuIik7IAorCisJLyoKKwkgKiBGb3IgdGhlICJ0b2tlbl91cGRhdGUiIG1lc3NhZ2UsIHRoZSByZXN1bHQgaXMgaGFuZGxlZCBlbnRpcmVseQorCSAqIGJ5IHRoZSBfdG9rZW5fdXBkYXRlKCkgZnVuY3Rpb24sIHNvIHJldHVybiB0aGUgcmVwbHkgaW1tZWRpYXRlbHkuCisJICovCisJaWYgKCFzdHJjbXAoaWQsICJ0b2tlbl91cGRhdGUiKSkKKwkJcmV0dXJuIHJlcGx5OworCisJLyoKKwkgKiBGb3Igb3RoZXIgbWVzc2FnZXMgaXQgbWF5IGJlIHVzZWZ1bCB0byByZXRyeSBhbmQgcmVzZW5kIHRoZQorCSAqIG1lc3NhZ2UsIHNvIGNoZWNrIGZvciB0aGF0IGNhc2UgYmVmb3JlIHJldHVybmluZyB0aGUgcmVwbHkuCisJICogVGhlIHJlcGx5IHdpbGwgYmUgY2hlY2tlZCBmdXJ0aGVyIGluIGx2bWV0YWRfaGFuZGxlX3JlcGx5LgorCSAqLworCisJaWYgKHJlcGx5LmVycm9yKQorCQlyZXR1cm4gcmVwbHk7CisKKwlpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJ0b2tlbl9taXNtYXRjaCIpKSB7CisJCXRva2VuX2V4cGVjdGVkID0gZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgImV4cGVjdGVkIiwgIiIpOworCQlkYWVtb25faW5fdXBkYXRlID0gIXN0cmNtcCh0b2tlbl9leHBlY3RlZCwgTFZNRVRBRF9UT0tFTl9VUERBVEVfSU5fUFJPR1JFU1MpOworCQl3ZV9hcmVfaW5fdXBkYXRlID0gIXN0cmNtcChfbHZtZXRhZF90b2tlbiwgTFZNRVRBRF9UT0tFTl9VUERBVEVfSU5fUFJPR1JFU1MpOworCisJCWlmIChkYWVtb25faW5fdXBkYXRlICYmICF3ZV9hcmVfaW5fdXBkYXRlKSB7CisJCQkvKgorCQkJICogQW5vdGhlciBjb21tYW5kIGlzIHVwZGF0aW5nIGx2bWV0YWQsIGFuZCB3ZSBjYW5ub3QKKwkJCSAqIHVzZSBsdm1ldGFkIHVudGlsIHRoZSB1cGRhdGUgaXMgZmluaXNoZWQuICBSZXRyeSBvdXIKKwkJCSAqIHJlcXVlc3QgZm9yIGEgd2hpbGU7IHRoZSB1cGRhdGUgc2hvdWxkIGZpbmlzaAorCQkJICogc2hvcnRseS4gIFRoaXMgc2hvdWxkIG5vdCB1c3VhbGx5IGhhcHBlbiBiZWNhdXNlCisJCQkgKiB0aGlzIGNvbW1hbmQgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIHRva2VuIGlzCisJCQkgKiB1c2FibGUgaW4gbHZtZXRhZF90b2tlbl9tYXRjaGVzKCksIGJ1dCBpdCdzIHBvc3NpYmxlCisJCQkgKiBmb3IgYW5vdGhlciBjb21tYW5kJ3MgcmVzY2FuIHRvIHNsaXAgaW4gYmV0d2VlbiB0aGUKKwkJCSAqIHRpbWUgd2UgY2FsbCBsdm1ldGFkX3Rva2VuX21hdGNoZXMoKSBhbmQgdGhlIHRpbWUgd2UKKwkJCSAqIGdldCBoZXJlIHRvIGx2bWV0YWRfc2VuZCgpLgorCQkJICovCisKKwkJCWlmICghKG5vdyA9IF9tb25vdG9uaWNfc2Vjb25kcygpKSkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYgKCF3YWl0X3N0YXJ0KQorCQkJCXdhaXRfc3RhcnQgPSBub3c7CisKKwkJCWlmICghd2FpdF9zZWMgfHwgKG5vdyAtIHdhaXRfc3RhcnQgPj0gd2FpdF9zZWMpKSB7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IENhbm5vdCB1c2UgbHZtZXRhZCBhZnRlciAldSBzZWMgbHZtZXRhZF91cGRhdGVfd2FpdF90aW1lLiIsIHdhaXRfc2VjKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJbG9nX3dhcm4oIldBUk5JTkc6IGx2bWV0YWQgaXMgYmVpbmcgdXBkYXRlZCwgcmV0cnlpbmcgKCVzKSBmb3IgJXUgbW9yZSBzZWNvbmRzLiIsCisJCQkJIGlkLCB3YWl0X3NlYyAtICh1bnNpZ25lZCBpbnQpKG5vdyAtIHdhaXRfc3RhcnQpKTsKKworCQkJLyogRGVsYXkgYSByYW5kb20gcGVyaW9kIGJldHdlZW4gMSBhbmQgMiBzZWNvbmRzLiAqLworCQkJZGVsYXlfdXNlYyA9IDEwMDAwMDAgKyBsdm1fZXZlbl9yYW5kKCZfbHZtZXRhZF9jbWQtPnJhbmRfc2VlZCwgMTAwMDAwMCk7CisJCQl1c2xlZXAoZGVsYXlfdXNlYyk7CisJCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJCQlnb3RvIHJldHJ5OworCisJCX0gZWxzZSB7CisJCQkvKiBTZWUgbHZtZXRhZF9oYW5kbGVfcmVwbHkgZm9yIGhhbmRsaW5nIG90aGVyIGNhc2VzLiAqLworCQl9CisJfQorb3V0OgorCXJldHVybiByZXBseTsKK30KKworLyoKKyAqIHRva2VuX3VwZGF0ZSBoYXBwZW5zIHdoZW4gc3RhcnRpbmcgb3IgZW5kaW5nIGFuIGx2bWV0YWQgdXBkYXRlLgorICogV2hlbiBzdGFydGluZyB3ZSBzZXQgdGhlIHRva2VuIHRvICJ1cGRhdGUgaW4gcHJvZ3Jlc3MiLgorICogV2hlbiBlbmRpbmcgd2Ugc2V0IHRoZSB0b2tlbiB0byBvdXIgZmlsdGVyOjxoYXNoPi4KKyAqCisgKiBGcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIGNvbW1hbmQsIHRoZSBsdm1ldGFkIHN0YXRlIGlzIG9uZSBvZjoKKyAqICJub25lIiAtIHRoZSBsdm1ldGFkIGNhY2hlIGlzIG5vdCBwb3B1bGF0ZWQgYW5kIGFuIHVwZGF0ZSBpcyByZXF1aXJlZC4KKyAqICJmaWx0ZXI6PG1hdGNoaW5nX2hhc2g+IiAtIHRoZSBjb21tYW5kIHdpdGggY2FuIHVzZSB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqICJmaWx0ZXI6PHVubWF0Y2hpbmdfaGFzaD4iIC0gdGhlIGx2bWV0YWQgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIHRvIGJlIHVzZWQuCisgKiAidXBkYXRlIGluIHByb2dyZXNzIiAtIGEgY29tbWFuZCBpcyB1cGRhdGluZyB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqCisgKiAuIElmIG5vbmUsIHRoZSBjb21tYW5kIHdpbGwgdXBkYXRlIChzY2FuIGFuZCBwb3B1bGF0ZSBsdm1ldGFkKSwKKyAqICAgdGhlbiB1c2UgdGhlIGNhY2hlLgorICoKKyAqIC4gSWYgZmlsdGVyIGlzIG1hdGNoaW5nLCB0aGUgY29tbWFuZCB3aWxsIHVzZSB0aGUgY2FjaGUuCisgKgorICogLiBJZiBmaWx0ZXIgaXMgdW5tYXRjaGluZywgdGhlIGNvbW1hbmQgd2lsbCB1cGRhdGUgKHNjYW4gYW5kCisgKiAgIHBvcHVsYXRlIGx2bWV0YWQpLCB0aGVuIHVzZSB0aGUgY2FjaGUuCisgKgorICogLiBJZiB1cGRhdGUgaW4gcHJvZ3Jlc3MsIHRoZSBjb21tYW5kIHdpbGwgd2FpdCBmb3IgYSB3aGlsZSBmb3IgdGhlIHN0YXRlCisgKiAgIHRvIGJlY29tZSBub24tdXBkYXRpbmcuICBJZiBpdCBjaGFuZ2VzLCBzZWUgYWJvdmUsIGlmIGl0IGRvZXNuJ3QgY2hhbmdlLAorICogICB0aGVuIHRoZSBjb21tYW5kIGVpdGhlciByZXZlcnRzIHRvIG5vdCB1c2luZyBsdm1ldGFkLCBvciBkb2VzIGFuIHVwZGF0ZQorICogICAoc2NhbiBhbmQgcG9wdWxhdGUgbHZtZXRhZCkgYW5kIHRoZW4gdXNlcyB0aGUgY2FjaGUuCisgKgorICogQSBjb21tYW5kIHRoYXQgaXMgZXhwbGljaXRseSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNhY2hlIHdpbGwgYWx3YXlzIGRvCisgKiB0aGF0IChpdCBtYXkgd2FpdCBmb3IgYSB3aGlsZSBmaXJzdCB0byBhbGxvdyBhIGN1cnJlbnQgdXBkYXRlIHRvIGNvbXBsZXRlKS4KKyAqIEEgY29tbWFuZCB0aGF0IGlzIG5vdCBleHBsaWNpdGx5IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgbWF5IGNob29zZQorICogdG8gcmV2ZXJ0IHRvIHNjYW5uaW5nIGFuZCBub3QgdXNlIGx2bWV0YWQuCisgKgorICogQmVjYXVzZSB0d28gZGlmZmVyZW50IHVwZGF0ZXMgZnJvbSB0d28gY29tbWFuZHMgY2FuIHBvdGVudGlhbGx5IG92ZXJsYXAsCisgKiBsdm1ldGFkIHNhdmVzIHRoZSBwaWQgb2YgdGhlIGxhdGVzdCB1cGRhdGUgdG8gc3RhcnQsIHNvIGl0IGNhbiByZWplY3QgbWVzc2FnZXMKKyAqIGZyb20gcHJlZW1wdGVkIHVwZGF0ZXMuICBUaGlzIHByZXZlbnRzIGFuIGludmFsaWQgbWl4IG9mIHR3byBkaWZmZXJlbnQgdXBkYXRlcy4KKyAqIChUaGUgY29tbWFuZCBtYWtlcyB1c2Ugb2YgdGhlIHVwZGF0ZV9waWQgdG8gcHJpbnQgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcy4pCisgKgorICogSWYgbHZtZXRhZCBkZXRlY3RzIHRoYXQgYSBjb21tYW5kIGRvaW5nIGFuIHVwZGF0ZSBpcyB0YWtpbmcgdG9vIGxvbmcsIGl0IHdpbGwKKyAqIGNoYW5nZSB0aGUgdG9rZW4gZnJvbSAidXBkYXRlIGluIHByb2dyZXNzIiB0byAibm9uZSIsIHdoaWNoIG1lYW5zIGEgbmV3IHVwZGF0ZQorICogaXMgcmVxdWlyZWQsIGNhdXNpbmcgdGhlIG5leHQgY29tbWFuZCB0byBkbyBhbiB1cGRhdGUuICBUaGlzIGVmZmVjdGl2ZWx5CisgKiBjYW5jZWxzL3ByZWVtcHRzIGEgc2xvdy9zdHVjayB1cGRhdGUsIGFuZCBoZWxwcyB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUKKyAqIHNvbWUgZmFpbHVyZSBjYXNlcy4KKyAqLworCitzdGF0aWMgaW50IF90b2tlbl91cGRhdGUoaW50ICpyZXBsYWNlZF91cGRhdGUpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNvbnN0IGNoYXIgKnRva2VuX2V4cGVjdGVkOworCWNvbnN0IGNoYXIgKnByZXZfdG9rZW47CisJaW50IHVwZGF0ZV9waWQ7CisJaW50IGVuZGluZ19vdXJfdXBkYXRlOworCisJbG9nX2RlYnVnX2x2bWV0YWQoIlNlbmRpbmcgbHZtZXRhZCB0b2tlbl91cGRhdGUgJXMiLCBfbHZtZXRhZF90b2tlbik7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKE5VTEwsICJ0b2tlbl91cGRhdGUiLCBOVUxMKTsKKworCWlmIChyZXBsYWNlZF91cGRhdGUpCisJCSpyZXBsYWNlZF91cGRhdGUgPSAwOworCisJaWYgKHJlcGx5LmVycm9yKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIHRva2VuIHVwZGF0ZSBlcnJvcjogJXMiLCBzdHJlcnJvcihyZXBseS5lcnJvcikpOworCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJCXJldHVybiAwOworCX0KKworCXVwZGF0ZV9waWQgPSAoaW50KWRhZW1vbl9yZXBseV9pbnQocmVwbHksICJ1cGRhdGVfcGlkIiwgMCk7CisKKwkvKgorCSAqIEEgbWlzbWF0Y2ggY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhpcyBjb21tYW5kIGF0dGVtcHRzIHRvIHNldCB0aGUKKwkgKiB0b2tlbiB0byBmaWx0ZXI6PGhhc2g+IGF0IHRoZSBlbmQgb2YgaXRzIHVwZGF0ZSwgYnV0IHRoZSB1cGRhdGUgaGFzCisJICogYmVlbiBwcmVlbXB0ZWQgaW4gbHZtZXRhZCBieSBhIG5ldyBvbmUgKGZyb20gdXBkYXRlX3BpZCkuCisJICovCisJaWYgKCFzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAidG9rZW5fbWlzbWF0Y2giKSkgeworCQl0b2tlbl9leHBlY3RlZCA9IGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJleHBlY3RlZCIsICIiKTsKKworCQllbmRpbmdfb3VyX3VwZGF0ZSA9IHN0cmNtcChfbHZtZXRhZF90b2tlbiwgTFZNRVRBRF9UT0tFTl9VUERBVEVfSU5fUFJPR1JFU1MpOworCisJCWxvZ19kZWJ1Z19sdm1ldGFkKCJSZWNlaXZlZCB0b2tlbiB1cGRhdGUgbWlzbWF0Y2ggZXhwZWN0ZWQgXCIlc1wiIG91ciB0b2tlbiBcIiVzXCIgdXBkYXRlX3BpZCAlZCBvdXIgcGlkICVkIiwKKwkJCQkgIHRva2VuX2V4cGVjdGVkLCBfbHZtZXRhZF90b2tlbiwgdXBkYXRlX3BpZCwgZ2V0cGlkKCkpOworCisJCWlmIChlbmRpbmdfb3VyX3VwZGF0ZSAmJiAodXBkYXRlX3BpZCAhPSBnZXRwaWQoKSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIHdhcyB1cGRhdGVkIGJ5IGFub3RoZXIgY29tbWFuZCAocGlkICVkKS4iLCB1cGRhdGVfcGlkKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTaG91bGRuJ3QgaGFwcGVuLgorCQkJICogSWYgd2UncmUgZW5kaW5nIG91ciB1cGRhdGUgYW5kIG91ciBwaWQgbWF0Y2hlcyB0aGUgdXBkYXRlX3BpZCwKKwkJCSAqIHRoZW4gdGhlcmUgd291bGQgbm90IGJlIGEgbWlzbWF0Y2guCisJCQkgKiBJZiB3ZSdyZSBzdGFydGluZyBhIG5ldyB1cGRhdGUsIGx2bWV0YWQgbmV2ZXIgcmV0dXJucyBhCisJCQkgKiB0b2tlbiBtaXNtYXRjaC4KKwkJCSAqIEluIGFueSBjYXNlLCBpdCBkb2Vzbid0IGh1cnQgdG8ganVzdCByZXR1cm4gYW4gZXJyb3IgaGVyZS4KKwkJCSAqLworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJsdm1ldGFkIHRva2VuIHVwZGF0ZSBtaXNtYXRjaCBwaWQgJWQgbWF0Y2hlcyBvdXIgb3duIHBpZCAlZCIsIHVwZGF0ZV9waWQsIGdldHBpZCgpKTsKKwkJfQorCisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJPSyIpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHJlc3BvbnNlIGZyb20gbHZtZXRhZCBmb3IgdG9rZW4gdXBkYXRlLiIpOworCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgocHJldl90b2tlbiA9IGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJwcmV2X3Rva2VuIiwgTlVMTCkpKSB7CisJCWlmICghc3RyY21wKHByZXZfdG9rZW4sIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKSkKKwkJCWlmIChyZXBsYWNlZF91cGRhdGUgJiYgKHVwZGF0ZV9waWQgIT0gZ2V0cGlkKCkpKQorCQkJCSpyZXBsYWNlZF91cGRhdGUgPSAxOworCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhlbHBlcjsgZXZhbHVhdGUgdGhlIHJlcGx5IGZyb20gbHZtZXRhZCwgY2hlY2sgZm9yIGVycm9ycywgcHJpbnQgZGlhZ25vc3RpY3MKKyAqIGFuZCByZXR1cm4gYSBzdW1tYXJ5IHN1Y2Nlc3MvZmFpbHVyZSBleGl0IGNvZGUuCisgKgorICogSWYgZm91bmQgaXMgc2V0LCAqZm91bmQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRldmljZSBleGlzdHMsCisgKiBhbmQgbWlzc2luZyBkZXZpY2UgaXMgbm90IHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgX2x2bWV0YWRfaGFuZGxlX3JlcGx5KGRhZW1vbl9yZXBseSByZXBseSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50ICpmb3VuZCkKK3sKKwljb25zdCBjaGFyICp0b2tlbl9leHBlY3RlZDsKKwljb25zdCBjaGFyICphY3Rpb247CisJaW50IGFjdGlvbl9tb2RpZmllcyA9IDA7CisJaW50IGRhZW1vbl9pbl91cGRhdGU7CisJaW50IHdlX2FyZV9pbl91cGRhdGU7CisJaW50IHVwZGF0ZV9waWQ7CisKKwlpZiAoIWlkKQorCQlhY3Rpb24gPSAiPG5vbmU+IjsKKwllbHNlIGlmICghc3RyY21wKGlkLCAicHZfbGlzdCIpKQorCQlhY3Rpb24gPSAibGlzdCBQVnMiOworCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJ2Z19saXN0IikpCisJCWFjdGlvbiA9ICJsaXN0IFZHcyI7CisJZWxzZSBpZiAoIXN0cmNtcChpZCwgInZnX2xvb2t1cCIpKQorCQlhY3Rpb24gPSAibG9va3VwIFZHIjsKKwllbHNlIGlmICghc3RyY21wKGlkLCAicHZfbG9va3VwIikpCisJCWFjdGlvbiA9ICJsb29rdXAgUFYiOworCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJwdl9jbGVhcl9hbGwiKSkKKwkJYWN0aW9uID0gImNsZWFyIGluZm8gYWJvdXQgYWxsIFBWcyI7CisJZWxzZSBpZiAoIXN0cmNtcChpZCwgInZnX2NsZWFyX291dGRhdGVkX3B2cyIpKQorCQlhY3Rpb24gPSAiY2xlYXIgdGhlIGxpc3Qgb2Ygb3V0ZGF0ZWQgUFZzIjsKKwllbHNlIGlmICghc3RyY21wKGlkLCAic2V0X3ZnX2luZm8iKSkKKwkJYWN0aW9uID0gInNldCBWRyBpbmZvIjsKKwllbHNlIGlmICghc3RyY21wKGlkLCAidmdfdXBkYXRlIikpCisJCWFjdGlvbiA9ICJ1cGRhdGUgVkciOworCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJ2Z19yZW1vdmUiKSkKKwkJYWN0aW9uID0gInJlbW92ZSBWRyI7CisJZWxzZSBpZiAoIXN0cmNtcChpZCwgInB2X2ZvdW5kIikpIHsKKwkJYWN0aW9uID0gInVwZGF0ZSBQViI7CisJCWFjdGlvbl9tb2RpZmllcyA9IDE7CisJfSBlbHNlIGlmICghc3RyY21wKGlkLCAicHZfZ29uZSIpKSB7CisJCWFjdGlvbiA9ICJkcm9wIFBWIjsKKwkJYWN0aW9uX21vZGlmaWVzID0gMTsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuY2hlY2tlZCBsdm1ldGFkIG1lc3NhZ2UgJXMuIiwgaWQpOworCQlhY3Rpb24gPSAiYWN0aW9uIHVua25vd24iOworCX0KKworCWlmIChyZXBseS5lcnJvcikgeworCQlsb2dfd2FybigiV0FSTklORzogbHZtZXRhZCBjYW5ub3QgYmUgdXNlZCBkdWUgdG8gZXJyb3I6ICVzIiwgc3RyZXJyb3IocmVwbHkuZXJyb3IpKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogRXJyb3JzIHJlbGF0ZWQgdG8gdG9rZW4gbWlzbWF0Y2guCisJICovCisKKwlpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJ0b2tlbl9taXNtYXRjaCIpKSB7CisKKwkJdG9rZW5fZXhwZWN0ZWQgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAiZXhwZWN0ZWQiLCAiIik7CisJCXVwZGF0ZV9waWQgPSAoaW50KWRhZW1vbl9yZXBseV9pbnQocmVwbHksICJ1cGRhdGVfcGlkIiwgMCk7CisKKwkJbG9nX2RlYnVnKCJsdm1ldGFkIHRva2VuIG1pc21hdGNoLCBleHBlY3RlZCBcIiVzXCIgb3VyIHRva2VuIFwiJXNcIiIsCisJCQkgIHRva2VuX2V4cGVjdGVkLCBfbHZtZXRhZF90b2tlbik7CisKKwkJZGFlbW9uX2luX3VwZGF0ZSA9ICFzdHJjbXAodG9rZW5fZXhwZWN0ZWQsIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKTsKKwkJd2VfYXJlX2luX3VwZGF0ZSA9ICFzdHJjbXAoX2x2bWV0YWRfdG9rZW4sIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTKTsKKworCQlpZiAoZGFlbW9uX2luX3VwZGF0ZSAmJiB3ZV9hcmVfaW5fdXBkYXRlKSB7CisKKwkJCS8qCisJCQkgKiBXaGVuIHdlIGRvIG5vdCBtYXRjaCB0aGUgdXBkYXRlX3BpZCwgaXQgbWVhbnMgb3VyCisJCQkgKiB1cGRhdGUgd2FzIGNhbmNlbGxlZCBhbmQgYW5vdGhlciBwcm9jZXNzIGlzIG5vdworCQkJICogdXBkYXRpbmcgdGhlIGNhY2hlLgorCQkJICovCisKKwkJCWlmICh1cGRhdGVfcGlkICE9IGdldHBpZCgpKSB7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IGx2bWV0YWQgaXMgYmVpbmcgdXBkYXRlZCBieSBhbm90aGVyIGNvbW1hbmQgKHBpZCAlZCkuIiwgdXBkYXRlX3BpZCk7CisJCQl9IGVsc2UgeworCQkJCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImx2bWV0YWQgdXBkYXRlIGJ5IHBpZCAlZCBtYXRjaGVzIG91ciBvd24gcGlkICVkIiwgdXBkYXRlX3BpZCwgZ2V0cGlkKCkpOworCQkJfQorCQkJLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGUgYWN0aW9uIHdhcyBtb2RpZnlpbmcgZHVyaW5nIGEgdG9rZW4gdXBkYXRlLiAqLworCQkJYWN0aW9uX21vZGlmaWVzID0gMDsKKwkJCWdvdG8gZmFpbDsKKworCQl9IGVsc2UgaWYgKGRhZW1vbl9pbl91cGRhdGUgJiYgIXdlX2FyZV9pbl91cGRhdGUpIHsKKworCQkJLyoKKwkJCSAqIEFub3RoZXIgY29tbWFuZCBpcyB1cGRhdGluZyBsdm1ldGFkLCBhbmQgd2UgY2Fubm90CisJCQkgKiB1c2UgbHZtZXRhZCB1bnRpbCB0aGUgdXBkYXRlIGlzIGZpbmlzaGVkLgorCQkJICogbHZtZXRhZF9zZW5kIHJlc2VudCB0aGlzIG1lc3NhZ2UgdXAgdG8gdGhlIGxpbWl0IGFuZAorCQkJICogZXZlbnR1YWxseSBnYXZlIHVwLiAgVGhlIGNhbGxlciBtYXkgY2hvb3NlIHRvIG5vdAorCQkJICogdXNlIGx2bWV0YWQgYXQgdGhpcyBwb2ludCBhbmQgcmV2ZXJ0IHRvIHNjYW5uaW5nLgorCQkJICovCisKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIGlzIGJlaW5nIHVwZGF0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLiIpOworCQkJZ290byBmYWlsOworCisJCX0gZWxzZSBpZiAoIWRhZW1vbl9pbl91cGRhdGUgJiYgd2VfYXJlX2luX3VwZGF0ZSkgeworCisJCQkvKgorCQkJICogV2UgYXJlIHVwZGF0aW5nIGx2bWV0YWQgYWZ0ZXIgc2V0dGluZyB0aGUgdG9rZW4gdG8KKwkJCSAqICJ1cGRhdGUgaW4gcHJvZ3Jlc3MiLCBidXQgbHZtZXRhZCBoYXMgYSBub24tdXBkYXRlCisJCQkgKiB0b2tlbiBhbmQgaXMgcmVqZWN0aW5nIG91ciB1cGRhdGUgbWVzc2FnZXMuICBUaGlzCisJCQkgKiBtdXN0IG1lYW4gdGhhdCBsdm1ldGFkIGNhbmNlbGxlZCBvdXIgdXBkYXRlICh3ZSB3ZXJlCisJCQkgKiBwcm9iYWJseSB0b28gc2xvdywgdGFraW5nIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0KSwKKwkJCSAqIHNvIGFub3RoZXIgY29tbWFuZCBjb21wbGV0ZWQgYW4gdXBkYXRlIGFuZCBzZXQgdGhlCisJCQkgKiB0b2tlbiBiYXNlZCBvbiBpdHMgZmlsdGVyLiAgSGVyZSB3ZSd2ZSBhdHRlbXB0IHRvCisJCQkgKiBjb250aW51ZSBvdXIgY2FjaGUgdXBkYXRlLCBhbmQgZmluZCB3ZSd2ZSBiZWVuCisJCQkgKiBwcmVlbXB0ZWQsIHNvIHdlIHNob3VsZCBqdXN0IGFib3J0IG91ciBmYWlsZWQKKwkJCSAqIHVwZGF0ZS4KKwkJCSAqLworCisJCQlsb2dfd2FybigiV0FSTklORzogbHZtZXRhZCB3YXMgdXBkYXRlZCBieSBhbm90aGVyIGNvbW1hbmQuIik7CisJCQkvKiBXZSBkb24ndCBjYXJlIGlmIHRoZSBhY3Rpb24gd2FzIG1vZGlmeWluZyBkdXJpbmcgYSB0b2tlbiB1cGRhdGUuICovCisJCQlhY3Rpb25fbW9kaWZpZXMgPSAwOworCQkJZ290byBmYWlsOworCisJCX0gZWxzZSBpZiAoIWRhZW1vbl9pbl91cGRhdGUgJiYgIXdlX2FyZV9pbl91cGRhdGUpIHsKKworCQkJLyoKKwkJCSAqIEFub3RoZXIgY29tbWFuZCBoYXMgdXBkYXRlZCB0aGUgbHZtZXRhZCBjYWNoZSwgYW5kCisJCQkgKiBoYXMgZG9uZSBzbyB1c2luZyBhIGRpZmZlcmVudCBkZXZpY2UgZmlsdGVyIGZyb20gb3VyCisJCQkgKiBvd24sIHdoaWNoIGhhcyBtYWRlIHRoZSBsdm1ldGFkIHRva2VuIGFuZCBvdXIgdG9rZW4KKwkJCSAqIG5vdCBtYXRjaC4gIFRoaXMgc2hvdWxkIG5vdCB1c3VhbGx5IGhhcHBlbiBiZWNhdXNlCisJCQkgKiB0aGlzIGNvbW1hbmQgaGFzIGFscmVhZHkgY2hlY2tlZCBmb3IgYSBtYXRjaGluZyB0b2tlbgorCQkJICogaW4gbHZtZXRhZF90b2tlbl9tYXRjaGVzKCksIGJ1dCBpdCdzIHBvc3NpYmxlIGZvcgorCQkJICogYW5vdGhlciBjb21tYW5kJ3MgcmVzY2FuIHRvIHNsaXAgaW4gYmV0d2VlbiB0aGUgdGltZQorCQkJICogd2UgY2FsbCBsdm1ldGFkX3Rva2VuX21hdGNoZXMoKSBhbmQgdGhlIHRpbWUgd2UgZ2V0CisJCQkgKiBoZXJlIHRvIGx2bWV0YWRfc2VuZCgpLiAgV2l0aCBhIG1pc21hdGNoZWQgdG9rZW4KKwkJCSAqIChkaWZmZXJlbnQgc2V0IG9mIGRldmljZXMpLCB3ZSBjYW5ub3QgdXNlIHRoZSBsdm1ldGFkCisJCQkgKiBjYWNoZS4KKwkJCSAqCisJCQkgKiBGSVhNRTogaXQgd291bGQgYmUgbmljZSB0byBoYXZlIHRoaXMgY29tbWFuZCBpZ25vcmUKKwkJCSAqIGx2bWV0YWQgYXQgdGhpcyBwb2ludCBhbmQgcmV2ZXJ0IHRvIGRpc2sgc2Nhbm5pbmcsCisJCQkgKiBidXQgdGhlIGxheWVycyBhYm92ZSBsdm1ldGFkX3NlbmQgYXJlIG5vdCB5ZXQgYWJsZQorCQkJICogdG8gc3dpdGNoIG1vZGVzIGluIHRoZSBtaWRkbGUgb2YgcHJvY2Vzc2luZy4KKwkJCSAqCisJCQkgKiAoVGhlIGFkdmFudGFnZSBvZiBsdm1ldGFkX2NoZWNrX3Rva2VuIGlzIHRoYXQgaXQKKwkJCSAqIGNhbiByZXNjYW4gdG8gZ2V0IHRoZSB0b2tlbiBpbiBzeW5jLCBvciBpZiB0aGF0CisJCQkgKiBmYWlscyBpdCBjYW4gbWFrZSB0aGUgY29tbWFuZCByZXZlcnQgdG8gc2Nhbm5pbmcKKwkJCSAqIGZyb20gdGhlIHN0YXJ0LikKKwkJCSAqLworCisJCQlsb2dfd2FybigiV0FSTklORzogQ2Fubm90IHVzZSBsdm1ldGFkIHdoaWxlIGl0IGNhY2hlcyBkaWZmZXJlbnQgZGV2aWNlcy4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qCisJICogTm9uLXRva2VuLW1pc21hdGNoIHJlbGF0ZWQgZXJyb3IgY2hlY2tpbmcuCisJICovCisKKwkvKiBBbGwgT0s/ICovCisJaWYgKCFzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkgeworCQlpZiAoZm91bmQpCisJCQkqZm91bmQgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBVbmtub3duIGRldmljZSBwZXJtaXR0ZWQ/ICovCisJaWYgKGZvdW5kICYmICFzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAidW5rbm93biIpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlJlcXVlc3QgdG8gJXMgJXMlc2luIGx2bWV0YWQgZGlkIG5vdCBmaW5kIGFueSBtYXRjaGluZyBvYmplY3QuIiwKKwkJCQkgYWN0aW9uLCBvYmplY3QsICpvYmplY3QgPyAiICIgOiAiIik7CisJCSpmb3VuZCA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIE11bHRpcGxlIFZHcyB3aXRoIHRoZSBzYW1lIG5hbWUgd2VyZSBmb3VuZC4gKi8KKwlpZiAoZm91bmQgJiYgIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJtdWx0aXBsZSIpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlJlcXVlc3QgdG8gJXMgJXMlc2luIGx2bWV0YWQgZm91bmQgbXVsdGlwbGUgbWF0Y2hpbmcgb2JqZWN0cy4iLAorCQkJCSBhY3Rpb24sIG9iamVjdCwgKm9iamVjdCA/ICIgIiA6ICIiKTsKKwkJaWYgKGZvdW5kKQorCQkJKmZvdW5kID0gMjsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBHZW5lcmljIGVycm9yIG1lc3NhZ2UgZm9yIGVycm9yIGNhc2VzIG5vdCBzcGVjaWZpY2FsbHkgY2hlY2tlZCBhYm92ZS4KKwkgKi8KKwlsb2dfZXJyb3IoIlJlcXVlc3QgdG8gJXMgJXMlc2luIGx2bWV0YWQgZ2F2ZSByZXNwb25zZSAlcy4gUmVhc29uOiAlcyIsCisJCSAgYWN0aW9uLCBvYmplY3QsICpvYmplY3QgPyAiICIgOiAiIiwgCisJCSAgZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIjxtaXNzaW5nPiIpLAorCQkgIGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZWFzb24iLCAiPG1pc3Npbmc+IikpOworZmFpbDoKKwkvKgorCSAqIElmIHRoZSBmYWlsZWQgbHZtZXRhZCBtZXNzYWdlIHdhcyB1cGRhdGluZyBsdm1ldGFkIHdpdGggbmV3IG1ldGFkYXRhCisJICogdGhhdCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoaXMgY29tbWFuZCwgaXQgaXMgaW1wb3J0YW50IHRvIHJlc3RhcnQKKwkgKiBsdm1ldGFkIChvciBhdCBsZWFzdCByZXNjYW4uKSAgKEFuIGx2bWV0YWQgdXBkYXRlIHRoYXQgaXMganVzdAorCSAqIHNjYW5uaW5nIGRpc2tzIHRvIHBvcHVsYXRlIHRoZSBjYWNoZSBpcyBub3QgYSBwcm9ibGVtLCBzbyB3ZSB0cnkgdG8KKwkgKiBhdm9pZCBwcmludGluZyBhICJjb3JydXB0aW9uIiB3YXJuaW5nIGluIHRoYXQgY2FzZS4pCisJICovCisKKwlpZiAoYWN0aW9uX21vZGlmaWVzKSB7CisJCS8qCisJCSAqIEZJWE1FOiBleHBlcmltZW50IHdpdGgga2lsbGluZyB0aGUgbHZtZXRhZCBwcm9jZXNzIGhlcmUsIGUuZy4KKwkJICoga2lsbChfbHZtZXRhZF9kYWVtb25fcGlkLCBTSUdLSUxMKTsKKwkJICovCisJCWxvZ193YXJuKCJXQVJOSU5HOiBUbyBhdm9pZCBjb3JydXB0aW9uLCByZXN0YXJ0IGx2bWV0YWQgKG9yIGRpc2FibGUgd2l0aCB1c2VfbHZtZXRhZD0wKS4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcmVhZF9tZGEoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCSAgICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbikKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYV9vcHMgKm9wczsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhvcHMsICZmbXQtPm1kYV9vcHMpCisJCWlmIChvcHMtPm1kYV9pbXBvcnRfdGV4dCAmJiBvcHMtPm1kYV9pbXBvcnRfdGV4dChpbmZvLCBjbikpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9wdl9wb3B1bGF0ZV9sdm1jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwKKwkJCQkgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGRldl90IGZhbGxiYWNrKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaWQgcHZpZCwgdmdpZDsKKwljaGFyIG1kYV9pZFszMl07CisJY2hhciBkYV9pZFszMl07CisJaW50IGkgPSAwOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbWRhLCAqZGE7CisJdWludDY0X3Qgb2Zmc2V0LCBzaXplOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKnB2aWRfdHh0ID0gZG1fY29uZmlnX2ZpbmRfc3RyKGNuLT5jaGlsZCwgImlkIiwgTlVMTCksCisJCSAgICp2Z2lkX3R4dCA9IGRtX2NvbmZpZ19maW5kX3N0cihjbi0+Y2hpbGQsICJ2Z2lkIiwgTlVMTCksCisJCSAgICp2Z25hbWUgPSBkbV9jb25maWdfZmluZF9zdHIoY24tPmNoaWxkLCAidmduYW1lIiwgTlVMTCksCisJCSAgICpmbXRfbmFtZSA9IGRtX2NvbmZpZ19maW5kX3N0cihjbi0+Y2hpbGQsICJmb3JtYXQiLCBOVUxMKTsKKwlkZXZfdCBkZXZ0ID0gZG1fY29uZmlnX2ZpbmRfaW50KGNuLT5jaGlsZCwgImRldmljZSIsIDApOworCXVpbnQ2NF90IGRldnNpemUgPSBkbV9jb25maWdfZmluZF9pbnQ2NChjbi0+Y2hpbGQsICJkZXZfc2l6ZSIsIDApLAorCQkgbGFiZWxfc2VjdG9yID0gZG1fY29uZmlnX2ZpbmRfaW50NjQoY24tPmNoaWxkLCAibGFiZWxfc2VjdG9yIiwgMCk7CisJdWludDMyX3QgZXh0X2ZsYWdzID0gKHVpbnQzMl90KSBkbV9jb25maWdfZmluZF9pbnQ2NChjbi0+Y2hpbGQsICJleHRfZmxhZ3MiLCAwKTsKKwl1aW50MzJfdCBleHRfdmVyc2lvbiA9ICh1aW50MzJfdCkgZG1fY29uZmlnX2ZpbmRfaW50NjQoY24tPmNoaWxkLCAiZXh0X3ZlcnNpb24iLCAwKTsKKworCWlmICghZm10ICYmIGZtdF9uYW1lKQorCQlmbXQgPSBnZXRfZm9ybWF0X2J5X25hbWUoY21kLCBmbXRfbmFtZSk7CisKKwlpZiAoIWZtdCkgeworCQlsb2dfZXJyb3IoIlBWICVzIG5vdCByZWNvZ25pc2VkLiBJcyB0aGUgZGV2aWNlIG1pc3Npbmc/IiwgcHZpZF90eHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSBkZXZfY2FjaGVfZ2V0X2J5X2RldnQoZGV2dCwgY21kLT5maWx0ZXIpOworCWlmICghZGV2ICYmIGZhbGxiYWNrKQorCQlkZXYgPSBkZXZfY2FjaGVfZ2V0X2J5X2RldnQoZmFsbGJhY2ssIGNtZC0+ZmlsdGVyKTsKKworCWlmICghZGV2KSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBEZXZpY2UgZm9yIFBWICVzIG5vdCBmb3VuZCBvciByZWplY3RlZCBieSBhIGZpbHRlci4iLCBwdmlkX3R4dCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghcHZpZF90eHQgfHwgIWlkX3JlYWRfZm9ybWF0KCZwdmlkLCBwdmlkX3R4dCkpIHsKKwkJbG9nX2Vycm9yKCJNaXNzaW5nIG9yIGlsbC1mb3JtYXR0ZWQgUFZJRCBmb3IgUFY6ICVzLiIsIHB2aWRfdHh0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZnaWRfdHh0KSB7CisJCWlmICghaWRfcmVhZF9mb3JtYXQoJnZnaWQsIHZnaWRfdHh0KSkKKwkJCXJldHVybl8wOworCX0gZWxzZQorCQkvKiBOQiB1dWlkIGlzIHNob3J0IGFuZCBOVUwtdGVybWluYXRlZC4gKi8KKwkJKHZvaWQpIGRtX3N0cm5jcHkoKGNoYXIqKSZ2Z2lkLCBmbXQtPm9ycGhhbl92Z19uYW1lLCBzaXplb2YodmdpZCkpOworCisJaWYgKCF2Z25hbWUpCisJCXZnbmFtZSA9IGZtdC0+b3JwaGFuX3ZnX25hbWU7CisKKwlpZiAoIShpbmZvID0gbHZtY2FjaGVfYWRkKGZtdC0+bGFiZWxsZXIsIChjb25zdCBjaGFyICopJnB2aWQsIGRldiwKKwkJCQkgIHZnbmFtZSwgKGNvbnN0IGNoYXIgKikmdmdpZCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWx2bWNhY2hlX2dldF9sYWJlbChpbmZvKS0+c2VjdG9yID0gbGFiZWxfc2VjdG9yOworCWx2bWNhY2hlX2dldF9sYWJlbChpbmZvKS0+ZGV2ID0gZGV2OworCWx2bWNhY2hlX3NldF9kZXZpY2Vfc2l6ZShpbmZvLCBkZXZzaXplKTsKKwlsdm1jYWNoZV9kZWxfZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9tZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9iYXMoaW5mbyk7CisKKwlkbyB7CisJCXNwcmludGYobWRhX2lkLCAibWRhJWQiLCBpKTsKKwkJbWRhID0gZG1fY29uZmlnX2ZpbmRfbm9kZShjbi0+Y2hpbGQsIG1kYV9pZCk7CisJCWlmIChtZGEpCisJCQlfcmVhZF9tZGEoaW5mbywgZm10LCBtZGEpOworCQkrK2k7CisJfSB3aGlsZSAobWRhKTsKKworCWkgPSAwOworCWRvIHsKKwkJc3ByaW50ZihkYV9pZCwgImRhJWQiLCBpKTsKKwkJZGEgPSBkbV9jb25maWdfZmluZF9ub2RlKGNuLT5jaGlsZCwgZGFfaWQpOworCQlpZiAoZGEpIHsKKwkJCWlmICghZG1fY29uZmlnX2dldF91aW50NjQoZGEtPmNoaWxkLCAib2Zmc2V0IiwgJm9mZnNldCkpIHJldHVybl8wOworCQkJaWYgKCFkbV9jb25maWdfZ2V0X3VpbnQ2NChkYS0+Y2hpbGQsICJzaXplIiwgJnNpemUpKSByZXR1cm5fMDsKKwkJCWx2bWNhY2hlX2FkZF9kYShpbmZvLCBvZmZzZXQsIHNpemUpOworCQl9CisJCSsraTsKKwl9IHdoaWxlIChkYSk7CisKKwlpID0gMDsKKwlkbyB7CisJCXNwcmludGYoZGFfaWQsICJiYSVkIiwgaSk7CisJCWRhID0gZG1fY29uZmlnX2ZpbmRfbm9kZShjbi0+Y2hpbGQsIGRhX2lkKTsKKwkJaWYgKGRhKSB7CisJCQlpZiAoIWRtX2NvbmZpZ19nZXRfdWludDY0KGRhLT5jaGlsZCwgIm9mZnNldCIsICZvZmZzZXQpKSByZXR1cm5fMDsKKwkJCWlmICghZG1fY29uZmlnX2dldF91aW50NjQoZGEtPmNoaWxkLCAic2l6ZSIsICZzaXplKSkgcmV0dXJuXzA7CisJCQlsdm1jYWNoZV9hZGRfYmEoaW5mbywgb2Zmc2V0LCBzaXplKTsKKwkJfQorCQkrK2k7CisJfSB3aGlsZSAoZGEpOworCisJbHZtY2FjaGVfc2V0X2V4dF9mbGFncyhpbmZvLCBleHRfZmxhZ3MpOworCWx2bWNhY2hlX3NldF9leHRfdmVyc2lvbihpbmZvLCBleHRfdmVyc2lvbik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcHZfdXBkYXRlX3N0cnVjdF9wdihzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkKQoreworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCisJaWYgKChpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoKGNvbnN0IGNoYXIgKikmcHYtPmlkLCBwdi0+ZGV2LCAwKSkpIHsKKwkJcHYtPmxhYmVsX3NlY3RvciA9IGx2bWNhY2hlX2dldF9sYWJlbChpbmZvKS0+c2VjdG9yOworCQlwdi0+ZGV2ID0gbHZtY2FjaGVfZGV2aWNlKGluZm8pOworCQlpZiAoIXB2LT5kZXYpCisJCQlwdi0+c3RhdHVzIHw9IE1JU1NJTkdfUFY7CisJCWlmICghbHZtY2FjaGVfZmlkX2FkZF9tZGFzX3B2KGluZm8sIGZpZCkpCisJCQlyZXR1cm5fMDsKKwkJcHYtPmZpZCA9IGZpZDsKKwl9IGVsc2UKKwkJcHYtPnN0YXR1cyB8PSBNSVNTSU5HX1BWOyAvKiBwcm9iYWJseSBtaXNzaW5nICovCisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHZvbHVtZV9ncm91cCAqbHZtZXRhZF92Z19sb29rdXAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IE5VTEw7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcyID0gTlVMTDsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IGZvdW5kOworCWNoYXIgdXVpZFs2NF07CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkID0gTlVMTDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWM7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICp0b3A7CisJY29uc3QgY2hhciAqbmFtZSwgKmRpYWdfbmFtZTsKKwljb25zdCBjaGFyICpmbXRfbmFtZTsKKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2Y247CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlpbnQgcmVzY2FuID0gMDsKKworCWlmICghbHZtZXRhZF91c2VkKCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHZnaWQpIHsKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoKGNvbnN0IHN0cnVjdCBpZCopdmdpZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJCXJldHVybl9OVUxMOworCX0KKworCWlmICh2Z2lkICYmIHZnbmFtZSkgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiQXNraW5nIGx2bWV0YWQgZm9yIFZHICVzICVzIiwgdXVpZCwgdmduYW1lKTsKKwkJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInZnX2xvb2t1cCIsCisJCQkJICAgICAgInV1aWQgPSAlcyIsIHV1aWQsCisJCQkJICAgICAgIm5hbWUgPSAlcyIsIHZnbmFtZSwKKwkJCQkgICAgICBOVUxMKTsKKwkJZGlhZ19uYW1lID0gdXVpZDsKKworCX0gZWxzZSBpZiAodmdpZCkgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiQXNraW5nIGx2bWV0YWQgZm9yIFZHIHZnaWQgJXMiLCB1dWlkKTsKKwkJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInZnX2xvb2t1cCIsICJ1dWlkID0gJXMiLCB1dWlkLCBOVUxMKTsKKwkJZGlhZ19uYW1lID0gdXVpZDsKKworCX0gZWxzZSBpZiAodmduYW1lKSB7CisJCWxvZ19kZWJ1Z19sdm1ldGFkKCJBc2tpbmcgbHZtZXRhZCBmb3IgVkcgJXMiLCB2Z25hbWUpOworCQlyZXBseSA9IF9sdm1ldGFkX3NlbmQoY21kLCAidmdfbG9va3VwIiwgIm5hbWUgPSAlcyIsIHZnbmFtZSwgTlVMTCk7CisJCWRpYWdfbmFtZSA9IHZnbmFtZTsKKworCX0gZWxzZSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgbmFtZSByZXF1aXJlZCAoVkdJRCBub3QgYXZhaWxhYmxlKSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAidmdfbG9va3VwIiwgZGlhZ19uYW1lLCAmZm91bmQpICYmIGZvdW5kKSB7CisKKwkJaWYgKChmb3VuZCA9PSAyKSAmJiB2Z25hbWUpIHsKKwkJCWxvZ19lcnJvcigiTXVsdGlwbGUgVkdzIGZvdW5kIHdpdGggdGhlIHNhbWUgbmFtZTogJXMuIiwgdmduYW1lKTsKKwkJCWxvZ19lcnJvcigiU2VlIHRoZSAtLXNlbGVjdCBvcHRpb24gd2l0aCBWRyBVVUlEICh2Z191dWlkKS4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCEodG9wID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyZXBseS5jZnQtPnJvb3QsICJtZXRhZGF0YSIpKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJtZXRhZGF0YSBjb25maWcgbm9kZSBub3QgZm91bmQuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW5hbWUgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAibmFtZSIsIE5VTEwpOworCisJCS8qIGZhbGwgYmFjayB0byBsdm0yIGlmIHdlIGRvbid0IGtub3cgYmV0dGVyICovCisJCWZtdF9uYW1lID0gZG1fY29uZmlnX2ZpbmRfc3RyKHRvcCwgIm1ldGFkYXRhL2Zvcm1hdCIsICJsdm0yIik7CisJCWlmICghKGZtdCA9IGdldF9mb3JtYXRfYnlfbmFtZShjbWQsIGZtdF9uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJCSAgIldlIGRvIG5vdCBrbm93IHRoZSBmb3JtYXQgKCVzKSByZXBvcnRlZCBieSBsdm1ldGFkLiIsCisJCQkJICBmbXRfbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZpYy50eXBlID0gRk1UX0lOU1RBTkNFX01EQVMgfCBGTVRfSU5TVEFOQ0VfQVVYX01EQVM7CisJCWZpYy5jb250ZXh0LnZnX3JlZi52Z19uYW1lID0gbmFtZTsKKwkJZmljLmNvbnRleHQudmdfcmVmLnZnX2lkID0gdmdpZDsKKworCQlpZiAoIShmaWQgPSBmbXQtPm9wcy0+Y3JlYXRlX2luc3RhbmNlKGZtdCwgJmZpYykpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKChwdmNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZSh0b3AsICJtZXRhZGF0YS9waHlzaWNhbF92b2x1bWVzIikpKQorCQkJZm9yIChwdmNuID0gcHZjbi0+Y2hpbGQ7IHB2Y247IHB2Y24gPSBwdmNuLT5zaWIpCisJCQkJX3B2X3BvcHVsYXRlX2x2bWNhY2hlKGNtZCwgcHZjbiwgZm10LCAwKTsKKworCQlpZiAoKHB2Y24gPSBkbV9jb25maWdfZmluZF9ub2RlKHRvcCwgIm1ldGFkYXRhL291dGRhdGVkX3B2cyIpKSkKKwkJCWZvciAocHZjbiA9IHB2Y24tPmNoaWxkOyBwdmNuOyBwdmNuID0gcHZjbi0+c2liKQorCQkJCV9wdl9wb3B1bGF0ZV9sdm1jYWNoZShjbWQsIHB2Y24sIGZtdCwgMCk7CisKKwkJdG9wLT5rZXkgPSBuYW1lOworCQlpZiAoISh2ZyA9IGltcG9ydF92Z19mcm9tX2x2bWV0YWRfY29uZmlnX3RyZWUocmVwbHkuY2Z0LCBmaWQpKSkKKwkJCWdvdG9fb3V0OworCisJCS8qCisJCSAqIFJlYWQgdGhlIFZHIGZyb20gZGlzaywgaWdub3JpbmcgdGhlIGx2bWV0YWQgY29weSBpbiB0aGVzZQorCQkgKiBjYXNlczoKKwkJICoKKwkJICogMS4gVGhlIGhvc3QgaXMgbm90IHVzaW5nIGx2bWxvY2tkLCBidXQgaXMgcmVhZGluZyBsb2NrZCBWR3MKKwkJICogdXNpbmcgdGhlIC0tc2hhcmVkIG9wdGlvbi4gIFRoZSBzaGFyZWQgb3B0aW9uIGlzIG1lYW50IHRvCisJCSAqIGxldCBob3N0cyBub3QgcnVubmluZyBsdm1sb2NrZCBsb29rIGF0IGxvY2tkIFZHcywgbGlrZSB0aGUKKwkJICogZm9yZWlnbiBvcHRpb24gYWxsb3dzIGhvc3RzIHRvIGxvb2sgYXQgZm9yZWlnbiBWR3MuICBXaGVuCisJCSAqIC0tZm9yZWlnbiBpcyB1c2VkLCB0aGUgY29kZSBmb3JjZXMgYSByZXNjYW4gc2luY2UgdGhlIGxvY2FsCisJCSAqIGx2bWV0YWQgY2FjaGUgb2YgZm9yZWlnbiBWR3MgaXMgbGlrZWx5IHN0YWxlLiAgU2ltaWxhcmx5LAorCQkgKiBmb3IgLS1zaGFyZWQsIGhhdmUgdGhlIGNvZGUgcmVhZGluZyB0aGUgc2hhcmVkIFZHcyBiZWxvdworCQkgKiBub3QgdXNlIHRoZSBjYWNoZWQgY29weSBmcm9tIGx2bWV0YWQgYnV0IHRvIHJlc2NhbiB0aGUgVkcuCisJCSAqCisJCSAqIDIuIFRoZSBob3N0IGZhaWxlZCB0byBhY3F1aXJlIHRoZSBWRyBsb2NrIGZyb20gbHZtbG9ja2QgZm9yCisJCSAqIHRoZSBsb2NrZCBWRy4gIEluIHRoaXMgY2FzZSwgdGhlIHVzdWFsIG1lY2hhbmlzbXMgZm9yCisJCSAqIHVwZGF0aW5nIHRoZSBsdm1ldGFkIGNvcHkgb2YgdGhlIFZHIGhhdmUgYmVlbiBtaXNzZWQuICBTaW5jZQorCQkgKiB3ZSBkb24ndCBrbm93IGlmIHRoZSBjYWNoZWQgY29weSBpcyB2YWxpZCwgYXNzdW1lIGl0J3Mgbm90LgorCQkgKgorCQkgKiAzLiBsdm1ldGFkIGhhcyByZXR1cm5lZCB0aGUgInZnX2ludmFsaWQiIGZsYWcsIHdoaWNoIGlzIHRoZQorCQkgKiB1c3VhbCBtZWNoYW5pc20gdXNlZCBieSBsdm1sb2NrZC9sdm1ldGFkIHRvIGNhdXNlIGEgaG9zdCB0bworCQkgKiByZXJlYWQgYSBWRyBmcm9tIGRpc2sgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGFub3RoZXIKKwkJICogaG9zdC4KKwkJICovCisKKwkJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkgJiYgY21kLT5pbmNsdWRlX3NoYXJlZF92Z3MpIHsKKwkJCWxvZ19kZWJ1Z19sdm1ldGFkKCJSZXNjYW4gVkcgJXMgYmVjYXVzZSBpbmNsdWRpbmcgc2hhcmVkIiwgdmduYW1lKTsKKwkJCXJlc2NhbiA9IDE7CisJCX0gZWxzZSBpZiAoaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSAmJiBjbWQtPmxvY2tkX3ZnX3Jlc2NhbikgeworCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBiZWNhdXNlIG5vIGx2bWxvY2tkIGxvY2sgaXMgaGVsZCIsIHZnbmFtZSk7CisJCQlyZXNjYW4gPSAxOworCQl9IGVsc2UgaWYgKGRtX2NvbmZpZ19maW5kX25vZGUocmVwbHkuY2Z0LT5yb290LCAidmdfaW52YWxpZCIpKSB7CisJCQlpZiAoIWlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJCQkvKiBDYW4gaGFwcGVuIGlmIGEgcHJldmlvdXMgY29tbWFuZCBmYWlsZWQvY3Jhc2hlZCB3aXRob3V0IHVwZGF0aW5nIGx2bWV0YWQuICovCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IFJlYWRpbmcgVkcgJXMgZnJvbSBkaXNrIGJlY2F1c2UgbHZtZXRhZCBtZXRhZGF0YSBpcyBpbnZhbGlkLiIsIHZnbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoaXMgaXMgbm9ybWFsIHdoZW4gdGhlIFZHIHdhcyBtb2RpZmllZCBieSBhbm90aGVyIGhvc3QuICovCisJCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBiZWNhdXNlIGx2bWV0YWQgcmV0dXJuZWQgaW52YWxpZCIsIHZnbmFtZSk7CisJCQl9CisJCQlyZXNjYW4gPSAxOworCQl9CisKKwkJLyoKKwkJICogbG9ja2luZyBtYXkgaGF2ZSBkZXRlY3RlZCBhIG5ld2VyIHZnIHZlcnNpb24gYW5kCisJCSAqIGludmFsaWRhdGVkIHRoZSBjYWNoZWQgdmcuCisJCSAqLworCQlpZiAocmVzY2FuKSB7CisJCQlpZiAoISh2ZzIgPSBsdm1ldGFkX3B2c2Nhbl92ZyhjbWQsIHZnKSkpIHsKKwkJCQlsb2dfZGVidWdfbHZtZXRhZCgiVkcgJXMgZnJvbSBsdm1ldGFkIG5vdCBmb3VuZCBkdXJpbmcgcmVzY2FuLiIsIHZnbmFtZSk7CisJCQkJZmlkID0gTlVMTDsKKwkJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJCQl2ZyA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJCXZnID0gdmcyOworCQkJZmlkID0gdmcyLT5maWQ7CisJCX0KKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQkJaWYgKCFfcHZfdXBkYXRlX3N0cnVjdF9wdihwdmwtPnB2LCBmaWQpKSB7CisJCQkJdmcgPSBOVUxMOworCQkJCWdvdG9fb3V0OwkvKiBGSVhNRSBlcnJvciBwYXRoICovCisJCQl9CisJCX0KKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2c19vdXRkYXRlZCkgeworCQkJaWYgKCFfcHZfdXBkYXRlX3N0cnVjdF9wdihwdmwtPnB2LCBmaWQpKSB7CisJCQkJdmcgPSBOVUxMOworCQkJCWdvdG9fb3V0OwkvKiBGSVhNRSBlcnJvciBwYXRoICovCisJCQl9CisJCX0KKworCQlsdm1jYWNoZV91cGRhdGVfdmcodmcsIDApOworCQl2Z19tYXJrX3BhcnRpYWxfbHZzKHZnLCAxKTsKKwl9CisKK291dDoKKwlpZiAoIXZnICYmIGZpZCkKKwkJZmlkLT5mbXQtPm9wcy0+ZGVzdHJveV9pbnN0YW5jZShmaWQpOworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXJldHVybiB2ZzsKK30KKworc3RydWN0IF9maXh1cF9iYXRvbiB7CisJaW50IGk7CisJaW50IGZpbmQ7CisJaW50IGlnbm9yZTsKK307CisKK3N0YXRpYyBpbnQgX2ZpeHVwX2lnbm9yZWQoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwgdm9pZCAqYmF0b24pIHsKKwlzdHJ1Y3QgX2ZpeHVwX2JhdG9uICpiID0gYmF0b247CisKKwlpZiAoYi0+aSA9PSBiLT5maW5kKQorCQltZGFfc2V0X2lnbm9yZWQobWRhLCBiLT5pZ25vcmUpOworCisJYi0+aSArKzsKKworCXJldHVybiAxOworfQorCisvKgorICogQWZ0ZXIgdGhlIFZHIGlzIHdyaXR0ZW4gdG8gZGlzaywgYnV0IGJlZm9yZSBpdCdzIGNvbW1pdHRlZCwKKyAqIGx2bWV0YWQgaXMgdG9sZCB0aGUgbmV3IHNlcW5vLiAgbHZtZXRhZCBzZXRzIHRoZSBJTlZBTElECisgKiBmbGFnIG9uIHRoZSBjYWNoZWQgVkcgYW5kIHNhdmVzIHRoZSBuZXcgc2Vxbm8uCisgKgorICogQWZ0ZXIgdGhlIFZHIGlzIGNvbW1pdHRlZCBvbiBkaXNrLCB0aGUgY29tbWFuZCBzZW5kcyB0aGUKKyAqIG5ldyBWRyBtZXRhZGF0YSwgY29udGFpbmluZyB0aGUgbmV3IHNlcW5vLiAgbHZtZXRhZCBzZWVzCisgKiB0aGF0IGl0IGhhcyB0aGUgdXBkYXRlZCBtZXRhZGF0YSBhbmQgY2xlYXJzIHRoZSBJTlZBTElECisgKiBmbGFnIG9uIHRoZSBjYWNoZWQgVkcuCisgKgorICogSWYgdGhlIGNvbW1hbmQgZmFpbHMgYWZ0ZXIgY29tbWl0dGluZyB0aGUgbWV0YWRhdGEgb24gZGlzaworICogYnV0IGJlZm9yZSBzZW5kaW5nIHRoZSBuZXcgbWV0YWRhdGEgdG8gbHZtZXRhZCwgdGhlbiB0aGUKKyAqIG5leHQgY29tbWFuZCB0aGF0IGFza3MgbHZtZXRhZCBmb3IgdGhlIG1ldGFkYXRhIHdpbGwgZ2V0CisgKiBiYWNrIHRoZSBJTlZBTElEIGZsYWcuICBUaGF0IGNvbW1hbmQgd2lsbCB0aGVuIHJlYWQgdGhlCisgKiBWRyBtZXRhZGF0YSBmcm9tIGRpc2sgdG8gdXNlLCBhbmQgd2lsbCBzZW5kIHRoZSBsYXRlc3QKKyAqIG1ldGFkYXRhIGZyb20gZGlzayB0byBsdm1ldGFkIHdoaWNoIHdpbGwgY2xlYXIgdGhlCisgKiBJTlZBTElEIGZsYWcuCisgKi8KKworaW50IGx2bWV0YWRfdmdfdXBkYXRlX3BlbmRpbmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSB8fCB0ZXN0X21vZGUoKSkKKwkJcmV0dXJuIDE7IC8qIGZha2UgaXQgKi8KKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZ2Zy0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCXJldHVybl8wOworCisJbG9nX2RlYnVnX2x2bWV0YWQoIlNlbmRpbmcgbHZtZXRhZCBwZW5kaW5nIFZHICVzIChzZXFubyAlIiBQUkl1MzIgIikiLCB2Zy0+bmFtZSwgdmctPnNlcW5vKTsKKwlyZXBseSA9IF9sdm1ldGFkX3NlbmQodmctPmNtZCwgInNldF92Z19pbmZvIiwKKwkJCSAgICAgICJuYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCSAgICAgICJ1dWlkID0gJXMiLCB1dWlkLAorCQkJICAgICAgInZlcnNpb24gPSAlIlBSSWQ2NCwgKGludDY0X3QpdmctPnNlcW5vLAorCQkJICAgICAgTlVMTCk7CisKKwlpZiAoIV9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInNldF92Z19pbmZvIiwgdmctPm5hbWUsIE5VTEwpKSB7CisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkJcmV0dXJuXzA7CisJfQorCisJdmctPmx2bWV0YWRfdXBkYXRlX3BlbmRpbmcgPSAxOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCXJldHVybiAxOworfQorCitpbnQgbHZtZXRhZF92Z191cGRhdGVfZmluaXNoKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWRhZW1vbl9yZXBseSByZXBseTsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisJY2hhciBtZGFfaWRbMTI4XSwgKm51bTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z3U7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICp2Z21ldGE7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgX2ZpeHVwX2JhdG9uIGJhdG9uOworCisJaWYgKCF2Zy0+bHZtZXRhZF91cGRhdGVfcGVuZGluZykKKwkJcmV0dXJuIDE7CisKKwlpZiAoISh2Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX1BSRUNPTU1JVCkpCisJCXJldHVybiAxOworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSB8fCB0ZXN0X21vZGUoKSkKKwkJcmV0dXJuIDE7IC8qIGZha2UgaXQgKi8KKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZ2Zy0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiB2Zy0+dmdfY29tbWl0dHRlZCBpcyB0aGUgc3RhdGUgb2YgdGhlIFZHIG1ldGFkYXRhIHdoZW4gdmdfY29tbWl0KCkKKwkgKiB3YXMgY2FsbGVkLiAgU2luY2UgdGhlbiwgJ3ZnJyBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBtb2RpZmllZCBhbmQKKwkgKiBub3QgY29tbWl0dGVkLiAgV2Ugb25seSB3YW50IHRvIHNlbmQgY29tbWl0dGVkIG1ldGFkYXRhIHRvIGx2bWV0YWQuCisJICoKKwkgKiBsdm1ldGFkIGlzIHNvbWV0aW1lcyB1cGRhdGVkIGluIGNhc2VzIHdoZXJlIHRoZSBWRyBpcyBub3Qgd3JpdHRlbgorCSAqIChubyB2Z19jb21taXR0ZWQpLiAgSW4gdGhvc2UgY2FzZXMgJ3ZnJyBoYXMganVzdCBiZWVuIHJlYWQgZnJvbQorCSAqIGRpc2ssIGFuZCB3ZSBjYW4gc2VuZCAndmcnIHRvIGx2bWV0YWQuICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUKKwkgKiBjb21tYW5kIGZpbmRzIHRoZSBsdm1ldGFkIGNhY2hlIGludmFsaWQsIHNvIHRoZSBWRyBoYXMgYmVlbiByZWFkCisJICogZnJvbSBkaXNrIGFuZCBpcyB0aGVuIHNlbnQgdG8gbHZtZXRhZC4KKwkgKi8KKworCXZndSA9IHZnLT52Z19jb21taXR0ZWQgPyB2Zy0+dmdfY29tbWl0dGVkIDogdmc7CisKKwlpZiAoISh2Z21ldGEgPSBleHBvcnRfdmdfdG9fY29uZmlnX3RyZWUodmd1KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZXhwb3J0IFZHIHRvIGNvbmZpZyB0cmVlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfZGVidWdfbHZtZXRhZCgiU2VuZGluZyBsdm1ldGFkIHVwZGF0ZWQgVkcgJXMgKHNlcW5vICUiIFBSSXUzMiAiKSIsIHZnLT5uYW1lLCB2Zy0+c2Vxbm8pOworCXJlcGx5ID0gX2x2bWV0YWRfc2VuZCh2Zy0+Y21kLCAidmdfdXBkYXRlIiwKKwkJCSAgICAgICJ2Z25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJICAgICAgIm1ldGFkYXRhID0gJXQiLCB2Z21ldGEsCisJCQkgICAgICBOVUxMKTsKKworCWRtX2NvbmZpZ19kZXN0cm95KHZnbWV0YSk7CisKKwlpZiAoIV9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInZnX3VwZGF0ZSIsIHZnLT5uYW1lLCBOVUxMKSkgeworCQkvKgorCQkgKiBJbiB0aGlzIGZhaWx1cmUgY2FzZSwgdGhlIFZHIGNhY2hlZCBpbiBsdm1ldGFkIHJlbWFpbnMgaW4KKwkJICogdGhlIElOVkFMSUQgc3RhdGUgKGZyb20gbHZtZXRhZF92Z191cGRhdGVfcGVuZGluZykuCisJCSAqIEEgc3Vic2VxdWVudCBjb21tYW5kIHdpbGwgc2VlIElOVkFMSUQsIGlnbm9yZSB0aGUgY2FjaGVkCisJCSAqIGNvcHksIHJlYWQgdGhlIFZHIGZyb20gZGlzaywgYW5kIHVwZGF0ZSB0aGUgY2FjaGVkIGNvcHkuCisJCSAqLworCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJCXJldHVybiAwOworCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCW4gPSAodmd1LT5maWQgJiYgdmd1LT5maWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4KSA/CisJCWRtX2hhc2hfZ2V0X2ZpcnN0KHZndS0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCkgOiBOVUxMOworCXdoaWxlIChuKSB7CisJCW1kYSA9IGRtX2hhc2hfZ2V0X2RhdGEodmd1LT5maWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4LCBuKTsKKwkJKHZvaWQpIGRtX3N0cm5jcHkobWRhX2lkLCBkbV9oYXNoX2dldF9rZXkodmd1LT5maWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4LCBuKSwgc2l6ZW9mKG1kYV9pZCkpOworCQlpZiAoKG51bSA9IHN0cmNocihtZGFfaWQsICdfJykpKSB7CisJCQkqbnVtID0gMDsKKwkJCSsrbnVtOworCQkJaWYgKChpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQobWRhX2lkLCBOVUxMLCAwKSkpIHsKKwkJCQltZW1zZXQoJmJhdG9uLCAwLCBzaXplb2YoYmF0b24pKTsKKwkJCQliYXRvbi5maW5kID0gYXRvaShudW0pOworCQkJCWJhdG9uLmlnbm9yZSA9IG1kYV9pc19pZ25vcmVkKG1kYSk7CisJCQkJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX2ZpeHVwX2lnbm9yZWQsICZiYXRvbik7CisJCQl9CisJCX0KKwkJbiA9IGRtX2hhc2hfZ2V0X25leHQodmd1LT5maWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4LCBuKTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmd1LT5wdnMpIHsKKwkJLyogTkIuIHRoZSBQViBmbXQgcG9pbnRlciBpcyBzb21ldGltZXMgd3JvbmcgZHVyaW5nIHZnY29udmVydCAqLworCQlpZiAocHZsLT5wdi0+ZGV2ICYmICFsdm1ldGFkX3B2X2ZvdW5kKHZnLT5jbWQsICZwdmwtPnB2LT5pZCwgcHZsLT5wdi0+ZGV2LAorCQkJCQkJICAgICAgdmd1LT5maWQgPyB2Z3UtPmZpZC0+Zm10IDogcHZsLT5wdi0+Zm10LAorCQkJCQkJICAgICAgcHZsLT5wdi0+bGFiZWxfc2VjdG9yLCBOVUxMLCBOVUxMLCBOVUxMKSkKKwkJCXJldHVybiAwOworCX0KKworCXZnLT5sdm1ldGFkX3VwZGF0ZV9wZW5kaW5nID0gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IGx2bWV0YWRfdmdfcmVtb3ZlX3BlbmRpbmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSB8fCB0ZXN0X21vZGUoKSkKKwkJcmV0dXJuIDE7IC8qIGZha2UgaXQgKi8KKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZ2Zy0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCXJldHVybl8wOworCisJLyogU2VuZGluZyB2ZXJzaW9uL3NlcW5vIDAgaW4gc2V0X3ZnX2luZm8gd2lsbCBzZXQgdGhlIElOVkFMSUQgZmxhZy4gKi8KKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJTZW5kaW5nIGx2bWV0YWQgcGVuZGluZyByZW1vdmUgVkcgJXMiLCB2Zy0+bmFtZSk7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKHZnLT5jbWQsICJzZXRfdmdfaW5mbyIsCisJCQkgICAgICAibmFtZSA9ICVzIiwgdmctPm5hbWUsCisJCQkgICAgICAidXVpZCA9ICVzIiwgdXVpZCwKKwkJCSAgICAgICJ2ZXJzaW9uID0gJWQiLCAwLAorCQkJICAgICAgTlVMTCk7CisKKwlpZiAoIV9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInNldF92Z19pbmZvIiwgdmctPm5hbWUsIE5VTEwpKSB7CisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkJcmV0dXJuXzA7CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCXJldHVybiAxOworfQorCitpbnQgbHZtZXRhZF92Z19yZW1vdmVfZmluaXNoKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWNoYXIgdXVpZFs2NF07CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQ7CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpIHx8IHRlc3RfbW9kZSgpKQorCQlyZXR1cm4gMTsgLyoganVzdCBmYWtlIGl0ICovCisKKwl2Zy0+bHZtZXRhZF91cGRhdGVfcGVuZGluZyA9IDA7CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmdmctPmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJUZWxsaW5nIGx2bWV0YWQgdG8gcmVtb3ZlIFZHSUQgJXMgKCVzKSIsIHV1aWQsIHZnLT5uYW1lKTsKKwlyZXBseSA9IF9sdm1ldGFkX3NlbmQodmctPmNtZCwgInZnX3JlbW92ZSIsICJ1dWlkID0gJXMiLCB1dWlkLCBOVUxMKTsKKwlyZXN1bHQgPSBfbHZtZXRhZF9oYW5kbGVfcmVwbHkocmVwbHksICJ2Z19yZW1vdmUiLCB2Zy0+bmFtZSwgTlVMTCk7CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbHZtZXRhZF9wdl9sb29rdXAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBpZCBwdmlkLCBpbnQgKmZvdW5kKQoreworCWNoYXIgdXVpZFs2NF07CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpKQorCQlyZXR1cm5fMDsKKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJBc2tpbmcgbHZtZXRhZCBmb3IgUFYgJXMiLCB1dWlkKTsKKwlyZXBseSA9IF9sdm1ldGFkX3NlbmQoY21kLCAicHZfbG9va3VwIiwgInV1aWQgPSAlcyIsIHV1aWQsIE5VTEwpOworCWlmICghX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAicHZfbG9va3VwIiwgIiIsIGZvdW5kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoZm91bmQgJiYgISpmb3VuZCkKKwkJZ290byBvdXRfc3VjY2VzczsKKworCWlmICghKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyZXBseS5jZnQtPnJvb3QsICJwaHlzaWNhbF92b2x1bWUiKSkpCisJCWdvdG9fb3V0OworICAgICAgICBlbHNlIGlmICghX3B2X3BvcHVsYXRlX2x2bWNhY2hlKGNtZCwgY24sIE5VTEwsIDApKQorCQlnb3RvX291dDsKKworb3V0X3N1Y2Nlc3M6CisJcmVzdWx0ID0gMTsKKworb3V0OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBsdm1ldGFkX3B2X2xvb2t1cF9ieV9kZXYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICpmb3VuZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCWlmICghbHZtZXRhZF91c2VkKCkpCisJCXJldHVybl8wOworCisJbG9nX2RlYnVnX2x2bWV0YWQoIkFza2luZyBsdm1ldGFkIGZvciBQViBvbiAlcyIsIGRldl9uYW1lKGRldikpOworCXJlcGx5ID0gX2x2bWV0YWRfc2VuZChjbWQsICJwdl9sb29rdXAiLCAiZGV2aWNlID0gJSIgUFJJZDY0LCAoaW50NjRfdCkgZGV2LT5kZXYsIE5VTEwpOworCWlmICghX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAicHZfbG9va3VwIiwgZGV2X25hbWUoZGV2KSwgZm91bmQpKQorCQlnb3RvX291dDsKKworCWlmIChmb3VuZCAmJiAhKmZvdW5kKQorCQlnb3RvIG91dF9zdWNjZXNzOworCisJY24gPSBkbV9jb25maWdfZmluZF9ub2RlKHJlcGx5LmNmdC0+cm9vdCwgInBoeXNpY2FsX3ZvbHVtZSIpOworCWlmICghY24gfHwgIV9wdl9wb3B1bGF0ZV9sdm1jYWNoZShjbWQsIGNuLCBOVUxMLCBkZXYtPmRldikpCisJCWdvdG9fb3V0OworCitvdXRfc3VjY2VzczoKKwlyZXN1bHQgPSAxOworCitvdXQ6CisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGx2bWV0YWRfcHZfbGlzdF90b19sdm1jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCWlmICghbHZtZXRhZF91c2VkKCkpCisJCXJldHVybiAxOworCisJbG9nX2RlYnVnX2x2bWV0YWQoIkFza2luZyBsdm1ldGFkIGZvciBjb21wbGV0ZSBsaXN0IG9mIGtub3duIFBWcyIpOworCXJlcGx5ID0gX2x2bWV0YWRfc2VuZChjbWQsICJwdl9saXN0IiwgTlVMTCk7CisJaWYgKCFfbHZtZXRhZF9oYW5kbGVfcmVwbHkocmVwbHksICJwdl9saXN0IiwgIiIsIE5VTEwpKSB7CisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwkJcmV0dXJuXzA7CisJfQorCisJaWYgKChjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUocmVwbHkuY2Z0LT5yb290LCAicGh5c2ljYWxfdm9sdW1lcyIpKSkKKwkJZm9yIChjbiA9IGNuLT5jaGlsZDsgY247IGNuID0gY24tPnNpYikKKwkJCV9wdl9wb3B1bGF0ZV9sdm1jYWNoZShjbWQsIGNuLCBOVUxMLCAwKTsKKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXJldHVybiAxOworfQorCitpbnQgbHZtZXRhZF9nZXRfdmduYW1laWRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqdmduYW1laWRzKQoreworCXN0cnVjdCB2Z25hbWVpZF9saXN0ICp2Z25sOworCXN0cnVjdCBpZCB2Z2lkOworCWNvbnN0IGNoYXIgKnZnaWRfdHh0OworCWNvbnN0IGNoYXIgKnZnX25hbWU7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlsb2dfZGVidWdfbHZtZXRhZCgiQXNraW5nIGx2bWV0YWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2Yga25vd24gVkcgaWRzL25hbWVzIik7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInZnX2xpc3QiLCBOVUxMKTsKKwlpZiAoIV9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInZnX2xpc3QiLCAiIiwgTlVMTCkpIHsKKwkJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyZXBseS5jZnQtPnJvb3QsICJ2b2x1bWVfZ3JvdXBzIikpKSB7CisJCWZvciAoY24gPSBjbi0+Y2hpbGQ7IGNuOyBjbiA9IGNuLT5zaWIpIHsKKwkJCXZnaWRfdHh0ID0gY24tPmtleTsKKwkJCWlmICghaWRfcmVhZF9mb3JtYXQoJnZnaWQsIHZnaWRfdHh0KSkgeworCQkJCXN0YWNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoISh2Z25sID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCp2Z25sKSkpKSB7CisJCQkJbG9nX2Vycm9yKCJ2Z25hbWVpZF9saXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoISh2Z19uYW1lID0gZG1fY29uZmlnX2ZpbmRfc3RyKGNuLT5jaGlsZCwgIm5hbWUiLCBOVUxMKSkpIHsKKwkJCQlsb2dfZXJyb3IoInZnX2xpc3Qgbm8gbmFtZSBmb3VuZC4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJdmdubC0+dmdpZCA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCAoY2hhciAqKSZ2Z2lkKTsKKwkJCXZnbmwtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmdfbmFtZSk7CisKKwkJCWlmICghdmdubC0+dmdpZCB8fCAhdmdubC0+dmdfbmFtZSkgeworCQkJCWxvZ19lcnJvcigidmduYW1laWRfbGlzdCBtZW1iZXIgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWRtX2xpc3RfYWRkKHZnbmFtZWlkcywgJnZnbmwtPmxpc3QpOworCQl9CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1ldGFkX3ZnX2xpc3RfdG9fbHZtY2FjaGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdG1wOworCXN0cnVjdCBpZCB2Z2lkOworCWNvbnN0IGNoYXIgKnZnaWRfdHh0OworCWRhZW1vbl9yZXBseSByZXBseTsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkKKwkJcmV0dXJuIDE7CisKKwlsb2dfZGVidWdfbHZtZXRhZCgiQXNraW5nIGx2bWV0YWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2Yga25vd24gVkdzIik7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInZnX2xpc3QiLCBOVUxMKTsKKwlpZiAoIV9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInZnX2xpc3QiLCAiIiwgTlVMTCkpIHsKKwkJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShyZXBseS5jZnQtPnJvb3QsICJ2b2x1bWVfZ3JvdXBzIikpKQorCQlmb3IgKGNuID0gY24tPmNoaWxkOyBjbjsgY24gPSBjbi0+c2liKSB7CisJCQl2Z2lkX3R4dCA9IGNuLT5rZXk7CisJCQlpZiAoIWlkX3JlYWRfZm9ybWF0KCZ2Z2lkLCB2Z2lkX3R4dCkpIHsKKwkJCQlzdGFjazsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogdGhlIGNhbGwgdG8gbHZtZXRhZF92Z19sb29rdXAgd2lsbCBwb2tlIHRoZSBWRyBpbnRvIGx2bWNhY2hlICovCisJCQl0bXAgPSBsdm1ldGFkX3ZnX2xvb2t1cChjbWQsIE5VTEwsIChjb25zdCBjaGFyKikmdmdpZCk7CisJCQlyZWxlYXNlX3ZnKHRtcCk7CisJCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgX2V4dHJhY3RfZGxfYmF0b24geworCWludCBpOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYjsKK307CisKK3N0YXRpYyBpbnQgX2V4dHJhY3RfbWRhKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBfZXh0cmFjdF9kbF9iYXRvbiAqYiA9IGJhdG9uOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY2hhciBpZFszMl07CisKKwlpZiAoIW1kYS0+b3BzLT5tZGFfZXhwb3J0X3RleHQpIC8qIGRvIG5vdGhpbmcgKi8KKwkJcmV0dXJuIDE7CisKKwkodm9pZCkgZG1fc25wcmludGYoaWQsIDMyLCAibWRhJWQiLCBiLT5pKTsKKwlpZiAoIShjbiA9IG1ha2VfY29uZmlnX25vZGUoYi0+Y2Z0LCBpZCwgYi0+Y2Z0LT5yb290LCBiLT5wcmVfc2liKSkpCisJCXJldHVybiAwOworCWlmICghbWRhLT5vcHMtPm1kYV9leHBvcnRfdGV4dChtZGEsIGItPmNmdCwgY24pKQorCQlyZXR1cm4gMDsKKworCWItPmkgKys7CisJYi0+cHJlX3NpYiA9IGNuOyAvKiBmb3IgZWZmaWNpZW5jeSAqLworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2V4dHJhY3RfZGlza19sb2NhdGlvbihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGlza19sb2NuICpkbCwgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IF9leHRyYWN0X2RsX2JhdG9uICpiID0gYmF0b247CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljaGFyIGlkWzMyXTsKKworCWlmICghZGwpCisJCXJldHVybiAxOworCisJKHZvaWQpIGRtX3NucHJpbnRmKGlkLCAzMiwgIiVzJWQiLCBuYW1lLCBiLT5pKTsKKwlpZiAoIShjbiA9IG1ha2VfY29uZmlnX25vZGUoYi0+Y2Z0LCBpZCwgYi0+Y2Z0LT5yb290LCBiLT5wcmVfc2liKSkpCisJCXJldHVybiAwOworCWlmICghY29uZmlnX21ha2Vfbm9kZXMoYi0+Y2Z0LCBjbiwgTlVMTCwKKwkJCSAgICAgICAib2Zmc2V0ID0gJSJQUklkNjQsIChpbnQ2NF90KSBkbC0+b2Zmc2V0LAorCQkJICAgICAgICJzaXplID0gJSJQUklkNjQsIChpbnQ2NF90KSBkbC0+c2l6ZSwKKwkJCSAgICAgICBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwliLT5pICsrOworCWItPnByZV9zaWIgPSBjbjsgLyogZm9yIGVmZmljaWVuY3kgKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9leHRyYWN0X2RhKHN0cnVjdCBkaXNrX2xvY24gKmRhLCB2b2lkICpiYXRvbikKK3sKKwlyZXR1cm4gX2V4dHJhY3RfZGlza19sb2NhdGlvbigiZGEiLCBkYSwgYmF0b24pOworfQorCitzdGF0aWMgaW50IF9leHRyYWN0X2JhKHN0cnVjdCBkaXNrX2xvY24gKmJhLCB2b2lkICpiYXRvbikKK3sKKwlyZXR1cm4gX2V4dHJhY3RfZGlza19sb2NhdGlvbigiYmEiLCBiYSwgYmF0b24pOworfQorCitzdGF0aWMgaW50IF9leHRyYWN0X21kYXMoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYikKK3sKKwlzdHJ1Y3QgX2V4dHJhY3RfZGxfYmF0b24gYmF0b24gPSB7IC5jZnQgPSBjZnQgfTsKKworCWlmICghbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgJl9leHRyYWN0X21kYSwgJmJhdG9uKSkKKwkJcmV0dXJuIDA7CisKKwliYXRvbi5pID0gMDsKKwlpZiAoIWx2bWNhY2hlX2ZvcmVhY2hfZGEoaW5mbywgJl9leHRyYWN0X2RhLCAmYmF0b24pKQorCQlyZXR1cm4gMDsKKworCWJhdG9uLmkgPSAwOworCWlmICghbHZtY2FjaGVfZm9yZWFjaF9iYShpbmZvLCAmX2V4dHJhY3RfYmEsICZiYXRvbikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1ldGFkX3B2X2ZvdW5kKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgaWQgKnB2aWQsIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCSAgICAgdWludDY0X3QgbGFiZWxfc2VjdG9yLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqZm91bmRfdmduYW1lcywKKwkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqY2hhbmdlZF92Z25hbWVzKQoreworCWNoYXIgdXVpZFs2NF07CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcHZtZXRhLCAqdmdtZXRhOworCWNvbnN0IGNoYXIgKnN0YXR1cyA9IE5VTEwsICp2Z25hbWUgPSBOVUxMOworCWludDY0X3QgY2hhbmdlZCA9IDA7CisJaW50IHJlc3VsdDsKKworCWlmICghbHZtZXRhZF91c2VkKCkgfHwgdGVzdF9tb2RlKCkpCisJCXJldHVybiAxOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQocHZpZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKyAgICAgICAgICAgICAgICByZXR1cm5fMDsKKworCXB2bWV0YSA9IGRtX2NvbmZpZ19jcmVhdGUoKTsKKwlpZiAoIXB2bWV0YSkKKwkJcmV0dXJuXzA7CisKKwlpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoKGNvbnN0IGNoYXIgKilwdmlkLCBkZXYsIDApOworCisJaWYgKCEocHZtZXRhLT5yb290ID0gbWFrZV9jb25maWdfbm9kZShwdm1ldGEsICJwdiIsIE5VTEwsIE5VTEwpKSkgeworCQlkbV9jb25maWdfZGVzdHJveShwdm1ldGEpOworCQlyZXR1cm5fMDsKKwl9CisKKwkvKiBUT0RPOiByZXNvbHZlIHdoYXQgZG9lcyBpdCBhY3R1YWxseSBtZWFuICAnaW5mbyA9PSBOVUxMJworCSAqICAgICAgIG1pc3NpbmcgaW5mbyBpcyBsaWtlbHkgYW4gSU5URVJOQUxfRVJST1IgKi8KKwlpZiAoIWNvbmZpZ19tYWtlX25vZGVzKHB2bWV0YSwgcHZtZXRhLT5yb290LCBOVUxMLAorCQkJICAgICAgICJkZXZpY2UgPSAlIlBSSWQ2NCwgKGludDY0X3QpIGRldi0+ZGV2LAorCQkJICAgICAgICJkZXZfc2l6ZSA9ICUiUFJJZDY0LCAoaW50NjRfdCkgKGluZm8gPyBsdm1jYWNoZV9kZXZpY2Vfc2l6ZShpbmZvKSA6IDApLAorCQkJICAgICAgICJmb3JtYXQgPSAlcyIsIGZtdC0+bmFtZSwKKwkJCSAgICAgICAibGFiZWxfc2VjdG9yID0gJSJQUklkNjQsIChpbnQ2NF90KSBsYWJlbF9zZWN0b3IsCisJCQkgICAgICAgImlkID0gJXMiLCB1dWlkLAorCQkJICAgICAgICJleHRfdmVyc2lvbiA9ICUiUFJJZDY0LCAoaW50NjRfdCkgKGluZm8gPyBsdm1jYWNoZV9leHRfdmVyc2lvbihpbmZvKSA6IDApLAorCQkJICAgICAgICJleHRfZmxhZ3MgPSAlIlBSSWQ2NCwgKGludDY0X3QpIChpbmZvID8gbHZtY2FjaGVfZXh0X2ZsYWdzKGluZm8pIDogMCksCisJCQkgICAgICAgTlVMTCkpCisJeworCQlkbV9jb25maWdfZGVzdHJveShwdm1ldGEpOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoaW5mbykKKwkJLyogRklYTUUgQSBtb3JlIGRpcmVjdCByb3V0ZSB3b3VsZCBiZSBtdWNoIHByZWZlcmFibGUuICovCisJCV9leHRyYWN0X21kYXMoaW5mbywgcHZtZXRhLCBwdm1ldGEtPnJvb3QpOworCisJaWYgKHZnKSB7CisJCWlmICghKHZnbWV0YSA9IGV4cG9ydF92Z190b19jb25maWdfdHJlZSh2ZykpKSB7CisJCQlkbV9jb25maWdfZGVzdHJveShwdm1ldGEpOworCQkJcmV0dXJuXzA7CisJCX0KKworCQlsb2dfZGVidWdfbHZtZXRhZCgiVGVsbGluZyBsdm1ldGFkIHRvIHN0b3JlIFBWICVzICglcykgaW4gVkcgJXMiLCBkZXZfbmFtZShkZXYpLCB1dWlkLCB2Zy0+bmFtZSk7CisJCXJlcGx5ID0gX2x2bWV0YWRfc2VuZChjbWQsICJwdl9mb3VuZCIsCisJCQkJICAgICAgInB2bWV0YSA9ICV0IiwgcHZtZXRhLAorCQkJCSAgICAgICJ2Z25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJCSAgICAgICJtZXRhZGF0YSA9ICV0IiwgdmdtZXRhLAorCQkJCSAgICAgIE5VTEwpOworCQlkbV9jb25maWdfZGVzdHJveSh2Z21ldGEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIFZHIG1ldGFkYXRhIHN0b3JlZCBvbiB0aGlzIFBWLgorCQkgKiBJdCBtaWdodCBvciBtaWdodCBub3QgYmUgYW4gb3JwaGFuLgorCQkgKi8KKwkJbG9nX2RlYnVnX2x2bWV0YWQoIlRlbGxpbmcgbHZtZXRhZCB0byBzdG9yZSBQViAlcyAoJXMpIiwgZGV2X25hbWUoZGV2KSwgdXVpZCk7CisJCXJlcGx5ID0gX2x2bWV0YWRfc2VuZChOVUxMLCAicHZfZm91bmQiLCAicHZtZXRhID0gJXQiLCBwdm1ldGEsIE5VTEwpOworCX0KKworCWRtX2NvbmZpZ19kZXN0cm95KHB2bWV0YSk7CisKKwlyZXN1bHQgPSBfbHZtZXRhZF9oYW5kbGVfcmVwbHkocmVwbHksICJwdl9mb3VuZCIsIHV1aWQsIE5VTEwpOworCisJaWYgKHZnICYmIHJlc3VsdCAmJgorCSAgICAoZGFlbW9uX3JlcGx5X2ludChyZXBseSwgInNlcW5vX2FmdGVyIiwgLTEpICE9IHZnLT5zZXFubyB8fAorCSAgICAgZGFlbW9uX3JlcGx5X2ludChyZXBseSwgInNlcW5vX2FmdGVyIiwgLTEpICE9IGRhZW1vbl9yZXBseV9pbnQocmVwbHksICJzZXFub19iZWZvcmUiLCAtMSkpKQorCQlsb2dfd2FybigiV0FSTklORzogSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAlcyIsIHZnLT5uYW1lKTsKKworCWlmIChyZXN1bHQgJiYgZm91bmRfdmduYW1lcykgeworCQlzdGF0dXMgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAic3RhdHVzIiwgTlVMTCk7CisJCXZnbmFtZSA9IGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJ2Z25hbWUiLCBOVUxMKTsKKwkJY2hhbmdlZCA9IGRhZW1vbl9yZXBseV9pbnQocmVwbHksICJjaGFuZ2VkIiwgMCk7CisJfQorCisJLyoKKwkgKiBJZiBsdm1ldGFkIG5vdyBzZWVzIGFsbCBQVnMgaW4gdGhlIFZHLCBpdCByZXR1cm5lZCB0aGUKKwkgKiAiY29tcGxldGUiIHN0YXR1cyBzdHJpbmcuICBBZGQgdGhpcyBWRyBuYW1lIHRvIHRoZSBsaXN0CisJICogb2YgZm91bmQgVkdzIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gZG8gYXV0b2FjdGl2YXRpb24uCisJICoKKwkgKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIG5vdGlmeWluZyBsdm1ldGFkIGFib3V0IHRoZSBuZXcKKwkgKiBQViwgZS5nLiBsdm1ldGFkIHdhcyBkaXNhYmxlZCBkdWUgdG8gYSBkdXBsaWNhdGUsIHRoZW4KKwkgKiBubyBhdXRvYWN0aXZhdGlvbiBpcyBhdHRlbXB0ZWQuCisJICoKKwkgKiBGSVhNRTogdGhlcmUgd2FzIGEgcHJldmlvdXMgZml4bWUgaW5kaWNhdGluZyB0aGF0CisJICogYXV0b2FjdGl2YXRpb24gbWlnaHQgYWxzbyBiZSBkb25lIGZvciBWR3Mgd2l0aCB0aGUKKwkgKiAicGFydGlhbCIgc3RhdHVzLgorCSAqCisJICogSWYgdGhlIFZHIGhhcyAiY2hhbmdlZCIgYnkgZmluZGluZyB0aGUgUFYsIGx2bWV0YWQgcmV0dXJucworCSAqIHRoZSAiY2hhbmdlZCIgZmxhZy4gIFRoZSBuYW1lcyBvZiAiY2hhbmdlZCIgVkdzIGFyZSBzYXZlZAorCSAqIGluIHRoZSBjaGFuZ2VkX3ZnbmFtZXMgbGlzdHMsIHdoaWNoIGlzIHVzZWQgZHVyaW5nIGF1dG9hY3RpdmF0aW9uLgorCSAqIElmIGEgVkcgaXMgY2hhbmdlZCwgdGhlbiBhdXRvYWN0aXZhdGlvbiByZWZyZXNoZXMgTFZzIGluIHRoZSBWRy4KKwkgKi8KKworCWlmIChmb3VuZF92Z25hbWVzICYmIHZnbmFtZSAmJiBzdGF0dXMgJiYgIXN0cmNtcChzdGF0dXMsICJjb21wbGV0ZSIpKSB7CisJCWxvZ19kZWJ1ZygiVkcgJXMgaXMgY29tcGxldGUgaW4gbHZtZXRhZCB3aXRoIGRldiAlcy4iLCB2Z25hbWUsIGRldl9uYW1lKGRldikpOworCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgZm91bmRfdmduYW1lcywgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnbmFtZSkpKQorCQkJbG9nX2Vycm9yKCJzdHJfbGlzdF9hZGQgZmFpbGVkIik7CisKKwkJaWYgKGNoYW5nZWRfdmduYW1lcyAmJiBjaGFuZ2VkKSB7CisJCQlsb2dfZGVidWcoIlZHICVzIGlzIGNoYW5nZWQgaW4gbHZtZXRhZC4iLCB2Z25hbWUpOworCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGNoYW5nZWRfdmduYW1lcywgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnbmFtZSkpKQorCQkJCWxvZ19lcnJvcigic3RyX2xpc3RfYWRkIGZhaWxlZCIpOworCQl9CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGx2bWV0YWRfcHZfZ29uZShkZXZfdCBkZXZubywgY29uc3QgY2hhciAqcHZfbmFtZSkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgZm91bmQ7CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpIHx8IHRlc3RfbW9kZSgpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogIFRPRE86IGF1dG9tYXRpYyB2b2x1bWUgZGVhY3RpdmF0aW9uIHRha2VzIHBsYWNlIGhlcmUgKmJlZm9yZSoKKwkgKiAgICAgICAgYWxsIGNhY2hlZCBpbmZvIGlzIGdvbmUgLSBjYWxsIGhhbmRsZXIuIEFsc28sIGNvbnNpZGVyCisJICogICAgICAgIGludGVncmF0aW5nIGV4aXN0aW5nIGRlYWN0aXZhdGlvbiBzY3JpcHQgIHRoYXQgZGVhY3RpdmF0ZXMKKwkgKiAgICAgICAgdGhlIHdob2xlIHN0YWNrIGZyb20gdG9wIHRvIGJvdHRvbSAobm90IHlldCB1cHN0cmVhbSkuCisJICovCisKKwlsb2dfZGVidWdfbHZtZXRhZCgiVGVsbGluZyBsdm1ldGFkIHRvIGZvcmdldCBhbnkgUFYgb24gJXMiLCBwdl9uYW1lKTsKKwlyZXBseSA9IF9sdm1ldGFkX3NlbmQoTlVMTCwgInB2X2dvbmUiLCAiZGV2aWNlID0gJSIgUFJJZDY0LCAoaW50NjRfdCkgZGV2bm8sIE5VTEwpOworCisJcmVzdWx0ID0gX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAicHZfZ29uZSIsIHB2X25hbWUsICZmb3VuZCk7CisJLyogV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIG9yIG5vdCB0aGUgZGFlbW9uIGhhZCB0aGUgUFYgY2FjaGVkLiAqLworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGx2bWV0YWRfcHZfZ29uZV9ieV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBsdm1ldGFkX3B2X2dvbmUoZGV2LT5kZXYsIGRldl9uYW1lKGRldikpOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGltcGxlbWVudHMgcHZzY2FuIC0tY2FjaGUuCisgKi8KKworc3RydWN0IF9sdm1ldGFkX3B2c2Nhbl9iYXRvbiB7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworfTsKKworc3RhdGljIGludCBfbHZtZXRhZF9wdnNjYW5fc2luZ2xlKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBfbHZtZXRhZF9wdnNjYW5fYmF0b24gKmIgPSBiYXRvbjsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKworCWlmIChtZGFfaXNfaWdub3JlZChtZGEpIHx8CisJICAgICEodmcgPSBtZGEtPm9wcy0+dmdfcmVhZChiLT5maWQsICIiLCBtZGEsIE5VTEwsIE5VTEwsIDEpKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBGSVhNRSBBbHNvIGVuc3VyZSBjb250ZW50cyBtYXRjaCBldGMuICovCisJaWYgKCFiLT52ZyB8fCB2Zy0+c2Vxbm8gPiBiLT52Zy0+c2Vxbm8pCisJCWItPnZnID0gdmc7CisJZWxzZSBpZiAoYi0+dmcpCisJCXJlbGVhc2VfdmcodmcpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgbG9jayBtYW5hZ2VyIG1heSBkZXRlY3QgdGhhdCB0aGUgdmcgY2FjaGVkIGluIGx2bWV0YWQgaXMgb3V0IG9mIGRhdGUsCisgKiBkdWUgdG8gc29tZXRoaW5nIGxpa2UgYW4gbHZjcmVhdGUgZnJvbSBhbm90aGVyIGhvc3QuCisgKiBUaGlzIGlzIGxpbWl0ZWQgdG8gY2hhbmdlcyB0aGF0IG9ubHkgYWZmZWN0IHRoZSB2ZyAobm90IGdsb2JhbCBzdGF0ZSBsaWtlCisgKiBvcnBoYW4gUFZzKSwgc28gd2Ugb25seSBuZWVkIHRvIHJlcmVhZCBtZGFzIG9uIHRoZSB2ZydzIGV4aXN0aW5nIHB2cy4KKyAqIEJ1dCwgYSBwcmV2aW91cyBQViBpbiB0aGUgVkcgbWF5IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIHdlIGxhc3QgcmVhZAorICogdGhlIFZHLCBhbmQgdGhhdCBQViBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmb3IgYW5vdGhlciBWRy4KKyAqLworCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqbHZtZXRhZF9wdnNjYW5fdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWNoYXIgcHZpZF9zW0lEX0xFTiArIDFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3JldCA9IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICp2Z21ldGFfcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnZnbWV0YTsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqcHZsX25ldzsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmwsICpkZXZsX25ldywgKmRldmxzYWZlOworCXN0cnVjdCBkbV9saXN0IHB2c19zY2FuOworCXN0cnVjdCBkbV9saXN0IHB2c19kcm9wOworCXN0cnVjdCBkbV9saXN0IHB2c19uZXc7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWMgPSB7IC50eXBlID0gMCB9OworCXN0cnVjdCBfbHZtZXRhZF9wdnNjYW5fYmF0b24gYmF0b247CisJc3RydWN0IGRldmljZSAqc2F2ZV9kZXYgPSBOVUxMOworCXVpbnQzMl90IHNhdmVfc2Vxbm8gPSAwOworCWludCBtaXNzaW5nX2RldnMgPSAwOworCWludCBjaGVja19uZXdfcHZzID0gMDsKKwlpbnQgZm91bmQ7CisKKwlkbV9saXN0X2luaXQoJnB2c19zY2FuKTsKKwlkbV9saXN0X2luaXQoJnB2c19kcm9wKTsKKwlkbV9saXN0X2luaXQoJnB2c19uZXcpOworCisJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2Nhbm5pbmcgVkcgJXMgKHNlcW5vICV1KS4iLCB2Zy0+bmFtZSwgdmctPnNlcW5vKTsKKworCS8qCisJICogQW5vdGhlciBob3N0IG1heSBoYXZlIGFkZGVkIGEgUFYgdG8gdGhlIFZHLCBhbmQgc29tZQorCSAqIGNvbW1hbmRzIGRvIG5vdCBhbHdheXMgcG9wdWxhdGUgdGhlaXIgbHZtY2FjaGUgd2l0aAorCSAqIGFsbCBkZXZzIGZyb20gbHZtZXRhZCwgc28gdGhleSB3b3VsZCBmYWlsIHRvIGZpbmQKKwkgKiB0aGUgbmV3IFBWIHdoZW4gc2Nhbm5pbmcgdGhlIFZHLiAgU28gbWFrZSBzdXJlIHRoaXMKKwkgKiBjb21tYW5kIGtub3dzIGFib3V0IGFsbCBQVnMgZnJvbSBsdm1ldGFkLgorCSAqLworCWx2bWNhY2hlX3NlZWRfaW5mb3NfZnJvbV9sdm1ldGFkKGNtZCk7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggdGhlIGxpc3Qgb2YgUFZzIHRoYXQgd2UgbGFzdCBzYXcgaW4gdGhlIFZHLgorCSAqIFNvbWUgbWF5IG5vdyBiZSBnb25lLCBhbmQgc29tZSBuZXcgUFZzIG1heSBoYXZlIGJlZW4gYWRkZWQuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKCEoZGV2bCA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bWVtLCBzaXplb2YoKmRldmwpKSkpCisJCQlyZXR1cm5fTlVMTDsKKwkJZGV2bC0+ZGV2ID0gcHZsLT5wdi0+ZGV2OworCQlkbV9saXN0X2FkZCgmcHZzX3NjYW4sICZkZXZsLT5saXN0KTsKKwl9CisKK3NjYW5fbW9yZToKKworCS8qCisJICogUnVuIHRoZSBlcXVpdmFsZW50IG9mIGx2bWV0YWRfcHZzY2FuX3NpbmdsZSBvbiBlYWNoIGRldiBpbiB0aGUgVkcuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZGV2bCwgZGV2bHNhZmUsICZwdnNfc2NhbikgeworCQlpZiAoIWRldmwtPmRldikKKwkJCWNvbnRpbnVlOworCisJCWxvZ19kZWJ1Z19sdm1ldGFkKCJSZXNjYW4gVkcgJXMgc2Nhbm5pbmcgJXMuIiwgdmctPm5hbWUsIGRldl9uYW1lKGRldmwtPmRldikpOworCisJCWlmICghbGFiZWxfcmVhZChkZXZsLT5kZXYsICZsYWJlbCwgMCkpIHsKKwkJCS8qIEFub3RoZXIgaG9zdCByZW1vdmVkIHRoaXMgUFYgZnJvbSB0aGUgVkcuICovCisJCQlsb2dfZGVidWdfbHZtZXRhZCgiUmVzY2FuIFZHICVzIGZvdW5kICVzIHdhcyByZW1vdmVkLiIsIHZnLT5uYW1lLCBkZXZfbmFtZShkZXZsLT5kZXYpKTsKKworCQkJaWYgKChpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoZGV2bC0+ZGV2LT5wdmlkLCBOVUxMLCAwKSkpCisJCQkJbHZtY2FjaGVfZGVsKGluZm8pOworCisJCQlkbV9saXN0X21vdmUoJnB2c19kcm9wLCAmZGV2bC0+bGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8gPSAoc3RydWN0IGx2bWNhY2hlX2luZm8gKikgbGFiZWwtPmluZm87CisKKwkJYmF0b24udmcgPSBOVUxMOworCQliYXRvbi5maWQgPSBsdm1jYWNoZV9mbXQoaW5mbyktPm9wcy0+Y3JlYXRlX2luc3RhbmNlKGx2bWNhY2hlX2ZtdChpbmZvKSwgJmZpYyk7CisJCWlmICghYmF0b24uZmlkKQorCQkJcmV0dXJuX05VTEw7CisKKwkJaWYgKGJhdG9uLmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9PQlNPTEVURSkgeworCQkJbG9nX2RlYnVnX2x2bWV0YWQoIklnbm9yaW5nIG9ic29sZXRlIGZvcm1hdCBvbiBQViAlcyBpbiBWRyAlcy4iLCBkZXZfbmFtZShkZXZsLT5kZXYpLCB2Zy0+bmFtZSk7CisJCQlsdm1jYWNoZV9mbXQoaW5mbyktPm9wcy0+ZGVzdHJveV9pbnN0YW5jZShiYXRvbi5maWQpOworCQkJZG1fbGlzdF9tb3ZlKCZwdnNfZHJvcCwgJmRldmwtPmxpc3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBSZWFkIFZHIG1ldGFkYXRhIGZyb20gdGhpcyBkZXYncyBtZGFzLgorCQkgKi8KKwkJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX2x2bWV0YWRfcHZzY2FuX3NpbmdsZSwgJmJhdG9uKTsKKworCQkvKgorCQkgKiBUaGUgUFYgbWF5IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIFZHIGJ5IGFub3RoZXIgaG9zdAorCQkgKiBzaW5jZSB3ZSBsYXN0IHJlYWQgdGhlIFZHLgorCQkgKi8KKwkJaWYgKCFiYXRvbi52ZykgeworCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBkaWQgbm90IGZpbmQgJXMuIiwgdmctPm5hbWUsIGRldl9uYW1lKGRldmwtPmRldikpOworCQkJbHZtY2FjaGVfZm10KGluZm8pLT5vcHMtPmRlc3Ryb3lfaW5zdGFuY2UoYmF0b24uZmlkKTsKKwkJCWRtX2xpc3RfbW92ZSgmcHZzX2Ryb3AsICZkZXZsLT5saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIFBWIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBWRyBhbmQgdXNlZCBmb3IgYQorCQkgKiBkaWZmZXJlbnQgVkcgc2luY2Ugd2UgbGFzdCByZWFkIHRoZSBWRy4KKwkJICovCisJCWlmIChzdHJjbXAoYmF0b24udmctPm5hbWUsIHZnLT5uYW1lKSkgeworCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBmb3VuZCBkaWZmZXJlbnQgVkcgJXMgb24gUFYgJXMuIiwKKwkJCQkJICB2Zy0+bmFtZSwgYmF0b24udmctPm5hbWUsIGRldl9uYW1lKGRldmwtPmRldikpOworCQkJcmVsZWFzZV92ZyhiYXRvbi52Zyk7CisJCQlkbV9saXN0X21vdmUoJnB2c19kcm9wLCAmZGV2bC0+bGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBWRyBtZXRhZGF0YSByZWFkIGZyb20gZWFjaCBkZXYgc2hvdWxkIG1hdGNoLiAgU2F2ZSB0aGUKKwkJICogbWV0YWRhdGEgZnJvbSB0aGUgZmlyc3QgZGV2LCBhbmQgY29tcGFyZSBpdCB0byB0aGUgbWV0YWRhdGEKKwkJICogcmVhZCBmcm9tIGVhY2ggb3RoZXIgZGV2LgorCQkgKi8KKworCQlpZiAoIXNhdmVfc2Vxbm8pCisJCQlzYXZlX3NlcW5vID0gYmF0b24udmctPnNlcW5vOworCisJCWlmICghKHZnbWV0YSA9IGV4cG9ydF92Z190b19jb25maWdfdHJlZShiYXRvbi52ZykpKSB7CisJCQlsb2dfZXJyb3IoIlZHIGV4cG9ydCB0byBjb25maWcgdHJlZSBmYWlsZWQiKTsKKwkJCXJlbGVhc2VfdmcoYmF0b24udmcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoIXZnbWV0YV9yZXQpIHsKKwkJCXZnbWV0YV9yZXQgPSB2Z21ldGE7CisJCQlzYXZlX2RldiA9IGRldmwtPmRldjsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb21wYXJlX2NvbmZpZyh2Z21ldGFfcmV0LT5yb290LCB2Z21ldGEtPnJvb3QpKSB7CisJCQkJbG9nX2Vycm9yKCJWRyAlcyBtZXRhZGF0YSBjb21wYXJpc29uIGZhaWxlZCBmb3IgZGV2aWNlICVzIHZzICVzIiwKKwkJCQkJICB2Zy0+bmFtZSwgZGV2X25hbWUoZGV2bC0+ZGV2KSwgc2F2ZV9kZXYgPyBkZXZfbmFtZShzYXZlX2RldikgOiAibm9uZSIpOworCQkJCV9sb2dfZGVidWdfaW5lcXVhbGl0eSh2Zy0+bmFtZSwgdmdtZXRhX3JldC0+cm9vdCwgdmdtZXRhLT5yb290KTsKKwkJCQlkbV9jb25maWdfZGVzdHJveSh2Z21ldGEpOworCQkJCWRtX2NvbmZpZ19kZXN0cm95KHZnbWV0YV9yZXQpOworCQkJCXJlbGVhc2VfdmcoYmF0b24udmcpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJZG1fY29uZmlnX2Rlc3Ryb3kodmdtZXRhKTsKKwkJfQorCisJCS8qCisJCSAqIExvb2sgZm9yIGFueSBuZXcgUFZzIGluIHRoZSBWRyBtZXRhZGF0YSB0aGF0IHdlcmUgbm90IGluIG91cgorCQkgKiBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBWRy4gIEFkZCB0aGVtIHRvIHB2c19uZXcgdG8gYmUKKwkJICogc2Nhbm5lZCBpbiB0aGlzIGxvb3AganVzdCBsaWtlIHRoZSBvbGQgUFZzLgorCQkgKi8KKwkJaWYgKCFjaGVja19uZXdfcHZzKSB7CisJCQljaGVja19uZXdfcHZzID0gMTsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmxfbmV3LCAmYmF0b24udmctPnB2cykgeworCQkJCWZvdW5kID0gMDsKKwkJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQkJCQlpZiAocHZsX25ldy0+cHYtPmRldiAhPSBwdmwtPnB2LT5kZXYpCisJCQkJCQljb250aW51ZTsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGZvdW5kKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIXB2bF9uZXctPnB2LT5kZXYpIHsKKwkJCQkJc3RybmNweShwdmlkX3MsIChjaGFyICopICZwdmxfbmV3LT5wdi0+aWQsIHNpemVvZihwdmlkX3MpIC0gMSk7CisJCQkJCWlmICghaWRfd3JpdGVfZm9ybWF0KChjb25zdCBzdHJ1Y3QgaWQgKikmcHZpZF9zLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQkJCQkJc3RhY2s7CisJCQkJCWxvZ19lcnJvcigiRGV2aWNlIG5vdCBmb3VuZCBmb3IgUFYgJXMgaW4gVkcgJXMiLCB1dWlkLCB2Zy0+bmFtZSk7CisJCQkJCW1pc3NpbmdfZGV2cysrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCEoZGV2bF9uZXcgPSBkbV9wb29sX3phbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpkZXZsX25ldykpKSkKKwkJCQkJcmV0dXJuX05VTEw7CisJCQkJZGV2bF9uZXctPmRldiA9IHB2bF9uZXctPnB2LT5kZXY7CisJCQkJZG1fbGlzdF9hZGQoJnB2c19uZXcsICZkZXZsX25ldy0+bGlzdCk7CisJCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBmb3VuZCAlcyB3YXMgYWRkZWQuIiwgdmctPm5hbWUsIGRldl9uYW1lKGRldmxfbmV3LT5kZXYpKTsKKwkJCX0KKwkJfQorCisJCXJlbGVhc2VfdmcoYmF0b24udmcpOworCX0KKworCS8qCisJICogRG8gdGhlIHNhbWUgc2Nhbm5pbmcgYWJvdmUgZm9yIGFueSBuZXcgUFZzLgorCSAqLworCWlmICghZG1fbGlzdF9lbXB0eSgmcHZzX25ldykpIHsKKwkJZG1fbGlzdF9pbml0KCZwdnNfc2Nhbik7CisJCWRtX2xpc3Rfc3BsaWNlKCZwdnNfc2NhbiwgJnB2c19uZXcpOworCQlkbV9saXN0X2luaXQoJnB2c19uZXcpOworCQlsb2dfZGVidWdfbHZtZXRhZCgiUmVzY2FuIFZHICVzIGZvdW5kIG5ldyBQVnMgdG8gc2Nhbi4iLCB2Zy0+bmFtZSk7CisJCWdvdG8gc2Nhbl9tb3JlOworCX0KKworCWlmIChtaXNzaW5nX2RldnMpIHsKKwkJaWYgKHZnbWV0YV9yZXQpCisJCQlkbV9jb25maWdfZGVzdHJveSh2Z21ldGFfcmV0KTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJLyoKKwkgKiBSZW1vdmUgcHZzX2Ryb3AgZW50cmllcyBmcm9tIGx2bWV0YWQuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRldmwsICZwdnNfZHJvcCkgeworCQlpZiAoIWRldmwtPmRldikKKwkJCWNvbnRpbnVlOworCQlsb2dfZGVidWdfbHZtZXRhZCgiUmVzY2FuIFZHICVzIGRyb3BwaW5nICVzLiIsIHZnLT5uYW1lLCBkZXZfbmFtZShkZXZsLT5kZXYpKTsKKwkJaWYgKCFsdm1ldGFkX3B2X2dvbmVfYnlfZGV2KGRldmwtPmRldikpCisJCQlyZXR1cm5fTlVMTDsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgVkcgaW4gbHZtZXRhZC4KKwkgKi8KKwlpZiAodmdtZXRhX3JldCkgeworCQlmaWQgPSBsdm1jYWNoZV9mbXQoaW5mbyktPm9wcy0+Y3JlYXRlX2luc3RhbmNlKGx2bWNhY2hlX2ZtdChpbmZvKSwgJmZpYyk7CisJCWlmICghKHZnX3JldCA9IGltcG9ydF92Z19mcm9tX2NvbmZpZ190cmVlKHZnbWV0YV9yZXQsIGZpZCkpKSB7CisJCQlsb2dfZXJyb3IoIlZHIGltcG9ydCBmcm9tIGNvbmZpZyB0cmVlIGZhaWxlZCIpOworCQkJbHZtY2FjaGVfZm10KGluZm8pLT5vcHMtPmRlc3Ryb3lfaW5zdGFuY2UoZmlkKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIGx2bWV0YWQgd2l0aCB0aGUgbmV3bHkgcmVhZCB2ZXJzaW9uIG9mIHRoZSBWRy4KKwkJICogV2hlbiB0aGUgc2Vxbm8gaXMgdW5jaGFuZ2VkIHRoZSBjYWNoZWQgVkcgY2FuIGJlIGxlZnQuCisJCSAqLworCQlpZiAoc2F2ZV9zZXFubyAhPSB2Zy0+c2Vxbm8pIHsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkZXZsLCAmcHZzX3NjYW4pIHsKKwkJCQlpZiAoIWRldmwtPmRldikKKwkJCQkJY29udGludWU7CisJCQkJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBkcm9wcGluZyB0byByZXBsYWNlICVzLiIsIHZnLT5uYW1lLCBkZXZfbmFtZShkZXZsLT5kZXYpKTsKKwkJCQlpZiAoIWx2bWV0YWRfcHZfZ29uZV9ieV9kZXYoZGV2bC0+ZGV2KSkKKwkJCQkJcmV0dXJuX05VTEw7CisJCQl9CisKKwkJCWxvZ19kZWJ1Z19sdm1ldGFkKCJSZXNjYW4gVkcgJXMgdXBkYXRpbmcgbHZtZXRhZCBmcm9tIHNlcW5vICV1IHRvIHNlcW5vICV1LiIsCisJCQkJCSAgdmctPm5hbWUsIHZnLT5zZXFubywgc2F2ZV9zZXFubyk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHZnX3VwZGF0ZSBmYWlscyB0aGUgY2FjaGVkIG1ldGFkYXRhIGluCisJCQkgKiBsdm1ldGFkIHdpbGwgcmVtYWluIGludmFsaWQuCisJCQkgKi8KKwkJCXZnX3JldC0+bHZtZXRhZF91cGRhdGVfcGVuZGluZyA9IDE7CisJCQlpZiAoIWx2bWV0YWRfdmdfdXBkYXRlX2ZpbmlzaCh2Z19yZXQpKQorCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBsdm1ldGFkIHdpdGggbmV3IFZHIG1ldGEiKTsKKwkJfQorCQlkbV9jb25maWdfZGVzdHJveSh2Z21ldGFfcmV0KTsKKwl9CitvdXQ6CisJbG9nX2RlYnVnX2x2bWV0YWQoIlJlc2NhbiBWRyAlcyBkb25lIChzZXFubyAldSkuIiwgdmdfcmV0LT5uYW1lLCB2Z19yZXQtPnNlcW5vKTsKKwlyZXR1cm4gdmdfcmV0OworfQorCitpbnQgbHZtZXRhZF9wdnNjYW5fc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkbV9saXN0ICpmb3VuZF92Z25hbWVzLAorCQkJICBzdHJ1Y3QgZG1fbGlzdCAqY2hhbmdlZF92Z25hbWVzKQoreworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IF9sdm1ldGFkX3B2c2Nhbl9iYXRvbiBiYXRvbjsKKwkvKiBDcmVhdGUgYSBkdW1teSBpbnN0YW5jZS4gKi8KKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWMgPSB7IC50eXBlID0gMCB9OworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBwcm9jZWVkIHNpbmNlIGx2bWV0YWQgaXMgbm90IGFjdGl2ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCAwKSkgeworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTm8gUFYgbGFiZWwgZm91bmQgb24gJXMuIiwgZGV2X25hbWUoZGV2KSk7CisJCWlmICghbHZtZXRhZF9wdl9nb25lX2J5X2RldihkZXYpKQorCQkJZ290b19iYWQ7CisJCXJldHVybiAxOworCX0KKworCWluZm8gPSAoc3RydWN0IGx2bWNhY2hlX2luZm8gKikgbGFiZWwtPmluZm87CisKKwliYXRvbi52ZyA9IE5VTEw7CisJYmF0b24uZmlkID0gbHZtY2FjaGVfZm10KGluZm8pLT5vcHMtPmNyZWF0ZV9pbnN0YW5jZShsdm1jYWNoZV9mbXQoaW5mbyksICZmaWMpOworCisJaWYgKCFiYXRvbi5maWQpCisJCWdvdG9fYmFkOworCisJaWYgKGJhdG9uLmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9PQlNPTEVURSkgeworCQlsdm1jYWNoZV9mbXQoaW5mbyktPm9wcy0+ZGVzdHJveV9pbnN0YW5jZShiYXRvbi5maWQpOworCQlsb2dfd2FybigiV0FSTklORzogRGlzYWJsaW5nIGx2bWV0YWQgY2FjaGUgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBvYnNvbGV0ZSAobHZtMSkgbWV0YWRhdGEuIik7CisJCWx2bWV0YWRfc2V0X2Rpc2FibGVkKGNtZCwgTFZNRVRBRF9ESVNBQkxFX1JFQVNPTl9MVk0xKTsKKwkJX2ZvdW5kX2x2bTFfbWV0YWRhdGEgPSAxOworCQkvKgorCQkgKiByZXR1cm4gMSAoc3VjY2Vzcykgc28gdGhhdCB3ZSdsbCBjb250aW51ZSB0byBwb3B1bGF0ZSBsdm1ldGFkCisJCSAqIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgdXBkYXRlIGluY29tcGxldGUuCisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlsdm1jYWNoZV9mb3JlYWNoX21kYShpbmZvLCBfbHZtZXRhZF9wdnNjYW5fc2luZ2xlLCAmYmF0b24pOworCisJaWYgKCFiYXRvbi52ZykKKwkJbHZtY2FjaGVfZm10KGluZm8pLT5vcHMtPmRlc3Ryb3lfaW5zdGFuY2UoYmF0b24uZmlkKTsKKworCWlmICghbHZtZXRhZF9wdl9mb3VuZChjbWQsIChjb25zdCBzdHJ1Y3QgaWQgKikgJmRldi0+cHZpZCwgZGV2LCBsdm1jYWNoZV9mbXQoaW5mbyksCisJCQkgICAgICBsYWJlbC0+c2VjdG9yLCBiYXRvbi52ZywgZm91bmRfdmduYW1lcywgY2hhbmdlZF92Z25hbWVzKSkgeworCQlyZWxlYXNlX3ZnKGJhdG9uLnZnKTsKKwkJZ290b19iYWQ7CisJfQorCisJcmVsZWFzZV92ZyhiYXRvbi52Zyk7CisJcmV0dXJuIDE7CisKK2JhZDoKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgbHZtZXRhZCBjYWNoZTogY2xlYXIgdGhlIGN1cnJlbnQgbHZtZXRhZCBjYWNoZSwgYW5kIHNjYW4gYWxsCisgKiBkZXZzLCBzZW5kaW5nIGFsbCBpbmZvIGZyb20gdGhlIGRldnMgdG8gbHZtZXRhZC4KKyAqCisgKiBXZSB3YW50IG9ubHkgb25lIGNvbW1hbmQgdG8gYmUgZG9pbmcgdGhpcyBhdCBhIHRpbWUuICBXaGVuIGRvX3dhaXQgaXMgc2V0LAorICogdGhpcyB3aWxsIGZpcnN0IGNoZWNrIGlmIGx2bWV0YWQgaXMgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQgYnkgYW5vdGhlcgorICogY29tbWFuZCwgYW5kIGlmIHNvIGl0IHdpbGwgZGVsYXkgdW50aWwgdGhhdCB1cGRhdGUgaXMgZmluaXNoZWQsIG9yIHVudGlsIGEKKyAqIHRpbWVvdXQsIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgZ28gYWhlYWQgYW5kIGRvIHRoZSBsdm1ldGFkIHVwZGF0ZS4KKyAqCisgKiBDYWxsZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgYW5kIHdhaXRlZCBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlLCBlLmcuIGJ5CisgKiB1c2luZyBsdm1ldGFkX3Rva2VuX21hdGNoZXMoKSwgd2lsbCBnZW5lcmFseSBzZXQgZG9fd2FpdCB0byAwLiAgQ2FsbGVycyB0aGF0CisgKiBoYXZlIG5vdCBjaGVja2VkIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgeWV0IHdpbGwgZ2VuZXJhbGx5IHNldCBkb193YWl0IHRvIDEuCisgKgorICogSWYgYW5vdGhlciBjb21tYW5kIGRvaW5nIGFuIHVwZGF0ZSBmYWlsZWQsIGl0IGxlZnQgbHZtZXRhZCBpbiB0aGUgInVwZGF0ZSBpbgorICogcHJvZ2VzcyIgc3RhdGUsIHNvIHdlIGNhbid0IGp1c3Qgd2FpdCB1bnRpbCB0aGF0IHN0YXRlIGhhcyBjbGVhcmVkLCBidXQgaGF2ZQorICogdG8gZ28gYWhlYWQgYWZ0ZXIgYSB0aW1lb3V0LgorICoKKyAqIFRoZSBfbHZtZXRhZF9pc191cGRhdGluZyBjaGVjayBhdm9pZHMgbW9zdCByYWNlcyB0byB1cGRhdGUgbHZtZXRhZCBmcm9tCisgKiBtdWx0aXBsZSBjb21tYW5kcyAod2hpY2ggc2hvdWxkbid0IGdlbmVyYWxseSBoYXBwZW4gYW53YXkpIGJ1dCBkb2VzIG5vdAorICogZWxpbWluYXRlIHRoZW0uICBJZiBhbiB1cGRhdGUgcmFjZSBoYXBwZW5zLCB0aGUgc2Vjb25kIHdpbGwgc2VlIHRoYXQgdGhlCisgKiBwcmV2aW91cyB0b2tlbiB3YXMgInVwZGF0ZSBpbiBwcm9ncmVzcyIgd2hlbiBpdCBjYWxscyBfdG9rZW5fdXBkYXRlKCkuICBJdAorICogd2lsbCB0aGVuIGZhaWwsIGFuZCB0aGUgY29tbWFuZCBjYWxsaW5nIGx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKCkgd2lsbAorICogZ2VuZXJhbGx5IHJldmVydCBkaXNrIHNjYW5uaW5nIGFuZCBub3QgdXNlIGx2bWV0YWQuCisgKi8KKworaW50IGx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZG9fd2FpdCkKK3sKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworCWRhZW1vbl9yZXBseSByZXBseTsKKwljaGFyICpmdXR1cmVfdG9rZW47CisJY29uc3QgY2hhciAqcmVhc29uOworCWludCB3YXNfc2lsZW50OworCWludCByZXBsYWNpbmdfb3RoZXJfdXBkYXRlID0gMDsKKwlpbnQgcmVwbGFjZWRfdXBkYXRlID0gMDsKKwlpbnQgcmV0cmllcyA9IDA7CisJaW50IHJldCA9IDE7CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHByb2NlZWQgc2luY2UgbHZtZXRhZCBpcyBub3QgYWN0aXZlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyByZXRyeToKKwkvKgorCSAqIElmIGFub3RoZXIgdXBkYXRlIGlzIGluIHByb2dyZXNzLCBkZWxheSB0byBhbGxvdyBpdCB0byBmaW5pc2gsCisJICogcmF0aGVyIHRoYW4gaW50ZXJydXB0aW5nIGl0IHdpdGggb3VyIG93biB1cGRhdGUuCisJICovCisJaWYgKGRvX3dhaXQgJiYgX2x2bWV0YWRfaXNfdXBkYXRpbmcoY21kLCAxKSkgeworCQlsb2dfd2FybigiV0FSTklORzogbHZtZXRhZCB1cGRhdGUgaXMgaW50ZXJydXB0aW5nIGFub3RoZXIgdXBkYXRlIGluIHByb2dyZXNzLiIpOworCQlyZXBsYWNpbmdfb3RoZXJfdXBkYXRlID0gMTsKKwl9CisKKwlsb2dfdmVyYm9zZSgiU2Nhbm5pbmcgYWxsIGRldmljZXMgdG8gdXBkYXRlIGx2bWV0YWQuIik7CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKGNtZC0+bHZtZXRhZF9maWx0ZXIsIDEpKSkgeworCQlsb2dfZXJyb3IoImRldl9pdGVyIGNyZWF0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmdXR1cmVfdG9rZW4gPSBfbHZtZXRhZF90b2tlbjsKKwlfbHZtZXRhZF90b2tlbiA9IChjaGFyICopIExWTUVUQURfVE9LRU5fVVBEQVRFX0lOX1BST0dSRVNTOworCisJaWYgKCFfdG9rZW5fdXBkYXRlKCZyZXBsYWNlZF91cGRhdGUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBsdm1ldGFkIHdoaWNoIGhhZCBhbiB1cGRhdGUgaW4gcHJvZ3Jlc3MuIik7CisJCWRldl9pdGVyX2Rlc3Ryb3koaXRlcik7CisJCV9sdm1ldGFkX3Rva2VuID0gZnV0dXJlX3Rva2VuOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIGlmIF90b2tlbl91cGRhdGUoKSBzZXRzIHJlcGxhY2VkX3VwZGF0ZSB0byAxLCBpdCBtZWFucyB0aGF0IHdlIHNldAorCSAqICJ1cGRhdGUgaW4gcHJvZ3Jlc3MiIHdoZW4gdGhlIGx2bWV0YWQgd2FzIGFscmVhZHkgc2V0IHRvICJ1ZHBhdGUgaW4KKwkgKiBwcm9ncmVzcyIuICBUaGlzIGRldGVjdHMgYSByYWNlIGJldHdlZW4gdHdvIGNvbW1hbmRzIGRvaW5nIHVwZGF0ZXMKKwkgKiBhdCBvbmNlLiAgVGhlIGF0dGVtcHQgYWJvdmUgdG8gYXZvaWQgdGhpcyByYWNlIHVzaW5nCisJICogX2x2bWV0YWRfaXNfdXBkYXRpbmcgaXNuJ3QgcGVyZmVjdC4KKwkgKi8KKwlpZiAoIXJlcGxhY2luZ19vdGhlcl91cGRhdGUgJiYgcmVwbGFjZWRfdXBkYXRlKSB7CisJCWlmIChkb193YWl0ICYmICFyZXRyaWVzKSB7CisJCQlyZXRyaWVzID0gMTsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIHVwZGF0ZSBpbiBwcm9ncmVzcywgcmV0cnlpbmcgdXBkYXRlLiIpOworCQkJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKwkJCV9sdm1ldGFkX3Rva2VuID0gZnV0dXJlX3Rva2VuOworCQkJZ290byByZXRyeTsKKwkJfQorCQlsb2dfd2FybigiV0FSTklORzogbHZtZXRhZCB1cGRhdGUgaW4gcHJvZ3Jlc3MsIHNraXBwaW5nIHVwZGF0ZS4iKTsKKwkJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKwkJX2x2bWV0YWRfdG9rZW4gPSBmdXR1cmVfdG9rZW47CisJCXJldHVybiAwOworCX0KKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJUZWxsaW5nIGx2bWV0YWQgdG8gY2xlYXIgaXRzIGNhY2hlIik7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInB2X2NsZWFyX2FsbCIsIE5VTEwpOworCWlmICghX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAicHZfY2xlYXJfYWxsIiwgIiIsIE5VTEwpKQorCQlyZXQgPSAwOworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXdhc19zaWxlbnQgPSBzaWxlbnRfbW9kZSgpOworCWluaXRfc2lsZW50KDEpOworCisJd2hpbGUgKChkZXYgPSBkZXZfaXRlcl9nZXQoaXRlcikpKSB7CisJCWlmIChzaWdpbnRfY2F1Z2h0KCkpIHsKKwkJCXJldCA9IDA7CisJCQlzdGFjazsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFsdm1ldGFkX3B2c2Nhbl9zaW5nbGUoY21kLCBkZXYsIE5VTEwsIE5VTEwpKSB7CisJCQlyZXQgPSAwOworCQkJc3RhY2s7CisJCQlicmVhazsKKwkJfQorCX0KKworCWluaXRfc2lsZW50KHdhc19zaWxlbnQpOworCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKworCV9sdm1ldGFkX3Rva2VuID0gZnV0dXJlX3Rva2VuOworCisJLyoKKwkgKiBJZiB3ZSBmYWlsZWQgdG8gZnVsbHkgYW5kIHN1Y2Nlc3NmdWxseSBwb3B1bGF0ZSBsdm1ldGFkIGp1c3QgbGVhdmUKKwkgKiB0aGUgZXhpc3RpbmcgInVwZGF0ZSBpbiBwcm9ncmVzcyIgdG9rZW4gaW4gcGxhY2Ugc28gbHZtZXRhZCB3aWxsCisJICogdGltZSBvdXQgb3VyIHVwZGF0ZSBhbmQgZm9yY2UgYW5vdGhlciBjb21tYW5kIHRvIGRvIGl0LgorCSAqIChXZSBjb3VsZCB0cnkgdG8gc2V0IHRoZSB0b2tlbiB0byBlbXB0eSBoZXJlLCBidXQgdGhhdCBkb2Vzbid0CisJICogaGVscCBtdWNoLikKKwkgKi8KKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV90b2tlbl91cGRhdGUoTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGx2bWV0YWQgdG9rZW4gYWZ0ZXIgZGV2aWNlIHNjYW4uIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgbHZtZXRhZCBpcyBkaXNhYmxlZCwgYW5kIG5vIGx2bTEgbWV0YWRhdGEgd2FzIHNlZW4gYW5kIG5vCisJICogZHVwbGljYXRlIFBWcyB3ZXJlIHNlZW4sIHRoZW4gcmUtZW5hYmxlIGx2bWV0YWQuCisJICovCisJaWYgKGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSAmJgorCSAgICAhbHZtY2FjaGVfZm91bmRfZHVwbGljYXRlX3B2cygpICYmICFfZm91bmRfbHZtMV9tZXRhZGF0YSkgeworCQlsb2dfZGVidWdfbHZtZXRhZCgiRW5hYmxpbmcgbHZtZXRhZCB3aGljaCB3YXMgcHJldmlvdXNseSBkaXNhYmxlZC4iKTsKKwkJbHZtZXRhZF9jbGVhcl9kaXNhYmxlZChjbWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBsdm1ldGFkX3ZnX2NsZWFyX291dGRhdGVkX3B2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwljaGFyIHV1aWRbNjRdOworCWRhZW1vbl9yZXBseSByZXBseTsKKwlpbnQgcmVzdWx0OworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnZnLT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWdfbHZtZXRhZCgiU2VuZGluZyBsdm1ldGFkIHZnX2NsZWFyX291dGRhdGVkX3B2cyIpOworCXJlcGx5ID0gX2x2bWV0YWRfc2VuZCh2Zy0+Y21kLCAidmdfY2xlYXJfb3V0ZGF0ZWRfcHZzIiwgInZnaWQgPSAlcyIsIHV1aWQsIE5VTEwpOworCXJlc3VsdCA9IF9sdm1ldGFkX2hhbmRsZV9yZXBseShyZXBseSwgInZnX2NsZWFyX291dGRhdGVkX3B2cyIsIHZnLT5uYW1lLCBOVUxMKTsKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUmVjb3JkcyB0aGUgc3RhdGUgb2YgY2FjaGVkIFBWcyBpbiBsdm1ldGFkIHNvIHdlIGNhbiBsb29rIGZvciBjaGFuZ2VzCisgKiBhZnRlciByZXNjYW5uaW5nLgorICovCitzdHJ1Y3QgcHZfY2FjaGVfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlkZXZfdCBkZXZ0OworCXN0cnVjdCBpZCBwdmlkOworCWNvbnN0IGNoYXIgKnZnaWQ7CisJdW5zaWduZWQgZm91bmQgOiAxOworCXVuc2lnbmVkIHVwZGF0ZV91ZGV2IDogMTsKK307CisKKy8qCisgKiBHZXQgdGhlIGxpc3Qgb2YgUFZzIGtub3duIHRvIGx2bWV0YWQuCisgKi8KK3N0YXRpYyBpbnQgX2x2bWV0YWRfZ2V0X3B2X2NhY2hlX2xpc3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpwdmNfbGlzdCkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwlzdHJ1Y3QgcHZfY2FjaGVfbGlzdCAqcHZjbDsKKwljb25zdCBjaGFyICpwdmlkX3R4dDsKKwljb25zdCBjaGFyICp2Z2lkOworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkKKwkJcmV0dXJuIDE7CisKKwlsb2dfZGVidWdfbHZtZXRhZCgiQXNraW5nIGx2bWV0YWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2Yga25vd24gUFZzIik7CisKKwlyZXBseSA9IF9sdm1ldGFkX3NlbmQoY21kLCAicHZfbGlzdCIsIE5VTEwpOworCWlmICghX2x2bWV0YWRfaGFuZGxlX3JlcGx5KHJlcGx5LCAicHZfbGlzdCIsICIiLCBOVUxMKSkgeworCQlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJCXJldHVybl8wOworCX0KKworCWlmICgoY24gPSBkbV9jb25maWdfZmluZF9ub2RlKHJlcGx5LmNmdC0+cm9vdCwgInBoeXNpY2FsX3ZvbHVtZXMiKSkpIHsKKwkJZm9yIChjbiA9IGNuLT5jaGlsZDsgY247IGNuID0gY24tPnNpYikgeworCQkJaWYgKCEocHZjbCA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnB2Y2wpKSkpIHsKKwkJCQlsb2dfZXJyb3IoInB2X2NhY2hlX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXB2aWRfdHh0ID0gY24tPmtleTsKKwkJCWlmICghaWRfcmVhZF9mb3JtYXQoJnB2Y2wtPnB2aWQsIHB2aWRfdHh0KSkgeworCQkJCXN0YWNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwdmNsLT5kZXZ0ID0gZG1fY29uZmlnX2ZpbmRfaW50KGNuLT5jaGlsZCwgImRldmljZSIsIDApOworCisJCQlpZiAoKHZnaWQgPSBkbV9jb25maWdfZmluZF9zdHIoY24tPmNoaWxkLCAidmdpZCIsIE5VTEwpKSkKKwkJCQlwdmNsLT52Z2lkID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnaWQpOworCisJCQlkbV9saXN0X2FkZChwdmNfbGlzdCwgJnB2Y2wtPmxpc3QpOworCQl9CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBPcGVuaW5nIHRoZSBkZXZpY2UgUkRXUiBzaG91bGQgdHJpZ2dlciBhIHVkZXYgZGIgdXBkYXRlLgorICogRklYTUU6IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byB1cGRhdGUgdGhlIHVkZXYgZGIgdGhhbgorICogZG9pbmcgYW4gb3Blbi9jbG9zZSBvZiB0aGUgZGV2aWNlPyAtIEZvciBleGFtcGxlIHdyaXRpbmcKKyAqICJjaGFuZ2UiIHRvIC9zeXMvYmxvY2svPGRldmljZT4vdWV2ZW50PworICovCitzdGF0aWMgdm9pZCBfdXBkYXRlX3B2X2luX3VkZXYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGRldl90IGRldnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJbG9nX2RlYnVnX2RldnMoImRldmljZSAlZDolZCBvcGVuIHRvIHVwZGF0ZSB1ZGV2IiwKKwkJICAgICAgIChpbnQpTUFKT1IoZGV2dCksIChpbnQpTUlOT1IoZGV2dCkpOworCisJaWYgKCEoZGV2ID0gZGV2X2NhY2hlX2dldF9ieV9kZXZ0KGRldnQsIGNtZC0+bHZtZXRhZF9maWx0ZXIpKSkgeworCQlsb2dfZXJyb3IoIl91cGRhdGVfcHZfaW5fdWRldiBubyBkZXYgZm91bmQiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZGV2X29wZW4oZGV2KSkgeworCQlzdGFjazsKKwkJcmV0dXJuOworCX0KKworCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworfQorCisvKgorICogQ29tcGFyZSBiZWZvcmUgYW5kIGFmdGVyIFBWIGxpc3RzIGZyb20gYmVmb3JlL2FmdGVyIHJlc2Nhbm5pbmcsCisgKiBhbmQgdXBkYXRlIHVkZXYgZGIgZm9yIGNoYW5nZXMuCisgKgorICogRm9yIFBWcyB0aGF0IGhhdmUgY2hhbmdlZCBwdmlkIG9yIHZnaWQgaW4gbHZtZXRhZCBmcm9tIHJlc2Nhbm5pbmcsCisgKiB0aGVyZSBtYXkgYmUgaW5mb3JtYXRpb24gaW4gdGhlIHVkZXYgZGF0YWJhc2UgdG8gdXBkYXRlLCBzbyBvcGVuCisgKiB0aGVzZSBkZXZpY2VzIHRvIHRyaWdnZXIgYSB1ZGV2IHVwZGF0ZS4KKyAqCisgKiAiYmVmb3JlIiByZWZlcnMgdG8gdGhlIGxpc3Qgb2YgcHZzIGZyb20gbHZtZXRhZCBiZWZvcmUgcmVzY2FubmluZworICogImFmdGVyIiByZWZlcnMgdG8gdGhlIGxpc3Qgb2YgcHZzIGZyb20gbHZtZXRhZCBhZnRlciByZXNjYW5uaW5nCisgKgorICogQ29tcGFyaW5nIGJvdGggbGlzdHMsIHdlIGNhbiBzZWUgd2hpY2ggUFZzIGNoYW5nZWQgKHB2aWQgb3IgdmdpZCksCisgKiBhbmQgdHJpZ2dlciBhIHVkZXYgZGIgdXBkYXRlIGZvciB0aG9zZS4KKyAqLworc3RhdGljIHZvaWQgX3VwZGF0ZV9jaGFuZ2VkX3B2c19pbl91ZGV2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQlzdHJ1Y3QgZG1fbGlzdCAqcHZjX2JlZm9yZSwKKwkJCQkJc3RydWN0IGRtX2xpc3QgKnB2Y19hZnRlcikKK3sKKwlzdHJ1Y3QgcHZfY2FjaGVfbGlzdCAqYmVmb3JlOworCXN0cnVjdCBwdl9jYWNoZV9saXN0ICphZnRlcjsKKwljaGFyIGlkX2JlZm9yZVtJRF9MRU4gKyAxXTsKKwljaGFyIGlkX2FmdGVyW0lEX0xFTiArIDFdOworCWludCBmb3VuZDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhiZWZvcmUsIHB2Y19iZWZvcmUpIHsKKwkJZm91bmQgPSAwOworCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhhZnRlciwgcHZjX2FmdGVyKSB7CisJCQlpZiAoYWZ0ZXItPmZvdW5kKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoYmVmb3JlLT5kZXZ0ICE9IGFmdGVyLT5kZXZ0KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWlkX2VxdWFsKCZiZWZvcmUtPnB2aWQsICZhZnRlci0+cHZpZCkpIHsKKwkJCQkodm9pZCkgZG1fc3RybmNweShpZF9iZWZvcmUsIChjaGFyICopICZiZWZvcmUtPnB2aWQsIHNpemVvZihpZF9iZWZvcmUpKTsKKwkJCQkodm9pZCkgZG1fc3RybmNweShpZF9hZnRlciwgKGNoYXIgKikgJmFmdGVyLT5wdmlkLCBzaXplb2YoaWRfYWZ0ZXIpKTsKKworCQkJCWxvZ19kZWJ1Z19kZXZzKCJkZXZpY2UgJWQ6JWQgY2hhbmdlZCBwdmlkIGZyb20gJXMgdG8gJXMiLAorCQkJCQkgICAgICAgKGludClNQUpPUihiZWZvcmUtPmRldnQpLCAoaW50KU1JTk9SKGJlZm9yZS0+ZGV2dCksCisJCQkJCSAgICAgICBpZF9iZWZvcmUsIGlkX2FmdGVyKTsKKworCQkJCWJlZm9yZS0+dXBkYXRlX3VkZXYgPSAxOworCisJCQl9IGVsc2UgaWYgKChiZWZvcmUtPnZnaWQgJiYgIWFmdGVyLT52Z2lkKSB8fAorCQkJCSAgIChhZnRlci0+dmdpZCAmJiAhYmVmb3JlLT52Z2lkKSB8fAorCQkJCSAgIChiZWZvcmUtPnZnaWQgJiYgYWZ0ZXItPnZnaWQgJiYgc3RyY21wKGJlZm9yZS0+dmdpZCwgYWZ0ZXItPnZnaWQpKSkgeworCisJCQkJbG9nX2RlYnVnX2RldnMoImRldmljZSAlZDolZCBjaGFuZ2VkIHZnIGZyb20gJXMgdG8gJXMiLAorCQkJCQkgICAgICAgKGludClNQUpPUihiZWZvcmUtPmRldnQpLCAoaW50KU1JTk9SKGJlZm9yZS0+ZGV2dCksCisJCQkJCSAgICAgICBiZWZvcmUtPnZnaWQgPzogIm5vbmUiLCBhZnRlci0+dmdpZCA/OiAibm9uZSIpOworCisJCQkJYmVmb3JlLT51cGRhdGVfdWRldiA9IDE7CisJCQl9CisKKwkJCWFmdGVyLT5mb3VuZCA9IDE7CisJCQliZWZvcmUtPmZvdW5kID0gMTsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJKHZvaWQpIGRtX3N0cm5jcHkoaWRfYmVmb3JlLCAoY2hhciAqKSAmYmVmb3JlLT5wdmlkLCBzaXplb2YoaWRfYmVmb3JlKSk7CisKKwkJCWxvZ19kZWJ1Z19kZXZzKCJkZXZpY2UgJWQ6JWQgcHZpZCAlcyB2ZyAlcyBpcyBnb25lIiwKKwkJCQkgICAgICAgKGludClNQUpPUihiZWZvcmUtPmRldnQpLCAoaW50KU1JTk9SKGJlZm9yZS0+ZGV2dCksCisJCQkJICAgICAgIGlkX2JlZm9yZSwgYmVmb3JlLT52Z2lkID8gYmVmb3JlLT52Z2lkIDogIm5vbmUiKTsKKworCQkJYmVmb3JlLT51cGRhdGVfdWRldiA9IDE7CisJCX0KKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoYmVmb3JlLCBwdmNfYmVmb3JlKSB7CisJCWlmIChiZWZvcmUtPnVwZGF0ZV91ZGV2KQorCQkJX3VwZGF0ZV9wdl9pbl91ZGV2KGNtZCwgYmVmb3JlLT5kZXZ0KTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoYWZ0ZXIsIHB2Y19hZnRlcikgeworCQlpZiAoYWZ0ZXItPnVwZGF0ZV91ZGV2KQorCQkJX3VwZGF0ZV9wdl9pbl91ZGV2KGNtZCwgYWZ0ZXItPmRldnQpOworCX0KK30KKworLyoKKyAqIEJlZm9yZSB0aGlzIGNvbW1hbmQgd2FzIHJ1biwgc29tZSBleHRlcm5hbCBlbnRpdHkgbWF5IGhhdmUKKyAqIGludmFsaWRhdGVkIGx2bWV0YWQncyBjYWNoZSBvZiBnbG9iYWwgaW5mb3JtYXRpb24sIGUuZy4gbHZtbG9ja2QuCisgKgorICogVGhlIGdsb2JhbCBpbmZvcm1hdGlvbiBpbmNsdWRlcyB0aGluZ3MgbGlrZSBhIG5ldyBWRywgYQorICogVkcgdGhhdCB3YXMgcmVtb3ZlZCwgdGhlIGFzc2lnbm1lbnQgb2YgYSBQViB0byBhIFZHOworICogYW55IGNoYW5nZSB0aGF0IGlzIG5vdCBpc29sYXRlZCB3aXRoaW4gYSBzaW5nbGUgVkcuCisgKgorICogVGhlIGV4dGVybmFsIGVudGl0eSwgbGlrZSBhIGxvY2sgbWFuYWdlciwgd291bGQgaW52YWxpZGF0ZQorICogdGhlIGx2bWV0YWQgZ2xvYmFsIGNhY2hlIGlmIGl0IGRldGVjdGVkIHRoYXQgdGhlIGdsb2JhbAorICogaW5mb3JtYXRpb24gaGFkIGJlZW4gY2hhbmdlZCBvbiBkaXNrIGJ5IHNvbWV0aGluZyBvdGhlcgorICogdGhhbiBhIGxvY2FsIGx2bSBjb21tYW5kLCBlLmcuIGFuIGx2bSBjb21tYW5kIG9uIGFub3RoZXIKKyAqIGhvc3Qgd2l0aCBhY2Nlc3MgdG8gdGhlIHNhbWUgZGV2aWNlcy4gIChIb3cgaXQgZGV0ZWN0cworICogdGhlIGNoYW5nZSBpcyBzcGVjaWZpYyB0byBsb2NrIG1hbmFnZXIgb3Igb3RoZXIgZW50aXR5LikKKyAqCisgKiBUaGUgZWZmZWN0IGlzIHRoYXQgbWV0YWRhdGEgb24gZGlzayBpcyBuZXdlciB0aGFuIHRoZSBtZXRhZGF0YQorICogaW4gdGhlIGxvY2FsIGx2bWV0YWQgZGFlbW9uLCBhbmQgdGhlIGxvY2FsIGx2bWV0YWQncyBjYWNoZQorICogc2hvdWxkIGJlIHVwZGF0ZWQgZnJvbSBkaXNrIGJlZm9yZSB0aGlzIGNvbW1hbmQgdXNlcyBpdC4KKyAqCisgKiBTbywgdXNpbmcgdGhpcyBmdW5jdGlvbiwgYSBjb21tYW5kIGNoZWNrcyBpZiBsdm1ldGFkJ3MgZ2xvYmFsCisgKiBjYWNoZSBpcyB2YWxpZC4gIElmIHNvLCBpdCBkb2VzIG5vdGhpbmcuICBJZiBub3QsIGl0IHJlc2NhbnMKKyAqIGRldmljZXMgdG8gdXBkYXRlIHRoZSBsdm1ldGFkIGNhY2hlLCB0aGVuIGl0IG5vdGlmaWVzIGx2bWV0YWQKKyAqIHRoYXQgaXQncyBjYWNoZSBpcyB2YWxpZCBhZ2FpbiAoY29uc2lzdGVudCB3aXRoIHdoYXQncyBvbiBkaXNrLikKKyAqIFRoaXMgY29tbWFuZCBjYW4gdGhlbiBnbyBhaGVhZCBhbmQgdXNlIHRoZSBuZXdseSByZWZyZXNoZWQgbWV0YWRhdGEuCisgKgorICogMS4gQ2hlY2sgaWYgdGhlIGx2bWV0YWQgZ2xvYmFsIGNhY2hlIGlzIGludmFsaWQuCisgKiAyLiBJZiBzbywgcmVyZWFkIG1ldGFkYXRhIGZyb20gYWxsIGRldmljZXMgYW5kIHVwZGF0ZSB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqIDMuIFRlbGwgbHZtZXRhZCB0aGF0IHRoZSBnbG9iYWwgY2FjaGUgaXMgbm93IHZhbGlkLgorICovCisKK3ZvaWQgbHZtZXRhZF92YWxpZGF0ZV9nbG9iYWxfY2FjaGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCBwdmNfYmVmb3JlOyAvKiBwdl9jYWNoZV9saXN0ICovCisJc3RydWN0IGRtX2xpc3QgcHZjX2FmdGVyOyAvKiBwdl9jYWNoZV9saXN0ICovCisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IGdsb2JhbF9pbnZhbGlkOworCisJZG1fbGlzdF9pbml0KCZwdmNfYmVmb3JlKTsKKwlkbV9saXN0X2luaXQoJnB2Y19hZnRlcik7CisKKwlpZiAoIWx2bWxvY2tkX3VzZSgpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAidmFsaWRhdGUgZ2xvYmFsIGNhY2hlIHdpdGhvdXQgbHZtbG9ja2QiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbHZtZXRhZF91c2VkKCkpCisJCXJldHVybjsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJWYWxpZGF0aW5nIGdsb2JhbCBsdm1ldGFkIGNhY2hlIik7CisKKwlpZiAoZm9yY2UpCisJCWdvdG8gZG9fc2NhbjsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJsdm1ldGFkIHZhbGlkYXRlIHNlbmQgZ2V0X2dsb2JhbF9pbmZvIik7CisKKwlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShfbHZtZXRhZCwgImdldF9nbG9iYWxfaW5mbyIsCisJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJICAgInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClnZXRwaWQoKSwKKwkJCQkgICAiY21kID0gJXMiLCBnZXRfY21kX25hbWUoKSwKKwkJCQkgICBOVUxMKTsKKworCWlmIChyZXBseS5lcnJvcikgeworCQlsb2dfZXJyb3IoImx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlIGdldF9nbG9iYWxfaW5mbyBlcnJvciAlZCIsIHJlcGx5LmVycm9yKTsKKwkJZ290byBkb19zY2FuOworCX0KKworCWlmIChzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkgeworCQlsb2dfZXJyb3IoImx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlIGdldF9nbG9iYWxfaW5mbyBub3Qgb2siKTsKKwkJZ290byBkb19zY2FuOworCX0KKworCWdsb2JhbF9pbnZhbGlkID0gZGFlbW9uX3JlcGx5X2ludChyZXBseSwgImdsb2JhbF9pbnZhbGlkIiwgLTEpOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJaWYgKCFnbG9iYWxfaW52YWxpZCkKKwkJcmV0dXJuOyAvKiBjYWNoZSBpcyB2YWxpZCAqLworCisgZG9fc2NhbjoKKwkvKgorCSAqIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgcHZzIGZyb20gbHZtZXRhZCBzbyBhZnRlciBkZXZpY2VzIGFyZQorCSAqIHNjYW5uZWQsIHdlIGNhbiBjb21wYXJlIHRvIHRoZSBuZXcgc3RhdGUgdG8gc2VlIGlmIHB2cyBjaGFuZ2VkLgorCSAqLworCV9sdm1ldGFkX2dldF9wdl9jYWNoZV9saXN0KGNtZCwgJnB2Y19iZWZvcmUpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIGxvY2FsIGx2bWV0YWQgY2FjaGUgc28gaXQgY29ycmVjdGx5IHJlZmxlY3RzIGFueQorCSAqIGNoYW5nZXMgbWFkZSBvbiByZW1vdGUgaG9zdHMuICAoSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgY29tbWFuZAorCSAqIGFscmVhZHkgcmVmcmVzaGVkIHRoZSBsb2NhbCBsdm1ldGFkIGJlY2F1c2Ugb2YgYSB0b2tlbiBjaGFuZ2UsCisJICogYnV0IHdlIG5lZWQgdG8gZG8gaXQgYWdhaW4gaGVyZSBzaW5jZSB3ZSBub3cgaG9sZCB0aGUgZ2xvYmFsCisJICogbG9jay4gIEFub3RoZXIgaG9zdCBtYXkgaGF2ZSBjaGFuZ2VkIHRoaW5ncyBiZXR3ZWVuIHRoZSB0aW1lCisJICogd2UgcmVzY2FubmVkIGZvciB0aGUgdG9rZW4sIGFuZCB0aGUgdGltZSB3ZSBhY3F1aXJlZCB0aGUgZ2xvYmFsCisJICogbG9jay4pCisJICovCisJaWYgKCFsdm1ldGFkX3B2c2Nhbl9hbGxfZGV2cyhjbWQsIDEpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNhY2hlIHVwZGF0ZSBmYWlsZWQuIik7CisJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsdm1ldGFkX2lzX2Rpc2FibGVkKGNtZCwgJnJlYXNvbikpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgJXMuIiwgcmVhc29uKTsKKwkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDbGVhciB0aGUgZ2xvYmFsX2ludmFsaWQgZmxhZyBpbiBsdm1ldGFkLgorCSAqIFN1YnNlcXVlbnQgbG9jYWwgY29tbWFuZHMgdGhhdCByZWFkIGdsb2JhbCBzdGF0ZQorCSAqIGZyb20gbHZtZXRhZCB3aWxsIG5vdCBzZWUgZ2xvYmFsX2ludmFsaWQgdW50aWwKKwkgKiBhbm90aGVyIGhvc3QgbWFrZXMgYW5vdGhlciBnbG9iYWwgY2hhbmdlLgorCSAqLworCWxvZ19kZWJ1Z19sdm1ldGFkKCJsdm1ldGFkIHZhbGlkYXRlIHNlbmQgc2V0X2dsb2JhbF9pbmZvIik7CisKKwlyZXBseSA9IGRhZW1vbl9zZW5kX3NpbXBsZShfbHZtZXRhZCwgInNldF9nbG9iYWxfaW5mbyIsCisJCQkJICAgInRva2VuID0gJXMiLCAic2tpcCIsCisJCQkJICAgImdsb2JhbF9pbnZhbGlkID0gIiBGTVRkNjQsIElOVDY0X0MoMCksCisJCQkJICAgInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdClnZXRwaWQoKSwKKwkJCQkgICAiY21kID0gJXMiLCBnZXRfY21kX25hbWUoKSwKKwkJCQkgICBOVUxMKTsKKwlpZiAocmVwbHkuZXJyb3IpCisJCWxvZ19lcnJvcigibHZtZXRhZF92YWxpZGF0ZV9nbG9iYWxfY2FjaGUgc2V0X2dsb2JhbF9pbmZvIGVycm9yICVkIiwgcmVwbHkuZXJyb3IpOworCisJaWYgKHN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJPSyIpKQorCQlsb2dfZXJyb3IoImx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlIHNldF9nbG9iYWxfaW5mbyBub3Qgb2siKTsKKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCS8qCisJICogUG9wdWxhdGUgdGhpcyBjb21tYW5kJ3MgbHZtY2FjaGUgc3RydWN0dXJlcyBmcm9tIGx2bWV0YWQuCisJICovCisJbHZtY2FjaGVfc2VlZF9pbmZvc19mcm9tX2x2bWV0YWQoY21kKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBsb2NhbCB1ZGV2IGRhdGFiYXNlIHRvIHJlZmxlY3QgUFYgY2hhbmdlcyBmcm9tCisJICogb3RoZXIgaG9zdHMuCisJICoKKwkgKiBDb21wYXJlIHRoZSBiZWZvcmUgYW5kIGFmdGVyIFBWIGxpc3RzLCBhbmQgaWYgYSBQVidzCisJICogcHZpZCBvciB2Z2lkIGhhcyBjaGFuZ2VkLCB0aGVuIG9wZW4gdGhhdCBkZXZpY2UgdG8gdHJpZ2dlcgorCSAqIGEgdWV2ZW50IHRvIHVwZGF0ZSB0aGUgdWRldiBkYi4KKwkgKgorCSAqIFRoaXMgaGFzIG5vIGRpcmVjdCBiZW5lZml0IHRvIGx2bSwgYnV0IGlzIGp1c3QgYSBiZXN0IGVmZm9ydAorCSAqIGF0dGVtcHQgdG8ga2VlcCB0aGUgdWRldiBkYiB1cGRhdGVkIGFuZCByZWZsZWN0aW5nIGN1cnJlbnQKKwkgKiBsdm0gaW5mb3JtYXRpb24uCisJICoKKwkgKiBGSVhNRTogbHZtY2FjaGVfc2VlZF9pbmZvc19mcm9tX2x2bWV0YWQoKSBhbmQgX2x2bWV0YWRfZ2V0X3B2X2NhY2hlX2xpc3QoKQorCSAqIGVhY2ggZ2V0IHB2X2xpc3QgZnJvbSBsdm1ldGFkLCBhbmQgdGhleSBjb3VsZCBzaGFyZSBhIHNpbmdsZSBwdl9saXN0IHJlcGx5LgorCSAqLworCWlmICghZG1fbGlzdF9lbXB0eSgmcHZjX2JlZm9yZSkpIHsKKwkJX2x2bWV0YWRfZ2V0X3B2X2NhY2hlX2xpc3QoY21kLCAmcHZjX2FmdGVyKTsKKwkJX3VwZGF0ZV9jaGFuZ2VkX3B2c19pbl91ZGV2KGNtZCwgJnB2Y19iZWZvcmUsICZwdmNfYWZ0ZXIpOworCX0KKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJWYWxpZGF0aW5nIGdsb2JhbCBsdm1ldGFkIGNhY2hlIGZpbmlzaGVkIik7Cit9CisKK2ludCBsdm1ldGFkX3ZnX2lzX2ZvcmVpZ24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICp0b3A7CisJY29uc3QgY2hhciAqc3lzdGVtX2lkID0gTlVMTDsKKwljaGFyIHV1aWRbNjRdOworCWludCByZXQ7CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkKil2Z2lkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJTZW5kaW5nIGx2bWV0YWQgdmdfY2xlYXJfb3V0ZGF0ZWRfcHZzIik7CisJcmVwbHkgPSBfbHZtZXRhZF9zZW5kKGNtZCwgInZnX2xvb2t1cCIsCisJCQkgICAgICAidXVpZCA9ICVzIiwgdXVpZCwKKwkJCSAgICAgICJuYW1lID0gJXMiLCB2Z25hbWUsCisJCQkgICAgICAgTlVMTCk7CisKKwlpZiAoKHRvcCA9IGRtX2NvbmZpZ19maW5kX25vZGUocmVwbHkuY2Z0LT5yb290LCAibWV0YWRhdGEiKSkpCisJCXN5c3RlbV9pZCA9IGRtX2NvbmZpZ19maW5kX3N0cih0b3AsICJtZXRhZGF0YS9zeXN0ZW1faWQiLCBOVUxMKTsKKworCXJldCA9ICFpc19zeXN0ZW1faWRfYWxsb3dlZChjbWQsIHN5c3RlbV9pZCk7CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbHZtZXRhZCBoYXMgYSBkaXNhYmxlZCBzdGF0ZSBpbiB3aGljaCBpdCBjb250aW51ZXMgcnVubmluZywKKyAqIGFuZCByZXR1cm5zIHRoZSAiZGlzYWJsZWQiIGZsYWcgaW4gYSBnZXRfZ2xvYmFsX2luZm8gcXVlcnkuCisgKgorICogQ2FzZSAxCisgKiAtLS0tLS0KKyAqIFdoZW4gIm5vcm1hbCIgY29tbWFuZHMgc3RhcnQsICh0aG9zZSBub3Qgc3BlY2lmaWNhbGx5CisgKiBpbnRlbmRlZCB0byByZXNjYW4gZGV2cykgdGhleSBiZWdpbiBieSBjaGVja2luZyBsdm1ldGFkJ3MKKyAqIHRva2VuIGFuZCBnbG9iYWwgaW5mbzoKKyAqCisgKiAtIElmIHRoZSB0b2tlbiBkb2Vzbid0IG1hdGNoIChzaG91bGQgYmUgdW5jb21tb24pLCB0aGUKKyAqIGNvbW1hbmQgZmlyc3QgcmVzY2FucyBkZXZpY2VzIHRvIHJlcG9wdWxhdGUgbHZtZXRhZCB3aXRoCisgKiB0aGUgZ2xvYmFsX2ZpbHRlciBpdCBpcyB1c2luZy4gIEFmdGVyIHJlc2Nhbm5pbmcsIHRoZQorICogbHZtZXRhZCBkaXNhYmxlZCBzdGF0ZSBpcyBzZXQgb3IgY2xlYXJlZCBkZXBlbmRpbmcgb24KKyAqIHdoYXQgdGhlIHNjYW4gc2F3LgorICoKKyAqICAgICBBbiB1bm1hdGNoaW5nIHRva2VuIG9jY3VycyB3aGVuOgorICogICAgIC4gbHZtZXRhZCB3YXMganVzdCBzdGFydGVkIGFuZCBoYXMgbm90IGJlZW4gcG9wdWxhdGVkIHlldC4KKyAqICAgICAuIFRoZSBnbG9iYWxfZmlsdGVyIGhhcyBiZWVuIGNoYW5nZWQgaW4gbHZtLmNvbmYgc2luY2UgdGhlCisgKiAgICAgICBsYXN0IGNvbW1hbmQgd2FzIHJ1bi4KKyAqICAgICAuIFRoZSBnbG9iYWxfZmlsdGVyIGlzIG92ZXJyaWRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICogICAgICAgKFRoZXJlJ3MgbGl0dGxlIHBvaW50IGluIHVzaW5nIGx2bWV0YWQgaWYgZ2xvYmFsX2ZpbHRlcgorICogICAgICAgaXMgb2Z0ZW4gY2hhbmdlZC9vdmVycmlkZGVuLikKKyAqCisgKiAtIElmIHRoZSB0b2tlbiBkb2VzIG1hdGNoIChjb21tb24gY2FzZSksIHRoZSBjb21tYW5kIGFuZAorICogbHZtZXRhZCBhcmUgdXNpbmcgdGhlIHNhbWUgZ2xvYmFsX2ZpbHRlciBhbmQgdGhlIGNvbW1hbmQKKyAqIGRvZXMgbm90IHJlc2NhbiBkZXZzIHRvIHJlcG9wdWxhdGUgbHZtZXRhZCwgb3IgY2hhbmdlIHRoZQorICogbHZtZXRhZCBkaXNhYmxlZCBzdGF0ZS4KKyAqCisgKiAtIEFmdGVyIHRoZSB0b2tlbiBjaGVjay9zeW5jLCB0aGUgY29tbWFuZCBjaGVja3MgaWYgdGhlCisgKiBkaXNhYmxlZCBmbGFnIGlzIHNldCBpbiBsdm1ldGFkLiAgSWYgaXQgaXMsIHRoZSBjb21tYW5kIHdpbGwKKyAqIG5vdCB1c2UgdGhlIGx2bWV0YWQgY2FjaGUgYW5kIHdpbGwgcmV2ZXJ0IHRvIHNjYW5uaW5nLCBpLmUuCisgKiBpdCBydW5zIHRoZSBzYW1lIGFzIGlmIHVzZV9sdm1ldGFkPTAuCisgKgorICogU28sICJub3JtYWwiIGNvbW1hbmRzIHRyeSB0byB1c2UgdGhlIGx2bWV0YWQgY2FjaGUgdG8gYXZvaWQKKyAqIHNjYW5uaW5nIGRldmljZXMuICBJbiB0aGUgdW5jb21tb24gY2FzZSB3aGVuIHRoZSB0b2tlbiBkb2Vzbid0CisgKiBtYXRjaCwgdGhlc2UgY29tbWFuZHMgd2lsbCBmaXJzdCByZXNjYW4gZGV2cyB0byByZXBvcHVsYXRlIHRoZQorICogbHZtZXRhZCBjYWNoZSwgYW5kIHRoZW4gYXR0ZW1wdCB0byB1c2UgdGhlIGx2bWV0YWQgY2FjaGUuCisgKiBJbiB0aGUgdW5jb21tb24gY2FzZSB3aGVyZSBsdm1ldGFkIGlzIGRpc2FibGVkIChieSBhIHByZXZpb3VzCisgKiBjb21tYW5kKSwgdGhlIGNvbW1vbiBjb21tYW5kcyBkbyBub3QgcmVzY2FuIGRldnMgdG8gcmVwb3B1bGF0ZQorICogbHZtZXRhZCwgYnV0IHJldmVydCB0aGUgZXF1aXZhbGVudCBvZiB1c2VfbHZtZXRhZD0wLCByZWFkaW5nCisgKiBmcm9tIGRpc2sgaW5zdGVhZCBvZiB0aGUgY2FjaGUuCisgKiBUaGUgY29tYmluYXRpb24gb2YgdGhvc2UgdHdvIHVuY29tbW9uIGNhc2VzIG1lYW5zIHRoYXQgYSBjb21tYW5kCisgKiBjb3VsZCBiZWdpbiBieSByZXNjYW5uaW5nIGRldnMgYmVjYXVzZSBvZiBhIHRva2VuIG1pc21hdGNoLCB0aGVuCisgKiBkaXNhYmxlIGx2bWV0YWQgYXMgYSByZXN1bHQgb2YgdGhhdCBzY2FuLCBhbmQgY29udGludWUgd2l0aG91dAorICogdXNpbmcgbHZtZXRhZC4KKyAqCisgKiBDYXNlIDIKKyAqIC0tLS0tLQorICogQ29tbWFuZHMgdGhhdCBhcmUgbWVhbnQgdG8gc2NhbiBkZXZpY2VzIHRvIHJlcG9wdWxhdGUgdGhlCisgKiBsdm1ldGFkIGNhY2hlLCBlLmcuIHB2c2NhbiAtLWNhY2hlLCB3aWxsIGFsd2F5cyByZXNjYW4KKyAqIGRldmljZXMgYW5kIHRoZW4gc2V0L2NsZWFyIHRoZSBkaXNhYmxlZCBzdGF0ZSBhY2NvcmRpbmcgdG8KKyAqIHdoYXQgdGhleSBmb3VuZCB3aGVuIHNjYW5uaW5nLiAgVGhlIGdsb2JhbF9maWx0ZXIgaXMgYWx3YXlzCisgKiB1c2VkIHdoZW4gY2hvb3Npbmcgd2hpY2ggZGV2aWNlcyB0byBzY2FuIHRvIHBvcHVsYXRlIGx2bWV0YWQuCisgKiBUaGUgY29tbWFuZC1zcGVjaWZpYyBmaWx0ZXIgaXMgbmV2ZXIgdXNlZCB3aGVuIGNob29zaW5nCisgKiB3aGljaCBkZXZpY2VzIHRvIHNjYW4gZm9yIHJlcG9wdWxhdGluZyB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqCisgKiBEdXJpbmcgYSBzY2FuIHJlcG9wdWxhdGluZyB0aGUgbHZtZXRhZCBjYWNoZSwgYSBjb21tYW5kIGxvb2tzCisgKiBmb3IgUFZzIHdpdGggbHZtMSBtZXRhZGF0YSwgb3IgZHVwbGljYXRlIFBWcyAodHdvIGRldmljZXMgd2l0aAorICogdGhlIHNhbWUgUFZJRCkuICBJZiBlaXRoZXIgb2YgdGhvc2UgYXJlIGZvdW5kIGR1cmluZyB0aGUgc2NhbiwKKyAqIHRoZSBjb21tYW5kIHNldHMgdGhlIGRpc2FibGVkIHN0YXRlIGluIGx2bWV0YWQuICBJZiBub25lIGFyZQorICogZm91bmQsIHRoZSBjb21tYW5kIGNsZWFycyB0aGUgZGlzYWJsZWQgc3RhdGUgaW4gbHZtZXRhZC4KKyAqIChPdGhlciBwcm9ibGVtcyBzY2FubmluZyBtYXkgYWxzbyBjYXVzZSB0aGUgY29tbWFuZCB0byBzZXQgdGhlCisgKiBkaXNhYmxlZCBzdGF0ZS4pCisgKgorICogQ2FzZSAzCisgKiAtLS0tLS0KKyAqIFRoZSBzcGVjaWFsIGNvbW1hbmQgJ3B2c2NhbiAtLWNhY2hlIDxkZXY+JyBpcyBtZWFudCB0byBvbmx5CisgKiBzY2FuIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGFuZCBzZW5kIGluZm8gZnJvbSB0aGUgZGV2IHRvCisgKiBsdm1ldGFkLiAgVGhpcyBzaW5nbGUtZGV2IHB2c2NhbiB3aWxsIG5vdCBkZXRlY3QgZHVwbGljYXRlIFBWcworICogc2luY2UgaXQgb25seSBzZWVzIHRoZSBvbmUgZGV2aWNlLiAgSWYgbHZtZXRhZCBhbHJlYWR5IGtub3dzCisgKiBhYm91dCB0aGUgc2FtZSBQViBvbiBhbm90aGVyIGRldmljZSwgdGhlbiBsdm1ldGFkIHdpbGwgYmUgdGhlCisgKiBmaXJzdCB0byBkaXNjb3ZlciB0aGF0IGEgZHVwbGljYXRlIFBWIGV4aXN0cy4gIEluIHRoaXMgY2FzZSwKKyAqIGx2bWV0YWQgc2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgZm9yIGl0c2VsZi4KKyAqCisgKiBEdXBsaWNhdGVzCisgKiAtLS0tLS0tLS0tCisgKiBUaGUgbW9zdCBjb21tb24gcmVhc29ucyBmb3IgZHVwbGljYXRlIFBWcyB0byBleGlzdCBhcmU6CisgKgorICogMS4gTXVsdGlwYXRoLiAgV2hlbiBtdWx0aXBhdGggaXMgcnVubmluZywgaXQgY3JlYXRlcyBhIG5ldworICogbXBhdGggZGV2aWNlIGZvciB0aGUgdW5kZXJseWluZyAiZHVwbGljYXRlIiBkZXZzLiAgbHZtIGhhcworICogYnVpbHQgaW4sIGF1dG9tYXRpYyBmaWx0ZXJpbmcgdGhhdCB3aWxsIGhpZGUgdGhlIGR1cGxpY2F0ZQorICogZGV2cyBvZiB0aGUgdW5kZXJseWluZyBtcGF0aCBkZXYsIHNvIHRoZSBkdXBsaWNhdGVzIHdpbGwKKyAqIGJlIHNraXBwaW5nIGR1cmluZyBzY2FubmluZyAobXVsdGlwYXRoX2NvbXBvbmVudF9kZXRlY3Rpb24pLgorICoKKyAqIElmIG11bHRpcGF0aF9jb21wb25lbnRfZGV0ZWN0aW9uPTAsIG9yIGlmIG11bHRpcGF0aGQgaXMgbm90CisgKiBydW5uaW5nLCBvciBtdWx0aXBhdGggaXMgbm90IHNldCB1cCB0byBoYW5kbGUgYSBwYXJ0aWN1bGFyCisgKiBzZXQgb2YgZGV2cywgdGhlbiBsdm0gd2lsbCBzZWUgdGhlIG11bHRpcGF0aCBwYXRocyBhcworICogZHVwbGljYXRlcy4gIGx2bSB3aWxsIGNob29zZSBvbmUgb2YgdGhlbSB0byB1c2UsIGNvbnNpZGVyCisgKiB0aGUgb3RoZXIgYSBkdXBsaWNhdGUsIGFuZCBkaXNhYmxlIGx2bWV0YWQuICBtdWx0aXBhdGhkCisgKiBzaG91bGQgYmUgY29uZmlndXJlZCBhbmQgcnVubmluZyB0byByZXNvbHZlIHRoZXNlIGR1cGxpY2F0ZXMsCisgKiBhbmQgbXVsdGlwYXRoX2NvbXBvbmVudF9kZXRlY3Rpb24gZW5hYmxlZC4KKyAqCisgKiAyLiBDbG9uaW5nIGJ5IGNvcHlpbmcuICBPbmUgZGV2aWNlIGlzIGNvcGllZCBvdmVyIGFub3RoZXIsIGUuZy4KKyAqIHdpdGggZGQuICBUaGlzIGlzIGEgbW9yZSBjb25jZXJuaW5nIGNhc2UgYmVjYXVzZSB1c2luZyB0aGUKKyAqIHdyb25nIGRldmljZSBjb3VsZCBsZWFkIHRvIGNvcnJ1cHRpb24uICBMVk0gd2lsbCBhdHRlbXB0IHRvCisgKiBjaG9vc2UgdGhlIGJlc3QgZGV2aWNlIGFzIHRoZSBQViwgYnV0IGl0IG1heSBub3QgYWx3YXlzCisgKiBiZSB0aGUgcmlnaHQgb25lLiAgSW4gdGhpcyBjYXNlLCBsdm1ldGFkIGlzIGRpc2FibGVkLgorICogdmdpbXBvcnRjbG9uZSBzaG91bGQgYmUgdXNlZCBvbiB0aGUgbmV3IGNvcHkgdG8gcmVzb2x2ZSB0aGUKKyAqIGR1cGxpY2F0ZXMuCisgKgorICogMy4gQ2xvbmluZyBieSBoYXJkd2FyZS4gIEEgTFVOIGlzIGNsb25lZC9zbmFwc2hvdHRlZCBvbgorICogYSBoYXJkd2FyZSBkZXZpY2UuICBUaGUgZGVzY3JpcHRpb24gaGVyZSBpcyB0aGUgc2FtZSBhcworICogY2xvbmluZyBieSBjb3B5aW5nLgorICoKKyAqIDQuIENyZWF0aW5nIExWTSBzbmFwc2hvdHMgb2YgTFZzIGJlaW5nIHVzZWQgYXMgUFZzLgorICogSWYgcHZjcmVhdGUgaXMgcnVuIG9uIGFuIExWLCBhbmQgbHZjcmVhdGUgaXMgdXNlZCB0bworICogY3JlYXRlIGEgc25hcHNob3Qgb2YgdGhhdCBMViwgdGhlbiB0aGUgdHdvIExWcyB3aWxsCisgKiBhcHBlYXIgdG8gYmUgZHVwbGljYXRlIFBWcy4KKyAqCisgKiBGaWx0ZXJpbmcgZHVwbGljYXRlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogSWYgYWxsIGJ1dCBvbmUgY29weSBvZiBhIFBWIGlzIGFkZGVkIHRvIHRoZSBnbG9iYWxfZmlsdGVyLAorICogdGhlbiBkdXBsaWNhdGVzIHdpbGwgbm90IGJlIHNlZW4gd2hlbiBzY2FubmluZyB0byBwb3B1bGF0ZQorICogdGhlIGx2bWV0YWQgY2FjaGUuICBOZWl0aGVyIGNvbW1vbiBjb21tYW5kcyBub3Igc2Nhbm5pbmcKKyAqIGNvbW1hbmRzIHdpbGwgc2VlIHRoZSBkdXBsaWNhdGVzLCBhbmQgbHZtZXRhZCB3aWxsIG5vdCBiZQorICogZGlzYWJsZWQuCisgKgorICogSWYgdGhlIGdsb2JhbF9maWx0ZXIgaXMgKm5vdCogdXNlZCB0byBoaWRlIGR1cGxpY2F0ZXMsCisgKiB0aGVuIGx2bWV0YWQgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIHRoZXkgYXJlIHNjYW5uZWQsIGJ1dAorICogY29tbW9uIGNvbW1hbmRzIGNhbiB1c2UgdGhlIGNvbW1hbmQgZmlsdGVyIHRvIGhpZGUgdGhlCisgKiBkdXBsaWNhdGVzIGFuZCB3b3JrIHdpdGggYSBzZWxlY3RlZCBpbnN0YW5jZSBvZiB0aGUgUFYuCisgKiBUaGUgY29tbWFuZCB3aWxsIG5vdCB1c2UgbHZtZXRhZCBpbiB0aGlzIGNhc2UsIGJ1dCB3aWxsCisgKiBub3Qgc2VlIGR1cGxpY2F0ZSBQVnMgaXRzZWxmIGJlY2F1c2UgaXRzIGNvbW1hbmQgZmlsdGVyCisgKiBpcyBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gdGhlIGdsb2JhbF9maWx0ZXIgYW5kIGhhcyBoaWRkZW4KKyAqIHRoZSBkdXBsaWNhdGVzLgorICovCisKKy8qCisgKiBGSVhNRTogaWYgd2UgZmFpbCB0byBkaXNhYmxlIGx2bWV0YWQsIHRoZW4gb3RoZXIgY29tbWFuZHMgY291bGQKKyAqIHBvdGVudGlhbGx5IHVzZSBpbmNvcnJlY3QgY2FjaGUgZGF0YSBmcm9tIGx2bWV0YWQuICBTaG91bGQgd2UKKyAqIGRvIHNvbWV0aGluZyBtb3JlIHNldmVyZSBpZiB0aGUgZGlzYWJsZSBtZXNzYWdlcyBmYWlscywgbGlrZQorICogc2VuZGluZyBTSUdLSUxMIHRvIHRoZSBsdm1ldGFkIHBpZD8KKyAqCisgKiBGSVhNRTogbG9nIHNvbWV0aGluZyBpbiBzeXNsb2cgYW55IHRpbWUgd2UgZGlzYWJsZSBsdm1ldGFkPworICogQXQgYSBtaW5pbXVtIGlmIHdlIGZhaWwgdG8gZGlzYWJsZSBsdm1ldGFkLgorICovCit2b2lkIGx2bWV0YWRfc2V0X2Rpc2FibGVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCisJaWYgKCFfbHZtZXRhZF91c2UpCisJCXJldHVybjsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJTZW5kaW5nIGx2bWV0YWQgZGlzYWJsZWQgJXMiLCByZWFzb24pOworCisJcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoX2x2bWV0YWQsICJzZXRfZ2xvYmFsX2luZm8iLAorCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCSAgICJnbG9iYWxfZGlzYWJsZSA9ICIgRk1UZDY0LCAoaW50NjRfdCkxLAorCQkJCSAgICJkaXNhYmxlX3JlYXNvbiA9ICVzIiwgcmVhc29uLAorCQkJCSAgICJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpZ2V0cGlkKCksCisJCQkJICAgImNtZCA9ICVzIiwgZ2V0X2NtZF9uYW1lKCksCisJCQkJICAgTlVMTCk7CisJaWYgKHJlcGx5LmVycm9yKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZW5kIG1lc3NhZ2UgdG8gbHZtZXRhZCAlZCIsIHJlcGx5LmVycm9yKTsKKworCWlmIChzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgcmVzcG9uc2UgZnJvbSBsdm1ldGFkLiIpOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworfQorCit2b2lkIGx2bWV0YWRfY2xlYXJfZGlzYWJsZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCisJaWYgKCFfbHZtZXRhZF91c2UpCisJCXJldHVybjsKKworCWxvZ19kZWJ1Z19sdm1ldGFkKCJTZW5kaW5nIGx2bWV0YWQgZGlzYWJsZWQgMCIpOworCisJcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoX2x2bWV0YWQsICJzZXRfZ2xvYmFsX2luZm8iLAorCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCSAgICJnbG9iYWxfZGlzYWJsZSA9ICIgRk1UZDY0LCAoaW50NjRfdCkwLAorCQkJCSAgICJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpZ2V0cGlkKCksCisJCQkJICAgImNtZCA9ICVzIiwgZ2V0X2NtZF9uYW1lKCksCisJCQkJICAgTlVMTCk7CisJaWYgKHJlcGx5LmVycm9yKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZW5kIG1lc3NhZ2UgdG8gbHZtZXRhZCAlZCIsIHJlcGx5LmVycm9yKTsKKworCWlmIChzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXBseSwgInJlc3BvbnNlIiwgIiIpLCAiT0siKSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgcmVzcG9uc2UgZnJvbSBsdm1ldGFkLiIpOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworfQorCitpbnQgbHZtZXRhZF9pc19kaXNhYmxlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqKnJlYXNvbikKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJY29uc3QgY2hhciAqcmVwbHlfcmVhc29uOworCWludCByZXQgPSAwOworCisJcmVwbHkgPSBkYWVtb25fc2VuZF9zaW1wbGUoX2x2bWV0YWQsICJnZXRfZ2xvYmFsX2luZm8iLAorCQkJCSAgICJ0b2tlbiA9ICVzIiwgInNraXAiLAorCQkJCSAgICJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpZ2V0cGlkKCksCisJCQkJICAgImNtZCA9ICVzIiwgZ2V0X2NtZF9uYW1lKCksCisJCQkJICAgTlVMTCk7CisKKwlpZiAocmVwbHkuZXJyb3IpIHsKKwkJKnJlYXNvbiA9ICJzZW5kIGVycm9yIjsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzcG9uc2UiLCAiIiksICJPSyIpKSB7CisJCSpyZWFzb24gPSAicmVzcG9uc2UgZXJyb3IiOworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGFlbW9uX3JlcGx5X2ludChyZXBseSwgImdsb2JhbF9kaXNhYmxlIiwgMCkpIHsKKwkJcmV0ID0gMTsKKworCQlyZXBseV9yZWFzb24gPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAiZGlzYWJsZV9yZWFzb24iLCBOVUxMKTsKKworCQlpZiAoIXJlcGx5X3JlYXNvbikgeworCQkJKnJlYXNvbiA9ICI8bm90IHNldD4iOworCisJCX0gZWxzZSBpZiAoc3Ryc3RyKHJlcGx5X3JlYXNvbiwgTFZNRVRBRF9ESVNBQkxFX1JFQVNPTl9ESVJFQ1QpKSB7CisJCQkqcmVhc29uID0gInRoZSBkaXNhYmxlIGZsYWcgd2FzIHNldCBkaXJlY3RseSI7CisKKwkJfSBlbHNlIGlmIChzdHJzdHIocmVwbHlfcmVhc29uLCBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0xWTTEpKSB7CisJCQkqcmVhc29uID0gIkxWTTEgbWV0YWRhdGEgd2FzIGZvdW5kIjsKKworCQl9IGVsc2UgaWYgKHN0cnN0cihyZXBseV9yZWFzb24sIExWTUVUQURfRElTQUJMRV9SRUFTT05fRFVQTElDQVRFUykpIHsKKwkJCSpyZWFzb24gPSAiZHVwbGljYXRlIFBWcyB3ZXJlIGZvdW5kIjsKKworCQl9IGVsc2UgaWYgKHN0cnN0cihyZXBseV9yZWFzb24sIExWTUVUQURfRElTQUJMRV9SRUFTT05fVkdSRVNUT1JFKSkgeworCQkJKnJlYXNvbiA9ICJ2Z2NmZ3Jlc3RvcmUgaXMgcmVzdG9yaW5nIFZHIG1ldGFkYXRhIjsKKworCQl9IGVsc2UgeworCQkJKnJlYXNvbiA9ICI8dW5rbm93bj4iOworCQl9CisJfQorb3V0OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9saWIvY2FjaGUvbHZtZXRhZC5oIGIvbGliL2NhY2hlL2x2bWV0YWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdjZTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NhY2hlL2x2bWV0YWQuaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTUVUQURfSAorI2RlZmluZSBfTFZNX01FVEFEX0gKKworI2luY2x1ZGUgImNvbmZpZy11dGlsLmgiCisKK3N0cnVjdCB2b2x1bWVfZ3JvdXA7CitzdHJ1Y3QgY21kX2NvbnRleHQ7CitzdHJ1Y3QgZG1fY29uZmlnX3RyZWU7CitlbnVtIGFjdGl2YXRpb25fY2hhbmdlOworCit0eXBlZGVmIGludCAoKmFjdGl2YXRpb25faGFuZGxlcikgKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCwKKwkJCQkgICBpbnQgcGFydGlhbCwgaW50IGNoYW5nZWQsCisJCQkJICAgZW51bSBhY3RpdmF0aW9uX2NoYW5nZSBhY3RpdmF0ZSk7CisKKyNpZmRlZiBMVk1FVEFEX1NVUFBPUlQKKworLyoKKyAqIGx2bWV0YWRfY29ubmVjdDogY29ubmVjdCB0byBsdm1ldGFkCisgKiBsdm1ldGFkX2Rpc2Nvbm5lY3Q6IGRpc2Nvbm5lY3QgZnJvbSBsdm1ldGFkCisgKiBsdm1ldGFkX21ha2VfdW51c2VkOiBkaXNjb25uZWN0IGZyb20gbHZtZXRhZCBhbmQgcmVmcmVzaCBjbWQgZmlsdGVyCisgKiBsdm1ldGFkX3VzZWQ6IGNoZWNrIGlmIGx2bWV0YWQgaXMgYmVpbmcgdXNlZCAoaS5lLiBpcyBjb25uZWN0ZWQpCisgKi8KK2ludCBsdm1ldGFkX2Nvbm5lY3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOwordm9pZCBsdm1ldGFkX2Rpc2Nvbm5lY3Qodm9pZCk7Cit2b2lkIGx2bWV0YWRfbWFrZV91bnVzZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworaW50IGx2bWV0YWRfdXNlZCh2b2lkKTsKKworCisvKgorICogQ29uZmlndXJlIHRoZSBzb2NrZXQgdGhhdCBsdm1ldGFkX2luaXQgd2lsbCB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGFlbW9uLgorICovCit2b2lkIGx2bWV0YWRfc2V0X3NvY2tldChjb25zdCBjaGFyICopOworCisvKgorICogQ2hlY2sgaWYgbHZtZXRhZCBzb2NrZXQgaXMgcHJlc2VudCAoZWl0aGVyIHRoZSBvbmUgc2V0IGJ5IGx2bWV0YWRfc2V0X3NvY2tldAorICogb3IgdGhlIGRlZmF1bHQgb25lIGlmIG5vdCBzZXQpLgorICovCitpbnQgbHZtZXRhZF9zb2NrZXRfcHJlc2VudCh2b2lkKTsKKworLyoKKyAqIENoZWNrIGlmIGx2bWV0YWQgcGlkZmlsZSBpcyBwcmVzZW50LCBpbmRpY2F0aW5nIHRoYXQgdGhlIGx2bWV0YWQKKyAqIHByb2Nlc3MgaXMgcnVubmluZyBvciBub3QuCisgKi8KK2ludCBsdm1ldGFkX3BpZGZpbGVfcHJlc2VudCh2b2lkKTsKKworLyoKKyAqIFNldCB0aGUgImx2bWV0YWQgdmFsaWRpdHkgdG9rZW4iIChjdXJyZW50bHkgb25seSBjb25zaXN0cyBvZiB0aGUgbHZtZXRhZAorICogZmlsdGVyLiBTZWUgbHZtLmNvbmYuCisgKi8KK3ZvaWQgbHZtZXRhZF9zZXRfdG9rZW4oY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqZmlsdGVyKTsKKworLyoKKyAqIFJlbGVhc2UgYWxsb2NhdGVkIHRva2VuLgorICovCit2b2lkIGx2bWV0YWRfcmVsZWFzZV90b2tlbih2b2lkKTsKKworLy8gRklYTUUgV2hhdCdzIGRlc2NyaWJlZCBoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGltcGxlbWVudGVkIHlldC4KKy8qCisgKiBTZW5kIGEgbmV3IHZlcnNpb24gb2YgVkcgbWV0YWRhdGEgdG8gbHZtZXRhZC4gVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgYWZ0ZXIKKyAqIHZnX3dyaXRlIGJ1dCBiZWZvcmUgdmdfY29tbWl0LiBBZnRlciB2Z19jb21taXQsIGx2bWV0YWRfdmdfY29tbWl0IGlzIGNhbGxlZAorICogdG8gc2VhbCB0aGUgdHJhbnNhY3Rpb24uIFRoZSByZXN1bHQgb2YgbHZtZXRhZF92Z191cGRhdGUgaXMgdGhhdCB0aGUgbmV3CisgKiBtZXRhZGF0YSBpcyBzdG9yZWQgdGVudGF0aXZlbHkgaW4gbHZtZXRhZCwgYnV0IGl0IGlzIG5vdCB1c2VkIHVudGlsCisgKiBsdm1ldGFkX3ZnX2NvbW1pdC4gVGhlIHJlcXVlc3QgaXMgdmFsaWRhdGVkIGltbWVkaWF0ZWx5IGFuZCBsdm1ldGFkX3ZnX2NvbW1pdAorICogb25seSBjb25zdGl0dXRlcyBhIHBvaW50ZXIgdXBkYXRlLgorICovCitpbnQgbHZtZXRhZF92Z191cGRhdGVfcGVuZGluZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgbHZtZXRhZF92Z191cGRhdGVfZmluaXNoKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworLyoKKyAqIEluZm9ybSBsdm1ldGFkIHRoYXQgYSBWRyBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGlzIG5vdCBlbnRpcmVseSBzYWZlLCBidXQgaXMKKyAqIG9ubHkgbmVlZGVkIGR1cmluZyB2Z3JlbW92ZSwgd2hpY2ggZG9lcyBub3Qgd2lwZSBQViBsYWJlbHMgYW5kIHRoZXJlZm9yZQorICogY2Fubm90IG1hcmsgdGhlIFBWcyBhcyBnb25lLgorICovCitpbnQgbHZtZXRhZF92Z19yZW1vdmVfcGVuZGluZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgbHZtZXRhZF92Z19yZW1vdmVfZmluaXNoKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworLyoKKyAqIE5vdGlmeSBsdm1ldGFkIHRoYXQgYSBQViBoYXMgYmVlbiBmb3VuZC4gSXQgaXMgbm90IGFuIGVycm9yIGlmIHRoZSBQViBpcworICogYWxyZWFkeSBtYXJrZWQgYXMgcHJlc2VudCBpbiBsdm1ldGFkLiBJZiBhIG5vbi1OVUxMIHZnIHBvaW50ZXIgaXMgc3VwcGxpZWQsCisgKiBpdCBpcyB0YWtlbiB0byByZXByZXNlbnQgdGhlIG1ldGFkYXRhIHJlYWQgZnJvbSB0aGUgTURBKHMpIHByZXNlbnQgb24gdGhhdAorICogUFYuIEl0ICppcyogYW4gZXJyb3IgaWY6IHRoZSBWRyBpcyBhbHJlYWR5IGtub3duIHRvIGx2bWV0YWQsIHRoZSBzZXF1ZW5jZQorICogbnVtYmVyIG9uIHRoZSBjYWNoZWQgYW5kIG9uIHRoZSBkaXNjb3ZlcmVkIFBWIG1hdGNoIGJ1dCB0aGUgbWV0YWRhdGEgY29udGVudAorICogZG9lcyBub3QuCisgKi8KK2ludCBsdm1ldGFkX3B2X2ZvdW5kKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgaWQgKnB2aWQsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgdWludDY0X3QgbGFiZWxfc2VjdG9yLAorCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgIHN0cnVjdCBkbV9saXN0ICpmb3VuZF92Z25hbWVzLAorCQkgICAgIHN0cnVjdCBkbV9saXN0ICpjaGFuZ2VkX3ZnbmFtZXMpOworCisvKgorICogSW5mb3JtIHRoZSBkYWVtb24gdGhhdCB0aGUgZGV2aWNlIG5vIGxvbmdlciBleGlzdHMuCisgKi8KK2ludCBsdm1ldGFkX3B2X2dvbmUoZGV2X3QgZGV2bm8sIGNvbnN0IGNoYXIgKnB2X25hbWUpOworaW50IGx2bWV0YWRfcHZfZ29uZV9ieV9kZXYoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoKKyAqIFJlcXVlc3QgYSBsaXN0IG9mIGFsbCBQVnMgYXZhaWxhYmxlIHRvIGx2bWV0YWQuIElmIHJlcXVlc3RlZCwgdGhpcyB3aWxsIGFsc28KKyAqIHJlYWQgbGFiZWxzIG9mZiBhbGwgdGhlIFBWcyB0byBwb3B1bGF0ZSBsdm1jYWNoZS4KKyAqLworaW50IGx2bWV0YWRfcHZfbGlzdF90b19sdm1jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKKy8qCisgKiBMb29rdXAgYW4gaW5kaXZpZHVhbCBQVi4KKyAqIElmIGZvdW5kIGlzIG5vdCBOVUxMLCBpdCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgb3Igbm90IHRoZSBQViBpcyBmb3VuZCwKKyAqIG90aGVyd2lzZSBpZiB0aGUgUFYgaXMgbm90IGZvdW5kIGFuIGVycm9yIGlzIHJldHVybmVkLgorICovCitpbnQgbHZtZXRhZF9wdl9sb29rdXAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBpZCBwdmlkLCBpbnQgKmZvdW5kKTsKK2ludCBsdm1ldGFkX3B2X2xvb2t1cF9ieV9kZXYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICpmb3VuZCk7CisKKy8qCisgKiBSZXF1ZXN0IGEgbGlzdCBvZiBhbGwgVkdzIGF2YWlsYWJsZSB0byBsdm1ldGFkIGFuZCB1c2UgaXQgdG8gZmlsbCBpbgorICogbHZtY2FjaGUuLgorICovCitpbnQgbHZtZXRhZF92Z19saXN0X3RvX2x2bWNhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworLyoKKyAqIFJlcXVlc3QgYSBsaXN0IG9mIHZnaWQvdmduYW1lIHBhaXJzIGZvciBhbGwgVkdzIGtub3duIHRvIGx2bWV0YWQuCisgKiBEb2VzIG5vdCBkbyB2Z19sb29rdXAncyBvbiBlYWNoIFZHLCBhbmQgZG9lcyBub3QgcG9wdWxhdGUgbHZtY2FjaGUuCisgKi8KK2ludCBsdm1ldGFkX2dldF92Z25hbWVpZHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICp2Z25hbWVpZHMpOworCisvKgorICogRmluZCBhIFZHIGJ5IGl0cyBJRCBvciBpdHMgbmFtZSBpbiB0aGUgbHZtZXRhZCBjYWNoZS4gR2l2ZXMgTlVMTCBpZiB0aGUgVkcgaXMKKyAqIG5vdCBmb3VuZC4KKyAqLworc3RydWN0IHZvbHVtZV9ncm91cCAqbHZtZXRhZF92Z19sb29rdXAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCk7CisKKy8qCisgKiBTY2FuIGEgc2luZ2xlIGRldmljZSBhbmQgdXBkYXRlIGx2bWV0YWQgd2l0aCB0aGUgcmVzdWx0KHMpLgorICovCitpbnQgbHZtZXRhZF9wdnNjYW5fc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkbV9saXN0ICpmb3VuZF92Z25hbWVzLAorCQkJICBzdHJ1Y3QgZG1fbGlzdCAqY2hhbmdlZF92Z25hbWVzKTsKKworaW50IGx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZG9fd2FpdCk7CisKK2ludCBsdm1ldGFkX3ZnX2NsZWFyX291dGRhdGVkX3B2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit2b2lkIGx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZm9yY2UpOworaW50IGx2bWV0YWRfdG9rZW5fbWF0Y2hlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKK2ludCBsdm1ldGFkX3ZnX2lzX2ZvcmVpZ24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqdmdpZCk7CisKK2ludCBsdm1ldGFkX2lzX2Rpc2FibGVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICoqcmVhc29uKTsKK3ZvaWQgbHZtZXRhZF9zZXRfZGlzYWJsZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGx2bWV0YWRfY2xlYXJfZGlzYWJsZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCisjICBlbHNlCQkvKiBMVk1FVEFEX1NVUFBPUlQgKi8KKworIyAgICBkZWZpbmUgbHZtZXRhZF9kaXNjb25uZWN0KCkJZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF9jb25uZWN0KGNtZCkJKDApCisjICAgIGRlZmluZSBsdm1ldGFkX21ha2VfdW51c2VkKGNtZCkJZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF91c2VkKCkJCSgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF9zZXRfc29ja2V0KGEpCWRvIHsgfSB3aGlsZSAoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfc29ja2V0X3ByZXNlbnQoKQkoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfcGlkZmlsZV9wcmVzZW50KCkgICAoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfc2V0X3Rva2VuKGEpCWRvIHsgfSB3aGlsZSAoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfcmVsZWFzZV90b2tlbigpCWRvIHsgfSB3aGlsZSAoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfdmdfdXBkYXRlKHZnKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfdmdfdXBkYXRlX3BlbmRpbmcodmcpCSgxKQorIyAgICBkZWZpbmUgbHZtZXRhZF92Z191cGRhdGVfZmluaXNoKHZnKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfdmdfcmVtb3ZlX3BlbmRpbmcodmcpCSgxKQorIyAgICBkZWZpbmUgbHZtZXRhZF92Z19yZW1vdmVfZmluaXNoKHZnKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfcHZfZm91bmQoY21kLCBwdmlkLCBkZXYsIGZtdCwgbGFiZWxfc2VjdG9yLCB2ZywgZm91bmRfdmduYW1lcywgY2hhbmdlZF92Z25hbWVzKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfcHZfZ29uZShkZXZubywgcHZfbmFtZSkJKDEpCisjICAgIGRlZmluZSBsdm1ldGFkX3B2X2dvbmVfYnlfZGV2KGRldikJKDEpCisjICAgIGRlZmluZSBsdm1ldGFkX3B2X2xpc3RfdG9fbHZtY2FjaGUoY21kKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfcHZfbG9va3VwKGNtZCwgcHZpZCwgZm91bmQpCSgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF9wdl9sb29rdXBfYnlfZGV2KGNtZCwgZGV2LCBmb3VuZCkJKDApCisjICAgIGRlZmluZSBsdm1ldGFkX3ZnX2xpc3RfdG9fbHZtY2FjaGUoY21kKQkoMSkKKyMgICAgZGVmaW5lIGx2bWV0YWRfZ2V0X3ZnbmFtZWlkcyhjbWQsIHZnbmFtZWlkcykgICAgICAgZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF92Z19sb29rdXAoY21kLCB2Z25hbWUsIHZnaWQpCShOVUxMKQorIyAgICBkZWZpbmUgbHZtZXRhZF9wdnNjYW5fc2luZ2xlKGNtZCwgZGV2LCBmb3VuZF92Z25hbWVzLCBjaGFuZ2VkX3ZnbmFtZXMpCSgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF9wdnNjYW5fYWxsX2RldnMoY21kLCBkb193YWl0KQkoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfdmdfY2xlYXJfb3V0ZGF0ZWRfcHZzKHZnKSAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF92YWxpZGF0ZV9nbG9iYWxfY2FjaGUoY21kLCBmb3JjZSkJZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF92Z19pc19mb3JlaWduKGNtZCwgdmduYW1lLCB2Z2lkKSAoMCkKKyMgICAgZGVmaW5lIGx2bWV0YWRfdG9rZW5fbWF0Y2hlcyhjbWQpICgxKQorIyAgICBkZWZpbmUgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsIHJlYXNvbikgKDApCisjICAgIGRlZmluZSBsdm1ldGFkX3NldF9kaXNhYmxlZChjbWQsIHJlYXNvbikgZG8geyB9IHdoaWxlICgwKQorIyAgICBkZWZpbmUgbHZtZXRhZF9jbGVhcl9kaXNhYmxlZChjbWQpIGRvIHsgfSB3aGlsZSAoMCkKKworIyAgZW5kaWYJLyogTFZNRVRBRF9TVVBQT1JUICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NhY2hlX3NlZ3R5cGUvLmV4cG9ydGVkX3N5bWJvbHMgYi9saWIvY2FjaGVfc2VndHlwZS8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNiM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NhY2hlX3NlZ3R5cGUvLmV4cG9ydGVkX3N5bWJvbHMKQEAgLTAsMCArMSBAQAoraW5pdF9jYWNoZV9zZWd0eXBlcwpkaWZmIC0tZ2l0IGEvbGliL2NhY2hlX3NlZ3R5cGUvTWFrZWZpbGUuaW4gYi9saWIvY2FjaGVfc2VndHlwZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRkNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NhY2hlX3NlZ3R5cGUvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitTT1VSQ0VTID0gY2FjaGUuYworCitMSUJfU0hBUkVEID0gbGlibHZtMmNhY2hlLiQoTElCX1NVRkZJWCkKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9MVk0pCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitpbnN0YWxsOiBpbnN0YWxsX2x2bTJfcGx1Z2luCmRpZmYgLS1naXQgYS9saWIvY2FjaGVfc2VndHlwZS9jYWNoZS5jIGIvbGliL2NhY2hlX3NlZ3R5cGUvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmIwNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NhY2hlX3NlZ3R5cGUvY2FjaGUuYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAidGV4dF9leHBvcnQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibHZfYWxsb2MuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBfY2FjaGVfbW9kdWxlW10gPSAiY2FjaGUiOworI2RlZmluZSBDQUNIRV9QT0xJQ1lfV0hFTl9NSVNTSU5HICAgIm1xIgorI2RlZmluZSBDQUNIRV9NT0RFX1dIRU5fTUlTU0lORwkgICAgQ0FDSEVfTU9ERV9XUklURVRIUk9VR0gKKworLyogVE9ETzogdXNpbmcgc3RhdGljIGZpZWxkIGhlcmUsIG1heWJlIHNob3VsZCBiZSBhIHBhcnQgb2Ygc2VnbWVudF90eXBlICovCitzdGF0aWMgdW5zaWduZWQgX2ZlYXR1cmVfbWFzazsKKworI2RlZmluZSBTRUdfTE9HX0VSUk9SKHQsIHAuLi4pIFwKKyAgICAgICAgbG9nX2Vycm9yKHQgIiBzZWdtZW50ICVzIG9mIGxvZ2ljYWwgdm9sdW1lICVzLiIsICMjIHAsCVwKKyAgICAgICAgICAgICAgICAgIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbiksIHNlZy0+bHYtPm5hbWUpLCAwOworCisvKgorICogV2hlbiBvbGRlciBtZXRhZGF0YSBhcmUgbG9hZGVkIHdpdGhvdXQgbmV3ZXIgc2V0dGluZ3MsCisgKiBzZXQgdGhlbiB0byBkZWZhdWx0IHNldHRpbmdzICh0aGUgb25lIHRoYXQgY291bGQgaGF2ZSBiZWVuCisgKiB1c2VkIGltcGxpY2l0ZWx5IGF0IHRoYXQgdGltZSkuCisgKgorICogTmVlZHMgYm90aCBzZWdtZW50cyBjYWNoZSBhbmQgY2FjaGVfcG9vbCB0byBiZSBsb2FkZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9maXhfbWlzc2luZ19kZWZhdWx0cyhzdHJ1Y3QgbHZfc2VnbWVudCAqY3Bvb2xfc2VnKQoreworCWlmICghY3Bvb2xfc2VnLT5wb2xpY3lfbmFtZSkgeworCQljcG9vbF9zZWctPnBvbGljeV9uYW1lID0gQ0FDSEVfUE9MSUNZX1dIRU5fTUlTU0lORzsKKwkJbG9nX3ZlcmJvc2UoIkNhY2hlIHBvb2wgJXMgaXMgbWlzc2luZyBjYWNoZSBwb2xpY3ksIHVzaW5nICVzLiIsCisJCQkgICAgZGlzcGxheV9sdm5hbWUoY3Bvb2xfc2VnLT5sdiksCisJCQkgICAgY3Bvb2xfc2VnLT5wb2xpY3lfbmFtZSk7CisJfQorCisJaWYgKGNwb29sX3NlZy0+Y2FjaGVfbW9kZSA9PSBDQUNIRV9NT0RFX1VOREVGSU5FRCkgeworCQljcG9vbF9zZWctPmNhY2hlX21vZGUgPSBDQUNIRV9NT0RFX1dIRU5fTUlTU0lORzsKKwkJbG9nX3ZlcmJvc2UoIkNhY2hlIHBvb2wgJXMgaXMgbWlzc2luZyBjYWNoZSBtb2RlLCB1c2luZyAlcy4iLAorCQkJICAgIGRpc3BsYXlfbHZuYW1lKGNwb29sX3NlZy0+bHYpLAorCQkJICAgIGdldF9jYWNoZV9tb2RlX25hbWUoY3Bvb2xfc2VnKSk7CisJfQorfQorCitzdGF0aWMgaW50IF9jYWNoZV9wb29sX3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCQkgICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmRhdGFfbHYsICptZXRhX2x2OworCWNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IHNlZy0+bHYtPnZnLT52Z21lbTsKKworCWlmICghZG1fY29uZmlnX2hhc19ub2RlKHNuLCAiZGF0YSIpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ2FjaGUgZGF0YSBub3Qgc3BlY2lmaWVkIGluIik7CisJaWYgKCEoc3RyID0gZG1fY29uZmlnX2ZpbmRfc3RyKHNuLCAiZGF0YSIsIE5VTEwpKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkNhY2hlIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCWlmICghKGRhdGFfbHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBzdHIpKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVua25vd24gbG9naWNhbCB2b2x1bWUgJXMgc3BlY2lmaWVkIGZvciAiCisJCQkJICAgICAiY2FjaGUgZGF0YSBpbiIsIHN0cik7CisKKwlpZiAoIWRtX2NvbmZpZ19oYXNfbm9kZShzbiwgIm1ldGFkYXRhIikpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJDYWNoZSBtZXRhZGF0YSBub3Qgc3BlY2lmaWVkIGluIik7CisJaWYgKCEoc3RyID0gZG1fY29uZmlnX2ZpbmRfc3RyKHNuLCAibWV0YWRhdGEiLCBOVUxMKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJDYWNoZSBtZXRhZGF0YSBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisJaWYgKCEobWV0YV9sdiA9IGZpbmRfbHYoc2VnLT5sdi0+dmcsIHN0cikpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBsb2dpY2FsIHZvbHVtZSAlcyBzcGVjaWZpZWQgZm9yICIKKwkJCQkgICAgICJjYWNoZSBtZXRhZGF0YSBpbiIsIHN0cik7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfdWludDMyKHNuLCAiY2h1bmtfc2l6ZSIsICZzZWctPmNodW5rX3NpemUpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ291bGRuJ3QgcmVhZCBjYWNoZSBjaHVua19zaXplIGluIik7CisKKwkvKgorCSAqIFJlYWQgaW4gZmVhdHVyZXM6CisJICogICBjYWNoZV9tb2RlID0ge3Bhc3N0aHJvdWdofHdyaXRldGhyb3VnaHx3cml0ZWJhY2t9CisJICoKKwkgKiAgICdjYWNoZV9tb2RlJyBkb2VzIG5vdCBoYXZlIHRvIGJlIHByZXNlbnQuCisJICovCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgImNhY2hlX21vZGUiKSkgeworCQlpZiAoIShzdHIgPSBkbV9jb25maWdfZmluZF9zdHIoc24sICJjYWNoZV9tb2RlIiwgTlVMTCkpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoImNhY2hlX21vZGUgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCQlpZiAoIXNldF9jYWNoZV9tb2RlKCZzZWctPmNhY2hlX21vZGUsIHN0cikpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBjYWNoZV9tb2RlIGluIik7CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgInBvbGljeSIpKSB7CisJCWlmICghKHN0ciA9IGRtX2NvbmZpZ19maW5kX3N0cihzbiwgInBvbGljeSIsIE5VTEwpKSkKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJwb2xpY3kgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCQlpZiAoIShzZWctPnBvbGljeV9uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBzdHIpKSkKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJGYWlsZWQgdG8gZHVwbGljYXRlIHBvbGljeSBpbiIpOworCX0KKworCS8qCisJICogUmVhZCBpbiBwb2xpY3kgYXJnczoKKwkgKiAgIHBvbGljeV9zZXR0aW5ncyB7CisJICoJbWlncmF0aW9uX3RocmVzaG9sZD0yMDQ4CisJICoJc2VxdWVudGlvbl90aHJlYXNob2xkPTEwMAorCSAqCXJhbmRvbV90aHJlYXNob2xkPTIwMAorCSAqCXJlYWRfcHJvbW90ZV9hZGp1c3RtZW50PTEwCisJICoJd3JpdGVfcHJvbW90ZV9hZGp1c3RtZW50PTIwCisJICoJZGlzY2FyZF9wcm9tb3RlX2FkanVzdG1lbnQ9NDAKKwkgKgorCSAqCTxrZXk+ID0gPHZhbHVlPgorCSAqCTxrZXk+ID0gPHZhbHVlPgorCSAqCS4uLgorCSAqICAgfQorCSAqCisJICogICBJZiB0aGUgcG9saWN5IGlzIG5vdCBwcmVzZW50LCBkZWZhdWx0IHBvbGljeSBpcyB1c2VkLgorCSAqLworCWlmICgoc24gPSBkbV9jb25maWdfZmluZF9ub2RlKHNuLCAicG9saWN5X3NldHRpbmdzIikpKSB7CisJCWlmICghc2VnLT5wb2xpY3lfbmFtZSkKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJwb2xpY3lfc2V0dGluZ3MgbXVzdCBoYXZlIGEgcG9saWN5X25hbWUgaW4iKTsKKworCQlpZiAoc24tPnYpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigicG9saWN5X3NldHRpbmdzIG11c3QgYmUgYSBzZWN0aW9uIGluIik7CisKKwkJaWYgKCEoc2VnLT5wb2xpY3lfc2V0dGluZ3MgPSBkbV9jb25maWdfY2xvbmVfbm9kZV93aXRoX21lbShtZW0sIHNuLCAwKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIWF0dGFjaF9wb29sX2RhdGFfbHYoc2VnLCBkYXRhX2x2KSkKKwkJcmV0dXJuXzA7CisJaWYgKCFhdHRhY2hfcG9vbF9tZXRhZGF0YV9sdihzZWcsIG1ldGFfbHYpKQorCQlyZXR1cm5fMDsKKworCS8qIHdoZW4gY2FjaGUgcG9vbCBpcyB1c2VkLCB3ZSByZXF1aXJlIHBvbGljeSBhbmQgbW9kZSB0byBiZSBkZWZpbmVkICovCisJaWYgKCFkbV9saXN0X2VtcHR5KCZzZWctPmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpKQorCQlfZml4X21pc3NpbmdfZGVmYXVsdHMoc2VnKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jYWNoZV9wb29sX3RleHRfaW1wb3J0X2FyZWFfY291bnQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCQkJICAgICAgdWludDMyX3QgKmFyZWFfY291bnQpCit7CisJKmFyZWFfY291bnQgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NhY2hlX3Bvb2xfdGV4dF9leHBvcnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCWNvbnN0IGNoYXIgKmNhY2hlX21vZGU7CisKKwlvdXRmKGYsICJkYXRhID0gXCIlc1wiIiwgc2VnX2x2KHNlZywgMCktPm5hbWUpOworCW91dGYoZiwgIm1ldGFkYXRhID0gXCIlc1wiIiwgc2VnLT5tZXRhZGF0YV9sdi0+bmFtZSk7CisJb3V0ZihmLCAiY2h1bmtfc2l6ZSA9ICUiIFBSSXUzMiwgc2VnLT5jaHVua19zaXplKTsKKworCS8qCisJICogQ2FjaGUgcG9vbCB1c2VkIGJ5IGEgY2FjaGUgTFYgaG9sZHMgZGF0YS4gTm90IGlkZWFsLAorCSAqIGJ1dCBub3Qgd29ydGggdG8gYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYnkgc2hpZnRpbmcKKwkgKiBjb250ZW50IHRvIGNhY2hlIHNlZ21lbnQKKwkgKi8KKwlpZiAoc2VnLT5jYWNoZV9tb2RlICE9IENBQ0hFX01PREVfVU5ERUZJTkVEKSB7CisJCWlmICghKGNhY2hlX21vZGUgPSBnZXRfY2FjaGVfbW9kZV9uYW1lKHNlZykpKQorCQkJcmV0dXJuXzA7CisJCW91dGYoZiwgImNhY2hlX21vZGUgPSBcIiVzXCIiLCBjYWNoZV9tb2RlKTsKKwl9CisKKwlpZiAoc2VnLT5wb2xpY3lfbmFtZSkgeworCQlvdXRmKGYsICJwb2xpY3kgPSBcIiVzXCIiLCBzZWctPnBvbGljeV9uYW1lKTsKKworCQlpZiAoc2VnLT5wb2xpY3lfc2V0dGluZ3MpIHsKKwkJCWlmIChzdHJjbXAoc2VnLT5wb2xpY3lfc2V0dGluZ3MtPmtleSwgInBvbGljeV9zZXR0aW5ncyIpKSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbmNvcnJlY3QgcG9saWN5X3NldHRpbmdzIHRyZWUsICVzLiIsCisJCQkJCSAgc2VnLT5wb2xpY3lfc2V0dGluZ3MtPmtleSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoc2VnLT5wb2xpY3lfc2V0dGluZ3MtPmNoaWxkKQorCQkJCW91dF9jb25maWdfbm9kZShmLCBzZWctPnBvbGljeV9zZXR0aW5ncyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2Rlc3Ryb3koc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSkKK3sKKwlkbV9mcmVlKCh2b2lkICopIHNlZ3R5cGUpOworfQorCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKK3N0YXRpYyBpbnQgX3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHVuc2lnbmVkICphdHRyaWJ1dGVzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCS8qIExpc3Qgb2YgZmVhdHVyZXMgd2l0aCB0aGVpciBrZXJuZWwgdGFyZ2V0IHZlcnNpb24gKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZlYXR1cmUgeworCQl1aW50MzJfdCBtYWo7CisJCXVpbnQzMl90IG1pbjsKKwkJdW5zaWduZWQgY2FjaGVfZmVhdHVyZTsKKwkJdW5zaWduZWQgY2FjaGVfYWxpYXM7CisJCWNvbnN0IGNoYXIgZmVhdHVyZVsxMl07CisJCWNvbnN0IGNoYXIgbW9kdWxlWzEyXTsgLyogY2hlY2sgZG0tJXMgKi8KKwkJY29uc3QgY2hhciAqYWxpYXNpbmc7CisJfSBfZmVhdHVyZXNbXSA9IHsKKwkJLyogQXNzdW1wdGlvbjogY2FjaGUgPj0xLjkgYWx3YXlzIGFsaWFzZXMgTVEgcG9saWN5ICovCisJCXsgMSwgOSwgQ0FDSEVfRkVBVFVSRV9QT0xJQ1lfU01RLCBDQUNIRV9GRUFUVVJFX1BPTElDWV9NUSwgInBvbGljeV9zbXEiLCAiY2FjaGUtc21xIiwKKwkJIiBhbmQgYWxpYXNlcyBjYWNoZS1tcSIgfSwKKwkJeyAxLCA4LCBDQUNIRV9GRUFUVVJFX1BPTElDWV9TTVEsIDAsICJwb2xpY3lfc21xIiwgImNhY2hlLXNtcSIgfSwKKwkJeyAxLCAzLCBDQUNIRV9GRUFUVVJFX1BPTElDWV9NUSwgMCwgInBvbGljeV9tcSIsICJjYWNoZS1tcSIgfSwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIF9sdm1jb25mW10gPSAiZ2xvYmFsL2NhY2hlX2Rpc2FibGVkX2ZlYXR1cmVzIjsKKwlzdGF0aWMgdW5zaWduZWQgX2F0dHJzID0gMDsKKwlzdGF0aWMgaW50IF9jYWNoZV9jaGVja2VkID0gMDsKKwlzdGF0aWMgaW50IF9jYWNoZV9wcmVzZW50ID0gMDsKKwl1aW50MzJfdCBtYWosIG1pbiwgcGF0Y2hsZXZlbDsKKwl1bnNpZ25lZCBpOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJY29uc3QgY2hhciAqc3RyOworCisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAwOworCisJaWYgKCFfY2FjaGVfY2hlY2tlZCkgeworCQlfY2FjaGVfY2hlY2tlZCA9IDE7CisKKwkJaWYgKCEoX2NhY2hlX3ByZXNlbnQgPSB0YXJnZXRfcHJlc2VudF92ZXJzaW9uKGNtZCwgVEFSR0VUX05BTUVfQ0FDSEUsIDEsCisJCQkJCQkJICAgICAgJm1haiwgJm1pbiwgJnBhdGNobGV2ZWwpKSkKKwkJCXJldHVybl8wOworCisJCWlmICgobWFqIDwgMSkgfHwKKwkJICAgICgobWFqID09IDEpICYmIChtaW4gPCAzKSkpIHsKKwkJCV9jYWNoZV9wcmVzZW50ID0gMDsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBUaGUgY2FjaGUga2VybmVsIG1vZHVsZSBpcyB2ZXJzaW9uICV1LiV1LiV1LiAiCisJCQkJICAiVmVyc2lvbiAxLjMuMCsgaXMgcmVxdWlyZWQuIiwKKwkJCQkgIG1haiwgbWluLCBwYXRjaGxldmVsKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX2ZlYXR1cmVzKTsgKytpKSB7CisJCQlpZiAoX2F0dHJzICYgX2ZlYXR1cmVzW2ldLmNhY2hlX2ZlYXR1cmUpCisJCQkJY29udGludWU7IC8qIGFscmVhZHkgcHJlc2VudCAqLworCQkJaWYgKCgobWFqID4gX2ZlYXR1cmVzW2ldLm1haikgfHwKKwkJCSAgICAgKG1haiA9PSBfZmVhdHVyZXNbaV0ubWFqICYmIG1pbiA+PSBfZmVhdHVyZXNbaV0ubWluKSkgJiYKKwkJCSAgICBtb2R1bGVfcHJlc2VudChjbWQsIF9mZWF0dXJlc1tpXS5tb2R1bGUpKSB7CisJCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNhY2hlIHBvbGljeSAlcyBpcyBhdmFpbGFibGUlcy4iLAorCQkJCQkJICAgICBfZmVhdHVyZXNbaV0ubW9kdWxlLAorCQkJCQkJICAgICBfZmVhdHVyZXNbaV0uYWxpYXNpbmcgPyA6ICIiKTsKKwkJCQlfYXR0cnMgfD0gKF9mZWF0dXJlc1tpXS5jYWNoZV9mZWF0dXJlIHwgX2ZlYXR1cmVzW2ldLmNhY2hlX2FsaWFzKTsKKwkJCX0gZWxzZSBpZiAoIV9mZWF0dXJlc1tpXS5jYWNoZV9hbGlhcykKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCJUYXJnZXQgJXMgZG9lcyBub3Qgc3VwcG9ydCAlcy4iLAorCQkJCQkJIF9jYWNoZV9tb2R1bGUsIF9mZWF0dXJlc1tpXS5mZWF0dXJlKTsKKwkJfQorCX0KKworCWlmIChhdHRyaWJ1dGVzKSB7CisJCWlmICghX2ZlYXR1cmVfbWFzaykgeworCQkJLyogU3VwcG9ydCBydW50aW1lIGx2bS5jb25mIGNoYW5nZXMsIE4uQi4gYXZvaWQgMzIgZmVhdHVyZSAqLworCQkJaWYgKChjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBnbG9iYWxfY2FjaGVfZGlzYWJsZWRfZmVhdHVyZXNfQ0ZHLCBOVUxMKSkpIHsKKwkJCQlmb3IgKGN2ID0gY24tPnY7IGN2OyBjdiA9IGN2LT5uZXh0KSB7CisJCQkJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQkJCQlsb2dfZXJyb3IoIklnbm9yaW5nIGludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlICVzLiIsCisJCQkJCQkJICBfbHZtY29uZik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlzdHIgPSBjdi0+di5zdHI7CisJCQkJCWlmICghKnN0cikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfZmVhdHVyZXMpOyArK2kpCisJCQkJCQlpZiAoc3RyY2FzZWNtcChzdHIsIF9mZWF0dXJlc1tpXS5mZWF0dXJlKSA9PSAwKQorCQkJCQkJCV9mZWF0dXJlX21hc2sgfD0gX2ZlYXR1cmVzW2ldLmNhY2hlX2ZlYXR1cmU7CisJCQkJfQorCQkJfQorCisJCQlfZmVhdHVyZV9tYXNrID0gfl9mZWF0dXJlX21hc2s7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKF9mZWF0dXJlcyk7ICsraSkKKwkJCQlpZiAoKF9hdHRycyAmIF9mZWF0dXJlc1tpXS5jYWNoZV9mZWF0dXJlKSAmJgorCQkJCSAgICAhKF9mZWF0dXJlX21hc2sgJiBfZmVhdHVyZXNbaV0uY2FjaGVfZmVhdHVyZSkpCisJCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIlRhcmdldCAlcyAlcyBzdXBwb3J0IGRpc2FibGVkIGJ5ICVzIiwKKwkJCQkJCQkgX2NhY2hlX21vZHVsZSwgX2ZlYXR1cmVzW2ldLmZlYXR1cmUsIF9sdm1jb25mKTsKKwkJfQorCQkqYXR0cmlidXRlcyA9IF9hdHRycyAmIF9mZWF0dXJlX21hc2s7CisJfQorCisJcmV0dXJuIF9jYWNoZV9wcmVzZW50OworfQorCitzdGF0aWMgaW50IF9tb2R1bGVzX25lZWRlZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKQoreworCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgbW9kdWxlcywgTU9EVUxFX05BTUVfQ0FDSEUpKSB7CisJCWxvZ19lcnJvcigiU3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGNhY2hlIG1vZHVsZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogREVWTUFQUEVSX1NVUFBPUlQgKi8KKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX2NhY2hlX3Bvb2xfb3BzID0geworCS50ZXh0X2ltcG9ydCA9IF9jYWNoZV9wb29sX3RleHRfaW1wb3J0LAorCS50ZXh0X2ltcG9ydF9hcmVhX2NvdW50ID0gX2NhY2hlX3Bvb2xfdGV4dF9pbXBvcnRfYXJlYV9jb3VudCwKKwkudGV4dF9leHBvcnQgPSBfY2FjaGVfcG9vbF90ZXh0X2V4cG9ydCwKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorCS50YXJnZXRfcHJlc2VudCA9IF90YXJnZXRfcHJlc2VudCwKKwkubW9kdWxlc19uZWVkZWQgPSBfbW9kdWxlc19uZWVkZWQsCisjICBpZmRlZiBETUVWRU5URAorIyAgZW5kaWYgICAgICAgIC8qIERNRVZFTlREICovCisjZW5kaWYKKwkuZGVzdHJveSA9IF9kZXN0cm95LAorfTsKKworc3RhdGljIGludCBfY2FjaGVfdGV4dF9pbXBvcnQoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQkgICAgICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYsICpvcmlnaW5fbHY7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWlmICghZG1fY29uZmlnX2hhc19ub2RlKHNuLCAiY2FjaGVfcG9vbCIpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiY2FjaGVfcG9vbCBub3Qgc3BlY2lmaWVkIGluIik7CisJaWYgKCEobmFtZSA9IGRtX2NvbmZpZ19maW5kX3N0cihzbiwgImNhY2hlX3Bvb2wiLCBOVUxMKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJjYWNoZV9wb29sIG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKwlpZiAoIShwb29sX2x2ID0gZmluZF9sdihzZWctPmx2LT52ZywgbmFtZSkpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBsb2dpY2FsIHZvbHVtZSAlcyBzcGVjaWZpZWQgZm9yICIKKwkJCQkgICAgICJjYWNoZV9wb29sIGluIiwgbmFtZSk7CisKKwlpZiAoIWRtX2NvbmZpZ19oYXNfbm9kZShzbiwgIm9yaWdpbiIpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ2FjaGUgb3JpZ2luIG5vdCBzcGVjaWZpZWQgaW4iKTsKKwlpZiAoIShuYW1lID0gZG1fY29uZmlnX2ZpbmRfc3RyKHNuLCAib3JpZ2luIiwgTlVMTCkpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ2FjaGUgb3JpZ2luIG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKwlpZiAoIShvcmlnaW5fbHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBuYW1lKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJVbmtub3duIGxvZ2ljYWwgdm9sdW1lICVzIHNwZWNpZmllZCBmb3IgIgorCQkJCSAgICAgImNhY2hlIG9yaWdpbiBpbiIsIG5hbWUpOworCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzZWcsIDAsIG9yaWdpbl9sdiwgMCwgMCkpCisJCXJldHVybl8wOworCisJc2VnLT5jbGVhbmVyX3BvbGljeSA9IDA7CisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgImNsZWFuZXIiKSAmJgorCSAgICAhZG1fY29uZmlnX2dldF91aW50MzIoc24sICJjbGVhbmVyIiwgJnNlZy0+Y2xlYW5lcl9wb2xpY3kpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ291bGQgbm90IHJlYWQgY2FjaGUgY2xlYW5lciBpbiIpOworCisJc2VnLT5sdi0+c3RhdHVzIHw9IHN0cnN0cihzZWctPmx2LT5uYW1lLCAiX2NvcmlnIikgPyBMVl9QRU5ESU5HX0RFTEVURSA6IDA7CisKKwlpZiAoIWF0dGFjaF9wb29sX2x2KHNlZywgcG9vbF9sdiwgTlVMTCwgTlVMTCwgTlVMTCkpCisJCXJldHVybl8wOworCisJLyogbG9hZCBvcmRlciBpcyB1bmtub3duLCBjb3VsZCBiZSBjYWNoZSBvcmlnaW4gb3IgcG9vbCBMViwgc28gY2hlY2sgZm9yIGJvdGggKi8KKwlpZiAoIWRtX2xpc3RfZW1wdHkoJnBvb2xfbHYtPnNlZ21lbnRzKSkKKwkJX2ZpeF9taXNzaW5nX2RlZmF1bHRzKGZpcnN0X3NlZyhwb29sX2x2KSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2FjaGVfdGV4dF9pbXBvcnRfYXJlYV9jb3VudChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkJCQkgdWludDMyX3QgKmFyZWFfY291bnQpCit7CisJKmFyZWFfY291bnQgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NhY2hlX3RleHRfZXhwb3J0KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJaWYgKCFzZWdfbHYoc2VnLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlvdXRmKGYsICJjYWNoZV9wb29sID0gXCIlc1wiIiwgc2VnLT5wb29sX2x2LT5uYW1lKTsKKwlvdXRmKGYsICJvcmlnaW4gPSBcIiVzXCIiLCBzZWdfbHYoc2VnLCAwKS0+bmFtZSk7CisKKwlpZiAoc2VnLT5jbGVhbmVyX3BvbGljeSkKKwkJb3V0ZihmLCAiY2xlYW5lciA9IDEiKTsKKworCXJldHVybiAxOworfQorCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKK3N0YXRpYyBpbnQgX2NhY2hlX2FkZF90YXJnZXRfbGluZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLAorCQkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgdm9pZCAqKnRhcmdldF9zdGF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDY0X3QgbGVuLAorCQkJCSB1aW50MzJfdCAqcHZtb3ZlX21pcnJvcl9jb3VudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqY2FjaGVfcG9vbF9zZWc7CisJY2hhciAqbWV0YWRhdGFfdXVpZCwgKmRhdGFfdXVpZCwgKm9yaWdpbl91dWlkOworCXVpbnQ2NF90IGZlYXR1cmVfZmxhZ3MgPSAwOworCisJaWYgKCFzZWctPnBvb2xfbHYgfHwgIXNlZ19pc19jYWNoZShzZWcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUGFzc2VkIHNlZ21lbnQgaXMgbm90IGNhY2hlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWNoZV9wb29sX3NlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCWlmIChzZWctPmNsZWFuZXJfcG9saWN5KQorCQkvKiBXaXRoIGNsZWFuZXIgcG9saWN5IGFsd2F5cyBwYXNzIHdyaXRldGhyb3VnaCAqLworCQlmZWF0dXJlX2ZsYWdzIHw9IERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVUSFJPVUdIOworCWVsc2UKKwkJc3dpdGNoIChjYWNoZV9wb29sX3NlZy0+Y2FjaGVfbW9kZSkgeworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBoYXMgdW5rbm93biBjYWNoZSBtb2RlICVkLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSwgY2FjaGVfcG9vbF9zZWctPmNhY2hlX21vZGUpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNhc2UgQ0FDSEVfTU9ERV9XUklURVRIUk9VR0g6CisJCQlmZWF0dXJlX2ZsYWdzIHw9IERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVUSFJPVUdIOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfTU9ERV9XUklURUJBQ0s6CisJCQlmZWF0dXJlX2ZsYWdzIHw9IERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVCQUNLOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfTU9ERV9QQVNTVEhST1VHSDoKKwkJCWZlYXR1cmVfZmxhZ3MgfD0gRE1fQ0FDSEVfRkVBVFVSRV9QQVNTVEhST1VHSDsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIShtZXRhZGF0YV91dWlkID0gYnVpbGRfZG1fdXVpZChtZW0sIGNhY2hlX3Bvb2xfc2VnLT5tZXRhZGF0YV9sdiwgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRhdGFfdXVpZCA9IGJ1aWxkX2RtX3V1aWQobWVtLCBzZWdfbHYoY2FjaGVfcG9vbF9zZWcsIDApLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJaWYgKCEob3JpZ2luX3V1aWQgPSBidWlsZF9kbV91dWlkKG1lbSwgc2VnX2x2KHNlZywgMCksIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfY2FjaGVfdGFyZ2V0KG5vZGUsIGxlbiwKKwkJCQkJICAgZmVhdHVyZV9mbGFncywKKwkJCQkJICAgbWV0YWRhdGFfdXVpZCwKKwkJCQkJICAgZGF0YV91dWlkLAorCQkJCQkgICBvcmlnaW5fdXVpZCwKKwkJCQkJICAgc2VnLT5jbGVhbmVyX3BvbGljeSA/ICJjbGVhbmVyIiA6CisJCQkJCQkgICAvKiB1bmRlZmluZWQgcG9saWN5IG5hbWUgLT4gbGlrZWx5IGFuIG9sZCAibXEiICovCisJCQkJCQkgICBjYWNoZV9wb29sX3NlZy0+cG9saWN5X25hbWUgPyA6ICJtcSIsCisJCQkJCSAgIHNlZy0+Y2xlYW5lcl9wb2xpY3kgPyBOVUxMIDogY2FjaGVfcG9vbF9zZWctPnBvbGljeV9zZXR0aW5ncywKKwkJCQkJICAgY2FjaGVfcG9vbF9zZWctPmNodW5rX3NpemUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIERFVk1BUFBFUl9TVVBQT1JUICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF9jYWNoZV9vcHMgPSB7CisJLnRleHRfaW1wb3J0ID0gX2NhY2hlX3RleHRfaW1wb3J0LAorCS50ZXh0X2ltcG9ydF9hcmVhX2NvdW50ID0gX2NhY2hlX3RleHRfaW1wb3J0X2FyZWFfY291bnQsCisJLnRleHRfZXhwb3J0ID0gX2NhY2hlX3RleHRfZXhwb3J0LAorI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisJLmFkZF90YXJnZXRfbGluZSA9IF9jYWNoZV9hZGRfdGFyZ2V0X2xpbmUsCisJLnRhcmdldF9wcmVzZW50ID0gX3RhcmdldF9wcmVzZW50LAorCS5tb2R1bGVzX25lZWRlZCA9IF9tb2R1bGVzX25lZWRlZCwKKyMgIGlmZGVmIERNRVZFTlRECisjICBlbmRpZiAgICAgICAgLyogRE1FVkVOVEQgKi8KKyNlbmRpZgorCS5kZXN0cm95ID0gX2Rlc3Ryb3ksCit9OworCisjaWZkZWYgQ0FDSEVfSU5URVJOQUwgLyogU2hhcmVkICovCitpbnQgaW5pdF9jYWNoZV9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCXN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYikKKyNlbHNlCitpbnQgaW5pdF9jYWNoZV9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCXN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYik7CitpbnQgaW5pdF9jYWNoZV9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCXN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYikKKyNlbmRpZgoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSk7CisKKwlpZiAoIXNlZ3R5cGUpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjYWNoZV9wb29sIHNlZ3R5cGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VndHlwZS0+bmFtZSA9IFNFR19UWVBFX05BTUVfQ0FDSEVfUE9PTDsKKwlzZWd0eXBlLT5mbGFncyA9IFNFR19DQUNIRV9QT09MIHwgU0VHX0NBTk5PVF9CRV9aRVJPRUQgfCBTRUdfT05MWV9FWENMVVNJVkU7CisJc2VndHlwZS0+b3BzID0gJl9jYWNoZV9wb29sX29wczsKKworCWlmICghbHZtX3JlZ2lzdGVyX3NlZ3R5cGUoc2VnbGliLCBzZWd0eXBlKSkKKwkJcmV0dXJuXzA7CisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5pdGlhbGlzZWQgc2VndHlwZTogJXMiLCBzZWd0eXBlLT5uYW1lKTsKKworCXNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSk7CisJaWYgKCFzZWd0eXBlKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FjaGUgc2VndHlwZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWd0eXBlLT5uYW1lID0gU0VHX1RZUEVfTkFNRV9DQUNIRTsKKwlzZWd0eXBlLT5mbGFncyA9IFNFR19DQUNIRSB8IFNFR19PTkxZX0VYQ0xVU0lWRTsKKwlzZWd0eXBlLT5vcHMgPSAmX2NhY2hlX29wczsKKworCWlmICghbHZtX3JlZ2lzdGVyX3NlZ3R5cGUoc2VnbGliLCBzZWd0eXBlKSkKKwkJcmV0dXJuXzA7CisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5pdGlhbGlzZWQgc2VndHlwZTogJXMiLCBzZWd0eXBlLT5uYW1lKTsKKworCS8qIFJlc2V0IG1hc2sgZm9yIHJlY2FsYyAqLworCV9mZWF0dXJlX21hc2sgPSAwOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvY29tbWFuZHMvdG9vbGNvbnRleHQuYyBiL2xpYi9jb21tYW5kcy90b29sY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmQ1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29tbWFuZHMvdG9vbGNvbnRleHQuYwpAQCAtMCwwICsxLDIzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAibGFiZWwuaCIKKyNpbmNsdWRlICJsdm0tZmlsZS5oIgorI2luY2x1ZGUgImZvcm1hdC10ZXh0LmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgIm1lbWxvY2suaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKyNpbmNsdWRlICJhcmNoaXZlci5oIgorI2luY2x1ZGUgImx2bXBvbGxkLWNsaWVudC5oIgorCisjaWZkZWYgSEFWRV9MSUJETAorI2luY2x1ZGUgInNoYXJlZGxpYi5oIgorI2VuZGlmCisKKyNpZmRlZiBMVk0xX0lOVEVSTkFMCisjaW5jbHVkZSAiZm9ybWF0MS5oIgorI2VuZGlmCisKKyNpZmRlZiBQT09MX0lOVEVSTkFMCisjaW5jbHVkZSAiZm9ybWF0X3Bvb2wuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fbGludXhfXworIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHNpemVfdCBsaW5lYnVmZmVyX3NpemUgPSA0MDk2OworCisvKgorICogQ29weSB0aGUgaW5wdXQgc3RyaW5nLCByZW1vdmluZyBpbnZhbGlkIGNoYXJhY3RlcnMuCisgKi8KK2NvbnN0IGNoYXIgKnN5c3RlbV9pZF9mcm9tX3N0cmluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnN5c3RlbV9pZDsKKworCWlmICghc3RyIHx8ICEqc3RyKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBFbXB0eSBzeXN0ZW0gSUQgc3VwcGxpZWQuIik7CisJCXJldHVybiAiIjsKKwl9CisKKwlpZiAoIShzeXN0ZW1faWQgPSBkbV9wb29sX3phbGxvYyhjbWQtPmxpYm1lbSwgc3RybGVuKHN0cikgKyAxKSkpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEZhaWxlZCB0byBhbGxvY2F0ZSBzeXN0ZW0gSUQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNvcHlfc3lzdGVtaWRfY2hhcnMoc3RyLCBzeXN0ZW1faWQpOworCisJaWYgKCEqc3lzdGVtX2lkKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBJbnZhbGlkIHN5c3RlbSBJRCBmb3JtYXQ6ICVzIiwgc3RyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFzdHJuY21wKHN5c3RlbV9pZCwgImxvY2FsaG9zdCIsIDkpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBzeXN0ZW0gSUQgbWF5IG5vdCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcgXCJsb2NhbGhvc3RcIi4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHN5c3RlbV9pZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9yZWFkX3N5c3RlbV9pZF9mcm9tX2ZpbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IGxpbmVfc2l6ZTsKKwljaGFyICpzdGFydCwgKmVuZDsKKwljb25zdCBjaGFyICpzeXN0ZW1faWQgPSBOVUxMOworCUZJTEUgKmZwOworCisJaWYgKCFmaWxlIHx8ICFzdHJsZW4oZmlsZSkgfHwgIWZpbGVbMF0pCisJCXJldHVybl9OVUxMOworCisJaWYgKCEoZnAgPSBmb3BlbihmaWxlLCAiciIpKSkgeworCQlsb2dfd2FybigiV0FSTklORzogJXM6IGZvcGVuIGZhaWxlZDogJXMiLCBmaWxlLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAoZ2V0bGluZSgmbGluZSwgJmxpbmVfc2l6ZSwgZnApID4gMCkgeworCQlzdGFydCA9IGxpbmU7CisKKwkJLyogSWdub3JlIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCQl3aGlsZSAoKnN0YXJ0ICYmIGlzc3BhY2UoKnN0YXJ0KSkKKwkJCXN0YXJ0Kys7CisKKwkJLyogSWdub3JlIHJlc3Qgb2YgbGluZSBhZnRlciAjICovCisJCWlmICghKnN0YXJ0IHx8ICpzdGFydCA9PSAnIycpCisJCQljb250aW51ZTsKKworCQlpZiAoc3lzdGVtX2lkICYmICpzeXN0ZW1faWQpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBleHRyYSBsaW5lKHMpIGluIHN5c3RlbSBJRCBmaWxlICVzLiIsIGZpbGUpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZW1vdmUgYW55IGNvbW1lbnRzIGZyb20gZW5kIG9mIGxpbmUgKi8KKwkJZm9yIChlbmQgPSBzdGFydDsgKmVuZDsgZW5kKyspCisJCQlpZiAoKmVuZCA9PSAnIycpIHsKKwkJCQkqZW5kID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0KKworCQlzeXN0ZW1faWQgPSBzeXN0ZW1faWRfZnJvbV9zdHJpbmcoY21kLCBzdGFydCk7CisJfQorCisJZnJlZShsaW5lKTsKKworCWlmIChmY2xvc2UoZnApKQorCQlzdGFjazsKKworCXJldHVybiBzeXN0ZW1faWQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfc3lzdGVtX2lkX2Zyb21fc291cmNlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpzb3VyY2UpCit7CisJY2hhciBmaWxlYnVmW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpmaWxlOworCWNvbnN0IGNoYXIgKmV0Y19zdHI7CisJY29uc3QgY2hhciAqc3RyOworCWNvbnN0IGNoYXIgKnN5c3RlbV9pZCA9IE5VTEw7CisKKwlpZiAoIXN0cmNhc2VjbXAoc291cmNlLCAidW5hbWUiKSkgeworCQlpZiAoY21kLT5ob3N0bmFtZSkKKwkJCXN5c3RlbV9pZCA9IHN5c3RlbV9pZF9mcm9tX3N0cmluZyhjbWQsIGNtZC0+aG9zdG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBsdm0uY29uZiBhbmQgbHZtbG9jYWwuY29uZiBhcmUgbWVyZ2VkIGludG8gb25lIGNvbmZpZyB0cmVlICovCisJaWYgKCFzdHJjYXNlY21wKHNvdXJjZSwgImx2bWxvY2FsIikpIHsKKwkJaWYgKChzdHIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGxvY2FsX3N5c3RlbV9pZF9DRkcsIE5VTEwpKSkKKwkJCXN5c3RlbV9pZCA9IHN5c3RlbV9pZF9mcm9tX3N0cmluZyhjbWQsIHN0cik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc3RyY2FzZWNtcChzb3VyY2UsICJtYWNoaW5laWQiKSB8fCAhc3RyY2FzZWNtcChzb3VyY2UsICJtYWNoaW5lLWlkIikpIHsKKwkJZXRjX3N0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgZ2xvYmFsX2V0Y19DRkcsIE5VTEwpOworCQlpZiAoZG1fc25wcmludGYoZmlsZWJ1Ziwgc2l6ZW9mKGZpbGVidWYpLCAiJXMvbWFjaGluZS1pZCIsIGV0Y19zdHIpICE9IC0xKQorCQkJc3lzdGVtX2lkID0gX3JlYWRfc3lzdGVtX2lkX2Zyb21fZmlsZShjbWQsIGZpbGVidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXN0cmNhc2VjbXAoc291cmNlLCAiZmlsZSIpKSB7CisJCWZpbGUgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9zeXN0ZW1faWRfZmlsZV9DRkcsIE5VTEwpOworCQlzeXN0ZW1faWQgPSBfcmVhZF9zeXN0ZW1faWRfZnJvbV9maWxlKGNtZCwgZmlsZSk7CisJCWdvdG8gb3V0OworCX0KKworCWxvZ193YXJuKCJXQVJOSU5HOiBVbnJlY29nbmlzZWQgc3lzdGVtX2lkX3NvdXJjZSBcIiVzXCIuIiwgc291cmNlKTsKKworb3V0OgorCXJldHVybiBzeXN0ZW1faWQ7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9lbnZfdmFycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljb25zdCBjaGFyICplOworCisJLyogU2V0IHRvICIiIHRvIGF2b2lkIHVzaW5nIGFueSBzeXN0ZW0gZGlyZWN0b3J5ICovCisJaWYgKChlID0gZ2V0ZW52KCJMVk1fU1lTVEVNX0RJUiIpKSkgeworCQlpZiAoZG1fc25wcmludGYoY21kLT5zeXN0ZW1fZGlyLCBzaXplb2YoY21kLT5zeXN0ZW1fZGlyKSwKKwkJCQkgIiVzIiwgZSkgPCAwKSB7CisJCQlsb2dfZXJyb3IoIkxWTV9TWVNURU1fRElSIGVudmlyb25tZW50IHZhcmlhYmxlICIKKwkJCQkgICJpcyB0b28gbG9uZy4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9nZXRfc3lzZnNfZGlyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdGF0aWMgY2hhciBwcm9jX21vdW50c1tQQVRIX01BWF07CisJc3RhdGljIGNoYXIgKnNwbGl0WzRdLCBidWZmZXJbUEFUSF9NQVggKyAxNl07CisJRklMRSAqZnA7CisJY2hhciAqc3lzX21udCA9IE5VTEw7CisKKwkqYnVmID0gJ1wwJzsKKworCWlmICghKmNtZC0+cHJvY19kaXIpIHsKKwkJbG9nX2RlYnVnKCJObyBwcm9jIGZpbGVzeXN0ZW0gZm91bmQ6IHNraXBwaW5nIHN5c2ZzIGRldGVjdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRtX3NucHJpbnRmKHByb2NfbW91bnRzLCBzaXplb2YocHJvY19tb3VudHMpLAorCQkJICIlcy9tb3VudHMiLCBjbWQtPnByb2NfZGlyKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIC9wcm9jL21vdW50cyBzdHJpbmcgZm9yIHN5c2ZzIGRldGVjdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoZnAgPSBmb3Blbihwcm9jX21vdW50cywgInIiKSkpIHsKKwkJbG9nX3N5c19lcnJvcigiX2dldF9zeXNmc19kaXIgZm9wZW4iLCBwcm9jX21vdW50cyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZnApKSB7CisJCWlmIChkbV9zcGxpdF93b3JkcyhidWZmZXIsIDQsIDAsIHNwbGl0KSA9PSA0ICYmCisJCSAgICAhc3RyY21wKHNwbGl0WzJdLCAic3lzZnMiKSkgeworCQkJc3lzX21udCA9IHNwbGl0WzFdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmNsb3NlKGZwKSkKKwkJbG9nX3N5c19lcnJvcigiZmNsb3NlIiwgcHJvY19tb3VudHMpOworCisJaWYgKCFzeXNfbW50KSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgc3lzZnMgbW91bnQgcG9pbnQiKTsKKwkJcmV0dXJuOworCX0KKworCXN0cm5jcHkoYnVmLCBzeXNfbW50LCBidWZfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3BhcnNlX2RlYnVnX2NsYXNzZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwlpbnQgZGVidWdfY2xhc3NlcyA9IDA7CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBsb2dfZGVidWdfY2xhc3Nlc19DRkcsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuYWJsZSB0byBmaW5kIGNvbmZpZ3VyYXRpb24gZm9yIGxvZy9kZWJ1Z19jbGFzc2VzLiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJbG9nX3ZlcmJvc2UoImxvZy9kZWJ1Z19jbGFzc2VzIGNvbnRhaW5zIGEgdmFsdWUgIgorCQkJCSAgICAid2hpY2ggaXMgbm90IGEgc3RyaW5nLiAgSWdub3JpbmcuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY2FzZWNtcChjdi0+di5zdHIsICJhbGwiKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoIXN0cmNhc2VjbXAoY3YtPnYuc3RyLCAibWVtb3J5IikpCisJCQlkZWJ1Z19jbGFzc2VzIHw9IExPR19DTEFTU19NRU07CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGN2LT52LnN0ciwgImRldmljZXMiKSkKKwkJCWRlYnVnX2NsYXNzZXMgfD0gTE9HX0NMQVNTX0RFVlM7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGN2LT52LnN0ciwgImFjdGl2YXRpb24iKSkKKwkJCWRlYnVnX2NsYXNzZXMgfD0gTE9HX0NMQVNTX0FDVElWQVRJT047CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGN2LT52LnN0ciwgImFsbG9jYXRpb24iKSkKKwkJCWRlYnVnX2NsYXNzZXMgfD0gTE9HX0NMQVNTX0FMTE9DOworCQllbHNlIGlmICghc3RyY2FzZWNtcChjdi0+di5zdHIsICJsdm1ldGFkIikpCisJCQlkZWJ1Z19jbGFzc2VzIHw9IExPR19DTEFTU19MVk1FVEFEOworCQllbHNlIGlmICghc3RyY2FzZWNtcChjdi0+di5zdHIsICJtZXRhZGF0YSIpKQorCQkJZGVidWdfY2xhc3NlcyB8PSBMT0dfQ0xBU1NfTUVUQURBVEE7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGN2LT52LnN0ciwgImNhY2hlIikpCisJCQlkZWJ1Z19jbGFzc2VzIHw9IExPR19DTEFTU19DQUNIRTsKKwkJZWxzZSBpZiAoIXN0cmNhc2VjbXAoY3YtPnYuc3RyLCAibG9ja2luZyIpKQorCQkJZGVidWdfY2xhc3NlcyB8PSBMT0dfQ0xBU1NfTE9DS0lORzsKKwkJZWxzZSBpZiAoIXN0cmNhc2VjbXAoY3YtPnYuc3RyLCAibHZtcG9sbGQiKSkKKwkJCWRlYnVnX2NsYXNzZXMgfD0gTE9HX0NMQVNTX0xWTVBPTExEOworCQllbHNlIGlmICghc3RyY2FzZWNtcChjdi0+di5zdHIsICJkYnVzIikpCisJCQlkZWJ1Z19jbGFzc2VzIHw9IExPR19DTEFTU19EQlVTOworCQllbHNlCisJCQlsb2dfdmVyYm9zZSgiVW5yZWNvZ25pc2VkIHZhbHVlIGZvciBsb2cvZGVidWdfY2xhc3NlczogJXMiLCBjdi0+di5zdHIpOworCX0KKworCXJldHVybiBkZWJ1Z19jbGFzc2VzOworfQorCitzdGF0aWMgdm9pZCBfaW5pdF9sb2dnaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWludCBhcHBlbmQgPSAxOworCXRpbWVfdCB0OworCisJY29uc3QgY2hhciAqbG9nX2ZpbGU7CisJY2hhciB0aW1lYnVmWzI2XTsKKworCS8qIFN5c2xvZyAqLworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5zeXNsb2cgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBsb2dfc3lzbG9nX0NGRywgTlVMTCk7CisJaWYgKGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5zeXNsb2cgIT0gMSkKKwkJZmluX3N5c2xvZygpOworCisJaWYgKGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5zeXNsb2cgPiAxKQorCQlpbml0X3N5c2xvZyhjbWQtPmRlZmF1bHRfc2V0dGluZ3Muc3lzbG9nKTsKKworCS8qIERlYnVnIGxldmVsIGZvciBsb2cgZmlsZSBvdXRwdXQgKi8KKwljbWQtPmRlZmF1bHRfc2V0dGluZ3MuZGVidWcgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGxvZ19sZXZlbF9DRkcsIE5VTEwpOworCWluaXRfZGVidWcoY21kLT5kZWZhdWx0X3NldHRpbmdzLmRlYnVnKTsKKworCS8qCisJICogU3VwcHJlc3MgYWxsIG5vbi1lc3NlbnRpYWwgc3Rkb3V0PworCSAqIC1xcSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgMCB0byAxIGxhdGVyLgorCSAqIE9uY2Ugc2V0IHRvIDEsIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGNoYW5nZSBpdCBiYWNrIHRvIDAuCisJICovCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnNpbGVudCA9IHNpbGVudF9tb2RlKCkgPyA6CisJICAgIGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGxvZ19zaWxlbnRfQ0ZHLCBOVUxMKTsKKwlpbml0X3NpbGVudChjbWQtPmRlZmF1bHRfc2V0dGluZ3Muc2lsZW50KTsKKworCS8qIFZlcmJvc2UgbGV2ZWwgZm9yIHR0eSBvdXRwdXQgKi8KKwljbWQtPmRlZmF1bHRfc2V0dGluZ3MudmVyYm9zZSA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgbG9nX3ZlcmJvc2VfQ0ZHLCBOVUxMKTsKKwlpbml0X3ZlcmJvc2UoY21kLT5kZWZhdWx0X3NldHRpbmdzLnZlcmJvc2UgKyBWRVJCT1NFX0JBU0VfTEVWRUwpOworCisJLyogTG9nIG1lc3NhZ2UgZm9ybWF0dGluZyAqLworCWluaXRfaW5kZW50KGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGxvZ19pbmRlbnRfQ0ZHLCBOVUxMKSk7CisJaW5pdF9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnMoZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX2Fib3J0X29uX2ludGVybmFsX2Vycm9yc19DRkcsIE5VTEwpKTsKKworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5tc2dfcHJlZml4ID0gZmluZF9jb25maWdfdHJlZV9zdHJfYWxsb3dfZW1wdHkoY21kLCBsb2dfcHJlZml4X0NGRywgTlVMTCk7CisJaW5pdF9tc2dfcHJlZml4KGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5tc2dfcHJlZml4KTsKKworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5jbWRfbmFtZSA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGxvZ19jb21tYW5kX25hbWVzX0NGRywgTlVMTCk7CisJaW5pdF9jbWRfbmFtZShjbWQtPmRlZmF1bHRfc2V0dGluZ3MuY21kX25hbWUpOworCisJLyogVGVzdCBtb2RlICovCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnRlc3QgPQorCSAgICBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfdGVzdF9DRkcsIE5VTEwpOworCWluaXRfdGVzdChjbWQtPmRlZmF1bHRfc2V0dGluZ3MudGVzdCk7CisKKwkvKiBTZXR0aW5ncyBmb3IgbG9nZ2luZyB0byBmaWxlICovCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGxvZ19vdmVyd3JpdGVfQ0ZHLCBOVUxMKSkKKwkJYXBwZW5kID0gMDsKKworCWxvZ19maWxlID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBsb2dfZmlsZV9DRkcsIE5VTEwpOworCisJaWYgKGxvZ19maWxlKSB7CisJCXJlbGVhc2VfbG9nX21lbW9yeSgpOworCQlmaW5fbG9nKCk7CisJCWluaXRfbG9nX2ZpbGUobG9nX2ZpbGUsIGFwcGVuZCk7CisJfQorCisJbG9nX2ZpbGUgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGxvZ19hY3RpdmF0ZV9maWxlX0NGRywgTlVMTCk7CisJaWYgKGxvZ19maWxlKQorCQlpbml0X2xvZ19kaXJlY3QobG9nX2ZpbGUsIGFwcGVuZCk7CisKKwlpbml0X2xvZ193aGlsZV9zdXNwZW5kZWQoZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgbG9nX2FjdGl2YXRpb25fQ0ZHLCBOVUxMKSk7CisKKwljbWQtPmRlZmF1bHRfc2V0dGluZ3MuZGVidWdfY2xhc3NlcyA9IF9wYXJzZV9kZWJ1Z19jbGFzc2VzKGNtZCk7CisJbG9nX2RlYnVnKCJTZXR0aW5nIGxvZyBkZWJ1ZyBjbGFzc2VzIHRvICVkIiwgY21kLT5kZWZhdWx0X3NldHRpbmdzLmRlYnVnX2NsYXNzZXMpOworCWluaXRfZGVidWdfY2xhc3Nlc19sb2dnZWQoY21kLT5kZWZhdWx0X3NldHRpbmdzLmRlYnVnX2NsYXNzZXMpOworCisJdCA9IHRpbWUoTlVMTCk7CisJY3RpbWVfcigmdCwgJnRpbWVidWZbMF0pOworCXRpbWVidWZbMjRdID0gJ1wwJzsKKwlsb2dfdmVyYm9zZSgiTG9nZ2luZyBpbml0aWFsaXNlZCBhdCAlcyIsIHRpbWVidWYpOworCisJLyogVGVsbCBkZXZpY2UtbWFwcGVyIGFib3V0IG91ciBsb2dnaW5nICovCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwlpZiAoIWRtX2xvZ19pc19ub25fZGVmYXVsdCgpKQorCQlkbV9sb2dfd2l0aF9lcnJub19pbml0KHByaW50X2xvZ19saWJkbSk7CisjZW5kaWYKKwlyZXNldF9sb2dfZHVwbGljYXRlZCgpOworCXJlc2V0X2x2bV9lcnJubygxKTsKK30KKworc3RhdGljIGludCBfY2hlY2tfZGlzYWJsZV91ZGV2KGNvbnN0IGNoYXIgKm1zZykgeworCWlmIChnZXRlbnYoIkRNX0RJU0FCTEVfVURFViIpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkRNX0RJU0FCTEVfVURFViBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQuICIKKwkJCQkgIk92ZXJyaWRpbmcgY29uZmlndXJhdGlvbiB0byB1c2UgIgorCQkJCSAidWRldl9ydWxlcz0wLCB1ZGV2X3N5bmM9MCwgdmVyaWZ5X3VkZXZfb3BlcmF0aW9ucz0xLiIpOworCQlpZiAodWRldl9pc19ydW5uaW5nKCkpCisJCQlsb2dfd2FybigiVWRldiBpcyBydW5uaW5nIGFuZCBETV9ESVNBQkxFX1VERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiAiCisJCQkJICJCeXBhc3NpbmcgdWRldiwgTFZNIHdpbGwgJXMuIiwgbXNnKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfY2hlY2tfY29uZmlnX2J5X3NvdXJjZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uZmlnX3NvdXJjZV90IHNvdXJjZSkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdDsKKwlzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqaGFuZGxlOworCisJaWYgKCEoY2Z0ID0gZ2V0X2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIHNvdXJjZSkpIHx8CisJICAgICEoaGFuZGxlID0gZ2V0X2NvbmZpZ190cmVlX2NoZWNrX2hhbmRsZShjbWQsIGNmdCkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBjb25maWdfZGVmX2NoZWNrKGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX2NvbmZpZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpbnQgYWJvcnRfb25fZXJyb3I7CisKKwlpZiAoIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGNvbmZpZ19jaGVja3NfQ0ZHLCBOVUxMKSkKKwkJcmV0dXJuIDE7CisKKwlhYm9ydF9vbl9lcnJvciA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGNvbmZpZ19hYm9ydF9vbl9lcnJvcnNfQ0ZHLCBOVUxMKTsKKworCWlmICgoIV9jaGVja19jb25maWdfYnlfc291cmNlKGNtZCwgQ09ORklHX1NUUklORykgfHwKKwkgICAgIV9jaGVja19jb25maWdfYnlfc291cmNlKGNtZCwgQ09ORklHX01FUkdFRF9GSUxFUykgfHwKKwkgICAgIV9jaGVja19jb25maWdfYnlfc291cmNlKGNtZCwgQ09ORklHX0ZJTEUpKSAmJgorCSAgICBhYm9ydF9vbl9lcnJvcikgeworCQlsb2dfZXJyb3IoIkxWTV8gY29uZmlndXJhdGlvbiBpbnZhbGlkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9zZXRfdGltZV9mb3JtYXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJLyogQ29tcGFyZWQgdG8gc3RyZnRpbWUsIHdlIGRvIG5vdCBhbGxvdyAibmV3bGluZSIgY2hhcmFjdGVyIC0gdGhlICVuIGluIGZvcm1hdC4gKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqYWxsb3dlZF9mb3JtYXRfY2hhcnMgPSAiYUFiQmNDZERlRkdnaEhJamtsbU1wUHJSc1N0VHVVVndXeFh5WXpaJSI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmFsbG93ZWRfYWx0ZXJuYXRpdmVfZm9ybWF0X2NoYXJzX2UgPSAiY0N4WHlZIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYWxsb3dlZF9hbHRlcm5hdGl2ZV9mb3JtYXRfY2hhcnNfbyA9ICJkZUhJbU1TdVVWd1d5IjsKKwlzdGF0aWMgY29uc3QgY2hhciAqY2hhcnNfdG9fY2hlY2s7CisJY29uc3QgY2hhciAqdGYgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF90aW1lX2Zvcm1hdF9DRkcsIE5VTEwpOworCWNvbnN0IGNoYXIgKnBfZm10OworCXNpemVfdCBpOworCWNoYXIgYzsKKworCWlmICghKnRmKSB7CisJCWxvZ19lcnJvcigiQ29uZmlndXJlZCB0aW1lIGZvcm1hdCBpcyBlbXB0eSBzdHJpbmcuIik7CisJCWdvdG8gYmFkOworCX0gZWxzZSB7CisJCXBfZm10ID0gdGY7CisJCXdoaWxlICgoYyA9ICpwX2ZtdCkpIHsKKwkJCWlmIChjID09ICclJykgeworCQkJCWMgPSAqKytwX2ZtdDsKKwkJCQlpZiAoYyA9PSAnRScpIHsKKwkJCQkJYyA9ICorK3BfZm10OworCQkJCQljaGFyc190b19jaGVjayA9IGFsbG93ZWRfYWx0ZXJuYXRpdmVfZm9ybWF0X2NoYXJzX2U7CisJCQkJfSBlbHNlIGlmIChjID09ICdPJykgeworCQkJCQljID0gKisrcF9mbXQ7CisJCQkJCWNoYXJzX3RvX2NoZWNrID0gYWxsb3dlZF9hbHRlcm5hdGl2ZV9mb3JtYXRfY2hhcnNfbzsKKwkJCQl9IGVsc2UKKwkJCQkJY2hhcnNfdG9fY2hlY2sgPSBhbGxvd2VkX2Zvcm1hdF9jaGFyczsKKworCQkJCWZvciAoaSA9IDA7IGNoYXJzX3RvX2NoZWNrW2ldOyBpKyspIHsKKwkJCQkJaWYgKGMgPT0gY2hhcnNfdG9fY2hlY2tbaV0pCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFjaGFyc190b19jaGVja1tpXSkKKwkJCQkJZ290b19iYWQ7CisJCQl9CisJCQllbHNlIGlmIChpc3ByaW50KGMpKQorCQkJCXBfZm10Kys7CisJCQllbHNlIHsKKwkJCQlsb2dfZXJyb3IoIkNvbmZpZ3VyZWQgdGltZSBmb3JtYXQgY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzLiIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRmOworYmFkOgorCWxvZ19lcnJvcigiSW52YWxpZCB0aW1lIGZvcm1hdCBcIiVzXCIgc3VwcGxpZWQuIiwgdGYpOworCXJldHVybiBOVUxMOworfQorCitpbnQgcHJvY2Vzc19wcm9maWxhYmxlX2NvbmZpZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpZiAoIShjbWQtPmRlZmF1bHRfc2V0dGluZ3MudW5pdF9mYWN0b3IgPQorCSAgICAgIGRtX3VuaXRzX3RvX2ZhY3RvcihmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF91bml0c19DRkcsIE5VTEwpLAorCQkJCSAmY21kLT5kZWZhdWx0X3NldHRpbmdzLnVuaXRfdHlwZSwgMSwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCB1bml0cyBzcGVjaWZpY2F0aW9uIik7CisJCXJldHVybiAwOworCX0KKworCWNtZC0+c2lfdW5pdF9jb25zaXN0ZW5jeSA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9zaV91bml0X2NvbnNpc3RlbmN5X0NGRywgTlVMTCk7CisJY21kLT5yZXBvcnRfYmluYXJ5X3ZhbHVlc19hc19udW1lcmljID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgcmVwb3J0X2JpbmFyeV92YWx1ZXNfYXNfbnVtZXJpY19DRkcsIE5VTEwpOworCWNtZC0+cmVwb3J0X21hcmtfaGlkZGVuX2RldmljZXMgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCByZXBvcnRfbWFya19oaWRkZW5fZGV2aWNlc19DRkcsIE5VTEwpOworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5zdWZmaXggPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfc3VmZml4X0NGRywgTlVMTCk7CisJY21kLT5yZXBvcnRfbGlzdF9pdGVtX3NlcGFyYXRvciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X2xpc3RfaXRlbV9zZXBhcmF0b3JfQ0ZHLCBOVUxMKTsKKwlpZiAoIShjbWQtPnRpbWVfZm9ybWF0ID0gX3NldF90aW1lX2Zvcm1hdChjbWQpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaW5pdF9zeXN0ZW1faWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3QgY2hhciAqc291cmNlLCAqc3lzdGVtX2lkOworCWludCBsb2NhbF9zZXQgPSAwOworCisJY21kLT5zeXN0ZW1faWQgPSBOVUxMOworCWNtZC0+dW5rbm93bl9zeXN0ZW1faWQgPSAwOworCisJc3lzdGVtX2lkID0gZmluZF9jb25maWdfdHJlZV9zdHJfYWxsb3dfZW1wdHkoY21kLCBsb2NhbF9zeXN0ZW1faWRfQ0ZHLCBOVUxMKTsKKwlpZiAoc3lzdGVtX2lkICYmICpzeXN0ZW1faWQpCisJCWxvY2FsX3NldCA9IDE7CisKKwlzb3VyY2UgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9zeXN0ZW1faWRfc291cmNlX0NGRywgTlVMTCk7CisJaWYgKCFzb3VyY2UpCisJCXNvdXJjZSA9ICJub25lIjsKKworCS8qIERlZmluaW5nIGxvY2FsIHN5c3RlbV9pZCBidXQgbm90IHVzaW5nIGl0IGlzIHByb2JhYmx5IGEgY29uZmlnIG1pc3Rha2UuICovCisJaWYgKGxvY2FsX3NldCAmJiBzdHJjbXAoc291cmNlLCAibHZtbG9jYWwiKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IGxvY2FsL3N5c3RlbV9pZCBpcyBzZXQsIHNvIHNob3VsZCBnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSBiZSBcImx2bWxvY2FsXCIgbm90IFwiJXNcIj8iLCBzb3VyY2UpOworCisJaWYgKCFzdHJjbXAoc291cmNlLCAibm9uZSIpKQorCQlyZXR1cm4gMTsKKworCWlmICgoc3lzdGVtX2lkID0gX3N5c3RlbV9pZF9mcm9tX3NvdXJjZShjbWQsIHNvdXJjZSkpICYmICpzeXN0ZW1faWQpIHsKKwkJY21kLT5zeXN0ZW1faWQgPSBzeXN0ZW1faWQ7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogVGhlIHNvdXJjZSBmYWlsZWQgdG8gcmVzb2x2ZSBhIHN5c3RlbV9pZC4gIEluIHRoaXMgY2FzZSBhbGxvdworCSAqIFZHcyB3aXRoIG5vIHN5c3RlbV9pZCB0byBiZSBhY2Nlc3NlZCwgYnV0IG5vdCBWR3Mgd2l0aCBhIHN5c3RlbV9pZC4KKwkgKi8KKwlsb2dfd2FybigiV0FSTklORzogTm8gc3lzdGVtIElEIGZvdW5kIGZyb20gc3lzdGVtX2lkX3NvdXJjZSAlcy4iLCBzb3VyY2UpOworCWNtZC0+dW5rbm93bl9zeXN0ZW1faWQgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfY29uZmlnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCW1vZGVfdCBvbGRfdW1hc2s7CisJY29uc3QgY2hhciAqZGV2X2V4dF9pbmZvX3NyYzsKKwljb25zdCBjaGFyICpyZWFkX2FoZWFkOworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJaW50NjRfdCBwdl9taW5fa2I7CisJaW50IHVkZXZfZGlzYWJsZWQgPSAwOworCWNoYXIgc3lzZnNfZGlyW1BBVEhfTUFYXTsKKworCWlmICghX2NoZWNrX2NvbmZpZyhjbWQpKQorCQlyZXR1cm5fMDsKKworCS8qIHVtYXNrICovCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnVtYXNrID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBnbG9iYWxfdW1hc2tfQ0ZHLCBOVUxMKTsKKworCWlmICgob2xkX3VtYXNrID0gdW1hc2soKG1vZGVfdCkgY21kLT5kZWZhdWx0X3NldHRpbmdzLnVtYXNrKSkgIT0KKwkgICAgKG1vZGVfdCkgY21kLT5kZWZhdWx0X3NldHRpbmdzLnVtYXNrKQorCQlsb2dfdmVyYm9zZSgiU2V0IHVtYXNrIGZyb20gJTA0byB0byAlMDRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfdW1hc2ssIGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy51bWFzayk7CisKKwkvKiBkZXYgZGlyICovCisJaWYgKGRtX3NucHJpbnRmKGNtZC0+ZGV2X2Rpciwgc2l6ZW9mKGNtZC0+ZGV2X2RpciksICIlcy8iLAorCQkJIGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgZGV2aWNlc19kaXJfQ0ZHLCBOVUxMKSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRGV2aWNlIGRpcmVjdG9yeSBnaXZlbiBpbiBjb25maWcgZmlsZSB0b28gbG9uZyIpOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwlkbV9zZXRfZGV2X2RpcihjbWQtPmRldl9kaXIpOworCisJaWYgKCFkbV9zZXRfdXVpZF9wcmVmaXgoIkxWTS0iKSkKKwkJcmV0dXJuXzA7CisjZW5kaWYKKworCWRldl9leHRfaW5mb19zcmMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGRldmljZXNfZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlX0NGRywgTlVMTCk7CisJaWYgKGRldl9leHRfaW5mb19zcmMgJiYgIXN0cmNtcChkZXZfZXh0X2luZm9fc3JjLCAibm9uZSIpKQorCQlpbml0X2V4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZShERVZfRVhUX05PTkUpOworCWVsc2UgaWYgKGRldl9leHRfaW5mb19zcmMgJiYgIXN0cmNtcChkZXZfZXh0X2luZm9fc3JjLCAidWRldiIpKQorCQlpbml0X2V4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZShERVZfRVhUX1VERVYpOworCWVsc2UgeworCQlsb2dfZXJyb3IoIkludmFsaWQgZXh0ZXJuYWwgZGV2aWNlIGluZm8gc291cmNlIHNwZWNpZmljYXRpb24uIik7CisJCXJldHVybiAwOworCX0KKworCS8qIHByb2MgZGlyICovCisJaWYgKGRtX3NucHJpbnRmKGNtZC0+cHJvY19kaXIsIHNpemVvZihjbWQtPnByb2NfZGlyKSwgIiVzIiwKKwkJCSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9wcm9jX0NGRywgTlVMTCkpIDwgMCkgeworCQlsb2dfZXJyb3IoIkRldmljZSBkaXJlY3RvcnkgZ2l2ZW4gaW4gY29uZmlnIGZpbGUgdG9vIGxvbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCpjbWQtPnByb2NfZGlyICYmICFkaXJfZXhpc3RzKGNtZC0+cHJvY19kaXIpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBwcm9jIGRpciAlcyBub3QgZm91bmQgLSBzb21lIGNoZWNrcyB3aWxsIGJlIGJ5cGFzc2VkIiwKKwkJCSBjbWQtPnByb2NfZGlyKTsKKwkJY21kLT5wcm9jX2RpclswXSA9ICdcMCc7CisJfQorCisJX2dldF9zeXNmc19kaXIoY21kLCBzeXNmc19kaXIsIHNpemVvZihzeXNmc19kaXIpKTsKKwlkbV9zZXRfc3lzZnNfZGlyKHN5c2ZzX2Rpcik7CisKKwkvKiBhY3RpdmF0aW9uPyAqLworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5hY3RpdmF0aW9uID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX2FjdGl2YXRpb25fQ0ZHLCBOVUxMKTsKKwlzZXRfYWN0aXZhdGlvbihjbWQtPmRlZmF1bHRfc2V0dGluZ3MuYWN0aXZhdGlvbiwgMCk7CisKKwljbWQtPmF1dG9fc2V0X2FjdGl2YXRpb25fc2tpcCA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFjdGl2YXRpb25fYXV0b19zZXRfYWN0aXZhdGlvbl9za2lwX0NGRywgTlVMTCk7CisKKwlyZWFkX2FoZWFkID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBhY3RpdmF0aW9uX3JlYWRhaGVhZF9DRkcsIE5VTEwpOworCWlmICghc3RyY2FzZWNtcChyZWFkX2FoZWFkLCAiYXV0byIpKQorCQljbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfQVVUTzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChyZWFkX2FoZWFkLCAibm9uZSIpKQorCQljbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfTk9ORTsKKwllbHNlIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIHJlYWRhaGVhZCBzcGVjaWZpY2F0aW9uIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgdWRldiBpcyBkaXNhYmxlZCB1c2luZyBETV9ESVNBQkxFX1VERVYgZW52aXJvbm1lbnQKKwkgKiB2YXJpYWJsZSwgb3ZlcnJpZGUgZXhpc3RpbmcgY29uZmlnIGFuZCBoYXJkY29kZSB0aGVzZToKKwkgKiAgIC0gdWRldl9ydWxlcyA9IDAKKwkgKiAgIC0gdWRldl9zeW5jID0gMAorCSAqICAgLSB1ZGV2X2ZhbGxiYWNrID0gMQorCSAqLworCXVkZXZfZGlzYWJsZWQgPSBfY2hlY2tfZGlzYWJsZV91ZGV2KCJtYW5hZ2UgbG9naWNhbCB2b2x1bWUgc3ltbGlua3MgaW4gZGV2aWNlIGRpcmVjdG9yeSIpOworCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnVkZXZfcnVsZXMgPSB1ZGV2X2Rpc2FibGVkID8gMCA6CisJCWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFjdGl2YXRpb25fdWRldl9ydWxlc19DRkcsIE5VTEwpOworCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnVkZXZfc3luYyA9IHVkZXZfZGlzYWJsZWQgPyAwIDoKKwkJZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgYWN0aXZhdGlvbl91ZGV2X3N5bmNfQ0ZHLCBOVUxMKTsKKworCS8qCisJICogU2V0IHVkZXZfZmFsbGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZSBzaW5jZSBpdCByZXF1aXJlcworCSAqIGNoZWNraW5nIERNIGRyaXZlciB2ZXJzaW9uIHdoaWNoIGlzIGFuIGV4dHJhIGlvY3RsIQorCSAqIFRoaXMgYWxzbyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSB1c2Ugb2YgbWFwcGVyL2NvbnRyb2wuCisJICogSWYgdWRldiBpcyBkaXNhYmxlZCBnbG9iYWxseSwgc2V0IGZhbGxiYWNrIG1vZGUgaW1tZWRpYXRlbHkuCisJICovCisJY21kLT5kZWZhdWx0X3NldHRpbmdzLnVkZXZfZmFsbGJhY2sgPSB1ZGV2X2Rpc2FibGVkID8gMSA6IC0xOworCisJaW5pdF9yZXRyeV9kZWFjdGl2YXRpb24oZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgYWN0aXZhdGlvbl9yZXRyeV9kZWFjdGl2YXRpb25fQ0ZHLCBOVUxMKSk7CisKKwlpbml0X2FjdGl2YXRpb25fY2hlY2tzKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFjdGl2YXRpb25fY2hlY2tzX0NGRywgTlVMTCkpOworCisJY21kLT51c2VfbGluZWFyX3RhcmdldCA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFjdGl2YXRpb25fdXNlX2xpbmVhcl90YXJnZXRfQ0ZHLCBOVUxMKTsKKworCWNtZC0+c3RyaXBlX2ZpbGxlciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgYWN0aXZhdGlvbl9taXNzaW5nX3N0cmlwZV9maWxsZXJfQ0ZHLCBOVUxMKTsKKworCS8qIEZJWE1FIE1pc3NpbmcgZXJyb3IgY29kZSBjaGVja3MgZnJvbSB0aGUgc3RhdHMsIG5vdCBsb2dfd2Fybj8sIG5vdGlmeSBpZiBzZXR0aW5nIG92ZXJyaWRkZW4sIGRlbGF5IG1lc3NhZ2UvY2hlY2sgdGlsbCBpdCBpcyBhY3R1YWxseSB1c2VkIChlZyBjb25zaWRlciBpZiBsdm0gc2hlbGwgLSBmaWxlIGNvdWxkIGFwcGVhciBsYXRlciBhZnRlciB0aGlzIGNoZWNrKT8gKi8KKwlpZiAoIXN0cmNtcChjbWQtPnN0cmlwZV9maWxsZXIsICIvZGV2L2lvZXJyb3IiKSAmJgorCSAgICBzdGF0KGNtZC0+c3RyaXBlX2ZpbGxlciwgJnN0KSkKKwkJY21kLT5zdHJpcGVfZmlsbGVyID0gImVycm9yIjsKKworCWlmIChzdHJjbXAoY21kLT5zdHJpcGVfZmlsbGVyLCAiZXJyb3IiKSkgeworCQlpZiAoc3RhdChjbWQtPnN0cmlwZV9maWxsZXIsICZzdCkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBhY3RpdmF0aW9uL21pc3Npbmdfc3RyaXBlX2ZpbGxlciA9IFwiJXNcIiAiCisJCQkJICJpcyBpbnZhbGlkLCIsIGNtZC0+c3RyaXBlX2ZpbGxlcik7CisJCQlsb2dfd2FybigiICAgICAgICAgc3RhdCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWxvZ193YXJuKCJGYWxsaW5nIGJhY2sgdG8gXCJlcnJvclwiIG1pc3Npbmdfc3RyaXBlX2ZpbGxlci4iKTsKKwkJCWNtZC0+c3RyaXBlX2ZpbGxlciA9ICJlcnJvciI7CisJCX0gZWxzZSBpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBhY3RpdmF0aW9uL21pc3Npbmdfc3RyaXBlX2ZpbGxlciA9IFwiJXNcIiAiCisJCQkJICJpcyBub3QgYSBibG9jayBkZXZpY2UuIiwgY21kLT5zdHJpcGVfZmlsbGVyKTsKKwkJCWxvZ193YXJuKCJGYWxsaW5nIGJhY2sgdG8gXCJlcnJvclwiIG1pc3Npbmdfc3RyaXBlX2ZpbGxlci4iKTsKKwkJCWNtZC0+c3RyaXBlX2ZpbGxlciA9ICJlcnJvciI7CisJCX0KKwl9CisKKwlpZiAoKGNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGFjdGl2YXRpb25fbWxvY2tfZmlsdGVyX0NGRywgTlVMTCkpKQorCQlmb3IgKGN2ID0gY24tPnY7IGN2OyBjdiA9IGN2LT5uZXh0KSAKKwkJCWlmICgoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgfHwgIWN2LT52LnN0clswXSkgCisJCQkJbG9nX2Vycm9yKCJJZ25vcmluZyBpbnZhbGlkIGFjdGl2YXRpb24vbWxvY2tfZmlsdGVyIGVudHJ5IGluIGNvbmZpZyBmaWxlIik7CisKKwljbWQtPm1ldGFkYXRhX3JlYWRfb25seSA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9tZXRhZGF0YV9yZWFkX29ubHlfQ0ZHLCBOVUxMKTsKKworCXB2X21pbl9rYiA9IGZpbmRfY29uZmlnX3RyZWVfaW50NjQoY21kLCBkZXZpY2VzX3B2X21pbl9zaXplX0NGRywgTlVMTCk7CisJaWYgKHB2X21pbl9rYiA8IFBWX01JTl9TSVpFX0tCKSB7CisJCWxvZ193YXJuKCJJZ25vcmluZyB0b28gc21hbGwgcHZfbWluX3NpemUgJSIgUFJJZDY0ICJLQiwgdXNpbmcgZGVmYXVsdCAlZEtCLiIsCisJCQkgcHZfbWluX2tiLCBQVl9NSU5fU0laRV9LQik7CisJCXB2X21pbl9rYiA9IFBWX01JTl9TSVpFX0tCOworCX0KKwkvKiBMVk0gc3RvcmVzIHNpemVzIGludGVybmFsbHkgaW4gdW5pdHMgb2YgNTEyLWJ5dGUgc2VjdG9ycy4gKi8KKwlpbml0X3B2X21pbl9zaXplKCh1aW50NjRfdClwdl9taW5fa2IgKiAoMTAyNCA+PiBTRUNUT1JfU0hJRlQpKTsKKworCWNtZC0+Y2hlY2tfcHZfZGV2X3NpemVzID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgbWV0YWRhdGFfY2hlY2tfcHZfZGV2aWNlX3NpemVzX0NGRywgTlVMTCk7CisKKwlpZiAoIXByb2Nlc3NfcHJvZmlsYWJsZV9jb25maWcoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgcmVwb3J0X3R3b193b3JkX3Vua25vd25fZGV2aWNlX0NGRywgTlVMTCkpCisJCWluaXRfdW5rbm93bl9kZXZpY2VfbmFtZSgidW5rbm93biBkZXZpY2UiKTsKKworCWluaXRfZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24KKwkJKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbl9DRkcsIE5VTEwpKTsKKworCWlmICghX2luaXRfc3lzdGVtX2lkKGNtZCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3NldF90YWcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nIGhvc3QgdGFnOiAlcyIsIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bGlibWVtLCB0YWcpKTsKKworCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bGlibWVtLCAmY21kLT50YWdzLCB0YWcpKSB7CisJCWxvZ19lcnJvcigiX3NldF90YWc6IHN0cl9saXN0X2FkZCAlcyBmYWlsZWQiLCB0YWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfaG9zdF9maWx0ZXJzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmhuLAorCQkJICAgICAgIGludCAqcGFzc2VzKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisKKwkqcGFzc2VzID0gMTsKKworCWZvciAoY24gPSBobjsgY247IGNuID0gY24tPnNpYikgeworCQlpZiAoIWNuLT52KQorCQkJY29udGludWU7CisJCWlmICghc3RyY21wKGNuLT5rZXksICJob3N0X2xpc3QiKSkgeworCQkJKnBhc3NlcyA9IDA7CisJCQlpZiAoY24tPnYtPnR5cGUgPT0gRE1fQ0ZHX0VNUFRZX0FSUkFZKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQkJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQkJCWxvZ19lcnJvcigiSW52YWxpZCBob3N0bmFtZSBzdHJpbmcgIgorCQkJCQkJICAiZm9yIHRhZyAlcyIsIGNuLT5rZXkpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKCFzdHJjbXAoY3YtPnYuc3RyLCBjbWQtPmhvc3RuYW1lKSkgeworCQkJCQkqcGFzc2VzID0gMTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghc3RyY21wKGNuLT5rZXksICJob3N0X2ZpbHRlciIpKSB7CisJCQlsb2dfZXJyb3IoImhvc3RfZmlsdGVyIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbml0X3RhZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdG4sICpjbjsKKwljb25zdCBjaGFyICp0YWc7CisJaW50IHBhc3NlczsKKworCS8qIEFjY2VzcyB0YWdzIHNlY3Rpb24gZGlyZWN0bHkgKi8KKwlpZiAoISh0biA9IGZpbmRfY29uZmlnX25vZGUoY21kLCBjZnQsIHRhZ3NfQ0ZHX1NFQ1RJT04pKSB8fCAhdG4tPmNoaWxkKQorCQlyZXR1cm4gMTsKKworCS8qIE5CIGhvc3R0YWdzIDAgd2hlbiBhbHJlYWR5IDEgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBkZWxldGUgdGhlIHRhZyAqLworCWlmICghY21kLT5ob3N0dGFncyAmJiBmaW5kX2NvbmZpZ19ib29sKGNtZCwgY2Z0LCB0YWdzX2hvc3R0YWdzX0NGRykpIHsKKwkJLyogRklYTUUgU3RyaXAgb3V0IGludmFsaWQgY2hhcnM6IG9ubHkgQS1aYS16MC05XysuLSAqLworCQlpZiAoIV9zZXRfdGFnKGNtZCwgY21kLT5ob3N0bmFtZSkpCisJCQlyZXR1cm5fMDsKKwkJY21kLT5ob3N0dGFncyA9IDE7CisJfQorCisJZm9yIChjbiA9IHRuLT5jaGlsZDsgY247IGNuID0gY24tPnNpYikgeworCQlpZiAoY24tPnYpCisJCQljb250aW51ZTsKKwkJdGFnID0gY24tPmtleTsKKwkJaWYgKCp0YWcgPT0gJ0AnKQorCQkJdGFnKys7CisJCWlmICghdmFsaWRhdGVfbmFtZSh0YWcpKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgdGFnIGluIGNvbmZpZyBmaWxlOiAlcyIsIGNuLT5rZXkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNuLT5jaGlsZCkgeworCQkJcGFzc2VzID0gMDsKKwkJCWlmICghX2NoZWNrX2hvc3RfZmlsdGVycyhjbWQsIGNuLT5jaGlsZCwgJnBhc3NlcykpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIXBhc3NlcykKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIV9zZXRfdGFnKGNtZCwgdGFnKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sb2FkX2NvbmZpZ19maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp0YWcsIGludCBsb2NhbCkKK3sKKwlzdGF0aWMgY2hhciBjb25maWdfZmlsZVtQQVRIX01BWF0gPSAiIjsKKwljb25zdCBjaGFyICpmaWxsZXIgPSAiIjsKKwlzdHJ1Y3QgY29uZmlnX3RyZWVfbGlzdCAqY2ZsOworCisJaWYgKCp0YWcpCisJCWZpbGxlciA9ICJfIjsKKwllbHNlIGlmIChsb2NhbCkgeworCQlmaWxsZXIgPSAiIjsKKwkJdGFnID0gImxvY2FsIjsKKwl9CisKKwlpZiAoZG1fc25wcmludGYoY29uZmlnX2ZpbGUsIHNpemVvZihjb25maWdfZmlsZSksICIlcy9sdm0lcyVzLmNvbmYiLAorCQkJIGNtZC0+c3lzdGVtX2RpciwgZmlsbGVyLCB0YWcpIDwgMCkgeworCQlsb2dfZXJyb3IoIkxWTV9TWVNURU1fRElSIG9yIHRhZyB3YXMgdG9vIGxvbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoY2ZsID0gZG1fcG9vbF9hbGxvYyhjbWQtPmxpYm1lbSwgc2l6ZW9mKCpjZmwpKSkpIHsKKwkJbG9nX2Vycm9yKCJjb25maWdfdHJlZV9saXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGNmbC0+Y2Z0ID0gY29uZmlnX2ZpbGVfb3Blbl9hbmRfcmVhZChjb25maWdfZmlsZSwgQ09ORklHX0ZJTEUsIGNtZCkpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfYWRkKCZjbWQtPmNvbmZpZ19maWxlcywgJmNmbC0+bGlzdCk7CisKKwlpZiAoKnRhZykgeworCQlpZiAoIV9pbml0X3RhZ3MoY21kLCBjZmwtPmNmdCkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UKKwkJLyogVXNlIHRlbXBvcmFyeSBjb3B5IG9mIGx2bS5jb25mIHdoaWxlIGxvYWRpbmcgb3RoZXIgZmlsZXMgKi8KKwkJY21kLT5jZnQgPSBjZmwtPmNmdDsKKworCXJldHVybiAxOworfQorCisvKgorICogRmluZCBhbmQgcmVhZCBsdm0uY29uZi4KKyAqLworc3RhdGljIGludCBfaW5pdF9sdm1fY29uZihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwkvKiBObyBjb25maWcgZmlsZSBpZiBMVk1fU1lTVEVNX0RJUiBpcyBlbXB0eSAqLworCWlmICghKmNtZC0+c3lzdGVtX2RpcikgeworCQlpZiAoIShjbWQtPmNmdCA9IGNvbmZpZ19vcGVuKENPTkZJR19GSUxFLCBOVUxMLCAwKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjb25maWcgdHJlZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFfbG9hZF9jb25maWdfZmlsZShjbWQsICIiLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyogUmVhZCBhbnkgYWRkaXRpb25hbCBjb25maWcgZmlsZXMgKi8KK3N0YXRpYyBpbnQgX2luaXRfdGFnX2NvbmZpZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCS8qIFRhZyBsaXN0IG1heSBncm93IHdoaWxlIGluc2lkZSB0aGlzIGxvb3AgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZjbWQtPnRhZ3MpIHsKKwkJaWYgKCFfbG9hZF9jb25maWdfZmlsZShjbWQsIHNsLT5zdHIsIDApKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfcHJvZmlsZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3QgY2hhciAqZGlyOworCisJaWYgKCEoZGlyID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBjb25maWdfcHJvZmlsZV9kaXJfQ0ZHLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJaWYgKCFjbWQtPnByb2ZpbGVfcGFyYW1zKSB7CisJCWlmICghKGNtZC0+cHJvZmlsZV9wYXJhbXMgPSBkbV9wb29sX3phbGxvYyhjbWQtPmxpYm1lbSwgc2l6ZW9mKCpjbWQtPnByb2ZpbGVfcGFyYW1zKSkpKSB7CisJCQlsb2dfZXJyb3IoInByb2ZpbGVfcGFyYW1zIGFsbG9jIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZG1fbGlzdF9pbml0KCZjbWQtPnByb2ZpbGVfcGFyYW1zLT5wcm9maWxlc190b19sb2FkKTsKKwkJZG1fbGlzdF9pbml0KCZjbWQtPnByb2ZpbGVfcGFyYW1zLT5wcm9maWxlcyk7CisJfQorCisJaWYgKCEoZG1fc3RybmNweShjbWQtPnByb2ZpbGVfcGFyYW1zLT5kaXIsIGRpciwgc2l6ZW9mKGNtZC0+cHJvZmlsZV9wYXJhbXMtPmRpcikpKSkgeworCQlsb2dfZXJyb3IoIl9pbml0X3Byb2ZpbGVzOiBkbV9zdHJuY3B5IGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqX21lcmdlX2NvbmZpZ19maWxlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJc3RydWN0IGNvbmZpZ190cmVlX2xpc3QgKmNmbDsKKworCS8qIFJlcGxhY2UgdGVtcG9yYXJ5IGR1cGxpY2F0ZSBjb3B5IG9mIGx2bS5jb25mICovCisJaWYgKGNmdC0+cm9vdCkgeworCQlpZiAoIShjZnQgPSBjb25maWdfb3BlbihDT05GSUdfTUVSR0VEX0ZJTEVTLCBOVUxMLCAwKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjb25maWcgdHJlZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoY2ZsLCAmY21kLT5jb25maWdfZmlsZXMpIHsKKwkJLyogTWVyZ2UgYWxsIGNvbmZpZyB0cmVlcyBpbnRvIGNtZC0+Y2Z0IHVzaW5nIG1lcmdlL3RhZyBydWxlcyAqLworCQlpZiAoIW1lcmdlX2NvbmZpZ190cmVlKGNtZCwgY2Z0LCBjZmwtPmNmdCwgQ09ORklHX01FUkdFX1RZUEVfVEFHUykpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gY2Z0OworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveV90YWdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBkbV9saXN0ICpzbGgsICpzbGh0OworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUoc2xoLCBzbGh0LCAmY21kLT50YWdzKSB7CisJCWRtX2xpc3RfZGVsKHNsaCk7CisJfQorfQorCitpbnQgY29uZmlnX2ZpbGVzX2NoYW5nZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RydWN0IGNvbmZpZ190cmVlX2xpc3QgKmNmbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhjZmwsICZjbWQtPmNvbmZpZ19maWxlcykgeworCQlpZiAoY29uZmlnX2ZpbGVfY2hhbmdlZChjZmwtPmNmdCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2Rlc3Ryb3lfY29uZmlnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBjb25maWdfdHJlZV9saXN0ICpjZmw7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CisJc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUsICp0bXBfcHJvZmlsZTsKKworCS8qCisJICogQ29uZmlndXJhdGlvbiBjYXNjYWRlOgorCSAqIENPTkZJR19TVFJJTkcgLT4gQ09ORklHX1BST0ZJTEUgLT4gQ09ORklHX0ZJTEUvQ09ORklHX01FUkdFRF9GSUxFUworCSAqLworCisJLyogQ09ORklHX0ZJTEUvQ09ORklHX01FUkdFRF9GSUxFUyAqLworCWlmICgoY2Z0ID0gcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIENPTkZJR19NRVJHRURfRklMRVMpKSkKKwkJY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKwllbHNlCisJCXJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBDT05GSUdfRklMRSk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoY2ZsLCAmY21kLT5jb25maWdfZmlsZXMpCisJCWNvbmZpZ19kZXN0cm95KGNmbC0+Y2Z0KTsKKwlkbV9saXN0X2luaXQoJmNtZC0+Y29uZmlnX2ZpbGVzKTsKKworCS8qIENPTkZJR19QUk9GSUxFICovCisJaWYgKGNtZC0+cHJvZmlsZV9wYXJhbXMpIHsKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIENPTkZJR19QUk9GSUxFX0NPTU1BTkQpOworCQlyZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKGNtZCwgQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpOworCQkvKgorCQkgKiBEZXN0cm95IGNvbmZpZyB0cmVlcyBmb3IgYW55IGxvYWRlZCBwcm9maWxlcyBhbmQKKwkJICogbW92ZSB0aGVzZSBwcm9maWxlcyB0byBwcm9maWxlX3RvX2xvYWQgbGlzdC4KKwkJICogV2hlbmV2ZXIgdGhlc2UgcHJvZmlsZXMgYXJlIHJlZmVyZW5jZWQgbGF0ZXIsCisJCSAqIHRoZXkgd2lsbCBnZXQgbG9hZGVkIGFnYWluIGF1dG9tYXRpY2FsbHkuCisJCSAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwcm9maWxlLCB0bXBfcHJvZmlsZSwgJmNtZC0+cHJvZmlsZV9wYXJhbXMtPnByb2ZpbGVzKSB7CisJCQljb25maWdfZGVzdHJveShwcm9maWxlLT5jZnQpOworCQkJcHJvZmlsZS0+Y2Z0ID0gTlVMTDsKKwkJCWRtX2xpc3RfbW92ZSgmY21kLT5wcm9maWxlX3BhcmFtcy0+cHJvZmlsZXNfdG9fbG9hZCwgJnByb2ZpbGUtPmxpc3QpOworCQl9CisJfQorCisJLyogQ09ORklHX1NUUklORyAqLworCWlmICgoY2Z0ID0gcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIENPTkZJR19TVFJJTkcpKSkKKwkJY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKworCWlmIChjbWQtPmNmdCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfZGVzdHJveV9jb25maWc6ICIKKwkJCSAgImNtZCBjb25maWcgdHJlZSBub3QgZGVzdHJveWVkIGZ1bGx5Iik7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfZGV2X2NhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJc2l6ZV90IGxlbiwgdWRldl9kaXJfbGVuID0gc3RybGVuKERNX1VERVZfREVWX0RJUik7CisJaW50IGxlbl9kaWZmOworCWludCBkZXZpY2VfbGlzdF9mcm9tX3VkZXY7CisKKwlpbml0X2Rldl9kaXNhYmxlX2FmdGVyX2Vycm9yX2NvdW50KAorCQlmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGRldmljZXNfZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudF9DRkcsIE5VTEwpKTsKKworCWlmICghZGV2X2NhY2hlX2luaXQoY21kKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIE92ZXJyaWRlIGV4aXN0aW5nIGNvbmZpZyBhbmQgaGFyZGNvZGUgZGV2aWNlX2xpc3RfZnJvbV91ZGV2ID0gMCBpZjoKKwkgKiAgIC0gdWRldiBpcyBub3QgcnVubmluZworCSAqICAgLSB1ZGV2IGlzIGRpc2FibGVkIHVzaW5nIERNX0RJU0FCTEVfVURFViBlbnZpcm9ubWVudCB2YXJpYWJsZQorCSAqLworCWlmIChfY2hlY2tfZGlzYWJsZV91ZGV2KCJvYnRhaW4gZGV2aWNlIGxpc3QgYnkgc2Nhbm5pbmcgZGV2aWNlIGRpcmVjdG9yeSIpKQorCQlkZXZpY2VfbGlzdF9mcm9tX3VkZXYgPSAwOworCWVsc2UKKwkJZGV2aWNlX2xpc3RfZnJvbV91ZGV2ID0gdWRldl9pc19ydW5uaW5nKCkgPworCQkJZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZGV2aWNlc19vYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2X0NGRywgTlVMTCkgOiAwOworCisJaW5pdF9vYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2KGRldmljZV9saXN0X2Zyb21fdWRldik7CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBkZXZpY2VzX3NjYW5fQ0ZHLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmFibGUgdG8gZmluZCBjb25maWd1cmF0aW9uIGZvciBkZXZpY2VzL3NjYW4uIik7CisJCXJldHVybl8wOworCX0KKworCWZvciAoY3YgPSBjbi0+djsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKKwkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCBzdHJpbmcgaW4gY29uZmlnIGZpbGU6ICIKKwkJCQkgICJkZXZpY2VzL3NjYW4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGRldmljZV9saXN0X2Zyb21fdWRldikgeworCQkJbGVuID0gc3RybGVuKGN2LT52LnN0cik7CisKKwkJCS8qCisJCQkgKiBETV9VREVWX0RFVl9ESVIgYWx3YXlzIGhhcyAnLycgYXQgaXRzIGVuZC4KKwkJCSAqIElmIHRoZSBpdGVtIGluIHRoZSBjb25mIGRvZXMgbm90IGhhdmUgaXQsIGJlIHN1cmUKKwkJCSAqIHRvIG1ha2UgdGhlIHJpZ2h0IGNvbXBhcmlzb24gd2l0aG91dCB0aGUgJy8nIGNoYXIhCisJCQkgKi8KKwkJCWxlbl9kaWZmID0gbGVuICYmIGN2LT52LnN0cltsZW4gLSAxXSAhPSAnLycgPworCQkJCQl1ZGV2X2Rpcl9sZW4gLSAxICE9IGxlbiA6CisJCQkJCXVkZXZfZGlyX2xlbiAhPSBsZW47CisKKwkJCWlmIChsZW5fZGlmZiB8fCBzdHJuY21wKERNX1VERVZfREVWX0RJUiwgY3YtPnYuc3RyLCBsZW4pKSB7CisJCQkJbG9nX3ZlcnlfdmVyYm9zZSgiTm9uIHN0YW5kYXJkIHVkZXYgZGlyICVzLCByZXNldHRpbmcgIgorCQkJCQkJICJkZXZpY2VzL29idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXYuIiwKKwkJCQkJCSBjdi0+di5zdHIpOworCQkJCWRldmljZV9saXN0X2Zyb21fdWRldiA9IDA7CisJCQkJaW5pdF9vYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2KDApOworCQkJfQorCQl9CisKKwkJaWYgKCFkZXZfY2FjaGVfYWRkX2Rpcihjdi0+di5zdHIpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgJXMgdG8gaW50ZXJuYWwgZGV2aWNlIGNhY2hlIiwKKwkJCQkgIGN2LT52LnN0cik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghKGNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGRldmljZXNfbG9vcGZpbGVzX0NGRywgTlVMTCkpKQorCQlyZXR1cm4gMTsKKworCWZvciAoY3YgPSBjbi0+djsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKKwkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCBzdHJpbmcgaW4gY29uZmlnIGZpbGU6ICIKKwkJCQkgICJkZXZpY2VzL2xvb3BmaWxlcyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWRldl9jYWNoZV9hZGRfbG9vcGZpbGUoY3YtPnYuc3RyKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIGxvb3BmaWxlICVzIHRvIGludGVybmFsICIKKwkJCQkgICJkZXZpY2UgY2FjaGUiLCBjdi0+di5zdHIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKworCXJldHVybiAxOworfQorCisjZGVmaW5lIE1BWF9GSUxURVJTIDkKKworc3RhdGljIHN0cnVjdCBkZXZfZmlsdGVyICpfaW5pdF9sdm1ldGFkX2ZpbHRlcl9jaGFpbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpbnQgbnJfZmlsdCA9IDA7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyc1tNQVhfRklMVEVSU10gPSB7IDAgfTsKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqY29tcG9zaXRlOworCisJLyoKKwkgKiBGaWx0ZXJzIGxpc3RlZCBpbiBvcmRlcjogdG9wIG9uZSBnZXRzIGFwcGxpZWQgZmlyc3QuCisJICogRmFpbHVyZSB0byBpbml0aWFsaXNlIHNvbWUgZmlsdGVycyBpcyBub3QgZmF0YWwuCisJICogVXBkYXRlIE1BWF9GSUxURVJTIGRlZmluaXRpb24gYWJvdmUgd2hlbiBhZGRpbmcgbmV3IGZpbHRlcnMuCisJICovCisKKwkvKgorCSAqIHN5c2ZzIGZpbHRlci4gT25seSBhdmFpbGFibGUgb24gMi42IGtlcm5lbHMuICBOb24tY3JpdGljYWwuCisJICogTGlzdGVkIGZpcnN0IGJlY2F1c2UgaXQncyB2ZXJ5IGVmZmljaWVudCBhdCBlbGltaW5hdGluZworCSAqIHVuYXZhaWxhYmxlIGRldmljZXMuCisJICovCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGRldmljZXNfc3lzZnNfc2Nhbl9DRkcsIE5VTEwpKSB7CisJCWlmICgoZmlsdGVyc1tucl9maWx0XSA9IHN5c2ZzX2ZpbHRlcl9jcmVhdGUoKSkpCisJCQlucl9maWx0Kys7CisJfQorCisJLyogaW50ZXJuYWwgZmlsdGVyIHVzZWQgYnkgY29tbWFuZCBwcm9jZXNzaW5nLiAqLworCWlmICghKGZpbHRlcnNbbnJfZmlsdF0gPSBpbnRlcm5hbF9maWx0ZXJfY3JlYXRlKCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBpbnRlcm5hbCBkZXZpY2UgZmlsdGVyIik7CisJCWdvdG8gYmFkOworCX0KKwlucl9maWx0Kys7CisKKwkvKiBnbG9iYWwgcmVnZXggZmlsdGVyLiBPcHRpb25hbC4gKi8KKwlpZiAoKGNuID0gZmluZF9jb25maWdfdHJlZV9ub2RlKGNtZCwgZGV2aWNlc19nbG9iYWxfZmlsdGVyX0NGRywgTlVMTCkpKSB7CisJCWlmICghKGZpbHRlcnNbbnJfZmlsdF0gPSByZWdleF9maWx0ZXJfY3JlYXRlKGNuLT52KSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBnbG9iYWwgcmVnZXggZGV2aWNlIGZpbHRlciIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJbnJfZmlsdCsrOworCX0KKworCS8qIHJlZ2V4IGZpbHRlci4gT3B0aW9uYWwuICovCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkgeworCQlpZiAoKGNuID0gZmluZF9jb25maWdfdHJlZV9ub2RlKGNtZCwgZGV2aWNlc19maWx0ZXJfQ0ZHLCBOVUxMKSkpIHsKKwkJCWlmICghKGZpbHRlcnNbbnJfZmlsdF0gPSByZWdleF9maWx0ZXJfY3JlYXRlKGNuLT52KSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgcmVnZXggZGV2aWNlIGZpbHRlciIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJbnJfZmlsdCsrOworCQl9CisJfQorCisJLyogZGV2aWNlIHR5cGUgZmlsdGVyLiBSZXF1aXJlZC4gKi8KKwlpZiAoIShmaWx0ZXJzW25yX2ZpbHRdID0gbHZtX3R5cGVfZmlsdGVyX2NyZWF0ZShjbWQtPmRldl90eXBlcykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBsdm0gdHlwZSBmaWx0ZXIiKTsKKwkJZ290byBiYWQ7CisJfQorCW5yX2ZpbHQrKzsKKworCS8qIHVzYWJsZSBkZXZpY2UgZmlsdGVyLiBSZXF1aXJlZC4gKi8KKwlpZiAoIShmaWx0ZXJzW25yX2ZpbHRdID0gdXNhYmxlX2ZpbHRlcl9jcmVhdGUoY21kLT5kZXZfdHlwZXMsCisJCQkJCQkgICAgICBsdm1ldGFkX3VzZWQoKSA/IEZJTFRFUl9NT0RFX1BSRV9MVk1FVEFECisJCQkJCQkJCSAgICAgOiBGSUxURVJfTU9ERV9OT19MVk1FVEFEKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHVzYWJsZWQgZGV2aWNlIGZpbHRlciIpOworCQlnb3RvIGJhZDsKKwl9CisJbnJfZmlsdCsrOworCisJLyogbXBhdGggY29tcG9uZW50IGZpbHRlci4gT3B0aW9uYWwsIG5vbi1jcml0aWNhbC4gKi8KKwlpZiAoZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZGV2aWNlc19tdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbl9DRkcsIE5VTEwpKSB7CisJCWlmICgoZmlsdGVyc1tucl9maWx0XSA9IG1wYXRoX2ZpbHRlcl9jcmVhdGUoY21kLT5kZXZfdHlwZXMpKSkKKwkJCW5yX2ZpbHQrKzsKKwl9CisKKwkvKiBwYXJ0aXRpb25lZCBkZXZpY2UgZmlsdGVyLiBSZXF1aXJlZC4gKi8KKwlpZiAoIShmaWx0ZXJzW25yX2ZpbHRdID0gcGFydGl0aW9uZWRfZmlsdGVyX2NyZWF0ZShjbWQtPmRldl90eXBlcykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBwYXJ0aXRpb25lZCBkZXZpY2UgZmlsdGVyIik7CisJCWdvdG8gYmFkOworCX0KKwlucl9maWx0Kys7CisKKwkvKiBtZCBjb21wb25lbnQgZmlsdGVyLiBPcHRpb25hbCwgbm9uLWNyaXRpY2FsLiAqLworCWlmIChmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBkZXZpY2VzX21kX2NvbXBvbmVudF9kZXRlY3Rpb25fQ0ZHLCBOVUxMKSkgeworCQlpbml0X21kX2ZpbHRlcmluZygxKTsKKwkJaWYgKChmaWx0ZXJzW25yX2ZpbHRdID0gbWRfZmlsdGVyX2NyZWF0ZShjbWQtPmRldl90eXBlcykpKQorCQkJbnJfZmlsdCsrOworCX0KKworCS8qIGZpcm13YXJlIHJhaWQgZmlsdGVyLiBPcHRpb25hbCwgbm9uLWNyaXRpY2FsLiAqLworCWlmIChmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBkZXZpY2VzX2Z3X3JhaWRfY29tcG9uZW50X2RldGVjdGlvbl9DRkcsIE5VTEwpKSB7CisJCWluaXRfZndyYWlkX2ZpbHRlcmluZygxKTsKKwkJaWYgKChmaWx0ZXJzW25yX2ZpbHRdID0gZndyYWlkX2ZpbHRlcl9jcmVhdGUoY21kLT5kZXZfdHlwZXMpKSkKKwkJCW5yX2ZpbHQrKzsKKwl9CisKKwlpZiAoIShjb21wb3NpdGUgPSBjb21wb3NpdGVfZmlsdGVyX2NyZWF0ZShucl9maWx0LCAxLCBmaWx0ZXJzKSkpCisJCWdvdG9fYmFkOworCisJcmV0dXJuIGNvbXBvc2l0ZTsKKworYmFkOgorCXdoaWxlICgtLW5yX2ZpbHQgPj0gMCkKKwkJIGZpbHRlcnNbbnJfZmlsdF0tPmRlc3Ryb3koZmlsdGVyc1tucl9maWx0XSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFRoZSB3YXkgdGhlIGZpbHRlcmluZyBpcyBpbml0aWFsaXplZCBkZXBlbmRzIG9uIHdoZXRoZXIgbHZtZXRhZCBpcyB1ZXNkIG9yIG5vdC4KKyAqCisgKiBJZiBsdm1ldGFkIGlzIHVzZWQsIHRoZXJlIGFyZSB0aHJlZSBmaWx0ZXIgY2hhaW5zOgorICoKKyAqICAgLSBjbWQtPmx2bWV0YWRfZmlsdGVyIC0gdGhlIGx2bWV0YWQgZmlsdGVyIGNoYWluIHVzZWQgd2hlbiBzY2FubmluZyBkZXZzIGZvciBsdm1ldGFkIHVwZGF0ZToKKyAqICAgICBzeXNmcyBmaWx0ZXIgLT4gaW50ZXJuYWwgZmlsdGVyIC0+IGdsb2JhbCByZWdleCBmaWx0ZXIgLT4gdHlwZSBmaWx0ZXIgLT4KKyAqICAgICB1c2FibGUgZGV2aWNlIGZpbHRlcihGSUxURVJfTU9ERV9QUkVfTFZNRVRBRCkgLT4KKyAqICAgICBtcGF0aCBjb21wb25lbnQgZmlsdGVyIC0+IHBhcnRpdGlvbmVkIGZpbHRlciAtPgorICogICAgIG1kIGNvbXBvbmVudCBmaWx0ZXIgLT4gZncgcmFpZCBmaWx0ZXIKKyAqCisgKiAgIC0gY21kLT5maWx0ZXIgLSB0aGUgZmlsdGVyIGNoYWluIHVzZWQgZm9yIGx2bWV0YWQgcmVzcG9uc2VzOgorICogICAgIHBlcnNpc3RlbnQgZmlsdGVyIC0+IHJlZ2V4X2ZpbHRlciAtPiB1c2FibGUgZGV2aWNlIGZpbHRlcihGSUxURVJfTU9ERV9QT1NUX0xWTUVUQUQpCisgKgorICogICAtIGNtZC0+ZnVsbF9maWx0ZXIgLSB0aGUgZmlsdGVyIGNoYWluIHVzZWQgZm9yIGFsbCB0aGUgcmVtYWluaW5nIHNpdHVhdGlvbnM6CisgKiAgICAgY21kLT5sdm1ldGFkX2ZpbHRlciAtPiBjbWQtPmZpbHRlcgorICoKKyAqIElmIGx2bWV0YWQgaXMgbm90IHVzZWQsIHRoZXJlJ3MganVzdCBvbmUgZmlsdGVyIGNoYWluOgorICoKKyAqICAgLSBjbWQtPmZpbHRlciA9PSBjbWQtPmZ1bGxfZmlsdGVyOgorICogICAgIHBlcnNpc3RlbnQgZmlsdGVyIC0+IHN5c2ZzIGZpbHRlciAtPiBpbnRlcm5hbCBmaWx0ZXIgLT4gZ2xvYmFsIHJlZ2V4IGZpbHRlciAtPgorICogICAgIHJlZ2V4X2ZpbHRlciAtPiB0eXBlIGZpbHRlciAtPiB1c2FibGUgZGV2aWNlIGZpbHRlcihGSUxURVJfTU9ERV9OT19MVk1FVEFEKSAtPgorICogICAgIG1wYXRoIGNvbXBvbmVudCBmaWx0ZXIgLT4gcGFydGl0aW9uZWQgZmlsdGVyIC0+IG1kIGNvbXBvbmVudCBmaWx0ZXIgLT4gZncgcmFpZCBmaWx0ZXIKKyAqCisgKi8KK2ludCBpbml0X2ZpbHRlcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVuc2lnbmVkIGxvYWRfcGVyc2lzdGVudF9jYWNoZSkKK3sKKwljb25zdCBjaGFyICpkZXZfY2FjaGU7CisJc3RydWN0IGRldl9maWx0ZXIgKmZpbHRlciA9IE5VTEwsICpmaWx0ZXJfY29tcG9uZW50c1syXSA9IHswfTsKKwlpbnQgbnJfZmlsdDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCXN0cnVjdCB0aW1lc3BlYyB0cywgY3RzOworCisJaWYgKCFjbWQtPmluaXRpYWxpemVkLmNvbm5lY3Rpb25zKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY29ubmVjdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgZmlsdGVycyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWQtPmR1bXBfZmlsdGVyID0gMDsKKworCWNtZC0+bHZtZXRhZF9maWx0ZXIgPSBfaW5pdF9sdm1ldGFkX2ZpbHRlcl9jaGFpbihjbWQpOworCWlmICghY21kLT5sdm1ldGFkX2ZpbHRlcikKKwkJZ290b19iYWQ7CisKKwlpbml0X2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyhmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBkZXZpY2VzX2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlc19DRkcsIE5VTEwpKTsKKwlpbml0X2lnbm9yZV9sdm1fbWlycm9ycyhmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBkZXZpY2VzX2lnbm9yZV9sdm1fbWlycm9yc19DRkcsIE5VTEwpKTsKKworCS8qCisJICogSWYgbHZtZXRhZCBpcyB1c2VkLCB0aGVyZSdzIGEgc2VwYXJhdGlvbiBiZXR3ZWVuIHByZS1sdm1ldGFkIGZpbHRlciBjaGFpbgorCSAqICgiY21kLT5sdm1ldGFkX2ZpbHRlciIpIGFwcGxpZWQgb25seSBpZiBzY2FubmluZyBmb3IgbHZtZXRhZCB1cGRhdGUgYW5kCisJICogcG9zdC1sdm1ldGFkIGZpbHRlciBjaGFpbiAoImZpbHRlciIpIGFwcGxpZWQgb24gZWFjaCBsdm1ldGFkIHJlc3BvbnNlLgorCSAqIEhvd2V2ZXIsIGlmIGx2bWV0YWQgaXMgbm90IHVzZWQsIHRoZXNlIHR3byBjaGFpbnMgYXJlIG5vdCBzZXBhcmF0ZWQKKwkgKiBhbmQgd2UgdXNlIGV4YWN0bHkgb25lIGZpbHRlciBjaGFpbiBkdXJpbmcgZGV2aWNlIHNjYW5uaW5nICgiZmlsdGVyIgorCSAqIHRoYXQgaW5jbHVkZXMgYWxzbyAiY21kLT5sdm1ldGFkX2ZpbHRlciIgY2hhaW4pLgorCSAqLworCS8qIGZpbHRlciBjb21wb25lbnQgMCAqLworCWlmIChsdm1ldGFkX3VzZWQoKSkgeworCQlucl9maWx0ID0gMDsKKwkJaWYgKChjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBkZXZpY2VzX2ZpbHRlcl9DRkcsIE5VTEwpKSkgeworCQkJaWYgKCEoZmlsdGVyX2NvbXBvbmVudHNbbnJfZmlsdF0gPSByZWdleF9maWx0ZXJfY3JlYXRlKGNuLT52KSkpIHsKKwkJCQlsb2dfdmVyYm9zZSgiRmFpbGVkIHRvIGNyZWF0ZSByZWdleCBkZXZpY2UgZmlsdGVyLiIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJbnJfZmlsdCsrOworCQl9CisJCWlmICghKGZpbHRlcl9jb21wb25lbnRzW25yX2ZpbHRdID0gdXNhYmxlX2ZpbHRlcl9jcmVhdGUoY21kLT5kZXZfdHlwZXMsIEZJTFRFUl9NT0RFX1BPU1RfTFZNRVRBRCkpKSB7CisJCQlsb2dfdmVyYm9zZSgiRmFpbGVkIHRvIGNyZWF0ZSB1c2FibGUgZGV2aWNlIGZpbHRlci4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCW5yX2ZpbHQrKzsKKwkJaWYgKCEoZmlsdGVyID0gY29tcG9zaXRlX2ZpbHRlcl9jcmVhdGUobnJfZmlsdCwgMCwgZmlsdGVyX2NvbXBvbmVudHMpKSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZSB7CisJCWZpbHRlciA9IGNtZC0+bHZtZXRhZF9maWx0ZXI7CisJCWNtZC0+bHZtZXRhZF9maWx0ZXIgPSBOVUxMOworCX0KKworCWlmICghKGRldl9jYWNoZSA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgZGV2aWNlc19jYWNoZV9DRkcsIE5VTEwpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShmaWx0ZXIgPSBwZXJzaXN0ZW50X2ZpbHRlcl9jcmVhdGUoY21kLT5kZXZfdHlwZXMsIGZpbHRlciwgZGV2X2NhY2hlKSkpIHsKKwkJbG9nX3ZlcmJvc2UoIkZhaWxlZCB0byBjcmVhdGUgcGVyc2lzdGVudCBkZXZpY2UgZmlsdGVyLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwljbWQtPmZpbHRlciA9IGZpbHRlcjsKKworCWlmIChsdm1ldGFkX3VzZWQoKSkgeworCQlucl9maWx0ID0gMDsKKwkJZmlsdGVyX2NvbXBvbmVudHNbbnJfZmlsdF0gPSBjbWQtPmx2bWV0YWRfZmlsdGVyOworCQlucl9maWx0Kys7CisJCWZpbHRlcl9jb21wb25lbnRzW25yX2ZpbHRdID0gY21kLT5maWx0ZXI7CisJCW5yX2ZpbHQrKzsKKwkJaWYgKCEoY21kLT5mdWxsX2ZpbHRlciA9IGNvbXBvc2l0ZV9maWx0ZXJfY3JlYXRlKG5yX2ZpbHQsIDAsIGZpbHRlcl9jb21wb25lbnRzKSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UKKwkJY21kLT5mdWxsX2ZpbHRlciA9IGZpbHRlcjsKKworCS8qIFNob3VsZCB3ZSBldmVyIGR1bXAgcGVyc2lzdGVudCBmaWx0ZXIgc3RhdGU/ICovCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGRldmljZXNfd3JpdGVfY2FjaGVfc3RhdGVfQ0ZHLCBOVUxMKSkKKwkJY21kLT5kdW1wX2ZpbHRlciA9IDE7CisKKwlpZiAoISpjbWQtPnN5c3RlbV9kaXIpCisJCWNtZC0+ZHVtcF9maWx0ZXIgPSAwOworCisJLyoKKwkgKiBPbmx5IGxvYWQgcGVyc2lzdGVudCBmaWx0ZXIgZGV2aWNlIGNhY2hlIG9uIHN0YXJ0dXAgaWYgaXQgaXMgbmV3ZXIKKwkgKiB0aGFuIHRoZSBjb25maWcgZmlsZSBhbmQgdGhpcyBpcyBub3QgYSBsb25nLWxpdmVkIHByb2Nlc3MuIEFsc28gYXZvaWQKKwkgKiBpdCB3aGVuIGx2bWV0YWQgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtZXRhZF9DRkcsIE5VTEwpICYmCisJICAgIGxvYWRfcGVyc2lzdGVudF9jYWNoZSAmJiAhY21kLT5pc19sb25nX2xpdmVkICYmCisJICAgICFzdGF0KGRldl9jYWNoZSwgJnN0KSkgeworCQlsdm1fc3RhdF9jdGltKCZ0cywgJnN0KTsKKwkJY3RzID0gY29uZmlnX2ZpbGVfdGltZXN0YW1wKGNtZC0+Y2Z0KTsKKwkJaWYgKHRpbWVzcGVjY21wKCZ0cywgJmN0cywgPikgJiYKKwkJICAgICFwZXJzaXN0ZW50X2ZpbHRlcl9sb2FkKGNtZC0+ZmlsdGVyLCBOVUxMKSkKKwkJCWxvZ192ZXJib3NlKCJGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBkZXZpY2UgY2FjaGUgZnJvbSAlcyIsCisJCQkJICAgIGRldl9jYWNoZSk7CisJfQorCisJY21kLT5pbml0aWFsaXplZC5maWx0ZXJzID0gMTsKKwlyZXR1cm4gMTsKK2JhZDoKKwlpZiAoIWZpbHRlcikgeworCQkvKgorCQkgKiBjb21wb3NpdGUgZmlsdGVyIG5vdCBjcmVhdGVkIC0gZGVzdHJveQorCQkgKiBlYWNoIGNvbXBvbmVudCBkaXJlY3RseQorCQkgKi8KKwkJaWYgKGZpbHRlcl9jb21wb25lbnRzWzBdKQorCQkJZmlsdGVyX2NvbXBvbmVudHNbMF0tPmRlc3Ryb3koZmlsdGVyX2NvbXBvbmVudHNbMF0pOworCQlpZiAoZmlsdGVyX2NvbXBvbmVudHNbMV0pCisJCQlmaWx0ZXJfY29tcG9uZW50c1sxXS0+ZGVzdHJveShmaWx0ZXJfY29tcG9uZW50c1sxXSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogY29tcG9zaXRlIGZpbHRlciBjcmVhdGVkIC0gZGVzdHJveSBpdCAtIHRoaXMKKwkJICogd2lsbCBhbHNvIGRlc3Ryb3kgYW55IG9mIGl0cyBjb21wb25lbnRzCisJCSAqLworCQlmaWx0ZXItPmRlc3Ryb3koZmlsdGVyKTsKKwl9CisKKwkvKiBpZiBsdm1ldGFkIGlzIHVzZWQsIHRoZSBjbWQtPmx2bWV0YWRfZmlsdGVyIGlzIHNlcGFyYXRlICovCisJaWYgKGNtZC0+bHZtZXRhZF9maWx0ZXIpCisJCWNtZC0+bHZtZXRhZF9maWx0ZXItPmRlc3Ryb3koY21kLT5sdm1ldGFkX2ZpbHRlcik7CisKKwljbWQtPmluaXRpYWxpemVkLmZpbHRlcnMgPSAwOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZm9ybWF0X3R5cGUgKmdldF9mb3JtYXRfYnlfbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZm9ybWF0KQoreworICAgICAgICBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKworICAgICAgICBkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZm10LCAmY21kLT5mb3JtYXRzKQorICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChmbXQtPm5hbWUsIGZvcm1hdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAoZm10LT5uYW1lICsgMywgZm9ybWF0KSB8fAorICAgICAgICAgICAgICAgICAgICAoZm10LT5hbGlhcyAmJiAhc3RyY2FzZWNtcChmbXQtPmFsaWFzLCBmb3JtYXQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbXQ7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfZm9ybWF0cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpmb3JtYXQ7CisKKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKworI2lmZGVmIEhBVkVfTElCREwKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworI2VuZGlmCisKKyNpZmRlZiBMVk0xX0lOVEVSTkFMCisJaWYgKCEoZm10ID0gaW5pdF9sdm0xX2Zvcm1hdChjbWQpKSkKKwkJcmV0dXJuIDA7CisJZm10LT5saWJyYXJ5ID0gTlVMTDsKKwlkbV9saXN0X2FkZCgmY21kLT5mb3JtYXRzLCAmZm10LT5saXN0KTsKKyNlbmRpZgorCisjaWZkZWYgUE9PTF9JTlRFUk5BTAorCWlmICghKGZtdCA9IGluaXRfcG9vbF9mb3JtYXQoY21kKSkpCisJCXJldHVybiAwOworCWZtdC0+bGlicmFyeSA9IE5VTEw7CisJZG1fbGlzdF9hZGQoJmNtZC0+Zm9ybWF0cywgJmZtdC0+bGlzdCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCREwKKwkvKiBMb2FkIGFueSBmb3JtYXRzIGluIHNoYXJlZCBsaWJzIGlmIG5vdCBzdGF0aWMgKi8KKwlpZiAoIWlzX3N0YXRpYygpICYmCisJICAgIChjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBnbG9iYWxfZm9ybWF0X2xpYnJhcmllc19DRkcsIE5VTEwpKSkgeworCisJCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCQlzdHJ1Y3QgZm9ybWF0X3R5cGUgKigqaW5pdF9mb3JtYXRfZm4pIChzdHJ1Y3QgY21kX2NvbnRleHQgKik7CisJCXZvaWQgKmxpYjsKKworCQlmb3IgKGN2ID0gY24tPnY7IGN2OyBjdiA9IGN2LT5uZXh0KSB7CisJCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJCWxvZ19lcnJvcigiSW52YWxpZCBzdHJpbmcgaW4gY29uZmlnIGZpbGU6ICIKKwkJCQkJICAiZ2xvYmFsL2Zvcm1hdF9saWJyYXJpZXMiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghKGxpYiA9IGxvYWRfc2hhcmVkX2xpYnJhcnkoY21kLCBjdi0+di5zdHIsCisJCQkJCQkJImZvcm1hdCIsIDApKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJaWYgKCEoaW5pdF9mb3JtYXRfZm4gPSBkbHN5bShsaWIsICJpbml0X2Zvcm1hdCIpKSkgeworCQkJCWxvZ19lcnJvcigiU2hhcmVkIGxpYnJhcnkgJXMgZG9lcyBub3QgY29udGFpbiAiCisJCQkJCSAgImZvcm1hdCBmdW5jdGlvbnMiLCBjdi0+di5zdHIpOworCQkJCWRsY2xvc2UobGliKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKCEoZm10ID0gaW5pdF9mb3JtYXRfZm4oY21kKSkpIHsKKwkJCQlkbGNsb3NlKGxpYik7CisJCQkJcmV0dXJuXzA7CisJCQl9CisKKwkJCWZtdC0+bGlicmFyeSA9IGxpYjsKKwkJCWRtX2xpc3RfYWRkKCZjbWQtPmZvcm1hdHMsICZmbXQtPmxpc3QpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoIShmbXQgPSBjcmVhdGVfdGV4dF9mb3JtYXQoY21kKSkpCisJCXJldHVybiAwOworCWZtdC0+bGlicmFyeSA9IE5VTEw7CisJZG1fbGlzdF9hZGQoJmNtZC0+Zm9ybWF0cywgJmZtdC0+bGlzdCk7CisKKwljbWQtPmZtdF9iYWNrdXAgPSBmbXQ7CisKKwlmb3JtYXQgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9mb3JtYXRfQ0ZHLCBOVUxMKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmbXQsICZjbWQtPmZvcm1hdHMpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGZtdC0+bmFtZSwgZm9ybWF0KSB8fAorCQkgICAgKGZtdC0+YWxpYXMgJiYgIXN0cmNhc2VjbXAoZm10LT5hbGlhcywgZm9ybWF0KSkpIHsKKwkJCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5mbXRfbmFtZSA9IGZtdC0+bmFtZTsKKwkJCWNtZC0+Zm10ID0gZm10OworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlsb2dfZXJyb3IoIl9pbml0X2Zvcm1hdHM6IERlZmF1bHQgZm9ybWF0ICglcykgbm90IGZvdW5kIiwgZm9ybWF0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGluaXRfbHZtY2FjaGVfb3JwaGFucyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmbXQsICZjbWQtPmZvcm1hdHMpCisJCWlmICghbHZtY2FjaGVfYWRkX29ycGhhbl92Z2luZm8oZm10LT5vcnBoYW5fdmdfbmFtZSwgZm10KSkKKwkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBzZWd0eXBlX2xpYnJhcnkgeworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCXZvaWQgKmxpYjsKKwljb25zdCBjaGFyICpsaWJuYW1lOworfTsKKworaW50IGx2bV9yZWdpc3Rlcl9zZWd0eXBlKHN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYiwKKwkJCSBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUyOworCisJc2VndHlwZS0+bGlicmFyeSA9IHNlZ2xpYi0+bGliOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZ3R5cGUyLCAmc2VnbGliLT5jbWQtPnNlZ3R5cGVzKSB7CisJCWlmIChzdHJjbXAoc2VndHlwZTItPm5hbWUsIHNlZ3R5cGUtPm5hbWUpKQorCQkJY29udGludWU7CisJCWxvZ19lcnJvcigiRHVwbGljYXRlIHNlZ21lbnQgdHlwZSAlczogIgorCQkJICAidW5sb2FkaW5nIHNoYXJlZCBsaWJyYXJ5ICVzIiwKKwkJCSAgc2VndHlwZS0+bmFtZSwgc2VnbGliLT5saWJuYW1lKTsKKwkJc2VndHlwZS0+b3BzLT5kZXN0cm95KHNlZ3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbV9saXN0X2FkZCgmc2VnbGliLT5jbWQtPnNlZ3R5cGVzLCAmc2VndHlwZS0+bGlzdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaW5pdF9zaW5nbGVfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQlzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICpzZWdsaWIpCit7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqKCppbml0X3NlZ3R5cGVfZm4pIChzdHJ1Y3QgY21kX2NvbnRleHQgKik7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCWlmICghKGluaXRfc2VndHlwZV9mbiA9IGRsc3ltKHNlZ2xpYi0+bGliLCAiaW5pdF9zZWd0eXBlIikpKSB7CisJCWxvZ19lcnJvcigiU2hhcmVkIGxpYnJhcnkgJXMgZG9lcyBub3QgY29udGFpbiBzZWdtZW50IHR5cGUgIgorCQkJICAiZnVuY3Rpb25zIiwgc2VnbGliLT5saWJuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoc2VndHlwZSA9IGluaXRfc2VndHlwZV9mbihzZWdsaWItPmNtZCkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBsdm1fcmVnaXN0ZXJfc2VndHlwZShzZWdsaWIsIHNlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF9pbml0X3NlZ3R5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWludCBpOworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IHNlZ3R5cGVfbGlicmFyeSBzZWdsaWIgPSB7IC5jbWQgPSBjbWQsIC5saWIgPSBOVUxMIH07CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqKCppbml0X3NlZ3R5cGVfYXJyYXlbXSkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpID0geworCQlpbml0X3N0cmlwZWRfc2VndHlwZSwKKwkJaW5pdF96ZXJvX3NlZ3R5cGUsCisJCWluaXRfZXJyb3Jfc2VndHlwZSwKKwkJLyogZGlzYWJsZWQgdW50aWwgbmVlZGVkIGluaXRfZnJlZV9zZWd0eXBlLCAqLworI2lmZGVmIFNOQVBTSE9UX0lOVEVSTkFMCisJCWluaXRfc25hcHNob3Rfc2VndHlwZSwKKyNlbmRpZgorI2lmZGVmIE1JUlJPUkVEX0lOVEVSTkFMCisJCWluaXRfbWlycm9yZWRfc2VndHlwZSwKKyNlbmRpZgorCQlOVUxMCisJfTsKKworI2lmZGVmIEhBVkVfTElCREwKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpbml0X3NlZ3R5cGVfYXJyYXlbaV07IGkrKykgeworCQlpZiAoIShzZWd0eXBlID0gaW5pdF9zZWd0eXBlX2FycmF5W2ldKGNtZCkpKQorCQkJcmV0dXJuIDA7CisJCXNlZ3R5cGUtPmxpYnJhcnkgPSBOVUxMOworCQlkbV9saXN0X2FkZCgmY21kLT5zZWd0eXBlcywgJnNlZ3R5cGUtPmxpc3QpOworCX0KKworI2lmZGVmIFJFUExJQ0FUT1JfSU5URVJOQUwKKwlpZiAoIWluaXRfcmVwbGljYXRvcl9zZWd0eXBlKGNtZCwgJnNlZ2xpYikpCisJCXJldHVybiAwOworI2VuZGlmCisKKyNpZmRlZiBSQUlEX0lOVEVSTkFMCisJaWYgKCFpbml0X3JhaWRfc2VndHlwZXMoY21kLCAmc2VnbGliKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworI2lmZGVmIFRISU5fSU5URVJOQUwKKwlpZiAoIWluaXRfdGhpbl9zZWd0eXBlcyhjbWQsICZzZWdsaWIpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisjaWZkZWYgQ0FDSEVfSU5URVJOQUwKKwlpZiAoIWluaXRfY2FjaGVfc2VndHlwZXMoY21kLCAmc2VnbGliKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCREwKKwkvKiBMb2FkIGFueSBmb3JtYXRzIGluIHNoYXJlZCBsaWJzIHVubGVzcyBzdGF0aWMgKi8KKwlpZiAoIWlzX3N0YXRpYygpICYmCisJICAgIChjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBnbG9iYWxfc2VnbWVudF9saWJyYXJpZXNfQ0ZHLCBOVUxMKSkpIHsKKworCQljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwkJaW50ICgqaW5pdF9tdWx0aXBsZV9zZWd0eXBlc19mbikgKHN0cnVjdCBjbWRfY29udGV4dCAqLAorCQkJCQkJICBzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICopOworCisJCWZvciAoY3YgPSBjbi0+djsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKKwkJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQkJbG9nX2Vycm9yKCJJbnZhbGlkIHN0cmluZyBpbiBjb25maWcgZmlsZTogIgorCQkJCQkgICJnbG9iYWwvc2VnbWVudF9saWJyYXJpZXMiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNlZ2xpYi5saWJuYW1lID0gY3YtPnYuc3RyOworCQkJaWYgKCEoc2VnbGliLmxpYiA9IGxvYWRfc2hhcmVkX2xpYnJhcnkoY21kLAorCQkJCQkJCXNlZ2xpYi5saWJuYW1lLAorCQkJCQkJCSJzZWdtZW50IHR5cGUiLCAwKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICgoaW5pdF9tdWx0aXBsZV9zZWd0eXBlc19mbiA9CisJCQkgICAgZGxzeW0oc2VnbGliLmxpYiwgImluaXRfbXVsdGlwbGVfc2VndHlwZXMiKSkpIHsKKwkJCQlpZiAoZGxzeW0oc2VnbGliLmxpYiwgImluaXRfc2VndHlwZSIpKQorCQkJCQlsb2dfd2FybigiV0FSTklORzogU2hhcmVkIGxpYiAlcyBoYXMgIgorCQkJCQkJICJjb25mbGljdGluZyBpbml0IGZucy4gIFVzaW5nIgorCQkJCQkJICIgaW5pdF9tdWx0aXBsZV9zZWd0eXBlcygpLiIsCisJCQkJCQkgc2VnbGliLmxpYm5hbWUpOworCQkJfSBlbHNlCisJCQkJaW5pdF9tdWx0aXBsZV9zZWd0eXBlc19mbiA9CisJCQkJICAgIF9pbml0X3NpbmdsZV9zZWd0eXBlOworIAorCQkJaWYgKCFpbml0X211bHRpcGxlX3NlZ3R5cGVzX2ZuKGNtZCwgJnNlZ2xpYikpIHsKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqc2d0bCwgKnRtcDsKKwkJCQlsb2dfZXJyb3IoImluaXRfbXVsdGlwbGVfc2VndHlwZXMoKSBmYWlsZWQ6ICIKKwkJCQkJICAiVW5sb2FkaW5nIHNoYXJlZCBsaWJyYXJ5ICVzIiwKKwkJCQkJICBzZWdsaWIubGlibmFtZSk7CisJCQkJZG1fbGlzdF9pdGVyYXRlX3NhZmUoc2d0bCwgdG1wLCAmY21kLT5zZWd0eXBlcykgeworCQkJCQlzZWd0eXBlID0gZG1fbGlzdF9pdGVtKHNndGwsIHN0cnVjdCBzZWdtZW50X3R5cGUpOworCQkJCQlpZiAoc2VndHlwZS0+bGlicmFyeSA9PSBzZWdsaWIubGliKSB7CisJCQkJCQlkbV9saXN0X2RlbCgmc2VndHlwZS0+bGlzdCk7CisJCQkJCQlzZWd0eXBlLT5vcHMtPmRlc3Ryb3koc2VndHlwZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZGxjbG9zZShzZWdsaWIubGliKTsKKwkJCQlyZXR1cm5fMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfaG9zdG5hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJaWYgKHVuYW1lKCZ1dHMpKSB7CisJCWxvZ19zeXNfZXJyb3IoInVuYW1lIiwgIl9pbml0X2hvc3RuYW1lIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGNtZC0+aG9zdG5hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPmxpYm1lbSwgdXRzLm5vZGVuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJfaW5pdF9ob3N0bmFtZTogZG1fcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGNtZC0+a2VybmVsX3ZzbiA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bGlibWVtLCB1dHMucmVsZWFzZSkpKSB7CisJCWxvZ19lcnJvcigiX2luaXRfaG9zdG5hbWU6IGRtX3Bvb2xfc3RyZHVwIGtlcm5lbF92c24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbml0X2JhY2t1cChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwl1aW50MzJfdCBkYXlzLCBtaW47CisJY29uc3QgY2hhciAqZGlyOworCisJaWYgKCFjbWQtPnN5c3RlbV9kaXJbMF0pIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IE1ldGFkYXRhIGNoYW5nZXMgd2lsbCBOT1QgYmUgYmFja2VkIHVwIik7CisJCWJhY2t1cF9pbml0KGNtZCwgIiIsIDApOworCQlhcmNoaXZlX2luaXQoY21kLCAiIiwgMCwgMCwgMCk7CisJCXJldHVybiAxOworCX0KKworCS8qIHNldCB1cCBhcmNoaXZpbmcgKi8KKwljbWQtPmRlZmF1bHRfc2V0dGluZ3MuYXJjaGl2ZSA9CisJICAgIGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGJhY2t1cF9hcmNoaXZlX0NGRywgTlVMTCk7CisKKwlkYXlzID0gKHVpbnQzMl90KSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGJhY2t1cF9yZXRhaW5fZGF5c19DRkcsIE5VTEwpOworCisJbWluID0gKHVpbnQzMl90KSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGJhY2t1cF9yZXRhaW5fbWluX0NGRywgTlVMTCk7CisKKwlpZiAoIShkaXIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGJhY2t1cF9hcmNoaXZlX2Rpcl9DRkcsIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWFyY2hpdmVfaW5pdChjbWQsIGRpciwgZGF5cywgbWluLAorCQkJICBjbWQtPmRlZmF1bHRfc2V0dGluZ3MuYXJjaGl2ZSkpIHsKKwkJbG9nX2RlYnVnKCJhcmNoaXZlX2luaXQgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGJhY2t1cCAqLworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5iYWNrdXAgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBiYWNrdXBfYmFja3VwX0NGRywgTlVMTCk7CisKKwlpZiAoIShkaXIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGJhY2t1cF9iYWNrdXBfZGlyX0NGRywgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghYmFja3VwX2luaXQoY21kLCBkaXIsIGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5iYWNrdXApKSB7CisJCWxvZ19kZWJ1ZygiYmFja3VwX2luaXQgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2luaXRfcmFuZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpZiAocmVhZF91cmFuZG9tKCZjbWQtPnJhbmRfc2VlZCwgc2l6ZW9mKGNtZC0+cmFuZF9zZWVkKSkpIHsKKwkJcmVzZXRfbHZtX2Vycm5vKDEpOworCQlyZXR1cm47CisJfQorCisJY21kLT5yYW5kX3NlZWQgPSAodW5zaWduZWQpIHRpbWUoTlVMTCkgKyAodW5zaWduZWQpIGdldHBpZCgpOworCXJlc2V0X2x2bV9lcnJubygxKTsKK30KKworc3RhdGljIHZvaWQgX2luaXRfZ2xvYmFscyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpbml0X2Z1bGxfc2Nhbl9kb25lKDApOworCWluaXRfbWlycm9yX2luX3N5bmMoMCk7Cit9CisKKy8qCisgKiBDbG9zZSBhbmQgcmVvcGVuIHN0cmVhbSBvbiBmaWxlIGRlc2NyaXB0b3IgZmQuCisgKi8KK3N0YXRpYyBpbnQgX3Jlb3Blbl9zdHJlYW0oRklMRSAqc3RyZWFtLCBpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIEZJTEUgKipuZXdfc3RyZWFtKQoreworCWludCBmZF9jb3B5LCBuZXdfZmQ7CisKKwlpZiAoKGZkX2NvcHkgPSBkdXAoZmQpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigiZHVwIiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmY2xvc2Uoc3RyZWFtKSkKKwkJbG9nX3N5c19lcnJvcigiZmNsb3NlIiwgbmFtZSk7CisKKwlpZiAoKG5ld19mZCA9IGR1cDIoZmRfY29weSwgZmQpKSA8IDApCisJCWxvZ19zeXNfZXJyb3IoImR1cDIiLCBuYW1lKTsKKwllbHNlIGlmIChuZXdfZmQgIT0gZmQpCisJCWxvZ19lcnJvcigiZHVwMiglZCwgJWQpIHJldHVybmVkICVkIiwgZmRfY29weSwgZmQsIG5ld19mZCk7CisKKwlpZiAoY2xvc2UoZmRfY29weSkgPCAwKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIG5hbWUpOworCisJaWYgKCEoKm5ld19zdHJlYW0gPSBmZG9wZW4oZmQsIG1vZGUpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmZG9wZW4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBpbml0X2Nvbm5lY3Rpb25zKCk7CisgKiAgIF9pbml0X2x2bWV0YWQoKTsKKyAqICAgICBsdm1ldGFkX2Rpc2Nvbm5lY3QoKTsgIChjbG9zZSBwcmV2aW91cyBjb25uZWN0aW9uKQorICogICAgIGx2bWV0YWRfc2V0X3NvY2tldCgpOyAgKHNldCBwYXRoIGZyb20gY29uZmlnKQorICogICAgIGx2bWV0YWRfc2V0X3Rva2VuKCk7ICAgKHNldCB0b2tlbiBmcm9tIGZpbHRlciBjb25maWcpCisgKiAgICAgaWYgKGZpbmRfY29uZmlnKHVzZV9sdm1ldGFkKSkKKyAqICAgICAgIGx2bWV0YWRfY29ubmVjdCgpOworICoKKyAqIElmIGx2bWV0YWRfY29ubmVjdCgpIGlzIHN1Y2Nlc3NmdWwsIGx2bWV0YWRfdXNlZCgpIHdpbGwKKyAqIHJldHVybiAxLgorICoKKyAqIElmIHRoZSBjb25maWcgaGFzIHVzZV9sdm1ldGFkPTAsIHRoZW4gbHZtZXRhZF9jb25uZWN0KCkKKyAqIHdpbGwgbm90IGJlIGNhbGxlZCwgYW5kIGx2bWV0YWRfdXNlZCgpIHdpbGwgcmV0dXJuIDAuCisgKgorICogT3RoZXIgY29kZSBzaG91bGQgdXNlIGx2bWV0YWRfdXNlZCgpIHRvIGNoZWNrIGlmIHRoZQorICogY29tbWFuZCBpcyB1c2luZyBsdm1ldGFkLgorICoKKyAqLworCitzdGF0aWMgaW50IF9pbml0X2x2bWV0YWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBjaGFyICpsdm1ldGFkX3NvY2tldDsKKworCWx2bWV0YWRfZGlzY29ubmVjdCgpOworCisJbHZtZXRhZF9zb2NrZXQgPSBnZXRlbnYoIkxWTV9MVk1FVEFEX1NPQ0tFVCIpOworCWlmICghbHZtZXRhZF9zb2NrZXQpCisJCWx2bWV0YWRfc29ja2V0ID0gREVGQVVMVF9SVU5fRElSICIvbHZtZXRhZC5zb2NrZXQiOworCisJLyogVE9ETz8KKwkJbHZtZXRhZF9zb2NrZXQgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsICJsdm1ldGFkL3NvY2tldF9wYXRoIiwKKwkJCQkJCSAgICAgIERFRkFVTFRfUlVOX0RJUiAiL2x2bWV0YWQuc29ja2V0Iik7CisJKi8KKworCWx2bWV0YWRfc2V0X3NvY2tldChsdm1ldGFkX3NvY2tldCk7CisJY24gPSBmaW5kX2NvbmZpZ190cmVlX2FycmF5KGNtZCwgZGV2aWNlc19nbG9iYWxfZmlsdGVyX0NGRywgTlVMTCk7CisJbHZtZXRhZF9zZXRfdG9rZW4oY24gPyBjbi0+diA6IE5VTEwpOworCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgZ2xvYmFsX2xvY2tpbmdfdHlwZV9DRkcsIE5VTEwpID09IDMgJiYKKwkgICAgZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX3VzZV9sdm1ldGFkX0NGRywgTlVMTCkpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgbG9ja2luZ190eXBlIGlzIDMgKGNsdXN0ZXJlZCkuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX3VzZV9sdm1ldGFkX0NGRywgTlVMTCkpIHsKKwkJaWYgKGx2bWV0YWRfcGlkZmlsZV9wcmVzZW50KCkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNvbmZpZyBzZXR0aW5nIHVzZV9sdm1ldGFkPTAuIik7CisJCQlsb2dfd2FybigiV0FSTklORzogVG8gYXZvaWQgY29ycnVwdGlvbiwgcmVzY2FuIGRldmljZXMgdG8gbWFrZSBjaGFuZ2VzIHZpc2libGUgKHB2c2NhbiAtLWNhY2hlKS4iKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWx2bWV0YWRfY29ubmVjdChjbWQpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBGYWlsZWQgdG8gY29ubmVjdCB0byBsdm1ldGFkLiBGYWxsaW5nIGJhY2sgdG8gZGV2aWNlIHNjYW5uaW5nLiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpKSB7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJsdm1ldGFkIHNldHVwIGluY29ycmVjdCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaW5pdF9sdm1wb2xsZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpsdm1wb2xsZF9zb2NrZXQ7CisKKwlsdm1wb2xsZF9kaXNjb25uZWN0KCk7CisKKwlsdm1wb2xsZF9zb2NrZXQgPSBnZXRlbnYoIkxWTV9MVk1QT0xMRF9TT0NLRVQiKTsKKwlpZiAoIWx2bXBvbGxkX3NvY2tldCkKKwkJbHZtcG9sbGRfc29ja2V0ID0gREVGQVVMVF9SVU5fRElSICIvbHZtcG9sbGQuc29ja2V0IjsKKwlsdm1wb2xsZF9zZXRfc29ja2V0KGx2bXBvbGxkX3NvY2tldCk7CisKKwlsdm1wb2xsZF9zZXRfYWN0aXZlKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtcG9sbGRfQ0ZHLCBOVUxMKSk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBpbml0X2Nvbm5lY3Rpb25zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCisJaWYgKCFfaW5pdF9sdm1ldGFkKGNtZCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBsdm1ldGFkIGNvbm5lY3Rpb24uIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghX2luaXRfbHZtcG9sbGQoY21kKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIGx2bXBvbGxkIGNvbm5lY3Rpb24uIik7CisJCWdvdG8gYmFkOworCX0KKworCWNtZC0+aW5pdGlhbGl6ZWQuY29ubmVjdGlvbnMgPSAxOworCXJldHVybiAxOworYmFkOgorCWNtZC0+aW5pdGlhbGl6ZWQuY29ubmVjdGlvbnMgPSAwOworCXJldHVybiAwOworfQorCit2b2lkIGRlc3Ryb3lfY29uZmlnX2NvbnRleHQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJX2Rlc3Ryb3lfY29uZmlnKGNtZCk7CisKKwlpZiAoY21kLT5tZW0pCisJCWRtX3Bvb2xfZGVzdHJveShjbWQtPm1lbSk7CisJaWYgKGNtZC0+bGlibWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koY21kLT5saWJtZW0pOworCisJZG1fZnJlZShjbWQpOworfQorCisvKgorICogQSAiY29uZmlnIGNvbnRleHQiIGlzIGEgdmVyeSBsaWdodCB3ZWlnaHQgdG9vbGNvbnRleHQgdGhhdAorICogaXMgb25seSB1c2VkIGZvciByZWFkaW5nIGNvbmZpZyBzZXR0aW5ncyBmcm9tIGx2bS5jb25mLgorICovCitzdHJ1Y3QgY21kX2NvbnRleHQgKmNyZWF0ZV9jb25maWdfY29udGV4dCh2b2lkKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCisJaWYgKCEoY21kID0gZG1femFsbG9jKHNpemVvZigqY21kKSkpKQorCQlnb3RvX291dDsKKworCXN0cmNweShjbWQtPnN5c3RlbV9kaXIsIERFRkFVTFRfU1lTX0RJUik7CisKKwlpZiAoIV9nZXRfZW52X3ZhcnMoY21kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShjbWQtPmxpYm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJsaWJyYXJ5IiwgNCAqIDEwMjQpKSkKKwkJZ290b19vdXQ7CisKKwlkbV9saXN0X2luaXQoJmNtZC0+Y29uZmlnX2ZpbGVzKTsKKworCWlmICghX2luaXRfbHZtX2NvbmYoY21kKSkKKwkJZ290b19vdXQ7CisKKwlyZXR1cm4gY21kOworb3V0OgorCWlmIChjbWQpCisJCWRlc3Ryb3lfY29uZmlnX2NvbnRleHQoY21kKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRW50cnkgcG9pbnQgKi8KK3N0cnVjdCBjbWRfY29udGV4dCAqY3JlYXRlX3Rvb2xjb250ZXh0KHVuc2lnbmVkIGlzX2xvbmdfbGl2ZWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnN5c3RlbV9kaXIsCisJCQkJICAgICAgIHVuc2lnbmVkIHNldF9idWZmZXJpbmcsCisJCQkJICAgICAgIHVuc2lnbmVkIHRocmVhZGVkLAorCQkJCSAgICAgICB1bnNpZ25lZCBzZXRfY29ubmVjdGlvbnMsCisJCQkJICAgICAgIHVuc2lnbmVkIHNldF9maWx0ZXJzKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCUZJTEUgKm5ld19zdHJlYW07CisJaW50IGZsYWdzOworCisjaWZkZWYgTV9NTUFQX01BWAorCW1hbGxvcHQoTV9NTUFQX01BWCwgMCk7CisjZW5kaWYKKworCWlmICghc2V0bG9jYWxlKExDX0FMTCwgIiIpKQorCQlsb2dfdmVyeV92ZXJib3NlKCJzZXRsb2NhbGUgZmFpbGVkIik7CisKKyNpZmRlZiBJTlRMX1BBQ0tBR0UKKwliaW5kdGV4dGRvbWFpbihJTlRMX1BBQ0tBR0UsIExPQ0FMRURJUik7CisjZW5kaWYKKworCWluaXRfc3lzbG9nKERFRkFVTFRfTE9HX0ZBQ0lMSVRZKTsKKworCWlmICghKGNtZCA9IGRtX3phbGxvYyhzaXplb2YoKmNtZCkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjb21tYW5kIGNvbnRleHQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNtZC0+aXNfbG9uZ19saXZlZCA9IGlzX2xvbmdfbGl2ZWQ7CisJY21kLT50aHJlYWRlZCA9IHRocmVhZGVkID8gMSA6IDA7CisJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMDsKKwljbWQtPmhhbmRsZXNfdW5rbm93bl9zZWdtZW50cyA9IDA7CisJY21kLT5pbmRlcGVuZGVudF9tZXRhZGF0YV9hcmVhcyA9IDA7CisJY21kLT5pZ25vcmVfY2x1c3RlcmVkX3ZncyA9IDA7CisJY21kLT5ob3N0dGFncyA9IDA7CisJZG1fbGlzdF9pbml0KCZjbWQtPmFyZ192YWx1ZV9ncm91cHMpOworCWRtX2xpc3RfaW5pdCgmY21kLT5mb3JtYXRzKTsKKwlkbV9saXN0X2luaXQoJmNtZC0+c2VndHlwZXMpOworCWRtX2xpc3RfaW5pdCgmY21kLT50YWdzKTsKKwlkbV9saXN0X2luaXQoJmNtZC0+Y29uZmlnX2ZpbGVzKTsKKwlsYWJlbF9pbml0KCk7CisKKwkvKiBGSVhNRSBNYWtlIHRoaXMgY29uZmlndXJhYmxlPyAqLworCXJlc2V0X2x2bV9lcnJubygxKTsKKworI2lmbmRlZiBWQUxHUklORF9QT09MCisJLyogU2V0IGluL291dCBzdHJlYW0gYnVmZmVyaW5nIGJlZm9yZSBnbGliYyAqLworCWlmIChzZXRfYnVmZmVyaW5nKSB7CisJCS8qIEFsbG9jYXRlIDIgYnVmZmVycyAqLworCQlpZiAoIShjbWQtPmxpbmVidWZmZXIgPSBkbV9tYWxsb2MoMiAqIGxpbmVidWZmZXJfc2l6ZSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBsaW5lIGJ1ZmZlci4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogbm9odXAgbWlnaHQgc2V0IHN0ZGluIE9fV1JPTkxZICEgKi8KKwkJaWYgKGlzX3ZhbGlkX2ZkKFNURElOX0ZJTEVOTykgJiYKKwkJICAgICgoZmxhZ3MgPSBmY250bChTVERJTl9GSUxFTk8sIEZfR0VURkwpKSA+IDApICYmCisJCSAgICAoZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fV1JPTkxZKSB7CisJCQlpZiAoIV9yZW9wZW5fc3RyZWFtKHN0ZGluLCBTVERJTl9GSUxFTk8sICJyIiwgInN0ZGluIiwgJm5ld19zdHJlYW0pKQorCQkJCWdvdG9fb3V0OworCQkJc3RkaW4gPSBuZXdfc3RyZWFtOworCQkJaWYgKHNldHZidWYoc3RkaW4sIGNtZC0+bGluZWJ1ZmZlciwgX0lPTEJGLCBsaW5lYnVmZmVyX3NpemUpKSB7CisJCQkJbG9nX3N5c19lcnJvcigic2V0dmJ1ZiIsICIiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChpc192YWxpZF9mZChTVERPVVRfRklMRU5PKSAmJgorCQkgICAgKChmbGFncyA9IGZjbnRsKFNURE9VVF9GSUxFTk8sIEZfR0VURkwpKSA+IDApICYmCisJCSAgICAoZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CisJCQlpZiAoIV9yZW9wZW5fc3RyZWFtKHN0ZG91dCwgU1RET1VUX0ZJTEVOTywgInciLCAic3Rkb3V0IiwgJm5ld19zdHJlYW0pKQorCQkJCWdvdG9fb3V0OworCQkJc3Rkb3V0ID0gbmV3X3N0cmVhbTsKKwkJCWlmIChzZXR2YnVmKHN0ZG91dCwgY21kLT5saW5lYnVmZmVyICsgbGluZWJ1ZmZlcl9zaXplLAorCQkJCSAgICAgX0lPTEJGLCBsaW5lYnVmZmVyX3NpemUpKSB7CisJCQkJbG9nX3N5c19lcnJvcigic2V0dmJ1ZiIsICIiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQkvKiBCdWZmZXJzIGFyZSB1c2VkIGZvciBsaW5lcyB3aXRob3V0ICdcbicgKi8KKwl9IGVsc2UKKwkJLyogV2l0aG91dCBidWZmZXJpbmcsIG11c3Qgbm90IHVzZSBzdGRpbi9zdGRvdXQgKi8KKwkJaW5pdF9zaWxlbnQoMSk7CisjZW5kaWYKKworCS8qCisJICogRW52aXJvbm1lbnQgdmFyaWFibGUgTFZNX1NZU1RFTV9ESVIgb3ZlcnJpZGVzIHRoaXMgYmVsb3cuCisJICovCisgICAgICAgIGlmIChzeXN0ZW1fZGlyKQorCQlzdHJuY3B5KGNtZC0+c3lzdGVtX2Rpciwgc3lzdGVtX2Rpciwgc2l6ZW9mKGNtZC0+c3lzdGVtX2RpcikgLSAxKTsKKwllbHNlCisJCXN0cmNweShjbWQtPnN5c3RlbV9kaXIsIERFRkFVTFRfU1lTX0RJUik7CisKKwlpZiAoIV9nZXRfZW52X3ZhcnMoY21kKSkKKwkJZ290b19vdXQ7CisKKwkvKiBDcmVhdGUgc3lzdGVtIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KKwlpZiAoKmNtZC0+c3lzdGVtX2RpciAmJiAhZG1fY3JlYXRlX2RpcihjbWQtPnN5c3RlbV9kaXIpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBMVk0yIHN5c3RlbSBkaXIgZm9yIG1ldGFkYXRhIGJhY2t1cHMsIGNvbmZpZyAiCisJCQkgICJmaWxlcyBhbmQgaW50ZXJuYWwgY2FjaGUuIik7CisJCWxvZ19lcnJvcigiU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIExWTV9TWVNURU1fRElSIHRvIGFsdGVybmF0aXZlIGxvY2F0aW9uICIKKwkJCSAgIm9yIGVtcHR5IHN0cmluZy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEoY21kLT5saWJtZW0gPSBkbV9wb29sX2NyZWF0ZSgibGlicmFyeSIsIDQgKiAxMDI0KSkpIHsKKwkJbG9nX2Vycm9yKCJMaWJyYXJ5IG1lbW9yeSBwb29sIGNyZWF0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShjbWQtPm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJjb21tYW5kIiwgNCAqIDEwMjQpKSkgeworCQlsb2dfZXJyb3IoIkNvbW1hbmQgbWVtb3J5IHBvb2wgY3JlYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghX2luaXRfbHZtX2NvbmYoY21kKSkKKwkJZ290b19vdXQ7CisKKwlfaW5pdF9sb2dnaW5nKGNtZCk7CisKKwlpZiAoIV9pbml0X2hvc3RuYW1lKGNtZCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfaW5pdF90YWdzKGNtZCwgY21kLT5jZnQpKQorCQlnb3RvX291dDsKKworCS8qIExvYWQgbHZtbG9jYWwuY29uZiAqLworCWlmICgqY21kLT5zeXN0ZW1fZGlyICYmICFfbG9hZF9jb25maWdfZmlsZShjbWQsICIiLCAxKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9pbml0X3RhZ19jb25maWdzKGNtZCkpCisJCWdvdG9fb3V0OworCisJaWYgKCEoY21kLT5jZnQgPSBfbWVyZ2VfY29uZmlnX2ZpbGVzKGNtZCwgY21kLT5jZnQpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9wcm9jZXNzX2NvbmZpZyhjbWQpKQorCQlnb3RvX291dDsKKworCWlmICghX2luaXRfcHJvZmlsZXMoY21kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShjbWQtPmRldl90eXBlcyA9IGNyZWF0ZV9kZXZfdHlwZXMoY21kLT5wcm9jX2RpciwKKwkJCQkJCWZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBkZXZpY2VzX3R5cGVzX0NGRywgTlVMTCkpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9pbml0X2Rldl9jYWNoZShjbWQpKQorCQlnb3RvX291dDsKKworCW1lbWxvY2tfaW5pdChjbWQpOworCisJaWYgKCFfaW5pdF9mb3JtYXRzKGNtZCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFpbml0X2x2bWNhY2hlX29ycGhhbnMoY21kKSkKKwkJZ290b19vdXQ7CisKKwlkbV9saXN0X2luaXQoJmNtZC0+dW51c2VkX2R1cGxpY2F0ZV9kZXZzKTsKKworCWlmICghX2luaXRfc2VndHlwZXMoY21kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9pbml0X2JhY2t1cChjbWQpKQorCQlnb3RvX291dDsKKworCV9pbml0X3JhbmQoY21kKTsKKworCV9pbml0X2dsb2JhbHMoY21kKTsKKworCWlmIChzZXRfY29ubmVjdGlvbnMgJiYgIWluaXRfY29ubmVjdGlvbnMoY21kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoc2V0X2ZpbHRlcnMgJiYgIWluaXRfZmlsdGVycyhjbWQsIDEpKQorCQlnb3RvX291dDsKKworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy5jYWNoZV92Z21ldGFkYXRhID0gMTsKKwljbWQtPmN1cnJlbnRfc2V0dGluZ3MgPSBjbWQtPmRlZmF1bHRfc2V0dGluZ3M7CisKKwljbWQtPmluaXRpYWxpemVkLmNvbmZpZyA9IDE7CitvdXQ6CisJaWYgKCFjbWQtPmluaXRpYWxpemVkLmNvbmZpZykgeworCQlkZXN0cm95X3Rvb2xjb250ZXh0KGNtZCk7CisJCWNtZCA9IE5VTEw7CisJfQorCisKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveV9mb3JtYXRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqZm9ybWF0cykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqZm10bCwgKnRtcDsKKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKwl2b2lkICpsaWI7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShmbXRsLCB0bXAsIGZvcm1hdHMpIHsKKwkJZm10ID0gZG1fbGlzdF9pdGVtKGZtdGwsIHN0cnVjdCBmb3JtYXRfdHlwZSk7CisJCWRtX2xpc3RfZGVsKCZmbXQtPmxpc3QpOworCQlsaWIgPSBmbXQtPmxpYnJhcnk7CisJCWZtdC0+b3BzLT5kZXN0cm95KGZtdCk7CisjaWZkZWYgSEFWRV9MSUJETAorCQlpZiAobGliKQorCQkJZGxjbG9zZShsaWIpOworI2VuZGlmCisJfQorCisJY21kLT5pbmRlcGVuZGVudF9tZXRhZGF0YV9hcmVhcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95X3NlZ3R5cGVzKHN0cnVjdCBkbV9saXN0ICpzZWd0eXBlcykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqc2d0bCwgKnRtcDsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCXZvaWQgKmxpYjsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKHNndGwsIHRtcCwgc2VndHlwZXMpIHsKKwkJc2VndHlwZSA9IGRtX2xpc3RfaXRlbShzZ3RsLCBzdHJ1Y3Qgc2VnbWVudF90eXBlKTsKKwkJZG1fbGlzdF9kZWwoJnNlZ3R5cGUtPmxpc3QpOworCQlsaWIgPSBzZWd0eXBlLT5saWJyYXJ5OworCQlzZWd0eXBlLT5vcHMtPmRlc3Ryb3koc2VndHlwZSk7CisjaWZkZWYgSEFWRV9MSUJETAorCQkvKgorCQkgKiBJZiBubyBzZWd0eXBlcyByZW1haW4gZnJvbSB0aGlzIGxpYnJhcnksIGNsb3NlIGl0LgorCQkgKi8KKwkJaWYgKGxpYikgeworCQkJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTI7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VndHlwZTIsIHNlZ3R5cGVzKQorCQkJCWlmIChzZWd0eXBlMi0+bGlicmFyeSA9PSBsaWIpCisJCQkJCWdvdG8gc2tpcF9kbGNsb3NlOworCQkJZGxjbG9zZShsaWIpOworc2tpcF9kbGNsb3NlOgorCQkJOworCQl9CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95X2Rldl90eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpZiAoIWNtZC0+ZGV2X3R5cGVzKQorCQlyZXR1cm47CisKKwlkbV9mcmVlKGNtZC0+ZGV2X3R5cGVzKTsKKwljbWQtPmRldl90eXBlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95X2ZpbHRlcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJaWYgKGNtZC0+ZnVsbF9maWx0ZXIpIHsKKwkJY21kLT5mdWxsX2ZpbHRlci0+ZGVzdHJveShjbWQtPmZ1bGxfZmlsdGVyKTsKKwkJY21kLT5sdm1ldGFkX2ZpbHRlciA9IGNtZC0+ZmlsdGVyID0gY21kLT5mdWxsX2ZpbHRlciA9IE5VTEw7CisJfQorCWNtZC0+aW5pdGlhbGl6ZWQuZmlsdGVycyA9IDA7Cit9CisKK2ludCByZWZyZXNoX2ZpbHRlcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJaW50IHIsIHNhdmVkX2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyA9IGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygpOworCisJaWYgKCFjbWQtPmluaXRpYWxpemVkLmZpbHRlcnMpCisJCS8qIGlmIGZpbHRlcnMgbm90IGluaXRpYWxpemVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVmcmVzaCAqLworCQlyZXR1cm4gMTsKKworCV9kZXN0cm95X2ZpbHRlcnMoY21kKTsKKwlpZiAoIShyID0gaW5pdF9maWx0ZXJzKGNtZCwgMCkpKQorICAgICAgICAgICAgICAgIHN0YWNrOworCisJLyoKKwkgKiBEdXJpbmcgcmVwYWlyIGNvZGUgbXVzdCBub3QgcmVzZXQgc3VzcGVuZGVkIGZsYWcuCisJICovCisJaW5pdF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMoc2F2ZWRfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKTsKKworCXJldHVybiByOworfQorCitpbnQgcmVmcmVzaF90b29sY29udGV4dChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdF9jbWRsaW5lLCAqY2Z0X3RtcDsKKwljb25zdCBjaGFyICpwcm9maWxlX2NvbW1hbmRfbmFtZSwgKnByb2ZpbGVfbWV0YWRhdGFfbmFtZTsKKwlzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZTsKKworCWxvZ192ZXJib3NlKCJSZWxvYWRpbmcgY29uZmlnIGZpbGVzIik7CisKKwkvKgorCSAqIERvbid0IHVwZGF0ZSB0aGUgcGVyc2lzdGVudCBmaWx0ZXIgY2FjaGUgYXMgd2Ugd2lsbAorCSAqIHBlcmZvcm0gYSBmdWxsIHJlc2Nhbi4KKwkgKi8KKworCWFjdGl2YXRpb25fcmVsZWFzZSgpOworCWx2bWNhY2hlX2Rlc3Ryb3koY21kLCAwLCAwKTsKKwlsYWJlbF9leGl0KCk7CisJX2Rlc3Ryb3lfc2VndHlwZXMoJmNtZC0+c2VndHlwZXMpOworCV9kZXN0cm95X2Zvcm1hdHMoY21kLCAmY21kLT5mb3JtYXRzKTsKKworCWlmICghZGV2X2NhY2hlX2V4aXQoKSkKKwkJc3RhY2s7CisJX2Rlc3Ryb3lfZGV2X3R5cGVzKGNtZCk7CisJX2Rlc3Ryb3lfdGFncyhjbWQpOworCisJLyogc2F2ZSBjb25maWcgc3RyaW5nIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCisJY2Z0X2NtZGxpbmUgPSByZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKGNtZCwgQ09ORklHX1NUUklORyk7CisKKwkvKiBzYXZlIHRoZSBnbG9iYWwgcHJvZmlsZSBuYW1lIHVzZWQgKi8KKwlwcm9maWxlX2NvbW1hbmRfbmFtZSA9IGNtZC0+cHJvZmlsZV9wYXJhbXMtPmdsb2JhbF9jb21tYW5kX3Byb2ZpbGUgPworCQkJCWNtZC0+cHJvZmlsZV9wYXJhbXMtPmdsb2JhbF9jb21tYW5kX3Byb2ZpbGUtPm5hbWUgOiBOVUxMOworCXByb2ZpbGVfbWV0YWRhdGFfbmFtZSA9IGNtZC0+cHJvZmlsZV9wYXJhbXMtPmdsb2JhbF9tZXRhZGF0YV9wcm9maWxlID8KKwkJCQljbWQtPnByb2ZpbGVfcGFyYW1zLT5nbG9iYWxfbWV0YWRhdGFfcHJvZmlsZS0+bmFtZSA6IE5VTEw7CisKKwlfZGVzdHJveV9jb25maWcoY21kKTsKKworCWNtZC0+aW5pdGlhbGl6ZWQuY29uZmlnID0gMDsKKworCWNtZC0+aG9zdHRhZ3MgPSAwOworCisJY21kLT5saWJfZGlyID0gTlVMTDsKKworCWlmICghX2luaXRfbHZtX2NvbmYoY21kKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBUZW1wb3JhcnkgZHVwbGljYXRlIGNmdCBwb2ludGVyIGhvbGRpbmcgbHZtLmNvbmYgLSByZXBsYWNlZCBsYXRlciAqLworCWNmdF90bXAgPSBjbWQtPmNmdDsKKwlpZiAoY2Z0X2NtZGxpbmUpCisJCWNtZC0+Y2Z0ID0gZG1fY29uZmlnX2luc2VydF9jYXNjYWRlZF90cmVlKGNmdF9jbWRsaW5lLCBjZnRfdG1wKTsKKworCS8qIFJlbG9hZCB0aGUgZ2xvYmFsIHByb2ZpbGUuICovCisJaWYgKHByb2ZpbGVfY29tbWFuZF9uYW1lKSB7CisJCWlmICghKHByb2ZpbGUgPSBhZGRfcHJvZmlsZShjbWQsIHByb2ZpbGVfY29tbWFuZF9uYW1lLCBDT05GSUdfUFJPRklMRV9DT01NQU5EKSkgfHwKKwkJICAgICFvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3Byb2ZpbGUoY21kLCBwcm9maWxlKSkKKwkJCXJldHVybl8wOworCX0KKwlpZiAocHJvZmlsZV9tZXRhZGF0YV9uYW1lKSB7CisJCWlmICghKHByb2ZpbGUgPSBhZGRfcHJvZmlsZShjbWQsIHByb2ZpbGVfbWV0YWRhdGFfbmFtZSwgQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpKSB8fAorCQkgICAgIW92ZXJyaWRlX2NvbmZpZ190cmVlX2Zyb21fcHJvZmlsZShjbWQsIHByb2ZpbGUpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogVXNlcyBjbWQtPmNmdCBpLmUuIGNmdF9jbWRsaW5lICsgbHZtLmNvbmYgKi8KKwlfaW5pdF9sb2dnaW5nKGNtZCk7CisKKwkvKiBJbml0IHRhZ3MgZnJvbSBsdm0uY29uZi4gKi8KKwlpZiAoIV9pbml0X3RhZ3MoY21kLCBjZnRfdG1wKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBMb2FkIGx2bWxvY2FsLmNvbmYgKi8KKwlpZiAoKmNtZC0+c3lzdGVtX2RpciAmJiAhX2xvYWRfY29uZmlnX2ZpbGUoY21kLCAiIiwgMSkpCisJCXJldHVybl8wOworCisJLyogRG9lc24ndCBjaGFuZ2UgY21kLT5jZnQgKi8KKwlpZiAoIV9pbml0X3RhZ19jb25maWdzKGNtZCkpCisJCXJldHVybl8wOworCisJLyogTWVyZ2UgYWxsIHRoZSB0YWcgY29uZmlnIGZpbGVzIHdpdGggbHZtLmNvbmYsIHJldHVybmluZyBhCisJICogZnJlc2ggY2Z0IHBvaW50ZXIgaW4gcGxhY2Ugb2YgY2Z0X3RtcC4gKi8KKwlpZiAoIShjbWQtPmNmdCA9IF9tZXJnZV9jb25maWdfZmlsZXMoY21kLCBjZnRfdG1wKSkpCisJCXJldHVybl8wOworCisJLyogRmluYWxseSB3ZSBjYW4gbWFrZSB0aGUgcHJvcGVyLCBmdWxseS1tZXJnZWQsIGNtZC0+Y2Z0ICovCisJaWYgKGNmdF9jbWRsaW5lKQorCQljbWQtPmNmdCA9IGRtX2NvbmZpZ19pbnNlcnRfY2FzY2FkZWRfdHJlZShjZnRfY21kbGluZSwgY21kLT5jZnQpOworCisJaWYgKCFfcHJvY2Vzc19jb25maWcoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9pbml0X3Byb2ZpbGVzKGNtZCkpCisJCXJldHVybl8wOworCisJaWYgKCEoY21kLT5kZXZfdHlwZXMgPSBjcmVhdGVfZGV2X3R5cGVzKGNtZC0+cHJvY19kaXIsCisJCQkJCQlmaW5kX2NvbmZpZ190cmVlX2FycmF5KGNtZCwgZGV2aWNlc190eXBlc19DRkcsIE5VTEwpKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfaW5pdF9kZXZfY2FjaGUoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9pbml0X2Zvcm1hdHMoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWluaXRfbHZtY2FjaGVfb3JwaGFucyhjbWQpKQorCQlyZXR1cm5fMDsKKworCWlmICghX2luaXRfc2VndHlwZXMoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9pbml0X2JhY2t1cChjbWQpKQorCQlyZXR1cm5fMDsKKworCWNtZC0+aW5pdGlhbGl6ZWQuY29uZmlnID0gMTsKKworCWlmIChjbWQtPmluaXRpYWxpemVkLmNvbm5lY3Rpb25zICYmICFpbml0X2Nvbm5lY3Rpb25zKGNtZCkpCisJCXJldHVybl8wOworCisJaWYgKCFyZWZyZXNoX2ZpbHRlcnMoY21kKSkKKwkJcmV0dXJuXzA7CisKKwlyZXNldF9sdm1fZXJybm8oMSk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZGVzdHJveV90b29sY29udGV4dChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdF9jbWRsaW5lOworCUZJTEUgKm5ld19zdHJlYW07CisJaW50IGZsYWdzOworCisJaWYgKGNtZC0+ZHVtcF9maWx0ZXIgJiYgY21kLT5maWx0ZXIgJiYgY21kLT5maWx0ZXItPmR1bXAgJiYKKwkgICAgIWNtZC0+ZmlsdGVyLT5kdW1wKGNtZC0+ZmlsdGVyLCAxKSkKKwkJc3RhY2s7CisKKwlhcmNoaXZlX2V4aXQoY21kKTsKKwliYWNrdXBfZXhpdChjbWQpOworCWx2bWNhY2hlX2Rlc3Ryb3koY21kLCAwLCAwKTsKKwlsYWJlbF9leGl0KCk7CisJX2Rlc3Ryb3lfc2VndHlwZXMoJmNtZC0+c2VndHlwZXMpOworCV9kZXN0cm95X2Zvcm1hdHMoY21kLCAmY21kLT5mb3JtYXRzKTsKKwlfZGVzdHJveV9maWx0ZXJzKGNtZCk7CisJaWYgKGNtZC0+bWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koY21kLT5tZW0pOworCWRldl9jYWNoZV9leGl0KCk7CisJX2Rlc3Ryb3lfZGV2X3R5cGVzKGNtZCk7CisJX2Rlc3Ryb3lfdGFncyhjbWQpOworCisJaWYgKChjZnRfY21kbGluZSA9IHJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBDT05GSUdfU1RSSU5HKSkpCisJCWNvbmZpZ19kZXN0cm95KGNmdF9jbWRsaW5lKTsKKwlfZGVzdHJveV9jb25maWcoY21kKTsKKworCWlmIChjbWQtPmNmdF9kZWZfaGFzaCkKKwkJZG1faGFzaF9kZXN0cm95KGNtZC0+Y2Z0X2RlZl9oYXNoKTsKKworCWlmIChjbWQtPmxvZ19yaCkKKwkJZG1fcmVwb3J0X2ZyZWUoY21kLT5sb2dfcmgpOworCisJaWYgKGNtZC0+bGlibWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koY21kLT5saWJtZW0pOworCisjaWZuZGVmIFZBTEdSSU5EX1BPT0wKKwlpZiAoY21kLT5saW5lYnVmZmVyKSB7CisJCS8qIFJlc2V0IHN0cmVhbSBidWZmZXJpbmcgdG8gZGVmYXVsdHMgKi8KKwkJaWYgKGlzX3ZhbGlkX2ZkKFNURElOX0ZJTEVOTykgJiYKKwkJICAgICgoZmxhZ3MgPSBmY250bChTVERJTl9GSUxFTk8sIEZfR0VURkwpKSA+IDApICYmCisJCSAgICAoZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fV1JPTkxZKSB7CisJCQlpZiAoX3Jlb3Blbl9zdHJlYW0oc3RkaW4sIFNURElOX0ZJTEVOTywgInIiLCAic3RkaW4iLCAmbmV3X3N0cmVhbSkpIHsKKwkJCQlzdGRpbiA9IG5ld19zdHJlYW07CisJCQkJc2V0bGluZWJ1ZihzdGRpbik7CisJCQl9IGVsc2UKKwkJCQljbWQtPmxpbmVidWZmZXIgPSBOVUxMOwkvKiBMZWF2ZSBidWZmZXIgaW4gcGxhY2UgKGRlbGliZXJhdGUgbGVhaykgKi8KKwkJfQorCisJCWlmIChpc192YWxpZF9mZChTVERPVVRfRklMRU5PKSAmJgorCQkgICAgKChmbGFncyA9IGZjbnRsKFNURE9VVF9GSUxFTk8sIEZfR0VURkwpKSA+IDApICYmCisJCSAgICAoZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CisJCQlpZiAoX3Jlb3Blbl9zdHJlYW0oc3Rkb3V0LCBTVERPVVRfRklMRU5PLCAidyIsICJzdGRvdXQiLCAmbmV3X3N0cmVhbSkpIHsKKwkJCQlzdGRvdXQgPSBuZXdfc3RyZWFtOworCQkJCXNldGxpbmVidWYoc3Rkb3V0KTsKKwkJCX0gZWxzZQorCQkJCWNtZC0+bGluZWJ1ZmZlciA9IE5VTEw7CS8qIExlYXZlIGJ1ZmZlciBpbiBwbGFjZSAoZGVsaWJlcmF0ZSBsZWFrKSAqLworCQl9CisKKwkJZG1fZnJlZShjbWQtPmxpbmVidWZmZXIpOworCX0KKyNlbmRpZgorCWRtX2ZyZWUoY21kKTsKKworCWx2bWV0YWRfcmVsZWFzZV90b2tlbigpOworCWx2bWV0YWRfZGlzY29ubmVjdCgpOworCWx2bXBvbGxkX2Rpc2Nvbm5lY3QoKTsKKworCXJlbGVhc2VfbG9nX21lbW9yeSgpOworCWFjdGl2YXRpb25fZXhpdCgpOworCXJlc2V0X2xvZ19kdXBsaWNhdGVkKCk7CisJZmluX2xvZygpOworCWZpbl9zeXNsb2coKTsKKwlyZXNldF9sdm1fZXJybm8oMCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY29tbWFuZHMvdG9vbGNvbnRleHQuaCBiL2xpYi9jb21tYW5kcy90b29sY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODQ5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29tbWFuZHMvdG9vbGNvbnRleHQuaApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1RPT0xDT05URVhUX0gKKyNkZWZpbmUgX0xWTV9UT09MQ09OVEVYVF9ICisKKyNpbmNsdWRlICJkZXYtY2FjaGUuaCIKKyNpbmNsdWRlICJkZXYtdHlwZS5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qCisgKiBDb25maWcgb3B0aW9ucyB0aGF0IGNhbiBiZSBjaGFuZ2VkIHdoaWxlIGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQKKyAqLworc3RydWN0IGNvbmZpZ19pbmZvIHsKKwlpbnQgZGVidWc7CisJaW50IGRlYnVnX2NsYXNzZXM7CisJaW50IHZlcmJvc2U7CisJaW50IHNpbGVudDsKKwlpbnQgdGVzdDsKKwlpbnQgc3lzbG9nOworCWludCBhY3RpdmF0aW9uOworCWludCBzdWZmaXg7CisJaW50IGFyY2hpdmU7CQkvKiBzaG91bGQgd2UgYXJjaGl2ZSA/ICovCisJaW50IGJhY2t1cDsJCS8qIHNob3VsZCB3ZSBiYWNrdXAgPyAqLworCWludCByZWFkX2FoZWFkOwkJLyogRE1fUkVBRF9BSEVBRF9OT05FIG9yIF9BVVRPICovCisJaW50IHVkZXZfcnVsZXM7CisJaW50IHVkZXZfc3luYzsKKwlpbnQgdWRldl9mYWxsYmFjazsKKwlpbnQgY2FjaGVfdmdtZXRhZGF0YTsKKwljb25zdCBjaGFyICptc2dfcHJlZml4OworCWNvbnN0IGNoYXIgKmZtdF9uYW1lOworCXVpbnQ2NF90IHVuaXRfZmFjdG9yOworCWludCBjbWRfbmFtZTsJCS8qIFNob3cgY29tbWFuZCBuYW1lPyAqLworCW1vZGVfdCB1bWFzazsKKwljaGFyIHVuaXRfdHlwZTsKKwljaGFyIF9wYWRkaW5nWzFdOworfTsKKworc3RydWN0IGRtX2NvbmZpZ190cmVlOworc3RydWN0IHByb2ZpbGVfcGFyYW1zOworc3RydWN0IGFyY2hpdmVfcGFyYW1zOworc3RydWN0IGJhY2t1cF9wYXJhbXM7CitzdHJ1Y3QgYXJnX3ZhbHVlczsKKworc3RydWN0IGNvbmZpZ190cmVlX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7Cit9OworCitzdHJ1Y3QgY21kX2NvbnRleHRfaW5pdGlhbGl6ZWRfcGFydHMgeworCXVuc2lnbmVkIGNvbmZpZzoxOyAvKiB1c2VkIHRvIHJlaW5pdGlhbGl6ZSBjb25maWcgaWYgcHJldmlvdXMgaW5pdCB3YXMgbm90IHN1Y2Nlc3NmdWwgKi8KKwl1bnNpZ25lZCBmaWx0ZXJzOjE7CisJdW5zaWduZWQgY29ubmVjdGlvbnM6MTsKK307CisKKy8qIEZJWE1FIFNwbGl0IGludG8gdG9vbCAmIGxpYnJhcnkgY29udGV4dHMgKi8KKy8qIGNvbW1hbmQtaW5zdGFuY2UtcmVsYXRlZCB2YXJpYWJsZXMgbmVlZGVkIGJ5IGxpYnJhcnkgKi8KK3N0cnVjdCBjbWRfY29udGV4dCB7CisJLyoKKwkgKiBNZW1vcnkgaGFuZGxlcnMuCisJICovCisJc3RydWN0IGRtX3Bvb2wgKmxpYm1lbTsJCQkvKiBmb3IgcGVybWFuZW50IGNvbmZpZyBkYXRhICovCisJc3RydWN0IGRtX3Bvb2wgKm1lbTsJCQkvKiB0cmFuc2llbnQ6IGNsZWFyZWQgYmV0d2VlbiBlYWNoIGNvbW1hbmQgKi8KKworCS8qCisJICogQ29tbWFuZCBsaW5lIGFuZCBhcmd1bWVudHMuCisJICovCisJY29uc3QgY2hhciAqY21kX2xpbmU7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJY2hhciAqKmFyZ3Y7CisJc3RydWN0IGFyZ192YWx1ZXMgKmFyZ192YWx1ZXM7CisJc3RydWN0IGRtX2xpc3QgYXJnX3ZhbHVlX2dyb3VwczsKKworCS8qCisJICogRm9ybWF0IGhhbmRsZXJzLgorCSAqLworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10OwkJLyogY3VycmVudCBmb3JtYXQgdG8gdXNlIGJ5IGRlZmF1bHQgKi8KKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdF9iYWNrdXA7CQkvKiBmb3JtYXQgdG8gdXNlIGZvciBiYWNrdXBzICovCisJc3RydWN0IGRtX2xpc3QgZm9ybWF0czsJCQkvKiBhdmFpbGFibGUgZm9ybWF0cyAqLworCXN0cnVjdCBkbV9saXN0IHNlZ3R5cGVzOwkJLyogYXZhaWxhYmxlIHNlZ21lbnQgdHlwZXMgKi8KKworCS8qCisJICogTWFjaGluZSBhbmQgc3lzdGVtIGlkZW50aWZpY2F0aW9uLgorCSAqLworCWNvbnN0IGNoYXIgKnN5c3RlbV9pZDsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwljb25zdCBjaGFyICprZXJuZWxfdnNuOworCisJLyoKKwkgKiBEZXZpY2UgaWRlbnRpZmljYXRpb24uCisJICovCisJc3RydWN0IGRldl90eXBlcyAqZGV2X3R5cGVzOwkJLyogcmVjb2duaXplZCBleHRyYSBkZXZpY2UgdHlwZXMuICovCisKKwkvKgorCSAqIEluaXRpYWxpemF0aW9uIHN0YXRlLgorCSAqLworCXN0cnVjdCBjbWRfY29udGV4dF9pbml0aWFsaXplZF9wYXJ0cyBpbml0aWFsaXplZDsKKworCS8qCisJICogU3dpdGNoZXMuCisJICovCisJdW5zaWduZWQgaXNfbG9uZ19saXZlZDoxOwkJLyogb3B0aW1pc2VzIHBlcnNpc3RlbnRfZmlsdGVyIGhhbmRsaW5nICovCisJdW5zaWduZWQgaXNfaW50ZXJhY3RpdmU6MTsKKwl1bnNpZ25lZCBjaGVja19wdl9kZXZfc2l6ZXM6MTsKKwl1bnNpZ25lZCBoYW5kbGVzX21pc3NpbmdfcHZzOjE7CisJdW5zaWduZWQgaGFuZGxlc191bmtub3duX3NlZ21lbnRzOjE7CisJdW5zaWduZWQgdXNlX2xpbmVhcl90YXJnZXQ6MTsKKwl1bnNpZ25lZCBwYXJ0aWFsX2FjdGl2YXRpb246MTsKKwl1bnNpZ25lZCBkZWdyYWRlZF9hY3RpdmF0aW9uOjE7CisJdW5zaWduZWQgYXV0b19zZXRfYWN0aXZhdGlvbl9za2lwOjE7CisJdW5zaWduZWQgc2lfdW5pdF9jb25zaXN0ZW5jeToxOworCXVuc2lnbmVkIHJlcG9ydF9iaW5hcnlfdmFsdWVzX2FzX251bWVyaWM6MTsKKwl1bnNpZ25lZCByZXBvcnRfbWFya19oaWRkZW5fZGV2aWNlczoxOworCXVuc2lnbmVkIG1ldGFkYXRhX3JlYWRfb25seToxOworCXVuc2lnbmVkIGlnbm9yZV9jbHVzdGVyZWRfdmdzOjE7CisJdW5zaWduZWQgdGhyZWFkZWQ6MTsJCQkvKiBzZXQgaWYgcnVubmluZyB3aXRoaW4gYSB0aHJlYWQgZS5nLiBjbHZtZCAqLworCXVuc2lnbmVkIGluZGVwZW5kZW50X21ldGFkYXRhX2FyZWFzOjE7CS8qIGFjdGl2ZSBmb3JtYXRzIGhhdmUgTURBcyBvdXRzaWRlIFBWcyAqLworCXVuc2lnbmVkIHVua25vd25fc3lzdGVtX2lkOjE7CisJdW5zaWduZWQgaW5jbHVkZV9oaXN0b3JpY2FsX2x2czoxOwkvKiBhbHNvIHByb2Nlc3MvcmVwb3J0L2Rpc3BsYXkgaGlzdG9yaWNhbCBMVnMgKi8KKwl1bnNpZ25lZCByZWNvcmRfaGlzdG9yaWNhbF9sdnM6MTsJLyogcmVjb3JkIGhpc3RvcmljYWwgTFZzICovCisJdW5zaWduZWQgaW5jbHVkZV9mb3JlaWduX3ZnczoxOwkJLyogcmVwb3J0L2Rpc3BsYXkgY21kcyBjYW4gcmV2ZWFsIGZvcmVpZ24gVkdzICovCisJdW5zaWduZWQgaW5jbHVkZV9zaGFyZWRfdmdzOjE7CQkvKiByZXBvcnQvZGlzcGxheSBjbWRzIGNhbiByZXZlYWwgbG9ja2QgVkdzICovCisJdW5zaWduZWQgaW5jbHVkZV9hY3RpdmVfZm9yZWlnbl92Z3M6MTsJLyogY21kIHNob3VsZCBwcm9jZXNzIGZvcmVpZ24gVkdzIHdpdGggYWN0aXZlIExWcyAqLworCXVuc2lnbmVkIHZnX3JlYWRfcHJpbnRfYWNjZXNzX2Vycm9yOjE7CS8qIHByaW50IGFjY2VzcyBlcnJvcnMgZnJvbSB2Z19yZWFkICovCisJdW5zaWduZWQgbG9ja2RfZ2xfZGlzYWJsZToxOworCXVuc2lnbmVkIGxvY2tkX3ZnX2Rpc2FibGU6MTsKKwl1bnNpZ25lZCBsb2NrZF9sdl9kaXNhYmxlOjE7CisJdW5zaWduZWQgbG9ja2RfZ2xfcmVtb3ZlZDoxOworCXVuc2lnbmVkIGxvY2tkX3ZnX3Jlc2NhbjoxOworCXVuc2lnbmVkIGxvY2tkX3ZnX2RlZmF1bHRfc2g6MTsKKwl1bnNpZ25lZCBsb2NrZF92Z19lbmZvcmNlX3NoOjE7CisJdW5zaWduZWQgdmdfbm90aWZ5OjE7CisJdW5zaWduZWQgbHZfbm90aWZ5OjE7CisJdW5zaWduZWQgcHZfbm90aWZ5OjE7CisKKwkvKgorCSAqIEZpbHRlcmluZy4KKwkgKi8KKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqbHZtZXRhZF9maWx0ZXI7CS8qIHByZS1sdm1ldGFkIGZpbHRlciBjaGFpbiAqLworCXN0cnVjdCBkZXZfZmlsdGVyICpmaWx0ZXI7CQkvKiBwb3N0LWx2bWV0YWQgZmlsdGVyIGNoYWluICovCisJc3RydWN0IGRldl9maWx0ZXIgKmZ1bGxfZmlsdGVyOwkJLyogbHZtZXRhZF9maWx0ZXIgKyBmaWx0ZXIgKi8KKwlpbnQgZHVtcF9maWx0ZXI7CQkJLyogRHVtcCBmaWx0ZXIgd2hlbiBleGl0aW5nPyAqLworCisJLyoKKwkgKiBDb25maWd1cmF0aW9uLgorCSAqLworCXN0cnVjdCBkbV9saXN0IGNvbmZpZ19maWxlczsgCQkvKiBtYXN0ZXIgbHZtIGNvbmZpZyArIGFueSBleGlzdGluZyB0YWcgY29uZmlncyAqLworCXN0cnVjdCBwcm9maWxlX3BhcmFtcyAqcHJvZmlsZV9wYXJhbXM7CS8qIHByb2ZpbGUgaGFuZGxpbmcgcGFyYW1zIGluY2x1ZGluZyBsb2FkZWQgcHJvZmlsZSBjb25maWdzICovCisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CQkvKiB0aGUgd2hvbGUgY2FzY2FkZTogQ09ORklHX1NUUklORyAtPiBDT05GSUdfUFJPRklMRSAtPiBDT05GSUdfRklMRS9DT05GSUdfTUVSR0VEX0ZJTEVTICovCisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmNmdF9kZWZfaGFzaDsJLyogY29uZmlnIGRlZmluaXRpb24gaGFzaCB1c2VkIGZvciB2YWxpZGl0eSBjaGVjayAoaXRlbSB0eXBlICsgaXRlbSByZWNvZ25pemVkKSAqLworCXN0cnVjdCBjb25maWdfaW5mbyBkZWZhdWx0X3NldHRpbmdzOwkvKiBzZWxlY3RlZCBzZXR0aW5ncyB3aXRoIG9yaWdpbmFsIGRlZmF1bHQvY29uZmlndXJlZCB2YWx1ZSB3aGljaCBjYW4gYmUgY2hhbmdlZCBkdXJpbmcgY21kIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3QgY29uZmlnX2luZm8gY3VycmVudF9zZXR0aW5nczsgCS8qIG1heSBjb250YWluIGNoYW5nZWQgdmFsdWVzIGNvbXBhcmVkIHRvIGRlZmF1bHRfc2V0dGluZ3MgKi8KKworCS8qCisJICogQXJjaGl2ZXMgYW5kIGJhY2t1cHMuCisJICovCisJc3RydWN0IGFyY2hpdmVfcGFyYW1zICphcmNoaXZlX3BhcmFtczsKKwlzdHJ1Y3QgYmFja3VwX3BhcmFtcyAqYmFja3VwX3BhcmFtczsKKwljb25zdCBjaGFyICpzdHJpcGVfZmlsbGVyOworCisJLyoKKwkgKiBIb3N0IHRhZ3MuCisJICovCisJc3RydWN0IGRtX2xpc3QgdGFnczsJCQkvKiBsaXN0IG9mIGRlZmluZWQgdGFncyAqLworCWludCBob3N0dGFnczsKKworCS8qCisJICogUGF0aHMuCisJICovCisJY29uc3QgY2hhciAqbGliX2RpcjsJCQkvKiBjYWNoZSB2YWx1ZSBnbG9iYWwvbGlicmFyeV9kaXIgKi8KKwljaGFyIHN5c3RlbV9kaXJbUEFUSF9NQVhdOworCWNoYXIgZGV2X2RpcltQQVRIX01BWF07CisJY2hhciBwcm9jX2RpcltQQVRIX01BWF07CisKKwkvKgorCSAqIENvbW1hbmQgbG9nIHJlcG9ydGluZy4KKwkgKi8KKwlzdHJ1Y3QgZG1fcmVwb3J0ICpsb2dfcmg7CQkvKiBrZWVwIGxvZyByZXBvcnQgb2YgbGFzdCBjbWQgZm9yIGZ1cnRoZXIgcXVlcmllcyBpZiBjbWQgbGluZSBpcyBpbnRlcmFjdGl2ZSAoZS5nLiBsdm0gc2hlbGwpICovCisKKwkvKgorCSAqIEJ1ZmZlcnMuCisJICovCisJY2hhciBkaXNwbGF5X2J1ZmZlcltOQU1FX0xFTiAqIDEwXTsJLyogcmluZyBidWZmZXIgZm9yIHVwdG8gMTAgbG9uZ2VzdCB2Zy9sdiBuYW1lcyAqLworCXVuc2lnbmVkIGRpc3BsYXlfbHZuYW1lX2lkeDsJCS8qIGluZGV4IHRvIHJpbmcgYnVmZmVyICovCisJY2hhciAqbGluZWJ1ZmZlcjsKKworCS8qCisJICogT3RoZXJzIC0gdW5zb3J0ZWQuCisJICovCisJY29uc3QgY2hhciAqcmVwb3J0X2xpc3RfaXRlbV9zZXBhcmF0b3I7CisJY29uc3QgY2hhciAqdGltZV9mb3JtYXQ7CisJdW5zaWduZWQgcmFuZF9zZWVkOworCXN0cnVjdCBkbV9saXN0IHVudXNlZF9kdXBsaWNhdGVfZGV2czsgLyogc2F2ZSBwcmVmZXJlbmNlcyBiZXR3ZWVuIGx2bWNhY2hlIGluc3RhbmNlcyAqLworfTsKKworLyoKKyAqIHN5c3RlbV9kaXIgbWF5IGJlIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlLgorICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExWTV9TWVNURU1fRElSIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLgorICovCitzdHJ1Y3QgY21kX2NvbnRleHQgKmNyZWF0ZV90b29sY29udGV4dCh1bnNpZ25lZCBpc19sb25nX2xpdmVkLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpzeXN0ZW1fZGlyLAorCQkJCSAgICAgICB1bnNpZ25lZCBzZXRfYnVmZmVyaW5nLAorCQkJCSAgICAgICB1bnNpZ25lZCB0aHJlYWRlZCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2V0X2Nvbm5lY3Rpb25zLAorCQkJCSAgICAgICB1bnNpZ25lZCBzZXRfZmlsdGVycyk7Cit2b2lkIGRlc3Ryb3lfdG9vbGNvbnRleHQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworaW50IHJlZnJlc2hfdG9vbGNvbnRleHQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworaW50IHJlZnJlc2hfZmlsdGVycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CitpbnQgcHJvY2Vzc19wcm9maWxhYmxlX2NvbmZpZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CitpbnQgY29uZmlnX2ZpbGVzX2NoYW5nZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworaW50IGluaXRfbHZtY2FjaGVfb3JwaGFucyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CitpbnQgaW5pdF9maWx0ZXJzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1bnNpZ25lZCBsb2FkX3BlcnNpc3RlbnRfY2FjaGUpOworaW50IGluaXRfY29ubmVjdGlvbnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCisvKgorICogQSBjb25maWcgY29udGV4dCBpcyBhIHZlcnkgbGlnaHQgd2VpZ2h0IGNtZCBzdHJ1Y3QgdGhhdAorICogaXMgb25seSB1c2VkIGZvciByZWFkaW5nIGNvbmZpZyBzZXR0aW5ncyBmcm9tIGx2bS5jb25mLAorICogd2hpY2ggYXJlIGF0IGNtZC0+Y2Z0LgorICovCitzdHJ1Y3QgY21kX2NvbnRleHQgKmNyZWF0ZV9jb25maWdfY29udGV4dCh2b2lkKTsKK3ZvaWQgZGVzdHJveV9jb25maWdfY29udGV4dChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKK3N0cnVjdCBmb3JtYXRfdHlwZSAqZ2V0X2Zvcm1hdF9ieV9uYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpmb3JtYXQpOworCitjb25zdCBjaGFyICpzeXN0ZW1faWRfZnJvbV9zdHJpbmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnN0cik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NvbmZpZy9jb25maWcuYyBiL2xpYi9jb25maWcvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0YzRiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb25maWcvY29uZmlnLmMKQEAgLTAsMCArMSwyNDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworCisjaW5jbHVkZSAibGliLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjcmMuaCIKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibHZtLWZpbGUuaCIKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqX2NvbmZpZ19zb3VyY2VfbmFtZXNbXSA9IHsKKwlbQ09ORklHX1VOREVGSU5FRF0gPSAidW5kZWZpbmVkIiwKKwlbQ09ORklHX0ZJTEVdID0gImZpbGUiLAorCVtDT05GSUdfTUVSR0VEX0ZJTEVTXSA9ICJtZXJnZWQgZmlsZXMiLAorCVtDT05GSUdfU1RSSU5HXSA9ICJzdHJpbmciLAorCVtDT05GSUdfUFJPRklMRV9DT01NQU5EXSA9ICJjb21tYW5kIHByb2ZpbGUiLAorCVtDT05GSUdfUFJPRklMRV9NRVRBREFUQV0gPSAibWV0YWRhdGEgcHJvZmlsZSIsCisJW0NPTkZJR19GSUxFX1NQRUNJQUxdID0gInNwZWNpYWwgcHVycG9zZSIKK307CisKK3N0cnVjdCBjb25maWdfZmlsZSB7CisJb2ZmX3Qgc3Rfc2l6ZTsKKwljaGFyICpmaWxlbmFtZTsKKwlpbnQgZXhpc3RzOworCWludCBrZWVwX29wZW47CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RydWN0IGNvbmZpZ19zb3VyY2UgeworCWNvbmZpZ19zb3VyY2VfdCB0eXBlOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXA7CisJdW5pb24geworCQlzdHJ1Y3QgY29uZmlnX2ZpbGUgKmZpbGU7CisJCXN0cnVjdCBjb25maWdfZmlsZSAqcHJvZmlsZTsKKwl9IHNvdXJjZTsKKwlzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqY2hlY2tfaGFuZGxlOworfTsKKworLyoKKyAqIE1hcCBlYWNoIElEIHRvIHJlc3BlY3RpdmUgZGVmaW5pdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBpdGVtLgorICovCitzdGF0aWMgc3RydWN0IGNmZ19kZWZfaXRlbSBfY2ZnX2RlZl9pdGVtc1tDRkdfQ09VTlQgKyAxXSA9IHsKKyNkZWZpbmUgY2ZnX3NlY3Rpb24oaWQsIG5hbWUsIHBhcmVudCwgZmxhZ3MsIHNpbmNlX3ZlcnNpb24sIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudCkge2lkLCBwYXJlbnQsIG5hbWUsIENGR19UWVBFX1NFQ1RJT04sIHswfSwgZmxhZ3MsIHNpbmNlX3ZlcnNpb24sIHswfSwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50fSwKKyNkZWZpbmUgY2ZnKGlkLCBuYW1lLCBwYXJlbnQsIGZsYWdzLCB0eXBlLCBkZWZhdWx0X3ZhbHVlLCBzaW5jZV92ZXJzaW9uLCB1bmNvbmZpZ3VyZWRfdmFsdWUsIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudCkge2lkLCBwYXJlbnQsIG5hbWUsIHR5cGUsIHsudl8jI3R5cGUgPSBkZWZhdWx0X3ZhbHVlfSwgZmxhZ3MsIHNpbmNlX3ZlcnNpb24sIHsudl9VTkNPTkZJR1VSRUQgPSB1bmNvbmZpZ3VyZWRfdmFsdWV9LCBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb24sIGRlcHJlY2F0aW9uX2NvbW1lbnQsIGNvbW1lbnR9LAorI2RlZmluZSBjZmdfcnVudGltZShpZCwgbmFtZSwgcGFyZW50LCBmbGFncywgdHlwZSwgc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50KSB7aWQsIHBhcmVudCwgbmFtZSwgdHlwZSwgey5mbl8jI3R5cGUgPSBnZXRfZGVmYXVsdF8jI2lkfSwgZmxhZ3MgfCBDRkdfREVGQVVMVF9SVU5fVElNRSwgc2luY2VfdmVyc2lvbiwgey5mbl9VTkNPTkZJR1VSRUQgPSBnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfIyNpZH0sIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudH0sCisjZGVmaW5lIGNmZ19hcnJheShpZCwgbmFtZSwgcGFyZW50LCBmbGFncywgdHlwZXMsIGRlZmF1bHRfdmFsdWUsIHNpbmNlX3ZlcnNpb24sIHVuY29uZmlndXJlZF92YWx1ZSwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50KSB7aWQsIHBhcmVudCwgbmFtZSwgQ0ZHX1RZUEVfQVJSQVkgfCB0eXBlcywgey52X0NGR19UWVBFX1NUUklORyA9IGRlZmF1bHRfdmFsdWV9LCBmbGFncywgc2luY2VfdmVyc2lvbiwgey52X1VOQ09ORklHVVJFRCA9IHVuY29uZmlndXJlZF92YWx1ZX0sIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudH0sCisjZGVmaW5lIGNmZ19hcnJheV9ydW50aW1lKGlkLCBuYW1lLCBwYXJlbnQsIGZsYWdzLCB0eXBlcywgc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50KSB7aWQsIHBhcmVudCwgbmFtZSwgQ0ZHX1RZUEVfQVJSQVkgfCB0eXBlcywgey5mbl9DRkdfVFlQRV9TVFJJTkcgPSBnZXRfZGVmYXVsdF8jI2lkfSwgZmxhZ3MgfCBDRkdfREVGQVVMVF9SVU5fVElNRSwgc2luY2VfdmVyc2lvbiwgey5mbl9VTkNPTkZJR1VSRUQgPSBnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfIyNpZH0sIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudH0sCisjaW5jbHVkZSAiY29uZmlnX3NldHRpbmdzLmgiCisjdW5kZWYgY2ZnX3NlY3Rpb24KKyN1bmRlZiBjZmcKKyN1bmRlZiBjZmdfcnVudGltZQorI3VuZGVmIGNmZ19hcnJheQorI3VuZGVmIGNmZ19hcnJheV9ydW50aW1lCit9OworCitjb25maWdfc291cmNlX3QgY29uZmlnX2dldF9zb3VyY2VfdHlwZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCkKK3sKKwlzdHJ1Y3QgY29uZmlnX3NvdXJjZSAqY3MgPSBkbV9jb25maWdfZ2V0X2N1c3RvbShjZnQpOworCXJldHVybiBjcyA/IGNzLT50eXBlIDogQ09ORklHX1VOREVGSU5FRDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2lzX3Byb2ZpbGVfYmFzZWRfY29uZmlnX3NvdXJjZShjb25maWdfc291cmNlX3Qgc291cmNlKQoreworCXJldHVybiAoc291cmNlID09IENPTkZJR19QUk9GSUxFX0NPTU1BTkQpIHx8CisJICAgICAgIChzb3VyY2UgPT0gQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfaXNfZmlsZV9iYXNlZF9jb25maWdfc291cmNlKGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UpCit7CisJcmV0dXJuIChzb3VyY2UgPT0gQ09ORklHX0ZJTEUpIHx8CisJICAgICAgIChzb3VyY2UgPT0gQ09ORklHX0ZJTEVfU1BFQ0lBTCkgfHwKKwkgICAgICAgX2lzX3Byb2ZpbGVfYmFzZWRfY29uZmlnX3NvdXJjZShzb3VyY2UpOworfQorCisvKgorICogcHVibGljIGludGVyZmFjZQorICovCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNvbmZpZ19vcGVuKGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UsCisJCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJICAgaW50IGtlZXBfb3BlbikKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKTsKKwlzdHJ1Y3QgY29uZmlnX3NvdXJjZSAqY3M7CisJc3RydWN0IGNvbmZpZ19maWxlICpjZjsKKworCWlmICghY2Z0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGNzID0gZG1fcG9vbF96YWxsb2MoY2Z0LT5tZW0sIHNpemVvZihzdHJ1Y3QgY29uZmlnX3NvdXJjZSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjb25maWcgc291cmNlLiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKF9pc19maWxlX2Jhc2VkX2NvbmZpZ19zb3VyY2Uoc291cmNlKSkgeworCQlpZiAoIShjZiA9IGRtX3Bvb2xfemFsbG9jKGNmdC0+bWVtLCBzaXplb2Yoc3RydWN0IGNvbmZpZ19maWxlKSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjb25maWcgZmlsZS4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWNmLT5rZWVwX29wZW4gPSBrZWVwX29wZW47CisJCWlmIChmaWxlbmFtZSAmJgorCQkgICAgIShjZi0+ZmlsZW5hbWUgPSBkbV9wb29sX3N0cmR1cChjZnQtPm1lbSwgZmlsZW5hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZHVwbGljYXRlIGZpbGVuYW1lLiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJY3MtPnNvdXJjZS5maWxlID0gY2Y7CisJfQorCisJY3MtPnR5cGUgPSBzb3VyY2U7CisJZG1fY29uZmlnX3NldF9jdXN0b20oY2Z0LCBjcyk7CisJcmV0dXJuIGNmdDsKK2ZhaWw6CisJZG1fY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERvZXNuJ3QgcG9wdWxhdGUgZmlsZW5hbWUgaWYgdGhlIGZpbGUgaXMgZW1wdHkuCisgKi8KK2ludCBjb25maWdfZmlsZV9jaGVjayhzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCAqaW5mbykKK3sKKwlzdHJ1Y3QgY29uZmlnX3NvdXJjZSAqY3MgPSBkbV9jb25maWdfZ2V0X2N1c3RvbShjZnQpOworCXN0cnVjdCBjb25maWdfZmlsZSAqY2Y7CisJc3RydWN0IHN0YXQgX2luZm87CisKKwlpZiAoIV9pc19maWxlX2Jhc2VkX2NvbmZpZ19zb3VyY2UoY3MtPnR5cGUpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY29uZmlnX2ZpbGVfY2hlY2s6IGV4cGVjdGVkIGZpbGUsIHNwZWNpYWwgZmlsZSBvciAiCisJCQkJCSAicHJvZmlsZSBjb25maWcgc291cmNlLCBmb3VuZCAlcyBjb25maWcgc291cmNlLiIsCisJCQkJCSBfY29uZmlnX3NvdXJjZV9uYW1lc1tjcy0+dHlwZV0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWluZm8pCisJCWluZm8gPSAmX2luZm87CisKKwljZiA9IGNzLT5zb3VyY2UuZmlsZTsKKworCWlmIChzdGF0KGNmLT5maWxlbmFtZSwgaW5mbykpIHsKKwkJbG9nX3N5c19lcnJvcigic3RhdCIsIGNmLT5maWxlbmFtZSk7CisJCWNmLT5leGlzdHMgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVNfSVNSRUcoaW5mby0+c3RfbW9kZSkpIHsKKwkJbG9nX2Vycm9yKCIlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLCBjZi0+ZmlsZW5hbWUpOworCQljZi0+ZXhpc3RzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJbHZtX3N0YXRfY3RpbSgmY3MtPnRpbWVzdGFtcCwgaW5mbyk7CisJY2YtPmV4aXN0cyA9IDE7CisJY2YtPnN0X3NpemUgPSBpbmZvLT5zdF9zaXplOworCisJaWYgKGluZm8tPnN0X3NpemUgPT0gMCkKKwkJbG9nX3ZlcmJvc2UoIiVzIGlzIGVtcHR5IiwgY2YtPmZpbGVuYW1lKTsKKwllbHNlIGlmIChmaWxlbmFtZSkKKwkJKmZpbGVuYW1lID0gY2YtPmZpbGVuYW1lOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiBjb25maWcgZmlsZXMgb3VnaHQgdG8gYmUgcmVsb2FkZWQKKyAqLworaW50IGNvbmZpZ19maWxlX2NoYW5nZWQoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY2Z0KTsKKwlzdHJ1Y3QgY29uZmlnX2ZpbGUgKmNmOworCXN0cnVjdCBzdGF0IGluZm87CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJaWYgKGNzLT50eXBlICE9IENPTkZJR19GSUxFKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY29uZmlnX2ZpbGVfY2hhbmdlZDogZXhwZWN0ZWQgZmlsZSBjb25maWcgc291cmNlLCAiCisJCQkJCSAiZm91bmQgJXMgY29uZmlnIHNvdXJjZS4iLCBfY29uZmlnX3NvdXJjZV9uYW1lc1tjcy0+dHlwZV0pOworCQlyZXR1cm4gMDsKKwl9CisKKwljZiA9IGNzLT5zb3VyY2UuZmlsZTsKKworCWlmICghY2YtPmZpbGVuYW1lKQorCQlyZXR1cm4gMDsKKworCWlmIChzdGF0KGNmLT5maWxlbmFtZSwgJmluZm8pID09IC0xKSB7CisJCS8qIElnbm9yZSBhIGRlbGV0ZWQgY29uZmlnIGZpbGU6IHN0aWxsIHVzZSBvcmlnaW5hbCBkYXRhICovCisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCWlmICghY2YtPmV4aXN0cykKKwkJCQlyZXR1cm4gMDsKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIkNvbmZpZyBmaWxlICVzIGhhcyBkaXNhcHBlYXJlZCEiLAorCQkJCQkgY2YtPmZpbGVuYW1lKTsKKwkJCWdvdG8gcmVsb2FkOworCQl9CisJCWxvZ19zeXNfZXJyb3IoInN0YXQiLCBjZi0+ZmlsZW5hbWUpOworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWxvYWQgY29uZmlndXJhdGlvbiBmaWxlcyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVNfSVNSRUcoaW5mby5zdF9tb2RlKSkgeworCQlsb2dfZXJyb3IoIkNvbmZpZ3VyYXRpb24gZmlsZSAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorCQkJICBjZi0+ZmlsZW5hbWUpOworCQlnb3RvIHJlbG9hZDsKKwl9CisKKwkvKiBVbmNoYW5nZWQ/ICovCisJbHZtX3N0YXRfY3RpbSgmdHMsICZpbmZvKTsKKwlpZiAoKHRpbWVzcGVjY21wKCZjcy0+dGltZXN0YW1wLCAmdHMsID09KSkgJiYKKwkgICAgY2YtPnN0X3NpemUgPT0gaW5mby5zdF9zaXplKQorCQlyZXR1cm4gMDsKKworICAgICAgcmVsb2FkOgorCWxvZ192ZXJib3NlKCJEZXRlY3RlZCBjb25maWcgZmlsZSBjaGFuZ2UgdG8gJXMiLCBjZi0+ZmlsZW5hbWUpOworCXJldHVybiAxOworfQorCit2b2lkIGNvbmZpZ19kZXN0cm95KHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCXN0cnVjdCBjb25maWdfc291cmNlICpjczsKKwlzdHJ1Y3QgY29uZmlnX2ZpbGUgKmNmOworCisJaWYgKCFjZnQpCisJCXJldHVybjsKKworCWNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY2Z0KTsKKworCWlmIChfaXNfZmlsZV9iYXNlZF9jb25maWdfc291cmNlKGNzLT50eXBlKSkgeworCQljZiA9IGNzLT5zb3VyY2UuZmlsZTsKKwkJaWYgKGNmICYmIGNmLT5kZXYpCisJCQlpZiAoIWRldl9jbG9zZShjZi0+ZGV2KSkKKwkJCQlzdGFjazsKKwl9CisKKwlkbV9jb25maWdfZGVzdHJveShjZnQpOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNvbmZpZ19maWxlX29wZW5fYW5kX3JlYWQoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsCisJCQkJCQkgY29uZmlnX3NvdXJjZV90IHNvdXJjZSwKKwkJCQkJCSBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdDsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKCEoY2Z0ID0gY29uZmlnX29wZW4oc291cmNlLCBjb25maWdfZmlsZSwgMCkpKSB7CisJCWxvZ19lcnJvcigiY29uZmlnX3RyZWUgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSXMgdGhlcmUgYSBjb25maWcgZmlsZT8gKi8KKwlpZiAoc3RhdChjb25maWdfZmlsZSwgJmluZm8pID09IC0xKSB7CisJCS8qIFByb2ZpbGUgZmlsZSBtdXN0IGJlIHByZXNlbnQhICovCisJCWlmIChlcnJubyA9PSBFTk9FTlQgJiYgKCFfaXNfcHJvZmlsZV9iYXNlZF9jb25maWdfc291cmNlKHNvdXJjZSkpKQorCQkJcmV0dXJuIGNmdDsKKwkJbG9nX3N5c19lcnJvcigic3RhdCIsIGNvbmZpZ19maWxlKTsKKwkJZ290byBiYWQ7CisJfQorCisJbG9nX3ZlcnlfdmVyYm9zZSgiTG9hZGluZyBjb25maWcgZmlsZTogJXMiLCBjb25maWdfZmlsZSk7CisJaWYgKCFjb25maWdfZmlsZV9yZWFkKGNmdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZSAlcyIsIGNvbmZpZ19maWxlKTsKKwkJZ290byBiYWQ7CisJfQorCisJcmV0dXJuIGNmdDsKK2JhZDoKKwljb25maWdfZGVzdHJveShjZnQpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmdldF9jb25maWdfdHJlZV9ieV9zb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCQkgY29uZmlnX3NvdXJjZV90IHNvdXJjZSkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IGNtZC0+Y2Z0OworCXN0cnVjdCBjb25maWdfc291cmNlICpjczsKKworCXdoaWxlIChjZnQpIHsKKwkJY3MgPSBkbV9jb25maWdfZ2V0X2N1c3RvbShjZnQpOworCQlpZiAoY3MgJiYgY3MtPnR5cGUgPT0gc291cmNlKQorCQkJcmV0dXJuIGNmdDsKKwkJY2Z0ID0gY2Z0LT5jYXNjYWRlOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmV0dXJucyBjb25maWcgdHJlZSBpZiBpdCB3YXMgcmVtb3ZlZC4KKyAqLworc3RydWN0IGRtX2NvbmZpZ190cmVlICpyZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgIGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpwcmV2aW91c19jZnQgPSBOVUxMOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0ID0gY21kLT5jZnQ7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzOworCisJd2hpbGUgKGNmdCkgeworCQljcyA9IGRtX2NvbmZpZ19nZXRfY3VzdG9tKGNmdCk7CisJCWlmIChjcyAmJiAoY3MtPnR5cGUgPT0gc291cmNlKSkgeworCQkJaWYgKHByZXZpb3VzX2NmdCkgeworCQkJCXByZXZpb3VzX2NmdC0+Y2FzY2FkZSA9IGNmdC0+Y2FzY2FkZTsKKwkJCQljbWQtPmNmdCA9IHByZXZpb3VzX2NmdDsKKwkJCX0gZWxzZQorCQkJCWNtZC0+Y2Z0ID0gY2Z0LT5jYXNjYWRlOworCQkJY2Z0LT5jYXNjYWRlID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXByZXZpb3VzX2NmdCA9IGNmdDsKKwkJY2Z0ID0gY2Z0LT5jYXNjYWRlOworCX0KKworCXJldHVybiBjZnQ7Cit9CisKK3N0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpnZXRfY29uZmlnX3RyZWVfY2hlY2tfaGFuZGxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgICAgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzOworCisJaWYgKCEoY3MgPSBkbV9jb25maWdfZ2V0X2N1c3RvbShjZnQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoY3MtPmNoZWNrX2hhbmRsZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEF0dGFjaCBjb25maWcgY2hlY2sgaGFuZGxlIHRvIGFsbCBjb25maWcgdHlwZXMgYnV0CisJICogQ09ORklHX0ZJTEVfU1BFQ0lBTCAtIHRoaXMgb25lIHVzZXMgaXRzIG93biBjaGVjaworCSAqIG1ldGhvZHMgYW5kIHRoZSBjZnRfY2hlY2tfaGFuZGxlIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuCisJICovCisJaWYgKGNzLT50eXBlICE9IENPTkZJR19GSUxFX1NQRUNJQUwpIHsKKwkJaWYgKCEoY3MtPmNoZWNrX2hhbmRsZSA9IGRtX3Bvb2xfemFsbG9jKGNmdC0+bWVtLCBzaXplb2YoKmNzLT5jaGVja19oYW5kbGUpKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZ3VyYXRpb24gY2hlY2sgaGFuZGxlLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3MtPmNoZWNrX2hhbmRsZS0+Y2Z0ID0gY2Z0OworCQljcy0+Y2hlY2tfaGFuZGxlLT5jbWQgPSBjbWQ7CisJfQorb3V0OgorCXJldHVybiBjcy0+Y2hlY2tfaGFuZGxlOworfQorCisKK2ludCBvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3N0cmluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19zZXR0aW5ncykKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdF9uZXc7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY21kLT5jZnQpOworCisJLyoKKwkgKiBGb2xsb3cgdGhpcyBzZXF1ZW5jZToKKwkgKiBDT05GSUdfU1RSSU5HIC0+IENPTkZJR19QUk9GSUxFX0NPTU1BTkQgLT4gQ09ORklHX1BST0ZJTEVfTUVUQURBVEEgLT4gQ09ORklHX0ZJTEUvQ09ORklHX01FUkdFRF9GSUxFUworCSAqLworCisJaWYgKGNzLT50eXBlID09IENPTkZJR19TVFJJTkcpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3N0cmluZzogIgorCQkJICAiY29uZmlnIGNhc2NhZGUgYWxyZWFkeSBjb250YWlucyBhIHN0cmluZyBjb25maWcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGNmdF9uZXcgPSBkbV9jb25maWdfZnJvbV9zdHJpbmcoY29uZmlnX3NldHRpbmdzKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0IG92ZXJyaWRkZW4gY29uZmlndXJhdGlvbiBlbnRyaWVzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShjcyA9IGRtX3Bvb2xfemFsbG9jKGNmdF9uZXctPm1lbSwgc2l6ZW9mKHN0cnVjdCBjb25maWdfc291cmNlKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZyBzb3VyY2UuIik7CisJCWRtX2NvbmZpZ19kZXN0cm95KGNmdF9uZXcpOworCQlyZXR1cm4gMDsKKwl9CisKKwljcy0+dHlwZSA9IENPTkZJR19TVFJJTkc7CisJZG1fY29uZmlnX3NldF9jdXN0b20oY2Z0X25ldywgY3MpOworCisJY21kLT5jZnQgPSBkbV9jb25maWdfaW5zZXJ0X2Nhc2NhZGVkX3RyZWUoY2Z0X25ldywgY21kLT5jZnQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX292ZXJyaWRlX2NvbmZpZ190cmVlX2Zyb21fY29tbWFuZF9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgICAgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQgPSBjbWQtPmNmdCwgKmNmdF9wcmV2aW91cyA9IE5VTEw7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY2Z0KTsKKworCWlmIChjcy0+dHlwZSA9PSBDT05GSUdfU1RSSU5HKSB7CisJCWNmdF9wcmV2aW91cyA9IGNmdDsKKwkJY2Z0ID0gY2Z0LT5jYXNjYWRlOworCQljcyA9IGRtX2NvbmZpZ19nZXRfY3VzdG9tKGNmdCk7CisJfQorCisJaWYgKGNzLT50eXBlID09IENPTkZJR19QUk9GSUxFX0NPTU1BTkQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9jb21tYW5kX3Byb2ZpbGU6ICIKKwkJCQkiY29uZmlnIGNhc2NhZGUgYWxyZWFkeSBjb250YWlucyBhIGNvbW1hbmQgcHJvZmlsZSBjb25maWcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjZnRfcHJldmlvdXMpCisJCWRtX2NvbmZpZ19pbnNlcnRfY2FzY2FkZWRfdHJlZShjZnRfcHJldmlvdXMsIHByb2ZpbGUtPmNmdCk7CisJZWxzZQorCQljbWQtPmNmdCA9IHByb2ZpbGUtPmNmdDsKKworCWRtX2NvbmZpZ19pbnNlcnRfY2FzY2FkZWRfdHJlZShwcm9maWxlLT5jZnQsIGNmdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9tZXRhZGF0YV9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgICAgIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0ID0gY21kLT5jZnQsICpjZnRfcHJldmlvdXMgPSBOVUxMOworCXN0cnVjdCBjb25maWdfc291cmNlICpjcyA9IGRtX2NvbmZpZ19nZXRfY3VzdG9tKGNmdCk7CisKKwlpZiAoY3MtPnR5cGUgPT0gQ09ORklHX1NUUklORykgeworCQljZnRfcHJldmlvdXMgPSBjZnQ7CisJCWNmdCA9IGNmdC0+Y2FzY2FkZTsKKwl9CisKKwlpZiAoY3MtPnR5cGUgPT0gQ09ORklHX1BST0ZJTEVfQ09NTUFORCkgeworCQljZnRfcHJldmlvdXMgPSBjZnQ7CisJCWNmdCA9IGNmdC0+Y2FzY2FkZTsKKwl9CisKKwljcyA9IGRtX2NvbmZpZ19nZXRfY3VzdG9tKGNmdCk7CisKKwlpZiAoY3MtPnR5cGUgPT0gQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9tZXRhZGF0YV9wcm9maWxlOiAiCisJCQkJImNvbmZpZyBjYXNjYWRlIGFscmVhZHkgY29udGFpbnMgYSBtZXRhZGF0YSBwcm9maWxlIGNvbmZpZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNmdF9wcmV2aW91cykKKwkJZG1fY29uZmlnX2luc2VydF9jYXNjYWRlZF90cmVlKGNmdF9wcmV2aW91cywgcHJvZmlsZS0+Y2Z0KTsKKwllbHNlCisJCWNtZC0+Y2Z0ID0gcHJvZmlsZS0+Y2Z0OworCisJZG1fY29uZmlnX2luc2VydF9jYXNjYWRlZF90cmVlKHByb2ZpbGUtPmNmdCwgY2Z0KTsKKworCXJldHVybiAxOworfQorCitpbnQgb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCS8qCisJICogRm9sbG93IHRoaXMgc2VxdWVuY2U6CisJICogQ09ORklHX1NUUklORyAtPiBDT05GSUdfUFJPRklMRV9DT01NQU5EIC0+IENPTkZJR19QUk9GSUxFX01FVEFEQVRBIC0+IENPTkZJR19GSUxFL0NPTkZJR19NRVJHRURfRklMRVMKKwkgKi8KKworCWlmICghcHJvZmlsZS0+Y2Z0ICYmICFsb2FkX3Byb2ZpbGUoY21kLCBwcm9maWxlKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAocHJvZmlsZS0+c291cmNlID09IENPTkZJR19QUk9GSUxFX0NPTU1BTkQpCisJCXJldHVybiBfb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9jb21tYW5kX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwllbHNlIGlmIChwcm9maWxlLT5zb3VyY2UgPT0gQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpCisJCXJldHVybiBfb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9tZXRhZGF0YV9wcm9maWxlKGNtZCwgcHJvZmlsZSk7CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIm92ZXJyaWRlX2NvbmZpZ190cmVlX2Zyb21fcHJvZmlsZTogaW5jb3JyZWN0IHByb2ZpbGUgc291cmNlIHR5cGUiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoZW4gY2hlY2tzdW1fb25seSBpcyBzZXQsIHRoZSBjaGVja3N1bSBvZiBidWZmZXIgaXMgb25seSBtYXRjaGVkCisgKiBhbmQgZnVuY3Rpb24gYXZvaWRzIHBhcnNpbmcgb2YgbWRhIGludG8gY29uZmlnIHRyZWUgd2hpY2gKKyAqIHJlbWFpbnMgdW5tb2RpZmllZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgorICovCitpbnQgY29uZmlnX2ZpbGVfcmVhZF9mZChzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2Zmc2V0Miwgc2l6ZV90IHNpemUyLAorCQkJY2hlY2tzdW1fZm5fdCBjaGVja3N1bV9mbiwgdWludDMyX3QgY2hlY2tzdW0sCisJCQlpbnQgY2hlY2tzdW1fb25seSkKK3sKKwljaGFyICpmYiwgKmZlOworCWludCByID0gMDsKKwlpbnQgdXNlX21tYXAgPSAxOworCW9mZl90IG1tYXBfb2Zmc2V0ID0gMDsKKwljaGFyICpidWYgPSBOVUxMOworCXN0cnVjdCBjb25maWdfc291cmNlICpjcyA9IGRtX2NvbmZpZ19nZXRfY3VzdG9tKGNmdCk7CisKKwlpZiAoIV9pc19maWxlX2Jhc2VkX2NvbmZpZ19zb3VyY2UoY3MtPnR5cGUpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY29uZmlnX2ZpbGVfcmVhZF9mZDogZXhwZWN0ZWQgZmlsZSwgc3BlY2lhbCBmaWxlICIKKwkJCQkJICJvciBwcm9maWxlIGNvbmZpZyBzb3VyY2UsIGZvdW5kICVzIGNvbmZpZyBzb3VyY2UuIiwKKwkJCQkJIF9jb25maWdfc291cmNlX25hbWVzW2NzLT50eXBlXSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE9ubHkgdXNlIG1tYXAgd2l0aCByZWd1bGFyIGZpbGVzICovCisJaWYgKCEoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKSB8fCBzaXplMikKKwkJdXNlX21tYXAgPSAwOworCisJaWYgKHVzZV9tbWFwKSB7CisJCW1tYXBfb2Zmc2V0ID0gb2Zmc2V0ICUgbHZtX2dldHBhZ2VzaXplKCk7CisJCS8qIG1lbW9yeSBtYXAgdGhlIGZpbGUgKi8KKwkJZmIgPSBtbWFwKChjYWRkcl90KSAwLCBzaXplICsgbW1hcF9vZmZzZXQsIFBST1RfUkVBRCwKKwkJCSAgTUFQX1BSSVZBVEUsIGRldl9mZChkZXYpLCBvZmZzZXQgLSBtbWFwX29mZnNldCk7CisJCWlmIChmYiA9PSAoY2FkZHJfdCkgKC0xKSkgeworCQkJbG9nX3N5c19lcnJvcigibW1hcCIsIGRldl9uYW1lKGRldikpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmIgPSBmYiArIG1tYXBfb2Zmc2V0OworCX0gZWxzZSB7CisJCWlmICghKGJ1ZiA9IGRtX21hbGxvYyhzaXplICsgc2l6ZTIpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2lyY3VsYXIgYnVmZmVyLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFkZXZfcmVhZF9jaXJjdWxhcihkZXYsICh1aW50NjRfdCkgb2Zmc2V0LCBzaXplLAorCQkJCSAgICAgICAodWludDY0X3QpIG9mZnNldDIsIHNpemUyLCBidWYpKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmYiA9IGJ1ZjsKKwl9CisKKwlpZiAoY2hlY2tzdW1fZm4gJiYgY2hlY2tzdW0gIT0KKwkgICAgKGNoZWNrc3VtX2ZuKGNoZWNrc3VtX2ZuKElOSVRJQUxfQ1JDLCAoY29uc3QgdWludDhfdCAqKWZiLCBzaXplKSwKKwkJCSAoY29uc3QgdWludDhfdCAqKShmYiArIHNpemUpLCBzaXplMikpKSB7CisJCWxvZ19lcnJvcigiJXM6IENoZWNrc3VtIGVycm9yIiwgZGV2X25hbWUoZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghY2hlY2tzdW1fb25seSkgeworCQlmZSA9IGZiICsgc2l6ZSArIHNpemUyOworCQlpZiAoIWRtX2NvbmZpZ19wYXJzZShjZnQsIGZiLCBmZSkpCisJCQlnb3RvX291dDsKKwl9CisKKwlyID0gMTsKKworICAgICAgb3V0OgorCWlmICghdXNlX21tYXApCisJCWRtX2ZyZWUoYnVmKTsKKwllbHNlIHsKKwkJLyogdW5tYXAgdGhlIGZpbGUgKi8KKwkJaWYgKG11bm1hcChmYiAtIG1tYXBfb2Zmc2V0LCBzaXplICsgbW1hcF9vZmZzZXQpKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJtdW5tYXAiLCBkZXZfbmFtZShkZXYpKTsKKwkJCXIgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBjb25maWdfZmlsZV9yZWFkKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKwlzdHJ1Y3QgY29uZmlnX3NvdXJjZSAqY3MgPSBkbV9jb25maWdfZ2V0X2N1c3RvbShjZnQpOworCXN0cnVjdCBjb25maWdfZmlsZSAqY2Y7CisJc3RydWN0IHN0YXQgaW5mbzsKKwlpbnQgcjsKKworCWlmICghY29uZmlnX2ZpbGVfY2hlY2soY2Z0LCAmZmlsZW5hbWUsICZpbmZvKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBOb3RoaW5nIHRvIGRvLiAgRS5nLiBlbXB0eSBmaWxlLiAqLworCWlmICghZmlsZW5hbWUpCisJCXJldHVybiAxOworCisJY2YgPSBjcy0+c291cmNlLmZpbGU7CisKKwlpZiAoIWNmLT5kZXYpIHsKKwkJaWYgKCEoY2YtPmRldiA9IGRldl9jcmVhdGVfZmlsZShmaWxlbmFtZSwgTlVMTCwgTlVMTCwgMSkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFkZXZfb3Blbl9yZWFkb25seV9idWZmZXJlZChjZi0+ZGV2KSkgeworCQkJZGV2X2Rlc3Ryb3lfZmlsZShjZi0+ZGV2KTsKKwkJCWNmLT5kZXYgPSBOVUxMOworCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlyID0gY29uZmlnX2ZpbGVfcmVhZF9mZChjZnQsIGNmLT5kZXYsIDAsIChzaXplX3QpIGluZm8uc3Rfc2l6ZSwgMCwgMCwKKwkJCQkoY2hlY2tzdW1fZm5fdCkgTlVMTCwgMCwgMCk7CisKKwlpZiAoIWNmLT5rZWVwX29wZW4pIHsKKwkJaWYgKCFkZXZfY2xvc2UoY2YtPmRldikpCisJCQlzdGFjazsKKwkJY2YtPmRldiA9IE5VTEw7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0cnVjdCB0aW1lc3BlYyBjb25maWdfZmlsZV90aW1lc3RhbXAoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY2Z0KTsKKwlyZXR1cm4gY3MtPnRpbWVzdGFtcDsKK30KKworI2RlZmluZSBjZmdfZGVmX2dldF9pdGVtX3AoaWQpICgmX2NmZ19kZWZfaXRlbXNbaWRdKQorI2RlZmluZSBjZmdfZGVmX2dldF9kZWZhdWx0X3VuY29uZmlndXJlZF92YWx1ZV9oaW50KGNtZCxpdGVtKSAoKGl0ZW0tPmZsYWdzICYgQ0ZHX0RFRkFVTFRfUlVOX1RJTUUpID8gaXRlbS0+ZGVmYXVsdF91bmNvbmZpZ3VyZWRfdmFsdWUuZm5fVU5DT05GSUdVUkVEKGNtZCkgOiBpdGVtLT5kZWZhdWx0X3VuY29uZmlndXJlZF92YWx1ZS52X1VOQ09ORklHVVJFRCkKKyNkZWZpbmUgY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZV9oaW50KGNtZCxpdGVtLHR5cGUscHJvZmlsZSkgKChpdGVtLT5mbGFncyAmIENGR19ERUZBVUxUX1JVTl9USU1FKSA/IGl0ZW0tPmRlZmF1bHRfdmFsdWUuZm5fIyN0eXBlKGNtZCxwcm9maWxlKSA6IGl0ZW0tPmRlZmF1bHRfdmFsdWUudl8jI3R5cGUpCisjZGVmaW5lIGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLGl0ZW0sdHlwZSxwcm9maWxlKSAoaXRlbS0+ZmxhZ3MgJiBDRkdfREVGQVVMVF9VTkRFRklORUQgPyAwIDogY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZV9oaW50KGNtZCxpdGVtLHR5cGUscHJvZmlsZSkpCisKK3N0YXRpYyBpbnQgX2NmZ19kZWZfbWFrZV9wYXRoKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBpbnQgaWQsIGNmZ19kZWZfaXRlbV90ICppdGVtLCBpbnQgeGxhdGUpCit7CisJaW50IHZhcmlhYmxlID0gaXRlbS0+ZmxhZ3MgJiBDRkdfTkFNRV9WQVJJQUJMRTsKKwlpbnQgcGFyZW50X2lkID0gaXRlbS0+cGFyZW50OworCWludCBjb3VudCwgbjsKKworCWlmIChpZCA9PSBwYXJlbnRfaWQpIHsKKwkJYnVmWzBdID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCisJY291bnQgPSBfY2ZnX2RlZl9tYWtlX3BhdGgoYnVmLCBidWZfc2l6ZSwgcGFyZW50X2lkLCBjZmdfZGVmX2dldF9pdGVtX3AocGFyZW50X2lkKSwgeGxhdGUpOworCWlmICgobiA9IGRtX3NucHJpbnRmKGJ1ZiArIGNvdW50LCBidWZfc2l6ZSAtIGNvdW50LCAiJXMlcyVzJXMiLAorCQkJICAgICBjb3VudCA/ICIvIiA6ICIiLAorCQkJICAgICB4bGF0ZSAmJiB2YXJpYWJsZSA/ICI8IiA6ICIiLAorCQkJICAgICAheGxhdGUgJiYgdmFyaWFibGUgPyAiIyIgOiBpdGVtLT5uYW1lLAorCQkJICAgICB4bGF0ZSAmJiB2YXJpYWJsZSA/ICI+IiA6ICIiKSkgPCAwKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2NmZ19kZWZfbWFrZV9wYXRoOiBzdXBwbGllZCBidWZmZXIgdG9vIHNtYWxsIGZvciAlcy8lcyIsCisJCQkJCSAgY2ZnX2RlZl9nZXRfaXRlbV9wKHBhcmVudF9pZCktPm5hbWUsIGl0ZW0tPm5hbWUpOworCQlidWZbMF0gPSAnXDAnOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gY291bnQgKyBuOworfQorCitpbnQgY29uZmlnX2RlZl9nZXRfcGF0aChjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwgaW50IGlkKQoreworCXJldHVybiBfY2ZnX2RlZl9tYWtlX3BhdGgoYnVmLCBidWZfc2l6ZSwgaWQsIGNmZ19kZWZfZ2V0X2l0ZW1fcChpZCksIDApOworfQorCitzdGF0aWMgdm9pZCBfZ2V0X3R5cGVfbmFtZShjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwgY2ZnX2RlZl90eXBlX3QgdHlwZSkKK3sKKwkodm9pZCkgZG1fc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiVzJXMlcyVzJXMlcyIsCisJCQkgICAodHlwZSAmIENGR19UWVBFX0FSUkFZKSA/CisJCQkJKCh0eXBlICYgfkNGR19UWVBFX0FSUkFZKSA/CisJCQkJICIgYXJyYXkgd2l0aCB2YWx1ZXMgb2YgdHlwZToiIDogIiBhcnJheSIpIDogIiIsCisJCQkgICAodHlwZSAmIENGR19UWVBFX1NFQ1RJT04pID8gIiBzZWN0aW9uIiA6ICIiLAorCQkJICAgKHR5cGUgJiBDRkdfVFlQRV9CT09MKSA/ICAiIGJvb2xlYW4iIDogIiIsCisJCQkgICAodHlwZSAmIENGR19UWVBFX0lOVCkgPyAiIGludGVnZXIiIDogIiIsCisJCQkgICAodHlwZSAmIENGR19UWVBFX0ZMT0FUKSA/ICAiIGZsb2F0IiA6ICIiLAorCQkJICAgKHR5cGUgJiBDRkdfVFlQRV9TVFJJTkcpID8gIiBzdHJpbmciIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBfbG9nX3R5cGVfZXJyb3IoY29uc3QgY2hhciAqcGF0aCwgY2ZnX2RlZl90eXBlX3QgYWN0dWFsLAorCQkJICAgIGNmZ19kZWZfdHlwZV90IGV4cGVjdGVkLCBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpCit7CisJc3RhdGljIGNoYXIgYWN0dWFsX3R5cGVfbmFtZVsxMjhdOworCXN0YXRpYyBjaGFyIGV4cGVjdGVkX3R5cGVfbmFtZVsxMjhdOworCisJX2dldF90eXBlX25hbWUoYWN0dWFsX3R5cGVfbmFtZSwgc2l6ZW9mKGFjdHVhbF90eXBlX25hbWUpLCBhY3R1YWwpOworCV9nZXRfdHlwZV9uYW1lKGV4cGVjdGVkX3R5cGVfbmFtZSwgc2l6ZW9mKGV4cGVjdGVkX3R5cGVfbmFtZSksIGV4cGVjdGVkKTsKKworCWxvZ193YXJuX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLCAiV0FSTklORzogQ29uZmlndXJhdGlvbiBzZXR0aW5nIFwiJXNcIiBoYXMgaW52YWxpZCB0eXBlLiAiCisJCQkJCSAgICAgIkZvdW5kJXMgYnV0IGV4cGVjdGVkJXMuIiwgcGF0aCwKKwkJCQkJICAgICBhY3R1YWxfdHlwZV9uYW1lLCBleHBlY3RlZF90eXBlX25hbWUpOworfQorCitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqX2dldF9kZWZfYXJyYXlfdmFsdWVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgICBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJCSAgICAgY29uc3QgY2ZnX2RlZl9pdGVtX3QgKmRlZiwKKwkJCQkJCSAgICAgdWludDMyX3QgZm9ybWF0X2ZsYWdzKQoreworCWNvbnN0IGNoYXIgKmRlZl9lbmNfdmFsdWU7CisJY2hhciAqZW5jX3ZhbHVlLCAqdG9rZW4sICpwLCAqcjsKKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICphcnJheSA9IE5VTEwsICp2ID0gTlVMTCwgKm9sZHYgPSBOVUxMOworCisJZGVmX2VuY192YWx1ZSA9IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBkZWYsIENGR19UWVBFX0FSUkFZLCBOVUxMKTsKKworCWlmICghZGVmX2VuY192YWx1ZSkgeworCQlpZiAoIShhcnJheSA9IGRtX2NvbmZpZ19jcmVhdGVfdmFsdWUoY2Z0KSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBkZWZhdWx0IGVtcHR5IGFycmF5IGZvciAlcy4iLCBkZWYtPm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYXJyYXktPnR5cGUgPSBETV9DRkdfRU1QVFlfQVJSQVk7CisJCWRtX2NvbmZpZ192YWx1ZV9zZXRfZm9ybWF0X2ZsYWdzKGFycmF5LCBmb3JtYXRfZmxhZ3MpOworCQlyZXR1cm4gYXJyYXk7CisJfQorCisJaWYgKCEocCA9IHRva2VuID0gZW5jX3ZhbHVlID0gZG1fc3RyZHVwKGRlZl9lbmNfdmFsdWUpKSkgeworCQlsb2dfZXJyb3IoIl9nZXRfZGVmX2FycmF5X3ZhbHVlczogZG1fc3RyZHVwIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogUHJvcGVyIHZhbHVlIGFsd2F5cyBzdGFydHMgd2l0aCAnIycuICovCisJaWYgKHRva2VuWzBdICE9ICcjJykKKwkJZ290byBiYWQ7CisKKwl3aGlsZSAodG9rZW4pIHsKKwkJLyogTW92ZSB0byB0eXBlIGlkZW50aWZpZXIuIEVycm9yIG9uIG5vIGNoYXIuICovCisJCXRva2VuKys7CisJCWlmICghdG9rZW5bMF0pCisJCQlnb3RvIGJhZDsKKworCQkvKiBNb3ZlIHRvIHRoZSBhY3R1YWwgdmFsdWUgYW5kIGRlY29kZSBhbnkgIiMjIiBpbnRvICIjIi4gKi8KKwkJcCA9IHRva2VuICsgMTsKKwkJd2hpbGUgKChwID0gc3RyY2hyKHAsICcjJykpICYmIHBbMV0gPT0gJyMnKSB7CisJCQltZW1tb3ZlKHAsIHAgKyAxLCBzdHJsZW4ocCkpOworCQkJcCsrOworCQl9CisJCS8qIFNlcGFyYXRlIHRoZSB2YWx1ZSBvdXQgb2YgdGhlIHdob2xlIHN0cmluZy4gKi8KKwkJaWYgKHApCisJCQlwWzBdID0gJ1wwJzsKKworCQlpZiAoISh2ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShjZnQpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRlZmF1bHQgY29uZmlnIGFycmF5IHZhbHVlIGZvciAlcy4iLCBkZWYtPm5hbWUpOworCQkJZG1fZnJlZShlbmNfdmFsdWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlkbV9jb25maWdfdmFsdWVfc2V0X2Zvcm1hdF9mbGFncyh2LCBmb3JtYXRfZmxhZ3MpOworCisJCWlmIChvbGR2KQorCQkJb2xkdi0+bmV4dCA9IHY7CisJCWlmICghYXJyYXkpCisJCQlhcnJheSA9IHY7CisKKwkJc3dpdGNoICh0b3VwcGVyKHRva2VuWzBdKSkgeworCQkJY2FzZSAnSSc6CisJCQljYXNlICdCJzoKKwkJCQl2LT52LmkgPSBzdHJ0b2xsKHRva2VuICsgMSwgJnIsIDEwKTsKKwkJCQlpZiAoKnIpCisJCQkJCWdvdG8gYmFkOworCQkJCXYtPnR5cGUgPSBETV9DRkdfSU5UOworCQkJCWJyZWFrOworCQkJY2FzZSAnRic6CisJCQkJdi0+di5mID0gc3RydG9kKHRva2VuICsgMSwgJnIpOworCQkJCWlmICgqcikKKwkJCQkJZ290byBiYWQ7CisJCQkJdi0+dHlwZSA9IERNX0NGR19GTE9BVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWlmICghKHIgPSBkbV9wb29sX3N0cmR1cChjZnQtPm1lbSwgdG9rZW4gKyAxKSkpIHsKKwkJCQkJZG1fZnJlZShlbmNfdmFsdWUpOworCQkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgdG9rZW4gZm9yIGRlZmF1bHQgIgorCQkJCQkJICAiYXJyYXkgdmFsdWUgb2YgJXMuIiwgZGVmLT5uYW1lKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCXYtPnYuc3RyID0gcjsKKwkJCQl2LT50eXBlID0gRE1fQ0ZHX1NUUklORzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBiYWQ7CisJCX0KKworCQlvbGR2ID0gdjsKKwkJdG9rZW4gPSBwOworCX0KKworCWRtX2ZyZWUoZW5jX3ZhbHVlKTsKKwlyZXR1cm4gYXJyYXk7CitiYWQ6CisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJEZWZhdWx0IGFycmF5IHZhbHVlIG1hbGZvcm1lZCBmb3IgXCIlc1wiLCAiCisJCSAgInZhbHVlOiBcIiVzXCIsIHRva2VuOiBcIiVzXCIuIiwgZGVmLT5uYW1lLAorCQkgIGRlZi0+ZGVmYXVsdF92YWx1ZS52X0NGR19UWVBFX1NUUklORywgdG9rZW4pOworCWRtX2ZyZWUoZW5jX3ZhbHVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfY29uZmlnX2RlZl9jaGVja19ub2RlX3NpbmdsZV92YWx1ZShzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqaGFuZGxlLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqcnAsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnYsCisJCQkJCSAgICAgICBjb25zdCBjZmdfZGVmX2l0ZW1fdCAqZGVmKQoreworCS8qIENoZWNrIGVtcHR5IGFycmF5IGZpcnN0IGlmIHByZXNlbnQuICovCisJaWYgKHYtPnR5cGUgPT0gRE1fQ0ZHX0VNUFRZX0FSUkFZKSB7CisJCWlmICghKGRlZi0+dHlwZSAmIENGR19UWVBFX0FSUkFZKSkgeworCQkJX2xvZ190eXBlX2Vycm9yKHJwLCBDRkdfVFlQRV9BUlJBWSwgZGVmLT50eXBlLCBoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghKGRlZi0+ZmxhZ3MgJiBDRkdfQUxMT1dfRU1QVFkpKSB7CisJCQlsb2dfd2Fybl9zdXBwcmVzcyhoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzLAorCQkJCSJDb25maWd1cmF0aW9uIHNldHRpbmcgXCIlc1wiIGludmFsaWQuIEVtcHR5IHZhbHVlIG5vdCBhbGxvd2VkLiIsIHJwKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKworCXN3aXRjaCAodi0+dHlwZSkgeworCQljYXNlIERNX0NGR19JTlQ6CisJCQlpZiAoIShkZWYtPnR5cGUgJiBDRkdfVFlQRV9JTlQpICYmICEoZGVmLT50eXBlICYgQ0ZHX1RZUEVfQk9PTCkpIHsKKwkJCQlfbG9nX3R5cGVfZXJyb3IocnAsIENGR19UWVBFX0lOVCwgZGVmLT50eXBlLCBoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERNX0NGR19GTE9BVDoKKwkJCWlmICghKGRlZi0+dHlwZSAmIENGR19UWVBFX0ZMT0FUKSkgeworCQkJCV9sb2dfdHlwZV9lcnJvcihycCwgQ0ZHX1RZUEVfRkxPQVQsIGRlZi0+dHlwZSwgaGFuZGxlLT4gc3VwcHJlc3NfbWVzc2FnZXMpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRE1fQ0ZHX1NUUklORzoKKwkJCWlmIChkZWYtPnR5cGUgJiBDRkdfVFlQRV9CT09MKSB7CisJCQkJaWYgKCFkbV9jb25maWdfdmFsdWVfaXNfYm9vbCh2KSkgeworCQkJCQlsb2dfd2Fybl9zdXBwcmVzcyhoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzLAorCQkJCQkJIkNvbmZpZ3VyYXRpb24gc2V0dGluZyBcIiVzXCIgaW52YWxpZC4gIgorCQkJCQkJIkZvdW5kIHN0cmluZyB2YWx1ZSBcIiVzXCIsICIKKwkJCQkJCSJleHBlY3RlZCBib29sZWFuIHZhbHVlOiAwLzEsIFwieS9uXCIsICIKKwkJCQkJCSJcInllcy9ub1wiLCBcIm9uL29mZlwiLCAiCisJCQkJCQkiXCJ0cnVlL2ZhbHNlXCIuIiwgcnAsIHYtPnYuc3RyKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIGlmICAoIShkZWYtPnR5cGUgJiBDRkdfVFlQRV9TVFJJTkcpKSB7CisJCQkJX2xvZ190eXBlX2Vycm9yKHJwLCBDRkdfVFlQRV9TVFJJTkcsIGRlZi0+dHlwZSwgaGFuZGxlLT5zdXBwcmVzc19tZXNzYWdlcyk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKCEoZGVmLT5mbGFncyAmIENGR19BTExPV19FTVBUWSkgJiYgISp2LT52LnN0cikgeworCQkJCWxvZ193YXJuX3N1cHByZXNzKGhhbmRsZS0+c3VwcHJlc3NfbWVzc2FnZXMsCisJCQkJCQkgICJDb25maWd1cmF0aW9uIHNldHRpbmcgXCIlc1wiIGludmFsaWQuICIKKwkJCQkJCSAgIkl0IGNhbm5vdCBiZSBzZXQgdG8gYW4gZW1wdHkgdmFsdWUuIiwgcnApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6IDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfdmFsdWVfZGlmZmVyc19mcm9tX2RlZmF1bHQoc3RydWN0IGNmdF9jaGVja19oYW5kbGUgKmhhbmRsZSwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2LAorCQkJCQkgICAgIGNvbnN0IGNmZ19kZWZfaXRlbV90ICpkZWYsCisJCQkJCSAgICAgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdl9kZWYpCit7CisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdl9kZWZfYXJyYXksICp2X2RlZl9pdGVyOworCWludCBkaWZmID0gMCwgaWQ7CisJaW50NjRfdCBpOworCWZsb2F0IGY7CisJY29uc3QgY2hhciAqc3RyOworCisJaWYgKChoYW5kbGUtPmlnbm9yZXVuc3VwcG9ydGVkICYmIChkZWYtPmZsYWdzICYgQ0ZHX1VOU1VQUE9SVEVEKSkgfHwKKwkgICAgKGhhbmRsZS0+aWdub3JlYWR2YW5jZWQgJiYgKGRlZi0+ZmxhZ3MgJiBDRkdfQURWQU5DRUQpKSkgeworCQlkaWZmID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaWYgZGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQsIHRoZSB2YWx1ZSB1c2VkIGRpZmZlcnMgZnJvbSBkZWZhdWx0ICovCisJaWYgKGRlZi0+ZmxhZ3MgJiBDRkdfREVGQVVMVF9VTkRFRklORUQpIHsKKwkJZGlmZiA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghdl9kZWYgJiYgKGRlZi0+dHlwZSAmIENGR19UWVBFX0FSUkFZKSkgeworCQlpZiAoISh2X2RlZl9hcnJheSA9IHZfZGVmX2l0ZXIgPSBfZ2V0X2RlZl9hcnJheV92YWx1ZXMoaGFuZGxlLT5jbWQsIGhhbmRsZS0+Y2Z0LCBkZWYsIDApKSkKKwkJCXJldHVybl8wOworCQlkbyB7CisJCQkvKiBpdGVyYXRlIG92ZXIgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBhbmQgY2hlY2sgaXRzIHZhbHVlICovCisJCQlpZiAoKHYtPnR5cGUgIT0gdl9kZWZfaXRlci0+dHlwZSkgfHwKKwkJCSAgICBfY2hlY2tfdmFsdWVfZGlmZmVyc19mcm9tX2RlZmF1bHQoaGFuZGxlLCB2LCBkZWYsIHZfZGVmX2l0ZXIpKQorCQkJCWJyZWFrOworCQkJdl9kZWZfaXRlciA9IHZfZGVmX2l0ZXItPm5leHQ7CisJCQl2ID0gdi0+bmV4dDsKKwkJfSB3aGlsZSAodl9kZWZfaXRlciAmJiB2KTsKKwkJZGlmZiA9IHYgfHwgdl9kZWZfaXRlcjsKKwkJZG1fcG9vbF9mcmVlKGhhbmRsZS0+Y2Z0LT5tZW0sIHZfZGVmX2FycmF5KTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHYtPnR5cGUpIHsKKwkJCWNhc2UgRE1fQ0ZHX0lOVDoKKwkJCQkvKiBpbnQgdmFsdWUgY2FuIGJlIGEgcmVhbCBpbnQgYnV0IGl0IGNhbiBhbHNvIHJlcHJlc2VudCBib29sICovCisJCQkJaSA9IHZfZGVmID8gdl9kZWYtPnYuaQorCQkJCQkgIDogZGVmLT50eXBlICYgQ0ZHX1RZUEVfQk9PTCA/CisJCQkJCQljZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlKGhhbmRsZS0+Y21kLCBkZWYsIENGR19UWVBFX0JPT0wsIE5VTEwpIDoKKwkJCQkJCWNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoaGFuZGxlLT5jbWQsIGRlZiwgQ0ZHX1RZUEVfSU5ULCBOVUxMKTsKKwkJCQlkaWZmID0gaSAhPSB2LT52Lmk7CisJCQkJYnJlYWs7CisJCQljYXNlIERNX0NGR19GTE9BVDoKKwkJCQlmID0gdl9kZWYgPyB2X2RlZi0+di5mCisJCQkJCSAgOiBjZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlKGhhbmRsZS0+Y21kLCBkZWYsIENGR19UWVBFX0ZMT0FULCBOVUxMKTsKKwkJCQlkaWZmID0gZmFicyhmIC0gdi0+di5mKSA8IEZMVF9FUFNJTE9OOworCQkJCWJyZWFrOworCQkJY2FzZSBETV9DRkdfU1RSSU5HOgorCQkJCS8qIHN0cmluZyB2YWx1ZSBjYW4gYmUgYSByZWFsIHN0cmluZyBidXQgaXQgY2FuIGFsc28gcmVwcmVzZW50IGJvb2wgKi8KKwkJCQlpZiAodl9kZWYgPyB2X2RlZi0+dHlwZSA9PSBETV9DRkdfSU5UIDogZGVmLT50eXBlID09IENGR19UWVBFX0JPT0wpIHsKKwkJCQkJaSA9IHZfZGVmID8gdl9kZWYtPnYuaQorCQkJCQkJICA6IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoaGFuZGxlLT5jbWQsIGRlZiwgQ0ZHX1RZUEVfQk9PTCwgTlVMTCk7CisJCQkJCWRpZmYgPSBpICE9IHYtPnYuaTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHIgPSB2X2RlZiA/IHZfZGVmLT52LnN0cgorCQkJCQkJICAgIDogY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShoYW5kbGUtPmNtZCwgZGVmLCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwpOworCQkJCQlkaWZmID0gc3RyY21wKHN0ciwgdi0+di5zdHIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fQ0ZHX0VNUFRZX0FSUkFZOgorCQkJCWRpZmYgPSAodl9kZWYgJiYgKHZfZGVmLT50eXBlICE9IERNX0NGR19FTVBUWV9BUlJBWSkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImluY29uc2lzdGVudCBzdGF0ZSByZWFjaGVkIGluIF9jaGVja192YWx1ZV9kaWZmZXJzX2Zyb21fZGVmYXVsdCIpOworCQkJCXJldHVybiAwOworCQl9CisJfQorb3V0OgorCWlmIChkaWZmKSB7CisJCS8qIG1hcmsgd2hvbGUgcGF0aCBmcm9tIGJvdHRvbSB0byB0b3Agd2l0aCBDRkdfRElGRiAqLworCQlmb3IgKGlkID0gZGVmLT5pZDsgaWQgJiYgIShoYW5kbGUtPnN0YXR1c1tpZF0gJiBDRkdfRElGRik7IGlkID0gX2NmZ19kZWZfaXRlbXNbaWRdLnBhcmVudCkKKwkJCWhhbmRsZS0+c3RhdHVzW2lkXSB8PSBDRkdfRElGRjsKKwl9CisKKwlyZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGludCBfY29uZmlnX2RlZl9jaGVja19ub2RlX3ZhbHVlKHN0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpoYW5kbGUsCisJCQkJCWNvbnN0IGNoYXIgKnJwLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2LAorCQkJCQljb25zdCBjZmdfZGVmX2l0ZW1fdCAqZGVmKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnZfaXRlcjsKKworCWlmICghdikgeworCQlpZiAoZGVmLT50eXBlICE9IENGR19UWVBFX1NFQ1RJT04pIHsKKwkJCV9sb2dfdHlwZV9lcnJvcihycCwgQ0ZHX1RZUEVfU0VDVElPTiwgZGVmLT50eXBlLCBoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmICh2LT5uZXh0KSB7CisJCWlmICghKGRlZi0+dHlwZSAmIENGR19UWVBFX0FSUkFZKSkgeworCQkJX2xvZ190eXBlX2Vycm9yKHJwLCBDRkdfVFlQRV9BUlJBWSwgZGVmLT50eXBlLCBoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdl9pdGVyID0gdjsKKwlkbyB7CisJCWlmICghX2NvbmZpZ19kZWZfY2hlY2tfbm9kZV9zaW5nbGVfdmFsdWUoaGFuZGxlLCBycCwgdl9pdGVyLCBkZWYpKQorCQkJcmV0dXJuIDA7CisJCXZfaXRlciA9IHZfaXRlci0+bmV4dDsKKwl9IHdoaWxlICh2X2l0ZXIpOworCisJaWYgKGhhbmRsZS0+Y2hlY2tfZGlmZikKKwkJX2NoZWNrX3ZhbHVlX2RpZmZlcnNfZnJvbV9kZWZhdWx0KGhhbmRsZSwgdiwgZGVmLCBOVUxMKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jb25maWdfZGVmX2NoZWNrX25vZGVfaXNfcHJvZmlsYWJsZShzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqaGFuZGxlLAorCQkJCQkJY29uc3QgY2hhciAqcnAsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisJCQkJCQljb25zdCBjZmdfZGVmX2l0ZW1fdCAqZGVmKQoreworCXVpbnQxNl90IGZsYWdzOworCisJaWYgKCEoZGVmLT5mbGFncyAmIENGR19QUk9GSUxBQkxFKSkgeworCQlsb2dfd2Fybl9zdXBwcmVzcyhoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzLAorCQkJCSAgIkNvbmZpZ3VyYXRpb24gJXMgXCIlc1wiIGlzIG5vdCBjdXN0b21pemFibGUgYnkgIgorCQkJCSAgImEgcHJvZmlsZS4iLCBjbi0+diA/ICJvcHRpb24iIDogInNlY3Rpb24iLCBycCk7CisJCXJldHVybiAwOworCX0KKworCWZsYWdzID0gZGVmLT5mbGFncyAmIH5DRkdfUFJPRklMQUJMRTsKKworCS8qCisJKiBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWV0YWRhdGEgcHJvZmlsYWJsZSBjb25maWcgaW4gdGhlIGNvbW1hbmQgcHJvZmlsZSEKKwkqLworCWlmICgoaGFuZGxlLT5zb3VyY2UgPT0gQ09ORklHX1BST0ZJTEVfQ09NTUFORCkgJiYgKGZsYWdzICYgQ0ZHX1BST0ZJTEFCTEVfTUVUQURBVEEpKSB7CisJCWxvZ193YXJuX3N1cHByZXNzKGhhbmRsZS0+c3VwcHJlc3NfbWVzc2FnZXMsCisJCQkJICAiQ29uZmlndXJhdGlvbiAlcyBcIiVzXCIgaXMgY3VzdG9taXphYmxlIGJ5ICIKKwkJCQkgICJtZXRhZGF0YSBwcm9maWxlIG9ubHksIG5vdCBjb21tYW5kIHByb2ZpbGUuIiwKKwkJCQkgICBjbi0+diA/ICJvcHRpb24iIDogInNlY3Rpb24iLCBycCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbW1hbmQgcHJvZmlsYWJsZSBjb25maWcgaW4gdGhlIG1ldGFkYXRhIHByb2ZpbGUhCisJICogKHNlY3Rpb25zIGRvIG5vdCBuZWVkIHRvIGJlIGZsYWdnZWQgd2l0aCBDRkdfUFJPRklMQUJMRV9NRVRBREFUQSwgdGhlCisJICogIENGR19QUk9GSUxBQkxFIGlzIGVub3VnaCBhcyBzZWN0aW9ucyBtYXkgY29udGFpbiBib3RoIHR5cGVzIGluc2lkZSkKKwkgKi8KKwlpZiAoKGhhbmRsZS0+c291cmNlID09IENPTkZJR19QUk9GSUxFX01FVEFEQVRBKSAmJiBjbi0+diAmJiAhKGZsYWdzICYgQ0ZHX1BST0ZJTEFCTEVfTUVUQURBVEEpKSB7CisJCWxvZ193YXJuX3N1cHByZXNzKGhhbmRsZS0+c3VwcHJlc3NfbWVzc2FnZXMsCisJCQkJICAiQ29uZmlndXJhdGlvbiAlcyBcIiVzXCIgaXMgY3VzdG9taXphYmxlIGJ5ICIKKwkJCQkgICJjb21tYW5kIHByb2ZpbGUgb25seSwgbm90IG1ldGFkYXRhIHByb2ZpbGUuIiwKKwkJCQkgICBjbi0+diA/ICJvcHRpb24iIDogInNlY3Rpb24iLCBycCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jb25maWdfZGVmX2NoZWNrX25vZGUoc3RydWN0IGNmdF9jaGVja19oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGNvbnN0IGNoYXIgKnZwLCBjaGFyICpwdnAsIGNoYXIgKnJwLCBjaGFyICpwcnAsCisJCQkJICBzaXplX3QgYnVmX3NpemUsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24pCit7CisJY2ZnX2RlZl9pdGVtX3QgKmRlZjsKKwlpbnQgc2VwID0gdnAgIT0gcHZwOyAvKiBkb24ndCB1c2UgJy8nIHNlcGFyYXRvciBmb3IgdG9wLWxldmVsIG5vZGUgKi8KKworCWlmIChkbV9zbnByaW50ZihwdnAsIGJ1Zl9zaXplLCAiJXMlcyIsIHNlcCA/ICIvIiA6ICIiLCBjbi0+a2V5KSA8IDAgfHwKKwkgICAgZG1fc25wcmludGYocHJwLCBidWZfc2l6ZSwgIiVzJXMiLCBzZXAgPyAiLyIgOiAiIiwgY24tPmtleSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCBwYXRoIGZvciBjb25maWd1cmF0aW9uIG5vZGUgJXMuIiwgY24tPmtleSk7CisJCXJldHVybiAwOworCX0KKworCisJaWYgKCEoZGVmID0gKGNmZ19kZWZfaXRlbV90ICopIGRtX2hhc2hfbG9va3VwKGhhbmRsZS0+Y21kLT5jZnRfZGVmX2hhc2gsIHZwKSkpIHsKKwkJLyogSWYgdGhlIG5vZGUgaXMgbm90IGEgc2VjdGlvbiBidXQgYSBzZXR0aW5nLCBmYWlsIG5vdy4gKi8KKwkJaWYgKGNuLT52KSB7CisJCQlsb2dfd2Fybl9zdXBwcmVzcyhoYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzLAorCQkJCSJDb25maWd1cmF0aW9uIHNldHRpbmcgXCIlc1wiIHVua25vd24uIiwgcnApOworCQkJY24tPmlkID0gLTE7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIElmIHRoZSBub2RlIGlzIGEgc2VjdGlvbiwgdHJ5IGlmIHRoZSBzZWN0aW9uIG5hbWUgaXMgdmFyaWFibGUuICovCisJCS8qIE1vZGlmeSB2aXJ0dWFsIHBhdGggdnAgaW4gc2l0dSBhbmQgcmVwbGFjZSB0aGUga2V5IG5hbWUgd2l0aCBhICcjJy4gKi8KKwkJLyogVGhlIHJlYWwgcGF0aCB3aXRob3V0ICcjJyBpcyBzdGlsbCBzdG9yZWQgaW4gcnAgdmFyaWFibGUuICovCisJCXB2cFtzZXBdID0gJyMnLCBwdnBbc2VwICsgMV0gPSAnXDAnOworCQlpZiAoIShkZWYgPSAoY2ZnX2RlZl9pdGVtX3QgKikgZG1faGFzaF9sb29rdXAoaGFuZGxlLT5jbWQtPmNmdF9kZWZfaGFzaCwgdnApKSkgeworCQkJbG9nX3dhcm5fc3VwcHJlc3MoaGFuZGxlLT5zdXBwcmVzc19tZXNzYWdlcywKKwkJCQkiQ29uZmlndXJhdGlvbiBzZWN0aW9uIFwiJXNcIiB1bmtub3duLiIsIHJwKTsKKwkJCWNuLT5pZCA9IC0xOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwloYW5kbGUtPnN0YXR1c1tkZWYtPmlkXSB8PSBDRkdfVVNFRDsKKwljbi0+aWQgPSBkZWYtPmlkOworCisJaWYgKCFfY29uZmlnX2RlZl9jaGVja19ub2RlX3ZhbHVlKGhhbmRsZSwgcnAsIGNuLT52LCBkZWYpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQWxzbyBjaGVjayB3aGV0aGVyIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtIGlzIGFsbG93ZWQKKwkgKiBpbiBjZXJ0YWluIHR5cGVzIG9mIGNvbmZpZ3VyYXRpb24gdHJlZXMgYXMgaW4gc29tZQorCSAqIHRoZSB1c2Ugb2YgY29uZmlndXJhdGlvbiBpcyByZXN0cmljdGVkLCBlLmcuIHByb2ZpbGVzLi4uCisJICovCisJaWYgKF9pc19wcm9maWxlX2Jhc2VkX2NvbmZpZ19zb3VyY2UoaGFuZGxlLT5zb3VyY2UpICYmCisJICAgICFfY29uZmlnX2RlZl9jaGVja19ub2RlX2lzX3Byb2ZpbGFibGUoaGFuZGxlLCBycCwgY24sIGRlZikpCisJCXJldHVybl8wOworCisJaGFuZGxlLT5zdGF0dXNbZGVmLT5pZF0gfD0gQ0ZHX1ZBTElEOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jb25maWdfZGVmX2NoZWNrX3RyZWUoc3RydWN0IGNmdF9jaGVja19oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGNvbnN0IGNoYXIgKnZwLCBjaGFyICpwdnAsIGNoYXIgKnJwLCBjaGFyICpwcnAsCisJCQkJICBzaXplX3QgYnVmX3NpemUsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcm9vdCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNmZ19kZWZfaXRlbV90ICpkZWY7CisJaW50IHZhbGlkLCByID0gMTsKKwlzaXplX3QgbGVuOworCisJZGVmID0gY2ZnX2RlZl9nZXRfaXRlbV9wKHJvb3QtPmlkKTsKKwlpZiAoZGVmLT5mbGFncyAmIENGR19TRUNUSU9OX05PX0NIRUNLKQorCQlyZXR1cm4gMTsKKworCWZvciAoY24gPSByb290LT5jaGlsZDsgY247IGNuID0gY24tPnNpYikgeworCQlpZiAoKHZhbGlkID0gX2NvbmZpZ19kZWZfY2hlY2tfbm9kZShoYW5kbGUsIHZwLCBwdnAsIHJwLCBwcnAsCisJCQkJCQkgICAgYnVmX3NpemUsIGNuKSkgJiYgIWNuLT52KSB7CisJCQlsZW4gPSBzdHJsZW4ocnApOworCQkJdmFsaWQgPSBfY29uZmlnX2RlZl9jaGVja190cmVlKGhhbmRsZSwgdnAsIHB2cCArIHN0cmxlbihwdnApLAorCQkJCQkJICAgICAgIHJwLCBwcnAgKyBsZW4sIGJ1Zl9zaXplIC0gbGVuLCBjbik7CisJCX0KKwkJaWYgKCF2YWxpZCkKKwkJCXIgPSAwOworCX0KKworCXJldHVybiByOworfQorCitpbnQgY29uZmlnX2RlZl9jaGVjayhzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqaGFuZGxlKQoreworCWNmZ19kZWZfaXRlbV90ICpkZWY7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljaGFyIHZwW0NGR19QQVRIX01BWF9MRU5dLCBycFtDRkdfUEFUSF9NQVhfTEVOXTsKKwlzaXplX3QgcnBsZW47CisJaW50IGlkLCByID0gMTsKKworCS8qCisJICogdnAgPSB2aXJ0dWFsIHBhdGgsIGl0IG1pZ2h0IGNvbnRhaW4gc3Vic3RpdHV0ZXMgZm9yIHZhcmlhYmxlIHBhcnRzCisJICogCW9mIHRoZSBwYXRoLCB1c2VkIHdoaWxlIHdvcmtpbmcgd2l0aCB0aGUgaGFzaAorCSAqIHJwID0gcmVhbCBwYXRoLCB0aGUgcmVhbCBwYXRoIG9mIHRoZSBjb25maWcgZWxlbWVudCBhcyBmb3VuZCBpbiB0aGUKKwkgKiAgICAgIGNvbmZpZ3VyYXRpb24sIHVzZWQgZm9yIG1lc3NhZ2Ugb3V0cHV0CisJICovCisKKwkvKgorCSAqIElmIHRoZSBjaGVjayBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgYW5kICdza2lwX2lmX2NoZWNrZWQnIGlzIHNldCwKKwkgKiBza2lwIHRoZSBhY3R1YWwgY2hlY2sgYW5kIHVzZSBsYXN0IHJlc3VsdCBpZiBhdmFpbGFibGUuCisJICogSWYgbm90IGF2YWlsYWJsZSwgd2UgbXVzdCBkbyB0aGUgY2hlY2suIFRoZSBnbG9iYWwgc3RhdHVzCisJICogaXMgc3RvcmVkIGluIHJvb3Qgbm9kZS4KKwkgKi8KKwlpZiAoaGFuZGxlLT5za2lwX2lmX2NoZWNrZWQgJiYgKGhhbmRsZS0+c3RhdHVzW3Jvb3RfQ0ZHX1NFQ1RJT05dICYgQ0ZHX1VTRUQpKQorCQlyZXR1cm4gaGFuZGxlLT5zdGF0dXNbcm9vdF9DRkdfU0VDVElPTl0gJiBDRkdfVkFMSUQ7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIGNoZWNrcyBhcmUgZGlzYWJsZWQgYW5kIGFsc28gbm90IGZvcmNlZC4gKi8KKwlpZiAoIWhhbmRsZS0+Zm9yY2VfY2hlY2sgJiYgIWZpbmRfY29uZmlnX3RyZWVfYm9vbChoYW5kbGUtPmNtZCwgY29uZmlnX2NoZWNrc19DRkcsIE5VTEwpKQorCQlyZXR1cm4gMTsKKworCS8qIENsZWFyICd1c2VkJyBhbmQgJ3ZhbGlkJyBzdGF0dXMgZmxhZ3MuICovCisJZm9yIChpZCA9IDA7IGlkIDwgQ0ZHX0NPVU5UOyBpZCsrKQorCQloYW5kbGUtPnN0YXR1c1tpZF0gJj0gfihDRkdfVVNFRCB8IENGR19WQUxJRCB8IENGR19ESUZGKTsKKworCS8qCisJICogQ3JlYXRlIGEgaGFzaCBvZiBhbGwgcG9zc2libGUgY29uZmlndXJhdGlvbgorCSAqIHNlY3Rpb25zIGFuZCBzZXR0aW5ncyB3aXRoIGZ1bGwgcGF0aCBhcyBhIGtleS4KKwkgKiBJZiBzZWN0aW9uIG5hbWUgaXMgdmFyaWFibGUsIHVzZSAnIycgYXMgYSBzdWJzdGl0dXRlLgorCSAqLworCWlmICghaGFuZGxlLT5jbWQtPmNmdF9kZWZfaGFzaCkgeworCQlpZiAoIShoYW5kbGUtPmNtZC0+Y2Z0X2RlZl9oYXNoID0gZG1faGFzaF9jcmVhdGUoNjQpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbiBoYXNoLiIpOworCQkJciA9IDA7IGdvdG8gb3V0OworCQl9CisJCWZvciAoaWQgPSAxOyBpZCA8IENGR19DT1VOVDsgaWQrKykgeworCQkJZGVmID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwkJCWlmICghX2NmZ19kZWZfbWFrZV9wYXRoKHZwLCBDRkdfUEFUSF9NQVhfTEVOLCBkZWYtPmlkLCBkZWYsIDApKSB7CisJCQkJZG1faGFzaF9kZXN0cm95KGhhbmRsZS0+Y21kLT5jZnRfZGVmX2hhc2gpOworCQkJCWhhbmRsZS0+Y21kLT5jZnRfZGVmX2hhc2ggPSBOVUxMOworCQkJCXIgPSAwOyBnb3RvIG91dDsKKwkJCX0KKwkJCWlmICghZG1faGFzaF9pbnNlcnQoaGFuZGxlLT5jbWQtPmNmdF9kZWZfaGFzaCwgdnAsIGRlZikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbnNlcnQgY29uZmlndXJhdGlvbiB0byBoYXNoLiIpOworCQkJCXIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBNYXJrIHRoaXMgaGFuZGxlIGFzIHVzZWQgc28gbmV4dCB0aW1lIHdlIGtub3cgdGhhdCB0aGUgY2hlY2sKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgYW5kIHNvIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBwcmV2aW91cworCSAqIHN0YXR1cyBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhpcyB3aG9sZSBjaGVjayBhZ2Fpbi4KKwkgKi8KKwloYW5kbGUtPnN0YXR1c1tyb290X0NGR19TRUNUSU9OXSB8PSBDRkdfVVNFRDsKKworCS8qCisJICogQWxsb3cgb25seSBzZWN0aW9ucyBhcyB0b3AtbGV2ZWwgZWxlbWVudHMuCisJICogSXRlcmF0ZSB0b3AtbGV2ZWwgc2VjdGlvbnMgYW5kIGRpdmUgZGVlcGVyLgorCSAqIElmIGFueSBvZiBzdWJzZXF1ZW50IGNoZWNrcyBmYWlscywgdGhlIHdob2xlIGNoZWNrIGZhaWxzLgorCSAqLworCWZvciAoY24gPSBoYW5kbGUtPmNmdC0+cm9vdDsgY247IGNuID0gY24tPnNpYikgeworCQlpZiAoIWNuLT52KSB7CisJCQkvKiB0b3AgbGV2ZWwgbm9kZTogdnA9dnAsIHJwPXJwICovCisJCQlpZiAoIV9jb25maWdfZGVmX2NoZWNrX25vZGUoaGFuZGxlLCB2cCwgdnAsIHJwLCBycCwKKwkJCQkJCSAgICBDRkdfUEFUSF9NQVhfTEVOLCBjbikpIHsKKwkJCQlyID0gMDsgY29udGludWU7CisJCQl9CisJCQlycGxlbiA9IHN0cmxlbihycCk7CisJCQlpZiAoIV9jb25maWdfZGVmX2NoZWNrX3RyZWUoaGFuZGxlLAorCQkJCQkJICAgIHZwLCB2cCArIHN0cmxlbih2cCksCisJCQkJCQkgICAgcnAsIHJwICsgcnBsZW4sCisJCQkJCQkgICAgQ0ZHX1BBVEhfTUFYX0xFTiAtIHJwbGVuLCBjbikpCisJCQkJciA9IDA7CisJCX0gZWxzZSB7CisJCQlsb2dfZXJyb3Jfc3VwcHJlc3MoaGFuZGxlLT5zdXBwcmVzc19tZXNzYWdlcywKKwkJCQkiQ29uZmlndXJhdGlvbiBzZXR0aW5nIFwiJXNcIiBpbnZhbGlkLiAiCisJCQkJIkl0J3Mgbm90IHBhcnQgb2YgYW55IHNlY3Rpb24uIiwgY24tPmtleSk7CisJCQlyID0gMDsKKwkJfQorCX0KK291dDoKKwlpZiAocikKKwkJaGFuZGxlLT5zdGF0dXNbcm9vdF9DRkdfU0VDVElPTl0gfD0gQ0ZHX1ZBTElEOworCWVsc2UKKwkJaGFuZGxlLT5zdGF0dXNbcm9vdF9DRkdfU0VDVElPTl0gJj0gfkNGR19WQUxJRDsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9hcHBseV9sb2NhbF9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlpZiAoIXByb2ZpbGUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBHbG9iYWwgbWV0YWRhdGEgcHJvZmlsZSBvdmVycmlkZXMgdGhlIGxvY2FsIG9uZS4KKwkgKiBUaGlzIHNpbXBseSBtZWFucyB0aGUgIi0tbWV0YWRhdGFwcm9maWxlIiBhcmcKKwkgKiBvdmVycmlkZXMgYW55IHByb2ZpbGUgYXR0YWNoZWQgdG8gVkcvTFYuCisJICovCisJaWYgKChwcm9maWxlLT5zb3VyY2UgPT0gQ09ORklHX1BST0ZJTEVfTUVUQURBVEEpICYmCisJICAgICBjbWQtPnByb2ZpbGVfcGFyYW1zLT5nbG9iYWxfbWV0YWRhdGFfcHJvZmlsZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9wcm9maWxlKGNtZCwgcHJvZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgX2NvbmZpZ19kaXNhYmxlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY2ZnX2RlZl9pdGVtX3QgKml0ZW0sIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKChpdGVtLT5mbGFncyAmIENGR19ESVNBQkxFRCkgJiYgZG1fY29uZmlnX3RyZWVfZmluZF9ub2RlKGNtZC0+Y2Z0LCBwYXRoKSkgeworCQlsb2dfd2FybigiV0FSTklORzogQ29uZmlndXJhdGlvbiBzZXR0aW5nICVzIGlzIGRpc2FibGVkLiBVc2luZyBkZWZhdWx0IHZhbHVlLiIsIHBhdGgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpmaW5kX2NvbmZpZ19ub2RlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgaW50IGlkKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCV9jZmdfZGVmX21ha2VfcGF0aChwYXRoLCBzaXplb2YocGF0aCksIGl0ZW0tPmlkLCBpdGVtLCAwKTsKKworCWNuID0gZG1fY29uZmlnX3RyZWVfZmluZF9ub2RlKGNmdCwgcGF0aCk7CisKKwlyZXR1cm4gY247Cit9CisKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZmluZF9jb25maWdfdHJlZV9ub2RlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IHByb2ZpbGVfYXBwbGllZDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwljbiA9IGRtX2NvbmZpZ190cmVlX2ZpbmRfbm9kZShjbWQtPmNmdCwgcGF0aCk7CisKKwlpZiAocHJvZmlsZV9hcHBsaWVkICYmIHByb2ZpbGUpCisJCXJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBwcm9maWxlLT5zb3VyY2UpOworCisJcmV0dXJuIGNuOworfQorCitjb25zdCBjaGFyICpmaW5kX2NvbmZpZ190cmVlX3N0cihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljZmdfZGVmX2l0ZW1fdCAqaXRlbSA9IGNmZ19kZWZfZ2V0X2l0ZW1fcChpZCk7CisJY2hhciBwYXRoW0NGR19QQVRIX01BWF9MRU5dOworCWludCBwcm9maWxlX2FwcGxpZWQ7CisJY29uc3QgY2hhciAqc3RyOworCisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoaXRlbS0+dHlwZSAhPSBDRkdfVFlQRV9TVFJJTkcpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgY2ZnIHRyZWUgZWxlbWVudCBub3QgZGVjbGFyZWQgYXMgc3RyaW5nLiIsIHBhdGgpOworCisJc3RyID0gX2NvbmZpZ19kaXNhYmxlZChjbWQsIGl0ZW0sIHBhdGgpID8gY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX1NUUklORywgcHJvZmlsZSkKKwkJCQkJCTogZG1fY29uZmlnX3RyZWVfZmluZF9zdHIoY21kLT5jZnQsIHBhdGgsIGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9TVFJJTkcsIHByb2ZpbGUpKTsKKworCWlmIChwcm9maWxlX2FwcGxpZWQgJiYgcHJvZmlsZSkKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIHByb2ZpbGUtPnNvdXJjZSk7CisKKwlyZXR1cm4gc3RyOworfQorCitjb25zdCBjaGFyICpmaW5kX2NvbmZpZ190cmVlX3N0cl9hbGxvd19lbXB0eShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljZmdfZGVmX2l0ZW1fdCAqaXRlbSA9IGNmZ19kZWZfZ2V0X2l0ZW1fcChpZCk7CisJY2hhciBwYXRoW0NGR19QQVRIX01BWF9MRU5dOworCWludCBwcm9maWxlX2FwcGxpZWQ7CisJY29uc3QgY2hhciAqc3RyOworCisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoaXRlbS0+dHlwZSAhPSBDRkdfVFlQRV9TVFJJTkcpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgY2ZnIHRyZWUgZWxlbWVudCBub3QgZGVjbGFyZWQgYXMgc3RyaW5nLiIsIHBhdGgpOworCWlmICghKGl0ZW0tPmZsYWdzICYgQ0ZHX0FMTE9XX0VNUFRZKSkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBjZmcgdHJlZSBlbGVtZW50IG5vdCBkZWNsYXJlZCB0byBhbGxvdyBlbXB0eSB2YWx1ZXMuIiwgcGF0aCk7CisKKwlzdHIgPSBfY29uZmlnX2Rpc2FibGVkKGNtZCwgaXRlbSwgcGF0aCkgPyBjZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlKGNtZCwgaXRlbSwgQ0ZHX1RZUEVfU1RSSU5HLCBwcm9maWxlKQorCQkJCQkJOiBkbV9jb25maWdfdHJlZV9maW5kX3N0cl9hbGxvd19lbXB0eShjbWQtPmNmdCwgcGF0aCwgY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX1NUUklORywgcHJvZmlsZSkpOworCisJaWYgKHByb2ZpbGVfYXBwbGllZCAmJiBwcm9maWxlKQorCQlyZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKGNtZCwgcHJvZmlsZS0+c291cmNlKTsKKworCXJldHVybiBzdHI7Cit9CisKK2ludCBmaW5kX2NvbmZpZ190cmVlX2ludChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljZmdfZGVmX2l0ZW1fdCAqaXRlbSA9IGNmZ19kZWZfZ2V0X2l0ZW1fcChpZCk7CisJY2hhciBwYXRoW0NGR19QQVRIX01BWF9MRU5dOworCWludCBwcm9maWxlX2FwcGxpZWQ7CisJaW50IGk7CisKKwlwcm9maWxlX2FwcGxpZWQgPSBfYXBwbHlfbG9jYWxfcHJvZmlsZShjbWQsIHByb2ZpbGUpOworCV9jZmdfZGVmX21ha2VfcGF0aChwYXRoLCBzaXplb2YocGF0aCksIGl0ZW0tPmlkLCBpdGVtLCAwKTsKKworCWlmIChpdGVtLT50eXBlICE9IENGR19UWVBFX0lOVCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBjZmcgdHJlZSBlbGVtZW50IG5vdCBkZWNsYXJlZCBhcyBpbnRlZ2VyLiIsIHBhdGgpOworCisJaSA9IF9jb25maWdfZGlzYWJsZWQoY21kLCBpdGVtLCBwYXRoKSA/IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9JTlQsIHByb2ZpbGUpCisJCQkJCSAgICAgIDogZG1fY29uZmlnX3RyZWVfZmluZF9pbnQoY21kLT5jZnQsIHBhdGgsIGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9JTlQsIHByb2ZpbGUpKTsKKworCWlmIChwcm9maWxlX2FwcGxpZWQgJiYgcHJvZmlsZSkKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIHByb2ZpbGUtPnNvdXJjZSk7CisKKwlyZXR1cm4gaTsKK30KKworaW50NjRfdCBmaW5kX2NvbmZpZ190cmVlX2ludDY0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IHByb2ZpbGVfYXBwbGllZDsKKwlpbnQgaTY0OworCisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoaXRlbS0+dHlwZSAhPSBDRkdfVFlQRV9JTlQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgY2ZnIHRyZWUgZWxlbWVudCBub3QgZGVjbGFyZWQgYXMgaW50ZWdlci4iLCBwYXRoKTsKKworCWk2NCA9IF9jb25maWdfZGlzYWJsZWQoY21kLCBpdGVtLCBwYXRoKSA/IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9JTlQsIHByb2ZpbGUpCisJCQkJCQk6IGRtX2NvbmZpZ190cmVlX2ZpbmRfaW50NjQoY21kLT5jZnQsIHBhdGgsIGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9JTlQsIHByb2ZpbGUpKTsKKworCWlmIChwcm9maWxlX2FwcGxpZWQgJiYgcHJvZmlsZSkKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIHByb2ZpbGUtPnNvdXJjZSk7CisKKwlyZXR1cm4gaTY0OworfQorCitmbG9hdCBmaW5kX2NvbmZpZ190cmVlX2Zsb2F0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IHByb2ZpbGVfYXBwbGllZDsKKwlmbG9hdCBmOworCisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoaXRlbS0+dHlwZSAhPSBDRkdfVFlQRV9GTE9BVCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBjZmcgdHJlZSBlbGVtZW50IG5vdCBkZWNsYXJlZCBhcyBmbG9hdC4iLCBwYXRoKTsKKworCWYgPSBfY29uZmlnX2Rpc2FibGVkKGNtZCwgaXRlbSwgcGF0aCkgPyBjZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlKGNtZCwgaXRlbSwgQ0ZHX1RZUEVfRkxPQVQsIHByb2ZpbGUpCisJCQkJCSAgICAgIDogZG1fY29uZmlnX3RyZWVfZmluZF9mbG9hdChjbWQtPmNmdCwgcGF0aCwgY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX0ZMT0FULCBwcm9maWxlKSk7CisKKwlpZiAocHJvZmlsZV9hcHBsaWVkICYmIHByb2ZpbGUpCisJCXJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBwcm9maWxlLT5zb3VyY2UpOworCisJcmV0dXJuIGY7Cit9CisKK2ludCBmaW5kX2NvbmZpZ19ib29sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgaW50IGlkKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IGI7CisKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoaXRlbS0+dHlwZSAhPSBDRkdfVFlQRV9CT09MKQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIGNmZyB0cmVlIGVsZW1lbnQgbm90IGRlY2xhcmVkIGFzIGJvb2xlYW4uIiwgcGF0aCk7CisKKwliID0gX2NvbmZpZ19kaXNhYmxlZChjbWQsIGl0ZW0sIHBhdGgpID8gY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX0JPT0wsIE5VTEwpCisJCQkJCSAgICAgIDogZG1fY29uZmlnX3RyZWVfZmluZF9ib29sKGNmdCwgcGF0aCwgY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX0JPT0wsIE5VTEwpKTsKKworCXJldHVybiBiOworfQorCitpbnQgZmluZF9jb25maWdfdHJlZV9ib29sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IHByb2ZpbGVfYXBwbGllZDsKKwlpbnQgYjsKKworCXByb2ZpbGVfYXBwbGllZCA9IF9hcHBseV9sb2NhbF9wcm9maWxlKGNtZCwgcHJvZmlsZSk7CisJX2NmZ19kZWZfbWFrZV9wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgaXRlbS0+aWQsIGl0ZW0sIDApOworCisJaWYgKGl0ZW0tPnR5cGUgIT0gQ0ZHX1RZUEVfQk9PTCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBjZmcgdHJlZSBlbGVtZW50IG5vdCBkZWNsYXJlZCBhcyBib29sZWFuLiIsIHBhdGgpOworCisJYiA9IF9jb25maWdfZGlzYWJsZWQoY21kLCBpdGVtLCBwYXRoKSA/IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWUoY21kLCBpdGVtLCBDRkdfVFlQRV9CT09MLCBwcm9maWxlKQorCQkJCQkgICAgICA6IGRtX2NvbmZpZ190cmVlX2ZpbmRfYm9vbChjbWQtPmNmdCwgcGF0aCwgY2ZnX2RlZl9nZXRfZGVmYXVsdF92YWx1ZShjbWQsIGl0ZW0sIENGR19UWVBFX0JPT0wsIHByb2ZpbGUpKTsKKworCWlmIChwcm9maWxlX2FwcGxpZWQgJiYgcHJvZmlsZSkKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIHByb2ZpbGUtPnNvdXJjZSk7CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqX2dldF9hcnJheV9kZWZfbm9kZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJCSAgY2ZnX2RlZl9pdGVtX3QgKmRlZiwKKwkJCQkJCSAgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCWlmIChkZWYtPmZsYWdzICYgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVEKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGNuID0gZG1fY29uZmlnX2NyZWF0ZV9ub2RlKGNtZC0+Y2Z0LCBkZWYtPm5hbWUpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgZGVmYXVsdCBhcnJheSBub2RlIGZvciAlcy4iLCBkZWYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShjbi0+diA9IF9nZXRfZGVmX2FycmF5X3ZhbHVlcyhjbWQsIGNtZC0+Y2Z0LCBkZWYsIDApKSkgeworCQlkbV9wb29sX2ZyZWUoY21kLT5jZnQtPm1lbSwgY24pOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlyZXR1cm4gY247Cit9CisKK3N0cnVjdCBfY29uZmlnX2FycmF5X291dF9oYW5kbGUgeworCXN0cnVjdCBkbV9wb29sICptZW07CisJY2hhciAqc3RyOworfTsKKworc3RhdGljIGludCBfY29uZmlnX2FycmF5X2xpbmUoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IF9jb25maWdfYXJyYXlfb3V0X2hhbmRsZSAqaGFuZGxlID0gKHN0cnVjdCBfY29uZmlnX2FycmF5X291dF9oYW5kbGUgKikgYmF0b247CisKKwlpZiAoIShoYW5kbGUtPnN0ciA9IGRtX3Bvb2xfc3RyZHVwKGhhbmRsZS0+bWVtLCBsaW5lKSkpIHsKKwkJbG9nX2Vycm9yKCJfY29uZmlnX2FycmF5X2xpbmU6IGRtX3Bvb2xfc3RyZHVwIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2xvZ19hcnJheV92YWx1ZV91c2VkKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisJCQkJICBjb25zdCBjaGFyICpwYXRoLCBpbnQgZGVmYXVsdF91c2VkKQoreworCXN0cnVjdCBfY29uZmlnX2FycmF5X291dF9oYW5kbGUgb3V0X2hhbmRsZSA9IHsgMCB9OworCXN0cnVjdCBkbV9jb25maWdfbm9kZV9vdXRfc3BlYyBvdXRfc3BlYyA9IHsgMCB9OworCXVpbnQzMl90IG9sZF9mb3JtYXRfZmxhZ3M7CisKKwlvdXRfaGFuZGxlLm1lbSA9IG1lbTsKKwlvdXRfc3BlYy5saW5lX2ZuID0gX2NvbmZpZ19hcnJheV9saW5lOworCisJb2xkX2Zvcm1hdF9mbGFncyA9IGRtX2NvbmZpZ192YWx1ZV9nZXRfZm9ybWF0X2ZsYWdzKGNuLT52KTsKKwlkbV9jb25maWdfdmFsdWVfc2V0X2Zvcm1hdF9mbGFncyhjbi0+diwKKwkJRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fRVhUUkFfU1BBQ0VTIHwKKwkJRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fQVJSQVkpOworCisJaWYgKCFkbV9jb25maWdfd3JpdGVfb25lX25vZGVfb3V0KGNuLCAmb3V0X3NwZWMsICZvdXRfaGFuZGxlKSkgeworCQlsb2dfZXJyb3IoIl9sb2dfYXJyYXlfdmFsdWVfdXNlZDogZmFpbGVkIHRvIHdyaXRlIG5vZGUgdmFsdWUiKTsKKwkJb3V0X2hhbmRsZS5tZW0gPSBOVUxMOworCX0KKworCWlmIChkZWZhdWx0X3VzZWQpCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIG5vdCBmb3VuZCBpbiBjb25maWc6IGRlZmF1bHRpbmcgdG8gJXMiLAorCQkJCSBwYXRoLCBvdXRfaGFuZGxlLm1lbSA/IG91dF9oYW5kbGUuc3RyIDogIjx1bmtub3duPiIpOworCWVsc2UKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiU2V0dGluZyAlcyB0byAlcyIsCisJCQkJIHBhdGgsIG91dF9oYW5kbGUubWVtID8gb3V0X2hhbmRsZS5zdHIgOiAiPHVua25vd24+Iik7CisKKwlpZiAob3V0X2hhbmRsZS5tZW0pCisJCWRtX3Bvb2xfZnJlZShvdXRfaGFuZGxlLm1lbSwgb3V0X2hhbmRsZS5zdHIpOworCWRtX2NvbmZpZ192YWx1ZV9zZXRfZm9ybWF0X2ZsYWdzKGNuLT52LCBvbGRfZm9ybWF0X2ZsYWdzKTsKK30KKworY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpmaW5kX2NvbmZpZ190cmVlX2FycmF5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCWNmZ19kZWZfaXRlbV90ICppdGVtID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwljaGFyIHBhdGhbQ0ZHX1BBVEhfTUFYX0xFTl07CisJaW50IHByb2ZpbGVfYXBwbGllZDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuID0gTlVMTCwgKmNuX2RlZiA9IE5VTEw7CisJcHJvZmlsZV9hcHBsaWVkID0gX2FwcGx5X2xvY2FsX3Byb2ZpbGUoY21kLCBwcm9maWxlKTsKKwlfY2ZnX2RlZl9tYWtlX3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBpdGVtLT5pZCwgaXRlbSwgMCk7CisKKwlpZiAoIShpdGVtLT50eXBlICYgQ0ZHX1RZUEVfQVJSQVkpKQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIGNmZyB0cmVlIGVsZW1lbnQgbm90IGRlY2xhcmVkIGFzIGFycmF5LiIsIHBhdGgpOworCisJaWYgKF9jb25maWdfZGlzYWJsZWQoY21kLCBpdGVtLCBwYXRoKSB8fAorCSAgICAhKGNuID0gZmluZF9jb25maWdfdHJlZV9ub2RlKGNtZCwgaWQsIHByb2ZpbGUpKSkKKwkJY25fZGVmID0gX2dldF9hcnJheV9kZWZfbm9kZShjbWQsIGl0ZW0sIHByb2ZpbGUpOworCisJaWYgKGNuKQorCQlfbG9nX2FycmF5X3ZhbHVlX3VzZWQoY21kLT5jZnQtPm1lbSwgY24sIHBhdGgsIDApOworCWVsc2UgaWYgKGNuX2RlZikgeworCQlfbG9nX2FycmF5X3ZhbHVlX3VzZWQoY21kLT5jZnQtPm1lbSwgY25fZGVmLCBwYXRoLCAxKTsKKwkJY24gPSBjbl9kZWY7CisJfQorCisJaWYgKHByb2ZpbGVfYXBwbGllZCAmJiBwcm9maWxlKQorCQlyZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKGNtZCwgcHJvZmlsZS0+c291cmNlKTsKKworCXJldHVybiBjbjsKK30KKworLyogSW5zZXJ0IGNuMiBhZnRlciBjbjEgKi8KK3N0YXRpYyB2b2lkIF9pbnNlcnRfY29uZmlnX25vZGUoc3RydWN0IGRtX2NvbmZpZ19ub2RlICoqY24xLAorCQkJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24yKQoreworCWlmICghKmNuMSkgeworCQkqY24xID0gY24yOworCQljbjItPnNpYiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJY24yLT5zaWIgPSAoKmNuMSktPnNpYjsKKwkJKCpjbjEpLT5zaWIgPSBjbjI7CisJfQorfQorCisvKgorICogTWVyZ2Ugc2VjdGlvbiBjbjIgaW50byBzZWN0aW9uIGNuMSAod2hpY2ggaGFzIHRoZSBzYW1lIG5hbWUpCisgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgY24xIG5vZGVzIHdpdGggbWF0Y2hpbmcgbmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9tZXJnZV9zZWN0aW9uKHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24xLCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuMiwKKwkJCSAgIGNvbmZpZ19tZXJnZV90IG1lcmdlX3R5cGUpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgKm5leHRuLCAqb2xkbjsKKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKworCWZvciAoY24gPSBjbjItPmNoaWxkOyBjbjsgY24gPSBuZXh0bikgeworCQluZXh0biA9IGNuLT5zaWI7CisKKwkJaWYgKG1lcmdlX3R5cGUgPT0gQ09ORklHX01FUkdFX1RZUEVfVEFHUykgeworCQkJLyogU2tpcCAidGFncyIgKi8KKwkJCWlmICghc3RyY21wKGNuLT5rZXksICJ0YWdzIikpCisJCQkJY29udGludWU7CisJCX0KKworCQkvKiBTdWJzZWN0aW9uPyAqLworCQlpZiAoIWNuLT52KQorCQkJLyogSWdub3JlIC0gd2UgZG9uJ3QgaGF2ZSBhbnkgb2YgdGhlc2UgeWV0ICovCisJCQljb250aW51ZTsKKwkJLyogTm90IGFscmVhZHkgcHJlc2VudD8gKi8KKwkJaWYgKCEob2xkbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoY24xLT5jaGlsZCwgY24tPmtleSkpKSB7CisJCQlfaW5zZXJ0X2NvbmZpZ19ub2RlKCZjbjEtPmNoaWxkLCBjbik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWVyZ2VfdHlwZSA9PSBDT05GSUdfTUVSR0VfVFlQRV9UQUdTKSB7CisJCQkvKiBNZXJnZSBjZXJ0YWluIHZhbHVlIGxpc3RzICovCisJCQlpZiAoKCFzdHJjbXAoY24xLT5rZXksICJhY3RpdmF0aW9uIikgJiYKKwkJCSAgICAgIXN0cmNtcChjbi0+a2V5LCAidm9sdW1lX2xpc3QiKSkgfHwKKwkJCSAgICAoIXN0cmNtcChjbjEtPmtleSwgImRldmljZXMiKSAmJgorCQkJICAgICAoIXN0cmNtcChjbi0+a2V5LCAiZmlsdGVyIikgfHwgIXN0cmNtcChjbi0+a2V5LCAidHlwZXMiKSkpKSB7CisJCQkJY3YgPSBjbi0+djsKKwkJCQl3aGlsZSAoY3YtPm5leHQpCisJCQkJCWN2ID0gY3YtPm5leHQ7CisJCQkJY3YtPm5leHQgPSBvbGRuLT52OworCQkJfQorCQl9CisKKwkJLyogUmVwbGFjZSB2YWx1ZXMgKi8KKwkJb2xkbi0+diA9IGNuLT52OworCX0KK30KKworc3RhdGljIGludCBfbWF0Y2hfaG9zdF90YWdzKHN0cnVjdCBkbV9saXN0ICp0YWdzLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnRuKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnR2OworCWNvbnN0IGNoYXIgKnN0cjsKKworCWZvciAodHYgPSB0bi0+djsgdHY7IHR2ID0gdHYtPm5leHQpIHsKKwkJaWYgKHR2LT50eXBlICE9IERNX0NGR19TVFJJTkcpCisJCQljb250aW51ZTsKKwkJc3RyID0gdHYtPnYuc3RyOworCQlpZiAoKnN0ciA9PSAnQCcpCisJCQlzdHIrKzsKKwkJaWYgKCEqc3RyKQorCQkJY29udGludWU7CisJCWlmIChzdHJfbGlzdF9tYXRjaF9pdGVtKHRhZ3MsIHN0cikpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVzdHJ1Y3RpdmVseSBtZXJnZSBhIG5ldyBjb25maWcgdHJlZSBpbnRvIGFuIGV4aXN0aW5nIG9uZSAqLworaW50IG1lcmdlX2NvbmZpZ190cmVlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJICAgICAgc3RydWN0IGRtX2NvbmZpZ190cmVlICpuZXdkYXRhLCBjb25maWdfbWVyZ2VfdCBtZXJnZV90eXBlKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcm9vdCA9IGNmdC0+cm9vdDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCAqbmV4dG4sICpvbGRuLCAqY24yOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdG47CisJc3RydWN0IGNvbmZpZ19zb3VyY2UgKmNzLCAqY3NuOworCisJZm9yIChjbiA9IG5ld2RhdGEtPnJvb3Q7IGNuOyBjbiA9IG5leHRuKSB7CisJCW5leHRuID0gY24tPnNpYjsKKwkJaWYgKG1lcmdlX3R5cGUgPT0gQ09ORklHX01FUkdFX1RZUEVfVEFHUykgeworCQkJLyogSWdub3JlIHRhZ3Mgc2VjdGlvbiAqLworCQkJaWYgKCFzdHJjbXAoY24tPmtleSwgInRhZ3MiKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIElmIHRoZXJlJ3MgYSB0YWdzIG5vZGUsIHNraXAgaWYgaG9zdCB0YWdzIGRvbid0IG1hdGNoICovCisJCQlpZiAoKHRuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShjbi0+Y2hpbGQsICJ0YWdzIikpKSB7CisJCQkJaWYgKCFfbWF0Y2hfaG9zdF90YWdzKCZjbWQtPnRhZ3MsIHRuKSkKKwkJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCEob2xkbiA9IGRtX2NvbmZpZ19maW5kX25vZGUocm9vdCwgY24tPmtleSkpKSB7CisJCQlfaW5zZXJ0X2NvbmZpZ19ub2RlKCZjZnQtPnJvb3QsIGNuKTsKKwkJCWlmIChtZXJnZV90eXBlID09IENPTkZJR19NRVJHRV9UWVBFX1RBR1MpIHsKKwkJCQkvKiBSZW1vdmUgYW55ICJ0YWdzIiBub2RlcyAqLworCQkJCWZvciAoY24yID0gY24tPmNoaWxkOyBjbjI7IGNuMiA9IGNuMi0+c2liKSB7CisJCQkJCWlmICghc3RyY21wKGNuMi0+a2V5LCAidGFncyIpKSB7CisJCQkJCQljbi0+Y2hpbGQgPSBjbjItPnNpYjsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmIChjbjItPnNpYiAmJiAhc3RyY21wKGNuMi0+c2liLT5rZXksICJ0YWdzIikpIHsKKwkJCQkJCWNuMi0+c2liID0gY24yLT5zaWItPnNpYjsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJX21lcmdlX3NlY3Rpb24ob2xkbiwgY24sIG1lcmdlX3R5cGUpOworCX0KKworCS8qCisJICogUGVyc2lzdGVudCBmaWx0ZXIgbG9hZGluZyBpcyBiYXNlZCBvbiB0aW1lc3RhbXAsCisJICogc28gd2UgbmVlZCB0byBrbm93IHRoZSBuZXdlc3QgdGltZXN0YW1wIHRvIG1ha2UgcmlnaHQgZGVjaXNpb24KKwkgKiB3aGV0aGVyIHRoZSAuY2FjaGUgaXNuJ3Qgb2xkZXIgdGhlbiBhbnkgb2YgY29uZmlncworCSAqLworCWNzID0gZG1fY29uZmlnX2dldF9jdXN0b20oY2Z0KTsKKwljc24gPSBkbV9jb25maWdfZ2V0X2N1c3RvbShuZXdkYXRhKTsKKworCWlmIChjcyAmJiBjc24gJiYgdGltZXNwZWNjbXAoJmNzLT50aW1lc3RhbXAsICZjc24tPnRpbWVzdGFtcCwgPCkpCisJCWNzLT50aW1lc3RhbXAgPSBjc24tPnRpbWVzdGFtcDsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3Qgb3V0X2JhdG9uIHsKKwlGSUxFICpmcDsKKwlzdHJ1Y3QgY29uZmlnX2RlZl90cmVlX3NwZWMgKnRyZWVfc3BlYzsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworfTsKKworI2RlZmluZSBNQVhfQ09NTUVOVF9MSU5FIDUxMgorCitzdGF0aWMgaW50IF9jb3B5X29uZV9saW5lKGNvbnN0IGNoYXIgKmNvbW1lbnQsIGNoYXIgKmxpbmUsIGludCAqcG9zLCBpbnQgbGVuKQoreworCWludCBwOworCWludCBpID0gMDsKKwljaGFyIGM7CisKKwlpZiAoKnBvcyA+PSBsZW4pCisJCXJldHVybiAwOworCisJbWVtc2V0KGxpbmUsIDAsIE1BWF9DT01NRU5UX0xJTkUrMSk7CisKKwlmb3IgKHAgPSAqcG9zOyA7IHArKykgeworCQljID0gY29tbWVudFtwXTsKKworCQkoKnBvcykrKzsKKworCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1wwJykKKwkJCWJyZWFrOworCisJCWxpbmVbaSsrXSA9IGM7CisKKwkJaWYgKGkgPT0gTUFYX0NPTU1FTlRfTElORSkKKwkJICAgICAgIGJyZWFrOworCX0KKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IF9nZXRfY29uZmlnX25vZGVfdmVyc2lvbih1aW50MTZfdCB2ZXJzaW9uX2VuYywgY2hhciAqdmVyc2lvbikKK3sKKwlpZiAoZG1fc25wcmludGYodmVyc2lvbiwgOSwgIiV1LiV1LiV1IiwKKwkJCSh2ZXJzaW9uX2VuYyAmIDB4RTAwMCkgPj4gMTMsCisJCQkodmVyc2lvbl9lbmMgJiAweDFFMDApID4+IDksCisJCQkodmVyc2lvbl9lbmMgJiAweDFGRikpID09IC0xKSB7CisJCWxvZ19lcnJvcigiX2dldF9jb25maWdfbm9kZV92ZXJzaW9uOiBjb3VsZG4ndCBjcmVhdGUgdmVyc2lvbiBzdHJpbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RlZl9ub2RlX2lzX2RlcHJlY2F0ZWQoY2ZnX2RlZl9pdGVtX3QgKmRlZiwgc3RydWN0IGNvbmZpZ19kZWZfdHJlZV9zcGVjICpzcGVjKQoreworCXJldHVybiBkZWYtPmRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiAmJgorCSAgICAgICAoc3BlYy0+dmVyc2lvbiA+PSBkZWYtPmRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbik7Cit9CisKK3N0YXRpYyBpbnQgX291dF9wcmVmaXhfZm4oY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IG91dF9iYXRvbiAqb3V0ID0gYmF0b247CisJc3RydWN0IGNmZ19kZWZfaXRlbSAqY2ZnX2RlZjsKKwljaGFyIHZlcnNpb25bOV07IC8qIDgrMSBjaGFycyBmb3IgbWF4IHZlcnNpb24gb2YgNy4xNS41MTEgKi8KKwljb25zdCBjaGFyICpub2RlX3R5cGVfbmFtZSA9IGNuLT52ID8gIm9wdGlvbiIgOiAic2VjdGlvbiI7CisJY2hhciBwYXRoW0NGR19QQVRIX01BWF9MRU5dOworCWNoYXIgY29tbWVudGxpbmVbTUFYX0NPTU1FTlRfTElORSsxXTsKKworCWlmIChjbi0+aWQgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAob3V0LT50cmVlX3NwZWMtPnR5cGUgPT0gQ0ZHX0RFRl9UUkVFX0xJU1QpCisJCXJldHVybiAxOworCisJaWYgKChvdXQtPnRyZWVfc3BlYy0+dHlwZSA9PSBDRkdfREVGX1RSRUVfRElGRikgJiYKKwkgICAgKCEob3V0LT50cmVlX3NwZWMtPmNoZWNrX3N0YXR1c1tjbi0+aWRdICYgQ0ZHX0RJRkYpKSkKKwkJcmV0dXJuIDE7CisKKwljZmdfZGVmID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGNuLT5pZCk7CisKKwlpZiAob3V0LT50cmVlX3NwZWMtPndpdGhzdW1tYXJ5IHx8IG91dC0+dHJlZV9zcGVjLT53aXRoY29tbWVudHMpIHsKKwkJX2NmZ19kZWZfbWFrZV9wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgY2ZnX2RlZi0+aWQsIGNmZ19kZWYsIDEpOworCQlmcHJpbnRmKG91dC0+ZnAsICJcbiIpOworCQlmcHJpbnRmKG91dC0+ZnAsICIlcyMgQ29uZmlndXJhdGlvbiAlcyAlcy5cbiIsIGxpbmUsIG5vZGVfdHlwZV9uYW1lLCBwYXRoKTsKKworCQlpZiAob3V0LT50cmVlX3NwZWMtPndpdGhjb21tZW50cyAmJgorCQkgICAgX2RlZl9ub2RlX2lzX2RlcHJlY2F0ZWQoY2ZnX2RlZiwgb3V0LT50cmVlX3NwZWMpKQorCQkJZnByaW50ZihvdXQtPmZwLCAiJXMjICVzIiwgbGluZSwgY2ZnX2RlZi0+ZGVwcmVjYXRpb25fY29tbWVudCk7CisKKwkJaWYgKGNmZ19kZWYtPmNvbW1lbnQpIHsKKwkJCWludCBwb3MgPSAwOworCQkJd2hpbGUgKF9jb3B5X29uZV9saW5lKGNmZ19kZWYtPmNvbW1lbnQsIGNvbW1lbnRsaW5lLCAmcG9zLCBzdHJsZW4oY2ZnX2RlZi0+Y29tbWVudCkpKSB7CisJCQkJaWYgKChjb21tZW50bGluZVswXSA9PSAnIycpICYmIChzdHJsZW4oY29tbWVudGxpbmUpID09IDEpKSB7CisJCQkJCWlmICghb3V0LT50cmVlX3NwZWMtPndpdGhzcGFjZXMpCisJCQkJCQljb250aW51ZTsKKwkJCQkJY29tbWVudGxpbmVbMF0gPSAnXDAnOworCQkJCX0KKwkJCQlmcHJpbnRmKG91dC0+ZnAsICIlcyMgJXNcbiIsIGxpbmUsIGNvbW1lbnRsaW5lKTsKKwkJCQkvKiB3aXRoc3VtbWFyeSBwcmludHMgb25seSB0aGUgZmlyc3QgY29tbWVudCBsaW5lLiAqLworCQkJCWlmICghb3V0LT50cmVlX3NwZWMtPndpdGhjb21tZW50cykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoX2RlZl9ub2RlX2lzX2RlcHJlY2F0ZWQoY2ZnX2RlZiwgb3V0LT50cmVlX3NwZWMpKQorCQkJZnByaW50ZihvdXQtPmZwLCAiJXMjIFRoaXMgY29uZmlndXJhdGlvbiAlcyBpcyBkZXByZWNhdGVkLlxuIiwgbGluZSwgbm9kZV90eXBlX25hbWUpOworCisJCWlmIChjZmdfZGVmLT5mbGFncyAmIENGR19BRFZBTkNFRCkKKwkJCWZwcmludGYob3V0LT5mcCwgIiVzIyBUaGlzIGNvbmZpZ3VyYXRpb24gJXMgaXMgYWR2YW5jZWQuXG4iLCBsaW5lLCBub2RlX3R5cGVfbmFtZSk7CisKKwkJaWYgKGNmZ19kZWYtPmZsYWdzICYgQ0ZHX1VOU1VQUE9SVEVEKQorCQkJZnByaW50ZihvdXQtPmZwLCAiJXMjIFRoaXMgY29uZmlndXJhdGlvbiAlcyBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuXG4iLCBsaW5lLCBub2RlX3R5cGVfbmFtZSk7CisKKwkJaWYgKGNmZ19kZWYtPmZsYWdzICYgQ0ZHX05BTUVfVkFSSUFCTEUpCisJCQlmcHJpbnRmKG91dC0+ZnAsICIlcyMgVGhpcyBjb25maWd1cmF0aW9uICVzIGhhcyB2YXJpYWJsZSBuYW1lLlxuIiwgbGluZSwgbm9kZV90eXBlX25hbWUpOworCisJCWlmIChjZmdfZGVmLT5mbGFncyAmIENGR19ERUZBVUxUX1VOREVGSU5FRCkKKwkJCWZwcmludGYob3V0LT5mcCwgIiVzIyBUaGlzIGNvbmZpZ3VyYXRpb24gJXMgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZC5cbiIsIGxpbmUsIG5vZGVfdHlwZV9uYW1lKTsKKworCQlpZiAoY2ZnX2RlZi0+ZmxhZ3MgJiBDRkdfREVGQVVMVF9DT01NRU5URUQpCisJCQlmcHJpbnRmKG91dC0+ZnAsICIlcyMgVGhpcyBjb25maWd1cmF0aW9uICVzIGhhcyBhbiBhdXRvbWF0aWMgZGVmYXVsdCB2YWx1ZS5cbiIsIGxpbmUsIG5vZGVfdHlwZV9uYW1lKTsKKworCQlpZiAoKG91dC0+dHJlZV9zcGVjLT50eXBlID09IENGR19ERUZfVFJFRV9GVUxMKSAmJgorCQkgICAgKG91dC0+dHJlZV9zcGVjLT5jaGVja19zdGF0dXNbY24tPmlkXSAmIENGR19VU0VEKSkKKwkJCWZwcmludGYob3V0LT5mcCwgIiVzIyBWYWx1ZSBkZWZpbmVkIGluIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gdXNlZCBmb3IgdGhpcyBzZXR0aW5nLlxuIiwgbGluZSk7CisJfQorCisJaWYgKG91dC0+dHJlZV9zcGVjLT53aXRodmVyc2lvbnMpIHsKKwkJaWYgKCFfZ2V0X2NvbmZpZ19ub2RlX3ZlcnNpb24oY2ZnX2RlZi0+c2luY2VfdmVyc2lvbiwgdmVyc2lvbikpCisJCQlyZXR1cm5fMDsKKwkJZnByaW50ZihvdXQtPmZwLCAiJXMjIEF2YWlsYWJsZSBzaW5jZSB2ZXJzaW9uICVzLlxuIiwgbGluZSwgdmVyc2lvbik7CisKKwkJaWYgKF9kZWZfbm9kZV9pc19kZXByZWNhdGVkKGNmZ19kZWYsIG91dC0+dHJlZV9zcGVjKSkgeworCQkJaWYgKCFfZ2V0X2NvbmZpZ19ub2RlX3ZlcnNpb24oY2ZnX2RlZi0+ZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCB2ZXJzaW9uKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWZwcmludGYob3V0LT5mcCwgIiVzIyBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gJXMuXG4iLCBsaW5lLCB2ZXJzaW9uKTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zaG91bGRfcHJpbnRfY2ZnX3dpdGhfdW5kZWZfZGVmX3ZhbChzdHJ1Y3Qgb3V0X2JhdG9uICpvdXQsIGNmZ19kZWZfaXRlbV90ICpjZmdfZGVmLAorCQkJCQkJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbikKK3sKKwlpZiAoIShjZmdfZGVmLT5mbGFncyAmIENGR19ERUZBVUxUX1VOREVGSU5FRCkpCisJCXJldHVybiAxOworCisJLyogcHJpbnQgaXQgb25seSBpZiB0aGUgdmFsdWUgaXMgZGlyZWN0bHkgZGVmaW5lZCBpbiBzb21lIGNvbmZpZyA9IGl0J3MgdXNlZCAqLworCXJldHVybiBvdXQtPnRyZWVfc3BlYy0+Y2hlY2tfc3RhdHVzICYmIChvdXQtPnRyZWVfc3BlYy0+Y2hlY2tfc3RhdHVzW2NuLT5pZF0gJiBDRkdfVVNFRCk7Cit9CisKK3N0YXRpYyBpbnQgX291dF9saW5lX2ZuKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBvdXRfYmF0b24gKm91dCA9IGJhdG9uOworCXN0cnVjdCBjZmdfZGVmX2l0ZW0gKmNmZ19kZWY7CisJY2hhciBjb25maWdfcGF0aFtDRkdfUEFUSF9NQVhfTEVOXTsKKwljaGFyIHN1bW1hcnlbTUFYX0NPTU1FTlRfTElORSsxXTsKKwljaGFyIHZlcnNpb25bOV07CisJaW50IHBvcyA9IDA7CisJc2l6ZV90IGxlbjsKKwljaGFyICpzcGFjZV9wcmVmaXg7CisKKwlpZiAoKG91dC0+dHJlZV9zcGVjLT50eXBlID09IENGR19ERUZfVFJFRV9ESUZGKSAmJgorCSAgICAoIShvdXQtPnRyZWVfc3BlYy0+Y2hlY2tfc3RhdHVzW2NuLT5pZF0gJiBDRkdfRElGRikpKQorCQlyZXR1cm4gMTsKKworCWNmZ19kZWYgPSBjZmdfZGVmX2dldF9pdGVtX3AoY24tPmlkKTsKKworCWlmIChvdXQtPnRyZWVfc3BlYy0+dHlwZSA9PSBDRkdfREVGX1RSRUVfTElTVCkgeworCQkvKiBMaXN0IHZpZXcgd2l0aCBub2RlIHBhdGhzIGFuZCBzdW1tYXJ5LiAqLworCQlpZiAoY2ZnX2RlZi0+dHlwZSAmIENGR19UWVBFX1NFQ1RJT04pCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFfY2ZnX2RlZl9tYWtlX3BhdGgoY29uZmlnX3BhdGgsIENGR19QQVRIX01BWF9MRU4sIGNmZ19kZWYtPmlkLCBjZmdfZGVmLCAxKSkKKwkJCXJldHVybl8wOworCQlpZiAob3V0LT50cmVlX3NwZWMtPndpdGh2ZXJzaW9ucyAmJiAhX2dldF9jb25maWdfbm9kZV92ZXJzaW9uKGNmZ19kZWYtPnNpbmNlX3ZlcnNpb24sIHZlcnNpb24pKQorCQkJcmV0dXJuXzA7CisKKwkJc3VtbWFyeVswXSA9ICdcMCc7CisJCWlmIChvdXQtPnRyZWVfc3BlYy0+d2l0aHN1bW1hcnkgJiYgY2ZnX2RlZi0+Y29tbWVudCkKKwkJCV9jb3B5X29uZV9saW5lKGNmZ19kZWYtPmNvbW1lbnQsIHN1bW1hcnksICZwb3MsIHN0cmxlbihjZmdfZGVmLT5jb21tZW50KSk7CisKKwkJZnByaW50ZihvdXQtPmZwLCAiJXMlcyVzJXMlcyVzJXNcbiIsIGNvbmZpZ19wYXRoLAorCQkJKnN1bW1hcnkgfHwgb3V0LT50cmVlX3NwZWMtPndpdGh2ZXJzaW9ucyA/ICIgLSAiOiAiIiwKKwkJCSpzdW1tYXJ5ID8gc3VtbWFyeSA6ICIiLAorCQkJKnN1bW1hcnkgPyAiICIgOiAiIiwKKwkJCW91dC0+dHJlZV9zcGVjLT53aXRodmVyc2lvbnMgPyAiWyIgOiAiIiwKKwkJCW91dC0+dHJlZV9zcGVjLT53aXRodmVyc2lvbnMgPyB2ZXJzaW9uIDogIiIsCisJCQlvdXQtPnRyZWVfc3BlYy0+d2l0aHZlcnNpb25zID8gIl0iIDogIiIpOworCisJCXJldHVybiAxOworCX0KKworCS8qIFVzdWFsIHRyZWUgdmlldyB3aXRoIG5vZGVzIGFuZCB0aGVpciB2YWx1ZXMuICovCisKKwlpZiAoKG91dC0+dHJlZV9zcGVjLT50eXBlICE9IENGR19ERUZfVFJFRV9DVVJSRU5UKSAmJgorCSAgICAob3V0LT50cmVlX3NwZWMtPnR5cGUgIT0gQ0ZHX0RFRl9UUkVFX0RJRkYpICYmCisJICAgIChvdXQtPnRyZWVfc3BlYy0+dHlwZSAhPSBDRkdfREVGX1RSRUVfRlVMTCkgJiYKKwkgICAgKGNmZ19kZWYtPmZsYWdzICYgKENGR19ERUZBVUxUX1VOREVGSU5FRCB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCkpKSB7CisJCS8qIHByaW50IHdpdGggIyBhdCB0aGUgZnJvbnQgdG8gY29tbWVudCBvdXQgdGhlIGxpbmUgKi8KKwkJaWYgKF9zaG91bGRfcHJpbnRfY2ZnX3dpdGhfdW5kZWZfZGVmX3ZhbChvdXQsIGNmZ19kZWYsIGNuKSkgeworCQkJc3BhY2VfcHJlZml4ID0gKChsZW4gPSBzdHJzcG4obGluZSwgIlx0ICIpKSkgPyBkbV9wb29sX3N0cm5kdXAob3V0LT5tZW0sIGxpbmUsIGxlbikgOiBOVUxMOworCQkJZnByaW50ZihvdXQtPmZwLCAiJXMlcyVzXG4iLCBzcGFjZV9wcmVmaXggPyA6ICIiLCAiIyAiLCBsaW5lICsgbGVuKTsKKwkJCWlmIChzcGFjZV9wcmVmaXgpCisJCQkJZG1fcG9vbF9mcmVlKG91dC0+bWVtLCBzcGFjZV9wcmVmaXgpOworCQl9CisJCXJldHVybiAxOworCX0KKworCS8qIHByaW50IHRoZSBsaW5lIGFzIGl0IGlzICovCisJaWYgKF9zaG91bGRfcHJpbnRfY2ZnX3dpdGhfdW5kZWZfZGVmX3ZhbChvdXQsIGNmZ19kZWYsIGNuKSkKKwkJZnByaW50ZihvdXQtPmZwLCAiJXNcbiIsIGxpbmUpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX291dF9zdWZmaXhfZm4oY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pCit7CisJcmV0dXJuIDE7Cit9CisKK2ludCBjb25maWdfd3JpdGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCSBzdHJ1Y3QgY29uZmlnX2RlZl90cmVlX3NwZWMgKnRyZWVfc3BlYywKKwkJIGNvbnN0IGNoYXIgKmZpbGUsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlX291dF9zcGVjIF9vdXRfc3BlYyA9IHsKKwkJLnByZWZpeF9mbiA9IF9vdXRfcHJlZml4X2ZuLAorCQkubGluZV9mbiA9IF9vdXRfbGluZV9mbiwKKwkJLnN1ZmZpeF9mbiA9IF9vdXRfc3VmZml4X2ZuCisJfTsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCXN0cnVjdCBvdXRfYmF0b24gYmF0b24gPSB7CisJCS50cmVlX3NwZWMgPSB0cmVlX3NwZWMsCisJCS5tZW0gPSBjZnQtPm1lbQorCX07CisJaW50IHIgPSAxOworCisJaWYgKCFmaWxlKSB7CisJCWJhdG9uLmZwID0gc3Rkb3V0OworCQlmaWxlID0gInN0ZG91dCI7CisJfSBlbHNlIGlmICghKGJhdG9uLmZwID0gZm9wZW4oZmlsZSwgInciKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIGZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyYm9zZSgiRHVtcGluZyBjb25maWd1cmF0aW9uIHRvICVzIiwgZmlsZSk7CisJaWYgKCFhcmdjKSB7CisJCWlmICghZG1fY29uZmlnX3dyaXRlX25vZGVfb3V0KGNmdC0+cm9vdCwgJl9vdXRfc3BlYywgJmJhdG9uKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsdXJlIHdoaWxlIHdyaXRpbmcgdG8gJXMiLCBmaWxlKTsKKwkJCXIgPSAwOworCQl9CisJfSBlbHNlIHdoaWxlIChhcmdjLS0pIHsKKwkJaWYgKChjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoY2Z0LT5yb290LCAqYXJndikpKSB7CisJCQlpZiAoIWRtX2NvbmZpZ193cml0ZV9vbmVfbm9kZV9vdXQoY24sICZfb3V0X3NwZWMsICZiYXRvbikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWx1cmUgd2hpbGUgd3JpdGluZyB0byAlcyIsIGZpbGUpOworCQkJCXIgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJDb25maWd1cmF0aW9uIG5vZGUgJXMgbm90IGZvdW5kIiwgKmFyZ3YpOworCQkJciA9IDA7CisJCX0KKwkJYXJndisrOworCX0KKworCWlmIChiYXRvbi5mcCAmJiBiYXRvbi5mcCAhPSBzdGRvdXQgJiYgZG1fZmNsb3NlKGJhdG9uLmZwKSkgeworCQlzdGFjazsKKwkJciA9IDA7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKl9hZGRfZGVmX25vZGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJCSAgICBzdHJ1Y3QgY29uZmlnX2RlZl90cmVlX3NwZWMgKnNwZWMsCisJCQkJCSAgICBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwKKwkJCQkJICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcmVsYXksCisJCQkJCSAgICBjZmdfZGVmX2l0ZW1fdCAqZGVmKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3QgY2hhciAqc3RyOworCXVpbnQzMl90IGZvcm1hdF9mbGFncyA9IDA7CisKKwlpZiAoIShjbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShjZnQsIGRlZi0+bmFtZSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBkZWZhdWx0IGNvbmZpZyBzZXR0aW5nIG5vZGUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGRlZi0+dHlwZSAmIENGR19UWVBFX1NFQ1RJT04pICYmICEoZGVmLT50eXBlICYgQ0ZHX1RZUEVfQVJSQVkpKSB7CisJCWlmICghKGNuLT52ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShjZnQpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRlZmF1bHQgY29uZmlnIHNldHRpbmcgbm9kZSB2YWx1ZS4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzcGVjLT53aXRoc3BhY2VzKQorCQkJZm9ybWF0X2ZsYWdzIHw9IERNX0NPTkZJR19WQUxVRV9GTVRfQ09NTU9OX0VYVFJBX1NQQUNFUzsKKwl9CisKKwljbi0+aWQgPSBkZWYtPmlkOworCisJaWYgKHNwZWMtPnVuY29uZmlndXJlZCAmJiBkZWYtPmRlZmF1bHRfdW5jb25maWd1cmVkX3ZhbHVlLnZfVU5DT05GSUdVUkVEKSB7CisJCWNuLT52LT50eXBlID0gRE1fQ0ZHX1NUUklORzsKKwkJY24tPnYtPnYuc3RyID0gY2ZnX2RlZl9nZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfdmFsdWVfaGludChzcGVjLT5jbWQsIGRlZik7CisJCWlmIChkZWYtPnR5cGUgIT0gQ0ZHX1RZUEVfU1RSSU5HKQorCQkJZm9ybWF0X2ZsYWdzIHw9IERNX0NPTkZJR19WQUxVRV9GTVRfU1RSSU5HX05PX1FVT1RFUzsKKwkJZG1fY29uZmlnX3ZhbHVlX3NldF9mb3JtYXRfZmxhZ3MoY24tPnYsIGZvcm1hdF9mbGFncyk7CisJfSBlbHNlIGlmICghKGRlZi0+dHlwZSAmIENGR19UWVBFX0FSUkFZKSkgeworCQlzd2l0Y2ggKGRlZi0+dHlwZSkgeworCQkJY2FzZSBDRkdfVFlQRV9TRUNUSU9OOgorCQkJCWNuLT52ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX1RZUEVfQk9PTDoKKwkJCQljbi0+di0+dHlwZSA9IERNX0NGR19JTlQ7CisJCQkJY24tPnYtPnYuaSA9IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWVfaGludChzcGVjLT5jbWQsIGRlZiwgQ0ZHX1RZUEVfQk9PTCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19UWVBFX0lOVDoKKwkJCQljbi0+di0+dHlwZSA9IERNX0NGR19JTlQ7CisJCQkJY24tPnYtPnYuaSA9IGNmZ19kZWZfZ2V0X2RlZmF1bHRfdmFsdWVfaGludChzcGVjLT5jbWQsIGRlZiwgQ0ZHX1RZUEVfSU5ULCBOVUxMKTsKKwkJCQlpZiAoZGVmLT5mbGFncyAmIENGR19GT1JNQVRfSU5UX09DVEFMKQorCQkJCQlmb3JtYXRfZmxhZ3MgfD0gRE1fQ09ORklHX1ZBTFVFX0ZNVF9JTlRfT0NUQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19UWVBFX0ZMT0FUOgorCQkJCWNuLT52LT50eXBlID0gRE1fQ0ZHX0ZMT0FUOworCQkJCWNuLT52LT52LmYgPSBjZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlX2hpbnQoc3BlYy0+Y21kLCBkZWYsIENGR19UWVBFX0ZMT0FULCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX1RZUEVfU1RSSU5HOgorCQkJCWNuLT52LT50eXBlID0gRE1fQ0ZHX1NUUklORzsKKwkJCQlpZiAoIShzdHIgPSBjZmdfZGVmX2dldF9kZWZhdWx0X3ZhbHVlX2hpbnQoc3BlYy0+Y21kLCBkZWYsIENGR19UWVBFX1NUUklORywgTlVMTCkpKQorCQkJCQlzdHIgPSAiIjsKKwkJCQljbi0+di0+di5zdHIgPSBzdHI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2FkZF9kZWZfbm9kZTogdW5rbm93biB0eXBlIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQkJYnJlYWs7CisJCX0KKwkJZG1fY29uZmlnX3ZhbHVlX3NldF9mb3JtYXRfZmxhZ3MoY24tPnYsIGZvcm1hdF9mbGFncyk7CisJfSBlbHNlIHsKKwkJaWYgKHNwZWMtPndpdGhzcGFjZXMpCisJCQlmb3JtYXRfZmxhZ3MgfD0gRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fRVhUUkFfU1BBQ0VTOworCQlmb3JtYXRfZmxhZ3MgfD0gRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fQVJSQVk7CisJCWNuLT52ID0gX2dldF9kZWZfYXJyYXlfdmFsdWVzKHNwZWMtPmNtZCwgY2Z0LCBkZWYsIGZvcm1hdF9mbGFncyk7CisJfQorCisJY24tPmNoaWxkID0gTlVMTDsKKwlpZiAocGFyZW50KSB7CisJCWNuLT5wYXJlbnQgPSBwYXJlbnQ7CisJCWlmICghcGFyZW50LT5jaGlsZCkKKwkJCXBhcmVudC0+Y2hpbGQgPSBjbjsKKwl9IGVsc2UKKwkJY24tPnBhcmVudCA9IGNuOworCisJaWYgKHJlbGF5KQorCQlyZWxheS0+c2liID0gY247CisKKwlyZXR1cm4gY247Cit9CisKK3N0YXRpYyBpbnQgX3Nob3VsZF9za2lwX2RlcHJlY2F0ZWRfZGVmX25vZGUoY2ZnX2RlZl9pdGVtX3QgKmRlZiwgc3RydWN0IGNvbmZpZ19kZWZfdHJlZV9zcGVjICpzcGVjKQoreworCXJldHVybiBzcGVjLT5pZ25vcmVkZXByZWNhdGVkICYmIF9kZWZfbm9kZV9pc19kZXByZWNhdGVkKGRlZiwgc3BlYyk7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3VsZF9za2lwX2RlZl9ub2RlKHN0cnVjdCBjb25maWdfZGVmX3RyZWVfc3BlYyAqc3BlYywgaW50IHNlY3Rpb25faWQsIGludCBpZCkKK3sKKwljZmdfZGVmX2l0ZW1fdCAqZGVmID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwl1aW50MTZfdCBmbGFnczsKKworCWlmICgoZGVmLT5wYXJlbnQgIT0gc2VjdGlvbl9pZCkgfHwKKwkgICAgKHNwZWMtPmlnbm9yZWFkdmFuY2VkICYmIGRlZi0+ZmxhZ3MgJiBDRkdfQURWQU5DRUQpIHx8CisJICAgIChzcGVjLT5pZ25vcmV1bnN1cHBvcnRlZCAmJiBkZWYtPmZsYWdzICYgQ0ZHX1VOU1VQUE9SVEVEKSkKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKHNwZWMtPnR5cGUpIHsKKwkJY2FzZSBDRkdfREVGX1RSRUVfRlVMTDoKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIENGR19ERUZfVFJFRV9NSVNTSU5HOgorCQkJaWYgKCFzcGVjLT5jaGVja19zdGF0dXMpIHsKKwkJCQlsb2dfZXJyb3Jfb25jZShJTlRFUk5BTF9FUlJPUiAiY291bGRuJ3QgZGV0ZXJtaW5lIG1pc3NpbmcgIgorCQkJCSAgICAgICAiY29uZmlnIG5vZGVzIC0gdW5rbm93biBzdGF0dXMgb2YgbGFzdCBjb25maWcgY2hlY2suIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAoKHNwZWMtPmNoZWNrX3N0YXR1c1tpZF0gJiBDRkdfVVNFRCkgfHwKKwkJCSAgICAoZGVmLT5mbGFncyAmIENGR19OQU1FX1ZBUklBQkxFKSkKKwkJCQlyZXR1cm4gMTsKKworCQkJaWYgKChzcGVjLT50eXBlID09IENGR19ERUZfVFJFRV9NSVNTSU5HKSAmJgorCQkJICAgICgoZGVmLT5zaW5jZV92ZXJzaW9uID4gc3BlYy0+dmVyc2lvbikgfHwKKwkJCSAgICAgX3Nob3VsZF9za2lwX2RlcHJlY2F0ZWRfZGVmX25vZGUoZGVmLCBzcGVjKSkpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBDRkdfREVGX1RSRUVfTkVXOgorCQkJaWYgKChkZWYtPnNpbmNlX3ZlcnNpb24gIT0gc3BlYy0+dmVyc2lvbikgfHwKKwkJCSAgICBfc2hvdWxkX3NraXBfZGVwcmVjYXRlZF9kZWZfbm9kZShkZWYsIHNwZWMpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgQ0ZHX0RFRl9UUkVFX05FV19TSU5DRToKKwkJCWlmICgoZGVmLT5zaW5jZV92ZXJzaW9uIDwgc3BlYy0+dmVyc2lvbikgfHwKKwkJCSAgICBfc2hvdWxkX3NraXBfZGVwcmVjYXRlZF9kZWZfbm9kZShkZWYsIHNwZWMpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgQ0ZHX0RFRl9UUkVFX1BST0ZJTEFCTEU6CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBDRkdfREVGX1RSRUVfUFJPRklMQUJMRV9DTUQ6CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBDRkdfREVGX1RSRUVfUFJPRklMQUJMRV9NREE6CisJCQlpZiAoIShkZWYtPmZsYWdzICYgQ0ZHX1BST0ZJTEFCTEUpIHx8CisJCQkgICAgKGRlZi0+c2luY2VfdmVyc2lvbiA+IHNwZWMtPnZlcnNpb24pIHx8CisJCQkgICAgX3Nob3VsZF9za2lwX2RlcHJlY2F0ZWRfZGVmX25vZGUoZGVmLCBzcGVjKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWZsYWdzID0gZGVmLT5mbGFncyAmIH5DRkdfUFJPRklMQUJMRTsKKwkJCWlmIChzcGVjLT50eXBlID09IENGR19ERUZfVFJFRV9QUk9GSUxBQkxFX0NNRCkgeworCQkJCWlmIChmbGFncyAmIENGR19QUk9GSUxBQkxFX01FVEFEQVRBKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBDRkdfREVGX1RSRUVfUFJPRklMQUJMRV9NREEpIHsKKwkJCQlpZiAoIShmbGFncyAmIENGR19QUk9GSUxBQkxFX01FVEFEQVRBKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICgoZGVmLT5zaW5jZV92ZXJzaW9uID4gc3BlYy0+dmVyc2lvbikgfHwKKwkJCSAgICBfc2hvdWxkX3NraXBfZGVwcmVjYXRlZF9kZWZfbm9kZShkZWYsIHNwZWMpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKl9hZGRfZGVmX3NlY3Rpb25fc3VidHJlZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgY29uZmlnX2RlZl90cmVlX3NwZWMgKnNwZWMsCisJCQkJCQkgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJCQkgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpyZWxheSwKKwkJCQkJCSAgICAgICBpbnQgc2VjdGlvbl9pZCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuID0gTlVMTCwgKnJlbGF5X3N1YiA9IE5VTEwsICp0bXA7CisJY2ZnX2RlZl9pdGVtX3QgKmRlZjsKKwlpbnQgaWQ7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBDRkdfQ09VTlQ7IGlkKyspIHsKKwkJaWYgKF9zaG91bGRfc2tpcF9kZWZfbm9kZShzcGVjLCBzZWN0aW9uX2lkLCBpZCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIWNuICYmICEoY24gPSBfYWRkX2RlZl9ub2RlKGNmdCwgc3BlYywgcGFyZW50LCByZWxheSwgY2ZnX2RlZl9nZXRfaXRlbV9wKHNlY3Rpb25faWQpKSkpCisJCQkJZ290byBiYWQ7CisKKwkJZGVmID0gY2ZnX2RlZl9nZXRfaXRlbV9wKGlkKTsKKwkJaWYgKCh0bXAgPSBkZWYtPnR5cGUgPT0gQ0ZHX1RZUEVfU0VDVElPTiA/IF9hZGRfZGVmX3NlY3Rpb25fc3VidHJlZShjZnQsIHNwZWMsIGNuLCByZWxheV9zdWIsIGlkKQorCQkJCQkJCSA6IF9hZGRfZGVmX25vZGUoY2Z0LCBzcGVjLCBjbiwgcmVsYXlfc3ViLCBkZWYpKSkKKwkJCXJlbGF5X3N1YiA9IHRtcDsKKwl9CisKKwlyZXR1cm4gY247CitiYWQ6CisJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRlZmF1bHQgY29uZmlnIHNlY3Rpb24gbm9kZS4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGRtX2NvbmZpZ190cmVlICpjb25maWdfZGVmX2NyZWF0ZV90cmVlKHN0cnVjdCBjb25maWdfZGVmX3RyZWVfc3BlYyAqc3BlYykKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IE5VTEwsICp0bXBfY2Z0ID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnJvb3QgPSBOVUxMLCAqcmVsYXkgPSBOVUxMLCAqdG1wOworCWludCBpZDsKKworCWlmICghKGNmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRlZmF1bHQgY29uZmlnIHRyZWUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaWQgPSByb290X0NGR19TRUNUSU9OICsgMTsgaWQgPCBDRkdfQ09VTlQ7IGlkKyspIHsKKwkJaWYgKGNmZ19kZWZfZ2V0X2l0ZW1fcChpZCktPnBhcmVudCAhPSByb290X0NGR19TRUNUSU9OKQorCQkJY29udGludWU7CisKKwkJaWYgKHNwZWMtPmlnbm9yZWxvY2FsICYmIChpZCA9PSBsb2NhbF9DRkdfU0VDVElPTikpCisJCQljb250aW51ZTsKKworCQlpZiAoKHRtcCA9IF9hZGRfZGVmX3NlY3Rpb25fc3VidHJlZShjZnQsIHNwZWMsIHJvb3QsIHJlbGF5LCBpZCkpKSB7CisJCQlyZWxheSA9IHRtcDsKKwkJCWlmICghcm9vdCkKKwkJCQlyb290ID0gcmVsYXk7CisJCX0KKwl9CisKKwljZnQtPnJvb3QgPSByb290OworCisJaWYgKHNwZWMtPnR5cGUgPT0gQ0ZHX0RFRl9UUkVFX0ZVTEwpIHsKKwkJaWYgKCEodG1wX2NmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgY29uZmlnIHRyZWUgd2hpbGUgY3JlYXRpbmcgZnVsbCB0cmVlLiIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoISh0bXBfY2Z0LT5yb290ID0gZG1fY29uZmlnX2Nsb25lX25vZGVfd2l0aF9tZW0oY2Z0LT5tZW0sIHNwZWMtPmN1cnJlbnRfY2Z0LT5yb290LCAxKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNsb25lIGN1cnJlbnQgY29uZmlnIHRyZWUuIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmICghbWVyZ2VfY29uZmlnX3RyZWUoc3BlYy0+Y21kLCBjZnQsIHRtcF9jZnQsIENPTkZJR19NRVJHRV9UWVBFX1JBVykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIG1lcmdlIGRlZmF1bHQgYW5kIGN1cnJlbnQgY29uZmlnIHRyZWUuIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWRtX2NvbmZpZ19kZXN0cm95KHRtcF9jZnQpOworCX0KKworCXJldHVybiBjZnQ7CitiYWQ6CisJaWYgKGNmdCkKKwkJZG1fY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKwlpZiAodG1wX2NmdCkKKwkJZG1fY29uZmlnX2Rlc3Ryb3kodG1wX2NmdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX3Byb2ZpbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCXN0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpoYW5kbGU7CisJaW50IHI7CisKKwlpZiAoIShoYW5kbGUgPSBkbV9wb29sX3phbGxvYyhjbWQtPmxpYm1lbSwgc2l6ZW9mKCpoYW5kbGUpKSkpIHsKKwkJbG9nX2RlYnVnKCJfY2hlY2tfcHJvZmlsZTogcHJvZmlsZSBjaGVjayBoYW5kbGUgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaGFuZGxlLT5jbWQgPSBjbWQ7CisJaGFuZGxlLT5jZnQgPSBwcm9maWxlLT5jZnQ7CisJaGFuZGxlLT5zb3VyY2UgPSBwcm9maWxlLT5zb3VyY2U7CisJLyogdGhlIGNoZWNrIGlzIGNvbXB1bHNvcnkgLSBhbGxvdyBvbmx5IHByb2ZpbGFibGUgaXRlbXMgaW4gYSBwcm9maWxlIGNvbmZpZyEgKi8KKwloYW5kbGUtPmZvcmNlX2NoZWNrID0gMTsKKwkvKiBwcm92aWRlIHdhcm5pbmcgbWVzc2FnZXMgb25seSBpZiBjb25maWcvY2hlY2tzPTEgKi8KKwloYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzID0gIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGNvbmZpZ19jaGVja3NfQ0ZHLCBOVUxMKTsKKworCXIgPSBjb25maWdfZGVmX2NoZWNrKGhhbmRsZSk7CisKKwlkbV9wb29sX2ZyZWUoY21kLT5saWJtZW0sIGhhbmRsZSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9wcm9maWxlX2Zyb21fbGlzdChzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcHJvZmlsZV9uYW1lLAorCQkJCSAgY29uZmlnX3NvdXJjZV90IHNvdXJjZSwgc3RydWN0IHByb2ZpbGUgKipwcm9maWxlX2ZvdW5kKQoreworCXN0cnVjdCBwcm9maWxlICpwcm9maWxlOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHByb2ZpbGUsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAocHJvZmlsZS0+bmFtZSwgcHJvZmlsZV9uYW1lKSkgeworCQkJaWYgKHByb2ZpbGUtPnNvdXJjZSA9PSBzb3VyY2UpIHsKKwkJCQkqcHJvZmlsZV9mb3VuZCA9IHByb2ZpbGU7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlByb2ZpbGUgJXMgYWxyZWFkeSBhZGRlZCBhcyAiCisJCQkJICAiJXMgdHlwZSwgYnV0IHJlcXVlc3RlZCB0eXBlIGlzICVzLiIsCisJCQkJICAgcHJvZmlsZV9uYW1lLAorCQkJCSAgIF9jb25maWdfc291cmNlX25hbWVzW3Byb2ZpbGUtPnNvdXJjZV0sCisJCQkJICAgX2NvbmZpZ19zb3VyY2VfbmFtZXNbc291cmNlXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCSpwcm9maWxlX2ZvdW5kID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHByb2ZpbGUgKmFkZF9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpwcm9maWxlX25hbWUsIGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UpCit7CisJc3RydWN0IHByb2ZpbGUgKnByb2ZpbGU7CisKKwkvKiBEbyBzb21lIHNhbml0eSBjaGVja3MgZmlyc3QuICovCisJaWYgKCFfaXNfcHJvZmlsZV9iYXNlZF9jb25maWdfc291cmNlKHNvdXJjZSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJhZGRfcHJvZmlsZTogaW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gIgorCQkJICAic291cmNlLCBleHBlY3RlZCAlcyBvciAlcyBidXQgJXMgcmVxdWVzdGVkIiwKKwkJCSAgX2NvbmZpZ19zb3VyY2VfbmFtZXNbQ09ORklHX1BST0ZJTEVfQ09NTUFORF0sCisJCQkgIF9jb25maWdfc291cmNlX25hbWVzW0NPTkZJR19QUk9GSUxFX01FVEFEQVRBXSwKKwkJCSAgX2NvbmZpZ19zb3VyY2VfbmFtZXNbc291cmNlXSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghcHJvZmlsZV9uYW1lIHx8ICEqcHJvZmlsZV9uYW1lKSB7CisJCWxvZ19lcnJvcigiVW5kZWZpbmVkIHByb2ZpbGUgbmFtZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHN0cmNocihwcm9maWxlX25hbWUsICcvJykpIHsKKwkJbG9nX2Vycm9yKCIlczogYmFkIHByb2ZpbGUgbmFtZSwgaXQgY29udGFpbnMgJy8nLiIsIHByb2ZpbGVfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHByb2ZpbGUgaXMgb24gdGhlIGxpc3Qgb2YgcHJvZmlsZXMgdG8gYmUgbG9hZGVkIG9yIGlmCisJICogbm90IGZvdW5kIHRoZXJlLCBpZiBpdCdzIG9uIHRoZSBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIHByb2ZpbGVzLgorCSAqLworCWlmICghX2dldF9wcm9maWxlX2Zyb21fbGlzdCgmY21kLT5wcm9maWxlX3BhcmFtcy0+cHJvZmlsZXNfdG9fbG9hZCwKKwkJCQkgICAgcHJvZmlsZV9uYW1lLCBzb3VyY2UsICZwcm9maWxlKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAocHJvZmlsZSkKKwkJcHJvZmlsZS0+c291cmNlID0gc291cmNlOworCWVsc2UgaWYgKCFfZ2V0X3Byb2ZpbGVfZnJvbV9saXN0KCZjbWQtPnByb2ZpbGVfcGFyYW1zLT5wcm9maWxlcywKKwkJCQkJIHByb2ZpbGVfbmFtZSwgc291cmNlLCAmcHJvZmlsZSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKHByb2ZpbGUpIHsKKwkJaWYgKHByb2ZpbGUtPnNvdXJjZSAhPSBzb3VyY2UpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiYWRkX3Byb2ZpbGU6IGxvYWRlZCBwcm9maWxlICIKKwkJCQkgICJoYXMgaW5jb3JyZWN0IHR5cGUsIGV4cGVjdGVkICVzIGJ1dCAlcyBmb3VuZCIsCisJCQkJICAgX2NvbmZpZ19zb3VyY2VfbmFtZXNbc291cmNlXSwKKwkJCQkgICBfY29uZmlnX3NvdXJjZV9uYW1lc1twcm9maWxlLT5zb3VyY2VdKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBwcm9maWxlOworCX0KKworCWlmICghKHByb2ZpbGUgPSBkbV9wb29sX3phbGxvYyhjbWQtPmxpYm1lbSwgc2l6ZW9mKCpwcm9maWxlKSkpKSB7CisJCWxvZ19lcnJvcigicHJvZmlsZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcm9maWxlLT5zb3VyY2UgPSBzb3VyY2U7CisJcHJvZmlsZS0+bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bGlibWVtLCBwcm9maWxlX25hbWUpOworCWRtX2xpc3RfYWRkKCZjbWQtPnByb2ZpbGVfcGFyYW1zLT5wcm9maWxlc190b19sb2FkLCAmcHJvZmlsZS0+bGlzdCk7CisKKwlyZXR1cm4gcHJvZmlsZTsKK30KKworaW50IGxvYWRfcHJvZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpIHsKKwlzdGF0aWMgY2hhciBwcm9maWxlX3BhdGhbUEFUSF9NQVhdOworCisJaWYgKGNyaXRpY2FsX3NlY3Rpb24oKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInRyeWluZyB0byBsb2FkIHByb2ZpbGUgJXMgIgorCQkJICAiaW4gY3JpdGljYWwgc2VjdGlvbi4iLCBwcm9maWxlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHByb2ZpbGUtPmNmdCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZG1fc25wcmludGYocHJvZmlsZV9wYXRoLCBzaXplb2YocHJvZmlsZV9wYXRoKSwgIiVzLyVzLnByb2ZpbGUiLAorCQljbWQtPnByb2ZpbGVfcGFyYW1zLT5kaXIsIHByb2ZpbGUtPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkxWTV9TWVNURU1fRElSIG9yIHByb2ZpbGUgbmFtZSB0b28gbG9uZyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShwcm9maWxlLT5jZnQgPSBjb25maWdfZmlsZV9vcGVuX2FuZF9yZWFkKHByb2ZpbGVfcGF0aCwgcHJvZmlsZS0+c291cmNlLCBjbWQpKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqICpQcm9maWxlIG11c3QgYmUgdmFsaWQqIG90aGVyd2lzZSB3ZSdkIGVuZCB1cCB3aXRoIGluY29ycmVjdCBjb25maWchCisJICogSWYgdGhlcmUgd2VyZSBjb25maWcgaXRlbXMgcHJlc2VudCB0aGF0IGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUKKwkgKiBjdXN0b21pemVkIGJ5IGEgcHJvZmlsZSwgd2UgY291bGQgZW5kIHVwIHdpdGggbm9uLWRldGVybWluaXN0aWMKKwkgKiBiZWhhdmlvdXIuIFRoZXJlZm9yZSwgdGhpcyBjaGVjayBpcyAqc3RyaWN0bHkgZm9yY2VkKiBldmVuIGlmCisJICogY29uZmlnL2NoZWNrcz0wLiBUaGUgY29uZmlnL2NoZWNrcz0wIHdpbGwgb25seSBjYXVzZSB0aGUgd2FybmluZworCSAqIG1lc3NhZ2VzIHRvIGJlIHN1cHByZXNzZWQsIGJ1dCB0aGUgY2hlY2sgaXRzZWxmIGlzIGFsd2F5cyBkb25lCisJICogZm9yIHByb2ZpbGVzIQorCSAqLworCWlmICghX2NoZWNrX3Byb2ZpbGUoY21kLCBwcm9maWxlKSkgeworCQlsb2dfZXJyb3IoIklnbm9yaW5nIGludmFsaWQgJXMgJXMuIiwKKwkJCSAgX2NvbmZpZ19zb3VyY2VfbmFtZXNbcHJvZmlsZS0+c291cmNlXSwgcHJvZmlsZS0+bmFtZSk7CisJCWNvbmZpZ19kZXN0cm95KHByb2ZpbGUtPmNmdCk7CisJCXByb2ZpbGUtPmNmdCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfbW92ZSgmY21kLT5wcm9maWxlX3BhcmFtcy0+cHJvZmlsZXMsICZwcm9maWxlLT5saXN0KTsKKwlyZXR1cm4gMTsKK30KKworaW50IGxvYWRfcGVuZGluZ19wcm9maWxlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSwgKnRlbXBfcHJvZmlsZTsKKwlpbnQgciA9IDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwcm9maWxlLCB0ZW1wX3Byb2ZpbGUsICZjbWQtPnByb2ZpbGVfcGFyYW1zLT5wcm9maWxlc190b19sb2FkKSB7CisJCWlmICghbG9hZF9wcm9maWxlKGNtZCwgcHJvZmlsZSkpCisJCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfZGV2aWNlc19jYWNoZV9kaXJfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8lcyIsIGNtZC0+c3lzdGVtX2RpciwgREVGQVVMVF9DQUNIRV9TVUJESVIpIDwgMCkgeworCQlsb2dfZXJyb3IoIlBlcnNpc3RlbnQgY2FjaGUgZGlyZWN0b3J5IG5hbWUgdG9vIGxvbmcuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgYnVmKTsKK30KKworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2RldmljZXNfY2FjaGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gIkBERUZBVUxUX1NZU19ESVJAL0BERUZBVUxUX0NBQ0hFX1NVQkRJUkAiOworfQorCitjb25zdCBjaGFyICpnZXRfZGVmYXVsdF9kZXZpY2VzX2NhY2hlX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpCit7CisJY29uc3QgY2hhciAqY2FjaGVfZGlyID0gTlVMTCwgKmNhY2hlX2ZpbGVfcHJlZml4ID0gTlVMTDsKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVhdOworCisJLyoKKwkgKiBJZiAnY2FjaGVfZGlyJyBvciAnY2FjaGVfZmlsZV9wcmVmaXgnIGlzIHNldCwgaWdub3JlICdjYWNoZScuCisJKi8KKwlpZiAoZmluZF9jb25maWdfdHJlZV9ub2RlKGNtZCwgZGV2aWNlc19jYWNoZV9kaXJfQ0ZHLCBwcm9maWxlKSkKKwkJY2FjaGVfZGlyID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBkZXZpY2VzX2NhY2hlX2Rpcl9DRkcsIHByb2ZpbGUpOworCWlmIChmaW5kX2NvbmZpZ190cmVlX25vZGUoY21kLCBkZXZpY2VzX2NhY2hlX2ZpbGVfcHJlZml4X0NGRywgcHJvZmlsZSkpCisJCWNhY2hlX2ZpbGVfcHJlZml4ID0gZmluZF9jb25maWdfdHJlZV9zdHJfYWxsb3dfZW1wdHkoY21kLCBkZXZpY2VzX2NhY2hlX2ZpbGVfcHJlZml4X0NGRywgcHJvZmlsZSk7CisKKwlpZiAoY2FjaGVfZGlyIHx8IGNhY2hlX2ZpbGVfcHJlZml4KSB7CisJCWlmIChkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSIlcyVzJXMvJXMuY2FjaGUiLAorCQkJCWNhY2hlX2RpciA/ICIiIDogY21kLT5zeXN0ZW1fZGlyLAorCQkJCWNhY2hlX2RpciA/ICIiIDogIi8iLAorCQkJCWNhY2hlX2RpciA/IDogREVGQVVMVF9DQUNIRV9TVUJESVIsCisJCQkJY2FjaGVfZmlsZV9wcmVmaXggPyA6IERFRkFVTFRfQ0FDSEVfRklMRV9QUkVGSVgpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJQZXJzaXN0ZW50IGNhY2hlIGZpbGVuYW1lIHRvbyBsb25nLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBidWYpOworCX0KKworCWlmIChkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMvJXMuY2FjaGUiLCBjbWQtPnN5c3RlbV9kaXIsCisJCQlERUZBVUxUX0NBQ0hFX1NVQkRJUiwgREVGQVVMVF9DQUNIRV9GSUxFX1BSRUZJWCkgPCAwKSB7CisJCWxvZ19lcnJvcigiUGVyc2lzdGVudCBjYWNoZSBmaWxlbmFtZSB0b28gbG9uZy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgYnVmKTsKK30KKworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2RldmljZXNfY2FjaGVfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IGNoYXIgKmNhY2hlX2ZpbGVfcHJlZml4ID0gTlVMTDsKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVhdOworCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfbm9kZShjbWQsIGRldmljZXNfY2FjaGVfZmlsZV9wcmVmaXhfQ0ZHLCBOVUxMKSkKKwkJY2FjaGVfZmlsZV9wcmVmaXggPSBmaW5kX2NvbmZpZ190cmVlX3N0cl9hbGxvd19lbXB0eShjbWQsIGRldmljZXNfY2FjaGVfZmlsZV9wcmVmaXhfQ0ZHLCBOVUxMKTsKKworCWlmIChkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMuY2FjaGUiLAorCQkJZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2RldmljZXNfY2FjaGVfZGlyX0NGRyhjbWQpLAorCQkJY2FjaGVfZmlsZV9wcmVmaXggPyA6IERFRkFVTFRfQ0FDSEVfRklMRV9QUkVGSVgpIDwgMCkgeworCQlsb2dfZXJyb3IoIlBlcnNpc3RlbnQgY2FjaGUgZmlsZW5hbWUgdG9vIGxvbmcuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgYnVmKTsKK30KKworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfYmFja3VwX2JhY2t1cF9kaXJfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8lcyIsIGNtZC0+c3lzdGVtX2RpciwgREVGQVVMVF9CQUNLVVBfU1VCRElSKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IGJhY2t1cCBwYXRoICclcy8lcycuIiwKKwkJCSAgY21kLT5zeXN0ZW1fZGlyLCBERUZBVUxUX0JBQ0tVUF9TVUJESVIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGJ1Zik7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X3VuY29uZmlndXJlZF9iYWNrdXBfYmFja3VwX2Rpcl9DRkcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJcmV0dXJuICJAREVGQVVMVF9TWVNfRElSQC9AREVGQVVMVF9CQUNLVVBfU1VCRElSQCI7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X2JhY2t1cF9hcmNoaXZlX2Rpcl9DRkcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCXN0YXRpYyBjaGFyIGJ1ZltQQVRIX01BWF07CisKKwlpZiAoZG1fc25wcmludGYgKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8lcyIsIGNtZC0+c3lzdGVtX2RpciwgREVGQVVMVF9BUkNISVZFX1NVQkRJUikgPT0gLTEpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgZGVmYXVsdCBhcmNoaXZlIHBhdGggJyVzLyVzJy4iLAorCQkJICBjbWQtPnN5c3RlbV9kaXIsIERFRkFVTFRfQVJDSElWRV9TVUJESVIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGJ1Zik7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X3VuY29uZmlndXJlZF9iYWNrdXBfYXJjaGl2ZV9kaXJfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybiAiQERFRkFVTFRfU1lTX0RJUkAvQERFRkFVTFRfQVJDSElWRV9TVUJESVJAIjsKK30KKworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfY29uZmlnX3Byb2ZpbGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RhdGljIGNoYXIgYnVmW1BBVEhfTUFYXTsKKworCWlmIChkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMiLCBjbWQtPnN5c3RlbV9kaXIsIERFRkFVTFRfUFJPRklMRV9TVUJESVIpID09IC0xKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIGRlZmF1bHQgcHJvZmlsZSBwYXRoICclcy8lcycuIiwKKwkJCSAgY21kLT5zeXN0ZW1fZGlyLCBERUZBVUxUX1BST0ZJTEVfU1VCRElSKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBidWYpOworfQorCitjb25zdCBjaGFyICpnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfY29uZmlnX3Byb2ZpbGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gIkBERUZBVUxUX1NZU19ESVJAL0BERUZBVUxUX1BST0ZJTEVfU1VCRElSQCI7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X2FjdGl2YXRpb25fbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeV9DRkcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKQoreworCXJldHVybiBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGFjdGl2YXRpb25fbWlycm9yX2RldmljZV9mYXVsdF9wb2xpY3lfQ0ZHLCBwcm9maWxlKTsKK30KKworaW50IGdldF9kZWZhdWx0X2FsbG9jYXRpb25fdGhpbl9wb29sX2NodW5rX3NpemVfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwljb25zdCBjaGFyICpzdHI7CisJdWludDMyX3QgY2h1bmtfc2l6ZTsKKworCWlmICghKHN0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgYWxsb2NhdGlvbl90aGluX3Bvb2xfY2h1bmtfc2l6ZV9wb2xpY3lfQ0ZHLCBwcm9maWxlKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW5ub3QgZmluZCBjb25maWd1cmF0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNhc2VjbXAoc3RyLCAiZ2VuZXJpYyIpKQorCQljaHVua19zaXplID0gREVGQVVMVF9USElOX1BPT0xfQ0hVTktfU0laRSAqIDI7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAicGVyZm9ybWFuY2UiKSkKKwkJY2h1bmtfc2l6ZSA9IERFRkFVTFRfVEhJTl9QT09MX0NIVU5LX1NJWkVfUEVSRk9STUFOQ0UgKiAyOworCWVsc2UgeworCQlsb2dfZXJyb3IoIlRoaW4gcG9vbCBjaHVuayBzaXplIGNhbGN1bGF0aW9uIHBvbGljeSBcIiVzXCIgaXMgdW5yZWNvZ25pc2VkLiIsIHN0cik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAoaW50KSBjaHVua19zaXplOworfQorCitpbnQgZ2V0X2RlZmF1bHRfYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NodW5rX3NpemVfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlyZXR1cm4gREVGQVVMVF9DQUNIRV9QT09MX0NIVU5LX1NJWkUgKiAyOworfQpkaWZmIC0tZ2l0IGEvbGliL2NvbmZpZy9jb25maWcuaCBiL2xpYi9jb25maWcvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3Y2ZlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb25maWcvY29uZmlnLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9DT05GSUdfSAorI2RlZmluZSBfTFZNX0NPTkZJR19ICisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKworLyogMTYgYml0czogMyBiaXRzIGZvciBtYWpvciwgNCBiaXRzIGZvciBtaW5vciwgOSBiaXRzIGZvciBwYXRjaGxldmVsICovCisvKiBGSVhNRSBNYXggTFZNIHZlcnNpb24gc3VwcG9ydGVkOiA3LjE1LjUxMS4gRXh0ZW5kIGJpdHMgd2hlbiBuZWVkZWQuICovCisjZGVmaW5lIHZzbihtYWpvciwgbWlub3IsIHBhdGNobGV2ZWwpIChtYWpvciA8PCAxMyB8IG1pbm9yIDw8IDkgfCBwYXRjaGxldmVsKQorCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGNtZF9jb250ZXh0OworCit0eXBlZGVmIGVudW0geworCUNPTkZJR19VTkRFRklORUQsCS8qIHVuZGVmaW5lZC91bmluaXRpYWxpemVkIGNvbmZpZyAqLworCUNPTkZJR19GSUxFLAkJLyogb25lIGZpbGUgY29uZmlnICovCisJQ09ORklHX01FUkdFRF9GSUxFUywJLyogY29uZmlnIHRoYXQgaXMgYSByZXN1bHQgb2YgbWVyZ2luZyBtb3JlIGNvbmZpZyBmaWxlcyAqLworCUNPTkZJR19TVFJJTkcsCQkvKiBjb25maWcgc3RyaW5nIHR5cGVkIG9uIGNtZGxpbmUgdXNpbmcgJy0tY29uZmlnJyBhcmcgKi8KKwlDT05GSUdfUFJPRklMRV9DT01NQU5ELAkvKiBjb21tYW5kIHByb2ZpbGUgY29uZmlnICovCisJQ09ORklHX1BST0ZJTEVfTUVUQURBVEEsLyogbWV0YWRhdGEgcHJvZmlsZSBjb25maWcgKi8KKwlDT05GSUdfRklMRV9TUEVDSUFMCS8qIHNwZWNpYWwgcHVycG9zZSBmaWxlIGNvbmZpZyAoZS5nLiBtZXRhZGF0YSwgcGVyc2lzdGVudCBmaWx0ZXIuLi4pICovCit9IGNvbmZpZ19zb3VyY2VfdDsKKworc3RydWN0IHByb2ZpbGUgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJY29uZmlnX3NvdXJjZV90IHNvdXJjZTsgLyogZWl0aGVyIENPTkZJR19QUk9GSUxFX0NPTU1BTkQgb3IgQ09ORklHX1BST0ZJTEVfTUVUQURBVEEgKi8KKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworfTsKKworc3RydWN0IHByb2ZpbGVfcGFyYW1zIHsKKwljaGFyIGRpcltQQVRIX01BWF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YmRpciBpbiBMVk1fU1lTVEVNX0RJUiB3aGVyZSBMVk0gbG9va3MgZm9yIHByb2ZpbGVzICovCisJc3RydWN0IHByb2ZpbGUgKmdsb2JhbF9jb21tYW5kX3Byb2ZpbGU7ICAvKiBwcm9maWxlIChhcyBnaXZlbiBieSAtLWNvbW1hbmRwcm9maWxlIGNtZCBhcmcpIHVzZWQgYXMgZ2xvYmFsIGNvbW1hbmQgcHJvZmlsZSAqLworCXN0cnVjdCBwcm9maWxlICpnbG9iYWxfbWV0YWRhdGFfcHJvZmlsZTsgLyogcHJvZmlsZSAoYXMgZ2l2ZW4gYnkgLS1tZXRhZGF0YXByb2ZpbGUgY21kIGFyZykgdGhhdCBvdmVycmlkZXMgYW55IG90aGVyIFZHL0xWLWJhc2VkIHByb2ZpbGUgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBwcm9maWxlc190b19sb2FkOyAgICAgICAgIC8qIGxpc3Qgb2YgcHJvZmlsZXMgd2hpY2ggYXJlIG9ubHkgYWRkZWQsIGJ1dCBzdGlsbCBuZWVkIHRvIGJlIGxvYWRlZCBmb3IgYW55IHVzZSAqLworCXN0cnVjdCBkbV9saXN0IHByb2ZpbGVzOyAgICAgICAgICAgICAgICAgLyogbGlzdCBvZiBwcm9maWxlcyB3aGljaCBhcmUgbG9hZGVkIGFscmVhZHkgYW5kIHdoaWNoIGFyZSByZWFkeSBmb3IgdXNlICovCit9OworCisjZGVmaW5lIENGR19QQVRIX01BWF9MRU4gMTI4CisKKy8qCisgKiBTdHJ1Y3R1cmVzIHVzZWQgZm9yIGRlZmluaXRpb24gb2YgYSBjb25maWd1cmF0aW9uIHRyZWUuCisgKi8KKworLyogY29uZmlndXJhdGlvbiBkZWZpbml0aW9uIGl0ZW0gdHlwZSAoZm9yIGl0ZW0ncyBhY2NlcHRlZCB0eXBlcykgKi8KK3R5cGVkZWYgZW51bSB7CisJQ0ZHX1RZUEVfU0VDVElPTiA9CTEgPDwgMCwJLyogc2VjdGlvbiAqLworCUNGR19UWVBFX0FSUkFZID0JMSA8PCAxLAkvKiBzZXR0aW5nICovCisJQ0ZHX1RZUEVfQk9PTCA9CQkxIDw8IDIsCS8qIHNldHRpbmcgKi8KKwlDRkdfVFlQRV9JTlQgPQkJMSA8PCAzLAkvKiBzZXR0aW5nICovCisJQ0ZHX1RZUEVfRkxPQVQgPQkxIDw8IDQsCS8qIHNldHRpbmcgKi8KKwlDRkdfVFlQRV9TVFJJTkcgPQkxIDw8IDUsCS8qIHNldHRpbmcgKi8KK30gY2ZnX2RlZl90eXBlX3Q7CisKKy8qIGZ1bmN0aW9uIHR5cGVzIHRvIGV2YWx1YXRlIGRlZmF1bHQgdmFsdWUgYXQgcnVudGltZSAqLwordHlwZWRlZiBpbnQgKCp0X2ZuX0NGR19UWVBFX0JPT0wpIChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOwordHlwZWRlZiBpbnQgKCp0X2ZuX0NGR19UWVBFX0lOVCkgKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7Cit0eXBlZGVmIGZsb2F0ICgqdF9mbl9DRkdfVFlQRV9GTE9BVCkgKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7Cit0eXBlZGVmIGNvbnN0IGNoYXIqICgqdF9mbl9DRkdfVFlQRV9TVFJJTkcpIChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOwordHlwZWRlZiBjb25zdCBjaGFyKiAoKnRfZm5fQ0ZHX1RZUEVfQVJSQVkpIChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOwordHlwZWRlZiBjb25zdCBjaGFyKiAoKnRfZm5fVU5DT05GSUdVUkVEKSAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCisvKiBjb25maWd1cmF0aW9uIGRlZmluaXRpb24gaXRlbSB2YWx1ZSAoZm9yIGl0ZW0ncyBkZWZhdWx0IHZhbHVlKSAqLwordHlwZWRlZiB1bmlvbiB7CisJLyogc3RhdGljIHZhbHVlIC0gcmV0dXJucyBhIHZhcmlhYmxlICovCisJY29uc3QgaW50IHZfQ0ZHX1RZUEVfQk9PTCwgdl9DRkdfVFlQRV9JTlQ7CisJY29uc3QgZmxvYXQgdl9DRkdfVFlQRV9GTE9BVDsKKwljb25zdCBjaGFyICp2X0NGR19UWVBFX1NUUklORywgKnZfQ0ZHX1RZUEVfQVJSQVk7CisKKwkvKiBydW4tdGltZSB2YWx1ZSAtIGV2YWx1YXRlcyBhIGZ1bmN0aW9uICovCisJdF9mbl9DRkdfVFlQRV9CT09MIGZuX0NGR19UWVBFX0JPT0w7CisJdF9mbl9DRkdfVFlQRV9JTlQgZm5fQ0ZHX1RZUEVfSU5UOworCXRfZm5fQ0ZHX1RZUEVfRkxPQVQgZm5fQ0ZHX1RZUEVfRkxPQVQ7CisJdF9mbl9DRkdfVFlQRV9TVFJJTkcgZm5fQ0ZHX1RZUEVfU1RSSU5HOworCXRfZm5fQ0ZHX1RZUEVfQVJSQVkgZm5fQ0ZHX1RZUEVfQVJSQVk7Cit9IGNmZ19kZWZfdmFsdWVfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJY29uc3QgY2hhciAqdl9VTkNPTkZJR1VSRUQ7CisJdF9mbl9VTkNPTkZJR1VSRUQgZm5fVU5DT05GSUdVUkVEOworfSBjZmdfZGVmX3VuY29uZmlndXJlZF92YWx1ZV90OworCisvKiBjb25maWd1cmF0aW9uIGRlZmluaXRpb24gaXRlbSBmbGFnczogKi8KKworCisvKiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gbmFtZSBpcyB2YXJpYWJsZSAqLworI2RlZmluZSBDRkdfTkFNRV9WQVJJQUJMRQkweDAwMQorLyogd2hldGhlciBlbXB0eSB2YWx1ZSBpcyBhbGxvd2VkICovCisjZGVmaW5lIENGR19BTExPV19FTVBUWQkJMHgwMDIKKy8qIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyBmb3IgYWR2YW5jZWQgdXNlIG9ubHkgKi8KKyNkZWZpbmUgQ0ZHX0FEVkFOQ0VECQkweDAwNAorLyogd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZCAqLworI2RlZmluZSBDRkdfVU5TVVBQT1JURUQJCTB4MDA4CisvKiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGl0ZW0gaXMgY3VzdG9taXphYmxlIGJ5IGEgcHJvZmlsZSAqLworI2RlZmluZSBDRkdfUFJPRklMQUJMRQkJMHgwMTAKKy8qIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyBjdXN0b21pemFibGUgYnkgYSBwcm9maWxlICovCisvKiBhbmQgd2hldGhlciBpdCBjYW4gYmUgYXR0YWNoZWQgdG8gVkcvTFYgbWV0YWRhdGEgYXQgdGhlIHNhbWUgdGltZQorICogVGhlIENGR19QUk9GSUxBQkxFX01FVEFEQVRBIGZsYWcgaW5jb3Jwb3JhdGVzIENGR19QUk9GSUxBQkxFIGZsYWchISEgKi8KKyNkZWZpbmUgQ0ZHX1BST0ZJTEFCTEVfTUVUQURBVEEgMHgwMzAKKy8qIHdoZXRoZXIgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdW5kZWZuZWQgKi8KKyNkZWZpbmUgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVECTB4MDQwCisvKiB3aGV0aGVyIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGNvbW1lbnRlZCBvdXQgb24gb3V0cHV0ICovCisjZGVmaW5lIENGR19ERUZBVUxUX0NPTU1FTlRFRAkweDA4MAorLyogd2hldGhlciB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGR1cmluZyBydW4gdGltZSAqLworI2RlZmluZSBDRkdfREVGQVVMVF9SVU5fVElNRQkweDEwMAorLyogd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGRpc2FibGVkIChhbmQgaGVuY2UgZGVmYXVsdHMgYWx3YXlzIHVzZWQpICovCisjZGVmaW5lIENGR19ESVNBQkxFRAkJMHgyMDAKKy8qIHdoZXRoZXIgdG8gcHJpbnQgaW50ZWdlcnMgaW4gb2N0YWwgZm9ybSAocHJlZml4ZWQgYnkgIjAiKSAqLworI2RlZmluZSBDRkdfRk9STUFUX0lOVF9PQ1RBTAkweDQwMAorLyogd2hldGhlciB0byBkaXNhYmxlIGNoZWNrcyBmb3IgdGhlIHdob2xlIGNvbmZpZyBzZWN0aW9uIHN1YnRyZWUgKi8KKyNkZWZpbmUgQ0ZHX1NFQ1RJT05fTk9fQ0hFQ0sJMHg4MDAKKworLyogY29uZmlndXJhdGlvbiBkZWZpbml0aW9uIGl0ZW0gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBjZmdfZGVmX2l0ZW0geworCWludCBpZDsJCQkJCQkJCS8qIElEIG9mIHRoaXMgaXRlbSAqLworCWludCBwYXJlbnQ7CQkJCQkJCS8qIElEIG9mIHBhcmVudCBpdGVtICovCisJY29uc3QgY2hhciAqbmFtZTsJCQkJCQkvKiBuYW1lIG9mIHRoZSBpdGVtIGluIGNvbmZpZ3VyYXRpb24gdHJlZSAqLworCWludCB0eXBlOwkJCQkJCQkvKiBjb25maWd1cmF0aW9uIGl0ZW0gdHlwZSAoYml0cyBvZiBjZmdfZGVmX3R5cGVfdCkgKi8KKwljZmdfZGVmX3ZhbHVlX3QgZGVmYXVsdF92YWx1ZTsJCQkJCS8qIGRlZmF1bHQgdmFsdWUgKG9ubHkgZm9yIHNldHRpbmdzKSAqLworCXVpbnQxNl90IGZsYWdzOwkJCQkJCQkvKiBjb25maWd1cmF0aW9uIGl0ZW0gZGVmaW5pdGlvbiBmbGFncyAqLworCXVpbnQxNl90IHNpbmNlX3ZlcnNpb247CQkJCQkJLyogdmVyc2lvbiB0aGlzIGl0ZW0gYXBwZWFyZWQgaW4gKi8KKwljZmdfZGVmX3VuY29uZmlndXJlZF92YWx1ZV90IGRlZmF1bHRfdW5jb25maWd1cmVkX3ZhbHVlOwkvKiBkZWZhdWx0IHZhbHVlIGluIHRlcm1zIG9mIEBGT09ALCBwcmUtY29uZmlndXJlZCAob25seSBmb3Igc2V0dGluZ3MpICovCisJdWludDE2X3QgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uOwkJCQkvKiB2ZXJzaW9uIHNpbmNlIHRoaXMgaXRlbSBpcyBkZXByZWNhdGVkICovCisJY29uc3QgY2hhciAqZGVwcmVjYXRpb25fY29tbWVudDsJCQkJLyogY29tbWVudCBhYm91dCByZWFzb25zIGZvciBkZXByZWNhdGlvbiBhbmQgc2V0dGluZ3MgdGhhdCBzdXBlcnNlZGUgdGhpcyBvbmUgKi8KKwljb25zdCBjaGFyICpjb21tZW50OwkJCQkJCS8qIGNvbW1lbnQgKi8KK30gY2ZnX2RlZl9pdGVtX3Q7CisKKy8qIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbiB0cmVlIHR5cGVzICovCit0eXBlZGVmIGVudW0geworCUNGR19ERUZfVFJFRV9DVVJSRU5ULAkJLyogdHJlZSBvZiBub2RlcyB3aXRoIHZhbHVlcyBjdXJyZW50bHkgc2V0IGluIHRoZSBjb25maWcgKi8KKwlDRkdfREVGX1RSRUVfTUlTU0lORywJCS8qIHRyZWUgb2Ygbm9kZXMgbWlzc2luZyBpbiBjdXJyZW50IGNvbmZpZyB1c2luZyBkZWZhdWx0IHZhbHVlcyAqLworCUNGR19ERUZfVFJFRV9GVUxMLAkJLyogQ1VSUkVOVCArIE1JU1NJTkcsIHRoZSB0cmVlIGFjdHVhbGx5IHVzZWQgd2l0aGluIGV4ZWN1dGlvbiAqLworCUNGR19ERUZfVFJFRV9ERUZBVUxULAkJLyogdHJlZSBvZiBhbGwgcG9zc2libGUgY29uZmlnIG5vZGVzIHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKwlDRkdfREVGX1RSRUVfTkVXLAkJLyogdHJlZSBvZiBhbGwgbmV3IG5vZGVzIHRoYXQgYXBwZWFyZWQgaW4gZ2l2ZW4gdmVyc2lvbiAqLworCUNGR19ERUZfVFJFRV9ORVdfU0lOQ0UsCQkvKiB0cmVlIG9mIGFsbCBuZXcgbm9kZXMgdGhhdCBhcHBlYXJlZCBzaW5jZSBnaXZlbiB2ZXJzaW9uICovCisJQ0ZHX0RFRl9UUkVFX1BST0ZJTEFCTEUsCS8qIHRyZWUgb2YgYWxsIG5vZGVzIHRoYXQgYXJlIGN1c3RvbWl6YWJsZSBieSBwcm9maWxlcyAqLworCUNGR19ERUZfVFJFRV9QUk9GSUxBQkxFX0NNRCwJLyogdHJlZSBvZiBhbGwgbm9kZXMgdGhhdCBhcmUgY3VzdG9taXphYmxlIGJ5IGNvbW1hbmQgcHJvZmlsZXMgKHN1YnNldCBvZiBQUk9GSUxBQkxFKSAqLworCUNGR19ERUZfVFJFRV9QUk9GSUxBQkxFX01EQSwJLyogdHJlZSBvZiBhbGwgbm9kZXMgdGhhdCBhcmUgY3VzdG9taXphYmxlIGJ5IG1ldGFkYXRhIHByb2ZpbGVzIChzdWJzZXQgb2YgUFJPRklMQUJMRSkgKi8KKwlDRkdfREVGX1RSRUVfRElGRiwJCS8qIHRyZWUgb2YgYWxsIG5vZGVzIHRoYXQgZGlmZmVyIGZyb20gZGVmYXVsdHMgKi8KKwlDRkdfREVGX1RSRUVfTElTVCwJCS8qIGxpc3QgYWxsIG5vZGVzICovCit9IGNmZ19kZWZfdHJlZV90OworCisvKiBjb25maWd1cmF0aW9uIGRlZmluaXRpb24gdHJlZSBzcGVjaWZpY2F0aW9uICovCitzdHJ1Y3QgY29uZmlnX2RlZl90cmVlX3NwZWMgeworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOwkJLyogY29tbWFuZCBjb250ZXh0IChmb3IgcnVuLXRpbWUgZGVmYXVsdHMgKi8KKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmN1cnJlbnRfY2Z0OwkvKiBjdXJyZW50IGNvbmZpZyB0cmVlIHdoaWNoIGlzIGRlZmluZWQgZXhwbGljaXRseSAtIGRlZmF1bHRzIGFyZSBub3QgdXNlZCAqLworCWNmZ19kZWZfdHJlZV90IHR5cGU7CQkJLyogdHJlZSB0eXBlICovCisJdWludDE2X3QgdmVyc2lvbjsJCQkvKiB0cmVlIGF0IHRoaXMgTFZNMiB2ZXJzaW9uICovCisJdW5zaWduZWQgaWdub3JlYWR2YW5jZWQ6MTsJCS8qIGRvIG5vdCBpbmNsdWRlIGFkdmFuY2VkIGNvbmZpZ3MgKi8KKwl1bnNpZ25lZCBpZ25vcmV1bnN1cHBvcnRlZDoxOwkJLyogZG8gbm90IGluY2x1ZGUgdW5zdXBwb3J0ZWQgY29uZmlncyAqLworCXVuc2lnbmVkIGlnbm9yZWRlcHJlY2F0ZWQ6MTsJCS8qIGRvIG5vdCBpbmNsdWRlIGRlcHJlY2F0ZWQgY29uZmlncyAqLworCXVuc2lnbmVkIGlnbm9yZWxvY2FsOjE7CQkJLyogZG8gbm90IGluY2x1ZGUgdGhlIGxvY2FsIHNlY3Rpb24gKi8KKwl1bnNpZ25lZCB3aXRoc3VtbWFyeToxOwkJCS8qIGluY2x1ZGUgZmlyc3QgbGluZSBvZiBjb21tZW50cyAtIGEgc3VtbWFyeSAqLworCXVuc2lnbmVkIHdpdGhjb21tZW50czoxOwkJLyogaW5jbHVkZSBhbGwgY29tbWVudCBsaW5lcyAqLworCXVuc2lnbmVkIHdpdGh2ZXJzaW9uczoxOwkJLyogaW5jbHVkZSB2ZXJzaW9ucyAqLworCXVuc2lnbmVkIHdpdGhzcGFjZXM6MTsJCQkvKiBhZGQgbW9yZSBzcGFjZXMgaW4gb3V0cHV0IGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgKi8KKwl1bnNpZ25lZCB1bmNvbmZpZ3VyZWQ6MTsJCS8qIHVzZSB1bmNvbmZpZ3VyZWQgcGF0aCBzdHJpbmdzICovCisJdWludDhfdCAqY2hlY2tfc3RhdHVzOwkJCS8qIHN0YXR1cyBvZiBsYXN0IHRyZWUgY2hlY2sgKGN1cnJlbnRseSBuZWVkZWQgZm9yIENGR19ERUZfVFJFRV9NSVNTSU5HIG9ubHkpICovCit9OworCisKKy8qIGZsYWcgdG8gbWFyayB0aGUgaXRlbSBhcyB1c2VkIGluIGEgY29uZmlnIHRyZWUgaW5zdGFuY2UgZHVyaW5nIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX1VTRUQJCTB4MDEKKy8qIGZsYWcgdG8gbWFyayB0aGUgaXRlbSBhcyB2YWxpZCBpbiBhIGNvbmZpZyB0cmVlIGluc3RhbmNlIGR1cmluZyB2YWxpZGF0aW9uICovCisjZGVmaW5lIENGR19WQUxJRAkJMHgwMgorLyogZmxhZyB0byBtYXJrIHRoZSBpdGVtIGFzIGhhdmluZyB0aGUgdmFsdWUgZGlmZmVyZW50IGZyb20gZGVmYXVsdCBvbmUgKi8KKyNkZWZpbmUgQ0ZHX0RJRkYJCTB4MDQKKworLyoKKyAqIFJlZ2lzdGVyIElEIGZvciBlYWNoIHBvc3NpYmxlIGl0ZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gdHJlZS4KKyAqLworZW51bSB7CisjZGVmaW5lIGNmZ19zZWN0aW9uKGlkLCBuYW1lLCBwYXJlbnQsIGZsYWdzLCBzaW5jZV92ZXJzaW9uLCBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb24sIGRlcHJlY2F0aW9uX2NvbW1lbnQsIGNvbW1lbnQpIGlkLAorI2RlZmluZSBjZmcoaWQsIG5hbWUsIHBhcmVudCwgZmxhZ3MsIHR5cGUsIGRlZmF1bHRfdmFsdWUsIHNpbmNlX3ZlcnNpb24sIHVuY29uZmlndXJlZF92YWx1ZSwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50KSBpZCwKKyNkZWZpbmUgY2ZnX3J1bnRpbWUoaWQsIG5hbWUsIHBhcmVudCwgZmxhZ3MsIHR5cGUsIHNpbmNlX3ZlcnNpb24sIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudCkgaWQsCisjZGVmaW5lIGNmZ19hcnJheShpZCwgbmFtZSwgcGFyZW50LCBmbGFncywgdHlwZXMsIGRlZmF1bHRfdmFsdWUsIHNpbmNlX3ZlcnNpb24sIHVuY29uZmlndXJlZF92YWx1ZSwgZGVwcmVjYXRlZF9zaW5jZV92ZXJzaW9uLCBkZXByZWNhdGlvbl9jb21tZW50LCBjb21tZW50KSBpZCwKKyNkZWZpbmUgY2ZnX2FycmF5X3J1bnRpbWUoaWQsIG5hbWUsIHBhcmVudCwgZmxhZ3MsIHR5cGVzLCBzaW5jZV92ZXJzaW9uLCBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb24sIGRlcHJlY2F0aW9uX2NvbW1lbnQsIGNvbW1lbnQpIGlkLAorI2luY2x1ZGUgImNvbmZpZ19zZXR0aW5ncy5oIgorI3VuZGVmIGNmZ19zZWN0aW9uCisjdW5kZWYgY2ZnCisjdW5kZWYgY2ZnX3J1bnRpbWUKKyN1bmRlZiBjZmdfYXJyYXkKKyN1bmRlZiBjZmdfYXJyYXlfcnVudGltZQorfTsKKworc3RydWN0IHByb2ZpbGUgKmFkZF9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpwcm9maWxlX25hbWUsIGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UpOworaW50IGxvYWRfcHJvZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworaW50IGxvYWRfcGVuZGluZ19wcm9maWxlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKKy8qIGNvbmZpZ3VyYXRpb24gY2hlY2sgaGFuZGxlIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0aW9uIGNoZWNrICovCitzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSB7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CS8qIGNvbW1hbmQgY29udGV4dCAqLworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OwkvKiB0aGUgdHJlZSBmb3Igd2hpY2ggdGhlIGNoZWNrIGlzIGRvbmUgKi8KKwljb25maWdfc291cmNlX3Qgc291cmNlOwkJLyogY29uZmlndXJhdGlvbiBzb3VyY2UgKi8KKwl1bnNpZ25lZCBmb3JjZV9jaGVjazoxOwkJLyogZm9yY2UgY2hlY2sgZXZlbiBpZiBkaXNhYmxlZCBieSBjb25maWcvY2hlY2tzIHNldHRpbmcgKi8KKwl1bnNpZ25lZCBza2lwX2lmX2NoZWNrZWQ6MTsJLyogc2tpcCB0aGUgY2hlY2sgaWYgYWxyZWFkeSBkb25lIGJlZm9yZSAtIHJldHVybiBsYXN0IHN0YXRlICovCisJdW5zaWduZWQgc3VwcHJlc3NfbWVzc2FnZXM6MTsJLyogc3VwcHJlc3MgbWVzc2FnZXMgZHVyaW5nIHRoZSBjaGVjayBpZiBjb25maWcgaXRlbSBpcyBmb3VuZCBpbnZhbGlkICovCisJdW5zaWduZWQgY2hlY2tfZGlmZjoxOwkJLyogY2hlY2sgaWYgdGhlIHZhbHVlIHVzZWQgZGlmZmVycyBmcm9tIGRlZmF1bHQgb25lICovCisJdW5zaWduZWQgaWdub3JlYWR2YW5jZWQ6MTsJLyogZG8gbm90IGluY2x1ZGUgYWR2bmNlZCBjb25maWdzICovCisJdW5zaWduZWQgaWdub3JldW5zdXBwb3J0ZWQ6MTsJLyogZG8gbm90IGluY2x1ZGUgdW5zdXBwb3J0ZWQgY29uZmlncyAqLworCXVpbnQ4X3Qgc3RhdHVzW0NGR19DT1VOVF07CS8qIGZsYWdzIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24gaXRlbSAtIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrICovCit9OworCitpbnQgY29uZmlnX2RlZl9nZXRfcGF0aChjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwgaW50IGlkKTsKK2ludCBjb25maWdfZGVmX2NoZWNrKHN0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpoYW5kbGUpOworCitpbnQgb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9zdHJpbmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmNvbmZpZ19zZXR0aW5ncyk7CitpbnQgb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9wcm9maWxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7CitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmdldF9jb25maWdfdHJlZV9ieV9zb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICosIGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UpOworc3RydWN0IGRtX2NvbmZpZ190cmVlICpyZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25maWdfc291cmNlX3Qgc291cmNlKTsKK3N0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpnZXRfY29uZmlnX3RyZWVfY2hlY2tfaGFuZGxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7Citjb25maWdfc291cmNlX3QgY29uZmlnX2dldF9zb3VyY2VfdHlwZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CisKK3R5cGVkZWYgdWludDMyX3QgKCpjaGVja3N1bV9mbl90KSAodWludDMyX3QgaW5pdGlhbCwgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworc3RydWN0IGRtX2NvbmZpZ190cmVlICpjb25maWdfb3Blbihjb25maWdfc291cmNlX3Qgc291cmNlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGtlZXBfb3Blbik7CitpbnQgY29uZmlnX2ZpbGVfcmVhZF9mZChzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2Zmc2V0Miwgc2l6ZV90IHNpemUyLAorCQkJY2hlY2tzdW1fZm5fdCBjaGVja3N1bV9mbiwgdWludDMyX3QgY2hlY2tzdW0sCisJCQlpbnQgc2tpcF9wYXJzZSk7CitpbnQgY29uZmlnX2ZpbGVfcmVhZChzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNvbmZpZ19maWxlX29wZW5fYW5kX3JlYWQoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIGNvbmZpZ19zb3VyY2VfdCBzb3VyY2UsCisJCQkJCQkgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworaW50IGNvbmZpZ193cml0ZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgc3RydWN0IGNvbmZpZ19kZWZfdHJlZV9zcGVjICp0cmVlX3NwZWMsCisJCSBjb25zdCBjaGFyICpmaWxlLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworc3RydWN0IGRtX2NvbmZpZ190cmVlICpjb25maWdfZGVmX2NyZWF0ZV90cmVlKHN0cnVjdCBjb25maWdfZGVmX3RyZWVfc3BlYyAqc3BlYyk7Cit2b2lkIGNvbmZpZ19kZXN0cm95KHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KTsKKworc3RydWN0IHRpbWVzcGVjIGNvbmZpZ19maWxlX3RpbWVzdGFtcChzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CitpbnQgY29uZmlnX2ZpbGVfY2hhbmdlZChzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CitpbnQgY29uZmlnX2ZpbGVfY2hlY2soc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIGNvbnN0IGNoYXIgKipmaWxlbmFtZSwgc3RydWN0IHN0YXQgKmluZm8pOworCisKK3R5cGVkZWYgZW51bSB7CisJQ09ORklHX01FUkdFX1RZUEVfUkFXLAkvKiBhbHdheXMgcmVwbGFjZSBvbGQgY29uZmlnIHZhbHVlcyB3aXRoIG5ldyBjb25maWcgdmFsdWVzIHdoZW4gbWVyZ2luZyAqLworCUNPTkZJR19NRVJHRV9UWVBFX1RBR1MJLyogYXBwbHkgc29tZSBleGNlcHRpb25zIHdoZW4gbWVyZ2luZyB0YWcgY29uZmlnczoKKwkJCQkgICAgIC0gc2tpcCB0YWdzIHNlY3Rpb24KKwkJCQkgICAgIC0gZG8gbm90IHJlcGxhY2UsIGJ1dCBtZXJnZSB2YWx1ZXMgb2YgdGhlc2Ugc2V0dGluZ3M6CisJCQkJCWFjdGl2YXRpb24vdm9sdW1lX2xpc3QKKwkJCQkJZGV2aWNlcy9maWx0ZXIKKwkJCQkJZGV2aWNlcy90eXBlcworCQkJCSAqLworfSBjb25maWdfbWVyZ2VfdDsKKworaW50IG1lcmdlX2NvbmZpZ190cmVlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJICAgICAgc3RydWN0IGRtX2NvbmZpZ190cmVlICpuZXdkYXRhLCBjb25maWdfbWVyZ2VfdCk7CisKKy8qCisgKiBUaGUgbmV4dCB0d28gZG8gbm90IGNoZWNrIGNvbmZpZyBvdmVycmlkZXMgYW5kIG11c3Qgb25seSBiZSB1c2VkIGZvciB0aGUgdGFncyBzZWN0aW9uLgorICovCitjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmZpbmRfY29uZmlnX25vZGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBpbnQgaWQpOworaW50IGZpbmRfY29uZmlnX2Jvb2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBpbnQgaWQpOworCisvKgorICogVGhlc2UgdmVyc2lvbnMgY2hlY2sgYW4gb3ZlcnJpZGUgdHJlZSwgaWYgcHJlc2VudCwgZmlyc3QuCisgKi8KK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZmluZF9jb25maWdfdHJlZV9ub2RlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKTsKK2NvbnN0IGNoYXIgKmZpbmRfY29uZmlnX3RyZWVfc3RyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKTsKK2NvbnN0IGNoYXIgKmZpbmRfY29uZmlnX3RyZWVfc3RyX2FsbG93X2VtcHR5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKTsKK2ludCBmaW5kX2NvbmZpZ190cmVlX2ludChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7CitpbnQ2NF90IGZpbmRfY29uZmlnX3RyZWVfaW50NjQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBpZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworZmxvYXQgZmluZF9jb25maWdfdHJlZV9mbG9hdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7CitpbnQgZmluZF9jb25maWdfdHJlZV9ib29sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaWQsIHN0cnVjdCBwcm9maWxlICpwcm9maWxlKTsKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZmluZF9jb25maWdfdHJlZV9hcnJheShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGlkLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7CisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHdoaWNoIHRoZSBkZWZhdWx0CisgKiB2YWx1ZSBpcyBldmFsdWF0ZWQgYXQgcnVudGltZSBiYXNlZCBvbiBjb21tYW5kIGNvbnRleHQuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X2RldmljZXNfY2FjaGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2RldmljZXNfY2FjaGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF9kZXZpY2VzX2NhY2hlX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2RldmljZXNfY2FjaGVfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X2JhY2t1cF9iYWNrdXBfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworY29uc3QgY2hhciAqZ2V0X2RlZmF1bHRfdW5jb25maWd1cmVkX2JhY2t1cF9iYWNrdXBfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF9iYWNrdXBfYXJjaGl2ZV9kaXJfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfYmFja3VwX2FyY2hpdmVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF9jb25maWdfcHJvZmlsZV9kaXJfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfY29uZmlnX3Byb2ZpbGVfZGlyX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Citjb25zdCBjaGFyICpnZXRfZGVmYXVsdF9hY3RpdmF0aW9uX21pcnJvcl9pbWFnZV9mYXVsdF9wb2xpY3lfQ0ZHKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSk7CisjZGVmaW5lIGdldF9kZWZhdWx0X3VuY29uZmlndXJlZF9hY3RpdmF0aW9uX21pcnJvcl9pbWFnZV9mYXVsdF9wb2xpY3lfQ0ZHIE5VTEwKK2ludCBnZXRfZGVmYXVsdF9hbGxvY2F0aW9uX3RoaW5fcG9vbF9jaHVua19zaXplX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworI2RlZmluZSBnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfYWxsb2NhdGlvbl90aGluX3Bvb2xfY2h1bmtfc2l6ZV9DRkcgTlVMTAoraW50IGdldF9kZWZhdWx0X2FsbG9jYXRpb25fY2FjaGVfcG9vbF9jaHVua19zaXplX0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworI2RlZmluZSBnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NodW5rX3NpemVfQ0ZHIE5VTEwKK2NvbnN0IGNoYXIgKmdldF9kZWZhdWx0X2FsbG9jYXRpb25fY2FjaGVfcG9saWN5X0NGRyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGUpOworI2RlZmluZSBnZXRfZGVmYXVsdF91bmNvbmZpZ3VyZWRfYWxsb2NhdGlvbl9jYWNoZV9wb2xpY3lfQ0ZHIE5VTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY29uZmlnL2NvbmZpZ19zZXR0aW5ncy5oIGIvbGliL2NvbmZpZy9jb25maWdfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ2NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvbmZpZy9jb25maWdfc2V0dGluZ3MuaApAQCAtMCwwICsxLDE5MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisqLworCisvKgorICogTUFDUk9TOgorICogLSBkZWZpbmUgYSBjb25maWd1cmF0aW9uIHNlY3Rpb246CisgKiAgIGNmZ19zZWN0aW9uKGlkLCBuYW1lLCBwYXJlbnQsIGZsYWdzLCBzaW5jZV92ZXJzaW9uLCBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb24sIGRlcHJlY2F0aW9uX2NvbW1lbnQsIGNvbW1lbnQpCisgKgorICogLSBkZWZpbmUgYSBjb25maWd1cmF0aW9uIHNldHRpbmcgb2Ygc2ltcGxlIHR5cGU6CisgKiAgIGNmZyhpZCwgbmFtZSwgcGFyZW50LCBmbGFncywgdHlwZSwgZGVmYXVsdF92YWx1ZSwgc2luY2VfdmVyc2lvbiwgdW5jb25maWd1cmVkX2RlZmF1bHRfdmFsdWUsIGRlcHJlY2F0ZWRfc2luY2VfdmVyc2lvbiwgZGVwcmVjYXRpb25fY29tbWVudCwgY29tbWVudCkKKyAqCisgKiAtIGRlZmluZSBhIGNvbmZpZ3VyYXRpb24gYXJyYXkgb2Ygb25lIG9yIG1vcmUgdHlwZXM6CisgKiAgIGNmZ19hcnJheShpZCwgbmFtZSwgcGFyZW50LCBmbGFncywgdHlwZXMsIGRlZmF1bHRfdmFsdWUsIHNpbmNlX3ZlcnNpb24sIHVuY29uZmlndXJlZF9kZWZhdWx0X3ZhbHVlLCBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb24sIGRlcHJlY2F0aW9uX2NvbW1lbnQsIGNvbW1lbnQpCisgKgorICoKKyAqIElmIGRlZmF1bHQgdmFsdWUgY2FuJ3QgYmUgYXNzaWduZWQgc3RhdGljYWxseSBiZWNhdXNlIGl0IGRlcGVuZHMgb24gc29tZQorICogcnVuLXRpbWUgY2hlY2tzIG9yIGlmIGl0IGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MgYWxyZWFkeSBkZWZpbmVkLAorICogdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZyAgb3IgYXJyYXkgY2FuIGJlIGRlZmluZWQgd2l0aCB0aGUKKyAqICJ7Y2ZnfGNmZ19hcnJheX1fcnVudGltZSIgbWFjcm8uIEluIHRoaXMgY2FzZSB0aGUgIGRlZmF1bHQgdmFsdWUKKyAqIGlzIGV2YWx1YXRlZCBieSBhdXRvbWF0aWNhbGx5IGNhbGxpbmcgImdldF9kZWZhdWx0XzxpZD4iIGZ1bmN0aW9uLgorICogU2VlIGNvbmZpZy5oIGFuZCAiZnVuY3Rpb24gdHlwZXMgdG8gZXZhbHVhdGUgZGVmYXVsdCB2YWx1ZSBhdCBydW50aW1lIi4KKyAqCisgKgorICogVkFSSUFCTEVTOgorICogCisgKiBpZDogICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlIGlkZW50aWZpZXIuCisgKgorICogbmFtZTogICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gbm9kZSBuYW1lLgorICoKKyAqIHBhcmVudDogICAgICAgICAgICAgICAgICAgICBJZCBvZiBwYXJlbnQgY29uZmlndXJhdGlvbiBub2RlLgorICoKKyAqIGZsYWdzOiAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGl0ZW0gZmxhZ3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR19OQU1FX1ZBUklBQkxFIC0gY29uZmlndXJhdGlvbiBub2RlIG5hbWUgaXMgdmFyaWFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FMTE9XX0VNUFRZIC0gbm9kZSB2YWx1ZSBjYW4gYmUgZW10cHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0FEVkFOQ0VEIC0gdGhpcyBub2RlIGJlbG9uZ3MgdG8gYWR2YW5jZWQgY29uZmlnIHNldAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdfVU5TVVBQT1JURUQgLSB0aGlzIG5vZGUgaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIGFuZCBpdCdzIHVzZWQgcHJpbWFyaWx5IGJ5IGRldmVsb3BlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1BST0ZJTEFCTEUgLSB0aGlzIG5vZGUgaXMgY3VzdG9taXphYmxlIGJ5IGEgcHJvZmlsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdfUFJPRklMQUJMRV9NRVRBREFUQSAtIHByb2ZpbGFibGUgYW5kIGF0dGFjaGFibGUgdG8gVkcvTFYgbWV0YWRhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVEIC0gbm9kZSdzIGRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIChkZXBlbmRzIG9uIG90aGVyIHN5c3RlbS9rZXJuZWwgdmFsdWVzIG91dHNpZGUgb2YgbHZtKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdfREVGQVVMVF9DT01NRU5URUQgLSBub2RlJ3MgZGVmYXVsdCB2YWx1ZSBpcyBjb21tZW50ZWQgb3V0IG9uIG91dHB1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdfRElTQUJMRUQgLSBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkIChkZWZhdWx0cyBhbHdheXMgdXNlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX0ZPUk1BVF9JTlRfT0NUQUwgLSBwcmludCBpbnRlZ2VyIG51bWJlciBpbiBvY3RhbCBmb3JtIChhbHNvIHByZWZpeGVkIGJ5ICIwIikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1NFQ1RJT05fTk9fQ0hFQ0sgLSBkbyBub3QgY2hlY2sgY29udGVudCBvZiB0aGUgc2VjdGlvbiBhdCBhbGwgLSB1c2Ugd2l0aCBjYXJlISEhCisgKgorICogdHlwZToJCSAgICAgICBBbGxvd2VkIHR5cGUgZm9yIHRoZSB2YWx1ZSBvZiBzaW1wbGUgY29uZmlndWF0aW9uIHNldHRpbmcsIG9uZSBvZjoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1RZUEVfQk9PTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdfVFlQRV9JTlQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1RZUEVfRkxPQVQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHX1RZUEVfU1RSSU5HCisgKgorICogdHlwZXM6ICAgICAgICAgICAgICAgICAgICAgIEFsbG93ZWQgdHlwZXMgZm9yIHRoZSB2YWx1ZXMgb2YgYXJyYXkgY29uZmlndXJhdGlvbiBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZSBsb2dpY2FsICJPUiIgdG8gZGVmaW5lIG1vcmUgdGhhbiBvbmUgYWxsb3dlZCB0eXBlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gQ0ZHX1RZUEVfU1RSSU5HIHwgQ0ZHX1RZUEVfSU5UKS4KKyAqCisgKiBkZWZhdWx0X3ZhbHVlOiAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBvZiB0eXBlICd0eXBlJyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gbm9kZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIGFuIGFycmF5IHdpdGggc2V2ZXJhbCAndHlwZXMnIGRlZmluZWQgdGhlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgYSBzdHJpbmcgd2hlcmUgZWFjaCBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIHZhbHVlIGlzIHByZWZpeGVkIGJ5ICcjWCcgd2hlcmUgWCBpcyBvbmUgb2Y6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJyBmb3IgYm9vbGVhbiB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScgZm9yIGludGVnZXIgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnIGZvciBmbG9hdCB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycgZm9yIHN0cmluZyB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycgZm9yIHRoZSAnIycgY2hhcmFjdGVyIGl0c2VsZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCAiI1NmZCNJMTYiIG1lYW5zIGRlZmF1bHQgdmFsdWUgWyAiZmQiLCAxNiBdLgorICoKKyAqIHNpbmNlX3ZlcnNpb246ICAgICAgICAgICAgICBUaGUgdmVyc2lvbiB0aGlzIGNvbmZpZ3VyYXRpb24gbm9kZSBmaXJzdCBhcHBlYXJlZCBpbiAoYmUgc3VyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcGFyZW50IG5vZGVzIGFyZSBjb25zaXN0ZW50IHdpdGggdmVyc2lvbmluZywgbm8gY2hlY2sgZG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBub2RlIGlzIG9sZGVyIG9yIHRoZSBzYW1lIGFnZSBhcyBhbnkgY2hpbGQgbm9kZSEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICJ2c24iIG1hY3JvIHRvIHRyYW5zbGF0ZSB0aGUgIm1ham9yLm1pbm9yLnJlbGVhc2UiIHZlcnNpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGEgc2luZ2xlIG51bWJlciB0aGF0IGlzIGJlaW5nIHN0b3JlZCBpbnRlcm5hbGx5IGluIG1lbW9yeS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGFsc28gbHZtY29uZmlnIC4uLiAtLXdpdGh2ZXJzaW9ucykKKyAqCisgKiB1bmNvbmZpZ3VyZWRfZGVmYXVsdF92YWx1ZTogVW5jb25maWd1cmVkIGRlZmF1bHQgdmFsdWUgdXNlZCBhcyBhIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiAiQC4uLkAiIGZvcm0gYW5kIHdoaWNoIGlzIHRoZW4gc3Vic3RpdHV0ZWQgd2l0aCBjb25jcmV0ZSB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHJ1bm5pbmcgY29uZmlndXJlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgYWxzbyAnbHZtY29uZmlnIC0tdHlwZSBkZWZhdWx0IC0tdW5jb25maWd1cmVkJykKKyAqCisgKiBkZXByZWNhdGVkX3NpbmNlX3ZlcnNpb246ICAgVGhlIHZlcnNpb24gc2luY2UgdGhpcyBjb25maWd1cmF0aW9uIG5vZGUgaXMgZGVwcmVjYXRlZC4KKyAqCisgKiBkZXByZWNhdGlvbl9jb21tZW50OiAgICAgICAgQ29tbWVudCBhYm91dCBkZXByZWNhdGlvbiByZWFzb24gYW5kIHJlbGF0ZWQgaW5mbyAoZS5nLiB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBub3cgaW5zdGVhZCkuCisgKgorICogY29tbWVudDogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgdXNlZCBpbiBjb25maWd1cmF0aW9uIGR1bXBzLiBUaGUgdmVyeSBmaXJzdCBsaW5lIGlzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6aW5nIGNvbW1lbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBhbHNvIGx2bWNvbmZpZyAuLi4gLS13aXRoY29tbWVudHMgYW5kIC0td2l0aHN1bW1hcnkpCisgKgorICoKKyAqIERpZmZlcmVuY2UgYmV0d2VlbiBDRkdfREVGQVVMVF9DT01NRU5URUQgYW5kIENGR19ERUZBVUxUX1VOREVGSU5FRDoKKyAqCisgKiBVTkRFRklORUQgaXMgdXNlZCBpZiBkZWZhdWx0IHZhbHVlIGlzIE5VTEwgb3IgdGhlIHZhbHVlCisgKiBkZXBlbmRzIG9uIG90aGVyIHN5c3RlbS9rZXJuZWwgdmFsdWVzIG91dHNpZGUgb2YgbHZtLgorICogVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgd2hlbiBkbS10aGluIG9yIGRtLWNhY2hlIGhhdmUKKyAqIGJ1aWx0LWluIGRlZmF1bHQgc2V0dGluZ3MgaW4gdGhlIGtlcm5lbCwgYW5kIGx2bSB3aWxsIHVzZQorICogdGhvc2UgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZXMgdW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nIGx2bQorICogY29uZmlnIHNldHRpbmcgaXMgc2V0LgorICoKKyAqIENPTU1FTlRFRCBpcyB1c2VkIHRvIGNvbW1lbnQgb3V0IHRoZSBkZWZhdWx0IHNldHRpbmcgaW4KKyAqIGx2bS5jb25mLiAgVGhlIGVmZmVjdCBpcyB0aGF0IGlmIHRoZSBMVk0gdmVyc2lvbiBpcworICogdXBncmFkZWQsIGFuZCB0aGUgbmV3IHZlcnNpb24gb2YgTFZNIGhhcyBuZXcgYnVpbHQtaW4KKyAqIGRlZmF1bHQgdmFsdWVzLCB0aGUgbmV3IGRlZmF1bHRzIGFyZSB1c2VkIGJ5IExWTSB1bmxlc3MKKyAqIHRoZSBwcmV2aW91cyBkZWZhdWx0IHZhbHVlIHdhcyBzZXQgKHVuY29tbWVudGVkKSBpbiBsdm0uY29uZi4KKyAqLworI2luY2x1ZGUgImRlZmF1bHRzLmgiCisKK2NmZ19zZWN0aW9uKHJvb3RfQ0ZHX1NFQ1RJT04sICIocm9vdCkiLCByb290X0NGR19TRUNUSU9OLCAwLCB2c24oMCwgMCwgMCksIDAsIE5VTEwsIE5VTEwpCisKK2NmZ19zZWN0aW9uKGNvbmZpZ19DRkdfU0VDVElPTiwgImNvbmZpZyIsIHJvb3RfQ0ZHX1NFQ1RJT04sIDAsIHZzbigyLCAyLCA5OSksIDAsIE5VTEwsCisJIkhvdyBMVk0gY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcmUgaGFuZGxlZC5cbiIpCisKK2NmZ19zZWN0aW9uKGRldmljZXNfQ0ZHX1NFQ1RJT04sICJkZXZpY2VzIiwgcm9vdF9DRkdfU0VDVElPTiwgMCwgdnNuKDEsIDAsIDApLCAwLCBOVUxMLAorCSJIb3cgTFZNIHVzZXMgYmxvY2sgZGV2aWNlcy5cbiIpCisKK2NmZ19zZWN0aW9uKGFsbG9jYXRpb25fQ0ZHX1NFQ1RJT04sICJhbGxvY2F0aW9uIiwgcm9vdF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUsIHZzbigyLCAyLCA3NyksIDAsIE5VTEwsCisJIkhvdyBMVk0gc2VsZWN0cyBzcGFjZSBhbmQgYXBwbGllcyBwcm9wZXJ0aWVzIHRvIExWcy5cbiIpCisKK2NmZ19zZWN0aW9uKGxvZ19DRkdfU0VDVElPTiwgImxvZyIsIHJvb3RfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFLCB2c24oMSwgMCwgMCksIDAsIE5VTEwsCisJIkhvdyBMVk0gbG9nIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkLlxuIikKKworY2ZnX3NlY3Rpb24oYmFja3VwX0NGR19TRUNUSU9OLCAiYmFja3VwIiwgcm9vdF9DRkdfU0VDVElPTiwgMCwgdnNuKDEsIDAsIDApLCAwLCBOVUxMLAorCSJIb3cgTFZNIG1ldGFkYXRhIGlzIGJhY2tlZCB1cCBhbmQgYXJjaGl2ZWQuXG4iCisJIkluIExWTSwgYSAnYmFja3VwJyBpcyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhIGZvciB0aGUgY3VycmVudCBzeXN0ZW0sXG4iCisJImFuZCBhbiAnYXJjaGl2ZScgY29udGFpbnMgb2xkIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb25zLiBUaGV5IGFyZVxuIgorCSJzdG9yZWQgaW4gYSBodW1hbiByZWFkYWJsZSB0ZXh0IGZvcm1hdC5cbiIpCisKK2NmZ19zZWN0aW9uKHNoZWxsX0NGR19TRUNUSU9OLCAic2hlbGwiLCByb290X0NGR19TRUNUSU9OLCAwLCB2c24oMSwgMCwgMCksIDAsIE5VTEwsCisJIlNldHRpbmdzIGZvciBydW5uaW5nIExWTSBpbiBzaGVsbCAocmVhZGxpbmUpIG1vZGUuXG4iKQorCitjZmdfc2VjdGlvbihnbG9iYWxfQ0ZHX1NFQ1RJT04sICJnbG9iYWwiLCByb290X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSwgdnNuKDEsIDAsIDApLCAwLCBOVUxMLAorCSJNaXNjZWxsYW5lb3VzIGdsb2JhbCBMVk0gc2V0dGluZ3MuXG4iKQorCitjZmdfc2VjdGlvbihhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAiYWN0aXZhdGlvbiIsIHJvb3RfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFLCB2c24oMSwgMCwgMCksIDAsIE5VTEwsIE5VTEwpCisKK2NmZ19zZWN0aW9uKG1ldGFkYXRhX0NGR19TRUNUSU9OLCAibWV0YWRhdGEiLCByb290X0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIHZzbigxLCAwLCAwKSwgMCwgTlVMTCwgTlVMTCkKKworY2ZnX3NlY3Rpb24ocmVwb3J0X0NGR19TRUNUSU9OLCAicmVwb3J0Iiwgcm9vdF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIHZzbigxLCAwLCAwKSwgMCwgTlVMTCwKKwkiTFZNIHJlcG9ydCBjb21tYW5kIG91dHB1dCBmb3JtYXR0aW5nLlxuIikKKworY2ZnX3NlY3Rpb24oZG1ldmVudGRfQ0ZHX1NFQ1RJT04sICJkbWV2ZW50ZCIsIHJvb3RfQ0ZHX1NFQ1RJT04sIDAsIHZzbigxLCAyLCAzKSwgMCwgTlVMTCwKKwkiU2V0dGluZ3MgZm9yIHRoZSBMVk0gZXZlbnQgZGFlbW9uLlxuIikKKworY2ZnX3NlY3Rpb24odGFnc19DRkdfU0VDVElPTiwgInRhZ3MiLCByb290X0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIHZzbigxLCAwLCAxOCksIDAsIE5VTEwsCisJIkhvc3QgdGFnIHNldHRpbmdzLlxuIikKKworY2ZnX3NlY3Rpb24obG9jYWxfQ0ZHX1NFQ1RJT04sICJsb2NhbCIsIHJvb3RfQ0ZHX1NFQ1RJT04sIDAsIHZzbigyLCAyLCAxMTcpLCAwLCBOVUxMLAorCSJMVk0gc2V0dGluZ3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsIGhvc3QuXG4iKQorCitjZmcoY29uZmlnX2NoZWNrc19DRkcsICJjaGVja3MiLCBjb25maWdfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIDEsIHZzbigyLCAyLCA5OSksIE5VTEwsIDAsIE5VTEwsCisJIklmIGVuYWJsZWQsIGFueSBMVk0gY29uZmlndXJhdGlvbiBtaXNtYXRjaCBpcyByZXBvcnRlZC5cbiIKKwkiVGhpcyBpbXBsaWVzIGNoZWNraW5nIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24ga2V5IGlzIHVuZGVyc3Rvb2QgYnlcbiIKKwkiTFZNIGFuZCB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUga2V5IGlzIHRoZSBwcm9wZXIgdHlwZS4gSWYgZGlzYWJsZWQsXG4iCisJImFueSBjb25maWd1cmF0aW9uIG1pc21hdGNoIGlzIGlnbm9yZWQgYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHVzZWRcbiIKKwkid2l0aG91dCBhbnkgd2FybmluZyAoYSBtZXNzYWdlIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIGtleSBub3QgYmVpbmdcbiIKKwkiZm91bmQgaXMgaXNzdWVkIGluIHZlcmJvc2UgbW9kZSBvbmx5KS5cbiIpCisKK2NmZyhjb25maWdfYWJvcnRfb25fZXJyb3JzX0NGRywgImFib3J0X29uX2Vycm9ycyIsIGNvbmZpZ19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgMCwgdnNuKDIsMiw5OSksIE5VTEwsIDAsIE5VTEwsCisJIkFib3J0IHRoZSBMVk0gcHJvY2VzcyBpZiBhIGNvbmZpZ3VyYXRpb24gbWlzbWF0Y2ggaXMgZm91bmQuXG4iKQorCitjZmdfcnVudGltZShjb25maWdfcHJvZmlsZV9kaXJfQ0ZHLCAicHJvZmlsZV9kaXIiLCBjb25maWdfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgdnNuKDIsIDIsIDk5KSwgMCwgTlVMTCwKKwkiRGlyZWN0b3J5IHdoZXJlIExWTSBsb29rcyBmb3IgY29uZmlndXJhdGlvbiBwcm9maWxlcy5cbiIpCisKK2NmZyhkZXZpY2VzX2Rpcl9DRkcsICJkaXIiLCBkZXZpY2VzX0NGR19TRUNUSU9OLCBDRkdfQURWQU5DRUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9ERVZfRElSLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkRpcmVjdG9yeSBpbiB3aGljaCB0byBjcmVhdGUgdm9sdW1lIGdyb3VwIGRldmljZSBub2Rlcy5cbiIKKwkiQ29tbWFuZHMgYWxzbyBhY2NlcHQgdGhpcyBhcyBhIHByZWZpeCBvbiB2b2x1bWUgZ3JvdXAgbmFtZXMuXG4iKQorCitjZmdfYXJyYXkoZGV2aWNlc19zY2FuX0NGRywgInNjYW4iLCBkZXZpY2VzX0NGR19TRUNUSU9OLCBDRkdfQURWQU5DRUQsIENGR19UWVBFX1NUUklORywgIiNTL2RldiIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiRGlyZWN0b3JpZXMgY29udGFpbmluZyBkZXZpY2Ugbm9kZXMgdG8gdXNlIHdpdGggTFZNLlxuIikKKworY2ZnX2FycmF5KGRldmljZXNfbG9vcGZpbGVzX0NGRywgImxvb3BmaWxlcyIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX1VOREVGSU5FRCB8IENGR19VTlNVUFBPUlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMSwgMiwgMCksIE5VTEwsIDAsIE5VTEwsIE5VTEwpCisKK2NmZyhkZXZpY2VzX29idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXZfQ0ZHLCAib2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldiIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfT0JUQUlOX0RFVklDRV9MSVNUX0ZST01fVURFViwgdnNuKDIsIDIsIDg1KSwgTlVMTCwgMCwgTlVMTCwKKwkiT2J0YWluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzIGZyb20gdWRldi5cbiIKKwkiVGhpcyBhdm9pZHMgb3BlbmluZyBvciB1c2luZyBhbnkgaW5hcHBsaWNhYmxlIG5vbi1ibG9jayBkZXZpY2VzIG9yXG4iCisJInN1YmRpcmVjdG9yaWVzIGZvdW5kIGluIHRoZSB1ZGV2IGRpcmVjdG9yeS4gQW55IGRldmljZSBub2RlIG9yXG4iCisJInN5bWxpbmsgbm90IG1hbmFnZWQgYnkgdWRldiBpbiB0aGUgdWRldiBkaXJlY3RvcnkgaXMgaWdub3JlZC4gVGhpc1xuIgorCSJzZXR0aW5nIGFwcGxpZXMgb25seSB0byB0aGUgdWRldi1tYW5hZ2VkIGRldmljZSBkaXJlY3Rvcnk7IG90aGVyXG4iCisJImRpcmVjdG9yaWVzIHdpbGwgYmUgc2Nhbm5lZCBmdWxseS4gTFZNIG5lZWRzIHRvIGJlIGNvbXBpbGVkIHdpdGhcbiIKKwkidWRldiBzdXBwb3J0IGZvciB0aGlzIHNldHRpbmcgdG8gYXBwbHkuXG4iKQorCitjZmcoZGV2aWNlc19leHRlcm5hbF9kZXZpY2VfaW5mb19zb3VyY2VfQ0ZHLCAiZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0VYVEVSTkFMX0RFVklDRV9JTkZPX1NPVVJDRSwgdnNuKDIsIDIsIDExNiksIE5VTEwsIDAsIE5VTEwsCisJIlNlbGVjdCBhbiBleHRlcm5hbCBkZXZpY2UgaW5mb3JtYXRpb24gc291cmNlLlxuIgorCSJTb21lIGluZm9ybWF0aW9uIG1heSBhbHJlYWR5IGJlIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtIGFuZCBMVk0gY2FuXG4iCisJInVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgZXhhY3QgdHlwZSBvciB1c2Ugb2YgZGV2aWNlcyBpdFxuIgorCSJwcm9jZXNzZXMuIFVzaW5nIGFuIGV4aXN0aW5nIGV4dGVybmFsIGRldmljZSBpbmZvcm1hdGlvbiBzb3VyY2UgY2FuXG4iCisJInNwZWVkIHVwIGRldmljZSBwcm9jZXNzaW5nIGFzIExWTSBkb2VzIG5vdCBuZWVkIHRvIHJ1biBpdHMgb3duIG5hdGl2ZVxuIgorCSJyb3V0aW5lcyB0byBhY3F1aXJlIHRoaXMgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0aGlzIGluZm9ybWF0aW9uXG4iCisJImlzIHVzZWQgdG8gZHJpdmUgTFZNIGZpbHRlcmluZyBsaWtlIE1EIGNvbXBvbmVudCBkZXRlY3Rpb24sIG11bHRpcGF0aFxuIgorCSJjb21wb25lbnQgZGV0ZWN0aW9uLCBwYXJ0aXRpb24gZGV0ZWN0aW9uIGFuZCBvdGhlcnMuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIG5vbmVcbiIKKwkiICAgIE5vIGV4dGVybmFsIGRldmljZSBpbmZvcm1hdGlvbiBzb3VyY2UgaXMgdXNlZC5cbiIKKwkiICB1ZGV2XG4iCisJIiAgICBSZXVzZSBleGlzdGluZyB1ZGV2IGRhdGFiYXNlIHJlY29yZHMuIEFwcGxpY2FibGUgb25seSBpZiBMVk0gaXNcbiIKKwkiICAgIGNvbXBpbGVkIHdpdGggdWRldiBzdXBwb3J0LlxuIgorCSIjXG4iKQorCitjZmdfYXJyYXkoZGV2aWNlc19wcmVmZXJyZWRfbmFtZXNfQ0ZHLCAicHJlZmVycmVkX25hbWVzIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVEICwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMSwgMiwgMTkpLCBOVUxMLCAwLCBOVUxMLAorCSJTZWxlY3Qgd2hpY2ggcGF0aCBuYW1lIHRvIGRpc3BsYXkgZm9yIGEgYmxvY2sgZGV2aWNlLlxuIgorCSJJZiBtdWx0aXBsZSBwYXRoIG5hbWVzIGV4aXN0IGZvciBhIGJsb2NrIGRldmljZSwgYW5kIExWTSBuZWVkcyB0b1xuIgorCSJkaXNwbGF5IGEgbmFtZSBmb3IgdGhlIGRldmljZSwgdGhlIHBhdGggbmFtZXMgYXJlIG1hdGNoZWQgYWdhaW5zdFxuIgorCSJlYWNoIGl0ZW0gaW4gdGhpcyBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFRoZSBmaXJzdCBtYXRjaCBpc1xuIgorCSJ1c2VkLiBUcnkgdG8gYXZvaWQgdXNpbmcgdW5kZXNjcmlwdGl2ZSAvZGV2L2RtLU4gbmFtZXMsIGlmIHByZXNlbnQuXG4iCisJIklmIG5vIHByZWZlcnJlZCBuYW1lIG1hdGNoZXMsIG9yIGlmIHByZWZlcnJlZF9uYW1lcyBhcmUgbm90IGRlZmluZWQsXG4iCisJInRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gcHJlZmVyZW5jZXMgYXJlIGFwcGxpZWQgaW4gb3JkZXIgdW50aWwgb25lXG4iCisJInByb2R1Y2VzIGEgcHJlZmVycmVkIG5hbWU6XG4iCisJIlByZWZlciBuYW1lcyB3aXRoIHBhdGggcHJlZml4ZXMgaW4gdGhlIG9yZGVyIG9mOlxuIgorCSIvZGV2L21hcHBlciwgL2Rldi9kaXNrLCAvZGV2L2RtLSosIC9kZXYvYmxvY2suXG4iCisJIlByZWZlciB0aGUgbmFtZSB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2Ygc2xhc2hlcy5cbiIKKwkiUHJlZmVyIGEgbmFtZSB0aGF0IGlzIGEgc3ltbGluay5cbiIKKwkiUHJlZmVyIHRoZSBwYXRoIHdpdGggbGVhc3QgdmFsdWUgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkicHJlZmVycmVkX25hbWVzID0gWyBcIl4vZGV2L21wYXRoL1wiLCBcIl4vZGV2L21hcHBlci9tcGF0aFwiLCBcIl4vZGV2L1toc11kXCIgXVxuIgorCSIjXG4iKQorCitjZmdfYXJyYXkoZGV2aWNlc19maWx0ZXJfQ0ZHLCAiZmlsdGVyIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsICIjU2F8LiovfCIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGltaXQgdGhlIGJsb2NrIGRldmljZXMgdGhhdCBhcmUgdXNlZCBieSBMVk0gY29tbWFuZHMuXG4iCisJIlRoaXMgaXMgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCB0byBhY2NlcHQgb3IgcmVqZWN0IGJsb2NrXG4iCisJImRldmljZSBwYXRoIG5hbWVzLiBFYWNoIHJlZ2V4IGlzIGRlbGltaXRlZCBieSBhIHZlcnRpY2FsIGJhciAnfCdcbiIKKwkiKG9yIGFueSBjaGFyYWN0ZXIpIGFuZCBpcyBwcmVjZWRlZCBieSAnYScgdG8gYWNjZXB0IHRoZSBwYXRoLCBvclxuIgorCSJieSAncicgdG8gcmVqZWN0IHRoZSBwYXRoLiBUaGUgZmlyc3QgcmVnZXggaW4gdGhlIGxpc3QgdG8gbWF0Y2ggdGhlXG4iCisJInBhdGggaXMgdXNlZCwgcHJvZHVjaW5nIHRoZSAnYScgb3IgJ3InIHJlc3VsdCBmb3IgdGhlIGRldmljZS5cbiIKKwkiV2hlbiBtdWx0aXBsZSBwYXRoIG5hbWVzIGV4aXN0IGZvciBhIGJsb2NrIGRldmljZSwgaWYgYW55IHBhdGggbmFtZVxuIgorCSJtYXRjaGVzIGFuICdhJyBwYXR0ZXJuIGJlZm9yZSBhbiAncicgcGF0dGVybiwgdGhlbiB0aGUgZGV2aWNlIGlzXG4iCisJImFjY2VwdGVkLiBJZiBhbGwgdGhlIHBhdGggbmFtZXMgbWF0Y2ggYW4gJ3InIHBhdHRlcm4gZmlyc3QsIHRoZW4gdGhlXG4iCisJImRldmljZSBpcyByZWplY3RlZC4gVW5tYXRjaGluZyBwYXRoIG5hbWVzIGRvIG5vdCBhZmZlY3QgdGhlIGFjY2VwdFxuIgorCSJvciByZWplY3QgZGVjaXNpb24uIElmIG5vIHBhdGggbmFtZXMgZm9yIGEgZGV2aWNlIG1hdGNoIGEgcGF0dGVybixcbiIKKwkidGhlbiB0aGUgZGV2aWNlIGlzIGFjY2VwdGVkLiBCZSBjYXJlZnVsIG1peGluZyAnYScgYW5kICdyJyBwYXR0ZXJucyxcbiIKKwkiYXMgdGhlIGNvbWJpbmF0aW9uIG1pZ2h0IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzICh0ZXN0IGNoYW5nZXMuKVxuIgorCSJSdW4gdmdzY2FuIGFmdGVyIGNoYW5naW5nIHRoZSBmaWx0ZXIgdG8gcmVnZW5lcmF0ZSB0aGUgY2FjaGUuXG4iCisJIlNlZSB0aGUgdXNlX2x2bWV0YWQgY29tbWVudCBmb3IgYSBzcGVjaWFsIGNhc2UgcmVnYXJkaW5nIGZpbHRlcnMuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJBY2NlcHQgZXZlcnkgYmxvY2sgZGV2aWNlOlxuIgorCSJmaWx0ZXIgPSBbIFwiYXwuKi98XCIgXVxuIgorCSJSZWplY3QgdGhlIGNkcm9tIGRyaXZlOlxuIgorCSJmaWx0ZXIgPSBbIFwicnwvZGV2L2Nkcm9tfFwiIF1cbiIKKwkiV29yayB3aXRoIGp1c3QgbG9vcGJhY2sgZGV2aWNlcywgZS5nLiBmb3IgdGVzdGluZzpcbiIKKwkiZmlsdGVyID0gWyBcImF8bG9vcHxcIiwgXCJyfC4qfFwiIF1cbiIKKwkiQWNjZXB0IGFsbCBsb29wIGRldmljZXMgYW5kIGlkZSBkcml2ZXMgZXhjZXB0IGhkYzpcbiIKKwkiZmlsdGVyID0gWyBcImF8bG9vcHxcIiwgXCJyfC9kZXYvaGRjfFwiLCBcImF8L2Rldi9pZGV8XCIsIFwicnwuKnxcIiBdXG4iCisJIlVzZSBhbmNob3JzIHRvIGJlIHZlcnkgc3BlY2lmaWM6XG4iCisJImZpbHRlciA9IFsgXCJhfF4vZGV2L2hkYTgkfFwiLCBcInJ8LiovfFwiIF1cbiIKKwkiI1xuIikKKworY2ZnX2FycmF5KGRldmljZXNfZ2xvYmFsX2ZpbHRlcl9DRkcsICJnbG9iYWxfZmlsdGVyIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsICIjU2F8LiovfCIsIHZzbigyLCAyLCA5OCksIE5VTEwsIDAsIE5VTEwsCisJIkxpbWl0IHRoZSBibG9jayBkZXZpY2VzIHRoYXQgYXJlIHVzZWQgYnkgTFZNIHN5c3RlbSBjb21wb25lbnRzLlxuIgorCSJCZWNhdXNlIGRldmljZXMvZmlsdGVyIG1heSBiZSBvdmVycmlkZGVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXQgaXNcbiIKKwkibm90IHN1aXRhYmxlIGZvciBzeXN0ZW0td2lkZSBkZXZpY2UgZmlsdGVyaW5nLCBlLmcuIHVkZXYgYW5kIGx2bWV0YWQuXG4iCisJIlVzZSBnbG9iYWxfZmlsdGVyIHRvIGhpZGUgZGV2aWNlcyBmcm9tIHRoZXNlIExWTSBzeXN0ZW0gY29tcG9uZW50cy5cbiIKKwkiVGhlIHN5bnRheCBpcyB0aGUgc2FtZSBhcyBkZXZpY2VzL2ZpbHRlci4gRGV2aWNlcyByZWplY3RlZCBieVxuIgorCSJnbG9iYWxfZmlsdGVyIGFyZSBub3Qgb3BlbmVkIGJ5IExWTS5cbiIpCisKK2NmZ19ydW50aW1lKGRldmljZXNfY2FjaGVfQ0ZHLCAiY2FjaGUiLCBkZXZpY2VzX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9TVFJJTkcsIHZzbigxLCAwLCAwKSwgdnNuKDEsIDIsIDE5KSwKKwkiVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgZGV2aWNlcy9jYWNoZV9kaXIgc2V0dGluZy5cbiIsCisJIkNhY2hlIGZpbGUgcGF0aC5cbiIpCisKK2NmZ19ydW50aW1lKGRldmljZXNfY2FjaGVfZGlyX0NGRywgImNhY2hlX2RpciIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgdnNuKDEsIDIsIDE5KSwgMCwgTlVMTCwKKwkiRGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBkZXZpY2UgY2FjaGUgZmlsZS5cbiIKKwkiVGhlIHJlc3VsdHMgb2YgZmlsdGVyaW5nIGFyZSBjYWNoZWQgb24gZGlzayB0byBhdm9pZCByZXNjYW5uaW5nIGR1ZFxuIgorCSJkZXZpY2VzICh3aGljaCBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lKS4gQnkgZGVmYXVsdCB0aGlzIGNhY2hlIGlzXG4iCisJInN0b3JlZCBpbiBhIGZpbGUgbmFtZWQgLmNhY2hlLiBJdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGZpbGU7IHRoZVxuIgorCSJ0b29scyByZWdlbmVyYXRlIGl0LiBJZiBvYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2IGlzIGVuYWJsZWQsIHRoZVxuIgorCSJsaXN0IG9mIGRldmljZXMgaXMgb2J0YWluZWQgZnJvbSB1ZGV2IGFuZCBhbnkgZXhpc3RpbmcgLmNhY2hlIGZpbGVcbiIKKwkiaXMgcmVtb3ZlZC5cbiIpCisKK2NmZyhkZXZpY2VzX2NhY2hlX2ZpbGVfcHJlZml4X0NGRywgImNhY2hlX2ZpbGVfcHJlZml4IiwgZGV2aWNlc19DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZLCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfQ0FDSEVfRklMRV9QUkVGSVgsIHZzbigxLCAyLCAxOSksIE5VTEwsIDAsIE5VTEwsCisJIkEgcHJlZml4IHVzZWQgYmVmb3JlIHRoZSAuY2FjaGUgZmlsZSBuYW1lLiBTZWUgZGV2aWNlcy9jYWNoZV9kaXIuXG4iKQorCitjZmcoZGV2aWNlc193cml0ZV9jYWNoZV9zdGF0ZV9DRkcsICJ3cml0ZV9jYWNoZV9zdGF0ZSIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIDEsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiRW5hYmxlL2Rpc2FibGUgd3JpdGluZyB0aGUgY2FjaGUgZmlsZS4gU2VlIGRldmljZXMvY2FjaGVfZGlyLlxuIikKKworY2ZnX2FycmF5KGRldmljZXNfdHlwZXNfQ0ZHLCAidHlwZXMiLCBkZXZpY2VzX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQgfCBDRkdfQURWQU5DRUQsIENGR19UWVBFX0lOVCB8IENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGFkZGl0aW9uYWwgYWNjZXB0YWJsZSBibG9jayBkZXZpY2UgdHlwZXMuXG4iCisJIlRoZXNlIGFyZSBvZiBkZXZpY2UgdHlwZSBuYW1lcyBmcm9tIC9wcm9jL2RldmljZXMsIGZvbGxvd2VkIGJ5IHRoZVxuIgorCSJtYXhpbXVtIG51bWJlciBvZiBwYXJ0aXRpb25zLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkidHlwZXMgPSBbIFwiZmRcIiwgMTYgXVxuIgorCSIjXG4iKQorCitjZmcoZGV2aWNlc19zeXNmc19zY2FuX0NGRywgInN5c2ZzX3NjYW4iLCBkZXZpY2VzX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1NZU0ZTX1NDQU4sIHZzbigxLCAwLCA4KSwgTlVMTCwgMCwgTlVMTCwKKwkiUmVzdHJpY3QgZGV2aWNlIHNjYW5uaW5nIHRvIGJsb2NrIGRldmljZXMgYXBwZWFyaW5nIGluIHN5c2ZzLlxuIgorCSJUaGlzIGlzIGEgcXVpY2sgd2F5IG9mIGZpbHRlcmluZyBvdXQgYmxvY2sgZGV2aWNlcyB0aGF0IGFyZSBub3RcbiIKKwkicHJlc2VudCBvbiB0aGUgc3lzdGVtLiBzeXNmcyBtdXN0IGJlIHBhcnQgb2YgdGhlIGtlcm5lbCBhbmQgbW91bnRlZC4pXG4iKQorCitjZmcoZGV2aWNlc19tdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbl9DRkcsICJtdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbiIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfTVVMVElQQVRIX0NPTVBPTkVOVF9ERVRFQ1RJT04sIHZzbigyLCAyLCA4OSksIE5VTEwsIDAsIE5VTEwsCisJIklnbm9yZSBkZXZpY2VzIHRoYXQgYXJlIGNvbXBvbmVudHMgb2YgRE0gbXVsdGlwYXRoIGRldmljZXMuXG4iKQorCitjZmcoZGV2aWNlc19tZF9jb21wb25lbnRfZGV0ZWN0aW9uX0NGRywgIm1kX2NvbXBvbmVudF9kZXRlY3Rpb24iLCBkZXZpY2VzX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX01EX0NPTVBPTkVOVF9ERVRFQ1RJT04sIHZzbigxLCAwLCAxOCksIE5VTEwsIDAsIE5VTEwsCisJIklnbm9yZSBkZXZpY2VzIHRoYXQgYXJlIGNvbXBvbmVudHMgb2Ygc29mdHdhcmUgUkFJRCAobWQpIGRldmljZXMuXG4iKQorCitjZmcoZGV2aWNlc19md19yYWlkX2NvbXBvbmVudF9kZXRlY3Rpb25fQ0ZHLCAiZndfcmFpZF9jb21wb25lbnRfZGV0ZWN0aW9uIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9GV19SQUlEX0NPTVBPTkVOVF9ERVRFQ1RJT04sIHZzbigyLCAyLCAxMTIpLCBOVUxMLCAwLCBOVUxMLAorCSJJZ25vcmUgZGV2aWNlcyB0aGF0IGFyZSBjb21wb25lbnRzIG9mIGZpcm13YXJlIFJBSUQgZGV2aWNlcy5cbiIKKwkiTFZNIG11c3QgdXNlIGFuIGV4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZSBvdGhlciB0aGFuIG5vbmUgZm9yIHRoaXNcbiIKKwkiZGV0ZWN0aW9uIHRvIGV4ZWN1dGUuXG4iKQorCitjZmcoZGV2aWNlc19tZF9jaHVua19hbGlnbm1lbnRfQ0ZHLCAibWRfY2h1bmtfYWxpZ25tZW50IiwgZGV2aWNlc19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9NRF9DSFVOS19BTElHTk1FTlQsIHZzbigyLCAyLCA0OCksIE5VTEwsIDAsIE5VTEwsCisJIkFsaWduIFBWIGRhdGEgYmxvY2tzIHdpdGggbWQgZGV2aWNlJ3Mgc3RyaXBlLXdpZHRoLlxuIgorCSJUaGlzIGFwcGxpZXMgaWYgYSBQViBpcyBwbGFjZWQgZGlyZWN0bHkgb24gYW4gbWQgZGV2aWNlLlxuIikKKworY2ZnKGRldmljZXNfZGVmYXVsdF9kYXRhX2FsaWdubWVudF9DRkcsICJkZWZhdWx0X2RhdGFfYWxpZ25tZW50IiwgZGV2aWNlc19DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfREFUQV9BTElHTk1FTlQsIHZzbigyLCAyLCA3NSksIE5VTEwsIDAsIE5VTEwsCisJIkRlZmF1bHQgYWxpZ25tZW50IG9mIHRoZSBzdGFydCBvZiBhIFBWIGRhdGEgYXJlYSBpbiBNQi5cbiIKKwkiSWYgc2V0IHRvIDAsIGEgdmFsdWUgb2YgNjRLaUIgd2lsbCBiZSB1c2VkLlxuIgorCSJTZXQgdG8gMSBmb3IgMU1pQiwgMiBmb3IgMk1pQiwgZXRjLlxuIikKKworY2ZnKGRldmljZXNfZGF0YV9hbGlnbm1lbnRfZGV0ZWN0aW9uX0NGRywgImRhdGFfYWxpZ25tZW50X2RldGVjdGlvbiIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfREFUQV9BTElHTk1FTlRfREVURUNUSU9OLCB2c24oMiwgMiwgNTEpLCBOVUxMLCAwLCBOVUxMLAorCSJEZXRlY3QgUFYgZGF0YSBhbGlnbm1lbnQgYmFzZWQgb24gc3lzZnMgZGV2aWNlIGluZm9ybWF0aW9uLlxuIgorCSJUaGUgc3RhcnQgb2YgYSBQViBkYXRhIGFyZWEgd2lsbCBiZSBhIG11bHRpcGxlIG9mIG1pbmltdW1faW9fc2l6ZSBvclxuIgorCSJvcHRpbWFsX2lvX3NpemUgZXhwb3NlZCBpbiBzeXNmcy4gbWluaW11bV9pb19zaXplIGlzIHRoZSBzbWFsbGVzdFxuIgorCSJyZXF1ZXN0IHRoZSBkZXZpY2UgY2FuIHBlcmZvcm0gd2l0aG91dCBpbmN1cnJpbmcgYSByZWFkLW1vZGlmeS13cml0ZVxuIgorCSJwZW5hbHR5LCBlLmcuIE1EIGNodW5rIHNpemUuIG9wdGltYWxfaW9fc2l6ZSBpcyB0aGUgZGV2aWNlJ3NcbiIKKwkicHJlZmVycmVkIHVuaXQgb2YgcmVjZWl2aW5nIEkvTywgZS5nLiBNRCBzdHJpcGUgd2lkdGguXG4iCisJIm1pbmltdW1faW9fc2l6ZSBpcyB1c2VkIGlmIG9wdGltYWxfaW9fc2l6ZSBpcyB1bmRlZmluZWQgKDApLlxuIgorCSJJZiBtZF9jaHVua19hbGlnbm1lbnQgaXMgZW5hYmxlZCwgdGhhdCBkZXRlY3RzIHRoZSBvcHRpbWFsX2lvX3NpemUuXG4iCisJIlRoaXMgc2V0dGluZyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbWRfY2h1bmtfYWxpZ25tZW50LlxuIikKKworY2ZnKGRldmljZXNfZGF0YV9hbGlnbm1lbnRfQ0ZHLCAiZGF0YV9hbGlnbm1lbnQiLCBkZXZpY2VzX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIDAsIHZzbigyLCAyLCA0NSksIE5VTEwsIDAsIE5VTEwsCisJIkFsaWdubWVudCBvZiB0aGUgc3RhcnQgb2YgYSBQViBkYXRhIGFyZWEgaW4gS2lCLlxuIgorCSJJZiBhIFBWIGlzIHBsYWNlZCBkaXJlY3RseSBvbiBhbiBtZCBkZXZpY2UgYW5kIG1kX2NodW5rX2FsaWdubWVudCBvclxuIgorCSJkYXRhX2FsaWdubWVudF9kZXRlY3Rpb24gYXJlIGVuYWJsZWQsIHRoZW4gdGhpcyBzZXR0aW5nIGlzIGlnbm9yZWQuXG4iCisJIk90aGVyd2lzZSwgbWRfY2h1bmtfYWxpZ25tZW50IGFuZCBkYXRhX2FsaWdubWVudF9kZXRlY3Rpb24gYXJlXG4iCisJImRpc2FibGVkIGlmIHRoaXMgaXMgc2V0LiBTZXQgdG8gMCB0byB1c2UgdGhlIGRlZmF1bHQgYWxpZ25tZW50IG9yIHRoZVxuIgorCSJwYWdlIHNpemUsIGlmIGxhcmdlci5cbiIpCisKK2NmZyhkZXZpY2VzX2RhdGFfYWxpZ25tZW50X29mZnNldF9kZXRlY3Rpb25fQ0ZHLCAiZGF0YV9hbGlnbm1lbnRfb2Zmc2V0X2RldGVjdGlvbiIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfREFUQV9BTElHTk1FTlRfT0ZGU0VUX0RFVEVDVElPTiwgdnNuKDIsIDIsIDUwKSwgTlVMTCwgMCwgTlVMTCwKKwkiRGV0ZWN0IFBWIGRhdGEgYWxpZ25tZW50IG9mZnNldCBiYXNlZCBvbiBzeXNmcyBkZXZpY2UgaW5mb3JtYXRpb24uXG4iCisJIlRoZSBzdGFydCBvZiBhIFBWIGFsaWduZWQgZGF0YSBhcmVhIHdpbGwgYmUgc2hpZnRlZCBieSB0aGVcbiIKKwkiYWxpZ25tZW50X29mZnNldCBleHBvc2VkIGluIHN5c2ZzLiBUaGlzIG9mZnNldCBpcyBvZnRlbiAwLCBidXQgbWF5XG4iCisJImJlIG5vbi16ZXJvLiBDZXJ0YWluIDRLaUIgc2VjdG9yIGRyaXZlcyB0aGF0IGNvbXBlbnNhdGUgZm9yIHdpbmRvd3NcbiIKKwkicGFydGl0aW9uaW5nIHdpbGwgaGF2ZSBhbiBhbGlnbm1lbnRfb2Zmc2V0IG9mIDM1ODQgYnl0ZXMgKHNlY3RvciA3XG4iCisJImlzIHRoZSBsb3dlc3QgYWxpZ25lZCBsb2dpY2FsIGJsb2NrLCB0aGUgNEtpQiBzZWN0b3JzIHN0YXJ0IGF0XG4iCisJIkxCQSAtMSwgYW5kIGNvbnNlcXVlbnRseSBzZWN0b3IgNjMgaXMgYWxpZ25lZCBvbiBhIDRLaUIgYm91bmRhcnkpLlxuIgorCSJwdmNyZWF0ZSAtLWRhdGFhbGlnbm1lbnRvZmZzZXQgd2lsbCBza2lwIHRoaXMgZGV0ZWN0aW9uLlxuIikKKworY2ZnKGRldmljZXNfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzX0NGRywgImlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfSUdOT1JFX1NVU1BFTkRFRF9ERVZJQ0VTLCB2c24oMSwgMiwgMTkpLCBOVUxMLCAwLCBOVUxMLAorCSJJZ25vcmUgRE0gZGV2aWNlcyB0aGF0IGhhdmUgSS9PIHN1c3BlbmRlZCB3aGlsZSBzY2FubmluZyBkZXZpY2VzLlxuIgorCSJPdGhlcndpc2UsIExWTSB3YWl0cyBmb3IgYSBzdXNwZW5kZWQgZGV2aWNlIHRvIGJlY29tZSBhY2Nlc3NpYmxlLlxuIgorCSJUaGlzIHNob3VsZCBvbmx5IGJlIG5lZWRlZCBpbiByZWNvdmVyeSBzaXR1YXRpb25zLlxuIikKKworY2ZnKGRldmljZXNfaWdub3JlX2x2bV9taXJyb3JzX0NGRywgImlnbm9yZV9sdm1fbWlycm9ycyIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfSUdOT1JFX0xWTV9NSVJST1JTLCB2c24oMiwgMiwgMTA0KSwgTlVMTCwgMCwgTlVMTCwKKwkiRG8gbm90IHNjYW4gJ21pcnJvcicgTFZzIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2Nrcy5cbiIKKwkiVGhpcyBhdm9pZHMgcG9zc2libGUgZGVhZGxvY2tzIHdoZW4gdXNpbmcgdGhlICdtaXJyb3InIHNlZ21lbnQgdHlwZS5cbiIKKwkiVGhpcyBzZXR0aW5nIGRldGVybWluZXMgd2hldGhlciBMVnMgdXNpbmcgdGhlICdtaXJyb3InIHNlZ21lbnQgdHlwZVxuIgorCSJhcmUgc2Nhbm5lZCBmb3IgTFZNIGxhYmVscy4gVGhpcyBhZmZlY3RzIHRoZSBhYmlsaXR5IG9mIG1pcnJvcnMgdG9cbiIKKwkiYmUgdXNlZCBhcyBwaHlzaWNhbCB2b2x1bWVzLiBJZiB0aGlzIHNldHRpbmcgaXMgZW5hYmxlZCwgaXQgaXNcbiIKKwkiaW1wb3NzaWJsZSB0byBjcmVhdGUgVkdzIG9uIHRvcCBvZiBtaXJyb3IgTFZzLCBpLmUuIHRvIHN0YWNrIFZHcyBvblxuIgorCSJtaXJyb3IgTFZzLiBJZiB0aGlzIHNldHRpbmcgaXMgZGlzYWJsZWQsIGFsbG93aW5nIG1pcnJvciBMVnMgdG8gYmVcbiIKKwkic2Nhbm5lZCwgaXQgbWF5IGNhdXNlIExWTSBwcm9jZXNzZXMgYW5kIEkvTyB0byB0aGUgbWlycm9yIHRvIGJlY29tZVxuIgorCSJibG9ja2VkLiBUaGlzIGlzIGR1ZSB0byB0aGUgd2F5IHRoYXQgdGhlIG1pcnJvciBzZWdtZW50IHR5cGUgaGFuZGxlc1xuIgorCSJmYWlsdXJlcy4gSW4gb3JkZXIgZm9yIHRoZSBoYW5nIHRvIG9jY3VyLCBhbiBMVk0gY29tbWFuZCBtdXN0IGJlIHJ1blxuIgorCSJqdXN0IGFmdGVyIGEgZmFpbHVyZSBhbmQgYmVmb3JlIHRoZSBhdXRvbWF0aWMgTFZNIHJlcGFpciBwcm9jZXNzXG4iCisJInRha2VzIHBsYWNlLCBvciB0aGVyZSBtdXN0IGJlIGZhaWx1cmVzIGluIG11bHRpcGxlIG1pcnJvcnMgaW4gdGhlXG4iCisJInNhbWUgVkcgYXQgdGhlIHNhbWUgdGltZSB3aXRoIHdyaXRlIGZhaWx1cmVzIG9jY3VycmluZyBtb21lbnRzIGJlZm9yZVxuIgorCSJhIHNjYW4gb2YgdGhlIG1pcnJvcidzIGxhYmVscy4gVGhlICdtaXJyb3InIHNjYW5uaW5nIHByb2JsZW1zIGRvIG5vdFxuIgorCSJhcHBseSB0byBMVk0gUkFJRCB0eXBlcyBsaWtlICdyYWlkMScgd2hpY2ggaGFuZGxlIGZhaWx1cmVzIGluIGFcbiIKKwkiZGlmZmVyZW50IHdheSwgbWFraW5nIHRoZW0gYSBiZXR0ZXIgY2hvaWNlIGZvciBWRyBzdGFja2luZy5cbiIpCisKK2NmZyhkZXZpY2VzX2Rpc2FibGVfYWZ0ZXJfZXJyb3JfY291bnRfQ0ZHLCAiZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudCIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9ESVNBQkxFX0FGVEVSX0VSUk9SX0NPVU5ULCB2c24oMiwgMiwgNzUpLCBOVUxMLCAwLCBOVUxMLAorCSJOdW1iZXIgb2YgSS9PIGVycm9ycyBhZnRlciB3aGljaCBhIGRldmljZSBpcyBza2lwcGVkLlxuIgorCSJEdXJpbmcgZWFjaCBMVk0gb3BlcmF0aW9uLCBlcnJvcnMgcmVjZWl2ZWQgZnJvbSBlYWNoIGRldmljZSBhcmVcbiIKKwkiY291bnRlZC4gSWYgdGhlIGNvdW50ZXIgb2YgYSBkZXZpY2UgZXhjZWVkcyB0aGUgbGltaXQgc2V0IGhlcmUsXG4iCisJIm5vIGZ1cnRoZXIgSS9PIGlzIHNlbnQgdG8gdGhhdCBkZXZpY2UgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlXG4iCisJIm9wZXJhdGlvbi4gU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgdGhlIGNvdW50ZXJzIGFsdG9nZXRoZXIuXG4iKQorCitjZmcoZGV2aWNlc19yZXF1aXJlX3Jlc3RvcmVmaWxlX3dpdGhfdXVpZF9DRkcsICJyZXF1aXJlX3Jlc3RvcmVmaWxlX3dpdGhfdXVpZCIsIGRldmljZXNfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfUkVRVUlSRV9SRVNUT1JFRklMRV9XSVRIX1VVSUQsIHZzbigyLCAyLCA3MyksIE5VTEwsIDAsIE5VTEwsCisJIkFsbG93IHVzZSBvZiBwdmNyZWF0ZSAtLXV1aWQgd2l0aG91dCByZXF1aXJpbmcgLS1yZXN0b3JlZmlsZS5cbiIpCisKK2NmZyhkZXZpY2VzX3B2X21pbl9zaXplX0NGRywgInB2X21pbl9zaXplIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1BWX01JTl9TSVpFX0tCLCB2c24oMiwgMiwgODUpLCBOVUxMLCAwLCBOVUxMLAorCSJNaW5pbXVtIHNpemUgaW4gS2lCIG9mIGJsb2NrIGRldmljZXMgd2hpY2ggY2FuIGJlIHVzZWQgYXMgUFZzLlxuIgorCSJJbiBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCBhbGwgbm9kZXMgbXVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuXG4iCisJIkFueSB2YWx1ZSBzbWFsbGVyIHRoYW4gNTEyS2lCIGlzIGlnbm9yZWQuIFRoZSBwcmV2aW91cyBidWlsdC1pblxuIgorCSJ2YWx1ZSB3YXMgNTEyLlxuIikKKworY2ZnKGRldmljZXNfaXNzdWVfZGlzY2FyZHNfQ0ZHLCAiaXNzdWVfZGlzY2FyZHMiLCBkZXZpY2VzX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX0lTU1VFX0RJU0NBUkRTLCB2c24oMiwgMiwgODUpLCBOVUxMLCAwLCBOVUxMLAorCSJJc3N1ZSBkaXNjYXJkcyB0byBQVnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgYW4gTFYuXG4iCisJIkRpc2NhcmRzIGFyZSBzZW50IHRvIGFuIExWJ3MgdW5kZXJseWluZyBwaHlzaWNhbCB2b2x1bWVzIHdoZW4gdGhlIExWXG4iCisJImlzIG5vIGxvbmdlciB1c2luZyB0aGUgcGh5c2ljYWwgdm9sdW1lcycgc3BhY2UsIGUuZy4gbHZyZW1vdmUsXG4iCisJImx2cmVkdWNlLiBEaXNjYXJkcyBpbmZvcm0gdGhlIHN0b3JhZ2UgdGhhdCBhIHJlZ2lvbiBpcyBubyBsb25nZXJcbiIKKwkidXNlZC4gU3RvcmFnZSB0aGF0IHN1cHBvcnRzIGRpc2NhcmRzIGFkdmVydGlzZSB0aGUgcHJvdG9jb2wtc3BlY2lmaWNcbiIKKwkid2F5IGRpc2NhcmRzIHNob3VsZCBiZSBpc3N1ZWQgYnkgdGhlIGtlcm5lbCAoVFJJTSwgVU5NQVAsIG9yXG4iCisJIldSSVRFIFNBTUUgd2l0aCBVTk1BUCBiaXQgc2V0KS4gTm90IGFsbCBzdG9yYWdlIHdpbGwgc3VwcG9ydCBvclxuIgorCSJiZW5lZml0IGZyb20gZGlzY2FyZHMsIGJ1dCBTU0RzIGFuZCB0aGlubHkgcHJvdmlzaW9uZWQgTFVOc1xuIgorCSJnZW5lcmFsbHkgZG8uIElmIGVuYWJsZWQsIGRpc2NhcmRzIHdpbGwgb25seSBiZSBpc3N1ZWQgaWYgYm90aCB0aGVcbiIKKwkic3RvcmFnZSBhbmQga2VybmVsIHByb3ZpZGUgc3VwcG9ydC5cbiIpCisKK2NmZyhkZXZpY2VzX2FsbG93X2NoYW5nZXNfd2l0aF9kdXBsaWNhdGVfcHZzX0NGRywgImFsbG93X2NoYW5nZXNfd2l0aF9kdXBsaWNhdGVfcHZzIiwgZGV2aWNlc19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9BTExPV19DSEFOR0VTX1dJVEhfRFVQTElDQVRFX1BWUywgdnNuKDIsIDIsIDE1MyksIE5VTEwsIDAsIE5VTEwsCisJIkFsbG93IFZHIG1vZGlmaWNhdGlvbiB3aGlsZSBhIFBWIGFwcGVhcnMgb24gbXVsdGlwbGUgZGV2aWNlcy5cbiIKKwkiV2hlbiBhIFBWIGFwcGVhcnMgb24gbXVsdGlwbGUgZGV2aWNlcywgTFZNIGF0dGVtcHRzIHRvIGNob29zZSB0aGVcbiIKKwkiYmVzdCBkZXZpY2UgdG8gdXNlIGZvciB0aGUgUFYuIElmIHRoZSBkZXZpY2VzIHJlcHJlc2VudCB0aGUgc2FtZVxuIgorCSJ1bmRlcmx5aW5nIHN0b3JhZ2UsIHRoZSBjaG9pY2UgaGFzIG1pbmltYWwgY29uc2VxdWVuY2UuIElmIHRoZVxuIgorCSJkZXZpY2VzIHJlcHJlc2VudCBkaWZmZXJlbnQgdW5kZXJseWluZyBzdG9yYWdlLCB0aGUgd3JvbmcgY2hvaWNlXG4iCisJImNhbiByZXN1bHQgaW4gZGF0YSBsb3NzIGlmIHRoZSBWRyBpcyBtb2RpZmllZC4gRGlzYWJsaW5nIHRoaXNcbiIKKwkic2V0dGluZyBpcyB0aGUgc2FmZXN0IG9wdGlvbiBiZWNhdXNlIGl0IHByZXZlbnRzIG1vZGlmeWluZyBhIFZHXG4iCisJIm9yIGFjdGl2YXRpbmcgTFZzIGluIGl0IHdoaWxlIGEgUFYgYXBwZWFycyBvbiBtdWx0aXBsZSBkZXZpY2VzLlxuIgorCSJFbmFibGluZyB0aGlzIHNldHRpbmcgYWxsb3dzIHRoZSBWRyB0byBiZSB1c2VkIGFzIHVzdWFsIGV2ZW4gd2l0aFxuIgorCSJ1bmNlcnRhaW4gZGV2aWNlcy5cbiIpCisKK2NmZ19hcnJheShhbGxvY2F0aW9uX2NsaW5nX3RhZ19saXN0X0NGRywgImNsaW5nX3RhZ19saXN0IiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigyLCAyLCA3NyksIE5VTEwsIDAsIE5VTEwsCisJIkFkdmlzZSBMVk0gd2hpY2ggUFZzIHRvIHVzZSB3aGVuIHNlYXJjaGluZyBmb3IgbmV3IHNwYWNlLlxuIgorCSJXaGVuIHNlYXJjaGluZyBmb3IgZnJlZSBzcGFjZSB0byBleHRlbmQgYW4gTFYsIHRoZSAnY2xpbmcnIGFsbG9jYXRpb25cbiIKKwkicG9saWN5IHdpbGwgY2hvb3NlIHNwYWNlIG9uIHRoZSBzYW1lIFBWcyBhcyB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZVxuIgorCSJleGlzdGluZyBMVi4gSWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IHNwYWNlIGFuZCBhIGxpc3Qgb2YgdGFncyBpc1xuIgorCSJkZWZpbmVkIGhlcmUsIGl0IHdpbGwgY2hlY2sgd2hldGhlciBhbnkgb2YgdGhlbSBhcmUgYXR0YWNoZWQgdG8gdGhlXG4iCisJIlBWcyBjb25jZXJuZWQgYW5kIHRoZW4gc2VlayB0byBtYXRjaCB0aG9zZSBQViB0YWdzIGJldHdlZW4gZXhpc3RpbmdcbiIKKwkiZXh0ZW50cyBhbmQgbmV3IGV4dGVudHMuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJVc2UgdGhlIHNwZWNpYWwgdGFnIFwiQCpcIiBhcyBhIHdpbGRjYXJkIHRvIG1hdGNoIGFueSBQViB0YWc6XG4iCisJImNsaW5nX3RhZ19saXN0ID0gWyBcIkAqXCIgXVxuIgorCSJMVnMgYXJlIG1pcnJvcmVkIGJldHdlZW4gdHdvIHNpdGVzIHdpdGhpbiBhIHNpbmdsZSBWRywgYW5kXG4iCisJIlBWcyBhcmUgdGFnZ2VkIHdpdGggZWl0aGVyIEBzaXRlMSBvciBAc2l0ZTIgdG8gaW5kaWNhdGUgd2hlcmVcbiIKKwkidGhleSBhcmUgc2l0dWF0ZWQ6XG4iCisJImNsaW5nX3RhZ19saXN0ID0gWyBcIkBzaXRlMVwiLCBcIkBzaXRlMlwiIF1cbiIKKwkiI1xuIikKKworY2ZnKGFsbG9jYXRpb25fbWF4aW1pc2VfY2xpbmdfQ0ZHLCAibWF4aW1pc2VfY2xpbmciLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX01BWElNSVNFX0NMSU5HLCB2c24oMiwgMiwgODUpLCBOVUxMLCAwLCBOVUxMLAorCSJVc2UgYSBwcmV2aW91cyBhbGxvY2F0aW9uIGFsZ29yaXRobS5cbiIKKwkiQ2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMi4wMi44NSBleHRlbmRlZCB0aGUgcmVhY2ggb2YgdGhlICdjbGluZydcbiIKKwkicG9saWNpZXMgdG8gZGV0ZWN0IG1vcmUgc2l0dWF0aW9ucyB3aGVyZSBkYXRhIGNhbiBiZSBncm91cGVkIG9udG9cbiIKKwkidGhlIHNhbWUgZGlza3MuIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoZSBjaGFuZ2VzXG4iCisJImFuZCByZXZlcnQgdG8gdGhlIHByZXZpb3VzIGFsZ29yaXRobS5cbiIpCisKK2NmZyhhbGxvY2F0aW9uX3VzZV9ibGtpZF93aXBpbmdfQ0ZHLCAidXNlX2Jsa2lkX3dpcGluZyIsIGFsbG9jYXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfVVNFX0JMS0lEX1dJUElORywgdnNuKDIsIDIsIDEwNSksICJAREVGQVVMVF9VU0VfQkxLSURfV0lQSU5HQCIsIDAsIE5VTEwsCisJIlVzZSBibGtpZCB0byBkZXRlY3QgZXhpc3Rpbmcgc2lnbmF0dXJlcyBvbiBuZXcgUFZzIGFuZCBMVnMuXG4iCisJIlRoZSBibGtpZCBsaWJyYXJ5IGNhbiBkZXRlY3QgbW9yZSBzaWduYXR1cmVzIHRoYW4gdGhlIG5hdGl2ZSBMVk1cbiIKKwkiZGV0ZWN0aW9uIGNvZGUsIGJ1dCBtYXkgdGFrZSBsb25nZXIuIExWTSBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoXG4iCisJImJsa2lkIHdpcGluZyBzdXBwb3J0IGZvciB0aGlzIHNldHRpbmcgdG8gYXBwbHkuIExWTSBuYXRpdmUgZGV0ZWN0aW9uXG4iCisJImNvZGUgaXMgY3VycmVudGx5IGFibGUgdG8gcmVjb2duaXplOiBNRCBkZXZpY2Ugc2lnbmF0dXJlcyxcbiIKKwkic3dhcCBzaWduYXR1cmUsIGFuZCBMVUtTIHNpZ25hdHVyZXMuIFRvIHNlZSB0aGUgbGlzdCBvZiBzaWduYXR1cmVzXG4iCisJInJlY29nbml6ZWQgYnkgYmxraWQsIGNoZWNrIHRoZSBvdXRwdXQgb2YgdGhlICdibGtpZCAtaycgY29tbWFuZC5cbiIpCisKK2NmZyhhbGxvY2F0aW9uX3dpcGVfc2lnbmF0dXJlc193aGVuX3plcm9pbmdfbmV3X2x2c19DRkcsICJ3aXBlX3NpZ25hdHVyZXNfd2hlbl96ZXJvaW5nX25ld19sdnMiLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCAxLCB2c24oMiwgMiwgMTA1KSwgTlVMTCwgMCwgTlVMTCwKKwkiTG9vayBmb3IgYW5kIGVyYXNlIGFueSBzaWduYXR1cmVzIHdoaWxlIHplcm9pbmcgYSBuZXcgTFYuXG4iCisJIlRoZSAtLXdpcGVzaWduYXR1cmVzIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLlxuIgorCSJaZXJvaW5nIGlzIGNvbnRyb2xsZWQgYnkgdGhlIC1aLy0temVybyBvcHRpb24sIGFuZCBpZiBub3Qgc3BlY2lmaWVkLFxuIgorCSJ6ZXJvaW5nIGlzIHVzZWQgYnkgZGVmYXVsdCBpZiBwb3NzaWJsZS4gWmVyb2luZyBzaW1wbHkgb3ZlcndyaXRlcyB0aGVcbiIKKwkiZmlyc3QgNEtpQiBvZiBhIG5ldyBMViB3aXRoIHplcm9lcyBhbmQgZG9lcyBubyBzaWduYXR1cmUgZGV0ZWN0aW9uIG9yXG4iCisJIndpcGluZy4gU2lnbmF0dXJlIHdpcGluZyBnb2VzIGJleW9uZCB6ZXJvaW5nIGFuZCBkZXRlY3RzIGV4YWN0IHR5cGVzXG4iCisJImFuZCBwb3NpdGlvbnMgb2Ygc2lnbmF0dXJlcyB3aXRoaW4gdGhlIHdob2xlIExWLiBJdCBwcm92aWRlcyBhXG4iCisJImNsZWFuZXIgTFYgYWZ0ZXIgY3JlYXRpb24gYXMgYWxsIGtub3duIHNpZ25hdHVyZXMgYXJlIHdpcGVkLiBUaGUgTFZcbiIKKwkiaXMgbm90IGNsYWltZWQgaW5jb3JyZWN0bHkgYnkgb3RoZXIgdG9vbHMgYmVjYXVzZSBvZiBvbGQgc2lnbmF0dXJlc1xuIgorCSJmcm9tIHByZXZpb3VzIHVzZS4gVGhlIG51bWJlciBvZiBzaWduYXR1cmVzIHRoYXQgTFZNIGNhbiBkZXRlY3RcbiIKKwkiZGVwZW5kcyBvbiB0aGUgZGV0ZWN0aW9uIGNvZGUgdGhhdCBpcyBzZWxlY3RlZCAoc2VlXG4iCisJInVzZV9ibGtpZF93aXBpbmcuKSBXaXBpbmcgZWFjaCBkZXRlY3RlZCBzaWduYXR1cmUgbXVzdCBiZSBjb25maXJtZWQuXG4iCisJIldoZW4gdGhpcyBzZXR0aW5nIGlzIGRpc2FibGVkLCBzaWduYXR1cmVzIG9uIG5ldyBMVnMgYXJlIG5vdCBkZXRlY3RlZFxuIgorCSJvciBlcmFzZWQgdW5sZXNzIHRoZSAtLXdpcGVzaWduYXR1cmVzIG9wdGlvbiBpcyB1c2VkIGRpcmVjdGx5LlxuIikKKworY2ZnKGFsbG9jYXRpb25fbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnNfQ0ZHLCAibWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMiLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX01JUlJPUl9MT0dTX1JFUVVJUkVfU0VQQVJBVEVfUFZTLCB2c24oMiwgMiwgODUpLCBOVUxMLCAwLCBOVUxMLAorCSJNaXJyb3IgbG9ncyBhbmQgaW1hZ2VzIHdpbGwgYWx3YXlzIHVzZSBkaWZmZXJlbnQgUFZzLlxuIgorCSJUaGUgZGVmYXVsdCBzZXR0aW5nIGNoYW5nZWQgaW4gdmVyc2lvbiAyLjAyLjg1LlxuIikKKworY2ZnKGFsbG9jYXRpb25fcmFpZF9zdHJpcGVfYWxsX2RldmljZXNfQ0ZHLCAicmFpZF9zdHJpcGVfYWxsX2RldmljZXMiLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQUxMT0NBVElPTl9TVFJJUEVfQUxMX0RFVklDRVMsIHZzbigyLCAyLCAxNjIpLCBOVUxMLCAwLCBOVUxMLAorCSJTdHJpcGUgYWNyb3NzIGFsbCBQVnMgd2hlbiBSQUlEIHN0cmlwZXMgYXJlIG5vdCBzcGVjaWZpZWQuXG4iCisJIklmIGVuYWJsZWQsIGFsbCBQVnMgaW4gdGhlIFZHIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIHVzZWQgZm9yIHJhaWQwLzQvNS82LzEwXG4iCisJIndoZW4gdGhlIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHN0cmlwZXMgdG8gdXNlLlxuIgorCSJUaGlzIHdhcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgdW50aWwgcmVsZWFzZSAyLjAyLjE2Mi5cbiIpCisKK2NmZyhhbGxvY2F0aW9uX2NhY2hlX3Bvb2xfbWV0YWRhdGFfcmVxdWlyZV9zZXBhcmF0ZV9wdnNfQ0ZHLCAiY2FjaGVfcG9vbF9tZXRhZGF0YV9yZXF1aXJlX3NlcGFyYXRlX3B2cyIsIGFsbG9jYXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQ0FDSEVfUE9PTF9NRVRBREFUQV9SRVFVSVJFX1NFUEFSQVRFX1BWUywgdnNuKDIsIDIsIDEwNiksIE5VTEwsIDAsIE5VTEwsCisJIkNhY2hlIHBvb2wgbWV0YWRhdGEgYW5kIGRhdGEgd2lsbCBhbHdheXMgdXNlIGRpZmZlcmVudCBQVnMuXG4iKQorCitjZmcoYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NhY2hlbW9kZV9DRkcsICJjYWNoZV9wb29sX2NhY2hlbW9kZSIsIGFsbG9jYXRpb25fQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0NBQ0hFX01PREUsIHZzbigyLCAyLCAxMTMpLCBOVUxMLCB2c24oMiwgMiwgMTI4KSwKKwkiVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYWxsb2NhdGlvbi9jYWNoZV9tb2RlIHNldHRpbmcuXG4iLAorCSJDYWNoZSBtb2RlLlxuIikKKworY2ZnKGFsbG9jYXRpb25fY2FjaGVfbW9kZV9DRkcsICJjYWNoZV9tb2RlIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9DQUNIRV9NT0RFLCB2c24oMiwgMiwgMTI4KSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGRlZmF1bHQgY2FjaGUgbW9kZSB1c2VkIGZvciBuZXcgY2FjaGUuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIHdyaXRldGhyb3VnaFxuIgorCSIgICAgRGF0YSBibG9ja3MgYXJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gZnJvbSB0aGUgY2FjaGUgdG8gZGlzay5cbiIKKwkiICB3cml0ZWJhY2tcbiIKKwkiICAgIERhdGEgYmxvY2tzIGFyZSB3cml0dGVuIGZyb20gdGhlIGNhY2hlIGJhY2sgdG8gZGlzayBhZnRlciBzb21lXG4iCisJIiAgICBkZWxheSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuIgorCSIjXG4iCisJIlRoaXMgc2V0dGluZyByZXBsYWNlcyBhbGxvY2F0aW9uL2NhY2hlX3Bvb2xfY2FjaGVtb2RlLlxuIikKKworY2ZnKGFsbG9jYXRpb25fY2FjaGVfcG9saWN5X0NGRywgImNhY2hlX3BvbGljeSIsIGFsbG9jYXRpb25fQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIDAsIHZzbigyLCAyLCAxMjgpLCBOVUxMLCAwLCBOVUxMLAorCSJUaGUgZGVmYXVsdCBjYWNoZSBwb2xpY3kgdXNlZCBmb3IgbmV3IGNhY2hlIHZvbHVtZS5cbiIKKwkiU2luY2Uga2VybmVsIDQuMiB0aGUgZGVmYXVsdCBwb2xpY3kgaXMgc21xIChTdG9jaGFzdGljIG11bHRpcXVlKSxcbiIKKwkib3RoZXJ3aXNlIHRoZSBvbGRlciBtcSAoTXVsdGlxdWV1ZSkgcG9saWN5IGlzIHNlbGVjdGVkLlxuIikKKworY2ZnX3NlY3Rpb24oYWxsb2NhdGlvbl9jYWNoZV9zZXR0aW5nc19DRkdfU0VDVElPTiwgImNhY2hlX3NldHRpbmdzIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIHZzbigyLCAyLCAxMjgpLCAwLCBOVUxMLAorCSJTZXR0aW5ncyBmb3IgdGhlIGNhY2hlIHBvbGljeS5cbiIKKwkiU2VlIGRvY3VtZW50YXRpb24gZm9yIGluZGl2aWR1YWwgY2FjaGUgcG9saWNpZXMgZm9yIG1vcmUgaW5mby5cbiIpCisKK2NmZ19zZWN0aW9uKHBvbGljeV9zZXR0aW5nc19DRkdfU1VCU0VDVElPTiwgInBvbGljeV9zZXR0aW5ncyIsIGFsbG9jYXRpb25fY2FjaGVfc2V0dGluZ3NfQ0ZHX1NFQ1RJT04sIENGR19OQU1FX1ZBUklBQkxFIHwgQ0ZHX1NFQ1RJT05fTk9fQ0hFQ0sgfCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgdnNuKDIsIDIsIDEyOCksIDAsIE5VTEwsCisJIlJlcGxhY2UgdGhpcyBzdWJzZWN0aW9uIG5hbWUgd2l0aCBhIHBvbGljeSBuYW1lLlxuIgorCSJNdWx0aXBsZSBzdWJzZWN0aW9ucyBmb3IgZGlmZmVyZW50IHBvbGljaWVzIGNhbiBiZSBjcmVhdGVkLlxuIikKKworY2ZnX3J1bnRpbWUoYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NodW5rX3NpemVfQ0ZHLCAiY2FjaGVfcG9vbF9jaHVua19zaXplIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX0lOVCwgdnNuKDIsIDIsIDEwNiksIDAsIE5VTEwsCisJIlRoZSBtaW5pbWFsIGNodW5rIHNpemUgaW4gS2lCIGZvciBjYWNoZSBwb29sIHZvbHVtZXMuXG4iCisJIlVzaW5nIGEgY2h1bmtfc2l6ZSB0aGF0IGlzIHRvbyBsYXJnZSBjYW4gcmVzdWx0IGluIHdhc3RlZnVsIHVzZSBvZlxuIgorCSJ0aGUgY2FjaGUsIHdoZXJlIHNtYWxsIHJlYWRzIGFuZCB3cml0ZXMgY2FuIGNhdXNlIGxhcmdlIHNlY3Rpb25zIG9mXG4iCisJImFuIExWIHRvIGJlIG1hcHBlZCBpbnRvIHRoZSBjYWNoZS4gSG93ZXZlciwgY2hvb3NpbmcgYSBjaHVua19zaXplXG4iCisJInRoYXQgaXMgdG9vIHNtYWxsIGNhbiByZXN1bHQgaW4gbW9yZSBvdmVyaGVhZCB0cnlpbmcgdG8gbWFuYWdlIHRoZVxuIgorCSJudW1lcm91cyBjaHVua3MgdGhhdCBiZWNvbWUgbWFwcGVkIGludG8gdGhlIGNhY2hlLiBUaGUgZm9ybWVyIGlzXG4iCisJIm1vcmUgb2YgYSBwcm9ibGVtIHRoYW4gdGhlIGxhdHRlciBpbiBtb3N0IGNhc2VzLCBzbyB0aGUgZGVmYXVsdCBpc1xuIgorCSJvbiB0aGUgc21hbGxlciBlbmQgb2YgdGhlIHNwZWN0cnVtLiBTdXBwb3J0ZWQgdmFsdWVzIHJhbmdlIGZyb21cbiIKKwkiMzJLaUIgdG8gMUdpQiBpbiBtdWx0aXBsZXMgb2YgMzIuXG4iKQorCitjZmcoYWxsb2NhdGlvbl90aGluX3Bvb2xfbWV0YWRhdGFfcmVxdWlyZV9zZXBhcmF0ZV9wdnNfQ0ZHLCAidGhpbl9wb29sX21ldGFkYXRhX3JlcXVpcmVfc2VwYXJhdGVfcHZzIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9USElOX1BPT0xfTUVUQURBVEFfUkVRVUlSRV9TRVBBUkFURV9QVlMsIHZzbigyLCAyLCA4OSksIE5VTEwsIDAsIE5VTEwsCisJIlRoaW4gcG9vbCBtZXRkYXRhIGFuZCBkYXRhIHdpbGwgYWx3YXlzIHVzZSBkaWZmZXJlbnQgUFZzLlxuIikKKworY2ZnKGFsbG9jYXRpb25fdGhpbl9wb29sX3plcm9fQ0ZHLCAidGhpbl9wb29sX3plcm8iLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19QUk9GSUxBQkxFX01FVEFEQVRBIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1RISU5fUE9PTF9aRVJPLCB2c24oMiwgMiwgOTkpLCBOVUxMLCAwLCBOVUxMLAorCSJUaGluIHBvb2wgZGF0YSBjaHVua3MgYXJlIHplcm9lZCBiZWZvcmUgdGhleSBhcmUgZmlyc3QgdXNlZC5cbiIKKwkiWmVyb2luZyB3aXRoIGEgbGFyZ2VyIHRoaW4gcG9vbCBjaHVuayBzaXplIHJlZHVjZXMgcGVyZm9ybWFuY2UuXG4iKQorCitjZmcoYWxsb2NhdGlvbl90aGluX3Bvb2xfZGlzY2FyZHNfQ0ZHLCAidGhpbl9wb29sX2Rpc2NhcmRzIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfUFJPRklMQUJMRV9NRVRBREFUQSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1RISU5fUE9PTF9ESVNDQVJEUywgdnNuKDIsIDIsIDk5KSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGRpc2NhcmRzIGJlaGF2aW91ciBvZiB0aGluIHBvb2wgdm9sdW1lcy5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgaWdub3JlXG4iCisJIiAgbm9wYXNzZG93blxuIgorCSIgIHBhc3Nkb3duXG4iCisJIiNcbiIpCisKK2NmZyhhbGxvY2F0aW9uX3RoaW5fcG9vbF9jaHVua19zaXplX3BvbGljeV9DRkcsICJ0aGluX3Bvb2xfY2h1bmtfc2l6ZV9wb2xpY3kiLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19QUk9GSUxBQkxFX01FVEFEQVRBIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfVEhJTl9QT09MX0NIVU5LX1NJWkVfUE9MSUNZLCB2c24oMiwgMiwgMTAxKSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGNodW5rIHNpemUgY2FsY3VsYXRpb24gcG9saWN5IGZvciB0aGluIHBvb2wgdm9sdW1lcy5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgZ2VuZXJpY1xuIgorCSIgICAgSWYgdGhpbl9wb29sX2NodW5rX3NpemUgaXMgZGVmaW5lZCwgdXNlIGl0LiBPdGhlcndpc2UsIGNhbGN1bGF0ZVxuIgorCSIgICAgdGhlIGNodW5rIHNpemUgYmFzZWQgb24gZXN0aW1hdGlvbiBhbmQgZGV2aWNlIGhpbnRzIGV4cG9zZWQgaW5cbiIKKwkiICAgIHN5c2ZzIC0gdGhlIG1pbmltdW1faW9fc2l6ZS4gVGhlIGNodW5rIHNpemUgaXMgYWx3YXlzIGF0IGxlYXN0XG4iCisJIiAgICA2NEtpQi5cbiIKKwkiICBwZXJmb3JtYW5jZVxuIgorCSIgICAgSWYgdGhpbl9wb29sX2NodW5rX3NpemUgaXMgZGVmaW5lZCwgdXNlIGl0LiBPdGhlcndpc2UsIGNhbGN1bGF0ZVxuIgorCSIgICAgdGhlIGNodW5rIHNpemUgZm9yIHBlcmZvcm1hbmNlIGJhc2VkIG9uIGRldmljZSBoaW50cyBleHBvc2VkIGluXG4iCisJIiAgICBzeXNmcyAtIHRoZSBvcHRpbWFsX2lvX3NpemUuIFRoZSBjaHVuayBzaXplIGlzIGFsd2F5cyBhdCBsZWFzdFxuIgorCSIgICAgNTEyS2lCLlxuIgorCSIjXG4iKQorCitjZmdfcnVudGltZShhbGxvY2F0aW9uX3RoaW5fcG9vbF9jaHVua19zaXplX0NGRywgInRoaW5fcG9vbF9jaHVua19zaXplIiwgYWxsb2NhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfUFJPRklMQUJMRV9NRVRBREFUQSB8IENGR19ERUZBVUxUX1VOREVGSU5FRCwgQ0ZHX1RZUEVfSU5ULCB2c24oMiwgMiwgOTkpLCAwLCBOVUxMLAorCSJUaGUgbWluaW1hbCBjaHVuayBzaXplIGluIEtpQiBmb3IgdGhpbiBwb29sIHZvbHVtZXMuXG4iCisJIkxhcmdlciBjaHVuayBzaXplcyBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgcGxhaW4gdGhpbiB2b2x1bWVzLFxuIgorCSJob3dldmVyIHVzaW5nIHRoZW0gZm9yIHNuYXBzaG90IHZvbHVtZXMgaXMgbGVzcyBlZmZpY2llbnQsIGFzIGl0XG4iCisJImNvbnN1bWVzIG1vcmUgc3BhY2UgYW5kIHRha2VzIGV4dHJhIHRpbWUgZm9yIGNvcHlpbmcuIFdoZW4gdW5zZXQsXG4iCisJImx2bSB0cmllcyB0byBlc3RpbWF0ZSBjaHVuayBzaXplIHN0YXJ0aW5nIGZyb20gNjRLaUIuIFN1cHBvcnRlZFxuIgorCSJ2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSA2NEtpQiB0byAxR2lCLlxuIikKKworY2ZnKGFsbG9jYXRpb25fcGh5c2ljYWxfZXh0ZW50X3NpemVfQ0ZHLCAicGh5c2ljYWxfZXh0ZW50X3NpemUiLCBhbGxvY2F0aW9uX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0lOVCwgREVGQVVMVF9FWFRFTlRfU0laRSwgdnNuKDIsIDIsIDExMiksIE5VTEwsIDAsIE5VTEwsCisJIkRlZmF1bHQgcGh5c2ljYWwgZXh0ZW50IHNpemUgaW4gS2lCIHRvIHVzZSBmb3IgbmV3IFZHcy5cbiIpCisKK2NmZyhsb2dfcmVwb3J0X2NvbW1hbmRfbG9nX0NGRywgInJlcG9ydF9jb21tYW5kX2xvZyIsIGxvZ19DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQ09NTUFORF9MT0dfUkVQT1JULCB2c24oMiwgMiwgMTU4KSwgTlVMTCwgMCwgTlVMTCwKKwkiRW5hYmxlIG9yIGRpc2FibGUgTFZNIGxvZyByZXBvcnRpbmcuXG4iCisJIklmIGVuYWJsZWQsIExWTSB3aWxsIGNvbGxlY3QgYSBsb2cgb2Ygb3BlcmF0aW9ucywgbWVzc2FnZXMsXG4iCisJInBlci1vYmplY3QgcmV0dXJuIGNvZGVzIHdpdGggb2JqZWN0IGlkZW50aWZpY2F0aW9uIGFuZCBhc3NvY2lhdGVkXG4iCisJImVycm9yIG51bWJlcnMgKGVycm5vcykgZHVyaW5nIExWTSBjb21tYW5kIHByb2Nlc3NpbmcuIFRoZW4gdGhlXG4iCisJImxvZyBpcyBlaXRoZXIgcmVwb3J0ZWQgc29sZWx5IG9yIGluIGFkZGl0aW9uIHRvIGFueSBleGlzdGluZ1xuIgorCSJyZXBvcnRzLCBkZXBlbmRpbmcgb24gTFZNIGNvbW1hbmQgdXNlZC4gSWYgaXQgaXMgYSByZXBvcnRpbmcgY29tbWFuZFxuIgorCSIoZS5nLiBwdnMsIHZncywgbHZzLCBsdm0gZnVsbHJlcG9ydCksIHRoZW4gdGhlIGxvZyBpcyByZXBvcnRlZCBpblxuIgorCSJhZGRpdGlvbiB0byBhbnkgZXhpc3RpbmcgcmVwb3J0cy4gT3RoZXJ3aXNlLCB0aGVyZSdzIG9ubHkgbG9nIHJlcG9ydFxuIgorCSJvbiBvdXRwdXQuIEZvciBhbGwgYXBwbGljYWJsZSBMVk0gY29tbWFuZHMsIHlvdSBjYW4gcmVxdWVzdCB0aGF0XG4iCisJInRoZSBvdXRwdXQgaGFzIG9ubHkgbG9nIHJlcG9ydCBieSB1c2luZyAtLWxvZ29ubHkgY29tbWFuZCBsaW5lXG4iCisJIm9wdGlvbi4gVXNlIGxvZy9jb21tYW5kX2xvZ19jb2xzIGFuZCBsb2cvY29tbWFuZF9sb2dfc29ydCBzZXR0aW5nc1xuIgorCSJ0byBkZWZpbmUgZmllbGRzIHRvIGRpc3BsYXkgYW5kIHNvcnQgZmllbGRzIGZvciB0aGUgbG9nIHJlcG9ydC5cbiIKKwkiWW91IGNhbiBhbHNvIHVzZSBsb2cvY29tbWFuZF9sb2dfc2VsZWN0aW9uIHRvIGRlZmluZSBzZWxlY3Rpb25cbiIKKwkiY3JpdGVyaWEgdXNlZCBlYWNoIHRpbWUgdGhlIGxvZyBpcyByZXBvcnRlZC5cbiIpCisKK2NmZyhsb2dfY29tbWFuZF9sb2dfc29ydF9DRkcsICJjb21tYW5kX2xvZ19zb3J0IiwgbG9nX0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0NPTU1BTkRfTE9HX1NPUlQsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyBjb21tYW5kIGxvZy5cbiIKKwkiU2VlIDxsdm0gY29tbWFuZD4gLS1sb2dvbmx5IC0tY29uZmlncmVwb3J0IGxvZyAtbyBoZWxwXG4iCisJImZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcobG9nX2NvbW1hbmRfbG9nX2NvbHNfQ0ZHLCAiY29tbWFuZF9sb2dfY29scyIsIGxvZ19DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9DT01NQU5EX0xPR19DT0xTLCB2c24oMiwgMiwgMTU4KSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCB3aGVuIHJlcG9ydGluZyBjb21tYW5kIGxvZy5cbiIKKwkiU2VlIDxsdm0gY29tbWFuZD4gLS1sb2dvbmx5IC0tY29uZmlncmVwb3J0IGxvZyAtbyBoZWxwXG4iCisJImZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcobG9nX2NvbW1hbmRfbG9nX3NlbGVjdGlvbl9DRkcsICJjb21tYW5kX2xvZ19zZWxlY3Rpb24iLCBsb2dfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfQ09NTUFORF9MT0dfU0VMRUNUSU9OLCB2c24oMiwgMiwgMTU4KSwgTlVMTCwgMCwgTlVMTCwKKwkiU2VsZWN0aW9uIGNyaXRlcmlhIHVzZWQgd2hlbiByZXBvcnRpbmcgY29tbWFuZCBsb2cuXG4iCisJIllvdSBjYW4gZGVmaW5lIHNlbGVjdGlvbiBjcml0ZXJpYSB0aGF0IGFyZSBhcHBsaWVkIGVhY2hcbiIKKwkidGltZSBsb2cgaXMgcmVwb3J0ZWQuIFRoaXMgd2F5LCBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIHRoZVxuIgorCSJhbW91bnQgb2YgbG9nIHRoYXQgaXMgZGlzcGxheWVkIG9uIG91dHB1dCBhbmQgeW91IGNhbiBzZWxlY3RcbiIKKwkib25seSBwYXJ0cyBvZiB0aGUgbG9nIHRoYXQgYXJlIGltcG9ydGFudCBmb3IgeW91LiBUbyBkZWZpbmVcbiIKKwkic2VsZWN0aW9uIGNyaXRlcmlhLCB1c2UgZmllbGRzIGZyb20gbG9nIHJlcG9ydC4gU2VlIGFsc29cbiIKKwkiPGx2bSBjb21tYW5kPiAtLWxvZ29ubHkgLS1jb25maWdyZXBvcnQgbG9nIC1TIGhlbHAgZm9yIHRoZVxuIgorCSJsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcyBhbmQgc2VsZWN0aW9uIG9wZXJhdG9ycy4gWW91IGNhbiBhbHNvXG4iCisJImRlZmluZSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIGxvZyByZXBvcnQgb24gY29tbWFuZCBsaW5lIGRpcmVjdGx5XG4iCisJInVzaW5nIDxsdm0gY29tbWFuZD4gLS1jb25maWdyZXBvcnQgbG9nIC1TIDxzZWxlY3Rpb24gY3JpdGVyaWE+XG4iCisJIndoaWNoIGhhcyBwcmVjZWRlbmNlIG92ZXIgbG9nL2NvbW1hbmRfbG9nX3NlbGVjdGlvbiBzZXR0aW5nLlxuIgorCSJGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZWxlY3Rpb24gY3JpdGVyaWEgaW4gZ2VuZXJhbCwgc2VlXG4iCisJImx2bSg4KSBtYW4gcGFnZS5cbiIpCisKK2NmZyhsb2dfdmVyYm9zZV9DRkcsICJ2ZXJib3NlIiwgbG9nX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfVkVSQk9TRSwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJDb250cm9scyB0aGUgbWVzc2FnZXMgc2VudCB0byBzdGRvdXQgb3Igc3RkZXJyLlxuIikKKworY2ZnKGxvZ19zaWxlbnRfQ0ZHLCAic2lsZW50IiwgbG9nX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1NJTEVOVCwgdnNuKDIsIDIsIDk4KSwgTlVMTCwgMCwgTlVMTCwKKwkiU3VwcHJlc3MgYWxsIG5vbi1lc3NlbnRpYWwgbWVzc2FnZXMgZnJvbSBzdGRvdXQuXG4iCisJIlRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyAtcXEuIFdoZW4gZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBjb21tYW5kc1xuIgorCSJzdGlsbCBwcm9kdWNlIG91dHB1dDogZHVtcGNvbmZpZywgbHZkaXNwbGF5LCBsdm1kaXNrc2NhbiwgbHZzLCBwdmNrLFxuIgorCSJwdmRpc3BsYXksIHB2cywgdmVyc2lvbiwgdmdjZmdyZXN0b3JlIC1sLCB2Z2Rpc3BsYXksIHZncy5cbiIKKwkiTm9uLWVzc2VudGlhbCBtZXNzYWdlcyBhcmUgc2hpZnRlZCBmcm9tIGxvZyBsZXZlbCA0IHRvIGxvZyBsZXZlbCA1XG4iCisJImZvciBzeXNsb2cgYW5kIGx2bTJfbG9nX2ZuIHB1cnBvc2VzLlxuIgorCSJBbnkgJ3llcycgb3IgJ25vJyBxdWVzdGlvbnMgbm90IG92ZXJyaWRkZW4gYnkgb3RoZXIgYXJndW1lbnRzIGFyZVxuIgorCSJzdXBwcmVzc2VkIGFuZCBkZWZhdWx0IHRvICdubycuXG4iKQorCitjZmcobG9nX3N5c2xvZ19DRkcsICJzeXNsb2ciLCBsb2dfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfU1lTTE9HLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIlNlbmQgbG9nIG1lc3NhZ2VzIHRocm91Z2ggc3lzbG9nLlxuIikKKworY2ZnKGxvZ19maWxlX0NGRywgImZpbGUiLCBsb2dfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX1VOREVGSU5FRCwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIldyaXRlIGVycm9yIGFuZCBkZWJ1ZyBsb2cgbWVzc2FnZXMgdG8gYSBmaWxlIHNwZWNpZmllZCBoZXJlLlxuIikKKworY2ZnKGxvZ19vdmVyd3JpdGVfQ0ZHLCAib3ZlcndyaXRlIiwgbG9nX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX09WRVJXUklURSwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJPdmVyd3JpdGUgdGhlIGxvZyBmaWxlIGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBpcyBydW4uXG4iKQorCitjZmcobG9nX2xldmVsX0NGRywgImxldmVsIiwgbG9nX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfTE9HTEVWRUwsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGxldmVsIG9mIGxvZyBtZXNzYWdlcyB0aGF0IGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSBvciBzeXNsb2cuXG4iCisJIlRoZXJlIGFyZSA2IHN5c2xvZy1saWtlIGxvZyBsZXZlbHMgY3VycmVudGx5IGluIHVzZTogMiB0byA3IGluY2x1c2l2ZS5cbiIKKwkiNyBpcyB0aGUgbW9zdCB2ZXJib3NlIChMT0dfREVCVUcpLlxuIikKKworY2ZnKGxvZ19pbmRlbnRfQ0ZHLCAiaW5kZW50IiwgbG9nX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX0lOREVOVCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJJbmRlbnQgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHNldmVyaXR5LlxuIikKKworY2ZnKGxvZ19jb21tYW5kX25hbWVzX0NGRywgImNvbW1hbmRfbmFtZXMiLCBsb2dfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQ01EX05BTUUsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiRGlzcGxheSB0aGUgY29tbWFuZCBuYW1lIG9uIGVhY2ggbGluZSBvZiBvdXRwdXQuXG4iKQorCitjZmcobG9nX3ByZWZpeF9DRkcsICJwcmVmaXgiLCBsb2dfQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWSwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX01TR19QUkVGSVgsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiQSBwcmVmaXggdG8gdXNlIGJlZm9yZSB0aGUgbG9nIG1lc3NhZ2UgdGV4dC5cbiIKKwkiKEFmdGVyIHRoZSBjb21tYW5kIG5hbWUsIGlmIHNlbGVjdGVkKS5cbiIKKwkiVHdvIHNwYWNlcyBhbGxvd3MgeW91IHRvIHNlZS9ncmVwIHRoZSBzZXZlcml0eSBvZiBlYWNoIG1lc3NhZ2UuXG4iCisJIlRvIG1ha2UgdGhlIG1lc3NhZ2VzIGxvb2sgc2ltaWxhciB0byB0aGUgb3JpZ2luYWwgTFZNIHRvb2xzIHVzZTpcbiIKKwkiaW5kZW50ID0gMCwgY29tbWFuZF9uYW1lcyA9IDEsIHByZWZpeCA9IFwiIC0tIFwiXG4iKQorCitjZmcobG9nX2FjdGl2YXRpb25fQ0ZHLCAiYWN0aXZhdGlvbiIsIGxvZ19DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgMCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMb2cgbWVzc2FnZXMgZHVyaW5nIGFjdGl2YXRpb24uXG4iCisJIkRvbid0IHVzZSB0aGlzIGluIGxvdyBtZW1vcnkgc2l0dWF0aW9ucyAoY2FuIGRlYWRsb2NrKS5cbiIpCisKK2NmZyhsb2dfYWN0aXZhdGVfZmlsZV9DRkcsICJhY3RpdmF0ZV9maWxlIiwgbG9nX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQgfCBDRkdfVU5TVVBQT1JURUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLCBOVUxMKQorCitjZmdfYXJyYXkobG9nX2RlYnVnX2NsYXNzZXNfQ0ZHLCAiZGVidWdfY2xhc3NlcyIsIGxvZ19DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZLCBDRkdfVFlQRV9TVFJJTkcsICIjU21lbW9yeSNTZGV2aWNlcyNTYWN0aXZhdGlvbiNTYWxsb2NhdGlvbiNTbHZtZXRhZCNTbWV0YWRhdGEjU2NhY2hlI1Nsb2NraW5nI1Nsdm1wb2xsZCNTZGJ1cyIsIHZzbigyLCAyLCA5OSksIE5VTEwsIDAsIE5VTEwsCisJIlNlbGVjdCBsb2cgbWVzc2FnZXMgYnkgY2xhc3MuXG4iCisJIlNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzIGFyZSBhc3NpZ25lZCB0byBhIGNsYXNzIGFuZCBvbmx5IGFwcGVhciBpblxuIgorCSJkZWJ1ZyBvdXRwdXQgaWYgdGhlIGNsYXNzIGlzIGxpc3RlZCBoZXJlLiBDbGFzc2VzIGN1cnJlbnRseVxuIgorCSJhdmFpbGFibGU6IG1lbW9yeSwgZGV2aWNlcywgYWN0aXZhdGlvbiwgYWxsb2NhdGlvbiwgbHZtZXRhZCxcbiIKKwkibWV0YWRhdGEsIGNhY2hlLCBsb2NraW5nLCBsdm1wb2xsZC4gVXNlIFwiYWxsXCIgdG8gc2VlIGV2ZXJ5dGhpbmcuXG4iKQorCitjZmcoYmFja3VwX2JhY2t1cF9DRkcsICJiYWNrdXAiLCBiYWNrdXBfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQkFDS1VQX0VOQUJMRUQsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTWFpbnRhaW4gYSBiYWNrdXAgb2YgdGhlIGN1cnJlbnQgbWV0YWRhdGEgY29uZmlndXJhdGlvbi5cbiIKKwkiVGhpbmsgdmVyeSBoYXJkIGJlZm9yZSB0dXJuaW5nIHRoaXMgb2ZmIVxuIikKKworY2ZnX3J1bnRpbWUoYmFja3VwX2JhY2t1cF9kaXJfQ0ZHLCAiYmFja3VwX2RpciIsIGJhY2t1cF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCB2c24oMSwgMCwgMCksIDAsIE5VTEwsCisJIkxvY2F0aW9uIG9mIHRoZSBtZXRhZGF0YSBiYWNrdXAgZmlsZXMuXG4iCisJIlJlbWVtYmVyIHRvIGJhY2sgdXAgdGhpcyBkaXJlY3RvcnkgcmVndWxhcmx5IVxuIikKKworY2ZnKGJhY2t1cF9hcmNoaXZlX0NGRywgImFyY2hpdmUiLCBiYWNrdXBfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQVJDSElWRV9FTkFCTEVELCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIk1haW50YWluIGFuIGFyY2hpdmUgb2Ygb2xkIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb25zLlxuIgorCSJUaGluayB2ZXJ5IGhhcmQgYmVmb3JlIHR1cm5pbmcgdGhpcyBvZmYuXG4iKQorCitjZmdfcnVudGltZShiYWNrdXBfYXJjaGl2ZV9kaXJfQ0ZHLCAiYXJjaGl2ZV9kaXIiLCBiYWNrdXBfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgdnNuKDEsIDAsIDApLCAwLCBOVUxMLAorCSJMb2NhdGlvbiBvZiB0aGUgbWV0ZGF0YSBhcmNoaXZlIGZpbGVzLlxuIgorCSJSZW1lbWJlciB0byBiYWNrIHVwIHRoaXMgZGlyZWN0b3J5IHJlZ3VsYXJseSFcbiIpCisKK2NmZyhiYWNrdXBfcmV0YWluX21pbl9DRkcsICJyZXRhaW5fbWluIiwgYmFja3VwX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfQVJDSElWRV9OVU1CRVIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTWluaW11bSBudW1iZXIgb2YgYXJjaGl2ZXMgdG8ga2VlcC5cbiIpCisKK2NmZyhiYWNrdXBfcmV0YWluX2RheXNfQ0ZHLCAicmV0YWluX2RheXMiLCBiYWNrdXBfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9BUkNISVZFX0RBWVMsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTWluaW11bSBudW1iZXIgb2YgZGF5cyB0byBrZWVwIGFyY2hpdmUgZmlsZXMuXG4iKQorCitjZmcoc2hlbGxfaGlzdG9yeV9zaXplX0NGRywgImhpc3Rvcnlfc2l6ZSIsIHNoZWxsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfTUFYX0hJU1RPUlksIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTnVtYmVyIG9mIGxpbmVzIG9mIGhpc3RvcnkgdG8gc3RvcmUgaW4gfi8ubHZtX2hpc3RvcnkuXG4iKQorCitjZmcoZ2xvYmFsX3VtYXNrX0NGRywgInVtYXNrIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfRk9STUFUX0lOVF9PQ1RBTCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1VNQVNLLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBmaWxlIGNyZWF0aW9uIG1hc2sgZm9yIGFueSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3JlYXRlZC5cbiIKKwkiSW50ZXJwcmV0ZWQgYXMgb2N0YWwgaWYgdGhlIGZpcnN0IGRpZ2l0IGlzIHplcm8uXG4iKQorCitjZmcoZ2xvYmFsX3Rlc3RfQ0ZHLCAidGVzdCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgMCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJObyBvbi1kaXNrIG1ldGFkYXRhIGNoYW5nZXMgd2lsbCBiZSBtYWRlIGluIHRlc3QgbW9kZS5cbiIKKwkiRXF1aXZhbGVudCB0byBoYXZpbmcgdGhlIC10IG9wdGlvbiBvbiBldmVyeSBjb21tYW5kLlxuIikKKworY2ZnKGdsb2JhbF91bml0c19DRkcsICJ1bml0cyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9VTklUUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJEZWZhdWx0IHZhbHVlIGZvciAtLXVuaXRzIGFyZ3VtZW50LlxuIikKKworY2ZnKGdsb2JhbF9zaV91bml0X2NvbnNpc3RlbmN5X0NGRywgInNpX3VuaXRfY29uc2lzdGVuY3kiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1NJX1VOSVRfQ09OU0lTVEVOQ1ksICB2c24oMiwgMiwgNTQpLCBOVUxMLCAwLCBOVUxMLAorCSJEaXN0aW5ndWlzaCBiZXR3ZWVuIHBvd2VycyBvZiAxMDI0IGFuZCAxMDAwIGJ5dGVzLlxuIgorCSJUaGUgTFZNIGNvbW1hbmRzIGRpc3Rpbmd1aXNoIGJldHdlZW4gcG93ZXJzIG9mIDEwMjQgYnl0ZXMsXG4iCisJImUuZy4gS2lCLCBNaUIsIEdpQiwgYW5kIHBvd2VycyBvZiAxMDAwIGJ5dGVzLCBlLmcuIEtCLCBNQiwgR0IuXG4iCisJIklmIHNjcmlwdHMgZGVwZW5kIG9uIHRoZSBvbGQgYmVoYXZpb3VyLCBkaXNhYmxlIHRoaXMgc2V0dGluZ1xuIgorCSJ0ZW1wb3JhcmlseSB1bnRpbCB0aGV5IGFyZSB1cGRhdGVkLlxuIikKKworY2ZnKGdsb2JhbF9zdWZmaXhfQ0ZHLCAic3VmZml4IiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9TVUZGSVgsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiRGlzcGxheSB1bml0IHN1ZmZpeCBmb3Igc2l6ZXMuXG4iCisJIlRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0IGlmIHRoZSB1bml0cyBhcmUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybVxuIgorCSIoZ2xvYmFsL3VuaXRzID0gXCJoXCIpIGluIHdoaWNoIGNhc2UgdGhlIHN1ZmZpeCBpcyBhbHdheXMgZGlzcGxheWVkLlxuIikKKworY2ZnKGdsb2JhbF9hY3RpdmF0aW9uX0NGRywgImFjdGl2YXRpb24iLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQUNUSVZBVElPTiwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJFbmFibGUvZGlzYWJsZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGtlcm5lbCBkZXZpY2UtbWFwcGVyLlxuIgorCSJEaXNhYmxlIHRvIHVzZSB0aGUgdG9vbHMgdG8gbWFuaXB1bGF0ZSBMVk0gbWV0YWRhdGEgd2l0aG91dFxuIgorCSJhY3RpdmF0aW5nIGFueSBsb2dpY2FsIHZvbHVtZXMuIElmIHRoZSBkZXZpY2UtbWFwcGVyIGRyaXZlclxuIgorCSJpcyBub3QgcHJlc2VudCBpbiB0aGUga2VybmVsLCBkaXNhYmxpbmcgdGhpcyBzaG91bGQgc3VwcHJlc3NcbiIKKwkidGhlIGVycm9yIG1lc3NhZ2VzLlxuIikKKworY2ZnKGdsb2JhbF9mYWxsYmFja190b19sdm0xX0NGRywgImZhbGxiYWNrX3RvX2x2bTEiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9GQUxMQkFDS19UT19MVk0xLCB2c24oMSwgMCwgMTgpLCAiQERFRkFVTFRfRkFMTEJBQ0tfVE9fTFZNMUAiLCAwLCBOVUxMLAorCSJUcnkgcnVubmluZyBMVk0xIHRvb2xzIGlmIExWTSBjYW5ub3QgY29tbXVuaWNhdGUgd2l0aCBETS5cbiIKKwkiVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIDIuNCBrZXJuZWxzIGFuZCBpcyBwcm92aWRlZCB0byBoZWxwXG4iCisJInN3aXRjaCBiZXR3ZWVuIGRldmljZS1tYXBwZXIga2VybmVscyBhbmQgTFZNMSBrZXJuZWxzLiBUaGUgTFZNMVxuIgorCSJ0b29scyBuZWVkIHRvIGJlIGluc3RhbGxlZCB3aXRoIC5sdm0xIHN1ZmZpY2VzLCBlLmcuIHZnc2Nhbi5sdm0xLlxuIgorCSJUaGV5IHdpbGwgc3RvcCB3b3JraW5nIG9uY2UgdGhlIGx2bTIgb24tZGlzayBtZXRhZGF0YSBmb3JtYXQgaXMgdXNlZC5cbiIpCisKK2NmZyhnbG9iYWxfZm9ybWF0X0NGRywgImZvcm1hdCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfRk9STUFULCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBkZWZhdWx0IG1ldGFkYXRhIGZvcm1hdCB0aGF0IGNvbW1hbmRzIHNob3VsZCB1c2UuXG4iCisJIlRoZSAtTSAxfDIgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIGx2bTFcbiIKKwkiICBsdm0yXG4iCisJIiNcbiIpCisKK2NmZ19hcnJheShnbG9iYWxfZm9ybWF0X2xpYnJhcmllc19DRkcsICJmb3JtYXRfbGlicmFyaWVzIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJTaGFyZWQgbGlicmFyaWVzIHRoYXQgcHJvY2VzcyBkaWZmZXJlbnQgbWV0YWRhdGEgZm9ybWF0cy5cbiIKKwkiSWYgc3VwcG9ydCBmb3IgTFZNMSBtZXRhZGF0YSB3YXMgY29tcGlsZWQgYXMgYSBzaGFyZWQgbGlicmFyeSB1c2VcbiIKKwkiZm9ybWF0X2xpYnJhcmllcyA9IFwibGlibHZtMmZvcm1hdDEuc29cIlxuIikKKworY2ZnX2FycmF5KGdsb2JhbF9zZWdtZW50X2xpYnJhcmllc19DRkcsICJzZWdtZW50X2xpYnJhcmllcyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigxLCAwLCAxOCksIE5VTEwsIDAsIE5VTEwsIE5VTEwpCisKK2NmZyhnbG9iYWxfcHJvY19DRkcsICJwcm9jIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfQURWQU5DRUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9QUk9DX0RJUiwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMb2NhdGlvbiBvZiBwcm9jIGZpbGVzeXN0ZW0uXG4iKQorCitjZmcoZ2xvYmFsX2V0Y19DRkcsICJldGMiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9FVENfRElSLCB2c24oMiwgMiwgMTE3KSwgIkBDT05GRElSQCIsIDAsIE5VTEwsCisJIkxvY2F0aW9uIG9mIC9ldGMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LlxuIikKKworY2ZnKGdsb2JhbF9sb2NraW5nX3R5cGVfQ0ZHLCAibG9ja2luZ190eXBlIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIDEsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiVHlwZSBvZiBsb2NraW5nIHRvIHVzZS5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgMFxuIgorCSIgICAgVHVybnMgb2ZmIGxvY2tpbmcuIFdhcm5pbmc6IHRoaXMgcmlza3MgbWV0YWRhdGEgY29ycnVwdGlvbiBpZlxuIgorCSIgICAgY29tbWFuZHMgcnVuIGNvbmN1cnJlbnRseS5cbiIKKwkiICAxXG4iCisJIiAgICBMVk0gdXNlcyBsb2NhbCBmaWxlLWJhc2VkIGxvY2tpbmcsIHRoZSBzdGFuZGFyZCBtb2RlLlxuIgorCSIgIDJcbiIKKwkiICAgIExWTSB1c2VzIHRoZSBleHRlcm5hbCBzaGFyZWQgbGlicmFyeSBsb2NraW5nX2xpYnJhcnkuXG4iCisJIiAgM1xuIgorCSIgICAgTFZNIHVzZXMgYnVpbHQtaW4gY2x1c3RlcmVkIGxvY2tpbmcgd2l0aCBjbHZtZC5cbiIKKwkiICAgIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggbHZtZXRhZC4gSWYgdXNlX2x2bWV0YWQgaXMgZW5hYmxlZCxcbiIKKwkiICAgIExWTSBwcmludHMgYSB3YXJuaW5nIGFuZCBkaXNhYmxlcyBsdm1ldGFkIHVzZS5cbiIKKwkiICA0XG4iCisJIiAgICBMVk0gdXNlcyByZWFkLW9ubHkgbG9ja2luZyB3aGljaCBmb3JiaWRzIGFueSBvcGVyYXRpb25zIHRoYXRcbiIKKwkiICAgIG1pZ2h0IGNoYW5nZSBtZXRhZGF0YS5cbiIKKwkiICA1XG4iCisJIiAgICBPZmZlcnMgZHVtbXkgbG9ja2luZyBmb3IgdG9vbHMgdGhhdCBkbyBub3QgbmVlZCBhbnkgbG9ja3MuXG4iCisJIiAgICBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIHNldCB0aGlzIGRpcmVjdGx5OyB0aGUgdG9vbHMgd2lsbCBzZWxlY3RcbiIKKwkiICAgIHdoZW4gdG8gdXNlIGl0IGluc3RlYWQgb2YgdGhlIGNvbmZpZ3VyZWQgbG9ja2luZ190eXBlLlxuIgorCSIgICAgRG8gbm90IHVzZSBsdm1ldGFkIG9yIHRoZSBrZXJuZWwgZGV2aWNlLW1hcHBlciBkcml2ZXIgd2l0aCB0aGlzXG4iCisJIiAgICBsb2NraW5nIHR5cGUuIEl0IGlzIHVzZWQgYnkgdGhlIC0tcmVhZG9ubHkgb3B0aW9uIHRoYXQgb2ZmZXJzXG4iCisJIiAgICByZWFkLW9ubHkgYWNjZXNzIHRvIFZvbHVtZSBHcm91cCBtZXRhZGF0YSB0aGF0IGNhbm5vdCBiZSBsb2NrZWRcbiIKKwkiICAgIHNhZmVseSBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gYW4gaW5hY2Nlc3NpYmxlIGRvbWFpbiBhbmQgbWlnaHQgYmVcbiIKKwkiICAgIGluIHVzZSwgZm9yIGV4YW1wbGUgYSB2aXJ0dWFsIG1hY2hpbmUgaW1hZ2Ugb3IgYSBkaXNrIHRoYXQgaXNcbiIKKwkiICAgIHNoYXJlZCBieSBhIGNsdXN0ZXJlZCBtYWNoaW5lLlxuIgorCSIjXG4iKQorCitjZmcoZ2xvYmFsX3dhaXRfZm9yX2xvY2tzX0NGRywgIndhaXRfZm9yX2xvY2tzIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1dBSVRfRk9SX0xPQ0tTLCB2c24oMiwgMiwgNTApLCBOVUxMLCAwLCBOVUxMLAorCSJXaGVuIGRpc2FibGVkLCBmYWlsIGlmIGEgbG9jayByZXF1ZXN0IHdvdWxkIGJsb2NrLlxuIikKKworY2ZnKGdsb2JhbF9mYWxsYmFja190b19jbHVzdGVyZWRfbG9ja2luZ19DRkcsICJmYWxsYmFja190b19jbHVzdGVyZWRfbG9ja2luZyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9GQUxMQkFDS19UT19DTFVTVEVSRURfTE9DS0lORywgdnNuKDIsIDIsIDQyKSwgTlVMTCwgMCwgTlVMTCwKKwkiQXR0ZW1wdCB0byB1c2UgYnVpbHQtaW4gY2x1c3RlciBsb2NraW5nIGlmIGxvY2tpbmdfdHlwZSAyIGZhaWxzLlxuIgorCSJJZiB1c2luZyBleHRlcm5hbCBsb2NraW5nICh0eXBlIDIpIGFuZCBpbml0aWFsaXNhdGlvbiBmYWlscywgd2l0aFxuIgorCSJ0aGlzIGVuYWJsZWQsIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHVzZSB0aGUgYnVpbHQtaW4gY2x1c3RlcmVkXG4iCisJImxvY2tpbmcuIERpc2FibGUgdGhpcyBpZiB1c2luZyBhIGN1c3RvbWlzZWQgbG9ja2luZ19saWJyYXJ5LlxuIikKKworY2ZnKGdsb2JhbF9mYWxsYmFja190b19sb2NhbF9sb2NraW5nX0NGRywgImZhbGxiYWNrX3RvX2xvY2FsX2xvY2tpbmciLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfRkFMTEJBQ0tfVE9fTE9DQUxfTE9DS0lORywgdnNuKDIsIDIsIDQyKSwgTlVMTCwgMCwgTlVMTCwKKwkiVXNlIGxvY2tpbmdfdHlwZSAxIChsb2NhbCkgaWYgbG9ja2luZ190eXBlIDIgb3IgMyBmYWlsLlxuIgorCSJJZiBhbiBhdHRlbXB0IHRvIGluaXRpYWxpc2UgdHlwZSAyIG9yIHR5cGUgMyBsb2NraW5nIGZhaWxlZCwgcGVyaGFwc1xuIgorCSJiZWNhdXNlIGNsdXN0ZXIgY29tcG9uZW50cyBzdWNoIGFzIGNsdm1kIGFyZSBub3QgcnVubmluZywgd2l0aCB0aGlzXG4iCisJImVuYWJsZWQsIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHVzZSBsb2NhbCBmaWxlLWJhc2VkIGxvY2tpbmdcbiIKKwkiKHR5cGUgMSkuIElmIHRoaXMgc3VjY2VlZHMsIG9ubHkgY29tbWFuZHMgYWdhaW5zdCBsb2NhbCBWR3Mgd2lsbFxuIgorCSJwcm9jZWVkLiBWR3MgbWFya2VkIGFzIGNsdXN0ZXJlZCB3aWxsIGJlIGlnbm9yZWQuXG4iKQorCitjZmcoZ2xvYmFsX2xvY2tpbmdfZGlyX0NGRywgImxvY2tpbmdfZGlyIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfTE9DS19ESVIsIHZzbigxLCAwLCAwKSwgIkBERUZBVUxUX0xPQ0tfRElSQCIsIDAsIE5VTEwsCisJIkRpcmVjdG9yeSB0byB1c2UgZm9yIExWTSBjb21tYW5kIGZpbGUgbG9ja3MuXG4iCisJIkxvY2FsIG5vbi1MViBkaXJlY3RvcnkgdGhhdCBob2xkcyBmaWxlLWJhc2VkIGxvY2tzIHdoaWxlIGNvbW1hbmRzIGFyZVxuIgorCSJpbiBwcm9ncmVzcy4gQSBkaXJlY3RvcnkgbGlrZSAvdG1wIHRoYXQgbWF5IGdldCB3aXBlZCBvbiByZWJvb3QgaXMgT0suXG4iKQorCitjZmcoZ2xvYmFsX3ByaW9yaXRpc2Vfd3JpdGVfbG9ja3NfQ0ZHLCAicHJpb3JpdGlzZV93cml0ZV9sb2NrcyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9QUklPUklUSVNFX1dSSVRFX0xPQ0tTLCB2c24oMiwgMiwgNTIpLCBOVUxMLCAwLCBOVUxMLAorCSJBbGxvdyBxdWlja2VyIFZHIHdyaXRlIGFjY2VzcyBkdXJpbmcgaGlnaCB2b2x1bWUgcmVhZCBhY2Nlc3MuXG4iCisJIldoZW4gdGhlcmUgYXJlIGNvbXBldGluZyByZWFkLW9ubHkgYW5kIHJlYWQtd3JpdGUgYWNjZXNzIHJlcXVlc3RzIGZvclxuIgorCSJhIHZvbHVtZSBncm91cCdzIG1ldGFkYXRhLCBpbnN0ZWFkIG9mIGFsd2F5cyBncmFudGluZyB0aGUgcmVhZC1vbmx5XG4iCisJInJlcXVlc3RzIGltbWVkaWF0ZWx5LCBkZWxheSB0aGVtIHRvIGFsbG93IHRoZSByZWFkLXdyaXRlIHJlcXVlc3RzIHRvXG4iCisJImJlIHNlcnZpY2VkLiBXaXRob3V0IHRoaXMgc2V0dGluZywgd3JpdGUgYWNjZXNzIG1heSBiZSBzdGFsbGVkIGJ5IGFcbiIKKwkiaGlnaCB2b2x1bWUgb2YgcmVhZC1vbmx5IHJlcXVlc3RzLiBUaGlzIG9wdGlvbiBvbmx5IGFmZmVjdHNcbiIKKwkibG9ja2luZ190eXBlIDEgdml6LiBsb2NhbCBmaWxlLWJhc2VkIGxvY2tpbmcuXG4iKQorCitjZmcoZ2xvYmFsX2xpYnJhcnlfZGlyX0NGRywgImxpYnJhcnlfZGlyIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJTZWFyY2ggdGhpcyBkaXJlY3RvcnkgZmlyc3QgZm9yIHNoYXJlZCBsaWJyYXJpZXMuXG4iKQorCitjZmcoZ2xvYmFsX2xvY2tpbmdfbGlicmFyeV9DRkcsICJsb2NraW5nX2xpYnJhcnkiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0xPQ0tJTkdfTElCLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBleHRlcm5hbCBsb2NraW5nIGxpYnJhcnkgdG8gdXNlIGZvciBsb2NraW5nX3R5cGUgMi5cbiIpCisKK2NmZyhnbG9iYWxfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX0NGRywgImFib3J0X29uX2ludGVybmFsX2Vycm9ycyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9BQk9SVF9PTl9JTlRFUk5BTF9FUlJPUlMsIHZzbigyLCAyLCA1NyksIE5VTEwsIDAsIE5VTEwsCisJIkFib3J0IGEgY29tbWFuZCB0aGF0IGVuY291bnRlcnMgYW4gaW50ZXJuYWwgZXJyb3IuXG4iCisJIlRyZWF0IGFueSBpbnRlcm5hbCBlcnJvcnMgYXMgZmF0YWwgZXJyb3JzLCBhYm9ydGluZyB0aGUgcHJvY2VzcyB0aGF0XG4iCisJImVuY291bnRlcmVkIHRoZSBpbnRlcm5hbCBlcnJvci4gUGxlYXNlIG9ubHkgZW5hYmxlIGZvciBkZWJ1Z2dpbmcuXG4iKQorCitjZmcoZ2xvYmFsX2RldGVjdF9pbnRlcm5hbF92Z19jYWNoZV9jb3JydXB0aW9uX0NGRywgImRldGVjdF9pbnRlcm5hbF92Z19jYWNoZV9jb3JydXB0aW9uIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX0RFVEVDVF9JTlRFUk5BTF9WR19DQUNIRV9DT1JSVVBUSU9OLCB2c24oMiwgMiwgOTYpLCBOVUxMLCAwLCBOVUxMLAorCSJJbnRlcm5hbCB2ZXJpZmljYXRpb24gb2YgVkcgc3RydWN0dXJlcy5cbiIKKwkiQ2hlY2sgaWYgQ1JDIG1hdGNoZXMgd2hlbiBhIHBhcnNlZCBWRyBpcyB1c2VkIG11bHRpcGxlIHRpbWVzLiBUaGlzXG4iCisJImlzIHVzZWZ1bCB0byBjYXRjaCB1bmV4cGVjdGVkIGNoYW5nZXMgdG8gY2FjaGVkIFZHIHN0cnVjdHVyZXMuXG4iCisJIlBsZWFzZSBvbmx5IGVuYWJsZSBmb3IgZGVidWdnaW5nLlxuIikKKworY2ZnKGdsb2JhbF9tZXRhZGF0YV9yZWFkX29ubHlfQ0ZHLCAibWV0YWRhdGFfcmVhZF9vbmx5IiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX01FVEFEQVRBX1JFQURfT05MWSwgdnNuKDIsIDIsIDc1KSwgTlVMTCwgMCwgTlVMTCwKKwkiTm8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSBvbi1kaXNrIG1ldGFkYXRhIGFyZSBwZXJtaXR0ZWQuXG4iCisJIkFkZGl0aW9uYWxseSwgcmVhZC1vbmx5IGNvbW1hbmRzIHRoYXQgZW5jb3VudGVyIG1ldGFkYXRhIGluIG5lZWQgb2ZcbiIKKwkicmVwYWlyIHdpbGwgc3RpbGwgYmUgYWxsb3dlZCB0byBwcm9jZWVkIGV4YWN0bHkgYXMgaWYgdGhlIHJlcGFpciBoYWRcbiIKKwkiYmVlbiBwZXJmb3JtZWQgKGV4Y2VwdCBmb3IgdGhlIHVuY2hhbmdlZCB2Z19zZXFubykuIEluYXBwcm9wcmlhdGVcbiIKKwkidXNlIGNvdWxkIG1lc3MgdXAgeW91ciBzeXN0ZW0sIHNvIHNlZWsgYWR2aWNlIGZpcnN0IVxuIikKKworY2ZnKGdsb2JhbF9taXJyb3Jfc2VndHlwZV9kZWZhdWx0X0NGRywgIm1pcnJvcl9zZWd0eXBlX2RlZmF1bHQiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9NSVJST1JfU0VHVFlQRSwgdnNuKDIsIDIsIDg3KSwgIkBERUZBVUxUX01JUlJPUl9TRUdUWVBFQCIsIDAsIE5VTEwsCisJIlRoZSBzZWdtZW50IHR5cGUgdXNlZCBieSB0aGUgc2hvcnQgbWlycm9yaW5nIG9wdGlvbiAtbS5cbiIKKwkiVGhlIC0tdHlwZSBtaXJyb3J8cmFpZDEgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIG1pcnJvclxuIgorCSIgICAgVGhlIG9yaWdpbmFsIFJBSUQxIGltcGxlbWVudGF0aW9uIGZyb20gTFZNL0RNLiBJdCBpc1xuIgorCSIgICAgY2hhcmFjdGVyaXplZCBieSBhIGZsZXhpYmxlIGxvZyBzb2x1dGlvbiAoY29yZSwgZGlzaywgbWlycm9yZWQpLFxuIgorCSIgICAgYW5kIGJ5IHRoZSBuZWNlc3NpdHkgdG8gYmxvY2sgSS9PIHdoaWxlIGhhbmRsaW5nIGEgZmFpbHVyZS5cbiIKKwkiICAgIFRoZXJlIGlzIGFuIGluaGVyZW50IHJhY2UgaW4gdGhlIGRtZXZlbnRkIGZhaWx1cmUgaGFuZGxpbmcgbG9naWNcbiIKKwkiICAgIHdpdGggc25hcHNob3RzIG9mIGRldmljZXMgdXNpbmcgdGhpcyB0eXBlIG9mIFJBSUQxIHRoYXQgaW4gdGhlXG4iCisJIiAgICB3b3JzdCBjYXNlIGNvdWxkIGNhdXNlIGEgZGVhZGxvY2suIChBbHNvIHNlZVxuIgorCSIgICAgZGV2aWNlcy9pZ25vcmVfbHZtX21pcnJvcnMuKVxuIgorCSIgIHJhaWQxXG4iCisJIiAgICBUaGlzIGlzIGEgbmV3ZXIgUkFJRDEgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIE1EIFJBSUQxXG4iCisJIiAgICBwZXJzb25hbGl0eSB0aHJvdWdoIGRldmljZS1tYXBwZXIuIEl0IGlzIGNoYXJhY3Rlcml6ZWQgYnkgYVxuIgorCSIgICAgbGFjayBvZiBsb2cgb3B0aW9ucy4gKEEgbG9nIGlzIGFsd2F5cyBhbGxvY2F0ZWQgZm9yIGV2ZXJ5XG4iCisJIiAgICBkZXZpY2UgYW5kIHRoZXkgYXJlIHBsYWNlZCBvbiB0aGUgc2FtZSBkZXZpY2UgYXMgdGhlIGltYWdlLFxuIgorCSIgICAgc28gbm8gc2VwYXJhdGUgZGV2aWNlcyBhcmUgcmVxdWlyZWQuKSBUaGlzIG1pcnJvclxuIgorCSIgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVxdWlyZSBJL08gdG8gYmUgYmxvY2tlZCB3aGlsZVxuIgorCSIgICAgaGFuZGxpbmcgYSBmYWlsdXJlLiBUaGlzIG1pcnJvciBpbXBsZW1lbnRhdGlvbiBpcyBub3RcbiIKKwkiICAgIGNsdXN0ZXItYXdhcmUgYW5kIGNhbm5vdCBiZSB1c2VkIGluIGEgc2hhcmVkIChhY3RpdmUvYWN0aXZlKVxuIgorCSIgICAgZmFzaGlvbiBpbiBhIGNsdXN0ZXIuXG4iCisJIiNcbiIpCisKK2NmZyhnbG9iYWxfcmFpZDEwX3NlZ3R5cGVfZGVmYXVsdF9DRkcsICJyYWlkMTBfc2VndHlwZV9kZWZhdWx0IiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfUkFJRDEwX1NFR1RZUEUsIHZzbigyLCAyLCA5OSksICJAREVGQVVMVF9SQUlEMTBfU0VHVFlQRUAiLCAwLCBOVUxMLAorCSJUaGUgc2VnbWVudCB0eXBlIHVzZWQgYnkgdGhlIC1pIC1tIGNvbWJpbmF0aW9uLlxuIgorCSJUaGUgLS10eXBlIHJhaWQxMHxtaXJyb3Igb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIlRoZSAtLXN0cmlwZXMvLWkgYW5kIC0tbWlycm9ycy8tbSBvcHRpb25zIGNhbiBib3RoIGJlIHNwZWNpZmllZFxuIgorCSJkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgbG9naWNhbCB2b2x1bWUgdG8gdXNlIGJvdGggc3RyaXBpbmcgYW5kXG4iCisJIm1pcnJvcmluZyBmb3IgdGhlIExWLiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIHJhaWQxMFxuIgorCSIgICAgTFZNIHVzZXMgTUQncyBSQUlEMTAgcGVyc29uYWxpdHkgdGhyb3VnaCBETS4gVGhpcyBpcyB0aGVcbiIKKwkiICAgIHByZWZlcnJlZCBvcHRpb24uXG4iCisJIiAgbWlycm9yXG4iCisJIiAgICBMVk0gbGF5ZXJzIHRoZSAnbWlycm9yJyBhbmQgJ3N0cmlwZScgc2VnbWVudCB0eXBlcy4gVGhlIGxheWVyaW5nXG4iCisJIiAgICBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgbWlycm9yIExWIG9uIHRvcCBvZiBzdHJpcGVkIHN1Yi1MVnMsXG4iCisJIiAgICBlZmZlY3RpdmVseSBjcmVhdGluZyBhIFJBSUQgMCsxIGFycmF5LiBUaGUgbGF5ZXJpbmcgaXMgc3Vib3B0aW1hbFxuIgorCSIgICAgaW4gdGVybXMgb2YgcHJvdmlkaW5nIHJlZHVuZGFuY3kgYW5kIHBlcmZvcm1hbmNlLlxuIgorCSIjXG4iKQorCitjZmcoZ2xvYmFsX3NwYXJzZV9zZWd0eXBlX2RlZmF1bHRfQ0ZHLCAic3BhcnNlX3NlZ3R5cGVfZGVmYXVsdCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1NQQVJTRV9TRUdUWVBFLCB2c24oMiwgMiwgMTEyKSwgIkBERUZBVUxUX1NQQVJTRV9TRUdUWVBFQCIsIDAsIE5VTEwsCisJIlRoZSBzZWdtZW50IHR5cGUgdXNlZCBieSB0aGUgLVYgLUwgY29tYmluYXRpb24uXG4iCisJIlRoZSAtLXR5cGUgc25hcHNob3R8dGhpbiBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy5cbiIKKwkiVGhlIGNvbWJpbmF0aW9uIG9mIC1WIGFuZCAtTCBvcHRpb25zIGNyZWF0ZXMgYSBzcGFyc2UgTFYuIFRoZXJlIGFyZVxuIgorCSJ0d28gZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucy5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgc25hcHNob3RcbiIKKwkiICAgIFRoZSBvcmlnaW5hbCBzbmFwc2hvdCBpbXBsZW1lbnRhdGlvbiBmcm9tIExWTS9ETS4gSXQgdXNlcyBhbiBvbGRcbiIKKwkiICAgIHNuYXBzaG90IHRoYXQgbWl4ZXMgZGF0YSBhbmQgbWV0YWRhdGEgd2l0aGluIGEgc2luZ2xlIENPV1xuIgorCSIgICAgc3RvcmFnZSB2b2x1bWUgYW5kIHBlcmZvcm1zIHBvb3JseSB3aGVuIHRoZSBzaXplIG9mIHN0b3JlZCBkYXRhXG4iCisJIiAgICBwYXNzZXMgaHVuZHJlZHMgb2YgTUIuXG4iCisJIiAgdGhpblxuIgorCSIgICAgQSBuZXdlciBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhpbiBwcm92aXNpb25pbmcuIEl0IGhhcyBhXG4iCisJIiAgICBiaWdnZXIgbWluaW1hbCBjaHVuayBzaXplICg2NEtpQikgYW5kIHVzZXMgYSBzZXBhcmF0ZSB2b2x1bWUgZm9yXG4iCisJIiAgICBtZXRhZGF0YS4gSXQgaGFzIGJldHRlciBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSB3aGVuIG1vcmUgZGF0YVxuIgorCSIgICAgaXMgdXNlZC4gSXQgYWxzbyBzdXBwb3J0cyBmdWxsIHNuYXBzaG90cy5cbiIKKwkiI1xuIikKKworY2ZnKGdsb2JhbF9sdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aF9DRkcsICJsdmRpc3BsYXlfc2hvd3NfZnVsbF9kZXZpY2VfcGF0aCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfTFZESVNQTEFZX1NIT1dTX0ZVTExfREVWSUNFX1BBVEgsIHZzbigyLCAyLCA4OSksIE5VTEwsIDAsIE5VTEwsCisJIkVuYWJsZSB0aGlzIHRvIHJlaW5zdGF0ZSB0aGUgcHJldmlvdXMgbHZkaXNwbGF5IG5hbWUgZm9ybWF0LlxuIgorCSJUaGUgZGVmYXVsdCBmb3JtYXQgZm9yIGRpc3BsYXlpbmcgTFYgbmFtZXMgaW4gbHZkaXNwbGF5IHdhcyBjaGFuZ2VkXG4iCisJImluIHZlcnNpb24gMi4wMi44OSB0byBzaG93IHRoZSBMViBuYW1lIGFuZCBwYXRoIHNlcGFyYXRlbHkuXG4iCisJIlByZXZpb3VzbHkgdGhpcyB3YXMgYWx3YXlzIHNob3duIGFzIC9kZXYvdmduYW1lL2x2bmFtZSBldmVuIHdoZW4gdGhhdFxuIgorCSJ3YXMgbmV2ZXIgYSB2YWxpZCBwYXRoIGluIHRoZSAvZGV2IGZpbGVzeXN0ZW0uXG4iKQorCitjZmcoZ2xvYmFsX3VzZV9sdm1ldGFkX0NGRywgInVzZV9sdm1ldGFkIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1VTRV9MVk1FVEFELCB2c24oMiwgMiwgOTMpLCAiQERFRkFVTFRfVVNFX0xWTUVUQURAIiwgMCwgTlVMTCwKKwkiVXNlIGx2bWV0YWQgdG8gY2FjaGUgbWV0YWRhdGEgYW5kIHJlZHVjZSBkaXNrIHNjYW5uaW5nLlxuIgorCSJXaGVuIGVuYWJsZWQgKGFuZCBydW5uaW5nKSwgbHZtZXRhZCBwcm92aWRlcyBMVk0gY29tbWFuZHMgd2l0aCBWR1xuIgorCSJtZXRhZGF0YSBhbmQgUFYgc3RhdGUuIExWTSBjb21tYW5kcyB0aGVuIGF2b2lkIHJlYWRpbmcgdGhpc1xuIgorCSJpbmZvcm1hdGlvbiBmcm9tIGRpc2tzIHdoaWNoIGNhbiBiZSBzbG93LiBXaGVuIGRpc2FibGVkIChvciBub3RcbiIKKwkicnVubmluZyksIExWTSBjb21tYW5kcyBmYWxsIGJhY2sgdG8gc2Nhbm5pbmcgZGlza3MgdG8gb2J0YWluIFZHXG4iCisJIm1ldGFkYXRhLiBsdm1ldGFkIGlzIGtlcHQgdXBkYXRlZCB2aWEgdWRldiBydWxlcyB3aGljaCBtdXN0IGJlIHNldFxuIgorCSJ1cCBmb3IgTFZNIHRvIHdvcmsgY29ycmVjdGx5LiAoVGhlIHVkZXYgcnVsZXMgc2hvdWxkIGJlIGluc3RhbGxlZFxuIgorCSJieSBkZWZhdWx0LikgV2l0aG91dCBhIHByb3BlciB1ZGV2IHNldHVwLCBjaGFuZ2VzIGluIHRoZSBzeXN0ZW0nc1xuIgorCSJibG9jayBkZXZpY2UgY29uZmlndXJhdGlvbiB3aWxsIGJlIHVua25vd24gdG8gTFZNLCBhbmQgaWdub3JlZFxuIgorCSJ1bnRpbCBhIG1hbnVhbCAncHZzY2FuIC0tY2FjaGUnIGlzIHJ1bi4gSWYgbHZtZXRhZCB3YXMgcnVubmluZ1xuIgorCSJ3aGlsZSB1c2VfbHZtZXRhZCB3YXMgZGlzYWJsZWQsIGl0IG11c3QgYmUgc3RvcHBlZCwgdXNlX2x2bWV0YWRcbiIKKwkiZW5hYmxlZCwgYW5kIHRoZW4gc3RhcnRlZC4gV2hlbiB1c2luZyBsdm1ldGFkLCBMViBhY3RpdmF0aW9uIGlzXG4iCisJInN3aXRjaGVkIHRvIGFuIGF1dG9tYXRpYywgZXZlbnQtYmFzZWQgbW9kZS4gSW4gdGhpcyBtb2RlLCBMVnMgYXJlXG4iCisJImFjdGl2YXRlZCBiYXNlZCBvbiBpbmNvbWluZyB1ZGV2IGV2ZW50cyB0aGF0IGluZm9ybSBsdm1ldGFkIHdoZW5cbiIKKwkiUFZzIGFwcGVhciBvbiB0aGUgc3lzdGVtLiBXaGVuIGEgVkcgaXMgY29tcGxldGUgKGFsbCBQVnMgcHJlc2VudCksXG4iCisJIml0IGlzIGF1dG8tYWN0aXZhdGVkLiBUaGUgYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0IHNldHRpbmdcbiIKKwkiY29udHJvbHMgd2hpY2ggTFZzIGFyZSBhdXRvLWFjdGl2YXRlZCAoYWxsIGJ5IGRlZmF1bHQuKVxuIgorCSJXaGVuIGx2bWV0YWQgaXMgdXBkYXRlZCAoYXV0b21hdGljYWxseSBieSB1ZGV2IGV2ZW50cywgb3IgZGlyZWN0bHlcbiIKKwkiYnkgcHZzY2FuIC0tY2FjaGUpLCBkZXZpY2VzL2ZpbHRlciBpcyBpZ25vcmVkIGFuZCBhbGwgZGV2aWNlcyBhcmVcbiIKKwkic2Nhbm5lZCBieSBkZWZhdWx0LiBsdm1ldGFkIGFsd2F5cyBrZWVwcyB1bmZpbHRlcmVkIGluZm9ybWF0aW9uXG4iCisJIndoaWNoIGlzIHByb3ZpZGVkIHRvIExWTSBjb21tYW5kcy4gRWFjaCBMVk0gY29tbWFuZCB0aGVuIGZpbHRlcnNcbiIKKwkiYmFzZWQgb24gZGV2aWNlcy9maWx0ZXIuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gb3RoZXIsIG5vbi1yZWdleHAsXG4iCisJImZpbHRlcmluZyBzZXR0aW5nczogY29tcG9uZW50IGZpbHRlcnMgc3VjaCBhcyBtdWx0aXBhdGggYW5kIE1EXG4iCisJImFyZSBjaGVja2VkIGR1cmluZyBwdnNjYW4gLS1jYWNoZS4gVG8gZmlsdGVyIGEgZGV2aWNlIGFuZCBwcmV2ZW50XG4iCisJInNjYW5uaW5nIGZyb20gdGhlIExWTSBzeXN0ZW0gZW50aXJlbHksIGluY2x1ZGluZyBsdm1ldGFkLCB1c2VcbiIKKwkiZGV2aWNlcy9nbG9iYWxfZmlsdGVyLlxuIikKKworY2ZnKGdsb2JhbF9sdm1ldGFkX3VwZGF0ZV93YWl0X3RpbWVfQ0ZHLCAibHZtZXRhZF91cGRhdGVfd2FpdF90aW1lIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0lOVCwgREVGQVVMVF9MVk1FVEFEX1VQREFURV9XQUlUX1RJTUUsIHZzbigyLCAyLCAxNTEpLCBOVUxMLCAwLCBOVUxMLAorCSJUaGUgbnVtYmVyIG9mIHNlY29uZHMgYSBjb21tYW5kIHdpbGwgd2FpdCBmb3IgbHZtZXRhZCB1cGRhdGUgdG8gZmluaXNoLlxuIgorCSJBZnRlciB3YWl0aW5nIGZvciB0aGlzIHBlcmlvZCwgYSBjb21tYW5kIHdpbGwgbm90IHVzZSBsdm1ldGFkLCBhbmRcbiIKKwkid2lsbCByZXZlcnQgdG8gZGlzayBzY2FubmluZy5cbiIpCisKK2NmZyhnbG9iYWxfdXNlX2x2bWxvY2tkX0NGRywgInVzZV9sdm1sb2NrZCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgMCwgdnNuKDIsIDIsIDEyNCksIE5VTEwsIDAsIE5VTEwsCisJIlVzZSBsdm1sb2NrZCBmb3IgbG9ja2luZyBhbW9uZyBob3N0cyB1c2luZyBMVk0gb24gc2hhcmVkIHN0b3JhZ2UuXG4iCisJIkFwcGxpY2FibGUgb25seSBpZiBMVk0gaXMgY29tcGlsZWQgd2l0aCBsb2NrZCBzdXBwb3J0IGluIHdoaWNoXG4iCisJImNhc2UgdGhlcmUgaXMgYWxzbyBsdm1sb2NrZCg4KSBtYW4gcGFnZSBhdmFpbGFibGUgZm9yIG1vcmVcbiIKKwkiaW5mb3JtYXRpb24uXG4iKQorCitjZmcoZ2xvYmFsX2x2bWxvY2tkX2xvY2tfcmV0cmllc19DRkcsICJsdm1sb2NrZF9sb2NrX3JldHJpZXMiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX0xWTUxPQ0tEX0xPQ0tfUkVUUklFUywgdnNuKDIsIDIsIDEyNSksIE5VTEwsIDAsIE5VTEwsCisJIlJldHJ5IGx2bWxvY2tkIGxvY2sgcmVxdWVzdHMgdGhpcyBtYW55IHRpbWVzLlxuIgorCSJBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2Qgc3VwcG9ydFxuIikKKworY2ZnKGdsb2JhbF9zYW5sb2NrX2x2X2V4dGVuZF9DRkcsICJzYW5sb2NrX2x2X2V4dGVuZCIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfU0FOTE9DS19MVl9FWFRFTkRfTUIsIHZzbigyLCAyLCAxMjQpLCBOVUxMLCAwLCBOVUxMLAorCSJTaXplIGluIE1pQiB0byBleHRlbmQgdGhlIGludGVybmFsIExWIGhvbGRpbmcgc2FubG9jayBsb2Nrcy5cbiIKKwkiVGhlIGludGVybmFsIExWIGhvbGRzIGxvY2tzIGZvciBlYWNoIExWIGluIHRoZSBWRywgYW5kIGFmdGVyIGVub3VnaFxuIgorCSJMVnMgaGF2ZSBiZWVuIGNyZWF0ZWQsIHRoZSBpbnRlcm5hbCBMViBuZWVkcyB0byBiZSBleHRlbmRlZC4gbHZjcmVhdGVcbiIKKwkid2lsbCBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGUgaW50ZXJuYWwgTFYgd2hlbiBuZWVkZWQgYnkgdGhlIGFtb3VudFxuIgorCSJzcGVjaWZpZWQgaGVyZS4gU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBleHRlbnNpb25cbiIKKwkiYW5kIGNhbiBjYXVzZSBsdmNyZWF0ZSB0byBmYWlsLiBBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkXG4iCisJIndpdGggbG9ja2Qgc3VwcG9ydFxuIikKKworY2ZnKGdsb2JhbF90aGluX2NoZWNrX2V4ZWN1dGFibGVfQ0ZHLCAidGhpbl9jaGVja19leGVjdXRhYmxlIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgVEhJTl9DSEVDS19DTUQsIHZzbigyLCAyLCA5NCksICJAVEhJTl9DSEVDS19DTURAIiwgMCwgTlVMTCwKKwkiVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhpbl9jaGVjayBjb21tYW5kLlxuIgorCSJMVk0gdXNlcyB0aGlzIGNvbW1hbmQgdG8gY2hlY2sgdGhhdCBhIHRoaW4gbWV0YWRhdGEgZGV2aWNlIGlzIGluIGFcbiIKKwkidXNhYmxlIHN0YXRlLiBXaGVuIGEgdGhpbiBwb29sIGlzIGFjdGl2YXRlZCBhbmQgYWZ0ZXIgaXQgaXNcbiIKKwkiZGVhY3RpdmF0ZWQsIHRoaXMgY29tbWFuZCBpcyBydW4uIEFjdGl2YXRpb24gd2lsbCBvbmx5IHByb2NlZWQgaWZcbiIKKwkidGhlIGNvbW1hbmQgaGFzIGFuIGV4aXQgc3RhdHVzIG9mIDAuIFNldCB0byBcIlwiIHRvIHNraXAgdGhpcyBjaGVjay5cbiIKKwkiKE5vdCByZWNvbW1lbmRlZC4pIEFsc28gc2VlIHRoaW5fY2hlY2tfb3B0aW9ucy5cbiIKKwkiKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKVxuIikKKworY2ZnKGdsb2JhbF90aGluX2R1bXBfZXhlY3V0YWJsZV9DRkcsICJ0aGluX2R1bXBfZXhlY3V0YWJsZSIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIFRISU5fRFVNUF9DTUQsIHZzbigyLCAyLCAxMDApLCAiQFRISU5fRFVNUF9DTURAIiwgMCwgTlVMTCwKKwkiVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhpbl9kdW1wIGNvbW1hbmQuXG4iCisJIkxWTSB1c2VzIHRoaXMgY29tbWFuZCB0byBkdW1wIHRoaW4gcG9vbCBtZXRhZGF0YS5cbiIKKwkiKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKVxuIikKKworY2ZnKGdsb2JhbF90aGluX3JlcGFpcl9leGVjdXRhYmxlX0NGRywgInRoaW5fcmVwYWlyX2V4ZWN1dGFibGUiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBUSElOX1JFUEFJUl9DTUQsIHZzbigyLCAyLCAxMDApLCAiQFRISU5fUkVQQUlSX0NNREAiLCAwLCBOVUxMLAorCSJUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aGluX3JlcGFpciBjb21tYW5kLlxuIgorCSJMVk0gdXNlcyB0aGlzIGNvbW1hbmQgdG8gcmVwYWlyIGEgdGhpbiBtZXRhZGF0YSBkZXZpY2UgaWYgaXQgaXMgaW5cbiIKKwkiYW4gdW51c2FibGUgc3RhdGUuIEFsc28gc2VlIHRoaW5fcmVwYWlyX29wdGlvbnMuXG4iCisJIihTZWUgcGFja2FnZSBkZXZpY2UtbWFwcGVyLXBlcnNpc3RlbnQtZGF0YSBvciB0aGluLXByb3Zpc2lvbmluZy10b29scylcbiIpCisKK2NmZ19hcnJheShnbG9iYWxfdGhpbl9jaGVja19vcHRpb25zX0NGRywgInRoaW5fY2hlY2tfb3B0aW9ucyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfVEhJTl9DSEVDS19PUFRJT05TX0NPTkZJRywgdnNuKDIsIDIsIDk2KSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGhpbl9jaGVjayBjb21tYW5kLlxuIgorCSJXaXRoIHRoaW5fY2hlY2sgdmVyc2lvbiAyLjEgb3IgbmV3ZXIgeW91IGNhbiBhZGQgdGhlIG9wdGlvblxuIgorCSItLWlnbm9yZS1ub24tZmF0YWwtZXJyb3JzIHRvIGxldCBpdCBwYXNzIHRocm91Z2ggaWdub3JhYmxlIGVycm9yc1xuIgorCSJhbmQgZml4IHRoZW0gbGF0ZXIuIFdpdGggdGhpbl9jaGVjayB2ZXJzaW9uIDMuMiBvciBuZXdlciB5b3Ugc2hvdWxkXG4iCisJImluY2x1ZGUgdGhlIG9wdGlvbiAtLWNsZWFyLW5lZWRzLWNoZWNrLWZsYWcuXG4iKQorCitjZmdfYXJyYXkoZ2xvYmFsX3RoaW5fcmVwYWlyX29wdGlvbnNfQ0ZHLCAidGhpbl9yZXBhaXJfb3B0aW9ucyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfVEhJTl9SRVBBSVJfT1BUSU9OU19DT05GSUcsIHZzbigyLCAyLCAxMDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB0aGluX3JlcGFpciBjb21tYW5kLlxuIikKKworY2ZnX2FycmF5KGdsb2JhbF90aGluX2Rpc2FibGVkX2ZlYXR1cmVzX0NGRywgInRoaW5fZGlzYWJsZWRfZmVhdHVyZXMiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWSB8IENGR19ERUZBVUxUX1VOREVGSU5FRCwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMiwgMiwgOTkpLCBOVUxMLCAwLCBOVUxMLAorCSJGZWF0dXJlcyB0byBub3QgdXNlIGluIHRoZSB0aGluIGRyaXZlci5cbiIKKwkiVGhpcyBjYW4gYmUgaGVscGZ1bCBmb3IgdGVzdGluZywgb3IgdG8gYXZvaWQgdXNpbmcgYSBmZWF0dXJlIHRoYXQgaXNcbiIKKwkiY2F1c2luZyBwcm9ibGVtcy4gRmVhdHVyZXMgaW5jbHVkZTogYmxvY2tfc2l6ZSwgZGlzY2FyZHMsXG4iCisJImRpc2NhcmRzX25vbl9wb3dlcl8yLCBleHRlcm5hbF9vcmlnaW4sIG1ldGFkYXRhX3Jlc2l6ZSxcbiIKKwkiZXh0ZXJuYWxfb3JpZ2luX2V4dGVuZCwgZXJyb3JfaWZfbm9fc3BhY2UuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJ0aGluX2Rpc2FibGVkX2ZlYXR1cmVzID0gWyBcImRpc2NhcmRzXCIsIFwiYmxvY2tfc2l6ZVwiIF1cbiIKKwkiI1xuIikKKworY2ZnX2FycmF5KGdsb2JhbF9jYWNoZV9kaXNhYmxlZF9mZWF0dXJlc19DRkcsICJjYWNoZV9kaXNhYmxlZF9mZWF0dXJlcyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigyLCAyLCAxMjgpLCBOVUxMLCAwLCBOVUxMLAorCSJGZWF0dXJlcyB0byBub3QgdXNlIGluIHRoZSBjYWNoZSBkcml2ZXIuXG4iCisJIlRoaXMgY2FuIGJlIGhlbHBmdWwgZm9yIHRlc3RpbmcsIG9yIHRvIGF2b2lkIHVzaW5nIGEgZmVhdHVyZSB0aGF0IGlzXG4iCisJImNhdXNpbmcgcHJvYmxlbXMuIEZlYXR1cmVzIGluY2x1ZGU6IHBvbGljeV9tcSwgcG9saWN5X3NtcS5cbiIKKwkiI1xuIgorCSJFeGFtcGxlXG4iCisJImNhY2hlX2Rpc2FibGVkX2ZlYXR1cmVzID0gWyBcInBvbGljeV9zbXFcIiBdXG4iCisJIiNcbiIpCisKK2NmZyhnbG9iYWxfY2FjaGVfY2hlY2tfZXhlY3V0YWJsZV9DRkcsICJjYWNoZV9jaGVja19leGVjdXRhYmxlIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgQ0FDSEVfQ0hFQ0tfQ01ELCB2c24oMiwgMiwgMTA4KSwgIkBDQUNIRV9DSEVDS19DTURAIiwgMCwgTlVMTCwKKwkiVGhlIGZ1bGwgcGF0aCB0byB0aGUgY2FjaGVfY2hlY2sgY29tbWFuZC5cbiIKKwkiTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIGNoZWNrIHRoYXQgYSBjYWNoZSBtZXRhZGF0YSBkZXZpY2UgaXMgaW4gYVxuIgorCSJ1c2FibGUgc3RhdGUuIFdoZW4gYSBjYWNoZWQgTFYgaXMgYWN0aXZhdGVkIGFuZCBhZnRlciBpdCBpc1xuIgorCSJkZWFjdGl2YXRlZCwgdGhpcyBjb21tYW5kIGlzIHJ1bi4gQWN0aXZhdGlvbiB3aWxsIG9ubHkgcHJvY2VlZCBpZiB0aGVcbiIKKwkiY29tbWFuZCBoYXMgYW4gZXhpdCBzdGF0dXMgb2YgMC4gU2V0IHRvIFwiXCIgdG8gc2tpcCB0aGlzIGNoZWNrLlxuIgorCSIoTm90IHJlY29tbWVuZGVkLikgQWxzbyBzZWUgY2FjaGVfY2hlY2tfb3B0aW9ucy5cbiIKKwkiKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKVxuIikKKworY2ZnKGdsb2JhbF9jYWNoZV9kdW1wX2V4ZWN1dGFibGVfQ0ZHLCAiY2FjaGVfZHVtcF9leGVjdXRhYmxlIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgQ0FDSEVfRFVNUF9DTUQsIHZzbigyLCAyLCAxMDgpLCAiQENBQ0hFX0RVTVBfQ01EQCIsIDAsIE5VTEwsCisJIlRoZSBmdWxsIHBhdGggdG8gdGhlIGNhY2hlX2R1bXAgY29tbWFuZC5cbiIKKwkiTFZNIHVzZXMgdGhpcyBjb21tYW5kIHRvIGR1bXAgY2FjaGUgcG9vbCBtZXRhZGF0YS5cbiIKKwkiKFNlZSBwYWNrYWdlIGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhIG9yIHRoaW4tcHJvdmlzaW9uaW5nLXRvb2xzKVxuIikKKworY2ZnKGdsb2JhbF9jYWNoZV9yZXBhaXJfZXhlY3V0YWJsZV9DRkcsICJjYWNoZV9yZXBhaXJfZXhlY3V0YWJsZSIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIENBQ0hFX1JFUEFJUl9DTUQsIHZzbigyLCAyLCAxMDgpLCAiQENBQ0hFX1JFUEFJUl9DTURAIiwgMCwgTlVMTCwKKwkiVGhlIGZ1bGwgcGF0aCB0byB0aGUgY2FjaGVfcmVwYWlyIGNvbW1hbmQuXG4iCisJIkxWTSB1c2VzIHRoaXMgY29tbWFuZCB0byByZXBhaXIgYSBjYWNoZSBtZXRhZGF0YSBkZXZpY2UgaWYgaXQgaXMgaW5cbiIKKwkiYW4gdW51c2FibGUgc3RhdGUuIEFsc28gc2VlIGNhY2hlX3JlcGFpcl9vcHRpb25zLlxuIgorCSIoU2VlIHBhY2thZ2UgZGV2aWNlLW1hcHBlci1wZXJzaXN0ZW50LWRhdGEgb3IgdGhpbi1wcm92aXNpb25pbmctdG9vbHMpXG4iKQorCitjZmdfYXJyYXkoZ2xvYmFsX2NhY2hlX2NoZWNrX29wdGlvbnNfQ0ZHLCAiY2FjaGVfY2hlY2tfb3B0aW9ucyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfQ0FDSEVfQ0hFQ0tfT1BUSU9OU19DT05GSUcsIHZzbigyLCAyLCAxMDgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBjYWNoZV9jaGVjayBjb21tYW5kLlxuIgorCSJXaXRoIGNhY2hlX2NoZWNrIHZlcnNpb24gNS4wIG9yIG5ld2VyIHlvdSBzaG91bGQgaW5jbHVkZSB0aGUgb3B0aW9uXG4iCisJIi0tY2xlYXItbmVlZHMtY2hlY2stZmxhZy5cbiIpCisKK2NmZ19hcnJheShnbG9iYWxfY2FjaGVfcmVwYWlyX29wdGlvbnNfQ0ZHLCAiY2FjaGVfcmVwYWlyX29wdGlvbnMiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0NBQ0hFX1JFUEFJUl9PUFRJT05TX0NPTkZJRywgdnNuKDIsIDIsIDEwOCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2Ygb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNhY2hlX3JlcGFpciBjb21tYW5kLlxuIikKKworY2ZnKGdsb2JhbF9zeXN0ZW1faWRfc291cmNlX0NGRywgInN5c3RlbV9pZF9zb3VyY2UiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9TWVNURU1fSURfU09VUkNFLCB2c24oMiwgMiwgMTE3KSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIG1ldGhvZCBMVk0gdXNlcyB0byBzZXQgdGhlIGxvY2FsIHN5c3RlbSBJRC5cbiIKKwkiVm9sdW1lIEdyb3VwcyBjYW4gYWxzbyBiZSBnaXZlbiBhIHN5c3RlbSBJRCAoYnkgdmdjcmVhdGUsIHZnY2hhbmdlLFxuIgorCSJvciB2Z2ltcG9ydC4pIEEgVkcgb24gc2hhcmVkIHN0b3JhZ2UgZGV2aWNlcyBpcyBhY2Nlc3NpYmxlIG9ubHkgdG9cbiIKKwkidGhlIGhvc3Qgd2l0aCBhIG1hdGNoaW5nIHN5c3RlbSBJRC4gU2VlICdtYW4gbHZtc3lzdGVtaWQnIGZvclxuIgorCSJpbmZvcm1hdGlvbiBvbiBsaW1pdGF0aW9ucyBhbmQgY29ycmVjdCB1c2FnZS5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgbm9uZVxuIgorCSIgICAgVGhlIGhvc3QgaGFzIG5vIHN5c3RlbSBJRC5cbiIKKwkiICBsdm1sb2NhbFxuIgorCSIgICAgT2J0YWluIHRoZSBzeXN0ZW0gSUQgZnJvbSB0aGUgc3lzdGVtX2lkIHNldHRpbmcgaW4gdGhlICdsb2NhbCdcbiIKKwkiICAgIHNlY3Rpb24gb2YgYW4gbHZtIGNvbmZpZ3VyYXRpb24gZmlsZSwgZS5nLiBsdm1sb2NhbC5jb25mLlxuIgorCSIgIHVuYW1lXG4iCisJIiAgICBTZXQgdGhlIHN5c3RlbSBJRCBmcm9tIHRoZSBob3N0bmFtZSAodW5hbWUpIG9mIHRoZSBzeXN0ZW0uXG4iCisJIiAgICBTeXN0ZW0gSURzIGJlZ2lubmluZyBsb2NhbGhvc3QgYXJlIG5vdCBwZXJtaXR0ZWQuXG4iCisJIiAgbWFjaGluZWlkXG4iCisJIiAgICBVc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYWNoaW5lLWlkIGZpbGUgdG8gc2V0IHRoZSBzeXN0ZW0gSUQuXG4iCisJIiAgICBTb21lIHN5c3RlbXMgY3JlYXRlIHRoaXMgZmlsZSBhdCBpbnN0YWxsYXRpb24gdGltZS5cbiIKKwkiICAgIFNlZSAnbWFuIG1hY2hpbmUtaWQnIGFuZCBnbG9iYWwvZXRjLlxuIgorCSIgIGZpbGVcbiIKKwkiICAgIFVzZSB0aGUgY29udGVudHMgb2YgYW5vdGhlciBmaWxlIChzeXN0ZW1faWRfZmlsZSkgdG8gc2V0IHRoZVxuIgorCSIgICAgc3lzdGVtIElELlxuIgorCSIjXG4iKQorCitjZmcoZ2xvYmFsX3N5c3RlbV9pZF9maWxlX0NGRywgInN5c3RlbV9pZF9maWxlIiwgZ2xvYmFsX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDIsIDIsIDExNyksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyBhIHN5c3RlbSBJRC5cbiIKKwkiVGhpcyBpcyB1c2VkIHdoZW4gc3lzdGVtX2lkX3NvdXJjZSBpcyBzZXQgdG8gJ2ZpbGUnLlxuIgorCSJDb21tZW50cyBzdGFydGluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgIyBhcmUgaWdub3JlZC5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX2NoZWNrc19DRkcsICJjaGVja3MiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX0FDVElWQVRJT05fQ0hFQ0tTLCB2c24oMiwgMiwgODYpLCBOVUxMLCAwLCBOVUxMLAorCSJQZXJmb3JtIGludGVybmFsIGNoZWNrcyBvZiBsaWJkZXZtYXBwZXIgb3BlcmF0aW9ucy5cbiIKKwkiVXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHJvYmxlbXMgd2l0aCBhY3RpdmF0aW9uLiBTb21lIG9mIHRoZSBjaGVja3MgbWF5XG4iCisJImJlIGV4cGVuc2l2ZSwgc28gaXQncyBiZXN0IHRvIHVzZSB0aGlzIG9ubHkgd2hlbiB0aGVyZSBzZWVtcyB0byBiZSBhXG4iCisJInByb2JsZW0uXG4iKQorCitjZmcoZ2xvYmFsX3VzZV9sdm1wb2xsZF9DRkcsICJ1c2VfbHZtcG9sbGQiLCBnbG9iYWxfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfVVNFX0xWTVBPTExELCB2c24oMiwgMiwgMTIwKSwgIkBERUZBVUxUX1VTRV9MVk1QT0xMREAiLCAwLCBOVUxMLAorCSJVc2UgbHZtcG9sbGQgdG8gc3VwZXJ2aXNlIGxvbmcgcnVubmluZyBMVk0gY29tbWFuZHMuXG4iCisJIldoZW4gZW5hYmxlZCwgY29udHJvbCBvZiBsb25nIHJ1bm5pbmcgTFZNIGNvbW1hbmRzIGlzIHRyYW5zZmVycmVkXG4iCisJImZyb20gdGhlIG9yaWdpbmFsIExWTSBjb21tYW5kIHRvIHRoZSBsdm1wb2xsZCBkYWVtb24uIFRoaXMgYWxsb3dzXG4iCisJInRoZSBvcGVyYXRpb24gdG8gY29udGludWUgaW5kZXBlbmRlbnQgb2YgdGhlIG9yaWdpbmFsIExWTSBjb21tYW5kLlxuIgorCSJBZnRlciBsdm1wb2xsZCB0YWtlcyBvdmVyLCB0aGUgTFZNIGNvbW1hbmQgZGlzcGxheXMgdGhlIHByb2dyZXNzXG4iCisJIm9mIHRoZSBvbmdvaW5nIG9wZXJhdGlvbi4gbHZtcG9sbGQgaXRzZWxmIHJ1bnMgTFZNIGNvbW1hbmRzIHRvXG4iCisJIm1hbmFnZSB0aGUgcHJvZ3Jlc3Mgb2Ygb25nb2luZyBvcGVyYXRpb25zLiBsdm1wb2xsZCBjYW4gYmUgdXNlZCBhc1xuIgorCSJhIG5hdGl2ZSBzeXN0ZW1kIHNlcnZpY2UsIHdoaWNoIGFsbG93cyBpdCB0byBiZSBzdGFydGVkIG9uIGRlbWFuZCxcbiIKKwkiYW5kIHRvIHVzZSBpdHMgb3duIGNvbnRyb2wgZ3JvdXAuIFdoZW4gdGhpcyBvcHRpb24gaXMgZGlzYWJsZWQsIExWTVxuIgorCSJjb21tYW5kcyB3aWxsIHN1cGVydmlzZSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9ucyBieSBmb3JraW5nIHRoZW1zZWx2ZXMuXG4iCisJIkFwcGxpY2FibGUgb25seSBpZiBMVk0gaXMgY29tcGlsZWQgd2l0aCBsdm1wb2xsZCBzdXBwb3J0LlxuIikKKworY2ZnKGdsb2JhbF9ub3RpZnlfZGJ1c19DRkcsICJub3RpZnlfZGJ1cyIsIGdsb2JhbF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9OT1RJRllfREJVUywgdnNuKDIsIDIsIDE0NSksIE5VTEwsIDAsIE5VTEwsCisJIkVuYWJsZSBELUJ1cyBub3RpZmljYXRpb24gZnJvbSBMVk0gY29tbWFuZHMuXG4iCisJIldoZW4gZW5hYmxlZCwgYW4gTFZNIGNvbW1hbmQgdGhhdCBjaGFuZ2VzIFBWcywgY2hhbmdlcyBWRyBtZXRhZGF0YSxcbiIKKwkib3IgY2hhbmdlcyB0aGUgYWN0aXZhdGlvbiBzdGF0ZSBvZiBhbiBMViB3aWxsIHNlbmQgYSBub3RpZmljYXRpb24uXG4iKQorCitjZmcoYWN0aXZhdGlvbl91ZGV2X3N5bmNfQ0ZHLCAidWRldl9zeW5jIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9VREVWX1NZTkMsIHZzbigyLCAyLCA1MSksIE5VTEwsIDAsIE5VTEwsCisJIlVzZSB1ZGV2IG5vdGlmaWNhdGlvbnMgdG8gc3luY2hyb25pemUgdWRldiBhbmQgTFZNLlxuIgorCSJUaGUgLS1ub2RldnN5bmMgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIldoZW4gZGlzYWJsZWQsIExWTSBjb21tYW5kcyB3aWxsIG5vdCB3YWl0IGZvciBub3RpZmljYXRpb25zIGZyb21cbiIKKwkidWRldiwgYnV0IGNvbnRpbnVlIGlycmVzcGVjdGl2ZSBvZiBhbnkgcG9zc2libGUgdWRldiBwcm9jZXNzaW5nIGluXG4iCisJInRoZSBiYWNrZ3JvdW5kLiBPbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcgb3IgaGFzIHJ1bGVzXG4iCisJInRoYXQgaWdub3JlIHRoZSBkZXZpY2VzIExWTSBjcmVhdGVzLiBJZiBlbmFibGVkIHdoZW4gdWRldiBpcyBub3RcbiIKKwkicnVubmluZywgYW5kIExWTSBwcm9jZXNzZXMgYXJlIHdhaXRpbmcgZm9yIHVkZXYsIHJ1biB0aGUgY29tbWFuZFxuIgorCSInZG1zZXR1cCB1ZGV2Y29tcGxldGVfYWxsJyB0byB3YWtlIHRoZW0gdXAuXG4iKQorCitjZmcoYWN0aXZhdGlvbl91ZGV2X3J1bGVzX0NGRywgInVkZXZfcnVsZXMiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1VERVZfUlVMRVMsIHZzbigyLCAyLCA1NyksIE5VTEwsIDAsIE5VTEwsCisJIlVzZSB1ZGV2IHJ1bGVzIHRvIG1hbmFnZSBMViBkZXZpY2Ugbm9kZXMgYW5kIHN5bWxpbmtzLlxuIgorCSJXaGVuIGRpc2FibGVkLCBMVk0gd2lsbCBtYW5hZ2UgdGhlIGRldmljZSBub2RlcyBhbmQgc3ltbGlua3MgZm9yXG4iCisJImFjdGl2ZSBMVnMgaXRzZWxmLiBNYW51YWwgaW50ZXJ2ZW50aW9uIG1heSBiZSByZXF1aXJlZCBpZiB0aGlzXG4iCisJInNldHRpbmcgaXMgY2hhbmdlZCB3aGlsZSBMVnMgYXJlIGFjdGl2ZS5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3ZlcmlmeV91ZGV2X29wZXJhdGlvbnNfQ0ZHLCAidmVyaWZ5X3VkZXZfb3BlcmF0aW9ucyIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfVkVSSUZZX1VERVZfT1BFUkFUSU9OUywgdnNuKDIsIDIsIDg2KSwgTlVMTCwgMCwgTlVMTCwKKwkiVXNlIGV4dHJhIGNoZWNrcyBpbiBMVk0gdG8gdmVyaWZ5IHVkZXYgb3BlcmF0aW9ucy5cbiIKKwkiVGhpcyBlbmFibGVzIGFkZGl0aW9uYWwgY2hlY2tzIChhbmQgaWYgbmVjZXNzYXJ5LCByZXBhaXJzKSBvbiBlbnRyaWVzXG4iCisJImluIHRoZSBkZXZpY2UgZGlyZWN0b3J5IGFmdGVyIHVkZXYgaGFzIGNvbXBsZXRlZCBwcm9jZXNzaW5nIGl0c1xuIgorCSJldmVudHMuIFVzZWZ1bCBmb3IgZGlhZ25vc2luZyBwcm9ibGVtcyB3aXRoIExWTS91ZGV2IGludGVyYWN0aW9ucy5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3JldHJ5X2RlYWN0aXZhdGlvbl9DRkcsICJyZXRyeV9kZWFjdGl2YXRpb24iLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1JFVFJZX0RFQUNUSVZBVElPTiwgdnNuKDIsIDIsIDg5KSwgTlVMTCwgMCwgTlVMTCwKKwkiUmV0cnkgZmFpbGVkIExWIGRlYWN0aXZhdGlvbi5cbiIKKwkiSWYgTFYgZGVhY3RpdmF0aW9uIGZhaWxzLCBMVk0gd2lsbCByZXRyeSBmb3IgYSBmZXcgc2Vjb25kcyBiZWZvcmVcbiIKKwkiZmFpbGluZy4gVGhpcyBtYXkgaGFwcGVuIGJlY2F1c2UgYSBwcm9jZXNzIHJ1biBmcm9tIGEgcXVpY2sgdWRldiBydWxlXG4iCisJInRlbXBvcmFyaWx5IG9wZW5lZCB0aGUgZGV2aWNlLlxuIikKKworY2ZnKGFjdGl2YXRpb25fbWlzc2luZ19zdHJpcGVfZmlsbGVyX0NGRywgIm1pc3Npbmdfc3RyaXBlX2ZpbGxlciIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIENGR19BRFZBTkNFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1NUUklQRV9GSUxMRVIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTWV0aG9kIHRvIGZpbGwgbWlzc2luZyBzdHJpcGVzIHdoZW4gYWN0aXZhdGluZyBhbiBpbmNvbXBsZXRlIExWLlxuIgorCSJVc2luZyAnZXJyb3InIHdpbGwgbWFrZSBpbmFjY2Vzc2libGUgcGFydHMgb2YgdGhlIGRldmljZSByZXR1cm4gSS9PXG4iCisJImVycm9ycyBvbiBhY2Nlc3MuIFlvdSBjYW4gaW5zdGVhZCB1c2UgYSBkZXZpY2UgcGF0aCwgaW4gd2hpY2ggY2FzZSxcbiIKKwkidGhhdCBkZXZpY2Ugd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIG1pc3Npbmcgc3RyaXBlcy4gVXNpbmcgYW55dGhpbmdcbiIKKwkib3RoZXIgdGhhbiAnZXJyb3InIHdpdGggbWlycm9yZWQgb3Igc25hcHNob3R0ZWQgdm9sdW1lcyBpcyBsaWtlbHkgdG9cbiIKKwkicmVzdWx0IGluIGRhdGEgY29ycnVwdGlvbi5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3VzZV9saW5lYXJfdGFyZ2V0X0NGRywgInVzZV9saW5lYXJfdGFyZ2V0IiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9VU0VfTElORUFSX1RBUkdFVCwgdnNuKDIsIDIsIDg5KSwgTlVMTCwgMCwgTlVMTCwKKwkiVXNlIHRoZSBsaW5lYXIgdGFyZ2V0IHRvIG9wdGltaXplIHNpbmdsZSBzdHJpcGUgTFZzLlxuIgorCSJXaGVuIGRpc2FibGVkLCB0aGUgc3RyaXBlZCB0YXJnZXQgaXMgdXNlZC4gVGhlIGxpbmVhciB0YXJnZXQgaXMgYW5cbiIKKwkib3B0aW1pc2VkIHZlcnNpb24gb2YgdGhlIHN0cmlwZWQgdGFyZ2V0IHRoYXQgb25seSBoYW5kbGVzIGEgc2luZ2xlXG4iCisJInN0cmlwZS5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3Jlc2VydmVkX3N0YWNrX0NGRywgInJlc2VydmVkX3N0YWNrIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1JFU0VSVkVEX1NUQUNLLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIlN0YWNrIHNpemUgaW4gS2lCIHRvIHJlc2VydmUgZm9yIHVzZSB3aGlsZSBkZXZpY2VzIGFyZSBzdXNwZW5kZWQuXG4iCisJIkluc3VmZmljZW50IHJlc2VydmUgcmlza3MgSS9PIGRlYWRsb2NrIGR1cmluZyBkZXZpY2Ugc3VzcGVuc2lvbi5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3Jlc2VydmVkX21lbW9yeV9DRkcsICJyZXNlcnZlZF9tZW1vcnkiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfUkVTRVJWRURfTUVNT1JZLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIk1lbW9yeSBzaXplIGluIEtpQiB0byByZXNlcnZlIGZvciB1c2Ugd2hpbGUgZGV2aWNlcyBhcmUgc3VzcGVuZGVkLlxuIgorCSJJbnN1ZmZpY2VudCByZXNlcnZlIHJpc2tzIEkvTyBkZWFkbG9jayBkdXJpbmcgZGV2aWNlIHN1c3BlbnNpb24uXG4iKQorCitjZmcoYWN0aXZhdGlvbl9wcm9jZXNzX3ByaW9yaXR5X0NGRywgInByb2Nlc3NfcHJpb3JpdHkiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfUFJPQ0VTU19QUklPUklUWSwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJOaWNlIHZhbHVlIHVzZWQgd2hpbGUgZGV2aWNlcyBhcmUgc3VzcGVuZGVkLlxuIgorCSJVc2UgYSBoaWdoIHByaW9yaXR5IHNvIHRoYXQgTFZzIGFyZSBzdXNwZW5kZWRcbiIKKwkiZm9yIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSB0aW1lLlxuIikKKworY2ZnX2FycmF5KGFjdGl2YXRpb25fdm9sdW1lX2xpc3RfQ0ZHLCAidm9sdW1lX2xpc3QiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDE4KSwgTlVMTCwgMCwgTlVMTCwKKwkiT25seSBMVnMgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0IGFyZSBhY3RpdmF0ZWQuXG4iCisJIklmIHRoaXMgbGlzdCBpcyBkZWZpbmVkLCBhbiBMViBpcyBvbmx5IGFjdGl2YXRlZCBpZiBpdCBtYXRjaGVzIGFuXG4iCisJImVudHJ5IGluIHRoaXMgbGlzdC4gSWYgdGhpcyBsaXN0IGlzIHVuZGVmaW5lZCwgaXQgaW1wb3NlcyBubyBsaW1pdHNcbiIKKwkib24gTFYgYWN0aXZhdGlvbiAoYWxsIGFyZSBhbGxvd2VkKS5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgdmduYW1lXG4iCisJIiAgICBUaGUgVkcgbmFtZSBpcyBtYXRjaGVkIGV4YWN0bHkgYW5kIHNlbGVjdHMgYWxsIExWcyBpbiB0aGUgVkcuXG4iCisJIiAgdmduYW1lL2x2bmFtZVxuIgorCSIgICAgVGhlIFZHIG5hbWUgYW5kIExWIG5hbWUgYXJlIG1hdGNoZWQgZXhhY3RseSBhbmQgc2VsZWN0cyB0aGUgTFYuXG4iCisJIiAgQHRhZ1xuIgorCSIgICAgU2VsZWN0cyBhbiBMViBpZiB0aGUgc3BlY2lmaWVkIHRhZyBtYXRjaGVzIGEgdGFnIHNldCBvbiB0aGUgTFZcbiIKKwkiICAgIG9yIFZHLlxuIgorCSIgIEAqXG4iCisJIiAgICBTZWxlY3RzIGFuIExWIGlmIGEgdGFnIGRlZmluZWQgb24gdGhlIGhvc3QgaXMgYWxzbyBzZXQgb24gdGhlIExWXG4iCisJIiAgICBvciBWRy4gU2VlIHRhZ3MvaG9zdHRhZ3MuIElmIGFueSBob3N0IHRhZ3MgZXhpc3QgYnV0IHZvbHVtZV9saXN0XG4iCisJIiAgICBpcyBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IHNpbmdsZS1lbnRyeSBsaXN0IGNvbnRhaW5pbmcgJ0AqJ1xuIgorCSIgICAgaXMgYXNzdW1lZC5cbiIKKwkiI1xuIgorCSJFeGFtcGxlXG4iCisJInZvbHVtZV9saXN0ID0gWyBcInZnMVwiLCBcInZnMi9sdm9sMVwiLCBcIkB0YWcxXCIsIFwiQCpcIiBdXG4iCisJIiNcbiIpCisKK2NmZ19hcnJheShhY3RpdmF0aW9uX2F1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdF9DRkcsICJhdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3QiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDIsIDIsIDk3KSwgTlVMTCwgMCwgTlVMTCwKKwkiT25seSBMVnMgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0IGFyZSBhdXRvLWFjdGl2YXRlZC5cbiIKKwkiVGhpcyBsaXN0IHdvcmtzIGxpa2Ugdm9sdW1lX2xpc3QsIGJ1dCBpdCBpcyB1c2VkIG9ubHkgYnlcbiIKKwkiYXV0by1hY3RpdmF0aW9uIGNvbW1hbmRzLiBJdCBkb2VzIG5vdCBhcHBseSB0byBkaXJlY3QgYWN0aXZhdGlvblxuIgorCSJjb21tYW5kcy4gSWYgdGhpcyBsaXN0IGlzIGRlZmluZWQsIGFuIExWIGlzIG9ubHkgYXV0by1hY3RpdmF0ZWRcbiIKKwkiaWYgaXQgbWF0Y2hlcyBhbiBlbnRyeSBpbiB0aGlzIGxpc3QuIElmIHRoaXMgbGlzdCBpcyB1bmRlZmluZWQsIGl0XG4iCisJImltcG9zZXMgbm8gbGltaXRzIG9uIExWIGF1dG8tYWN0aXZhdGlvbiAoYWxsIGFyZSBhbGxvd2VkLikgSWYgdGhpc1xuIgorCSJsaXN0IGlzIGRlZmluZWQgYW5kIGVtcHR5LCBpLmUuIFwiW11cIiwgdGhlbiBubyBMVnMgYXJlIHNlbGVjdGVkIGZvclxuIgorCSJhdXRvLWFjdGl2YXRpb24uIEFuIExWIHRoYXQgaXMgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0IGZvclxuIgorCSJhdXRvLWFjdGl2YXRpb24sIG11c3QgYWxzbyBiZSBzZWxlY3RlZCBieSB2b2x1bWVfbGlzdCAoaWYgZGVmaW5lZClcbiIKKwkiYmVmb3JlIGl0IGlzIGFjdGl2YXRlZC4gQXV0by1hY3RpdmF0aW9uIGlzIGFuIGFjdGl2YXRpb24gY29tbWFuZCB0aGF0XG4iCisJImluY2x1ZGVzIHRoZSAnYScgYXJndW1lbnQ6IC0tYWN0aXZhdGUgYXkgb3IgLWEgYXkuIFRoZSAnYScgKGF1dG8pXG4iCisJImFyZ3VtZW50IGZvciBhdXRvLWFjdGl2YXRpb24gaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBhY3RpdmF0aW9uXG4iCisJImNvbW1hbmRzIHRoYXQgYXJlIHJ1biBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzeXN0ZW0sIGFzIG9wcG9zZWQgdG8gTFZNXG4iCisJImNvbW1hbmRzIHJ1biBkaXJlY3RseSBieSBhIHVzZXIuIEEgdXNlciBtYXkgYWxzbyB1c2UgdGhlICdhJyBmbGFnXG4iCisJImRpcmVjdGx5IHRvIHBlcmZvcm0gYXV0by1hY3RpdmF0aW9uLiBBbHNvIHNlZSBwdnNjYW4oOCkgZm9yIG1vcmVcbiIKKwkiaW5mb3JtYXRpb24gYWJvdXQgYXV0by1hY3RpdmF0aW9uLlxuIgorCSIjXG4iCisJIkFjY2VwdGVkIHZhbHVlczpcbiIKKwkiICB2Z25hbWVcbiIKKwkiICAgIFRoZSBWRyBuYW1lIGlzIG1hdGNoZWQgZXhhY3RseSBhbmQgc2VsZWN0cyBhbGwgTFZzIGluIHRoZSBWRy5cbiIKKwkiICB2Z25hbWUvbHZuYW1lXG4iCisJIiAgICBUaGUgVkcgbmFtZSBhbmQgTFYgbmFtZSBhcmUgbWF0Y2hlZCBleGFjdGx5IGFuZCBzZWxlY3RzIHRoZSBMVi5cbiIKKwkiICBAdGFnXG4iCisJIiAgICBTZWxlY3RzIGFuIExWIGlmIHRoZSBzcGVjaWZpZWQgdGFnIG1hdGNoZXMgYSB0YWcgc2V0IG9uIHRoZSBMVlxuIgorCSIgICAgb3IgVkcuXG4iCisJIiAgQCpcbiIKKwkiICAgIFNlbGVjdHMgYW4gTFYgaWYgYSB0YWcgZGVmaW5lZCBvbiB0aGUgaG9zdCBpcyBhbHNvIHNldCBvbiB0aGUgTFZcbiIKKwkiICAgIG9yIFZHLiBTZWUgdGFncy9ob3N0dGFncy4gSWYgYW55IGhvc3QgdGFncyBleGlzdCBidXQgdm9sdW1lX2xpc3RcbiIKKwkiICAgIGlzIG5vdCBkZWZpbmVkLCBhIGRlZmF1bHQgc2luZ2xlLWVudHJ5IGxpc3QgY29udGFpbmluZyAnQConXG4iCisJIiAgICBpcyBhc3N1bWVkLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkiYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0ID0gWyBcInZnMVwiLCBcInZnMi9sdm9sMVwiLCBcIkB0YWcxXCIsIFwiQCpcIiBdXG4iCisJIiNcbiIpCisKK2NmZ19hcnJheShhY3RpdmF0aW9uX3JlYWRfb25seV92b2x1bWVfbGlzdF9DRkcsICJyZWFkX29ubHlfdm9sdW1lX2xpc3QiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCBDRkdfQUxMT1dfRU1QVFkgfCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDIsIDIsIDg5KSwgTlVMTCwgMCwgTlVMTCwKKwkiTFZzIGluIHRoaXMgbGlzdCBhcmUgYWN0aXZhdGVkIGluIHJlYWQtb25seSBtb2RlLlxuIgorCSJJZiB0aGlzIGxpc3QgaXMgZGVmaW5lZCwgZWFjaCBMViB0aGF0IGlzIHRvIGJlIGFjdGl2YXRlZCBpcyBjaGVja2VkXG4iCisJImFnYWluc3QgdGhpcyBsaXN0LCBhbmQgaWYgaXQgbWF0Y2hlcywgaXQgaXMgYWN0aXZhdGVkIGluIHJlYWQtb25seVxuIgorCSJtb2RlLiBUaGlzIG92ZXJyaWRlcyB0aGUgcGVybWlzc2lvbiBzZXR0aW5nIHN0b3JlZCBpbiB0aGUgbWV0YWRhdGEsXG4iCisJImUuZy4gZnJvbSAtLXBlcm1pc3Npb24gcncuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIHZnbmFtZVxuIgorCSIgICAgVGhlIFZHIG5hbWUgaXMgbWF0Y2hlZCBleGFjdGx5IGFuZCBzZWxlY3RzIGFsbCBMVnMgaW4gdGhlIFZHLlxuIgorCSIgIHZnbmFtZS9sdm5hbWVcbiIKKwkiICAgIFRoZSBWRyBuYW1lIGFuZCBMViBuYW1lIGFyZSBtYXRjaGVkIGV4YWN0bHkgYW5kIHNlbGVjdHMgdGhlIExWLlxuIgorCSIgIEB0YWdcbiIKKwkiICAgIFNlbGVjdHMgYW4gTFYgaWYgdGhlIHNwZWNpZmllZCB0YWcgbWF0Y2hlcyBhIHRhZyBzZXQgb24gdGhlIExWXG4iCisJIiAgICBvciBWRy5cbiIKKwkiICBAKlxuIgorCSIgICAgU2VsZWN0cyBhbiBMViBpZiBhIHRhZyBkZWZpbmVkIG9uIHRoZSBob3N0IGlzIGFsc28gc2V0IG9uIHRoZSBMVlxuIgorCSIgICAgb3IgVkcuIFNlZSB0YWdzL2hvc3R0YWdzLiBJZiBhbnkgaG9zdCB0YWdzIGV4aXN0IGJ1dCB2b2x1bWVfbGlzdFxuIgorCSIgICAgaXMgbm90IGRlZmluZWQsIGEgZGVmYXVsdCBzaW5nbGUtZW50cnkgbGlzdCBjb250YWluaW5nICdAKidcbiIKKwkiICAgIGlzIGFzc3VtZWQuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJyZWFkX29ubHlfdm9sdW1lX2xpc3QgPSBbIFwidmcxXCIsIFwidmcyL2x2b2wxXCIsIFwiQHRhZzFcIiwgXCJAKlwiIF1cbiIKKwkiI1xuIikKKworY2ZnKGFjdGl2YXRpb25fbWlycm9yX3JlZ2lvbl9zaXplX0NGRywgIm1pcnJvcl9yZWdpb25fc2l6ZSIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9SQUlEX1JFR0lPTl9TSVpFLCB2c24oMSwgMCwgMCksIE5VTEwsIHZzbigyLCAyLCA5OSksCisJIlRoaXMgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGFjdGl2YXRpb24vcmFpZF9yZWdpb25fc2l6ZSBzZXR0aW5nLlxuIiwKKyAgICAgICAgIlNpemUgaW4gS2lCIG9mIGVhY2ggY29weSBvcGVyYXRpb24gd2hlbiBtaXJyb3JpbmcuXG4iKQorCitjZmcoYWN0aXZhdGlvbl9yYWlkX3JlZ2lvbl9zaXplX0NGRywgInJhaWRfcmVnaW9uX3NpemUiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfUkFJRF9SRUdJT05fU0laRSwgdnNuKDIsIDIsIDk5KSwgTlVMTCwgMCwgTlVMTCwKKwkiU2l6ZSBpbiBLaUIgb2YgZWFjaCByYWlkIG9yIG1pcnJvciBzeW5jaHJvbml6YXRpb24gcmVnaW9uLlxuIgorCSJGb3IgcmFpZCBvciBtaXJyb3Igc2VnbWVudCB0eXBlcywgdGhpcyBpcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpc1xuIgorCSJjb3BpZWQgYXQgb25jZSB3aGVuIGluaXRpYWxpemluZywgb3IgbW92ZWQgYXQgb25jZSBieSBwdm1vdmUuXG4iKQorCitjZmcoYWN0aXZhdGlvbl9lcnJvcl93aGVuX2Z1bGxfQ0ZHLCAiZXJyb3Jfd2hlbl9mdWxsIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX0VSUk9SX1dIRU5fRlVMTCwgdnNuKDIsIDIsIDExNSksIE5VTEwsIDAsIE5VTEwsCisJIlJldHVybiBlcnJvcnMgaWYgYSB0aGluIHBvb2wgcnVucyBvdXQgb2Ygc3BhY2UuXG4iCisJIlRoZSAtLWVycm9yd2hlbmZ1bGwgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIldoZW4gZW5hYmxlZCwgd3JpdGVzIHRvIHRoaW4gTFZzIGltbWVkaWF0ZWx5IHJldHVybiBhbiBlcnJvciBpZiB0aGVcbiIKKwkidGhpbiBwb29sIGlzIG91dCBvZiBkYXRhIHNwYWNlLiBXaGVuIGRpc2FibGVkLCB3cml0ZXMgdG8gdGhpbiBMVnNcbiIKKwkiYXJlIHF1ZXVlZCBpZiB0aGUgdGhpbiBwb29sIGlzIG91dCBvZiBzcGFjZSwgYW5kIHByb2Nlc3NlZCB3aGVuIHRoZVxuIgorCSJ0aGluIHBvb2wgZGF0YSBzcGFjZSBpcyBleHRlbmRlZC4gTmV3IHRoaW4gcG9vbHMgYXJlIGFzc2lnbmVkIHRoZVxuIgorCSJiZWhhdmlvciBkZWZpbmVkIGhlcmUuXG4iKQorCitjZmcoYWN0aXZhdGlvbl9yZWFkYWhlYWRfQ0ZHLCAicmVhZGFoZWFkIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1JFQURfQUhFQUQsIHZzbigxLCAwLCAyMyksIE5VTEwsIDAsIE5VTEwsCisJIlNldHRpbmcgdG8gdXNlIHdoZW4gdGhlcmUgaXMgbm8gcmVhZGFoZWFkIHNldHRpbmcgaW4gbWV0YWRhdGEuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIG5vbmVcbiIKKwkiICAgIERpc2FibGUgcmVhZGFoZWFkLlxuIgorCSIgIGF1dG9cbiIKKwkiICAgIFVzZSBkZWZhdWx0IHZhbHVlIGNob3NlbiBieSBrZXJuZWwuXG4iCisJIiNcbiIpCisKK2NmZyhhY3RpdmF0aW9uX3JhaWRfZmF1bHRfcG9saWN5X0NGRywgInJhaWRfZmF1bHRfcG9saWN5IiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1JBSURfRkFVTFRfUE9MSUNZLCB2c24oMiwgMiwgODkpLCBOVUxMLCAwLCBOVUxMLAorCSJEZWZpbmVzIGhvdyBhIGRldmljZSBmYWlsdXJlIGluIGEgUkFJRCBMViBpcyBoYW5kbGVkLlxuIgorCSJUaGlzIGluY2x1ZGVzIExWcyB0aGF0IGhhdmUgdGhlIGZvbGxvd2luZyBzZWdtZW50IHR5cGVzOlxuIgorCSJyYWlkMSwgcmFpZDQsIHJhaWQ1KiwgYW5kIHJhaWQ2Ki5cbiIKKwkiSWYgYSBkZXZpY2UgaW4gdGhlIExWIGZhaWxzLCB0aGUgcG9saWN5IGRldGVybWluZXMgdGhlIHN0ZXBzXG4iCisJInBlcmZvcm1lZCBieSBkbWV2ZW50ZCBhdXRvbWF0aWNhbGx5LCBhbmQgdGhlIHN0ZXBzIHBlcmZvbWVkIGJ5IHRoZVxuIgorCSJtYW51YWwgY29tbWFuZCBsdmNvbnZlcnQgLS1yZXBhaXIgLS11c2UtcG9saWNpZXMuXG4iCisJIkF1dG9tYXRpYyBoYW5kbGluZyByZXF1aXJlcyBkbWV2ZW50ZCB0byBiZSBtb25pdG9yaW5nIHRoZSBMVi5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgd2FyblxuIgorCSIgICAgVXNlIHRoZSBzeXN0ZW0gbG9nIHRvIHdhcm4gdGhlIHVzZXIgdGhhdCBhIGRldmljZSBpbiB0aGUgUkFJRCBMVlxuIgorCSIgICAgaGFzIGZhaWxlZC4gSXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBydW4gbHZjb252ZXJ0IC0tcmVwYWlyXG4iCisJIiAgICBtYW51YWxseSB0byByZW1vdmUgb3IgcmVwbGFjZSB0aGUgZmFpbGVkIGRldmljZS4gQXMgbG9uZyBhcyB0aGVcbiIKKwkiICAgIG51bWJlciBvZiBmYWlsZWQgZGV2aWNlcyBkb2VzIG5vdCBleGNlZWQgdGhlIHJlZHVuZGFuY3kgb2YgdGhlIExWXG4iCisJIiAgICAoMSBkZXZpY2UgZm9yIHJhaWQ0LzUsIDIgZm9yIHJhaWQ2KSwgdGhlIExWIHdpbGwgcmVtYWluIHVzYWJsZS5cbiIKKwkiICBhbGxvY2F0ZVxuIgorCSIgICAgQXR0ZW1wdCB0byB1c2UgYW55IGV4dHJhIHBoeXNpY2FsIHZvbHVtZXMgaW4gdGhlIFZHIGFzIHNwYXJlcyBhbmRcbiIKKwkiICAgIHJlcGxhY2UgZmF1bHR5IGRldmljZXMuXG4iCisJIiNcbiIpCisKK2NmZ19ydW50aW1lKGFjdGl2YXRpb25fbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeV9DRkcsICJtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5IiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCB2c24oMiwgMiwgNTcpLCAwLCBOVUxMLAorCSJEZWZpbmVzIGhvdyBhIGRldmljZSBmYWlsdXJlIGluIGEgJ21pcnJvcicgTFYgaXMgaGFuZGxlZC5cbiIKKwkiQW4gTFYgd2l0aCB0aGUgJ21pcnJvcicgc2VnbWVudCB0eXBlIGlzIGNvbXBvc2VkIG9mIG1pcnJvciBpbWFnZXNcbiIKKwkiKGNvcGllcykgYW5kIGEgbWlycm9yIGxvZy4gQSBkaXNrIGxvZyBlbnN1cmVzIHRoYXQgYSBtaXJyb3IgTFYgZG9lc1xuIgorCSJub3QgbmVlZCB0byBiZSByZS1zeW5jZWQgKGFsbCBjb3BpZXMgbWFkZSB0aGUgc2FtZSkgZXZlcnkgdGltZSBhXG4iCisJIm1hY2hpbmUgcmVib290cyBvciBjcmFzaGVzLiBJZiBhIGRldmljZSBpbiB0aGUgTFYgZmFpbHMsIHRoaXMgcG9saWN5XG4iCisJImRldGVybWluZXMgdGhlIHN0ZXBzIHBlcmZvbWVkIGJ5IGRtZXZlbnRkIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgc3RlcHNcbiIKKwkicGVyZm9ybWVkIGJ5IHRoZSBtYW51YWwgY29tbWFuZCBsdmNvbnZlcnQgLS1yZXBhaXIgLS11c2UtcG9saWNpZXMuXG4iCisJIkF1dG9tYXRpYyBoYW5kbGluZyByZXF1aXJlcyBkbWV2ZW50ZCB0byBiZSBtb25pdG9yaW5nIHRoZSBMVi5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgcmVtb3ZlXG4iCisJIiAgICBTaW1wbHkgcmVtb3ZlIHRoZSBmYXVsdHkgZGV2aWNlIGFuZCBydW4gd2l0aG91dCBpdC4gSWYgdGhlIGxvZ1xuIgorCSIgICAgZGV2aWNlIGZhaWxzLCB0aGUgbWlycm9yIHdvdWxkIGNvbnZlcnQgdG8gdXNpbmcgYW4gaW4tbWVtb3J5IGxvZy5cbiIKKwkiICAgIFRoaXMgbWVhbnMgdGhlIG1pcnJvciB3aWxsIG5vdCByZW1lbWJlciBpdHMgc3luYyBzdGF0dXMgYWNyb3NzXG4iCisJIiAgICBjcmFzaGVzL3JlYm9vdHMgYW5kIHRoZSBlbnRpcmUgbWlycm9yIHdpbGwgYmUgcmUtc3luY2VkLiBJZiBhXG4iCisJIiAgICBtaXJyb3IgaW1hZ2UgZmFpbHMsIHRoZSBtaXJyb3Igd2lsbCBjb252ZXJ0IHRvIGEgbm9uLW1pcnJvcmVkXG4iCisJIiAgICBkZXZpY2UgaWYgdGhlcmUgaXMgb25seSBvbmUgcmVtYWluaW5nIGdvb2QgY29weS5cbiIKKwkiICBhbGxvY2F0ZVxuIgorCSIgICAgUmVtb3ZlIHRoZSBmYXVsdHkgZGV2aWNlIGFuZCB0cnkgdG8gYWxsb2NhdGUgc3BhY2Ugb24gYSBuZXdcbiIKKwkiICAgIGRldmljZSB0byBiZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZmFpbGVkIGRldmljZS4gVXNpbmcgdGhpc1xuIgorCSIgICAgcG9saWN5IGZvciB0aGUgbG9nIGlzIGZhc3QgYW5kIG1haW50YWlucyB0aGUgYWJpbGl0eSB0byByZW1lbWJlclxuIgorCSIgICAgc3luYyBzdGF0ZSB0aHJvdWdoIGNyYXNoZXMvcmVib290cy4gVXNpbmcgdGhpcyBwb2xpY3kgZm9yIGFcbiIKKwkiICAgIG1pcnJvciBkZXZpY2UgaXMgc2xvdywgYXMgaXQgcmVxdWlyZXMgdGhlIG1pcnJvciB0byByZXN5bmNocm9uaXplXG4iCisJIiAgICB0aGUgZGV2aWNlcywgYnV0IGl0IHdpbGwgcHJlc2VydmUgdGhlIG1pcnJvciBjaGFyYWN0ZXJpc3RpYyBvZlxuIgorCSIgICAgdGhlIGRldmljZS4gVGhpcyBwb2xpY3kgYWN0cyBsaWtlICdyZW1vdmUnIGlmIG5vIHN1aXRhYmxlIGRldmljZVxuIgorCSIgICAgYW5kIHNwYWNlIGNhbiBiZSBhbGxvY2F0ZWQgZm9yIHRoZSByZXBsYWNlbWVudC5cbiIKKwkiICBhbGxvY2F0ZV9hbnl3aGVyZVxuIgorCSIgICAgTm90IHlldCBpbXBsZW1lbnRlZC4gVXNlZnVsIHRvIHBsYWNlIHRoZSBsb2cgZGV2aWNlIHRlbXBvcmFyaWx5XG4iCisJIiAgICBvbiB0aGUgc2FtZSBwaHlzaWNhbCB2b2x1bWUgYXMgb25lIG9mIHRoZSBtaXJyb3IgaW1hZ2VzLiBUaGlzXG4iCisJIiAgICBwb2xpY3kgaXMgbm90IHJlY29tbWVuZGVkIGZvciBtaXJyb3IgZGV2aWNlcyBzaW5jZSBpdCB3b3VsZCBicmVha1xuIgorCSIgICAgdGhlIHJlZHVuZGFudCBuYXR1cmUgb2YgdGhlIG1pcnJvci4gVGhpcyBwb2xpY3kgYWN0cyBsaWtlXG4iCisJIiAgICAncmVtb3ZlJyBpZiBubyBzdWl0YWJsZSBkZXZpY2UgYW5kIHNwYWNlIGNhbiBiZSBhbGxvY2F0ZWQgZm9yIHRoZVxuIgorCSIgICAgcmVwbGFjZW1lbnQuXG4iCisJIiNcbiIpCisKK2NmZyhhY3RpdmF0aW9uX21pcnJvcl9sb2dfZmF1bHRfcG9saWN5X0NGRywgIm1pcnJvcl9sb2dfZmF1bHRfcG9saWN5IiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX01JUlJPUl9MT0dfRkFVTFRfUE9MSUNZLCB2c24oMSwgMiwgMTgpLCBOVUxMLCAwLCBOVUxMLAorCSJEZWZpbmVzIGhvdyBhIGRldmljZSBmYWlsdXJlIGluIGEgJ21pcnJvcicgbG9nIExWIGlzIGhhbmRsZWQuXG4iCisJIlRoZSBtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5IGRlc2NyaXB0aW9uIGZvciBtaXJyb3JlZCBMVnMgYWxzb1xuIgorCSJhcHBsaWVzIHRvIG1pcnJvcmVkIGxvZyBMVnMuXG4iKQorCitjZmcoYWN0aXZhdGlvbl9taXJyb3JfZGV2aWNlX2ZhdWx0X3BvbGljeV9DRkcsICJtaXJyb3JfZGV2aWNlX2ZhdWx0X3BvbGljeSIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9NSVJST1JfREVWSUNFX0ZBVUxUX1BPTElDWSwgdnNuKDEsIDIsIDEwKSwgTlVMTCwgdnNuKDIsIDIsIDU3KSwKKwkiVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYWN0aXZhdGlvbi9taXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5IHNldHRpbmcuXG4iLAorCSJEZWZpbmUgaG93IGEgZGV2aWNlIGZhaWx1cmUgYWZmZWN0aW5nIGEgbWlycm9yIGlzIGhhbmRsZWQuXG4iKQorCitjZmcoYWN0aXZhdGlvbl9zbmFwc2hvdF9hdXRvZXh0ZW5kX3RocmVzaG9sZF9DRkcsICJzbmFwc2hvdF9hdXRvZXh0ZW5kX3RocmVzaG9sZCIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9TTkFQU0hPVF9BVVRPRVhURU5EX1RIUkVTSE9MRCwgdnNuKDIsIDIsIDc1KSwgTlVMTCwgMCwgTlVMTCwKKwkiQXV0by1leHRlbmQgYSBzbmFwc2hvdCB3aGVuIGl0cyB1c2FnZSBleGNlZWRzIHRoaXMgcGVyY2VudC5cbiIKKwkiU2V0dGluZyB0aGlzIHRvIDEwMCBkaXNhYmxlcyBhdXRvbWF0aWMgZXh0ZW5zaW9uLlxuIgorCSJUaGUgbWluaW11bSB2YWx1ZSBpcyA1MCAoYSBzbWFsbGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgNTAuKVxuIgorCSJBbHNvIHNlZSBzbmFwc2hvdF9hdXRvZXh0ZW5kX3BlcmNlbnQuXG4iCisJIkF1dG9tYXRpYyBleHRlbnNpb24gcmVxdWlyZXMgZG1ldmVudGQgdG8gYmUgbW9uaXRvcmluZyB0aGUgTFYuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJVc2luZyA3MCUgYXV0b2V4dGVuZCB0aHJlc2hvbGQgYW5kIDIwJSBhdXRvZXh0ZW5kIHNpemUsIHdoZW4gYSAxR1xuIgorCSJzbmFwc2hvdCBleGNlZWRzIDcwME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuMkcsIGFuZCB3aGVuIGl0IGV4Y2VlZHNcbiIKKwkiODQwTSwgaXQgaXMgZXh0ZW5kZWQgdG8gMS40NEc6XG4iCisJInNuYXBzaG90X2F1dG9leHRlbmRfdGhyZXNob2xkID0gNzBcbiIKKwkiI1xuIikKKworY2ZnKGFjdGl2YXRpb25fc25hcHNob3RfYXV0b2V4dGVuZF9wZXJjZW50X0NGRywgInNuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudCIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9TTkFQU0hPVF9BVVRPRVhURU5EX1BFUkNFTlQsIHZzbigyLCAyLCA3NSksIE5VTEwsIDAsIE5VTEwsCisJIkF1dG8tZXh0ZW5kaW5nIGEgc25hcHNob3QgYWRkcyB0aGlzIHBlcmNlbnQgZXh0cmEgc3BhY2UuXG4iCisJIlRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBzcGFjZSBhZGRlZCB0byBhIHNuYXBzaG90IGlzIHRoaXNcbiIKKwkicGVyY2VudCBvZiBpdHMgY3VycmVudCBzaXplLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkiVXNpbmcgNzAlIGF1dG9leHRlbmQgdGhyZXNob2xkIGFuZCAyMCUgYXV0b2V4dGVuZCBzaXplLCB3aGVuIGEgMUdcbiIKKwkic25hcHNob3QgZXhjZWVkcyA3MDBNLCBpdCBpcyBleHRlbmRlZCB0byAxLjJHLCBhbmQgd2hlbiBpdCBleGNlZWRzXG4iCisJIjg0ME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuNDRHOlxuIgorCSJzbmFwc2hvdF9hdXRvZXh0ZW5kX3BlcmNlbnQgPSAyMFxuIgorCSIjXG4iKQorCitjZmcoYWN0aXZhdGlvbl90aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGRfQ0ZHLCAidGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfUFJPRklMQUJMRV9NRVRBREFUQSwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1RISU5fUE9PTF9BVVRPRVhURU5EX1RIUkVTSE9MRCwgdnNuKDIsIDIsIDg5KSwgTlVMTCwgMCwgTlVMTCwKKwkiQXV0by1leHRlbmQgYSB0aGluIHBvb2wgd2hlbiBpdHMgdXNhZ2UgZXhjZWVkcyB0aGlzIHBlcmNlbnQuXG4iCisJIlNldHRpbmcgdGhpcyB0byAxMDAgZGlzYWJsZXMgYXV0b21hdGljIGV4dGVuc2lvbi5cbiIKKwkiVGhlIG1pbmltdW0gdmFsdWUgaXMgNTAgKGEgc21hbGxlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIDUwLilcbiIKKwkiQWxzbyBzZWUgdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudC5cbiIKKwkiQXV0b21hdGljIGV4dGVuc2lvbiByZXF1aXJlcyBkbWV2ZW50ZCB0byBiZSBtb25pdG9yaW5nIHRoZSBMVi5cbiIKKwkiI1xuIgorCSJFeGFtcGxlXG4iCisJIlVzaW5nIDcwJSBhdXRvZXh0ZW5kIHRocmVzaG9sZCBhbmQgMjAlIGF1dG9leHRlbmQgc2l6ZSwgd2hlbiBhIDFHXG4iCisJInRoaW4gcG9vbCBleGNlZWRzIDcwME0sIGl0IGlzIGV4dGVuZGVkIHRvIDEuMkcsIGFuZCB3aGVuIGl0IGV4Y2VlZHNcbiIKKwkiODQwTSwgaXQgaXMgZXh0ZW5kZWQgdG8gMS40NEc6XG4iCisJInRoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG9sZCA9IDcwXG4iCisJIiNcbiIpCisKK2NmZyhhY3RpdmF0aW9uX3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnRfQ0ZHLCAidGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX1BST0ZJTEFCTEVfTUVUQURBVEEsIENGR19UWVBFX0lOVCwgREVGQVVMVF9USElOX1BPT0xfQVVUT0VYVEVORF9QRVJDRU5ULCB2c24oMiwgMiwgODkpLCBOVUxMLCAwLCBOVUxMLAorCSJBdXRvLWV4dGVuZGluZyBhIHRoaW4gcG9vbCBhZGRzIHRoaXMgcGVyY2VudCBleHRyYSBzcGFjZS5cbiIKKwkiVGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHNwYWNlIGFkZGVkIHRvIGEgdGhpbiBwb29sIGlzIHRoaXNcbiIKKwkicGVyY2VudCBvZiBpdHMgY3VycmVudCBzaXplLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkiVXNpbmcgNzAlIGF1dG9leHRlbmQgdGhyZXNob2xkIGFuZCAyMCUgYXV0b2V4dGVuZCBzaXplLCB3aGVuIGEgMUdcbiIKKwkidGhpbiBwb29sIGV4Y2VlZHMgNzAwTSwgaXQgaXMgZXh0ZW5kZWQgdG8gMS4yRywgYW5kIHdoZW4gaXQgZXhjZWVkc1xuIgorCSI4NDBNLCBpdCBpcyBleHRlbmRlZCB0byAxLjQ0RzpcbiIKKwkidGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCA9IDIwXG4iCisJIiNcbiIpCisKK2NmZ19hcnJheShhY3RpdmF0aW9uX21sb2NrX2ZpbHRlcl9DRkcsICJtbG9ja19maWx0ZXIiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9VTkRFRklORUQgfCBDRkdfQURWQU5DRUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDIsIDIsIDYyKSwgTlVMTCwgMCwgTlVMTCwKKwkiRG8gbm90IG1sb2NrIHRoZXNlIG1lbW9yeSBhcmVhcy5cbiIKKwkiV2hpbGUgYWN0aXZhdGluZyBkZXZpY2VzLCBJL08gdG8gZGV2aWNlcyBiZWluZyAocmUpY29uZmlndXJlZCBpc1xuIgorCSJzdXNwZW5kZWQuIEFzIGEgcHJlY2F1dGlvbiBhZ2FpbnN0IGRlYWRsb2NrcywgTFZNIHBpbnMgbWVtb3J5IGl0IGlzXG4iCisJInVzaW5nIHNvIGl0IGlzIG5vdCBwYWdlZCBvdXQsIGFuZCB3aWxsIG5vdCByZXF1aXJlIEkvTyB0byByZXJlYWQuXG4iCisJIkdyb3VwcyBvZiBwYWdlcyB0aGF0IGFyZSBrbm93biBub3QgdG8gYmUgYWNjZXNzZWQgZHVyaW5nIGFjdGl2YXRpb25cbiIKKwkiZG8gbm90IG5lZWQgdG8gYmUgcGlubmVkIGludG8gbWVtb3J5LiBFYWNoIHN0cmluZyBsaXN0ZWQgaW4gdGhpc1xuIgorCSJzZXR0aW5nIGlzIGNvbXBhcmVkIGFnYWluc3QgZWFjaCBsaW5lIGluIC9wcm9jL3NlbGYvbWFwcywgYW5kIHRoZVxuIgorCSJwYWdlcyBjb3JyZXNwb25kaW5nIHRvIGxpbmVzIHRoYXQgbWF0Y2ggYXJlIG5vdCBwaW5uZWQuIE9uIHNvbWVcbiIKKwkic3lzdGVtcywgbG9jYWxlLWFyY2hpdmUgd2FzIGZvdW5kIHRvIG1ha2UgdXAgb3ZlciA4MCUgb2YgdGhlIG1lbW9yeVxuIgorCSJ1c2VkIGJ5IHRoZSBwcm9jZXNzLlxuIgorCSIjXG4iCisJIkV4YW1wbGVcbiIKKwkibWxvY2tfZmlsdGVyID0gWyBcImxvY2FsZS9sb2NhbGUtYXJjaGl2ZVwiLCBcImdjb252L2djb252LW1vZHVsZXMuY2FjaGVcIiBdXG4iCisJIiNcbiIpCisKK2NmZyhhY3RpdmF0aW9uX3VzZV9tbG9ja2FsbF9DRkcsICJ1c2VfbWxvY2thbGwiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1VTRV9NTE9DS0FMTCwgdnNuKDIsIDIsIDYyKSwgTlVMTCwgMCwgTlVMTCwKKwkiVXNlIHRoZSBvbGQgYmVoYXZpb3Igb2YgbWxvY2thbGwgdG8gcGluIGFsbCBtZW1vcnkuXG4iCisJIlByaW9yIHRvIHZlcnNpb24gMi4wMi42MiwgTFZNIHVzZWQgbWxvY2thbGwoKSB0byBwaW4gdGhlIHdob2xlXG4iCisJInByb2Nlc3MncyBtZW1vcnkgd2hpbGUgYWN0aXZhdGluZyBkZXZpY2VzLlxuIikKKworY2ZnKGFjdGl2YXRpb25fbW9uaXRvcmluZ19DRkcsICJtb25pdG9yaW5nIiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9ETUVWRU5URF9NT05JVE9SLCB2c24oMiwgMiwgNjMpLCBOVUxMLCAwLCBOVUxMLAorCSJNb25pdG9yIExWcyB0aGF0IGFyZSBhY3RpdmF0ZWQuXG4iCisJIlRoZSAtLWlnbm9yZW1vbml0b3Jpbmcgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIldoZW4gZW5hYmxlZCwgTFZNIHdpbGwgYXNrIGRtZXZlbnRkIHRvIG1vbml0b3IgYWN0aXZhdGVkIExWcy5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX3BvbGxpbmdfaW50ZXJ2YWxfQ0ZHLCAicG9sbGluZ19pbnRlcnZhbCIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX0lOVCwgREVGQVVMVF9JTlRFUlZBTCwgdnNuKDIsIDIsIDYzKSwgTlVMTCwgMCwgTlVMTCwKKwkiQ2hlY2sgcHZtb3ZlIG9yIGx2Y29udmVydCBwcm9ncmVzcyBhdCB0aGlzIGludGVydmFsIChzZWNvbmRzKS5cbiIKKwkiV2hlbiBwdm1vdmUgb3IgbHZjb252ZXJ0IG11c3Qgd2FpdCBmb3IgdGhlIGtlcm5lbCB0byBmaW5pc2hcbiIKKwkic3luY2hyb25pc2luZyBvciBtZXJnaW5nIGRhdGEsIHRoZXkgY2hlY2sgYW5kIHJlcG9ydCBwcm9ncmVzcyBhdFxuIgorCSJpbnRlcnZhbHMgb2YgdGhpcyBudW1iZXIgb2Ygc2Vjb25kcy4gSWYgdGhpcyBpcyBzZXQgdG8gMCBhbmQgdGhlcmVcbiIKKwkiaXMgb25seSBvbmUgdGhpbmcgdG8gd2FpdCBmb3IsIHRoZXJlIGFyZSBubyBwcm9ncmVzcyByZXBvcnRzLCBidXRcbiIKKwkidGhlIHByb2Nlc3MgaXMgYXdva2VuIGltbWVkaWF0ZWx5IG9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiIpCisKK2NmZyhhY3RpdmF0aW9uX2F1dG9fc2V0X2FjdGl2YXRpb25fc2tpcF9DRkcsICJhdXRvX3NldF9hY3RpdmF0aW9uX3NraXAiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfQVVUT19TRVRfQUNUSVZBVElPTl9TS0lQLCB2c24oMiwyLDk5KSwgTlVMTCwgMCwgTlVMTCwKKwkiU2V0IHRoZSBhY3RpdmF0aW9uIHNraXAgZmxhZyBvbiBuZXcgdGhpbiBzbmFwc2hvdCBMVnMuXG4iCisJIlRoZSAtLXNldGFjdGl2YXRpb25za2lwIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBzZXR0aW5nLlxuIgorCSJBbiBMViBjYW4gaGF2ZSBhIHBlcnNpc3RlbnQgJ2FjdGl2YXRpb24gc2tpcCcgZmxhZy4gVGhlIGZsYWcgY2F1c2VzXG4iCisJInRoZSBMViB0byBiZSBza2lwcGVkIGR1cmluZyBub3JtYWwgYWN0aXZhdGlvbi4gVGhlIGx2Y2hhbmdlL3ZnY2hhbmdlXG4iCisJIi1LIG9wdGlvbiBpcyByZXF1aXJlZCB0byBhY3RpdmF0ZSBMVnMgdGhhdCBoYXZlIHRoZSBhY3RpdmF0aW9uIHNraXBcbiIKKwkiZmxhZyBzZXQuIFdoZW4gdGhpcyBzZXR0aW5nIGlzIGVuYWJsZWQsIHRoZSBhY3RpdmF0aW9uIHNraXAgZmxhZyBpc1xuIgorCSJzZXQgb24gbmV3IHRoaW4gc25hcHNob3QgTFZzLlxuIikKKworY2ZnKGFjdGl2YXRpb25fbW9kZV9DRkcsICJhY3RpdmF0aW9uX21vZGUiLCBhY3RpdmF0aW9uX0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfQUNUSVZBVElPTl9NT0RFLCB2c24oMiwyLDEwOCksIE5VTEwsIDAsIE5VTEwsCisJIkhvdyBMVnMgd2l0aCBtaXNzaW5nIGRldmljZXMgYXJlIGFjdGl2YXRlZC5cbiIKKwkiVGhlIC0tYWN0aXZhdGlvbm1vZGUgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIGNvbXBsZXRlXG4iCisJIiAgICBPbmx5IGFsbG93IGFjdGl2YXRpb24gb2YgYW4gTFYgaWYgYWxsIG9mIHRoZSBQaHlzaWNhbCBWb2x1bWVzIGl0XG4iCisJIiAgICB1c2VzIGFyZSBwcmVzZW50LiBPdGhlciBQVnMgaW4gdGhlIFZvbHVtZSBHcm91cCBtYXkgYmUgbWlzc2luZy5cbiIKKwkiICBkZWdyYWRlZFxuIgorCSIgICAgTGlrZSBjb21wbGV0ZSwgYnV0IGFkZGl0aW9uYWxseSBSQUlEIExWcyBvZiBzZWdtZW50IHR5cGUgcmFpZDEsXG4iCisJIiAgICByYWlkNCwgcmFpZDUsIHJhZGlkNiBhbmQgcmFpZDEwIHdpbGwgYmUgYWN0aXZhdGVkIGlmIHRoZXJlIGlzIG5vXG4iCisJIiAgICBkYXRhIGxvc3MsIGkuZS4gdGhleSBoYXZlIHN1ZmZpY2llbnQgcmVkdW5kYW5jeSB0byBwcmVzZW50IHRoZVxuIgorCSIgICAgZW50aXJlIGFkZHJlc3NhYmxlIHJhbmdlIG9mIHRoZSBMb2dpY2FsIFZvbHVtZS5cbiIKKwkiICBwYXJ0aWFsXG4iCisJIiAgICBBbGxvd3MgdGhlIGFjdGl2YXRpb24gb2YgYW55IExWIGV2ZW4gaWYgYSBtaXNzaW5nIG9yIGZhaWxlZCBQVlxuIgorCSIgICAgY291bGQgY2F1c2UgZGF0YSBsb3NzIHdpdGggYSBwb3J0aW9uIG9mIHRoZSBMViBpbmFjY2Vzc2libGUuXG4iCisJIiAgICBUaGlzIHNldHRpbmcgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLCBidXQgbWF5IHNvbWV0aW1lc1xuIgorCSIgICAgYXNzaXN0IHdpdGggZGF0YSByZWNvdmVyeS5cbiIKKwkiI1xuIikKKworY2ZnX2FycmF5KGFjdGl2YXRpb25fbG9ja19zdGFydF9saXN0X0NGRywgImxvY2tfc3RhcnRfbGlzdCIsIGFjdGl2YXRpb25fQ0ZHX1NFQ1RJT04sIENGR19BTExPV19FTVBUWXxDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDIsIDIsIDEyNCksIE5VTEwsIDAsIE5VTEwsCisJIkxvY2tpbmcgaXMgc3RhcnRlZCBvbmx5IGZvciBWR3Mgc2VsZWN0ZWQgYnkgdGhpcyBsaXN0LlxuIgorCSJUaGUgcnVsZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciB2b2x1bWVfbGlzdC5cbiIpCisKK2NmZ19hcnJheShhY3RpdmF0aW9uX2F1dG9fbG9ja19zdGFydF9saXN0X0NGRywgImF1dG9fbG9ja19zdGFydF9saXN0IiwgYWN0aXZhdGlvbl9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZfENGR19ERUZBVUxUX1VOREVGSU5FRCwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMiwgMiwgMTI0KSwgTlVMTCwgMCwgTlVMTCwKKwkiTG9ja2luZyBpcyBhdXRvLXN0YXJ0ZWQgb25seSBmb3IgVkdzIHNlbGVjdGVkIGJ5IHRoaXMgbGlzdC5cbiIKKwkiVGhlIHJ1bGVzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0LlxuIikKKworY2ZnKG1ldGFkYXRhX2NoZWNrX3B2X2RldmljZV9zaXplc19DRkcsICJjaGVja19wdl9kZXZpY2Vfc2l6ZXMiLCBtZXRhZGF0YV9DRkdfU0VDVElPTiwgQ0ZHX0FEVkFOQ0VEIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCAxLCB2c24oMiwgMiwgMTQxKSwgTlVMTCwgMCwgTlVMTCwKKwkiQ2hlY2sgZGV2aWNlIHNpemVzIGFyZSBub3Qgc21hbGxlciB0aGFuIGNvcnJlc3BvbmRpbmcgUFYgc2l6ZXMuXG4iCisJIklmIGRldmljZSBzaXplIGlzIGxlc3MgdGhhbiBjb3JyZXNwb25kaW5nIFBWIHNpemUgZm91bmQgaW4gbWV0YWRhdGEsXG4iCisJInRoZXJlIGlzIGFsd2F5cyBhIHJpc2sgb2YgZGF0YSBsb3NzLiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZW4gTFZNXG4iCisJImlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSBlYWNoIHRpbWUgaXQgZmluZHMgdGhhdCB0aGUgZGV2aWNlIHNpemUgaXNcbiIKKwkibGVzcyB0aGFuIGNvcnJlc3BvbmRpbmcgUFYgc2l6ZS4gWW91IHNob3VsZCBub3QgZGlzYWJsZSB0aGlzIHVubGVzc1xuIgorCSJ5b3UgYXJlIGFic29sdXRlbHkgc3VyZSBhYm91dCB3aGF0IHlvdSBhcmUgZG9pbmchXG4iKQorCitjZmcobWV0YWRhdGFfcmVjb3JkX2x2c19oaXN0b3J5X0NGRywgInJlY29yZF9sdnNfaGlzdG9yeSIsIG1ldGFkYXRhX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfUkVDT1JEX0xWU19ISVNUT1JZLCB2c24oMiwgMiwgMTQ1KSwgTlVMTCwgMCwgTlVMTCwKKwkiV2hlbiBlbmFibGVkLCBMVk0ga2VlcHMgaGlzdG9yeSByZWNvcmRzIGFib3V0IHJlbW92ZWQgTFZzIGluXG4iCisJIm1ldGFkYXRhLiBUaGUgaW5mb3JtYXRpb24gdGhhdCBpcyByZWNvcmRlZCBpbiBtZXRhZGF0YSBmb3JcbiIKKwkiaGlzdG9yaWNhbCBMVnMgaXMgcmVkdWNlZCB3aGVuIGNvbXBhcmVkIHRvIG9yaWdpbmFsXG4iCisJImluZm9ybWF0aW9uIGtlcHQgaW4gbWV0YWRhdGEgZm9yIGxpdmUgTFZzLiBDdXJyZW50bHksIHRoaXNcbiIKKwkiZmVhdHVyZSBpcyBzdXBwb3J0ZWQgZm9yIHRoaW4gYW5kIHRoaW4gc25hcHNob3QgTFZzIG9ubHkuXG4iKQorCitjZmcobWV0YWRhdGFfbHZzX2hpc3RvcnlfcmV0ZW50aW9uX3RpbWVfQ0ZHLCAibHZzX2hpc3RvcnlfcmV0ZW50aW9uX3RpbWUiLCBtZXRhZGF0YV9DRkdfU0VDVElPTiwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfTFZTX0hJU1RPUllfUkVURU5USU9OX1RJTUUsIHZzbigyLCAyLCAxNDUpLCBOVUxMLCAwLCBOVUxMLAorCSJSZXRlbnRpb24gdGltZSBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGEgcmVjb3JkIGFib3V0IGluZGl2aWR1YWxcbiIKKwkiaGlzdG9yaWNhbCBsb2dpY2FsIHZvbHVtZSBpcyBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZC5cbiIKKwkiQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoaXMgZmVhdHVyZS5cbiIpCisKK2NmZyhtZXRhZGF0YV9wdm1ldGFkYXRhY29waWVzX0NGRywgInB2bWV0YWRhdGFjb3BpZXMiLCBtZXRhZGF0YV9DRkdfU0VDVElPTiwgQ0ZHX0FEVkFOQ0VEIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9JTlQsIERFRkFVTFRfUFZNRVRBREFUQUNPUElFUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJOdW1iZXIgb2YgY29waWVzIG9mIG1ldGFkYXRhIHRvIHN0b3JlIG9uIGVhY2ggUFYuXG4iCisJIlRoZSAtLXB2bWV0YWRhdGFjb3BpZXMgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIiNcbiIKKwkiQWNjZXB0ZWQgdmFsdWVzOlxuIgorCSIgIDJcbiIKKwkiICAgIFR3byBjb3BpZXMgb2YgdGhlIFZHIG1ldGFkYXRhIGFyZSBzdG9yZWQgb24gdGhlIFBWLCBvbmUgYXQgdGhlXG4iCisJIiAgICBmcm9udCBvZiB0aGUgUFYsIGFuZCBvbmUgYXQgdGhlIGVuZC5cbiIKKwkiICAxXG4iCisJIiAgICBPbmUgY29weSBvZiBWRyBtZXRhZGF0YSBpcyBzdG9yZWQgYXQgdGhlIGZyb250IG9mIHRoZSBQVi5cbiIKKwkiICAwXG4iCisJIiAgICBObyBjb3BpZXMgb2YgVkcgbWV0YWRhdGEgYXJlIHN0b3JlZCBvbiB0aGUgUFYuIFRoaXMgbWF5IGJlXG4iCisJIiAgICB1c2VmdWwgZm9yIFZHcyBjb250YWluaW5nIGxhcmdlIG51bWJlcnMgb2YgUFZzLlxuIgorCSIjXG4iKQorCitjZmcobWV0YWRhdGFfdmdtZXRhZGF0YWNvcGllc19DRkcsICJ2Z21ldGFkYXRhY29waWVzIiwgbWV0YWRhdGFfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1ZHTUVUQURBVEFDT1BJRVMsIHZzbigyLCAyLCA2OSksIE5VTEwsIDAsIE5VTEwsCisJIk51bWJlciBvZiBjb3BpZXMgb2YgbWV0YWRhdGEgdG8gbWFpbnRhaW4gZm9yIGVhY2ggVkcuXG4iCisJIlRoZSAtLXZnbWV0YWRhdGFjb3BpZXMgb3B0aW9uIG92ZXJyaWRlcyB0aGlzIHNldHRpbmcuXG4iCisJIklmIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCBMVk0gYXV0b21hdGljYWxseSBjaG9vc2VzIHdoaWNoIG9mIHRoZVxuIgorCSJhdmFpbGFibGUgbWV0YWRhdGEgYXJlYXMgdG8gdXNlIHRvIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2ZcbiIKKwkiY29waWVzIG9mIHRoZSBWRyBtZXRhZGF0YS4gSWYgeW91IHNldCBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSB0aGVcbiIKKwkidG90YWwgbnVtYmVyIG9mIG1ldGFkYXRhIGFyZWFzIGF2YWlsYWJsZSwgdGhlbiBtZXRhZGF0YSBpcyBzdG9yZWQgaW5cbiIKKwkidGhlbSBhbGwuIFRoZSB2YWx1ZSAwICh1bm1hbmFnZWQpIGRpc2FibGVzIHRoaXMgYXV0b21hdGljIG1hbmFnZW1lbnRcbiIKKwkiYW5kIGFsbG93cyB5b3UgdG8gY29udHJvbCB3aGljaCBtZXRhZGF0YSBhcmVhcyBhcmUgdXNlZCBhdCB0aGVcbiIKKwkiaW5kaXZpZHVhbCBQViBsZXZlbCB1c2luZyBwdmNoYW5nZSAtLW1ldGFkYXRhaWdub3JlIHl8bi5cbiIpCisKK2NmZyhtZXRhZGF0YV9wdm1ldGFkYXRhc2l6ZV9DRkcsICJwdm1ldGFkYXRhc2l6ZSIsIG1ldGFkYXRhX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0lOVCwgREVGQVVMVF9QVk1FVEFEQVRBU0laRSwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJBcHByb3hpbWF0ZSBudW1iZXIgb2Ygc2VjdG9ycyB0byB1c2UgZm9yIGVhY2ggbWV0YWRhdGEgY29weS5cbiIKKwkiVkdzIHdpdGggbGFyZ2UgbnVtYmVycyBvZiBQVnMgb3IgTFZzLCBvciBWR3MgY29udGFpbmluZyBjb21wbGV4IExWXG4iCisJInN0cnVjdHVyZXMsIG1heSBuZWVkIGFkZGl0aW9uYWwgc3BhY2UgZm9yIFZHIG1ldGFkYXRhLiBUaGUgbWV0YWRhdGFcbiIKKwkiYXJlYXMgYXJlIHRyZWF0ZWQgYXMgY2lyY3VsYXIgYnVmZmVycywgc28gdW51c2VkIHNwYWNlIGJlY29tZXMgZmlsbGVkXG4iCisJIndpdGggYW4gYXJjaGl2ZSBvZiB0aGUgbW9zdCByZWNlbnQgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIG1ldGFkYXRhLlxuIikKKworY2ZnKG1ldGFkYXRhX3B2bWV0YWRhdGFpZ25vcmVfQ0ZHLCAicHZtZXRhZGF0YWlnbm9yZSIsIG1ldGFkYXRhX0NGR19TRUNUSU9OLCBDRkdfQURWQU5DRUQgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfUFZNRVRBREFUQUlHTk9SRSwgdnNuKDIsIDIsIDY5KSwgTlVMTCwgMCwgTlVMTCwKKwkiSWdub3JlIG1ldGFkYXRhIGFyZWFzIG9uIGEgbmV3IFBWLlxuIgorCSJUaGUgLS1tZXRhZGF0YWlnbm9yZSBvcHRpb24gb3ZlcnJpZGVzIHRoaXMgc2V0dGluZy5cbiIKKwkiSWYgbWV0YWRhdGEgYXJlYXMgb24gYSBQViBhcmUgaWdub3JlZCwgTFZNIHdpbGwgbm90IHN0b3JlIG1ldGFkYXRhXG4iCisJImluIHRoZW0uXG4iKQorCitjZmcobWV0YWRhdGFfc3RyaXBlc2l6ZV9DRkcsICJzdHJpcGVzaXplIiwgbWV0YWRhdGFfQ0ZHX1NFQ1RJT04sIENGR19BRFZBTkNFRCB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfSU5ULCBERUZBVUxUX1NUUklQRVNJWkUsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwgTlVMTCkKKworY2ZnX2FycmF5KG1ldGFkYXRhX2RpcnNfQ0ZHLCAiZGlycyIsIG1ldGFkYXRhX0NGR19TRUNUSU9OLCBDRkdfQURWQU5DRUQgfCBDRkdfREVGQVVMVF9VTkRFRklORUQsIENGR19UWVBFX1NUUklORywgTlVMTCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJEaXJlY3RvcmllcyBob2xkaW5nIGxpdmUgY29waWVzIG9mIHRleHQgZm9ybWF0IG1ldGFkYXRhLlxuIgorCSJUaGVzZSBkaXJlY3RvcmllcyBtdXN0IG5vdCBiZSBvbiBsb2dpY2FsIHZvbHVtZXMhXG4iCisJIkl0J3MgcG9zc2libGUgdG8gdXNlIExWTSB3aXRoIGEgY291cGxlIG9mIGRpcmVjdG9yaWVzIGhlcmUsXG4iCisJInByZWZlcmFibHkgb24gZGlmZmVyZW50IChub24tTFYpIGZpbGVzeXN0ZW1zLCBhbmQgd2l0aCBubyBvdGhlclxuIgorCSJvbi1kaXNrIG1ldGFkYXRhIChwdm1ldGFkYXRhY29waWVzID0gMCkuIE9yIHRoaXMgY2FuIGJlIGluIGFkZGl0aW9uXG4iCisJInRvIG9uLWRpc2sgbWV0YWRhdGEgYXJlYXMuIFRoZSBmZWF0dXJlIHdhcyBvcmlnaW5hbGx5IGFkZGVkIHRvXG4iCisJInNpbXBsaWZ5IHRlc3RpbmcgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgbG93IG1lbW9yeSBzaXR1YXRpb25zIC1cbiIKKwkidGhlIG1hY2hpbmUgY291bGQgbG9jayB1cC4gTmV2ZXIgZWRpdCBhbnkgZmlsZXMgaW4gdGhlc2UgZGlyZWN0b3JpZXNcbiIKKwkiYnkgaGFuZCB1bmxlc3MgeW91IGFyZSBhYnNvbHV0ZWx5IHN1cmUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIVxuIgorCSJVc2UgdGhlIHN1cHBsaWVkIHRvb2xzZXQgdG8gbWFrZSBjaGFuZ2VzIChlLmcuIHZnY2ZncmVzdG9yZSkuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJkaXJzID0gWyBcIi9ldGMvbHZtL21ldGFkYXRhXCIsIFwiL21udC9kaXNrMi9sdm0vbWV0YWRhdGEyXCIgXVxuIgorCSIjXG4iKQorCitjZmdfc2VjdGlvbihtZXRhZGF0YV9kaXNrX2FyZWFzX0NGR19TVUJTRUNUSU9OLCAiZGlza19hcmVhcyIsIG1ldGFkYXRhX0NGR19TRUNUSU9OLCBDRkdfVU5TVVBQT1JURUQgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIHZzbigxLCAwLCAwKSwgMCwgTlVMTCwgTlVMTCkKK2NmZ19zZWN0aW9uKGRpc2tfYXJlYV9DRkdfU1VCU0VDVElPTiwgImRpc2tfYXJlYSIsIG1ldGFkYXRhX2Rpc2tfYXJlYXNfQ0ZHX1NVQlNFQ1RJT04sIENGR19OQU1FX1ZBUklBQkxFIHwgQ0ZHX1VOU1VQUE9SVEVEIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCB2c24oMSwgMCwgMCksIDAsIE5VTEwsIE5VTEwpCitjZmcoZGlza19hcmVhX3N0YXJ0X3NlY3Rvcl9DRkcsICJzdGFydF9zZWN0b3IiLCBkaXNrX2FyZWFfQ0ZHX1NVQlNFQ1RJT04sIENGR19VTlNVUFBPUlRFRCB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfSU5ULCAwLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsIE5VTEwpCitjZmcoZGlza19hcmVhX3NpemVfQ0ZHLCAic2l6ZSIsIGRpc2tfYXJlYV9DRkdfU1VCU0VDVElPTiwgQ0ZHX1VOU1VQUE9SVEVEIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9JTlQsIDAsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwgTlVMTCkKK2NmZyhkaXNrX2FyZWFfaWRfQ0ZHLCAiaWQiLCBkaXNrX2FyZWFfQ0ZHX1NVQlNFQ1RJT04sIENGR19VTlNVUFBPUlRFRCB8IENGR19ERUZBVUxUX1VOREVGSU5FRCwgQ0ZHX1RZUEVfU1RSSU5HLCBOVUxMLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsIE5VTEwpCisKK2NmZyhyZXBvcnRfb3V0cHV0X2Zvcm1hdF9DRkcsICJvdXRwdXRfZm9ybWF0IiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1JFUF9PVVRQVVRfRk9STUFULCB2c24oMiwgMiwgMTU4KSwgTlVMTCwgMCwgTlVMTCwKKwkiRm9ybWF0IG9mIExWTSBjb21tYW5kJ3MgcmVwb3J0IG91dHB1dC5cbiIKKwkiSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZXBvcnQgcGVyIGNvbW1hbmQsIHRoZW4gdGhlIGZvcm1hdFxuIgorCSJpcyBhcHBsaWVkIGZvciBhbGwgcmVwb3J0cy4gWW91IGNhbiBhbHNvIGNoYW5nZSBvdXRwdXQgZm9ybWF0XG4iCisJImRpcmVjdGx5IG9uIGNvbW1hbmQgbGluZSB1c2luZyAtLXJlcG9ydGZvcm1hdCBvcHRpb24gd2hpY2hcbiIKKwkiaGFzIHByZWNlZGVuY2Ugb3ZlciBsb2cvb3V0cHV0X2Zvcm1hdCBzZXR0aW5nLlxuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgYmFzaWNcbiIKKwkiICAgIE9yaWdpbmFsIGZvcm1hdCB3aXRoIGNvbHVtbnMgYW5kIHJvd3MuIElmIHRoZXJlIGlzIG1vcmUgdGhhblxuIgorCSIgICAgb25lIHJlcG9ydCBwZXIgY29tbWFuZCwgZWFjaCByZXBvcnQgaXMgcHJlZml4ZWQgd2l0aCByZXBvcnQnc1xuIgorCSIgICAgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24uXG4iCisJIiAganNvblxuIgorCSIgICAgSlNPTiBmb3JtYXQuXG4iKQorCitjZmcocmVwb3J0X2NvbXBhY3Rfb3V0cHV0X0NGRywgImNvbXBhY3Rfb3V0cHV0IiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9SRVBfQ09NUEFDVF9PVVRQVVQsIHZzbigyLCAyLCAxMTUpLCBOVUxMLCAwLCBOVUxMLAorCSJEbyBub3QgcHJpbnQgZW1wdHkgdmFsdWVzIGZvciBhbGwgcmVwb3J0IGZpZWxkcy5cbiIKKwkiSWYgZW5hYmxlZCwgYWxsIGZpZWxkcyB0aGF0IGRvbid0IGhhdmUgYSB2YWx1ZSBzZXQgZm9yIGFueSBvZiB0aGVcbiIKKwkicm93cyByZXBvcnRlZCBhcmUgc2tpcHBlZCBhbmQgbm90IHByaW50ZWQuIENvbXBhY3Qgb3V0cHV0IGlzXG4iCisJImFwcGxpY2FibGUgb25seSBpZiByZXBvcnQvYnVmZmVyZWQgaXMgZW5hYmxlZC4gSWYgeW91IG5lZWQgdG9cbiIKKwkiY29tcGFjdCBvbmx5IHNwZWNpZmllZCBmaWVsZHMsIHVzZSBjb21wYWN0X291dHB1dD0wIGFuZCBkZWZpbmVcbiIKKwkicmVwb3J0L2NvbXBhY3Rfb3V0cHV0X2NvbHMgY29uZmlndXJhdGlvbiBzZXR0aW5nIGluc3RlYWQuXG4iKQorCitjZmcocmVwb3J0X2NvbXBhY3Rfb3V0cHV0X2NvbHNfQ0ZHLCAiY29tcGFjdF9vdXRwdXRfY29scyIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9DT01QQUNUX09VVFBVVF9DT0xTLCB2c24oMiwgMiwgMTMzKSwgTlVMTCwgMCwgTlVMTCwKKwkiRG8gbm90IHByaW50IGVtcHR5IHZhbHVlcyBmb3Igc3BlY2lmaWVkIHJlcG9ydCBmaWVsZHMuXG4iCisJIklmIGRlZmluZWQsIHNwZWNpZmllZCBmaWVsZHMgdGhhdCBkb24ndCBoYXZlIGEgdmFsdWUgc2V0IGZvciBhbnlcbiIKKwkib2YgdGhlIHJvd3MgcmVwb3J0ZWQgYXJlIHNraXBwZWQgYW5kIG5vdCBwcmludGVkLiBDb21wYWN0IG91dHB1dFxuIgorCSJpcyBhcHBsaWNhYmxlIG9ubHkgaWYgcmVwb3J0L2J1ZmZlcmVkIGlzIGVuYWJsZWQuIElmIHlvdSBuZWVkIHRvXG4iCisJImNvbXBhY3QgYWxsIGZpZWxkcywgdXNlIGNvbXBhY3Rfb3V0cHV0PTEgaW5zdGVhZCBpbiB3aGljaCBjYXNlXG4iCisJInRoZSBjb21wYWN0X291dHB1dF9jb2xzIHNldHRpbmcgaXMgdGhlbiBpZ25vcmVkLlxuIikKKworY2ZnKHJlcG9ydF9hbGlnbmVkX0NGRywgImFsaWduZWQiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1JFUF9BTElHTkVELCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkFsaWduIGNvbHVtbnMgaW4gcmVwb3J0IG91dHB1dC5cbiIpCisKK2NmZyhyZXBvcnRfYnVmZmVyZWRfQ0ZHLCAiYnVmZmVyZWQiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1JFUF9CVUZGRVJFRCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJCdWZmZXIgcmVwb3J0IG91dHB1dC5cbiIKKwkiV2hlbiBidWZmZXJlZCByZXBvcnRpbmcgaXMgdXNlZCwgdGhlIHJlcG9ydCdzIGNvbnRlbnQgaXMgYXBwZW5kZWRcbiIKKwkiaW5jcmVtZW50YWxseSB0byBpbmNsdWRlIGVhY2ggb2JqZWN0IGJlaW5nIHJlcG9ydGVkIHVudGlsIHRoZSByZXBvcnRcbiIKKwkiaXMgZmx1c2hlZCB0byBvdXRwdXQgd2hpY2ggbm9ybWFsbHkgaGFwcGVucyBhdCB0aGUgZW5kIG9mIGNvbW1hbmRcbiIKKwkiZXhlY3V0aW9uLiBPdGhlcndpc2UsIGlmIGJ1ZmZlcmluZyBpcyBub3QgdXNlZCwgZWFjaCBvYmplY3QgaXNcbiIKKwkicmVwb3J0ZWQgYXMgc29vbiBhcyBpdHMgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZC5cbiIpCisKK2NmZyhyZXBvcnRfaGVhZGluZ3NfQ0ZHLCAiaGVhZGluZ3MiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCBERUZBVUxUX1JFUF9IRUFESU5HUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJTaG93IGhlYWRpbmdzIGZvciBjb2x1bW5zIG9uIHJlcG9ydC5cbiIpCisKK2NmZyhyZXBvcnRfc2VwYXJhdG9yX0NGRywgInNlcGFyYXRvciIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9SRVBfU0VQQVJBVE9SLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkEgc2VwYXJhdG9yIHRvIHVzZSBvbiByZXBvcnQgYWZ0ZXIgZWFjaCBmaWVsZC5cbiIpCisKK2NmZyhyZXBvcnRfbGlzdF9pdGVtX3NlcGFyYXRvcl9DRkcsICJsaXN0X2l0ZW1fc2VwYXJhdG9yIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1JFUF9MSVNUX0lURU1fU0VQQVJBVE9SLCB2c24oMiwgMiwgMTA4KSwgTlVMTCwgMCwgTlVMTCwKKwkiQSBzZXBhcmF0b3IgdG8gdXNlIGZvciBsaXN0IGl0ZW1zIHdoZW4gcmVwb3J0ZWQuXG4iKQorCitjZmcocmVwb3J0X3ByZWZpeGVzX0NGRywgInByZWZpeGVzIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9SRVBfUFJFRklYRVMsIHZzbigyLCAyLCAzNiksIE5VTEwsIDAsIE5VTEwsCisJIlVzZSBhIGZpZWxkIG5hbWUgcHJlZml4IGZvciBlYWNoIGZpZWxkIHJlcG9ydGVkLlxuIikKKworY2ZnKHJlcG9ydF9xdW90ZWRfQ0ZHLCAicXVvdGVkIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfQk9PTCwgREVGQVVMVF9SRVBfUVVPVEVELCB2c24oMiwgMiwgMzkpLCBOVUxMLCAwLCBOVUxMLAorCSJRdW90ZSBmaWVsZCB2YWx1ZXMgd2hlbiB1c2luZyBmaWVsZCBuYW1lIHByZWZpeGVzLlxuIikKKworY2ZnKHJlcG9ydF9jb2x1bXNfYXNfcm93c19DRkcsICJjb2x1bXNfYXNfcm93cyIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfUkVQX0NPTFVNTlNfQVNfUk9XUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJPdXRwdXQgZWFjaCBjb2x1bW4gYXMgYSByb3cuXG4iCisJIklmIHNldCwgdGhpcyBhbHNvIGltcGxpZXMgcmVwb3J0L3ByZWZpeGVzPTEuXG4iKQorCitjZmcocmVwb3J0X2JpbmFyeV92YWx1ZXNfYXNfbnVtZXJpY19DRkcsICJiaW5hcnlfdmFsdWVzX2FzX251bWVyaWMiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9CT09MLCAwLCB2c24oMiwgMiwgMTA4KSwgTlVMTCwgMCwgTlVMTCwKKwkiVXNlIGJpbmFyeSB2YWx1ZXMgMCBvciAxIGluc3RlYWQgb2YgZGVzY3JpcHRpdmUgbGl0ZXJhbCB2YWx1ZXMuXG4iCisJIkZvciBjb2x1bW5zIHRoYXQgaGF2ZSBleGFjdGx5IHR3byB2YWxpZCB2YWx1ZXMgdG8gcmVwb3J0XG4iCisJIihub3QgY291bnRpbmcgdGhlICd1bmtub3duJyB2YWx1ZSB3aGljaCBkZW5vdGVzIHRoYXQgdGhlXG4iCisJInZhbHVlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkKS5cbiIpCisKK2NmZyhyZXBvcnRfdGltZV9mb3JtYXRfQ0ZHLCAidGltZV9mb3JtYXQiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfVElNRV9GT1JNQVQsIHZzbigyLCAyLCAxMjMpLCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAiU2V0IHRpbWUgZm9ybWF0IGZvciBmaWVsZHMgcmVwb3J0aW5nIHRpbWUgdmFsdWVzLlxuIgorCSJGb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyBhIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlclxuIgorCSJzZXF1ZW5jZXMgYW5kIG9yZGluYXJ5IGNoYXJhY3RlciBzZXF1ZW5jZXMuIE9yZGluYXJ5IGNoYXJhY3RlclxuIgorCSJzZXF1ZW5jZXMgYXJlIGNvcGllZCB2ZXJiYXRpbS4gRWFjaCBzcGVjaWFsIGNoYXJhY3RlciBzZXF1ZW5jZSBpc1xuIgorCSJpbnRyb2R1Y2VkIGJ5IHRoZSAnJScgY2hhcmFjdGVyIGFuZCBzdWNoIHNlcXVlbmNlIGlzIHRoZW5cbiIKKwkic3Vic3RpdHV0ZWQgd2l0aCBhIHZhbHVlIGFzIGRlc2NyaWJlZCBiZWxvdy5cbiIKKwkiI1xuIgorCSJBY2NlcHRlZCB2YWx1ZXM6XG4iCisJIiAgJWFcbiIKKwkiICAgIFRoZSBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoZSBkYXkgb2YgdGhlIHdlZWsgYWNjb3JkaW5nIHRvIHRoZVxuIgorCSIgICAgY3VycmVudCBsb2NhbGUuXG4iCisJIiAgJUFcbiIKKwkiICAgIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGRheSBvZiB0aGUgd2VlayBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnRcbiIKKwkiICAgIGxvY2FsZS5cbiIKKwkiICAlYlxuIgorCSIgICAgVGhlIGFiYnJldmlhdGVkIG1vbnRoIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS5cbiIKKwkiICAlQlxuIgorCSIgICAgVGhlIGZ1bGwgbW9udGggbmFtZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLlxuIgorCSIgICVjXG4iCisJIiAgICBUaGUgcHJlZmVycmVkIGRhdGUgYW5kIHRpbWUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50XG4iCisJIiAgICBsb2NhbGUgKGFsdCBFKVxuIgorCSIgICVDXG4iCisJIiAgICBUaGUgY2VudHVyeSBudW1iZXIgKHllYXIvMTAwKSBhcyBhIDItZGlnaXQgaW50ZWdlci4gKGFsdCBFKVxuIgorCSIgICVkXG4iCisJIiAgICBUaGUgZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMSB0byAzMSkuXG4iCisJIiAgICAoYWx0IE8pXG4iCisJIiAgJURcbiIKKwkiICAgIEVxdWl2YWxlbnQgdG8gJW0vJWQvJXkuIChGb3IgQW1lcmljYW5zIG9ubHkuIEFtZXJpY2FucyBzaG91bGRcbiIKKwkiICAgIG5vdGUgdGhhdCBpbiBvdGhlciBjb3VudHJpZXMlZC8lbS8leSBpcyByYXRoZXIgY29tbW9uLiBUaGlzXG4iCisJIiAgICBtZWFucyB0aGF0IGluIGludGVybmF0aW9uYWwgY29udGV4dCB0aGlzIGZvcm1hdCBpcyBhbWJpZ3VvdXMgYW5kXG4iCisJIiAgICBzaG91bGQgbm90IGJlIHVzZWQuXG4iCisJIiAgJWVcbiIKKwkiICAgIExpa2UgJWQsIHRoZSBkYXkgb2YgdGhlIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIsIGJ1dCBhIGxlYWRpbmdcbiIKKwkiICAgIHplcm8gaXMgcmVwbGFjZWQgYnkgYSBzcGFjZS4gKGFsdCBPKVxuIgorCSIgICVFXG4iCisJIiAgICBNb2RpZmllcjogdXNlIGFsdGVybmF0aXZlIGxvY2FsLWRlcGVuZGVudCByZXByZXNlbnRhdGlvbiBpZlxuIgorCSIgICAgYXZhaWxhYmxlLlxuIgorCSIgICVGXG4iCisJIiAgICBFcXVpdmFsZW50IHRvICVZLSVtLSVkICh0aGUgSVNPIDg2MDEgZGF0ZSBmb3JtYXQpLlxuIgorCSIgICVHXG4iCisJIiAgICBUaGUgSVNPIDg2MDEgd2Vlay1iYXNlZCB5ZWFyIHdpdGggY2VudHVyeSBhcyBhZGVjaW1hbCBudW1iZXIuXG4iCisJIiAgICBUaGUgNC1kaWdpdCB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIElTTyB3ZWVrIG51bWJlciAoc2VlICVWKS5cbiIKKwkiICAgIFRoaXMgaGFzIHRoZSBzYW1lIGZvcm1hdCBhbmQgdmFsdWUgYXMgJVksIGV4Y2VwdCB0aGF0IGlmIHRoZVxuIgorCSIgICAgSVNPIHdlZWsgbnVtYmVyIGJlbG9uZ3MgdG8gdGhlIHByZXZpb3VzIG9yIG5leHQgeWVhciwgdGhhdCB5ZWFyXG4iCisJIiAgICBpcyB1c2VkIGluc3RlYWQuXG4iCisJIiAgJWdcbiIKKwkiICAgIExpa2UgJUcsIGJ1dCB3aXRob3V0IGNlbnR1cnksIHRoYXQgaXMsIHdpdGggYSAyLWRpZ2l0IHllYXJcbiIKKwkiICAgICgwMC05OSkuXG4iCisJIiAgJWhcbiIKKwkiICAgIEVxdWl2YWxlbnQgdG8gJWIuXG4iCisJIiAgJUhcbiIKKwkiICAgIFRoZSBob3VyIGFzIGEgZGVjaW1hbCBudW1iZXIgdXNpbmcgYSAyNC1ob3VyIGNsb2NrXG4iCisJIiAgICAocmFuZ2UgMDAgdG8gMjMpLiAoYWx0IE8pXG4iCisJIiAgJUlcbiIKKwkiICAgIFRoZSBob3VyIGFzIGEgZGVjaW1hbCBudW1iZXIgdXNpbmcgYSAxMi1ob3VyIGNsb2NrXG4iCisJIiAgICAocmFuZ2UgMDEgdG8gMTIpLiAoYWx0IE8pXG4iCisJIiAgJWpcbiIKKwkiICAgIFRoZSBkYXkgb2YgdGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciAocmFuZ2UgMDAxIHRvIDM2NikuXG4iCisJIiAgJWtcbiIKKwkiICAgIFRoZSBob3VyICgyNC1ob3VyIGNsb2NrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwIHRvIDIzKTtcbiIKKwkiICAgIHNpbmdsZSBkaWdpdHMgYXJlIHByZWNlZGVkIGJ5IGEgYmxhbmsuIChTZWUgYWxzbyAlSC4pXG4iCisJIiAgJWxcbiIKKwkiICAgIFRoZSBob3VyICgxMi1ob3VyIGNsb2NrKSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAxIHRvIDEyKTtcbiIKKwkiICAgIHNpbmdsZSBkaWdpdHMgYXJlIHByZWNlZGVkIGJ5IGEgYmxhbmsuIChTZWUgYWxzbyAlSS4pXG4iCisJIiAgJW1cbiIKKwkiICAgIFRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMSB0byAxMikuIChhbHQgTylcbiIKKwkiICAlTVxuIgorCSIgICAgVGhlIG1pbnV0ZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMCB0byA1OSkuIChhbHQgTylcbiIKKwkiICAlT1xuIgorCSIgICAgTW9kaWZpZXI6IHVzZSBhbHRlcm5hdGl2ZSBudW1lcmljIHN5bWJvbHMuXG4iCisJIiAgJXBcbiIKKwkiICAgIEVpdGhlciBcIkFNXCIgb3IgXCJQTVwiIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdGltZSB2YWx1ZSxcbiIKKwkiICAgIG9yIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4gTm9vbiBpc1xuIgorCSIgICAgdHJlYXRlZCBhcyBcIlBNXCIgYW5kIG1pZG5pZ2h0IGFzIFwiQU1cIi5cbiIKKwkiICAlUFxuIgorCSIgICAgTGlrZSAlcCBidXQgaW4gbG93ZXJjYXNlOiBcImFtXCIgb3IgXCJwbVwiIG9yIGEgY29ycmVzcG9uZGluZ1xuIgorCSIgICAgc3RyaW5nIGZvciB0aGUgY3VycmVudCBsb2NhbGUuXG4iCisJIiAgJXJcbiIKKwkiICAgIFRoZSB0aW1lIGluIGEubS4gb3IgcC5tLiBub3RhdGlvbi4gSW4gdGhlIFBPU0lYIGxvY2FsZSB0aGlzIGlzXG4iCisJIiAgICBlcXVpdmFsZW50IHRvICVJOiVNOiVTICVwLlxuIgorCSIgICVSXG4iCisJIiAgICBUaGUgdGltZSBpbiAyNC1ob3VyIG5vdGF0aW9uICglSDolTSkuIEZvciBhIHZlcnNpb24gaW5jbHVkaW5nXG4iCisJIiAgICB0aGUgc2Vjb25kcywgc2VlICVUIGJlbG93LlxuIgorCSIgICVzXG4iCisJIiAgICBUaGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIEVwb2NoLFxuIgorCSIgICAgMTk3MC0wMS0wMSAwMDowMDowMCArMDAwMCAoVVRDKVxuIgorCSIgICVTXG4iCisJIiAgICBUaGUgc2Vjb25kIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDAwIHRvIDYwKS4gKFRoZSByYW5nZSBpc1xuIgorCSIgICAgdXAgdG8gNjAgdG8gYWxsb3cgZm9yIG9jY2FzaW9uYWwgbGVhcCBzZWNvbmRzLikgKGFsdCBPKVxuIgorCSIgICV0XG4iCisJIiAgICBBIHRhYiBjaGFyYWN0ZXIuXG4iCisJIiAgJVRcbiIKKwkiICAgIFRoZSB0aW1lIGluIDI0LWhvdXIgbm90YXRpb24gKCVIOiVNOiVTKS5cbiIKKwkiICAldVxuIgorCSIgICAgVGhlIGRheSBvZiB0aGUgd2VlayBhcyBhIGRlY2ltYWwsIHJhbmdlIDEgdG8gNywgTW9uZGF5IGJlaW5nIDEuXG4iCisJIiAgICBTZWUgYWxzbyAldy4gKGFsdCBPKVxuIgorCSIgICVVXG4iCisJIiAgICBUaGUgd2VlayBudW1iZXIgb2YgdGhlIGN1cnJlbnQgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyLFxuIgorCSIgICAgcmFuZ2UgMDAgdG8gNTMsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IFN1bmRheSBhcyB0aGUgZmlyc3RcbiIKKwkiICAgIGRheSBvZiB3ZWVrIDAxLiBTZWUgYWxzbyAlViBhbmQgJVcuIChhbHQgTylcbiIKKwkiICAlVlxuIgorCSIgICAgVGhlIElTTyA4NjAxIHdlZWsgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXIgYXMgYSBkZWNpbWFsIG51bWJlcixcbiIKKwkiICAgIHJhbmdlIDAxIHRvIDUzLCB3aGVyZSB3ZWVrIDEgaXMgdGhlIGZpcnN0IHdlZWsgdGhhdCBoYXMgYXQgbGVhc3RcbiIKKwkiICAgIDQgZGF5cyBpbiB0aGUgbmV3IHllYXIuIFNlZSBhbHNvICVVIGFuZCAlVy4gKGFsdCBPKVxuIgorCSIgICV3XG4iCisJIiAgICBUaGUgZGF5IG9mIHRoZSB3ZWVrIGFzIGEgZGVjaW1hbCwgcmFuZ2UgMCB0byA2LCBTdW5kYXkgYmVpbmcgMC5cbiIKKwkiICAgIFNlZSBhbHNvICV1LiAoYWx0IE8pXG4iCisJIiAgJVdcbiIKKwkiICAgIFRoZSB3ZWVrIG51bWJlciBvZiB0aGUgY3VycmVudCB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIsXG4iCisJIiAgICByYW5nZSAwMCB0byA1Mywgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXlcbiIKKwkiICAgIG9mIHdlZWsgMDEuIChhbHQgTylcbiIKKwkiICAleFxuIgorCSIgICAgVGhlIHByZWZlcnJlZCBkYXRlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgd2l0aG91dFxuIgorCSIgICAgdGhlIHRpbWUuIChhbHQgRSlcbiIKKwkiICAlWFxuIgorCSIgICAgVGhlIHByZWZlcnJlZCB0aW1lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgd2l0aG91dFxuIgorCSIgICAgdGhlIGRhdGUuIChhbHQgRSlcbiIKKwkiICAleVxuIgorCSIgICAgVGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciB3aXRob3V0IGEgY2VudHVyeSAocmFuZ2UgMDAgdG8gOTkpLlxuIgorCSIgICAgKGFsdCBFLCBhbHQgTylcbiIKKwkiICAlWVxuIgorCSIgICAgVGhlIHllYXIgYXMgYSBkZWNpbWFsIG51bWJlciBpbmNsdWRpbmcgdGhlIGNlbnR1cnkuIChhbHQgRSlcbiIKKwkiICAlelxuIgorCSIgICAgVGhlICtoaG1tIG9yIC1oaG1tIG51bWVyaWMgdGltZXpvbmUgKHRoYXQgaXMsIHRoZSBob3VyIGFuZCBtaW51dGVcbiIKKwkiICAgIG9mZnNldCBmcm9tIFVUQykuXG4iCisJIiAgJVpcbiIKKwkiICAgIFRoZSB0aW1lem9uZSBuYW1lIG9yIGFiYnJldmlhdGlvbi5cbiIKKwkiICAlJVxuIgorCSIgICAgQSBsaXRlcmFsICclJyBjaGFyYWN0ZXIuXG4iCisJIiNcbiIpCisKK2NmZyhyZXBvcnRfZGV2dHlwZXNfc29ydF9DRkcsICJkZXZ0eXBlc19zb3J0IiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0RFVlRZUEVTX1NPUlQsIHZzbigyLCAyLCAxMDEpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAnbHZtIGRldnR5cGVzJyBjb21tYW5kLlxuIgorCSJTZWUgJ2x2bSBkZXZ0eXBlcyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF9kZXZ0eXBlc19jb2xzX0NGRywgImRldnR5cGVzX2NvbHMiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfREVWVFlQRVNfQ09MUywgdnNuKDIsIDIsIDEwMSksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICdsdm0gZGV2dHlwZXMnIGNvbW1hbmQuXG4iCisJIlNlZSAnbHZtIGRldnR5cGVzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X2RldnR5cGVzX2NvbHNfdmVyYm9zZV9DRkcsICJkZXZ0eXBlc19jb2xzX3ZlcmJvc2UiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfREVWVFlQRVNfQ09MU19WRVJCLCB2c24oMiwgMiwgMTAxKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ2x2bSBkZXZ0eXBlcycgY29tbWFuZCBpbiB2ZXJib3NlIG1vZGUuXG4iCisJIlNlZSAnbHZtIGRldnR5cGVzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X2x2c19zb3J0X0NGRywgImx2c19zb3J0IiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0xWU19TT1JULCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nICdsdnMnIGNvbW1hbmQuXG4iCisJIlNlZSAnbHZzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X2x2c19jb2xzX0NGRywgImx2c19jb2xzIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0xWU19DT0xTLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICdsdnMnIGNvbW1hbmQuXG4iCisJIlNlZSAnbHZzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X2x2c19jb2xzX3ZlcmJvc2VfQ0ZHLCAibHZzX2NvbHNfdmVyYm9zZSIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9MVlNfQ09MU19WRVJCLCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byByZXBvcnQgZm9yICdsdnMnIGNvbW1hbmQgaW4gdmVyYm9zZSBtb2RlLlxuIgorCSJTZWUgJ2x2cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF92Z3Nfc29ydF9DRkcsICJ2Z3Nfc29ydCIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9WR1NfU09SVCwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAndmdzJyBjb21tYW5kLlxuIgorCSJTZWUgJ3ZncyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF92Z3NfY29sc19DRkcsICJ2Z3NfY29scyIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9WR1NfQ09MUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAndmdzJyBjb21tYW5kLlxuIgorCSJTZWUgJ3ZncyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF92Z3NfY29sc192ZXJib3NlX0NGRywgInZnc19jb2xzX3ZlcmJvc2UiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfVkdTX0NPTFNfVkVSQiwgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAndmdzJyBjb21tYW5kIGluIHZlcmJvc2UgbW9kZS5cbiIKKwkiU2VlICd2Z3MgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzX3NvcnRfQ0ZHLCAicHZzX3NvcnQiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfUFZTX1NPUlQsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ3B2cycgY29tbWFuZC5cbiIKKwkiU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzX2NvbHNfQ0ZHLCAicHZzX2NvbHMiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfUFZTX0NPTFMsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ3B2cycgY29tbWFuZC5cbiIKKwkiU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzX2NvbHNfdmVyYm9zZV9DRkcsICJwdnNfY29sc192ZXJib3NlIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1BWU19DT0xTX1ZFUkIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ3B2cycgY29tbWFuZCBpbiB2ZXJib3NlIG1vZGUuXG4iCisJIlNlZSAncHZzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X3NlZ3Nfc29ydF9DRkcsICJzZWdzX3NvcnQiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfU0VHU19TT1JULCB2c24oMSwgMCwgMCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nICdsdnMgLS1zZWdtZW50cycgY29tbWFuZC5cbiIKKwkiU2VlICdsdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF9zZWdzX2NvbHNfQ0ZHLCAic2Vnc19jb2xzIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1NFR1NfQ09MUywgdnNuKDEsIDAsIDApLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciAnbHZzIC0tc2VnbWVudHMnIGNvbW1hbmQuXG4iCisJIlNlZSAnbHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfc2Vnc19jb2xzX3ZlcmJvc2VfQ0ZHLCAic2Vnc19jb2xzX3ZlcmJvc2UiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfU0VHU19DT0xTX1ZFUkIsIHZzbigxLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgJ2x2cyAtLXNlZ21lbnRzJyBjb21tYW5kIGluIHZlcmJvc2UgbW9kZS5cbiIKKwkiU2VlICdsdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF9wdnNlZ3Nfc29ydF9DRkcsICJwdnNlZ3Nfc29ydCIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9QVlNFR1NfU09SVCwgdnNuKDEsIDEsIDMpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyAncHZzIC0tc2VnbWVudHMnIGNvbW1hbmQuXG4iCisJIlNlZSAncHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzZWdzX2NvbHNfQ0ZHLCAicHZzZWdzX2NvbHMiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19QUk9GSUxBQkxFIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIERFRkFVTFRfUFZTRUdTX0NPTFMsIHZzbigxLCAxLCAzKSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkgd2hlbiByZXBvcnRpbmcgJ3B2cyAtLXNlZ21lbnRzJyBjb21tYW5kLlxuIgorCSJTZWUgJ3B2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X3B2c2Vnc19jb2xzX3ZlcmJvc2VfQ0ZHLCAicHZzZWdzX2NvbHNfdmVyYm9zZSIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9QVlNFR1NfQ09MU19WRVJCLCB2c24oMSwgMSwgMyksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nICdwdnMgLS1zZWdtZW50cycgY29tbWFuZCBpbiB2ZXJib3NlIG1vZGUuXG4iCisJIlNlZSAncHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfdmdzX2NvbHNfZnVsbF9DRkcsICJ2Z3NfY29sc19mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1ZHU19DT0xTX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICd2Z3MnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICd2Z3MgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzX2NvbHNfZnVsbF9DRkcsICJwdnNfY29sc19mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1BWU19DT0xTX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICd2Z3MnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfbHZzX2NvbHNfZnVsbF9DRkcsICJsdnNfY29sc19mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0xWU19DT0xTX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICdsdnMnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzZWdzX2NvbHNfZnVsbF9DRkcsICJwdnNlZ3NfY29sc19mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1BWU0VHU19DT0xTX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gcmVwb3J0IGZvciBsdm0gZnVsbHJlcG9ydCdzICdwdnNlZycgc3VicmVwb3J0LlxuIgorCSJTZWUgJ3B2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X3NlZ3NfY29sc19mdWxsX0NGRywgInNlZ3NfY29sc19mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1NFR1NfQ09MU19GVUxMLCB2c24oMiwgMiwgMTU4KSwgTlVMTCwgMCwgTlVMTCwKKwkiTGlzdCBvZiBjb2x1bW5zIHRvIHJlcG9ydCBmb3IgbHZtIGZ1bGxyZXBvcnQncyAnc2VnJyBzdWJyZXBvcnQuXG4iCisJIlNlZSAnbHZzIC0tc2VnbWVudHMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfdmdzX3NvcnRfZnVsbF9DRkcsICJ2Z3Nfc29ydF9mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1ZHU19TT1JUX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyBsdm0gZnVsbHJlcG9ydCdzICd2Z3MnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICd2Z3MgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzX3NvcnRfZnVsbF9DRkcsICJwdnNfc29ydF9mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1BWU19TT1JUX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyBsdm0gZnVsbHJlcG9ydCdzICd2Z3MnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICdwdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfbHZzX3NvcnRfZnVsbF9DRkcsICJsdnNfc29ydF9mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0xWU19TT1JUX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyBsdm0gZnVsbHJlcG9ydCdzICdsdnMnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICdsdnMgLW8gaGVscCcgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGZpZWxkcy5cbiIpCisKK2NmZyhyZXBvcnRfcHZzZWdzX3NvcnRfZnVsbF9DRkcsICJwdnNlZ3Nfc29ydF9mdWxsIiwgcmVwb3J0X0NGR19TRUNUSU9OLCBDRkdfUFJPRklMQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX1BWU0VHU19TT1JUX0ZVTEwsIHZzbigyLCAyLCAxNTgpLCBOVUxMLCAwLCBOVUxMLAorCSJMaXN0IG9mIGNvbHVtbnMgdG8gc29ydCBieSB3aGVuIHJlcG9ydGluZyBmb3IgbHZtIGZ1bGxyZXBvcnQncyAncHZzZWcnIHN1YnJlcG9ydC5cbiIKKwkiU2VlICdwdnMgLS1zZWdtZW50cyAtbyBoZWxwJyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZmllbGRzLlxuIikKKworY2ZnKHJlcG9ydF9zZWdzX3NvcnRfZnVsbF9DRkcsICJzZWdzX3NvcnRfZnVsbCIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9TRUdTX1NPUlRfRlVMTCwgdnNuKDIsIDIsIDE1OCksIE5VTEwsIDAsIE5VTEwsCisJIkxpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5IHdoZW4gcmVwb3J0aW5nIGx2bSBmdWxscmVwb3J0J3MgJ3NlZycgc3VicmVwb3J0LlxuIgorCSJTZWUgJ2x2cyAtLXNlZ21lbnRzIC1vIGhlbHAnIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBmaWVsZHMuXG4iKQorCitjZmcocmVwb3J0X21hcmtfaGlkZGVuX2RldmljZXNfQ0ZHLCAibWFya19oaWRkZW5fZGV2aWNlcyIsIHJlcG9ydF9DRkdfU0VDVElPTiwgQ0ZHX1BST0ZJTEFCTEUgfCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIDEsIHZzbigyLCAyLCAxNDApLCBOVUxMLCAwLCBOVUxMLAorCSJVc2UgYnJhY2tldHMgW10gdG8gbWFyayBoaWRkZW4gZGV2aWNlcy5cbiIpCisKK2NmZyhyZXBvcnRfdHdvX3dvcmRfdW5rbm93bl9kZXZpY2VfQ0ZHLCAidHdvX3dvcmRfdW5rbm93bl9kZXZpY2UiLCByZXBvcnRfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfQk9PTCwgMCwgdnNuKDIsIDIsIDE0NiksIE5VTEwsIDAsIE5VTEwsCisJIlVzZSB0aGUgdHdvIHdvcmRzICd1bmtub3duIGRldmljZScgaW4gcGxhY2Ugb2YgJ1t1bmtub3duXScuXG4iCisJIlRoaXMgaXMgZGlzcGxheWVkIHdoZW4gdGhlIGRldmljZSBmb3IgYSBQViBpcyBub3Qga25vd24uXG4iKQorCitjZmcoZG1ldmVudGRfbWlycm9yX2xpYnJhcnlfQ0ZHLCAibWlycm9yX2xpYnJhcnkiLCBkbWV2ZW50ZF9DRkdfU0VDVElPTiwgMCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0RNRVZFTlREX01JUlJPUl9MSUIsIHZzbigxLCAyLCAzKSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGxpYnJhcnkgZG1ldmVudGQgdXNlcyB3aGVuIG1vbml0b3JpbmcgYSBtaXJyb3IgZGV2aWNlLlxuIgorCSJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMm1pcnJvci5zbyBhdHRlbXB0cyB0byByZWNvdmVyIGZyb21cbiIKKwkiZmFpbHVyZXMuIEl0IHJlbW92ZXMgZmFpbGVkIGRldmljZXMgZnJvbSBhIHZvbHVtZSBncm91cCBhbmRcbiIKKwkicmVjb25maWd1cmVzIGEgbWlycm9yIGFzIG5lY2Vzc2FyeS4gSWYgbm8gbWlycm9yIGxpYnJhcnkgaXNcbiIKKwkicHJvdmlkZWQsIG1pcnJvcnMgYXJlIG5vdCBtb25pdG9yZWQgdGhyb3VnaCBkbWV2ZW50ZC5cbiIpCisKK2NmZyhkbWV2ZW50ZF9yYWlkX2xpYnJhcnlfQ0ZHLCAicmFpZF9saWJyYXJ5IiwgZG1ldmVudGRfQ0ZHX1NFQ1RJT04sIENGR19ERUZBVUxUX0NPTU1FTlRFRCwgQ0ZHX1RZUEVfU1RSSU5HLCBERUZBVUxUX0RNRVZFTlREX1JBSURfTElCLCB2c24oMiwgMiwgODcpLCBOVUxMLCAwLCBOVUxMLCBOVUxMKQorCitjZmcoZG1ldmVudGRfc25hcHNob3RfbGlicmFyeV9DRkcsICJzbmFwc2hvdF9saWJyYXJ5IiwgZG1ldmVudGRfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9ETUVWRU5URF9TTkFQU0hPVF9MSUIsIHZzbigxLCAyLCAyNiksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBsaWJyYXJ5IGRtZXZlbnRkIHVzZXMgd2hlbiBtb25pdG9yaW5nIGEgc25hcHNob3QgZGV2aWNlLlxuIgorCSJsaWJkZXZtYXBwZXItZXZlbnQtbHZtMnNuYXBzaG90LnNvIG1vbml0b3JzIHRoZSBmaWxsaW5nIG9mIHNuYXBzaG90c1xuIgorCSJhbmQgZW1pdHMgYSB3YXJuaW5nIHRocm91Z2ggc3lzbG9nIHdoZW4gdGhlIHVzYWdlIGV4Y2VlZHMgODAlLiBUaGVcbiIKKwkid2FybmluZyBpcyByZXBlYXRlZCB3aGVuIDg1JSwgOTAlIGFuZCA5NSUgb2YgdGhlIHNuYXBzaG90IGlzIGZpbGxlZC5cbiIpCisKK2NmZyhkbWV2ZW50ZF90aGluX2xpYnJhcnlfQ0ZHLCAidGhpbl9saWJyYXJ5IiwgZG1ldmVudGRfQ0ZHX1NFQ1RJT04sIDAsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9ETUVWRU5URF9USElOX0xJQiwgdnNuKDIsIDIsIDg5KSwgTlVMTCwgMCwgTlVMTCwKKwkiVGhlIGxpYnJhcnkgZG1ldmVudGQgdXNlcyB3aGVuIG1vbml0b3JpbmcgYSB0aGluIGRldmljZS5cbiIKKwkibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJ0aGluLnNvIG1vbml0b3JzIHRoZSBmaWxsaW5nIG9mIGEgcG9vbFxuIgorCSJhbmQgZW1pdHMgYSB3YXJuaW5nIHRocm91Z2ggc3lzbG9nIHdoZW4gdGhlIHVzYWdlIGV4Y2VlZHMgODAlLiBUaGVcbiIKKwkid2FybmluZyBpcyByZXBlYXRlZCB3aGVuIDg1JSwgOTAlIGFuZCA5NSUgb2YgdGhlIHBvb2wgaXMgZmlsbGVkLlxuIikKKworY2ZnKGRtZXZlbnRkX2V4ZWN1dGFibGVfQ0ZHLCAiZXhlY3V0YWJsZSIsIGRtZXZlbnRkX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX1NUUklORywgREVGQVVMVF9ETUVWRU5URF9QQVRILCB2c24oMiwgMiwgNzMpLCAiQERNRVZFTlREX1BBVEhAIiwgMCwgTlVMTCwKKwkiVGhlIGZ1bGwgcGF0aCB0byB0aGUgZG1ldmVudGQgYmluYXJ5LlxuIikKKworY2ZnKHRhZ3NfaG9zdHRhZ3NfQ0ZHLCAiaG9zdHRhZ3MiLCB0YWdzX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0JPT0wsIERFRkFVTFRfSE9TVFRBR1MsIHZzbigxLCAwLCAxOCksIE5VTEwsIDAsIE5VTEwsCisJIkNyZWF0ZSBhIGhvc3QgdGFnIHVzaW5nIHRoZSBtYWNoaW5lIG5hbWUuXG4iCisJIlRoZSBtYWNoaW5lIG5hbWUgaXMgbm9kZW5hbWUgcmV0dXJuZWQgYnkgdW5hbWUoMikuXG4iKQorCitjZmdfc2VjdGlvbih0YWdfQ0ZHX1NVQlNFQ1RJT04sICJ0YWciLCB0YWdzX0NGR19TRUNUSU9OLCBDRkdfTkFNRV9WQVJJQUJMRSB8IENGR19ERUZBVUxUX0NPTU1FTlRFRCwgdnNuKDEsIDAsIDE4KSwgMCwgTlVMTCwKKwkiUmVwbGFjZSB0aGlzIHN1YnNlY3Rpb24gbmFtZSB3aXRoIGEgY3VzdG9tIHRhZyBuYW1lLlxuIgorCSJNdWx0aXBsZSBzdWJzZWN0aW9ucyBsaWtlIHRoaXMgY2FuIGJlIGNyZWF0ZWQuIFRoZSAnQCcgcHJlZml4IGZvclxuIgorCSJ0YWdzIGlzIG9wdGlvbmFsLiBUaGlzIHN1YnNlY3Rpb24gY2FuIGNvbnRhaW4gaG9zdF9saXN0LCB3aGljaCBpcyBhXG4iCisJImxpc3Qgb2YgbWFjaGluZSBuYW1lcy4gSWYgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIG1hY2hpbmUgaXMgZm91bmQgaW5cbiIKKwkiaG9zdF9saXN0LCB0aGVuIHRoZSBuYW1lIG9mIHRoaXMgc3Vic2VjdGlvbiBpcyB1c2VkIGFzIGEgdGFnIGFuZCBpc1xuIgorCSJhcHBsaWVkIHRvIHRoZSBsb2NhbCBtYWNoaW5lIGFzIGEgJ2hvc3QgdGFnJy4gSWYgdGhpcyBzdWJzZWN0aW9uIGlzXG4iCisJImVtcHR5IChoYXMgbm8gaG9zdF9saXN0KSwgdGhlbiB0aGUgc3Vic2VjdGlvbiBuYW1lIGlzIGFsd2F5cyBhcHBsaWVkXG4iCisJImFzIGEgJ2hvc3QgdGFnJy5cbiIKKwkiI1xuIgorCSJFeGFtcGxlXG4iCisJIlRoZSBob3N0IHRhZyBmb28gaXMgZ2l2ZW4gdG8gYWxsIGhvc3RzLCBhbmQgdGhlIGhvc3QgdGFnXG4iCisJImJhciBpcyBnaXZlbiB0byB0aGUgaG9zdHMgbmFtZWQgbWFjaGluZTEgYW5kIG1hY2hpbmUyLlxuIgorCSJ0YWdzIHsgZm9vIHsgfSBiYXIgeyBob3N0X2xpc3QgPSBbIFwibWFjaGluZTFcIiwgXCJtYWNoaW5lMlwiIF0gfSB9XG4iCisJIiNcbiIpCisKK2NmZ19hcnJheSh0YWdfaG9zdF9saXN0X0NGRywgImhvc3RfbGlzdCIsIHRhZ19DRkdfU1VCU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigxLCAwLCAxOCksIE5VTEwsIDAsIE5VTEwsCisJIkEgbGlzdCBvZiBtYWNoaW5lIG5hbWVzLlxuIgorCSJUaGVzZSBtYWNoaW5lIG5hbWVzIGFyZSBjb21wYXJlZCB0byB0aGUgbm9kZW5hbWUgcmV0dXJuZWRcbiIKKwkiYnkgdW5hbWUoMikuIElmIHRoZSBsb2NhbCBtYWNoaW5lIG5hbWUgbWF0Y2hlcyBhbiBlbnRyeSBpblxuIgorCSJ0aGlzIGxpc3QsIHRoZSBuYW1lIG9mIHRoZSBzdWJzZWN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlXG4iCisJIm1hY2hpbmUgYXMgYSAnaG9zdCB0YWcnLlxuIikKKworY2ZnKGxvY2FsX3N5c3RlbV9pZF9DRkcsICJzeXN0ZW1faWQiLCBsb2NhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfQ09NTUVOVEVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigyLCAyLCAxMTcpLCBOVUxMLCAwLCBOVUxMLAorCSJEZWZpbmVzIHRoZSBsb2NhbCBzeXN0ZW0gSUQgZm9yIGx2bWxvY2FsIG1vZGUuXG4iCisJIlRoaXMgaXMgdXNlZCB3aGVuIGdsb2JhbC9zeXN0ZW1faWRfc291cmNlIGlzIHNldCB0byAnbHZtbG9jYWwnIGluIHRoZVxuIgorCSJtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSwgZS5nLiBsdm0uY29uZi4gV2hlbiB1c2VkLCBpdCBtdXN0IGJlIHNldCB0b1xuIgorCSJhIHVuaXF1ZSB2YWx1ZSBhbW9uZyBhbGwgaG9zdHMgc2hhcmluZyBhY2Nlc3MgdG8gdGhlIHN0b3JhZ2UsXG4iCisJImUuZy4gYSBob3N0IG5hbWUuXG4iCisJIiNcbiIKKwkiRXhhbXBsZVxuIgorCSJTZXQgbm8gc3lzdGVtIElEOlxuIgorCSJzeXN0ZW1faWQgPSBcIlwiXG4iCisJIlNldCB0aGUgc3lzdGVtX2lkIHRvIGEgc3BlY2lmaWMgbmFtZTpcbiIKKwkic3lzdGVtX2lkID0gXCJob3N0MVwiXG4iCisJIiNcbiIpCisKK2NmZ19hcnJheShsb2NhbF9leHRyYV9zeXN0ZW1faWRzX0NGRywgImV4dHJhX3N5c3RlbV9pZHMiLCBsb2NhbF9DRkdfU0VDVElPTiwgQ0ZHX0FMTE9XX0VNUFRZIHwgQ0ZHX0RFRkFVTFRfVU5ERUZJTkVELCBDRkdfVFlQRV9TVFJJTkcsIE5VTEwsIHZzbigyLCAyLCAxMTcpLCBOVUxMLCAwLCBOVUxMLAorCSJBIGxpc3Qgb2YgZXh0cmEgVkcgc3lzdGVtIElEcyB0aGUgbG9jYWwgaG9zdCBjYW4gYWNjZXNzLlxuIgorCSJWR3Mgd2l0aCB0aGUgc3lzdGVtIElEcyBsaXN0ZWQgaGVyZSAoaW4gYWRkaXRpb24gdG8gdGhlIGhvc3QncyBvd25cbiIKKwkic3lzdGVtIElEKSBjYW4gYmUgZnVsbHkgYWNjZXNzZWQgYnkgdGhlIGxvY2FsIGhvc3QuIChUaGVzZSBhcmVcbiIKKwkic3lzdGVtIElEcyB0aGF0IHRoZSBob3N0IHNlZXMgaW4gVkdzLCBub3Qgc3lzdGVtIElEcyB0aGF0IGlkZW50aWZ5XG4iCisJInRoZSBsb2NhbCBob3N0LCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHN5c3RlbV9pZF9zb3VyY2UuKVxuIgorCSJVc2UgdGhpcyBvbmx5IGFmdGVyIGNvbnN1bHRpbmcgJ21hbiBsdm1zeXN0ZW1pZCcgdG8gYmUgY2VydGFpbiBvZlxuIgorCSJjb3JyZWN0IHVzYWdlIGFuZCBwb3NzaWJsZSBkYW5nZXJzLlxuIikKKworY2ZnKGxvY2FsX2hvc3RfaWRfQ0ZHLCAiaG9zdF9pZCIsIGxvY2FsX0NGR19TRUNUSU9OLCBDRkdfREVGQVVMVF9DT01NRU5URUQsIENGR19UWVBFX0lOVCwgMCwgdnNuKDIsIDIsIDEyNCksIE5VTEwsIDAsIE5VTEwsCisJIlRoZSBsdm1sb2NrZCBzYW5sb2NrIGhvc3RfaWQuXG4iCisJIlRoaXMgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIGhvc3RzLCBhbmQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDIwMDAuXG4iCisJIkFwcGxpY2FibGUgb25seSBpZiBMVk0gaXMgY29tcGlsZWQgd2l0aCBsb2NrZCBzdXBwb3J0XG4iKQorCitjZmcoQ0ZHX0NPVU5ULCBOVUxMLCByb290X0NGR19TRUNUSU9OLCAwLCBDRkdfVFlQRV9JTlQsIDAsIHZzbigwLCAwLCAwKSwgTlVMTCwgMCwgTlVMTCwgTlVMTCkKZGlmZiAtLWdpdCBhL2xpYi9jb25maWcvZGVmYXVsdHMuaCBiL2xpYi9jb25maWcvZGVmYXVsdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWYxNzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvbmZpZy9kZWZhdWx0cy5oCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0RFRkFVTFRTX0gKKyNkZWZpbmUgX0xWTV9ERUZBVUxUU19ICisKKyNkZWZpbmUgREVGQVVMVF9QRV9BTElHTiAyMDQ4CisjZGVmaW5lIERFRkFVTFRfUEVfQUxJR05fT0xEIDEyOAorCisjZGVmaW5lIERFRkFVTFRfQVJDSElWRV9FTkFCTEVEIDEKKyNkZWZpbmUgREVGQVVMVF9CQUNLVVBfRU5BQkxFRCAxCisKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9GSUxFX1BSRUZJWCAiIgorCisjZGVmaW5lIERFRkFVTFRfQVJDSElWRV9EQVlTIDMwCisjZGVmaW5lIERFRkFVTFRfQVJDSElWRV9OVU1CRVIgMTAKKworI2RlZmluZSBERUZBVUxUX0RFVl9ESVIgIi9kZXYiCisjZGVmaW5lIERFRkFVTFRfUFJPQ19ESVIgIi9wcm9jIgorI2RlZmluZSBERUZBVUxUX1NZU1RFTV9JRF9TT1VSQ0UgIm5vbmUiCisjZGVmaW5lIERFRkFVTFRfT0JUQUlOX0RFVklDRV9MSVNUX0ZST01fVURFViAxCisjZGVmaW5lIERFRkFVTFRfRVhURVJOQUxfREVWSUNFX0lORk9fU09VUkNFICJub25lIgorI2RlZmluZSBERUZBVUxUX1NZU0ZTX1NDQU4gMQorI2RlZmluZSBERUZBVUxUX01EX0NPTVBPTkVOVF9ERVRFQ1RJT04gMQorI2RlZmluZSBERUZBVUxUX0ZXX1JBSURfQ09NUE9ORU5UX0RFVEVDVElPTiAwCisjZGVmaW5lIERFRkFVTFRfTURfQ0hVTktfQUxJR05NRU5UIDEKKyNkZWZpbmUgREVGQVVMVF9JR05PUkVfTFZNX01JUlJPUlMgMQorI2RlZmluZSBERUZBVUxUX01VTFRJUEFUSF9DT01QT05FTlRfREVURUNUSU9OIDEKKyNkZWZpbmUgREVGQVVMVF9JR05PUkVfU1VTUEVOREVEX0RFVklDRVMgMAorI2RlZmluZSBERUZBVUxUX0RJU0FCTEVfQUZURVJfRVJST1JfQ09VTlQgMAorI2RlZmluZSBERUZBVUxUX1JFUVVJUkVfUkVTVE9SRUZJTEVfV0lUSF9VVUlEIDEKKyNkZWZpbmUgREVGQVVMVF9EQVRBX0FMSUdOTUVOVF9PRkZTRVRfREVURUNUSU9OIDEKKyNkZWZpbmUgREVGQVVMVF9EQVRBX0FMSUdOTUVOVF9ERVRFQ1RJT04gMQorI2RlZmluZSBERUZBVUxUX0lTU1VFX0RJU0NBUkRTIDAKKyNkZWZpbmUgREVGQVVMVF9QVl9NSU5fU0laRV9LQiAyMDQ4CisjZGVmaW5lIERFRkFVTFRfQUxMT1dfQ0hBTkdFU19XSVRIX0RVUExJQ0FURV9QVlMgMAorCisjZGVmaW5lIERFRkFVTFRfTE9DS0lOR19MSUIgImxpYmx2bTJjbHVzdGVybG9jay5zbyIKKyNkZWZpbmUgREVGQVVMVF9FUlJPUl9XSEVOX0ZVTEwgMAorI2RlZmluZSBERUZBVUxUX0ZBTExCQUNLX1RPX0xPQ0FMX0xPQ0tJTkcgMQorI2RlZmluZSBERUZBVUxUX0ZBTExCQUNLX1RPX0NMVVNURVJFRF9MT0NLSU5HIDEKKyNkZWZpbmUgREVGQVVMVF9XQUlUX0ZPUl9MT0NLUyAxCisjZGVmaW5lIERFRkFVTFRfTFZNTE9DS0RfTE9DS19SRVRSSUVTIDMKKyNkZWZpbmUgREVGQVVMVF9MVk1FVEFEX1VQREFURV9XQUlUX1RJTUUgMTAKKyNkZWZpbmUgREVGQVVMVF9QUklPUklUSVNFX1dSSVRFX0xPQ0tTIDEKKyNkZWZpbmUgREVGQVVMVF9VU0VfTUxPQ0tBTEwgMAorI2RlZmluZSBERUZBVUxUX01FVEFEQVRBX1JFQURfT05MWSAwCisjZGVmaW5lIERFRkFVTFRfTFZESVNQTEFZX1NIT1dTX0ZVTExfREVWSUNFX1BBVEggMAorI2RlZmluZSBERUZBVUxUX1VOS05PV05fREVWSUNFX05BTUUgIlt1bmtub3duXSIKKworI2RlZmluZSBERUZBVUxUX1NBTkxPQ0tfTFZfRVhURU5EX01CIDI1NgorCisjZGVmaW5lIERFRkFVTFRfTUlSUk9STE9HIE1JUlJPUl9MT0dfRElTSworI2RlZmluZSBERUZBVUxUX01JUlJPUl9MT0dfRkFVTFRfUE9MSUNZICJhbGxvY2F0ZSIKKyNkZWZpbmUgREVGQVVMVF9NSVJST1JfSU1BR0VfRkFVTFRfUE9MSUNZICJyZW1vdmUiCisjZGVmaW5lIERFRkFVTFRfTUlSUk9SX01BWF9JTUFHRVMgOCAvKiBsaW1pdGVkIGJ5IGtlcm5lbCBETV9LQ09QWURfTUFYX1JFR0lPTlMgKi8KKy8vIEZJWE1FIEluY3JlYXNlIHRoaXMgdG8gNjQKKyNkZWZpbmUgREVGQVVMVF9SQUlEX01BWF9JTUFHRVMgOCAvKiBsaW1pdGVkIGJ5IGtlcm5lbCBmYWlsZWQgZGV2aWNlcyBiaXRmaWVsZCBpbiBzdXBlcmJsb2NrIChyYWlkNC81LzYgbWF4IDI1MykgKi8KKyNkZWZpbmUgREVGQVVMVF9BTExPQ0FUSU9OX1NUUklQRV9BTExfREVWSUNFUyAwIC8qIERvbid0IHN0cmlwZSBhY3Jvc3MgYWxsIGRldmljZXMgaWYgbm90IC1pLy0tc3RyaXBlcyBnaXZlbiAqLworCisjZGVmaW5lIERFRkFVTFRfUkFJRF9GQVVMVF9QT0xJQ1kgIndhcm4iCisKKyNkZWZpbmUgREVGQVVMVF9ETUVWRU5URF9SQUlEX0xJQiAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJyYWlkLnNvIgorI2RlZmluZSBERUZBVUxUX0RNRVZFTlREX01JUlJPUl9MSUIgImxpYmRldm1hcHBlci1ldmVudC1sdm0ybWlycm9yLnNvIgorI2RlZmluZSBERUZBVUxUX0RNRVZFTlREX1NOQVBTSE9UX0xJQiAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJzbmFwc2hvdC5zbyIKKyNkZWZpbmUgREVGQVVMVF9ETUVWRU5URF9USElOX0xJQiAibGliZGV2bWFwcGVyLWV2ZW50LWx2bTJ0aGluLnNvIgorI2RlZmluZSBERUZBVUxUX0RNRVZFTlREX01PTklUT1IgMQorI2RlZmluZSBERUZBVUxUX0JBQ0tHUk9VTkRfUE9MTElORyAxCisKKyNpZm5kZWYgRE1FVkVOVERfUEFUSAorIyAgZGVmaW5lIERFRkFVTFRfRE1FVkVOVERfUEFUSCAiIgorI2Vsc2UKKyMgIGRlZmluZSBERUZBVUxUX0RNRVZFTlREX1BBVEggRE1FVkVOVERfUEFUSAorI2VuZGlmCisKKyNpZmRlZiBUSElOX0NIRUNLX05FRURTX0NIRUNLCisjICBkZWZpbmUgREVGQVVMVF9USElOX0NIRUNLX09QVElPTjEgIi1xIgorIyAgZGVmaW5lIERFRkFVTFRfVEhJTl9DSEVDS19PUFRJT04yICItLWNsZWFyLW5lZWRzLWNoZWNrLWZsYWciCisjICBkZWZpbmUgREVGQVVMVF9USElOX0NIRUNLX09QVElPTlNfQ09ORklHICIjUyIgREVGQVVMVF9USElOX0NIRUNLX09QVElPTjEgIiNTIiBERUZBVUxUX1RISU5fQ0hFQ0tfT1BUSU9OMgorI2Vsc2UKKyMgIGRlZmluZSBERUZBVUxUX1RISU5fQ0hFQ0tfT1BUSU9OMSAiLXEiCisjICBkZWZpbmUgREVGQVVMVF9USElOX0NIRUNLX09QVElPTjIgIiIKKyMgIGRlZmluZSBERUZBVUxUX1RISU5fQ0hFQ0tfT1BUSU9OU19DT05GSUcgIiNTIiBERUZBVUxUX1RISU5fQ0hFQ0tfT1BUSU9OMQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9USElOX1JFUEFJUl9PUFRJT04xICIiCisjZGVmaW5lIERFRkFVTFRfVEhJTl9SRVBBSVJfT1BUSU9OU19DT05GSUcgIiNTIiBERUZBVUxUX1RISU5fUkVQQUlSX09QVElPTjEKKyNkZWZpbmUgREVGQVVMVF9USElOX1BPT0xfTUVUQURBVEFfUkVRVUlSRV9TRVBBUkFURV9QVlMgMAorI2RlZmluZSBERUZBVUxUX1RISU5fUE9PTF9NQVhfTUVUQURBVEFfU0laRSAoMTYgKiAxMDI0ICogMTAyNCkgIC8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfVEhJTl9QT09MX01JTl9NRVRBREFUQV9TSVpFIDIwNDggIC8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfVEhJTl9QT09MX09QVElNQUxfU0laRSAgICAgKDEyOCAqIDEwMjQgKiAxMDI0KQkvKiBLQiAqLworI2RlZmluZSBERUZBVUxUX1RISU5fUE9PTF9DSFVOS19TSVpFX1BPTElDWSAiZ2VuZXJpYyIKKyNkZWZpbmUgREVGQVVMVF9USElOX1BPT0xfQ0hVTktfU0laRQkgICAgNjQJICAvKiBLQiAqLworI2RlZmluZSBERUZBVUxUX1RISU5fUE9PTF9DSFVOS19TSVpFX1BFUkZPUk1BTkNFIDUxMiAvKiBLQiAqLworI2RlZmluZSBERUZBVUxUX1RISU5fUE9PTF9ESVNDQVJEUyAicGFzc2Rvd24iCisjZGVmaW5lIERFRkFVTFRfVEhJTl9QT09MX1pFUk8gMQorI2RlZmluZSBERUZBVUxUX1BPT0xfTUVUQURBVEFfU1BBUkUgMSAvKiB0aGluICsgY2FjaGUgKi8KKworI2lmZGVmIENBQ0hFX0NIRUNLX05FRURTX0NIRUNLCisjICBkZWZpbmUgREVGQVVMVF9DQUNIRV9DSEVDS19PUFRJT04xICItcSIKKyMgIGRlZmluZSBERUZBVUxUX0NBQ0hFX0NIRUNLX09QVElPTjIgIi0tY2xlYXItbmVlZHMtY2hlY2stZmxhZyIKKyMgIGRlZmluZSBERUZBVUxUX0NBQ0hFX0NIRUNLX09QVElPTlNfQ09ORklHICIjUyIgREVGQVVMVF9DQUNIRV9DSEVDS19PUFRJT04xICIjUyIgREVGQVVMVF9DQUNIRV9DSEVDS19PUFRJT04yCisjZWxzZQorIyAgZGVmaW5lIERFRkFVTFRfQ0FDSEVfQ0hFQ0tfT1BUSU9OMSAiLXEiCisjICBkZWZpbmUgREVGQVVMVF9DQUNIRV9DSEVDS19PUFRJT04yICIiCisjICBkZWZpbmUgREVGQVVMVF9DQUNIRV9DSEVDS19PUFRJT05TX0NPTkZJRyAiI1MiIERFRkFVTFRfQ0FDSEVfQ0hFQ0tfT1BUSU9OMQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9SRVBBSVJfT1BUSU9OMSAiIgorI2RlZmluZSBERUZBVUxUX0NBQ0hFX1JFUEFJUl9PUFRJT05TX0NPTkZJRyAiI1MiIERFRkFVTFRfQ0FDSEVfUkVQQUlSX09QVElPTjEKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9QT09MX01FVEFEQVRBX1JFUVVJUkVfU0VQQVJBVEVfUFZTIDAKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9QT09MX0NIVU5LX1NJWkUgNjQgLyogS0IgKi8KKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9QT09MX01JTl9NRVRBREFUQV9TSVpFIDIwNDggIC8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfQ0FDSEVfUE9PTF9NQVhfTUVUQURBVEFfU0laRSAoMTYgKiAxMDI0ICogMTAyNCkgIC8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfQ0FDSEVfUE9MSUNZICJtcSIKKyNkZWZpbmUgREVGQVVMVF9DQUNIRV9NT0RFICJ3cml0ZXRocm91Z2giCisKKyNkZWZpbmUgREVGQVVMVF9VTUFTSyAwMDc3CisKKyNkZWZpbmUgREVGQVVMVF9GT1JNQVQgImx2bTIiCisKKyNkZWZpbmUgREVGQVVMVF9TVFJJUEVTSVpFIDY0CS8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfUkVDT1JEX0xWU19ISVNUT1JZIDAKKyNkZWZpbmUgREVGQVVMVF9MVlNfSElTVE9SWV9SRVRFTlRJT05fVElNRSAwCisjZGVmaW5lIERFRkFVTFRfUFZNRVRBREFUQUlHTk9SRSAwCisjZGVmaW5lIERFRkFVTFRfUFZNRVRBREFUQVNJWkUgMjU1CisjZGVmaW5lIERFRkFVTFRfUFZNRVRBREFUQUNPUElFUyAxCisjZGVmaW5lIERFRkFVTFRfVkdNRVRBREFUQUNPUElFUyAwCisjZGVmaW5lIERFRkFVTFRfTEFCRUxTRUNUT1IgVUlOVDY0X0MoMSkKKyNkZWZpbmUgREVGQVVMVF9SRUFEX0FIRUFEICJhdXRvIgorI2RlZmluZSBERUZBVUxUX1VERVZfUlVMRVMgMQorI2RlZmluZSBERUZBVUxUX1VERVZfU1lOQyAxCisjZGVmaW5lIERFRkFVTFRfTk9USUZZX0RCVVMgMQorI2RlZmluZSBERUZBVUxUX1ZFUklGWV9VREVWX09QRVJBVElPTlMgMAorI2RlZmluZSBERUZBVUxUX1JFVFJZX0RFQUNUSVZBVElPTiAxCisjZGVmaW5lIERFRkFVTFRfQUNUSVZBVElPTl9DSEVDS1MgMAorI2RlZmluZSBERUZBVUxUX0VYVEVOVF9TSVpFIDQwOTYJLyogSW4gS0IgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfUFYgMAorI2RlZmluZSBERUZBVUxUX01BWF9MViAwCisjZGVmaW5lIERFRkFVTFRfQUxMT0NfUE9MSUNZIEFMTE9DX05PUk1BTAorI2RlZmluZSBERUZBVUxUX01JUlJPUl9MT0dTX1JFUVVJUkVfU0VQQVJBVEVfUFZTIDAKKyNkZWZpbmUgREVGQVVMVF9NQVhJTUlTRV9DTElORyAxCisjZGVmaW5lIERFRkFVTFRfQ0xVU1RFUkVEIDAKKworI2RlZmluZSBERUZBVUxUX01TR19QUkVGSVggIiAgIgorI2RlZmluZSBERUZBVUxUX0NNRF9OQU1FIDAKKyNkZWZpbmUgREVGQVVMVF9PVkVSV1JJVEUgMAorCisjaWZuZGVmIERFRkFVTFRfTE9HX0ZBQ0lMSVRZCisjICBkZWZpbmUgREVGQVVMVF9MT0dfRkFDSUxJVFkgTE9HX1VTRVIKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfQ09NTUFORF9MT0dfUkVQT1JUIDAKKyNkZWZpbmUgREVGQVVMVF9TWVNMT0cgMQorI2RlZmluZSBERUZBVUxUX1ZFUkJPU0UgMAorI2RlZmluZSBERUZBVUxUX1NJTEVOVCAwCisjZGVmaW5lIERFRkFVTFRfTE9HTEVWRUwgMAorI2RlZmluZSBERUZBVUxUX0lOREVOVCAxCisjZGVmaW5lIERFRkFVTFRfQUJPUlRfT05fSU5URVJOQUxfRVJST1JTIDAKKyNkZWZpbmUgREVGQVVMVF9ERVRFQ1RfSU5URVJOQUxfVkdfQ0FDSEVfQ09SUlVQVElPTiAwCisjZGVmaW5lIERFRkFVTFRfVU5JVFMgImgiCisjZGVmaW5lIERFRkFVTFRfU1VGRklYIDEKKyNkZWZpbmUgREVGQVVMVF9IT1NUVEFHUyAwCisKKyNpZm5kZWYgREVGQVVMVF9TSV9VTklUX0NPTlNJU1RFTkNZCisjICBkZWZpbmUgREVGQVVMVF9TSV9VTklUX0NPTlNJU1RFTkNZIDEKKyNlbmRpZgorCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKyMgIGRlZmluZSBERUZBVUxUX0FDVElWQVRJT04gMQorI2Vsc2UKKyMgIGRlZmluZSBERUZBVUxUX0FDVElWQVRJT04gMAorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9SRVNFUlZFRF9NRU1PUlkgODE5MgorI2RlZmluZSBERUZBVUxUX1JFU0VSVkVEX1NUQUNLIDY0IC8qIEtCICovCisjZGVmaW5lIERFRkFVTFRfUFJPQ0VTU19QUklPUklUWSAtMTgKKworI2RlZmluZSBERUZBVUxUX0FVVE9fU0VUX0FDVElWQVRJT05fU0tJUCAxCisjZGVmaW5lIERFRkFVTFRfQUNUSVZBVElPTl9NT0RFICJkZWdyYWRlZCIKKyNkZWZpbmUgREVGQVVMVF9VU0VfTElORUFSX1RBUkdFVCAxCisjZGVmaW5lIERFRkFVTFRfU1RSSVBFX0ZJTExFUiAiZXJyb3IiCisjZGVmaW5lIERFRkFVTFRfUkFJRF9SRUdJT05fU0laRSAgIDUxMgkvKiBLQiAqLworI2RlZmluZSBERUZBVUxUX0lOVEVSVkFMIDE1CisKKyNkZWZpbmUgREVGQVVMVF9NQVhfSElTVE9SWSAxMDAKKworI2RlZmluZSBERUZBVUxUX01BWF9FUlJPUl9DT1VOVAlOT19ERVZfRVJST1JfQ09VTlRfTElNSVQKKworI2RlZmluZSBERUZBVUxUX1JFUF9DT01QQUNUX09VVFBVVCAwCisjZGVmaW5lIERFRkFVTFRfUkVQX0FMSUdORUQgMQorI2RlZmluZSBERUZBVUxUX1JFUF9CVUZGRVJFRCAxCisjZGVmaW5lIERFRkFVTFRfUkVQX0NPTFVNTlNfQVNfUk9XUyAwCisjZGVmaW5lIERFRkFVTFRfUkVQX0hFQURJTkdTIDEKKyNkZWZpbmUgREVGQVVMVF9SRVBfUFJFRklYRVMgMAorI2RlZmluZSBERUZBVUxUX1JFUF9RVU9URUQgMQorI2RlZmluZSBERUZBVUxUX1JFUF9TRVBBUkFUT1IgIiAiCisjZGVmaW5lIERFRkFVTFRfUkVQX0xJU1RfSVRFTV9TRVBBUkFUT1IgIiwiCisjZGVmaW5lIERFRkFVTFRfVElNRV9GT1JNQVQgIiVZLSVtLSVkICVUICV6IgorCisjZGVmaW5lIERFRkFVTFRfUkVQX09VVFBVVF9GT1JNQVQgImJhc2ljIgorI2RlZmluZSBERUZBVUxUX0NPTVBBQ1RfT1VUUFVUX0NPTFMgIiIKKworI2RlZmluZSBERUZBVUxUX0NPTU1BTkRfTE9HX1NFTEVDVElPTiAiIShsb2dfdHlwZT1zdGF0dXMgJiYgbWVzc2FnZT1zdWNjZXNzKSIKKworI2RlZmluZSBERUZBVUxUX0xWU19DT0xTICJsdl9uYW1lLHZnX25hbWUsbHZfYXR0cixsdl9zaXplLHBvb2xfbHYsb3JpZ2luLGRhdGFfcGVyY2VudCxtZXRhZGF0YV9wZXJjZW50LG1vdmVfcHYsbWlycm9yX2xvZyxjb3B5X3BlcmNlbnQsY29udmVydF9sdiIKKyNkZWZpbmUgREVGQVVMVF9WR1NfQ09MUyAidmdfbmFtZSxwdl9jb3VudCxsdl9jb3VudCxzbmFwX2NvdW50LHZnX2F0dHIsdmdfc2l6ZSx2Z19mcmVlIgorI2RlZmluZSBERUZBVUxUX1BWU19DT0xTICJwdl9uYW1lLHZnX25hbWUscHZfZm10LHB2X2F0dHIscHZfc2l6ZSxwdl9mcmVlIgorI2RlZmluZSBERUZBVUxUX1NFR1NfQ09MUyAibHZfbmFtZSx2Z19uYW1lLGx2X2F0dHIsc3RyaXBlcyxzZWd0eXBlLHNlZ19zaXplIgorI2RlZmluZSBERUZBVUxUX1BWU0VHU19DT0xTICJwdl9uYW1lLHZnX25hbWUscHZfZm10LHB2X2F0dHIscHZfc2l6ZSxwdl9mcmVlLHB2c2VnX3N0YXJ0LHB2c2VnX3NpemUiCisjZGVmaW5lIERFRkFVTFRfREVWVFlQRVNfQ09MUyAiZGV2dHlwZV9uYW1lLGRldnR5cGVfbWF4X3BhcnRpdGlvbnMsZGV2dHlwZV9kZXNjcmlwdGlvbiIKKyNkZWZpbmUgREVGQVVMVF9DT01NQU5EX0xPR19DT0xTICJsb2dfc2VxX251bSxsb2dfdHlwZSxsb2dfY29udGV4dCxsb2dfb2JqZWN0X3R5cGUsbG9nX29iamVjdF9uYW1lLGxvZ19vYmplY3RfaWQsbG9nX29iamVjdF9ncm91cCxsb2dfb2JqZWN0X2dyb3VwX2lkLGxvZ19tZXNzYWdlLGxvZ19lcnJubyxsb2dfcmV0X2NvZGUiCisKKyNkZWZpbmUgREVGQVVMVF9MVlNfQ09MU19WRVJCICJsdl9uYW1lLHZnX25hbWUsc2VnX2NvdW50LGx2X2F0dHIsbHZfc2l6ZSxsdl9tYWpvcixsdl9taW5vcixsdl9rZXJuZWxfbWFqb3IsbHZfa2VybmVsX21pbm9yLHBvb2xfbHYsb3JpZ2luLGRhdGFfcGVyY2VudCxtZXRhZGF0YV9wZXJjZW50LG1vdmVfcHYsY29weV9wZXJjZW50LG1pcnJvcl9sb2csY29udmVydF9sdixsdl91dWlkLGx2X3Byb2ZpbGUiCisjZGVmaW5lIERFRkFVTFRfVkdTX0NPTFNfVkVSQiAidmdfbmFtZSx2Z19hdHRyLHZnX2V4dGVudF9zaXplLHB2X2NvdW50LGx2X2NvdW50LHNuYXBfY291bnQsdmdfc2l6ZSx2Z19mcmVlLHZnX3V1aWQsdmdfcHJvZmlsZSIKKyNkZWZpbmUgREVGQVVMVF9QVlNfQ09MU19WRVJCICJwdl9uYW1lLHZnX25hbWUscHZfZm10LHB2X2F0dHIscHZfc2l6ZSxwdl9mcmVlLGRldl9zaXplLHB2X3V1aWQiCisjZGVmaW5lIERFRkFVTFRfU0VHU19DT0xTX1ZFUkIgImx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLHNlZ19zdGFydCxzZWdfc2l6ZSxzdHJpcGVzLHNlZ3R5cGUsc3RyaXBlc2l6ZSxjaHVua3NpemUiCisjZGVmaW5lIERFRkFVTFRfUFZTRUdTX0NPTFNfVkVSQiAicHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSxwdnNlZ19zdGFydCxwdnNlZ19zaXplLGx2X25hbWUsc2VnX3N0YXJ0X3BlLHNlZ3R5cGUsc2VnX3BlX3JhbmdlcyIKKyNkZWZpbmUgREVGQVVMVF9ERVZUWVBFU19DT0xTX1ZFUkIgImRldnR5cGVfbmFtZSxkZXZ0eXBlX21heF9wYXJ0aXRpb25zLGRldnR5cGVfZGVzY3JpcHRpb24iCisKKyNkZWZpbmUgREVGQVVMVF9WR1NfQ09MU19GVUxMICJ2Z19hbGwiCisjZGVmaW5lIERFRkFVTFRfUFZTX0NPTFNfRlVMTCAicHZfYWxsIgorI2RlZmluZSBERUZBVUxUX0xWU19DT0xTX0ZVTEwgImx2X2FsbCIKKyNkZWZpbmUgREVGQVVMVF9QVlNFR1NfQ09MU19GVUxMICJwdnNlZ19hbGwscHZfdXVpZCxsdl91dWlkIgorI2RlZmluZSBERUZBVUxUX1NFR1NfQ09MU19GVUxMICJzZWdfYWxsLGx2X3V1aWQiCisKKyNkZWZpbmUgREVGQVVMVF9MVlNfU09SVCAidmdfbmFtZSxsdl9uYW1lIgorI2RlZmluZSBERUZBVUxUX1ZHU19TT1JUICJ2Z19uYW1lIgorI2RlZmluZSBERUZBVUxUX1BWU19TT1JUICJwdl9uYW1lIgorI2RlZmluZSBERUZBVUxUX1NFR1NfU09SVCAidmdfbmFtZSxsdl9uYW1lLHNlZ19zdGFydCIKKyNkZWZpbmUgREVGQVVMVF9QVlNFR1NfU09SVCAicHZfbmFtZSxwdnNlZ19zdGFydCIKKyNkZWZpbmUgREVGQVVMVF9ERVZUWVBFU19TT1JUICJkZXZ0eXBlX25hbWUiCisjZGVmaW5lIERFRkFVTFRfQ09NTUFORF9MT0dfU09SVCAibG9nX3NlcV9udW0iCisKKyNkZWZpbmUgREVGQVVMVF9WR1NfU09SVF9GVUxMICJ2Z19uYW1lIgorI2RlZmluZSBERUZBVUxUX1BWU19TT1JUX0ZVTEwgInB2X25hbWUiCisjZGVmaW5lIERFRkFVTFRfTFZTX1NPUlRfRlVMTCAidmdfbmFtZSxsdl9uYW1lIgorI2RlZmluZSBERUZBVUxUX1BWU0VHU19TT1JUX0ZVTEwgInB2X3V1aWQscHZzZWdfc3RhcnQiCisjZGVmaW5lIERFRkFVTFRfU0VHU19TT1JUX0ZVTEwgImx2X3V1aWQsc2VnX3N0YXJ0IgorCisjZGVmaW5lIERFRkFVTFRfTUlSUk9SX0RFVklDRV9GQVVMVF9QT0xJQ1kgInJlbW92ZSIKKyNkZWZpbmUgREVGQVVMVF9NSVJST1JfTE9HX0ZBVUxUX1BPTElDWSAiYWxsb2NhdGUiCisjZGVmaW5lIERFRkFVTFRfU05BUFNIT1RfQVVUT0VYVEVORF9USFJFU0hPTEQgMTAwCisjZGVmaW5lIERFRkFVTFRfU05BUFNIT1RfQVVUT0VYVEVORF9QRVJDRU5UIDIwCisjZGVmaW5lIERFRkFVTFRfVEhJTl9QT09MX0FVVE9FWFRFTkRfVEhSRVNIT0xEIDEwMAorI2RlZmluZSBERUZBVUxUX1RISU5fUE9PTF9BVVRPRVhURU5EX1BFUkNFTlQgMjAKKworI2VuZGlmCQkJCS8qIF9MVk1fREVGQVVMVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2RhdGFzdHJ1Y3QvYnRyZWUuYyBiL2xpYi9kYXRhc3RydWN0L2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkMTQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXRhc3RydWN0L2J0cmVlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiYnRyZWUuaCIKKworc3RydWN0IG5vZGUgeworCXVpbnQzMl90IGtleTsKKwlzdHJ1Y3Qgbm9kZSAqbCwgKnIsICpwOworCisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBidHJlZSB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3Qgbm9kZSAqcm9vdDsKK307CisKK3N0cnVjdCBidHJlZSAqYnRyZWVfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0pCit7CisJc3RydWN0IGJ0cmVlICp0ID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqdCkpOworCisJaWYgKHQpIHsKKwkJdC0+bWVtID0gbWVtOworCQl0LT5yb290ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gdDsKK30KKworLyoKKyAqIFNodWZmbGUgdGhlIGJpdHMgaW4gYSBrZXksIHRvIHRyeSBhbmQgcmVtb3ZlCisgKiBhbnkgb3JkZXJpbmcuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfc2h1ZmZsZSh1aW50MzJfdCBrKQoreworI2lmIDEKKwlyZXR1cm4gKChrICYgMHhmZikgPDwgMjQgfAorCQkoayAmIDB4ZmYwMCkgPDwgOCB8CisJCShrICYgMHhmZjAwMDApID4+IDggfCAoayAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyNlbHNlCisJcmV0dXJuIGs7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBub2RlICpjb25zdCAqX2xvb2t1cChzdHJ1Y3Qgbm9kZSAqY29uc3QgKmMsIHVpbnQzMl90IGtleSwKKwkJCSAgICAgc3RydWN0IG5vZGUgKipwKQoreworCSpwID0gTlVMTDsKKwl3aGlsZSAoKmMpIHsKKwkJKnAgPSAqYzsKKwkJaWYgKCgqYyktPmtleSA9PSBrZXkpCisJCQlicmVhazsKKworCQlpZiAoa2V5IDwgKCpjKS0+a2V5KQorCQkJYyA9ICYoKmMpLT5sOworCisJCWVsc2UKKwkJCWMgPSAmKCpjKS0+cjsKKwl9CisKKwlyZXR1cm4gYzsKK30KKwordm9pZCAqYnRyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCBidHJlZSAqdCwgdWludDMyX3QgaykKK3sKKwl1aW50MzJfdCBrZXkgPSBfc2h1ZmZsZShrKTsKKwlzdHJ1Y3Qgbm9kZSAqcCwgKmNvbnN0ICpjID0gX2xvb2t1cCgmdC0+cm9vdCwga2V5LCAmcCk7CisJcmV0dXJuICgqYykgPyAoKmMpLT5kYXRhIDogTlVMTDsKK30KKworaW50IGJ0cmVlX2luc2VydChzdHJ1Y3QgYnRyZWUgKnQsIHVpbnQzMl90IGssIHZvaWQgKmRhdGEpCit7CisJdWludDMyX3Qga2V5ID0gX3NodWZmbGUoayk7CisJc3RydWN0IG5vZGUgKnAsICoqYyA9IChzdHJ1Y3Qgbm9kZSAqKikgX2xvb2t1cCgmdC0+cm9vdCwga2V5LCAmcCksICpuOworCisJaWYgKCEqYykgeworCQlpZiAoIShuID0gZG1fcG9vbF9hbGxvYyh0LT5tZW0sIHNpemVvZigqbikpKSkKKwkJCXJldHVybl8wOworCisJCW4tPmtleSA9IGtleTsKKwkJbi0+ZGF0YSA9IGRhdGE7CisJCW4tPmwgPSBuLT5yID0gTlVMTDsKKwkJbi0+cCA9IHA7CisKKwkJKmMgPSBuOworCX0KKworCXJldHVybiAxOworfQorCit2b2lkICpidHJlZV9nZXRfZGF0YShjb25zdCBzdHJ1Y3QgYnRyZWVfaXRlciAqaXQpCit7CisJcmV0dXJuICgoY29uc3Qgc3RydWN0IG5vZGUgKikgaXQpLT5kYXRhOworfQorCitzdGF0aWMgc3RydWN0IG5vZGUgKl9sZWZ0KHN0cnVjdCBub2RlICpuKQoreworCXdoaWxlIChuLT5sKQorCQluID0gbi0+bDsKKwlyZXR1cm4gbjsKK30KKworc3RydWN0IGJ0cmVlX2l0ZXIgKmJ0cmVlX2ZpcnN0KGNvbnN0IHN0cnVjdCBidHJlZSAqdCkKK3sKKwlpZiAoIXQtPnJvb3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIChzdHJ1Y3QgYnRyZWVfaXRlciAqKSBfbGVmdCh0LT5yb290KTsKK30KKworc3RydWN0IGJ0cmVlX2l0ZXIgKmJ0cmVlX25leHQoY29uc3Qgc3RydWN0IGJ0cmVlX2l0ZXIgKml0KQoreworCXN0cnVjdCBub2RlICpuID0gKHN0cnVjdCBub2RlICopIGl0OworCXVpbnQzMl90IGsgPSBuLT5rZXk7CisKKwlpZiAobi0+cikKKwkJcmV0dXJuIChzdHJ1Y3QgYnRyZWVfaXRlciAqKSBfbGVmdChuLT5yKTsKKworCWRvCisJCW4gPSBuLT5wOworCXdoaWxlIChuICYmIGsgPiBuLT5rZXkpOworCisJcmV0dXJuIChzdHJ1Y3QgYnRyZWVfaXRlciAqKSBuOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhdGFzdHJ1Y3QvYnRyZWUuaCBiL2xpYi9kYXRhc3RydWN0L2J0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MDU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXRhc3RydWN0L2J0cmVlLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0JUUkVFX0gKKyNkZWZpbmUgX0xWTV9CVFJFRV9ICisKK3N0cnVjdCBidHJlZTsKKworc3RydWN0IGJ0cmVlICpidHJlZV9jcmVhdGUoc3RydWN0IGRtX3Bvb2wgKm1lbSk7CisKK3ZvaWQgKmJ0cmVlX2xvb2t1cChjb25zdCBzdHJ1Y3QgYnRyZWUgKnQsIHVpbnQzMl90IGspOworaW50IGJ0cmVlX2luc2VydChzdHJ1Y3QgYnRyZWUgKnQsIHVpbnQzMl90IGssIHZvaWQgKmRhdGEpOworCitzdHJ1Y3QgYnRyZWVfaXRlcjsKK3ZvaWQgKmJ0cmVlX2dldF9kYXRhKGNvbnN0IHN0cnVjdCBidHJlZV9pdGVyICppdCk7CisKK3N0cnVjdCBidHJlZV9pdGVyICpidHJlZV9maXJzdChjb25zdCBzdHJ1Y3QgYnRyZWUgKnQpOworc3RydWN0IGJ0cmVlX2l0ZXIgKmJ0cmVlX25leHQoY29uc3Qgc3RydWN0IGJ0cmVlX2l0ZXIgKml0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGF0YXN0cnVjdC9zdHJfbGlzdC5jIGIvbGliL2RhdGFzdHJ1Y3Qvc3RyX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU1NjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhdGFzdHJ1Y3Qvc3RyX2xpc3QuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorCitzdHJ1Y3QgZG1fbGlzdCAqc3RyX2xpc3RfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0pCit7CisJc3RydWN0IGRtX2xpc3QgKnNsOworCisJaWYgKCEoc2wgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCBkbV9saXN0KSkpKSB7CisJCWxvZ19lcnJubyhFTk9NRU0sICJzdHJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2luaXQoc2wpOworCisJcmV0dXJuIHNsOworfQorCitzdGF0aWMgaW50IF9zdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpzbGwsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGFzX2ZpcnN0KQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2xuOworCisJaWYgKCFzdHIpCisJCXJldHVybl8wOworCisJaWYgKCEoc2xuID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqc2xuKSkpKQorCQlyZXR1cm5fMDsKKworCXNsbi0+c3RyID0gc3RyOworCWlmIChhc19maXJzdCkKKwkJZG1fbGlzdF9hZGRfaChzbGwsICZzbG4tPmxpc3QpOworCWVsc2UKKwkJZG1fbGlzdF9hZGQoc2xsLCAmc2xuLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitpbnQgc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqc2xsLCBjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIF9zdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgc2xsLCBzdHIsIDApOworfQorCitpbnQgc3RyX2xpc3RfYWRkX2hfbm9fZHVwX2NoZWNrKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpzbGwsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gX3N0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBzbGwsIHN0ciwgMSk7Cit9CisKK2ludCBzdHJfbGlzdF9hZGQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3QgY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm5fMDsKKworCS8qIEFscmVhZHkgaW4gbGlzdD8gKi8KKwlpZiAoc3RyX2xpc3RfbWF0Y2hfaXRlbShzbGwsIHN0cikpCisJCXJldHVybiAxOworCisJcmV0dXJuIHN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBzbGwsIHN0cik7Cit9CisKKy8qIEFkZCBjb250ZW50cyBvZiBzbGwyIHRvIHNsbCAqLworaW50IHN0cl9saXN0X2FkZF9saXN0KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpzbGwsIHN0cnVjdCBkbV9saXN0ICpzbGwyKQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2w7CisKKwlpZiAoIXNsbDIpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBzbGwyKQorCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sIHNsbCwgc2wtPnN0cikpCisJCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCit2b2lkIHN0cl9saXN0X2RlbChzdHJ1Y3QgZG1fbGlzdCAqc2xsLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGRtX2xpc3QgKnNsaCwgKnNsaHQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShzbGgsIHNsaHQsIHNsbCkKKwkJaWYgKCFzdHJjbXAoc3RyLCBkbV9saXN0X2l0ZW0oc2xoLCBzdHJ1Y3QgZG1fc3RyX2xpc3QpLT5zdHIpKQorCQkJZG1fbGlzdF9kZWwoc2xoKTsKK30KKwordm9pZCBzdHJfbGlzdF93aXBlKHN0cnVjdCBkbV9saXN0ICpzbGwpCit7CisJc3RydWN0IGRtX2xpc3QgKnNsaCwgKnNsaHQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShzbGgsIHNsaHQsIHNsbCkKKwkJZG1fbGlzdF9kZWwoc2xoKTsKK30KKworaW50IHN0cl9saXN0X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqc2xsbmV3LAorCQkgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbG9sZCkKK3sKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCisJZG1fbGlzdF9pbml0KHNsbG5ldyk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIHNsbG9sZCkgeworCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sIHNsbG5ldywgZG1fcG9vbF9zdHJkdXAobWVtLCBzbC0+c3RyKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIElzIGl0ZW0gb24gbGlzdD8KKyAqLworaW50IHN0cl9saXN0X21hdGNoX2l0ZW0oY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2w7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIHNsbCkKKwkJaWYgKCFzdHJjbXAoc3RyLCBzbC0+c3RyKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJcyBhdCBsZWFzdCBvbmUgaXRlbSBvbiBib3RoIGxpc3RzPworICogSWYgdGFnX21hdGNoZWQgaXMgbm9uLU5VTEwsIGl0IGlzIHNldCB0byB0aGUgdGFnIHRoYXQgbWF0Y2hlZC4KKyAqLworaW50IHN0cl9saXN0X21hdGNoX2xpc3QoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbDIsIGNvbnN0IGNoYXIgKip0YWdfbWF0Y2hlZCkKK3sKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBzbGwpCisJCWlmIChzdHJfbGlzdF9tYXRjaF9pdGVtKHNsbDIsIHNsLT5zdHIpKSB7CisJCQlpZiAodGFnX21hdGNoZWQpCisJCQkJKnRhZ19tYXRjaGVkID0gc2wtPnN0cjsKKwkJCXJldHVybiAxOworCQl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERvIGJvdGggbGlzdHMgY29udGFpbiB0aGUgc2FtZSBzZXQgb2YgaXRlbXM/CisgKi8KK2ludCBzdHJfbGlzdF9saXN0c19lcXVhbChjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqc2xsLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqc2xsMikKK3sKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCisJaWYgKGRtX2xpc3Rfc2l6ZShzbGwpICE9IGRtX2xpc3Rfc2l6ZShzbGwyKSkKKwkJcmV0dXJuIDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIHNsbCkKKwkJaWYgKCFzdHJfbGlzdF9tYXRjaF9pdGVtKHNsbDIsIHNsLT5zdHIpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworY2hhciAqc3RyX2xpc3RfdG9fc3RyKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBkbV9saXN0ICpsaXN0LAorCQkgICAgICBjb25zdCBjaGFyICpkZWxpbSkKK3sKKwlzaXplX3QgZGVsaW1fbGVuID0gc3RybGVuKGRlbGltKTsKKwl1bnNpZ25lZCBsaXN0X3NpemUgPSBkbV9saXN0X3NpemUobGlzdCk7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwljaGFyICpzdHIsICpwOworCXNpemVfdCBsZW4gPSAwOworCXVuc2lnbmVkIGkgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBsaXN0KQorCQlsZW4gKz0gc3RybGVuKHNsLT5zdHIpOworCWlmIChsaXN0X3NpemUgPiAxKQorCQlsZW4gKz0gKChsaXN0X3NpemUgLSAxKSAqIGRlbGltX2xlbik7CisKKwlzdHIgPSBkbV9wb29sX2FsbG9jKG1lbSwgbGVuKzEpOworCWlmICghc3RyKSB7CisJCWxvZ19lcnJvcigic3RyX2xpc3RfdG9fc3RyOiBzdHJpbmcgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlzdHJbbGVuXSA9ICdcMCc7CisJcCA9IHN0cjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgbGlzdCkgeworCQlsZW4gPSBzdHJsZW4oc2wtPnN0cik7CisJCW1lbWNweShwLCBzbC0+c3RyLCBsZW4pOworCQlwICs9IGxlbjsKKworCQlpZiAoKytpICE9IGxpc3Rfc2l6ZSkgeworCQkJbWVtY3B5KHAsIGRlbGltLCBkZWxpbV9sZW4pOworCQkJcCArPSBkZWxpbV9sZW47CisJCX0KKwl9CisKKwlyZXR1cm4gc3RyOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqc3RyX3RvX3N0cl9saXN0KHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnN0ciwKKwkJCQljb25zdCBjaGFyICpkZWxpbSwgaW50IGlnbm9yZV9tdWx0aXBsZV9kZWxpbSkKK3sKKwlzaXplX3QgZGVsaW1fbGVuID0gc3RybGVuKGRlbGltKTsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKwljb25zdCBjaGFyICpwMSwgKnAyLCAqbmV4dDsKKwljaGFyICpzdHJfaXRlbTsKKwlzaXplX3QgbGVuOworCisJaWYgKCEobGlzdCA9IHN0cl9saXN0X2NyZWF0ZShtZW0pKSkgeworCQlsb2dfZXJyb3IoInN0cl90b19zdHJfbGlzdDogc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXAxID0gcDIgPSBzdHI7CisJd2hpbGUgKCpwMSkgeworCQlpZiAoIShwMiA9IHN0cnN0cihwMSwgZGVsaW0pKSkKKwkJCW5leHQgPSBwMiA9IHN0ciArIHN0cmxlbihzdHIpOworCQllbHNlCisJCQluZXh0ID0gcDIgKyBkZWxpbV9sZW47CisKKwkJbGVuID0gcDIgLSBwMTsKKwkJc3RyX2l0ZW0gPSBkbV9wb29sX2FsbG9jKG1lbSwgbGVuKzEpOworCQlpZiAoIXN0cl9pdGVtKSB7CisJCQlsb2dfZXJyb3IoInN0cl90b19zdHJfbGlzdDogc3RyaW5nIGxpc3QgaXRlbSBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCW1lbWNweShzdHJfaXRlbSwgcDEsIGxlbik7CisJCXN0cl9pdGVtW2xlbl0gPSAnXDAnOworCisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxpc3QsIHN0cl9pdGVtKSkKKwkJCWdvdG9fYmFkOworCisJCWlmIChpZ25vcmVfbXVsdGlwbGVfZGVsaW0pIHsKKwkJCXdoaWxlICghc3RybmNtcChuZXh0LCBkZWxpbSwgZGVsaW1fbGVuKSkKKwkJCQluZXh0ICs9IGRlbGltX2xlbjsKKwkJfQorCisJCXAxID0gbmV4dDsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK2JhZDoKKwlkbV9wb29sX2ZyZWUobWVtLCBsaXN0KTsKKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhdGFzdHJ1Y3Qvc3RyX2xpc3QuaCBiL2xpYi9kYXRhc3RydWN0L3N0cl9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXRhc3RydWN0L3N0cl9saXN0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1NUUl9MSVNUX0gKKyNkZWZpbmUgX0xWTV9TVFJfTElTVF9ICisKK3N0cnVjdCBkbV9saXN0Oworc3RydWN0IGRtX3Bvb2w7CisKK3N0cnVjdCBkbV9saXN0ICpzdHJfbGlzdF9jcmVhdGUoc3RydWN0IGRtX3Bvb2wgKm1lbSk7CitpbnQgc3RyX2xpc3RfYWRkKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpzbGwsIGNvbnN0IGNoYXIgKnN0cik7CitpbnQgc3RyX2xpc3RfYWRkX2xpc3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnNsbCwgc3RydWN0IGRtX2xpc3QgKnNsbDIpOworaW50IHN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2soc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3QgY2hhciAqc3RyKTsKK2ludCBzdHJfbGlzdF9hZGRfaF9ub19kdXBfY2hlY2soc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgc3RyX2xpc3RfZGVsKHN0cnVjdCBkbV9saXN0ICpzbGwsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIHN0cl9saXN0X3dpcGUoc3RydWN0IGRtX2xpc3QgKnNsbCk7CitpbnQgc3RyX2xpc3RfbWF0Y2hfaXRlbShjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqc2xsLCBjb25zdCBjaGFyICpzdHIpOworaW50IHN0cl9saXN0X21hdGNoX2xpc3QoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbDIsIGNvbnN0IGNoYXIgKip0YWdfbWF0Y2hlZCk7CitpbnQgc3RyX2xpc3RfbGlzdHNfZXF1YWwoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbDIpOworaW50IHN0cl9saXN0X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqc2xsbmV3LAorCQkgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbG9sZCk7CitjaGFyICpzdHJfbGlzdF90b19zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKmRlbGltKTsKK3N0cnVjdCBkbV9saXN0ICpzdHJfdG9fc3RyX2xpc3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpkZWxpbSwgaW50IGlnbm9yZV9tdWx0aXBsZV9kZWxpbSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2RldmljZS9kZXYtY2FjaGUuYyBiL2xpYi9kZXZpY2UvZGV2LWNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNDRjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LWNhY2hlLmMKQEAgLTAsMCArMSwxNTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJkbS1pb2N0bC5oIiAvKiBmb3IgRE1fVVVJRF9MRU4gKi8KKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiIC8qIGZvciBMVk0ncyBVVUlEX1BSRUZJWCAqLworCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworc3RydWN0IGRldl9pdGVyIHsKKwlzdHJ1Y3QgYnRyZWVfaXRlciAqY3VycmVudDsKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyOworfTsKKworc3RydWN0IGRpcl9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNoYXIgZGlyWzBdOworfTsKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbmFtZXM7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKnZnaWRfaW5kZXg7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2aWRfaW5kZXg7CisJc3RydWN0IGJ0cmVlICpzeXNmc19vbmx5X2RldmljZXM7IC8qIHNlZSBjb21tZW50cyBpbiBfZ2V0X2RldmljZV9mb3Jfc3lzZnNfZGV2X25hbWVfdXNpbmdfZGV2bm8gKi8KKwlzdHJ1Y3QgYnRyZWUgKmRldmljZXM7CisJc3RydWN0IGRtX3JlZ2V4ICpwcmVmZXJyZWRfbmFtZXNfbWF0Y2hlcjsKKwljb25zdCBjaGFyICpkZXZfZGlyOworCisJaW50IGhhc19zY2FubmVkOworCXN0cnVjdCBkbV9saXN0IGRpcnM7CisJc3RydWN0IGRtX2xpc3QgZmlsZXM7CisKK30gX2NhY2hlOworCisjZGVmaW5lIF96YWxsb2MoeCkgZG1fcG9vbF96YWxsb2MoX2NhY2hlLm1lbSwgKHgpKQorI2RlZmluZSBfZnJlZSh4KSBkbV9wb29sX2ZyZWUoX2NhY2hlLm1lbSwgKHgpKQorI2RlZmluZSBfc3RyZHVwKHgpIGRtX3Bvb2xfc3RyZHVwKF9jYWNoZS5tZW0sICh4KSkKKworc3RhdGljIGludCBfaW5zZXJ0KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCBzdGF0ICppbmZvLAorCQkgICBpbnQgcmVjLCBpbnQgY2hlY2tfd2l0aF91ZGV2X2RiKTsKKworLyogU2V0dXAgbm9uLXplcm8gbWVtYmVycyBvZiBwYXNzZWQgemVyb2VkICdzdHJ1Y3QgZGV2aWNlJyAqLworc3RhdGljIHZvaWQgX2Rldl9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1heF9lcnJvcl9jb3VudCkKK3sKKwlkZXYtPnBoeXNfYmxvY2tfc2l6ZSA9IC0xOworCWRldi0+YmxvY2tfc2l6ZSA9IC0xOworCWRldi0+ZmQgPSAtMTsKKwlkZXYtPnJlYWRfYWhlYWQgPSAtMTsKKwlkZXYtPm1heF9lcnJvcl9jb3VudCA9IG1heF9lcnJvcl9jb3VudDsKKworCWRldi0+ZXh0LmVuYWJsZWQgPSAwOworCWRldi0+ZXh0LnNyYyA9IERFVl9FWFRfTk9ORTsKKworCWRtX2xpc3RfaW5pdCgmZGV2LT5hbGlhc2VzKTsKKwlkbV9saXN0X2luaXQoJmRldi0+b3Blbl9saXN0KTsKK30KKwordm9pZCBkZXZfZGVzdHJveV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIShkZXYtPmZsYWdzICYgREVWX0FMTE9DRUQpKQorCQlyZXR1cm47CisKKwlkbV9mcmVlKCh2b2lkICopIGRtX2xpc3RfaXRlbShkZXYtPmFsaWFzZXMubiwgc3RydWN0IGRtX3N0cl9saXN0KS0+c3RyKTsKKwlkbV9mcmVlKGRldi0+YWxpYXNlcy5uKTsKKwlkbV9mcmVlKGRldik7Cit9CisKK3N0cnVjdCBkZXZpY2UgKmRldl9jcmVhdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkbV9zdHJfbGlzdCAqYWxpYXMsIGludCB1c2VfbWFsbG9jKQoreworCWludCBhbGxvY2F0ZSA9ICFkZXY7CisKKwlpZiAoYWxsb2NhdGUpIHsKKwkJaWYgKHVzZV9tYWxsb2MpIHsKKwkJCWlmICghKGRldiA9IGRtX3phbGxvYyhzaXplb2YoKmRldikpKSkgeworCQkJCWxvZ19lcnJvcigic3RydWN0IGRldmljZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKCEoYWxpYXMgPSBkbV96YWxsb2Moc2l6ZW9mKCphbGlhcykpKSkgeworCQkJCWxvZ19lcnJvcigic3RydWN0IGRtX3N0cl9saXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCQkJZG1fZnJlZShkZXYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKCEoYWxpYXMtPnN0ciA9IGRtX3N0cmR1cChmaWxlbmFtZSkpKSB7CisJCQkJbG9nX2Vycm9yKCJmaWxlbmFtZSBzdHJkdXAgZmFpbGVkIik7CisJCQkJZG1fZnJlZShkZXYpOworCQkJCWRtX2ZyZWUoYWxpYXMpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoZGV2ID0gX3phbGxvYyhzaXplb2YoKmRldikpKSkgeworCQkJCWxvZ19lcnJvcigic3RydWN0IGRldmljZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKCEoYWxpYXMgPSBfemFsbG9jKHNpemVvZigqYWxpYXMpKSkpIHsKKwkJCQlsb2dfZXJyb3IoInN0cnVjdCBkbV9zdHJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJCV9mcmVlKGRldik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoIShhbGlhcy0+c3RyID0gX3N0cmR1cChmaWxlbmFtZSkpKSB7CisJCQkJbG9nX2Vycm9yKCJmaWxlbmFtZSBzdHJkdXAgZmFpbGVkIik7CisJCQkJX2ZyZWUoZGV2KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoIShhbGlhcy0+c3RyID0gZG1fc3RyZHVwKGZpbGVuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJmaWxlbmFtZSBzdHJkdXAgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCV9kZXZfaW5pdChkZXYsIE5PX0RFVl9FUlJPUl9DT1VOVF9MSU1JVCk7CisJZGV2LT5mbGFncyA9IERFVl9SRUdVTEFSIHwgKCh1c2VfbWFsbG9jKSA/IERFVl9BTExPQ0VEIDogMCk7CisJZG1fbGlzdF9hZGQoJmRldi0+YWxpYXNlcywgJmFsaWFzLT5saXN0KTsKKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpfZGV2X2NyZWF0ZShkZXZfdCBkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWlmICghKGRldiA9IF96YWxsb2Moc2l6ZW9mKCpkZXYpKSkpIHsKKwkJbG9nX2Vycm9yKCJzdHJ1Y3QgZGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCV9kZXZfaW5pdChkZXYsIGRldl9kaXNhYmxlX2FmdGVyX2Vycm9yX2NvdW50KCkpOworCWRldi0+ZGV2ID0gZDsKKworCXJldHVybiBkZXY7Cit9CisKK3ZvaWQgZGV2X3NldF9wcmVmZXJyZWRfbmFtZShzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBEb24ndCBpbnRlcmZlcmUgd2l0aCBvcmRlcmluZyBzcGVjaWZpZWQgaW4gY29uZmlnIGZpbGUuCisJICovCisJaWYgKF9jYWNoZS5wcmVmZXJyZWRfbmFtZXNfbWF0Y2hlcikKKwkJcmV0dXJuOworCisJbG9nX2RlYnVnX2RldnMoIiVzOiBOZXcgcHJlZmVycmVkIG5hbWUiLCBzbC0+c3RyKTsKKwlkbV9saXN0X2RlbCgmc2wtPmxpc3QpOworCWRtX2xpc3RfYWRkX2goJmRldi0+YWxpYXNlcywgJnNsLT5saXN0KTsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgcGF0aDAgb3IgcGF0aDEgY29udGFpbnMgdGhlIHN1YnBhdGguIFRoZSBwYXRoIHRoYXQKKyAqICpkb2VzIG5vdCogY29udGFpbiB0aGUgc3VicGF0aCB3aW5zIChyZXR1cm4gMCBvciAxKS4gSWYgYm90aCBwYXRocworICogY29udGFpbiB0aGUgc3VicGF0aCwgcmV0dXJuIC0xLiBJZiBub25lIG9mIHRoZW0gY29udGFpbnMgdGhlIHN1YnBhdGgsCisgKiByZXR1cm4gLTIuCisgKi8KK3N0YXRpYyBpbnQgX2J1aWx0aW5fcHJlZmVyZW5jZShjb25zdCBjaGFyICpwYXRoMCwgY29uc3QgY2hhciAqcGF0aDEsCisJCQkgICAgICAgc2l6ZV90IHNraXBfcHJlZml4X2NvdW50LCBjb25zdCBjaGFyICpzdWJwYXRoKQoreworCXNpemVfdCBzdWJwYXRoX2xlbjsKKwlpbnQgcjAsIHIxOworCisJc3VicGF0aF9sZW4gPSBzdHJsZW4oc3VicGF0aCk7CisKKwlyMCA9ICFzdHJuY21wKHBhdGgwICsgc2tpcF9wcmVmaXhfY291bnQsIHN1YnBhdGgsIHN1YnBhdGhfbGVuKTsKKwlyMSA9ICFzdHJuY21wKHBhdGgxICsgc2tpcF9wcmVmaXhfY291bnQsIHN1YnBhdGgsIHN1YnBhdGhfbGVuKTsKKworCWlmICghcjAgJiYgcjEpCisJCS8qIHBhdGgwIGRvZXMgbm90IGhhdmUgdGhlIHN1YnBhdGggLSBpdCB3aW5zICovCisJCXJldHVybiAwOworCWVsc2UgaWYgKHIwICYmICFyMSkKKwkJLyogcGF0aDEgZG9lcyBub3QgaGF2ZSB0aGUgc3VicGF0aCAtIGl0IHdpbnMgKi8KKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocjAgJiYgcjEpCisJCS8qIGJvdGggb2YgdGhlbSBoYXZlIHRoZSBzdWJwYXRoICovCisJCXJldHVybiAtMTsKKworCS8qIG5vIHBhdGggaGFzIHRoZSBzdWJwYXRoICovCisJcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50IF9hcHBseV9idWlsdGluX3BhdGhfcHJlZmVyZW5jZV9ydWxlcyhjb25zdCBjaGFyICpwYXRoMCwgY29uc3QgY2hhciAqcGF0aDEpCit7CisJc2l6ZV90IGRldmRpcl9sZW47CisJaW50IHI7CisKKwlkZXZkaXJfbGVuID0gc3RybGVuKF9jYWNoZS5kZXZfZGlyKTsKKworCWlmICghc3RybmNtcChwYXRoMCwgX2NhY2hlLmRldl9kaXIsIGRldmRpcl9sZW4pICYmCisJICAgICFzdHJuY21wKHBhdGgxLCBfY2FjaGUuZGV2X2RpciwgZGV2ZGlyX2xlbikpIHsKKwkJLyoKKwkJICogV2UncmUgdHJ5aW5nIHRvIGFjaGlldmUgdGhlIG9yZGVyaW5nOgorCQkgKgkvZGV2L2Jsb2NrLyA8IC9kZXYvZG0tKiA8IC9kZXYvZGlzay8gPCAvZGV2L21hcHBlci8gPCBhbnl0aGluZyBlbHNlCisJCSAqLworCisJCS8qIFByZWZlciBhbnkgb3RoZXIgcGF0aCBvdmVyIC9kZXYvYmxvY2svIHBhdGguICovCisJCWlmICgociA9IF9idWlsdGluX3ByZWZlcmVuY2UocGF0aDAsIHBhdGgxLCBkZXZkaXJfbGVuLCAiYmxvY2svIikpID49IC0xKQorCQkJcmV0dXJuIHI7CisKKwkJLyogUHJlZmVyIGFueSBvdGhlciBwYXRoIG92ZXIgL2Rldi9kbS0qIHBhdGguICovCisJCWlmICgociA9IF9idWlsdGluX3ByZWZlcmVuY2UocGF0aDAsIHBhdGgxLCBkZXZkaXJfbGVuLCAiZG0tIikpID49IC0xKQorCQkJcmV0dXJuIHI7CisKKwkJLyogUHJlZmVyIGFueSBvdGhlciBwYXRoIG92ZXIgL2Rldi9kaXNrLyBwYXRoLiAqLworCQlpZiAoKHIgPSBfYnVpbHRpbl9wcmVmZXJlbmNlKHBhdGgwLCBwYXRoMSwgZGV2ZGlyX2xlbiwgImRpc2svIikpID49IC0xKQorCQkJcmV0dXJuIHI7CisKKwkJLyogUHJlZmVyIGFueSBvdGhlciBwYXRoIG92ZXIgL2Rldi9tYXBwZXIvIHBhdGguICovCisJCWlmICgociA9IF9idWlsdGluX3ByZWZlcmVuY2UocGF0aDAsIHBhdGgxLCAwLCBkbV9kaXIoKSkpID49IC0xKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gMSBpZiB3ZSBwcmVmZXIgcGF0aDEgZWxzZSByZXR1cm4gMCAqLworc3RhdGljIGludCBfY29tcGFyZV9wYXRocyhjb25zdCBjaGFyICpwYXRoMCwgY29uc3QgY2hhciAqcGF0aDEpCit7CisJaW50IHNsYXNoMCA9IDAsIHNsYXNoMSA9IDA7CisJaW50IG0wLCBtMTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgcDBbUEFUSF9NQVhdLCBwMVtQQVRIX01BWF07CisJY2hhciAqczAsICpzMTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0MCwgc3RhdDE7CisJaW50IHI7CisKKwkvKgorCSAqIEZJWE1FIEJldHRlciB0byBjb21wYXJlIHBhdHRlcm5zIG9uZS1hdC1hLXRpbWUgYWdhaW5zdCBhbGwgbmFtZXMuCisJICovCisJaWYgKF9jYWNoZS5wcmVmZXJyZWRfbmFtZXNfbWF0Y2hlcikgeworCQltMCA9IGRtX3JlZ2V4X21hdGNoKF9jYWNoZS5wcmVmZXJyZWRfbmFtZXNfbWF0Y2hlciwgcGF0aDApOworCQltMSA9IGRtX3JlZ2V4X21hdGNoKF9jYWNoZS5wcmVmZXJyZWRfbmFtZXNfbWF0Y2hlciwgcGF0aDEpOworCisJCWlmIChtMCAhPSBtMSkgeworCQkJaWYgKG0wIDwgMCkKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChtMSA8IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobTAgPCBtMSkKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChtMSA8IG0wKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogQXBwbHkgYnVpbHQtaW4gcHJlZmVyZW5jZSBydWxlcyBmaXJzdC4gKi8KKwlpZiAoKHIgPSBfYXBwbHlfYnVpbHRpbl9wYXRoX3ByZWZlcmVuY2VfcnVsZXMocGF0aDAsIHBhdGgxKSkgPj0gMCkKKwkJcmV0dXJuIHI7CisKKwkvKiBSZXR1cm4gdGhlIHBhdGggd2l0aCBmZXdlciBzbGFzaGVzICovCisJZm9yIChwID0gcGF0aDA7IHArKzsgcCA9IChjb25zdCBjaGFyICopIHN0cmNocihwLCAnLycpKQorCQlzbGFzaDArKzsKKworCWZvciAocCA9IHBhdGgxOyBwKys7IHAgPSAoY29uc3QgY2hhciAqKSBzdHJjaHIocCwgJy8nKSkKKwkJc2xhc2gxKys7CisKKwlpZiAoc2xhc2gwIDwgc2xhc2gxKQorCQlyZXR1cm4gMDsKKwlpZiAoc2xhc2gxIDwgc2xhc2gwKQorCQlyZXR1cm4gMTsKKworCXN0cm5jcHkocDAsIHBhdGgwLCBzaXplb2YocDApIC0gMSk7CisJcDBbc2l6ZW9mKHAwKSAtIDFdID0gJ1wwJzsKKwlzdHJuY3B5KHAxLCBwYXRoMSwgc2l6ZW9mKHAxKSAtIDEpOworCXAxW3NpemVvZihwMSkgLSAxXSA9ICdcMCc7CisJczAgPSBwMCArIDE7CisJczEgPSBwMSArIDE7CisKKwkvKgorCSAqIElmIHdlIHJlYWNoIGhlcmUsIGJvdGggcGF0aHMgYXJlIHRoZSBzYW1lIGxlbmd0aC4KKwkgKiBOb3cgc2tpcCBwYXN0IGlkZW50aWNhbCBwYXRoIGNvbXBvbmVudHMuCisJICovCisJd2hpbGUgKCpzMCAmJiAqczAgPT0gKnMxKQorCQlzMCsrLCBzMSsrOworCisJLyogV2UgcHJlZmVyIHN5bWxpbmtzIC0gdGhleSBleGlzdCBmb3IgYSByZWFzb24hCisJICogU28gd2UgcHJlZmVyIGEgc2hvcnRlciBwYXRoIGJlZm9yZSB0aGUgZmlyc3Qgc3ltbGluayBpbiB0aGUgbmFtZS4KKwkgKiBGSVhNRSBDb25maWd1cmF0aW9uIG9wdGlvbiB0byBpbnZlcnQgdGhpcz8gKi8KKwl3aGlsZSAoczApIHsKKwkJczAgPSBzdHJjaHIoczAsICcvJyk7CisJCXMxID0gc3RyY2hyKHMxLCAnLycpOworCQlpZiAoczApIHsKKwkJCSpzMCA9ICdcMCc7CisJCQkqczEgPSAnXDAnOworCQl9CisJCWlmIChsc3RhdChwMCwgJnN0YXQwKSkgeworCQkJbG9nX3N5c192ZXJ5X3ZlcmJvc2UoImxzdGF0IiwgcDApOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGxzdGF0KHAxLCAmc3RhdDEpKSB7CisJCQlsb2dfc3lzX3ZlcnlfdmVyYm9zZSgibHN0YXQiLCBwMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoU19JU0xOSyhzdGF0MC5zdF9tb2RlKSAmJiAhU19JU0xOSyhzdGF0MS5zdF9tb2RlKSkKKwkJCXJldHVybiAwOworCQlpZiAoIVNfSVNMTksoc3RhdDAuc3RfbW9kZSkgJiYgU19JU0xOSyhzdGF0MS5zdF9tb2RlKSkKKwkJCXJldHVybiAxOworCQlpZiAoczApIHsKKwkJCSpzMCsrID0gJy8nOworCQkJKnMxKysgPSAnLyc7CisJCX0KKwl9CisKKwkvKiBBU0NJSSBjb21wYXJpc29uICovCisJaWYgKHN0cmNtcChwYXRoMCwgcGF0aDEpIDwgMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX2FsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsID0gX3phbGxvYyhzaXplb2YoKnNsKSk7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzdHJsOworCWNvbnN0IGNoYXIgKm9sZHBhdGg7CisJaW50IHByZWZlcl9vbGQgPSAxOworCisJaWYgKCFzbCkKKwkJcmV0dXJuXzA7CisKKwkvKiBJcyBuYW1lIGFscmVhZHkgdGhlcmU/ICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHN0cmwsICZkZXYtPmFsaWFzZXMpIHsKKwkJaWYgKCFzdHJjbXAoc3RybC0+c3RyLCBwYXRoKSkgeworCQkJbG9nX2RlYnVnX2RldnMoIiVzOiBBbHJlYWR5IGluIGRldmljZSBjYWNoZSIsIHBhdGgpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlzbC0+c3RyID0gcGF0aDsKKworCWlmICghZG1fbGlzdF9lbXB0eSgmZGV2LT5hbGlhc2VzKSkgeworCQlvbGRwYXRoID0gZG1fbGlzdF9pdGVtKGRldi0+YWxpYXNlcy5uLCBzdHJ1Y3QgZG1fc3RyX2xpc3QpLT5zdHI7CisJCXByZWZlcl9vbGQgPSBfY29tcGFyZV9wYXRocyhwYXRoLCBvbGRwYXRoKTsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBBbGlhc2VkIHRvICVzIGluIGRldmljZSBjYWNoZSVzICglZDolZCkiLAorCQkJICAgICAgIHBhdGgsIG9sZHBhdGgsIHByZWZlcl9vbGQgPyAiIiA6ICIgKHByZWZlcnJlZCBuYW1lKSIsCisJCQkgICAgICAgKGludCkgTUFKT1IoZGV2LT5kZXYpLCAoaW50KSBNSU5PUihkZXYtPmRldikpOworCisJfSBlbHNlCisJCWxvZ19kZWJ1Z19kZXZzKCIlczogQWRkZWQgdG8gZGV2aWNlIGNhY2hlICglZDolZCkiLCBwYXRoLAorCQkJICAgICAgIChpbnQpIE1BSk9SKGRldi0+ZGV2KSwgKGludCkgTUlOT1IoZGV2LT5kZXYpKTsKKworCWlmIChwcmVmZXJfb2xkKQorCQlkbV9saXN0X2FkZCgmZGV2LT5hbGlhc2VzLCAmc2wtPmxpc3QpOworCWVsc2UKKwkJZG1fbGlzdF9hZGRfaCgmZGV2LT5hbGlhc2VzLCAmc2wtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9zeXNmc192YWx1ZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwgaW50IGVycm9yX2lmX25vX3ZhbHVlKQoreworCUZJTEUgKmZwOworCXNpemVfdCBsZW47CisJaW50IHIgPSAwOworCisJaWYgKCEoZnAgPSBmb3BlbihwYXRoLCAiciIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWZnZXRzKGJ1ZiwgYnVmX3NpemUsIGZwKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmZ2V0cyIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGxlbiA9IHN0cmxlbihidWYpKSAmJiBidWZbbGVuIC0gMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9ICdcMCc7CisKKwlpZiAoIWxlbiAmJiBlcnJvcl9pZl9ub192YWx1ZSkKKwkJbG9nX2Vycm9yKCJfZ2V0X3N5c2ZzX3ZhbHVlOiAlczogbm8gdmFsdWUiLCBwYXRoKTsKKwllbHNlCisJCXIgPSAxOworb3V0OgorCWlmIChmY2xvc2UoZnApKQorCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBwYXRoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9nZXRfZG1fdXVpZF9mcm9tX3N5c2ZzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBpbnQgbWFqb3IsIGludCBtaW5vcikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzZGV2L2Jsb2NrLyVkOiVkL2RtL3V1aWQiLCBkbV9zeXNmc19kaXIoKSwgbWFqb3IsIG1pbm9yKSA8IDApIHsKKwkJbG9nX2Vycm9yKCIlZDolZDogZG1fc25wcmludGYgZmFpbGVkIGZvciBwYXRoIHRvIHN5c2ZzIGRtIGRpcmVjdG9yeS4iLCBtYWpvciwgbWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2dldF9zeXNmc192YWx1ZShwYXRoLCBidWYsIGJ1Zl9zaXplLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBkbV9saXN0ICpfZ2V0X29yX2FkZF9saXN0X2J5X2luZGV4X2tleShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqaWR4LCBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IGRtX2xpc3QgKmxpc3Q7CisKKwlpZiAoKGxpc3QgPSBkbV9oYXNoX2xvb2t1cChpZHgsIGtleSkpKQorCQlyZXR1cm4gbGlzdDsKKworCWlmICghKGxpc3QgPSBfemFsbG9jKHNpemVvZigqbGlzdCkpKSkgeworCQlsb2dfZXJyb3IoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGxpc3QgZm9yIGRldmljZSBjYWNoZSBpbmRleC4iLCBrZXkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2luaXQobGlzdCk7CisKKwlpZiAoIWRtX2hhc2hfaW5zZXJ0KGlkeCwga2V5LCBsaXN0KSkgeworCQlsb2dfZXJyb3IoIiVzOiBmYWlsZWQgdG8gaW5zZXJ0IGRldmljZSBsaXN0IHRvIGRldmljZSBjYWNoZSBpbmRleC4iLCBrZXkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9pbnNlcnRfc3lzZnNfZGV2KGRldl90IGRldm5vLCBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCXN0YXRpYyBzdHJ1Y3QgZGV2aWNlIF9mYWtlX2RldiA9IHsgLmZsYWdzID0gREVWX1VTRURfRk9SX0xWIH07CisJc3RydWN0IHN0YXQgc3RhdDA7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyICpwYXRoX2NvcHk7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzJXMiLCBfY2FjaGUuZGV2X2RpciwgZGV2bmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiX2luc2VydF9zeXNmc19kZXY6ICVzOiBkbV9zbnByaW50ZiBmYWlsZWQiLCBkZXZuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGxzdGF0KHBhdGgsICZzdGF0MCkgPCAwKSB7CisJCS8qIFdoZW4gZGV2aWNlIG5vZGUgZG9lcyBub3QgZXhpc3QgcmV0dXJuIGZha2UgZW50cnkuCisJCSAqIFRoaXMgbWF5IGhhcHBlbiB3aGVuIGkuZS4gbHZtMiBkZXZpY2UgZGlyICE9IC9kZXYgKi8KKwkJbG9nX2RlYnVnKCIlczogTm90IGF2YWlsYWJsZSBkZXZpY2Ugbm9kZSIsIHBhdGgpOworCQlyZXR1cm4gJl9mYWtlX2RldjsKKwl9CisKKwlpZiAoIShkZXYgPSBfZGV2X2NyZWF0ZShkZXZubykpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHBhdGhfY29weSA9IGRtX3Bvb2xfc3RyZHVwKF9jYWNoZS5tZW0sIHBhdGgpKSkgeworCQlsb2dfZXJyb3IoIl9pbnNlcnRfc3lzZnNfZGV2OiAlczogZG1fcG9vbF9zdHJkdXAgZmFpbGVkIiwgZGV2bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghX2FkZF9hbGlhcyhkZXYsIHBhdGhfY29weSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhZGQgYWxpYXMgdG8gZGV2IGNhY2hlLiIpOworCQlfZnJlZShkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWJ0cmVlX2luc2VydChfY2FjaGUuc3lzZnNfb25seV9kZXZpY2VzLCAodWludDMyX3QpIGRldm5vLCBkZXYpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgYWRkIGRldmljZSB0byBiaW5hcnkgdHJlZSBvZiBzeXNmcy1vbmx5IGRldmljZXMgaW4gZGV2IGNhY2hlLiIpOworCQlfZnJlZShkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSAqX2dldF9kZXZpY2VfZm9yX3N5c2ZzX2Rldl9uYW1lX3VzaW5nX2Rldm5vKGNvbnN0IGNoYXIgKmRldm5hbWUpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJaW50IG1ham9yLCBtaW5vcjsKKwlkZXZfdCBkZXZubzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXNibG9jay8lcy9kZXYiLCBkbV9zeXNmc19kaXIoKSwgZGV2bmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiX2dldF9kZXZpY2VfZm9yX3N5c2ZzX2Rldl9uYW1lX3VzaW5nX2Rldm5vOiAlczogZG1fc25wcmludGYgZmFpbGVkIiwgZGV2bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghX2dldF9zeXNmc192YWx1ZShwYXRoLCBidWYsIHNpemVvZihidWYpLCAxKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkOiVkIiwgJm1ham9yLCAmbWlub3IpICE9IDIpIHsKKwkJbG9nX2Vycm9yKCJfZ2V0X2RldmljZV9mb3Jfc3lzZnNfZGV2X25hbWVfdXNpbmdfZGV2bm86ICVzOiBmYWlsZWQgdG8gZ2V0IG1ham9yIGFuZCBtaW5vciBudW1iZXIiLCBkZXZuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2bm8gPSBNS0RFVigoZGV2X3QpbWFqb3IsIChkZXZfdCltaW5vcik7CisJaWYgKCEoZGV2ID0gKHN0cnVjdCBkZXZpY2UgKikgYnRyZWVfbG9va3VwKF9jYWNoZS5kZXZpY2VzLCAodWludDMyX3QpIGRldm5vKSkpIHsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGhlcmUsIGl0IG1lYW5zIHRoZSBkZXZpY2UgaXMgcmVmZXJlbmNlZCBpbiBzeXNmcywgYnV0IGl0J3Mgbm90IHlldCBpbiAvZGV2LgorCQkgKiBUaGlzIG1heSBoYXBwZW4gaW4gc29tZSByYXJlIGNhc2VzIHJpZ2h0IGFmdGVyIExWcyBnZXQgY3JlYXRlZCAtIHdlIHN5bmMgd2l0aCB1ZGV2CisJCSAqIChvciBhbHRlcm5hdGl2ZWx5IHdlIGNyZWF0ZSAvZGV2IGNvbnRlbnQgb3Vyc2VsdmVzKSB3aGlsZSBWRyBsb2NrIGlzIGhlbGQuIEhvd2V2ZXIsCisJCSAqIGRldiBzY2FuIGlzIGRvbmUgd2l0aG91dCBWRyBsb2NrIHNvIGRldmljZXMgbWF5IGFscmVhZHkgYmUgaW4gc3lzZnMsIGJ1dCAvZGV2IG1heQorCQkgKiBub3QgYmUgdXBkYXRlZCB5ZXQgaWYgd2UgY2FsbCBMVk0gY29tbWFuZCByaWdodCBhZnRlciBMViBjcmVhdGlvbi4gVGhpcyBpcyBub3QgYQorCQkgKiBwcm9ibGVtIHdpdGggZGV2dG1wZnMgYXMgdGhlcmUncyBhdCBsZWFzdCBrZXJuZWwgbmFtZSBmb3IgZGV2aWNlIGluIC9kZXYgYXMgc29vbgorCQkgKiBhcyB0aGUgc3lzZnMgaXRlbSBleGlzdHMsIGJ1dCB3ZSBzdGlsbCBzdXBwb3J0IGVudmlyb25tZW50cyB3aXRob3V0IGRldnRtcGZzIG9yCisJCSAqIHdoZXJlIGRpZmZlcmVudCBkaXJlY3RvcnkgZm9yIGRldiBub2RlcyBpcyB1c2VkIChlLmcuIG91ciB0ZXN0IHN1aXRlKS4gU28gdHJhY2sKKwkJICogc3VjaCBkZXZpY2VzIGluIF9jYWNoZS5zeXNmc19vbmx5X2RldmljZXMgaGFzaCBmb3IgdGhlIHZnaWQvbHZpZCBjaGVjayB0byB3b3JrIHN0aWxsLgorCQkgKi8KKwkJaWYgKCEoZGV2ID0gKHN0cnVjdCBkZXZpY2UgKikgYnRyZWVfbG9va3VwKF9jYWNoZS5zeXNmc19vbmx5X2RldmljZXMsICh1aW50MzJfdCkgZGV2bm8pKSAmJgorCQkgICAgIShkZXYgPSBfaW5zZXJ0X3N5c2ZzX2RldihkZXZubywgZGV2bmFtZSkpKQorCQkJcmV0dXJuX05VTEw7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworI2RlZmluZSBOT1RfTFZNX1VVSUQgIi0iCisKK3N0YXRpYyBpbnQgX2dldF92Z2lkX2FuZF9sdmlkX2Zvcl9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0YXRpYyBzaXplX3QgbHZtX3ByZWZpeF9sZW4gPSBzaXplb2YoVVVJRF9QUkVGSVgpIC0gMTsKKwlzdGF0aWMgc2l6ZV90IGx2bV91dWlkX2xlbiA9IHNpemVvZihVVUlEX1BSRUZJWCkgLSAxICsgMiAqIElEX0xFTjsKKwljaGFyIHV1aWRbRE1fVVVJRF9MRU5dOworCXNpemVfdCB1dWlkX2xlbjsKKworCWlmICghX2dldF9kbV91dWlkX2Zyb21fc3lzZnModXVpZCwgc2l6ZW9mKHV1aWQpLCAoaW50KSBNQUpPUihkZXYtPmRldiksIChpbnQpIE1JTk9SKGRldi0+ZGV2KSkpCisJCXJldHVybl8wOworCisJdXVpZF9sZW4gPSBzdHJsZW4odXVpZCk7CisKKwkvKgorCSAqIFVVSUQgZm9yIExWIGlzIGVpdGhlciAiTFZNLTx2Z191dWlkPjxsdl91dWlkPiIgb3IgIkxWTS08dmdfdXVpZD48bHZfdXVpZD4tPHN1ZmZpeD4iLAorCSAqIHdoZXJlIHZnX3V1aWQgYW5kIGx2X3V1aWQgaGFzIGxlbmd0aCBvZiBJRF9MRU4gYW5kIHN1ZmZpeCBsZW4gaXMgbm90IHJlc3RyaWN0ZWQKKwkgKiAob25seSByZXN0cmljdGVkIGJ5IHdob2xlIERNIFVVSUQgbWF4IGxlbikuCisJICovCisJaWYgKCgodXVpZF9sZW4gPT0gbHZtX3V1aWRfbGVuKSB8fAorCSAgICAgKCh1dWlkX2xlbiA+IGx2bV91dWlkX2xlbikgJiYgKHV1aWRbbHZtX3V1aWRfbGVuXSA9PSAnLScpKSkgJiYKKwkgICAgIXN0cm5jbXAodXVpZCwgVVVJRF9QUkVGSVgsIGx2bV9wcmVmaXhfbGVuKSkgeworCQkvKiBTZXBhcmF0ZSBWR0lEIGFuZCBMVklEIHBhcnQgZnJvbSBETSBVVUlELiAqLworCQlpZiAoIShkZXYtPnZnaWQgPSBkbV9wb29sX3N0cm5kdXAoX2NhY2hlLm1lbSwgdXVpZCArIGx2bV9wcmVmaXhfbGVuLCBJRF9MRU4pKSB8fAorCQkgICAgIShkZXYtPmx2aWQgPSBkbV9wb29sX3N0cm5kdXAoX2NhY2hlLm1lbSwgdXVpZCArIGx2bV9wcmVmaXhfbGVuICsgSURfTEVOLCBJRF9MRU4pKSkKKwkJCXJldHVybl8wOworCX0gZWxzZQorCQlkZXYtPnZnaWQgPSBkZXYtPmx2aWQgPSBOT1RfTFZNX1VVSUQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaW5kZXhfZGV2X2J5X3ZnaWRfYW5kX2x2aWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKmRldm5hbWUgPSBkZXZfbmFtZShkZXYpOworCWNoYXIgZGV2cGF0aFtQQVRIX01BWF07CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZGlyZW50OworCXN0cnVjdCBkZXZpY2UgKmhvbGRlcl9kZXY7CisJc3RydWN0IGRtX2xpc3QgKnZnaWRfbGlzdCwgKmx2aWRfbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRsX3ZnaWQsICpkbF9sdmlkOworCWludCByID0gMDsKKworCWlmIChkZXYtPmZsYWdzICYgREVWX1VTRURfRk9SX0xWKQorCQkvKiBhbHJlYWR5IGluZGV4ZWQgKi8KKwkJcmV0dXJuIDE7CisKKwkvKiBHZXQgaG9sZGVycyBmb3IgZGV2aWNlLiAqLworCWlmIChkbV9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlc2Rldi9ibG9jay8lZDolZC9ob2xkZXJzLyIsIGRtX3N5c2ZzX2RpcigpLCAoaW50KSBNQUpPUihkZXYtPmRldiksIChpbnQpIE1JTk9SKGRldi0+ZGV2KSkgPCAwKSB7CisJCWxvZ19lcnJvcigiJXM6IGRtX3NucHJpbnRmIGZhaWxlZCBmb3IgcGF0aCB0byBob2xkZXJzIGRpcmVjdG9yeS4iLCBkZXZuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZCA9IG9wZW5kaXIocGF0aCkpKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCWxvZ19kZWJ1ZygiJXM6IHBhdGggZG9lcyBub3QgZXhpc3QsIHNraXBwaW5nIiwgcGF0aCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlsb2dfc3lzX2Vycm9yKCJvcGVuZGlyIiwgcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEl0ZXJhdGUgb3ZlciBkZXZpY2UncyBob2xkZXJzIGFuZCBsb29rIGZvciBMVnMuICovCisJd2hpbGUgKChkaXJlbnQgPSByZWFkZGlyKGQpKSkgeworCQlpZiAoIXN0cmNtcCgiLiIsIGRpcmVudC0+ZF9uYW1lKSB8fAorCQkgICAgIXN0cmNtcCgiLi4iLCBkaXJlbnQtPmRfbmFtZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoZG1fc25wcmludGYoZGV2cGF0aCwgc2l6ZW9mKGRldnBhdGgpLCAiJXMlcyIsIF9jYWNoZS5kZXZfZGlyLCBkaXJlbnQtPmRfbmFtZSkgPT0gLTEpIHsKKwkJCWxvZ19lcnJvcigiJXM6IGRtX3NucHJpbnRmIGZhaWxlZCBmb3IgaG9sZGVyICVzIGRldmljZSBwYXRoLiIsIGRldm5hbWUsIGRpcmVudC0+ZF9uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCEoaG9sZGVyX2RldiA9IChzdHJ1Y3QgZGV2aWNlICopIGRtX2hhc2hfbG9va3VwKF9jYWNoZS5uYW1lcywgZGV2cGF0aCkpKSB7CisJCQkvKgorCQkJICogQ29wZSB3aXRoIHNpdHVhdGlvbiB3aGVyZSBjYW5vbmljYWwgLzxkZXZfZGlyPi88ZGlyZW50LT5kX25hbWU+CisJCQkgKiBkb2VzIG5vdCBleGlzdCwgYnV0IHNvbWUgb3RoZXIgbm9kZSBuYW1lIG9yIHN5bWxpbmsgZXhpc3RzIGluCisJCQkgKiBub24tc3RhbmRhcmQgZW52aXJvbm1lbnRzIC0gc29tZW9uZSByZW5hbWluZyB0aGUgbm9kZXMgb3IgdXNpbmcKKwkJCSAqIG1rbm9kIHdpdGggZGlmZmVyZW50IGRldiBuYW1lcyB0aGFuIGFjdHVhbCBrZXJuZWwgbmFtZXMuCisJCQkgKiBUaGlzIGxvb2tzIHVwIHN0cnVjdCBkZXZpY2UgYnkgbWFqb3I6bWlub3IgcGFpciB3aGljaCB3ZSBnZXQKKwkJCSAqIGJ5IGxvb2tpbmcgYXQgL3N5cy9ibG9jay88ZGlyZW50LT5kX25hbWU+L2RldiBzeXNmcyBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCWlmICghKGhvbGRlcl9kZXYgPSBfZ2V0X2RldmljZV9mb3Jfc3lzZnNfZGV2X25hbWVfdXNpbmdfZGV2bm8oZGlyZW50LT5kX25hbWUpKSkgeworCQkJCWxvZ19lcnJvcigiJXM6IGZhaWxlZCB0byBmaW5kIGFzc29jaWF0ZWQgZGV2aWNlIHN0cnVjdHVyZSBmb3IgaG9sZGVyICVzLiIsIGRldm5hbWUsIGRldnBhdGgpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGEgaG9sZGVyIHdoaWNoIGlzIGEgRE0gZGV2aWNlLiAqLworCQlpZiAoIWRtX2lzX2RtX21ham9yKE1BSk9SKGhvbGRlcl9kZXYtPmRldikpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQW5kIGlmIGl0J3MgYSBETSBkZXZpY2UsIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIGhvbGRlciB3aGljaCBpcyBhbiBMVk0gZGV2aWNlLgorCQkgKiBHZXQgdGhlIFZHIFVVSUQgYW5kIExWIFVVSUQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IGFscmVhZHkuCisJCSAqLworCQlpZiAoIWhvbGRlcl9kZXYtPnZnaWQgJiYgIV9nZXRfdmdpZF9hbmRfbHZpZF9mb3JfZGV2KGhvbGRlcl9kZXYpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKCpob2xkZXJfZGV2LT52Z2lkID09ICpOT1RfTFZNX1VVSUQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEbyBub3QgYWRkIGludGVybmFsIExWIGRldmljZXMgdG8gaW5kZXguCisJCSAqIElmIGEgZGV2aWNlIGlzIGludGVybmFsLCB0aGUgaG9sZGVyIGhhcyB0aGUgc2FtZSBWRyBVVUlEIGFzIHRoZSBkZXZpY2UuCisJCSAqLworCQlpZiAoZG1faXNfZG1fbWFqb3IoTUFKT1IoZGV2LT5kZXYpKSkgeworCQkJaWYgKCFkZXYtPnZnaWQgJiYgIV9nZXRfdmdpZF9hbmRfbHZpZF9mb3JfZGV2KGRldikpCisJCQkJZ290b19vdXQ7CisKKwkJCWlmICgqZGV2LT52Z2lkICE9ICpOT1RfTFZNX1VVSUQgJiYgIXN0cmNtcChob2xkZXJfZGV2LT52Z2lkLCBkZXYtPnZnaWQpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEodmdpZF9saXN0ID0gX2dldF9vcl9hZGRfbGlzdF9ieV9pbmRleF9rZXkoX2NhY2hlLnZnaWRfaW5kZXgsIGhvbGRlcl9kZXYtPnZnaWQpKSB8fAorCQkgICAgIShsdmlkX2xpc3QgPSBfZ2V0X29yX2FkZF9saXN0X2J5X2luZGV4X2tleShfY2FjaGUubHZpZF9pbmRleCwgaG9sZGVyX2Rldi0+bHZpZCkpKQorCQkJZ290b19vdXQ7CisKKwkJLyogQ3JlYXRlIGRldiBsaXN0IGl0ZW1zIGZvciB0aGUgaG9sZGVyIGRldmljZS4gKi8KKwkJaWYgKCEoZGxfdmdpZCA9IF96YWxsb2Moc2l6ZW9mKCpkbF92Z2lkKSkpIHx8CisJCSAgICAhKGRsX2x2aWQgPSBfemFsbG9jKHNpemVvZigqZGxfbHZpZCkpKSkgeworCQkJbG9nX2Vycm9yKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGRldiBsaXN0IGl0ZW0uIiwgZGV2bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRsX3ZnaWQtPmRldiA9IGRsX2x2aWQtPmRldiA9IGRldjsKKworCQkvKiBBZGQgZGV2IGxpc3QgaXRlbSB0byBWR0lEIGRldmljZSBsaXN0IGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHkuICovCisJCWlmICghKGRldi0+ZmxhZ3MgJiBERVZfVVNFRF9GT1JfTFYpKQorCQkJZG1fbGlzdF9hZGQodmdpZF9saXN0LCAmZGxfdmdpZC0+bGlzdCk7CisKKwkJLyogQWRkIGRldiBsaXN0IGl0ZW0gdG8gTFZJRCBkZXZpY2UgbGlzdC4gKi8KKwkJZG1fbGlzdF9hZGQobHZpZF9saXN0LCAmZGxfbHZpZC0+bGlzdCk7CisKKwkJLyogTWFyayBkZXZpY2UgYXMgdXNlZCA9PSBhbHNvIGluZGV4ZWQgaW4gZGV2IGNhY2hlIGJ5IFZHSUQgYW5kIExWSUQuICovCisJCWRldi0+ZmxhZ3MgfD0gREVWX1VTRURfRk9SX0xWOworCX0KKworCXIgPSAxOworb3V0OgorCWlmIChjbG9zZWRpcihkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2VkaXIiLCBwYXRoKTsKKworCXJldHVybiByOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqZGV2X2NhY2hlX2dldF9kZXZfbGlzdF9mb3JfdmdpZChjb25zdCBjaGFyICp2Z2lkKQoreworCXJldHVybiBkbV9oYXNoX2xvb2t1cChfY2FjaGUudmdpZF9pbmRleCwgdmdpZCk7Cit9CisKK3N0cnVjdCBkbV9saXN0ICpkZXZfY2FjaGVfZ2V0X2Rldl9saXN0X2Zvcl9sdmlkKGNvbnN0IGNoYXIgKmx2aWQpCit7CisJcmV0dXJuIGRtX2hhc2hfbG9va3VwKF9jYWNoZS5sdmlkX2luZGV4LCBsdmlkKTsKK30KKworLyoKKyAqIEVpdGhlciBjcmVhdGVzIGEgbmV3IGRldiwgb3IgYWRkcyBhbiBhbGlhcyB0bworICogYW4gZXhpc3RpbmcgZGV2LgorICovCitzdGF0aWMgaW50IF9pbnNlcnRfZGV2KGNvbnN0IGNoYXIgKnBhdGgsIGRldl90IGQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0YXRpYyBkZXZfdCBsb29wZmlsZV9jb3VudCA9IDA7CisJaW50IGxvb3BmaWxlID0gMDsKKwljaGFyICpwYXRoX2NvcHk7CisKKwkvKiBHZW5lcmF0ZSBwcmV0ZW5kIGRldmljZSBudW1iZXJzIGZvciBsb29wZmlsZXMgKi8KKwlpZiAoIWQpIHsKKwkJaWYgKGRtX2hhc2hfbG9va3VwKF9jYWNoZS5uYW1lcywgcGF0aCkpCisJCQlyZXR1cm4gMTsKKwkJZCA9ICsrbG9vcGZpbGVfY291bnQ7CisJCWxvb3BmaWxlID0gMTsKKwl9CisKKwkvKiBpcyB0aGlzIGRldmljZSBhbHJlYWR5IHJlZ2lzdGVyZWQgPyAqLworCWlmICghKGRldiA9IChzdHJ1Y3QgZGV2aWNlICopIGJ0cmVlX2xvb2t1cChfY2FjaGUuZGV2aWNlcywgKHVpbnQzMl90KSBkKSkpIHsKKwkJaWYgKCEoZGV2ID0gKHN0cnVjdCBkZXZpY2UgKikgYnRyZWVfbG9va3VwKF9jYWNoZS5zeXNmc19vbmx5X2RldmljZXMsICh1aW50MzJfdCkgZCkpKSB7CisJCQkvKiBjcmVhdGUgbmV3IGRldmljZSAqLworCQkJaWYgKGxvb3BmaWxlKSB7CisJCQkJaWYgKCEoZGV2ID0gZGV2X2NyZWF0ZV9maWxlKHBhdGgsIE5VTEwsIE5VTEwsIDApKSkKKwkJCQkJcmV0dXJuXzA7CisJCQl9IGVsc2UgaWYgKCEoZGV2ID0gX2Rldl9jcmVhdGUoZCkpKQorCQkJCXJldHVybl8wOworCQl9CisKKwkJaWYgKCEoYnRyZWVfaW5zZXJ0KF9jYWNoZS5kZXZpY2VzLCAodWludDMyX3QpIGQsIGRldikpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGluc2VydCBkZXZpY2UgaW50byBiaW5hcnkgdHJlZS4iKTsKKwkJCV9mcmVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghKHBhdGhfY29weSA9IGRtX3Bvb2xfc3RyZHVwKF9jYWNoZS5tZW0sIHBhdGgpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgcGF0aCBzdHJpbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghbG9vcGZpbGUgJiYgIV9hZGRfYWxpYXMoZGV2LCBwYXRoX2NvcHkpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgYWRkIGFsaWFzIHRvIGRldiBjYWNoZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9oYXNoX2luc2VydChfY2FjaGUubmFtZXMsIHBhdGhfY29weSwgZGV2KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGFkZCBuYW1lIHRvIGhhc2ggaW4gZGV2IGNhY2hlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKl9qb2luKGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKGRpcikgKyBzdHJsZW4obmFtZSkgKyAyOworCWNoYXIgKnIgPSBkbV9tYWxsb2MobGVuKTsKKwlpZiAocikKKwkJc25wcmludGYociwgbGVuLCAiJXMvJXMiLCBkaXIsIG5hbWUpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBHZXQgcmlkIG9mIGV4dHJhIHNsYXNoZXMgaW4gdGhlIHBhdGggc3RyaW5nLgorICovCitzdGF0aWMgdm9pZCBfY29sbGFwc2Vfc2xhc2hlcyhjaGFyICpzdHIpCit7CisJY2hhciAqcHRyOworCWludCB3YXNfc2xhc2ggPSAwOworCisJZm9yIChwdHIgPSBzdHI7ICpwdHI7IHB0cisrKSB7CisJCWlmICgqcHRyID09ICcvJykgeworCQkJaWYgKHdhc19zbGFzaCkKKwkJCQljb250aW51ZTsKKworCQkJd2FzX3NsYXNoID0gMTsKKwkJfSBlbHNlCisJCQl3YXNfc2xhc2ggPSAwOworCQkqc3RyKysgPSAqcHRyOworCX0KKworCSpzdHIgPSAqcHRyOworfQorCitzdGF0aWMgaW50IF9pbnNlcnRfZGlyKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlpbnQgbiwgZGlyZW50X2NvdW50LCByID0gMTsKKwlzdHJ1Y3QgZGlyZW50ICoqZGlyZW50OworCWNoYXIgKnBhdGg7CisKKwlkaXJlbnRfY291bnQgPSBzY2FuZGlyKGRpciwgJmRpcmVudCwgTlVMTCwgYWxwaGFzb3J0KTsKKwlpZiAoZGlyZW50X2NvdW50ID4gMCkgeworCQlmb3IgKG4gPSAwOyBuIDwgZGlyZW50X2NvdW50OyBuKyspIHsKKwkJCWlmIChkaXJlbnRbbl0tPmRfbmFtZVswXSA9PSAnLicpIHsKKwkJCQlmcmVlKGRpcmVudFtuXSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghKHBhdGggPSBfam9pbihkaXIsIGRpcmVudFtuXS0+ZF9uYW1lKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCV9jb2xsYXBzZV9zbGFzaGVzKHBhdGgpOworCQkJciAmPSBfaW5zZXJ0KHBhdGgsIE5VTEwsIDEsIDApOworCQkJZG1fZnJlZShwYXRoKTsKKworCQkJZnJlZShkaXJlbnRbbl0pOworCQl9CisJCWZyZWUoZGlyZW50KTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfaW5zZXJ0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKHN0YXQocGF0aCwgJmluZm8pIDwgMCkgeworCQlsb2dfc3lzX3ZlcnlfdmVyYm9zZSgic3RhdCIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVNfSVNSRUcoaW5mby5zdF9tb2RlKSkgeworCQlsb2dfZGVidWdfZGV2cygiJXM6IE5vdCBhIHJlZ3VsYXIgZmlsZSIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9pbnNlcnRfZGV2KHBhdGgsIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kZXZfY2FjaGVfaXRlcmF0ZV9kZXZzX2Zvcl9pbmRleCh2b2lkKQoreworCXN0cnVjdCBidHJlZV9pdGVyICppdGVyID0gYnRyZWVfZmlyc3QoX2NhY2hlLmRldmljZXMpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgciA9IDE7CisKKwl3aGlsZSAoaXRlcikgeworCQlkZXYgPSBidHJlZV9nZXRfZGF0YShpdGVyKTsKKworCQlpZiAoIV9pbmRleF9kZXZfYnlfdmdpZF9hbmRfbHZpZChkZXYpKQorCQkJciA9IDA7CisKKwkJaXRlciA9IGJ0cmVlX25leHQoaXRlcik7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2Rldl9jYWNoZV9pdGVyYXRlX3N5c2ZzX2Zvcl9pbmRleChjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgZGV2bmFtZVtQQVRIX01BWF07CisJRElSICpkOworCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwlpbnQgbWFqb3IsIG1pbm9yOworCWRldl90IGRldm5vOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgcGFydGlhbF9mYWlsdXJlID0gMDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShkID0gb3BlbmRpcihwYXRoKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbmRpciIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZCkpKSB7CisJCWlmICghc3RyY21wKCIuIiwgZGlyZW50LT5kX25hbWUpIHx8CisJCSAgICAhc3RyY21wKCIuLiIsIGRpcmVudC0+ZF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzc2NhbmYoZGlyZW50LT5kX25hbWUsICIlZDolZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisJCQlsb2dfZXJyb3IoIl9kZXZfY2FjaGVfaXRlcmF0ZV9zeXNmc19mb3JfaW5kZXg6ICVzOiBmYWlsZWQgIgorCQkJCSAgInRvIGdldCBtYWpvciBhbmQgbWlub3IgbnVtYmVyIiwgZGlyZW50LT5kX25hbWUpOworCQkJcGFydGlhbF9mYWlsdXJlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGV2bm8gPSBNS0RFVigoZGV2X3QpbWFqb3IsIChkZXZfdCltaW5vcik7CisJCWlmICghKGRldiA9IChzdHJ1Y3QgZGV2aWNlICopIGJ0cmVlX2xvb2t1cChfY2FjaGUuZGV2aWNlcywgKHVpbnQzMl90KSBkZXZubykpICYmCisJCSAgICAhKGRldiA9IChzdHJ1Y3QgZGV2aWNlICopIGJ0cmVlX2xvb2t1cChfY2FjaGUuc3lzZnNfb25seV9kZXZpY2VzLCAodWludDMyX3QpIGRldm5vKSkpIHsKKwkJCWlmICghZG1fZGV2aWNlX2dldF9uYW1lKG1ham9yLCBtaW5vciwgMSwgZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpKSB8fAorCQkJICAgICEoZGV2ID0gX2luc2VydF9zeXNmc19kZXYoZGV2bm8sIGRldm5hbWUpKSkgeworCQkJCXBhcnRpYWxfZmFpbHVyZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoIV9pbmRleF9kZXZfYnlfdmdpZF9hbmRfbHZpZChkZXYpKQorCQkJcGFydGlhbF9mYWlsdXJlID0gMTsKKwl9CisKKwlyID0gIXBhcnRpYWxfZmFpbHVyZTsKKworCWlmIChjbG9zZWRpcihkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2VkaXIiLCBwYXRoKTsKKworCXJldHVybiByOworfQorCitpbnQgZGV2X2NhY2hlX2luZGV4X2RldnModm9pZCkKK3sKKwlzdGF0aWMgaW50IHN5c2ZzX2hhc19kZXZfYmxvY2sgPSAtMTsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzZGV2L2Jsb2NrIiwgZG1fc3lzZnNfZGlyKCkpIDwgMCkgeworCQlsb2dfZXJyb3IoImRldl9jYWNoZV9pbmRleF9kZXZzOiBkbV9zbnByaW50ZiBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFNraXAgaW5kZXhpbmcgaWYgL3N5cy9kZXYvYmxvY2sgaXMgbm90IGF2YWlsYWJsZS4qLworCWlmIChzeXNmc19oYXNfZGV2X2Jsb2NrID09IC0xKSB7CisJCXN0cnVjdCBzdGF0IGluZm87CisJCWlmIChzdGF0KHBhdGgsICZpbmZvKSA9PSAwKQorCQkJc3lzZnNfaGFzX2Rldl9ibG9jayA9IDE7CisJCWVsc2UgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJCXN5c2ZzX2hhc19kZXZfYmxvY2sgPSAwOworCQkJCXJldHVybiAxOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgcGF0aCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKCFzeXNmc19oYXNfZGV2X2Jsb2NrKQorCQlyZXR1cm4gMTsKKworCWlmIChvYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2KCkgJiYKKwkgICAgdWRldl9nZXRfbGlicmFyeV9jb250ZXh0KCkpCisJCXJldHVybiBfZGV2X2NhY2hlX2l0ZXJhdGVfZGV2c19mb3JfaW5kZXgoKTsgIC8qIHdpdGggdWRldiAqLworCisJcmV0dXJuIF9kZXZfY2FjaGVfaXRlcmF0ZV9zeXNmc19mb3JfaW5kZXgocGF0aCk7Cit9CisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorCitzdGF0aWMgaW50IF9kZXZpY2VfaW5fdWRldl9kYihjb25zdCBkZXZfdCBkKQoreworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqdWRldl9kZXZpY2U7CisKKwlpZiAoISh1ZGV2ID0gdWRldl9nZXRfbGlicmFyeV9jb250ZXh0KCkpKQorCQlyZXR1cm5fMDsKKworCWlmICgodWRldl9kZXZpY2UgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9kZXZudW0odWRldiwgJ2InLCBkKSkpIHsKKwkJdWRldl9kZXZpY2VfdW5yZWYodWRldl9kZXZpY2UpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfaW5zZXJ0X3VkZXZfZGlyKHN0cnVjdCB1ZGV2ICp1ZGV2LCBjb25zdCBjaGFyICpkaXIpCit7CisJc3RydWN0IHVkZXZfZW51bWVyYXRlICp1ZGV2X2VudW0gPSBOVUxMOworCXN0cnVjdCB1ZGV2X2xpc3RfZW50cnkgKmRldmljZV9lbnRyeSwgKnN5bWxpbmtfZW50cnk7CisJY29uc3QgY2hhciAqZW50cnlfbmFtZSwgKm5vZGVfbmFtZSwgKnN5bWxpbmtfbmFtZTsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldmljZTsKKwlpbnQgciA9IDE7CisKKwlpZiAoISh1ZGV2X2VudW0gPSB1ZGV2X2VudW1lcmF0ZV9uZXcodWRldikpKQorCQlnb3RvIGJhZDsKKworCWlmICh1ZGV2X2VudW1lcmF0ZV9hZGRfbWF0Y2hfc3Vic3lzdGVtKHVkZXZfZW51bSwgImJsb2NrIikgfHwKKwkgICAgdWRldl9lbnVtZXJhdGVfc2Nhbl9kZXZpY2VzKHVkZXZfZW51bSkpCisJCWdvdG8gYmFkOworCisJLyoKKwkgKiBSZXBvcnQgYW55IG1pc3NpbmcgaW5mb3JtYXRpb24gYXMgImxvZ192ZXJ5X3ZlcmJvc2UiIG9ubHksIGRvIG5vdAorCSAqIHJlcG9ydCBpdCBhcyBhICJ3YXJuaW5nIiBvciAiZXJyb3IiIC0gdGhlIHJlY29yZCBjb3VsZCBiZSByZW1vdmVkCisJICogYnkgdGhlIHRpbWUgd2UgYXNrIGZvciBtb3JlIGluZm8gKG5vZGUgbmFtZSwgc3ltbGluayBuYW1lLi4uKS4KKwkgKiBXaGF0ZXZlciByZW1vdmVzICphbnkqIGJsb2NrIGRldmljZSBpbiB0aGUgc3lzdGVtIChldmVuIHVucmVsYXRlZAorCSAqIHRvIG91ciBvcGVyYXRpb24pLCB3ZSB3b3VsZCBoYXZlIGEgd2FybmluZy9lcnJvciBvbiBvdXRwdXQgdGhlbi4KKwkgKiBUaGF0IGNvdWxkIGJlIG1pc2xlYWRpbmcuIElmIHRoZXJlJ3MgcmVhbGx5IGFueSBwcm9ibGVtIHdpdGggbWlzc2luZworCSAqIGluZm9ybWF0aW9uIGZyb20gdWRldiBkYiwgd2UgY2FuIHN0aWxsIGhhdmUgYSBsb29rIGF0IHRoZSB2ZXJib3NlIGxvZy4KKwkgKi8KKwl1ZGV2X2xpc3RfZW50cnlfZm9yZWFjaChkZXZpY2VfZW50cnksIHVkZXZfZW51bWVyYXRlX2dldF9saXN0X2VudHJ5KHVkZXZfZW51bSkpIHsKKwkJZW50cnlfbmFtZSA9IHVkZXZfbGlzdF9lbnRyeV9nZXRfbmFtZShkZXZpY2VfZW50cnkpOworCisJCWlmICghKGRldmljZSA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N5c3BhdGgodWRldiwgZW50cnlfbmFtZSkpKSB7CisJCQlsb2dfdmVyeV92ZXJib3NlKCJ1ZGV2IGZhaWxlZCB0byByZXR1cm4gYSBkZXZpY2UgZm9yIGVudHJ5ICVzLiIsCisJCQkJCSBlbnRyeV9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEobm9kZV9uYW1lID0gdWRldl9kZXZpY2VfZ2V0X2Rldm5vZGUoZGV2aWNlKSkpCisJCQlsb2dfdmVyeV92ZXJib3NlKCJ1ZGV2IGZhaWxlZCB0byByZXR1cm4gYSBkZXZpY2Ugbm9kZSBmb3IgZW50cnkgJXMuIiwKKwkJCQkJIGVudHJ5X25hbWUpOworCQllbHNlCisJCQlyICY9IF9pbnNlcnQobm9kZV9uYW1lLCBOVUxMLCAwLCAwKTsKKworCQl1ZGV2X2xpc3RfZW50cnlfZm9yZWFjaChzeW1saW5rX2VudHJ5LCB1ZGV2X2RldmljZV9nZXRfZGV2bGlua3NfbGlzdF9lbnRyeShkZXZpY2UpKSB7CisJCQlpZiAoIShzeW1saW5rX25hbWUgPSB1ZGV2X2xpc3RfZW50cnlfZ2V0X25hbWUoc3ltbGlua19lbnRyeSkpKQorCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoInVkZXYgZmFpbGVkIHRvIHJldHVybiBhIHN5bWxpbmsgbmFtZSBmb3IgZW50cnkgJXMuIiwKKwkJCQkJCSBlbnRyeV9uYW1lKTsKKwkJCWVsc2UKKwkJCQlyICY9IF9pbnNlcnQoc3ltbGlua19uYW1lLCBOVUxMLCAwLCAwKTsKKwkJfQorCisJCXVkZXZfZGV2aWNlX3VucmVmKGRldmljZSk7CisJfQorCisJdWRldl9lbnVtZXJhdGVfdW5yZWYodWRldl9lbnVtKTsKKwlyZXR1cm4gcjsKKworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIGVudW1lcmF0ZSB1ZGV2IGRldmljZSBsaXN0LiIpOworCXVkZXZfZW51bWVyYXRlX3VucmVmKHVkZXZfZW51bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9pbnNlcnRfZGlycyhzdHJ1Y3QgZG1fbGlzdCAqZGlycykKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRsOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCWludCB3aXRoX3VkZXY7CisKKwl3aXRoX3VkZXYgPSBvYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2KCkgJiYKKwkJICAgICh1ZGV2ID0gdWRldl9nZXRfbGlicmFyeV9jb250ZXh0KCkpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCAmX2NhY2hlLmRpcnMpIHsKKwkJaWYgKHdpdGhfdWRldikgeworCQkJaWYgKCFfaW5zZXJ0X3VkZXZfZGlyKHVkZXYsIGRsLT5kaXIpKQorCQkJCWxvZ19kZWJ1Z19kZXZzKCIlczogRmFpbGVkIHRvIGluc2VydCBkZXZpY2VzIGZyb20gIgorCQkJCQkgICAgICAgInVkZXYtbWFuYWdlZCBkaXJlY3RvcnkgdG8gZGV2aWNlICIKKwkJCQkJICAgICAgICJjYWNoZSBmdWxseSIsIGRsLT5kaXIpOworCQl9CisJCWVsc2UgaWYgKCFfaW5zZXJ0X2RpcihkbC0+ZGlyKSkKKwkJCWxvZ19kZWJ1Z19kZXZzKCIlczogRmFpbGVkIHRvIGluc2VydCBkZXZpY2VzIHRvICIKKwkJCQkgICAgICAgImRldmljZSBjYWNoZSBmdWxseSIsIGRsLT5kaXIpOworCX0KK30KKworI2Vsc2UJLyogVURFVl9TWU5DX1NVUFBPUlQgKi8KKworc3RhdGljIGludCBfZGV2aWNlX2luX3VkZXZfZGIoY29uc3QgZGV2X3QgZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2luc2VydF9kaXJzKHN0cnVjdCBkbV9saXN0ICpkaXJzKQoreworCXN0cnVjdCBkaXJfbGlzdCAqZGw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsICZfY2FjaGUuZGlycykKKwkJX2luc2VydF9kaXIoZGwtPmRpcik7Cit9CisKKyNlbmRpZgkvKiBVREVWX1NZTkNfU1VQUE9SVCAqLworCitzdGF0aWMgaW50IF9pbnNlcnQoY29uc3QgY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IHN0YXQgKmluZm8sCisJCSAgIGludCByZWMsIGludCBjaGVja193aXRoX3VkZXZfZGIpCit7CisJc3RydWN0IHN0YXQgdGluZm87CisKKwlpZiAoIWluZm8pIHsKKwkJaWYgKHN0YXQocGF0aCwgJnRpbmZvKSA8IDApIHsKKwkJCWxvZ19zeXNfdmVyeV92ZXJib3NlKCJzdGF0IiwgcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpbmZvID0gJnRpbmZvOworCX0KKworCWlmIChjaGVja193aXRoX3VkZXZfZGIgJiYgIV9kZXZpY2VfaW5fdWRldl9kYihpbmZvLT5zdF9yZGV2KSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCIlczogTm90IGluIHVkZXYgZGIiLCBwYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKFNfSVNESVIoaW5mby0+c3RfbW9kZSkpIHsJLyogYWRkIGEgZGlyZWN0b3J5ICovCisJCS8qIGNoZWNrIGl0J3Mgbm90IGEgc3ltYm9saWMgbGluayAqLworCQlpZiAobHN0YXQocGF0aCwgJnRpbmZvKSA8IDApIHsKKwkJCWxvZ19zeXNfdmVyeV92ZXJib3NlKCJsc3RhdCIsIHBhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoU19JU0xOSyh0aW5mby5zdF9tb2RlKSkgeworCQkJbG9nX2RlYnVnX2RldnMoIiVzOiBTeW1ib2xpYyBsaW5rIHRvIGRpcmVjdG9yeSIsIHBhdGgpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAocmVjICYmICFfaW5zZXJ0X2RpcihwYXRoKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CQkvKiBhZGQgYSBkZXZpY2UgKi8KKwkJaWYgKCFTX0lTQkxLKGluZm8tPnN0X21vZGUpKSB7CisJCQlsb2dfZGVidWdfZGV2cygiJXM6IE5vdCBhIGJsb2NrIGRldmljZSIsIHBhdGgpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoIV9pbnNlcnRfZGV2KHBhdGgsIGluZm8tPnN0X3JkZXYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9mdWxsX3NjYW4oaW50IGRldl9zY2FuKQoreworCXN0cnVjdCBkaXJfbGlzdCAqZGw7CisKKwlpZiAoX2NhY2hlLmhhc19zY2FubmVkICYmICFkZXZfc2NhbikKKwkJcmV0dXJuOworCisJX2luc2VydF9kaXJzKCZfY2FjaGUuZGlycyk7CisKKwkodm9pZCkgZGV2X2NhY2hlX2luZGV4X2RldnMoKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkbCwgJl9jYWNoZS5maWxlcykKKwkJX2luc2VydF9maWxlKGRsLT5kaXIpOworCisJX2NhY2hlLmhhc19zY2FubmVkID0gMTsKKwlpbml0X2Z1bGxfc2Nhbl9kb25lKDEpOworfQorCitpbnQgZGV2X2NhY2hlX2hhc19zY2FubmVkKHZvaWQpCit7CisJcmV0dXJuIF9jYWNoZS5oYXNfc2Nhbm5lZDsKK30KKwordm9pZCBkZXZfY2FjaGVfc2NhbihpbnQgZG9fc2NhbikKK3sKKwlpZiAoIWRvX3NjYW4pCisJCV9jYWNoZS5oYXNfc2Nhbm5lZCA9IDE7CisJZWxzZQorCQlfZnVsbF9zY2FuKDEpOworfQorCitzdGF0aWMgaW50IF9pbml0X3ByZWZlcnJlZF9uYW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnY7CisJc3RydWN0IGRtX3Bvb2wgKnNjcmF0Y2ggPSBOVUxMOworCWNvbnN0IGNoYXIgKipyZWdleDsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisJaW50IGksIHIgPSAwOworCisJX2NhY2hlLnByZWZlcnJlZF9uYW1lc19tYXRjaGVyID0gTlVMTDsKKworCWlmICghKGNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGRldmljZXNfcHJlZmVycmVkX25hbWVzX0NGRywgTlVMTCkpIHx8CisJICAgIGNuLT52LT50eXBlID09IERNX0NGR19FTVBUWV9BUlJBWSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJkZXZpY2VzL3ByZWZlcnJlZF9uYW1lcyAlczogIgorCQkJCSAidXNpbmcgYnVpbHQtaW4gcHJlZmVyZW5jZXMiLAorCQkJCSBjbiAmJiBjbi0+di0+dHlwZSA9PSBETV9DRkdfRU1QVFlfQVJSQVkgPyAiaXMgZW1wdHkiCisJCQkJCQkJCQkgOiAibm90IGZvdW5kIGluIGNvbmZpZyIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKHYgPSBjbi0+djsgdjsgdiA9IHYtPm5leHQpIHsKKwkJaWYgKHYtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJbG9nX2Vycm9yKCJwcmVmZXJyZWRfbmFtZXMgcGF0dGVybnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBxdW90ZXMiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoIShzY3JhdGNoID0gZG1fcG9vbF9jcmVhdGUoInByZWZlcnJlZCBkZXZpY2UgbmFtZSBtYXRjaGVyIiwgMTAyNCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlZ2V4ID0gZG1fcG9vbF9hbGxvYyhzY3JhdGNoLCBzaXplb2YoKnJlZ2V4KSAqIGNvdW50KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgcHJlZmVycmVkIGRldmljZSBuYW1lICIKKwkJCSAgInBhdHRlcm4gbGlzdC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yICh2ID0gY24tPnYsIGkgPSBjb3VudCAtIDE7IHY7IHYgPSB2LT5uZXh0LCBpLS0pIHsKKwkJaWYgKCEocmVnZXhbaV0gPSBkbV9wb29sX3N0cmR1cChzY3JhdGNoLCB2LT52LnN0cikpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIHByZWZlcnJlZCBkZXZpY2UgbmFtZSAiCisJCQkJICAicGF0dGVybi4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCEoX2NhY2hlLnByZWZlcnJlZF9uYW1lc19tYXRjaGVyID0KKwkJZG1fcmVnZXhfY3JlYXRlKF9jYWNoZS5tZW0sIHJlZ2V4LCBjb3VudCkpKSB7CisJCWxvZ19lcnJvcigiUHJlZmVycmVkIGRldmljZSBuYW1lIHBhdHRlcm4gbWF0Y2hlciBjcmVhdGlvbiBmYWlsZWQuIik7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSAxOworCitvdXQ6CisJZG1fcG9vbF9kZXN0cm95KHNjcmF0Y2gpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkZXZfY2FjaGVfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlfY2FjaGUubmFtZXMgPSBOVUxMOworCV9jYWNoZS5oYXNfc2Nhbm5lZCA9IDA7CisKKwlpZiAoIShfY2FjaGUubWVtID0gZG1fcG9vbF9jcmVhdGUoImRldl9jYWNoZSIsIDEwICogMTAyNCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKF9jYWNoZS5uYW1lcyA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpIHx8CisJICAgICEoX2NhY2hlLnZnaWRfaW5kZXggPSBkbV9oYXNoX2NyZWF0ZSgzMikpIHx8CisJICAgICEoX2NhY2hlLmx2aWRfaW5kZXggPSBkbV9oYXNoX2NyZWF0ZSgzMikpKSB7CisJCWRtX3Bvb2xfZGVzdHJveShfY2FjaGUubWVtKTsKKwkJX2NhY2hlLm1lbSA9IDA7CisJCXJldHVybl8wOworCX0KKworCWlmICghKF9jYWNoZS5kZXZpY2VzID0gYnRyZWVfY3JlYXRlKF9jYWNoZS5tZW0pKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBiaW5hcnkgdHJlZSBmb3IgZGV2LWNhY2hlLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIShfY2FjaGUuc3lzZnNfb25seV9kZXZpY2VzID0gYnRyZWVfY3JlYXRlKF9jYWNoZS5tZW0pKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBiaW5hcnkgdHJlZSBmb3Igc3lzZnMtb25seSBkZXZpY2VzIGluIGRldiBjYWNoZS4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCEoX2NhY2hlLmRldl9kaXIgPSBfc3RyZHVwKGNtZC0+ZGV2X2RpcikpKSB7CisJCWxvZ19lcnJvcigic3RyZHVwIGRldl9kaXIgZmFpbGVkLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlkbV9saXN0X2luaXQoJl9jYWNoZS5kaXJzKTsKKwlkbV9saXN0X2luaXQoJl9jYWNoZS5maWxlcyk7CisKKwlpZiAoIV9pbml0X3ByZWZlcnJlZF9uYW1lcyhjbWQpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiAxOworCisgICAgICBiYWQ6CisJZGV2X2NhY2hlX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGRldmljZXMgc3RpbGwgb3Blbi4KKyAqLworc3RhdGljIGludCBfY2hlY2tfZm9yX29wZW5fZGV2aWNlcyhpbnQgY2xvc2VfaW1tZWRpYXRlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuOworCWludCBudW1fb3BlbiA9IDA7CisKKwlkbV9oYXNoX2l0ZXJhdGUobiwgX2NhY2hlLm5hbWVzKSB7CisJCWRldiA9IChzdHJ1Y3QgZGV2aWNlICopIGRtX2hhc2hfZ2V0X2RhdGEoX2NhY2hlLm5hbWVzLCBuKTsKKwkJaWYgKGRldi0+ZmQgPj0gMCkgeworCQkJbG9nX2Vycm9yKCJEZXZpY2UgJyVzJyBoYXMgYmVlbiBsZWZ0IG9wZW4gKCVkIHJlbWFpbmluZyByZWZlcmVuY2VzKS4iLAorCQkJCSAgZGV2X25hbWUoZGV2KSwgZGV2LT5vcGVuX2NvdW50KTsKKwkJCW51bV9vcGVuKys7CisJCQlpZiAoY2xvc2VfaW1tZWRpYXRlKQorCQkJCWRldl9jbG9zZV9pbW1lZGlhdGUoZGV2KTsKKwkJfQorCX0KKworCXJldHVybiBudW1fb3BlbjsKK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGRldmljZXMgbGVmdCBvcGVuLgorICovCitpbnQgZGV2X2NhY2hlX2NoZWNrX2Zvcl9vcGVuX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gX2NoZWNrX2Zvcl9vcGVuX2RldmljZXMoMCk7Cit9CisKK2ludCBkZXZfY2FjaGVfZXhpdCh2b2lkKQoreworCWludCBudW1fb3BlbiA9IDA7CisKKwlpZiAoX2NhY2hlLm5hbWVzKQorCQlpZiAoKG51bV9vcGVuID0gX2NoZWNrX2Zvcl9vcGVuX2RldmljZXMoMSkpID4gMCkKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJWQgZGV2aWNlKHMpIHdlcmUgbGVmdCBvcGVuIGFuZCBoYXZlIGJlZW4gY2xvc2VkLiIsIG51bV9vcGVuKTsKKworCWlmIChfY2FjaGUubWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koX2NhY2hlLm1lbSk7CisKKwlpZiAoX2NhY2hlLm5hbWVzKQorCQlkbV9oYXNoX2Rlc3Ryb3koX2NhY2hlLm5hbWVzKTsKKworCWlmIChfY2FjaGUudmdpZF9pbmRleCkKKwkJZG1faGFzaF9kZXN0cm95KF9jYWNoZS52Z2lkX2luZGV4KTsKKworCWlmIChfY2FjaGUubHZpZF9pbmRleCkKKwkJZG1faGFzaF9kZXN0cm95KF9jYWNoZS5sdmlkX2luZGV4KTsKKworCW1lbXNldCgmX2NhY2hlLCAwLCBzaXplb2YoX2NhY2hlKSk7CisKKwlyZXR1cm4gKCFudW1fb3Blbik7Cit9CisKK2ludCBkZXZfY2FjaGVfYWRkX2Rpcihjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkaXJfbGlzdCAqZGw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChwYXRoLCAmc3QpKSB7CisJCWxvZ193YXJuKCJJZ25vcmluZyAlczogJXMuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogQnV0IGRvbid0IGZhaWwgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWxvZ193YXJuKCJJZ25vcmluZyAlczogTm90IGEgZGlyZWN0b3J5LiIsIHBhdGgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShkbCA9IF96YWxsb2Moc2l6ZW9mKCpkbCkgKyBzdHJsZW4ocGF0aCkgKyAxKSkpIHsKKwkJbG9nX2Vycm9yKCJkaXJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdHJjcHkoZGwtPmRpciwgcGF0aCk7CisJZG1fbGlzdF9hZGQoJl9jYWNoZS5kaXJzLCAmZGwtPmxpc3QpOworCXJldHVybiAxOworfQorCitpbnQgZGV2X2NhY2hlX2FkZF9sb29wZmlsZShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkaXJfbGlzdCAqZGw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChwYXRoLCAmc3QpKSB7CisJCWxvZ193YXJuKCJJZ25vcmluZyAlczogJXMuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogQnV0IGRvbid0IGZhaWwgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCWxvZ193YXJuKCJJZ25vcmluZyAlczogTm90IGEgcmVndWxhciBmaWxlLiIsIHBhdGgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShkbCA9IF96YWxsb2Moc2l6ZW9mKCpkbCkgKyBzdHJsZW4ocGF0aCkgKyAxKSkpIHsKKwkJbG9nX2Vycm9yKCJkaXJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgZmlsZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdHJjcHkoZGwtPmRpciwgcGF0aCk7CisJZG1fbGlzdF9hZGQoJl9jYWNoZS5maWxlcywgJmRsLT5saXN0KTsKKwlyZXR1cm4gMTsKK30KKworLyogQ2hlY2sgY2FjaGVkIGRldmljZSBuYW1lIGlzIHN0aWxsIHZhbGlkIGJlZm9yZSByZXR1cm5pbmcgaXQgKi8KKy8qIFRoaXMgc2hvdWxkIGJlIGEgcmFyZSBvY2N1cnJlbmNlICovCisvKiBzZXQgcXVpZXQgaWYgdGhlIGNhY2hlIGlzIGV4cGVjdGVkIHRvIGJlIG91dC1vZi1kYXRlICovCisvKiBGSVhNRSBNYWtlIHJlc3Qgb2YgY29kZSBwYXNzL2NhY2hlIHN0cnVjdCBkZXZpY2UgaW5zdGVhZCBvZiBkZXZfbmFtZSAqLworY29uc3QgY2hhciAqZGV2X25hbWVfY29uZmlybWVkKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHF1aWV0KQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByOworCisJaWYgKChkZXYtPmZsYWdzICYgREVWX1JFR1VMQVIpKQorCQlyZXR1cm4gZGV2X25hbWUoZGV2KTsKKworCXdoaWxlICgociA9IHN0YXQobmFtZSA9IGRtX2xpc3RfaXRlbShkZXYtPmFsaWFzZXMubiwKKwkJCQkJICBzdHJ1Y3QgZG1fc3RyX2xpc3QpLT5zdHIsICZidWYpKSB8fAorCSAgICAgICAoYnVmLnN0X3JkZXYgIT0gZGV2LT5kZXYpKSB7CisJCWlmIChyIDwgMCkgeworCQkJaWYgKHF1aWV0KQorCQkJCWxvZ19zeXNfZGVidWcoInN0YXQiLCBuYW1lKTsKKwkJCWVsc2UKKwkJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgbmFtZSk7CisJCX0KKwkJaWYgKHF1aWV0KQorCQkJbG9nX2RlYnVnX2RldnMoIlBhdGggJXMgbm8gbG9uZ2VyIHZhbGlkIGZvciBkZXZpY2UoJWQsJWQpIiwKKwkJCQkgICAgICAgbmFtZSwgKGludCkgTUFKT1IoZGV2LT5kZXYpLAorCQkJCSAgICAgICAoaW50KSBNSU5PUihkZXYtPmRldikpOworCQllbHNlCisJCQlsb2dfd2FybigiUGF0aCAlcyBubyBsb25nZXIgdmFsaWQgZm9yIGRldmljZSglZCwlZCkiLAorCQkJCSBuYW1lLCAoaW50KSBNQUpPUihkZXYtPmRldiksCisJCQkJIChpbnQpIE1JTk9SKGRldi0+ZGV2KSk7CisKKwkJLyogUmVtb3ZlIHRoZSBpbmNvcnJlY3QgaGFzaCBlbnRyeSAqLworCQlkbV9oYXNoX3JlbW92ZShfY2FjaGUubmFtZXMsIG5hbWUpOworCisJCS8qIExlYXZlIGxpc3QgYWxvbmUgaWYgdGhlcmUgaXNuJ3QgYW4gYWx0ZXJuYXRpdmUgbmFtZSAqLworCQkvKiBzbyBkZXZfbmFtZSB3aWxsIGFsd2F5cyBmaW5kIHNvbWV0aGluZyB0byByZXR1cm4uICovCisJCS8qIE90aGVyd2lzZSBhZGQgdGhlIG5hbWUgdG8gdGhlIGNvcnJlY3QgZGV2aWNlLiAqLworCQlpZiAoZG1fbGlzdF9zaXplKCZkZXYtPmFsaWFzZXMpID4gMSkgeworCQkJZG1fbGlzdF9kZWwoZGV2LT5hbGlhc2VzLm4pOworCQkJaWYgKCFyKQorCQkJCV9pbnNlcnQobmFtZSwgJmJ1ZiwgMCwgb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldigpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogU2Nhbm5pbmcgaXNzdWVzIHRoaXMgaW5hcHByb3ByaWF0ZWx5IHNvbWV0aW1lcy4gKi8KKwkJbG9nX2RlYnVnX2RldnMoIkFib3J0aW5nIC0gcGxlYXNlIHByb3ZpZGUgbmV3IHBhdGhuYW1lIGZvciB3aGF0ICIKKwkJCSAgICAgICAidXNlZCB0byBiZSAlcyIsIG5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGV2X25hbWUoZGV2KTsKK30KKworc3RydWN0IGRldmljZSAqZGV2X2NhY2hlX2dldChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJc3RydWN0IGRldmljZSAqZCA9IChzdHJ1Y3QgZGV2aWNlICopIGRtX2hhc2hfbG9va3VwKF9jYWNoZS5uYW1lcywgbmFtZSk7CisJaW50IGluZm9fYXZhaWxhYmxlID0gMDsKKworCWlmIChkICYmIChkLT5mbGFncyAmIERFVl9SRUdVTEFSKSkKKwkJcmV0dXJuIGQ7CisKKwkvKiBJZiB0aGUgZW50cnkncyB3cm9uZywgcmVtb3ZlIGl0ICovCisJaWYgKHN0YXQobmFtZSwgJmJ1ZikgPCAwKSB7CisJCWlmIChkKQorCQkJZG1faGFzaF9yZW1vdmUoX2NhY2hlLm5hbWVzLCBuYW1lKTsKKwkJbG9nX3N5c192ZXJ5X3ZlcmJvc2UoInN0YXQiLCBuYW1lKTsKKwkJZCA9IE5VTEw7CisJfSBlbHNlCisJCWluZm9fYXZhaWxhYmxlID0gMTsKKworCWlmIChkICYmIChidWYuc3RfcmRldiAhPSBkLT5kZXYpKSB7CisJCWRtX2hhc2hfcmVtb3ZlKF9jYWNoZS5uYW1lcywgbmFtZSk7CisJCWQgPSBOVUxMOworCX0KKworCWlmICghZCkgeworCQlfaW5zZXJ0KG5hbWUsIGluZm9fYXZhaWxhYmxlID8gJmJ1ZiA6IE5VTEwsIDAsIG9idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXYoKSk7CisJCWQgPSAoc3RydWN0IGRldmljZSAqKSBkbV9oYXNoX2xvb2t1cChfY2FjaGUubmFtZXMsIG5hbWUpOworCQlpZiAoIWQpIHsKKwkJCV9mdWxsX3NjYW4oMCk7CisJCQlkID0gKHN0cnVjdCBkZXZpY2UgKikgZG1faGFzaF9sb29rdXAoX2NhY2hlLm5hbWVzLCBuYW1lKTsKKwkJfQorCX0KKworCWlmICghZCB8fCAoZiAmJiAhKGQtPmZsYWdzICYgREVWX1JFR1VMQVIpICYmICEoZi0+cGFzc2VzX2ZpbHRlcihmLCBkKSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWxvZ19kZWJ1Z19kZXZzKCJVc2luZyAlcyIsIGRldl9uYW1lKGQpKTsKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9kZXZfY2FjaGVfc2Vla19kZXZ0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkID0gTlVMTDsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuID0gZG1faGFzaF9nZXRfZmlyc3QoX2NhY2hlLm5hbWVzKTsKKwl3aGlsZSAobikgeworCQlkID0gZG1faGFzaF9nZXRfZGF0YShfY2FjaGUubmFtZXMsIG4pOworCQlpZiAoZC0+ZGV2ID09IGRldikKKwkJCXJldHVybiBkOworCQluID0gZG1faGFzaF9nZXRfbmV4dChfY2FjaGUubmFtZXMsIG4pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFRPRE8gVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50LiBXZSBwcm9iYWJseSB3YW50IGEgaGFzaCB0YWJsZSBpbmRleGVkIGJ5CisgKiBtYWpvcjptaW5vciBmb3Iga2V5cyB0byBzcGVlZCB1cCB0aGVzZSBsb29rdXBzLgorICovCitzdHJ1Y3QgZGV2aWNlICpkZXZfY2FjaGVfZ2V0X2J5X2RldnQoZGV2X3QgZGV2LCBzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKnN5c2ZzX2RpcjsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCXN0cnVjdCBkZXZpY2UgKmQgPSBfZGV2X2NhY2hlX3NlZWtfZGV2dChkZXYpOworCisJaWYgKGQgJiYgKGQtPmZsYWdzICYgREVWX1JFR1VMQVIpKQorCQlyZXR1cm4gZDsKKworCWlmICghZCkgeworCQlzeXNmc19kaXIgPSBkbV9zeXNmc19kaXIoKTsKKwkJaWYgKHN5c2ZzX2RpciAmJiAqc3lzZnNfZGlyKSB7CisJCQkvKiBGaXJzdCBjaGVjayBpZiBkZXYgaXMgc3lzZnMgdG8gYXZvaWQgdXNlbGVzcyBzY2FuICovCisJCQlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvZGV2L2Jsb2NrLyVkOiVkIiwKKwkJCQkJc3lzZnNfZGlyLCAoaW50KU1BSk9SKGRldiksIChpbnQpTUlOT1IoZGV2KSkgPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJkbV9zbnByaW50ZiBwYXJ0aXRpb24gZmFpbGVkLiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQlpZiAobHN0YXQocGF0aCwgJmluZm8pKSB7CisJCQkJbG9nX2RlYnVnKCJObyBzeXNmcyBlbnRyeSBmb3IgJWQ6JWQuIiwKKwkJCQkJICAoaW50KU1BSk9SKGRldiksIChpbnQpTUlOT1IoZGV2KSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCQlfZnVsbF9zY2FuKDApOworCQlkID0gX2Rldl9jYWNoZV9zZWVrX2RldnQoZGV2KTsKKwl9CisKKwlyZXR1cm4gKGQgJiYgKCFmIHx8IChkLT5mbGFncyAmIERFVl9SRUdVTEFSKSB8fAorCQkgICAgICBmLT5wYXNzZXNfZmlsdGVyKGYsIGQpKSkgPyBkIDogTlVMTDsKK30KKwordm9pZCBkZXZfY2FjaGVfZnVsbF9zY2FuKHN0cnVjdCBkZXZfZmlsdGVyICpmKQoreworCWlmIChmICYmIGYtPndpcGUpIHsKKwkJZi0+d2lwZShmKTsgLyogbWlnaHQgY2FsbCBfZnVsbF9zY2FuKDEpICovCisJCWlmICghZnVsbF9zY2FuX2RvbmUoKSkKKwkJCV9mdWxsX3NjYW4oMSk7CisJfSBlbHNlCisJCV9mdWxsX3NjYW4oMSk7Cit9CisKK3N0cnVjdCBkZXZfaXRlciAqZGV2X2l0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfZmlsdGVyICpmLCBpbnQgZGV2X3NjYW4pCit7CisJc3RydWN0IGRldl9pdGVyICpkaSA9IGRtX21hbGxvYyhzaXplb2YoKmRpKSk7CisKKwlpZiAoIWRpKSB7CisJCWxvZ19lcnJvcigiZGV2X2l0ZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRldl9zY2FuICYmICF0cnVzdF9jYWNoZSgpKSB7CisJCS8qIEZsYWcgZ2V0cyByZXNldCBiZXR3ZWVuIGVhY2ggY29tbWFuZCAqLworCQlpZiAoIWZ1bGxfc2Nhbl9kb25lKCkpCisJCQlkZXZfY2FjaGVfZnVsbF9zY2FuKGYpOworCX0gZWxzZQorCQlfZnVsbF9zY2FuKDApOworCisJZGktPmN1cnJlbnQgPSBidHJlZV9maXJzdChfY2FjaGUuZGV2aWNlcyk7CisJZGktPmZpbHRlciA9IGY7CisJaWYgKGRpLT5maWx0ZXIpCisJCWRpLT5maWx0ZXItPnVzZV9jb3VudCsrOworCisJcmV0dXJuIGRpOworfQorCit2b2lkIGRldl9pdGVyX2Rlc3Ryb3koc3RydWN0IGRldl9pdGVyICppdGVyKQoreworCWlmIChpdGVyLT5maWx0ZXIpCisJCWl0ZXItPmZpbHRlci0+dXNlX2NvdW50LS07CisJZG1fZnJlZShpdGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9pdGVyX25leHQoc3RydWN0IGRldl9pdGVyICppdGVyKQoreworCXN0cnVjdCBkZXZpY2UgKmQgPSBidHJlZV9nZXRfZGF0YShpdGVyLT5jdXJyZW50KTsKKwlpdGVyLT5jdXJyZW50ID0gYnRyZWVfbmV4dChpdGVyLT5jdXJyZW50KTsKKwlyZXR1cm4gZDsKK30KKworc3RydWN0IGRldmljZSAqZGV2X2l0ZXJfZ2V0KHN0cnVjdCBkZXZfaXRlciAqaXRlcikKK3sKKwl3aGlsZSAoaXRlci0+Y3VycmVudCkgeworCQlzdHJ1Y3QgZGV2aWNlICpkID0gX2l0ZXJfbmV4dChpdGVyKTsKKwkJaWYgKCFpdGVyLT5maWx0ZXIgfHwgKGQtPmZsYWdzICYgREVWX1JFR1VMQVIpIHx8CisJCSAgICBpdGVyLT5maWx0ZXItPnBhc3Nlc19maWx0ZXIoaXRlci0+ZmlsdGVyLCBkKSkgeworCQkJbG9nX2RlYnVnX2RldnMoIlVzaW5nICVzIiwgZGV2X25hbWUoZCkpOworCQkJcmV0dXJuIGQ7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBkZXZfcmVzZXRfZXJyb3JfY291bnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RydWN0IGRldl9pdGVyIGl0ZXI7CisKKwlpZiAoIV9jYWNoZS5kZXZpY2VzKQorCQlyZXR1cm47CisKKwlpdGVyLmN1cnJlbnQgPSBidHJlZV9maXJzdChfY2FjaGUuZGV2aWNlcyk7CisJd2hpbGUgKGl0ZXIuY3VycmVudCkKKwkJX2l0ZXJfbmV4dCgmaXRlciktPmVycm9yX2NvdW50ID0gMDsKK30KKworaW50IGRldl9mZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+ZmQ7Cit9CisKK2NvbnN0IGNoYXIgKmRldl9uYW1lKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldiAmJiBkZXYtPmFsaWFzZXMubikgPyBkbV9saXN0X2l0ZW0oZGV2LT5hbGlhc2VzLm4sIHN0cnVjdCBkbV9zdHJfbGlzdCktPnN0ciA6CisJICAgIHVua25vd25fZGV2aWNlX25hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kZXZpY2UvZGV2LWNhY2hlLmggYi9saWIvZGV2aWNlL2Rldi1jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDY5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGV2aWNlL2Rldi1jYWNoZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9ERVZfQ0FDSEVfSAorI2RlZmluZSBfTFZNX0RFVl9DQUNIRV9ICisKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJsdm0td3JhcHBlcnMuaCIKKworLyoKKyAqIHByZWRpY2F0ZSBmb3IgZGV2aWNlcy4KKyAqLworc3RydWN0IGRldl9maWx0ZXIgeworCWludCAoKnBhc3Nlc19maWx0ZXIpIChzdHJ1Y3QgZGV2X2ZpbHRlciAqIGYsIHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IGRldl9maWx0ZXIgKiBmKTsKKwl2b2lkICgqd2lwZSkgKHN0cnVjdCBkZXZfZmlsdGVyICogZik7CisJaW50ICgqZHVtcCkgKHN0cnVjdCBkZXZfZmlsdGVyICogZiwgaW50IG1lcmdlX2V4aXN0aW5nKTsKKwl2b2lkICpwcml2YXRlOworCXVuc2lnbmVkIHVzZV9jb3VudDsKK307CisKK2ludCBkZXZfY2FjaGVfaW5kZXhfZGV2cyh2b2lkKTsKK3N0cnVjdCBkbV9saXN0ICpkZXZfY2FjaGVfZ2V0X2Rldl9saXN0X2Zvcl92Z2lkKGNvbnN0IGNoYXIgKnZnaWQpOworc3RydWN0IGRtX2xpc3QgKmRldl9jYWNoZV9nZXRfZGV2X2xpc3RfZm9yX2x2aWQoY29uc3QgY2hhciAqbHZpZCk7CisKKy8qCisgKiBUaGUgZ2xvYmFsIGRldmljZSBjYWNoZS4KKyAqLworc3RydWN0IGNtZF9jb250ZXh0OworaW50IGRldl9jYWNoZV9pbml0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK2ludCBkZXZfY2FjaGVfZXhpdCh2b2lkKTsKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBvcGVuIGRldmljZXMuCisgKi8KK2ludCBkZXZfY2FjaGVfY2hlY2tfZm9yX29wZW5fZGV2aWNlcyh2b2lkKTsKKworLyogVHJpZ2dlcigxKSBvciBhdm9pZCgwKSBhIHNjYW4gKi8KK3ZvaWQgZGV2X2NhY2hlX3NjYW4oaW50IGRvX3NjYW4pOworaW50IGRldl9jYWNoZV9oYXNfc2Nhbm5lZCh2b2lkKTsKK3ZvaWQgZGV2X2NhY2hlX2Z1bGxfc2NhbihzdHJ1Y3QgZGV2X2ZpbHRlciAqZik7CisKK2ludCBkZXZfY2FjaGVfYWRkX2Rpcihjb25zdCBjaGFyICpwYXRoKTsKK2ludCBkZXZfY2FjaGVfYWRkX2xvb3BmaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpCitzdHJ1Y3QgZGV2aWNlICpkZXZfY2FjaGVfZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZfZmlsdGVyICpmKTsKKworLy8gVE9ETworc3RydWN0IGRldmljZSAqZGV2X2NhY2hlX2dldF9ieV9kZXZ0KGRldl90IGRldmljZSwgc3RydWN0IGRldl9maWx0ZXIgKmYpOworCit2b2lkIGRldl9zZXRfcHJlZmVycmVkX25hbWUoc3RydWN0IGRtX3N0cl9saXN0ICpzbCwgc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoKKyAqIE9iamVjdCBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGNhY2hlLgorICovCitzdHJ1Y3QgZGV2X2l0ZXI7CitzdHJ1Y3QgZGV2X2l0ZXIgKmRldl9pdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X2ZpbHRlciAqZiwgaW50IGRldl9zY2FuKTsKK3ZvaWQgZGV2X2l0ZXJfZGVzdHJveShzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXIpOworc3RydWN0IGRldmljZSAqZGV2X2l0ZXJfZ2V0KHN0cnVjdCBkZXZfaXRlciAqaXRlcik7CisKK3ZvaWQgZGV2X3Jlc2V0X2Vycm9yX2NvdW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2Rldi1kYXNkLmMgYi9saWIvZGV2aWNlL2Rldi1kYXNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5YjAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LWRhc2QuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkZXYtdHlwZS5oIgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWZkZWYgX19saW51eF9fCisKKy8qCisgKiBJbnRlcmZhY2UgdGFrZW4gZnJvbSBrZXJuZWwgaGVhZGVyIGFyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL2Rhc2QuaAorICovCisKKy8qIAorICogQXV0aG9yKHMpLi4uLi4uOiBIb2xnZXIgU21vbGluc2tpIDxIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20+CisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDE5OTksIDIwMDAKKyAqIEVNQyBTeW1tZXRyaXggaW9jdGwgQ29weXJpZ2h0IEVNQyBDb3Jwb3JhdGlvbiwgMjAwOAorICogQXV0aG9yLi4uLi4uLi4uOiBOaWdlbCBIaXNsb3AgPGhpc2xvcF9uaWdlbEBlbWMuY29tPgorICovCisKKyNkZWZpbmUgREFTRF9JT0NUTF9MRVRURVIgJ0QnCisjZGVmaW5lIERBU0RfQVBJX1ZFUlNJT04gNgorCisvKiAKKyAqIHN0cnVjdCBkYXNkX2luZm9ybWF0aW9uMl90CisgKiByZXByZXNlbnRzIGFueSBkYXRhIGFib3V0IHRoZSBkZXZpY2UsIHdoaWNoIGlzIHZpc2libGUgdG8gdXNlcnNwYWNlLgorICogIGluY2x1ZGluZyBmb3JhbXQgYW5kIGZlYXR1ZXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGFzZF9pbmZvcm1hdGlvbjJfdCB7CisJdW5zaWduZWQgaW50IGRldm5vOwkJLyogUy8zOTAgZGV2bm8gKi8KKwl1bnNpZ25lZCBpbnQgcmVhbF9kZXZubzsJLyogZm9yIGFsaWFzZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2NoaWQ7CQkvKiBTLzM5MCBzdWJjaGFubmVsIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBpbnQgY3VfdHlwZSAgOiAxNjsJLyogZnJvbSBTZW5zZUlEICovCisJdW5zaWduZWQgaW50IGN1X21vZGVsIDogIDg7CS8qIGZyb20gU2Vuc2VJRCAqLworCXVuc2lnbmVkIGludCBkZXZfdHlwZSA6IDE2OwkvKiBmcm9tIFNlbnNlSUQgKi8KKwl1bnNpZ25lZCBpbnQgZGV2X21vZGVsIDogODsJLyogZnJvbSBTZW5zZUlEICovCisJdW5zaWduZWQgaW50IG9wZW5fY291bnQ7CisJdW5zaWduZWQgaW50IHJlcV9xdWV1ZV9sZW47CisJdW5zaWduZWQgaW50IGNoYW5xX2xlbjsJCS8qIGxlbmd0aCBvZiBjaGFucSAqLworCWNoYXIgdHlwZVs0XTsJCQkvKiBmcm9tIGRpc2NpcGxpbmUubmFtZSwgJ25vbmUnIGZvciB1bmtub3duICovCisJdW5zaWduZWQgaW50IHN0YXR1czsJCS8qIGN1cnJlbnQgZGV2aWNlIGxldmVsICovCisJdW5zaWduZWQgaW50IGxhYmVsX2Jsb2NrOwkvKiB3aGVyZSB0byBmaW5kIHRoZSBWT0xTRVIgKi8KKwl1bnNpZ25lZCBpbnQgRkJBX2xheW91dDsJLyogZml4ZWQgYmxvY2sgc2l6ZSAobGlrZSBBSVhWT0wpICovCisJdW5zaWduZWQgaW50IGNoYXJhY3RlcmlzdGljc19zaXplOworCXVuc2lnbmVkIGludCBjb25mZGF0YV9zaXplOworCWNoYXIgY2hhcmFjdGVyaXN0aWNzWzY0XTsJLyogZnJvbSByZWFkX2RldmljZV9jaGFyYWN0ZXJpc3RpY3MgKi8KKwljaGFyIGNvbmZpZ3VyYXRpb25fZGF0YVsyNTZdOwkvKiBmcm9tIHJlYWRfY29uZmlndXJhdGlvbl9kYXRhICovCisJdW5zaWduZWQgaW50IGZvcm1hdDsJCS8qIGZvcm1hdCBpbmZvIGxpa2UgZm9ybWF0dGVkL2NkbC9sZGwvLi4uICovCisJdW5zaWduZWQgaW50IGZlYXR1cmVzOwkJLyogZGFzZCBmZWF0dXJlcyBsaWtlICdybycsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkMDsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkMTsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkMjsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkMzsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkNDsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkNTsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkNjsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkNzsJCS8qIHJlc2VydmVkIGZvciBmdXJ0aGVyIHVzZSAsLi4uICovCit9IGRhc2RfaW5mb3JtYXRpb24yX3Q7CisKKyNkZWZpbmUgREFTRF9GT1JNQVRfQ0RMICAyCisKKy8qIEdldCBpbmZvcm1hdGlvbiBvbiBhIGRhc2QgZGV2aWNlIChlbmhhbmNlZCkgKi8KKyNkZWZpbmUgQklPREFTRElORk8yICAgX0lPUihEQVNEX0lPQ1RMX0xFVFRFUiwzLGRhc2RfaW5mb3JtYXRpb24yX3QpCisKKy8qCisgKiBFbmQgb2YgaW5jbHVkZWQgaW50ZXJmYWNlLgorICovCisKK2ludCBkYXNkX2lzX2NkbF9mb3JtYXR0ZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCWRhc2RfaW5mb3JtYXRpb24yX3QgZGFzZF9pbmZvMjsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoaW9jdGwoZGV2LT5mZCwgQklPREFTRElORk8yLCAmZGFzZF9pbmZvMikpIHsKKwkJbG9nX3N5c19lcnJvcigiaW9jdGwgQklPREFTRElORk8yIiwgZGV2X25hbWUoZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkYXNkX2luZm8yLmZvcm1hdCA9PSBEQVNEX0ZPUk1BVF9DREwpCisJCXJldCA9IDE7CisKK291dDoKKwlpZiAoIWRldl9jbG9zZShkZXYpKQorCQlzdGFjazsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisKK2ludCBkYXNkX2lzX2NkbF9mb3JtYXR0ZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9kZXZpY2UvZGV2LWV4dC11ZGV2LWNvbnN0YW50cy5oIGIvbGliL2RldmljZS9kZXYtZXh0LXVkZXYtY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YTA5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LWV4dC11ZGV2LWNvbnN0YW50cy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb3BlcnRpZXMgc2F2ZWQgaW4gdWRldiBkYiBhbmQgYWNjZXNpYmxlIHZpYSBsaWJ1ZGV2IGFuZCB1c2VkIGJ5IExWTSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERFVl9FWFRfVURFVl9CTEtJRF9UWVBFIHByb3BlcnR5IHdpdGggdmFyaW91cyBERVZfRVhUX1VERVZfQkxLSURfVFlQRV8qCisgKiB2YWx1ZXMgdGhhdCBpcyBzYXZlZCBpbiB1ZGV2IGRiIHZpYSBibGtpZCBjYWxsIGluIHVkZXYgcnVsZXMKKyAqLworI2RlZmluZSBERVZfRVhUX1VERVZfQkxLSURfVFlQRSAgICAgICAgICAgICAgICAgIklEX0ZTX1RZUEUiCisvKgorICogbXBhdGhfbWVtYmVyIGlzIGZvcmNlZCBieSBtdWx0aXBhdGggLSBpdCdzIHNldCBpbiB1ZGV2IGRiIHZpYQorICogbXVsdGlwYXRoIGNhbGwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIElEX0ZTX1RZUEUgdmFsdWUgZm9yCisgKiBhIGRldmljZSB3aGljaCBpcyBhIG11bHRpcGF0aCBjb21wb25lbnQgd2hpY2ggcHJldmVudHMgaW5jb3JyZWN0CisgKiBjbGFpbSBvZiB0aGUgZGV2aWNlIGJ5IGFueSBvdGhlciBibG9jayBkZXZpY2Ugc3Vic3lzdGVtCisgKi8KKyNkZWZpbmUgREVWX0VYVF9VREVWX0JMS0lEX1RZUEVfTVBBVEggICAgICAgICAgICJtcGF0aF9tZW1iZXIiCisvKiBGVyBSQUlEcyBhcmUgYWxsICpfcmFpZF9tZW1iZXIgdHlwZXMgZXhjZXB0IGxpbnV4X3JhaWRfbWVtYmVyIHdoaWNoIGRlbm90ZXMgU1cgUkFJRCAqLworI2RlZmluZSBERVZfRVhUX1VERVZfQkxLSURfVFlQRV9SQUlEX1NVRkZJWCAgICAgIl9yYWlkX21lbWJlciIKKyNkZWZpbmUgREVWX0VYVF9VREVWX0JMS0lEX1RZUEVfU1dfUkFJRCAgICAgICAgICJsaW51eF9yYWlkX21lbWJlciIKKyNkZWZpbmUgREVWX0VYVF9VREVWX0JMS0lEX1BBUlRfVEFCTEVfVFlQRSAgICAgICJJRF9QQVJUX1RBQkxFX1RZUEUiCisKKyNkZWZpbmUgREVWX0VYVF9VREVWX0RFVlRZUEUJCQkiREVWVFlQRSIKKyNkZWZpbmUgREVWX0VYVF9VREVWX0RFVlRZUEVfRElTSwkJImRpc2siCisKKy8qCisgKiBERVZfRVhUX1VERVZfTVBBVEhfREVWSUNFX1BBVEggaXMgc2V0IGJ5IG11bHRpcGF0aCBpbiB1ZGV2IGRiCisgKiB3aXRoIHZhbHVlIGVpdGhlciAwIG9yIDEuIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMKKyAqIERFVl9FWFRfVURFVl9CTEtJRF9UWVBFX01QQVRIIGFjdHVhbGx5LCBidXQgaW50cm9kdWNlZCBsYXRlcgorICogZm9yIHNvbWUgcmVhc29uLgorICovCisjZGVmaW5lIERFVl9FWFRfVURFVl9NUEFUSF9ERVZJQ0VfUEFUSCAgICAgICAgICAiRE1fTVVMVElQQVRIX0RFVklDRV9QQVRIIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3lzZnMgYXR0cmlidXRlcyBhY2Nlc3NpYmxlIHZpYSBsaWJ1ZGV2IGFuZCB1c2VkIGJ5IExWTSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHRoZSB2YWx1ZSBvZiBzaXplIHN5c2ZzIGF0dHJpYnV0ZSBpcyBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIERFVl9FWFRfVURFVl9TWVNGU19BVFRSX1NJWkUgICAgICAgICAgICAic2l6ZSIKKwpkaWZmIC0tZ2l0IGEvbGliL2RldmljZS9kZXYtZXh0LmMgYi9saWIvZGV2aWNlL2Rldi1leHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M4Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RldmljZS9kZXYtZXh0LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRldmljZS5oIgorCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CisjZW5kaWYKKworc3RydWN0IGV4dF9yZWdpc3RyeV9pdGVtIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBkZXZfZXh0ICooKiBkZXZfZXh0X2dldCkgKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZGV2X2V4dF9yZWxlYXNlKSAoc3RydWN0IGRldmljZSAqZGV2KTsKK307CisKKyNkZWZpbmUgRVhUX1JFR0lTVEVSKGlkLG5hbWUpIFtpZF0gPSB7ICNuYW1lLCAmX2Rldl9leHRfZ2V0XyAjIyBuYW1lLCAmX2Rldl9leHRfcmVsZWFzZV8gIyMgbmFtZSB9CisKKy8qCisgKiBERVZfRVhUX05PTkUKKyAqLworc3RhdGljIHN0cnVjdCBkZXZfZXh0ICpfZGV2X2V4dF9nZXRfbm9uZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2LT5leHQuaGFuZGxlID0gTlVMTDsKKwlyZXR1cm4gJmRldi0+ZXh0OworfQorCitzdGF0aWMgaW50IF9kZXZfZXh0X3JlbGVhc2Vfbm9uZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2LT5leHQuaGFuZGxlID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERFVl9FWFRfVURFVgorICovCitzdGF0aWMgc3RydWN0IGRldl9leHQgKl9kZXZfZXh0X2dldF91ZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqdWRldl9kZXZpY2U7CisKKwlpZiAoZGV2LT5leHQuaGFuZGxlKQorCQlyZXR1cm4gJmRldi0+ZXh0OworCisJaWYgKCEodWRldiA9IHVkZXZfZ2V0X2xpYnJhcnlfY29udGV4dCgpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoISh1ZGV2X2RldmljZSA9IHVkZXZfZGV2aWNlX25ld19mcm9tX2Rldm51bSh1ZGV2LCAnYicsIGRldi0+ZGV2KSkpCisJCXJldHVybl9OVUxMOworCisjaWZkZWYgSEFWRV9MSUJVREVWX1VERVZfREVWSUNFX0dFVF9JU19JTklUSUFMSVpFRAorCWlmICghdWRldl9kZXZpY2VfZ2V0X2lzX2luaXRpYWxpemVkKHVkZXZfZGV2aWNlKSkgeworCQkvKiBUaW1lb3V0IG9yIHNvbWUgb3RoZXIgdWRldiBkYiBpbmNvbnNpc3RlbmN5ISAqLworCQlsb2dfZXJyb3IoIlVkZXYgZGF0YWJhc2UgaGFzIGluY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlICVzLiIsIGRldl9uYW1lKGRldikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKworCWRldi0+ZXh0LmhhbmRsZSA9ICh2b2lkICopIHVkZXZfZGV2aWNlOworCXJldHVybiAmZGV2LT5leHQ7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX2Rldl9leHRfcmVsZWFzZV91ZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorCWlmICghZGV2LT5leHQuaGFuZGxlKQorCQlyZXR1cm4gMTsKKworCS8qIHVkZXZfZGV2aWNlX3VucmVmIGNhbid0IGZhaWwgLSBpdCBoYXMgbm8gcmV0dXJuIHZhbHVlICovCisJdWRldl9kZXZpY2VfdW5yZWYoKHN0cnVjdCB1ZGV2X2RldmljZSAqKSBkZXYtPmV4dC5oYW5kbGUpOworCWRldi0+ZXh0LmhhbmRsZSA9IE5VTEw7CisJcmV0dXJuIDE7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh0X3JlZ2lzdHJ5X2l0ZW0gX2V4dF9yZWdpc3RyeVtERVZfRVhUX05VTV0gPSB7CisJRVhUX1JFR0lTVEVSKERFVl9FWFRfTk9ORSwgbm9uZSksCisJRVhUX1JFR0lTVEVSKERFVl9FWFRfVURFViwgdWRldikKK307CisKK2NvbnN0IGNoYXIgKmRldl9leHRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9leHRfcmVnaXN0cnlbZGV2LT5leHQuc3JjXS5uYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2V4dF9hdHRhY2hlZF9tc2cgPSAiRXh0ZXJuYWwgaGFuZGxlIGF0dGFjaGVkIHRvIGRldmljZSI7CisKK3N0cnVjdCBkZXZfZXh0ICpkZXZfZXh0X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9leHQgKmV4dDsKKwl2b2lkICpoYW5kbGVfcHRyOworCisJaGFuZGxlX3B0ciA9IGRldi0+ZXh0LmhhbmRsZTsKKworCWlmICghKGV4dCA9IF9leHRfcmVnaXN0cnlbZGV2LT5leHQuc3JjXS5kZXZfZXh0X2dldChkZXYpKSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IGV4dGVybmFsIGhhbmRsZSBmb3IgZGV2aWNlICVzIFslc10uIiwKKwkJCSAgIGRldl9uYW1lKGRldiksIGRldl9leHRfbmFtZShkZXYpKTsKKwllbHNlIGlmIChoYW5kbGVfcHRyICE9IGRldi0+ZXh0LmhhbmRsZSkKKwkJbG9nX2RlYnVnX2RldnMoIiVzICVzIFslczolcF0iLCBfZXh0X2F0dGFjaGVkX21zZywgZGV2X25hbWUoZGV2KSwKKwkJCQlkZXZfZXh0X25hbWUoZGV2KSwgZGV2LT5leHQuaGFuZGxlKTsKKworCXJldHVybiBleHQ7Cit9CisKK2ludCBkZXZfZXh0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByOworCXZvaWQgKmhhbmRsZV9wdHI7CisKKwlpZiAoIWRldi0+ZXh0LmVuYWJsZWQgfHwKKwkgICAgIWRldi0+ZXh0LmhhbmRsZSkKKwkJcmV0dXJuIDE7CisKKwloYW5kbGVfcHRyID0gZGV2LT5leHQuaGFuZGxlOworCisJaWYgKCEociA9IF9leHRfcmVnaXN0cnlbZGV2LT5leHQuc3JjXS5kZXZfZXh0X3JlbGVhc2UoZGV2KSkpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbGVhc2UgZXh0ZXJuYWwgaGFuZGxlIGZvciBkZXZpY2UgJXMgWyVzOiVwXS4iLAorCQkJICBkZXZfbmFtZShkZXYpLCBkZXZfZXh0X25hbWUoZGV2KSwgZGV2LT5leHQuaGFuZGxlKTsKKwllbHNlCisJCWxvZ19kZWJ1Z19kZXZzKCJFeHRlcm5hbCBoYW5kbGUgZGV0YWNoZWQgZnJvbSBkZXZpY2UgJXMgWyVzOiVwXSIsCisJCQkJZGV2X25hbWUoZGV2KSwgZGV2X2V4dF9uYW1lKGRldiksIGhhbmRsZV9wdHIpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkZXZfZXh0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRldl9leHRfdCBzcmMpCit7CisJaWYgKGRldi0+ZXh0LmVuYWJsZWQgJiYgKGRldi0+ZXh0LnNyYyAhPSBzcmMpICYmICFkZXZfZXh0X3JlbGVhc2UoZGV2KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBlbmFibGUgZXh0ZXJuYWwgaGFuZGxlIGZvciBkZXZpY2UgJXMgWyVzXS4iLAorCQkJICAgZGV2X25hbWUoZGV2KSwgX2V4dF9yZWdpc3RyeVtzcmNdLm5hbWUpOyAKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2LT5leHQuc3JjID0gc3JjOworCWRldi0+ZXh0LmVuYWJsZWQgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkZXZfZXh0X2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZGV2LT5leHQuZW5hYmxlZCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWRldl9leHRfcmVsZWFzZShkZXYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRpc2FibGUgZXh0ZXJuYWwgaGFuZGxlIGZvciBkZXZpY2UgJXMgWyVzXS4iLAorCQkJICAgZGV2X25hbWUoZGV2KSwgZGV2X2V4dF9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYtPmV4dC5lbmFibGVkID0gMDsKKwlkZXYtPmV4dC5zcmMgPSBERVZfRVhUX05PTkU7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kZXZpY2UvZGV2LWlvLmMgYi9saWIvZGV2aWNlL2Rldi1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTIzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGV2aWNlL2Rldi1pby5jCkBAIC0wLDAgKzEsODI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWZkZWYgX19saW51eF9fCisjICBkZWZpbmUgdTY0IHVpbnQ2NF90CQkvKiBNaXNzaW5nIHdpdGhvdXQgX19LRVJORUxfXyAqLworIyAgdW5kZWYgV05PSEFORwkJLyogQXZvaWQgcmVkZWZpbml0aW9uICovCisjICB1bmRlZiBXVU5UUkFDRUQJCS8qIEF2b2lkIHJlZGVmaW5pdGlvbiAqLworIyAgaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIEZvciBibG9jayBpb2N0bCBkZWZpbml0aW9ucyAqLworIyAgZGVmaW5lIEJMS1NJWkVfU0hJRlQgU0VDVE9SX1NISUZUCisjICBpZm5kZWYgQkxLR0VUU0laRTY0CQkvKiBmcy5oIG91dC1vZi1kYXRlICovCisjICAgIGRlZmluZSBCTEtHRVRTSVpFNjQgX0lPUigweDEyLCAxMTQsIHNpemVfdCkKKyMgIGVuZGlmIC8qIEJMS0dFVFNJWkU2NCAqLworIyAgaWZuZGVmIEJMS0RJU0NBUkQKKyMgICAgZGVmaW5lIEJMS0RJU0NBUkQJX0lPKDB4MTIsMTE5KQorIyAgZW5kaWYKKyNlbHNlCisjICBpbmNsdWRlIDxzeXMvZGlzay5oPgorIyAgZGVmaW5lIEJMS0JTWkdFVCBES0lPQ0dFVEJMT0NLU0laRQorIyAgZGVmaW5lIEJMS1NTWkdFVCBES0lPQ0dFVEJMT0NLU0laRQorIyAgZGVmaW5lIEJMS0dFVFNJWkU2NCBES0lPQ0dFVEJMT0NLQ09VTlQKKyMgIGRlZmluZSBCTEtGTFNCVUYgREtJT0NTWU5DSFJPTklaRUNBQ0hFCisjICBkZWZpbmUgQkxLU0laRV9TSElGVCAwCisjZW5kaWYKKworI2lmZGVmIE9fRElSRUNUX1NVUFBPUlQKKyMgIGlmbmRlZiBPX0RJUkVDVAorIyAgICBlcnJvciBPX0RJUkVDVCBzdXBwb3J0IGNvbmZpZ3VyZWQgYnV0IE9fRElSRUNUIGRlZmluaXRpb24gbm90IGZvdW5kIGluIGhlYWRlcnMKKyMgIGVuZGlmCisjZW5kaWYKKworc3RhdGljIERNX0xJU1RfSU5JVChfb3Blbl9kZXZpY2VzKTsKK3N0YXRpYyB1bnNpZ25lZCBfZGV2X3NpemVfc2Vxbm8gPSAxOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgc3RhbmRhcmQgaW8gbG9vcCB0aGF0IGtlZXBzIHN1Ym1pdHRpbmcgYW4gaW8gdW50aWwgaXQncworICogYWxsIGdvbmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9pbyhzdHJ1Y3QgZGV2aWNlX2FyZWEgKndoZXJlLCBjaGFyICpidWZmZXIsIGludCBzaG91bGRfd3JpdGUpCit7CisJaW50IGZkID0gZGV2X2ZkKHdoZXJlLT5kZXYpOworCXNzaXplX3QgbiA9IDA7CisJc2l6ZV90IHRvdGFsID0gMDsKKworCWlmIChmZCA8IDApIHsKKwkJbG9nX2Vycm9yKCJBdHRlbXB0IHRvIHJlYWQgYW4gdW5vcGVuZWQgZGV2aWNlICglcykuIiwKKwkJCSAgZGV2X25hbWUod2hlcmUtPmRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNraXAgYWxsIHdyaXRlcyBpbiB0ZXN0IG1vZGUuCisJICovCisJaWYgKHNob3VsZF93cml0ZSAmJiB0ZXN0X21vZGUoKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAod2hlcmUtPnNpemUgPiBTU0laRV9NQVgpIHsKKwkJbG9nX2Vycm9yKCJSZWFkIHNpemUgdG9vIGxhcmdlOiAlIiBQUkl1NjQsIHdoZXJlLT5zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxzZWVrKGZkLCAob2ZmX3QpIHdoZXJlLT5zdGFydCwgU0VFS19TRVQpID09IChvZmZfdCkgLTEpIHsKKwkJbG9nX2Vycm9yKCIlczogbHNlZWsgJSIgUFJJdTY0ICIgZmFpbGVkOiAlcyIsCisJCQkgIGRldl9uYW1lKHdoZXJlLT5kZXYpLCAodWludDY0X3QpIHdoZXJlLT5zdGFydCwKKwkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKHRvdGFsIDwgKHNpemVfdCkgd2hlcmUtPnNpemUpIHsKKwkJZG8KKwkJCW4gPSBzaG91bGRfd3JpdGUgPworCQkJICAgIHdyaXRlKGZkLCBidWZmZXIsIChzaXplX3QpIHdoZXJlLT5zaXplIC0gdG90YWwpIDoKKwkJCSAgICByZWFkKGZkLCBidWZmZXIsIChzaXplX3QpIHdoZXJlLT5zaXplIC0gdG90YWwpOworCQl3aGlsZSAoKG4gPCAwKSAmJiAoKGVycm5vID09IEVJTlRSKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkpOworCisJCWlmIChuIDwgMCkKKwkJCWxvZ19lcnJvcl9vbmNlKCIlczogJXMgZmFpbGVkIGFmdGVyICUiIFBSSXU2NCAiIG9mICUiIFBSSXU2NAorCQkJCSAgICAgICAiIGF0ICUiIFBSSXU2NCAiOiAlcyIsIGRldl9uYW1lKHdoZXJlLT5kZXYpLAorCQkJCSAgICAgICBzaG91bGRfd3JpdGUgPyAid3JpdGUiIDogInJlYWQiLAorCQkJCSAgICAgICAodWludDY0X3QpIHRvdGFsLAorCQkJCSAgICAgICAodWludDY0X3QpIHdoZXJlLT5zaXplLAorCQkJCSAgICAgICAodWludDY0X3QpIHdoZXJlLT5zdGFydCwgc3RyZXJyb3IoZXJybm8pKTsKKworCQlpZiAobiA8PSAwKQorCQkJYnJlYWs7CisKKwkJdG90YWwgKz0gbjsKKwkJYnVmZmVyICs9IG47CisJfQorCisJcmV0dXJuICh0b3RhbCA9PSAoc2l6ZV90KSB3aGVyZS0+c2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExWTTIgdXNlcyBPX0RJUkVDVCB3aGVuIHBlcmZvcm1pbmcgbWV0YWRhdGEgaW8sIHdoaWNoIHJlcXVpcmVzCisgKiBibG9jayBzaXplIGFsaWduZWQgYWNjZXNzZXMuICBJZiBhbnkgaW8gaXMgbm90IGFsaWduZWQgd2UgaGF2ZQorICogdG8gcGVyZm9ybSB0aGUgaW8gdmlhIGEgYm91bmNlIGJ1ZmZlciwgb2J2aW91c2x5IHRoaXMgaXMgcXVpdGUKKyAqIGluZWZmaWNpZW50LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogR2V0IHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBibG9jayBzaXplIGZvciBhIGRldmljZS4KKyAqLworaW50IGRldl9nZXRfYmxvY2tfc2l6ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqcGh5c2ljYWxfYmxvY2tfc2l6ZSwgdW5zaWduZWQgaW50ICpibG9ja19zaXplKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZXZfbmFtZShkZXYpOworCWludCBuZWVkc19vcGVuOworCWludCByID0gMTsKKworCW5lZWRzX29wZW4gPSAoIWRldi0+b3Blbl9jb3VudCAmJiAoZGV2LT5waHlzX2Jsb2NrX3NpemUgPT0gLTEgfHwgZGV2LT5ibG9ja19zaXplID09IC0xKSk7CisKKwlpZiAobmVlZHNfb3BlbiAmJiAhZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZGV2LT5ibG9ja19zaXplID09IC0xKSB7CisJCWlmIChpb2N0bChkZXZfZmQoZGV2KSwgQkxLQlNaR0VULCAmZGV2LT5ibG9ja19zaXplKSA8IDApIHsKKwkJCWxvZ19zeXNfZXJyb3IoImlvY3RsIEJMS0JTWkdFVCIsIG5hbWUpOworCQkJciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsb2dfZGVidWdfZGV2cygiJXM6IGJsb2NrIHNpemUgaXMgJXUgYnl0ZXMiLCBuYW1lLCBkZXYtPmJsb2NrX3NpemUpOworCX0KKworI2lmZGVmIEJMS1BCU1pHRVQKKwkvKiBCTEtQQlNaR0VUIGlzIGF2YWlsYWJsZSBpbiBrZXJuZWwgPj0gMi42LjMyIG9ubHkgKi8KKwlpZiAoZGV2LT5waHlzX2Jsb2NrX3NpemUgPT0gLTEpIHsKKwkJaWYgKGlvY3RsKGRldl9mZChkZXYpLCBCTEtQQlNaR0VULCAmZGV2LT5waHlzX2Jsb2NrX3NpemUpIDwgMCkgeworCQkJbG9nX3N5c19lcnJvcigiaW9jdGwgQkxLUEJTWkdFVCIsIG5hbWUpOworCQkJciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsb2dfZGVidWdfZGV2cygiJXM6IHBoeXNpY2FsIGJsb2NrIHNpemUgaXMgJXUgYnl0ZXMiLCBuYW1lLCBkZXYtPnBoeXNfYmxvY2tfc2l6ZSk7CisJfQorI2VsaWYgZGVmaW5lZCAoQkxLU1NaR0VUKQorCS8qIGlmIHdlIGNhbid0IGdldCBwaHlzaWNhbCBibG9jayBzaXplLCBqdXN0IHVzZSBsb2dpY2FsIGJsb2NrIHNpemUgaW5zdGVhZCAqLworCWlmIChkZXYtPnBoeXNfYmxvY2tfc2l6ZSA9PSAtMSkgeworCQlpZiAoaW9jdGwoZGV2X2ZkKGRldiksIEJMS1NTWkdFVCwgJmRldi0+cGh5c19ibG9ja19zaXplKSA8IDApIHsKKwkJCWxvZ19zeXNfZXJyb3IoImlvY3RsIEJMS1NTWkdFVCIsIG5hbWUpOworCQkJciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsb2dfZGVidWdfZGV2cygiJXM6IHBoeXNpY2FsIGJsb2NrIHNpemUgY2FuJ3QgYmUgZGV0ZXJtaW5lZCwgdXNpbmcgbG9naWNhbCAiCisJCQkgICAgICAgImJsb2NrIHNpemUgb2YgJXUgYnl0ZXMiLCBuYW1lLCBkZXYtPnBoeXNfYmxvY2tfc2l6ZSk7CisJfQorI2Vsc2UKKwkvKiBpZiBldmVuIEJMS1NTWkdFVCBpcyBub3QgYXZhaWxhYmxlLCB1c2UgZGVmYXVsdCA1MTJiICovCisJaWYgKGRldi0+cGh5c19ibG9ja19zaXplID09IC0xKSB7CisJCWRldi0+cGh5c19ibG9ja19zaXplID0gNTEyOworCQlsb2dfZGVidWdfZGV2cygiJXM6IHBoeXNpY2FsIGJsb2NrIHNpemUgY2FuJ3QgYmUgZGV0ZXJtaW5lZCwgdXNpbmcgYmxvY2sgIgorCQkJICAgICAgICJzaXplIG9mICV1IGJ5dGVzIGluc3RlYWQiLCBuYW1lLCBkZXYtPnBoeXNfYmxvY2tfc2l6ZSk7CisJfQorI2VuZGlmCisKKwkqcGh5c2ljYWxfYmxvY2tfc2l6ZSA9ICh1bnNpZ25lZCBpbnQpIGRldi0+cGh5c19ibG9ja19zaXplOworCSpibG9ja19zaXplID0gKHVuc2lnbmVkIGludCkgZGV2LT5ibG9ja19zaXplOworb3V0OgorCWlmIChuZWVkc19vcGVuICYmICFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFdpZGVucyBhIHJlZ2lvbiB0byBiZSBhbiBhbGlnbmVkIHJlZ2lvbi4KKyAqLworc3RhdGljIHZvaWQgX3dpZGVuX3JlZ2lvbih1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgc3RydWN0IGRldmljZV9hcmVhICpyZWdpb24sCisJCQkgIHN0cnVjdCBkZXZpY2VfYXJlYSAqcmVzdWx0KQoreworCXVpbnQ2NF90IG1hc2sgPSBibG9ja19zaXplIC0gMSwgZGVsdGE7CisJbWVtY3B5KHJlc3VsdCwgcmVnaW9uLCBzaXplb2YoKnJlc3VsdCkpOworCisJLyogYWRqdXN0IHRoZSBzdGFydCAqLworCWRlbHRhID0gcmVzdWx0LT5zdGFydCAmIG1hc2s7CisJaWYgKGRlbHRhKSB7CisJCXJlc3VsdC0+c3RhcnQgLT0gZGVsdGE7CisJCXJlc3VsdC0+c2l6ZSArPSBkZWx0YTsKKwl9CisKKwkvKiBhZGp1c3QgdGhlIGVuZCAqLworCWRlbHRhID0gKHJlc3VsdC0+c3RhcnQgKyByZXN1bHQtPnNpemUpICYgbWFzazsKKwlpZiAoZGVsdGEpCisJCXJlc3VsdC0+c2l6ZSArPSBibG9ja19zaXplIC0gZGVsdGE7Cit9CisKK3N0YXRpYyBpbnQgX2FsaWduZWRfaW8oc3RydWN0IGRldmljZV9hcmVhICp3aGVyZSwgY2hhciAqYnVmZmVyLAorCQkgICAgICAgaW50IHNob3VsZF93cml0ZSkKK3sKKwljaGFyICpib3VuY2UsICpib3VuY2VfYnVmOworCXVuc2lnbmVkIGludCBwaHlzaWNhbF9ibG9ja19zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSA9IDA7CisJdWludHB0cl90IG1hc2s7CisJc3RydWN0IGRldmljZV9hcmVhIHdpZGVuZWQ7CisJaW50IHIgPSAwOworCisJaWYgKCEod2hlcmUtPmRldi0+ZmxhZ3MgJiBERVZfUkVHVUxBUikgJiYKKwkgICAgIWRldl9nZXRfYmxvY2tfc2l6ZSh3aGVyZS0+ZGV2LCAmcGh5c2ljYWxfYmxvY2tfc2l6ZSwgJmJsb2NrX3NpemUpKQorCQlyZXR1cm5fMDsKKworCWlmICghYmxvY2tfc2l6ZSkKKwkJYmxvY2tfc2l6ZSA9IGx2bV9nZXRwYWdlc2l6ZSgpOworCisJX3dpZGVuX3JlZ2lvbihibG9ja19zaXplLCB3aGVyZSwgJndpZGVuZWQpOworCisJLyogRG8gd2UgbmVlZCB0byB1c2UgYSBib3VuY2UgYnVmZmVyPyAqLworCW1hc2sgPSBibG9ja19zaXplIC0gMTsKKwlpZiAoIW1lbWNtcCh3aGVyZSwgJndpZGVuZWQsIHNpemVvZih3aWRlbmVkKSkgJiYKKwkgICAgISgodWludHB0cl90KSBidWZmZXIgJiBtYXNrKSkKKwkJcmV0dXJuIF9pbyh3aGVyZSwgYnVmZmVyLCBzaG91bGRfd3JpdGUpOworCisJLyogQWxsb2NhdGUgYSBib3VuY2UgYnVmZmVyIHdpdGggYW4gZXh0cmEgYmxvY2sgKi8KKwlpZiAoIShib3VuY2VfYnVmID0gYm91bmNlID0gZG1fbWFsbG9jKChzaXplX3QpIHdpZGVuZWQuc2l6ZSArIGJsb2NrX3NpemUpKSkgeworCQlsb2dfZXJyb3IoIkJvdW5jZSBidWZmZXIgbWFsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJlYWxpZ24gc3RhcnQgb2YgYm91bmNlIGJ1ZmZlciAodXNpbmcgdGhlIGV4dHJhIHNlY3RvcikKKwkgKi8KKwlpZiAoKCh1aW50cHRyX3QpIGJvdW5jZSkgJiBtYXNrKQorCQlib3VuY2UgPSAoY2hhciAqKSAoKCgodWludHB0cl90KSBib3VuY2UpICsgbWFzaykgJiB+bWFzayk7CisKKwkvKiBjaGFubmVsIHRoZSBpbyB0aHJvdWdoIHRoZSBib3VuY2UgYnVmZmVyICovCisJaWYgKCFfaW8oJndpZGVuZWQsIGJvdW5jZSwgMCkpIHsKKwkJaWYgKCFzaG91bGRfd3JpdGUpCisJCQlnb3RvX291dDsKKwkJLyogRklYTUUgcHJlLWV4dGVuZCB0aGUgZmlsZSAqLworCQltZW1zZXQoYm91bmNlLCAnXG4nLCB3aWRlbmVkLnNpemUpOworCX0KKworCWlmIChzaG91bGRfd3JpdGUpIHsKKwkJbWVtY3B5KGJvdW5jZSArICh3aGVyZS0+c3RhcnQgLSB3aWRlbmVkLnN0YXJ0KSwgYnVmZmVyLAorCQkgICAgICAgKHNpemVfdCkgd2hlcmUtPnNpemUpOworCisJCS8qIC4uLiB0aGVuIHdlIHdyaXRlICovCisJCWlmICghKHIgPSBfaW8oJndpZGVuZWQsIGJvdW5jZSwgMSkpKQorCQkJc3RhY2s7CisJCQkKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KGJ1ZmZlciwgYm91bmNlICsgKHdoZXJlLT5zdGFydCAtIHdpZGVuZWQuc3RhcnQpLAorCSAgICAgICAoc2l6ZV90KSB3aGVyZS0+c2l6ZSk7CisKKwlyID0gMTsKKworb3V0OgorCWRtX2ZyZWUoYm91bmNlX2J1Zik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2Rldl9nZXRfc2l6ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKnNpemUpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRldl9uYW1lKGRldik7CisJc3RydWN0IHN0YXQgaW5mbzsKKworCWlmIChkZXYtPnNpemVfc2Vxbm8gPT0gX2Rldl9zaXplX3NlcW5vKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiB1c2luZyBjYWNoZWQgc2l6ZSAlIiBQUkl1NjQgIiBzZWN0b3JzIiwKKwkJCQkgbmFtZSwgZGV2LT5zaXplKTsKKwkJKnNpemUgPSBkZXYtPnNpemU7CisJCXJldHVybiAxOworCX0KKworCWlmIChzdGF0KG5hbWUsICZpbmZvKSkgeworCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCSpzaXplID0gaW5mby5zdF9zaXplOworCSpzaXplID4+PSBTRUNUT1JfU0hJRlQ7CS8qIENvbnZlcnQgdG8gc2VjdG9ycyAqLworCWRldi0+c2l6ZSA9ICpzaXplOworCWRldi0+c2l6ZV9zZXFubyA9IF9kZXZfc2l6ZV9zZXFubzsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiBzaXplIGlzICUiIFBSSXU2NCAiIHNlY3RvcnMiLCBuYW1lLCAqc2l6ZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZGV2X2dldF9zaXplX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90ICpzaXplKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZXZfbmFtZShkZXYpOworCisJaWYgKGRldi0+c2l6ZV9zZXFubyA9PSBfZGV2X3NpemVfc2Vxbm8pIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiJXM6IHVzaW5nIGNhY2hlZCBzaXplICUiIFBSSXU2NCAiIHNlY3RvcnMiLAorCQkJCSBuYW1lLCBkZXYtPnNpemUpOworCQkqc2l6ZSA9IGRldi0+c2l6ZTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShkZXYpKQorCQlyZXR1cm5fMDsKKworCWlmIChpb2N0bChkZXZfZmQoZGV2KSwgQkxLR0VUU0laRTY0LCBzaXplKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigiaW9jdGwgQkxLR0VUU0laRTY0IiwgbmFtZSk7CisJCWlmICghZGV2X2Nsb3NlKGRldikpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc2l6ZSA+Pj0gQkxLU0laRV9TSElGVDsJLyogQ29udmVydCB0byBzZWN0b3JzICovCisJZGV2LT5zaXplID0gKnNpemU7CisJZGV2LT5zaXplX3NlcW5vID0gX2Rldl9zaXplX3NlcW5vOworCisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBuYW1lKTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiBzaXplIGlzICUiIFBSSXU2NCAiIHNlY3RvcnMiLCBuYW1lLCAqc2l6ZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZGV2X3JlYWRfYWhlYWRfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgKnJlYWRfYWhlYWQpCit7CisJbG9uZyByZWFkX2FoZWFkX2xvbmc7CisKKwlpZiAoZGV2LT5yZWFkX2FoZWFkICE9IC0xKSB7CisJCSpyZWFkX2FoZWFkID0gKHVpbnQzMl90KSBkZXYtPnJlYWRfYWhlYWQ7CisJCXJldHVybiAxOworCX0KKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoaW9jdGwoZGV2LT5mZCwgQkxLUkFHRVQsICZyZWFkX2FoZWFkX2xvbmcpIDwgMCkgeworCQlsb2dfc3lzX2Vycm9yKCJpb2N0bCBCTEtSQUdFVCIsIGRldl9uYW1lKGRldikpOworCQlpZiAoIWRldl9jbG9zZShkZXYpKQorCQkJc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCSpyZWFkX2FoZWFkID0gKHVpbnQzMl90KSByZWFkX2FoZWFkX2xvbmc7CisJZGV2LT5yZWFkX2FoZWFkID0gcmVhZF9haGVhZF9sb25nOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiJXM6IHJlYWRfYWhlYWQgaXMgJXUgc2VjdG9ycyIsCisJCQkgZGV2X25hbWUoZGV2KSwgKnJlYWRfYWhlYWQpOworCisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZGV2X2Rpc2NhcmRfYmxvY2tzKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3Qgb2Zmc2V0X2J5dGVzLCB1aW50NjRfdCBzaXplX2J5dGVzKQoreworCXVpbnQ2NF90IGRpc2NhcmRfcmFuZ2VbMl07CisKKwlpZiAoIWRldl9vcGVuKGRldikpCisJCXJldHVybl8wOworCisJZGlzY2FyZF9yYW5nZVswXSA9IG9mZnNldF9ieXRlczsKKwlkaXNjYXJkX3JhbmdlWzFdID0gc2l6ZV9ieXRlczsKKworCWxvZ19kZWJ1Z19kZXZzKCJEaXNjYXJkaW5nICUiIFBSSXU2NCAiIGJ5dGVzIG9mZnNldCAlIiBQUkl1NjQgIiBieXRlcyBvbiAlcy4iLAorCQkgICAgICAgc2l6ZV9ieXRlcywgb2Zmc2V0X2J5dGVzLCBkZXZfbmFtZShkZXYpKTsKKwlpZiAoaW9jdGwoZGV2LT5mZCwgQkxLRElTQ0FSRCwgJmRpc2NhcmRfcmFuZ2UpIDwgMCkgeworCQlsb2dfZXJyb3IoIiVzOiBCTEtESVNDQVJEIGlvY3RsIGF0IG9mZnNldCAlIiBQUkl1NjQgIiBzaXplICUiIFBSSXU2NCAiIGZhaWxlZDogJXMuIiwKKwkJCSAgZGV2X25hbWUoZGV2KSwgb2Zmc2V0X2J5dGVzLCBzaXplX2J5dGVzLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoIWRldl9jbG9zZShkZXYpKQorCQkJc3RhY2s7CisJCS8qIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGRpc2NhcmQgZmFpbGVkLCBzbyByZXR1cm4gc3VjY2Vzcy4gKi8KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVibGljIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBkZXZfc2l6ZV9zZXFub19pbmModm9pZCkKK3sKKwlfZGV2X3NpemVfc2Vxbm8rKzsKK30KKworaW50IGRldl9nZXRfc2l6ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90ICpzaXplKQoreworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWlmICgoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKSkKKwkJcmV0dXJuIF9kZXZfZ2V0X3NpemVfZmlsZShkZXYsIHNpemUpOworCWVsc2UKKwkJcmV0dXJuIF9kZXZfZ2V0X3NpemVfZGV2KGRldiwgc2l6ZSk7Cit9CisKK2ludCBkZXZfZ2V0X3JlYWRfYWhlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1aW50MzJfdCAqcmVhZF9haGVhZCkKK3sKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKSB7CisJCSpyZWFkX2FoZWFkID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIF9kZXZfcmVhZF9haGVhZF9kZXYoZGV2LCByZWFkX2FoZWFkKTsKK30KKworaW50IGRldl9kaXNjYXJkX2Jsb2NrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90IG9mZnNldF9ieXRlcywgdWludDY0X3Qgc2l6ZV9ieXRlcykKK3sKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBfZGV2X2Rpc2NhcmRfYmxvY2tzKGRldiwgb2Zmc2V0X2J5dGVzLCBzaXplX2J5dGVzKTsKK30KKwordm9pZCBkZXZfZmx1c2goc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghKGRldi0+ZmxhZ3MgJiBERVZfUkVHVUxBUikgJiYgaW9jdGwoZGV2LT5mZCwgQkxLRkxTQlVGLCAwKSA+PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZnN5bmMoZGV2LT5mZCkgPj0gMCkKKwkJcmV0dXJuOworCisJc3luYygpOworfQorCitpbnQgZGV2X29wZW5fZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZmxhZ3MsIGludCBkaXJlY3QsIGludCBxdWlldCkKK3sKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmVlZF9leGNsID0gMCwgbmVlZF9ydyA9IDA7CisKKwlpZiAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JEV1IpCisJCW5lZWRfcncgPSAxOworCisJaWYgKChmbGFncyAmIE9fRVhDTCkpCisJCW5lZWRfZXhjbCA9IDE7CisKKwlpZiAoZGV2LT5mZCA+PSAwKSB7CisJCWlmICgoKGRldi0+ZmxhZ3MgJiBERVZfT1BFTkVEX1JXKSB8fCAhbmVlZF9ydykgJiYKKwkJICAgICgoZGV2LT5mbGFncyAmIERFVl9PUEVORURfRVhDTCkgfHwgIW5lZWRfZXhjbCkpIHsKKwkJCWRldi0+b3Blbl9jb3VudCsrOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoZGV2LT5vcGVuX2NvdW50ICYmICFuZWVkX2V4Y2wpIHsKKwkJCWxvZ19kZWJ1Z19kZXZzKCIlcyBhbHJlYWR5IG9wZW5lZCByZWFkLW9ubHkuIFVwZ3JhZGluZyAiCisJCQkJICAgICAgICJ0byByZWFkLXdyaXRlLiIsIGRldl9uYW1lKGRldikpOworCQkJZGV2LT5vcGVuX2NvdW50Kys7CisJCX0KKworCQlkZXZfY2xvc2VfaW1tZWRpYXRlKGRldik7CisJCS8vIEZJWE1FOiBkZXYgd2l0aCBERVZfQUxMT0NFRCBpcyByZWxlYXNlZAorCQkvLyBidXQgY29kZSBpcyByZWZlcmVuY2luZyBpdAorCX0KKworCWlmIChjcml0aWNhbF9zZWN0aW9uKCkpCisJCS8qIEZJWE1FIE1ha2UgdGhpcyBsb2dfZXJyb3IgKi8KKwkJbG9nX3ZlcmJvc2UoImRldl9vcGVuKCVzKSBjYWxsZWQgd2hpbGUgc3VzcGVuZGVkIiwKKwkJCSAgICBkZXZfbmFtZShkZXYpKTsKKworCWlmICghKG5hbWUgPSBkZXZfbmFtZV9jb25maXJtZWQoZGV2LCBxdWlldCkpKQorCQlyZXR1cm5fMDsKKworI2lmZGVmIE9fRElSRUNUX1NVUFBPUlQKKwlpZiAoZGlyZWN0KSB7CisJCWlmICghKGRldi0+ZmxhZ3MgJiBERVZfT19ESVJFQ1RfVEVTVEVEKSkKKwkJCWRldi0+ZmxhZ3MgfD0gREVWX09fRElSRUNUOworCisJCWlmICgoZGV2LT5mbGFncyAmIERFVl9PX0RJUkVDVCkpCisJCQlmbGFncyB8PSBPX0RJUkVDVDsKKwl9CisjZW5kaWYKKworI2lmZGVmIE9fTk9BVElNRQorCS8qIERvbid0IHVwZGF0ZSBhdGltZSBvbiBkZXZpY2UgaW5vZGVzICovCisJaWYgKCEoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKSAmJiAhKGRldi0+ZmxhZ3MgJiBERVZfTk9UX09fTk9BVElNRSkpCisJCWZsYWdzIHw9IE9fTk9BVElNRTsKKyNlbmRpZgorCisJaWYgKChkZXYtPmZkID0gb3BlbihuYW1lLCBmbGFncywgMDc3NykpIDwgMCkgeworI2lmZGVmIE9fTk9BVElNRQorCQlpZiAoKGVycm5vID09IEVQRVJNKSAmJiAoZmxhZ3MgJiBPX05PQVRJTUUpKSB7CisJCQlmbGFncyAmPSB+T19OT0FUSU1FOworCQkJZGV2LT5mbGFncyB8PSBERVZfTk9UX09fTk9BVElNRTsKKwkJCWlmICgoZGV2LT5mZCA9IG9wZW4obmFtZSwgZmxhZ3MsIDA3NzcpKSA+PSAwKSB7CisJCQkJbG9nX2RlYnVnX2RldnMoIiVzOiBOb3QgdXNpbmcgT19OT0FUSU1FIiwgbmFtZSk7CisJCQkJZ290byBvcGVuZWQ7CisJCQl9CisJCX0KKyNlbmRpZgorCisjaWZkZWYgT19ESVJFQ1RfU1VQUE9SVAorCQlpZiAoZGlyZWN0ICYmICEoZGV2LT5mbGFncyAmIERFVl9PX0RJUkVDVF9URVNURUQpKSB7CisJCQlmbGFncyAmPSB+T19ESVJFQ1Q7CisJCQlpZiAoKGRldi0+ZmQgPSBvcGVuKG5hbWUsIGZsYWdzLCAwNzc3KSkgPj0gMCkgeworCQkJCWRldi0+ZmxhZ3MgJj0gfkRFVl9PX0RJUkVDVDsKKwkJCQlsb2dfZGVidWdfZGV2cygiJXM6IE5vdCB1c2luZyBPX0RJUkVDVCIsIG5hbWUpOworCQkJCWdvdG8gb3BlbmVkOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKHF1aWV0KQorCQkJbG9nX3N5c19kZWJ1Zygib3BlbiIsIG5hbWUpOworCQllbHNlCisJCQlsb2dfc3lzX2Vycm9yKCJvcGVuIiwgbmFtZSk7CisKKwkJZGV2LT5mbGFncyB8PSBERVZfT1BFTl9GQUlMVVJFOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBPX0RJUkVDVF9TVVBQT1JUCisgICAgICBvcGVuZWQ6CisJaWYgKGRpcmVjdCkKKwkJZGV2LT5mbGFncyB8PSBERVZfT19ESVJFQ1RfVEVTVEVEOworI2VuZGlmCisJZGV2LT5vcGVuX2NvdW50Kys7CisJZGV2LT5mbGFncyAmPSB+REVWX0FDQ0VTU0VEX1c7CisKKwlpZiAobmVlZF9ydykKKwkJZGV2LT5mbGFncyB8PSBERVZfT1BFTkVEX1JXOworCWVsc2UKKwkJZGV2LT5mbGFncyAmPSB+REVWX09QRU5FRF9SVzsKKworCWlmIChuZWVkX2V4Y2wpCisJCWRldi0+ZmxhZ3MgfD0gREVWX09QRU5FRF9FWENMOworCWVsc2UKKwkJZGV2LT5mbGFncyAmPSB+REVWX09QRU5FRF9FWENMOworCisJaWYgKCEoZGV2LT5mbGFncyAmIERFVl9SRUdVTEFSKSAmJgorCSAgICAoKGZzdGF0KGRldi0+ZmQsICZidWYpIDwgMCkgfHwgKGJ1Zi5zdF9yZGV2ICE9IGRldi0+ZGV2KSkpIHsKKwkJbG9nX2Vycm9yKCIlczogZnN0YXQgZmFpbGVkOiBIYXMgZGV2aWNlIG5hbWUgY2hhbmdlZD8iLCBuYW1lKTsKKwkJZGV2X2Nsb3NlX2ltbWVkaWF0ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZm5kZWYgT19ESVJFQ1RfU1VQUE9SVAorCWlmICghKGRldi0+ZmxhZ3MgJiBERVZfUkVHVUxBUikpCisJCWRldl9mbHVzaChkZXYpOworI2VuZGlmCisKKwlpZiAoKGZsYWdzICYgT19DUkVBVCkgJiYgIShmbGFncyAmIE9fVFJVTkMpKQorCQlkZXYtPmVuZCA9IGxzZWVrKGRldi0+ZmQsIChvZmZfdCkgMCwgU0VFS19FTkQpOworCisJZG1fbGlzdF9hZGQoJl9vcGVuX2RldmljZXMsICZkZXYtPm9wZW5fbGlzdCk7CisKKwlsb2dfZGVidWdfZGV2cygiT3BlbmVkICVzICVzJXMlcyIsIGRldl9uYW1lKGRldiksCisJCSAgICAgICBkZXYtPmZsYWdzICYgREVWX09QRU5FRF9SVyA/ICJSVyIgOiAiUk8iLAorCQkgICAgICAgZGV2LT5mbGFncyAmIERFVl9PUEVORURfRVhDTCA/ICIgT19FWENMIiA6ICIiLAorCQkgICAgICAgZGV2LT5mbGFncyAmIERFVl9PX0RJUkVDVCA/ICIgT19ESVJFQ1QiIDogIiIpOworCisJZGV2LT5mbGFncyAmPSB+REVWX09QRU5fRkFJTFVSRTsKKwlyZXR1cm4gMTsKK30KKworaW50IGRldl9vcGVuX3F1aWV0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X29wZW5fZmxhZ3MoZGV2LCBPX1JEV1IsIDEsIDEpOworfQorCitpbnQgZGV2X29wZW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZfb3Blbl9mbGFncyhkZXYsIE9fUkRXUiwgMSwgMCk7Cit9CisKK2ludCBkZXZfb3Blbl9yZWFkb25seShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl9vcGVuX2ZsYWdzKGRldiwgT19SRE9OTFksIDEsIDApOworfQorCitpbnQgZGV2X29wZW5fcmVhZG9ubHlfYnVmZmVyZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZfb3Blbl9mbGFncyhkZXYsIE9fUkRPTkxZLCAwLCAwKTsKK30KKworaW50IGRldl9vcGVuX3JlYWRvbmx5X3F1aWV0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X29wZW5fZmxhZ3MoZGV2LCBPX1JET05MWSwgMSwgMSk7Cit9CisKK2ludCBkZXZfdGVzdF9leGNsKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZmxhZ3M7CisJaW50IHI7CisKKwlmbGFncyA9IHZnX3dyaXRlX2xvY2tfaGVsZCgpID8gT19SRFdSIDogT19SRE9OTFk7CisJZmxhZ3MgfD0gT19FWENMOworCisJciA9IGRldl9vcGVuX2ZsYWdzKGRldiwgZmxhZ3MsIDEsIDEpOworCWlmIChyKQorCQlkZXZfY2xvc2VfaW1tZWRpYXRlKGRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX2Nsb3NlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoY2xvc2UoZGV2LT5mZCkpCisJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgZGV2X25hbWUoZGV2KSk7CisJZGV2LT5mZCA9IC0xOworCWRldi0+cGh5c19ibG9ja19zaXplID0gLTE7CisJZGV2LT5ibG9ja19zaXplID0gLTE7CisJZG1fbGlzdF9kZWwoJmRldi0+b3Blbl9saXN0KTsKKworCWxvZ19kZWJ1Z19kZXZzKCJDbG9zZWQgJXMiLCBkZXZfbmFtZShkZXYpKTsKKworCWlmIChkZXYtPmZsYWdzICYgREVWX0FMTE9DRUQpCisJCWRldl9kZXN0cm95X2ZpbGUoZGV2KTsKK30KKworc3RhdGljIGludCBfZGV2X2Nsb3NlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGltbWVkaWF0ZSkKK3sKKworCWlmIChkZXYtPmZkIDwgMCkgeworCQlsb2dfZXJyb3IoIkF0dGVtcHQgdG8gY2xvc2UgZGV2aWNlICclcycgIgorCQkJICAid2hpY2ggaXMgbm90IG9wZW4uIiwgZGV2X25hbWUoZGV2KSk7CisJCXJldHVybiAwOworCX0KKworI2lmbmRlZiBPX0RJUkVDVF9TVVBQT1JUCisJaWYgKGRldi0+ZmxhZ3MgJiBERVZfQUNDRVNTRURfVykKKwkJZGV2X2ZsdXNoKGRldik7CisjZW5kaWYKKworCWlmIChkZXYtPm9wZW5fY291bnQgPiAwKQorCQlkZXYtPm9wZW5fY291bnQtLTsKKworCWlmIChpbW1lZGlhdGUgJiYgZGV2LT5vcGVuX2NvdW50KQorCQlsb2dfZGVidWdfZGV2cygiJXM6IEltbWVkaWF0ZSBjbG9zZSBhdHRlbXB0IHdoaWxlIHN0aWxsIHJlZmVyZW5jZWQiLAorCQkJICAgICAgIGRldl9uYW1lKGRldikpOworCisJLyogQ2xvc2UgdW5sZXNzIGRldmljZSBpcyBrbm93biB0byBiZWxvbmcgdG8gYSBsb2NrZWQgVkcgKi8KKwlpZiAoaW1tZWRpYXRlIHx8CisJICAgIChkZXYtPm9wZW5fY291bnQgPCAxICYmICFsdm1jYWNoZV9wdmlkX2lzX2xvY2tlZChkZXYtPnB2aWQpKSkKKwkJX2Nsb3NlKGRldik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRldl9jbG9zZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9kZXZfY2xvc2UoZGV2LCAwKTsKK30KKworaW50IGRldl9jbG9zZV9pbW1lZGlhdGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfZGV2X2Nsb3NlKGRldiwgMSk7Cit9CisKK3ZvaWQgZGV2X2Nsb3NlX2FsbCh2b2lkKQoreworCXN0cnVjdCBkbV9saXN0ICpkb2gsICpkb2h0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGRvaCwgZG9odCwgJl9vcGVuX2RldmljZXMpIHsKKwkJZGV2ID0gZG1fbGlzdF9zdHJ1Y3RfYmFzZShkb2gsIHN0cnVjdCBkZXZpY2UsIG9wZW5fbGlzdCk7CisJCWlmIChkZXYtPm9wZW5fY291bnQgPCAxKQorCQkJX2Nsb3NlKGRldik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfZGV2X2lzX3ZhbGlkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+bWF4X2Vycm9yX2NvdW50ID09IE5PX0RFVl9FUlJPUl9DT1VOVF9MSU1JVCB8fAorCQlkZXYtPmVycm9yX2NvdW50IDwgZGV2LT5tYXhfZXJyb3JfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBfZGV2X2luY19lcnJvcl9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCsrZGV2LT5lcnJvcl9jb3VudCA9PSBkZXYtPm1heF9lcnJvcl9jb3VudCkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEVycm9yIGNvdW50cyByZWFjaGVkIGEgbGltaXQgb2YgJWQuICIKKwkJCSAiRGV2aWNlICVzIHdhcyBkaXNhYmxlZCIsCisJCQkgZGV2LT5tYXhfZXJyb3JfY291bnQsIGRldl9uYW1lKGRldikpOworfQorCitpbnQgZGV2X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQsIHNpemVfdCBsZW4sIHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2FyZWEgd2hlcmU7CisJaW50IHJldDsKKworCWlmICghZGV2LT5vcGVuX2NvdW50KQorCQlyZXR1cm5fMDsKKworCWlmICghX2Rldl9pc192YWxpZChkZXYpKQorCQlyZXR1cm4gMDsKKworCXdoZXJlLmRldiA9IGRldjsKKwl3aGVyZS5zdGFydCA9IG9mZnNldDsKKwl3aGVyZS5zaXplID0gbGVuOworCisJLy8gZnByaW50ZihzdGRlcnIsICJSRUFEOiAlcywgJWxsZCwgJWRcbiIsIGRldl9uYW1lKGRldiksIG9mZnNldCwgbGVuKTsKKworCXJldCA9IF9hbGlnbmVkX2lvKCZ3aGVyZSwgYnVmZmVyLCAwKTsKKwlpZiAoIXJldCkKKwkJX2Rldl9pbmNfZXJyb3JfY291bnQoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gJ2RldicgaW50byAnYnVmJywgcG9zc2libHkgaW4gMiBkaXN0aW5jdCByZWdpb25zLCBkZW5vdGVkCisgKiBieSAob2Zmc2V0LGxlbikgYW5kIChvZmZzZXQyLGxlbjIpLiAgVGh1cywgdGhlIHRvdGFsIHNpemUgb2YKKyAqICdidWYnIHNob3VsZCBiZSBsZW4rbGVuMi4KKyAqLworaW50IGRldl9yZWFkX2NpcmN1bGFyKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3Qgb2Zmc2V0LCBzaXplX3QgbGVuLAorCQkgICAgICB1aW50NjRfdCBvZmZzZXQyLCBzaXplX3QgbGVuMiwgY2hhciAqYnVmKQoreworCWlmICghZGV2X3JlYWQoZGV2LCBvZmZzZXQsIGxlbiwgYnVmKSkgeworCQlsb2dfZXJyb3IoIlJlYWQgZnJvbSAlcyBmYWlsZWQiLCBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGUgc2Vjb25kIHJlZ2lvbiBpcyBvcHRpb25hbCwgYW5kIGFsbG93cyBmb3IKKwkgKiBhIGNpcmN1bGFyIGJ1ZmZlciBvbiB0aGUgZGV2aWNlLgorCSAqLworCWlmICghbGVuMikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWRldl9yZWFkKGRldiwgb2Zmc2V0MiwgbGVuMiwgYnVmICsgbGVuKSkgeworCQlsb2dfZXJyb3IoIkNpcmN1bGFyIHJlYWQgZnJvbSAlcyBmYWlsZWQiLAorCQkJICBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEZJWE1FIElmIE9fRElSRUNUIGNhbid0IGV4dGVuZCBmaWxlLCBkZXZfZXh0ZW5kIGZpcnN0OyBkZXZfdHJ1bmNhdGUgYWZ0ZXIuCisgKiAgICAgICBCdXQgZmFpbHMgaWYgY29uY3VycmVudCBwcm9jZXNzZXMgd3JpdGluZworICovCisKKy8qIEZJWE1FIHByZS1leHRlbmQgdGhlIGZpbGUgKi8KK2ludCBkZXZfYXBwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IGxlbiwgY2hhciAqYnVmZmVyKQoreworCWludCByOworCisJaWYgKCFkZXYtPm9wZW5fY291bnQpCisJCXJldHVybl8wOworCisJciA9IGRldl93cml0ZShkZXYsIGRldi0+ZW5kLCBsZW4sIGJ1ZmZlcik7CisJZGV2LT5lbmQgKz0gKHVpbnQ2NF90KSBsZW47CisKKyNpZm5kZWYgT19ESVJFQ1RfU1VQUE9SVAorCWRldl9mbHVzaChkZXYpOworI2VuZGlmCisJcmV0dXJuIHI7Cit9CisKK2ludCBkZXZfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQsIHNpemVfdCBsZW4sIHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2FyZWEgd2hlcmU7CisJaW50IHJldDsKKworCWlmICghZGV2LT5vcGVuX2NvdW50KQorCQlyZXR1cm5fMDsKKworCWlmICghX2Rldl9pc192YWxpZChkZXYpKQorCQlyZXR1cm4gMDsKKworCXdoZXJlLmRldiA9IGRldjsKKwl3aGVyZS5zdGFydCA9IG9mZnNldDsKKwl3aGVyZS5zaXplID0gbGVuOworCisJZGV2LT5mbGFncyB8PSBERVZfQUNDRVNTRURfVzsKKworCXJldCA9IF9hbGlnbmVkX2lvKCZ3aGVyZSwgYnVmZmVyLCAxKTsKKwlpZiAoIXJldCkKKwkJX2Rldl9pbmNfZXJyb3JfY291bnQoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkZXZfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBpbnQgdmFsdWUpCit7CisJc2l6ZV90IHM7CisJY2hhciBidWZmZXJbNDA5Nl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKCFkZXZfb3BlbihkZXYpKQorCQlyZXR1cm5fMDsKKworCWlmICgob2Zmc2V0ICUgU0VDVE9SX1NJWkUpIHx8IChsZW4gJSBTRUNUT1JfU0laRSkpCisJCWxvZ19kZWJ1Z19kZXZzKCJXaXBpbmcgJXMgYXQgJSIgUFJJdTY0ICIgbGVuZ3RoICUiIFBSSXNpemVfdCwKKwkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBvZmZzZXQsIGxlbik7CisJZWxzZQorCQlsb2dfZGVidWdfZGV2cygiV2lwaW5nICVzIGF0IHNlY3RvciAlIiBQUkl1NjQgIiBsZW5ndGggJSIgUFJJc2l6ZV90CisJCQkgICAgICAgIiBzZWN0b3JzIiwgZGV2X25hbWUoZGV2KSwgb2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCwKKwkJCSAgICAgICBsZW4gPj4gU0VDVE9SX1NISUZUKTsKKworCW1lbXNldChidWZmZXIsIHZhbHVlLCBzaXplb2YoYnVmZmVyKSk7CisJd2hpbGUgKDEpIHsKKwkJcyA9IGxlbiA+IHNpemVvZihidWZmZXIpID8gc2l6ZW9mKGJ1ZmZlcikgOiBsZW47CisJCWlmICghZGV2X3dyaXRlKGRldiwgb2Zmc2V0LCBzLCBidWZmZXIpKQorCQkJYnJlYWs7CisKKwkJbGVuIC09IHM7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ICs9IHM7CisJfQorCisJZGV2LT5mbGFncyB8PSBERVZfQUNDRVNTRURfVzsKKworCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJcmV0dXJuIChsZW4gPT0gMCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2Rldi1sdWtzLmMgYi9saWIvZGV2aWNlL2Rldi1sdWtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwNzBiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LWx1a3MuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkZXYtdHlwZS5oIgorCisjZGVmaW5lIExVS1NfU0lHTkFUVVJFICJMVUtTXHhiYVx4YmUiCisjZGVmaW5lIExVS1NfU0lHTkFUVVJFX1NJWkUgNgorCitpbnQgZGV2X2lzX2x1a3Moc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCAqb2Zmc2V0X2ZvdW5kKQoreworCWNoYXIgYnVmW0xVS1NfU0lHTkFUVVJFX1NJWkVdOworCWludCByZXQgPSAtMTsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkgeworCQlzdGFjazsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvZmZzZXRfZm91bmQpCisJCSpvZmZzZXRfZm91bmQgPSAwOworCisJaWYgKCFkZXZfcmVhZChkZXYsIDAsIExVS1NfU0lHTkFUVVJFX1NJWkUsIGJ1ZikpCisJCWdvdG9fb3V0OworCisJcmV0ID0gbWVtY21wKGJ1ZiwgTFVLU19TSUdOQVRVUkUsIExVS1NfU0lHTkFUVVJFX1NJWkUpID8gMCA6IDE7CisKK291dDoKKwlpZiAoIWRldl9jbG9zZShkZXYpKQorCQlzdGFjazsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2Rldi1tZC5jIGIvbGliL2RldmljZS9kZXYtbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJlODMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RldmljZS9kZXYtbWQuYwpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBMdWNhIEJlcnJhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGV2LXR5cGUuaCIKKyNpbmNsdWRlICJ4bGF0ZS5oIgorI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCisjaW5jbHVkZSA8bGlidWRldi5oPiAvKiBmb3IgTUQgZGV0ZWN0aW9uIHVzaW5nIHVkZXYgZGIgcmVjb3JkcyAqLworI2luY2x1ZGUgImRldi1leHQtdWRldi1jb25zdGFudHMuaCIKKyNlbmRpZgorCisjaWZkZWYgX19saW51eF9fCisKKy8qIExpZnRlZCBmcm9tIDxsaW51eC9yYWlkL21kX3AuaD4gYmVjYXVzZSBvZiBkaWZmaWN1bHR5IGluY2x1ZGluZyBpdCAqLworCisjZGVmaW5lIE1EX1NCX01BR0lDIDB4YTkyYjRlZmMKKyNkZWZpbmUgTURfUkVTRVJWRURfQllURVMgKDY0ICogMTAyNFVMTCkKKyNkZWZpbmUgTURfUkVTRVJWRURfU0VDVE9SUyAoTURfUkVTRVJWRURfQllURVMgLyA1MTIpCisjZGVmaW5lIE1EX05FV19TSVpFX1NFQ1RPUlMoeCkgKCh4ICYgfihNRF9SRVNFUlZFRF9TRUNUT1JTIC0gMSkpIFwKKwkJCQktIE1EX1JFU0VSVkVEX1NFQ1RPUlMpCisjZGVmaW5lIE1EX01BWF9TWVNGU19TSVpFIDY0CisKK3N0YXRpYyBpbnQgX2Rldl9oYXNfbWRfbWFnaWMoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBzYl9vZmZzZXQpCit7CisJdWludDMyX3QgbWRfbWFnaWM7CisKKwkvKiBWZXJzaW9uIDEgaXMgbGl0dGxlIGVuZGlhbjsgdmVyc2lvbiAwLjkwLjAgaXMgbWFjaGluZSBlbmRpYW4gKi8KKwlpZiAoZGV2X3JlYWQoZGV2LCBzYl9vZmZzZXQsIHNpemVvZih1aW50MzJfdCksICZtZF9tYWdpYykgJiYKKwkgICAgKChtZF9tYWdpYyA9PSBNRF9TQl9NQUdJQykgfHwKKwkgICAgICgoTURfU0JfTUFHSUMgIT0geGxhdGUzMihNRF9TQl9NQUdJQykpICYmIChtZF9tYWdpYyA9PSB4bGF0ZTMyKE1EX1NCX01BR0lDKSkpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHN1cGVyYmxvY2suCisgKiBJdCBpcyBhbHdheXMgYWxpZ25lZCB0byBhIDRLIGJvdW5kYXJ5IGFuZAorICogZGVwZW5kaW5nIG9uIG1pbm9yX3ZlcnNpb24sIGl0IGNhbiBiZToKKyAqIDA6IEF0IGxlYXN0IDhLLCBidXQgbGVzcyB0aGFuIDEySywgZnJvbSBlbmQgb2YgZGV2aWNlCisgKiAxOiBBdCBzdGFydCBvZiBkZXZpY2UKKyAqIDI6IDRLIGZyb20gc3RhcnQgb2YgZGV2aWNlLgorICovCit0eXBlZGVmIGVudW0geworCU1EX01JTk9SX1ZFUlNJT05fTUlOLAorCU1EX01JTk9SX1YwID0gTURfTUlOT1JfVkVSU0lPTl9NSU4sCisJTURfTUlOT1JfVjEsCisJTURfTUlOT1JfVjIsCisJTURfTUlOT1JfVkVSU0lPTl9NQVggPSBNRF9NSU5PUl9WMgorfSBtZF9taW5vcl92ZXJzaW9uX3Q7CisKK3N0YXRpYyB1aW50NjRfdCBfdjFfc2Jfb2Zmc2V0KHVpbnQ2NF90IHNpemUsIG1kX21pbm9yX3ZlcnNpb25fdCBtaW5vcl92ZXJzaW9uKQoreworCXVpbnQ2NF90IHNiX29mZnNldDsKKworCXN3aXRjaChtaW5vcl92ZXJzaW9uKSB7CisJY2FzZSBNRF9NSU5PUl9WMDoKKwkJc2Jfb2Zmc2V0ID0gKHNpemUgLSA4ICogMikgJiB+KDQgKiAyIC0gMVVMTCk7CisJCWJyZWFrOworCWNhc2UgTURfTUlOT1JfVjE6CisJCXNiX29mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgTURfTUlOT1JfVjI6CisJCXNiX29mZnNldCA9IDQgKiAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfd2FybihJTlRFUk5BTF9FUlJPUiAiV0FSTklORzogVW5rbm93biBtaW5vciB2ZXJzaW9uICVkLiIsCisJCQkgbWlub3JfdmVyc2lvbik7CisJCXJldHVybiAwOworCX0KKwlzYl9vZmZzZXQgPDw9IFNFQ1RPUl9TSElGVDsKKworCXJldHVybiBzYl9vZmZzZXQ7Cit9CisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorc3RhdGljIGludCBfdWRldl9kZXZfaXNfbWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKnZhbHVlOworCXN0cnVjdCBkZXZfZXh0ICpleHQ7CisKKwlpZiAoIShleHQgPSBkZXZfZXh0X2dldChkZXYpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoISh2YWx1ZSA9IHVkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV92YWx1ZSgoc3RydWN0IHVkZXZfZGV2aWNlICopZXh0LT5oYW5kbGUsIERFVl9FWFRfVURFVl9CTEtJRF9UWVBFKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuICFzdHJjbXAodmFsdWUsIERFVl9FWFRfVURFVl9CTEtJRF9UWVBFX1NXX1JBSUQpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgX3VkZXZfZGV2X2lzX21kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJucyAtMSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9uYXRpdmVfZGV2X2lzX21kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKm9mZnNldF9mb3VuZCkKK3sKKwlpbnQgcmV0ID0gMTsKKwltZF9taW5vcl92ZXJzaW9uX3QgbWlub3I7CisJdWludDY0X3Qgc2l6ZSwgc2Jfb2Zmc2V0OworCisJaWYgKCFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpIHsKKwkJc3RhY2s7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2l6ZSA8IE1EX1JFU0VSVkVEX1NFQ1RPUlMgKiAyKQorCQlyZXR1cm4gMDsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkgeworCQlzdGFjazsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGlmIGl0IGlzIGFuIG1kIGNvbXBvbmVudCBkZXZpY2UuICovCisJLyogVmVyc2lvbiAwLjkwLjAgKi8KKwlzYl9vZmZzZXQgPSBNRF9ORVdfU0laRV9TRUNUT1JTKHNpemUpIDw8IFNFQ1RPUl9TSElGVDsKKwlpZiAoX2Rldl9oYXNfbWRfbWFnaWMoZGV2LCBzYl9vZmZzZXQpKQorCQlnb3RvIG91dDsKKworCW1pbm9yID0gTURfTUlOT1JfVkVSU0lPTl9NSU47CisJLyogVmVyc2lvbiAxLCB0cnkgdjEuMCAtPiB2MS4yICovCisJZG8geworCQlzYl9vZmZzZXQgPSBfdjFfc2Jfb2Zmc2V0KHNpemUsIG1pbm9yKTsKKwkJaWYgKF9kZXZfaGFzX21kX21hZ2ljKGRldiwgc2Jfb2Zmc2V0KSkKKwkJCWdvdG8gb3V0OworCX0gd2hpbGUgKCsrbWlub3IgPD0gTURfTUlOT1JfVkVSU0lPTl9NQVgpOworCisJcmV0ID0gMDsKKworb3V0OgorCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJaWYgKHJldCAmJiBvZmZzZXRfZm91bmQpCisJCSpvZmZzZXRfZm91bmQgPSBzYl9vZmZzZXQ7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZGV2X2lzX21kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKm9mZnNldF9mb3VuZCkKK3sKKworCS8qCisJICogSWYgbm9uLW5hdGl2ZSBkZXZpY2Ugc3RhdHVzIHNvdXJjZSBpcyBzZWxlY3RlZCwgdXNlIGl0CisJICogb25seSBpZiBvZmZzZXRfZm91bmQgaXMgbm90IHJlcXVlc3RlZCBhcyB0aGlzCisJICogaW5mb3JtYXRpb24gaXMgbm90IGluIHVkZXYgZGIuCisJICovCisJaWYgKChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9OT05FKSB8fCBvZmZzZXRfZm91bmQpCisJCXJldHVybiBfbmF0aXZlX2Rldl9pc19tZChkZXYsIG9mZnNldF9mb3VuZCk7CisKKwlpZiAoZGV2LT5leHQuc3JjID09IERFVl9FWFRfVURFVikKKwkJcmV0dXJuIF91ZGV2X2Rldl9pc19tZChkZXYpOworCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNaXNzaW5nIGhvb2sgZm9yIE1EIGRldmljZSByZWNvZ25pdGlvbiAiCisJCSAgInVzaW5nIGV4dGVybmFsIGRldmljZSBpbmZvIHNvdXJjZSAlcyIsIGRldl9leHRfbmFtZShkZXYpKTsKKworCXJldHVybiAtMTsKKworfQorCitzdGF0aWMgaW50IF9tZF9zeXNmc19hdHRyaWJ1dGVfc25wcmludGYoY2hhciAqcGF0aCwgc2l6ZV90IHNpemUsCisJCQkJCXN0cnVjdCBkZXZfdHlwZXMgKmR0LAorCQkJCQlzdHJ1Y3QgZGV2aWNlICpibGtkZXYsCisJCQkJCWNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKwljb25zdCBjaGFyICpzeXNmc19kaXIgPSBkbV9zeXNmc19kaXIoKTsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCWRldl90IGRldiA9IGJsa2Rldi0+ZGV2OworCWludCByZXQgPSAtMTsKKworCWlmICghc3lzZnNfZGlyIHx8ICEqc3lzZnNfZGlyKQorCQlyZXR1cm4gcmV0OworCisJaWYgKE1BSk9SKGRldikgPT0gZHQtPmJsa2V4dF9tYWpvcikgeworCQkvKiBsb29rdXAgcGFyZW50IE1EIGRldmljZSBmcm9tIGJsa2V4dCBwYXJ0aXRpb24gKi8KKwkJaWYgKCFkZXZfZ2V0X3ByaW1hcnlfZGV2KGR0LCBibGtkZXYsICZkZXYpKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoTUFKT1IoZGV2KSAhPSBkdC0+bWRfbWFqb3IpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkbV9zbnByaW50ZihwYXRoLCBzaXplLCAiJXMvZGV2L2Jsb2NrLyVkOiVkL21kLyVzIiwgc3lzZnNfZGlyLAorCQkJICAoaW50KU1BSk9SKGRldiksIChpbnQpTUlOT1IoZGV2KSwgYXR0cmlidXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlsb2dfZXJyb3IoImRtX3NucHJpbnRmIG1kICVzIGZhaWxlZCIsIGF0dHJpYnV0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHN0YXQocGF0aCwgJmluZm8pID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWxvZ19zeXNfZXJyb3IoInN0YXQiLCBwYXRoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJLyogb2xkIHN5c2ZzIHN0cnVjdHVyZSAqLworCQlyZXQgPSBkbV9zbnByaW50ZihwYXRoLCBzaXplLCAiJXMvYmxvY2svbWQlZC9tZC8lcyIsCisJCQkJICBzeXNmc19kaXIsIChpbnQpTUlOT1IoZGV2KSwgYXR0cmlidXRlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWxvZ19lcnJvcigiZG1fc25wcmludGYgb2xkIG1kICVzIGZhaWxlZCIsIGF0dHJpYnV0ZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfbWRfc3lzZnNfYXR0cmlidXRlX3NjYW5mKHN0cnVjdCBkZXZfdHlwZXMgKmR0LAorCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgY29uc3QgY2hhciAqYXR0cmlidXRlX25hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICphdHRyaWJ1dGVfZm10LAorCQkJCSAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbHVlKQoreworCWNoYXIgcGF0aFtQQVRIX01BWCsxXSwgYnVmZmVyW01EX01BWF9TWVNGU19TSVpFXTsKKwlGSUxFICpmcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChfbWRfc3lzZnNfYXR0cmlidXRlX3NucHJpbnRmKHBhdGgsIFBBVEhfTUFYLCBkdCwKKwkJCQkJIGRldiwgYXR0cmlidXRlX25hbWUpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGZwID0gZm9wZW4ocGF0aCwgInIiKSkpIHsKKwkJbG9nX3N5c19lcnJvcigiZm9wZW4iLCBwYXRoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZwKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmZ2V0cyIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHJldCA9IHNzY2FuZihidWZmZXIsIGF0dHJpYnV0ZV9mbXQsIGF0dHJpYnV0ZV92YWx1ZSkpICE9IDEpIHsKKwkJbG9nX2Vycm9yKCIlcyBzeXNmcyBhdHRyICVzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXQ6ICVzIiwKKwkJCSAgZGV2X25hbWUoZGV2KSwgYXR0cmlidXRlX25hbWUsIGJ1ZmZlcik7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWlmIChmY2xvc2UoZnApKQorCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBwYXRoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSBjaHVuayBzaXplIGZyb20gbWQgZGV2aWNlIHVzaW5nIHN5c2ZzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZXZfbWRfY2h1bmtfc2l6ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKmF0dHJpYnV0ZSA9ICJjaHVua19zaXplIjsKKwl1bnNpZ25lZCBsb25nIGNodW5rX3NpemVfYnl0ZXMgPSAwVUw7CisKKwlpZiAoX21kX3N5c2ZzX2F0dHJpYnV0ZV9zY2FuZihkdCwgZGV2LCBhdHRyaWJ1dGUsCisJCQkJICAgICAgIiVsdSIsICZjaHVua19zaXplX2J5dGVzKSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkRldmljZSAlcyAlcyBpcyAlbHUgYnl0ZXMuIiwKKwkJCSBkZXZfbmFtZShkZXYpLCBhdHRyaWJ1dGUsIGNodW5rX3NpemVfYnl0ZXMpOworCisJcmV0dXJuIGNodW5rX3NpemVfYnl0ZXMgPj4gU0VDVE9SX1NISUZUOworfQorCisvKgorICogUmV0cmlldmUgbGV2ZWwgZnJvbSBtZCBkZXZpY2UgdXNpbmcgc3lzZnMuCisgKi8KK3N0YXRpYyBpbnQgZGV2X21kX2xldmVsKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY2hhciBsZXZlbF9zdHJpbmdbTURfTUFYX1NZU0ZTX1NJWkVdOworCWNvbnN0IGNoYXIgKmF0dHJpYnV0ZSA9ICJsZXZlbCI7CisJaW50IGxldmVsID0gLTE7CisKKwlpZiAoX21kX3N5c2ZzX2F0dHJpYnV0ZV9zY2FuZihkdCwgZGV2LCBhdHRyaWJ1dGUsCisJCQkJICAgICAgIiVzIiwgJmxldmVsX3N0cmluZykgIT0gMSkKKwkJcmV0dXJuIC0xOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiRGV2aWNlICVzICVzIGlzICVzLiIsCisJCQkgZGV2X25hbWUoZGV2KSwgYXR0cmlidXRlLCBsZXZlbF9zdHJpbmcpOworCisJLyogIFdlIG9ubHkgY2FyZSBhYm91dCByYWlkIC0gaWdub3JlIGxpbmVhci9mYXVsdHkvbXVsdGlwYXRoIGV0Yy4gKi8KKwlpZiAoc3NjYW5mKGxldmVsX3N0cmluZywgInJhaWQlZCIsICZsZXZlbCkgIT0gMSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGxldmVsOworfQorCisvKgorICogUmV0cmlldmUgcmFpZF9kaXNrcyBmcm9tIG1kIGRldmljZSB1c2luZyBzeXNmcy4KKyAqLworc3RhdGljIGludCBkZXZfbWRfcmFpZF9kaXNrcyhzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKmF0dHJpYnV0ZSA9ICJyYWlkX2Rpc2tzIjsKKwlpbnQgcmFpZF9kaXNrcyA9IDA7CisKKwlpZiAoX21kX3N5c2ZzX2F0dHJpYnV0ZV9zY2FuZihkdCwgZGV2LCBhdHRyaWJ1dGUsCisJCQkJICAgICAgIiVkIiwgJnJhaWRfZGlza3MpICE9IDEpCisJCXJldHVybiAwOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiRGV2aWNlICVzICVzIGlzICVkLiIsCisJCQkgZGV2X25hbWUoZGV2KSwgYXR0cmlidXRlLCByYWlkX2Rpc2tzKTsKKworCXJldHVybiByYWlkX2Rpc2tzOworfQorCisvKgorICogQ2FsY3VsYXRlIHN0cmlwZSB3aWR0aCBvZiBtZCBkZXZpY2UgdXNpbmcgaXRzIHN5c2ZzIGZpbGVzLgorICovCit1bnNpZ25lZCBsb25nIGRldl9tZF9zdHJpcGVfd2lkdGgoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGNodW5rX3NpemVfc2VjdG9ycyA9IDBVTDsKKwl1bnNpZ25lZCBsb25nIHN0cmlwZV93aWR0aF9zZWN0b3JzID0gMFVMOworCWludCBsZXZlbCwgcmFpZF9kaXNrcywgZGF0YV9kaXNrczsKKworCWNodW5rX3NpemVfc2VjdG9ycyA9IGRldl9tZF9jaHVua19zaXplKGR0LCBkZXYpOworCWlmICghY2h1bmtfc2l6ZV9zZWN0b3JzKQorCQlyZXR1cm4gMDsKKworCWxldmVsID0gZGV2X21kX2xldmVsKGR0LCBkZXYpOworCWlmIChsZXZlbCA8IDApCisJCXJldHVybiAwOworCisJcmFpZF9kaXNrcyA9IGRldl9tZF9yYWlkX2Rpc2tzKGR0LCBkZXYpOworCWlmICghcmFpZF9kaXNrcykKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGUgcmFpZCBsZXZlbCBnb3Zlcm5zIHRoZSBudW1iZXIgb2YgZGF0YSBkaXNrcy4gKi8KKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSAwOgorCQkvKiBzdHJpcGVkIG1kIGRvZXMgbm90IGhhdmUgYW55IHBhcml0eSBkaXNrcyAqLworCQlkYXRhX2Rpc2tzID0gcmFpZF9kaXNrczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMTA6CisJCS8qIG1pcnJvcmVkIG1kIGVmZmVjdGl2ZWx5IGhhcyAxIGRhdGEgZGlzayAqLworCQlkYXRhX2Rpc2tzID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJLyogYm90aCByYWlkIDQgYW5kIDUgaGF2ZSBhIHNpbmdsZSBwYXJpdHkgZGlzayAqLworCQlkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDE7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJLyogcmFpZCA2IGhhcyAyIHBhcml0eSBkaXNrcyAqLworCQlkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiRGV2aWNlICVzIGhhcyBhbiB1bmtub3duIG1kIHJhaWQgbGV2ZWw6ICVkIiwKKwkJCSAgZGV2X25hbWUoZGV2KSwgbGV2ZWwpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdHJpcGVfd2lkdGhfc2VjdG9ycyA9IGNodW5rX3NpemVfc2VjdG9ycyAqIGRhdGFfZGlza3M7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJEZXZpY2UgJXMgc3RyaXBlLXdpZHRoIGlzICVsdSBieXRlcy4iLAorCQkJIGRldl9uYW1lKGRldiksCisJCQkgc3RyaXBlX3dpZHRoX3NlY3RvcnMgPDwgU0VDVE9SX1NISUZUKTsKKworCXJldHVybiBzdHJpcGVfd2lkdGhfc2VjdG9yczsKK30KKworI2Vsc2UKKworaW50IGRldl9pc19tZChzdHJ1Y3QgZGV2aWNlICpkZXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgICAgdWludDY0X3QgKnNiIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGRldl9tZF9zdHJpcGVfd2lkdGgoc3RydWN0IGRldl90eXBlcyAqZHQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDBVTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2Rldi1zd2FwLmMgYi9saWIvZGV2aWNlL2Rldi1zd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTUzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LXN3YXAuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkZXYtdHlwZS5oIgorCisjaWZkZWYgX19saW51eF9fCisKKyNkZWZpbmUgTUFYX1BBR0VTSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lIFNJR05BVFVSRV9TSVpFICAxMAorCitzdGF0aWMgaW50Citfc3dhcF9kZXRlY3Rfc2lnbmF0dXJlKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpZiAobWVtY21wKGJ1ZiwgIlNXQVAtU1BBQ0UiLCAxMCkgPT0gMCB8fAorICAgICAgICAgICAgbWVtY21wKGJ1ZiwgIlNXQVBTUEFDRTIiLCAxMCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobWVtY21wKGJ1ZiwgIlMxU1VTUEVORCIsIDkpID09IDAgfHwKKwkgICAgbWVtY21wKGJ1ZiwgIlMyU1VTUEVORCIsIDkpID09IDAgfHwKKwkgICAgbWVtY21wKGJ1ZiwgIlVMU1VTUEVORCIsIDkpID09IDAgfHwKKwkgICAgbWVtY21wKGJ1ZiwgIlx4ZWRceGMzXHgwMlx4ZTlceDk4XHg1Nlx4ZTVceDBjIiwgOCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRldl9pc19zd2FwKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKm9mZnNldF9mb3VuZCkKK3sKKwljaGFyIGJ1ZlsxMF07CisJdWludDY0X3Qgc2l6ZTsKKwl1bnNpZ25lZCBwYWdlOworCWludCByZXQgPSAwOworCisJaWYgKCFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpIHsKKwkJc3RhY2s7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWRldl9vcGVuX3JlYWRvbmx5KGRldikpIHsKKwkJc3RhY2s7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKHBhZ2UgPSAweDEwMDA7IHBhZ2UgPD0gTUFYX1BBR0VTSVpFOyBwYWdlIDw8PSAxKSB7CisJCS8qCisJCSAqIHNraXAgMzJrIHBhZ2VzaXplIHNpbmNlIHRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBzdXBwb3J0ZWQKKwkJICovCisJCWlmIChwYWdlID09IDB4ODAwMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2l6ZSA8IChwYWdlID4+IFNFQ1RPUl9TSElGVCkpCisJCQlicmVhazsKKwkJaWYgKCFkZXZfcmVhZChkZXYsIHBhZ2UgLSBTSUdOQVRVUkVfU0laRSwKKwkJCSAgICAgIFNJR05BVFVSRV9TSVpFLCBidWYpKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChfc3dhcF9kZXRlY3Rfc2lnbmF0dXJlKGJ1ZikpIHsKKwkJCWlmIChvZmZzZXRfZm91bmQpCisJCQkJKm9mZnNldF9mb3VuZCA9IHBhZ2UgLSBTSUdOQVRVUkVfU0laRTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2Rldi10eXBlLmMgYi9saWIvZGV2aWNlL2Rldi10eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NmMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UvZGV2LXR5cGUuYwpAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGV2LXR5cGUuaCIKKyNpbmNsdWRlICJ4bGF0ZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgQkxLSURfV0lQSU5HX1NVUFBPUlQKKyNpbmNsdWRlIDxibGtpZC5oPgorI2VuZGlmCisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKyNpbmNsdWRlICJkZXYtZXh0LXVkZXYtY29uc3RhbnRzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImRldmljZS10eXBlcy5oIgorCitzdHJ1Y3QgZGV2X3R5cGVzICpjcmVhdGVfZGV2X3R5cGVzKGNvbnN0IGNoYXIgKnByb2NfZGlyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24pCit7CisJc3RydWN0IGRldl90eXBlcyAqZHQ7CisJY2hhciBsaW5lWzgwXTsKKwljaGFyIHByb2NfZGV2aWNlc1tQQVRIX01BWF07CisJRklMRSAqcGQgPSBOVUxMOworCWludCBpLCBqID0gMDsKKwlpbnQgbGluZV9tYWogPSAwOworCWludCBibG9ja3NlY3Rpb24gPSAwOworCXNpemVfdCBkZXZfbGVuID0gMDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKm5sOworCisJaWYgKCEoZHQgPSBkbV96YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfdHlwZXMpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIHR5cGUgcmVnaXN0ZXIuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKnByb2NfZGlyKSB7CisJCWxvZ192ZXJib3NlKCJObyBwcm9jIGZpbGVzeXN0ZW0gZm91bmQ6IHVzaW5nIGFsbCBibG9jayBkZXZpY2UgdHlwZXMiKTsKKwkJZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9NQUpPUlM7IGkrKykKKwkJCWR0LT5kZXZfdHlwZV9hcnJheVtpXS5tYXhfcGFydGl0aW9ucyA9IDE7CisJCXJldHVybiBkdDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYocHJvY19kZXZpY2VzLCBzaXplb2YocHJvY19kZXZpY2VzKSwKKwkJCSAiJXMvZGV2aWNlcyIsIHByb2NfZGlyKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIC9wcm9jL2RldmljZXMgc3RyaW5nIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghKHBkID0gZm9wZW4ocHJvY19kZXZpY2VzLCAiciIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIHByb2NfZGV2aWNlcyk7CisJCWdvdG8gYmFkOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHBkKSAhPSBOVUxMKSB7CisJCWkgPSAwOworCQl3aGlsZSAobGluZVtpXSA9PSAnICcpCisJCQlpKys7CisKKwkJLyogSWYgaXQncyBub3QgYSBudW1iZXIgaXQgbWF5IGJlIG5hbWUgb2Ygc2VjdGlvbiAqLworCQlsaW5lX21haiA9IGF0b2koKChjaGFyICopIChsaW5lICsgaSkpKTsKKworCQlpZiAobGluZV9tYWogPCAwIHx8IGxpbmVfbWFqID49IE5VTUJFUl9PRl9NQUpPUlMpIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgbnVtYmVycyBzaG93biBpbiAvcHJvYy9kZXZpY2VzIGFyZSBhY3R1YWxseSBkaXJlY3QKKwkJCSAqIG51bWJlcnMgcGFzc2VkIHRvIHJlZ2lzdGVyaW5nIGZ1bmN0aW9uLCBob3dldmVyIHRoZSBrZXJuZWwKKwkJCSAqIHVzZXMgb25seSAxMiBiaXRzLCBzbyB1c2UganVzdCAxMiBiaXRzIGZvciBtYWpvci4KKwkJCSAqLworCQkJaWYgKChubCA9IHN0cmNocihsaW5lLCAnXG4nKSkpICpubCA9ICdcMCc7CisJCQlsb2dfd2FybigiV0FSTklORzogL3Byb2MvZGV2aWNlcyBsaW5lOiAlcywgcmVwbGFjaW5nIG1ham9yIHdpdGggJWQuIiwKKwkJCQkgbGluZSwgbGluZV9tYWogJiAoTlVNQkVSX09GX01BSk9SUyAtIDEpKTsKKwkJCWxpbmVfbWFqICY9IChOVU1CRVJfT0ZfTUFKT1JTIC0gMSk7CisJCX0KKworCQlpZiAoIWxpbmVfbWFqKSB7CisJCQlibG9ja3NlY3Rpb24gPSAobGluZVtpXSA9PSAnQicpID8gMSA6IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFdlIG9ubHkgd2FudCBibG9jayBkZXZpY2VzIC4uLiAqLworCQlpZiAoIWJsb2Nrc2VjdGlvbikKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBkZXZpY2UgbWFqb3IgbmFtZSAqLworCQl3aGlsZSAobGluZVtpXSAhPSAnICcgJiYgbGluZVtpXSAhPSAnXDAnKQorCQkJaSsrOworCQl3aGlsZSAobGluZVtpXSA9PSAnICcpCisJCQlpKys7CisKKwkJLyogTG9vayBmb3IgbWQgZGV2aWNlICovCisJCWlmICghc3RybmNtcCgibWQiLCBsaW5lICsgaSwgMikgJiYgaXNzcGFjZSgqKGxpbmUgKyBpICsgMikpKQorCQkJZHQtPm1kX21ham9yID0gbGluZV9tYWo7CisKKwkJLyogTG9vayBmb3IgYmxrZXh0IGRldmljZSAqLworCQlpZiAoIXN0cm5jbXAoImJsa2V4dCIsIGxpbmUgKyBpLCA2KSAmJiBpc3NwYWNlKCoobGluZSArIGkgKyA2KSkpCisJCQlkdC0+YmxrZXh0X21ham9yID0gbGluZV9tYWo7CisKKwkJLyogTG9vayBmb3IgZHJiZCBkZXZpY2UgKi8KKwkJaWYgKCFzdHJuY21wKCJkcmJkIiwgbGluZSArIGksIDQpICYmIGlzc3BhY2UoKihsaW5lICsgaSArIDQpKSkKKwkJCWR0LT5kcmJkX21ham9yID0gbGluZV9tYWo7CisKKwkJLyogTG9vayBmb3IgREFTRCAqLworCQlpZiAoIXN0cm5jbXAoImRhc2QiLCBsaW5lICsgaSwgNCkgJiYgaXNzcGFjZSgqKGxpbmUgKyBpICsgNCkpKQorCQkJZHQtPmRhc2RfbWFqb3IgPSBsaW5lX21hajsKKworCQkvKiBMb29rIGZvciBFTUMgcG93ZXJwYXRoICovCisJCWlmICghc3RybmNtcCgiZW1jcG93ZXIiLCBsaW5lICsgaSwgOCkgJiYgaXNzcGFjZSgqKGxpbmUgKyBpICsgOCkpKQorCQkJZHQtPmVtY3Bvd2VyX21ham9yID0gbGluZV9tYWo7CisKKwkJaWYgKCFzdHJuY21wKCJsb29wIiwgbGluZSArIGksIDQpICYmIGlzc3BhY2UoKihsaW5lICsgaSArIDQpKSkKKwkJCWR0LT5sb29wX21ham9yID0gbGluZV9tYWo7CisKKwkJaWYgKCFzdHJuY21wKCJwb3dlcjIiLCBsaW5lICsgaSwgNikgJiYgaXNzcGFjZSgqKGxpbmUgKyBpICsgNikpKQorCQkJZHQtPnBvd2VyMl9tYWpvciA9IGxpbmVfbWFqOworCisJCS8qIExvb2sgZm9yIGRldmljZS1tYXBwZXIgZGV2aWNlICovCisJCS8qIEZJWE1FIENvcGUgd2l0aCBtdWx0aXBsZSBtYWpvcnMgKi8KKwkJaWYgKCFzdHJuY21wKCJkZXZpY2UtbWFwcGVyIiwgbGluZSArIGksIDEzKSAmJiBpc3NwYWNlKCoobGluZSArIGkgKyAxMykpKQorCQkJZHQtPmRldmljZV9tYXBwZXJfbWFqb3IgPSBsaW5lX21hajsKKworCQkvKiBNYWpvciBpcyBTQ1NJIGRldmljZSAqLworCQlpZiAoIXN0cm5jbXAoInNkIiwgbGluZSArIGksIDIpICYmIGlzc3BhY2UoKihsaW5lICsgaSArIDIpKSkKKwkJCWR0LT5kZXZfdHlwZV9hcnJheVtsaW5lX21hal0uZmxhZ3MgfD0gUEFSVElUSU9OX1NDU0lfREVWSUNFOworCisJCS8qIEdvIHRocm91Z2ggdGhlIHZhbGlkIGRldmljZSBuYW1lcyBhbmQgaWYgdGhlcmUgaXMgYQorCQkgICBtYXRjaCBzdG9yZSBtYXggbnVtYmVyIG9mIHBhcnRpdGlvbnMgKi8KKwkJZm9yIChqID0gMDsgX2Rldl9rbm93bl90eXBlc1tqXS5uYW1lWzBdOyBqKyspIHsKKwkJCWRldl9sZW4gPSBzdHJsZW4oX2Rldl9rbm93bl90eXBlc1tqXS5uYW1lKTsKKwkJCWlmIChkZXZfbGVuIDw9IHN0cmxlbihsaW5lICsgaSkgJiYKKwkJCSAgICAhc3RybmNtcChfZGV2X2tub3duX3R5cGVzW2pdLm5hbWUsIGxpbmUgKyBpLCBkZXZfbGVuKSAmJgorCQkJICAgIChsaW5lX21haiA8IE5VTUJFUl9PRl9NQUpPUlMpKSB7CisJCQkJZHQtPmRldl90eXBlX2FycmF5W2xpbmVfbWFqXS5tYXhfcGFydGl0aW9ucyA9CisJCQkJCV9kZXZfa25vd25fdHlwZXNbal0ubWF4X3BhcnRpdGlvbnM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWNuKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgZGV2aWNlcy90eXBlcyBmb3IgbG9jYWwgdmFyaWF0aW9ucyAqLworCQlmb3IgKGN2ID0gY24tPnY7IGN2OyBjdiA9IGN2LT5uZXh0KSB7CisJCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJCWxvZ19lcnJvcigiRXhwZWN0aW5nIHN0cmluZyBpbiBkZXZpY2VzL3R5cGVzICIKKwkJCQkJICAiaW4gY29uZmlnIGZpbGUiKTsKKwkJCQlpZiAoZmNsb3NlKHBkKSkKKwkJCQkJbG9nX3N5c19lcnJvcigiZmNsb3NlIiwgcHJvY19kZXZpY2VzKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWRldl9sZW4gPSBzdHJsZW4oY3YtPnYuc3RyKTsKKwkJCW5hbWUgPSBjdi0+di5zdHI7CisJCQljdiA9IGN2LT5uZXh0OworCQkJaWYgKCFjdiB8fCBjdi0+dHlwZSAhPSBETV9DRkdfSU5UKSB7CisJCQkJbG9nX2Vycm9yKCJNYXggcGFydGl0aW9uIGNvdW50IG1pc3NpbmcgZm9yICVzICIKKwkJCQkJICAiaW4gZGV2aWNlcy90eXBlcyBpbiBjb25maWcgZmlsZSIsCisJCQkJCSAgbmFtZSk7CisJCQkJaWYgKGZjbG9zZShwZCkpCisJCQkJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHByb2NfZGV2aWNlcyk7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoIWN2LT52LmkpIHsKKwkJCQlsb2dfZXJyb3IoIlplcm8gcGFydGl0aW9uIGNvdW50IGludmFsaWQgZm9yICIKKwkJCQkJICAiJXMgaW4gZGV2aWNlcy90eXBlcyBpbiBjb25maWcgZmlsZSIsCisJCQkJCSAgbmFtZSk7CisJCQkJaWYgKGZjbG9zZShwZCkpCisJCQkJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHByb2NfZGV2aWNlcyk7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoZGV2X2xlbiA8PSBzdHJsZW4obGluZSArIGkpICYmCisJCQkgICAgIXN0cm5jbXAobmFtZSwgbGluZSArIGksIGRldl9sZW4pICYmCisJCQkgICAgKGxpbmVfbWFqIDwgTlVNQkVSX09GX01BSk9SUykpIHsKKwkJCQlkdC0+ZGV2X3R5cGVfYXJyYXlbbGluZV9tYWpdLm1heF9wYXJ0aXRpb25zID0gY3YtPnYuaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmY2xvc2UocGQpKQorCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBwcm9jX2RldmljZXMpOworCisJcmV0dXJuIGR0OworYmFkOgorCWRtX2ZyZWUoZHQpOworCXJldHVybiBOVUxMOworfQorCitpbnQgZGV2X3N1YnN5c3RlbV9wYXJ0X21ham9yKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X3QgcHJpbWFyeV9kZXY7CisKKwlpZiAoTUFKT1IoZGV2LT5kZXYpID09IGR0LT5kZXZpY2VfbWFwcGVyX21ham9yKQorCQlyZXR1cm4gMTsKKworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRyYmRfbWFqb3IpCisJCXJldHVybiAxOworCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBkdC0+ZW1jcG93ZXJfbWFqb3IpCisJCXJldHVybiAxOworCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBkdC0+cG93ZXIyX21ham9yKQorCQlyZXR1cm4gMTsKKworCWlmICgoTUFKT1IoZGV2LT5kZXYpID09IGR0LT5ibGtleHRfbWFqb3IpICYmCisJICAgIGRldl9nZXRfcHJpbWFyeV9kZXYoZHQsIGRldiwgJnByaW1hcnlfZGV2KSAmJgorCSAgICAoTUFKT1IocHJpbWFyeV9kZXYpID09IGR0LT5tZF9tYWpvcikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKmRldl9zdWJzeXN0ZW1fbmFtZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRldmljZV9tYXBwZXJfbWFqb3IpCisJCXJldHVybiAiRE0iOworCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBkdC0+bWRfbWFqb3IpCisJCXJldHVybiAiTUQiOworCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBkdC0+ZHJiZF9tYWpvcikKKwkJcmV0dXJuICJEUkJEIjsKKworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRhc2RfbWFqb3IpCisJCXJldHVybiAiREFTRCI7CisKKwlpZiAoTUFKT1IoZGV2LT5kZXYpID09IGR0LT5lbWNwb3dlcl9tYWpvcikKKwkJcmV0dXJuICJFTUNQT1dFUiI7CisKKwlpZiAoTUFKT1IoZGV2LT5kZXYpID09IGR0LT5wb3dlcjJfbWFqb3IpCisJCXJldHVybiAiUE9XRVIyIjsKKworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmJsa2V4dF9tYWpvcikKKwkJcmV0dXJuICJCTEtFWFQiOworCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBkdC0+bG9vcF9tYWpvcikKKwkJcmV0dXJuICJMT09QIjsKKworCXJldHVybiAiIjsKK30KKworaW50IG1ham9yX21heF9wYXJ0aXRpb25zKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBpbnQgbWFqb3IpCit7CisJaWYgKG1ham9yID49IE5VTUJFUl9PRl9NQUpPUlMpCisJCXJldHVybiAwOworCisJcmV0dXJuIGR0LT5kZXZfdHlwZV9hcnJheVttYWpvcl0ubWF4X3BhcnRpdGlvbnM7Cit9CisKK2ludCBtYWpvcl9pc19zY3NpX2RldmljZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgaW50IG1ham9yKQoreworCWlmIChtYWpvciA+PSBOVU1CRVJfT0ZfTUFKT1JTKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAoZHQtPmRldl90eXBlX2FycmF5W21ham9yXS5mbGFncyAmIFBBUlRJVElPTl9TQ1NJX0RFVklDRSkgPyAxIDogMDsKK30KKworCitzdGF0aWMgaW50IF9sb29wX2lzX3dpdGhfcGFydHNjYW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCUZJTEUgKmZwOworCWludCBwYXJ0c2NhbiA9IDA7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZmZlcls2NF07CisKKwlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXNkZXYvYmxvY2svJWQ6JWQvbG9vcC9wYXJ0c2NhbiIsCisJCQlkbV9zeXNmc19kaXIoKSwKKwkJCShpbnQpIE1BSk9SKGRldi0+ZGV2KSwKKwkJCShpbnQpIE1JTk9SKGRldi0+ZGV2KSkgPCAwKSB7CisJCWxvZ193YXJuKCJTeXNmcyBwYXRoIGZvciBwYXJ0c2NhbiBpcyB0b28gbG9uZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZnAgPSBmb3BlbihwYXRoLCAiciIpKSkKKwkJcmV0dXJuIDA7IC8qIG5vdCB0aGVyZSAtPiBubyBwYXJ0c2NhbiAqLworCisJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmcCkpIHsKKwkJbG9nX3dhcm4oIkZhaWxlZCB0byByZWFkICVzLiIsIHBhdGgpOworCX0gZWxzZSBpZiAoc3NjYW5mKGJ1ZmZlciwgIiVkIiwgJnBhcnRzY2FuKSAhPSAxKSB7CisJCWxvZ193YXJuKCJGYWlsZWQgdG8gcGFyc2UgJXMgJyVzJy4iLCBwYXRoLCBidWZmZXIpOworCQlwYXJ0c2NhbiA9IDA7CisJfQorCisJaWYgKGZjbG9zZShmcCkpCisJCWxvZ19zeXNfZGVidWcoImZjbG9zZSIsIHBhdGgpOworCisJcmV0dXJuIHBhcnRzY2FuOworfQorCisvKiBTZWUgbGludXgvZ2VuaGQuaCBhbmQgZnMvcGFydGl0aW9ucy9tc2RvcyAqLworI2RlZmluZSBQQVJUX01BR0lDIDB4QUE1NQorI2RlZmluZSBQQVJUX01BR0lDX09GRlNFVCBVSU5UNjRfQygweDFGRSkKKyNkZWZpbmUgUEFSVF9PRkZTRVQgVUlOVDY0X0MoMHgxQkUpCisKK3N0cnVjdCBwYXJ0aXRpb24geworCXVpbnQ4X3QgYm9vdF9pbmQ7CisJdWludDhfdCBoZWFkOworCXVpbnQ4X3Qgc2VjdG9yOworCXVpbnQ4X3QgY3lsOworCXVpbnQ4X3Qgc3lzX2luZDsJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1aW50OF90IGVuZF9oZWFkOworCXVpbnQ4X3QgZW5kX3NlY3RvcjsKKwl1aW50OF90IGVuZF9jeWw7CisJdWludDMyX3Qgc3RhcnRfc2VjdDsKKwl1aW50MzJfdCBucl9zZWN0czsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgX2lzX3BhcnRpdGlvbmFibGUoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcGFydHMgPSBtYWpvcl9tYXhfcGFydGl0aW9ucyhkdCwgTUFKT1IoZGV2LT5kZXYpKTsKKworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRldmljZV9tYXBwZXJfbWFqb3IpCisJCXJldHVybiAxOworCisJLyogQWxsIE1EIGRldmljZXMgYXJlIHBhcnRpdGlvbmFibGUgdmlhIGJsa2V4dCAoYXMgb2YgMi42LjI4KSAqLworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPm1kX21ham9yKQorCQlyZXR1cm4gMTsKKworCS8qIEFsbCBsb29wIGRldmljZXMgYXJlIHBhcnRpdGlvbmFibGUgdmlhIGJsa2V4dCAoYXMgb2YgMy4yKSAqLworCWlmICgoTUFKT1IoZGV2LT5kZXYpID09IGR0LT5sb29wX21ham9yKSAmJgorCSAgICBfbG9vcF9pc193aXRoX3BhcnRzY2FuKGRldikpCisJCXJldHVybiAxOworCisJaWYgKChwYXJ0cyA8PSAxKSB8fCAoTUlOT1IoZGV2LT5kZXYpICUgcGFydHMpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9oYXNfcGFydGl0aW9uX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBwOworCXN0cnVjdCB7CisJCXVpbnQ4X3Qgc2tpcFtQQVJUX09GRlNFVF07CisJCXN0cnVjdCBwYXJ0aXRpb24gcGFydFs0XTsKKwkJdWludDE2X3QgbWFnaWM7CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBidWY7IC8qIHNpemVvZigpID09IFNFQ1RPUl9TSVpFICovCisKKwlpZiAoIWRldl9yZWFkKGRldiwgVUlOVDY0X0MoMCksIHNpemVvZihidWYpLCAmYnVmKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRSBDaGVjayBmb3Igb3RoZXIgdHlwZXMgb2YgcGFydGl0aW9uIHRhYmxlIHRvbyAqLworCisJLyogQ2hlY2sgZm9yIG1zZG9zIHBhcnRpdGlvbiB0YWJsZSAqLworCWlmIChidWYubWFnaWMgPT0geGxhdGUxNihQQVJUX01BR0lDKSkgeworCQlmb3IgKHAgPSAwOyBwIDwgNDsgKytwKSB7CisJCQkvKiBUYWJsZSBpcyBpbnZhbGlkIGlmIGJvb3QgaW5kaWNhdG9yIG5vdCAwIG9yIDB4ODAgKi8KKwkJCWlmIChidWYucGFydFtwXS5ib290X2luZCAmIDB4N2YpIHsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub24tZW1wdHkgcGFydGl0aW9uICovCisJCQlpZiAoYnVmLnBhcnRbcF0ubnJfc2VjdHMpCisJCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorc3RhdGljIGludCBfdWRldl9kZXZfaXNfcGFydGl0aW9uZWQoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X2V4dCAqZXh0OworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2aWNlOworCWNvbnN0IGNoYXIgKnZhbHVlOworCisJaWYgKCEoZXh0ID0gZGV2X2V4dF9nZXQoZGV2KSkpCisJCXJldHVybl8wOworCisJZGV2aWNlID0gKHN0cnVjdCB1ZGV2X2RldmljZSAqKSBleHQtPmhhbmRsZTsKKwlpZiAoISh2YWx1ZSA9IHVkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV92YWx1ZShkZXZpY2UsIERFVl9FWFRfVURFVl9CTEtJRF9QQVJUX1RBQkxFX1RZUEUpKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERldmljZS1tYXBwZXIgZGV2aWNlcyBoYXZlIERFVl9FWFRfVURFVl9CTEtJRF9QQVJUX1RBQkxFX1RZUEUKKwkgKiB2YXJpYWJsZSBzZXQgaWYgdGhlcmUncyBwYXJ0aXRpb24gdGFibGUgZm91bmQgb24gd2hvbGUgZGV2aWNlLgorCSAqIFBhcnRpdGlvbnMgZG8gbm90IGhhdmUgdGhpcyB2YXJpYWJsZSBzZXQgLSBpdCdzIGVub3VnaCB0byB1c2UKKwkgKiBvbmx5IHRoaXMgdmFyaWFibGUgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBkZXZpY2UgaGFzIHBhcnRpdGlvbgorCSAqIHRhYmxlIG9uIGl0LgorCSAqLworCWlmIChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRldmljZV9tYXBwZXJfbWFqb3IpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBPdGhlciBkZXZpY2VzIGhhdmUgREVWX0VYVF9VREVWX0JMS0lEX1BBUlRfVEFCTEVfVFlQRSBzZXQgZm9yCisJICogKmJvdGgqIHdob2xlIGRldmljZSBhbmQgcGFydGl0aW9ucy4gV2UgbmVlZCB0byBsb29rIGF0IHRoZQorCSAqIERFVl9FWFRfVURFVl9ERVZUWVBFIGluIGFkZGl0aW9uIHRvIGRlY2lkZSAtIHdob2xlIGRldmljZQorCSAqIHdpdGggcGFydGl0aW9uIHRhYmxlIG9uIGl0IGhhcyB0aGlzIHZhcmlhYmxlIHNldCB0bworCSAqIERFVl9FWFRfVURFVl9ERVZUWVBFX0RJU0suCisJICovCisJaWYgKCEodmFsdWUgPSB1ZGV2X2RldmljZV9nZXRfcHJvcGVydHlfdmFsdWUoZGV2aWNlLCBERVZfRVhUX1VERVZfREVWVFlQRSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAhc3RyY21wKHZhbHVlLCBERVZfRVhUX1VERVZfREVWVFlQRV9ESVNLKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IF91ZGV2X2Rldl9pc19wYXJ0aXRpb25lZChzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX25hdGl2ZV9kZXZfaXNfcGFydGl0aW9uZWQoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcjsKKworCWlmICghX2lzX3BhcnRpdGlvbmFibGUoZHQsIGRldikpCisJCXJldHVybiAwOworCisJLyogVW5wYXJ0aXRpb25lZCBEQVNEIGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICovCisJaWYgKChNQUpPUihkZXYtPmRldikgPT0gZHQtPmRhc2RfbWFqb3IpICYmIGRhc2RfaXNfY2RsX2Zvcm1hdHRlZChkZXYpKQorCQlyZXR1cm4gMTsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHlfcXVpZXQoZGV2KSkgeworCQlsb2dfZGVidWdfZGV2cygiJXM6IGZhaWxlZCB0byBvcGVuIGRldmljZSwgY29uc2lkZXJpbmcgZGV2aWNlICIKKwkJCSAgICAgICAiaXMgcGFydGl0aW9uZWQiLCBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJciA9IF9oYXNfcGFydGl0aW9uX3RhYmxlKGRldik7CisKKwlpZiAoIWRldl9jbG9zZShkZXYpKQorCQlzdGFjazsKKworCXJldHVybiByOworfQorCitpbnQgZGV2X2lzX3BhcnRpdGlvbmVkKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCXJldHVybiBfbmF0aXZlX2Rldl9pc19wYXJ0aXRpb25lZChkdCwgZGV2KTsKKworCWlmIChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9VREVWKQorCQlyZXR1cm4gX3VkZXZfZGV2X2lzX3BhcnRpdGlvbmVkKGR0LCBkZXYpOworCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNaXNzaW5nIGhvb2sgZm9yIHBhcnRpdGlvbiB0YWJsZSByZWNvZ25pdGlvbiAiCisJCSAgInVzaW5nIGV4dGVybmFsIGRldmljZSBpbmZvIHNvdXJjZSAlcyIsIGRldl9leHRfbmFtZShkZXYpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHByaW1hcnkgZGV2IGZvciB0aGUgZGV2IHN1cHBsaWVkLgorICoKKyAqIFdlIGNhbiBnZXQgYSBwcmltYXJ5IGRldmljZSBmb3IgYSBwYXJ0aXRpb24gZWl0aGVyIGJ5OgorICogICBBOiBrbm93aW5nIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBhbGxvd2VkIGZvciB0aGUgZGV2IGFuZCBhbHNvCisgKiAgICAgIHdoaWNoIG1ham9yOm1pbm9yIG51bWJlciByZXByZXNlbnRzIHRoZSBwcmltYXJ5IGFuZCBwYXJ0aXRpb24gZGV2aWNlCisgKiAgICAgIChieSB1c2luZyB0aGUgZGV2X3R5cGVzLT5kZXZfdHlwZV9hcnJheSkKKyAqICAgQjogYnkgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgJ3BhcnRpdGlvbicgc3lzZnMgYXR0cmlidXRlCisgKiAgICAgICgvZGV2L2Jsb2NrLzxtYWpvcj46PG1pbm9yPi9wYXJ0aXRpb24pCisgKgorICogTWV0aG9kIEEgaXMgdHJpZWQgZmlyc3QsIHRoZW4gbWV0aG9kIEIgYXMgYSBmYWxsYmFjayBpZiBBIGZhaWxzLgorICoKKyAqIE4uQi4gTWV0aG9kIEIgY2FuIG9ubHkgZG8gdGhlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBwdXJlIGV4aXN0ZW5jZSBvZgorICogICAgICB0aGUgJ3BhcnRpdGlvbicgc3lzZnMgaXRlbS4gVGhlcmUncyBubyBkaXJlY3Qgc2NhbiBmb3IgcGFydGl0aW9uCisgKiAgICAgIHRhYmxlcyB3aGF0c29ldmVyIQorICoKKyAqIFJldHVybnM6CisgKiAgIDAgb24gZXJyb3IKKyAqICAgMSBpZiB0aGUgZGV2IGlzIGFscmVhZHkgYSBwcmltYXJ5IGRldiwgcHJpbWFyeSBkZXYgaW4gJ3Jlc3VsdCcKKyAqICAgMiBpZiB0aGUgZGV2IGlzIGEgcGFydGl0aW9uLCBwcmltYXJ5IGRldiBpbiAncmVzdWx0JworICovCitpbnQgZGV2X2dldF9wcmltYXJ5X2RldihzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2LCBkZXZfdCAqcmVzdWx0KQoreworCWNvbnN0IGNoYXIgKnN5c2ZzX2RpciA9IGRtX3N5c2ZzX2RpcigpOworCWludCBtYWpvciA9IChpbnQpIE1BSk9SKGRldi0+ZGV2KTsKKwlpbnQgbWlub3IgPSAoaW50KSBNSU5PUihkZXYtPmRldik7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIHRlbXBfcGF0aFtQQVRIX01BWF07CisJY2hhciBidWZmZXJbNjRdOworCXN0cnVjdCBzdGF0IGluZm87CisJRklMRSAqZnAgPSBOVUxMOworCWludCBwYXJ0cywgcmVzaWR1ZSwgc2l6ZSwgcmV0ID0gMDsKKworCS8qCisJICogVHJ5IHRvIGdldCB0aGUgcHJpbWFyeSBkZXYgb3V0IG9mIHRoZQorCSAqIGxpc3Qgb2Yga25vd24gZGV2aWNlIHR5cGVzIGZpcnN0LgorCSAqLworCWlmICgocGFydHMgPSBkdC0+ZGV2X3R5cGVfYXJyYXlbbWFqb3JdLm1heF9wYXJ0aXRpb25zKSA+IDEpIHsKKwkJaWYgKChyZXNpZHVlID0gbWlub3IgJSBwYXJ0cykpIHsKKwkJCSpyZXN1bHQgPSBNS0RFVigoZGV2X3QpbWFqb3IsIChkZXZfdCkobWlub3IgLSByZXNpZHVlKSk7CisJCQlyZXQgPSAyOworCQl9IGVsc2UgeworCQkJKnJlc3VsdCA9IGRldi0+ZGV2OworCQkJcmV0ID0gMTsgLyogZGV2IGlzIG5vdCBhIHBhcnRpdGlvbiEgKi8KKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGNhbid0IGdldCB0aGUgcHJpbWFyeSBkZXYgb3V0IG9mIHRoZSBsaXN0IG9mIGtub3duIGRldmljZQorCSAqIHR5cGVzLCB0cnkgdG8gbG9vayBhdCBzeXNmcyBkaXJlY3RseSB0aGVuLiBUaGlzIGlzIG1vcmUgY29tcGxleAorCSAqIHdheSBhbmQgaXQgYWxzbyByZXF1aXJlcyBjZXJ0YWluIHN5c2ZzIGxheW91dCB0byBiZSBwcmVzZW50CisJICogd2hpY2ggbWlnaHQgbm90IGJlIHRoZXJlIGluIG9sZCBrZXJuZWxzIQorCSAqLworCisJLyogY2hlY2sgaWYgZGV2IGlzIGEgcGFydGl0aW9uICovCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2Rldi9ibG9jay8lZDolZC9wYXJ0aXRpb24iLAorCQkJc3lzZnNfZGlyLCBtYWpvciwgbWlub3IpIDwgMCkgeworCQlsb2dfZXJyb3IoImRtX3NucHJpbnRmIHBhcnRpdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YXQocGF0aCwgJmluZm8pID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgcGF0aCk7CisJCSpyZXN1bHQgPSBkZXYtPmRldjsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7IC8qIGRldiBpcyBub3QgYSBwYXJ0aXRpb24hICovCisJfQorCisJLyoKKwkgKiBleHRyYWN0IHBhcmVudCdzIHBhdGggZnJvbSB0aGUgcGFydGl0aW9uJ3Mgc3ltbGluaywgZS5nLjoKKwkgKiAtIHJlYWRsaW5rIC9zeXMvZGV2L2Jsb2NrLzI1OTowID0gLi4vLi4vYmxvY2svbWQwL21kMHAxCisJICogLSBkaXJuYW1lIC4uLy4uL2Jsb2NrL21kMC9tZDBwMSA9IC4uLy4uL2Jsb2NrL21kMAorCSAqIC0gYmFzZW5hbWUgLi4vLi4vYmxvY2svbWQwL21kMCAgPSBtZDAKKwkgKiBQYXJlbnQncyAnZGV2JyBzeXNmcyBhdHRyaWJ1dGUgID0gL3N5cy9ibG9jay9tZDAvZGV2CisJICovCisJaWYgKChzaXplID0gcmVhZGxpbmsoZGlybmFtZShwYXRoKSwgdGVtcF9wYXRoLCBzaXplb2YodGVtcF9wYXRoKSAtIDEpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigicmVhZGxpbmsiLCBwYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCisJdGVtcF9wYXRoW3NpemVdID0gJ1wwJzsKKworCWlmIChkbV9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy9ibG9jay8lcy9kZXYiLAorCQkJc3lzZnNfZGlyLCBiYXNlbmFtZShkaXJuYW1lKHRlbXBfcGF0aCkpKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJkbV9zbnByaW50ZiBkZXYgZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGZpbmFsbHksIHBhcnNlICdkZXYnIGF0dHJpYnV0ZSBhbmQgY3JlYXRlIGNvcnJlc3BvbmRpbmcgZGV2X3QgKi8KKwlpZiAoIShmcCA9IGZvcGVuKHBhdGgsICJyIikpKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlsb2dfZXJyb3IoInN5c2ZzIGZpbGUgJXMgZG9lcyBub3QgZXhpc3QuIiwgcGF0aCk7CisJCWVsc2UKKwkJCWxvZ19zeXNfZXJyb3IoImZvcGVuIiwgcGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZnApKSB7CisJCWxvZ19zeXNfZXJyb3IoImZnZXRzIiwgcGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzc2NhbmYoYnVmZmVyLCAiJWQ6JWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgeworCQlsb2dfZXJyb3IoInN5c2ZzIGZpbGUgJXMgbm90IGluIGV4cGVjdGVkIE1BSjpNSU4gZm9ybWF0OiAlcyIsCisJCQkgIHBhdGgsIGJ1ZmZlcik7CisJCWdvdG8gb3V0OworCX0KKwkqcmVzdWx0ID0gTUtERVYoKGRldl90KW1ham9yLCAoZGV2X3QpbWlub3IpOworCXJldCA9IDI7CitvdXQ6CisJaWYgKGZwICYmIGZjbG9zZShmcCkpCisJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHBhdGgpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEJMS0lEX1dJUElOR19TVVBQT1JUCisKK3N0YXRpYyBpbmxpbmUgaW50IF90eXBlX2luX2ZsYWdfbGlzdChjb25zdCBjaGFyICp0eXBlLCB1aW50MzJfdCBmbGFnX2xpc3QpCit7CisJcmV0dXJuICgoKGZsYWdfbGlzdCAmIFRZUEVfTFZNMl9NRU1CRVIpICYmICFzdHJjbXAodHlwZSwgIkxWTTJfbWVtYmVyIikpIHx8CisJCSgoZmxhZ19saXN0ICYgVFlQRV9MVk0xX01FTUJFUikgJiYgIXN0cmNtcCh0eXBlLCAiTFZNMV9tZW1iZXIiKSkgfHwKKwkJKChmbGFnX2xpc3QgJiBUWVBFX0RNX1NOQVBTSE9UX0NPVykgJiYgIXN0cmNtcCh0eXBlLCAiRE1fc25hcHNob3RfY293IikpKTsKK30KKworI2RlZmluZSBNU0dfRkFJTEVEX1NJR19PRkZTRVQgIkZhaWxlZCB0byBnZXQgb2Zmc2V0IG9mIHRoZSAlcyBzaWduYXR1cmUgb24gJXMuIgorI2RlZmluZSBNU0dfRkFJTEVEX1NJR19MRU5HVEggIkZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIHRoZSAlcyBzaWduYXR1cmUgb24gJXMuIgorI2RlZmluZSBNU0dfV0lQSU5HX1NLSVBQRUQgIiBXaXBpbmcgc2tpcHBlZC4iCisKK3N0YXRpYyBpbnQgX2Jsa2lkX3dpcGUoYmxraWRfcHJvYmUgcHJvYmUsIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHVpbnQzMl90IHR5cGVzX3RvX2V4Y2x1ZGUsIHVpbnQzMl90IHR5cGVzX25vX3Byb21wdCwKKwkJICAgICAgIGludCB5ZXMsIGZvcmNlX3QgZm9yY2UpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX21zZ193aXBpbmdbXSA9ICJXaXBpbmcgJXMgc2lnbmF0dXJlIG9uICVzLiI7CisJY29uc3QgY2hhciAqb2Zmc2V0ID0gTlVMTCwgKnR5cGUgPSBOVUxMLCAqbWFnaWMgPSBOVUxMLAorCQkgICAqdXNhZ2UgPSBOVUxMLCAqbGFiZWwgPSBOVUxMLCAqdXVpZCA9IE5VTEw7CisJbG9mZl90IG9mZnNldF92YWx1ZTsKKwlzaXplX3QgbGVuOworCisJaWYgKCFibGtpZF9wcm9iZV9sb29rdXBfdmFsdWUocHJvYmUsICJUWVBFIiwgJnR5cGUsIE5VTEwpKSB7CisJCWlmIChfdHlwZV9pbl9mbGFnX2xpc3QodHlwZSwgdHlwZXNfdG9fZXhjbHVkZSkpCisJCQlyZXR1cm4gMjsKKwkJaWYgKGJsa2lkX3Byb2JlX2xvb2t1cF92YWx1ZShwcm9iZSwgIlNCTUFHSUNfT0ZGU0VUIiwgJm9mZnNldCwgTlVMTCkpIHsKKwkJCWlmIChmb3JjZSA8IERPTlRfUFJPTVBUKSB7CisJCQkJbG9nX2Vycm9yKE1TR19GQUlMRURfU0lHX09GRlNFVCwgdHlwZSwgbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWxvZ19lcnJvcigiV0FSTklORzogIiBNU0dfRkFJTEVEX1NJR19PRkZTRVQgTVNHX1dJUElOR19TS0lQUEVELCB0eXBlLCBuYW1lKTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQorCQlpZiAoYmxraWRfcHJvYmVfbG9va3VwX3ZhbHVlKHByb2JlLCAiU0JNQUdJQyIsICZtYWdpYywgJmxlbikpIHsKKwkJCWlmIChmb3JjZSA8IERPTlRfUFJPTVBUKSB7CisJCQkJbG9nX2Vycm9yKE1TR19GQUlMRURfU0lHX0xFTkdUSCwgdHlwZSwgbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiAiIE1TR19GQUlMRURfU0lHX0xFTkdUSCBNU0dfV0lQSU5HX1NLSVBQRUQsIHR5cGUsIG5hbWUpOworCQkJCXJldHVybiAyOworCQkJfQorCQl9CisJfSBlbHNlIGlmICghYmxraWRfcHJvYmVfbG9va3VwX3ZhbHVlKHByb2JlLCAiUFRUWVBFIiwgJnR5cGUsIE5VTEwpKSB7CisJCWlmIChibGtpZF9wcm9iZV9sb29rdXBfdmFsdWUocHJvYmUsICJQVE1BR0lDX09GRlNFVCIsICZvZmZzZXQsIE5VTEwpKSB7CisJCQlpZiAoZm9yY2UgPCBET05UX1BST01QVCkgeworCQkJCWxvZ19lcnJvcihNU0dfRkFJTEVEX1NJR19PRkZTRVQsIHR5cGUsIG5hbWUpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogIiBNU0dfRkFJTEVEX1NJR19PRkZTRVQgTVNHX1dJUElOR19TS0lQUEVELCB0eXBlLCBuYW1lKTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJfQorCQlpZiAoYmxraWRfcHJvYmVfbG9va3VwX3ZhbHVlKHByb2JlLCAiUFRNQUdJQyIsICZtYWdpYywgJmxlbikpIHsKKwkJCWlmIChmb3JjZSA8IERPTlRfUFJPTVBUKSB7CisJCQkJbG9nX2Vycm9yKE1TR19GQUlMRURfU0lHX0xFTkdUSCwgdHlwZSwgbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiAiIE1TR19GQUlMRURfU0lHX0xFTkdUSCBNU0dfV0lQSU5HX1NLSVBQRUQsIHR5cGUsIG5hbWUpOworCQkJCXJldHVybiAyOworCQkJfQorCQl9CisJCXVzYWdlID0gInBhcnRpdGlvbiB0YWJsZSI7CisJfSBlbHNlCisJCXJldHVybl8wOworCisJb2Zmc2V0X3ZhbHVlID0gc3RydG9sbChvZmZzZXQsIE5VTEwsIDEwKTsKKworCWlmICghdXNhZ2UpCisJCSh2b2lkKSBibGtpZF9wcm9iZV9sb29rdXBfdmFsdWUocHJvYmUsICJVU0FHRSIsICZ1c2FnZSwgTlVMTCk7CisJKHZvaWQpIGJsa2lkX3Byb2JlX2xvb2t1cF92YWx1ZShwcm9iZSwgIkxBQkVMIiwgJmxhYmVsLCBOVUxMKTsKKwkodm9pZCkgYmxraWRfcHJvYmVfbG9va3VwX3ZhbHVlKHByb2JlLCAiVVVJRCIsICZ1dWlkLCBOVUxMKTsKKwkvKiBSZXR1cm4gdmFsdWVzIGlnbm9yZWQgaGVyZSwgaW4gdGhlIHdvcnN0IGNhc2Ugd2UgcHJpbnQgTlVMTCAqLworCisJbG9nX3ZlcmJvc2UoIkZvdW5kIGV4aXN0aW5nIHNpZ25hdHVyZSBvbiAlcyBhdCBvZmZzZXQgJXM6IExBQkVMPVwiJXNcIiAiCisJCSAgICAiVVVJRD1cIiVzXCIgVFlQRT1cIiVzXCIgVVNBR0U9XCIlc1wiIiwKKwkJICAgICBuYW1lLCBvZmZzZXQsIGxhYmVsLCB1dWlkLCB0eXBlLCB1c2FnZSk7CisKKwlpZiAoIV90eXBlX2luX2ZsYWdfbGlzdCh0eXBlLCB0eXBlc19ub19wcm9tcHQpKSB7CisJCWlmICgheWVzICYmIChmb3JjZSA9PSBQUk9NUFQpICYmCisJCSAgICB5ZXNfbm9fcHJvbXB0KCJXQVJOSU5HOiAlcyBzaWduYXR1cmUgZGV0ZWN0ZWQgb24gJXMgYXQgb2Zmc2V0ICVzLiAiCisJCQkJICAiV2lwZSBpdD8gW3kvbl06ICIsIHR5cGUsIG5hbWUsIG9mZnNldCkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkFib3J0ZWQgd2lwaW5nIG9mICVzLiIsIHR5cGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoX21zZ193aXBpbmcsIHR5cGUsIG5hbWUpOworCX0gZWxzZQorCQlsb2dfdmVyYm9zZShfbXNnX3dpcGluZywgdHlwZSwgbmFtZSk7CisKKwlpZiAoIWRldl9zZXQoZGV2LCBvZmZzZXRfdmFsdWUsIGxlbiwgMCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd2lwZSAlcyBzaWduYXR1cmUgb24gJXMuIiwgdHlwZSwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93aXBlX2tub3duX3NpZ25hdHVyZXNfd2l0aF9ibGtpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgdWludDMyX3QgdHlwZXNfdG9fZXhjbHVkZSwKKwkJCQkJICAgICB1aW50MzJfdCB0eXBlc19ub19wcm9tcHQsCisJCQkJCSAgICAgaW50IHllcywgZm9yY2VfdCBmb3JjZSwgaW50ICp3aXBlZCkKK3sKKwlibGtpZF9wcm9iZSBwcm9iZSA9IE5VTEw7CisJaW50IGZvdW5kID0gMCwgbGVmdCA9IDAsIHdpcGVkX3RtcDsKKwlpbnQgcl93aXBlOworCWludCByID0gMDsKKworCWlmICghd2lwZWQpCisJCXdpcGVkID0gJndpcGVkX3RtcDsKKwkqd2lwZWQgPSAwOworCisJLyogVE9ETzogU2hvdWxkIHdlIGNoZWNrIGZvciB2YWxpZCBkZXYgLSBfZGV2X2lzX3ZhbGlkKGRldik/ICovCisKKwlpZiAoIShwcm9iZSA9IGJsa2lkX25ld19wcm9iZV9mcm9tX2ZpbGVuYW1lKGRldl9uYW1lKGRldikpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgYSBuZXcgYmxraWQgcHJvYmUgZm9yIGRldmljZSAlcy4iLCBkZXZfbmFtZShkZXYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmxraWRfcHJvYmVfZW5hYmxlX3BhcnRpdGlvbnMocHJvYmUsIDEpOworCWJsa2lkX3Byb2JlX3NldF9wYXJ0aXRpb25zX2ZsYWdzKHByb2JlLCBCTEtJRF9QQVJUU19NQUdJQyk7CisKKwlibGtpZF9wcm9iZV9lbmFibGVfc3VwZXJibG9ja3MocHJvYmUsIDEpOworCWJsa2lkX3Byb2JlX3NldF9zdXBlcmJsb2Nrc19mbGFncyhwcm9iZSwgQkxLSURfU1VCTEtTX0xBQkVMIHwKKwkJCQkJCSBCTEtJRF9TVUJMS1NfVVVJRCB8CisJCQkJCQkgQkxLSURfU1VCTEtTX1RZUEUgfAorCQkJCQkJIEJMS0lEX1NVQkxLU19VU0FHRSB8CisJCQkJCQkgQkxLSURfU1VCTEtTX1ZFUlNJT04gfAorCQkJCQkJIEJMS0lEX1NVQkxLU19NQUdJQyB8CisJCQkJCQkgQkxLSURfU1VCTEtTX0JBRENTVU0pOworCisJd2hpbGUgKCFibGtpZF9kb19wcm9iZShwcm9iZSkpIHsKKwkJaWYgKChyX3dpcGUgPSBfYmxraWRfd2lwZShwcm9iZSwgZGV2LCBuYW1lLCB0eXBlc190b19leGNsdWRlLCB0eXBlc19ub19wcm9tcHQsIHllcywgZm9yY2UpKSA9PSAxKSB7CisJCQkoKndpcGVkKSsrOworCQkJaWYgKGJsa2lkX3Byb2JlX3N0ZXBfYmFjayhwcm9iZSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdGVwIGJhY2sgYmxraWQgcHJvYmUgdG8gY2hlY2sganVzdCB3aXBlZCBzaWduYXR1cmUuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJLyogZG8gbm90IGNvdW50IGV4Y2x1ZGVkIHR5cGVzICovCisJCWlmIChyX3dpcGUgIT0gMikKKwkJCWZvdW5kKys7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJciA9IDE7CisKKwlsZWZ0ID0gZm91bmQgLSAqd2lwZWQ7CisJaWYgKCFsZWZ0KQorCQlyID0gMTsKKwllbHNlCisJCWxvZ193YXJuKCIlZCBleGlzdGluZyBzaWduYXR1cmUlcyBsZWZ0IG9uIHRoZSBkZXZpY2UuIiwKKwkJCSAgbGVmdCwgbGVmdCA+IDEgPyAicyIgOiAiIik7CitvdXQ6CisJaWYgKHByb2JlKQorCQlibGtpZF9mcmVlX3Byb2JlKHByb2JlKTsKKwlyZXR1cm4gcjsKK30KKworI2VuZGlmIC8qIEJMS0lEX1dJUElOR19TVVBQT1JUICovCisKK3N0YXRpYyBpbnQgX3dpcGVfc2lnbmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGludCB3aXBlX2xlbiwgaW50IHllcywgZm9yY2VfdCBmb3JjZSwgaW50ICp3aXBlZCwKKwkJCSAgIGludCAoKnNpZ25hdHVyZV9kZXRlY3Rpb25fZm4pKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKm9mZnNldF9mb3VuZCkpCit7CisJaW50IHdpcGU7CisJdWludDY0X3Qgb2Zmc2V0X2ZvdW5kOworCisJd2lwZSA9IHNpZ25hdHVyZV9kZXRlY3Rpb25fZm4oZGV2LCAmb2Zmc2V0X2ZvdW5kKTsKKwlpZiAod2lwZSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkZhdGFsIGVycm9yIHdoaWxlIHRyeWluZyB0byBkZXRlY3QgJXMgb24gJXMuIiwKKwkJCSAgdHlwZSwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICh3aXBlID09IDApCisJCXJldHVybiAxOworCisJLyogU3BlY2lmeWluZyAtLXllcyA9PiBkbyBub3QgYXNrLiAqLworCWlmICgheWVzICYmIChmb3JjZSA9PSBQUk9NUFQpICYmCisJICAgIHllc19ub19wcm9tcHQoIldBUk5JTkc6ICVzIGRldGVjdGVkIG9uICVzLiBXaXBlIGl0PyBbeS9uXTogIiwKKwkJCSAgdHlwZSwgbmFtZSkgPT0gJ24nKSB7CisJCWxvZ19lcnJvcigiQWJvcnRlZCB3aXBpbmcgb2YgJXMuIiwgdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJXaXBpbmcgJXMgb24gJXMuIiwgdHlwZSwgbmFtZSk7CisJaWYgKCFkZXZfc2V0KGRldiwgb2Zmc2V0X2ZvdW5kLCB3aXBlX2xlbiwgMCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd2lwZSAlcyBvbiAlcy4iLCB0eXBlLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKCp3aXBlZCkrKzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd2lwZV9rbm93bl9zaWduYXR1cmVzX3dpdGhfbHZtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgdWludDMyX3QgdHlwZXNfdG9fZXhjbHVkZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJICAgdWludDMyX3QgdHlwZXNfbm9fcHJvbXB0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgICBpbnQgeWVzLCBmb3JjZV90IGZvcmNlLCBpbnQgKndpcGVkKQoreworCWludCB3aXBlZF90bXA7CisKKwlpZiAoIXdpcGVkKQorCQl3aXBlZCA9ICZ3aXBlZF90bXA7CisJKndpcGVkID0gMDsKKworCWlmICghX3dpcGVfc2lnbmF0dXJlKGRldiwgInNvZnR3YXJlIFJBSUQgbWQgc3VwZXJibG9jayIsIG5hbWUsIDQsIHllcywgZm9yY2UsIHdpcGVkLCBkZXZfaXNfbWQpIHx8CisJICAgICFfd2lwZV9zaWduYXR1cmUoZGV2LCAic3dhcCBzaWduYXR1cmUiLCBuYW1lLCAxMCwgeWVzLCBmb3JjZSwgd2lwZWQsIGRldl9pc19zd2FwKSB8fAorCSAgICAhX3dpcGVfc2lnbmF0dXJlKGRldiwgIkxVS1Mgc2lnbmF0dXJlIiwgbmFtZSwgOCwgeWVzLCBmb3JjZSwgd2lwZWQsIGRldl9pc19sdWtzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHdpcGVfa25vd25fc2lnbmF0dXJlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlc190b19leGNsdWRlLAorCQkJICB1aW50MzJfdCB0eXBlc19ub19wcm9tcHQsIGludCB5ZXMsIGZvcmNlX3QgZm9yY2UsCisJCQkgIGludCAqd2lwZWQpCit7CisJaW50IGJsa2lkX3dpcGluZ19lbmFibGVkID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgYWxsb2NhdGlvbl91c2VfYmxraWRfd2lwaW5nX0NGRywgTlVMTCk7CisKKyNpZmRlZiBCTEtJRF9XSVBJTkdfU1VQUE9SVAorCWlmIChibGtpZF93aXBpbmdfZW5hYmxlZCkKKwkJcmV0dXJuIF93aXBlX2tub3duX3NpZ25hdHVyZXNfd2l0aF9ibGtpZChkZXYsIG5hbWUsCisJCQkJCQkJIHR5cGVzX3RvX2V4Y2x1ZGUsCisJCQkJCQkJIHR5cGVzX25vX3Byb21wdCwKKwkJCQkJCQkgeWVzLCBmb3JjZSwgd2lwZWQpOworI2VuZGlmCisJaWYgKGJsa2lkX3dpcGluZ19lbmFibGVkKSB7CisJCWxvZ193YXJuKCJhbGxvY2F0aW9uL3VzZV9ibGtpZF93aXBpbmc9MSBjb25maWd1cmF0aW9uIHNldHRpbmcgaXMgc2V0ICIKKwkJCSAid2hpbGUgTFZNIGlzIG5vdCBjb21waWxlZCB3aXRoIGJsa2lkIHdpcGluZyBzdXBwb3J0LiIpOworCQlsb2dfd2FybigiRmFsbGluZyBiYWNrIHRvIG5hdGl2ZSBMVk0gc2lnbmF0dXJlIGRldGVjdGlvbi4iKTsKKwl9CisJcmV0dXJuIF93aXBlX2tub3duX3NpZ25hdHVyZXNfd2l0aF9sdm0oZGV2LCBuYW1lLAorCQkJCQkgICAgICAgdHlwZXNfdG9fZXhjbHVkZSwKKwkJCQkJICAgICAgIHR5cGVzX25vX3Byb21wdCwKKwkJCQkJICAgICAgIHllcywgZm9yY2UsIHdpcGVkKTsKK30KKworI2lmZGVmIF9fbGludXhfXworCitzdGF0aWMgaW50IF9zbnByaW50Zl9hdHRyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpzeXNmc19kaXIsCisJCQkgY29uc3QgY2hhciAqYXR0cmlidXRlLCBkZXZfdCBkZXYpCit7CisJaWYgKGRtX3NucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlcy9kZXYvYmxvY2svJWQ6JWQvJXMiLCBzeXNmc19kaXIsCisJCQkoaW50KU1BSk9SKGRldiksIChpbnQpTUlOT1IoZGV2KSwKKwkJCWF0dHJpYnV0ZSkgPCAwKSB7CisJCWxvZ193YXJuKCJkbV9zbnByaW50ZiAlcyBmYWlsZWQuIiwgYXR0cmlidXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9kZXZfdG9wb2xvZ3lfYXR0cmlidXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0LAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3ZhbHVlKQoreworCWNvbnN0IGNoYXIgKnN5c2ZzX2RpciA9IGRtX3N5c2ZzX2RpcigpOworCWNoYXIgcGF0aFtQQVRIX01BWF0sIGJ1ZmZlcls2NF07CisJRklMRSAqZnA7CisJc3RydWN0IHN0YXQgaW5mbzsKKwlkZXZfdCB1bmluaXRpYWxpemVkX3ZhcihwcmltYXJ5KTsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDBVTDsKKworCWlmICghYXR0cmlidXRlIHx8ICEqYXR0cmlidXRlKQorCQlnb3RvX291dDsKKworCWlmICghc3lzZnNfZGlyIHx8ICEqc3lzZnNfZGlyKQorCQlnb3RvX291dDsKKworCWlmICghX3NucHJpbnRmX2F0dHIocGF0aCwgc2l6ZW9mKHBhdGgpLCBzeXNmc19kaXIsIGF0dHJpYnV0ZSwgZGV2LT5kZXYpKQorICAgICAgICAgICAgICAgIGdvdG9fb3V0OworCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgZGVzaXJlZCBzeXNmcyBhdHRyaWJ1dGUgZXhpc3RzCisJICogLSBpZiBub3Q6IGVpdGhlciB0aGUga2VybmVsIGRvZXNuJ3QgaGF2ZSB0b3BvbG9neSBzdXBwb3J0CisJICogICBvciB0aGUgZGV2aWNlIGNvdWxkIGJlIGEgcGFydGl0aW9uCisJICovCisJaWYgKHN0YXQocGF0aCwgJmluZm8pID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWxvZ19zeXNfZGVidWcoInN0YXQiLCBwYXRoKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICghZGV2X2dldF9wcmltYXJ5X2RldihkdCwgZGV2LCAmcHJpbWFyeSkpCisJCQlnb3RvIG91dDsKKworCQkvKiBnZXQgYXR0cmlidXRlIGZyb20gcGFydGl0aW9uJ3MgcHJpbWFyeSBkZXZpY2UgKi8KKwkJaWYgKCFfc25wcmludGZfYXR0cihwYXRoLCBzaXplb2YocGF0aCksIHN5c2ZzX2RpciwgYXR0cmlidXRlLCBwcmltYXJ5KSkKKwkJCWdvdG9fb3V0OworCisJCWlmIChzdGF0KHBhdGgsICZpbmZvKSA9PSAtMSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQlsb2dfc3lzX2RlYnVnKCJzdGF0IiwgcGF0aCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghKGZwID0gZm9wZW4ocGF0aCwgInIiKSkpIHsKKwkJbG9nX3N5c19kZWJ1ZygiZm9wZW4iLCBwYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmcCkpIHsKKwkJbG9nX3N5c19kZWJ1ZygiZmdldHMiLCBwYXRoKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJaWYgKHNzY2FuZihidWZmZXIsICIlbHUiLCAmdmFsdWUpICE9IDEpIHsKKwkJbG9nX3dhcm4oInN5c2ZzIGZpbGUgJXMgbm90IGluIGV4cGVjdGVkIGZvcm1hdDogJXMiLCBwYXRoLCBidWZmZXIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCJEZXZpY2UgJXM6ICVzIGlzICVsdSVzLiIsCisJCQkgZGV2X25hbWUoZGV2KSwgYXR0cmlidXRlLCB2YWx1ZSwgZGVmYXVsdF92YWx1ZSA/ICIiIDogIiBieXRlcyIpOworCisJcmVzdWx0ID0gdmFsdWUgPj4gU0VDVE9SX1NISUZUOworCisJaWYgKCFyZXN1bHQgJiYgdmFsdWUpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IERldmljZSAlczogJXMgaXMgJWx1IGFuZCBpcyB1bmV4cGVjdGVkbHkgbGVzcyB0aGFuIHNlY3Rvci4iLAorCQkJIGRldl9uYW1lKGRldiksIGF0dHJpYnV0ZSwgdmFsdWUpOworCQlyZXN1bHQgPSAxOworCX0KKworb3V0X2Nsb3NlOgorCWlmIChmY2xvc2UoZnApKQorCQlsb2dfc3lzX2RlYnVnKCJmY2xvc2UiLCBwYXRoKTsKKworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZGV2X2FsaWdubWVudF9vZmZzZXQoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX2Rldl90b3BvbG9neV9hdHRyaWJ1dGUoZHQsICJhbGlnbm1lbnRfb2Zmc2V0IiwgZGV2LCAwVUwpOworfQorCit1bnNpZ25lZCBsb25nIGRldl9taW5pbXVtX2lvX3NpemUoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX2Rldl90b3BvbG9neV9hdHRyaWJ1dGUoZHQsICJxdWV1ZS9taW5pbXVtX2lvX3NpemUiLCBkZXYsIDBVTCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZGV2X29wdGltYWxfaW9fc2l6ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfZGV2X3RvcG9sb2d5X2F0dHJpYnV0ZShkdCwgInF1ZXVlL29wdGltYWxfaW9fc2l6ZSIsIGRldiwgMFVMKTsKK30KKwordW5zaWduZWQgbG9uZyBkZXZfZGlzY2FyZF9tYXhfYnl0ZXMoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX2Rldl90b3BvbG9neV9hdHRyaWJ1dGUoZHQsICJxdWV1ZS9kaXNjYXJkX21heF9ieXRlcyIsIGRldiwgMFVMKTsKK30KKwordW5zaWduZWQgbG9uZyBkZXZfZGlzY2FyZF9ncmFudWxhcml0eShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfZGV2X3RvcG9sb2d5X2F0dHJpYnV0ZShkdCwgInF1ZXVlL2Rpc2NhcmRfZ3JhbnVsYXJpdHkiLCBkZXYsIDBVTCk7Cit9CisKK2ludCBkZXZfaXNfcm90YXRpb25hbChzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAoaW50KSBfZGV2X3RvcG9sb2d5X2F0dHJpYnV0ZShkdCwgInF1ZXVlL3JvdGF0aW9uYWwiLCBkZXYsIDFVTCk7Cit9CisjZWxzZQorCitpbnQgZGV2X2dldF9wcmltYXJ5X2RldihzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2LCBkZXZfdCAqcmVzdWx0KQoreworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGRldl9hbGlnbm1lbnRfb2Zmc2V0KHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDBVTDsKK30KKwordW5zaWduZWQgbG9uZyBkZXZfbWluaW11bV9pb19zaXplKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDBVTDsKK30KKwordW5zaWduZWQgbG9uZyBkZXZfb3B0aW1hbF9pb19zaXplKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDBVTDsKK30KKwordW5zaWduZWQgbG9uZyBkZXZfZGlzY2FyZF9tYXhfYnl0ZXMoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMFVMOworfQorCit1bnNpZ25lZCBsb25nIGRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDBVTDsKK30KKworaW50IGRldl9pc19yb3RhdGlvbmFsKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9kZXZpY2UvZGV2LXR5cGUuaCBiL2xpYi9kZXZpY2UvZGV2LXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdiNzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RldmljZS9kZXYtdHlwZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0RFVl9UWVBFX0gKKyNkZWZpbmUgX0xWTV9ERVZfVFlQRV9ICisKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX01BSk9SUyA0MDk2CisKKyNpZmRlZiBfX2xpbnV4X18KKyMgIGluY2x1ZGUgImtkZXZfdC5oIgorI2Vsc2UKKyMgIGRlZmluZSBNQUpPUih4KSBtYWpvcigoeCkpCisjICBkZWZpbmUgTUlOT1IoeCkgbWlub3IoKHgpKQorIyAgZGVmaW5lIE1LREVWKHgseSkgbWFrZWRldigoeCksKHkpKQorI2VuZGlmCisKKyNkZWZpbmUgUEFSVElUSU9OX1NDU0lfREVWSUNFICgxIDw8IDApCisKK3N0cnVjdCBkZXZfdHlwZV9kZWYgeworCWludCBtYXhfcGFydGl0aW9uczsgLyogMCBtZWFucyBMVk0gd29uJ3QgdXNlIHRoaXMgbWFqb3IgbnVtYmVyLiAqLworCWludCBmbGFnczsKK307CisKK3N0cnVjdCBkZXZfdHlwZXMgeworCWludCBtZF9tYWpvcjsKKwlpbnQgYmxrZXh0X21ham9yOworCWludCBkcmJkX21ham9yOworCWludCBkZXZpY2VfbWFwcGVyX21ham9yOworCWludCBlbWNwb3dlcl9tYWpvcjsKKwlpbnQgcG93ZXIyX21ham9yOworCWludCBkYXNkX21ham9yOworCWludCBsb29wX21ham9yOworCXN0cnVjdCBkZXZfdHlwZV9kZWYgZGV2X3R5cGVfYXJyYXlbTlVNQkVSX09GX01BSk9SU107Cit9OworCitzdHJ1Y3QgZGV2X3R5cGVzICpjcmVhdGVfZGV2X3R5cGVzKGNvbnN0IGNoYXIgKnByb2NfZGlyLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuKTsKKworLyogU3Vic3lzdGVtcyAqLworaW50IGRldl9zdWJzeXN0ZW1fcGFydF9tYWpvcihzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KTsKK2NvbnN0IGNoYXIgKmRldl9zdWJzeXN0ZW1fbmFtZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBtYWpvcl9pc19zY3NpX2RldmljZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgaW50IG1ham9yKTsKKworLyogU2lnbmF0dXJlL3N1cGVyYmxvY2sgcmVjb2duaXRpb24gd2l0aCBwb3NpdGlvbiByZXR1cm5lZCB3aGVyZSBmb3VuZC4gKi8KK2ludCBkZXZfaXNfbWQoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCAqc2IpOworaW50IGRldl9pc19zd2FwKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKnNpZ25hdHVyZSk7CitpbnQgZGV2X2lzX2x1a3Moc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCAqc2lnbmF0dXJlKTsKK2ludCBkYXNkX2lzX2NkbF9mb3JtYXR0ZWQoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogU2lnbmF0dXJlIHdpcGluZy4gKi8KKyNkZWZpbmUgVFlQRV9MVk0xX01FTUJFUgkweDAwMQorI2RlZmluZSBUWVBFX0xWTTJfTUVNQkVSCTB4MDAyCisjZGVmaW5lIFRZUEVfRE1fU05BUFNIT1RfQ09XCTB4MDA0CitpbnQgd2lwZV9rbm93bl9zaWduYXR1cmVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHVpbnQzMl90IHR5cGVzX3RvX2V4Y2x1ZGUsIHVpbnQzMl90IHR5cGVzX25vX3Byb21wdCwKKwkJCSAgaW50IHllcywgZm9yY2VfdCBmb3JjZSwgaW50ICp3aXBlZCk7CisKKy8qIFR5cGUtc3BlY2lmaWMgZGV2aWNlIHByb3BlcnRpZXMgKi8KK3Vuc2lnbmVkIGxvbmcgZGV2X21kX3N0cmlwZV93aWR0aChzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogUGFydGl0aW9uaW5nICovCitpbnQgbWFqb3JfbWF4X3BhcnRpdGlvbnMoc3RydWN0IGRldl90eXBlcyAqZHQsIGludCBtYWpvcik7CitpbnQgZGV2X2lzX3BhcnRpdGlvbmVkKHN0cnVjdCBkZXZfdHlwZXMgKmR0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGRldl9nZXRfcHJpbWFyeV9kZXYoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldiwgZGV2X3QgKnJlc3VsdCk7CisKKy8qIFZhcmlvdXMgZGV2aWNlIHByb3BlcnRpZXMgKi8KK3Vuc2lnbmVkIGxvbmcgZGV2X2FsaWdubWVudF9vZmZzZXQoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldik7Cit1bnNpZ25lZCBsb25nIGRldl9taW5pbXVtX2lvX3NpemUoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldik7Cit1bnNpZ25lZCBsb25nIGRldl9vcHRpbWFsX2lvX3NpemUoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldik7Cit1bnNpZ25lZCBsb25nIGRldl9kaXNjYXJkX21heF9ieXRlcyhzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KTsKK3Vuc2lnbmVkIGxvbmcgZGV2X2Rpc2NhcmRfZ3JhbnVsYXJpdHkoc3RydWN0IGRldl90eXBlcyAqZHQsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBkZXZfaXNfcm90YXRpb25hbChzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgc3RydWN0IGRldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGV2aWNlL2RldmljZS10eXBlcy5oIGIvbGliL2RldmljZS9kZXZpY2UtdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RldmljZS9kZXZpY2UtdHlwZXMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgbmFtZVsxNV07CisJY29uc3QgaW50OF90IG1heF9wYXJ0aXRpb25zOworCWNvbnN0IGNoYXIgKmRlc2M7Cit9IGRldl9rbm93bl90eXBlX3Q7CisKKy8qCisgKiBEZXZpY2VzIGFyZSBvbmx5IGNoZWNrZWQgZm9yIHBhcnRpdGlvbiB0YWJsZXMgaWYgdGhlaXIgbWlub3IgbnVtYmVyCisgKiBpcyBhIG11bHRpcGxlIG9mIHRoZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGVpciB0eXBlIGJlbG93CisgKiBpLmUuIHRoaXMgZ2l2ZXMgdGhlIGdyYW51bGFyaXR5IG9mIHdob2xlLWRldmljZSBtaW5vciBudW1iZXJzLgorICogVXNlIDEgaWYgdGhlIGRldmljZSBpcyBub3QgcGFydGl0aW9uYWJsZS4KKyAqCisgKiBUaGUgbGlzdCBjYW4gYmUgc3VwcGxlbWVudGVkIHdpdGggZGV2aWNlcy90eXBlcyBpbiB0aGUgY29uZmlnIGZpbGUuCisgKi8KK3N0YXRpYyBjb25zdCBkZXZfa25vd25fdHlwZV90IF9kZXZfa25vd25fdHlwZXNbXSA9IHsKKwl7InNkIiwgMTYsICJTQ1NJIGRpc2sifSwKKwl7ImlkZSIsIDY0LCAiSURFIGRpc2sifSwKKwl7Im1kIiwgMSwgIk11bHRpcGxlIERpc2sgKE1EL1NvZnRSQUlEKSJ9LAorCXsibG9vcCIsIDEsICJMb29wIGRldmljZSJ9LAorCXsicmFtZGlzayIsIDEsICJSQU0gZGlzayJ9LAorCXsiZGV2aWNlLW1hcHBlciIsIDEsICJNYXBwZWQgZGV2aWNlIn0sCisJeyJtZHAiLCAxLCAiUGFydGl0aW9uYWJsZSBNRCJ9LAorCXsiZGFzZCIsIDQsICJEQVNEIGRpc2sgKElCTSBTLzM5MCwgelNlcmllcykifSwKKwl7ImRhYzk2MCIsIDgsICJEQUM5NjAifSwKKwl7Im5iZCIsIDE2LCAiTmV0d29yayBCbG9jayBEZXZpY2UifSwKKwl7ImlkYSIsIDE2LCAiQ29tcGFxIFNNQVJUMiJ9LAorCXsiY2Npc3MiLCAxNiwgIkNvbXBhcSBDQ0lTUyBhcnJheSJ9LAorCXsidWJkIiwgMTYsICJVc2VyLW1vZGUgdmlydHVhbCBibG9jayBkZXZpY2UifSwKKwl7ImF0YXJhaWQiLCAxNiwgIkFUQSBSYWlkIn0sCisJeyJkcmJkIiwgMTYsICJEaXN0cmlidXRlZCBSZXBsaWNhdGVkIEJsb2NrIERldmljZSAoRFJCRCkifSwKKwl7ImVtY3Bvd2VyIiwgMTYsICJFTUMgUG93ZXJwYXRoIn0sCisJeyJwb3dlcjIiLCAxNiwgIkVNQyBQb3dlcnBhdGgifSwKKwl7Imkyb19ibG9jayIsIDE2LCAiaTJvIEJsb2NrIERpc2sifSwKKwl7ImlzZXJpZXMvdmQiLCA4LCAiaVNlcmllcyBkaXNrcyJ9LAorCXsiZ25iZCIsIDEsICJOZXR3b3JrIGJsb2NrIGRldmljZSJ9LAorCXsiYW9lIiwgMTYsICJBVEEgb3ZlciBFdGhlcm5ldCJ9LAorCXsieHZkIiwgMTYsICJYZW4gdmlydHVhbCBibG9jayBkZXZpY2UifSwKKwl7InZkaXNrIiwgOCwgIlNVTidzIExET00gdmlydHVhbCBibG9jayBkZXZpY2UifSwKKwl7InBzM2Rpc2siLCAxNiwgIlBsYXlTdGF0aW9uIDMgaW50ZXJuYWwgZGlzayJ9LAorCXsidmlydGJsayIsIDgsICJWaXJ0SU8gZGlzayJ9LAorCXsibW1jIiwgMTYsICJNTUMgYmxvY2sgZGV2aWNlIn0sCisJeyJibGtleHQiLCAxLCAiRXh0ZW5kZWQgZGV2aWNlIHBhcnRpdGlvbnMifSwKKwl7ImZpbyIsIDE2LCAiRnVzaW9uIElPIn0sCisJeyJtdGlwMzJ4eCIsIDE2LCAiTWljcm9uIFBDSWUgU1NEIn0sCisJeyJ2dG1zIiwgMTYsICJWaW9saW4gTWVtb3J5In0sCisJeyJza2QiLCAxNiwgIlNURUMifSwKKwl7InNjbSIsIDgsICJTdG9yYWdlIENsYXNzIE1lbW9yeSAoSUJNIFMvMzkwKSJ9LAorCXsiYmNhY2hlIiwgMSwgImJjYWNoZSBibG9jayBkZXZpY2UgY2FjaGUifSwKKwl7Im52bWUiLCA2NCwgIk5WTSBFeHByZXNzIn0sCisJeyJ6dm9sIiwgMTYsICJaRlMgWnZvbHMifSwKKwl7IiIsIDAsICIifQorfTsKZGlmZiAtLWdpdCBhL2xpYi9kZXZpY2UvZGV2aWNlLmggYi9saWIvZGV2aWNlL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDNmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGV2aWNlL2RldmljZS5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fREVWSUNFX0gKKyNkZWZpbmUgX0xWTV9ERVZJQ0VfSAorCisjaW5jbHVkZSAidXVpZC5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2RlZmluZSBERVZfQUNDRVNTRURfVwkJMHgwMDAwMDAwMQkvKiBEZXZpY2Ugd3JpdHRlbiB0bz8gKi8KKyNkZWZpbmUgREVWX1JFR1VMQVIJCTB4MDAwMDAwMDIJLyogUmVndWxhciBmaWxlPyAqLworI2RlZmluZSBERVZfQUxMT0NFRAkJMHgwMDAwMDAwNAkvKiBkbV9tYWxsb2MgdXNlZCAqLworI2RlZmluZSBERVZfT1BFTkVEX1JXCQkweDAwMDAwMDA4CS8qIE9wZW5lZCBSVyAqLworI2RlZmluZSBERVZfT1BFTkVEX0VYQ0wJCTB4MDAwMDAwMTAJLyogT3BlbmVkIEVYQ0wgKi8KKyNkZWZpbmUgREVWX09fRElSRUNUCQkweDAwMDAwMDIwCS8qIFVzZSBPX0RJUkVDVCAqLworI2RlZmluZSBERVZfT19ESVJFQ1RfVEVTVEVECTB4MDAwMDAwNDAJLyogREVWX09fRElSRUNUIGlzIHJlbGlhYmxlICovCisjZGVmaW5lIERFVl9PUEVOX0ZBSUxVUkUJMHgwMDAwMDA4MAkvKiBIYXMgbGFzdCBvcGVuIGZhaWxlZD8gKi8KKyNkZWZpbmUgREVWX1VTRURfRk9SX0xWCQkweDAwMDAwMTAwCS8qIElzIGRldmljZSB1c2VkIGZvciBhbiBMViAqLworI2RlZmluZSBERVZfQVNTVU1FRF9GT1JfTFYJMHgwMDAwMDIwMAkvKiBJcyBkZXZpY2UgYXNzdW1lZCBmb3IgYW4gTFYgKi8KKyNkZWZpbmUgREVWX05PVF9PX05PQVRJTUUJMHgwMDAwMDQwMAkvKiBEb24ndCB1c2UgT19OT0FUSU1FICovCisKKy8qCisgKiBTdXBwb3J0IGZvciBleHRlcm5hbCBkZXZpY2UgaW5mby4KKyAqIEFueSBuZXcgZXh0ZXJuYWwgZGV2aWNlIGluZm8gc291cmNlIG5lZWRzIHRvIGJlCisgKiByZWdpc3RlcmVkIHVzaW5nIEVYVF9SRUdJU1RFUiBtYWNybyBpbiBkZXYtZXh0LmMuCisgKi8KK3R5cGVkZWYgZW51bSBkZXZfZXh0X2UgeworCURFVl9FWFRfTk9ORSwKKwlERVZfRVhUX1VERVYsCisJREVWX0VYVF9OVU0KK30gZGV2X2V4dF90OworCitzdHJ1Y3QgZGV2X2V4dCB7CisJaW50IGVuYWJsZWQ7CisJZGV2X2V4dF90IHNyYzsKKwl2b2lkICpoYW5kbGU7Cit9OworCisvKgorICogQWxsIGRldmljZXMgaW4gTFZNIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgb25lIG9mIHRoZXNlLgorICogcG9pbnRlciBjb21wYXJpc29ucyBhcmUgdmFsaWQuCisgKi8KK3N0cnVjdCBkZXZpY2UgeworCXN0cnVjdCBkbV9saXN0IGFsaWFzZXM7CS8qIHN0cnVjdCBkbV9zdHJfbGlzdCAqLworCWRldl90IGRldjsKKworCS8qIHByaXZhdGUgKi8KKwlpbnQgZmQ7CisJaW50IG9wZW5fY291bnQ7CisJaW50IGVycm9yX2NvdW50OworCWludCBtYXhfZXJyb3JfY291bnQ7CisJaW50IHBoeXNfYmxvY2tfc2l6ZTsKKwlpbnQgYmxvY2tfc2l6ZTsKKwlpbnQgcmVhZF9haGVhZDsKKwl1aW50MzJfdCBmbGFnczsKKwl1bnNpZ25lZCBzaXplX3NlcW5vOworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3QgZW5kOworCXN0cnVjdCBkbV9saXN0IG9wZW5fbGlzdDsKKwlzdHJ1Y3QgZGV2X2V4dCBleHQ7CisKKwljb25zdCBjaGFyICp2Z2lkOyAvKiBpZiBkZXZpY2UgaXMgYW4gTFYgKi8KKwljb25zdCBjaGFyICpsdmlkOyAvKiBpZiBkZXZpY2UgaXMgYW4gTFYgKi8KKworCWNoYXIgcHZpZFtJRF9MRU4gKyAxXTsgLyogaWYgZGV2aWNlIGlzIGEgUFYgKi8KKwljaGFyIF9wYWRkaW5nWzddOworfTsKKworc3RydWN0IGRldmljZV9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CisKK3N0cnVjdCBkZXZpY2VfYXJlYSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXVpbnQ2NF90IHN0YXJ0OwkJLyogQnl0ZXMgKi8KKwl1aW50NjRfdCBzaXplOwkJLyogQnl0ZXMgKi8KK307CisKKy8qCisgKiBTdXBwb3J0IGZvciBleHRlcm5hbCBkZXZpY2UgaW5mby4KKyAqLworY29uc3QgY2hhciAqZGV2X2V4dF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgZGV2X2V4dF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBkZXZfZXh0X3Qgc3JjKTsKK2ludCBkZXZfZXh0X2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0cnVjdCBkZXZfZXh0ICpkZXZfZXh0X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGRldl9leHRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKgorICogSW5jcmVtZW50IGN1cnJlbnQgZGV2X3NpemVfc2Vxbm8uCisgKiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCBsaWZldGltZQorICogb2YgY2FjaGVkIGRldmljZSBzaXplLgorICovCit2b2lkIGRldl9zaXplX3NlcW5vX2luYyh2b2lkKTsKKworLyoKKyAqIEFsbCBpbyBzaG91bGQgdXNlIHRoZXNlIHJvdXRpbmVzLgorICovCitpbnQgZGV2X2dldF9ibG9ja19zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpwaHlzX2Jsb2NrX3NpemUsIHVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSk7CitpbnQgZGV2X2dldF9zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgKnNpemUpOworaW50IGRldl9nZXRfcmVhZF9haGVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90ICpyZWFkX2FoZWFkKTsKK2ludCBkZXZfZGlzY2FyZF9ibG9ja3Moc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXRfYnl0ZXMsIHVpbnQ2NF90IHNpemVfYnl0ZXMpOworCisvKiBVc2UgcXVpZXQgdmVyc2lvbiBpZiBkZXZpY2UgbnVtYmVyIGNvdWxkIGNoYW5nZSBlLmcuIHdoZW4gb3BlbmluZyBMViAqLworaW50IGRldl9vcGVuKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgZGV2X29wZW5fcXVpZXQoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBkZXZfb3Blbl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBmbGFncywgaW50IGRpcmVjdCwgaW50IHF1aWV0KTsKK2ludCBkZXZfb3Blbl9yZWFkb25seShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGRldl9vcGVuX3JlYWRvbmx5X2J1ZmZlcmVkKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgZGV2X29wZW5fcmVhZG9ubHlfcXVpZXQoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBkZXZfY2xvc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBkZXZfY2xvc2VfaW1tZWRpYXRlKHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIGRldl9jbG9zZV9hbGwodm9pZCk7CitpbnQgZGV2X3Rlc3RfZXhjbChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgZGV2X2ZkKHN0cnVjdCBkZXZpY2UgKmRldik7Citjb25zdCBjaGFyICpkZXZfbmFtZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgZGV2X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQsIHNpemVfdCBsZW4sIHZvaWQgKmJ1ZmZlcik7CitpbnQgZGV2X3JlYWRfY2lyY3VsYXIoc3RydWN0IGRldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQsIHNpemVfdCBsZW4sCisJCSAgICAgIHVpbnQ2NF90IG9mZnNldDIsIHNpemVfdCBsZW4yLCBjaGFyICpidWYpOworaW50IGRldl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90IG9mZnNldCwgc2l6ZV90IGxlbiwgdm9pZCAqYnVmZmVyKTsKK2ludCBkZXZfYXBwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IGxlbiwgY2hhciAqYnVmZmVyKTsKK2ludCBkZXZfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBpbnQgdmFsdWUpOwordm9pZCBkZXZfZmx1c2goc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RydWN0IGRldmljZSAqZGV2X2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRtX3N0cl9saXN0ICphbGlhcywgaW50IHVzZV9tYWxsb2MpOwordm9pZCBkZXZfZGVzdHJveV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIFJldHVybiBhIHZhbGlkIGRldmljZSBuYW1lIGZyb20gdGhlIGFsaWFzIGxpc3Q7IE5VTEwgb3RoZXJ3aXNlICovCitjb25zdCBjaGFyICpkZXZfbmFtZV9jb25maXJtZWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcXVpZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9kaXNwbGF5L2Rpc3BsYXkuYyBiL2xpYi9kaXNwbGF5L2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRkMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Rpc3BsYXkvZGlzcGxheS5jCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKyNpbmNsdWRlICJsdm0tc2lnbmFsLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CisJY29uc3QgY2hhciBzdHJbMTRdOyAvKiBtdXN0IGJlIGNoYW5nZWQgd2hlbiBzaXplIGV4dGVuZHMgMTMgY2hhcnMgKi8KKwljb25zdCBjaGFyIHJlcGNoYXI7Cit9IF9wb2xpY2llc1tdID0geworCXsKKwlBTExPQ19DT05USUdVT1VTLCAiY29udGlndW91cyIsICdjJ30sIHsKKwlBTExPQ19DTElORywgImNsaW5nIiwgJ2wnfSwgeworCUFMTE9DX0NMSU5HX0JZX1RBR1MsICJjbGluZ19ieV90YWdzIiwgJ3QnfSwgewkvKiBPbmx5IHVzZWQgaW4gbG9nIG1lc2dzICovCisJQUxMT0NfTk9STUFMLCAibm9ybWFsIiwgJ24nfSwgeworCUFMTE9DX0FOWVdIRVJFLCAiYW55d2hlcmUiLCAnYSd9LCB7CisJQUxMT0NfSU5IRVJJVCwgImluaGVyaXQiLCAnaSd9Cit9OworCitzdGF0aWMgY29uc3QgaW50IF9udW1fcG9saWNpZXMgPSBETV9BUlJBWV9TSVpFKF9wb2xpY2llcyk7CisKK2NoYXIgYWxsb2NfcG9saWN5X2NoYXIoYWxsb2NfcG9saWN5X3QgYWxsb2MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgX251bV9wb2xpY2llczsgaSsrKQorCQlpZiAoX3BvbGljaWVzW2ldLmFsbG9jID09IGFsbG9jKQorCQkJcmV0dXJuIF9wb2xpY2llc1tpXS5yZXBjaGFyOworCisJcmV0dXJuICctJzsKK30KKworY29uc3QgY2hhciAqZ2V0X2FsbG9jX3N0cmluZyhhbGxvY19wb2xpY3lfdCBhbGxvYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBfbnVtX3BvbGljaWVzOyBpKyspCisJCWlmIChfcG9saWNpZXNbaV0uYWxsb2MgPT0gYWxsb2MpCisJCQlyZXR1cm4gX3BvbGljaWVzW2ldLnN0cjsKKworCXJldHVybiBOVUxMOworfQorCithbGxvY19wb2xpY3lfdCBnZXRfYWxsb2NfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCisJLyogY2xpbmdfYnlfdGFncyBpcyBwYXJ0IG9mIGNsaW5nICovCisJaWYgKCFzdHJjbXAoImNsaW5nX2J5X3RhZ3MiLCBzdHIpKQorCQlyZXR1cm4gQUxMT0NfQ0xJTkc7CisKKwlmb3IgKGkgPSAwOyBpIDwgX251bV9wb2xpY2llczsgaSsrKQorCQlpZiAoIXN0cmNtcChfcG9saWNpZXNbaV0uc3RyLCBzdHIpKQorCQkJcmV0dXJuIF9wb2xpY2llc1tpXS5hbGxvYzsKKworCS8qIFNwZWNpYWwgY2FzZSBmb3Igb2xkIG1ldGFkYXRhICovCisJaWYgKCFzdHJjbXAoIm5leHQgZnJlZSIsIHN0cikpCisJCXJldHVybiBBTExPQ19OT1JNQUw7CisKKwlsb2dfZXJyb3IoIlVucmVjb2duaXNlZCBhbGxvY2F0aW9uIHBvbGljeSAlcyIsIHN0cik7CisJcmV0dXJuIEFMTE9DX0lOVkFMSUQ7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9sb2NrX3R5cGVfc3RyaW5nKGxvY2tfdHlwZV90IGxvY2tfdHlwZSkKK3sKKwlzd2l0Y2ggKGxvY2tfdHlwZSkgeworCWNhc2UgTE9DS19UWVBFX0lOVkFMSUQ6CisJCXJldHVybiAiaW52YWxpZCI7CisJY2FzZSBMT0NLX1RZUEVfTk9ORToKKwkJcmV0dXJuICJub25lIjsKKwljYXNlIExPQ0tfVFlQRV9DTFZNOgorCQlyZXR1cm4gImNsdm0iOworCWNhc2UgTE9DS19UWVBFX0RMTToKKwkJcmV0dXJuICJkbG0iOworCWNhc2UgTE9DS19UWVBFX1NBTkxPQ0s6CisJCXJldHVybiAic2FubG9jayI7CisJfQorCXJldHVybiAiaW52YWxpZCI7Cit9CisKK2xvY2tfdHlwZV90IGdldF9sb2NrX3R5cGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gTE9DS19UWVBFX05PTkU7CisJaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlyZXR1cm4gTE9DS19UWVBFX05PTkU7CisJaWYgKCFzdHJjbXAoc3RyLCAiY2x2bSIpKQorCQlyZXR1cm4gTE9DS19UWVBFX0NMVk07CisJaWYgKCFzdHJjbXAoc3RyLCAiZGxtIikpCisJCXJldHVybiBMT0NLX1RZUEVfRExNOworCWlmICghc3RyY21wKHN0ciwgInNhbmxvY2siKSkKKwkJcmV0dXJuIExPQ0tfVFlQRV9TQU5MT0NLOworCXJldHVybiBMT0NLX1RZUEVfSU5WQUxJRDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9wZXJjZW50X3R5cGVzWzddID0geyAiTk9ORSIsICJWRyIsICJGUkVFIiwgIkxWIiwgIlBWUyIsICJPUklHSU4iIH07CisKK2NvbnN0IGNoYXIgKmdldF9wZXJjZW50X3N0cmluZyhwZXJjZW50X3R5cGVfdCBkZWYpCit7CisJcmV0dXJuIF9wZXJjZW50X3R5cGVzW2RlZl07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfbHZfbmFtZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCS8qIE5ldmVyIHRyeSB0byBkaXNwbGF5IG5hbWVzIG9mIHRoZSBpbnRlcm5hbCBzbmFwc2hvdCBzdHJ1Y3R1cmVzLiAqLworCWlmIChsdl9pc19zbmFwc2hvdChsdikpCisJCXJldHVybiBmaW5kX2NvdyhsdiktPm5hbWU7CisKKwlyZXR1cm4gbHYtPm5hbWU7Cit9CisKK2NvbnN0IGNoYXIgKmRpc3BsYXlfbHZuYW1lKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpsdl9uYW1lID0gX2x2X25hbWUobHYpOworCWludCByOworCisJaWYgKChsdi0+dmctPmNtZC0+ZGlzcGxheV9sdm5hbWVfaWR4ICsgTkFNRV9MRU4pID49IHNpemVvZigobHYtPnZnLT5jbWQtPmRpc3BsYXlfYnVmZmVyKSkpCisJCWx2LT52Zy0+Y21kLT5kaXNwbGF5X2x2bmFtZV9pZHggPSAwOworCisJbmFtZSA9IGx2LT52Zy0+Y21kLT5kaXNwbGF5X2J1ZmZlciArIGx2LT52Zy0+Y21kLT5kaXNwbGF5X2x2bmFtZV9pZHg7CisJciA9IGRtX3NucHJpbnRmKG5hbWUsIE5BTUVfTEVOLCAiJXMvJXMiLCBsdi0+dmctPm5hbWUsIGx2X25hbWUpOworCisJaWYgKHIgPCAwKSB7CisJCWxvZ19lcnJvcigiRnVsbCBMViBuYW1lIFwiJXMvJXNcIiBpcyB0b28gbG9uZy4iLCBsdi0+dmctPm5hbWUsIGx2X25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsdi0+dmctPmNtZC0+ZGlzcGxheV9sdm5hbWVfaWR4ICs9IHIgKyAxOworCisJcmV0dXJuIG5hbWU7Cit9CisKKy8qIFNpemUgc3VwcGxpZWQgaW4gc2VjdG9ycyAqLworc3RhdGljIGNvbnN0IGNoYXIgKl9kaXNwbGF5X3NpemUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIHVpbnQ2NF90IHNpemUsIGRtX3NpemVfc3VmZml4X3Qgc3VmZml4X3R5cGUpCit7CisJcmV0dXJuIGRtX3NpemVfdG9fc3RyaW5nKGNtZC0+bWVtLCBzaXplLCBjbWQtPmN1cnJlbnRfc2V0dGluZ3MudW5pdF90eXBlLAorCQkJCSBjbWQtPnNpX3VuaXRfY29uc2lzdGVuY3ksIAorCQkJCSBjbWQtPmN1cnJlbnRfc2V0dGluZ3MudW5pdF9mYWN0b3IsCisJCQkJIGNtZC0+Y3VycmVudF9zZXR0aW5ncy5zdWZmaXgsCisJCQkJIHN1ZmZpeF90eXBlKTsKK30KKworY29uc3QgY2hhciAqZGlzcGxheV9zaXplX2xvbmcoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IHNpemUpCit7CisJcmV0dXJuIF9kaXNwbGF5X3NpemUoY21kLCBzaXplLCBETV9TSVpFX0xPTkcpOworfQorCitjb25zdCBjaGFyICpkaXNwbGF5X3NpemVfdW5pdHMoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IHNpemUpCit7CisJcmV0dXJuIF9kaXNwbGF5X3NpemUoY21kLCBzaXplLCBETV9TSVpFX1VOSVQpOworfQorCitjb25zdCBjaGFyICpkaXNwbGF5X3NpemUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IHNpemUpCit7CisJcmV0dXJuIF9kaXNwbGF5X3NpemUoY21kLCBzaXplLCBETV9TSVpFX1NIT1JUKTsKK30KKwordm9pZCBwdmRpc3BsYXlfY29sb25zKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKCFwdikKKwkJcmV0dXJuOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2LT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkgeworCQlzdGFjazsKKwkJcmV0dXJuOworCX0KKworCWxvZ19wcmludCgiJXM6JXM6JSIgUFJJdTY0ICI6LTE6JSIgUFJJdTY0ICI6JSIgUFJJdTY0ICI6LTE6JSIgUFJJdTMyICI6JXU6JXU6JXU6JXMiLAorCQkgIHB2X2Rldl9uYW1lKHB2KSwgcHZfdmdfbmFtZShwdiksIHB2LT5zaXplLAorCQkgIC8qIEZJWE1FIHB2LT5wdl9udW1iZXIsIERlcml2ZSBvciByZW1vdmU/ICovCisJCSAgcHYtPnN0YXR1cywJLyogRklYTUUgU3VwcG9ydCBvbGQgb3IgbmV3IGZvcm1hdCBoZXJlPyAqLworCQkgIHB2LT5zdGF0dXMgJiBBTExPQ0FUQUJMRV9QViwJLyogRklYTUUgcmVtb3ZlPyAqLworCQkgIC8qIEZJWE1FIHB2LT5sdl9jdXIsIFJlbW92ZT8gKi8KKwkJICBwdi0+cGVfc2l6ZSAvIDIsCisJCSAgcHYtPnBlX2NvdW50LAorCQkgIHB2LT5wZV9jb3VudCAtIHB2LT5wZV9hbGxvY19jb3VudCwKKwkJICBwdi0+cGVfYWxsb2NfY291bnQsICp1dWlkID8gdXVpZCA6ICJub25lIik7Cit9CisKK3ZvaWQgcHZkaXNwbGF5X3NlZ21lbnRzKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCWNvbnN0IHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZzsKKworCWlmIChwdi0+cGVfc2l6ZSkKKwkJbG9nX3ByaW50KCItLS0gUGh5c2ljYWwgU2VnbWVudHMgLS0tIik7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZzZWcsICZwdi0+c2VnbWVudHMpIHsKKwkJbG9nX3ByaW50KCJQaHlzaWNhbCBleHRlbnQgJXUgdG8gJXU6IiwKKwkJCSAgcHZzZWctPnBlLCBwdnNlZy0+cGUgKyBwdnNlZy0+bGVuIC0gMSk7CisKKwkJaWYgKHB2c2VnX2lzX2FsbG9jYXRlZChwdnNlZykpIHsKKwkJCWxvZ19wcmludCgiICBMb2dpY2FsIHZvbHVtZVx0JXMlcy8lcyIsCisJCQkJICBwdnNlZy0+bHZzZWctPmx2LT52Zy0+Y21kLT5kZXZfZGlyLAorCQkJCSAgcHZzZWctPmx2c2VnLT5sdi0+dmctPm5hbWUsCisJCQkJICBwdnNlZy0+bHZzZWctPmx2LT5uYW1lKTsKKwkJCWxvZ19wcmludCgiICBMb2dpY2FsIGV4dGVudHNcdCVkIHRvICVkIiwKKwkJCQkgIHB2c2VnLT5sdnNlZy0+bGUsIHB2c2VnLT5sdnNlZy0+bGUgKworCQkJCSAgcHZzZWctPmx2c2VnLT5sZW4gLSAxKTsKKwkJfSBlbHNlCisJCQlsb2dfcHJpbnQoIiAgRlJFRSIpOworCX0KKworCWxvZ19wcmludCgiICIpOworfQorCisvKiBGSVhNRSBJbmNsdWRlIGxhYmVsIGZpZWxkcyAqLwordm9pZCBwdmRpc3BsYXlfZnVsbChjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICAgdm9pZCAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWNvbnN0IGNoYXIgKnNpemU7CisKKwl1aW50MzJfdCBwZV9mcmVlOworCXVpbnQ2NF90IGRhdGFfc2l6ZSwgcHZzaXplLCB1bnVzYWJsZTsKKworCWlmICghcHYpCisJCXJldHVybjsKKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdi0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpIHsKKwkJc3RhY2s7CisJCXJldHVybjsKKwl9CisKKwlsb2dfcHJpbnQoIi0tLSAlc1BoeXNpY2FsIHZvbHVtZSAtLS0iLCBwdi0+cGVfc2l6ZSA/ICIiIDogIk5FVyAiKTsKKwlsb2dfcHJpbnQoIlBWIE5hbWUgICAgICAgICAgICAgICAlcyIsIHB2X2Rldl9uYW1lKHB2KSk7CisJbG9nX3ByaW50KCJWRyBOYW1lICAgICAgICAgICAgICAgJXMlcyIsCisJCSAgaXNfb3JwaGFuKHB2KSA/ICIiIDogcHYtPnZnX25hbWUsCisJCSAgcHYtPnN0YXR1cyAmIEVYUE9SVEVEX1ZHID8gIiAoZXhwb3J0ZWQpIiA6ICIiKTsKKworCWRhdGFfc2l6ZSA9ICh1aW50NjRfdCkgcHYtPnBlX2NvdW50ICogcHYtPnBlX3NpemU7CisJaWYgKHB2LT5zaXplID4gZGF0YV9zaXplICsgcHYtPnBlX3N0YXJ0KSB7CisJCXB2c2l6ZSA9IHB2LT5zaXplOworCQl1bnVzYWJsZSA9IHB2c2l6ZSAtIGRhdGFfc2l6ZTsKKwl9IGVsc2UgeworCQlwdnNpemUgPSBkYXRhX3NpemUgKyBwdi0+cGVfc3RhcnQ7CisJCXVudXNhYmxlID0gcHZzaXplIC0gcHYtPnNpemU7CisJfQorCisJc2l6ZSA9IGRpc3BsYXlfc2l6ZShjbWQsIHB2c2l6ZSk7CisJaWYgKGRhdGFfc2l6ZSkKKwkJbG9nX3ByaW50KCJQViBTaXplICAgICAgICAgICAgICAgJXMgLyBub3QgdXNhYmxlICVzIiwJLyogIFtMVk06ICVzXSIsICovCisJCQkgIHNpemUsIGRpc3BsYXlfc2l6ZShjbWQsIHVudXNhYmxlKSk7CisJZWxzZQorCQlsb2dfcHJpbnQoIlBWIFNpemUgICAgICAgICAgICAgICAlcyIsIHNpemUpOworCisJLyogUFYgbnVtYmVyIG5vdCBwYXJ0IG9mIExWTTIgZGVzaWduCisJICAgbG9nX3ByaW50KCJQViMgICAgICAgICAgICAgICAgICAgJXUiLCBwdi0+cHZfbnVtYmVyKTsKKwkgKi8KKworCXBlX2ZyZWUgPSBwdi0+cGVfY291bnQgLSBwdi0+cGVfYWxsb2NfY291bnQ7CisJaWYgKHB2LT5wZV9jb3VudCAmJiAocHYtPnN0YXR1cyAmIEFMTE9DQVRBQkxFX1BWKSkKKwkJbG9nX3ByaW50KCJBbGxvY2F0YWJsZSAgICAgICAgICAgeWVzICVzIiwKKwkJCSAgKCFwZV9mcmVlICYmIHB2LT5wZV9jb3VudCkgPyAiKGJ1dCBmdWxsKSIgOiAiIik7CisJZWxzZQorCQlsb2dfcHJpbnQoIkFsbG9jYXRhYmxlICAgICAgICAgICBOTyIpOworCisJLyogTFYgY291bnQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGRpc3BsYXlpbmcgUFYKKwkgICBsb2dfcHJpbnQoIkN1ciBMViAgICAgICAgICAgICAgICAldSIsIHZnLT5sdl9jb3VudCk7CisJICovCisKKwlpZiAoY21kLT5zaV91bml0X2NvbnNpc3RlbmN5KQorCQlsb2dfcHJpbnQoIlBFIFNpemUgICAgICAgICAgICAgICAlcyIsIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgcHYtPnBlX3NpemUpKTsKKwllbHNlCisJCWxvZ19wcmludCgiUEUgU2l6ZSAoS0J5dGUpICAgICAgICUiIFBSSXUzMiwgcHYtPnBlX3NpemUgLyAyKTsKKworCWxvZ19wcmludCgiVG90YWwgUEUgICAgICAgICAgICAgICV1IiwgcHYtPnBlX2NvdW50KTsKKwlsb2dfcHJpbnQoIkZyZWUgUEUgICAgICAgICAgICAgICAlIiBQUkl1MzIsIHBlX2ZyZWUpOworCWxvZ19wcmludCgiQWxsb2NhdGVkIFBFICAgICAgICAgICV1IiwgcHYtPnBlX2FsbG9jX2NvdW50KTsKKwlsb2dfcHJpbnQoIlBWIFVVSUQgICAgICAgICAgICAgICAlcyIsICp1dWlkID8gdXVpZCA6ICJub25lIik7CisJbG9nX3ByaW50KCIgIik7Cit9CisKK2ludCBwdmRpc3BsYXlfc2hvcnQoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICAgdm9pZCAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKCFwdikKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcHYtPmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWxvZ19wcmludCgiUFYgTmFtZSAgICAgICAgICAgICAgICVzICAgICAiLCBwdl9kZXZfbmFtZShwdikpOworCS8qIEZJWE1FICBwdi0+cHZfbnVtYmVyKTsgKi8KKwlsb2dfcHJpbnQoIlBWIFVVSUQgICAgICAgICAgICAgICAlcyIsICp1dWlkID8gdXVpZCA6ICJub25lIik7CisJbG9nX3ByaW50KCJQViBTdGF0dXMgICAgICAgICAgICAgJXNhbGxvY2F0YWJsZSIsCisJCSAgKHB2LT5zdGF0dXMgJiBBTExPQ0FUQUJMRV9QVikgPyAiIiA6ICJOT1QgIik7CisJbG9nX3ByaW50KCJUb3RhbCBQRSAvIEZyZWUgUEUgICAgJXUgLyAldSIsCisJCSAgcHYtPnBlX2NvdW50LCBwdi0+cGVfY291bnQgLSBwdi0+cGVfYWxsb2NfY291bnQpOworCisJbG9nX3ByaW50KCIgIik7CisKKwlyZXR1cm4gMTsgLyogRUNNRF9QUk9DRVNTRUQgKi8KK30KKwordm9pZCBsdmRpc3BsYXlfY29sb25zKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IGlua2VybmVsOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlpbmtlcm5lbCA9IGx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAwLCAmaW5mbywgMSwgMCkgJiYgaW5mby5leGlzdHM7CisKKwlsb2dfcHJpbnQoIiVzJXMvJXM6JXM6JSIgUFJJdTY0ICI6JWQ6LTE6JWQ6JSIgUFJJdTY0ICI6JWQ6LTE6JWQ6JWQ6JWQ6JWQiLAorCQkgIGx2LT52Zy0+Y21kLT5kZXZfZGlyLAorCQkgIGx2LT52Zy0+bmFtZSwKKwkJICBsdi0+bmFtZSwKKwkJICBsdi0+dmctPm5hbWUsCisJCSAgKChsdi0+c3RhdHVzICYgKExWTV9SRUFEIHwgTFZNX1dSSVRFKSkgPj4gOCkgfAorCQkgICgoaW5rZXJuZWwgJiYgaW5mby5yZWFkX29ubHkpID8gNCA6IDApLCBpbmtlcm5lbCA/IDEgOiAwLAorCQkgIC8qIEZJWE1FIGx2LT5sdl9udW1iZXIsICAqLworCQkgIGlua2VybmVsID8gaW5mby5vcGVuX2NvdW50IDogMCwgbHYtPnNpemUsIGx2LT5sZV9jb3VudCwKKwkJICAvKiBGSVhNRSBBZGQgbnVtIGFsbG9jYXRlZCB0byBzdHJ1Y3QhIGx2LT5sdl9hbGxvY2F0ZWRfbGUsICovCisJCSAgKGx2LT5hbGxvYyA9PSBBTExPQ19DT05USUdVT1VTID8gMiA6IDApLCBsdi0+cmVhZF9haGVhZCwKKwkJICBpbmtlcm5lbCA/IGluZm8ubWFqb3IgOiAtMSwgaW5rZXJuZWwgPyBpbmZvLm1pbm9yIDogLTEpOworfQorCitzdGF0aWMgaW50IF9sdmRpc3BsYXlfaGlzdG9yaWNhbF9mdWxsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJaW50IGx2bTFjb21wYXQgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfbHZkaXNwbGF5X3Nob3dzX2Z1bGxfZGV2aWNlX3BhdGhfQ0ZHLCBOVUxMKTsKKwlzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSAqaGx2ID0gbHYtPnRoaXNfZ2x2LT5oaXN0b3JpY2FsOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmhsdi0+bHZpZC5pZFsxXSwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfcHJpbnQoIi0tLSBIaXN0b3JpY2FsIExvZ2ljYWwgdm9sdW1lIC0tLSIpOworCisJaWYgKGx2bTFjb21wYXQpCisJCS8qIC9kZXYvdmduYW1lL2x2bmFtZSBkb2VuJ3QgYWN0dWFsbHkgZXhpc3QgZm9yIGhpc3RvcmljYWwgZGV2aWNlcyAqLworCQlsb2dfcHJpbnQoIkxWIE5hbWUgICAgICAgICAgICAgICAgJXMlcy8lcyIsCisJCQkgIGhsdi0+dmctPmNtZC0+ZGV2X2RpciwgaGx2LT52Zy0+bmFtZSwgaGx2LT5uYW1lKTsKKwllbHNlCisJCWxvZ19wcmludCgiTFYgTmFtZSAgICAgICAgICAgICAgICAlcyVzIiwgSElTVE9SSUNBTF9MVl9QUkVGSVgsIGhsdi0+bmFtZSk7CisKKwlsb2dfcHJpbnQoIlZHIE5hbWUgICAgICAgICAgICAgICAgJXMiLCBobHYtPnZnLT5uYW1lKTsKKwlsb2dfcHJpbnQoIkxWIFVVSUQgICAgICAgICAgICAgICAgJXMiLCB1dWlkKTsKKwlsb2dfcHJpbnQoIkxWIENyZWF0aW9uIHRpbWUgICAgICAgJXMiLCBsdl9jcmVhdGlvbl90aW1lX2R1cChjbWQtPm1lbSwgbHYsIDEpKTsKKwlsb2dfcHJpbnQoIkxWIFJlbW92YWwgdGltZSAgICAgICAgJXMiLCBsdl9yZW1vdmFsX3RpbWVfZHVwKGNtZC0+bWVtLCBsdiwgMSkpOworCisJbG9nX3ByaW50KCIgIik7CisJcmV0dXJuIDE7Cit9CisKK2ludCBsdmRpc3BsYXlfZnVsbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgdm9pZCAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlpbnQgaW5rZXJuZWwsIHNuYXBfYWN0aXZlID0gMDsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwljb25zdCBjaGFyICphY2Nlc3Nfc3RyOworCXN0cnVjdCBsdl9zZWdtZW50ICpzbmFwX3NlZyA9IE5VTEwsICptaXJyb3Jfc2VnID0gTlVMTDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gTlVMTDsKKwlpbnQgbHZtMWNvbXBhdDsKKwlkbV9wZXJjZW50X3Qgc25hcF9wZXJjZW50OworCWludCB0aGluX2RhdGFfYWN0aXZlID0gMCwgdGhpbl9tZXRhZGF0YV9hY3RpdmUgPSAwOworCWRtX3BlcmNlbnRfdCB0aGluX2RhdGFfcGVyY2VudCwgdGhpbl9tZXRhZGF0YV9wZXJjZW50OworCWludCB0aGluX2FjdGl2ZSA9IDA7CisJZG1fcGVyY2VudF90IHRoaW5fcGVyY2VudDsKKworCWlmIChsdl9pc19oaXN0b3JpY2FsKGx2KSkKKwkJcmV0dXJuIF9sdmRpc3BsYXlfaGlzdG9yaWNhbF9mdWxsKGNtZCwgbHYpOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmx2LT5sdmlkLmlkWzFdLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWlua2VybmVsID0gbHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMSwgMSkgJiYgaW5mby5leGlzdHM7CisKKwlpZiAoKGx2LT5zdGF0dXMgJiBMVk1fV1JJVEUpICYmIGlua2VybmVsICYmIGluZm8ucmVhZF9vbmx5KQorCQlhY2Nlc3Nfc3RyID0gInJlYWQvd3JpdGUgKGFjdGl2YXRlZCByZWFkIG9ubHkpIjsKKwllbHNlIGlmIChsdi0+c3RhdHVzICYgTFZNX1dSSVRFKQorCQlhY2Nlc3Nfc3RyID0gInJlYWQvd3JpdGUiOworCWVsc2UKKwkJYWNjZXNzX3N0ciA9ICJyZWFkIG9ubHkiOworCisJbG9nX3ByaW50KCItLS0gTG9naWNhbCB2b2x1bWUgLS0tIik7CisKKwlsdm0xY29tcGF0ID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX2x2ZGlzcGxheV9zaG93c19mdWxsX2RldmljZV9wYXRoX0NGRywgTlVMTCk7CisKKwlpZiAobHZtMWNvbXBhdCkKKwkJLyogL2Rldi92Z25hbWUvbHZuYW1lIGRvZW4ndCBhY3R1YWxseSBleGlzdCBmb3IgaW50ZXJuYWwgZGV2aWNlcyAqLworCQlsb2dfcHJpbnQoIkxWIE5hbWUgICAgICAgICAgICAgICAgJXMlcy8lcyIsCisJCQkgIGx2LT52Zy0+Y21kLT5kZXZfZGlyLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwllbHNlIGlmIChsdl9pc192aXNpYmxlKGx2KSkgeworCQkvKiBUaGluIHBvb2wgZG9lcyBub3QgaGF2ZSAvZGV2L3ZnL25hbWUgbGluayAqLworCQlpZiAoIWx2X2lzX3RoaW5fcG9vbChsdikpCisJCQlsb2dfcHJpbnQoIkxWIFBhdGggICAgICAgICAgICAgICAgJXMlcy8lcyIsCisJCQkJICBsdi0+dmctPmNtZC0+ZGV2X2RpciwKKwkJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlsb2dfcHJpbnQoIkxWIE5hbWUgICAgICAgICAgICAgICAgJXMiLCBsdi0+bmFtZSk7CisJfSBlbHNlCisJCWxvZ19wcmludCgiSW50ZXJuYWwgTFYgTmFtZSAgICAgICAlcyIsIGx2LT5uYW1lKTsKKworCWxvZ19wcmludCgiVkcgTmFtZSAgICAgICAgICAgICAgICAlcyIsIGx2LT52Zy0+bmFtZSk7CisJbG9nX3ByaW50KCJMViBVVUlEICAgICAgICAgICAgICAgICVzIiwgdXVpZCk7CisJbG9nX3ByaW50KCJMViBXcml0ZSBBY2Nlc3MgICAgICAgICVzIiwgYWNjZXNzX3N0cik7CisJbG9nX3ByaW50KCJMViBDcmVhdGlvbiBob3N0LCB0aW1lICVzLCAlcyIsCisJCSAgbHZfaG9zdF9kdXAoY21kLT5tZW0sIGx2KSwgbHZfY3JlYXRpb25fdGltZV9kdXAoY21kLT5tZW0sIGx2LCAxKSk7CisKKwlpZiAobHZfaXNfb3JpZ2luKGx2KSkgeworCQlsb2dfcHJpbnQoIkxWIHNuYXBzaG90IHN0YXR1cyAgICAgc291cmNlIG9mIik7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbihzbmFwX3NlZywgJmx2LT5zbmFwc2hvdF9zZWdzLAorCQkJCSAgICAgICBvcmlnaW5fbGlzdCkgeworCQkJaWYgKGlua2VybmVsICYmCisJCQkgICAgKHNuYXBfYWN0aXZlID0gbHZfc25hcHNob3RfcGVyY2VudChzbmFwX3NlZy0+Y293LAorCQkJCQkJCSAgICAgICAmc25hcF9wZXJjZW50KSkpCisJCQkJaWYgKHNuYXBfcGVyY2VudCA9PSBETV9QRVJDRU5UX0lOVkFMSUQpCisJCQkJCXNuYXBfYWN0aXZlID0gMDsKKwkJCWlmIChsdm0xY29tcGF0KQorCQkJCWxvZ19wcmludCgiICAgICAgICAgICAgICAgICAgICAgICAlcyVzLyVzIFslc10iLAorCQkJCQkgIGx2LT52Zy0+Y21kLT5kZXZfZGlyLCBsdi0+dmctPm5hbWUsCisJCQkJCSAgc25hcF9zZWctPmNvdy0+bmFtZSwKKwkJCQkJICBzbmFwX2FjdGl2ZSA/ICJhY3RpdmUiIDogIklOQUNUSVZFIik7CisJCQllbHNlCisJCQkJbG9nX3ByaW50KCIgICAgICAgICAgICAgICAgICAgICAgICVzIFslc10iLAorCQkJCQkgIHNuYXBfc2VnLT5jb3ctPm5hbWUsCisJCQkJCSAgc25hcF9hY3RpdmUgPyAiYWN0aXZlIiA6ICJJTkFDVElWRSIpOworCQl9CisJCXNuYXBfc2VnID0gTlVMTDsKKwl9IGVsc2UgaWYgKChzbmFwX3NlZyA9IGZpbmRfc25hcHNob3QobHYpKSkgeworCQlpZiAoaW5rZXJuZWwgJiYKKwkJICAgIChzbmFwX2FjdGl2ZSA9IGx2X3NuYXBzaG90X3BlcmNlbnQoc25hcF9zZWctPmNvdywKKwkJCQkJCSAgICAgICAmc25hcF9wZXJjZW50KSkpCisJCQlpZiAoc25hcF9wZXJjZW50ID09IERNX1BFUkNFTlRfSU5WQUxJRCkKKwkJCQlzbmFwX2FjdGl2ZSA9IDA7CisKKwkJaWYgKGx2bTFjb21wYXQpCisJCQlsb2dfcHJpbnQoIkxWIHNuYXBzaG90IHN0YXR1cyAgICAgJXMgZGVzdGluYXRpb24gZm9yICVzJXMvJXMiLAorCQkJCSAgc25hcF9hY3RpdmUgPyAiYWN0aXZlIiA6ICJJTkFDVElWRSIsCisJCQkJICBsdi0+dmctPmNtZC0+ZGV2X2RpciwgbHYtPnZnLT5uYW1lLAorCQkJCSAgc25hcF9zZWctPm9yaWdpbi0+bmFtZSk7CisJCWVsc2UKKwkJCWxvZ19wcmludCgiTFYgc25hcHNob3Qgc3RhdHVzICAgICAlcyBkZXN0aW5hdGlvbiBmb3IgJXMiLAorCQkJCSAgc25hcF9hY3RpdmUgPyAiYWN0aXZlIiA6ICJJTkFDVElWRSIsCisJCQkJICBzbmFwX3NlZy0+b3JpZ2luLT5uYW1lKTsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCXNlZyA9IGZpcnN0X3NlZyhsdik7CisJCWxvZ19wcmludCgiTFYgUG9vbCBuYW1lICAgICAgICAgICAlcyIsIHNlZy0+cG9vbF9sdi0+bmFtZSk7CisJCWlmIChzZWctPm9yaWdpbikKKwkJCWxvZ19wcmludCgiTFYgVGhpbiBvcmlnaW4gbmFtZSAgICAlcyIsCisJCQkJICBzZWctPm9yaWdpbi0+bmFtZSk7CisJCWlmIChzZWctPmV4dGVybmFsX2x2KQorCQkJbG9nX3ByaW50KCJMViBFeHRlcm5hbCBvcmlnaW4gbmFtZSAlcyIsCisJCQkJICBzZWctPmV4dGVybmFsX2x2LT5uYW1lKTsKKwkJaWYgKHNlZy0+bWVyZ2VfbHYpCisJCQlsb2dfcHJpbnQoIkxWIG1lcmdpbmcgdG8gICAgICAgICAgJXMiLAorCQkJCSAgc2VnLT5tZXJnZV9sdi0+bmFtZSk7CisJCWlmIChpbmtlcm5lbCkKKwkJCXRoaW5fYWN0aXZlID0gbHZfdGhpbl9wZXJjZW50KGx2LCAwLCAmdGhpbl9wZXJjZW50KTsKKwkJaWYgKGx2X2lzX21lcmdpbmdfb3JpZ2luKGx2KSkKKwkJCWxvZ19wcmludCgiTFYgbWVyZ2VkIHdpdGggICAgICAgICAlcyIsCisJCQkJICBmaW5kX3NuYXBzaG90KGx2KS0+bHYtPm5hbWUpOworCX0gZWxzZSBpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQlpZiAobHZfaW5mbyhjbWQsIGx2LCAxLCAmaW5mbywgMSwgMSkgJiYgaW5mby5leGlzdHMpIHsKKwkJCXRoaW5fZGF0YV9hY3RpdmUgPSBsdl90aGluX3Bvb2xfcGVyY2VudChsdiwgMCwgJnRoaW5fZGF0YV9wZXJjZW50KTsKKwkJCXRoaW5fbWV0YWRhdGFfYWN0aXZlID0gbHZfdGhpbl9wb29sX3BlcmNlbnQobHYsIDEsICZ0aGluX21ldGFkYXRhX3BlcmNlbnQpOworCQl9CisJCS8qIEZJWE1FOiBkaXNwbGF5IHRoaW5fcG9vbCB0YXJnZXRzIHRyYW5zaWQgZm9yIGFjdGl2YXRlZCBMViBhcyB3ZWxsICovCisJCXNlZyA9IGZpcnN0X3NlZyhsdik7CisJCWxvZ19wcmludCgiTFYgUG9vbCBtZXRhZGF0YSAgICAgICAlcyIsIHNlZy0+bWV0YWRhdGFfbHYtPm5hbWUpOworCQlsb2dfcHJpbnQoIkxWIFBvb2wgZGF0YSAgICAgICAgICAgJXMiLCBzZWdfbHYoc2VnLCAwKS0+bmFtZSk7CisJfQorCisJaWYgKGlua2VybmVsICYmIGluZm8uc3VzcGVuZGVkKQorCQlsb2dfcHJpbnQoIkxWIFN0YXR1cyAgICAgICAgICAgICAgc3VzcGVuZGVkIik7CisJZWxzZSBpZiAoYWN0aXZhdGlvbigpKQorCQlsb2dfcHJpbnQoIkxWIFN0YXR1cyAgICAgICAgICAgICAgJXNhdmFpbGFibGUiLAorCQkJICBpbmtlcm5lbCA/ICIiIDogIk5PVCAiKTsKKworLyoqKioqKioqKiBGSVhNRSBsdl9udW1iZXIKKyAgICBsb2dfcHJpbnQoIkxWICMgICAgICAgICAgICAgICAgICAgJXUiLCBsdi0+bHZfbnVtYmVyICsgMSk7CisqKioqKioqKioqKiovCisKKwlpZiAoaW5rZXJuZWwpCisJCWxvZ19wcmludCgiIyBvcGVuICAgICAgICAgICAgICAgICAldSIsIGluZm8ub3Blbl9jb3VudCk7CisKKwlsb2dfcHJpbnQoIkxWIFNpemUgICAgICAgICAgICAgICAgJXMiLAorCQkgIGRpc3BsYXlfc2l6ZShjbWQsCisJCQkgICAgICAgc25hcF9zZWcgPyBzbmFwX3NlZy0+b3JpZ2luLT5zaXplIDogbHYtPnNpemUpKTsKKworCWlmICh0aGluX2RhdGFfYWN0aXZlKQorCQlsb2dfcHJpbnQoIkFsbG9jYXRlZCBwb29sIGRhdGEgICAgJS4yZiUlIiwKKwkJCSAgZG1fcGVyY2VudF90b19mbG9hdCh0aGluX2RhdGFfcGVyY2VudCkpOworCisJaWYgKHRoaW5fbWV0YWRhdGFfYWN0aXZlKQorCQlsb2dfcHJpbnQoIkFsbG9jYXRlZCBtZXRhZGF0YSAgICAgJS4yZiUlIiwKKwkJCSAgZG1fcGVyY2VudF90b19mbG9hdCh0aGluX21ldGFkYXRhX3BlcmNlbnQpKTsKKworCWlmICh0aGluX2FjdGl2ZSkKKwkJbG9nX3ByaW50KCJNYXBwZWQgc2l6ZSAgICAgICAgICAgICUuMmYlJSIsCisJCQkgIGRtX3BlcmNlbnRfdG9fZmxvYXQodGhpbl9wZXJjZW50KSk7CisKKwlsb2dfcHJpbnQoIkN1cnJlbnQgTEUgICAgICAgICAgICAgJXUiLAorCQkgIHNuYXBfc2VnID8gc25hcF9zZWctPm9yaWdpbi0+bGVfY291bnQgOiBsdi0+bGVfY291bnQpOworCisJaWYgKHNuYXBfc2VnKSB7CisJCWxvZ19wcmludCgiQ09XLXRhYmxlIHNpemUgICAgICAgICAlcyIsCisJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgbHYtPnNpemUpKTsKKwkJbG9nX3ByaW50KCJDT1ctdGFibGUgTEUgICAgICAgICAgICV1IiwgbHYtPmxlX2NvdW50KTsKKworCQlpZiAoc25hcF9hY3RpdmUpCisJCQlsb2dfcHJpbnQoIkFsbG9jYXRlZCB0byBzbmFwc2hvdCAgJS4yZiUlIiwKKwkJCQkgIGRtX3BlcmNlbnRfdG9fZmxvYXQoc25hcF9wZXJjZW50KSk7CisKKwkJbG9nX3ByaW50KCJTbmFwc2hvdCBjaHVuayBzaXplICAgICVzIiwKKwkJCSAgZGlzcGxheV9zaXplKGNtZCwgKHVpbnQ2NF90KSBzbmFwX3NlZy0+Y2h1bmtfc2l6ZSkpOworCX0KKworCWlmIChsdl9pc19taXJyb3JlZChsdikpIHsKKwkJbWlycm9yX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJCWxvZ19wcmludCgiTWlycm9yZWQgdm9sdW1lcyAgICAgICAlIiBQUkl1MzIsIG1pcnJvcl9zZWctPmFyZWFfY291bnQpOworCQlpZiAobHZfaXNfY29udmVydGluZyhsdikpCisJCQlsb2dfcHJpbnQoIkxWIHR5cGUgICAgICAgIE1pcnJvciB1bmRlcmdvaW5nIGNvbnZlcnNpb24iKTsKKwl9CisKKwlsb2dfcHJpbnQoIlNlZ21lbnRzICAgICAgICAgICAgICAgJXUiLCBkbV9saXN0X3NpemUoJmx2LT5zZWdtZW50cykpOworCisvKioqKioqKioqIEZJWE1FIFN0cmlwZXMgJiBzdHJpcGVzaXplIGZvciBlYWNoIHNlZ21lbnQKKwlsb2dfcHJpbnQoIlN0cmlwZSBzaXplICAgICAgICAgICAgJXMiLCBkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIGx2LT5zdHJpcGVzaXplKSk7CisqKioqKioqKioqKi8KKworCWxvZ19wcmludCgiQWxsb2NhdGlvbiAgICAgICAgICAgICAlcyIsIGdldF9hbGxvY19zdHJpbmcobHYtPmFsbG9jKSk7CisJaWYgKGx2LT5yZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfQVVUTykKKwkJbG9nX3ByaW50KCJSZWFkIGFoZWFkIHNlY3RvcnMgICAgIGF1dG8iKTsKKwllbHNlIGlmIChsdi0+cmVhZF9haGVhZCA9PSBETV9SRUFEX0FIRUFEX05PTkUpCisJCWxvZ19wcmludCgiUmVhZCBhaGVhZCBzZWN0b3JzICAgICAwIik7CisJZWxzZQorCQlsb2dfcHJpbnQoIlJlYWQgYWhlYWQgc2VjdG9ycyAgICAgJXUiLCBsdi0+cmVhZF9haGVhZCk7CisKKwlpZiAoaW5rZXJuZWwgJiYgbHYtPnJlYWRfYWhlYWQgIT0gaW5mby5yZWFkX2FoZWFkKQorCQlsb2dfcHJpbnQoIi0gY3VycmVudGx5IHNldCB0byAgICAgJXUiLCBpbmZvLnJlYWRfYWhlYWQpOworCisJaWYgKGx2LT5zdGF0dXMgJiBGSVhFRF9NSU5PUikgeworCQlpZiAobHYtPm1ham9yID49IDApCisJCQlsb2dfcHJpbnQoIlBlcnNpc3RlbnQgbWFqb3IgICAgICAgJWQiLCBsdi0+bWFqb3IpOworCQlsb2dfcHJpbnQoIlBlcnNpc3RlbnQgbWlub3IgICAgICAgJWQiLCBsdi0+bWlub3IpOworCX0KKworCWlmIChpbmtlcm5lbCkKKwkJbG9nX3ByaW50KCJCbG9jayBkZXZpY2UgICAgICAgICAgICVkOiVkIiwgaW5mby5tYWpvciwKKwkJCSAgaW5mby5taW5vcik7CisKKwlsb2dfcHJpbnQoIiAiKTsKKworCXJldHVybiAxOyAvKiBFQ01EX1BST0NFU1NFRCAqLworfQorCit2b2lkIGRpc3BsYXlfc3RyaXBlKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHVpbnQzMl90IHMsIGNvbnN0IGNoYXIgKnByZSkKK3sKKwlzd2l0Y2ggKHNlZ190eXBlKHNlZywgcykpIHsKKwljYXNlIEFSRUFfUFY6CisJCS8qIEZJWE1FIFJlLWNoZWNrIHRoZSBjb25kaXRpb25zIGZvciAnTWlzc2luZycgKi8KKwkJbG9nX3ByaW50KCIlc1BoeXNpY2FsIHZvbHVtZVx0JXMiLCBwcmUsCisJCQkgIHNlZ19wdihzZWcsIHMpID8KKwkJCSAgcHZfZGV2X25hbWUoc2VnX3B2KHNlZywgcykpIDoKKwkJCSAgICAiTWlzc2luZyIpOworCisJCWlmIChzZWdfcHYoc2VnLCBzKSkKKwkJCWxvZ19wcmludCgiJXNQaHlzaWNhbCBleHRlbnRzXHQlZCB0byAlZCIsIHByZSwKKwkJCQkgIHNlZ19wZShzZWcsIHMpLAorCQkJCSAgc2VnX3BlKHNlZywgcykgKyBzZWctPmFyZWFfbGVuIC0gMSk7CisJCWJyZWFrOworCWNhc2UgQVJFQV9MVjoKKwkJbG9nX3ByaW50KCIlc0xvZ2ljYWwgdm9sdW1lXHQlcyIsIHByZSwKKwkJCSAgc2VnX2x2KHNlZywgcykgPworCQkJICBzZWdfbHYoc2VnLCBzKS0+bmFtZSA6ICJNaXNzaW5nIik7CisKKwkJaWYgKHNlZ19sdihzZWcsIHMpKQorCQkJbG9nX3ByaW50KCIlc0xvZ2ljYWwgZXh0ZW50c1x0JWQgdG8gJWQiLCBwcmUsCisJCQkJICBzZWdfbGUoc2VnLCBzKSwKKwkJCQkgIHNlZ19sZShzZWcsIHMpICsgc2VnLT5hcmVhX2xlbiAtIDEpOworCQlicmVhazsKKwljYXNlIEFSRUFfVU5BU1NJR05FRDoKKwkJbG9nX3ByaW50KCIlc1VuYXNzaWduZWQgYXJlYSIsIHByZSk7CisJfQorfQorCitpbnQgbHZkaXNwbGF5X3NlZ21lbnRzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWxvZ19wcmludCgiLS0tIFNlZ21lbnRzIC0tLSIpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlsb2dfcHJpbnQoIiVzIGV4dGVudHMgJXUgdG8gJXU6IiwKKwkJCSAgbHZfaXNfdmlydHVhbChsdikgPyAiVmlydHVhbCIgOiAiTG9naWNhbCIsCisJCQkgIHNlZy0+bGUsIHNlZy0+bGUgKyBzZWctPmxlbiAtIDEpOworCisJCWxvZ19wcmludCgiICBUeXBlXHRcdCVzIiwgbHZzZWdfbmFtZShzZWcpKTsKKworCQlpZiAoc2VnLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9tb25pdG9yZWQpCisJCQlsb2dfcHJpbnQoIiAgTW9uaXRvcmluZ1x0XHQlcyIsCisJCQkJICBsdnNlZ19tb25pdG9yX2R1cChsdi0+dmctPmNtZC0+bWVtLCBzZWcpKTsKKworCQlpZiAoc2VnLT5zZWd0eXBlLT5vcHMtPmRpc3BsYXkpCisJCQlzZWctPnNlZ3R5cGUtPm9wcy0+ZGlzcGxheShzZWcpOworCX0KKworCWxvZ19wcmludCgiICIpOworCXJldHVybiAxOworfQorCit2b2lkIHZnZGlzcGxheV9leHRlbnRzKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworfQorCit2b2lkIHZnZGlzcGxheV9mdWxsKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXVpbnQzMl90IGFjY2Vzc19zdHI7CisJdWludDMyX3QgYWN0aXZlX3B2czsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCWFjdGl2ZV9wdnMgPSB2Zy0+cHZfY291bnQgLSB2Z19taXNzaW5nX3B2X2NvdW50KHZnKTsKKworCWxvZ19wcmludCgiLS0tIFZvbHVtZSBncm91cCAtLS0iKTsKKwlsb2dfcHJpbnQoIlZHIE5hbWUgICAgICAgICAgICAgICAlcyIsIHZnLT5uYW1lKTsKKwlsb2dfcHJpbnQoIlN5c3RlbSBJRCAgICAgICAgICAgICAlcyIsICh2Zy0+c3lzdGVtX2lkICYmICp2Zy0+c3lzdGVtX2lkKSA/IHZnLT5zeXN0ZW1faWQgOiB2Zy0+bHZtMV9zeXN0ZW1faWQgPyA6ICIiKTsKKwlsb2dfcHJpbnQoIkZvcm1hdCAgICAgICAgICAgICAgICAlcyIsIHZnLT5maWQtPmZtdC0+bmFtZSk7CisJaWYgKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfTURBUykgeworCQlsb2dfcHJpbnQoIk1ldGFkYXRhIEFyZWFzICAgICAgICAlZCIsCisJCQkgIHZnX21kYV9jb3VudCh2ZykpOworCQlsb2dfcHJpbnQoIk1ldGFkYXRhIFNlcXVlbmNlIE5vICAlZCIsIHZnLT5zZXFubyk7CisJfQorCWFjY2Vzc19zdHIgPSB2Zy0+c3RhdHVzICYgKExWTV9SRUFEIHwgTFZNX1dSSVRFKTsKKwlsb2dfcHJpbnQoIlZHIEFjY2VzcyAgICAgICAgICAgICAlcyVzJXMlcyIsCisJCSAgYWNjZXNzX3N0ciA9PSAoTFZNX1JFQUQgfCBMVk1fV1JJVEUpID8gInJlYWQvd3JpdGUiIDogIiIsCisJCSAgYWNjZXNzX3N0ciA9PSBMVk1fUkVBRCA/ICJyZWFkIiA6ICIiLAorCQkgIGFjY2Vzc19zdHIgPT0gTFZNX1dSSVRFID8gIndyaXRlIiA6ICIiLAorCQkgIGFjY2Vzc19zdHIgPT0gMCA/ICJlcnJvciIgOiAiIik7CisJbG9nX3ByaW50KCJWRyBTdGF0dXMgICAgICAgICAgICAgJXMlc3Jlc2l6YWJsZSIsCisJCSAgdmdfaXNfZXhwb3J0ZWQodmcpID8gImV4cG9ydGVkLyIgOiAiIiwKKwkJICB2Z19pc19yZXNpemVhYmxlKHZnKSA/ICIiIDogIk5PVCAiKTsKKwkvKiB2ZyBudW1iZXIgbm90IHBhcnQgb2YgTFZNMiBkZXNpZ24KKwkgICBsb2dfcHJpbnQgKCJWRyAjICAgICAgICAgICAgICAgICAgJXVcbiIsIHZnLT52Z19udW1iZXIpOworCSAqLworCWlmICh2Z19pc19jbHVzdGVyZWQodmcpKSB7CisJCWxvZ19wcmludCgiQ2x1c3RlcmVkICAgICAgICAgICAgIHllcyIpOworCQlsb2dfcHJpbnQoIlNoYXJlZCAgICAgICAgICAgICAgICAlcyIsCisJCQkgIHZnLT5zdGF0dXMgJiBTSEFSRUQgPyAieWVzIiA6ICJubyIpOworCX0KKworCWxvZ19wcmludCgiTUFYIExWICAgICAgICAgICAgICAgICV1IiwgdmctPm1heF9sdik7CisJbG9nX3ByaW50KCJDdXIgTFYgICAgICAgICAgICAgICAgJXUiLCB2Z192aXNpYmxlX2x2cyh2ZykpOworCWxvZ19wcmludCgiT3BlbiBMViAgICAgICAgICAgICAgICV1IiwgbHZzX2luX3ZnX29wZW5lZCh2ZykpOworLyoqKioqKiBGSVhNRSBNYXggTFYgU2l6ZQorICAgICAgbG9nX3ByaW50ICggIk1BWCBMViBTaXplICAgICAgICAgICAlcyIsCisgICAgICAgICAgICAgICAoIHMxID0gZGlzcGxheV9zaXplICggTFZNX0xWX1NJWkVfTUFYKHZnKSkpKTsKKyAgICAgIGZyZWUgKCBzMSk7CisqKioqKioqKiovCisJbG9nX3ByaW50KCJNYXggUFYgICAgICAgICAgICAgICAgJXUiLCB2Zy0+bWF4X3B2KTsKKwlsb2dfcHJpbnQoIkN1ciBQViAgICAgICAgICAgICAgICAldSIsIHZnLT5wdl9jb3VudCk7CisJbG9nX3ByaW50KCJBY3QgUFYgICAgICAgICAgICAgICAgJXUiLCBhY3RpdmVfcHZzKTsKKworCWxvZ19wcmludCgiVkcgU2l6ZSAgICAgICAgICAgICAgICVzIiwKKwkJICBkaXNwbGF5X3NpemUodmctPmNtZCwKKwkJCSAgICAgICAodWludDY0X3QpIHZnLT5leHRlbnRfY291bnQgKiB2Zy0+ZXh0ZW50X3NpemUpKTsKKworCWxvZ19wcmludCgiUEUgU2l6ZSAgICAgICAgICAgICAgICVzIiwKKwkJICBkaXNwbGF5X3NpemUodmctPmNtZCwgdmctPmV4dGVudF9zaXplKSk7CisKKwlsb2dfcHJpbnQoIlRvdGFsIFBFICAgICAgICAgICAgICAldSIsIHZnLT5leHRlbnRfY291bnQpOworCisJbG9nX3ByaW50KCJBbGxvYyBQRSAvIFNpemUgICAgICAgJXUgLyAlcyIsCisJCSAgdmctPmV4dGVudF9jb3VudCAtIHZnLT5mcmVlX2NvdW50LAorCQkgIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLAorCQkJICAgICAgICh1aW50NjRfdCkgKHZnLT5leHRlbnRfY291bnQgLSB2Zy0+ZnJlZV9jb3VudCkgKgorCQkJICAgICAgIHZnLT5leHRlbnRfc2l6ZSkpOworCisJbG9nX3ByaW50KCJGcmVlICBQRSAvIFNpemUgICAgICAgJXUgLyAlcyIsIHZnLT5mcmVlX2NvdW50LAorCQkgIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCB2Z19mcmVlKHZnKSkpOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnZnLT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkgeworCQlzdGFjazsKKwkJcmV0dXJuOworCX0KKworCWxvZ19wcmludCgiVkcgVVVJRCAgICAgICAgICAgICAgICVzIiwgdXVpZCk7CisJbG9nX3ByaW50KCIgIik7Cit9CisKK3ZvaWQgdmdkaXNwbGF5X2NvbG9ucyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwl1aW50MzJfdCBhY3RpdmVfcHZzOworCWNvbnN0IGNoYXIgKmFjY2Vzc19zdHI7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKKwlhY3RpdmVfcHZzID0gdmctPnB2X2NvdW50IC0gdmdfbWlzc2luZ19wdl9jb3VudCh2Zyk7CisKKwlzd2l0Y2ggKHZnLT5zdGF0dXMgJiAoTFZNX1JFQUQgfCBMVk1fV1JJVEUpKSB7CisJCWNhc2UgTFZNX1JFQUQgfCBMVk1fV1JJVEU6CisJCQlhY2Nlc3Nfc3RyID0gInIvdyI7CisJCQlicmVhazsKKwkJY2FzZSBMVk1fUkVBRDoKKwkJCWFjY2Vzc19zdHIgPSAiciI7CisJCQlicmVhazsKKwkJY2FzZSBMVk1fV1JJVEU6CisJCQlhY2Nlc3Nfc3RyID0gInciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhY2Nlc3Nfc3RyID0gIiI7CisJfQorCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnZnLT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkgeworCQlzdGFjazsKKwkJcmV0dXJuOworCX0KKworCWxvZ19wcmludCgiJXM6JXM6JSIgUFJJdTY0ICI6LTE6JXU6JXU6JXU6LTE6JXU6JXU6JXU6JSIgUFJJdTY0ICI6JSIgUFJJdTMyCisJCSAgIjoldToldToldTolcyIsCisJCXZnLT5uYW1lLAorCQlhY2Nlc3Nfc3RyLAorCQl2Zy0+c3RhdHVzLAorCQkvKiBpbnRlcm5hbCB2b2x1bWUgZ3JvdXAgbnVtYmVyOyBvYnNvbGV0ZSAqLworCQl2Zy0+bWF4X2x2LAorCQl2Z192aXNpYmxlX2x2cyh2ZyksCisJCWx2c19pbl92Z19vcGVuZWQodmcpLAorCQkvKiBGSVhNRTogbWF4aW11bSBsb2dpY2FsIHZvbHVtZSBzaXplICovCisJCXZnLT5tYXhfcHYsCisJCXZnLT5wdl9jb3VudCwKKwkJYWN0aXZlX3B2cywKKwkJKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X2NvdW50ICogKHZnLT5leHRlbnRfc2l6ZSAvIDIpLAorCQl2Zy0+ZXh0ZW50X3NpemUgLyAyLAorCQl2Zy0+ZXh0ZW50X2NvdW50LAorCQl2Zy0+ZXh0ZW50X2NvdW50IC0gdmctPmZyZWVfY291bnQsCisJCXZnLT5mcmVlX2NvdW50LAorCQl1dWlkWzBdID8gdXVpZCA6ICJub25lIik7Cit9CisKK3ZvaWQgdmdkaXNwbGF5X3Nob3J0KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWxvZ19wcmludCgiXCIlc1wiICUtOXMgWyUtOXMgdXNlZCAvICVzIGZyZWVdIiwgdmctPm5hbWUsCisvKioqKioqKioqIEZJWE1FIGlmICJvcGVuIiBwcmludCAiL3VzZWQiIGVsc2UgcHJpbnQgIi9pZGxlIj8/PyAgKioqKioqLworCQkgIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLAorCQkJICAgICAgICh1aW50NjRfdCkgdmctPmV4dGVudF9jb3VudCAqIHZnLT5leHRlbnRfc2l6ZSksCisJCSAgZGlzcGxheV9zaXplKHZnLT5jbWQsCisJCQkgICAgICAgKCh1aW50NjRfdCkgdmctPmV4dGVudF9jb3VudCAtCisJCQkJdmctPmZyZWVfY291bnQpICogdmctPmV4dGVudF9zaXplKSwKKwkJICBkaXNwbGF5X3NpemUodmctPmNtZCwgdmdfZnJlZSh2ZykpKTsKK30KKwordm9pZCBkaXNwbGF5X2Zvcm1hdHMoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZm10LCAmY21kLT5mb3JtYXRzKSB7CisJCWxvZ19wcmludCgiJXMiLCBmbXQtPm5hbWUpOworCX0KK30KKwordm9pZCBkaXNwbGF5X3NlZ3R5cGVzKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VndHlwZSwgJmNtZC0+c2VndHlwZXMpIHsKKwkJbG9nX3ByaW50KCIlcyIsIHNlZ3R5cGUtPm5hbWUpOworCX0KK30KKwordm9pZCBkaXNwbGF5X3RhZ3MoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmNtZC0+dGFncykgeworCQlsb2dfcHJpbnQoIiVzIiwgc2wtPnN0cik7CisJfQorfQorCit2b2lkIGRpc3BsYXlfbmFtZV9lcnJvcihuYW1lX2Vycm9yX3QgbmFtZV9lcnJvcikKK3sKKwlzd2l0Y2gobmFtZV9lcnJvcikgeworCWNhc2UgTkFNRV9WQUxJRDoKKwkJLyogVmFsaWQgbmFtZSAqLworCQlicmVhazsKKwljYXNlIE5BTUVfSU5WQUxJRF9FTVBUWToKKwkJbG9nX2Vycm9yKCJOYW1lIGlzIHplcm8gbGVuZ3RoLiIpOworCQlicmVhazsKKwljYXNlIE5BTUVfSU5WQUxJRF9IWVBIRU46CisJCWxvZ19lcnJvcigiTmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBoeXBoZW4uIik7CisJCWJyZWFrOworCWNhc2UgTkFNRV9JTlZBTElEX0RPVFM6CisJCWxvZ19lcnJvcigiTmFtZSBzdGFydHMgd2l0aCAuIG9yIC4uIGFuZCBoYXMgbm8gIgorCQkJICAiZm9sbG93aW5nIGNoYXJhY3RlcihzKS4iKTsKKwkJYnJlYWs7CisJY2FzZSBOQU1FX0lOVkFMSURfQ0hBUlNFVDoKKwkJbG9nX2Vycm9yKCJOYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLCB2YWxpZCBzZXQgaW5jbHVkZXM6ICIKKwkJCSAgIlthLXpBLVowLTkuLV8rXS4iKTsKKwkJYnJlYWs7CisJY2FzZSBOQU1FX0lOVkFMSURfTEVOR1RIOgorCQkvKiBSZXBvcnQgdGhhdCBuYW1lIGxlbmd0aCAtIDEgdG8gYWNjb21tb2RhdGUgbnVsKi8KKwkJbG9nX2Vycm9yKCJOYW1lIGxlbmd0aCBleGNlZWRzIG1heGltdW0gbGltaXQgb2YgJWQuIiwgKE5BTUVfTEVOIC0gMSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVua25vd24gZXJyb3IgJWQgb24gbmFtZSB2YWxpZGF0aW9uLiIsIG5hbWVfZXJyb3IpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBQcm9tcHQgZm9yIHkgb3IgbiBmcm9tIHN0ZGluLgorICogRGVmYXVsdHMgdG8gJ25vJyBpbiBzaWxlbnQgbW9kZS4KKyAqIEFsbCBjYWxsZXJzIHNob3VsZCBzdXBwb3J0IC0teWVzIGFuZC9vciAtLWZvcmNlIHRvIG92ZXJyaWRlIHRoaXMuCisgKgorICogQWNjZXB0ZWQgYXJlIGVpdGhlciBfeWVzW10gb3IgX25vW10gc3RyaW5ncyBvciBqdXN0IHRoZWlyIG91dHNldC4KKyAqIFdoZW4gcnVubmluZyB3aXRob3V0ICd0dHknIHN0ZGluIGlzIHByaW50ZWQgdG8gc3RkZXJyLgorICogJ1llcycgaXMgYWNjZXB0ZWQgT05MWSB3aXRoICdcbicuCisgKi8KK2NoYXIgeWVzX25vX3Byb21wdChjb25zdCBjaGFyICpwcm9tcHQsIC4uLikKK3sKKwkvKiBMb3dlcmNhc2UgWWVzL05vIHN0cmluZ3MgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBfeWVzW10gPSAieWVzIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfbm9bXSA9ICJubyI7CisJY29uc3QgY2hhciAqYW5zd2VyID0gTlVMTDsKKwlpbnQgYyA9IHNpbGVudF9tb2RlKCkgPyBFT0YgOiAwOworCWludCBpID0gMCwgcmV0ID0gMCwgc2lnID0gMDsKKwljaGFyIGJ1ZlsxMl07CisJdmFfbGlzdCBhcDsKKworCXNpZ2ludF9hbGxvdygpOworCisJZm9yICg7OykgeworCQlpZiAoIXJldCkgeworCQkJLyogU2hvdyBwcm9tcHQgKi8KKwkJCXZhX3N0YXJ0KGFwLCBwcm9tcHQpOworCQkJdmZwcmludGYoc3RkZXJyLCBwcm9tcHQsIGFwKTsKKwkJCXZhX2VuZChhcCk7CisJCQlmZmx1c2goc3RkZXJyKTsKKworCQkJaWYgKGMgPT0gRU9GKQorCQkJCWJyZWFrOworCisJCQlpID0gMDsKKwkJCWFuc3dlciA9IE5VTEw7CisJCX0KKworCW5leHRjaGFyOgorCQlpZiAoKHNpZyA9IHNpZ2ludF9jYXVnaHQoKSkpCisJCQlicmVhazsJLyogQ2hlY2sgaWYgYWxyZWFkeSBpbnRlcnJ1cHRlZCBiZWZvcmUgZ2V0Y2hhcigpICovCisKKwkJaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpIHsKKwkJCS8qIFNJR05BTCBvciBubyBjaGFycyBvbiBzdGRpbiAobWlzc2luZyAnXG4nKSBvciBeRCAqLworCQkJaWYgKCFpKQorCQkJCWJyZWFrOyAvKiBKdXN0IHNob3duIHByb21wdCwtPiBwcmludCBbbl1cbiAqLworCisJCQlnb3RvIGludmFsaWQ7IC8qIE5vdGU6ICBjIGhvbGRzIEVPRiAqLworCQl9CisKKwkJaWYgKChpIDwgKHNpemVvZihidWYpIC0gNCkpICYmIGlzcHJpbnQoYykpCisJCQlidWZbaSsrXSA9IGM7CisKKwkJYyA9IHRvbG93ZXIoYyk7CisKKwkJaWYgKChyZXQgPiAwKSAmJiAoYyA9PSBhbnN3ZXJbMF0pKQorCQkJYW5zd2VyKys7CS8qIE1hdGNoaW5nLCBuZXh0IGNoYXIgKi8KKwkJZWxzZSBpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAoZmVvZihzdGRpbikpCisJCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWlmIChyZXQgPiAwKQorCQkJCWJyZWFrOwkvKiBBbnN3ZXJlZCAqLworCWludmFsaWQ6CisJCQlpZiAoaSA+PSAoc2l6ZW9mKGJ1ZikgLSA0KSkgeworCQkJCS8qICcuLi4nICBmb3IgbWlzc2luZyBpbnB1dCAqLworCQkJCWkgPSBzaXplb2YoYnVmKSAtIDE7CisJCQkJYnVmW2kgLSAxXSA9IGJ1ZltpIC0gMl0gPSBidWZbaSAtIDNdID0gJy4nOworCQkJfQorCQkJYnVmW2ldID0gMDsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBJbnZhbGlkIGlucHV0ICclcycuIiwgYnVmKTsKKwkJCXJldCA9IDA7CS8qIE90aGVyd2lzZSByZWZyZXNoIHByb21wdCAqLworCQl9IGVsc2UgaWYgKCFyZXQgJiYgKGMgPT0gX3llc1swXSkpIHsKKwkJCXJldCA9ICd5JzsKKwkJCWFuc3dlciA9IF95ZXMgKyAxOwkvKiBFeHBlY3RpbmcgJ1llcycgKi8KKwkJfSBlbHNlIGlmICghcmV0ICYmIChjID09IF9ub1swXSkpIHsKKwkJCXJldCA9ICduJzsKKwkJCWFuc3dlciA9IF9ubyArIDE7CS8qIEV4cGVjdGluZyAnTm8nICovCisJCX0gZWxzZSBpZiAoIXJldCAmJiBpc3NwYWNlKGMpKSB7CisJCQkvKiBJZ25vcmUgYW55IHdoaXRlc3BhY2UgYmVmb3JlICovCisJCQktLWk7CisJCQlnb3RvIG5leHRjaGFyOworCQl9IGVsc2UgaWYgKChyZXQgPiAwKSAmJiBpc3NwYWNlKGMpKSB7CisJCQkvKiBJZ25vcmUgYW55IHdoaXRlc3BhY2UgYWZ0ZXIgKi8KKwkJCXdoaWxlICgqYW5zd2VyKQorCQkJCWFuc3dlcisrOyAvKiBqdW1wIHRvIGVuZC1vZi13b3JkICovCisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CS8qIFJlYWQgdGlsbCAnXG4nIGFuZCByZWZyZXNoICovCisJfQorCisJc2lnaW50X3Jlc3RvcmUoKTsKKworCS8qIEZvciBvdGhlciB0aGVuIFllcyBhbnN3ZXIgY2hlY2sgdGhlcmUgaXMgcmVhbGx5IG5vIGludGVycnVwdCAqLworCWlmIChzaWcgfHwgc2lnaW50X2NhdWdodCgpKSB7CisJCXN0YWNrOworCQlyZXQgPSAnbic7CisJfSBlbHNlIGlmIChjID09IEVPRikgeworCQlmcHV0cygiW25dXG4iLCBzdGRlcnIpOworCQlyZXQgPSAnbic7CisJfSBlbHNlCisJCS8qIE5vdCBrbm93aW5nIGlmIGl0J3MgdGVybWluYWwsIG1ha2VzIHRoaXMgaGFyZC4uLi4gKi8KKwkJbG9nX3ZlcmJvc2UoIkFjY2VwdGVkIGlucHV0OiBbJWNdIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZGlzcGxheS9kaXNwbGF5LmggYi9saWIvZGlzcGxheS9kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjOTA3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kaXNwbGF5L2Rpc3BsYXkuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0RJU1BMQVlfSAorI2RlZmluZSBfTFZNX0RJU1BMQVlfSAorCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2NvbnN0IGNoYXIgKmRpc3BsYXlfbHZuYW1lKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBTcGVjaWZ5IHNpemUgaW4gS0IgKi8KK2NvbnN0IGNoYXIgKmRpc3BsYXlfc2l6ZShjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDY0X3Qgc2l6ZSk7Citjb25zdCBjaGFyICpkaXNwbGF5X3NpemVfbG9uZyhjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDY0X3Qgc2l6ZSk7Citjb25zdCBjaGFyICpkaXNwbGF5X3NpemVfdW5pdHMoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IHNpemUpOworCitjaGFyICpkaXNwbGF5X3V1aWQoY2hhciAqdXVpZHN0cik7Cit2b2lkIGRpc3BsYXlfc3RyaXBlKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHVpbnQzMl90IHMsIGNvbnN0IGNoYXIgKnByZSk7CisKK3ZvaWQgcHZkaXNwbGF5X2NvbG9ucyhjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Cit2b2lkIHB2ZGlzcGxheV9zZWdtZW50cyhjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Cit2b2lkIHB2ZGlzcGxheV9mdWxsKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCSAgICB2b2lkICpoYW5kbGUpOworaW50IHB2ZGlzcGxheV9zaG9ydChjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgIGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHZvaWQgKmhhbmRsZSk7CisKK3ZvaWQgbHZkaXNwbGF5X2NvbG9ucyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdmRpc3BsYXlfc2VnbWVudHMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZkaXNwbGF5X2Z1bGwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgIHZvaWQgKmhhbmRsZSk7CisKK3ZvaWQgdmdkaXNwbGF5X2V4dGVudHMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordm9pZCB2Z2Rpc3BsYXlfZnVsbChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit2b2lkIHZnZGlzcGxheV9jb2xvbnMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordm9pZCB2Z2Rpc3BsYXlfc2hvcnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCit2b2lkIGRpc3BsYXlfZm9ybWF0cyhjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Cit2b2lkIGRpc3BsYXlfc2VndHlwZXMoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOwordm9pZCBkaXNwbGF5X3RhZ3MoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCit2b2lkIGRpc3BsYXlfbmFtZV9lcnJvcihuYW1lX2Vycm9yX3QgbmFtZV9lcnJvcik7CisKKy8qCisgKiBBbGxvY2F0aW9uIHBvbGljeSBkaXNwbGF5IGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9hbGxvY19zdHJpbmcoYWxsb2NfcG9saWN5X3QgYWxsb2MpOworY2hhciBhbGxvY19wb2xpY3lfY2hhcihhbGxvY19wb2xpY3lfdCBhbGxvYyk7CithbGxvY19wb2xpY3lfdCBnZXRfYWxsb2NfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKTsKKworY29uc3QgY2hhciAqZ2V0X2xvY2tfdHlwZV9zdHJpbmcobG9ja190eXBlX3QgbG9ja190eXBlKTsKK2xvY2tfdHlwZV90IGdldF9sb2NrX3R5cGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKTsKKworY29uc3QgY2hhciAqZ2V0X3BlcmNlbnRfc3RyaW5nKHBlcmNlbnRfdHlwZV90IGRlZik7CisKK2NoYXIgeWVzX25vX3Byb21wdChjb25zdCBjaGFyICpwcm9tcHQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Vycm9yL2VycnNlZy5jIGIvbGliL2Vycm9yL2VycnNlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzU1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJyb3IvZXJyc2VnLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorCitzdGF0aWMgaW50IF9lcnJzZWdfbWVyZ2Vfc2VnbWVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZzEsIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcyKQoreworCXNlZzEtPmxlbiArPSBzZWcyLT5sZW47CisJc2VnMS0+YXJlYV9sZW4gKz0gc2VnMi0+YXJlYV9sZW47CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCitzdGF0aWMgaW50IF9lcnJzZWdfYWRkX3RhcmdldF9saW5lKHN0cnVjdCBkZXZfbWFuYWdlciAqZG0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQl2b2lkICoqdGFyZ2V0X3N0YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50NjRfdCBsZW4sCisJCQkJdWludDMyX3QgKnB2bW92ZV9taXJyb3JfY291bnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIGRtX3RyZWVfbm9kZV9hZGRfZXJyb3JfdGFyZ2V0KG5vZGUsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgX2VycnNlZ190YXJnZXRfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICB1bnNpZ25lZCAqYXR0cmlidXRlcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdGF0aWMgaW50IF9lcnJzZWdfY2hlY2tlZCA9IDA7CisJc3RhdGljIGludCBfZXJyc2VnX3ByZXNlbnQgPSAwOworCisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAwOworCisJLyogUmVwb3J0ZWQgdHJ1bmNhdGVkIGluIG9sZGVyIGtlcm5lbHMgKi8KKwlpZiAoIV9lcnJzZWdfY2hlY2tlZCkgeworCQlfZXJyc2VnX2NoZWNrZWQgPSAxOworCQlfZXJyc2VnX3ByZXNlbnQgPSB0YXJnZXRfcHJlc2VudChjbWQsIFRBUkdFVF9OQU1FX0VSUk9SLCAwKSB8fAorCQkJdGFyZ2V0X3ByZXNlbnQoY21kLCBUQVJHRVRfTkFNRV9FUlJPUl9PTEQsIDApOworCX0KKworCXJldHVybiBfZXJyc2VnX3ByZXNlbnQ7Cit9CisKK3N0YXRpYyBpbnQgX2VycnNlZ19tb2R1bGVzX25lZWRlZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKQoreworCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgbW9kdWxlcywgTU9EVUxFX05BTUVfRVJST1IpKSB7CisJCWxvZ19lcnJvcigiZXJyb3IgbW9kdWxlIHN0cmluZyBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9lcnJzZWdfZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoc2VndHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF9lcnJvcl9vcHMgPSB7CisJLm1lcmdlX3NlZ21lbnRzID0gX2VycnNlZ19tZXJnZV9zZWdtZW50cywKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorCS5hZGRfdGFyZ2V0X2xpbmUgPSBfZXJyc2VnX2FkZF90YXJnZXRfbGluZSwKKwkudGFyZ2V0X3ByZXNlbnQgPSBfZXJyc2VnX3RhcmdldF9wcmVzZW50LAorCS5tb2R1bGVzX25lZWRlZCA9IF9lcnJzZWdfbW9kdWxlc19uZWVkZWQsCisjZW5kaWYKKwkuZGVzdHJveSA9IF9lcnJzZWdfZGVzdHJveSwKK307CisKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfZXJyb3Jfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJaWYgKCFzZWd0eXBlKQorCQlyZXR1cm5fTlVMTDsKKworCXNlZ3R5cGUtPm9wcyA9ICZfZXJyb3Jfb3BzOworCXNlZ3R5cGUtPm5hbWUgPSBTRUdfVFlQRV9OQU1FX0VSUk9SOworCXNlZ3R5cGUtPmZsYWdzID0gU0VHX0NBTl9TUExJVCB8IFNFR19WSVJUVUFMIHwgU0VHX0NBTk5PVF9CRV9aRVJPRUQ7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBzZWd0eXBlOiAlcyIsIHNlZ3R5cGUtPm5hbWUpOworCisJcmV0dXJuIHNlZ3R5cGU7Cit9CmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItY29tcG9zaXRlLmMgYi9saWIvZmlsdGVycy9maWx0ZXItY29tcG9zaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzNTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1jb21wb3NpdGUuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworc3RhdGljIGludCBfYW5kX3Aoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqKmZpbHRlcnM7CisKKwlmb3IgKGZpbHRlcnMgPSAoc3RydWN0IGRldl9maWx0ZXIgKiopIGYtPnByaXZhdGU7ICpmaWx0ZXJzOyArK2ZpbHRlcnMpCisJCWlmICghKCpmaWx0ZXJzKS0+cGFzc2VzX2ZpbHRlcigqZmlsdGVycywgZGV2KSkKKwkJCXJldHVybiAwOwkvKiBObyAnc3RhY2snOiBhIGZpbHRlciwgbm90IGFuIGVycm9yLiAqLworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FuZF9wX3dpdGhfZGV2X2V4dF9pbmZvKHN0cnVjdCBkZXZfZmlsdGVyICpmLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHI7CisKKwlkZXZfZXh0X2VuYWJsZShkZXYsIGV4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZSgpKTsKKwlyID0gX2FuZF9wKGYsIGRldik7CisJZGV2X2V4dF9kaXNhYmxlKGRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX2NvbXBvc2l0ZV9kZXN0cm95KHN0cnVjdCBkZXZfZmlsdGVyICpmKQoreworCXN0cnVjdCBkZXZfZmlsdGVyICoqZmlsdGVyczsKKworCWlmIChmLT51c2VfY291bnQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRGVzdHJveWluZyBjb21wb3NpdGUgZmlsdGVyIHdoaWxlIGluIHVzZSAldSB0aW1lcy4iLCBmLT51c2VfY291bnQpOworCisJZm9yIChmaWx0ZXJzID0gKHN0cnVjdCBkZXZfZmlsdGVyICoqKSBmLT5wcml2YXRlOyAqZmlsdGVyczsgKytmaWx0ZXJzKQorCQkoKmZpbHRlcnMpLT5kZXN0cm95KCpmaWx0ZXJzKTsKKworCWRtX2ZyZWUoZi0+cHJpdmF0ZSk7CisJZG1fZnJlZShmKTsKK30KKworc3RhdGljIGludCBfZHVtcChzdHJ1Y3QgZGV2X2ZpbHRlciAqZiwgaW50IG1lcmdlX2V4aXN0aW5nKQoreworCXN0cnVjdCBkZXZfZmlsdGVyICoqZmlsdGVyczsKKworCWZvciAoZmlsdGVycyA9IChzdHJ1Y3QgZGV2X2ZpbHRlciAqKikgZi0+cHJpdmF0ZTsgKmZpbHRlcnM7ICsrZmlsdGVycykKKwkJaWYgKCgqZmlsdGVycyktPmR1bXAgJiYKKwkJICAgICEoKmZpbHRlcnMpLT5kdW1wKCpmaWx0ZXJzLCBtZXJnZV9leGlzdGluZykpCisJCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfd2lwZShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqKmZpbHRlcnM7CisKKwlmb3IgKGZpbHRlcnMgPSAoc3RydWN0IGRldl9maWx0ZXIgKiopIGYtPnByaXZhdGU7ICpmaWx0ZXJzOyArK2ZpbHRlcnMpCisJCWlmICgoKmZpbHRlcnMpLT53aXBlKQorCQkJKCpmaWx0ZXJzKS0+d2lwZSgqZmlsdGVycyk7Cit9CisKK3N0cnVjdCBkZXZfZmlsdGVyICpjb21wb3NpdGVfZmlsdGVyX2NyZWF0ZShpbnQgbiwgaW50IHVzZV9kZXZfZXh0X2luZm8sIHN0cnVjdCBkZXZfZmlsdGVyICoqZmlsdGVycykKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqKmZpbHRlcnNfY29weSwgKmNmdDsKKworCWlmICghZmlsdGVycykKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIShmaWx0ZXJzX2NvcHkgPSBkbV9tYWxsb2Moc2l6ZW9mKCpmaWx0ZXJzKSAqIChuICsgMSkpKSkgeworCQlsb2dfZXJyb3IoIkNvbXBvc2l0ZSBmaWx0ZXJzIGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1jcHkoZmlsdGVyc19jb3B5LCBmaWx0ZXJzLCBzaXplb2YoKmZpbHRlcnMpICogbik7CisJZmlsdGVyc19jb3B5W25dID0gTlVMTDsKKworCWlmICghKGNmdCA9IGRtX3phbGxvYyhzaXplb2YoKmNmdCkpKSkgeworCQlsb2dfZXJyb3IoIkNvbXBvc2l0ZSBmaWx0ZXJzIGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQlkbV9mcmVlKGZpbHRlcnNfY29weSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNmdC0+cGFzc2VzX2ZpbHRlciA9IHVzZV9kZXZfZXh0X2luZm8gPyBfYW5kX3Bfd2l0aF9kZXZfZXh0X2luZm8gOiBfYW5kX3A7CisJY2Z0LT5kZXN0cm95ID0gX2NvbXBvc2l0ZV9kZXN0cm95OworCWNmdC0+ZHVtcCA9IF9kdW1wOworCWNmdC0+d2lwZSA9IF93aXBlOworCWNmdC0+dXNlX2NvdW50ID0gMDsKKwljZnQtPnByaXZhdGUgPSBmaWx0ZXJzX2NvcHk7CisKKwlsb2dfZGVidWdfZGV2cygiQ29tcG9zaXRlIGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBjZnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItZndyYWlkLmMgYi9saWIvZmlsdGVycy9maWx0ZXItZndyYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlZjc0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1md3JhaWQuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKyNpbmNsdWRlICJkZXYtZXh0LXVkZXYtY29uc3RhbnRzLmgiCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKK3N0YXRpYyBpbnQgX3VkZXZfZGV2X2lzX2Z3cmFpZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3QgY2hhciAqdmFsdWU7CisKKwl2YWx1ZSA9IHVkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV92YWx1ZSgoc3RydWN0IHVkZXZfZGV2aWNlICopZGV2LT5leHQuaGFuZGxlLCBERVZfRVhUX1VERVZfQkxLSURfVFlQRSk7CisJaWYgKHZhbHVlICYmIHN0cmNtcCh2YWx1ZSwgREVWX0VYVF9VREVWX0JMS0lEX1RZUEVfU1dfUkFJRCkgJiYgc3Ryc3RyKHZhbHVlLCBERVZfRVhUX1VERVZfQkxLSURfVFlQRV9SQUlEX1NVRkZJWCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBfdWRldl9kZXZfaXNfZndyYWlkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9uYXRpdmVfZGV2X2lzX2Z3cmFpZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJbG9nX3ZlcmJvc2UoIiVzOiBGaXJtd2FyZSBSQUlEIGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IExWTSBuYXRpdmVseS4gIgorCQkgICAgIlNraXBwaW5nIGZpcm13YXJlIHJhaWQgZGV0ZWN0aW9uLiAiLCBkZXZfbmFtZShkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZGV2X2lzX2Z3cmFpZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCXJldHVybiBfbmF0aXZlX2Rldl9pc19md3JhaWQoZGV2KTsKKworCWlmIChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9VREVWKQorCQlyZXR1cm4gX3VkZXZfZGV2X2lzX2Z3cmFpZChkZXYpOworCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNaXNzaW5nIGhvb2sgZm9yIGZpcm13YXJlIFJBSUQgcmVjb2duaXRpb24gIgorCQkgICJ1c2luZyBleHRlcm5hbCBkZXZpY2UgaW5mbyBzb3VyY2UgJXMiLCBkZXZfZXh0X25hbWUoZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNU0dfU0tJUFBJTkcgIiVzOiBTa2lwcGluZyBmaXJtd2FyZSBSQUlEIGNvbXBvbmVudCBkZXZpY2UiCisKK3N0YXRpYyBpbnQgX2lnbm9yZV9md3JhaWQoc3RydWN0IGRldl9maWx0ZXIgKmYgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWlmICghZndyYWlkX2ZpbHRlcmluZygpKQorCQlyZXR1cm4gMTsKKworCXJldCA9IF9kZXZfaXNfZndyYWlkKGRldik7CisKKwlpZiAocmV0ID09IDEpIHsKKwkJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcsIGRldl9uYW1lKGRldikpOworCQllbHNlCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcgIiBbJXM6JXBdIiwgZGV2X25hbWUoZGV2KSwKKwkJCQkJZGV2X2V4dF9uYW1lKGRldiksIGRldi0+ZXh0LmhhbmRsZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCWxvZ19kZWJ1Z19kZXZzKCIlczogU2tpcHBpbmc6IGVycm9yIGluIGZpcm13YXJlIFJBSUQgY29tcG9uZW50IGRldGVjdGlvbiIsCisJCQkgICAgICAgZGV2X25hbWUoZGV2KSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlpZiAoZi0+dXNlX2NvdW50KQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRlc3Ryb3lpbmcgZmlybXdhcmUgUkFJRCBmaWx0ZXIgd2hpbGUgaW4gdXNlICV1IHRpbWVzLiIsIGYtPnVzZV9jb3VudCk7CisKKwlkbV9mcmVlKGYpOworfQorCitzdHJ1Y3QgZGV2X2ZpbHRlciAqZndyYWlkX2ZpbHRlcl9jcmVhdGUoc3RydWN0IGRldl90eXBlcyAqZHQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IGRldl9maWx0ZXIgKmY7CisKKwlpZiAoIShmID0gZG1femFsbG9jKHNpemVvZigqZikpKSkgeworCQlsb2dfZXJyb3IoIkZpcm13YXJlIFJBSUQgZmlsdGVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWYtPnBhc3Nlc19maWx0ZXIgPSBfaWdub3JlX2Z3cmFpZDsKKwlmLT5kZXN0cm95ID0gX2Rlc3Ryb3k7CisJZi0+dXNlX2NvdW50ID0gMDsKKwlmLT5wcml2YXRlID0gTlVMTDsKKworCWxvZ19kZWJ1Z19kZXZzKCJGaXJtd2FyZSBSQUlEIGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBmOworfQorCisjZWxzZQorCitzdHJ1Y3QgZGV2X2ZpbHRlciAqZndyYWlkX2ZpbHRlcl9jcmVhdGUoc3RydWN0IGRldl90eXBlcyAqZHQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2ZpbHRlcnMvZmlsdGVyLWludGVybmFsLmMgYi9saWIvZmlsdGVycy9maWx0ZXItaW50ZXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU4YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2ZpbHRlcnMvZmlsdGVyLWludGVybmFsLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKK3N0YXRpYyBETV9MSVNUX0lOSVQoX2FsbG93X2RldnMpOworCitpbnQgaW50ZXJuYWxfZmlsdGVyX2FsbG93KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisKKwlpZiAoIShkZXZsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqZGV2bCkpKSkgeworCQlsb2dfZXJyb3IoImRldmljZV9saXN0IGVsZW1lbnQgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCWRldmwtPmRldiA9IGRldjsKKworCWRtX2xpc3RfYWRkKCZfYWxsb3dfZGV2cywgJmRldmwtPmxpc3QpOworCXJldHVybiAxOworfQorCit2b2lkIGludGVybmFsX2ZpbHRlcl9jbGVhcih2b2lkKQoreworCWRtX2xpc3RfaW5pdCgmX2FsbG93X2RldnMpOworfQorCitzdGF0aWMgaW50IF9wYXNzZXNfaW50ZXJuYWwoc3RydWN0IGRldl9maWx0ZXIgKmYgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2bDsKKworCWlmICghaW50ZXJuYWxfZmlsdGVyaW5nKCkpCisJCXJldHVybiAxOworCQorCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkZXZsLCAmX2FsbG93X2RldnMpIHsKKwkJaWYgKGRldmwtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gMTsKKwl9CisJCisJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZyBmb3IgaW50ZXJuYWwgZmlsdGVyaW5nLiIsIGRldl9uYW1lKGRldikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlpZiAoZi0+dXNlX2NvdW50KQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRlc3Ryb3lpbmcgaW50ZXJuYWwgZmlsdGVyIHdoaWxlIGluIHVzZSAldSB0aW1lcy4iLCBmLT51c2VfY291bnQpOworCisJZG1fZnJlZShmKTsKK30KKworc3RydWN0IGRldl9maWx0ZXIgKmludGVybmFsX2ZpbHRlcl9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqZjsKKworCWlmICghKGYgPSBkbV96YWxsb2Moc2l6ZW9mKCpmKSkpKSB7CisJCWxvZ19lcnJvcigibWQgZmlsdGVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWYtPnBhc3Nlc19maWx0ZXIgPSBfcGFzc2VzX2ludGVybmFsOworCWYtPmRlc3Ryb3kgPSBfZGVzdHJveTsKKwlmLT51c2VfY291bnQgPSAwOworCisJbG9nX2RlYnVnX2RldnMoImludGVybmFsIGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBmOworfQorCmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItbWQuYyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1tZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWM1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZmlsdGVycy9maWx0ZXItbWQuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEx1Y2EgQmVycmEKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2lmZGVmIF9fbGludXhfXworCisjZGVmaW5lIE1TR19TS0lQUElORyAiJXM6IFNraXBwaW5nIG1kIGNvbXBvbmVudCBkZXZpY2UiCisKK3N0YXRpYyBpbnQgX2lnbm9yZV9tZChzdHJ1Y3QgZGV2X2ZpbHRlciAqZiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJCisJaWYgKCFtZF9maWx0ZXJpbmcoKSkKKwkJcmV0dXJuIDE7CisJCisJcmV0ID0gZGV2X2lzX21kKGRldiwgTlVMTCk7CisKKwlpZiAocmV0ID09IDEpIHsKKwkJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcsIGRldl9uYW1lKGRldikpOworCQllbHNlCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcgIiBbJXM6JXBdIiwgZGV2X25hbWUoZGV2KSwKKwkJCQkJZGV2X2V4dF9uYW1lKGRldiksIGRldi0+ZXh0LmhhbmRsZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCWxvZ19kZWJ1Z19kZXZzKCIlczogU2tpcHBpbmc6IGVycm9yIGluIG1kIGNvbXBvbmVudCBkZXRlY3Rpb24iLAorCQkJICAgICAgIGRldl9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2Rlc3Ryb3koc3RydWN0IGRldl9maWx0ZXIgKmYpCit7CisJaWYgKGYtPnVzZV9jb3VudCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJEZXN0cm95aW5nIG1kIGZpbHRlciB3aGlsZSBpbiB1c2UgJXUgdGltZXMuIiwgZi0+dXNlX2NvdW50KTsKKworCWRtX2ZyZWUoZik7Cit9CisKK3N0cnVjdCBkZXZfZmlsdGVyICptZF9maWx0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0KQoreworCXN0cnVjdCBkZXZfZmlsdGVyICpmOworCisJaWYgKCEoZiA9IGRtX3phbGxvYyhzaXplb2YoKmYpKSkpIHsKKwkJbG9nX2Vycm9yKCJtZCBmaWx0ZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZi0+cGFzc2VzX2ZpbHRlciA9IF9pZ25vcmVfbWQ7CisJZi0+ZGVzdHJveSA9IF9kZXN0cm95OworCWYtPnVzZV9jb3VudCA9IDA7CisJZi0+cHJpdmF0ZSA9IGR0OworCisJbG9nX2RlYnVnX2RldnMoIk1EIGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBmOworfQorCisjZWxzZQorCitzdHJ1Y3QgZGV2X2ZpbHRlciAqbWRfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItbXBhdGguYyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1tcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjNiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZmlsdGVycy9maWx0ZXItbXBhdGguYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKyNpbmNsdWRlICJkZXYtZXh0LXVkZXYtY29uc3RhbnRzLmgiCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNkZWZpbmUgTVBBVEhfUFJFRklYICJtcGF0aC0iCisKK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0X3N5c2ZzX25hbWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlpZiAoIShuYW1lID0gc3RycmNocihkZXZfbmFtZShkZXYpLCAnLycpKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBmaW5kICcvJyBpbiBkZXZpY2UgbmFtZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5hbWUrKzsKKworCWlmICghKm5hbWUpIHsKKwkJbG9nX2Vycm9yKCJEZXZpY2UgbmFtZSBpcyBub3QgdmFsaWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9zeXNmc19uYW1lX2J5X2RldnQoY29uc3QgY2hhciAqc3lzZnNfZGlyLCBkZXZfdCBkZXZubywKKwkJCQkJICBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IHNpemU7CisKKwlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvZGV2L2Jsb2NrLyVkOiVkIiwgc3lzZnNfZGlyLAorCQkJKGludCkgTUFKT1IoZGV2bm8pLCAoaW50KSBNSU5PUihkZXZubykpIDwgMCkgeworCQlsb2dfZXJyb3IoIlN5c2ZzIHBhdGggc3RyaW5nIGlzIHRvbyBsb25nLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKHNpemUgPSByZWFkbGluayhwYXRoLCBidWYsIGJ1Zl9zaXplIC0gMSkpIDwgMCkgeworCQlsb2dfc3lzX2Vycm9yKCJyZWFkbGluayIsIHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmW3NpemVdID0gJ1wwJzsKKworCWlmICghKG5hbWUgPSBzdHJyY2hyKGJ1ZiwgJy8nKSkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgZmluZCBkZXZpY2UgbmFtZSBpbiBzeXNmcyBwYXRoLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmFtZSsrOworCisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9zeXNmc19zdHJpbmcoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqYnVmZmVyLCBpbnQgbWF4X3NpemUpCit7CisJRklMRSAqZnA7CisJaW50IHIgPSAwOworCisJaWYgKCEoZnAgPSBmb3BlbihwYXRoLCAiciIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWZnZXRzKGJ1ZmZlciwgbWF4X3NpemUsIGZwKSkKKwkJbG9nX3N5c19lcnJvcigiZmdldHMiLCBwYXRoKTsKKwllbHNlCisJCXIgPSAxOworCisJaWYgKGZjbG9zZShmcCkpCisJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHBhdGgpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9zeXNmc19nZXRfbWFqb3JfbWlub3IoY29uc3QgY2hhciAqc3lzZnNfZGlyLCBjb25zdCBjaGFyICprbmFtZSwgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdLCBidWZmZXJbNjRdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2Jsb2NrLyVzL2RldiIsIHN5c2ZzX2Rpciwga25hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIlN5c2ZzIHBhdGggc3RyaW5nIGlzIHRvbyBsb25nLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9nZXRfc3lzZnNfc3RyaW5nKHBhdGgsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQlyZXR1cm5fMDsKKworCWlmIChzc2NhbmYoYnVmZmVyLCAiJWQ6JWQiLCBtYWpvciwgbWlub3IpICE9IDIpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2UgbWFqb3IgbWlub3IgZnJvbSAlcyIsIGJ1ZmZlcik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9nZXRfcGFyZW50X21wYXRoKGNvbnN0IGNoYXIgKmRpciwgY2hhciAqbmFtZSwgaW50IG1heF9zaXplKQoreworCXN0cnVjdCBkaXJlbnQgKmQ7CisJRElSICpkcjsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShkciA9IG9wZW5kaXIoZGlyKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbmRpciIsIGRpcik7CisJCXJldHVybiAwOworCX0KKworCSpuYW1lID0gJ1wwJzsKKwl3aGlsZSAoKGQgPSByZWFkZGlyKGRyKSkpIHsKKwkJaWYgKCFzdHJjbXAoZC0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZC0+ZF9uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBob2xkZXIgaWYgaXQgaXMgbXVsdGlwYXRoICovCisJCWlmICgqbmFtZSkgeworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXN0cm5jcHkobmFtZSwgZC0+ZF9uYW1lLCBtYXhfc2l6ZSk7CisJCXIgPSAxOworCX0KKworCWlmIChjbG9zZWRpcihkcikpCisJCWxvZ19zeXNfZXJyb3IoImNsb3NlZGlyIiwgZGlyKTsKKworCXJldHVybiByOworfQorCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKK3N0YXRpYyBpbnQgX3VkZXZfZGV2X2lzX21wYXRoKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBjaGFyICp2YWx1ZTsKKwlzdHJ1Y3QgZGV2X2V4dCAqZXh0OworCisJaWYgKCEoZXh0ID0gZGV2X2V4dF9nZXQoZGV2KSkpCisJCXJldHVybl8wOworCisJdmFsdWUgPSB1ZGV2X2RldmljZV9nZXRfcHJvcGVydHlfdmFsdWUoKHN0cnVjdCB1ZGV2X2RldmljZSAqKWV4dC0+aGFuZGxlLCBERVZfRVhUX1VERVZfQkxLSURfVFlQRSk7CisJaWYgKHZhbHVlICYmICFzdHJjbXAodmFsdWUsIERFVl9FWFRfVURFVl9CTEtJRF9UWVBFX01QQVRIKSkKKwkJcmV0dXJuIDE7CisKKwl2YWx1ZSA9IHVkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV92YWx1ZSgoc3RydWN0IHVkZXZfZGV2aWNlICopZXh0LT5oYW5kbGUsIERFVl9FWFRfVURFVl9NUEFUSF9ERVZJQ0VfUEFUSCk7CisJaWYgKHZhbHVlICYmICFzdHJjbXAodmFsdWUsICIxIikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBfdWRldl9kZXZfaXNfbXBhdGgoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX25hdGl2ZV9kZXZfaXNfbXBhdGgoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X3R5cGVzICpkdCA9IChzdHJ1Y3QgZGV2X3R5cGVzICopIGYtPnByaXZhdGU7CisJY29uc3QgY2hhciAqcGFydF9uYW1lLCAqbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCWNoYXIgcGF0aFtQQVRIX01BWF0sIHBhcmVudF9uYW1lW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpzeXNmc19kaXIgPSBkbV9zeXNmc19kaXIoKTsKKwlpbnQgbWFqb3IgPSBNQUpPUihkZXYtPmRldik7CisJaW50IG1pbm9yID0gTUlOT1IoZGV2LT5kZXYpOworCWRldl90IHByaW1hcnlfZGV2OworCisJLyogTGltaXQgdGhpcyBmaWx0ZXIgb25seSB0byBTQ1NJIGRldmljZXMgKi8KKwlpZiAoIW1ham9yX2lzX3Njc2lfZGV2aWNlKGR0LCBNQUpPUihkZXYtPmRldikpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZGV2X2dldF9wcmltYXJ5X2RldihkdCwgZGV2LCAmcHJpbWFyeV9kZXYpKSB7CisJY2FzZSAyOiAvKiBUaGUgZGV2IGlzIHBhcnRpdGlvbi4gKi8KKwkJcGFydF9uYW1lID0gZGV2X25hbWUoZGV2KTsgLyogbmFtZSBvZiBvcmlnaW5hbCBkZXYgZm9yIGxvZ19kZWJ1ZyBtc2cgKi8KKwkJaWYgKCEobmFtZSA9IF9nZXRfc3lzZnNfbmFtZV9ieV9kZXZ0KHN5c2ZzX2RpciwgcHJpbWFyeV9kZXYsIHBhcmVudF9uYW1lLCBzaXplb2YocGFyZW50X25hbWUpKSkpCisJCQlyZXR1cm5fMDsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBEZXZpY2UgaXMgYSBwYXJ0aXRpb24sIHVzaW5nIHByaW1hcnkgIgorCQkJICAgICAgICJkZXZpY2UgJXMgZm9yIG1wYXRoIGNvbXBvbmVudCBkZXRlY3Rpb24iLAorCQkJICAgICAgIHBhcnRfbmFtZSwgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgMTogLyogVGhlIGRldiBpcyBhbHJlYWR5IGEgcHJpbWFyeSBkZXYuIEp1c3QgY29udGludWUgd2l0aCB0aGUgZGV2LiAqLworCQlpZiAoIShuYW1lID0gX2dldF9zeXNmc19uYW1lKGRldikpKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDAsIGVycm9yLiAqLworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgcHJpbWFyeSBkZXZpY2UgZm9yICVkOiVkLiIsIG1ham9yLCBtaW5vcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy9ibG9jay8lcy9ob2xkZXJzIiwgc3lzZnNfZGlyLCBuYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJTeXNmcyBwYXRoIHRvIGNoZWNrIG1wYXRoIGlzIHRvbyBsb25nLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhbHNvIHdpbGwgZmlsdGVyIG91dCBwYXJ0aXRpb25zICovCisJaWYgKHN0YXQocGF0aCwgJmluZm8pKQorCQlyZXR1cm4gMDsKKworCWlmICghU19JU0RJUihpbmZvLnN0X21vZGUpKSB7CisJCWxvZ19lcnJvcigiUGF0aCAlcyBpcyBub3QgYSBkaXJlY3RvcnkuIiwgcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX2dldF9wYXJlbnRfbXBhdGgocGF0aCwgcGFyZW50X25hbWUsIHNpemVvZihwYXJlbnRfbmFtZSkpKQorCQlyZXR1cm4gMDsKKworCWlmICghX2dldF9zeXNmc19nZXRfbWFqb3JfbWlub3Ioc3lzZnNfZGlyLCBwYXJlbnRfbmFtZSwgJm1ham9yLCAmbWlub3IpKQorCQlyZXR1cm5fMDsKKworCWlmIChtYWpvciAhPSBkdC0+ZGV2aWNlX21hcHBlcl9tYWpvcikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbHZtX2RtX3ByZWZpeF9jaGVjayhtYWpvciwgbWlub3IsIE1QQVRIX1BSRUZJWCk7Cit9CisKK3N0YXRpYyBpbnQgX2Rldl9pc19tcGF0aChzdHJ1Y3QgZGV2X2ZpbHRlciAqZiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9OT05FKQorCQlyZXR1cm4gX25hdGl2ZV9kZXZfaXNfbXBhdGgoZiwgZGV2KTsKKworCWlmIChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9VREVWKQorCQlyZXR1cm4gX3VkZXZfZGV2X2lzX21wYXRoKGRldik7CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1pc3NpbmcgaG9vayBmb3IgbXBhdGggcmVjb2duaXRpb24gIgorCQkgICJ1c2luZyBleHRlcm5hbCBkZXZpY2UgaW5mbyBzb3VyY2UgJXMiLCBkZXZfZXh0X25hbWUoZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNU0dfU0tJUFBJTkcgIiVzOiBTa2lwcGluZyBtcGF0aCBjb21wb25lbnQgZGV2aWNlIgorCitzdGF0aWMgaW50IF9pZ25vcmVfbXBhdGgoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoX2Rldl9pc19tcGF0aChmLCBkZXYpID09IDEpIHsKKwkJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcsIGRldl9uYW1lKGRldikpOworCQllbHNlCisJCQlsb2dfZGVidWdfZGV2cyhNU0dfU0tJUFBJTkcgIiBbJXM6JXBdIiwgZGV2X25hbWUoZGV2KSwKKwkJCQkJZGV2X2V4dF9uYW1lKGRldiksIGRldi0+ZXh0LmhhbmRsZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlpZiAoZi0+dXNlX2NvdW50KQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRlc3Ryb3lpbmcgbXBhdGggZmlsdGVyIHdoaWxlIGluIHVzZSAldSB0aW1lcy4iLCBmLT51c2VfY291bnQpOworCisJZG1fZnJlZShmKTsKK30KKworc3RydWN0IGRldl9maWx0ZXIgKm1wYXRoX2ZpbHRlcl9jcmVhdGUoc3RydWN0IGRldl90eXBlcyAqZHQpCit7CisJY29uc3QgY2hhciAqc3lzZnNfZGlyID0gZG1fc3lzZnNfZGlyKCk7CisJc3RydWN0IGRldl9maWx0ZXIgKmY7CisKKwlpZiAoISpzeXNmc19kaXIpIHsKKwkJbG9nX3ZlcmJvc2UoIk5vIHByb2MgZmlsZXN5c3RlbSBmb3VuZDogc2tpcHBpbmcgbXVsdGlwYXRoIGZpbHRlciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShmID0gZG1femFsbG9jKHNpemVvZigqZikpKSkgeworCQlsb2dfZXJyb3IoIm1wYXRoIGZpbHRlciBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmLT5wYXNzZXNfZmlsdGVyID0gX2lnbm9yZV9tcGF0aDsKKwlmLT5kZXN0cm95ID0gX2Rlc3Ryb3k7CisJZi0+dXNlX2NvdW50ID0gMDsKKwlmLT5wcml2YXRlID0gZHQ7CisKKwlsb2dfZGVidWdfZGV2cygibXBhdGggZmlsdGVyIGluaXRpYWxpc2VkLiIpOworCisJcmV0dXJuIGY7Cit9CisKKyNlbHNlCisKK3N0cnVjdCBkZXZfZmlsdGVyICptcGF0aF9maWx0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0KQoreworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9maWx0ZXJzL2ZpbHRlci1wYXJ0aXRpb25lZC5jIGIvbGliL2ZpbHRlcnMvZmlsdGVyLXBhcnRpdGlvbmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzZmFlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1wYXJ0aXRpb25lZC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNkZWZpbmUgTVNHX1NLSVBQSU5HICIlczogU2tpcHBpbmc6IFBhcnRpdGlvbiB0YWJsZSBzaWduYXR1cmUgZm91bmQiCisKK3N0YXRpYyBpbnQgX3Bhc3Nlc19wYXJ0aXRpb25lZF9maWx0ZXIoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X3R5cGVzICpkdCA9IChzdHJ1Y3QgZGV2X3R5cGVzICopIGYtPnByaXZhdGU7CisKKwlpZiAoZGV2X2lzX3BhcnRpdGlvbmVkKGR0LCBkZXYpKSB7CisJCWlmIChkZXYtPmV4dC5zcmMgPT0gREVWX0VYVF9OT05FKQorCQkJbG9nX2RlYnVnX2RldnMoTVNHX1NLSVBQSU5HLCBkZXZfbmFtZShkZXYpKTsKKwkJZWxzZQorCQkJbG9nX2RlYnVnX2RldnMoTVNHX1NLSVBQSU5HICIgWyVzOiVwXSIsIGRldl9uYW1lKGRldiksCisJCQkJCWRldl9leHRfbmFtZShkZXYpLCBkZXYtPmV4dC5oYW5kbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3BhcnRpdGlvbmVkX2ZpbHRlcl9kZXN0cm95KHN0cnVjdCBkZXZfZmlsdGVyICpmKQoreworCWlmIChmLT51c2VfY291bnQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRGVzdHJveWluZyBwYXJ0aXRpb25lZCBmaWx0ZXIgd2hpbGUgaW4gdXNlICV1IHRpbWVzLiIsIGYtPnVzZV9jb3VudCk7CisKKwlkbV9mcmVlKGYpOworfQorCitzdHJ1Y3QgZGV2X2ZpbHRlciAqcGFydGl0aW9uZWRfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCkKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqZjsKKworCWlmICghKGYgPSBkbV96YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfZmlsdGVyKSkpKSB7CisJCWxvZ19lcnJvcigiUGFydGl0aW9uZWQgZmlsdGVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWYtPnBhc3Nlc19maWx0ZXIgPSBfcGFzc2VzX3BhcnRpdGlvbmVkX2ZpbHRlcjsKKwlmLT5kZXN0cm95ID0gX3BhcnRpdGlvbmVkX2ZpbHRlcl9kZXN0cm95OworCWYtPnVzZV9jb3VudCA9IDA7CisJZi0+cHJpdmF0ZSA9IGR0OworCisJbG9nX2RlYnVnX2RldnMoIlBhcnRpdGlvbmVkIGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBmOworfQpkaWZmIC0tZ2l0IGEvbGliL2ZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4MTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibHZtLWZpbGUuaCIKKworc3RydWN0IHBmaWx0ZXIgeworCWNoYXIgKmZpbGU7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmRldmljZXM7CisJc3RydWN0IGRldl9maWx0ZXIgKnJlYWw7CisJc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCXN0cnVjdCBkZXZfdHlwZXMgKmR0OworfTsKKworLyoKKyAqIFRoZSBoYXNoIHRhYmxlIGhvbGRzIG9uZSBvZiB0aGVzZSB0d28gc3RhdGVzCisgKiBhZ2FpbnN0IGVhY2ggZW50cnkuCisgKi8KKyNkZWZpbmUgUEZfQkFEX0RFVklDRSAoKHZvaWQgKikgMSkKKyNkZWZpbmUgUEZfR09PRF9ERVZJQ0UgKCh2b2lkICopIDIpCisKK3N0YXRpYyBpbnQgX2luaXRfaGFzaChzdHJ1Y3QgcGZpbHRlciAqcGYpCit7CisJaWYgKHBmLT5kZXZpY2VzKQorCQlkbV9oYXNoX2Rlc3Ryb3kocGYtPmRldmljZXMpOworCisJaWYgKCEocGYtPmRldmljZXMgPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3BlcnNpc3RlbnRfZmlsdGVyX3dpcGUoc3RydWN0IGRldl9maWx0ZXIgKmYpCit7CisJc3RydWN0IHBmaWx0ZXIgKnBmID0gKHN0cnVjdCBwZmlsdGVyICopIGYtPnByaXZhdGU7CisKKwlsb2dfdmVyYm9zZSgiV2lwaW5nIGNhY2hlIG9mIExWTS1jYXBhYmxlIGRldmljZXMiKTsKKwlkbV9oYXNoX3dpcGUocGYtPmRldmljZXMpOworCisJLyogVHJpZ2dlciBjb21wbGV0ZSBkZXZpY2Ugc2NhbiAqLworCWRldl9jYWNoZV9zY2FuKDEpOworfQorCitzdGF0aWMgaW50IF9yZWFkX2FycmF5KHN0cnVjdCBwZmlsdGVyICpwZiwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCSAgICAgICBjb25zdCBjaGFyICpwYXRoLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisKKwlpZiAoIShjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoY2Z0LT5yb290LCBwYXRoKSkpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiQ291bGRuJ3QgZmluZCAlcyBhcnJheSBpbiAnJXMnIiwKKwkJCQkgcGF0aCwgcGYtPmZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXksIGFkZGluZworCSAqIGRldmljZXMgYXMgd2UgZ28uCisJICovCisJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJbG9nX3ZlcmJvc2UoIkRldmljZXMgYXJyYXkgY29udGFpbnMgYSB2YWx1ZSAiCisJCQkJICAgICJ3aGljaCBpcyBub3QgYSBzdHJpbmcgLi4uIGlnbm9yaW5nIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZG1faGFzaF9pbnNlcnQocGYtPmRldmljZXMsIGN2LT52LnN0ciwgZGF0YSkpCisJCQlsb2dfdmVyYm9zZSgiQ291bGRuJ3QgYWRkICclcycgdG8gZmlsdGVyIC4uLiBpZ25vcmluZyIsCisJCQkJICAgIGN2LT52LnN0cik7CisJCS8qIFBvcHVsYXRlIGRldl9jYWNoZSBvdXJzZWx2ZXMgKi8KKwkJZGV2X2NhY2hlX2dldChjdi0+di5zdHIsIE5VTEwpOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHBlcnNpc3RlbnRfZmlsdGVyX2xvYWQoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqKmNmdF9vdXQpCit7CisJc3RydWN0IHBmaWx0ZXIgKnBmID0gKHN0cnVjdCBwZmlsdGVyICopIGYtPnByaXZhdGU7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CisJc3RydWN0IHN0YXQgaW5mbzsKKwlpbnQgciA9IDA7CisKKwlpZiAob2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldigpKSB7CisJCWlmICghc3RhdChwZi0+ZmlsZSwgJmluZm8pKSB7CisJCQlsb2dfdmVyeV92ZXJib3NlKCJPYnRhaW5pbmcgZGV2aWNlIGxpc3QgZnJvbSB1ZGV2LiAiCisJCQkJCSAiUmVtb3Zpbmcgb2Jzb2xldGUgJXMuIiwKKwkJCQkJIHBmLT5maWxlKTsKKwkJCWlmICh1bmxpbmsocGYtPmZpbGUpIDwgMCAmJiBlcnJubyAhPSBFUk9GUykKKwkJCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBwZi0+ZmlsZSk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFzdGF0KHBmLT5maWxlLCAmaW5mbykpCisJCWx2bV9zdGF0X2N0aW0oJnBmLT5jdGltZSwgJmluZm8pOworCWVsc2UgeworCQlsb2dfdmVyeV92ZXJib3NlKCIlczogc3RhdCBmYWlsZWQ6ICVzIiwgcGYtPmZpbGUsCisJCQkJIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybl8wOworCX0KKworCWlmICghKGNmdCA9IGNvbmZpZ19vcGVuKENPTkZJR19GSUxFX1NQRUNJQUwsIHBmLT5maWxlLCAxKSkpCisJCXJldHVybl8wOworCisJaWYgKCFjb25maWdfZmlsZV9yZWFkKGNmdCkpCisJCWdvdG9fb3V0OworCisJX3JlYWRfYXJyYXkocGYsIGNmdCwgInBlcnNpc3RlbnRfZmlsdGVyX2NhY2hlL3ZhbGlkX2RldmljZXMiLAorCQkgICAgUEZfR09PRF9ERVZJQ0UpOworCS8qIFdlIGRvbid0IGdhaW4gYW55dGhpbmcgYnkgaG9sZGluZyBpbnZhbGlkIGRldmljZXMgKi8KKwkvKiBfcmVhZF9hcnJheShwZiwgY2Z0LCAicGVyc2lzdGVudF9maWx0ZXJfY2FjaGUvaW52YWxpZF9kZXZpY2VzIiwKKwkgICBQRl9CQURfREVWSUNFKTsgKi8KKworCS8qIERpZCB3ZSBmaW5kIGFueXRoaW5nPyAqLworCWlmIChkbV9oYXNoX2dldF9udW1fZW50cmllcyhwZi0+ZGV2aWNlcykpIHsKKwkJLyogV2UgcG9wdWxhdGVkIGRldl9jYWNoZSBvdXJzZWx2ZXMgKi8KKwkJZGV2X2NhY2hlX3NjYW4oMCk7CisJCWlmICghZGV2X2NhY2hlX2luZGV4X2RldnMoKSkKKwkJCXN0YWNrOworCQlyID0gMTsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCJMb2FkZWQgcGVyc2lzdGVudCBmaWx0ZXIgY2FjaGUgZnJvbSAlcyIsIHBmLT5maWxlKTsKKworICAgICAgb3V0OgorCWlmIChyICYmIGNmdF9vdXQpCisJCSpjZnRfb3V0ID0gY2Z0OworCWVsc2UKKwkJY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX3dyaXRlX2FycmF5KHN0cnVjdCBwZmlsdGVyICpwZiwgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgdm9pZCAqZGF0YSkKK3sKKwl2b2lkICpkOworCWludCBmaXJzdCA9IDE7CisJY2hhciBidWZbMiAqIFBBVEhfTUFYXTsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuOworCisJZm9yIChuID0gZG1faGFzaF9nZXRfZmlyc3QocGYtPmRldmljZXMpOyBuOworCSAgICAgbiA9IGRtX2hhc2hfZ2V0X25leHQocGYtPmRldmljZXMsIG4pKSB7CisJCWQgPSBkbV9oYXNoX2dldF9kYXRhKHBmLT5kZXZpY2VzLCBuKTsKKworCQlpZiAoZCAhPSBkYXRhKQorCQkJY29udGludWU7CisKKwkJaWYgKCFmaXJzdCkKKwkJCWZwcmludGYoZnAsICIsXG4iKTsKKwkJZWxzZSB7CisJCQlmcHJpbnRmKGZwLCAiXHQlcz1bXG4iLCBwYXRoKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCisJCWRtX2VzY2FwZV9kb3VibGVfcXVvdGVzKGJ1ZiwgZG1faGFzaF9nZXRfa2V5KHBmLT5kZXZpY2VzLCBuKSk7CisJCWZwcmludGYoZnAsICJcdFx0XCIlc1wiIiwgYnVmKTsKKwl9CisKKwlpZiAoIWZpcnN0KQorCQlmcHJpbnRmKGZwLCAiXG5cdF1cbiIpOworfQorCitzdGF0aWMgaW50IF9wZXJzaXN0ZW50X2ZpbHRlcl9kdW1wKHN0cnVjdCBkZXZfZmlsdGVyICpmLCBpbnQgbWVyZ2VfZXhpc3RpbmcpCit7CisJc3RydWN0IHBmaWx0ZXIgKnBmOworCWNoYXIgKnRtcF9maWxlOworCXN0cnVjdCBzdGF0IGluZm8sIGluZm8yOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCA9IE5VTEw7CisJRklMRSAqZnA7CisJaW50IGxvY2tmZDsKKwlpbnQgciA9IDA7CisKKwlpZiAob2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldigpKQorCQlyZXR1cm4gMTsKKworCWlmICghZikKKwkJcmV0dXJuXzA7CisJcGYgPSAoc3RydWN0IHBmaWx0ZXIgKikgZi0+cHJpdmF0ZTsKKworCWlmICghZG1faGFzaF9nZXRfbnVtX2VudHJpZXMocGYtPmRldmljZXMpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkludGVybmFsIHBlcnNpc3RlbnQgZGV2aWNlIGNhY2hlIGVtcHR5ICIKKwkJCQkgIi0gbm90IHdyaXRpbmcgdG8gJXMiLCBwZi0+ZmlsZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIWRldl9jYWNoZV9oYXNfc2Nhbm5lZCgpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkRldmljZSBjYWNoZSBpbmNvbXBsZXRlIC0gbm90IHdyaXRpbmcgIgorCQkJCSAidG8gJXMiLCBwZi0+ZmlsZSk7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkR1bXBpbmcgcGVyc2lzdGVudCBkZXZpY2UgY2FjaGUgdG8gJXMiLCBwZi0+ZmlsZSk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKGxvY2tmZCA9IGZjbnRsX2xvY2tfZmlsZShwZi0+ZmlsZSwgRl9XUkxDSywgMCkpIDwgMCkKKwkJCXJldHVybl8wOworCisJCS8qCisJCSAqIEVuc3VyZSB3ZSBsb2NrZWQgdGhlIGZpbGUgd2UgZXhwZWN0ZWQKKwkJICovCisJCWlmIChmc3RhdChsb2NrZmQsICZpbmZvKSkgeworCQkJbG9nX3N5c19lcnJvcigiZnN0YXQiLCBwZi0+ZmlsZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc3RhdChwZi0+ZmlsZSwgJmluZm8yKSkgeworCQkJbG9nX3N5c19lcnJvcigic3RhdCIsIHBmLT5maWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGlzX3NhbWVfaW5vZGUoaW5mbywgaW5mbzIpKQorCQkJYnJlYWs7CisJCisJCWZjbnRsX3VubG9ja19maWxlKGxvY2tmZCk7CisJfQorCisJLyoKKwkgKiBJZiBmaWxlIGNvbnRlbnRzIGNoYW5nZWQgc2luY2Ugd2UgbG9hZGVkIGl0LCBtZXJnZSBuZXcgY29udGVudHMKKwkgKi8KKwlsdm1fc3RhdF9jdGltKCZ0cywgJmluZm8pOworCWlmIChtZXJnZV9leGlzdGluZyAmJiB0aW1lc3BlY2NtcCgmdHMsICZwZi0+Y3RpbWUsICE9KSkKKwkJLyogS2VlcCBjZnQgb3BlbiB0byBhdm9pZCBsb3NpbmcgbG9jayAqLworCQlwZXJzaXN0ZW50X2ZpbHRlcl9sb2FkKGYsICZjZnQpOworCisJdG1wX2ZpbGUgPSBhbGxvY2Eoc3RybGVuKHBmLT5maWxlKSArIDUpOworCXNwcmludGYodG1wX2ZpbGUsICIlcy50bXAiLCBwZi0+ZmlsZSk7CisKKwlpZiAoIShmcCA9IGZvcGVuKHRtcF9maWxlLCAidyIpKSkgeworCQkvKiBFQUNDRVMgaGFzIGJlZW4gcmVwb3J0ZWQgb3ZlciBORlMgKi8KKwkJaWYgKGVycm5vICE9IEVST0ZTICYmIGVycm5vICE9IEVBQ0NFUykKKwkJCWxvZ19zeXNfZXJyb3IoImZvcGVuIiwgdG1wX2ZpbGUpOworCQlnb3RvIG91dDsKKwl9CisKKwlmcHJpbnRmKGZwLCAiIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBtYWludGFpbmVkIGJ5IGx2bS5cblxuIik7CisJZnByaW50ZihmcCwgInBlcnNpc3RlbnRfZmlsdGVyX2NhY2hlIHtcbiIpOworCisJX3dyaXRlX2FycmF5KHBmLCBmcCwgInZhbGlkX2RldmljZXMiLCBQRl9HT09EX0RFVklDRSk7CisJLyogV2UgZG9uJ3QgZ2FpbiBhbnl0aGluZyBieSByZW1lbWJlcmluZyBpbnZhbGlkIGRldmljZXMgKi8KKwkvKiBfd3JpdGVfYXJyYXkocGYsIGZwLCAiaW52YWxpZF9kZXZpY2VzIiwgUEZfQkFEX0RFVklDRSk7ICovCisKKwlmcHJpbnRmKGZwLCAifVxuIik7CisJaWYgKGx2bV9mY2xvc2UoZnAsIHRtcF9maWxlKSkKKwkJZ290b19vdXQ7CisKKwlpZiAocmVuYW1lKHRtcF9maWxlLCBwZi0+ZmlsZSkpCisJCWxvZ19lcnJvcigiJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQ6ICVzIiwgdG1wX2ZpbGUsIHBmLT5maWxlLAorCQkJICBzdHJlcnJvcihlcnJubykpOworCisJciA9IDE7CisKK291dDoKKwlmY250bF91bmxvY2tfZmlsZShsb2NrZmQpOworCisJaWYgKGNmdCkKKwkJY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9sb29rdXBfcChzdHJ1Y3QgZGV2X2ZpbHRlciAqZiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwZmlsdGVyICpwZiA9IChzdHJ1Y3QgcGZpbHRlciAqKSBmLT5wcml2YXRlOworCXZvaWQgKmwgPSBkbV9oYXNoX2xvb2t1cChwZi0+ZGV2aWNlcywgZGV2X25hbWUoZGV2KSk7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCS8qIENhY2hlZCBCQUQ/ICovCisJaWYgKGwgPT0gUEZfQkFEX0RFVklDRSkgeworCQlsb2dfZGVidWdfZGV2cygiJXM6IFNraXBwaW5nIChjYWNoZWQpIiwgZGV2X25hbWUoZGV2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRlc3QgZG0gZGV2aWNlcyBldmVyeSB0aW1lLCBzbyBjYWNoZSB0aGVtIGFzIEdPT0QuICovCisJaWYgKE1BSk9SKGRldi0+ZGV2KSA9PSBwZi0+ZHQtPmRldmljZV9tYXBwZXJfbWFqb3IpIHsKKwkJaWYgKCFsKQorCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmZGV2LT5hbGlhc2VzKQorCQkJCWlmICghZG1faGFzaF9pbnNlcnQocGYtPmRldmljZXMsIHNsLT5zdHIsIFBGX0dPT0RfREVWSUNFKSkgeworCQkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBoYXNoIGRldmljZSB0byBmaWx0ZXIuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJcmV0dXJuIHBmLT5yZWFsLT5wYXNzZXNfZmlsdGVyKHBmLT5yZWFsLCBkZXYpOworCX0KKworCS8qIFVuY2FjaGVkICovCisJaWYgKCFsKSB7CisJCWwgPSBwZi0+cmVhbC0+cGFzc2VzX2ZpbHRlcihwZi0+cmVhbCwgZGV2KSA/ICBQRl9HT09EX0RFVklDRSA6IFBGX0JBRF9ERVZJQ0U7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmZGV2LT5hbGlhc2VzKQorCQkJaWYgKCFkbV9oYXNoX2luc2VydChwZi0+ZGV2aWNlcywgc2wtPnN0ciwgbCkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBoYXNoIGFsaWFzIHRvIGZpbHRlci4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwl9CisKKwlyZXR1cm4gKGwgPT0gUEZfQkFEX0RFVklDRSkgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgX3BlcnNpc3RlbnRfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlzdHJ1Y3QgcGZpbHRlciAqcGYgPSAoc3RydWN0IHBmaWx0ZXIgKikgZi0+cHJpdmF0ZTsKKworCWlmIChmLT51c2VfY291bnQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRGVzdHJveWluZyBwZXJzaXN0ZW50IGZpbHRlciB3aGlsZSBpbiB1c2UgJXUgdGltZXMuIiwgZi0+dXNlX2NvdW50KTsKKworCWRtX2hhc2hfZGVzdHJveShwZi0+ZGV2aWNlcyk7CisJZG1fZnJlZShwZi0+ZmlsZSk7CisJcGYtPnJlYWwtPmRlc3Ryb3kocGYtPnJlYWwpOworCWRtX2ZyZWUocGYpOworCWRtX2ZyZWUoZik7Cit9CisKK3N0cnVjdCBkZXZfZmlsdGVyICpwZXJzaXN0ZW50X2ZpbHRlcl9jcmVhdGUoc3RydWN0IGRldl90eXBlcyAqZHQsCisJCQkJCSAgICBzdHJ1Y3QgZGV2X2ZpbHRlciAqcmVhbCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJc3RydWN0IHBmaWx0ZXIgKnBmOworCXN0cnVjdCBkZXZfZmlsdGVyICpmID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKCEocGYgPSBkbV96YWxsb2Moc2l6ZW9mKCpwZikpKSkgeworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgcGVyc2lzdGVudCBmaWx0ZXIgZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZi0+ZHQgPSBkdDsKKworCWlmICghKHBmLT5maWxlID0gZG1fc3RyZHVwKGZpbGUpKSkgeworCQlsb2dfZXJyb3IoIkZpbGVuYW1lIGR1cGxpY2F0aW9uIGZvciBwZXJzaXN0ZW50IGZpbHRlciBmYWlsZWQuIik7CisJCWdvdG8gYmFkOworCX0KKworCXBmLT5yZWFsID0gcmVhbDsKKworCWlmICghKF9pbml0X2hhc2gocGYpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBoYXNoIHRhYmxlIGZvciBwZXJzaXN0ZW50IGZpbHRlci4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCEoZiA9IGRtX3phbGxvYyhzaXplb2YoKmYpKSkpIHsKKwkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIGRldmljZSBmaWx0ZXIgZm9yIHBlcnNpc3RlbnQgZmlsdGVyIGZhaWxlZC4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogT25seSBtZXJnZSBjYWNoZSBmaWxlIGJlZm9yZSBkdW1waW5nIGl0IGlmIGl0IGNoYW5nZWQgZXh0ZXJuYWxseS4gKi8KKwlpZiAoIXN0YXQocGYtPmZpbGUsICZpbmZvKSkKKwkJbHZtX3N0YXRfY3RpbSgmcGYtPmN0aW1lLCAmaW5mbyk7CisKKwlmLT5wYXNzZXNfZmlsdGVyID0gX2xvb2t1cF9wOworCWYtPmRlc3Ryb3kgPSBfcGVyc2lzdGVudF9kZXN0cm95OworCWYtPnVzZV9jb3VudCA9IDA7CisJZi0+cHJpdmF0ZSA9IHBmOworCWYtPndpcGUgPSBfcGVyc2lzdGVudF9maWx0ZXJfd2lwZTsKKwlmLT5kdW1wID0gX3BlcnNpc3RlbnRfZmlsdGVyX2R1bXA7CisKKwlsb2dfZGVidWdfZGV2cygiUGVyc2lzdGVudCBmaWx0ZXIgaW5pdGlhbGlzZWQuIik7CisKKwlyZXR1cm4gZjsKKworICAgICAgYmFkOgorCWRtX2ZyZWUocGYtPmZpbGUpOworCWlmIChwZi0+ZGV2aWNlcykKKwkJZG1faGFzaF9kZXN0cm95KHBmLT5kZXZpY2VzKTsKKwlkbV9mcmVlKHBmKTsKKwlkbV9mcmVlKGYpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL2ZpbHRlcnMvZmlsdGVyLXJlZ2V4LmMgYi9saWIvZmlsdGVycy9maWx0ZXItcmVnZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQyMjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2ZpbHRlcnMvZmlsdGVyLXJlZ2V4LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKK3N0cnVjdCByZmlsdGVyIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCWRtX2JpdHNldF90IGFjY2VwdDsKKwlzdHJ1Y3QgZG1fcmVnZXggKmVuZ2luZTsKK307CisKK3N0YXRpYyBpbnQgX2V4dHJhY3RfcGF0dGVybihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXQsCisJCQkgICAgY2hhciAqKnJlZ2V4LCBkbV9iaXRzZXRfdCBhY2NlcHQsIGludCBpeCkKK3sKKwljaGFyIHNlcCwgKnIsICpwdHI7CisKKwkvKgorCSAqIGlzIHRoaXMgYW4gYWNjZXB0IG9yIHJlamVjdCBwYXR0ZXJuCisJICovCisJc3dpdGNoICgqcGF0KSB7CisJY2FzZSAnYSc6CisJCWRtX2JpdF9zZXQoYWNjZXB0LCBpeCk7CisJCWJyZWFrOworCisJY2FzZSAncic6CisJCWRtX2JpdF9jbGVhcihhY2NlcHQsIGl4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlsb2dfaW5mbygicGF0dGVybiBtdXN0IGJlZ2luIHdpdGggJ2EnIG9yICdyJyIpOworCQlyZXR1cm4gMDsKKwl9CisJcGF0Kys7CisKKwkvKgorCSAqIGdldCB0aGUgc2VwYXJhdG9yCisJICovCisJc3dpdGNoICgqcGF0KSB7CisJY2FzZSAnKCc6CisJCXNlcCA9ICcpJzsKKwkJYnJlYWs7CisKKwljYXNlICdbJzoKKwkJc2VwID0gJ10nOworCQlicmVhazsKKworCWNhc2UgJ3snOgorCQlzZXAgPSAnfSc7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2VwID0gKnBhdDsKKwl9CisJcGF0Kys7CisKKwkvKgorCSAqIGNvcHkgdGhlIHJlZ2V4CisJICovCisJaWYgKCEociA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgcGF0KSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiB0cmltIHRoZSB0cmFpbGluZyBjaGFyYWN0ZXIsIGhhdmluZyBjaGVja2VkIGl0J3Mgc2VwLgorCSAqLworCXB0ciA9IHIgKyBzdHJsZW4ocikgLSAxOworCWlmICgqcHRyICE9IHNlcCkgeworCQlsb2dfaW5mbygiaW52YWxpZCBzZXBhcmF0b3IgYXQgZW5kIG9mIHJlZ2V4Iik7CisJCXJldHVybiAwOworCX0KKwkqcHRyID0gJ1wwJzsKKworCXJlZ2V4W2l4XSA9IHI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2J1aWxkX21hdGNoZXIoc3RydWN0IHJmaWx0ZXIgKnJmLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2YWwpCit7CisJc3RydWN0IGRtX3Bvb2wgKnNjcmF0Y2g7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdjsKKwljaGFyICoqcmVnZXg7CisJdW5zaWduZWQgY291bnQgPSAwOworCWludCBpLCByID0gMDsKKworCWlmICghKHNjcmF0Y2ggPSBkbV9wb29sX2NyZWF0ZSgiZmlsdGVyIGRtX3JlZ2V4IiwgMTAyNCkpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogY291bnQgaG93IG1hbnkgcGF0dGVybnMgd2UgaGF2ZS4KKwkgKi8KKwlmb3IgKHYgPSB2YWw7IHY7IHYgPSB2LT5uZXh0KSB7CisJCWlmICh2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCWxvZ19lcnJvcigiRmlsdGVyIHBhdHRlcm5zIG11c3QgYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQljb3VudCsrOworCX0KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGVtICovCisJaWYgKCEocmVnZXggPSBkbV9wb29sX2FsbG9jKHNjcmF0Y2gsIHNpemVvZigqcmVnZXgpICogY291bnQpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdleC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ3JlYXRlIHRoZSBhY2NlcHQvcmVqZWN0IGJpdHNldCAqLworCWlmICghKHJmLT5hY2NlcHQgPSBkbV9iaXRzZXRfY3JlYXRlKHJmLT5tZW0sIGNvdW50KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGJpdHNldC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBmaWxsIHRoZSBhcnJheSBiYWNrIHRvIGZyb250IGJlY2F1c2Ugd2UKKwkgKiB3YW50IHRoZSBvcHBvc2l0ZSBwcmVjZWRlbmNlIHRvIHdoYXQKKwkgKiB0aGUgbWF0Y2hlciBnaXZlcy4KKwkgKi8KKwlmb3IgKHYgPSB2YWwsIGkgPSBjb3VudCAtIDE7IHY7IHYgPSB2LT5uZXh0LCBpLS0pCisJCWlmICghX2V4dHJhY3RfcGF0dGVybihzY3JhdGNoLCB2LT52LnN0ciwgcmVnZXgsIHJmLT5hY2NlcHQsIGkpKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgZmlsdGVyIHBhdHRlcm4gXCIlc1wiLiIsIHYtPnYuc3RyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkvKgorCSAqIGJ1aWxkIHRoZSBtYXRjaGVyLgorCSAqLworCWlmICghKHJmLT5lbmdpbmUgPSBkbV9yZWdleF9jcmVhdGUocmYtPm1lbSwgKGNvbnN0IGNoYXIgKiBjb25zdCopIHJlZ2V4LAorCQkJCQkgICBjb3VudCkpKQorCQlnb3RvX291dDsKKwlyID0gMTsKKworICAgICAgb3V0OgorCWRtX3Bvb2xfZGVzdHJveShzY3JhdGNoKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfYWNjZXB0X3Aoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgbSwgZmlyc3QgPSAxLCByZWplY3RlZCA9IDA7CisJc3RydWN0IHJmaWx0ZXIgKnJmID0gKHN0cnVjdCByZmlsdGVyICopIGYtPnByaXZhdGU7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmRldi0+YWxpYXNlcykgeworCQltID0gZG1fcmVnZXhfbWF0Y2gocmYtPmVuZ2luZSwgc2wtPnN0cik7CisKKwkJaWYgKG0gPj0gMCkgeworCQkJaWYgKGRtX2JpdChyZi0+YWNjZXB0LCBtKSkgeworCQkJCWlmICghZmlyc3QpCisJCQkJCWRldl9zZXRfcHJlZmVycmVkX25hbWUoc2wsIGRldik7CisKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJcmVqZWN0ZWQgPSAxOworCQl9CisKKwkJZmlyc3QgPSAwOworCX0KKworCWlmIChyZWplY3RlZCkKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZyAocmVnZXgpIiwgZGV2X25hbWUoZGV2KSk7CisKKwkvKgorCSAqIHBhc3MgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgbWF0Y2gKKwkgKiBhbnl0aGluZy4KKwkgKi8KKwlyZXR1cm4gIXJlamVjdGVkOworfQorCitzdGF0aWMgdm9pZCBfcmVnZXhfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlzdHJ1Y3QgcmZpbHRlciAqcmYgPSAoc3RydWN0IHJmaWx0ZXIgKikgZi0+cHJpdmF0ZTsKKworCWlmIChmLT51c2VfY291bnQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRGVzdHJveWluZyByZWdleCBmaWx0ZXIgd2hpbGUgaW4gdXNlICV1IHRpbWVzLiIsIGYtPnVzZV9jb3VudCk7CisKKwlkbV9wb29sX2Rlc3Ryb3kocmYtPm1lbSk7Cit9CisKK3N0cnVjdCBkZXZfZmlsdGVyICpyZWdleF9maWx0ZXJfY3JlYXRlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnBhdHRlcm5zKQoreworCXN0cnVjdCBkbV9wb29sICptZW0gPSBkbV9wb29sX2NyZWF0ZSgiZmlsdGVyIHJlZ2V4IiwgMTAgKiAxMDI0KTsKKwlzdHJ1Y3QgcmZpbHRlciAqcmY7CisJc3RydWN0IGRldl9maWx0ZXIgKmY7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIShyZiA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKnJmKSkpKQorCQlnb3RvX2JhZDsKKworCXJmLT5tZW0gPSBtZW07CisKKwlpZiAoIV9idWlsZF9tYXRjaGVyKHJmLCBwYXR0ZXJucykpCisJCWdvdG9fYmFkOworCisJaWYgKCEoZiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpmKSkpKQorCQlnb3RvX2JhZDsKKworCWYtPnBhc3Nlc19maWx0ZXIgPSBfYWNjZXB0X3A7CisJZi0+ZGVzdHJveSA9IF9yZWdleF9kZXN0cm95OworCWYtPnVzZV9jb3VudCA9IDA7CisJZi0+cHJpdmF0ZSA9IHJmOworCisJbG9nX2RlYnVnX2RldnMoIlJlZ2V4IGZpbHRlciBpbml0aWFsaXNlZC4iKTsKKworCXJldHVybiBmOworCisgICAgICBiYWQ6CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItc3lzZnMuYyBiL2xpYi9maWx0ZXJzL2ZpbHRlci1zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTVmODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZmlsdGVycy9maWx0ZXItc3lzZnMuYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2lmZGVmIF9fbGludXhfXworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKK3N0YXRpYyBpbnQgX2xvY2F0ZV9zeXNmc19ibG9ja3MoY29uc3QgY2hhciAqc3lzZnNfZGlyLCBjaGFyICpwYXRoLCBzaXplX3QgbGVuLAorCQkJCXVuc2lnbmVkICpzeXNmc19kZXB0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCXVuc2lnbmVkIGk7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBkaXJfY2xhc3MgeworCQljb25zdCBjaGFyIHBhdGhbMzJdOworCQlpbnQgZGVwdGg7CisJfSBjbGFzc2VzW10gPSB7CisJCS8qCisJCSAqIHVuaWZpZWQgY2xhc3NpZmljYXRpb24gZGlyZWN0b3J5IGZvciBhbGwga2VybmVsIHN1YnN5c3RlbXMKKwkJICoKKwkJICogL3N5cy9zdWJzeXN0ZW0vYmxvY2svZGV2aWNlcworCQkgKiB8LS0gc2RhIC0+IC4uLy4uLy4uL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFmLjIvaG9zdDAvdGFyZ2V0MDowOjAvMDowOjA6MC9ibG9jay9zZGEKKwkJICogfC0tIHNkYTEgLT4gLi4vLi4vLi4vZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWYuMi9ob3N0MC90YXJnZXQwOjA6MC8wOjA6MDowL2Jsb2NrL3NkYS9zZGExCisJCSAqICBgLS0gc3IwIC0+IC4uLy4uLy4uL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFmLjIvaG9zdDEvdGFyZ2V0MTowOjAvMTowOjA6MC9ibG9jay9zcjAKKwkJICoKKwkJICovCisJCXsgInN1YnN5c3RlbS9ibG9jay9kZXZpY2VzIiwgMCB9LAorCisJCS8qCisJCSAqIGJsb2NrIHN1YnN5c3RlbSBhcyBhIGNsYXNzCisJCSAqCisJCSAqIC9zeXMvY2xhc3MvYmxvY2sKKwkJICogfC0tIHNkYSAtPiAuLi8uLi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxZi4yL2hvc3QwL3RhcmdldDA6MDowLzA6MDowOjAvYmxvY2svc2RhCisJCSAqIHwtLSBzZGExIC0+IC4uLy4uL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFmLjIvaG9zdDAvdGFyZ2V0MDowOjAvMDowOjA6MC9ibG9jay9zZGEvc2RhMQorCQkgKiAgYC0tIHNyMCAtPiAuLi8uLi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxZi4yL2hvc3QxL3RhcmdldDE6MDowLzE6MDowOjAvYmxvY2svc3IwCisJCSAqCisJCSAqLworCQl7ICJjbGFzcy9ibG9jayIsIDAgfSwKKworCQkvKgorCQkgKiBvbGQgYmxvY2sgc3Vic3lzdGVtIGxheW91dCB3aXRoIG5lc3RlZCBkaXJlY3RvcmllcworCQkgKgorCQkgKiAvc3lzL2Jsb2NrLworCQkgKiB8LS0gc2RhCisJCSAqIHwgICB8LS0gY2FwYWJpbGl0eQorCQkgKiB8ICAgfC0tIGRldgorCQkgKiAuLi4KKwkJICogfCAgIHwtLSBzZGExCisJCSAqIHwgICB8ICAgfC0tIGRldgorCQkgKiAuLi4KKwkJICogfAorCQkgKiBgLS0gc3IwCisJCSAqICAgICB8LS0gY2FwYWJpbGl0eQorCQkgKiAgICAgfC0tIGRldgorCQkgKiAuLi4KKwkJICoKKwkJICovCisKKwkJeyAiYmxvY2siLCAxIH0KKwl9OworCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoY2xhc3Nlcyk7ICsraSkKKwkJaWYgKChkbV9zbnByaW50ZihwYXRoLCBsZW4sICIlcyVzIiwgc3lzZnNfZGlyLCBjbGFzc2VzW2ldLnBhdGgpID49IDApICYmCisJCSAgICAoc3RhdChwYXRoLCAmaW5mbykgPT0gMCkpIHsKKwkJCSpzeXNmc19kZXB0aCA9IGNsYXNzZXNbaV0uZGVwdGg7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2UgbmVlZCB0byBzdG9yZSBhIHNldCBvZiBkZXZfdC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGVudHJ5IHsKKwlzdHJ1Y3QgZW50cnkgKm5leHQ7CisJZGV2X3QgZGV2OworfTsKKworI2RlZmluZSBTRVRfQlVDS0VUUyA2NAorc3RydWN0IGRldl9zZXQgeworCXN0cnVjdCBkbV9wb29sICptZW07CisJY29uc3QgY2hhciAqc3lzX2Jsb2NrOworCXVuc2lnbmVkIHN5c2ZzX2RlcHRoOworCWludCBpbml0aWFsaXNlZDsKKwlzdHJ1Y3QgZW50cnkgKnNsb3RzW1NFVF9CVUNLRVRTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X3NldCAqX2Rldl9zZXRfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnN5c19ibG9jaywKKwkJCQkgICAgICAgdW5zaWduZWQgc3lzZnNfZGVwdGgpCit7CisJc3RydWN0IGRldl9zZXQgKmRzOworCisJaWYgKCEoZHMgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqZHMpKSkpCisJCXJldHVybiBOVUxMOworCisJZHMtPm1lbSA9IG1lbTsKKwlpZiAoIShkcy0+c3lzX2Jsb2NrID0gZG1fcG9vbF9zdHJkdXAobWVtLCBzeXNfYmxvY2spKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkcy0+c3lzZnNfZGVwdGggPSBzeXNmc19kZXB0aDsKKwlkcy0+aW5pdGlhbGlzZWQgPSAwOworCisJcmV0dXJuIGRzOworfQorCitzdGF0aWMgdW5zaWduZWQgX2hhc2hfZGV2KGRldl90IGRldikKK3sKKwlyZXR1cm4gKG1ham9yKGRldikgXiBtaW5vcihkZXYpKSAmIChTRVRfQlVDS0VUUyAtIDEpOworfQorCisvKgorICogRG9lc24ndCBjaGVjayB0aGF0IHRoZSBzZXQgYWxyZWFkeSBjb250YWlucyBkZXYuCisgKi8KK3N0YXRpYyBpbnQgX3NldF9pbnNlcnQoc3RydWN0IGRldl9zZXQgKmRzLCBkZXZfdCBkZXYpCit7CisJc3RydWN0IGVudHJ5ICplOworCXVuc2lnbmVkIGggPSBfaGFzaF9kZXYoZGV2KTsKKworCWlmICghKGUgPSBkbV9wb29sX2FsbG9jKGRzLT5tZW0sIHNpemVvZigqZSkpKSkKKwkJcmV0dXJuIDA7CisKKwllLT5uZXh0ID0gZHMtPnNsb3RzW2hdOworCWUtPmRldiA9IGRldjsKKwlkcy0+c2xvdHNbaF0gPSBlOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9sb29rdXAoc3RydWN0IGRldl9zZXQgKmRzLCBkZXZfdCBkZXYpCit7CisJdW5zaWduZWQgaCA9IF9oYXNoX2RldihkZXYpOworCXN0cnVjdCBlbnRyeSAqZTsKKworCWZvciAoZSA9IGRzLT5zbG90c1toXTsgZTsgZSA9IGUtPm5leHQpCisJCWlmIChlLT5kZXYgPT0gZGV2KQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmaWx0ZXIgbWV0aG9kcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9wYXJzZV9kZXYoY29uc3QgY2hhciAqZmlsZSwgRklMRSAqZnAsIGRldl90ICpyZXN1bHQpCit7CisJdW5zaWduZWQgbWFqb3IsIG1pbm9yOworCWNoYXIgYnVmZmVyWzY0XTsKKworCWlmICghZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZnApKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgc3lzZnMgZGV2aWNlIGZpbGU6ICVzIiwgZmlsZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzc2NhbmYoYnVmZmVyLCAiJXU6JXUiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgeworCQlsb2dfaW5mbygic3lzZnMgZGV2aWNlIGZpbGUgbm90IGNvcnJlY3QgZm9ybWF0Iik7CisJCXJldHVybiAwOworCX0KKworCSpyZXN1bHQgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfZGV2KGNvbnN0IGNoYXIgKmZpbGUsIGRldl90ICpyZXN1bHQpCit7CisJaW50IHI7CisJRklMRSAqZnA7CisKKwlpZiAoIShmcCA9IGZvcGVuKGZpbGUsICJyIikpKSB7CisJCWxvZ19zeXNfZXJyb3IoImZvcGVuIiwgZmlsZSk7CisJCXJldHVybiAwOworCX0KKworCXIgPSBfcGFyc2VfZGV2KGZpbGUsIGZwLCByZXN1bHQpOworCisJaWYgKGZjbG9zZShmcCkpCisJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIGZpbGUpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBSZWN1cnNlIHRocm91Z2ggc3lzZnMgZGlyZWN0b3JpZXMsIGluc2VydGluZyBhbnkgZGV2cyBmb3VuZC4KKyAqLworc3RhdGljIGludCBfcmVhZF9kZXZzKHN0cnVjdCBkZXZfc2V0ICpkcywgY29uc3QgY2hhciAqZGlyLCB1bnNpZ25lZCBzeXNmc19kZXB0aCkKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkOworCURJUiAqZHI7CisJc3RydWN0IHN0YXQgaW5mbzsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgZmlsZVtQQVRIX01BWF07CisJZGV2X3QgZGV2ID0geyAwIH07CisJaW50IHIgPSAxOworCisJaWYgKCEoZHIgPSBvcGVuZGlyKGRpcikpKSB7CisJCWxvZ19zeXNfZXJyb3IoIm9wZW5kaXIiLCBkaXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKGQgPSByZWFkZGlyKGRyKSkpIHsKKwkJaWYgKCFzdHJjbXAoZC0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZC0+ZF9uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkbV9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsIGRpciwKKwkJCQkgZC0+ZF9uYW1lKSA8IDApIHsKKwkJCWxvZ19lcnJvcigic3lzZnMgcGF0aCBuYW1lIHRvbyBsb25nOiAlcyBpbiAlcyIsCisJCQkJICBkLT5kX25hbWUsIGRpcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGRldmljZXMgaGF2ZSBhICJkZXYiIGZpbGUgKi8KKwkJaWYgKGRtX3NucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIiVzL2RldiIsIHBhdGgpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJzeXNmcyBwYXRoIG5hbWUgdG9vIGxvbmc6ICVzIGluICVzIiwKKwkJCQkgIGQtPmRfbmFtZSwgZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdGF0KGZpbGUsICZpbmZvKSkgeworCQkJLyogcmVjdXJzZSBpZiB3ZSBmb3VuZCBhIGRldmljZSBhbmQgZXhwZWN0IHN1YmRpcnMgKi8KKwkJCWlmIChzeXNmc19kZXB0aCkKKwkJCQlfcmVhZF9kZXZzKGRzLCBwYXRoLCBzeXNmc19kZXB0aCAtIDEpOworCisJCQkvKiBhZGQgdGhlIGRldmljZSB3ZSBoYXZlIGZvdW5kICovCisJCQlpZiAoX3JlYWRfZGV2KGZpbGUsICZkZXYpKQorCQkJCV9zZXRfaW5zZXJ0KGRzLCBkZXYpOworCQl9CisJfQorCisJaWYgKGNsb3NlZGlyKGRyKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2VkaXIiLCBkaXIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfZGV2cyhzdHJ1Y3QgZGV2X3NldCAqZHMpCit7CisJaWYgKCFfcmVhZF9kZXZzKGRzLCBkcy0+c3lzX2Jsb2NrLCBkcy0+c3lzZnNfZGVwdGgpKSB7CisJCWRzLT5pbml0aWFsaXNlZCA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwlkcy0+aW5pdGlhbGlzZWQgPSAxOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfYWNjZXB0X3Aoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X3NldCAqZHMgPSAoc3RydWN0IGRldl9zZXQgKikgZi0+cHJpdmF0ZTsKKworCWlmICghZHMtPmluaXRpYWxpc2VkKQorCQlfaW5pdF9kZXZzKGRzKTsKKworCS8qIFBhc3MgdGhyb3VnaCBpZiBpbml0aWFsaXNhdGlvbiBmYWlsZWQgKi8KKwlpZiAoZHMtPmluaXRpYWxpc2VkICE9IDEpCisJCXJldHVybiAxOworCisJaWYgKCFfc2V0X2xvb2t1cChkcywgZGV2LT5kZXYpKSB7CisJCWxvZ19kZWJ1Z19kZXZzKCIlczogU2tpcHBpbmcgKHN5c2ZzKSIsIGRldl9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95KHN0cnVjdCBkZXZfZmlsdGVyICpmKQoreworCXN0cnVjdCBkZXZfc2V0ICpkcyA9IChzdHJ1Y3QgZGV2X3NldCAqKSBmLT5wcml2YXRlOworCisJaWYgKGYtPnVzZV9jb3VudCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJEZXN0cm95aW5nIHN5c2ZzIGZpbHRlciB3aGlsZSBpbiB1c2UgJXUgdGltZXMuIiwgZi0+dXNlX2NvdW50KTsKKworCWRtX3Bvb2xfZGVzdHJveShkcy0+bWVtKTsKK30KKworc3RydWN0IGRldl9maWx0ZXIgKnN5c2ZzX2ZpbHRlcl9jcmVhdGUodm9pZCkKK3sKKwljb25zdCBjaGFyICpzeXNmc19kaXIgPSBkbV9zeXNmc19kaXIoKTsKKwljaGFyIHN5c19ibG9ja1tQQVRIX01BWF07CisJdW5zaWduZWQgc3lzZnNfZGVwdGg7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZGV2X3NldCAqZHM7CisJc3RydWN0IGRldl9maWx0ZXIgKmY7CisKKwlpZiAoISpzeXNmc19kaXIpIHsKKwkJbG9nX3ZlcmJvc2UoIk5vIHByb2MgZmlsZXN5c3RlbSBmb3VuZDogc2tpcHBpbmcgc3lzZnMgZmlsdGVyIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghX2xvY2F0ZV9zeXNmc19ibG9ja3Moc3lzZnNfZGlyLCBzeXNfYmxvY2ssIHNpemVvZihzeXNfYmxvY2spLCAmc3lzZnNfZGVwdGgpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJzeXNmcyIsIDI1NikpKSB7CisJCWxvZ19lcnJvcigic3lzZnMgcG9vbCBjcmVhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoZHMgPSBfZGV2X3NldF9jcmVhdGUobWVtLCBzeXNfYmxvY2ssIHN5c2ZzX2RlcHRoKSkpIHsKKwkJbG9nX2Vycm9yKCJzeXNmcyBkZXZfc2V0IGNyZWF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIShmID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKmYpKSkpCisJCWdvdG9fYmFkOworCisJZi0+cGFzc2VzX2ZpbHRlciA9IF9hY2NlcHRfcDsKKwlmLT5kZXN0cm95ID0gX2Rlc3Ryb3k7CisJZi0+dXNlX2NvdW50ID0gMDsKKwlmLT5wcml2YXRlID0gZHM7CisKKwlsb2dfZGVidWdfZGV2cygiU3lzZnMgZmlsdGVyIGluaXRpYWxpc2VkLiIpOworCisJcmV0dXJuIGY7CisKKyBiYWQ6CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlCisKK3N0cnVjdCBkZXZfZmlsdGVyICpzeXNmc19maWx0ZXJfY3JlYXRlKGNvbnN0IGNoYXIgKnN5c2ZzX2RpciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXItdHlwZS5jIGIvbGliL2ZpbHRlcnMvZmlsdGVyLXR5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJiMDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2ZpbHRlcnMvZmlsdGVyLXR5cGUuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImZpbHRlci5oIgorCitzdGF0aWMgaW50IF9wYXNzZXNfbHZtX3R5cGVfZGV2aWNlX2ZpbHRlcihzdHJ1Y3QgZGV2X2ZpbHRlciAqZiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfdHlwZXMgKmR0ID0gKHN0cnVjdCBkZXZfdHlwZXMgKikgZi0+cHJpdmF0ZTsKKwljb25zdCBjaGFyICpuYW1lID0gZGV2X25hbWUoZGV2KTsKKworCS8qIElzIHRoaXMgYSByZWNvZ25pc2VkIGRldmljZSB0eXBlPyAqLworCWlmICghZHQtPmRldl90eXBlX2FycmF5W01BSk9SKGRldi0+ZGV2KV0ubWF4X3BhcnRpdGlvbnMpIHsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZzogVW5yZWNvZ25pc2VkIExWTSBkZXZpY2UgdHlwZSAlIgorCQkJICAgICAgIFBSSXU2NCwgbmFtZSwgKHVpbnQ2NF90KSBNQUpPUihkZXYtPmRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2x2bV90eXBlX2ZpbHRlcl9kZXN0cm95KHN0cnVjdCBkZXZfZmlsdGVyICpmKQoreworCWlmIChmLT51c2VfY291bnQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRGVzdHJveWluZyBsdm1fdHlwZSBmaWx0ZXIgd2hpbGUgaW4gdXNlICV1IHRpbWVzLiIsIGYtPnVzZV9jb3VudCk7CisKKwlkbV9mcmVlKGYpOworfQorCitzdHJ1Y3QgZGV2X2ZpbHRlciAqbHZtX3R5cGVfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCkKK3sKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqZjsKKworCWlmICghKGYgPSBkbV96YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfZmlsdGVyKSkpKSB7CisJCWxvZ19lcnJvcigiTFZNIHR5cGUgZmlsdGVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWYtPnBhc3Nlc19maWx0ZXIgPSBfcGFzc2VzX2x2bV90eXBlX2RldmljZV9maWx0ZXI7CisJZi0+ZGVzdHJveSA9IF9sdm1fdHlwZV9maWx0ZXJfZGVzdHJveTsKKwlmLT51c2VfY291bnQgPSAwOworCWYtPnByaXZhdGUgPSBkdDsKKworCWxvZ19kZWJ1Z19kZXZzKCJMVk0gdHlwZSBmaWx0ZXIgaW5pdGlhbGlzZWQuIik7CisKKwlyZXR1cm4gZjsKK30KZGlmZiAtLWdpdCBhL2xpYi9maWx0ZXJzL2ZpbHRlci11c2FibGUuYyBiL2xpYi9maWx0ZXJzL2ZpbHRlci11c2FibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUyZTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2ZpbHRlcnMvZmlsdGVyLXVzYWJsZS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIiAvKiBkZXZpY2VfaXNfdXNhYmxlICovCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CisjaW5jbHVkZSAiZGV2LWV4dC11ZGV2LWNvbnN0YW50cy5oIgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpfdG9vX3NtYWxsX3RvX2hvbGRfcHZfbXNnID0gIlRvbyBzbWFsbCB0byBob2xkIGEgUFYiOworCitzdGF0aWMgaW50IF9uYXRpdmVfY2hlY2tfcHZfbWluX3NpemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVpbnQ2NF90IHNpemU7CisJaW50IHJldCA9IDA7CisKKwkvKiBDaGVjayBpdCdzIGFjY2Vzc2libGUgKi8KKwlpZiAoIWRldl9vcGVuX3JlYWRvbmx5X3F1aWV0KGRldikpIHsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZzogb3BlbiBmYWlsZWQiLCBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaXQncyBub3QgdG9vIHNtYWxsICovCisJaWYgKCFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpIHsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZzogZGV2X2dldF9zaXplIGZhaWxlZCIsIGRldl9uYW1lKGRldikpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2l6ZSA8IHB2X21pbl9zaXplKCkpIHsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZzogJXMiLCBkZXZfbmFtZShkZXYpLAorCQkJCV90b29fc21hbGxfdG9faG9sZF9wdl9tc2cpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAxOworb3V0OgorCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCitzdGF0aWMgaW50IF91ZGV2X2NoZWNrX3B2X21pbl9zaXplKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X2V4dCAqZXh0OworCWNvbnN0IGNoYXIgKnNpemVfc3RyOworCWNoYXIgKmVuZHA7CisJdWludDY0X3Qgc2l6ZTsKKworCWlmICghKGV4dCA9IGRldl9leHRfZ2V0KGRldikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNpemVfc3RyID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoKHN0cnVjdCB1ZGV2X2RldmljZSAqKWV4dC0+aGFuZGxlLCBERVZfRVhUX1VERVZfU1lTRlNfQVRUUl9TSVpFKSkpIHsKKwkJbG9nX2RlYnVnX2RldnMoIiVzOiBTa2lwcGluZzogZmFpbGVkIHRvIGdldCBzaXplIGZyb20gc3lzZnMgWyVzOiVwXSIsCisJCQkJZGV2X25hbWUoZGV2KSwgZGV2X2V4dF9uYW1lKGRldiksIGRldi0+ZXh0LmhhbmRsZSk7CisJCXJldHVybiAwOworCX0KKworCWVycm5vID0gMDsKKwlzaXplID0gc3RydG91bGwoc2l6ZV9zdHIsICZlbmRwLCAxMCk7CisJaWYgKGVycm5vIHx8ICFlbmRwIHx8ICplbmRwKSB7CisJCWxvZ19kZWJ1Z19kZXZzKCIlczogU2tpcHBpbmc6IGZhaWxlZCB0byBwYXJzZSBzaXplIGZyb20gc3lzZnMgWyVzOiVwXSIsCisJCQkJZGV2X25hbWUoZGV2KSwgZGV2X2V4dF9uYW1lKGRldiksIGRldi0+ZXh0LmhhbmRsZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzaXplIDwgcHZfbWluX3NpemUoKSkgeworCQlsb2dfZGVidWdfZGV2cygiJXM6IFNraXBwaW5nOiAlcyBbJXM6JXBdIiwgZGV2X25hbWUoZGV2KSwKKwkJCQlfdG9vX3NtYWxsX3RvX2hvbGRfcHZfbXNnLAorCQkJCWRldl9leHRfbmFtZShkZXYpLCBkZXYtPmV4dC5oYW5kbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW50IF91ZGV2X2NoZWNrX3B2X21pbl9zaXplKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9jaGVja19wdl9taW5fc2l6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+ZXh0LnNyYyA9PSBERVZfRVhUX05PTkUpCisJCXJldHVybiBfbmF0aXZlX2NoZWNrX3B2X21pbl9zaXplKGRldik7CisKKwlpZiAoZGV2LT5leHQuc3JjID09IERFVl9FWFRfVURFVikKKwkJcmV0dXJuIF91ZGV2X2NoZWNrX3B2X21pbl9zaXplKGRldik7CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1pc3NpbmcgaG9vayBmb3IgUFYgbWluIHNpemUgY2hlY2sgIgorCQkgICJ1c2luZyBleHRlcm5hbCBkZXZpY2UgaW5mbyBzb3VyY2UgJXMiLCBkZXZfZXh0X25hbWUoZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcGFzc2VzX3VzYWJsZV9maWx0ZXIoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlmaWx0ZXJfbW9kZV90IG1vZGUgPSAqKChmaWx0ZXJfbW9kZV90ICopIGYtPnByaXZhdGUpOworCXN0cnVjdCBkZXZfdXNhYmxlX2NoZWNrX3BhcmFtcyB1Y3AgPSB7MH07CisJaW50IHIgPSAxOworCisJLyogZnVydGhlciBjaGVja3MgYXJlIGRvbmUgb24gZG0gZGV2aWNlcyBvbmx5ICovCisJaWYgKGRtX2lzX2RtX21ham9yKE1BSk9SKGRldi0+ZGV2KSkpIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgRklMVEVSX01PREVfTk9fTFZNRVRBRDoKKwkJCXVjcC5jaGVja19lbXB0eSA9IDE7CisJCQl1Y3AuY2hlY2tfYmxvY2tlZCA9IDE7CisJCQl1Y3AuY2hlY2tfc3VzcGVuZGVkID0gaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKCk7CisJCQl1Y3AuY2hlY2tfZXJyb3JfdGFyZ2V0ID0gMTsKKwkJCXVjcC5jaGVja19yZXNlcnZlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBGSUxURVJfTU9ERV9QUkVfTFZNRVRBRDoKKwkJCXVjcC5jaGVja19lbXB0eSA9IDE7CisJCQl1Y3AuY2hlY2tfYmxvY2tlZCA9IDE7CisJCQl1Y3AuY2hlY2tfc3VzcGVuZGVkID0gMDsKKwkJCXVjcC5jaGVja19lcnJvcl90YXJnZXQgPSAxOworCQkJdWNwLmNoZWNrX3Jlc2VydmVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEZJTFRFUl9NT0RFX1BPU1RfTFZNRVRBRDoKKwkJCXVjcC5jaGVja19lbXB0eSA9IDA7CisJCQl1Y3AuY2hlY2tfYmxvY2tlZCA9IDE7CisJCQl1Y3AuY2hlY2tfc3VzcGVuZGVkID0gaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKCk7CisJCQl1Y3AuY2hlY2tfZXJyb3JfdGFyZ2V0ID0gMDsKKwkJCXVjcC5jaGVja19yZXNlcnZlZCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHIgPSBkZXZpY2VfaXNfdXNhYmxlKGRldiwgdWNwKSkpCisJCQlsb2dfZGVidWdfZGV2cygiJXM6IFNraXBwaW5nIHVudXNhYmxlIGRldmljZS4iLCBkZXZfbmFtZShkZXYpKTsKKwl9CisKKwlpZiAocikgeworCQkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG5vdCB0b28gc21hbGwgdG8gaG9sZCBhIFBWICovCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIEZJTFRFUl9NT0RFX05PX0xWTUVUQUQ6CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBGSUxURVJfTU9ERV9QUkVfTFZNRVRBRDoKKwkJCXIgPSBfY2hlY2tfcHZfbWluX3NpemUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIEZJTFRFUl9NT0RFX1BPU1RfTFZNRVRBRDoKKwkJCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX3VzYWJsZV9maWx0ZXJfZGVzdHJveShzdHJ1Y3QgZGV2X2ZpbHRlciAqZikKK3sKKwlpZiAoZi0+dXNlX2NvdW50KQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRlc3Ryb3lpbmcgdXNhYmxlIGRldmljZSBmaWx0ZXIgd2hpbGUgaW4gdXNlICV1IHRpbWVzLiIsIGYtPnVzZV9jb3VudCk7CisKKwlkbV9mcmVlKGYtPnByaXZhdGUpOworCWRtX2ZyZWUoZik7Cit9CisKK3N0cnVjdCBkZXZfZmlsdGVyICp1c2FibGVfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgZmlsdGVyX21vZGVfdCBtb2RlKQoreworCXN0cnVjdCBkZXZfZmlsdGVyICpmOworCisJaWYgKCEoZiA9IGRtX3phbGxvYyhzaXplb2Yoc3RydWN0IGRldl9maWx0ZXIpKSkpIHsKKwkJbG9nX2Vycm9yKCJVc2FibGUgZGV2aWNlIGZpbHRlciBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmLT5wYXNzZXNfZmlsdGVyID0gX3Bhc3Nlc191c2FibGVfZmlsdGVyOworCWYtPmRlc3Ryb3kgPSBfdXNhYmxlX2ZpbHRlcl9kZXN0cm95OworCWYtPnVzZV9jb3VudCA9IDA7CisJaWYgKCEoZi0+cHJpdmF0ZSA9IGRtX3phbGxvYyhzaXplb2YoZmlsdGVyX21vZGVfdCkpKSkgeworCQlsb2dfZXJyb3IoIlVzYWJsZSBkZXZpY2UgZmlsdGVyIG1vZGUgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZG1fZnJlZShmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSooKGZpbHRlcl9tb2RlX3QgKikgZi0+cHJpdmF0ZSkgPSBtb2RlOworCisJbG9nX2RlYnVnX2RldnMoIlVzYWJsZSBkZXZpY2UgZmlsdGVyIGluaXRpYWxpc2VkLiIpOworCisJcmV0dXJuIGY7Cit9CmRpZmYgLS1naXQgYS9saWIvZmlsdGVycy9maWx0ZXIuaCBiL2xpYi9maWx0ZXJzL2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWY2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZmlsdGVycy9maWx0ZXIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTHVjYSBCZXJyYQorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0ZJTFRFUl9ICisjZGVmaW5lIF9MVk1fRklMVEVSX0gKKworI2luY2x1ZGUgImRldi1jYWNoZS5oIgorI2luY2x1ZGUgImRldi10eXBlLmgiCisKK3N0cnVjdCBkZXZfZmlsdGVyICpjb21wb3NpdGVfZmlsdGVyX2NyZWF0ZShpbnQgbiwgaW50IHVzZV9kZXZfZXh0X2luZm8sIHN0cnVjdCBkZXZfZmlsdGVyICoqZmlsdGVycyk7CisKK3N0cnVjdCBkZXZfZmlsdGVyICpsdm1fdHlwZV9maWx0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0KTsKK3N0cnVjdCBkZXZfZmlsdGVyICptZF9maWx0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0KTsKK3N0cnVjdCBkZXZfZmlsdGVyICpmd3JhaWRfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCk7CitzdHJ1Y3QgZGV2X2ZpbHRlciAqbXBhdGhfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCk7CitzdHJ1Y3QgZGV2X2ZpbHRlciAqcGFydGl0aW9uZWRfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCk7CitzdHJ1Y3QgZGV2X2ZpbHRlciAqcGVyc2lzdGVudF9maWx0ZXJfY3JlYXRlKHN0cnVjdCBkZXZfdHlwZXMgKmR0LAorCQkJCQkgICAgc3RydWN0IGRldl9maWx0ZXIgKmYsCisJCQkJCSAgICBjb25zdCBjaGFyICpmaWxlKTsKK3N0cnVjdCBkZXZfZmlsdGVyICpzeXNmc19maWx0ZXJfY3JlYXRlKHZvaWQpOworCitzdHJ1Y3QgZGV2X2ZpbHRlciAqaW50ZXJuYWxfZmlsdGVyX2NyZWF0ZSh2b2lkKTsKK2ludCBpbnRlcm5hbF9maWx0ZXJfYWxsb3coc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRldmljZSAqZGV2KTsKK3ZvaWQgaW50ZXJuYWxfZmlsdGVyX2NsZWFyKHZvaWQpOworCisvKgorICogcGF0dGVybnMgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIG9mIHRoZSBmb3JtOgorICogW3JhXTxzZXA+PHJlZ2V4PjxzZXA+LCBlZywKKyAqIHIvY2Ryb20vICAgICAgICAgIC0gcmVqZWN0IGNkcm9tcworICogYXxsb29wL1swLTRdfCAgICAgLSBhY2NlcHQgbG9vcHMgMCB0byA0CisgKiByfC4qfCAgICAgICAgICAgICAtIHJlamVjdCBldmVyeXRoaW5nIGVsc2UKKyAqLworCitzdHJ1Y3QgZGV2X2ZpbHRlciAqcmVnZXhfZmlsdGVyX2NyZWF0ZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpwYXR0ZXJucyk7CisKK3R5cGVkZWYgZW51bSB7CisJRklMVEVSX01PREVfTk9fTFZNRVRBRCwKKwlGSUxURVJfTU9ERV9QUkVfTFZNRVRBRCwKKwlGSUxURVJfTU9ERV9QT1NUX0xWTUVUQUQKK30gZmlsdGVyX21vZGVfdDsKK3N0cnVjdCBkZXZfZmlsdGVyICp1c2FibGVfZmlsdGVyX2NyZWF0ZShzdHJ1Y3QgZGV2X3R5cGVzICpkdCwgZmlsdGVyX21vZGVfdCBtb2RlKTsKKworaW50IHBlcnNpc3RlbnRfZmlsdGVyX2xvYWQoc3RydWN0IGRldl9maWx0ZXIgKmYsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqKmNmdF9vdXQpOworCisjZW5kaWYgCS8qIF9MVk1fRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXQxLy5leHBvcnRlZF9zeW1ib2xzIGIvbGliL2Zvcm1hdDEvLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmYWMyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXQxLy5leHBvcnRlZF9zeW1ib2xzCkBAIC0wLDAgKzEgQEAKK2luaXRfZm9ybWF0CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0MS9NYWtlZmlsZS5pbiBiL2xpYi9mb3JtYXQxL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTA1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9XAorCWRpc2stcmVwLmMgXAorCWZvcm1hdDEuYyBcCisJaW1wb3J0LWV4cG9ydC5jIFwKKwlpbXBvcnQtZXh0ZW50cy5jIFwKKwlsYXlvdXQuYyBcCisJbHZtMS1sYWJlbC5jIFwKKwl2Z19udW1iZXIuYworCitMSUJfU0hBUkVEID0gbGlibHZtMmZvcm1hdDEuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMl9wbHVnaW4KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXQxL2Rpc2stcmVwLmMgYi9saWIvZm9ybWF0MS9kaXNrLXJlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDEzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9kaXNrLXJlcC5jCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRpc2stcmVwLmgiCisjaW5jbHVkZSAieGxhdGUuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjZGVmaW5lIHh4MTYodikgZGlzay0+diA9IHhsYXRlMTYoZGlzay0+dikKKyNkZWZpbmUgeHgzMih2KSBkaXNrLT52ID0geGxhdGUzMihkaXNrLT52KQorI2RlZmluZSB4eDY0KHYpIGRpc2stPnYgPSB4bGF0ZTY0KGRpc2stPnYpCisKKy8qCisgKiBGdW5jdGlvbnMgdG8gcGVyZm9ybSB0aGUgZW5kaWFuIGNvbnZlcnNpb24KKyAqIGJldHdlZW4gZGlzayBhbmQgY29yZS4gIFRoZSBzYW1lIGNvZGUgd29ya3MKKyAqIGJvdGggd2F5cyBvZiBjb3Vyc2UuCisgKi8KK3N0YXRpYyB2b2lkIF94bGF0ZV9wdmQoc3RydWN0IHB2X2Rpc2sgKmRpc2spCit7CisJeHgxNih2ZXJzaW9uKTsKKworCXh4MzIocHZfb25fZGlzay5iYXNlKTsKKwl4eDMyKHB2X29uX2Rpc2suc2l6ZSk7CisJeHgzMih2Z19vbl9kaXNrLmJhc2UpOworCXh4MzIodmdfb25fZGlzay5zaXplKTsKKwl4eDMyKHB2X3V1aWRsaXN0X29uX2Rpc2suYmFzZSk7CisJeHgzMihwdl91dWlkbGlzdF9vbl9kaXNrLnNpemUpOworCXh4MzIobHZfb25fZGlzay5iYXNlKTsKKwl4eDMyKGx2X29uX2Rpc2suc2l6ZSk7CisJeHgzMihwZV9vbl9kaXNrLmJhc2UpOworCXh4MzIocGVfb25fZGlzay5zaXplKTsKKworCXh4MzIocHZfbWFqb3IpOworCXh4MzIocHZfbnVtYmVyKTsKKwl4eDMyKHB2X3N0YXR1cyk7CisJeHgzMihwdl9hbGxvY2F0YWJsZSk7CisJeHgzMihwdl9zaXplKTsKKwl4eDMyKGx2X2N1cik7CisJeHgzMihwZV9zaXplKTsKKwl4eDMyKHBlX3RvdGFsKTsKKwl4eDMyKHBlX2FsbG9jYXRlZCk7CisJeHgzMihwZV9zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIF94bGF0ZV9sdmQoc3RydWN0IGx2X2Rpc2sgKmRpc2spCit7CisJeHgzMihsdl9hY2Nlc3MpOworCXh4MzIobHZfc3RhdHVzKTsKKwl4eDMyKGx2X29wZW4pOworCXh4MzIobHZfZGV2KTsKKwl4eDMyKGx2X251bWJlcik7CisJeHgzMihsdl9taXJyb3JfY29waWVzKTsKKwl4eDMyKGx2X3JlY292ZXJ5KTsKKwl4eDMyKGx2X3NjaGVkdWxlKTsKKwl4eDMyKGx2X3NpemUpOworCXh4MzIobHZfc25hcHNob3RfbWlub3IpOworCXh4MTYobHZfY2h1bmtfc2l6ZSk7CisJeHgxNihkdW1teSk7CisJeHgzMihsdl9hbGxvY2F0ZWRfbGUpOworCXh4MzIobHZfc3RyaXBlcyk7CisJeHgzMihsdl9zdHJpcGVzaXplKTsKKwl4eDMyKGx2X2JhZGJsb2NrKTsKKwl4eDMyKGx2X2FsbG9jYXRpb24pOworCXh4MzIobHZfaW9fdGltZW91dCk7CisJeHgzMihsdl9yZWFkX2FoZWFkKTsKK30KKworc3RhdGljIHZvaWQgX3hsYXRlX3ZnZChzdHJ1Y3QgdmdfZGlzayAqZGlzaykKK3sKKwl4eDMyKHZnX251bWJlcik7CisJeHgzMih2Z19hY2Nlc3MpOworCXh4MzIodmdfc3RhdHVzKTsKKwl4eDMyKGx2X21heCk7CisJeHgzMihsdl9jdXIpOworCXh4MzIobHZfb3Blbik7CisJeHgzMihwdl9tYXgpOworCXh4MzIocHZfY3VyKTsKKwl4eDMyKHB2X2FjdCk7CisJeHgzMihkdW1teSk7CisJeHgzMih2Z2RhKTsKKwl4eDMyKHBlX3NpemUpOworCXh4MzIocGVfdG90YWwpOworCXh4MzIocGVfYWxsb2NhdGVkKTsKKwl4eDMyKHB2Z190b3RhbCk7Cit9CisKK3N0YXRpYyB2b2lkIF94bGF0ZV9leHRlbnRzKHN0cnVjdCBwZV9kaXNrICpleHRlbnRzLCB1aW50MzJfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXh0ZW50c1tpXS5sdl9udW0gPSB4bGF0ZTE2KGV4dGVudHNbaV0ubHZfbnVtKTsKKwkJZXh0ZW50c1tpXS5sZV9udW0gPSB4bGF0ZTE2KGV4dGVudHNbaV0ubGVfbnVtKTsKKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgYm90aCBtaW5vciBtZXRhZGF0YSBmb3JtYXRzLgorICovCitzdGF0aWMgaW50IF9tdW5nZV9mb3JtYXRzKHN0cnVjdCBwdl9kaXNrICpwdmQpCit7CisJdWludDMyX3QgcGVfc3RhcnQ7CisJdW5zaWduZWQgYiwgZTsKKworCXN3aXRjaCAocHZkLT52ZXJzaW9uKSB7CisJY2FzZSAxOgorCQlwdmQtPnBlX3N0YXJ0ID0gKChwdmQtPnBlX29uX2Rpc2suYmFzZSArCisJCQkJICBwdmQtPnBlX29uX2Rpc2suc2l6ZSkgPj4gU0VDVE9SX1NISUZUKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXB2ZC0+dmVyc2lvbiA9IDE7CisJCXBlX3N0YXJ0ID0gcHZkLT5wZV9zdGFydCA8PCBTRUNUT1JfU0hJRlQ7CisJCXB2ZC0+cGVfb25fZGlzay5zaXplID0gcGVfc3RhcnQgLSBwdmQtPnBlX29uX2Rpc2suYmFzZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVVUlEIHRvbyBsb25nPyAqLworCWlmIChwdmQtPnB2X3V1aWRbSURfTEVOXSkgeworCQkvKiBSZXRhaW4gSURfTEVOIGNoYXJzIGZyb20gZW5kICovCisJCWZvciAoZSA9IElEX0xFTjsgZSA8IHNpemVvZihwdmQtPnB2X3V1aWQpOyBlKyspIHsKKwkJCWlmICghcHZkLT5wdl91dWlkW2VdKSB7CisJCQkJZS0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZvciAoYiA9IDA7IGIgPCBJRF9MRU47IGIrKykgeworCQkJcHZkLT5wdl91dWlkW2JdID0gcHZkLT5wdl91dWlkWysrZSAtIElEX0xFTl07CisJCQkvKiBGSVhNRSBSZW1vdmUgYWxsIGludmFsaWQgY2hhcnMgKi8KKwkJCWlmIChwdmQtPnB2X3V1aWRbYl0gPT0gJy8nKQorCQkJCXB2ZC0+cHZfdXVpZFtiXSA9ICcjJzsKKwkJfQorCQltZW1zZXQoJnB2ZC0+cHZfdXVpZFtJRF9MRU5dLCAwLCBzaXplb2YocHZkLT5wdl91dWlkKSAtIElEX0xFTik7CisJfQorCisJLyogSWYgVVVJRCBpcyBtaXNzaW5nLCBjcmVhdGUgb25lICovCisJaWYgKHB2ZC0+cHZfdXVpZFswXSA9PSAnXDAnKSB7CisJCXV1aWRfZnJvbV9udW0oKGNoYXIgKilwdmQtPnB2X3V1aWQsIHB2ZC0+cHZfbnVtYmVyKTsKKwkJcHZkLT5wdl91dWlkW0lEX0xFTl0gPSAnXDAnOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogSWYgZXhwb3J0ZWQsIHJlbW92ZSAiUFZfRVhQIiBmcm9tIGVuZCBvZiBWRyBuYW1lCisgKi8KK3N0YXRpYyB2b2lkIF9tdW5nZV9leHBvcnRlZF92ZyhzdHJ1Y3QgcHZfZGlzayAqcHZkKQoreworCWludCBsOworCXNpemVfdCBzOworCisJLyogUmV0dXJuIGlmIFBWIG5vdCBpbiBhIFZHICovCisJaWYgKCghKnB2ZC0+dmdfbmFtZSkpCisJCXJldHVybjsKKwkvKiBGSVhNRSBhbHNvIGNoZWNrIHZnZC0+c3RhdHVzICYgVkdfRVhQT1JURUQ/ICovCisKKwlsID0gc3RybGVuKChjaGFyICopcHZkLT52Z19uYW1lKTsKKwlzID0gc2l6ZW9mKEVYUE9SVEVEX1RBRyk7CisJaWYgKCFzdHJuY21wKChjaGFyICopcHZkLT52Z19uYW1lICsgbCAtIHMgKyAxLCBFWFBPUlRFRF9UQUcsIHMpKSB7CisJCXB2ZC0+dmdfbmFtZVtsIC0gcyArIDFdID0gJ1wwJzsKKwkJcHZkLT5wdl9zdGF0dXMgfD0gVkdfRVhQT1JURUQ7CisJfQorfQorCitpbnQgbXVuZ2VfcHZkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHB2X2Rpc2sgKnB2ZCkKK3sKKwlfeGxhdGVfcHZkKHB2ZCk7CisKKwlpZiAocHZkLT5pZFswXSAhPSAnSCcgfHwgcHZkLT5pZFsxXSAhPSAnTScpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiJXMgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIExWTTEgUFYgaWRlbnRpZmllciIsCisJCQkJIGRldl9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9tdW5nZV9mb3JtYXRzKHB2ZCkpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiZm9ybWF0MTogVW5rbm93biBtZXRhZGF0YSB2ZXJzaW9uICVkICIKKwkJCQkgImZvdW5kIG9uICVzIiwgcHZkLT52ZXJzaW9uLCBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgVkcgaXMgZXhwb3J0ZWQsIHNldCBWRyBuYW1lIGJhY2sgdG8gdGhlIHJlYWwgbmFtZSAqLworCV9tdW5nZV9leHBvcnRlZF92ZyhwdmQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfcHZkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHB2X2Rpc2sgKnB2ZCkKK3sKKwlpZiAoIWRldl9yZWFkKGRldiwgVUlOVDY0X0MoMCksIHNpemVvZigqcHZkKSwgcHZkKSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJGYWlsZWQgdG8gcmVhZCBQViBkYXRhIGZyb20gJXMiLAorCQkJCSBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIG11bmdlX3B2ZChkZXYsIHB2ZCk7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfbHZkKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgcG9zLCBzdHJ1Y3QgbHZfZGlzayAqZGlzaykKK3sKKwlpZiAoIWRldl9yZWFkKGRldiwgcG9zLCBzaXplb2YoKmRpc2spLCBkaXNrKSkKKwkJcmV0dXJuXzA7CisKKwlfeGxhdGVfbHZkKGRpc2spOworCisJcmV0dXJuIDE7Cit9CisKK2ludCByZWFkX3ZnZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2Z19kaXNrICp2Z2QsIHN0cnVjdCBwdl9kaXNrICpwdmQpCit7CisJdWludDY0X3QgcG9zID0gcHZkLT52Z19vbl9kaXNrLmJhc2U7CisKKwlpZiAoIWRldl9yZWFkKGRldiwgcG9zLCBzaXplb2YoKnZnZCksIHZnZCkpCisJCXJldHVybl8wOworCisJX3hsYXRlX3ZnZCh2Z2QpOworCisJaWYgKCh2Z2QtPmx2X21heCA+IE1BWF9MVikgfHwgKHZnZC0+cHZfbWF4ID4gTUFYX1BWKSkKKwkJcmV0dXJuXzA7CisJCQorCS8qIElmIFVVSUQgaXMgbWlzc2luZywgY3JlYXRlIG9uZSAqLworCWlmICh2Z2QtPnZnX3V1aWRbMF0gPT0gJ1wwJykKKwkJdXVpZF9mcm9tX251bSgoY2hhciAqKXZnZC0+dmdfdXVpZCwgdmdkLT52Z19udW1iZXIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfdXVpZHMoc3RydWN0IGRpc2tfbGlzdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBudW1fcmVhZCA9IDA7CisJc3RydWN0IHV1aWRfbGlzdCAqdWw7CisJY2hhciBidWZmZXJbTkFNRV9MRU5dIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwl1aW50NjRfdCBwb3MgPSBkYXRhLT5wdmQucHZfdXVpZGxpc3Rfb25fZGlzay5iYXNlOworCXVpbnQ2NF90IGVuZCA9IHBvcyArIGRhdGEtPnB2ZC5wdl91dWlkbGlzdF9vbl9kaXNrLnNpemU7CisKKwl3aGlsZSAocG9zIDwgZW5kICYmIG51bV9yZWFkIDwgZGF0YS0+dmdkLnB2X2N1cikgeworCQlpZiAoIWRldl9yZWFkKGRhdGEtPmRldiwgcG9zLCBzaXplb2YoYnVmZmVyKSwgYnVmZmVyKSkKKwkJCXJldHVybl8wOworCisJCWlmICghKHVsID0gZG1fcG9vbF9hbGxvYyhkYXRhLT5tZW0sIHNpemVvZigqdWwpKSkpCisJCQlyZXR1cm5fMDsKKworCQltZW1jcHkodWwtPnV1aWQsIGJ1ZmZlciwgTkFNRV9MRU4pOworCQl1bC0+dXVpZFtOQU1FX0xFTiAtIDFdID0gJ1wwJzsKKworCQlkbV9saXN0X2FkZCgmZGF0YS0+dXVpZHMsICZ1bC0+bGlzdCk7CisKKwkJcG9zICs9IE5BTUVfTEVOOworCQludW1fcmVhZCsrOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja19sdmQoc3RydWN0IGx2X2Rpc2sgKmx2ZCkKK3sKKwlyZXR1cm4gIShsdmQtPmx2X25hbWVbMF0gPT0gJ1wwJyk7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfbHZzKHN0cnVjdCBkaXNrX2xpc3QgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGksIGx2c19yZWFkID0gMDsKKwl1aW50NjRfdCBwb3M7CisJc3RydWN0IGx2ZF9saXN0ICpsbDsKKwlzdHJ1Y3QgdmdfZGlzayAqdmdkID0gJmRhdGEtPnZnZDsKKworCWZvciAoaSA9IDA7IChpIDwgdmdkLT5sdl9tYXgpICYmIChsdnNfcmVhZCA8IHZnZC0+bHZfY3VyKTsgaSsrKSB7CisJCXBvcyA9IGRhdGEtPnB2ZC5sdl9vbl9kaXNrLmJhc2UgKyAoaSAqIHNpemVvZihzdHJ1Y3QgbHZfZGlzaykpOworCQlsbCA9IGRtX3Bvb2xfYWxsb2MoZGF0YS0+bWVtLCBzaXplb2YoKmxsKSk7CisKKwkJaWYgKCFsbCkKKwkJCXJldHVybl8wOworCisJCWlmICghX3JlYWRfbHZkKGRhdGEtPmRldiwgcG9zLCAmbGwtPmx2ZCkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIV9jaGVja19sdmQoJmxsLT5sdmQpKQorCQkJY29udGludWU7CisKKwkJbHZzX3JlYWQrKzsKKwkJZG1fbGlzdF9hZGQoJmRhdGEtPmx2ZHMsICZsbC0+bGlzdCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfZXh0ZW50cyhzdHJ1Y3QgZGlza19saXN0ICpkYXRhKQoreworCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IHBlX2Rpc2spICogZGF0YS0+cHZkLnBlX3RvdGFsOworCXN0cnVjdCBwZV9kaXNrICpleHRlbnRzID0gZG1fcG9vbF9hbGxvYyhkYXRhLT5tZW0sIGxlbik7CisJdWludDY0X3QgcG9zID0gZGF0YS0+cHZkLnBlX29uX2Rpc2suYmFzZTsKKworCWlmICghZXh0ZW50cykKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRldl9yZWFkKGRhdGEtPmRldiwgcG9zLCBsZW4sIGV4dGVudHMpKQorCQlyZXR1cm5fMDsKKworCV94bGF0ZV9leHRlbnRzKGV4dGVudHMsIGRhdGEtPnB2ZC5wZV90b3RhbCk7CisJZGF0YS0+ZXh0ZW50cyA9IGV4dGVudHM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX191cGRhdGVfbHZtY2FjaGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkgICAgICBzdHJ1Y3QgZGlza19saXN0ICpkbCwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdmdpZCwKKwkJCSAgICAgIHVuc2lnbmVkIGV4cG9ydGVkKQoreworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKnZnbmFtZSA9ICooKGNoYXIgKilkbC0+cHZkLnZnX25hbWUpID8KKwkJCSAgICAgKGNoYXIgKilkbC0+cHZkLnZnX25hbWUgOiBmbXQtPm9ycGhhbl92Z19uYW1lOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2FkZChmbXQtPmxhYmVsbGVyLCAoY2hhciAqKWRsLT5wdmQucHZfdXVpZCwgZGV2LAorCQkJCSAgdmduYW1lLCB2Z2lkLCBleHBvcnRlZCA/IEVYUE9SVEVEX1ZHIDogMCkpKSB7CisJCXN0YWNrOworCQlyZXR1cm47CisJfQorCisJbHZtY2FjaGVfc2V0X2RldmljZV9zaXplKGluZm8sICgodWludDY0X3QpeGxhdGUzMihkbC0+cHZkLnB2X3NpemUpKSA8PCBTRUNUT1JfU0hJRlQpOworCWx2bWNhY2hlX2RlbF9tZGFzKGluZm8pOworCWx2bWNhY2hlX21ha2VfdmFsaWQoaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlza19saXN0ICpfX3JlYWRfZGlzayhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RydWN0IGRpc2tfbGlzdCAqZGwgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqZGwpKTsKKwljb25zdCBjaGFyICpuYW1lID0gZGV2X25hbWUoZGV2KTsKKworCWlmICghZGwpCisJCXJldHVybl9OVUxMOworCisJZGwtPmRldiA9IGRldjsKKwlkbC0+bWVtID0gbWVtOworCWRtX2xpc3RfaW5pdCgmZGwtPnV1aWRzKTsKKwlkbV9saXN0X2luaXQoJmRsLT5sdmRzKTsKKworCWlmICghX3JlYWRfcHZkKGRldiwgJmRsLT5wdmQpKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogaXMgaXQgYW4gb3JwaGFuID8KKwkgKi8KKwlpZiAoISpkbC0+cHZkLnZnX25hbWUpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiJXMgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBmb3JtYXQxIFZHIiwgbmFtZSk7CisKKwkJX191cGRhdGVfbHZtY2FjaGUoZm10LCBkbCwgZGV2LCBmbXQtPm9ycGhhbl92Z19uYW1lLCAwKTsKKwkJcmV0dXJuICh2Z19uYW1lKSA/IE5VTEwgOiBkbDsKKwl9CisKKwlpZiAoIXJlYWRfdmdkKGRsLT5kZXYsICZkbC0+dmdkLCAmZGwtPnB2ZCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVhZCBWRyBkYXRhIGZyb20gUFYgKCVzKSIsIG5hbWUpOworCQlfX3VwZGF0ZV9sdm1jYWNoZShmbXQsIGRsLCBkZXYsIGZtdC0+b3JwaGFuX3ZnX25hbWUsIDApOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAodmdfbmFtZSAmJiBzdHJjbXAodmdfbmFtZSwgKGNoYXIgKilkbC0+cHZkLnZnX25hbWUpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgVkcgJXMiLAorCQkJCSBuYW1lLCB2Z19uYW1lKTsKKwkJX191cGRhdGVfbHZtY2FjaGUoZm10LCBkbCwgZGV2LCBmbXQtPm9ycGhhbl92Z19uYW1lLCAwKTsKKwkJZ290byBiYWQ7CisJfQorCisJX191cGRhdGVfbHZtY2FjaGUoZm10LCBkbCwgZGV2LCAoY2hhciAqKWRsLT52Z2QudmdfdXVpZCwKKwkJCSAgZGwtPnZnZC52Z19zdGF0dXMgJiBWR19FWFBPUlRFRCk7CisKKwlpZiAoIV9yZWFkX3V1aWRzKGRsKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWFkIFBWIHV1aWQgbGlzdCBmcm9tICVzIiwgbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghX3JlYWRfbHZzKGRsKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWFkIExWJ3MgZnJvbSAlcyIsIG5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIV9yZWFkX2V4dGVudHMoZGwpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlYWQgZXh0ZW50cyBmcm9tICVzIiwgbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkZvdW5kICVzIGluICVzVkcgJXMiLCBuYW1lLAorCQkJIChkbC0+dmdkLnZnX3N0YXR1cyAmIFZHX0VYUE9SVEVEKSA/ICJleHBvcnRlZCAiIDogIiIsCisJCQkgZGwtPnB2ZC52Z19uYW1lKTsKKworCXJldHVybiBkbDsKKworICAgICAgYmFkOgorCWRtX3Bvb2xfZnJlZShkbC0+bWVtLCBkbCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBkaXNrX2xpc3QgKnJlYWRfZGlzayhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisKKwlpZiAoIWRldl9vcGVuX3JlYWRvbmx5KGRldikpCisJCXJldHVybl9OVUxMOworCisJZGwgPSBfX3JlYWRfZGlzayhmbXQsIGRldiwgbWVtLCB2Z19uYW1lKTsKKworCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJcmV0dXJuIGRsOworfQorCitzdGF0aWMgdm9pZCBfYWRkX3B2X3RvX2xpc3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpoZWFkLCBzdHJ1Y3QgZGlza19saXN0ICpkYXRhKQoreworCXN0cnVjdCBwdl9kaXNrICpwdmQ7CisJc3RydWN0IGRpc2tfbGlzdCAqZGlza2w7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGlza2wsIGhlYWQpIHsKKwkJcHZkID0gJmRpc2tsLT5wdmQ7CisJCWlmICghc3RybmNtcCgoY2hhciAqKWRhdGEtPnB2ZC5wdl91dWlkLCAoY2hhciAqKXB2ZC0+cHZfdXVpZCwKKwkJCSAgICAgc2l6ZW9mKHB2ZC0+cHZfdXVpZCkpKSB7CisJCQlpZiAoIWRldl9zdWJzeXN0ZW1fcGFydF9tYWpvcihjbWQtPmRldl90eXBlcywgZGF0YS0+ZGV2KSkgeworCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIklnbm9yaW5nIGR1cGxpY2F0ZSBQViAlcyBvbiAiCisJCQkJCQkgIiVzIiwgcHZkLT5wdl91dWlkLAorCQkJCQkJIGRldl9uYW1lKGRhdGEtPmRldikpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIkR1cGxpY2F0ZSBQViAlcyAtIHVzaW5nICVzICVzIiwKKwkJCQkJIHB2ZC0+cHZfdXVpZCwgZGV2X3N1YnN5c3RlbV9uYW1lKGNtZC0+ZGV2X3R5cGVzLCBkYXRhLT5kZXYpLAorCQkJCQkgZGV2X25hbWUoZGF0YS0+ZGV2KSk7CisJCQlkbV9saXN0X2RlbCgmZGlza2wtPmxpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZG1fbGlzdF9hZGQoaGVhZCwgJmRhdGEtPmxpc3QpOworfQorCitzdHJ1Y3QgX3JlYWRfcHZzX2luX3ZnX2JhdG9uIHsKKwljb25zdCBjaGFyICp2Z19uYW1lOworCXN0cnVjdCBkbV9saXN0ICpoZWFkOworCXN0cnVjdCBkaXNrX2xpc3QgKmRhdGE7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlpbnQgZW1wdHk7Cit9OworCitzdGF0aWMgaW50IF9yZWFkX3B2X2luX3ZnKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX3JlYWRfcHZzX2luX3ZnX2JhdG9uICpiID0gYmF0b247CisKKwliLT5lbXB0eSA9IDA7CisKKwlpZiAoIWx2bWNhY2hlX2RldmljZShpbmZvKSB8fAorCSAgICAhKGItPmRhdGEgPSByZWFkX2Rpc2sobHZtY2FjaGVfZm10KGluZm8pLCBsdm1jYWNoZV9kZXZpY2UoaW5mbyksIGItPm1lbSwgYi0+dmdfbmFtZSkpKQorCQlyZXR1cm4gMDsgLyogc3RvcCBoZXJlICovCisKKwlfYWRkX3B2X3RvX2xpc3QobHZtY2FjaGVfZm10KGluZm8pLT5jbWQsIGItPmhlYWQsIGItPmRhdGEpOworCXJldHVybiAxOworfQorCisvKgorICogQnVpbGQgYSBsaXN0IG9mIHB2X2QncyBzdHJ1Y3R1cmVzLCBhbGxvY2F0ZWQgZnJvbSBtZW0uCisgKiBXZSBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCBvYmplY3QgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wKKyAqIHNvIHdlIGNhbiBmcmVlIG9mZiBhbGwgdGhlIG1lbW9yeSBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworaW50IHJlYWRfcHZzX2luX3ZnKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICBzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkgICBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKwlzdHJ1Y3QgX3JlYWRfcHZzX2luX3ZnX2JhdG9uIGJhdG9uOworCisJYmF0b24uaGVhZCA9IGhlYWQ7CisJYmF0b24uZW1wdHkgPSAxOworCWJhdG9uLmRhdGEgPSBOVUxMOworCWJhdG9uLm1lbSA9IG1lbTsKKwliYXRvbi52Z19uYW1lID0gdmdfbmFtZTsKKworCS8qIEZhc3QgcGF0aCBpZiB3ZSBhbHJlYWR5IHNhdyB0aGlzIFZHIGFuZCBjYWNoZWQgdGhlIGxpc3Qgb2YgUFZzICovCisJaWYgKHZnX25hbWUgJiYgKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z19uYW1lLCBOVUxMKSkpIHsKKworCQlsdm1jYWNoZV9mb3JlYWNoX3B2KHZnaW5mbywgX3JlYWRfcHZfaW5fdmcsICZiYXRvbik7CisKKwkJaWYgKCFiYXRvbi5lbXB0eSkgeworCQkJLyogRGlkIHdlIGZpbmQgdGhlIHdob2xlIFZHPyAqLworCQkJaWYgKCF2Z19uYW1lIHx8IGlzX29ycGhhbl92Zyh2Z19uYW1lKSB8fAorCQkJICAgIChiYXRvbi5kYXRhICYmICpiYXRvbi5kYXRhLT5wdmQudmdfbmFtZSAmJgorCQkJICAgICBkbV9saXN0X3NpemUoaGVhZCkgPT0gYmF0b24uZGF0YS0+dmdkLnB2X2N1cikpCisJCQkJcmV0dXJuIDE7CisKKwkJCS8qIEZhaWxlZCAqLworCQkJZG1fbGlzdF9pbml0KGhlYWQpOworCQkJLyogdmdjYWNoZV9kZWwodmdfbmFtZSk7ICovCisJCX0KKwl9CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKGZpbHRlciwgMSkpKSB7CisJCWxvZ19lcnJvcigicmVhZF9wdnNfaW5fdmc6IGRldl9pdGVyX2NyZWF0ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT3RoZXJ3aXNlIGRvIGEgY29tcGxldGUgc2NhbiAqLworCWZvciAoZGV2ID0gZGV2X2l0ZXJfZ2V0KGl0ZXIpOyBkZXY7IGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkgeworCQlpZiAoKGJhdG9uLmRhdGEgPSByZWFkX2Rpc2soZm10LCBkZXYsIG1lbSwgdmdfbmFtZSkpKSB7CisJCQlfYWRkX3B2X3RvX2xpc3QoZm10LT5jbWQsIGhlYWQsIGJhdG9uLmRhdGEpOworCQl9CisJfQorCWRldl9pdGVyX2Rlc3Ryb3koaXRlcik7CisKKwlpZiAoZG1fbGlzdF9lbXB0eShoZWFkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd3JpdGVfdmdkKHN0cnVjdCBkaXNrX2xpc3QgKmRhdGEpCit7CisJc3RydWN0IHZnX2Rpc2sgKnZnZCA9ICZkYXRhLT52Z2Q7CisJdWludDY0X3QgcG9zID0gZGF0YS0+cHZkLnZnX29uX2Rpc2suYmFzZTsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiV3JpdGluZyAlcyBWRyBtZXRhZGF0YSB0byAlcyBhdCAlIiBQUkl1NjQgIiBsZW4gJSIgUFJJc2l6ZV90LAorCQkJICAgZGF0YS0+cHZkLnZnX25hbWUsIGRldl9uYW1lKGRhdGEtPmRldiksIHBvcywgc2l6ZW9mKCp2Z2QpKTsKKworCV94bGF0ZV92Z2QodmdkKTsKKwlpZiAoIWRldl93cml0ZShkYXRhLT5kZXYsIHBvcywgc2l6ZW9mKCp2Z2QpLCB2Z2QpKQorCQlyZXR1cm5fMDsKKworCV94bGF0ZV92Z2QodmdkKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93cml0ZV91dWlkcyhzdHJ1Y3QgZGlza19saXN0ICpkYXRhKQoreworCXN0cnVjdCB1dWlkX2xpc3QgKnVsOworCXVpbnQ2NF90IHBvcyA9IGRhdGEtPnB2ZC5wdl91dWlkbGlzdF9vbl9kaXNrLmJhc2U7CisJdWludDY0X3QgZW5kID0gcG9zICsgZGF0YS0+cHZkLnB2X3V1aWRsaXN0X29uX2Rpc2suc2l6ZTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh1bCwgJmRhdGEtPnV1aWRzKSB7CisJCWlmIChwb3MgPj0gZW5kKSB7CisJCQlsb2dfZXJyb3IoIlRvbyBtYW55IHV1aWRzIHRvIGZpdCBvbiAlcyIsCisJCQkJICBkZXZfbmFtZShkYXRhLT5kZXYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJXcml0aW5nICVzIHV1aWRsaXN0IHRvICVzIGF0ICUiIFBSSXU2NCAiIGxlbiAlZCIsCisJCQkJICAgZGF0YS0+cHZkLnZnX25hbWUsIGRldl9uYW1lKGRhdGEtPmRldiksCisJCQkJICAgcG9zLCBOQU1FX0xFTik7CisKKwkJaWYgKCFkZXZfd3JpdGUoZGF0YS0+ZGV2LCBwb3MsIE5BTUVfTEVOLCB1bC0+dXVpZCkpCisJCQlyZXR1cm5fMDsKKworCQlwb3MgKz0gTkFNRV9MRU47CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3dyaXRlX2x2ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90IHBvcywgc3RydWN0IGx2X2Rpc2sgKmRpc2spCit7CisJbG9nX2RlYnVnX21ldGFkYXRhKCJXcml0aW5nICVzIExWICVzIG1ldGFkYXRhIHRvICVzIGF0ICUiIFBSSXU2NCAiIGxlbiAlIgorCQkJICAgUFJJc2l6ZV90LCBkaXNrLT52Z19uYW1lLCBkaXNrLT5sdl9uYW1lLCBkZXZfbmFtZShkZXYpLAorCQkJICAgcG9zLCBzaXplb2YoKmRpc2spKTsKKworCV94bGF0ZV9sdmQoZGlzayk7CisJaWYgKCFkZXZfd3JpdGUoZGV2LCBwb3MsIHNpemVvZigqZGlzayksIGRpc2spKQorCQlyZXR1cm5fMDsKKworCV94bGF0ZV9sdmQoZGlzayk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd3JpdGVfbHZzKHN0cnVjdCBkaXNrX2xpc3QgKmRhdGEpCit7CisJc3RydWN0IGx2ZF9saXN0ICpsbDsKKwl1aW50NjRfdCBwb3MsIG9mZnNldDsKKworCXBvcyA9IGRhdGEtPnB2ZC5sdl9vbl9kaXNrLmJhc2U7CisKKwlpZiAoIWRldl9zZXQoZGF0YS0+ZGV2LCBwb3MsIGRhdGEtPnB2ZC5sdl9vbl9kaXNrLnNpemUsIDApKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgemVybyBsdiBhcmVhIG9uIGRldmljZSAnJXMnIiwKKwkJCSAgZGV2X25hbWUoZGF0YS0+ZGV2KSk7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsbCwgJmRhdGEtPmx2ZHMpIHsKKwkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBsdl9kaXNrKSAqIGxsLT5sdmQubHZfbnVtYmVyOworCQlpZiAob2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBsdl9kaXNrKSA+IGRhdGEtPnB2ZC5sdl9vbl9kaXNrLnNpemUpIHsKKwkJCWxvZ19lcnJvcigibHZfbnVtYmVyICVkIHRvbyBsYXJnZSIsIGxsLT5sdmQubHZfbnVtYmVyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFfd3JpdGVfbHZkKGRhdGEtPmRldiwgcG9zICsgb2Zmc2V0LCAmbGwtPmx2ZCkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd3JpdGVfZXh0ZW50cyhzdHJ1Y3QgZGlza19saXN0ICpkYXRhKQoreworCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IHBlX2Rpc2spICogZGF0YS0+cHZkLnBlX3RvdGFsOworCXN0cnVjdCBwZV9kaXNrICpleHRlbnRzID0gZGF0YS0+ZXh0ZW50czsKKwl1aW50NjRfdCBwb3MgPSBkYXRhLT5wdmQucGVfb25fZGlzay5iYXNlOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCJXcml0aW5nICVzIGV4dGVudHMgbWV0YWRhdGEgdG8gJXMgYXQgJSIgUFJJdTY0ICIgbGVuICUiCisJCQkgICBQUklzaXplX3QsIGRhdGEtPnB2ZC52Z19uYW1lLCBkZXZfbmFtZShkYXRhLT5kZXYpLAorCQkJICAgcG9zLCBsZW4pOworCisJX3hsYXRlX2V4dGVudHMoZXh0ZW50cywgZGF0YS0+cHZkLnBlX3RvdGFsKTsKKwlpZiAoIWRldl93cml0ZShkYXRhLT5kZXYsIHBvcywgbGVuLCBleHRlbnRzKSkKKwkJcmV0dXJuXzA7CisKKwlfeGxhdGVfZXh0ZW50cyhleHRlbnRzLCBkYXRhLT5wdmQucGVfdG90YWwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3dyaXRlX3B2ZChzdHJ1Y3QgZGlza19saXN0ICpkYXRhKQoreworCWNoYXIgKmJ1ZjsKKwl1aW50NjRfdCBwb3MgPSBkYXRhLT5wdmQucHZfb25fZGlzay5iYXNlOworCXNpemVfdCBzaXplID0gZGF0YS0+cHZkLnB2X29uX2Rpc2suc2l6ZTsKKworCWlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCBwdl9kaXNrKSkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgUFYgc3RydWN0dXJlIHNpemUuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBnYXAgYmV0d2VlbiB0aGUgUFYgc3RydWN0dXJlIGFuZAorCSAgIHRoZSBuZXh0IG9uZSBpcyB6ZXJvZWQgaW4gb3JkZXIgdG8gbWFrZSBub24gTFZNIHRvb2xzCisJICAgaGFwcHkgKGlkZWEgZnJvbSBBRUQpICovCisJYnVmID0gZG1femFsbG9jKHNpemUpOworCWlmICghYnVmKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgdGVtcG9yYXJ5IFBWIGJ1ZmZlci4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KGJ1ZiwgJmRhdGEtPnB2ZCwgc2l6ZW9mKHN0cnVjdCBwdl9kaXNrKSk7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIldyaXRpbmcgJXMgUFYgbWV0YWRhdGEgdG8gJXMgYXQgJSIgUFJJdTY0ICIgbGVuICUiCisJCQkgICBQUklzaXplX3QsIGRhdGEtPnB2ZC52Z19uYW1lLCBkZXZfbmFtZShkYXRhLT5kZXYpLAorCQkJICAgcG9zLCBzaXplKTsKKworCV94bGF0ZV9wdmQoKHN0cnVjdCBwdl9kaXNrICopIGJ1Zik7CisJaWYgKCFkZXZfd3JpdGUoZGF0YS0+ZGV2LCBwb3MsIHNpemUsIGJ1ZikpIHsKKwkJZG1fZnJlZShidWYpOworCQlyZXR1cm5fMDsKKwl9CisKKwlkbV9mcmVlKGJ1Zik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBhc3N1bWVzIHRoZSBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLgorICovCitzdGF0aWMgaW50IF9fd3JpdGVfYWxsX3B2ZChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBkaXNrX2xpc3QgKmRhdGEsIGludCB3cml0ZV92Z19tZXRhZGF0YSkKK3sKKwljb25zdCBjaGFyICpwdl9uYW1lID0gZGV2X25hbWUoZGF0YS0+ZGV2KTsKKworCWlmICghX3dyaXRlX3B2ZChkYXRhKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBQViBzdHJ1Y3R1cmUgb250byAlcyIsIHB2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB2Z2NhY2hlX2FkZChkYXRhLT5wdmQudmdfbmFtZSwgZGF0YS0+dmdkLnZnX3V1aWQsIGRhdGEtPmRldiwgZm10KTsgKi8KKwkvKgorCSAqIFN0b3AgaGVyZSBmb3Igb3JwaGFuIFBWcyBvciBpZiBWRyBtZXRhZGF0YSB3cml0ZSBub3QgcmVxdWVzdGVkLgorCSAqLworCWlmICgoZGF0YS0+cHZkLnZnX25hbWVbMF0gPT0gJ1wwJykgfHwgIXdyaXRlX3ZnX21ldGFkYXRhKSB7CisJCS8qIGlmICghdGVzdF9tb2RlKCkpCisJCSAgIHZnY2FjaGVfYWRkKGRhdGEtPnB2ZC52Z19uYW1lLCBOVUxMLCBkYXRhLT5kZXYsIGZtdCk7ICovCisJCXJldHVybiAxOworCX0KKworCS8qIGlmICghdGVzdF9tb2RlKCkpCisJICAgdmdjYWNoZV9hZGQoZGF0YS0+cHZkLnZnX25hbWUsIGRhdGEtPnZnZC52Z191dWlkLCBkYXRhLT5kZXYsCisJICAgZm10KTsgKi8KKworCWlmICghX3dyaXRlX3ZnZChkYXRhKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBWRyBkYXRhIHRvICVzIiwgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3dyaXRlX3V1aWRzKGRhdGEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdyaXRlIFBWIHV1aWQgbGlzdCB0byAlcyIsIHB2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV93cml0ZV9sdnMoZGF0YSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgTFYncyB0byAlcyIsIHB2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV93cml0ZV9leHRlbnRzKGRhdGEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdyaXRlIGV4dGVudHMgdG8gJXMiLCBwdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBvcGVucyB0aGUgZGV2aWNlIGFuZCBoYW5kcyB0byB0aGUgYWJvdmUgZm4uCisgKi8KK3N0YXRpYyBpbnQgX3dyaXRlX2FsbF9wdmQoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkaXNrX2xpc3QgKmRhdGEsIGludCB3cml0ZV92Z19tZXRhZGF0YSkKK3sKKwlpbnQgcjsKKworCWlmICghZGF0YS0+ZGV2KQorCQlyZXR1cm5fMDsKKworCWlmICghZGV2X29wZW4oZGF0YS0+ZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlyID0gX193cml0ZV9hbGxfcHZkKGZtdCwgZGF0YSwgd3JpdGVfdmdfbWV0YWRhdGEpOworCisJaWYgKCFkZXZfY2xvc2UoZGF0YS0+ZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFdyaXRlcyBhbGwgdGhlIGdpdmVuIHB2J3MgdG8gZGlzay4gIERvZXMgdmVyeQorICogbGl0dGxlIHNhbml0eSBjaGVja2luZywgc28gbWFrZSBzdXJlIGNvcnJlY3QKKyAqIGRhdGEgaXMgcGFzc2VkIHRvIGhlcmUuCisgKi8KK2ludCB3cml0ZV9kaXNrcyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IGRtX2xpc3QgKnB2cywgaW50IHdyaXRlX3ZnX21ldGFkYXRhKQoreworCXN0cnVjdCBkaXNrX2xpc3QgKmRsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCBwdnMpIHsKKwkJaWYgKCEoX3dyaXRlX2FsbF9wdmQoZm10LCBkbCwgd3JpdGVfdmdfbWV0YWRhdGEpKSkKKwkJCXJldHVybl8wOworCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlN1Y2Nlc3NmdWxseSB3cm90ZSBkYXRhIHRvICVzIiwKKwkJCQkgZGV2X25hbWUoZGwtPmRldikpOworCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdDEvZGlzay1yZXAuaCBiL2xpYi9mb3JtYXQxL2Rpc2stcmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxYWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXQxL2Rpc2stcmVwLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgRElTS19SRVBfRk9STUFUMV9ICisjZGVmaW5lIERJU0tfUkVQX0ZPUk1BVDFfSAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorCisjZGVmaW5lIE1BWF9QViAyNTYKKyNkZWZpbmUgTUFYX0xWIDI1NgorI2RlZmluZSBNQVhfVkcgOTkKKworI2RlZmluZSBMVk1fQkxLX01BSk9SIDU4CisKKyNkZWZpbmUgTUFYX1BWX1NJWkUJKCh1aW50MzJfdCkgLTEpCS8qIDJUQiBpbiBzZWN0b3JzIC0gMSAqLworI2RlZmluZSBQRV9TSVpFX1BWX1NJWkVfUkVMIDUJLyogUFYgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDUgdGltZXMgUEUgc2l6ZSAqLworI2RlZmluZQlNQVhfTEVfVE9UQUwJNjU1MzQJLyogMl4xNiAtIDIgKi8KKyNkZWZpbmUJTUFYX1BFX1RPVEFMCSgodWludDMyX3QpIC0yKQorCisjZGVmaW5lIFVOTUFQUEVEX0VYVEVOVCAwCisKKy8qIHZvbHVtZSBncm91cCAqLworI2RlZmluZQlWR19BQ1RJVkUgICAgICAgICAgICAweDAxCS8qIHZnX3N0YXR1cyAqLworI2RlZmluZQlWR19FWFBPUlRFRCAgICAgICAgICAweDAyCS8qICAgICAiICAgICAqLworI2RlZmluZQlWR19FWFRFTkRBQkxFICAgICAgICAweDA0CS8qICAgICAiICAgICAqLworCisjZGVmaW5lCVZHX1JFQUQgICAgICAgICAgICAgIDB4MDEJLyogdmdfYWNjZXNzICovCisjZGVmaW5lCVZHX1dSSVRFICAgICAgICAgICAgIDB4MDIJLyogICAgICIgICAgICovCisjZGVmaW5lCVZHX0NMVVNURVJFRCAgICAgICAgIDB4MDQJLyogICAgICIgICAgICovCisjZGVmaW5lCVZHX1NIQVJFRCAgICAgICAgICAgIDB4MDgJLyogICAgICIgICAgICovCisKKy8qIGxvZ2ljYWwgdm9sdW1lICovCisjZGVmaW5lCUxWX0FDVElWRSAgICAgICAgICAgIDB4MDEJLyogbHZfc3RhdHVzICovCisjZGVmaW5lCUxWX1NQSU5ET1dOICAgICAgICAgIDB4MDIJLyogICAgICIgICAgICovCisjZGVmaW5lIExWX1BFUlNJU1RFTlRfTUlOT1IgIDB4MDQJLyogICAgICIgICAgICovCisKKyNkZWZpbmUJTFZfUkVBRCAgICAgICAgICAgICAgMHgwMQkvKiBsdl9hY2Nlc3MgKi8KKyNkZWZpbmUJTFZfV1JJVEUgICAgICAgICAgICAgMHgwMgkvKiAgICAgIiAgICAgKi8KKyNkZWZpbmUJTFZfU05BUFNIT1QgICAgICAgICAgMHgwNAkvKiAgICAgIiAgICAgKi8KKyNkZWZpbmUJTFZfU05BUFNIT1RfT1JHICAgICAgMHgwOAkvKiAgICAgIiAgICAgKi8KKworI2RlZmluZQlMVl9CQURCTE9DS19PTiAgICAgICAweDAxCS8qIGx2X2JhZGJsb2NrICovCisKKyNkZWZpbmUJTFZfU1RSSUNUICAgICAgICAgICAgMHgwMQkvKiBsdl9hbGxvY2F0aW9uICovCisjZGVmaW5lCUxWX0NPTlRJR1VPVVMgICAgICAgIDB4MDIJLyogICAgICAgIiAgICAgICAqLworCisvKiBwaHlzaWNhbCB2b2x1bWUgKi8KKyNkZWZpbmUJUFZfQUNUSVZFICAgICAgICAgICAgMHgwMQkvKiBwdl9zdGF0dXMgKi8KKyNkZWZpbmUJUFZfQUxMT0NBVEFCTEUgICAgICAgMHgwMgkvKiBwdl9hbGxvY2F0YWJsZSAqLworCisjZGVmaW5lIEVYUE9SVEVEX1RBRyAiUFZfRVhQIgkvKiBJZGVudGlmaWVyIGZvciBleHBvcnRlZCBQViAqLworI2RlZmluZSBJTVBPUlRFRF9UQUcgIlBWX0lNUCIJLyogSWRlbnRpZmllciBmb3IgaW1wb3J0ZWQgUFYgKi8KKworc3RydWN0IGRhdGFfYXJlYSB7CisJdWludDMyX3QgYmFzZTsKKwl1aW50MzJfdCBzaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBwdl9kaXNrIHsKKwlpbnQ4X3QgaWRbMl07CisJdWludDE2X3QgdmVyc2lvbjsJLyogbHZtIHZlcnNpb24gKi8KKwlzdHJ1Y3QgZGF0YV9hcmVhIHB2X29uX2Rpc2s7CisJc3RydWN0IGRhdGFfYXJlYSB2Z19vbl9kaXNrOworCXN0cnVjdCBkYXRhX2FyZWEgcHZfdXVpZGxpc3Rfb25fZGlzazsKKwlzdHJ1Y3QgZGF0YV9hcmVhIGx2X29uX2Rpc2s7CisJc3RydWN0IGRhdGFfYXJlYSBwZV9vbl9kaXNrOworCWludDhfdCBwdl91dWlkW05BTUVfTEVOXTsKKwlpbnQ4X3QgdmdfbmFtZVtOQU1FX0xFTl07CisJaW50OF90IHN5c3RlbV9pZFtOQU1FX0xFTl07CS8qIGZvciB2Z2V4cG9ydC92Z2ltcG9ydCAqLworCXVpbnQzMl90IHB2X21ham9yOworCXVpbnQzMl90IHB2X251bWJlcjsKKwl1aW50MzJfdCBwdl9zdGF0dXM7CisJdWludDMyX3QgcHZfYWxsb2NhdGFibGU7CisJdWludDMyX3QgcHZfc2l6ZTsKKwl1aW50MzJfdCBsdl9jdXI7CisJdWludDMyX3QgcGVfc2l6ZTsKKwl1aW50MzJfdCBwZV90b3RhbDsKKwl1aW50MzJfdCBwZV9hbGxvY2F0ZWQ7CisKKwkvKiBvbmx5IHByZXNlbnQgb24gdmVyc2lvbiA9PSAyIHB2J3MgKi8KKwl1aW50MzJfdCBwZV9zdGFydDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbHZfZGlzayB7CisJaW50OF90IGx2X25hbWVbTkFNRV9MRU5dOworCWludDhfdCB2Z19uYW1lW05BTUVfTEVOXTsKKwl1aW50MzJfdCBsdl9hY2Nlc3M7CisJdWludDMyX3QgbHZfc3RhdHVzOworCXVpbnQzMl90IGx2X29wZW47CisJdWludDMyX3QgbHZfZGV2OworCXVpbnQzMl90IGx2X251bWJlcjsKKwl1aW50MzJfdCBsdl9taXJyb3JfY29waWVzOwkvKiBmb3IgZnV0dXJlIHVzZSAqLworCXVpbnQzMl90IGx2X3JlY292ZXJ5OwkvKiAgICAgICAiICAgICAgICAqLworCXVpbnQzMl90IGx2X3NjaGVkdWxlOwkvKiAgICAgICAiICAgICAgICAqLworCXVpbnQzMl90IGx2X3NpemU7CisJdWludDMyX3QgbHZfc25hcHNob3RfbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBvcmlnaW5hbCAqLworCXVpbnQxNl90IGx2X2NodW5rX3NpemU7CS8qIGNodW5rIHNpemUgb2Ygc25hcHNob3QgKi8KKwl1aW50MTZfdCBkdW1teTsKKwl1aW50MzJfdCBsdl9hbGxvY2F0ZWRfbGU7CisJdWludDMyX3QgbHZfc3RyaXBlczsKKwl1aW50MzJfdCBsdl9zdHJpcGVzaXplOworCXVpbnQzMl90IGx2X2JhZGJsb2NrOwkvKiBmb3IgZnV0dXJlIHVzZSAqLworCXVpbnQzMl90IGx2X2FsbG9jYXRpb247CisJdWludDMyX3QgbHZfaW9fdGltZW91dDsJLyogZm9yIGZ1dHVyZSB1c2UgKi8KKwl1aW50MzJfdCBsdl9yZWFkX2FoZWFkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2Z19kaXNrIHsKKwlpbnQ4X3QgdmdfdXVpZFtJRF9MRU5dOwkvKiB2b2x1bWUgZ3JvdXAgVVVJRCAqLworCWludDhfdCB2Z19uYW1lX2R1bW15W05BTUVfTEVOIC0gSURfTEVOXTsJLyogcmVzdCBvZiB2MSBWRyBuYW1lICovCisJdWludDMyX3QgdmdfbnVtYmVyOwkvKiB2b2x1bWUgZ3JvdXAgbnVtYmVyICovCisJdWludDMyX3QgdmdfYWNjZXNzOwkvKiByZWFkL3dyaXRlICovCisJdWludDMyX3Qgdmdfc3RhdHVzOwkvKiBhY3RpdmUgb3Igbm90ICovCisJdWludDMyX3QgbHZfbWF4OwkvKiBtYXhpbXVtIGxvZ2ljYWwgdm9sdW1lcyAqLworCXVpbnQzMl90IGx2X2N1cjsJLyogY3VycmVudCBsb2dpY2FsIHZvbHVtZXMgKi8KKwl1aW50MzJfdCBsdl9vcGVuOwkvKiBvcGVuIGxvZ2ljYWwgdm9sdW1lcyAqLworCXVpbnQzMl90IHB2X21heDsJLyogbWF4aW11bSBwaHlzaWNhbCB2b2x1bWVzICovCisJdWludDMyX3QgcHZfY3VyOwkvKiBjdXJyZW50IHBoeXNpY2FsIHZvbHVtZXMgRlUgKi8KKwl1aW50MzJfdCBwdl9hY3Q7CS8qIGFjdGl2ZSBwaHlzaWNhbCB2b2x1bWVzICovCisJdWludDMyX3QgZHVtbXk7CisJdWludDMyX3QgdmdkYTsJCS8qIHZvbHVtZSBncm91cCBkZXNjcmlwdG9yIGFycmF5cyBGVSAqLworCXVpbnQzMl90IHBlX3NpemU7CS8qIHBoeXNpY2FsIGV4dGVudCBzaXplIGluIHNlY3RvcnMgKi8KKwl1aW50MzJfdCBwZV90b3RhbDsJLyogdG90YWwgb2YgcGh5c2ljYWwgZXh0ZW50cyAqLworCXVpbnQzMl90IHBlX2FsbG9jYXRlZDsJLyogYWxsb2NhdGVkIHBoeXNpY2FsIGV4dGVudHMgKi8KKwl1aW50MzJfdCBwdmdfdG90YWw7CS8qIHBoeXNpY2FsIHZvbHVtZSBncm91cHMgRlUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcGVfZGlzayB7CisJdWludDE2X3QgbHZfbnVtOworCXVpbnQxNl90IGxlX251bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdXVpZF9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNoYXIgdXVpZFtOQU1FX0xFTl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworc3RydWN0IGx2ZF9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBsdl9kaXNrIGx2ZDsKK307CisKK3N0cnVjdCBkaXNrX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlzdHJ1Y3QgcHZfZGlzayBwdmQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCB2Z19kaXNrIHZnZCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IGRtX2xpc3QgdXVpZHMgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBkbV9saXN0IGx2ZHMgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBwZV9kaXNrICpleHRlbnRzIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKy8qCisgKiBMYXlvdXQgY29uc3RhbnRzLgorICovCisjZGVmaW5lIE1FVEFEQVRBX0FMSUdOIDQwOTZVTAorI2RlZmluZSBMVk0xX1BFX0FMSUdOICg2NTUzNlVMID4+IFNFQ1RPUl9TSElGVCkgICAgICAvKiBQRSBhbGlnbm1lbnQgKi8KKworI2RlZmluZQlNRVRBREFUQV9CQVNFIDBVTAorI2RlZmluZQlQVl9TSVpFIDEwMjRVTAorI2RlZmluZQlWR19TSVpFIDQwOTZVTAorCisvKgorICogRnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBsYXlvdXQgaW5mby4KKyAqLworaW50IGNhbGN1bGF0ZV9sYXlvdXQoc3RydWN0IGRpc2tfbGlzdCAqZGwpOworaW50IGNhbGN1bGF0ZV9leHRlbnRfY291bnQoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHVpbnQzMl90IGV4dGVudF9zaXplLAorCQkJICAgdWludDMyX3QgbWF4X2V4dGVudF9jb3VudCwgdWludDY0X3QgcGVfc3RhcnQpOworCisvKgorICogTG93IGxldmVsIGlvIHJvdXRpbmVzIHdoaWNoIHJlYWQvd3JpdGUKKyAqIGRpc2tfbGlzdHMuCisgKi8KKworc3RydWN0IGRpc2tfbGlzdCAqcmVhZF9kaXNrKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqdmdfbmFtZSk7CisKK2ludCByZWFkX3B2c19pbl92Zyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgc3RydWN0IGRldl9maWx0ZXIgKmZpbHRlciwKKwkJICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnJlc3VsdHMpOworCitpbnQgd3JpdGVfZGlza3MoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9saXN0ICpwdmRzLAorCQlpbnQgd3JpdGVfdmdfbWV0YWRhdGEpOworCisvKgorICogRnVuY3Rpb25zIHRvIHRyYW5zbGF0ZSB0byBiZXR3ZWVuIGRpc2sgYW5kIGluCisgKiBjb3JlIHN0cnVjdHVyZXMuCisgKi8KK2ludCBpbXBvcnRfcHYoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9wb29sICptZW0sCisJICAgICAgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IHB2X2Rpc2sgKnB2ZCwKKwkgICAgICBzdHJ1Y3QgdmdfZGlzayAqdmdkKTsKK2ludCBleHBvcnRfcHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9wb29sICptZW0sCisJICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJICAgICAgc3RydWN0IHB2X2Rpc2sgKnB2ZCwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworCitpbnQgaW1wb3J0X3ZnKHN0cnVjdCBkbV9wb29sICptZW0sCisJICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkaXNrX2xpc3QgKmRsKTsKK2ludCBleHBvcnRfdmcoc3RydWN0IHZnX2Rpc2sgKnZnZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCitpbnQgaW1wb3J0X2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBsdl9kaXNrICpsdmQpOworCitpbnQgaW1wb3J0X2V4dGVudHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICBzdHJ1Y3QgZG1fbGlzdCAqcHZkcyk7CitpbnQgZXhwb3J0X2V4dGVudHMoc3RydWN0IGRpc2tfbGlzdCAqZGwsIHVpbnQzMl90IGx2X251bSwKKwkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworCitpbnQgaW1wb3J0X3B2cyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9saXN0ICpwdmRzKTsKKworaW50IGltcG9ydF9sdnMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9saXN0ICpwdmRzKTsKK2ludCBleHBvcnRfbHZzKHN0cnVjdCBkaXNrX2xpc3QgKmRsLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIGNvbnN0IGNoYXIgKmRldl9kaXIpOworCitpbnQgaW1wb3J0X3NuYXBzaG90cyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqcHZkcyk7CisKK2ludCBleHBvcnRfdXVpZHMoc3RydWN0IGRpc2tfbGlzdCAqZGwsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKwordm9pZCBleHBvcnRfbnVtYmVycyhzdHJ1Y3QgZG1fbGlzdCAqcHZkcywgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCit2b2lkIGV4cG9ydF9wdl9hY3Qoc3RydWN0IGRtX2xpc3QgKnB2ZHMpOworaW50IG11bmdlX3B2ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwdl9kaXNrICpwdmQpOworaW50IHJlYWRfdmdkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZnX2Rpc2sgKnZnZCwgc3RydWN0IHB2X2Rpc2sgKnB2ZCk7CisKKy8qIGJsZWNoICovCitpbnQgZ2V0X2ZyZWVfdmdfbnVtYmVyKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IGRldl9maWx0ZXIgKmZpbHRlciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmNhbmRpZGF0ZV92ZywgaW50ICpyZXN1bHQpOworaW50IGV4cG9ydF92Z19udW1iZXIoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3QgZG1fbGlzdCAqcHZkcywKKwkJICAgICBjb25zdCBjaGFyICp2Z19uYW1lLCBzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyKTsKKworaW50IGdlbmVyYXRlX2x2bTFfc3lzdGVtX2lkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjaGFyICpzLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXQxL2Zvcm1hdDEuYyBiL2xpYi9mb3JtYXQxL2Zvcm1hdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU2OWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdDEvZm9ybWF0MS5jCkBAIC0wLDAgKzEsNjMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRpc2stcmVwLmgiCisjaW5jbHVkZSAibGltaXRzLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibHZtMS1sYWJlbC5oIgorI2luY2x1ZGUgImZvcm1hdDEuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKworLyogVkcgY29uc2lzdGVuY3kgY2hlY2tzICovCitzdGF0aWMgaW50IF9jaGVja192Z3Moc3RydWN0IGRtX2xpc3QgKnB2cywgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGRtX2xpc3QgKnB2aCwgKnQ7CisJc3RydWN0IGRpc2tfbGlzdCAqZGwgPSBOVUxMOworCXN0cnVjdCBkaXNrX2xpc3QgKmZpcnN0ID0gTlVMTDsKKworCXVpbnQzMl90IHB2X2NvdW50ID0gMDsKKwl1aW50MzJfdCBleHBvcnRlZCA9IDA7CisJaW50IGZpcnN0X3RpbWUgPSAxOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgZXhwb3J0ZWQgYW5kIHVuZXhwb3J0ZWQgUFZzLCBpZ25vcmUgZXhwb3J0ZWQgb25lcy4KKwkgKiBUaGlzIG1lYW5zIGFuIGFjdGl2ZSBWRyB3b24ndCBiZSBhZmZlY3RlZCBpZiBkaXNrcyBhcmUgaW5zZXJ0ZWQKKwkgKiBiZWFyaW5nIGFuIGV4cG9ydGVkIFZHIHdpdGggdGhlIHNhbWUgbmFtZS4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2cykgeworCQlpZiAoZmlyc3RfdGltZSkgeworCQkJZXhwb3J0ZWQgPSBkbC0+cHZkLnB2X3N0YXR1cyAmIFZHX0VYUE9SVEVEOworCQkJZmlyc3RfdGltZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChleHBvcnRlZCAhPSAoZGwtPnB2ZC5wdl9zdGF0dXMgJiBWR19FWFBPUlRFRCkpIHsKKwkJCS8qIFJlbW92ZSBleHBvcnRlZCBQVnMgKi8KKwkJCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKHB2aCwgdCwgcHZzKSB7CisJCQkJZGwgPSBkbV9saXN0X2l0ZW0ocHZoLCBzdHJ1Y3QgZGlza19saXN0KTsKKwkJCQlpZiAoZGwtPnB2ZC5wdl9zdGF0dXMgJiBWR19FWFBPUlRFRCkKKwkJCQkJZG1fbGlzdF9kZWwocHZoKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogUmVtb3ZlIGFueSBQVnMgd2l0aCBWRyBzdHJ1Y3RzIHRoYXQgZGlmZmVyIGZyb20gdGhlIGZpcnN0ICovCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUocHZoLCB0LCBwdnMpIHsKKwkJZGwgPSBkbV9saXN0X2l0ZW0ocHZoLCBzdHJ1Y3QgZGlza19saXN0KTsKKworCQlpZiAoIWZpcnN0KQorCQkJZmlyc3QgPSBkbDsKKworCQllbHNlIGlmIChtZW1jbXAoJmZpcnN0LT52Z2QsICZkbC0+dmdkLCBzaXplb2YoZmlyc3QtPnZnZCkpKSB7CisJCQlsb2dfZXJyb3IoIlZHIGRhdGEgZGlmZmVycyBiZXR3ZWVuIFBWcyAlcyBhbmQgJXMiLAorCQkJCSAgZGV2X25hbWUoZmlyc3QtPmRldiksIGRldl9uYW1lKGRsLT5kZXYpKTsKKwkJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiVkcgZGF0YSBvbiAlczogJXMgJXMgJSIgUFJJdTMyICIgJSIgUFJJdTMyCisJCQkJCSAgICIgICUiIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiCisJCQkJCSAgIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiIFBSSXUzMgorCQkJCQkgICAiICUiIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiCisJCQkJCSAgIFBSSXUzMiAiICUiIFBSSXUzMiAiICUiIFBSSXUzMiwKKwkJCQkJICAgZGV2X25hbWUoZmlyc3QtPmRldiksIGZpcnN0LT52Z2QudmdfdXVpZCwKKwkJCQkJICAgZmlyc3QtPnZnZC52Z19uYW1lX2R1bW15LAorCQkJCQkgICBmaXJzdC0+dmdkLnZnX251bWJlciwgZmlyc3QtPnZnZC52Z19hY2Nlc3MsCisJCQkJCSAgIGZpcnN0LT52Z2Qudmdfc3RhdHVzLCBmaXJzdC0+dmdkLmx2X21heCwKKwkJCQkJICAgZmlyc3QtPnZnZC5sdl9jdXIsIGZpcnN0LT52Z2QubHZfb3BlbiwKKwkJCQkJICAgZmlyc3QtPnZnZC5wdl9tYXgsIGZpcnN0LT52Z2QucHZfY3VyLAorCQkJCQkgICBmaXJzdC0+dmdkLnB2X2FjdCwgZmlyc3QtPnZnZC5kdW1teSwKKwkJCQkJICAgZmlyc3QtPnZnZC52Z2RhLCBmaXJzdC0+dmdkLnBlX3NpemUsCisJCQkJCSAgIGZpcnN0LT52Z2QucGVfdG90YWwsIGZpcnN0LT52Z2QucGVfYWxsb2NhdGVkLAorCQkJCQkgICBmaXJzdC0+dmdkLnB2Z190b3RhbCk7CisJCQlsb2dfZGVidWdfbWV0YWRhdGEoIlZHIGRhdGEgb24gJXM6ICVzICVzICUiIFBSSXUzMiAiICUiIFBSSXUzMgorCQkJCQkgICAiICAlIiBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIgorCQkJCQkgICBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIKKwkJCQkJICAgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIgorCQkJCQkgICBQUkl1MzIgIiAlIiBQUkl1MzIgIiAlIiBQUkl1MzIsCisJCQkJCSAgIGRldl9uYW1lKGRsLT5kZXYpLCBkbC0+dmdkLnZnX3V1aWQsCisJCQkJCSAgIGRsLT52Z2QudmdfbmFtZV9kdW1teSwgZGwtPnZnZC52Z19udW1iZXIsCisJCQkJCSAgIGRsLT52Z2QudmdfYWNjZXNzLCBkbC0+dmdkLnZnX3N0YXR1cywKKwkJCQkJICAgZGwtPnZnZC5sdl9tYXgsIGRsLT52Z2QubHZfY3VyLAorCQkJCQkgICBkbC0+dmdkLmx2X29wZW4sIGRsLT52Z2QucHZfbWF4LAorCQkJCQkgICBkbC0+dmdkLnB2X2N1ciwgZGwtPnZnZC5wdl9hY3QsIGRsLT52Z2QuZHVtbXksCisJCQkJCSAgIGRsLT52Z2QudmdkYSwgZGwtPnZnZC5wZV9zaXplLAorCQkJCQkgICBkbC0+dmdkLnBlX3RvdGFsLCBkbC0+dmdkLnBlX2FsbG9jYXRlZCwKKwkJCQkJICAgZGwtPnZnZC5wdmdfdG90YWwpOworCQkJZG1fbGlzdF9kZWwocHZoKTsKKwkJCXJldHVybiAwOworCQl9CisJCXB2X2NvdW50Kys7CisJfQorCisJLyogT24gZW50cnkgdG8gZm4sIGxpc3Qga25vd24gdG8gYmUgbm9uLWVtcHR5ICovCisJaWYgKHB2X2NvdW50ICE9IGZpcnN0LT52Z2QucHZfY3VyKSB7CisJCWxvZ19lcnJvcigiJWQgUFYocykgZm91bmQgZm9yIFZHICVzOiBleHBlY3RlZCAlZCIsCisJCQkgIHB2X2NvdW50LCBmaXJzdC0+cHZkLnZnX25hbWUsIGZpcnN0LT52Z2QucHZfY3VyKTsKKwkJdmctPnN0YXR1cyB8PSBQQVJUSUFMX1ZHOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9maXhfcGFydGlhbF92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRtX2xpc3QgKnB2cykKK3sKKwl1aW50MzJfdCBleHRlbnRfY291bnQgPSAwOworCXN0cnVjdCBkaXNrX2xpc3QgKmRsOworCXN0cnVjdCBkbV9saXN0ICpwdmg7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgbHZfbGlzdCAqbGw7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCS8qCisJICogRklYTUU6IGNvZGUgc2hvdWxkIHJlbWFwIG1pc3Npbmcgc2VnbWVudHMgdG8gZXJyb3Igc2VnbWVudC4KKwkgKiBBbHNvIGN1cnJlbnQgbWFwcGluZyBjb2RlIGFsbG9jYXRlcyAxIHNlZ21lbnQgcGVyIG1pc3NpbmcgZXh0ZW50LgorCSAqIEZvciBub3cgYmFpbCBvdXQgY29tcGxldGVseSAtIGFsbG9jYXRlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgY29tcGxldGUKKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGwsICZ2Zy0+bHZzKQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbGwtPmx2LT5zZWdtZW50cykgeworCisJCQkvKiBhcmVhX2NvdW50IGlzIGFsd2F5cyAxIGhlcmUsIHMgPT0gMCAqLworCQkJaWYgKHNlZ190eXBlKHNlZywgMCkgIT0gQVJFQV9QVikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNlZ19wdihzZWcsIDApKQorCQkJCWNvbnRpbnVlOworCisJCQlsb2dfZXJyb3IoIlBhcnRpYWwgbW9kZSBzdXBwb3J0IGZvciBtaXNzaW5nIGx2bTEgUFZzIGFuZCAiCisJCQkJICAicGFydGlhbGx5IGF2YWlsYWJsZSBMVnMgaXMgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC4iKTsKKwkJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZShwdmgsIHB2cykgeworCQlkbCA9IGRtX2xpc3RfaXRlbShwdmgsIHN0cnVjdCBkaXNrX2xpc3QpOworCQlleHRlbnRfY291bnQgKz0gZGwtPnB2ZC5wZV90b3RhbDsKKwl9CisKKwkvKiBGSVhNRTogbW92ZSB0aGlzIHRvIG9uZSBwbGFjZSB0byBwdl9tYW5pcCAqLworCWlmICghKHB2bCA9IGRtX3Bvb2xfemFsbG9jKHZnLT52Z21lbSwgc2l6ZW9mKCpwdmwpKSkgfHwKKwkgICAgIShwdmwtPnB2ID0gZG1fcG9vbF96YWxsb2ModmctPnZnbWVtLCBzaXplb2YoKnB2bC0+cHYpKSkpCisJCXJldHVybl8wOworCisJLyogVXNlIHZnIHV1aWQgd2l0aCByZXBsYWNlZCBmaXJzdCBjaGFycyB0byAibWlzc2luZyIgYXMgbWlzc2luZyBQViBVVUlEICovCisJbWVtY3B5KCZwdmwtPnB2LT5pZC51dWlkLCB2Zy0+aWQudXVpZCwgc2l6ZW9mKHB2bC0+cHYtPmlkLnV1aWQpKTsKKwltZW1jcHkoJnB2bC0+cHYtPmlkLnV1aWQsICJtaXNzaW5nIiwgNyk7CisKKwlpZiAoIShwdmwtPnB2LT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCB2Zy0+bmFtZSkpKQorCQlnb3RvX291dDsKKwltZW1jcHkoJnB2bC0+cHYtPnZnaWQsICZ2Zy0+aWQsIHNpemVvZih2Zy0+aWQpKTsKKwlwdmwtPnB2LT5zdGF0dXMgfD0gTUlTU0lOR19QVjsKKwlkbV9saXN0X2luaXQoJnB2bC0+cHYtPnRhZ3MpOworCWRtX2xpc3RfaW5pdCgmcHZsLT5wdi0+c2VnbWVudHMpOworCisJcHZsLT5wdi0+cGVfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwlwdmwtPnB2LT5wZV9jb3VudCA9IHZnLT5leHRlbnRfY291bnQgLSBleHRlbnRfY291bnQ7CisJaWYgKCFhbGxvY19wdl9zZWdtZW50X3dob2xlX3B2KHZnLT52Z21lbSwgcHZsLT5wdikpCisJCWdvdG9fb3V0OworCisJYWRkX3B2bF90b192Z3ModmcsIHB2bCk7CisJbG9nX2RlYnVnX21ldGFkYXRhKCIlczogcGFydGlhbCBWRywgYWxsb2NhdGVkIG1pc3NpbmcgUFYgdXNpbmcgJWQgZXh0ZW50cy4iLAorCQkJICAgdmctPm5hbWUsIHB2bC0+cHYtPnBlX2NvdW50KTsKKworCXJldHVybiAxOworb3V0OgorCWRtX3Bvb2xfZnJlZSh2Zy0+dmdtZW0sIHB2bCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpfZm9ybWF0MV92Z19yZWFkKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJICAgICBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGNhY2hlZF92Z19mbXRkYXRhICoqdmdfZm10ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICBpbnQgc2luZ2xlX2RldmljZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgZGlza19saXN0ICpkbDsKKwlETV9MSVNUX0lOSVQocHZzKTsKKworCS8qIFN0cmlwIGRldl9kaXIgaWYgcHJlc2VudCAqLworCWlmICh2Z19uYW1lKQorCQl2Z19uYW1lID0gc3RyaXBfZGlyKHZnX25hbWUsIGZpZC0+Zm10LT5jbWQtPmRldl9kaXIpOworCisJaWYgKCEodmcgPSBhbGxvY192ZygiZm9ybWF0MV92Z19yZWFkIiwgZmlkLT5mbXQtPmNtZCwgTlVMTCkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghcmVhZF9wdnNfaW5fdmcoZmlkLT5mbXQsIHZnX25hbWUsIGZpZC0+Zm10LT5jbWQtPmZpbHRlciwKKwkJCSAgICB2Zy0+dmdtZW0sICZwdnMpKQorCQlnb3RvX2JhZDsKKworCWlmIChkbV9saXN0X2VtcHR5KCZwdnMpKQorCQlnb3RvX2JhZDsKKworCWlmICghX2NoZWNrX3ZncygmcHZzLCB2ZykpCisJCWdvdG9fYmFkOworCisJZGwgPSBkbV9saXN0X2l0ZW0ocHZzLm4sIHN0cnVjdCBkaXNrX2xpc3QpOworCisJaWYgKCFpbXBvcnRfdmcodmctPnZnbWVtLCB2ZywgZGwpKQorCQlnb3RvX2JhZDsKKworCWlmICghaW1wb3J0X3B2cyhmaWQtPmZtdCwgdmctPnZnbWVtLCB2ZywgJnB2cykpCisJCWdvdG9fYmFkOworCisJaWYgKCFpbXBvcnRfbHZzKHZnLT52Z21lbSwgdmcsICZwdnMpKQorCQlnb3RvX2JhZDsKKworCWlmICghaW1wb3J0X2V4dGVudHMoZmlkLT5mbXQtPmNtZCwgdmcsICZwdnMpKQorCQlnb3RvX2JhZDsKKworCS8qIEZJWE1FOiB3b3JrYXJvdW5kIC0gdGVtcG9yYXJ5IGFzc2lnbm1lbnQgb2YgZmlkICovCisJdmctPmZpZCA9IGZpZDsKKwlpZiAoIWltcG9ydF9zbmFwc2hvdHModmctPnZnbWVtLCB2ZywgJnB2cykpIHsKKwkJdmctPmZpZCA9IE5VTEw7CisJCWdvdG9fYmFkOworCX0KKwl2Zy0+ZmlkID0gTlVMTDsKKworCS8qIEZpeCBleHRlbnRzIGNvdW50cyBieSBhZGRpbmcgbWlzc2luZyBQViBpZiBwYXJ0aWFsIFZHICovCisJaWYgKCh2Zy0+c3RhdHVzICYgUEFSVElBTF9WRykgJiYgIV9maXhfcGFydGlhbF92Zyh2ZywgJnB2cykpCisJCWdvdG9fYmFkOworCisJdmdfc2V0X2ZpZCh2ZywgZmlkKTsKKworCXJldHVybiB2ZzsKKworYmFkOgorCXJlbGVhc2VfdmcodmcpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlza19saXN0ICpfZmxhdHRlbl9wdihzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgICAgY29uc3QgY2hhciAqZGV2X2RpcikKK3sKKwlzdHJ1Y3QgZGlza19saXN0ICpkbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKmRsKSk7CisKKwlpZiAoIWRsKQorCQlyZXR1cm5fTlVMTDsKKworCWRsLT5tZW0gPSBtZW07CisJZGwtPmRldiA9IHB2LT5kZXY7CisKKwlkbV9saXN0X2luaXQoJmRsLT51dWlkcyk7CisJZG1fbGlzdF9pbml0KCZkbC0+bHZkcyk7CisKKwlpZiAoIWV4cG9ydF9wdihmaWQtPmZtdC0+Y21kLCBtZW0sIHZnLCAmZGwtPnB2ZCwgcHYpIHx8CisJICAgICFleHBvcnRfdmcoJmRsLT52Z2QsIHZnKSB8fAorCSAgICAhZXhwb3J0X3V1aWRzKGRsLCB2ZykgfHwKKwkgICAgIWV4cG9ydF9sdnMoZGwsIHZnLCBwdiwgZGV2X2RpcikgfHwgIWNhbGN1bGF0ZV9sYXlvdXQoZGwpKSB7CisJCWRtX3Bvb2xfZnJlZShtZW0sIGRsKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJcmV0dXJuIGRsOworfQorCitzdGF0aWMgaW50IF9mbGF0dGVuX3ZnKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKnB2ZHMsIGNvbnN0IGNoYXIgKmRldl9kaXIsCisJCSAgICAgICBzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGRpc2tfbGlzdCAqZGF0YTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmICghKGRhdGEgPSBfZmxhdHRlbl9wdihmaWQsIG1lbSwgdmcsIHB2bC0+cHYsIGRldl9kaXIpKSkKKwkJCXJldHVybl8wOworCisJCWRtX2xpc3RfYWRkKHB2ZHMsICZkYXRhLT5saXN0KTsKKwl9CisKKwlleHBvcnRfbnVtYmVycyhwdmRzLCB2Zyk7CisJZXhwb3J0X3B2X2FjdChwdmRzKTsKKworCWlmICghZXhwb3J0X3ZnX251bWJlcihmaWQsIHB2ZHMsIHZnLT5uYW1lLCBmaWx0ZXIpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9mb3JtYXQxX3ZnX3dyaXRlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1fcG9vbF9jcmVhdGUoImx2bTEgdmdfd3JpdGUiLCBWR19NRU1QT09MX0NIVU5LKTsKKwlzdHJ1Y3QgZG1fbGlzdCBwdmRzOworCWludCByID0gMDsKKworCWlmICghbWVtKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaW5pdCgmcHZkcyk7CisKKwlyID0gKF9mbGF0dGVuX3ZnKGZpZCwgbWVtLCB2ZywgJnB2ZHMsIGZpZC0+Zm10LT5jbWQtPmRldl9kaXIsCisJCQkgZmlkLT5mbXQtPmNtZC0+ZmlsdGVyKSAmJgorCSAgICAgd3JpdGVfZGlza3MoZmlkLT5mbXQsICZwdmRzLCAxKSk7CisKKwlsdm1jYWNoZV91cGRhdGVfdmcodmcsIDApOworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9mb3JtYXQxX3B2X3JlYWQoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJCSAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IHNjYW5fbGFiZWxfb25seSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1fcG9vbF9jcmVhdGUoImx2bTEgcHZfcmVhZCIsIDEwMjQpOworCXN0cnVjdCBkaXNrX2xpc3QgKmRsOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgciA9IDA7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJSZWFkaW5nIHBoeXNpY2FsIHZvbHVtZSBkYXRhICVzIGZyb20gZGlzayIsIHB2X25hbWUpOworCisJaWYgKCFtZW0pCisJCXJldHVybl8wOworCisJaWYgKCEoZGV2ID0gZGV2X2NhY2hlX2dldChwdl9uYW1lLCBmbXQtPmNtZC0+ZmlsdGVyKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCEoZGwgPSByZWFkX2Rpc2soZm10LCBkZXYsIG1lbSwgTlVMTCkpKQorCQlnb3RvX291dDsKKworCWlmICghaW1wb3J0X3B2KGZtdCwgZm10LT5jbWQtPm1lbSwgZGwtPmRldiwgTlVMTCwgcHYsICZkbC0+cHZkLCAmZGwtPnZnZCkpCisJCWdvdG9fb3V0OworCisJcHYtPmZtdCA9IGZtdDsKKworCXIgPSAxOworCisgICAgICBvdXQ6CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2Zvcm1hdDFfcHZfaW5pdGlhbGlzZShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQsCisJCQkJICBzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgKnB2YSwKKwkJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKiBwdikKK3sKKwlpZiAocHYtPnNpemUgPiBNQVhfUFZfU0laRSkKKwkJcHYtPnNpemUtLTsKKwlpZiAocHYtPnNpemUgPiBNQVhfUFZfU0laRSkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZXMgY2Fubm90IGJlIGJpZ2dlciB0aGFuICVzIiwKKwkJCSAgZGlzcGxheV9zaXplKGZtdC0+Y21kLCAodWludDY0X3QpIE1BWF9QVl9TSVpFKSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vdGhpbmcgbW9yZSB0byBkbyBpZiBleHRlbnQgc2l6ZSBpc24ndCBwcm92aWRlZCAqLworCWlmICghcHZhLT5leHRlbnRfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFRoaXMgd29ya3Mgb3V0IHBlX3N0YXJ0IGFuZCBwZV9jb3VudC4KKwkgKi8KKwlpZiAoIWNhbGN1bGF0ZV9leHRlbnRfY291bnQocHYsIHB2YS0+ZXh0ZW50X3NpemUsIHB2YS0+ZXh0ZW50X2NvdW50LCBwdmEtPnBlX3N0YXJ0KSkKKwkJcmV0dXJuXzA7CisKKwkvKiBSZXRhaW4gZXhpc3RpbmcgZXh0ZW50IGxvY2F0aW9ucyBleGFjdGx5ICovCisJaWYgKCgocHZhLT5wZV9zdGFydCB8fCBwdmEtPmV4dGVudF9jb3VudCkgJiYgKHB2YS0+cGVfc3RhcnQgIT0gcHYtPnBlX3N0YXJ0KSkgfHwKKwkgICAgKHB2YS0+ZXh0ZW50X2NvdW50ICYmIChwdmEtPmV4dGVudF9jb3VudCAhPSBwdi0+cGVfY291bnQpKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIHdvdWxkIG92ZXJ3cml0ZSBwaHlzaWNhbCBleHRlbnRzIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9mb3JtYXQxX3B2X3NldHVwKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCSAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHB2X2NyZWF0ZV9hcmdzIHB2YSA9IHsgLmlkID0ge3swfX0sCisJCQkJICAgICAgLmlkcCA9IE5VTEwsCisJCQkJICAgICAgLmJhX3N0YXJ0ID0gMCwKKwkJCQkgICAgICAuYmFfc2l6ZSA9IDAsCisJCQkJICAgICAgLnBlX3N0YXJ0ID0gMCwKKwkJCQkgICAgICAuZXh0ZW50X2NvdW50ID0gMCwKKwkJCQkgICAgICAuZXh0ZW50X3NpemUgPSB2Zy0+ZXh0ZW50X3NpemV9OworCisJcmV0dXJuIF9mb3JtYXQxX3B2X2luaXRpYWxpc2UoZm10LCAmcHZhLCBwdik7Cit9CisKK3N0YXRpYyBpbnQgX2Zvcm1hdDFfbHZfc2V0dXAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVpbnQ2NF90IG1heF9zaXplID0gVUlOVF9NQVg7CisKKwlpZiAoISpsdi0+bHZpZC5zKQorCQlsdmlkX2Zyb21fbHZudW0oJmx2LT5sdmlkLCAmbHYtPnZnLT5pZCwgZmluZF9mcmVlX2x2bnVtKGx2KSk7CisKKwlpZiAobHYtPmxlX2NvdW50ID4gTUFYX0xFX1RPVEFMKSB7CisJCWxvZ19lcnJvcigibG9naWNhbCB2b2x1bWVzIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiAiCisJCQkgICIlZCBleHRlbnRzLiIsIE1BWF9MRV9UT1RBTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAobHYtPnNpemUgPiBtYXhfc2l6ZSkgeworCQlsb2dfZXJyb3IoImxvZ2ljYWwgdm9sdW1lcyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gJXMiLAorCQkJICBkaXNwbGF5X3NpemUoZmlkLT5mbXQtPmNtZCwgbWF4X3NpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2Zvcm1hdDFfcHZfd3JpdGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisJc3RydWN0IGRtX2xpc3QgcHZzOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWludCBwZV9jb3VudCwgcGVfc2l6ZSwgcGVfc3RhcnQ7CisJaW50IHIgPSAxOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2FkZChmbXQtPmxhYmVsbGVyLCAoY2hhciAqKSAmcHYtPmlkLCBwdi0+ZGV2LAorCQkJCSAgcHYtPnZnX25hbWUsIE5VTEwsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlsdm1jYWNoZV91cGRhdGVfcHYoaW5mbywgcHYsIGZtdCk7CisJbHZtY2FjaGVfZGVsX21kYXMoaW5mbyk7CisJbHZtY2FjaGVfZGVsX2RhcyhpbmZvKTsKKwlsdm1jYWNoZV9kZWxfYmFzKGluZm8pOworCisJZG1fbGlzdF9pbml0KCZwdnMpOworCisJcGVfY291bnQgPSBwdi0+cGVfY291bnQ7CisJcGVfc2l6ZSA9IHB2LT5wZV9zaXplOworCXBlX3N0YXJ0ID0gcHYtPnBlX3N0YXJ0OworCisJLyogRW5zdXJlIGFueSByZXNpZHVhbCBQRSBzdHJ1Y3R1cmUgaXMgZ29uZSAqLworCXB2LT5wZV9zaXplID0gcHYtPnBlX2NvdW50ID0gMDsKKwlwdi0+cGVfc3RhcnQgPSBMVk0xX1BFX0FMSUdOOworCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoImx2bTEgcHZfd3JpdGUiLCAxMDI0KSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZGwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKCpkbCkpKSkKKwkJZ290b19iYWQ7CisKKwlkbC0+bWVtID0gbWVtOworCWRsLT5kZXYgPSBwdi0+ZGV2OworCWRtX2xpc3RfaW5pdCgmZGwtPnV1aWRzKTsKKwlkbV9saXN0X2luaXQoJmRsLT5sdmRzKTsKKworCWlmICghZXhwb3J0X3B2KGZtdC0+Y21kLCBtZW0sIE5VTEwsICZkbC0+cHZkLCBwdikpCisJCWdvdG9fYmFkOworCisJLyogbXVzdCBiZSBzZXQgdG8gYmUgYWJsZSB0byB6ZXJvIGdhcCBhZnRlciBQViBzdHJ1Y3R1cmUgaW4KKwkgICBkZXZfd3JpdGUgaW4gb3JkZXIgdG8gbWFrZSBvdGhlciBkaXNrIHRvb2xzIGhhcHB5ICovCisJZGwtPnB2ZC5wdl9vbl9kaXNrLmJhc2UgPSBNRVRBREFUQV9CQVNFOworCWRsLT5wdmQucHZfb25fZGlzay5zaXplID0gUFZfU0laRTsKKwlkbC0+cHZkLnBlX29uX2Rpc2suYmFzZSA9IExWTTFfUEVfQUxJR04gPDwgU0VDVE9SX1NISUZUOworCisJZG1fbGlzdF9hZGQoJnB2cywgJmRsLT5saXN0KTsKKwlpZiAoIXdyaXRlX2Rpc2tzKGZtdCwgJnB2cywgMCkpCisJCWdvdG9fYmFkOworCisJZ290byBvdXQ7CisKKyAgICAgIGJhZDoKKwlyID0gMDsKKworICAgICAgb3V0OgorCXB2LT5wZV9zaXplID0gcGVfc2l6ZTsKKwlwdi0+cGVfY291bnQgPSBwZV9jb3VudDsKKwlwdi0+cGVfc3RhcnQgPSBwZV9zdGFydDsKKworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9mb3JtYXQxX3ZnX3NldHVwKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJLyoganVzdCBjaGVjayBtYXhfcHYgYW5kIG1heF9sdiAqLworCWlmICghdmctPm1heF9sdiB8fCB2Zy0+bWF4X2x2ID49IE1BWF9MVikKKwkJdmctPm1heF9sdiA9IE1BWF9MViAtIDE7CisKKwlpZiAoIXZnLT5tYXhfcHYgfHwgdmctPm1heF9wdiA+PSBNQVhfUFYpCisJCXZnLT5tYXhfcHYgPSBNQVhfUFYgLSAxOworCisJaWYgKCF2Z19jaGVja19uZXdfZXh0ZW50X3NpemUodmctPmZpZC0+Zm10LCB2Zy0+ZXh0ZW50X3NpemUpKQorCQlyZXR1cm5fMDsKKworICAgICAgICAvKiBHZW5lcmF0ZSBsdm0xX3N5c3RlbV9pZCBpZiBub3QgeWV0IHNldCAqLworICAgICAgICBpZiAoISp2Zy0+bHZtMV9zeXN0ZW1faWQgJiYKKyAgICAgICAgICAgICFnZW5lcmF0ZV9sdm0xX3N5c3RlbV9pZCh2Zy0+Y21kLCB2Zy0+bHZtMV9zeXN0ZW1faWQsICIiKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZm9ybWF0MV9zZWd0eXBlX3N1cHBvcnRlZChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSkKK3sKKwlpZiAoIShzZWd0eXBlLT5mbGFncyAmIFNFR19GT1JNQVQxX1NVUFBPUlQpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2FyZWFfb3BzIF9tZXRhZGF0YV9mb3JtYXQxX29wcyA9IHsKKwkudmdfcmVhZCA9IF9mb3JtYXQxX3ZnX3JlYWQsCisJLnZnX3dyaXRlID0gX2Zvcm1hdDFfdmdfd3JpdGUsCit9OworCitzdGF0aWMgc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqX2Zvcm1hdDFfY3JlYXRlX2luc3RhbmNlKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCQkJCWNvbnN0IHN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4ICpmaWMpCit7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisKKwlpZiAoIShmaWQgPSBhbGxvY19maWQoZm10LCBmaWMpKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBEZWZpbmUgYSBOVUxMIG1ldGFkYXRhIGFyZWEgKi8KKwlpZiAoIShtZGEgPSBkbV9wb29sX3phbGxvYyhmaWQtPm1lbSwgc2l6ZW9mKCptZGEpKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWV0YWRhdGEgYXJlYSBzdHJ1Y3R1cmUgIgorCQkJICAiZm9yIGx2bTEgZm9ybWF0Iik7CisJCWdvdG8gYmFkOworCX0KKworCW1kYS0+b3BzID0gJl9tZXRhZGF0YV9mb3JtYXQxX29wczsKKwltZGEtPm1ldGFkYXRhX2xvY24gPSBOVUxMOworCW1kYS0+c3RhdHVzID0gMDsKKwlkbV9saXN0X2FkZCgmZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UsICZtZGEtPmxpc3QpOworCisJcmV0dXJuIGZpZDsKKworYmFkOgorCWRtX3Bvb2xfZGVzdHJveShmaWQtPm1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9mb3JtYXQxX2Rlc3Ryb3lfaW5zdGFuY2Uoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkKQoreworCWlmICgtLWZpZC0+cmVmX2NvdW50IDw9IDEpCisJCWRtX3Bvb2xfZGVzdHJveShmaWQtPm1lbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9mb3JtYXQxX2Rlc3Ryb3koc3RydWN0IGZvcm1hdF90eXBlICpmbXQpCit7CisJaWYgKGZtdC0+b3JwaGFuX3ZnKQorCQlmcmVlX29ycGhhbl92ZyhmbXQtPm9ycGhhbl92Zyk7CisKKwlkbV9mcmVlKGZtdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZm9ybWF0X2hhbmRsZXIgX2Zvcm1hdDFfb3BzID0geworCS5wdl9yZWFkID0gX2Zvcm1hdDFfcHZfcmVhZCwKKwkucHZfaW5pdGlhbGlzZSA9IF9mb3JtYXQxX3B2X2luaXRpYWxpc2UsCisJLnB2X3NldHVwID0gX2Zvcm1hdDFfcHZfc2V0dXAsCisJLnB2X3dyaXRlID0gX2Zvcm1hdDFfcHZfd3JpdGUsCisJLmx2X3NldHVwID0gX2Zvcm1hdDFfbHZfc2V0dXAsCisJLnZnX3NldHVwID0gX2Zvcm1hdDFfdmdfc2V0dXAsCisJLnNlZ3R5cGVfc3VwcG9ydGVkID0gX2Zvcm1hdDFfc2VndHlwZV9zdXBwb3J0ZWQsCisJLmNyZWF0ZV9pbnN0YW5jZSA9IF9mb3JtYXQxX2NyZWF0ZV9pbnN0YW5jZSwKKwkuZGVzdHJveV9pbnN0YW5jZSA9IF9mb3JtYXQxX2Rlc3Ryb3lfaW5zdGFuY2UsCisJLmRlc3Ryb3kgPSBfZm9ybWF0MV9kZXN0cm95LAorfTsKKworI2lmZGVmIExWTTFfSU5URVJOQUwKK3N0cnVjdCBmb3JtYXRfdHlwZSAqaW5pdF9sdm0xX2Zvcm1hdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKKyNlbHNlCQkJCS8qIFNoYXJlZCAqLworc3RydWN0IGZvcm1hdF90eXBlICppbml0X2Zvcm1hdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CitzdHJ1Y3QgZm9ybWF0X3R5cGUgKmluaXRfZm9ybWF0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQorI2VuZGlmCit7CisJc3RydWN0IGZvcm1hdF90eXBlICpmbXQgPSBkbV9tYWxsb2Moc2l6ZW9mKCpmbXQpKTsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWM7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCisJaWYgKCFmbXQpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZm9ybWF0MSBmb3JtYXQgdHlwZSBzdHJ1Y3R1cmUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZtdC0+Y21kID0gY21kOworCWZtdC0+b3BzID0gJl9mb3JtYXQxX29wczsKKwlmbXQtPm5hbWUgPSBGTVRfTFZNMV9OQU1FOworCWZtdC0+YWxpYXMgPSBOVUxMOworCWZtdC0+b3JwaGFuX3ZnX25hbWUgPSBGTVRfTFZNMV9PUlBIQU5fVkdfTkFNRTsKKwlmbXQtPmZlYXR1cmVzID0gRk1UX1JFU1RSSUNURURfTFZJRFMgfCBGTVRfT1JQSEFOX0FMTE9DQVRBQkxFIHwKKwkJCUZNVF9SRVNUUklDVEVEX1JFQURBSEVBRCB8IEZNVF9PQlNPTEVURSB8CisJCQlGTVRfU1lTVEVNSURfT05fUFZTOworCWZtdC0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkbV9saXN0X2luaXQoJmZtdC0+bWRhX29wcyk7CisKKwlpZiAoIShmbXQtPmxhYmVsbGVyID0gbHZtMV9sYWJlbGxlcl9jcmVhdGUoZm10KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgbHZtMSBsYWJlbCBoYW5kbGVyLiIpOworCQlkbV9mcmVlKGZtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGxhYmVsX3JlZ2lzdGVyX2hhbmRsZXIoZm10LT5sYWJlbGxlcikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVnaXN0ZXIgbHZtMSBsYWJlbCBoYW5kbGVyLiIpOworCQlmbXQtPmxhYmVsbGVyLT5vcHMtPmRlc3Ryb3koZm10LT5sYWJlbGxlcik7CisJCWRtX2ZyZWUoZm10KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoZm10LT5vcnBoYW5fdmcgPSBhbGxvY192ZygiZm9ybWF0MV9vcnBoYW4iLCBjbWQsIGZtdC0+b3JwaGFuX3ZnX25hbWUpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBsdm0xIG9ycGhhbiBWRy4iKTsKKwkJZG1fZnJlZShmbXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9BVVhfTURBUzsKKwlmaWMuY29udGV4dC52Z19yZWYudmdfbmFtZSA9IGZtdC0+b3JwaGFuX3ZnX25hbWU7CisJZmljLmNvbnRleHQudmdfcmVmLnZnX2lkID0gTlVMTDsKKworCWlmICghKGZpZCA9IF9mb3JtYXQxX2NyZWF0ZV9pbnN0YW5jZShmbXQsICZmaWMpKSkgeworCQlfZm9ybWF0MV9kZXN0cm95KGZtdCk7CisJCXJldHVybl9OVUxMOworCX0KKworCXZnX3NldF9maWQoZm10LT5vcnBoYW5fdmcsIGZpZCk7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBmb3JtYXQ6ICVzIiwgZm10LT5uYW1lKTsKKworCXJldHVybiBmbXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0MS9mb3JtYXQxLmggYi9saWIvZm9ybWF0MS9mb3JtYXQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkZGM2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXQxL2Zvcm1hdDEuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0ZPUk1BVDFfSAorI2RlZmluZSBfTFZNX0ZPUk1BVDFfSAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorCisjZGVmaW5lIEZNVF9MVk0xX05BTUUgImx2bTEiCisjZGVmaW5lIEZNVF9MVk0xX09SUEhBTl9WR19OQU1FIE9SUEhBTl9WR19OQU1FKEZNVF9MVk0xX05BTUUpCisKKyNpZmRlZiBMVk0xX0lOVEVSTkFMCitzdHJ1Y3QgZm9ybWF0X3R5cGUgKmluaXRfbHZtMV9mb3JtYXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdDEvaW1wb3J0LWV4cG9ydC5jIGIvbGliL2Zvcm1hdDEvaW1wb3J0LWV4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2Y1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmMKQEAgLTAsMCArMSw2ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVHJhbnNsYXRlcyBiZXR3ZWVuIGRpc2sgYW5kIGluLWNvcmUgZm9ybWF0cy4KKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGlzay1yZXAuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIGludCBfY2hlY2tfdmdfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBzdHJsZW4obmFtZSkgPCBOQU1FX0xFTjsKK30KKworLyoKKyAqIEV4dHJhY3RzIHRoZSBsYXN0IHBhcnQgb2YgYSBwYXRoLgorICovCitzdGF0aWMgY2hhciAqX2NyZWF0ZV9sdl9uYW1lKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSkKK3sKKwljb25zdCBjaGFyICpwdHIgPSBzdHJyY2hyKGZ1bGxfbmFtZSwgJy8nKTsKKworCWlmICghcHRyKQorCQlwdHIgPSBmdWxsX25hbWU7CisJZWxzZQorCQlwdHIrKzsKKworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0sIHB0cik7Cit9CisKK2ludCBpbXBvcnRfcHYoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9wb29sICptZW0sCisJICAgICAgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IHB2X2Rpc2sgKnB2ZCwKKwkgICAgICBzdHJ1Y3QgdmdfZGlzayAqdmdkKQoreworCXVpbnQ2NF90IHNpemU7CisKKwltZW1zZXQocHYsIDAsIHNpemVvZigqcHYpKTsKKwltZW1jcHkoJnB2LT5pZCwgcHZkLT5wdl91dWlkLCBJRF9MRU4pOworCisJcHYtPmRldiA9IGRldjsKKwlpZiAoISpwdmQtPnZnX25hbWUpCisJCXB2LT52Z19uYW1lID0gZm10LT5vcnBoYW5fdmdfbmFtZTsKKwllbHNlIGlmICghKHB2LT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCAoY2hhciAqKXB2ZC0+dmdfbmFtZSkpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIEdyb3VwIG5hbWUgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCW1lbWNweSgmcHYtPnZnaWQsIHZnZC0+dmdfdXVpZCwgc2l6ZW9mKHZnLT5pZCkpOworCisJLyogU3RvcmUgc3lzdGVtX2lkIGZyb20gZmlyc3QgUFYgaWYgUFYgYmVsb25ncyB0byBhIFZHICovCisJaWYgKHZnICYmICEqdmctPmx2bTFfc3lzdGVtX2lkKQorCQlzdHJuY3B5KHZnLT5sdm0xX3N5c3RlbV9pZCwgKGNoYXIgKilwdmQtPnN5c3RlbV9pZCwgTkFNRV9MRU4pOworCisJaWYgKHZnICYmCisJICAgIHN0cm5jbXAodmctPmx2bTFfc3lzdGVtX2lkLCAoY2hhciAqKXB2ZC0+c3lzdGVtX2lkLCBzaXplb2YocHZkLT5zeXN0ZW1faWQpKSkKKwkJICAgIGxvZ192ZXJ5X3ZlcmJvc2UoIlN5c3RlbSBJRCAlcyBvbiAlcyBkaWZmZXJzIGZyb20gJXMgZm9yICIKKwkJCQkgICAgICJ2b2x1bWUgZ3JvdXAiLCBwdmQtPnN5c3RlbV9pZCwKKwkJCQkgICAgIHB2X2Rldl9uYW1lKHB2KSwgdmctPmx2bTFfc3lzdGVtX2lkKTsKKworCS8qCisJICogSWYgZXhwb3J0ZWQsIHdlIHN0aWxsIG5lZWQgdG8gZmxhZyBpbiBwdi0+c3RhdHVzIHRvbyBiZWNhdXNlCisJICogd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIHdoZW4gd2UgbmVlZCB0aGlzLgorCSAqLworCWlmIChwdmQtPnB2X3N0YXR1cyAmIFZHX0VYUE9SVEVEKQorCQlwdi0+c3RhdHVzIHw9IEVYUE9SVEVEX1ZHOworCisJaWYgKHB2ZC0+cHZfYWxsb2NhdGFibGUpCisJCXB2LT5zdGF0dXMgfD0gQUxMT0NBVEFCTEVfUFY7CisKKwlwdi0+c2l6ZSA9IHB2ZC0+cHZfc2l6ZTsKKwlwdi0+cGVfc2l6ZSA9IHB2ZC0+cGVfc2l6ZTsKKwlwdi0+cGVfc3RhcnQgPSBwdmQtPnBlX3N0YXJ0OworCXB2LT5wZV9jb3VudCA9IHB2ZC0+cGVfdG90YWw7CisJcHYtPnBlX2FsbG9jX2NvdW50ID0gMDsKKwlwdi0+cGVfYWxpZ24gPSAwOworICAgICAgICBwdi0+aXNfbGFiZWxsZWQgPSAwOyAvKiBmb3JtYXQxIFBWcyBoYXZlIG5vIGxhYmVsICovCisgICAgICAgIHB2LT5sYWJlbF9zZWN0b3IgPSAwOworCisJLyogRml4IHVwIHB2IHNpemUgaWYgbWlzc2luZyBvciBpbXBvc3NpYmx5IGxhcmdlICovCisJaWYgKCFwdi0+c2l6ZSB8fCBwdi0+c2l6ZSA+ICgxVUxMIDw8IDYyKSkgeworCQlpZiAoIWRldl9nZXRfc2l6ZShkZXYsICZwdi0+c2l6ZSkpIHsKKwkJCWxvZ19lcnJvcigiJXM6IENvdWxkbid0IGdldCBzaXplLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsb2dfdmVyYm9zZSgiRml4aW5nIHVwIG1pc3NpbmcgZm9ybWF0MSBzaXplICglcykgIgorCQkJICAgICJmb3IgUFYgJXMiLCBkaXNwbGF5X3NpemUoZm10LT5jbWQsIHB2LT5zaXplKSwKKwkJCSAgICBwdl9kZXZfbmFtZShwdikpOworCQlpZiAodmcpIHsKKwkJCXNpemUgPSBwdi0+cGVfY291bnQgKiAodWludDY0X3QpIHZnLT5leHRlbnRfc2l6ZSArCisJCQkgICAgICAgcHYtPnBlX3N0YXJ0OworCQkJaWYgKHNpemUgPiBwdi0+c2l6ZSkKKwkJCQlsb2dfd2FybigiV0FSTklORzogUGh5c2ljYWwgVm9sdW1lICVzIGlzIHRvbyAiCisJCQkJCSAibGFyZ2UgZm9yIHVuZGVybHlpbmcgZGV2aWNlIiwKKwkJCQkJIHB2X2Rldl9uYW1lKHB2KSk7CisJCX0KKwl9CisKKwlkbV9saXN0X2luaXQoJnB2LT50YWdzKTsKKwlkbV9saXN0X2luaXQoJnB2LT5zZWdtZW50cyk7CisKKwlpZiAoIWFsbG9jX3B2X3NlZ21lbnRfd2hvbGVfcHYobWVtLCBwdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBnZW5lcmF0ZV9sdm0xX3N5c3RlbV9pZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY2hhciAqcywgY29uc3QgY2hhciAqcHJlZml4KQoreworCisJaWYgKGRtX3NucHJpbnRmKHMsIE5BTUVfTEVOLCAiJXMlcyVsdSIsCisJCQkgcHJlZml4LCBjbWQtPmhvc3RuYW1lLCB0aW1lKE5VTEwpKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJHZW5lcmF0ZWQgTFZNMSBmb3JtYXQgc3lzdGVtX2lkIHRvbyBsb25nIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZXhwb3J0X3B2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCSAgICAgIHN0cnVjdCBwdl9kaXNrICpwdmQsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCW1lbXNldChwdmQsIDAsIHNpemVvZigqcHZkKSk7CisKKwlwdmQtPmlkWzBdID0gJ0gnOworCXB2ZC0+aWRbMV0gPSAnTSc7CisJcHZkLT52ZXJzaW9uID0gMTsKKworCW1lbWNweShwdmQtPnB2X3V1aWQsIHB2LT5pZC51dWlkLCBJRF9MRU4pOworCisJaWYgKHB2LT52Z19uYW1lICYmICFpc19vcnBoYW4ocHYpICYmICEocHYtPnN0YXR1cyAmIFVOTEFCRUxMRURfUFYpKSB7CisJCWlmICghX2NoZWNrX3ZnX25hbWUocHYtPnZnX25hbWUpKQorCQkJcmV0dXJuXzA7CisJCXN0cm5jcHkoKGNoYXIgKilwdmQtPnZnX25hbWUsIHB2LT52Z19uYW1lLCBzaXplb2YocHZkLT52Z19uYW1lKSk7CisJfQorCisJLyogUHJlc2VydmUgZXhpc3Rpbmcgc3lzdGVtX2lkIGlmIGl0IGV4aXN0cyAqLworCWlmICh2ZyAmJiB2Zy0+bHZtMV9zeXN0ZW1faWQgJiYgKnZnLT5sdm0xX3N5c3RlbV9pZCkKKwkJc3RybmNweSgoY2hhciAqKXB2ZC0+c3lzdGVtX2lkLCB2Zy0+bHZtMV9zeXN0ZW1faWQsIHNpemVvZihwdmQtPnN5c3RlbV9pZCkpOworCWVsc2UgaWYgKHZnICYmIHZnLT5zeXN0ZW1faWQgJiYgKnZnLT5zeXN0ZW1faWQpCisJCXN0cm5jcHkoKGNoYXIgKilwdmQtPnN5c3RlbV9pZCwgdmctPnN5c3RlbV9pZCwgc2l6ZW9mKHB2ZC0+c3lzdGVtX2lkKSk7CisKKwkvKiBJcyBWRyBhbHJlYWR5IGV4cG9ydGVkIG9yIGJlaW5nIGV4cG9ydGVkPyAqLworCWlmICh2ZyAmJiB2Z19pc19leHBvcnRlZCh2ZykpIHsKKwkJLyogRG9lcyBzeXN0ZW1faWQgbmVlZCBzZXR0aW5nPyAqLworCQlpZiAoIXZnLT5sdm0xX3N5c3RlbV9pZCB8fCAhKnZnLT5sdm0xX3N5c3RlbV9pZCB8fAorCQkgICAgc3RybmNtcCh2Zy0+bHZtMV9zeXN0ZW1faWQsIEVYUE9SVEVEX1RBRywKKwkJCSAgICBzaXplb2YoRVhQT1JURURfVEFHKSAtIDEpKSB7CisJCQlpZiAoIWdlbmVyYXRlX2x2bTFfc3lzdGVtX2lkKGNtZCwgKGNoYXIgKilwdmQtPnN5c3RlbV9pZCwgRVhQT1JURURfVEFHKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCQlpZiAoc3RybGVuKChjaGFyICopcHZkLT52Z19uYW1lKSArIHNpemVvZihFWFBPUlRFRF9UQUcpID4KKwkJICAgIHNpemVvZihwdmQtPnZnX25hbWUpKSB7CisJCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBuYW1lICVzIHRvbyBsb25nIHRvIGV4cG9ydCIsCisJCQkJICBwdmQtPnZnX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3RyY2F0KChjaGFyICopcHZkLT52Z19uYW1lLCBFWFBPUlRFRF9UQUcpOworCX0KKworCS8qIElzIFZHIGJlaW5nIGltcG9ydGVkPyAqLworCWlmICh2ZyAmJiAhdmdfaXNfZXhwb3J0ZWQodmcpICYmIHZnLT5sdm0xX3N5c3RlbV9pZCAmJiAqdmctPmx2bTFfc3lzdGVtX2lkICYmCisJICAgICFzdHJuY21wKHZnLT5sdm0xX3N5c3RlbV9pZCwgRVhQT1JURURfVEFHLCBzaXplb2YoRVhQT1JURURfVEFHKSAtIDEpKSB7CisJCWlmICghZ2VuZXJhdGVfbHZtMV9zeXN0ZW1faWQoY21kLCAoY2hhciAqKXB2ZC0+c3lzdGVtX2lkLCBJTVBPUlRFRF9UQUcpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogR2VuZXJhdGUgc3lzdGVtX2lkIGlmIFBWIGlzIGluIFZHICovCisJaWYgKCFwdmQtPnN5c3RlbV9pZFswXSkKKwkJaWYgKCFnZW5lcmF0ZV9sdm0xX3N5c3RlbV9pZChjbWQsIChjaGFyICopcHZkLT5zeXN0ZW1faWQsICIiKSkKKwkJCXJldHVybl8wOworCisJLyogVXBkYXRlIGludGVybmFsIHN5c3RlbV9pZCBpZiB3ZSBjaGFuZ2VkIGl0ICovCisJaWYgKHZnICYmIHZnLT5sdm0xX3N5c3RlbV9pZCAmJgorCSAgICAoISp2Zy0+bHZtMV9zeXN0ZW1faWQgfHwKKwkgICAgIHN0cm5jbXAodmctPmx2bTFfc3lzdGVtX2lkLCAoY2hhciAqKXB2ZC0+c3lzdGVtX2lkLCBzaXplb2YocHZkLT5zeXN0ZW1faWQpKSkpCisJCSAgICBzdHJuY3B5KHZnLT5sdm0xX3N5c3RlbV9pZCwgKGNoYXIgKilwdmQtPnN5c3RlbV9pZCwgTkFNRV9MRU4pOworCisJLy9wdmQtPnB2X21ham9yID0gTUFKT1IocHYtPmRldik7CisKKwlpZiAocHYtPnN0YXR1cyAmIEFMTE9DQVRBQkxFX1BWKQorCQlwdmQtPnB2X2FsbG9jYXRhYmxlID0gUFZfQUxMT0NBVEFCTEU7CisKKwlwdmQtPnB2X3NpemUgPSBwdi0+c2l6ZTsKKwlwdmQtPmx2X2N1ciA9IDA7CS8qIHRoaXMgaXMgc2V0IHdoZW4gZXhwb3J0aW5nIHRoZSBsdiBsaXN0ICovCisJaWYgKHZnKQorCQlwdmQtPnBlX3NpemUgPSB2Zy0+ZXh0ZW50X3NpemU7CisJZWxzZQorCQlwdmQtPnBlX3NpemUgPSBwdi0+cGVfc2l6ZTsKKwlwdmQtPnBlX3RvdGFsID0gcHYtPnBlX2NvdW50OworCXB2ZC0+cGVfYWxsb2NhdGVkID0gcHYtPnBlX2FsbG9jX2NvdW50OworCXB2ZC0+cGVfc3RhcnQgPSBwdi0+cGVfc3RhcnQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGltcG9ydF92ZyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgZGlza19saXN0ICpkbCkKK3sKKwlzdHJ1Y3QgdmdfZGlzayAqdmdkID0gJmRsLT52Z2Q7CisJbWVtY3B5KHZnLT5pZC51dWlkLCB2Z2QtPnZnX3V1aWQsIElEX0xFTik7CisKKwlpZiAoIV9jaGVja192Z19uYW1lKChjaGFyICopZGwtPnB2ZC52Z19uYW1lKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoISh2Zy0+bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgKGNoYXIgKilkbC0+cHZkLnZnX25hbWUpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoISh2Zy0+bHZtMV9zeXN0ZW1faWQgPSBkbV9wb29sX3phbGxvYyhtZW0sIE5BTUVfTEVOICsgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICh2Z2QtPnZnX3N0YXR1cyAmIFZHX0VYUE9SVEVEKQorCQl2Zy0+c3RhdHVzIHw9IEVYUE9SVEVEX1ZHOworCisJaWYgKHZnZC0+dmdfc3RhdHVzICYgVkdfRVhURU5EQUJMRSkKKwkJdmctPnN0YXR1cyB8PSBSRVNJWkVBQkxFX1ZHOworCisJaWYgKHZnZC0+dmdfYWNjZXNzICYgVkdfUkVBRCkKKwkJdmctPnN0YXR1cyB8PSBMVk1fUkVBRDsKKworCWlmICh2Z2QtPnZnX2FjY2VzcyAmIFZHX1dSSVRFKQorCQl2Zy0+c3RhdHVzIHw9IExWTV9XUklURTsKKworCWlmICh2Z2QtPnZnX2FjY2VzcyAmIFZHX0NMVVNURVJFRCkKKwkJdmctPnN0YXR1cyB8PSBDTFVTVEVSRUQ7CisKKwlpZiAodmdkLT52Z19hY2Nlc3MgJiBWR19TSEFSRUQpCisJCXZnLT5zdGF0dXMgfD0gU0hBUkVEOworCisJdmctPmV4dGVudF9zaXplID0gdmdkLT5wZV9zaXplOworCXZnLT5leHRlbnRfY291bnQgPSB2Z2QtPnBlX3RvdGFsOworCXZnLT5mcmVlX2NvdW50ID0gdmdkLT5wZV90b3RhbDsKKwl2Zy0+bWF4X2x2ID0gdmdkLT5sdl9tYXg7CisJdmctPm1heF9wdiA9IHZnZC0+cHZfbWF4OworCXZnLT5hbGxvYyA9IEFMTE9DX05PUk1BTDsKKworCXJldHVybiAxOworfQorCitpbnQgZXhwb3J0X3ZnKHN0cnVjdCB2Z19kaXNrICp2Z2QsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCW1lbXNldCh2Z2QsIDAsIHNpemVvZigqdmdkKSk7CisJbWVtY3B5KHZnZC0+dmdfdXVpZCwgdmctPmlkLnV1aWQsIElEX0xFTik7CisKKwlpZiAodmctPnN0YXR1cyAmIExWTV9SRUFEKQorCQl2Z2QtPnZnX2FjY2VzcyB8PSBWR19SRUFEOworCisJaWYgKHZnLT5zdGF0dXMgJiBMVk1fV1JJVEUpCisJCXZnZC0+dmdfYWNjZXNzIHw9IFZHX1dSSVRFOworCisJaWYgKHZnX2lzX2NsdXN0ZXJlZCh2ZykpCisJCXZnZC0+dmdfYWNjZXNzIHw9IFZHX0NMVVNURVJFRDsKKworCWlmICh2Zy0+c3RhdHVzICYgU0hBUkVEKQorCQl2Z2QtPnZnX2FjY2VzcyB8PSBWR19TSEFSRUQ7CisKKwlpZiAodmdfaXNfZXhwb3J0ZWQodmcpKQorCQl2Z2QtPnZnX3N0YXR1cyB8PSBWR19FWFBPUlRFRDsKKworCWlmICh2Z19pc19yZXNpemVhYmxlKHZnKSkKKwkJdmdkLT52Z19zdGF0dXMgfD0gVkdfRVhURU5EQUJMRTsKKworCXZnZC0+bHZfbWF4ID0gdmctPm1heF9sdjsKKwl2Z2QtPmx2X2N1ciA9IHZnX3Zpc2libGVfbHZzKHZnKSArIHNuYXBzaG90X2NvdW50KHZnKTsKKworCXZnZC0+cHZfbWF4ID0gdmctPm1heF9wdjsKKwl2Z2QtPnB2X2N1ciA9IHZnLT5wdl9jb3VudDsKKworCXZnZC0+cGVfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwl2Z2QtPnBlX3RvdGFsID0gdmctPmV4dGVudF9jb3VudDsKKwl2Z2QtPnBlX2FsbG9jYXRlZCA9IHZnLT5leHRlbnRfY291bnQgLSB2Zy0+ZnJlZV9jb3VudDsKKworCXJldHVybiAxOworfQorCitpbnQgaW1wb3J0X2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBsdl9kaXNrICpsdmQpCit7CisJaWYgKCEobHYtPm5hbWUgPSBfY3JlYXRlX2x2X25hbWUobWVtLCAoY2hhciAqKWx2ZC0+bHZfbmFtZSkpKQorCQlyZXR1cm5fMDsKKworCWx2LT5zdGF0dXMgfD0gVklTSUJMRV9MVjsKKworCWlmIChsdmQtPmx2X3N0YXR1cyAmIExWX1NQSU5ET1dOKQorCQlsdi0+c3RhdHVzIHw9IFNQSU5ET1dOX0xWOworCisJaWYgKGx2ZC0+bHZfc3RhdHVzICYgTFZfUEVSU0lTVEVOVF9NSU5PUikgeworCQlsdi0+c3RhdHVzIHw9IEZJWEVEX01JTk9SOworCQlsdi0+bWlub3IgPSBNSU5PUihsdmQtPmx2X2Rldik7CisJCWx2LT5tYWpvciA9IE1BSk9SKGx2ZC0+bHZfZGV2KTsKKwl9IGVsc2UgeworCQlsdi0+bWFqb3IgPSAtMTsKKwkJbHYtPm1pbm9yID0gLTE7CisJfQorCisJaWYgKGx2ZC0+bHZfYWNjZXNzICYgTFZfUkVBRCkKKwkJbHYtPnN0YXR1cyB8PSBMVk1fUkVBRDsKKworCWlmIChsdmQtPmx2X2FjY2VzcyAmIExWX1dSSVRFKQorCQlsdi0+c3RhdHVzIHw9IExWTV9XUklURTsKKworCWlmIChsdmQtPmx2X2JhZGJsb2NrKQorCQlsdi0+c3RhdHVzIHw9IEJBREJMT0NLX09OOworCisJLyogRHJvcCB0aGUgdW51c2VkIExWX1NUUklDVCBoZXJlICovCisJaWYgKGx2ZC0+bHZfYWxsb2NhdGlvbiAmIExWX0NPTlRJR1VPVVMpCisJCWx2LT5hbGxvYyA9IEFMTE9DX0NPTlRJR1VPVVM7CisJZWxzZQorCQlsdi0+YWxsb2MgPSBBTExPQ19OT1JNQUw7CisKKwlpZiAoIWx2ZC0+bHZfcmVhZF9haGVhZCkKKwkJbHYtPnJlYWRfYWhlYWQgPSBjbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZDsKKwllbHNlCisJCWx2LT5yZWFkX2FoZWFkID0gbHZkLT5sdl9yZWFkX2FoZWFkOworCisJbHYtPnNpemUgPSBsdmQtPmx2X3NpemU7CisJbHYtPmxlX2NvdW50ID0gbHZkLT5sdl9hbGxvY2F0ZWRfbGU7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2V4cG9ydF9sdihzdHJ1Y3QgbHZfZGlzayAqbHZkLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmRldl9kaXIpCit7CisJbWVtc2V0KGx2ZCwgMCwgc2l6ZW9mKCpsdmQpKTsKKwlzbnByaW50ZigoY2hhciAqKWx2ZC0+bHZfbmFtZSwgc2l6ZW9mKGx2ZC0+bHZfbmFtZSksICIlcyVzLyVzIiwKKwkJIGRldl9kaXIsIHZnLT5uYW1lLCBsdi0+bmFtZSk7CisKKwkodm9pZCkgZG1fc3RybmNweSgoY2hhciAqKWx2ZC0+dmdfbmFtZSwgdmctPm5hbWUsIHNpemVvZihsdmQtPnZnX25hbWUpKTsKKworCWlmIChsdi0+c3RhdHVzICYgTFZNX1JFQUQpCisJCWx2ZC0+bHZfYWNjZXNzIHw9IExWX1JFQUQ7CisKKwlpZiAobHYtPnN0YXR1cyAmIExWTV9XUklURSkKKwkJbHZkLT5sdl9hY2Nlc3MgfD0gTFZfV1JJVEU7CisKKwlpZiAobHYtPnN0YXR1cyAmIFNQSU5ET1dOX0xWKQorCQlsdmQtPmx2X3N0YXR1cyB8PSBMVl9TUElORE9XTjsKKworCWlmIChsdi0+c3RhdHVzICYgRklYRURfTUlOT1IpIHsKKwkJbHZkLT5sdl9zdGF0dXMgfD0gTFZfUEVSU0lTVEVOVF9NSU5PUjsKKwkJbHZkLT5sdl9kZXYgPSBNS0RFVihsdi0+bWFqb3IsIGx2LT5taW5vcik7CisJfSBlbHNlIHsKKwkJbHZkLT5sdl9kZXYgPSBNS0RFVihMVk1fQkxLX01BSk9SLCBsdm51bV9mcm9tX2x2aWQoJmx2LT5sdmlkKSk7CisJfQorCisJaWYgKGx2LT5yZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfQVVUTyB8fAorCSAgICBsdi0+cmVhZF9haGVhZCA9PSBETV9SRUFEX0FIRUFEX05PTkUpCisJCWx2ZC0+bHZfcmVhZF9haGVhZCA9IDA7CisJZWxzZQorCQlsdmQtPmx2X3JlYWRfYWhlYWQgPSBsdi0+cmVhZF9haGVhZDsKKworCWx2ZC0+bHZfc3RyaXBlcyA9CisJICAgIGRtX2xpc3RfaXRlbShsdi0+c2VnbWVudHMubiwgc3RydWN0IGx2X3NlZ21lbnQpLT5hcmVhX2NvdW50OworCWx2ZC0+bHZfc3RyaXBlc2l6ZSA9CisJICAgIGRtX2xpc3RfaXRlbShsdi0+c2VnbWVudHMubiwgc3RydWN0IGx2X3NlZ21lbnQpLT5zdHJpcGVfc2l6ZTsKKworCWx2ZC0+bHZfc2l6ZSA9IGx2LT5zaXplOworCWx2ZC0+bHZfYWxsb2NhdGVkX2xlID0gbHYtPmxlX2NvdW50OworCisJaWYgKGx2LT5zdGF0dXMgJiBCQURCTE9DS19PTikKKwkJbHZkLT5sdl9iYWRibG9jayA9IExWX0JBREJMT0NLX09OOworCisJaWYgKGx2LT5hbGxvYyA9PSBBTExPQ19DT05USUdVT1VTKQorCQlsdmQtPmx2X2FsbG9jYXRpb24gfD0gTFZfQ09OVElHVU9VUzsKK30KKworaW50IGV4cG9ydF9leHRlbnRzKHN0cnVjdCBkaXNrX2xpc3QgKmRsLCB1aW50MzJfdCBsdl9udW0sCisJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXN0cnVjdCBwZV9kaXNrICpwZWQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwl1aW50MzJfdCBwZSwgczsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpIHsKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoIShzZWctPnNlZ3R5cGUtPmZsYWdzICYgU0VHX0ZPUk1BVDFfU1VQUE9SVCkpIHsKKwkJCQlsb2dfZXJyb3IoIlNlZ21lbnQgdHlwZSAlcyBpbiBMViAlczogIgorCQkJCQkgICJ1bnN1cHBvcnRlZCBieSBmb3JtYXQxIiwKKwkJCQkJICBzZWctPnNlZ3R5cGUtPm5hbWUsIGx2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfUFYpIHsKKwkJCQlsb2dfZXJyb3IoIk5vbi1QViBzdHJpcGUgZm91bmQgaW4gTFYgJXM6ICIKKwkJCQkJICAidW5zdXBwb3J0ZWQgYnkgZm9ybWF0MSIsIGx2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChzZWdfcHYoc2VnLCBzKSAhPSBwdikKKwkJCQljb250aW51ZTsJLyogbm90IG91ciBwdiAqLworCisJCQlmb3IgKHBlID0gMDsgcGUgPCAoc2VnLT5sZW4gLyBzZWctPmFyZWFfY291bnQpOyBwZSsrKSB7CisJCQkJcGVkID0gJmRsLT5leHRlbnRzW3BlICsgc2VnX3BlKHNlZywgcyldOworCQkJCXBlZC0+bHZfbnVtID0gbHZfbnVtOworCQkJCXBlZC0+bGVfbnVtID0gKHNlZy0+bGUgLyBzZWctPmFyZWFfY291bnQpICsgcGUgKworCQkJCSAgICBzICogKGx2LT5sZV9jb3VudCAvIHNlZy0+YXJlYV9jb3VudCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGltcG9ydF9wdnMoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9wb29sICptZW0sCisJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgZG1fbGlzdCAqcHZkcykKK3sKKwlzdHJ1Y3QgZGlza19saXN0ICpkbDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJdmctPnB2X2NvdW50ID0gMDsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2ZHMpIHsKKwkJaWYgKCEocHZsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnB2bCkpKSB8fAorCQkgICAgIShwdmwtPnB2ID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqcHZsLT5wdikpKSkKKwkJCXJldHVybl8wOworCisJCWlmICghaW1wb3J0X3B2KGZtdCwgbWVtLCBkbC0+ZGV2LCB2ZywgcHZsLT5wdiwgJmRsLT5wdmQsICZkbC0+dmdkKSkKKwkJCXJldHVybl8wOworCisJCXB2bC0+cHYtPmZtdCA9IGZtdDsKKwkJYWRkX3B2bF90b192Z3ModmcsIHB2bCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKl9hZGRfbHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgICBzdHJ1Y3QgbHZfZGlzayAqbHZkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisKKwlpZiAoIShsdiA9IGFsbG9jX2x2KG1lbSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWx2aWRfZnJvbV9sdm51bSgmbHYtPmx2aWQsICZ2Zy0+aWQsIGx2ZC0+bHZfbnVtYmVyKTsKKworCWlmICghaW1wb3J0X2x2KHZnLT5jbWQsIG1lbSwgbHYsIGx2ZCkpIAorCQlnb3RvX2JhZDsKKworCWlmICghbGlua19sdl90b192Zyh2ZywgbHYpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiBsdjsKK2JhZDoKKwlkbV9wb29sX2ZyZWUobWVtLCBsdik7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBpbXBvcnRfbHZzKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgZG1fbGlzdCAqcHZkcykKK3sKKwlzdHJ1Y3QgZGlza19saXN0ICpkbDsKKwlzdHJ1Y3QgbHZkX2xpc3QgKmxsOworCXN0cnVjdCBsdl9kaXNrICpsdmQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2ZHMpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxsLCAmZGwtPmx2ZHMpIHsKKwkJCWx2ZCA9ICZsbC0+bHZkOworCisJCQlpZiAoIWZpbmRfbHYodmcsIChjaGFyICopbHZkLT5sdl9uYW1lKSAmJgorCQkJICAgICFfYWRkX2x2KG1lbSwgdmcsIGx2ZCkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRklYTUU6IHRpZHkgKi8KK2ludCBleHBvcnRfbHZzKHN0cnVjdCBkaXNrX2xpc3QgKmRsLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIGNvbnN0IGNoYXIgKmRldl9kaXIpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBsdl9saXN0ICpsbDsKKwlzdHJ1Y3QgbHZkX2xpc3QgKmx2ZGw7CisJc2l6ZV90IGxlbjsKKwl1aW50MzJfdCBsdl9udW07CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2ZF9oYXNoOworCisJaWYgKCFfY2hlY2tfdmdfbmFtZSh2Zy0+bmFtZSkpCisJCXJldHVybl8wOworCisJaWYgKCEobHZkX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgzMikpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogc2V0dXAgdGhlIHB2J3MgZXh0ZW50cyBhcnJheQorCSAqLworCWxlbiA9IHNpemVvZihzdHJ1Y3QgcGVfZGlzaykgKiBkbC0+cHZkLnBlX3RvdGFsOworCWlmICghKGRsLT5leHRlbnRzID0gZG1fcG9vbF96YWxsb2MoZGwtPm1lbSwgbGVuKSkpCisJCWdvdG9fb3V0OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxsLCAmdmctPmx2cykgeworCQlpZiAobGwtPmx2LT5zdGF0dXMgJiBTTkFQU0hPVCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGx2ZGwgPSBkbV9wb29sX2FsbG9jKGRsLT5tZW0sIHNpemVvZigqbHZkbCkpKSkKKwkJCWdvdG9fb3V0OworCisJCV9leHBvcnRfbHYoJmx2ZGwtPmx2ZCwgdmcsIGxsLT5sdiwgZGV2X2Rpcik7CisKKwkJbHZfbnVtID0gbHZudW1fZnJvbV9sdmlkKCZsbC0+bHYtPmx2aWQpOworCQlsdmRsLT5sdmQubHZfbnVtYmVyID0gbHZfbnVtOworCisJCWlmICghZG1faGFzaF9pbnNlcnQobHZkX2hhc2gsIGxsLT5sdi0+bmFtZSwgJmx2ZGwtPmx2ZCkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWV4cG9ydF9leHRlbnRzKGRsLCBsdl9udW0gKyAxLCBsbC0+bHYsIHB2KSkKKwkJCWdvdG9fb3V0OworCisJCWlmIChsdl9pc19vcmlnaW4obGwtPmx2KSkKKwkJCWx2ZGwtPmx2ZC5sdl9hY2Nlc3MgfD0gTFZfU05BUFNIT1RfT1JHOworCisJCWlmIChsdl9pc19jb3cobGwtPmx2KSkgeworCQkJbHZkbC0+bHZkLmx2X2FjY2VzcyB8PSBMVl9TTkFQU0hPVDsKKwkJCWx2ZGwtPmx2ZC5sdl9jaHVua19zaXplID0gbGwtPmx2LT5zbmFwc2hvdC0+Y2h1bmtfc2l6ZTsKKwkJCWx2ZGwtPmx2ZC5sdl9zbmFwc2hvdF9taW5vciA9CisJCQkgICAgbHZudW1fZnJvbV9sdmlkKCZsbC0+bHYtPnNuYXBzaG90LT5vcmlnaW4tPmx2aWQpOworCQl9CisKKwkJZG1fbGlzdF9hZGQoJmRsLT5sdmRzLCAmbHZkbC0+bGlzdCk7CisJCWRsLT5wdmQubHZfY3VyKys7CisJfQorCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlkbV9oYXNoX2Rlc3Ryb3kobHZkX2hhc2gpOworCXJldHVybiByOworfQorCisvKgorICogRklYTUU6IE1vcmUgaW5lZmZpY2llbnQgY29kZS4KKyAqLworaW50IGltcG9ydF9zbmFwc2hvdHMoc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICAgc3RydWN0IGRtX2xpc3QgKnB2ZHMpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdnNbTUFYX0xWXSA9IHsgMCB9OworCXN0cnVjdCBkaXNrX2xpc3QgKmRsOworCXN0cnVjdCBsdmRfbGlzdCAqbGw7CisJc3RydWN0IGx2X2Rpc2sgKmx2ZDsKKwlpbnQgbHZudW07CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmcsICpjb3c7CisKKwkvKiBidWlsZCBhbiBpbmRleCBvZiBsdiBudW1iZXJzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCBwdmRzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsbCwgJmRsLT5sdmRzKSB7CisJCQlsdmQgPSAmbGwtPmx2ZDsKKworCQkJbHZudW0gPSBsdmQtPmx2X251bWJlcjsKKworCQkJaWYgKGx2bnVtID49IE1BWF9MVikgeworCQkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgbnVtYmVyICIKKwkJCQkJICAib3V0IG9mIGJvdW5kcy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKCFsdnNbbHZudW1dICYmCisJCQkgICAgIShsdnNbbHZudW1dID0gZmluZF9sdih2ZywgKGNoYXIgKilsdmQtPmx2X25hbWUpKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBsb2dpY2FsIHZvbHVtZSAnJXMnLiIsCisJCQkJCSAgbHZkLT5sdl9uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogTm93IGl0ZXJhdGUgdGhyb3VnaCB5ZXQgYWdhaW4gYWRkaW5nIHRoZSBzbmFwc2hvdHMuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCBwdmRzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsbCwgJmRsLT5sdmRzKSB7CisJCQlsdmQgPSAmbGwtPmx2ZDsKKworCQkJaWYgKCEobHZkLT5sdl9hY2Nlc3MgJiBMVl9TTkFQU0hPVCkpCisJCQkJY29udGludWU7CisKKwkJCWx2bnVtID0gbHZkLT5sdl9udW1iZXI7CisJCQljb3cgPSBsdnNbbHZudW1dOworCQkJaWYgKCEob3JnID0gbHZzW2x2ZC0+bHZfc25hcHNob3RfbWlub3JdKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBvcmlnaW4gbG9naWNhbCB2b2x1bWUgIgorCQkJCQkgICJmb3Igc25hcHNob3QgJyVzJy4iLCBsdmQtPmx2X25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiB3ZSBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgc25hcHNob3QgKi8KKwkJCWlmIChsdl9pc19jb3coY293KSkKKwkJCQljb250aW51ZTsKKworCQkJLyogaW5zZXJ0IHRoZSBzbmFwc2hvdCAqLworCQkJaWYgKCF2Z19hZGRfc25hcHNob3Qob3JnLCBjb3csIE5VTEwsCisJCQkJCSAgICAgb3JnLT5sZV9jb3VudCwKKwkJCQkJICAgICBsdmQtPmx2X2NodW5rX3NpemUpKSB7CisJCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhZGQgc25hcHNob3QuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGV4cG9ydF91dWlkcyhzdHJ1Y3QgZGlza19saXN0ICpkbCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHV1aWRfbGlzdCAqdWw7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmICghKHVsID0gZG1fcG9vbF9hbGxvYyhkbC0+bWVtLCBzaXplb2YoKnVsKSkpKQorCQkJcmV0dXJuXzA7CisKKwkJbWVtc2V0KHVsLT51dWlkLCAwLCBzaXplb2YodWwtPnV1aWQpKTsKKwkJbWVtY3B5KHVsLT51dWlkLCBwdmwtPnB2LT5pZC51dWlkLCBJRF9MRU4pOworCisJCWRtX2xpc3RfYWRkKCZkbC0+dXVpZHMsICZ1bC0+bGlzdCk7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBjYWxjdWxhdGVzIHRoZSBuYXN0eSBwdl9udW1iZXIgZmllbGQKKyAqIHVzZWQgYnkgTFZNMS4KKyAqLwordm9pZCBleHBvcnRfbnVtYmVycyhzdHJ1Y3QgZG1fbGlzdCAqcHZkcywgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisJaW50IHB2X251bSA9IDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2ZHMpCisJCWRsLT5wdmQucHZfbnVtYmVyID0gcHZfbnVtKys7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdmdfZGlzay0+cHZfYWN0LgorICovCit2b2lkIGV4cG9ydF9wdl9hY3Qoc3RydWN0IGRtX2xpc3QgKnB2ZHMpCit7CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisJaW50IGFjdCA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2ZHMpCisJCWlmIChkbC0+cHZkLnB2X3N0YXR1cyAmIFBWX0FDVElWRSkKKwkJCWFjdCsrOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCBwdmRzKQorCQlkbC0+dmdkLnB2X2FjdCA9IGFjdDsKK30KKworaW50IGV4cG9ydF92Z19udW1iZXIoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3QgZG1fbGlzdCAqcHZkcywKKwkJICAgICBjb25zdCBjaGFyICp2Z19uYW1lLCBzdHJ1Y3QgZGV2X2ZpbHRlciAqZmlsdGVyKQoreworCXN0cnVjdCBkaXNrX2xpc3QgKmRsOworCWludCB2Z19udW07CisKKwlpZiAoIWdldF9mcmVlX3ZnX251bWJlcihmaWQsIGZpbHRlciwgdmdfbmFtZSwgJnZnX251bSkpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsLCBwdmRzKQorCQlkbC0+dmdkLnZnX251bWJlciA9IHZnX251bTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdDEvaW1wb3J0LWV4dGVudHMuYyBiL2xpYi9mb3JtYXQxL2ltcG9ydC1leHRlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhZDRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXQxL2ltcG9ydC1leHRlbnRzLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkaXNrLXJlcC5oIgorI2luY2x1ZGUgImx2X2FsbG9jLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKworLyoKKyAqIEFmdGVyIG11Y2ggdGhvdWdodCBJIGhhdmUgZGVjaWRlZCBpdCBpcyBlYXNpZXIsCisgKiBhbmQgcHJvYmFibHkgbm8gbGVzcyBlZmZpY2llbnQsIHRvIGNvbnZlcnQgdGhlCisgKiBwZS0+bGUgbWFwIHRvIGEgZnVsbCBsZS0+cGUgbWFwLCBhbmQgdGhlbgorICogcHJvY2VzcyB0aGlzIHRvIGdldCB0aGUgc2VnbWVudHMgZm9ybSB0aGF0CisgKiB3ZSdyZSBhZnRlci4gIEFueSBjb2RlIHdoaWNoIGdvZXMgZGlyZWN0bHkgZnJvbQorICogdGhlIHBlLT5sZSBtYXAgdG8gc2VnbWVudHMgd291bGQgYmUgZ2xhZGx5CisgKiBhY2NlcHRlZCwgaWYgaXQgaXMgbGVzcyBjb21wbGljYXRlZCB0aGFuIHRoaXMKKyAqIGZpbGUuCisgKi8KK3N0cnVjdCBwZV9zcGVjaWZpZXIgeworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXVpbnQzMl90IHBlOworfTsKKworc3RydWN0IGx2X21hcCB7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwl1aW50MzJfdCBzdHJpcGVzOworCXVpbnQzMl90IHN0cmlwZV9zaXplOworCXN0cnVjdCBwZV9zcGVjaWZpZXIgKm1hcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX2NyZWF0ZV9sdl9tYXBzKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCSAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKm1hcHMgPSBkbV9oYXNoX2NyZWF0ZSgzMik7CisJc3RydWN0IGx2X2xpc3QgKmxsOworCXN0cnVjdCBsdl9tYXAgKmx2bTsKKworCWlmICghbWFwcykgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgaGFzaCB0YWJsZSBmb3IgaG9sZGluZyAiCisJCQkgICJleHRlbnQgbWFwcy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxsLCAmdmctPmx2cykgeworCQlpZiAobGwtPmx2LT5zdGF0dXMgJiBTTkFQU0hPVCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGx2bSA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKmx2bSkpKSkKKwkJCWdvdG9fYmFkOworCisJCWx2bS0+bHYgPSBsbC0+bHY7CisJCS8qCisJCSAqIEFsbG9jIDEgZXh0cmEgZWxlbWVudCwgc28gdGhlIGxvb3AgaW4gX2FyZWFfbGVuZ3RoKCkgYW5kCisJCSAqIF9jaGVja19zdHJpcGUoKSBmaW5kcyB0aGUgbGFzdCBtYXAgbWVtYmVyIGFzIG5vbmNvbnRpbnVvdXMuCisJCSAqLworCQlpZiAoIShsdm0tPm1hcCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpsdm0tPm1hcCkKKwkJCQkJICAgICAqIChsbC0+bHYtPmxlX2NvdW50ICsgMSkpKSkKKwkJCWdvdG9fYmFkOworCisJCWlmICghZG1faGFzaF9pbnNlcnQobWFwcywgbGwtPmx2LT5uYW1lLCBsdm0pKQorCQkJZ290b19iYWQ7CisJfQorCisJcmV0dXJuIG1hcHM7CisKKyAgICAgIGJhZDoKKwlkbV9oYXNoX2Rlc3Ryb3kobWFwcyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2ZpbGxfbHZfYXJyYXkoc3RydWN0IGx2X21hcCAqKmx2cywKKwkJCSAgc3RydWN0IGRtX2hhc2hfdGFibGUgKm1hcHMsIHN0cnVjdCBkaXNrX2xpc3QgKmRsKQoreworCXN0cnVjdCBsdmRfbGlzdCAqbGw7CisJc3RydWN0IGx2X21hcCAqbHZtOworCisJbWVtc2V0KGx2cywgMCwgc2l6ZW9mKCpsdnMpICogTUFYX0xWKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsbCwgJmRsLT5sdmRzKSB7CisJCWlmICghKGx2bSA9IGRtX2hhc2hfbG9va3VwKG1hcHMsIHN0cnJjaHIoKGNoYXIgKilsbC0+bHZkLmx2X25hbWUsICcvJykKKwkJCQkJKyAxKSkpIHsKKwkJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICglcykgY29udGFpbnMgYW4gIgorCQkJCSAgInVua25vd24gbG9naWNhbCB2b2x1bWUgKCVzKS4iLAorCQkJCWRldl9uYW1lKGRsLT5kZXYpLCBsbC0+bHZkLmx2X25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlsdm0tPnN0cmlwZXMgPSBsbC0+bHZkLmx2X3N0cmlwZXM7CisJCWx2bS0+c3RyaXBlX3NpemUgPSBsbC0+bHZkLmx2X3N0cmlwZXNpemU7CisKKwkJbHZzW2xsLT5sdmQubHZfbnVtYmVyXSA9IGx2bTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZmlsbF9tYXBzKHN0cnVjdCBkbV9oYXNoX3RhYmxlICptYXBzLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgc3RydWN0IGRtX2xpc3QgKnB2ZHMpCit7CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGx2X21hcCAqbHZtc1tNQVhfTFZdLCAqbHZtOworCXN0cnVjdCBwZV9kaXNrICplOworCXVpbnQzMl90IGksIGx2X251bSwgbGU7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIHB2ZHMpIHsKKwkJaWYgKCEocHYgPSBmaW5kX3B2KHZnLCBkbC0+ZGV2KSkpIHsKKwkJCWxvZ19lcnJvcigiUFYgJXMgbm90IGZvdW5kLiIsIGRsLT5kZXYtPnB2aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZSA9IGRsLT5leHRlbnRzOworCisJCS8qIGJ1aWxkIGFuIGFycmF5IG9mIGx2J3MgZm9yIHRoaXMgcHYgKi8KKwkJaWYgKCFfZmlsbF9sdl9hcnJheShsdm1zLCBtYXBzLCBkbCkpCisJCQlyZXR1cm5fMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGwtPnB2ZC5wZV90b3RhbDsgaSsrKSB7CisJCQlsdl9udW0gPSBlW2ldLmx2X251bTsKKworCQkJaWYgKGx2X251bSA9PSBVTk1BUFBFRF9FWFRFTlQpCisJCQkJY29udGludWU7CisKKwkJCWVsc2UgeworCQkJCWx2X251bS0tOworCQkJCWx2bSA9IGx2bXNbbHZfbnVtXTsKKworCQkJCWlmICghbHZtKSB7CisJCQkJCWxvZ19lcnJvcigiSW52YWxpZCBMViBpbiBleHRlbnQgbWFwICIKKwkJCQkJCSAgIihQViAlcywgUEUgJSIgUFJJdTMyCisJCQkJCQkgICIsIExWICUiIFBSSXUzMgorCQkJCQkJICAiLCBMRSAlIiBQUkl1MzIgIikiLAorCQkJCQkJICBkZXZfbmFtZShwdi0+ZGV2KSwgaSwKKwkJCQkJCSAgbHZfbnVtLCBlW2ldLmxlX251bSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWxlID0gZVtpXS5sZV9udW07CisKKwkJCQlpZiAobGUgPj0gbHZtLT5sdi0+bGVfY291bnQpIHsKKwkJCQkJbG9nX2Vycm9yKCJsb2dpY2FsIGV4dGVudCBudW1iZXIgIgorCQkJCQkJICAib3V0IG9mIGJvdW5kcyIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlpZiAobHZtLT5tYXBbbGVdLnB2KSB7CisJCQkJCWxvZ19lcnJvcigibG9naWNhbCBleHRlbnQgKCV1KSAiCisJCQkJCQkgICJhbHJlYWR5IG1hcHBlZC4iLCBsZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWx2bS0+bWFwW2xlXS5wdiA9IHB2OworCQkJCWx2bS0+bWFwW2xlXS5wZSA9IGk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfc2luZ2xlX21hcChzdHJ1Y3QgbHZfbWFwICpsdm0pCit7CisJdWludDMyX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsdm0tPmx2LT5sZV9jb3VudDsgaSsrKSB7CisJCWlmICghbHZtLT5tYXBbaV0ucHYpIHsKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgKCVzKSBjb250YWlucyBhbiBpbmNvbXBsZXRlICIKKwkJCQkgICJtYXBwaW5nIHRhYmxlLiIsIGx2bS0+bHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfbWFwc19hcmVfY29tcGxldGUoc3RydWN0IGRtX2hhc2hfdGFibGUgKm1hcHMpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKwlzdHJ1Y3QgbHZfbWFwICpsdm07CisKKwlmb3IgKG4gPSBkbV9oYXNoX2dldF9maXJzdChtYXBzKTsgbjsgbiA9IGRtX2hhc2hfZ2V0X25leHQobWFwcywgbikpIHsKKwkJbHZtID0gKHN0cnVjdCBsdl9tYXAgKikgZG1faGFzaF9nZXRfZGF0YShtYXBzLCBuKTsKKworCQlpZiAoIV9jaGVja19zaW5nbGVfbWFwKGx2bSkpCisJCQlyZXR1cm5fMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfYXJlYV9sZW5ndGgoc3RydWN0IGx2X21hcCAqbHZtLCB1aW50MzJfdCBsZSkKK3sKKwl1aW50MzJfdCBsZW4gPSAwOworCisJZG8KKwkJbGVuKys7CisJd2hpbGUgKChsdm0tPm1hcFtsZSArIGxlbl0ucHYgPT0gbHZtLT5tYXBbbGVdLnB2KSAmJgorCQkgKGx2bS0+bWFwW2xlXS5wdiAmJgorCQkgIGx2bS0+bWFwW2xlICsgbGVuXS5wZSA9PSBsdm0tPm1hcFtsZV0ucGUgKyBsZW4pKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfbGluZWFyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbHZfbWFwICpsdm0pCit7CisJdWludDMyX3QgbGUgPSAwLCBsZW47CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCisJaWYgKCEoc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJd2hpbGUgKGxlIDwgbHZtLT5sdi0+bGVfY291bnQpIHsKKwkJbGVuID0gX2FyZWFfbGVuZ3RoKGx2bSwgbGUpOworCisJCWlmICghKHNlZyA9IGFsbG9jX2x2X3NlZ21lbnQoc2VndHlwZSwgbHZtLT5sdiwgbGUsIGxlbiwgMCwgMCwKKwkJCQkJICAgICBOVUxMLCAxLCBsZW4sIDAsIDAsIDAsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbGluZWFyIHNlZ21lbnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9wdihzZWcsIDAsIGx2bS0+bWFwW2xlXS5wdiwKKwkJCQkJICAgIGx2bS0+bWFwW2xlXS5wZSkpCisJCQlyZXR1cm5fMDsKKworCQlkbV9saXN0X2FkZCgmbHZtLT5sdi0+c2VnbWVudHMsICZzZWctPmxpc3QpOworCisJCWxlICs9IHNlZy0+bGVuOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja19zdHJpcGUoc3RydWN0IGx2X21hcCAqbHZtLCB1aW50MzJfdCBhcmVhX2NvdW50LAorCQkJIHVpbnQzMl90IGFyZWFfbGVuLCB1aW50MzJfdCBiYXNlX2xlLAorCQkJIHVpbnQzMl90IHRvdGFsX2FyZWFfbGVuKQoreworCXVpbnQzMl90IHN0OworCisJLyoKKwkgKiBJcyB0aGUgbmV4dCBwaHlzaWNhbCBleHRlbnQgaW4gZXZlcnkgc3RyaXBlIGFkamFjZW50IHRvIHRoZSBsYXN0PworCSAqLworCWZvciAoc3QgPSAwOyBzdCA8IGFyZWFfY291bnQ7IHN0KyspCisJCWlmICgobHZtLT5tYXBbYmFzZV9sZSArIHN0ICogdG90YWxfYXJlYV9sZW4gKyBhcmVhX2xlbl0ucHYgIT0KKwkJICAgICBsdm0tPm1hcFtiYXNlX2xlICsgc3QgKiB0b3RhbF9hcmVhX2xlbl0ucHYpIHx8CisJCSAgICAobHZtLT5tYXBbYmFzZV9sZSArIHN0ICogdG90YWxfYXJlYV9sZW5dLnB2ICYmCisJCSAgICAgbHZtLT5tYXBbYmFzZV9sZSArIHN0ICogdG90YWxfYXJlYV9sZW4gKyBhcmVhX2xlbl0ucGUgIT0KKwkJICAgICBsdm0tPm1hcFtiYXNlX2xlICsgc3QgKiB0b3RhbF9hcmVhX2xlbl0ucGUgKyBhcmVhX2xlbikpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX3N0cmlwZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsdl9tYXAgKmx2bSkKK3sKKwl1aW50MzJfdCBzdCwgZmlyc3RfYXJlYV9sZSA9IDAsIHRvdGFsX2FyZWFfbGVuOworCXVpbnQzMl90IGFyZWFfbGVuOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCS8qCisJICogV29yayBvdXQgb3ZlcmFsbCBzdHJpcGVkIGxlbmd0aAorCSAqLworCWlmIChsdm0tPmx2LT5sZV9jb3VudCAlIGx2bS0+c3RyaXBlcykgeworCQlsb2dfZXJyb3IoIk51bWJlciBvZiBzdHJpcGVzICgldSkgaW5jb21wYXRpYmxlICIKKwkJCSAgIndpdGggbG9naWNhbCBleHRlbnQgY291bnQgKCV1KSBmb3IgJXMiLAorCQkJICBsdm0tPnN0cmlwZXMsIGx2bS0+bHYtPmxlX2NvdW50LCBsdm0tPmx2LT5uYW1lKTsKKwl9CisKKwl0b3RhbF9hcmVhX2xlbiA9IGx2bS0+bHYtPmxlX2NvdW50IC8gbHZtLT5zdHJpcGVzOworCisJaWYgKCEoc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJd2hpbGUgKGZpcnN0X2FyZWFfbGUgPCB0b3RhbF9hcmVhX2xlbikgeworCQlhcmVhX2xlbiA9IDE7CisKKwkJLyoKKwkJICogRmluZCBob3cgbWFueSBleHRlbnRzIGFyZSBjb250aWd1b3VzIGluIGFsbCBzdHJpcGVzCisJCSAqIGFuZCBzbyBjYW4gZm9ybSBwYXJ0IG9mIHRoaXMgc2VnbWVudAorCQkgKi8KKwkJd2hpbGUgKF9jaGVja19zdHJpcGUobHZtLCBsdm0tPnN0cmlwZXMsCisJCQkJICAgICBhcmVhX2xlbiwgZmlyc3RfYXJlYV9sZSwgdG90YWxfYXJlYV9sZW4pKQorCQkJYXJlYV9sZW4rKzsKKworCQlpZiAoIShzZWcgPSBhbGxvY19sdl9zZWdtZW50KHNlZ3R5cGUsIGx2bS0+bHYsCisJCQkJCSAgICAgbHZtLT5zdHJpcGVzICogZmlyc3RfYXJlYV9sZSwKKwkJCQkJICAgICBsdm0tPnN0cmlwZXMgKiBhcmVhX2xlbiwKKwkJCQkJICAgICAwLCBsdm0tPnN0cmlwZV9zaXplLCBOVUxMLAorCQkJCQkgICAgIGx2bS0+c3RyaXBlcywKKwkJCQkJICAgICBhcmVhX2xlbiwgMCwgMCwgMCwgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJpcGVkIHNlZ21lbnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIFNldCB1cCBzdGFydCBwb3NpdGlvbnMgb2YgZWFjaCBzdHJpcGUgaW4gdGhpcyBzZWdtZW50CisJCSAqLworCQlmb3IgKHN0ID0gMDsgc3QgPCBzZWctPmFyZWFfY291bnQ7IHN0KyspCisJCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfcHYoc2VnLCBzdCwKKwkJCSAgICAgIGx2bS0+bWFwW2ZpcnN0X2FyZWFfbGUgKyBzdCAqIHRvdGFsX2FyZWFfbGVuXS5wdiwKKwkJCSAgICAgIGx2bS0+bWFwW2ZpcnN0X2FyZWFfbGUgKyBzdCAqIHRvdGFsX2FyZWFfbGVuXS5wZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJZG1fbGlzdF9hZGQoJmx2bS0+bHYtPnNlZ21lbnRzLCAmc2VnLT5saXN0KTsKKworCQlmaXJzdF9hcmVhX2xlICs9IGFyZWFfbGVuOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9idWlsZF9zZWdtZW50cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGx2X21hcCAqbHZtKQoreworCXJldHVybiAobHZtLT5zdHJpcGVzID4gMSA/IF9yZWFkX3N0cmlwZXMoY21kLCBsdm0pIDoKKwkJX3JlYWRfbGluZWFyKGNtZCwgbHZtKSk7Cit9CisKK3N0YXRpYyBpbnQgX2J1aWxkX2FsbF9zZWdtZW50cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2hhc2hfdGFibGUgKm1hcHMpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqbjsKKwlzdHJ1Y3QgbHZfbWFwICpsdm07CisKKwlmb3IgKG4gPSBkbV9oYXNoX2dldF9maXJzdChtYXBzKTsgbjsgbiA9IGRtX2hhc2hfZ2V0X25leHQobWFwcywgbikpIHsKKwkJbHZtID0gKHN0cnVjdCBsdl9tYXAgKikgZG1faGFzaF9nZXRfZGF0YShtYXBzLCBuKTsKKwkJaWYgKCFfYnVpbGRfc2VnbWVudHMoY21kLCBsdm0pKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBpbXBvcnRfZXh0ZW50cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgIHN0cnVjdCBkbV9saXN0ICpwdmRzKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fcG9vbCAqc2NyYXRjaCA9IGRtX3Bvb2xfY3JlYXRlKCJsdm0xIGltcG9ydF9leHRlbnRzIiwgMTAgKiAxMDI0KTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbWFwczsKKworCWlmICghc2NyYXRjaCkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShtYXBzID0gX2NyZWF0ZV9sdl9tYXBzKHNjcmF0Y2gsIHZnKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBsb2dpY2FsIHZvbHVtZSBtYXBzLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIV9maWxsX21hcHMobWFwcywgdmcsIHB2ZHMpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmlsbCBsb2dpY2FsIHZvbHVtZSBtYXBzLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIV9jaGVja19tYXBzX2FyZV9jb21wbGV0ZShtYXBzKSAmJiAhKHZnLT5zdGF0dXMgJiBQQVJUSUFMX1ZHKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9idWlsZF9hbGxfc2VnbWVudHMoY21kLCBtYXBzKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGJ1aWxkIGV4dGVudCBzZWdtZW50cy4iKTsKKwkJZ290byBvdXQ7CisJfQorCXIgPSAxOworCisgICAgICBvdXQ6CisJaWYgKG1hcHMpCisJCWRtX2hhc2hfZGVzdHJveShtYXBzKTsKKwlkbV9wb29sX2Rlc3Ryb3koc2NyYXRjaCk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0MS9sYXlvdXQuYyBiL2xpYi9mb3JtYXQxL2xheW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9sYXlvdXQuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkaXNrLXJlcC5oIgorCisvKgorICogT25seSB3b3JrcyB3aXRoIHBvd2VycyBvZiAyLgorICovCitzdGF0aWMgdWludDMyX3QgX3JvdW5kX3VwKHVpbnQzMl90IG4sIHVpbnQzMl90IHNpemUpCit7CisJc2l6ZS0tOworCXJldHVybiAobiArIHNpemUpICYgfnNpemU7Cit9CisKKy8qIFVudXNlZC4KK3N0YXRpYyB1aW50MzJfdCBfZGl2X3VwKHVpbnQzMl90IG4sIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIF9yb3VuZF91cChuLCBzaXplKSAvIHNpemU7Cit9CisqLworCisvKgorICogRWFjaCBjaHVuayBvZiBtZXRhZGF0YSBzaG91bGQgYmUgYWxpZ25lZCB0bworICogTUVUQURBVEFfQUxJR04uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfbmV4dF9iYXNlKHN0cnVjdCBkYXRhX2FyZWEgKmFyZWEpCit7CisJcmV0dXJuIF9yb3VuZF91cChhcmVhLT5iYXNlICsgYXJlYS0+c2l6ZSwgTUVUQURBVEFfQUxJR04pOworfQorCisvKgorICogUXVpY2sgY2FsY3VsYXRpb24gYmFzZWQgb24gcGVfc3RhcnQuCisgKi8KK3N0YXRpYyBpbnQgX2FkanVzdF9wZV9vbl9kaXNrKHN0cnVjdCBwdl9kaXNrICpwdmQpCit7CisJdWludDMyX3QgcGVfc3RhcnQgPSBwdmQtPnBlX3N0YXJ0IDw8IFNFQ1RPUl9TSElGVDsKKworCWlmIChwZV9zdGFydCA8IHB2ZC0+cGVfb25fZGlzay5iYXNlICsgcHZkLT5wZV9vbl9kaXNrLnNpemUpCisJCXJldHVybiAwOworCisJcHZkLT5wZV9vbl9kaXNrLnNpemUgPSBwZV9zdGFydCAtIHB2ZC0+cGVfb25fZGlzay5iYXNlOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfY2FsY19zaW1wbGVfbGF5b3V0KHN0cnVjdCBwdl9kaXNrICpwdmQpCit7CisJcHZkLT5wdl9vbl9kaXNrLmJhc2UgPSBNRVRBREFUQV9CQVNFOworCXB2ZC0+cHZfb25fZGlzay5zaXplID0gUFZfU0laRTsKKworCXB2ZC0+dmdfb25fZGlzay5iYXNlID0gX25leHRfYmFzZSgmcHZkLT5wdl9vbl9kaXNrKTsKKwlwdmQtPnZnX29uX2Rpc2suc2l6ZSA9IFZHX1NJWkU7CisKKwlwdmQtPnB2X3V1aWRsaXN0X29uX2Rpc2suYmFzZSA9IF9uZXh0X2Jhc2UoJnB2ZC0+dmdfb25fZGlzayk7CisJcHZkLT5wdl91dWlkbGlzdF9vbl9kaXNrLnNpemUgPSBNQVhfUFYgKiBOQU1FX0xFTjsKKworCXB2ZC0+bHZfb25fZGlzay5iYXNlID0gX25leHRfYmFzZSgmcHZkLT5wdl91dWlkbGlzdF9vbl9kaXNrKTsKKwlwdmQtPmx2X29uX2Rpc2suc2l6ZSA9IE1BWF9MViAqIHNpemVvZihzdHJ1Y3QgbHZfZGlzayk7CisKKwlwdmQtPnBlX29uX2Rpc2suYmFzZSA9IF9uZXh0X2Jhc2UoJnB2ZC0+bHZfb25fZGlzayk7CisJcHZkLT5wZV9vbl9kaXNrLnNpemUgPSBwdmQtPnBlX3RvdGFsICogc2l6ZW9mKHN0cnVjdCBwZV9kaXNrKTsKK30KKworc3RhdGljIGludCBfY2hlY2tfdmdfbGltaXRzKHN0cnVjdCBkaXNrX2xpc3QgKmRsKQoreworCWlmIChkbC0+dmdkLmx2X21heCA+IE1BWF9MVikgeworCQlsb2dfZXJyb3IoIk1heExvZ2ljYWxWb2x1bWVzIG9mICVkIGV4Y2VlZHMgZm9ybWF0IGxpbWl0IG9mICVkICIKKwkJCSAgImZvciBWRyAnJXMnIiwgZGwtPnZnZC5sdl9tYXgsIE1BWF9MViAtIDEsCisJCQkgIGRsLT5wdmQudmdfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbC0+dmdkLnB2X21heCA+IE1BWF9QVikgeworCQlsb2dfZXJyb3IoIk1heFBoeXNpY2FsVm9sdW1lcyBvZiAlZCBleGNlZWRzIGZvcm1hdCBsaW1pdCBvZiAlZCAiCisJCQkgICJmb3IgVkcgJyVzJyIsIGRsLT52Z2QucHZfbWF4LCBNQVhfUFYgLSAxLAorCQkJICBkbC0+cHZkLnZnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoaXMgYXNzdW1lcyBwZV9jb3VudCBhbmQgcGVfc3RhcnQgaGF2ZSBhbHJlYWR5CisgKiBiZWVuIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgorICovCitpbnQgY2FsY3VsYXRlX2xheW91dChzdHJ1Y3QgZGlza19saXN0ICpkbCkKK3sKKwlzdHJ1Y3QgcHZfZGlzayAqcHZkID0gJmRsLT5wdmQ7CisKKwlfY2FsY19zaW1wbGVfbGF5b3V0KHB2ZCk7CisJaWYgKCFfYWRqdXN0X3BlX29uX2Rpc2socHZkKSkgeworCQlsb2dfZXJyb3IoIkluc3VmZmljaWVudCBzcGFjZSBmb3IgbWV0YWRhdGEgYW5kIFBFJ3MuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghX2NoZWNrX3ZnX2xpbWl0cyhkbCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGV4dGVudHMgdGhhdCBjYW4gZml0IG9uIGEgZGlzayBpcyBtZXRhZGF0YSBmb3JtYXQgZGVwZW5kYW50LgorICogcGVfc3RhcnQgaXMgYW55IGV4aXN0aW5nIHZhbHVlIGZvciBwZV9zdGFydAorICovCitpbnQgY2FsY3VsYXRlX2V4dGVudF9jb3VudChzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgdWludDMyX3QgZXh0ZW50X3NpemUsCisJCQkgICB1aW50MzJfdCBtYXhfZXh0ZW50X2NvdW50LCB1aW50NjRfdCBwZV9zdGFydCkKK3sKKwlzdHJ1Y3QgcHZfZGlzayAqcHZkID0gZG1fbWFsbG9jKHNpemVvZigqcHZkKSk7CisJdWludDMyX3QgZW5kOworCisJaWYgKCFwdmQpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBHdWVzcyBob3cgbWFueSBleHRlbnRzIHdpbGwgZml0LCBiZWFyaW5nIGluIG1pbmQgdGhhdAorCSAqIG9uZSBpcyBnb2luZyB0byBiZSBrbm9ja2VkIG9mZiBhdCB0aGUgc3RhcnQgb2YgdGhlCisJICogbmV4dCBsb29wLgorCSAqLworCWlmIChtYXhfZXh0ZW50X2NvdW50KQorCQlwdmQtPnBlX3RvdGFsID0gbWF4X2V4dGVudF9jb3VudCArIDE7CisJZWxzZQorCQlwdmQtPnBlX3RvdGFsID0gKHB2LT5zaXplIC8gZXh0ZW50X3NpemUpOworCisJaWYgKHB2ZC0+cGVfdG90YWwgPCBQRV9TSVpFX1BWX1NJWkVfUkVMKSB7CisJCWxvZ19lcnJvcigiVG9vIGZldyBleHRlbnRzIG9uICVzLiAgVHJ5IHNtYWxsZXIgZXh0ZW50IHNpemUuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpKTsKKwkJZG1fZnJlZShwdmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbyB7CisJCXB2ZC0+cGVfdG90YWwtLTsKKwkJX2NhbGNfc2ltcGxlX2xheW91dChwdmQpOworCQllbmQgPSAoKHB2ZC0+cGVfb25fZGlzay5iYXNlICsgcHZkLT5wZV9vbl9kaXNrLnNpemUgKworCQkJU0VDVE9SX1NJWkUgLSAxKSA+PiBTRUNUT1JfU0hJRlQpOworCisJCWlmIChwZV9zdGFydCAmJiBlbmQgPCBwZV9zdGFydCkKKwkJCWVuZCA9IHBlX3N0YXJ0OworCisJCXB2ZC0+cGVfc3RhcnQgPSBfcm91bmRfdXAoZW5kLCBMVk0xX1BFX0FMSUdOKTsKKworCX0gd2hpbGUgKChwdmQtPnBlX3N0YXJ0ICsgKCh1aW50NjRfdClwdmQtPnBlX3RvdGFsICogZXh0ZW50X3NpemUpKQorCQkgPiBwdi0+c2l6ZSk7CisKKwlpZiAocHZkLT5wZV90b3RhbCA+IE1BWF9QRV9UT1RBTCkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGV4dGVudCBsaW1pdCAoJXUpIGV4Y2VlZGVkIGZvciAlcyAtICIKKwkJCSAgIiV1IHJlcXVpcmVkIiwgTUFYX1BFX1RPVEFMLCBwdl9kZXZfbmFtZShwdiksCisJCQkgIHB2ZC0+cGVfdG90YWwpOworCQlkbV9mcmVlKHB2ZCk7CisJCXJldHVybiAwOworCX0KKworCXB2LT5wZV9jb3VudCA9IHB2ZC0+cGVfdG90YWw7CisJcHYtPnBlX3N0YXJ0ID0gcHZkLT5wZV9zdGFydDsKKwkvKiBXZSBjYW4ndCBzZXQgcGVfc2l6ZSBoZXJlIHdpdGhvdXQgYnJlYWtpbmcgTFZNMSBjb21wYXRpYmlsaXR5ICovCisJZG1fZnJlZShwdmQpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdDEvbHZtMS1sYWJlbC5jIGIvbGliL2Zvcm1hdDEvbHZtMS1sYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2UxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9sdm0xLWxhYmVsLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibHZtMS1sYWJlbC5oIgorI2luY2x1ZGUgImRpc2stcmVwLmgiCisjaW5jbHVkZSAibGFiZWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInhsYXRlLmgiCisjaW5jbHVkZSAiZm9ybWF0MS5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgdm9pZCBfbm90X3N1cHBvcnRlZChjb25zdCBjaGFyICpvcCkKK3sKKwlsb2dfZXJyb3IoIlRoZSAnJXMnIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgbHZtMSBsYWJlbGxlci4iLAorCQkgIG9wKTsKK30KKworc3RhdGljIGludCBfbHZtMV9jYW5faGFuZGxlKHN0cnVjdCBsYWJlbGxlciAqbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdm9pZCAqYnVmLCB1aW50NjRfdCBzZWN0b3IpCit7CisJc3RydWN0IHB2X2Rpc2sgKnB2ZCA9IChzdHJ1Y3QgcHZfZGlzayAqKSBidWY7CisJdWludDMyX3QgdmVyc2lvbjsKKworCS8qIExWTTEgbGFiZWwgbXVzdCBhbHdheXMgYmUgaW4gZmlyc3Qgc2VjdG9yICovCisJaWYgKHNlY3RvcikKKwkJcmV0dXJuIDA7CisKKwl2ZXJzaW9uID0geGxhdGUxNihwdmQtPnZlcnNpb24pOworCisJaWYgKHB2ZC0+aWRbMF0gPT0gJ0gnICYmIHB2ZC0+aWRbMV0gPT0gJ00nICYmCisJICAgICh2ZXJzaW9uID09IDEgfHwgdmVyc2lvbiA9PSAyKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbHZtMV93cml0ZShzdHJ1Y3QgbGFiZWwgKmxhYmVsIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCB2b2lkICpidWYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJX25vdF9zdXBwb3J0ZWQoIndyaXRlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2x2bTFfcmVhZChzdHJ1Y3QgbGFiZWxsZXIgKmwsIHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYnVmLAorCQkgc3RydWN0IGxhYmVsICoqbGFiZWwpCit7CisJc3RydWN0IHB2X2Rpc2sgKnB2ZCA9IChzdHJ1Y3QgcHZfZGlzayAqKSBidWY7CisJc3RydWN0IHZnX2Rpc2sgdmdkOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKnZnaWQgPSBGTVRfTFZNMV9PUlBIQU5fVkdfTkFNRTsKKwljb25zdCBjaGFyICp2Z25hbWUgPSBGTVRfTFZNMV9PUlBIQU5fVkdfTkFNRTsKKwl1bnNpZ25lZCBleHBvcnRlZCA9IDA7CisKKwltdW5nZV9wdmQoZGV2LCBwdmQpOworCisJaWYgKCpwdmQtPnZnX25hbWUpIHsKKwkJaWYgKCFyZWFkX3ZnZChkZXYsICZ2Z2QsIHB2ZCkpCisJCQlyZXR1cm5fMDsKKwkJdmdpZCA9IChjaGFyICopIHZnZC52Z191dWlkOworCQl2Z25hbWUgPSAoY2hhciAqKSBwdmQtPnZnX25hbWU7CisJCWV4cG9ydGVkID0gcHZkLT5wdl9zdGF0dXMgJiBWR19FWFBPUlRFRDsKKwl9CisKKwlpZiAoIShpbmZvID0gbHZtY2FjaGVfYWRkKGwsIChjaGFyICopcHZkLT5wdl91dWlkLCBkZXYsIHZnbmFtZSwgdmdpZCwKKwkJCQkgIGV4cG9ydGVkKSkpCisJCXJldHVybl8wOworCSpsYWJlbCA9IGx2bWNhY2hlX2dldF9sYWJlbChpbmZvKTsKKworCWx2bWNhY2hlX3NldF9kZXZpY2Vfc2l6ZShpbmZvLCAoKHVpbnQ2NF90KXhsYXRlMzIocHZkLT5wdl9zaXplKSkgPDwgU0VDVE9SX1NISUZUKTsKKwlsdm1jYWNoZV9zZXRfZXh0X3ZlcnNpb24oaW5mbywgMCk7CisJbHZtY2FjaGVfc2V0X2V4dF9mbGFncyhpbmZvLCAwKTsKKwlsdm1jYWNoZV9kZWxfbWRhcyhpbmZvKTsKKwlsdm1jYWNoZV9kZWxfYmFzKGluZm8pOworCWx2bWNhY2hlX21ha2VfdmFsaWQoaW5mbyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZtMV9pbml0aWFsaXNlX2xhYmVsKHN0cnVjdCBsYWJlbGxlciAqbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGxhYmVsICpsYWJlbCkKK3sKKwlzdHJjcHkobGFiZWwtPnR5cGUsICJMVk0xIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2x2bTFfZGVzdHJveV9sYWJlbChzdHJ1Y3QgbGFiZWxsZXIgKmwgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBsYWJlbCAqbGFiZWwgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9sdm0xX2Rlc3Ryb3koc3RydWN0IGxhYmVsbGVyICpsKQoreworCWRtX2ZyZWUobCk7Cit9CisKK3N0cnVjdCBsYWJlbF9vcHMgX2x2bTFfb3BzID0geworCS5jYW5faGFuZGxlID0gX2x2bTFfY2FuX2hhbmRsZSwKKwkud3JpdGUgPSBfbHZtMV93cml0ZSwKKwkucmVhZCA9IF9sdm0xX3JlYWQsCisJLnZlcmlmeSA9IF9sdm0xX2Nhbl9oYW5kbGUsCisJLmluaXRpYWxpc2VfbGFiZWwgPSBfbHZtMV9pbml0aWFsaXNlX2xhYmVsLAorCS5kZXN0cm95X2xhYmVsID0gX2x2bTFfZGVzdHJveV9sYWJlbCwKKwkuZGVzdHJveSA9IF9sdm0xX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3QgbGFiZWxsZXIgKmx2bTFfbGFiZWxsZXJfY3JlYXRlKHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCXN0cnVjdCBsYWJlbGxlciAqbDsKKworCWlmICghKGwgPSBkbV9tYWxsb2Moc2l6ZW9mKCpsKSkpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgbGFiZWxsZXIgb2JqZWN0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsLT5vcHMgPSAmX2x2bTFfb3BzOworCWwtPmZtdCA9IGZtdDsKKworCXJldHVybiBsOworfQpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdDEvbHZtMS1sYWJlbC5oIGIvbGliL2Zvcm1hdDEvbHZtMS1sYWJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjJmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0MS9sdm0xLWxhYmVsLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9MVk0xX0xBQkVMX0gKKyNkZWZpbmUgX0xWTV9MVk0xX0xBQkVMX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKK3N0cnVjdCBsYWJlbGxlciAqbHZtMV9sYWJlbGxlcl9jcmVhdGUoc3RydWN0IGZvcm1hdF90eXBlICpmbXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXQxL3ZnX251bWJlci5jIGIvbGliL2Zvcm1hdDEvdmdfbnVtYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxYTgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXQxL3ZnX251bWJlci5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGlzay1yZXAuaCIKKworLyoKKyAqIEZJWE1FOiBRdWljayBoYWNrLiAgV2UgY2FuIHVzZSBjYWNoaW5nIHRvCisgKiBwcmV2ZW50IGEgdG90YWwgcmUtcmVhZCwgZXZlbiBzbyB2Z19udW1iZXIKKyAqIGNhdXNlcyB0aGUgdG9vbHMgdG8gY2hlY2sgKmV2ZXJ5KiBwdi4gIFl1Y2suCisgKiBQdXQgaW4gc2VwYXJhdGUgZmlsZSBzbyBpdCB3b3VsZG4ndCBjb250YW1pbmF0ZQorICogb3RoZXIgY29kZS4KKyAqLworaW50IGdldF9mcmVlX3ZnX251bWJlcihzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsIHN0cnVjdCBkZXZfZmlsdGVyICpmaWx0ZXIsCisJCSAgICAgICBjb25zdCBjaGFyICpjYW5kaWRhdGVfdmcsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBkbV9saXN0IGFsbF9wdnM7CisJc3RydWN0IGRpc2tfbGlzdCAqZGw7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJsdm0xIHZnX251bWJlciIsIDEwICogMTAyNCk7CisJaW50IGksIHIgPSAwLCBudW1iZXJzW01BWF9WR10gPSB7IDAgfTsKKworCWRtX2xpc3RfaW5pdCgmYWxsX3B2cyk7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXJlYWRfcHZzX2luX3ZnKGZpZC0+Zm10LCBOVUxMLCBmaWx0ZXIsIG1lbSwgJmFsbF9wdnMpKQorCQlnb3RvX291dDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkbCwgJmFsbF9wdnMpIHsKKwkJaWYgKCEqZGwtPnB2ZC52Z19uYW1lIHx8ICFzdHJjbXAoKGNoYXIgKilkbC0+cHZkLnZnX25hbWUsIGNhbmRpZGF0ZV92ZykpCisJCQljb250aW51ZTsKKworCQludW1iZXJzW2RsLT52Z2QudmdfbnVtYmVyXSA9IDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9WRzsgaSsrKSB7CisJCWlmICghbnVtYmVyc1tpXSkgeworCQkJciA9IDE7CisJCQkqcmVzdWx0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisgICAgICBvdXQ6CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3Bvb2wvLmV4cG9ydGVkX3N5bWJvbHMgYi9saWIvZm9ybWF0X3Bvb2wvLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmYWMyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfcG9vbC8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxIEBACitpbml0X2Zvcm1hdApkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF9wb29sL01ha2VmaWxlLmluIGIvbGliL2Zvcm1hdF9wb29sL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDFiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVMgPVwKKwlkaXNrX3JlcC5jIFwKKwlmb3JtYXRfcG9vbC5jIFwKKwlpbXBvcnRfZXhwb3J0LmMgXAorCXBvb2xfbGFiZWwuYworCitMSUJfU0hBUkVEID0gbGlibHZtMmZvcm1hdHBvb2wuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMl9wbHVnaW4KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfcG9vbC9kaXNrX3JlcC5jIGIvbGliL2Zvcm1hdF9wb29sL2Rpc2tfcmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MmViNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfcG9vbC9kaXNrX3JlcC5jCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgInhsYXRlLmgiCisjaW5jbHVkZSAiZGlza19yZXAuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIEZJWE1FOiBtZW1jcHkgbWlnaHQgbm90IGJlIHBvcnRhYmxlICovCisjZGVmaW5lIENQSU5fOCh4LCB5LCB6KSB7bWVtY3B5KCh4KSwgKHkpLCAoeikpO30KKyNkZWZpbmUgQ1BPVVRfOCh4LCB5LCB6KSB7bWVtY3B5KCh5KSwgKHgpLCAoeikpO30KKyNkZWZpbmUgQ1BJTl8xNih4LCB5KSB7KHgpID0geGxhdGUxNl9iZSgoeSkpO30KKyNkZWZpbmUgQ1BPVVRfMTYoeCwgeSkgeyh5KSA9IHhsYXRlMTZfYmUoKHgpKTt9CisjZGVmaW5lIENQSU5fMzIoeCwgeSkgeyh4KSA9IHhsYXRlMzJfYmUoKHkpKTt9CisjZGVmaW5lIENQT1VUXzMyKHgsIHkpIHsoeSkgPSB4bGF0ZTMyX2JlKCh4KSk7fQorI2RlZmluZSBDUElOXzY0KHgsIHkpIHsoeCkgPSB4bGF0ZTY0X2JlKCh5KSk7fQorI2RlZmluZSBDUE9VVF82NCh4LCB5KSB7KHkpID0geGxhdGU2NF9iZSgoeCkpO30KKworc3RhdGljIGludCBfX3JlYWRfcG9vbF9kaXNrKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IHBvb2xfbGlzdCAqcGwsCisJCQkgICAgY29uc3QgY2hhciAqdmdfbmFtZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyIGJ1Zls1MTJdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCS8qIEZJWE1FOiBOZWVkIHRvIGNoZWNrIHRoZSBjYWNoZSBoZXJlIGZpcnN0ICovCisJaWYgKCFkZXZfcmVhZChkZXYsIFVJTlQ2NF9DKDApLCA1MTIsIGJ1ZikpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiRmFpbGVkIHRvIHJlYWQgUFYgZGF0YSBmcm9tICVzIiwKKwkJCQkgZGV2X25hbWUoZGV2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVhZF9wb29sX2xhYmVsKHBsLCBmbXQtPmxhYmVsbGVyLCBkZXYsIGJ1ZiwgTlVMTCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9hZGRfcGxfdG9fbGlzdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKmhlYWQsIHN0cnVjdCBwb29sX2xpc3QgKmRhdGEpCit7CisJc3RydWN0IHBvb2xfbGlzdCAqcGw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGwsIGhlYWQpIHsKKwkJaWYgKGlkX2VxdWFsKCZkYXRhLT5wdl91dWlkLCAmcGwtPnB2X3V1aWQpKSB7CisJCQljaGFyIHV1aWRbSURfTEVOICsgN10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcGwtPnB2X3V1aWQsIHV1aWQsIElEX0xFTiArIDcpKQorCQkJCXN0YWNrOworCisJCQlpZiAoIWRldl9zdWJzeXN0ZW1fcGFydF9tYWpvcihjbWQtPmRldl90eXBlcywgZGF0YS0+ZGV2KSkgeworCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIklnbm9yaW5nIGR1cGxpY2F0ZSBQViAlcyBvbiAiCisJCQkJCQkgIiVzIiwgdXVpZCwKKwkJCQkJCSBkZXZfbmFtZShkYXRhLT5kZXYpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlsb2dfdmVyeV92ZXJib3NlKCJEdXBsaWNhdGUgUFYgJXMgLSB1c2luZyAlcyAlcyIsCisJCQkJCSB1dWlkLCBkZXZfc3Vic3lzdGVtX25hbWUoY21kLT5kZXZfdHlwZXMsIGRhdGEtPmRldiksCisJCQkJCSBkZXZfbmFtZShkYXRhLT5kZXYpKTsKKwkJCWRtX2xpc3RfZGVsKCZwbC0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlkbV9saXN0X2FkZChoZWFkLCAmZGF0YS0+bGlzdCk7Cit9CisKK2ludCByZWFkX3Bvb2xfbGFiZWwoc3RydWN0IHBvb2xfbGlzdCAqcGwsIHN0cnVjdCBsYWJlbGxlciAqbCwKKwkJICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBzdHJ1Y3QgbGFiZWwgKipsYWJlbCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaWQgcHZpZDsKKwlzdHJ1Y3QgaWQgdmdpZDsKKwljaGFyIHV1aWRbSURfTEVOICsgN10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBwb29sX2Rpc2sgKnBkID0gJnBsLT5wZDsKKworCXBvb2xfbGFiZWxfaW4ocGQsIGJ1Zik7CisKKwlnZXRfcG9vbF9wdl91dWlkKCZwdmlkLCBwZCk7CisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2aWQsIHV1aWQsIElEX0xFTiArIDcpKQorCQlzdGFjazsKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkNhbGN1bGF0ZWQgdXVpZCAlcyBmb3IgJXMiLCB1dWlkLCBkZXZfbmFtZShkZXYpKTsKKworCWdldF9wb29sX3ZnX3V1aWQoJnZnaWQsIHBkKTsKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmdmdpZCwgdXVpZCwgSURfTEVOICsgNykpCisJCXN0YWNrOworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ2FsY3VsYXRlZCB1dWlkICVzIGZvciAlcyIsIHV1aWQsIHBkLT5wbF9wb29sX25hbWUpOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2FkZChsLCAoY2hhciAqKSAmcHZpZCwgZGV2LCBwZC0+cGxfcG9vbF9uYW1lLAorCQkJCSAgKGNoYXIgKikgJnZnaWQsIDApKSkKKwkJcmV0dXJuXzA7CisJaWYgKGxhYmVsKQorCQkqbGFiZWwgPSBsdm1jYWNoZV9nZXRfbGFiZWwoaW5mbyk7CisKKwlsdm1jYWNoZV9zZXRfZGV2aWNlX3NpemUoaW5mbywgKCh1aW50NjRfdCl4bGF0ZTMyX2JlKHBkLT5wbF9ibG9ja3MpKSA8PCBTRUNUT1JfU0hJRlQpOworCWx2bWNhY2hlX3NldF9leHRfdmVyc2lvbihpbmZvLCAwKTsKKwlsdm1jYWNoZV9zZXRfZXh0X2ZsYWdzKGluZm8sIDApOworCWx2bWNhY2hlX2RlbF9tZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9iYXMoaW5mbyk7CisJbHZtY2FjaGVfbWFrZV92YWxpZChpbmZvKTsKKworCXBsLT5kZXYgPSBkZXY7CisJcGwtPnB2ID0gTlVMTDsKKwltZW1jcHkoJnBsLT5wdl91dWlkLCAmcHZpZCwgc2l6ZW9mKHB2aWQpKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIHBvb2xfbGFiZWxfb3V0IC0gY29waWVzIGEgcG9vbF9sYWJlbF90IGludG8gYSBjaGFyIGJ1ZmZlcgorICogQHBsOiBwdHIgdG8gYSBwb29sX2xhYmVsX3Qgc3RydWN0CisgKiBAYnVmOiBwdHIgdG8gcmF3IHNwYWNlIHdoZXJlIGxhYmVsIGluZm8gd2lsbCBiZSBjb3BpZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGltcG9ydGFudCBiZWNhdXNlIGl0IHRha2VzIGNhcmUgb2YgYWxsIG9mCisgKiB0aGUgZW5kaWFuIGlzc3VlcyB3aGVuIGNvcHlpbmcgdG8gZGlzay4gIFRoaXMgd2F5LCB3aGVuCisgKiBtYWNoaW5lcyBvZiBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyBhcmUgdXNlZCwgdGhleSB3aWxsCisgKiBiZSBhYmxlIHRvIGludGVycHJldCBvbmRpc2sgbGFiZWxzIGNvcnJlY3RseS4gIEFsd2F5cyB1c2UKKyAqIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHdyaXRpbmcgdG8gZGlzay4KKyAqLwordm9pZCBwb29sX2xhYmVsX291dChzdHJ1Y3QgcG9vbF9kaXNrICpwbCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBwb29sX2Rpc2sgKmJ1ZnBsID0gKHN0cnVjdCBwb29sX2Rpc2sgKikgYnVmOworCisJQ1BPVVRfNjQocGwtPnBsX21hZ2ljLCBidWZwbC0+cGxfbWFnaWMpOworCUNQT1VUXzY0KHBsLT5wbF9wb29sX2lkLCBidWZwbC0+cGxfcG9vbF9pZCk7CisJQ1BPVVRfOChwbC0+cGxfcG9vbF9uYW1lLCBidWZwbC0+cGxfcG9vbF9uYW1lLCBQT09MX05BTUVfU0laRSk7CisJQ1BPVVRfMzIocGwtPnBsX3ZlcnNpb24sIGJ1ZnBsLT5wbF92ZXJzaW9uKTsKKwlDUE9VVF8zMihwbC0+cGxfc3VicG9vbHMsIGJ1ZnBsLT5wbF9zdWJwb29scyk7CisJQ1BPVVRfMzIocGwtPnBsX3NwX2lkLCBidWZwbC0+cGxfc3BfaWQpOworCUNQT1VUXzMyKHBsLT5wbF9zcF9kZXZzLCBidWZwbC0+cGxfc3BfZGV2cyk7CisJQ1BPVVRfMzIocGwtPnBsX3NwX2RldmlkLCBidWZwbC0+cGxfc3BfZGV2aWQpOworCUNQT1VUXzMyKHBsLT5wbF9zcF90eXBlLCBidWZwbC0+cGxfc3BfdHlwZSk7CisJQ1BPVVRfNjQocGwtPnBsX2Jsb2NrcywgYnVmcGwtPnBsX2Jsb2Nrcyk7CisJQ1BPVVRfMzIocGwtPnBsX3N0cmlwaW5nLCBidWZwbC0+cGxfc3RyaXBpbmcpOworCUNQT1VUXzMyKHBsLT5wbF9zcF9kbWVwZGV2cywgYnVmcGwtPnBsX3NwX2RtZXBkZXZzKTsKKwlDUE9VVF8zMihwbC0+cGxfc3BfZG1lcGlkLCBidWZwbC0+cGxfc3BfZG1lcGlkKTsKKwlDUE9VVF8zMihwbC0+cGxfc3Bfd2VpZ2h0LCBidWZwbC0+cGxfc3Bfd2VpZ2h0KTsKKwlDUE9VVF8zMihwbC0+cGxfbWlub3IsIGJ1ZnBsLT5wbF9taW5vcik7CisJQ1BPVVRfMzIocGwtPnBsX3BhZGRpbmcsIGJ1ZnBsLT5wbF9wYWRkaW5nKTsKKwlDUE9VVF84KHBsLT5wbF9yZXNlcnZlLCBidWZwbC0+cGxfcmVzZXJ2ZSwgMTg0KTsKK30KKworLyoqCisgKiBwb29sX2xhYmVsX2luIC0gY29waWVzIGEgY2hhciBidWZmZXIgaW50byBhIHBvb2xfbGFiZWxfdAorICogQHBsOiBwdHIgdG8gYSBwb29sX2xhYmVsX3Qgc3RydWN0CisgKiBAYnVmOiBwdHIgdG8gcmF3IHNwYWNlIHdoZXJlIGxhYmVsIGluZm8gaXMgY29waWVkIGZyb20KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGltcG9ydGFudCBiZWNhdXNlIGl0IHRha2VzIGNhcmUgb2YgYWxsIG9mCisgKiB0aGUgZW5kaWFuIGlzc3VlcyB3aGVuIGluZm9ybWF0aW9uIGZyb20gZGlzayBpcyBhYm91dCB0byBiZQorICogdXNlZC4gIFRoaXMgd2F5LCB3aGVuIG1hY2hpbmVzIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzCisgKiBhcmUgdXNlZCwgdGhleSB3aWxsIGJlIGFibGUgdG8gaW50ZXJwcmV0IG9uZGlzayBsYWJlbHMKKyAqIGNvcnJlY3RseS4gIEFsd2F5cyB1c2UgdGhpcyBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgbGFiZWxzIHRoYXQKKyAqIHdlcmUgcmVhZCBmcm9tIGRpc2suCisgKi8KK3ZvaWQgcG9vbF9sYWJlbF9pbihzdHJ1Y3QgcG9vbF9kaXNrICpwbCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBwb29sX2Rpc2sgKmJ1ZnBsID0gKHN0cnVjdCBwb29sX2Rpc2sgKikgYnVmOworCisJQ1BJTl82NChwbC0+cGxfbWFnaWMsIGJ1ZnBsLT5wbF9tYWdpYyk7CisJQ1BJTl82NChwbC0+cGxfcG9vbF9pZCwgYnVmcGwtPnBsX3Bvb2xfaWQpOworCUNQSU5fOChwbC0+cGxfcG9vbF9uYW1lLCBidWZwbC0+cGxfcG9vbF9uYW1lLCBQT09MX05BTUVfU0laRSk7CisJQ1BJTl8zMihwbC0+cGxfdmVyc2lvbiwgYnVmcGwtPnBsX3ZlcnNpb24pOworCUNQSU5fMzIocGwtPnBsX3N1YnBvb2xzLCBidWZwbC0+cGxfc3VicG9vbHMpOworCUNQSU5fMzIocGwtPnBsX3NwX2lkLCBidWZwbC0+cGxfc3BfaWQpOworCUNQSU5fMzIocGwtPnBsX3NwX2RldnMsIGJ1ZnBsLT5wbF9zcF9kZXZzKTsKKwlDUElOXzMyKHBsLT5wbF9zcF9kZXZpZCwgYnVmcGwtPnBsX3NwX2RldmlkKTsKKwlDUElOXzMyKHBsLT5wbF9zcF90eXBlLCBidWZwbC0+cGxfc3BfdHlwZSk7CisJQ1BJTl82NChwbC0+cGxfYmxvY2tzLCBidWZwbC0+cGxfYmxvY2tzKTsKKwlDUElOXzMyKHBsLT5wbF9zdHJpcGluZywgYnVmcGwtPnBsX3N0cmlwaW5nKTsKKwlDUElOXzMyKHBsLT5wbF9zcF9kbWVwZGV2cywgYnVmcGwtPnBsX3NwX2RtZXBkZXZzKTsKKwlDUElOXzMyKHBsLT5wbF9zcF9kbWVwaWQsIGJ1ZnBsLT5wbF9zcF9kbWVwaWQpOworCUNQSU5fMzIocGwtPnBsX3NwX3dlaWdodCwgYnVmcGwtPnBsX3NwX3dlaWdodCk7CisJQ1BJTl8zMihwbC0+cGxfbWlub3IsIGJ1ZnBsLT5wbF9taW5vcik7CisJQ1BJTl8zMihwbC0+cGxfcGFkZGluZywgYnVmcGwtPnBsX3BhZGRpbmcpOworCUNQSU5fOChwbC0+cGxfcmVzZXJ2ZSwgYnVmcGwtPnBsX3Jlc2VydmUsIDE4NCk7Cit9CisKK3N0YXRpYyBjaGFyIF9jYWxjX2NoYXIodW5zaWduZWQgaW50IGlkKQoreworCS8qCisJICogWzAtOUEtWmEteiEjXSAtIDY0IHByaW50YWJsZSBjaGFycyAoNi1iaXRzKQorCSAqLworCisJaWYgKGlkIDwgMTApCisJCXJldHVybiBpZCArIDQ4OworCWlmIChpZCA8IDM2KQorCQlyZXR1cm4gKGlkIC0gMTApICsgNjU7CisJaWYgKGlkIDwgNjIpCisJCXJldHVybiAoaWQgLSAzNikgKyA5NzsKKwlpZiAoaWQgPT0gNjIpCisJCXJldHVybiAnISc7CisJaWYgKGlkID09IDYzKQorCQlyZXR1cm4gJyMnOworCisJcmV0dXJuICclJzsKK30KKwordm9pZCBnZXRfcG9vbF91dWlkKGNoYXIgKnV1aWQsIHVpbnQ2NF90IHBvb2xpZCwgdWludDMyX3Qgc3BpZCwgdWludDMyX3QgZGV2aWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hpZnRlciA9IDB4MDAzRjsKKworCWFzc2VydChJRF9MRU4gPT0gMzIpOworCW1lbXNldCh1dWlkLCAwLCBJRF9MRU4pOworCXN0cmNhdCh1dWlkLCAiUE9PTDAwMDAwMDAwMDAiKTsKKworCS8qIFdlIGdyYWIgdGhlIGVudGlyZSA2NCBiaXRzICgrMiB0aGF0IGdldCBzaGlmdGVkIGluKSAqLworCWZvciAoaSA9IDEzOyBpIDwgMjQ7IGkrKykgeworCQl1dWlkW2ldID0gX2NhbGNfY2hhcigoKHVuc2lnbmVkKSBwb29saWQpICYgc2hpZnRlcik7CisJCXBvb2xpZCA9IHBvb2xpZCA+PiA2OworCX0KKworCS8qIFdlIGdyYWIgdGhlIGVudGlyZSAzMiBiaXRzICgrNCB0aGF0IGdldCBzaGlmdGVkIGluKSAqLworCWZvciAoaSA9IDI0OyBpIDwgMzA7IGkrKykgeworCQl1dWlkW2ldID0gX2NhbGNfY2hhcigodW5zaWduZWQpIChzcGlkICYgc2hpZnRlcikpOworCQlzcGlkID0gc3BpZCA+PiA2OworCX0KKworCS8qCisJICogU2luY2Ugd2UgY2FuIG9ubHkgaGF2ZSAxMjggZGV2aWNlcywgd2Ugb25seSB3b3JyeSBhYm91dCB0aGUKKwkgKiBsYXN0IDEyIGJpdHMKKwkgKi8KKwlmb3IgKGkgPSAzMDsgaSA8IDMyOyBpKyspIHsKKwkJdXVpZFtpXSA9IF9jYWxjX2NoYXIoKHVuc2lnbmVkKSAoZGV2aWQgJiBzaGlmdGVyKSk7CisJCWRldmlkID0gZGV2aWQgPj4gNjsKKwl9CisKK30KKworc3RydWN0IF9yZWFkX3Bvb2xfcHZfYmF0b24geworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10OworCXN0cnVjdCBkbV9wb29sICptZW0sICp0bXBtZW07CisJc3RydWN0IHBvb2xfbGlzdCAqcGw7CisJc3RydWN0IGRtX2xpc3QgKmhlYWQ7CisJY29uc3QgY2hhciAqdmduYW1lOworCXVpbnQzMl90ICpzcF9kZXZzOworCXVpbnQzMl90IHNwX2NvdW50OworCWludCBmYWlsZWQ7CisJaW50IGVtcHR5OworfTsKKworc3RhdGljIGludCBfcmVhZF9wb29sX3B2KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX3JlYWRfcG9vbF9wdl9iYXRvbiAqYiA9IGJhdG9uOworCisJYi0+ZW1wdHkgPSAwOworCisJaWYgKGx2bWNhY2hlX2RldmljZShpbmZvKSAmJgorCSAgICAhKGItPnBsID0gcmVhZF9wb29sX2Rpc2soYi0+Zm10LCBsdm1jYWNoZV9kZXZpY2UoaW5mbyksIGItPm1lbSwgYi0+dmduYW1lKSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHRvdGFsIGV4cGVjdGVkIG51bWJlcgorCSAqIG9mIGRldmljZXMgcGVyIHN1YnBvb2wKKwkgKi8KKwlpZiAoIWItPnNwX2NvdW50KSB7CisJCS8qIEZJWE1FIHBsIGxlZnQgdW5pbml0aWFsaXNlZCBpZiAhaW5mby0+ZGV2ICovCisJCWlmICghYi0+cGwpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiZGV2aWNlIGlzIG1pc3NpbmciKTsKKwkJCWRtX3Bvb2xfZGVzdHJveShiLT50bXBtZW0pOworCQkJYi0+ZmFpbGVkID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWItPnNwX2NvdW50ID0gYi0+cGwtPnBkLnBsX3N1YnBvb2xzOworCQlpZiAoIShiLT5zcF9kZXZzID0KKwkJICAgICAgZG1fcG9vbF96YWxsb2MoYi0+dG1wbWVtLAorCQkJCSAgICAgc2l6ZW9mKHVpbnQzMl90KSAqIGItPnNwX2NvdW50KSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIDMyLWJpdCB1aW50cyIsCisJCQkJICBiLT5zcF9jb3VudCk7CisJCQlkbV9wb29sX2Rlc3Ryb3koYi0+dG1wbWVtKTsKKwkJCWItPmZhaWxlZCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogd2F0Y2ggb3V0IGZvciBhIHBvb2wgbGFiZWwgd2l0aCBhIGRpZmZlcmVudCBzdWJwb29sCisJICogY291bnQgdGhhbiB0aGUgb3JpZ2luYWwgLSBnaXZlIHVwIGlmIGl0IGRvZXMKKwkgKi8KKwlpZiAoYi0+c3BfY291bnQgIT0gYi0+cGwtPnBkLnBsX3N1YnBvb2xzKQorCQlyZXR1cm4gMDsKKworCV9hZGRfcGxfdG9fbGlzdChsdm1jYWNoZV9mbXQoaW5mbyktPmNtZCwgYi0+aGVhZCwgYi0+cGwpOworCisJaWYgKGItPnNwX2NvdW50ID4gYi0+cGwtPnBkLnBsX3NwX2lkICYmIGItPnNwX2RldnNbYi0+cGwtPnBkLnBsX3NwX2lkXSA9PSAwKQorCQliLT5zcF9kZXZzW2ItPnBsLT5wZC5wbF9zcF9pZF0gPSBiLT5wbC0+cGQucGxfc3BfZGV2czsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX3ZnX3BkcyhzdHJ1Y3QgX3JlYWRfcG9vbF9wdl9iYXRvbiAqYiwKKwkJCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbywKKwkJCXVpbnQzMl90ICpkZXZjb3VudCkKK3sKKwl1aW50MzJfdCBpOworCisJYi0+c3BfY291bnQgPSAwOworCWItPnNwX2RldnMgPSBOVUxMOworCWItPmZhaWxlZCA9IDA7CisJYi0+cGwgPSBOVUxMOworCisJLyogRklYTUU6IG1heWJlIHNob3VsZCByZXR1cm4gYSBkaWZmZXJlbnQgZXJyb3IgaW4gbWVtb3J5CisJICogYWxsb2NhdGlvbiBmYWlsdXJlICovCisJaWYgKCEoYi0+dG1wbWVtID0gZG1fcG9vbF9jcmVhdGUoInBvb2wgcmVhZF92ZyIsIDUxMikpKQorCQlyZXR1cm5fMDsKKworCWx2bWNhY2hlX2ZvcmVhY2hfcHYodmdpbmZvLCBfcmVhZF9wb29sX3B2LCBiKTsKKworCSpkZXZjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGItPnNwX2NvdW50OyBpKyspCisJCSpkZXZjb3VudCArPSBiLT5zcF9kZXZzW2ldOworCisJZG1fcG9vbF9kZXN0cm95KGItPnRtcG1lbSk7CisKKwlpZiAoYi0+cGwgJiYgKmItPnBsLT5wZC5wbF9wb29sX25hbWUpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7CisKK30KKworaW50IHJlYWRfcG9vbF9wZHMoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCSAgc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnBkaGVhZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisJdWludDMyX3QgdG90YWxkZXZzOworCWludCBmdWxsX3NjYW4gPSAtMTsKKworCXN0cnVjdCBfcmVhZF9wb29sX3B2X2JhdG9uIGJhdG9uOworCisJYmF0b24udmduYW1lID0gdmdfbmFtZTsKKwliYXRvbi5tZW0gPSBtZW07CisJYmF0b24uZm10ID0gZm10OworCWJhdG9uLmhlYWQgPSBwZGhlYWQ7CisJYmF0b24uZW1wdHkgPSAxOworCisJZG8geworCQkvKgorCQkgKiBJZiB0aGUgY2FjaGUgc2Nhbm5pbmcgZG9lc24ndCB3b3JrLCB0aGlzIHdpbGwgbmV2ZXIgd29yaworCQkgKi8KKwkJaWYgKHZnX25hbWUgJiYgKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z19uYW1lLCBOVUxMKSkgJiYKKwkJICAgIF9yZWFkX3ZnX3BkcygmYmF0b24sIHZnaW5mbywgJnRvdGFsZGV2cykgJiYgIWJhdG9uLmVtcHR5KQorCQl7CisJCQkvKgorCQkJICogSWYgd2UgZm91bmQgYWxsIHRoZSBkZXZpY2VzIHdlIHdlcmUgZXhwZWN0aW5nLCByZXR1cm4KKwkJCSAqIHN1Y2Nlc3MKKwkJCSAqLworCQkJaWYgKGRtX2xpc3Rfc2l6ZShwZGhlYWQpID09IHRvdGFsZGV2cykKKwkJCQlyZXR1cm4gMTsKKworCQkJLyoKKwkJCSAqIGFjY2VwdCBwYXJ0aWFsIHBvb2wgaWYgd2UndmUgZG9uZSBhIGZ1bGwgcmVzY2FuIG9mCisJCQkgKiB0aGUgY2FjaGUKKwkJCSAqLworCQkJaWYgKGZ1bGxfc2NhbiA+IDApCisJCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBGYWlsZWQgKi8KKwkJZG1fbGlzdF9pbml0KHBkaGVhZCk7CisKKwkJZnVsbF9zY2FuKys7CisJCWlmIChmdWxsX3NjYW4gPiAxKSB7CisJCQlsb2dfZGVidWdfbWV0YWRhdGEoIk5vIGRldmljZXMgZm9yIHZnICVzIGZvdW5kIGluIGNhY2hlIiwKKwkJCQkJICAgdmdfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoZnVsbF9zY2FuID4gMCkKKwkJCWx2bWNhY2hlX2ZvcmNlX25leHRfbGFiZWxfc2NhbigpOworCQlsdm1jYWNoZV9sYWJlbF9zY2FuKGZtdC0+Y21kKTsKKworCX0gd2hpbGUgKDEpOworCit9CisKK3N0cnVjdCBwb29sX2xpc3QgKnJlYWRfcG9vbF9kaXNrKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RydWN0IHBvb2xfbGlzdCAqcGw7CisKKwlpZiAoIWRldl9vcGVuX3JlYWRvbmx5KGRldikpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEocGwgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcGwpKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgcG9vbCBsaXN0IHN0cnVjdHVyZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9fcmVhZF9wb29sX2Rpc2soZm10LCBkZXYsIG1lbSwgcGwsIHZnX25hbWUpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghZGV2X2Nsb3NlKGRldikpCisJCXN0YWNrOworCisJcmV0dXJuIHBsOworCit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3Bvb2wvZGlza19yZXAuaCBiL2xpYi9mb3JtYXRfcG9vbC9kaXNrX3JlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTk0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvZGlza19yZXAuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBESVNLX1JFUF9GT1JNQVRfUE9PTF9ICisjZGVmaW5lIERJU0tfUkVQX0ZPUk1BVF9QT09MX0gKKworI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworI2RlZmluZSBNSU5PUl9PRkZTRVQgNjU1MzYKKworLyogRnJvbSBOU1AuY2YgKi8KKyNkZWZpbmUgTlNQTWFqb3JWZXJzaW9uCTQKKyNkZWZpbmUgTlNQTWlub3JWZXJzaW9uCTEKKyNkZWZpbmUgTlNQVXBkYXRlTGV2ZWwJMworCisvKiBGcm9tIHBvb2xfc3RkLmggKi8KKyNkZWZpbmUgUE9PTF9OQU1FX1NJWkUgICAgICAgICAgKDI1NikKKyNkZWZpbmUgUE9PTF9NQUdJQyAJCTB4MDExNjcwCisjZGVmaW5lIFBPT0xfTUFKT1IgICAgICAgICAgICAgICgxMjEpCisjZGVmaW5lIFBPT0xfTUFYX0RFVklDRVMgCTEyOAorCisvKiBXaGVuIGNoZWNraW5nIGZvciB2ZXJzaW9uIG1hdGNoaW5nLCB0aGUgZmlyc3QgdHdvIG51bWJlcnMgKioKKyoqIGFyZSBpbXBvcnRhbnQgZm9yIG1ldGFkYXRhIGZvcm1hdHMsIGEuay5hIHBvb2wgbGFiZWxzLiAgICoqCisqKiBBbGwgdGhlIG51bWJlcnMgYXJlIGltcG9ydGFudCB3aGVuIGNoZWNraW5nIGlmIHRoZSB1c2VyICAqKgorKiogc3BhY2UgdG9vbHMgbWF0Y2ggdXAgd2l0aCB0aGUga2VybmVsIG1vZHVsZS4uLi4uLi4uLi4uLi4gKi8KKyNkZWZpbmUgUE9PTF9WRVJTSU9OCQkoTlNQTWFqb3JWZXJzaW9uIDw8IDE2IHwgXAorCQkJCSBOU1BNaW5vclZlcnNpb24gPDwgIDggfCBcCisJCQkJIE5TUFVwZGF0ZUxldmVsKQorCisvKiBQb29sIGxhYmVsIGlzIGF0IHRoZSBoZWFkIG9mIGV2ZXJ5IHBvb2wgZGlzayBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgU0laRU9GX1BPT0xfTEFCRUwgICAgICAgKDgxOTIpCisKKy8qIGluIHNlY3RvcnMgKi8KKyNkZWZpbmUgUE9PTF9QRV9TSVpFICAgICAoU0laRU9GX1BPT0xfTEFCRUwgPj4gU0VDVE9SX1NISUZUKQorI2RlZmluZSBQT09MX1BFX1NUQVJUICAgIChTSVpFT0ZfUE9PTF9MQUJFTCA+PiBTRUNUT1JfU0hJRlQpCisKKy8qIEhlbHBlciBmeG5zICovCisjZGVmaW5lIGdldF9wb29sX3ZnX3V1aWQoaWQsIHBkKSBkbyB7IGdldF9wb29sX3V1aWQoKGNoYXIgKikoaWQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBkKS0+cGxfcG9vbF9pZCwgMCwgMCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgZ2V0X3Bvb2xfcHZfdXVpZChpZCwgcGQpIGRvIHsgZ2V0X3Bvb2xfdXVpZCgoY2hhciAqKShpZCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGQpLT5wbF9wb29sX2lkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBkKS0+cGxfc3BfaWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGQpLT5wbF9zcF9kZXZpZCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgZ2V0X3Bvb2xfbHZfdXVpZChpZCwgcGQpIGRvIHsgZ2V0X3Bvb2xfdXVpZCgoY2hhciAqKSYoaWQpWzBdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBkKS0+cGxfcG9vbF9pZCwgMCwgMCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Bvb2xfdXVpZCgoY2hhciopJihpZClbMV0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGQpLT5wbF9wb29sX2lkLCAwLCAwKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCitzdHJ1Y3QgcG9vbF9kaXNrOworc3RydWN0IHBvb2xfbGlzdDsKK3N0cnVjdCB1c2VyX3N1YnBvb2w7CitzdHJ1Y3QgdXNlcl9kZXZpY2U7CisKK3N0cnVjdCBwb29sX2Rpc2sgeworCXVpbnQ2NF90IHBsX21hZ2ljOwkvKiBQb29sIG1hZ2ljIG51bWJlciAqLworCXVpbnQ2NF90IHBsX3Bvb2xfaWQ7CS8qIFVuaXF1ZSBwb29sIGlkZW50aWZpZXIgKi8KKwljaGFyIHBsX3Bvb2xfbmFtZVtQT09MX05BTUVfU0laRV07CS8qIE5hbWUgb2YgcG9vbCAqLworCXVpbnQzMl90IHBsX3ZlcnNpb247CS8qIFBvb2wgdmVyc2lvbiAqLworCXVpbnQzMl90IHBsX3N1YnBvb2xzOwkvKiBOdW1iZXIgb2Ygc3VicG9vbHMgaW4gdGhpcyBwb29sICovCisJdWludDMyX3QgcGxfc3BfaWQ7CS8qIFN1YnBvb2wgbnVtYmVyIHdpdGhpbiBwb29sICovCisJdWludDMyX3QgcGxfc3BfZGV2czsJLyogTnVtYmVyIG9mIGRhdGEgcGFydGl0aW9ucyBpbiB0aGlzIHN1YnBvb2wgKi8KKwl1aW50MzJfdCBwbF9zcF9kZXZpZDsJLyogUGFydGl0aW9uIG51bWJlciB3aXRoaW4gc3VicG9vbCAqLworCXVpbnQzMl90IHBsX3NwX3R5cGU7CS8qIFBhcnRpdGlvbiB0eXBlICovCisJdWludDY0X3QgcGxfYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgcGFydGl0aW9uICovCisJdWludDMyX3QgcGxfc3RyaXBpbmc7CS8qIFN0cmlwaW5nIHNpemUgd2l0aGluIHN1YnBvb2wgKi8KKwkvKgorCSAqIElmIHRoZSBudW1iZXIgb2YgRE1FUCBkZXZpY2VzIGlzIHplcm8sIHRoZW4gdGhlIG5leHQgZmllbGQgKioKKwkgKiAqKiAocGxfc3BfZG1lcGlkKSBiZWNvbWVzIHRoZSBzdWJwb29sIElEIGZvciByZWRpcmVjdGlvbi4gIEluICoqCisJICogKiogb3RoZXIgd29yZHMsIGlmIHRoaXMgc3VicG9vbCBkb2VzIG5vdCBoYXZlIHRoZSBjYXBhYmlsaXR5ICAqKgorCSAqICoqIHRvIGRvIERNRVAsIHRoZW4gaXQgbXVzdCBzcGVjaWZ5IHdoaWNoIHN1YnBvb2wgd2lsbCBkbyBpdCAgKioKKwkgKiAqKiBpbiBpdCdzIHBsYWNlCisJICovCisKKwkvKgorCSAqIFdoaWxlIHRoZSBuZXh0IDMgZmllbGQgYXJlIG5vIGxvbmdlciB1c2VkLCB0aGV5IG11c3Qgc3RheSB0byBrZWVwICoqCisJICogKiogYmFja3dhcmQgY29tcGF0aWJpbGl0eS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkgKi8KKwl1aW50MzJfdCBwbF9zcF9kbWVwZGV2czsvKiBOdW1iZXIgb2YgZG1lcCBkZXZpY2VzIGluIHRoaXMgc3VicG9vbCAqLworCXVpbnQzMl90IHBsX3NwX2RtZXBpZDsJLyogRG1lcCBkZXZpY2UgbnVtYmVyIHdpdGhpbiBzdWJwb29sICovCisJdWludDMyX3QgcGxfc3Bfd2VpZ2h0OwkvKiBpZiBkbWVwIGRldiwgcHJlZiB0byB1c2luZyBpdCAqLworCisJdWludDMyX3QgcGxfbWlub3I7CS8qIHRoZSBwb29sIG1pbm9yIG51bWJlciAqLworCXVpbnQzMl90IHBsX3BhZGRpbmc7CS8qIHJlbWluZGVyIC0gdGhpbmsgYWJvdXQgYWxpZ25tZW50ICovCisKKwkvKgorCSAqIEV2ZW4gdGhvdWdoIHdlJ3JlIHplcm9pbmcgb3V0IDhrIGF0IHRoZSBmcm9udCBvZiB0aGUgZGlzayBiZWZvcmUKKwkgKiB3cml0aW5nIHRoZSBsYWJlbCwgcHV0dGluZyB0aGlzIGluCisJICovCisJY2hhciBwbF9yZXNlcnZlWzE4NF07CS8qIGJ1bXAgdGhlIHN0cnVjdHVyZSBzaXplIG91dCB0byA1MTIgYnl0ZXMgKi8KK307CisKK3N0cnVjdCBwb29sX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IHBvb2xfZGlzayBwZDsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgaWQgcHZfdXVpZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCitzdHJ1Y3QgdXNlcl9zdWJwb29sIHsKKwl1aW50MzJfdCBpbml0aWFsaXplZDsKKwl1aW50MzJfdCBpZDsKKwl1aW50MzJfdCBzdHJpcGluZzsKKwl1aW50MzJfdCBudW1fZGV2czsKKwl1aW50MzJfdCB0eXBlOworCXVpbnQzMl90IGR1bW15OworCXN0cnVjdCB1c2VyX2RldmljZSAqZGV2czsKK307CisKK3N0cnVjdCB1c2VyX2RldmljZSB7CisJdWludDMyX3QgaW5pdGlhbGl6ZWQ7CisJdWludDMyX3Qgc3BfaWQ7CisJdWludDMyX3QgZGV2aWQ7CisJdWludDMyX3QgZHVtbXk7CisJdWludDY0X3QgYmxvY2tzOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworfTsKKworaW50IHJlYWRfcG9vbF9sYWJlbChzdHJ1Y3QgcG9vbF9saXN0ICpwbCwgc3RydWN0IGxhYmVsbGVyICpsLAorCQkgICAgc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIHN0cnVjdCBsYWJlbCAqKmxhYmVsKTsKK3ZvaWQgcG9vbF9sYWJlbF9vdXQoc3RydWN0IHBvb2xfZGlzayAqcGwsIHZvaWQgKmJ1Zik7Cit2b2lkIHBvb2xfbGFiZWxfaW4oc3RydWN0IHBvb2xfZGlzayAqcGwsIHZvaWQgKmJ1Zik7Cit2b2lkIGdldF9wb29sX3V1aWQoY2hhciAqdXVpZCwgdWludDY0X3QgcG9vbGlkLCB1aW50MzJfdCBzcGlkLCB1aW50MzJfdCBkZXZpZCk7CitpbnQgaW1wb3J0X3Bvb2xfdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpwbHMpOworaW50IGltcG9ydF9wb29sX2x2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICpwbHMpOworaW50IGltcG9ydF9wb29sX3B2cyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqcGxzKTsKK2ludCBpbXBvcnRfcG9vbF9wdihjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICBzdHJ1Y3QgcG9vbF9saXN0ICpwbCk7CitpbnQgaW1wb3J0X3Bvb2xfc2VnbWVudHMoc3RydWN0IGRtX2xpc3QgKmx2cywgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSBzdHJ1Y3QgdXNlcl9zdWJwb29sICp1c3AsIGludCBzcF9jb3VudCk7CitpbnQgcmVhZF9wb29sX3Bkcyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgY29uc3QgY2hhciAqdmduYW1lLAorCQkgIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpoZWFkKTsKK3N0cnVjdCBwb29sX2xpc3QgKnJlYWRfcG9vbF9kaXNrKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJIGNvbnN0IGNoYXIgKnZnX25hbWUpOworCisjZW5kaWYJCQkJLyogRElTS19SRVBfUE9PTF9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmMgYi9saWIvZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU1ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibGFiZWwuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImxpbWl0cy5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAiZGlza19yZXAuaCIKKyNpbmNsdWRlICJmb3JtYXRfcG9vbC5oIgorI2luY2x1ZGUgInBvb2xfbGFiZWwuaCIKKworLyogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcHZzIGFyZSBpbXBvcnRlZCAqLworc3RhdGljIHN0cnVjdCB1c2VyX3N1YnBvb2wgKl9idWlsZF91c3Aoc3RydWN0IGRtX2xpc3QgKnBscywgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICAgaW50ICpzcHMpCit7CisJc3RydWN0IHBvb2xfbGlzdCAqcGw7CisJc3RydWN0IHVzZXJfc3VicG9vbCAqdXNwID0gTlVMTCwgKmN1cl9zcCA9IE5VTEw7CisJc3RydWN0IHVzZXJfZGV2aWNlICpjdXJfZGV2ID0gTlVMTDsKKworCS8qCisJICogRklYTUU6IE5lZWQgdG8gZG8gc29tZSBjaGVja3MgaGVyZSAtIEknbSB0ZW1wdGVkIHRvIGFkZCBhCisJICogdXNlcl9wb29sIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIGVudGlyZSB0aGluZyB0byBjaGVjayBhZ2FpbnN0LgorCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwbCwgcGxzKSB7CisJCSpzcHMgPSBwbC0+cGQucGxfc3VicG9vbHM7CisJCWlmICghdXNwICYmICghKHVzcCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCp1c3ApICogKCpzcHMpKSkpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBzdWJwb29sIHN0cnVjdHVyZXMiLAorCQkJCSAgKnNwcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChjdXJfc3AgIT0gJnVzcFtwbC0+cGQucGxfc3BfaWRdKSB7CisJCQljdXJfc3AgPSAmdXNwW3BsLT5wZC5wbF9zcF9pZF07CisKKwkJCWN1cl9zcC0+aWQgPSBwbC0+cGQucGxfc3BfaWQ7CisJCQljdXJfc3AtPnN0cmlwaW5nID0gcGwtPnBkLnBsX3N0cmlwaW5nOworCQkJY3VyX3NwLT5udW1fZGV2cyA9IHBsLT5wZC5wbF9zcF9kZXZzOworCQkJY3VyX3NwLT50eXBlID0gcGwtPnBkLnBsX3NwX3R5cGU7CisJCQljdXJfc3AtPmluaXRpYWxpemVkID0gMTsKKwkJfQorCisJCWlmICghY3VyX3NwLT5kZXZzICYmCisJCSAgICAoIShjdXJfc3AtPmRldnMgPQorCQkgICAgICAgZG1fcG9vbF96YWxsb2MobWVtLAorCQkJCSAgIHNpemVvZigqdXNwLT5kZXZzKSAqIHBsLT5wZC5wbF9zcF9kZXZzKSkpKSB7CisKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIHBvb2xfZGV2aWNlICIKKwkJCQkgICJzdHJ1Y3R1cmVzIiwgcGwtPnBkLnBsX3NwX2RldnMpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljdXJfZGV2ID0gJmN1cl9zcC0+ZGV2c1twbC0+cGQucGxfc3BfZGV2aWRdOworCQljdXJfZGV2LT5zcF9pZCA9IGN1cl9zcC0+aWQ7CisJCWN1cl9kZXYtPmRldmlkID0gcGwtPnBkLnBsX3NwX2lkOworCQljdXJfZGV2LT5ibG9ja3MgPSBwbC0+cGQucGxfYmxvY2tzOworCQljdXJfZGV2LT5wdiA9IHBsLT5wdjsKKwkJY3VyX2Rldi0+aW5pdGlhbGl6ZWQgPSAxOworCX0KKworCXJldHVybiB1c3A7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX3VzcChjb25zdCBjaGFyICp2Z25hbWUsIHN0cnVjdCB1c2VyX3N1YnBvb2wgKnVzcCwgaW50IHNwX2NvdW50KQoreworCWludCBpOworCXVuc2lnbmVkIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BfY291bnQ7IGkrKykgeworCQlpZiAoIXVzcFtpXS5pbml0aWFsaXplZCkgeworCQkJbG9nX2Vycm9yKCJNaXNzaW5nIHN1YnBvb2wgJWQgaW4gcG9vbCAlcyIsIGksIHZnbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgdXNwW2ldLm51bV9kZXZzOyBqKyspIHsKKwkJCWlmICghdXNwW2ldLmRldnNbal0uaW5pdGlhbGl6ZWQpIHsKKwkJCQlsb2dfZXJyb3IoIk1pc3NpbmcgZGV2aWNlICV1IGZvciBzdWJwb29sICVkIgorCQkJCQkgICIgaW4gcG9vbCAlcyIsIGosIGksIHZnbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqX3Bvb2xfdmdfcmVhZChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJCSAgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCQkJICBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgIHN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqKnZnX2ZtdGRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSAgdW5zaWduZWQgKnVzZV9wcmV2aW91c192ZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJICBpbnQgc2luZ2xlX2RldmljZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgdXNlcl9zdWJwb29sICp1c3A7CisJaW50IHNwX2NvdW50OworCURNX0xJU1RfSU5JVChwZHMpOworCisJLyogV2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIG1kYSBwYXNzZWQgaW4gKi8KKworCS8qIFN0cmlwIGRldl9kaXIgaWYgcHJlc2VudCAqLworCWlmICh2Z19uYW1lKQorCQl2Z19uYW1lID0gc3RyaXBfZGlyKHZnX25hbWUsIGZpZC0+Zm10LT5jbWQtPmRldl9kaXIpOworCisJLyogU2V0IHZnX25hbWUgdGhyb3VnaCByZWFkX3Bvb2xfcGRzKCkgKi8KKwlpZiAoISh2ZyA9IGFsbG9jX3ZnKCJwb29sX3ZnX3JlYWQiLCBmaWQtPmZtdC0+Y21kLCBOVUxMKSkpCisJCXJldHVybl9OVUxMOworCisJLyogUmVhZCBhbGwgdGhlIHB2cyBpbiB0aGUgdmcgKi8KKwlpZiAoIXJlYWRfcG9vbF9wZHMoZmlkLT5mbXQsIHZnX25hbWUsIHZnLT52Z21lbSwgJnBkcykpCisJCWdvdG9fYmFkOworCisJLyogU2V0dGluZyBwb29sIHNlcW5vIHRvIDEgYmVjYXVzZSB0aGUgY29kZSBhbHdheXMgZGlkIHRoaXMsCisJICogYWx0aG91Z2ggd2UgZG9uJ3QgdGhpbmsgaXQncyBuZWVkZWQuICovCisJdmctPnNlcW5vID0gMTsKKworCWlmICghaW1wb3J0X3Bvb2xfdmcodmcsIHZnLT52Z21lbSwgJnBkcykpCisJCWdvdG9fYmFkOworCisJaWYgKCFpbXBvcnRfcG9vbF9wdnMoZmlkLT5mbXQsIHZnLCB2Zy0+dmdtZW0sICZwZHMpKQorCQlnb3RvX2JhZDsKKworCWlmICghaW1wb3J0X3Bvb2xfbHZzKHZnLCB2Zy0+dmdtZW0sICZwZHMpKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogSSBuZWVkIGFuIGludGVybWVkaWF0ZSBzdWJwb29sIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUKKwkgKiByZWxldmFudCBpbmZvIGZvciB0aGlzLiAgVGhlbiBpIGNhbiBpdGVyYXRlIHRocm91Z2ggdGhlIHN1YnBvb2wKKwkgKiBzdHJ1Y3R1cmVzIGZvciBjaGVja2luZywgYW5kIGNyZWF0ZSB0aGUgc2VnbWVudHMKKwkgKi8KKwlpZiAoISh1c3AgPSBfYnVpbGRfdXNwKCZwZHMsIHZnLT52Z21lbSwgJnNwX2NvdW50KSkpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBjaGVjayB0aGUgc3VicG9vbCBzdHJ1Y3R1cmVzIC0gd2UgY2FuJ3QgaGFuZGxlIHBhcnRpYWwgVkdzIGluCisJICogdGhlIHBvb2wgZm9ybWF0LCBzbyB0aGlzIHdpbGwgZXJyb3Igb3V0IGlmIHdlJ3JlIG1pc3NpbmcgUFZzCisJICovCisJaWYgKCFfY2hlY2tfdXNwKHZnLT5uYW1lLCB1c3AsIHNwX2NvdW50KSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIWltcG9ydF9wb29sX3NlZ21lbnRzKCZ2Zy0+bHZzLCB2Zy0+dmdtZW0sIHVzcCwgc3BfY291bnQpKQorCQlnb3RvX2JhZDsKKworCXZnX3NldF9maWQodmcsIGZpZCk7CisKKwlyZXR1cm4gdmc7CisKK2JhZDoKKwlyZWxlYXNlX3ZnKHZnKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9wb29sX3B2X2luaXRpYWxpc2UoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IHB2X2NyZWF0ZV9hcmdzICpwdmEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Bvb2xfcHZfc2V0dXAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcG9vbF9wdl9yZWFkKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBjb25zdCBjaGFyICpwdl9uYW1lLAorCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJIGludCBzY2FuX2xhYmVsX29ubHkgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJwb29sIHB2X3JlYWQiLCAxMDI0KTsKKwlzdHJ1Y3QgcG9vbF9saXN0ICpwbDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHIgPSAwOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiUmVhZGluZyBwaHlzaWNhbCB2b2x1bWUgZGF0YSAlcyBmcm9tIGRpc2siLCBwdl9uYW1lKTsKKworCWlmICghbWVtKQorCQlyZXR1cm5fMDsKKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQocHZfbmFtZSwgZm10LT5jbWQtPmZpbHRlcikpKQorCQlnb3RvX291dDsKKworCS8qCisJICogSSBuZWVkIHRvIHJlYWQgdGhlIGRpc2sgYW5kIHBvcHVsYXRlIGEgcHYgc3RydWN0dXJlIGhlcmUKKwkgKiBJJ2xsIHByb2JhYmx5IG5lZWQgdG8gYWJzdHJhY3Qgc29tZSBvZiB0aGlzIGxhdGVyIGZvciB0aGUKKwkgKiB2Z19yZWFkIGNvZGUKKwkgKi8KKwlpZiAoIShwbCA9IHJlYWRfcG9vbF9kaXNrKGZtdCwgZGV2LCBtZW0sIE5VTEwpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWltcG9ydF9wb29sX3B2KGZtdCwgZm10LT5jbWQtPm1lbSwgTlVMTCwgcHYsIHBsKSkKKwkJZ290b19vdXQ7CisKKwlwdi0+Zm10ID0gZm10OworCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlyZXR1cm4gcjsKK30KKworLyogKklOREVOVC1PRkYqICovCitzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2FyZWFfb3BzIF9tZXRhZGF0YV9mb3JtYXRfcG9vbF9vcHMgPSB7CisJLnZnX3JlYWQgPSBfcG9vbF92Z19yZWFkLAorfTsKKy8qICpJTkRFTlQtT04qICovCisKK3N0YXRpYyBzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpfcG9vbF9jcmVhdGVfaW5zdGFuY2UoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4ICpmaWMpCit7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisKKwlpZiAoIShmaWQgPSBhbGxvY19maWQoZm10LCBmaWMpKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBEZWZpbmUgYSBOVUxMIG1ldGFkYXRhIGFyZWEgKi8KKwlpZiAoIShtZGEgPSBkbV9wb29sX3phbGxvYyhmaWQtPm1lbSwgc2l6ZW9mKCptZGEpKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWV0YWRhdGEgYXJlYSBzdHJ1Y3R1cmUgIgorCQkJICAiZm9yIHBvb2wgZm9ybWF0Iik7CisJCWdvdG8gYmFkOworCX0KKworCW1kYS0+b3BzID0gJl9tZXRhZGF0YV9mb3JtYXRfcG9vbF9vcHM7CisJbWRhLT5tZXRhZGF0YV9sb2NuID0gTlVMTDsKKwltZGEtPnN0YXR1cyA9IDA7CisJZG1fbGlzdF9hZGQoJmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlLCAmbWRhLT5saXN0KTsKKworCXJldHVybiBmaWQ7CisKK2JhZDoKKwlkbV9wb29sX2Rlc3Ryb3koZmlkLT5tZW0pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfcG9vbF9kZXN0cm95X2luc3RhbmNlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCkKK3sKKwlpZiAoLS1maWQtPnJlZl9jb3VudCA8PSAxKQorCQlkbV9wb29sX2Rlc3Ryb3koZmlkLT5tZW0pOworfQorCitzdGF0aWMgdm9pZCBfcG9vbF9kZXN0cm95KHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCWlmIChmbXQtPm9ycGhhbl92ZykKKwkJZnJlZV9vcnBoYW5fdmcoZm10LT5vcnBoYW5fdmcpOworCisJZG1fZnJlZShmbXQpOworfQorCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBzdHJ1Y3QgZm9ybWF0X2hhbmRsZXIgX2Zvcm1hdF9wb29sX29wcyA9IHsKKwkucHZfcmVhZCA9IF9wb29sX3B2X3JlYWQsCisJLnB2X2luaXRpYWxpc2UgPSBfcG9vbF9wdl9pbml0aWFsaXNlLAorCS5wdl9zZXR1cCA9IF9wb29sX3B2X3NldHVwLAorCS5jcmVhdGVfaW5zdGFuY2UgPSBfcG9vbF9jcmVhdGVfaW5zdGFuY2UsCisJLmRlc3Ryb3lfaW5zdGFuY2UgPSBfcG9vbF9kZXN0cm95X2luc3RhbmNlLAorCS5kZXN0cm95ID0gX3Bvb2xfZGVzdHJveSwKK307CisvKiAqSU5ERU5ULU9OICovCisKKyNpZmRlZiBQT09MX0lOVEVSTkFMCitzdHJ1Y3QgZm9ybWF0X3R5cGUgKmluaXRfcG9vbF9mb3JtYXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCisjZWxzZQkJCQkvKiBTaGFyZWQgKi8KK3N0cnVjdCBmb3JtYXRfdHlwZSAqaW5pdF9mb3JtYXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworc3RydWN0IGZvcm1hdF90eXBlICppbml0X2Zvcm1hdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKKyNlbmRpZgoreworCXN0cnVjdCBmb3JtYXRfdHlwZSAqZm10ID0gZG1fbWFsbG9jKHNpemVvZigqZm10KSk7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggZmljOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZDsKKworCWlmICghZm10KSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIGZvcm1hdCB0eXBlIHN0cnVjdHVyZSBmb3IgcG9vbCAiCisJCQkgICJmb3JtYXQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm10LT5jbWQgPSBjbWQ7CisJZm10LT5vcHMgPSAmX2Zvcm1hdF9wb29sX29wczsKKwlmbXQtPm5hbWUgPSBGTVRfUE9PTF9OQU1FOworCWZtdC0+YWxpYXMgPSBOVUxMOworCWZtdC0+b3JwaGFuX3ZnX25hbWUgPSBGTVRfUE9PTF9PUlBIQU5fVkdfTkFNRTsKKwlmbXQtPmZlYXR1cmVzID0gRk1UX09CU09MRVRFOworCWZtdC0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkbV9saXN0X2luaXQoJmZtdC0+bWRhX29wcyk7CisKKwlpZiAoIShmbXQtPmxhYmVsbGVyID0gcG9vbF9sYWJlbGxlcl9jcmVhdGUoZm10KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgcG9vbCBsYWJlbCBoYW5kbGVyLiIpOworCQlkbV9mcmVlKGZtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGxhYmVsX3JlZ2lzdGVyX2hhbmRsZXIoZm10LT5sYWJlbGxlcikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVnaXN0ZXIgcG9vbCBsYWJlbCBoYW5kbGVyLiIpOworCQlmbXQtPmxhYmVsbGVyLT5vcHMtPmRlc3Ryb3koZm10LT5sYWJlbGxlcik7CisJCWRtX2ZyZWUoZm10KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoZm10LT5vcnBoYW5fdmcgPSBhbGxvY192ZygicG9vbF9vcnBoYW4iLCBjbWQsIGZtdC0+b3JwaGFuX3ZnX25hbWUpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwb29sIG9ycGhhbiBWRy4iKTsKKwkJZG1fZnJlZShmbXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9BVVhfTURBUzsKKwlmaWMuY29udGV4dC52Z19yZWYudmdfbmFtZSA9IGZtdC0+b3JwaGFuX3ZnX25hbWU7CisJZmljLmNvbnRleHQudmdfcmVmLnZnX2lkID0gTlVMTDsKKworCWlmICghKGZpZCA9IF9wb29sX2NyZWF0ZV9pbnN0YW5jZShmbXQsICZmaWMpKSkgeworCQlfcG9vbF9kZXN0cm95KGZtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXZnX3NldF9maWQoZm10LT5vcnBoYW5fdmcsIGZpZCk7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBmb3JtYXQ6ICVzIiwgZm10LT5uYW1lKTsKKworCXJldHVybiBmbXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuaCBiL2xpYi9mb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDdlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9GT1JNQVRfUE9PTF9ICisjZGVmaW5lIF9MVk1fRk9STUFUX1BPT0xfSAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworI2RlZmluZSBGTVRfUE9PTF9OQU1FICJwb29sIgorI2RlZmluZSBGTVRfUE9PTF9PUlBIQU5fVkdfTkFNRSBPUlBIQU5fVkdfTkFNRShGTVRfUE9PTF9OQU1FKQorCisjaWZkZWYgUE9PTF9JTlRFUk5BTAorc3RydWN0IGZvcm1hdF90eXBlICppbml0X3Bvb2xfZm9ybWF0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfcG9vbC9pbXBvcnRfZXhwb3J0LmMgYi9saWIvZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjlkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkaXNrX3JlcC5oIgorI2luY2x1ZGUgInNwdHlwZV9uYW1lcy5oIgorI2luY2x1ZGUgImx2X2FsbG9jLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgaW1wb3J0cyBhdCB0aGUgbW9tZW50Li4uICovCisKK2ludCBpbXBvcnRfcG9vbF92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnBscykKK3sKKwlzdHJ1Y3QgcG9vbF9saXN0ICpwbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwbCwgcGxzKSB7CisJCXZnLT5leHRlbnRfY291bnQgKz0KKwkJICAgICgocGwtPnBkLnBsX2Jsb2NrcykgLyBQT09MX1BFX1NJWkUpOworCisJCXZnLT5mcmVlX2NvdW50ID0gdmctPmV4dGVudF9jb3VudDsKKworCQlpZiAodmctPm5hbWUpCisJCQljb250aW51ZTsKKworCQl2Zy0+bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgcGwtPnBkLnBsX3Bvb2xfbmFtZSk7CisJCWdldF9wb29sX3ZnX3V1aWQoJnZnLT5pZCwgJnBsLT5wZCk7CisJCXZnLT5leHRlbnRfc2l6ZSA9IFBPT0xfUEVfU0laRTsKKwkJdmctPnN0YXR1cyB8PSBMVk1fUkVBRCB8IExWTV9XUklURSB8IENMVVNURVJFRCB8IFNIQVJFRDsKKwkJdmctPm1heF9sdiA9IDE7CisJCXZnLT5tYXhfcHYgPSBQT09MX01BWF9ERVZJQ0VTOworCQl2Zy0+YWxsb2MgPSBBTExPQ19OT1JNQUw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBpbXBvcnRfcG9vbF9sdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpwbHMpCit7CisJc3RydWN0IHBvb2xfbGlzdCAqcGw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWlmICghKGx2ID0gYWxsb2NfbHYobWVtKSkpCisJCXJldHVybl8wOworCisJbHYtPnN0YXR1cyA9IDA7CisJbHYtPmFsbG9jID0gQUxMT0NfTk9STUFMOworCWx2LT5zaXplID0gMDsKKwlsdi0+bmFtZSA9IE5VTEw7CisJbHYtPmxlX2NvdW50ID0gMDsKKwlsdi0+cmVhZF9haGVhZCA9IHZnLT5jbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwbCwgcGxzKSB7CisJCWx2LT5zaXplICs9IHBsLT5wZC5wbF9ibG9ja3M7CisKKwkJaWYgKGx2LT5uYW1lKQorCQkJY29udGludWU7CisKKwkJaWYgKCEobHYtPm5hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIHBsLT5wZC5wbF9wb29sX25hbWUpKSkKKwkJCXJldHVybl8wOworCisJCWdldF9wb29sX2x2X3V1aWQobHYtPmx2aWQuaWQsICZwbC0+cGQpOworCQlsb2dfZGVidWdfbWV0YWRhdGEoIkNhbGN1bGF0ZWQgbHYgdXVpZCBmb3IgbHYgJXM6ICVzIiwgbHYtPm5hbWUsCisJCQkJICAgbHYtPmx2aWQucyk7CisKKwkJbHYtPnN0YXR1cyB8PSBWSVNJQkxFX0xWIHwgTFZNX1JFQUQgfCBMVk1fV1JJVEU7CisJCWx2LT5tYWpvciA9IFBPT0xfTUFKT1I7CisKKwkJLyogZm9yIHBvb2wgYSBtaW5vciBvZiAwIGlzIGR5bmFtaWMgKi8KKwkJaWYgKHBsLT5wZC5wbF9taW5vcikgeworCQkJbHYtPnN0YXR1cyB8PSBGSVhFRF9NSU5PUjsKKwkJCWx2LT5taW5vciA9IHBsLT5wZC5wbF9taW5vciArIE1JTk9SX09GRlNFVDsKKwkJfSBlbHNlIHsKKwkJCWx2LT5taW5vciA9IC0xOworCQl9CisJfQorCisJbHYtPmxlX2NvdW50ID0gbHYtPnNpemUgLyBQT09MX1BFX1NJWkU7CisKKwlyZXR1cm4gbGlua19sdl90b192Zyh2ZywgbHYpOworfQorCitpbnQgaW1wb3J0X3Bvb2xfcHZzKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpwbHMpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgcG9vbF9saXN0ICpwbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwbCwgcGxzKSB7CisJCWlmICghKHB2bCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpwdmwpKSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHB2IGxpc3Qgc3RydWN0dXJlIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIShwdmwtPnB2ID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnB2bC0+cHYpKSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHB2IHN0cnVjdHVyZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFpbXBvcnRfcG9vbF9wdihmbXQsIG1lbSwgdmcsIHB2bC0+cHYsIHBsKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGwtPnB2ID0gcHZsLT5wdjsKKwkJcHZsLT5tZGFzID0gTlVMTDsKKwkJcHZsLT5wZV9yYW5nZXMgPSBOVUxMOworCQlhZGRfcHZsX3RvX3Zncyh2ZywgcHZsKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGltcG9ydF9wb29sX3B2KGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCSAgIHN0cnVjdCBwb29sX2xpc3QgKnBsKQoreworCXN0cnVjdCBwb29sX2Rpc2sgKnBkID0gJnBsLT5wZDsKKworCW1lbXNldChwdiwgMCwgc2l6ZW9mKCpwdikpOworCisJZ2V0X3Bvb2xfcHZfdXVpZCgmcHYtPmlkLCBwZCk7CisJcHYtPmZtdCA9IGZtdDsKKworCXB2LT5kZXYgPSBwbC0+ZGV2OworCWlmICghKHB2LT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBwZC0+cGxfcG9vbF9uYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZHVwbGljYXRlIHZnX25hbWUgc3RyaW5nIik7CisJCXJldHVybiAwOworCX0KKwlpZiAodmcgIT0gTlVMTCkKKwkJbWVtY3B5KCZwdi0+dmdpZCwgJnZnLT5pZCwgc2l6ZW9mKHZnLT5pZCkpOworCXB2LT5zdGF0dXMgPSAwOworCXB2LT5zaXplID0gcGQtPnBsX2Jsb2NrczsKKwlwdi0+cGVfc2l6ZSA9IFBPT0xfUEVfU0laRTsKKwlwdi0+cGVfc3RhcnQgPSBQT09MX1BFX1NUQVJUOworCXB2LT5wZV9jb3VudCA9IHB2LT5zaXplIC8gUE9PTF9QRV9TSVpFOworCXB2LT5wZV9hbGxvY19jb3VudCA9IDA7CisJcHYtPnBlX2FsaWduID0gMDsKKworCWRtX2xpc3RfaW5pdCgmcHYtPnRhZ3MpOworCWRtX2xpc3RfaW5pdCgmcHYtPnNlZ21lbnRzKTsKKworCWlmICghYWxsb2NfcHZfc2VnbWVudF93aG9sZV9wdihtZW0sIHB2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9jdnRfc3B0eXBlKHVpbnQzMl90IHNwdHlwZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBzcHR5cGVfbmFtZXNbaV0ubmFtZVswXTsgaSsrKSB7CisJCWlmIChzcHR5cGUgPT0gc3B0eXBlX25hbWVzW2ldLmxhYmVsKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlsb2dfZGVidWdfbWV0YWRhdGEoIkZvdW5kIHNwdHlwZSAlWCBhbmQgY29udmVydGVkIGl0IHRvICVzIiwKKwkJCSAgIHNwdHlwZSwgc3B0eXBlX25hbWVzW2ldLm5hbWUpOworCXJldHVybiBzcHR5cGVfbmFtZXNbaV0ubmFtZTsKK30KKworc3RhdGljIGludCBfYWRkX3N0cmlwZV9zZWcoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCB1c2VyX3N1YnBvb2wgKnVzcCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgIHVpbnQzMl90ICpsZV9jdXIpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCXVuc2lnbmVkIGo7CisJdWludDMyX3QgYXJlYV9sZW47CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwLT5zdHJpcGluZykpIHsKKwkJbG9nX2Vycm9yKCJTdHJpcGUgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhcmVhX2xlbiA9ICh1c3AtPmRldnNbMF0uYmxvY2tzKSAvIFBPT0xfUEVfU0laRTsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdiwgKmxlX2N1ciwKKwkJCQkgICAgIGFyZWFfbGVuICogdXNwLT5udW1fZGV2cywgMCwKKwkJCQkgICAgIHVzcC0+c3RyaXBpbmcsIE5VTEwsIHVzcC0+bnVtX2RldnMsCisJCQkJICAgICBhcmVhX2xlbiwgMCwgMCwgMCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cmlwZWQgbHZfc2VnbWVudCBzdHJ1Y3R1cmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChqID0gMDsgaiA8IHVzcC0+bnVtX2RldnM7IGorKykKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX3B2KHNlZywgaiwgdXNwLT5kZXZzW2pdLnB2LCAwKSkKKwkJCXJldHVybl8wOworCisJLyogYWRkIHRoZSBzdWJwb29sIHR5cGUgdG8gdGhlIHNlZ21lbnQgdGFnIGxpc3QgKi8KKwlpZiAoIXN0cl9saXN0X2FkZChtZW0sICZzZWctPnRhZ3MsIF9jdnRfc3B0eXBlKHVzcC0+dHlwZSkpKSB7CisJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBmYWlsZWQgZm9yIHN0cl9saXN0LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbV9saXN0X2FkZCgmbHYtPnNlZ21lbnRzLCAmc2VnLT5saXN0KTsKKworCSpsZV9jdXIgKz0gc2VnLT5sZW47CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX2xpbmVhcl9zZWcoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCB1c2VyX3N1YnBvb2wgKnVzcCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgIHVpbnQzMl90ICpsZV9jdXIpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCXVuc2lnbmVkIGo7CisJdWludDMyX3QgYXJlYV9sZW47CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQlyZXR1cm5fMDsKKworCWZvciAoaiA9IDA7IGogPCB1c3AtPm51bV9kZXZzOyBqKyspIHsKKwkJYXJlYV9sZW4gPSAodXNwLT5kZXZzW2pdLmJsb2NrcykgLyBQT09MX1BFX1NJWkU7CisKKwkJaWYgKCEoc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdiwgKmxlX2N1ciwKKwkJCQkJICAgICBhcmVhX2xlbiwgMCwgdXNwLT5zdHJpcGluZywKKwkJCQkJICAgICBOVUxMLCAxLCBhcmVhX2xlbiwKKwkJCQkJICAgICBQT09MX1BFX1NJWkUsIDAsIDAsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbGluZWFyIGx2X3NlZ21lbnQgIgorCQkJCSAgInN0cnVjdHVyZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBhZGQgdGhlIHN1YnBvb2wgdHlwZSB0byB0aGUgc2VnbWVudCB0YWcgbGlzdCAqLworCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sICZzZWctPnRhZ3MsIF9jdnRfc3B0eXBlKHVzcC0+dHlwZSkpKSB7CisJCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gZmFpbGVkIGZvciBzdHJfbGlzdC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX3B2KHNlZywgMCwgdXNwLT5kZXZzW2pdLnB2LCAwKSkKKwkJCXJldHVybl8wOworCQlkbV9saXN0X2FkZCgmbHYtPnNlZ21lbnRzLCAmc2VnLT5saXN0KTsKKworCQkqbGVfY3VyICs9IHNlZy0+bGVuOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgaW1wb3J0X3Bvb2xfc2VnbWVudHMoc3RydWN0IGRtX2xpc3QgKmx2cywgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSBzdHJ1Y3QgdXNlcl9zdWJwb29sICp1c3AsIGludCBzdWJwb29scykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJdWludDMyX3QgbGVfY3VyID0gMDsKKwlpbnQgaTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGx2cykgeworCQlsdiA9IGx2bC0+bHY7CisKKwkJaWYgKGx2LT5zdGF0dXMgJiBTTkFQU0hPVCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBzdWJwb29sczsgaSsrKSB7CisJCQlpZiAodXNwW2ldLnN0cmlwaW5nKSB7CisJCQkJaWYgKCFfYWRkX3N0cmlwZV9zZWcobWVtLCAmdXNwW2ldLCBsdiwgJmxlX2N1cikpCisJCQkJCXJldHVybl8wOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIV9hZGRfbGluZWFyX3NlZyhtZW0sICZ1c3BbaV0sIGx2LCAmbGVfY3VyKSkKKwkJCQkJcmV0dXJuXzA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfcG9vbC9wb29sX2xhYmVsLmMgYi9saWIvZm9ybWF0X3Bvb2wvcG9vbF9sYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvcG9vbF9sYWJlbC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkaXNrX3JlcC5oIgorI2luY2x1ZGUgInBvb2xfbGFiZWwuaCIKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIHZvaWQgX3Bvb2xfbm90X3N1cHBvcnRlZChjb25zdCBjaGFyICpvcCkKK3sKKwlsb2dfZXJyb3IoIlRoZSAnJXMnIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgcG9vbCBsYWJlbGxlci4iLAorCQkgIG9wKTsKK30KKworc3RhdGljIGludCBfcG9vbF9jYW5faGFuZGxlKHN0cnVjdCBsYWJlbGxlciAqbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdm9pZCAqYnVmLCB1aW50NjRfdCBzZWN0b3IpCit7CisKKwlzdHJ1Y3QgcG9vbF9kaXNrIHBkOworCisJLyoKKwkgKiBQT09MIGxhYmVsIG11c3QgYWx3YXlzIGJlIGluIGZpcnN0IHNlY3RvcgorCSAqLworCWlmIChzZWN0b3IpCisJCXJldHVybiAwOworCisJcG9vbF9sYWJlbF9pbigmcGQsIGJ1Zik7CisKKwkvKiBjYW4gaWdub3JlIDggcmlnaHRtb3N0IGJpdHMgZm9yIG9uZGlzayBmb3JtYXQgY2hlY2sgKi8KKwlpZiAoKHBkLnBsX21hZ2ljID09IFBPT0xfTUFHSUMpICYmCisJICAgIChwZC5wbF92ZXJzaW9uID4+IDggPT0gUE9PTF9WRVJTSU9OID4+IDgpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9wb29sX3dyaXRlKHN0cnVjdCBsYWJlbCAqbGFiZWwgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHZvaWQgKmJ1ZiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlfcG9vbF9ub3Rfc3VwcG9ydGVkKCJ3cml0ZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9wb29sX3JlYWQoc3RydWN0IGxhYmVsbGVyICpsLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKKwkJIHN0cnVjdCBsYWJlbCAqKmxhYmVsKQoreworCXN0cnVjdCBwb29sX2xpc3QgcGw7CisKKwlyZXR1cm4gcmVhZF9wb29sX2xhYmVsKCZwbCwgbCwgZGV2LCBidWYsIGxhYmVsKTsKK30KKworc3RhdGljIGludCBfcG9vbF9pbml0aWFsaXNlX2xhYmVsKHN0cnVjdCBsYWJlbGxlciAqbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGxhYmVsICpsYWJlbCkKK3sKKwlzdHJjcHkobGFiZWwtPnR5cGUsICJQT09MIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3Bvb2xfZGVzdHJveV9sYWJlbChzdHJ1Y3QgbGFiZWxsZXIgKmwgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBsYWJlbCAqbGFiZWwgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9sYWJlbF9wb29sX2Rlc3Ryb3koc3RydWN0IGxhYmVsbGVyICpsKQoreworCWRtX2ZyZWUobCk7Cit9CisKK3N0cnVjdCBsYWJlbF9vcHMgX3Bvb2xfb3BzID0geworICAgICAgLmNhbl9oYW5kbGUgPSBfcG9vbF9jYW5faGFuZGxlLAorICAgICAgLndyaXRlID0gX3Bvb2xfd3JpdGUsCisgICAgICAucmVhZCA9IF9wb29sX3JlYWQsCisgICAgICAudmVyaWZ5ID0gX3Bvb2xfY2FuX2hhbmRsZSwKKyAgICAgIC5pbml0aWFsaXNlX2xhYmVsID0gX3Bvb2xfaW5pdGlhbGlzZV9sYWJlbCwKKyAgICAgIC5kZXN0cm95X2xhYmVsID0gX3Bvb2xfZGVzdHJveV9sYWJlbCwKKyAgICAgIC5kZXN0cm95ID0gX2xhYmVsX3Bvb2xfZGVzdHJveSwKK307CisKK3N0cnVjdCBsYWJlbGxlciAqcG9vbF9sYWJlbGxlcl9jcmVhdGUoc3RydWN0IGZvcm1hdF90eXBlICpmbXQpCit7CisJc3RydWN0IGxhYmVsbGVyICpsOworCisJaWYgKCEobCA9IGRtX21hbGxvYyhzaXplb2YoKmwpKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBsYWJlbGxlciBvYmplY3QuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWwtPm9wcyA9ICZfcG9vbF9vcHM7CisJbC0+Zm10ID0gZm10OworCisJcmV0dXJuIGw7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3Bvb2wvcG9vbF9sYWJlbC5oIGIvbGliL2Zvcm1hdF9wb29sL3Bvb2xfbGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTUyOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF9wb29sL3Bvb2xfbGFiZWwuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1BPT0xfTEFCRUxfSAorI2RlZmluZSBfTFZNX1BPT0xfTEFCRUxfSAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworc3RydWN0IGxhYmVsbGVyICpwb29sX2xhYmVsbGVyX2NyZWF0ZShzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF9wb29sL3NwdHlwZV9uYW1lcy5oIGIvbGliL2Zvcm1hdF9wb29sL3NwdHlwZV9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTJhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3Bvb2wvc3B0eXBlX25hbWVzLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBTUFRZUEVfTkFNRVNfSAorI2RlZmluZSBTUFRZUEVfTkFNRVNfSAorCisvKiBUaGlzIG11c3QgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggc2lzdGluYS9wb29sL21vZHVsZS9wb29sX3NwdHlwZXMuaCAqLworCisvKiAgR2VuZXJpYyBMYWJlbHMgICovCisjZGVmaW5lIFNQVFlQRV9EQVRBICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorCisvKiAgR0ZTIHNwZWNpZmljIGxhYmVscyAgKi8KKyNkZWZpbmUgU1BUWVBFX0dGU19EQVRBICAgICAgICAgICAgKDB4NjgwMTE2NzApCisjZGVmaW5lIFNQVFlQRV9HRlNfSk9VUk5BTCAgICAgICAgICgweDY5MDExNjcwKQorCitzdHJ1Y3Qgc3B0eXBlX25hbWUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdWludDMyX3QgbGFiZWw7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwdHlwZV9uYW1lIHNwdHlwZV9uYW1lc1tdID0geworCXsiZGF0YSIsCVNQVFlQRV9EQVRBfSwKKworCXsiZ2ZzX2RhdGEiLAlTUFRZUEVfR0ZTX0RBVEF9LAorCXsiZ2ZzX2pvdXJuYWwiLAlTUFRZUEVfR0ZTX0pPVVJOQUx9LAorCisJeyIiLCAweDB9CQkvKiAgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGZsYWcuICAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3RleHQvYXJjaGl2ZS5jIGIvbGliL2Zvcm1hdF90ZXh0L2FyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRlN2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF90ZXh0L2FyY2hpdmUuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJmb3JtYXQtdGV4dC5oIgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiaW1wb3J0LWV4cG9ydC5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJsdm0tZmlsZS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjZGVmaW5lIFNFQ1NfUEVSX0RBWSA4NjQwMAkvKiAyNCo2MCo2MCAqLworCisvKgorICogVGhlIGZvcm1hdCBpbnN0YW5jZSBpcyBnaXZlbiBhIGRpcmVjdG9yeSBwYXRoIHVwb24gY3JlYXRpb24uCisgKiBFYWNoIGZpbGUgaW4gdGhpcyBkaXJlY3Rvcnkgd2hvc2UgbmFtZSBpcyBvZiB0aGUgZm9ybQorICogJyguKilfWzAtOV0qLnZnJyBpcyBhIGNvbmZpZyBmaWxlIChzZWUgbGliL2NvbmZpZy5baGNdKSwgd2hpY2gKKyAqIGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgdm9sdW1lIGdyb3VwLgorICoKKyAqIFRoZSBwcmVmaXggKCQxIGZyb20gdGhlIGFib3ZlIHJlZ2V4KSBvZiB0aGUgY29uZmlnIGZpbGUgZ2l2ZXMKKyAqIHRoZSB2b2x1bWUgZ3JvdXAgbmFtZS4KKyAqCisgKiBCYWNrdXAgZmlsZXMgdGhhdCBoYXZlIGV4cGlyZWQgd2lsbCBiZSByZW1vdmVkLgorICovCisKKy8qCisgKiBBIGxpc3Qgb2YgdGhlc2UgaXMgYnVpbHQgdXAgZm9yIG91ciB2b2x1bWUgZ3JvdXAuICBPcmRlcmVkCisgKiB3aXRoIHRoZSBsZWFzdCByZWNlbnQgYXQgdGhlIGhlYWQuCisgKi8KK3N0cnVjdCBhcmNoaXZlX2ZpbGUgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisKKwljb25zdCBjaGFyICpwYXRoOworCXVpbnQzMl90IGluZGV4OworfTsKKworLyoKKyAqIEV4dHJhY3QgdmcgbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIgZnJvbSBhIGZpbGVuYW1lLgorICovCitzdGF0aWMgaW50IF9zcGxpdF92Zyhjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqdmduYW1lLCBzaXplX3QgdmdzaXplLAorCQkgICAgIHVpbnQzMl90ICppeCkKK3sKKwlzaXplX3QgbGVuLCB2Z19sZW47CisJY29uc3QgY2hhciAqZG90LCAqdW5kZXJzY29yZTsKKworCWxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisJaWYgKGxlbiA8IDcpCisJCXJldHVybiAwOworCisJZG90ID0gKGZpbGVuYW1lICsgbGVuIC0gMyk7CisJaWYgKHN0cmNtcCgiLnZnIiwgZG90KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoISh1bmRlcnNjb3JlID0gc3RycmNocihmaWxlbmFtZSwgJ18nKSkpCisJCXJldHVybiAwOworCisJaWYgKHNzY2FuZih1bmRlcnNjb3JlICsgMSwgIiV1IiwgaXgpICE9IDEpCisJCXJldHVybiAwOworCisJdmdfbGVuID0gdW5kZXJzY29yZSAtIGZpbGVuYW1lOworCWlmICh2Z19sZW4gKyAxID4gdmdzaXplKQorCQlyZXR1cm4gMDsKKworCXN0cm5jcHkodmduYW1lLCBmaWxlbmFtZSwgdmdfbGVuKTsKKwl2Z25hbWVbdmdfbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2luc2VydF9hcmNoaXZlX2ZpbGUoc3RydWN0IGRtX2xpc3QgKmhlYWQsIHN0cnVjdCBhcmNoaXZlX2ZpbGUgKmIpCit7CisJc3RydWN0IGFyY2hpdmVfZmlsZSAqYmYgPSBOVUxMOworCisJaWYgKGRtX2xpc3RfZW1wdHkoaGVhZCkpIHsKKwkJZG1fbGlzdF9hZGQoaGVhZCwgJmItPmxpc3QpOworCQlyZXR1cm47CisJfQorCisJLyogaW5kZXggcmVkdWNlcyB0aHJvdWdoIGxpc3QgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoYmYsIGhlYWQpIHsKKwkJaWYgKGItPmluZGV4ID4gYmYtPmluZGV4KSB7CisJCQlkbV9saXN0X2FkZCgmYmYtPmxpc3QsICZiLT5saXN0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWRtX2xpc3RfYWRkX2goJmJmLT5saXN0LCAmYi0+bGlzdCk7Cit9CisKK3N0YXRpYyBjaGFyICpfam9pbl9maWxlX3RvX2RpcihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDMyKSB8fAorCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChtZW0sIGRpciwgc3RybGVuKGRpcikpIHx8CisJICAgICFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIi8iLCAxKSB8fAorCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChtZW0sIG5hbWUsIHN0cmxlbihuYW1lKSkgfHwKKwkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgbGlzdCBvZiBhcmNoaXZlX2ZpbGVzLgorICovCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9zY2FuX2FyY2hpdmUoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgIGNvbnN0IGNoYXIgKnZnbmFtZSwgY29uc3QgY2hhciAqZGlyKQoreworCWludCBpLCBjb3VudDsKKwl1aW50MzJfdCBpeDsKKwljaGFyIHZnbmFtZV9mb3VuZFs2NF0sICpwYXRoOworCXN0cnVjdCBkaXJlbnQgKipkaXJlbnQ7CisJc3RydWN0IGFyY2hpdmVfZmlsZSAqYWY7CisJc3RydWN0IGRtX2xpc3QgKnJlc3VsdHM7CisKKwlpZiAoIShyZXN1bHRzID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqcmVzdWx0cykpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlkbV9saXN0X2luaXQocmVzdWx0cyk7CisKKwkvKiBTb3J0IGZhaWxzIGJleW9uZCA1LWRpZ2l0IGluZGV4ZXMgKi8KKwlpZiAoKGNvdW50ID0gc2NhbmRpcihkaXIsICZkaXJlbnQsIE5VTEwsIGFscGhhc29ydCkpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHNjYW4gdGhlIGFyY2hpdmUgZGlyZWN0b3J5ICglcykuIiwgZGlyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoZGlyZW50W2ldLT5kX25hbWUsICIuIikgfHwKKwkJICAgICFzdHJjbXAoZGlyZW50W2ldLT5kX25hbWUsICIuLiIpKQorCQkJY29udGludWU7CisKKwkJLyogY2hlY2sgdGhlIG5hbWUgaXMgdGhlIGNvcnJlY3QgZm9ybWF0ICovCisJCWlmICghX3NwbGl0X3ZnKGRpcmVudFtpXS0+ZF9uYW1lLCB2Z25hbWVfZm91bmQsCisJCQkgICAgICAgc2l6ZW9mKHZnbmFtZV9mb3VuZCksICZpeCkpCisJCQljb250aW51ZTsKKworCQkvKiBpcyBpdCB0aGUgdmcgd2UncmUgaW50ZXJlc3RlZCBpbiA/ICovCisJCWlmIChzdHJjbXAodmduYW1lLCB2Z25hbWVfZm91bmQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEocGF0aCA9IF9qb2luX2ZpbGVfdG9fZGlyKG1lbSwgZGlyLCBkaXJlbnRbaV0tPmRfbmFtZSkpKQorCQkJZ290b19vdXQ7CisKKwkJLyoKKwkJICogQ3JlYXRlIGEgbmV3IGFyY2hpdmVfZmlsZS4KKwkJICovCisJCWlmICghKGFmID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqYWYpKSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIG5ldyBhcmNoaXZlIGZpbGUuIik7CisJCQlyZXN1bHRzID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYWYtPmluZGV4ID0gaXg7CisJCWFmLT5wYXRoID0gcGF0aDsKKworCQkvKgorCQkgKiBJbnNlcnQgaXQgdG8gdGhlIGNvcnJlY3QgcGFydCBvZiB0aGUgbGlzdC4KKwkJICovCisJCV9pbnNlcnRfYXJjaGl2ZV9maWxlKHJlc3VsdHMsIGFmKTsKKwl9CisKKyAgICAgIG91dDoKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJZnJlZShkaXJlbnRbaV0pOworCWZyZWUoZGlyZW50KTsKKworCXJldHVybiByZXN1bHRzOworfQorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2V4cGlyZWQoc3RydWN0IGRtX2xpc3QgKmFyY2hpdmVzLCB1aW50MzJfdCBhcmNoaXZlc19zaXplLAorCQkJICAgIHVpbnQzMl90IHJldGFpbl9kYXlzLCB1aW50MzJfdCBtaW5fYXJjaGl2ZSkKK3sKKwlzdHJ1Y3QgYXJjaGl2ZV9maWxlICpiZjsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwl0aW1lX3QgcmV0YWluX3RpbWU7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBhcmNoaXZlcyB0byBldmVuIGJvdGhlciBsb29raW5nIGZvcgorCSAqIGV4cGlyZWQgb25lcy4uLiAqLworCWlmIChhcmNoaXZlc19zaXplIDw9IG1pbl9hcmNoaXZlKQorCQlyZXR1cm47CisKKwkvKiBDb252ZXJ0IHJldGFpbl9kYXlzIGludG8gdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd2UgbXVzdCByZXRhaW4gKi8KKwlyZXRhaW5fdGltZSA9IHRpbWUoTlVMTCkgLSAodGltZV90KSByZXRhaW5fZGF5cyAqU0VDU19QRVJfREFZOworCisJLyogQXNzdW1lIGxpc3QgaXMgb3JkZXJlZCBuZXdlc3QgZmlyc3QgKGJ5IGluZGV4KSAqLworCWRtX2xpc3RfaXRlcmF0ZV9iYWNrX2l0ZW1zKGJmLCBhcmNoaXZlcykgeworCQkvKiBHZXQgdGhlIG10aW1lIG9mIHRoZSBmaWxlIGFuZCB1bmxpbmsgaWYgdG9vIG9sZCAqLworCQlpZiAoc3RhdChiZi0+cGF0aCwgJnNiKSkgeworCQkJbG9nX3N5c19lcnJvcigic3RhdCIsIGJmLT5wYXRoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNiLnN0X210aW1lID4gcmV0YWluX3RpbWUpCisJCQlyZXR1cm47CisKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiRXhwaXJpbmcgYXJjaGl2ZSAlcyIsIGJmLT5wYXRoKTsKKwkJaWYgKHVubGluayhiZi0+cGF0aCkpCisJCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBiZi0+cGF0aCk7CisKKwkJLyogRG9uJ3QgZGVsZXRlIGFueSBtb3JlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIG1pbmltdW0gKi8KKwkJaWYgKC0tYXJjaGl2ZXNfc2l6ZSA8PSBtaW5fYXJjaGl2ZSkKKwkJCXJldHVybjsKKwl9Cit9CisKK2ludCBhcmNoaXZlX3ZnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCSAgICAgICBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmRlc2MsCisJICAgICAgIHVpbnQzMl90IHJldGFpbl9kYXlzLCB1aW50MzJfdCBtaW5fYXJjaGl2ZSkKK3sKKwlpbnQgaSwgZmQsIHJudW0sIHJlbmFtZWQgPSAwOworCXVpbnQzMl90IGl4ID0gMDsKKwlzdHJ1Y3QgYXJjaGl2ZV9maWxlICpsYXN0OworCUZJTEUgKmZwID0gTlVMTDsKKwljaGFyIHRlbXBfZmlsZVtQQVRIX01BWF0sIGFyY2hpdmVfbmFtZVtQQVRIX01BWF07CisJc3RydWN0IGRtX2xpc3QgKmFyY2hpdmVzOworCisJLyoKKwkgKiBXcml0ZSB0aGUgdmcgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUuCisJICovCisJaWYgKCFjcmVhdGVfdGVtcF9uYW1lKGRpciwgdGVtcF9maWxlLCBzaXplb2YodGVtcF9maWxlKSwgJmZkLAorCQkJICAgICAgJnZnLT5jbWQtPnJhbmRfc2VlZCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGVtcG9yYXJ5IGFyY2hpdmUgbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZnAgPSBmZG9wZW4oZmQsICJ3IikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIEZJTEUgb2JqZWN0IGZvciBhcmNoaXZlLiIpOworCQlpZiAoY2xvc2UoZmQpKQorCQkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCB0ZW1wX2ZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXRleHRfdmdfZXhwb3J0X2ZpbGUodmcsIGRlc2MsIGZwKSkgeworCQlpZiAoZmNsb3NlKGZwKSkKKwkJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHRlbXBfZmlsZSk7CisJCXJldHVybl8wOworCX0KKworCWlmIChsdm1fZmNsb3NlKGZwLCB0ZW1wX2ZpbGUpKQorCQlyZXR1cm5fMDsgLyogTGVhdmUgZmlsZSBiZWhpbmQgYXMgZXZpZGVuY2Ugb2YgZmFpbHVyZSAqLworCisJLyoKKwkgKiBOb3cgd2Ugd2FudCB0byByZW5hbWUgdGhpcyBmaWxlIHRvIDx2Zz5faW5kZXgudmcuCisJICovCisJaWYgKCEoYXJjaGl2ZXMgPSBfc2Nhbl9hcmNoaXZlKHZnLT5jbWQtPm1lbSwgdmctPm5hbWUsIGRpcikpKQorCQlyZXR1cm5fMDsKKworCWlmIChkbV9saXN0X2VtcHR5KGFyY2hpdmVzKSkKKwkJaXggPSAwOworCWVsc2UgeworCQlsYXN0ID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfZmlyc3QoYXJjaGl2ZXMpLCBzdHJ1Y3QgYXJjaGl2ZV9maWxlKTsKKwkJaXggPSBsYXN0LT5pbmRleCArIDE7CisJfQorCisJcm51bSA9IHJhbmRfcigmdmctPmNtZC0+cmFuZF9zZWVkKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmIChkbV9zbnByaW50ZihhcmNoaXZlX25hbWUsIHNpemVvZihhcmNoaXZlX25hbWUpLAorCQkJCSAiJXMvJXNfJTA1dS0lZC52ZyIsCisJCQkJIGRpciwgdmctPm5hbWUsIGl4LCBybnVtKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiQXJjaGl2ZSBmaWxlIG5hbWUgdG9vIGxvbmcuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgocmVuYW1lZCA9IGx2bV9yZW5hbWUodGVtcF9maWxlLCBhcmNoaXZlX25hbWUpKSkKKwkJCWJyZWFrOworCisJCWl4Kys7CisJfQorCisJaWYgKCFyZW5hbWVkKQorCQlsb2dfZXJyb3IoIkFyY2hpdmUgcmVuYW1lIGZhaWxlZCBmb3IgJXMiLCB0ZW1wX2ZpbGUpOworCisJX3JlbW92ZV9leHBpcmVkKGFyY2hpdmVzLCBkbV9saXN0X3NpemUoYXJjaGl2ZXMpICsgcmVuYW1lZCwgcmV0YWluX2RheXMsCisJCQltaW5fYXJjaGl2ZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BsYXlfYXJjaGl2ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyY2hpdmVfZmlsZSAqYWYpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBOVUxMOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKnRmOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4IGZpYzsKKwlzdHJ1Y3QgdGV4dF9jb250ZXh0IHRjID0gey5wYXRoX2xpdmUgPSBhZi0+cGF0aCwKKwkJCQkgIC5wYXRoX2VkaXQgPSBOVUxMLAorCQkJCSAgLmRlc2MgPSBOVUxMfTsKKwl0aW1lX3Qgd2hlbjsKKwljaGFyICpkZXNjOworCisJbG9nX3ByaW50KCIgIik7CisJbG9nX3ByaW50KCJGaWxlOlx0XHQlcyIsIGFmLT5wYXRoKTsKKworCWZpYy50eXBlID0gRk1UX0lOU1RBTkNFX1BSSVZBVEVfTURBUzsKKwlmaWMuY29udGV4dC5wcml2YXRlID0gJnRjOworCWlmICghKHRmID0gY21kLT5mbXRfYmFja3VwLT5vcHMtPmNyZWF0ZV9pbnN0YW5jZShjbWQtPmZtdF9iYWNrdXAsICZmaWMpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0ZXh0IGluc3RhbmNlIG9iamVjdC4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmVhZCB0aGUgYXJjaGl2ZSBmaWxlIHRvIGVuc3VyZSB0aGF0IGl0IGlzIHZhbGlkLCBhbmQKKwkgKiByZXRyaWV2ZSB0aGUgYXJjaGl2ZSB0aW1lIGFuZCBkZXNjcmlwdGlvbi4KKwkgKi8KKwkvKiBGSVhNRSBVc2UgdmFyaWF0aW9uIG9uIF92Z19yZWFkICovCisJaWYgKCEodmcgPSB0ZXh0X3ZnX2ltcG9ydF9maWxlKHRmLCBhZi0+cGF0aCwgJndoZW4sICZkZXNjKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVhZCBhcmNoaXZlIGZpbGUuIik7CisJCXRmLT5mbXQtPm9wcy0+ZGVzdHJveV9pbnN0YW5jZSh0Zik7CisJCXJldHVybjsKKwl9CisKKwlsb2dfcHJpbnQoIlZHIG5hbWU6ICAgIFx0JXMiLCB2Zy0+bmFtZSk7CisJbG9nX3ByaW50KCJEZXNjcmlwdGlvbjpcdCVzIiwgZGVzYyA/IDogIjxObyBkZXNjcmlwdGlvbj4iKTsKKwlsb2dfcHJpbnQoIkJhY2t1cCBUaW1lOlx0JXMiLCBjdGltZSgmd2hlbikpOworCisJcmVsZWFzZV92Zyh2Zyk7Cit9CisKK2ludCBhcmNoaXZlX2xpc3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqdmduYW1lKQoreworCXN0cnVjdCBkbV9saXN0ICphcmNoaXZlczsKKwlzdHJ1Y3QgYXJjaGl2ZV9maWxlICphZjsKKworCWlmICghKGFyY2hpdmVzID0gX3NjYW5fYXJjaGl2ZShjbWQtPm1lbSwgdmduYW1lLCBkaXIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZG1fbGlzdF9lbXB0eShhcmNoaXZlcykpCisJCWxvZ19wcmludCgiTm8gYXJjaGl2ZXMgZm91bmQgaW4gJXMuIiwgZGlyKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9iYWNrX2l0ZW1zKGFmLCBhcmNoaXZlcykKKwkJX2Rpc3BsYXlfYXJjaGl2ZShjbWQsIGFmKTsKKworCWRtX3Bvb2xfZnJlZShjbWQtPm1lbSwgYXJjaGl2ZXMpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBhcmNoaXZlX2xpc3RfZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgYXJjaGl2ZV9maWxlIGFmOworCisJYWYucGF0aCA9IGZpbGU7CisKKwlpZiAoIXBhdGhfZXhpc3RzKGFmLnBhdGgpKSB7CisJCWxvZ19lcnJvcigiQXJjaGl2ZSBmaWxlICVzIG5vdCBmb3VuZC4iLCBhZi5wYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX2Rpc3BsYXlfYXJjaGl2ZShjbWQsICZhZik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGJhY2t1cF9saXN0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwlzdHJ1Y3QgYXJjaGl2ZV9maWxlIGFmOworCisJaWYgKCEoYWYucGF0aCA9IF9qb2luX2ZpbGVfdG9fZGlyKGNtZC0+bWVtLCBkaXIsIHZnbmFtZSkpKQorCQlyZXR1cm5fMDsKKworCWlmIChwYXRoX2V4aXN0cyhhZi5wYXRoKSkKKwkJX2Rpc3BsYXlfYXJjaGl2ZShjbWQsICZhZik7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfdGV4dC9hcmNoaXZlci5jIGIvbGliL2Zvcm1hdF90ZXh0L2FyY2hpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3OTllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC9hcmNoaXZlci5jCkBAIC0wLDAgKzEsNjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAiZm9ybWF0LXRleHQuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm1ldGFkLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0cnVjdCBhcmNoaXZlX3BhcmFtcyB7CisJaW50IGVuYWJsZWQ7CisJY2hhciAqZGlyOworCXVuc2lnbmVkIGludCBrZWVwX2RheXM7CisJdW5zaWduZWQgaW50IGtlZXBfbnVtYmVyOworfTsKKworc3RydWN0IGJhY2t1cF9wYXJhbXMgeworCWludCBlbmFibGVkOworCWNoYXIgKmRpcjsKK307CisKK2ludCBhcmNoaXZlX2luaXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRpciwKKwkJIHVuc2lnbmVkIGludCBrZWVwX2RheXMsIHVuc2lnbmVkIGludCBrZWVwX21pbiwKKwkJIGludCBlbmFibGVkKQoreworCWFyY2hpdmVfZXhpdChjbWQpOworCisJaWYgKCEoY21kLT5hcmNoaXZlX3BhcmFtcyA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bGlibWVtLAorCQkJCQkJc2l6ZW9mKCpjbWQtPmFyY2hpdmVfcGFyYW1zKSkpKSB7CisJCWxvZ19lcnJvcigiYXJjaGl2ZV9wYXJhbXMgYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWNtZC0+YXJjaGl2ZV9wYXJhbXMtPmRpciA9IE5VTEw7CisKKwlpZiAoISpkaXIpCisJCXJldHVybiAxOworCisJaWYgKCEoY21kLT5hcmNoaXZlX3BhcmFtcy0+ZGlyID0gZG1fc3RyZHVwKGRpcikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY29weSBhcmNoaXZlIGRpcmVjdG9yeSBuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWQtPmFyY2hpdmVfcGFyYW1zLT5rZWVwX2RheXMgPSBrZWVwX2RheXM7CisJY21kLT5hcmNoaXZlX3BhcmFtcy0+a2VlcF9udW1iZXIgPSBrZWVwX21pbjsKKwlhcmNoaXZlX2VuYWJsZShjbWQsIGVuYWJsZWQpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXJjaGl2ZV9leGl0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWlmICghY21kLT5hcmNoaXZlX3BhcmFtcykKKwkJcmV0dXJuOworCWRtX2ZyZWUoY21kLT5hcmNoaXZlX3BhcmFtcy0+ZGlyKTsKKwltZW1zZXQoY21kLT5hcmNoaXZlX3BhcmFtcywgMCwgc2l6ZW9mKCpjbWQtPmFyY2hpdmVfcGFyYW1zKSk7Cit9CisKK3ZvaWQgYXJjaGl2ZV9lbmFibGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBmbGFnKQoreworCWNtZC0+YXJjaGl2ZV9wYXJhbXMtPmVuYWJsZWQgPSBmbGFnOworfQorCitzdGF0aWMgY2hhciAqX2J1aWxkX2Rlc2Moc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqbGluZSwgaW50IGJlZm9yZSkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKGxpbmUpICsgMzI7CisJY2hhciAqYnVmZmVyOworCisJaWYgKCEoYnVmZmVyID0gZG1fcG9vbF9hbGxvYyhtZW0sIGxlbikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGRlc2MuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbV9zbnByaW50ZihidWZmZXIsIGxlbiwgIkNyZWF0ZWQgJXMgZXhlY3V0aW5nICclcyciLAorCQkJYmVmb3JlID8gIipiZWZvcmUqIiA6ICIqYWZ0ZXIqIiwgbGluZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIGRlc2MuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBpbnQgX2FyY2hpdmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBjb21wdWxzb3J5KQoreworCWNoYXIgKmRlc2M7CisKKwkvKiBEb24ndCBhcmNoaXZlIG9ycGhhbiBWR3MuICovCisJaWYgKGlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpCisJCXJldHVybiAxOworCisJaWYgKHZnX2lzX2FyY2hpdmVkKHZnKSkKKwkJcmV0dXJuIDE7IC8qIFZHIGhhcyBiZWVuIGFscmVhZHkgYXJjaGl2ZWQgKi8KKworCWlmICghdmctPmNtZC0+YXJjaGl2ZV9wYXJhbXMtPmVuYWJsZWQgfHwgIXZnLT5jbWQtPmFyY2hpdmVfcGFyYW1zLT5kaXIpIHsKKwkJdmctPnN0YXR1cyB8PSBBUkNISVZFRF9WRzsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHRlc3RfbW9kZSgpKSB7CisJCXZnLT5zdGF0dXMgfD0gQVJDSElWRURfVkc7CisJCWxvZ192ZXJib3NlKCJUZXN0IG1vZGU6IFNraXBwaW5nIGFyY2hpdmluZyBvZiB2b2x1bWUgZ3JvdXAuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghZG1fY3JlYXRlX2Rpcih2Zy0+Y21kLT5hcmNoaXZlX3BhcmFtcy0+ZGlyKSkgeworCQlpZiAoY29tcHVsc29yeSkKKwkJCXJldHVybl8wOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBUcmFwIGEgcmVhZC1vbmx5IGZpbGUgc3lzdGVtICovCisJaWYgKChhY2Nlc3ModmctPmNtZC0+YXJjaGl2ZV9wYXJhbXMtPmRpciwgUl9PSyB8IFdfT0sgfCBYX09LKSA9PSAtMSkgJiYKKwkgICAgKGVycm5vID09IEVST0ZTKSkgeworCQlpZiAoY29tcHVsc29yeSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgYXJjaGl2ZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgZm9yICVzIHRvIHJlYWQtb25seSBmaWxlc3lzdGVtLiIsCisJCQkJICB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlsb2dfdmVyYm9zZSgiQXJjaGl2aW5nIHZvbHVtZSBncm91cCBcIiVzXCIgbWV0YWRhdGEgKHNlcW5vICV1KS4iLCB2Zy0+bmFtZSwKKwkJICAgIHZnLT5zZXFubyk7CisKKwlpZiAoIShkZXNjID0gX2J1aWxkX2Rlc2ModmctPmNtZC0+bWVtLCB2Zy0+Y21kLT5jbWRfbGluZSwgMSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghYXJjaGl2ZV92Zyh2ZywgdmctPmNtZC0+YXJjaGl2ZV9wYXJhbXMtPmRpciwgZGVzYywKKwkJCXZnLT5jbWQtPmFyY2hpdmVfcGFyYW1zLT5rZWVwX2RheXMsCisJCQl2Zy0+Y21kLT5hcmNoaXZlX3BhcmFtcy0+a2VlcF9udW1iZXIpKQorCQlyZXR1cm5fMDsKKworCXZnLT5zdGF0dXMgfD0gQVJDSElWRURfVkc7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGFyY2hpdmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIF9hcmNoaXZlKHZnLCAxKTsKK30KKworaW50IGFyY2hpdmVfZGlzcGxheShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSkKK3sKKwlpbnQgcjEsIHIyOworCisJcjEgPSBhcmNoaXZlX2xpc3QoY21kLCBjbWQtPmFyY2hpdmVfcGFyYW1zLT5kaXIsIHZnX25hbWUpOworCXIyID0gYmFja3VwX2xpc3QoY21kLCBjbWQtPmJhY2t1cF9wYXJhbXMtPmRpciwgdmdfbmFtZSk7CisKKwlyZXR1cm4gcjEgJiYgcjI7Cit9CisKK2ludCBhcmNoaXZlX2Rpc3BsYXlfZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpbnQgcjsKKworCXIgPSBhcmNoaXZlX2xpc3RfZmlsZShjbWQsIGZpbGUpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBiYWNrdXBfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGlyLAorCQlpbnQgZW5hYmxlZCkKK3sKKwliYWNrdXBfZXhpdChjbWQpOworCisJaWYgKCEoY21kLT5iYWNrdXBfcGFyYW1zID0gZG1fcG9vbF96YWxsb2MoY21kLT5saWJtZW0sCisJCQkJCSAgICAgICBzaXplb2YoKmNtZC0+YmFja3VwX3BhcmFtcykpKSkgeworCQlsb2dfZXJyb3IoImJhY2t1cF9wYXJhbXMgYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWNtZC0+YmFja3VwX3BhcmFtcy0+ZGlyID0gTlVMTDsKKwlpZiAoISpkaXIpCisJCXJldHVybiAxOworCisJaWYgKCEoY21kLT5iYWNrdXBfcGFyYW1zLT5kaXIgPSBkbV9zdHJkdXAoZGlyKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjb3B5IGJhY2t1cCBkaXJlY3RvcnkgbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWJhY2t1cF9lbmFibGUoY21kLCBlbmFibGVkKTsKKworCXJldHVybiAxOworfQorCit2b2lkIGJhY2t1cF9leGl0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWlmICghY21kLT5iYWNrdXBfcGFyYW1zKQorCQlyZXR1cm47CisJZG1fZnJlZShjbWQtPmJhY2t1cF9wYXJhbXMtPmRpcik7CisJbWVtc2V0KGNtZC0+YmFja3VwX3BhcmFtcywgMCwgc2l6ZW9mKCpjbWQtPmJhY2t1cF9wYXJhbXMpKTsKK30KKwordm9pZCBiYWNrdXBfZW5hYmxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZmxhZykKK3sKKwljbWQtPmJhY2t1cF9wYXJhbXMtPmVuYWJsZWQgPSBmbGFnOworfQorCitzdGF0aWMgaW50IF9iYWNrdXAoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwljaGFyICpkZXNjOworCisJaWYgKCEoZGVzYyA9IF9idWlsZF9kZXNjKHZnLT5jbWQtPm1lbSwgdmctPmNtZC0+Y21kX2xpbmUsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZG1fc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvJXMiLAorCQkJIHZnLT5jbWQtPmJhY2t1cF9wYXJhbXMtPmRpciwgdmctPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgYmFja3VwICIKKwkJCSAgImZpbGVuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gYmFja3VwX3RvX2ZpbGUobmFtZSwgZGVzYywgdmcpOworfQorCitpbnQgYmFja3VwX2xvY2FsbHkoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCF2Zy0+Y21kLT5iYWNrdXBfcGFyYW1zLT5lbmFibGVkIHx8ICF2Zy0+Y21kLT5iYWNrdXBfcGFyYW1zLT5kaXIpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFRoaXMgbWV0YWRhdGEgdXBkYXRlIGlzIE5PVCBiYWNrZWQgdXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHRlc3RfbW9kZSgpKSB7CisJCWxvZ192ZXJib3NlKCJUZXN0IG1vZGU6IFNraXBwaW5nIGJhY2t1cCBvZiB2b2x1bWUgZ3JvdXAuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghZG1fY3JlYXRlX2Rpcih2Zy0+Y21kLT5iYWNrdXBfcGFyYW1zLT5kaXIpKQorCQlyZXR1cm4gMDsKKworCS8qIFRyYXAgYSByZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKwlpZiAoKGFjY2Vzcyh2Zy0+Y21kLT5iYWNrdXBfcGFyYW1zLT5kaXIsIFJfT0sgfCBXX09LIHwgWF9PSykgPT0gLTEpICYmCisJICAgIChlcnJubyA9PSBFUk9GUykpIHsKKwkJLyogV2lsbCB0YWtlIGEgYmFja3VwIG5leHQgdGltZSB3aGVuIEZTIGlzIHdyaXRhYmxlICovCisJCWxvZ19kZWJ1ZygiU2tpcHBpbmcgYmFja3VwIG9mIHZvbHVtZSBncm91cCBvbiByZWFkLW9ubHkgZmlsZXN5c3RlbS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfYmFja3VwKHZnKSkgeworCQlsb2dfZXJyb3IoIkJhY2t1cCBvZiB2b2x1bWUgZ3JvdXAgJXMgbWV0YWRhdGEgZmFpbGVkLiIsCisJCQkgIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBiYWNrdXAoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJLyogVW5sb2NrIG1lbW9yeSBpZiBwb3NzaWJsZSAqLworCW1lbWxvY2tfdW5sb2NrKHZnLT5jbWQpOworCisJLyogRG9uJ3QgYmFjayB1cCBvcnBoYW4gVkdzLiAqLworCWlmIChpc19vcnBoYW5fdmcodmctPm5hbWUpKQorCQlyZXR1cm4gMTsKKworCWlmICh2Z19pc19jbHVzdGVyZWQodmcpKQorCQlpZiAoIXJlbW90ZV9iYWNrdXBfbWV0YWRhdGEodmcpKQorCQkJc3RhY2s7CisKKwlyZXR1cm4gYmFja3VwX2xvY2FsbHkodmcpOworfQorCitpbnQgYmFja3VwX3JlbW92ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzIiwKKwkJCSBjbWQtPmJhY2t1cF9wYXJhbXMtPmRpciwgdmdfbmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIGJhY2t1cCBmaWxlbmFtZSAoZm9yIHJlbW92YWwpLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIExldCB0aGlzIGZhaWwgc2lsZW50bHkuCisJICovCisJaWYgKHVubGluayhwYXRoKSkKKwkJbG9nX3N5c19kZWJ1ZygidW5saW5rIiwgcGF0aCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHZvbHVtZV9ncm91cCAqYmFja3VwX3JlYWRfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBOVUxMOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKnRmOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4IGZpYzsKKwlzdHJ1Y3QgdGV4dF9jb250ZXh0IHRjID0gey5wYXRoX2xpdmUgPSBmaWxlLAorCQkJCSAgLnBhdGhfZWRpdCA9IE5VTEwsCisJCQkJICAuZGVzYyA9IGNtZC0+Y21kX2xpbmV9OworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisKKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9QUklWQVRFX01EQVM7CisJZmljLmNvbnRleHQucHJpdmF0ZSA9ICZ0YzsKKwlpZiAoISh0ZiA9IGNtZC0+Zm10X2JhY2t1cC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoY21kLT5mbXRfYmFja3VwLCAmZmljKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGV4dCBmb3JtYXQgb2JqZWN0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmdGYtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkgeworCQlpZiAoISh2ZyA9IG1kYS0+b3BzLT52Z19yZWFkKHRmLCB2Z19uYW1lLCBtZGEsIE5VTEwsIE5VTEwsIDApKSkKKwkJCXN0YWNrOworCQlicmVhazsKKwl9CisKKwlpZiAoIXZnKQorCQl0Zi0+Zm10LT5vcHMtPmRlc3Ryb3lfaW5zdGFuY2UodGYpOworCisJcmV0dXJuIHZnOworfQorCitzdGF0aWMgaW50IF9yZXN0b3JlX3ZnX3Nob3VsZF93cml0ZV9wdihzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IGRvX3B2Y3JlYXRlKQoreworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCisJaWYgKGRvX3B2Y3JlYXRlKQorCQlyZXR1cm4gMTsKKworCWlmICghKHB2LT5mbXQtPmZlYXR1cmVzICYgRk1UX1BWX0ZMQUdTKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXB2LT5kZXYpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBkZXZpY2UgZm9yIFBWLiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKHB2LT5kZXYtPnB2aWQsIHB2LT5kZXYsIDApKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIGNhY2hlZCBpbmZvIGZvciBQViAlcy4iLCBwdl9kZXZfbmFtZShwdikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBXZSdyZSByZXN0b3JpbmcgYSBWRyBhbmQgaWYgdGhlIFBWX0VYVF9VU0VECisJICogZmxhZyBpcyBub3Qgc2V0IHlldCBpbiBQViwgd2UgbmVlZCB0byBzZXQgaXQgbm93IQorCSAqIFRoaXMgbWF5IGhhcHBlbiBpZiB3ZSBoYXZlIHBsYWluIFBWcyB3aXRob3V0IGEgVkcKKwkgKiBhbmQgd2UncmUgcmVzdG9yaW5nIGZvcm1lciBWRyBmcm9tIGJhY2t1cCBvbiB0b3AKKwkgKiBvZiB0aGVzZSBQVnMuCisJICovCisJaWYgKCEobHZtY2FjaGVfZXh0X2ZsYWdzKGluZm8pICYgUFZfRVhUX1VTRUQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBPUlBIQU4gYW5kIFZHIGxvY2tzIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyAqLworaW50IGJhY2t1cF9yZXN0b3JlX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgaW50IGRvX3B2Y3JlYXRlLCBzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgKnB2YSkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCBuZXdfcHZzOworCXN0cnVjdCBwdl9saXN0ICpwdmwsICpuZXdfcHZsOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKmV4aXN0aW5nX3B2LCAqcHY7CisJc3RydWN0IGRtX2xpc3QgKnB2cyA9ICZ2Zy0+cHZzOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWM7CisJaW50IHNob3VsZF93cml0ZV9wdjsKKwl1aW50MzJfdCB0bXBfZXh0ZW50X3NpemU7CisKKwkvKgorCSAqIEZJWE1FOiBDaGVjayB0aGF0IHRoZSBQVnMgcmVmZXJlbmNlZCBpbiB0aGUgYmFja3VwIGFyZQorCSAqIG5vdCBtZW1iZXJzIG9mIG90aGVyIGV4aXN0aW5nIFZHcy4KKwkgKi8KKworCS8qIFByZXBhcmUgbmV3IFBWcyBpZiBuZWVkZWQuICovCisJaWYgKGRvX3B2Y3JlYXRlKSB7CisJCWRtX2xpc3RfaW5pdCgmbmV3X3B2cyk7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJCWV4aXN0aW5nX3B2ID0gcHZsLT5wdjsKKworCQkJcHZhLT5pZCA9IGV4aXN0aW5nX3B2LT5pZDsKKwkJCXB2YS0+aWRwID0gJnB2YS0+aWQ7CisJCQlwdmEtPnBlX3N0YXJ0ID0gcHZfcGVfc3RhcnQoZXhpc3RpbmdfcHYpOworCQkJcHZhLT5leHRlbnRfY291bnQgPSBwdl9wZV9jb3VudChleGlzdGluZ19wdik7CisJCQlwdmEtPmV4dGVudF9zaXplID0gcHZfcGVfc2l6ZShleGlzdGluZ19wdik7CisJCQkvKiBwZV9lbmQgPSBwdl9wZV9jb3VudChleGlzdGluZ19wdikgKiBwdl9wZV9zaXplKGV4aXN0aW5nX3B2KSArIHBlX3N0YXJ0IC0gMSAqLworCisJCQlpZiAoIShwdiA9IHB2X2NyZWF0ZShjbWQsIHB2X2RldihleGlzdGluZ19wdiksIHB2YSkpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0dXAgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIi4iLAorCQkJCQkgIHB2X2Rldl9uYW1lKGV4aXN0aW5nX3B2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwdi0+dmdfbmFtZSA9IHZnLT5uYW1lOworCQkJcHYtPnZnaWQgPSB2Zy0+aWQ7CisKKwkJCWlmICghKG5ld19wdmwgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZigqbmV3X3B2bCkpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIFBWIGxpc3QgaXRlbSBmb3IgXCIlc1wiLiIsCisJCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQluZXdfcHZsLT5wdiA9IHB2OworCQkJZG1fbGlzdF9hZGQoJm5ld19wdnMsICZuZXdfcHZsLT5saXN0KTsKKworCQkJbG9nX3ZlcmJvc2UoIlNldCB1cCBwaHlzaWNhbCB2b2x1bWUgZm9yIFwiJXNcIiB3aXRoICUiIFBSSXU2NAorCQkJCSAgICAiIGF2YWlsYWJsZSBzZWN0b3JzLiIsIHB2X2Rldl9uYW1lKHB2KSwgcHZfc2l6ZShwdikpOworCQl9CisKKwkJcHZzID0gJm5ld19wdnM7CisJfQorCisJLyogQXR0ZW1wdCB0byB3cml0ZSBvdXQgdXNpbmcgY3VycmVudGx5IGFjdGl2ZSBmb3JtYXQgKi8KKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9BVVhfTURBUzsKKwlmaWMuY29udGV4dC52Z19yZWYudmdfbmFtZSA9IHZnLT5uYW1lOworCWZpYy5jb250ZXh0LnZnX3JlZi52Z19pZCA9IE5VTEw7CisJaWYgKCEoZmlkID0gY21kLT5mbXQtPm9wcy0+Y3JlYXRlX2luc3RhbmNlKGNtZC0+Zm10LCAmZmljKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZm9ybWF0IGluc3RhbmNlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG9fcHZjcmVhdGUpIHsKKwkJbG9nX3ZlcmJvc2UoIkRlbGV0aW5nIGV4aXN0aW5nIG1ldGFkYXRhIGZvciBWRyAlcy4iLCB2Zy0+bmFtZSk7CisJCWlmICghdmdfcmVtb3ZlX21kYXModmcpKSB7CisJCQljbWQtPmZtdC0+b3BzLT5kZXN0cm95X2luc3RhbmNlKGZpZCk7CisJCQlsb2dfZXJyb3IoIlJlbW92YWwgb2YgZXhpc3RpbmcgbWV0YWRhdGEgZm9yIFZHICVzIGZhaWxlZC4iLCB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXZnX3NldF9maWQodmcsIGZpZCk7CisKKwkvKgorCSAqIFNldHRpbmcgdmctPm9sZF9uYW1lIHRvIGEgYmxhbmsgdmFsdWUgd2lsbCBleHBsaWNpdGx5CisJICogZGlzYWJsZSBhbnkgYXR0ZW1wdCB0byBjaGVjayBWRyBuYW1lIGluIGV4aXN0aW5nIG1ldGFkYXRhLgorCSovCisJaWYgKCEodmctPm9sZF9uYW1lID0gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCAiIikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGR1cGxpY2F0ZSBlbXB0eSBuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBZGQgYW55IG1ldGFkYXRhIGFyZWFzIG9uIHRoZSBQVnMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwdnMpIHsKKwkJaWYgKChzaG91bGRfd3JpdGVfcHYgPSBfcmVzdG9yZV92Z19zaG91bGRfd3JpdGVfcHYocHZsLT5wdiwgZG9fcHZjcmVhdGUpKSA8IDApCisJCQlyZXR1cm5fMDsKKworCQlpZiAoc2hvdWxkX3dyaXRlX3B2KSB7CisJCQlpZiAoIShuZXdfcHZsID0gZG1fcG9vbF96YWxsb2ModmctPnZnbWVtLCBzaXplb2YoKm5ld19wdmwpKSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIHNjaGVkdWxlZCAiCisJCQkJCSAgIndyaXRpbmcgb2YgUFYgJyVzJy4iLCBwdl9kZXZfbmFtZShwdmwtPnB2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCW5ld19wdmwtPnB2ID0gcHZsLT5wdjsKKwkJCWRtX2xpc3RfYWRkKCZ2Zy0+cHZfd3JpdGVfbGlzdCwgJm5ld19wdmwtPmxpc3QpOworCQl9CisKKwkJLyogQWRkIGFueSBtZXRhZGF0YSBhcmVhcyBvbiB0aGUgUFYuICovCisJCXRtcF9leHRlbnRfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwkJdmctPmV4dGVudF9zaXplID0gMDsKKwkJaWYgKCF2Zy0+ZmlkLT5mbXQtPm9wcy0+cHZfc2V0dXAodmctPmZpZC0+Zm10LCBwdmwtPnB2LCB2ZykpIHsKKwkJCXZnLT5leHRlbnRfc2l6ZSA9IHRtcF9leHRlbnRfc2l6ZTsKKwkJCWxvZ19lcnJvcigiRm9ybWF0LXNwZWNpZmljIHNldHVwIGZvciAlcyBmYWlsZWQuIiwKKwkJCQkgIHB2X2Rldl9uYW1lKHB2bC0+cHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCXZnLT5leHRlbnRfc2l6ZSA9IHRtcF9leHRlbnRfc2l6ZTsKKwl9CisKKwlpZiAoZG9fcHZjcmVhdGUpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdl93cml0ZV9saXN0KSB7CisJCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwdl9kZXYocHZsLT5wdik7CisJCQljb25zdCBjaGFyICpwdl9uYW1lID0gZGV2X25hbWUoZGV2KTsKKworCQkJaWYgKCFsYWJlbF9yZW1vdmUoZGV2KSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwgb24gJXMiLCBwdl9uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJbG9nX3ZlcmJvc2UoIlplcm9pbmcgc3RhcnQgb2YgZGV2aWNlICVzIiwgcHZfbmFtZSk7CisJCQlpZiAoIWRldl9vcGVuX3F1aWV0KGRldikpIHsKKwkJCQlsb2dfZXJyb3IoIiVzIG5vdCBvcGVuZWQ6IGRldmljZSBub3QgemVyb2VkIiwgcHZfbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmICghZGV2X3NldChkZXYsIFVJTlQ2NF9DKDApLCAoc2l6ZV90KSAyMDQ4LCAwKSkgeworCQkJCWxvZ19lcnJvcigiJXMgbm90IHdpcGVkOiBhYm9ydGluZyIsIHB2X25hbWUpOworCQkJCWlmICghZGV2X2Nsb3NlKGRldikpCisJCQkJCXN0YWNrOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJCQlzdGFjazsKKwkJfQorCX0KKworCWlmICghdmdfd3JpdGUodmcpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmdfY29tbWl0KHZnKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyogT1JQSEFOIGFuZCBWRyBsb2NrcyBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KK2ludCBiYWNrdXBfcmVzdG9yZV9mcm9tX2ZpbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlpbnQgbWlzc2luZ19wdnMsIHIgPSAwOworCWNvbnN0IHN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwkvKgorCSAqIFJlYWQgaW4gdGhlIHZvbHVtZSBncm91cCBmcm9tIHRoZSB0ZXh0IGZpbGUuCisJICovCisJaWYgKCEodmcgPSBiYWNrdXBfcmVhZF92ZyhjbWQsIHZnX25hbWUsIGZpbGUpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRTogUmVzdG9yZSBzdXBwb3J0IGlzIG1pc3NpbmcgZm9yIG5vdyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWlmIChsdl9pc190aGluX3R5cGUobHZsLT5sdikpIHsKKwkJCWlmICghZm9yY2UpIHsKKwkJCQlsb2dfZXJyb3IoIkNvbnNpZGVyIHVzaW5nIG9wdGlvbiAtLWZvcmNlIHRvIHJlc3RvcmUgIgorCQkJCQkgICJWb2x1bWUgR3JvdXAgJXMgd2l0aCB0aGluIHZvbHVtZXMuIiwKKwkJCQkJICB2Zy0+bmFtZSk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBGb3JjZWQgcmVzdG9yZSBvZiBWb2x1bWUgR3JvdXAgIgorCQkJCQkgIiVzIHdpdGggdGhpbiB2b2x1bWVzLiIsIHZnLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCW1pc3NpbmdfcHZzID0gdmdfbWlzc2luZ19wdl9jb3VudCh2Zyk7CisJaWYgKG1pc3NpbmdfcHZzID09IDApCisJCXIgPSBiYWNrdXBfcmVzdG9yZV92ZyhjbWQsIHZnLCAwLCBOVUxMKTsKKwllbHNlCisJCWxvZ19lcnJvcigiQ2Fubm90IHJlc3RvcmUgVm9sdW1lIEdyb3VwICVzIHdpdGggJWkgUFZzICIKKwkJCSAgIm1hcmtlZCBhcyBtaXNzaW5nLiIsIHZnLT5uYW1lLCBtaXNzaW5nX3B2cyk7CisKK291dDoKKwlyZWxlYXNlX3ZnKHZnKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGJhY2t1cF9yZXN0b3JlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLCBpbnQgZm9yY2UpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKworCWlmIChkbV9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsCisJCQkgY21kLT5iYWNrdXBfcGFyYW1zLT5kaXIsIHZnX25hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSBiYWNrdXAgZmlsZW5hbWUgKGZvciByZXN0b3JlKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGJhY2t1cF9yZXN0b3JlX2Zyb21fZmlsZShjbWQsIHZnX25hbWUsIHBhdGgsIGZvcmNlKTsKK30KKworaW50IGJhY2t1cF90b19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmRlc2MsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICp0ZjsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWM7CisJc3RydWN0IHRleHRfY29udGV4dCB0YyA9IHsucGF0aF9saXZlID0gZmlsZSwKKwkJCQkgIC5wYXRoX2VkaXQgPSBOVUxMLAorCQkJCSAgLmRlc2MgPSBkZXNjfTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCisJY21kID0gdmctPmNtZDsKKworCWxvZ192ZXJib3NlKCJDcmVhdGluZyB2b2x1bWUgZ3JvdXAgYmFja3VwIFwiJXNcIiAoc2Vxbm8gJXUpLiIsIGZpbGUsIHZnLT5zZXFubyk7CisKKwlmaWMudHlwZSA9IEZNVF9JTlNUQU5DRV9QUklWQVRFX01EQVM7CisJZmljLmNvbnRleHQucHJpdmF0ZSA9ICZ0YzsKKwlpZiAoISh0ZiA9IGNtZC0+Zm10X2JhY2t1cC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoY21kLT5mbXRfYmFja3VwLCAmZmljKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgYmFja3VwIG9iamVjdC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRtX2xpc3RfZW1wdHkoJnRmLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTm8gaW4gdXNlIG1ldGFkYXRhIGFyZWFzIHRvIHdyaXRlLiIpOworCQl0Zi0+Zm10LT5vcHMtPmRlc3Ryb3lfaW5zdGFuY2UodGYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXcml0ZSBhbmQgY29tbWl0IHRoZSBtZXRhZGF0YSBhcmVhICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJnRmLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpIHsKKwkJaWYgKCEociA9IG1kYS0+b3BzLT52Z193cml0ZSh0ZiwgdmcsIG1kYSkpKSB7CisJCQlzdGFjazsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtZGEtPm9wcy0+dmdfY29tbWl0ICYmCisJCSAgICAhKHIgPSBtZGEtPm9wcy0+dmdfY29tbWl0KHRmLCB2ZywgbWRhKSkpIHsKKwkJCXN0YWNrOworCQl9CisJfQorCisJdGYtPmZtdC0+b3BzLT5kZXN0cm95X2luc3RhbmNlKHRmKTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFVwZGF0ZSBiYWNrdXAgKGFuZCBhcmNoaXZlKSBpZiB0aGV5J3JlIG91dC1vZi1kYXRlIG9yIGRvbid0IGV4aXN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvc2VkIHRvIGxvZ19lcnJvcgorICogd2hlbiB0aGUgZmlsZXN5c3RlbSB3aXRoIGFyY2hpdmUvYmFja3VwIGRpciBpcyByZWFkLW9ubHkuCisgKi8KK3ZvaWQgY2hlY2tfY3VycmVudF9iYWNrdXAoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19iYWNrdXA7CisJaW50IG9sZF9zdXBwcmVzczsKKworCWlmICghdmctPmNtZC0+YmFja3VwX3BhcmFtcy0+ZW5hYmxlZCB8fCAhdmctPmNtZC0+YmFja3VwX3BhcmFtcy0+ZGlyKSB7CisJCWxvZ19kZWJ1ZygiU2tpcHBpbmcgY2hlY2sgZm9yIGN1cnJlbnQgYmFja3VwLCBzaW5jZSBiYWNrdXAgaXMgZGlzYWJsZWQuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodmdfaXNfZXhwb3J0ZWQodmcpKQorCQlyZXR1cm47CisKKwlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvJXMiLAorCQkJdmctPmNtZC0+YmFja3VwX3BhcmFtcy0+ZGlyLCB2Zy0+bmFtZSkgPCAwKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBGYWlsZWQgdG8gZ2VuZXJhdGUgYmFja3VwIHBhdGhuYW1lICVzLyVzLiIsCisJCQkgdmctPmNtZC0+YmFja3VwX3BhcmFtcy0+ZGlyLCB2Zy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlvbGRfc3VwcHJlc3MgPSBsb2dfc3VwcHJlc3MoMSk7CisJLyogVXAtdG8tZGF0ZSBiYWNrdXAgZXhpc3RzPyAqLworCWlmICgodmdfYmFja3VwID0gYmFja3VwX3JlYWRfdmcodmctPmNtZCwgdmctPm5hbWUsIHBhdGgpKSAmJgorCSAgICAodmctPnNlcW5vID09IHZnX2JhY2t1cC0+c2Vxbm8pICYmCisJICAgIChpZF9lcXVhbCgmdmctPmlkLCAmdmdfYmFja3VwLT5pZCkpKSB7CisJCWxvZ19zdXBwcmVzcyhvbGRfc3VwcHJlc3MpOworCQlyZWxlYXNlX3ZnKHZnX2JhY2t1cCk7CisJCXJldHVybjsKKwl9CisJbG9nX3N1cHByZXNzKG9sZF9zdXBwcmVzcyk7CisKKwlpZiAodmdfYmFja3VwKSB7CisJCWlmICghX2FyY2hpdmUodmdfYmFja3VwLCAwKSkKKwkJCXN0YWNrOworCQlyZWxlYXNlX3ZnKHZnX2JhY2t1cCk7CisJfQorCWlmICghX2FyY2hpdmUodmcsIDApKQorCQlzdGFjazsKKwlpZiAoIWJhY2t1cF9sb2NhbGx5KHZnKSkKKwkJc3RhY2s7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3RleHQvYXJjaGl2ZXIuaCBiL2xpYi9mb3JtYXRfdGV4dC9hcmNoaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDk3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3RleHQvYXJjaGl2ZXIuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVE9PTF9BUkNISVZFX0gKKyNkZWZpbmUgX0xWTV9UT09MX0FSQ0hJVkVfSAorCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gb3BlcmF0aW9ucyB0aGF0IGNvbWUgdW5kZXIgdGhlIGdlbmVyYWwgYXJlYSBvZgorICogYmFja3Vwcy4gICdBcmNoaXZpbmcnIG9jY3VycyBqdXN0IGJlZm9yZSBhIHZvbHVtZSBncm91cAorICogY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkLiAgVGhlIHVzZXIgbWF5IGNvbmZpZ3VyZSB3aGVuCisgKiBhcmNoaXZlZCBmaWxlcyBhcmUgZXhwaXJlZC4gIFR5cGljYWxseSBhcmNoaXZlcyB3aWxsIGJlIHN0b3JlZAorICogaW4gL2V0Yy9sdm0vYXJjaGl2ZS4KKyAqCisgKiBBICdiYWNrdXAnIGlzIGEgcmVkdW5kYW50IGNvcHkgb2YgdGhlICpjdXJyZW50KiB2b2x1bWUgZ3JvdXAKKyAqIGNvbmZpZ3VyYXRpb24uICBBcyBzdWNoIGl0IHNob3VsZCBiZSB0YWtlbiBqdXN0IGFmdGVyIHRoZQorICogdm9sdW1lIGdyb3VwIGlzIGNoYW5nZWQuICBPbmx5IDEgYmFja3VwIGZpbGUgd2lsbCBleGlzdC4KKyAqIFR5cGljYWxseSBiYWNrdXBzIHdpbGwgYmUgc3RvcmVkIGluIC9ldGMvbHZtL2JhY2t1cHMuCisgKi8KKworaW50IGFyY2hpdmVfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGlyLAorCQkgdW5zaWduZWQgaW50IGtlZXBfZGF5cywgdW5zaWduZWQgaW50IGtlZXBfbWluLAorCQkgaW50IGVuYWJsZWQpOwordm9pZCBhcmNoaXZlX2V4aXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCit2b2lkIGFyY2hpdmVfZW5hYmxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZmxhZyk7CitpbnQgYXJjaGl2ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgYXJjaGl2ZV9kaXNwbGF5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lKTsKK2ludCBhcmNoaXZlX2Rpc3BsYXlfZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZmlsZSk7CisKK2ludCBiYWNrdXBfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGlyLCBpbnQgZW5hYmxlZCk7Cit2b2lkIGJhY2t1cF9leGl0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKwordm9pZCBiYWNrdXBfZW5hYmxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgZmxhZyk7CitpbnQgYmFja3VwKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCBiYWNrdXBfbG9jYWxseShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgYmFja3VwX3JlbW92ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSk7CisKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKmJhY2t1cF9yZWFkX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBjb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICpmaWxlKTsKKworaW50IGJhY2t1cF9yZXN0b3JlX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fcHZjcmVhdGUsIHN0cnVjdCBwdl9jcmVhdGVfYXJncyAqcHZhKTsKKworaW50IGJhY2t1cF9yZXN0b3JlX2Zyb21fZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGZvcmNlKTsKK2ludCBiYWNrdXBfcmVzdG9yZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwgaW50IGZvcmNlKTsKKworaW50IGJhY2t1cF90b19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmRlc2MsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKwordm9pZCBjaGVja19jdXJyZW50X2JhY2t1cChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF90ZXh0L2V4cG9ydC5jIGIvbGliL2Zvcm1hdF90ZXh0L2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGM5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3RleHQvZXhwb3J0LmMKQEAgLTAsMCArMSwxMDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImltcG9ydC1leHBvcnQuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorI2luY2x1ZGUgInRleHRfZXhwb3J0LmgiCisjaW5jbHVkZSAibHZtLXZlcnNpb24uaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK3N0cnVjdCBmb3JtYXR0ZXI7CitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpCit0eXBlZGVmIGludCAoKm91dF93aXRoX2NvbW1lbnRfZm4pIChzdHJ1Y3QgZm9ybWF0dGVyICogZiwgY29uc3QgY2hhciAqY29tbWVudCwKKwkJCQkgICAgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKK3R5cGVkZWYgaW50ICgqbmxfZm4pIChzdHJ1Y3QgZm9ybWF0dGVyICogZik7CisKKy8qCisgKiBNYWNybyBmb3IgZm9ybWF0dGVkIG91dHB1dC4KKyAqIG91dF93aXRoX2NvbW1lbnRfZm4gcmV0dXJucyAtMSBpZiBkYXRhIGRpZG4ndCBmaXQgYW5kIGJ1ZmZlciB3YXMgZXhwYW5kZWQuCisgKiBUaGVuIGFyZ3VtZW50IGxpc3QgaXMgcmVzZXQgYW5kIG91dF93aXRoX2NvbW1lbnRfZm4gaXMgY2FsbGVkIGFnYWluLgorICovCisjZGVmaW5lIF9vdXRfd2l0aF9jb21tZW50KGYsIGJ1ZmZlciwgZm10LCBhcCkgXAorCWRvIHsgXAorCQl2YV9zdGFydChhcCwgZm10KTsgXAorCQlyID0gZi0+b3V0X3dpdGhfY29tbWVudChmLCBidWZmZXIsIGZtdCwgYXApOyBcCisJCXZhX2VuZChhcCk7IFwKKwl9IHdoaWxlIChyID09IC0xKQorCisvKgorICogVGhlIGZpcnN0IGhhbGYgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGgKKyAqIGV4cG9ydGluZyB0aGUgdmcsIGllLiB3cml0aW5nIGl0IHRvIGEgZmlsZS4KKyAqLworc3RydWN0IGZvcm1hdHRlciB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsJLyogcHYgbmFtZXMgYWxsb2NhdGVkIGZyb20gaGVyZSAqLworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9uYW1lczsJLyogZGV2X25hbWUgLT4gcHZfbmFtZSAoZWcsIHB2MSkgKi8KKworCXVuaW9uIHsKKwkJRklMRSAqZnA7CS8qIHdoZXJlIHdlJ3JlIHdyaXRpbmcgdG8gKi8KKwkJc3RydWN0IHsKKwkJCWNoYXIgKnN0YXJ0OworCQkJdWludDMyX3Qgc2l6ZTsKKwkJCXVpbnQzMl90IHVzZWQ7CisJCX0gYnVmOworCX0gZGF0YTsKKworCW91dF93aXRoX2NvbW1lbnRfZm4gb3V0X3dpdGhfY29tbWVudDsKKwlubF9mbiBubDsKKworCWludCBpbmRlbnQ7CQkvKiBjdXJyZW50IGxldmVsIG9mIGluZGVudGF0aW9uICovCisJaW50IGVycm9yOworCWludCBoZWFkZXI7CQkvKiAxID0+IGNvbW1lbnRzIGF0IHN0YXJ0OyAwID0+IGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCB1dHNuYW1lIF91dHNuYW1lOworCitzdGF0aWMgdm9pZCBfaW5pdCh2b2lkKQoreworCXN0YXRpYyBpbnQgX2luaXRpYWxpc2VkID0gMDsKKworCWlmIChfaW5pdGlhbGlzZWQpCisJCXJldHVybjsKKworCWlmICh1bmFtZSgmX3V0c25hbWUpKSB7CisJCWxvZ19lcnJvcigidW5hbWUgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCW1lbXNldCgmX3V0c25hbWUsIDAsIHNpemVvZihfdXRzbmFtZSkpOworCX0KKworCV9pbml0aWFsaXNlZCA9IDE7Cit9CisKKy8qCisgKiBGb3JtYXR0aW5nIGZ1bmN0aW9ucy4KKyAqLworCisjZGVmaW5lIE1BWF9JTkRFTlQgNQorc3RhdGljIHZvaWQgX2luY19pbmRlbnQoc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKwlpZiAoKytmLT5pbmRlbnQgPiBNQVhfSU5ERU5UKQorCQlmLT5pbmRlbnQgPSBNQVhfSU5ERU5UOworfQorCitzdGF0aWMgdm9pZCBfZGVjX2luZGVudChzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCWlmICghZi0+aW5kZW50LS0pIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJwcm9ibGVtIHRyYWNraW5nIGluZGVudGF0aW9uIik7CisJCWYtPmluZGVudCA9IDA7CisJfQorfQorCisvKgorICogTmV3bGluZSBmdW5jdGlvbiBmb3IgcHJldHRpZXIgbGF5b3V0LgorICovCitzdGF0aWMgaW50IF9ubF9maWxlKHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJZnByaW50ZihmLT5kYXRhLmZwLCAiXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9leHRlbmRfYnVmZmVyKHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJY2hhciAqbmV3YnVmOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCJEb3VibGluZyBtZXRhZGF0YSBvdXRwdXQgYnVmZmVyIHRvICUiIFBSSXUzMiwKKwkJCSAgIGYtPmRhdGEuYnVmLnNpemUgKiAyKTsKKwlpZiAoIShuZXdidWYgPSBkbV9yZWFsbG9jKGYtPmRhdGEuYnVmLnN0YXJ0LAorCQkJCSAgIGYtPmRhdGEuYnVmLnNpemUgKiAyKSkpIHsKKwkJbG9nX2Vycm9yKCJCdWZmZXIgcmVhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWYtPmRhdGEuYnVmLnN0YXJ0ID0gbmV3YnVmOworCWYtPmRhdGEuYnVmLnNpemUgKj0gMjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9ubF9yYXcoc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKwkvKiBJZiBtZXRhZGF0YSBkb2Vzbid0IGZpdCwgZXh0ZW5kIGJ1ZmZlciAqLworCWlmICgoZi0+ZGF0YS5idWYudXNlZCArIDIgPiBmLT5kYXRhLmJ1Zi5zaXplKSAmJgorCSAgICAoIV9leHRlbmRfYnVmZmVyKGYpKSkKKwkJcmV0dXJuXzA7CisKKwkqKGYtPmRhdGEuYnVmLnN0YXJ0ICsgZi0+ZGF0YS5idWYudXNlZCkgPSAnXG4nOworCWYtPmRhdGEuYnVmLnVzZWQgKz0gMTsKKworCSooZi0+ZGF0YS5idWYuc3RhcnQgKyBmLT5kYXRhLmJ1Zi51c2VkKSA9ICdcMCc7CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBDT01NRU5UX1RBQiA2CitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpCitzdGF0aWMgaW50IF9vdXRfd2l0aF9jb21tZW50X2ZpbGUoc3RydWN0IGZvcm1hdHRlciAqZiwgY29uc3QgY2hhciAqY29tbWVudCwKKwkJCQkgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlpbnQgaTsKKwljaGFyIHdoaXRlX3NwYWNlW01BWF9JTkRFTlQgKyAxXTsKKworCWlmIChmZXJyb3IoZi0+ZGF0YS5mcCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGYtPmluZGVudDsgaSsrKQorCQl3aGl0ZV9zcGFjZVtpXSA9ICdcdCc7CisJd2hpdGVfc3BhY2VbaV0gPSAnXDAnOworCWZwdXRzKHdoaXRlX3NwYWNlLCBmLT5kYXRhLmZwKTsKKwlpID0gdmZwcmludGYoZi0+ZGF0YS5mcCwgZm10LCBhcCk7CisKKwlpZiAoY29tbWVudCkgeworCQkvKgorCQkgKiBsaW5lIGNvbW1lbnRzIHVwIGlmIHBvc3NpYmxlLgorCQkgKi8KKwkJaSArPSA4ICogZi0+aW5kZW50OworCQlpIC89IDg7CisJCWkrKzsKKworCQlkbworCQkJZnB1dGMoJ1x0JywgZi0+ZGF0YS5mcCk7CisKKwkJd2hpbGUgKCsraSA8IENPTU1FTlRfVEFCKTsKKworCQlmcHV0cyhjb21tZW50LCBmLT5kYXRhLmZwKTsKKwl9CisJZnB1dGMoJ1xuJywgZi0+ZGF0YS5mcCk7CisKKwlyZXR1cm4gMTsKK30KKworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgMCkpKQorc3RhdGljIGludCBfb3V0X3dpdGhfY29tbWVudF9yYXcoc3RydWN0IGZvcm1hdHRlciAqZiwKKwkJCQkgY29uc3QgY2hhciAqY29tbWVudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWludCBuOworCXZhX2xpc3QgYXBjOworCisJdmFfY29weShhcGMsIGFwKTsKKwluID0gdnNucHJpbnRmKGYtPmRhdGEuYnVmLnN0YXJ0ICsgZi0+ZGF0YS5idWYudXNlZCwKKwkJICAgICAgZi0+ZGF0YS5idWYuc2l6ZSAtIGYtPmRhdGEuYnVmLnVzZWQsIGZtdCwgYXBjKTsKKwl2YV9lbmQoYXBjKTsKKworCS8qIElmIG1ldGFkYXRhIGRvZXNuJ3QgZml0LCBleHRlbmQgYnVmZmVyICovCisJaWYgKG4gPCAwIHx8IChuICsgZi0+ZGF0YS5idWYudXNlZCArIDIgPiBmLT5kYXRhLmJ1Zi5zaXplKSkgeworCQlpZiAoIV9leHRlbmRfYnVmZmVyKGYpKQorCQkJcmV0dXJuXzA7CisJCXJldHVybiAtMTsgLyogUmV0cnkgKi8KKwl9CisKKwlmLT5kYXRhLmJ1Zi51c2VkICs9IG47CisKKwlvdXRubChmKTsKKworCXJldHVybiAxOworfQorCisvKgorICogRm9ybWF0cyBhIHN0cmluZywgY29udmVydGluZyBhIHNpemUgc3BlY2lmaWVkCisgKiBpbiA1MTItYnl0ZSBzZWN0b3JzIHRvIGEgbW9yZSBodW1hbiByZWFkYWJsZQorICogZm9ybSAoZWcsIG1lZ2FieXRlcykuICBXZSBtYXkgd2FudCB0byBsaWZ0IHRoaXMKKyAqIGZvciBvdGhlciBjb2RlIHRvIHVzZS4KKyAqLworc3RhdGljIGludCBfc2VjdG9yc190b191bml0cyh1aW50NjRfdCBzZWN0b3JzLCBjaGFyICpidWZmZXIsIHNpemVfdCBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpfdW5pdHNbXSA9IHsKKwkJIktpbG9ieXRlcyIsCisJCSJNZWdhYnl0ZXMiLAorCQkiR2lnYWJ5dGVzIiwKKwkJIlRlcmFieXRlcyIsCisJCSJQZXRhYnl0ZXMiLAorCQkiRXhhYnl0ZXMiLAorCQlOVUxMCisJfTsKKworCWludCBpOworCWRvdWJsZSBkID0gKGRvdWJsZSkgc2VjdG9yczsKKworCS8qIHRvIGNvbnZlcnQgdG8gSyAqLworCWQgLz0gMi4wOworCisJZm9yIChpID0gMDsgKGQgPiAxMDI0LjApICYmIF91bml0c1tpXTsgaSsrKQorCQlkIC89IDEwMjQuMDsKKworCXJldHVybiBkbV9zbnByaW50ZihidWZmZXIsIHMsICIjICVnICVzIiwgZCwgX3VuaXRzW2ldKSA+IDA7Cit9CisKKy8qIGluY3JlbWVudCBpbmRlbnRpb24gbGV2ZWwgKi8KK3ZvaWQgb3V0X2luY19pbmRlbnQoc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKwlfaW5jX2luZGVudChmKTsKK30KKworLyogZGVjcmVtZW50IGluZGVudGlvbiBsZXZlbCAqLwordm9pZCBvdXRfZGVjX2luZGVudChzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCV9kZWNfaW5kZW50KGYpOworfQorCisvKiBpbnNlcnQgbmV3IGxpbmUgKi8KK2ludCBvdXRfbmV3bGluZShzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCXJldHVybiBmLT5ubChmKTsKK30KKworLyoKKyAqIEFwcGVuZHMgYSBjb21tZW50IGdpdmluZyBhIHNpemUgaW4gbW9yZSBlYXNpbHkKKyAqIHJlYWRhYmxlIGZvcm0gKGVnLCA0TSBpbnN0ZWFkIG9mIDgwOTYpLgorICovCitpbnQgb3V0X3NpemUoc3RydWN0IGZvcm1hdHRlciAqZiwgdWludDY0X3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciBidWZmZXJbNjRdOworCXZhX2xpc3QgYXA7CisJaW50IHI7CisKKwlpZiAoIV9zZWN0b3JzX3RvX3VuaXRzKHNpemUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQlyZXR1cm4gMDsKKworCV9vdXRfd2l0aF9jb21tZW50KGYsIGJ1ZmZlciwgZm10LCBhcCk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEFwcGVuZHMgYSBjb21tZW50IGluZGljYXRpbmcgdGhhdCB0aGUgbGluZSBpcworICogb25seSBhIGhpbnQuCisgKi8KK2ludCBvdXRfaGludChzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByOworCisJX291dF93aXRoX2NvbW1lbnQoZiwgIiMgSGludCBvbmx5IiwgZm10LCBhcCk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFRoZSBub3JtYWwgb3V0cHV0IGZ1bmN0aW9uIHdpdGggY29tbWVudAorICovCitpbnQgb3V0X3RleHRfd2l0aF9jb21tZW50KHN0cnVjdCBmb3JtYXR0ZXIgKmYsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHI7CisKKwlfb3V0X3dpdGhfY29tbWVudChmLCBjb21tZW50LCBmbXQsIGFwKTsKKworCXJldHVybiByOworfQorCisvKgorICogVGhlIG5vcm1hbCBvdXRwdXQgZnVuY3Rpb24uCisgKi8KK2ludCBvdXRfdGV4dChzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByOworCisJX291dF93aXRoX2NvbW1lbnQoZiwgTlVMTCwgZm10LCBhcCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfb3V0X2xpbmUoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqX2YpIHsKKwlzdHJ1Y3QgZm9ybWF0dGVyICpmID0gKHN0cnVjdCBmb3JtYXR0ZXIgKikgX2Y7CisJcmV0dXJuIG91dF90ZXh0KGYsICIlcyIsIGxpbmUpOworfQorCitpbnQgb3V0X2NvbmZpZ19ub2RlKHN0cnVjdCBmb3JtYXR0ZXIgKmYsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24pCit7CisJcmV0dXJuIGRtX2NvbmZpZ193cml0ZV9ub2RlKGNuLCBfb3V0X2xpbmUsIGYpOworfQorCitzdGF0aWMgaW50IF9wcmludF9oZWFkZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBmb3JtYXR0ZXIgKmYsCisJCQkgY29uc3QgY2hhciAqZGVzYykKK3sKKwljaGFyICpidWY7CisJdGltZV90IHQ7CisKKwl0ID0gdGltZShOVUxMKTsKKworCW91dGYoZiwgIiMgR2VuZXJhdGVkIGJ5IExWTTIgdmVyc2lvbiAlczogJXMiLCBMVk1fVkVSU0lPTiwgY3RpbWUoJnQpKTsKKwlvdXRmKGYsIENPTlRFTlRTX0ZJRUxEICIgPSBcIiIgQ09OVEVOVFNfVkFMVUUgIlwiIik7CisJb3V0ZihmLCBGT1JNQVRfVkVSU0lPTl9GSUVMRCAiID0gJWQiLCBGT1JNQVRfVkVSU0lPTl9WQUxVRSk7CisJb3V0bmwoZik7CisKKwlidWYgPSBhbGxvY2EoZG1fZXNjYXBlZF9sZW4oZGVzYykpOworCW91dGYoZiwgImRlc2NyaXB0aW9uID0gXCIlc1wiIiwgZG1fZXNjYXBlX2RvdWJsZV9xdW90ZXMoYnVmLCBkZXNjKSk7CisJb3V0bmwoZik7CisJb3V0ZihmLCAiY3JlYXRpb25faG9zdCA9IFwiJXNcIlx0IyAlcyAlcyAlcyAlcyAlcyIsIF91dHNuYW1lLm5vZGVuYW1lLAorCSAgICAgX3V0c25hbWUuc3lzbmFtZSwgX3V0c25hbWUubm9kZW5hbWUsIF91dHNuYW1lLnJlbGVhc2UsCisJICAgICBfdXRzbmFtZS52ZXJzaW9uLCBfdXRzbmFtZS5tYWNoaW5lKTsKKwlpZiAoY21kLT5zeXN0ZW1faWQgJiYgKmNtZC0+c3lzdGVtX2lkKQorCQlvdXRmKGYsICJjcmVhdGlvbl9ob3N0X3N5c3RlbV9pZCA9IFwiJXNcIiIsIGNtZC0+c3lzdGVtX2lkKTsKKwlvdXRmKGYsICJjcmVhdGlvbl90aW1lID0gJWx1XHQjICVzIiwgdCwgY3RpbWUoJnQpKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wcmludF9mbGFnX2NvbmZpZyhzdHJ1Y3QgZm9ybWF0dGVyICpmLCB1aW50NjRfdCBzdGF0dXMsIGludCB0eXBlKQoreworCWNoYXIgYnVmZmVyWzQwOTZdOworCWlmICghcHJpbnRfZmxhZ3Moc3RhdHVzLCB0eXBlIHwgU1RBVFVTX0ZMQUcsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQlyZXR1cm5fMDsKKwlvdXRmKGYsICJzdGF0dXMgPSAlcyIsIGJ1ZmZlcik7CisKKwlpZiAoIXByaW50X2ZsYWdzKHN0YXR1cywgdHlwZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisJCXJldHVybl8wOworCW91dGYoZiwgImZsYWdzID0gJXMiLCBidWZmZXIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICpfYWxsb2NfcHJpbnRlZF9zdHJfbGlzdChzdHJ1Y3QgZG1fbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCWludCBmaXJzdCA9IDE7CisJc2l6ZV90IHNpemUgPSAwOworCWNoYXIgKmJ1ZmZlciwgKmJ1ZjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgbGlzdCkKKwkJLyogJyInICsgaXRlbSArICciJyArICcsJyArICcgJyAqLworCQlzaXplICs9IHN0cmxlbihzbC0+c3RyKSArIDQ7CisJLyogJ1snICsgJ10nICsgJ1wwJyAqLworCXNpemUgKz0gMzsKKworCWlmICghKGJ1ZmZlciA9IGJ1ZiA9IGRtX21hbGxvYyhzaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJpbmcgbGlzdCBidWZmZXIuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZiwgJnNpemUsICJbIikpCisJCWdvdG9fYmFkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBsaXN0KSB7CisJCWlmICghZmlyc3QpIHsKKwkJCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZiwgJnNpemUsICIsICIpKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UKKwkJCWZpcnN0ID0gMDsKKworCQlpZiAoIWVtaXRfdG9fYnVmZmVyKCZidWYsICZzaXplLCAiXCIlc1wiIiwgc2wtPnN0cikpCisJCQlnb3RvX2JhZDsKKwl9CisKKwlpZiAoIWVtaXRfdG9fYnVmZmVyKCZidWYsICZzaXplLCAiXSIpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiBidWZmZXI7CisKK2JhZDoKKwlkbV9mcmVlKGJ1ZmZlcik7CisJcmV0dXJuX05VTEw7Cit9CisKK3N0YXRpYyBpbnQgX291dF9saXN0KHN0cnVjdCBmb3JtYXR0ZXIgKmYsIHN0cnVjdCBkbV9saXN0ICpsaXN0LAorCQkgICAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSkKK3sKKwljaGFyICpidWZmZXI7CisKKwlpZiAoIWRtX2xpc3RfZW1wdHkobGlzdCkpIHsKKwkJaWYgKCEoYnVmZmVyID0gX2FsbG9jX3ByaW50ZWRfc3RyX2xpc3QobGlzdCkpKQorCQkJcmV0dXJuXzA7CisJCWlmICghb3V0X3RleHQoZiwgIiVzID0gJXMiLCBsaXN0X25hbWUsIGJ1ZmZlcikpIHsKKwkJCWRtX2ZyZWUoYnVmZmVyKTsKKwkJCXJldHVybl8wOworCQl9CisJCWRtX2ZyZWUoYnVmZmVyKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcHJpbnRfdmcoc3RydWN0IGZvcm1hdHRlciAqZiwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciBidWZmZXJbNDA5Nl07CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQgPSBOVUxMOworCXVpbnQ2NF90IHN0YXR1cyA9IHZnLT5zdGF0dXM7CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmdmctPmlkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlvdXRmKGYsICJpZCA9IFwiJXNcIiIsIGJ1ZmZlcik7CisKKwlvdXRmKGYsICJzZXFubyA9ICV1IiwgdmctPnNlcW5vKTsKKworCWlmICh2Zy0+b3JpZ2luYWxfZm10KQorCQlmbXQgPSB2Zy0+b3JpZ2luYWxfZm10OworCWVsc2UgaWYgKHZnLT5maWQpCisJCWZtdCA9IHZnLT5maWQtPmZtdDsKKwlpZiAoZm10KQorCQlvdXRmYyhmLCAiIyBpbmZvcm1hdGlvbmFsIiwgImZvcm1hdCA9IFwiJXNcIiIsIGZtdC0+bmFtZSk7CisKKwkvKgorCSAqIFJlbW92aW5nIFdSSVRFIGFuZCBhZGRpbmcgTFZNX1dSSVRFX0xPQ0tFRCBtYWtlcyBpdCByZWFkLW9ubHkKKwkgKiB0byBvbGQgdmVyc2lvbnMgb2YgbHZtIHRoYXQgb25seSBsb29rIGZvciBMVk1fV1JJVEUuCisJICovCisJaWYgKChzdGF0dXMgJiBMVk1fV1JJVEUpICYmIHZnX2ZsYWdfd3JpdGVfbG9ja2VkKHZnKSkgeworCQlzdGF0dXMgJj0gfkxWTV9XUklURTsKKwkJc3RhdHVzIHw9IExWTV9XUklURV9MT0NLRUQ7CisJfQorCisJaWYgKCFfcHJpbnRfZmxhZ19jb25maWcoZiwgc3RhdHVzLCBWR19GTEFHUykpCisJCXJldHVybl8wOworCisJaWYgKCFfb3V0X2xpc3QoZiwgJnZnLT50YWdzLCAidGFncyIpKQorCQlyZXR1cm5fMDsKKyAKKwlpZiAodmctPnN5c3RlbV9pZCAmJiAqdmctPnN5c3RlbV9pZCkKKwkJb3V0ZihmLCAic3lzdGVtX2lkID0gXCIlc1wiIiwgdmctPnN5c3RlbV9pZCk7CisJZWxzZSBpZiAodmctPmx2bTFfc3lzdGVtX2lkICYmICp2Zy0+bHZtMV9zeXN0ZW1faWQpCisJCW91dGYoZiwgInN5c3RlbV9pZCA9IFwiJXNcIiIsIHZnLT5sdm0xX3N5c3RlbV9pZCk7CisKKwlpZiAodmctPmxvY2tfdHlwZSkgeworCQlvdXRmKGYsICJsb2NrX3R5cGUgPSBcIiVzXCIiLCB2Zy0+bG9ja190eXBlKTsKKwkJaWYgKHZnLT5sb2NrX2FyZ3MpCisJCQlvdXRmKGYsICJsb2NrX2FyZ3MgPSBcIiVzXCIiLCB2Zy0+bG9ja19hcmdzKTsKKwl9CisKKwlvdXRzaXplKGYsICh1aW50NjRfdCkgdmctPmV4dGVudF9zaXplLCAiZXh0ZW50X3NpemUgPSAldSIsCisJCXZnLT5leHRlbnRfc2l6ZSk7CisJb3V0ZihmLCAibWF4X2x2ID0gJXUiLCB2Zy0+bWF4X2x2KTsKKwlvdXRmKGYsICJtYXhfcHYgPSAldSIsIHZnLT5tYXhfcHYpOworCisJLyogRGVmYXVsdCBwb2xpY3kgaXMgTk9STUFMOyBJTkhFUklUIGlzIG1lYW5pbmdsZXNzICovCisJaWYgKHZnLT5hbGxvYyAhPSBBTExPQ19OT1JNQUwgJiYgdmctPmFsbG9jICE9IEFMTE9DX0lOSEVSSVQpIHsKKwkJb3V0bmwoZik7CisJCW91dGYoZiwgImFsbG9jYXRpb25fcG9saWN5ID0gXCIlc1wiIiwKKwkJICAgICBnZXRfYWxsb2Nfc3RyaW5nKHZnLT5hbGxvYykpOworCX0KKworCWlmICh2Zy0+cHJvZmlsZSkKKwkJb3V0ZihmLCAicHJvZmlsZSA9IFwiJXNcIiIsIHZnLT5wcm9maWxlLT5uYW1lKTsKKworCW91dGYoZiwgIm1ldGFkYXRhX2NvcGllcyA9ICV1IiwgdmctPm1kYV9jb3BpZXMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZXQgdGhlIHB2JWQgbmFtZSBmcm9tIHRoZSBmb3JtYXR0ZXJzIGhhc2gKKyAqIHRhYmxlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9wdl9uYW1lX2Zyb21fdXVpZChzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjaGFyICp1dWlkKQoreworCXJldHVybiBkbV9oYXNoX2xvb2t1cChmLT5wdl9uYW1lcywgdXVpZCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0X3B2X25hbWUoc3RydWN0IGZvcm1hdHRlciAqZiwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKKwlpZiAoIXB2IHx8ICFpZF93cml0ZV9mb3JtYXQoJnB2LT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gX2dldF9wdl9uYW1lX2Zyb21fdXVpZChmLCB1dWlkKTsKK30KKworc3RhdGljIGludCBfcHJpbnRfcHZzKHN0cnVjdCBmb3JtYXR0ZXIgKmYsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJY2hhciBidWZmZXJbUEFUSF9NQVggKiAyXTsKKwljb25zdCBjaGFyICpuYW1lOworCisJb3V0ZihmLCAicGh5c2ljYWxfdm9sdW1lcyB7Iik7CisJX2luY19pbmRlbnQoZik7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlwdiA9IHB2bC0+cHY7CisKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2LT5pZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIShuYW1lID0gX2dldF9wdl9uYW1lX2Zyb21fdXVpZChmLCBidWZmZXIpKSkKKwkJCXJldHVybl8wOworCisJCW91dG5sKGYpOworCQlvdXRmKGYsICIlcyB7IiwgbmFtZSk7CisJCV9pbmNfaW5kZW50KGYpOworCisJCW91dGYoZiwgImlkID0gXCIlc1wiIiwgYnVmZmVyKTsKKworCQlpZiAoc3RybGVuKHB2X2Rldl9uYW1lKHB2KSkgPj0gUEFUSF9NQVgpIHsKKwkJCWxvZ19lcnJvcigicHYgZGV2aWNlIG5hbWUgc2l6ZSBpcyBvdXQgb2YgYm91bmRzLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlvdXRoaW50KGYsICJkZXZpY2UgPSBcIiVzXCIiLAorCQkJZG1fZXNjYXBlX2RvdWJsZV9xdW90ZXMoYnVmZmVyLCBwdl9kZXZfbmFtZShwdikpKTsKKwkJb3V0bmwoZik7CisKKwkJaWYgKCFfcHJpbnRfZmxhZ19jb25maWcoZiwgcHYtPnN0YXR1cywgUFZfRkxBR1MpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFfb3V0X2xpc3QoZiwgJnB2LT50YWdzLCAidGFncyIpKQorCQkJcmV0dXJuXzA7CisKKwkJb3V0c2l6ZShmLCBwdi0+c2l6ZSwgImRldl9zaXplID0gJSIgUFJJdTY0LCBwdi0+c2l6ZSk7CisKKwkJb3V0ZihmLCAicGVfc3RhcnQgPSAlIiBQUkl1NjQsIHB2LT5wZV9zdGFydCk7CisJCW91dHNpemUoZiwgdmctPmV4dGVudF9zaXplICogKHVpbnQ2NF90KSBwdi0+cGVfY291bnQsCisJCQkicGVfY291bnQgPSAldSIsIHB2LT5wZV9jb3VudCk7CisKKwkJaWYgKHB2LT5iYV9zdGFydCAmJiBwdi0+YmFfc2l6ZSkgeworCQkJb3V0ZihmLCAiYmFfc3RhcnQgPSAlIiBQUkl1NjQsIHB2LT5iYV9zdGFydCk7CisJCQlvdXRzaXplKGYsIHB2LT5iYV9zaXplLCAiYmFfc2l6ZSA9ICUiIFBSSXU2NCwgcHYtPmJhX3NpemUpOworCQl9CisKKwkJX2RlY19pbmRlbnQoZik7CisJCW91dGYoZiwgIn0iKTsKKwl9CisKKwlfZGVjX2luZGVudChmKTsKKwlvdXRmKGYsICJ9Iik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ByaW50X3NlZ21lbnQoc3RydWN0IGZvcm1hdHRlciAqZiwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIGludCBjb3VudCwgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlvdXRmKGYsICJzZWdtZW50JXUgeyIsIGNvdW50KTsKKwlfaW5jX2luZGVudChmKTsKKworCW91dGYoZiwgInN0YXJ0X2V4dGVudCA9ICV1Iiwgc2VnLT5sZSk7CisJb3V0c2l6ZShmLCAodWludDY0X3QpIHNlZy0+bGVuICogdmctPmV4dGVudF9zaXplLAorCQkiZXh0ZW50X2NvdW50ID0gJXUiLCBzZWctPmxlbik7CisKKwlvdXRubChmKTsKKwlvdXRmKGYsICJ0eXBlID0gXCIlc1wiIiwgc2VnLT5zZWd0eXBlLT5uYW1lKTsKKworCWlmICghX291dF9saXN0KGYsICZzZWctPnRhZ3MsICJ0YWdzIikpCisJCXJldHVybl8wOworCisJaWYgKHNlZy0+c2VndHlwZS0+b3BzLT50ZXh0X2V4cG9ydCAmJgorCSAgICAhc2VnLT5zZWd0eXBlLT5vcHMtPnRleHRfZXhwb3J0KHNlZywgZikpCisJCXJldHVybl8wOworCisJX2RlY19pbmRlbnQoZik7CisJb3V0ZihmLCAifSIpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBvdXRfYXJlYXMoc3RydWN0IGZvcm1hdHRlciAqZiwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkgICAgICBjb25zdCBjaGFyICp0eXBlKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IHM7CisKKwlvdXRubChmKTsKKworCW91dGYoZiwgIiVzcyA9IFsiLCB0eXBlKTsKKwlfaW5jX2luZGVudChmKTsKKworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlzd2l0Y2ggKHNlZ190eXBlKHNlZywgcykpIHsKKwkJY2FzZSBBUkVBX1BWOgorCQkJaWYgKCEobmFtZSA9IF9nZXRfcHZfbmFtZShmLCBzZWdfcHYoc2VnLCBzKSkpKQorCQkJCXJldHVybl8wOworCisJCQlvdXRmKGYsICJcIiVzXCIsICV1JXMiLCBuYW1lLAorCQkJICAgICBzZWdfcGUoc2VnLCBzKSwKKwkJCSAgICAgKHMgPT0gc2VnLT5hcmVhX2NvdW50IC0gMSkgPyAiIiA6ICIsIik7CisJCQlicmVhazsKKwkJY2FzZSBBUkVBX0xWOgorCQkJLyogRklYTUUgVGhpcyBoZWxwZXIgY29kZSBzaG91bGQgYmUgdGFyZ2V0LWluZGVwZW5kZW50ISBDaGVjayBmb3IgbWV0YWRhdGEgTFYgcHJvcGVydHkuICovCisJCQlpZiAoIShzZWctPnN0YXR1cyAmIFJBSUQpKSB7CisJCQkJb3V0ZihmLCAiXCIlc1wiLCAldSVzIiwKKwkJCQkgICAgIHNlZ19sdihzZWcsIHMpLT5uYW1lLAorCQkJCSAgICAgc2VnX2xlKHNlZywgcyksCisJCQkJICAgICAocyA9PSBzZWctPmFyZWFfY291bnQgLSAxKSA/ICIiIDogIiwiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUkFJRCBkZXZpY2VzIGFyZSBsYWlkLW91dCBpbiBtZXRhZGF0YS9kYXRhIHBhaXJzICovCisJCQkvKiBGSVhNRSBWYWxpZGF0aW9uIHNob3VsZCBiZSBlbHNld2hlcmUsIG5vdCBoZXJlISAqLworCQkJaWYgKCFsdl9pc19yYWlkX2ltYWdlKHNlZ19sdihzZWcsIHMpKSB8fAorCQkJICAgIChzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcsIHMpICYmICFsdl9pc19yYWlkX21ldGFkYXRhKHNlZ19tZXRhbHYoc2VnLCBzKSkpKSB7CisJCQkJbG9nX2Vycm9yKCJSQUlEIHNlZ21lbnQgaGFzIG5vbi1SQUlEIGFyZWFzIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmIChzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcscykpCisJCQkJb3V0ZihmLCAiXCIlc1wiLCBcIiVzXCIlcyIsCisJCQkJICAgICAoc2VnLT5tZXRhX2FyZWFzICYmIHNlZ19tZXRhbHYoc2VnLCBzKSkgPyBzZWdfbWV0YWx2KHNlZywgcyktPm5hbWUgOiAiIiwKKwkJCQkgICAgIHNlZ19sdihzZWcsIHMpLT5uYW1lLCAocyA9PSBzZWctPmFyZWFfY291bnQgLSAxKSA/ICIiIDogIiwiKTsKKwkJCWVsc2UKKwkJCQlvdXRmKGYsICJcIiVzXCIlcyIsIHNlZ19sdihzZWcsIHMpLT5uYW1lLCAocyA9PSBzZWctPmFyZWFfY291bnQgLSAxKSA/ICIiIDogIiwiKTsKKworCQkJYnJlYWs7CisJCWNhc2UgQVJFQV9VTkFTU0lHTkVEOgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlfZGVjX2luZGVudChmKTsKKwlvdXRmKGYsICJdIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgZm9ybWF0dGVyICpmLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB0aW1lX3QgdHMsCisJCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXN0cnVjdCB0bSAqbG9jYWxfdG07CisKKwlpZiAodHMpIHsKKwkJc3RybmNweShidWYsICIjICIsIGJ1Zl9zaXplKTsKKwkJaWYgKCEobG9jYWxfdG0gPSBsb2NhbHRpbWUoJnRzKSkgfHwKKwkJICAgICFzdHJmdGltZShidWYgKyAyLCBidWZfc2l6ZSAtIDIsCisJCQkgICAgICAiJVktJW0tJWQgJVQgJXoiLCBsb2NhbF90bSkpCisJCQlidWZbMF0gPSAwOworCisJCW91dGZjKGYsIGJ1ZiwgIiVzID0gJSIgUFJJdTY0LCBuYW1lLCAodWludDY0X3QpIHRzKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcHJpbnRfbHYoc3RydWN0IGZvcm1hdHRlciAqZiwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWNoYXIgYnVmZmVyWzQwOTZdOworCWludCBzZWdfY291bnQ7CisJdWludDY0X3Qgc3RhdHVzID0gbHYtPnN0YXR1czsKKworCW91dG5sKGYpOworCW91dGYoZiwgIiVzIHsiLCBsdi0+bmFtZSk7CisJX2luY19pbmRlbnQoZik7CisKKwkvKiBGSVhNRTogV3JpdGUgZnVsbCBsdmlkICovCisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmx2LT5sdmlkLmlkWzFdLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlvdXRmKGYsICJpZCA9IFwiJXNcIiIsIGJ1ZmZlcik7CisKKwkvKgorCSAqIFJlbW92aW5nIFdSSVRFIGFuZCBhZGRpbmcgTFZNX1dSSVRFX0xPQ0tFRCBtYWtlcyBpdCByZWFkLW9ubHkKKwkgKiB0byBvbGQgdmVyc2lvbnMgb2YgbHZtIHRoYXQgb25seSBsb29rIGZvciBMVk1fV1JJVEUuCisJICovCisJaWYgKChzdGF0dXMgJiBMVk1fV1JJVEUpICYmIHZnX2ZsYWdfd3JpdGVfbG9ja2VkKGx2LT52ZykpIHsKKwkJc3RhdHVzICY9IH5MVk1fV1JJVEU7CisJCXN0YXR1cyB8PSBMVk1fV1JJVEVfTE9DS0VEOworCX0KKworCWlmICghX3ByaW50X2ZsYWdfY29uZmlnKGYsIHN0YXR1cywgTFZfRkxBR1MpKQorCQlyZXR1cm5fMDsKKworCWlmICghX291dF9saXN0KGYsICZsdi0+dGFncywgInRhZ3MiKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHYtPnRpbWVzdGFtcCkgeworCQlpZiAoIV9wcmludF90aW1lc3RhbXAoZiwgImNyZWF0aW9uX3RpbWUiLCBsdi0+dGltZXN0YW1wLAorCQkJCSAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQkJcmV0dXJuXzA7CisJCW91dGYoZiwgImNyZWF0aW9uX2hvc3QgPSBcIiVzXCIiLCBsdi0+aG9zdG5hbWUpOworCX0KKworCWlmIChsdi0+bG9ja19hcmdzKQorCQlvdXRmKGYsICJsb2NrX2FyZ3MgPSBcIiVzXCIiLCBsdi0+bG9ja19hcmdzKTsKKworCWlmIChsdi0+YWxsb2MgIT0gQUxMT0NfSU5IRVJJVCkKKwkJb3V0ZihmLCAiYWxsb2NhdGlvbl9wb2xpY3kgPSBcIiVzXCIiLAorCQkgICAgIGdldF9hbGxvY19zdHJpbmcobHYtPmFsbG9jKSk7CisKKwlpZiAobHYtPnByb2ZpbGUpCisJCW91dGYoZiwgInByb2ZpbGUgPSBcIiVzXCIiLCBsdi0+cHJvZmlsZS0+bmFtZSk7CisKKwlzd2l0Y2ggKGx2LT5yZWFkX2FoZWFkKSB7CisJY2FzZSBETV9SRUFEX0FIRUFEX05PTkU6CisJCW91dGZjKGYsICIjIE5vbmUiLCAicmVhZF9haGVhZCA9IC0xIik7CisJCWJyZWFrOworCWNhc2UgRE1fUkVBRF9BSEVBRF9BVVRPOgorCQkvKiBObyBvdXRwdXQgLSB1c2UgZGVmYXVsdCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlvdXRmKGYsICJyZWFkX2FoZWFkID0gJXUiLCBsdi0+cmVhZF9haGVhZCk7CisJfQorCisJaWYgKGx2LT5tYWpvciA+PSAwKQorCQlvdXRmKGYsICJtYWpvciA9ICVkIiwgbHYtPm1ham9yKTsKKwlpZiAobHYtPm1pbm9yID49IDApCisJCW91dGYoZiwgIm1pbm9yID0gJWQiLCBsdi0+bWlub3IpOworCW91dGYoZiwgInNlZ21lbnRfY291bnQgPSAldSIsIGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSk7CisJb3V0bmwoZik7CisKKwlzZWdfY291bnQgPSAxOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpIHsKKwkJaWYgKCFfcHJpbnRfc2VnbWVudChmLCBsdi0+dmcsIHNlZ19jb3VudCsrLCBzZWcpKQorCQkJcmV0dXJuXzA7CisJfQorCisJX2RlY19pbmRlbnQoZik7CisJb3V0ZihmLCAifSIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ByaW50X2x2cyhzdHJ1Y3QgZm9ybWF0dGVyICpmLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJLyoKKwkgKiBEb24ndCBib3RoZXIgd2l0aCBhbiBsdiBzZWN0aW9uIGlmIHRoZXJlIGFyZSBubyBsdnMuCisJICovCisJaWYgKGRtX2xpc3RfZW1wdHkoJnZnLT5sdnMpKQorCQlyZXR1cm4gMTsKKworCW91dGYoZiwgImxvZ2ljYWxfdm9sdW1lcyB7Iik7CisJX2luY19pbmRlbnQoZik7CisKKwkvKgorCSAqIFdyaXRlIHZpc2libGUgTFZzIGZpcnN0CisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKCEobHZfaXNfdmlzaWJsZShsdmwtPmx2KSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFfcHJpbnRfbHYoZiwgbHZsLT5sdikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlpZiAoKGx2X2lzX3Zpc2libGUobHZsLT5sdikpKQorCQkJY29udGludWU7CisJCWlmICghX3ByaW50X2x2KGYsIGx2bC0+bHYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJX2RlY19pbmRlbnQoZik7CisJb3V0ZihmLCAifSIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FsbG9jX3ByaW50ZWRfaW5kaXJlY3RfZGVzY2VuZGFudHMoc3RydWN0IGRtX2xpc3QgKmluZGlyZWN0X2dsdnMsIGNoYXIgKipidWZmZXIpCit7CisJc3RydWN0IGdsdl9saXN0ICp1c2VyX2dsdmw7CisJc2l6ZV90IGJ1Zl9zaXplID0gMDsKKwlpbnQgZmlyc3QgPSAxOworCWNoYXIgKmJ1ZjsKKworCSpidWZmZXIgPSBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHVzZXJfZ2x2bCwgaW5kaXJlY3RfZ2x2cykgeworCQlpZiAodXNlcl9nbHZsLT5nbHYtPmlzX2hpc3RvcmljYWwpCisJCQljb250aW51ZTsKKwkJLyogJyInICsgbmFtZSArICciJyArICcsJyArICcgJyAqLworCQlidWZfc2l6ZSArPSBzdHJsZW4odXNlcl9nbHZsLT5nbHYtPmxpdmUtPm5hbWUpICsgNDsKKwl9CisKKwlpZiAoIWJ1Zl9zaXplKQorCQlyZXR1cm4gMTsKKworCS8qICdbJyArICddJyArICdcMCcgKi8KKwlidWZfc2l6ZSArPSAzOworCisJaWYgKCEoKmJ1ZmZlciA9IGRtX21hbGxvYyhidWZfc2l6ZSkpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYW5jZXN0b3IgbGlzdCBidWZmZXIuIik7CisJCXJldHVybiAwOworCX0KKwlidWYgPSAqYnVmZmVyOworCisJaWYgKCFlbWl0X3RvX2J1ZmZlcigmYnVmLCAmYnVmX3NpemUsICJbIikpCisJCWdvdG9fYmFkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHVzZXJfZ2x2bCwgaW5kaXJlY3RfZ2x2cykgeworCQlpZiAodXNlcl9nbHZsLT5nbHYtPmlzX2hpc3RvcmljYWwpCisJCQljb250aW51ZTsKKwkJaWYgKCFmaXJzdCkgeworCQkJaWYgKCFlbWl0X3RvX2J1ZmZlcigmYnVmLCAmYnVmX3NpemUsICIsICIpKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UKKwkJCWZpcnN0ID0gMDsKKworCQlpZiAoIWVtaXRfdG9fYnVmZmVyKCZidWYsICZidWZfc2l6ZSwgIlwiJXNcIiIsIHVzZXJfZ2x2bC0+Z2x2LT5saXZlLT5uYW1lKSkKKwkJCWdvdG9fYmFkOworCX0KKworCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZiwgJmJ1Zl9zaXplLCAiXSIpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiAxOworYmFkOgorCWlmICgqYnVmZmVyKSB7CisJCWRtX2ZyZWUoKmJ1ZmZlcik7CisJCSpidWZmZXIgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcHJpbnRfaGlzdG9yaWNhbF9sdihzdHJ1Y3QgZm9ybWF0dGVyICpmLCBzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSAqaGx2KQoreworCWNoYXIgYnVmZmVyWzQwXTsKKwljaGFyICpkZXNjZW5kYW50c19idWZmZXIgPSBOVUxMOworCWludCByID0gMDsKKworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZobHYtPmx2aWQuaWRbMV0sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQlnb3RvX291dDsKKworCWlmICghX2FsbG9jX3ByaW50ZWRfaW5kaXJlY3RfZGVzY2VuZGFudHMoJmhsdi0+aW5kaXJlY3RfZ2x2cywgJmRlc2NlbmRhbnRzX2J1ZmZlcikpCisJCWdvdG9fb3V0OworCisJb3V0bmxnbyhmKTsKKwlvdXRmZ28oZiwgIiVzIHsiLCBobHYtPm5hbWUpOworCV9pbmNfaW5kZW50KGYpOworCisJb3V0ZmdvKGYsICJpZCA9IFwiJXNcIiIsIGJ1ZmZlcik7CisKKwlpZiAoIV9wcmludF90aW1lc3RhbXAoZiwgImNyZWF0aW9uX3RpbWUiLCBobHYtPnRpbWVzdGFtcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfcHJpbnRfdGltZXN0YW1wKGYsICJyZW1vdmFsX3RpbWUiLCBobHYtPnRpbWVzdGFtcF9yZW1vdmVkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoaGx2LT5pbmRpcmVjdF9vcmlnaW4pIHsKKwkJaWYgKGhsdi0+aW5kaXJlY3Rfb3JpZ2luLT5pc19oaXN0b3JpY2FsKQorCQkJb3V0ZmdvKGYsICJvcmlnaW4gPSBcIiVzJXNcIiIsIEhJU1RPUklDQUxfTFZfUFJFRklYLCBobHYtPmluZGlyZWN0X29yaWdpbi0+aGlzdG9yaWNhbC0+bmFtZSk7CisJCWVsc2UKKwkJCW91dGZnbyhmLCAib3JpZ2luID0gXCIlc1wiIiwgaGx2LT5pbmRpcmVjdF9vcmlnaW4tPmxpdmUtPm5hbWUpOworCX0KKworCWlmIChkZXNjZW5kYW50c19idWZmZXIpCisJCW91dGZnbyhmLCAiZGVzY2VuZGFudHMgPSAlcyIsIGRlc2NlbmRhbnRzX2J1ZmZlcik7CisKKwlfZGVjX2luZGVudChmKTsKKwlvdXRmZ28oZiwgIn0iKTsKKworCXIgPSAxOworb3V0OgorCWlmIChkZXNjZW5kYW50c19idWZmZXIpCisJCWRtX2ZyZWUoZGVzY2VuZGFudHNfYnVmZmVyKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcHJpbnRfaGlzdG9yaWNhbF9sdnMoc3RydWN0IGZvcm1hdHRlciAqZiwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsOworCisJaWYgKGRtX2xpc3RfZW1wdHkoJnZnLT5oaXN0b3JpY2FsX2x2cykpCisJCXJldHVybiAxOworCisJb3V0ZihmLCAiaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZXMgeyIpOworCV9pbmNfaW5kZW50KGYpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpIHsKKwkJaWYgKCFfcHJpbnRfaGlzdG9yaWNhbF9sdihmLCBnbHZsLT5nbHYtPmhpc3RvcmljYWwpKQorCQkJcmV0dXJuXzA7CisJfQorCisJX2RlY19pbmRlbnQoZik7CisJb3V0ZihmLCAifSIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJbiB0aGUgdGV4dCBmb3JtYXQgd2UgcmVmZXIgdG8gcHYncyBhcyAncHYxJywKKyAqICdwdjInIGV0Yy4gIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgaGFzaCB0YWJsZQorICogdG8gZW5hYmxlIGEgcXVpY2sgbG9va3VwIGZyb20gZGV2aWNlIC0+IG5hbWUuCisgKi8KK3N0YXRpYyBpbnQgX2J1aWxkX3B2X25hbWVzKHN0cnVjdCBmb3JtYXR0ZXIgKmYsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWludCBjb3VudCA9IDA7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwljaGFyIGJ1ZmZlclszMl0sICp1dWlkLCAqbmFtZTsKKworCWlmICghKGYtPm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJ0ZXh0IHB2X25hbWVzIiwgNTEyKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZi0+cHZfbmFtZXMgPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlwdiA9IHB2bC0+cHY7CisKKwkJLyogRklYTUUgQnV0IHNraXAgaWYgdGhlcmUncyBhbHJlYWR5IGFuIExWIGNhbGxlZCBwdiVkICEgKi8KKwkJaWYgKGRtX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJwdiVkIiwgY291bnQrKykgPCAwKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCEobmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGYtPm1lbSwgYnVmZmVyKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoISh1dWlkID0gZG1fcG9vbF96YWxsb2MoZi0+bWVtLCA2NCkpIHx8CisJCSAgICFpZF93cml0ZV9mb3JtYXQoJnB2LT5pZCwgdXVpZCwgNjQpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFkbV9oYXNoX2luc2VydChmLT5wdl9uYW1lcywgdXVpZCwgbmFtZSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGV4dF92Z19leHBvcnQoc3RydWN0IGZvcm1hdHRlciAqZiwKKwkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpkZXNjKQoreworCWludCByID0gMDsKKworCWlmICghX2J1aWxkX3B2X25hbWVzKGYsIHZnKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoZi0+aGVhZGVyICYmICFfcHJpbnRfaGVhZGVyKHZnLT5jbWQsIGYsIGRlc2MpKQorCQlnb3RvX291dDsKKworCWlmICghb3V0X3RleHQoZiwgIiVzIHsiLCB2Zy0+bmFtZSkpCisJCWdvdG9fb3V0OworCisJX2luY19pbmRlbnQoZik7CisKKwlpZiAoIV9wcmludF92ZyhmLCB2ZykpCisJCWdvdG9fb3V0OworCisJb3V0bmwoZik7CisJaWYgKCFfcHJpbnRfcHZzKGYsIHZnKSkKKwkJZ290b19vdXQ7CisKKwlvdXRubChmKTsKKwlpZiAoIV9wcmludF9sdnMoZiwgdmcpKQorCQlnb3RvX291dDsKKworCW91dG5sKGYpOworCWlmICghX3ByaW50X2hpc3RvcmljYWxfbHZzKGYsIHZnKSkKKwkJZ290b19vdXQ7CisKKwlfZGVjX2luZGVudChmKTsKKwlpZiAoIW91dF90ZXh0KGYsICJ9IikpCisJCWdvdG9fb3V0OworCisJaWYgKCFmLT5oZWFkZXIgJiYgIV9wcmludF9oZWFkZXIodmctPmNtZCwgZiwgZGVzYykpCisJCWdvdG9fb3V0OworCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlpZiAoZi0+bWVtKSB7CisJCWRtX3Bvb2xfZGVzdHJveShmLT5tZW0pOworCQlmLT5tZW0gPSBOVUxMOworCX0KKworCWlmIChmLT5wdl9uYW1lcykgeworCQlkbV9oYXNoX2Rlc3Ryb3koZi0+cHZfbmFtZXMpOworCQlmLT5wdl9uYW1lcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCB0ZXh0X3ZnX2V4cG9ydF9maWxlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpkZXNjLCBGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgZm9ybWF0dGVyICpmOworCWludCByOworCisJX2luaXQoKTsKKworCWlmICghKGYgPSBkbV96YWxsb2Moc2l6ZW9mKCpmKSkpKQorCQlyZXR1cm5fMDsKKworCWYtPmRhdGEuZnAgPSBmcDsKKwlmLT5pbmRlbnQgPSAwOworCWYtPmhlYWRlciA9IDE7CisJZi0+b3V0X3dpdGhfY29tbWVudCA9ICZfb3V0X3dpdGhfY29tbWVudF9maWxlOworCWYtPm5sID0gJl9ubF9maWxlOworCisJciA9IF90ZXh0X3ZnX2V4cG9ydChmLCB2ZywgZGVzYyk7CisJaWYgKHIpCisJCXIgPSAhZmVycm9yKGYtPmRhdGEuZnApOworCWRtX2ZyZWUoZik7CisJcmV0dXJuIHI7Cit9CisKKy8qIFJldHVybnMgYW1vdW50IG9mIGJ1ZmZlciB1c2VkIGluY2wuIHRlcm1pbmF0aW5nIE5VTCAqLworc2l6ZV90IHRleHRfdmdfZXhwb3J0X3JhdyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqZGVzYywgY2hhciAqKmJ1ZikKK3sKKwlzdHJ1Y3QgZm9ybWF0dGVyICpmOworCXNpemVfdCByID0gMDsKKworCV9pbml0KCk7CisKKwlpZiAoIShmID0gZG1femFsbG9jKHNpemVvZigqZikpKSkKKwkJcmV0dXJuXzA7CisKKwlmLT5kYXRhLmJ1Zi5zaXplID0gNjU1MzY7CS8qIEluaXRpYWwgbWV0YWRhdGEgbGltaXQgKi8KKwlpZiAoIShmLT5kYXRhLmJ1Zi5zdGFydCA9IGRtX21hbGxvYyhmLT5kYXRhLmJ1Zi5zaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJ0ZXh0X2V4cG9ydCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZi0+aW5kZW50ID0gMDsKKwlmLT5oZWFkZXIgPSAwOworCWYtPm91dF93aXRoX2NvbW1lbnQgPSAmX291dF93aXRoX2NvbW1lbnRfcmF3OworCWYtPm5sID0gJl9ubF9yYXc7CisKKwlpZiAoIV90ZXh0X3ZnX2V4cG9ydChmLCB2ZywgZGVzYykpIHsKKwkJZG1fZnJlZShmLT5kYXRhLmJ1Zi5zdGFydCk7CisJCWdvdG9fb3V0OworCX0KKworCXIgPSBmLT5kYXRhLmJ1Zi51c2VkICsgMTsKKwkqYnVmID0gZi0+ZGF0YS5idWYuc3RhcnQ7CisKKyAgICAgIG91dDoKKwlkbV9mcmVlKGYpOworCXJldHVybiByOworfQorCitzaXplX3QgZXhwb3J0X3ZnX3RvX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY2hhciAqKmJ1ZikKK3sKKwlyZXR1cm4gdGV4dF92Z19leHBvcnRfcmF3KHZnLCAiIiwgYnVmKTsKK30KKworc3RydWN0IGRtX2NvbmZpZ190cmVlICpleHBvcnRfdmdfdG9fY29uZmlnX3RyZWUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnZnX2NmdDsKKworCWlmICghZXhwb3J0X3ZnX3RvX2J1ZmZlcih2ZywgJmJ1ZikpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgZm9ybWF0IG1ldGFkYXRhIGZvciBWRyAlcy4iLCB2Zy0+bmFtZSk7CisJCXJldHVybl9OVUxMOworCX0KKworCWlmICghKHZnX2NmdCA9IGRtX2NvbmZpZ19mcm9tX3N0cmluZyhidWYpKSkgeworCQlsb2dfZXJyb3IoIkVycm9yIHBhcnNpbmcgbWV0YWRhdGEgZm9yIFZHICVzLiIsIHZnLT5uYW1lKTsKKwkJZG1fZnJlZShidWYpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlkbV9mcmVlKGJ1Zik7CisJcmV0dXJuIHZnX2NmdDsKK30KKworI3VuZGVmIG91dGYKKyN1bmRlZiBvdXRubApkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF90ZXh0L2ZsYWdzLmMgYi9saWIvZm9ybWF0X3RleHQvZmxhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWI5MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF90ZXh0L2ZsYWdzLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJpbXBvcnQtZXhwb3J0LmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorCisvKgorICogQml0c2V0cyBoZWxkIGluIHRoZSAnc3RhdHVzJyBmbGFncyBnZXQKKyAqIGNvbnZlcnRlZCBpbnRvIGFycmF5cyBvZiBzdHJpbmdzLgorICovCitzdHJ1Y3QgZmxhZyB7CisJY29uc3QgdWludDY0X3QgbWFzazsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQga2luZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmxhZyBfdmdfZmxhZ3NbXSA9IHsKKwl7RVhQT1JURURfVkcsICJFWFBPUlRFRCIsIFNUQVRVU19GTEFHfSwKKwl7UkVTSVpFQUJMRV9WRywgIlJFU0laRUFCTEUiLCBTVEFUVVNfRkxBR30sCisJe1BWTU9WRSwgIlBWTU9WRSIsIFNUQVRVU19GTEFHfSwKKwl7TFZNX1JFQUQsICJSRUFEIiwgU1RBVFVTX0ZMQUd9LAorCXtMVk1fV1JJVEUsICJXUklURSIsIFNUQVRVU19GTEFHfSwKKwl7TFZNX1dSSVRFX0xPQ0tFRCwgIldSSVRFX0xPQ0tFRCIsIENPTVBBVElCTEVfRkxBR30sCisJe0NMVVNURVJFRCwgIkNMVVNURVJFRCIsIFNUQVRVU19GTEFHfSwKKwl7U0hBUkVELCAiU0hBUkVEIiwgU1RBVFVTX0ZMQUd9LAorCXtQQVJUSUFMX1ZHLCBOVUxMLCAwfSwKKwl7UFJFQ09NTUlUVEVELCBOVUxMLCAwfSwKKwl7QVJDSElWRURfVkcsIE5VTEwsIDB9LAorCXswLCBOVUxMLCAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFnIF9wdl9mbGFnc1tdID0geworCXtBTExPQ0FUQUJMRV9QViwgIkFMTE9DQVRBQkxFIiwgU1RBVFVTX0ZMQUd9LAorCXtFWFBPUlRFRF9WRywgIkVYUE9SVEVEIiwgU1RBVFVTX0ZMQUd9LAorCXtNSVNTSU5HX1BWLCAiTUlTU0lORyIsIENPTVBBVElCTEVfRkxBR30sCisJe1VOTEFCRUxMRURfUFYsIE5VTEwsIDB9LAorCXswLCBOVUxMLCAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFnIF9sdl9mbGFnc1tdID0geworCXtMVk1fUkVBRCwgIlJFQUQiLCBTVEFUVVNfRkxBR30sCisJe0xWTV9XUklURSwgIldSSVRFIiwgU1RBVFVTX0ZMQUd9LAorCXtMVk1fV1JJVEVfTE9DS0VELCAiV1JJVEVfTE9DS0VEIiwgQ09NUEFUSUJMRV9GTEFHfSwKKwl7RklYRURfTUlOT1IsICJGSVhFRF9NSU5PUiIsIFNUQVRVU19GTEFHfSwKKwl7VklTSUJMRV9MViwgIlZJU0lCTEUiLCBTVEFUVVNfRkxBR30sCisJe1BWTU9WRSwgIlBWTU9WRSIsIFNUQVRVU19GTEFHfSwKKwl7TE9DS0VELCAiTE9DS0VEIiwgU1RBVFVTX0ZMQUd9LAorCXtMVl9OT1RTWU5DRUQsICJOT1RTWU5DRUQiLCBTVEFUVVNfRkxBR30sCisJe0xWX1JFQlVJTEQsICJSRUJVSUxEIiwgU1RBVFVTX0ZMQUd9LAorCXtMVl9XUklURU1PU1RMWSwgIldSSVRFTU9TVExZIiwgU1RBVFVTX0ZMQUd9LAorCXtMVl9BQ1RJVkFUSU9OX1NLSVAsICJBQ1RJVkFUSU9OX1NLSVAiLCBDT01QQVRJQkxFX0ZMQUd9LAorCXtMVl9FUlJPUl9XSEVOX0ZVTEwsICJFUlJPUl9XSEVOX0ZVTEwiLCBDT01QQVRJQkxFX0ZMQUd9LAorCXtMVl9OT1NDQU4sIE5VTEwsIDB9LAorCXtMVl9URU1QT1JBUlksIE5VTEwsIDB9LAorCXtQT09MX01FVEFEQVRBX1NQQVJFLCBOVUxMLCAwfSwKKwl7TE9DS0RfU0FOTE9DS19MViwgTlVMTCwgMH0sCisJe1JBSUQsIE5VTEwsIDB9LAorCXtSQUlEX01FVEEsIE5VTEwsIDB9LAorCXtSQUlEX0lNQUdFLCBOVUxMLCAwfSwKKwl7TUlSUk9SLCBOVUxMLCAwfSwKKwl7TUlSUk9SX0lNQUdFLCBOVUxMLCAwfSwKKwl7TUlSUk9SX0xPRywgTlVMTCwgMH0sCisJe01JUlJPUkVELCBOVUxMLCAwfSwKKwl7VklSVFVBTCwgTlVMTCwgMH0sCisJe1NOQVBTSE9ULCBOVUxMLCAwfSwKKwl7TUVSR0lORywgTlVMTCwgMH0sCisJe0NPTlZFUlRJTkcsIE5VTEwsIDB9LAorCXtQQVJUSUFMX0xWLCBOVUxMLCAwfSwKKwl7UE9TVE9SREVSX0ZMQUcsIE5VTEwsIDB9LAorCXtWSVJUVUFMX09SSUdJTiwgTlVMTCwgMH0sCisJe1JFUExJQ0FUT1IsIE5VTEwsIDB9LAorCXtSRVBMSUNBVE9SX0xPRywgTlVMTCwgMH0sCisJe1RISU5fVk9MVU1FLCBOVUxMLCAwfSwKKwl7VEhJTl9QT09MLCBOVUxMLCAwfSwKKwl7VEhJTl9QT09MX0RBVEEsIE5VTEwsIDB9LAorCXtUSElOX1BPT0xfTUVUQURBVEEsIE5VTEwsIDB9LAorCXtDQUNIRSwgTlVMTCwgMH0sCisJe0NBQ0hFX1BPT0wsIE5VTEwsIDB9LAorCXtDQUNIRV9QT09MX0RBVEEsIE5VTEwsIDB9LAorCXtDQUNIRV9QT09MX01FVEFEQVRBLCBOVUxMLCAwfSwKKwl7TFZfUEVORElOR19ERUxFVEUsIE5VTEwsIDB9LCAvKiBGSVhNRSBEaXNwbGF5IGxpa2UgQ09NUEFUSUJMRV9GTEFHICovCisJe0xWX1JFTU9WRUQsIE5VTEwsIDB9LAorCXswLCBOVUxMLCAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFnICpfZ2V0X2ZsYWdzKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSAmIH5TVEFUVVNfRkxBRykgeworCWNhc2UgVkdfRkxBR1M6CisJCXJldHVybiBfdmdfZmxhZ3M7CisKKwljYXNlIFBWX0ZMQUdTOgorCQlyZXR1cm4gX3B2X2ZsYWdzOworCisJY2FzZSBMVl9GTEFHUzoKKwkJcmV0dXJuIF9sdl9mbGFnczsKKwl9CisKKwlsb2dfZXJyb3IoIlVua25vd24gZmxhZyBzZXQgcmVxdWVzdGVkLiIpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQ29udmVydHMgYSBiaXRzZXQgdG8gYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcywKKyAqIHVzaW5nIG9uZSBvZiB0aGUgdGFibGVzIGRlZmluZWQgYXQgdGhlIHRvcCBvZgorICogdGhlIGZpbGUuCisgKi8KK2ludCBwcmludF9mbGFncyh1aW50NjRfdCBzdGF0dXMsIGludCB0eXBlLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWludCBmLCBmaXJzdCA9IDE7CisJY29uc3Qgc3RydWN0IGZsYWcgKmZsYWdzOworCisJaWYgKCEoZmxhZ3MgPSBfZ2V0X2ZsYWdzKHR5cGUpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWVtaXRfdG9fYnVmZmVyKCZidWZmZXIsICZzaXplLCAiWyIpKQorCQlyZXR1cm4gMDsKKworCWZvciAoZiA9IDA7IGZsYWdzW2ZdLm1hc2s7IGYrKykgeworCQlpZiAoc3RhdHVzICYgZmxhZ3NbZl0ubWFzaykgeworCQkJc3RhdHVzICY9IH5mbGFnc1tmXS5tYXNrOworCisJCQlpZiAoKHR5cGUgJiBTVEFUVVNfRkxBRykgIT0gZmxhZ3NbZl0ua2luZCkKKwkJCQljb250aW51ZTsKKworCQkJLyogSW50ZXJuYWwtb25seSBmbGFnPyAqLworCQkJaWYgKCFmbGFnc1tmXS5kZXNjcmlwdGlvbikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFmaXJzdCkgeworCQkJCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZmZlciwgJnNpemUsICIsICIpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZQorCQkJCWZpcnN0ID0gMDsKKwkKKwkJCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJcIiVzXCIiLAorCQkJICAgIGZsYWdzW2ZdLmRlc2NyaXB0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghZW1pdF90b19idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJdIikpCisJCXJldHVybiAwOworCisJaWYgKHN0YXR1cykKKwkJbG9nX3dhcm4oSU5URVJOQUxfRVJST1IgIk1ldGFkYXRhIGluY29uc2lzdGVuY3k6ICIKKwkJCSAiTm90IGFsbCBmbGFncyBzdWNjZXNzZnVsbHkgZXhwb3J0ZWQuIik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHJlYWRfZmxhZ3ModWludDY0X3QgKnN0YXR1cywgaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2KQoreworCWludCBmOworCXVpbnQ2NF90IHMgPSBVSU5UNjRfQygwKTsKKwljb25zdCBzdHJ1Y3QgZmxhZyAqZmxhZ3M7CisKKwlpZiAoIShmbGFncyA9IF9nZXRfZmxhZ3ModHlwZSkpKQorCQlyZXR1cm5fMDsKKworCWlmIChjdi0+dHlwZSA9PSBETV9DRkdfRU1QVFlfQVJSQVkpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGN2KSB7CisJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQlsb2dfZXJyb3IoIlN0YXR1cyB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAoZiA9IDA7IGZsYWdzW2ZdLmRlc2NyaXB0aW9uOyBmKyspCisJCQlpZiAoIXN0cmNtcChmbGFnc1tmXS5kZXNjcmlwdGlvbiwgY3YtPnYuc3RyKSkgeworCQkJCXMgfD0gZmxhZ3NbZl0ubWFzazsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAodHlwZSA9PSBWR19GTEFHUyAmJiAhc3RyY21wKGN2LT52LnN0ciwgIlBBUlRJQUwiKSkgeworCQkJLyoKKwkJCSAqIEV4Y2VwdGlvbjogV2Ugbm8gbG9uZ2VyIHdyaXRlIHRoaXMgZmxhZyBvdXQsIGJ1dCBpdAorCQkJICogbWlnaHQgYmUgZW5jb3VudGVyZWQgaW4gb2xkIGJhY2t1cCBmaWxlcywgc28gcmVzdG9yZQorCQkJICogaXQgaW4gdGhhdCBjYXNlLiBJdCBpcyBuZXZlciBwYXJ0IG9mIGxpdmUgbWV0YWRhdGEKKwkJCSAqIHRob3VnaCwgc28gb25seSB2Z2NmZ3Jlc3RvcmUgbmVlZHMgdG8gYmUgY29uY2VybmVkCisJCQkgKiBieSB0aGlzIGNhc2UuCisJCQkgKi8KKwkJCXMgfD0gUEFSVElBTF9WRzsKKwkJfSBlbHNlIGlmICghZmxhZ3NbZl0uZGVzY3JpcHRpb24gJiYgKHR5cGUgJiBTVEFUVVNfRkxBRykpIHsKKwkJCWxvZ19lcnJvcigiVW5rbm93biBzdGF0dXMgZmxhZyAnJXMnLiIsIGN2LT52LnN0cik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWN2ID0gY3YtPm5leHQ7CisJfQorCisgICAgICBvdXQ6CisJKnN0YXR1cyB8PSBzOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmMgYi9saWIvZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNmZWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmMKQEAgLTAsMCArMSwyNTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImZvcm1hdC10ZXh0LmgiCisjaW5jbHVkZSAiaW1wb3J0LWV4cG9ydC5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImx2bS1maWxlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgInV1aWQuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJjcmMuaCIKKyNpbmNsdWRlICJ4bGF0ZS5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm1ldGFkLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKl90ZXh0X2NyZWF0ZV90ZXh0X2luc3RhbmNlKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCQkJCSAgY29uc3Qgc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggKmZpYyk7CisKK3N0cnVjdCB0ZXh0X2ZpZF9jb250ZXh0IHsKKwljaGFyICpyYXdfbWV0YWRhdGFfYnVmOworCXVpbnQzMl90IHJhd19tZXRhZGF0YV9idWZfc2l6ZTsKK307CisKK3N0cnVjdCBkaXJfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwljaGFyIGRpclswXTsKK307CisKK3N0cnVjdCByYXdfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlX2FyZWEgZGV2X2FyZWE7Cit9OworCitpbnQgcmxvY25faXNfaWdub3JlZChjb25zdCBzdHJ1Y3QgcmF3X2xvY24gKnJsb2NuKQoreworCXJldHVybiAocmxvY24tPmZsYWdzICYgUkFXX0xPQ05fSUdOT1JFRCA/IDEgOiAwKTsKK30KKwordm9pZCBybG9jbl9zZXRfaWdub3JlZChzdHJ1Y3QgcmF3X2xvY24gKnJsb2NuLCB1bnNpZ25lZCBtZGFfaWdub3JlZCkKK3sKKwlpZiAobWRhX2lnbm9yZWQpCisJCXJsb2NuLT5mbGFncyB8PSBSQVdfTE9DTl9JR05PUkVEOworCWVsc2UKKwkJcmxvY24tPmZsYWdzICY9IH5SQVdfTE9DTl9JR05PUkVEOworfQorCisvKgorICogTk9URTogQ3VycmVudGx5IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSB2ZyBwZXIgdGV4dCBmaWxlLgorICovCisKKy8qCisgKiBPbmx5IHVzZWQgYnkgdmdjcmVhdGUuCisgKi8KK3N0YXRpYyBpbnQgX3RleHRfdmdfc2V0dXAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlpZiAoIXZnX2NoZWNrX25ld19leHRlbnRfc2l6ZSh2Zy0+ZmlkLT5mbXQsIHZnLT5leHRlbnRfc2l6ZSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBfbWRhX2ZyZWVfc2VjdG9yc19yYXcoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSkKK3sKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKworCXJldHVybiBtZGFjLT5mcmVlX3NlY3RvcnM7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBfbWRhX3RvdGFsX3NlY3RvcnNfcmF3KHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjID0gKHN0cnVjdCBtZGFfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisKKwlyZXR1cm4gbWRhYy0+YXJlYS5zaXplID4+IFNFQ1RPUl9TSElGVDsKK30KKworLyoKKyAqIENoZWNrIGlmIG1ldGFkYXRhIGFyZWEgYmVsb25ncyB0byB2ZworICovCitzdGF0aWMgaW50IF9tZGFfaW5fdmdfcmF3KHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjID0gKHN0cnVjdCBtZGFfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKQorCQlpZiAocHZsLT5wdi0+ZGV2ID09IG1kYWMtPmFyZWEuZGV2KQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIF9tZGFfbG9jbnNfbWF0Y2hfcmF3KHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGExLAorCQkJCSAgICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTIpCit7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGExYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhMS0+bWV0YWRhdGFfbG9jbjsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYTJjID0gKHN0cnVjdCBtZGFfY29udGV4dCAqKSBtZGEyLT5tZXRhZGF0YV9sb2NuOworCisJaWYgKChtZGExYy0+YXJlYS5kZXYgPT0gbWRhMmMtPmFyZWEuZGV2KSAmJgorCSAgICAobWRhMWMtPmFyZWEuc3RhcnQgPT0gbWRhMmMtPmFyZWEuc3RhcnQpICYmCisJICAgIChtZGExYy0+YXJlYS5zaXplID09IG1kYTJjLT5hcmVhLnNpemUpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSAqX21kYV9nZXRfZGV2aWNlX3JhdyhzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhLT5tZXRhZGF0YV9sb2NuOworCXJldHVybiBtZGFjLT5hcmVhLmRldjsKK30KKworLyoKKyAqIEZvciBjaXJjdWxhciByZWdpb24gYmV0d2VlbiByZWdpb25fc3RhcnQgYW5kIHJlZ2lvbl9zdGFydCArIHJlZ2lvbl9zaXplLAorICogYmFjayB1cCBvbmUgU0VDVE9SX1NJWkUgZnJvbSAncmVnaW9uX3B0cicgYW5kIHJldHVybiB0aGUgdmFsdWUuCisgKiBUaGlzIGFsbG93cyByZXZlcnNlIHRyYXZlcnNhbCB0aHJvdWdoIHRleHQgbWV0YWRhdGEgYXJlYSB0byBmaW5kIG9sZAorICogbWV0YWRhdGEuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcmVnaW9uX3N0YXJ0OiBzdGFydCBvZiB0aGUgcmVnaW9uIChieXRlcykKKyAqICAgcmVnaW9uX3NpemU6IHNpemUgb2YgdGhlIHJlZ2lvbiAoYnl0ZXMpCisgKiAgIHJlZ2lvbl9wdHI6IHBvaW50ZXIgd2l0aGluIHRoZSByZWdpb24gKGJ5dGVzKQorICogICBOT1RFOiByZWdpb25fc3RhcnQgPD0gcmVnaW9uX3B0ciA8PSByZWdpb25fc3RhcnQgKyByZWdpb25fc2l6ZQorICovCitzdGF0aWMgdWludDY0X3QgX2dldF9wcmV2X3NlY3Rvcl9jaXJjdWxhcih1aW50NjRfdCByZWdpb25fc3RhcnQsCisJCQkJCSAgdWludDY0X3QgcmVnaW9uX3NpemUsCisJCQkJCSAgdWludDY0X3QgcmVnaW9uX3B0cikKK3sKKwlpZiAocmVnaW9uX3B0ciA+PSByZWdpb25fc3RhcnQgKyBTRUNUT1JfU0laRSkKKwkJcmV0dXJuIHJlZ2lvbl9wdHIgLSBTRUNUT1JfU0laRTsKKwllbHNlCisJCXJldHVybiAocmVnaW9uX3N0YXJ0ICsgcmVnaW9uX3NpemUgLSBTRUNUT1JfU0laRSk7Cit9CisKKy8qCisgKiBBbmFseXplIGEgbWV0YWRhdGEgYXJlYSBmb3Igb2xkIG1ldGFkYXRhIHJlY29yZHMgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqIFRoaXMgZnVuY3Rpb24ganVzdCBsb29rcyB0aHJvdWdoIGFuZCBtYWtlcyBhIGZpcnN0IHBhc3MgYXQgdGhlIGRhdGEgaW4KKyAqIHRoZSBzZWN0b3JzIGZvciBwYXJ0aWN1bGFyIHRoaW5ncy4KKyAqIEZJWE1FOiBkbyBzb21ldGhpbmcgd2l0aCBlYWNoIG1ldGFkYXRhIGFyZWEgKHRyeSB0byBleHRyYWN0IHZnLCB3cml0ZQorICogcmF3IGRhdGEgdG8gZmlsZSwgZXRjKQorICovCitzdGF0aWMgaW50IF9wdl9hbmFseXplX21kYV9yYXcgKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqIGZtdCwKKwkJCQlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKQoreworCXN0cnVjdCBtZGFfaGVhZGVyICptZGFoOworCXN0cnVjdCByYXdfbG9jbiAqcmxvY247CisJdWludDY0X3QgYXJlYV9zdGFydDsKKwl1aW50NjRfdCBhcmVhX3NpemU7CisJdWludDY0X3QgcHJldl9zZWN0b3IsIHByZXZfc2VjdG9yMjsKKwl1aW50NjRfdCBsYXRlc3RfbXJlY19vZmZzZXQ7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IG9mZnNldDI7CisJc2l6ZV90IHNpemU7CisJc2l6ZV90IHNpemUyOworCWNoYXIgKmJ1Zj1OVUxMOworCXN0cnVjdCBkZXZpY2VfYXJlYSAqYXJlYTsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWM7CisJaW50IHI9MDsKKworCW1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKworCWxvZ19wcmludCgiRm91bmQgdGV4dCBtZXRhZGF0YSBhcmVhOiBvZmZzZXQ9JSIgUFJJdTY0ICIsIHNpemU9JSIKKwkJICBQUkl1NjQsIG1kYWMtPmFyZWEuc3RhcnQsIG1kYWMtPmFyZWEuc2l6ZSk7CisJYXJlYSA9ICZtZGFjLT5hcmVhOworCisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShhcmVhLT5kZXYpKQorCQlyZXR1cm5fMDsKKworCWlmICghKG1kYWggPSByYXdfcmVhZF9tZGFfaGVhZGVyKGZtdCwgYXJlYSkpKQorCQlnb3RvX291dDsKKworCXJsb2NuID0gbWRhaC0+cmF3X2xvY25zOworCisJLyoKKwkgKiBUaGUgZGV2aWNlIGFyZWEgaW5jbHVkZXMgdGhlIG1ldGFkYXRhIGhlYWRlciBhcyB3ZWxsIGFzIHRoZQorCSAqIHJlY29yZHMsIHNvIHJlbW92ZSB0aGUgbWV0YWRhdGEgaGVhZGVyIGZyb20gdGhlIHN0YXJ0IGFuZCBzaXplCisJICovCisJYXJlYV9zdGFydCA9IGFyZWEtPnN0YXJ0ICsgTURBX0hFQURFUl9TSVpFOworCWFyZWFfc2l6ZSA9IGFyZWEtPnNpemUgLSBNREFfSEVBREVSX1NJWkU7CisJbGF0ZXN0X21yZWNfb2Zmc2V0ID0gcmxvY24tPm9mZnNldCArIGFyZWEtPnN0YXJ0OworCisJLyoKKwkgKiBTdGFydCBzZWFyY2hpbmcgYXQgcmxvY24gKHBvaW50IG9mIGxpdmUgbWV0YWRhdGEpIGFuZCBnbworCSAqIGJhY2t3YXJkcy4KKwkgKi8KKwlwcmV2X3NlY3RvciA9IF9nZXRfcHJldl9zZWN0b3JfY2lyY3VsYXIoYXJlYV9zdGFydCwgYXJlYV9zaXplLAorCQkJCQkgICAgICAgbGF0ZXN0X21yZWNfb2Zmc2V0KTsKKwlvZmZzZXQgPSBwcmV2X3NlY3RvcjsKKwlzaXplID0gU0VDVE9SX1NJWkU7CisJb2Zmc2V0MiA9IHNpemUyID0gMDsKKworCXdoaWxlIChwcmV2X3NlY3RvciAhPSBsYXRlc3RfbXJlY19vZmZzZXQpIHsKKwkJcHJldl9zZWN0b3IyID0gcHJldl9zZWN0b3I7CisJCXByZXZfc2VjdG9yID0gX2dldF9wcmV2X3NlY3Rvcl9jaXJjdWxhcihhcmVhX3N0YXJ0LCBhcmVhX3NpemUsCisJCQkJCQkJcHJldl9zZWN0b3IpOworCQlpZiAocHJldl9zZWN0b3IgPiBwcmV2X3NlY3RvcjIpCisJCQlnb3RvX291dDsKKwkJLyoKKwkJICogRklYTUU6IGZvciBzb21lIHJlYXNvbiwgdGhlIHdob2xlIG1ldGFkYXRhIHJlZ2lvbiBmcm9tCisJCSAqIGFyZWEtPnN0YXJ0IHRvIGFyZWEtPnN0YXJ0K2FyZWEtPnNpemUgaXMgbm90IHVzZWQuCisJCSAqIE9ubHkgfjMyS0Igc2VlbXMgdG8gY29udGFpbiB2YWxpZCBtZXRhZGF0YSByZWNvcmRzCisJCSAqIChMVk0yIGZvcm1hdCAtIGZvcm1hdF90ZXh0KS4gIEFzIGEgcmVzdWx0LCBJIGVuZCB1cCB3aXRoCisJCSAqICJkbV9jb25maWdfbWF5YmVfc2VjdGlvbiIgcmV0dXJuaW5nIHRydWUgd2hlbiB0aGVyZSdzIG5vIHZhbGlkCisJCSAqIG1ldGFkYXRhIGluIGEgc2VjdG9yIChzZWN0b3JzIHdpdGggYWxsIG51bGxzKS4KKwkJICovCisJCWlmICghKGJ1ZiA9IGRtX21hbGxvYyhzaXplICsgc2l6ZTIpKSkKKwkJCWdvdG9fb3V0OworCisJCWlmICghZGV2X3JlYWRfY2lyY3VsYXIoYXJlYS0+ZGV2LCBvZmZzZXQsIHNpemUsCisJCQkJICAgICAgIG9mZnNldDIsIHNpemUyLCBidWYpKQorCQkJZ290b19vdXQ7CisKKwkJLyoKKwkJICogRklYTUU6IFdlIGNvdWxkIGFkZCBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0YWRhdGEgZGV0ZWN0aW9uCisJCSAqLworCQlpZiAoZG1fY29uZmlnX21heWJlX3NlY3Rpb24oYnVmLCBzaXplICsgc2l6ZTIpKSB7CisJCQkvKiBGSVhNRTogVmFsaWRhdGUgcmVnaW9uLCBwdWxsIG91dCB0aW1lc3RhbXA/LCBldGMgKi8KKwkJCS8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCB0aGlzIHJlZ2lvbiAqLworCQkJbG9nX3ZlcmJvc2UgKCJGb3VuZCBMVk0yIG1ldGFkYXRhIHJlY29yZCBhdCAiCisJCQkJICAgICAib2Zmc2V0PSUiUFJJdTY0Iiwgc2l6ZT0lIlBSSXNpemVfdCIsICIKKwkJCQkgICAgICJvZmZzZXQyPSUiUFJJdTY0IiBzaXplMj0lIlBSSXNpemVfdCwKKwkJCQkgICAgIG9mZnNldCwgc2l6ZSwgb2Zmc2V0Miwgc2l6ZTIpOworCQkJb2Zmc2V0ID0gcHJldl9zZWN0b3I7CisJCQlzaXplID0gU0VDVE9SX1NJWkU7CisJCQlvZmZzZXQyID0gc2l6ZTIgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vdCBhIGNvbXBsZXRlIG1ldGFkYXRhIHJlY29yZCwgYXNzdW1lIHdlIGhhdmUKKwkJCSAqIG1ldGFkYXRhIGFuZCBqdXN0IGluY3JlYXNlIHRoZSBzaXplIGFuZCBvZmZzZXQuCisJCQkgKiBTdGFydCB0aGUgc2Vjb25kIHJlZ2lvbiBpZiB0aGUgcHJldmlvdXMgc2VjdG9yIGlzCisJCQkgKiB3cmFwcGluZyBhcm91bmQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaXNrLgorCQkJICovCisJCQlpZiAocHJldl9zZWN0b3IgPiBvZmZzZXQpIHsKKwkJCQlvZmZzZXQyID0gcHJldl9zZWN0b3I7CisJCQkJc2l6ZTIgKz0gU0VDVE9SX1NJWkU7CisJCQl9IGVsc2UgeworCQkJCW9mZnNldCA9IHByZXZfc2VjdG9yOworCQkJCXNpemUgKz0gU0VDVE9SX1NJWkU7CisJCQl9CisJCX0KKwkJZG1fZnJlZShidWYpOworCQlidWYgPSBOVUxMOworCX0KKworCXIgPSAxOworIG91dDoKKwlpZiAoYnVmKQorCQlkbV9mcmVlKGJ1Zik7CisJaWYgKCFkZXZfY2xvc2UoYXJlYS0+ZGV2KSkKKwkJc3RhY2s7CisJcmV0dXJuIHI7Cit9CisKKworCitzdGF0aWMgaW50IF90ZXh0X2x2X3NldHVwKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKy8qKioqKioqKiBGSVhNRSBBbnkgTFYgc2l6ZSByZXN0cmljdGlvbj8KKwl1aW50NjRfdCBtYXhfc2l6ZSA9IFVJTlRfTUFYOworCisJaWYgKGx2LT5zaXplID4gbWF4X3NpemUpIHsKKwkJY2hhciAqZHVtbXkgPSBkaXNwbGF5X3NpemUobWF4X3NpemUpOworCQlsb2dfZXJyb3IoImxvZ2ljYWwgdm9sdW1lcyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gJXMiLCBkdW1teSk7CisJCWRtX2ZyZWUoZHVtbXkpOworCQlyZXR1cm4gMDsKKwl9CisqLworCisJaWYgKCEqbHYtPmx2aWQucyAmJiAhbHZpZF9jcmVhdGUoJmx2LT5sdmlkLCAmbHYtPnZnLT5pZCkpIHsKKwkJbG9nX2Vycm9yKCJSYW5kb20gbHZpZCBjcmVhdGlvbiBmYWlsZWQgZm9yICVzLyVzLiIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3hsYXRlX21kYWgoc3RydWN0IG1kYV9oZWFkZXIgKm1kYWgpCit7CisJc3RydWN0IHJhd19sb2NuICpybDsKKworCW1kYWgtPnZlcnNpb24gPSB4bGF0ZTMyKG1kYWgtPnZlcnNpb24pOworCW1kYWgtPnN0YXJ0ID0geGxhdGU2NChtZGFoLT5zdGFydCk7CisJbWRhaC0+c2l6ZSA9IHhsYXRlNjQobWRhaC0+c2l6ZSk7CisKKwlybCA9ICZtZGFoLT5yYXdfbG9jbnNbMF07CisJd2hpbGUgKHJsLT5vZmZzZXQpIHsKKwkJcmwtPmNoZWNrc3VtID0geGxhdGUzMihybC0+Y2hlY2tzdW0pOworCQlybC0+b2Zmc2V0ID0geGxhdGU2NChybC0+b2Zmc2V0KTsKKwkJcmwtPnNpemUgPSB4bGF0ZTY0KHJsLT5zaXplKTsKKwkJcmwrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX3Jhd19yZWFkX21kYV9oZWFkZXIoc3RydWN0IG1kYV9oZWFkZXIgKm1kYWgsIHN0cnVjdCBkZXZpY2VfYXJlYSAqZGV2X2FyZWEpCit7CisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShkZXZfYXJlYS0+ZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRldl9yZWFkKGRldl9hcmVhLT5kZXYsIGRldl9hcmVhLT5zdGFydCwgTURBX0hFQURFUl9TSVpFLCBtZGFoKSkgeworCQlpZiAoIWRldl9jbG9zZShkZXZfYXJlYS0+ZGV2KSkKKwkJCXN0YWNrOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIWRldl9jbG9zZShkZXZfYXJlYS0+ZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobWRhaC0+Y2hlY2tzdW1feGwgIT0geGxhdGUzMihjYWxjX2NyYyhJTklUSUFMX0NSQywgKHVpbnQ4X3QgKiltZGFoLT5tYWdpYywKKwkJCQkJCSAgTURBX0hFQURFUl9TSVpFIC0KKwkJCQkJCSAgc2l6ZW9mKG1kYWgtPmNoZWNrc3VtX3hsKSkpKSB7CisJCWxvZ19lcnJvcigiSW5jb3JyZWN0IG1ldGFkYXRhIGFyZWEgaGVhZGVyIGNoZWNrc3VtIG9uICVzIgorCQkJICAiIGF0IG9mZnNldCAlIlBSSXU2NCwgZGV2X25hbWUoZGV2X2FyZWEtPmRldiksCisJCQkgIGRldl9hcmVhLT5zdGFydCk7CisJCXJldHVybiAwOworCX0KKworCV94bGF0ZV9tZGFoKG1kYWgpOworCisJaWYgKHN0cm5jbXAoKGNoYXIgKiltZGFoLT5tYWdpYywgRk1UVF9NQUdJQywgc2l6ZW9mKG1kYWgtPm1hZ2ljKSkpIHsKKwkJbG9nX2Vycm9yKCJXcm9uZyBtYWdpYyBudW1iZXIgaW4gbWV0YWRhdGEgYXJlYSBoZWFkZXIgb24gJXMiCisJCQkgICIgYXQgb2Zmc2V0ICUiUFJJdTY0LCBkZXZfbmFtZShkZXZfYXJlYS0+ZGV2KSwKKwkJCSAgZGV2X2FyZWEtPnN0YXJ0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1kYWgtPnZlcnNpb24gIT0gRk1UVF9WRVJTSU9OKSB7CisJCWxvZ19lcnJvcigiSW5jb21wYXRpYmxlIG1ldGFkYXRhIGFyZWEgaGVhZGVyIHZlcnNpb246ICVkIG9uICVzIgorCQkJICAiIGF0IG9mZnNldCAlIlBSSXU2NCwgbWRhaC0+dmVyc2lvbiwKKwkJCSAgZGV2X25hbWUoZGV2X2FyZWEtPmRldiksIGRldl9hcmVhLT5zdGFydCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtZGFoLT5zdGFydCAhPSBkZXZfYXJlYS0+c3RhcnQpIHsKKwkJbG9nX2Vycm9yKCJJbmNvcnJlY3Qgc3RhcnQgc2VjdG9yIGluIG1ldGFkYXRhIGFyZWEgaGVhZGVyOiAlIgorCQkJICBQUkl1NjQiIG9uICVzIGF0IG9mZnNldCAlIlBSSXU2NCwgbWRhaC0+c3RhcnQsCisJCQkgIGRldl9uYW1lKGRldl9hcmVhLT5kZXYpLCBkZXZfYXJlYS0+c3RhcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IG1kYV9oZWFkZXIgKnJhd19yZWFkX21kYV9oZWFkZXIoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXJlYSAqZGV2X2FyZWEpCit7CisJc3RydWN0IG1kYV9oZWFkZXIgKm1kYWg7CisKKwlpZiAoIShtZGFoID0gZG1fcG9vbF9hbGxvYyhmbXQtPmNtZC0+bWVtLCBNREFfSEVBREVSX1NJWkUpKSkgeworCQlsb2dfZXJyb3IoInN0cnVjdCBtZGFfaGVhZGVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghX3Jhd19yZWFkX21kYV9oZWFkZXIobWRhaCwgZGV2X2FyZWEpKSB7CisJCWRtX3Bvb2xfZnJlZShmbXQtPmNtZC0+bWVtLCBtZGFoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG1kYWg7Cit9CisKK3N0YXRpYyBpbnQgX3Jhd193cml0ZV9tZGFfaGVhZGVyKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHVpbnQ2NF90IHN0YXJ0X2J5dGUsIHN0cnVjdCBtZGFfaGVhZGVyICptZGFoKQoreworCXN0cm5jcHkoKGNoYXIgKiltZGFoLT5tYWdpYywgRk1UVF9NQUdJQywgc2l6ZW9mKG1kYWgtPm1hZ2ljKSk7CisJbWRhaC0+dmVyc2lvbiA9IEZNVFRfVkVSU0lPTjsKKwltZGFoLT5zdGFydCA9IHN0YXJ0X2J5dGU7CisKKwlfeGxhdGVfbWRhaChtZGFoKTsKKwltZGFoLT5jaGVja3N1bV94bCA9IHhsYXRlMzIoY2FsY19jcmMoSU5JVElBTF9DUkMsICh1aW50OF90ICopbWRhaC0+bWFnaWMsCisJCQkJCSAgICAgTURBX0hFQURFUl9TSVpFIC0KKwkJCQkJICAgICBzaXplb2YobWRhaC0+Y2hlY2tzdW1feGwpKSk7CisKKwlpZiAoIWRldl93cml0ZShkZXYsIHN0YXJ0X2J5dGUsIE1EQV9IRUFERVJfU0laRSwgbWRhaCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmF3X2xvY24gKl9maW5kX3ZnX3Jsb2NuKHN0cnVjdCBkZXZpY2VfYXJlYSAqZGV2X2FyZWEsCisJCQkJICAgICAgIHN0cnVjdCBtZGFfaGVhZGVyICptZGFoLAorCQkJCSAgICAgICBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJICAgICAgIGludCAqcHJlY29tbWl0dGVkKQoreworCXNpemVfdCBsZW47CisJY2hhciB2Z25hbWVidWZbTkFNRV9MRU4gKyAyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IHJhd19sb2NuICpybG9jbiwgKnJsb2NuX3ByZWNvbW1pdHRlZDsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5IHZnc3VtbWFyeV9vcnBoYW4gPSB7CisJCS52Z25hbWUgPSBGTVRfVEVYVF9PUlBIQU5fVkdfTkFNRSwKKwl9OworCisJbWVtY3B5KCZ2Z3N1bW1hcnlfb3JwaGFuLnZnaWQsIEZNVF9URVhUX09SUEhBTl9WR19OQU1FLCBzaXplb2YoRk1UX1RFWFRfT1JQSEFOX1ZHX05BTUUpKTsKKworCXJsb2NuID0gbWRhaC0+cmF3X2xvY25zOwkvKiBTbG90IDAgKi8KKwlybG9jbl9wcmVjb21taXR0ZWQgPSBybG9jbiArIDE7CS8qIFNsb3QgMSAqLworCisJLyogU2hvdWxkIHdlIHVzZSBwcmVjb21taXR0ZWQgbWV0YWRhdGE/ICovCisJaWYgKCpwcmVjb21taXR0ZWQgJiYgcmxvY25fcHJlY29tbWl0dGVkLT5zaXplICYmCisJICAgIChybG9jbl9wcmVjb21taXR0ZWQtPm9mZnNldCAhPSBybG9jbi0+b2Zmc2V0KSkgeworCQlybG9jbiA9IHJsb2NuX3ByZWNvbW1pdHRlZDsKKwl9IGVsc2UKKwkJKnByZWNvbW1pdHRlZCA9IDA7CisKKwkvKiBEbyBub3QgY2hlY2sgbm9uLWV4aXN0ZW50IG1ldGFkYXRhLiAqLworCWlmICghcmxvY24tPm9mZnNldCAmJiAhcmxvY24tPnNpemUpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBEb24ndCB0cnkgdG8gY2hlY2sgZXhpc3RpbmcgbWV0YWRhdGEKKwkgKiBpZiBnaXZlbiB2Z25hbWUgaXMgYW4gZW1wdHkgc3RyaW5nLgorCSAqLworCWlmICghKnZnbmFtZSkKKwkJcmV0dXJuIHJsb2NuOworCisJLyogRklYTUUgTG9vcCB0aHJvdWdoIHJsb2NucyB0d28tYXQtYS10aW1lLiAgTGlzdCBudWxsLXRlcm1pbmF0ZWQuICovCisJLyogRklYTUUgSWdub3JlIGlmIGNoZWNrc3VtIGluY29ycmVjdCEhISAqLworCWlmICghZGV2X3JlYWQoZGV2X2FyZWEtPmRldiwgZGV2X2FyZWEtPnN0YXJ0ICsgcmxvY24tPm9mZnNldCwKKwkJICAgICAgc2l6ZW9mKHZnbmFtZWJ1ZiksIHZnbmFtZWJ1ZikpCisJCWdvdG9fYmFkOworCisJaWYgKCFzdHJuY21wKHZnbmFtZWJ1ZiwgdmduYW1lLCBsZW4gPSBzdHJsZW4odmduYW1lKSkgJiYKKwkgICAgKGlzc3BhY2UodmduYW1lYnVmW2xlbl0pIHx8IHZnbmFtZWJ1ZltsZW5dID09ICd7JykpCisJCXJldHVybiBybG9jbjsKKwllbHNlCisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiVm9sdW1lIGdyb3VwIG5hbWUgZm91bmQgaW4gbWV0YWRhdGEgZG9lcyAiCisJCQkJICAgIm5vdCBtYXRjaCBleHBlY3RlZCBuYW1lICVzLiIsIHZnbmFtZSk7CisKKyAgICAgIGJhZDoKKwlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXZfYXJlYS0+ZGV2LT5wdmlkLCBkZXZfYXJlYS0+ZGV2LCAwKSkgJiYKKwkgICAgIWx2bWNhY2hlX3VwZGF0ZV92Z25hbWVfYW5kX2lkKGluZm8sICZ2Z3N1bW1hcnlfb3JwaGFuKSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERldGVybWluZSBvZmZzZXQgZm9yIHVuY29tbWl0dGVkIG1ldGFkYXRhCisgKi8KK3N0YXRpYyB1aW50NjRfdCBfbmV4dF9ybG9jbl9vZmZzZXQoc3RydWN0IHJhd19sb2NuICpybG9jbiwKKwkJCQkgICBzdHJ1Y3QgbWRhX2hlYWRlciAqbWRhaCkKK3sKKwlpZiAoIXJsb2NuKQorCQkvKiBGaW5kIGFuIGVtcHR5IHNsb3QgKi8KKwkJLyogRklYTUUgQXNzdW1lIG9ubHkgb25lIFZHIHBlciBtZGFoIGZvciBub3cgKi8KKwkJcmV0dXJuIE1EQV9IRUFERVJfU0laRTsKKworCS8qIFN0YXJ0IG9mIGZyZWUgc3BhY2UgLSByb3VuZCB1cCB0byBuZXh0IHNlY3RvcjsgY2lyY3VsYXIgKi8KKwlyZXR1cm4gKChybG9jbi0+b2Zmc2V0ICsgcmxvY24tPnNpemUgKworCQkoU0VDVE9SX1NJWkUgLSBybG9jbi0+c2l6ZSAlIFNFQ1RPUl9TSVpFKSAtCisJCU1EQV9IRUFERVJfU0laRSkgJSAobWRhaC0+c2l6ZSAtIE1EQV9IRUFERVJfU0laRSkpCisJICAgICAgICsgTURBX0hFQURFUl9TSVpFOworfQorCitzdGF0aWMgaW50IF9yYXdfaG9sZHNfdmduYW1lKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hcmVhICpkZXZfYXJlYSwgY29uc3QgY2hhciAqdmduYW1lKQoreworCWludCByID0gMDsKKwlpbnQgbm9wcmVjb21taXQgPSAwOworCXN0cnVjdCBtZGFfaGVhZGVyICptZGFoOworCisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShkZXZfYXJlYS0+ZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShtZGFoID0gcmF3X3JlYWRfbWRhX2hlYWRlcihmaWQtPmZtdCwgZGV2X2FyZWEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoX2ZpbmRfdmdfcmxvY24oZGV2X2FyZWEsIG1kYWgsIHZnbmFtZSwgJm5vcHJlY29tbWl0KSkKKwkJciA9IDE7CisKKwlpZiAoIWRldl9jbG9zZShkZXZfYXJlYS0+ZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX3Jhd19hcmVhKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqdmduYW1lLAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2FyZWEgKmFyZWEsCisJCQkJCSAgICAgIHN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqKnZnX2ZtdGRhdGEsCisJCQkJCSAgICAgIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcsCisJCQkJCSAgICAgIGludCBwcmVjb21taXR0ZWQsCisJCQkJCSAgICAgIGludCBzaW5nbGVfZGV2aWNlKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gTlVMTDsKKwlzdHJ1Y3QgcmF3X2xvY24gKnJsb2NuOworCXN0cnVjdCBtZGFfaGVhZGVyICptZGFoOworCXRpbWVfdCB3aGVuOworCWNoYXIgKmRlc2M7CisJdWludDMyX3Qgd3JhcCA9IDA7CisKKwlpZiAoIShtZGFoID0gcmF3X3JlYWRfbWRhX2hlYWRlcihmaWQtPmZtdCwgYXJlYSkpKQorCQlnb3RvX291dDsKKworCWlmICghKHJsb2NuID0gX2ZpbmRfdmdfcmxvY24oYXJlYSwgbWRhaCwgdmduYW1lLCAmcHJlY29tbWl0dGVkKSkpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJWRyAlcyBub3QgZm91bmQgb24gJXMiLCB2Z25hbWUsIGRldl9uYW1lKGFyZWEtPmRldikpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmxvY24tPm9mZnNldCArIHJsb2NuLT5zaXplID4gbWRhaC0+c2l6ZSkKKwkJd3JhcCA9ICh1aW50MzJfdCkgKChybG9jbi0+b2Zmc2V0ICsgcmxvY24tPnNpemUpIC0gbWRhaC0+c2l6ZSk7CisKKwlpZiAod3JhcCA+IHJsb2NuLT5vZmZzZXQpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBtZXRhZGF0YSB0b28gbGFyZ2UgZm9yIGNpcmN1bGFyIGJ1ZmZlciIsCisJCQkgIHZnbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEZJWE1FIDY0LWJpdCAqLworCWlmICghKHZnID0gdGV4dF92Z19pbXBvcnRfZmQoZmlkLCBOVUxMLCB2Z19mbXRkYXRhLCB1c2VfcHJldmlvdXNfdmcsIHNpbmdsZV9kZXZpY2UsIGFyZWEtPmRldiwgCisJCQkJICAgICAob2ZmX3QpIChhcmVhLT5zdGFydCArIHJsb2NuLT5vZmZzZXQpLAorCQkJCSAgICAgKHVpbnQzMl90KSAocmxvY24tPnNpemUgLSB3cmFwKSwKKwkJCQkgICAgIChvZmZfdCkgKGFyZWEtPnN0YXJ0ICsgTURBX0hFQURFUl9TSVpFKSwKKwkJCQkgICAgIHdyYXAsIGNhbGNfY3JjLCBybG9jbi0+Y2hlY2tzdW0sICZ3aGVuLAorCQkJCSAgICAgJmRlc2MpKSAmJiAoIXVzZV9wcmV2aW91c192ZyB8fCAhKnVzZV9wcmV2aW91c192ZykpCisJCWdvdG9fb3V0OworCisJaWYgKHZnKQorCQlsb2dfZGVidWdfbWV0YWRhdGEoIlJlYWQgJXMgJXNtZXRhZGF0YSAoJXUpIGZyb20gJXMgYXQgJSIgUFJJdTY0ICIgc2l6ZSAlIgorCQkJCSAgIFBSSXU2NCwgdmctPm5hbWUsIHByZWNvbW1pdHRlZCA/ICJwcmUtY29tbWl0ICIgOiAiIiwKKwkJCQkgICB2Zy0+c2Vxbm8sIGRldl9uYW1lKGFyZWEtPmRldiksCisJCQkJICAgYXJlYS0+c3RhcnQgKyBybG9jbi0+b2Zmc2V0LCBybG9jbi0+c2l6ZSk7CisJZWxzZQorCQlsb2dfZGVidWdfbWV0YWRhdGEoIlNraXBwZWQgcmVhZGluZyAlc21ldGFkYXRhIGZyb20gJXMgYXQgJSIgUFJJdTY0ICIgc2l6ZSAlIgorCQkJCSAgIFBSSXU2NCAiIHdpdGggbWF0Y2hpbmcgY2hlY2tzdW0uIiwgcHJlY29tbWl0dGVkID8gInByZS1jb21taXQgIiA6ICIiLAorCQkJCSAgIGRldl9uYW1lKGFyZWEtPmRldiksCisJCQkJICAgYXJlYS0+c3RhcnQgKyBybG9jbi0+b2Zmc2V0LCBybG9jbi0+c2l6ZSk7CisKKwlpZiAodmcgJiYgcHJlY29tbWl0dGVkKQorCQl2Zy0+c3RhdHVzIHw9IFBSRUNPTU1JVFRFRDsKKworICAgICAgb3V0OgorCXJldHVybiB2ZzsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX3JhdyhzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJCSBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJCSBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLAorCQkJCQkgc3RydWN0IGNhY2hlZF92Z19mbXRkYXRhICoqdmdfZm10ZGF0YSwKKwkJCQkJIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcsCisJCQkJCSBpbnQgc2luZ2xlX2RldmljZSkKK3sKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkobWRhYy0+YXJlYS5kZXYpKQorCQlyZXR1cm5fTlVMTDsKKworCXZnID0gX3ZnX3JlYWRfcmF3X2FyZWEoZmlkLCB2Z25hbWUsICZtZGFjLT5hcmVhLCB2Z19mbXRkYXRhLCB1c2VfcHJldmlvdXNfdmcsIDAsIHNpbmdsZV9kZXZpY2UpOworCisJaWYgKCFkZXZfY2xvc2UobWRhYy0+YXJlYS5kZXYpKQorCQlzdGFjazsKKworCXJldHVybiB2ZzsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX3ByZWNvbW1pdF9yYXcoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJCQkJICAgY29uc3QgY2hhciAqdmduYW1lLAorCQkJCQkJICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwKKwkJCQkJCSAgIHN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqKnZnX2ZtdGRhdGEsCisJCQkJCQkgICB1bnNpZ25lZCAqdXNlX3ByZXZpb3VzX3ZnKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhLT5tZXRhZGF0YV9sb2NuOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShtZGFjLT5hcmVhLmRldikpCisJCXJldHVybl9OVUxMOworCisJdmcgPSBfdmdfcmVhZF9yYXdfYXJlYShmaWQsIHZnbmFtZSwgJm1kYWMtPmFyZWEsIHZnX2ZtdGRhdGEsIHVzZV9wcmV2aW91c192ZywgMSwgMCk7CisKKwlpZiAoIWRldl9jbG9zZShtZGFjLT5hcmVhLmRldikpCisJCXN0YWNrOworCisJcmV0dXJuIHZnOworfQorCitzdGF0aWMgaW50IF92Z193cml0ZV9yYXcoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhLT5tZXRhZGF0YV9sb2NuOworCXN0cnVjdCB0ZXh0X2ZpZF9jb250ZXh0ICpmaWR0YyA9IChzdHJ1Y3QgdGV4dF9maWRfY29udGV4dCAqKSBmaWQtPnByaXZhdGU7CisJc3RydWN0IHJhd19sb2NuICpybG9jbjsKKwlzdHJ1Y3QgbWRhX2hlYWRlciAqbWRhaDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWludCByID0gMDsKKyAgICAgICB1aW50NjRfdCBuZXdfd3JhcCA9IDAsIG9sZF93cmFwID0gMCwgbmV3X2VuZDsKKwlpbnQgZm91bmQgPSAwOworCWludCBub3ByZWNvbW1pdCA9IDA7CisKKwkvKiBJZ25vcmUgYW55IG1kYSBvbiBhIFBWIG91dHNpZGUgdGhlIFZHLiB2Z3NwbGl0IHJlbGllcyBvbiB0aGlzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKHB2bC0+cHYtPmRldiA9PSBtZGFjLT5hcmVhLmRldikgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMTsKKworCWlmICghZGV2X29wZW4obWRhYy0+YXJlYS5kZXYpKQorCQlyZXR1cm5fMDsKKworCWlmICghKG1kYWggPSByYXdfcmVhZF9tZGFfaGVhZGVyKGZpZC0+Zm10LCAmbWRhYy0+YXJlYSkpKQorCQlnb3RvX291dDsKKworCXJsb2NuID0gX2ZpbmRfdmdfcmxvY24oJm1kYWMtPmFyZWEsIG1kYWgsCisJCQl2Zy0+b2xkX25hbWUgPyB2Zy0+b2xkX25hbWUgOiB2Zy0+bmFtZSwgJm5vcHJlY29tbWl0KTsKKwltZGFjLT5ybG9jbi5vZmZzZXQgPSBfbmV4dF9ybG9jbl9vZmZzZXQocmxvY24sIG1kYWgpOworCisJaWYgKCFmaWR0Yy0+cmF3X21ldGFkYXRhX2J1ZiAmJgorCSAgICAhKGZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmX3NpemUgPQorCQkJdGV4dF92Z19leHBvcnRfcmF3KHZnLCAiIiwgJmZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmKSkpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBtZXRhZGF0YSB3cml0aW5nIGZhaWxlZCIsIHZnLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWRhYy0+cmxvY24uc2l6ZSA9IGZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmX3NpemU7CisKKwlpZiAobWRhYy0+cmxvY24ub2Zmc2V0ICsgbWRhYy0+cmxvY24uc2l6ZSA+IG1kYWgtPnNpemUpCisJCW5ld193cmFwID0gKG1kYWMtPnJsb2NuLm9mZnNldCArIG1kYWMtPnJsb2NuLnNpemUpIC0gbWRhaC0+c2l6ZTsKKworCWlmIChybG9jbiAmJiAocmxvY24tPm9mZnNldCArIHJsb2NuLT5zaXplID4gbWRhaC0+c2l6ZSkpCisJCW9sZF93cmFwID0gKHJsb2NuLT5vZmZzZXQgKyBybG9jbi0+c2l6ZSkgLSBtZGFoLT5zaXplOworCisJbmV3X2VuZCA9IG5ld193cmFwID8gbmV3X3dyYXAgKyBNREFfSEVBREVSX1NJWkUgOgorCQkJICAgIG1kYWMtPnJsb2NuLm9mZnNldCArIG1kYWMtPnJsb2NuLnNpemU7CisKKwlpZiAoKG5ld193cmFwICYmIG9sZF93cmFwKSB8fAorCSAgICAocmxvY24gJiYgKG5ld193cmFwIHx8IG9sZF93cmFwKSAmJiAobmV3X2VuZCA+IHJsb2NuLT5vZmZzZXQpKSB8fAorCSAgICAoTURBX0hFQURFUl9TSVpFICsgKHJsb2NuID8gcmxvY24tPnNpemUgOiAwKSArIG1kYWMtPnJsb2NuLnNpemUgPj0gbWRhaC0+c2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBtZXRhZGF0YSB0b28gbGFyZ2UgZm9yIGNpcmN1bGFyIGJ1ZmZlciIsCisJCQkgIHZnLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJbG9nX2RlYnVnX21ldGFkYXRhKCJXcml0aW5nICVzIG1ldGFkYXRhIHRvICVzIGF0ICUiIFBSSXU2NCAiIGxlbiAlIiBQUkl1NjQsCisJCQkgICAgdmctPm5hbWUsIGRldl9uYW1lKG1kYWMtPmFyZWEuZGV2KSwgbWRhYy0+YXJlYS5zdGFydCArCisJCQkgICAgbWRhYy0+cmxvY24ub2Zmc2V0LCBtZGFjLT5ybG9jbi5zaXplIC0gbmV3X3dyYXApOworCisJLyogV3JpdGUgdGV4dCBvdXQsIGNpcmN1bGFybHkgKi8KKwlpZiAoIWRldl93cml0ZShtZGFjLT5hcmVhLmRldiwgbWRhYy0+YXJlYS5zdGFydCArIG1kYWMtPnJsb2NuLm9mZnNldCwKKwkJICAgICAgIChzaXplX3QpIChtZGFjLT5ybG9jbi5zaXplIC0gbmV3X3dyYXApLAorCQkgICAgICAgZmlkdGMtPnJhd19tZXRhZGF0YV9idWYpKQorCQlnb3RvX291dDsKKworCWlmIChuZXdfd3JhcCkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIldyaXRpbmcgbWV0YWRhdGEgdG8gJXMgYXQgJSIgUFJJdTY0ICIgbGVuICUiIFBSSXU2NCwKKwkJCQkgIGRldl9uYW1lKG1kYWMtPmFyZWEuZGV2KSwgbWRhYy0+YXJlYS5zdGFydCArCisJCQkJICBNREFfSEVBREVSX1NJWkUsIG5ld193cmFwKTsKKworCQlpZiAoIWRldl93cml0ZShtZGFjLT5hcmVhLmRldiwKKwkJCSAgICAgICBtZGFjLT5hcmVhLnN0YXJ0ICsgTURBX0hFQURFUl9TSVpFLAorCQkJICAgICAgIChzaXplX3QpIG5ld193cmFwLAorCQkJICAgICAgIGZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmICsKKwkJCSAgICAgICBtZGFjLT5ybG9jbi5zaXplIC0gbmV3X3dyYXApKQorCQkJZ290b19vdXQ7CisJfQorCisJbWRhYy0+cmxvY24uY2hlY2tzdW0gPSBjYWxjX2NyYyhJTklUSUFMX0NSQywgKHVpbnQ4X3QgKilmaWR0Yy0+cmF3X21ldGFkYXRhX2J1ZiwKKwkJCQkJKHVpbnQzMl90KSAobWRhYy0+cmxvY24uc2l6ZSAtCisJCQkJCQkgICAgbmV3X3dyYXApKTsKKwlpZiAobmV3X3dyYXApCisJCW1kYWMtPnJsb2NuLmNoZWNrc3VtID0gY2FsY19jcmMobWRhYy0+cmxvY24uY2hlY2tzdW0sCisJCQkJCQkodWludDhfdCAqKWZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmICsKKwkJCQkJCW1kYWMtPnJsb2NuLnNpemUgLQorCQkJCQkJbmV3X3dyYXAsICh1aW50MzJfdCkgbmV3X3dyYXApOworCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlpZiAoIXIpIHsKKwkJaWYgKCFkZXZfY2xvc2UobWRhYy0+YXJlYS5kZXYpKQorCQkJc3RhY2s7CisKKwkJZG1fZnJlZShmaWR0Yy0+cmF3X21ldGFkYXRhX2J1Zik7CisJCWZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfdmdfY29tbWl0X3Jhd19ybG9jbihzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwKKwkJCQlpbnQgcHJlY29tbWl0KQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhLT5tZXRhZGF0YV9sb2NuOworCXN0cnVjdCB0ZXh0X2ZpZF9jb250ZXh0ICpmaWR0YyA9IChzdHJ1Y3QgdGV4dF9maWRfY29udGV4dCAqKSBmaWQtPnByaXZhdGU7CisJc3RydWN0IG1kYV9oZWFkZXIgKm1kYWg7CisJc3RydWN0IHJhd19sb2NuICpybG9jbjsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWludCByID0gMDsKKwlpbnQgZm91bmQgPSAwOworCWludCBub3ByZWNvbW1pdCA9IDA7CisKKwkvKiBJZ25vcmUgYW55IG1kYSBvbiBhIFBWIG91dHNpZGUgdGhlIFZHLiB2Z3NwbGl0IHJlbGllcyBvbiB0aGlzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKHB2bC0+cHYtPmRldiA9PSBtZGFjLT5hcmVhLmRldikgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMTsKKworCWlmICghKG1kYWggPSByYXdfcmVhZF9tZGFfaGVhZGVyKGZpZC0+Zm10LCAmbWRhYy0+YXJlYSkpKQorCQlnb3RvX291dDsKKworCWlmICghKHJsb2NuID0gX2ZpbmRfdmdfcmxvY24oJm1kYWMtPmFyZWEsIG1kYWgsCisJCQkJICAgICB2Zy0+b2xkX25hbWUgPyB2Zy0+b2xkX25hbWUgOiB2Zy0+bmFtZSwKKwkJCQkgICAgICZub3ByZWNvbW1pdCkpKSB7CisJCW1kYWgtPnJhd19sb2Nuc1swXS5vZmZzZXQgPSAwOworCQltZGFoLT5yYXdfbG9jbnNbMF0uc2l6ZSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1swXS5jaGVja3N1bSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1sxXS5vZmZzZXQgPSAwOworCQltZGFoLT5yYXdfbG9jbnNbMV0uc2l6ZSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1sxXS5jaGVja3N1bSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1syXS5vZmZzZXQgPSAwOworCQltZGFoLT5yYXdfbG9jbnNbMl0uc2l6ZSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1syXS5jaGVja3N1bSA9IDA7CisJCXJsb2NuID0gJm1kYWgtPnJhd19sb2Nuc1swXTsKKwl9CisKKwlpZiAocHJlY29tbWl0KQorCQlybG9jbisrOworCWVsc2UgeworCQkvKiBJZiBub3QgcHJlY29tbWl0dGluZywgd2lwZSB0aGUgcHJlY29tbWl0dGVkIHJsb2NuICovCisJCW1kYWgtPnJhd19sb2Nuc1sxXS5vZmZzZXQgPSAwOworCQltZGFoLT5yYXdfbG9jbnNbMV0uc2l6ZSA9IDA7CisJCW1kYWgtPnJhd19sb2Nuc1sxXS5jaGVja3N1bSA9IDA7CisJfQorCisJLyogSXMgdGhlcmUgbmV3IG1ldGFkYXRhIHRvIGNvbW1pdD8gKi8KKwlpZiAobWRhYy0+cmxvY24uc2l6ZSkgeworCQlybG9jbi0+b2Zmc2V0ID0gbWRhYy0+cmxvY24ub2Zmc2V0OworCQlybG9jbi0+c2l6ZSA9IG1kYWMtPnJsb2NuLnNpemU7CisJCXJsb2NuLT5jaGVja3N1bSA9IG1kYWMtPnJsb2NuLmNoZWNrc3VtOworCQlsb2dfZGVidWdfbWV0YWRhdGEoIiVzQ29tbWl0dGluZyAlcyBtZXRhZGF0YSAoJXUpIHRvICVzIGhlYWRlciBhdCAlIgorCQkJICBQUkl1NjQsIHByZWNvbW1pdCA/ICJQcmUtIiA6ICIiLCB2Zy0+bmFtZSwgdmctPnNlcW5vLAorCQkJICBkZXZfbmFtZShtZGFjLT5hcmVhLmRldiksIG1kYWMtPmFyZWEuc3RhcnQpOworCX0gZWxzZQorCQlsb2dfZGVidWdfbWV0YWRhdGEoIldpcGluZyBwcmUtY29tbWl0dGVkICVzIG1ldGFkYXRhIGZyb20gJXMgIgorCQkJCSAgICJoZWFkZXIgYXQgJSIgUFJJdTY0LCB2Zy0+bmFtZSwKKwkJCQkgICBkZXZfbmFtZShtZGFjLT5hcmVhLmRldiksIG1kYWMtPmFyZWEuc3RhcnQpOworCisJcmxvY25fc2V0X2lnbm9yZWQobWRhaC0+cmF3X2xvY25zLCBtZGFfaXNfaWdub3JlZChtZGEpKTsKKworCWlmICghX3Jhd193cml0ZV9tZGFfaGVhZGVyKGZpZC0+Zm10LCBtZGFjLT5hcmVhLmRldiwgbWRhYy0+YXJlYS5zdGFydCwKKwkJCQkgICBtZGFoKSkgeworCQlkbV9wb29sX2ZyZWUoZmlkLT5mbXQtPmNtZC0+bWVtLCBtZGFoKTsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgYXJlYSBoZWFkZXIiKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CisKKyAgICAgIG91dDoKKwlpZiAoIXByZWNvbW1pdCkgeworCQlpZiAoIWRldl9jbG9zZShtZGFjLT5hcmVhLmRldikpCisJCQlzdGFjazsKKworCQlkbV9mcmVlKGZpZHRjLT5yYXdfbWV0YWRhdGFfYnVmKTsKKwkJZmlkdGMtPnJhd19tZXRhZGF0YV9idWYgPSBOVUxMOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF92Z19jb21taXRfcmF3KHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJcmV0dXJuIF92Z19jb21taXRfcmF3X3Jsb2NuKGZpZCwgdmcsIG1kYSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX3ZnX3ByZWNvbW1pdF9yYXcoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSkKK3sKKwlyZXR1cm4gX3ZnX2NvbW1pdF9yYXdfcmxvY24oZmlkLCB2ZywgbWRhLCAxKTsKK30KKworLyogQ2xvc2UgbWV0YWRhdGEgYXJlYSBkZXZpY2VzICovCitzdGF0aWMgaW50IF92Z19yZXZlcnRfcmF3KHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjID0gKHN0cnVjdCBtZGFfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlpbnQgZm91bmQgPSAwOworCisJLyogSWdub3JlIGFueSBtZGEgb24gYSBQViBvdXRzaWRlIHRoZSBWRy4gdmdzcGxpdCByZWxpZXMgb24gdGhpcyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmIChwdmwtPnB2LT5kZXYgPT0gbWRhYy0+YXJlYS5kZXYpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIDE7CisKKwkvKiBXaXBlIHByZS1jb21taXR0ZWQgbWV0YWRhdGEgKi8KKwltZGFjLT5ybG9jbi5zaXplID0gMDsKKwlyZXR1cm4gX3ZnX2NvbW1pdF9yYXdfcmxvY24oZmlkLCB2ZywgbWRhLCAwKTsKK30KKworc3RhdGljIGludCBfdmdfcmVtb3ZlX3JhdyhzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWRhLT5tZXRhZGF0YV9sb2NuOworCXN0cnVjdCBtZGFfaGVhZGVyICptZGFoOworCXN0cnVjdCByYXdfbG9jbiAqcmxvY247CisJaW50IHIgPSAwOworCWludCBub3ByZWNvbW1pdCA9IDA7CisKKwlpZiAoIWRldl9vcGVuKG1kYWMtPmFyZWEuZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShtZGFoID0gcmF3X3JlYWRfbWRhX2hlYWRlcihmaWQtPmZtdCwgJm1kYWMtPmFyZWEpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShybG9jbiA9IF9maW5kX3ZnX3Jsb2NuKCZtZGFjLT5hcmVhLCBtZGFoLCB2Zy0+bmFtZSwgJm5vcHJlY29tbWl0KSkpIHsKKwkJcmxvY24gPSAmbWRhaC0+cmF3X2xvY25zWzBdOworCQltZGFoLT5yYXdfbG9jbnNbMV0ub2Zmc2V0ID0gMDsKKwl9CisKKwlybG9jbi0+b2Zmc2V0ID0gMDsKKwlybG9jbi0+c2l6ZSA9IDA7CisJcmxvY24tPmNoZWNrc3VtID0gMDsKKwlybG9jbl9zZXRfaWdub3JlZChtZGFoLT5yYXdfbG9jbnMsIG1kYV9pc19pZ25vcmVkKG1kYSkpOworCisJaWYgKCFfcmF3X3dyaXRlX21kYV9oZWFkZXIoZmlkLT5mbXQsIG1kYWMtPmFyZWEuZGV2LCBtZGFjLT5hcmVhLnN0YXJ0LAorCQkJCSAgIG1kYWgpKSB7CisJCWRtX3Bvb2xfZnJlZShmaWQtPmZtdC0+Y21kLT5tZW0sIG1kYWgpOworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBtZXRhZGF0YSBhcmVhIGhlYWRlciIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyID0gMTsKKworICAgICAgb3V0OgorCWlmICghZGV2X2Nsb3NlKG1kYWMtPmFyZWEuZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX2ZpbGVfbmFtZShzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpyZWFkX3BhdGgpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJdGltZV90IHdoZW47CisJY2hhciAqZGVzYzsKKworCWlmICghKHZnID0gdGV4dF92Z19pbXBvcnRfZmlsZShmaWQsIHJlYWRfcGF0aCwgJndoZW4sICZkZXNjKSkpCisJCXJldHVybl9OVUxMOworCisJLyoKKwkgKiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgdm9sdW1lIGdyb3VwIHBlcgorCSAqIHRleHQgZmlsZSAodGhpcyByZXN0cmljdGlvbiBtYXkgcmVtYWluKS4gIFdlIG5lZWQgdG8KKwkgKiBjaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZSBjb3JyZWN0IHZvbHVtZSBncm91cC4KKwkgKi8KKwlpZiAodmduYW1lICYmIHN0cmNtcCh2Z25hbWUsIHZnLT5uYW1lKSkgeworCQlmaWQtPnJlZl9jb3VudCsrOyAvKiBQcmVzZXJ2ZSBGSUQgYWZ0ZXIgdmcgcmVsZWFzZSAqLworCQlyZWxlYXNlX3ZnKHZnKTsKKwkJbG9nX2Vycm9yKCInJXMnIGRvZXMgbm90IGNvbnRhaW4gdm9sdW1lIGdyb3VwICclcycuIiwKKwkJCSAgcmVhZF9wYXRoLCB2Z25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJSZWFkIHZvbHVtZSBncm91cCAlcyBmcm9tICVzIiwgdmctPm5hbWUsIHJlYWRfcGF0aCk7CisKKwlyZXR1cm4gdmc7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpfdmdfcmVhZF9maWxlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJICBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJCSAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwKKwkJCQkJICBzdHJ1Y3QgY2FjaGVkX3ZnX2ZtdGRhdGEgKip2Z19mbXRkYXRhLAorCQkJCQkgIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSAgaW50IHNpbmdsZV9kZXZpY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IHRleHRfY29udGV4dCAqdGMgPSAoc3RydWN0IHRleHRfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisKKwlyZXR1cm4gX3ZnX3JlYWRfZmlsZV9uYW1lKGZpZCwgdmduYW1lLCB0Yy0+cGF0aF9saXZlKTsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX3ByZWNvbW1pdF9maWxlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJCSAgICBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkJCQkgICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwKKwkJCQkJCSAgICBzdHJ1Y3QgY2FjaGVkX3ZnX2ZtdGRhdGEgKip2Z19mbXRkYXRhLAorCQkJCQkJICAgIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IHRleHRfY29udGV4dCAqdGMgPSAoc3RydWN0IHRleHRfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisKKwlpZiAoKHZnID0gX3ZnX3JlYWRfZmlsZV9uYW1lKGZpZCwgdmduYW1lLCB0Yy0+cGF0aF9lZGl0KSkpCisJCXZnLT5zdGF0dXMgfD0gUFJFQ09NTUlUVEVEOworCWVsc2UKKwkJdmcgPSBfdmdfcmVhZF9maWxlX25hbWUoZmlkLCB2Z25hbWUsIHRjLT5wYXRoX2xpdmUpOworCisJcmV0dXJuIHZnOworfQorCitzdGF0aWMgaW50IF92Z193cml0ZV9maWxlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IHRleHRfY29udGV4dCAqdGMgPSAoc3RydWN0IHRleHRfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisKKwlGSUxFICpmcDsKKwlpbnQgZmQ7CisJY2hhciAqc2xhc2g7CisJY2hhciB0ZW1wX2ZpbGVbUEFUSF9NQVhdLCB0ZW1wX2RpcltQQVRIX01BWF07CisKKwlzbGFzaCA9IHN0cnJjaHIodGMtPnBhdGhfZWRpdCwgJy8nKTsKKworCWlmIChzbGFzaCA9PSAwKQorCQlzdHJjcHkodGVtcF9kaXIsICIuIik7CisJZWxzZSBpZiAoc2xhc2ggLSB0Yy0+cGF0aF9lZGl0IDwgUEFUSF9NQVgpIHsKKwkJc3RybmNweSh0ZW1wX2RpciwgdGMtPnBhdGhfZWRpdCwKKwkJCShzaXplX3QpIChzbGFzaCAtIHRjLT5wYXRoX2VkaXQpKTsKKwkJdGVtcF9kaXJbc2xhc2ggLSB0Yy0+cGF0aF9lZGl0XSA9ICdcMCc7CisKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoIlRleHQgZm9ybWF0IGZhaWxlZCB0byBkZXRlcm1pbmUgZGlyZWN0b3J5LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNyZWF0ZV90ZW1wX25hbWUodGVtcF9kaXIsIHRlbXBfZmlsZSwgc2l6ZW9mKHRlbXBfZmlsZSksICZmZCwKKwkJCSAgICAgICZ2Zy0+Y21kLT5yYW5kX3NlZWQpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRlbXBvcmFyeSB0ZXh0IGZpbGUgbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZnAgPSBmZG9wZW4oZmQsICJ3IikpKSB7CisJCWxvZ19zeXNfZXJyb3IoImZkb3BlbiIsIHRlbXBfZmlsZSk7CisJCWlmIChjbG9zZShmZCkpCisJCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCB0ZW1wX2ZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIldyaXRpbmcgJXMgbWV0YWRhdGEgdG8gJXMiLCB2Zy0+bmFtZSwgdGVtcF9maWxlKTsKKworCWlmICghdGV4dF92Z19leHBvcnRfZmlsZSh2ZywgdGMtPmRlc2MsIGZwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBtZXRhZGF0YSB0byAlcy4iLCB0ZW1wX2ZpbGUpOworCQlpZiAoZmNsb3NlKGZwKSkKKwkJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHRlbXBfZmlsZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmc3luYyhmZCkgJiYgKGVycm5vICE9IEVST0ZTKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmc3luYyIsIHRjLT5wYXRoX2VkaXQpOworCQlpZiAoZmNsb3NlKGZwKSkKKwkJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHRjLT5wYXRoX2VkaXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZtX2ZjbG9zZShmcCwgdGMtPnBhdGhfZWRpdCkpCisJCXJldHVybl8wOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCJSZW5hbWluZyAlcyB0byAlcyIsIHRlbXBfZmlsZSwgdGMtPnBhdGhfZWRpdCk7CisJaWYgKHJlbmFtZSh0ZW1wX2ZpbGUsIHRjLT5wYXRoX2VkaXQpKSB7CisJCWxvZ19lcnJvcigiJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQ6ICVzIiwgdGVtcF9maWxlLAorCQkJICB0Yy0+cGF0aF9lZGl0LCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdfY29tbWl0X2ZpbGVfYmFja3VwKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSkKK3sKKwlzdHJ1Y3QgdGV4dF9jb250ZXh0ICp0YyA9IChzdHJ1Y3QgdGV4dF9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKworCWlmICh0ZXN0X21vZGUoKSkgeworCQlsb2dfdmVyYm9zZSgiVGVzdCBtb2RlOiBTa2lwcGluZyBjb21taXR0aW5nICVzIG1ldGFkYXRhICgldSkiLAorCQkJICAgIHZnLT5uYW1lLCB2Zy0+c2Vxbm8pOworCQlpZiAodW5saW5rKHRjLT5wYXRoX2VkaXQpKSB7CisJCQlsb2dfZGVidWdfbWV0YWRhdGEoIlVubGlua2luZyAlcyIsIHRjLT5wYXRoX2VkaXQpOworCQkJbG9nX3N5c19lcnJvcigidW5saW5rIiwgdGMtPnBhdGhfZWRpdCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ29tbWl0dGluZyAlcyBtZXRhZGF0YSAoJXUpIiwgdmctPm5hbWUsIHZnLT5zZXFubyk7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiUmVuYW1pbmcgJXMgdG8gJXMiLCB0Yy0+cGF0aF9lZGl0LCB0Yy0+cGF0aF9saXZlKTsKKwkJaWYgKHJlbmFtZSh0Yy0+cGF0aF9lZGl0LCB0Yy0+cGF0aF9saXZlKSkgeworCQkJbG9nX2Vycm9yKCIlczogcmVuYW1lIHRvICVzIGZhaWxlZDogJXMiLCB0Yy0+cGF0aF9lZGl0LAorCQkJCSAgdGMtPnBhdGhfbGl2ZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3luY19kaXIodGMtPnBhdGhfZWRpdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdfY29tbWl0X2ZpbGUoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IHRleHRfY29udGV4dCAqdGMgPSAoc3RydWN0IHRleHRfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisJY29uc3QgY2hhciAqc2xhc2g7CisJY2hhciBuZXdfbmFtZVtQQVRIX01BWF07CisJc2l6ZV90IGxlbjsKKworCWlmICghX3ZnX2NvbW1pdF9maWxlX2JhY2t1cChmaWQsIHZnLCBtZGEpKQorCQlyZXR1cm4gMDsKKworCS8qIHZncmVuYW1lPyAqLworCWlmICgoc2xhc2ggPSBzdHJyY2hyKHRjLT5wYXRoX2xpdmUsICcvJykpKQorCQlzbGFzaCA9IHNsYXNoICsgMTsKKwllbHNlCisJCXNsYXNoID0gdGMtPnBhdGhfbGl2ZTsKKworCWlmIChzdHJjbXAoc2xhc2gsIHZnLT5uYW1lKSkgeworCQlsZW4gPSBzbGFzaCAtIHRjLT5wYXRoX2xpdmU7CisJCXN0cm5jcHkobmV3X25hbWUsIHRjLT5wYXRoX2xpdmUsIGxlbik7CisJCXN0cmNweShuZXdfbmFtZSArIGxlbiwgdmctPm5hbWUpOworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlJlbmFtaW5nICVzIHRvICVzIiwgdGMtPnBhdGhfbGl2ZSwgbmV3X25hbWUpOworCQlpZiAodGVzdF9tb2RlKCkpCisJCQlsb2dfdmVyYm9zZSgiVGVzdCBtb2RlOiBTa2lwcGluZyByZW5hbWUiKTsKKwkJZWxzZSB7CisJCQlpZiAocmVuYW1lKHRjLT5wYXRoX2xpdmUsIG5ld19uYW1lKSkgeworCQkJCWxvZ19lcnJvcigiJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQ6ICVzIiwKKwkJCQkJICB0Yy0+cGF0aF9saXZlLCBuZXdfbmFtZSwKKwkJCQkJICBzdHJlcnJvcihlcnJubykpOworCQkJCXN5bmNfZGlyKG5ld19uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z19yZW1vdmVfZmlsZShzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IHRleHRfY29udGV4dCAqdGMgPSAoc3RydWN0IHRleHRfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisKKwlpZiAocGF0aF9leGlzdHModGMtPnBhdGhfZWRpdCkgJiYgdW5saW5rKHRjLT5wYXRoX2VkaXQpKSB7CisJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIHRjLT5wYXRoX2VkaXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGF0aF9leGlzdHModGMtPnBhdGhfbGl2ZSkgJiYgdW5saW5rKHRjLT5wYXRoX2xpdmUpKSB7CisJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIHRjLT5wYXRoX2xpdmUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzeW5jX2Rpcih0Yy0+cGF0aF9saXZlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zY2FuX2ZpbGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkaXJlbnQ7CisJc3RydWN0IGRpcl9saXN0ICpkbDsKKwlzdHJ1Y3QgZG1fbGlzdCAqZGlyX2xpc3Q7CisJY2hhciAqdG1wOworCURJUiAqZDsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQ7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggZmljOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY2hhciAqc2Nhbm5lZF92Z25hbWU7CisKKwlkaXJfbGlzdCA9ICYoKHN0cnVjdCBtZGFfbGlzdHMgKikgZm10LT5wcml2YXRlKS0+ZGlyczsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkbCwgZGlyX2xpc3QpIHsKKwkJaWYgKCEoZCA9IG9wZW5kaXIoZGwtPmRpcikpKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJvcGVuZGlyIiwgZGwtPmRpcik7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZCkpKQorCQkJaWYgKHN0cmNtcChkaXJlbnQtPmRfbmFtZSwgIi4iKSAmJgorCQkJICAgIHN0cmNtcChkaXJlbnQtPmRfbmFtZSwgIi4uIikgJiYKKwkJCSAgICAoISh0bXAgPSBzdHJzdHIoZGlyZW50LT5kX25hbWUsICIudG1wIikpIHx8CisJCQkgICAgIHRtcCAhPSBkaXJlbnQtPmRfbmFtZSArIHN0cmxlbihkaXJlbnQtPmRfbmFtZSkKKwkJCSAgICAgLSA0KSkgeworCQkJCXNjYW5uZWRfdmduYW1lID0gZGlyZW50LT5kX25hbWU7CisKKwkJCQkvKiBJZiB2Z25hbWUgc3VwcGxpZWQsIG9ubHkgc2NhbiB0aGF0IG9uZSBWRyAqLworCQkJCWlmICh2Z25hbWUgJiYgc3RyY21wKHZnbmFtZSwgc2Nhbm5lZF92Z25hbWUpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChkbV9zbnByaW50ZihwYXRoLCBQQVRIX01BWCwgIiVzLyVzIiwKKwkJCQkJCSBkbC0+ZGlyLCBzY2FubmVkX3ZnbmFtZSkgPCAwKSB7CisJCQkJCWxvZ19lcnJvcigiTmFtZSB0b28gbG9uZyAlcy8lcyIsCisJCQkJCQkgIGRsLT5kaXIsIHNjYW5uZWRfdmduYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogRklYTUUgc3RhdCBmaWxlIHRvIHNlZSBpZiBpdCdzIGNoYW5nZWQgKi8KKwkJCQkvKiBGSVhNRTogQ2hlY2sgdGhpcyBmaWQgaXMgT0shICovCisJCQkJZmljLnR5cGUgPSBGTVRfSU5TVEFOQ0VfUFJJVkFURV9NREFTOworCQkJCWZpYy5jb250ZXh0LnByaXZhdGUgPSBOVUxMOworCQkJCWlmICghKGZpZCA9IF90ZXh0X2NyZWF0ZV90ZXh0X2luc3RhbmNlKGZtdCwgJmZpYykpKSB7CisJCQkJCXN0YWNrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCh2ZyA9IF92Z19yZWFkX2ZpbGVfbmFtZShmaWQsIHNjYW5uZWRfdmduYW1lLAorCQkJCQkJCSAgICAgcGF0aCkpKSB7CisJCQkJCS8qIEZJWE1FIFN0b3JlIGNyZWF0aW9uIGhvc3QgaW4gdmcgKi8KKwkJCQkJbHZtY2FjaGVfdXBkYXRlX3ZnKHZnLCAwKTsKKwkJCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQkJfQorCQkJfQorCisJCWlmIChjbG9zZWRpcihkKSkKKwkJCWxvZ19zeXNfZXJyb3IoImNsb3NlZGlyIiwgZGwtPmRpcik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z25hbWVfZnJvbV9tZGEoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCSAgICBzdHJ1Y3QgbWRhX2hlYWRlciAqbWRhaCwgc3RydWN0IGRldmljZV9hcmVhICpkZXZfYXJlYSwKKwkJICAgIHN0cnVjdCBsdm1jYWNoZV92Z3N1bW1hcnkgKnZnc3VtbWFyeSwgdWludDY0X3QgKm1kYV9mcmVlX3NlY3RvcnMpCit7CisJc3RydWN0IHJhd19sb2NuICpybG9jbjsKKwl1aW50MzJfdCB3cmFwID0gMDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwljaGFyIGJ1ZltOQU1FX0xFTiArIDFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwl1aW50NjRfdCBidWZmZXJfc2l6ZSwgY3VycmVudF91c2FnZTsKKwl1bnNpZ25lZCB1c2VkX2NhY2hlZF9tZXRhZGF0YSA9IDA7CisKKwlpZiAobWRhX2ZyZWVfc2VjdG9ycykKKwkJKm1kYV9mcmVlX3NlY3RvcnMgPSAoKGRldl9hcmVhLT5zaXplIC0gTURBX0hFQURFUl9TSVpFKSAvIDIpID4+IFNFQ1RPUl9TSElGVDsKKworCWlmICghbWRhaCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInZnbmFtZV9mcm9tX21kYSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIgZm9yIG1kYV9oZWFkZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRklYTUUgQ29wZSB3aXRoIHJldHVybmluZyBhIGxpc3QgKi8KKwlybG9jbiA9IG1kYWgtPnJhd19sb2NuczsKKworCS8qCisJICogSWYgbm8gdmFsaWQgb2Zmc2V0LCBkbyBub3QgdHJ5IHRvIHNlYXJjaCBmb3IgdmduYW1lCisJICovCisJaWYgKCFybG9jbi0+b2Zmc2V0KSB7CisJCWxvZ19kZWJ1ZygiJXM6IGZvdW5kIG1ldGFkYXRhIHdpdGggb2Zmc2V0IDAuIiwKKwkJCSAgZGV2X25hbWUoZGV2X2FyZWEtPmRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEbyBxdWljayBjaGVjayBmb3IgYSB2Z25hbWUgKi8KKwlpZiAoIWRldl9yZWFkKGRldl9hcmVhLT5kZXYsIGRldl9hcmVhLT5zdGFydCArIHJsb2NuLT5vZmZzZXQsCisJCSAgICAgIE5BTUVfTEVOLCBidWYpKQorCQlyZXR1cm5fMDsKKworCXdoaWxlIChidWZbbGVuXSAmJiAhaXNzcGFjZShidWZbbGVuXSkgJiYgYnVmW2xlbl0gIT0gJ3snICYmCisJICAgICAgIGxlbiA8IChOQU1FX0xFTiAtIDEpKQorCQlsZW4rKzsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKworCS8qIElnbm9yZSB0aGlzIGVudHJ5IGlmIHRoZSBjaGFyYWN0ZXJzIGFyZW4ndCBwZXJtaXNzaWJsZSAqLworCWlmICghdmFsaWRhdGVfbmFtZShidWYpKQorCQlyZXR1cm5fMDsKKworCS8qIFdlIGZvdW5kIGEgVkcgLSBub3cgY2hlY2sgdGhlIG1ldGFkYXRhICovCisJaWYgKHJsb2NuLT5vZmZzZXQgKyBybG9jbi0+c2l6ZSA+IG1kYWgtPnNpemUpCisJCXdyYXAgPSAodWludDMyX3QpICgocmxvY24tPm9mZnNldCArIHJsb2NuLT5zaXplKSAtIG1kYWgtPnNpemUpOworCisJaWYgKHdyYXAgPiBybG9jbi0+b2Zmc2V0KSB7CisJCWxvZ19lcnJvcigiJXM6IG1ldGFkYXRhIHRvbyBsYXJnZSBmb3IgY2lyY3VsYXIgYnVmZmVyIiwKKwkJCSAgZGV2X25hbWUoZGV2X2FyZWEtPmRldikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEaWQgd2Ugc2VlIHRoaXMgbWV0YWRhdGEgYmVmb3JlPyAqLworCXZnc3VtbWFyeS0+bWRhX2NoZWNrc3VtID0gcmxvY24tPmNoZWNrc3VtOworCXZnc3VtbWFyeS0+bWRhX3NpemUgPSBybG9jbi0+c2l6ZTsKKworCWlmIChsdm1jYWNoZV9sb29rdXBfbWRhKHZnc3VtbWFyeSkpCisJCXVzZWRfY2FjaGVkX21ldGFkYXRhID0gMTsKKworCS8qIEZJWE1FIDY0LWJpdCAqLworCWlmICghdGV4dF92Z3N1bW1hcnlfaW1wb3J0KGZtdCwgZGV2X2FyZWEtPmRldiwKKwkJCQkob2ZmX3QpIChkZXZfYXJlYS0+c3RhcnQgKyBybG9jbi0+b2Zmc2V0KSwKKwkJCQkodWludDMyX3QpIChybG9jbi0+c2l6ZSAtIHdyYXApLAorCQkJCShvZmZfdCkgKGRldl9hcmVhLT5zdGFydCArIE1EQV9IRUFERVJfU0laRSksCisJCQkJd3JhcCwgY2FsY19jcmMsIHZnc3VtbWFyeS0+dmduYW1lID8gMSA6IDAsCisJCQkJdmdzdW1tYXJ5KSkKKwkJcmV0dXJuXzA7CisKKwkvKiBJZ25vcmUgdGhpcyBlbnRyeSBpZiB0aGUgY2hhcmFjdGVycyBhcmVuJ3QgcGVybWlzc2libGUgKi8KKwlpZiAoIXZhbGlkYXRlX25hbWUodmdzdW1tYXJ5LT52Z25hbWUpKQorCQlyZXR1cm5fMDsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiJXM6ICVzIG1ldGFkYXRhIGF0ICUiIFBSSXU2NCAiIHNpemUgJSIgUFJJdTY0CisJCQkgICAiIChpbiBhcmVhIGF0ICUiIFBSSXU2NCAiIHNpemUgJSIgUFJJdTY0CisJCQkgICAiKSBmb3IgJXMgKCIgRk1UVkdJRCAiKSIsCisJCQkgICBkZXZfbmFtZShkZXZfYXJlYS0+ZGV2KSwKKwkJCSAgIHVzZWRfY2FjaGVkX21ldGFkYXRhID8gIlVzaW5nIGNhY2hlZCIgOiAiRm91bmQiLAorCQkJICAgZGV2X2FyZWEtPnN0YXJ0ICsgcmxvY24tPm9mZnNldCwKKwkJCSAgIHJsb2NuLT5zaXplLCBkZXZfYXJlYS0+c3RhcnQsIGRldl9hcmVhLT5zaXplLCB2Z3N1bW1hcnktPnZnbmFtZSwKKwkJCSAgIChjaGFyICopJnZnc3VtbWFyeS0+dmdpZCk7CisKKwlpZiAobWRhX2ZyZWVfc2VjdG9ycykgeworCQljdXJyZW50X3VzYWdlID0gKHJsb2NuLT5zaXplICsgU0VDVE9SX1NJWkUgLSBVSU5UNjRfQygxKSkgLQorCQkJCSAocmxvY24tPnNpemUgKyBTRUNUT1JfU0laRSAtIFVJTlQ2NF9DKDEpKSAlIFNFQ1RPUl9TSVpFOworCQlidWZmZXJfc2l6ZSA9IG1kYWgtPnNpemUgLSBNREFfSEVBREVSX1NJWkU7CisKKwkJaWYgKGN1cnJlbnRfdXNhZ2UgKiAyID49IGJ1ZmZlcl9zaXplKQorCQkJKm1kYV9mcmVlX3NlY3RvcnMgPSBVSU5UNjRfQygwKTsKKwkJZWxzZQorCQkJKm1kYV9mcmVlX3NlY3RvcnMgPSAoKGJ1ZmZlcl9zaXplIC0gMiAqIGN1cnJlbnRfdXNhZ2UpIC8gMikgPj4gU0VDVE9SX1NISUZUOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zY2FuX3Jhdyhjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgY29uc3QgY2hhciAqdmduYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCByYXdfbGlzdCAqcmw7CisJc3RydWN0IGRtX2xpc3QgKnJhd19saXN0OworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgZmlkOworCXN0cnVjdCBsdm1jYWNoZV92Z3N1bW1hcnkgdmdzdW1tYXJ5ID0geyAwIH07CisJc3RydWN0IG1kYV9oZWFkZXIgKm1kYWg7CisKKwlyYXdfbGlzdCA9ICYoKHN0cnVjdCBtZGFfbGlzdHMgKikgZm10LT5wcml2YXRlKS0+cmF3czsKKworCWZpZC5mbXQgPSBmbXQ7CisJZG1fbGlzdF9pbml0KCZmaWQubWV0YWRhdGFfYXJlYXNfaW5fdXNlKTsKKwlkbV9saXN0X2luaXQoJmZpZC5tZXRhZGF0YV9hcmVhc19pZ25vcmVkKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhybCwgcmF3X2xpc3QpIHsKKwkJLyogRklYTUUgV2UncmUgcmVhZGluZyBtZGFoIHR3aWNlIGhlcmUuLi4gKi8KKwkJaWYgKCFkZXZfb3Blbl9yZWFkb25seShybC0+ZGV2X2FyZWEuZGV2KSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKG1kYWggPSByYXdfcmVhZF9tZGFfaGVhZGVyKGZtdCwgJnJsLT5kZXZfYXJlYSkpKSB7CisJCQlzdGFjazsKKwkJCWdvdG8gY2xvc2VfZGV2OworCQl9CisKKwkJLyogVE9ETzogY2FjaGluZyBhcyBpbiB2Z25hbWVfZnJvbV9tZGEoKSAodHJpZ2dlciB0aGlzIGNvZGU/KSAqLworCQlpZiAodmduYW1lX2Zyb21fbWRhKGZtdCwgbWRhaCwgJnJsLT5kZXZfYXJlYSwgJnZnc3VtbWFyeSwgTlVMTCkpIHsKKwkJCXZnID0gX3ZnX3JlYWRfcmF3X2FyZWEoJmZpZCwgdmdzdW1tYXJ5LnZnbmFtZSwgJnJsLT5kZXZfYXJlYSwgTlVMTCwgTlVMTCwgMCwgMCk7CisJCQlpZiAodmcpCisJCQkJbHZtY2FjaGVfdXBkYXRlX3ZnKHZnLCAwKTsKKwkJfQorCWNsb3NlX2RldjoKKwkJaWYgKCFkZXZfY2xvc2UocmwtPmRldl9hcmVhLmRldikpCisJCQlzdGFjazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGV4dF9zY2FuKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBjb25zdCBjaGFyICp2Z25hbWUpCit7CisJcmV0dXJuIChfc2Nhbl9maWxlKGZtdCwgdmduYW1lKSAmIF9zY2FuX3JhdyhmbXQsIHZnbmFtZSkpOworfQorCitzdHJ1Y3QgX3dyaXRlX3NpbmdsZV9tZGFfYmF0b24geworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10OworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworfTsKKworc3RhdGljIGludCBfd3JpdGVfc2luZ2xlX21kYShzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX3dyaXRlX3NpbmdsZV9tZGFfYmF0b24gKnAgPSBiYXRvbjsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWM7CisKKwljaGFyIGJ1ZltNREFfSEVBREVSX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSA9IHsgMCB9OworCXN0cnVjdCBtZGFfaGVhZGVyICptZGFoID0gKHN0cnVjdCBtZGFfaGVhZGVyICopIGJ1ZjsKKworCW1kYWMgPSBtZGEtPm1ldGFkYXRhX2xvY247CisJbWRhaC0+c2l6ZSA9IG1kYWMtPmFyZWEuc2l6ZTsKKwlybG9jbl9zZXRfaWdub3JlZChtZGFoLT5yYXdfbG9jbnMsIG1kYV9pc19pZ25vcmVkKG1kYSkpOworCisJaWYgKCFfcmF3X3dyaXRlX21kYV9oZWFkZXIocC0+Zm10LCBtZGFjLT5hcmVhLmRldiwKKwkJCQkgICBtZGFjLT5hcmVhLnN0YXJ0LCBtZGFoKSkgeworCQlpZiAoIWRldl9jbG9zZShwLT5wdi0+ZGV2KSkKKwkJCXN0YWNrOworCQlyZXR1cm5fMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9leHRfZmxhZ3Moc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKQoreworCXVpbnQzMl90IGV4dF9mbGFncyA9IGx2bWNhY2hlX2V4dF9mbGFncyhpbmZvKTsKKworCWlmIChpc19vcnBoYW4ocHYpKQorCQlleHRfZmxhZ3MgJj0gflBWX0VYVF9VU0VEOworCWVsc2UKKwkJZXh0X2ZsYWdzIHw9IFBWX0VYVF9VU0VEOworCisJbHZtY2FjaGVfc2V0X2V4dF92ZXJzaW9uKGluZm8sIFBWX0hFQURFUl9FWFRFTlNJT05fVlNOKTsKKwlsdm1jYWNoZV9zZXRfZXh0X2ZsYWdzKGluZm8sIGV4dF9mbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogT25seSBmb3Igb3JwaGFucyAtIEZJWE1FIFRoYXQncyBub3QgdHJ1ZSBhbnkgbW9yZSAqLworc3RhdGljIGludCBfdGV4dF9wdl93cml0ZShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkID0gcHYtPmZpZDsKKwljb25zdCBjaGFyICpwdmlkID0gKGNvbnN0IGNoYXIgKikgKCpwdi0+b2xkX2lkLnV1aWQgPyAmcHYtPm9sZF9pZCA6ICZwdi0+aWQpOworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisJc3RydWN0IF93cml0ZV9zaW5nbGVfbWRhX2JhdG9uIGJhdG9uOworCXVuc2lnbmVkIG1kYV9pbmRleDsKKworCS8qIEFkZCBhIG5ldyBjYWNoZSBlbnRyeSB3aXRoIFBWIGluZm8gb3IgdXBkYXRlIGV4aXN0aW5nIG9uZS4gKi8KKwlpZiAoIShpbmZvID0gbHZtY2FjaGVfYWRkKGZtdC0+bGFiZWxsZXIsIChjb25zdCBjaGFyICopICZwdi0+aWQsCisJCQkJICBwdi0+ZGV2LCBwdi0+dmdfbmFtZSwKKwkJCQkgIGlzX29ycGhhbl92Zyhwdi0+dmdfbmFtZSkgPyBwdi0+dmdfbmFtZSA6IHB2LT52ZyA/IChjb25zdCBjaGFyICopICZwdi0+dmctPmlkIDogTlVMTCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWxhYmVsID0gbHZtY2FjaGVfZ2V0X2xhYmVsKGluZm8pOworCWxhYmVsLT5zZWN0b3IgPSBwdi0+bGFiZWxfc2VjdG9yOworCWxhYmVsLT5kZXYgPSBwdi0+ZGV2OworCisJbHZtY2FjaGVfdXBkYXRlX3B2KGluZm8sIHB2LCBmbXQpOworCisJLyogRmx1c2ggYWxsIGNhY2hlZCBtZXRhZGF0YSBhcmVhcywgd2Ugd2lsbCByZWVudGVyIG5ldy9tb2RpZmllZCBvbmVzLiAqLworCWx2bWNhY2hlX2RlbF9tZGFzKGluZm8pOworCisJLyoKKwkgKiBBZGQgYWxsIG5ldyBvciBtb2RpZmllZCBtZXRhZGF0YSBhcmVhcyBmb3IgdGhpcyBQViBzdG9yZWQgaW4KKwkgKiBpdHMgZm9ybWF0IGluc3RhbmNlLiBJZiB0aGlzIFBWIGlzIG5vdCBwYXJ0IG9mIGEgVkcgeWV0LAorCSAqIHB2LT5maWQgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UgcHYtPnZnLT5maWQgd2lsbCBiZSB1c2VkLgorCSAqIFRoZSBmaWRfZ2V0X21kYV9pbmRleGVkIGZuIGNhbiBoYW5kbGUgdGhhdCB0cmFuc3BhcmVudGx5LAorCSAqIGp1c3QgcGFzcyB0aGUgcmlnaHQgZm9ybWF0X2luc3RhbmNlIGluLgorCSAqLworCWZvciAobWRhX2luZGV4ID0gMDsgbWRhX2luZGV4IDwgRk1UX1RFWFRfTUFYX01EQVNfUEVSX1BWOyBtZGFfaW5kZXgrKykgeworCQlpZiAoIShtZGEgPSBmaWRfZ2V0X21kYV9pbmRleGVkKGZpZCwgcHZpZCwgSURfTEVOLCBtZGFfaW5kZXgpKSkKKwkJCWNvbnRpbnVlOworCisJCW1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJDcmVhdGluZyBtZXRhZGF0YSBhcmVhIG9uICVzIGF0IHNlY3RvciAlIgorCQkJCSAgIFBSSXU2NCAiIHNpemUgJSIgUFJJdTY0ICIgc2VjdG9ycyIsCisJCQkJICAgZGV2X25hbWUobWRhYy0+YXJlYS5kZXYpLAorCQkJCSAgIG1kYWMtPmFyZWEuc3RhcnQgPj4gU0VDVE9SX1NISUZULAorCQkJCSAgIG1kYWMtPmFyZWEuc2l6ZSA+PiBTRUNUT1JfU0hJRlQpOworCisJCS8vIGlmIGZtdCBpcyBub3QgdGhlIHNhbWUgYXMgaW5mby0+Zm10IHdlIGFyZSBpbiB0cm91YmxlCisJCWlmICghbHZtY2FjaGVfYWRkX21kYShpbmZvLCBtZGFjLT5hcmVhLmRldiwKKwkJCQkgICAgICBtZGFjLT5hcmVhLnN0YXJ0LCBtZGFjLT5hcmVhLnNpemUsCisJCQkJICAgICAgbWRhX2lzX2lnbm9yZWQobWRhKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIWx2bWNhY2hlX3VwZGF0ZV9iYXMoaW5mbywgcHYpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogRklYTUU6IEFsbG93IHdyaXRpbmcgemVybyBvZmZzZXQvc2l6ZSBkYXRhIGFyZWEgdG8gZGlzay4KKwkgKiAgICAgICAgVGhpcyByZXF1aXJlcyBkZWZpbmluZyBhIHNwZWNpYWwgdmFsdWUgc2luY2Ugd2UgY2FuJ3QKKwkgKiAgICAgICAgd3JpdGUgb2Zmc2V0L3NpemUgdGhhdCBpcyAwLzAgLSB0aGlzIGlzIGFscmVhZHkgcmVzZXJ2ZWQKKwkgKiAgICAgICAgYXMgYSBkZWxpbWl0ZXIgaW4gZGF0YS9tZXRhZGF0YSBhcmVhIGFyZWEgbGlzdCBpbiBQViBoZWFkZXIKKwkgKiAgICAgICAgKG5lZWRzIGV4cGxvcmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgbHZtMikuCisJICovCisKKwkvKgorCSAqIFdlIGNhbid0IGFjdHVhbGx5IHdyaXRlIHBlX3N0YXJ0ID0gMCAoYSBkYXRhIGFyZWEgb2Zmc2V0KQorCSAqIGluIFBWIGhlYWRlciBub3cuIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGlzIHZhbHVlIGhlcmUuIFRoaXMgY2FuCisJICogaGFwcGVuIHdpdGggdmdjZmdyZXN0b3JlIHdpdGggcmVkZWZpbmVkIHBlX3N0YXJ0IG9yCisJICogcHZjcmVhdGUgLS1yZXN0b3JlZmlsZS4gSG93ZXZlciwgd2UgY2FuIGNhbiBoYXZlIHRoaXMgdmFsdWUgaW4KKwkgKiBtZXRhZGF0YSB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiB0aGUgUFYgaGVhZGVyLgorCSAqLworCisJaWYgKCFsdm1jYWNoZV91cGRhdGVfZGFzKGluZm8sIHB2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRldl9vcGVuKHB2LT5kZXYpKQorCQlyZXR1cm5fMDsKKworCWJhdG9uLnB2ID0gcHY7CisJYmF0b24uZm10ID0gZm10OworCisJaWYgKCFsdm1jYWNoZV9mb3JlYWNoX21kYShpbmZvLCBfd3JpdGVfc2luZ2xlX21kYSwgJmJhdG9uKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9zZXRfZXh0X2ZsYWdzKHB2LCBpbmZvKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWxhYmVsX3dyaXRlKHB2LT5kZXYsIGxhYmVsKSkgeworCQlzdGFjazsKKwkJaWYgKCFkZXZfY2xvc2UocHYtPmRldikpCisJCQlzdGFjazsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGZvcm1hdCBpbnN0YW5jZSdzIG1ldGFkYXRhCisJICogICAgICAgIGFyZWFzIGZvciBsYWJlbF93cml0ZSBhbmQgb25seSBpZiBpdCdzIHN1Y2Nlc3NmdWwsCisJICogICAgICAgIHVwZGF0ZSB0aGUgY2FjaGUgYWZ0ZXJ3YXJkcz8KKwkgKi8KKworCWlmICghZGV2X2Nsb3NlKHB2LT5kZXYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90ZXh0X3B2X25lZWRzX3Jld3JpdGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgaW50ICpuZWVkc19yZXdyaXRlKQoreworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXVpbnQzMl90IGV4dF92c247CisKKwkqbmVlZHNfcmV3cml0ZSA9IDA7CisKKwlpZiAoIXB2LT5pc19sYWJlbGxlZCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoKGNvbnN0IGNoYXIgKikmcHYtPmlkLCBwdi0+ZGV2LCAwKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBjYWNoZWQgaW5mbyBmb3IgUFYgJXMuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXh0X3ZzbiA9IGx2bWNhY2hlX2V4dF92ZXJzaW9uKGluZm8pOworCisJaWYgKGV4dF92c24gPCBQVl9IRUFERVJfRVhURU5TSU9OX1ZTTikKKwkJKm5lZWRzX3Jld3JpdGUgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9yYXcoc3RydWN0IGRtX2xpc3QgKnJhd19saXN0LCBzdHJ1Y3QgZGV2aWNlX2FyZWEgKmRldl9hcmVhKQoreworCXN0cnVjdCByYXdfbGlzdCAqcmw7CisKKwkvKiBBbHJlYWR5IHByZXNlbnQ/ICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJsLCByYXdfbGlzdCkgeworCQkvKiBGSVhNRSBDaGVjayBzaXplL292ZXJsYXAgY29uc2lzdGVuY3kgdG9vICovCisJCWlmIChybC0+ZGV2X2FyZWEuZGV2ID09IGRldl9hcmVhLT5kZXYgJiYKKwkJICAgIHJsLT5kZXZfYXJlYS5zdGFydCA9PSBkZXZfYXJlYS0+c3RhcnQpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShybCA9IGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IHJhd19saXN0KSkpKSB7CisJCWxvZ19lcnJvcigiX2FkZF9yYXcgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweSgmcmwtPmRldl9hcmVhLCBkZXZfYXJlYSwgc2l6ZW9mKCpkZXZfYXJlYSkpOworCWRtX2xpc3RfYWRkKHJhd19saXN0LCAmcmwtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDb3B5IGNvbnN0cnVjdG9yIGZvciBhIG1ldGFkYXRhX2xvY24uCisgKi8KK3N0YXRpYyB2b2lkICpfbWV0YWRhdGFfbG9jbl9jb3B5X3JhdyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB2b2lkICptZXRhZGF0YV9sb2NuKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYywgKm1kYWNfbmV3OworCisJbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWV0YWRhdGFfbG9jbjsKKwlpZiAoIShtZGFjX25ldyA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKm1kYWNfbmV3KSkpKSB7CisJCWxvZ19lcnJvcigibWRhX2NvbnRleHQgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShtZGFjX25ldywgbWRhYywgc2l6ZW9mKCptZGFjKSk7CisKKwlyZXR1cm4gbWRhY19uZXc7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGFkYXRhIGxvY2F0aW9uLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqX21ldGFkYXRhX2xvY25fbmFtZV9yYXcodm9pZCAqbWV0YWRhdGFfbG9jbikKK3sKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1ldGFkYXRhX2xvY247CisKKwlyZXR1cm4gZGV2X25hbWUobWRhYy0+YXJlYS5kZXYpOworfQorCitzdGF0aWMgdWludDY0X3QgX21ldGFkYXRhX2xvY25fb2Zmc2V0X3Jhdyh2b2lkICptZXRhZGF0YV9sb2NuKQoreworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYyA9IChzdHJ1Y3QgbWRhX2NvbnRleHQgKikgbWV0YWRhdGFfbG9jbjsKKworCXJldHVybiBtZGFjLT5hcmVhLnN0YXJ0OworfQorCitzdGF0aWMgaW50IF90ZXh0X3B2X3JlYWQoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJCSAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IHNjYW5fbGFiZWxfb25seSkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoIShkZXYgPSBkZXZfY2FjaGVfZ2V0KHB2X25hbWUsIGZtdC0+Y21kLT5maWx0ZXIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGRldi0+cHZpZCwgZGV2LCAwKTsKKwkJaWYgKCFpbmZvICYmICFsdm1ldGFkX3B2X2xvb2t1cF9ieV9kZXYoZm10LT5jbWQsIGRldiwgTlVMTCkpCisJCQlyZXR1cm4gMDsKKwkJaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGRldi0+cHZpZCwgZGV2LCAwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCQlpZiAoIShsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCBVSU5UNjRfQygwKSkpKQorCQkJcmV0dXJuXzA7CisJCWluZm8gPSBsYWJlbC0+aW5mbzsKKwl9CisKKwlpZiAoIWluZm8pCisJCXJldHVybl8wOworCisJaWYgKCFsdm1jYWNoZV9wb3B1bGF0ZV9wdl9maWVsZHMoaW5mbywgcHYsIHNjYW5fbGFiZWxfb25seSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfcHZfaW5pdGlhbGlzZShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCSAgICAgICBzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgKnB2YSwKKwkJCSAgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGFfYWxpZ25tZW50ID0gcHZhLT5kYXRhX2FsaWdubWVudDsKKwl1bnNpZ25lZCBsb25nIGRhdGFfYWxpZ25tZW50X29mZnNldCA9IHB2YS0+ZGF0YV9hbGlnbm1lbnRfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWRqdXN0bWVudCwgZmluYWxfYWxpZ25tZW50ID0gMDsKKworCWlmICghZGF0YV9hbGlnbm1lbnQpCisJCWRhdGFfYWxpZ25tZW50ID0gZmluZF9jb25maWdfdHJlZV9pbnQocHYtPmZtdC0+Y21kLCBkZXZpY2VzX2RhdGFfYWxpZ25tZW50X0NGRywgTlVMTCkgKiAyOworCisJaWYgKHNldF9wZV9hbGlnbihwdiwgZGF0YV9hbGlnbm1lbnQpICE9IGRhdGFfYWxpZ25tZW50ICYmCisJICAgIGRhdGFfYWxpZ25tZW50KSB7CisJCWxvZ19lcnJvcigiJXM6IGludmFsaWQgZGF0YSBhbGlnbm1lbnQgb2YgIgorCQkJICAiJWx1IHNlY3RvcnMgKHJlcXVlc3RlZCAlbHUgc2VjdG9ycykiLAorCQkJICBwdl9kZXZfbmFtZShwdiksIHB2LT5wZV9hbGlnbiwgZGF0YV9hbGlnbm1lbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2V0X3BlX2FsaWduX29mZnNldChwdiwgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0KSAhPSBkYXRhX2FsaWdubWVudF9vZmZzZXQgJiYKKwkgICAgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0KSB7CisJCWxvZ19lcnJvcigiJXM6IGludmFsaWQgZGF0YSBhbGlnbm1lbnQgb2Zmc2V0IG9mICIKKwkJCSAgIiVsdSBzZWN0b3JzIChyZXF1ZXN0ZWQgJWx1IHNlY3RvcnMpIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpLCBwdi0+cGVfYWxpZ25fb2Zmc2V0LCBkYXRhX2FsaWdubWVudF9vZmZzZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHYtPnBlX2FsaWduIDwgcHYtPnBlX2FsaWduX29mZnNldCkgeworCQlsb2dfZXJyb3IoIiVzOiBwZV9hbGlnbiAoJWx1IHNlY3RvcnMpIG11c3Qgbm90IGJlIGxlc3MgIgorCQkJICAidGhhbiBwZV9hbGlnbl9vZmZzZXQgKCVsdSBzZWN0b3JzKSIsCisJCQkgIHB2X2Rldl9uYW1lKHB2KSwgcHYtPnBlX2FsaWduLCBwdi0+cGVfYWxpZ25fb2Zmc2V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZmluYWxfYWxpZ25tZW50ID0gcHYtPnBlX2FsaWduICsgcHYtPnBlX2FsaWduX29mZnNldDsKKworCWlmIChwdi0+c2l6ZSA8IGZpbmFsX2FsaWdubWVudCkgeworCQlsb2dfZXJyb3IoIiVzOiBEYXRhIGFsaWdubWVudCBtdXN0IG5vdCBleGNlZWQgZGV2aWNlIHNpemUuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHB2LT5zaXplIDwgZmluYWxfYWxpZ25tZW50ICsgcHZhLT5iYV9zaXplKSB7CisJCWxvZ19lcnJvcigiJXM6IEJvb3Rsb2FkZXIgYXJlYSB3aXRoIGRhdGEtYWxpZ25lZCBzdGFydCBtdXN0ICIKKwkJCSAgIm5vdCBleGNlZWQgZGV2aWNlIHNpemUuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHB2YS0+cGVfc3RhcnQgPT0gUFZfUEVfU1RBUlRfQ0FMQykgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgbmV3IFBFIHN0YXJ0IGFuZCBib290bG9hZGVyIGFyZWEgc3RhcnQgdmFsdWUuCisJCSAqIE1ha2Ugc3VyZSBib3RoIGFyZSBwcm9wZXJseSBhbGlnbmVkIQorCQkgKiBJZiBQRSBzdGFydCBjYW4ndCBiZSBhbGlnbmVkIGJlY2F1c2UgQkEgaXMgdGFraW5nCisJCSAqIHRoZSB3aG9sZSBzcGFjZSwgbWFrZSBQRSBzdGFydCBlcXVhbCB0byB0aGUgUFYgc2l6ZQorCQkgKiB3aGljaCBlZmZlY3RpdmVseSBkaXNhYmxlcyBEQSAtIGl0IHdpbGwgaGF2ZSB6ZXJvIHNpemUuCisJCSAqIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyB3ZSBjYW4ndCBoYXZlIGEgUFYgd2l0aG91dCBhbnkgREEuCisJCSAqIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnQgYSBQViB3aXRoIEJBIG9ubHkhCisJCSAqLworCQlpZiAocHZhLT5iYV9zaXplKSB7CisJCQlwdi0+YmFfc3RhcnQgPSBmaW5hbF9hbGlnbm1lbnQ7CisJCQlwdi0+YmFfc2l6ZSA9IHB2YS0+YmFfc2l6ZTsKKwkJCWlmICgoYWRqdXN0bWVudCA9IHB2YS0+YmFfc2l6ZSAlIHB2LT5wZV9hbGlnbikpCisJCQkJcHYtPmJhX3NpemUgKz0gcHYtPnBlX2FsaWduIC0gYWRqdXN0bWVudDsKKwkJCWlmIChwdi0+c2l6ZSA8IHB2LT5iYV9zdGFydCArIHB2LT5iYV9zaXplKQorCQkJCXB2LT5iYV9zaXplID0gcHYtPnNpemUgLSBwdi0+YmFfc3RhcnQ7CisJCQlwdi0+cGVfc3RhcnQgPSBwdi0+YmFfc3RhcnQgKyBwdi0+YmFfc2l6ZTsKKwkJfSBlbHNlCisJCQlwdi0+cGVfc3RhcnQgPSBmaW5hbF9hbGlnbm1lbnQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVHJ5IHRvIGtlZXAgdGhlIHZhbHVlIG9mIFBFIHN0YXJ0IHNldCB0byBhIGZpcm0gdmFsdWUgaWYKKwkJICogcmVxdWVzdGVkLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHJlc3RvcmluZyBleGlzdGluZyBQRSBzdGFydAorCQkgKiB2YWx1ZSAoZS5nLiBiYWNrdXBzKS4gQWxzbywgaWYgY3JlYXRpbmcgYSBCQSwgdHJ5IHRvIHBsYWNlCisJCSAqIGl0IGluIGJldHdlZW4gdGhlIGZpbmFsIGFsaWdubWVudCBhbmQgZXhpc3RpbmcgUEUgc3RhcnQKKwkJICogaWYgcG9zc2libGUuCisJCSAqLworCQlwdi0+cGVfc3RhcnQgPSBwdmEtPnBlX3N0YXJ0OworCQlpZiAocHZhLT5iYV9zaXplKSB7CisJCQlpZiAoKHB2YS0+YmFfc3RhcnQgJiYgcHZhLT5iYV9zdGFydCArIHB2YS0+YmFfc2l6ZSA+IHB2YS0+cGVfc3RhcnQpIHx8CisJCQkgICAgKHB2YS0+cGVfc3RhcnQgPD0gZmluYWxfYWxpZ25tZW50KSB8fAorCQkJICAgIChwdmEtPnBlX3N0YXJ0IC0gZmluYWxfYWxpZ25tZW50IDwgcHZhLT5iYV9zaXplKSkgeworCQkJCWxvZ19lcnJvcigiJXM6IEJvb3Rsb2FkZXIgYXJlYSB3b3VsZCBvdmVybGFwICIKKwkJCQkJICAiZGF0YSBhcmVhLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCXB2LT5iYV9zdGFydCA9IHB2YS0+YmFfc3RhcnQgPyA6IGZpbmFsX2FsaWdubWVudDsKKwkJCQlwdi0+YmFfc2l6ZSA9IHB2YS0+YmFfc2l6ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChwdmEtPmV4dGVudF9zaXplKQorCQlwdi0+cGVfc2l6ZSA9IHB2YS0+ZXh0ZW50X3NpemU7CisKKwlpZiAocHZhLT5leHRlbnRfY291bnQpCisJCXB2LT5wZV9jb3VudCA9IHB2YS0+ZXh0ZW50X2NvdW50OworCisJaWYgKChwdi0+cGVfc3RhcnQgKyBwdi0+cGVfY291bnQgKiAodWludDY0X3QpcHYtPnBlX3NpemUgLSAxKSA+IHB2LT5zaXplKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgZXh0ZW50cyBlbmQgYmV5b25kIGVuZCBvZiBkZXZpY2UgJXMuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHB2YS0+bGFiZWxfc2VjdG9yICE9IC0xKQorICAgICAgICAgICAgICAgIHB2LT5sYWJlbF9zZWN0b3IgPSBwdmEtPmxhYmVsX3NlY3RvcjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfdGV4dF9kZXN0cm95X2luc3RhbmNlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCkKK3sKKwlpZiAoLS1maWQtPnJlZl9jb3VudCA8PSAxKSB7CisJCWlmIChmaWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4KQorCQkJZG1faGFzaF9kZXN0cm95KGZpZC0+bWV0YWRhdGFfYXJlYXNfaW5kZXgpOworCQlkbV9wb29sX2Rlc3Ryb3koZmlkLT5tZW0pOworCX0KK30KKworc3RhdGljIHZvaWQgX2ZyZWVfZGlycyhzdHJ1Y3QgZG1fbGlzdCAqZGlyX2xpc3QpCit7CisJc3RydWN0IGRtX2xpc3QgKmRsLCAqdG1wOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUoZGwsIHRtcCwgZGlyX2xpc3QpIHsKKwkJZG1fbGlzdF9kZWwoZGwpOworCQlkbV9mcmVlKGRsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9mcmVlX3Jhd3Moc3RydWN0IGRtX2xpc3QgKnJhd19saXN0KQoreworCXN0cnVjdCBkbV9saXN0ICpybCwgKnRtcDsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKHJsLCB0bXAsIHJhd19saXN0KSB7CisJCWRtX2xpc3RfZGVsKHJsKTsKKwkJZG1fZnJlZShybCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfdGV4dF9kZXN0cm95KHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10KQoreworCWlmIChmbXQtPm9ycGhhbl92ZykKKwkJZnJlZV9vcnBoYW5fdmcoZm10LT5vcnBoYW5fdmcpOworCisJaWYgKGZtdC0+cHJpdmF0ZSkgeworCQlfZnJlZV9kaXJzKCYoKHN0cnVjdCBtZGFfbGlzdHMgKikgZm10LT5wcml2YXRlKS0+ZGlycyk7CisJCV9mcmVlX3Jhd3MoJigoc3RydWN0IG1kYV9saXN0cyAqKSBmbXQtPnByaXZhdGUpLT5yYXdzKTsKKwkJZG1fZnJlZShmbXQtPnByaXZhdGUpOworCX0KKworCWRtX2ZyZWUoZm10KTsKK30KKworc3RhdGljIHN0cnVjdCBtZXRhZGF0YV9hcmVhX29wcyBfbWV0YWRhdGFfdGV4dF9maWxlX29wcyA9IHsKKwkudmdfcmVhZCA9IF92Z19yZWFkX2ZpbGUsCisJLnZnX3JlYWRfcHJlY29tbWl0ID0gX3ZnX3JlYWRfcHJlY29tbWl0X2ZpbGUsCisJLnZnX3dyaXRlID0gX3ZnX3dyaXRlX2ZpbGUsCisJLnZnX3JlbW92ZSA9IF92Z19yZW1vdmVfZmlsZSwKKwkudmdfY29tbWl0ID0gX3ZnX2NvbW1pdF9maWxlCit9OworCitzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2FyZWFfb3BzIF9tZXRhZGF0YV90ZXh0X2ZpbGVfYmFja3VwX29wcyA9IHsKKwkudmdfcmVhZCA9IF92Z19yZWFkX2ZpbGUsCisJLnZnX3dyaXRlID0gX3ZnX3dyaXRlX2ZpbGUsCisJLnZnX3JlbW92ZSA9IF92Z19yZW1vdmVfZmlsZSwKKwkudmdfY29tbWl0ID0gX3ZnX2NvbW1pdF9maWxlX2JhY2t1cAorfTsKKworc3RhdGljIGludCBfbWRhX2V4cG9ydF90ZXh0X3JhdyhzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLAorCQkJCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50KTsKK3N0YXRpYyBpbnQgX21kYV9pbXBvcnRfdGV4dF9yYXcoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24pOworCitzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2FyZWFfb3BzIF9tZXRhZGF0YV90ZXh0X3Jhd19vcHMgPSB7CisJLnZnX3JlYWQgPSBfdmdfcmVhZF9yYXcsCisJLnZnX3JlYWRfcHJlY29tbWl0ID0gX3ZnX3JlYWRfcHJlY29tbWl0X3JhdywKKwkudmdfd3JpdGUgPSBfdmdfd3JpdGVfcmF3LAorCS52Z19yZW1vdmUgPSBfdmdfcmVtb3ZlX3JhdywKKwkudmdfcHJlY29tbWl0ID0gX3ZnX3ByZWNvbW1pdF9yYXcsCisJLnZnX2NvbW1pdCA9IF92Z19jb21taXRfcmF3LAorCS52Z19yZXZlcnQgPSBfdmdfcmV2ZXJ0X3JhdywKKwkubWRhX21ldGFkYXRhX2xvY25fY29weSA9IF9tZXRhZGF0YV9sb2NuX2NvcHlfcmF3LAorCS5tZGFfbWV0YWRhdGFfbG9jbl9uYW1lID0gX21ldGFkYXRhX2xvY25fbmFtZV9yYXcsCisJLm1kYV9tZXRhZGF0YV9sb2NuX29mZnNldCA9IF9tZXRhZGF0YV9sb2NuX29mZnNldF9yYXcsCisJLm1kYV9mcmVlX3NlY3RvcnMgPSBfbWRhX2ZyZWVfc2VjdG9yc19yYXcsCisJLm1kYV90b3RhbF9zZWN0b3JzID0gX21kYV90b3RhbF9zZWN0b3JzX3JhdywKKwkubWRhX2luX3ZnID0gX21kYV9pbl92Z19yYXcsCisJLnB2X2FuYWx5emVfbWRhID0gX3B2X2FuYWx5emVfbWRhX3JhdywKKwkubWRhX2xvY25zX21hdGNoID0gX21kYV9sb2Nuc19tYXRjaF9yYXcsCisJLm1kYV9nZXRfZGV2aWNlID0gX21kYV9nZXRfZGV2aWNlX3JhdywKKwkubWRhX2V4cG9ydF90ZXh0ID0gX21kYV9leHBvcnRfdGV4dF9yYXcsCisJLm1kYV9pbXBvcnRfdGV4dCA9IF9tZGFfaW1wb3J0X3RleHRfcmF3Cit9OworCitzdGF0aWMgaW50IF9tZGFfZXhwb3J0X3RleHRfcmF3KHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsCisJCQkJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQpCit7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKwljaGFyIG1kYWhbTURBX0hFQURFUl9TSVpFXTsgLyogdGVtcG9yYXJ5ICovCisKKwlpZiAoIW1kYyB8fCAhX3Jhd19yZWFkX21kYV9oZWFkZXIoKHN0cnVjdCBtZGFfaGVhZGVyICopbWRhaCwgJm1kYy0+YXJlYSkpCisJCXJldHVybiAxOyAvKiBwcmV0ZW5kIHRoZSBNREEgZG9lcyBub3QgZXhpc3QgKi8KKworCXJldHVybiBjb25maWdfbWFrZV9ub2RlcyhjZnQsIHBhcmVudCwgTlVMTCwKKwkJCQkgImlnbm9yZSA9ICUiIFBSSWQ2NCwgKGludDY0X3QpIG1kYV9pc19pZ25vcmVkKG1kYSksCisJCQkJICJzdGFydCA9ICUiIFBSSWQ2NCwgKGludDY0X3QpIG1kYy0+YXJlYS5zdGFydCwKKwkJCQkgInNpemUgPSAlIiBQUklkNjQsIChpbnQ2NF90KSBtZGMtPmFyZWEuc2l6ZSwKKwkJCQkgImZyZWVfc2VjdG9ycyA9ICUiIFBSSWQ2NCwgKGludDY0X3QpIG1kYy0+ZnJlZV9zZWN0b3JzLAorCQkJCSBOVUxMKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IF9tZGFfaW1wb3J0X3RleHRfcmF3KHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3Qgc2l6ZTsKKwlpbnQgaWdub3JlOworCisJaWYgKCFjbi0+Y2hpbGQpCisJCXJldHVybiAwOworCisJY24gPSBjbi0+Y2hpbGQ7CisJZGV2aWNlID0gbHZtY2FjaGVfZGV2aWNlKGluZm8pOworCXNpemUgPSBkbV9jb25maWdfZmluZF9pbnQ2NChjbiwgInNpemUiLCAwKTsKKworCWlmICghZGV2aWNlIHx8ICFzaXplKQorCQlyZXR1cm4gMDsKKworCW9mZnNldCA9IGRtX2NvbmZpZ19maW5kX2ludDY0KGNuLCAic3RhcnQiLCAwKTsKKwlpZ25vcmUgPSBkbV9jb25maWdfZmluZF9pbnQoY24sICJpZ25vcmUiLCAwKTsKKworCWx2bWNhY2hlX2FkZF9tZGEoaW5mbywgZGV2aWNlLCBvZmZzZXQsIHNpemUsIGlnbm9yZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGV4dF9wdl9zZXR1cChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCSAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCA9IHB2LT5maWQ7CisJY29uc3QgY2hhciAqcHZpZCA9IChjb25zdCBjaGFyICopICgqcHYtPm9sZF9pZC51dWlkID8gJnB2LT5vbGRfaWQgOiAmcHYtPmlkKTsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBtZGFfaW5kZXg7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKnB2X21kYSwgKnB2X21kYV9jb3B5OworCXN0cnVjdCBtZGFfY29udGV4dCAqcHZfbWRhYzsKKwl1aW50NjRfdCBwZV9jb3VudDsKKwl1aW50NjRfdCBzaXplX3JlZHVjdGlvbiA9IDA7CisKKwkvKiBJZiBQViBoYXMgaXRzIG93biBmb3JtYXQgaW5zdGFuY2UsIGFkZCBtZGFzIGZyb20gcHYtPmZpZCB0byB2Zy0+ZmlkLiAqLworCWlmIChwdi0+ZmlkICE9IHZnLT5maWQpIHsKKwkJZm9yIChtZGFfaW5kZXggPSAwOyBtZGFfaW5kZXggPCBGTVRfVEVYVF9NQVhfTURBU19QRVJfUFY7IG1kYV9pbmRleCsrKSB7CisJCQlpZiAoIShwdl9tZGEgPSBmaWRfZ2V0X21kYV9pbmRleGVkKGZpZCwgcHZpZCwgSURfTEVOLCBtZGFfaW5kZXgpKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQmUgc3VyZSBpdCdzIG5vdCBhbHJlYWR5IGluIFZHJ3MgZm9ybWF0IGluc3RhbmNlISAqLworCQkJaWYgKCFmaWRfZ2V0X21kYV9pbmRleGVkKHZnLT5maWQsIHB2aWQsIElEX0xFTiwgbWRhX2luZGV4KSkgeworCQkJCWlmICghKHB2X21kYV9jb3B5ID0gbWRhX2NvcHkodmctPmZpZC0+bWVtLCBwdl9tZGEpKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJZmlkX2FkZF9tZGEodmctPmZpZCwgcHZfbWRhX2NvcHksIHB2aWQsIElEX0xFTiwgbWRhX2luZGV4KTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIE90aGVyd2lzZSwgaWYgdGhlIFBWIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBWRyAocHYtPmZpZCA9PSB2Zy0+ZmlkKSwKKwkgKiByZXJlYWQgUFYgbWRhIGluZm9ybWF0aW9uIGZyb20gdGhlIGNhY2hlIGFuZCBhZGQgaXQgdG8gdmctPmZpZC4KKwkgKi8KKwllbHNlIHsKKwkJaWYgKCFwdi0+ZGV2IHx8CisJCSAgICAhKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdi0+ZGV2LT5wdmlkLCBwdi0+ZGV2LCAwKSkpIHsKKwkJCWxvZ19lcnJvcigiUFYgJXMgbWlzc2luZyBmcm9tIGNhY2hlIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFsdm1jYWNoZV9jaGVja19mb3JtYXQoaW5mbywgZm10KSkKKwkJCXJldHVybl8wOworCisJCWlmICghbHZtY2FjaGVfZmlkX2FkZF9tZGFzX3B2KGluZm8sIGZpZCkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwkvKiBJZiB0aGVyZSdzIHRoZSAybmQgbWRhLCB3ZSBuZWVkIHRvIHJlZHVjZQorCSAqIHVzYWJsZSBzaXplIGZvciBmdXJ0aGVyIHBlX2NvdW50IGNhbGN1bGF0aW9uISAqLworCWlmICgocHZfbWRhID0gZmlkX2dldF9tZGFfaW5kZXhlZChmaWQsIHB2aWQsIElEX0xFTiwgMSkpICYmCisJICAgIChwdl9tZGFjID0gcHZfbWRhLT5tZXRhZGF0YV9sb2NuKSkKKwkJc2l6ZV9yZWR1Y3Rpb24gPSBwdl9tZGFjLT5hcmVhLnNpemUgPj4gU0VDVE9SX1NISUZUOworCisJLyogRnJvbSBub3cgb24sIFZHIGZvcm1hdCBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuICovCisJcHZfc2V0X2ZpZChwdiwgdmctPmZpZCk7CisKKwkvKiBGSVhNRSBDb3BlIHdpdGggZ2VudWluZSBwZV9jb3VudCAwICovCisKKwkvKiBJZiBtaXNzaW5nLCBlc3RpbWF0ZSBwdi0+c2l6ZSBmcm9tIGZpbGUtYmFzZWQgbWV0YWRhdGEgKi8KKwlpZiAoIXB2LT5zaXplICYmIHB2LT5wZV9jb3VudCkKKwkJcHYtPnNpemUgPSBwdi0+cGVfY291bnQgKiAodWludDY0X3QpIHZnLT5leHRlbnRfc2l6ZSArCisJCQkgICBwdi0+cGVfc3RhcnQgKyBzaXplX3JlZHVjdGlvbjsKKworCS8qIFJlY2FsY3VsYXRlIG51bWJlciBvZiBleHRlbnRzIHRoYXQgd2lsbCBmaXQgKi8KKwlpZiAoIXB2LT5wZV9jb3VudCAmJiB2Zy0+ZXh0ZW50X3NpemUpIHsKKwkJcGVfY291bnQgPSAocHYtPnNpemUgLSBwdi0+cGVfc3RhcnQgLSBzaXplX3JlZHVjdGlvbikgLworCQkJICAgdmctPmV4dGVudF9zaXplOworCQlpZiAocGVfY291bnQgPiBVSU5UMzJfTUFYKSB7CisJCQlsb2dfZXJyb3IoIlBWICVzIHRvbyBsYXJnZSBmb3IgZXh0ZW50IHNpemUgJXMuIiwKKwkJCQkgIHB2X2Rldl9uYW1lKHB2KSwKKwkJCQkgIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCAodWludDY0X3QpIHZnLT5leHRlbnRfc2l6ZSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHYtPnBlX2NvdW50ID0gKHVpbnQzMl90KSBwZV9jb3VudDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgKl9jcmVhdGVfdGV4dF9jb250ZXh0KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCB0ZXh0X2NvbnRleHQgKnRjKQoreworCXN0cnVjdCB0ZXh0X2NvbnRleHQgKm5ld190YzsKKwljb25zdCBjaGFyICpwYXRoOworCWNoYXIgKnRtcDsKKworCWlmICghdGMpCisJCXJldHVybiBOVUxMOworCisJcGF0aCA9IHRjLT5wYXRoX2xpdmU7CisKKwlpZiAoKHRtcCA9IHN0cnN0cihwYXRoLCAiLnRtcCIpKSAmJiAodG1wID09IHBhdGggKyBzdHJsZW4ocGF0aCkgLSA0KSkgeworCQlsb2dfZXJyb3IoIiVzOiBWb2x1bWUgZ3JvdXAgZmlsZW5hbWUgbWF5IG5vdCBlbmQgaW4gLnRtcCIsCisJCQkgIHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShuZXdfdGMgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKCpuZXdfdGMpKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEobmV3X3RjLT5wYXRoX2xpdmUgPSBkbV9wb29sX3N0cmR1cChtZW0sIHBhdGgpKSkKKwkJZ290b19iYWQ7CisKKwkvKiBJZiBwYXRoX2VkaXQgbm90IGRlZmluZWQsIGNyZWF0ZSBvbmUgZnJvbSBwYXRoX2xpdmUgd2l0aCAudG1wIHN1ZmZpeC4gKi8KKwlpZiAoIXRjLT5wYXRoX2VkaXQpIHsKKwkJaWYgKCEodG1wID0gZG1fcG9vbF9hbGxvYyhtZW0sIHN0cmxlbihwYXRoKSArIDUpKSkKKwkJCWdvdG9fYmFkOworCQlzcHJpbnRmKHRtcCwgIiVzLnRtcCIsIHBhdGgpOworCQluZXdfdGMtPnBhdGhfZWRpdCA9IHRtcDsKKwl9CisJZWxzZSBpZiAoIShuZXdfdGMtPnBhdGhfZWRpdCA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgdGMtPnBhdGhfZWRpdCkpKQorCQlnb3RvX2JhZDsKKworCWlmICghKG5ld190Yy0+ZGVzYyA9IHRjLT5kZXNjID8gZG1fcG9vbF9zdHJkdXAobWVtLCB0Yy0+ZGVzYykKKwkJCQkgICAgICA6IGRtX3Bvb2xfc3RyZHVwKG1lbSwgIiIpKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gKHZvaWQgKikgbmV3X3RjOworCisgICAgICBiYWQ6CisJZG1fcG9vbF9mcmVlKG1lbSwgbmV3X3RjKTsKKworCWxvZ19lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgdGV4dCBmb3JtYXQgY29udGV4dCBvYmplY3QuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV92Z190ZXh0X2luc3RhbmNlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4ICpmaWMpCit7CisJc3RhdGljIGNoYXIgcGF0aFtQQVRIX01BWF07CisJdWludDMyX3QgdHlwZSA9IGZpYy0+dHlwZTsKKwlzdHJ1Y3QgdGV4dF9maWRfY29udGV4dCAqZmlkdGM7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWM7CisJc3RydWN0IGRpcl9saXN0ICpkbDsKKwlzdHJ1Y3QgcmF3X2xpc3QgKnJsOworCXN0cnVjdCBkbV9saXN0ICpkaXJfbGlzdCwgKnJhd19saXN0OworCXN0cnVjdCB0ZXh0X2NvbnRleHQgdGM7CisJc3RydWN0IGx2bWNhY2hlX3ZnaW5mbyAqdmdpbmZvOworCWNvbnN0IGNoYXIgKnZnX25hbWUsICp2Z19pZDsKKworCWlmICghKGZpZHRjID0gKHN0cnVjdCB0ZXh0X2ZpZF9jb250ZXh0ICopCisJCQlkbV9wb29sX3phbGxvYyhmaWQtPm1lbSwgc2l6ZW9mKCpmaWR0YykpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIHRleHRfZmlkX2NvbnRleHQuIik7CisJCXJldHVybiAwOworCX0KKworCWZpZC0+cHJpdmF0ZSA9ICh2b2lkICopIGZpZHRjOworCisJaWYgKHR5cGUgJiBGTVRfSU5TVEFOQ0VfUFJJVkFURV9NREFTKSB7CisJCWlmICghKG1kYSA9IGRtX3Bvb2xfemFsbG9jKGZpZC0+bWVtLCBzaXplb2YoKm1kYSkpKSkKKwkJCXJldHVybl8wOworCQltZGEtPm9wcyA9ICZfbWV0YWRhdGFfdGV4dF9maWxlX2JhY2t1cF9vcHM7CisJCW1kYS0+bWV0YWRhdGFfbG9jbiA9IF9jcmVhdGVfdGV4dF9jb250ZXh0KGZpZC0+bWVtLCBmaWMtPmNvbnRleHQucHJpdmF0ZSk7CisJCW1kYS0+c3RhdHVzID0gMDsKKwkJZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCA9IE5VTEw7CisJCWZpZF9hZGRfbWRhKGZpZCwgbWRhLCBOVUxMLCAwLCAwKTsKKwl9IGVsc2UgeworCQl2Z19uYW1lID0gZmljLT5jb250ZXh0LnZnX3JlZi52Z19uYW1lOworCQl2Z19pZCA9IGZpYy0+Y29udGV4dC52Z19yZWYudmdfaWQ7CisKKwkJaWYgKCEoZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBtZXRhZGF0YSBpbmRleCBmb3IgZm9ybWF0ICIKKwkJCQkgICJpbnN0YW5jZSBvZiBWRyAlcy4iLCB2Z19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHR5cGUgJiBGTVRfSU5TVEFOQ0VfQVVYX01EQVMpIHsKKwkJCWRpcl9saXN0ID0gJigoc3RydWN0IG1kYV9saXN0cyAqKSBmaWQtPmZtdC0+cHJpdmF0ZSktPmRpcnM7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIGRpcl9saXN0KSB7CisJCQkJaWYgKGRtX3NucHJpbnRmKHBhdGgsIFBBVEhfTUFYLCAiJXMvJXMiLCBkbC0+ZGlyLCB2Z19uYW1lKSA8IDApIHsKKwkJCQkJbG9nX2Vycm9yKCJOYW1lIHRvbyBsb25nICVzLyVzIiwgZGwtPmRpciwgdmdfbmFtZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWlmICghKG1kYSA9IGRtX3Bvb2xfemFsbG9jKGZpZC0+bWVtLCBzaXplb2YoKm1kYSkpKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJbWRhLT5vcHMgPSAmX21ldGFkYXRhX3RleHRfZmlsZV9vcHM7CisJCQkJdGMucGF0aF9saXZlID0gcGF0aDsKKwkJCQl0Yy5wYXRoX2VkaXQgPSB0Yy5kZXNjID0gTlVMTDsKKwkJCQltZGEtPm1ldGFkYXRhX2xvY24gPSBfY3JlYXRlX3RleHRfY29udGV4dChmaWQtPm1lbSwgJnRjKTsKKwkJCQltZGEtPnN0YXR1cyA9IDA7CisJCQkJZmlkX2FkZF9tZGEoZmlkLCBtZGEsIE5VTEwsIDAsIDApOworCQkJfQorCisJCQlyYXdfbGlzdCA9ICYoKHN0cnVjdCBtZGFfbGlzdHMgKikgZmlkLT5mbXQtPnByaXZhdGUpLT5yYXdzOworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJsLCByYXdfbGlzdCkgeworCQkJCS8qIEZJWE1FIENhY2hlIHRoaXM7IHJlc2NhbiBiZWxvdyBpZiBzb21lIG1pc3NpbmcgKi8KKwkJCQlpZiAoIV9yYXdfaG9sZHNfdmduYW1lKGZpZCwgJnJsLT5kZXZfYXJlYSwgdmdfbmFtZSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKCEobWRhID0gZG1fcG9vbF96YWxsb2MoZmlkLT5tZW0sIHNpemVvZigqbWRhKSkpKQorCQkJCQlyZXR1cm5fMDsKKworCQkJCWlmICghKG1kYWMgPSBkbV9wb29sX3phbGxvYyhmaWQtPm1lbSwgc2l6ZW9mKCptZGFjKSkpKQorCQkJCQlyZXR1cm5fMDsKKwkJCQltZGEtPm1ldGFkYXRhX2xvY24gPSBtZGFjOworCQkJCS8qIEZJWE1FIEFsbG93IG11bHRpcGxlIGRldl9hcmVhcyBpbnNpZGUgYXJlYSAqLworCQkJCW1lbWNweSgmbWRhYy0+YXJlYSwgJnJsLT5kZXZfYXJlYSwgc2l6ZW9mKG1kYWMtPmFyZWEpKTsKKwkJCQltZGEtPm9wcyA9ICZfbWV0YWRhdGFfdGV4dF9yYXdfb3BzOworCQkJCW1kYS0+c3RhdHVzID0gMDsKKwkJCQkvKiBGSVhNRSBNSVNUQUtFPyBtZGEtPm1ldGFkYXRhX2xvY24gPSBjb250ZXh0OyAqLworCQkJCWZpZF9hZGRfbWRhKGZpZCwgbWRhLCBOVUxMLCAwLCAwKTsKKwkJCX0KKwkJfQorCisJCWlmICh0eXBlICYgRk1UX0lOU1RBTkNFX01EQVMpIHsKKwkJCS8qCisJCQkgKiBUT0RPIGluIHRoZW9yeSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgbmV2ZXIgcmVhY2hlZAorCQkJICogd2hpbGUgaW4gY3JpdGljYWxfc2VjdGlvbigpLCBiZWNhdXNlIGx2bWNhY2hlJ3MKKwkJCSAqIGNhY2hlZF92ZyBzaG91bGQgYmUgdmFsaWQuIEhvd2V2ZXIsIHRoaXMgYXNzdW1wdGlvbgorCQkJICogc29tZXRpbWVzIGZhaWxzIChwb3NzaWJseSBkdWUgdG8gaW5jb25zaXN0ZW50CisJCQkgKiAocHJlY29tbWl0KSBtZXRhZGF0YSBhbmQvb3IgbWlzc2luZyBkZXZpY2VzKSwgYW5kCisJCQkgKiBjYWxsaW5nIGx2bWNhY2hlX2xhYmVsX3NjYW4gaW5zaWRlIHRoZSBjcml0aWNhbAorCQkJICogc2VjdGlvbiBtYXkgYmUgZmF0YWwgKGkuZS4gZGVhZGxvY2spLgorCQkJICovCisJCQlpZiAoIWNyaXRpY2FsX3NlY3Rpb24oKSkKKwkJCQkvKiBTY2FuIFBWcyBpbiBWRyBmb3IgYW55IGZ1cnRoZXIgTURBcyAqLworCQkJCWx2bWNhY2hlX2xhYmVsX3NjYW4oZmlkLT5mbXQtPmNtZCk7CisKKwkJCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZSh2Z19uYW1lLCB2Z19pZCkpKQorCQkJCWdvdG9fb3V0OworCQkJaWYgKCFsdm1jYWNoZV9maWRfYWRkX21kYXNfdmcodmdpbmZvLCBmaWQpKQorCQkJCWdvdG9fb3V0OworCQl9CisKKwkJLyogRklYTUUgQ2hlY2sgcmF3IG1ldGFkYXRhIGFyZWEgY291bnQgLSByZXNjYW4gaWYgcmVxdWlyZWQgKi8KKwl9CisKK291dDoKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX21ldGFkYXRhX2FyZWFfdG9fcHYoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkJICAgIHVuc2lnbmVkIG1kYV9pbmRleCwKKwkJCQkgICAgdWludDY0X3QgbWRhX3N0YXJ0LAorCQkJCSAgICB1aW50NjRfdCBtZGFfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgbWRhX2lnbm9yZWQpCit7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWM7CisJc3RydWN0IG1kYV9saXN0cyAqbWRhX2xpc3RzID0gKHN0cnVjdCBtZGFfbGlzdHMgKikgcHYtPmZtdC0+cHJpdmF0ZTsKKworCWlmIChtZGFfaW5kZXggPj0gRk1UX1RFWFRfTUFYX01EQVNfUEVSX1BWKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY2FuJ3QgYWRkIG1ldGFkYXRhIGFyZWEgd2l0aCAiCisJCQkJCSAiaW5kZXggJXUgdG8gUFYgJXMuIE1ldGFkYXRhICIKKwkJCQkJICJsYXlvdXQgbm90IHN1cHBvcnRlZCBieSAlcyBmb3JtYXQuIiwKKwkJCQkJICBtZGFfaW5kZXgsIGRldl9uYW1lKHB2LT5kZXYpLAorCQkJCQkgIHB2LT5mbXQtPm5hbWUpOworCX0KKworCWlmICghKG1kYSA9IGRtX3Bvb2xfemFsbG9jKHB2LT5maWQtPm1lbSwgc2l6ZW9mKHN0cnVjdCBtZXRhZGF0YV9hcmVhKSkpKSB7CisJCWxvZ19lcnJvcigic3RydWN0IG1ldGFkYXRhX2FyZWEgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobWRhYyA9IGRtX3Bvb2xfemFsbG9jKHB2LT5maWQtPm1lbSwgc2l6ZW9mKHN0cnVjdCBtZGFfY29udGV4dCkpKSkgeworCQlsb2dfZXJyb3IoInN0cnVjdCBtZGFfY29udGV4dCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlkbV9mcmVlKG1kYSk7CisJCXJldHVybiAwOworCX0KKworCW1kYS0+b3BzID0gbWRhX2xpc3RzLT5yYXdfb3BzOworCW1kYS0+bWV0YWRhdGFfbG9jbiA9IG1kYWM7CisJbWRhLT5zdGF0dXMgPSAwOworCisJbWRhYy0+YXJlYS5kZXYgPSBwdi0+ZGV2OworCW1kYWMtPmFyZWEuc3RhcnQgPSBtZGFfc3RhcnQ7CisJbWRhYy0+YXJlYS5zaXplID0gbWRhX3NpemU7CisJbWRhYy0+ZnJlZV9zZWN0b3JzID0gVUlOVDY0X0MoMCk7CisJbWVtc2V0KCZtZGFjLT5ybG9jbiwgMCwgc2l6ZW9mKG1kYWMtPnJsb2NuKSk7CisJbWRhX3NldF9pZ25vcmVkKG1kYSwgbWRhX2lnbm9yZWQpOworCisJZmlkX2FkZF9tZGEocHYtPmZpZCwgbWRhLCAoY2hhciAqKSAmcHYtPmlkLCBJRF9MRU4sIG1kYV9pbmRleCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGV4dF9wdl9yZW1vdmVfbWV0YWRhdGFfYXJlYShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCQkgdW5zaWduZWQgbWRhX2luZGV4KTsKKworc3RhdGljIGludCBfdGV4dF9wdl9hZGRfbWV0YWRhdGFfYXJlYShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCQkgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkgICAgICBpbnQgcGVfc3RhcnRfbG9ja2VkLAorCQkJCSAgICAgIHVuc2lnbmVkIG1kYV9pbmRleCwKKwkJCQkgICAgICB1aW50NjRfdCBtZGFfc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBtZGFfaWdub3JlZCkKK3sKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQgPSBwdi0+ZmlkOworCWNvbnN0IGNoYXIgKnB2aWQgPSAoY29uc3QgY2hhciAqKSAoKnB2LT5vbGRfaWQudXVpZCA/ICZwdi0+b2xkX2lkIDogJnB2LT5pZCk7CisJdWludDY0X3QgYmFfc2l6ZSwgcGVfc3RhcnQsIHBlX2VuZDsKKwl1aW50NjRfdCBhbGlnbm1lbnQsIGFsaWdubWVudF9vZmZzZXQ7CisJdWludDY0X3QgZGlza19zaXplOworCXVpbnQ2NF90IG1kYV9zdGFydDsKKwl1aW50NjRfdCBhZGp1c3RtZW50LCBsaW1pdCwgdG1wX21kYV9zaXplOworCXVpbnQ2NF90IHdpcGVfc2l6ZSA9IDggPDwgU0VDVE9SX1NISUZUOworCXNpemVfdCBwYWdlX3NpemUgPSBsdm1fZ2V0cGFnZXNpemUoKTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYzsKKwljb25zdCBjaGFyICpsaW1pdF9uYW1lOworCWludCBsaW1pdF9hcHBsaWVkID0gMDsKKworCWlmIChtZGFfaW5kZXggPj0gRk1UX1RFWFRfTUFYX01EQVNfUEVSX1BWKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiaW52YWxpZCBpbmRleCBvZiB2YWx1ZSAldSB1c2VkICIKKwkJCSAgICAgICJ3aGlsZSB0cnlpbmcgdG8gYWRkIG1ldGFkYXRhIGFyZWEgb24gUFYgJXMuICIKKwkJCSAgICAgICJNZXRhZGF0YSBsYXlvdXQgbm90IHN1cHBvcnRlZCBieSAlcyBmb3JtYXQuIiwKKwkJCSAgICAgICBtZGFfaW5kZXgsIHB2X2Rldl9uYW1lKHB2KSwgZm10LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGVfc3RhcnQgPSBwdi0+cGVfc3RhcnQgPDwgU0VDVE9SX1NISUZUOworCWJhX3NpemUgPSBwdi0+YmFfc2l6ZSA8PCBTRUNUT1JfU0hJRlQ7CisJYWxpZ25tZW50ID0gcHYtPnBlX2FsaWduIDw8IFNFQ1RPUl9TSElGVDsKKwlhbGlnbm1lbnRfb2Zmc2V0ID0gcHYtPnBlX2FsaWduX29mZnNldCA8PCBTRUNUT1JfU0hJRlQ7CisJZGlza19zaXplID0gcHYtPnNpemUgPDwgU0VDVE9SX1NISUZUOworCW1kYV9zaXplID0gbWRhX3NpemUgPDwgU0VDVE9SX1NISUZUOworCisJaWYgKGZpZF9nZXRfbWRhX2luZGV4ZWQoZmlkLCBwdmlkLCBJRF9MRU4sIG1kYV9pbmRleCkpIHsKKwkJaWYgKCFfdGV4dF9wdl9yZW1vdmVfbWV0YWRhdGFfYXJlYShmbXQsIHB2LCBtZGFfaW5kZXgpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIm1ldGFkYXRhIGFyZWEgd2l0aCBpbmRleCAldSBhbHJlYWR5ICIKKwkJCQkgICJleGlzdHMgb24gUFYgJXMgYW5kIHJlbW92YWwgZmFpbGVkLiIsCisJCQkJICBtZGFfaW5kZXgsIHB2X2Rldl9uYW1lKHB2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEZpcnN0IG1ldGFkYXRhIGFyZWEgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkZXZpY2UuICovCisJaWYgKG1kYV9pbmRleCA9PSAwKSB7CisJCS8qCisJCSAqIFRyeSB0byBmaXQgTURBMCBlbmQgd2l0aGluIGdpdmVuIHBlX3N0YXJ0IGxpbWl0IGlmIGl0cyB2YWx1ZQorCQkgKiBpcyBsb2NrZWQuIElmIGl0J3Mgbm90IGxvY2tlZCwgY291bnQgd2l0aCBhbnkgZXhpc3RpbmcgTURBMS4KKwkJICogSWYgdGhlcmUncyBubyBNREExLCBqdXN0IHVzZSBkaXNrIHNpemUgYXMgdGhlIGxpbWl0LgorCQkgKi8KKwkJaWYgKHBlX3N0YXJ0X2xvY2tlZCkgeworCQkJbGltaXQgPSBwZV9zdGFydDsKKwkJCWxpbWl0X25hbWUgPSAicGVfc3RhcnQiOworCQl9CisJCWVsc2UgaWYgKChtZGEgPSBmaWRfZ2V0X21kYV9pbmRleGVkKGZpZCwgcHZpZCwgSURfTEVOLCAxKSkgJiYKKwkJCSAobWRhYyA9IG1kYS0+bWV0YWRhdGFfbG9jbikpIHsKKwkJCWxpbWl0ID0gbWRhYy0+YXJlYS5zdGFydDsKKwkJCWxpbWl0X25hbWUgPSAiTURBMSBzdGFydCI7CisJCX0KKwkJZWxzZSB7CisJCQlsaW1pdCA9IGRpc2tfc2l6ZTsKKwkJCWxpbWl0X25hbWUgPSAiZGlzayBzaXplIjsKKwkJfQorCisJCS8qIEFkanVzdCBsaW1pdHMgZm9yIGJvb3Rsb2FkZXIgYXJlYSBpZiBwcmVzZW50LiAqLworCQlpZiAoYmFfc2l6ZSkgeworCQkJbGltaXQgLT0gYmFfc2l6ZTsKKwkJCWxpbWl0X25hbWUgPSAiYmFfc3RhcnQiOworCQl9CisKKwkJaWYgKGxpbWl0ID4gZGlza19zaXplKQorCQkJZ290byBiYWQ7CisKKwkJbWRhX3N0YXJ0ID0gTEFCRUxfU0NBTl9TSVpFOworCisJCS8qIEFsaWduIE1EQTAgc3RhcnQgd2l0aCBwYWdlIHNpemUgaWYgcG9zc2libGUuICovCisJCWlmIChsaW1pdCAtIG1kYV9zdGFydCA+PSBNREFfU0laRV9NSU4pIHsKKwkJCWlmICgoYWRqdXN0bWVudCA9IG1kYV9zdGFydCAlIHBhZ2Vfc2l6ZSkpCisJCQkJbWRhX3N0YXJ0ICs9IChwYWdlX3NpemUgLSBhZGp1c3RtZW50KTsKKwkJfQorCisJCS8qIEFsaWduIE1EQTAgZW5kIHBvc2l0aW9uIHdpdGggZ2l2ZW4gYWxpZ25tZW50IGlmIHBvc3NpYmxlLiAqLworCQlpZiAoYWxpZ25tZW50ICYmCisJCSAgICAoYWRqdXN0bWVudCA9IChtZGFfc3RhcnQgKyBtZGFfc2l6ZSkgJSBhbGlnbm1lbnQpKSB7CisJCQl0bXBfbWRhX3NpemUgPSBtZGFfc2l6ZSArIGFsaWdubWVudCAtIGFkanVzdG1lbnQ7CisJCQlpZiAobWRhX3N0YXJ0ICsgdG1wX21kYV9zaXplIDw9IGxpbWl0KQorCQkJCW1kYV9zaXplID0gdG1wX21kYV9zaXplOworCQl9CisKKwkJLyogQWxpZ24gTURBMCBlbmQgcG9zaXRpb24gd2l0aCBnaXZlbiBhbGlnbm1lbnQgb2Zmc2V0IGlmIHBvc3NpYmxlLiAqLworCQlpZiAoYWxpZ25tZW50ICYmIGFsaWdubWVudF9vZmZzZXQgJiYKKwkJICAgICgoKG1kYV9zdGFydCArIG1kYV9zaXplKSAlIGFsaWdubWVudCkgPT0gMCkpIHsKKwkJCXRtcF9tZGFfc2l6ZSA9IG1kYV9zaXplICsgYWxpZ25tZW50X29mZnNldDsKKwkJCWlmIChtZGFfc3RhcnQgKyB0bXBfbWRhX3NpemUgPD0gbGltaXQpCisJCQkJbWRhX3NpemUgPSB0bXBfbWRhX3NpemU7CisJCX0KKworCQlpZiAobWRhX3N0YXJ0ICsgbWRhX3NpemUgPiBsaW1pdCkgeworCQkJLyoKKwkJCSAqIFRyeSB0byBkZWNyZWFzZSB0aGUgTURBMCBzaXplIHdpdGggdHdpY2UgdGhlCisJCQkgKiBhbGlnbm1lbnQgYW5kIHRoZW4gYWxpZ24gd2l0aCBnaXZlbiBhbGlnbm1lbnQuCisJCQkgKiBJZiBwZV9zdGFydCBpcyBsb2NrZWQsIHNraXAgdGhpcyB0eXBlIG9mCisJCQkgKiBhbGlnbm1lbnQgc2luY2UgaXQgd291bGQgYmUgdXNlbGVzcy4KKwkJCSAqIENoZWNrIGZpcnN0IHdoZXRoZXIgd2UgY2FuIGFwcGx5IHRoYXQhCisJCQkgKi8KKwkJCWlmICghcGVfc3RhcnRfbG9ja2VkICYmIGFsaWdubWVudCAmJgorCQkJICAgICgobGltaXQgLSBtZGFfc3RhcnQpID4gYWxpZ25tZW50ICogMikpIHsKKwkJCQltZGFfc2l6ZSA9IGxpbWl0IC0gbWRhX3N0YXJ0IC0gYWxpZ25tZW50ICogMjsKKworCQkJCWlmICgoYWRqdXN0bWVudCA9IChtZGFfc3RhcnQgKyBtZGFfc2l6ZSkgJSBhbGlnbm1lbnQpKQorCQkJCQltZGFfc2l6ZSArPSAoYWxpZ25tZW50IC0gYWRqdXN0bWVudCk7CisKKwkJCQkvKiBTdGlsbCB0b28gbXVjaD8gVGhlbiB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4gKi8KKwkJCQlpZiAobWRhX3N0YXJ0ICsgbWRhX3NpemUgPiBsaW1pdCkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQkvKiBPdGhlcndpc2UsIGdpdmUgdXAgYW5kIHRha2UgYW55IHVzYWJsZSBzcGFjZS4gKi8KKwkJCWVsc2UKKwkJCQltZGFfc2l6ZSA9IGxpbWl0IC0gbWRhX3N0YXJ0OworCisJCQlsaW1pdF9hcHBsaWVkID0gMTsKKwkJfQorCisJCS8qCisJCSAqIElmIFBWJ3MgcGVfc3RhcnQgaXMgbm90IGxvY2tlZCwgdXBkYXRlIHBlX3N0YXJ0IHZhbHVlIHdpdGggdGhlCisJCSAqIHN0YXJ0IG9mIHRoZSBhcmVhIHRoYXQgZm9sbG93cyB0aGUgTURBMCB3ZSd2ZSBqdXN0IGNhbGN1bGF0ZWQuCisJCSAqLworCQlpZiAoIXBlX3N0YXJ0X2xvY2tlZCkgeworCQkJaWYgKGJhX3NpemUpIHsKKwkJCQlwdi0+YmFfc3RhcnQgPSAobWRhX3N0YXJ0ICsgbWRhX3NpemUpID4+IFNFQ1RPUl9TSElGVDsKKwkJCQlwdi0+cGVfc3RhcnQgPSBwdi0+YmFfc3RhcnQgKyBwdi0+YmFfc2l6ZTsKKwkJCX0gZWxzZQorCQkJCXB2LT5wZV9zdGFydCA9IChtZGFfc3RhcnQgKyBtZGFfc2l6ZSkgPj4gU0VDVE9SX1NISUZUOworCQl9CisJfQorCS8qIFNlY29uZCBtZXRhZGF0YSBhcmVhIGF0IHRoZSBlbmQgb2YgdGhlIGRldmljZS4gKi8KKwllbHNlIHsKKwkJLyoKKwkJICogVHJ5IHRvIGZpdCBNREExIHN0YXJ0IHdpdGhpbiBnaXZlbiBwZV9lbmQgb3IgcGVfc3RhcnQgbGltaXQKKwkJICogaWYgZGVmaW5lZCBvciBsb2NrZWQuIElmIHBlX3N0YXJ0IGlzIG5vdCBkZWZpbmVkIHlldCwgY291bnQKKwkJICogd2l0aCBhbnkgZXhpc3RpbmcgTURBMC4gSWYgTURBMCBkb2VzIG5vdCBleGlzdCwganVzdCB1c2UKKwkJICogTEFCRUxfU0NBTl9TSVpFLgorCQkgKi8KKwkJcGVfZW5kID0gcHYtPnBlX2NvdW50ID8gKHB2LT5wZV9zdGFydCArCisJCQkJCSBwdi0+cGVfY291bnQgKiAodWludDY0X3QpcHYtPnBlX3NpemUgLSAxKSA8PCBTRUNUT1JfU0hJRlQKKwkJCQkgICAgICA6IDA7CisKKwkJaWYgKHBlX3N0YXJ0IHx8IHBlX3N0YXJ0X2xvY2tlZCkgeworCQkJbGltaXQgPSBwZV9lbmQgPyBwZV9lbmQgOiBwZV9zdGFydDsKKwkJCWxpbWl0X25hbWUgPSBwZV9lbmQgPyAicGVfZW5kIiA6ICJwZV9zdGFydCI7CisJCX0gZWxzZSB7CisJCQlpZiAoKG1kYSA9IGZpZF9nZXRfbWRhX2luZGV4ZWQoZmlkLCBwdmlkLCBJRF9MRU4sIDApKSAmJgorCQkJCSAobWRhYyA9IG1kYS0+bWV0YWRhdGFfbG9jbikpIHsKKwkJCQlsaW1pdCA9IG1kYWMtPmFyZWEuc3RhcnQgKyBtZGFjLT5hcmVhLnNpemU7CisJCQkJbGltaXRfbmFtZSA9ICJNREEwIGVuZCI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlsaW1pdCA9IExBQkVMX1NDQU5fU0laRTsKKwkJCQlsaW1pdF9uYW1lID0gImxhYmVsIHNjYW4gc2l6ZSI7CisJCQl9CisKKwkJCS8qIEFkanVzdCBsaW1pdHMgZm9yIGJvb3Rsb2FkZXIgYXJlYSBpZiBwcmVzZW50LiAqLworCQkJaWYgKGJhX3NpemUpIHsKKwkJCQlsaW1pdCArPSBiYV9zaXplOworCQkJCWxpbWl0X25hbWUgPSAiYmFfZW5kIjsKKwkJCX0KKwkJfQorCisJCWlmIChsaW1pdCA+IGRpc2tfc2l6ZSkKKwkJCWdvdG8gYmFkOworCisJCWlmIChtZGFfc2l6ZSA+IGRpc2tfc2l6ZSkgeworCQkJbWRhX3NpemUgPSBkaXNrX3NpemUgLSBsaW1pdDsKKwkJCWxpbWl0X2FwcGxpZWQgPSAxOworCQl9CisKKwkJbWRhX3N0YXJ0ID0gZGlza19zaXplIC0gbWRhX3NpemU7CisKKwkJLyogSWYgTURBMSBzaXplIGlzIHRvbyBiaWcsIGp1c3QgdGFrZSBhbnkgdXNhYmxlIHNwYWNlLiAqLworCQlpZiAoZGlza19zaXplIC0gbWRhX3NpemUgPCBsaW1pdCkgeworCQkJbWRhX3NpemUgPSBkaXNrX3NpemUgLSBsaW1pdDsKKwkJCW1kYV9zdGFydCA9IGRpc2tfc2l6ZSAtIG1kYV9zaXplOworCQkJbGltaXRfYXBwbGllZCA9IDE7CisJCX0KKwkJLyogT3RoZXJ3aXNlLCB0cnkgdG8gYWxpZ24gTURBMSBzdGFydCBpZiBwb3NzaWJsZS4gKi8KKwkJZWxzZSBpZiAoYWxpZ25tZW50ICYmCisJCSAgICAoYWRqdXN0bWVudCA9IG1kYV9zdGFydCAlIGFsaWdubWVudCkpIHsKKwkJCXRtcF9tZGFfc2l6ZSA9IG1kYV9zaXplICsgYWRqdXN0bWVudDsKKwkJCWlmICh0bXBfbWRhX3NpemUgPCBkaXNrX3NpemUgJiYKKwkJCSAgICBkaXNrX3NpemUgLSB0bXBfbWRhX3NpemUgPj0gbGltaXQpIHsKKwkJCQltZGFfc2l6ZSA9IHRtcF9tZGFfc2l6ZTsKKwkJCQltZGFfc3RhcnQgPSBkaXNrX3NpemUgLSBtZGFfc2l6ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIFBWJ3MgcGVfZW5kIG5vdCBzZXQgeWV0LCBzZXQgaXQgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICogYXJlYSB0aGF0IHByZWNlZGVzIHRoZSBNREExIHdlJ3ZlIGp1c3QgY2FsY3VsYXRlZC4KKwkJICogRklYTUU6IGRvIHdlIG5lZWQgdG8gc2V0IHRoaXM/IElzbid0IGl0IGFsd2F5cyBzZXQgYmVmb3JlPworCQkgKi8KKwkJLyppZiAoIXBlX2VuZCkgeworCQkJcGVfZW5kID0gbWRhX3N0YXJ0OworCQkJcHYtPnBlX2VuZCA9IHBlX2VuZCA+PiBTRUNUT1JfU0hJRlQ7CisJCX0qLworCX0KKworCWlmIChsaW1pdF9hcHBsaWVkKQorCQlsb2dfdmVyeV92ZXJib3NlKCJVc2luZyBsaW1pdGVkIG1ldGFkYXRhIGFyZWEgc2l6ZSBvbiAlcyAiCisJCQkJICJ3aXRoIHZhbHVlICUiIFBSSXU2NCAiIChsaW1pdGVkIGJ5ICVzIG9mICIKKwkJCQkgRk1UdTY0ICIpLiIsIHB2X2Rldl9uYW1lKHB2KSwKKwkJCQkgIG1kYV9zaXplLCBsaW1pdF9uYW1lLCBsaW1pdCk7CisKKwlpZiAobWRhX3NpemUpIHsKKwkJaWYgKG1kYV9zaXplIDwgTURBX1NJWkVfTUlOKSB7CisJCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGFyZWEgc2l6ZSB0b28gc21hbGw6ICUiIFBSSXU2NCIgYnl0ZXMuICIKKwkJCQkgICJJdCBtdXN0IGJlIGF0IGxlYXN0ICV1IGJ5dGVzLiIsIG1kYV9zaXplLCBNREFfU0laRV9NSU4pOworCQkJZ290byBiYWQ7CisJCX0KKworCQkvKiBXaXBlIG1ldGFkYXRhIGFyZWEgd2l0aCB6ZXJvZXMuICovCisJCWlmICghZGV2X3NldCgoc3RydWN0IGRldmljZSAqKSBwdi0+ZGV2LCBtZGFfc3RhcnQsCisJCQkoc2l6ZV90KSAoKG1kYV9zaXplID4gd2lwZV9zaXplKSA/CisJCQkJICB3aXBlX3NpemUgOiBtZGFfc2l6ZSksIDApKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd2lwZSBuZXcgbWV0YWRhdGEgYXJlYSAiCisJCQkJCSAgImF0IHRoZSAlcyBvZiB0aGUgJXMiLAorCQkJCQkgICBtZGFfaW5kZXggPyAiZW5kIiA6ICJzdGFydCIsCisJCQkJCSAgIHB2X2Rldl9uYW1lKHB2KSk7CisJCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBGaW5hbGx5LCBhZGQgbmV3IG1ldGFkYXRhIGFyZWEgdG8gUFYncyBmb3JtYXQgaW5zdGFuY2UuICovCisJCWlmICghX2FkZF9tZXRhZGF0YV9hcmVhX3RvX3B2KHB2LCBtZGFfaW5kZXgsIG1kYV9zdGFydCwKKwkJCQkJICAgICAgbWRhX3NpemUsIG1kYV9pZ25vcmVkKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworCitiYWQ6CisJbG9nX2Vycm9yKCJOb3QgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBmb3IgbWV0YWRhdGEgYXJlYSAiCisJCSAgIndpdGggaW5kZXggJXUgb24gUFYgJXMuIiwgbWRhX2luZGV4LCBwdl9kZXZfbmFtZShwdikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9yZW1vdmVfbWV0YWRhdGFfYXJlYV9mcm9tX3B2KHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCQkgdW5zaWduZWQgbWRhX2luZGV4KQoreworCWlmIChtZGFfaW5kZXggPj0gRk1UX1RFWFRfTUFYX01EQVNfUEVSX1BWKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiY2FuJ3QgcmVtb3ZlIG1ldGFkYXRhIGFyZWEgd2l0aCAiCisJCQkJCSAiaW5kZXggJXUgZnJvbSBQViAlcy4gTWV0YWRhdGEgIgorCQkJCQkgImxheW91IG5vdCBzdXBwb3J0ZWQgYnkgJXMgZm9ybWF0LiIsCisJCQkJCSAgbWRhX2luZGV4LCBkZXZfbmFtZShwdi0+ZGV2KSwKKwkJCQkJICBwdi0+Zm10LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGZpZF9yZW1vdmVfbWRhKHB2LT5maWQsIE5VTEwsIChjb25zdCBjaGFyICopICZwdi0+aWQsCisJCQkgICAgICBJRF9MRU4sIG1kYV9pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfcHZfcmVtb3ZlX21ldGFkYXRhX2FyZWEoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJCSBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkJIHVuc2lnbmVkIG1kYV9pbmRleCkKK3sKKwlyZXR1cm4gX3JlbW92ZV9tZXRhZGF0YV9hcmVhX2Zyb21fcHYocHYsIG1kYV9pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfcHZfcmVzaXplKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkID0gcHYtPmZpZDsKKwljb25zdCBjaGFyICpwdmlkID0gKGNvbnN0IGNoYXIgKikgKCpwdi0+b2xkX2lkLnV1aWQgPyAmcHYtPm9sZF9pZCA6ICZwdi0+aWQpOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjOworCXVpbnQ2NF90IHNpemVfcmVkdWN0aW9uOworCXVpbnQ2NF90IG1kYV9zaXplOworCXVuc2lnbmVkIG1kYV9pZ25vcmVkOworCisJLyoKKwkgKiBGaXJzdCwgc2V0IHRoZSBuZXcgc2l6ZSBhbmQgdXBkYXRlIHRoZSBjYWNoZSBhbmQgcmVzZXQgcGVfY291bnQuCisJICogKHBlX2NvdW50IG11c3QgYmUgcmVzZXQgb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGNvbnNpZGVyZWQgYXMKKwkgKiBhIGxpbWl0aW5nIGZhY3RvciB3aGlsZSBtb3ZpbmcgdGhlIG1kYSEpCisJICovCisJcHYtPnNpemUgPSBzaXplOworCXB2LT5wZV9jb3VudCA9IDA7CisKKwkvKiBJZiB0aGVyZSdzIGFuIG1kYSBhdCB0aGUgZW5kLCBtb3ZlIGl0IHRvIGEgbmV3IHBvc2l0aW9uLiAqLworCWlmICgobWRhID0gZmlkX2dldF9tZGFfaW5kZXhlZChmaWQsIHB2aWQsIElEX0xFTiwgMSkpICYmCisJICAgIChtZGFjID0gbWRhLT5tZXRhZGF0YV9sb2NuKSkgeworCQkvKiBGSVhNRTogTWF5YmUgTURBMCBzaXplIHdvdWxkIGJlIGJldHRlcj8gKi8KKwkJbWRhX3NpemUgPSBtZGFjLT5hcmVhLnNpemUgPj4gU0VDVE9SX1NISUZUOworCQltZGFfaWdub3JlZCA9IG1kYV9pc19pZ25vcmVkKG1kYSk7CisKKwkJaWYgKCFfdGV4dF9wdl9yZW1vdmVfbWV0YWRhdGFfYXJlYShmbXQsIHB2LCAxKSB8fAorCQkgICAgIV90ZXh0X3B2X2FkZF9tZXRhZGF0YV9hcmVhKGZtdCwgcHYsIDEsIDEsIG1kYV9zaXplLAorCQkJCQkJbWRhX2lnbm9yZWQpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBtb3ZlIG1ldGFkYXRhIGFyZWEgd2l0aCBpbmRleCAxICIKKwkJCQkgICJ3aGlsZSByZXNpemluZyBQViAlcy4iLCBwdl9kZXZfbmFtZShwdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB0aGVyZSdzIGEgVkcsIHJlZHVjZSBzaXplIGJ5IGNvdW50aW5nIGluIHBlX3N0YXJ0IGFuZCBtZXRhZGF0YSBhcmVhcy4gKi8KKwlpZiAodmcgJiYgIWlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpIHsKKwkJc2l6ZV9yZWR1Y3Rpb24gPSBwdl9wZV9zdGFydChwdik7CisJCWlmICgobWRhID0gZmlkX2dldF9tZGFfaW5kZXhlZChmaWQsIHB2aWQsIElEX0xFTiwgMSkpICYmCisJCSAgICAobWRhYyA9IG1kYS0+bWV0YWRhdGFfbG9jbikpCisJCQlzaXplX3JlZHVjdGlvbiArPSBtZGFjLT5hcmVhLnNpemUgPj4gU0VDVE9SX1NISUZUOworCQlwdi0+c2l6ZSAtPSBzaXplX3JlZHVjdGlvbjsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKl90ZXh0X2NyZWF0ZV90ZXh0X2luc3RhbmNlKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCQkJCSAgY29uc3Qgc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggKmZpYykKK3sKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQ7CisKKwlpZiAoIShmaWQgPSBhbGxvY19maWQoZm10LCBmaWMpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIV9jcmVhdGVfdmdfdGV4dF9pbnN0YW5jZShmaWQsIGZpYykpIHsKKwkJZG1fcG9vbF9kZXN0cm95KGZpZC0+bWVtKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJcmV0dXJuIGZpZDsKK30KKworc3RhdGljIHN0cnVjdCBmb3JtYXRfaGFuZGxlciBfdGV4dF9oYW5kbGVyID0geworCS5zY2FuID0gX3RleHRfc2NhbiwKKwkucHZfcmVhZCA9IF90ZXh0X3B2X3JlYWQsCisJLnB2X2luaXRpYWxpc2UgPSBfdGV4dF9wdl9pbml0aWFsaXNlLAorCS5wdl9zZXR1cCA9IF90ZXh0X3B2X3NldHVwLAorCS5wdl9hZGRfbWV0YWRhdGFfYXJlYSA9IF90ZXh0X3B2X2FkZF9tZXRhZGF0YV9hcmVhLAorCS5wdl9yZW1vdmVfbWV0YWRhdGFfYXJlYSA9IF90ZXh0X3B2X3JlbW92ZV9tZXRhZGF0YV9hcmVhLAorCS5wdl9yZXNpemUgPSBfdGV4dF9wdl9yZXNpemUsCisJLnB2X3dyaXRlID0gX3RleHRfcHZfd3JpdGUsCisJLnB2X25lZWRzX3Jld3JpdGUgPSBfdGV4dF9wdl9uZWVkc19yZXdyaXRlLAorCS52Z19zZXR1cCA9IF90ZXh0X3ZnX3NldHVwLAorCS5sdl9zZXR1cCA9IF90ZXh0X2x2X3NldHVwLAorCS5jcmVhdGVfaW5zdGFuY2UgPSBfdGV4dF9jcmVhdGVfdGV4dF9pbnN0YW5jZSwKKwkuZGVzdHJveV9pbnN0YW5jZSA9IF90ZXh0X2Rlc3Ryb3lfaW5zdGFuY2UsCisJLmRlc3Ryb3kgPSBfdGV4dF9kZXN0cm95Cit9OworCitzdGF0aWMgaW50IF9hZGRfZGlyKGNvbnN0IGNoYXIgKmRpciwgc3RydWN0IGRtX2xpc3QgKmRpcl9saXN0KQoreworCXN0cnVjdCBkaXJfbGlzdCAqZGw7CisKKwlpZiAoZG1fY3JlYXRlX2RpcihkaXIpKSB7CisJCWlmICghKGRsID0gZG1fbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG1fbGlzdCkgKyBzdHJsZW4oZGlyKSArIDEpKSkgeworCQkJbG9nX2Vycm9yKCJfYWRkX2RpciBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX3ZlcnlfdmVyYm9zZSgiQWRkaW5nIHRleHQgZm9ybWF0IG1ldGFkYXRhIGRpcjogJXMiLCBkaXIpOworCQlzdHJjcHkoZGwtPmRpciwgZGlyKTsKKwkJZG1fbGlzdF9hZGQoZGlyX2xpc3QsICZkbC0+bGlzdCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9nZXRfY29uZmlnX2Rpc2tfYXJlYShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgc3RydWN0IGRtX2xpc3QgKnJhd19saXN0KQoreworCXN0cnVjdCBkZXZpY2VfYXJlYSBkZXZfYXJlYTsKKwljb25zdCBjaGFyICppZF9zdHI7CisJc3RydWN0IGlkIGlkOworCisJaWYgKCEoY24gPSBjbi0+Y2hpbGQpKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgbWV0YWRhdGEgZGlza19hcmVhIHNlY3Rpb24gb2YgY29uZmlnIGZpbGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9jb25maWdfZ2V0X3VpbnQ2NChjbiwgInN0YXJ0X3NlY3RvciIsICZkZXZfYXJlYS5zdGFydCkpIHsKKwkJbG9nX2Vycm9yKCJNaXNzaW5nIHN0YXJ0X3NlY3RvciBpbiBtZXRhZGF0YSBkaXNrX2FyZWEgc2VjdGlvbiAiCisJCQkgICJvZiBjb25maWcgZmlsZSIpOworCQlyZXR1cm4gMDsKKwl9CisJZGV2X2FyZWEuc3RhcnQgPDw9IFNFQ1RPUl9TSElGVDsKKworCWlmICghZG1fY29uZmlnX2dldF91aW50NjQoY24sICJzaXplIiwgJmRldl9hcmVhLnNpemUpKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBzaXplIGluIG1ldGFkYXRhIGRpc2tfYXJlYSBzZWN0aW9uICIKKwkJCSAgIm9mIGNvbmZpZyBmaWxlIik7CisJCXJldHVybiAwOworCX0KKwlkZXZfYXJlYS5zaXplIDw8PSBTRUNUT1JfU0hJRlQ7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfc3RyKGNuLCAiaWQiLCAmaWRfc3RyKSkgeworCQlsb2dfZXJyb3IoIk1pc3NpbmcgdXVpZCBpbiBtZXRhZGF0YSBkaXNrX2FyZWEgc2VjdGlvbiAiCisJCQkgICJvZiBjb25maWcgZmlsZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlkX3JlYWRfZm9ybWF0KCZpZCwgaWRfc3RyKSkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgdXVpZCBpbiBtZXRhZGF0YSBkaXNrX2FyZWEgc2VjdGlvbiAiCisJCQkgICJvZiBjb25maWcgZmlsZTogJXMiLCBpZF9zdHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShkZXZfYXJlYS5kZXYgPSBsdm1jYWNoZV9kZXZpY2VfZnJvbV9wdmlkKGNtZCwgJmlkLCBOVUxMLCBOVUxMKSkpIHsKKwkJY2hhciBidWZmZXJbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmaWQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIGRldmljZS4iKTsKKwkJZWxzZQorCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIGRldmljZSB3aXRoIHV1aWQgJyVzJy4iLAorCQkJCSAgYnVmZmVyKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2FkZF9yYXcocmF3X2xpc3QsICZkZXZfYXJlYSk7Cit9CisKK3N0cnVjdCBmb3JtYXRfdHlwZSAqY3JlYXRlX3RleHRfZm9ybWF0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4IGZpYzsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQ7CisJc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwlzdHJ1Y3QgbWRhX2xpc3RzICptZGFfbGlzdHM7CisKKwlpZiAoIShmbXQgPSBkbV9tYWxsb2Moc2l6ZW9mKCpmbXQpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGV4dCBmb3JtYXQgdHlwZSBzdHJ1Y3R1cmUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZtdC0+Y21kID0gY21kOworCWZtdC0+b3BzID0gJl90ZXh0X2hhbmRsZXI7CisJZm10LT5uYW1lID0gRk1UX1RFWFRfTkFNRTsKKwlmbXQtPmFsaWFzID0gRk1UX1RFWFRfQUxJQVM7CisJZm10LT5vcnBoYW5fdmdfbmFtZSA9IE9SUEhBTl9WR19OQU1FKEZNVF9URVhUX05BTUUpOworCWZtdC0+ZmVhdHVyZXMgPSBGTVRfU0VHTUVOVFMgfCBGTVRfTURBUyB8IEZNVF9UQUdTIHwgRk1UX1BSRUNPTU1JVCB8CisJCQlGTVRfVU5MSU1JVEVEX1ZPTFMgfCBGTVRfUkVTSVpFX1BWIHwKKwkJCUZNVF9VTkxJTUlURURfU1RSSVBFU0laRSB8IEZNVF9CQVMgfCBGTVRfQ09ORklHX1BST0ZJTEUgfAorCQkJRk1UX05PTl9QT1dFUjJfRVhURU5UUyB8IEZNVF9QVl9GTEFHUzsKKworCWlmICghKG1kYV9saXN0cyA9IGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IG1kYV9saXN0cykpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkaXJfbGlzdCIpOworCQlkbV9mcmVlKGZtdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdCgmbWRhX2xpc3RzLT5kaXJzKTsKKwlkbV9saXN0X2luaXQoJm1kYV9saXN0cy0+cmF3cyk7CisJbWRhX2xpc3RzLT5maWxlX29wcyA9ICZfbWV0YWRhdGFfdGV4dF9maWxlX29wczsKKwltZGFfbGlzdHMtPnJhd19vcHMgPSAmX21ldGFkYXRhX3RleHRfcmF3X29wczsKKwlmbXQtPnByaXZhdGUgPSAodm9pZCAqKSBtZGFfbGlzdHM7CisKKwlkbV9saXN0X2luaXQoJmZtdC0+bWRhX29wcyk7CisJZG1fbGlzdF9hZGQoJmZtdC0+bWRhX29wcywgJl9tZXRhZGF0YV90ZXh0X3Jhd19vcHMubGlzdCk7CisKKwlpZiAoIShmbXQtPmxhYmVsbGVyID0gdGV4dF9sYWJlbGxlcl9jcmVhdGUoZm10KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGV4dCBsYWJlbCBoYW5kbGVyLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIShsYWJlbF9yZWdpc3Rlcl9oYW5kbGVyKGZtdC0+bGFiZWxsZXIpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlZ2lzdGVyIHRleHQgbGFiZWwgaGFuZGxlci4iKTsKKwkJZm10LT5sYWJlbGxlci0+b3BzLT5kZXN0cm95KGZtdC0+bGFiZWxsZXIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoKGNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIG1ldGFkYXRhX2RpcnNfQ0ZHLCBOVUxMKSkpIHsKKwkJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCQlsb2dfZXJyb3IoIkludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlOiAiCisJCQkJCSAgIm1ldGFkYXRhL2RpcnMiKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKworCQkJaWYgKCFfYWRkX2Rpcihjdi0+di5zdHIsICZtZGFfbGlzdHMtPmRpcnMpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkICVzIHRvIHRleHQgZm9ybWF0ICIKKwkJCQkJICAibWV0YWRhdGEgZGlyZWN0b3J5IGxpc3QgIiwgY3YtPnYuc3RyKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWNtZC0+aW5kZXBlbmRlbnRfbWV0YWRhdGFfYXJlYXMgPSAxOworCQl9CisJfQorCisJaWYgKChjbiA9IGZpbmRfY29uZmlnX3RyZWVfbm9kZShjbWQsIG1ldGFkYXRhX2Rpc2tfYXJlYXNfQ0ZHX1NVQlNFQ1RJT04sIE5VTEwpKSkgeworCQkvKiBGSVhNRTogZGlza19hcmVhcyBkbyBub3Qgd29yayB3aXRoIGx2bWV0YWQgLSB0aGUgImlkIiBjYW4ndCBiZSBmb3VuZC4gKi8KKwkJZm9yIChjbiA9IGNuLT5jaGlsZDsgY247IGNuID0gY24tPnNpYikgeworCQkJaWYgKCFfZ2V0X2NvbmZpZ19kaXNrX2FyZWEoY21kLCBjbiwgJm1kYV9saXN0cy0+cmF3cykpCisJCQkJZ290b19iYWQ7CisJCQljbWQtPmluZGVwZW5kZW50X21ldGFkYXRhX2FyZWFzID0gMTsKKwkJfQorCX0KKworCWlmICghKGZtdC0+b3JwaGFuX3ZnID0gYWxsb2NfdmcoInRleHRfb3JwaGFuIiwgY21kLCBmbXQtPm9ycGhhbl92Z19uYW1lKSkpCisJCWdvdG9fYmFkOworCisJZmljLnR5cGUgPSBGTVRfSU5TVEFOQ0VfQVVYX01EQVM7CisJZmljLmNvbnRleHQudmdfcmVmLnZnX25hbWUgPSBmbXQtPm9ycGhhbl92Z19uYW1lOworCWZpYy5jb250ZXh0LnZnX3JlZi52Z19pZCA9IE5VTEw7CisJaWYgKCEoZmlkID0gX3RleHRfY3JlYXRlX3RleHRfaW5zdGFuY2UoZm10LCAmZmljKSkpCisJCWdvdG9fYmFkOworCisJdmdfc2V0X2ZpZChmbXQtPm9ycGhhbl92ZywgZmlkKTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIGZvcm1hdDogJXMiLCBmbXQtPm5hbWUpOworCisJcmV0dXJuIGZtdDsKK2JhZDoKKwlfdGV4dF9kZXN0cm95KGZtdCk7CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5oIGIvbGliL2Zvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYmRmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9GT1JNQVRfVEVYVF9ICisjZGVmaW5lIF9MVk1fRk9STUFUX1RFWFRfSAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworI2RlZmluZSBGTVRfVEVYVF9OQU1FICJsdm0yIgorI2RlZmluZSBGTVRfVEVYVF9BTElBUyAidGV4dCIKKyNkZWZpbmUgRk1UX1RFWFRfT1JQSEFOX1ZHX05BTUUgT1JQSEFOX1ZHX05BTUUoRk1UX1RFWFRfTkFNRSkKKyNkZWZpbmUgRk1UX1RFWFRfTUFYX01EQVNfUEVSX1BWIDIKKworLyoKKyAqIEFyY2hpdmVzIGEgdmcgY29uZmlnLiAgJ3JldGFpbl9kYXlzJyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YKKyAqIGRheXMgdGhhdCBhbiBhcmNoaXZlIGZpbGUgbXVzdCBiZSBoZWxkIGZvci4gICdtaW5fYXJjaGl2ZXMnIGlzCisgKiB0aGUgbWluaW11bSBudW1iZXIgb2YgYXJjaGl2ZXMgcmVxdWlyZWQgdG8gYmUga2VwdCBmb3IgZWFjaAorICogdm9sdW1lIGdyb3VwLgorICovCitpbnQgYXJjaGl2ZV92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICAgY29uc3QgY2hhciAqZGlyLAorCSAgICAgICBjb25zdCBjaGFyICpkZXNjLCB1aW50MzJfdCByZXRhaW5fZGF5cywgdWludDMyX3QgbWluX2FyY2hpdmUpOworCisvKgorICogRGlzcGxheXMgYSBsaXN0IG9mIHZnIGJhY2t1cHMgaW4gYSBwYXJ0aWN1bGFyIGFyY2hpdmUgZGlyZWN0b3J5LgorICovCitpbnQgYXJjaGl2ZV9saXN0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKnZnbmFtZSk7CitpbnQgYXJjaGl2ZV9saXN0X2ZpbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmZpbGUpOworaW50IGJhY2t1cF9saXN0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKnZnbmFtZSk7CisKKy8qCisgKiBUaGUgdGV4dCBmb3JtYXQgY2FuIHJlYWQgYW5kIHdyaXRlIGEgdm9sdW1lX2dyb3VwIHRvIGEgZmlsZS4KKyAqLworc3RydWN0IHRleHRfY29udGV4dCB7CisJY29uc3QgY2hhciAqcGF0aF9saXZlOwkvKiBQYXRoIHRvIGZpbGUgaG9sZGluZyBsaXZlIG1ldGFkYXRhICovCisJY29uc3QgY2hhciAqcGF0aF9lZGl0OwkvKiBQYXRoIHRvIGZpbGUgaG9sZGluZyBlZGl0ZWQgbWV0YWRhdGEgKi8KKwljb25zdCBjaGFyICpkZXNjOwkvKiBEZXNjcmlwdGlvbiBwbGFjZWQgaW5zaWRlIGZpbGUgKi8KK307CitzdHJ1Y3QgZm9ybWF0X3R5cGUgKmNyZWF0ZV90ZXh0X2Zvcm1hdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKK3N0cnVjdCBsYWJlbGxlciAqdGV4dF9sYWJlbGxlcl9jcmVhdGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQpOworCitpbnQgcHZoZHJfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1Zik7CisKK2ludCBhZGRfZGEoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKmRhcywKKwkgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3Qgc2l6ZSk7Cit2b2lkIGRlbF9kYXMoc3RydWN0IGRtX2xpc3QgKmRhcyk7CitpbnQgYWRkX2JhKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICplYXMsCisJICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUpOwordm9pZCBkZWxfYmFzKHN0cnVjdCBkbV9saXN0ICplYXMpOworaW50IGFkZF9tZGEoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICptZGFzLAorCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplLCB1bnNpZ25lZCBpZ25vcmVkKTsKK3ZvaWQgZGVsX21kYXMoc3RydWN0IGRtX2xpc3QgKm1kYXMpOworCisvKiBPbiBkaXNrICovCitzdHJ1Y3QgZGlza19sb2NuIHsKKwl1aW50NjRfdCBvZmZzZXQ7CS8qIE9mZnNldCBpbiBieXRlcyB0byBzdGFydCBzZWN0b3IgKi8KKwl1aW50NjRfdCBzaXplOwkJLyogQnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBEYXRhIGFyZWFzIChob2xkaW5nIFBFcykgKi8KK3N0cnVjdCBkYXRhX2FyZWFfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgZGlza19sb2NuIGRpc2tfbG9jbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF90ZXh0L2ltcG9ydC1leHBvcnQuaCBiL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnQtZXhwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MWM1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnQtZXhwb3J0LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1RFWFRfSU1QT1JUX0VYUE9SVF9ICisjZGVmaW5lIF9MVk1fVEVYVF9JTVBPUlRfRVhQT1JUX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBDb25zdGFudHMgdG8gaWRlbnRpZnkgZmlsZXMgdGhpcyBjb2RlIGNhbiBwYXJzZS4KKyAqLworI2RlZmluZSBDT05URU5UU19GSUVMRCAiY29udGVudHMiCisjZGVmaW5lIENPTlRFTlRTX1ZBTFVFICJUZXh0IEZvcm1hdCBWb2x1bWUgR3JvdXAiCisKKyNkZWZpbmUgRk9STUFUX1ZFUlNJT05fRklFTEQgInZlcnNpb24iCisjZGVmaW5lIEZPUk1BVF9WRVJTSU9OX1ZBTFVFIDEKKworLyoKKyAqIFZHcywgUFZzIGFuZCBMVnMgYWxsIGhhdmUgc3RhdHVzIGJpdHNldHMsIHdlIGdhdGhlciB0b2dldGhlcgorICogY29tbW9uIGNvZGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlbS4KKyAqLworZW51bSB7CisJQ09NUEFUSUJMRV9GTEFHID0gMHgwLAorCVZHX0ZMQUdTLAorCVBWX0ZMQUdTLAorCUxWX0ZMQUdTLAorCVNUQVRVU19GTEFHID0gMHg4LAorfTsKKworc3RydWN0IHRleHRfdmdfdmVyc2lvbl9vcHMgeworCWludCAoKmNoZWNrX3ZlcnNpb24pIChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKiBjZik7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqKCpyZWFkX3ZnKSAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqIGZpZCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2YsCisJCQkJCSB1bnNpZ25lZCB1c2VfY2FjaGVkX3B2cywKKwkJCQkJIHVuc2lnbmVkIGFsbG93X2x2bWV0YWRfZXh0ZW5zaW9ucyk7CisJdm9pZCAoKnJlYWRfZGVzYykgKHN0cnVjdCBkbV9wb29sICogbWVtLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmLAorCQkJICAgdGltZV90ICp3aGVuLCBjaGFyICoqZGVzYyk7CisJaW50ICgqcmVhZF92Z3N1bW1hcnkpIChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCSAgICAgICBzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5ICp2Z3N1bW1hcnkpOworfTsKKworc3RydWN0IHRleHRfdmdfdmVyc2lvbl9vcHMgKnRleHRfdmdfdnNuMV9pbml0KHZvaWQpOworCitpbnQgcHJpbnRfZmxhZ3ModWludDY0X3Qgc3RhdHVzLCBpbnQgdHlwZSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitpbnQgcmVhZF9mbGFncyh1aW50NjRfdCAqc3RhdHVzLCBpbnQgdHlwZSwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3YpOworCitpbnQgdGV4dF92Z19leHBvcnRfZmlsZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqZGVzYywgRklMRSAqZnApOworc2l6ZV90IHRleHRfdmdfZXhwb3J0X3JhdyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqZGVzYywgY2hhciAqKmJ1Zik7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp0ZXh0X3ZnX2ltcG9ydF9maWxlKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJIGNvbnN0IGNoYXIgKmZpbGUsCisJCQkJCSB0aW1lX3QgKndoZW4sIGNoYXIgKipkZXNjKTsKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKnRleHRfdmdfaW1wb3J0X2ZkKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKwkJCQkgICAgICAgc3RydWN0IGNhY2hlZF92Z19mbXRkYXRhICoqdmdfZm10ZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgKnVzZV9wcmV2aW91c192ZywKKwkJCQkgICAgICAgaW50IHNpbmdsZV9kZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorCQkJCSAgICAgICBvZmZfdCBvZmZzZXQyLCB1aW50MzJfdCBzaXplMiwKKwkJCQkgICAgICAgY2hlY2tzdW1fZm5fdCBjaGVja3N1bV9mbiwKKwkJCQkgICAgICAgdWludDMyX3QgY2hlY2tzdW0sCisJCQkJICAgICAgIHRpbWVfdCAqd2hlbiwgY2hhciAqKmRlc2MpOworCitpbnQgdGV4dF92Z3N1bW1hcnlfaW1wb3J0KGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLAorCQkgICAgICAgb2ZmX3Qgb2Zmc2V0MiwgdWludDMyX3Qgc2l6ZTIsCisJCSAgICAgICBjaGVja3N1bV9mbl90IGNoZWNrc3VtX2ZuLAorCQkgICAgICAgaW50IGNoZWNrc3VtX29ubHksCisJCSAgICAgICBzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5ICp2Z3N1bW1hcnkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnQuYyBiL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk4ODRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Zvcm1hdF90ZXh0L2ltcG9ydC5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAiaW1wb3J0LWV4cG9ydC5oIgorCisvKiBGSVhNRSBVc2UgdGlkaWVyIGluY2x1c2lvbiBtZXRob2QgKi8KK3N0YXRpYyBzdHJ1Y3QgdGV4dF92Z192ZXJzaW9uX29wcyAqKF90ZXh0X3Zzbl9saXN0WzJdKTsKKworc3RhdGljIGludCBfdGV4dF9pbXBvcnRfaW5pdGlhbGlzZWQgPSAwOworCitzdGF0aWMgdm9pZCBfaW5pdF90ZXh0X2ltcG9ydCh2b2lkKQoreworCWlmIChfdGV4dF9pbXBvcnRfaW5pdGlhbGlzZWQpCisJCXJldHVybjsKKworCV90ZXh0X3Zzbl9saXN0WzBdID0gdGV4dF92Z192c24xX2luaXQoKTsKKwlfdGV4dF92c25fbGlzdFsxXSA9IE5VTEw7CisJX3RleHRfaW1wb3J0X2luaXRpYWxpc2VkID0gMTsKK30KKworLyoKKyAqIEZpbmQgb3V0IHZnbmFtZSBvbiBhIGdpdmVuIGRldmljZS4KKyAqLworaW50IHRleHRfdmdzdW1tYXJ5X2ltcG9ydChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIG9mZl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwKKwkJICAgICAgIG9mZl90IG9mZnNldDIsIHVpbnQzMl90IHNpemUyLAorCQkgICAgICAgY2hlY2tzdW1fZm5fdCBjaGVja3N1bV9mbiwKKwkJICAgICAgIGludCBjaGVja3N1bV9vbmx5LAorCQkgICAgICAgc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSAqdmdzdW1tYXJ5KQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworCXN0cnVjdCB0ZXh0X3ZnX3ZlcnNpb25fb3BzICoqdnNuOworCWludCByID0gMDsKKworCV9pbml0X3RleHRfaW1wb3J0KCk7CisKKwlpZiAoIShjZnQgPSBjb25maWdfb3BlbihDT05GSUdfRklMRV9TUEVDSUFMLCBOVUxMLCAwKSkpCisJCXJldHVybl8wOworCisJaWYgKCghZGV2ICYmICFjb25maWdfZmlsZV9yZWFkKGNmdCkpIHx8CisJICAgIChkZXYgJiYgIWNvbmZpZ19maWxlX3JlYWRfZmQoY2Z0LCBkZXYsIG9mZnNldCwgc2l6ZSwKKwkJCQkJIG9mZnNldDIsIHNpemUyLCBjaGVja3N1bV9mbiwKKwkJCQkJIHZnc3VtbWFyeS0+bWRhX2NoZWNrc3VtLAorCQkJCQkgY2hlY2tzdW1fb25seSkpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjaGVja3N1bV9vbmx5KSB7CisJCS8qIENoZWNrc3VtIG1hdGNoZXMgYWxyZWFkeS1jYWNoZWQgY29udGVudCAtIG5vIG5lZWQgdG8gcmVwYXJzZS4gKi8KKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRmluZCBhIHNldCBvZiB2ZXJzaW9uIGZ1bmN0aW9ucyB0aGF0IGNhbiByZWFkIHRoaXMgZmlsZQorCSAqLworCWZvciAodnNuID0gJl90ZXh0X3Zzbl9saXN0WzBdOyAqdnNuOyB2c24rKykgeworCQlpZiAoISgqdnNuKS0+Y2hlY2tfdmVyc2lvbihjZnQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoKnZzbiktPnJlYWRfdmdzdW1tYXJ5KGZtdCwgY2Z0LCB2Z3N1bW1hcnkpKQorCQkJZ290b19vdXQ7CisKKwkJciA9IDE7CisJCWJyZWFrOworCX0KKworICAgICAgb3V0OgorCWNvbmZpZ19kZXN0cm95KGNmdCk7CisJcmV0dXJuIHI7Cit9CisKK3N0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSB7CisgICAgICAgIHVpbnQzMl90IGNhY2hlZF9tZGFfY2hlY2tzdW07CisgICAgICAgIHNpemVfdCBjYWNoZWRfbWRhX3NpemU7Cit9OworCitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp0ZXh0X3ZnX2ltcG9ydF9mZChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisJCQkJICAgICAgIHN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqKnZnX2ZtdGRhdGEsCisJCQkJICAgICAgIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcsCisJCQkJICAgICAgIGludCBzaW5nbGVfZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIG9mZl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSwKKwkJCQkgICAgICAgb2ZmX3Qgb2Zmc2V0MiwgdWludDMyX3Qgc2l6ZTIsCisJCQkJICAgICAgIGNoZWNrc3VtX2ZuX3QgY2hlY2tzdW1fZm4sCisJCQkJICAgICAgIHVpbnQzMl90IGNoZWNrc3VtLAorCQkJCSAgICAgICB0aW1lX3QgKndoZW4sIGNoYXIgKipkZXNjKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdDsKKwlzdHJ1Y3QgdGV4dF92Z192ZXJzaW9uX29wcyAqKnZzbjsKKwlpbnQgc2tpcF9wYXJzZTsKKworCWlmICh2Z19mbXRkYXRhICYmICEqdmdfZm10ZGF0YSAmJgorCSAgICAhKCp2Z19mbXRkYXRhID0gZG1fcG9vbF96YWxsb2MoZmlkLT5tZW0sIHNpemVvZigqKnZnX2ZtdGRhdGEpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgVkcgZm10ZGF0YSBmb3IgdGV4dCBmb3JtYXQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCV9pbml0X3RleHRfaW1wb3J0KCk7CisKKwkqZGVzYyA9IE5VTEw7CisJKndoZW4gPSAwOworCisJaWYgKCEoY2Z0ID0gY29uZmlnX29wZW4oQ09ORklHX0ZJTEVfU1BFQ0lBTCwgZmlsZSwgMCkpKQorCQlyZXR1cm5fTlVMTDsKKworCS8qIERvZXMgdGhlIG1ldGFkYXRhIG1hdGNoIHRoZSBhbHJlYWR5LWNhY2hlZCBWRz8gKi8KKwlza2lwX3BhcnNlID0gdmdfZm10ZGF0YSAmJiAKKwkJICAgICAoKCp2Z19mbXRkYXRhKS0+Y2FjaGVkX21kYV9jaGVja3N1bSA9PSBjaGVja3N1bSkgJiYKKwkJICAgICAoKCp2Z19mbXRkYXRhKS0+Y2FjaGVkX21kYV9zaXplID09IChzaXplICsgc2l6ZTIpKTsKKworCWlmICgoIWRldiAmJiAhY29uZmlnX2ZpbGVfcmVhZChjZnQpKSB8fAorCSAgICAoZGV2ICYmICFjb25maWdfZmlsZV9yZWFkX2ZkKGNmdCwgZGV2LCBvZmZzZXQsIHNpemUsCisJCQkJCSBvZmZzZXQyLCBzaXplMiwgY2hlY2tzdW1fZm4sIGNoZWNrc3VtLAorCQkJCQkgc2tpcF9wYXJzZSkpKQorCQlnb3RvX291dDsKKworCWlmIChza2lwX3BhcnNlKSB7CisJCWlmICh1c2VfcHJldmlvdXNfdmcpCisJCQkqdXNlX3ByZXZpb3VzX3ZnID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBGaW5kIGEgc2V0IG9mIHZlcnNpb24gZnVuY3Rpb25zIHRoYXQgY2FuIHJlYWQgdGhpcyBmaWxlCisJICovCisJZm9yICh2c24gPSAmX3RleHRfdnNuX2xpc3RbMF07ICp2c247IHZzbisrKSB7CisJCWlmICghKCp2c24pLT5jaGVja192ZXJzaW9uKGNmdCkpCisJCQljb250aW51ZTsKKworCQlpZiAoISh2ZyA9ICgqdnNuKS0+cmVhZF92ZyhmaWQsIGNmdCwgc2luZ2xlX2RldmljZSwgMCkpKQorCQkJZ290b19vdXQ7CisKKwkJKCp2c24pLT5yZWFkX2Rlc2ModmctPnZnbWVtLCBjZnQsIHdoZW4sIGRlc2MpOworCQlicmVhazsKKwl9CisKKwlpZiAodmcgJiYgdmdfZm10ZGF0YSAmJiAqdmdfZm10ZGF0YSkgeworCQkoKnZnX2ZtdGRhdGEpLT5jYWNoZWRfbWRhX3NpemUgPSAoc2l6ZSArIHNpemUyKTsKKwkJKCp2Z19mbXRkYXRhKS0+Y2FjaGVkX21kYV9jaGVja3N1bSA9IGNoZWNrc3VtOworCX0KKworCWlmICh1c2VfcHJldmlvdXNfdmcpCisJCSp1c2VfcHJldmlvdXNfdmcgPSAwOworCisgICAgICBvdXQ6CisJY29uZmlnX2Rlc3Ryb3koY2Z0KTsKKwlyZXR1cm4gdmc7Cit9CisKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKnRleHRfdmdfaW1wb3J0X2ZpbGUoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJCQkgY29uc3QgY2hhciAqZmlsZSwKKwkJCQkJIHRpbWVfdCAqd2hlbiwgY2hhciAqKmRlc2MpCit7CisJcmV0dXJuIHRleHRfdmdfaW1wb3J0X2ZkKGZpZCwgZmlsZSwgTlVMTCwgTlVMTCwgMCwgTlVMTCwgKG9mZl90KTAsIDAsIChvZmZfdCkwLCAwLCBOVUxMLCAwLAorCQkJCSB3aGVuLCBkZXNjKTsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl9pbXBvcnRfdmdfZnJvbV9jb25maWdfdHJlZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJCQlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJCQkJdW5zaWduZWQgYWxsb3dfbHZtZXRhZF9leHRlbnNpb25zKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gTlVMTDsKKwlzdHJ1Y3QgdGV4dF92Z192ZXJzaW9uX29wcyAqKnZzbjsKKwlpbnQgdmdfbWlzc2luZzsKKworCV9pbml0X3RleHRfaW1wb3J0KCk7CisKKwlmb3IgKHZzbiA9ICZfdGV4dF92c25fbGlzdFswXTsgKnZzbjsgdnNuKyspIHsKKwkJaWYgKCEoKnZzbiktPmNoZWNrX3ZlcnNpb24oY2Z0KSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBUaGUgb25seSBwYXRoIHRvIHRoaXMgcG9pbnQgdXNlcyBjYWNoZWQgdmdtZXRhZGF0YSwKKwkJICogc28gaXQgY2FuIHVzZSBjYWNoZWQgUFYgc3RhdGUgdG9vLgorCQkgKi8KKwkJaWYgKCEodmcgPSAoKnZzbiktPnJlYWRfdmcoZmlkLCBjZnQsIDEsIGFsbG93X2x2bWV0YWRfZXh0ZW5zaW9ucykpKQorCQkJc3RhY2s7CisJCWVsc2UgaWYgKCh2Z19taXNzaW5nID0gdmdfbWlzc2luZ19wdl9jb3VudCh2ZykpKSB7CisJCQlsb2dfdmVyYm9zZSgiVGhlcmUgYXJlICVkIHBoeXNpY2FsIHZvbHVtZXMgbWlzc2luZy4iLAorCQkJCSAgICB2Z19taXNzaW5nKTsKKwkJCXZnX21hcmtfcGFydGlhbF9sdnModmcsIDEpOworCQkJLyogRklYTUU6IG1vdmUgdGhpcyBjb2RlIGluc2lkZSByZWFkX3ZnKCkgKi8KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdmc7Cit9CisKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKmltcG9ydF92Z19mcm9tX2NvbmZpZ190cmVlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkKQoreworCXJldHVybiBfaW1wb3J0X3ZnX2Zyb21fY29uZmlnX3RyZWUoY2Z0LCBmaWQsIDApOworfQorCitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICppbXBvcnRfdmdfZnJvbV9sdm1ldGFkX2NvbmZpZ190cmVlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkJCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCkKK3sKKwlyZXR1cm4gX2ltcG9ydF92Z19mcm9tX2NvbmZpZ190cmVlKGNmdCwgZmlkLCAxKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jIGIvbGliL2Zvcm1hdF90ZXh0L2ltcG9ydF92c24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMTllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jCkBAIC0wLDAgKzEsMTMwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImltcG9ydC1leHBvcnQuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC5oIgorI2luY2x1ZGUgImx2X2FsbG9jLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAidGV4dF9pbXBvcnQuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisKK3R5cGVkZWYgaW50ICgqc2VjdGlvbl9mbikgKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKiBmaWQsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICogdmcsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqIHB2biwKKwkJCSAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqIHZnbiwKKwkJCSAgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICogcHZfaGFzaCwKKwkJCSAgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICogbHZfaGFzaCwKKwkJCSAgIHVuc2lnbmVkICpzY2FuX2RvbmVfb25jZSwKKwkJCSAgIHVuc2lnbmVkIHJlcG9ydF9taXNzaW5nX2RldmljZXMpOworCisjZGVmaW5lIF9yZWFkX2ludDMyKHJvb3QsIHBhdGgsIHJlc3VsdCkgXAorCWRtX2NvbmZpZ19nZXRfdWludDMyKHJvb3QsIHBhdGgsICh1aW50MzJfdCAqKSByZXN1bHQpCisKKyNkZWZpbmUgX3JlYWRfdWludDMyKHJvb3QsIHBhdGgsIHJlc3VsdCkgXAorCWRtX2NvbmZpZ19nZXRfdWludDMyKHJvb3QsIHBhdGgsIHJlc3VsdCkKKworI2RlZmluZSBfcmVhZF91aW50NjQocm9vdCwgcGF0aCwgcmVzdWx0KSBcCisJZG1fY29uZmlnX2dldF91aW50NjQocm9vdCwgcGF0aCwgcmVzdWx0KQorCisvKgorICogTG9ncyBhbiBhdHRlbXB0IHRvIHJlYWQgYW4gaW52YWxpZCBmb3JtYXQgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgX2ludmFsaWRfZm9ybWF0KGNvbnN0IGNoYXIgKnN0cikKK3sKKwlsb2dfZXJyb3IoIkNhbid0IHByb2Nlc3MgdGV4dCBmb3JtYXQgZmlsZSAtICVzLiIsIHN0cik7Cit9CisKKy8qCisgKiBDaGVja3MgdGhhdCB0aGUgY29uZmlnIGZpbGUgY29udGFpbnMgdmcgbWV0YWRhdGEsIGFuZCB0aGF0IGl0CisgKiB3ZSByZWNvZ25pc2UgdGhlIHZlcnNpb24gbnVtYmVyLAorICovCitzdGF0aWMgaW50IF92c24xX2NoZWNrX3ZlcnNpb24oY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKworCS8vIFRPRE8gaWYgdGhpcyBpcyBwdnNjYW4gLS1jYWNoZSwgd2Ugd2FudCB0aGlzIGNoZWNrIGJhY2suCisJaWYgKGx2bWV0YWRfdXNlZCgpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQ2hlY2sgdGhlIGNvbnRlbnRzIGZpZWxkLgorCSAqLworCWlmICghKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShjZnQtPnJvb3QsIENPTlRFTlRTX0ZJRUxEKSkpIHsKKwkJX2ludmFsaWRfZm9ybWF0KCJtaXNzaW5nIGNvbnRlbnRzIGZpZWxkIik7CisJCXJldHVybiAwOworCX0KKworCWN2ID0gY24tPnY7CisJaWYgKCFjdiB8fCBjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HIHx8IHN0cmNtcChjdi0+di5zdHIsIENPTlRFTlRTX1ZBTFVFKSkgeworCQlfaW52YWxpZF9mb3JtYXQoInVucmVjb2duaXNlZCBjb250ZW50cyBmaWVsZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSB2ZXJzaW9uIG51bWJlci4KKwkgKi8KKwlpZiAoIShjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoY2Z0LT5yb290LCBGT1JNQVRfVkVSU0lPTl9GSUVMRCkpKSB7CisJCV9pbnZhbGlkX2Zvcm1hdCgibWlzc2luZyB2ZXJzaW9uIG51bWJlciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljdiA9IGNuLT52OworCWlmICghY3YgfHwgY3YtPnR5cGUgIT0gRE1fQ0ZHX0lOVCB8fCBjdi0+di5pICE9IEZPUk1BVF9WRVJTSU9OX1ZBTFVFKSB7CisJCV9pbnZhbGlkX2Zvcm1hdCgidW5yZWNvZ25pc2VkIHZlcnNpb24gbnVtYmVyIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pc19jb252ZXJ0aW5nKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmIChsdl9pc19taXJyb3JlZChsdikpIHsKKwkJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwkJLyogQ2FuJ3QgdXNlIGlzX3RlbXBvcmFyeV9taXJyb3IoKSBiZWNhdXNlIHRoZSBtZXRhZGF0YSBmb3IKKwkJICogc2VnX2x2IG1heSBub3QgYmUgcmVhZCBpbiBhbmQgZmxhZ3MgbWF5IG5vdCBiZSBzZXQgeWV0LiAqLworCQlpZiAoc2VnX3R5cGUoc2VnLCAwKSA9PSBBUkVBX0xWICYmCisJCSAgICBzdHJzdHIoc2VnX2x2KHNlZywgMCktPm5hbWUsIE1JUlJPUl9TWU5DX0xBWUVSKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9yZWFkX2lkKHN0cnVjdCBpZCAqaWQsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY29uc3QgY2hhciAqdXVpZDsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoY24sIHBhdGgsICZ1dWlkKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgdXVpZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFpZF9yZWFkX2Zvcm1hdChpZCwgdXVpZCkpIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIHV1aWQuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX2ZsYWdfY29uZmlnKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbiwgdWludDY0X3QgKnN0YXR1cywgaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJKnN0YXR1cyA9IDA7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfbGlzdChuLCAic3RhdHVzIiwgJmN2KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBmaW5kIHN0YXR1cyBmbGFncy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEocmVhZF9mbGFncyhzdGF0dXMsIHR5cGUgfCBTVEFUVVNfRkxBRywgY3YpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCByZWFkIHN0YXR1cyBmbGFncy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRtX2NvbmZpZ19nZXRfbGlzdChuLCAiZmxhZ3MiLCAmY3YpKSB7CisJCWlmICghKHJlYWRfZmxhZ3Moc3RhdHVzLCB0eXBlLCBjdikpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCByZWFkIGZsYWdzLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVhZF9zdHJfbGlzdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3YpCit7CisJaWYgKGN2LT50eXBlID09IERNX0NGR19FTVBUWV9BUlJBWSkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoY3YpIHsKKwkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCWxvZ19lcnJvcigiRm91bmQgYW4gaXRlbSB0aGF0IGlzIG5vdCBhIHN0cmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sIGxpc3QsIGRtX3Bvb2xfc3RyZHVwKG1lbSwgY3YtPnYuc3RyKSkpCisJCQlyZXR1cm5fMDsKKworCQljdiA9IGN2LT5uZXh0OworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX3B2KHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnB2biwKKwkJICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdmduIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2gsCisJCSAgICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbHZfaGFzaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgIHVuc2lnbmVkICpzY2FuX2RvbmVfb25jZSwKKwkJICAgIHVuc2lnbmVkIHJlcG9ydF9taXNzaW5nX2RldmljZXMpCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IHZnLT52Z21lbTsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCXVpbnQ2NF90IHNpemUsIGJhX3N0YXJ0OworCisJaW50IG91dGRhdGVkID0gIXN0cmNtcChwdm4tPnBhcmVudC0+a2V5LCAib3V0ZGF0ZWRfcHZzIik7CisKKwlpZiAoIShwdmwgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcHZsKSkpIHx8CisJICAgICEocHZsLT5wdiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpwdmwtPnB2KSkpKQorCQlyZXR1cm5fMDsKKworCXB2ID0gcHZsLT5wdjsKKworCS8qCisJICogQWRkIHRoZSBwdiB0byB0aGUgcHYgaGFzaCBmb3IgcXVpY2sgbG9va3VwIHdoZW4gd2UgcmVhZAorCSAqIHRoZSBsdiBzZWdtZW50cy4KKwkgKi8KKwlpZiAoIWRtX2hhc2hfaW5zZXJ0KHB2X2hhc2gsIHB2bi0+a2V5LCBwdikpCisJCXJldHVybl8wOworCisJaWYgKCEocHZuID0gcHZuLT5jaGlsZCkpIHsKKwkJbG9nX2Vycm9yKCJFbXB0eSBwdiBzZWN0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9yZWFkX2lkKCZwdi0+aWQsIHB2biwgImlkIikpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHV1aWQgZm9yIHBoeXNpY2FsIHZvbHVtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIHB2LT5pc19sYWJlbGxlZCA9IDE7IC8qIEFsbCBmb3JtYXRfdGV4dCBQVnMgYXJlIGxhYmVsbGVkLiAqLworCisJLyoKKwkgKiBDb252ZXJ0IHRoZSB1dWlkIGludG8gYSBkZXZpY2UuCisJICovCisJaWYgKCEocHYtPmRldiA9IGx2bWNhY2hlX2RldmljZV9mcm9tX3B2aWQoZmlkLT5mbXQtPmNtZCwgJnB2LT5pZCwgc2Nhbl9kb25lX29uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdi0+bGFiZWxfc2VjdG9yKSkpIHsKKwkJY2hhciBidWZmZXJbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcHYtPmlkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKKwkJCWJ1ZmZlclswXSA9ICdcMCc7CisJCWlmIChyZXBvcnRfbWlzc2luZ19kZXZpY2VzKQorCQkJbG9nX2Vycm9yX29uY2UoIkNvdWxkbid0IGZpbmQgZGV2aWNlIHdpdGggdXVpZCAlcy4iLCBidWZmZXIpOworCQllbHNlCisJCQlsb2dfdmVyeV92ZXJib3NlKCJDb3VsZG4ndCBmaW5kIGRldmljZSB3aXRoIHV1aWQgJXMuIiwgYnVmZmVyKTsKKwl9CisKKwlpZiAoIShwdi0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgdmctPm5hbWUpKSkKKwkJcmV0dXJuXzA7CisKKwltZW1jcHkoJnB2LT52Z2lkLCAmdmctPmlkLCBzaXplb2YodmctPmlkKSk7CisKKwlpZiAoIW91dGRhdGVkICYmICFfcmVhZF9mbGFnX2NvbmZpZyhwdm4sICZwdi0+c3RhdHVzLCBQVl9GTEFHUykpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHN0YXR1cyBmbGFncyBmb3IgcGh5c2ljYWwgdm9sdW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUT0RPIGlzIHRoZSAhbHZtZXRhZF91c2VkKCkgdG9vIGNvYXJzZSBoZXJlPyAqLworCWlmICghcHYtPmRldiAmJiAhbHZtZXRhZF91c2VkKCkpCisJCXB2LT5zdGF0dXMgfD0gTUlTU0lOR19QVjsKKworCWlmICgocHYtPnN0YXR1cyAmIE1JU1NJTkdfUFYpICYmIHB2LT5kZXYgJiYgcHZfbWRhX3VzZWRfY291bnQocHYpID09IDApIHsKKwkJcHYtPnN0YXR1cyAmPSB+TUlTU0lOR19QVjsKKwkJbG9nX2luZm8oIlJlY292ZXJpbmcgYSBwcmV2aW91c2x5IE1JU1NJTkcgUFYgJXMgd2l0aCBubyBNREFzLiIsCisJCQkgcHZfZGV2X25hbWUocHYpKTsKKwl9CisKKwkvKiBMYXRlIGFkZGl0aW9uICovCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShwdm4sICJkZXZfc2l6ZSIpICYmCisJICAgICFfcmVhZF91aW50NjQocHZuLCAiZGV2X3NpemUiLCAmcHYtPnNpemUpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCBkZXYgc2l6ZSBmb3IgcGh5c2ljYWwgdm9sdW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIW91dGRhdGVkICYmICFfcmVhZF91aW50NjQocHZuLCAicGVfc3RhcnQiLCAmcHYtPnBlX3N0YXJ0KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgZXh0ZW50IHN0YXJ0IHZhbHVlIChwZV9zdGFydCkgIgorCQkJICAiZm9yIHBoeXNpY2FsIHZvbHVtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFvdXRkYXRlZCAmJiAhX3JlYWRfaW50MzIocHZuLCAicGVfY291bnQiLCAmcHYtPnBlX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgZXh0ZW50IGNvdW50IChwZV9jb3VudCkgZm9yICIKKwkJCSAgInBoeXNpY2FsIHZvbHVtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQm9vdGxvYWRlciBhcmVhIGlzIG5vdCBjb21wdWxzb3J5IC0ganVzdCBsb2dfZGVidWcgZm9yIHRoZSByZWNvcmQgaWYgZm91bmQuICovCisJYmFfc3RhcnQgPSBzaXplID0gMDsKKwlfcmVhZF91aW50NjQocHZuLCAiYmFfc3RhcnQiLCAmYmFfc3RhcnQpOworCV9yZWFkX3VpbnQ2NChwdm4sICJiYV9zaXplIiwgJnNpemUpOworCWlmIChiYV9zdGFydCAmJiBzaXplKSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiRm91bmQgYm9vdGxvYWRlciBhcmVhIHNwZWNpZmljYXRpb24gZm9yIFBWICVzICIKKwkJCSAgImluIG1ldGFkYXRhOiBiYV9zdGFydD0lIiBQUkl1NjQgIiwgYmFfc2l6ZT0lIiBQUkl1NjQgIi4iLAorCQkJICBwdl9kZXZfbmFtZShwdiksIGJhX3N0YXJ0LCBzaXplKTsKKwkJcHYtPmJhX3N0YXJ0ID0gYmFfc3RhcnQ7CisJCXB2LT5iYV9zaXplID0gc2l6ZTsKKwl9IGVsc2UgaWYgKCghYmFfc3RhcnQgJiYgc2l6ZSkgfHwgKGJhX3N0YXJ0ICYmICFzaXplKSkgeworCQlsb2dfZXJyb3IoIkZvdW5kIGluY29tcGxldGUgYm9vdGxvYWRlciBhcmVhIHNwZWNpZmljYXRpb24gIgorCQkJICAiZm9yIFBWICVzIGluIG1ldGFkYXRhLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaW5pdCgmcHYtPnRhZ3MpOworCWRtX2xpc3RfaW5pdCgmcHYtPnNlZ21lbnRzKTsKKworCS8qIE9wdGlvbmFsIHRhZ3MgKi8KKwlpZiAoZG1fY29uZmlnX2dldF9saXN0KHB2biwgInRhZ3MiLCAmY3YpICYmCisJICAgICEoX3JlYWRfc3RyX2xpc3QobWVtLCAmcHYtPnRhZ3MsIGN2KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHRhZ3MgZm9yIHBoeXNpY2FsIHZvbHVtZSAlcyBpbiAlcy4iLAorCQkJICBwdl9kZXZfbmFtZShwdiksIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHYtPnBlX3NpemUgPSB2Zy0+ZXh0ZW50X3NpemU7CisKKwlwdi0+cGVfYWxsb2NfY291bnQgPSAwOworCXB2LT5wZV9hbGlnbiA9IDA7CisJcHYtPmZtdCA9IGZpZC0+Zm10OworCisJLyogRml4IHVwIHB2IHNpemUgaWYgbWlzc2luZyBvciBpbXBvc3NpYmx5IGxhcmdlICovCisJaWYgKCghcHYtPnNpemUgfHwgcHYtPnNpemUgPiAoMVVMTCA8PCA2MikpICYmIHB2LT5kZXYpIHsKKwkJaWYgKCFkZXZfZ2V0X3NpemUocHYtPmRldiwgJnB2LT5zaXplKSkgeworCQkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZ2V0IHNpemUuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxvZ192ZXJib3NlKCJGaXhpbmcgdXAgbWlzc2luZyBzaXplICglcykgIgorCQkJICAgICJmb3IgUFYgJXMiLCBkaXNwbGF5X3NpemUoZmlkLT5mbXQtPmNtZCwgcHYtPnNpemUpLAorCQkJICAgIHB2X2Rldl9uYW1lKHB2KSk7CisJCXNpemUgPSBwdi0+cGVfY291bnQgKiAodWludDY0X3QpIHZnLT5leHRlbnRfc2l6ZSArIHB2LT5wZV9zdGFydDsKKwkJaWYgKHNpemUgPiBwdi0+c2l6ZSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBQaHlzaWNhbCBWb2x1bWUgJXMgaXMgdG9vIGxhcmdlICIKKwkJCQkgImZvciB1bmRlcmx5aW5nIGRldmljZSIsIHB2X2Rldl9uYW1lKHB2KSk7CisJfQorCisJaWYgKCFhbGxvY19wdl9zZWdtZW50X3dob2xlX3B2KG1lbSwgcHYpKQorCQlyZXR1cm5fMDsKKworCXZnLT5leHRlbnRfY291bnQgKz0gcHYtPnBlX2NvdW50OworCXZnLT5mcmVlX2NvdW50ICs9IHB2LT5wZV9jb3VudDsKKwlpZiAob3V0ZGF0ZWQpCisJCWRtX2xpc3RfYWRkKCZ2Zy0+cHZzX291dGRhdGVkLCAmcHZsLT5saXN0KTsKKwllbHNlCisJCWFkZF9wdmxfdG9fdmdzKHZnLCBwdmwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9pbnNlcnRfc2VnbWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpjb21wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGNvbXAsICZsdi0+c2VnbWVudHMpIHsKKwkJaWYgKGNvbXAtPmxlID4gc2VnLT5sZSkgeworCQkJZG1fbGlzdF9hZGQoJmNvbXAtPmxpc3QsICZzZWctPmxpc3QpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbHYtPmxlX2NvdW50ICs9IHNlZy0+bGVuOworCWRtX2xpc3RfYWRkKCZsdi0+c2VnbWVudHMsICZzZWctPmxpc3QpOworfQorCitzdGF0aWMgaW50IF9yZWFkX3NlZ21lbnQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCSBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gbHYtPnZnLT52Z21lbTsKKwl1aW50MzJfdCBhcmVhX2NvdW50ID0gMHU7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuX2NoaWxkID0gc24tPmNoaWxkOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCXVpbnQzMl90IHN0YXJ0X2V4dGVudCwgZXh0ZW50X2NvdW50OworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJY29uc3QgY2hhciAqc2VndHlwZV9zdHI7CisKKwlpZiAoIXNuX2NoaWxkKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgc2VnbWVudCBzZWN0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9yZWFkX2ludDMyKHNuX2NoaWxkLCAic3RhcnRfZXh0ZW50IiwgJnN0YXJ0X2V4dGVudCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkICdzdGFydF9leHRlbnQnIGZvciBzZWdtZW50ICclcycgIgorCQkJICAib2YgbG9naWNhbCB2b2x1bWUgJXMuIiwgc24tPmtleSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9yZWFkX2ludDMyKHNuX2NoaWxkLCAiZXh0ZW50X2NvdW50IiwgJmV4dGVudF9jb3VudCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkICdleHRlbnRfY291bnQnIGZvciBzZWdtZW50ICclcycgIgorCQkJICAib2YgbG9naWNhbCB2b2x1bWUgJXMuIiwgc24tPmtleSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWd0eXBlX3N0ciA9IFNFR19UWVBFX05BTUVfU1RSSVBFRDsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoc25fY2hpbGQsICJ0eXBlIiwgJnNlZ3R5cGVfc3RyKSkgeworCQlsb2dfZXJyb3IoIlNlZ21lbnQgdHlwZSBtdXN0IGJlIGEgc3RyaW5nLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIHNlZ3R5cGVfc3RyKSkpCisJCXJldHVybl8wOworCisJaWYgKHNlZ3R5cGUtPm9wcy0+dGV4dF9pbXBvcnRfYXJlYV9jb3VudCAmJgorCSAgICAhc2VndHlwZS0+b3BzLT50ZXh0X2ltcG9ydF9hcmVhX2NvdW50KHNuX2NoaWxkLCAmYXJlYV9jb3VudCkpCisJCXJldHVybl8wOworCisJaWYgKCEoc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdiwgc3RhcnRfZXh0ZW50LAorCQkJCSAgICAgZXh0ZW50X2NvdW50LCAwLCAwLCBOVUxMLCBhcmVhX2NvdW50LAorCQkJCSAgICAgZXh0ZW50X2NvdW50LCAwLCAwLCAwLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJTZWdtZW50IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWctPnNlZ3R5cGUtPm9wcy0+dGV4dF9pbXBvcnQgJiYKKwkgICAgIXNlZy0+c2VndHlwZS0+b3BzLT50ZXh0X2ltcG9ydChzZWcsIHNuX2NoaWxkLCBwdl9oYXNoKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBPcHRpb25hbCB0YWdzICovCisJaWYgKGRtX2NvbmZpZ19nZXRfbGlzdChzbl9jaGlsZCwgInRhZ3MiLCAmY3YpICYmCisJICAgICEoX3JlYWRfc3RyX2xpc3QobWVtLCAmc2VnLT50YWdzLCBjdikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCB0YWdzIGZvciBhIHNlZ21lbnQgb2YgJXMvJXMuIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSW5zZXJ0IGludG8gY29ycmVjdCBwYXJ0IG9mIHNlZ21lbnQgbGlzdC4KKwkgKi8KKwlfaW5zZXJ0X3NlZ21lbnQobHYsIHNlZyk7CisKKwlpZiAoc2VnX2lzX21pcnJvcihzZWcpKQorCQlsdi0+c3RhdHVzIHw9IE1JUlJPUjsKKworCWlmIChzZWdfaXNfbWlycm9yZWQoc2VnKSkKKwkJbHYtPnN0YXR1cyB8PSBNSVJST1JFRDsKKworCWlmIChzZWdfaXNfcmFpZChzZWcpKQorCQlsdi0+c3RhdHVzIHw9IFJBSUQ7CisKKwlpZiAoc2VnX2lzX3ZpcnR1YWwoc2VnKSkKKwkJbHYtPnN0YXR1cyB8PSBWSVJUVUFMOworCisJaWYgKCFzZWdfaXNfcmFpZChzZWcpICYmIF9pc19jb252ZXJ0aW5nKGx2KSkKKwkJbHYtPnN0YXR1cyB8PSBDT05WRVJUSU5HOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB0ZXh0X2ltcG9ydF9hcmVhcyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdiwgc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2gsCisJCSAgICAgIHVpbnQ2NF90IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgczsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2MTsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwljb25zdCBjaGFyICpzZWdfbmFtZSA9IGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbik7CisKKwlpZiAoIXNlZy0+YXJlYV9jb3VudCkgeworCQlsb2dfZXJyb3IoIlplcm8gYXJlYXMgbm90IGFsbG93ZWQgZm9yIHNlZ21lbnQgJXMiLCBzZWdfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWZvciAocyA9IDA7IGN2ICYmIHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKywgY3YgPSBjdi0+bmV4dCkgeworCisJCS8qIGZpcnN0IHdlIHJlYWQgdGhlIHB2ICovCisJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQlsb2dfZXJyb3IoIkJhZCB2b2x1bWUgbmFtZSBpbiBhcmVhcyBhcnJheSBmb3Igc2VnbWVudCAlcy4iLCBzZWdfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghY3YtPm5leHQpIHsKKwkJCWxvZ19lcnJvcigiTWlzc2luZyBvZmZzZXQgaW4gYXJlYXMgYXJyYXkgZm9yIHNlZ21lbnQgJXMuIiwgc2VnX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoY3YtPm5leHQtPnR5cGUgIT0gRE1fQ0ZHX0lOVCkgeworCQkJbG9nX2Vycm9yKCJCYWQgb2Zmc2V0IGluIGFyZWFzIGFycmF5IGZvciBzZWdtZW50ICVzLiIsIHNlZ19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRklYTUUgQ29wZSBpZiBMViBub3QgeWV0IHJlYWQgaW4gKi8KKwkJaWYgKChwdiA9IGRtX2hhc2hfbG9va3VwKHB2X2hhc2gsIGN2LT52LnN0cikpKSB7CisJCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfcHYoc2VnLCBzLCBwdiwgKHVpbnQzMl90KSBjdi0+bmV4dC0+di5pKSkKKwkJCQlyZXR1cm5fMDsKKwkJfSBlbHNlIGlmICgobHYxID0gZmluZF9sdihzZWctPmx2LT52ZywgY3YtPnYuc3RyKSkpIHsKKwkJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzZWcsIHMsIGx2MSwKKwkJCQkJCSAgICAodWludDMyX3QpIGN2LT5uZXh0LT52LmksCisJCQkJCQkgICAgc3RhdHVzKSkKKwkJCQlyZXR1cm5fMDsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCB2b2x1bWUgJyVzJyAiCisJCQkJICAiZm9yIHNlZ21lbnQgJyVzJy4iLAorCQkJCSAgY3YtPnYuc3RyID8gOiAiTlVMTCIsIHNlZ19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY3YgPSBjdi0+bmV4dDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHdlIHJlYWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN0cmlwZXMuCisJICovCisJaWYgKGN2IHx8IChzIDwgc2VnLT5hcmVhX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkluY29ycmVjdCBudW1iZXIgb2YgYXJlYXMgaW4gYXJlYSBhcnJheSAiCisJCQkgICJmb3Igc2VnbWVudCAnJXMnLiIsIHNlZ19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfc2VnbWVudHMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpsdm4sCisJCQkgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc247CisJaW50IGNvdW50ID0gMCwgc2VnX2NvdW50OworCisJZm9yIChzbiA9IGx2bjsgc247IHNuID0gc24tPnNpYikgeworCisJCS8qCisJCSAqIEFsbCBzdWItc2VjdGlvbnMgYXJlIGFzc3VtZWQgdG8gYmUgc2VnbWVudHMuCisJCSAqLworCQlpZiAoIXNuLT52KSB7CisJCQlpZiAoIV9yZWFkX3NlZ21lbnQobHYsIHNuLCBwdl9oYXNoKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJY291bnQrKzsKKwkJfQorCQkvKiBGSVhNRSBSZW1vdmUgdGhpcyByZXN0cmljdGlvbiAqLworCQlpZiAoKGx2LT5zdGF0dXMgJiBTTkFQU0hPVCkgJiYgY291bnQgPiAxKSB7CisJCQlsb2dfZXJyb3IoIk9ubHkgb25lIHNlZ21lbnQgcGVybWl0dGVkIGZvciBzbmFwc2hvdCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIV9yZWFkX2ludDMyKGx2biwgInNlZ21lbnRfY291bnQiLCAmc2VnX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgc2VnbWVudCBjb3VudCBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2VnX2NvdW50ICE9IGNvdW50KSB7CisJCWxvZ19lcnJvcigic2VnbWVudF9jb3VudCBhbmQgYWN0dWFsIG51bWJlciBvZiBzZWdtZW50cyAiCisJCQkgICJkaXNhZ3JlZSBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZXJlIGFyZSBubyBnYXBzIG9yIG92ZXJsYXBzIGluIHRoZSBsdi4KKwkgKi8KKwlpZiAoIWNoZWNrX2x2X3NlZ21lbnRzKGx2LCAwKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIE1lcmdlIHNlZ21lbnRzIGluIGNhc2Ugc29tZW9uZXMgYmVlbiBlZGl0aW5nIHRoaW5ncyBieSBoYW5kLgorCSAqLworCWlmICghbHZfbWVyZ2Vfc2VnbWVudHMobHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX2x2bmFtZXMoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmx2biwKKwkJCSBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnZnbiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbHZfaGFzaCwKKwkJCSB1bnNpZ25lZCAqc2Nhbl9kb25lX29uY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgdW5zaWduZWQgcmVwb3J0X21pc3NpbmdfZGV2aWNlcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gdmctPnZnbWVtOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJY29uc3QgY2hhciAqc3RyOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCXVpbnQ2NF90IHRpbWVzdGFtcCA9IDAsIGx2c3RhdHVzOworCisJaWYgKCEobHYgPSBhbGxvY19sdihtZW0pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWxpbmtfbHZfdG9fdmcodmcsIGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShsdi0+bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgbHZuLT5rZXkpKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkltcG9ydGluZyBsb2dpY2FsIHZvbHVtZSAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCEobHZuID0gbHZuLT5jaGlsZCkpIHsKKwkJbG9nX2Vycm9yKCJFbXB0eSBsb2dpY2FsIHZvbHVtZSBzZWN0aW9uIGZvciAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9yZWFkX2ZsYWdfY29uZmlnKGx2biwgJmx2c3RhdHVzLCBMVl9GTEFHUykpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHN0YXR1cyBmbGFncyBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2c3RhdHVzICYgTFZNX1dSSVRFX0xPQ0tFRCkgeworCQlsdnN0YXR1cyB8PSBMVk1fV1JJVEU7CisJCWx2c3RhdHVzICY9IH5MVk1fV1JJVEVfTE9DS0VEOworCX0KKwlsdi0+c3RhdHVzID0gbHZzdGF0dXM7CisKKwlpZiAoZG1fY29uZmlnX2hhc19ub2RlKGx2biwgImNyZWF0aW9uX3RpbWUiKSkgeworCQlpZiAoIV9yZWFkX3VpbnQ2NChsdm4sICJjcmVhdGlvbl90aW1lIiwgJnRpbWVzdGFtcCkpIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCBjcmVhdGlvbl90aW1lIGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghZG1fY29uZmlnX2dldF9zdHIobHZuLCAiY3JlYXRpb25faG9zdCIsICZob3N0bmFtZSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCBjcmVhdGlvbl9ob3N0IGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChkbV9jb25maWdfaGFzX25vZGUobHZuLCAiY3JlYXRpb25faG9zdCIpKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBjcmVhdGlvbl90aW1lIGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoZSBMViBsb2NrX2FyZ3Mgc3RyaW5nIGlzIGdlbmVyYXRlZCBpbiBsdm1sb2NrZCwgYW5kIHRoZSBjb250ZW50CisJICogZGVwZW5kcyBvbiB0aGUgbG9ja190eXBlLgorCSAqCisJICogbG9ja190eXBlIGRsbSBkb2VzIG5vdCB1c2UgTFYgbG9ja19hcmdzLCBzbyB0aGUgTFYgbG9ja19hcmdzIGZpZWxkCisJICogaXMganVzdCBzZXQgdG8gImRsbSIuCisJICoKKwkgKiBsb2NrX3R5cGUgc2FubG9jayB1c2VzIHRoZSBMViBsb2NrX2FyZ3MgZmllbGQgdG8gc2F2ZSB0aGUKKwkgKiBsb2NhdGlvbiBvbiBkaXNrIG9mIHRoYXQgTFYncyBzYW5sb2NrIGxvY2suICBUaGUgZGlzayBuYW1lIGlzCisJICogc3BlY2lmaWVkIGluIHRoZSBWRyBsb2NrX2FyZ3MuICBUaGUgbG9ja19hcmdzIHN0cmluZyBiZWdpbnMKKwkgKiB3aXRoIGEgdmVyc2lvbiBudW1iZXIsIGUuZy4gMS4wLjAsIGZvbGxvd2VkIGJ5IGEgY29sb24sIGZvbGxvd2VkCisJICogYnkgYSBudW1iZXIuICBUaGUgbnVtYmVyIGlzIHRoZSBvZmZzZXQgb24gZGlzayB3aGVyZSBzYW5sb2NrIGlzCisJICogdG9sZCB0byBmaW5kIHRoZSBMVidzIGxvY2suCisJICogZS5nLiBsb2NrX2FyZ3MgPSAxLjAuMDo3MDI1NDU5MgorCSAqIG1lYW5zIHRoYXQgdGhlIGxvY2sgaXMgbG9jYXRlZCBhdCBvZmZzZXQgNzAyNTQ1OTIuCisJICoKKwkgKiBUaGUgbHZtbG9ja2QgY29kZSBmb3IgZWFjaCBzcGVjaWZpYyBsb2NrIG1hbmFnZXIgYWxzbyB2YWxpZGF0ZXMKKwkgKiB0aGUgbG9ja19hcmdzIGJlZm9yZSB1c2luZyBpdCB0byBhY2Nlc3MgdGhlIGxvY2sgbWFuYWdlci4KKwkgKi8KKwlpZiAoZG1fY29uZmlnX2dldF9zdHIobHZuLCAibG9ja19hcmdzIiwgJnN0cikpIHsKKwkJaWYgKCEobHYtPmxvY2tfYXJncyA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgc3RyKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoZG1fY29uZmlnX2dldF9zdHIobHZuLCAiYWxsb2NhdGlvbl9wb2xpY3kiLCAmc3RyKSkgeworCQlsdi0+YWxsb2MgPSBnZXRfYWxsb2NfZnJvbV9zdHJpbmcoc3RyKTsKKwkJaWYgKGx2LT5hbGxvYyA9PSBBTExPQ19JTlZBTElEKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogSWdub3JpbmcgdW5yZWNvZ25pc2VkIGFsbG9jYXRpb24gcG9saWN5ICVzIGZvciBMViAlcy4iLAorCQkJCSBzdHIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlsdi0+YWxsb2MgPSBBTExPQ19JTkhFUklUOworCQl9CisJfSBlbHNlCisJCWx2LT5hbGxvYyA9IEFMTE9DX0lOSEVSSVQ7CisKKwlpZiAoZG1fY29uZmlnX2dldF9zdHIobHZuLCAicHJvZmlsZSIsICZzdHIpKSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQWRkaW5nIHByb2ZpbGUgY29uZmlndXJhdGlvbiAlcyBmb3IgTFYgJXMuIiwKKwkJCQkgICBzdHIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWlmICghKGx2LT5wcm9maWxlID0gYWRkX3Byb2ZpbGUodmctPmNtZCwgc3RyLCBDT05GSUdfUFJPRklMRV9NRVRBREFUQSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgY29uZmlndXJhdGlvbiBwcm9maWxlICVzIGZvciBMViAlcy4iLAorCQkJCSAgc3RyLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIV9yZWFkX2ludDMyKGx2biwgInJlYWRfYWhlYWQiLCAmbHYtPnJlYWRfYWhlYWQpKQorCQkvKiBJZiBub3QgcHJlc2VudCwgY2hvaWNlIG9mIGF1dG8gb3Igbm9uZSBpcyBjb25maWd1cmFibGUgKi8KKwkJbHYtPnJlYWRfYWhlYWQgPSB2Zy0+Y21kLT5kZWZhdWx0X3NldHRpbmdzLnJlYWRfYWhlYWQ7CisJZWxzZSB7CisJCXN3aXRjaCAobHYtPnJlYWRfYWhlYWQpIHsKKwkJY2FzZSAwOgorCQkJbHYtPnJlYWRfYWhlYWQgPSBETV9SRUFEX0FIRUFEX0FVVE87CisJCQlicmVhazsKKwkJY2FzZSBVSU5UMzJfQygtMSk6CisJCQlsdi0+cmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfTk9ORTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorCisJLyogT3B0aW9uYWwgdGFncyAqLworCWlmIChkbV9jb25maWdfZ2V0X2xpc3QobHZuLCAidGFncyIsICZjdikgJiYKKwkgICAgIShfcmVhZF9zdHJfbGlzdChtZW0sICZsdi0+dGFncywgY3YpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgdGFncyBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9oYXNoX2luc2VydChsdl9oYXNoLCBsdi0+bmFtZSwgbHYpKQorCQlyZXR1cm5fMDsKKworCWlmICh0aW1lc3RhbXAgJiYgIWx2X3NldF9jcmVhdGlvbihsdiwgaG9zdG5hbWUsIHRpbWVzdGFtcCkpCisJCXJldHVybl8wOworCisJaWYgKCFsdl9pc192aXNpYmxlKGx2KSAmJiBzdHJzdHIobHYtPm5hbWUsICJfcG1zcGFyZSIpKSB7CisJCWlmICh2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdikgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCB1c2UgYW5vdGhlciBwb29sIG1ldGFkYXRhIHNwYXJlICIKKwkJCQkgICJsb2dpY2FsIHZvbHVtZSAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJMb2dpY2FsIHZvbHVtZSAlcyBpcyBwb29sIG1ldGFkYXRhIHNwYXJlLiIsCisJCQkJICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJbHYtPnN0YXR1cyB8PSBQT09MX01FVEFEQVRBX1NQQVJFOworCQl2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdiA9IGx2OworCX0KKworCWlmICghbHZfaXNfdmlzaWJsZShsdikgJiYgIXN0cmNtcChsdi0+bmFtZSwgTE9DS0RfU0FOTE9DS19MVl9OQU1FKSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIHNhbmxvY2sgbHYuIiwKKwkJCQkgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlsdi0+c3RhdHVzIHw9IExPQ0tEX1NBTkxPQ0tfTFY7CisJCXZnLT5zYW5sb2NrX2x2ID0gbHY7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfaGlzdG9yaWNhbF9sdm5hbWVzKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmhsdm4sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnZnbiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2X2hhc2ggX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICB1bnNpZ25lZCAqc2Nhbl9kb25lX29uY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICB1bnNpZ25lZCByZXBvcnRfbWlzc2luZ19kZXZpY2VzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBkbV9wb29sICptZW0gPSB2Zy0+dmdtZW07CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdsdjsKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmdsdmw7CisJY29uc3QgY2hhciAqc3RyOworCXVpbnQ2NF90IHRpbWVzdGFtcDsKKworCWlmICghKGdsdiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lKSkpIHx8CisJICAgICEoZ2x2LT5oaXN0b3JpY2FsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGhpc3RvcmljYWxfbG9naWNhbF92b2x1bWUpKSkgfHwKKwkgICAgIShnbHZsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGdsdl9saXN0KSkpKSB7CisJCWxvZ19lcnJvcigiUmVtb3ZlZCBsb2dpY2FsIHZvbHVtZSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBiYWQ7CisJfQorCisJZ2x2LT5pc19oaXN0b3JpY2FsID0gMTsKKwlnbHYtPmhpc3RvcmljYWwtPnZnID0gdmc7CisJZG1fbGlzdF9pbml0KCZnbHYtPmhpc3RvcmljYWwtPmluZGlyZWN0X2dsdnMpOworCisJaWYgKCEoZ2x2LT5oaXN0b3JpY2FsLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBobHZuLT5rZXkpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShobHZuID0gaGx2bi0+Y2hpbGQpKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgcmVtb3ZlZCBsb2dpY2FsIHZvbHVtZSBzZWN0aW9uLiIpOworCQlnb3RvX2JhZDsKKwl9CisKKwlpZiAoIV9yZWFkX2lkKCZnbHYtPmhpc3RvcmljYWwtPmx2aWQuaWRbMV0sIGhsdm4sICJpZCIpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCB1dWlkIGZvciByZW1vdmVkIGxvZ2ljYWwgdm9sdW1lICVzIGluIHZnICVzLiIsCisJCQkgIGdsdi0+aGlzdG9yaWNhbC0+bmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KCZnbHYtPmhpc3RvcmljYWwtPmx2aWQuaWRbMF0sICZnbHYtPmhpc3RvcmljYWwtPnZnLT5pZCwgc2l6ZW9mKGdsdi0+aGlzdG9yaWNhbC0+bHZpZC5pZFswXSkpOworCisJaWYgKGRtX2NvbmZpZ19nZXRfc3RyKGhsdm4sICJuYW1lIiwgJnN0cikpIHsKKwkJaWYgKCEoZ2x2LT5oaXN0b3JpY2FsLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBzdHIpKSkKKwkJCWdvdG9fYmFkOworCX0KKworCWlmIChkbV9jb25maWdfaGFzX25vZGUoaGx2biwgImNyZWF0aW9uX3RpbWUiKSkgeworCQlpZiAoIV9yZWFkX3VpbnQ2NChobHZuLCAiY3JlYXRpb25fdGltZSIsICZ0aW1lc3RhbXApKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgY3JlYXRpb25fdGltZSBmb3IgcmVtb3ZlZCBsb2dpY2FsIHZvbHVtZSAlcy4iLCBzdHIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJZ2x2LT5oaXN0b3JpY2FsLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShobHZuLCAicmVtb3ZhbF90aW1lIikpIHsKKwkJaWYgKCFfcmVhZF91aW50NjQoaGx2biwgInJlbW92YWxfdGltZSIsICZ0aW1lc3RhbXApKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgcmVtb3ZhbF90aW1lIGZvciByZW1vdmVkIGxvZ2ljYWwgdm9sdW1lICVzLiIsIHN0cik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlnbHYtPmhpc3RvcmljYWwtPnRpbWVzdGFtcF9yZW1vdmVkID0gdGltZXN0YW1wOworCX0KKworCWdsdmwtPmdsdiA9IGdsdjsKKwlkbV9saXN0X2FkZCgmdmctPmhpc3RvcmljYWxfbHZzLCAmZ2x2bC0+bGlzdCk7CisKKwlyZXR1cm4gMTsKK2JhZDoKKwlpZiAoZ2x2KQorCQlkbV9wb29sX2ZyZWUobWVtLCBnbHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9yZWFkX2hpc3RvcmljYWxfbHZuYW1lc19pbnRlcmNvbm5lY3Rpb25zKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJCSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpobHZuLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdmduIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkJIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkJIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpsdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkJIHVuc2lnbmVkICpzY2FuX2RvbmVfb25jZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJCSB1bnNpZ25lZCByZXBvcnRfbWlzc2luZ19kZXZpY2VzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBkbV9wb29sICptZW0gPSB2Zy0+dmdtZW07CisJY29uc3QgY2hhciAqaGlzdG9yaWNhbF9sdl9uYW1lLCAqb3JpZ2luX25hbWUgPSBOVUxMOworCXN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpnbHYsICpvcmlnaW5fZ2x2LCAqZGVzY2VuZGFudF9nbHY7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICp0bXBfbHY7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpkZXNjZW5kYW50cyA9IE5VTEw7CisKKwloaXN0b3JpY2FsX2x2X25hbWUgPSBobHZuLT5rZXk7CisJaGx2biA9IGhsdm4tPmNoaWxkOworCisJaWYgKCEoZ2x2ID0gZmluZF9oaXN0b3JpY2FsX2dsdih2ZywgaGlzdG9yaWNhbF9sdl9uYW1lLCAwLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmtub3duIGhpc3RvcmljYWwgbG9naWNhbCB2b2x1bWUgJXMvJXMlcyIsCisJCQkgIHZnLT5uYW1lLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgaGlzdG9yaWNhbF9sdl9uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShobHZuLCAib3JpZ2luIikpIHsKKwkJaWYgKCFkbV9jb25maWdfZ2V0X3N0cihobHZuLCAib3JpZ2luIiwgJm9yaWdpbl9uYW1lKSkgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIG9yaWdpbiBmb3IgaGlzdG9yaWNhbCBsb2dpY2FsICIKKwkJCQkgICJ2b2x1bWUgJXMvJXMlcyIsIHZnLT5uYW1lLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgaGlzdG9yaWNhbF9sdl9uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShobHZuLCAiZGVzY2VuZGFudHMiKSkgeworCQlpZiAoIWRtX2NvbmZpZ19nZXRfbGlzdChobHZuLCAiZGVzY2VuZGFudHMiLCAmZGVzY2VuZGFudHMpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGdldCBkZXNjZW5kYW50cyBsaXN0IGZvciBoaXN0b3JpY2FsIGxvZ2ljYWwgIgorCQkJCSAgInZvbHVtZSAlcy8lcyVzIiwgdmctPm5hbWUsIEhJU1RPUklDQUxfTFZfUFJFRklYLCBoaXN0b3JpY2FsX2x2X25hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKGRlc2NlbmRhbnRzLT50eXBlID09IERNX0NGR19FTVBUWV9BUlJBWSkgeworCQkJbG9nX2Vycm9yKCJGb3VuZCBlbXB0eSBkZXNjZW5kYW50cyBsaXN0IGZvciBoaXN0b3JpY2FsIGxvZ2ljYWwgIgorCQkJCSAgInZvbHVtZSAlcy8lcyVzIiwgdmctPm5hbWUsIEhJU1RPUklDQUxfTFZfUFJFRklYLCBoaXN0b3JpY2FsX2x2X25hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwlpZiAoIW9yaWdpbl9uYW1lICYmICFkZXNjZW5kYW50cykKKwkJLyogbm8gaW50ZXJjb25uZWN0aW9ucyAqLworCQlyZXR1cm4gMTsKKworCWlmIChvcmlnaW5fbmFtZSkgeworCQlpZiAoIShnbHZsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGdsdl9saXN0KSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBsaXN0IGl0ZW0gZm9yIGhpc3RvcmljYWwgbG9naWNhbCAiCisJCQkJICAidm9sdW1lICVzLyVzJXMiLCB2Zy0+bmFtZSwgSElTVE9SSUNBTF9MVl9QUkVGSVgsIGhpc3RvcmljYWxfbHZfbmFtZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlnbHZsLT5nbHYgPSBnbHY7CisKKwkJaWYgKCFzdHJuY21wKG9yaWdpbl9uYW1lLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgc3RybGVuKEhJU1RPUklDQUxfTFZfUFJFRklYKSkpIHsKKwkJCWlmICghKG9yaWdpbl9nbHYgPSBmaW5kX2hpc3RvcmljYWxfZ2x2KHZnLCBvcmlnaW5fbmFtZSArIHN0cmxlbihISVNUT1JJQ0FMX0xWX1BSRUZJWCksIDAsIE5VTEwpKSkgeworCQkJCWxvZ19lcnJvcigiVW5rbm93biBvcmlnaW4gJXMgZm9yIGhpc3RvcmljYWwgbG9naWNhbCB2b2x1bWUgJXMvJXMlcyIsCisJCQkJCSAgb3JpZ2luX25hbWUsIHZnLT5uYW1lLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgaGlzdG9yaWNhbF9sdl9uYW1lKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKHRtcF9sdiA9IGZpbmRfbHYodmcsIG9yaWdpbl9uYW1lKSkpIHsKKwkJCQlsb2dfZXJyb3IoIlVua25vd24gb3JpZ2luICVzIGZvciBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lICVzLyVzJXMiLAorCQkJCQkgIG9yaWdpbl9uYW1lLCB2Zy0+bmFtZSwgSElTVE9SSUNBTF9MVl9QUkVGSVgsIGhpc3RvcmljYWxfbHZfbmFtZSk7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCWlmICghKG9yaWdpbl9nbHYgPSBnZXRfb3JfY3JlYXRlX2dsdihtZW0sIHRtcF9sdiwgTlVMTCkpKQorCQkJCWdvdG8gYmFkOworCQl9CisKKwkJZ2x2LT5oaXN0b3JpY2FsLT5pbmRpcmVjdF9vcmlnaW4gPSBvcmlnaW5fZ2x2OworCQlpZiAob3JpZ2luX2dsdi0+aXNfaGlzdG9yaWNhbCkKKwkJCWRtX2xpc3RfYWRkKCZvcmlnaW5fZ2x2LT5oaXN0b3JpY2FsLT5pbmRpcmVjdF9nbHZzLCAmZ2x2bC0+bGlzdCk7CisJCWVsc2UKKwkJCWRtX2xpc3RfYWRkKCZvcmlnaW5fZ2x2LT5saXZlLT5pbmRpcmVjdF9nbHZzLCAmZ2x2bC0+bGlzdCk7CisJfQorCisJaWYgKGRlc2NlbmRhbnRzKSB7CisJCWRvIHsKKwkJCWlmIChkZXNjZW5kYW50cy0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQkJbG9nX2Vycm9yKCJEZXNjZW5kYW50IHZhbHVlIGZvciBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lICVzLyVzJXMgIgorCQkJCQkgICJpcyBub3QgYSBzdHJpbmcuIiwgdmctPm5hbWUsIEhJU1RPUklDQUxfTFZfUFJFRklYLCBoaXN0b3JpY2FsX2x2X25hbWUpOworCQkJCWdvdG8gYmFkOworCQkJfQorCisJCQlpZiAoISh0bXBfbHYgPSBmaW5kX2x2KHZnLCBkZXNjZW5kYW50cy0+di5zdHIpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgZGVzY2VuZGFudCAlcyBmb3IgaGlzdG9yaWNhbCBMViAlcy4iLAorCQkJCQkgIGRlc2NlbmRhbnRzLT52LnN0ciwgaGlzdG9yaWNhbF9sdl9uYW1lKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKworCQkJaWYgKCEoZGVzY2VuZGFudF9nbHYgPSBnZXRfb3JfY3JlYXRlX2dsdihtZW0sIHRtcF9sdiwgTlVMTCkpKQorCQkJCWdvdG8gYmFkOworCisJCQlpZiAoIWFkZF9nbHZfdG9faW5kaXJlY3RfZ2x2cyhtZW0sIGdsdiwgZGVzY2VuZGFudF9nbHYpKQorCQkJCWdvdG8gYmFkOworCisJCQlkZXNjZW5kYW50cyA9IGRlc2NlbmRhbnRzLT5uZXh0OworCQl9IHdoaWxlIChkZXNjZW5kYW50cyk7CisJfQorCisJcmV0dXJuIDE7CitiYWQ6CisJaWYgKGdsdmwpCisJCWRtX3Bvb2xfZnJlZShtZW0sIGdsdmwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9yZWFkX2x2c2VncyhzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpsdm4sCisJCQljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnZnbiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoLAorCQkJc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2X2hhc2gsCisJCQl1bnNpZ25lZCAqc2Nhbl9kb25lX29uY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQl1bnNpZ25lZCByZXBvcnRfbWlzc2luZ19kZXZpY2VzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisKKwlpZiAoIShsdiA9IGRtX2hhc2hfbG9va3VwKGx2X2hhc2gsIGx2bi0+a2V5KSkpIHsKKwkJbG9nX2Vycm9yKCJMb3N0IGxvZ2ljYWwgdm9sdW1lIHJlZmVyZW5jZSAlcyIsIGx2bi0+a2V5KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobHZuID0gbHZuLT5jaGlsZCkpIHsKKwkJbG9nX2Vycm9yKCJFbXB0eSBsb2dpY2FsIHZvbHVtZSBzZWN0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGSVhNRTogcmVhZCBmdWxsIGx2aWQgKi8KKwlpZiAoIV9yZWFkX2lkKCZsdi0+bHZpZC5pZFsxXSwgbHZuLCAiaWQiKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgdXVpZCBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KCZsdi0+bHZpZC5pZFswXSwgJmx2LT52Zy0+aWQsIHNpemVvZihsdi0+bHZpZC5pZFswXSkpOworCisJaWYgKCFfcmVhZF9zZWdtZW50cyhsdiwgbHZuLCBwdl9oYXNoKSkKKwkJcmV0dXJuXzA7CisKKwlsdi0+c2l6ZSA9ICh1aW50NjRfdCkgbHYtPmxlX2NvdW50ICogKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X3NpemU7CisJbHYtPm1pbm9yID0gLTE7CisJbHYtPm1ham9yID0gLTE7CisKKwlpZiAobHYtPnN0YXR1cyAmIEZJWEVEX01JTk9SKSB7CisJCWlmICghX3JlYWRfaW50MzIobHZuLCAibWlub3IiLCAmbHYtPm1pbm9yKSkgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIG1pbm9yIG51bWJlciBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghZG1fY29uZmlnX2hhc19ub2RlKGx2biwgIm1ham9yIikpCisJCQkvKiBJZiBtYWpvciBpcyBtaXNzaW5nLCBwaWNrIGRlZmF1bHQgKi8KKwkJCWx2LT5tYWpvciA9IHZnLT5jbWQtPmRldl90eXBlcy0+ZGV2aWNlX21hcHBlcl9tYWpvcjsKKwkJZWxzZSBpZiAoIV9yZWFkX2ludDMyKGx2biwgIm1ham9yIiwgJmx2LT5tYWpvcikpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBDb3VsZG4ndCByZWFkIG1ham9yIG51bWJlciBmb3IgbG9naWNhbCAiCisJCQkJICJ2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWx2LT5tYWpvciA9IHZnLT5jbWQtPmRldl90eXBlcy0+ZGV2aWNlX21hcHBlcl9tYWpvcjsKKwkJfQorCisJCWlmICghdmFsaWRhdGVfbWFqb3JfbWlub3IodmctPmNtZCwgZmlkLT5mbXQsIGx2LT5tYWpvciwgbHYtPm1pbm9yKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGludmFsaWQgbWFqb3IsIG1pbm9yIG51bWJlciBmb3IgIgorCQkJCSAibG9naWNhbCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWx2LT5tYWpvciA9IGx2LT5taW5vciA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfc2VjdGlvbnMoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJICBjb25zdCBjaGFyICpzZWN0aW9uLCBzZWN0aW9uX2ZuIGZuLAorCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICp2Z24sCisJCQkgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoLAorCQkJICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbHZfaGFzaCwKKwkJCSAgaW50IG9wdGlvbmFsLAorCQkJICB1bnNpZ25lZCAqc2Nhbl9kb25lX29uY2UpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuOworCS8qIE9ubHkgcmVwb3J0IG1pc3NpbmcgZGV2aWNlcyB3aGVuIGRvaW5nIGEgc2NhbiAqLworCXVuc2lnbmVkIHJlcG9ydF9taXNzaW5nX2RldmljZXMgPSBzY2FuX2RvbmVfb25jZSA/ICEqc2Nhbl9kb25lX29uY2UgOiAxOworCisJaWYgKCFkbV9jb25maWdfZ2V0X3NlY3Rpb24odmduLCBzZWN0aW9uLCAmbikpIHsKKwkJaWYgKCFvcHRpb25hbCkgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIHNlY3Rpb24gJyVzJy4iLCBzZWN0aW9uKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJZm9yIChuID0gbi0+Y2hpbGQ7IG47IG4gPSBuLT5zaWIpIHsKKwkJaWYgKCFmbihmaWQsIHZnLCBuLCB2Z24sIHB2X2hhc2gsIGx2X2hhc2gsCisJCQlzY2FuX2RvbmVfb25jZSwgcmVwb3J0X21pc3NpbmdfZGV2aWNlcykpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl9yZWFkX3ZnKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCSAgICAgdW5zaWduZWQgdXNlX2NhY2hlZF9wdnMsCisJCQkJICAgICB1bnNpZ25lZCBhbGxvd19sdm1ldGFkX2V4dGVuc2lvbnMpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICp2Z247CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJY29uc3QgY2hhciAqc3RyLCAqZm9ybWF0X3N0ciwgKnN5c3RlbV9pZDsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCA9IE5VTEwsICpsdl9oYXNoID0gTlVMTDsKKwl1bnNpZ25lZCBzY2FuX2RvbmVfb25jZSA9IHVzZV9jYWNoZWRfcHZzOworCXVpbnQ2NF90IHZnc3RhdHVzOworCisJLyogc2tpcCBhbnkgdG9wLWxldmVsIHZhbHVlcyAqLworCWZvciAodmduID0gY2Z0LT5yb290OyAodmduICYmIHZnbi0+dik7IHZnbiA9IHZnbi0+c2liKQorCQk7CisKKwlpZiAoIXZnbikgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgdm9sdW1lIGdyb3VwIGluIGZpbGUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHZnID0gYWxsb2NfdmcoInJlYWRfdmciLCBmaWQtPmZtdC0+Y21kLCB2Z24tPmtleSkpKQorCQlyZXR1cm5fTlVMTDsKKworCS8qCisJICogVGhlIHB2IGhhc2ggbWVtb3Jpc2VzIHRoZSBwdiBzZWN0aW9uIG5hbWVzIC0+IHB2CisJICogc3RydWN0dXJlcy4KKwkgKi8KKwlpZiAoIShwdl9oYXNoID0gZG1faGFzaF9jcmVhdGUoNjQpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwdiBoYXNoIHRhYmxlLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIFRoZSBsdiBoYXNoIG1lbW9yaXNlcyB0aGUgbHYgc2VjdGlvbiBuYW1lcyAtPiBsdgorCSAqIHN0cnVjdHVyZXMuCisJICovCisJaWYgKCEobHZfaGFzaCA9IGRtX2hhc2hfY3JlYXRlKDEwMjQpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBsdiBoYXNoIHRhYmxlLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwl2Z24gPSB2Z24tPmNoaWxkOworCisJLyogQSBiYWNrdXAgZmlsZSBtaWdodCBiZSBhIGJhY2t1cCBvZiBhIGRpZmZlcmVudCBmb3JtYXQgKi8KKwlpZiAoZG1fY29uZmlnX2dldF9zdHIodmduLCAiZm9ybWF0IiwgJmZvcm1hdF9zdHIpICYmCisJICAgICEodmctPm9yaWdpbmFsX2ZtdCA9IGdldF9mb3JtYXRfYnlfbmFtZShmaWQtPmZtdC0+Y21kLCBmb3JtYXRfc3RyKSkpIHsKKwkJbG9nX2Vycm9yKCJVbnJlY29nbmlzZWQgZm9ybWF0ICVzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIiwgZm9ybWF0X3N0ciwgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoZG1fY29uZmlnX2dldF9zdHIodmduLCAibG9ja190eXBlIiwgJnN0cikpIHsKKwkJaWYgKCEodmctPmxvY2tfdHlwZSA9IGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgc3RyKSkpCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIFRoZSBWRyBsb2NrX2FyZ3Mgc3RyaW5nIGlzIGdlbmVyYXRlZCBpbiBsdm1sb2NrZCwgYW5kIHRoZSBjb250ZW50CisJICogZGVwZW5kcyBvbiB0aGUgbG9ja190eXBlLiAgbHZtbG9ja2QgYmVnaW5zIHRoZSBsb2NrX2FyZ3Mgc3RyaW5nCisJICogd2l0aCBhIHZlcnNpb24gbnVtYmVyLCBlLmcuIDEuMC4wLCBmb2xsb3dlZCBieSBhIGNvbG9uLCBmb2xsb3dlZAorCSAqIGJ5IGEgc3RyaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGUgbG9jayBtYW5hZ2VyLiAgVGhlIHN0cmluZyBhZnRlcgorCSAqIHRoZSBjb2xvbiBpcyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gdXNlIHRoZSBsb2NrIG1hbmFnZXIgZm9yIHRoZSBWRy4KKwkgKgorCSAqIEZvciBzYW5sb2NrLCB0aGUgc3RyaW5nIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnRlcm5hbCBMViB1c2VkIHRvIHN0b3JlCisJICogc2FubG9jayBsb2Nrcy4gIGx2bWxvY2tkIG5lZWRzIHRvIGtub3cgd2hlcmUgdGhlIGxvY2tzIGFyZSBsb2NhdGVkCisJICogc28gaXQgY2FuIHBhc3MgdGhhdCBsb2NhdGlvbiB0byBzYW5sb2NrIHdoaWNoIG5lZWRzIHRvIGFjY2VzcyB0aGUgbG9ja3MuCisJICogZS5nLiBsb2NrX2FyZ3MgPSAxLjAuMDpsdm1sb2NrCisJICogbWVhbnMgdGhhdCB0aGUgbG9ja3MgYXJlIGxvY2F0ZWQgb24gdGhlIHRoZSBMViAibHZtbG9jayIuCisJICoKKwkgKiBGb3IgZGxtLCB0aGUgc3RyaW5nIGlzIHRoZSBkbG0gY2x1c3RlciBuYW1lLiAgbHZtbG9ja2QgbmVlZHMgdG8gdXNlCisJICogYSBkbG0gbG9ja3NwYWNlIGluIHRoaXMgY2x1c3RlciB0byB1c2UgdGhlIFZHLgorCSAqIGUuZy4gbG9ja19hcmdzID0gMS4wLjA6Zm9vCisJICogbWVhbnMgdGhhdCB0aGUgaG9zdCBuZWVkcyB0byBiZSBhIG1lbWJlciBvZiB0aGUgY2x1c3RlciAiZm9vIi4KKwkgKgorCSAqIFRoZSBsdm1sb2NrZCBjb2RlIGZvciBlYWNoIHNwZWNpZmljIGxvY2sgbWFuYWdlciBhbHNvIHZhbGlkYXRlcworCSAqIHRoZSBsb2NrX2FyZ3MgYmVmb3JlIHVzaW5nIGl0IHRvIGFjY2VzcyB0aGUgbG9jayBtYW5hZ2VyLgorCSAqLworCWlmIChkbV9jb25maWdfZ2V0X3N0cih2Z24sICJsb2NrX2FyZ3MiLCAmc3RyKSkgeworCQlpZiAoISh2Zy0+bG9ja19hcmdzID0gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCBzdHIpKSkKKwkJCWdvdG8gYmFkOworCX0KKworCWlmICghX3JlYWRfaWQoJnZnLT5pZCwgdmduLCAiaWQiKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgdXVpZCBmb3Igdm9sdW1lIGdyb3VwICVzLiIsIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFfcmVhZF9pbnQzMih2Z24sICJzZXFubyIsICZ2Zy0+c2Vxbm8pKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCAnc2Vxbm8nIGZvciB2b2x1bWUgZ3JvdXAgJXMuIiwKKwkJCSAgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIV9yZWFkX2ZsYWdfY29uZmlnKHZnbiwgJnZnc3RhdHVzLCBWR19GTEFHUykpIHsKKwkJbG9nX2Vycm9yKCJFcnJvciByZWFkaW5nIGZsYWdzIG9mIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICB2Zy0+bmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogQSBzeXN0ZW0gaWQgd2l0aG91dCBXUklURV9MT0NLRUQgaXMgYW4gb2xkIGx2bTEgc3lzdGVtIGlkLgorCSAqLworCWlmIChkbV9jb25maWdfZ2V0X3N0cih2Z24sICJzeXN0ZW1faWQiLCAmc3lzdGVtX2lkKSkgeworCQlpZiAoISh2Z3N0YXR1cyAmIExWTV9XUklURV9MT0NLRUQpKSB7CisJCQlpZiAoISh2Zy0+bHZtMV9zeXN0ZW1faWQgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIE5BTUVfTEVOICsgMSkpKQorCQkJCWdvdG9fYmFkOworCQkJc3RybmNweSh2Zy0+bHZtMV9zeXN0ZW1faWQsIHN5c3RlbV9pZCwgTkFNRV9MRU4pOworCQl9IGVsc2UgaWYgKCEodmctPnN5c3RlbV9pZCA9IGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgc3lzdGVtX2lkKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3lzdGVtX2lkIGluIF9yZWFkX3ZnLiIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwlpZiAodmdzdGF0dXMgJiBMVk1fV1JJVEVfTE9DS0VEKSB7CisJCXZnc3RhdHVzIHw9IExWTV9XUklURTsKKwkJdmdzdGF0dXMgJj0gfkxWTV9XUklURV9MT0NLRUQ7CisJfQorCXZnLT5zdGF0dXMgPSB2Z3N0YXR1czsKKworCWlmICghX3JlYWRfaW50MzIodmduLCAiZXh0ZW50X3NpemUiLCAmdmctPmV4dGVudF9zaXplKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgZXh0ZW50IHNpemUgZm9yIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICB2Zy0+bmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogJ2V4dGVudF9jb3VudCcgYW5kICdmcmVlX2NvdW50JyBnZXQgZmlsbGVkIGluCisJICogaW1wbGljaXRseSB3aGVuIHJlYWRpbmcgaW4gdGhlIHB2J3MgYW5kIGx2J3MuCisJICovCisKKwlpZiAoIV9yZWFkX2ludDMyKHZnbiwgIm1heF9sdiIsICZ2Zy0+bWF4X2x2KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgJ21heF9sdicgZm9yIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICB2Zy0+bmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghX3JlYWRfaW50MzIodmduLCAibWF4X3B2IiwgJnZnLT5tYXhfcHYpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCAnbWF4X3B2JyBmb3Igdm9sdW1lIGdyb3VwICVzLiIsCisJCQkgIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGRtX2NvbmZpZ19nZXRfc3RyKHZnbiwgImFsbG9jYXRpb25fcG9saWN5IiwgJnN0cikpIHsKKwkJdmctPmFsbG9jID0gZ2V0X2FsbG9jX2Zyb21fc3RyaW5nKHN0cik7CisJCWlmICh2Zy0+YWxsb2MgPT0gQUxMT0NfSU5WQUxJRCkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIHVucmVjb2duaXNlZCBhbGxvY2F0aW9uIHBvbGljeSAlcyBmb3IgVkcgJXMiLCBzdHIsIHZnLT5uYW1lKTsKKwkJCXZnLT5hbGxvYyA9IEFMTE9DX05PUk1BTDsKKwkJfQorCX0KKworCWlmIChkbV9jb25maWdfZ2V0X3N0cih2Z24sICJwcm9maWxlIiwgJnN0cikpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBZGRpbmcgcHJvZmlsZSBjb25maWd1cmF0aW9uICVzIGZvciBWRyAlcy4iLCBzdHIsIHZnLT5uYW1lKTsKKwkJdmctPnByb2ZpbGUgPSBhZGRfcHJvZmlsZSh2Zy0+Y21kLCBzdHIsIENPTkZJR19QUk9GSUxFX01FVEFEQVRBKTsKKwkJaWYgKCF2Zy0+cHJvZmlsZSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIGNvbmZpZ3VyYXRpb24gcHJvZmlsZSAlcyBmb3IgVkcgJXMiLCBzdHIsIHZnLT5uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJaWYgKCFfcmVhZF91aW50MzIodmduLCAibWV0YWRhdGFfY29waWVzIiwgJnZnLT5tZGFfY29waWVzKSkgeworCQl2Zy0+bWRhX2NvcGllcyA9IERFRkFVTFRfVkdNRVRBREFUQUNPUElFUzsKKwl9CisKKwlpZiAoIV9yZWFkX3NlY3Rpb25zKGZpZCwgInBoeXNpY2FsX3ZvbHVtZXMiLCBfcmVhZF9wdiwgdmcsCisJCQkgICAgdmduLCBwdl9oYXNoLCBsdl9oYXNoLCAwLCAmc2Nhbl9kb25lX29uY2UpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBhbGwgcGh5c2ljYWwgdm9sdW1lcyBmb3Igdm9sdW1lICIKKwkJCSAgImdyb3VwICVzLiIsIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGFsbG93X2x2bWV0YWRfZXh0ZW5zaW9ucykKKwkJX3JlYWRfc2VjdGlvbnMoZmlkLCAib3V0ZGF0ZWRfcHZzIiwgX3JlYWRfcHYsIHZnLAorCQkJICAgICAgIHZnbiwgcHZfaGFzaCwgbHZfaGFzaCwgMSwgJnNjYW5fZG9uZV9vbmNlKTsKKwllbHNlIGlmIChkbV9jb25maWdfaGFzX25vZGUodmduLCAib3V0ZGF0ZWRfcHZzIikpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5leHBlY3RlZCBvdXRkYXRlZF9wdnMgc2VjdGlvbiBpbiBtZXRhZGF0YSBvZiBWRyAlcy4iLCB2Zy0+bmFtZSk7CisKKwkvKiBPcHRpb25hbCB0YWdzICovCisJaWYgKGRtX2NvbmZpZ19nZXRfbGlzdCh2Z24sICJ0YWdzIiwgJmN2KSAmJgorCSAgICAhKF9yZWFkX3N0cl9saXN0KHZnLT52Z21lbSwgJnZnLT50YWdzLCBjdikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCB0YWdzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIiwgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIV9yZWFkX3NlY3Rpb25zKGZpZCwgImxvZ2ljYWxfdm9sdW1lcyIsIF9yZWFkX2x2bmFtZXMsIHZnLAorCQkJICAgIHZnbiwgcHZfaGFzaCwgbHZfaGFzaCwgMSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIGFsbCBsb2dpY2FsIHZvbHVtZSBuYW1lcyBmb3Igdm9sdW1lICIKKwkJCSAgImdyb3VwICVzLiIsIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFfcmVhZF9zZWN0aW9ucyhmaWQsICJoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lcyIsIF9yZWFkX2hpc3RvcmljYWxfbHZuYW1lcywgdmcsCisJCQkgICAgdmduLCBwdl9oYXNoLCBsdl9oYXNoLCAxLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgYWxsIGhpc3RvcmljYWwgbG9naWNhbCB2b2x1bWVzIGZvciB2b2x1bWUgIgorCQkJICAiZ3JvdXAgJXMuIiwgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIV9yZWFkX3NlY3Rpb25zKGZpZCwgImxvZ2ljYWxfdm9sdW1lcyIsIF9yZWFkX2x2c2VncywgdmcsCisJCQkgICAgdmduLCBwdl9oYXNoLCBsdl9oYXNoLCAxLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgYWxsIGxvZ2ljYWwgdm9sdW1lcyBmb3IgIgorCQkJICAidm9sdW1lIGdyb3VwICVzLiIsIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFfcmVhZF9zZWN0aW9ucyhmaWQsICJoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lcyIsIF9yZWFkX2hpc3RvcmljYWxfbHZuYW1lc19pbnRlcmNvbm5lY3Rpb25zLAorCQkJICAgIHZnLCB2Z24sIHB2X2hhc2gsIGx2X2hhc2gsIDEsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCBhbGwgcmVtb3ZlZCBsb2dpY2FsIHZvbHVtZSBpbnRlcmNvbm5lY3Rpb25zICIKKwkJCSAgImZvciB2b2x1bWUgZ3JvdXAgJXMuIiwgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIWZpeHVwX2ltcG9ydGVkX21pcnJvcnModmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpeHVwIG1pcnJvciBwb2ludGVycyBhZnRlciBpbXBvcnQgZm9yICIKKwkJCSAgInZvbHVtZSBncm91cCAlcy4iLCB2Zy0+bmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWRtX2hhc2hfZGVzdHJveShwdl9oYXNoKTsKKwlkbV9oYXNoX2Rlc3Ryb3kobHZfaGFzaCk7CisKKwl2Z19zZXRfZmlkKHZnLCBmaWQpOworCisJLyoKKwkgKiBGaW5pc2hlZC4KKwkgKi8KKwlyZXR1cm4gdmc7CisKKyAgICAgIGJhZDoKKwlpZiAocHZfaGFzaCkKKwkJZG1faGFzaF9kZXN0cm95KHB2X2hhc2gpOworCisJaWYgKGx2X2hhc2gpCisJCWRtX2hhc2hfZGVzdHJveShsdl9oYXNoKTsKKworCXJlbGVhc2VfdmcodmcpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfcmVhZF9kZXNjKHN0cnVjdCBkbV9wb29sICptZW0sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgdGltZV90ICp3aGVuLCBjaGFyICoqZGVzYykKK3sKKwljb25zdCBjaGFyICpzdHI7CisJdW5zaWduZWQgaW50IHUgPSAwdTsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoY2Z0LT5yb290LCAiZGVzY3JpcHRpb24iLCAmc3RyKSkKKwkJc3RyID0gIiI7CisKKwkqZGVzYyA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgc3RyKTsKKworCSh2b2lkKSBkbV9jb25maWdfZ2V0X3VpbnQzMihjZnQtPnJvb3QsICJjcmVhdGlvbl90aW1lIiwgJnUpOworCSp3aGVuID0gdTsKK30KKworLyoKKyAqIEl0IGlzIHVzZWQgdG8gcmVhZCB2Z3N1bW1hcnkgaW5mb3JtYXRpb24gYWJvdXQgYSBWRworICogYmVmb3JlIGxvY2tpbmcgYW5kIHJlYWRpbmcgdGhlIFZHIHZpYSB2Z19yZWFkKCkuCisgKiByZWFkX3Znc3VtbWFyeTogcmVhZCBWRyBtZXRhZGF0YSBiZWZvcmUgVkcgaXMgbG9ja2VkCisgKiAgICAgICAgICAgICAgICAgYW5kIHNhdmUgdGhlIGRhdGEgaW4gc3RydWN0IHZnc3VtbWFyeQorICogcmVhZF92ZzogcmVhZCBWRyBtZXRhZGF0YSBhZnRlciBWRyBpcyBsb2NrZWQKKyAqICAgICAgICAgIGFuZCBzYXZlIHRoZSBkYXRhIGluIHN0cnVjdCB2b2x1bWVfZ3JvdXAKKyAqIEZJWE1FOiB3aHkgYXJlIHRoZXNlIHNlcGFyYXRlPworICovCitzdGF0aWMgaW50IF9yZWFkX3Znc3VtbWFyeShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIAorCQkJICAgc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSAqdmdzdW1tYXJ5KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqdmduOworCXN0cnVjdCBkbV9wb29sICptZW0gPSBmbXQtPmNtZC0+bWVtOworCWNvbnN0IGNoYXIgKnN0cjsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoY2Z0LT5yb290LCAiY3JlYXRpb25faG9zdCIsICZzdHIpKQorCQlzdHIgPSAiIjsKKworCWlmICghKHZnc3VtbWFyeS0+Y3JlYXRpb25faG9zdCA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgc3RyKSkpCisJCXJldHVybl8wOworCisJLyogc2tpcCBhbnkgdG9wLWxldmVsIHZhbHVlcyAqLworCWZvciAodmduID0gY2Z0LT5yb290OyAodmduICYmIHZnbi0+dik7IHZnbiA9IHZnbi0+c2liKSA7CisKKwlpZiAoIXZnbikgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgdm9sdW1lIGdyb3VwIGluIGZpbGUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHZnc3VtbWFyeS0+dmduYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCB2Z24tPmtleSkpKQorCQlyZXR1cm5fMDsKKworCXZnbiA9IHZnbi0+Y2hpbGQ7CisKKwlpZiAoIV9yZWFkX2lkKCZ2Z3N1bW1hcnktPnZnaWQsIHZnbiwgImlkIikpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHV1aWQgZm9yIHZvbHVtZSBncm91cCAlcy4iLCB2Z3N1bW1hcnktPnZnbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3JlYWRfZmxhZ19jb25maWcodmduLCAmdmdzdW1tYXJ5LT52Z3N0YXR1cywgVkdfRkxBR1MpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBzdGF0dXMgZmxhZ3MgZm9yIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICB2Z3N1bW1hcnktPnZnbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9jb25maWdfZ2V0X3N0cih2Z24sICJzeXN0ZW1faWQiLCAmc3RyKSAmJgorCSAgICAoISh2Z3N1bW1hcnktPnN5c3RlbV9pZCA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgc3RyKSkpKQorCQlyZXR1cm5fMDsKKworCWlmIChkbV9jb25maWdfZ2V0X3N0cih2Z24sICJsb2NrX3R5cGUiLCAmc3RyKSAmJgorCSAgICAoISh2Z3N1bW1hcnktPmxvY2tfdHlwZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgc3RyKSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHRleHRfdmdfdmVyc2lvbl9vcHMgX3ZzbjFfb3BzID0geworCS5jaGVja192ZXJzaW9uID0gX3ZzbjFfY2hlY2tfdmVyc2lvbiwKKwkucmVhZF92ZyA9IF9yZWFkX3ZnLAorCS5yZWFkX2Rlc2MgPSBfcmVhZF9kZXNjLAorCS5yZWFkX3Znc3VtbWFyeSA9IF9yZWFkX3Znc3VtbWFyeQorfTsKKworc3RydWN0IHRleHRfdmdfdmVyc2lvbl9vcHMgKnRleHRfdmdfdnNuMV9pbml0KHZvaWQpCit7CisJcmV0dXJuICZfdnNuMV9vcHM7Cit9CmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3RleHQvbGF5b3V0LmggYi9saWIvZm9ybWF0X3RleHQvbGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhOTM1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC9sYXlvdXQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1RFWFRfTEFZT1VUX0gKKyNkZWZpbmUgX0xWTV9URVhUX0xBWU9VVF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAidXVpZC5oIgorCisvKiBkaXNrX2xvY24gYW5kIGRhdGFfYXJlYV9saXN0IGFyZSBkZWZpbmVkIGluIGZvcm1hdC10ZXh0LmggKi8KKworLyoKKyAqIFBWIGhlYWRlciBleHRlbnNpb24gdmVyc2lvbnM6CisgKiAgIC0gdmVyc2lvbiAxOiBib290bG9hZGVyIGFyZWEgc3VwcG9ydAorICogICAtIHZlcnNpb24gMjogUFZfRVhUX1VTRUQgZmxhZyBzdXBwb3J0CisgKi8KKyNkZWZpbmUgUFZfSEVBREVSX0VYVEVOU0lPTl9WU04gMgorCitzdHJ1Y3QgcHZfaGVhZGVyX2V4dGVuc2lvbiB7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBmbGFnczsKKwkvKiBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBib290bG9hZGVyIGFyZWFzICovCisJc3RydWN0IGRpc2tfbG9jbiBib290bG9hZGVyX2FyZWFzX3hsWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZpZWxkcyB3aXRoIHRoZSBzdWZmaXggX3hsIHNob3VsZCBiZSB4bGF0ZSdkIHdoZXJldmVyIHRoZXkgYXBwZWFyICovCisvKiBPbiBkaXNrICovCitzdHJ1Y3QgcHZfaGVhZGVyIHsKKwlpbnQ4X3QgcHZfdXVpZFtJRF9MRU5dOworCisJLyogVGhpcyBzaXplIGNhbiBiZSBvdmVycmlkZGVuIGlmIFBWIGJlbG9uZ3MgdG8gYSBWRyAqLworCXVpbnQ2NF90IGRldmljZV9zaXplX3hsOwkvKiBCeXRlcyAqLworCisJLyogTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgZGF0YSBhcmVhcyBmb2xsb3dlZCBieSAqLworCS8qIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIG1ldGFkYXRhIGFyZWEgaGVhZGVycyAqLworCXN0cnVjdCBkaXNrX2xvY24gZGlza19hcmVhc194bFswXTsJLyogVHdvIGxpc3RzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIElnbm9yZSB0aGlzIHJhdyBsb2NhdGlvbi4gIFRoaXMgYWxsb3dzIHVzIHRvCisgKiBpZ25vcmVkIG1ldGFkYXRhIGFyZWFzIGVhc2lseSwgYW5kIHRodXMgYmFsYW5jZQorICogbWV0YWRhdGEgYWNyb3NzIFZHcyB3aXRoIG1hbnkgUFZzLgorICovCisjZGVmaW5lIFJBV19MT0NOX0lHTk9SRUQgMHgwMDAwMDAwMQorCisvKiBPbiBkaXNrICovCitzdHJ1Y3QgcmF3X2xvY24geworCXVpbnQ2NF90IG9mZnNldDsJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHN0YXJ0IHNlY3RvciAqLworCXVpbnQ2NF90IHNpemU7CQkvKiBCeXRlcyAqLworCXVpbnQzMl90IGNoZWNrc3VtOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2ludCBybG9jbl9pc19pZ25vcmVkKGNvbnN0IHN0cnVjdCByYXdfbG9jbiAqcmxvY24pOwordm9pZCBybG9jbl9zZXRfaWdub3JlZChzdHJ1Y3QgcmF3X2xvY24gKnJsb2NuLCB1bnNpZ25lZCBtZGFfaWdub3JlZCk7CisKKy8qIE9uIGRpc2sgKi8KKy8qIFN0cnVjdHVyZSBzaXplIGxpbWl0ZWQgdG8gb25lIHNlY3RvciAqLworc3RydWN0IG1kYV9oZWFkZXIgeworCXVpbnQzMl90IGNoZWNrc3VtX3hsOwkvKiBDaGVja3N1bSBvZiByZXN0IG9mIG1kYV9oZWFkZXIgKi8KKwlpbnQ4X3QgbWFnaWNbMTZdOwkvKiBUbyBhaWQgc2NhbnMgZm9yIG1ldGFkYXRhICovCisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50NjRfdCBzdGFydDsJCS8qIEFic29sdXRlIHN0YXJ0IGJ5dGUgb2YgbWRhX2hlYWRlciAqLworCXVpbnQ2NF90IHNpemU7CQkvKiBTaXplIG9mIG1ldGFkYXRhIGFyZWEgKi8KKworCXN0cnVjdCByYXdfbG9jbiByYXdfbG9jbnNbMF07CS8qIE5VTEwtdGVybWluYXRlZCBsaXN0ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1kYV9oZWFkZXIgKnJhd19yZWFkX21kYV9oZWFkZXIoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXJlYSAqZGV2X2FyZWEpOworCitzdHJ1Y3QgbWRhX2xpc3RzIHsKKwlzdHJ1Y3QgZG1fbGlzdCBkaXJzOworCXN0cnVjdCBkbV9saXN0IHJhd3M7CisJc3RydWN0IG1ldGFkYXRhX2FyZWFfb3BzICpmaWxlX29wczsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYV9vcHMgKnJhd19vcHM7Cit9OworCitzdHJ1Y3QgbWRhX2NvbnRleHQgeworCXN0cnVjdCBkZXZpY2VfYXJlYSBhcmVhOworCXVpbnQ2NF90IGZyZWVfc2VjdG9yczsKKwlzdHJ1Y3QgcmF3X2xvY24gcmxvY247CS8qIFN0b3JlIGluYmV0d2VlbiB3cml0ZSBhbmQgY29tbWl0ICovCit9OworCisvKiBGSVhNRSBDb252ZXJ0IHRoaXMgYXQgcnVudGltZSAqLworI2RlZmluZSBGTVRUX01BR0lDICJcMDQwXDExNFwxMjZcMTE1XDA2MlwwNDBcMTcwXDEzM1wwNjVcMTAxXDA0NVwxNjJcMDYwXDExNlwwNTJcMDc2IgorI2RlZmluZSBGTVRUX1ZFUlNJT04gMQorI2RlZmluZSBNREFfSEVBREVSX1NJWkUgNTEyCisjZGVmaW5lIExWTTJfTEFCRUwgIkxWTTIgMDAxIgorI2RlZmluZSBNREFfU0laRV9NSU4gKDggKiAodW5zaWduZWQpIGx2bV9nZXRwYWdlc2l6ZSgpKQorCitpbnQgdmduYW1lX2Zyb21fbWRhKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LCBzdHJ1Y3QgbWRhX2hlYWRlciAqbWRhaCwKKwkJICAgIHN0cnVjdCBkZXZpY2VfYXJlYSAqZGV2X2FyZWEsIHN0cnVjdCBsdm1jYWNoZV92Z3N1bW1hcnkgKnZnc3VtbWFyeSwKKwkJICAgIHVpbnQ2NF90ICptZGFfZnJlZV9zZWN0b3JzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3RleHQvdGV4dF9leHBvcnQuaCBiL2xpYi9mb3JtYXRfdGV4dC90ZXh0X2V4cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGMyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3RleHQvdGV4dF9leHBvcnQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVEVYVF9FWFBPUlRfSAorI2RlZmluZSBfTFZNX1RFWFRfRVhQT1JUX0gKKworI2RlZmluZSBvdXRzaXplKGFyZ3MuLi4pIGRvIHtpZiAoIW91dF9zaXplKGFyZ3MpKSByZXR1cm5fMDt9IHdoaWxlICgwKQorI2RlZmluZSBvdXRoaW50KGFyZ3MuLi4pIGRvIHtpZiAoIW91dF9oaW50KGFyZ3MpKSByZXR1cm5fMDt9IHdoaWxlICgwKQorI2RlZmluZSBvdXRmYyhhcmdzLi4uKSBkbyB7aWYgKCFvdXRfdGV4dF93aXRoX2NvbW1lbnQoYXJncykpIHJldHVybl8wO30gd2hpbGUgKDApCisjZGVmaW5lIG91dGYoYXJncy4uLikgZG8ge2lmICghb3V0X3RleHQoYXJncykpIHJldHVybl8wO30gd2hpbGUgKDApCisjZGVmaW5lIG91dGZnbyhhcmdzLi4uKSBkbyB7aWYgKCFvdXRfdGV4dChhcmdzKSkgZ290b19vdXQ7fSB3aGlsZSAoMCkKKyNkZWZpbmUgb3V0bmwoZikgZG8ge2lmICghb3V0X25ld2xpbmUoZikpIHJldHVybl8wO30gd2hpbGUgKDApCisjZGVmaW5lIG91dG5sZ28oZikgZG8ge2lmICghb3V0X25ld2xpbmUoZikpIGdvdG9fb3V0O30gd2hpbGUgKDApCisKK3N0cnVjdCBmb3JtYXR0ZXI7CitzdHJ1Y3QgbHZfc2VnbWVudDsKK3N0cnVjdCBkbV9jb25maWdfbm9kZTsKKworaW50IG91dF9zaXplKHN0cnVjdCBmb3JtYXR0ZXIgKmYsIHVpbnQ2NF90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworCitpbnQgb3V0X2hpbnQoc3RydWN0IGZvcm1hdHRlciAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisKK2ludCBvdXRfdGV4dChzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKKworaW50IG91dF9jb25maWdfbm9kZShzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuKTsKKworaW50IG91dF9hcmVhcyhzdHJ1Y3QgZm9ybWF0dGVyICpmLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUpOworCitpbnQgb3V0X3RleHRfd2l0aF9jb21tZW50KHN0cnVjdCBmb3JtYXR0ZXIgKmYsIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworCit2b2lkIG91dF9pbmNfaW5kZW50KHN0cnVjdCBmb3JtYXR0ZXIgKmYpOwordm9pZCBvdXRfZGVjX2luZGVudChzdHJ1Y3QgZm9ybWF0dGVyICpmKTsKK2ludCBvdXRfbmV3bGluZShzdHJ1Y3QgZm9ybWF0dGVyICpmKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZm9ybWF0X3RleHQvdGV4dF9pbXBvcnQuaCBiL2xpYi9mb3JtYXRfdGV4dC90ZXh0X2ltcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDMzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZm9ybWF0X3RleHQvdGV4dF9pbXBvcnQuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVEVYVF9JTVBPUlRfSAorI2RlZmluZSBfTFZNX1RFWFRfSU1QT1JUX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3N0cnVjdCBkbV9oYXNoX3RhYmxlOworc3RydWN0IGx2X3NlZ21lbnQ7CitzdHJ1Y3QgZG1fY29uZmlnX25vZGU7CisKK2ludCB0ZXh0X2ltcG9ydF9hcmVhcyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdiwgc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2gsCisJCSAgICAgIHVpbnQ2NF90IHN0YXR1cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2Zvcm1hdF90ZXh0L3RleHRfbGFiZWwuYyBiL2xpYi9mb3JtYXRfdGV4dC90ZXh0X2xhYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkZmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mb3JtYXRfdGV4dC90ZXh0X2xhYmVsLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZm9ybWF0LXRleHQuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJsYWJlbC5oIgorI2luY2x1ZGUgInhsYXRlLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIGludCBfdGV4dF9jYW5faGFuZGxlKHN0cnVjdCBsYWJlbGxlciAqbCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICB2b2lkICpidWYsCisJCQkgICAgdWludDY0X3Qgc2VjdG9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBsYWJlbF9oZWFkZXIgKmxoID0gKHN0cnVjdCBsYWJlbF9oZWFkZXIgKikgYnVmOworCisJaWYgKCFzdHJuY21wKChjaGFyICopbGgtPnR5cGUsIExWTTJfTEFCRUwsIHNpemVvZihsaC0+dHlwZSkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgX2RsX3NldHVwX2JhdG9uIHsKKwlzdHJ1Y3QgZGlza19sb2NuICpwdmhfZGxvY25feGw7CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RhdGljIGludCBfZGFfc2V0dXAoc3RydWN0IGRpc2tfbG9jbiAqZGEsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBfZGxfc2V0dXBfYmF0b24gKnAgPSBiYXRvbjsKKwlwLT5wdmhfZGxvY25feGwtPm9mZnNldCA9IHhsYXRlNjQoZGEtPm9mZnNldCk7CisJcC0+cHZoX2Rsb2NuX3hsLT5zaXplID0geGxhdGU2NChkYS0+c2l6ZSk7CisJcC0+cHZoX2Rsb2NuX3hsKys7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2JhX3NldHVwKHN0cnVjdCBkaXNrX2xvY24gKmJhLCB2b2lkICpiYXRvbikKK3sKKwlyZXR1cm4gX2RhX3NldHVwKGJhLCBiYXRvbik7Cit9CisKK3N0YXRpYyBpbnQgX21kYV9zZXR1cChzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX2RsX3NldHVwX2JhdG9uICpwID0gYmF0b247CisJc3RydWN0IG1kYV9jb250ZXh0ICptZGFjID0gKHN0cnVjdCBtZGFfY29udGV4dCAqKSBtZGEtPm1ldGFkYXRhX2xvY247CisKKwlpZiAobWRhYy0+YXJlYS5kZXYgIT0gcC0+ZGV2KQorCQlyZXR1cm4gMTsKKworCXAtPnB2aF9kbG9jbl94bC0+b2Zmc2V0ID0geGxhdGU2NChtZGFjLT5hcmVhLnN0YXJ0KTsKKwlwLT5wdmhfZGxvY25feGwtPnNpemUgPSB4bGF0ZTY0KG1kYWMtPmFyZWEuc2l6ZSk7CisJcC0+cHZoX2Rsb2NuX3hsKys7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZGxfbnVsbF90ZXJtaW5hdGlvbih2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX2RsX3NldHVwX2JhdG9uICpwID0gYmF0b247CisKKwlwLT5wdmhfZGxvY25feGwtPm9mZnNldCA9IHhsYXRlNjQoVUlOVDY0X0MoMCkpOworCXAtPnB2aF9kbG9jbl94bC0+c2l6ZSA9IHhsYXRlNjQoVUlOVDY0X0MoMCkpOworCXAtPnB2aF9kbG9jbl94bCsrOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfd3JpdGUoc3RydWN0IGxhYmVsICpsYWJlbCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBsYWJlbF9oZWFkZXIgKmxoID0gKHN0cnVjdCBsYWJlbF9oZWFkZXIgKikgYnVmOworCXN0cnVjdCBwdl9oZWFkZXIgKnB2aGRyOworCXN0cnVjdCBwdl9oZWFkZXJfZXh0ZW5zaW9uICpwdmhkcl9leHQ7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IF9kbF9zZXR1cF9iYXRvbiBiYXRvbjsKKwljaGFyIGJ1ZmZlcls2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWludCBiYTEsIGRhMSwgbWRhMSwgbWRhMjsKKworCS8qCisJICogUFYgaGVhZGVyIGJhc2UKKwkgKi8KKwkvKiBGSVhNRSBNb3ZlIHRvIHdoZXJlIGxhYmVsIGlzIGNyZWF0ZWQgKi8KKwlzdHJuY3B5KGxhYmVsLT50eXBlLCBMVk0yX0xBQkVMLCBzaXplb2YobGFiZWwtPnR5cGUpKTsKKworCXN0cm5jcHkoKGNoYXIgKilsaC0+dHlwZSwgbGFiZWwtPnR5cGUsIHNpemVvZihsYWJlbC0+dHlwZSkpOworCisJcHZoZHIgPSAoc3RydWN0IHB2X2hlYWRlciAqKSAoKGNoYXIgKikgYnVmICsgeGxhdGUzMihsaC0+b2Zmc2V0X3hsKSk7CisJaW5mbyA9IChzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqKSBsYWJlbC0+aW5mbzsKKwlwdmhkci0+ZGV2aWNlX3NpemVfeGwgPSB4bGF0ZTY0KGx2bWNhY2hlX2RldmljZV9zaXplKGluZm8pKTsKKwltZW1jcHkocHZoZHItPnB2X3V1aWQsICZsdm1jYWNoZV9kZXZpY2UoaW5mbyktPnB2aWQsIHNpemVvZihzdHJ1Y3QgaWQpKTsKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkICopcHZoZHItPnB2X3V1aWQsIGJ1ZmZlciwKKwkJCSAgICAgc2l6ZW9mKGJ1ZmZlcikpKSB7CisJCXN0YWNrOworCQlidWZmZXJbMF0gPSAnXDAnOworCX0KKworCWJhdG9uLmRldiA9IGx2bWNhY2hlX2RldmljZShpbmZvKTsKKwliYXRvbi5wdmhfZGxvY25feGwgPSAmcHZoZHItPmRpc2tfYXJlYXNfeGxbMF07CisKKwkvKiBMaXN0IG9mIGRhdGEgYXJlYXMgKGhvbGRpbmcgUEVzKSAqLworCWx2bWNhY2hlX2ZvcmVhY2hfZGEoaW5mbywgX2RhX3NldHVwLCAmYmF0b24pOworCV9kbF9udWxsX3Rlcm1pbmF0aW9uKCZiYXRvbik7CisKKwkvKiBMaXN0IG9mIG1ldGFkYXRhIGFyZWEgaGVhZGVyIGxvY2F0aW9ucyAqLworCWx2bWNhY2hlX2ZvcmVhY2hfbWRhKGluZm8sIF9tZGFfc2V0dXAsICZiYXRvbik7CisJX2RsX251bGxfdGVybWluYXRpb24oJmJhdG9uKTsKKworCS8qCisJICogUFYgaGVhZGVyIGV4dGVuc2lvbgorCSAqLworCXB2aGRyX2V4dCA9IChzdHJ1Y3QgcHZfaGVhZGVyX2V4dGVuc2lvbiAqKSAoKGNoYXIgKikgYmF0b24ucHZoX2Rsb2NuX3hsKTsKKwlwdmhkcl9leHQtPnZlcnNpb24gPSB4bGF0ZTMyKFBWX0hFQURFUl9FWFRFTlNJT05fVlNOKTsKKwlwdmhkcl9leHQtPmZsYWdzID0geGxhdGUzMihsdm1jYWNoZV9leHRfZmxhZ3MoaW5mbykpOworCisJLyogTGlzdCBvZiBib290bG9hZGVyIGFyZWEgbG9jYXRpb25zICovCisJYmF0b24ucHZoX2Rsb2NuX3hsID0gJnB2aGRyX2V4dC0+Ym9vdGxvYWRlcl9hcmVhc194bFswXTsKKwlsdm1jYWNoZV9mb3JlYWNoX2JhKGluZm8sIF9iYV9zZXR1cCwgJmJhdG9uKTsKKwlfZGxfbnVsbF90ZXJtaW5hdGlvbigmYmF0b24pOworCisJLyogQ3JlYXRlIGRlYnVnIG1lc3NhZ2Ugd2l0aCBiYSwgZGEgYW5kIG1kYSBsb2NhdGlvbnMgKi8KKwliYTEgPSAoeGxhdGU2NChwdmhkcl9leHQtPmJvb3Rsb2FkZXJfYXJlYXNfeGxbMF0ub2Zmc2V0KSB8fAorCSAgICAgICB4bGF0ZTY0KHB2aGRyX2V4dC0+Ym9vdGxvYWRlcl9hcmVhc194bFswXS5zaXplKSkgPyAwIDogLTE7CisKKwlkYTEgPSAoeGxhdGU2NChwdmhkci0+ZGlza19hcmVhc194bFswXS5vZmZzZXQpIHx8CisJICAgICAgIHhsYXRlNjQocHZoZHItPmRpc2tfYXJlYXNfeGxbMF0uc2l6ZSkpID8gMCA6IC0xOworCisJbWRhMSA9IGRhMSArIDI7CisJbWRhMiA9IG1kYTEgKyAxOworCQorCWlmICgheGxhdGU2NChwdmhkci0+ZGlza19hcmVhc194bFttZGExXS5vZmZzZXQpICYmCisJICAgICF4bGF0ZTY0KHB2aGRyLT5kaXNrX2FyZWFzX3hsW21kYTFdLnNpemUpKQorCQltZGExID0gbWRhMiA9IDA7CisJZWxzZSBpZiAoIXhsYXRlNjQocHZoZHItPmRpc2tfYXJlYXNfeGxbbWRhMl0ub2Zmc2V0KSAmJgorCQkgIXhsYXRlNjQocHZoZHItPmRpc2tfYXJlYXNfeGxbbWRhMl0uc2l6ZSkpCisJCW1kYTIgPSAwOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCIlczogUHJlcGFyaW5nIFBWIGxhYmVsIGhlYWRlciAlcyBzaXplICUiIFBSSXU2NCAiIHdpdGgiCisJCQkgICAiJXMlLioiIFBSSXU2NCAiJXMlLioiIFBSSXU2NCAiJXMiCisJCQkgICAiJXMlLioiIFBSSXU2NCAiJXMlLioiIFBSSXU2NCAiJXMiCisJCQkgICAiJXMlLioiIFBSSXU2NCAiJXMlLioiIFBSSXU2NCAiJXMiCisJCQkgICAiJXMlLioiIFBSSXU2NCAiJXMlLioiIFBSSXU2NCAiJXMiLAorCQkJICAgZGV2X25hbWUobHZtY2FjaGVfZGV2aWNlKGluZm8pKSwgYnVmZmVyLCBsdm1jYWNoZV9kZXZpY2Vfc2l6ZShpbmZvKSwKKwkJCSAgIChiYTEgPiAtMSkgPyAiIGJhMSAoIiA6ICIiLAorCQkJICAgKGJhMSA+IC0xKSA/IDEgOiAwLAorCQkJICAgKGJhMSA+IC0xKSA/IHhsYXRlNjQocHZoZHJfZXh0LT5ib290bG9hZGVyX2FyZWFzX3hsW2JhMV0ub2Zmc2V0KSA+PiBTRUNUT1JfU0hJRlQgOiAwLAorCQkJICAgKGJhMSA+IC0xKSA/ICJzLCAiIDogIiIsCisJCQkgICAoYmExID4gLTEpID8gMSA6IDAsCisJCQkgICAoYmExID4gLTEpID8geGxhdGU2NChwdmhkcl9leHQtPmJvb3Rsb2FkZXJfYXJlYXNfeGxbYmExXS5zaXplKSA+PiBTRUNUT1JfU0hJRlQgOiAwLAorCQkJICAgKGJhMSA+IC0xKSA/ICJzKSIgOiAiIiwKKwkJCSAgIChkYTEgPiAtMSkgPyAiIGRhMSAoIiA6ICIiLAorCQkJICAgKGRhMSA+IC0xKSA/IDEgOiAwLAorCQkJICAgKGRhMSA+IC0xKSA/IHhsYXRlNjQocHZoZHItPmRpc2tfYXJlYXNfeGxbZGExXS5vZmZzZXQpID4+IFNFQ1RPUl9TSElGVCA6IDAsCisJCQkgICAoZGExID4gLTEpID8gInMsICIgOiAiIiwKKwkJCSAgIChkYTEgPiAtMSkgPyAxIDogMCwKKwkJCSAgIChkYTEgPiAtMSkgPyB4bGF0ZTY0KHB2aGRyLT5kaXNrX2FyZWFzX3hsW2RhMV0uc2l6ZSkgPj4gU0VDVE9SX1NISUZUIDogMCwKKwkJCSAgIChkYTEgPiAtMSkgPyAicykiIDogIiIsCisJCQkgICBtZGExID8gIiBtZGExICgiIDogIiIsCisJCQkgICBtZGExID8gMSA6IDAsCisJCQkgICBtZGExID8geGxhdGU2NChwdmhkci0+ZGlza19hcmVhc194bFttZGExXS5vZmZzZXQpID4+IFNFQ1RPUl9TSElGVCA6IDAsCisJCQkgICBtZGExID8gInMsICIgOiAiIiwKKwkJCSAgIG1kYTEgPyAxIDogMCwKKwkJCSAgIG1kYTEgPyB4bGF0ZTY0KHB2aGRyLT5kaXNrX2FyZWFzX3hsW21kYTFdLnNpemUpID4+IFNFQ1RPUl9TSElGVCA6IDAsCisJCQkgICBtZGExID8gInMpIiA6ICIiLAorCQkJICAgbWRhMiA/ICIgbWRhMiAoIiA6ICIiLAorCQkJICAgbWRhMiA/IDEgOiAwLAorCQkJICAgbWRhMiA/IHhsYXRlNjQocHZoZHItPmRpc2tfYXJlYXNfeGxbbWRhMl0ub2Zmc2V0KSA+PiBTRUNUT1JfU0hJRlQgOiAwLAorCQkJICAgbWRhMiA/ICJzLCAiIDogIiIsCisJCQkgICBtZGEyID8gMSA6IDAsCisJCQkgICBtZGEyID8geGxhdGU2NChwdmhkci0+ZGlza19hcmVhc194bFttZGEyXS5zaXplKSA+PiBTRUNUT1JfU0hJRlQgOiAwLAorCQkJICAgbWRhMiA/ICJzKSIgOiAiIik7CisKKwlpZiAoZGExIDwgMCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIGxhYmVsIGhlYWRlciBjdXJyZW50bHkgcmVxdWlyZXMgIgorCQkJICAiYSBkYXRhIGFyZWEuIiwgZGV2X25hbWUobHZtY2FjaGVfZGV2aWNlKGluZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgYWRkX2RhKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpkYXMsCisJICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGRhdGFfYXJlYV9saXN0ICpkYWw7CisKKwlpZiAoIW1lbSkgeworCQlpZiAoIShkYWwgPSBkbV9tYWxsb2Moc2l6ZW9mKCpkYWwpKSkpIHsKKwkJCWxvZ19lcnJvcigic3RydWN0IGRhdGFfYXJlYV9saXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKGRhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKmRhbCkpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJ1Y3QgZGF0YV9hcmVhX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZGFsLT5kaXNrX2xvY24ub2Zmc2V0ID0gc3RhcnQ7CisJZGFsLT5kaXNrX2xvY24uc2l6ZSA9IHNpemU7CisKKwlkbV9saXN0X2FkZChkYXMsICZkYWwtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZGVsX2RhcyhzdHJ1Y3QgZG1fbGlzdCAqZGFzKQoreworCXN0cnVjdCBkbV9saXN0ICpkYWgsICp0bXA7CisJc3RydWN0IGRhdGFfYXJlYV9saXN0ICpkYTsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGRhaCwgdG1wLCBkYXMpIHsKKwkJZGEgPSBkbV9saXN0X2l0ZW0oZGFoLCBzdHJ1Y3QgZGF0YV9hcmVhX2xpc3QpOworCQlkbV9saXN0X2RlbCgmZGEtPmxpc3QpOworCQlkbV9mcmVlKGRhKTsKKwl9Cit9CisKK2ludCBhZGRfYmEoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKmVhcywKKwkgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3Qgc2l6ZSkKK3sKKwlyZXR1cm4gYWRkX2RhKG1lbSwgZWFzLCBzdGFydCwgc2l6ZSk7Cit9CisKK3ZvaWQgZGVsX2JhcyhzdHJ1Y3QgZG1fbGlzdCAqYmFzKQoreworCWRlbF9kYXMoYmFzKTsKK30KKworLyogRklYTUU6IHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24gd2l0aCBvdGhlciBtZGEgY29uc3RydWN0b3IgY29kZSAqLworaW50IGFkZF9tZGEoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICptZGFzLAorCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplLCB1bnNpZ25lZCBpZ25vcmVkKQoreworLyogRklYTUUgTGlzdCBzaXplIHJlc3RyaWN0ZWQgYnkgcHZfaGVhZGVyIFNFQ1RPUl9TSVpFICovCisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYWw7CisJc3RydWN0IG1kYV9saXN0cyAqbWRhX2xpc3RzID0gKHN0cnVjdCBtZGFfbGlzdHMgKikgZm10LT5wcml2YXRlOworCXN0cnVjdCBtZGFfY29udGV4dCAqbWRhYzsKKworCWlmICghbWVtKSB7CisJCWlmICghKG1kYWwgPSBkbV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZXRhZGF0YV9hcmVhKSkpKSB7CisJCQlsb2dfZXJyb3IoInN0cnVjdCBtZGFfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIShtZGFjID0gZG1fbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWRhX2NvbnRleHQpKSkpIHsKKwkJCWxvZ19lcnJvcigic3RydWN0IG1kYV9jb250ZXh0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCQlkbV9mcmVlKG1kYWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShtZGFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgbWV0YWRhdGFfYXJlYSkpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJ1Y3QgbWRhX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCEobWRhYyA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IG1kYV9jb250ZXh0KSkpKSB7CisJCQlsb2dfZXJyb3IoInN0cnVjdCBtZGFfY29udGV4dCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwltZGFsLT5vcHMgPSBtZGFfbGlzdHMtPnJhd19vcHM7CisJbWRhbC0+bWV0YWRhdGFfbG9jbiA9IG1kYWM7CisJbWRhbC0+c3RhdHVzID0gMDsKKworCW1kYWMtPmFyZWEuZGV2ID0gZGV2OworCW1kYWMtPmFyZWEuc3RhcnQgPSBzdGFydDsKKwltZGFjLT5hcmVhLnNpemUgPSBzaXplOworCW1kYWMtPmZyZWVfc2VjdG9ycyA9IFVJTlQ2NF9DKDApOworCW1lbXNldCgmbWRhYy0+cmxvY24sIDAsIHNpemVvZihtZGFjLT5ybG9jbikpOworCW1kYV9zZXRfaWdub3JlZChtZGFsLCBpZ25vcmVkKTsKKworCWRtX2xpc3RfYWRkKG1kYXMsICZtZGFsLT5saXN0KTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkZWxfbWRhcyhzdHJ1Y3QgZG1fbGlzdCAqbWRhcykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbWRhaCwgKnRtcDsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUobWRhaCwgdG1wLCBtZGFzKSB7CisJCW1kYSA9IGRtX2xpc3RfaXRlbShtZGFoLCBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSk7CisJCWRtX2ZyZWUobWRhLT5tZXRhZGF0YV9sb2NuKTsKKwkJZG1fbGlzdF9kZWwoJm1kYS0+bGlzdCk7CisJCWRtX2ZyZWUobWRhKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfaW5pdGlhbGlzZV9sYWJlbChzdHJ1Y3QgbGFiZWxsZXIgKmwgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICBzdHJ1Y3QgbGFiZWwgKmxhYmVsKQoreworCXN0cm5jcHkobGFiZWwtPnR5cGUsIExWTTJfTEFCRUwsIHNpemVvZihsYWJlbC0+dHlwZSkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBfdXBkYXRlX21kYV9iYXRvbiB7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJc3RydWN0IGxhYmVsICpsYWJlbDsKK307CisKK3N0YXRpYyBpbnQgX3VwZGF0ZV9tZGEoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IF91cGRhdGVfbWRhX2JhdG9uICpwID0gYmF0b247CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQgPSBwLT5sYWJlbC0+bGFiZWxsZXItPmZtdDsKKwlzdHJ1Y3QgbWRhX2NvbnRleHQgKm1kYWMgPSAoc3RydWN0IG1kYV9jb250ZXh0ICopIG1kYS0+bWV0YWRhdGFfbG9jbjsKKwlzdHJ1Y3QgbWRhX2hlYWRlciAqbWRhaDsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdzdW1tYXJ5IHZnc3VtbWFyeSA9IHsgMCB9OworCisJLyoKKwkgKiBVc2luZyB0aGUgbGFiZWxsZXIgc3RydWN0IHRvIHByZXNlcnZlIGluZm8gYWJvdXQKKwkgKiB0aGUgbGFzdCBwYXJzZWQgdmduYW1lLCB2Z2lkLCBjcmVhdGlvbiBob3N0CisJICoKKwkgKiBUT0RPOiBtYWtlIGx2bWNhY2hlIHNtYXJ0ZXIgYW5kIG1vdmUgdGhpcyBjYWNoZSBsb2dpYyB0aGVyZQorCSAqLworCisJaWYgKCFkZXZfb3Blbl9yZWFkb25seShtZGFjLT5hcmVhLmRldikpIHsKKwkJbWRhX3NldF9pZ25vcmVkKG1kYSwgMSk7CisJCXN0YWNrOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShtZGFoID0gcmF3X3JlYWRfbWRhX2hlYWRlcihmbXQsICZtZGFjLT5hcmVhKSkpIHsKKwkJc3RhY2s7CisJCWdvdG8gY2xvc2VfZGV2OworCX0KKworCW1kYV9zZXRfaWdub3JlZChtZGEsIHJsb2NuX2lzX2lnbm9yZWQobWRhaC0+cmF3X2xvY25zKSk7CisKKwlpZiAobWRhX2lzX2lnbm9yZWQobWRhKSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIklnbm9yaW5nIG1kYSBvbiBkZXZpY2UgJXMgYXQgb2Zmc2V0ICUiUFJJdTY0LAorCQkJCSAgIGRldl9uYW1lKG1kYWMtPmFyZWEuZGV2KSwKKwkJCQkgICBtZGFjLT5hcmVhLnN0YXJ0KTsKKwkJaWYgKCFkZXZfY2xvc2UobWRhYy0+YXJlYS5kZXYpKQorCQkJc3RhY2s7CisJCXJldHVybiAxOworCX0KKworCWlmICh2Z25hbWVfZnJvbV9tZGEoZm10LCBtZGFoLCAmbWRhYy0+YXJlYSwgJnZnc3VtbWFyeSwKKwkJCSAgICAgJm1kYWMtPmZyZWVfc2VjdG9ycykgJiYKKwkgICAgIWx2bWNhY2hlX3VwZGF0ZV92Z25hbWVfYW5kX2lkKHAtPmluZm8sICZ2Z3N1bW1hcnkpKSB7CisJCWlmICghZGV2X2Nsb3NlKG1kYWMtPmFyZWEuZGV2KSkKKwkJCXN0YWNrOworCQlyZXR1cm5fMDsKKwl9CisKK2Nsb3NlX2RldjoKKwlpZiAoIWRldl9jbG9zZShtZGFjLT5hcmVhLmRldikpCisJCXN0YWNrOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RleHRfcmVhZChzdHJ1Y3QgbGFiZWxsZXIgKmwsIHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqYnVmLAorCQkgc3RydWN0IGxhYmVsICoqbGFiZWwpCit7CisJc3RydWN0IGxhYmVsX2hlYWRlciAqbGggPSAoc3RydWN0IGxhYmVsX2hlYWRlciAqKSBidWY7CisJc3RydWN0IHB2X2hlYWRlciAqcHZoZHI7CisJc3RydWN0IHB2X2hlYWRlcl9leHRlbnNpb24gKnB2aGRyX2V4dDsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZGlza19sb2NuICpkbG9jbl94bDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDMyX3QgZXh0X3ZlcnNpb247CisJc3RydWN0IF91cGRhdGVfbWRhX2JhdG9uIGJhdG9uOworCisJLyoKKwkgKiBQViBoZWFkZXIgYmFzZQorCSAqLworCXB2aGRyID0gKHN0cnVjdCBwdl9oZWFkZXIgKikgKChjaGFyICopIGJ1ZiArIHhsYXRlMzIobGgtPm9mZnNldF94bCkpOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2FkZChsLCAoY2hhciAqKXB2aGRyLT5wdl91dWlkLCBkZXYsCisJCQkJICBGTVRfVEVYVF9PUlBIQU5fVkdfTkFNRSwKKwkJCQkgIEZNVF9URVhUX09SUEhBTl9WR19OQU1FLCAwKSkpCisJCXJldHVybl8wOworCisJKmxhYmVsID0gbHZtY2FjaGVfZ2V0X2xhYmVsKGluZm8pOworCisJbHZtY2FjaGVfc2V0X2RldmljZV9zaXplKGluZm8sIHhsYXRlNjQocHZoZHItPmRldmljZV9zaXplX3hsKSk7CisKKwlsdm1jYWNoZV9kZWxfZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9tZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9iYXMoaW5mbyk7CisKKwkvKiBEYXRhIGFyZWFzIGhvbGRpbmcgdGhlIFBFcyAqLworCWRsb2NuX3hsID0gcHZoZHItPmRpc2tfYXJlYXNfeGw7CisJd2hpbGUgKChvZmZzZXQgPSB4bGF0ZTY0KGRsb2NuX3hsLT5vZmZzZXQpKSkgeworCQlsdm1jYWNoZV9hZGRfZGEoaW5mbywgb2Zmc2V0LCB4bGF0ZTY0KGRsb2NuX3hsLT5zaXplKSk7CisJCWRsb2NuX3hsKys7CisJfQorCisJLyogTWV0YWRhdGEgYXJlYSBoZWFkZXJzICovCisJZGxvY25feGwrKzsKKwl3aGlsZSAoKG9mZnNldCA9IHhsYXRlNjQoZGxvY25feGwtPm9mZnNldCkpKSB7CisJCWx2bWNhY2hlX2FkZF9tZGEoaW5mbywgZGV2LCBvZmZzZXQsIHhsYXRlNjQoZGxvY25feGwtPnNpemUpLCAwKTsKKwkJZGxvY25feGwrKzsKKwl9CisKKwlkbG9jbl94bCsrOworCisJLyoKKwkgKiBQViBoZWFkZXIgZXh0ZW5zaW9uCisJICovCisJcHZoZHJfZXh0ID0gKHN0cnVjdCBwdl9oZWFkZXJfZXh0ZW5zaW9uICopICgoY2hhciAqKSBkbG9jbl94bCk7CisJaWYgKCEoZXh0X3ZlcnNpb24gPSB4bGF0ZTMyKHB2aGRyX2V4dC0+dmVyc2lvbikpKQorCQlnb3RvIG91dDsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiJXM6IFBWIGhlYWRlciBleHRlbnNpb24gdmVyc2lvbiAlIiBQUkl1MzIgIiBmb3VuZCIsCisJCQkgICBkZXZfbmFtZShkZXYpLCBleHRfdmVyc2lvbik7CisKKwkvKiBFeHRlbnNpb24gdmVyc2lvbiAqLworCWx2bWNhY2hlX3NldF9leHRfdmVyc2lvbihpbmZvLCB4bGF0ZTMyKHB2aGRyX2V4dC0+dmVyc2lvbikpOworCisJLyogRXh0ZW5zaW9uIGZsYWdzICovCisJbHZtY2FjaGVfc2V0X2V4dF9mbGFncyhpbmZvLCB4bGF0ZTMyKHB2aGRyX2V4dC0+ZmxhZ3MpKTsKKworCS8qIEJvb3Rsb2FkZXIgYXJlYXMgKi8KKwlkbG9jbl94bCA9IHB2aGRyX2V4dC0+Ym9vdGxvYWRlcl9hcmVhc194bDsKKwl3aGlsZSAoKG9mZnNldCA9IHhsYXRlNjQoZGxvY25feGwtPm9mZnNldCkpKSB7CisJCWx2bWNhY2hlX2FkZF9iYShpbmZvLCBvZmZzZXQsIHhsYXRlNjQoZGxvY25feGwtPnNpemUpKTsKKwkJZGxvY25feGwrKzsKKwl9CitvdXQ6CisJYmF0b24uaW5mbyA9IGluZm87CisJYmF0b24ubGFiZWwgPSAqbGFiZWw7CisKKwlsdm1jYWNoZV9mb3JlYWNoX21kYShpbmZvLCBfdXBkYXRlX21kYSwgJmJhdG9uKTsKKwlsdm1jYWNoZV9tYWtlX3ZhbGlkKGluZm8pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF90ZXh0X2Rlc3Ryb3lfbGFiZWwoc3RydWN0IGxhYmVsbGVyICpsIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBsYWJlbCAqbGFiZWwpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8gPSAoc3RydWN0IGx2bWNhY2hlX2luZm8gKikgbGFiZWwtPmluZm87CisKKwlsdm1jYWNoZV9kZWxfbWRhcyhpbmZvKTsKKwlsdm1jYWNoZV9kZWxfZGFzKGluZm8pOworCWx2bWNhY2hlX2RlbF9iYXMoaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIF9mbXRfdGV4dF9kZXN0cm95KHN0cnVjdCBsYWJlbGxlciAqbCkKK3sKKwlkbV9mcmVlKGwpOworfQorCitzdHJ1Y3QgbGFiZWxfb3BzIF90ZXh0X29wcyA9IHsKKwkuY2FuX2hhbmRsZSA9IF90ZXh0X2Nhbl9oYW5kbGUsCisJLndyaXRlID0gX3RleHRfd3JpdGUsCisJLnJlYWQgPSBfdGV4dF9yZWFkLAorCS52ZXJpZnkgPSBfdGV4dF9jYW5faGFuZGxlLAorCS5pbml0aWFsaXNlX2xhYmVsID0gX3RleHRfaW5pdGlhbGlzZV9sYWJlbCwKKwkuZGVzdHJveV9sYWJlbCA9IF90ZXh0X2Rlc3Ryb3lfbGFiZWwsCisJLmRlc3Ryb3kgPSBfZm10X3RleHRfZGVzdHJveSwKK307CisKK3N0cnVjdCBsYWJlbGxlciAqdGV4dF9sYWJlbGxlcl9jcmVhdGUoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQpCit7CisJc3RydWN0IGxhYmVsbGVyICpsOworCisJaWYgKCEobCA9IGRtX3phbGxvYyhzaXplb2YoKmwpKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBsYWJlbGxlciBvYmplY3QuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWwtPm9wcyA9ICZfdGV4dF9vcHM7CisJbC0+Zm10ID0gZm10OworCisJcmV0dXJuIGw7Cit9CmRpZmYgLS1naXQgYS9saWIvZnJlZXNlZy9mcmVlc2VnLmMgYi9saWIvZnJlZXNlZy9mcmVlc2VnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyMjYxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9mcmVlc2VnL2ZyZWVzZWcuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorCitzdGF0aWMgdm9pZCBfZnJlZXNlZ19kZXN0cm95KHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUpCit7CisJZG1fZnJlZShzZWd0eXBlKTsKK30KKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX2ZyZWVzZWdfb3BzID0geworCS5kZXN0cm95ID0gX2ZyZWVzZWdfZGVzdHJveSwKK307CisKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfZnJlZV9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSk7CisKKwlpZiAoIXNlZ3R5cGUpCisJCXJldHVybl9OVUxMOworCisJc2VndHlwZS0+b3BzID0gJl9mcmVlc2VnX29wczsKKwlzZWd0eXBlLT5uYW1lID0gU0VHX1RZUEVfTkFNRV9GUkVFOworCXNlZ3R5cGUtPmZsYWdzID0gU0VHX1ZJUlRVQUwgfCBTRUdfQ0FOTk9UX0JFX1pFUk9FRDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIiwgc2VndHlwZS0+bmFtZSk7CisKKwlyZXR1cm4gc2VndHlwZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sYWJlbC9sYWJlbC5jIGIvbGliL2xhYmVsL2xhYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyY2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sYWJlbC9sYWJlbC5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAiY3JjLmgiCisjaW5jbHVkZSAieGxhdGUuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogRklYTUUgQWxsb3cgZm9yIGxhcmdlciBsYWJlbHM/ICBSZXN0cmljdGVkIHRvIHNpbmdsZSBzZWN0b3IgY3VycmVudGx5ICovCisKKy8qCisgKiBJbnRlcm5hbCBsYWJlbGxlciBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBsYWJlbGxlcl9pIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJc3RydWN0IGxhYmVsbGVyICpsOworCWNoYXIgbmFtZVswXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1fbGlzdCBfbGFiZWxsZXJzOworCitzdGF0aWMgc3RydWN0IGxhYmVsbGVyX2kgKl9hbGxvY19saShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbGFiZWxsZXIgKmwpCit7CisJc3RydWN0IGxhYmVsbGVyX2kgKmxpOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzaXplb2YoKmxpKSArIHN0cmxlbihuYW1lKSArIDE7CisKKwlpZiAoIShsaSA9IGRtX21hbGxvYyhsZW4pKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbGFiZWxsZXIgbGlzdCBvYmplY3QuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxpLT5sID0gbDsKKwlzdHJjcHkobGktPm5hbWUsIG5hbWUpOworCisJcmV0dXJuIGxpOworfQorCitpbnQgbGFiZWxfaW5pdCh2b2lkKQoreworCWRtX2xpc3RfaW5pdCgmX2xhYmVsbGVycyk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbGFiZWxfZXhpdCh2b2lkKQoreworCXN0cnVjdCBsYWJlbGxlcl9pICpsaSwgKnRsaTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGxpLCB0bGksICZfbGFiZWxsZXJzKSB7CisJCWRtX2xpc3RfZGVsKCZsaS0+bGlzdCk7CisJCWxpLT5sLT5vcHMtPmRlc3Ryb3kobGktPmwpOworCQlkbV9mcmVlKGxpKTsKKwl9CisKKwlkbV9saXN0X2luaXQoJl9sYWJlbGxlcnMpOworfQorCitpbnQgbGFiZWxfcmVnaXN0ZXJfaGFuZGxlcihzdHJ1Y3QgbGFiZWxsZXIgKmhhbmRsZXIpCit7CisJc3RydWN0IGxhYmVsbGVyX2kgKmxpOworCisJaWYgKCEobGkgPSBfYWxsb2NfbGkoaGFuZGxlci0+Zm10LT5uYW1lLCBoYW5kbGVyKSkpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9hZGQoJl9sYWJlbGxlcnMsICZsaS0+bGlzdCk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBsYWJlbGxlciAqbGFiZWxfZ2V0X2hhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbGFiZWxsZXJfaSAqbGk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGksICZfbGFiZWxsZXJzKQorCQlpZiAoIXN0cmNtcChsaS0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gbGktPmw7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX3VwZGF0ZV9sdm1jYWNoZV9vcnBoYW4oc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx2bWNhY2hlX3Znc3VtbWFyeSB2Z3N1bW1hcnlfb3JwaGFuID0geworCQkudmduYW1lID0gbHZtY2FjaGVfZm10KGluZm8pLT5vcnBoYW5fdmdfbmFtZSwKKwl9OworCisgICAgICAgIG1lbWNweSgmdmdzdW1tYXJ5X29ycGhhbi52Z2lkLCBsdm1jYWNoZV9mbXQoaW5mbyktPm9ycGhhbl92Z19uYW1lLCBzdHJsZW4obHZtY2FjaGVfZm10KGluZm8pLT5vcnBoYW5fdmdfbmFtZSkpOworCisJaWYgKCFsdm1jYWNoZV91cGRhdGVfdmduYW1lX2FuZF9pZChpbmZvLCAmdmdzdW1tYXJ5X29ycGhhbikpCisJCXN0YWNrOworfQorCitzdGF0aWMgc3RydWN0IGxhYmVsbGVyICpfZmluZF9sYWJlbGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgICAgdWludDY0X3QgKmxhYmVsX3NlY3RvciwKKwkJCQkgICAgICAgdWludDY0X3Qgc2Nhbl9zZWN0b3IpCit7CisJc3RydWN0IGxhYmVsbGVyX2kgKmxpOworCXN0cnVjdCBsYWJlbGxlciAqciA9IE5VTEw7CisJc3RydWN0IGxhYmVsX2hlYWRlciAqbGg7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJdWludDY0X3Qgc2VjdG9yOworCWludCBmb3VuZCA9IDA7CisJY2hhciByZWFkYnVmW0xBQkVMX1NDQU5fU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKCFkZXZfcmVhZChkZXYsIHNjYW5fc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCwKKwkJICAgICAgTEFCRUxfU0NBTl9TSVpFLCByZWFkYnVmKSkgeworCQlsb2dfZGVidWdfZGV2cygiJXM6IEZhaWxlZCB0byByZWFkIGxhYmVsIGFyZWEiLCBkZXZfbmFtZShkZXYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2NhbiBhIGZldyBzZWN0b3JzIGZvciBhIHZhbGlkIGxhYmVsICovCisJZm9yIChzZWN0b3IgPSAwOyBzZWN0b3IgPCBMQUJFTF9TQ0FOX1NFQ1RPUlM7CisJICAgICBzZWN0b3IgKz0gTEFCRUxfU0laRSA+PiBTRUNUT1JfU0hJRlQpIHsKKwkJbGggPSAoc3RydWN0IGxhYmVsX2hlYWRlciAqKSAocmVhZGJ1ZiArCisJCQkJCSAgICAgIChzZWN0b3IgPDwgU0VDVE9SX1NISUZUKSk7CisKKwkJaWYgKCFzdHJuY21wKChjaGFyICopbGgtPmlkLCBMQUJFTF9JRCwgc2l6ZW9mKGxoLT5pZCkpKSB7CisJCQlpZiAoZm91bmQpIHsKKwkJCQlsb2dfZXJyb3IoIklnbm9yaW5nIGFkZGl0aW9uYWwgbGFiZWwgb24gJXMgYXQgIgorCQkJCQkgICJzZWN0b3IgJSIgUFJJdTY0LCBkZXZfbmFtZShkZXYpLAorCQkJCQkgIHNlY3RvciArIHNjYW5fc2VjdG9yKTsKKwkJCX0KKwkJCWlmICh4bGF0ZTY0KGxoLT5zZWN0b3JfeGwpICE9IHNlY3RvciArIHNjYW5fc2VjdG9yKSB7CisJCQkJbG9nX2luZm8oIiVzOiBMYWJlbCBmb3Igc2VjdG9yICUiIFBSSXU2NAorCQkJCQkgIiBmb3VuZCBhdCBzZWN0b3IgJSIgUFJJdTY0CisJCQkJCSAiIC0gaWdub3JpbmciLCBkZXZfbmFtZShkZXYpLAorCQkJCQkgKHVpbnQ2NF90KXhsYXRlNjQobGgtPnNlY3Rvcl94bCksCisJCQkJCSBzZWN0b3IgKyBzY2FuX3NlY3Rvcik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY2FsY19jcmMoSU5JVElBTF9DUkMsICh1aW50OF90ICopJmxoLT5vZmZzZXRfeGwsIExBQkVMX1NJWkUgLQorCQkJCSAgICAgKCh1aW50OF90ICopICZsaC0+b2Zmc2V0X3hsIC0gKHVpbnQ4X3QgKikgbGgpKSAhPQorCQkJICAgIHhsYXRlMzIobGgtPmNyY194bCkpIHsKKwkJCQlsb2dfaW5mbygiTGFiZWwgY2hlY2tzdW0gaW5jb3JyZWN0IG9uICVzIC0gIgorCQkJCQkgImlnbm9yaW5nIiwgZGV2X25hbWUoZGV2KSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZm91bmQpCisJCQkJY29udGludWU7CisJCX0KKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobGksICZfbGFiZWxsZXJzKSB7CisJCQlpZiAobGktPmwtPm9wcy0+Y2FuX2hhbmRsZShsaS0+bCwgKGNoYXIgKikgbGgsCisJCQkJCQkgICBzZWN0b3IgKyBzY2FuX3NlY3RvcikpIHsKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCIlczogJXMgbGFiZWwgZGV0ZWN0ZWQgYXQgIgorCQkJCQkgICAgICAgICAic2VjdG9yICUiIFBSSXU2NCwgCisJCQkJCQkgZGV2X25hbWUoZGV2KSwgbGktPm5hbWUsCisJCQkJCQkgc2VjdG9yICsgc2Nhbl9zZWN0b3IpOworCQkJCWlmIChmb3VuZCkgeworCQkJCQlsb2dfZXJyb3IoIklnbm9yaW5nIGFkZGl0aW9uYWwgbGFiZWwgIgorCQkJCQkJICAib24gJXMgYXQgc2VjdG9yICUiIFBSSXU2NCwKKwkJCQkJCSAgZGV2X25hbWUoZGV2KSwKKwkJCQkJCSAgc2VjdG9yICsgc2Nhbl9zZWN0b3IpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJciA9IGxpLT5sOworCQkJCW1lbWNweShidWYsIGxoLCBMQUJFTF9TSVpFKTsKKwkJCQlpZiAobGFiZWxfc2VjdG9yKQorCQkJCQkqbGFiZWxfc2VjdG9yID0gc2VjdG9yICsgc2Nhbl9zZWN0b3I7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisgICAgICBvdXQ6CisJaWYgKCFmb3VuZCkgeworCQlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXYtPnB2aWQsIGRldiwgMCkpKQorCQkJX3VwZGF0ZV9sdm1jYWNoZV9vcnBoYW4oaW5mbyk7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiBObyBsYWJlbCBkZXRlY3RlZCIsIGRldl9uYW1lKGRldikpOworCX0KKworCXJldHVybiByOworfQorCisvKiBGSVhNRSBBbHNvIHdpcGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhcmVhIGhlYWRlcnM/ICovCitpbnQgbGFiZWxfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljaGFyIGJ1ZltMQUJFTF9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY2hhciByZWFkYnVmW0xBQkVMX1NDQU5fU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWludCByID0gMTsKKwl1aW50NjRfdCBzZWN0b3I7CisJaW50IHdpcGU7CisJc3RydWN0IGxhYmVsbGVyX2kgKmxpOworCXN0cnVjdCBsYWJlbF9oZWFkZXIgKmxoOworCisJbWVtc2V0KGJ1ZiwgMCwgTEFCRUxfU0laRSk7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJTY2FubmluZyBmb3IgbGFiZWxzIHRvIHdpcGUgZnJvbSAlcyIsIGRldl9uYW1lKGRldikpOworCisJaWYgKCFkZXZfb3BlbihkZXYpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogV2UgZmx1c2ggdGhlIGRldmljZSBqdXN0IGluIGNhc2Ugc29tZW9uZSBpcyBzdHVwaWQKKwkgKiBlbm91Z2ggdG8gYmUgdHJ5aW5nIHRvIGltcG9ydCBhbiBvcGVuIHB2IGludG8gbHZtLgorCSAqLworCWRldl9mbHVzaChkZXYpOworCisJaWYgKCFkZXZfcmVhZChkZXYsIFVJTlQ2NF9DKDApLCBMQUJFTF9TQ0FOX1NJWkUsIHJlYWRidWYpKSB7CisJCWxvZ19kZWJ1Z19kZXZzKCIlczogRmFpbGVkIHRvIHJlYWQgbGFiZWwgYXJlYSIsIGRldl9uYW1lKGRldikpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTY2FuIGZpcnN0IGZldyBzZWN0b3JzIGZvciBhbnl0aGluZyBsb29raW5nIGxpa2UgYSBsYWJlbCAqLworCWZvciAoc2VjdG9yID0gMDsgc2VjdG9yIDwgTEFCRUxfU0NBTl9TRUNUT1JTOworCSAgICAgc2VjdG9yICs9IExBQkVMX1NJWkUgPj4gU0VDVE9SX1NISUZUKSB7CisJCWxoID0gKHN0cnVjdCBsYWJlbF9oZWFkZXIgKikgKHJlYWRidWYgKworCQkJCQkgICAgICAoc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpOworCisJCXdpcGUgPSAwOworCisJCWlmICghc3RybmNtcCgoY2hhciAqKWxoLT5pZCwgTEFCRUxfSUQsIHNpemVvZihsaC0+aWQpKSkgeworCQkJaWYgKHhsYXRlNjQobGgtPnNlY3Rvcl94bCkgPT0gc2VjdG9yKQorCQkJCXdpcGUgPSAxOworCQl9IGVsc2UgeworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGxpLCAmX2xhYmVsbGVycykgeworCQkJCWlmIChsaS0+bC0+b3BzLT5jYW5faGFuZGxlKGxpLT5sLCAoY2hhciAqKSBsaCwKKwkJCQkJCQkgICBzZWN0b3IpKSB7CisJCQkJCXdpcGUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAod2lwZSkgeworCQkJbG9nX2luZm8oIiVzOiBXaXBpbmcgbGFiZWwgYXQgc2VjdG9yICUiIFBSSXU2NCwKKwkJCQkgZGV2X25hbWUoZGV2KSwgc2VjdG9yKTsKKwkJCWlmICghZGV2X3dyaXRlKGRldiwgc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCwgTEFCRUxfU0laRSwKKwkJCQkgICAgICAgYnVmKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBsYWJlbCBmcm9tICVzIGF0ICIKKwkJCQkJICAic2VjdG9yICUiIFBSSXU2NCwgZGV2X25hbWUoZGV2KSwKKwkJCQkJICBzZWN0b3IpOworCQkJCXIgPSAwOworCQkJfQorCQl9CisJfQorCisgICAgICBvdXQ6CisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGxhYmVsX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbGFiZWwgKipyZXN1bHQsCisJCXVpbnQ2NF90IHNjYW5fc2VjdG9yKQoreworCWNoYXIgYnVmW0xBQkVMX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3QgbGFiZWxsZXIgKmw7CisJdWludDY0X3Qgc2VjdG9yOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWludCByID0gMDsKKworCWlmICgoaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGRldi0+cHZpZCwgZGV2LCAxKSkpIHsKKwkJbG9nX2RlYnVnX2RldnMoIlJlYWRpbmcgbGFiZWwgZnJvbSBsdm1jYWNoZSBmb3IgJXMiLCBkZXZfbmFtZShkZXYpKTsKKwkJKnJlc3VsdCA9IGx2bWNhY2hlX2dldF9sYWJlbChpbmZvKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbG9nX2RlYnVnX2RldnMoIlJlYWRpbmcgbGFiZWwgZnJvbSBkZXZpY2UgJXMiLCBkZXZfbmFtZShkZXYpKTsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkgeworCQlzdGFjazsKKworCQlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXYtPnB2aWQsIGRldiwgMCkpKQorCQkJX3VwZGF0ZV9sdm1jYWNoZV9vcnBoYW4oaW5mbyk7CisKKwkJcmV0dXJuIHI7CisJfQorCisJaWYgKChsID0gX2ZpbmRfbGFiZWxsZXIoZGV2LCBidWYsICZzZWN0b3IsIHNjYW5fc2VjdG9yKSkpCisJCWlmICgociA9IChsLT5vcHMtPnJlYWQpKGwsIGRldiwgYnVmLCByZXN1bHQpKSAmJiByZXN1bHQgJiYgKnJlc3VsdCkgeworCQkJKCpyZXN1bHQpLT5kZXYgPSBkZXY7CisJCQkoKnJlc3VsdCktPnNlY3RvciA9IHNlY3RvcjsKKwkJfQorCisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKworLyogQ2FsbGVyIG1heSBuZWVkIHRvIHVzZSBsYWJlbF9nZXRfaGFuZGxlciB0byBjcmVhdGUgbGFiZWwgc3RydWN0ISAqLworaW50IGxhYmVsX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGxhYmVsICpsYWJlbCkKK3sKKwljaGFyIGJ1ZltMQUJFTF9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IGxhYmVsX2hlYWRlciAqbGggPSAoc3RydWN0IGxhYmVsX2hlYWRlciAqKSBidWY7CisJaW50IHIgPSAxOworCisJaWYgKCFsYWJlbC0+bGFiZWxsZXItPm9wcy0+d3JpdGUpIHsKKwkJbG9nX2Vycm9yKCJMYWJlbCBoYW5kbGVyIGRvZXMgbm90IHN1cHBvcnQgbGFiZWwgd3JpdGVzIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoTEFCRUxfU0laRSArIChsYWJlbC0+c2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpID4gTEFCRUxfU0NBTl9TSVpFKSB7CisJCWxvZ19lcnJvcigiTGFiZWwgc2VjdG9yICUiIFBSSXU2NCAiIGJleW9uZCByYW5nZSAoJWxkKSIsCisJCQkgIGxhYmVsLT5zZWN0b3IsIExBQkVMX1NDQU5fU0VDVE9SUyk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChidWYsIDAsIExBQkVMX1NJWkUpOworCisJc3RybmNweSgoY2hhciAqKWxoLT5pZCwgTEFCRUxfSUQsIHNpemVvZihsaC0+aWQpKTsKKwlsaC0+c2VjdG9yX3hsID0geGxhdGU2NChsYWJlbC0+c2VjdG9yKTsKKwlsaC0+b2Zmc2V0X3hsID0geGxhdGUzMihzaXplb2YoKmxoKSk7CisKKwlpZiAoIShsYWJlbC0+bGFiZWxsZXItPm9wcy0+d3JpdGUpKGxhYmVsLCBidWYpKQorCQlyZXR1cm5fMDsKKworCWxoLT5jcmNfeGwgPSB4bGF0ZTMyKGNhbGNfY3JjKElOSVRJQUxfQ1JDLCAodWludDhfdCAqKSZsaC0+b2Zmc2V0X3hsLCBMQUJFTF9TSVpFIC0KKwkJCQkgICAgICAoKHVpbnQ4X3QgKikgJmxoLT5vZmZzZXRfeGwgLSAodWludDhfdCAqKSBsaCkpKTsKKworCWlmICghZGV2X29wZW4oZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfaW5mbygiJXM6IFdyaXRpbmcgbGFiZWwgdG8gc2VjdG9yICUiIFBSSXU2NCAiIHdpdGggc3RvcmVkIG9mZnNldCAlIgorCQkgUFJJdTMyICIuIiwgZGV2X25hbWUoZGV2KSwgbGFiZWwtPnNlY3RvciwKKwkJIHhsYXRlMzIobGgtPm9mZnNldF94bCkpOworCWlmICghZGV2X3dyaXRlKGRldiwgbGFiZWwtPnNlY3RvciA8PCBTRUNUT1JfU0hJRlQsIExBQkVMX1NJWkUsIGJ1ZikpIHsKKwkJbG9nX2RlYnVnX2RldnMoIkZhaWxlZCB0byB3cml0ZSBsYWJlbCB0byAlcyIsIGRldl9uYW1lKGRldikpOworCQlyID0gMDsKKwl9CisKKwlpZiAoIWRldl9jbG9zZShkZXYpKQorCQlzdGFjazsKKworCXJldHVybiByOworfQorCisvKiBVbnVzZWQgKi8KK2ludCBsYWJlbF92ZXJpZnkoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsYWJlbGxlciAqbDsKKwljaGFyIGJ1ZltMQUJFTF9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJdWludDY0X3Qgc2VjdG9yOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWludCByID0gMDsKKworCWlmICghZGV2X29wZW5fcmVhZG9ubHkoZGV2KSkgeworCQlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXYtPnB2aWQsIGRldiwgMCkpKQorCQkJX3VwZGF0ZV9sdm1jYWNoZV9vcnBoYW4oaW5mbyk7CisJCXJldHVybl8wOworCX0KKworCWlmICghKGwgPSBfZmluZF9sYWJlbGxlcihkZXYsIGJ1ZiwgJnNlY3RvciwgVUlOVDY0X0MoMCkpKSkKKwkJZ290byBvdXQ7CisKKwlyID0gbC0+b3BzLT52ZXJpZnkgPyBsLT5vcHMtPnZlcmlmeShsLCBidWYsIHNlY3RvcikgOiAxOworCisgICAgICBvdXQ6CisJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBsYWJlbF9kZXN0cm95KHN0cnVjdCBsYWJlbCAqbGFiZWwpCit7CisJbGFiZWwtPmxhYmVsbGVyLT5vcHMtPmRlc3Ryb3lfbGFiZWwobGFiZWwtPmxhYmVsbGVyLCBsYWJlbCk7CisJZG1fZnJlZShsYWJlbCk7Cit9CisKK3N0cnVjdCBsYWJlbCAqbGFiZWxfY3JlYXRlKHN0cnVjdCBsYWJlbGxlciAqbGFiZWxsZXIpCit7CisJc3RydWN0IGxhYmVsICpsYWJlbDsKKworCWlmICghKGxhYmVsID0gZG1femFsbG9jKHNpemVvZigqbGFiZWwpKSkpIHsKKwkJbG9nX2Vycm9yKCJsYWJlbCBhbGxvY2FjdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGFiZWwtPmxhYmVsbGVyID0gbGFiZWxsZXI7CisKKwlsYWJlbGxlci0+b3BzLT5pbml0aWFsaXNlX2xhYmVsKGxhYmVsbGVyLCBsYWJlbCk7CisKKwlyZXR1cm4gbGFiZWw7Cit9CmRpZmYgLS1naXQgYS9saWIvbGFiZWwvbGFiZWwuaCBiL2xpYi9sYWJlbC9sYWJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNmU1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGFiZWwvbGFiZWwuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0xBQkVMX0gKKyNkZWZpbmUgX0xWTV9MQUJFTF9ICisKKyNpbmNsdWRlICJ1dWlkLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisKKyNkZWZpbmUgTEFCRUxfSUQgIkxBQkVMT05FIgorI2RlZmluZSBMQUJFTF9TSVpFIFNFQ1RPUl9TSVpFCS8qIFRoaW5rIHZlcnkgY2FyZWZ1bGx5IGJlZm9yZSBjaGFuZ2luZyB0aGlzICovCisjZGVmaW5lIExBQkVMX1NDQU5fU0VDVE9SUyA0TAorI2RlZmluZSBMQUJFTF9TQ0FOX1NJWkUgKExBQkVMX1NDQU5fU0VDVE9SUyA8PCBTRUNUT1JfU0hJRlQpCisKK3N0cnVjdCBsYWJlbGxlcjsKKwordm9pZCBhbGxvd19yZWFkc193aXRoX2x2bWV0YWQodm9pZCk7CisKKy8qIE9uIGRpc2sgLSAzMiBieXRlcyAqLworc3RydWN0IGxhYmVsX2hlYWRlciB7CisJaW50OF90IGlkWzhdOwkJLyogTEFCRUxPTkUgKi8KKwl1aW50NjRfdCBzZWN0b3JfeGw7CS8qIFNlY3RvciBudW1iZXIgb2YgdGhpcyBsYWJlbCAqLworCXVpbnQzMl90IGNyY194bDsJLyogRnJvbSBuZXh0IGZpZWxkIHRvIGVuZCBvZiBzZWN0b3IgKi8KKwl1aW50MzJfdCBvZmZzZXRfeGw7CS8qIE9mZnNldCBmcm9tIHN0YXJ0IG9mIHN0cnVjdCB0byBjb250ZW50cyAqLworCWludDhfdCB0eXBlWzhdOwkJLyogTFZNMiAwMDEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJbiBjb3JlICovCitzdHJ1Y3QgbGFiZWwgeworCWNoYXIgdHlwZVs4XTsKKwl1aW50NjRfdCBzZWN0b3I7CisJc3RydWN0IGxhYmVsbGVyICpsYWJlbGxlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCAqaW5mbzsKK307CisKK3N0cnVjdCBsYWJlbGxlcjsKKworc3RydWN0IGxhYmVsX29wcyB7CisJLyoKKwkgKiBJcyB0aGUgZGV2aWNlIGxhYmVsbGVkIHdpdGggdGhpcyBmb3JtYXQgPworCSAqLworCWludCAoKmNhbl9oYW5kbGUpIChzdHJ1Y3QgbGFiZWxsZXIgKiBsLCB2b2lkICpidWYsIHVpbnQ2NF90IHNlY3Rvcik7CisKKwkvKgorCSAqIFdyaXRlIGEgbGFiZWwgdG8gYSB2b2x1bWUuCisJICovCisJaW50ICgqd3JpdGUpIChzdHJ1Y3QgbGFiZWwgKiBsYWJlbCwgdm9pZCAqYnVmKTsKKworCS8qCisJICogUmVhZCBhIGxhYmVsIGZyb20gYSB2b2x1bWUuCisJICovCisJaW50ICgqcmVhZCkgKHN0cnVjdCBsYWJlbGxlciAqIGwsIHN0cnVjdCBkZXZpY2UgKiBkZXYsCisJCSAgICAgdm9pZCAqYnVmLCBzdHJ1Y3QgbGFiZWwgKiogbGFiZWwpOworCisJLyoKKwkgKiBBZGRpdGlvbmFsIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIHBhcmFub2lkLgorCSAqLworCWludCAoKnZlcmlmeSkgKHN0cnVjdCBsYWJlbGxlciAqIGwsIHZvaWQgKmJ1ZiwgdWludDY0X3Qgc2VjdG9yKTsKKworCS8qCisJICogUG9wdWxhdGUgbGFiZWxfdHlwZSBldGMuCisJICovCisJaW50ICgqaW5pdGlhbGlzZV9sYWJlbCkgKHN0cnVjdCBsYWJlbGxlciAqIGwsIHN0cnVjdCBsYWJlbCAqIGxhYmVsKTsKKworCS8qCisJICogRGVzdHJveSBhIHByZXZpb3VzbHkgcmVhZCBsYWJlbC4KKwkgKi8KKwl2b2lkICgqZGVzdHJveV9sYWJlbCkgKHN0cnVjdCBsYWJlbGxlciAqIGwsIHN0cnVjdCBsYWJlbCAqIGxhYmVsKTsKKworCS8qCisJICogRGVzdHJ1Y3Rvci4KKwkgKi8KKwl2b2lkICgqZGVzdHJveSkgKHN0cnVjdCBsYWJlbGxlciAqIGwpOworfTsKKworc3RydWN0IGxhYmVsbGVyIHsKKwlzdHJ1Y3QgbGFiZWxfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7Cit9OworCitpbnQgbGFiZWxfaW5pdCh2b2lkKTsKK3ZvaWQgbGFiZWxfZXhpdCh2b2lkKTsKKworaW50IGxhYmVsX3JlZ2lzdGVyX2hhbmRsZXIoc3RydWN0IGxhYmVsbGVyICpoYW5kbGVyKTsKKworc3RydWN0IGxhYmVsbGVyICpsYWJlbF9nZXRfaGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKworaW50IGxhYmVsX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGxhYmVsX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbGFiZWwgKipyZXN1bHQsCisJCXVpbnQ2NF90IHNjYW5fc2VjdG9yKTsKK2ludCBsYWJlbF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBsYWJlbCAqbGFiZWwpOworaW50IGxhYmVsX3ZlcmlmeShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RydWN0IGxhYmVsICpsYWJlbF9jcmVhdGUoc3RydWN0IGxhYmVsbGVyICpsYWJlbGxlcik7Cit2b2lkIGxhYmVsX2Rlc3Ryb3koc3RydWN0IGxhYmVsICpsYWJlbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmcvLmV4cG9ydGVkX3N5bWJvbHMgYi9saWIvbG9ja2luZy8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJjYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvLmV4cG9ydGVkX3N5bWJvbHMKQEAgLTAsMCArMSw1IEBACitsb2NraW5nX2luaXQKK2xvY2tpbmdfZW5kCitsb2NrX3Jlc291cmNlCitxdWVyeV9yZXNvdXJjZQorcmVzZXRfbG9ja2luZwpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmcvTWFrZWZpbGUuaW4gYi9saWIvbG9ja2luZy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYzODBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVMgPSBjbHVzdGVyX2xvY2tpbmcuYworCitMSUJfU0hBUkVEID0gbGlibHZtMmNsdXN0ZXJsb2NrLiQoTElCX1NVRkZJWCkKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9MVk0pCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitpbnN0YWxsIGluc3RhbGxfY2x1c3RlcjogaW5zdGFsbF9sdm0yX3BsdWdpbgpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmcvY2x1c3Rlcl9sb2NraW5nLmMgYi9saWIvbG9ja2luZy9jbHVzdGVyX2xvY2tpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMxODMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvY2x1c3Rlcl9sb2NraW5nLmMKQEAgLTAsMCArMSw2MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogTG9ja2luZyBmdW5jdGlvbnMgZm9yIExWTS4KKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBwYXJ0IG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHNlcmlhbGlzZSBMVk0KKyAqIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyBhY3Jvc3MgYSBjbHVzdGVyLgorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJjbHZtLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJsb2NraW5nX3R5cGVzLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmbmRlZiBDTFVTVEVSX0xPQ0tJTkdfSU5URVJOQUwKK2ludCBsb2NrX3Jlc291cmNlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpyZXNvdXJjZSwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpOworaW50IHF1ZXJ5X3Jlc291cmNlKGNvbnN0IGNoYXIgKnJlc291cmNlLCBjb25zdCBjaGFyICpub2RlLCBpbnQgKm1vZGUpOwordm9pZCBsb2NraW5nX2VuZCh2b2lkKTsKK2ludCBsb2NraW5nX2luaXQoaW50IHR5cGUsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2YsIHVpbnQzMl90ICpmbGFncyk7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgbHZtX3Jlc3BvbnNlIHsKKwljaGFyIG5vZGVbMjU1XTsKKwljaGFyICpyZXNwb25zZTsKKwlpbnQgc3RhdHVzOworCWludCBsZW47Cit9IGx2bV9yZXNwb25zZV90OworCisvKgorICogVGhpcyBnZXRzIHN0dWNrIGF0IHRoZSBzdGFydCBvZiBtZW1vcnkgd2UgYWxsb2NhdGUgc28gd2UKKyAqIGNhbiBzYW5pdHktY2hlY2sgaXQgYXQgZGVhbGxvY2F0aW9uIHRpbWUKKyAqLworI2RlZmluZSBMVk1fU0lHTkFUVVJFIDB4NDM0QzU2NEQKKworLyoKKyAqIE5PVEU6IHRoZSBMVk1EIHVzZXMgdGhlIHNvY2tldCBGRCBhcyB0aGUgY2xpZW50IElELCB0aGlzIG1lYW5zCisgKiB0aGF0IGFueSBjbGllbnQgdGhhdCBjYWxscyBmb3JrKCkgd2lsbCBpbmhlcml0IHRoZSBjb250ZXh0IG9mCisgKiBpdCdzIHBhcmVudC4KKyAqLworc3RhdGljIGludCBfY2x2bWRfc29jayA9IC0xOworCisvKiBGSVhNRSBJbnN0YWxsIFNJR1BJUEUgaGFuZGxlcj8gKi8KKworLyogT3BlbiBjb25uZWN0aW9uIHRvIHRoZSBDbHVzdGVyIE1hbmFnZXIgZGFlbW9uICovCitzdGF0aWMgaW50IF9vcGVuX2xvY2FsX3NvY2soaW50IHN1cHByZXNzX21lc3NhZ2VzKQoreworCWludCBsb2NhbF9zb2NrZXQ7CisJc3RydWN0IHNvY2thZGRyX3VuIHNvY2thZGRyID0geyAuc3VuX2ZhbWlseSA9IEFGX1VOSVggfTsKKworCWlmICghZG1fc3RybmNweShzb2NrYWRkci5zdW5fcGF0aCwgQ0xWTURfU09DS05BTUUsIHNpemVvZihzb2NrYWRkci5zdW5fcGF0aCkpKSB7CisJCWxvZ19lcnJvcigiJXM6IGNsdm1kIHNvY2tldCBuYW1lIHRvbyBsb25nLiIsIENMVk1EX1NPQ0tOQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE9wZW4gbG9jYWwgc29ja2V0ICovCisJaWYgKChsb2NhbF9zb2NrZXQgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA8IDApIHsKKwkJbG9nX2Vycm9yX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLCAiTG9jYWwgc29ja2V0ICIKKwkJCQkgICAiY3JlYXRpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChjb25uZWN0KGxvY2FsX3NvY2tldCwoc3RydWN0IHNvY2thZGRyICopICZzb2NrYWRkciwKKwkJICAgIHNpemVvZihzb2NrYWRkcikpKSB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCisJCWxvZ19lcnJvcl9zdXBwcmVzcyhzdXBwcmVzc19tZXNzYWdlcywgImNvbm5lY3QoKSBmYWlsZWQgIgorCQkJCSAgICJvbiBsb2NhbCBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGNsb3NlKGxvY2FsX3NvY2tldCkpCisJCQlzdGFjazsKKworCQllcnJubyA9IHNhdmVkX2Vycm5vOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGxvY2FsX3NvY2tldDsKK30KKworLyogU2VuZCBhIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgc3RhdHVzICovCitzdGF0aWMgaW50IF9zZW5kX3JlcXVlc3QoY2hhciAqaW5idWYsIGludCBpbmxlbiwgY2hhciAqKnJldGJ1ZikKK3sKKwljaGFyIG91dGJ1ZltQSVBFX0JVRl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBjbHZtX2hlYWRlciAqb3V0aGVhZGVyID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSBvdXRidWY7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBvZmY7CisJaW50IGJ1ZmxlbjsKKwlpbnQgZXJyOworCisJLyogU2VuZCBpdCB0byBDTFZNRCAqLworIHJld3JpdGU6CisJaWYgKCAoZXJyID0gd3JpdGUoX2Nsdm1kX3NvY2ssIGluYnVmLCBpbmxlbikpICE9IGlubGVuKSB7CisJCWlmIChlcnIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCQlnb3RvIHJld3JpdGU7CisJCWxvZ19lcnJvcigiRXJyb3Igd3JpdGluZyBkYXRhIHRvIGNsdm1kOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCB0aGUgcmVzcG9uc2UgKi8KKyByZXJlYWQ6CisJaWYgKChsZW4gPSByZWFkKF9jbHZtZF9zb2NrLCBvdXRidWYsIHNpemVvZihzdHJ1Y3QgY2x2bV9oZWFkZXIpKSkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWdvdG8gcmVyZWFkOworCQlsb2dfZXJyb3IoIkVycm9yIHJlYWRpbmcgZGF0YSBmcm9tIGNsdm1kOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsZW4gPT0gMCkgeworCQlsb2dfZXJyb3IoIkVPRiByZWFkaW5nIENMVk1EIik7CisJCWVycm5vID0gRU5PVENPTk47CisJCXJldHVybiAwOworCX0KKworCS8qIEFsbG9jYXRlIGJ1ZmZlciAqLworCWJ1ZmxlbiA9IGxlbiArIG91dGhlYWRlci0+YXJnbGVuOworCSpyZXRidWYgPSBkbV9tYWxsb2MoYnVmbGVuKTsKKwlpZiAoISpyZXRidWYpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCXJldHVybiAwOworCX0KKworCS8qIENvcHkgdGhlIGhlYWRlciAqLworCW1lbWNweSgqcmV0YnVmLCBvdXRidWYsIGxlbik7CisJb3V0aGVhZGVyID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSAqcmV0YnVmOworCisJLyogUmVhZCB0aGUgcmV0dXJuZWQgdmFsdWVzICovCisJb2ZmID0gMTsJCS8qIHdlJ3ZlIGFscmVhZHkgcmVhZCB0aGUgZmlyc3QgYnl0ZSAqLworCXdoaWxlIChvZmYgPD0gb3V0aGVhZGVyLT5hcmdsZW4gJiYgbGVuID4gMCkgeworCQlsZW4gPSByZWFkKF9jbHZtZF9zb2NrLCBvdXRoZWFkZXItPmFyZ3MgKyBvZmYsCisJCQkgICBidWZsZW4gLSBvZmYgLSBvZmZzZXRvZihzdHJ1Y3QgY2x2bV9oZWFkZXIsIGFyZ3MpKTsKKwkJaWYgKGxlbiA+IDApCisJCQlvZmYgKz0gbGVuOworCX0KKworCS8qIFdhcyBpdCBhbiBlcnJvciA/ICovCisJaWYgKG91dGhlYWRlci0+c3RhdHVzICE9IDApIHsKKwkJZXJybm8gPSBvdXRoZWFkZXItPnN0YXR1czsKKworCQkvKiBPbmx5IHJldHVybiBhbiBlcnJvciBoZXJlIGlmIHRoZXJlIGFyZSBubyBub2RlLXNwZWNpZmljCisJCSAgIGVycm9ycyBwcmVzZW50IGluIHRoZSBtZXNzYWdlIHRoYXQgbWlnaHQgaGF2ZSBtb3JlIGRldGFpbCAqLworCQlpZiAoIShvdXRoZWFkZXItPmZsYWdzICYgQ0xWTURfRkxBR19OT0RFRVJSUykpIHsKKwkJCWxvZ19lcnJvcigiY2x1c3RlciByZXF1ZXN0IGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KKworCXJldHVybiAxOworfQorCisvKiBCdWlsZCB0aGUgc3RydWN0dXJlIGhlYWRlciBhbmQgcGFyc2Utb3V0IHdpbGRjYXJkIG5vZGUgbmFtZXMgKi8KKy8qIEZJWE1FOiBDbGVhbnVwIGltcGxpY2l0IGNhc3RzIG9mIGNsdm1kX2NtZCAoaW50LCBjaGFyLCB1aW50OF90LCBldGMpLiAqLworc3RhdGljIHZvaWQgX2J1aWxkX2hlYWRlcihzdHJ1Y3QgY2x2bV9oZWFkZXIgKmhlYWQsIGludCBjbHZtZF9jbWQsIGNvbnN0IGNoYXIgKm5vZGUsCisJCQkgIGludCBsZW4pCit7CisJaGVhZC0+Y21kID0gY2x2bWRfY21kOworCWhlYWQtPnN0YXR1cyA9IDA7CisJaGVhZC0+ZmxhZ3MgPSAwOworCWhlYWQtPnhpZCA9IDA7CisJaGVhZC0+Y2xpZW50aWQgPSAwOworCWhlYWQtPmFyZ2xlbiA9IGxlbjsKKworCS8qCisJICogSGFuZGxlIHNwZWNpYWwgbm9kZSBuYW1lcy4KKwkgKi8KKwlpZiAoIW5vZGUgfHwgIXN0cmNtcChub2RlLCBOT0RFX0FMTCkpCisJCWhlYWQtPm5vZGVbMF0gPSAnXDAnOworCWVsc2UgaWYgKCFzdHJjbXAobm9kZSwgTk9ERV9MT0NBTCkpIHsKKwkJaGVhZC0+bm9kZVswXSA9ICdcMCc7CisJCWhlYWQtPmZsYWdzID0gQ0xWTURfRkxBR19MT0NBTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobm9kZSwgTk9ERV9SRU1PVEUpKSB7CisJCWhlYWQtPm5vZGVbMF0gPSAnXDAnOworCQloZWFkLT5mbGFncyA9IENMVk1EX0ZMQUdfUkVNT1RFOworCX0gZWxzZQorCQlzdHJjcHkoaGVhZC0+bm9kZSwgbm9kZSk7Cit9CisKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSB0byBhKG9yIGFsbCkgbm9kZShzKSBpbiB0aGUgY2x1c3RlciBhbmQgd2FpdCBmb3IgcmVwbGllcworICovCitzdGF0aWMgaW50IF9jbHVzdGVyX3JlcXVlc3QoY2hhciBjbHZtZF9jbWQsIGNvbnN0IGNoYXIgKm5vZGUsIHZvaWQgKmRhdGEsIGludCBsZW4sCisJCQkgICBsdm1fcmVzcG9uc2VfdCAqKiByZXNwb25zZSwgaW50ICpudW0pCit7CisJY2hhciBvdXRidWZbc2l6ZW9mKHN0cnVjdCBjbHZtX2hlYWRlcikgKyBsZW4gKyBzdHJsZW4obm9kZSkgKyAxXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY2hhciAqaW5wdHI7CisJY2hhciAqcmV0YnVmID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCWludCBudW1fcmVzcG9uc2VzID0gMDsKKwlzdHJ1Y3QgY2x2bV9oZWFkZXIgKmhlYWQgPSAoc3RydWN0IGNsdm1faGVhZGVyICopIG91dGJ1ZjsKKwlsdm1fcmVzcG9uc2VfdCAqcmFycmF5OworCisJKm51bSA9IDA7CisKKwlpZiAoX2Nsdm1kX3NvY2sgPT0gLTEpCisJCV9jbHZtZF9zb2NrID0gX29wZW5fbG9jYWxfc29jaygwKTsKKworCWlmIChfY2x2bWRfc29jayA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkvKiAxIGJ5dGUgaXMgdXNlZCBmcm9tIHN0cnVjdCBjbHZtX2hlYWRlci5hcmdzWzFdLCBzbyAtPiBsZW4gLSAxICovCisJX2J1aWxkX2hlYWRlcihoZWFkLCBjbHZtZF9jbWQsIG5vZGUsIGxlbiAtIDEpOworCW1lbWNweShoZWFkLT5ub2RlICsgc3RybGVuKGhlYWQtPm5vZGUpICsgMSwgZGF0YSwgbGVuKTsKKworCXN0YXR1cyA9IF9zZW5kX3JlcXVlc3Qob3V0YnVmLCBzaXplb2Yoc3RydWN0IGNsdm1faGVhZGVyKSArCisJCQkgICAgICBzdHJsZW4oaGVhZC0+bm9kZSkgKyBsZW4gLSAxLCAmcmV0YnVmKTsKKwlpZiAoIXN0YXR1cykKKwkJZ290byBvdXQ7CisKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlc3BvbnNlcyB3ZSBnb3QgKi8KKwloZWFkID0gKHN0cnVjdCBjbHZtX2hlYWRlciAqKSByZXRidWY7CisJaW5wdHIgPSBoZWFkLT5hcmdzOworCXdoaWxlIChpbnB0clswXSkgeworCQludW1fcmVzcG9uc2VzKys7CisJCWlucHRyICs9IHN0cmxlbihpbnB0cikgKyAxOworCQlpbnB0ciArPSBzaXplb2YoaW50KTsKKwkJaW5wdHIgKz0gc3RybGVuKGlucHRyKSArIDE7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSByZXNwb25zZSBhcnJheS4KKwkgKiBXaXRoIGFuIGV4dHJhIHBhaXIgb2YgSU5UcyBvbiB0aGUgZnJvbnQgdG8gc2FuaXR5CisJICogY2hlY2sgdGhlIHBvaW50ZXIgd2hlbiB3ZSBhcmUgZ2l2ZW4gaXQgYmFjayB0byBmcmVlCisJICovCisJKnJlc3BvbnNlID0gTlVMTDsKKwlpZiAoIShyYXJyYXkgPSBkbV9tYWxsb2Moc2l6ZW9mKGx2bV9yZXNwb25zZV90KSAqIG51bV9yZXNwb25zZXMpKSkgeworCQllcnJubyA9IEVOT01FTTsKKwkJc3RhdHVzID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVW5wYWNrIHRoZSByZXNwb25zZSBpbnRvIGFuIGx2bV9yZXNwb25zZV90IGFycmF5ICovCisJaW5wdHIgPSBoZWFkLT5hcmdzOworCWkgPSAwOworCXdoaWxlIChpbnB0clswXSkgeworCQlzdHJjcHkocmFycmF5W2ldLm5vZGUsIGlucHRyKTsKKwkJaW5wdHIgKz0gc3RybGVuKGlucHRyKSArIDE7CisKKwkJbWVtY3B5KCZyYXJyYXlbaV0uc3RhdHVzLCBpbnB0ciwgc2l6ZW9mKGludCkpOworCQlpbnB0ciArPSBzaXplb2YoaW50KTsKKworCQlyYXJyYXlbaV0ucmVzcG9uc2UgPSBkbV9tYWxsb2Moc3RybGVuKGlucHRyKSArIDEpOworCQlpZiAocmFycmF5W2ldLnJlc3BvbnNlID09IE5VTEwpIHsKKwkJCS8qIEZyZWUgdXAgZXZlcnl0aGluZyBlbHNlIGFuZCByZXR1cm4gZXJyb3IgKi8KKwkJCWludCBqOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQlkbV9mcmVlKHJhcnJheVtpXS5yZXNwb25zZSk7CisJCQlkbV9mcmVlKHJhcnJheSk7CisJCQllcnJubyA9IEVOT01FTTsKKwkJCXN0YXR1cyA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0cmNweShyYXJyYXlbaV0ucmVzcG9uc2UsIGlucHRyKTsKKwkJcmFycmF5W2ldLmxlbiA9IHN0cmxlbihpbnB0cik7CisJCWlucHRyICs9IHN0cmxlbihpbnB0cikgKyAxOworCQlpKys7CisJfQorCSpudW0gPSBudW1fcmVzcG9uc2VzOworCSpyZXNwb25zZSA9IHJhcnJheTsKKworICAgICAgb3V0OgorCWRtX2ZyZWUocmV0YnVmKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEZyZWUgcmVwbHkgYXJyYXkgKi8KK3N0YXRpYyBpbnQgX2NsdXN0ZXJfZnJlZV9yZXF1ZXN0KGx2bV9yZXNwb25zZV90ICogcmVzcG9uc2UsIGludCBudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJZG1fZnJlZShyZXNwb25zZVtpXS5yZXNwb25zZSk7CisJfQorCisJZG1fZnJlZShyZXNwb25zZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbG9ja19mb3JfY2x1c3RlcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdW5zaWduZWQgY2hhciBjbHZtZF9jbWQsCisJCQkgICAgIHVpbnQzMl90IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lKQoreworCS8qIFRPRE86IGNvbnZlcnQgdG8gZ2xvYmFsIHVzYWJsZSBzb2x1dGlvbiBhbmQgbW92ZSBzdGF0aWMgaW50byBjbWQgKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsYXN0X2Nsdm1kX2NtZCA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwljaGFyICphcmdzOworCWNvbnN0IGNoYXIgKm5vZGUgPSAiIjsKKwlpbnQgbGVuOworCWludCBkbWV2ZW50ZF9tb2RlOworCWludCBzYXZlZF9lcnJubzsKKwlsdm1fcmVzcG9uc2VfdCAqcmVzcG9uc2UgPSBOVUxMOworCWludCBudW1fcmVzcG9uc2VzOworCisJYXNzZXJ0KG5hbWUpOworCisJbGVuID0gc3RybGVuKG5hbWUpICsgMzsKKwlhcmdzID0gYWxsb2NhKGxlbik7CisJc3RyY3B5KGFyZ3MgKyAyLCBuYW1lKTsKKworCS8qIGFyZ3NbMF0gaG9sZHMgYm90dG9tIDggYml0cyBleGNlcHQgTENLX0xPQ0FMICgweDQwKS4gKi8KKwlhcmdzWzBdID0gZmxhZ3MgJiAoTENLX1NDT1BFX01BU0sgfCBMQ0tfVFlQRV9NQVNLIHwgTENLX05PTkJMT0NLIHwgTENLX0hPTEQgfCBMQ0tfQ0xVU1RFUl9WRyk7IAorCisJYXJnc1sxXSA9IDA7CisKKwlpZiAoZmxhZ3MgJiBMQ0tfT1JJR0lOX09OTFkpCisJCWFyZ3NbMV0gfD0gTENLX09SSUdJTl9PTkxZX01PREU7CisKKwlpZiAoZmxhZ3MgJiBMQ0tfUkVWRVJUKQorCQlhcmdzWzFdIHw9IExDS19SRVZFUlRfTU9ERTsKKworCWlmIChtaXJyb3JfaW5fc3luYygpKQorCQlhcmdzWzFdIHw9IExDS19NSVJST1JfTk9TWU5DX01PREU7CisKKwlpZiAodGVzdF9tb2RlKCkpCisJCWFyZ3NbMV0gfD0gTENLX1RFU1RfTU9ERTsKKworCS8qCisJICogV2UgcHJvcGFnYXRlIGRtZXZlbnRkX21vbml0b3JfbW9kZSgpIHRvIGNsdm1kIGZhaXRoZnVsbHksIHNpbmNlCisJICogZG1ldmVudGQgbW9uaXRvcmluZyBpcyB0aWVkIHRvIGFjdGl2YXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgY2x2bWQKKwkgKiB3aGVuIGxvY2tpbmdfdHlwZSA9IDMuCisJICovCisJZG1ldmVudGRfbW9kZSA9IGRtZXZlbnRkX21vbml0b3JfbW9kZSgpOworCWlmIChkbWV2ZW50ZF9tb2RlID09IERNRVZFTlREX01PTklUT1JfSUdOT1JFKQorCQlhcmdzWzFdIHw9IExDS19ETUVWRU5URF9NT05JVE9SX0lHTk9SRTsKKworCWlmIChkbWV2ZW50ZF9tb2RlKQorCQlhcmdzWzFdIHw9IExDS19ETUVWRU5URF9NT05JVE9SX01PREU7CisKKwlpZiAoY21kLT5wYXJ0aWFsX2FjdGl2YXRpb24pCisJCWFyZ3NbMV0gfD0gTENLX1BBUlRJQUxfTU9ERTsKKworCS8qCisJICogVkcgbG9ja3MgYXJlIGp1c3QgdGhhdDogbG9ja3MsIGFuZCBoYXZlIG5vIHNpZGUgZWZmZWN0cworCSAqIHNvIHdlIG9ubHkgbmVlZCB0byBkbyB0aGVtIG9uIHRoZSBsb2NhbCBub2RlIGJlY2F1c2UgYWxsCisJICogbG9ja3MgYXJlIGNsdXN0ZXItd2lkZS4KKwkgKgorCSAqIFBfIGxvY2tzIC9kby8gZ2V0IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgY2x1c3RlciBiZWNhdXNlIHRoZXkgbWlnaHQKKwkgKiBoYXZlIHNpZGUtZWZmZWN0cy4KKwkgKgorCSAqIFNZTkNfTkFNRVMgYW5kIFZHX0JBQ0tVUCB1c2UgdGhlIFZHIG5hbWUgZGlyZWN0bHkgd2l0aG91dCBwcmVmaXguCisJICovCisJaWYgKGNsdm1kX2NtZCA9PSBDTFZNRF9DTURfU1lOQ19OQU1FUykgeworCQlpZiAoZmxhZ3MgJiBMQ0tfTE9DQUwpIHsKKwkJCW5vZGUgPSBOT0RFX0xPQ0FMOworCQkJaWYgKGNsdm1kX2NtZCA9PSBsYXN0X2Nsdm1kX2NtZCkgeworCQkJCWxvZ19kZWJ1ZygiU2tpcHBpbmcgcmVkdW5kYW50IGxvY2FsIHN5bmMgY29tbWFuZC4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoY2x2bWRfY21kICE9IENMVk1EX0NNRF9WR19CQUNLVVApIHsKKwkJaWYgKHN0cm5jbXAobmFtZSwgIlBfIiwgMikgJiYKKwkJICAgIChjbHZtZF9jbWQgPT0gQ0xWTURfQ01EX0xPQ0tfVkcgfHwKKwkJICAgICAoZmxhZ3MgJiBMQ0tfTE9DQUwpIHx8CisJCSAgICAgIShmbGFncyAmIExDS19DTFVTVEVSX1ZHKSkpCisJCQlub2RlID0gTk9ERV9MT0NBTDsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBMQ0tfUkVNT1RFKQorCQkJbm9kZSA9IE5PREVfUkVNT1RFOworCX0KKworCWxhc3RfY2x2bWRfY21kID0gY2x2bWRfY21kOworCXN0YXR1cyA9IF9jbHVzdGVyX3JlcXVlc3QoY2x2bWRfY21kLCBub2RlLCBhcmdzLCBsZW4sCisJCQkJICAmcmVzcG9uc2UsICZudW1fcmVzcG9uc2VzKTsKKworCS8qIElmIGFueSBub2RlcyB3ZXJlIGRvd24gdGhlbiBkaXNwbGF5IHRoZW0gYW5kIHJldHVybiBhbiBlcnJvciAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVzcG9uc2VzOyBpKyspIHsKKwkJaWYgKHJlc3BvbnNlW2ldLnN0YXR1cyA9PSBFSE9TVERPV04pIHsKKwkJCWxvZ19lcnJvcigiY2x2bWQgbm90IHJ1bm5pbmcgb24gbm9kZSAlcyIsCisJCQkJICByZXNwb25zZVtpXS5ub2RlKTsKKwkJCXN0YXR1cyA9IDA7CisJCQllcnJubyA9IHJlc3BvbnNlW2ldLnN0YXR1czsKKwkJfSBlbHNlIGlmIChyZXNwb25zZVtpXS5zdGF0dXMpIHsKKwkJCWxvZ19lcnJvcigiRXJyb3IgbG9ja2luZyBvbiBub2RlICVzOiAlcyIsCisJCQkJICByZXNwb25zZVtpXS5ub2RlLAorCQkJCSAgcmVzcG9uc2VbaV0ucmVzcG9uc2VbMF0gPworCQkJCSAgCXJlc3BvbnNlW2ldLnJlc3BvbnNlIDoKKwkJCQkgIAlzdHJlcnJvcihyZXNwb25zZVtpXS5zdGF0dXMpKTsKKwkJCXN0YXR1cyA9IDA7CisJCQllcnJubyA9IHJlc3BvbnNlW2ldLnN0YXR1czsKKwkJfQorCX0KKworCXNhdmVkX2Vycm5vID0gZXJybm87CisJX2NsdXN0ZXJfZnJlZV9yZXF1ZXN0KHJlc3BvbnNlLCBudW1fcmVzcG9uc2VzKTsKKwllcnJubyA9IHNhdmVkX2Vycm5vOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQVBJIGVudHJ5IHBvaW50IGZvciBMVk0gKi8KKyNpZmRlZiBDTFVTVEVSX0xPQ0tJTkdfSU5URVJOQUwKK3N0YXRpYyBpbnQgX2xvY2tfcmVzb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlc291cmNlLAorCQkJICB1aW50MzJfdCBmbGFncywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKKyNlbHNlCisJaW50IGxvY2tfcmVzb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlc291cmNlLCB1aW50MzJfdCBmbGFncywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKKyNlbmRpZgoreworCWNoYXIgbG9ja25hbWVbUEFUSF9NQVhdOworCWludCBjbHZtZF9jbWQgPSAwOworCWNvbnN0IGNoYXIgKmxvY2tfc2NvcGU7CisJY29uc3QgY2hhciAqbG9ja190eXBlOworCisJYXNzZXJ0KHN0cmxlbihyZXNvdXJjZSkgPCBzaXplb2YobG9ja25hbWUpKTsKKwlhc3NlcnQocmVzb3VyY2UpOworCisJc3dpdGNoIChmbGFncyAmIExDS19TQ09QRV9NQVNLKSB7CisJY2FzZSBMQ0tfQUNUSVZBVElPTjoKKwkJcmV0dXJuIDE7CisJY2FzZSBMQ0tfVkc6CisJCWlmICghc3RyY21wKHJlc291cmNlLCBWR19TWU5DX05BTUVTKSkgeworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiUmVxdWVzdGluZyBzeW5jIG5hbWVzLiIpOworCQkJcmV0dXJuIF9sb2NrX2Zvcl9jbHVzdGVyKGNtZCwgQ0xWTURfQ01EX1NZTkNfTkFNRVMsCisJCQkJCQkgZmxhZ3MgJiB+TENLX0hPTEQsIHJlc291cmNlKTsKKwkJfQorCQlpZiAoZmxhZ3MgPT0gTENLX1ZHX0JBQ0tVUCkgeworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiUmVxdWVzdGluZyBiYWNrdXAgb2YgVkcgbWV0YWRhdGEgZm9yICVzIiwKKwkJCQkJIHJlc291cmNlKTsKKwkJCXJldHVybiBfbG9ja19mb3JfY2x1c3RlcihjbWQsIENMVk1EX0NNRF9WR19CQUNLVVAsCisJCQkJCQkgTENLX0NMVVNURVJfVkcsIHJlc291cmNlKTsKKwkJfQorCisJCS8qIElmIHRoZSBWRyBuYW1lIGlzIGVtcHR5IHRoZW4gbG9jayB0aGUgdW51c2VkIFBWcyAqLworCQlpZiAoZG1fc25wcmludGYobG9ja25hbWUsIHNpemVvZihsb2NrbmFtZSksICIlY18lcyIsCisJCQkJKGlzX29ycGhhbl92ZyhyZXNvdXJjZSkgfHwKKwkJCQkgaXNfZ2xvYmFsX3ZnKHJlc291cmNlKSB8fAorCQkJCSAoZmxhZ3MgJiBMQ0tfQ0FDSEUpKSA/ICAnUCcgOiAnVicsCisJCQkJcmVzb3VyY2UpICA8IDApIHsKKwkJCWxvZ19lcnJvcigiTG9ja2luZyByZXNvdXJjZSAlcyB0b28gbG9uZy4iLCByZXNvdXJjZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxvY2tfc2NvcGUgPSAiVkciOworCQljbHZtZF9jbWQgPSBDTFZNRF9DTURfTE9DS19WRzsKKwkJLyoKKwkJICogT2xkIGNsdm1kIGRvZXMgbm90IGV4cGVjdCBMQ0tfSE9MRCB3aGljaCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQKKwkJICogaW4gbG9ja192b2wsIG1hc2sgaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKwkJICovCisJCWlmIChmbGFncyAhPSBMQ0tfVkdfQ09NTUlUICYmIGZsYWdzICE9IExDS19WR19SRVZFUlQpCisJCQlmbGFncyAmPSB+TENLX0hPTEQ7CisKKwkJYnJlYWs7CisKKwljYXNlIExDS19MVjoKKwkJY2x2bWRfY21kID0gQ0xWTURfQ01EX0xPQ0tfTFY7CisJCXN0cmNweShsb2NrbmFtZSwgcmVzb3VyY2UpOworCQlsb2NrX3Njb3BlID0gIkxWIjsKKwkJZmxhZ3MgJj0gfkxDS19IT0xEOwkvKiBNYXNrIG9mZiBIT0xEIGZsYWcgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlVucmVjb2duaXNlZCBsb2NrIHNjb3BlOiAlZCIsCisJCQkgIGZsYWdzICYgTENLX1NDT1BFX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2goZmxhZ3MgJiBMQ0tfVFlQRV9NQVNLKSB7CisJY2FzZSBMQ0tfVU5MT0NLOgorCQlsb2NrX3R5cGUgPSAiVU4iOworCQlicmVhazsKKwljYXNlIExDS19OVUxMOgorCQlsb2NrX3R5cGUgPSAiTkwiOworCQlicmVhazsKKwljYXNlIExDS19SRUFEOgorCQlsb2NrX3R5cGUgPSAiQ1IiOworCQlicmVhazsKKwljYXNlIExDS19QUkVBRDoKKwkJbG9ja190eXBlID0gIlBSIjsKKwkJYnJlYWs7CisJY2FzZSBMQ0tfV1JJVEU6CisJCWxvY2tfdHlwZSA9ICJQVyI7CisJCWJyZWFrOworCWNhc2UgTENLX0VYQ0w6CisJCWxvY2tfdHlwZSA9ICJFWCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIGxvY2sgdHlwZTogJXUiLAorCQkJICBmbGFncyAmIExDS19UWVBFX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nICVzICVzICVzICglcyVzJXMlcyVzJXMlcyVzJXMpICgweCV4KSIsIGxvY2tfc2NvcGUsIGxvY2tuYW1lLAorCQkJIGxvY2tfdHlwZSwgbG9ja19zY29wZSwKKwkJCSBmbGFncyAmIExDS19OT05CTE9DSyA/ICJ8Tk9OQkxPQ0siIDogIiIsCisJCQkgZmxhZ3MgJiBMQ0tfSE9MRCA/ICJ8SE9MRCIgOiAiIiwKKwkJCSBmbGFncyAmIExDS19DTFVTVEVSX1ZHID8gInxDTFVTVEVSIiA6ICIiLAorCQkJIGZsYWdzICYgTENLX0xPQ0FMID8gInxMT0NBTCIgOiAiIiwKKwkJCSBmbGFncyAmIExDS19SRU1PVEUgPyAifFJFTU9URSIgOiAiIiwKKwkJCSBmbGFncyAmIExDS19DQUNIRSA/ICJ8Q0FDSEUiIDogIiIsCisJCQkgZmxhZ3MgJiBMQ0tfT1JJR0lOX09OTFkgPyAifE9SSUdJTl9PTkxZIiA6ICIiLAorCQkJIGZsYWdzICYgTENLX1JFVkVSVCA/ICJ8UkVWRVJUIiA6ICIiLAorCQkJIGZsYWdzKTsKKworCS8qIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBjbHVzdGVyIG1hbmFnZXIgKi8KKwlyZXR1cm4gX2xvY2tfZm9yX2NsdXN0ZXIoY21kLCBjbHZtZF9jbWQsIGZsYWdzLCBsb2NrbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xvY2tfdHlwZShjb25zdCBjaGFyICpyZXNwb25zZSkKK3sKKwlpZiAoIXJlc3BvbnNlKQorCQlyZXR1cm4gTENLX05VTEw7CisJZWxzZSBpZiAoIXN0cmNtcChyZXNwb25zZSwgIkVYIikpCisJCXJldHVybiBMQ0tfRVhDTDsKKwllbHNlIGlmICghc3RyY21wKHJlc3BvbnNlLCAiQ1IiKSkKKwkJcmV0dXJuIExDS19SRUFEOworCWVsc2UgaWYgKCFzdHJjbXAocmVzcG9uc2UsICJQUiIpKQorCQlyZXR1cm4gTENLX1BSRUFEOworCisJcmV0dXJuXzA7Cit9CisKKyNpZmRlZiBDTFVTVEVSX0xPQ0tJTkdfSU5URVJOQUwKK3N0YXRpYyBpbnQgX3F1ZXJ5X3Jlc291cmNlKGNvbnN0IGNoYXIgKnJlc291cmNlLCBjb25zdCBjaGFyICpub2RlLCBpbnQgKm1vZGUpCisjZWxzZQoraW50IHF1ZXJ5X3Jlc291cmNlKGNvbnN0IGNoYXIgKnJlc291cmNlLCBjb25zdCBjaGFyICpub2RlLCBpbnQgKm1vZGUpCisjZW5kaWYKK3sKKwlpbnQgaSwgc3RhdHVzLCBsZW4sIG51bV9yZXNwb25zZXMsIHNhdmVkX2Vycm5vOworCWNoYXIgKmFyZ3M7CisJbHZtX3Jlc3BvbnNlX3QgKnJlc3BvbnNlID0gTlVMTDsKKworCXNhdmVkX2Vycm5vID0gZXJybm87CisJbGVuID0gc3RybGVuKHJlc291cmNlKSArIDM7CisJYXJncyA9IGFsbG9jYShsZW4pOworCXN0cmNweShhcmdzICsgMiwgcmVzb3VyY2UpOworCisJYXJnc1swXSA9IDA7CisJYXJnc1sxXSA9IDA7CisKKwlzdGF0dXMgPSBfY2x1c3Rlcl9yZXF1ZXN0KENMVk1EX0NNRF9MT0NLX1FVRVJZLCBub2RlLCBhcmdzLCBsZW4sCisJCQkJICAmcmVzcG9uc2UsICZudW1fcmVzcG9uc2VzKTsKKwkqbW9kZSA9IExDS19OVUxMOworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVzcG9uc2VzOyBpKyspIHsKKwkJaWYgKHJlc3BvbnNlW2ldLnN0YXR1cyA9PSBFSE9TVERPV04pCisJCQljb250aW51ZTsKKworCQlpZiAoIXJlc3BvbnNlW2ldLnJlc3BvbnNlWzBdKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQWxsIG5vZGVzIHNob3VsZCB1c2UgQ1IsIG9yIGV4YWN0bHkgb25lIG5vZGUKKwkJICogc2hvdWxkIGhvbGQgRVguIChQUiBpcyBvYnNvbGV0ZSkKKwkJICogSWYgdHdvIG5vZGVzIHJlcG9ydCBkaWZmZXJlbnQgbG9ja3MsCisJCSAqIHNvbWV0aGluZyBpcyBicm9rZW4gLSBqdXN0IHJldHVybiBtb3JlIGltcG9ydGFudCBtb2RlLgorCQkgKi8KKwkJaWYgKGRlY29kZV9sb2NrX3R5cGUocmVzcG9uc2VbaV0ucmVzcG9uc2UpID4gKm1vZGUpCisJCQkqbW9kZSA9IGRlY29kZV9sb2NrX3R5cGUocmVzcG9uc2VbaV0ucmVzcG9uc2UpOworCisJCWxvZ19kZWJ1Z19sb2NraW5nKCJMb2NrIGhlbGQgZm9yICVzLCBub2RlICVzIDogJXMiLCByZXNvdXJjZSwKKwkJCQkgIHJlc3BvbnNlW2ldLm5vZGUsIHJlc3BvbnNlW2ldLnJlc3BvbnNlKTsKKwl9CisKKwlfY2x1c3Rlcl9mcmVlX3JlcXVlc3QocmVzcG9uc2UsIG51bV9yZXNwb25zZXMpOworCWVycm5vID0gc2F2ZWRfZXJybm87CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQ0xVU1RFUl9MT0NLSU5HX0lOVEVSTkFMCitzdGF0aWMgdm9pZCBfbG9ja2luZ19lbmQodm9pZCkKKyNlbHNlCit2b2lkIGxvY2tpbmdfZW5kKHZvaWQpCisjZW5kaWYKK3sKKwlpZiAoX2Nsdm1kX3NvY2sgIT0gLTEgJiYgY2xvc2UoX2Nsdm1kX3NvY2spKQorCQlzdGFjazsKKworCV9jbHZtZF9zb2NrID0gLTE7Cit9CisKKyNpZmRlZiBDTFVTVEVSX0xPQ0tJTkdfSU5URVJOQUwKK3N0YXRpYyB2b2lkIF9yZXNldF9sb2NraW5nKHZvaWQpCisjZWxzZQordm9pZCByZXNldF9sb2NraW5nKHZvaWQpCisjZW5kaWYKK3sKKwlpZiAoY2xvc2UoX2Nsdm1kX3NvY2spKQorCQlzdGFjazsKKworCV9jbHZtZF9zb2NrID0gX29wZW5fbG9jYWxfc29jaygwKTsKKwlpZiAoX2Nsdm1kX3NvY2sgPT0gLTEpCisJCXN0YWNrOworfQorCisjaWZkZWYgQ0xVU1RFUl9MT0NLSU5HX0lOVEVSTkFMCitpbnQgaW5pdF9jbHVzdGVyX2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgaW50IHN1cHByZXNzX21lc3NhZ2VzKQoreworCWxvY2tpbmctPmxvY2tfcmVzb3VyY2UgPSBfbG9ja19yZXNvdXJjZTsKKwlsb2NraW5nLT5xdWVyeV9yZXNvdXJjZSA9IF9xdWVyeV9yZXNvdXJjZTsKKwlsb2NraW5nLT5maW5fbG9ja2luZyA9IF9sb2NraW5nX2VuZDsKKwlsb2NraW5nLT5yZXNldF9sb2NraW5nID0gX3Jlc2V0X2xvY2tpbmc7CisJbG9ja2luZy0+ZmxhZ3MgPSBMQ0tfUFJFX01FTUxPQ0sgfCBMQ0tfQ0xVU1RFUkVEIHwgTENLX1NVUFBPUlRTX1JFTU9URV9RVUVSSUVTOworCisJX2Nsdm1kX3NvY2sgPSBfb3Blbl9sb2NhbF9zb2NrKHN1cHByZXNzX21lc3NhZ2VzKTsKKwlpZiAoX2Nsdm1kX3NvY2sgPT0gLTEpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZWxzZQoraW50IGxvY2tpbmdfaW5pdChpbnQgdHlwZSwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZiwgdWludDMyX3QgKmZsYWdzKQoreworCV9jbHZtZF9zb2NrID0gX29wZW5fbG9jYWxfc29jaygwKTsKKwlpZiAoX2Nsdm1kX3NvY2sgPT0gLTEpCisJCXJldHVybiAwOworCisJLyogQXNrIExWTSB0byBsb2NrIG1lbW9yeSBiZWZvcmUgY2FsbGluZyB1cyAqLworCSpmbGFncyB8PSBMQ0tfUFJFX01FTUxPQ0s7CisJKmZsYWdzIHw9IExDS19DTFVTVEVSRUQ7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmcvZXh0ZXJuYWxfbG9ja2luZy5jIGIvbGliL2xvY2tpbmcvZXh0ZXJuYWxfbG9ja2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWExNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbG9ja2luZy9leHRlcm5hbF9sb2NraW5nLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibG9ja2luZ190eXBlcy5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAic2hhcmVkbGliLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorCitzdGF0aWMgdm9pZCAqX2xvY2tpbmdfbGliID0gTlVMTDsKK3N0YXRpYyB2b2lkICgqX3Jlc2V0X2ZuKSAodm9pZCkgPSBOVUxMOworc3RhdGljIHZvaWQgKCpfZW5kX2ZuKSAodm9pZCkgPSBOVUxMOworc3RhdGljIGludCAoKl9sb2NrX2ZuKSAoc3RydWN0IGNtZF9jb250ZXh0ICogY21kLCBjb25zdCBjaGFyICpyZXNvdXJjZSwKKwkJCXVpbnQzMl90IGZsYWdzKSA9IE5VTEw7CitzdGF0aWMgaW50ICgqX2luaXRfZm4pIChpbnQgdHlwZSwgc3RydWN0IGRtX2NvbmZpZ190cmVlICogY2Z0LAorCQkJdWludDMyX3QgKmZsYWdzKSA9IE5VTEw7CitzdGF0aWMgaW50ICgqX2xvY2tfcXVlcnlfZm4pIChjb25zdCBjaGFyICpyZXNvdXJjZSwgaW50ICptb2RlKSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgX2xvY2tfcmVzb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlc291cmNlLAorCQkJICB1aW50MzJfdCBmbGFncywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoIV9sb2NrX2ZuKQorCQlyZXR1cm4gMDsKKworCWlmICghc3RyY21wKHJlc291cmNlLCBWR19TWU5DX05BTUVTKSkgeworCQkvKiBIaWRlIHRoaXMgbG9jayByZXF1ZXN0IGZyb20gZXh0ZXJuYWwgbG9ja2luZyAqLworCQlmc191bmxvY2soKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIF9sb2NrX2ZuKGNtZCwgcmVzb3VyY2UsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX2Zpbl9leHRlcm5hbF9sb2NraW5nKHZvaWQpCit7CisJaWYgKF9lbmRfZm4pCisJCV9lbmRfZm4oKTsKKworCWRsY2xvc2UoX2xvY2tpbmdfbGliKTsKKworCV9sb2NraW5nX2xpYiA9IE5VTEw7CisJX2luaXRfZm4gPSBOVUxMOworCV9lbmRfZm4gPSBOVUxMOworCV9sb2NrX2ZuID0gTlVMTDsKKwlfcmVzZXRfZm4gPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfcmVzZXRfZXh0ZXJuYWxfbG9ja2luZyh2b2lkKQoreworCWlmIChfcmVzZXRfZm4pCisJCV9yZXNldF9mbigpOworfQorCitpbnQgaW5pdF9leHRlcm5hbF9sb2NraW5nKHN0cnVjdCBsb2NraW5nX3R5cGUgKmxvY2tpbmcsIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpCit7CisJY29uc3QgY2hhciAqbGlibmFtZTsKKworCWlmIChfbG9ja2luZ19saWIpIHsKKwkJbG9nX2Vycm9yX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLCAiRXh0ZXJuYWwgbG9ja2luZyBhbHJlYWR5IGluaXRpYWxpc2VkIik7CisJCXJldHVybiAxOworCX0KKworCWxvY2tpbmctPmxvY2tfcmVzb3VyY2UgPSBfbG9ja19yZXNvdXJjZTsKKwlsb2NraW5nLT5maW5fbG9ja2luZyA9IF9maW5fZXh0ZXJuYWxfbG9ja2luZzsKKwlsb2NraW5nLT5yZXNldF9sb2NraW5nID0gX3Jlc2V0X2V4dGVybmFsX2xvY2tpbmc7CisJbG9ja2luZy0+ZmxhZ3MgPSAwOworCisJaWYgKCEobGlibmFtZSA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgZ2xvYmFsX2xvY2tpbmdfbGlicmFyeV9DRkcsIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShfbG9ja2luZ19saWIgPSBsb2FkX3NoYXJlZF9saWJyYXJ5KGNtZCwgbGlibmFtZSwgImxvY2tpbmciLCAxKSkpCisJCXJldHVybl8wOworCisJLyogR2V0IHRoZSBmdW5jdGlvbnMgd2UgbmVlZCAqLworCWlmICghKF9pbml0X2ZuID0gZGxzeW0oX2xvY2tpbmdfbGliLCAibG9ja2luZ19pbml0IikpIHx8CisJICAgICEoX2xvY2tfZm4gPSBkbHN5bShfbG9ja2luZ19saWIsICJsb2NrX3Jlc291cmNlIikpIHx8CisJICAgICEoX3Jlc2V0X2ZuID0gZGxzeW0oX2xvY2tpbmdfbGliLCAicmVzZXRfbG9ja2luZyIpKSB8fAorCSAgICAhKF9lbmRfZm4gPSBkbHN5bShfbG9ja2luZ19saWIsICJsb2NraW5nX2VuZCIpKSkgeworCQlsb2dfZXJyb3Jfc3VwcHJlc3Moc3VwcHJlc3NfbWVzc2FnZXMsICJTaGFyZWQgbGlicmFyeSAlcyBkb2VzICIKKwkJCQkgICAibm90IGNvbnRhaW4gbG9ja2luZyBmdW5jdGlvbnMiLCBsaWJuYW1lKTsKKwkJZGxjbG9zZShfbG9ja2luZ19saWIpOworCQlfbG9ja2luZ19saWIgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShfbG9ja19xdWVyeV9mbiA9IGRsc3ltKF9sb2NraW5nX2xpYiwgInF1ZXJ5X3Jlc291cmNlIikpKQorCQlsb2dfd2Fybl9zdXBwcmVzcyhzdXBwcmVzc19tZXNzYWdlcywgIldBUk5JTkc6ICVzOiBfcXVlcnlfcmVzb3VyY2UoKSAiCisJCQkJICAibWlzc2luZzogVXNpbmcgaW5mZXJpb3IgYWN0aXZhdGlvbiBtZXRob2QuIiwgbGlibmFtZSk7CisKKwlsb2dfdmVyYm9zZSgiTG9hZGVkIGV4dGVybmFsIGxvY2tpbmcgbGlicmFyeSAlcyIsIGxpYm5hbWUpOworCXJldHVybiBfaW5pdF9mbigyLCBjbWQtPmNmdCwgJmxvY2tpbmctPmZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sb2NraW5nL2ZpbGVfbG9ja2luZy5jIGIvbGliL2xvY2tpbmcvZmlsZV9sb2NraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwMzAzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sb2NraW5nL2ZpbGVfbG9ja2luZy5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJsb2NraW5nX3R5cGVzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJsdm0tZmxvY2suaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgY2hhciBfbG9ja19kaXJbUEFUSF9NQVhdOworCitzdGF0aWMgdm9pZCBfZmluX2ZpbGVfbG9ja2luZyh2b2lkKQoreworCXJlbGVhc2VfZmxvY2tzKDEpOworfQorCitzdGF0aWMgdm9pZCBfcmVzZXRfZmlsZV9sb2NraW5nKHZvaWQpCit7CisJcmVsZWFzZV9mbG9ja3MoMCk7Cit9CisKK3N0YXRpYyBpbnQgX2ZpbGVfbG9ja19yZXNvdXJjZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcmVzb3VyY2UsCisJCQkgICAgICAgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY2hhciBsb2NrZmlsZVtQQVRIX01BWF07CisJdW5zaWduZWQgb3JpZ2luX29ubHkgPSAoZmxhZ3MgJiBMQ0tfT1JJR0lOX09OTFkpID8gMSA6IDA7CisJdW5zaWduZWQgcmV2ZXJ0ID0gKGZsYWdzICYgTENLX1JFVkVSVCkgPyAxIDogMDsKKworCXN3aXRjaCAoZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSykgeworCWNhc2UgTENLX0FDVElWQVRJT046CisJCWlmIChkbV9zbnByaW50Zihsb2NrZmlsZSwgc2l6ZW9mKGxvY2tmaWxlKSwKKwkJCQkiJXMvQV8lcyIsIF9sb2NrX2RpciwgcmVzb3VyY2UgKyAxKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiVG9vIGxvbmcgbG9ja2luZyBmaWxlbmFtZSAlcy9BXyVzLiIsIF9sb2NrX2RpciwgcmVzb3VyY2UgKyAxKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFsb2NrX2ZpbGUobG9ja2ZpbGUsIGZsYWdzKSkKKwkJCXJldHVybl8wOworCQlicmVhazsKKwljYXNlIExDS19WRzoKKwkJaWYgKCFzdHJjbXAocmVzb3VyY2UsIFZHX1NZTkNfTkFNRVMpKSB7CisJCQlmc191bmxvY2soKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocmVzb3VyY2UsIFZHX0dMT0JBTCkpCisJCQkvKiBTa2lwIGNhY2hlIHJlZnJlc2ggZm9yIFZHX0dMT0JBTCAtIHRoZSBjYWxsZXIgaGFuZGxlcyBpdCAqLworCQkJbHZtY2FjaGVfZHJvcF9tZXRhZGF0YShyZXNvdXJjZSwgMCk7CisKKwkJLyogTENLX0NBQ0hFIGRvZXMgbm90IHJlcXVpcmUgYSByZWFsIGxvY2sgKi8KKwkJaWYgKGZsYWdzICYgTENLX0NBQ0hFKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzX29ycGhhbl92ZyhyZXNvdXJjZSkgfHwgaXNfZ2xvYmFsX3ZnKHJlc291cmNlKSkgeworCQkJaWYgKGRtX3NucHJpbnRmKGxvY2tmaWxlLCBzaXplb2YobG9ja2ZpbGUpLAorCQkJCQkiJXMvUF8lcyIsIF9sb2NrX2RpciwgcmVzb3VyY2UgKyAxKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoIlRvbyBsb25nIGxvY2tpbmcgZmlsZW5hbWUgJXMvUF8lcy4iLAorCQkJCQkgIF9sb2NrX2RpciwgcmVzb3VyY2UgKyAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQlpZiAoZG1fc25wcmludGYobG9ja2ZpbGUsIHNpemVvZihsb2NrZmlsZSksCisJCQkJCSIlcy9WXyVzIiwgX2xvY2tfZGlyLCByZXNvdXJjZSkgPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJUb28gbG9uZyBsb2NraW5nIGZpbGVuYW1lICVzL1ZfJXMuIiwKKwkJCQkJICBfbG9ja19kaXIsIHJlc291cmNlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlpZiAoIWxvY2tfZmlsZShsb2NrZmlsZSwgZmxhZ3MpKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCWNhc2UgTENLX0xWOgorCQlzd2l0Y2ggKGZsYWdzICYgTENLX1RZUEVfTUFTSykgeworCQljYXNlIExDS19VTkxPQ0s6CisJCQlsb2dfdmVyeV92ZXJib3NlKCJVbmxvY2tpbmcgTFYgJXMlcyVzIiwgcmVzb3VyY2UsIG9yaWdpbl9vbmx5ID8gIiB3aXRob3V0IHNuYXBzaG90cyIgOiAiIiwgcmV2ZXJ0ID8gIiAocmV2ZXJ0aW5nKSIgOiAiIik7CisJCQlpZiAoIWx2X3Jlc3VtZV9pZl9hY3RpdmUoY21kLCByZXNvdXJjZSwgb3JpZ2luX29ubHksIDAsIHJldmVydCwgbHZfY29tbWl0dGVkKGx2KSkpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSBMQ0tfTlVMTDoKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIkxvY2tpbmcgTFYgJXMgKE5MKSIsIHJlc291cmNlKTsKKwkJCWlmICghbHZfZGVhY3RpdmF0ZShjbWQsIHJlc291cmNlLCBsdl9jb21taXR0ZWQobHYpKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIExDS19SRUFEOgorCQkJbG9nX3ZlcnlfdmVyYm9zZSgiTG9ja2luZyBMViAlcyAoUikiLCByZXNvdXJjZSk7CisJCQlpZiAoIWx2X2FjdGl2YXRlX3dpdGhfZmlsdGVyKGNtZCwgcmVzb3VyY2UsIDAsIChsdi0+c3RhdHVzICYgTFZfTk9TQ0FOKSA/IDEgOiAwLAorCQkJCQkJICAgICAobHYtPnN0YXR1cyAmIExWX1RFTVBPUkFSWSkgPyAxIDogMCwgbHZfY29tbWl0dGVkKGx2KSkpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSBMQ0tfUFJFQUQ6CisJCQlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nIExWICVzIChQUikgLSBpZ25vcmVkIiwgcmVzb3VyY2UpOworCQkJYnJlYWs7CisJCWNhc2UgTENLX1dSSVRFOgorCQkJbG9nX3ZlcnlfdmVyYm9zZSgiTG9ja2luZyBMViAlcyAoVyklcyIsIHJlc291cmNlLCBvcmlnaW5fb25seSA/ICIgd2l0aG91dCBzbmFwc2hvdHMiIDogIiIpOworCQkJaWYgKCFsdl9zdXNwZW5kX2lmX2FjdGl2ZShjbWQsIHJlc291cmNlLCBvcmlnaW5fb25seSwgMCwgbHZfY29tbWl0dGVkKGx2KSwgbHYpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgTENLX0VYQ0w6CisJCQlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nIExWICVzIChFWCkiLCByZXNvdXJjZSk7CisJCQlpZiAoIWx2X2FjdGl2YXRlX3dpdGhfZmlsdGVyKGNtZCwgcmVzb3VyY2UsIDEsIChsdi0+c3RhdHVzICYgTFZfTk9TQ0FOKSA/IDEgOiAwLAorCQkJCQkJICAgICAobHYtPnN0YXR1cyAmIExWX1RFTVBPUkFSWSkgPyAxIDogMCwgbHZfY29tbWl0dGVkKGx2KSkpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIGxvY2sgc2NvcGU6ICVkIiwKKwkJCSAgZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgaW5pdF9maWxlX2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICAgIGludCBzdXBwcmVzc19tZXNzYWdlcykKK3sKKwlpbnQgcjsKKwljb25zdCBjaGFyICpsb2NraW5nX2RpcjsKKworCWluaXRfZmxvY2soY21kKTsKKworCWxvY2tpbmctPmxvY2tfcmVzb3VyY2UgPSBfZmlsZV9sb2NrX3Jlc291cmNlOworCWxvY2tpbmctPnJlc2V0X2xvY2tpbmcgPSBfcmVzZXRfZmlsZV9sb2NraW5nOworCWxvY2tpbmctPmZpbl9sb2NraW5nID0gX2Zpbl9maWxlX2xvY2tpbmc7CisJbG9ja2luZy0+ZmxhZ3MgPSAwOworCisJLyogR2V0IGxvY2tmaWxlIGRpcmVjdG9yeSBmcm9tIGNvbmZpZyBmaWxlICovCisJbG9ja2luZ19kaXIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9sb2NraW5nX2Rpcl9DRkcsIE5VTEwpOworCWlmICghZG1fc3RybmNweShfbG9ja19kaXIsIGxvY2tpbmdfZGlyLCBzaXplb2YoX2xvY2tfZGlyKSkpIHsKKwkJbG9nX2Vycm9yKCJQYXRoIGZvciBsb2NraW5nX2RpciAlcyBpcyBpbnZhbGlkLiIsIGxvY2tpbmdfZGlyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KF9sb2NrX2RpciwgU19JRkRJUik7CisJciA9IGRtX2NyZWF0ZV9kaXIoX2xvY2tfZGlyKTsKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisKKwlpZiAoIXIpCisJCXJldHVybiAwOworCisJLyogVHJhcCBhIHJlYWQtb25seSBmaWxlIHN5c3RlbSAqLworCWlmICgoYWNjZXNzKF9sb2NrX2RpciwgUl9PSyB8IFdfT0sgfCBYX09LKSA9PSAtMSkgJiYgKGVycm5vID09IEVST0ZTKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sb2NraW5nL2xvY2tpbmcuYyBiL2xpYi9sb2NraW5nL2xvY2tpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmMwMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvbG9ja2luZy5jCkBAIC0wLDAgKzEsNTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJsb2NraW5nX3R5cGVzLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgImx2bS1zaWduYWwuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja2luZ190eXBlIF9sb2NraW5nOworCitzdGF0aWMgaW50IF92Z19sb2NrX2NvdW50ID0gMDsJCS8qIE51bWJlciBvZiBsb2NrcyBoZWxkICovCitzdGF0aWMgaW50IF92Z193cml0ZV9sb2NrX2hlbGQgPSAwOwkvKiBWRyB3cml0ZSBsb2NrIGhlbGQ/ICovCitzdGF0aWMgaW50IF9ibG9ja2luZ19zdXBwb3J0ZWQgPSAwOworCit0eXBlZGVmIGVudW0geworICAgICAgICBMVl9OT09QLAorICAgICAgICBMVl9TVVNQRU5ELAorICAgICAgICBMVl9SRVNVTUUKK30gbHZfb3BlcmF0aW9uX3Q7CisKK3N0YXRpYyB2b2lkIF9sb2NrX21lbW9yeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgbHZfb3BlcmF0aW9uX3QgbHZfb3ApCit7CisJaWYgKCEoX2xvY2tpbmcuZmxhZ3MgJiBMQ0tfUFJFX01FTUxPQ0spKQorCQlyZXR1cm47CisKKwlpZiAobHZfb3AgPT0gTFZfU1VTUEVORCkKKwkJY3JpdGljYWxfc2VjdGlvbl9pbmMoY21kLCAibG9ja2luZyBmb3Igc3VzcGVuZCIpOworfQorCitzdGF0aWMgdm9pZCBfdW5sb2NrX21lbW9yeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgbHZfb3BlcmF0aW9uX3QgbHZfb3ApCit7CisJaWYgKCEoX2xvY2tpbmcuZmxhZ3MgJiBMQ0tfUFJFX01FTUxPQ0spKQorCQlyZXR1cm47CisKKwlpZiAobHZfb3AgPT0gTFZfUkVTVU1FKQorCQljcml0aWNhbF9zZWN0aW9uX2RlYyhjbWQsICJ1bmxvY2tpbmcgb24gcmVzdW1lIik7Cit9CisKK3N0YXRpYyB2b2lkIF91bmJsb2NrX3NpZ25hbHModm9pZCkKK3sKKwkvKiBEb24ndCB1bmJsb2NrIHNpZ25hbHMgd2hpbGUgYW55IGxvY2tzIGFyZSBoZWxkICovCisJaWYgKCFfdmdfbG9ja19jb3VudCkKKwkJdW5ibG9ja19zaWduYWxzKCk7Cit9CisKK3ZvaWQgcmVzZXRfbG9ja2luZyh2b2lkKQoreworCWludCB3YXNfbG9ja2VkID0gX3ZnX2xvY2tfY291bnQ7CisKKwlfdmdfbG9ja19jb3VudCA9IDA7CisJX3ZnX3dyaXRlX2xvY2tfaGVsZCA9IDA7CisKKwlpZiAoX2xvY2tpbmcucmVzZXRfbG9ja2luZykKKwkJX2xvY2tpbmcucmVzZXRfbG9ja2luZygpOworCisJaWYgKHdhc19sb2NrZWQpCisJCV91bmJsb2NrX3NpZ25hbHMoKTsKKworCW1lbWxvY2tfcmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgX3VwZGF0ZV92Z19sb2NrX2NvdW50KGNvbnN0IGNoYXIgKnJlc291cmNlLCB1aW50MzJfdCBmbGFncykKK3sKKwkvKiBJZ25vcmUgbG9ja3Mgbm90IGFzc29jaWF0ZWQgd2l0aCB1cGRhdGluZyBWRyBtZXRhZGF0YSAqLworCWlmICgoZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSykgIT0gTENLX1ZHIHx8CisJICAgIChmbGFncyAmIExDS19DQUNIRSkgfHwKKwkgICAgIXN0cmNtcChyZXNvdXJjZSwgVkdfR0xPQkFMKSkKKwkJcmV0dXJuOworCisJaWYgKChmbGFncyAmIExDS19UWVBFX01BU0spID09IExDS19VTkxPQ0spCisJCV92Z19sb2NrX2NvdW50LS07CisJZWxzZQorCQlfdmdfbG9ja19jb3VudCsrOworCisJLyogV2UgZG9uJ3QgYm90aGVyIHRvIHJlc2V0IHRoaXMgdW50aWwgYWxsIFZHIGxvY2tzIGFyZSBkcm9wcGVkICovCisJaWYgKChmbGFncyAmIExDS19UWVBFX01BU0spID09IExDS19XUklURSkKKwkJX3ZnX3dyaXRlX2xvY2tfaGVsZCA9IDE7CisJZWxzZSBpZiAoIV92Z19sb2NrX2NvdW50KQorCQlfdmdfd3JpdGVfbG9ja19oZWxkID0gMDsKK30KKworLyoKKyAqIFNlbGVjdCBhIGxvY2tpbmcgdHlwZQorICogdHlwZTogbG9ja2luZyB0eXBlOyBpZiA8IDAsIHRoZW4gcmVhZCBjb25maWcgdHJlZSB2YWx1ZQorICovCitpbnQgaW5pdF9sb2NraW5nKGludCB0eXBlLCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IHN1cHByZXNzX21lc3NhZ2VzKQoreworCWlmIChnZXRlbnYoIkxWTV9TVVBQUkVTU19MT0NLSU5HX0ZBSUxVUkVfTUVTU0FHRVMiKSkKKwkJc3VwcHJlc3NfbWVzc2FnZXMgPSAxOworCisJaWYgKHR5cGUgPCAwKQorCQl0eXBlID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBnbG9iYWxfbG9ja2luZ190eXBlX0NGRywgTlVMTCk7CisKKwlfYmxvY2tpbmdfc3VwcG9ydGVkID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX3dhaXRfZm9yX2xvY2tzX0NGRywgTlVMTCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDA6CisJCWluaXRfbm9fbG9ja2luZygmX2xvY2tpbmcsIGNtZCwgc3VwcHJlc3NfbWVzc2FnZXMpOworCQlsb2dfd2Fybl9zdXBwcmVzcyhzdXBwcmVzc19tZXNzYWdlcywKKwkJCSJXQVJOSU5HOiBMb2NraW5nIGRpc2FibGVkLiBCZSBjYXJlZnVsISAiCisJCQkiVGhpcyBjb3VsZCBjb3JydXB0IHlvdXIgbWV0YWRhdGEuIik7CisJCXJldHVybiAxOworCisJY2FzZSAxOgorCQlsb2dfdmVyeV92ZXJib3NlKCIlc0ZpbGUtYmFzZWQgbG9ja2luZyBzZWxlY3RlZC4iLAorCQkJCSBfYmxvY2tpbmdfc3VwcG9ydGVkID8gIiIgOiAiTm9uLWJsb2NraW5nICIpOworCisJCWlmICghaW5pdF9maWxlX2xvY2tpbmcoJl9sb2NraW5nLCBjbWQsIHN1cHByZXNzX21lc3NhZ2VzKSkgeworCQkJbG9nX2Vycm9yX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLAorCQkJCQkgICAiRmlsZS1iYXNlZCBsb2NraW5nIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAxOworCisjaWZkZWYgSEFWRV9MSUJETAorCWNhc2UgMjoKKwkJaWYgKCFpc19zdGF0aWMoKSkgeworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiRXh0ZXJuYWwgbG9ja2luZyBzZWxlY3RlZC4iKTsKKwkJCWlmIChpbml0X2V4dGVybmFsX2xvY2tpbmcoJl9sb2NraW5nLCBjbWQsIHN1cHByZXNzX21lc3NhZ2VzKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9mYWxsYmFja190b19jbHVzdGVyZWRfbG9ja2luZ19DRkcsIE5VTEwpKSB7CisJCQlsb2dfZXJyb3Jfc3VwcHJlc3Moc3VwcHJlc3NfbWVzc2FnZXMsICJFeHRlcm5hbCBsb2NraW5nIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4iKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworI2lmZGVmIENMVVNURVJfTE9DS0lOR19JTlRFUk5BTAorCQlsb2dfdmVyeV92ZXJib3NlKCJGYWxsaW5nIGJhY2sgdG8gaW50ZXJuYWwgY2x1c3RlcmVkIGxvY2tpbmcuIik7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJY2FzZSAzOgorCQlsb2dfdmVyeV92ZXJib3NlKCJDbHVzdGVyIGxvY2tpbmcgc2VsZWN0ZWQuIik7CisJCWlmICghaW5pdF9jbHVzdGVyX2xvY2tpbmcoJl9sb2NraW5nLCBjbWQsIHN1cHByZXNzX21lc3NhZ2VzKSkgeworCQkJbG9nX2Vycm9yX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLAorCQkJCQkgICAiSW50ZXJuYWwgY2x1c3RlciBsb2NraW5nIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAxOworI2VuZGlmCisKKwljYXNlIDQ6CisJCWxvZ192ZXJib3NlKCJSZWFkLW9ubHkgbG9ja2luZyBzZWxlY3RlZC4gIgorCQkJICAgICJPbmx5IHJlYWQgb3BlcmF0aW9ucyBwZXJtaXR0ZWQuIik7CisJCWlmICghaW5pdF9yZWFkb25seV9sb2NraW5nKCZfbG9ja2luZywgY21kLCBzdXBwcmVzc19tZXNzYWdlcykpCisJCQlicmVhazsKKwkJcmV0dXJuIDE7CisKKwljYXNlIDU6CisJCWluaXRfZHVtbXlfbG9ja2luZygmX2xvY2tpbmcsIGNtZCwgc3VwcHJlc3NfbWVzc2FnZXMpOworCQlsb2dfdmVyYm9zZSgiTG9ja2luZyBkaXNhYmxlZCBmb3IgcmVhZC1vbmx5IGFjY2Vzcy4iKTsKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlVua25vd24gbG9ja2luZyB0eXBlIHJlcXVlc3RlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCh0eXBlID09IDIgfHwgdHlwZSA9PSAzKSAmJgorCSAgICBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfZmFsbGJhY2tfdG9fbG9jYWxfbG9ja2luZ19DRkcsIE5VTEwpKSB7CisJCWxvZ193YXJuX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLCAiV0FSTklORzogRmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGUtYmFzZWQgbG9ja2luZy4iKTsKKwkJbG9nX3dhcm5fc3VwcHJlc3Moc3VwcHJlc3NfbWVzc2FnZXMsCisJCQkJICAiVm9sdW1lIEdyb3VwcyB3aXRoIHRoZSBjbHVzdGVyZWQgYXR0cmlidXRlIHdpbGwgIgorCQkJCSAgImJlIGluYWNjZXNzaWJsZS4iKTsKKwkJaWYgKGluaXRfZmlsZV9sb2NraW5nKCZfbG9ja2luZywgY21kLCBzdXBwcmVzc19tZXNzYWdlcykpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJbG9nX2Vycm9yX3N1cHByZXNzKHN1cHByZXNzX21lc3NhZ2VzLAorCQkJCQkgICAiRmlsZS1iYXNlZCBsb2NraW5nIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4iKTsKKwl9CisKKwlpZiAoIWlnbm9yZWxvY2tpbmdmYWlsdXJlKCkpCisJCXJldHVybiAwOworCisJbG9nX3ZlcmJvc2UoIkxvY2tpbmcgZGlzYWJsZWQgLSBvbmx5IHJlYWQgb3BlcmF0aW9ucyBwZXJtaXR0ZWQuIik7CisJaW5pdF9yZWFkb25seV9sb2NraW5nKCZfbG9ja2luZywgY21kLCBzdXBwcmVzc19tZXNzYWdlcyk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBmaW5fbG9ja2luZyh2b2lkKQoreworCV9sb2NraW5nLmZpbl9sb2NraW5nKCk7Cit9CisKKy8qCisgKiBEb2VzIHRoZSBMVk0xIGRyaXZlciBrbm93IG9mIHRoaXMgVkcgbmFtZT8KKyAqLworaW50IGNoZWNrX2x2bTFfdmdfaW5hY3RpdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisKKwkvKiBXZSdsbCBhbGxvdyBvcGVyYXRpb25zIG9uIG9ycGhhbnMgKi8KKwlpZiAoIWlzX3JlYWxfdmcodmduYW1lKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBMVk0xIGlzIG9ubHkgcHJlc2VudCBpbiAyLjQga2VybmVscy4gKi8KKwlpZiAoc3RybmNtcChjbWQtPmtlcm5lbF92c24sICIyLjQuIiwgNCkpCisJCXJldHVybiAxOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2x2bS9WR3MvJXMiLCBjbWQtPnByb2NfZGlyLAorCQkJIHZnbmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiTFZNMSBwcm9jIFZHIHBhdGhuYW1lIHRvbyBsb25nIGZvciAlcyIsIHZnbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0KHBhdGgsICZpbmZvKSA9PSAwKSB7CisJCWxvZ19lcnJvcigiJXMgZXhpc3RzOiBJcyB0aGUgb3JpZ2luYWwgTFZNIGRyaXZlciB1c2luZyAiCisJCQkgICJ0aGlzIHZvbHVtZSBncm91cD8iLCBwYXRoKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikgeworCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogVkcgbG9ja2luZyBpcyBieSBWRyBuYW1lLgorICogRklYTUUgVGhpcyBzaG91bGQgYmVjb21lIFZHIHV1aWQuCisgKi8KK3N0YXRpYyBpbnQgX2xvY2tfdm9sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpyZXNvdXJjZSwKKwkJICAgICB1aW50MzJfdCBmbGFncywgbHZfb3BlcmF0aW9uX3QgbHZfb3AsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJdWludDMyX3QgbGNrX3R5cGUgPSBmbGFncyAmIExDS19UWVBFX01BU0s7CisJdWludDMyX3QgbGNrX3Njb3BlID0gZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSzsKKwlpbnQgcmV0ID0gMDsKKworCWJsb2NrX3NpZ25hbHMoZmxhZ3MpOworCV9sb2NrX21lbW9yeShjbWQsIGx2X29wKTsKKworCWFzc2VydChyZXNvdXJjZSk7CisKKwlpZiAoISpyZXNvdXJjZSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVzZSBvZiBQX29ycGhhbnMgaXMgZGVwcmVjYXRlZC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChpc19vcnBoYW5fdmcocmVzb3VyY2UpIHx8IGlzX2dsb2JhbF92ZyhyZXNvdXJjZSkpICYmIChmbGFncyAmIExDS19DQUNIRSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJQXyVzIHJlZmVyZW5jZWQiLCByZXNvdXJjZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjbWQtPm1ldGFkYXRhX3JlYWRfb25seSAmJiBsY2tfdHlwZSA9PSBMQ0tfV1JJVEUgJiYKKwkgICAgc3RyY21wKHJlc291cmNlLCBWR19HTE9CQUwpKSB7CisJCWxvZ19lcnJvcigiT3BlcmF0aW9uIHByb2hpYml0ZWQgd2hpbGUgZ2xvYmFsL21ldGFkYXRhX3JlYWRfb25seSBpcyBzZXQuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocmV0ID0gX2xvY2tpbmcubG9ja19yZXNvdXJjZShjbWQsIHJlc291cmNlLCBmbGFncywgbHYpKSkgeworCQlpZiAobGNrX3Njb3BlID09IExDS19WRyAmJiAhKGZsYWdzICYgTENLX0NBQ0hFKSkgeworCQkJaWYgKGxja190eXBlICE9IExDS19VTkxPQ0spCisJCQkJbHZtY2FjaGVfbG9ja192Z25hbWUocmVzb3VyY2UsIGxja190eXBlID09IExDS19SRUFEKTsKKwkJCWRldl9yZXNldF9lcnJvcl9jb3VudChjbWQpOworCQl9CisKKwkJX3VwZGF0ZV92Z19sb2NrX2NvdW50KHJlc291cmNlLCBmbGFncyk7CisJfSBlbHNlCisJCXN0YWNrOworCisJLyogSWYgdW5sb2NraW5nLCBhbHdheXMgcmVtb3ZlIGxvY2sgZnJvbSBsdm1jYWNoZSBldmVuIGlmIG9wZXJhdGlvbiBmYWlsZWQuICovCisJaWYgKGxja19zY29wZSA9PSBMQ0tfVkcgJiYgIShmbGFncyAmIExDS19DQUNIRSkgJiYgbGNrX3R5cGUgPT0gTENLX1VOTE9DSykgeworCQlsdm1jYWNoZV91bmxvY2tfdmduYW1lKHJlc291cmNlKTsKKwkJaWYgKCFyZXQpCisJCQlfdXBkYXRlX3ZnX2xvY2tfY291bnQocmVzb3VyY2UsIGZsYWdzKTsKKwl9CitvdXQ6CisJX3VubG9ja19tZW1vcnkoY21kLCBsdl9vcCk7CisJX3VuYmxvY2tfc2lnbmFscygpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGxvY2tfdm9sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2b2wsIHVpbnQzMl90IGZsYWdzLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNoYXIgcmVzb3VyY2VbMjU4XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJbHZfb3BlcmF0aW9uX3QgbHZfb3A7CisJaW50IGxja190eXBlID0gZmxhZ3MgJiBMQ0tfVFlQRV9NQVNLOworCisJc3dpdGNoIChmbGFncyAmIChMQ0tfU0NPUEVfTUFTSyB8IExDS19UWVBFX01BU0spKSB7CisJCWNhc2UgTENLX0xWX1NVU1BFTkQ6CisJCQkJbHZfb3AgPSBMVl9TVVNQRU5EOworCQkJCWJyZWFrOworCQljYXNlIExDS19MVl9SRVNVTUU6CisJCQkJbHZfb3AgPSBMVl9SRVNVTUU7CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CWx2X29wID0gTFZfTk9PUDsKKwl9CisKKworCWlmIChmbGFncyA9PSBMQ0tfTk9ORSkgeworCQlsb2dfZGVidWdfbG9ja2luZyhJTlRFUk5BTF9FUlJPUiAiJXM6IExDS19OT05FIGxvY2sgcmVxdWVzdGVkIiwgdm9sKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoIChmbGFncyAmIExDS19TQ09QRV9NQVNLKSB7CisJY2FzZSBMQ0tfQUNUSVZBVElPTjoKKwkJYnJlYWs7CisJY2FzZSBMQ0tfVkc6CisJCWlmICghX2Jsb2NraW5nX3N1cHBvcnRlZCkKKwkJCWZsYWdzIHw9IExDS19OT05CTE9DSzsKKworCQkvKiBHbG9iYWwgVkdfT1JQSEFOUyBsb2NrIGNvdmVycyBhbGwgb3JwaGFuIGZvcm1hdHMuICovCisJCWlmIChpc19vcnBoYW5fdmcodm9sKSkKKwkJCXZvbCA9IFZHX09SUEhBTlM7CisJCS8qIFZHIGxvY2tzIGFscGhhYmV0aWNhbCwgT1JQSEFOIGxvY2sgbGFzdCAqLworCQlpZiAoKGxja190eXBlICE9IExDS19VTkxPQ0spICYmCisJCSAgICAhKGZsYWdzICYgTENLX0NBQ0hFKSAmJgorCQkgICAgIWx2bWNhY2hlX3ZlcmlmeV9sb2NrX29yZGVyKHZvbCkpCisJCQlyZXR1cm5fMDsKKworCQkvKiBMb2NrIFZHIHRvIGNoYW5nZSBvbi1kaXNrIG1ldGFkYXRhLiAqLworCQkvKiBJZiBMVk0xIGRyaXZlciBrbm93cyBhYm91dCB0aGUgVkcsIGl0IGNhbid0IGJlIGFjY2Vzc2VkLiAqLworCQlpZiAoIWNoZWNrX2x2bTFfdmdfaW5hY3RpdmUoY21kLCB2b2wpKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCWNhc2UgTENLX0xWOgorCQkvKiBBbGwgTFYgbG9ja3MgYXJlIG5vbi1ibG9ja2luZy4gKi8KKwkJZmxhZ3MgfD0gTENLX05PTkJMT0NLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlVucmVjb2duaXNlZCBsb2NrIHNjb3BlOiAlZCIsCisJCQkgIGZsYWdzICYgTENLX1NDT1BFX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdHJuY3B5KHJlc291cmNlLCB2b2wsIHNpemVvZihyZXNvdXJjZSkgLSAxKTsKKwlyZXNvdXJjZVtzaXplb2YocmVzb3VyY2UpIC0gMV0gPSAnXDAnOworCisJaWYgKCFfbG9ja192b2woY21kLCByZXNvdXJjZSwgZmxhZ3MsIGx2X29wLCBsdikpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBJZiBhIHJlYWwgbG9jayB3YXMgYWNxdWlyZWQgKGkuZS4gbm90IExDS19DQUNIRSksCisJICogcGVyZm9ybSBhbiBpbW1lZGlhdGUgdW5sb2NrIHVubGVzcyBMQ0tfSE9MRCB3YXMgcmVxdWVzdGVkLgorCSAqLworCWlmICgobGNrX3R5cGUgPT0gTENLX05VTEwpIHx8IChsY2tfdHlwZSA9PSBMQ0tfVU5MT0NLKSB8fAorCSAgICAoZmxhZ3MgJiAoTENLX0NBQ0hFIHwgTENLX0hPTEQpKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIV9sb2NrX3ZvbChjbWQsIHJlc291cmNlLCAoZmxhZ3MgJiB+TENLX1RZUEVfTUFTSykgfCBMQ0tfVU5MT0NLLCBsdl9vcCwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKiBVbmxvY2sgbGlzdCBvZiBMVnMgKi8KK2ludCByZXN1bWVfbHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IHIgPSAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgbHZzKQorCQlpZiAoIXJlc3VtZV9sdihjbWQsIGx2bC0+bHYpKSB7CisJCQlyID0gMDsKKwkJCXN0YWNrOworCQl9CisKKwlyZXR1cm4gcjsKK30KKworLyogVW5sb2NrIGFuZCByZXZlcnQgbGlzdCBvZiBMVnMgKi8KK2ludCByZXZlcnRfbHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IHIgPSAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgbHZzKQorCQlpZiAoIXJldmVydF9sdihjbWQsIGx2bC0+bHYpKSB7CisJCQlyID0gMDsKKwkJCXN0YWNrOworCQl9CisKKwlyZXR1cm4gcjsKK30KKy8qCisgKiBMb2NrIGEgbGlzdCBvZiBMVnMuCisgKiBPbiBmYWlsdXJlIHRvIGxvY2sgYW55IExWLCBjYWxscyB2Z19yZXZlcnQoKSBpZiB2Z190b19yZXZlcnQgaXMgc2V0IGFuZCAKKyAqIHRoZW4gdW5sb2NrcyBhbnkgTFZzIG9uIHRoZSBsaXN0IGFscmVhZHkgc3VjY2Vzc2Z1bGx5IGxvY2tlZC4KKyAqLworaW50IHN1c3BlbmRfbHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzLAorCQlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190b19yZXZlcnQpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGx2cykgeworCQlpZiAoIXN1c3BlbmRfbHYoY21kLCBsdmwtPmx2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3VzcGVuZCAlcyIsIGx2bC0+bHYtPm5hbWUpOworCQkJaWYgKHZnX3RvX3JldmVydCkKKwkJCQl2Z19yZXZlcnQodmdfdG9fcmV2ZXJ0KTsKKwkJCS8qCisJCQkgKiBGSVhNRSBTaG91bGQgYmUKKwkJCSAqIAlkbV9saXN0X3VuaXRlcmF0ZShsdmgsIGx2cywgJmx2bC0+bGlzdCkgeworCQkJICoJbHZsID0gZG1fbGlzdF9pdGVtKGx2aCwgc3RydWN0IGx2X2xpc3QpOworCQkJICogYnV0IHJldmVydCB3b3VsZCBuZWVkIGZpeGluZyB0byB1c2UgaWRlbnRpY2FsIHRyZWUgZGVwcyBmaXJzdC4KKwkJCSAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgbHZzKQorCQkJCWlmICghcmV2ZXJ0X2x2KGNtZCwgbHZsLT5sdikpCisJCQkJCXN0YWNrOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogRmlyc3QgdHJ5IHRvIGFjdGl2YXRlIGV4Y2x1c2l2ZWx5IGxvY2FsbHkuCisgKiBUaGVuIGlmIHRoZSBWRyBpcyBjbHVzdGVyZWQgYW5kIHRoZSBMViBpcyBub3QgeWV0IGFjdGl2ZSAoZS5nLiBkdWUgdG8gCisgKiBhbiBhY3RpdmF0aW9uIGZpbHRlcikgdHJ5IGFjdGl2YXRpbmcgb24gcmVtb3RlIG5vZGVzLgorICovCitpbnQgYWN0aXZhdGVfbHZfZXhjbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikgCit7CisJLyogTm9uLWNsdXN0ZXJlZCBWR3MgYXJlIG9ubHkgYWN0aXZhdGVkIGxvY2FsbHkuICovCisJaWYgKCF2Z19pc19jbHVzdGVyZWQobHYtPnZnKSkKKwkJcmV0dXJuIGFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdik7CisKKwlpZiAobHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9sb2NhbGx5KGx2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdikpCisJCXJldHVybl8wOworCisJaWYgKGx2X2lzX2FjdGl2ZV9leGNsdXNpdmUobHYpKQorCQlyZXR1cm4gMTsKKworCS8qIEZJWE1FIERlYWwgd2l0aCBlcnJvciByZXR1cm4gY29kZXMuICovCisJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX3JlbW90ZShjbWQsIGx2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyogTG9jayBhIGxpc3Qgb2YgTFZzICovCitpbnQgYWN0aXZhdGVfbHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzLCB1bnNpZ25lZCBleGNsdXNpdmUpCit7CisJc3RydWN0IGRtX2xpc3QgKmx2aDsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgbHZzKSB7CisJCWlmICghZXhjbHVzaXZlICYmICFsdl9pc19hY3RpdmVfZXhjbHVzaXZlKGx2bC0+bHYpKSB7CisJCQlpZiAoIWFjdGl2YXRlX2x2KGNtZCwgbHZsLT5sdikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSAlcyIsIGx2bC0+bHYtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKCFhY3RpdmF0ZV9sdl9leGNsKGNtZCwgbHZsLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFjdGl2YXRlICVzIiwgbHZsLT5sdi0+bmFtZSk7CisJCQlkbV9saXN0X3VuaXRlcmF0ZShsdmgsIGx2cywgJmx2bC0+bGlzdCkgeworCQkJCWx2bCA9IGRtX2xpc3RfaXRlbShsdmgsIHN0cnVjdCBsdl9saXN0KTsKKwkJCQlpZiAoIWFjdGl2YXRlX2x2KGNtZCwgbHZsLT5sdikpCisJCQkJCXN0YWNrOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3dyaXRlX2xvY2tfaGVsZCh2b2lkKQoreworCXJldHVybiBfdmdfd3JpdGVfbG9ja19oZWxkOworfQorCitpbnQgbG9ja2luZ19pc19jbHVzdGVyZWQodm9pZCkKK3sKKwlyZXR1cm4gKF9sb2NraW5nLmZsYWdzICYgTENLX0NMVVNURVJFRCkgPyAxIDogMDsKK30KKworaW50IGxvY2tpbmdfc3VwcG9ydHNfcmVtb3RlX3F1ZXJpZXModm9pZCkKK3sKKwlyZXR1cm4gKF9sb2NraW5nLmZsYWdzICYgTENLX1NVUFBPUlRTX1JFTU9URV9RVUVSSUVTKSA/IDEgOiAwOworfQorCitpbnQgY2x1c3Rlcl9sb2NrX2hlbGQoY29uc3QgY2hhciAqdm9sLCBjb25zdCBjaGFyICpub2RlLCBpbnQgKmV4Y2x1c2l2ZSkKK3sKKwlpbnQgbW9kZSA9IExDS19OVUxMOworCisJaWYgKCFsb2NraW5nX2lzX2NsdXN0ZXJlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghX2xvY2tpbmcucXVlcnlfcmVzb3VyY2UpCisJCXJldHVybiAtMTsKKworCS8qCisJICogSWYgYW4gZXJyb3Igb2NjdXJlZCwgZXhwZWN0IHRoYXQgdm9sdW1lIGlzIGFjdGl2ZQorCSAqLworCWlmICghX2xvY2tpbmcucXVlcnlfcmVzb3VyY2Uodm9sLCBub2RlLCAmbW9kZSkpIHsKKwkJc3RhY2s7CisJCXJldHVybiAxOworCX0KKworCWlmIChleGNsdXNpdmUpCisJCSpleGNsdXNpdmUgPSAobW9kZSA9PSBMQ0tfRVhDTCk7CisKKwlyZXR1cm4gbW9kZSA9PSBMQ0tfTlVMTCA/IDAgOiAxOworfQorCitpbnQgc3luY19sb2NhbF9kZXZfbmFtZXMoc3RydWN0IGNtZF9jb250ZXh0KiBjbWQpCit7CisJbWVtbG9ja191bmxvY2soY21kKTsKKworCXJldHVybiBsb2NrX3ZvbChjbWQsIFZHX1NZTkNfTkFNRVMsIExDS19WR19TWU5DX0xPQ0FMLCBOVUxMKTsKK30KKworaW50IHN5bmNfZGV2X25hbWVzKHN0cnVjdCBjbWRfY29udGV4dCogY21kKQoreworCW1lbWxvY2tfdW5sb2NrKGNtZCk7CisKKwlyZXR1cm4gbG9ja192b2woY21kLCBWR19TWU5DX05BTUVTLCBMQ0tfVkdfU1lOQywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbG9ja2luZy9sb2NraW5nLmggYi9saWIvbG9ja2luZy9sb2NraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiY2UyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sb2NraW5nL2xvY2tpbmcuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0xPQ0tJTkdfSAorI2RlZmluZSBfTFZNX0xPQ0tJTkdfSAorCisjaW5jbHVkZSAidXVpZC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWU7CisKK2ludCBpbml0X2xvY2tpbmcoaW50IHR5cGUsIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpOwordm9pZCBmaW5fbG9ja2luZyh2b2lkKTsKK3ZvaWQgcmVzZXRfbG9ja2luZyh2b2lkKTsKK2ludCB2Z193cml0ZV9sb2NrX2hlbGQodm9pZCk7CitpbnQgbG9ja2luZ19pc19jbHVzdGVyZWQodm9pZCk7CitpbnQgbG9ja2luZ19zdXBwb3J0c19yZW1vdGVfcXVlcmllcyh2b2lkKTsKKworI2lmbmRlZiBOT0RFX0FMTAorIyAgZGVmaW5lIE5PREVfQUxMICAgICAiKiIKKyMgIGRlZmluZSBOT0RFX0xPQ0FMICAgIi4iCisjICBkZWZpbmUgTk9ERV9SRU1PVEUgICJeIgorI2VuZGlmCitpbnQgY2x1c3Rlcl9sb2NrX2hlbGQoY29uc3QgY2hhciAqdm9sLCBjb25zdCBjaGFyICpub2RlLCBpbnQgKmV4Y2x1c2l2ZSk7CisKKy8qCisgKiBMQ0tfVkc6CisgKiAgIExvY2svdW5sb2NrIG9uLWRpc2sgdm9sdW1lIGdyb3VwIGRhdGEuCisgKiAgIFVzZSBWR19PUlBIQU5TIHRvIGxvY2sgYWxsIG9ycGhhbiBQVnMuCisgKiAgIFVzZSBWR19HTE9CQUwgYXMgYSBnbG9iYWwgbG9jayBhbmQgdG8gd2lwZSB0aGUgaW50ZXJuYWwgY2FjaGUuCisgKiAgIGNoYXIgKnZvbCBob2xkcyB2b2x1bWUgZ3JvdXAgbmFtZS4KKyAqICAgU2V0IExDS19DQUNIRSBmbGFnIHdoZW4gbWFuaXB1bGF0aW5nICd2b2wnIG1ldGFkYXRhIGluIHRoZSBpbnRlcm5hbCBjYWNoZS4KKyAqICAgKExpa2UgY29tbWl0LCByZXZlcnQgb3IgaW52YWxpZGF0ZSBtZXRhZGF0YS4pCisgKiAgIElmIG1vcmUgdGhhbiBvbmUgbG9jayBuZWVkcyB0byBiZSBoZWxkIHNpbXVsdGFuZW91c2x5LCB0aGV5IG11c3QgYmUKKyAqICAgYWNxdWlyZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIG9mICd2b2wnICh0byBhdm9pZCBkZWFkbG9ja3MpLCB3aXRoCisgKiAgIFZHX09SUEhBTlMgbGFzdC4KKyAqCisgKiAgIFVzZSBWR19TWU5DX05BTUVTIHRvIGVuc3VyZSAvZGV2IGlzIHVwLXRvLWRhdGUgZm9yIGV4YW1wbGUsIHdpdGggdWRldiwKKyAqICAgYnkgd2FpdGluZyBmb3IgYW55IGFzeW5jaHJvbm91cyBldmVudHMgaXNzdWVkIHRvIGhhdmUgY29tcGxldGVkLgorICoKKyAqIExDS19MVjoKKyAqICAgTG9jay91bmxvY2sgYW4gaW5kaXZpZHVhbCBsb2dpY2FsIHZvbHVtZQorICogICBjaGFyICp2b2wgaG9sZHMgbHZpZAorICovCitpbnQgbG9ja192b2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZvbCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKgorICogSW50ZXJuYWwgbG9ja2luZyByZXByZXNlbnRhdGlvbi4KKyAqICAgTENLX1ZHOiBVc2VzIHByZWZpeCBWXyB1bmxlc3MgdGhlIHZvbCBiZWdpbnMgd2l0aCAjIChpLmUuICNnbG9iYWwgb3IgI29ycGhhbnMpCisgKiAgICAgICAgICAgb3IgdGhlIExDS19DQUNIRSBmbGFnIGlzIHNldCB3aGVuIGl0IHVzZXMgdGhlIHByZWZpeCBQXy4KKyAqIElmIExDS19DQUNIRSBpcyBzZXQsIHdlIGRvIG5vdCB0YWtlIG91dCBhIHJlYWwgbG9jay4KKyAqIE5CIEluIGNsdXN0ZXJlZCBzaXR1YXRpb25zLCBMQ0tfQ0FDSEUgaXMgbm90IHByb3BhZ2F0ZWQgZGlyZWN0bHkgdG8gcmVtb3RlIG5vZGVzLgorICogKEl0IGNhbiBiZSBkZWR1Y2VkIGZyb20gbG9jayBuYW1lLikKKyAqLworCisvKgorICogRG9lcyB0aGUgTFZNMSBkcml2ZXIgaGF2ZSB0aGlzIFZHIGFjdGl2ZT8KKyAqLworaW50IGNoZWNrX2x2bTFfdmdfaW5hY3RpdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSk7CisKKy8qCisgKiBMb2NrIHR5cGUgLSB0aGVzZSBudW1iZXJzIGFyZSB0aGUgc2FtZSBhcyBWTVMgYW5kIHRoZSBJQk0gRExNCisgKi8KKyNkZWZpbmUgTENLX1RZUEVfTUFTSwkweDAwMDAwMDA3VQorCisjZGVmaW5lIExDS19OVUxMCTB4MDAwMDAwMDBVCS8qIExDSyRfTkxNT0RFIChEZWFjdGl2YXRlKSAqLworI2RlZmluZSBMQ0tfUkVBRAkweDAwMDAwMDAxVQkvKiBMQ0skX0NSTU9ERSAoQWN0aXZhdGUpICovCisJCQkJCS8qIExDSyRfQ1dNT0RFICovCisjZGVmaW5lIExDS19QUkVBRCAgICAgICAweDAwMDAwMDAzVQkvKiBMQ0skX1BSTU9ERSAqLworI2RlZmluZSBMQ0tfV1JJVEUJMHgwMDAwMDAwNFUJLyogTENLJF9QV01PREUgKFN1c3BlbmQpICovCisjZGVmaW5lIExDS19FWENMCTB4MDAwMDAwMDVVCS8qIExDSyRfRVhNT0RFIChFeGNsdXNpdmUpICovCisjZGVmaW5lIExDS19VTkxPQ0sgICAgICAweDAwMDAwMDA2VQkvKiBUaGlzIGlzIG91cnMgKFJlc3VtZSkgKi8KKworLyoKKyAqIExvY2sgZmxhZ3MgLSB0aGVzZSBudW1iZXJzIGFyZSB0aGUgc2FtZSBhcyBETE0KKyAqLworI2RlZmluZSBMQ0tGX05PUVVFVUUJMHgwMDAwMDAwMVUJLyogTEtGJF9OT1FVRVVFICovCisjZGVmaW5lIExDS0ZfQ09OVkVSVAkweDAwMDAwMDA0VQkvKiBMS0YkX0NPTlZFUlQgKi8KKworLyoKKyAqIExvY2sgc2NvcGUKKyAqLworI2RlZmluZSBMQ0tfU0NPUEVfTUFTSwkweDAwMDAxMDA4VQorI2RlZmluZSBMQ0tfVkcJCTB4MDAwMDAwMDBVCS8qIFZvbHVtZSBHcm91cCAqLworI2RlZmluZSBMQ0tfTFYJCTB4MDAwMDAwMDhVCS8qIExvZ2ljYWwgVm9sdW1lICovCisjZGVmaW5lIExDS19BQ1RJVkFUSU9OICAweDAwMDAxMDAwVQkvKiBBY3RpdmF0aW9uICovCisKKy8qCisgKiBMb2NrIGJpdHMuCisgKiBCb3R0b20gOCBiaXRzIGV4Y2VwdCBMQ0tfTE9DQUwgZm9ybSBhcmdzWzBdIGluIGNsdXN0ZXIgY29tbXMuCisgKi8KKyNkZWZpbmUgTENLX05PTkJMT0NLCTB4MDAwMDAwMTBVCS8qIERvbid0IGJsb2NrIHdhaXRpbmcgZm9yIGxvY2s/ICovCisjZGVmaW5lIExDS19IT0xECTB4MDAwMDAwMjBVCS8qIEhvbGQgbG9jayB3aGVuIGxvY2tfdm9sIHJldHVybnM/ICovCisjZGVmaW5lIExDS19DTFVTVEVSX1ZHCTB4MDAwMDAwODBVCS8qIFZHIGlzIGNsdXN0ZXJlZCAqLworCisjZGVmaW5lIExDS19MT0NBTAkweDAwMDAwMDQwVQkvKiBEb24ndCBwcm9wYWdhdGUgdG8gb3RoZXIgbm9kZXMgKi8KKyNkZWZpbmUgTENLX1JFTU9URQkweDAwMDAwODAwVQkvKiBQcm9wYWdhdGUgdG8gcmVtb3RlIG5vZGVzIG9ubHkgKi8KKyNkZWZpbmUgTENLX0NBQ0hFCTB4MDAwMDAxMDBVCS8qIE9wZXJhdGlvbiBvbiBjYWNoZSBvbmx5IHVzaW5nIFBfIGxvY2sgKi8KKyNkZWZpbmUgTENLX09SSUdJTl9PTkxZCTB4MDAwMDAyMDBVCS8qIE9wZXJhdGlvbiBzaG91bGQgYnlwYXNzIGFueSBzbmFwc2hvdHMgKi8KKyNkZWZpbmUgTENLX1JFVkVSVAkweDAwMDAwNDAwVQkvKiBSZXZlcnQgYW55IGluY29tcGxldGUgY2hhbmdlICovCisKKy8qCisgKiBBZGRpdGlvbmFsIGxvY2sgYml0cyBmb3IgY2x1c3RlciBjb21tdW5pY2F0aW9uIHZpYSBhcmdzWzFdCisgKi8KKyNkZWZpbmUgTENLX1BBUlRJQUxfTU9ERSAgICAgICAgCTB4MDEJLyogUGFydGlhbCBhY3RpdmF0aW9uPyAqLworI2RlZmluZSBMQ0tfTUlSUk9SX05PU1lOQ19NT0RFCQkweDAyCS8qIE1pcnJvcnMgZG9uJ3QgcmVxdWlyZSBzeW5jICovCisjZGVmaW5lIExDS19ETUVWRU5URF9NT05JVE9SX01PREUJMHgwNAkvKiBSZWdpc3RlciB3aXRoIGRtZXZlbnRkICovCisKKy8qIE5vdCB5ZXQgdXNlZC4gKi8KKyNkZWZpbmUgTENLX0NPTlZFUlRfTU9ERQkJMHgwOAkvKiBDb252ZXJ0IGV4aXN0aW5nIGxvY2sgKi8KKworI2RlZmluZSBMQ0tfVEVTVF9NT0RFCQkJMHgxMCAgICAvKiBUZXN0IG1vZGU6IE5vIGFjdGl2YXRpb24gKi8KKyNkZWZpbmUgTENLX09SSUdJTl9PTkxZX01PREUJCTB4MjAJLyogU2FtZSBhcyBhYm92ZSAqLworI2RlZmluZSBMQ0tfRE1FVkVOVERfTU9OSVRPUl9JR05PUkUgICAgIDB4NDAJLyogV2hldGhlciB0byBpZ25vcmUgZG1ldmVudGQgKi8KKyNkZWZpbmUgTENLX1JFVkVSVF9NT0RFCQkJMHg4MAkvKiBSZW1vdmUgaW5hY3RpdmUgdGFibGVzICovCisKKy8qCisgKiBTcGVjaWFsIGNhc2VzIG9mIFZHIGxvY2tzLgorICovCisjZGVmaW5lIFZHX09SUEhBTlMJIiNvcnBoYW5zIgorI2RlZmluZSBWR19HTE9CQUwJIiNnbG9iYWwiCisjZGVmaW5lIFZHX1NZTkNfTkFNRVMJIiNzeW5jX25hbWVzIgorCisvKgorICogQ29tbW9uIGNvbWJpbmF0aW9ucworICovCisjZGVmaW5lIExDS19OT05FCQkoTENLX1ZHIHwgTENLX05VTEwpCisKKyNkZWZpbmUgTENLX0FDVElWQVRFX0xPQ0sJKExDS19BQ1RJVkFUSU9OIHwgTENLX1dSSVRFIHwgTENLX0hPTEQpCisjZGVmaW5lIExDS19BQ1RJVkFURV9VTkxPQ0sJKExDS19BQ1RJVkFUSU9OIHwgTENLX1VOTE9DSykKKworI2RlZmluZSBMQ0tfVkdfUkVBRAkJKExDS19WRyB8IExDS19SRUFEIHwgTENLX0hPTEQpCisjZGVmaW5lIExDS19WR19XUklURQkJKExDS19WRyB8IExDS19XUklURSB8IExDS19IT0xEKQorI2RlZmluZSBMQ0tfVkdfVU5MT0NLCQkoTENLX1ZHIHwgTENLX1VOTE9DSykKKyNkZWZpbmUgTENLX1ZHX0RST1BfQ0FDSEUJKExDS19WRyB8IExDS19XUklURSB8IExDS19DQUNIRSkKKworLyogRklYTUU6IExDS19IT0xEIGFidXNlZCBoZXJlICovCisjZGVmaW5lIExDS19WR19DT01NSVQJCShMQ0tfVkcgfCBMQ0tfV1JJVEUgfCBMQ0tfQ0FDSEUgfCBMQ0tfSE9MRCkKKyNkZWZpbmUgTENLX1ZHX1JFVkVSVAkJKExDS19WRyB8IExDS19SRUFEICB8IExDS19DQUNIRSB8IExDS19IT0xEKQorCisjZGVmaW5lIExDS19WR19CQUNLVVAJCShMQ0tfVkcgfCBMQ0tfQ0FDSEUpCisKKyNkZWZpbmUgTENLX1ZHX1NZTkMJCShMQ0tfTk9ORSB8IExDS19DQUNIRSkKKyNkZWZpbmUgTENLX1ZHX1NZTkNfTE9DQUwJKExDS19OT05FIHwgTENLX0NBQ0hFIHwgTENLX0xPQ0FMKQorCisjZGVmaW5lIExDS19MVl9FWENMVVNJVkUJKExDS19MViB8IExDS19FWENMKQorI2RlZmluZSBMQ0tfTFZfU1VTUEVORAkJKExDS19MViB8IExDS19XUklURSkKKyNkZWZpbmUgTENLX0xWX1JFU1VNRQkJKExDS19MViB8IExDS19VTkxPQ0spCisjZGVmaW5lIExDS19MVl9BQ1RJVkFURQkJKExDS19MViB8IExDS19SRUFEKQorI2RlZmluZSBMQ0tfTFZfREVBQ1RJVkFURQkoTENLX0xWIHwgTENLX05VTEwpCisKKyNkZWZpbmUgTENLX01BU0sgKExDS19UWVBFX01BU0sgfCBMQ0tfU0NPUEVfTUFTSykKKworI2RlZmluZSBMQ0tfTFZfQ0xVU1RFUkVEKGx2KQlcCisJKHZnX2lzX2NsdXN0ZXJlZCgobHYpLT52ZykgPyBMQ0tfQ0xVU1RFUl9WRyA6IDApCisKKyNkZWZpbmUgbG9ja19sdl92b2woY21kLCBsdiwgZmxhZ3MpCVwKKwkoZmluZF9yZXBsaWNhdG9yX3ZncygobHYpKSA/IFwKKwkJIGxvY2tfdm9sKGNtZCwgKGx2KS0+bHZpZC5zLCBmbGFncyB8IExDS19MVl9DTFVTVEVSRUQobHYpLCBsdikgOglcCisJCTApCisKKy8qCisgKiBBY3RpdmF0aW9uIGxvY2tzIGFyZSB3cmFwcGVkIGFyb3VuZCBhY3RpdmF0aW9uIGNvbW1hbmRzIHRoYXQgaGF2ZSB0bworICogYmUgcHJvY2Vzc2VkIGF0b21pY2FsbHkgb25lLWF0LWEtdGltZS4KKyAqIElmIGEgVkcgV1JJVEUgbG9jayBpcyBoZWxkLCBhbiBhY3RpdmF0aW9uIGxvY2sgaXMgcmVkdW5kYW50LgorICoKKyAqIEZJWE1FIFRlc3QgYW5kIHN1cHBvcnQgdGhpcyBmb3IgdGhpbiBhbmQgY2FjaGUgdHlwZXMuCisgKiBGSVhNRSBBZGQgY2x1c3RlciBzdXBwb3J0LgorICovCisjZGVmaW5lIGx2X3N1cHBvcnRzX2FjdGl2YXRpb25fbG9ja2luZyhsdikgKCF2Z19pc19jbHVzdGVyZWQoKGx2KS0+dmcpICYmICFsdl9pc190aGluX3R5cGUobHYpICYmICFsdl9pc19jYWNoZV90eXBlKGx2KSkKKyNkZWZpbmUgbG9ja19hY3RpdmF0aW9uKGNtZCwgbHYpCSh2Z193cml0ZV9sb2NrX2hlbGQoKSAmJiBsdl9zdXBwb3J0c19hY3RpdmF0aW9uX2xvY2tpbmcobHYpID8gMSA6IGxvY2tfdm9sKGNtZCwgKGx2KS0+bHZpZC5zLCBMQ0tfQUNUSVZBVEVfTE9DSywgbHYpKQorI2RlZmluZSB1bmxvY2tfYWN0aXZhdGlvbihjbWQsIGx2KQkodmdfd3JpdGVfbG9ja19oZWxkKCkgJiYgbHZfc3VwcG9ydHNfYWN0aXZhdGlvbl9sb2NraW5nKGx2KSA/IDEgOiBsb2NrX3ZvbChjbWQsIChsdiktPmx2aWQucywgTENLX0FDVElWQVRFX1VOTE9DSywgbHYpKQorCisvKgorICogUGxhY2UgdGVtcG9yYXJ5IGV4Y2x1c2l2ZSAnYWN0aXZhdGlvbicgbG9jayBhcm91bmQgYW4gTFYgbG9ja2luZyBvcGVyYXRpb24KKyAqIHRvIHNlcmlhbGlzZSBpdC4KKyAqLworI2RlZmluZSBsb2NrX2x2X3ZvbF9zZXJpYWxseShjbWQsIGx2LCBmbGFncykgXAorKHsgXAorCWludCByciA9IDA7IFwKK1wKKwlpZiAobG9ja19hY3RpdmF0aW9uKChjbWQpLCAobHYpKSkgeyBcCisJCXJyID0gbG9ja19sdl92b2woKGNtZCksIChsdiksIChmbGFncykpOyBcCisJCXVubG9ja19hY3RpdmF0aW9uKChjbWQpLCAobHYpKTsgXAorCX0gXAorCXJyOyBcCit9KQorCisjZGVmaW5lIHVubG9ja192ZyhjbWQsIHZnLCB2b2wpCVwKKwlkbyB7IFwKKwkJaWYgKHZnICYmICFsdm1ldGFkX3ZnX3VwZGF0ZV9maW5pc2godmcpKSBcCisJCQlzdGFjazsgXAorCQlpZiAoaXNfcmVhbF92Zyh2b2wpICYmICFzeW5jX2Rldl9uYW1lcyhjbWQpKSBcCisJCQlzdGFjazsgXAorCQlpZiAoIWxvY2tfdm9sKGNtZCwgdm9sLCBMQ0tfVkdfVU5MT0NLLCBOVUxMKSkgXAorCQkJc3RhY2s7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSB1bmxvY2tfYW5kX3JlbGVhc2VfdmcoY21kLCB2Zywgdm9sKSBcCisJZG8geyBcCisJCXVubG9ja192ZyhjbWQsIHZnLCB2b2wpOyBcCisJCXJlbGVhc2VfdmcodmcpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSByZXN1bWVfbHYoY21kLCBsdikJXAorKHsgXAorCWludCByciA9IGxvY2tfbHZfdm9sKChjbWQpLCAobHYpLCBMQ0tfTFZfUkVTVU1FKTsgXAorCXVubG9ja19hY3RpdmF0aW9uKChjbWQpLCAobHYpKTsgXAorCXJyOyBcCit9KQorI2RlZmluZSByZXN1bWVfbHZfb3JpZ2luKGNtZCwgbHYpCWxvY2tfbHZfdm9sKGNtZCwgbHYsIExDS19MVl9SRVNVTUUgfCBMQ0tfT1JJR0lOX09OTFkpCisjZGVmaW5lIHJldmVydF9sdihjbWQsIGx2KQlcCisoeyBcCisJaW50IHJyID0gbG9ja19sdl92b2woKGNtZCksIChsdiksIExDS19MVl9SRVNVTUUgfCBMQ0tfUkVWRVJUKTsgXAorXAorCXVubG9ja19hY3RpdmF0aW9uKChjbWQpLCAobHYpKTsgXAorCXJyOyBcCit9KQorI2RlZmluZSBzdXNwZW5kX2x2KGNtZCwgbHYpCVwKKwkobG9ja19hY3RpdmF0aW9uKChjbWQpLCAobHYpKSA/IGxvY2tfbHZfdm9sKChjbWQpLCAobHYpLCBMQ0tfTFZfU1VTUEVORCB8IExDS19IT0xEKSA6IDApCisjZGVmaW5lIHN1c3BlbmRfbHZfb3JpZ2luKGNtZCwgbHYpCWxvY2tfbHZfdm9sKGNtZCwgbHYsIExDS19MVl9TVVNQRU5EIHwgTENLX0hPTEQgfCBMQ0tfT1JJR0lOX09OTFkpCisjZGVmaW5lIGRlYWN0aXZhdGVfbHYoY21kLCBsdikJbG9ja19sdl92b2xfc2VyaWFsbHkoY21kLCBsdiwgTENLX0xWX0RFQUNUSVZBVEUpCisKKyNkZWZpbmUgYWN0aXZhdGVfbHYoY21kLCBsdikJbG9ja19sdl92b2xfc2VyaWFsbHkoY21kLCBsdiwgTENLX0xWX0FDVElWQVRFIHwgTENLX0hPTEQpCisjZGVmaW5lIGFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdikJXAorCQkJCWxvY2tfbHZfdm9sX3NlcmlhbGx5KGNtZCwgbHYsIExDS19MVl9FWENMVVNJVkUgfCBMQ0tfSE9MRCB8IExDS19MT0NBTCkKKyNkZWZpbmUgYWN0aXZhdGVfbHZfZXhjbF9yZW1vdGUoY21kLCBsdikJXAorCQkJCWxvY2tfbHZfdm9sKGNtZCwgbHYsIExDS19MVl9FWENMVVNJVkUgfCBMQ0tfSE9MRCB8IExDS19SRU1PVEUpCisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZTsKK2ludCBhY3RpdmF0ZV9sdl9leGNsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworI2RlZmluZSBhY3RpdmF0ZV9sdl9sb2NhbChjbWQsIGx2KQlcCisJbG9ja19sdl92b2xfc2VyaWFsbHkoY21kLCBsdiwgTENLX0xWX0FDVElWQVRFIHwgTENLX0hPTEQgfCBMQ0tfTE9DQUwpCisjZGVmaW5lIGRlYWN0aXZhdGVfbHZfbG9jYWwoY21kLCBsdikJXAorCWxvY2tfbHZfdm9sX3NlcmlhbGx5KGNtZCwgbHYsIExDS19MVl9ERUFDVElWQVRFIHwgTENLX0xPQ0FMKQorI2RlZmluZSBkcm9wX2NhY2hlZF9tZXRhZGF0YSh2ZykJXAorCWxvY2tfdm9sKCh2ZyktPmNtZCwgKHZnKS0+bmFtZSwgTENLX1ZHX0RST1BfQ0FDSEUsIE5VTEwpCisjZGVmaW5lIHJlbW90ZV9jb21taXRfY2FjaGVkX21ldGFkYXRhKHZnKQlcCisJbG9ja192b2woKHZnKS0+Y21kLCAodmcpLT5uYW1lLCBMQ0tfVkdfQ09NTUlULCBOVUxMKQorI2RlZmluZSByZW1vdGVfcmV2ZXJ0X2NhY2hlZF9tZXRhZGF0YSh2ZykJXAorCWxvY2tfdm9sKCh2ZyktPmNtZCwgKHZnKS0+bmFtZSwgTENLX1ZHX1JFVkVSVCwgTlVMTCkKKyNkZWZpbmUgcmVtb3RlX2JhY2t1cF9tZXRhZGF0YSh2ZykJXAorCWxvY2tfdm9sKCh2ZyktPmNtZCwgKHZnKS0+bmFtZSwgTENLX1ZHX0JBQ0tVUCwgTlVMTCkKKworaW50IHN5bmNfbG9jYWxfZGV2X25hbWVzKHN0cnVjdCBjbWRfY29udGV4dCogY21kKTsKK2ludCBzeW5jX2Rldl9uYW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQqIGNtZCk7CisKKy8qIFByb2Nlc3MgbGlzdCBvZiBMVnMgKi8KK3N0cnVjdCB2b2x1bWVfZ3JvdXA7CitpbnQgc3VzcGVuZF9sdnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpsdnMsCisJCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvX3JldmVydCk7CitpbnQgcmVzdW1lX2x2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKmx2cyk7CitpbnQgcmV2ZXJ0X2x2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKmx2cyk7CitpbnQgYWN0aXZhdGVfbHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzLCB1bnNpZ25lZCBleGNsdXNpdmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9sb2NraW5nL2xvY2tpbmdfdHlwZXMuaCBiL2xpYi9sb2NraW5nL2xvY2tpbmdfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA2YThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvbG9ja2luZ190eXBlcy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCit0eXBlZGVmIGludCAoKmxvY2tfcmVzb3VyY2VfZm4pIChzdHJ1Y3QgY21kX2NvbnRleHQgKiBjbWQsIGNvbnN0IGNoYXIgKnJlc291cmNlLAorCQkJCSB1aW50MzJfdCBmbGFncywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7Cit0eXBlZGVmIGludCAoKnF1ZXJ5X3Jlc291cmNlX2ZuKSAoY29uc3QgY2hhciAqcmVzb3VyY2UsIGNvbnN0IGNoYXIgKm5vZGUsIGludCAqbW9kZSk7CisKK3R5cGVkZWYgdm9pZCAoKmZpbl9sb2NrX2ZuKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpyZXNldF9sb2NrX2ZuKSAodm9pZCk7CisKKyNkZWZpbmUgTENLX1BSRV9NRU1MT0NLCQkJMHgwMDAwMDAwMQkvKiBJcyBtZW1sb2NrKCkgbmVlZGVkIGJlZm9yZSBjYWxscz8gKi8KKyNkZWZpbmUgTENLX0NMVVNURVJFRAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTENLX1NVUFBPUlRTX1JFTU9URV9RVUVSSUVTCTB4MDAwMDAwMDQKKworc3RydWN0IGxvY2tpbmdfdHlwZSB7CisJdWludDMyX3QgZmxhZ3M7CisJbG9ja19yZXNvdXJjZV9mbiBsb2NrX3Jlc291cmNlOworCXF1ZXJ5X3Jlc291cmNlX2ZuIHF1ZXJ5X3Jlc291cmNlOworCisJcmVzZXRfbG9ja19mbiByZXNldF9sb2NraW5nOworCWZpbl9sb2NrX2ZuIGZpbl9sb2NraW5nOworfTsKKworLyoKKyAqIExvY2tpbmcgdHlwZXMKKyAqLwordm9pZCBpbml0X25vX2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICAgaW50IHN1cHByZXNzX21lc3NhZ2VzKTsKKwordm9pZCBpbml0X2R1bW15X2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQlpbnQgc3VwcHJlc3NfbWVzc2FnZXMpOworCitpbnQgaW5pdF9yZWFkb25seV9sb2NraW5nKHN0cnVjdCBsb2NraW5nX3R5cGUgKmxvY2tpbmcsIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpOworCitpbnQgaW5pdF9maWxlX2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICAgIGludCBzdXBwcmVzc19tZXNzYWdlcyk7CisKK2ludCBpbml0X2V4dGVybmFsX2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgIGludCBzdXBwcmVzc19tZXNzYWdlcyk7CisKK2ludCBpbml0X2NsdXN0ZXJfbG9ja2luZyhzdHJ1Y3QgbG9ja2luZ190eXBlICpsb2NraW5nLCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpOwpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmcvbHZtbG9ja2QuYyBiL2xpYi9sb2NraW5nL2x2bWxvY2tkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjZjY5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sb2NraW5nL2x2bWxvY2tkLmMKQEAgLTAsMCArMSwyNjc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAibHZtbG9ja2QtY2xpZW50LmgiCisKK3N0YXRpYyBkYWVtb25faGFuZGxlIF9sdm1sb2NrZDsKK3N0YXRpYyBjb25zdCBjaGFyICpfbHZtbG9ja2Rfc29ja2V0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY21kX2NvbnRleHQgKl9sdm1sb2NrZF9jbWQgPSBOVUxMOworc3RhdGljIGludCBfdXNlX2x2bWxvY2tkID0gMDsgICAgICAgICAvKiBpcyAxIGlmIGNvbW1hbmQgaXMgY29uZmlndXJlZCB0byB1c2UgbHZtbG9ja2QgKi8KK3N0YXRpYyBpbnQgX2x2bWxvY2tkX2Nvbm5lY3RlZCA9IDA7ICAgLyogaXMgMSBpZiBjb21tYW5kIGlzIGNvbm5lY3RlZCB0byBsdm1sb2NrZCAqLworc3RhdGljIGludCBfbHZtbG9ja2RfaW5pdF9mYWlsZWQgPSAwOyAvKiB1c2VkIHRvIHN1cHByZXNzIGZ1cnRoZXIgd2FybmluZ3MgKi8KKwordm9pZCBsdm1sb2NrZF9zZXRfc29ja2V0KGNvbnN0IGNoYXIgKnNvY2spCit7CisJX2x2bWxvY2tkX3NvY2tldCA9IHNvY2s7Cit9CisKKy8qCisgKiBTZXQgZGlyZWN0bHkgZnJvbSBnbG9iYWwvdXNlX2x2bWxvY2tkCisgKi8KK3ZvaWQgbHZtbG9ja2Rfc2V0X3VzZShpbnQgdXNlKQoreworCV91c2VfbHZtbG9ja2QgPSB1c2U7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBnbG9iYWwvdXNlX2x2bWxvY2tkIGJlaW5nIHVzZWQgYnkgdGhlIGNvbW1hbmQuCisgKi8KK2ludCBsdm1sb2NrZF91c2Uodm9pZCkKK3sKKwlyZXR1cm4gX3VzZV9sdm1sb2NrZDsKK30KKworLyoKKyAqIFRoZSBjb21tYW5kIGNvbnRpbnVlcyBldmVuIGlmIGluaXQgYW5kL29yIGNvbm5lY3QgZmFpbCwKKyAqIGJlY2F1c2UgdGhlIGNvbW1hbmQgaXMgYWxsb3dlZCB0byB1c2UgbG9jYWwgVkdzIHdpdGhvdXQgbHZtbG9ja2QsCisgKiBhbmQgaXMgYWxsb3dlZCB0byByZWFkIGxvY2tkIFZHcyB3aXRob3V0IGxvY2tzIGZyb20gbHZtbG9ja2QuCisgKi8KK3ZvaWQgbHZtbG9ja2RfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpZiAoIV91c2VfbHZtbG9ja2QpIHsKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiwgZG9uJ3QgY2FsbCBpbml0IHdoZW4gbm90IHVzaW5nIGx2bWxvY2tkLiAqLworCQlsb2dfZXJyb3IoIlNob3VsZCBub3QgaW5pdGlhbGl6ZSBsdm1sb2NrZCB3aXRoIHVzZV9sdm1sb2NrZD0wLiIpOworCX0KKworCWlmICghX2x2bWxvY2tkX3NvY2tldCkgeworCQlsb2dfd2FybigiV0FSTklORzogbHZtbG9ja2Qgc29ja2V0IGxvY2F0aW9uIGlzIG5vdCBjb25maWd1cmVkLiIpOworCQlfbHZtbG9ja2RfaW5pdF9mYWlsZWQgPSAxOworCX0KKworCWlmICghIWFjY2VzcyhMVk1MT0NLRF9QSURGSUxFLCBGX09LKSkgeworCQlsb2dfd2FybigiV0FSTklORzogbHZtbG9ja2QgcHJvY2VzcyBpcyBub3QgcnVubmluZy4iKTsKKwkJX2x2bWxvY2tkX2luaXRfZmFpbGVkID0gMTsKKwl9IGVsc2UgeworCQlfbHZtbG9ja2RfaW5pdF9mYWlsZWQgPSAwOworCX0KKworCV9sdm1sb2NrZF9jbWQgPSBjbWQ7Cit9CisKK3ZvaWQgbHZtbG9ja2RfY29ubmVjdCh2b2lkKQoreworCWlmICghX3VzZV9sdm1sb2NrZCkgeworCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBkb24ndCBjYWxsIGNvbm5lY3Qgd2hlbiBub3QgdXNpbmcgbHZtbG9ja2QuICovCisJCWxvZ19lcnJvcigiU2hvdWxkIG5vdCBjb25uZWN0IHRvIGx2bWxvY2tkIHdpdGggdXNlX2x2bWxvY2tkPTAuIik7CisJfQorCisJaWYgKF9sdm1sb2NrZF9jb25uZWN0ZWQpIHsKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiwgb25seSBjYWxsIGNvbm5lY3Qgb25jZS4gKi8KKwkJbG9nX2Vycm9yKCJsdm1sb2NrZCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4iKTsKKwl9CisKKwlpZiAoX2x2bWxvY2tkX2luaXRfZmFpbGVkKQorCQlyZXR1cm47CisKKwlfbHZtbG9ja2QgPSBsdm1sb2NrZF9vcGVuKF9sdm1sb2NrZF9zb2NrZXQpOworCisJaWYgKF9sdm1sb2NrZC5zb2NrZXRfZmQgPj0gMCAmJiAhX2x2bWxvY2tkLmVycm9yKSB7CisJCWxvZ19kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBsdm1sb2NrZCBvbiBmZCAlZC4iLCBfbHZtbG9ja2Quc29ja2V0X2ZkKTsKKwkJX2x2bWxvY2tkX2Nvbm5lY3RlZCA9IDE7CisJfSBlbHNlIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IGx2bWxvY2tkIGNvbm5lY3QgZmFpbGVkLiIpOworCX0KK30KKwordm9pZCBsdm1sb2NrZF9kaXNjb25uZWN0KHZvaWQpCit7CisJaWYgKF9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCWRhZW1vbl9jbG9zZShfbHZtbG9ja2QpOworCV9sdm1sb2NrZF9jb25uZWN0ZWQgPSAwOworCV9sdm1sb2NrZF9jbWQgPSBOVUxMOworfQorCisvKiBUcmFuc2xhdGUgdGhlIHJlc3VsdCBzdHJpbmdzIGZyb20gbHZtbG9ja2QgdG8gYml0IGZsYWdzLiAqLworc3RhdGljIHZvaWQgX2ZsYWdzX3N0cl90b19sb2NrZF9mbGFncyhjb25zdCBjaGFyICpmbGFnc19zdHIsIHVpbnQzMl90ICpsb2NrZF9mbGFncykKK3sKKwlpZiAoc3Ryc3RyKGZsYWdzX3N0ciwgIk5PX0xPQ0tTUEFDRVMiKSkKKwkJKmxvY2tkX2ZsYWdzIHw9IExEX1JGX05PX0xPQ0tTUEFDRVM7CisKKwlpZiAoc3Ryc3RyKGZsYWdzX3N0ciwgIk5PX0dMX0xTIikpCisJCSpsb2NrZF9mbGFncyB8PSBMRF9SRl9OT19HTF9MUzsKKworCWlmIChzdHJzdHIoZmxhZ3Nfc3RyLCAiRFVQX0dMX0xTIikpCisJCSpsb2NrZF9mbGFncyB8PSBMRF9SRl9EVVBfR0xfTFM7CisKKwlpZiAoc3Ryc3RyKGZsYWdzX3N0ciwgIldBUk5fR0xfUkVNT1ZFRCIpKQorCQkqbG9ja2RfZmxhZ3MgfD0gTERfUkZfV0FSTl9HTF9SRU1PVkVEOworfQorCisvKgorICogZXZhbHVhdGUgdGhlIHJlcGx5IGZyb20gbHZtbG9ja2QsIGNoZWNrIGZvciBlcnJvcnMsIGV4dHJhY3QKKyAqIHRoZSByZXN1bHQgYW5kIGxvY2tkX2ZsYWdzIHJldHVybmVkIGJ5IGx2bWxvY2tkLgorICogMCBmYWlsdXJlIChubyByZXN1bHQvbG9ja2RfZmxhZ3Mgc2V0KQorICogMSBzdWNjZXNzIChyZXN1bHQvbG9ja2RfZmxhZ3Mgc2V0KQorICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGFyYml0cmFyeSBudW1iZXIgdGhhdCB3ZSBrbm93IGx2bWxvY2tkCisgKiB3aWxsIG5vdCByZXR1cm4uICBkYWVtb25fcmVwbHlfaW50IHJldmVydHMgdG8gdGhpcworICogdmFsdWUgaWYgaXQgZmluZHMgbm8gcmVzdWx0IHZhbHVlLgorICovCisjZGVmaW5lIE5PX0xPQ0tEX1JFU1VMVCAtMTAwMAorCitzdGF0aWMgaW50IF9sb2NrZF9yZXN1bHQoZGFlbW9uX3JlcGx5IHJlcGx5LCBpbnQgKnJlc3VsdCwgdWludDMyX3QgKmxvY2tkX2ZsYWdzKQoreworCWludCByZXBseV9yZXN1bHQ7CisJY29uc3QgY2hhciAqZmxhZ3Nfc3RyID0gTlVMTDsKKwljb25zdCBjaGFyICpsb2NrX3R5cGUgPSBOVUxMOworCisJKnJlc3VsdCA9IC0xOworCisJaWYgKHJlcGx5LmVycm9yKSB7CisJCWxvZ19lcnJvcigibG9ja2RfcmVzdWx0IHJlcGx5IGVycm9yICVkIiwgcmVwbHkuZXJyb3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJyZXNwb25zZSIsICIiKSwgIk9LIikpIHsKKwkJbG9nX2Vycm9yKCJsb2NrZF9yZXN1bHQgYmFkIHJlc3BvbnNlIik7CisJCXJldHVybiAwOworCX0KKworCXJlcGx5X3Jlc3VsdCA9IGRhZW1vbl9yZXBseV9pbnQocmVwbHksICJvcF9yZXN1bHQiLCBOT19MT0NLRF9SRVNVTFQpOworCWlmIChyZXBseV9yZXN1bHQgPT0gTk9fTE9DS0RfUkVTVUxUKSB7CisJCWxvZ19lcnJvcigibG9ja2RfcmVzdWx0IG5vIG9wX3Jlc3VsdCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUaGUgbG9ja190eXBlIHRoYXQgbHZtbG9ja2QgdXNlZCBmb3IgbG9ja2luZy4gKi8KKwlsb2NrX3R5cGUgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAibG9ja190eXBlIiwgIm5vbmUiKTsKKworCSpyZXN1bHQgPSByZXBseV9yZXN1bHQ7CisKKwlpZiAobG9ja2RfZmxhZ3MpIHsKKwkJaWYgKChmbGFnc19zdHIgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAicmVzdWx0X2ZsYWdzIiwgTlVMTCkpKQorCQkJX2ZsYWdzX3N0cl90b19sb2NrZF9mbGFncyhmbGFnc19zdHIsIGxvY2tkX2ZsYWdzKTsKKwl9CisKKwlsb2dfZGVidWcoImxvY2tkX3Jlc3VsdCAlZCBmbGFncyAlcyBsbSAlcyIsIHJlcGx5X3Jlc3VsdCwKKwkJICBmbGFnc19zdHIgPyBmbGFnc19zdHIgOiAibm9uZSIsIGxvY2tfdHlwZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBkYWVtb25fcmVwbHkgX2xvY2tkX3NlbmQoY29uc3QgY2hhciAqcmVxX25hbWUsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWRhZW1vbl9yZXBseSByZXBsOworCWRhZW1vbl9yZXF1ZXN0IHJlcTsKKworCXJlcSA9IGRhZW1vbl9yZXF1ZXN0X21ha2UocmVxX25hbWUpOworCisJdmFfc3RhcnQoYXAsIHJlcV9uYW1lKTsKKwlkYWVtb25fcmVxdWVzdF9leHRlbmRfdihyZXEsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmVwbCA9IGRhZW1vbl9zZW5kKF9sdm1sb2NrZCwgcmVxKTsKKworCWRhZW1vbl9yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKworCXJldHVybiByZXBsOworfQorCisvKgorICogcmVzdWx0L2xvY2tkX2ZsYWdzIGFyZSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBsdm1sb2NrZC4KKyAqCisgKiByZXR1cm4gMCAoZmFpbHVyZSkKKyAqIHJldHVybiAxIChyZXN1bHQvbG9ja2RfZmxhZ3MgaW5kaWNhdGUgc3VjY2Vzcy9mYWlsdXJlKQorICoKKyAqIHJldHVybiAxIHJlc3VsdCAwICAgKHN1Y2Nlc3MpCisgKiByZXR1cm4gMSByZXN1bHQgPCAwIChmYWlsdXJlKQorICoKKyAqIGNhbGxlciBtYXkgaWdub3JlIHJlc3VsdCA8IDAgZmFpbHVyZSBkZXBlbmRpbmcgb24KKyAqIGxvY2tkX2ZsYWdzIGFuZCB0aGUgc3BlY2lmaWMgY29tbWFuZC9tb2RlLgorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgKGZhaWx1cmUpLCBubyByZXN1bHQvbG9ja2RfZmxhZ3MKKyAqIHdlcmUgb2J0YWluZWQgZnJvbSBsdm1sb2NrZC4KKyAqCisgKiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIChzdWNjZXNzKSwgcmVzdWx0L2xvY2tkX2ZsYWdzIG1heQorICogaGF2ZSBiZWVuIG9idGFpbmVkIGZyb20gbHZtbG9ja2QuICBUaGlzIGx2bWxvY2tkIHJlc3VsdCBtYXkKKyAqIGluZGljYXRlIGEgbG9ja2luZyBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgX2xvY2tkX3JlcXVlc3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICAgICAgICBjb25zdCBjaGFyICpyZXFfbmFtZSwKKwkJICAgICAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCSAgICAgICAgICBjb25zdCBjaGFyICp2Z19sb2NrX3R5cGUsCisJCSAgICAgICAgICBjb25zdCBjaGFyICp2Z19sb2NrX2FyZ3MsCisJCSAgICAgICAgICBjb25zdCBjaGFyICpsdl9uYW1lLAorCQkgICAgICAgICAgY29uc3QgY2hhciAqbHZfdXVpZCwKKwkJICAgICAgICAgIGNvbnN0IGNoYXIgKmx2X2xvY2tfYXJncywKKwkJICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUsCisJCSAgICAgICAgICBjb25zdCBjaGFyICpvcHRzLAorCQkgICAgICAgICAgaW50ICpyZXN1bHQsCisJCSAgICAgICAgICB1aW50MzJfdCAqbG9ja2RfZmxhZ3MpCit7CisJY29uc3QgY2hhciAqY21kX25hbWUgPSBnZXRfY21kX25hbWUoKTsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHBpZCA9IGdldHBpZCgpOworCisJKnJlc3VsdCA9IDA7CisJKmxvY2tkX2ZsYWdzID0gMDsKKworCWlmICghc3RyY21wKG1vZGUsICJuYSIpKQorCQlyZXR1cm4gMTsKKworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDA7CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCS8qIGNtZCBhbmQgcGlkIGFyZSBwYXNzZWQgZm9yIGluZm9ybWF0aW9uYWwgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworCisJaWYgKCFjbWRfbmFtZSB8fCAhY21kX25hbWVbMF0pCisJCWNtZF9uYW1lID0gIm5vbmUiOworCisJaWYgKHZnX25hbWUgJiYgbHZfbmFtZSkgeworCQlyZXBseSA9IF9sb2NrZF9zZW5kKHJlcV9uYW1lLAorCQkJCQkiY21kID0gJXMiLCBjbWRfbmFtZSwKKwkJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgcGlkLAorCQkJCQkibW9kZSA9ICVzIiwgbW9kZSwKKwkJCQkJIm9wdHMgPSAlcyIsIG9wdHMgPzogIm5vbmUiLAorCQkJCQkidmdfbmFtZSA9ICVzIiwgdmdfbmFtZSwKKwkJCQkJImx2X25hbWUgPSAlcyIsIGx2X25hbWUsCisJCQkJCSJsdl91dWlkID0gJXMiLCBsdl91dWlkLAorCQkJCQkidmdfbG9ja190eXBlID0gJXMiLCB2Z19sb2NrX3R5cGUgPzogIm5vbmUiLAorCQkJCQkidmdfbG9ja19hcmdzID0gJXMiLCB2Z19sb2NrX2FyZ3MgPzogIm5vbmUiLAorCQkJCQkibHZfbG9ja19hcmdzID0gJXMiLCBsdl9sb2NrX2FyZ3MgPzogIm5vbmUiLAorCQkJCQlOVUxMKTsKKworCQlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksIHJlc3VsdCwgbG9ja2RfZmxhZ3MpKQorCQkJZ290byBmYWlsOworCisJCWxvZ19kZWJ1ZygibHZtbG9ja2QgJXMgJXMgdmcgJXMgbHYgJXMgcmVzdWx0ICVkICV4IiwKKwkJCSAgcmVxX25hbWUsIG1vZGUsIHZnX25hbWUsIGx2X25hbWUsICpyZXN1bHQsICpsb2NrZF9mbGFncyk7CisKKwl9IGVsc2UgaWYgKHZnX25hbWUpIHsKKwkJcmVwbHkgPSBfbG9ja2Rfc2VuZChyZXFfbmFtZSwKKwkJCQkJImNtZCA9ICVzIiwgY21kX25hbWUsCisJCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIHBpZCwKKwkJCQkJIm1vZGUgPSAlcyIsIG1vZGUsCisJCQkJCSJvcHRzID0gJXMiLCBvcHRzID86ICJub25lIiwKKwkJCQkJInZnX25hbWUgPSAlcyIsIHZnX25hbWUsCisJCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnX2xvY2tfdHlwZSA/OiAibm9uZSIsCisJCQkJCSJ2Z19sb2NrX2FyZ3MgPSAlcyIsIHZnX2xvY2tfYXJncyA/OiAibm9uZSIsCisJCQkJCU5VTEwpOworCisJCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgcmVzdWx0LCBsb2NrZF9mbGFncykpCisJCQlnb3RvIGZhaWw7CisKKwkJbG9nX2RlYnVnKCJsdm1sb2NrZCAlcyAlcyB2ZyAlcyByZXN1bHQgJWQgJXgiLAorCQkJICByZXFfbmFtZSwgbW9kZSwgdmdfbmFtZSwgKnJlc3VsdCwgKmxvY2tkX2ZsYWdzKTsKKworCX0gZWxzZSB7CisJCXJlcGx5ID0gX2xvY2tkX3NlbmQocmVxX25hbWUsCisJCQkJCSJjbWQgPSAlcyIsIGNtZF9uYW1lLAorCQkJCQkicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBwaWQsCisJCQkJCSJtb2RlID0gJXMiLCBtb2RlLAorCQkJCQkib3B0cyA9ICVzIiwgb3B0cyA/OiAibm9uZSIsCisJCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnX2xvY2tfdHlwZSA/OiAibm9uZSIsCisJCQkJCU5VTEwpOworCisJCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgcmVzdWx0LCBsb2NrZF9mbGFncykpCisJCQlnb3RvIGZhaWw7CisKKwkJbG9nX2RlYnVnKCJsdm1sb2NrZCAlcyAlcyByZXN1bHQgJWQgJXgiLAorCQkJICByZXFfbmFtZSwgbW9kZSwgKnJlc3VsdCwgKmxvY2tkX2ZsYWdzKTsKKwl9CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwkvKiByZXN1bHQvbG9ja2RfZmxhZ3MgaGF2ZSBsdm1sb2NrZCByZXN1bHQgKi8KKwlyZXR1cm4gMTsKKworIGZhaWw6CisJLyogbm8gcmVzdWx0IHdhcyBvYnRhaW5lZCBmcm9tIGx2bWxvY2tkICovCisKKwlsb2dfZXJyb3IoImx2bWxvY2tkICVzICVzIGZhaWxlZCBubyByZXN1bHQiLCByZXFfbmFtZSwgbW9kZSk7CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFdmVudHVhbGx5IGFkZCBhbiBvcHRpb24gdG8gc3BlY2lmeSB3aGljaCBwdiB0aGUgbHZtbG9jayBsdiBzaG91bGQgYmUgcGxhY2VkIG9uLgorICovCisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9zYW5sb2NrX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmxvY2tfbHZfbmFtZSwgaW50IGV4dGVuZF9tYikKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCXN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgbHAgPSB7CisJCS5hY3RpdmF0ZSA9IENIQU5HRV9BTFksCisJCS5hbGxvYyA9IEFMTE9DX0lOSEVSSVQsCisJCS5leHRlbnRzID0gKGV4dGVuZF9tYiAqIDEwMjQgKiAxMDI0KSAvICh2Zy0+ZXh0ZW50X3NpemUgKiBTRUNUT1JfU0laRSksCisJCS5tYWpvciA9IC0xLAorCQkubWlub3IgPSAtMSwKKwkJLnBlcm1pc3Npb24gPSBMVk1fUkVBRCB8IExWTV9XUklURSwKKwkJLnB2aCA9ICZ2Zy0+cHZzLAorCQkucmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfTk9ORSwKKwkJLnN0cmlwZXMgPSAxLAorCQkudmdfbmFtZSA9IHZnLT5uYW1lLAorCQkubHZfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBsb2NrX2x2X25hbWUpLAorCQkuemVybyA9IDEsCisJfTsKKworCWRtX2xpc3RfaW5pdCgmbHAudGFncyk7CisKKwlpZiAoIShscC5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJbHYgPSBsdl9jcmVhdGVfc2luZ2xlKHZnLCAmbHApOworCWlmICghbHYpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHNhbmxvY2sgbHYgJXMgaW4gdmcgJXMiLCBsb2NrX2x2X25hbWUsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmctPnNhbmxvY2tfbHYgPSBsdjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZW1vdmVfc2FubG9ja19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCFsdl9yZW1vdmUodmctPnNhbmxvY2tfbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBzYW5sb2NrIExWICVzLyVzIiwgdmctPm5hbWUsIHZnLT5zYW5sb2NrX2x2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2V4dGVuZF9zYW5sb2NrX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgaW50IGV4dGVuZF9tYikKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gdmctPnNhbmxvY2tfbHY7CisJc3RydWN0IGx2cmVzaXplX3BhcmFtcyBscCA9IHsKKwkJLnNpZ24gPSBTSUdOX05PTkUsCisJCS5zaXplID0gbHYtPnNpemUgKyAoKGV4dGVuZF9tYiAqIDEwMjQgKiAxMDI0KSAvIFNFQ1RPUl9TSVpFKSwKKwkJLnBlcmNlbnQgPSBQRVJDRU5UX05PTkUsCisJCS5yZXNpemUgPSBMVl9FWFRFTkQsCisJCS5mb3JjZSA9IDEsCisJfTsKKworCWlmICghbHZfcmVzaXplKGx2LCAmbHAsICZ2Zy0+cHZzKSkgeworCQlsb2dfZXJyb3IoIkV4dGVuZCBMViAlcyB0byBzaXplICVzIGZhaWxlZC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdiksIGRpc3BsYXlfc2l6ZShjbWQsIGxwLnNpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFdoZW4gb25lIGhvc3QgZG9lcyBfZXh0ZW5kX3NhbmxvY2tfbHYsIHRoZSBvdGhlcnMgbmVlZCB0byByZWZyZXNoIHRoZSBzaXplLiAqLworCitzdGF0aWMgaW50IF9yZWZyZXNoX3NhbmxvY2tfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmICghbHZfcmVmcmVzaF9zdXNwZW5kX3Jlc3VtZSh2Zy0+c2FubG9ja19sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVmcmVzaCAlcy4iLCB2Zy0+c2FubG9ja19sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgbHZjcmVhdGUgaW4gYSBzYW5sb2NrIFZHIHRvIGVuc3VyZQorICogdGhhdCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgc2FubG9jayBMViBmb3IgYSBuZXcgbG9jay4gIElmIGl0J3MKKyAqIGZ1bGwsIHRoZW4gdGhpcyBleHRlbmRzIGl0LgorICovCisKK2ludCBoYW5kbGVfc2FubG9ja19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCBleHRlbmRfbWI7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMTsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJZXh0ZW5kX21iID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBnbG9iYWxfc2FubG9ja19sdl9leHRlbmRfQ0ZHLCBOVUxMKTsKKworCS8qCisJICogVXNlciBjYW4gY2hvb3NlIHRvIG5vdCBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGUgbHZtbG9jayBMVgorCSAqIHNvIHRoZXkgY2FuIG1hbnVhbGx5IGV4dGVuZCBpdC4KKwkgKi8KKwlpZiAoIWV4dGVuZF9tYikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIEFub3RoZXIgaG9zdCBtYXkgaGF2ZSBleHRlbmRlZCB0aGUgbHZtbG9jayBMViBhbHJlYWR5LgorCSAqIFJlZnJlc2ggc28gdGhhdCB3ZSdsbCBmaW5kIHRoZSBuZXcgc3BhY2UgdGhleSBhZGRlZAorCSAqIHdoZW4gd2Ugc2VhcmNoIGZvciBuZXcgc3BhY2UuCisJICovCisJaWYgKCFfcmVmcmVzaF9zYW5sb2NrX2x2KGNtZCwgdmcpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQXNrIGx2bWxvY2tkL3NhbmxvY2sgdG8gbG9vayBmb3IgYW4gdW51c2VkIGxvY2suCisJICovCisJcmVwbHkgPSBfbG9ja2Rfc2VuZCgiZmluZF9mcmVlX2xvY2siLAorCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkidmdfbmFtZSA9ICVzIiwgdmctPm5hbWUsCisJCQlOVUxMKTsKKworCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgJnJlc3VsdCwgTlVMTCkpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAocmVzdWx0IDwgMCkgPyAwIDogMTsKKwl9CisKKwkvKiBObyBzcGFjZSBvbiB0aGUgbHZtbG9jayBsdiBmb3IgYSBuZXcgbGVhc2UuICovCisJaWYgKHJlc3VsdCA9PSAtRU1TR1NJWkUpCisJCXJldCA9IF9leHRlbmRfc2FubG9ja19sdihjbWQsIHZnLCBleHRlbmRfbWIpOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfYWN0aXZhdGVfc2FubG9ja19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCFhY3RpdmF0ZV9sdihjbWQsIHZnLT5zYW5sb2NrX2x2KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSBzYW5sb2NrIGx2ICVzLyVzIiwgdmctPm5hbWUsIHZnLT5zYW5sb2NrX2x2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RlYWN0aXZhdGVfc2FubG9ja19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgdmctPnNhbmxvY2tfbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRlYWN0aXZhdGUgc2FubG9jayBsdiAlcy8lcyIsIHZnLT5uYW1lLCB2Zy0+c2FubG9ja19sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbml0X3ZnX2RsbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNvbnN0IGNoYXIgKnJlcGx5X3N0cjsKKwljb25zdCBjaGFyICp2Z19sb2NrX2FyZ3MgPSBOVUxMOworCWludCByZXN1bHQ7CisJaW50IHJldDsKKworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDA7CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCXJlcGx5ID0gX2xvY2tkX3NlbmQoImluaXRfdmciLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCQkidmdfbG9ja190eXBlID0gJXMiLCAiZGxtIiwKKwkJCQlOVUxMKTsKKworCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgJnJlc3VsdCwgTlVMTCkpIHsKKwkJcmV0ID0gMDsKKwkJcmVzdWx0ID0gLUVMT0NLRDsKKwl9IGVsc2UgeworCQlyZXQgPSAocmVzdWx0IDwgMCkgPyAwIDogMTsKKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAtRUxPQ0tEOgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBsdm1sb2NrZCBub3QgYXZhaWxhYmxlIiwgdmctPm5hbWUpOworCQlicmVhazsKKwljYXNlIC1FQVJHUzoKKwkJbG9nX2Vycm9yKCJWRyAlcyBpbml0IGZhaWxlZDogaW52YWxpZCBwYXJhbWV0ZXJzIGZvciBkbG0iLCB2Zy0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgLUVNQU5BR0VSOgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBsb2NrIG1hbmFnZXIgZGxtIGlzIG5vdCBydW5uaW5nIiwgdmctPm5hbWUpOworCQlicmVhazsKKwljYXNlIC1FUFJPVE9OT1NVUFBPUlQ6CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IGxvY2sgbWFuYWdlciBkbG0gaXMgbm90IHN1cHBvcnRlZCBieSBsdm1sb2NrZCIsIHZnLT5uYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKCJWRyAlcyBpbml0IGZhaWxlZDogJWQiLCB2Zy0+bmFtZSwgcmVzdWx0KTsKKwl9CisKKwlpZiAoIXJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShyZXBseV9zdHIgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAidmdfbG9ja19hcmdzIiwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IGxvY2tfYXJncyBub3QgcmV0dXJuZWQiLCB2Zy0+bmFtZSk7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHZnX2xvY2tfYXJncyA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCByZXBseV9zdHIpKSkgeworCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBsb2NrX2FyZ3MgYWxsb2MgZmFpbGVkIiwgdmctPm5hbWUpOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwl2Zy0+bG9ja190eXBlID0gImRsbSI7CisJdmctPmxvY2tfYXJncyA9IHZnX2xvY2tfYXJnczsKKworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IHZnX3dyaXRlIHZnX2NvbW1pdCIsIHZnLT5uYW1lKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gMTsKK291dDoKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfaW5pdF92Z19zYW5sb2NrKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgaW50IGx2X2xvY2tfY291bnQpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWNvbnN0IGNoYXIgKnJlcGx5X3N0cjsKKwljb25zdCBjaGFyICp2Z19sb2NrX2FyZ3MgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9wdHMgPSBOVUxMOworCWludCBleHRlbmRfbWI7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMDsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBBdXRvbWF0aWMgZXh0ZW5zaW9uIG9mIHRoZSBzYW5sb2NrIGx2IGlzIGRpc2FibGVkIGJ5CisJICogc2V0dGluZyBzYW5sb2NrX2x2X2V4dGVuZCB0byAwLiAgWmVybyB3b24ndCB3b3JrIGFzCisJICogYW4gaW5pdGlhbCBzaXplLCBzbyBpbiB0aGlzIGNhc2UsIHVzZSB0aGUgZGVmYXVsdCBhcworCSAqIHRoZSBpbml0aWFsIHNpemUuCisJICovCisJaWYgKCEoZXh0ZW5kX21iID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBnbG9iYWxfc2FubG9ja19sdl9leHRlbmRfQ0ZHLCBOVUxMKSkpCisJCWV4dGVuZF9tYiA9IERFRkFVTFRfU0FOTE9DS19MVl9FWFRFTkRfTUI7CisKKwkvKgorCSAqIENyZWF0aW5nIHRoZSBzYW5sb2NrIExWIHdyaXRlcyB0aGUgVkcgY29udGFpbmluZyB0aGUgbmV3IGx2bWxvY2sKKwkgKiBMViwgdGhlbiBhY3RpdmF0ZXMgdGhlIGx2bWxvY2sgTFYuICBUaGUgbHZtbG9jayBMViBtdXN0IGJlIGFjdGl2ZQorCSAqIGJlZm9yZSB3ZSBhc2sgbHZtbG9ja2QgdG8gaW5pdGlhbGl6ZSB0aGUgVkcgYmVjYXVzZSBzYW5sb2NrIG5lZWRzCisJICogdG8gaW5pdGlhbGl6ZSBsZWFzZXMgb24gdGhlIGx2bWxvY2sgTFYuCisJICoKKwkgKiBXaGVuIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgVkcgdG8gc2FubG9jaywgdGhlIHNhbmxvY2sgbHYgbmVlZHMgdG8KKwkgKiBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBsZWFzZXMgZm9yIGFsbCBleGlzdGluZyBsdnMgbmVlZGluZyBsb2Nrcy4KKwkgKiBPbmUgc2FubG9jayBsZWFzZSB1c2VzIDFNQi84TUIgZm9yIDUxMi80SyBzZWN0b3Igc2l6ZSBkZXZpY2VzLCBzbworCSAqIGluY3JlYXNlIHRoZSBpbml0aWFsIHNpemUgYnkgMU1CLzhNQiBmb3IgZWFjaCBleGlzdGluZyBsdi4KKwkgKiBGSVhNRTogd2UgZG9uJ3Qga25vdyB3aGF0IHNlY3RvciBzaXplIHRoZSBwdiB3aWxsIGhhdmUsIHNvIHdlCisJICogbXVsdGlwbHkgYnkgOCAoTUIpIHVubmVjZXNzYXJpbHkgd2hlbiB0aGUgc2VjdG9yIHNpemUgaXMgNTEyLgorCSAqLworCisJaWYgKGx2X2xvY2tfY291bnQpCisJCWV4dGVuZF9tYiArPSAobHZfbG9ja19jb3VudCAqIDgpOworCisJaWYgKCFfY3JlYXRlX3NhbmxvY2tfbHYoY21kLCB2ZywgTE9DS0RfU0FOTE9DS19MVl9OQU1FLCBleHRlbmRfbWIpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBpbnRlcm5hbCBsdi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBOLkIuIHRoaXMgcGFzc2VzIHRoZSBzYW5sb2NrIGx2IG5hbWUgYXMgdmdfbG9ja19hcmdzCisJICogZXZlbiB0aG91Z2ggaXQgaXMgb25seSBwYXJ0IG9mIHRoZSBmaW5hbCBhcmdzIHN0cmluZworCSAqIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBsdm1sb2NrZC4KKwkgKi8KKworCXJlcGx5ID0gX2xvY2tkX3NlbmQoImluaXRfdmciLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCQkidmdfbG9ja190eXBlID0gJXMiLCAic2FubG9jayIsCisJCQkJInZnX2xvY2tfYXJncyA9ICVzIiwgdmctPnNhbmxvY2tfbHYtPm5hbWUsCisJCQkJIm9wdHMgPSAlcyIsIG9wdHMgPzogIm5vbmUiLAorCQkJCU5VTEwpOworCisJaWYgKCFfbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0LCBOVUxMKSkgeworCQlyZXQgPSAwOworCQlyZXN1bHQgPSAtRUxPQ0tEOworCX0gZWxzZSB7CisJCXJldCA9IChyZXN1bHQgPCAwKSA/IDAgOiAxOworCX0KKworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTE9DS0Q6CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IGx2bWxvY2tkIG5vdCBhdmFpbGFibGUiLCB2Zy0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgLUVBUkdTOgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBpbnZhbGlkIHBhcmFtZXRlcnMgZm9yIHNhbmxvY2siLCB2Zy0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgLUVNQU5BR0VSOgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBsb2NrIG1hbmFnZXIgc2FubG9jayBpcyBub3QgcnVubmluZyIsIHZnLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAtRVBST1RPTk9TVVBQT1JUOgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiBsb2NrIG1hbmFnZXIgc2FubG9jayBpcyBub3Qgc3VwcG9ydGVkIGJ5IGx2bWxvY2tkIiwgdmctPm5hbWUpOworCQlicmVhazsKKwljYXNlIC1FTVNHU0laRToKKwkJbG9nX2Vycm9yKCJWRyAlcyBpbml0IGZhaWxlZDogbm8gZGlzayBzcGFjZSBmb3IgbGVhc2VzIiwgdmctPm5hbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlZHICVzIGluaXQgZmFpbGVkOiAlZCIsIHZnLT5uYW1lLCByZXN1bHQpOworCX0KKworCWlmICghcmV0KQorCQlnb3RvIG91dDsKKworCWlmICghKHJlcGx5X3N0ciA9IGRhZW1vbl9yZXBseV9zdHIocmVwbHksICJ2Z19sb2NrX2FyZ3MiLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBpbml0IGZhaWxlZDogbG9ja19hcmdzIG5vdCByZXR1cm5lZCIsIHZnLT5uYW1lKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEodmdfbG9ja19hcmdzID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHJlcGx5X3N0cikpKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IGxvY2tfYXJncyBhbGxvYyBmYWlsZWQiLCB2Zy0+bmFtZSk7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWx2X3NldF9oaWRkZW4odmctPnNhbmxvY2tfbHYpOworCXZnLT5zYW5sb2NrX2x2LT5zdGF0dXMgfD0gTE9DS0RfU0FOTE9DS19MVjsKKworCXZnLT5sb2NrX3R5cGUgPSAic2FubG9jayI7CisJdmctPmxvY2tfYXJncyA9IHZnX2xvY2tfYXJnczsKKworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaW5pdCBmYWlsZWQ6IHZnX3dyaXRlIHZnX2NvbW1pdCIsIHZnLT5uYW1lKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gMTsKK291dDoKKwlpZiAoIXJldCkgeworCQkvKgorCQkgKiBUaGUgdXNsZWVwIGRlbGF5IGdpdmVzIHNhbmxvY2sgdGltZSB0byBjbG9zZSB0aGUgbG9jayBsdiwKKwkJICogYW5kIHVzdWFsbHkgYXZvaWRzIGhhdmluZyBhbiBhbm5veWluZyBlcnJvciBwcmludGVkLgorCQkgKi8KKwkJdXNsZWVwKDEwMDAwMDApOworCQlfZGVhY3RpdmF0ZV9zYW5sb2NrX2x2KGNtZCwgdmcpOworCQlfcmVtb3ZlX3NhbmxvY2tfbHYoY21kLCB2Zyk7CisJCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKQorCQkJc3RhY2s7CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxlZCBhZnRlciB2Z19yZW1vdmUgb24gZGlzayAqLworCitzdGF0aWMgaW50IF9mcmVlX3ZnX2RsbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXVpbnQzMl90IGxvY2tkX2ZsYWdzID0gMDsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiAwOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXBseSA9IF9sb2NrZF9zZW5kKCJmcmVlX3ZnIiwKKwkJCQkicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBnZXRwaWQoKSwKKwkJCQkidmdfbmFtZSA9ICVzIiwgdmctPm5hbWUsCisJCQkJInZnX2xvY2tfdHlwZSA9ICVzIiwgdmctPmxvY2tfdHlwZSwKKwkJCQkidmdfbG9ja19hcmdzID0gJXMiLCB2Zy0+bG9ja19hcmdzLAorCQkJCU5VTEwpOworCisJaWYgKCFfbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0LCAmbG9ja2RfZmxhZ3MpKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gKHJlc3VsdCA8IDApID8gMCA6IDE7CisJfQorCisJaWYgKCFyZXQpCisJCWxvZ19lcnJvcigiX2ZyZWVfdmdfZGxtIGx2bWxvY2tkIHJlc3VsdCAlZCIsIHJlc3VsdCk7CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogY2FsbGVkIGJlZm9yZSB2Z19yZW1vdmUgb24gZGlzayAqLworCitzdGF0aWMgaW50IF9idXN5X3ZnX2RsbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXVpbnQzMl90IGxvY2tkX2ZsYWdzID0gMDsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiAwOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgb3RoZXIgaG9zdHMgZG8gbm90IGhhdmUgdGhlIFZHIGxvY2tzcGFjZSBzdGFydGVkLgorCSAqLworCisJcmVwbHkgPSBfbG9ja2Rfc2VuZCgiYnVzeV92ZyIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnLT5sb2NrX3R5cGUsCisJCQkJInZnX2xvY2tfYXJncyA9ICVzIiwgdmctPmxvY2tfYXJncywKKwkJCQlOVUxMKTsKKworCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgJnJlc3VsdCwgJmxvY2tkX2ZsYWdzKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IChyZXN1bHQgPCAwKSA/IDAgOiAxOworCX0KKworCWlmIChyZXN1bHQgPT0gLUVCVVNZKSB7CisJCWxvZ19lcnJvcigiTG9ja3NwYWNlIGZvciBcIiVzXCIgbm90IHN0b3BwZWQgb24gb3RoZXIgaG9zdHMiLCB2Zy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcmV0KQorCQlsb2dfZXJyb3IoIl9idXN5X3ZnX2RsbSBsdm1sb2NrZCByZXN1bHQgJWQiLCByZXN1bHQpOworCisgb3V0OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsZWQgYmVmb3JlIHZnX3JlbW92ZSBvbiBkaXNrICovCisKK3N0YXRpYyBpbnQgX2ZyZWVfdmdfc2FubG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCXVpbnQzMl90IGxvY2tkX2ZsYWdzID0gMDsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiAwOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIHZncmVtb3ZlIG9yaWdpbmFsbHkgaGVsZCB0aGUgZ2xvYmFsIGxvY2ssIGJ1dCBsb3N0IGl0IGJlY2F1c2UgdGhlCisJICogdmdyZW1vdmUgY29tbWFuZCBpcyByZW1vdmluZyBtdWx0aXBsZSBWR3MsIGFuZCByZW1vdmVkIHRoZSBWRworCSAqIGhvbGRpbmcgdGhlIGdsb2JhbCBsb2NrIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlbW92ZSB0aGlzIFZHLgorCSAqIFRvIGF2b2lkIHRoaXMgc2l0dWF0aW9uLCB0aGUgdXNlciBzaG91bGQgcmVtb3ZlIHRoZSBWRyBob2xkaW5nCisJICogdGhlIGdsb2JhbCBsb2NrIGluIGEgY29tbWFuZCBieSBpdHNlbGYsIG9yIGFzIHRoZSBsYXN0IGFyZyBpbiBhCisJICogdmdyZW1vdmUgY29tbWFuZCB0aGF0IHJlbW92ZXMgbXVsdGlwbGUgVkdzLgorCSAqLworCWlmIChjbWQtPmxvY2tkX2dsX3JlbW92ZWQpIHsKKwkJbG9nX2Vycm9yKCJHbG9iYWwgbG9jayBmYWlsZWQ6IGdsb2JhbCBsb2NrIHdhcyBsb3N0IGJ5IHJlbW92aW5nIGEgcHJldmlvdXMgVkcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmctPmxvY2tfYXJncyB8fCAhc3RybGVuKHZnLT5sb2NrX2FyZ3MpKSB7CisJCS8qIFNob3VsZG4ndCBoYXBwZW4gaW4gZ2VuZXJhbCwgYnV0IG1heWJlIGluIHNvbWUgZXJyb3IgY2FzZXM/ICovCisJCWxvZ19kZWJ1ZygiX2ZyZWVfdmdfc2FubG9jayAlcyBubyBsb2NrX2FyZ3MiLCB2Zy0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJlcGx5ID0gX2xvY2tkX3NlbmQoImZyZWVfdmciLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCQkidmdfbG9ja190eXBlID0gJXMiLCB2Zy0+bG9ja190eXBlLAorCQkJCSJ2Z19sb2NrX2FyZ3MgPSAlcyIsIHZnLT5sb2NrX2FyZ3MsCisJCQkJTlVMTCk7CisKKwlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsICZsb2NrZF9mbGFncykpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAocmVzdWx0IDwgMCkgPyAwIDogMTsKKwl9CisKKwkvKgorCSAqIE90aGVyIGhvc3RzIGNvdWxkIHN0aWxsIGJlIGpvaW5lZCB0byB0aGUgbG9ja3NwYWNlLCB3aGljaCBtZWFucyB0aGV5CisJICogYXJlIHVzaW5nIHRoZSBpbnRlcm5hbCBzYW5sb2NrIExWLCB3aGljaCBtZWFucyB3ZSBjYW5ub3QgcmVtb3ZlIHRoZQorCSAqIFZHLiAgT25jZSBvdGhlciBob3N0cyBzdG9wIHVzaW5nIHRoZSBWRyBpdCBjYW4gYmUgcmVtb3ZlZC4KKwkgKi8KKwlpZiAocmVzdWx0ID09IC1FQlVTWSkgeworCQlsb2dfZXJyb3IoIkxvY2tzcGFjZSBmb3IgXCIlc1wiIG5vdCBzdG9wcGVkIG9uIG90aGVyIGhvc3RzIiwgdmctPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJldCkgeworCQlsb2dfZXJyb3IoIl9mcmVlX3ZnX3NhbmxvY2sgbHZtbG9ja2QgcmVzdWx0ICVkIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZ2xvYmFsIGxvY2sgd2FzIGJlZW4gcmVtb3ZlZCBieSByZW1vdmluZyB0aGlzIFZHLCB0aGVuOgorCSAqCisJICogUHJpbnQgYSB3YXJuaW5nIGluZGljYXRpbmcgdGhhdCB0aGUgZ2xvYmFsIGxvY2sgc2hvdWxkIGJlIGVuYWJsZWQKKwkgKiBpbiBhbm90aGVyIHJlbWFpbmluZyBzYW5sb2NrIFZHLgorCSAqCisJICogRG8gbm90IGFsbG93IGFueSBtb3JlIFZHcyB0byBiZSByZW1vdmVkIGJ5IHRoaXMgY29tbWFuZCwgZS5nLgorCSAqIGlmIGEgY29tbWFuZCByZW1vdmVzIHR3byBzYW5sb2NrIFZHcywgbGlrZSB2Z3JlbW92ZSBmb28gYmFyLAorCSAqIGFuZCB0aGUgZ2xvYmFsIGxvY2sgZXhpc3RlZCBpbiBmb28sIGRvIG5vdCBjb250aW51ZSB0byByZW1vdmUKKwkgKiBWRyBiYXIgd2l0aG91dCB0aGUgZ2xvYmFsIGxvY2suICBTZWUgdGhlIGNvcnJlc3BvbmRpbmcgY2hlY2sgYWJvdmUuCisJICovCisJaWYgKGxvY2tkX2ZsYWdzICYgTERfUkZfV0FSTl9HTF9SRU1PVkVEKSB7CisJCWxvZ193YXJuKCJWRyAlcyBoZWxkIHRoZSBzYW5sb2NrIGdsb2JhbCBsb2NrLCBlbmFibGUgZ2xvYmFsIGxvY2sgaW4gYW5vdGhlciBWRy4iLCB2Zy0+bmFtZSk7CisJCWNtZC0+bG9ja2RfZ2xfcmVtb3ZlZCA9IDE7CisJfQorCisJLyoKKwkgKiBUaGUgdXNsZWVwIGRlbGF5IGdpdmVzIHNhbmxvY2sgdGltZSB0byBjbG9zZSB0aGUgbG9jayBsdiwKKwkgKiBhbmQgdXN1YWxseSBhdm9pZHMgaGF2aW5nIGFuIGFubm95aW5nIGVycm9yIHByaW50ZWQuCisJICovCisJdXNsZWVwKDEwMDAwMDApOworCisJX2RlYWN0aXZhdGVfc2FubG9ja19sdihjbWQsIHZnKTsKKwlfcmVtb3ZlX3NhbmxvY2tfbHYoY21kLCB2Zyk7Cisgb3V0OgorCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHZnY3JlYXRlICovCisKK2ludCBsb2NrZF9pbml0X3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICBjb25zdCBjaGFyICpsb2NrX3R5cGUsIGludCBsdl9sb2NrX2NvdW50KQoreworCXN3aXRjaCAoZ2V0X2xvY2tfdHlwZV9mcm9tX3N0cmluZyhsb2NrX3R5cGUpKSB7CisJY2FzZSBMT0NLX1RZUEVfTk9ORToKKwkJcmV0dXJuIDE7CisJY2FzZSBMT0NLX1RZUEVfQ0xWTToKKwkJcmV0dXJuIDE7CisJY2FzZSBMT0NLX1RZUEVfRExNOgorCQlyZXR1cm4gX2luaXRfdmdfZGxtKGNtZCwgdmcpOworCWNhc2UgTE9DS19UWVBFX1NBTkxPQ0s6CisJCXJldHVybiBfaW5pdF92Z19zYW5sb2NrKGNtZCwgdmcsIGx2X2xvY2tfY291bnQpOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5rbm93biBsb2NrX3R5cGUuIik7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBfbG9ja2RfYWxsX2x2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWlmICghbG9ja2RfbHZfdXNlc19sb2NrKGx2bC0+bHYpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFsb2NrZF9sdihjbWQsIGx2bC0+bHYsICJleCIsIDApKSB7CisJCQlsb2dfZXJyb3IoIkxWICVzLyVzIG11c3QgYmUgaW5hY3RpdmUgb24gYWxsIGhvc3RzLiIsCisJCQkJICB2Zy0+bmFtZSwgbHZsLT5sdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghbG9ja2RfbHYoY21kLCBsdmwtPmx2LCAidW4iLCAwKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdW5sb2NrIExWICVzLyVzLiIsIHZnLT5uYW1lLCBsdmwtPmx2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIHZncmVtb3ZlIGJlZm9yZSB0aGUgdmcgaXMgcmVtb3ZlZCAqLworCitpbnQgbG9ja2RfZnJlZV92Z19iZWZvcmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJIGludCBjaGFuZ2luZykKK3sKKwlpbnQgbG9ja190eXBlX251bSA9IGdldF9sb2NrX3R5cGVfZnJvbV9zdHJpbmcodmctPmxvY2tfdHlwZSk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgbm8gTFZzIGFyZSBhY3RpdmUgb24gb3RoZXIgaG9zdHMuCisJICogV2hlbiByZW1vdmluZyAobm90IGNoYW5naW5nKSwgZWFjaCBMViBpcyBsb2NrZWQKKwkgKiB3aGVuIGl0IGlzIHJlbW92ZWQsIHRoZXkgZG8gbm90IG5lZWQgY2hlY2tpbmcgaGVyZS4KKwkgKi8KKwlpZiAobG9ja190eXBlX251bSA9PSBMT0NLX1RZUEVfRExNIHx8IGxvY2tfdHlwZV9udW0gPT0gTE9DS19UWVBFX1NBTkxPQ0spIHsKKwkJaWYgKGNoYW5naW5nICYmICFfbG9ja2RfYWxsX2x2cyhjbWQsIHZnKSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgY2hhbmdlIFZHICVzIHdpdGggYWN0aXZlIExWcyIsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3dpdGNoIChsb2NrX3R5cGVfbnVtKSB7CisJY2FzZSBMT0NLX1RZUEVfTk9ORToKKwljYXNlIExPQ0tfVFlQRV9DTFZNOgorCQlyZXR1cm4gMTsKKwljYXNlIExPQ0tfVFlQRV9ETE06CisJCS8qIHJldHVybmluZyBhbiBlcnJvciB3aWxsIHByZXZlbnQgdmdfcmVtb3ZlKCkgKi8KKwkJcmV0dXJuIF9idXN5X3ZnX2RsbShjbWQsIHZnKTsKKwljYXNlIExPQ0tfVFlQRV9TQU5MT0NLOgorCQkvKiByZXR1cm5pbmcgYW4gZXJyb3Igd2lsbCBwcmV2ZW50IHZnX3JlbW92ZSgpICovCisJCXJldHVybiBfZnJlZV92Z19zYW5sb2NrKGNtZCwgdmcpOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5rbm93biBsb2NrX3R5cGUuIik7CisJCXJldHVybiAwOworCX0KK30KKworLyogdmdyZW1vdmUgYWZ0ZXIgdGhlIHZnIGlzIHJlbW92ZWQgKi8KKwordm9pZCBsb2NrZF9mcmVlX3ZnX2ZpbmFsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzd2l0Y2ggKGdldF9sb2NrX3R5cGVfZnJvbV9zdHJpbmcodmctPmxvY2tfdHlwZSkpIHsKKwljYXNlIExPQ0tfVFlQRV9OT05FOgorCWNhc2UgTE9DS19UWVBFX0NMVk06CisJY2FzZSBMT0NLX1RZUEVfU0FOTE9DSzoKKwkJYnJlYWs7CisJY2FzZSBMT0NLX1RZUEVfRExNOgorCQlfZnJlZV92Z19kbG0oY21kLCB2Zyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5rbm93biBsb2NrX3R5cGUuIik7CisJfQorfQorCisvKgorICogU3RhcnRpbmcgYSB2ZyBpbnZvbHZlczoKKyAqIDEuIHJlYWRpbmcgdGhlIHZnIHdpdGhvdXQgYSBsb2NrCisgKiAyLiBnZXR0aW5nIHRoZSBsb2NrX3R5cGUvbG9ja19hcmdzIGZyb20gdGhlIHZnIG1ldGFkYXRhCisgKiAzLiBkb2luZyBzdGFydF92ZyBpbiBsdm1sb2NrZCBmb3IgdGhlIGxvY2tfdHlwZTsKKyAqICAgIHRoaXMgbWVhbnMgam9pbmluZyB0aGUgbG9ja3NwYWNlCisgKgorICogVGhlIHZnIHJlYWQgaW4gc3RlcCAxIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55dGhpbmcKKyAqIG90aGVyIHRoYW4gZ2V0dGluZyB0aGUgbG9ja190eXBlL2xvY2tfYXJncy91dWlkIG5lY2Vzc2FyeQorICogZm9yIHN0YXJ0aW5nIHRoZSBsb2Nrc3BhY2UuICBUbyB1c2UgdGhlIHZnIGFmdGVyIHN0YXJ0aW5nCisgKiB0aGUgbG9ja3NwYWNlLCBmb2xsb3cgdGhlIHN0YW5kYXJkIG1ldGhvZCB3aGljaCBpczoKKyAqIGxvY2sgdGhlIHZnLCByZWFkL3VzZS93cml0ZSB0aGUgdmcsIHVubG9jayB0aGUgdmcuCisgKgorICogc3RhcnRfaW5pdCBpcyAxIHdoZW4gdGhlIFZHIGlzIGJlaW5nIHN0YXJ0ZWQgYWZ0ZXIgdGhlCisgKiBjb21tYW5kIGhhcyBkb25lIGxvY2tkX2luaXRfdmcoKS4gIFRoaXMgdGVsbHMgbHZtbG9ja2QKKyAqIHRoYXQgdGhlIFZHIGxvY2tzcGFjZSBiZWluZyBzdGFydGVkIGlzIG5ldy4KKyAqLworCitpbnQgbG9ja2Rfc3RhcnRfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgc3RhcnRfaW5pdCkKK3sKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJdWludDMyX3QgbG9ja2RfZmxhZ3MgPSAwOworCWludCBob3N0X2lkID0gMDsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwltZW1zZXQodXVpZCwgMCwgc2l6ZW9mKHV1aWQpKTsKKworCWlmICghaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIV91c2VfbHZtbG9ja2QpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBzdGFydCBmYWlsZWQ6IGx2bWxvY2tkIGlzIG5vdCBlbmFibGVkIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgc3RhcnQgZmFpbGVkOiBsdm1sb2NrZCBpcyBub3QgcnVubmluZyIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnKCJsb2NrZCBzdGFydCBWRyAlcyBsb2NrX3R5cGUgJXMgaW5pdCAlZCIsCisJCSAgdmctPm5hbWUsIHZnLT5sb2NrX3R5cGUgPyB2Zy0+bG9ja190eXBlIDogImVtcHR5Iiwgc3RhcnRfaW5pdCk7CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmdmctPmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQlyZXR1cm5fMDsKKworCWlmICh2Zy0+bG9ja190eXBlICYmICFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0aW5nCisJCSAqIHNhbmxvY2sgdmdzIHZzIHN0YXJ0aW5nIGRsbSB2Z3M6IHRoZSBpbnRlcm5hbAorCQkgKiBzYW5sb2NrIGx2IG5lZWRzIHRvIGJlIGFjdGl2YXRlZCBiZWZvcmUgbHZtbG9ja2QKKwkJICogZG9lcyB0aGUgc3RhcnQgYmVjYXVzZSBzYW5sb2NrIG5lZWRzIHRvIHVzZSB0aGUgbHYKKwkJICogdG8gYWNjZXNzIGxvY2tzLgorCQkgKi8KKwkJaWYgKCFfYWN0aXZhdGVfc2FubG9ja19sdihjbWQsIHZnKSkKKwkJCXJldHVybiAwOworCisJCWhvc3RfaWQgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGxvY2FsX2hvc3RfaWRfQ0ZHLCBOVUxMKTsKKwl9CisKKwlyZXBseSA9IF9sb2NrZF9zZW5kKCJzdGFydF92ZyIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnLT5sb2NrX3R5cGUsCisJCQkJInZnX2xvY2tfYXJncyA9ICVzIiwgdmctPmxvY2tfYXJncyA/OiAibm9uZSIsCisJCQkJInZnX3V1aWQgPSAlcyIsIHV1aWRbMF0gPyB1dWlkIDogIm5vbmUiLAorCQkJCSJ2ZXJzaW9uID0gIiBGTVRkNjQsIChpbnQ2NF90KSB2Zy0+c2Vxbm8sCisJCQkJImhvc3RfaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGhvc3RfaWQsCisJCQkJIm9wdHMgPSAlcyIsIHN0YXJ0X2luaXQgPyAic3RhcnRfaW5pdCIgOiAibm9uZSIsCisJCQkJTlVMTCk7CisKKwlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsICZsb2NrZF9mbGFncykpIHsKKwkJcmV0ID0gMDsKKwkJcmVzdWx0ID0gLUVMT0NLRDsKKwl9IGVsc2UgeworCQlyZXQgPSAocmVzdWx0IDwgMCkgPyAwIDogMTsKKwl9CisKKwlpZiAobG9ja2RfZmxhZ3MgJiBMRF9SRl9XQVJOX0dMX1JFTU9WRUQpCisJCWNtZC0+bG9ja2RfZ2xfcmVtb3ZlZCA9IDE7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZHICVzIHN0YXJ0aW5nICVzIGxvY2tzcGFjZSIsIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlKTsKKwkJYnJlYWs7CisJY2FzZSAtRUxPQ0tEOgorCQlsb2dfZXJyb3IoIlZHICVzIHN0YXJ0IGZhaWxlZDogbHZtbG9ja2Qgbm90IGF2YWlsYWJsZSIsIHZnLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAtRUVYSVNUOgorCQlsb2dfZGVidWcoIlZHICVzIHN0YXJ0IGVycm9yOiBhbHJlYWR5IHN0YXJ0ZWQiLCB2Zy0+bmFtZSk7CisJCXJldCA9IDE7CisJCWJyZWFrOworCWNhc2UgLUVBUkdTOgorCQlsb2dfZXJyb3IoIlZHICVzIHN0YXJ0IGZhaWxlZDogaW52YWxpZCBwYXJhbWV0ZXJzIGZvciAlcyIsIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlKTsKKwkJYnJlYWs7CisJY2FzZSAtRUhPU1RJRDoKKwkJbG9nX2Vycm9yKCJWRyAlcyBzdGFydCBmYWlsZWQ6IGludmFsaWQgc2FubG9jayBob3N0X2lkLCBzZXQgaW4gbHZtbG9jYWwuY29uZiIsIHZnLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAtRU1BTkFHRVI6CisJCWxvZ19lcnJvcigiVkcgJXMgc3RhcnQgZmFpbGVkOiBsb2NrIG1hbmFnZXIgJXMgaXMgbm90IHJ1bm5pbmciLCB2Zy0+bmFtZSwgdmctPmxvY2tfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgLUVQUk9UT05PU1VQUE9SVDoKKwkJbG9nX2Vycm9yKCJWRyAlcyBzdGFydCBmYWlsZWQ6IGxvY2sgbWFuYWdlciAlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGx2bWxvY2tkIiwgdmctPm5hbWUsIHZnLT5sb2NrX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlZHICVzIHN0YXJ0IGZhaWxlZDogJWQiLCB2Zy0+bmFtZSwgcmVzdWx0KTsKKwl9CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbG9ja2Rfc3RvcF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQ7CisJaW50IHJldDsKKworCWlmICghaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMDsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJbG9nX2RlYnVnKCJsb2NrZCBzdG9wIFZHICVzIGxvY2tfdHlwZSAlcyIsCisJCSAgdmctPm5hbWUsIHZnLT5sb2NrX3R5cGUgPyB2Zy0+bG9ja190eXBlIDogImVtcHR5Iik7CisKKwlyZXBseSA9IF9sb2NrZF9zZW5kKCJzdG9wX3ZnIiwKKwkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJInZnX25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJTlVMTCk7CisKKwlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsIE5VTEwpKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gKHJlc3VsdCA8IDApID8gMCA6IDE7CisJfQorCisJaWYgKHJlc3VsdCA9PSAtRU5PTFMpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlc3VsdCA9PSAtRUJVU1kpIHsKKwkJbG9nX2Vycm9yKCJWRyAlcyBzdG9wIGZhaWxlZDogTFZzIG11c3QgZmlyc3QgYmUgZGVhY3RpdmF0ZWQiLCB2Zy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcmV0KSB7CisJCWxvZ19lcnJvcigiVkcgJXMgc3RvcCBmYWlsZWQ6ICVkIiwgdmctPm5hbWUsIHJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc3RyY21wKHZnLT5sb2NrX3R5cGUsICJzYW5sb2NrIikpIHsKKwkJbG9nX2RlYnVnKCJsb2NrZF9zdG9wX3ZnIGRlYWN0aXZhdGUgc2FubG9jayBsdiIpOworCQlfZGVhY3RpdmF0ZV9zYW5sb2NrX2x2KGNtZCwgdmcpOworCX0KK291dDoKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbG9ja2Rfc3RhcnRfd2FpdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMDsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJcmVwbHkgPSBfbG9ja2Rfc2VuZCgic3RhcnRfd2FpdCIsCisJCQkicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBnZXRwaWQoKSwKKwkJCU5VTEwpOworCisJaWYgKCFfbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0LCBOVUxMKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IChyZXN1bHQgPCAwKSA/IDAgOiAxOworCX0KKworCWlmICghcmV0KQorCQlsb2dfZXJyb3IoIkxvY2sgc3RhcnQgZmFpbGVkIik7CisKKwkvKgorCSAqIEZJWE1FOiBnZXQgYSBsaXN0IG9mIHZncyB0aGF0IHN0YXJ0ZWQgc28gd2UgY2FuCisJICogYmV0dGVyIHJlcG9ydCB3aGF0IHdvcmtlZCBhbmQgd2hhdCBkaWRuJ3Q/CisJICovCisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlpZiAoY21kLT5sb2NrZF9nbF9yZW1vdmVkKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBnbG9iYWwgbG9jazogZ2xvYmFsIGxvY2sgd2FzIGxvc3QgYnkgcmVtb3ZpbmcgYSBwcmV2aW91cyBWRy4iKTsKKwkJbG9nX2Vycm9yKCJUbyBlbmFibGUgdGhlIGdsb2JhbCBsb2NrIGluIGFub3RoZXIgVkcsIHNlZSBsdm1sb2NrY3RsIC0tZ2wtZW5hYmxlLiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBsb2NrZF9nbF9jcmVhdGUoKSBpcyBhIHZhcmlhdGlvbiBvZiBsb2NrZF9nbCgpIHVzZWQgb25seSBieSB2Z2NyZWF0ZS4KKyAqIEl0IGhhbmRsZXMgdGhlIGNhc2UgdGhhdCB3aGVuIHVzaW5nIHNhbmxvY2ssIHRoZSBnbG9iYWwgbG9jayBkb2VzCisgKiBub3QgZXhpc3QgdW50aWwgYWZ0ZXIgdGhlIGZpcnN0IHZnY3JlYXRlIGlzIGNvbXBsZXRlLCBzaW5jZSB0aGUgZ2xvYmFsCisgKiBsb2NrIGV4aXN0cyBvbiBzdG9yYWdlIHdpdGhpbiBhbiBhY3R1YWwgVkcuICBTbywgdGhlIGZpcnN0IHZnY3JlYXRlCisgKiBuZWVkcyBzcGVjaWFsIGxvZ2ljIHRvIGRldGVjdCB0aGlzIGJvb3RzdHJhcCBjYXNlLgorICoKKyAqIFdoZW4gdGhlIHZnY3JlYXRlIGlzIG5vdCBjcmVhdGluZyB0aGUgZmlyc3QgVkcsIHRoZW4gbG9ja2RfZ2xfY3JlYXRlKCkKKyAqIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbG9ja2RfZ2woKS4KKyAqCisgKiB2Z2NyZWF0ZSB3aWxsIGhhdmUgYSBsb2NrX3R5cGUgZm9yIHRoZSBuZXcgVkcgd2hpY2ggbG9ja2RfZ2xfY3JlYXRlKCkKKyAqIGNhbiBwcm92aWRlIGluIHRoZSBsb2NrLWdsIGNhbGwuCisgKgorICogbG9ja2RfZ2woKSBhbmQgbG9ja2RfZ2xfY3JlYXRlKCkgZGlmZmVyIGluIHRoZSBzcGVjaWZpYyBjYXNlcyB3aGVyZQorICogRU5PTFMgKG5vIGxvY2tzcGFjZSBmb3VuZCkgaXMgb3ZlcnJpZGVuLiAgSW4gdGhlIHZnY3JlYXRlIGNhc2UsIHRoZQorICogb3ZlcnJpZGUgY2FzZXMgYXJlIHJlbGF0ZWQgdG8gc2FubG9jayBib290c3RyYXAsIGFuZCB0aGUgbG9ja190eXBlIG9mCisgKiB0aGUgdmcgYmVpbmcgY3JlYXRlZCBpcyBuZWVkZWQuCisgKgorICogMS4gdmdjcmVhdGUgb2YgdGhlIGZpcnN0IGxvY2tkLXR5cGUgdmcgY2FsbHMgbG9ja2RfZ2xfY3JlYXRlKCkKKyAqICAgIHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrLgorICoKKyAqIDIuIHZnY3JlYXRlL2xvY2tkX2dsX2NyZWF0ZSBwYXNzZXMgZ2wgbG9jayByZXF1ZXN0IHRvIGx2bWxvY2tkLAorICogICAgYWxvbmcgd2l0aCBsb2NrX3R5cGUgb2YgdGhlIG5ldyB2Zy4KKyAqCisgKiAzLiBsdm1sb2NrZCBmaW5kcyBubyBnbG9iYWwgbG9ja3NwYWNlL2xvY2suCisgKgorICogNC4gZGxtOgorICogICAgSWYgdGhlIGxvY2tfdHlwZSBmcm9tIHZnY3JlYXRlIGlzIGRsbSwgbHZtbG9ja2QgY3JlYXRlcyB0aGUKKyAqICAgIGRsbSBnbG9iYWwgbG9ja3NwYWNlLCBhbmQgcXVldWVzIHRoZSBnbG9iYWwgbG9jayByZXF1ZXN0CisgKiAgICBmb3IgdmdjcmVhdGUuICBsb2NrZF9nbF9jcmVhdGUgcmV0dXJucyBzdWNlc3Mgd2l0aCB0aGUgZ2wgaGVsZC4KKyAqCisgKiAgICBzYW5sb2NrOgorICogICAgSWYgdGhlIGxvY2tfdHlwZSBmcm9tIHZnY3JlYXRlIGlzIHNhbmxvY2ssIGx2bWxvY2tkIHJldHVybnMgLUVOT0xTCisgKiAgICB3aXRoIHRoZSBOT19HTF9MUyBmbGFnLiAgbHZtbG9ja2QgY2Fubm90IGNyZWF0ZSBvciBhY3F1aXJlIGEgc2FubG9jaworICogICAgZ2xvYmFsIGxvY2sgdW50aWwgdGhlIFZHIGV4aXN0cyBvbiBkaXNrICh0aGUgbG9ja3MgbGl2ZSB3aXRoaW4gdGhlIFZHKS4KKyAqCisgKiAgICBsb2NrZF9nbF9jcmVhdGUgc2VlcyBzYW5sb2NrL0VOT0xTL05PX0dMX0xTIChhbmQgb3B0aW9uYWxseSB0aGUKKyAqICAgICJlbmFibGUiIGxvY2stZ2wgYXJnKSwgZGV0ZXJtaW5lcyB0aGF0IHRoaXMgaXMgdGhlIHNhbmxvY2sKKyAqICAgIGJvb3RzdHJhcCBzcGVjaWFsIGNhc2UsIGFuZCByZXR1cm5zIHN1Y2Nlc3Mgd2l0aG91dCB0aGUgZ2xvYmFsIGxvY2suCisgKgorICogICAgdmdjcmVhdGUgY3JlYXRlcyB0aGUgVkcgb24gZGlzaywgYW5kIGNhbGxzIGxvY2tkX2luaXRfdmcoKSB3aGljaAorICogICAgaW5pdGlhbGl6ZXMvZW5hYmxlcyBhIGdsb2JhbCBsb2NrIG9uIHRoZSBuZXcgVkcncyBpbnRlcm5hbCBzYW5sb2NrIGx2LgorICogICAgRnV0dXJlIGxvY2tkX2dsL2xvY2tkX2dsX2NyZWF0ZSBjYWxscyB3aWxsIGFjcXVpcmUgdGhlIGV4aXN0aW5nIGdsLgorICovCisKK2ludCBsb2NrZF9nbF9jcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRlZl9tb2RlLCBjb25zdCBjaGFyICp2Z19sb2NrX3R5cGUpCit7CisJY29uc3QgY2hhciAqbW9kZSA9IE5VTEw7CisJdWludDMyX3QgbG9ja2RfZmxhZ3M7CisJaW50IHJldHJpZXMgPSAwOworCWludCByZXN1bHQ7CisKKwkvKgorCSAqIFRoZXJlIGFyZSBmb3VyIHZhcmlhdGlvbnMgb2YgY3JlYXRpbmcgYSBsb2NhbC9sb2NrZCBWRworCSAqIHdpdGgvd2l0aG91dCB1c2VfbHZtbG9ja2Qgc2V0LgorCSAqCisJICogdXNlX2x2bWxvY2tkPTEsIGxvY2tkIFZHOgorCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFjcXVpcmUgb3IgY3JlYXRlIHRoZSBnbG9iYWwgbG9jay4KKwkgKgorCSAqIHVzZV9sdm1sb2NrZD0wLCBsb2NhbCBWRzoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AsIGp1c3QgcmV0dXJucyAxLgorCSAqCisJICogdXNlX2x2bWxvY2tkPTAsIGxvY2tkIFZHCisJICogQW4gZXJyb3IgaXMgcmV0dXJuZWQgaW4gdmdjcmVhdGVfcGFyYW1zX3NldF9mcm9tX2FyZ3MgKGJlZm9yZSB0aGlzIGlzIGNhbGxlZCkuCisJICoKKwkgKiB1c2VfbHZtbG9ja2Q9MSwgbG9jYWwgVkcKKwkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jay4KKwkgKi8KKwlpZiAoIV91c2VfbHZtbG9ja2QpIHsKKwkJaWYgKCFpc19sb2NrZF90eXBlKHZnX2xvY2tfdHlwZSkpCisJCQlyZXR1cm4gMTsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY3JlYXRlIFZHIHdpdGggbG9ja190eXBlICVzIHdpdGhvdXQgbHZtbG9ja2QuIiwgdmdfbG9ja190eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnKCJsb2NrZCBnbG9iYWwgbG9ja190eXBlICVzIiwgdmdfbG9ja190eXBlKTsKKworCWlmICghbW9kZSkKKwkJbW9kZSA9IGRlZl9tb2RlOworCWlmICghbW9kZSkgeworCQlsb2dfZXJyb3IoIlVua25vd24gbG9jay1nbCBtb2RlIik7CisJCXJldHVybiAwOworCX0KKworIHJlcToKKwlpZiAoIV9sb2NrZF9yZXF1ZXN0KGNtZCwgImxvY2tfZ2wiLAorCQkJICAgICAgTlVMTCwgdmdfbG9ja190eXBlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBtb2RlLCBOVUxMLAorCQkJICAgICAgJnJlc3VsdCwgJmxvY2tkX2ZsYWdzKSkgeworCQkvKiBObyByZXN1bHQgZnJvbSBsdm1sb2NrZCwgaXQgaXMgcHJvYmFibHkgbm90IHJ1bm5pbmcuICovCisJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBjaGVjayB0aGF0IGx2bWxvY2tkIGlzIHJ1bm5pbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQgPT0gLUVBR0FJTikgeworCQlpZiAocmV0cmllcyA8IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgZ2xvYmFsX2x2bWxvY2tkX2xvY2tfcmV0cmllc19DRkcsIE5VTEwpKSB7CisJCQlsb2dfd2FybigiUmV0cnlpbmcgJXMgZ2xvYmFsIGxvY2siLCBtb2RlKTsKKwkJCXNsZWVwKDEpOworCQkJcmV0cmllcysrOworCQkJZ290byByZXE7CisJCX0KKwl9CisKKwkvKgorCSAqIEVOT0xTOiBubyBsb2Nrc3BhY2Ugd2FzIGZvdW5kIHdpdGggYSBnbG9iYWwgbG9jay4KKwkgKiBJdCBtYXkgbm90IGV4aXN0IChwZXJoYXBzIHRoaXMgY29tbWFuZCBpcyBjcmVhdGluZyB0aGUgZmlyc3QpLAorCSAqIG9yIGl0IG1heSBub3QgYmUgdmlzaWJsZSBvciBzdGFydGVkIG9uIHRoZSBzeXN0ZW0geWV0LgorCSAqLworCisJaWYgKHJlc3VsdCA9PSAtRU5PTFMpIHsKKwkJaWYgKCFzdHJjbXAobW9kZSwgInVuIikpCisJCQlyZXR1cm4gMTsKKworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBzYW5sb2NrIGJvb3RzdHJhcCBjb25kaXRpb24gZm9yIHByb2NlZGluZworCQkgKiB3aXRob3V0IHRoZSBnbG9iYWwgbG9jazogYSBjaGlja2VuL2VnZyBjYXNlIGZvciB0aGUgZmlyc3QKKwkJICogc2FubG9jayBWRyB0aGF0IGlzIGNyZWF0ZWQuICBXaGVuIGNyZWF0aW5nIHRoZSBmaXJzdAorCQkgKiBzYW5sb2NrIFZHLCB0aGVyZSBpcyBubyBnbG9iYWwgbG9jayB0byBhY3F1aXJlIGJlY2F1c2UKKwkJICogdGhlIGdsIHdpbGwgZXhpc3QgaW4gdGhlIFZHIGJlaW5nIGNyZWF0ZWQuICBTbywgd2UKKwkJICogc2tpcCBhY3F1aXJpbmcgdGhlIGdsb2JhbCBsb2NrIHdoZW4gY3JlYXRpbmcgdGhpcyBpbml0aWFsCisJCSAqIFZHLCBhbmQgZW5hYmxlIHRoZSBnbG9iYWwgbG9jayBpbiB0aGlzIFZHLgorCQkgKgorCQkgKiBUaGlzIGluaXRpYWwgYm9vdHN0cmFwIGNvbmRpdGlvbiBpcyBpZGVudGlmaWVkIGJhc2VkIG9uCisJCSAqIHR3byB0aGluZ3M6CisJCSAqCisJCSAqIDEuIE5vIHNhbmxvY2sgVkdzIGhhdmUgYmVlbiBzdGFydGVkIGluIGx2bWxvY2tkLCBjYXVzaW5nCisJCSAqICAgIGx2bWxvY2tkIHRvIHJldHVybiBOT19HTF9MUy9OT19MT0NLU1BBQ0VTLgorCQkgKgorCQkgKiAyLiBObyBzYW5sb2NrIFZHcyBhcmUgc2VlbiBpbiBsdm1jYWNoZSBhZnRlciB0aGUgZGlzaworCQkgKiAgICBzY2FuIHBlcmZvcm1lZCBpbiBsdm1ldGFkX3ZhbGlkYXRlX2dsb2JhbF9jYWNoZSgpLgorCQkgKgorCQkgKiBJZiBib3RoIG9mIHRob3NlIGFyZSB0cnVlLCB3ZSBnbyBhaGVhZCBhbmQgY3JlYXRlIHRoaXMgbmV3CisJCSAqIFZHIHdoaWNoIHdpbGwgaGF2ZSB0aGUgZ2xvYmFsIGxvY2sgZW5hYmxlZC4gIEhvd2V2ZXIsIHRoaXMKKwkJICogaGFzIGEgc2hvcnRjb21pbmc6IGFub3RoZXIgc2FubG9jayBWRyBtYXkgZXhpc3QgdGhhdCBoYXNuJ3QKKwkJICogYXBwZWFyZWQgdG8gdGhlIHN5c3RlbSB5ZXQuICBJZiB0aGF0IFZHIGhhcyBpdHMgZ2xvYmFsIGxvY2sKKwkJICogZW5hYmxlZCwgdGhlbiB3aGVuIGl0IGFwcGVhcnMgbGF0ZXIsIGR1cGxpY2F0ZSBnbG9iYWwgbG9ja3MKKwkJICogd2lsbCBiZSBzZWVuLCBhbmQgYSB3YXJuaW5nIHdpbGwgaW5kaWNhdGUgdGhhdCBvbmUgb2YgdGhlbQorCQkgKiBzaG91bGQgYmUgZGlzYWJsZWQuCisJCSAqCisJCSAqIFRoZSB0d28gYm9vdHN0cmFwIGNvbmRpdGlvbnMgaGF2ZSBhbm90aGVyIHNob3J0Y29taW5nIHRvIHRoZQorCQkgKiBvcHBvc2l0ZSBlZmZlY3Q6ICBvdGhlciBzYW5sb2NrIFZHcyBtYXkgYmUgdmlzaWJsZSB0byB0aGUKKwkJICogc3lzdGVtLCBidXQgbm9uZSBvZiB0aGVtIGhhdmUgYSBnbG9iYWwgbG9jayBlbmFibGVkLgorCQkgKiBJbiB0aGF0IGNhc2UsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gY3JlYXRlIHRoaXMgbmV3IFZHIHdpdGgKKwkJICogYW4gZW5hYmxlZCBnbG9iYWwgbG9jay4gIChGSVhNRTogd2UgY291bGQgZGV0ZWN0IHRoYXQgbm9uZQorCQkgKiBvZiB0aGUgZXhpc3Rpbmcgc2FubG9jayBWR3MgaGF2ZSBhIGdsIGVuYWJsZWQgYW5kIGFsbG93IHRoaXMKKwkJICogdmdjcmVhdGUgdG8gZ28gYWhlYWQuKSAgRW5hYmxpbmcgdGhlIGdsb2JhbCBsb2NrIGluIG9uZSBvZgorCQkgKiB0aGUgZXhpc3Rpbmcgc2FubG9jayBWR3MgaXMgY3VycmVudGx5IHRoZSBzaW1wbGVzdCBzb2x1dGlvbi4KKwkJICovCisKKwkJaWYgKChsb2NrZF9mbGFncyAmIExEX1JGX05PX0dMX0xTKSAmJgorCQkgICAgKGxvY2tkX2ZsYWdzICYgTERfUkZfTk9fTE9DS1NQQUNFUykgJiYKKwkJICAgICFzdHJjbXAodmdfbG9ja190eXBlLCAic2FubG9jayIpKSB7CisJCQlsdm1ldGFkX3ZhbGlkYXRlX2dsb2JhbF9jYWNoZShjbWQsIDEpOworCQkJLyoKKwkJCSAqIGx2bWNhY2hlIGhvbGRzIHByb3Zpc2lvbmFsIFZHIGxvY2tfdHlwZSBpbmZvIGJlY2F1c2UKKwkJCSAqIGx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlIGRpZCBhIGRpc2sgc2Nhbi4KKwkJCSAqLworCQkJaWYgKGx2bWNhY2hlX2NvbnRhaW5zX2xvY2tfdHlwZV9zYW5sb2NrKGNtZCkpIHsKKwkJCQkvKiBGSVhNRTogd2UgY291bGQgY2hlY2sgdGhhdCBhbGwgYXJlIHN0YXJ0ZWQsIGFuZCB0aGVuIGNoZWNrIHRoYXQgbm9uZSBoYXZlIGdsIGVuYWJsZWQuICovCisJCQkJbG9nX2Vycm9yKCJHbG9iYWwgbG9jayBmYWlsZWQ6IHN0YXJ0IGV4aXN0aW5nIHNhbmxvY2sgVkdzIHRvIGFjY2VzcyBnbG9iYWwgbG9jay4iKTsKKwkJCQlsb2dfZXJyb3IoIihJZiBhbGwgc2FubG9jayBWR3MgYXJlIHN0YXJ0ZWQsIGVuYWJsZSBnbG9iYWwgbG9jayB3aXRoIGx2bWxvY2tjdGwuKSIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkVuYWJsaW5nIHNhbmxvY2sgZ2xvYmFsIGxvY2siKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKCFzdHJjbXAodmdfbG9ja190eXBlLCAic2FubG9jayIpKQorCQkJbG9nX2Vycm9yKCJHbG9iYWwgbG9jayBmYWlsZWQ6IGNoZWNrIHRoYXQgVkcgaG9sZGluZyBnbG9iYWwgbG9jayBleGlzdHMgYW5kIGlzIHN0YXJ0ZWQuIik7CisJCWVsc2UKKwkJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBjaGVjayB0aGF0IGdsb2JhbCBsb2Nrc3BhY2UgaXMgc3RhcnRlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgZWFjaCBzcGVjaWZpYyBlcnJvciB0aGF0IGNhbiBiZSByZXR1cm5lZCBzbyBhIGhlbHBmdWwKKwkgKiBtZXNzYWdlIGNhbiBiZSBwcmludGVkIGZvciBpdC4KKwkgKi8KKwlpZiAocmVzdWx0IDwgMCkgeworCQlpZiAocmVzdWx0ID09IC1FU1RBUlRJTkcpCisJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogbG9ja3NwYWNlIGlzIHN0YXJ0aW5nLiIpOworCQllbHNlIGlmIChyZXN1bHQgPT0gLUVBR0FJTikKKwkJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBoZWxkIGJ5IG90aGVyIGhvc3QuIik7CisJCWVsc2UgaWYgKHJlc3VsdCA9PSAtRVBST1RPTk9TVVBQT1JUKQorCQkJbG9nX2Vycm9yKCJWRyBjcmVhdGUgZmFpbGVkOiBsb2NrIG1hbmFnZXIgJXMgaXMgbm90IHN1cHBvcnRlZCBieSBsdm1sb2NrZC4iLCB2Z19sb2NrX3R5cGUpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogZXJyb3IgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiAtLXNoYXJlZCB3aXRoIHZnY3JlYXRlIGRvZXMgbm90IG1lYW4gaW5jbHVkZV9zaGFyZWRfdmdzICovCisJY21kLT5pbmNsdWRlX3NoYXJlZF92Z3MgPSAwOworCisJbHZtZXRhZF92YWxpZGF0ZV9nbG9iYWxfY2FjaGUoY21kLCAxKTsKKworCXJldHVybiAxOworfQorCisvKgorICogVGhlIGdsb2JhbCBsb2NrIHByb3RlY3RzOgorICoKKyAqIC0gVGhlIGdsb2JhbCBWRyBuYW1lc3BhY2UuICBUd28gVkdzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgKiAgIFVzZWQgYnkgYW55IGNvbW1hbmQgdGhhdCBjcmVhdGVzIG9yIHJlbW92ZXMgYSBWRyBuYW1lLAorICogICBlLmcuIHZnY3JlYXRlLCB2Z3JlbW92ZSwgdmdyZW5hbWUsIHZnc3BsaXQsIHZnbWVyZ2UuCisgKgorICogLSBUaGUgc2V0IG9mIG9ycGhhbiBQVnMuCisgKiAgIFVzZWQgYnkgYW55IGNvbW1hbmQgdGhhdCBjaGFuZ2VzIGEgbm9uLVBWIGRldmljZSBpbnRvIGFuIG9ycGhhbiBQViwKKyAqICAgYW4gb3JwaGFuIFBWIGludG8gYSBkZXZpY2UsIGEgbm9uLW9ycGhhbiBQViAoaW4gYSBWRykgaW50byBhbiBvcnBoYW4gUFYKKyAqICAgKG5vdCBpbiBhIFZHKSwgb3IgYW4gb3JwaGFuIFBWIGludG8gYSBub24tb3JwaGFuIFBWLAorICogICBlLmcuIHB2Y3JlYXRlLCBwdnJlbW92ZSwgdmdjcmVhdGUsIHZncmVtb3ZlLCB2Z2V4dGVuZCwgdmdyZWR1Y2UuCisgKgorICogLSBUaGUgcHJvcGVydGllcyBvZiBvcnBoYW4gUFZzLiAgSXQgaXMgcG9zc2libGUgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZQorICogICBwcm9wZXJ0aWVzIG9mIGFuIG9ycGhhbiBQViwgZS5nLiBwdnJlc2l6ZSwgcHZjaGFuZ2UuCisgKgorICogVGhlc2UgYXJlIHRoaW5ncyB0aGF0IGNhbm5vdCBiZSBwcm90ZWN0ZWQgYnkgYSBWRyBsb2NrIGFsb25lLCBzaW5jZQorICogb3JwaGFuIFBWcyBkbyBub3QgYmVsb25nIHRvIGEgcmVhbCBWRyAoYW4gYXJ0aWZpY2lhbCBWRyBkb2VzIG5vdAorICogYXBwbHkgc2luY2UgYSBzYW5sb2NrIGxvY2sgb25seSBleGlzdHMgb24gcmVhbCBzdG9yYWdlLikKKyAqCisgKiBJZiBhIGNvbW1hbmQgd2lsbCBjaGFuZ2UgYW55IG9mIHRoZSB0aGluZ3MgYWJvdmUsIGl0IG11c3QgZmlyc3QgYWNxdWlyZQorICogdGhlIGdsb2JhbCBsb2NrIGluIGV4Y2x1c2l2ZSBtb2RlLgorICoKKyAqIElmIGNvbW1hbmQgaXMgcmVhZGluZyBhbnkgb2YgdGhlIHRoaW5ncyBhYm92ZSwgaXQgbXVzdCBhY3F1aXJlIHRoZSBnbG9iYWwKKyAqIGxvY2sgaW4gc2hhcmVkIG1vZGUuICBBIG51bWJlciBvZiBjb21tYW5kcyByZWFkIHRoZSB0aGluZ3MgYWJvdmUsIGluY2x1ZGluZzoKKyAqCisgKiAtIFJlcG9ydGluZy9kaXNwbGF5IGNvbW1hbmRzIHdoaWNoIHNob3cgYWxsIFZHcy4gIEFueSBjb21tYW5kIHRoYXQKKyAqICAgd2lsbCBpdGVyYXRlIHRocm91Z2ggdGhlIGVudGlyZSBWRyBuYW1lc3BhY2UgbXVzdCBmaXJzdCBhY3F1aXJlIHRoZQorICogICBnbG9iYWwgbG9jayBzaGFyZWQgc28gdGhhdCBpdCBoYXMgYW4gYWNjdXJhdGUgdmlldyBvZiB0aGUgbmFtZXNwYWNlLgorICoKKyAqIC0gQSBjb21tYW5kIHdoZXJlIGEgdGFnIG5hbWUgaXMgdXNlZCB0byBpZGVudGlmeSB3aGF0IHRvIHByb2Nlc3MuCisgKiAgIEEgdGFnIHJlcXVpcmVzIHJlYWRpbmcgYWxsIFZHcyB0byBjaGVjayBpZiB0aGV5IG1hdGNoIHRoZSB0YWcuCisgKgorICogSW4gdGhlc2UgY2FzZXMsIHRoZSBnbG9iYWwgbG9jayBtdXN0IGJlIGFjcXVpcmVkIGJlZm9yZSB0aGUgbGlzdCBvZgorICogYWxsIFZHcyBpcyBjcmVhdGVkLgorICoKKyAqIFRoZSBnbG9iYWwgbG9jayBpcyBub3QgZ2VuZXJhbGx5IHVubG9ja2VkIGV4cGxpY2l0bHkgaW4gdGhlIGNvZGUuCisgKiBXaGVuIHRoZSBjb21tYW5kIGRpc2Nvbm5lY3RzIGZyb20gbHZtbG9ja2QsIGx2bWxvY2tkIGF1dG9tYXRpY2FsbHkKKyAqIHJlbGVhc2VzIHRoZSBsb2NrcyBoZWxkIGJ5IHRoZSBjb21tYW5kLiAgVGhlIGV4Y2VwdGlvbiBpcyBpZiBhIGNvbW1hbmQKKyAqIHdpbGwgY29udGludWUgcnVubmluZyBmb3IgYSBsb25nIHRpbWUgd2hpbGUgbm90IG5lZWRpbmcgdGhlIGdsb2JhbCBsb2NrLAorICogZS5nLiBjb21tYW5kcyB0aGF0IHBvbGwgdG8gcmVwb3J0IHByb2dyZXNzLgorICoKKyAqIEFjcXVpcmluZyB0aGUgZ2xvYmFsIGxvY2sgYWxzbyB1cGRhdGVzIHRoZSBsb2NhbCBsdm1ldGFkIGNhY2hlIGlmCisgKiBuZWNlc3NhcnkuICBsb2NrZF9nbCgpIGZpcnN0IGFjcXVpcmVzIHRoZSBsb2NrIHZpYSBsdm1sb2NrZCwgdGhlbgorICogYmVmb3JlIHJldHVybmluZyB0byB0aGUgY2FsbGVyLCBpdCBjaGVja3MgdGhhdCB0aGUgZ2xvYmFsIGluZm9ybWF0aW9uCisgKiAoZS5nLiBWRyBuYW1lc3BhY2UsIHNldCBvZiBvcnBoYW5zKSBpcyB1cCB0byBkYXRlIGluIGx2bWV0YWQuICBJZgorICogbm90LCBpdCBzY2FucyBkaXNrcyBhbmQgdXBkYXRlcyB0aGUgbHZtZXRhZCBjYWNoZSBiZWZvcmUgcmV0dXJuaW5nCisgKiB0byB0aGUgY2FsbGVyLiAgSXQgZG9lcyB0aGlzIGNoZWNraW5nIHVzaW5nIGEgdmVyc2lvbiBudW1iZXIgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZ2xvYmFsIGxvY2suICBUaGUgdmVyc2lvbiBudW1iZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lCisgKiBhIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdsb2JhbCBsb2NrLCBhbmQKKyAqIGlmIHRoZSBsb2NhbCB2ZXJzaW9uIG51bWJlciBpcyBsb3dlciB0aGFuIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUKKyAqIGxvY2ssIHRoZW4gdGhlIGxvY2FsIGx2bWV0YWQgc3RhdGUgbXVzdCBiZSB1cGRhdGVkLgorICoKKyAqIFRoZXJlIGFyZSB0d28gY2FzZXMgd2hlcmUgdGhlIGdsb2JhbCBsb2NrIGNhbiBiZSB0YWtlbiBpbiBzaGFyZWQgbW9kZSwKKyAqIGFuZCB0aGVuIGxhdGVyIGNvbnZlcnRlZCB0byBleC4gIHB2Y2hhbmdlIGFuZCBwdnJlc2l6ZSB1c2UgcHJvY2Vzc19lYWNoX3B2CisgKiB3aGljaCBkb2VzIGxvY2tkX2dsKCJzaCIpIHRvIGdldCB0aGUgbGlzdCBvZiBWR3MuICBMYXRlciwgaW4gdGhlICJfc2luZ2xlIgorICogZnVuY3Rpb24gY2FsbGVkIHdpdGhpbiBwcm9jZXNzX2VhY2hfcHYsIHRoZSBQViBtYXkgYmUgYW4gb3JwaGFuLCBpbiB3aGljaAorICogY2FzZSB0aGUgZXggZ2xvYmFsIGxvY2sgaXMgbmVlZGVkLCBzbyBpdCdzIGNvbnZlcnRlZCB0byBleCBhdCB0aGF0IHBvaW50LgorICoKKyAqIEVmZmVjdHMgb2YgbWlzY29uZmlndXJpbmcgdXNlX2x2bWxvY2tkLgorICoKKyAqIC0gU2V0dGluZyB1c2VfbHZtbG9ja2Q9MSB0ZWxscyBsdm0gY29tbWFuZHMgdG8gdXNlIHRoZSBnbG9iYWwgbG9jay4KKyAqIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgdW5sZXNzIGEgbG9jayBtYW5hZ2VyIGFuZCBsb2NrZCBWR3Mgd2lsbAorICogYmUgdXNlZC4gIFNldHRpbmcgdXNlX2x2bWxvY2tkPTEgd2l0aG91dCBzZXR0aW5nIHVwIGEgbG9jayBtYW5hZ2VyCisgKiBvciB1c2luZyBsb2NrZCBWR3Mgd2lsbCBjYXVzZSBsdm0gY29tbWFuZHMgdG8gZmFpbCB3aGVuIHRoZXkgYXR0ZW1wdAorICogdG8gY2hhbmdlIGFueSBnbG9iYWwgc3RhdGUgKHJlcXVpcmluZyB0aGUgZXggZ2xvYmFsIGxvY2spLCBhbmQgd2lsbAorICogY2F1c2Ugd2FybmluZ3Mgd2hlbiB0aGUgY29tbWFuZHMgcmVhZCBnbG9iYWwgc3RhdGUgKHJlcXVpcmluZyB0aGUgc2gKKyAqIGdsb2JhbCBsb2NrKS4gIEluIHRoaXMgY29uZGl0aW9uLCBsdm0gaXMgbm9taW5hbGx5IHVzZWZ1bCwgYW5kIGV4aXN0aW5nCisgKiBsb2NhbCBWR3MgY2FuIGNvbnRpbnVlIHRvIGJlIHVzZWQgbW9zdGx5IGFzIHVzdWFsLiAgQnV0LCB0aGUKKyAqIHdhcm5pbmdzL2Vycm9ycyBzaG91bGQgbGVhZCBhIHVzZXIgdG8gZWl0aGVyIHNldCB1cCBhIGxvY2sgbWFuYWdlcgorICogYW5kIGxvY2tkIFZHcywgb3Igc2V0IHVzZV9sdm1sb2NrZCB0byAwLgorICoKKyAqIC0gU2V0dGluZyB1c2VfbHZtbG9ja2Q9MCB0ZWxscyBsdm0gY29tbWFuZHMgdG8gbm90IHVzZSB0aGUgZ2xvYmFsIGxvY2suCisgKiBJZiB1c2VfbHZtbG9ja2Q9MCB3aGVuIGxvY2tkIFZHcyBleGlzdCB3aGljaCByZXF1aXJlIGx2bWxvY2tkLCB0aGUKKyAqIGxvY2tkX2dsKCkgY2FsbHMgYmVjb21lIG5vLW9wcywgYnV0IHRoZSBsb2NrZF92ZygpIGNhbGxzIGZvciB0aGUgbG9ja2QKKyAqIFZHcyB3aWxsIGZhaWwuICBUaGUgd2FybmluZ3MvZXJyb3JzIGZyb20gYWNjZXNzaW5nIHRoZSBsb2NrZCBWR3MKKyAqIHNob3VsZCBsZWFkIHRoZSB1c2VyIHRvIHNldCB1c2VfbHZtbG9ja2QgdG8gMSBhbmQgcnVuIHRoZSBuZWNlc3NhcnkKKyAqIGxvY2sgbWFuYWdlci4gIEluIHRoaXMgY29uZGl0aW9uLCBsdm0gcmV2ZXJ0cyB0byB0aGUgYmVoYXZpb3Igb2YKKyAqIHRoZSBmb2xsb3dpbmcgY2FzZSwgaW4gd2hpY2ggc3lzdGVtIElEIGxhcmdlbHkgcHJvdGVjdHMgc2hhcmVkCisgKiBkZXZpY2VzLCBidXQgaGFzIGxpbWl0YXRpb25zLgorICoKKyAqIC0gU2V0dGluZyB1c2VfbHZtbG9ja2Q9MCB3aXRoIHNoYXJlZCBkZXZpY2VzLCBubyBsb2NrZCBWR3MgYW5kCisgKiBubyBsb2NrIG1hbmFnZXIgaXMgYSByZWNvZ25pemVkIG1vZGUgb2Ygb3BlcmF0aW9uIHRoYXQgaXMKKyAqIGRlc2NyaWJlZCBpbiB0aGUgbHZtc3lzdGVtaWQgbWFuIHBhZ2UuICBVc2luZyBsdm0gb24gc2hhcmVkCisgKiBkZXZpY2VzIHRoaXMgd2F5IGlzIG1hZGUgc2FmZSBieSB1c2luZyBzeXN0ZW0gSURzIHRvIGFzc2lnbgorICogb3duZXJzaGlwIG9mIFZHcyB0byBzaW5nbGUgaG9zdHMuICBUaGUgbWFpbiBsaW1pdGF0aW9uIG9mIHRoaXMKKyAqIG1vZGUgKGFtb25nIG90aGVycyBvdXRsaW5lZCBpbiB0aGUgbWFuIHBhZ2UpLCBpcyB0aGF0IG9ycGhhbiBQVnMKKyAqIGFyZSB1bnByb3RlY3RlZC4KKyAqLworCitpbnQgbG9ja2RfZ2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmRlZl9tb2RlLCB1aW50MzJfdCBmbGFncykKK3sKKwljb25zdCBjaGFyICptb2RlID0gTlVMTDsKKwljb25zdCBjaGFyICpvcHRzID0gTlVMTDsKKwl1aW50MzJfdCBsb2NrZF9mbGFnczsKKwlpbnQgZm9yY2VfY2FjaGVfdXBkYXRlID0gMDsKKwlpbnQgcmV0cmllcyA9IDA7CisJaW50IHJlc3VsdDsKKworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHdoZW4gLS1yZWFkb25seSBpcyB1c2VkLCBubyBleCBsb2NrcyBzaG91bGQgYmUgdXNlZC4KKwkgKi8KKwlpZiAoY21kLT5tZXRhZGF0YV9yZWFkX29ubHkgJiYgZGVmX21vZGUgJiYgIXN0cmNtcChkZWZfbW9kZSwgImV4IikpIHsKKwkJbG9nX2Vycm9yKCJFeGNsdXNpdmUgbG9ja3MgYXJlIG5vdCBhbGxvd2VkIHdpdGggcmVhZG9ubHkgb3B0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY21kLT5sb2NrZF9nbF9kaXNhYmxlKQorCQlyZXR1cm4gMTsKKworCWlmIChkZWZfbW9kZSAmJiAhc3RyY21wKGRlZl9tb2RlLCAidW4iKSkgeworCQltb2RlID0gInVuIjsKKwkJZ290byByZXE7CisJfQorCisJaWYgKCFtb2RlKQorCQltb2RlID0gZGVmX21vZGU7CisJaWYgKCFtb2RlKSB7CisJCWxvZ19lcnJvcigiVW5rbm93biBsb2NrLWdsIG1vZGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisgcmVxOgorCWxvZ19kZWJ1ZygibG9ja2QgZ2xvYmFsIG1vZGUgJXMiLCBtb2RlKTsKKworCWlmICghX2xvY2tkX3JlcXVlc3QoY21kLCAibG9ja19nbCIsCisJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgbW9kZSwgb3B0cywKKwkJCSAgICAmcmVzdWx0LCAmbG9ja2RfZmxhZ3MpKSB7CisJCS8qIE5vIHJlc3VsdCBmcm9tIGx2bWxvY2tkLCBpdCBpcyBwcm9iYWJseSBub3QgcnVubmluZy4gKi8KKworCQkvKiBXZSBkb24ndCBjYXJlIGlmIGFuIHVubG9jayBmYWlscy4gKi8KKwkJaWYgKCFzdHJjbXAobW9kZSwgInVuIikpCisJCQlyZXR1cm4gMTsKKworCQkvKiBXZSBjYW4gY29udGludWUgcmVhZGluZyBpZiBhIHNoYXJlZCBsb2NrIGZhaWxzLiAqLworCQlpZiAoIXN0cmNtcChtb2RlLCAic2giKSkgeworCQkJbG9nX3dhcm4oIlJlYWRpbmcgd2l0aG91dCBzaGFyZWQgZ2xvYmFsIGxvY2suIik7CisJCQlmb3JjZV9jYWNoZV91cGRhdGUgPSAxOworCQkJZ290byBhbGxvdzsKKwkJfQorCisJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBjaGVjayB0aGF0IGx2bWxvY2tkIGlzIHJ1bm5pbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQgPT0gLUVBR0FJTikgeworCQlpZiAocmV0cmllcyA8IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgZ2xvYmFsX2x2bWxvY2tkX2xvY2tfcmV0cmllc19DRkcsIE5VTEwpKSB7CisJCQlsb2dfd2FybigiUmV0cnlpbmcgJXMgZ2xvYmFsIGxvY2siLCBtb2RlKTsKKwkJCXNsZWVwKDEpOworCQkJcmV0cmllcysrOworCQkJZ290byByZXE7CisJCX0KKwl9CisKKworCWlmICghc3RyY21wKG1vZGUsICJ1biIpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogRU5PTFM6IG5vIGxvY2tzcGFjZSB3YXMgZm91bmQgd2l0aCBhIGdsb2JhbCBsb2NrLgorCSAqIFRoZSBWRyB3aXRoIHRoZSBnbG9iYWwgbG9jayBtYXkgbm90IGJlIHZpc2libGUgb3Igc3RhcnRlZCB5ZXQsCisJICogdGhpcyBzaG91bGQgYmUgYSB0ZW1wb3JhcnkgY29uZGl0aW9uLgorCSAqCisJICogRVNUQVJUSU5HOiB0aGUgbG9ja3NwYWNlIHdpdGggdGhlIGdsIGlzIHN0YXJ0aW5nLgorCSAqIFRoZSBWRyB3aXRoIHRoZSBnbG9iYWwgbG9jayBpcyBzdGFydGluZyBhbmQgc2hvdWxkIGZpbmlzaCBzaG9ydGx5LgorCSAqCisJICogRUxPQ0tJTzogc2FubG9jayBnZXRzIGkvbyBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gcmVhZC93cml0ZSBsZWFzZXMKKwkgKiAoVGhpcyBjYW4gcHJvZ3Jlc3MgdG8gRVZHS0lMTEVELikKKwkgKgorCSAqIEVWR0tJTExFRDogdGhlIHNhbmxvY2sgbG9ja3NwYWNlIGlzIGJlaW5nIGtpbGxlZCBhZnRlciBsb3NpbmcKKwkgKiBhY2Nlc3MgdG8gbGVhc2Ugc3RvcmFnZS4KKwkgKi8KKworCWlmIChyZXN1bHQgPT0gLUVOT0xTIHx8CisJICAgIHJlc3VsdCA9PSAtRVNUQVJUSU5HIHx8CisJICAgIHJlc3VsdCA9PSAtRVZHS0lMTEVEIHx8CisJICAgIHJlc3VsdCA9PSAtRUxPQ0tJTykgeworCQkvKgorCQkgKiBJZiBhbiBleCBnbG9iYWwgbG9jayBmYWlscywgdGhlbiB0aGUgY29tbWFuZCBmYWlscy4KKwkJICovCisJCWlmIChzdHJjbXAobW9kZSwgInNoIikpIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVTVEFSVElORykKKwkJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogbG9ja3NwYWNlIGlzIHN0YXJ0aW5nIik7CisJCQllbHNlIGlmIChyZXN1bHQgPT0gLUVOT0xTKQorCQkJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBjaGVjayB0aGF0IGdsb2JhbCBsb2Nrc3BhY2UgaXMgc3RhcnRlZCIpOworCQkJZWxzZSBpZiAocmVzdWx0ID09IC1FTE9DS0lPKQorCQkJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBzdG9yYWdlIGVycm9ycyBmb3Igc2FubG9jayBsZWFzZXMiKTsKKwkJCWVsc2UgaWYgKHJlc3VsdCA9PSAtRVZHS0lMTEVEKQorCQkJCWxvZ19lcnJvcigiR2xvYmFsIGxvY2sgZmFpbGVkOiBzdG9yYWdlIGZhaWxlZCBmb3Igc2FubG9jayBsZWFzZXMiKTsKKwkJCWVsc2UKKwkJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogZXJyb3IgJWQiLCByZXN1bHQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBJZiBhIHNoIGdsb2JhbCBsb2NrIGZhaWxzLCB0aGVuIHRoZSBjb21tYW5kIGNhbiBjb250aW51ZQorCQkgKiByZWFkaW5nIHdpdGhvdXQgaXQsIGJ1dCBmb3JjZSBhIGdsb2JhbCBjYWNoZSB2YWxpZGF0aW9uLAorCQkgKiBhbmQgcHJpbnQgYSB3YXJuaW5nLgorCQkgKi8KKworCQlpZiAocmVzdWx0ID09IC1FU1RBUlRJTkcpIHsKKwkJCWxvZ193YXJuKCJTa2lwcGluZyBnbG9iYWwgbG9jazogbG9ja3NwYWNlIGlzIHN0YXJ0aW5nIik7CisJCQlmb3JjZV9jYWNoZV91cGRhdGUgPSAxOworCQkJZ290byBhbGxvdzsKKwkJfQorCisJCWlmIChyZXN1bHQgPT0gLUVMT0NLSU8gfHwgcmVzdWx0ID09IC1FVkdLSUxMRUQpIHsKKwkJCWxvZ193YXJuKCJTa2lwcGluZyBnbG9iYWwgbG9jazogc3RvcmFnZSAlcyBmb3Igc2FubG9jayBsZWFzZXMiLAorCQkJCSAgcmVzdWx0ID09IC1FTE9DS0lPID8gImVycm9ycyIgOiAiZmFpbGVkIik7CisJCQlmb3JjZV9jYWNoZV91cGRhdGUgPSAxOworCQkJZ290byBhbGxvdzsKKwkJfQorCisJCWlmICgobG9ja2RfZmxhZ3MgJiBMRF9SRl9OT19HTF9MUykgJiYgKGxvY2tkX2ZsYWdzICYgTERfUkZfV0FSTl9HTF9SRU1PVkVEKSkgeworCQkJbG9nX3dhcm4oIlNraXBwaW5nIGdsb2JhbCBsb2NrOiBWRyB3aXRoIGdsb2JhbCBsb2NrIHdhcyByZW1vdmVkIik7CisJCQlmb3JjZV9jYWNoZV91cGRhdGUgPSAxOworCQkJZ290byBhbGxvdzsKKwkJfQorCisJCWlmICgobG9ja2RfZmxhZ3MgJiBMRF9SRl9OT19HTF9MUykgfHwgKGxvY2tkX2ZsYWdzICYgTERfUkZfTk9fTE9DS1NQQUNFUykpIHsKKwkJCWxvZ193YXJuKCJTa2lwcGluZyBnbG9iYWwgbG9jazogbG9ja3NwYWNlIG5vdCBmb3VuZCBvciBzdGFydGVkIik7CisJCQlmb3JjZV9jYWNoZV91cGRhdGUgPSAxOworCQkJZ290byBhbGxvdzsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgZm9yIGNvbXBsZXRlbmVzcy4gIElmIHdlIHJlYWNoIGhlcmUsIHRoZW4KKwkJICogYSBzcGVjaWZpYyBjaGVjayBmb3IgdGhlIGVycm9yIHNob3VsZCBiZSBhZGRlZCBhYm92ZQorCQkgKiB3aXRoIGEgbW9yZSBoZWxwZnVsIG1lc3NhZ2UuCisJCSAqLworCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogZXJyb3IgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGxvY2tkX2ZsYWdzICYgTERfUkZfRFVQX0dMX0xTKSAmJiBzdHJjbXAobW9kZSwgInVuIikpCisJCWxvZ193YXJuKCJEdXBsaWNhdGUgc2FubG9jayBnbG9iYWwgbG9ja3Mgc2hvdWxkIGJlIGNvcnJlY3RlZCIpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisJCQkvKgorCQkJICogTW9zdCBvZiB0aGUgdGltZSwgcmV0cmllcyBzaG91bGQgYXZvaWQgdGhpcyBjYXNlLgorCQkJICovCisJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogaGVsZCBieSBvdGhlciBob3N0LiIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgaW50ZW5kIHRvIHJlYWNoIHRoaXMuICBXZSBzaG91bGQgY2hlY2sKKwkJCSAqIGFueSBrbm93bi9wb3NzaWJsZSBlcnJvciBzcGVjaWZpY2FsbHkgYW5kIHByaW50CisJCQkgKiBhIG1vcmUgaGVscGZ1bCBtZXNzYWdlLiAgVGhpcyBpcyBmb3IgY29tcGxldGVuZXNzLgorCQkJICovCisJCQlsb2dfZXJyb3IoIkdsb2JhbCBsb2NrIGZhaWxlZDogZXJyb3IgJWQuIiwgcmVzdWx0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisgYWxsb3c6CisJbHZtZXRhZF92YWxpZGF0ZV9nbG9iYWxfY2FjaGUoY21kLCBmb3JjZV9jYWNoZV91cGRhdGUpOworCXJldHVybiAxOworfQorCisvKgorICogVkcgbG9jaworICoKKyAqIFJldHVybiAxOiBjb250aW51ZSwgbG9ja2Rfc3RhdGUgbWF5IHN0aWxsIGluZGljYXRlIGFuIGVycm9yCisgKiBSZXR1cm4gMDogZmFpbHVyZSwgZG8gbm90IGNvbnRpbnVlCisgKgorICogbHZtbG9ja2QgY291bGQgYWxzbyByZXR1cm4gdGhlIGxvY2tfdHlwZSB0aGF0IGl0IHVzZWQgZm9yIHRoZSBWRywKKyAqIGFuZCB3ZSBjb3VsZCBlbmNvZGUgdGhhdCBpbiBsb2NrZF9zdGF0ZSwgYW5kIHZlcmlmeSBsYXRlciB0aGF0IGl0CisgKiBtYXRjaGVzIHZnLT5sb2NrX3R5cGUuCisgKgorICogVGhlIHJlc3VsdCBvZiB0aGUgVkcgbG9jayBvcGVyYXRpb24gbmVlZHMgdG8gYmUgc2F2ZWQgaW4gbG9ja2Rfc3RhdGUKKyAqIGJlY2F1c2UgdGhlIHJlc3VsdCBuZWVkcyB0byBiZSBwYXNzZWQgaW50byB2Z19yZWFkIHNvIGl0IGNhbiBiZQorICogYXNzZXNzZWQgaW4gY29tYmluYXRpb24gd2l0aCB2Zy0+bG9ja190eXBlLgorICoKKyAqIFRoZSBWRyBsb2NrIHByb3RlY3RzIHRoZSBWRyBtZXRhZGF0YSBvbiBkaXNrIGZyb20gY29uY3VycmVudCBhY2Nlc3MKKyAqIGFtb25nIGhvc3RzLiAgVGhlIFZHIGxvY2sgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIGxvY2FsIGx2bWV0YWQgY2FjaGUKKyAqIGNvbnRhaW5zIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgVkcgbWV0YWRhdGEgZnJvbSBkaXNrLiAgKFNpbmNlCisgKiBhbm90aGVyIGhvc3QgbWF5IGhhdmUgY2hhbmdlZCB0aGUgVkcgc2luY2UgaXQgd2FzIGxhc3QgcmVhZC4pCisgKgorICogVGhlIFZHIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgdGhlIFZHIGlzIHJlYWQsIGkuZS4gYmVmb3JlIHZnX3JlYWQoKS4KKyAqIFRoZSByZXN1bHQgZnJvbSBsb2NrZF92ZygpIGlzIHNhdmVkIGluIHRoZSAibG9ja2Rfc3RhdGUiIHZhcmlhYmxlLCBhbmQKKyAqIHRoaXMgcmVzdWx0IGlzIHBhc3NlZCBpbnRvIHZnX3JlYWQoKS4gIEFmdGVyIHZnX3JlYWQoKSByZWFkcyB0aGUgVkcsCisgKiBpdCBjaGVja3MgaWYgdGhlIFZHIGxvY2tfdHlwZSAoc2FubG9jayBvciBkbG0pIHJlcXVpcmVzIGEgbG9jayB0byBiZQorICogaGVsZCwgYW5kIGlmIHNvLCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBsb2NrIHdhcyBjb3JyZWN0bHkgYWNxdWlyZWQgYnkKKyAqIGxvb2tpbmcgYXQgbG9ja2Rfc3RhdGUuICBJZiB2Z19yZWFkKCkgc2VlcyB0aGF0IHRoZSBWRyBpcyBhIGxvY2FsIFZHLAorICogaS5lLiBsb2NrX3R5cGUgaXMgbm90IHNhbmxvY2sgb3IgZGxtLCB0aGVuIG5vIGxvY2sgaXMgcmVxdWlyZWQsIGFuZCBpdAorICogaWdub3JlcyBsb2NrZF9zdGF0ZSAod2hpY2ggd291bGQgaW5kaWNhdGUgbm8gbG9jayB3YXMgZm91bmQuKQorICoKKyAqIFdoZW4gYWNxdWlyaW5nIHRoZSBWRyBsb2NrLCBsdm1sb2NrZCBjaGVja3MgaWYgdGhlIGxvY2FsIGNhY2hlZCBjb3B5CisgKiBvZiB0aGUgVkcgbWV0YWRhdGEgaW4gbHZtZXRhZCBpcyB1cCB0byBkYXRlLiAgSWYgbm90LCBpdCBpbnZhbGlkYXRlcworICogdGhlIFZHIGNhY2hlZCBpbiBsdm1ldGFkLiAgVGhpcyB3b3VsZCBoYXBwZW4gaWYgYW5vdGhlciBob3N0IGNoYW5nZWQKKyAqIHRoZSBWRyBzaW5jZSBpdCB3YXMgbGFzdCByZWFkLiAgV2hlbiBsdm0gY29tbWFuZHMgcmVhZCB0aGUgVkcgZnJvbQorICogbHZtZXRhZCwgdGhleSB3aWxsIGNoZWNrIGlmIHRoZSBtZXRhZGF0YSBpcyBpbnZhbGlkLCBhbmQgaWYgc28gdGhleQorICogd2lsbCByZXJlYWQgaXQgZnJvbSBkaXNrLCBhbmQgdXBkYXRlIHRoZSBjb3B5IGluIGx2bWV0YWQuCisgKi8KKworaW50IGxvY2tkX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICpkZWZfbW9kZSwKKwkgICAgIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCAqbG9ja2Rfc3RhdGUpCit7CisJY29uc3QgY2hhciAqbW9kZSA9IE5VTEw7CisJdWludDMyX3QgbG9ja2RfZmxhZ3M7CisJdWludDMyX3QgcHJldl9zdGF0ZSA9ICpsb2NrZF9zdGF0ZTsKKwlpbnQgcmV0cmllcyA9IDA7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgcmVzdWx0IG9mIHRoZSBWRyBsb2NrIHJlcXVlc3QgaXMgc2F2ZWQgaW4gbG9ja2Rfc3RhdGUgdG8gYmUKKwkgKiBwYXNzZWQgaW50byB2Z19yZWFkIHdoZXJlIHRoZSBsb2NrIHJlc3VsdCBpcyBuZWVkZWQgb25jZSB3ZQorCSAqIGtub3cgaWYgdGhpcyBpcyBhIGxvY2FsIFZHIG9yIGxvY2tkIFZHLgorCSAqLworCSpsb2NrZF9zdGF0ZSA9IDA7CisKKwkvKgorCSAqIFVzZSBvZiBsb2NrZF92Z19yZXNjYW4uCisJICoKKwkgKiBUaGlzIGlzIHRoZSBWRyBlcXVpdmFsZW50IG9mIHVzaW5nIGx2bWV0YWRfdmFsaWRhdGVfZ2xvYmFsX2NhY2hlKCkKKwkgKiBmb3IgdGhlIGdsb2JhbCBsb2NrIChhZnRlciBmYWlsaW5nIHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrKS4gIElmCisJICogd2UgZmFpbCB0byBhY3F1aXJlIHRoZSBWRyBsb2NrIGZyb20gbHZtbG9ja2QsIHRoZW4gdGhlIGx2bWxvY2tkCisJICogbWVjaGFuaXNtIGhhcyBiZWVuIG1pc3NlZCB0aGF0IHdvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIGx2bWV0YWQKKwkgKiBjb3B5IG9mIHRoZSBWRy4gIFNvLCBzZXQgbG9ja2RfdmdfcmVzY2FuIHRvIHRlbGwgdGhlIFZHIHJlYWRpbmcgY29kZQorCSAqIHRvIHRyZWF0IHRoZSBsdm1ldGFkIGNvcHkgYXMgaWYgdGhlIGludmFsaWQgZmxhZyBoYWQgYmVlbiByZXR1cm5lZC4KKwkgKiBpLmUuIElmIGEgbG9ja2QgVkcgaXMgcmVhZCB3aXRob3V0IGEgbG9jaywgaWdub3JlIHRoZSBsdm1ldGFkIGNvcHkKKwkgKiBhbmQgcmVhZCBpdCBmcm9tIGRpc2sgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgY2FjaGUgaXMgc3RhbGUuCisJICoKKwkgKiBCZWNhdXNlIGx2bWxvY2tkIHJlcXVlc3RzIHJldHVybiBhbiBlcnJvciBmb3IgbG9jYWwgVkdzLCB0aGlzIHdpbGwKKwkgKiBiZSBzZXQgZm9yIGxvY2FsIFZHcywgYnV0IGl0IGVuZHMgdXAgYmVpbmcgaWdub3JlZCBvbmNlIHRoZSBWRyBpcworCSAqIHJlYWQgYW5kIGZvdW5kIHRvIGJlIGEgbG9jYWwgVkcuCisJICovCisJY21kLT5sb2NrZF92Z19yZXNjYW4gPSAwOworCisJaWYgKCFpc19yZWFsX3ZnKHZnX25hbWUpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgd2hlbiAtLXJlYWRvbmx5IGlzIHVzZWQsIG5vIGV4IGxvY2tzIHNob3VsZCBiZSB1c2VkLgorCSAqLworCWlmIChjbWQtPm1ldGFkYXRhX3JlYWRfb25seSAmJgorCSAgICAoKGRlZl9tb2RlICYmICFzdHJjbXAoZGVmX21vZGUsICJleCIpKSB8fAorCSAgICAgKCFkZWZfbW9kZSAmJiAhY21kLT5sb2NrZF92Z19kZWZhdWx0X3NoKSkpIHsKKwkJbG9nX2Vycm9yKCJFeGNsdXNpdmUgbG9ja3MgYXJlIG5vdCBhbGxvd2VkIHdpdGggcmVhZG9ubHkgb3B0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNvbWUgc3BlY2lhbCBjYXNlcyBuZWVkIHRvIGRpc2FibGUgdGhlIHZnIGxvY2suCisJICovCisJaWYgKGNtZC0+bG9ja2RfdmdfZGlzYWJsZSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIEFuIHVubG9jayBpcyBzaW1wbHkgc2VudCBvciBza2lwcGVkIHdpdGhvdXQgYW55IG5lZWQKKwkgKiBmb3IgdGhlIG1vZGUgY2hlY2tpbmcgZm9yIHNoL2V4LgorCSAqCisJICogTG9vayBhdCBsb2NrZF9zdGF0ZSBmcm9tIHRoZSBzaC9leCBsb2NrLCBhbmQgaWYgaXQgZmFpbGVkLAorCSAqIGRvbid0IGJvdGhlciBzZW5kaW5nIHRoZSB1bmxvY2sgdG8gbHZtbG9ja2QuICBUaGUgbWFpbgorCSAqIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhdm9pZCBzZW5kaW5nIGFuIHVubmVjZXNzYXJ5IHVubG9jaworCSAqIGZvciBsb2NhbCBWR3MgKHRoZSBsb2NrZF9zdGF0ZSBmcm9tIHNoL2V4IG9uIHRoZSBsb2NhbCBWRworCSAqIHdpbGwgYmUgZmFpbGVkLikgIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBsb2NrZF9zdGF0ZSB2YWx1ZQorCSAqIHNob3VsZCBiZSBwcmVzZXJ2ZWQgZnJvbSB0aGUgc2gvZXggbG9ja2RfdmcoKSBjYWxsIGFuZAorCSAqIHBhc3NlZCBiYWNrIHRvIGxvY2tkX3ZnKCkgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHVubG9jay4KKwkgKi8KKwlpZiAoZGVmX21vZGUgJiYgIXN0cmNtcChkZWZfbW9kZSwgInVuIikpIHsKKwkJaWYgKHByZXZfc3RhdGUgJiBMRFNUX0ZBSUwpCisJCQlyZXR1cm4gMTsKKworCQltb2RlID0gInVuIjsKKwkJZ290byByZXE7CisJfQorCisJLyoKKwkgKiBUaGUgZGVmYXVsdCBtb2RlIG1heSBub3QgaGF2ZSBiZWVuIHByb3ZpZGVkIGluIHRoZQorCSAqIGZ1bmN0aW9uIGFyZ3MuICBUaGlzIGhhcHBlbnMgd2hlbiBsb2NrZF92ZyBpcyBjYWxsZWQKKwkgKiBmcm9tIGEgcHJvY2Vzc19lYWNoIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkaWZmZXJlbnQKKwkgKiBjb21tYW5kcy4gIENvbW1hbmRzIHRoYXQgb25seSByZWFkL2NoZWNrL3JlcG9ydC9kaXNwbGF5CisJICogdGhlIHZnIGhhdmUgTE9DS0RfVkdfU0ggc2V0IGluIGNvbW1hbmRzLmgsIHdoaWNoIGlzCisJICogY29waWVkIHRvIGxvY2tkX3ZnX2RlZmF1bHRfc2guICBDb21tYW5kcyB3aXRob3V0IHRoaXMKKwkgKiBzZXQgbW9kaWZ5IHRoZSB2ZyBhbmQgbmVlZCBleC4KKwkgKi8KKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBkZWZfbW9kZTsKKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBjbWQtPmxvY2tkX3ZnX2RlZmF1bHRfc2ggPyAic2giIDogImV4IjsKKworCWlmICghc3RyY21wKG1vZGUsICJleCIpKQorCQkqbG9ja2Rfc3RhdGUgfD0gTERTVF9FWDsKKworIHJlcToKKwkvKgorCSAqIFRoaXMgY2hlY2sgaXMgbm90IGF0IHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uIHNvIHRoYXQKKwkgKiB3ZSBjYW4gZmlyc3Qgc2V0IExEU1RfRVggd2hpY2ggd2lsbCBiZSB1c2VkIGxhdGVyIHRvCisJICogZGVjaWRlIHdoZXRoZXIgYSBmYWlsdXJlIGNhbiBiZSBpZ25vcmVkIG9yIG5vdC4KKwkgKgorCSAqIFdlIGRvIG5vdCBrbm93IGlmIHRoaXMgaXMgYSBsb2NhbCBWRyBvciBsb2NrZCBWRyB5ZXQsCisJICogc28gd2UgbXVzdCByZXR1cm4gc3VjY2VzcywgZ28gYWhlYWQgYW5kIHJlYWQgdGhlIFZHLAorCSAqIHRoZW4gY2hlY2sgaWYgdGhlIGxvY2tfdHlwZSByZXF1aXJlZCBsdm1sb2NrZCBvciBub3QuCisJICovCisJaWYgKCFfdXNlX2x2bWxvY2tkKSB7CisJCSpsb2NrZF9zdGF0ZSB8PSBMRFNUX0ZBSUxfUkVRVUVTVDsKKwkJY21kLT5sb2NrZF92Z19yZXNjYW4gPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlsb2dfZGVidWcoImxvY2tkIFZHICVzIG1vZGUgJXMiLCB2Z19uYW1lLCBtb2RlKTsKKworCWlmICghX2xvY2tkX3JlcXVlc3QoY21kLCAibG9ja192ZyIsCisJCQkgICAgICB2Z19uYW1lLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBtb2RlLCBOVUxMLAorCQkJICAgICAgJnJlc3VsdCwgJmxvY2tkX2ZsYWdzKSkgeworCQkvKgorCQkgKiBObyByZXN1bHQgZnJvbSBsdm1sb2NrZCwgaXQgaXMgcHJvYmFibHkgbm90IHJ1bm5pbmcuCisJCSAqIERlY2lkZSBpZiBpdCBpcyBvayB0byBjb250aW51ZSB3aXRob3V0IGEgbG9jayBpbgorCQkgKiBhY2Nlc3NfdmdfbG9ja190eXBlKCkgYWZ0ZXIgdGhlIFZHIGhhcyBiZWVuIHJlYWQgYW5kCisJCSAqIHRoZSBsb2NrX3R5cGUgY2FuIGJlIGNoZWNrZWQuICBXZSBkb24ndCBjYXJlIGFib3V0CisJCSAqIHRoaXMgZXJyb3IgZm9yIGxvY2FsIFZHcywgYnV0IHdlIGRvIGNhcmUgZm9yIGxvY2tkIFZHcy4KKwkJICovCisJCSpsb2NrZF9zdGF0ZSB8PSBMRFNUX0ZBSUxfUkVRVUVTVDsKKwkJY21kLT5sb2NrZF92Z19yZXNjYW4gPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKKwkJaWYgKHJldHJpZXMgPCBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGdsb2JhbF9sdm1sb2NrZF9sb2NrX3JldHJpZXNfQ0ZHLCBOVUxMKSkgeworCQkJbG9nX3dhcm4oIlJldHJ5aW5nICVzIGxvY2sgb24gVkcgJXMiLCBtb2RlLCB2Z19uYW1lKTsKKwkJCXNsZWVwKDEpOworCQkJcmV0cmllcysrOworCQkJZ290byByZXE7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FTk9MUzoKKwkJKmxvY2tkX3N0YXRlIHw9IExEU1RfRkFJTF9OT0xTOworCQljbWQtPmxvY2tkX3ZnX3Jlc2NhbiA9IDE7CisJCWJyZWFrOworCWNhc2UgLUVTVEFSVElORzoKKwkJKmxvY2tkX3N0YXRlIHw9IExEU1RfRkFJTF9TVEFSVElORzsKKwkJY21kLT5sb2NrZF92Z19yZXNjYW4gPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqbG9ja2Rfc3RhdGUgfD0gTERTVF9GQUlMX09USEVSOworCQljbWQtPmxvY2tkX3ZnX3Jlc2NhbiA9IDE7CisJfQorCisJLyoKKwkgKiBOb3JtYWwgc3VjY2Vzcy4KKwkgKi8KKwlpZiAoIXJlc3VsdCkgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZSBWRyBoYXMgYmVlbiByZW1vdmVkLiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGggYSBkbG0gVkcKKwkgKiBzaW5jZSBhIHNhbmxvY2sgVkcgbXVzdCBiZSBzdG9wcGVkIGV2ZXJ5d2hlcmUgYmVmb3JlIGl0J3MgcmVtb3ZlZC4KKwkgKi8KKwlpZiAocmVzdWx0ID09IC1FUkVNT1ZFRCkgeworCQlsb2dfZXJyb3IoIlZHICVzIGxvY2sgZmFpbGVkOiByZW1vdmVkIiwgdmdfbmFtZSk7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGxvY2tzcGFjZSBmb3IgdGhlIFZHIGlzIHN0YXJ0aW5nICh0aGUgVkcgbXVzdCBub3QKKwkgKiBiZSBsb2NhbCksIGFuZCBpcyBub3QgeWV0IHJlYWR5IHRvIGRvIGxvY2tpbmcuICBBbGxvdworCSAqIHJlYWRpbmcgd2l0aG91dCBhIHNoIGxvY2sgZHVyaW5nIHRoaXMgcGVyaW9kLgorCSAqLworCWlmIChyZXN1bHQgPT0gLUVTVEFSVElORykgeworCQlpZiAoIXN0cmNtcChtb2RlLCAidW4iKSkgeworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgInNoIikpIHsKKwkJCWxvZ193YXJuKCJWRyAlcyBsb2NrIHNraXBwZWQ6IGxvY2sgc3RhcnQgaW4gcHJvZ3Jlc3MiLCB2Z19uYW1lKTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiVkcgJXMgbG9jayBmYWlsZWQ6IGxvY2sgc3RhcnQgaW4gcHJvZ3Jlc3MiLCB2Z19uYW1lKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogc2FubG9jayBpcyBnZXR0aW5nIGkvbyBlcnJvcnMgd2hpbGUgcmVhZGluZy93cml0aW5nIGxlYXNlcywgb3IgdGhlCisJICogbG9ja3NwYWNlL1ZHIGlzIGJlaW5nIGtpbGxlZCBhZnRlciBmYWlsaW5nIHRvIHJlbmV3IGl0cyBsZWFzZSBmb3IKKwkgKiB0b28gbG9uZy4KKwkgKi8KKwlpZiAocmVzdWx0ID09IC1FVkdLSUxMRUQgfHwgcmVzdWx0ID09IC1FTE9DS0lPKSB7CisJCWNvbnN0IGNoYXIgKnByb2JsZW0gPSAocmVzdWx0ID09IC1FTE9DS0lPID8gImVycm9ycyIgOiAiZmFpbGVkIik7CisKKwkJaWYgKCFzdHJjbXAobW9kZSwgInVuIikpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmICghc3RyY21wKG1vZGUsICJzaCIpKSB7CisJCQlsb2dfd2FybigiVkcgJXMgbG9jayBza2lwcGVkOiBzdG9yYWdlICVzIGZvciBzYW5sb2NrIGxlYXNlcyIsIHZnX25hbWUsIHByb2JsZW0pOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJWRyAlcyBsb2NrIGZhaWxlZDogc3RvcmFnZSAlcyBmb3Igc2FubG9jayBsZWFzZXMiLCB2Z19uYW1lLCBwcm9ibGVtKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogTm8gbG9ja3NwYWNlIGZvciB0aGUgVkcgd2FzIGZvdW5kLiAgSXQgbWF5IGJlIGEgbG9jYWwKKwkgKiBWRyB0aGF0IGx2bWxvY2tkIGRvZXNuJ3Qga2VlcCB0cmFjayBvZiwgb3IgaXQgbWF5IGJlCisJICogYSBsb2NrZCBWRyB0aGF0IGx2bWxvY2tkIGRvZXNuJ3QgeWV0IGtub3cgYWJvdXQgKGl0IGhhc24ndAorCSAqIGJlZW4gc3RhcnRlZCB5ZXQuKSAgRGVjaWRlIHdoYXQgdG8gZG8gYWZ0ZXIgdGhlIFZHIGlzCisJICogcmVhZCBhbmQgd2UgY2FuIHNlZSB0aGUgbG9ja190eXBlLgorCSAqLworCWlmIChyZXN1bHQgPT0gLUVOT0xTKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQW5vdGhlciBlcnJvci4gIFdlIGRvbid0IGludGVuZCB0byByZWFjaCBoZXJlLCBidXQKKwkgKiB3YW50IHRvIGNoZWNrIGZvciBlYWNoIHNwZWNpZmljIGVycm9yIGFib3ZlIHNvIHRoYXQKKwkgKiBhIGhlbHBmdWwgbWVzc2FnZSBjYW4gYmUgcHJpbnRlZC4KKwkgKi8KKwlpZiAocmVzdWx0KSB7CisJCWlmICghc3RyY21wKG1vZGUsICJ1biIpKSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAic2giKSkgeworCQkJbG9nX3dhcm4oIlZHICVzIGxvY2sgc2tpcHBlZDogZXJyb3IgJWQiLCB2Z19uYW1lLCByZXN1bHQpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJWRyAlcyBsb2NrIGZhaWxlZDogZXJyb3IgJWQiLCB2Z19uYW1lLCByZXN1bHQpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJLyoKKwkgKiBBIG5vdGljZSBmcm9tIGx2bWxvY2tkIHRoYXQgZHVwbGljYXRlIGdsIGxvY2tzIGhhdmUgYmVlbiBmb3VuZC4KKwkgKiBJdCB3b3VsZCBiZSBnb29kIGZvciB0aGUgdXNlciB0byBkaXNhYmxlIG9uZSBvZiB0aGVtLgorCSAqLworCWlmICgobG9ja2RfZmxhZ3MgJiBMRF9SRl9EVVBfR0xfTFMpICYmIHN0cmNtcChtb2RlLCAidW4iKSkKKwkJbG9nX3dhcm4oIkR1cGxpY2F0ZSBzYW5sb2NrIGdsb2JhbCBsb2NrIGluIFZHICVzIiwgdmdfbmFtZSk7CisgCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGEgbmV3IHZlcnNpb24gb2YgdGhlIFZHIG1ldGFkYXRhIGlzCisgKiB3cml0dGVuIHRvIGRpc2suICBGb3IgbG9jYWwgVkdzLCB0aGlzIGlzIGEgbm8tb3AsIGJ1dCBmb3IgbG9ja2QKKyAqIFZHcywgdGhpcyBub3RpZmllcyBsdm1sb2NrZCBvZiB0aGUgbmV3IFZHIHNlcW5vLiAgbHZtbG9ja2QgbXVzdAorICoga25vdyB0aGUgbGF0ZXN0IFZHIHNlcW5vIHNvIHRoYXQgaXQgY2FuIHNhdmUgaXQgd2l0aGluIHRoZSBsb2NrJ3MKKyAqIExWQi4gIFRoZSBWRyBzZXFubyBpbiB0aGUgVkcgbG9jaydzIExWQiBpcyB1c2VkIGJ5IG90aGVyIGhvc3RzIHRvCisgKiBkZXRlY3Qgd2hlbiB0aGVpciBjYWNoZWQgY29weSBvZiB0aGUgVkcgbWV0YWRhdGEgaXMgc3RhbGUsIGkuZS4KKyAqIHRoZSBjYWNoZWQgVkcgbWV0YWRhdGEgaGFzIGEgbG93ZXIgc2Vxbm8gdGhhbiB0aGUgc2Vxbm8gc2VlbiBpbgorICogdGhlIFZHIGxvY2suCisgKi8KKworaW50IGxvY2tkX3ZnX3VwZGF0ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKQorCQlyZXR1cm4gMTsKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiAwOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXBseSA9IF9sb2NrZF9zZW5kKCJ2Z191cGRhdGUiLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCQkidmVyc2lvbiA9ICIgRk1UZDY0LCAoaW50NjRfdCkgdmctPnNlcW5vLAorCQkJCU5VTEwpOworCisJaWYgKCFfbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0LCBOVUxMKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IChyZXN1bHQgPCAwKSA/IDAgOiAxOworCX0KKworCWRhZW1vbl9yZXBseV9kZXN0cm95KHJlcGx5KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV2hlbiB0aGlzIGlzIGNhbGxlZCBkaXJlY3RseSAoYXMgb3Bwb3NlZCB0byBiZWluZyBjYWxsZWQgZnJvbQorICogbG9ja2RfbHYpLCB0aGUgY2FsbGVyIGtub3dzIHRoYXQgdGhlIExWIGhhcyBhIGxvY2suCisgKi8KKworaW50IGxvY2tkX2x2X25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgIGNvbnN0IGNoYXIgKmx2X25hbWUsIHN0cnVjdCBpZCAqbHZfaWQsCisJCSAgY29uc3QgY2hhciAqbG9ja19hcmdzLCBjb25zdCBjaGFyICpkZWZfbW9kZSwgdWludDMyX3QgZmxhZ3MpCit7CisJY2hhciBsdl91dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY29uc3QgY2hhciAqbW9kZSA9IE5VTEw7CisJY29uc3QgY2hhciAqb3B0cyA9IE5VTEw7CisJdWludDMyX3QgbG9ja2RfZmxhZ3M7CisJaW50IHJlZnJlc2hlZCA9IDA7CisJaW50IHJlc3VsdDsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgd2hlbiAtLXJlYWRvbmx5IGlzIHVzZWQsIG5vIExWcyBzaG91bGQgYmUgYWN0aXZhdGVkIG9yIHVzZWQuCisJICovCisJaWYgKGNtZC0+bWV0YWRhdGFfcmVhZF9vbmx5KSB7CisJCWxvZ19lcnJvcigiTFYgbG9ja3MgYXJlIG5vdCBhbGxvd2VkIHdpdGggcmVhZG9ubHkgb3B0aW9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY21kLT5sb2NrZF9sdl9kaXNhYmxlKQorCQlyZXR1cm4gMTsKKworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDA7CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCWlmICghaWRfd3JpdGVfZm9ybWF0KGx2X2lkLCBsdl91dWlkLCBzaXplb2YobHZfdXVpZCkpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogRm9yIGx2Y2hhbmdlL3ZnY2hhbmdlIGFjdGl2YXRpb24sIGRlZl9tb2RlIGlzICJzaCIgb3IgImV4IgorCSAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgLWF7ZSxzfXkgbW9kZSBkZXNpZ25hdGlvbi4KKwkgKiBObyBlLHMgZGVzaWduYXRpb24gZ2l2ZXMgTlVMTCBkZWZfbW9kZS4KKwkgKi8KKworCWlmIChkZWZfbW9kZSkKKwkJbW9kZSA9IGRlZl9tb2RlOworCisJaWYgKG1vZGUgJiYgIXN0cmNtcChtb2RlLCAic2giKSAmJiAoZmxhZ3MgJiBMRExWX01PREVfTk9fU0gpKSB7CisJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBmaW5kX2x2KHZnLCBsdl9uYW1lKTsKKwkJbG9nX2Vycm9yKCJTaGFyZWQgYWN0aXZhdGlvbiBub3QgY29tcGF0aWJsZSB3aXRoIExWIHR5cGUgJXMgb2YgJXMvJXMiLAorCQkJICBsdiA/IGx2c2VnX25hbWUoZmlyc3Rfc2VnKGx2KSkgOiAiIiwgdmctPm5hbWUsIGx2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIW1vZGUpCisJCW1vZGUgPSAiZXgiOworCisJaWYgKGZsYWdzICYgTERMVl9QRVJTSVNURU5UKQorCQlvcHRzID0gInBlcnNpc3RlbnQiOworCisgcmV0cnk6CisJbG9nX2RlYnVnKCJsb2NrZCBMViAlcy8lcyBtb2RlICVzIHV1aWQgJXMiLCB2Zy0+bmFtZSwgbHZfbmFtZSwgbW9kZSwgbHZfdXVpZCk7CisKKwlpZiAoIV9sb2NrZF9yZXF1ZXN0KGNtZCwgImxvY2tfbHYiLAorCQkJICAgICAgIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlLCB2Zy0+bG9ja19hcmdzLAorCQkJICAgICAgIGx2X25hbWUsIGx2X3V1aWQsIGxvY2tfYXJncywgbW9kZSwgb3B0cywKKwkJCSAgICAgICAmcmVzdWx0LCAmbG9ja2RfZmxhZ3MpKSB7CisJCS8qIE5vIHJlc3VsdCBmcm9tIGx2bWxvY2tkLCBpdCBpcyBwcm9iYWJseSBub3QgcnVubmluZy4gKi8KKwkJbG9nX2Vycm9yKCJMb2NraW5nIGZhaWxlZCBmb3IgTFYgJXMvJXMiLCB2Zy0+bmFtZSwgbHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoZSBsdiB3YXMgbm90IGFjdGl2ZS9sb2NrZWQuICovCisJaWYgKHJlc3VsdCA9PSAtRU5PRU5UICYmICFzdHJjbXAobW9kZSwgInVuIikpCisJCXJldHVybiAxOworCisJaWYgKHJlc3VsdCA9PSAtRUFMUkVBRFkpCisJCXJldHVybiAxOworCisJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisJCWxvZ19lcnJvcigiTFYgbG9ja2VkIGJ5IG90aGVyIGhvc3Q6ICVzLyVzIiwgdmctPm5hbWUsIGx2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVzdWx0ID09IC1FRVhJU1QpIHsKKwkJLyoKKwkJICogVGhpcyBoYXBwZW5zIGlmIGx2Y2hhbmdlIHRyaWVzIHRvIG1vZGlmeSB0aGUgTFYgd2l0aCBhbiBleAorCQkgKiBMViBsb2NrIHdoZW4gdGhlIExWIGlzIGFscmVhZHkgYWN0aXZlIHdpdGggYSBzaCBMViBsb2NrLgorCQkgKi8KKwkJbG9nX2Vycm9yKCJMViBpcyBhbHJlYWR5IGxvY2tlZCB3aXRoIGluY29tcGF0aWJsZSBtb2RlOiAlcy8lcyIsIHZnLT5uYW1lLCBsdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlc3VsdCA9PSAtRU1TR1NJWkUpIHsKKwkJLyogQW5vdGhlciBob3N0IHByb2JhYmx5IGV4dGVuZGVkIGx2bWxvY2suICovCisJCWlmICghcmVmcmVzaGVkKyspIHsKKwkJCWxvZ19kZWJ1ZygiUmVmcmVzaCBsdm1sb2NrIik7CisJCSAgICAgICAJX3JlZnJlc2hfc2FubG9ja19sdihjbWQsIHZnKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwlpZiAocmVzdWx0ID09IC1FTk9MUykgeworCQlsb2dfZXJyb3IoIkxWICVzLyVzIGxvY2sgZmFpbGVkOiBsb2Nrc3BhY2UgaXMgaW5hY3RpdmUiLCB2Zy0+bmFtZSwgbHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQgPT0gLUVWR0tJTExFRCB8fCByZXN1bHQgPT0gLUVMT0NLSU8pIHsKKwkJY29uc3QgY2hhciAqcHJvYmxlbSA9IChyZXN1bHQgPT0gLUVMT0NLSU8gPyAiZXJyb3JzIiA6ICJmYWlsZWQiKTsKKwkJbG9nX2Vycm9yKCJMViAlcy8lcyBsb2NrIGZhaWxlZDogc3RvcmFnZSAlcyBmb3Igc2FubG9jayBsZWFzZXMiLCB2Zy0+bmFtZSwgbHZfbmFtZSwgcHJvYmxlbSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQgPCAwKSB7CisJCWxvZ19lcnJvcigiTFYgJXMvJXMgbG9jayBmYWlsZWQ6IGVycm9yICVkIiwgdmctPm5hbWUsIGx2X25hbWUsIHJlc3VsdCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogRGlyZWN0IHRoZSBsb2NrIHJlcXVlc3QgdG8gdGhlIHBvb2wgTFYuCisgKiBGb3IgYSB0aGluIHBvb2wgYW5kIGFsbCBpdHMgdGhpbiB2b2x1bWVzLCBvbmUgZXggbG9jayBpcyB1c2VkLgorICogSXQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4gbWV0YWRhdGEgb2YgdGhlIHBvb2wgZGF0YSBsdi4KKyAqLworCitzdGF0aWMgaW50IF9sb2NrZF9sdl90aGluKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICBjb25zdCBjaGFyICpkZWZfbW9kZSwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2OworCisJaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSkgeworCQlzdHJ1Y3QgbHZfc2VnbWVudCAqcG9vbF9zZWcgPSBmaXJzdF9zZWcobHYpOworCQlwb29sX2x2ID0gcG9vbF9zZWcgPyBwb29sX3NlZy0+cG9vbF9sdiA6IE5VTEw7CisKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJcG9vbF9sdiA9IGx2OworCisJfSBlbHNlIHsKKwkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBBRkFJSy4gKi8KKwkJbG9nX2Vycm9yKCJMb2NrIG9uIGluY29ycmVjdCB0aGluIGx2IHR5cGUgJXMvJXMiLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwb29sX2x2KSB7CisJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICovCisJCWxvZ19lcnJvcigiQ2Fubm90IGZpbmQgdGhpbiBwb29sIGZvciAlcy8lcyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIExvY2tpbmcgYSBsb2NrZWQgbHYgKHBvb2wgaW4gdGhpcyBjYXNlKSBpcyBhIG5vLW9wLgorCSAqIFVubG9jayB3aGVuIHRoZSBwb29sIGlzIG5vIGxvbmdlciBhY3RpdmUuCisJICovCisKKwlpZiAoZGVmX21vZGUgJiYgIXN0cmNtcChkZWZfbW9kZSwgInVuIikgJiYgcG9vbF9pc19hY3RpdmUocG9vbF9sdikpCisJCXJldHVybiAxOworCisJZmxhZ3MgfD0gTERMVl9NT0RFX05PX1NIOworCisJcmV0dXJuIGxvY2tkX2x2X25hbWUoY21kLCBwb29sX2x2LT52ZywgcG9vbF9sdi0+bmFtZSwgJnBvb2xfbHYtPmx2aWQuaWRbMV0sCisJCQkgICAgIHBvb2xfbHYtPmxvY2tfYXJncywgZGVmX21vZGUsIGZsYWdzKTsKK30KKworLyoKKyAqIElmIHRoZSBWRyBoYXMgbm8gbG9ja190eXBlLCB0aGVuIHRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBpbW1lZGlhdGVseS4KKyAqIFRoZSBMViBpdHNlbGYgbWF5IGhhdmUgbm8gbG9jayAoTlVMTCBsdi0+bG9ja19hcmdzKSwgYnV0IHRoZSBsb2NrIHJlcXVlc3QKKyAqIG1heSBiZSBkaXJlY3RlZCB0byBhbm90aGVyIGxvY2ssIGUuZy4gdGhlIHBvb2wgTFYgbG9jayBpbiBfbG9ja2RfbHZfdGhpbi4KKyAqIElmIHRoZSBsb2NrIHJlcXVlc3QgaXMgbm90IGRpcmVjdGVkIHRvIGFub3RoZXIgTFYsIGFuZCB0aGUgTFYgaGFzIG5vCisgKiBsb2NrX3R5cGUgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSBMViBoYXMgbm8gbG9jaywgYW5kIG5vIGxvY2tpbmcgaXMgZG9uZQorICogZm9yIGl0LgorICoKKyAqIEFuIExWIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIHRoZSBMViBpcyBhY3RpdmF0ZWQsIGFuZCByZWxlYXNlZAorICogYWZ0ZXIgdGhlIExWIGlzIGRlYWN0aXZhdGVkLiAgSWYgdGhlIExWIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLAorICogaXQgbWVhbnMgdGhhdCB0aGUgTFYgaXMgYWN0aXZlIG9uIGFub3RoZXIgaG9zdCBhbmQgdGhlIGFjdGl2YXRpb24KKyAqIGZhaWxzLiAgQ29tbWFuZHMgdGhhdCBtb2RpZnkgYW4gaW5hY3RpdmUgTFYgYWxzbyBhY3F1aXJlIHRoZSBMViBsb2NrLgorICoKKyAqIEluIG5vbi1sb2NrZCBWR3MsIHRoaXMgaXMgYSBuby1vcC4KKyAqCisgKiBJbiBsb2NrZCBWR3MsIG5vcm1hbCBMVnMgZWFjaCBoYXZlIHRoZWlyIG93biBsb2NrLCBidXQgb3RoZXIKKyAqIExWcyBkbyBub3QgaGF2ZSB0aGVpciBvd24gbG9jaywgZS5nLiB0aGUgbG9jayBmb3IgYSB0aGluIExWIGlzCisgKiBhY3F1aXJlZCBvbiB0aGUgdGhpbiBwb29sIExWLCBhbmQgYSB0aGluIExWIGRvZXMgbm90IGhhdmUgYSBsb2NrCisgKiBvZiBpdHMgb3duLiAgQSBjYWNoZSBwb29sIExWIGRvZXMgbm90IGhhdmUgYSBsb2NrIG9mIGl0cyBvd24uCisgKiBXaGVuIHRoZSBjYWNoZSBwb29sIExWIGlzIGxpbmtlZCB0byBhbiBvcmlnaW4gTFYsIHRoZSBsb2NrIG9mCisgKiB0aGUgb3JnaW4gTFYgcHJvdGVjdHMgdGhlIGNvbWJpbmVkIG9yaWdpbiArIGNhY2hlIHBvb2wuCisgKi8KKworaW50IGxvY2tkX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCSAgICAgY29uc3QgY2hhciAqZGVmX21vZGUsIHVpbnQzMl90IGZsYWdzKQoreworCWlmICghaXNfbG9ja2RfdHlwZShsdi0+dmctPmxvY2tfdHlwZSkpCisJCXJldHVybiAxOworCisJaWYgKCFfdXNlX2x2bWxvY2tkKSB7CisJCWxvZ19lcnJvcigiTFYgaW4gVkcgJXMgd2l0aCBsb2NrX3R5cGUgJXMgcmVxdWlyZXMgbHZtbG9ja2QuIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+dmctPmxvY2tfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHZfaXNfdGhpbl90eXBlKGx2KSkKKwkJcmV0dXJuIF9sb2NrZF9sdl90aGluKGNtZCwgbHYsIGRlZl9tb2RlLCBmbGFncyk7CisKKwkvKgorCSAqIEFuIExWIHdpdGggTlVMTCBsb2NrX2FyZ3MgZG9lcyBub3QgaGF2ZSBhIGxvY2sgb2YgaXRzIG93bi4KKwkgKi8KKwlpZiAoIWx2LT5sb2NrX2FyZ3MpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBMViB0eXBlIGNhbm5vdCBiZSBhY3RpdmUgY29uY3VycmVudGx5IG9uIG11bHRpcGxlIGhvc3RzLAorCSAqIHNvIHNoYXJlZCBtb2RlIGFjdGl2YXRpb24gaXMgbm90IGFsbG93ZWQuCisJICovCisJaWYgKGx2X2lzX2V4dGVybmFsX29yaWdpbihsdikgfHwKKwkgICAgbHZfaXNfdGhpbl90eXBlKGx2KSB8fAorCSAgICBsdl9pc19taXJyb3JfdHlwZShsdikgfHwKKwkgICAgbHZfaXNfcmFpZF90eXBlKGx2KSB8fAorCSAgICBsdl9pc19jYWNoZV90eXBlKGx2KSkgeworCQlmbGFncyB8PSBMRExWX01PREVfTk9fU0g7CisJfQorCisJcmV0dXJuIGxvY2tkX2x2X25hbWUoY21kLCBsdi0+dmcsIGx2LT5uYW1lLCAmbHYtPmx2aWQuaWRbMV0sCisJCQkgICAgIGx2LT5sb2NrX2FyZ3MsIGRlZl9tb2RlLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX2luaXRfbHZfc2FubG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgY29uc3QgY2hhciAqbHZfbmFtZSwgc3RydWN0IGlkICpsdl9pZCwKKwkJCSAgICBjb25zdCBjaGFyICoqbG9ja19hcmdzX3JldCkKK3sKKwljaGFyIGx2X3V1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJY29uc3QgY2hhciAqcmVwbHlfc3RyOworCWNvbnN0IGNoYXIgKmx2X2xvY2tfYXJncyA9IE5VTEw7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMDsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJaWYgKCFpZF93cml0ZV9mb3JtYXQobHZfaWQsIGx2X3V1aWQsIHNpemVvZihsdl91dWlkKSkpCisJCXJldHVybl8wOworCisJcmVwbHkgPSBfbG9ja2Rfc2VuZCgiaW5pdF9sdiIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJCSJsdl9uYW1lID0gJXMiLCBsdl9uYW1lLAorCQkJCSJsdl91dWlkID0gJXMiLCBsdl91dWlkLAorCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsICJzYW5sb2NrIiwKKwkJCQkidmdfbG9ja19hcmdzID0gJXMiLCB2Zy0+bG9ja19hcmdzLAorCQkJCU5VTEwpOworCisJaWYgKCFfbG9ja2RfcmVzdWx0KHJlcGx5LCAmcmVzdWx0LCBOVUxMKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IChyZXN1bHQgPCAwKSA/IDAgOiAxOworCX0KKworCWlmIChyZXN1bHQgPT0gLUVFWElTVCkgeworCQlsb2dfZXJyb3IoIkxvY2sgYWxyZWFkeSBleGlzdHMgZm9yIExWICVzLyVzIiwgdmctPm5hbWUsIGx2X25hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmVzdWx0ID09IC1FTVNHU0laRSkgeworCQkvKgorCQkgKiBObyBzcGFjZSBvbiB0aGUgbHZtbG9jayBsdiBmb3IgYSBuZXcgbGVhc2UsIHRoaXMgc2hvdWxkIGJlCisJCSAqIGRldGVjdGVkIGJ5IGhhbmRsZV9zYW5sb2NrX2x2KCkgY2FsbGVkIGJlZm9yZS4KKwkJICovCisJCWxvZ19lcnJvcigiTm8gc2FubG9jayBzcGFjZSBmb3IgbG9jayBmb3IgTFYgJXMvJXMiLCB2Zy0+bmFtZSwgbHZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcmV0KSB7CisJCWxvZ19lcnJvcigiX2luaXRfbHZfc2FubG9jayBsdm1sb2NrZCByZXN1bHQgJWQiLCByZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShyZXBseV9zdHIgPSBkYWVtb25fcmVwbHlfc3RyKHJlcGx5LCAibHZfbG9ja19hcmdzIiwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigibHZfbG9ja19hcmdzIG5vdCByZXR1cm5lZCIpOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShsdl9sb2NrX2FyZ3MgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgcmVwbHlfc3RyKSkpIHsKKwkJbG9nX2Vycm9yKCJsdl9sb2NrX2FyZ3MgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0ID0gMDsKKwl9CitvdXQ6CisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJKmxvY2tfYXJnc19yZXQgPSBsdl9sb2NrX2FyZ3M7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfZnJlZV9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICBjb25zdCBjaGFyICpsdl9uYW1lLCBzdHJ1Y3QgaWQgKmx2X2lkLCBjb25zdCBjaGFyICpsb2NrX2FyZ3MpCit7CisJY2hhciBsdl91dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJZGFlbW9uX3JlcGx5IHJlcGx5OworCWludCByZXN1bHQ7CisJaW50IHJldDsKKworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDA7CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCWlmICghaWRfd3JpdGVfZm9ybWF0KGx2X2lkLCBsdl91dWlkLCBzaXplb2YobHZfdXVpZCkpKQorCQlyZXR1cm5fMDsKKworCXJlcGx5ID0gX2xvY2tkX3NlbmQoImZyZWVfbHYiLAorCQkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCQkibHZfbmFtZSA9ICVzIiwgbHZfbmFtZSwKKwkJCQkibHZfdXVpZCA9ICVzIiwgbHZfdXVpZCwKKwkJCQkidmdfbG9ja190eXBlID0gJXMiLCB2Zy0+bG9ja190eXBlLAorCQkJCSJ2Z19sb2NrX2FyZ3MgPSAlcyIsIHZnLT5sb2NrX2FyZ3MsCisJCQkJImx2X2xvY2tfYXJncyA9ICVzIiwgbG9ja19hcmdzID86ICJub25lIiwKKwkJCQlOVUxMKTsKKworCWlmICghX2xvY2tkX3Jlc3VsdChyZXBseSwgJnJlc3VsdCwgTlVMTCkpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAocmVzdWx0IDwgMCkgPyAwIDogMTsKKwl9CisKKwlpZiAoIXJldCkKKwkJbG9nX2Vycm9yKCJfZnJlZV9sdiBsdm1sb2NrZCByZXN1bHQgJWQiLCByZXN1bHQpOworCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGxvY2tkX2luaXRfbHZfYXJncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICAgY29uc3QgY2hhciAqbG9ja190eXBlLCBjb25zdCBjaGFyICoqbG9ja19hcmdzKQoreworCS8qIHNhbmxvY2sgaXMgdGhlIG9ubHkgbG9jayB0eXBlIHRoYXQgc2V0cyBwZXItTFYgbG9ja19hcmdzLiAqLworCWlmICghc3RyY21wKGxvY2tfdHlwZSwgInNhbmxvY2siKSkKKwkJcmV0dXJuIF9pbml0X2x2X3NhbmxvY2soY21kLCB2ZywgbHYtPm5hbWUsICZsdi0+bHZpZC5pZFsxXSwgbG9ja19hcmdzKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGx2Y3JlYXRlCisgKgorICogQW4gTFYgY3JlYXRlZCBpbiBhIGxvY2tkIFZHIGluaGVyaXRzIHRoZSBsb2NrX3R5cGUgb2YgdGhlIFZHLiAgSW4gc29tZQorICogY2FzZXMsIGUuZy4gdGhpbiBMVnMsIHRoaXMgZnVuY3Rpb24gbWF5IGRlY2lkZSB0aGF0IHRoZSBMViBzaG91bGQgbm90IGJlCisgKiBnaXZlbiBhIGxvY2ssIGluIHdoaWNoIGNhc2UgaXQgc2V0cyBscCBsb2NrX2FyZ3MgdG8gTlVMTCwgd2hpY2ggd2lsbCBjYXVzZQorICogdGhlIExWIHRvIG5vdCBoYXZlIGxvY2tfYXJncyBzZXQgaW4gaXRzIG1ldGFkYXRhLiAgQSBsb2NrZF9sdigpIHJlcXVlc3Qgb24KKyAqIGFuIExWIHdpdGggbm8gbG9ja19hcmdzIHdpbGwgZG8gbm90aGluZyAodW5sZXNzIHRoZSBMViB0eXBlIGNhdXNlcyB0aGUgbG9jaworICogcmVxdWVzdCB0byBiZSBkaXJlY3RlZCB0byBhbm90aGVyIExWIHdpdGggYSBsb2NrLCBlLmcuIHRvIHRoZSB0aGluIHBvb2wgTFYKKyAqIGZvciB0aGluIExWcy4pCisgKgorICogQ3VycmVudCBsaW1pdGF0aW9uczoKKyAqIC0gY2FjaGUtdHlwZSBMVidzIGluIGEgbG9ja2QgVkcgbXVzdCBiZSBjcmVhdGVkIHdpdGggbHZjb252ZXJ0LgorICogLSBjcmVhdGluZyBhIHRoaW4gcG9vbCBhbmQgdGhpbiBsdiBpbiBvbmUgY29tbWFuZCBpcyBub3QgYWxsb3dlZC4KKyAqLworCitpbnQgbG9ja2RfaW5pdF9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHApCit7CisJaW50IGxvY2tfdHlwZV9udW0gPSBnZXRfbG9ja190eXBlX2Zyb21fc3RyaW5nKHZnLT5sb2NrX3R5cGUpOworCisJc3dpdGNoIChsb2NrX3R5cGVfbnVtKSB7CisJY2FzZSBMT0NLX1RZUEVfTk9ORToKKwljYXNlIExPQ0tfVFlQRV9DTFZNOgorCQlyZXR1cm4gMTsKKwljYXNlIExPQ0tfVFlQRV9TQU5MT0NLOgorCWNhc2UgTE9DS19UWVBFX0RMTToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKCJsb2NrZF9pbml0X2x2OiB1bmtub3duIGxvY2tfdHlwZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfdXNlX2x2bWxvY2tkKQorCQlyZXR1cm4gMDsKKwlpZiAoIV9sdm1sb2NrZF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCisJaWYgKCFscC0+bmVlZHNfbG9ja2RfaW5pdCkgeworCQkvKiBuZWVkc19sb2NrX2luaXQgaXMgc2V0IGZvciBMVnMgdGhhdCBuZWVkIGEgbG9ja2QgbG9jay4gKi8KKwkJcmV0dXJuIDE7CisKKwl9IGVsc2UgaWYgKHNlZ19pc19jYWNoZShscCkgfHwgc2VnX2lzX2NhY2hlX3Bvb2wobHApKSB7CisJCWxvZ19lcnJvcigiVXNlIGx2Y29udmVydCBmb3IgY2FjaGUgd2l0aCBsb2NrIHR5cGUgJXMiLCB2Zy0+bG9ja190eXBlKTsKKwkJcmV0dXJuIDA7CisKKwl9IGVsc2UgaWYgKCFzZWdfaXNfdGhpbl92b2x1bWUobHApICYmIGxwLT5zbmFwc2hvdCkgeworCQlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbl9sdjsKKworCQkvKgorCQkgKiBDT1cgc25hcHNob3RzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlaXIgb3JpZ2luIExWLAorCQkgKiBhbmQgb25seSB0aGUgb3JpZ2luIExWIG5lZWRzIGl0cyBvd24gbG9jaywgd2hpY2gKKwkJICogcmVwcmVzZW50cyBpdHNlbGYgYW5kIGFsbCBhc3NvY2lhdGVkIGNvdyBzbmFwc2hvdHMuCisJCSAqLworCisJCWlmICghbHAtPm9yaWdpbl9uYW1lKSB7CisJCQkvKiBTcGFyc2UgTFYgY2FzZS4gV2UgcmVxdWlyZSBhIGxvY2sgZnJvbSB0aGUgb3JpZ2luIExWLiAqLworCQkJbG9nX2Vycm9yKCJDYW5ub3QgY3JlYXRlIHNuYXBzaG90IHdpdGhvdXQgb3JpZ2luIExWIGluIHNoYXJlZCBWRy4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCEob3JpZ2luX2x2ID0gZmluZF9sdih2ZywgbHAtPm9yaWdpbl9uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgb3JpZ2luIExWICVzLyVzIiwgdmctPm5hbWUsIGxwLT5vcmlnaW5fbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWxvY2tkX2x2KGNtZCwgb3JpZ2luX2x2LCAiZXgiLCBMRExWX1BFUlNJU1RFTlQpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBsb2NrIG9yaWdpbiBMViAlcy8lcyIsIHZnLT5uYW1lLCBscC0+b3JpZ2luX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHYtPmxvY2tfYXJncyA9IE5VTEw7CisJCXJldHVybiAxOworCisJfSBlbHNlIGlmIChzZWdfaXNfdGhpbihscCkpIHsKKwkJaWYgKChzZWdfaXNfdGhpbl92b2x1bWUobHApICYmICFscC0+Y3JlYXRlX3Bvb2wpIHx8CisJCSAgICAoIXNlZ19pc190aGluX3ZvbHVtZShscCkgJiYgbHAtPnNuYXBzaG90KSkgeworCQkJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCQkJLyoKKwkJCSAqIENyZWF0aW5nIGEgbmV3IHRoaW4gbHYgb3Igc25hcHNob3QuICBUaGVzZSBsdnMgZG8gbm90IGdldAorCQkJICogdGhlaXIgb3duIGxvY2sgYnV0IHVzZSB0aGUgcG9vbCBsb2NrLiAgSWYgYW4gbHYgZG9lcyBub3QKKwkJCSAqIHVzZSBpdHMgb3duIGxvY2ssIGl0cyBsb2NrX2FyZ3MgaXMgc2V0IHRvIE5VTEwuCisJCQkgKi8KKworCQkJaWYgKCEobHZsID0gZmluZF9sdl9pbl92Zyh2ZywgbHAtPnBvb2xfbmFtZSkpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCB0aGluIHBvb2wgJXMvJXMiLCB2Zy0+bmFtZSwgbHAtPnBvb2xfbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIWxvY2tkX2x2KGNtZCwgbHZsLT5sdiwgImV4IiwgTERMVl9QRVJTSVNURU5UKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGxvY2sgdGhpbiBwb29sICVzLyVzIiwgdmctPm5hbWUsIGxwLT5wb29sX25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHYtPmxvY2tfYXJncyA9IE5VTEw7CisJCQlyZXR1cm4gMTsKKworCQl9IGVsc2UgaWYgKHNlZ19pc190aGluX3ZvbHVtZShscCkgJiYgbHAtPmNyZWF0ZV9wb29sKSB7CisJCQkvKgorCQkJICogQ3JlYXRpbmcgYSB0aGluIHBvb2wgYW5kIGEgdGhpbiBsdiBpbiBpdC4gIFdlIGNvdWxkCisJCQkgKiBwcm9iYWJseSBtYWtlIHRoaXMgd29yay4KKwkJCSAqLworCQkJbG9nX2Vycm9yKCJDcmVhdGUgdGhpbiBwb29sIGFuZCB0aGluIExWIHNlcGFyYXRlbHkgd2l0aCBsb2NrIHR5cGUgJXMiLAorCQkJCSAgdmctPmxvY2tfdHlwZSk7CisJCQlyZXR1cm4gMDsKKworCQl9IGVsc2UgaWYgKCFzZWdfaXNfdGhpbl92b2x1bWUobHApICYmIGxwLT5jcmVhdGVfcG9vbCkgeworCQkJLyogQ3JlYXRpbmcgYSB0aGluIHBvb2wgb25seS4gKi8KKwkJCS8qIGx2X25hbWVfbG9jayA9IGxwLT5wb29sX25hbWU7ICovCisKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiVW5rbm93biB0aGluIG9wdGlvbnMgZm9yIGxvY2sgaW5pdC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9IGVsc2UgeworCQkvKiBDcmVhdGluZyBhIG5vcm1hbCBsdi4gKi8KKwkJLyogbHZfbmFtZV9sb2NrID0gbHZfbmFtZTsgKi8KKwl9CisKKwkvKgorCSAqIFRoZSBMViBnZXRzIGl0cyBvd24gbG9jaywgc28gc2V0IGxvY2tfYXJncyB0byBub24tTlVMTC4KKwkgKgorCSAqIGxvY2tkX2luaXRfbHZfYXJncygpIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB2Z193cml0ZSgpCisJICogdG8gY29tcGxldGUgdGhlIHNhbmxvY2sgTFYgbG9jayBpbml0aWFsaXphdGlvbiwgd2hlcmUKKwkgKiBhY3R1YWwgc3BhY2Ugb24gZGlzayBpcyBhbGxvY2F0ZWQuICBXYWl0aW5nIHRvIGRvIHRoaXMKKwkgKiBsYXN0IHN0ZXAgdW50aWwgdmdfd3JpdGUoKSBhdm9pZHMgdGhlIG5lZWQgdG8gcmV2ZXJ0CisJICogdGhlIHNhbmxvY2sgYWxsb2NhdGlvbiBpZiB0aGUgbHZjcmVhdGUgZnVuY3Rpb24gaXNuJ3QKKwkgKiBjb21wbGV0ZWQuCisJICoKKwkgKiBUaGlzIHdvcmtzLCBidXQgd291bGQgbGVhdmUgdGhlIHNhbmxvY2sgbGVhc2UgYWxsb2NhdGVkCisJICogdW5sZXNzIHRoZSBsZWFzZSB3YXMgZnJlZWQgb24gZWFjaCBlYXJseSBleGl0IHBhdGggZnJvbQorCSAqIGx2Y3JlYXRlOgorCSAqCisJICogcmV0dXJuIGxvY2tkX2luaXRfbHZfYXJncyhjbWQsIHZnLCBsdl9uYW1lX2xvY2ssIGx2X2lkLAorCSAqIAkJCSAgICAgdmctPmxvY2tfdHlwZSwgJmx2LT5sb2NrX2FyZ3MpOworCSAqLworCisJaWYgKCFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkKKwkJbHYtPmxvY2tfYXJncyA9ICJwZW5kaW5nIjsKKwllbHNlIGlmICghc3RyY21wKHZnLT5sb2NrX3R5cGUsICJkbG0iKSkKKwkJbHYtPmxvY2tfYXJncyA9ICJkbG0iOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGx2cmVtb3ZlICovCisKK2ludCBsb2NrZF9mcmVlX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICBjb25zdCBjaGFyICpsdl9uYW1lLCBzdHJ1Y3QgaWQgKmx2X2lkLCBjb25zdCBjaGFyICpsb2NrX2FyZ3MpCit7CisJc3dpdGNoIChnZXRfbG9ja190eXBlX2Zyb21fc3RyaW5nKHZnLT5sb2NrX3R5cGUpKSB7CisJY2FzZSBMT0NLX1RZUEVfTk9ORToKKwljYXNlIExPQ0tfVFlQRV9DTFZNOgorCQlyZXR1cm4gMTsKKwljYXNlIExPQ0tfVFlQRV9ETE06CisJY2FzZSBMT0NLX1RZUEVfU0FOTE9DSzoKKwkJaWYgKCFsb2NrX2FyZ3MpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIF9mcmVlX2x2KGNtZCwgdmcsIGx2X25hbWUsIGx2X2lkLCBsb2NrX2FyZ3MpOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigibG9ja2RfZnJlZV9sdjogdW5rbm93biBsb2NrX3R5cGUuIik7CisJCXJldHVybiAwOworCX0KK30KKworaW50IGxvY2tkX3JlbmFtZV92Z19iZWZvcmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWRhZW1vbl9yZXBseSByZXBseTsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAoIWlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpCisJCXJldHVybiAxOworCWlmICghX3VzZV9sdm1sb2NrZCkKKwkJcmV0dXJuIDA7CisJaWYgKCFfbHZtbG9ja2RfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCWlmIChsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQlsb2dfZXJyb3IoIkxWcyBtdXN0IGJlIGluYWN0aXZlIGJlZm9yZSB2Z3JlbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgdGhhdCBubyBMVnMgYXJlIGFjdGl2ZSBvbiBvdGhlciBob3N0cy4gKi8KKwlpZiAoIV9sb2NrZF9hbGxfbHZzKGNtZCwgdmcpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlbmFtZSBWRyAlcyB3aXRoIGFjdGl2ZSBMVnMiLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogbHZtbG9ja2Q6CisJICogY2hlY2tzIGZvciBvdGhlciBob3N0cyBpbiBsb2Nrc3BhY2UKKwkgKiBsZWF2ZXMgdGhlIGxvY2tzcGFjZQorCSAqLworCisJcmVwbHkgPSBfbG9ja2Rfc2VuZCgicmVuYW1lX3ZnX2JlZm9yZSIsCisJCQkicGlkID0gIiBGTVRkNjQsIChpbnQ2NF90KSBnZXRwaWQoKSwKKwkJCSJ2Z19uYW1lID0gJXMiLCB2Zy0+bmFtZSwKKwkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnLT5sb2NrX3R5cGUsCisJCQkidmdfbG9ja19hcmdzID0gJXMiLCB2Zy0+bG9ja19hcmdzLAorCQkJTlVMTCk7CisKKwlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsIE5VTEwpKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gKHJlc3VsdCA8IDApID8gMCA6IDE7CisJfQorCisJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJLyogT3RoZXIgaG9zdHMgaGF2ZSBub3Qgc3RvcHBlZCB0aGUgbG9ja3NwYWNlLiAqLworCWlmIChyZXN1bHQgPT0gLUVCVVNZKSB7CisJCWxvZ19lcnJvcigiTG9ja3NwYWNlIGZvciBcIiVzXCIgbm90IHN0b3BwZWQgb24gb3RoZXIgaG9zdHMiLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoIXJldCkgeworCQlsb2dfZXJyb3IoImxvY2tkX3JlbmFtZV92Z19iZWZvcmUgbHZtbG9ja2QgcmVzdWx0ICVkIiwgcmVzdWx0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkgeworCQlsb2dfZGVidWcoImxvY2tkX3JlbmFtZV92Z19iZWZvcmUgZGVhY3RpdmF0ZSBzYW5sb2NrIGx2Iik7CisJCV9kZWFjdGl2YXRlX3NhbmxvY2tfbHYoY21kLCB2Zyk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBsb2NrZF9yZW5hbWVfdmdfZmluYWwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgc3VjY2VzcykKK3sKKwlkYWVtb25fcmVwbHkgcmVwbHk7CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0OworCisJaWYgKCFpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKQorCQlyZXR1cm4gMTsKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiAwOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXN1Y2Nlc3MpIHsKKwkJLyoKKwkJICogRGVwZW5kaW5nIG9uIHRoZSBwcm9ibGVtIHRoYXQgY2F1c2VkIHRoZSByZW5hbWUgdG8KKwkJICogZmFpbCwgaXQgbWF5IG1ha2Ugc2Vuc2UgdG8gbm90IHJlc3RhcnQgdGhlIFZHIGhlcmUuCisJCSAqLworCQlpZiAoIWxvY2tkX3N0YXJ0X3ZnKGNtZCwgdmcsIDApKQorCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVzdGFydCBWRyAlcyBsb2Nrc3BhY2UuIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIXN0cmNtcCh2Zy0+bG9ja190eXBlLCAic2FubG9jayIpKSB7CisJCWlmICghX2FjdGl2YXRlX3NhbmxvY2tfbHYoY21kLCB2ZykpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBsdm1sb2NrZCBuZWVkcyB0byByZXdyaXRlIHRoZSBsZWFzZXMgb24gZGlzaworCQkgKiB3aXRoIHRoZSBuZXcgVkcgKGxvY2tzcGFjZSkgbmFtZS4KKwkJICovCisJCXJlcGx5ID0gX2xvY2tkX3NlbmQoInJlbmFtZV92Z19maW5hbCIsCisJCQkJInBpZCA9ICIgRk1UZDY0LCAoaW50NjRfdCkgZ2V0cGlkKCksCisJCQkJInZnX25hbWUgPSAlcyIsIHZnLT5uYW1lLAorCQkJCSJ2Z19sb2NrX3R5cGUgPSAlcyIsIHZnLT5sb2NrX3R5cGUsCisJCQkJInZnX2xvY2tfYXJncyA9ICVzIiwgdmctPmxvY2tfYXJncywKKwkJCQlOVUxMKTsKKworCQlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsIE5VTEwpKSB7CisJCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gKHJlc3VsdCA8IDApID8gMCA6IDE7CisJCX0KKwkKKwkJZGFlbW9uX3JlcGx5X2Rlc3Ryb3kocmVwbHkpOworCisJCWlmICghcmV0KSB7CisJCQkvKgorCQkJICogVGhlIFZHIGhhcyBiZWVuIHJlbmFtZWQgb24gZGlzaywgYnV0IHJlbmFtaW5nIHRoZQorCQkJICogc2FubG9jayBsZWFzZXMgZmFpbGVkLiAgQ2xlYW5pbmcgdGhpcyB1cCBjYW4KKwkJCSAqIHByb2JhYmx5IGJlIGRvbmUgYnkgY29udmVydGluZyB0aGUgVkcgdG8gbG9ja190eXBlCisJCQkgKiBub25lLCB0aGVuIGNvbnZlcnRpbmcgYmFjayB0byBzYW5sb2NrLgorCQkJICovCisJCQlsb2dfZXJyb3IoImxvY2tkX3JlbmFtZV92Z19maW5hbCBsdm1sb2NrZCByZXN1bHQgJWQiLCByZXN1bHQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWxvY2tkX3N0YXJ0X3ZnKGNtZCwgdmcsIDEpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdGFydCBWRyAlcyBsb2Nrc3BhY2UuIiwgdmctPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKmxvY2tkX3J1bm5pbmdfbG9ja190eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgKmZvdW5kX211bHRpcGxlKQoreworCWRhZW1vbl9yZXBseSByZXBseTsKKwljb25zdCBjaGFyICpsb2NrX3R5cGUgPSBOVUxMOworCWludCByZXN1bHQ7CisKKwlpZiAoIV91c2VfbHZtbG9ja2QpCisJCXJldHVybiBOVUxMOworCWlmICghX2x2bWxvY2tkX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXBseSA9IF9sb2NrZF9zZW5kKCJydW5uaW5nX2xtIiwKKwkJCSJwaWQgPSAiIEZNVGQ2NCwgKGludDY0X3QpIGdldHBpZCgpLAorCQkJTlVMTCk7CisKKwlpZiAoIV9sb2NrZF9yZXN1bHQocmVwbHksICZyZXN1bHQsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCByZXN1bHQgZnJvbSBsdm1sb2NrZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVYRlVMTDoKKwkJKmZvdW5kX211bHRpcGxlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTENLOgorCQlicmVhazsKKwljYXNlIExPQ0tfVFlQRV9TQU5MT0NLOgorCQlsb2dfZGVidWcoImx2bWxvY2tkIGZvdW5kIHNhbmxvY2siKTsKKwkJbG9ja190eXBlID0gInNhbmxvY2siOworCQlicmVhazsKKwljYXNlIExPQ0tfVFlQRV9ETE06CisJCWxvZ19kZWJ1ZygibHZtbG9ja2QgZm91bmQgZGxtIik7CisJCWxvY2tfdHlwZSA9ICJkbG0iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIGEgcnVubmluZyBsb2NrIG1hbmFnZXIuIik7CisJCWJyZWFrOworCX0KK291dDoKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXBseSk7CisKKwlyZXR1cm4gbG9ja190eXBlOworfQorCisvKiBTb21lIExWIHR5cGVzIGhhdmUgbm8gbG9jay4gKi8KKworaW50IGxvY2tkX2x2X3VzZXNfbG9jayhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWlmIChsdl9pc190aGluX3ZvbHVtZShsdikpCisJCXJldHVybiAwOworCisJaWYgKGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sX21ldGFkYXRhKGx2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHZfaXNfcG9vbF9tZXRhZGF0YV9zcGFyZShsdikpCisJCXJldHVybiAwOworCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2wobHYpKQorCQlyZXR1cm4gMDsKKworCWlmIChsdl9pc19jYWNoZV9wb29sX2RhdGEobHYpKQorCQlyZXR1cm4gMDsKKworCWlmIChsdl9pc19jYWNoZV9wb29sX21ldGFkYXRhKGx2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHZfaXNfY293KGx2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHYtPnN0YXR1cyAmIFNOQVBTSE9UKQorCQlyZXR1cm4gMDsKKworCS8qIEZJWE1FOiBsdl9pc192aXJ0dWFsX29yaWdpbiA/ICovCisKKwlpZiAobHZfaXNfbG9ja2Rfc2FubG9ja19sdihsdikpCisJCXJldHVybiAwOworCisJaWYgKGx2X2lzX21pcnJvcl9pbWFnZShsdikpCisJCXJldHVybiAwOworCisJaWYgKGx2X2lzX21pcnJvcl9sb2cobHYpKQorCQlyZXR1cm4gMDsKKworCWlmIChsdl9pc19yYWlkX2ltYWdlKGx2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobHZfaXNfcmFpZF9tZXRhZGF0YShsdikpCisJCXJldHVybiAwOworCisJaWYgKCFsdl9pc192aXNpYmxlKGx2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sb2NraW5nL2x2bWxvY2tkLmggYi9saWIvbG9ja2luZy9sdm1sb2NrZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjgyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbG9ja2luZy9sdm1sb2NrZC5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqLworCisjaWZuZGVmIF9MVk1MT0NLRF9ICisjZGVmaW5lIF9MVk1MT0NLRF9ICisKKyNpbmNsdWRlICJjb25maWctdXRpbC5oIgorI2luY2x1ZGUgImRhZW1vbi1jbGllbnQuaCIKKworI2RlZmluZSBMT0NLRF9TQU5MT0NLX0xWX05BTUUgImx2bWxvY2siCisKKy8qIGxvY2tkX2dsIGZsYWdzICovCisjZGVmaW5lIExER0xfVVBEQVRFX05BTUVTICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBsb2NrZF9sdiBmbGFncyAqLworI2RlZmluZSBMRExWX01PREVfTk9fU0ggICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTERMVl9QRVJTSVNURU5UICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qIGx2bWxvY2tkIHJlc3VsdCBmbGFncyAqLworI2RlZmluZSBMRF9SRl9OT19MT0NLU1BBQ0VTICAgICAweDAwMDAwMDAxCisjZGVmaW5lIExEX1JGX05PX0dMX0xTICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTERfUkZfV0FSTl9HTF9SRU1PVkVEICAgMHgwMDAwMDAwNAorI2RlZmluZSBMRF9SRl9EVVBfR0xfTFMgICAgICAgICAweDAwMDAwMDA4CisKKy8qIGxvY2tkX3N0YXRlIGZsYWdzICovCisjZGVmaW5lIExEU1RfRVgJCQkweDAwMDAwMDAxCisjZGVmaW5lIExEU1RfU0gJCQkweDAwMDAwMDAyCisjZGVmaW5lIExEU1RfRkFJTF9SRVFVRVNUCTB4MDAwMDAwMDQKKyNkZWZpbmUgTERTVF9GQUlMX05PTFMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTERTVF9GQUlMX1NUQVJUSU5HCTB4MDAwMDAwMTAKKyNkZWZpbmUgTERTVF9GQUlMX09USEVSCQkweDAwMDAwMDIwCisjZGVmaW5lIExEU1RfRkFJTAkJKExEU1RfRkFJTF9SRVFVRVNUIHwgTERTVF9GQUlMX05PTFMgfCBMRFNUX0ZBSUxfU1RBUlRJTkcgfCBMRFNUX0ZBSUxfT1RIRVIpCisKKyNpZmRlZiBMVk1MT0NLRF9TVVBQT1JUCisKKy8qIGx2bWxvY2tkIGNvbm5lY3Rpb24gYW5kIGNvbW11bmljYXRpb24gKi8KKwordm9pZCBsdm1sb2NrZF9zZXRfc29ja2V0KGNvbnN0IGNoYXIgKnNvY2spOwordm9pZCBsdm1sb2NrZF9zZXRfdXNlKGludCB1c2UpOworaW50IGx2bWxvY2tkX3VzZSh2b2lkKTsKK3ZvaWQgbHZtbG9ja2RfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Cit2b2lkIGx2bWxvY2tkX2Nvbm5lY3Qodm9pZCk7Cit2b2lkIGx2bWxvY2tkX2Rpc2Nvbm5lY3Qodm9pZCk7CisKKy8qIHZnY3JlYXRlL3ZncmVtb3ZlIHVzZSBpbml0L2ZyZWUgKi8KKworaW50IGxvY2tkX2luaXRfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpsb2NrX3R5cGUsIGludCBsdl9sb2NrX2NvdW50KTsKK2ludCBsb2NrZF9mcmVlX3ZnX2JlZm9yZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBjaGFuZ2luZyk7Cit2b2lkIGxvY2tkX2ZyZWVfdmdfZmluYWwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworLyogdmdyZW5hbWUgKi8KKworaW50IGxvY2tkX3JlbmFtZV92Z19iZWZvcmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCBsb2NrZF9yZW5hbWVfdmdfZmluYWwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgc3VjY2Vzcyk7CisKKy8qIHN0YXJ0IGFuZCBzdG9wIHRoZSBsb2Nrc3BhY2UgZm9yIGEgdmcgKi8KKworaW50IGxvY2tkX3N0YXJ0X3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgaW50IHN0YXJ0X2luaXQpOworaW50IGxvY2tkX3N0b3Bfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCBsb2NrZF9zdGFydF93YWl0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworLyogbG9ja2luZyAqLworCitpbnQgbG9ja2RfZ2xfY3JlYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpkZWZfbW9kZSwgY29uc3QgY2hhciAqdmdfbG9ja190eXBlKTsKK2ludCBsb2NrZF9nbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGVmX21vZGUsIHVpbnQzMl90IGZsYWdzKTsKK2ludCBsb2NrZF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwgY29uc3QgY2hhciAqZGVmX21vZGUsCisJICAgICB1aW50MzJfdCBmbGFncywgdWludDMyX3QgKmxvY2tkX3N0YXRlKTsKK2ludCBsb2NrZF92Z191cGRhdGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCitpbnQgbG9ja2RfbHZfbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3QgY2hhciAqbHZfbmFtZSwgc3RydWN0IGlkICpsdl9pZCwKKwkJICBjb25zdCBjaGFyICpsb2NrX2FyZ3MsIGNvbnN0IGNoYXIgKmRlZl9tb2RlLCB1aW50MzJfdCBmbGFncyk7CitpbnQgbG9ja2RfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJICAgICBjb25zdCBjaGFyICpkZWZfbW9kZSwgdWludDMyX3QgZmxhZ3MpOworCisvKiBsdmNyZWF0ZS9sdnJlbW92ZSB1c2UgaW5pdC9mcmVlICovCisKK2ludCBsb2NrZF9pbml0X2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCk7CitpbnQgbG9ja2RfaW5pdF9sdl9hcmdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmxvY2tfdHlwZSwgY29uc3QgY2hhciAqKmxvY2tfYXJncyk7CitpbnQgbG9ja2RfZnJlZV9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3QgY2hhciAqbHZfbmFtZSwgc3RydWN0IGlkICpsdl9pZCwgY29uc3QgY2hhciAqbG9ja19hcmdzKTsKKworY29uc3QgY2hhciAqbG9ja2RfcnVubmluZ19sb2NrX3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCAqZm91bmRfbXVsdGlwbGUpOworCitpbnQgaGFuZGxlX3NhbmxvY2tfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworaW50IGxvY2tkX2x2X3VzZXNfbG9jayhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworI2Vsc2UgLyogTFZNTE9DS0RfU1VQUE9SVCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbHZtbG9ja2Rfc2V0X3NvY2tldChjb25zdCBjaGFyICpzb2NrKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbHZtbG9ja2Rfc2V0X3VzZShpbnQgdXNlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbHZtbG9ja2RfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGx2bWxvY2tkX2Rpc2Nvbm5lY3Qodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGx2bWxvY2tkX2Nvbm5lY3Qodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgbHZtbG9ja2RfdXNlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tkX2luaXRfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpsb2NrX3R5cGUsIGludCBsdl9sb2NrX2NvdW50KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NrZF9mcmVlX3ZnX2JlZm9yZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBjaGFuZ2luZykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2tkX2ZyZWVfdmdfZmluYWwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfcmVuYW1lX3ZnX2JlZm9yZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tkX3JlbmFtZV92Z19maW5hbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBzdWNjZXNzKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NrZF9zdGFydF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBzdGFydF9pbml0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NrZF9zdG9wX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2Rfc3RhcnRfd2FpdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfZ2xfY3JlYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpkZWZfbW9kZSwgY29uc3QgY2hhciAqdmdfbG9ja190eXBlKQoreworCS8qCisJICogV2hlbiBsdm0gaXMgYnVpbHQgd2l0aG91dCBsdm1sb2NrZCBzdXBwb3J0LCBjcmVhdGluZyBhIFZHIHdpdGgKKwkgKiBhIHNoYXJlZCBsb2NrIHR5cGUgc2hvdWxkIGZhaWwuCisJICovCisJaWYgKGlzX2xvY2tkX3R5cGUodmdfbG9ja190eXBlKSkgeworCQlsb2dfZXJyb3IoIlVzaW5nIGEgc2hhcmVkIGxvY2sgdHlwZSByZXF1aXJlcyBsdm1sb2NrZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NrZF9nbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZGVmX21vZGUsIHVpbnQzMl90IGZsYWdzKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2NrZF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwgY29uc3QgY2hhciAqZGVmX21vZGUsCisJICAgICB1aW50MzJfdCBmbGFncywgdWludDMyX3QgKmxvY2tkX3N0YXRlKQoreworCSpsb2NrZF9zdGF0ZSA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tkX3ZnX3VwZGF0ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfbHZfbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3QgY2hhciAqbHZfbmFtZSwgc3RydWN0IGlkICpsdl9pZCwKKwkJICBjb25zdCBjaGFyICpsb2NrX2FyZ3MsIGNvbnN0IGNoYXIgKmRlZl9tb2RlLCB1aW50MzJfdCBmbGFncykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJICAgICBjb25zdCBjaGFyICpkZWZfbW9kZSwgdWludDMyX3QgZmxhZ3MpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tkX2luaXRfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgIAlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfaW5pdF9sdl9hcmdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKmxvY2tfdHlwZSwgY29uc3QgY2hhciAqKmxvY2tfYXJncykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG9ja2RfZnJlZV9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3QgY2hhciAqbHZfbmFtZSwgc3RydWN0IGlkICpsdl9pZCwgY29uc3QgY2hhciAqbG9ja19hcmdzKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmxvY2tkX3J1bm5pbmdfbG9ja190eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgKmZvdW5kX211bHRpcGxlKQoreworCWxvZ19lcnJvcigiVXNpbmcgYSBzaGFyZWQgbG9jayB0eXBlIHJlcXVpcmVzIGx2bWxvY2tkLiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfc2FubG9ja19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tkX2x2X3VzZXNfbG9jayhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYJLyogTFZNTE9DS0RfU1VQUE9SVCAqLworCisjZW5kaWYJLyogX0xWTUxPQ0tEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9sb2NraW5nL25vX2xvY2tpbmcuYyBiL2xpYi9sb2NraW5nL25vX2xvY2tpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDExNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvY2tpbmcvbm9fbG9ja2luZy5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJsb2NraW5nX3R5cGVzLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisKKy8qCisgKiBObyBsb2NraW5nCisgKi8KKworc3RhdGljIHZvaWQgX25vX2Zpbl9sb2NraW5nKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9ub19yZXNldF9sb2NraW5nKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbnQgX25vX2xvY2tfcmVzb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlc291cmNlLAorCQkJICAgICB1aW50MzJfdCBmbGFncywgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzd2l0Y2ggKGZsYWdzICYgTENLX1NDT1BFX01BU0spIHsKKwljYXNlIExDS19BQ1RJVkFUSU9OOgorCQlicmVhazsKKwljYXNlIExDS19WRzoKKwkJaWYgKCFzdHJjbXAocmVzb3VyY2UsIFZHX1NZTkNfTkFNRVMpKQorCQkJZnNfdW5sb2NrKCk7CisJCWJyZWFrOworCWNhc2UgTENLX0xWOgorCQlzd2l0Y2ggKGZsYWdzICYgTENLX1RZUEVfTUFTSykgeworCQljYXNlIExDS19OVUxMOgorCQkJcmV0dXJuIGx2X2RlYWN0aXZhdGUoY21kLCByZXNvdXJjZSwgbHZfY29tbWl0dGVkKGx2KSk7CisJCWNhc2UgTENLX1VOTE9DSzoKKwkJCXJldHVybiBsdl9yZXN1bWVfaWZfYWN0aXZlKGNtZCwgcmVzb3VyY2UsIChmbGFncyAmIExDS19PUklHSU5fT05MWSkgPyAxOiAwLCAwLAorCQkJCQkJICAgKGZsYWdzICYgTENLX1JFVkVSVCkgPyAxIDogMCwgbHZfY29tbWl0dGVkKGx2KSk7CisJCWNhc2UgTENLX1JFQUQ6CisJCQlyZXR1cm4gbHZfYWN0aXZhdGVfd2l0aF9maWx0ZXIoY21kLCByZXNvdXJjZSwgMCwgKGx2LT5zdGF0dXMgJiBMVl9OT1NDQU4pID8gMSA6IDAsCisJCQkJCQkgICAgICAgKGx2LT5zdGF0dXMgJiBMVl9URU1QT1JBUlkpID8gMSA6IDAsIGx2X2NvbW1pdHRlZChsdikpOworCQljYXNlIExDS19XUklURToKKwkJCXJldHVybiBsdl9zdXNwZW5kX2lmX2FjdGl2ZShjbWQsIHJlc291cmNlLCAoZmxhZ3MgJiBMQ0tfT1JJR0lOX09OTFkpID8gMSA6IDAsIDAsCisJCQkJCQkgICAgbHZfY29tbWl0dGVkKGx2KSwgbHYpOworCQljYXNlIExDS19FWENMOgorCQkJcmV0dXJuIGx2X2FjdGl2YXRlX3dpdGhfZmlsdGVyKGNtZCwgcmVzb3VyY2UsIDEsIChsdi0+c3RhdHVzICYgTFZfTk9TQ0FOKSA/IDEgOiAwLAorCQkJCQkJICAgICAgIChsdi0+c3RhdHVzICYgTFZfVEVNUE9SQVJZKSA/IDEgOiAwLCBsdl9jb21taXR0ZWQobHYpKTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIGxvY2sgc2NvcGU6ICVkIiwKKwkJCSAgZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9ub19xdWVyeV9yZXNvdXJjZShjb25zdCBjaGFyICpyZXNvdXJjZSwgY29uc3QgY2hhciAqbm9kZSwgaW50ICptb2RlKQoreworCWxvZ192ZXJ5X3ZlcmJvc2UoIkxvY2tpbmcgaXMgZGlzYWJsZWQ6IFRyZWF0aW5nIGxvY2sgJXMgYXMgbm90IGhlbGQuIiwKKwkJCSByZXNvdXJjZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRvbmx5X2xvY2tfcmVzb3VyY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgY29uc3QgY2hhciAqcmVzb3VyY2UsCisJCQkJICAgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKChmbGFncyAmIExDS19UWVBFX01BU0spID09IExDS19XUklURSAmJgorCSAgICAoZmxhZ3MgJiBMQ0tfU0NPUEVfTUFTSykgPT0gTENLX1ZHICYmCisJICAgICEoZmxhZ3MgJiBMQ0tfQ0FDSEUpICYmCisJICAgIHN0cmNtcChyZXNvdXJjZSwgVkdfR0xPQkFMKSkgeworCQlsb2dfZXJyb3IoIlJlYWQtb25seSBsb2NraW5nIHR5cGUgc2V0LiAiCisJCQkgICJXcml0ZSBsb2NrcyBhcmUgcHJvaGliaXRlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIF9ub19sb2NrX3Jlc291cmNlKGNtZCwgcmVzb3VyY2UsIGZsYWdzLCBsdik7Cit9CisKK3ZvaWQgaW5pdF9ub19sb2NraW5nKHN0cnVjdCBsb2NraW5nX3R5cGUgKmxvY2tpbmcsIHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgaW50IHN1cHByZXNzX21lc3NhZ2VzKQoreworCWxvY2tpbmctPmxvY2tfcmVzb3VyY2UgPSBfbm9fbG9ja19yZXNvdXJjZTsKKwlsb2NraW5nLT5xdWVyeV9yZXNvdXJjZSA9IF9ub19xdWVyeV9yZXNvdXJjZTsKKwlsb2NraW5nLT5yZXNldF9sb2NraW5nID0gX25vX3Jlc2V0X2xvY2tpbmc7CisJbG9ja2luZy0+ZmluX2xvY2tpbmcgPSBfbm9fZmluX2xvY2tpbmc7CisJbG9ja2luZy0+ZmxhZ3MgPSBMQ0tfQ0xVU1RFUkVEOworfQorCitpbnQgaW5pdF9yZWFkb25seV9sb2NraW5nKHN0cnVjdCBsb2NraW5nX3R5cGUgKmxvY2tpbmcsIHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpCit7CisJbG9ja2luZy0+bG9ja19yZXNvdXJjZSA9IF9yZWFkb25seV9sb2NrX3Jlc291cmNlOworCWxvY2tpbmctPnF1ZXJ5X3Jlc291cmNlID0gX25vX3F1ZXJ5X3Jlc291cmNlOworCWxvY2tpbmctPnJlc2V0X2xvY2tpbmcgPSBfbm9fcmVzZXRfbG9ja2luZzsKKwlsb2NraW5nLT5maW5fbG9ja2luZyA9IF9ub19maW5fbG9ja2luZzsKKwlsb2NraW5nLT5mbGFncyA9IDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2R1bW15X2xvY2tpbmcoc3RydWN0IGxvY2tpbmdfdHlwZSAqbG9ja2luZywgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICBpbnQgc3VwcHJlc3NfbWVzc2FnZXMpCit7CisJbG9ja2luZy0+bG9ja19yZXNvdXJjZSA9IF9yZWFkb25seV9sb2NrX3Jlc291cmNlOworCWxvY2tpbmctPnF1ZXJ5X3Jlc291cmNlID0gX25vX3F1ZXJ5X3Jlc291cmNlOworCWxvY2tpbmctPnJlc2V0X2xvY2tpbmcgPSBfbm9fcmVzZXRfbG9ja2luZzsKKwlsb2NraW5nLT5maW5fbG9ja2luZyA9IF9ub19maW5fbG9ja2luZzsKKwlsb2NraW5nLT5mbGFncyA9IExDS19DTFVTVEVSRUQ7Cit9CmRpZmYgLS1naXQgYS9saWIvbG9nL2xvZy5jIGIvbGliL2xvZy9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVmYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2xvZy9sb2cuYwpAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKyNpbmNsdWRlICJyZXBvcnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIEZJTEUgKl9sb2dfZmlsZTsKK3N0YXRpYyBjaGFyIF9sb2dfZmlsZV9wYXRoW1BBVEhfTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIF9sb2dfZGV2Oworc3RhdGljIHN0cnVjdCBkbV9zdHJfbGlzdCBfbG9nX2Rldl9hbGlhczsKKworc3RhdGljIGludCBfc3lzbG9nID0gMDsKK3N0YXRpYyBpbnQgX2xvZ190b19maWxlID0gMDsKK3N0YXRpYyB1aW50NjRfdCBfbG9nX2ZpbGVfbWF4X2xpbmVzID0gMDsKK3N0YXRpYyB1aW50NjRfdCBfbG9nX2ZpbGVfbGluZXMgPSAwOworc3RhdGljIGludCBfbG9nX2RpcmVjdCA9IDA7CitzdGF0aWMgaW50IF9sb2dfd2hpbGVfc3VzcGVuZGVkID0gMDsKK3N0YXRpYyBpbnQgX2luZGVudCA9IDE7CitzdGF0aWMgaW50IF9sb2dfc3VwcHJlc3MgPSAwOworc3RhdGljIGNoYXIgX21zZ19wcmVmaXhbMzBdID0gIiAgIjsKK3N0YXRpYyBpbnQgX2FscmVhZHlfbG9nZ2luZyA9IDA7CitzdGF0aWMgaW50IF9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnNfY29uZmlnID0gMDsKKworc3RhdGljIGx2bTJfbG9nX2ZuX3QgX2x2bTJfbG9nX2ZuID0gTlVMTDsKKworc3RhdGljIGludCBfbHZtX2Vycm5vID0gMDsKK3N0YXRpYyBpbnQgX3N0b3JlX2Vycm1zZyA9IDA7CitzdGF0aWMgY2hhciAqX2x2bV9lcnJtc2cgPSBOVUxMOworc3RhdGljIHNpemVfdCBfbHZtX2Vycm1zZ19zaXplID0gMDsKK3N0YXRpYyBzaXplX3QgX2x2bV9lcnJtc2dfbGVuID0gMDsKKyNkZWZpbmUgTUFYX0VSUk1TR19MRU4gKDUxMiAqIDEwMjQpICAvKiBNYXggc2l6ZSBvZiBlcnJvciBidWZmZXIgNTEyS0IgKi8KKworc3RhdGljIGxvZ19yZXBvcnRfdCBfbG9nX3JlcG9ydCA9IHsKKwkucmVwb3J0ID0gTlVMTCwKKwkuY29udGV4dCA9IExPR19SRVBPUlRfQ09OVEVYVF9OVUxMLAorCS5vYmplY3RfdHlwZSA9IExPR19SRVBPUlRfT0JKRUNUX1RZUEVfTlVMTCwKKwkub2JqZWN0X2lkID0gTlVMTCwKKwkub2JqZWN0X25hbWUgPSBOVUxMLAorCS5vYmplY3RfZ3JvdXAgPSBOVUxMCit9OworCit2b2lkIGluaXRfbG9nX2ZuKGx2bTJfbG9nX2ZuX3QgbG9nX2ZuKQoreworCV9sdm0yX2xvZ19mbiA9IGxvZ19mbjsKK30KKworLyoKKyAqIFN1cHBvcnQgZW52dmFyIExWTV9MT0dfRklMRV9FUE9DSCBhbmQgYWxsb3cgdG8gYXR0YWNoCisgKiBleHRyYSBrZXl3b3JkIChjb25zaXN0IG9mIHVwdG8gMzIgYWxwaGEgY2hhcnMpIHRvCisgKiBvcGVuZWQgbG9nIGZpbGUuIEFmdGVyIHRoaXMgJ2Vwb2NoJyB3b3JkIHBpZCBhbmQgc3RhcnR0aW1lCisgKiAoaW4ga2VybmVsIHVuaXRzLCByZWFkIGZyb20gL3Byb2Mvc2VsZi9zdGF0KQorICogaXMgYXV0b21hdGljYWxseSBhdHRhY2hlZC4KKyAqIElmIGNvbW1hbmQvZGFlbW9uIGZvcmtzIG11bHRpcGxlIHRpbWVzLCBpdCBjb3VsZCBjcmVhdGUgbXVsdGlwbGUKKyAqIGxvZyBmaWxlcyBlbnN1cmluZywgdGhlcmUgYXJlIG5vIG92ZXJ3cml0ZXMuCisgKi8KK3ZvaWQgaW5pdF9sb2dfZmlsZShjb25zdCBjaGFyICpsb2dfZmlsZSwgaW50IGFwcGVuZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzdGF0ZmlsZVtdID0gIi9wcm9jL3NlbGYvc3RhdCI7CisJY29uc3QgY2hhciAqZW52OworCWludCBwaWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0dGltZTsKKwlGSUxFICpzdDsKKwlpbnQgaSA9IDA7CisKKwlfbG9nX2ZpbGVfcGF0aFswXSA9ICdcMCc7CisJaWYgKChlbnYgPSBnZXRlbnYoIkxWTV9MT0dfRklMRV9FUE9DSCIpKSkgeworCQl3aGlsZSAoaXNhbHBoYShlbnZbaV0pICYmIGkgPCAzMikgLyogVXAgdG8gMzIgYWxwaGFzICovCisJCQlpKys7CisJCWlmIChlbnZbaV0pIHsKKwkJCWlmIChpKQorCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBpbnZhbGlkIExWTV9MT0dfRklMRV9FUE9DSCBlbnZ2YXIgXCIlc1wiLiIsIGVudik7CisJCQlnb3RvIG5vX2Vwb2NoOworCQl9CisKKwkJaWYgKCEoc3QgPSBmb3BlbihzdGF0ZmlsZSwgInIiKSkpCisJCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIHN0YXRmaWxlKTsKKwkJZWxzZSBpZiAoZnNjYW5mKHN0LCAiJWQgJSpzICUqYyAlKmQgJSpkICUqZCAlKmQgIiAvKiB0dHlfbnIgKi8KKwkJCSAgICIlKmQgJSp1ICUqdSAlKnUgJSp1ICIgLyogbWpmbHQgKi8KKwkJCSAgICIlKnUgJSp1ICUqdSAlKmQgJSpkICIgLyogY3N0aW0gKi8KKwkJCSAgICIlKmQgJSpkICUqZCAlKmQgIiAvKiBpdHJlYWx2YWx1ZSAqLworCQkJICAgIiVsbHUiLCAmcGlkLCAmc3RhcnR0aW1lKSAhPSAyKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogQ2Fubm90IHBhcnNlIGNvbnRlbnQgb2YgJXMuIiwgc3RhdGZpbGUpOworCQl9IGVsc2UgeworCQkJaWYgKGRtX3NucHJpbnRmKF9sb2dfZmlsZV9wYXRoLCBzaXplb2YoX2xvZ19maWxlX3BhdGgpLAorCQkJCQkiJXNfJXNfJWRfJWxsdSIsIGxvZ19maWxlLCBlbnYsIHBpZCwgc3RhcnR0aW1lKSA8IDApIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogRGVidWcgbG9nIGZpbGUgcGF0aCBpcyB0b28gbG9uZyBmb3IgZXBvY2guIik7CisJCQkJX2xvZ19maWxlX3BhdGhbMF0gPSAnXDAnOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZmlsZSA9IF9sb2dfZmlsZV9wYXRoOworCQkJCWFwcGVuZCA9IDE7IC8qIGZvcmNlICovCisJCQl9CisJCX0KKworCQlpZiAoc3QgJiYgZmNsb3NlKHN0KSkKKwkJCWxvZ19zeXNfZGVidWcoImZjbG9zZSIsIHN0YXRmaWxlKTsKKworCQlpZiAoKGVudiA9IGdldGVudigiTFZNX0xPR19GSUxFX01BWF9MSU5FUyIpKSkgeworCQkJaWYgKHNzY2FuZihlbnYsIEZNVHU2NCwgJl9sb2dfZmlsZV9tYXhfbGluZXMpICE9IDEpIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogSWdub3JpbmcgaW52YWxpZCBMVk1fTE9HX01BWF9MSU5FUyBlbnZ2YXIgXCIlc1wiLiIsIGVudik7CisJCQkJX2xvZ19maWxlX21heF9saW5lcyA9IDA7CisJCQl9CisJCQlfbG9nX2ZpbGVfbGluZXMgPSAwOworCQl9CisJfQorCitub19lcG9jaDoKKwlpZiAoIShfbG9nX2ZpbGUgPSBmb3Blbihsb2dfZmlsZSwgYXBwZW5kID8gImEiIDogInciKSkpIHsKKwkJbG9nX3N5c19lcnJvcigiZm9wZW4iLCBsb2dfZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwlfbG9nX3RvX2ZpbGUgPSAxOworfQorCisvKgorICogVW5saW5rIHRoZSBsb2cgZmlsZSBkZXBlZGluZyBvbiBjb21tYW5kJ3MgcmV0dXJuIHZhbHVlCisgKgorICogV2hlbiBlbnZ2YXIgTFZNX0VYUEVDVEVEX0VYSVRfU1RBVFVTIGlzIHNldCwgY29tcGFyZQorICogcmVzdWx0aW5nIHN0YXR1cyB3aXRoIHRoaXMgc3RyaW5nLgorICoKKyAqIEl0J3MgcG9zc2libGUgdG8gc3BlY2lmeSAyIHZhcmlhbnRzIC0gaGF2aW5nIGl0IGVxdWFsIHRvCisgKiBhIHNpbmdsZSBudW1iZXIgb3IgaGF2aW5nIGl0IGRpZmZlcmVudCBmcm9tIGEgc2luZ2xlIG51bWJlci4KKyAqCisgKiBpLmUuICBMVk1fRVhQRUNURURfRVhJVF9TVEFUVVM9Ij4xIiAgIyBkZWxldGUgd2hlbiByZXQgPiAxLgorICovCit2b2lkIHVubGlua19sb2dfZmlsZShpbnQgcmV0KQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChfbG9nX2ZpbGVfcGF0aFswXSAmJgorCSAgICAoZW52ID0gZ2V0ZW52KCJMVk1fRVhQRUNURURfRVhJVF9TVEFUVVMiKSkgJiYKKwkgICAgKChlbnZbMF0gPT0gJz4nICYmIHJldCA+IGF0b2koZW52ICsgMSkpIHx8CisJICAgICAoYXRvaShlbnYpID09IHJldCkpKSB7CisJCWlmICh1bmxpbmsoX2xvZ19maWxlX3BhdGgpKQorCQkJbG9nX3N5c19lcnJvcigidW5saW5rIiwgX2xvZ19maWxlX3BhdGgpOworCQlfbG9nX2ZpbGVfcGF0aFswXSA9ICdcMCc7CisJfQorfQorCit2b2lkIGluaXRfbG9nX2RpcmVjdChjb25zdCBjaGFyICpsb2dfZmlsZSwgaW50IGFwcGVuZCkKK3sKKwlpbnQgb3Blbl9mbGFncyA9IGFwcGVuZCA/IDAgOiBPX1RSVU5DOworCisJZGV2X2NyZWF0ZV9maWxlKGxvZ19maWxlLCAmX2xvZ19kZXYsICZfbG9nX2Rldl9hbGlhcywgMSk7CisJaWYgKCFkZXZfb3Blbl9mbGFncygmX2xvZ19kZXYsIE9fUkRXUiB8IE9fQ1JFQVQgfCBvcGVuX2ZsYWdzLCAxLCAwKSkKKwkJcmV0dXJuOworCisJX2xvZ19kaXJlY3QgPSAxOworfQorCit2b2lkIGluaXRfbG9nX3doaWxlX3N1c3BlbmRlZChpbnQgbG9nX3doaWxlX3N1c3BlbmRlZCkKK3sKKwlfbG9nX3doaWxlX3N1c3BlbmRlZCA9IGxvZ193aGlsZV9zdXNwZW5kZWQ7Cit9CisKK3ZvaWQgaW5pdF9zeXNsb2coaW50IGZhY2lsaXR5KQoreworCW9wZW5sb2coImx2bSIsIExPR19QSUQsIGZhY2lsaXR5KTsKKwlfc3lzbG9nID0gMTsKK30KKworaW50IGxvZ19zdXBwcmVzcyhpbnQgc3VwcHJlc3MpCit7CisJaW50IG9sZF9zdXBwcmVzcyA9IF9sb2dfc3VwcHJlc3M7CisKKwlfbG9nX3N1cHByZXNzID0gc3VwcHJlc3M7CisKKwlyZXR1cm4gb2xkX3N1cHByZXNzOworfQorCit2b2lkIHJlbGVhc2VfbG9nX21lbW9yeSh2b2lkKQoreworCWlmICghX2xvZ19kaXJlY3QpCisJCXJldHVybjsKKworCWRtX2ZyZWUoKGNoYXIgKikgX2xvZ19kZXZfYWxpYXMuc3RyKTsKKwlfbG9nX2Rldl9hbGlhcy5zdHIgPSAiYWN0aXZhdGVfbG9nIGZpbGUiOworfQorCit2b2lkIGZpbl9sb2codm9pZCkKK3sKKwlpZiAoX2xvZ19kaXJlY3QpIHsKKwkJKHZvaWQpIGRldl9jbG9zZSgmX2xvZ19kZXYpOworCQlfbG9nX2RpcmVjdCA9IDA7CisJfQorCisJaWYgKF9sb2dfdG9fZmlsZSkgeworCQlpZiAoZG1fZmNsb3NlKF9sb2dfZmlsZSkpIHsKKwkJCWlmIChlcnJubykKKwkJCSAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHdyaXRlIGxvZyBmaWxlOiAlc1xuIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJZWxzZQorCQkJICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gd3JpdGUgbG9nIGZpbGVcbiIpOworCisJCX0KKwkJX2xvZ190b19maWxlID0gMDsKKwl9Cit9CisKK3ZvaWQgZmluX3N5c2xvZyh2b2lkKQoreworCWlmIChfc3lzbG9nKQorCQljbG9zZWxvZygpOworCV9zeXNsb2cgPSAwOworfQorCit2b2lkIGluaXRfbXNnX3ByZWZpeChjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RybmNweShfbXNnX3ByZWZpeCwgcHJlZml4LCBzaXplb2YoX21zZ19wcmVmaXgpIC0gMSk7CisJX21zZ19wcmVmaXhbc2l6ZW9mKF9tc2dfcHJlZml4KSAtIDFdID0gJ1wwJzsKK30KKwordm9pZCBpbml0X2luZGVudChpbnQgaW5kZW50KQoreworCV9pbmRlbnQgPSBpbmRlbnQ7Cit9CisKKy8qIElmIHByZXNlbnQsIGVudmlyb25tZW50IHNldHRpbmcgd2lsbCBvdmVycmlkZSB0aGlzLiAqLwordm9pZCBpbml0X2Fib3J0X29uX2ludGVybmFsX2Vycm9ycyhpbnQgZmF0YWwpCit7CisJX2Fib3J0X29uX2ludGVybmFsX2Vycm9yc19jb25maWcgPSBmYXRhbDsKK30KKwordm9pZCByZXNldF9sdm1fZXJybm8oaW50IHN0b3JlX2Vycm1zZykKK3sKKwlfbHZtX2Vycm5vID0gMDsKKworCWlmIChfbHZtX2Vycm1zZykgeworCQlkbV9mcmVlKF9sdm1fZXJybXNnKTsKKwkJX2x2bV9lcnJtc2cgPSBOVUxMOworCQlfbHZtX2Vycm1zZ19zaXplID0gX2x2bV9lcnJtc2dfbGVuID0gMDsKKwl9CisKKwlfc3RvcmVfZXJybXNnID0gc3RvcmVfZXJybXNnOworfQorCitpbnQgc3RvcmVkX2Vycm5vKHZvaWQpCit7CisJcmV0dXJuIF9sdm1fZXJybm87Cit9CisKK2NvbnN0IGNoYXIgKnN0b3JlZF9lcnJtc2codm9pZCkKK3sKKwlyZXR1cm4gX2x2bV9lcnJtc2cgPyA6ICIiOworfQorCitjb25zdCBjaGFyICpzdG9yZWRfZXJybXNnX3dpdGhfY2xlYXIodm9pZCkKK3sKKwljb25zdCBjaGFyICpyYyA9IHN0cmR1cChzdG9yZWRfZXJybXNnKCkpOworCXJlc2V0X2x2bV9lcnJubygxKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX2R1cGxpY2F0ZWQgPSBOVUxMOworCit2b2lkIHJlc2V0X2xvZ19kdXBsaWNhdGVkKHZvaWQpIHsKKwlpZiAoX2R1cGxpY2F0ZWQpIHsKKwkJZG1faGFzaF9kZXN0cm95KF9kdXBsaWNhdGVkKTsKKwkJX2R1cGxpY2F0ZWQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRfbG9nX2xldmVsX25hbWUoaW50IHVzZV9zdGRlcnIsIGludCBsZXZlbCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbG9nX2xldmVsX25hbWVzW10gPSB7IiIsICAgICAgLyogdW5hc3NpZ25lZCAqLworCQkJCQkJIiIsICAgICAgLyogdW5hc3NpZ25lZCAqLworCQkJCQkJImZhdGFsIiwgLyogX0xPR19GQVRBTCAqLworCQkJCQkJImVycm9yIiwgLyogX0xPR19FUlJPUiAqLworCQkJCQkJIndhcm4iLCAgLyogX0xPR19XQVJOICovCisJCQkJCQkibm90aWNlIiwvKiBfTE9HX05PVElDRSAqLworCQkJCQkJImluZm8iLCAgLyogX0xPR19JTkZPICovCisJCQkJCQkiZGVidWciICAvKiBfTE9HX0RFQlVHICovCisJCQkJCQl9OworCWlmIChsZXZlbCA9PSBfTE9HX1dBUk4gJiYgIXVzZV9zdGRlcnIpCisJCXJldHVybiAicHJpbnQiOworCisJcmV0dXJuIGxvZ19sZXZlbF9uYW1lc1tsZXZlbF07Cit9CisKK2NvbnN0IGNoYXIgKmxvZ19nZXRfcmVwb3J0X2NvbnRleHRfbmFtZShsb2dfcmVwb3J0X2NvbnRleHRfdCBjb250ZXh0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpsb2dfY29udGV4dF9uYW1lc1tMT0dfUkVQT1JUX0NPTlRFWFRfQ09VTlRdID0ge1tMT0dfUkVQT1JUX0NPTlRFWFRfTlVMTF0gPSAiIiwKKwkJCQkJCQkJCSAgW0xPR19SRVBPUlRfQ09OVEVYVF9QUk9DRVNTSU5HXSA9ICJwcm9jZXNzaW5nIn07CisJcmV0dXJuIGxvZ19jb250ZXh0X25hbWVzW2NvbnRleHRdOworfQorCisKK2NvbnN0IGNoYXIgKmxvZ19nZXRfcmVwb3J0X29iamVjdF90eXBlX25hbWUobG9nX3JlcG9ydF9vYmplY3RfdHlwZV90IG9iamVjdF90eXBlKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpsb2dfb2JqZWN0X3R5cGVfbmFtZXNbTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT1VOVF0gPSB7W0xPR19SRVBPUlRfT0JKRUNUX1RZUEVfTlVMTF0gPSAiIiwKKwkJCQkJCQkJCQkgIFtMT0dfUkVQT1JUX09CSkVDVF9UWVBFX09SUEhBTl0gPSAib3JwaGFuIiwKKwkJCQkJCQkJCQkgIFtMT0dfUkVQT1JUX09CSkVDVF9UWVBFX1BWXSA9ICJwdiIsCisJCQkJCQkJCQkJICBbTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9MQUJFTF0gPSAibGFiZWwiLAorCQkJCQkJCQkJCSAgW0xPR19SRVBPUlRfT0JKRUNUX1RZUEVfVkddID0gInZnIiwKKwkJCQkJCQkJCQkgIFtMT0dfUkVQT1JUX09CSkVDVF9UWVBFX0xWXSA9ICJsdiJ9OworCXJldHVybiBsb2dfb2JqZWN0X3R5cGVfbmFtZXNbb2JqZWN0X3R5cGVdOworfQorCitfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgNSwgMCkpKQorc3RhdGljIHZvaWQgX3ZwcmludF9sb2coaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLAorCQkJY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IG9yaWdfYXApCit7CisJdmFfbGlzdCBhcDsKKwljaGFyIGJ1ZlsxMDI0XSwgbWVzc2FnZVs0MDk2XTsKKwlpbnQgYnVmdXNlZCwgbjsKKwljb25zdCBjaGFyICp0cmZvcm1hdDsJCS8qIFRyYW5zbGF0ZWQgZm9ybWF0IHN0cmluZyAqLworCWNoYXIgKm5ld2J1ZjsKKwlpbnQgdXNlX3N0ZGVyciA9IGxldmVsICYgX0xPR19TVERFUlI7CisJaW50IGxvZ19vbmNlID0gbGV2ZWwgJiBfTE9HX09OQ0U7CisJaW50IGxvZ19ieXBhc3NfcmVwb3J0ID0gbGV2ZWwgJiBfTE9HX0JZUEFTU19SRVBPUlQ7CisJaW50IGZhdGFsX2ludGVybmFsX2Vycm9yID0gMDsKKwlzaXplX3QgbXNnbGVuOworCWNvbnN0IGNoYXIgKmluZGVudF9zcGFjZXMgPSAiIjsKKwlGSUxFICpzdHJlYW07CisJc3RhdGljIGludCBfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX2Vudl9wcmVzZW50ID0gLTE7CisJc3RhdGljIGludCBfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX2VudiA9IDA7CisJY2hhciAqZW52X3N0cjsKKwlzdHJ1Y3QgZG1fcmVwb3J0ICpvcmlnX3JlcG9ydDsKKwlpbnQgbG9nZ2VkX3ZpYV9yZXBvcnQgPSAwOworCisJbGV2ZWwgJj0gfihfTE9HX1NUREVSUnxfTE9HX09OQ0V8X0xPR19CWVBBU1NfUkVQT1JUKTsKKworCWlmIChfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX2Vudl9wcmVzZW50IDwgMCkgeworCQlpZiAoKGVudl9zdHIgPSBnZXRlbnYoIkRNX0FCT1JUX09OX0lOVEVSTkFMX0VSUk9SUyIpKSkgeworCQkJX2Fib3J0X29uX2ludGVybmFsX2Vycm9yc19lbnZfcHJlc2VudCA9IDE7CisJCQkvKiBTZXQgd2hlbiBlbnYgRE1fQUJPUlRfT05fSU5URVJOQUxfRVJST1JTIGlzIG5vdCAiMCIgKi8KKwkJCV9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnNfZW52ID0gc3RyY21wKGVudl9zdHIsICIwIik7CisJCX0gZWxzZQorCQkJX2Fib3J0X29uX2ludGVybmFsX2Vycm9yc19lbnZfcHJlc2VudCA9IDA7CisJfQorCisJLyogVXNlIHZhbHVlIGZyb20gZW52aXJvbm1lbnQgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSB2YWx1ZSBmcm9tIGNvbmZpZy4gKi8KKwlpZiAoKChfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX2Vudl9wcmVzZW50ICYmIF9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnNfZW52KSB8fAorCSAgICAgKCFfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzX2Vudl9wcmVzZW50ICYmIF9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnNfY29uZmlnKSkgJiYKKwkgICAgIXN0cm5jbXAoZm9ybWF0LCBJTlRFUk5BTF9FUlJPUiwgc2l6ZW9mKElOVEVSTkFMX0VSUk9SKSAtIDEpKSB7CisJCWZhdGFsX2ludGVybmFsX2Vycm9yID0gMTsKKwkJLyogSW50ZXJuYWwgZXJyb3JzIHRyaWdnZXJpbmcgYWJvcnQgY2Fubm90IGJlIHN1cHByZXNzZWQuICovCisJCV9sb2dfc3VwcHJlc3MgPSAwOworCQlsZXZlbCA9IF9MT0dfRkFUQUw7CisJfQorCisJaWYgKGxldmVsIDw9IF9MT0dfRVJSKQorCQlpbml0X2Vycm9yX21lc3NhZ2VfcHJvZHVjZWQoMSk7CisKKwl0cmZvcm1hdCA9IF8oZm9ybWF0KTsKKworCWlmIChsZXZlbCA8IF9MT0dfREVCVUcgJiYgZG1fZXJybm9fb3JfY2xhc3MgJiYgIV9sdm1fZXJybm8pCisJCV9sdm1fZXJybm8gPSBkbV9lcnJub19vcl9jbGFzczsKKworCWlmIChfbHZtMl9sb2dfZm4gfHwKKwkgICAgKF9zdG9yZV9lcnJtc2cgJiYgKGxldmVsIDw9IF9MT0dfRVJSKSkgfHwKKwkgICAgKF9sb2dfcmVwb3J0LnJlcG9ydCAmJiAhbG9nX2J5cGFzc19yZXBvcnQgJiYgKHVzZV9zdGRlcnIgfHwgKGxldmVsIDw9X0xPR19XQVJOKSkpIHx8CisJICAgIGxvZ19vbmNlKSB7CisJCXZhX2NvcHkoYXAsIG9yaWdfYXApOworCQluID0gdnNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgdHJmb3JtYXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKworCQkvKiBXaGVuIG5ld2VyIGdsaWJjIHJldHVybnMgPj0gc2l6ZW9mKGxvY24pLCB3ZSB3aWxsIGp1c3QgbG9nIHdoYXQKKyAgICAgICAgICAgICAgICAgKiBoYXMgZml0IGludG8gYnVmZmVyLCBpdCdzICdcMCcgdGVybWluYXRlZCBzdHJpbmcgKi8KKwkJaWYgKG4gPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygidnNucHJpbnRmIGZhaWxlZDogc2tpcHBpbmcgZXh0ZXJuYWwgIgorCQkJCQkibG9nZ2luZyBmdW5jdGlvbiIpKTsKKwkJCWdvdG8gbG9nX2l0OworCQl9CisJfQorCisvKiBGSVhNRSBBdm9pZCBwb2ludGxlc3MgdXNlIG9mIG1lc3NhZ2UgYnVmZmVyIHdoZW4gaXQnbGwgbmV2ZXIgYmUgcmVhZCEgKi8KKwlpZiAoX3N0b3JlX2Vycm1zZyAmJiAobGV2ZWwgPD0gX0xPR19FUlIpICYmCisJICAgIF9sdm1fZXJybXNnX2xlbiA8IE1BWF9FUlJNU0dfTEVOKSB7CisJCW1zZ2xlbiA9IHN0cmxlbihtZXNzYWdlKTsKKwkJaWYgKChfbHZtX2Vycm1zZ19sZW4gKyBtc2dsZW4gKyAxKSA+PSBfbHZtX2Vycm1zZ19zaXplKSB7CisJCQlfbHZtX2Vycm1zZ19zaXplID0gMiAqIChfbHZtX2Vycm1zZ19sZW4gKyBtc2dsZW4gKyAxKTsKKwkJCWlmICgobmV3YnVmID0gZG1fcmVhbGxvYyhfbHZtX2Vycm1zZywKKwkJCQkJCSBfbHZtX2Vycm1zZ19zaXplKSkpCisJCQkJX2x2bV9lcnJtc2cgPSBuZXdidWY7CisJCQllbHNlCisJCQkJX2x2bV9lcnJtc2dfc2l6ZSA9IF9sdm1fZXJybXNnX2xlbjsKKwkJfQorCQlpZiAoX2x2bV9lcnJtc2cgJiYKKwkJICAgIChfbHZtX2Vycm1zZ19sZW4gKyBtc2dsZW4gKyAyKSA8IF9sdm1fZXJybXNnX3NpemUpIHsKKwkJCS8qIHByZXBlbmQgJ1xuJyBhbmQgY29weSB3aXRoICdcMCcgYnV0IGRvIG5vdCBjb3VudCBpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9sdm1fZXJybXNnX2xlbikKKwkJCQlfbHZtX2Vycm1zZ1tfbHZtX2Vycm1zZ19sZW4rK10gPSAnXG4nOworCQkJbWVtY3B5KF9sdm1fZXJybXNnICsgX2x2bV9lcnJtc2dfbGVuLCBtZXNzYWdlLCBtc2dsZW4gKyAxKTsKKwkJCV9sdm1fZXJybXNnX2xlbiArPSBtc2dsZW47CisJCX0KKwl9CisKKwlpZiAobG9nX29uY2UpIHsKKwkJaWYgKCFfZHVwbGljYXRlZCkKKwkJCV9kdXBsaWNhdGVkID0gZG1faGFzaF9jcmVhdGUoMTI4KTsKKwkJaWYgKF9kdXBsaWNhdGVkKSB7CisJCQlpZiAoZG1faGFzaF9sb29rdXAoX2R1cGxpY2F0ZWQsIG1lc3NhZ2UpKQorCQkJCWxldmVsID0gX0xPR19OT1RJQ0U7CisJCQllbHNlCisJCQkJKHZvaWQpIGRtX2hhc2hfaW5zZXJ0KF9kdXBsaWNhdGVkLCBtZXNzYWdlLCAodm9pZCopMSk7CisJCX0KKwl9CisKKwlpZiAoX2xvZ19yZXBvcnQucmVwb3J0ICYmICFsb2dfYnlwYXNzX3JlcG9ydCAmJiAodXNlX3N0ZGVyciB8fCAobGV2ZWwgPD0gX0xPR19XQVJOKSkpIHsKKwkJb3JpZ19yZXBvcnQgPSBfbG9nX3JlcG9ydC5yZXBvcnQ7CisJCV9sb2dfcmVwb3J0LnJlcG9ydCA9IE5VTEw7CisJCWlmICghcmVwb3J0X2NtZGxvZyhvcmlnX3JlcG9ydCwgX2dldF9sb2dfbGV2ZWxfbmFtZSh1c2Vfc3RkZXJyLCBsZXZlbCksCisJCQkJICAgbG9nX2dldF9yZXBvcnRfY29udGV4dF9uYW1lKF9sb2dfcmVwb3J0LmNvbnRleHQpLAorCQkJCSAgIGxvZ19nZXRfcmVwb3J0X29iamVjdF90eXBlX25hbWUoX2xvZ19yZXBvcnQub2JqZWN0X3R5cGUpLAorCQkJCSAgIF9sb2dfcmVwb3J0Lm9iamVjdF9uYW1lLCBfbG9nX3JlcG9ydC5vYmplY3RfaWQsCisJCQkJICAgX2xvZ19yZXBvcnQub2JqZWN0X2dyb3VwLCBfbG9nX3JlcG9ydC5vYmplY3RfZ3JvdXBfaWQsCisJCQkJICAgbWVzc2FnZSwgX2x2bV9lcnJubywgMCkpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiZmFpbGVkIHRvIHJlcG9ydCBjbWRzdGF0dXMiKSk7CisJCWVsc2UKKwkJCWxvZ2dlZF92aWFfcmVwb3J0ID0gMTsKKworCQlfbG9nX3JlcG9ydC5yZXBvcnQgPSBvcmlnX3JlcG9ydDsKKwl9CisKKwlpZiAoX2x2bTJfbG9nX2ZuKSB7CisJCV9sdm0yX2xvZ19mbihsZXZlbCwgZmlsZSwgbGluZSwgMCwgbWVzc2FnZSk7CisJCWlmIChmYXRhbF9pbnRlcm5hbF9lcnJvcikKKwkJCWFib3J0KCk7CisJCXJldHVybjsKKwl9CisKKyAgICAgIGxvZ19pdDoKKwlpZiAoIWxvZ2dlZF92aWFfcmVwb3J0ICYmICgodmVyYm9zZV9sZXZlbCgpID49IGxldmVsKSAmJiAhX2xvZ19zdXBwcmVzcykpIHsKKwkJaWYgKHZlcmJvc2VfbGV2ZWwoKSA+IF9MT0dfREVCVUcpIHsKKwkJCSh2b2lkKSBkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIyVzOiVkICIsCisJCQkJCSAgIGZpbGUsIGxpbmUpOworCQl9IGVsc2UKKwkJCWJ1ZlswXSA9ICdcMCc7CisKKwkJaWYgKF9pbmRlbnQpCisJCQlzd2l0Y2ggKGxldmVsKSB7CisJCQljYXNlIF9MT0dfTk9USUNFOiBpbmRlbnRfc3BhY2VzID0gIiAgIjsgYnJlYWs7CisJCQljYXNlIF9MT0dfSU5GTzogICBpbmRlbnRfc3BhY2VzID0gIiAgICAiOyBicmVhazsKKwkJCWNhc2UgX0xPR19ERUJVRzogIGluZGVudF9zcGFjZXMgPSAiICAgICAgIjsgYnJlYWs7CisJCQlkZWZhdWx0OiAvKiBub3RoaW5nIHRvIGRvICovOworCQkJfQorCisJCXZhX2NvcHkoYXAsIG9yaWdfYXApOworCQlzd2l0Y2ggKGxldmVsKSB7CisJCWNhc2UgX0xPR19ERUJVRzoKKwkJCWlmICh2ZXJib3NlX2xldmVsKCkgPCBfTE9HX0RFQlVHKQorCQkJCWJyZWFrOworCQkJaWYgKCFkZWJ1Z19jbGFzc19pc19sb2dnZWQoZG1fZXJybm9fb3JfY2xhc3MpKQorCQkJCWJyZWFrOworCQkJaWYgKCh2ZXJib3NlX2xldmVsKCkgPT0gbGV2ZWwpICYmCisJCQkgICAgKHN0cmNtcCgiPGJhY2t0cmFjZT4iLCBmb3JtYXQpID09IDApKQorCQkJCWJyZWFrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQkvKiBUeXBpY2FsbHkgb25seSBsb2dfd2FybiBnb2VzIHRvIHN0ZG91dCAqLworCQkJc3RyZWFtID0gKHVzZV9zdGRlcnIgfHwgKGxldmVsICE9IF9MT0dfV0FSTikpID8gc3RkZXJyIDogc3Rkb3V0OworCQkJaWYgKHN0cmVhbSA9PSBzdGRlcnIpCisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQlmcHJpbnRmKHN0cmVhbSwgIiVzJXMlcyVzIiwgYnVmLCBsb2dfY29tbWFuZF9uYW1lKCksCisJCQkJX21zZ19wcmVmaXgsIGluZGVudF9zcGFjZXMpOworCQkJdmZwcmludGYoc3RyZWFtLCB0cmZvcm1hdCwgYXApOworCQkJZnB1dGMoJ1xuJywgc3RyZWFtKTsKKwkJfQorCQl2YV9lbmQoYXApOworCX0KKworCWlmICgobGV2ZWwgPiBkZWJ1Z19sZXZlbCgpKSB8fAorCSAgICAobGV2ZWwgPj0gX0xPR19ERUJVRyAmJiAhZGVidWdfY2xhc3NfaXNfbG9nZ2VkKGRtX2Vycm5vX29yX2NsYXNzKSkpIHsKKwkJaWYgKGZhdGFsX2ludGVybmFsX2Vycm9yKQorCQkJYWJvcnQoKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChfbG9nX3RvX2ZpbGUgJiYgKF9sb2dfd2hpbGVfc3VzcGVuZGVkIHx8ICFjcml0aWNhbF9zZWN0aW9uKCkpKSB7CisJCWZwcmludGYoX2xvZ19maWxlLCAiJXM6JWQgJXMlcyIsIGZpbGUsIGxpbmUsIGxvZ19jb21tYW5kX25hbWUoKSwKKwkJCV9tc2dfcHJlZml4KTsKKworCQl2YV9jb3B5KGFwLCBvcmlnX2FwKTsKKwkJdmZwcmludGYoX2xvZ19maWxlLCB0cmZvcm1hdCwgYXApOworCQl2YV9lbmQoYXApOworCisJCWZwdXRjKCdcbicsIF9sb2dfZmlsZSk7CisJCWZmbHVzaChfbG9nX2ZpbGUpOworCisJCWlmIChfbG9nX2ZpbGVfbWF4X2xpbmVzICYmICsrX2xvZ19maWxlX2xpbmVzID49IF9sb2dfZmlsZV9tYXhfbGluZXMpCisJCQlmYXRhbF9pbnRlcm5hbF9lcnJvciA9IDE7CisJfQorCisJaWYgKF9zeXNsb2cgJiYgKF9sb2dfd2hpbGVfc3VzcGVuZGVkIHx8ICFjcml0aWNhbF9zZWN0aW9uKCkpKSB7CisJCXZhX2NvcHkoYXAsIG9yaWdfYXApOworCQl2c3lzbG9nKGxldmVsLCB0cmZvcm1hdCwgYXApOworCQl2YV9lbmQoYXApOworCX0KKworCWlmIChmYXRhbF9pbnRlcm5hbF9lcnJvcikKKwkJYWJvcnQoKTsKKworCS8qIEZJWE1FIFRoaXMgY29kZSBpcyB1bmZpbmlzaGVkIC0gcHJlLWV4dGVuZCAmIGNvbmRlbnNlLiAqLworCWlmICghX2FscmVhZHlfbG9nZ2luZyAmJiBfbG9nX2RpcmVjdCAmJiBjcml0aWNhbF9zZWN0aW9uKCkpIHsKKwkJX2FscmVhZHlfbG9nZ2luZyA9IDE7CisJCW1lbXNldCgmYnVmLCAnICcsIHNpemVvZihidWYpKTsKKwkJYnVmdXNlZCA9IDA7CisJCWlmICgobiA9IGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJICAgICAgIiVzOiVkICVzJXMiLCBmaWxlLCBsaW5lLCBsb2dfY29tbWFuZF9uYW1lKCksCisJCQkJICAgICAgX21zZ19wcmVmaXgpKSA9PSAtMSkKKwkJCWdvdG8gZG9uZTsKKworCQlidWZ1c2VkICs9IG47CQkvKiBuIGRvZXMgbm90IGluY2x1ZGUgJ1wwJyAqLworCisJCXZhX2NvcHkoYXAsIG9yaWdfYXApOworCQluID0gdnNucHJpbnRmKGJ1ZiArIGJ1ZnVzZWQsIHNpemVvZihidWYpIC0gYnVmdXNlZCwKKwkJCSAgICAgIHRyZm9ybWF0LCBhcCk7CisJCXZhX2VuZChhcCk7CisKKwkJaWYgKG4gPCAwKQorCQkJZ290byBkb25lOworCisJCWJ1ZnVzZWQgKz0gbjsKKwkJaWYgKG4gPj0gKGludCkgc2l6ZW9mKGJ1ZikpCisJCQlidWZ1c2VkID0gc2l6ZW9mKGJ1ZikgLSAxOworCSAgICAgIGRvbmU6CisJCWJ1ZltidWZ1c2VkXSA9ICdcbic7CisJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1xuJzsKKwkJLyogRklYTUUgcmVhbCBzaXplIGJ1ZnVzZWQgKi8KKwkJZGV2X2FwcGVuZCgmX2xvZ19kZXYsIHNpemVvZihidWYpLCBidWYpOworCQlfYWxyZWFkeV9sb2dnaW5nID0gMDsKKwl9Cit9CisKK3ZvaWQgcHJpbnRfbG9nKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBkbV9lcnJub19vcl9jbGFzcywKKwkgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCV92cHJpbnRfbG9nKGxldmVsLCBmaWxlLCBsaW5lLCBkbV9lcnJub19vcl9jbGFzcywgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBwcmludF9sb2dfbGliZG0oaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLAorCQkgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkvKgorCSAqIEJ5cGFzcyByZXBvcnQgaWYgcHJpbnRpbmcgb3V0cHV0IGZyb20gbGliZG0gYW5kIGlmIHdlIGhhdmUKKwkgKiBMT0dfV0FSTiBsZXZlbCBhbmQgaXQncyBub3QgZ29pbmcgdG8gc3RkZXJyIChzbyB3ZSdyZQorCSAqIHByaW50aW5nIGNvbW1vbiBtZXNzYWdlIHRoYXQgaXMgbm90IGFuIGVycm9yL3dhcm5pbmcpLgorCSovCisJaWYgKCEobGV2ZWwgJiBfTE9HX1NUREVSUikgJiYKKwkgICAgKChsZXZlbCAmIH4oX0xPR19TVERFUlJ8X0xPR19PTkNFfF9MT0dfQllQQVNTX1JFUE9SVCkpID09IF9MT0dfV0FSTikpCisJCWxldmVsIHw9IF9MT0dfQllQQVNTX1JFUE9SVDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCV92cHJpbnRfbG9nKGxldmVsLCBmaWxlLCBsaW5lLCBkbV9lcnJub19vcl9jbGFzcywgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworbG9nX3JlcG9ydF90IGxvZ19nZXRfcmVwb3J0X3N0YXRlKHZvaWQpCit7CisJcmV0dXJuIF9sb2dfcmVwb3J0OworfQorCit2b2lkIGxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShsb2dfcmVwb3J0X3QgbG9nX3JlcG9ydCkKK3sKKwlfbG9nX3JlcG9ydCA9IGxvZ19yZXBvcnQ7Cit9CisKK3ZvaWQgbG9nX3NldF9yZXBvcnQoc3RydWN0IGRtX3JlcG9ydCAqcmVwb3J0KQoreworCV9sb2dfcmVwb3J0LnJlcG9ydCA9IHJlcG9ydDsKK30KKwordm9pZCBsb2dfc2V0X3JlcG9ydF9jb250ZXh0KGxvZ19yZXBvcnRfY29udGV4dF90IGNvbnRleHQpCit7CisJX2xvZ19yZXBvcnQuY29udGV4dCA9IGNvbnRleHQ7Cit9CisKK3ZvaWQgbG9nX3NldF9yZXBvcnRfb2JqZWN0X3R5cGUobG9nX3JlcG9ydF9vYmplY3RfdHlwZV90IG9iamVjdF90eXBlKQoreworCV9sb2dfcmVwb3J0Lm9iamVjdF90eXBlID0gb2JqZWN0X3R5cGU7Cit9CisKK3ZvaWQgbG9nX3NldF9yZXBvcnRfb2JqZWN0X2dyb3VwX2FuZF9ncm91cF9pZChjb25zdCBjaGFyICpncm91cCwgY29uc3QgY2hhciAqaWQpCit7CisJX2xvZ19yZXBvcnQub2JqZWN0X2dyb3VwID0gZ3JvdXA7CisJX2xvZ19yZXBvcnQub2JqZWN0X2dyb3VwX2lkID0gaWQ7Cit9CisKK3ZvaWQgbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmlkKQoreworCV9sb2dfcmVwb3J0Lm9iamVjdF9uYW1lID0gbmFtZTsKKwlfbG9nX3JlcG9ydC5vYmplY3RfaWQgPSBpZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9sb2cvbG9nLmggYi9saWIvbG9nL2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzYyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbG9nL2xvZy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTE9HX0gKKyNkZWZpbmUgX0xWTV9MT0dfSAorCisvKgorICogcHJpbnRmKCktc3R5bGUgbWFjcm9zIHRvIHVzZSBmb3IgbWVzc2FnZXM6CisgKgorICogICBsb2dfZXJyb3IgICAtIGFsd2F5cyBwcmludCB0byBzdGRlcnIuCisgKiAgIGxvZ19wcmludCAgIC0gYWx3YXlzIHByaW50IHRvIHN0ZG91dC4gIFVzZSB0aGlzIGluc3RlYWQgb2YgcHJpbnRmLgorICogICBsb2dfdmVyYm9zZSAtIHByaW50IHRvIHN0ZG91dCBpZiB2ZXJib3NlIGlzIHNldCAoLXYpCisgKiAgIGxvZ192ZXJ5X3ZlcmJvc2UgLSBwcmludCB0byBzdGRvdXQgaWYgdmVyYm9zZSBpcyBzZXQgdHdpY2UgKC12dikKKyAqICAgbG9nX2RlYnVnICAgLSBwcmludCB0byBzdGRvdXQgaWYgdmVyYm9zZSBpcyBzZXQgdGhyZWUgdGltZXMgKC12dnYpCisgKgorICogSW4gYWRkaXRpb24sIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkIHRvIGZpbGUgb3Igc3lzbG9nIGlmIHRoZXkKKyAqIGFyZSBtb3JlIHNlcmlvdXMgdGhhbiB0aGUgbG9nIGxldmVsIHNwZWNpZmllZCB3aXRoIHRoZSBsb2cvZGVidWdfbGV2ZWwKKyAqIHBhcmFtZXRlciBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlc2UgbWVzc2FnZXMgZ2V0IHRoZSBmaWxlCisgKiBhbmQgbGluZSBudW1iZXIgcHJlcGVuZGVkLiAgJ3N0YWNrJyAod2l0aG91dCBhcmd1bWVudHMpIGNhbiBiZSB1c2VkIAorICogdG8gbG9nIHRoaXMgaW5mb3JtYXRpb24gYXQgZGVidWcgbGV2ZWwuCisgKgorICogbG9nX3N5c19lcnJvciBhbmQgbG9nX3N5c192ZXJ5X3ZlcmJvc2UgYXJlIGZvciBlcnJvcnMgZnJvbSBzeXN0ZW0gY2FsbHMKKyAqIGUuZy4gbG9nX3N5c19lcnJvcigic3RhdCIsIGZpbGVuYW1lKTsKKyAqICAgICAgL2Rldi9mZC83OiBzdGF0IGZhaWxlZDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBFVU5DTEFTU0lGSUVEIC0xCS8qIEdlbmVyaWMgZXJyb3IgY29kZSAqLworCisjZGVmaW5lIF9MT0dfRkFUQUwgICAgICAgICAweDAwMDIKKyNkZWZpbmUgX0xPR19FUlIgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBfTE9HX1dBUk4gICAgICAgICAgMHgwMDA0CisjZGVmaW5lIF9MT0dfTk9USUNFICAgICAgICAweDAwMDUKKyNkZWZpbmUgX0xPR19JTkZPICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBfTE9HX0RFQlVHICAgICAgICAgMHgwMDA3CisjZGVmaW5lIF9MT0dfU1RERVJSICAgICAgICAweDAwODAgLyogZm9yY2UgdGhpbmdzIHRvIGdvIHRvIHN0ZGVyciwgZXZlbiBpZiBsb2dsZXZlbCB3b3VsZCBtYWtlIHRoZW0gZ28gdG8gc3Rkb3V0ICovCisjZGVmaW5lIF9MT0dfT05DRSAgICAgICAgICAweDAxMDAgLyogZG93bmdyYWRlIHRvIE5PVElDRSBpZiB0aGlzIGhhcyBiZWVuIGFscmVhZHkgbG9nZ2VkICovCisjZGVmaW5lIF9MT0dfQllQQVNTX1JFUE9SVCAweDAyMDAgLyogZG8gbm90IGxvZyB0aHJvdWdoIHJlcG9ydCBldmVuIGlmIHJlcG9ydCBhdmFpbGFibGUgKi8KKworI2RlZmluZSBJTlRFUk5BTF9FUlJPUiAiSW50ZXJuYWwgZXJyb3I6ICIKKworLyoKKyAqIENsYXNzZXMgYXZhaWxhYmxlIGZvciBkZWJ1ZyBsb2cgbWVzc2FnZXMuCisgKiBUaGVzZSBhcmUgYWxzbyBsaXN0ZWQgaW4gZG9jL2V4YW1wbGUuY29uZgorICogYW5kIGxpYi9jb21tYW5kcy90b29sY29udGV4dC5jOl9wYXJzZV9kZWJ1Z19jbGFzc2VzKCkKKyAqLworI2RlZmluZSBMT0dfQ0xBU1NfTUVNCQkweDAwMDEJLyogIm1lbW9yeSIgKi8KKyNkZWZpbmUgTE9HX0NMQVNTX0RFVlMJCTB4MDAwMgkvKiAiZGV2aWNlcyIgKi8KKyNkZWZpbmUgTE9HX0NMQVNTX0FDVElWQVRJT04JMHgwMDA0CS8qICJhY3RpdmF0aW9uIiAqLworI2RlZmluZSBMT0dfQ0xBU1NfQUxMT0MJCTB4MDAwOAkvKiAiYWxsb2NhdGlvbiIgKi8KKyNkZWZpbmUgTE9HX0NMQVNTX0xWTUVUQUQJMHgwMDEwCS8qICJsdm1ldGFkIiAqLworI2RlZmluZSBMT0dfQ0xBU1NfTUVUQURBVEEJMHgwMDIwCS8qICJtZXRhZGF0YSIgKi8KKyNkZWZpbmUgTE9HX0NMQVNTX0NBQ0hFCQkweDAwNDAJLyogImNhY2hlIiAqLworI2RlZmluZSBMT0dfQ0xBU1NfTE9DS0lORwkweDAwODAJLyogImxvY2tpbmciICovCisjZGVmaW5lIExPR19DTEFTU19MVk1QT0xMRAkweDAxMDAJLyogImx2bXBvbGxkIiAqLworI2RlZmluZSBMT0dfQ0xBU1NfREJVUwkJMHgwMjAwCS8qICJkYnVzIiAqLworCisjZGVmaW5lIGxvZ19kZWJ1Zyh4Li4uKSBMT0dfTElORShfTE9HX0RFQlVHLCB4KQorI2RlZmluZSBsb2dfZGVidWdfbWVtKHguLi4pIExPR19MSU5FX1dJVEhfQ0xBU1MoX0xPR19ERUJVRywgTE9HX0NMQVNTX01FTSwgeCkKKyNkZWZpbmUgbG9nX2RlYnVnX2RldnMoeC4uLikgTE9HX0xJTkVfV0lUSF9DTEFTUyhfTE9HX0RFQlVHLCBMT0dfQ0xBU1NfREVWUywgeCkKKyNkZWZpbmUgbG9nX2RlYnVnX2FjdGl2YXRpb24oeC4uLikgTE9HX0xJTkVfV0lUSF9DTEFTUyhfTE9HX0RFQlVHLCBMT0dfQ0xBU1NfQUNUSVZBVElPTiwgeCkKKyNkZWZpbmUgbG9nX2RlYnVnX2FsbG9jKHguLi4pIExPR19MSU5FX1dJVEhfQ0xBU1MoX0xPR19ERUJVRywgTE9HX0NMQVNTX0FMTE9DLCB4KQorI2RlZmluZSBsb2dfZGVidWdfbHZtZXRhZCh4Li4uKSBMT0dfTElORV9XSVRIX0NMQVNTKF9MT0dfREVCVUcsIExPR19DTEFTU19MVk1FVEFELCB4KQorI2RlZmluZSBsb2dfZGVidWdfbWV0YWRhdGEoeC4uLikgTE9HX0xJTkVfV0lUSF9DTEFTUyhfTE9HX0RFQlVHLCBMT0dfQ0xBU1NfTUVUQURBVEEsIHgpCisjZGVmaW5lIGxvZ19kZWJ1Z19jYWNoZSh4Li4uKSBMT0dfTElORV9XSVRIX0NMQVNTKF9MT0dfREVCVUcsIExPR19DTEFTU19DQUNIRSwgeCkKKyNkZWZpbmUgbG9nX2RlYnVnX2xvY2tpbmcoeC4uLikgTE9HX0xJTkVfV0lUSF9DTEFTUyhfTE9HX0RFQlVHLCBMT0dfQ0xBU1NfTE9DS0lORywgeCkKKyNkZWZpbmUgbG9nX2RlYnVnX2x2bXBvbGxkKHguLi4pIExPR19MSU5FX1dJVEhfQ0xBU1MoX0xPR19ERUJVRywgTE9HX0NMQVNTX0xWTVBPTExELCB4KQorI2RlZmluZSBsb2dfZGVidWdfZGJ1cyh4Li4uKSBMT0dfTElORV9XSVRIX0NMQVNTKF9MT0dfREVCVUcsIExPR19DTEFTU19EQlVTLCB4KQorCisjZGVmaW5lIGxvZ19pbmZvKHguLi4pIExPR19MSU5FKF9MT0dfSU5GTywgeCkKKyNkZWZpbmUgbG9nX25vdGljZSh4Li4uKSBMT0dfTElORShfTE9HX05PVElDRSwgeCkKKyNkZWZpbmUgbG9nX3dhcm4oeC4uLikgTE9HX0xJTkUoX0xPR19XQVJOIHwgX0xPR19TVERFUlIsIHgpCisjZGVmaW5lIGxvZ193YXJuX3N1cHByZXNzKHMsIHguLi4pIExPR19MSU5FKHMgPyBfTE9HX05PVElDRSA6IF9MT0dfV0FSTiB8IF9MT0dfU1RERVJSLCB4KQorI2RlZmluZSBsb2dfZXJyKHguLi4pIExPR19MSU5FX1dJVEhfRVJSTk8oX0xPR19FUlIsIEVVTkNMQVNTSUZJRUQsIHgpCisjZGVmaW5lIGxvZ19lcnJfc3VwcHJlc3MocywgeC4uLikgTE9HX0xJTkVfV0lUSF9FUlJOTyhzID8gX0xPR19OT1RJQ0UgOiBfTE9HX0VSUiwgRVVOQ0xBU1NJRklFRCwgeCkKKyNkZWZpbmUgbG9nX2Vycl9vbmNlKHguLi4pIExPR19MSU5FX1dJVEhfRVJSTk8oX0xPR19FUlIgfCBfTE9HX09OQ0UsIEVVTkNMQVNTSUZJRUQsIHgpCisjZGVmaW5lIGxvZ19mYXRhbCh4Li4uKSBMT0dfTElORV9XSVRIX0VSUk5PKF9MT0dfRkFUQUwsIEVVTkNMQVNTSUZJRUQsIHgpCisKKyNkZWZpbmUgc3RhY2sgbG9nX2RlYnVnKCI8YmFja3RyYWNlPiIpCS8qIEJhY2t0cmFjZSBvbiBlcnJvciAqLworI2RlZmluZSBsb2dfdmVyeV92ZXJib3NlKGFyZ3MuLi4pIGxvZ19pbmZvKGFyZ3MpCisjZGVmaW5lIGxvZ192ZXJib3NlKGFyZ3MuLi4pIGxvZ19ub3RpY2UoYXJncykKKyNkZWZpbmUgbG9nX3ByaW50KGFyZ3MuLi4pIExPR19MSU5FKF9MT0dfV0FSTiwgYXJncykKKyNkZWZpbmUgbG9nX3ByaW50X3VubGVzc19zaWxlbnQoYXJncy4uLikgTE9HX0xJTkUoc2lsZW50X21vZGUoKSA/IF9MT0dfTk9USUNFIDogX0xPR19XQVJOLCBhcmdzKQorI2RlZmluZSBsb2dfZXJyb3IoYXJncy4uLikgbG9nX2VycihhcmdzKQorI2RlZmluZSBsb2dfZXJyb3Jfc3VwcHJlc3MocywgYXJncy4uLikgbG9nX2Vycl9zdXBwcmVzcyhzLCBhcmdzKQorI2RlZmluZSBsb2dfZXJyb3Jfb25jZShhcmdzLi4uKSBsb2dfZXJyX29uY2UoYXJncykKKyNkZWZpbmUgbG9nX2Vycm5vKGFyZ3MuLi4pIExPR19MSU5FX1dJVEhfRVJSTk8oX0xPR19FUlIsIGFyZ3MpCisKKy8qIFN5c3RlbSBjYWxsIGVxdWl2YWxlbnRzICovCisjZGVmaW5lIGxvZ19zeXNfZXJyb3IoeCwgeSkgXAorCQlsb2dfZXJyKCIlcyVzJXMgZmFpbGVkOiAlcyIsIHksICp5ID8gIjogIiA6ICIiLCB4LCBzdHJlcnJvcihlcnJubykpCisjZGVmaW5lIGxvZ19zeXNfZXJyb3Jfc3VwcHJlc3MocywgeCwgeSkgXAorCQlsb2dfZXJyX3N1cHByZXNzKHMsICIlcyVzJXMgZmFpbGVkOiAlcyIsIHksICp5ID8gIjogIiA6ICIiLCB4LCBzdHJlcnJvcihlcnJubykpCisjZGVmaW5lIGxvZ19zeXNfdmVyeV92ZXJib3NlKHgsIHkpIFwKKwkJbG9nX2luZm8oIiVzOiAlcyBmYWlsZWQ6ICVzIiwgeSwgeCwgc3RyZXJyb3IoZXJybm8pKQorI2RlZmluZSBsb2dfc3lzX2RlYnVnKHgsIHkpIFwKKwkJbG9nX2RlYnVnKCIlczogJXMgZmFpbGVkOiAlcyIsIHksIHgsIHN0cmVycm9yKGVycm5vKSkKKworI2RlZmluZSByZXR1cm5fMAlkbyB7IHN0YWNrOyByZXR1cm4gMDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmV0dXJuX05VTEwJZG8geyBzdGFjazsgcmV0dXJuIE5VTEw7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJldHVybl9FSU5WQUxJRF9DTURfTElORSBcCisJCQlkbyB7IHN0YWNrOyByZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJldHVybl9FQ01EX0ZBSUxFRCBkbyB7IHN0YWNrOyByZXR1cm4gRUNNRF9GQUlMRUQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIGdvdG9fb3V0CWRvIHsgc3RhY2s7IGdvdG8gb3V0OyB9IHdoaWxlICgwKQorI2RlZmluZSBnb3RvX2JhZAlkbyB7IHN0YWNrOyBnb3RvIGJhZDsgfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbG9nL2x2bS1sb2dnaW5nLmggYi9saWIvbG9nL2x2bS1sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMWJjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sb2cvbHZtLWxvZ2dpbmcuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0xPR0dJTkdfSAorI2RlZmluZSBfTFZNX0xPR0dJTkdfSAorCitfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgNSwgNikpKQordm9pZCBwcmludF9sb2coaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLAorCSAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKK19fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCA1LCA2KSkpCit2b2lkIHByaW50X2xvZ19saWJkbShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgZG1fZXJybm9fb3JfY2xhc3MsCisJCSAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisjZGVmaW5lIExPR19MSU5FKGwsIHguLi4pIFwKKyAgICBwcmludF9sb2cobCwgX19GSUxFX18sIF9fTElORV9fICwgMCwgIyMgeCkKKworI2RlZmluZSBMT0dfTElORV9XSVRIX0VSUk5PKGwsIGUsIHguLi4pIFwKKyAgICBwcmludF9sb2cobCwgX19GSUxFX18sIF9fTElORV9fICwgZSwgIyMgeCkKKworI2RlZmluZSBMT0dfTElORV9XSVRIX0NMQVNTKGwsIGMsIHguLi4pIFwKKyAgICBwcmludF9sb2cobCwgX19GSUxFX18sIF9fTElORV9fICwgYywgIyMgeCkKKworI2luY2x1ZGUgImxvZy5oIgorCit0eXBlZGVmIHZvaWQgKCpsdm0yX2xvZ19mbl90KSAoaW50IGxldmVsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCSAgICAgICBpbnQgZG1fZXJybm9fb3JfY2xhc3MsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworCit2b2lkIGluaXRfbG9nX2ZuKGx2bTJfbG9nX2ZuX3QgbG9nX2ZuKTsKKwordm9pZCBpbml0X2luZGVudChpbnQgaW5kZW50KTsKK3ZvaWQgaW5pdF9tc2dfcHJlZml4KGNvbnN0IGNoYXIgKnByZWZpeCk7CisKK3ZvaWQgaW5pdF9sb2dfZmlsZShjb25zdCBjaGFyICpsb2dfZmlsZSwgaW50IGFwcGVuZCk7Cit2b2lkIHVubGlua19sb2dfZmlsZShpbnQgcmV0KTsKK3ZvaWQgaW5pdF9sb2dfZGlyZWN0KGNvbnN0IGNoYXIgKmxvZ19maWxlLCBpbnQgYXBwZW5kKTsKK3ZvaWQgaW5pdF9sb2dfd2hpbGVfc3VzcGVuZGVkKGludCBsb2dfd2hpbGVfc3VzcGVuZGVkKTsKK3ZvaWQgaW5pdF9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnMoaW50IGZhdGFsKTsKKwordm9pZCBmaW5fbG9nKHZvaWQpOwordm9pZCByZWxlYXNlX2xvZ19tZW1vcnkodm9pZCk7Cit2b2lkIHJlc2V0X2xvZ19kdXBsaWNhdGVkKHZvaWQpOworCit2b2lkIGluaXRfc3lzbG9nKGludCBmYWNpbGl0eSk7Cit2b2lkIGZpbl9zeXNsb2codm9pZCk7CisKK2ludCBlcnJvcl9tZXNzYWdlX3Byb2R1Y2VkKHZvaWQpOwordm9pZCByZXNldF9sdm1fZXJybm8oaW50IHN0b3JlX2Vycm1zZyk7CitpbnQgc3RvcmVkX2Vycm5vKHZvaWQpOworY29uc3QgY2hhciAqc3RvcmVkX2Vycm1zZyh2b2lkKTsKK2NvbnN0IGNoYXIgKnN0b3JlZF9lcnJtc2dfd2l0aF9jbGVhcih2b2lkKTsKKworLyogU3VwcHJlc3MgbWVzc2FnZXMgdG8gc3Rkb3V0L3N0ZGVyciAoMSkgb3IgZXZlcnl3aGVyZSAoMikgKi8KKy8qIFJldHVybnMgcHJldmlvdXMgc2V0dGluZyAqLworaW50IGxvZ19zdXBwcmVzcyhpbnQgc3VwcHJlc3MpOworCisvKiBTdXBwcmVzcyBtZXNzYWdlcyB0byBzeXNsb2cgKi8KK3ZvaWQgc3lzbG9nX3N1cHByZXNzKGludCBzdXBwcmVzcyk7CisKKy8qIEhvb2tzIHRvIGhhbmRsZSBsb2dnaW5nIHRocm91Z2ggcmVwb3J0LiAqLwordHlwZWRlZiBlbnVtIHsKKwlMT0dfUkVQT1JUX0NPTlRFWFRfTlVMTCwKKwlMT0dfUkVQT1JUX0NPTlRFWFRfUFJPQ0VTU0lORywKKwlMT0dfUkVQT1JUX0NPTlRFWFRfQ09VTlQKK30gbG9nX3JlcG9ydF9jb250ZXh0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisJTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9OVUxMLAorCUxPR19SRVBPUlRfT0JKRUNUX1RZUEVfT1JQSEFOLAorCUxPR19SRVBPUlRfT0JKRUNUX1RZUEVfUFYsCisJTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9MQUJFTCwKKwlMT0dfUkVQT1JUX09CSkVDVF9UWVBFX1ZHLAorCUxPR19SRVBPUlRfT0JKRUNUX1RZUEVfTFYsCisJTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9DT1VOVAorfSBsb2dfcmVwb3J0X29iamVjdF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGxvZ19yZXBvcnQgeworCXN0cnVjdCBkbV9yZXBvcnQgKnJlcG9ydDsKKwlsb2dfcmVwb3J0X2NvbnRleHRfdCBjb250ZXh0OworCWxvZ19yZXBvcnRfb2JqZWN0X3R5cGVfdCBvYmplY3RfdHlwZTsKKwljb25zdCBjaGFyICpvYmplY3RfbmFtZTsKKwljb25zdCBjaGFyICpvYmplY3RfaWQ7CisJY29uc3QgY2hhciAqb2JqZWN0X2dyb3VwOworCWNvbnN0IGNoYXIgKm9iamVjdF9ncm91cF9pZDsKK30gbG9nX3JlcG9ydF90OworCitsb2dfcmVwb3J0X3QgbG9nX2dldF9yZXBvcnRfc3RhdGUodm9pZCk7Cit2b2lkIGxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShsb2dfcmVwb3J0X3QgbG9nX3JlcG9ydCk7CisKK3ZvaWQgbG9nX3NldF9yZXBvcnQoc3RydWN0IGRtX3JlcG9ydCAqcmVwb3J0KTsKK3ZvaWQgbG9nX3NldF9yZXBvcnRfY29udGV4dChsb2dfcmVwb3J0X2NvbnRleHRfdCBjb250ZXh0KTsKK3ZvaWQgbG9nX3NldF9yZXBvcnRfb2JqZWN0X3R5cGUobG9nX3JlcG9ydF9vYmplY3RfdHlwZV90IG9iamVjdF90eXBlKTsKK3ZvaWQgbG9nX3NldF9yZXBvcnRfb2JqZWN0X2dyb3VwX2FuZF9ncm91cF9pZChjb25zdCBjaGFyICpncm91cCwgY29uc3QgY2hhciAqZ3JvdXBfaWQpOwordm9pZCBsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaWQpOworCitjb25zdCBjaGFyICpsb2dfZ2V0X3JlcG9ydF9jb250ZXh0X25hbWUobG9nX3JlcG9ydF9jb250ZXh0X3QgY29udGV4dCk7Citjb25zdCBjaGFyICpsb2dfZ2V0X3JlcG9ydF9vYmplY3RfdHlwZV9uYW1lKGxvZ19yZXBvcnRfb2JqZWN0X3R5cGVfdCBvYmplY3RfdHlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2x2bXBvbGxkL2x2bXBvbGxkLWNsaWVudC5jIGIvbGliL2x2bXBvbGxkL2x2bXBvbGxkLWNsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTJmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHZtcG9sbGQvbHZtcG9sbGQtY2xpZW50LmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisjaW5jbHVkZSAiZGFlbW9uLWlvLmgiCisjaW5jbHVkZSAibHZtcG9sbGQtY2xpZW50LmgiCisjaW5jbHVkZSAibHZtcG9sbGQtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS1leHBvcnRlZC5oIgorI2luY2x1ZGUgInBvbGxkYWVtb24uaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bTJjbWQuaCIKKworc3RydWN0IHByb2dyZXNzX2luZm8geworCXVuc2lnbmVkIGVycm9yOjE7CisJdW5zaWduZWQgZmluaXNoZWQ6MTsKKwlpbnQgY21kX3NpZ25hbDsKKwlpbnQgY21kX3JldGNvZGU7Cit9OworCitzdGF0aWMgaW50IF9sdm1wb2xsZF91c2U7CitzdGF0aWMgaW50IF9sdm1wb2xsZF9jb25uZWN0ZWQ7CitzdGF0aWMgY29uc3QgY2hhciogX2x2bXBvbGxkX3NvY2tldDsKKworc3RhdGljIGRhZW1vbl9oYW5kbGUgX2x2bXBvbGxkID0geyAuZXJyb3IgPSAwIH07CisKK3N0YXRpYyBkYWVtb25faGFuZGxlIF9sdm1wb2xsZF9vcGVuKGNvbnN0IGNoYXIgKnNvY2tldCkKK3sKKwlkYWVtb25faW5mbyBsdm1wb2xsZF9pbmZvID0geworCQkucGF0aCA9ICJsdm1wb2xsZCIsCisJCS5zb2NrZXQgPSBzb2NrZXQgPzogTFZNUE9MTERfU09DS0VULAorCQkucHJvdG9jb2wgPSBMVk1QT0xMRF9QUk9UT0NPTCwKKwkJLnByb3RvY29sX3ZlcnNpb24gPSBMVk1QT0xMRF9QUk9UT0NPTF9WRVJTSU9OCisJfTsKKworCXJldHVybiBkYWVtb25fb3Blbihsdm1wb2xsZF9pbmZvKTsKK30KKwordm9pZCBsdm1wb2xsZF9zZXRfYWN0aXZlKGludCBhY3RpdmUpCit7CisJX2x2bXBvbGxkX3VzZSA9IGFjdGl2ZTsKK30KKwordm9pZCBsdm1wb2xsZF9zZXRfc29ja2V0KGNvbnN0IGNoYXIgKnNvY2tldCkKK3sKKwlfbHZtcG9sbGRfc29ja2V0ID0gc29ja2V0OworfQorCitzdGF0aWMgdm9pZCBfbHZtcG9sbGRfY29ubmVjdF9vcl93YXJuKHZvaWQpCit7CisJaWYgKCFfbHZtcG9sbGRfY29ubmVjdGVkICYmICFfbHZtcG9sbGQuZXJyb3IpIHsKKwkJX2x2bXBvbGxkID0gX2x2bXBvbGxkX29wZW4oX2x2bXBvbGxkX3NvY2tldCk7CisJCWlmICggX2x2bXBvbGxkLnNvY2tldF9mZCA+PSAwICYmICFfbHZtcG9sbGQuZXJyb3IpIHsKKwkJCWxvZ19kZWJ1Z19sdm1wb2xsZCgiU3VjZXNzZnVsbHkgY29ubmVjdGVkIHRvIGx2bXBvbGxkIG9uIGZkICVkLiIsIF9sdm1wb2xsZC5zb2NrZXRfZmQpOworCQkJX2x2bXBvbGxkX2Nvbm5lY3RlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QgdG8gbHZtcG9sbGQuIFByb2NlZWRpbmcgd2l0aCBwb2xsaW5nIHdpdGhvdXQgdXNpbmcgbHZtcG9sbGQuIik7CisJCQlsb2dfd2FybigiV0FSTklORzogQ2hlY2sgZ2xvYmFsL3VzZV9sdm1wb2xsZCBpbiBsdm0uY29uZiBvciB0aGUgbHZtcG9sbGQgZGFlbW9uIHN0YXRlLiIpOworCQl9CisJfQorfQorCitpbnQgbHZtcG9sbGRfdXNlKHZvaWQpCit7CisJaWYgKCFfbHZtcG9sbGRfdXNlIHx8ICFfbHZtcG9sbGRfc29ja2V0KQorCQlyZXR1cm4gMDsKKworCV9sdm1wb2xsZF9jb25uZWN0X29yX3dhcm4oKTsKKworCXJldHVybiBfbHZtcG9sbGRfY29ubmVjdGVkOworfQorCit2b2lkIGx2bXBvbGxkX2Rpc2Nvbm5lY3Qodm9pZCkKK3sKKwlpZiAoX2x2bXBvbGxkX2Nvbm5lY3RlZCkgeworCQlkYWVtb25fY2xvc2UoX2x2bXBvbGxkKTsKKwkJX2x2bXBvbGxkX2Nvbm5lY3RlZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBfZXhwbGFpbl9lcnJvcl9jb2RlcyhpbnQgcmV0Y29kZSkKK3sKKwlzd2l0Y2ggKHJldGNvZGUpIHsKKwkvKiBMVk0yIHJldHVybiBjb2RlcyAqLworCWNhc2UgTFZNMl9OT19TVUNIX0NPTU1BTkQ6CisJCWxvZ19lcnJvcigiTFZNIGNvbW1hbmQgcnVuIGJ5IGx2bXBvbGxkIHJlc3BvbmRlZCB3aXRoOiAnTm8gc3VjaCBjb21tYW5kLiciKTsKKwkJYnJlYWs7CisJY2FzZSBMVk0yX0lOVkFMSURfUEFSQU1FVEVSUzoKKwkJbG9nX2Vycm9yKCJMVk0gY29tbWFuZCBydW4gYnkgbHZtcG9sbGQgZmFpbGVkIGR1ZSB0byBpbnZhbGlkIHBhcmFtZXRlcnMuIik7CisJCWJyZWFrOworCWNhc2UgTFZNMl9QUk9DRVNTSU5HX0ZBSUxFRDoKKwkJbG9nX2Vycm9yKCJMVk0gY29tbWFuZCBleGVjdXRlZCBieSBsdm1wb2xsZCBmYWlsZWQuIik7CisJCWJyZWFrOworCisJLyogbHZtcG9sbGQgc3BlY2lmaWMgcmV0dXJuIGNvZGVzICovCisJY2FzZSBMVk1QRF9SRVRfRFVQX0ZBSUxFRDoKKwkJbG9nX2Vycm9yKCJsdm1wb2xsZCBmYWlsZWQgdG8gZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvcnMuIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgTFZNUERfUkVUX0VYQ19GQUlMRUQ6CisJCWxvZ19lcnJvcigibHZtcG9sbGQgZmFpbGVkIHRvIGV4ZWMoKSBsdm0gYmluYXJ5LiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoImx2bXBvbGxkIHJlc3BvbmRlZCB3aXRoIHVuZXhwZWN0ZWQgcmV0dXJuIGNvZGUuIik7CisJfQorCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBsdm1wb2xsZCBtZXNzYWdlcyBpbiBzeXNsb2cgb3IgbHZtcG9sbGQgbG9nIGZpbGUuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9wcm9jZXNzX2Vycm9yX3Jlc3BvbnNlKGRhZW1vbl9yZXBseSByZXApCit7CisJaWYgKCFzdHJjbXAoZGFlbW9uX3JlcGx5X3N0cihyZXAsICJyZXNwb25zZSIsICIiKSwgTFZNUERfUkVTUF9GQUlMRUQpKQorCQlsb2dfZXJyb3IoImx2bXBvbGxkIGZhaWxlZCB0byBwcm9jZXNzIGEgcmVxdWVzdC4gVGhlIHJlYXNvbiB3YXM6ICVzLiIsCisJCQkgIGRhZW1vbl9yZXBseV9zdHIocmVwLCAicmVhc29uIiwgIjxlbXB0eT4iKSk7CisJZWxzZSBpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlc3BvbnNlIiwgIiIpLCBMVk1QRF9SRVNQX0VJTlZBTCkpCisJCWxvZ19lcnJvcigibHZtcG9sbGQgY291bGRuJ3QgaGFuZGxlIGEgcmVxdWVzdC4gIgorCQkJICAiSXQgbWlnaHQgYmUgZHVlIHRvIGRhZW1vbiBpbnRlcm5hbCBzdGF0ZS4gVGhlIHJlYXNvbiB3YXM6ICVzLiIsCisJCQkgIGRhZW1vbl9yZXBseV9zdHIocmVwLCAicmVhc29uIiwgIjxlbXB0eT4iKSk7CisJZWxzZQorCQlsb2dfZXJyb3IoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgJXMuIFRoZSByZWFzb246ICVzLiIsCisJCQkgIGRhZW1vbl9yZXBseV9zdHIocmVwLCAicmVzcG9uc2UiLCAiPGVtcHR5PiIpLAorCQkJICBkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlYXNvbiIsICI8ZW1wdHk+IikpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBsdm1wb2xsZCBtZXNzYWdlcyBpbiBzeXNsb2cgb3IgbHZtcG9sbGQgbG9nIGZpbGUuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ3Jlc3NfaW5mbyBfcmVxdWVzdF9wcm9ncmVzc19pbmZvKGNvbnN0IGNoYXIgKnV1aWQsIHVuc2lnbmVkIGFib3J0X3BvbGxpbmcpCit7CisJZGFlbW9uX3JlcGx5IHJlcDsKKwljb25zdCBjaGFyICplID0gZ2V0ZW52KCJMVk1fU1lTVEVNX0RJUiIpOworCXN0cnVjdCBwcm9ncmVzc19pbmZvIHJldCA9IHsgLmVycm9yID0gMSwgLmZpbmlzaGVkID0gMSB9OworCWRhZW1vbl9yZXF1ZXN0IHJlcSA9IGRhZW1vbl9yZXF1ZXN0X21ha2UoTFZNUERfUkVRX1BST0dSRVNTKTsKKworCWlmICghZGFlbW9uX3JlcXVlc3RfZXh0ZW5kKHJlcSwgTFZNUERfUEFSTV9MVklEICIgPSAlcyIsIHV1aWQsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSAiIExWTVBEX1JFUV9QUk9HUkVTUyAiIHJlcXVlc3QuIik7CisJCWdvdG8gb3V0X3JlcTsKKwl9CisKKwlpZiAoYWJvcnRfcG9sbGluZyAmJgorCSAgICAhZGFlbW9uX3JlcXVlc3RfZXh0ZW5kKHJlcSwgTFZNUERfUEFSTV9BQk9SVCAiID0gIiBGTVRkNjQsIChpbnQ2NF90KSBhYm9ydF9wb2xsaW5nLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgIiBMVk1QRF9SRVFfUFJPR1JFU1MgIiByZXF1ZXN0LiIpOworCQlnb3RvIG91dF9yZXE7CisJfQorCisJaWYgKGUgJiYKKwkgICAgIShkYWVtb25fcmVxdWVzdF9leHRlbmQocmVxLCBMVk1QRF9QQVJNX1NZU0RJUiAiID0gJXMiLAorCQkJCSAgICBlLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlICIgTFZNUERfUkVRX1BST0dSRVNTICIgcmVxdWVzdC4iKTsKKwkJZ290byBvdXRfcmVxOworCX0KKworCXJlcCA9IGRhZW1vbl9zZW5kKF9sdm1wb2xsZCwgcmVxKTsKKwlpZiAocmVwLmVycm9yKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHByb2Nlc3MgcmVxdWVzdCB3aXRoIGVycm9yICVzIChlcnJubzogJWQpLiIsCisJCQkgIHN0cmVycm9yKHJlcC5lcnJvciksIHJlcC5lcnJvcik7CisJCWdvdG8gb3V0X3JlcDsKKwl9CisKKwlpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlc3BvbnNlIiwgIiIpLCBMVk1QRF9SRVNQX0lOX1BST0dSRVNTKSkgeworCQlyZXQuZmluaXNoZWQgPSAwOworCQlyZXQuZXJyb3IgPSAwOworCX0gZWxzZSBpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlc3BvbnNlIiwgIiIpLCBMVk1QRF9SRVNQX0ZJTklTSEVEKSkgeworCQlpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlYXNvbiIsICIiKSwgTFZNUERfUkVBU19TSUdOQUwpKQorCQkJcmV0LmNtZF9zaWduYWwgPSBkYWVtb25fcmVwbHlfaW50KHJlcCwgTFZNUERfUEFSTV9WQUxVRSwgMCk7CisJCWVsc2UKKwkJCXJldC5jbWRfcmV0Y29kZSA9IGRhZW1vbl9yZXBseV9pbnQocmVwLCBMVk1QRF9QQVJNX1ZBTFVFLCAtMSk7CisJCXJldC5lcnJvciA9IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGRhZW1vbl9yZXBseV9zdHIocmVwLCAicmVzcG9uc2UiLCAiIiksIExWTVBEX1JFU1BfTk9UX0ZPVU5EKSkgeworCQlsb2dfdmVyYm9zZSgiTm8gcG9sbGluZyBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgcmVnYXJkaW5nIExWICVzLiIsIHV1aWQpOworCQlyZXQuZXJyb3IgPSAwOworCX0gZWxzZSB7CisJCV9wcm9jZXNzX2Vycm9yX3Jlc3BvbnNlKHJlcCk7CisJCXN0YWNrOworCX0KKworb3V0X3JlcDoKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXApOworb3V0X3JlcToKKwlkYWVtb25fcmVxdWVzdF9kZXN0cm95KHJlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaW50ZXJ2YWwgaW4gc2Vjb25kcyBsb25nCisgKiBlbm91Z2ggZm9yIG1vcmUgdGhhbiBhIHllYXIKKyAqIG9mIHdhaXRpbmcKKyAqLworI2RlZmluZSBJTlRFUlZfU0laRSAxMAorCitzdGF0aWMgaW50IF9wcm9jZXNzX3BvbGxfaW5pdChjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcG9sbF90eXBlLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCwgY29uc3Qgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpCit7CisJY2hhciAqc3RyOworCWRhZW1vbl9yZXBseSByZXA7CisJZGFlbW9uX3JlcXVlc3QgcmVxOworCWNvbnN0IGNoYXIgKmUgPSBnZXRlbnYoIkxWTV9TWVNURU1fRElSIik7CisJaW50IHIgPSAwOyAKKworCXN0ciA9IGRtX21hbGxvYyhJTlRFUlZfU0laRSAqIHNpemVvZihjaGFyKSk7CisJaWYgKCFzdHIpCisJCXJldHVybiByOworCisJaWYgKHNucHJpbnRmKHN0ciwgSU5URVJWX1NJWkUsICIldSIsIHBhcm1zLT5pbnRlcnZhbCkgPj0gSU5URVJWX1NJWkUpIHsKKwkJbG9nX3dhcm4oIkludGVydmFsIHN0cmluZyBjb252ZXJzaW9uIGdvdCB0cnVuY2F0ZWQuIik7CisJCXN0cltJTlRFUlZfU0laRSAtIDFdID0gJ1wwJzsKKwl9CisKKwlyZXEgPSBkYWVtb25fcmVxdWVzdF9tYWtlKHBvbGxfdHlwZSk7CisJaWYgKCFkYWVtb25fcmVxdWVzdF9leHRlbmQocmVxLCBMVk1QRF9QQVJNX0xWSUQgIiA9ICVzIiwgaWQtPnV1aWQsCisJCQkJCUxWTVBEX1BBUk1fVkdOQU1FICIgPSAlcyIsIGlkLT52Z19uYW1lLAorCQkJCQlMVk1QRF9QQVJNX0xWTkFNRSAiID0gJXMiLCBpZC0+bHZfbmFtZSwKKwkJCQkJTFZNUERfUEFSTV9JTlRFUlZBTCAiID0gJXMiLCBzdHIsCisJCQkJCSJjbWRsaW5lID0gJXMiLCBjbWQtPmNtZF9saW5lLCAvKiBGSVhNRTogZGVidWcgcGFyYW0gb25seSAqLworCQkJCQlOVUxMKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgJXMgcmVxdWVzdC4iLCBwb2xsX3R5cGUpOworCQlnb3RvIG91dF9yZXE7CisJfQorCisJaWYgKHBhcm1zLT5hYm9ydGluZyAmJgorCSAgICAhKGRhZW1vbl9yZXF1ZXN0X2V4dGVuZChyZXEsIExWTVBEX1BBUk1fQUJPUlQgIiA9ICIgRk1UZDY0LCAoaW50NjRfdCkgKHBhcm1zLT5hYm9ydGluZyksIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgJXMgcmVxdWVzdC4iICwgcG9sbF90eXBlKTsKKwkJZ290byBvdXRfcmVxOworCX0KKworCWlmIChjbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMgJiYKKwkgICAgIShkYWVtb25fcmVxdWVzdF9leHRlbmQocmVxLCBMVk1QRF9QQVJNX0hBTkRMRV9NSVNTSU5HX1BWUyAiID0gIiBGTVRkNjQsCisJCQkJICAgIChpbnQ2NF90KSAoY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzKSwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSAlcyByZXF1ZXN0LiIgLCBwb2xsX3R5cGUpOworCQlnb3RvIG91dF9yZXE7CisJfQorCisJaWYgKGUgJiYKKwkgICAgIShkYWVtb25fcmVxdWVzdF9leHRlbmQocmVxLCBMVk1QRF9QQVJNX1NZU0RJUiAiID0gJXMiLAorCQkJCSAgICBlLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlICVzIHJlcXVlc3QuIiAsIHBvbGxfdHlwZSk7CisJCWdvdG8gb3V0X3JlcTsKKwl9CisKKwlyZXAgPSBkYWVtb25fc2VuZChfbHZtcG9sbGQsIHJlcSk7CisKKwlpZiAocmVwLmVycm9yKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHByb2Nlc3MgcmVxdWVzdCB3aXRoIGVycm9yICVzIChlcnJubzogJWQpLiIsCisJCQkgIHN0cmVycm9yKHJlcC5lcnJvciksIHJlcC5lcnJvcik7CisJCWdvdG8gb3V0X3JlcDsKKwl9CisKKwlpZiAoIXN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHJlcCwgInJlc3BvbnNlIiwgIiIpLCBMVk1QRF9SRVNQX09LKSkKKwkJciA9IDE7CisJZWxzZSB7CisJCV9wcm9jZXNzX2Vycm9yX3Jlc3BvbnNlKHJlcCk7CisJCXN0YWNrOworCX0KKworb3V0X3JlcDoKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyZXApOworb3V0X3JlcToKKwlkYWVtb25fcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJZG1fZnJlZShzdHIpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBsdm1wb2xsZF9wb2xsX2luaXQoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcykKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAoIWlkLT51dWlkKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVXNlIG9mIGx2bXBvbGxkIHJlcXVpcmVzIHV1aWQgc2V0Iik7CisJCXJldHVybiAwOworCX0KKworCWlmICghaWQtPnZnX25hbWUpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVc2Ugb2YgbHZtcG9sbGQgcmVxdWlyZXMgdmduYW1lIHNldCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlkLT5sdl9uYW1lKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVXNlIG9mIGx2bXBvbGxkIHJlcXVpcmVzIGx2bmFtZSBzZXQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBhcm1zLT5sdl90eXBlICYgUFZNT1ZFKSB7CisJCWxvZ19kZWJ1Z19sdm1wb2xsZCgiQXNraW5nIGx2bXBvbGxkIGZvciBwdm1vdmUlcyBvbiAlcy8lcy4iLAorCQkJCSAgIHBhcm1zLT5hYm9ydGluZyA/ICIgYWJvcnQiIDogIiIsIGlkLT52Z19uYW1lLCBpZC0+bHZfbmFtZSk7CisJCXIgPSAgX3Byb2Nlc3NfcG9sbF9pbml0KGNtZCwgTFZNUERfUkVRX1BWTU9WRSwgaWQsIHBhcm1zKTsKKwl9IGVsc2UgaWYgKHBhcm1zLT5sdl90eXBlICYgQ09OVkVSVElORykgeworCQlsb2dfZGVidWdfbHZtcG9sbGQoIkFza2luZyBsdm1wb2xsZCBmb3IgbWlycm9yIGNvbnZlcnNpb24gb24gJXMvJXMuIiwKKwkJCQkgICBpZC0+dmdfbmFtZSwgaWQtPmx2X25hbWUpOworCQlyID0gIF9wcm9jZXNzX3BvbGxfaW5pdChjbWQsIExWTVBEX1JFUV9DT05WRVJULCBpZCwgcGFybXMpOworCX0gZWxzZSBpZiAocGFybXMtPmx2X3R5cGUgJiBNRVJHSU5HKSB7CisJCWlmIChwYXJtcy0+bHZfdHlwZSAmIFNOQVBTSE9UKSB7CisJCQlsb2dfZGVidWdfbHZtcG9sbGQoIkFza2luZyBsdm1wb2xsZCBmb3Igc25hcHNob3QgbWVyZ2Ugb24gJXMvJXMuIiwKKwkJCQkJICAgaWQtPnZnX25hbWUsIGlkLT5sdl9uYW1lKTsKKwkJCXIgPSAgX3Byb2Nlc3NfcG9sbF9pbml0KGNtZCwgTFZNUERfUkVRX01FUkdFLCBpZCwgcGFybXMpOworCQl9CisJCWVsc2UgaWYgKHBhcm1zLT5sdl90eXBlICYgVEhJTl9WT0xVTUUpIHsKKwkJCWxvZ19kZWJ1Z19sdm1wb2xsZCgiQXNraW5nIGx2bXBvbGxkIGZvciB0aGluIHNuYXBzaG90IG1lcmdlIG9uICVzLyVzLiIsCisJCQkJCSAgIGlkLT52Z19uYW1lLCBpZC0+bHZfbmFtZSk7CisJCQlyID0gX3Byb2Nlc3NfcG9sbF9pbml0KGNtZCwgTFZNUERfUkVRX01FUkdFX1RISU4sIGlkLCBwYXJtcyk7CisJCX0KKwkJZWxzZSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuc3VwcG9ydGVkIHBvbGwgb3BlcmF0aW9uLiIpOworCQl9CisJfSBlbHNlCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5zdXBwb3J0ZWQgcG9sbCBvcGVyYXRpb24iKTsKKworCXJldHVybiByOworfQorCitpbnQgbHZtcG9sbGRfcmVxdWVzdF9pbmZvKGNvbnN0IHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQsIGNvbnN0IHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zLCB1bnNpZ25lZCAqZmluaXNoZWQpCit7CisJc3RydWN0IHByb2dyZXNzX2luZm8gaW5mbzsKKwlpbnQgcmV0ID0gMDsKKworCSpmaW5pc2hlZCA9IDE7CisKKwlpZiAoIWlkLT51dWlkKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAidXNlIG9mIGx2bXBvbGxkIHJlcXVpcmVzIHV1aWQgYmVpbmcgc2V0Iik7CisJCXJldHVybiAwOworCX0KKworCWxvZ19kZWJ1Z19sdm1wb2xsZCgiQXNraW5nIGx2bXBvbGxkIGZvciBwcm9ncmVzcyBzdGF0dXMgb2YgYW4gb3BlcmF0aW9uIG9uICVzLyVzLiIsCisJCQkgICBpZC0+dmdfbmFtZSwgaWQtPmx2X25hbWUpOworCWluZm8gPSBfcmVxdWVzdF9wcm9ncmVzc19pbmZvKGlkLT51dWlkLCBwYXJtcy0+YWJvcnRpbmcpOworCSpmaW5pc2hlZCA9IGluZm8uZmluaXNoZWQ7CisKKwlpZiAoaW5mby5lcnJvcikKKwkJcmV0dXJuXzA7CisKKwlpZiAoaW5mby5maW5pc2hlZCkgeworCQlpZiAoaW5mby5jbWRfc2lnbmFsKQorCQkJbG9nX2Vycm9yKCJDb21tYW5kIGV4ZWN1dGVkIGJ5IGx2bXBvbGxkIGdvdCB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAoJWQpLiIsCisJCQkJICBpbmZvLmNtZF9zaWduYWwpOworCQllbHNlIGlmIChpbmZvLmNtZF9yZXRjb2RlKQorCQkJX2V4cGxhaW5fZXJyb3JfY29kZXMoaW5mby5jbWRfcmV0Y29kZSk7CisJCWVsc2UgeworCQkJbG9nX3ZlcmJvc2UoIlBvbGxpbmcgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LiIpOworCQkJcmV0ID0gMTsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSAxOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdm1wb2xsZC9sdm1wb2xsZC1jbGllbnQuaCBiL2xpYi9sdm1wb2xsZC9sdm1wb2xsZC1jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ5NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x2bXBvbGxkL2x2bXBvbGxkLWNsaWVudC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTFZNUE9MTERfQ0xJRU5UX0gKKyNkZWZpbmUgX0xWTV9MVk1QT0xMRF9DTElFTlRfSAorIyAgaWZkZWYgTFZNUE9MTERfU1VQUE9SVAorCisjCWluY2x1ZGUgImRhZW1vbi1jbGllbnQuaCIKKworIwlkZWZpbmUgTFZNUE9MTERfU09DS0VUIERFRkFVTFRfUlVOX0RJUiAiL2x2bXBvbGxkLnNvY2tldCIKKworc3RydWN0IGNtZF9jb250ZXh0Oworc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkOworc3RydWN0IGRhZW1vbl9wYXJtczsKKwordm9pZCBsdm1wb2xsZF9kaXNjb25uZWN0KHZvaWQpOworCitpbnQgbHZtcG9sbGRfcG9sbF9pbml0KGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpOworCitpbnQgbHZtcG9sbGRfcmVxdWVzdF9pbmZvKGNvbnN0IHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQsIGNvbnN0IHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zLAorCQkJICB1bnNpZ25lZCAqZmluaXNoZWQpOworCitpbnQgbHZtcG9sbGRfdXNlKHZvaWQpOworCit2b2lkIGx2bXBvbGxkX3NldF9hY3RpdmUoaW50IGFjdGl2ZSk7CisKK3ZvaWQgbHZtcG9sbGRfc2V0X3NvY2tldChjb25zdCBjaGFyICpzb2NrZXQpOworCisjICBlbHNlCisKKyMJZGVmaW5lIGx2bXBvbGxkX2Rpc2Nvbm5lY3QoKSBkbyB7fSB3aGlsZSAoMCkKKyMJZGVmaW5lIGx2bXBvbGxkX3BvbGxfaW5pdChjbWQsIGlkLCBwYXJtcykgKDApCisjCWRlZmluZSBsdm1wb2xsZF9yZXF1ZXN0X2luZm8oaWQsIHBhcm1zLCBmaW5pc2hlZCkgKDApCisjCWRlZmluZSBsdm1wb2xsZF91c2UoKSAoMCkKKyMJZGVmaW5lIGx2bXBvbGxkX3NldF9hY3RpdmUoYWN0aXZlKSBkbyB7fSB3aGlsZSAoMCkKKyMJZGVmaW5lIGx2bXBvbGxkX3NldF9zb2NrZXQoc29ja2V0KSBkbyB7fSB3aGlsZSAoMCkKKworIyAgZW5kaWYgLyogTFZNUE9MTERfU1VQUE9SVCAqLworCisjZW5kaWYgLyogX0xWTV9MVk1QT0xMRF9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2x2bXBvbGxkL3BvbGxkYWVtb24uaCBiL2xpYi9sdm1wb2xsZC9wb2xsZGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2ODhmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdm1wb2xsZC9wb2xsZGFlbW9uLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9UT09MX1BPTExEQUVNT05fSAorI2RlZmluZSBfTFZNX1RPT0xfUE9MTERBRU1PTl9ICisKKyNpbmNsdWRlICJtZXRhZGF0YS1leHBvcnRlZC5oIgorCit0eXBlZGVmIGVudW0geworCVBST0dSRVNTX0NIRUNLX0ZBSUxFRCA9IDAsCisJUFJPR1JFU1NfVU5GSU5JU0hFRCA9IDEsCisJUFJPR1JFU1NfRklOSVNIRURfU0VHTUVOVCA9IDIsCisJUFJPR1JFU1NfRklOSVNIRURfQUxMID0gMworfSBwcm9ncmVzc190OworCitzdHJ1Y3QgZGFlbW9uX3Bhcm1zOworCitzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgeworCWNvbnN0IGNoYXIgKigqZ2V0X2NvcHlfbmFtZV9mcm9tX2x2KSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisJcHJvZ3Jlc3NfdCAoKnBvbGxfcHJvZ3Jlc3MpKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICBzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcyk7CisJaW50ICgqdXBkYXRlX21ldGFkYXRhKSAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQsIHVuc2lnbmVkIGZsYWdzKTsKKwlpbnQgKCpmaW5pc2hfY29weSkgKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkKTsKK307CisKK3N0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCB7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICpsdl9uYW1lOworCWNvbnN0IGNoYXIgKmRpc3BsYXlfbmFtZTsKKwljb25zdCBjaGFyICp1dWlkOworfTsKKworc3RydWN0IGRhZW1vbl9wYXJtcyB7CisJdW5zaWduZWQgaW50ZXJ2YWw7CisJdW5zaWduZWQgd2FpdF9iZWZvcmVfdGVzdGluZzsKKwl1bnNpZ25lZCBhYm9ydGluZzsKKwl1bnNpZ25lZCBiYWNrZ3JvdW5kOworCXVuc2lnbmVkIG91dHN0YW5kaW5nX2NvdW50OworCXVuc2lnbmVkIHByb2dyZXNzX2Rpc3BsYXk7CisJY29uc3QgY2hhciAqcHJvZ3Jlc3NfdGl0bGU7CisJdWludDY0X3QgbHZfdHlwZTsKKwlzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgKnBvbGxfZm5zOworfTsKKworaW50IHBvbGxfZGFlbW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1bnNpZ25lZCBiYWNrZ3JvdW5kLAorCQl1aW50NjRfdCBsdl90eXBlLCBzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgKnBvbGxfZm5zLAorCQljb25zdCBjaGFyICpwcm9ncmVzc190aXRsZSwgc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCk7CisKK3Byb2dyZXNzX3QgcG9sbF9taXJyb3JfcHJvZ3Jlc3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQlzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcyk7CisKK2ludCB3YWl0X2Zvcl9zaW5nbGVfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQsCisJCSAgICAgICBzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL2NhY2hlX21hbmlwLmMgYi9saWIvbWV0YWRhdGEvY2FjaGVfbWFuaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU2OTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL2NhY2hlX21hbmlwLmMKQEAgLTAsMCArMSw3MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAibHZfYWxsb2MuaCIKKworLyogaHR0cHM6Ly9naXRodWIuY29tL2p0aG9ybmJlci90aGluLXByb3Zpc2lvbmluZy10b29scy9ibG9iL21hc3Rlci9jYWNoaW5nL2NhY2hlX21ldGFkYXRhX3NpemUuY2MgKi8KKyNkZWZpbmUgRE1fVFJBTlNBQ1RJT05fT1ZFUkhFQUQJCTQwOTYgIC8qIEtpQiAqLworI2RlZmluZSBETV9CWVRFU19QRVJfQkxPQ0sJCTE2IC8qIGJ5dGVzICovCisjZGVmaW5lIERNX0hJTlRfT1ZFUkhFQURfUEVSX0JMT0NLCTggIC8qIGJ5dGVzICovCisjZGVmaW5lIERNX01BWF9ISU5UX1dJRFRICQkoNCsxNikgIC8qIGJ5dGVzLiAgRklYTUUgQ29uZmlndXJhYmxlPyAqLworCitjb25zdCBjaGFyICpkaXNwbGF5X2NhY2hlX21vZGUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlpZiAoc2VnX2lzX2NhY2hlKHNlZykpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCisJaWYgKCFzZWdfaXNfY2FjaGVfcG9vbChzZWcpIHx8CisJICAgIChzZWctPmNhY2hlX21vZGUgPT0gQ0FDSEVfTU9ERV9VTkRFRklORUQpKQorCQlyZXR1cm4gIiI7CisKKwlyZXR1cm4gZ2V0X2NhY2hlX21vZGVfbmFtZShzZWcpOworfQorCisKK2NvbnN0IGNoYXIgKmdldF9jYWNoZV9tb2RlX25hbWUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnKQoreworCXN3aXRjaCAocG9vbF9zZWctPmNhY2hlX21vZGUpIHsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNhY2hlIHBvb2wgJXMgaGFzIHVuZGVmaW5lZCBjYWNoZSBtb2RlLCB1c2luZyB3cml0ZXRocm91Z2ggaW5zdGVhZC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX3NlZy0+bHYpKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBDQUNIRV9NT0RFX1dSSVRFVEhST1VHSDoKKwkJcmV0dXJuICJ3cml0ZXRocm91Z2giOworCWNhc2UgQ0FDSEVfTU9ERV9XUklURUJBQ0s6CisJCXJldHVybiAid3JpdGViYWNrIjsKKwljYXNlIENBQ0hFX01PREVfUEFTU1RIUk9VR0g6CisJCXJldHVybiAicGFzc3Rocm91Z2giOworCX0KK30KKworaW50IHNldF9jYWNoZV9tb2RlKGNhY2hlX21vZGVfdCAqbW9kZSwgY29uc3QgY2hhciAqY2FjaGVfbW9kZSkKK3sKKwlpZiAoIXN0cmNhc2VjbXAoY2FjaGVfbW9kZSwgIndyaXRldGhyb3VnaCIpKQorCQkqbW9kZSA9IENBQ0hFX01PREVfV1JJVEVUSFJPVUdIOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGNhY2hlX21vZGUsICJ3cml0ZWJhY2siKSkKKwkJKm1vZGUgPSBDQUNIRV9NT0RFX1dSSVRFQkFDSzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChjYWNoZV9tb2RlLCAicGFzc3Rocm91Z2giKSkKKwkJKm1vZGUgPSBDQUNIRV9NT0RFX1BBU1NUSFJPVUdIOworCWVsc2UgeworCQlsb2dfZXJyb3IoIlVua25vd24gY2FjaGUgbW9kZTogJXMuIiwgY2FjaGVfbW9kZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgY2FjaGVfc2V0X2NhY2hlX21vZGUoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY2FjaGVfbW9kZV90IG1vZGUpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBzZWctPmx2LT52Zy0+Y21kOworCWNvbnN0IGNoYXIgKnN0cjsKKwlpbnQgaWQ7CisKKwlpZiAoc2VnX2lzX2NhY2hlKHNlZykpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCWVsc2UgaWYgKHNlZ19pc19jYWNoZV9wb29sKHNlZykpIHsKKwkJaWYgKG1vZGUgPT0gQ0FDSEVfTU9ERV9VTkRFRklORUQpCisJCQlyZXR1cm4gMTsJLyogRGVmYXVsdHMgb25seSBmb3IgY2FjaGUgKi8KKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNhbm5vdCBzZXQgY2FjaGUgbW9kZSBmb3Igbm9uIGNhY2hlIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtb2RlICE9IENBQ0hFX01PREVfVU5ERUZJTkVEKSB7CisJCXNlZy0+Y2FjaGVfbW9kZSA9IG1vZGU7CisJCXJldHVybiAxOworCX0KKworCWlmIChzZWctPmNhY2hlX21vZGUgIT0gQ0FDSEVfTU9ERV9VTkRFRklORUQpCisJCXJldHVybiAxOyAgICAgICAgICAgICAgIC8qIERlZmF1bHQgYWxyZWFkeSBzZXQgaW4gY2FjaGUgcG9vbCAqLworCisJLyogRmlndXJlIGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBjb25maWcvcHJvZmlsZXMgKi8KKwlpZCA9IGFsbG9jYXRpb25fY2FjaGVfbW9kZV9DRkc7CisKKwkvKiBJZiBwcmVzZW50LCBjaGVjayBiYWNrd2FyZCBjb21wYXRpYmxlIHNldHRpbmdzICovCisJaWYgKCFmaW5kX2NvbmZpZ19ub2RlKGNtZCwgY21kLT5jZnQsIGlkKSAmJgorCSAgICBmaW5kX2NvbmZpZ19ub2RlKGNtZCwgY21kLT5jZnQsIGFsbG9jYXRpb25fY2FjaGVfcG9vbF9jYWNoZW1vZGVfQ0ZHKSkKKwkJaWQgPSBhbGxvY2F0aW9uX2NhY2hlX3Bvb2xfY2FjaGVtb2RlX0NGRzsKKworCWlmICghKHN0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgaWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNhY2hlIG1vZGUgaXMgbm90IGRldGVybWluZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHNldF9jYWNoZV9tb2RlKCZzZWctPmNhY2hlX21vZGUsIHN0cikpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogQXQgbGVhc3Qgd2FybiBhIHVzZXIgaWYgY2VydGFpbiBjYWNoZSBzdGFja3MgbWF5IHByZXNlbnQgc29tZSBwcm9ibGVtcworICovCit2b2lkIGNhY2hlX2NoZWNrX2Zvcl93YXJucyhjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2x2ID0gc2VnX2x2KHNlZywgMCk7CisKKwlpZiAobHZfaXNfcmFpZChvcmlnaW5fbHYpICYmCisJICAgIGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpLT5jYWNoZV9tb2RlID09IENBQ0hFX01PREVfV1JJVEVCQUNLKQorCQlsb2dfd2FybigiV0FSTklORzogRGF0YSByZWR1bmRhbmN5IGlzIGxvc3Qgd2l0aCB3cml0ZWJhY2sgIgorCQkJICJjYWNoaW5nIG9mIHJhaWQgbG9naWNhbCB2b2x1bWUhIik7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sX2RhdGEoc2VnLT5sdikpCisJCWxvZ193YXJuKCJXQVJOSU5HOiBDYWNoZWQgdGhpbiBwb29sJ3MgZGF0YSBjYW5ub3QgYmUgY3VycmVudGx5ICIKKwkJCSAicmVzaXplZCBhbmQgcmVxdWlyZSBtYW51YWwgdW5jYWNoZSBiZWZvcmUgcmVzaXplISIpOworfQorCisvKgorICogUmV0dXJucyBtaW5pbXVtIHNpemUgb2YgY2FjaGUgbWV0YWRhdGEgdm9sdW1lIGZvciBnaXZlICBkYXRhIGFuZCBjaHVuayBzaXplCisgKiAoYWxsIHZhbHVlcyBpbiBzZWN0b3IpCisgKiBEZWZhdWx0IG1ldGEgc2l6ZSBpczogKE92ZXJoZWFkICsgbWFwcGluZyBzaXplICsgaGludCBzaXplKQorICovCitzdGF0aWMgdWludDY0X3QgX2NhY2hlX21pbl9tZXRhZGF0YV9zaXplKHVpbnQ2NF90IGRhdGFfc2l6ZSwgdWludDMyX3QgY2h1bmtfc2l6ZSkKK3sKKwl1aW50NjRfdCBtaW5fbWV0YV9zaXplOworCisJbWluX21ldGFfc2l6ZSA9IGRhdGFfc2l6ZSAvIGNodW5rX3NpemU7CQkvKiBucl9jaHVua3MgKi8KKwltaW5fbWV0YV9zaXplICo9IChETV9CWVRFU19QRVJfQkxPQ0sgKyBETV9NQVhfSElOVF9XSURUSCArIERNX0hJTlRfT1ZFUkhFQURfUEVSX0JMT0NLKTsKKwltaW5fbWV0YV9zaXplID0gKG1pbl9tZXRhX3NpemUgKyAoU0VDVE9SX1NJWkUgLSAxKSkgPj4gU0VDVE9SX1NISUZUOwkvKiBpbiBzZWN0b3JzICovCisJbWluX21ldGFfc2l6ZSArPSBETV9UUkFOU0FDVElPTl9PVkVSSEVBRCAqICgxMDI0ID4+IFNFQ1RPUl9TSElGVCk7CisKKwlyZXR1cm4gbWluX21ldGFfc2l6ZTsKK30KKworaW50IHVwZGF0ZV9jYWNoZV9wb29sX3BhcmFtcyhjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdW5zaWduZWQgYXR0ciwKKwkJCSAgICAgaW50IHBhc3NlZF9hcmdzLCB1aW50MzJfdCBwb29sX2RhdGFfZXh0ZW50cywKKwkJCSAgICAgdWludDMyX3QgKnBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJCSAgICAgaW50ICpjaHVua19zaXplX2NhbGNfbWV0aG9kLCB1aW50MzJfdCAqY2h1bmtfc2l6ZSkKK3sKKwl1aW50NjRfdCBtaW5fbWV0YV9zaXplOworCXVpbnQzMl90IGV4dGVudF9zaXplID0gdmctPmV4dGVudF9zaXplOworCXVpbnQ2NF90IHBvb2xfbWV0YWRhdGFfc2l6ZSA9ICh1aW50NjRfdCkgKnBvb2xfbWV0YWRhdGFfZXh0ZW50cyAqIGV4dGVudF9zaXplOworCisJaWYgKCEocGFzc2VkX2FyZ3MgJiBQQVNTX0FSR19DSFVOS19TSVpFKSkKKwkJKmNodW5rX3NpemUgPSBERUZBVUxUX0NBQ0hFX1BPT0xfQ0hVTktfU0laRSAqIDI7CisKKwlpZiAoIXZhbGlkYXRlX3Bvb2xfY2h1bmtfc2l6ZSh2Zy0+Y21kLCBzZWd0eXBlLCAqY2h1bmtfc2l6ZSkpCisJCXJldHVybl8wOworCisJbWluX21ldGFfc2l6ZSA9IF9jYWNoZV9taW5fbWV0YWRhdGFfc2l6ZSgodWludDY0X3QpIHBvb2xfZGF0YV9leHRlbnRzICogZXh0ZW50X3NpemUsICpjaHVua19zaXplKTsKKworCS8qIFJvdW5kIHVwIHRvIGV4dGVudCBzaXplICovCisJaWYgKG1pbl9tZXRhX3NpemUgJSBleHRlbnRfc2l6ZSkKKwkJbWluX21ldGFfc2l6ZSArPSBleHRlbnRfc2l6ZSAtIG1pbl9tZXRhX3NpemUgJSBleHRlbnRfc2l6ZTsKKworCWlmICghcG9vbF9tZXRhZGF0YV9zaXplKQorCQlwb29sX21ldGFkYXRhX3NpemUgPSBtaW5fbWV0YV9zaXplOworCisJaWYgKHBvb2xfbWV0YWRhdGFfc2l6ZSA+ICgyICogREVGQVVMVF9DQUNIRV9QT09MX01BWF9NRVRBREFUQV9TSVpFKSkgeworCQlwb29sX21ldGFkYXRhX3NpemUgPSAyICogREVGQVVMVF9DQUNIRV9QT09MX01BWF9NRVRBREFUQV9TSVpFOworCQlpZiAocGFzc2VkX2FyZ3MgJiBQQVNTX0FSR19QT09MX01FVEFEQVRBX1NJWkUpCisJCQlsb2dfd2FybigiV0FSTklORzogTWF4aW11bSBzdXBwb3J0ZWQgcG9vbCBtZXRhZGF0YSBzaXplIGlzICVzLiIsCisJCQkJIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCBwb29sX21ldGFkYXRhX3NpemUpKTsKKwl9IGVsc2UgaWYgKHBvb2xfbWV0YWRhdGFfc2l6ZSA8IG1pbl9tZXRhX3NpemUpIHsKKwkJaWYgKHBhc3NlZF9hcmdzICYgUEFTU19BUkdfUE9PTF9NRVRBREFUQV9TSVpFKQorCQkJbG9nX3dhcm4oIldBUk5JTkc6IE1pbmltdW0gcmVxdWlyZWQgcG9vbCBtZXRhZGF0YSBzaXplIGlzICVzICIKKwkJCQkgIihuZWVkcyBleHRyYSAlcykuIiwKKwkJCQkgZGlzcGxheV9zaXplKHZnLT5jbWQsIG1pbl9tZXRhX3NpemUpLAorCQkJCSBkaXNwbGF5X3NpemUodmctPmNtZCwgbWluX21ldGFfc2l6ZSAtIHBvb2xfbWV0YWRhdGFfc2l6ZSkpOworCQlwb29sX21ldGFkYXRhX3NpemUgPSBtaW5fbWV0YV9zaXplOworCX0KKworCWlmICghKCpwb29sX21ldGFkYXRhX2V4dGVudHMgPQorCSAgICAgIGV4dGVudHNfZnJvbV9zaXplKHZnLT5jbWQsIHBvb2xfbWV0YWRhdGFfc2l6ZSwgZXh0ZW50X3NpemUpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFZhbGlkYXRlIGlmIGV4aXN0aW5nIGNhY2hlLXBvb2wgY2FuIGJlIHVzZWQgd2l0aCBnaXZlbiBjaHVuayBzaXplCisgKiBpLmUuIGNhY2hlLXBvb2wgbWV0YWRhdGEgc2l6ZSBmaXRzIGFsbCBpbmZvLgorICovCitpbnQgdmFsaWRhdGVfbHZfY2FjaGVfY2h1bmtfc2l6ZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYsIHVpbnQzMl90IGNodW5rX3NpemUpCit7CisJdWludDY0X3QgbWluX3NpemUgPSBfY2FjaGVfbWluX21ldGFkYXRhX3NpemUocG9vbF9sdi0+c2l6ZSwgY2h1bmtfc2l6ZSk7CisKKwlpZiAobWluX3NpemUgPiBmaXJzdF9zZWcocG9vbF9sdiktPm1ldGFkYXRhX2x2LT5zaXplKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSBjaHVuayBzaXplICVzIHdpdGggY2FjaGUgcG9vbCAlcy4gIgorCQkJICAiTWluaW1hbCByZXF1aXJlZCBzaXplIGZvciBtZXRhZGF0YSBpcyAlcy4iLAorCQkJICBkaXNwbGF5X3NpemUocG9vbF9sdi0+dmctPmNtZCwgY2h1bmtfc2l6ZSksCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpLAorCQkJICBkaXNwbGF5X3NpemUocG9vbF9sdi0+dmctPmNtZCwgbWluX3NpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisvKgorICogVmFsaWRhdGUgYXJndW1lbnRzIGZvciBjb252ZXJ0aW5nIG9yaWdpbiBpbnRvIGNhY2hlZCB2b2x1bWUgd2l0aCBnaXZlbiBjYWNoZSBwb29sLgorICoKKyAqIEFsd2F5cyB2YWxpZGF0ZXMgb3JpZ2luX2x2LCBhbmQgd2hlbiBpdCBpcyBrbm93biBhbHNvIGNhY2hlIHBvb2xfbHYKKyAqLworaW50IHZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9wb29sKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJaWYgKCFsdl9pc19jYWNoZV9wb29sKHBvb2xfbHYpKSB7CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm90IGEgY2FjaGUgcG9vbC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19sb2NrZWQocG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdXNlIGxvY2tlZCBjYWNoZSBwb29sICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZwb29sX2x2LT5zZWdzX3VzaW5nX3RoaXNfbHYpKSB7CisJCXNlZyA9IGdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihwb29sX2x2KTsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSBieSAlcyIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpLAorCQkJICBzZWcgPyBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSA6ICJhbm90aGVyIExWIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmFsaWRhdGVfbHZfY2FjaGVfY3JlYXRlX29yaWdpbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbl9sdikKK3sKKwlpZiAobHZfaXNfbG9ja2VkKG9yaWdpbl9sdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdXNlIGxvY2tlZCBvcmlnaW4gdm9sdW1lICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKG9yaWdpbl9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBjb252ZXJzaW9uIG9mIHRoaW4gcG9vbCBkYXRhIHZvbHVtZSAqLworCWlmICghbHZfaXNfdmlzaWJsZShvcmlnaW5fbHYpICYmICFsdl9pc190aGluX3Bvb2xfZGF0YShvcmlnaW5fbHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgY29udmVydCBpbnRlcm5hbCBMViAlcy4iLCBkaXNwbGF5X2x2bmFtZShvcmlnaW5fbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBPbmx5IGxpbmVhciwgc3RyaXBlZCBvciByYWlkIHN1cHBvcnRlZC4KKwkgKiBGSVhNRSBUaWR5IHVwIGFsbCB0aGVzZSB0eXBlIHJlc3RyaWN0aW9ucy4KKwkgKi8KKwlpZiAobHZfaXNfY2FjaGVfdHlwZShvcmlnaW5fbHYpIHx8CisJICAgIGx2X2lzX21pcnJvcl90eXBlKG9yaWdpbl9sdikgfHwKKwkgICAgbHZfaXNfdGhpbl92b2x1bWUob3JpZ2luX2x2KSB8fCBsdl9pc190aGluX3Bvb2xfbWV0YWRhdGEob3JpZ2luX2x2KSB8fAorCSAgICBsdl9pc19vcmlnaW4ob3JpZ2luX2x2KSB8fCBsdl9pc19tZXJnaW5nX29yaWdpbihvcmlnaW5fbHYpIHx8CisJICAgIGx2X2lzX2NvdyhvcmlnaW5fbHYpIHx8IGx2X2lzX21lcmdpbmdfY293KG9yaWdpbl9sdikgfHwKKwkgICAgbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKG9yaWdpbl9sdikgfHwKKwkgICAgbHZfaXNfdmlydHVhbChvcmlnaW5fbHYpKSB7CisJCWxvZ19lcnJvcigiQ2FjaGUgaXMgbm90IHN1cHBvcnRlZCB3aXRoICVzIHNlZ21lbnQgdHlwZSBvZiB0aGUgb3JpZ2luYWwgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZmlyc3Rfc2VnKG9yaWdpbl9sdiktPnNlZ3R5cGUtPm5hbWUsIGRpc3BsYXlfbHZuYW1lKG9yaWdpbl9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGx2X2NhY2hlX2NyZWF0ZQorICogQHBvb2wKKyAqIEBvcmlnaW4KKyAqCisgKiBHaXZlbiBhIGNhY2hlX3Bvb2wgYW5kIGFuIG9yaWdpbiwgbGluayB0aGUgdHdvIGFuZCBjcmVhdGUgYQorICogY2FjaGVkIExWLgorICoKKyAqIFJldHVybnM6IGNhY2hlIExWIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NhY2hlX2NyZWF0ZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYsCisJCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2x2KQoreworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBwb29sX2x2LT52Zy0+Y21kOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY2FjaGVfbHYgPSBvcmlnaW5fbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmICghdmFsaWRhdGVfbHZfY2FjaGVfY3JlYXRlX3Bvb2wocG9vbF9sdikgfHwKKwkgICAgIXZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9vcmlnaW4oY2FjaGVfbHYpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmIChsdl9pc190aGluX3Bvb2woY2FjaGVfbHYpKQorCQljYWNoZV9sdiA9IHNlZ19sdihmaXJzdF9zZWcoY2FjaGVfbHYpLCAwKTsgLyogY2FjaGUgX3RkYXRhICovCisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCFpbnNlcnRfbGF5ZXJfZm9yX2x2KGNtZCwgY2FjaGVfbHYsIENBQ0hFLCAiX2NvcmlnIikpCisJCXJldHVybl9OVUxMOworCisJc2VnID0gZmlyc3Rfc2VnKGNhY2hlX2x2KTsKKwlzZWctPnNlZ3R5cGUgPSBzZWd0eXBlOworCisJaWYgKCFhdHRhY2hfcG9vbF9sdihzZWcsIHBvb2xfbHYsIE5VTEwsIE5VTEwsIE5VTEwpKQorCQlyZXR1cm5fTlVMTDsKKworCXJldHVybiBjYWNoZV9sdjsKK30KKworLyoKKyAqIENoZWNrcyBjYWNoZSBzdGF0dXMgYW5kIGxvb3BzIHVudGlsIHRoZXJlIGFyZSBub3QgZGlydHkgYmxvY2tzCisgKiBTZXQgMSB0byAqaXNfY2xlYW4gd2hlbiB0aGVyZSBhcmUgbm8gZGlydHkgYmxvY2tzIG9uIHJldHVybi4KKyAqLworaW50IGx2X2NhY2hlX3dhaXRfZm9yX2NsZWFuKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY2FjaGVfbHYsIGludCAqaXNfY2xlYW4pCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2NrX2x2ID0gbHZfbG9ja19ob2xkZXIoY2FjaGVfbHYpOworCXN0cnVjdCBsdl9zZWdtZW50ICpjYWNoZV9zZWcgPSBmaXJzdF9zZWcoY2FjaGVfbHYpOworCXN0cnVjdCBsdl9zdGF0dXNfY2FjaGUgKnN0YXR1czsKKwlpbnQgY2xlYW5lcl9wb2xpY3k7CisJdWludDY0X3QgZGlydHlfYmxvY2tzOworCisJKmlzX2NsZWFuID0gMDsKKworCS8vRklYTUU6IHVzZSBwb2xsaW5nIHRvIGRvIHRoaXMuLi4KKwlmb3IgKDs7KSB7CisJCWlmICghbHZfY2FjaGVfc3RhdHVzKGNhY2hlX2x2LCAmc3RhdHVzKSkKKwkJCXJldHVybl8wOworCisJCWlmIChzdGF0dXMtPmNhY2hlLT5mYWlsKSB7CisJCQlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLT5tZW0pOworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFNraXBwcGluZyBmbHVzaCBmb3IgZmFpbGVkIGNhY2hlICVzLiIsCisJCQkJIGRpc3BsYXlfbHZuYW1lKGNhY2hlX2x2KSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWNsZWFuZXJfcG9saWN5ID0gIXN0cmNtcChzdGF0dXMtPmNhY2hlLT5wb2xpY3lfbmFtZSwgImNsZWFuZXIiKTsKKwkJZGlydHlfYmxvY2tzID0gc3RhdHVzLT5jYWNoZS0+ZGlydHlfYmxvY2tzOworCisJCS8qIE5vIGNsZWFyIHBvbGljeSBhbmQgd3JpdGViYWNrIG1vZGUgbWVhbnMgZGlydHkgKi8KKwkJaWYgKCFjbGVhbmVyX3BvbGljeSAmJgorCQkgICAgKHN0YXR1cy0+Y2FjaGUtPmZlYXR1cmVfZmxhZ3MgJiBETV9DQUNIRV9GRUFUVVJFX1dSSVRFQkFDSykpCisJCQlkaXJ0eV9ibG9ja3MrKzsKKwkJZG1fcG9vbF9kZXN0cm95KHN0YXR1cy0+bWVtKTsKKworCQlpZiAoIWRpcnR5X2Jsb2NrcykKKwkJCWJyZWFrOworCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJGbHVzaGluZyAiIEZNVHU2NCAiIGJsb2NrcyBmb3IgY2FjaGUgJXMuIiwKKwkJCQkJZGlydHlfYmxvY2tzLCBkaXNwbGF5X2x2bmFtZShjYWNoZV9sdikpOworCQlpZiAoY2xlYW5lcl9wb2xpY3kpIHsKKwkJCS8qIFRPRE86IFVzZSBjZW50cmFsaXplZCBwbGFjZSAqLworCQkJdXNsZWVwKDUwMDAwMCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFN3aXRjaCB0byBjbGVhbmVyIHBvbGljeSB0byBmbHVzaCB0aGUgY2FjaGUgKi8KKwkJY2FjaGVfc2VnLT5jbGVhbmVyX3BvbGljeSA9IDE7CisJCS8qIFJlYWxvYWQga2VybmVsIHdpdGggImNsZWFuZXIiIHBvbGljeSAqLworCQlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkX29yaWdpbihjYWNoZV9sdikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwkvKgorCSAqIFRPRE86IGFkZCBjaGVjayBpZiBleHRyYSBzdXNwZW5kIHJlc3VtZSBpcyBuZWNlc3NhcnkKKwkgKiBBVE0gdGhpcyBpcyB3b3JrYXJvdW5kIGZvciBtaXNzaW5nIGNhY2hlIHN5bmMgd2hlbiBjYWNoZSBnZXRzIGNsZWFuCisJICovCisJaWYgKDEpIHsKKwkJaWYgKCFsdl9yZWZyZXNoX3N1c3BlbmRfcmVzdW1lKGxvY2tfbHYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJY2FjaGVfc2VnLT5jbGVhbmVyX3BvbGljeSA9IDA7CisJKmlzX2NsZWFuID0gMTsKKworCXJldHVybiAxOworfQorLyoKKyAqIGx2X2NhY2hlX3JlbW92ZQorICogQGNhY2hlX2x2CisgKgorICogR2l2ZW4gYSBjYWNoZSBMViwgcmVtb3ZlIHRoZSBjYWNoZSBsYXllci4gIFRoaXMgd2lsbCB1bmxpbmsKKyAqIHRoZSBvcmlnaW4gYW5kIGNhY2hlX3Bvb2wsIHJlbW92ZSB0aGUgY2FjaGUgTFYgbGF5ZXIsIGFuZCBwcm9tb3RlCisgKiB0aGUgb3JpZ2luIHRvIGEgdXNhYmxlIG5vbi1jYWNoZWQgTFYgb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAqIGdpdmVuIGNhY2hlX2x2LgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK2ludCBsdl9jYWNoZV9yZW1vdmUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9sdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqY2FjaGVfc2VnID0gZmlyc3Rfc2VnKGNhY2hlX2x2KTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvcmlnaW5fbHY7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9wb29sX2x2OworCWludCBpc19jbGVhcjsKKworCWlmICghbHZfaXNfY2FjaGUoY2FjaGVfbHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgaXMgbm90IGNhY2hlIHZvbHVtZS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUoY2FjaGVfbHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgaXMgYWxyZWFkeSBkcm9wcGVkIGNhY2hlIHZvbHVtZS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9sdikpOworCQlnb3RvIHJlbW92ZTsgIC8qIEFscmVhZHkgZHJvcHBlZCAqLworCX0KKworCS8qIExvY2FseSBhY3RpdmUgdm9sdW1lIGlzIG5lZWRlZCBmb3Igd3JpdGViYWNrICovCisJaWYgKCFsdl9pc19hY3RpdmVfbG9jYWxseShjYWNoZV9sdikpIHsKKwkJLyogR2l2ZSB1cCBhbnkgcmVtb3RlIGxvY2tzICovCisJCWlmICghZGVhY3RpdmF0ZV9sdihjYWNoZV9sdi0+dmctPmNtZCwgY2FjaGVfbHYpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBkZWFjdGl2YXRlIHJlbW90ZWx5IGFjdGl2ZSBjYWNoZSB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGNhY2hlX2x2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXN3aXRjaCAoZmlyc3Rfc2VnKGNhY2hlX3NlZy0+cG9vbF9sdiktPmNhY2hlX21vZGUpIHsKKwkJY2FzZSBDQUNIRV9NT0RFX1dSSVRFVEhST1VHSDoKKwkJY2FzZSBDQUNIRV9NT0RFX1BBU1NUSFJPVUdIOgorCQkJLyogRm9yIGluYWN0aXZlIHBhc3Mvd3JpdGV0aHJvdWdoIGp1c3QgZHJvcCBjYWNoZSBsYXllciAqLworCQkJY29yaWdpbl9sdiA9IHNlZ19sdihjYWNoZV9zZWcsIDApOworCQkJaWYgKCFkZXRhY2hfcG9vbF9sdihjYWNoZV9zZWcpKQorCQkJCXJldHVybl8wOworCQkJaWYgKCFyZW1vdmVfbGF5ZXJfZnJvbV9sdihjYWNoZV9sdiwgY29yaWdpbl9sdikpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIWx2X3JlbW92ZShjb3JpZ2luX2x2KSkKKwkJCQlyZXR1cm5fMDsKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJLyogT3RoZXJ3aXNlIGxvY2FseSBhY3RpdmF0ZSB2b2x1bWUgdG8gc3luYyBkaXJ0eSBibG9ja3MgKi8KKwkJCWNhY2hlX2x2LT5zdGF0dXMgfD0gTFZfVEVNUE9SQVJZOworCQkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGNhY2hlX2x2LT52Zy0+Y21kLCBjYWNoZV9sdikgfHwKKwkJCSAgICAhbHZfaXNfYWN0aXZlX2xvY2FsbHkoY2FjaGVfbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWN0aXZlIGNhY2hlIGxvY2FsbHkgJXMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9sdikpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJY2FjaGVfbHYtPnN0YXR1cyAmPSB+TFZfVEVNUE9SQVJZOworCQl9CisJfQorCisJLyoKKwkgKiBGSVhNRToKKwkgKiBCZWZvcmUgdGhlIGxpbmsgY2FuIGJlIGJyb2tlbiwgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUKKwkgKiBjYWNoZSBoYXMgYmVlbiBmbHVzaGVkLiAgVGhpcyBtYXkgYWxyZWFkeSBiZSB0aGUgY2FzZQorCSAqIGlmIHRoZSBjYWNoZSBtb2RlIGlzIHdyaXRldGhyb3VnaCAob3IgdGhlIGNsZWFuZXIKKwkgKiBwb2xpY3kgaXMgaW4gcGxhY2UgZnJvbSBhIHByZXZpb3VzIGhhbGYtZmluaXNoZWQgYXR0ZW1wdAorCSAqIHRvIHJlbW92ZSB0aGUgY2FjaGVfcG9vbCkuICBJdCBjb3VsZCB0YWtlIGEgbG9uZyB0aW1lIHRvCisJICogZmx1c2ggdGhlIGNhY2hlIC0gaXQgc2hvdWxkIHByb2JhYmx5IGJlIGRvbmUgaW4gdGhlIGJhY2tncm91bmQuCisJICoKKwkgKiBBbHNvLCBpZiB3ZSBkbyBwZXJmb3JtIHRoZSBmbHVzaCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgd2UKKwkgKiBoYXBwZW4gdG8gYWxzbyBiZSByZW1vdmluZyB0aGUgY2FjaGUvb3JpZ2luIExWLCB0aGVuIHdlCisJICogY291bGQgY2hlY2sgaWYgdGhlIGNsZWFuZXIgcG9saWN5IGlzIGluIHBsYWNlIGFuZCBzaW1wbHkKKwkgKiByZW1vdmUgdGhlIGNhY2hlX3Bvb2wgdGhlbiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBmbHVzaCB0bworCSAqIGNvbXBsZXRlLgorCSAqLworCWlmICghbHZfY2FjaGVfd2FpdF9mb3JfY2xlYW4oY2FjaGVfbHYsICZpc19jbGVhcikpCisJCXJldHVybl8wOworCisJY2FjaGVfcG9vbF9sdiA9IGNhY2hlX3NlZy0+cG9vbF9sdjsKKwlpZiAoIWRldGFjaF9wb29sX2x2KGNhY2hlX3NlZykpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBEcm9wIGxheWVyIGZyb20gY2FjaGUgTFYgYW5kIG1ha2UgX2NvcmlnaW4gdG8gYXBwZWFyIGFnYWluIGFzIHJlZ3VsYXIgTFYKKwkgKiBBbmQgdXNlICdleGlzdGluZycgX2NvcmlnaW4gIHZvbHVtZSB0byBrZWVwIHJlZmVyZW5jZSBvbiBjYWNoZS1wb29sCisJICogVGhpcyB3YXkgd2Ugc3RpbGwgaGF2ZSBhIHdheSB0byByZWZlcmVuY2UgX2NvcmlnaW4gaW4gZG0gdGFibGUgYW5kIHdlCisJICoga25vdyBpdCdzIGJlZW4gJ2NhY2hlJyBMViAgYW5kIHdlIGNhbiBkcm9wIGFsbCBuZWVkZWQgdGFibGUgZW50cmllcyB2aWEKKwkgKiBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gb2YgaXQuCisJICoKKwkgKiBUaGlzICdjYWNoZScgTFYgd2l0aG91dCBvcmlnaW4gaXMgdGVtcG9yYXJ5IExWLCB3aGljaCBzdGlsbCBjb3VsZCBiZQorCSAqIGVhc2lseSBvcGVyYXRlZCBieSBsdm0yIGNvbW1hbmRzIC0gaXQgY291bGQgYmUgYWN0aXZhdGUvZGVhY3RpdmF0ZWQvcmVtb3ZlZC4KKwkgKiBIb3dldmVyIGluIHRoZSBkbS10YWJsZSBpdCB3aWxsIHVzZSAnZXJyb3InIHRhcmdldCBmb3IgX2NvcmlnaW4gdm9sdW1lLgorCSAqLworCWNvcmlnaW5fbHYgPSBzZWdfbHYoY2FjaGVfc2VnLCAwKTsKKwlsdl9zZXRfdmlzaWJsZShjb3JpZ2luX2x2KTsKKworCWlmICghcmVtb3ZlX2xheWVyX2Zyb21fbHYoY2FjaGVfbHYsIGNvcmlnaW5fbHYpKQorCQlyZXR1cm5fMDsKKworCS8qIFJlcGxhY2UgJ2Vycm9yJyB3aXRoICdjYWNoZScgc2VndHlwZSAqLworCWNhY2hlX3NlZyA9IGZpcnN0X3NlZyhjb3JpZ2luX2x2KTsKKwlpZiAoIShjYWNoZV9zZWctPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjb3JpZ2luX2x2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoY2FjaGVfc2VnLT5hcmVhcyA9IGRtX3Bvb2xfemFsbG9jKGNhY2hlX2x2LT52Zy0+dmdtZW0sIHNpemVvZigqY2FjaGVfc2VnLT5hcmVhcykpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYoY2FjaGVfc2VnLCAwLCBjYWNoZV9sdiwgMCwgMCkpCisJCXJldHVybl8wOworCisJY2FjaGVfc2VnLT5hcmVhX2NvdW50ID0gMTsKKwljb3JpZ2luX2x2LT5sZV9jb3VudCA9IGNhY2hlX2x2LT5sZV9jb3VudDsKKwljb3JpZ2luX2x2LT5zaXplID0gY2FjaGVfbHYtPnNpemU7CisJY29yaWdpbl9sdi0+c3RhdHVzIHw9IExWX1BFTkRJTkdfREVMRVRFOworCisJLyogUmVhdHRhY2ggY2FjaGUgcG9vbCAqLworCWlmICghYXR0YWNoX3Bvb2xfbHYoY2FjaGVfc2VnLCBjYWNoZV9wb29sX2x2LCBOVUxMLCBOVUxMLCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBTdXNwZW5kL3Jlc3VtZSBhbHNvIGRlYWN0aXZhdGVzIGRlbGV0ZWQgTFYgdmlhIHN1cHBvcnQgb2YgTFZfUEVORElOR19ERUxFVEUgKi8KKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKGNhY2hlX2x2KSkKKwkJcmV0dXJuXzA7CisJY2FjaGVfbHYgPSBjb3JpZ2luX2x2OworcmVtb3ZlOgorCWlmICghZGV0YWNoX3Bvb2xfbHYoY2FjaGVfc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWx2X3JlbW92ZShjYWNoZV9sdikpIC8qIFdpbGwgdXNlIExWX1BFTkRJTkdfREVMRVRFICovCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdl9pc19jYWNoZV9vcmlnaW4oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJLyogTWFrZSBzdXJlIHRoZXJlJ3MgZXhhY3RseSBvbmUgc2VnbWVudCBpbiBzZWdzX3VzaW5nX3RoaXNfbHYhICovCisJaWYgKGRtX2xpc3RfZW1wdHkoJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpIHx8CisJICAgIChkbV9saXN0X3NpemUoJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpID4gMSkpCisJCXJldHVybiAwOworCisJc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KGx2KTsKKwlyZXR1cm4gc2VnICYmIGx2X2lzX2NhY2hlKHNlZy0+bHYpICYmICFsdl9pc19wZW5kaW5nX2RlbGV0ZShzZWctPmx2KSAmJiAoc2VnX2x2KHNlZywgMCkgPT0gbHYpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9kZWZhdWx0X2NhY2hlX3BvbGljeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKTsKKwl1bnNpZ25lZCBhdHRyID0gfjA7CisgICAgICAgIGNvbnN0IGNoYXIgKmRlZiA9IE5VTEw7CisKKwlpZiAoIXNlZ3R5cGUgfHwKKwkgICAgIXNlZ3R5cGUtPm9wcy0+dGFyZ2V0X3ByZXNlbnQgfHwKKwkgICAgIXNlZ3R5cGUtPm9wcy0+dGFyZ2V0X3ByZXNlbnQoY21kLCBOVUxMLCAmYXR0cikpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENhbm5vdCBkZXRlY3QgZGVmYXVsdCBjYWNoZSBwb2xpY3ksIHVzaW5nIFwiIgorCQkJIERFRkFVTFRfQ0FDSEVfUE9MSUNZICJcIi4iKTsKKwkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfUE9MSUNZOworCX0KKworCWlmIChhdHRyICYgQ0FDSEVfRkVBVFVSRV9QT0xJQ1lfU01RKQorCQlkZWYgPSAic21xIjsKKwllbHNlIGlmIChhdHRyICYgQ0FDSEVfRkVBVFVSRV9QT0xJQ1lfTVEpCisJCWRlZiA9ICJtcSI7CisJZWxzZSB7CisJCWxvZ19lcnJvcigiRGVmYXVsdCBjYWNoZSBwb2xpY3kgaXMgbm90IGF2YWlsYWJsZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbG9nX2RlYnVnX21ldGFkYXRhKCJEZXRlY3RlZCBkZWZhdWx0IGNhY2hlX3BvbGljeSBcIiVzXCIuIiwgZGVmKTsKKworCXJldHVybiBkZWY7Cit9CisKK2ludCBjYWNoZV9zZXRfcG9saWN5KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpzZXR0aW5ncykKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY25zOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqb2xkID0gTlVMTCwgKm5ldyA9IE5VTEwsICp0bXAgPSBOVUxMOworCWludCByID0gMDsKKwljb25zdCBpbnQgcGFzc2VkX3NlZ19pc19jYWNoZSA9IHNlZ19pc19jYWNoZShzZWcpOworCisJaWYgKHBhc3NlZF9zZWdfaXNfY2FjaGUpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCisJaWYgKG5hbWUpIHsKKwkJaWYgKCEoc2VnLT5wb2xpY3lfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKHNlZy0+bHYtPnZnLT52Z21lbSwgbmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgcG9saWN5IG5hbWUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAoIXNlZy0+cG9saWN5X25hbWUgJiYgcGFzc2VkX3NlZ19pc19jYWNoZSkgeworCQlpZiAoIShzZWctPnBvbGljeV9uYW1lID0gZmluZF9jb25maWdfdHJlZV9zdHIoc2VnLT5sdi0+dmctPmNtZCwgYWxsb2NhdGlvbl9jYWNoZV9wb2xpY3lfQ0ZHLCBOVUxMKSkgJiYKKwkJICAgICEoc2VnLT5wb2xpY3lfbmFtZSA9IF9nZXRfZGVmYXVsdF9jYWNoZV9wb2xpY3koc2VnLT5sdi0+dmctPmNtZCkpKQorCQkJcmV0dXJuXzA7CisJfQorCisJaWYgKHNldHRpbmdzKSB7CisJCWlmICghc2VnLT5wb2xpY3lfbmFtZSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW4ndCBzZXQgcG9saWN5IHNldHRpbmdzIHdpdGhvdXQgcG9saWN5IG5hbWUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChzZWctPnBvbGljeV9zZXR0aW5ncykgeworCQkJaWYgKCEob2xkID0gZG1fY29uZmlnX2NyZWF0ZSgpKSkKKwkJCQlnb3RvX291dDsKKwkJCWlmICghKG5ldyA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpCisJCQkJZ290b19vdXQ7CisJCQluZXctPnJvb3QgPSBzZXR0aW5ncy0+cm9vdDsKKwkJCW9sZC0+cm9vdCA9IHNlZy0+cG9saWN5X3NldHRpbmdzOworCQkJbmV3LT5jYXNjYWRlID0gb2xkOworCQkJaWYgKCEodG1wID0gZG1fY29uZmlnX2ZsYXR0ZW4obmV3KSkpCisJCQkJZ290b19vdXQ7CisJCX0KKworCQlpZiAoKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZSgodG1wKSA/IHRtcC0+cm9vdCA6IHNldHRpbmdzLT5yb290LCAicG9saWN5X3NldHRpbmdzIikpICYmCisJCSAgICAhKHNlZy0+cG9saWN5X3NldHRpbmdzID0gZG1fY29uZmlnX2Nsb25lX25vZGVfd2l0aF9tZW0oc2VnLT5sdi0+dmctPnZnbWVtLCBjbiwgMCkpKQorCQkJZ290b19vdXQ7CisJfSBlbHNlIGlmIChwYXNzZWRfc2VnX2lzX2NhY2hlICYmIC8qIExvb2sgZm9yIGNvbW1hbmQncyBwcm9maWxlIGNhY2hlX3BvbGljaWVzICovCisJCSAgIChjbnMgPSBmaW5kX2NvbmZpZ190cmVlX25vZGUoc2VnLT5sdi0+dmctPmNtZCwgYWxsb2NhdGlvbl9jYWNoZV9zZXR0aW5nc19DRkdfU0VDVElPTiwgTlVMTCkpKSB7CisJCS8qIFRyeSB0byBmaW5kIG91ciBzZWN0aW9uIGZvciBnaXZlbiBwb2xpY3kgKi8KKwkJZm9yIChjbiA9IGNucy0+Y2hpbGQ7IGNuOyBjbiA9IGNuLT5zaWIpIHsKKwkJCS8qIE9ubHkgbWF0Y2hpbmcgc2VjdGlvbiBuYW1lcyAqLworCQkJaWYgKGNuLT52IHx8IHN0cmNtcChjbi0+a2V5LCBzZWctPnBvbGljeV9uYW1lKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWNuLT5jaGlsZCkKKwkJCQlicmVhazsKKworCQkJaWYgKCEobmV3ID0gZG1fY29uZmlnX2NyZWF0ZSgpKSkKKwkJCQlnb3RvX291dDsKKworCQkJaWYgKCEobmV3LT5yb290ID0gZG1fY29uZmlnX2Nsb25lX25vZGVfd2l0aF9tZW0obmV3LT5tZW0sCisJCQkJCQkJCQljbi0+Y2hpbGQsIDEpKSkKKwkJCQlnb3RvX291dDsKKworCQkJaWYgKCEoc2VnLT5wb2xpY3lfc2V0dGluZ3MgPSBkbV9jb25maWdfY3JlYXRlX25vZGUobmV3LCAicG9saWN5X3NldHRpbmdzIikpKQorCQkJCWdvdG9fb3V0OworCisJCQlzZWctPnBvbGljeV9zZXR0aW5ncy0+Y2hpbGQgPSBuZXctPnJvb3Q7CisKKwkJCWJyZWFrOyAvKiBPbmx5IGZpcnN0IG1hdGNoIGNvdW50cyAqLworCQl9CisJfQorCityZXN0YXJ0OiAvKiByZW1vdmUgYW55ICdkZWZhdWx0IiBub2RlcyAqLworCWNuID0gc2VnLT5wb2xpY3lfc2V0dGluZ3MgPyBzZWctPnBvbGljeV9zZXR0aW5ncy0+Y2hpbGQgOiBOVUxMOworCXdoaWxlIChjbikgeworCQlpZiAoY24tPnYtPnR5cGUgPT0gRE1fQ0ZHX1NUUklORyAmJiAhc3RyY21wKGNuLT52LT52LnN0ciwgImRlZmF1bHQiKSkgeworCQkJZG1fY29uZmlnX3JlbW92ZV9ub2RlKHNlZy0+cG9saWN5X3NldHRpbmdzLCBjbik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJY24gPSBjbi0+c2liOworCX0KKworCXIgPSAxOworCitvdXQ6CisJaWYgKHRtcCkKKwkJZG1fY29uZmlnX2Rlc3Ryb3kodG1wKTsKKwlpZiAobmV3KQorCQlkbV9jb25maWdfZGVzdHJveShuZXcpOworCWlmIChvbGQpCisJCWRtX2NvbmZpZ19kZXN0cm95KG9sZCk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFVuaXZlcnNhbCAnd3JhcHBlcicgZnVuY3Rpb24gIGRvLWl0LWFsbAorICogdG8gdXBkYXRlIGFsbCBjb21tb25seSBzcGVjaWZpZWQgY2FjaGUgcGFyYW1ldGVycworICovCitpbnQgY2FjaGVfc2V0X3BhcmFtcyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgIGNhY2hlX21vZGVfdCBtb2RlLAorCQkgICAgIGNvbnN0IGNoYXIgKnBvbGljeV9uYW1lLAorCQkgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqcG9saWN5X3NldHRpbmdzLAorCQkgICAgIHVpbnQzMl90IGNodW5rX3NpemUpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnOworCisJaWYgKCFjYWNoZV9zZXRfY2FjaGVfbW9kZShzZWcsIG1vZGUpKQorCQlyZXR1cm5fMDsKKworCWlmICghY2FjaGVfc2V0X3BvbGljeShzZWcsIHBvbGljeV9uYW1lLCBwb2xpY3lfc2V0dGluZ3MpKQorCQlyZXR1cm5fMDsKKworCXBvb2xfc2VnID0gc2VnX2lzX2NhY2hlKHNlZykgPyBmaXJzdF9zZWcoc2VnLT5wb29sX2x2KSA6IHNlZzsKKworCWlmIChjaHVua19zaXplKSB7CisJCWlmICghdmFsaWRhdGVfbHZfY2FjaGVfY2h1bmtfc2l6ZShwb29sX3NlZy0+bHYsIGNodW5rX3NpemUpKQorCQkJcmV0dXJuXzA7CisJCXBvb2xfc2VnLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwl9IGVsc2UgeworCQkvKiBUT0RPOiBzb21lIGNhbGNfcG9saWN5IHNvbHV0aW9uIGZvciBjYWNoZSA/ICovCisJCWlmICghcmVjYWxjdWxhdGVfcG9vbF9jaHVua19zaXplX3dpdGhfZGV2X2hpbnRzKHBvb2xfc2VnLT5sdiwgMCwKKwkJCQkJCQkJVEhJTl9DSFVOS19TSVpFX0NBTENfTUVUSE9EX0dFTkVSSUMpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBXaXBlIGNhY2hlIHBvb2wgbWV0YWRhdGEgYXJlYSBiZWZvcmUgdXNlLgorICoKKyAqIEFjdGl2YXRlcyBtZXRhZGF0YSB2b2x1bWUgYXMgJ2NhY2hlLXBvb2wnIHNvIHJlZ3VsYXIgd2lwaW5nCisgKiBvZiBleGlzdGluZyB2aXNpYmxlIHZvbHVtZSBtYXkgcHJvY2VlZC4KKyAqLworaW50IHdpcGVfY2FjaGVfcG9vbChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNhY2hlX3Bvb2xfbHYpCit7CisJaW50IHI7CisKKwkvKiBPbmx5IHVudXNlZCBjYWNoZS1wb29sIGNvdWxkIGJlIGFjdGl2YXRlZCBhbmQgd2lwZWQgKi8KKwlpZiAoIWx2X2lzX2NhY2hlX3Bvb2woY2FjaGVfcG9vbF9sdikgfHwKKwkgICAgIWRtX2xpc3RfZW1wdHkoJmNhY2hlX3Bvb2xfbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJGYWlsZWQgdG8gd2lwZSBjYWNoZSBwb29sIGZvciB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoY2FjaGVfcG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWNoZV9wb29sX2x2LT5zdGF0dXMgfD0gTFZfVEVNUE9SQVJZOworCWlmICghYWN0aXZhdGVfbHZfbG9jYWwoY2FjaGVfcG9vbF9sdi0+dmctPmNtZCwgY2FjaGVfcG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGFjdGl2YXRlIGNhY2hlIHBvb2wgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoY2FjaGVfcG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisJY2FjaGVfcG9vbF9sdi0+c3RhdHVzICY9IH5MVl9URU1QT1JBUlk7CisJaWYgKCEociA9IHdpcGVfbHYoY2FjaGVfcG9vbF9sdiwgKHN0cnVjdCB3aXBlX3BhcmFtcykgeyAuZG9femVybyA9IDEgfSkpKSB7CisJCWxvZ19lcnJvcigiQWJvcnRpbmcuIEZhaWxlZCB0byB3aXBlIGNhY2hlIHBvb2wgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoY2FjaGVfcG9vbF9sdikpOworCQkvKiBEZWxheSByZXR1cm4gb2YgZXJyb3IgYWZ0ZXIgZGVhY3RpdmF0aW9uICovCisJfQorCisJLyogRGVhY3RpdmF0ZSBjbGVhcmVkIGNhY2hlLXBvb2wgbWV0YWRhdGEgKi8KKwlpZiAoIWRlYWN0aXZhdGVfbHYoY2FjaGVfcG9vbF9sdi0+dmctPmNtZCwgY2FjaGVfcG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gQ291bGQgbm90IGRlYWN0aXZhdGUgY2FjaGUgcG9vbCAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9wb29sX2x2KSk7CisJCXIgPSAwOworCX0KKworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL2x2LmMgYi9saWIvbWV0YWRhdGEvbHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU2N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL2x2LmMKQEAgLTAsMCArMSwxNTk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAic3RyX2xpc3QuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK3N0YXRpYyBzdHJ1Y3QgdXRzbmFtZSBfdXRzbmFtZTsKK3N0YXRpYyBpbnQgX3V0c2luaXQgPSAwOworCitpbnQgbHZfaXNfaGlzdG9yaWNhbChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBsdi0+dGhpc19nbHYgJiYgbHYtPnRoaXNfZ2x2LT5pc19oaXN0b3JpY2FsOworfQorCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9mb3JtYXRfcHZzZWdzKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgICAgaW50IHJhbmdlX2Zvcm1hdCwgaW50IG1ldGFkYXRhX2FyZWFzX29ubHksCisJCQkJICAgICAgaW50IG1hcmtfaGlkZGVuKQoreworCXVuc2lnbmVkIGludCBzOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCXVpbnQzMl90IGV4dGVudCA9IDA7CisJdWludDMyX3Qgc2VnX2xlbiA9IDA7CisJY2hhciBleHRlbnRfc3RyWzMyXTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCWludCB2aXNpYmxlID0gMTsKKwljaGFyICpsaXN0X2l0ZW07CisJc2l6ZV90IGxpc3RfaXRlbV9sZW47CisJc3RydWN0IGRtX2xpc3QgKnJlc3VsdCA9IE5VTEw7CisKKwlpZiAoIShyZXN1bHQgPSBzdHJfbGlzdF9jcmVhdGUobWVtKSkpIHsKKwkJbG9nX2Vycm9yKCJfZm9ybWF0X3B2c2Vnczogc3RyX2xpc3RfY3JlYXRlIGZhaWxlZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAobWV0YWRhdGFfYXJlYXNfb25seSAmJiAoIXNlZ19pc19yYWlkX3dpdGhfbWV0YShzZWcpIHx8ICFzZWctPm1ldGFfYXJlYXMgfHwgbHZfaXNfcmFpZF9tZXRhZGF0YShzZWctPmx2KSB8fCBsdl9pc19yYWlkX2ltYWdlKHNlZy0+bHYpKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJc3dpdGNoIChtZXRhZGF0YV9hcmVhc19vbmx5ID8gc2VnX21ldGF0eXBlKHNlZywgcykgOiBzZWdfdHlwZShzZWcsIHMpKSB7CisJCWNhc2UgQVJFQV9MVjoKKwkJCWx2ID0gbWV0YWRhdGFfYXJlYXNfb25seSA/IHNlZ19tZXRhbHYoc2VnLCBzKSA6IHNlZ19sdihzZWcsIHMpOworCQkJc2VnX2xlbiA9IG1ldGFkYXRhX2FyZWFzX29ubHkgPyBzZWdfbWV0YWx2KHNlZywgcyktPmxlX2NvdW50IDogc2VnX2x2KHNlZywgcyktPmxlX2NvdW50OworCQkJdmlzaWJsZSA9IGx2X2lzX3Zpc2libGUobHYpOworCQkJbmFtZSA9IGx2LT5uYW1lOworCQkJZXh0ZW50ID0gbWV0YWRhdGFfYXJlYXNfb25seSA/IHNlZ19sZShzZWcsIHMpIDogMDsKKwkJCWJyZWFrOworCQljYXNlIEFSRUFfUFY6CisJCQkvKiBSYWlkIG1ldGFkYXRhIG5ldmVyIHVzZXMgUFZzIGRpcmVjdGx5ICovCisJCQlpZiAobWV0YWRhdGFfYXJlYXNfb25seSkKKwkJCQljb250aW51ZTsKKwkJCW5hbWUgPSBkZXZfbmFtZShzZWdfZGV2KHNlZywgcykpOworCQkJZXh0ZW50ID0gc2VnX3BlKHNlZywgcyk7CisJCQlzZWdfbGVuID0gc2VnLT5hcmVhX2xlbjsKKwkJCWJyZWFrOworCQljYXNlIEFSRUFfVU5BU1NJR05FRDoKKwkJCW5hbWUgPSAidW5hc3NpZ25lZCI7CisJCQlleHRlbnQgPSAwOworCQkJc2VnX2xlbiA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5rbm93biBhcmVhIHNlZ3R5cGUuIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWxpc3RfaXRlbV9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmICghdmlzaWJsZSAmJiBtYXJrX2hpZGRlbikKKwkJCS8qICsyIGZvciBbIF0gKi8KKwkJCWxpc3RfaXRlbV9sZW4gKz0gMjsKKworCQlpZiAocmFuZ2VfZm9ybWF0KSB7CisJCQlpZiAoZG1fc25wcmludGYoZXh0ZW50X3N0ciwgc2l6ZW9mKGV4dGVudF9zdHIpLAorCQkJCQkiOiUiIFBSSXUzMiAiLSUiIFBSSXUzMiwKKwkJCQkJZXh0ZW50LCBleHRlbnQgKyBzZWdfbGVuIC0gMSkgPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJfZm9ybWF0X3B2c2VnZ3M6IGV4dGVudCByYW5nZSBkbV9zbnByaW50ZiBmYWlsZWQiKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkbV9zbnByaW50ZihleHRlbnRfc3RyLCBzaXplb2YoZXh0ZW50X3N0ciksCisJCQkJCSIoJSIgUFJJdTMyICIpIiwgZXh0ZW50KSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoIl9mb3JtYXRfcHZzZWdzOiBleHRlbnQgbnVtYmVyIGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisJCWxpc3RfaXRlbV9sZW4gKz0gc3RybGVuKGV4dGVudF9zdHIpOworCQkvKiB0cmlhbGluZyAwICovCisJCWxpc3RfaXRlbV9sZW4gKz0gMTsKKworCQlpZiAoIShsaXN0X2l0ZW0gPSBkbV9wb29sX3phbGxvYyhtZW0sIGxpc3RfaXRlbV9sZW4pKSkgeworCQkJbG9nX2Vycm9yKCJfZm9ybWF0X3B2c2VnczogbGlzdCBpdGVtIGRtX3Bvb2xfemFsbG9jIGZhaWxlZCIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoZG1fc25wcmludGYobGlzdF9pdGVtLCBsaXN0X2l0ZW1fbGVuLAorCQkJCSIlcyVzJXMlcyIsCisJCQkJKCF2aXNpYmxlICYmIG1hcmtfaGlkZGVuKSA/ICJbIiA6ICIiLAorCQkJCW5hbWUsCisJCQkJKCF2aXNpYmxlICYmIG1hcmtfaGlkZGVuKSA/ICJdIiA6ICIiLAorCQkJCWV4dGVudF9zdHIpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJfZm9ybWF0X3B2c2VnczogbGlzdCBpdGVtIGRtc25wcmludGYgZmFpbGVkIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJlc3VsdCwgbGlzdF9pdGVtKSkgeworCQkJbG9nX2Vycm9yKCJfZm9ybWF0X3B2c2VnczogZmFpbGVkIHRvIGFkZCBpdGVtIHRvIGxpc3QiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXN1bHQ7CitiYWQ6CisJZG1fcG9vbF9mcmVlKG1lbSwgcmVzdWx0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2c2VnX2RldmljZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gX2Zvcm1hdF9wdnNlZ3MobWVtLCBzZWcsIDAsIDAsIDApOworfQorCitjaGFyICpsdnNlZ19kZXZpY2VzX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCisJaWYgKCEobGlzdCA9IGx2c2VnX2RldmljZXMobWVtLCBzZWcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gc3RyX2xpc3RfdG9fc3RyKG1lbSwgbGlzdCwgIiwiKTsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2c2VnX21ldGFkYXRhX2RldmljZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gX2Zvcm1hdF9wdnNlZ3MobWVtLCBzZWcsIDAsIDEsIDApOworfQorCitjaGFyICpsdnNlZ19tZXRhZGF0YV9kZXZpY2VzX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCisJaWYgKCEobGlzdCA9IGx2c2VnX2RldmljZXMobWVtLCBzZWcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gc3RyX2xpc3RfdG9fc3RyKG1lbSwgbGlzdCwgIiwiKTsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2c2VnX3NlZ19wZV9yYW5nZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gX2Zvcm1hdF9wdnNlZ3MobWVtLCBzZWcsIDEsIDAsIDApOworfQorCitjaGFyICpsdnNlZ19zZWdfcGVfcmFuZ2VzX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCisJaWYgKCEobGlzdCA9IGx2c2VnX3NlZ19wZV9yYW5nZXMobWVtLCBzZWcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gc3RyX2xpc3RfdG9fc3RyKG1lbSwgbGlzdCwgIiAiKTsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2c2VnX3NlZ19sZV9yYW5nZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gX2Zvcm1hdF9wdnNlZ3MobWVtLCBzZWcsIDEsIDAsIHNlZy0+bHYtPnZnLT5jbWQtPnJlcG9ydF9tYXJrX2hpZGRlbl9kZXZpY2VzKTsKK30KKworY2hhciAqbHZzZWdfc2VnX2xlX3Jhbmdlc19zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKworCWlmICghKGxpc3QgPSBsdnNlZ19zZWdfcGVfcmFuZ2VzKG1lbSwgc2VnKSkpCisJCXJldHVybl9OVUxMOworCisJcmV0dXJuIHN0cl9saXN0X3RvX3N0cihtZW0sIGxpc3QsIHNlZy0+bHYtPnZnLT5jbWQtPnJlcG9ydF9saXN0X2l0ZW1fc2VwYXJhdG9yKTsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2c2VnX3NlZ19tZXRhZGF0YV9sZV9yYW5nZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gX2Zvcm1hdF9wdnNlZ3MobWVtLCBzZWcsIDEsIDEsIHNlZy0+bHYtPnZnLT5jbWQtPnJlcG9ydF9tYXJrX2hpZGRlbl9kZXZpY2VzKTsKK30KKworY2hhciAqbHZzZWdfc2VnX21ldGFkYXRhX2xlX3Jhbmdlc19zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKworCWlmICghKGxpc3QgPSBsdnNlZ19zZWdfbWV0YWRhdGFfbGVfcmFuZ2VzKG1lbSwgc2VnKSkpCisJCXJldHVybl9OVUxMOworCisJcmV0dXJuIHN0cl9saXN0X3RvX3N0cihtZW0sIGxpc3QsIHNlZy0+bHYtPnZnLT5jbWQtPnJlcG9ydF9saXN0X2l0ZW1fc2VwYXJhdG9yKTsKK30KKworY2hhciAqbHZzZWdfdGFnc19kdXAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gdGFnc19mb3JtYXRfYW5kX2NvcHkoc2VnLT5sdi0+dmctPnZnbWVtLCAmc2VnLT50YWdzKTsKK30KKworY2hhciAqbHZzZWdfc2VndHlwZV9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCBsdnNlZ19uYW1lKHNlZykpOworfQorCitjaGFyICpsdnNlZ19kaXNjYXJkc19kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlyZXR1cm4gIGRtX3Bvb2xfc3RyZHVwKG1lbSwgZ2V0X3Bvb2xfZGlzY2FyZHNfbmFtZShzZWctPmRpc2NhcmRzKSk7Cit9CisKK2NoYXIgKmx2c2VnX2tlcm5lbF9kaXNjYXJkc19kdXBfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0pCit7CisJY29uc3QgY2hhciAqcyA9ICIiOworCWNoYXIgKnJldDsKKworCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19USElOX1BPT0wpCisJCXMgPSBnZXRfcG9vbF9kaXNjYXJkc19uYW1lKGx2ZG0tPnNlZ19zdGF0dXMudGhpbl9wb29sLT5kaXNjYXJkcyk7CisKKwlpZiAoIShyZXQgPSBkbV9wb29sX3N0cmR1cChtZW0sIHMpKSkgeworCQlsb2dfZXJyb3IoImx2c2VnX2tlcm5lbF9kaXNjYXJkc19kdXBfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzOiBkbV9wb29sX3N0cmR1cCBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworY2hhciAqbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCWNoYXIgKnJldCA9IE5VTEw7CisJc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyBzdGF0dXMgPSB7CisJCS5zZWdfc3RhdHVzID0geworCQkJLnR5cGUgPSBTRUdfU1RBVFVTX05PTkUsCisJCQkuc2VnID0gc2VnCisJCX0sCisJfTsKKworCWlmICghbHZfaXNfdGhpbl9wb29sKHNlZy0+bHYpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHN0YXR1cy5zZWdfc3RhdHVzLm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJyZXBvcnRlcl9wb29sIiwgMTAyNCkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHN0YXR1cy5pbmZvX29rID0gbHZfaW5mb193aXRoX3NlZ19zdGF0dXMoc2VnLT5sdi0+dmctPmNtZCwgc2VnLT5sdiwgc2VnLCAxLCAmc3RhdHVzLCAwLCAwKSkpCisJCWdvdG9fYmFkOworCisJcmV0ID0gbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMobWVtLCAmc3RhdHVzKTsKK2JhZDoKKwlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLnNlZ19zdGF0dXMubWVtKTsKKwlyZXR1cm4gcmV0OworfQorCitjaGFyICpsdnNlZ19jYWNoZW1vZGVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGdldF9jYWNoZV9tb2RlX25hbWUoc2VnKTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCBuYW1lKTsKK30KKworI2lmZGVmIERNRVZFTlRECisjICBpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKyNlbmRpZgorY2hhciAqbHZzZWdfbW9uaXRvcl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwljb25zdCBjaGFyICpzID0gIiI7CisKKyNpZmRlZiBETUVWRU5URAorCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlpbnQgcGVuZGluZyA9IDAsIG1vbml0b3JlZDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnbSA9IChzdHJ1Y3QgbHZfc2VnbWVudCAqKSBzZWc7CisKKwlpZiAobHZfaXNfY293KHNlZy0+bHYpICYmICFsdl9pc19tZXJnaW5nX2NvdyhzZWctPmx2KSkKKwkJc2VnbSA9IGZpcnN0X3NlZyhzZWctPmx2LT5zbmFwc2hvdC0+bHYpOworCisJLy8gbG9nX2RlYnVnKCJRdWVyeSBMVjolcyBtb246JXMgc2VnbTolcyB0Z3RtOiVwICBzZWdtb246JWQgc3RhdHVzbTolZCIsIHNlZy0+bHYtPm5hbWUsIHNlZ20tPmx2LT5uYW1lLCBzZWdtLT5zZWd0eXBlLT5uYW1lLCBzZWdtLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9tb25pdG9yZWQsIHNlZ19tb25pdG9yZWQoc2VnbSksIChpbnQpKHNlZ20tPnN0YXR1cyAmIFBWTU9WRSkpOworCWlmICgoZG1ldmVudGRfbW9uaXRvcl9tb2RlKCkgIT0gMSkgfHwKKwkgICAgIXNlZ20tPnNlZ3R5cGUtPm9wcyB8fAorCSAgICAhc2VnbS0+c2VndHlwZS0+b3BzLT50YXJnZXRfbW9uaXRvcmVkKQorCQkvKiBOb3RoaW5nIHRvIGRvLCBtb25pdG9yaW5nIG5vdCBzdXBwb3J0ZWQgKi87CisJZWxzZSBpZiAobHZfaXNfY293X2NvdmVyaW5nX29yaWdpbihzZWctPmx2KSkKKwkJLyogTm90aGluZyB0byBkbywgc25hcHNob3QgYWxyZWFkeSBjb3ZlcnMgb3JpZ2luICovOworCWVsc2UgaWYgKCFzZWdfbW9uaXRvcmVkKHNlZ20pIHx8IChzZWdtLT5zdGF0dXMgJiBQVk1PVkUpKQorCQlzID0gIm5vdCBtb25pdG9yZWQiOworCWVsc2UgaWYgKGx2X2luZm8oc2VnLT5sdi0+dmctPmNtZCwgc2VnLT5sdiwgMSwgJmluZm8sIDAsIDApICYmIGluZm8uZXhpc3RzKSB7CisJCW1vbml0b3JlZCA9IHNlZ20tPnNlZ3R5cGUtPm9wcy0+dGFyZ2V0X21vbml0b3JlZChzZWdtLCAmcGVuZGluZyk7CisJCWlmIChwZW5kaW5nKQorCQkJcyA9ICJwZW5kaW5nIjsKKwkJZWxzZQorCQkJcyA9IChtb25pdG9yZWQpID8gIm1vbml0b3JlZCIgOiAibm90IG1vbml0b3JlZCI7CisJfSAvLyBlbHNlIGxvZ19kZWJ1ZygiTm90IGFjdGl2ZSIpOworI2VuZGlmCisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKG1lbSwgcyk7Cit9CisKK3VpbnQ2NF90IGx2c2VnX2NodW5rc2l6ZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXVpbnQ2NF90IHNpemU7CisKKwlpZiAobHZfaXNfY293KHNlZy0+bHYpKQorCQlzaXplID0gKHVpbnQ2NF90KSBmaW5kX3NuYXBzaG90KHNlZy0+bHYpLT5jaHVua19zaXplOworCWVsc2UgaWYgKHNlZ19pc19wb29sKHNlZykpCisJCXNpemUgPSAodWludDY0X3QpIHNlZy0+Y2h1bmtfc2l6ZTsKKwllbHNlIGlmIChzZWdfaXNfY2FjaGUoc2VnKSkKKwkJcmV0dXJuIGx2c2VnX2NodW5rc2l6ZShmaXJzdF9zZWcoc2VnLT5wb29sX2x2KSk7CisJZWxzZQorCQlzaXplID0gVUlOVDY0X0MoMCk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworY29uc3QgY2hhciAqbHZzZWdfbmFtZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCS8qIFN1cHBvcnQgZXZlbiBzZWd0eXBlcyB3aXRob3V0ICdvcHMnICovCisJaWYgKHNlZy0+c2VndHlwZS0+b3BzICYmCisJICAgIHNlZy0+c2VndHlwZS0+b3BzLT5uYW1lKQorCQlyZXR1cm4gc2VnLT5zZWd0eXBlLT5vcHMtPm5hbWUoc2VnKTsKKworCXJldHVybiBzZWctPnNlZ3R5cGUtPm5hbWU7Cit9CisKK3VpbnQ2NF90IGx2c2VnX3N0YXJ0KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJcmV0dXJuICh1aW50NjRfdCkgc2VnLT5sZSAqIHNlZy0+bHYtPnZnLT5leHRlbnRfc2l6ZTsKK30KKwordWludDY0X3QgbHZzZWdfc2l6ZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXJldHVybiAodWludDY0X3QpIHNlZy0+bGVuICogc2VnLT5sdi0+dmctPmV4dGVudF9zaXplOworfQorCitkbV9wZXJjZW50X3QgbHZzZWdfcGVyY2VudF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSwKKwkJCQkJCSAgICBwZXJjZW50X2dldF90IHR5cGUpCit7CisJZG1fcGVyY2VudF90IHA7CisJdWludDY0X3QgY3NpemU7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwljb25zdCBzdHJ1Y3QgbHZfc2VnX3N0YXR1cyAqcyA9ICZsdmRtLT5zZWdfc3RhdHVzOworCisJLyoKKwkgKiBUT0RPOgorCSAqICAgTGF0ZXIgbW92ZSB0byBzZWdtZW50IG1ldGhvZHMsIGluc3RlYWQgb2YgdXNpbmcgc2luZ2xlIHBsYWNlLgorCSAqICAgQWxzbyBoYW5kbGUgbG9naWMgZm9yIG1pcnJvciBzZWdtZW50cyBhbmQgaXQgdG90YWxfKiBzdW1taW5nCisJICogICBFc2VudGlhbGx5IHJld29yayAgX3RhcmdldF9wZXJjZW50IEFQSSBmb3Igc2VndHlwZS4KKwkgKi8KKwlzd2l0Y2ggKHMtPnR5cGUpIHsKKwljYXNlIFNFR19TVEFUVVNfQ0FDSEU6CisJCWlmIChzLT5jYWNoZS0+ZmFpbCB8fCBzLT5jYWNoZS0+ZXJyb3IpCisJCQlwID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCQllbHNlIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBQRVJDRU5UX0dFVF9ESVJUWToKKwkJCQlwID0gZG1fbWFrZV9wZXJjZW50KHMtPmNhY2hlLT5kaXJ0eV9ibG9ja3MsCisJCQkJCQkgICAgcy0+Y2FjaGUtPnVzZWRfYmxvY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEVSQ0VOVF9HRVRfTUVUQURBVEE6CisJCQkJcCA9IGRtX21ha2VfcGVyY2VudChzLT5jYWNoZS0+bWV0YWRhdGFfdXNlZF9ibG9ja3MsCisJCQkJCQkgICAgcy0+Y2FjaGUtPm1ldGFkYXRhX3RvdGFsX2Jsb2Nrcyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXAgPSBkbV9tYWtlX3BlcmNlbnQocy0+Y2FjaGUtPnVzZWRfYmxvY2tzLAorCQkJCQkJICAgIHMtPmNhY2hlLT50b3RhbF9ibG9ja3MpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU0VHX1NUQVRVU19TTkFQU0hPVDoKKwkJaWYgKHMtPnNuYXBzaG90LT5tZXJnZV9mYWlsZWQpCisJCQlwID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCQllbHNlIGlmIChzLT5zbmFwc2hvdC0+aW52YWxpZCkKKwkJCXAgPSBETV9QRVJDRU5UXzEwMDsgLyogU2hvd24gYXMgMTAwJSBmdWxsICovCisJCWVsc2UgaWYgKHMtPnNuYXBzaG90LT5oYXNfbWV0YWRhdGFfc2VjdG9ycyAmJgorCQkJIChzLT5zbmFwc2hvdC0+dXNlZF9zZWN0b3JzID09IHMtPnNuYXBzaG90LT5tZXRhZGF0YV9zZWN0b3JzKSkKKwkJCXAgPSBETV9QRVJDRU5UXzA7CisJCWVsc2UKKwkJCXAgPSBkbV9tYWtlX3BlcmNlbnQocy0+c25hcHNob3QtPnVzZWRfc2VjdG9ycywKKwkJCQkJICAgIHMtPnNuYXBzaG90LT50b3RhbF9zZWN0b3JzKTsKKwkJYnJlYWs7CisJY2FzZSBTRUdfU1RBVFVTX1RISU5fUE9PTDoKKwkJaWYgKHMtPnRoaW5fcG9vbC0+ZmFpbCB8fCBzLT50aGluX3Bvb2wtPmVycm9yKQorCQkJcCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKwkJZWxzZSBpZiAodHlwZSA9PSBQRVJDRU5UX0dFVF9NRVRBREFUQSkKKwkJCXAgPSBkbV9tYWtlX3BlcmNlbnQocy0+dGhpbl9wb29sLT51c2VkX21ldGFkYXRhX2Jsb2NrcywKKwkJCQkJICAgIHMtPnRoaW5fcG9vbC0+dG90YWxfbWV0YWRhdGFfYmxvY2tzKTsKKwkJZWxzZQorCQkJcCA9IGRtX21ha2VfcGVyY2VudChzLT50aGluX3Bvb2wtPnVzZWRfZGF0YV9ibG9ja3MsCisJCQkJCSAgICBzLT50aGluX3Bvb2wtPnRvdGFsX2RhdGFfYmxvY2tzKTsKKwkJYnJlYWs7CisJY2FzZSBTRUdfU1RBVFVTX1RISU46CisJCWlmIChzLT50aGluLT5mYWlsIHx8ICh0eXBlICE9IFBFUkNFTlRfR0VUX0RBVEEpKQorCQkJLyogVE9ETzogZXhwb3NlIGhpZ2hlc3QgbWFwcGVkIHNlY3RvciAqLworCQkJcCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKwkJZWxzZSB7CisJCQlzZWcgPSBmaXJzdF9zZWcobHZkbS0+bHYpOworCQkJLyogUG9vbCBhbGxvY2F0ZXMgd2hvbGUgY2h1bmsgc28gcm91bmQtdXAgdG8gbmVhcmVzdCBvbmUgKi8KKwkJCWNzaXplID0gZmlyc3Rfc2VnKHNlZy0+cG9vbF9sdiktPmNodW5rX3NpemU7CisJCQljc2l6ZSA9ICgoc2VnLT5sdi0+c2l6ZSArIGNzaXplIC0gMSkgLyBjc2l6ZSkgKiBjc2l6ZTsKKwkJCWlmIChzLT50aGluLT5tYXBwZWRfc2VjdG9ycyA8PSBjc2l6ZSkKKwkJCQlwID0gZG1fbWFrZV9wZXJjZW50KHMtPnRoaW4tPm1hcHBlZF9zZWN0b3JzLCBjc2l6ZSk7CisJCQllbHNlIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogVGhpbiB2b2x1bWUgJXMgbWFwcyAlcyB3aGlsZSB0aGUgc2l6ZSBpcyBvbmx5ICVzLiIsCisJCQkJCSBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSwKKwkJCQkJIGRpc3BsYXlfc2l6ZShsdmRtLT5sdi0+dmctPmNtZCwgcy0+dGhpbi0+bWFwcGVkX3NlY3RvcnMpLAorCQkJCQkgZGlzcGxheV9zaXplKGx2ZG0tPmx2LT52Zy0+Y21kLCBjc2l6ZSkpOworCQkJCS8qIERvbid0IHNob3cgbm9uc2Vuc2UgbnVtYmVycyBsaWtlIGkuZS4gMTAwMCUgZnVsbCAqLworCQkJCXAgPSBETV9QRVJDRU5UXzEwMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCX0KKworCXJldHVybiBwOworfQorCit1aW50MzJfdCBsdl9rZXJuZWxfcmVhZF9haGVhZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdmluZm8gaW5mbzsKKworCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsICZpbmZvLCAwLCAxKSB8fCAhaW5mby5leGlzdHMpCisJCXJldHVybiBVSU5UMzJfTUFYOworCXJldHVybiBpbmZvLnJlYWRfYWhlYWQ7Cit9CisKK3N0cnVjdCBwdl9hbmRfaW50IHsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlpbnQgKmk7Cit9OworCitzdGF0aWMgaW50IF9sdl9pc19vbl9wdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCWludCAqaXNfb25fcHYgPSAoKHN0cnVjdCBwdl9hbmRfaW50ICopZGF0YSktPmk7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPSAoKHN0cnVjdCBwdl9hbmRfaW50ICopZGF0YSktPnB2OworCXVpbnQzMl90IHM7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYyOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlpZiAoIWx2IHx8ICEoZmlyc3Rfc2VnKGx2KSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBJZiB0aGUgTFYgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCB0byBiZSBvbiB0aGUgUFYsIHRoZW4KKwkgKiB3ZSBkb24ndCBuZWVkIHRvIGNvbnRpbnVlIGNoZWNraW5nIC0ganVzdCByZXR1cm4uCisJICovCisJaWYgKCppc19vbl9wdikKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9QVikKKwkJCQljb250aW51ZTsKKworCQkJcHYyID0gc2VnX3B2KHNlZywgcyk7CisJCQlpZiAoaWRfZXF1YWwoJnB2LT5pZCwgJnB2Mi0+aWQpKSB7CisJCQkJKmlzX29uX3B2ID0gMTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmIChwdi0+ZGV2ICYmIHB2Mi0+ZGV2ICYmCisJCQkgICAgKHB2LT5kZXYtPmRldiA9PSBwdjItPmRldi0+ZGV2KSkgeworCQkJCSppc19vbl9wdiA9IDE7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGx2X2lzX29uX3B2CisgKiBAbHY6CisgKiBAcHY6CisgKgorICogSWYgYW55IG9mIHRoZSBjb21wb25lbnQgZGV2aWNlcyBvZiB0aGUgTFYgYXJlIG9uIHRoZSBnaXZlbiBQViwgMQorICogaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSAwLiAgRm9yIGV4YW1wbGUgaWYgb25lIG9mIHRoZSBpbWFnZXMgb2YgYSBSQUlECisgKiAob3IgaXRzIG1ldGFkYXRhIGRldmljZSkgaXMgb24gdGhlIFBWLCAxIHdvdWxkIGJlIHJldHVybmVkIGZvciB0aGUKKyAqIHRvcC1sZXZlbCBMVi4KKyAqIElmIHlvdSB3aXNoIHRvIGNoZWNrIHRoZSBpbWFnZXMgdGhlbXNlbHZlcywgeW91IHNob3VsZCBwYXNzIHRoZW0uCisgKgorICogUmV0dXJuczogMSBpZiBMViAob3IgcGFydCBvZiBMVikgaXMgb24gUFYsIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBsdl9pc19vbl9wdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlpbnQgaXNfb25fcHYgPSAwOworCXN0cnVjdCBwdl9hbmRfaW50IGNvbnRleHQgPSB7IHB2LCAmaXNfb25fcHYgfTsKKworCWlmICghX2x2X2lzX29uX3B2KGx2LCAmY29udGV4dCkgfHwKKwkgICAgIWZvcl9lYWNoX3N1Yl9sdihsdiwgX2x2X2lzX29uX3B2LCAmY29udGV4dCkpCisJCS8qIEZhaWx1cmUgb25seSBoYXBwZW5zIGlmIGJhZCBhcmd1bWVudHMgYXJlIHBhc3NlZCAqLworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImZvcl9lYWNoX3N1Yl9sdiBmYWlsdXJlLiIpOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCIlcyBpcyAlc29uICVzIiwgbHYtPm5hbWUsCisJCQkgICBpc19vbl9wdiA/ICIiIDogIm5vdCAiLCBwdl9kZXZfbmFtZShwdikpOworCXJldHVybiBpc19vbl9wdjsKK30KKworLyoKKyAqIGx2X2lzX29uX3B2cworICogQGx2CisgKiBAcHZzCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBMViAob3IgcGFydCBvZiB0aGUgTFYpIGlzIG9uIGFueSBvZiB0aGUgcHZzCisgKiBpbiB0aGUgbGlzdCwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBsdl9pc19vbl9wdnMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IGRtX2xpc3QgKnB2cykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzKQorCQlpZiAobHZfaXNfb25fcHYobHYsIHB2bC0+cHYpKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X29yaWdpbl9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luID0gTlVMTDsKKworCWlmIChsdl9pc19jb3cobHYpKQorCQlvcmlnaW4gPSBvcmlnaW5fZnJvbV9jb3cobHYpOworCWVsc2UgaWYgKGx2X2lzX2NhY2hlKGx2KSAmJiBmaXJzdF9zZWcobHYpLT5vcmlnaW4pCisJCW9yaWdpbiA9IGZpcnN0X3NlZyhsdiktPm9yaWdpbjsKKwllbHNlIGlmIChsdl9pc190aGluX3ZvbHVtZShsdikgJiYgZmlyc3Rfc2VnKGx2KS0+b3JpZ2luKQorCQlvcmlnaW4gPSBmaXJzdF9zZWcobHYpLT5vcmlnaW47CisJZWxzZSBpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpICYmIGZpcnN0X3NlZyhsdiktPmV4dGVybmFsX2x2KQorCQlvcmlnaW4gPSBmaXJzdF9zZWcobHYpLT5leHRlcm5hbF9sdjsKKworCXJldHVybiBvcmlnaW47Cit9CisKK3N0YXRpYyBjaGFyICpfZG9fbHZfb3JpZ2luX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIGludCB1dWlkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2x2ID0gbHZfb3JpZ2luX2x2KGx2KTsKKworCWlmICghb3JpZ2luX2x2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1dWlkKQorCQlyZXR1cm4gbHZfdXVpZF9kdXAobWVtLCBvcmlnaW5fbHYpOworCWVsc2UKKwkJcmV0dXJuIGx2X25hbWVfZHVwKG1lbSwgb3JpZ2luX2x2KTsKK30KKworY2hhciAqbHZfb3JpZ2luX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfZG9fbHZfb3JpZ2luX2R1cChtZW0sIGx2LCAwKTsKK30KKworY2hhciAqbHZfb3JpZ2luX3V1aWRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9kb19sdl9vcmlnaW5fZHVwKG1lbSwgbHYsIDEpOworfQorCitjaGFyICpsdl9uYW1lX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0sIGx2LT5uYW1lKTsKK30KKworY2hhciAqbHZfZnVsbG5hbWVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY2hhciBsdmZ1bGxuYW1lW05BTUVfTEVOICogMiArIDJdOworCisJaWYgKGRtX3NucHJpbnRmKGx2ZnVsbG5hbWUsIHNpemVvZihsdmZ1bGxuYW1lKSwgIiVzLyVzIiwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigibHZmdWxsbmFtZSBzbnByaW50ZiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKG1lbSwgbHZmdWxsbmFtZSk7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfcGFyZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwYXJlbnRfbHYgPSBOVUxMOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlpZiAobHZfaXNfdmlzaWJsZShsdikpCisJCTsKKwllbHNlIGlmICgobHZfaXNfbWlycm9yX2ltYWdlKGx2KSB8fCBsdl9pc19taXJyb3JfbG9nKGx2KSkgfHwKKwkJIChsdl9pc19yYWlkX2ltYWdlKGx2KSB8fCBsdl9pc19yYWlkX21ldGFkYXRhKGx2KSkgfHwKKwkJIChsdl9pc19jYWNoZV9wb29sX2RhdGEobHYpIHx8IGx2X2lzX2NhY2hlX3Bvb2xfbWV0YWRhdGEobHYpKSB8fAorCQkgKGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSB8fCBsdl9pc190aGluX3Bvb2xfbWV0YWRhdGEobHYpKSkgeworCQlpZiAoIShzZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYobHYpKSkKKwkJCXN0YWNrOworCQllbHNlCisJCQlwYXJlbnRfbHYgPSBzZWctPmx2OworCX0KKworCXJldHVybiBwYXJlbnRfbHY7Cit9CisKK2NoYXIgKmx2X3BhcmVudF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBhcmVudF9sdiA9IGx2X3BhcmVudChsdik7CisKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCBwYXJlbnRfbHYgPyBwYXJlbnRfbHYtPm5hbWUgOiAiIik7Cit9CisKK2NoYXIgKmx2X21vZHVsZXNfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGRtX2xpc3QgKm1vZHVsZXM7CisKKwlpZiAoIShtb2R1bGVzID0gc3RyX2xpc3RfY3JlYXRlKG1lbSkpKSB7CisJCWxvZ19lcnJvcigibW9kdWxlcyBzdHJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWxpc3RfbHZfbW9kdWxlcyhtZW0sIGx2LCBtb2R1bGVzKSkKKwkJcmV0dXJuX05VTEw7CisJcmV0dXJuIHRhZ3NfZm9ybWF0X2FuZF9jb3B5KG1lbSwgbW9kdWxlcyk7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlycm9yX2xvZ19sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWlmIChzZWdfaXNfbWlycm9yZWQoc2VnKSAmJiBzZWctPmxvZ19sdikKKwkJCXJldHVybiBzZWctPmxvZ19sdjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKl9kb19sdl9taXJyb3JfbG9nX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgIGludCB1dWlkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWlycm9yX2xvZ19sdiA9IGx2X21pcnJvcl9sb2dfbHYobHYpOworCisJaWYgKCFtaXJyb3JfbG9nX2x2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1dWlkKQorCQlyZXR1cm4gbHZfdXVpZF9kdXAobWVtLCBtaXJyb3JfbG9nX2x2KTsKKwllbHNlCisJCXJldHVybiBsdl9uYW1lX2R1cChtZW0sIG1pcnJvcl9sb2dfbHYpOworfQorCitjaGFyICpsdl9taXJyb3JfbG9nX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfZG9fbHZfbWlycm9yX2xvZ19kdXAobWVtLCBsdiwgMCk7Cit9CisKK2NoYXIgKmx2X21pcnJvcl9sb2dfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gX2RvX2x2X21pcnJvcl9sb2dfZHVwKG1lbSwgbHYsIDEpOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3Bvb2xfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSB8fCBsdl9pc19jYWNoZShsdikpID8KKwkJCQkgIGZpcnN0X3NlZyhsdikgOiBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiA9IHNlZyA/IHNlZy0+cG9vbF9sdiA6IE5VTEw7CisKKwlyZXR1cm4gcG9vbF9sdjsKK30KKworc3RhdGljIGNoYXIgKl9kb19sdl9wb29sX2x2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCWludCB1dWlkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiA9IGx2X3Bvb2xfbHYobHYpOworCisJaWYgKCFwb29sX2x2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1dWlkKQorCQlyZXR1cm4gbHZfdXVpZF9kdXAobWVtLCBwb29sX2x2KTsKKwllbHNlCisJCXJldHVybiBsdl9uYW1lX2R1cChtZW0sIHBvb2xfbHYpOworfQorCitjaGFyICpsdl9wb29sX2x2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfZG9fbHZfcG9vbF9sdl9kdXAobWVtLCBsdiwgMCk7Cit9CisKK2NoYXIgKmx2X3Bvb2xfbHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gX2RvX2x2X3Bvb2xfbHZfZHVwKG1lbSwgbHYsIDEpOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2RhdGFfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGx2X2lzX3RoaW5fcG9vbChsdikgfHwgbHZfaXNfY2FjaGVfcG9vbChsdikpID8KKwkJCQkgIGZpcnN0X3NlZyhsdikgOiBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZGF0YV9sdiA9IHNlZyA/IHNlZ19sdihzZWcsIDApIDogTlVMTDsKKworCXJldHVybiBkYXRhX2x2OworfQorCitzdGF0aWMgY2hhciAqX2RvX2x2X2RhdGFfbHZfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJaW50IHV1aWQpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpkYXRhX2x2ID0gbHZfZGF0YV9sdihsdik7CisKKwlpZiAoIWRhdGFfbHYpCisJCXJldHVybiBOVUxMOworCisJaWYgKHV1aWQpCisJCXJldHVybiBsdl91dWlkX2R1cChtZW0sIGRhdGFfbHYpOworCWVsc2UKKwkJcmV0dXJuIGx2X25hbWVfZHVwKG1lbSwgZGF0YV9sdik7Cit9CisKK2NoYXIgKmx2X2RhdGFfbHZfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9kb19sdl9kYXRhX2x2X2R1cChtZW0sIGx2LCAwKTsKK30KKworY2hhciAqbHZfZGF0YV9sdl91dWlkX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfZG9fbHZfZGF0YV9sdl9kdXAobWVtLCBsdiwgMSk7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWV0YWRhdGFfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGx2X2lzX3RoaW5fcG9vbChsdikgfHwgbHZfaXNfY2FjaGVfcG9vbChsdikpID8KKwkJCQkgIGZpcnN0X3NlZyhsdikgOiBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWV0YWRhdGFfbHYgPSBzZWcgPyBzZWctPm1ldGFkYXRhX2x2IDogTlVMTDsKKworCXJldHVybiBtZXRhZGF0YV9sdjsKK30KKworc3RhdGljIGNoYXIgKl9kb19sdl9tZXRhZGF0YV9sdl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgaW50IHV1aWQpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptZXRhZGF0YV9sdiA9IGx2X21ldGFkYXRhX2x2KGx2KTsKKworCWlmICghbWV0YWRhdGFfbHYpCisJCXJldHVybiBOVUxMOworCisJaWYgKHV1aWQpCisJCXJldHVybiBsdl91dWlkX2R1cChtZW0sIG1ldGFkYXRhX2x2KTsKKwllbHNlCisJCXJldHVybiBsdl9uYW1lX2R1cChtZW0sIG1ldGFkYXRhX2x2KTsKK30KKworY2hhciAqbHZfbWV0YWRhdGFfbHZfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9kb19sdl9tZXRhZGF0YV9sdl9kdXAobWVtLCBsdiwgMCk7Cit9CisKK2NoYXIgKmx2X21ldGFkYXRhX2x2X3V1aWRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9kb19sdl9tZXRhZGF0YV9sdl9kdXAobWVtLCBsdiwgMSk7Cit9CisKK2NvbnN0IGNoYXIgKmx2X2xheWVyKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpCisJCXJldHVybiAidHBvb2wiOworCWVsc2UgaWYgKGx2X2lzX29yaWdpbihsdikgfHwgbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkKKwkJcmV0dXJuICJyZWFsIjsKKworCXJldHVybiBOVUxMOworfQorCitpbnQgbHZfa2VybmVsX21pbm9yKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCisJaWYgKGx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkgJiYgaW5mby5leGlzdHMpCisJCXJldHVybiBpbmZvLm1pbm9yOworCXJldHVybiAtMTsKK30KKworaW50IGx2X2tlcm5lbF9tYWpvcihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlpZiAobHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsICZpbmZvLCAwLCAwKSAmJiBpbmZvLmV4aXN0cykKKwkJcmV0dXJuIGluZm8ubWFqb3I7CisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NvbnZlcnRfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJaWYgKGx2X2lzX2NvbnZlcnRpbmcobHYpIHx8IGx2X2lzX21pcnJvcmVkKGx2KSkgeworCQlzZWcgPSBmaXJzdF9zZWcobHYpOworCisJCS8qIFRlbXBvcmFyeSBtaXJyb3IgaXMgYWx3YXlzIGFyZWFfbnVtID09IDAgKi8KKwkJaWYgKHNlZ190eXBlKHNlZywgMCkgPT0gQVJFQV9MViAmJgorCQkgICAgaXNfdGVtcG9yYXJ5X21pcnJvcl9sYXllcihzZWdfbHYoc2VnLCAwKSkpCisJCQlyZXR1cm4gc2VnX2x2KHNlZywgMCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyICpfZG9fbHZfY29udmVydF9sdl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICBpbnQgdXVpZCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvbnZlcnRfbHYgPSBsdl9jb252ZXJ0X2x2KGx2KTsKKworCWlmICghY29udmVydF9sdikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodXVpZCkKKwkJcmV0dXJuIGx2X3V1aWRfZHVwKG1lbSwgY29udmVydF9sdik7CisJZWxzZQorCQlyZXR1cm4gbHZfbmFtZV9kdXAobWVtLCBjb252ZXJ0X2x2KTsKK30KKworY2hhciAqbHZfY29udmVydF9sdl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gX2RvX2x2X2NvbnZlcnRfbHZfZHVwKG1lbSwgbHYsIDApOworfQorCitjaGFyICpsdl9jb252ZXJ0X2x2X3V1aWRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIF9kb19sdl9jb252ZXJ0X2x2X2R1cChtZW0sIGx2LCAxKTsKK30KKworc3RhdGljIGNoYXIgKl9kb19sdl9tb3ZlX3B2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCWludCB1dWlkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWltYWdlMF9sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZzsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpIHsKKwkJaWYgKHNlZy0+c3RhdHVzICYgUFZNT1ZFKSB7CisJCQlpZiAoc2VnX3R5cGUoc2VnLCAwKSA9PSBBUkVBX0xWKSB7IC8qIGF0b21pYyBwdm1vdmUgKi8KKwkJCQltaW1hZ2UwX2x2ID0gc2VnX2x2KHNlZywgMCk7CisJCQkJaWYgKCFsdl9pc19taXJyb3JfaW1hZ2UobWltYWdlMF9sdikpIHsKKwkJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkJCQkgICJCYWQgcHZtb3ZlIHN0cnVjdHVyZSIpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQkJcHZzZWcgPSBzZWdfcHZzZWcoZmlyc3Rfc2VnKG1pbWFnZTBfbHYpLCAwKTsKKwkJCX0gZWxzZSAvKiBTZWdtZW50IHB2bW92ZSAqLworCQkJCXB2c2VnID0gc2VnX3B2c2VnKHNlZywgMCk7CisKKwkJCWlmICh1dWlkKQorCQkJCXJldHVybiBwdl91dWlkX2R1cChtZW0sIHB2c2VnLT5wdik7CisJCQllbHNlCisJCQkJcmV0dXJuIHB2X25hbWVfZHVwKG1lbSwgcHZzZWctPnB2KTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitjaGFyICpsdl9tb3ZlX3B2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfZG9fbHZfbW92ZV9wdl9kdXAobWVtLCBsdiwgMCk7Cit9CisKK2NoYXIgKmx2X21vdmVfcHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gX2RvX2x2X21vdmVfcHZfZHVwKG1lbSwgbHYsIDEpOworfQorCit1aW50NjRfdCBsdl9vcmlnaW5fc2l6ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlpZiAobHZfaXNfY293KGx2KSkKKwkJcmV0dXJuICh1aW50NjRfdCkgZmluZF9zbmFwc2hvdChsdiktPmxlbiAqIGx2LT52Zy0+ZXh0ZW50X3NpemU7CisKKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpICYmIChzZWcgPSBmaXJzdF9zZWcobHYpKSAmJgorCSAgICBzZWctPmV4dGVybmFsX2x2KQorCQlyZXR1cm4gc2VnLT5leHRlcm5hbF9sdi0+c2l6ZTsKKworCWlmIChsdl9pc19vcmlnaW4obHYpKQorCQlyZXR1cm4gbHYtPnNpemU7CisKKwlyZXR1cm4gMDsKK30KKwordWludDY0X3QgbHZfbWV0YWRhdGFfc2l6ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAobHZfaXNfdGhpbl9wb29sKGx2KSB8fCBsdl9pc19jYWNoZV9wb29sKGx2KSkgPworCQlmaXJzdF9zZWcobHYpIDogTlVMTDsKKworCXJldHVybiBzZWcgPyBzZWctPm1ldGFkYXRhX2x2LT5zaXplIDogMDsKK30KKworY2hhciAqbHZfcGF0aF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljaGFyICpyZXBzdHI7CisJc2l6ZV90IGxlbjsKKworCS8qIE9ubHkgZm9yIHZpc2libGUgZGV2aWNlcyB0aGF0IGdldCBhIGxpbmsgZnJvbSAvZGV2L3ZnICovCisJaWYgKCEqbHYtPnZnLT5uYW1lIHx8ICFsdl9pc192aXNpYmxlKGx2KSB8fCBsdl9pc190aGluX3Bvb2wobHYpKQorCQlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCAiIik7CisKKwlsZW4gPSBzdHJsZW4obHYtPnZnLT5jbWQtPmRldl9kaXIpICsgc3RybGVuKGx2LT52Zy0+bmFtZSkgKworCQlzdHJsZW4obHYtPm5hbWUpICsgMjsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgbGVuKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYocmVwc3RyLCBsZW4sICIlcyVzLyVzIiwKKwkJCWx2LT52Zy0+Y21kLT5kZXZfZGlyLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJsdnBhdGggc25wcmludGYgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByZXBzdHI7Cit9CisKK2NoYXIgKmx2X2RtcGF0aF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljaGFyICpuYW1lOworCWNoYXIgKnJlcHN0cjsKKwlzaXplX3QgbGVuOworCisJaWYgKCEqbHYtPnZnLT5uYW1lKQorCQlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCAiIik7CisKKwlpZiAoIShuYW1lID0gZG1fYnVpbGRfZG1fbmFtZShtZW0sIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoImRtX2J1aWxkX2RtX25hbWUgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxlbiA9IHN0cmxlbihkbV9kaXIoKSkgKyBzdHJsZW4obmFtZSkgKyAyOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF96YWxsb2MobWVtLCBsZW4pKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbV9zbnByaW50ZihyZXBzdHIsIGxlbiwgIiVzLyVzIiwgZG1fZGlyKCksIG5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoImx2X2RtcGF0aCBzbnByaW50ZiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJlcHN0cjsKK30KKworY2hhciAqbHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gaWRfZm9ybWF0X2FuZF9jb3B5KG1lbSA/IG1lbSA6IGx2LT52Zy0+dmdtZW0sICZsdi0+bHZpZC5pZFsxXSk7Cit9CisKK2NoYXIgKmx2X3RhZ3NfZHVwKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIHRhZ3NfZm9ybWF0X2FuZF9jb3B5KGx2LT52Zy0+dmdtZW0sICZsdi0+dGFncyk7Cit9CisKK3VpbnQ2NF90IGx2X3NpemUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gbHYtPnNpemU7Cit9CisKK2ludCBsdl9taXJyb3JfaW1hZ2VfaW5fc3luYyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWRtX3BlcmNlbnRfdCBwZXJjZW50OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cnVjdCBsdl9zZWdtZW50ICptaXJyb3Jfc2VnOworCisJaWYgKCEobHYtPnN0YXR1cyAmIE1JUlJPUl9JTUFHRSkgfHwgIXNlZyB8fAorCSAgICAhKG1pcnJvcl9zZWcgPSBmaW5kX21pcnJvcl9zZWcoc2VnKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW5ub3QgZmluZCBtaXJyb3Igc2VnbWVudC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsdl9taXJyb3JfcGVyY2VudChsdi0+dmctPmNtZCwgbWlycm9yX3NlZy0+bHYsIDAsICZwZXJjZW50LAorCQkJICAgICAgIE5VTEwpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAocGVyY2VudCA9PSBETV9QRVJDRU5UXzEwMCkgPyAxIDogMDsKK30KKworaW50IGx2X3JhaWRfaW1hZ2VfaW5fc3luYyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVuc2lnbmVkIHM7CisJZG1fcGVyY2VudF90IHBlcmNlbnQ7CisJY2hhciAqcmFpZF9oZWFsdGg7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgKnJhaWRfc2VnID0gTlVMTDsKKworCS8qCisJICogSWYgdGhlIExWIGlzIG5vdCBhY3RpdmUgbG9jYWxseSwKKwkgKiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgc3RhdHVzCisJICovCisJaWYgKCFsdl9pc19hY3RpdmVfbG9jYWxseShsdikpCisJCXJldHVybiAwOyAgLyogQXNzdW1lIG5vdCBpbi1zeW5jICovCisKKwlpZiAoIWx2X2lzX3JhaWRfaW1hZ2UobHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgaXMgbm90IGEgUkFJRCBpbWFnZSIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChzZWcgPSBmaXJzdF9zZWcobHYpKSkKKwkJcmFpZF9zZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYoc2VnLT5sdik7CisKKwlpZiAoIXJhaWRfc2VnKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgUkFJRCBzZWdtZW50IGZvciAlcyIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzZWdfaXNfcmFpZChyYWlkX3NlZykpIHsKKwkJbG9nX2Vycm9yKCIlcyBvbiAlcyBpcyBub3QgYSBSQUlEIHNlZ21lbnQiLAorCQkJICByYWlkX3NlZy0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsdl9yYWlkX3BlcmNlbnQocmFpZF9zZWctPmx2LCAmcGVyY2VudCkpCisJCXJldHVybl8wOworCisJaWYgKHBlcmNlbnQgPT0gRE1fUEVSQ0VOVF8xMDApCisJCXJldHVybiAxOworCisJLyogRmluZCBvdXQgd2hpY2ggc3ViLUxWIHRoaXMgaXMuICovCisJZm9yIChzID0gMDsgcyA8IHJhaWRfc2VnLT5hcmVhX2NvdW50OyBzKyspCisJCWlmIChzZWdfbHYocmFpZF9zZWcsIHMpID09IGx2KQorCQkJYnJlYWs7CisJaWYgKHMgPT0gcmFpZF9zZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJzdWItTFYgJXMgd2FzIG5vdCBmb3VuZCBpbiByYWlkIHNlZ21lbnQiLAorCQkJICBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHZfcmFpZF9kZXZfaGVhbHRoKHJhaWRfc2VnLT5sdiwgJnJhaWRfaGVhbHRoKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAocmFpZF9oZWFsdGhbc10gPT0gJ0EnKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogX2x2X3JhaWRfaGVhbHRoeQorICogQGx2OiBBIFJBSURfSU1BR0UsIFJBSURfTUVUQSwgb3IgUkFJRCBsb2dpY2FsIHZvbHVtZS4KKyAqCisgKiBSZXR1cm5zOiAxIGlmIGhlYWx0aHksIDAgaWYgZGV2aWNlIGlzIG5vdCBoZWFsdGgKKyAqLworaW50IGx2X3JhaWRfaGVhbHRoeShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVuc2lnbmVkIHM7CisJY2hhciAqcmFpZF9oZWFsdGg7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgKnJhaWRfc2VnID0gTlVMTDsKKworCS8qCisJICogSWYgdGhlIExWIGlzIG5vdCBhY3RpdmUgbG9jYWxseSwKKwkgKiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgc3RhdHVzCisJICovCisJaWYgKCFsdl9pc19hY3RpdmVfbG9jYWxseShsdikpCisJCXJldHVybiAxOyAgLyogYXNzdW1lIGhlYWx0aHkgKi8KKworCWlmICghbHZfaXNfcmFpZF90eXBlKGx2KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIGlzIG5vdCBvZiBSQUlEIHR5cGUiLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19yYWlkKGx2KSkKKwkJcmFpZF9zZWcgPSBmaXJzdF9zZWcobHYpOworCWVsc2UgaWYgKChzZWcgPSBmaXJzdF9zZWcobHYpKSkKKwkJcmFpZF9zZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYoc2VnLT5sdik7CisKKwlpZiAoIXJhaWRfc2VnKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgUkFJRCBzZWdtZW50IGZvciAlcyIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzZWdfaXNfcmFpZChyYWlkX3NlZykpIHsKKwkJbG9nX2Vycm9yKCIlcyBvbiAlcyBpcyBub3QgYSBSQUlEIHNlZ21lbnQiLAorCQkJICByYWlkX3NlZy0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsdl9yYWlkX2Rldl9oZWFsdGgocmFpZF9zZWctPmx2LCAmcmFpZF9oZWFsdGgpKQorCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19yYWlkKGx2KSkgeworCQlpZiAoc3RyY2hyKHJhaWRfaGVhbHRoLCAnRCcpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKworCS8qIEZpbmQgb3V0IHdoaWNoIHN1Yi1MViB0aGlzIGlzLiAqLworCWZvciAocyA9IDA7IHMgPCByYWlkX3NlZy0+YXJlYV9jb3VudDsgcysrKQorCQlpZiAoKGx2X2lzX3JhaWRfaW1hZ2UobHYpICYmIChzZWdfbHYocmFpZF9zZWcsIHMpID09IGx2KSkgfHwKKwkJICAgIChsdl9pc19yYWlkX21ldGFkYXRhKGx2KSAmJiAoc2VnX21ldGFsdihyYWlkX3NlZywgcykgPT0gbHYpKSkKKwkJCWJyZWFrOworCWlmIChzID09IHJhaWRfc2VnLT5hcmVhX2NvdW50KSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAic3ViLUxWICVzIHdhcyBub3QgZm91bmQgaW4gcmFpZCBzZWdtZW50IiwKKwkJCSAgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmFpZF9oZWFsdGhbc10gPT0gJ0QnKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitjaGFyICpsdl9hdHRyX2R1cF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gbHZkbS0+bHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwljaGFyICpyZXBzdHI7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3phbGxvYyhtZW0sIDExKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBCbGFuayBpZiB0aGlzIGlzIGEgImZyZWUgc3BhY2UiIExWLiAqLworCWlmICghKmx2LT5uYW1lICYmICFsdl9pc19oaXN0b3JpY2FsKGx2KSkKKwkJZ290byBvdXQ7CisKKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkKKwkJcmVwc3RyWzBdID0gJ3AnOworCWVsc2UgaWYgKGx2LT5zdGF0dXMgJiBDT05WRVJUSU5HKQorCQlyZXBzdHJbMF0gPSAnYyc7CisJLyogT3JpZ2luIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBtaXJyb3IgYW5kIHRoaW4gdm9sdW1lICovCisJZWxzZSBpZiAobHZfaXNfb3JpZ2luKGx2KSB8fCBsdl9pc19leHRlcm5hbF9vcmlnaW4obHYpKQorCQlyZXBzdHJbMF0gPSAobHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpKSA/ICdPJyA6ICdvJzsKKwllbHNlIGlmIChsdl9pc19wb29sX21ldGFkYXRhKGx2KSB8fAorCQkgbHZfaXNfcG9vbF9tZXRhZGF0YV9zcGFyZShsdikgfHwKKwkJIGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpKQorCQlyZXBzdHJbMF0gPSAnZSc7CisJZWxzZSBpZiAobHZfaXNfY2FjaGVfdHlwZShsdikpCisJCXJlcHN0clswXSA9ICdDJzsKKwllbHNlIGlmIChsdl9pc19yYWlkKGx2KSkKKwkJcmVwc3RyWzBdID0gKGx2X2lzX25vdF9zeW5jZWQobHYpKSA/ICdSJyA6ICdyJzsKKwllbHNlIGlmIChsdl9pc19taXJyb3IobHYpKQorCQlyZXBzdHJbMF0gPSAobHZfaXNfbm90X3N5bmNlZChsdikpID8gJ00nIDogJ20nOworCWVsc2UgaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSkKKwkJcmVwc3RyWzBdID0gbHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpID8KKwkJCSdPJyA6IChsdl9pc19tZXJnaW5nX3RoaW5fc25hcHNob3QobHYpID8gJ1MnIDogJ1YnKTsKKwllbHNlIGlmIChsdl9pc192aXJ0dWFsKGx2KSkKKwkJcmVwc3RyWzBdID0gJ3YnOworCWVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpCisJCXJlcHN0clswXSA9ICd0JzsKKwllbHNlIGlmIChsdl9pc190aGluX3Bvb2xfZGF0YShsdikpCisJCXJlcHN0clswXSA9ICdUJzsKKwllbHNlIGlmIChsdl9pc19taXJyb3JfaW1hZ2UobHYpKQorCQlyZXBzdHJbMF0gPSAobHZfbWlycm9yX2ltYWdlX2luX3N5bmMobHYpKSA/ICdpJyA6ICdJJzsKKwllbHNlIGlmIChsdl9pc19yYWlkX2ltYWdlKGx2KSkKKwkJLyoKKwkJICogVmlzaWJsZSBSQUlEX0lNQUdFUyBhcmUgc3ViLUxWcyB0aGF0IGhhdmUgYmVlbiBleHBvc2VkIGZvcgorCQkgKiB0b3AtbGV2ZWwgdXNlIGJ5IGJlaW5nIHNwbGl0IGZyb20gdGhlIFJBSUQgYXJyYXkgd2l0aAorCQkgKiAnLS1zcGxpdG1pcnJvcnMgMSAtLXRyYWNrY2hhbmdlcycuICBUaGV5IGFsd2F5cyByZXBvcnQgJ0knLgorCQkgKi8KKwkJcmVwc3RyWzBdID0gKCFsdl9pc192aXNpYmxlKGx2KSAmJiBsdl9yYWlkX2ltYWdlX2luX3N5bmMobHYpKSA/CisJCQknaScgOiAnSSc7CisJZWxzZSBpZiAobHZfaXNfbWlycm9yX2xvZyhsdikpCisJCXJlcHN0clswXSA9ICdsJzsKKwllbHNlIGlmIChsdl9pc19jb3cobHYpKQorCQlyZXBzdHJbMF0gPSAobHZfaXNfbWVyZ2luZ19jb3cobHYpKSA/ICdTJyA6ICdzJzsKKwllbHNlIGlmIChsdl9pc19jYWNoZV9vcmlnaW4obHYpKQorCQlyZXBzdHJbMF0gPSAnbyc7CisJZWxzZQorCQlyZXBzdHJbMF0gPSAnLSc7CisKKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkKKwkJcmVwc3RyWzFdID0gJy0nOworCWVsc2UgaWYgKGx2LT5zdGF0dXMgJiBMVk1fV1JJVEUpCisJCXJlcHN0clsxXSA9ICd3JzsKKwllbHNlIGlmIChsdi0+c3RhdHVzICYgTFZNX1JFQUQpCisJCXJlcHN0clsxXSA9ICdyJzsKKwllbHNlCisJCXJlcHN0clsxXSA9ICctJzsKKworCXJlcHN0clsyXSA9IGFsbG9jX3BvbGljeV9jaGFyKGx2LT5hbGxvYyk7CisKKwlpZiAobHZfaXNfbG9ja2VkKGx2KSkKKwkJcmVwc3RyWzJdID0gdG91cHBlcihyZXBzdHJbMl0pOworCisJcmVwc3RyWzNdID0gKGx2LT5zdGF0dXMgJiBGSVhFRF9NSU5PUikgPyAnbScgOiAnLSc7CisKKwlpZiAobHZfaXNfaGlzdG9yaWNhbChsdikpIHsKKwkJcmVwc3RyWzRdID0gJ2gnOworCQlyZXBzdHJbNV0gPSAnLSc7CisJfSBlbHNlIGlmICghYWN0aXZhdGlvbigpIHx8ICFsdmRtLT5pbmZvX29rKSB7CisJCXJlcHN0cls0XSA9ICdYJzsJCS8qIFVua25vd24gKi8KKwkJcmVwc3RyWzVdID0gJ1gnOwkJLyogVW5rbm93biAqLworCX0gZWxzZSBpZiAobHZkbS0+aW5mby5leGlzdHMpIHsKKwkJaWYgKGx2ZG0tPmluZm8uc3VzcGVuZGVkKQorCQkJcmVwc3RyWzRdID0gJ3MnOwkvKiBTdXNwZW5kZWQgKi8KKwkJZWxzZSBpZiAobHZkbS0+aW5mby5saXZlX3RhYmxlKQorCQkJcmVwc3RyWzRdID0gJ2EnOwkvKiBBY3RpdmUgKi8KKwkJZWxzZSBpZiAobHZkbS0+aW5mby5pbmFjdGl2ZV90YWJsZSkKKwkJCXJlcHN0cls0XSA9ICdpJzsJLyogSW5hY3RpdmUgd2l0aCB0YWJsZSAqLworCQllbHNlCisJCQlyZXBzdHJbNF0gPSAnZCc7CS8qIEluYWN0aXZlIHdpdGhvdXQgdGFibGUgKi8KKworCQkvKiBTbmFwc2hvdCBkcm9wcGVkPyAqLworCQlpZiAobHZkbS0+aW5mby5saXZlX3RhYmxlICYmCisJCSAgICAobHZkbS0+c2VnX3N0YXR1cy50eXBlID09IFNFR19TVEFUVVNfU05BUFNIT1QpKSB7CisJCQlpZiAobHZkbS0+c2VnX3N0YXR1cy5zbmFwc2hvdC0+aW52YWxpZCkgeworCQkJCWlmIChsdmRtLT5pbmZvLnN1c3BlbmRlZCkKKwkJCQkJcmVwc3RyWzRdID0gJ1MnOyAvKiBTdXNwIEludiBzbmFwc2hvdCAqLworCQkJCWVsc2UKKwkJCQkJcmVwc3RyWzRdID0gJ0knOyAvKiBJbnZhbGlkIHNuYXBzaG90ICovCisJCQl9IGVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMuc25hcHNob3QtPm1lcmdlX2ZhaWxlZCkgeworCQkJCWlmIChsdmRtLT5pbmZvLnN1c3BlbmRlZCkKKwkJCQkJcmVwc3RyWzRdID0gJ00nOyAvKiBTdXNwIHNuYXBzaG90IG1lcmdlIGZhaWxlZCAqLworCQkJCWVsc2UKKwkJCQkJcmVwc3RyWzRdID0gJ20nOyAvKiBTbmFwc2hvdCBtZXJnZSBmYWlsZWQgKi8KKwkJCX0KKwkJfQorCisJCS8qICdjJyB3aGVuIGNhY2hlL3RoaW4tcG9vbCBpcyBhY3RpdmUgd2l0aCBuZWVkc19jaGVjayBmbGFnCisJCSAqICdDJyBmb3Igc3VzcGVuZCAqLworCQlpZiAoKGx2X2lzX3RoaW5fcG9vbChsdikgJiYKKwkJICAgICBsdmRtLT5zZWdfc3RhdHVzLnRoaW5fcG9vbC0+bmVlZHNfY2hlY2spIHx8CisJCSAgICAobHZfaXNfY2FjaGUobHYpICYmCisJCSAgICAgbHZkbS0+c2VnX3N0YXR1cy5jYWNoZS0+bmVlZHNfY2hlY2spKQorCQkJcmVwc3RyWzRdID0gbHZkbS0+aW5mby5zdXNwZW5kZWQgPyAnQycgOiAnYyc7CisKKwkJLyoKKwkJICogJ1InIGluZGljYXRlcyByZWFkLW9ubHkgYWN0aXZhdGlvbiBvZiBhIGRldmljZSB0aGF0CisJCSAqIGRvZXMgbm90IGhhdmUgbWV0YWRhdGEgZmxhZ2dpbmcgaXQgYXMgcmVhZC1vbmx5LgorCQkgKi8KKwkJaWYgKHJlcHN0clsxXSAhPSAncicgJiYgbHZkbS0+aW5mby5yZWFkX29ubHkpCisJCQlyZXBzdHJbMV0gPSAnUic7CisKKwkJcmVwc3RyWzVdID0gKGx2ZG0tPmluZm8ub3Blbl9jb3VudCkgPyAnbycgOiAnLSc7CisJfSBlbHNlIHsKKwkJcmVwc3RyWzRdID0gJy0nOworCQlyZXBzdHJbNV0gPSAnLSc7CisJfQorCisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikgfHwgbHZfaXNfdGhpbl92b2x1bWUobHYpKQorCQlyZXBzdHJbNl0gPSAndCc7CisJZWxzZSBpZiAobHZfaXNfY2FjaGVfcG9vbChsdikgfHwgbHZfaXNfY2FjaGUobHYpIHx8IGx2X2lzX2NhY2hlX29yaWdpbihsdikpCisJCXJlcHN0cls2XSA9ICdDJzsKKwllbHNlIGlmIChsdl9pc19yYWlkX3R5cGUobHYpKQorCQlyZXBzdHJbNl0gPSAncic7CisJZWxzZSBpZiAobHZfaXNfbWlycm9yX3R5cGUobHYpIHx8IGx2X2lzX3B2bW92ZShsdikpCisJCXJlcHN0cls2XSA9ICdtJzsKKwllbHNlIGlmIChsdl9pc19jb3cobHYpIHx8IGx2X2lzX29yaWdpbihsdikpCisJCXJlcHN0cls2XSA9ICdzJzsKKwllbHNlIGlmIChsdl9oYXNfdW5rbm93bl9zZWdtZW50cyhsdikpCisJCXJlcHN0cls2XSA9ICd1JzsKKwllbHNlIGlmIChsdl9pc192aXJ0dWFsKGx2KSkKKwkJcmVwc3RyWzZdID0gJ3YnOworCWVsc2UKKwkJcmVwc3RyWzZdID0gJy0nOworCisJaWYgKCgobHZfaXNfdGhpbl92b2x1bWUobHYpICYmIChzZWcgPSBmaXJzdF9zZWcobHYpKSAmJiBzZWctPnBvb2xfbHYgJiYgKHNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpKSkgfHwKKwkgICAgIChsdl9pc190aGluX3Bvb2wobHYpICYmIChzZWcgPSBmaXJzdF9zZWcobHYpKSkpICYmCisJICAgIHNlZy0+emVyb19uZXdfYmxvY2tzKQorCQlyZXBzdHJbN10gPSAneic7CisJZWxzZQorCQlyZXBzdHJbN10gPSAnLSc7CisKKwlyZXBzdHJbOF0gPSAnLSc7CisJaWYgKGx2X2lzX3BhcnRpYWwobHYpKQorCQlyZXBzdHJbOF0gPSAncCc7CisJZWxzZSBpZiAobHZfaXNfcmFpZF90eXBlKGx2KSkgeworCQl1aW50NjRfdCBuOworCQlpZiAoIWFjdGl2YXRpb24oKSkKKwkJCXJlcHN0cls4XSA9ICdYJzsJLyogVW5rbm93biAqLworCQllbHNlIGlmICghbHZfcmFpZF9oZWFsdGh5KGx2KSkKKwkJCXJlcHN0cls4XSA9ICdyJzsgIC8qIFJBSUQgbmVlZHMgJ3InZWZyZXNoICovCisJCWVsc2UgaWYgKGx2X2lzX3JhaWQobHYpKSB7CisJCQlpZiAobHZfcmFpZF9taXNtYXRjaF9jb3VudChsdiwgJm4pICYmIG4pCisJCQkJcmVwc3RyWzhdID0gJ20nOyAgLyogUkFJRCBoYXMgJ20naXNtYXRjaGVzICovCisJCX0gZWxzZSBpZiAobHYtPnN0YXR1cyAmIExWX1dSSVRFTU9TVExZKQorCQkJcmVwc3RyWzhdID0gJ3cnOyAgLyogc3ViLUxWIGhhcyAndydyaXRlbW9zdGx5ICovCisJfSBlbHNlIGlmIChsdl9pc19jYWNoZShsdikgJiYKKwkJICAgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX05PTkUpKSB7CisJCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19VTktOT1dOKQorCQkJcmVwc3RyWzhdID0gJ1gnOyAvKiBVbmtub3duICovCisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMuY2FjaGUtPmZhaWwpCisJCQlyZXBzdHJbOF0gPSAnRic7CisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMuY2FjaGUtPnJlYWRfb25seSkKKwkJCXJlcHN0cls4XSA9ICdNJzsKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbChsdikgJiYKKwkJICAgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX05PTkUpKSB7CisJCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19VTktOT1dOKQorCQkJcmVwc3RyWzhdID0gJ1gnOyAvKiBVbmtub3duICovCisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMudGhpbl9wb29sLT5mYWlsKQorCQkJcmVwc3RyWzhdID0gJ0YnOworCQllbHNlIGlmIChsdmRtLT5zZWdfc3RhdHVzLnRoaW5fcG9vbC0+b3V0X29mX2RhdGFfc3BhY2UpCisJCQlyZXBzdHJbOF0gPSAnRCc7CisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMudGhpbl9wb29sLT5yZWFkX29ubHkpCisJCQlyZXBzdHJbOF0gPSAnTSc7CisJfSBlbHNlIGlmIChsdl9pc190aGluX3ZvbHVtZShsdikgJiYKKwkJICAgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX05PTkUpKSB7CisJCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19VTktOT1dOKQorCQkJcmVwc3RyWzhdID0gJ1gnOyAvKiBVbmtub3duICovCisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMudGhpbi0+ZmFpbCkKKwkJCXJlcHN0cls4XSA9ICdGJzsKKwl9CisKKwlpZiAobHYtPnN0YXR1cyAmIExWX0FDVElWQVRJT05fU0tJUCkKKwkJcmVwc3RyWzldID0gJ2snOworCWVsc2UKKwkJcmVwc3RyWzldID0gJy0nOworCitvdXQ6CisJcmV0dXJuIHJlcHN0cjsKK30KKworLyogYmFja3dhcmQgY29tcGF0aWJsZSBpbnRlcm5hbCBBUEkgZm9yIGx2bTJhcGksIFRPRE8gaW1wcm92ZSBpdCAqLworY2hhciAqbHZfYXR0cl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljaGFyICpyZXQgPSBOVUxMOworCXN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgc3RhdHVzID0geworCQkuc2VnX3N0YXR1cy50eXBlID0gU0VHX1NUQVRVU19OT05FLAorCQkubHYgPSBsdgorCX07CisKKwlpZiAoIShzdGF0dXMuc2VnX3N0YXR1cy5tZW0gPSBkbV9wb29sX2NyZWF0ZSgicmVwb3J0ZXJfcG9vbCIsIDEwMjQpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzdGF0dXMuaW5mb19vayA9IGx2X2luZm9fd2l0aF9zZWdfc3RhdHVzKGx2LT52Zy0+Y21kLCBsdiwgZmlyc3Rfc2VnKGx2KSwgMSwgJnN0YXR1cywgMSwgMSkpKQorCQlnb3RvX2JhZDsKKworCXJldCA9IGx2X2F0dHJfZHVwX3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyhtZW0sICZzdGF0dXMpOworYmFkOgorCWRtX3Bvb2xfZGVzdHJveShzdGF0dXMuc2VnX3N0YXR1cy5tZW0pOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGx2X3NldF9jcmVhdGlvbihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIHVpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKwljb25zdCBjaGFyICpobjsKKworCWlmICghaG9zdG5hbWUpIHsKKwkJaWYgKCFfdXRzaW5pdCkgeworCQkJaWYgKHVuYW1lKCZfdXRzbmFtZSkpIHsKKwkJCQlsb2dfZXJyb3IoInVuYW1lIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCW1lbXNldCgmX3V0c25hbWUsIDAsIHNpemVvZihfdXRzbmFtZSkpOworCQkJfQorCisJCQlfdXRzaW5pdCA9IDE7CisJCX0KKworCQlob3N0bmFtZSA9IF91dHNuYW1lLm5vZGVuYW1lOworCX0KKworCWlmICghKGhuID0gZG1faGFzaF9sb29rdXAobHYtPnZnLT5ob3N0bmFtZXMsIGhvc3RuYW1lKSkpIHsKKwkJaWYgKCEoaG4gPSBkbV9wb29sX3N0cmR1cChsdi0+dmctPnZnbWVtLCBob3N0bmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgaG9zdG5hbWUiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFkbV9oYXNoX2luc2VydChsdi0+dmctPmhvc3RuYW1lcywgaG9zdG5hbWUsICh2b2lkKilobikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlsdi0+aG9zdG5hbWUgPSBobjsKKwlsdi0+dGltZXN0YW1wID0gdGltZXN0YW1wID8gOiAodWludDY0X3QpIHRpbWUoTlVMTCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKl90aW1lX2R1cChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgIHRpbWVfdCB0cywgaW50IGlzb19tb2RlKQoreworCWNoYXIgYnVmZmVyWzQwOTZdOworCXN0cnVjdCB0bSAqbG9jYWxfdG07CisJY29uc3QgY2hhciAqZm9ybWF0ID0gaXNvX21vZGUgPyBERUZBVUxUX1RJTUVfRk9STUFUCisJCQkJICAgICAgOiBjbWQtPnRpbWVfZm9ybWF0OworCisJaWYgKCF0cyB8fAorCSAgICAhKGxvY2FsX3RtID0gbG9jYWx0aW1lKCZ0cykpIHx8CisJICAgICFzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLCBmb3JtYXQsIGxvY2FsX3RtKSkKKwkJYnVmZmVyWzBdID0gMDsKKworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0sIGJ1ZmZlcik7Cit9CisKK2NoYXIgKmx2X2NyZWF0aW9uX3RpbWVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBpc29fbW9kZSkKK3sKKwl0aW1lX3QgdHMgPSBsdl9pc19oaXN0b3JpY2FsKGx2KSA/ICh0aW1lX3QpIGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+dGltZXN0YW1wCisJCQkJCSA6ICh0aW1lX3QpIGx2LT50aW1lc3RhbXA7CisKKwlyZXR1cm4gX3RpbWVfZHVwKGx2LT52Zy0+Y21kLCBtZW0sIHRzLCBpc29fbW9kZSk7Cit9CisKK2NoYXIgKmx2X3JlbW92YWxfdGltZV9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IGlzb19tb2RlKQoreworCXRpbWVfdCB0cyA9IGx2X2lzX2hpc3RvcmljYWwobHYpID8gKHRpbWVfdClsdi0+dGhpc19nbHYtPmhpc3RvcmljYWwtPnRpbWVzdGFtcF9yZW1vdmVkCisJCQkJCSA6ICh0aW1lX3QpMDsKKworCXJldHVybiBfdGltZV9kdXAobHYtPnZnLT5jbWQsIG1lbSwgdHMsIGlzb19tb2RlKTsKK30KKworY2hhciAqbHZfaG9zdF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAobWVtLCBsdi0+aG9zdG5hbWUgPyA6ICIiKTsKK30KKworc3RhdGljIGludCBfbHZfaXNfZXhjbHVzaXZlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCS8qIFNvbWUgc2VnIHR5cGVzIHJlcXVpcmUgZXhjbHVzaXZlIGFjdGl2YXRpb24gKi8KKwkvKiBGSVhNRSBTY2FuIHJlY3Vyc2l2ZWx5ICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykKKwkJaWYgKHNlZ19vbmx5X2V4Y2x1c2l2ZShzZWcpKQorCQkJcmV0dXJuIDE7CisKKwkvKiBPcmlnaW4gaGFzIG5vIHNlZyB0eXBlIHJlcXVpcmUgZXhsdXNpdmVuZXNzICovCisJcmV0dXJuIGx2X2lzX29yaWdpbihsdik7Cit9CisKK2ludCBsdl9hY3RpdmVfY2hhbmdlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIGVudW0gYWN0aXZhdGlvbl9jaGFuZ2UgYWN0aXZhdGUsIGludCBuZWVkc19leGNsdXNpdmUpCit7CisJY29uc3QgY2hhciAqYXlfd2l0aF9tb2RlID0gTlVMTDsKKworCWlmIChhY3RpdmF0ZSA9PSBDSEFOR0VfQVNZKQorCQlheV93aXRoX21vZGUgPSAic2giOworCWlmIChhY3RpdmF0ZSA9PSBDSEFOR0VfQUVZKQorCQlheV93aXRoX21vZGUgPSAiZXgiOworCQorCWlmIChpc19jaGFuZ2VfYWN0aXZhdGluZyhhY3RpdmF0ZSkgJiYKKwkgICAgIWxvY2tkX2x2KGNtZCwgbHYsIGF5X3dpdGhfbW9kZSwgTERMVl9QRVJTSVNURU5UKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBsb2NrIGxvZ2ljYWwgdm9sdW1lICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYWN0aXZhdGUpIHsKKwljYXNlIENIQU5HRV9BTjoKK2RlYWN0aXZhdGU6CisJCWxvZ192ZXJib3NlKCJEZWFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbHYpKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCWNhc2UgQ0hBTkdFX0FMTjoKKwkJaWYgKHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpICYmIChuZWVkc19leGNsdXNpdmUgfHwgX2x2X2lzX2V4Y2x1c2l2ZShsdikpKSB7CisJCQlpZiAoIWx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQkJCWxvZ19lcnJvcigiQ2Fubm90IGRlYWN0aXZhdGUgcmVtb3RlbHkgZXhjbHVzaXZlIGRldmljZSAlcyBsb2NhbGx5LiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIFVubG9jayB3aG9sZSBleGNsdXNpdmUgYWN0aXZhdGlvbiAqLworCQkJZ290byBkZWFjdGl2YXRlOworCQl9CisJCWxvZ192ZXJib3NlKCJEZWFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgJXMgbG9jYWxseS4iLAorCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWlmICghZGVhY3RpdmF0ZV9sdl9sb2NhbChjbWQsIGx2KSkKKwkJCXJldHVybl8wOworCQlicmVhazsKKwljYXNlIENIQU5HRV9BTFk6CisJY2FzZSBDSEFOR0VfQUFZOgorCQlpZiAobmVlZHNfZXhjbHVzaXZlIHx8IF9sdl9pc19leGNsdXNpdmUobHYpKSB7CisJCQlsb2dfdmVyYm9zZSgiQWN0aXZhdGluZyBsb2dpY2FsIHZvbHVtZSAlcyBleGNsdXNpdmVseSBsb2NhbGx5LiIsCisJCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdikpCisJCQkJcmV0dXJuXzA7CisJCX0gZWxzZSB7CisJCQlsb2dfdmVyYm9zZSgiQWN0aXZhdGluZyBsb2dpY2FsIHZvbHVtZSAlcyBsb2NhbGx5LiIsCisJCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlpZiAoIWFjdGl2YXRlX2x2X2xvY2FsKGNtZCwgbHYpKQorCQkJCXJldHVybl8wOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0hBTkdFX0FFWToKK2V4Y2x1c2l2ZToKKwkJbG9nX3ZlcmJvc2UoIkFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgJXMgZXhjbHVzaXZlbHkuIiwKKwkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2woY21kLCBsdikpCisJCQlyZXR1cm5fMDsKKwkJYnJlYWs7CisJY2FzZSBDSEFOR0VfQVNZOgorCWNhc2UgQ0hBTkdFX0FZOgorCWRlZmF1bHQ6CisJCWlmIChuZWVkc19leGNsdXNpdmUgfHwgX2x2X2lzX2V4Y2x1c2l2ZShsdikpCisJCQlnb3RvIGV4Y2x1c2l2ZTsKKwkJbG9nX3ZlcmJvc2UoIkFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJaWYgKCFhY3RpdmF0ZV9sdihjbWQsIGx2KSkKKwkJCXJldHVybl8wOworCX0KKworCWlmICghaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGUpICYmCisJICAgICFsb2NrZF9sdihjbWQsIGx2LCAidW4iLCBMRExWX1BFUlNJU1RFTlQpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB1bmxvY2sgbG9naWNhbCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCXJldHVybiAxOworfQorCitjaGFyICpsdl9hY3RpdmVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3QgY2hhciAqczsKKworCWlmICghYWN0aXZhdGlvbigpKSB7CisJCXMgPSAidW5rbm93biI7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSkgeworCQkvL2NvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZvID0gbHY7CisJCWx2ID0gbHZfbG9ja19ob2xkZXIobHYpOworCQkvL2xvZ19kZWJ1ZygiSG9sZGVyIGZvciAlcyA9PiAlcy4iLCBsdm8tPm5hbWUsIGx2LT5uYW1lKTsKKwl9CisKKwlpZiAoIWx2X2lzX2FjdGl2ZShsdikpCisJCXMgPSAiIjsgLyogbm90IGFjdGl2ZSAqLworCWVsc2UgaWYgKCF2Z19pc19jbHVzdGVyZWQobHYtPnZnKSkKKwkJcyA9ICJhY3RpdmUiOworCWVsc2UgaWYgKGx2X2lzX2FjdGl2ZV9leGNsdXNpdmUobHYpKQorCQkvKiBleGNsdXNpdmUgY2x1c3RlciBhY3RpdmF0aW9uICovCisJCXMgPSBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkobHYpID8KKwkJCSJsb2NhbCBleGNsdXNpdmUiIDogInJlbW90ZSBleGNsdXNpdmUiOworCWVsc2UgLyogbG9jYWxseSBhY3RpdmUgKi8KKwkJcyA9IGx2X2lzX2FjdGl2ZV9idXRfbm90X2xvY2FsbHkobHYpID8KKwkJCSJyZW1vdGVseSIgOiAibG9jYWxseSI7CitvdXQ6CisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKG1lbSwgcyk7Cit9CisKK2NoYXIgKmx2X3Byb2ZpbGVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3QgY2hhciAqcHJvZmlsZV9uYW1lID0gbHYtPnByb2ZpbGUgPyBsdi0+cHJvZmlsZS0+bmFtZSA6ICIiOworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0sIHByb2ZpbGVfbmFtZSk7Cit9CisKK2NoYXIgKmx2X2xvY2tfYXJnc19kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljb25zdCBjaGFyICpsb2NrX2FyZ3MgPSBsdi0+bG9ja19hcmdzID8gbHYtPmxvY2tfYXJncyA6ICIiOworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0sIGxvY2tfYXJncyk7Cit9CisKKy8qIEZvciBnaXZlbiBMViBmaW5kIHJlY3Vyc2l2ZWx5IHRoZSBMViB3aGljaCBob2xkcyBsb2NrIGZvciBpdCAqLworY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9sb2NrX2hvbGRlcihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwlpZiAobHZfaXNfY293KGx2KSkKKwkJcmV0dXJuIGx2X2xvY2tfaG9sZGVyKG9yaWdpbl9mcm9tX2NvdyhsdikpOworCisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpCisJCS8qIEZpbmQgYW55IGFjdGl2ZSBMViBmcm9tIHRoZSBwb29sICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJCQlpZiAobHZfaXNfYWN0aXZlKHNsLT5zZWctPmx2KSkgeworCQkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJUaGluIHZvbHVtZSAlcyBpcyBhY3RpdmUuIiwKKwkJCQkJCSAgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gc2wtPnNlZy0+bHY7CisJCQl9CisKKwkvKiBSQUlEIGNoYW5nZXMgdmlzaWJpbGl0eSBvZiBzcGxpdHRlZCBMVnMgYnV0IHJlZmVyZW5jZXMgdGhlbSBzdGlsbCBhcyBsZWcvbWV0YSAqLworCWlmICgobHZfaXNfcmFpZF9pbWFnZShsdikgfHwgbHZfaXNfcmFpZF9tZXRhZGF0YShsdikpICYmIGx2X2lzX3Zpc2libGUobHYpKQorCQlyZXR1cm4gbHY7CisKKwkvKiBGb3Igb3RoZXIgdHlwZXMsIGJ5IGRlZmF1bHQgbG9vayBmb3IgdGhlIGZpcnN0IHVzZXIgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KSB7CisJCS8qIEZJWE1FOiBjb21wbGV0ZSB0aGlzIGV4Y2VwdGlvbiBsaXN0ICovCisJCWlmIChsdl9pc190aGluX3ZvbHVtZShsdikgJiYKKwkJICAgIGx2X2lzX3RoaW5fdm9sdW1lKHNsLT5zZWctPmx2KSAmJgorCQkgICAgZmlyc3Rfc2VnKGx2KS0+cG9vbF9sdiA9PSBzbC0+c2VnLT5wb29sX2x2KQorCQkJY29udGludWU7IC8qIFNraXAgdGhpbiBzbmFwaG9zdCAqLworCQlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSAmJgorCQkgICAgbHZfaXNfdGhpbl92b2x1bWUoc2wtPnNlZy0+bHYpKQorCQkJY29udGludWU7IC8qIFNraXAgZXh0ZXJuYWwgb3JpZ2luICovCisJCWlmIChsdl9pc19wZW5kaW5nX2RlbGV0ZShzbC0+c2VnLT5sdikpCisJCQljb250aW51ZTsgLyogU2tpcCBkZWxldGVkIExWcyAqLworCQlyZXR1cm4gbHZfbG9ja19ob2xkZXIoc2wtPnNlZy0+bHYpOworCX0KKworCXJldHVybiBsdjsKK30KKworc3RydWN0IHByb2ZpbGUgKmx2X2NvbmZpZ19wcm9maWxlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIGx2LT5wcm9maWxlID8gOiBsdi0+dmctPnByb2ZpbGU7Cit9CisKK2ludCBsdl9oYXNfY29uc3RhbnRfc3RyaXBlcyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVpbnQzMl90IHByZXZpb3VzX2FyZWFfY291bnQgPSAwOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWlmICghc2VnX2lzX3N0cmlwZWQoc2VnKSkKKwkJCXJldHVybiAwOworCQlpZiAocHJldmlvdXNfYXJlYV9jb3VudCAmJiBwcmV2aW91c19hcmVhX2NvdW50ICE9IHNlZy0+YXJlYV9jb3VudCkKKwkJCXJldHVybiAwOworCQlwcmV2aW91c19hcmVhX2NvdW50ID0gc2VnLT5hcmVhX2NvdW50OworCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL2x2LmggYi9saWIvbWV0YWRhdGEvbHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg3MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL2x2LmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBfTFZNX0xWX0gKKyNkZWZpbmUgX0xWTV9MVl9ICisKKyNpbmNsdWRlICJ2Zy5oIgorCit1bmlvbiBsdmlkOworc3RydWN0IGx2X3NlZ21lbnQ7CitzdHJ1Y3QgcmVwbGljYXRvcl9kZXZpY2U7CitlbnVtIGFjdGl2YXRpb25fY2hhbmdlOworCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgeworCXVuaW9uIGx2aWQgbHZpZDsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisKKwl1aW50NjRfdCBzdGF0dXM7CisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CisJc3RydWN0IHByb2ZpbGUgKnByb2ZpbGU7CisJdWludDMyX3QgcmVhZF9haGVhZDsKKwlpbnQzMl90IG1ham9yOworCWludDMyX3QgbWlub3I7CisKKwl1aW50NjRfdCBzaXplOwkJLyogU2VjdG9ycyB2aXNpYmxlICovCisJdWludDMyX3QgbGVfY291bnQ7CS8qIExvZ2ljYWwgZXh0ZW50cyB2aXNpYmxlICovCisKKwl1aW50MzJfdCBvcmlnaW5fY291bnQ7CisJdWludDMyX3QgZXh0ZXJuYWxfY291bnQ7CisJc3RydWN0IGRtX2xpc3Qgc25hcHNob3Rfc2VnczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc25hcHNob3Q7CisKKwlzdHJ1Y3QgcmVwbGljYXRvcl9kZXZpY2UgKnJkZXZpY2U7LyogRm9yIHJlcGxpY2F0b3ItZGV2cywgcmltYWdlcywgc2xvZ3MgLSByZWZlcmVuY2UgdG8gcmRldmljZSAqLworCXN0cnVjdCBkbV9saXN0IHJzaXRlczsJLyogRm9yIHJlcGxpY2F0b3JzIC0gYWxsIHNpdGVzICovCisKKwlzdHJ1Y3QgZG1fbGlzdCBzZWdtZW50czsKKwlzdHJ1Y3QgZG1fbGlzdCB0YWdzOworCXN0cnVjdCBkbV9saXN0IHNlZ3NfdXNpbmdfdGhpc19sdjsKKwlzdHJ1Y3QgZG1fbGlzdCBpbmRpcmVjdF9nbHZzOyAvKiBGb3Iga2VlcGluZyB0cmFjayBvZiBoaXN0b3JpY2FsIExWcyBpbiBhbmNlc3RyeSBjaGFpbiAqLworCisJLyoKKwkgKiB0aGlzX2dsdiB2YXJpYWJsZSBpcyB1c2VkIGFzIGEgaGVscGVyIGZvciBoYW5kbGluZyBoaXN0b3JpY2FsIExWcy4KKwkgKiBJZiB0aGlzIExWcyBoYXMgbm8gcm9sZSBhdCBhbGwgaW4ga2VlcGluZyB0cmFjayBvZiBoaXN0b3JpY2FsIExWcywKKwkgKiB0aGUgdGhpc19nbHYgdmFyaWFibGUgaXMgTlVMTC4gU2VlIGFsc28gY29tbWVudHMgZm9yIHN0cnVjdAorCSAqIGdlbmVyaWNfbG9naWNhbF92b2x1bWUgYW5kIHN0cnVjdCBoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lIGJlbG93LgorCSAqLworCXN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICp0aGlzX2dsdjsKKworCXVpbnQ2NF90IHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBuZXdfbG9ja19hcmdzOjE7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqbG9ja19hcmdzOworfTsKKworLyoKKyAqIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0cmFja2luZyBoaXN0b3JpY2FsIExWcywgd2UgbmVlZCB0byBtYWtlCisgKiBhIGRpZmZlcmVuY2UgYmV0d2VlbiBsaXZlIExWIChzdHJ1Y3QgbG9naWNhbF92b2x1bWUpIGFuZCBoaXN0b3JpY2FsIExWCisgKiAoc3RydWN0IGhpc3RvcmljYWxfbG9naWNhbF92b2x1bWUpLiBUbyBtaW5pbWl6ZSB0aGUgaW1wYWN0IG9mIHRoaXMgY2hhbmdlCisgKiBhbmQgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgbmVlZGVkIGluIHRoZSBleGlzdGluZyAgY29kZSwgd2UgdXNlIGEKKyAqIGxpdHRsZSB0cmljayBoZXJlIC0gd2hlbiBwcm9jZXNzaW5nIExWcyAoZS5nLiB3aGlsZSByZXBvcnRpbmcgTFYKKyAqIHByb3BlcnRpZXMpLCBlYWNoIGhpc3RvcmljYWwgTFYgaXMgcmVwcmVzZW50ZWQgYXMgZHVtbXkgTFYgd2hpY2ggaXMKKyAqIGFuIGluc3RhbmNlIG9mIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSB3aXRoIGFsbCBpdHMgcHJvcGVydGllcyBzZXQgdG8KKyAqIGJsYW5rIChoZW5jZSAiZHVtbXkgTFYiKSBhbmQgd2l0aCB0aGlzX2dsdiBwb2ludGluZyB0byB0aGUgc3RydWN0CisgKiBoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lLiBUaGlzIHdheSBhbGwgdGhlIGV4aXN0aW5nIGNvZGUgd29ya2luZyB3aXRoCisgKiBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgd2lsbCBzZWUgdGhpcyBoaXN0b3JpY2FsIExWIGFzIGR1bW15IGxpdmUgTFYgd2hpbGUKKyAqIHRoZSBjb2RlIHRoYXQgbmVlZHMgdG8gcmVjb2duaXplIGJldHdlZW4gbGl2ZSBhbmQgaGlzdG9yaWNhbCBMViB3aWxsCisgKiBjaGVjayB0aGlzX2dsdiBmaXJzdCBhbmQgdGhlbiBpdCB3aWxsIHdvcmsgZWl0aGVyIHdpdGggdGhlIGxpdmUKKyAqIG9yIGhpc3RvcmljYWwgTFYgcHJvcGVydGllcyBhcHByb3ByaWF0ZWx5LgorICovCitzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZTsKKworLyoKKyAqIGhpc3RvcmljYWwgbG9naWNhbCB2b2x1bWUgaXMgYW4gTFYgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGFscmVhZHkuCisgKiBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBMViBoaXN0b3J5LgorICovCitzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSB7CisJdW5pb24gbHZpZCBsdmlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJdWludDY0X3QgdGltZXN0YW1wOworCXVpbnQ2NF90IHRpbWVzdGFtcF9yZW1vdmVkOworCXN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICppbmRpcmVjdF9vcmlnaW47CisJc3RydWN0IGRtX2xpc3QgaW5kaXJlY3RfZ2x2czsgLyogbGlzdCBvZiBzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqLworCXVuc2lnbmVkIGNoZWNrZWQ6MTsgLyogc2V0IGlmIHRoaXMgaGlzdG9yaWNhbCBMViBoYXMgYmVlbiBjaGVja2VkIGZvciB2YWxpZGl0eSAqLworCXVuc2lnbmVkIHZhbGlkOjE7ICAgLyogaGlzdG9yaWNhbCBMViBpcyB2YWxpZCBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBsaXZlIExWIGFtb25nIGFuY2VzdG9ycyAqLworfTsKKworc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgeworCWludCBpc19oaXN0b3JpY2FsOworCXVuaW9uIHsKKwkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsaXZlOwkJCS8qIGlzX2hpc3RvcmljYWw9MCAqLworCQlzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSAqaGlzdG9yaWNhbDsJLyogaXNfaGlzdG9yaWNhbD0xICovCisJfTsKK307CisKK3N0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXM7CisKKy8qIExWIGRlcGVuZGVuY2llcyAqLworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9wYXJlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NvbnZlcnRfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X29yaWdpbl9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlycm9yX2xvZ19sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfZGF0YV9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfY29udmVydChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfb3JpZ2luKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9taXJyb3JfbG9nKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9kYXRhKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9tZXRhZGF0YV9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfcG9vbF9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworLyogTFYgcHJvcGVydGllcyAqLwordWludDY0X3QgbHZfc2l6ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3VpbnQ2NF90IGx2c2VnX3NpemUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7Cit1aW50NjRfdCBsdnNlZ19jaHVua3NpemUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7Cit1aW50NjRfdCBsdl9vcmlnaW5fc2l6ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3VpbnQ2NF90IGx2X21ldGFkYXRhX3NpemUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitzdHJ1Y3QgcHJvZmlsZSAqbHZfY29uZmlnX3Byb2ZpbGUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7Citjb25zdCBjaGFyICpsdl9sYXllcihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbG9ja19ob2xkZXIoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7Citjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NvbW1pdHRlZChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9taXJyb3JfaW1hZ2VfaW5fc3luYyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9yYWlkX2ltYWdlX2luX3N5bmMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfcmFpZF9oZWFsdGh5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY29uc3QgY2hhciAqbHZzZWdfbmFtZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK3VpbnQ2NF90IGx2c2VnX3N0YXJ0KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworc3RydWN0IGRtX2xpc3QgKmx2c2VnX2RldmljZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitjaGFyICpsdnNlZ19kZXZpY2VzX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK3N0cnVjdCBkbV9saXN0ICpsdnNlZ19tZXRhZGF0YV9kZXZpY2VzKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworY2hhciAqbHZzZWdfbWV0YWRhdGFfZGV2aWNlc19zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitzdHJ1Y3QgZG1fbGlzdCAqbHZzZWdfc2VnX3BlX3JhbmdlcyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK2NoYXIgKmx2c2VnX3NlZ19wZV9yYW5nZXNfc3RyKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworc3RydWN0IGRtX2xpc3QgKmx2c2VnX3NlZ19sZV9yYW5nZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitjaGFyICpsdnNlZ19zZWdfbGVfcmFuZ2VzX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK3N0cnVjdCBkbV9saXN0ICpsdnNlZ19zZWdfbWV0YWRhdGFfbGVfcmFuZ2VzKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworY2hhciAqbHZzZWdfc2VnX21ldGFkYXRhX2xlX3Jhbmdlc19zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CisKKy8qIExWIGtlcm5lbCBwcm9wZXJ0aWVzICovCitpbnQgbHZfa2VybmVsX21ham9yKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2tlcm5lbF9taW5vcihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3VpbnQzMl90IGx2X2tlcm5lbF9yZWFkX2FoZWFkKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKKworLyogTFYgbW9kaWZpY2F0aW9uIGZ1bmN0aW9ucyAqLworaW50IGx2X3NldF9jcmVhdGlvbihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsIHVpbnQ2NF90IHRpbWVzdGFtcCk7CitpbnQgbHZfYWN0aXZlX2NoYW5nZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICBlbnVtIGFjdGl2YXRpb25fY2hhbmdlIGFjdGl2YXRlLCBpbnQgbmVlZHNfZXhsdXNpdmUpOworCisvKiBMViBkdXAgZnVuY3Rpb25zICovCitjaGFyICpsdl9hdHRyX2R1cF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSk7CitjaGFyICpsdl9hdHRyX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X3V1aWRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZfdGFnc19kdXAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9wYXRoX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X2RtcGF0aF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9tb3ZlX3B2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X21vdmVfcHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9jb252ZXJ0X2x2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X2NvbnZlcnRfbHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9taXJyb3JfbG9nX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X21pcnJvcl9sb2dfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9kYXRhX2x2X2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X2RhdGFfbHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9tZXRhZGF0YV9sdl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9tZXRhZGF0YV9sdl91dWlkX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X3Bvb2xfbHZfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZfcG9vbF9sdl91dWlkX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X21vZHVsZXNfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZfbmFtZV9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9mdWxsbmFtZV9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9wYXJlbnRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZfb3JpZ2luX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2X29yaWdpbl91dWlkX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NoYXIgKmx2c2VnX3NlZ3R5cGVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworY2hhciAqbHZzZWdfZGlzY2FyZHNfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworY2hhciAqbHZzZWdfY2FjaGVtb2RlX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK2NoYXIgKmx2c2VnX21vbml0b3JfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworY2hhciAqbHZzZWdfdGFnc19kdXAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitjaGFyICpsdl9jcmVhdGlvbl90aW1lX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgaXNvX21vZGUpOworY2hhciAqbHZfcmVtb3ZhbF90aW1lX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgaXNvX21vZGUpOworY2hhciAqbHZfaG9zdF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9hY3RpdmVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZfcHJvZmlsZV9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitjaGFyICpsdl9sb2NrX2FyZ3NfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY2hhciAqbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSk7CitjaGFyICpsdl90aW1lX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgaXNvX21vZGUpOworCit0eXBlZGVmIGVudW0geworCVBFUkNFTlRfR0VUX0RBVEEgPSAwLAorCVBFUkNFTlRfR0VUX01FVEFEQVRBLAorCVBFUkNFTlRfR0VUX0RJUlRZCit9IHBlcmNlbnRfZ2V0X3Q7CitkbV9wZXJjZW50X3QgbHZzZWdfcGVyY2VudF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSwKKwkJCQkJCSAgICBwZXJjZW50X2dldF90IHR5cGUpOworCisjZW5kaWYgLyogX0xWTV9MVl9IICovCmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvbHZfYWxsb2MuaCBiL2xpYi9tZXRhZGF0YS9sdl9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YmM3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvbHZfYWxsb2MuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTFZfQUxMT0NfSAorI2RlZmluZSBfTFZNX0xWX0FMTE9DX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisKK3N0cnVjdCBsdl9zZWdtZW50ICphbGxvY19sdl9zZWdtZW50KGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgIHVpbnQzMl90IGxlLCB1aW50MzJfdCBsZW4sCisJCQkJICAgIHVpbnQ2NF90IHN0YXR1cywKKwkJCQkgICAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2LAorCQkJCSAgICB1aW50MzJfdCBhcmVhX2NvdW50LAorCQkJCSAgICB1aW50MzJfdCBhcmVhX2xlbiwKKwkJCQkgICAgdWludDMyX3QgY2h1bmtfc2l6ZSwKKwkJCQkgICAgdWludDMyX3QgcmVnaW9uX3NpemUsCisJCQkJICAgIHVpbnQzMl90IGV4dGVudHNfY29waWVkLAorCQkJCSAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqcHZtb3ZlX3NvdXJjZV9zZWcpOworCitpbnQgc2V0X2x2X3NlZ21lbnRfYXJlYV9wdihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBhcmVhX251bSwKKwkJCSAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCB1aW50MzJfdCBwZSk7CitpbnQgc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBhcmVhX251bSwKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlLAorCQkJICAgdWludDY0X3Qgc3RhdHVzKTsKK2ludCBtb3ZlX2x2X3NlZ21lbnRfYXJlYShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX3RvLCB1aW50MzJfdCBhcmVhX3RvLAorCQkJIHN0cnVjdCBsdl9zZWdtZW50ICpzZWdfZnJvbSwgdWludDMyX3QgYXJlYV9mcm9tKTsKK2ludCByZWxlYXNlX2x2X3NlZ21lbnRfYXJlYShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBzLAorCQkJICAgIHVpbnQzMl90IGFyZWFfcmVkdWN0aW9uKTsKK2ludCByZWxlYXNlX2FuZF9kaXNjYXJkX2x2X3NlZ21lbnRfYXJlYShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBzLCB1aW50MzJfdCBhcmVhX3JlZHVjdGlvbik7CisKK3N0cnVjdCBhbGxvY19oYW5kbGU7CitzdHJ1Y3QgYWxsb2NfaGFuZGxlICphbGxvY2F0ZV9leHRlbnRzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IGxvZ19jb3VudCwKKwkJCQkgICAgICB1aW50MzJfdCBsb2dfcmVnaW9uX3NpemUsIHVpbnQzMl90IGV4dGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnMsCisJCQkJICAgICAgYWxsb2NfcG9saWN5X3QgYWxsb2MsIGludCBhcHByb3hfYWxsb2MsCisJCQkJICAgICAgc3RydWN0IGRtX2xpc3QgKnBhcmFsbGVsX2FyZWFzKTsKKworaW50IGx2X2FkZF9zZWdtZW50KHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLAorCQkgICB1aW50MzJfdCBmaXJzdF9hcmVhLCB1aW50MzJfdCBudW1fYXJlYXMsCisJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpcGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGF0dXMsCisJCSAgIHVpbnQzMl90IHJlZ2lvbl9zaXplKTsKKworaW50IGx2X2FkZF9taXJyb3JfYXJlYXMoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsCisJCQlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBsZSwKKwkJCXVpbnQzMl90IHJlZ2lvbl9zaXplKTsKK2ludCBsdl9hZGRfc2VnbWVudGVkX21pcnJvcl9pbWFnZShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlLAorCQkJCSAgdWludDMyX3QgcmVnaW9uX3NpemUpOworaW50IGx2X2FkZF9taXJyb3JfbHZzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKnN1Yl9sdnMsCisJCSAgICAgIHVpbnQzMl90IG51bV9leHRyYV9hcmVhcywKKwkJICAgICAgdWludDY0X3Qgc3RhdHVzLCB1aW50MzJfdCByZWdpb25fc2l6ZSk7CisKK2ludCBsdl9hZGRfbG9nX3NlZ21lbnQoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHVpbnQzMl90IGZpcnN0X2FyZWEsCisJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdiwgdWludDY0X3Qgc3RhdHVzKTsKK2ludCBsdl9hZGRfdmlydHVhbF9zZWdtZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQ2NF90IHN0YXR1cywKKwkJCSAgIHVpbnQzMl90IGV4dGVudHMsIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUpOworCit2b2lkIGFsbG9jX2Rlc3Ryb3koc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgpOworCitzdHJ1Y3QgZG1fbGlzdCAqYnVpbGRfcGFyYWxsZWxfYXJlYXNfZnJvbV9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgIHVuc2lnbmVkIHVzZV9wdm1vdmVfcGFyZW50X2x2LAorCQkJCQkgICAgIHVuc2lnbmVkIGNyZWF0ZV9zaW5nbGVfbGlzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL2x2X21hbmlwLmMgYi9saWIvbWV0YWRhdGEvbHZfbWFuaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY1YzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL2x2X21hbmlwLmMKQEAgLTAsMCArMSw3NzgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgInB2X21hcC5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2X2FsbG9jLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAibHZtLWV4ZWMuaCIKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisjaW5jbHVkZSAibHZtbG9ja2QuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlQUkVGRVJSRUQsCisJVVNFX0FSRUEsCisJTkVYVF9QViwKKwlORVhUX0FSRUEKK30gYXJlYV91c2VfdDsKKworLyogRklYTUU6IHJlbW92ZSBSQUlEX01FVEFEQVRBX0FSRUFfTEVOIG1hY3JvIGFmdGVyIGRlZmluaW5nICdyYWlkX2xvZ19leHRlbnRzJyovCisjZGVmaW5lIFJBSURfTUVUQURBVEFfQVJFQV9MRU4gMQorCisvKiBGSVhNRSBUaGVzZSBlbmRlZCB1cCBnZXR0aW5nIHVzZWQgZGlmZmVyZW50bHkgZnJvbSBmaXJzdCBpbnRlbmRlZC4gIFJlZmFjdG9yLiAqLworLyogT25seSBvbmUgb2YgQV9DT05USUdVT1VTX1RPX0xWU0VHLCBBX0NMSU5HX1RPX0xWU0VHLCBBX0NMSU5HX1RPX0FMTE9DRUQgbWF5IGJlIHNldCAqLworI2RlZmluZSBBX0NPTlRJR1VPVVNfVE9fTFZTRUcJMHgwMQkvKiBNdXN0IGJlIGNvbnRpZ3VvdXMgdG8gYW4gZXhpc3Rpbmcgc2VnbWVudCAqLworI2RlZmluZSBBX0NMSU5HX1RPX0xWU0VHCTB4MDIJLyogTXVzdCB1c2Ugc2FtZSBkaXNrcyBhcyBleGlzdGluZyBMViBzZWdtZW50ICovCisjZGVmaW5lIEFfQ0xJTkdfVE9fQUxMT0NFRAkweDA0CS8qIE11c3QgdXNlIHNhbWUgZGlza3MgYXMgYWxyZWFkeS1hbGxvY2F0ZWQgc2VnbWVudCAqLworCisjZGVmaW5lIEFfQ0xJTkdfQllfVEFHUwkJMHgwOAkvKiBNdXN0IG1hdGNoIHRhZ3MgYWdhaW5zdCBleGlzdGluZyBzZWdtZW50ICovCisjZGVmaW5lIEFfQ0FOX1NQTElUCQkweDEwCisjZGVmaW5lIEFfQVJFQV9DT1VOVF9NQVRDSEVTCTB4MjAJLyogRXhpc3RpbmcgbHZzZWcgaGFzIHNhbWUgbnVtYmVyIG9mIGFyZWFzIGFzIG5ldyBzZWdtZW50ICovCisKKyNkZWZpbmUgQV9QT1NJVElPTkFMX0ZJTEwJMHg0MAkvKiBTbG90cyBhcmUgcG9zaXRpb25hbCBhbmQgZmlsbGVkIHVzaW5nIFBSRUZFUlJFRCAqLworI2RlZmluZSBBX1BBUlRJVElPTl9CWV9UQUdTCTB4ODAJLyogTm8gYWxsb2NhdGVkIGFyZWEgbWF5IHNoYXJlIGFueSB0YWcgd2l0aCBhbnkgb3RoZXIgKi8KKworLyoKKyAqIENvbnN0YW50IHBhcmFtZXRlcnMgZHVyaW5nIGEgc2luZ2xlIGFsbG9jYXRpb24gYXR0ZW1wdC4KKyAqLworc3RydWN0IGFsbG9jX3Bhcm1zIHsKKwlhbGxvY19wb2xpY3lfdCBhbGxvYzsKKwl1bnNpZ25lZCBmbGFnczsJCS8qIEhvbGRzIEFfKiAqLworCXN0cnVjdCBsdl9zZWdtZW50ICpwcmV2X2x2c2VnOworCXVpbnQzMl90IGV4dGVudHNfc3RpbGxfbmVlZGVkOworfTsKKworLyoKKyAqIEhvbGRzIHZhcnlpbmcgc3RhdGUgb2YgZWFjaCBhbGxvY2F0aW9uIGF0dGVtcHQuCisgKi8KK3N0cnVjdCBhbGxvY19zdGF0ZSB7CisJY29uc3Qgc3RydWN0IGFsbG9jX3Bhcm1zICphbGxvY19wYXJtczsKKwlzdHJ1Y3QgcHZfYXJlYV91c2VkICphcmVhczsKKwl1aW50MzJfdCBhcmVhc19zaXplOworCXVpbnQzMl90IGxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZDsJLyogTnVtYmVyIG9mIGFyZWFzIHN0aWxsIG5lZWRpbmcgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgbG9nICovCisJdWludDMyX3QgYWxsb2NhdGVkOwkvKiBUb3RhbCBudW1iZXIgb2YgZXh0ZW50cyBhbGxvY2F0ZWQgc28gZmFyICovCisJdWludDMyX3QgbnVtX3Bvc2l0aW9uYWxfYXJlYXM7CS8qIE51bWJlciBvZiBwYXJhbGxlbCBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUgY29udGlndW91cy9jbGluZyAqLworfTsKKworc3RydWN0IGx2X25hbWVzIHsKKwljb25zdCBjaGFyICpvbGQ7CisJY29uc3QgY2hhciAqbmV3OworfTsKKworZW51bSB7CisJTFZfVFlQRV9VTktOT1dOLAorCUxWX1RZUEVfTk9ORSwKKwlMVl9UWVBFX1BVQkxJQywKKwlMVl9UWVBFX1BSSVZBVEUsCisJTFZfVFlQRV9ISVNUT1JZLAorCUxWX1RZUEVfTElORUFSLAorCUxWX1RZUEVfU1RSSVBFRCwKKwlMVl9UWVBFX01JUlJPUiwKKwlMVl9UWVBFX1JBSUQsCisJTFZfVFlQRV9USElOLAorCUxWX1RZUEVfQ0FDSEUsCisJTFZfVFlQRV9TUEFSU0UsCisJTFZfVFlQRV9PUklHSU4sCisJTFZfVFlQRV9USElOT1JJR0lOLAorCUxWX1RZUEVfTVVMVElUSElOT1JJR0lOLAorCUxWX1RZUEVfVEhJQ0tPUklHSU4sCisJTFZfVFlQRV9NVUxUSVRISUNLT1JJR0lOLAorCUxWX1RZUEVfQ0FDSEVPUklHSU4sCisJTFZfVFlQRV9FWFRUSElOT1JJR0lOLAorCUxWX1RZUEVfTVVMVElFWFRUSElOT1JJR0lOLAorCUxWX1RZUEVfU05BUFNIT1QsCisJTFZfVFlQRV9USElOU05BUFNIT1QsCisJTFZfVFlQRV9USElDS1NOQVBTSE9ULAorCUxWX1RZUEVfUFZNT1ZFLAorCUxWX1RZUEVfSU1BR0UsCisJTFZfVFlQRV9MT0csCisJTFZfVFlQRV9NRVRBREFUQSwKKwlMVl9UWVBFX1BPT0wsCisJTFZfVFlQRV9EQVRBLAorCUxWX1RZUEVfU1BBUkUsCisJTFZfVFlQRV9WSVJUVUFMLAorCUxWX1RZUEVfUkFJRDAsCisJTFZfVFlQRV9SQUlEMF9NRVRBLAorCUxWX1RZUEVfUkFJRDEsCisJTFZfVFlQRV9SQUlEMTAsCisJTFZfVFlQRV9SQUlENCwKKwlMVl9UWVBFX1JBSUQ1LAorCUxWX1RZUEVfUkFJRDVfTEEsCisJTFZfVFlQRV9SQUlENV9SQSwKKwlMVl9UWVBFX1JBSUQ1X0xTLAorCUxWX1RZUEVfUkFJRDVfUlMsCisJTFZfVFlQRV9SQUlENiwKKwlMVl9UWVBFX1JBSUQ2X1pSLAorCUxWX1RZUEVfUkFJRDZfTlIsCisJTFZfVFlQRV9SQUlENl9OQywKKwlMVl9UWVBFX0xPQ0tELAorCUxWX1RZUEVfU0FOTE9DSworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKl9sdl90eXBlX25hbWVzW10gPSB7CisJW0xWX1RZUEVfVU5LTk9XTl0gPQkJCQkidW5rbm93biIsCisJW0xWX1RZUEVfTk9ORV0gPQkJCQkibm9uZSIsCisJW0xWX1RZUEVfUFVCTElDXSA9CQkJCSJwdWJsaWMiLAorCVtMVl9UWVBFX1BSSVZBVEVdID0JCQkJInByaXZhdGUiLAorCVtMVl9UWVBFX0hJU1RPUlldID0JCQkJImhpc3RvcnkiLAorCVtMVl9UWVBFX0xJTkVBUl0gPQkJCQkibGluZWFyIiwKKwlbTFZfVFlQRV9TVFJJUEVEXSA9CQkJCSJzdHJpcGVkIiwKKwlbTFZfVFlQRV9NSVJST1JdID0JCQkJIm1pcnJvciIsCisJW0xWX1RZUEVfUkFJRF0gPQkJCQkicmFpZCIsCisJW0xWX1RZUEVfVEhJTl0gPQkJCQkidGhpbiIsCisJW0xWX1RZUEVfQ0FDSEVdID0JCQkJImNhY2hlIiwKKwlbTFZfVFlQRV9TUEFSU0VdID0JCQkJInNwYXJzZSIsCisJW0xWX1RZUEVfT1JJR0lOXSA9CQkJCSJvcmlnaW4iLAorCVtMVl9UWVBFX1RISU5PUklHSU5dID0JCQkJInRoaW5vcmlnaW4iLAorCVtMVl9UWVBFX01VTFRJVEhJTk9SSUdJTl0gPQkJCSJtdWx0aXRoaW5vcmlnaW4iLAorCVtMVl9UWVBFX1RISUNLT1JJR0lOXSA9CQkJCSJ0aGlja29yaWdpbiIsCisJW0xWX1RZUEVfTVVMVElUSElDS09SSUdJTl0gPQkJCSJtdWx0aXRoaWNrb3JpZ2luIiwKKwlbTFZfVFlQRV9DQUNIRU9SSUdJTl0gPQkJCQkiY2FjaGVvcmlnaW4iLAorCVtMVl9UWVBFX0VYVFRISU5PUklHSU5dID0JCQkiZXh0dGhpbm9yaWdpbiIsCisJW0xWX1RZUEVfTVVMVElFWFRUSElOT1JJR0lOXSA9CQkJIm11bHRpZXh0dGhpbm9yaWdpbiIsCisJW0xWX1RZUEVfU05BUFNIT1RdID0JCQkJInNuYXBzaG90IiwKKwlbTFZfVFlQRV9USElOU05BUFNIT1RdID0JCQkidGhpbnNuYXBzaG90IiwKKwlbTFZfVFlQRV9USElDS1NOQVBTSE9UXSA9CQkJInRoaWNrc25hcHNob3QiLAorCVtMVl9UWVBFX1BWTU9WRV0gPQkJCQkicHZtb3ZlIiwKKwlbTFZfVFlQRV9JTUFHRV0gPQkJCQkiaW1hZ2UiLAorCVtMVl9UWVBFX0xPR10gPQkJCQkJImxvZyIsCisJW0xWX1RZUEVfTUVUQURBVEFdID0JCQkJIm1ldGFkYXRhIiwKKwlbTFZfVFlQRV9QT09MXSA9CQkJCSJwb29sIiwKKwlbTFZfVFlQRV9EQVRBXSA9CQkJCSJkYXRhIiwKKwlbTFZfVFlQRV9TUEFSRV0gPQkJCQkic3BhcmUiLAorCVtMVl9UWVBFX1ZJUlRVQUxdID0JCQkJInZpcnR1YWwiLAorCVtMVl9UWVBFX1JBSUQwXSA9CQkJCVNFR19UWVBFX05BTUVfUkFJRDAsCisJW0xWX1RZUEVfUkFJRDBfTUVUQV0gPQkJCQlTRUdfVFlQRV9OQU1FX1JBSUQwX01FVEEsCisJW0xWX1RZUEVfUkFJRDFdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlEMSwKKwlbTFZfVFlQRV9SQUlEMTBdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlEMTAsCisJW0xWX1RZUEVfUkFJRDRdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlENCwKKwlbTFZfVFlQRV9SQUlENV0gPQkJCQlTRUdfVFlQRV9OQU1FX1JBSUQ1LAorCVtMVl9UWVBFX1JBSUQ1X0xBXSA9CQkJCVNFR19UWVBFX05BTUVfUkFJRDVfTEEsCisJW0xWX1RZUEVfUkFJRDVfUkFdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlENV9SQSwKKwlbTFZfVFlQRV9SQUlENV9MU10gPQkJCQlTRUdfVFlQRV9OQU1FX1JBSUQ1X0xTLAorCVtMVl9UWVBFX1JBSUQ1X1JTXSA9CQkJCVNFR19UWVBFX05BTUVfUkFJRDVfUlMsCisJW0xWX1RZUEVfUkFJRDZdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlENiwKKwlbTFZfVFlQRV9SQUlENl9aUl0gPQkJCQlTRUdfVFlQRV9OQU1FX1JBSUQ2X1pSLAorCVtMVl9UWVBFX1JBSUQ2X05SXSA9CQkJCVNFR19UWVBFX05BTUVfUkFJRDZfTlIsCisJW0xWX1RZUEVfUkFJRDZfTkNdID0JCQkJU0VHX1RZUEVfTkFNRV9SQUlENl9OQywKKwlbTFZfVFlQRV9MT0NLRF0gPQkJCQkibG9ja2QiLAorCVtMVl9UWVBFX1NBTkxPQ0tdID0JCQkJInNhbmxvY2siLAorfTsKKworc3RhdGljIGludCBfbHZfbGF5b3V0X2FuZF9yb2xlX21pcnJvcihzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICAgc3RydWN0IGRtX2xpc3QgKmxheW91dCwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcm9sZSwKKwkJCQkgICAgICBpbnQgKnB1YmxpY19sdikKK3sKKwlpbnQgdG9wX2xldmVsID0gMDsKKworCS8qIG5vbi10b3AtbGV2ZWwgTFZzICovCisJaWYgKGx2X2lzX21pcnJvcl9pbWFnZShsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9NSVJST1JdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0lNQUdFXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGx2X2lzX21pcnJvcl9sb2cobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfTUlSUk9SXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9MT0ddKSkKKwkJCWdvdG9fYmFkOworCQlpZiAobHZfaXNfbWlycm9yZWQobHYpICYmCisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9NSVJST1JdKSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZSBpZiAobHZfaXNfcHZtb3ZlKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BWTU9WRV0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9NSVJST1JdKSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZQorCQl0b3BfbGV2ZWwgPSAxOworCisKKwlpZiAoIXRvcF9sZXZlbCkgeworCQkqcHVibGljX2x2ID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogdG9wLWxldmVsIExWcyAqLworCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9NSVJST1JdKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gMTsKK2JhZDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbHZfbGF5b3V0X2FuZF9yb2xlX3JhaWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgc3RydWN0IGRtX2xpc3QgKmxheW91dCwKKwkJCQkgICAgc3RydWN0IGRtX2xpc3QgKnJvbGUsCisJCQkJICAgIGludCAqcHVibGljX2x2KQoreworCWludCB0b3BfbGV2ZWwgPSAwOworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisKKwkvKiBub24tdG9wLWxldmVsIExWcyAqLworCWlmIChsdl9pc19yYWlkX2ltYWdlKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1JBSURdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0lNQUdFXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRF0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfTUVUQURBVEFdKSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZSBpZiAobHZfaXNfcHZtb3ZlKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BWTU9WRV0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlEXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UKKwkJdG9wX2xldmVsID0gMTsKKworCWlmICghdG9wX2xldmVsKSB7CisJCSpwdWJsaWNfbHYgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB0b3AtbGV2ZWwgTFZzICovCisJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1JBSURdKSkKKwkJZ290b19iYWQ7CisKKwlzZWd0eXBlID0gZmlyc3Rfc2VnKGx2KS0+c2VndHlwZTsKKworCWlmIChzZWd0eXBlX2lzX3JhaWQwKHNlZ3R5cGUpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlEMF0pKQorCQkJZ290b19iYWQ7CisJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3JhaWQxKHNlZ3R5cGUpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlEMV0pKQorCQkJZ290b19iYWQ7CisJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3JhaWQxMChzZWd0eXBlKSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRDEwXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfcmFpZDQoc2VndHlwZSkpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1JBSUQ0XSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfYW55X3JhaWQ1KHNlZ3R5cGUpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlENV0pKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKHNlZ3R5cGVfaXNfcmFpZDVfbGEoc2VndHlwZSkpIHsKKwkJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlENV9MQV0pKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfcmFpZDVfcmEoc2VndHlwZSkpIHsKKwkJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlENV9SQV0pKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfcmFpZDVfbHMoc2VndHlwZSkpIHsKKwkJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlENV9MU10pKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfcmFpZDVfcnMoc2VndHlwZSkpIHsKKwkJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlENV9SU10pKQorCQkJCWdvdG9fYmFkOworCQl9CisJfSBlbHNlIGlmIChzZWd0eXBlX2lzX2FueV9yYWlkNihzZWd0eXBlKSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRDZdKSkKKwkJCWdvdG9fYmFkOworCisJCWlmIChzZWd0eXBlX2lzX3JhaWQ2X3pyKHNlZ3R5cGUpKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRDZfWlJdKSkKKwkJCQlnb3RvX2JhZDsKKwkJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3JhaWQ2X25yKHNlZ3R5cGUpKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRDZfTlJdKSkKKwkJCQlnb3RvX2JhZDsKKwkJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3JhaWQ2X25jKHNlZ3R5cGUpKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUkFJRDZfTkNdKSkKKwkJCQlnb3RvX2JhZDsKKwkJfQorCX0KKworCXJldHVybiAxOworYmFkOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9sdl9sYXlvdXRfYW5kX3JvbGVfdGhpbihzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbGF5b3V0LAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqcm9sZSwKKwkJCQkgICAgaW50ICpwdWJsaWNfbHYpCit7CisJaW50IHRvcF9sZXZlbCA9IDA7CisJdW5zaWduZWQgc25hcF9jb3VudDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJLyogbm9uLXRvcC1sZXZlbCBMVnMgKi8KKwlpZiAobHZfaXNfdGhpbl9wb29sX21ldGFkYXRhKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1RISU5dKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BPT0xdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX01FVEFEQVRBXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1RISU5dKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BPT0xdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0RBVEFdKSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZQorCQl0b3BfbGV2ZWwgPSAxOworCisJaWYgKCF0b3BfbGV2ZWwpIHsKKwkJKnB1YmxpY19sdiA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIHRvcC1sZXZlbCBMVnMgKi8KKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9USElOXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1NQQVJTRV0pKQorCQkJZ290b19iYWQ7CisJCWlmIChsdl9pc190aGluX29yaWdpbihsdiwgJnNuYXBfY291bnQpKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfT1JJR0lOXSkgfHwKKwkJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVEhJTk9SSUdJTl0pKQorCQkJCWdvdG9fYmFkOworCQkJaWYgKHNuYXBfY291bnQgPiAxICYmCisJCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX01VTFRJVEhJTk9SSUdJTl0pKQorCQkJCWdvdG9fYmFkOworCQl9CisJCWlmICgoc2VnID0gZmlyc3Rfc2VnKGx2KSkgJiYgKHNlZy0+b3JpZ2luIHx8IHNlZy0+ZXh0ZXJuYWxfbHYpKQorCQkJaWYgKCFzdHJfbGlzdF9hZGQobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1NOQVBTSE9UXSkgfHwKKwkJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVEhJTlNOQVBTSE9UXSkpCisJCQkJZ290b19iYWQ7CisJfSBlbHNlIGlmIChsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9USElOXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BPT0xdKSkKKwkJCWdvdG9fYmFkOworCQkqcHVibGljX2x2ID0gMDsKKwl9CisKKwlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZChtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfT1JJR0lOXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9FWFRUSElOT1JJR0lOXSkpCisJCQlnb3RvX2JhZDsKKwkJaWYgKGx2LT5leHRlcm5hbF9jb3VudCA+IDEgJiYKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9NVUxUSUVYVFRISU5PUklHSU5dKSkKKwkJCWdvdG9fYmFkOworCX0KKworCXJldHVybiAxOworYmFkOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9sdl9sYXlvdXRfYW5kX3JvbGVfY2FjaGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqbGF5b3V0LAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKnJvbGUsCisJCQkJICAgICBpbnQgKnB1YmxpY19sdikKK3sKKwlpbnQgdG9wX2xldmVsID0gMDsKKworCS8qIG5vbi10b3AtbGV2ZWwgTFZzICovCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2xfbWV0YWRhdGEobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfQ0FDSEVdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BPT0xdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX01FVEFEQVRBXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGx2X2lzX2NhY2hlX3Bvb2xfZGF0YShsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9DQUNIRV0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUE9PTF0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfREFUQV0pKQorCQkJZ290b19iYWQ7CisJCWlmIChsdl9pc19jYWNoZShsdikgJiYKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0NBQ0hFXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKGx2X2lzX2NhY2hlX29yaWdpbihsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGQobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0NBQ0hFXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGQobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX09SSUdJTl0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfQ0FDSEVPUklHSU5dKSkKKwkJCWdvdG9fYmFkOworCQlpZiAobHZfaXNfY2FjaGUobHYpICYmCisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIGxheW91dCwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9DQUNIRV0pKQorCQkJZ290b19iYWQ7CisJfSBlbHNlCisJCXRvcF9sZXZlbCA9IDE7CisKKwlpZiAoIXRvcF9sZXZlbCkgeworCQkqcHVibGljX2x2ID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogdG9wLWxldmVsIExWcyAqLworCWlmIChsdl9pc19jYWNoZShsdikgJiYKKwkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfQ0FDSEVdKSkKKwkJZ290b19iYWQ7CisJZWxzZSBpZiAobHZfaXNfY2FjaGVfcG9vbChsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX0NBQ0hFXSkgfHwKKwkJICAgICFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BPT0xdKSkKKwkJCWdvdG9fYmFkOworCQkqcHVibGljX2x2ID0gMDsKKwl9CisKKwlyZXR1cm4gMTsKK2JhZDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbHZfbGF5b3V0X2FuZF9yb2xlX3RoaWNrX29yaWdpbl9zbmFwc2hvdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqbGF5b3V0LAorCQkJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqcm9sZSwKKwkJCQkJCSAgICAgaW50ICpwdWJsaWNfbHYpCit7CisJaWYgKGx2X2lzX29yaWdpbihsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGQobWVtLCByb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX09SSUdJTl0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVEhJQ0tPUklHSU5dKSkKKwkJCWdvdG9fYmFkOworCQkvKgorCQkgKiBUaGluIHZvbHVtZXMgYXJlIGFsc28gbWFya2VkIHdpdGggdmlydHVhbCBmbGFnLCBidXQgd2UgZG9uJ3Qgc2hvdyAidmlydHVhbCIKKwkJICogbGF5b3V0IGZvciB0aGluIExWcyBhcyB0aGV5IGhhdmUgdGhlaXIgb3duIGtleXdvcmQgZm9yIGxheW91dCAtICJ0aGluIiEKKwkJICogU28gcnVsZSB0aGluIExWcyBvdXQgaGVyZSEKKwkJICovCisJCWlmIChsdl9pc192aXJ0dWFsKGx2KSAmJiAhbHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCBsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVklSVFVBTF0pKQorCQkJCWdvdG9fYmFkOworCQkJKnB1YmxpY19sdiA9IDA7CisJCX0KKwkJaWYgKGx2LT5vcmlnaW5fY291bnQgPiAxICYmCisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfTVVMVElUSElDS09SSUdJTl0pKQorCQkJZ290b19iYWQ7CisJfSBlbHNlIGlmIChsdl9pc19jb3cobHYpKSB7CisJCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9TTkFQU0hPVF0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sIHJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVEhJQ0tTTkFQU0hPVF0pKQorCQkJZ290b19iYWQ7CisJfQorCisJcmV0dXJuIDE7CitiYWQ6CisJcmV0dXJuIDA7Cit9CisKK2ludCBsdl9sYXlvdXRfYW5kX3JvbGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgIHN0cnVjdCBkbV9saXN0ICoqbGF5b3V0LCBzdHJ1Y3QgZG1fbGlzdCAqKnJvbGUpIHsKKwlpbnQgbGluZWFyLCBzdHJpcGVkOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJaW50IHB1YmxpY19sdiA9IDE7CisKKwkqbGF5b3V0ID0gKnJvbGUgPSBOVUxMOworCisJaWYgKCEoKmxheW91dCA9IHN0cl9saXN0X2NyZWF0ZShtZW0pKSkgeworCQlsb2dfZXJyb3IoIkxWIGxheW91dCBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKCpyb2xlID0gc3RyX2xpc3RfY3JlYXRlKG1lbSkpKSB7CisJCWxvZ19lcnJvcigiTFYgcm9sZSBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChsdl9pc19oaXN0b3JpY2FsKGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCAqbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX05PTkVdKSB8fAorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCAqcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9ISVNUT1JZXSkpCisJCQlnb3RvX2JhZDsKKwl9CisKKwkvKiBNaXJyb3JzIGFuZCByZWxhdGVkICovCisJaWYgKChsdl9pc19taXJyb3JfdHlwZShsdikgfHwgbHZfaXNfcHZtb3ZlKGx2KSkgJiYKKwkgICAgIV9sdl9sYXlvdXRfYW5kX3JvbGVfbWlycm9yKG1lbSwgbHYsICpsYXlvdXQsICpyb2xlLCAmcHVibGljX2x2KSkKKwkJZ290b19iYWQ7CisKKwkvKiBSQUlEcyBhbmQgcmVsYXRlZCAqLworCWlmIChsdl9pc19yYWlkX3R5cGUobHYpICYmCisJICAgICFfbHZfbGF5b3V0X2FuZF9yb2xlX3JhaWQobWVtLCBsdiwgKmxheW91dCwgKnJvbGUsICZwdWJsaWNfbHYpKQorCQlnb3RvX2JhZDsKKworCS8qIFRoaW5zIGFuZCByZWxhdGVkICovCisJaWYgKChsdl9pc190aGluX3R5cGUobHYpIHx8IGx2X2lzX2V4dGVybmFsX29yaWdpbihsdikpICYmCisJICAgICFfbHZfbGF5b3V0X2FuZF9yb2xlX3RoaW4obWVtLCBsdiwgKmxheW91dCwgKnJvbGUsICZwdWJsaWNfbHYpKQorCQlnb3RvX2JhZDsKKworCS8qIENhY2hlcyBhbmQgcmVsYXRlZCAqLworCWlmICgobHZfaXNfY2FjaGVfdHlwZShsdikgfHwgbHZfaXNfY2FjaGVfb3JpZ2luKGx2KSkgJiYKKwkgICAgIV9sdl9sYXlvdXRfYW5kX3JvbGVfY2FjaGUobWVtLCBsdiwgKmxheW91dCwgKnJvbGUsICZwdWJsaWNfbHYpKQorCQlnb3RvX2JhZDsKKworCS8qIFBvb2wtc3BlY2lmaWMgKi8KKwlpZiAobHZfaXNfcG9vbF9tZXRhZGF0YV9zcGFyZShsdikpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgKnJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUE9PTF0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sICpyb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1NQQVJFXSkpCisJCQlnb3RvX2JhZDsKKwkJcHVibGljX2x2ID0gMDsKKwl9CisKKwkvKiBPbGQtc3R5bGUgb3JpZ2lucy9zbmFwc2hvdHMsIHZpcnR1YWwgb3JpZ2lucyAqLworCWlmICghX2x2X2xheW91dF9hbmRfcm9sZV90aGlja19vcmlnaW5fc25hcHNob3QobWVtLCBsdiwgKmxheW91dCwgKnJvbGUsICZwdWJsaWNfbHYpKQorCQlnb3RvX2JhZDsKKworCWlmIChsdl9pc19sb2NrZF9zYW5sb2NrX2x2KGx2KSkgeworCQlpZiAoIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCAqcm9sZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9MT0NLRF0pIHx8CisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sICpyb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1NBTkxPQ0tdKSkKKwkJCWdvdG9fYmFkOworCQlwdWJsaWNfbHYgPSAwOworCX0KKworCS8qCisJICogSWYgbGF5b3V0IG5vdCB5ZXQgZGV0ZXJtaW5lZCwgaXQgbXVzdCBiZSBlaXRoZXIKKwkgKiBsaW5lYXIgb3Igc3RyaXBlZCBvciBtaXh0dXJlIG9mIHRoZXNlIHR3by4KKwkgKi8KKwlpZiAoZG1fbGlzdF9lbXB0eSgqbGF5b3V0KSkgeworCQlsaW5lYXIgPSBzdHJpcGVkID0gMDsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQkJaWYgKHNlZ19pc19saW5lYXIoc2VnKSkKKwkJCQlsaW5lYXIgPSAxOworCQkJZWxzZSBpZiAoc2VnX2lzX3N0cmlwZWQoc2VnKSkKKwkJCQlzdHJpcGVkID0gMTsKKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBidXQgaWYgaXQgZG9lcworCQkJCSAqIHdlJ2xsIHNlZSB0aGF0IHRoZXJlJ3MgInVua25vd24iIGxheW91dAorCQkJCSAqIHByZXNlbnQuIFRoaXMgbWVhbnMgd2UgZm9yZ290IHRvIGRldGVjdAorCQkJCSAqIHRoZSByb2xlIGFib3ZlIGFuZCB3ZSBuZWVkIGFkZCBwcm9wZXIKKwkJCQkgKiBkZXRlY3Rpb24gZm9yIHN1Y2ggcm9sZSEKKwkJCQkgKi8KKwkJCQlsb2dfd2FybihJTlRFUk5BTF9FUlJPUiAiV0FSTklORzogRmFpbGVkIHRvIHByb3Blcmx5IGRldGVjdCAiCisJCQkJCSAibGF5b3V0IGFuZCByb2xlIGZvciBMViAlcy8lcy4iLAorCQkJCQkgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCQl9CisJCX0KKworCQlpZiAobGluZWFyICYmCisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sICpsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfTElORUFSXSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoc3RyaXBlZCAmJgorCQkgICAgIXN0cl9saXN0X2FkZF9ub19kdXBfY2hlY2sobWVtLCAqbGF5b3V0LCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1NUUklQRURdKSkKKwkJCWdvdG9fYmFkOworCisJCWlmICghbGluZWFyICYmICFzdHJpcGVkICYmCisJCSAgICAhc3RyX2xpc3RfYWRkX25vX2R1cF9jaGVjayhtZW0sICpsYXlvdXQsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfVU5LTk9XTl0pKQorCQkJZ290b19iYWQ7CisJfQorCisJLyogZmluYWxseSwgYWRkIGVpdGhlciAncHVibGljJyBvciAncHJpdmF0ZScgcm9sZSB0byB0aGUgTFYgKi8KKwlpZiAocHVibGljX2x2KSB7CisJCWlmICghc3RyX2xpc3RfYWRkX2hfbm9fZHVwX2NoZWNrKG1lbSwgKnJvbGUsIF9sdl90eXBlX25hbWVzW0xWX1RZUEVfUFVCTElDXSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgeworCQlpZiAoIXN0cl9saXN0X2FkZF9oX25vX2R1cF9jaGVjayhtZW0sICpyb2xlLCBfbHZfdHlwZV9uYW1lc1tMVl9UWVBFX1BSSVZBVEVdKSkKKwkJCWdvdG9fYmFkOworCX0KKworCXJldHVybiAxOworYmFkOgorCWRtX3Bvb2xfZnJlZShtZW0sICpsYXlvdXQpOworCisJcmV0dXJuIDA7Cit9CitzdHJ1Y3QgZG1fbGlzdF9hbmRfbWVtcG9vbCB7CisJc3RydWN0IGRtX2xpc3QgKmxpc3Q7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKK307CitzdGF0aWMgaW50IF9nZXRfcHZfbGlzdF9mb3JfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZHVwX2ZvdW5kOworCXVpbnQzMl90IHM7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBkbV9saXN0ICpwdnMgPSAoKHN0cnVjdCBkbV9saXN0X2FuZF9tZW1wb29sICopZGF0YSktPmxpc3Q7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9ICgoc3RydWN0IGRtX2xpc3RfYW5kX21lbXBvb2wgKilkYXRhKS0+bWVtOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWR1cF9mb3VuZCA9IDA7CisKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfUFYpCisJCQkJY29udGludWU7CisKKwkJCS8qIGRvIG5vdCBhZGQgZHVwbGljYXRlcyAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzKQorCQkJCWlmIChwdmwtPnB2ID09IHNlZ19wdihzZWcsIHMpKQorCQkJCQlkdXBfZm91bmQgPSAxOworCisJCQlpZiAoZHVwX2ZvdW5kKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIShwdmwgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcHZsKSkpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXB2bC0+cHYgPSBzZWdfcHYoc2VnLCBzKTsKKwkJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiICAlcy8lcyB1c2VzICVzIiwgbHYtPnZnLT5uYW1lLAorCQkJCQkgICBsdi0+bmFtZSwgcHZfZGV2X25hbWUocHZsLT5wdikpOworCisJCQlkbV9saXN0X2FkZChwdnMsICZwdmwtPmxpc3QpOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBnZXRfcHZfbGlzdF9mb3JfbHYKKyAqIEBtZW0gLSBtZW1wb29sIHRvIGFsbG9jYXRlIHRoZSBsaXN0IGZyb20uCisgKiBAbHYKKyAqIEBwdnMgLSBUaGUgbGlzdCB0byBhZGQgcHZfbGlzdCBpdGVtcyB0by4KKyAqCisgKiAncHZzJyBpcyBmaWxsZWQgd2l0aCAncHZfbGlzdCcgaXRlbXMgZm9yIFBWcyB0aGF0IGNvbXBvc2UgdGhlIExWLgorICogSWYgdGhlICdwdnMnIGxpc3QgYWxyZWFkeSBoYXMgaXRlbXMgaW4gaXQsIGR1cGxpY2F0ZXMgd2lsbCBub3QgYmUKKyAqIGFkZGVkLiAgU28sIGl0IGlzIHNhZmUgdG8gcmVwZWF0ZWRseSBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGRpZmZlcmVudAorICogTFZzIGFuZCBidWlsZCB1cCBhIGxpc3Qgb2YgUFZzIGZvciB0aGVtIGFsbC4KKyAqCisgKiBNZW1vcnkgdG8gY3JlYXRlIHRoZSBsaXN0IGlzIG9idGFpbmVkIGZyb20gdGhlIG1lbXBvb2wgcHJvdmlkZWQuCisgKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yCisgKi8KK2ludCBnZXRfcHZfbGlzdF9mb3JfbHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBkbV9saXN0ICpwdnMpCit7CisJc3RydWN0IGRtX2xpc3RfYW5kX21lbXBvb2wgY29udGV4dCA9IHsgcHZzLCBtZW0gfTsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiR2VuZXJhdGluZyBsaXN0IG9mIFBWcyB0aGF0ICVzLyVzIHVzZXM6IiwKKwkJCSAgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCisJaWYgKCFfZ2V0X3B2X2xpc3RfZm9yX2x2KGx2LCAmY29udGV4dCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIGZvcl9lYWNoX3N1Yl9sdihsdiwgJl9nZXRfcHZfbGlzdF9mb3JfbHYsICZjb250ZXh0KTsKK30KKworLyoKKyAqIGdldF9kZWZhdWx0X3JlZ2lvbl9zaXplCisgKiBAY21kCisgKgorICogJ21pcnJvcl9yZWdpb25fc2l6ZScgYW5kICdyYWlkX3JlZ2lvbl9zaXplJyBhcmUgZWZmZWN0aXZlbHkgdGhlIHNhbWUgdGhpbmcuCisgKiBIb3dldmVyLCAicmFpZCIgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiAibWlycm9yIiwgc28gdGhlIG5hbWUgaGFzIGJlZW4KKyAqIGNoYW5nZWQuICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGhlIG9sZCBzZXR0aW5nIGFuZCB3YXJucyB0aGUgdXNlciBpZgorICogaXQgaXMgYmVpbmcgb3ZlcnJpZGRlbiBieSB0aGUgbmV3IHNldHRpbmcgKGkuZS4gd2FybiBpZiBib3RoIHNldHRpbmdzIGFyZQorICogcHJlc2VudCkuCisgKgorICogTm90ZSB0aGF0IHRoZSBjb25maWcgZmlsZXMgZ2l2ZSBkZWZhdWx0cyBpbiBraUIgdGVybXMsIGJ1dCB3ZQorICogcmV0dXJuIHRoZSB2YWx1ZSBpbiB0ZXJtcyBvZiBzZWN0b3JzLgorICoKKyAqIFJldHVybnM6IGRlZmF1bHQgcmVnaW9uX3NpemUgaW4gc2VjdG9ycworICovCitzdGF0aWMgaW50IF9nZXRfZGVmYXVsdF9yZWdpb25fc2l6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpbnQgbXJzLCBycnM7CisKKwkvKgorCSAqICdtaXJyb3JfcmVnaW9uX3NpemUnIGlzIHRoZSBvbGQgc2V0dGluZy4gIEl0IGlzIG92ZXJyaWRkZW4KKwkgKiBieSB0aGUgbmV3IHNldHRpbmcsICdyYWlkX3JlZ2lvbl9zaXplJy4KKwkgKi8KKwltcnMgPSAyICogZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBhY3RpdmF0aW9uX21pcnJvcl9yZWdpb25fc2l6ZV9DRkcsIE5VTEwpOworCXJycyA9IDIgKiBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fcmFpZF9yZWdpb25fc2l6ZV9DRkcsIE5VTEwpOworCisJaWYgKCFtcnMgJiYgIXJycykKKwkJcmV0dXJuIERFRkFVTFRfUkFJRF9SRUdJT05fU0laRSAqIDI7CisKKwlpZiAoIW1ycykKKwkJcmV0dXJuIHJyczsKKworCWlmICghcnJzKQorCQlyZXR1cm4gbXJzOworCisJaWYgKG1ycyAhPSBycnMpCisJCWxvZ192ZXJib3NlKCJPdmVycmlkaW5nIGRlZmF1bHQgJ21pcnJvcl9yZWdpb25fc2l6ZScgc2V0dGluZyIKKwkJCSAgICAiIHdpdGggJ3JhaWRfcmVnaW9uX3NpemUnIHNldHRpbmcgb2YgJXUga2lCIiwKKwkJCSAgICBycnMgLyAyKTsKKworCXJldHVybiBycnM7Cit9CisKK3N0YXRpYyBpbnQgX3JvdW5kX2Rvd25fcG93MihpbnQgcikKK3sKKwkvKiBTZXQgYWxsIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBsZWZ0bW9zdCBzZXQgYml0ICovCisJciB8PSAociA+PiAxKTsKKwlyIHw9IChyID4+IDIpOworCXIgfD0gKHIgPj4gNCk7CisJciB8PSAociA+PiA4KTsKKwlyIHw9IChyID4+IDE2KTsKKworCS8qIFB1bGwgb3V0IHRoZSBsZWZ0bW9zdCBzZXQgYml0ICovCisJcmV0dXJuIHIgJiB+KHIgPj4gMSk7Cit9CisKK2ludCBnZXRfZGVmYXVsdF9yZWdpb25fc2l6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlpbnQgcmVnaW9uX3NpemUgPSBfZ2V0X2RlZmF1bHRfcmVnaW9uX3NpemUoY21kKTsKKworCWlmICghaXNfcG93ZXJfb2ZfMihyZWdpb25fc2l6ZSkpIHsKKwkJcmVnaW9uX3NpemUgPSBfcm91bmRfZG93bl9wb3cyKHJlZ2lvbl9zaXplKTsKKwkJbG9nX3ZlcmJvc2UoIlJlZHVjaW5nIHJlZ2lvbiBzaXplIHRvICV1IGtpQiAocG93ZXIgb2YgMikuIiwKKwkJCSAgICByZWdpb25fc2l6ZSAvIDIpOworCX0KKworCXJldHVybiByZWdpb25fc2l6ZTsKK30KKworaW50IGFkZF9zZWdfdG9fc2Vnc191c2luZ190aGlzX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KSB7CisJCWlmIChzbC0+c2VnID09IHNlZykgeworCQkJc2wtPmNvdW50Kys7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkFkZGluZyAlczolIiBQUkl1MzIgIiBhcyBhbiB1c2VyIG9mICVzIiwKKwkJCSBzZWctPmx2LT5uYW1lLCBzZWctPmxlLCBsdi0+bmFtZSk7CisKKwlpZiAoIShzbCA9IGRtX3Bvb2xfemFsbG9jKGx2LT52Zy0+dmdtZW0sIHNpemVvZigqc2wpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2VnbWVudCBsaXN0Iik7CisJCXJldHVybiAwOworCX0KKworCXNsLT5jb3VudCA9IDE7CisJc2wtPnNlZyA9IHNlZzsKKwlkbV9saXN0X2FkZCgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdiwgJnNsLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitpbnQgcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KSB7CisJCWlmIChzbC0+c2VnICE9IHNlZykKKwkJCWNvbnRpbnVlOworCQlpZiAoc2wtPmNvdW50ID4gMSkKKwkJCXNsLT5jb3VudC0tOworCQllbHNlIHsKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiUiIFBSSXUzMiAiIGlzIG5vIGxvbmdlciBhIHVzZXIgIgorCQkJCQkgIm9mICVzIiwgc2VnLT5sdi0+bmFtZSwgc2VnLT5sZSwKKwkJCQkJIGx2LT5uYW1lKTsKKwkJCWRtX2xpc3RfZGVsKCZzbC0+bGlzdCk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJTZWdtZW50ICVzOiV1IGlzIG5vdCBhIHVzZXIgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgIHNlZy0+bHYtPm5hbWUsIHNlZy0+bGUsIGx2LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgYSBmdW5jdGlvbiBzcGVjaWFsaXplZCBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoZXJlIGlzCisgKiBvbmx5IG9uZSBzZWdtZW50IHdoaWNoIHVzZXMgdGhlIExWLgorICogZS5nLiB0aGUgTFYgaXMgYSBsYXllciBpbnNlcnRlZCBieSBpbnNlcnRfbGF5ZXJfZm9yX2x2KCkuCisgKgorICogSW4gZ2VuZXJhbCwgd2FsayB0aHJvdWdoIGx2LT5zZWdzX3VzaW5nX3RoaXNfbHYuCisgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3Qgc2VnX2xpc3QgKnNsOworCisJaWYgKCFsdikgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdigpIGNhbGxlZCB3aXRoIE5VTEwgTFYuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpIHsKKwkJLyogTmVlZHMgdG8gYmUgaGUgb25seSBpdGVtIGluIGxpc3QgKi8KKwkJaWYgKCFkbV9saXN0X2VuZCgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdiwgJnNsLT5saXN0KSkKKwkJCWJyZWFrOworCisJCWlmIChzbC0+Y291bnQgIT0gMSkgeworCQkJbG9nX2Vycm9yKCIlcyBpcyBleHBlY3RlZCB0byBoYXZlIG9ubHkgb25lIHNlZ21lbnQgdXNpbmcgaXQsICIKKwkJCQkgICJ3aGlsZSAlczolIiBQUkl1MzIgIiB1c2VzIGl0ICVkIHRpbWVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdiksIHNsLT5zZWctPmx2LT5uYW1lLCBzbC0+c2VnLT5sZSwgc2wtPmNvdW50KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcmV0dXJuIHNsLT5zZWc7CisJfQorCisJbG9nX2Vycm9yKCIlcyBpcyBleHBlY3RlZCB0byBoYXZlIG9ubHkgb25lIHNlZ21lbnQgdXNpbmcgaXQsIHdoaWxlIGl0IGhhcyAlZC4iLAorCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgZG1fbGlzdF9zaXplKCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFBWcyB1c2VkIGJ5IGEgc2VnbWVudCBvZiBhbiBMVgorICovCitzdHJ1Y3Qgc2VnX3B2cyB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKworCXN0cnVjdCBkbV9saXN0IHB2czsJLyogc3RydWN0IHB2X2xpc3QgKi8KKworCXVpbnQzMl90IGxlOworCXVpbnQzMl90IGxlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VnX3B2cyAqX2ZpbmRfc2VnX3B2c19ieV9sZShzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgdWludDMyX3QgbGUpCit7CisJc3RydWN0IHNlZ19wdnMgKnNwdnM7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3B2cywgbGlzdCkKKwkJaWYgKGxlID49IHNwdnMtPmxlICYmIGxlIDwgc3B2cy0+bGUgKyBzcHZzLT5sZW4pCisJCQlyZXR1cm4gc3B2czsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogRmluZCBmaXJzdCB1bnVzZWQgTFYgbnVtYmVyLgorICovCit1aW50MzJfdCBmaW5kX2ZyZWVfbHZudW0oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgbHZudW1fdXNlZFtNQVhfUkVTVFJJQ1RFRF9MVlMgKyAxXSA9IHsgMCB9OworCXVpbnQzMl90IGkgPSAwOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IGx2bnVtOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJmx2LT52Zy0+bHZzKSB7CisJCWx2bnVtID0gbHZudW1fZnJvbV9sdmlkKCZsdmwtPmx2LT5sdmlkKTsKKwkJaWYgKGx2bnVtIDw9IE1BWF9SRVNUUklDVEVEX0xWUykKKwkJCWx2bnVtX3VzZWRbbHZudW1dID0gMTsKKwl9CisKKwl3aGlsZSAobHZudW1fdXNlZFtpXSkKKwkJaSsrOworCisJLyogRklYTUUgV2hhdCBpZiBub25lIGFyZSBmcmVlPyAqLworCisJcmV0dXJuIGk7Cit9CisKK2RtX3BlcmNlbnRfdCBjb3B5X3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwl1aW50MzJfdCBudW1lcmF0b3IgPSAwdSwgZGVub21pbmF0b3IgPSAwdTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlkZW5vbWluYXRvciArPSBzZWctPmFyZWFfbGVuOworCisJCS8qIEZJWE1FIEdlbmVyYWxpc2UgbmFtZSBvZiAnZXh0ZW50c19jb3BpZWQnIGZpZWxkICovCisJCWlmICgoKHNlZ19pc19yYWlkKHNlZykgJiYgIXNlZ19pc19hbnlfcmFpZDAoc2VnKSkgfHwgc2VnX2lzX21pcnJvcmVkKHNlZykpICYmCisJCSAgICAoc2VnLT5hcmVhX2NvdW50ID4gMSkpCisJCQludW1lcmF0b3IgKz0gc2VnLT5leHRlbnRzX2NvcGllZDsKKwkJZWxzZQorCQkJbnVtZXJhdG9yICs9IHNlZy0+YXJlYV9sZW47CisJfQorCisJcmV0dXJuIGRlbm9taW5hdG9yID8gZG1fbWFrZV9wZXJjZW50KG51bWVyYXRvciwgZGVub21pbmF0b3IpIDogRE1fUEVSQ0VOVF8xMDA7Cit9CisKKy8qIFJvdW5kIHVwIGV4dGVudHMgdG8gbmV4dCBzdHJpcGUgYm91bmRhcnkgZm9yIG51bWJlciBvZiBzdHJpcGVzICovCitzdGF0aWMgdWludDMyX3QgX3JvdW5kX3RvX3N0cmlwZV9ib3VuZGFyeShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdWludDMyX3QgZXh0ZW50cywKKwkJCQkJICB1aW50MzJfdCBzdHJpcGVzLCBpbnQgZXh0ZW5kKQoreworCXVpbnQzMl90IHNpemVfcmVzdCwgbmV3X2V4dGVudHMgPSBleHRlbnRzOworCisJaWYgKCFzdHJpcGVzKQorCQlyZXR1cm4gZXh0ZW50czsKKworCS8qIFJvdW5kIHVwIGV4dGVudHMgdG8gc3RyaXBlIGRpdmlzaWJsZSBhbW91bnQgKi8KKwlpZiAoKHNpemVfcmVzdCA9IGV4dGVudHMgJSBzdHJpcGVzKSkgeworCQluZXdfZXh0ZW50cyArPSBleHRlbmQgPyBzdHJpcGVzIC0gc2l6ZV9yZXN0IDogLXNpemVfcmVzdDsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJvdW5kaW5nIHNpemUgJXMgKCVkIGV4dGVudHMpIHVwIHRvIHN0cmlwZSBib3VuZGFyeSBzaXplICVzICglZCBleHRlbnRzKS4iLAorCQkJCQlkaXNwbGF5X3NpemUodmctPmNtZCwgKHVpbnQ2NF90KSBleHRlbnRzICogdmctPmV4dGVudF9zaXplKSwgZXh0ZW50cywKKwkJCQkJZGlzcGxheV9zaXplKHZnLT5jbWQsICh1aW50NjRfdCkgbmV3X2V4dGVudHMgKiB2Zy0+ZXh0ZW50X3NpemUpLCBuZXdfZXh0ZW50cyk7CisJfQorCisJcmV0dXJuIG5ld19leHRlbnRzOworfQorCisvKgorICogQWxsIGx2X3NlZ21lbnRzIGdldCBjcmVhdGVkIGhlcmUuCisgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICphbGxvY19sdl9zZWdtZW50KGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgIHVpbnQzMl90IGxlLCB1aW50MzJfdCBsZW4sCisJCQkJICAgIHVpbnQ2NF90IHN0YXR1cywKKwkJCQkgICAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2LAorCQkJCSAgICB1aW50MzJfdCBhcmVhX2NvdW50LAorCQkJCSAgICB1aW50MzJfdCBhcmVhX2xlbiwKKwkJCQkgICAgdWludDMyX3QgY2h1bmtfc2l6ZSwKKwkJCQkgICAgdWludDMyX3QgcmVnaW9uX3NpemUsCisJCQkJICAgIHVpbnQzMl90IGV4dGVudHNfY29waWVkLAorCQkJCSAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqcHZtb3ZlX3NvdXJjZV9zZWcpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gbHYtPnZnLT52Z21lbTsKKwl1aW50MzJfdCBhcmVhc19zeiA9IGFyZWFfY291bnQgKiBzaXplb2YoKnNlZy0+YXJlYXMpOworCisJaWYgKCFzZWd0eXBlKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiYWxsb2NfbHZfc2VnbWVudDogTWlzc2luZyBzZWd0eXBlLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShzZWcgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqc2VnKSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHNlZy0+YXJlYXMgPSBkbV9wb29sX3phbGxvYyhtZW0sIGFyZWFzX3N6KSkpIHsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgc2VnKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJaWYgKHNlZ3R5cGVfaXNfcmFpZChzZWd0eXBlKSAmJgorCSAgICAhc2VndHlwZV9pc19yYWlkMChzZWd0eXBlKSAmJgorCSAgICAhKHNlZy0+bWV0YV9hcmVhcyA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgYXJlYXNfc3opKSkgeworCQlkbV9wb29sX2ZyZWUobWVtLCBzZWcpOyAvKiBmcmVlcyBldmVyeXRoaW5nIGFsbG9jZWQgc2luY2Ugc2VnICovCisJCXJldHVybl9OVUxMOworCX0KKworCXNlZy0+c2VndHlwZSA9IHNlZ3R5cGU7CisJc2VnLT5sdiA9IGx2OworCXNlZy0+bGUgPSBsZTsKKwlzZWctPmxlbiA9IGxlbjsKKwlzZWctPnN0YXR1cyA9IHN0YXR1czsKKwlzZWctPnN0cmlwZV9zaXplID0gc3RyaXBlX3NpemU7CisJc2VnLT5hcmVhX2NvdW50ID0gYXJlYV9jb3VudDsKKwlzZWctPmFyZWFfbGVuID0gYXJlYV9sZW47CisJc2VnLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwlzZWctPnJlZ2lvbl9zaXplID0gcmVnaW9uX3NpemU7CisJc2VnLT5leHRlbnRzX2NvcGllZCA9IGV4dGVudHNfY29waWVkOworCXNlZy0+cHZtb3ZlX3NvdXJjZV9zZWcgPSBwdm1vdmVfc291cmNlX3NlZzsKKwlkbV9saXN0X2luaXQoJnNlZy0+dGFncyk7CisJZG1fbGlzdF9pbml0KCZzZWctPm9yaWdpbl9saXN0KTsKKwlkbV9saXN0X2luaXQoJnNlZy0+dGhpbl9tZXNzYWdlcyk7CisKKwlpZiAobG9nX2x2ICYmICFhdHRhY2hfbWlycm9yX2xvZyhzZWcsIGxvZ19sdikpCisJCXJldHVybl9OVUxMOworCisJaWYgKHNlZ3R5cGVfaXNfbWlycm9yKHNlZ3R5cGUpKQorCQlsdi0+c3RhdHVzIHw9IE1JUlJPUjsKKworCWlmIChzZWd0eXBlX2lzX21pcnJvcmVkKHNlZ3R5cGUpKQorCQlsdi0+c3RhdHVzIHw9IE1JUlJPUkVEOworCisJcmV0dXJuIHNlZzsKK30KKworc3RhdGljIGludCBfcmVsZWFzZV9hbmRfZGlzY2FyZF9sdl9zZWdtZW50X2FyZWEoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgcywKKwkJCQkJCXVpbnQzMl90IGFyZWFfcmVkdWN0aW9uLCBpbnQgd2l0aF9kaXNjYXJkKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpjYWNoZV9zZWc7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IHNlZ19sdihzZWcsIHMpOworCisJaWYgKHNlZ190eXBlKHNlZywgcykgPT0gQVJFQV9VTkFTU0lHTkVEKQorCQlyZXR1cm4gMTsKKworCWlmIChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfUFYpIHsKKwkJaWYgKHdpdGhfZGlzY2FyZCAmJiAhZGlzY2FyZF9wdl9zZWdtZW50KHNlZ19wdnNlZyhzZWcsIHMpLCBhcmVhX3JlZHVjdGlvbikpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIXJlbGVhc2VfcHZfc2VnbWVudChzZWdfcHZzZWcoc2VnLCBzKSwgYXJlYV9yZWR1Y3Rpb24pKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKHNlZy0+YXJlYV9sZW4gPT0gYXJlYV9yZWR1Y3Rpb24pCisJCQlzZWdfdHlwZShzZWcsIHMpID0gQVJFQV9VTkFTU0lHTkVEOworCisJCXJldHVybiAxOworCX0KKworCWlmIChsdl9pc19taXJyb3JfaW1hZ2UobHYpIHx8CisJICAgIGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSB8fAorCSAgICBsdl9pc19jYWNoZV9wb29sX2RhdGEobHYpKSB7CisJCWlmICghbHZfcmVkdWNlKGx2LCBhcmVhX3JlZHVjdGlvbikpCisJCQlyZXR1cm5fMDsgLyogRklYTUU6IGFueSB1cHBlciBsZXZlbCByZXBvcnRpbmcgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNlZ19pc19jYWNoZV9wb29sKHNlZykgJiYKKwkgICAgIWRtX2xpc3RfZW1wdHkoJnNlZy0+bHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpIHsKKwkJaWYgKCEoY2FjaGVfc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KHNlZy0+bHYpKSkKKwkJCXJldHVybl8wOworCisJCWlmICghbHZfY2FjaGVfcmVtb3ZlKGNhY2hlX3NlZy0+bHYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJaWYgKGx2X2lzX3JhaWRfaW1hZ2UobHYpKSB7CisJCS8qCisJCSAqIEZJWE1FOiBVc2UgbHZfcmVkdWNlIG5vdCBsdl9yZW1vdmUKKwkJICogIFdlIHVzZSBsdl9yZW1vdmUgZm9yIG5vdywgYmVjYXVzZSBJIGhhdmVuJ3QgZmlndXJlZCBvdXQKKwkJICogIHdoeSBsdl9yZWR1Y2Ugd29uJ3QgcmVtb3ZlIHRoZSBMVi4KKwkJbHZfcmVkdWNlKGx2LCBhcmVhX3JlZHVjdGlvbik7CisJCSovCisJCWlmIChhcmVhX3JlZHVjdGlvbiAhPSBzZWctPmFyZWFfbGVuKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZWR1Y2UgUkFJRCBMViAtIG9wZXJhdGlvbiBub3QgaW1wbGVtZW50ZWQuIik7CisJCQlyZXR1cm5fMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghbHZfcmVtb3ZlKGx2KSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBSQUlEIGltYWdlICVzIiwKKwkJCQkJICBsdi0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQkvKiBSZW1vdmUgbWV0YWRhdGEgYXJlYSBpZiBpbWFnZSBoYXMgYmVlbiByZW1vdmVkICovCisJCWlmIChzZWctPm1ldGFfYXJlYXMgJiYgc2VnX21ldGFsdihzZWcsIHMpICYmIChhcmVhX3JlZHVjdGlvbiA9PSBzZWctPmFyZWFfbGVuKSkgeworCQkJaWYgKCFsdl9yZWR1Y2Uoc2VnX21ldGFsdihzZWcsIHMpLAorCQkJCSAgICAgICBzZWdfbWV0YWx2KHNlZywgcyktPmxlX2NvdW50KSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBSQUlEIG1ldGEtZGV2aWNlICVzIiwKKwkJCQkJICBzZWdfbWV0YWx2KHNlZywgcyktPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJldHVybiAxOworCX0KKworCWlmIChhcmVhX3JlZHVjdGlvbiA9PSBzZWctPmFyZWFfbGVuKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlJlbW92ZSAlczolIiBQUkl1MzIgIlslIiBQUkl1MzIgIl0gZnJvbSAiCisJCQkJICJ0aGUgdG9wIG9mIExWICVzOiUiIFBSSXUzMiwKKwkJCQkgc2VnLT5sdi0+bmFtZSwgc2VnLT5sZSwgcywKKwkJCQkgbHYtPm5hbWUsIHNlZ19sZShzZWcsIHMpKTsKKworCQlpZiAoIXJlbW92ZV9zZWdfZnJvbV9zZWdzX3VzaW5nX3RoaXNfbHYobHYsIHNlZykpCisJCQlyZXR1cm5fMDsKKwkJc2VnX2x2KHNlZywgcykgPSBOVUxMOworCQlzZWdfbGUoc2VnLCBzKSA9IDA7CisJCXNlZ190eXBlKHNlZywgcykgPSBBUkVBX1VOQVNTSUdORUQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCByZWxlYXNlX2FuZF9kaXNjYXJkX2x2X3NlZ21lbnRfYXJlYShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBzLCB1aW50MzJfdCBhcmVhX3JlZHVjdGlvbikKK3sKKwlyZXR1cm4gX3JlbGVhc2VfYW5kX2Rpc2NhcmRfbHZfc2VnbWVudF9hcmVhKHNlZywgcywgYXJlYV9yZWR1Y3Rpb24sIDEpOworfQorCitpbnQgcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgcywgdWludDMyX3QgYXJlYV9yZWR1Y3Rpb24pCit7CisJcmV0dXJuIF9yZWxlYXNlX2FuZF9kaXNjYXJkX2x2X3NlZ21lbnRfYXJlYShzZWcsIHMsIGFyZWFfcmVkdWN0aW9uLCAwKTsKK30KKworLyoKKyAqIE1vdmUgYSBzZWdtZW50IGFyZWEgZnJvbSBvbmUgc2VnbWVudCB0byBhbm90aGVyCisgKi8KK2ludCBtb3ZlX2x2X3NlZ21lbnRfYXJlYShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX3RvLCB1aW50MzJfdCBhcmVhX3RvLAorCQkJIHN0cnVjdCBsdl9zZWdtZW50ICpzZWdfZnJvbSwgdWludDMyX3QgYXJlYV9mcm9tKQoreworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJdWludDMyX3QgcGUsIGxlOworCisJc3dpdGNoIChzZWdfdHlwZShzZWdfZnJvbSwgYXJlYV9mcm9tKSkgeworCWNhc2UgQVJFQV9QVjoKKwkJcHYgPSBzZWdfcHYoc2VnX2Zyb20sIGFyZWFfZnJvbSk7CisJCXBlID0gc2VnX3BlKHNlZ19mcm9tLCBhcmVhX2Zyb20pOworCisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEoc2VnX2Zyb20sIGFyZWFfZnJvbSwgc2VnX2Zyb20tPmFyZWFfbGVuKSkKKwkJCXJldHVybl8wOworCisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEoc2VnX3RvLCBhcmVhX3RvLCBzZWdfdG8tPmFyZWFfbGVuKSkKKwkJCXJldHVybl8wOworCisJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9wdihzZWdfdG8sIGFyZWFfdG8sIHB2LCBwZSkpCisJCQlyZXR1cm5fMDsKKworCQlicmVhazsKKworCWNhc2UgQVJFQV9MVjoKKwkJbHYgPSBzZWdfbHYoc2VnX2Zyb20sIGFyZWFfZnJvbSk7CisJCWxlID0gc2VnX2xlKHNlZ19mcm9tLCBhcmVhX2Zyb20pOworCisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEoc2VnX2Zyb20sIGFyZWFfZnJvbSwgc2VnX2Zyb20tPmFyZWFfbGVuKSkKKwkJCXJldHVybl8wOworCisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEoc2VnX3RvLCBhcmVhX3RvLCBzZWdfdG8tPmFyZWFfbGVuKSkKKwkJCXJldHVybl8wOworCisJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzZWdfdG8sIGFyZWFfdG8sIGx2LCBsZSwgMCkpCisJCQlyZXR1cm5fMDsKKworCQlicmVhazsKKworCWNhc2UgQVJFQV9VTkFTU0lHTkVEOgorCQlpZiAoIXJlbGVhc2VfbHZfc2VnbWVudF9hcmVhKHNlZ190bywgYXJlYV90bywgc2VnX3RvLT5hcmVhX2xlbikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIExpbmsgcGFydCBvZiBhIFBWIHRvIGFuIExWIHNlZ21lbnQuCisgKi8KK2ludCBzZXRfbHZfc2VnbWVudF9hcmVhX3B2KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHVpbnQzMl90IGFyZWFfbnVtLAorCQkJICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHVpbnQzMl90IHBlKQoreworCXNlZy0+YXJlYXNbYXJlYV9udW1dLnR5cGUgPSBBUkVBX1BWOworCisJaWYgKCEoc2VnX3B2c2VnKHNlZywgYXJlYV9udW0pID0KKwkgICAgICBhc3NpZ25fcGVnX3RvX2x2c2VnKHB2LCBwZSwgc2VnLT5hcmVhX2xlbiwgc2VnLCBhcmVhX251bSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogTGluayBvbmUgTFYgc2VnbWVudCB0byBhbm90aGVyLiAgQXNzdW1lcyBzaXplcyBhbHJlYWR5IG1hdGNoLgorICovCitpbnQgc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBhcmVhX251bSwKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlLAorCQkJICAgdWludDY0X3Qgc3RhdHVzKQoreworCWxvZ192ZXJ5X3ZlcmJvc2UoIlN0YWNrICVzOiUiIFBSSXUzMiAiWyUiIFBSSXUzMiAiXSBvbiBMViAlczolIiBQUkl1MzIsCisJCQkgc2VnLT5sdi0+bmFtZSwgc2VnLT5sZSwgYXJlYV9udW0sIGx2LT5uYW1lLCBsZSk7CisKKwlpZiAoc3RhdHVzICYgUkFJRF9NRVRBKSB7CisJCXNlZy0+bWV0YV9hcmVhc1thcmVhX251bV0udHlwZSA9IEFSRUFfTFY7CisJCXNlZ19tZXRhbHYoc2VnLCBhcmVhX251bSkgPSBsdjsKKwkJaWYgKGxlKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1ldGEgbGUgIT0gMCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2VnX21ldGFsZShzZWcsIGFyZWFfbnVtKSA9IDA7CisJfSBlbHNlIHsKKwkJc2VnLT5hcmVhc1thcmVhX251bV0udHlwZSA9IEFSRUFfTFY7CisJCXNlZ19sdihzZWcsIGFyZWFfbnVtKSA9IGx2OworCQlzZWdfbGUoc2VnLCBhcmVhX251bSkgPSBsZTsKKwl9CisJbHYtPnN0YXR1cyB8PSBzdGF0dXM7CisKKwlpZiAoIWFkZF9zZWdfdG9fc2Vnc191c2luZ190aGlzX2x2KGx2LCBzZWcpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogUHJlcGFyZSBmb3IgYWRkaW5nIHBhcmFsbGVsIGFyZWFzIHRvIGFuIGV4aXN0aW5nIHNlZ21lbnQuCisgKi8KK3N0YXRpYyBpbnQgX2x2X3NlZ21lbnRfYWRkX2FyZWFzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJIHVpbnQzMl90IG5ld19hcmVhX2NvdW50KQoreworCXN0cnVjdCBsdl9zZWdtZW50X2FyZWEgKm5ld2FyZWFzOworCXVpbnQzMl90IGFyZWFzX3N6ID0gbmV3X2FyZWFfY291bnQgKiBzaXplb2YoKm5ld2FyZWFzKTsKKworCWlmICghKG5ld2FyZWFzID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT5jbWQtPm1lbSwgYXJlYXNfc3opKSkKKwkJcmV0dXJuXzA7CisKKwltZW1jcHkobmV3YXJlYXMsIHNlZy0+YXJlYXMsIHNlZy0+YXJlYV9jb3VudCAqIHNpemVvZigqc2VnLT5hcmVhcykpOworCisJc2VnLT5hcmVhcyA9IG5ld2FyZWFzOworCXNlZy0+YXJlYV9jb3VudCA9IG5ld19hcmVhX2NvdW50OworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfY2FsY19hcmVhX211bHRpcGxlKGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCQkJICAgIGNvbnN0IHVpbnQzMl90IGFyZWFfY291bnQsCisJCQkJICAgIGNvbnN0IHVpbnQzMl90IHN0cmlwZXMpCit7CisJaWYgKCFhcmVhX2NvdW50KQorCQlyZXR1cm4gMTsKKworCS8qIFN0cmlwZWQgKi8KKwlpZiAoc2VndHlwZV9pc19zdHJpcGVkKHNlZ3R5cGUpKQorCQlyZXR1cm4gYXJlYV9jb3VudDsKKworCS8qIFBhcml0eSBSQUlEIChlLmcuIFJBSUQgNC81LzYpICovCisJaWYgKHNlZ3R5cGVfaXNfcmFpZChzZWd0eXBlKSAmJiBzZWd0eXBlLT5wYXJpdHlfZGV2cykgeworCQkvKgorCQkgKiBBcyBhcnRpY3VsYXRlZCBpbiBfYWxsb2NfaW5pdCwgd2UgY2FuIHRlbGwgYnkKKwkJICogdGhlIGFyZWFfY291bnQgd2hldGhlciBhIHJlcGxhY2VtZW50IGRyaXZlIGlzCisJCSAqIGJlaW5nIGFsbG9jYXRlZDsgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4KKwkJICogdGhlcmUgaXMgbm8gYXJlYV9tdWx0aXBsZSB0aGF0IHNob3VsZCBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKGFyZWFfY291bnQgPD0gc2VndHlwZS0+cGFyaXR5X2RldnMpCisJCQlyZXR1cm4gMTsKKworCQlyZXR1cm4gYXJlYV9jb3VudCAtIHNlZ3R5cGUtPnBhcml0eV9kZXZzOworCX0KKworCS8qCisJICogUkFJRDEwIC0gb25seSBoYXMgMi13YXkgbWlycm9yIHJpZ2h0IG5vdy4KKwkgKiAgICAgICAgICBJZiB3ZSBhcmUgdG8gbW92ZSBiZXlvbmQgMi13YXkgUkFJRDEwLCB0aGVuCisJICogICAgICAgICAgdGhlICdzdHJpcGVzJyBhcmd1bWVudCB3aWxsIGFsd2F5cyBuZWVkIHRvCisJICogICAgICAgICAgYmUgZ2l2ZW4uCisJICovCisJaWYgKCFzdHJjbXAoc2VndHlwZS0+bmFtZSwgX2x2X3R5cGVfbmFtZXNbTFZfVFlQRV9SQUlEMTBdKSkgeworCQlpZiAoIXN0cmlwZXMpCisJCQlyZXR1cm4gYXJlYV9jb3VudCAvIDI7CisJCXJldHVybiBzdHJpcGVzOworCX0KKworCS8qIE1pcnJvcmVkIHN0cmlwZXMgKi8KKwlpZiAoc3RyaXBlcykKKwkJcmV0dXJuIHN0cmlwZXM7CisKKwkvKiBNaXJyb3JlZCAqLworCXJldHVybiAxOworfQorCisvKgorICogUmVkdWNlIHRoZSBzaXplIG9mIGFuIGx2X3NlZ21lbnQuICBOZXcgc2l6ZSBjYW4gYmUgemVyby4KKyAqLworc3RhdGljIGludCBfbHZfc2VnbWVudF9yZWR1Y2Uoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgcmVkdWN0aW9uKQoreworCXVpbnQzMl90IGFyZWFfcmVkdWN0aW9uLCBzOworCisJLyogQ2FsbGVyIG11c3QgZW5zdXJlIGV4YWN0IGRpdmlzaWJpbGl0eSAqLworCWlmIChzZWdfaXNfc3RyaXBlZChzZWcpKSB7CisJCWlmIChyZWR1Y3Rpb24gJSBzZWctPmFyZWFfY291bnQpIHsKKwkJCWxvZ19lcnJvcigiU2VnbWVudCBleHRlbnQgcmVkdWN0aW9uICUiIFBSSXUzMgorCQkJCSAgIiBub3QgZGl2aXNpYmxlIGJ5ICNzdHJpcGVzICUiIFBSSXUzMiwKKwkJCQkgIHJlZHVjdGlvbiwgc2VnLT5hcmVhX2NvdW50KTsKKwkJCXJldHVybiAwOworCQl9CisJCWFyZWFfcmVkdWN0aW9uID0gKHJlZHVjdGlvbiAvIHNlZy0+YXJlYV9jb3VudCk7CisJfSBlbHNlCisJCWFyZWFfcmVkdWN0aW9uID0gcmVkdWN0aW9uOworCisJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQlpZiAoIXJlbGVhc2VfYW5kX2Rpc2NhcmRfbHZfc2VnbWVudF9hcmVhKHNlZywgcywgYXJlYV9yZWR1Y3Rpb24pKQorCQkJcmV0dXJuXzA7CisKKwlzZWctPmxlbiAtPSByZWR1Y3Rpb247CisJc2VnLT5hcmVhX2xlbiAtPSBhcmVhX3JlZHVjdGlvbjsKKworCXJldHVybiAxOworfQorCisvKgorICogRW50cnkgcG9pbnQgZm9yIGFsbCBMViByZWR1Y3Rpb25zIGluIHNpemUuCisgKi8KK3N0YXRpYyBpbnQgX2x2X3JlZHVjZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBleHRlbnRzLCBpbnQgZGVsZXRlKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJdWludDMyX3QgY291bnQgPSBleHRlbnRzOworCXVpbnQzMl90IHJlZHVjdGlvbjsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHY7CisKKwlpZiAobHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpKSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiRHJvcHBpbmcgc25hcHNob3QgbWVyZ2Ugb2YgJXMgdG8gcmVtb3ZlZCBvcmlnaW4gJXMuIiwKKwkJCQkgICBmaW5kX3NuYXBzaG90KGx2KS0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJY2xlYXJfc25hcHNob3RfbWVyZ2UobHYpOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9iYWNrX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlpZiAoIWNvdW50KQorCQkJYnJlYWs7CisKKwkJaWYgKHNlZy0+bGVuIDw9IGNvdW50KSB7CisJCQlpZiAoc2VnLT5tZXJnZV9sdikgeworCQkJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiRHJvcHBpbmcgc25hcHNob3QgbWVyZ2Ugb2YgcmVtb3ZlZCAlcyB0byBvcmlnaW4gJXMuIiwKKwkJCQkJCSAgIHNlZy0+bHYtPm5hbWUsIHNlZy0+bWVyZ2VfbHYtPm5hbWUpOworCQkJCWNsZWFyX3NuYXBzaG90X21lcmdlKHNlZy0+bWVyZ2VfbHYpOworCQkJfQorCisJCQkvKiByZW1vdmUgdGhpcyBzZWdtZW50IGNvbXBsZXRlbHkgKi8KKwkJCS8qIEZJWE1FIENoZWNrIHRoaXMgaXMgc2FmZSAqLworCQkJaWYgKHNlZy0+bG9nX2x2ICYmICFsdl9yZW1vdmUoc2VnLT5sb2dfbHYpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoc2VnLT5tZXRhZGF0YV9sdiAmJiAhbHZfcmVtb3ZlKHNlZy0+bWV0YWRhdGFfbHYpKQorCQkJCXJldHVybl8wOworCisJCQkvKiBSZW1vdmUgY2FjaGUgb3JpZ2luIG9ubHkgd2hlbiByZW1vdmluZyAobm90IG9uIGx2X2VtcHR5KCkpICovCisJCQlpZiAoZGVsZXRlICYmIHNlZ19pc19jYWNoZShzZWcpKSB7CisJCQkJaWYgKGx2X2lzX3BlbmRpbmdfZGVsZXRlKHNlZy0+bHYpKSB7CisJCQkJCS8qIEp1c3QgZHJvcHBpbmcgcmVmZXJlbmNlIG9uIG9yaWdpbiB3aGVuIHBlbmRpbmcgZGVsZXRlICovCisJCQkJCWlmICghcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihzZWdfbHYoc2VnLCAwKSwgc2VnKSkKKwkJCQkJCXJldHVybl8wOworCQkJCQlzZWdfbHYoc2VnLCAwKSA9IE5VTEw7CisJCQkJCXNlZ19sZShzZWcsIDApID0gMDsKKwkJCQkJc2VnX3R5cGUoc2VnLCAwKSA9IEFSRUFfVU5BU1NJR05FRDsKKwkJCQkJaWYgKHNlZy0+cG9vbF9sdiAmJiAhZGV0YWNoX3Bvb2xfbHYoc2VnKSkKKwkJCQkJCXJldHVybl8wOworCQkJCX0gZWxzZSBpZiAoIWx2X3JlbW92ZShzZWdfbHYoc2VnLCAwKSkpCisJCQkJCXJldHVybl8wOworCQkJfQorCisJCQlpZiAoKHBvb2xfbHYgPSBzZWctPnBvb2xfbHYpKSB7CisJCQkJaWYgKCFkZXRhY2hfcG9vbF9sdihzZWcpKQorCQkJCQlyZXR1cm5fMDsKKwkJCQkvKiBXaGVuIHJlbW92aW5nIGNhY2hlZCBMViwgcmVtb3ZlIHBvb2wgYXMgd2VsbCAqLworCQkJCWlmIChzZWdfaXNfY2FjaGUoc2VnKSAmJiAhbHZfcmVtb3ZlKHBvb2xfbHYpKQorCQkJCQlyZXR1cm5fMDsKKwkJCX0KKworCQkJZG1fbGlzdF9kZWwoJnNlZy0+bGlzdCk7CisJCQlyZWR1Y3Rpb24gPSBzZWctPmxlbjsKKwkJfSBlbHNlCisJCQlyZWR1Y3Rpb24gPSBjb3VudDsKKworCQlpZiAoIV9sdl9zZWdtZW50X3JlZHVjZShzZWcsIHJlZHVjdGlvbikpCisJCQlyZXR1cm5fMDsKKwkJY291bnQgLT0gcmVkdWN0aW9uOworCX0KKworCWx2LT5sZV9jb3VudCAtPSBleHRlbnRzOworCWx2LT5zaXplID0gKHVpbnQ2NF90KSBsdi0+bGVfY291bnQgKiBsdi0+dmctPmV4dGVudF9zaXplOworCisJaWYgKCFkZWxldGUpCisJCXJldHVybiAxOworCisJaWYgKGx2ID09IGx2LT52Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdikgeworCQlsdi0+c3RhdHVzICY9IH5QT09MX01FVEFEQVRBX1NQQVJFOworCQlsdi0+dmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYgPSBOVUxMOworCX0KKworCS8qIFJlbW92ZSB0aGUgTFYgaWYgaXQgaXMgbm93IGVtcHR5ICovCisJaWYgKCFsdi0+bGVfY291bnQgJiYgIXVubGlua19sdl9mcm9tX3ZnKGx2KSkKKwkJcmV0dXJuXzA7CisJZWxzZSBpZiAobHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cCAmJgorCQkgICAhbHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cChsdi0+dmctPmZpZCwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogRW1wdHkgYW4gTFYuCisgKi8KK2ludCBsdl9lbXB0eShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBfbHZfcmVkdWNlKGx2LCBsdi0+bGVfY291bnQsIDApOworfQorCisvKgorICogRW1wdHkgYW4gTFYgYW5kIGFkZCBlcnJvciBzZWdtZW50LgorICovCitpbnQgcmVwbGFjZV9sdl93aXRoX2Vycm9yX3NlZ21lbnQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwl1aW50MzJfdCBsZW4gPSBsdi0+bGVfY291bnQ7CisKKwlpZiAobGVuICYmICFsdl9lbXB0eShsdikpCisJCXJldHVybl8wOworCisJLyogTWluaW11bSBzaXplIHJlcXVpcmVkIGZvciBhIHRhYmxlLiAqLworCWlmICghbGVuKQorCQlsZW4gPSAxOworCisJLyoKKwkgKiBTaW5jZSB3ZSBhcmUgcmVwbGFjaW5nIHRoZSB3aGF0ZXZlci13YXMtdGhlcmUgd2l0aAorCSAqIGFuIGVycm9yIHNlZ21lbnQsIHdlIHNob3VsZCBhbHNvIGNsZWFyIGFueSBmbGFncworCSAqIHRoYXQgc3VnZ2VzdCBpdCBpcyBhbnl0aGluZyBvdGhlciB0aGFuICJlcnJvciIuCisJICovCisJLyogRklYTUUgQ2hlY2sgZm9yIG90aGVyIGZsYWdzIHRoYXQgbmVlZCByZW1vdmluZyAqLworCWx2LT5zdGF0dXMgJj0gfihNSVJST1J8TUlSUk9SRUR8UFZNT1ZFfExPQ0tFRCk7CisKKwkvKiBGSVhNRSBDaGVjayBmb3IgYW55IGF0dGFjaGVkIExWcyB0aGF0IHdpbGwgYmVjb21lIG9ycGhhbnMgZS5nLiBtaXJyb3IgbG9ncyAqLworCisJaWYgKCFsdl9hZGRfdmlydHVhbF9zZWdtZW50KGx2LCAwLCBsZW4sIGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGx2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX0VSUk9SKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBsdl9yZWZyZXNoX3N1c3BlbmRfcmVzdW1lKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBsdi0+dmctPmNtZDsKKwlpbnQgciA9IDE7CisKKwlpZiAoIWNtZC0+cGFydGlhbF9hY3RpdmF0aW9uICYmIGx2X2lzX3BhcnRpYWwobHYpKSB7CisJCWxvZ19lcnJvcigiUmVmdXNpbmcgcmVmcmVzaCBvZiBwYXJ0aWFsIExWICVzLiIKKwkJCSAgIiBVc2UgJy0tYWN0aXZhdGlvbm1vZGUgcGFydGlhbCcgdG8gb3ZlcnJpZGUuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdXNwZW5kX2x2KGNtZCwgbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN1c3BlbmQgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJciA9IDA7CisJfQorCisJaWYgKCFyZXN1bWVfbHYoY21kLCBsdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVhY3RpdmF0ZSAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJlbW92ZSBnaXZlbiBudW1iZXIgb2YgZXh0ZW50cyBmcm9tIExWLgorICovCitpbnQgbHZfcmVkdWNlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGV4dGVudHMpCit7CisJcmV0dXJuIF9sdl9yZWR1Y2UobHYsIGV4dGVudHMsIDEpOworfQorCitpbnQgaGlzdG9yaWNhbF9nbHZfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpnbHYpCit7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKm9yaWdpbl9nbHY7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsLCAqdXNlcl9nbHZsOworCXN0cnVjdCBoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lICpobHY7CisJaW50IHJlY29ubmVjdGVkOworCisJaWYgKCFnbHYgfHwgIWdsdi0+aXNfaGlzdG9yaWNhbCkKKwkJcmV0dXJuXzA7CisKKwlobHYgPSBnbHYtPmhpc3RvcmljYWw7CisKKwlpZiAoIShnbHYgPSBmaW5kX2hpc3RvcmljYWxfZ2x2KGhsdi0+dmcsIGhsdi0+bmFtZSwgMCwgJmdsdmwpKSkgeworCQlpZiAoIShmaW5kX2hpc3RvcmljYWxfZ2x2KGhsdi0+dmcsIGhsdi0+bmFtZSwgMSwgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImhpc3RvcmljYWxfZ2x2X3JlbW92ZTogaGlzdG9yaWNhbCBMViAlcy8tJXMgbm90IGZvdW5kICIsCisJCQkJICBobHYtPnZnLT5uYW1lLCBobHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlsb2dfdmVyYm9zZSgiSGlzdG9yaWNhbCBMViAlcy8tJXMgYWxyZWFkeSBvbiByZW1vdmVkIGxpc3QgIiwKKwkJCQkgICAgaGx2LT52Zy0+bmFtZSwgaGx2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKChvcmlnaW5fZ2x2ID0gaGx2LT5pbmRpcmVjdF9vcmlnaW4pICYmCisJICAgICFyZW1vdmVfZ2x2X2Zyb21faW5kaXJlY3RfZ2x2cyhvcmlnaW5fZ2x2LCBnbHYpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh1c2VyX2dsdmwsICZobHYtPmluZGlyZWN0X2dsdnMpIHsKKwkJcmVjb25uZWN0ZWQgPSAwOworCQlpZiAoKG9yaWdpbl9nbHYgJiYgIW9yaWdpbl9nbHYtPmlzX2hpc3RvcmljYWwpICYmICF1c2VyX2dsdmwtPmdsdi0+aXNfaGlzdG9yaWNhbCkKKwkJCWxvZ192ZXJib3NlKCJSZW1vdmluZyBoaXN0b3JpY2FsIGNvbm5lY3Rpb24gYmV0d2VlbiAlcyBhbmQgJXMuIiwKKwkJCQkgICAgIG9yaWdpbl9nbHYtPmxpdmUtPm5hbWUsIHVzZXJfZ2x2bC0+Z2x2LT5saXZlLT5uYW1lKTsKKwkJZWxzZSBpZiAoaGx2LT52Zy0+Y21kLT5yZWNvcmRfaGlzdG9yaWNhbF9sdnMpIHsKKwkJCWlmICghYWRkX2dsdl90b19pbmRpcmVjdF9nbHZzKGhsdi0+dmctPnZnbWVtLCBvcmlnaW5fZ2x2LCB1c2VyX2dsdmwtPmdsdikpCisJCQkJcmV0dXJuXzA7CisJCQlyZWNvbm5lY3RlZCA9IDE7CisJCX0KKworCQlpZiAoIXJlY29ubmVjdGVkKSB7CisJCQkvKgorCQkJICogQnJlYWsgYW5jZXN0cnkgY2hhaW4gaWYgd2UncmUgcmVtb3ZpbmcgaGlzdG9yaWNhbCBMViBhbmQgdHJhY2tpbmcKKwkJCSAqIGhpc3RvcmljYWwgTFZzIGlzIHN3aXRjaGVkIG9mZiBlaXRoZXIgdmlhOgorCQkJICogICAtICJtZXRhZGF0YS9yZWNvcmRfbHZzX2hpc3Rvcnk9MCIgY29uZmlnCisJCQkgKiAgIC0gIi0tbm9oaXN0b3J5IiBjbWQgbGluZSBvcHRpb24KKwkJCSAqCisJCQkgKiBBbHNvLCBicmVhayB0aGUgY2hhaW4gaWYgd2UncmUgdW5hYmxlIHRvIHN0b3JlIHN1Y2ggY29ubmVjdGlvbiBhdCBhbGwKKwkJCSAqIGJlY2F1c2Ugd2UncmUgcmVtb3ZpbmcgdGhlIHZlcnkgbGFzdCBoaXN0b3JpY2FsIExWIHRoYXQgd2FzIGluIGJldHdlZW4KKwkJCSAqIGxpdmUgTFZzIC0gcHVyZSBsaXZlIExWcyBjYW4ndCBzdG9yZSBhbnkgaW5kaXJlY3Qgb3JpZ2luIHJlbGF0aW9uIGluCisJCQkgKiBtZXRhZGF0YSAtIHdlIG5lZWQgYXQgbGVhc3Qgb25lIGhpc3RvcmljYWwgTFYgdG8gZG8gdGhhdCEKKwkJCSAqLworCQkJaWYgKHVzZXJfZ2x2bC0+Z2x2LT5pc19oaXN0b3JpY2FsKQorCQkJCXVzZXJfZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT5pbmRpcmVjdF9vcmlnaW4gPSBOVUxMOworCQkJZWxzZQorCQkJCWZpcnN0X3NlZyh1c2VyX2dsdmwtPmdsdi0+bGl2ZSktPmluZGlyZWN0X29yaWdpbiA9IE5VTEw7CisJCX0KKwl9CisKKwlkbV9saXN0X21vdmUoJmhsdi0+dmctPnJlbW92ZWRfaGlzdG9yaWNhbF9sdnMsICZnbHZsLT5saXN0KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENvbXBsZXRlbHkgcmVtb3ZlIGFuIExWLgorICovCitpbnQgbHZfcmVtb3ZlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKGx2X2lzX2hpc3RvcmljYWwobHYpKQorCQlyZXR1cm4gaGlzdG9yaWNhbF9nbHZfcmVtb3ZlKGx2LT50aGlzX2dsdik7CisKKwlpZiAoIWx2X3JlZHVjZShsdiwgbHYtPmxlX2NvdW50KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEEgc2V0IG9mIGNvbnRpZ3VvdXMgcGh5c2ljYWwgZXh0ZW50cyBhbGxvY2F0ZWQKKyAqLworc3RydWN0IGFsbG9jZWRfYXJlYSB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXVpbnQzMl90IHBlOworCXVpbnQzMl90IGxlbjsKK307CisKKy8qCisgKiBEZXRhaWxzIG9mIGFuIGFsbG9jYXRpb24gYXR0ZW1wdAorICovCitzdHJ1Y3QgYWxsb2NfaGFuZGxlIHsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZDsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CQkvKiBPdmVyYWxsIHBvbGljeSAqLworCWludCBhcHByb3hfYWxsb2M7CQkvKiBnZXQgYXMgbXVjaCBhcyBwb3NzaWJsZSB1cCB0byBuZXdfZXh0ZW50cyAqLworCXVpbnQzMl90IG5ld19leHRlbnRzOwkJLyogTnVtYmVyIG9mIG5ldyBleHRlbnRzIHJlcXVpcmVkICovCisJdWludDMyX3QgYXJlYV9jb3VudDsJCS8qIE51bWJlciBvZiBwYXJhbGxlbCBhcmVhcyAqLworCXVpbnQzMl90IHBhcml0eV9jb3VudDsJCS8qIEFkZHMgdG8gYXJlYV9jb3VudCwgYnV0IG5vdCBhcmVhX211bHRpcGxlICovCisJdWludDMyX3QgYXJlYV9tdWx0aXBsZTsJCS8qIHNlZy0+bGVuID0gYXJlYV9sZW4gKiBhcmVhX211bHRpcGxlICovCisJdWludDMyX3QgbG9nX2FyZWFfY291bnQ7CS8qIE51bWJlciBvZiBwYXJhbGxlbCBsb2dzICovCisJdWludDMyX3QgbWV0YWRhdGFfYXJlYV9jb3VudDsgICAvKiBOdW1iZXIgb2YgcGFyYWxsZWwgbWV0YWRhdGEgYXJlYXMgKi8KKwl1aW50MzJfdCBsb2dfbGVuOwkJLyogTGVuZ3RoIG9mIGxvZy9tZXRhZGF0YV9hcmVhICovCisJdWludDMyX3QgcmVnaW9uX3NpemU7CQkvKiBNaXJyb3IgcmVnaW9uIHNpemUgKi8KKwl1aW50MzJfdCB0b3RhbF9hcmVhX2xlbjsJLyogVG90YWwgbnVtYmVyIG9mIHBhcmFsbGVsIGV4dGVudHMgKi8KKworCXVuc2lnbmVkIG1heGltaXNlX2NsaW5nOworCXVuc2lnbmVkIG1pcnJvcl9sb2dzX3NlcGFyYXRlOwkvKiBGb3JjZSBtaXJyb3IgbG9ncyBvbiBzZXBhcmF0ZSBQVnM/ICovCisKKwkvKgorCSAqIFJBSUQgZGV2aWNlcyByZXF1aXJlIGEgbWV0YWRhdGEgYXJlYSB0aGF0IGFjY29tcGFuaWVzIGVhY2gKKwkgKiBkZXZpY2UuICBEdXJpbmcgaW5pdGlhbCBjcmVhdGlvbiwgaXQgaXMgYmVzdCB0byBsb29rIGZvciBzcGFjZQorCSAqIHRoYXQgaXMgbmV3X2V4dGVudHMgKyBsb2dfbGVuIGFuZCB0aGVuIHNwbGl0IHRoYXQgYmV0d2VlbiB0d28KKwkgKiBhbGxvY2F0ZWQgYXJlYXMgd2hlbiBmb3VuZC4gICdhbGxvY19hbmRfc3BsaXRfbWV0YScgaW5kaWNhdGVzCisJICogdGhhdCB0aGlzIGlzIHRoZSBkZXNpcmVkIGR5bmFtaWMuCisJICoKKwkgKiBUaGlzIHNhbWUgaWRlYSBpcyB1c2VkIGJ5IGNhY2hlIExWcyB0byBnZXQgdGhlIG1ldGFkYXRhIGRldmljZQorCSAqIGFuZCBkYXRhIGRldmljZSBhbGxvY2F0ZWQgdG9nZXRoZXIuCisJICovCisJdW5zaWduZWQgYWxsb2NfYW5kX3NwbGl0X21ldGE7CisJdW5zaWduZWQgc3BsaXRfbWV0YWRhdGFfaXNfYWxsb2NhdGVkOwkvKiBNZXRhZGF0YSBoYXMgYmVlbiBhbGxvY2F0ZWQgKi8KKworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY2xpbmdfdGFnX2xpc3RfY247CisKKwlzdHJ1Y3QgZG1fbGlzdCAqcGFyYWxsZWxfYXJlYXM7CS8qIFBWcyB0byBhdm9pZCAqLworCisJLyoKKwkgKiBDb250YWlucyBhcmVhX2NvdW50IGxpc3RzIG9mIGFyZWFzIGFsbG9jYXRlZCB0byBkYXRhIHN0cmlwZXMKKwkgKiBmb2xsb3dlZCBieSBsb2dfYXJlYV9jb3VudCBsaXN0cyBvZiBhcmVhcyBhbGxvY2F0ZWQgdG8gbG9nIHN0cmlwZXMuCisJICovCisJc3RydWN0IGRtX2xpc3QgYWxsb2NlZF9hcmVhc1swXTsKK307CisKKy8qCisgKiBSZXR1cm5zIGxvZyBkZXZpY2Ugc2l6ZSBpbiBleHRlbnRzLCBhbGdvcml0aG0gZnJvbSBrZXJuZWwgY29kZQorICovCisjZGVmaW5lIEJZVEVfU0hJRlQgMworc3RhdGljIHVpbnQzMl90IF9taXJyb3JfbG9nX2V4dGVudHModWludDMyX3QgcmVnaW9uX3NpemUsIHVpbnQzMl90IHBlX3NpemUsIHVpbnQzMl90IGFyZWFfbGVuKQoreworCXNpemVfdCBhcmVhX3NpemUsIGJpdHNldF9zaXplLCBsb2dfc2l6ZSwgcmVnaW9uX2NvdW50OworCisJYXJlYV9zaXplID0gKHNpemVfdClhcmVhX2xlbiAqIHBlX3NpemU7CisJcmVnaW9uX2NvdW50ID0gZG1fZGl2X3VwKGFyZWFfc2l6ZSwgcmVnaW9uX3NpemUpOworCisJLyogV29yayBvdXQgaG93IG1hbnkgInVuc2lnbmVkIGxvbmcicyB3ZSBuZWVkIHRvIGhvbGQgdGhlIGJpdHNldC4gKi8KKwliaXRzZXRfc2l6ZSA9IGRtX3JvdW5kX3VwKHJlZ2lvbl9jb3VudCwgc2l6ZW9mKHVpbnQzMl90KSA8PCBCWVRFX1NISUZUKTsKKwliaXRzZXRfc2l6ZSA+Pj0gQllURV9TSElGVDsKKworCS8qIExvZyBkZXZpY2UgaG9sZHMgYm90aCBoZWFkZXIgYW5kIGJpdHNldC4gKi8KKwlsb2dfc2l6ZSA9IGRtX3JvdW5kX3VwKChNSVJST1JfTE9HX09GRlNFVCA8PCBTRUNUT1JfU0hJRlQpICsgYml0c2V0X3NpemUsIDEgPDwgU0VDVE9SX1NISUZUKTsKKwlsb2dfc2l6ZSA+Pj0gU0VDVE9SX1NISUZUOworCWxvZ19zaXplID0gZG1fZGl2X3VwKGxvZ19zaXplLCBwZV9zaXplKTsKKworCS8qCisJICogS2VybmVsIHJlcXVpcmVzIGEgbWlycm9yIHRvIGJlIGF0IGxlYXN0IDEgcmVnaW9uIGxhcmdlLiAgU28sCisJICogaWYgb3VyIG1pcnJvciBsb2cgaXMgaXRzZWxmIGEgbWlycm9yLCBpdCBtdXN0IGJlIGF0IGxlYXN0CisJICogMSByZWdpb24gbGFyZ2UuICBUaGlzIHJlc3RyaWN0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5IGZvcgorCSAqIG5vbi1taXJyb3JlZCBsb2dzLCBidXQgd2UgYXBwbHkgdGhlIHJ1bGUgYW55d2F5LgorCSAqCisJICogKFRoZSBvdGhlciBvcHRpb24gaXMgdG8gbWFrZSB0aGUgcmVnaW9uIHNpemUgb2YgdGhlIGxvZworCSAqIG1pcnJvciBzbWFsbGVyIHRoYW4gdGhlIG1pcnJvciBpdCBpcyBhY3RpbmcgYXMgYSBsb2cgZm9yLAorCSAqIGJ1dCB0aGF0IHJlYWxseSBjb21wbGljYXRlcyB0aGluZ3MuICBJdCdzIG11Y2ggZWFzaWVyIHRvCisJICoga2VlcCB0aGUgcmVnaW9uX3NpemUgdGhlIHNhbWUgZm9yIGJvdGguKQorCSAqLworCXJldHVybiAobG9nX3NpemUgPiAocmVnaW9uX3NpemUgLyBwZV9zaXplKSkgPyBsb2dfc2l6ZSA6CisJCShyZWdpb25fc2l6ZSAvIHBlX3NpemUpOworfQorCisvKiBJcyB0aGVyZSBlbm91Z2ggdG90YWwgc3BhY2Ugb3Igc2hvdWxkIHdlIGdpdmUgdXAgaW1tZWRpYXRlbHk/ICovCitzdGF0aWMgaW50IF9zdWZmaWNpZW50X3Blc19mcmVlKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLCBzdHJ1Y3QgZG1fbGlzdCAqcHZtcywKKwkJCQl1aW50MzJfdCBhbGxvY2F0ZWQsIHVpbnQzMl90IGV4dGVudHNfc3RpbGxfbmVlZGVkKQoreworCXVpbnQzMl90IGFyZWFfZXh0ZW50c19uZWVkZWQgPSAoZXh0ZW50c19zdGlsbF9uZWVkZWQgLSBhbGxvY2F0ZWQpICogYWgtPmFyZWFfY291bnQgLyBhaC0+YXJlYV9tdWx0aXBsZTsKKwl1aW50MzJfdCBwYXJpdHlfZXh0ZW50c19uZWVkZWQgPSAoZXh0ZW50c19zdGlsbF9uZWVkZWQgLSBhbGxvY2F0ZWQpICogYWgtPnBhcml0eV9jb3VudCAvIGFoLT5hcmVhX211bHRpcGxlOworCXVpbnQzMl90IG1ldGFkYXRhX2V4dGVudHNfbmVlZGVkID0gYWgtPmFsbG9jX2FuZF9zcGxpdF9tZXRhID8gMCA6IGFoLT5tZXRhZGF0YV9hcmVhX2NvdW50ICogUkFJRF9NRVRBREFUQV9BUkVBX0xFTjsgLyogT25lIGVhY2ggKi8KKwl1aW50MzJfdCB0b3RhbF9leHRlbnRzX25lZWRlZCA9IGFyZWFfZXh0ZW50c19uZWVkZWQgKyBwYXJpdHlfZXh0ZW50c19uZWVkZWQgKyBtZXRhZGF0YV9leHRlbnRzX25lZWRlZDsKKwl1aW50MzJfdCBmcmVlX3BlcyA9IHB2X21hcHNfc2l6ZShwdm1zKTsKKworCWlmICh0b3RhbF9leHRlbnRzX25lZWRlZCA+IGZyZWVfcGVzKSB7CisJCWxvZ19lcnJvcigiSW5zdWZmaWNpZW50IGZyZWUgc3BhY2U6ICUiIFBSSXUzMiAiIGV4dGVudHMgbmVlZGVkLCIKKwkJCSAgIiBidXQgb25seSAlIiBQUkl1MzIgIiBhdmFpbGFibGUiLAorCQkJICB0b3RhbF9leHRlbnRzX25lZWRlZCwgZnJlZV9wZXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRm9yIHN0cmlwZWQgbWlycm9ycywgYWxsIHRoZSBhcmVhcyBhcmUgY291bnRlZCwgdGhyb3VnaCB0aGUgbWlycm9yIGxheWVyICovCitzdGF0aWMgdWludDMyX3QgX3N0cmlwZXNfcGVyX21pbWFnZShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpsYXN0X2x2c2VnOworCisJaWYgKHNlZ19pc19taXJyb3JlZChzZWcpICYmIHNlZy0+YXJlYV9jb3VudCAmJiBzZWdfdHlwZShzZWcsIDApID09IEFSRUFfTFYpIHsKKwkJbGFzdF9sdnNlZyA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2xhc3QoJnNlZ19sdihzZWcsIDApLT5zZWdtZW50cyksIHN0cnVjdCBsdl9zZWdtZW50KTsKKwkJaWYgKHNlZ19pc19zdHJpcGVkKGxhc3RfbHZzZWcpKQorCQkJcmV0dXJuIGxhc3RfbHZzZWctPmFyZWFfY291bnQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9pbml0X2FsbG9jX3Bhcm1zKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLAorCQkJICAgICAgc3RydWN0IGFsbG9jX3Bhcm1zICphbGxvY19wYXJtcywKKwkJCSAgICAgIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkJICAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnByZXZfbHZzZWcsIHVuc2lnbmVkIGNhbl9zcGxpdCwKKwkJCSAgICAgIHVpbnQzMl90IGFsbG9jYXRlZCwgdWludDMyX3QgZXh0ZW50c19zdGlsbF9uZWVkZWQpCit7CisJYWxsb2NfcGFybXMtPmFsbG9jID0gYWxsb2M7CisJYWxsb2NfcGFybXMtPnByZXZfbHZzZWcgPSBwcmV2X2x2c2VnOworCWFsbG9jX3Bhcm1zLT5mbGFncyA9IDA7CisJYWxsb2NfcGFybXMtPmV4dGVudHNfc3RpbGxfbmVlZGVkID0gZXh0ZW50c19zdGlsbF9uZWVkZWQ7CisKKwkvKgorCSAqIE9ubHkgYXR0ZW1wdCBjb250aWd1b3VzL2NsaW5nIGFsbG9jYXRpb24gdG8gcHJldmlvdXMgc2VnbWVudAorCSAqIGFyZWFzIGlmIHRoZSBudW1iZXIgb2YgYXJlYXMgbWF0Y2hlcy4KKwkgKi8KKwlpZiAoYWxsb2NfcGFybXMtPnByZXZfbHZzZWcgJiYKKwkgICAgKChhaC0+YXJlYV9jb3VudCArIGFoLT5wYXJpdHlfY291bnQpID09IHByZXZfbHZzZWctPmFyZWFfY291bnQpKSB7CisJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0FSRUFfQ09VTlRfTUFUQ0hFUzsKKworCQkvKiBBcmUgdGhlcmUgYW55IHByZWNlZGluZyBzZWdtZW50cyB3ZSBtdXN0IGZvbGxvdyBvbiBmcm9tPyAqLworCQlpZiAoYWxsb2NfcGFybXMtPmFsbG9jID09IEFMTE9DX0NPTlRJR1VPVVMpIHsKKwkJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0NPTlRJR1VPVVNfVE9fTFZTRUc7CisJCQlhbGxvY19wYXJtcy0+ZmxhZ3MgfD0gQV9QT1NJVElPTkFMX0ZJTEw7CisJCX0gZWxzZSBpZiAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19DTElORykgfHwKKwkJCSAgIChhbGxvY19wYXJtcy0+YWxsb2MgPT0gQUxMT0NfQ0xJTkdfQllfVEFHUykpIHsKKwkJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0NMSU5HX1RPX0xWU0VHOworCQkJYWxsb2NfcGFybXMtPmZsYWdzIHw9IEFfUE9TSVRJT05BTF9GSUxMOworCQl9CisJfSBlbHNlCisJCS8qCisJCSAqIEEgY2xpbmcgYWxsb2NhdGlvbiB0aGF0IGZvbGxvd3MgYSBzdWNjZXNzZnVsIGNvbnRpZ3VvdXMKKwkJICogYWxsb2NhdGlvbiBtdXN0IHVzZSB0aGUgc2FtZSBQVnMgKG9yIGVsc2UgZmFpbCkuCisJCSAqLworCQlpZiAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19DTElORykgfHwKKwkJICAgIChhbGxvY19wYXJtcy0+YWxsb2MgPT0gQUxMT0NfQ0xJTkdfQllfVEFHUykpIHsKKwkJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0NMSU5HX1RPX0FMTE9DRUQ7CisJCQlhbGxvY19wYXJtcy0+ZmxhZ3MgfD0gQV9QT1NJVElPTkFMX0ZJTEw7CisJCX0KKworCWlmIChhbGxvY19wYXJtcy0+YWxsb2MgPT0gQUxMT0NfQ0xJTkdfQllfVEFHUykKKwkJYWxsb2NfcGFybXMtPmZsYWdzIHw9IEFfQ0xJTkdfQllfVEFHUzsKKworCWlmICghKGFsbG9jX3Bhcm1zLT5hbGxvYyAmIEFfUE9TSVRJT05BTF9GSUxMKSAmJgorCSAgICAoYWxsb2NfcGFybXMtPmFsbG9jID09IEFMTE9DX0NPTlRJR1VPVVMpICYmCisJICAgIGFoLT5jbGluZ190YWdfbGlzdF9jbikKKwkJYWxsb2NfcGFybXMtPmZsYWdzIHw9IEFfUEFSVElUSU9OX0JZX1RBR1M7CisKKwkvKgorCSAqIEZvciBub3JtYWwgYWxsb2NhdGlvbnMsIGlmIGFueSBleHRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGZvdW5kCisJICogZm9yIGFsbG9jYXRpb24sIHByZWZlciB0byBwbGFjZSBmdXJ0aGVyIGV4dGVudHMgb24gdGhlIHNhbWUgZGlza3MgYXMKKwkgKiBoYXZlIGFscmVhZHkgYmVlbiB1c2VkLgorCSAqLworCWlmIChhaC0+bWF4aW1pc2VfY2xpbmcgJiYKKwkgICAgKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19OT1JNQUwpICYmCisJICAgIChhbGxvY2F0ZWQgIT0gYWxsb2NfcGFybXMtPmV4dGVudHNfc3RpbGxfbmVlZGVkKSkKKwkJYWxsb2NfcGFybXMtPmZsYWdzIHw9IEFfQ0xJTkdfVE9fQUxMT0NFRDsKKworCWlmIChjYW5fc3BsaXQpCisJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0NBTl9TUExJVDsKK30KKworc3RhdGljIGludCBfbG9nX3BhcmFsbGVsX2FyZWFzKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9hcmVhcykKK3sKKwlzdHJ1Y3Qgc2VnX3B2cyAqc3B2czsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWNoYXIgKnB2bmFtZXM7CisKKwlpZiAoIXBhcmFsbGVsX2FyZWFzKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzcHZzLCBwYXJhbGxlbF9hcmVhcykgeworCQlpZiAoIWRtX3Bvb2xfYmVnaW5fb2JqZWN0KG1lbSwgMjU2KSkgeworCQkJbG9nX2Vycm9yKCJkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnNwdnMtPnB2cykgeworCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgcHZfZGV2X25hbWUocHZsLT5wdiksIHN0cmxlbihwdl9kZXZfbmFtZShwdmwtPnB2KSkpKSB7CisJCQkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQkJCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICIgIiwgMSkpIHsKKwkJCQlsb2dfZXJyb3IoImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIik7CisJCQkJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIlwwIiwgMSkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQiKTsKKwkJCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcHZuYW1lcyA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCQlsb2dfZGVidWdfYWxsb2MoIlBhcmFsbGVsIFBWcyBhdCBMRSAlIiBQUkl1MzIgIiBsZW5ndGggJSIgUFJJdTMyICI6ICVzIiwKKwkJCQlzcHZzLT5sZSwgc3B2cy0+bGVuLCBwdm5hbWVzKTsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgcHZuYW1lcyk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEhhbmRsZXMgYWxzbyBzdGFja2luZyAqLworc3RhdGljIGludCBfc2V0dXBfbHZfc2l6ZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBleHRlbnRzKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICp0aGluX3Bvb2xfc2VnOworCisJbHYtPmxlX2NvdW50ID0gZXh0ZW50czsKKwlsdi0+c2l6ZSA9ICh1aW50NjRfdCkgZXh0ZW50cyAqIGx2LT52Zy0+ZXh0ZW50X3NpemU7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sX2RhdGEobHYpKSB7CisJCWlmICghKHRoaW5fcG9vbF9zZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYobHYpKSkKKwkJCXJldHVybl8wOworCisJCS8qIFVwZGF0ZSB0aGluIHBvb2wgc2VnbWVudCBmcm9tIHRoZSBsYXllcmVkIExWICovCisJCXRoaW5fcG9vbF9zZWctPmx2LT5sZV9jb3VudCA9CisJCQl0aGluX3Bvb2xfc2VnLT5sZW4gPQorCQkJdGhpbl9wb29sX3NlZy0+YXJlYV9sZW4gPSBsdi0+bGVfY291bnQ7CisJCXRoaW5fcG9vbF9zZWctPmx2LT5zaXplID0gbHYtPnNpemU7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3NldHVwX2FsbG9jZWRfc2VnbWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50NjRfdCBzdGF0dXMsCisJCQkJICB1aW50MzJfdCBhcmVhX2NvdW50LAorCQkJCSAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCQkJCSAgc3RydWN0IGFsbG9jZWRfYXJlYSAqYWEsCisJCQkJICB1aW50MzJfdCByZWdpb25fc2l6ZSkKK3sKKwl1aW50MzJfdCBzLCBleHRlbnRzLCBhcmVhX211bHRpcGxlOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlhcmVhX211bHRpcGxlID0gX2NhbGNfYXJlYV9tdWx0aXBsZShzZWd0eXBlLCBhcmVhX2NvdW50LCAwKTsKKwlleHRlbnRzID0gYWFbMF0ubGVuICogYXJlYV9tdWx0aXBsZTsKKworCWlmICghKHNlZyA9IGFsbG9jX2x2X3NlZ21lbnQoc2VndHlwZSwgbHYsIGx2LT5sZV9jb3VudCwgZXh0ZW50cywKKwkJCQkgICAgIHN0YXR1cywgc3RyaXBlX3NpemUsIE5VTEwsCisJCQkJICAgICBhcmVhX2NvdW50LAorCQkJCSAgICAgYWFbMF0ubGVuLCAwdSwgcmVnaW9uX3NpemUsIDB1LCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgTFYgc2VnbWVudC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChzID0gMDsgcyA8IGFyZWFfY291bnQ7IHMrKykKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX3B2KHNlZywgcywgYWFbc10ucHYsIGFhW3NdLnBlKSkKKwkJCXJldHVybl8wOworCisJZG1fbGlzdF9hZGQoJmx2LT5zZWdtZW50cywgJnNlZy0+bGlzdCk7CisKKwlleHRlbnRzID0gYWFbMF0ubGVuICogYXJlYV9tdWx0aXBsZTsKKworCWlmICghX3NldHVwX2x2X3NpemUobHYsIGx2LT5sZV9jb3VudCArIGV4dGVudHMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zZXR1cF9hbGxvY2VkX3NlZ21lbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jZWRfYXJlYXMsCisJCQkJICAgdWludDMyX3QgYXJlYV9jb3VudCwKKwkJCQkgICB1aW50NjRfdCBzdGF0dXMsCisJCQkJICAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJCQkgICB1aW50MzJfdCByZWdpb25fc2l6ZSkKK3sKKwlzdHJ1Y3QgYWxsb2NlZF9hcmVhICphYTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhhYSwgJmFsbG9jZWRfYXJlYXNbMF0pIHsKKwkJaWYgKCFfc2V0dXBfYWxsb2NlZF9zZWdtZW50KGx2LCBzdGF0dXMsIGFyZWFfY291bnQsCisJCQkJCSAgICBzdHJpcGVfc2l6ZSwgc2VndHlwZSwgYWEsCisJCQkJCSAgICByZWdpb25fc2l6ZSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaXN0IG9mIHB2X2FyZWFzIGFuZCBhZGRzIHRoZW0gdG8gYWxsb2NhdGVkX2FyZWFzLgorICogSWYgdGhlIGNvbXBsZXRlIGFyZWEgaXMgbm90IG5lZWRlZCB0aGVuIGl0IGdldHMgc3BsaXQuCisgKiBUaGUgcGFydCB1c2VkIGlzIHJlbW92ZWQgZnJvbSB0aGUgcHZfbWFwIHNvIGl0IGNhbid0IGJlIGFsbG9jYXRlZCB0d2ljZS4KKyAqLworc3RhdGljIGludCBfYWxsb2NfcGFyYWxsZWxfYXJlYShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwgdWludDMyX3QgbWF4X3RvX2FsbG9jYXRlLAorCQkJCXN0cnVjdCBhbGxvY19zdGF0ZSAqYWxsb2Nfc3RhdGUsIHVpbnQzMl90IGl4X2xvZ19vZmZzZXQpCit7CisJdWludDMyX3QgYXJlYV9sZW4sIGxlbjsKKwl1aW50MzJfdCBzLCBzbWV0YTsKKwl1aW50MzJfdCBpeF9sb2dfc2tpcCA9IDA7IC8qIEhvdyBtYW55IGFyZWFzIHRvIHNraXAgaW4gbWlkZGxlIG9mIGFycmF5IHRvIHJlYWNoIGxvZyBhcmVhcyAqLworCXVpbnQzMl90IHRvdGFsX2FyZWFfY291bnQ7CisJc3RydWN0IGFsbG9jZWRfYXJlYSAqYWE7CisJc3RydWN0IHB2X2FyZWEgKnB2YTsKKworCXRvdGFsX2FyZWFfY291bnQgPSBhaC0+YXJlYV9jb3VudCArIGFoLT5wYXJpdHlfY291bnQgKyBhbGxvY19zdGF0ZS0+bG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkOworCWlmICghdG90YWxfYXJlYV9jb3VudCkgeworCQlsb2dfd2FybihJTlRFUk5BTF9FUlJPUiAiX2FsbG9jX3BhcmFsbGVsX2FyZWEgY2FsbGVkIHdpdGhvdXQgYW55IGFsbG9jYXRpb24gdG8gZG8uIik7CisJCXJldHVybiAxOworCX0KKworCWFyZWFfbGVuID0gbWF4X3RvX2FsbG9jYXRlIC8gYWgtPmFyZWFfbXVsdGlwbGU7CisKKwkvKiBSZWR1Y2UgYXJlYV9sZW4gdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSBhcmVhcyAqLworCWZvciAocyA9IDA7IHMgPCBhaC0+YXJlYV9jb3VudCArIGFoLT5wYXJpdHlfY291bnQ7IHMrKykKKwkJaWYgKGFyZWFfbGVuID4gYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnVzZWQpCisJCQlhcmVhX2xlbiA9IGFsbG9jX3N0YXRlLT5hcmVhc1tzXS51c2VkOworCisJbGVuID0gKGFoLT5hbGxvY19hbmRfc3BsaXRfbWV0YSAmJiAhYWgtPnNwbGl0X21ldGFkYXRhX2lzX2FsbG9jYXRlZCkgPyB0b3RhbF9hcmVhX2NvdW50ICogMiA6IHRvdGFsX2FyZWFfY291bnQ7CisJbGVuICo9IHNpemVvZigqYWEpOworCWlmICghKGFhID0gZG1fcG9vbF9hbGxvYyhhaC0+bWVtLCBsZW4pKSkgeworCQlsb2dfZXJyb3IoImFsbG9jZWRfYXJlYSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFyZWFzIGNvbnNpc3RzIG9mIGFyZWFfY291bnQgYXJlYXMgZm9yIGRhdGEgc3RyaXBlcywgdGhlbgorCSAqIGl4X2xvZ19za2lwIGFyZWFzIHRvIHNraXAsIHRoZW4gbG9nX2FyZWFfY291bnQgYXJlYXMgdG8gdXNlIGZvciB0aGUKKwkgKiBsb2csIHRoZW4gc29tZSBhcmVhcyB0b28gc21hbGwgZm9yIHRoZSBsb2cuCisJICovCisJbGVuID0gYXJlYV9sZW47CisJZm9yIChzID0gMDsgcyA8IHRvdGFsX2FyZWFfY291bnQ7IHMrKykgeworCQlpZiAocyA9PSAoYWgtPmFyZWFfY291bnQgKyBhaC0+cGFyaXR5X2NvdW50KSkgeworCQkJaXhfbG9nX3NraXAgPSBpeF9sb2dfb2Zmc2V0IC0gYWgtPmFyZWFfY291bnQ7CisJCQlsZW4gPSBhaC0+bG9nX2xlbjsKKwkJfQorCisJCXB2YSA9IGFsbG9jX3N0YXRlLT5hcmVhc1tzICsgaXhfbG9nX3NraXBdLnB2YTsKKwkJaWYgKGFoLT5hbGxvY19hbmRfc3BsaXRfbWV0YSAmJiAhYWgtPnNwbGl0X21ldGFkYXRhX2lzX2FsbG9jYXRlZCkgeworCQkJLyoKKwkJCSAqIFRoZSBtZXRhZGF0YSBhcmVhIGdvZXMgYXQgdGhlIGZyb250IG9mIHRoZSBhbGxvY2F0ZWQKKwkJCSAqIHNwYWNlIGZvciBub3csIGJ1dCBjb3VsZCBlYXNpbHkgZ28gYXQgdGhlIGVuZCAob3IKKwkJCSAqIG1pZGRsZSEpLgorCQkJICoKKwkJCSAqIEV2ZW4gdGhvdWdoIHdlIHNwbGl0IHRoZXNlIHR3byBmcm9tIHRoZSBzYW1lCisJCQkgKiBhbGxvY2F0aW9uLCB3ZSBzdG9yZSB0aGUgaW1hZ2VzIGF0IHRoZSBiZWdpbm5pbmcKKwkJCSAqIG9mIHRoZSBhcmVhcyBhcnJheSBhbmQgdGhlIG1ldGFkYXRhIGF0IHRoZSBlbmQuCisJCQkgKi8KKwkJCXNtZXRhID0gcyArIGFoLT5hcmVhX2NvdW50ICsgYWgtPnBhcml0eV9jb3VudDsKKwkJCWFhW3NtZXRhXS5wdiA9IHB2YS0+bWFwLT5wdjsKKwkJCWFhW3NtZXRhXS5wZSA9IHB2YS0+c3RhcnQ7CisJCQlhYVtzbWV0YV0ubGVuID0gYWgtPmxvZ19sZW47CisKKwkJCWxvZ19kZWJ1Z19hbGxvYygiQWxsb2NhdGluZyBwYXJhbGxlbCBtZXRhZGF0YSBhcmVhICUiIFBSSXUzMgorCQkJCQkiIG9uICVzIHN0YXJ0IFBFICUiIFBSSXUzMgorCQkJCQkiIGxlbmd0aCAlIiBQUkl1MzIgIi4iLAorCQkJCQkoc21ldGEgLSAoYWgtPmFyZWFfY291bnQgKyBhaC0+cGFyaXR5X2NvdW50KSksCisJCQkJCXB2X2Rldl9uYW1lKGFhW3NtZXRhXS5wdiksIGFhW3NtZXRhXS5wZSwKKwkJCQkJYWgtPmxvZ19sZW4pOworCisJCQljb25zdW1lX3B2X2FyZWEocHZhLCBhaC0+bG9nX2xlbik7CisJCQlkbV9saXN0X2FkZCgmYWgtPmFsbG9jZWRfYXJlYXNbc21ldGFdLCAmYWFbc21ldGFdLmxpc3QpOworCQl9CisJCWFhW3NdLmxlbiA9IChhaC0+YWxsb2NfYW5kX3NwbGl0X21ldGEgJiYgIWFoLT5zcGxpdF9tZXRhZGF0YV9pc19hbGxvY2F0ZWQpID8gbGVuIC0gYWgtPmxvZ19sZW4gOiBsZW47CisJCS8qIFNraXAgZW1wdHkgYWxsb2NhdGlvbnMgKi8KKwkJaWYgKCFhYVtzXS5sZW4pCisJCQljb250aW51ZTsKKworCQlhYVtzXS5wdiA9IHB2YS0+bWFwLT5wdjsKKwkJYWFbc10ucGUgPSBwdmEtPnN0YXJ0OworCisJCWxvZ19kZWJ1Z19hbGxvYygiQWxsb2NhdGluZyBwYXJhbGxlbCBhcmVhICUiIFBSSXUzMgorCQkJCSIgb24gJXMgc3RhcnQgUEUgJSIgUFJJdTMyICIgbGVuZ3RoICUiIFBSSXUzMiAiLiIsCisJCQkJcywgcHZfZGV2X25hbWUoYWFbc10ucHYpLCBhYVtzXS5wZSwgYWFbc10ubGVuKTsKKworCQljb25zdW1lX3B2X2FyZWEocHZhLCBhYVtzXS5sZW4pOworCisJCWRtX2xpc3RfYWRkKCZhaC0+YWxsb2NlZF9hcmVhc1tzXSwgJmFhW3NdLmxpc3QpOworCX0KKworCS8qIE9ubHkgbmVlZCB0byBhbGxvYyBtZXRhZGF0YSBmcm9tIHRoZSBmaXJzdCBiYXRjaCAqLworCWlmIChhaC0+YWxsb2NfYW5kX3NwbGl0X21ldGEpCisJCWFoLT5zcGxpdF9tZXRhZGF0YV9pc19hbGxvY2F0ZWQgPSAxOworCisJYWgtPnRvdGFsX2FyZWFfbGVuICs9IGFyZWFfbGVuOworCisJYWxsb2Nfc3RhdGUtPmFsbG9jYXRlZCArPSBhcmVhX2xlbiAqIGFoLT5hcmVhX211bHRpcGxlOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYWxsIGZuIGZvciBlYWNoIEFSRUFfUFYgdXNlZCBieSB0aGUgTFYgc2VnbWVudCBhdCBsdjpsZSBvZiBsZW5ndGggKm1heF9zZWdfbGVuLgorICogSWYgYW55IGNvbnN0aXR1ZW50IGFyZWEgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBzZWdtZW50LCBtYXhfc2VnX2xlbiBpcworICogcmVkdWNlZCB0byBjb3ZlciBvbmx5IHRoZSBmaXJzdC4KKyAqIGZuIHNob3VsZCByZXR1cm4gMCBvbiBlcnJvciwgMSB0byBjb250aW51ZSBzY2FubmluZyBvciA+MSB0byB0ZXJtaW5hdGUgd2l0aG91dCBlcnJvci4KKyAqIEluIHRoZSBsYXN0IGNhc2UsIHRoaXMgZnVuY3Rpb24gcGFzc2VzIG9uIHRoZSByZXR1cm4gY29kZS4KKyAqIEZJWE1FIEkgdGhpbmsgc29tZSBjYWxsZXJzIGFyZSBleHBlY3RpbmcgdGhpcyB0byBjaGVjayBhbGwgUFYgc2VnbWVudHMgdXNlZCBieSBhbiBMVi4KKyAqLworc3RhdGljIGludCBfZm9yX2VhY2hfcHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQl1aW50MzJfdCBsZSwgdWludDMyX3QgbGVuLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJdWludDMyX3QgKm1heF9zZWdfbGVuLAorCQkJdWludDMyX3QgZmlyc3RfYXJlYSwgdWludDMyX3QgbWF4X2FyZWFzLAorCQkJaW50IHRvcF9sZXZlbF9hcmVhX2luZGV4LAorCQkJaW50IG9ubHlfc2luZ2xlX2FyZWFfc2VnbWVudHMsCisJCQlpbnQgKCpmbikoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3QgcHZfc2VnbWVudCAqcGVnLCB1aW50MzJfdCBzLAorCQkJCSAgdm9pZCAqZGF0YSksCisJCQl2b2lkICpkYXRhKQoreworCXVpbnQzMl90IHM7CisJdWludDMyX3QgcmVtYWluaW5nX3NlZ19sZW4sIGFyZWFfbGVuLCBhcmVhX211bHRpcGxlOworCXVpbnQzMl90IHN0cmlwZXNfcGVyX21pbWFnZSA9IDE7CisJaW50IHIgPSAxOworCisJaWYgKCFzZWcgJiYgIShzZWcgPSBmaW5kX3NlZ19ieV9sZShsdiwgbGUpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNlZ21lbnQgZm9yICVzIGV4dGVudCAlIiBQUkl1MzIsCisJCQkgIGx2LT5uYW1lLCBsZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFJlbWFpbmluZyBsb2dpY2FsIGxlbmd0aCBvZiBzZWdtZW50ICovCisJcmVtYWluaW5nX3NlZ19sZW4gPSBzZWctPmxlbiAtIChsZSAtIHNlZy0+bGUpOworCisJaWYgKHJlbWFpbmluZ19zZWdfbGVuID4gbGVuKQorCQlyZW1haW5pbmdfc2VnX2xlbiA9IGxlbjsKKworCWlmIChtYXhfc2VnX2xlbiAmJiAqbWF4X3NlZ19sZW4gPiByZW1haW5pbmdfc2VnX2xlbikKKwkJKm1heF9zZWdfbGVuID0gcmVtYWluaW5nX3NlZ19sZW47CisKKwlhcmVhX211bHRpcGxlID0gX2NhbGNfYXJlYV9tdWx0aXBsZShzZWctPnNlZ3R5cGUsIHNlZy0+YXJlYV9jb3VudCwgMCk7CisJYXJlYV9sZW4gPSAocmVtYWluaW5nX3NlZ19sZW4gLyBhcmVhX211bHRpcGxlKSA/IDogMTsKKworCS8qIEZvciBzdHJpcGVkIG1pcnJvcnMsIGFsbCB0aGUgYXJlYXMgYXJlIGNvdW50ZWQsIHRocm91Z2ggdGhlIG1pcnJvciBsYXllciAqLworCWlmICh0b3BfbGV2ZWxfYXJlYV9pbmRleCA9PSAtMSkKKwkJc3RyaXBlc19wZXJfbWltYWdlID0gX3N0cmlwZXNfcGVyX21pbWFnZShzZWcpOworCisJZm9yIChzID0gZmlyc3RfYXJlYTsKKwkgICAgIHMgPCBzZWctPmFyZWFfY291bnQgJiYgKCFtYXhfYXJlYXMgfHwgcyA8PSBtYXhfYXJlYXMpOworCSAgICAgcysrKSB7CisJCWlmIChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfTFYpIHsKKwkJCWlmICghKHIgPSBfZm9yX2VhY2hfcHYoY21kLCBzZWdfbHYoc2VnLCBzKSwKKwkJCQkJICAgICAgIHNlZ19sZShzZWcsIHMpICsKKwkJCQkJICAgICAgIChsZSAtIHNlZy0+bGUpIC8gYXJlYV9tdWx0aXBsZSwKKwkJCQkJICAgICAgIGFyZWFfbGVuLCBOVUxMLCBtYXhfc2VnX2xlbiwgMCwKKwkJCQkJICAgICAgIChzdHJpcGVzX3Blcl9taW1hZ2UgPT0gMSkgJiYgb25seV9zaW5nbGVfYXJlYV9zZWdtZW50cyA/IDFVIDogMFUsCisJCQkJCSAgICAgICAodG9wX2xldmVsX2FyZWFfaW5kZXggIT0gLTEpID8gdG9wX2xldmVsX2FyZWFfaW5kZXggOiAoaW50KSAocyAqIHN0cmlwZXNfcGVyX21pbWFnZSksCisJCQkJCSAgICAgICBvbmx5X3NpbmdsZV9hcmVhX3NlZ21lbnRzLCBmbiwKKwkJCQkJICAgICAgIGRhdGEpKSkKKwkJCQlzdGFjazsKKwkJfSBlbHNlIGlmIChzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfUFYpCisJCQlpZiAoIShyID0gZm4oY21kLCBzZWdfcHZzZWcoc2VnLCBzKSwgdG9wX2xldmVsX2FyZWFfaW5kZXggIT0gLTEgPyAodWludDMyX3QpIHRvcF9sZXZlbF9hcmVhX2luZGV4ICsgcyA6IHMsIGRhdGEpKSkKKwkJCQlzdGFjazsKKwkJaWYgKHIgIT0gMSkKKwkJCXJldHVybiByOworCX0KKworCS8qIEZJWE1FIG9ubHlfc2luZ2xlX2FyZWFfc2VnbWVudHMgdXNlZCBhcyB3b3JrYXJvdW5kIHRvIHNraXAgbG9nIExWIC0gbmVlZHMgbmV3IHBhcmFtPyAqLworCWlmICghb25seV9zaW5nbGVfYXJlYV9zZWdtZW50cyAmJiBzZWdfaXNfbWlycm9yZWQoc2VnKSAmJiBzZWctPmxvZ19sdikgeworCQlpZiAoIShyID0gX2Zvcl9lYWNoX3B2KGNtZCwgc2VnLT5sb2dfbHYsIDAsIHNlZy0+bG9nX2x2LT5sZV9jb3VudCwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCwgMCwgMCwgMCwgb25seV9zaW5nbGVfYXJlYV9zZWdtZW50cywKKwkJCQkgICAgICAgZm4sIGRhdGEpKSkKKwkJCXN0YWNrOworCQlpZiAociAhPSAxKQorCQkJcmV0dXJuIHI7CisJfQorCisJLyogRklYTUUgQWRkIHNuYXBzaG90IGNvdywgdGhpbiBtZXRhIGV0Yy4gKi8KKworLyoKKwlpZiAoIW9ubHlfc2luZ2xlX2FyZWFfc2VnbWVudHMgJiYgIW1heF9hcmVhcyAmJiBzZWdfaXNfcmFpZChzZWcpKSB7CisJCWZvciAocyA9IGZpcnN0X2FyZWE7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ19tZXRhbHYoc2VnLCBzKSkKKwkJCQlpZiAoIShyID0gX2Zvcl9lYWNoX3B2KGNtZCwgc2VnX21ldGFsdihzZWcsIHMpLCAwLCBzZWdfbWV0YWx2KHNlZywgcyktPmxlX2NvdW50LCBOVUxMLAorCQkJCQkJICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIGZuLCBkYXRhKSkpCisJCQkJCXN0YWNrOworCQkJaWYgKHIgIT0gMSkKKwkJCQlyZXR1cm4gcjsKKwkJfQorCX0KKyovCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29tcF9hcmVhKGNvbnN0IHZvaWQgKmwsIGNvbnN0IHZvaWQgKnIpCit7CisJY29uc3Qgc3RydWN0IHB2X2FyZWFfdXNlZCAqbGhzID0gKGNvbnN0IHN0cnVjdCBwdl9hcmVhX3VzZWQgKikgbDsKKwljb25zdCBzdHJ1Y3QgcHZfYXJlYV91c2VkICpyaHMgPSAoY29uc3Qgc3RydWN0IHB2X2FyZWFfdXNlZCAqKSByOworCisJaWYgKGxocy0+dXNlZCA8IHJocy0+dXNlZCkKKwkJcmV0dXJuIDE7CisKKwllbHNlIGlmIChsaHMtPnVzZWQgPiByaHMtPnVzZWQpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2VhcmNoIGZvciBwdnNlZyB0aGF0IG1hdGNoZXMgY29uZGl0aW9uCisgKi8KK3N0cnVjdCBwdl9tYXRjaCB7CisJaW50ICgqY29uZGl0aW9uKShzdHJ1Y3QgcHZfbWF0Y2ggKnB2bWF0Y2gsIHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZywgc3RydWN0IHB2X2FyZWEgKnB2YSk7CisKKwlzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaDsKKwlzdHJ1Y3QgYWxsb2Nfc3RhdGUgKmFsbG9jX3N0YXRlOworCXN0cnVjdCBwdl9hcmVhICpwdmE7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbGluZ190YWdfbGlzdF9jbjsKKwlpbnQgczsJLyogQXJlYSBpbmRleCBvZiBtYXRjaCAqLworfTsKKworLyoKKyAqIElzIFBWIGFyZWEgb24gdGhlIHNhbWUgUFY/CisgKi8KK3N0YXRpYyBpbnQgX2lzX3NhbWVfcHYoc3RydWN0IHB2X21hdGNoICpwdm1hdGNoIF9fYXR0cmlidXRlKCh1bnVzZWQpKSwgc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLCBzdHJ1Y3QgcHZfYXJlYSAqcHZhKQoreworCWlmIChwdnNlZy0+cHYgIT0gcHZhLT5tYXAtPnB2KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogRG9lcyBQViBhcmVhIGhhdmUgYSB0YWcgbGlzdGVkIGluIGFsbG9jYXRpb24vY2xpbmdfdGFnX2xpc3QgdGhhdAorICogbWF0Y2hlcyBFSVRIRVIgYSB0YWcgb2YgdGhlIFBWIG9mIHRoZSBleGlzdGluZyBzZWdtZW50IE9SIGEgdGFnIGluIHB2X3RhZ3M/CisgKiBJZiB0YWdzX2xpc3Rfc3RyIGlzIHNldCwgdGhlbiBpbnN0ZWFkIHdlIGdlbmVyYXRlIGEgbGlzdCBvZiBtYXRjaGluZyB0YWdzIGZvciBwcmludGluZy4KKyAqLworc3RhdGljIGludCBfbWF0Y2hfcHZfdGFncyhjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNsaW5nX3RhZ19saXN0X2NuLAorCQkJICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjEsIHVpbnQzMl90IHB2MV9zdGFydF9wZSwgdWludDMyX3QgYXJlYV9udW0sCisJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2Miwgc3RydWN0IGRtX2xpc3QgKnB2X3RhZ3MsIHVuc2lnbmVkIHZhbGlkYXRlX29ubHksCisJCQkgIHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKip0YWdzX2xpc3Rfc3RyKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCWNvbnN0IGNoYXIgKnN0cjsKKwljb25zdCBjaGFyICp0YWdfbWF0Y2hlZDsKKwlzdHJ1Y3QgZG1fbGlzdCAqdGFnc190b19tYXRjaCA9IHRhZ3NfbGlzdF9zdHIgPyBOVUxMIDogcHZfdGFncyA/IDogJnB2Mi0+dGFnczsKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCXVuc2lnbmVkIGZpcnN0X3RhZyA9IDE7CisKKwlpZiAodGFnc19saXN0X3N0ciAmJiAhZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAyNTYpKSB7CisJCWxvZ19lcnJvcigiUFYgdGFncyBzdHJpbmcgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChjdiA9IGNsaW5nX3RhZ19saXN0X2NuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJaWYgKHZhbGlkYXRlX29ubHkpCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlIGVudHJ5ICIKKwkJCQkJICJhbGxvY2F0aW9uL2NsaW5nX3RhZ19saXN0Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlzdHIgPSBjdi0+di5zdHI7CisJCWlmICghKnN0cikgeworCQkJaWYgKHZhbGlkYXRlX29ubHkpCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGVtcHR5IHN0cmluZyBpbiBjb25maWcgZmlsZSBlbnRyeSAiCisJCQkJCSAiYWxsb2NhdGlvbi9jbGluZ190YWdfbGlzdCIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKnN0ciAhPSAnQCcpIHsKKwkJCWlmICh2YWxpZGF0ZV9vbmx5KQorCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBzdHJpbmcgbm90IHN0YXJ0aW5nIHdpdGggQCBpbiBjb25maWcgZmlsZSBlbnRyeSAiCisJCQkJCSAiYWxsb2NhdGlvbi9jbGluZ190YWdfbGlzdDogJXMiLCBzdHIpOworCQkJY29udGludWU7CisJCX0KKworCQlzdHIrKzsKKworCQlpZiAoISpzdHIpIHsKKwkJCWlmICh2YWxpZGF0ZV9vbmx5KQorCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBlbXB0eSB0YWcgaW4gY29uZmlnIGZpbGUgZW50cnkgIgorCQkJCQkgImFsbG9jYXRpb24vY2xpbmdfdGFnX2xpc3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZhbGlkYXRlX29ubHkpCisJCQljb250aW51ZTsKKworCQkvKiBXaWxkY2FyZCBtYXRjaGVzIGFueSB0YWcgYWdhaW5zdCBhbnkgdGFnLiAqLworCQlpZiAoIXN0cmNtcChzdHIsICIqIikpIHsKKwkJCWlmICh0YWdzX2xpc3Rfc3RyKSB7CisJCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmcHYxLT50YWdzKSB7CisJCQkJCWlmICghZmlyc3RfdGFnICYmICFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIiwiLCAwKSkgeworCQkJCQkJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCQkJCQkJbG9nX2Vycm9yKCJQViB0YWdzIHN0cmluZyBleHRlbnNpb24gZmFpbGVkLiIpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJZmlyc3RfdGFnID0gMDsKKwkJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgc2wtPnN0ciwgMCkpIHsKKwkJCQkJCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwkJCQkJCWxvZ19lcnJvcigiUFYgdGFncyBzdHJpbmcgZXh0ZW5zaW9uIGZhaWxlZC4iKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJfbGlzdF9tYXRjaF9saXN0KCZwdjEtPnRhZ3MsIHRhZ3NfdG9fbWF0Y2gsICZ0YWdfbWF0Y2hlZCkpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlpZiAoIXB2X3RhZ3MpCisJCQkJCWxvZ19kZWJ1Z19hbGxvYygiTWF0Y2hlZCBhbGxvY2F0aW9uIFBWIHRhZyAlcyBvbiBleGlzdGluZyAlcyB3aXRoIGZyZWUgc3BhY2Ugb24gJXMuIiwKKwkJCQkJCQl0YWdfbWF0Y2hlZCwgcHZfZGV2X25hbWUocHYxKSwgcHYyID8gcHZfZGV2X25hbWUocHYyKSA6ICItIik7CisJCQkJZWxzZQorCQkJCQlsb2dfZGVidWdfYWxsb2MoIkVsaW1pbmF0aW5nIGFsbG9jYXRpb24gYXJlYSAlIiBQUkl1MzIgIiBhdCBQViAlcyBzdGFydCBQRSAlIiBQUkl1MzIKKwkJCQkJCQkiIGZyb20gY29uc2lkZXJhdGlvbjogUFYgdGFnICVzIGFscmVhZHkgdXNlZC4iLAorCQkJCQkJCWFyZWFfbnVtLCBwdl9kZXZfbmFtZShwdjEpLCBwdjFfc3RhcnRfcGUsIHRhZ19tYXRjaGVkKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCWlmICghc3RyX2xpc3RfbWF0Y2hfaXRlbSgmcHYxLT50YWdzLCBzdHIpIHx8CisJCSAgICAodGFnc190b19tYXRjaCAmJiAhc3RyX2xpc3RfbWF0Y2hfaXRlbSh0YWdzX3RvX21hdGNoLCBzdHIpKSkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCWlmICh0YWdzX2xpc3Rfc3RyKSB7CisJCQkJaWYgKCFmaXJzdF90YWcgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiLCIsIDApKSB7CisJCQkJCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwkJCQkJbG9nX2Vycm9yKCJQViB0YWdzIHN0cmluZyBleHRlbnNpb24gZmFpbGVkLiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZmlyc3RfdGFnID0gMDsKKwkJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBzdHIsIDApKSB7CisJCQkJCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwkJCQkJbG9nX2Vycm9yKCJQViB0YWdzIHN0cmluZyBleHRlbnNpb24gZmFpbGVkLiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB2X3RhZ3MpCisJCQkJbG9nX2RlYnVnX2FsbG9jKCJNYXRjaGVkIGFsbG9jYXRpb24gUFYgdGFnICVzIG9uIGV4aXN0aW5nICVzIHdpdGggZnJlZSBzcGFjZSBvbiAlcy4iLAorCQkJCQkJc3RyLCBwdl9kZXZfbmFtZShwdjEpLCBwdjIgPyBwdl9kZXZfbmFtZShwdjIpIDogIi0iKTsKKwkJCWVsc2UKKwkJCQlsb2dfZGVidWdfYWxsb2MoIkVsaW1pbmF0aW5nIGFsbG9jYXRpb24gYXJlYSAlIiBQUkl1MzIgIiBhdCBQViAlcyBzdGFydCBQRSAlIiBQUkl1MzIKKwkJCQkJCSIgZnJvbSBjb25zaWRlcmF0aW9uOiBQViB0YWcgJXMgYWxyZWFkeSB1c2VkLiIsCisJCQkJCQlhcmVhX251bSwgcHZfZGV2X25hbWUocHYxKSwgcHYxX3N0YXJ0X3BlLCBzdHIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAodGFnc19saXN0X3N0cikgeworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSkgeworCQkJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCQkJbG9nX2Vycm9yKCJQViB0YWdzIHN0cmluZyBleHRlbnNpb24gZmFpbGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKnRhZ3NfbGlzdF9zdHIgPSBkbV9wb29sX2VuZF9vYmplY3QobWVtKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3ZhbGlkYXRlX3RhZ19saXN0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY2xpbmdfdGFnX2xpc3RfY24pCit7CisJcmV0dXJuIF9tYXRjaF9wdl90YWdzKGNsaW5nX3RhZ19saXN0X2NuLCBOVUxMLCAwLCAwLCBOVUxMLCBOVUxMLCAxLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl90YWdzX2xpc3Rfc3RyKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjEpCit7CisJY29uc3QgY2hhciAqdGFnc19saXN0X3N0cjsKKworCWlmICghX21hdGNoX3B2X3RhZ3MoYWgtPmNsaW5nX3RhZ19saXN0X2NuLCBwdjEsIDAsIDAsIE5VTEwsIE5VTEwsIDAsIGFoLT5tZW0sICZ0YWdzX2xpc3Rfc3RyKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gdGFnc19saXN0X3N0cjsKK30KKworLyoKKyAqIERvZXMgUFYgYXJlYSBoYXZlIGEgdGFnIGxpc3RlZCBpbiBhbGxvY2F0aW9uL2NsaW5nX3RhZ19saXN0IHRoYXQKKyAqIG1hdGNoZXMgYSB0YWcgaW4gdGhlIHB2X3RhZ3MgbGlzdD8KKyAqLworc3RhdGljIGludCBfcHZfaGFzX21hdGNoaW5nX3RhZyhjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNsaW5nX3RhZ19saXN0X2NuLAorCQkJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2MSwgdWludDMyX3QgcHYxX3N0YXJ0X3BlLCB1aW50MzJfdCBhcmVhX251bSwKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqcHZfdGFncykKK3sKKwlyZXR1cm4gX21hdGNoX3B2X3RhZ3MoY2xpbmdfdGFnX2xpc3RfY24sIHB2MSwgcHYxX3N0YXJ0X3BlLCBhcmVhX251bSwgTlVMTCwgcHZfdGFncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBEb2VzIFBWIGFyZWEgaGF2ZSBhIHRhZyBsaXN0ZWQgaW4gYWxsb2NhdGlvbi9jbGluZ190YWdfbGlzdCB0aGF0CisgKiBtYXRjaGVzIGEgdGFnIG9mIHRoZSBQViBvZiB0aGUgZXhpc3Rpbmcgc2VnbWVudD8KKyAqLworc3RhdGljIGludCBfcHZzX2hhdmVfbWF0Y2hpbmdfdGFnKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY2xpbmdfdGFnX2xpc3RfY24sCisJCQkJICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjEsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2MikKK3sKKwlyZXR1cm4gX21hdGNoX3B2X3RhZ3MoY2xpbmdfdGFnX2xpc3RfY24sIHB2MSwgMCwgMCwgcHYyLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfaGFzX21hdGNoaW5nX3B2X3RhZyhzdHJ1Y3QgcHZfbWF0Y2ggKnB2bWF0Y2gsIHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZywgc3RydWN0IHB2X2FyZWEgKnB2YSkKK3sKKwlyZXR1cm4gX3B2c19oYXZlX21hdGNoaW5nX3RhZyhwdm1hdGNoLT5jbGluZ190YWdfbGlzdF9jbiwgcHZzZWctPnB2LCBwdmEtPm1hcC0+cHYpOworfQorCisvKgorICogSXMgUFYgYXJlYSBjb250aWd1b3VzIHRvIFBWIHNlZ21lbnQ/CisgKi8KK3N0YXRpYyBpbnQgX2lzX2NvbnRpZ3VvdXMoc3RydWN0IHB2X21hdGNoICpwdm1hdGNoIF9fYXR0cmlidXRlKCh1bnVzZWQpKSwgc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLCBzdHJ1Y3QgcHZfYXJlYSAqcHZhKQoreworCWlmIChwdnNlZy0+cHYgIT0gcHZhLT5tYXAtPnB2KQorCQlyZXR1cm4gMDsKKworCWlmIChwdnNlZy0+cGUgKyBwdnNlZy0+bGVuICE9IHB2YS0+c3RhcnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9yZXNlcnZlX2FyZWEoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHN0cnVjdCBhbGxvY19zdGF0ZSAqYWxsb2Nfc3RhdGUsIHN0cnVjdCBwdl9hcmVhICpwdmEsCisJCQkgIHVpbnQzMl90IHJlcXVpcmVkLCB1aW50MzJfdCBpeF9wdmEsIHVpbnQzMl90IHVucmVzZXJ2ZWQpCit7CisJc3RydWN0IHB2X2FyZWFfdXNlZCAqYXJlYV91c2VkID0gJmFsbG9jX3N0YXRlLT5hcmVhc1tpeF9wdmFdOworCWNvbnN0IGNoYXIgKnB2X3RhZ19saXN0ID0gTlVMTDsKKworCWlmIChhaC0+Y2xpbmdfdGFnX2xpc3RfY24pCisJCXB2X3RhZ19saXN0ID0gX3RhZ3NfbGlzdF9zdHIoYWgsIHB2YS0+bWFwLT5wdik7CisKKwlsb2dfZGVidWdfYWxsb2MoIiVzIGFsbG9jYXRpb24gYXJlYSAlIiBQUkl1MzIgIiAlcyAlcyBzdGFydCBQRSAlIiBQUkl1MzIKKwkJCSIgbGVuZ3RoICUiIFBSSXUzMiAiIGxlYXZpbmcgJSIgUFJJdTMyICIlcyVzLiIsCisJCQlhcmVhX3VzZWQtPnB2YSA/ICJDaGFuZ2luZyAgICIgOiAiQ29uc2lkZXJpbmciLAorCQkJaXhfcHZhLCBhcmVhX3VzZWQtPnB2YSA/ICJ0byIgOiAiYXMiLAorCQkJZGV2X25hbWUocHZhLT5tYXAtPnB2LT5kZXYpLCBwdmEtPnN0YXJ0LCByZXF1aXJlZCwgdW5yZXNlcnZlZCwKKwkJCXB2X3RhZ19saXN0ID8gIiB3aXRoIFBWIHRhZ3M6ICIgOiAiIiwKKwkJCXB2X3RhZ19saXN0ID8gOiAiIik7CisKKwlpZiAocHZfdGFnX2xpc3QpCisJCWRtX3Bvb2xfZnJlZShhaC0+bWVtLCAodm9pZCAqKXB2X3RhZ19saXN0KTsKKworCWFyZWFfdXNlZC0+cHZhID0gcHZhOworCWFyZWFfdXNlZC0+dXNlZCA9IHJlcXVpcmVkOworfQorCitzdGF0aWMgaW50IF9yZXNlcnZlX3JlcXVpcmVkX2FyZWEoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHN0cnVjdCBhbGxvY19zdGF0ZSAqYWxsb2Nfc3RhdGUsIHN0cnVjdCBwdl9hcmVhICpwdmEsCisJCQkJICB1aW50MzJfdCByZXF1aXJlZCwgdWludDMyX3QgaXhfcHZhLCB1aW50MzJfdCB1bnJlc2VydmVkKQoreworCXVpbnQzMl90IHM7CisKKwkvKiBFeHBhbmQgYXJlYXMgYXJyYXkgaWYgbmVlZGVkIGFmdGVyIGFuIGFyZWEgd2FzIHNwbGl0LiAqLworCWlmIChpeF9wdmEgPj0gYWxsb2Nfc3RhdGUtPmFyZWFzX3NpemUpIHsKKwkJYWxsb2Nfc3RhdGUtPmFyZWFzX3NpemUgKj0gMjsKKwkJaWYgKCEoYWxsb2Nfc3RhdGUtPmFyZWFzID0gZG1fcmVhbGxvYyhhbGxvY19zdGF0ZS0+YXJlYXMsIHNpemVvZigqYWxsb2Nfc3RhdGUtPmFyZWFzKSAqIChhbGxvY19zdGF0ZS0+YXJlYXNfc2l6ZSkpKSkgeworCQkJbG9nX2Vycm9yKCJNZW1vcnkgcmVhbGxvY2F0aW9uIGZvciBwYXJhbGxlbCBhcmVhcyBmYWlsZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmb3IgKHMgPSBhbGxvY19zdGF0ZS0+YXJlYXNfc2l6ZSAvIDI7IHMgPCBhbGxvY19zdGF0ZS0+YXJlYXNfc2l6ZTsgcysrKQorCQkJYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSA9IE5VTEw7CisJfQorCisJX3Jlc2VydmVfYXJlYShhaCwgYWxsb2Nfc3RhdGUsIHB2YSwgcmVxdWlyZWQsIGl4X3B2YSwgdW5yZXNlcnZlZCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaXNfY29uZGl0aW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZywgdWludDMyX3QgcywKKwkJCSB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwdl9tYXRjaCAqcHZtYXRjaCA9IGRhdGE7CisJaW50IHBvc2l0aW9uYWwgPSBwdm1hdGNoLT5hbGxvY19zdGF0ZS0+YWxsb2NfcGFybXMtPmZsYWdzICYgQV9QT1NJVElPTkFMX0ZJTEw7CisKKwlpZiAocG9zaXRpb25hbCAmJiBwdm1hdGNoLT5hbGxvY19zdGF0ZS0+YXJlYXNbc10ucHZhKQorCQlyZXR1cm4gMTsJLyogQXJlYSBhbHJlYWR5IGFzc2lnbmVkICovCisKKwlpZiAoIXB2bWF0Y2gtPmNvbmRpdGlvbihwdm1hdGNoLCBwdnNlZywgcHZtYXRjaC0+cHZhKSkKKwkJcmV0dXJuIDE7CS8qIENvbnRpbnVlICovCisKKwlpZiAocG9zaXRpb25hbCAmJiAocyA+PSBwdm1hdGNoLT5hbGxvY19zdGF0ZS0+bnVtX3Bvc2l0aW9uYWxfYXJlYXMpKQorCQlyZXR1cm4gMTsKKworCS8qIEZJWE1FIFRoZSBwcmV2aW91cyB0ZXN0IHNob3VsZCBtYWtlIHRoaXMgb25lIHJlZHVuZGFudC4gKi8KKwlpZiAocG9zaXRpb25hbCAmJiAocyA+PSBwdm1hdGNoLT5hbGxvY19zdGF0ZS0+YXJlYXNfc2l6ZSkpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBPbmx5IHVzZWQgZm9yIGNsaW5nIGFuZCBjb250aWd1b3VzIHBvbGljaWVzICh3aGljaCBvbmx5IG1ha2Ugb25lIGFsbG9jYXRpb24gcGVyIFBWKQorCSAqIHNvIGl0J3Mgc2FmZSB0byBzYXkgYWxsIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgdXNlZC4KKwkgKi8KKwlpZiAocG9zaXRpb25hbCkKKwkJX3Jlc2VydmVfcmVxdWlyZWRfYXJlYShwdm1hdGNoLT5haCwgcHZtYXRjaC0+YWxsb2Nfc3RhdGUsIHB2bWF0Y2gtPnB2YSwgcHZtYXRjaC0+cHZhLT5jb3VudCwgcywgMCk7CisKKwlyZXR1cm4gMjsJLyogRmluaXNoZWQgKi8KK30KKworLyoKKyAqIElzIHB2YSBvbiBzYW1lIFBWIGFzIGFueSBleGlzdGluZyBhcmVhcz8KKyAqLworc3RhdGljIGludCBfY2hlY2tfY2xpbmcoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsCisJCQljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNsaW5nX3RhZ19saXN0X2NuLAorCQkJc3RydWN0IGx2X3NlZ21lbnQgKnByZXZfbHZzZWcsIHN0cnVjdCBwdl9hcmVhICpwdmEsCisJCQlzdHJ1Y3QgYWxsb2Nfc3RhdGUgKmFsbG9jX3N0YXRlKQoreworCXN0cnVjdCBwdl9tYXRjaCBwdm1hdGNoOworCWludCByOworCXVpbnQzMl90IGxlLCBsZW47CisKKwlwdm1hdGNoLmFoID0gYWg7CisJcHZtYXRjaC5jb25kaXRpb24gPSBjbGluZ190YWdfbGlzdF9jbiA/IF9oYXNfbWF0Y2hpbmdfcHZfdGFnIDogX2lzX3NhbWVfcHY7CisJcHZtYXRjaC5hbGxvY19zdGF0ZSA9IGFsbG9jX3N0YXRlOworCXB2bWF0Y2gucHZhID0gcHZhOworCXB2bWF0Y2guY2xpbmdfdGFnX2xpc3RfY24gPSBjbGluZ190YWdfbGlzdF9jbjsKKworCWlmIChhaC0+bWF4aW1pc2VfY2xpbmcpIHsKKwkJLyogQ2hlY2sgZW50aXJlIExWICovCisJCWxlID0gMDsKKwkJbGVuID0gcHJldl9sdnNlZy0+bGUgKyBwcmV2X2x2c2VnLT5sZW47CisJfSBlbHNlIHsKKwkJLyogT25seSBjaGVjayAxIExFIGF0IGVuZCBvZiBwcmV2aW91cyBMViBzZWdtZW50ICovCisJCWxlID0gcHJldl9sdnNlZy0+bGUgKyBwcmV2X2x2c2VnLT5sZW4gLSAxOworCQlsZW4gPSAxOworCX0KKworCS8qIEZJWE1FIENvcGUgd2l0aCBzdGFja3MgYnkgZmxhdHRlbmluZyAqLworCWlmICghKHIgPSBfZm9yX2VhY2hfcHYoYWgtPmNtZCwgcHJldl9sdnNlZy0+bHYsIGxlLCBsZW4sIE5VTEwsIE5VTEwsCisJCQkgICAgICAgMCwgMCwgLTEsIDEsCisJCQkgICAgICAgX2lzX2NvbmRpdGlvbiwgJnB2bWF0Y2gpKSkKKwkJc3RhY2s7CisKKwlpZiAociAhPSAyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogSXMgcHZhIGNvbnRpZ3VvdXMgdG8gYW55IGV4aXN0aW5nIGFyZWFzIG9yIG9uIHRoZSBzYW1lIFBWPworICovCitzdGF0aWMgaW50IF9jaGVja19jb250aWd1b3VzKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLAorCQkJICAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqcHJldl9sdnNlZywgc3RydWN0IHB2X2FyZWEgKnB2YSwKKwkJCSAgICAgc3RydWN0IGFsbG9jX3N0YXRlICphbGxvY19zdGF0ZSkKK3sKKwlzdHJ1Y3QgcHZfbWF0Y2ggcHZtYXRjaDsKKwlpbnQgcjsKKworCXB2bWF0Y2guYWggPSBhaDsKKwlwdm1hdGNoLmNvbmRpdGlvbiA9IF9pc19jb250aWd1b3VzOworCXB2bWF0Y2guYWxsb2Nfc3RhdGUgPSBhbGxvY19zdGF0ZTsKKwlwdm1hdGNoLnB2YSA9IHB2YTsKKwlwdm1hdGNoLmNsaW5nX3RhZ19saXN0X2NuID0gTlVMTDsKKworCS8qIEZJWE1FIENvcGUgd2l0aCBzdGFja3MgYnkgZmxhdHRlbmluZyAqLworCWlmICghKHIgPSBfZm9yX2VhY2hfcHYoYWgtPmNtZCwgcHJldl9sdnNlZy0+bHYsCisJCQkgICAgICAgcHJldl9sdnNlZy0+bGUgKyBwcmV2X2x2c2VnLT5sZW4gLSAxLCAxLCBOVUxMLCBOVUxMLAorCQkJICAgICAgIDAsIDAsIC0xLCAxLAorCQkJICAgICAgIF9pc19jb25kaXRpb24sICZwdm1hdGNoKSkpCisJCXN0YWNrOworCisJaWYgKHIgIT0gMikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIElzIHB2YSBvbiBzYW1lIFBWIGFzIGFueSBhcmVhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBhbGxvY2F0aW9uIGF0dGVtcHQ/CisgKi8KK3N0YXRpYyBpbnQgX2NoZWNrX2NsaW5nX3RvX2FsbG9jZWQoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY2xpbmdfdGFnX2xpc3RfY24sCisJCQkJICAgc3RydWN0IHB2X2FyZWEgKnB2YSwgc3RydWN0IGFsbG9jX3N0YXRlICphbGxvY19zdGF0ZSkKK3sKKwl1bnNpZ25lZCBzOworCXN0cnVjdCBhbGxvY2VkX2FyZWEgKmFhOworCWludCBwb3NpdGlvbmFsID0gYWxsb2Nfc3RhdGUtPmFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfUE9TSVRJT05BTF9GSUxMOworCisJLyoKKwkgKiBJZ25vcmUgbG9nIGFyZWFzLiAgVGhleSBhcmUgYWx3YXlzIGFsbG9jYXRlZCB3aG9sZSBhcyBwYXJ0IG9mIHRoZQorCSAqIGZpcnN0IGFsbG9jYXRpb24uICBJZiB0aGV5IGFyZW4ndCB5ZXQgc2V0LCB3ZSBrbm93IHdlJ3ZlIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQpCisJCXJldHVybiAwOworCisJZm9yIChzID0gMDsgcyA8IGFoLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKHBvc2l0aW9uYWwgJiYgYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSkKKwkJCWNvbnRpbnVlOwkvKiBBcmVhIGFscmVhZHkgYXNzaWduZWQgKi8KKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFhLCAmYWgtPmFsbG9jZWRfYXJlYXNbc10pIHsKKwkJCWlmICgoIWNsaW5nX3RhZ19saXN0X2NuICYmIChwdmEtPm1hcC0+cHYgPT0gYWFbMF0ucHYpKSB8fAorCQkJICAgIChjbGluZ190YWdfbGlzdF9jbiAmJiBfcHZzX2hhdmVfbWF0Y2hpbmdfdGFnKGNsaW5nX3RhZ19saXN0X2NuLCBwdmEtPm1hcC0+cHYsIGFhWzBdLnB2KSkpIHsKKwkJCQlpZiAocG9zaXRpb25hbCkKKwkJCQkJX3Jlc2VydmVfcmVxdWlyZWRfYXJlYShhaCwgYWxsb2Nfc3RhdGUsIHB2YSwgcHZhLT5jb3VudCwgcywgMCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcHZfaXNfcGFyYWxsZWwoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9wdnMpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHBhcmFsbGVsX3B2cykKKwkJaWYgKHB2ID09IHB2bC0+cHYpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogRGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHRyeSBhbGxvY2F0aW9uIGZyb20gc3VwcGxpZWQgYXJlYSBwdmEuCisgKiBhbGxvY19zdGF0ZS0+YXJlYXMgbWF5IGdldCBtb2RpZmllZC4KKyAqLworc3RhdGljIGFyZWFfdXNlX3QgX2NoZWNrX3B2YShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwgc3RydWN0IHB2X2FyZWEgKnB2YSwgdWludDMyX3Qgc3RpbGxfbmVlZGVkLAorCQkJICAgICBzdHJ1Y3QgYWxsb2Nfc3RhdGUgKmFsbG9jX3N0YXRlLAorCQkJICAgICB1bnNpZ25lZCBhbHJlYWR5X2ZvdW5kX29uZSwgdW5zaWduZWQgaXRlcmF0aW9uX2NvdW50LCB1bnNpZ25lZCBsb2dfaXRlcmF0aW9uX2NvdW50KQoreworCWNvbnN0IHN0cnVjdCBhbGxvY19wYXJtcyAqYWxsb2NfcGFybXMgPSBhbGxvY19zdGF0ZS0+YWxsb2NfcGFybXM7CisJdW5zaWduZWQgczsKKworCS8qIFNraXAgZnVsbHktcmVzZXJ2ZWQgYXJlYXMgKHdoaWNoIGFyZSBub3QgY3VycmVudGx5IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCkuICovCisJaWYgKCFwdmEtPnVucmVzZXJ2ZWQpCisJCXJldHVybiBORVhUX0FSRUE7CisKKwkvKiBGSVhNRSBTaG91bGQgdGhpcyB0ZXN0IGJlIHJlbW92ZWQ/ICovCisJaWYgKGl0ZXJhdGlvbl9jb3VudCkKKwkJLyoKKwkJKiBEb24ndCB1c2UgYW4gYXJlYSB0d2ljZS4KKwkJKi8KKwkJZm9yIChzID0gMDsgcyA8IGFsbG9jX3N0YXRlLT5hcmVhc19zaXplOyBzKyspCisJCQlpZiAoYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSA9PSBwdmEpCisJCQkJcmV0dXJuIE5FWFRfQVJFQTsKKworCS8qIElmIG1heGltaXNlX2NsaW5nIGlzIHNldCwgcGVyZm9ybSBzZXZlcmFsIGNoZWNrcywgb3RoZXJ3aXNlIHBlcmZvcm0gZXhhY3RseSBvbmUuICovCisJaWYgKCFpdGVyYXRpb25fY291bnQgJiYgIWxvZ19pdGVyYXRpb25fY291bnQgJiYgYWxsb2NfcGFybXMtPmZsYWdzICYgKEFfQ09OVElHVU9VU19UT19MVlNFRyB8IEFfQ0xJTkdfVE9fTFZTRUcgfCBBX0NMSU5HX1RPX0FMTE9DRUQpKSB7CisJCS8qIENvbnRpZ3VvdXM/ICovCisJCWlmICgoKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQ09OVElHVU9VU19UT19MVlNFRykgfHwKKwkJICAgICAoYWgtPm1heGltaXNlX2NsaW5nICYmIChhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX0FSRUFfQ09VTlRfTUFUQ0hFUykpKSAmJgorCQkgICAgX2NoZWNrX2NvbnRpZ3VvdXMoYWgsIGFsbG9jX3Bhcm1zLT5wcmV2X2x2c2VnLCBwdmEsIGFsbG9jX3N0YXRlKSkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogVHJ5IG5leHQgYXJlYSBvbiBzYW1lIFBWIGlmIGxvb2tpbmcgZm9yIGNvbnRpZ3VvdXMgc3BhY2UgKi8KKwkJaWYgKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQ09OVElHVU9VU19UT19MVlNFRykKKwkJCXJldHVybiBORVhUX0FSRUE7CisKKwkJLyogQ2xpbmcgdG8gcHJldl9sdnNlZz8gKi8KKwkJaWYgKCgoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19MVlNFRykgfHwKKwkJICAgICAoYWgtPm1heGltaXNlX2NsaW5nICYmIChhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX0FSRUFfQ09VTlRfTUFUQ0hFUykpKSAmJgorCQkgICAgX2NoZWNrX2NsaW5nKGFoLCBOVUxMLCBhbGxvY19wYXJtcy0+cHJldl9sdnNlZywgcHZhLCBhbGxvY19zdGF0ZSkpCisJCQkvKiBJZiB0aGlzIFBWIGlzIHN1aXRhYmxlLCB1c2UgdGhpcyBmaXJzdCBhcmVhICovCisJCQlnb3RvIGZvdW5kOworCisJCS8qIENsaW5nX3RvX2FsbG9jZWQ/ICovCisJCWlmICgoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19BTExPQ0VEKSAmJgorCQkgICAgX2NoZWNrX2NsaW5nX3RvX2FsbG9jZWQoYWgsIE5VTEwsIHB2YSwgYWxsb2Nfc3RhdGUpKQorCQkJZ290byBmb3VuZDsKKworCQkvKiBDbGluZ19ieV90YWdzPyAqLworCQlpZiAoIShhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX0NMSU5HX0JZX1RBR1MpIHx8ICFhaC0+Y2xpbmdfdGFnX2xpc3RfY24pCisJCQlyZXR1cm4gTkVYVF9QVjsKKworCQlpZiAoKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQVJFQV9DT1VOVF9NQVRDSEVTKSkgeworCQkJaWYgKF9jaGVja19jbGluZyhhaCwgYWgtPmNsaW5nX3RhZ19saXN0X2NuLCBhbGxvY19wYXJtcy0+cHJldl9sdnNlZywgcHZhLCBhbGxvY19zdGF0ZSkpCisJCQkJZ290byBmb3VuZDsKKwkJfSBlbHNlIGlmIChfY2hlY2tfY2xpbmdfdG9fYWxsb2NlZChhaCwgYWgtPmNsaW5nX3RhZ19saXN0X2NuLCBwdmEsIGFsbG9jX3N0YXRlKSkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogQWxsIGFyZWFzIG9uIHRoaXMgUFYgZ2l2ZSBzYW1lIHJlc3VsdCBzbyBwb2ludGxlc3MgY2hlY2tpbmcgbW9yZSAqLworCQlyZXR1cm4gTkVYVF9QVjsKKwl9CisKKwkvKiBOb3JtYWwvQW55d2hlcmUgKi8KKworCS8qIElzIGl0IGJpZyBlbm91Z2ggb24gaXRzIG93bj8gKi8KKwlpZiAocHZhLT51bnJlc2VydmVkICogYWgtPmFyZWFfbXVsdGlwbGUgPCBzdGlsbF9uZWVkZWQgJiYKKwkgICAgKCghKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQ0FOX1NQTElUKSAmJiAhYWgtPmxvZ19hcmVhX2NvdW50KSB8fAorCSAgICAgKGFscmVhZHlfZm91bmRfb25lICYmIGFsbG9jX3Bhcm1zLT5hbGxvYyAhPSBBTExPQ19BTllXSEVSRSkpKQorCQlyZXR1cm4gTkVYVF9QVjsKKworZm91bmQ6CisJaWYgKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfUE9TSVRJT05BTF9GSUxMKQorCQlyZXR1cm4gUFJFRkVSUkVEOworCisJcmV0dXJuIFVTRV9BUkVBOworfQorCisvKgorICogRGVjaWRlIGhvdyBtYW55IGV4dGVudHMgd2UncmUgdHJ5aW5nIHRvIG9idGFpbiBmcm9tIGEgZ2l2ZW4gYXJlYS4KKyAqIFJlbW92ZXMgdGhlIGV4dGVudHMgZnJvbSBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfY2FsY19yZXF1aXJlZF9leHRlbnRzKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLCBzdHJ1Y3QgcHZfYXJlYSAqcHZhLCB1bnNpZ25lZCBpeF9wdmEsIHVpbnQzMl90IG1heF90b19hbGxvY2F0ZSwgYWxsb2NfcG9saWN5X3QgYWxsb2MpCit7CisJdWludDMyX3QgcmVxdWlyZWQgPSBtYXhfdG9fYWxsb2NhdGUgLyBhaC0+YXJlYV9tdWx0aXBsZTsKKworCS8qCisJICogVXBkYXRlIGFtb3VudCB1bnJlc2VydmVkIC0gZWZmZWN0aXZlbHkgc3BsaXR0aW5nIGFuIGFyZWEKKwkgKiBpbnRvIHR3byBvciBtb3JlIHBhcnRzLiAgSWYgdGhlIHdob2xlIHN0cmlwZSBkb2Vzbid0IGZpdCwKKwkgKiByZWR1Y2UgYW1vdW50IHdlJ3JlIGxvb2tpbmcgZm9yLgorCSAqLworCWlmIChhbGxvYyA9PSBBTExPQ19BTllXSEVSRSkgeworCQlpZiAoaXhfcHZhID49IGFoLT5hcmVhX2NvdW50ICsgYWgtPnBhcml0eV9jb3VudCkKKwkJCXJlcXVpcmVkID0gYWgtPmxvZ19sZW47CisJfSBlbHNlIGlmIChyZXF1aXJlZCA8IGFoLT5sb2dfbGVuKQorCQlyZXF1aXJlZCA9IGFoLT5sb2dfbGVuOworCisJaWYgKHJlcXVpcmVkID49IHB2YS0+dW5yZXNlcnZlZCkgeworCQlyZXF1aXJlZCA9IHB2YS0+dW5yZXNlcnZlZDsKKwkJcHZhLT51bnJlc2VydmVkID0gMDsKKwl9IGVsc2UgeworCQlwdmEtPnVucmVzZXJ2ZWQgLT0gcmVxdWlyZWQ7CisJCXJlaW5zZXJ0X2NoYW5nZWRfcHZfYXJlYShwdmEpOworCX0KKworCXJldHVybiByZXF1aXJlZDsKK30KKworc3RhdGljIHZvaWQgX2NsZWFyX2FyZWFzKHN0cnVjdCBhbGxvY19zdGF0ZSAqYWxsb2Nfc3RhdGUpCit7CisJdWludDMyX3QgczsKKworCWFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyA9IDA7CisKKwlmb3IgKHMgPSAwOyBzIDwgYWxsb2Nfc3RhdGUtPmFyZWFzX3NpemU7IHMrKykKKwkJYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9yZXNldF91bnJlc2VydmVkKHN0cnVjdCBkbV9saXN0ICpwdm1zKQoreworCXN0cnVjdCBwdl9tYXAgKnB2bTsKKwlzdHJ1Y3QgcHZfYXJlYSAqcHZhOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bSwgcHZtcykKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2YSwgJnB2bS0+YXJlYXMpCisJCQlpZiAocHZhLT51bnJlc2VydmVkICE9IHB2YS0+Y291bnQpIHsKKwkJCQlwdmEtPnVucmVzZXJ2ZWQgPSBwdmEtPmNvdW50OworCQkJCXJlaW5zZXJ0X2NoYW5nZWRfcHZfYXJlYShwdmEpOworCQkJfQorfQorCitzdGF0aWMgdm9pZCBfcmVwb3J0X25lZWRlZF9hbGxvY2F0aW9uX3NwYWNlKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLAorCQkJCQkgICAgc3RydWN0IGFsbG9jX3N0YXRlICphbGxvY19zdGF0ZSwKKwkJCQkJICAgIHN0cnVjdCBkbV9saXN0ICpwdm1zKQoreworCWNvbnN0IGNoYXIgKm1ldGFkYXRhX3R5cGU7CisJdWludDMyX3QgcGFyYWxsZWxfYXJlYXNfY291bnQsIHBhcmFsbGVsX2FyZWFfc2l6ZTsKKwl1aW50MzJfdCBtZXRhZGF0YV9jb3VudCwgbWV0YWRhdGFfc2l6ZTsKKworCXBhcmFsbGVsX2FyZWFfc2l6ZSA9IGFoLT5uZXdfZXh0ZW50cyAtIGFsbG9jX3N0YXRlLT5hbGxvY2F0ZWQ7CisJcGFyYWxsZWxfYXJlYV9zaXplIC89IGFoLT5hcmVhX211bHRpcGxlOworCXBhcmFsbGVsX2FyZWFfc2l6ZSAtPSAoYWgtPmFsbG9jX2FuZF9zcGxpdF9tZXRhICYmICFhaC0+c3BsaXRfbWV0YWRhdGFfaXNfYWxsb2NhdGVkKSA/IGFoLT5sb2dfbGVuIDogMDsKKworCXBhcmFsbGVsX2FyZWFzX2NvdW50ID0gYWgtPmFyZWFfY291bnQgKyBhaC0+cGFyaXR5X2NvdW50OworCisJbWV0YWRhdGFfc2l6ZSA9IGFoLT5sb2dfbGVuOworCWlmIChhaC0+YWxsb2NfYW5kX3NwbGl0X21ldGEpIHsKKwkJbWV0YWRhdGFfdHlwZSA9ICJtZXRhZGF0YSBhcmVhIjsKKwkJbWV0YWRhdGFfY291bnQgPSBwYXJhbGxlbF9hcmVhc19jb3VudDsKKwkJaWYgKGFoLT5zcGxpdF9tZXRhZGF0YV9pc19hbGxvY2F0ZWQpCisJCQltZXRhZGF0YV9zaXplID0gMDsKKwl9IGVsc2UgeworCQltZXRhZGF0YV90eXBlID0gIm1pcnJvciBsb2ciOworCQltZXRhZGF0YV9jb3VudCA9IGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQ7CisJfQorCisJbG9nX2RlYnVnX2FsbG9jKCJTdGlsbCBuZWVkICVzJSIgUFJJdTMyICIgdG90YWwgZXh0ZW50cyBmcm9tICUiIFBSSXUzMiAiIHJlbWFpbmluZyAoJSIgUFJJdTMyICIgcG9zaXRpb25hbCBzbG90cyk6IiwKKwkJCWFoLT5hcHByb3hfYWxsb2MgPyAidXAgdG8gIiA6ICIiLAorCQkJcGFyYWxsZWxfYXJlYV9zaXplICogcGFyYWxsZWxfYXJlYXNfY291bnQgKyBtZXRhZGF0YV9zaXplICogbWV0YWRhdGFfY291bnQsIHB2X21hcHNfc2l6ZShwdm1zKSwKKwkJCWFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyk7CisJbG9nX2RlYnVnX2FsbG9jKCIgICUiIFBSSXUzMiAiICglIiBQUkl1MzIgIiBkYXRhLyUiIFBSSXUzMgorCQkJIiBwYXJpdHkpIHBhcmFsbGVsIGFyZWFzIG9mICUiIFBSSXUzMiAiIGV4dGVudHMgZWFjaCIsCisJCQlwYXJhbGxlbF9hcmVhc19jb3VudCwgYWgtPmFyZWFfY291bnQsIGFoLT5wYXJpdHlfY291bnQsIHBhcmFsbGVsX2FyZWFfc2l6ZSk7CisJbG9nX2RlYnVnX2FsbG9jKCIgICUiIFBSSXUzMiAiICVzJXMgb2YgJSIgUFJJdTMyICIgZXh0ZW50cyBlYWNoIiwKKwkJCW1ldGFkYXRhX2NvdW50LCBtZXRhZGF0YV90eXBlLAorCQkJKG1ldGFkYXRhX2NvdW50ID09IDEpID8gIiIgOiAicyIsCisJCQltZXRhZGF0YV9zaXplKTsKK30KKworLyogV29yayB0aHJvdWdoIHRoZSBhcnJheSwgcmVtb3ZpbmcgYW55IGVudHJpZXMgd2l0aCB0YWdzIGFscmVhZHkgdXNlZCBieSBwcmV2aW91cyBhcmVhcy4gKi8KK3N0YXRpYyBpbnQgX2xpbWl0X3RvX29uZV9hcmVhX3Blcl90YWcoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHN0cnVjdCBhbGxvY19zdGF0ZSAqYWxsb2Nfc3RhdGUsCisJCQkJICAgICAgdWludDMyX3QgaXhfbG9nX29mZnNldCwgdW5zaWduZWQgKml4KQoreworCXVpbnQzMl90CXMgPSAwLCB1ID0gMDsKKwlETV9MSVNUX0lOSVQocHZfdGFncyk7CisKKwl3aGlsZSAocyA8IGFsbG9jX3N0YXRlLT5hcmVhc19zaXplICYmIGFsbG9jX3N0YXRlLT5hcmVhc1tzXS5wdmEpIHsKKwkJLyogU3RhcnQgYWdhaW4gd2l0aCBhbiBlbXB0eSB0YWcgbGlzdCB3aGVuIHdlIHJlYWNoIHRoZSBsb2cgZGV2aWNlcyAqLworCQlpZiAodSA9PSBpeF9sb2dfb2Zmc2V0KQorCQkJZG1fbGlzdF9pbml0KCZwdl90YWdzKTsKKwkJaWYgKCFfcHZfaGFzX21hdGNoaW5nX3RhZyhhaC0+Y2xpbmdfdGFnX2xpc3RfY24sIGFsbG9jX3N0YXRlLT5hcmVhc1tzXS5wdmEtPm1hcC0+cHYsIGFsbG9jX3N0YXRlLT5hcmVhc1tzXS5wdmEtPnN0YXJ0LCBzLCAmcHZfdGFncykpIHsKKwkJCS8qIFRoZSBjb21wYXJpc29uIGZuIHdpbGwgaWdub3JlIGFueSBub24tY2xpbmcgdGFncyBzbyBqdXN0IGFkZCBldmVyeXRoaW5nICovCisJCQlpZiAoIXN0cl9saXN0X2FkZF9saXN0KGFoLT5tZW0sICZwdl90YWdzLCAmYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YS0+bWFwLT5wdi0+dGFncykpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmIChzICE9IHUpCisJCQkJYWxsb2Nfc3RhdGUtPmFyZWFzW3VdID0gYWxsb2Nfc3RhdGUtPmFyZWFzW3NdOworCisJCQl1Kys7CisJCX0gZWxzZQorCQkJKCppeCktLTsJLyogT25lIGFyZWEgcmVtb3ZlZCAqLworCisJCXMrKzsKKwl9CisKKwlhbGxvY19zdGF0ZS0+YXJlYXNbdV0ucHZhID0gTlVMTDsKKworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyAxIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgc3BhY2Ugd2FzIGZvdW5kLCBleGNlcHQgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgX2ZpbmRfc29tZV9wYXJhbGxlbF9zcGFjZShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCQkgICAgIHN0cnVjdCBkbV9saXN0ICpwdm1zLCBzdHJ1Y3QgYWxsb2Nfc3RhdGUgKmFsbG9jX3N0YXRlLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKnBhcmFsbGVsX3B2cywgdWludDMyX3QgbWF4X3RvX2FsbG9jYXRlKQoreworCWNvbnN0IHN0cnVjdCBhbGxvY19wYXJtcyAqYWxsb2NfcGFybXMgPSBhbGxvY19zdGF0ZS0+YWxsb2NfcGFybXM7CisJdW5zaWduZWQgaXggPSAwOworCXVuc2lnbmVkIGxhc3RfaXg7CisJc3RydWN0IHB2X21hcCAqcHZtOworCXN0cnVjdCBwdl9hcmVhICpwdmE7CisJdW5zaWduZWQgcHJlZmVycmVkX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBhbHJlYWR5X2ZvdW5kX29uZTsKKwl1bnNpZ25lZCBpeF9sb2dfb2Zmc2V0OyAvKiBPZmZzZXQgdG8gc3RhcnQgb2YgYXJlYXMgdG8gdXNlIGZvciBsb2cgKi8KKwl1bnNpZ25lZCB0b29fc21hbGxfZm9yX2xvZ19jb3VudDsgLyogSG93IG1hbnkgdG9vIHNtYWxsIGZvciBsb2c/ICovCisJdW5zaWduZWQgaXRlcmF0aW9uX2NvdW50ID0gMDsgLyogY2xpbmdfdG9fYWxsb2NlZCBtYXkgbmVlZCAyIGl0ZXJhdGlvbnMgKi8KKwl1bnNpZ25lZCBsb2dfaXRlcmF0aW9uX2NvdW50ID0gMDsgLyogZXh0cmEgaXRlcmF0aW9uIGZvciBsb2dzIG9uIGRhdGEgZGV2aWNlcyAqLworCXN0cnVjdCBhbGxvY2VkX2FyZWEgKmFhOworCXVpbnQzMl90IHM7CisJdWludDMyX3QgZGV2aWNlc19uZWVkZWQgPSBhaC0+YXJlYV9jb3VudCArIGFoLT5wYXJpdHlfY291bnQ7CisJdWludDMyX3QgcmVxdWlyZWQ7CisKKwlfY2xlYXJfYXJlYXMoYWxsb2Nfc3RhdGUpOworCV9yZXNldF91bnJlc2VydmVkKHB2bXMpOworCisJLyogbnVtX3Bvc2l0aW9uYWxfYXJlYXMgaG9sZHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUgY29udGlndW91cy9jbGluZyAqLworCS8qIFRoZXNlIGFwcGVhciBmaXJzdCBpbiB0aGUgYXJyYXksIHNvIGl0IGlzIGFsc28gdGhlIG9mZnNldCB0byB0aGUgbm9uLXByZWZlcnJlZCBhbGxvY2F0aW9ucyAqLworCS8qIEF0IG1vc3Qgb25lIG9mIEFfQ09OVElHVU9VU19UT19MVlNFRywgQV9DTElOR19UT19MVlNFRyBvciBBX0NMSU5HX1RPX0FMTE9DRUQgbWF5IGJlIHNldCAqLworCWlmICghKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfUE9TSVRJT05BTF9GSUxMKSkKKwkJYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzID0gMDsKKwllbHNlIGlmIChhbGxvY19wYXJtcy0+ZmxhZ3MgJiAoQV9DT05USUdVT1VTX1RPX0xWU0VHIHwgQV9DTElOR19UT19MVlNFRykpCisJCWFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyA9IF9zdHJpcGVzX3Blcl9taW1hZ2UoYWxsb2NfcGFybXMtPnByZXZfbHZzZWcpICogYWxsb2NfcGFybXMtPnByZXZfbHZzZWctPmFyZWFfY291bnQ7CisJZWxzZSBpZiAoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19BTExPQ0VEKQorCQlhbGxvY19zdGF0ZS0+bnVtX3Bvc2l0aW9uYWxfYXJlYXMgPSBhaC0+YXJlYV9jb3VudDsKKworCWlmIChhbGxvY19wYXJtcy0+YWxsb2MgPT0gQUxMT0NfTk9STUFMIHx8IChhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX0NMSU5HX1RPX0FMTE9DRUQpKQorCQlsb2dfZGVidWdfYWxsb2MoIkNsaW5nX3RvX2FsbG9jYXRlZCBpcyAlc3NldCIsCisJCQkJYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19BTExPQ0VEID8gIiIgOiAibm90ICIpOworCisJaWYgKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfUE9TSVRJT05BTF9GSUxMKQorCQlsb2dfZGVidWdfYWxsb2MoIiV1IHByZWZlcnJlZCBhcmVhKHMpIHRvIGJlIGZpbGxlZCBwb3NpdGlvbmFsbHkuIiwgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzKTsKKwllbHNlCisJCWxvZ19kZWJ1Z19hbGxvYygiQXJlYXMgdG8gYmUgc29ydGVkIGFuZCBmaWxsZWQgc2VxdWVudGlhbGx5LiIpOworCisJX3JlcG9ydF9uZWVkZWRfYWxsb2NhdGlvbl9zcGFjZShhaCwgYWxsb2Nfc3RhdGUsIHB2bXMpOworCisJLyogaXggaG9sZHMgdGhlIG51bWJlciBvZiBhcmVhcyBmb3VuZCBvbiBvdGhlciBQVnMgKi8KKwlkbyB7CisJCWlmIChsb2dfaXRlcmF0aW9uX2NvdW50KSB7CisJCQlsb2dfZGVidWdfYWxsb2MoIkZvdW5kICV1IGFyZWFzIGZvciAlIiBQUkl1MzIgIiBwYXJhbGxlbCBhcmVhcyBhbmQgJSIgUFJJdTMyICIgbG9nIGFyZWFzIHNvIGZhci4iLCBpeCwgZGV2aWNlc19uZWVkZWQsIGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQpOworCQl9IGVsc2UgaWYgKGl0ZXJhdGlvbl9jb3VudCkKKwkJCWxvZ19kZWJ1Z19hbGxvYygiRmlsbGVkICV1IG91dCBvZiAldSBwcmVmZXJyZWQgYXJlYXMgc28gZmFyLiIsIHByZWZlcnJlZF9jb3VudCwgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzKTsKKworCQkvKgorCQkgKiBQcm92aWRlIGZvciBlc2NhcGUgZnJvbSB0aGUgbG9vcCBpZiBubyBwcm9ncmVzcyBpcyBtYWRlLgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuOiBBTExPQ19BTllXSEVSRSBzaG91bGQgYmUgYWJsZSB0byB1c2UKKwkJICogYWxsIGF2YWlsYWJsZSBzcGFjZS4gKElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggZXh0ZW50cywgdGhlIGNvZGUKKwkJICogc2hvdWxkIG5vdCByZWFjaCB0aGlzIHBvaW50LikKKwkJICovCisJCWxhc3RfaXggPSBpeDsKKworCQkvKgorCQkgKiBQdXQgdGhlIHNtYWxsZXN0IGFyZWEgb2YgZWFjaCBQViB0aGF0IGlzIGF0IGxlYXN0IHRoZQorCQkgKiBzaXplIHdlIG5lZWQgaW50byBhcmVhcyBhcnJheS4gIElmIHRoZXJlIGlzbid0IG9uZQorCQkgKiB0aGF0IGZpdHMgY29tcGxldGVseSBhbmQgd2UncmUgYWxsb3dlZCBtb3JlIHRoYW4gb25lCisJCSAqIExWIHNlZ21lbnQsIHRoZW4gdGFrZSB0aGUgbGFyZ2VzdCByZW1haW5pbmcgaW5zdGVhZC4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdm0sIHB2bXMpIHsKKwkJCS8qIFBWLWxldmVsIGNoZWNrcyAqLworCQkJaWYgKGRtX2xpc3RfZW1wdHkoJnB2bS0+YXJlYXMpKQorCQkJCWNvbnRpbnVlOwkvKiBOZXh0IFBWICovCisKKwkJCWlmIChhbGxvY19wYXJtcy0+YWxsb2MgIT0gQUxMT0NfQU5ZV0hFUkUpIHsKKwkJCQkvKiBEb24ndCBhbGxvY2F0ZSBvbnRvIHRoZSBsb2cgUFZzICovCisJCQkJaWYgKGFoLT5sb2dfYXJlYV9jb3VudCkKKwkJCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFhLCAmYWgtPmFsbG9jZWRfYXJlYXNbYWgtPmFyZWFfY291bnRdKQorCQkJCQkJZm9yIChzID0gMDsgcyA8IGFoLT5sb2dfYXJlYV9jb3VudDsgcysrKQorCQkJCQkJCWlmICghYWFbc10ucHYpCisJCQkJCQkJCWdvdG8gbmV4dF9wdjsKKworCQkJCS8qIEZJWE1FIFNwbGl0IGludG8gbG9nIGFuZCBub24tbG9nIHBhcmFsbGVsX3B2cyBhbmQgb25seSBjaGVjayB0aGUgbG9nIG9uZXMgaWYgbG9nX2l0ZXJhdGlvbj8gKi8KKwkJCQkvKiAoSSd2ZSB0ZW1wb3JhdGlseSBkaXNhYmxlZCB0aGUgY2hlY2suKSAqLworCQkJCS8qIEF2b2lkIFBWcyB1c2VkIGJ5IGV4aXN0aW5nIHBhcmFsbGVsIGFyZWFzICovCisJCQkJaWYgKCFsb2dfaXRlcmF0aW9uX2NvdW50ICYmIHBhcmFsbGVsX3B2cyAmJiBfcHZfaXNfcGFyYWxsZWwocHZtLT5wdiwgcGFyYWxsZWxfcHZzKSkKKwkJCQkJZ290byBuZXh0X3B2OworCisJCQkJLyoKKwkJCQkgKiBBdm9pZCBQVnMgYWxyZWFkeSBzZXQgYXNpZGUgZm9yIGxvZy4KKwkJCQkgKiBXZSBvbmx5IHJlYWNoIGhlcmUgaWYgdGhlcmUgd2VyZSBlbm91Z2ggUFZzIGZvciB0aGUgbWFpbiBhcmVhcyBidXQKKwkJCQkgKiBub3QgZW5vdWdoIGZvciB0aGUgbG9ncy4KKwkJCQkgKi8KKwkJCQlpZiAobG9nX2l0ZXJhdGlvbl9jb3VudCkgeworCQkJCQlmb3IgKHMgPSBkZXZpY2VzX25lZWRlZDsgcyA8IGl4ICsgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzOyBzKyspCisJCQkJCQlpZiAoYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSAmJiBhbGxvY19zdGF0ZS0+YXJlYXNbc10ucHZhLT5tYXAtPnB2ID09IHB2bS0+cHYpCisJCQkJCQkJZ290byBuZXh0X3B2OworCQkJCS8qIE9uIGEgc2Vjb25kIHBhc3MsIGF2b2lkIFBWcyBhbHJlYWR5IHVzZWQgaW4gYW4gdW5jb21taXR0ZWQgYXJlYSAqLworCQkJCX0gZWxzZSBpZiAoaXRlcmF0aW9uX2NvdW50KQorCQkJCQlmb3IgKHMgPSAwOyBzIDwgZGV2aWNlc19uZWVkZWQ7IHMrKykKKwkJCQkJCWlmIChhbGxvY19zdGF0ZS0+YXJlYXNbc10ucHZhICYmIGFsbG9jX3N0YXRlLT5hcmVhc1tzXS5wdmEtPm1hcC0+cHYgPT0gcHZtLT5wdikKKwkJCQkJCQlnb3RvIG5leHRfcHY7CisJCQl9CisKKwkJCWFscmVhZHlfZm91bmRfb25lID0gMDsKKwkJCS8qIEZpcnN0IGFyZWEgaW4gZWFjaCBsaXN0IGlzIHRoZSBsYXJnZXN0ICovCisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZhLCAmcHZtLT5hcmVhcykgeworCQkJCS8qCisJCQkJICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhbGxvY2F0aW9ucywgd2hpY2ggY2FuJ3QgYmUgbWl4ZWQgYXQgcHJlc2VudDoKKwkJCQkgKgorCQkJCSAqIFBSRUZFUlJFRCBhcmUgc3RvcmVkIGltbWVkaWF0ZWx5IGluIGEgc3BlY2lmaWMgcGFyYWxsZWwgc2xvdC4KKwkJCQkgKiAgIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBBX1BPU0lUSU9OQUxfRklMTCBmbGFnIGlzIHNldC4KKwkJCQkgKiAgIFRoaXMgcmVxdWlyZXMgdGhlIG51bWJlciBvZiBzbG90cyB0byBtYXRjaCwgc28gaWYgY29tcGFyaW5nIHdpdGgKKwkJCQkgKiAgIHByZXZfbHZzZWcgdGhlbiBBX0FSRUFfQ09VTlRfTUFUQ0hFUyBtdXN0IGJlIHNldC4KKwkJCQkgKgorCQkJCSAqIFVTRV9BUkVBIGFyZSBzdG9yZWQgZm9yIGxhdGVyLCB0aGVuIHNvcnRlZCBhbmQgY2hvc2VuIGZyb20uCisJCQkJICovCisJCQkJc3dpdGNoKF9jaGVja19wdmEoYWgsIHB2YSwgbWF4X3RvX2FsbG9jYXRlLAorCQkJCQkJICBhbGxvY19zdGF0ZSwgYWxyZWFkeV9mb3VuZF9vbmUsIGl0ZXJhdGlvbl9jb3VudCwgbG9nX2l0ZXJhdGlvbl9jb3VudCkpIHsKKworCQkJCWNhc2UgUFJFRkVSUkVEOgorCQkJCQlwcmVmZXJyZWRfY291bnQrKzsKKwkJCQkJLyogRmFsbCB0aHJvdWdoICovCisKKwkJCQljYXNlIE5FWFRfUFY6CisJCQkJCWdvdG8gbmV4dF9wdjsKKworCQkJCWNhc2UgTkVYVF9BUkVBOgorCQkJCQljb250aW51ZTsKKworCQkJCWNhc2UgVVNFX0FSRUE6CisJCQkJCS8qCisJCQkJCSAqIEV4Y2VwdCB3aXRoIEFMTE9DX0FOWVdIRVJFLCByZXBsYWNlIGZpcnN0IGFyZWEgd2l0aCB0aGlzCisJCQkJCSAqIG9uZSB3aGljaCBpcyBzbWFsbGVyIGJ1dCBzdGlsbCBiaWcgZW5vdWdoLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFhbHJlYWR5X2ZvdW5kX29uZSB8fAorCQkJCQkgICAgYWxsb2NfcGFybXMtPmFsbG9jID09IEFMTE9DX0FOWVdIRVJFKSB7CisJCQkJCQlpeCsrOworCQkJCQkJYWxyZWFkeV9mb3VuZF9vbmUgPSAxOworCQkJCQl9CisKKwkJCQkJLyogUmVzZXJ2ZSByZXF1aXJlZCBhbW91bnQgb2YgcHZhICovCisJCQkJCXJlcXVpcmVkID0gX2NhbGNfcmVxdWlyZWRfZXh0ZW50cyhhaCwgcHZhLCBpeCArIGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyAtIDEsIG1heF90b19hbGxvY2F0ZSwgYWxsb2NfcGFybXMtPmFsbG9jKTsKKwkJCQkJaWYgKCFfcmVzZXJ2ZV9yZXF1aXJlZF9hcmVhKGFoLCBhbGxvY19zdGF0ZSwgcHZhLCByZXF1aXJlZCwgaXggKyBhbGxvY19zdGF0ZS0+bnVtX3Bvc2l0aW9uYWxfYXJlYXMgLSAxLCBwdmEtPnVucmVzZXJ2ZWQpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJfQorCisJCQl9CisKKwkJbmV4dF9wdjoKKwkJCS8qIFdpdGggQUxMT0NfQU5ZV0hFUkUgd2UgaWdub3JlIGZ1cnRoZXIgUFZzIG9uY2Ugd2UgaGF2ZSBhdCBsZWFzdCBlbm91Z2ggYXJlYXMgKi8KKwkJCS8qIFdpdGggY2xpbmcgYW5kIGNvbnRpZ3VvdXMgd2Ugc3RvcCBpZiB3ZSBmb3VuZCBhIG1hdGNoIGZvciAqYWxsKiB0aGUgYXJlYXMgKi8KKwkJCS8qIEZJWE1FIFJlbmFtZSB0aGVzZSB2YXJpYWJsZXMhICovCisJCQlpZiAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19BTllXSEVSRSAmJgorCQkJICAgIGl4ICsgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzID49IGRldmljZXNfbmVlZGVkICsgYWxsb2Nfc3RhdGUtPmxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZCkgfHwKKwkJCSAgICAocHJlZmVycmVkX2NvdW50ID09IGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyAmJgorCQkJICAgICAoYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzID09IGRldmljZXNfbmVlZGVkICsgYWxsb2Nfc3RhdGUtPmxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZCkpKQorCQkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19BTllXSEVSRSAmJiBsYXN0X2l4ICE9IGl4ICYmIGl4IDwgZGV2aWNlc19uZWVkZWQgKyBhbGxvY19zdGF0ZS0+bG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkKSB8fAorCQkvKiBXaXRoIGNsaW5nX3RvX2FsbG9jZWQgYW5kIG5vcm1hbCwgaWYgdGhlcmUgd2VyZSBnYXBzIGluIHRoZSBwcmVmZXJyZWQgYXJlYXMsIGhhdmUgYSBzZWNvbmQgaXRlcmF0aW9uICovCisJCSAoYWxsb2NfcGFybXMtPmFsbG9jID09IEFMTE9DX05PUk1BTCAmJiBwcmVmZXJyZWRfY291bnQgJiYKKwkJICAocHJlZmVycmVkX2NvdW50IDwgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzIHx8IGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQpICYmCisJCSAgKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQ0xJTkdfVE9fQUxMT0NFRCkgJiYgIWl0ZXJhdGlvbl9jb3VudCsrKSB8fAorCQkvKiBFeHRyYSBpdGVyYXRpb24gbmVlZGVkIHRvIGZpbGwgbG9nIGFyZWFzIG9uIFBWcyBhbHJlYWR5IHVzZWQ/ICovCisJCSAoYWxsb2NfcGFybXMtPmFsbG9jID09IEFMTE9DX05PUk1BTCAmJiBwcmVmZXJyZWRfY291bnQgPT0gYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzICYmICFhaC0+bWlycm9yX2xvZ3Nfc2VwYXJhdGUgJiYKKwkJICAoaXggKyBwcmVmZXJyZWRfY291bnQgPj0gZGV2aWNlc19uZWVkZWQpICYmCisJCSAgKGl4ICsgcHJlZmVycmVkX2NvdW50IDwgZGV2aWNlc19uZWVkZWQgKyBhbGxvY19zdGF0ZS0+bG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkKSAmJiAhbG9nX2l0ZXJhdGlvbl9jb3VudCsrKSk7CisKKwkvKiBOb24temVybyBpeCBtZWFucyBhdCBsZWFzdCBvbmUgVVNFX0FSRUEgd2FzIHJldHVybmVkICovCisJaWYgKHByZWZlcnJlZF9jb3VudCA8IGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyAmJiAhKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfQ0xJTkdfVE9fQUxMT0NFRCkgJiYgIWl4KQorCQlyZXR1cm4gMTsKKworCWlmIChpeCArIHByZWZlcnJlZF9jb3VudCA8IGRldmljZXNfbmVlZGVkICsgYWxsb2Nfc3RhdGUtPmxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZCkKKwkJcmV0dXJuIDE7CisKKwkvKiBTb3J0IHRoZSBhcmVhcyBzbyB3ZSBhbGxvY2F0ZSBmcm9tIHRoZSBiaWdnZXN0ICovCisJaWYgKGxvZ19pdGVyYXRpb25fY291bnQpIHsKKwkJaWYgKGl4ID4gZGV2aWNlc19uZWVkZWQgKyAxKSB7CisJCQlsb2dfZGVidWdfYWxsb2MoIlNvcnRpbmcgJXUgbG9nIGFyZWFzIiwgaXggLSBkZXZpY2VzX25lZWRlZCk7CisJCQlxc29ydChhbGxvY19zdGF0ZS0+YXJlYXMgKyBkZXZpY2VzX25lZWRlZCwgaXggLSBkZXZpY2VzX25lZWRlZCwgc2l6ZW9mKCphbGxvY19zdGF0ZS0+YXJlYXMpLAorCQkJICAgICAgX2NvbXBfYXJlYSk7CisJCX0KKwl9IGVsc2UgaWYgKGl4ID4gMSkgeworCQlsb2dfZGVidWdfYWxsb2MoIlNvcnRpbmcgJXUgYXJlYXMiLCBpeCk7CisJCXFzb3J0KGFsbG9jX3N0YXRlLT5hcmVhcyArIGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcywgaXgsIHNpemVvZigqYWxsb2Nfc3RhdGUtPmFyZWFzKSwKKwkJICAgICAgX2NvbXBfYXJlYSk7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIGdhcHMgaW4gb3VyIHByZWZlcnJlZCBhcmVhcywgZmlsbCB0aGVtIGZyb20gdGhlIHNvcnRlZCBwYXJ0IG9mIHRoZSBhcnJheSAqLworCWlmIChwcmVmZXJyZWRfY291bnQgJiYgcHJlZmVycmVkX2NvdW50ICE9IGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcykgeworCQlmb3IgKHMgPSAwOyBzIDwgZGV2aWNlc19uZWVkZWQ7IHMrKykKKwkJCWlmICghYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnB2YSkgeworCQkJCWFsbG9jX3N0YXRlLT5hcmVhc1tzXS5wdmEgPSBhbGxvY19zdGF0ZS0+YXJlYXNbYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzXS5wdmE7CisJCQkJYWxsb2Nfc3RhdGUtPmFyZWFzW3NdLnVzZWQgPSBhbGxvY19zdGF0ZS0+YXJlYXNbYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzXS51c2VkOworCQkJCWFsbG9jX3N0YXRlLT5hcmVhc1thbGxvY19zdGF0ZS0+bnVtX3Bvc2l0aW9uYWxfYXJlYXMrK10ucHZhID0gTlVMTDsKKwkJCX0KKwl9CisKKwkvKgorCSAqIEZpcnN0IHRpbWUgYXJvdW5kLCBpZiB0aGVyZSdzIGEgbG9nLCBhbGxvY2F0ZSBpdCBvbiB0aGUKKwkgKiBzbWFsbGVzdCBkZXZpY2UgdGhhdCBoYXMgc3BhY2UgZm9yIGl0LgorCSAqLworCXRvb19zbWFsbF9mb3JfbG9nX2NvdW50ID0gMDsKKwlpeF9sb2dfb2Zmc2V0ID0gMDsKKworCS8qIEZJWE1FIFRoaXMgbG9naWMgaXMgZHVlIHRvIGl0cyBoZXJpdGFnZSBhbmQgY2FuIGJlIHNpbXBsaWZpZWQhICovCisJaWYgKGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQpIHsKKwkJLyogSG93IG1hbnkgYXJlYXMgYXJlIHRvbyBzbWFsbCBmb3IgdGhlIGxvZz8gKi8KKwkJd2hpbGUgKHRvb19zbWFsbF9mb3JfbG9nX2NvdW50IDwgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzICsgaXggJiYKKwkJICAgICAgICgqKGFsbG9jX3N0YXRlLT5hcmVhcyArIGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyArIGl4IC0gMSAtCisJCQkgIHRvb19zbWFsbF9mb3JfbG9nX2NvdW50KSkudXNlZCA8IGFoLT5sb2dfbGVuKQorCQkJdG9vX3NtYWxsX2Zvcl9sb2dfY291bnQrKzsKKwkJaXhfbG9nX29mZnNldCA9IGFsbG9jX3N0YXRlLT5udW1fcG9zaXRpb25hbF9hcmVhcyArIGl4IC0gdG9vX3NtYWxsX2Zvcl9sb2dfY291bnQgLSBhaC0+bG9nX2FyZWFfY291bnQ7CisJfQorCisJaWYgKGl4ICsgYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzIDwgZGV2aWNlc19uZWVkZWQgKworCSAgICAoYWxsb2Nfc3RhdGUtPmxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZCA/IGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQgKworCQkJCSAgICB0b29fc21hbGxfZm9yX2xvZ19jb3VudCA6IDApKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogRklYTUUgV2Ugc2hvdWxkIGNoYW5nZSB0aGUgY29kZSB0byBkbyBzZXBhcmF0ZSBjYWxscyBmb3IgdGhlIGxvZyBhbGxvY2F0aW9uCisJICogYW5kIHRoZSBkYXRhIGFsbG9jYXRpb24gc28gdGhhdCBfbGltaXRfdG9fb25lX2FyZWFfcGVyX3RhZyBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MKKwkgKiB3aGVyZSB0aGUgc3BsaXQgaXMgZ29pbmcgdG8gb2NjdXIuCisJICovCisKKwkvKgorCSAqIFRoaXMgY29kZSBjb3ZlcnMgdGhlIGluaXRpYWwgYWxsb2NhdGlvbiAtIGFmdGVyIHRoYXQgdGhlcmUgaXMgc29tZXRoaW5nIHRvICdjbGluZycgdG8KKwkgKiBhbmQgd2Ugc2hvdWxkbid0IGdldCB0aGlzIGZhci4KKwkgKiBhbGxvY19zdGF0ZS0+bnVtX3Bvc2l0aW9uYWxfYXJlYXMgaXMgYXNzdW1lZCB0byBiZSAwIHdpdGggQV9QQVJUSVRJT05fQllfVEFHUy4KKwkgKgorCSAqIEZJWE1FIENvbnNpZGVyIGEgc2Vjb25kIGF0dGVtcHQgd2l0aCBBX1BBUlRJVElPTl9CWV9UQUdTIGlmLCBmb3IgZXhhbXBsZSwgdGhlIGxhcmdlc3QgYXJlYQorCSAqIGhhZCBhbGwgdGhlIHRhZ3Mgc2V0LCBidXQgb3RoZXIgYXJlYXMgZG9uJ3QuCisJICovCisJaWYgKChhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX1BBUlRJVElPTl9CWV9UQUdTKSAmJiAhYWxsb2Nfc3RhdGUtPm51bV9wb3NpdGlvbmFsX2FyZWFzKSB7CisJCWlmICghX2xpbWl0X3RvX29uZV9hcmVhX3Blcl90YWcoYWgsIGFsbG9jX3N0YXRlLCBpeF9sb2dfb2Zmc2V0LCAmaXgpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogUmVjYWxjdWxhdGUgbG9nIHBvc2l0aW9uIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSByZW1vdmVkIHNvbWUgYXJlYXMgZnJvbSBjb25zaWRlcmF0aW9uICovCisJCWlmIChhbGxvY19zdGF0ZS0+bG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkKSB7CisJCQkvKiBIb3cgbWFueSBhcmVhcyBhcmUgdG9vIHNtYWxsIGZvciB0aGUgbG9nPyAqLworCQkJdG9vX3NtYWxsX2Zvcl9sb2dfY291bnQgPSAwOworCQkJd2hpbGUgKHRvb19zbWFsbF9mb3JfbG9nX2NvdW50IDwgaXggJiYKKwkJCSAgICAgICAoKihhbGxvY19zdGF0ZS0+YXJlYXMgKyBpeCAtIDEgLSB0b29fc21hbGxfZm9yX2xvZ19jb3VudCkpLnB2YSAmJgorCQkJICAgICAgICgqKGFsbG9jX3N0YXRlLT5hcmVhcyArIGl4IC0gMSAtIHRvb19zbWFsbF9mb3JfbG9nX2NvdW50KSkudXNlZCA8IGFoLT5sb2dfbGVuKQorCQkJCXRvb19zbWFsbF9mb3JfbG9nX2NvdW50Kys7CisJCQlpZiAoaXggPCB0b29fc21hbGxfZm9yX2xvZ19jb3VudCArIGFoLT5sb2dfYXJlYV9jb3VudCkKKwkJCQlyZXR1cm4gMTsKKwkJCWl4X2xvZ19vZmZzZXQgPSBpeCAtIHRvb19zbWFsbF9mb3JfbG9nX2NvdW50IC0gYWgtPmxvZ19hcmVhX2NvdW50OworCQl9CisKKwkJaWYgKGl4IDwgZGV2aWNlc19uZWVkZWQgKworCQkgICAgKGFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQgPyBhbGxvY19zdGF0ZS0+bG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkICsKKwkJCQkJICAgIHRvb19zbWFsbF9mb3JfbG9nX2NvdW50IDogMCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgYWRkIHRoZSBzcGFjZSBpZGVudGlmaWVkIHRvIHRoZSBsaXN0IG9mIGFyZWFzIHRvIGJlIHVzZWQuCisJICovCisJaWYgKCFfYWxsb2NfcGFyYWxsZWxfYXJlYShhaCwgbWF4X3RvX2FsbG9jYXRlLCBhbGxvY19zdGF0ZSwgaXhfbG9nX29mZnNldCkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBMb2cgaXMgYWx3YXlzIGFsbG9jYXRlZCBmaXJzdCB0aW1lLgorCSAqLworCWFsbG9jX3N0YXRlLT5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDaG9vc2Ugc2V0cyBvZiBwYXJhbGxlbCBhcmVhcyB0byB1c2UsIHJlc3BlY3RpbmcgYW55IGNvbnN0cmFpbnRzCisgKiBzdXBwbGllZCBpbiBhbGxvY19wYXJtcy4KKyAqLworc3RhdGljIGludCBfZmluZF9tYXhfcGFyYWxsZWxfc3BhY2VfZm9yX29uZV9wb2xpY3koc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHN0cnVjdCBhbGxvY19wYXJtcyAqYWxsb2NfcGFybXMsCisJCQkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqcHZtcywgc3RydWN0IGFsbG9jX3N0YXRlICphbGxvY19zdGF0ZSkKK3sKKwl1aW50MzJfdCBtYXhfdG1wOworCXVpbnQzMl90IG1heF90b19hbGxvY2F0ZTsJLyogTWF4aW11bSBleHRlbnRzIHRvIGFsbG9jYXRlIHRoaXMgdGltZSAqLworCXVpbnQzMl90IG9sZF9hbGxvY2F0ZWQ7CisJdWludDMyX3QgbmV4dF9sZTsKKwlzdHJ1Y3Qgc2VnX3B2cyAqc3B2czsKKwlzdHJ1Y3QgZG1fbGlzdCAqcGFyYWxsZWxfcHZzOworCisJYWxsb2Nfc3RhdGUtPmFsbG9jX3Bhcm1zID0gYWxsb2NfcGFybXM7CisKKwkvKiBGSVhNRSBUaGlzIGFsZ29yaXRobSBuZWVkcyBhIGxvdCBvZiBjbGVhbmluZyB1cCEgKi8KKwkvKiBGSVhNRSBhbnl3aGVyZSBkb2Vzbid0IGZpbmQgYWxsIHNwYWNlIHlldCAqLworCWRvIHsKKwkJcGFyYWxsZWxfcHZzID0gTlVMTDsKKwkJbWF4X3RvX2FsbG9jYXRlID0gYWxsb2NfcGFybXMtPmV4dGVudHNfc3RpbGxfbmVlZGVkIC0gYWxsb2Nfc3RhdGUtPmFsbG9jYXRlZDsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgZXhpc3RpbmcgcGFyYWxsZWwgUFZzLCBhdm9pZCB0aGVtIGFuZCByZWR1Y2UKKwkJICogdGhlIG1heGltdW0gd2UgY2FuIGFsbG9jYXRlIGluIG9uZSBnbyBhY2NvcmRpbmdseS4KKwkJICovCisJCWlmIChhaC0+cGFyYWxsZWxfYXJlYXMpIHsKKwkJCW5leHRfbGUgPSAoYWxsb2NfcGFybXMtPnByZXZfbHZzZWcgPyBhbGxvY19wYXJtcy0+cHJldl9sdnNlZy0+bGUgKyBhbGxvY19wYXJtcy0+cHJldl9sdnNlZy0+bGVuIDogMCkgKyBhbGxvY19zdGF0ZS0+YWxsb2NhdGVkIC8gYWgtPmFyZWFfbXVsdGlwbGU7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3B2cywgYWgtPnBhcmFsbGVsX2FyZWFzKSB7CisJCQkJaWYgKG5leHRfbGUgPj0gc3B2cy0+bGUgKyBzcHZzLT5sZW4pCisJCQkJCWNvbnRpbnVlOworCisJCQkJbWF4X3RtcCA9IG1heF90b19hbGxvY2F0ZSArCisJCQkJCWFsbG9jX3N0YXRlLT5hbGxvY2F0ZWQ7CisKKwkJCQkvKgorCQkJCSAqIEJlY2F1c2UgYSByZXF1ZXN0IHRoYXQgZ3JvdXBzIG1ldGFkYXRhIGFuZAorCQkJCSAqIGRhdGEgdG9nZXRoZXIgd2lsbCBiZSBzcGxpdCwgd2UgbXVzdCBhZGp1c3QKKwkJCQkgKiB0aGUgY29tcGFyaXNvbiBhY2NvcmRpbmdseS4KKwkJCQkgKi8KKwkJCQlpZiAoYWgtPmFsbG9jX2FuZF9zcGxpdF9tZXRhICYmICFhaC0+c3BsaXRfbWV0YWRhdGFfaXNfYWxsb2NhdGVkKQorCQkJCQltYXhfdG1wIC09IGFoLT5sb2dfbGVuOworCQkJCWlmIChtYXhfdG1wID4gKHNwdnMtPmxlICsgc3B2cy0+bGVuKSAqIGFoLT5hcmVhX211bHRpcGxlKSB7CisJCQkJCW1heF90b19hbGxvY2F0ZSA9IChzcHZzLT5sZSArIHNwdnMtPmxlbikgKiBhaC0+YXJlYV9tdWx0aXBsZSAtIGFsbG9jX3N0YXRlLT5hbGxvY2F0ZWQ7CisJCQkJCW1heF90b19hbGxvY2F0ZSArPSAoYWgtPmFsbG9jX2FuZF9zcGxpdF9tZXRhICYmICFhaC0+c3BsaXRfbWV0YWRhdGFfaXNfYWxsb2NhdGVkKSA/IGFoLT5sb2dfbGVuIDogMDsKKwkJCQl9CisJCQkJcGFyYWxsZWxfcHZzID0gJnNwdnMtPnB2czsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW9sZF9hbGxvY2F0ZWQgPSBhbGxvY19zdGF0ZS0+YWxsb2NhdGVkOworCisJCWlmICghX2ZpbmRfc29tZV9wYXJhbGxlbF9zcGFjZShhaCwgcHZtcywgYWxsb2Nfc3RhdGUsIHBhcmFsbGVsX3B2cywgbWF4X3RvX2FsbG9jYXRlKSkKKwkJCXJldHVybl8wOworCisJCS8qCisJCSAqIEZvciBBTExPQ19DTElORywgaWYgdGhlIG51bWJlciBvZiBhcmVhcyBtYXRjaGVzIGFuZCBtYXhpbWlzZV9jbGluZyBpcworCQkgKiBzZXQgd2UgYWxsb3cgdHdvIHBhc3NlcywgZmlyc3Qgd2l0aCBBX1BPU0lUSU9OQUxfRklMTCB0aGVuIHdpdGhvdXQuCisJCSAqCisJCSAqIElmIHdlIGRpZG4ndCBhbGxvY2F0ZSBhbnl0aGluZyB0aGlzIHRpbWUgd2l0aCBBTExPQ19OT1JNQUwgYW5kIGhhZAorCQkgKiBBX0NMSU5HX1RPX0FMTE9DRUQgc2V0LCB0cnkgYWdhaW4gd2l0aG91dCBpdC4KKwkJICoKKwkJICogRm9yIEFMTE9DX05PUk1BTCwgaWYgd2UgZGlkIGFsbG9jYXRlIHNvbWV0aGluZyB3aXRob3V0IHRoZQorCQkgKiBmbGFnIHNldCwgc2V0IGl0IGFuZCBjb250aW51ZSBzbyB0aGF0IGZ1cnRoZXIgYWxsb2NhdGlvbnMKKwkJICogcmVtYWluIG9uIHRoZSBzYW1lIGRpc2tzIHdoZXJlIHBvc3NpYmxlLgorCQkgKi8KKwkJaWYgKG9sZF9hbGxvY2F0ZWQgPT0gYWxsb2Nfc3RhdGUtPmFsbG9jYXRlZCkgeworCQkJaWYgKGFoLT5tYXhpbWlzZV9jbGluZyAmJiAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19DTElORykgfHwgKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19DTElOR19CWV9UQUdTKSkgJiYKKwkJCSAgICAoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19MVlNFRykgJiYgKGFsbG9jX3Bhcm1zLT5mbGFncyAmIEFfUE9TSVRJT05BTF9GSUxMKSkKKwkJCQlhbGxvY19wYXJtcy0+ZmxhZ3MgJj0gfkFfUE9TSVRJT05BTF9GSUxMOworCQkJZWxzZSBpZiAoKGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19OT1JNQUwpICYmIChhbGxvY19wYXJtcy0+ZmxhZ3MgJiBBX0NMSU5HX1RPX0FMTE9DRUQpKQorCQkJCWFsbG9jX3Bhcm1zLT5mbGFncyAmPSB+QV9DTElOR19UT19BTExPQ0VEOworCQkJZWxzZQorCQkJCWJyZWFrOwkvKiBHaXZlIHVwICovCisJCX0gZWxzZSBpZiAoYWgtPm1heGltaXNlX2NsaW5nICYmIGFsbG9jX3Bhcm1zLT5hbGxvYyA9PSBBTExPQ19OT1JNQUwgJiYKKwkJCSAgICEoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DTElOR19UT19BTExPQ0VEKSkKKwkJCWFsbG9jX3Bhcm1zLT5mbGFncyB8PSBBX0NMSU5HX1RPX0FMTE9DRUQ7CisJfSB3aGlsZSAoKGFsbG9jX3Bhcm1zLT5hbGxvYyAhPSBBTExPQ19DT05USUdVT1VTKSAmJiBhbGxvY19zdGF0ZS0+YWxsb2NhdGVkICE9IGFsbG9jX3Bhcm1zLT5leHRlbnRzX3N0aWxsX25lZWRlZCAmJiAoYWxsb2NfcGFybXMtPmZsYWdzICYgQV9DQU5fU1BMSVQpICYmICghYWgtPmFwcHJveF9hbGxvYyB8fCBwdl9tYXBzX3NpemUocHZtcykpKTsKKworCXJldHVybiAxOworfQorCisvKgorICogQWxsb2NhdGUgc2V2ZXJhbCBzZWdtZW50cywgZWFjaCB0aGUgc2FtZSBzaXplLCBpbiBwYXJhbGxlbC4KKyAqIElmIG1pcnJvcmVkX3B2IGFuZCBtaXJyb3JlZF9wZSBhcmUgc3VwcGxpZWQsIGl0IGlzIHVzZWQgYXMKKyAqIHRoZSBmaXJzdCBhcmVhLCBhbmQgYWRkaXRpb25hbCBhcmVhcyBhcmUgYWxsb2NhdGVkIHBhcmFsbGVsIHRvIGl0LgorICovCitzdGF0aWMgaW50IF9hbGxvY2F0ZShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIHVuc2lnbmVkIGNhbl9zcGxpdCwKKwkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzKQoreworCXVpbnQzMl90IG9sZF9hbGxvY2F0ZWQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnByZXZfbHZzZWcgPSBOVUxMOworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZtczsKKwlhbGxvY19wb2xpY3lfdCBhbGxvYzsKKwlzdHJ1Y3QgYWxsb2NfcGFybXMgYWxsb2NfcGFybXM7CisJc3RydWN0IGFsbG9jX3N0YXRlIGFsbG9jX3N0YXRlOworCisJYWxsb2Nfc3RhdGUuYWxsb2NhdGVkID0gbHYgPyBsdi0+bGVfY291bnQgOiAwOworCisJaWYgKGFsbG9jX3N0YXRlLmFsbG9jYXRlZCA+PSBhaC0+bmV3X2V4dGVudHMgJiYgIWFoLT5sb2dfYXJlYV9jb3VudCkgeworCQlsb2dfd2FybigiX2FsbG9jYXRlIGNhbGxlZCB3aXRoIG5vIHdvcmsgdG8gZG8hIik7CisJCXJldHVybiAxOworCX0KKworICAgICAgICBpZiAoYWgtPmFyZWFfbXVsdGlwbGUgPiAxICYmCisgICAgICAgICAgICAoYWgtPm5ld19leHRlbnRzIC0gYWxsb2Nfc3RhdGUuYWxsb2NhdGVkKSAlIGFoLT5hcmVhX211bHRpcGxlKSB7CisJCWxvZ19lcnJvcigiTnVtYmVyIG9mIGV4dGVudHMgcmVxdWVzdGVkICgiIEZNVHUzMiAiKSBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgIiBGTVR1MzIgIi4iLAorCQkJICBhaC0+bmV3X2V4dGVudHMgLSBhbGxvY19zdGF0ZS5hbGxvY2F0ZWQsCisJCQkgIGFoLT5hcmVhX211bHRpcGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYWxsb2Nfc3RhdGUubG9nX2FyZWFfY291bnRfc3RpbGxfbmVlZGVkID0gYWgtPmxvZ19hcmVhX2NvdW50OworCisJaWYgKGFoLT5hbGxvYyA9PSBBTExPQ19DT05USUdVT1VTKQorCQljYW5fc3BsaXQgPSAwOworCisJaWYgKGx2ICYmICFkbV9saXN0X2VtcHR5KCZsdi0+c2VnbWVudHMpKQorCQlwcmV2X2x2c2VnID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfbGFzdCgmbHYtPnNlZ21lbnRzKSwKKwkJCQkgICAgICAgc3RydWN0IGx2X3NlZ21lbnQpOworCS8qCisJICogQnVpbGQgdGhlIHNldHMgb2YgYXZhaWxhYmxlIGFyZWFzIG9uIHRoZSBwdidzLgorCSAqLworCWlmICghKHB2bXMgPSBjcmVhdGVfcHZfbWFwcyhhaC0+bWVtLCB2ZywgYWxsb2NhdGFibGVfcHZzKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfbG9nX3BhcmFsbGVsX2FyZWFzKGFoLT5tZW0sIGFoLT5wYXJhbGxlbF9hcmVhcykpCisJCXN0YWNrOworCisJYWxsb2Nfc3RhdGUuYXJlYXNfc2l6ZSA9IGRtX2xpc3Rfc2l6ZShwdm1zKTsKKwlpZiAoYWxsb2Nfc3RhdGUuYXJlYXNfc2l6ZSAmJgorCSAgICBhbGxvY19zdGF0ZS5hcmVhc19zaXplIDwgKGFoLT5hcmVhX2NvdW50ICsgYWgtPnBhcml0eV9jb3VudCArIGFoLT5sb2dfYXJlYV9jb3VudCkpIHsKKwkJaWYgKGFoLT5hbGxvYyAhPSBBTExPQ19BTllXSEVSRSAmJiBhaC0+bWlycm9yX2xvZ3Nfc2VwYXJhdGUpIHsKKwkJCWxvZ19lcnJvcigiTm90IGVub3VnaCBQVnMgd2l0aCBmcmVlIHNwYWNlIGF2YWlsYWJsZSAiCisJCQkJICAiZm9yIHBhcmFsbGVsIGFsbG9jYXRpb24uIik7CisJCQlsb2dfZXJyb3IoIkNvbnNpZGVyIC0tYWxsb2MgYW55d2hlcmUgaWYgZGVzcGVyYXRlLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYWxsb2Nfc3RhdGUuYXJlYXNfc2l6ZSA9IGFoLT5hcmVhX2NvdW50ICsgYWgtPnBhcml0eV9jb3VudCArIGFoLT5sb2dfYXJlYV9jb3VudDsKKwl9CisKKwkvKiBVcHBlciBib3VuZCBpZiBub25lIG9mIHRoZSBQVnMgaW4gcHJldl9sdnNlZyBpcyBpbiBwdm1zICovCisJLyogRklYTUUgV29yayBzaXplIG91dCBwcm9wZXJseSAqLworCWlmIChwcmV2X2x2c2VnKQorCQlhbGxvY19zdGF0ZS5hcmVhc19zaXplICs9IF9zdHJpcGVzX3Blcl9taW1hZ2UocHJldl9sdnNlZykgKiBwcmV2X2x2c2VnLT5hcmVhX2NvdW50OworCisJLyogQWxsb2NhdGUgYW4gYXJyYXkgb2YgcHZfYXJlYXMgdG8gaG9sZCB0aGUgbGFyZ2VzdCBzcGFjZSBvbiBlYWNoIFBWICovCisJaWYgKCEoYWxsb2Nfc3RhdGUuYXJlYXMgPSBkbV9tYWxsb2Moc2l6ZW9mKCphbGxvY19zdGF0ZS5hcmVhcykgKiBhbGxvY19zdGF0ZS5hcmVhc19zaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBhcmVhcyBhcnJheS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBjbGluZyBpbmNsdWRlcyBpbXBsaWNpdCBjbGluZ19ieV90YWdzCisJICogYnV0IGl0IGRvZXMgbm90aGluZyB1bmxlc3MgdGhlIGx2bS5jb25mIHNldHRpbmcgaXMgcHJlc2VudC4KKwkgKi8KKwlpZiAoYWgtPmFsbG9jID09IEFMTE9DX0NMSU5HKQorCQlhaC0+YWxsb2MgPSBBTExPQ19DTElOR19CWV9UQUdTOworCisJLyogQXR0ZW1wdCBlYWNoIGRlZmluZWQgYWxsb2NhdGlvbiBwb2xpY3kgaW4gdHVybiAqLworCWZvciAoYWxsb2MgPSBBTExPQ19DT05USUdVT1VTOyBhbGxvYyA8PSBhaC0+YWxsb2M7IGFsbG9jKyspIHsKKwkJLyogU2tpcCBjbGluZ19ieV90YWdzIGlmIG5vIGxpc3QgZGVmaW5lZCAqLworCQlpZiAoYWxsb2MgPT0gQUxMT0NfQ0xJTkdfQllfVEFHUyAmJiAhYWgtPmNsaW5nX3RhZ19saXN0X2NuKQorCQkJY29udGludWU7CisJCW9sZF9hbGxvY2F0ZWQgPSBhbGxvY19zdGF0ZS5hbGxvY2F0ZWQ7CisJCWxvZ19kZWJ1Z19hbGxvYygiVHJ5aW5nIGFsbG9jYXRpb24gdXNpbmcgJXMgcG9saWN5LiIsIGdldF9hbGxvY19zdHJpbmcoYWxsb2MpKTsKKworCQlpZiAoIWFoLT5hcHByb3hfYWxsb2MgJiYgIV9zdWZmaWNpZW50X3Blc19mcmVlKGFoLCBwdm1zLCBhbGxvY19zdGF0ZS5hbGxvY2F0ZWQsIGFoLT5uZXdfZXh0ZW50cykpCisJCQlnb3RvX291dDsKKworCQlfaW5pdF9hbGxvY19wYXJtcyhhaCwgJmFsbG9jX3Bhcm1zLCBhbGxvYywgcHJldl9sdnNlZywKKwkJCQkgIGNhbl9zcGxpdCwgYWxsb2Nfc3RhdGUuYWxsb2NhdGVkLAorCQkJCSAgYWgtPm5ld19leHRlbnRzKTsKKworCQlpZiAoIV9maW5kX21heF9wYXJhbGxlbF9zcGFjZV9mb3Jfb25lX3BvbGljeShhaCwgJmFsbG9jX3Bhcm1zLCBwdm1zLCAmYWxsb2Nfc3RhdGUpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKChhbGxvY19zdGF0ZS5hbGxvY2F0ZWQgPT0gYWgtPm5ld19leHRlbnRzICYmCisJCSAgICAgIWFsbG9jX3N0YXRlLmxvZ19hcmVhX2NvdW50X3N0aWxsX25lZWRlZCkgfHwKKwkJICAgICghY2FuX3NwbGl0ICYmIChhbGxvY19zdGF0ZS5hbGxvY2F0ZWQgIT0gb2xkX2FsbG9jYXRlZCkpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGFsbG9jX3N0YXRlLmFsbG9jYXRlZCAhPSBhaC0+bmV3X2V4dGVudHMpIHsKKwkJaWYgKCFhaC0+YXBwcm94X2FsbG9jKSB7CisJCQlsb2dfZXJyb3IoIkluc3VmZmljaWVudCBzdWl0YWJsZSAlc2FsbG9jYXRhYmxlIGV4dGVudHMgIgorCQkJCSAgImZvciBsb2dpY2FsIHZvbHVtZSAlczogJXUgbW9yZSByZXF1aXJlZCIsCisJCQkJICBjYW5fc3BsaXQgPyAiIiA6ICJjb250aWd1b3VzICIsCisJCQkJICBsdiA/IGx2LT5uYW1lIDogIiIsCisJCQkJICAoYWgtPm5ld19leHRlbnRzIC0gYWxsb2Nfc3RhdGUuYWxsb2NhdGVkKSAqCisJCQkJICBhaC0+YXJlYV9jb3VudCAvIGFoLT5hcmVhX211bHRpcGxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICghYWxsb2Nfc3RhdGUuYWxsb2NhdGVkKSB7CisJCQlsb2dfZXJyb3IoIkluc3VmZmljaWVudCBzdWl0YWJsZSAlc2FsbG9jYXRhYmxlIGV4dGVudHMgIgorCQkJCSAgImZvdW5kIGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCSAgY2FuX3NwbGl0ID8gIiIgOiAiY29udGlndW91cyAiLAorCQkJCSAgbHYgPyBsdi0+bmFtZSA6ICIiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvZ192ZXJib3NlKCJGb3VuZCBmZXdlciAlc2FsbG9jYXRhYmxlIGV4dGVudHMgIgorCQkJICAgICJmb3IgbG9naWNhbCB2b2x1bWUgJXMgdGhhbiByZXF1ZXN0ZWQ6IHVzaW5nICUiIFBSSXUzMiAiIGV4dGVudHMgKHJlZHVjZWQgYnkgJXUpLiIsCisJCQkgICAgY2FuX3NwbGl0ID8gIiIgOiAiY29udGlndW91cyAiLAorCQkJICAgIGx2ID8gbHYtPm5hbWUgOiAiIiwKKwkJCSAgICBhbGxvY19zdGF0ZS5hbGxvY2F0ZWQsCisJCQkgICAgKGFoLT5uZXdfZXh0ZW50cyAtIGFsbG9jX3N0YXRlLmFsbG9jYXRlZCkgKiBhaC0+YXJlYV9jb3VudCAvIGFoLT5hcmVhX211bHRpcGxlKTsKKwkJYWgtPm5ld19leHRlbnRzID0gYWxsb2Nfc3RhdGUuYWxsb2NhdGVkOworCX0KKworCWlmIChhbGxvY19zdGF0ZS5sb2dfYXJlYV9jb3VudF9zdGlsbF9uZWVkZWQpIHsKKwkJbG9nX2Vycm9yKCJJbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBmb3IgbG9nIGFsbG9jYXRpb24gIgorCQkJICAiZm9yIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkgIGx2ID8gbHYtPm5hbWUgOiAiIik7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSAxOworCisgICAgICBvdXQ6CisJZG1fZnJlZShhbGxvY19zdGF0ZS5hcmVhcyk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBsdl9hZGRfdmlydHVhbF9zZWdtZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQ2NF90IHN0YXR1cywKKwkJCSAgIHVpbnQzMl90IGV4dGVudHMsIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmICghZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ21lbnRzKSAmJgorCSAgICAoc2VnID0gbGFzdF9zZWcobHYpKSAmJiAoc2VnLT5zZWd0eXBlID09IHNlZ3R5cGUpKSB7CisJCXNlZy0+YXJlYV9sZW4gKz0gZXh0ZW50czsKKwkJc2VnLT5sZW4gKz0gZXh0ZW50czsKKwl9IGVsc2UgeworCQlpZiAoIShzZWcgPSBhbGxvY19sdl9zZWdtZW50KHNlZ3R5cGUsIGx2LCBsdi0+bGVfY291bnQsIGV4dGVudHMsCisJCQkJCSAgICAgc3RhdHVzLCAwLCBOVUxMLCAwLAorCQkJCQkgICAgIGV4dGVudHMsIDAsIDAsIDAsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgJXMgc2VnbWVudC4iLCBzZWd0eXBlLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWx2LT5zdGF0dXMgfD0gVklSVFVBTDsKKwkJZG1fbGlzdF9hZGQoJmx2LT5zZWdtZW50cywgJnNlZy0+bGlzdCk7CisJfQorCisJbHYtPmxlX2NvdW50ICs9IGV4dGVudHM7CisJbHYtPnNpemUgKz0gKHVpbnQ2NF90KSBleHRlbnRzICpsdi0+dmctPmV4dGVudF9zaXplOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQcmVwYXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBhbGxvY2F0aW9uIGF0dGVtcHQKKyAqIHN0cmlwZXMgYW5kIG1pcnJvcnMgcmVmZXIgdG8gdGhlIHBhcmFsbGVsIGFyZWFzIHVzZWQgZm9yIGRhdGEuCisgKiBJZiBsb2dfYXJlYV9jb3VudCA+IDEgaXQgaXMgYWx3YXlzIG1pcnJvcmVkIChub3Qgc3RyaXBlZCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWxsb2NfaGFuZGxlICpfYWxsb2NfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJCQkJYWxsb2NfcG9saWN5X3QgYWxsb2MsIGludCBhcHByb3hfYWxsb2MsCisJCQkJCXVpbnQzMl90IGV4aXN0aW5nX2V4dGVudHMsCisJCQkJCXVpbnQzMl90IG5ld19leHRlbnRzLAorCQkJCQl1aW50MzJfdCBtaXJyb3JzLAorCQkJCQl1aW50MzJfdCBzdHJpcGVzLAorCQkJCQl1aW50MzJfdCBtZXRhZGF0YV9hcmVhX2NvdW50LAorCQkJCQl1aW50MzJfdCBleHRlbnRfc2l6ZSwKKwkJCQkJdWludDMyX3QgcmVnaW9uX3NpemUsCisJCQkJCXN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9hcmVhcykKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBhbGxvY19oYW5kbGUgKmFoOworCXVpbnQzMl90IHMsIGFyZWFfY291bnQsIGFsbG9jX2NvdW50LCBwYXJpdHlfY291bnQsIHRvdGFsX2V4dGVudHM7CisJc2l6ZV90IHNpemUgPSAwOworCisJaWYgKHNlZ3R5cGVfaXNfdmlydHVhbChzZWd0eXBlKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9hbGxvY19pbml0IGNhbGxlZCBmb3IgdmlydHVhbCBzZWdtZW50LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBGSVhNRSBDYWxsZXIgc2hvdWxkIGVuc3VyZSB0aGlzICovCisJaWYgKG1pcnJvcnMgJiYgIXN0cmlwZXMpCisJCXN0cmlwZXMgPSAxOworCisJaWYgKG1pcnJvcnMgPiAxKQorCQlhcmVhX2NvdW50ID0gbWlycm9ycyAqIHN0cmlwZXM7CisJZWxzZQorCQlhcmVhX2NvdW50ID0gc3RyaXBlczsKKworCWlmICghKGFyZWFfY291bnQgKyBtZXRhZGF0YV9hcmVhX2NvdW50KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9hbGxvY19pbml0IGNhbGxlZCBmb3Igbm9uLXZpcnR1YWwgc2VnbWVudCB3aXRoIG5vIGRpc2sgc3BhY2UuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemUgPSBzaXplb2YoKmFoKTsKKworCS8qCisJICogSXQgaXMgYSByZXF1aXJlbWVudCB0aGF0IFJBSUQgNC81LzYgYXJlIGNyZWF0ZWQgd2l0aCBhIG51bWJlciBvZgorCSAqIHN0cmlwZXMgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBwYXJpdHkgZGV2aWNlcy4gIChlLmcKKwkgKiBSQUlENC81IG11c3QgaGF2ZSBhdCBsZWFzdCAyIHN0cmlwZXMgYW5kIFJBSUQ2IG11c3QgaGF2ZSBhdCBsZWFzdAorCSAqIDMuKSAgSXQgaXMgYWxzbyBhIGNvbnN0cmFpbnQgdGhhdCwgd2hlbiByZXBsYWNpbmcgaW5kaXZpZHVhbCBkZXZpY2VzCisJICogaW4gYSBSQUlEIDQvNS82IGFycmF5LCBubyBtb3JlIGRldmljZXMgY2FuIGJlIHJlcGxhY2VkIHRoYW4KKwkgKiB0aGVyZSBhcmUgcGFyaXR5IGRldmljZXMuICAoT3RoZXJ3aXNlLCB0aGVyZSB3b3VsZCBub3QgYmUgZW5vdWdoCisJICogcmVkdW5kYW5jeSB0byBtYWludGFpbiB0aGUgYXJyYXkuKSAgVW5kZXJzdGFuZGluZyB0aGVzZSB0d28KKwkgKiBjb25zdHJhaW50cyBhbGxvd3MgdXMgdG8gaW5mZXIgd2hldGhlciB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KKwkgKiBpcyBpbnRlbmRpbmcgdG8gYWxsb2NhdGUgYW4gZW50aXJlIGFycmF5IG9yIGp1c3QgcmVwbGFjZW1lbnQKKwkgKiBjb21wb25lbnQgZGV2aWNlcy4gIEluIHRoZSBmb3JtZXIgY2FzZSwgd2UgbXVzdCBhY2NvdW50IGZvciB0aGUKKwkgKiBuZWNlc3NhcnkgcGFyaXR5X2NvdW50LiAgSW4gdGhlIGxhdGVyIGNhc2UsIHdlIGRvIG5vdCBuZWVkIHRvCisJICogYWNjb3VudCBmb3IgdGhlIGV4dHJhIHBhcml0eSBkZXZpY2VzIGJlY2F1c2UgdGhlIGFycmF5IGFscmVhZHkKKwkgKiBleGlzdHMgYW5kIHRoZXkgb25seSB3YW50IHJlcGxhY2VtZW50IGRyaXZlcy4KKwkgKi8KKwlwYXJpdHlfY291bnQgPSAoYXJlYV9jb3VudCA8PSBzZWd0eXBlLT5wYXJpdHlfZGV2cykgPyAwIDogc2VndHlwZS0+cGFyaXR5X2RldnM7CisJYWxsb2NfY291bnQgPSBhcmVhX2NvdW50ICsgcGFyaXR5X2NvdW50OworCWlmIChzZWd0eXBlX2lzX3JhaWQoc2VndHlwZSkgJiYgbWV0YWRhdGFfYXJlYV9jb3VudCkKKwkJLyogUkFJRCBoYXMgYSBtZXRhIGFyZWEgZm9yIGVhY2ggZGV2aWNlICovCisJCWFsbG9jX2NvdW50ICo9IDI7CisJZWxzZQorCQkvKiBtaXJyb3JzIHNwZWNpZnkgdGhlaXIgZXhhY3QgbG9nIGNvdW50ICovCisJCWFsbG9jX2NvdW50ICs9IG1ldGFkYXRhX2FyZWFfY291bnQ7CisKKwlzaXplICs9IHNpemVvZihhaC0+YWxsb2NlZF9hcmVhc1swXSkgKiBhbGxvY19jb3VudDsKKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJhbGxvY2F0aW9uIiwgMTAyNCkpKSB7CisJCWxvZ19lcnJvcigiYWxsb2NhdGlvbiBwb29sIGNyZWF0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShhaCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZSkpKSB7CisJCWxvZ19lcnJvcigiYWxsb2NhdGlvbiBoYW5kbGUgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWFoLT5jbWQgPSBjbWQ7CisJYWgtPm1lbSA9IG1lbTsKKwlhaC0+YXJlYV9jb3VudCA9IGFyZWFfY291bnQ7CisJYWgtPnBhcml0eV9jb3VudCA9IHBhcml0eV9jb3VudDsKKwlhaC0+cmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZTsKKwlhaC0+YWxsb2MgPSBhbGxvYzsKKworCS8qCisJICogRm9yIHRoZSBwdXJwb3NlcyBvZiBhbGxvY2F0aW9uLCBhcmVhX2NvdW50IGFuZCBwYXJpdHlfY291bnQgYXJlCisJICoga2VwdCBzZXBhcmF0ZWx5LiAgSG93ZXZlciwgdGhlICdhcmVhX2NvdW50JyBmaWVsZCBpbiBhbgorCSAqIGx2X3NlZ21lbnQgaW5jbHVkZXMgYm90aDsgYW5kIHRoaXMgaXMgd2hhdCAnX2NhbGNfYXJlYV9tdWx0aXBsZScKKwkgKiBpcyBjYWxjdWxhdGVkIGZyb20uICBTbywgd2UgbXVzdCBwYXNzIGluIHRoZSB0b3RhbCBjb3VudCB0byBnZXQKKwkgKiBhIGNvcnJlY3QgYXJlYV9tdWx0aXBsZS4KKwkgKi8KKwlhaC0+YXJlYV9tdWx0aXBsZSA9IF9jYWxjX2FyZWFfbXVsdGlwbGUoc2VndHlwZSwgYXJlYV9jb3VudCArIHBhcml0eV9jb3VudCwgc3RyaXBlcyk7CisJLy9GSVhNRTogcy9taXJyb3JfbG9nc19zZXBhcmF0ZS9tZXRhZGF0YV9zZXBhcmF0ZS8gc28gaXQgY2FuIGJlIHVzZWQgYnkgb3RoZXJzPworCWFoLT5taXJyb3JfbG9nc19zZXBhcmF0ZSA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFsbG9jYXRpb25fbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnNfQ0ZHLCBOVUxMKTsKKworCWlmIChtaXJyb3JzIHx8IHN0cmlwZXMpCisJCXRvdGFsX2V4dGVudHMgPSBuZXdfZXh0ZW50czsKKwllbHNlCisJCXRvdGFsX2V4dGVudHMgPSAwOworCisJaWYgKHNlZ3R5cGVfaXNfcmFpZChzZWd0eXBlKSkgeworCQlpZiAobWV0YWRhdGFfYXJlYV9jb3VudCkgeworCQkJaWYgKG1ldGFkYXRhX2FyZWFfY291bnQgIT0gYXJlYV9jb3VudCkKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCQkJICAiQmFkIG1ldGFkYXRhX2FyZWFfY291bnQiKTsKKwkJCWFoLT5tZXRhZGF0YV9hcmVhX2NvdW50ID0gYXJlYV9jb3VudDsKKwkJCWFoLT5hbGxvY19hbmRfc3BsaXRfbWV0YSA9IDE7CisKKwkJCWFoLT5sb2dfbGVuID0gUkFJRF9NRVRBREFUQV9BUkVBX0xFTjsKKworCQkJLyoKKwkJCSAqIFdlIG5lZWQgJ2xvZ19sZW4nIGV4dGVudHMgZm9yIGVhY2gKKwkJCSAqIFJBSUQgZGV2aWNlJ3MgbWV0YWRhdGFfYXJlYQorCQkJICovCisJCQl0b3RhbF9leHRlbnRzICs9IChhaC0+bG9nX2xlbiAqIGFoLT5hcmVhX211bHRpcGxlKTsKKwkJfSBlbHNlIHsKKwkJCWFoLT5sb2dfYXJlYV9jb3VudCA9IDA7CisJCQlhaC0+bG9nX2xlbiA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKHNlZ3R5cGVfaXNfdGhpbl9wb29sKHNlZ3R5cGUpKSB7CisJCS8qCisJCSAqIHRoaW5fcG9vbCB1c2VzIGFoLT5yZWdpb25fc2l6ZSB0bworCQkgKiBwYXNzIG1ldGFkYXRhIHNpemUgaW4gZXh0ZW50cworCQkgKi8KKwkJYWgtPmxvZ19sZW4gPSBhaC0+cmVnaW9uX3NpemU7CisJCWFoLT5sb2dfYXJlYV9jb3VudCA9IG1ldGFkYXRhX2FyZWFfY291bnQ7CisJCWFoLT5yZWdpb25fc2l6ZSA9IDA7CisJCWFoLT5taXJyb3JfbG9nc19zZXBhcmF0ZSA9CisJCQlmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhbGxvY2F0aW9uX3RoaW5fcG9vbF9tZXRhZGF0YV9yZXF1aXJlX3NlcGFyYXRlX3B2c19DRkcsIE5VTEwpOworCX0gZWxzZSBpZiAoc2VndHlwZV9pc19jYWNoZV9wb29sKHNlZ3R5cGUpKSB7CisJCS8qCisJCSAqIExpa2UgdGhpbl9wb29sLCBjYWNoZV9wb29sIHVzZXMgYWgtPnJlZ2lvbl9zaXplIHRvCisJCSAqIHBhc3MgbWV0YWRhdGEgc2l6ZSBpbiBleHRlbnRzCisJCSAqLworCQlhaC0+bG9nX2xlbiA9IGFoLT5yZWdpb25fc2l6ZTsKKwkJLyogdXNlIG1ldGFkYXRhX2FyZWFfY291bnQsIG5vdCBsb2dfYXJlYV9jb3VudCAqLworCQlhaC0+bWV0YWRhdGFfYXJlYV9jb3VudCA9IG1ldGFkYXRhX2FyZWFfY291bnQ7CisJCWFoLT5yZWdpb25fc2l6ZSA9IDA7CisJCWFoLT5taXJyb3JfbG9nc19zZXBhcmF0ZSA9CisJCQlmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhbGxvY2F0aW9uX2NhY2hlX3Bvb2xfbWV0YWRhdGFfcmVxdWlyZV9zZXBhcmF0ZV9wdnNfQ0ZHLCBOVUxMKTsKKwkJaWYgKCFhaC0+bWlycm9yX2xvZ3Nfc2VwYXJhdGUpIHsKKwkJCWFoLT5hbGxvY19hbmRfc3BsaXRfbWV0YSA9IDE7CisJCQl0b3RhbF9leHRlbnRzICs9IGFoLT5sb2dfbGVuOworCQl9CisJfSBlbHNlIHsKKwkJYWgtPmxvZ19hcmVhX2NvdW50ID0gbWV0YWRhdGFfYXJlYV9jb3VudDsKKwkJYWgtPmxvZ19sZW4gPSAhbWV0YWRhdGFfYXJlYV9jb3VudCA/IDAgOgorCQkJX21pcnJvcl9sb2dfZXh0ZW50cyhhaC0+cmVnaW9uX3NpemUsIGV4dGVudF9zaXplLAorCQkJCQkgICAgKGV4aXN0aW5nX2V4dGVudHMgKyBuZXdfZXh0ZW50cykgLyBhaC0+YXJlYV9tdWx0aXBsZSk7CisJfQorCisJbG9nX2RlYnVnKCJBZGp1c3RlZCBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gJSIgUFJJdTMyICIgbG9naWNhbCBleHRlbnRzLiBFeGlzdGluZyBzaXplICUiIFBSSXUzMiAiLiBOZXcgc2l6ZSAlIiBQUkl1MzIgIi4iLAorCQkgIHRvdGFsX2V4dGVudHMsIGV4aXN0aW5nX2V4dGVudHMsIHRvdGFsX2V4dGVudHMgKyBleGlzdGluZ19leHRlbnRzKTsKKwlpZiAoYWgtPmxvZ19sZW4pCisJCWxvZ19kZWJ1ZygiTWlycm9yIGxvZyBvZiAlIiBQUkl1MzIgIiBleHRlbnRzIG9mIHNpemUgJSIgUFJJdTMyICJzZWN0b3JzIG5lZWRlZCBmb3IgcmVnaW9uIHNpemUgJSIgUFJJdTMyICAiLiIsCisJCQkgIGFoLT5sb2dfbGVuLCBleHRlbnRfc2l6ZSwgYWgtPnJlZ2lvbl9zaXplKTsKKworCWlmIChtaXJyb3JzIHx8IHN0cmlwZXMpCisJCXRvdGFsX2V4dGVudHMgKz0gZXhpc3RpbmdfZXh0ZW50czsKKworCWFoLT5uZXdfZXh0ZW50cyA9IHRvdGFsX2V4dGVudHM7CisKKwlmb3IgKHMgPSAwOyBzIDwgYWxsb2NfY291bnQ7IHMrKykKKwkJZG1fbGlzdF9pbml0KCZhaC0+YWxsb2NlZF9hcmVhc1tzXSk7CisKKwlhaC0+cGFyYWxsZWxfYXJlYXMgPSBwYXJhbGxlbF9hcmVhczsKKworCWlmICgoYWgtPmNsaW5nX3RhZ19saXN0X2NuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGFsbG9jYXRpb25fY2xpbmdfdGFnX2xpc3RfQ0ZHLCBOVUxMKSkpCisJCSh2b2lkKSBfdmFsaWRhdGVfdGFnX2xpc3QoYWgtPmNsaW5nX3RhZ19saXN0X2NuKTsKKworCWFoLT5tYXhpbWlzZV9jbGluZyA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFsbG9jYXRpb25fbWF4aW1pc2VfY2xpbmdfQ0ZHLCBOVUxMKTsKKworCWFoLT5hcHByb3hfYWxsb2MgPSBhcHByb3hfYWxsb2M7CisKKwlyZXR1cm4gYWg7Cit9CisKK3ZvaWQgYWxsb2NfZGVzdHJveShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCkKK3sKKwlpZiAoYWgpCisJCWRtX3Bvb2xfZGVzdHJveShhaC0+bWVtKTsKK30KKworLyoKKyAqIEVudHJ5IHBvaW50IGZvciBhbGwgZXh0ZW50IGFsbG9jYXRpb25zLgorICovCitzdHJ1Y3QgYWxsb2NfaGFuZGxlICphbGxvY2F0ZV9leHRlbnRzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJCQkgICAgICB1aW50MzJfdCBzdHJpcGVzLAorCQkJCSAgICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IGxvZ19jb3VudCwKKwkJCQkgICAgICB1aW50MzJfdCByZWdpb25fc2l6ZSwgdWludDMyX3QgZXh0ZW50cywKKwkJCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzLAorCQkJCSAgICAgIGFsbG9jX3BvbGljeV90IGFsbG9jLCBpbnQgYXBwcm94X2FsbG9jLAorCQkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9hcmVhcykKK3sKKwlzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaDsKKworCWlmIChzZWd0eXBlX2lzX3ZpcnR1YWwoc2VndHlwZSkpIHsKKwkJbG9nX2Vycm9yKCJhbGxvY2F0ZV9leHRlbnRzIGRvZXMgbm90IGhhbmRsZSB2aXJ0dWFsIHNlZ21lbnRzIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghYWxsb2NhdGFibGVfcHZzKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTWlzc2luZyBhbGxvY2F0YWJsZSBwdnMuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh2Zy0+ZmlkLT5mbXQtPm9wcy0+c2VndHlwZV9zdXBwb3J0ZWQgJiYKKwkgICAgIXZnLT5maWQtPmZtdC0+b3BzLT5zZWd0eXBlX3N1cHBvcnRlZCh2Zy0+ZmlkLCBzZWd0eXBlKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGZvcm1hdCAoJXMpIGRvZXMgbm90IHN1cHBvcnQgcmVxdWlyZWQgIgorCQkJICAiTFYgc2VnbWVudCB0eXBlICglcykuIiwgdmctPmZpZC0+Zm10LT5uYW1lLAorCQkJICBzZWd0eXBlLT5uYW1lKTsKKwkJbG9nX2Vycm9yKCJDb25zaWRlciBjaGFuZ2luZyB0aGUgbWV0YWRhdGEgZm9ybWF0IGJ5IHJ1bm5pbmcgIgorCQkJICAidmdjb252ZXJ0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYWxsb2MgPj0gQUxMT0NfSU5IRVJJVCkKKwkJYWxsb2MgPSB2Zy0+YWxsb2M7CisKKwlpZiAoIShhaCA9IF9hbGxvY19pbml0KHZnLT5jbWQsIHNlZ3R5cGUsIGFsbG9jLCBhcHByb3hfYWxsb2MsCisJCQkgICAgICAgbHYgPyBsdi0+bGVfY291bnQgOiAwLCBleHRlbnRzLCBtaXJyb3JzLCBzdHJpcGVzLCBsb2dfY291bnQsCisJCQkgICAgICAgdmctPmV4dGVudF9zaXplLCByZWdpb25fc2l6ZSwKKwkJCSAgICAgICBwYXJhbGxlbF9hcmVhcykpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghX2FsbG9jYXRlKGFoLCB2ZywgbHYsIDEsIGFsbG9jYXRhYmxlX3B2cykpIHsKKwkJYWxsb2NfZGVzdHJveShhaCk7CisJCXJldHVybl9OVUxMOworCX0KKworCXJldHVybiBhaDsKK30KKworLyoKKyAqIEFkZCBuZXcgc2VnbWVudHMgdG8gYW4gTFYgZnJvbSBzdXBwbGllZCBsaXN0IG9mIGFyZWFzLgorICovCitpbnQgbHZfYWRkX3NlZ21lbnQoc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsCisJCSAgIHVpbnQzMl90IGZpcnN0X2FyZWEsIHVpbnQzMl90IG51bV9hcmVhcywKKwkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJICAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCSAgIHVpbnQ2NF90IHN0YXR1cywKKwkJICAgdWludDMyX3QgcmVnaW9uX3NpemUpCit7CisJaWYgKCFzZWd0eXBlKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBzZWd0eXBlIGluIGx2X2FkZF9zZWdtZW50KCkuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWd0eXBlX2lzX3ZpcnR1YWwoc2VndHlwZSkpIHsKKwkJbG9nX2Vycm9yKCJsdl9hZGRfc2VnbWVudCBjYW5ub3QgaGFuZGxlIHZpcnR1YWwgc2VnbWVudHMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChzdGF0dXMgJiBNSVJST1JfTE9HKSAmJiAhZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ21lbnRzKSkgeworCQlsb2dfZXJyb3IoIkxvZyBzZWdtZW50cyBjYW4gb25seSBiZSBhZGRlZCB0byBhbiBlbXB0eSBMViIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9zZXR1cF9hbGxvY2VkX3NlZ21lbnRzKGx2LCAmYWgtPmFsbG9jZWRfYXJlYXNbZmlyc3RfYXJlYV0sCisJCQkJICAgICBudW1fYXJlYXMsIHN0YXR1cywKKwkJCQkgICAgIHN0cmlwZV9zaXplLCBzZWd0eXBlLAorCQkJCSAgICAgcmVnaW9uX3NpemUpKQorCQlyZXR1cm5fMDsKKworCWlmICgoc2VndHlwZS0+ZmxhZ3MgJiBTRUdfQ0FOX1NQTElUKSAmJiAhbHZfbWVyZ2Vfc2VnbWVudHMobHYpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgbWVyZ2Ugc2VnbWVudHMgYWZ0ZXIgZXh0ZW5kaW5nICIKKwkJCSAgImxvZ2ljYWwgdm9sdW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cCAmJgorCSAgICAhbHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cChsdi0+dmctPmZpZCwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogIm1pcnJvciIgc2VnbWVudCB0eXBlIGRvZXNuJ3Qgc3VwcG9ydCBzcGxpdC4KKyAqIFNvLCB3aGVuIGFkZGluZyBtaXJyb3JzIHRvIGxpbmVhciBMViBzZWdtZW50LCBmaXJzdCBzcGxpdCBpdCwKKyAqIHRoZW4gY29udmVydCBpdCB0byAibWlycm9yIiBhbmQgYWRkIGFyZWFzLgorICovCitzdGF0aWMgc3RydWN0IGx2X3NlZ21lbnQgKl9jb252ZXJ0X3NlZ190b19taXJyb3Ioc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkJCSB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJCQkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqbmV3c2VnOworCXVpbnQzMl90IHM7CisKKwlpZiAoIXNlZ19pc19zdHJpcGVkKHNlZykpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBjb252ZXJ0IG5vbi1zdHJpcGVkIHNlZ21lbnQgdG8gbWlycm9yZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzZWctPmFyZWFfY291bnQgPiAxKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgY29udmVydCBzdHJpcGVkIHNlZ21lbnQgd2l0aCBtdWx0aXBsZSBhcmVhcyAiCisJCQkgICJ0byBtaXJyb3JlZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobmV3c2VnID0gYWxsb2NfbHZfc2VnbWVudChnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhzZWctPmx2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX01JUlJPUiksCisJCQkJCXNlZy0+bHYsIHNlZy0+bGUsIHNlZy0+bGVuLAorCQkJCQlzZWctPnN0YXR1cywgc2VnLT5zdHJpcGVfc2l6ZSwKKwkJCQkJbG9nX2x2LAorCQkJCQlzZWctPmFyZWFfY291bnQsIHNlZy0+YXJlYV9sZW4sCisJCQkJCXNlZy0+Y2h1bmtfc2l6ZSwgcmVnaW9uX3NpemUsCisJCQkJCXNlZy0+ZXh0ZW50c19jb3BpZWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGFsbG9jYXRlIGNvbnZlcnRlZCBMViBzZWdtZW50Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykKKwkJaWYgKCFtb3ZlX2x2X3NlZ21lbnRfYXJlYShuZXdzZWcsIHMsIHNlZywgcykpCisJCQlyZXR1cm5fTlVMTDsKKworCXNlZy0+cHZtb3ZlX3NvdXJjZV9zZWcgPSBOVUxMOyAvKiBOb3QgbWFpbnRhaW5lZCBhZnRlciBhbGxvY2F0aW9uICovCisKKwlkbV9saXN0X2FkZCgmc2VnLT5saXN0LCAmbmV3c2VnLT5saXN0KTsKKwlkbV9saXN0X2RlbCgmc2VnLT5saXN0KTsKKworCXJldHVybiBuZXdzZWc7Cit9CisKKy8qCisgKiBBZGQgbmV3IGFyZWFzIHRvIG1pcnJvcmVkIHNlZ21lbnRzCisgKi8KK2ludCBsdl9hZGRfc2VnbWVudGVkX21pcnJvcl9pbWFnZShzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlLAorCQkJCSAgdWludDMyX3QgcmVnaW9uX3NpemUpCit7CisJY2hhciAqaW1hZ2VfbmFtZTsKKwlzdHJ1Y3QgYWxsb2NlZF9hcmVhICphYTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCAqbmV3X3NlZzsKKwl1aW50MzJfdCBjdXJyZW50X2xlID0gbGU7CisJdWludDMyX3QgczsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ19sdiwgKmNvcHlfbHY7CisKKwlpZiAoIWx2X2lzX3B2bW92ZShsdikpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJOb24tcHZtb3ZlIExWLCAlcywgcGFzc2VkIGFzIGFyZ3VtZW50IiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2VnX3R5cGUoZmlyc3Rfc2VnKGx2KSwgMCkgIT0gQVJFQV9QVikgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCSAgIkJhZCBzZWdtZW50IHR5cGUgZm9yIGZpcnN0IHNlZ21lbnQgYXJlYSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBhbGxvY2F0b3IgcHJvdmlkZWQgdHdvIG9yIG1vcmUgUFYgYWxsb2NhdGlvbnMgZm9yIGFueQorCSAqIHNpbmdsZSBzZWdtZW50IG9mIHRoZSBvcmlnaW5hbCBMViwgdGhhdCBMViBzZWdtZW50IG11c3QgYmUKKwkgKiBzcGxpdCB1cCB0byBtYXRjaC4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoYWEsICZhaC0+YWxsb2NlZF9hcmVhc1swXSkgeworCQlpZiAoIShzZWcgPSBmaW5kX3NlZ19ieV9sZShsdiwgY3VycmVudF9sZSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNlZ21lbnQgZm9yICVzIGV4dGVudCAlIgorCQkJCSAgUFJJdTMyLCBsdi0+bmFtZSwgY3VycmVudF9sZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEFsbG9jYXRvciBhc3N1cmVzIGFhWzBdLmxlbiA8PSBzZWctPmFyZWFfbGVuICovCisJCWlmIChhYVswXS5sZW4gPCBzZWctPmFyZWFfbGVuKSB7CisJCQlpZiAoIWx2X3NwbGl0X3NlZ21lbnQobHYsIHNlZy0+bGUgKyBhYVswXS5sZW4pKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3BsaXQgc2VnbWVudCBhdCAlcyAiCisJCQkJCSAgImV4dGVudCAlIiBQUkl1MzIsIGx2LT5uYW1lLCBsZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJY3VycmVudF9sZSArPSBzZWctPmFyZWFfbGVuOworCX0KKworCWN1cnJlbnRfbGUgPSBsZTsKKworCWlmICghaW5zZXJ0X2xheWVyX2Zvcl9sdihsdi0+dmctPmNtZCwgbHYsIFBWTU9WRSwgIl9taW1hZ2VfMCIpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHB2bW92ZSBMVi10eXBlIG1pcnJvciwgJXMiLAorCQkJICBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlvcmlnX2x2ID0gc2VnX2x2KGZpcnN0X3NlZyhsdiksIDApOworCWlmICghKGltYWdlX25hbWUgPSBkbV9wb29sX3N0cmR1cChsdi0+dmctPnZnbWVtLCBvcmlnX2x2LT5uYW1lKSkpCisJCXJldHVybl8wOworCWltYWdlX25hbWVbc3RybGVuKGltYWdlX25hbWUpIC0gMV0gPSAnMSc7CisKKwlpZiAoIShjb3B5X2x2ID0gbHZfY3JlYXRlX2VtcHR5KGltYWdlX25hbWUsIE5VTEwsCisJCQkJCW9yaWdfbHYtPnN0YXR1cywKKwkJCQkJQUxMT0NfSU5IRVJJVCwgbHYtPnZnKSkpCisJCXJldHVybl8wOworCisJaWYgKCFsdl9hZGRfbWlycm9yX2x2cyhsdiwgJmNvcHlfbHYsIDEsIE1JUlJPUl9JTUFHRSwgcmVnaW9uX3NpemUpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFhLCAmYWgtPmFsbG9jZWRfYXJlYXNbMF0pIHsKKwkJaWYgKCEoc2VnID0gZmluZF9zZWdfYnlfbGUob3JpZ19sdiwgY3VycmVudF9sZSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNlZ21lbnQgZm9yICVzIGV4dGVudCAlIgorCQkJCSAgUFJJdTMyLCBsdi0+bmFtZSwgY3VycmVudF9sZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghKG5ld19zZWcgPSBhbGxvY19sdl9zZWdtZW50KHNlZ3R5cGUsIGNvcHlfbHYsCisJCQkJCQkgc2VnLT5sZSwgc2VnLT5sZW4sIFBWTU9WRSwgMCwKKwkJCQkJCSBOVUxMLCAxLCBzZWctPmxlbiwKKwkJCQkJCSAwLCAwLCAwLCBOVUxMKSkpCisJCQlyZXR1cm5fMDsKKworCQlmb3IgKHMgPSAwOyBzIDwgYWgtPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX3B2KG5ld19zZWcsIHMsCisJCQkJCQkgICAgYWFbc10ucHYsIGFhW3NdLnBlKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCWRtX2xpc3RfYWRkKCZjb3B5X2x2LT5zZWdtZW50cywgJm5ld19zZWctPmxpc3QpOworCisJCWN1cnJlbnRfbGUgKz0gc2VnLT5hcmVhX2xlbjsKKwkJY29weV9sdi0+bGVfY291bnQgKz0gc2VnLT5hcmVhX2xlbjsKKwl9CisJbHYtPnN0YXR1cyB8PSBNSVJST1JFRDsKKworCS8qIEZJWE1FOiBhZGQgbG9nICovCisKKwlpZiAobHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cCAmJgorCSAgICAhbHYtPnZnLT5maWQtPmZtdC0+b3BzLT5sdl9zZXR1cChsdi0+dmctPmZpZCwgbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogQWRkIG5ldyBhcmVhcyB0byBtaXJyb3JlZCBzZWdtZW50cworICovCitpbnQgbHZfYWRkX21pcnJvcl9hcmVhcyhzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlLAorCQkJdWludDMyX3QgcmVnaW9uX3NpemUpCit7CisJc3RydWN0IGFsbG9jZWRfYXJlYSAqYWE7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwl1aW50MzJfdCBjdXJyZW50X2xlID0gbGU7CisJdWludDMyX3Qgcywgb2xkX2FyZWFfY291bnQsIG5ld19hcmVhX2NvdW50OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFhLCAmYWgtPmFsbG9jZWRfYXJlYXNbMF0pIHsKKwkJaWYgKCEoc2VnID0gZmluZF9zZWdfYnlfbGUobHYsIGN1cnJlbnRfbGUpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBzZWdtZW50IGZvciAlcyBleHRlbnQgJSIKKwkJCQkgIFBSSXUzMiwgbHYtPm5hbWUsIGN1cnJlbnRfbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBBbGxvY2F0b3IgYXNzdXJlcyBhYVswXS5sZW4gPD0gc2VnLT5hcmVhX2xlbiAqLworCQlpZiAoYWFbMF0ubGVuIDwgc2VnLT5hcmVhX2xlbikgeworCQkJaWYgKCFsdl9zcGxpdF9zZWdtZW50KGx2LCBzZWctPmxlICsgYWFbMF0ubGVuKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNwbGl0IHNlZ21lbnQgYXQgJXMgIgorCQkJCQkgICJleHRlbnQgJSIgUFJJdTMyLCBsdi0+bmFtZSwgbGUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJaWYgKCFzZWdfaXNfbWlycm9yZWQoc2VnKSAmJgorCQkgICAgKCEoc2VnID0gX2NvbnZlcnRfc2VnX3RvX21pcnJvcihzZWcsIHJlZ2lvbl9zaXplLCBOVUxMKSkpKQorCQkJcmV0dXJuXzA7CisKKwkJb2xkX2FyZWFfY291bnQgPSBzZWctPmFyZWFfY291bnQ7CisJCW5ld19hcmVhX2NvdW50ID0gb2xkX2FyZWFfY291bnQgKyBhaC0+YXJlYV9jb3VudDsKKworCQlpZiAoIV9sdl9zZWdtZW50X2FkZF9hcmVhcyhsdiwgc2VnLCBuZXdfYXJlYV9jb3VudCkpCisJCQlyZXR1cm5fMDsKKworCQlmb3IgKHMgPSAwOyBzIDwgYWgtPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX3B2KHNlZywgcyArIG9sZF9hcmVhX2NvdW50LAorCQkJCQkJICAgIGFhW3NdLnB2LCBhYVtzXS5wZSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQljdXJyZW50X2xlICs9IHNlZy0+YXJlYV9sZW47CisJfQorCisJbHYtPnN0YXR1cyB8PSBNSVJST1JFRDsKKworCWlmIChsdi0+dmctPmZpZC0+Zm10LT5vcHMtPmx2X3NldHVwICYmCisJICAgICFsdi0+dmctPmZpZC0+Zm10LT5vcHMtPmx2X3NldHVwKGx2LT52Zy0+ZmlkLCBsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBBZGQgbWlycm9yIGltYWdlIExWcyB0byBtaXJyb3JlZCBzZWdtZW50cworICovCitpbnQgbHZfYWRkX21pcnJvcl9sdnMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqc3ViX2x2cywKKwkJICAgICAgdWludDMyX3QgbnVtX2V4dHJhX2FyZWFzLAorCQkgICAgICB1aW50NjRfdCBzdGF0dXMsIHVpbnQzMl90IHJlZ2lvbl9zaXplKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJdWludDMyX3Qgb2xkX2FyZWFfY291bnQsIG5ld19hcmVhX2NvdW50OworCXVpbnQzMl90IG07CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqbWlycm9yX3NlZ3R5cGU7CisKKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCisJaWYgKGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSAhPSAxIHx8IHNlZ190eXBlKHNlZywgMCkgIT0gQVJFQV9MVikgeworCQlsb2dfZXJyb3IoIk1pcnJvciBsYXllciBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSBhZGRpbmcgbWlycm9ycyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltaXJyb3Jfc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGx2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX01JUlJPUik7CisJaWYgKHNlZy0+c2VndHlwZSAhPSBtaXJyb3Jfc2VndHlwZSkKKwkJaWYgKCEoc2VnID0gX2NvbnZlcnRfc2VnX3RvX21pcnJvcihzZWcsIHJlZ2lvbl9zaXplLCBOVUxMKSkpCisJCQlyZXR1cm5fMDsKKworCWlmIChyZWdpb25fc2l6ZSAmJiByZWdpb25fc2l6ZSAhPSBzZWctPnJlZ2lvbl9zaXplKSB7CisJCWxvZ19lcnJvcigiQ29uZmxpY3RpbmcgcmVnaW9uX3NpemUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2xkX2FyZWFfY291bnQgPSBzZWctPmFyZWFfY291bnQ7CisJbmV3X2FyZWFfY291bnQgPSBvbGRfYXJlYV9jb3VudCArIG51bV9leHRyYV9hcmVhczsKKworCWlmICghX2x2X3NlZ21lbnRfYWRkX2FyZWFzKGx2LCBzZWcsIG5ld19hcmVhX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSB3aWRlbmVkIExWIHNlZ21lbnQgZm9yICVzLiIsCisJCQkgIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChtID0gMDsgbSA8IG9sZF9hcmVhX2NvdW50OyBtKyspCisJCXNlZ19sdihzZWcsIG0pLT5zdGF0dXMgfD0gc3RhdHVzOworCisJZm9yIChtID0gb2xkX2FyZWFfY291bnQ7IG0gPCBuZXdfYXJlYV9jb3VudDsgbSsrKSB7CisJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzZWcsIG0sIHN1Yl9sdnNbbSAtIG9sZF9hcmVhX2NvdW50XSwKKwkJCQkJICAgIDAsIHN0YXR1cykpCisJCQlyZXR1cm5fMDsKKwkJbHZfc2V0X2hpZGRlbihzdWJfbHZzW20gLSBvbGRfYXJlYV9jb3VudF0pOworCX0KKworCWx2LT5zdGF0dXMgfD0gTUlSUk9SRUQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFR1cm4gYW4gZW1wdHkgTFYgaW50byBhIG1pcnJvciBsb2cuCisgKgorICogRklYTUU6IE1pcnJvcmVkIGxvZ3MgYXJlIGJ1aWx0IGluZWZmaWNpZW50bHkuCisgKiBBIG1pcnJvcmVkIGxvZyBjdXJyZW50bHkgdXNlcyB0aGUgc2FtZSBsYXlvdXQgdGhhdCBhIG1pcnJvcgorICogTFYgdXNlcy4gIFRoZSBtaXJyb3IgbGF5ZXIgc2l0cyBvbiB0b3Agb2YgQVJFQV9MVnMgd2hpY2ggZm9ybSB0aGUKKyAqIGxlZ3MsIHJhdGhlciBvbiBBUkVBX1BWcy4gIFRoaXMgaXMgZG9uZSB0byBhbGxvdyByZS11c2Ugb2YgdGhlCisgKiB2YXJpb3VzIG1pcnJvciBmdW5jdGlvbnMgdG8gYWxzbyBoYW5kbGUgdGhlIG1pcnJvcmVkIExWIHRoYXQgbWFrZXMKKyAqIHVwIHRoZSBsb2cuCisgKgorICogSWYgd2UgdXNlZCBBUkVBX1BWcyB1bmRlciB0aGUgbWlycm9yIGxheWVyIG9mIGEgbG9nLCB3ZSBjb3VsZAorICogYXNzZW1ibGUgaXQgYWxsIGF0IG9uY2UgYnkgY2FsbGluZyAnbHZfYWRkX3NlZ21lbnQnIHdpdGggdGhlCisgKiBhcHByb3ByaWF0ZSBzZWd0eXBlIChtaXJyb3Ivc3RyaXBlKSwgbGlrZSB0aGlzOgorICoJbHZfYWRkX3NlZ21lbnQoYWgsIGFoLT5hcmVhX2NvdW50LCBhaC0+bG9nX2FyZWFfY291bnQsCisgKgkJICAgICAgIGxvZ19sdiwgc2VndHlwZSwgMCwgTUlSUk9SX0xPRywgMCk7CisgKgorICogRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIG1lY2hhbmlzbSB0byBidWlsZCBhIG1pcnJvcmVkIGxvZyBhcyB3ZQorICogZG8gZm9yIGJ1aWxkaW5nIGEgbWlycm9yZWQgTFY6IDEpIGNyZWF0ZSBpbml0aWFsIExWLCAyKSBhZGQgYQorICogbWlycm9yIGxheWVyLCBhbmQgMykgYWRkIHRoZSByZW1haW5pbmcgY29weSBMVnMKKyAqLworaW50IGx2X2FkZF9sb2dfc2VnbWVudChzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwgdWludDMyX3QgZmlyc3RfYXJlYSwKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2LCB1aW50NjRfdCBzdGF0dXMpCit7CisKKwlyZXR1cm4gbHZfYWRkX3NlZ21lbnQoYWgsIGFoLT5hcmVhX2NvdW50ICsgZmlyc3RfYXJlYSwgMSwgbG9nX2x2LAorCQkJICAgICAgZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobG9nX2x2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpLAorCQkJICAgICAgMCwgc3RhdHVzLCAwKTsKK30KKworc3RhdGljIGludCBfbHZfaW5zZXJ0X2VtcHR5X3N1Ymx2cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCQkJICAgdWludDMyX3Qgc3RyaXBlX3NpemUsIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCQkJCSAgIHVpbnQzMl90IGRldmljZXMpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzdWJfbHY7CisJdWludDMyX3QgaTsKKwl1aW50NjRfdCBzdWJfbHZfc3RhdHVzID0gMDsKKwljb25zdCBjaGFyICpsYXllcl9uYW1lOworCWNoYXIgaW1nX25hbWVbTkFNRV9MRU5dOworCXN0cnVjdCBsdl9zZWdtZW50ICptYXBzZWc7CisKKwlpZiAobHYtPmxlX2NvdW50IHx8ICFkbV9saXN0X2VtcHR5KCZsdi0+c2VnbWVudHMpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiTm9uLWVtcHR5IExWIHBhc3NlZCB0byBfbHZfaW5zZXJ0X2VtcHR5X3N1Ymx2Iik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWd0eXBlX2lzX3JhaWQoc2VndHlwZSkpIHsKKwkJbHYtPnN0YXR1cyB8PSBSQUlEOworCQlzdWJfbHZfc3RhdHVzID0gUkFJRF9JTUFHRTsKKwkJbGF5ZXJfbmFtZSA9ICJyaW1hZ2UiOworCX0gZWxzZSBpZiAoc2VndHlwZV9pc19taXJyb3JlZChzZWd0eXBlKSkgeworCQlsdi0+c3RhdHVzIHw9IE1JUlJPUkVEOworCQlzdWJfbHZfc3RhdHVzID0gTUlSUk9SX0lNQUdFOworCQlsYXllcl9uYW1lID0gIm1pbWFnZSI7CisJfSBlbHNlCisJCXJldHVybl8wOworCisJLyoKKwkgKiBGaXJzdCwgY3JlYXRlIG91ciB0b3AtbGV2ZWwgc2VnbWVudCBmb3Igb3VyIHRvcC1sZXZlbCBMVgorCSAqLworCWlmICghKG1hcHNlZyA9IGFsbG9jX2x2X3NlZ21lbnQoc2VndHlwZSwgbHYsIDAsIDAsIGx2LT5zdGF0dXMsCisJCQkJCXN0cmlwZV9zaXplLCBOVUxMLAorCQkJCQlkZXZpY2VzLCAwLCAwLCByZWdpb25fc2l6ZSwgMCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBtYXBwaW5nIHNlZ21lbnQgZm9yICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTmV4dCwgY3JlYXRlIGFsbCBvZiBvdXIgc3ViX2x2J3MgYW5kIGxpbmsgdGhlbSBpbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlczsgaSsrKSB7CisJCS8qIERhdGEgTFZzICovCisJCWlmIChkZXZpY2VzID4gMSkgeworCQkJaWYgKGRtX3NucHJpbnRmKGltZ19uYW1lLCBzaXplb2YoaW1nX25hbWUpLCAiJXNfJXNfJXUiLAorCQkJCQlsdi0+bmFtZSwgbGF5ZXJfbmFtZSwgaSkgPCAwKQorCQkJCWdvdG9fYmFkOworCQl9IGVsc2UgeworCQkJaWYgKGRtX3NucHJpbnRmKGltZ19uYW1lLCBzaXplb2YoaW1nX25hbWUpLCAiJXNfJXMiLAorCQkJCQlsdi0+bmFtZSwgbGF5ZXJfbmFtZSkgPCAwKQorCQkJCWdvdG9fYmFkOworCQl9CisKKwkJLyogRklYTUUgU2hvdWxkIHVzZSBBTExPQ19JTkhFUklUIGhlcmUgYW5kIGluaGVyaXQgZnJvbSBwYXJlbnQgTFYgKi8KKwkJaWYgKCEoc3ViX2x2ID0gbHZfY3JlYXRlX2VtcHR5KGltZ19uYW1lLCBOVUxMLAorCQkJCQkgICAgICAgTFZNX1JFQUQgfCBMVk1fV1JJVEUsCisJCQkJCSAgICAgICBsdi0+YWxsb2MsIGx2LT52ZykpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KG1hcHNlZywgaSwgc3ViX2x2LCAwLCBzdWJfbHZfc3RhdHVzKSkKKwkJCXJldHVybl8wOworCisJCS8qIE1ldGFkYXRhIExWcyBmb3IgcmFpZCAqLworCQlpZiAoc2VndHlwZV9pc19yYWlkKHNlZ3R5cGUpICYmICFzZWd0eXBlX2lzX3JhaWQwKHNlZ3R5cGUpKSB7CisJCQlpZiAoZG1fc25wcmludGYoaW1nX25hbWUsIHNpemVvZihpbWdfbmFtZSksICIlc19ybWV0YV8ldSIsCisJCQkJCWx2LT5uYW1lLCBpKSA8IDApCisJCQkJZ290b19iYWQ7CisJCQkvKiBGSVhNRSBTaG91bGQgdXNlIEFMTE9DX0lOSEVSSVQgaGVyZSBhbmQgaW5oZXJpdCBmcm9tIHBhcmVudCBMViAqLworCQkJaWYgKCEoc3ViX2x2ID0gbHZfY3JlYXRlX2VtcHR5KGltZ19uYW1lLCBOVUxMLAorCQkJCQkJICAgICAgIExWTV9SRUFEIHwgTFZNX1dSSVRFLAorCQkJCQkJICAgICAgIGx2LT5hbGxvYywgbHYtPnZnKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihtYXBzZWcsIGksIHN1Yl9sdiwgMCwgUkFJRF9NRVRBKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0KKworCWRtX2xpc3RfYWRkKCZsdi0+c2VnbWVudHMsICZtYXBzZWctPmxpc3QpOworCisJcmV0dXJuIDE7CisKK2JhZDoKKwlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgc3ViIExWIG5hbWUgZm9yIExWICVzLiIsCisJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9sdl9leHRlbmRfbGF5ZXJlZF9sdihzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCQkgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgdWludDMyX3QgZXh0ZW50cywgdWludDMyX3QgZmlyc3RfYXJlYSwKKwkJCQkgdWludDMyX3Qgc3RyaXBlcywgdWludDMyX3Qgc3RyaXBlX3NpemUpCit7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnN1Yl9sdiwgKm1ldGFfbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisJdWludDMyX3QgZmEsIHM7CisJaW50IGNsZWFyX21ldGFkYXRhID0gMDsKKwl1aW50MzJfdCBhcmVhX211bHRpcGxlID0gMTsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBUaGUgY29tcG9uZW50IGRldmljZXMgb2YgYSAic3RyaXBlZCIgTFYgYWxsIGdvIGluIHRoZSBzYW1lCisJICogTFYuICBIb3dldmVyLCBSQUlEIGhhcyBhbiBMViBmb3IgZWFjaCBkZXZpY2UgLSBtYWtpbmcgdGhlCisJICogJ3N0cmlwZXMnIGFuZCAnc3RyaXBlX3NpemUnIHBhcmFtZXRlcnMgbWVhbmluZ2xlc3MuCisJICovCisJaWYgKHNlZ19pc19yYWlkKHNlZykpIHsKKwkJc3RyaXBlcyA9IDE7CisJCXN0cmlwZV9zaXplID0gMDsKKwkJaWYgKHNlZ19pc19hbnlfcmFpZDAoc2VnKSkKKwkJCWFyZWFfbXVsdGlwbGUgPSBzZWctPmFyZWFfY291bnQ7CisJfQorCisJZm9yIChmYSA9IGZpcnN0X2FyZWEsIHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKGlzX3RlbXBvcmFyeV9taXJyb3JfbGF5ZXIoc2VnX2x2KHNlZywgcykpKSB7CisJCQlpZiAoIV9sdl9leHRlbmRfbGF5ZXJlZF9sdihhaCwgc2VnX2x2KHNlZywgcyksIGV4dGVudHMgLyBhcmVhX211bHRpcGxlLAorCQkJCQkJICAgZmEsIHN0cmlwZXMsIHN0cmlwZV9zaXplKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWZhICs9IGx2X21pcnJvcl9jb3VudChzZWdfbHYoc2VnLCBzKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN1Yl9sdiA9IHNlZ19sdihzZWcsIHMpOworCQlpZiAoIWx2X2FkZF9zZWdtZW50KGFoLCBmYSwgc3RyaXBlcywgc3ViX2x2LCBzZWd0eXBlLAorCQkJCSAgICBzdHJpcGVfc2l6ZSwgc3ViX2x2LT5zdGF0dXMsIDApKSB7CisJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gZXh0ZW5kICVzIGluICVzLiIsCisJCQkJICBzdWJfbHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRXh0ZW5kIG1ldGFkYXRhIExWcyBvbmx5IG9uIGluaXRpYWwgY3JlYXRpb24gKi8KKwkJaWYgKHNlZ19pc19yYWlkX3dpdGhfbWV0YShzZWcpICYmICFsdi0+bGVfY291bnQpIHsKKwkJCWlmICghc2VnLT5tZXRhX2FyZWFzKSB7CisJCQkJbG9nX2Vycm9yKCJObyBtZXRhX2FyZWFzIGZvciBSQUlEIHR5cGUiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJbWV0YV9sdiA9IHNlZ19tZXRhbHYoc2VnLCBzKTsKKwkJCWlmICghbHZfYWRkX3NlZ21lbnQoYWgsIGZhICsgc2VnLT5hcmVhX2NvdW50LCAxLAorCQkJCQkgICAgbWV0YV9sdiwgc2VndHlwZSwgMCwKKwkJCQkJICAgIG1ldGFfbHYtPnN0YXR1cywgMCkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBleHRlbmQgJXMgaW4gJXMuIiwKKwkJCQkJICBtZXRhX2x2LT5uYW1lLCBsdi0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsdl9zZXRfdmlzaWJsZShtZXRhX2x2KTsKKworCQkJLyoKKwkJCSAqIENvcHkgYW55IHRhZ3MgZnJvbSB0aGUgbmV3IExWIHRvIHRoZSBtZXRhZGF0YSBMViBzbworCQkJICogaXQgY2FuIGJlIGFjdGl2YXRlZCB0ZW1wb3JhcmlseS4KKwkJCSAqLworCQkJaWYgKCFzdHJfbGlzdF9kdXAobWV0YV9sdi0+dmctPnZnbWVtLCAmbWV0YV9sdi0+dGFncywgJmx2LT50YWdzKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvcHkgdGFncyBvbnRvIExWICVzIHRvIGNsZWFyIG1ldGFkYXRhLiIsIGRpc3BsYXlfbHZuYW1lKG1ldGFfbHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJY2xlYXJfbWV0YWRhdGEgPSAxOworCQl9CisKKwkJZmEgKz0gc3RyaXBlczsKKwl9CisKKwlpZiAoY2xlYXJfbWV0YWRhdGEpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBjbGVhciB0aGUgbWV0YWRhdGEgYXJlYXMgdXBvbiBjcmVhdGlvbi4KKwkJICovCisJCS8qIEZJWE1FIFZHIGlzIG5vdCBpbiBhIGZ1bGx5LWNvbnNpc3RlbnQgc3RhdGUgaGVyZSBhbmQgc2hvdWxkIG5vdCBiZSBjb21taXR0ZWQhICovCisJCWlmICghdmdfd3JpdGUobHYtPnZnKSB8fCAhdmdfY29tbWl0KGx2LT52ZykpCisJCQlyZXR1cm5fMDsKKworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCW1ldGFfbHYgPSBzZWdfbWV0YWx2KHNlZywgcyk7CisKKwkJCWlmICh0ZXN0X21vZGUoKSkgeworCQkJCWx2X3NldF9oaWRkZW4obWV0YV9sdik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEZvciBjbGVhcmluZywgc2ltcGx5IGFjdGl2YXRlIGxvY2FsbHkgKi8KKwkJCWlmICghYWN0aXZhdGVfbHZfbG9jYWwobWV0YV9sdi0+dmctPmNtZCwgbWV0YV9sdikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSAlcy8lcyBmb3IgY2xlYXJpbmciLAorCQkJCQkgIG1ldGFfbHYtPnZnLT5uYW1lLCBtZXRhX2x2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJbG9nX3ZlcmJvc2UoIkNsZWFyaW5nIG1ldGFkYXRhIGFyZWEgb2YgJXMiLAorCQkJCSAgICBkaXNwbGF5X2x2bmFtZShtZXRhX2x2KSk7CisJCQkvKgorCQkJICogUmF0aGVyIHRoYW4gd2lwaW5nIG1ldGFfbHYtPnNpemUsIHdlIGNhbiBzaW1wbHkKKwkJCSAqIHdpcGUgJzEnIHRvIHJlbW92ZSB0aGUgc3VwZXJibG9jayBvZiBhbnkgcHJldmlvdXMKKwkJCSAqIFJBSUQgZGV2aWNlcy4gIEl0IGlzIG11Y2ggcXVpY2tlci4KKwkJCSAqLworCQkJaWYgKCF3aXBlX2x2KG1ldGFfbHYsIChzdHJ1Y3Qgd2lwZV9wYXJhbXMpCisJCQkJICAgICB7IC5kb196ZXJvID0gMSwgLnplcm9fc2VjdG9ycyA9IDEgfSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB6ZXJvICVzLyVzIiwKKwkJCQkJICBtZXRhX2x2LT52Zy0+bmFtZSwgbWV0YV9sdi0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmICghZGVhY3RpdmF0ZV9sdihtZXRhX2x2LT52Zy0+Y21kLCBtZXRhX2x2KSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRlYWN0aXZhdGUgJXMvJXMiLAorCQkJCQkgIG1ldGFfbHYtPnZnLT5uYW1lLCBtZXRhX2x2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWx2X3NldF9oaWRkZW4obWV0YV9sdik7CisKKwkJCS8qIFdpcGUgYW55IHRlbXBvcmFyeSB0YWdzIHJlcXVpcmVkIGZvciBhY3RpdmF0aW9uLiAqLworCQkJc3RyX2xpc3Rfd2lwZSgmbWV0YV9sdi0+dGFncyk7CisJCX0KKwl9CisKKwlzZWctPmFyZWFfbGVuICs9IGV4dGVudHMgLyBhcmVhX211bHRpcGxlOworCXNlZy0+bGVuICs9IGV4dGVudHM7CisKKwlpZiAoIV9zZXR1cF9sdl9zaXplKGx2LCBsdi0+bGVfY291bnQgKyBleHRlbnRzKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIFRoZSBNRCBiaXRtYXAgaXMgbGltaXRlZCB0byBiZWluZyBhYmxlIHRvIHRyYWNrIDJeMjEgcmVnaW9ucy4KKwkgKiBUaGUgcmVnaW9uX3NpemUgbXVzdCBiZSBhZGp1c3RlZCB0byBtZWV0IHRoYXQgY3JpdGVyaWEKKwkgKiB1bmxlc3MgcmFpZDAvcmFpZDBfbWV0YSwgd2hpY2ggZG9lc24ndCBoYXZlIGEgYml0bWFwLgorCSAqLworCWlmIChzZWdfaXNfcmFpZChzZWcpICYmICFzZWdfaXNfYW55X3JhaWQwKHNlZykpCisJCXdoaWxlIChzZWctPnJlZ2lvbl9zaXplIDwgKGx2LT5zaXplIC8gKDEgPDwgMjEpKSkgeworCQkJc2VnLT5yZWdpb25fc2l6ZSAqPSAyOworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiQWRqdXN0aW5nIFJBSUQgcmVnaW9uX3NpemUgZnJvbSAldVMgdG8gJXVTIgorCQkJCQkgIiB0byBzdXBwb3J0IGxhcmdlIExWIHNpemUiLAorCQkJCQkgc2VnLT5yZWdpb25fc2l6ZS8yLCBzZWctPnJlZ2lvbl9zaXplKTsKKwkJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFbnRyeSBwb2ludCBmb3Igc2luZ2xlLXN0ZXAgTFYgYWxsb2NhdGlvbiArIGV4dGVuc2lvbi4KKyAqIEV4dGVudHMgaXMgdGhlIG51bWJlciBvZiBsb2dpY2FsIGV4dGVudHMgdG8gYXBwZW5kIHRvIHRoZSBMViB1bmxlc3MKKyAqIGFwcHJveF9hbGxvYyBpcyBzZXQgd2hlbiBpdCBpcyBhbiB1cHBlciBsaW1pdCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZgorICogZXh0ZW50cyB0byB1c2UgZnJvbSB0aGUgVkcuCisgKgorICogRklYTUUgVGhlIGFwcHJveF9hbGxvYyByYWlkL3N0cmlwZSBjb252ZXJzaW9uIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBsdl9leHRlbmQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkgICAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCSAgICAgIHVpbnQzMl90IHN0cmlwZXMsIHVpbnQzMl90IHN0cmlwZV9zaXplLAorCSAgICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCSAgICAgIHVpbnQzMl90IGV4dGVudHMsCisJICAgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRhYmxlX3B2cywgYWxsb2NfcG9saWN5X3QgYWxsb2MsCisJICAgICAgaW50IGFwcHJveF9hbGxvYykKK3sKKwlpbnQgciA9IDE7CisJaW50IGxvZ19jb3VudCA9IDA7CisJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWg7CisJdWludDMyX3Qgc3ViX2x2X2NvdW50OworCXVpbnQzMl90IG9sZF9leHRlbnRzOworCXVpbnQzMl90IG5ld19leHRlbnRzOwkvKiBUb3RhbCBsb2dpY2FsIHNpemUgYWZ0ZXIgZXh0ZW5zaW9uLiAqLworCisJbG9nX3ZlcnlfdmVyYm9zZSgiQWRkaW5nIHNlZ21lbnQgb2YgdHlwZSAlcyB0byBMViAlcy4iLCBzZWd0eXBlLT5uYW1lLCBsdi0+bmFtZSk7CisKKwlpZiAoc2VndHlwZV9pc192aXJ0dWFsKHNlZ3R5cGUpKQorCQlyZXR1cm4gbHZfYWRkX3ZpcnR1YWxfc2VnbWVudChsdiwgMHUsIGV4dGVudHMsIHNlZ3R5cGUpOworCisJaWYgKCFsdi0+bGVfY291bnQpIHsKKwkJaWYgKHNlZ3R5cGVfaXNfcG9vbChzZWd0eXBlKSkKKwkJCS8qCisJCQkgKiBQb29sIGFsbG9jYXRpb25zIHRyZWF0IHRoZSBtZXRhZGF0YSBkZXZpY2UgbGlrZSBhIG1pcnJvciBsb2cuCisJCQkgKi8KKwkJCS8qIEZJWE1FIFN1cHBvcnQgc3RyaXBlZCBtZXRhZGF0YSBwb29sICovCisJCQlsb2dfY291bnQgPSAxOworCQllbHNlIGlmIChzZWd0eXBlX2lzX3JhaWQwX21ldGEoc2VndHlwZSkpCisJCQkvKiBFeHRlbmQgcmFpZDAgbWV0YWRhdGEgTFZzIHRvbyAqLworCQkJbG9nX2NvdW50ID0gc3RyaXBlczsKKwkJZWxzZSBpZiAoc2VndHlwZV9pc19yYWlkKHNlZ3R5cGUpICYmICFzZWd0eXBlX2lzX3JhaWQwKHNlZ3R5cGUpKQorCQkJbG9nX2NvdW50ID0gbWlycm9ycyAqIHN0cmlwZXM7CisJfQorCS8qIEZJWE1FIGxvZ19jb3VudCBzaG91bGQgYmUgMSBmb3IgbWlycm9ycyAqLworCisJaWYgKCEoYWggPSBhbGxvY2F0ZV9leHRlbnRzKGx2LT52ZywgbHYsIHNlZ3R5cGUsIHN0cmlwZXMsIG1pcnJvcnMsCisJCQkJICAgIGxvZ19jb3VudCwgcmVnaW9uX3NpemUsIGV4dGVudHMsCisJCQkJICAgIGFsbG9jYXRhYmxlX3B2cywgYWxsb2MsIGFwcHJveF9hbGxvYywgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCW5ld19leHRlbnRzID0gYWgtPm5ld19leHRlbnRzOworCWlmIChzZWd0eXBlX2lzX3JhaWQoc2VndHlwZSkgJiYgIXNlZ3R5cGVfaXNfcmFpZDAoc2VndHlwZSkpCisJCW5ld19leHRlbnRzIC09IGFoLT5sb2dfbGVuICogYWgtPmFyZWFfbXVsdGlwbGU7CisKKwlpZiAoc2VndHlwZV9pc19wb29sKHNlZ3R5cGUpKSB7CisJCWlmICghKHIgPSBjcmVhdGVfcG9vbChsdiwgc2VndHlwZSwgYWgsIHN0cmlwZXMsIHN0cmlwZV9zaXplKSkpCisJCQlzdGFjazsKKwl9IGVsc2UgaWYgKCFzZWd0eXBlX2lzX21pcnJvcmVkKHNlZ3R5cGUpICYmICFzZWd0eXBlX2lzX3JhaWQoc2VndHlwZSkpIHsKKwkJaWYgKCEociA9IGx2X2FkZF9zZWdtZW50KGFoLCAwLCBhaC0+YXJlYV9jb3VudCwgbHYsIHNlZ3R5cGUsCisJCQkJCSBzdHJpcGVfc2l6ZSwgMHUsIDApKSkKKwkJCXN0YWNrOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZvciBSQUlELCBhbGwgdGhlIGRldmljZXMgYXJlIEFSRUFfTFYuCisJCSAqIEhvd2V2ZXIsIGZvciAnbWlycm9yIG9uIHN0cmlwZScgdXNpbmcgbm9uLVJBSUQgdGFyZ2V0cywKKwkJICogdGhlIG1pcnJvciBsZWdzIGFyZSBBUkVBX0xWIHdoaWxlIHRoZSBzdHJpcGVzIHVuZGVybmVhdGgKKwkJICogYXJlIEFSRUFfUFYuCisJCSAqLworCQlpZiAoc2VndHlwZV9pc19yYWlkKHNlZ3R5cGUpKQorCQkJc3ViX2x2X2NvdW50ID0gbWlycm9ycyAqIHN0cmlwZXMgKyBzZWd0eXBlLT5wYXJpdHlfZGV2czsKKwkJZWxzZQorCQkJc3ViX2x2X2NvdW50ID0gbWlycm9yczsKKworCQlvbGRfZXh0ZW50cyA9IGx2LT5sZV9jb3VudDsKKworCQlpZiAoIWx2LT5sZV9jb3VudCAmJgorCQkgICAgIShyID0gX2x2X2luc2VydF9lbXB0eV9zdWJsdnMobHYsIHNlZ3R5cGUsIHN0cmlwZV9zaXplLAorCQkJCQkJICByZWdpb25fc2l6ZSwgc3ViX2x2X2NvdW50KSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluc2VydCBsYXllciBmb3IgJXMiLCBsdi0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghKHIgPSBfbHZfZXh0ZW5kX2xheWVyZWRfbHYoYWgsIGx2LCBuZXdfZXh0ZW50cyAtIGx2LT5sZV9jb3VudCwgMCwKKwkJCQkJCXN0cmlwZXMsIHN0cmlwZV9zaXplKSkpCisJCQlnb3RvX291dDsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmUgZXhwYW5kaW5nIGFuIGV4aXN0aW5nIG1pcnJvciwgd2UgY2FuIHNraXAgdGhlCisJCSAqIHJlc3luYyBvZiB0aGUgZXh0ZW5zaW9uIGlmIHRoZSBMViBpcyBjdXJyZW50bHkgaW4tc3luYworCQkgKiBhbmQgdGhlIExWIGhhcyB0aGUgTFZfTk9UU1lOQ0VEIGZsYWcgc2V0LgorCQkgKi8KKwkJaWYgKG9sZF9leHRlbnRzICYmCisJCSAgICBzZWd0eXBlX2lzX21pcnJvcmVkKHNlZ3R5cGUpICYmCisJCSAgICAobHZfaXNfbm90X3N5bmNlZChsdikpKSB7CisJCQlkbV9wZXJjZW50X3Qgc3luY19wZXJjZW50ID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCisJCQlpZiAoIWx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlYWQgc3luYyBwZXJjZW50IHdoaWxlIExWICVzICIKKwkJCQkJICAiaXMgbm90IGxvY2FsbHkgYWN0aXZlLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJLyogRklYTUUgU3VwcG9ydCAtLWZvcmNlICovCisJCQkJaWYgKHllc19ub19wcm9tcHQoIkRvIGZ1bGwgcmVzeW5jIG9mIGV4dGVuZGVkICIKKwkJCQkJCSAgInBvcnRpb24gb2YgJXM/ICBbeS9uXTogIiwKKwkJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKSA9PSAnbicpIHsKKwkJCQkJciA9IDA7CisJCQkJCWdvdG9fb3V0OworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKCEociA9IGx2X21pcnJvcl9wZXJjZW50KGx2LT52Zy0+Y21kLCBsdiwgMCwKKwkJCQkJCSAgICAmc3luY19wZXJjZW50LCBOVUxMKSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgc3luYyBwZXJjZW50IGZvciAlcy4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHN5bmNfcGVyY2VudCA9PSBETV9QRVJDRU5UXzEwMCkgeworCQkJCWxvZ192ZXJib3NlKCJTa2lwcGluZyBpbml0aWFsIHJlc3luYyBmb3IgIgorCQkJCQkgICAgImV4dGVuZGVkIHBvcnRpb24gb2YgJXMiLAorCQkJCQkgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlpbml0X21pcnJvcl9pbl9zeW5jKDEpOworCQkJCWx2LT5zdGF0dXMgfD0gTFZfTk9UU1lOQ0VEOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzIGNhbm5vdCBiZSBleHRlbmRlZCB3aGlsZSBpdCAiCisJCQkJCSAgImlzIHJlY292ZXJpbmcuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworb3V0OgorCWFsbG9jX2Rlc3Ryb3koYWgpOworCXJldHVybiByOworfQorCisvKgorICogTWluaW1hbCBMViByZW5hbWluZyBmdW5jdGlvbi4KKyAqIE1ldGFkYXRhIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBtYWRlIGJ5IGNhbGxlci4KKyAqIEFzc3VtZXMgbmV3X25hbWUgaXMgYWxsb2NhdGVkIGZyb20gbHYtPnZnbWVtIHBvb2wuCisgKi8KK3N0YXRpYyBpbnQgX3JlbmFtZV9zaW5nbGVfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY2hhciAqbmV3X25hbWUpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBsdi0+dmc7CisJaW50IGhpc3RvcmljYWw7CisKKwlpZiAobHZfbmFtZV9pc191c2VkX2luX3ZnKHZnLCBuZXdfbmFtZSwgJmhpc3RvcmljYWwpKSB7CisJCWxvZ19lcnJvcigiJXNMb2dpY2FsIFZvbHVtZSBcIiVzXCIgYWxyZWFkeSBleGlzdHMgaW4gIgorCQkJICAidm9sdW1lIGdyb3VwIFwiJXNcIiIsIGhpc3RvcmljYWwgPyAiaGlzdG9yaWNhbCAiIDogIiIsCisJCQkgICBuZXdfbmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbG9ja2VkKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCByZW5hbWUgbG9ja2VkIExWICVzIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsdi0+bmFtZSA9IG5ld19uYW1lOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZW5hbWUgc3ViIExWLgorICogJ2x2X25hbWVfb2xkJyBhbmQgJ2x2X25hbWVfbmV3JyBhcmUgb2xkIGFuZCBuZXcgbmFtZXMgb2YgdGhlIG1haW4gTFYuCisgKi8KK3N0YXRpYyBpbnQgX3JlbmFtZV9zdWJfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgY29uc3QgY2hhciAqbHZfbmFtZV9vbGQsIGNvbnN0IGNoYXIgKmx2X25hbWVfbmV3KQoreworCWNvbnN0IGNoYXIgKnN1ZmZpeDsKKwljaGFyICpuZXdfbmFtZTsKKwlzaXplX3QgbGVuOworCisJLyoKKwkgKiBBIHN1YiBMViBuYW1lIHN0YXJ0cyB3aXRoIGx2X25hbWVfb2xkICsgJ18nLgorCSAqIFRoZSBzdWZmaXggZm9sbG93cyBsdl9uYW1lX29sZCBhbmQgaW5jbHVkZXMgJ18nLgorCSAqLworCWxlbiA9IHN0cmxlbihsdl9uYW1lX29sZCk7CisJaWYgKHN0cm5jbXAobHYtPm5hbWUsIGx2X25hbWVfb2xkLCBsZW4pIHx8IGx2LT5uYW1lW2xlbl0gIT0gJ18nKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlbmFtZSBcIiVzXCI6IG5hbWUgZm9ybWF0IG5vdCByZWNvZ25pemVkICIKKwkJCSAgImZvciBpbnRlcm5hbCBMViBcIiVzXCIiLAorCQkJICBsdl9uYW1lX29sZCwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJc3VmZml4ID0gbHYtPm5hbWUgKyBsZW47CisKKwkvKgorCSAqIENvbXBvc2UgYSBuZXcgbmFtZSBmb3Igc3ViIGx2OgorCSAqICAgZS5nLiBuZXcgbmFtZSBpcyAibHZvbDFfbWxvZyIKKwkgKglpZiB0aGUgc3ViIExWIGlzICJsdm9sMF9tbG9nIiBhbmQKKwkgKglhIG5ldyBuYW1lIGZvciBtYWluIExWIGlzICJsdm9sMSIKKwkgKi8KKwlsZW4gPSBzdHJsZW4obHZfbmFtZV9uZXcpICsgc3RybGVuKHN1ZmZpeCkgKyAxOworCW5ld19uYW1lID0gZG1fcG9vbF9hbGxvYyhsdi0+dmctPnZnbWVtLCBsZW4pOworCWlmICghbmV3X25hbWUpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIG5ldyBuYW1lIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZG1fc25wcmludGYobmV3X25hbWUsIGxlbiwgIiVzJXMiLCBsdl9uYW1lX25ldywgc3VmZml4KSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBuYW1lIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmFsaWRhdGVfbmFtZShuZXdfbmFtZSkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgcmVuYW1lIFwiJXNcIi4gTmV3IGxvZ2ljYWwgdm9sdW1lIG5hbWUgXCIlc1wiIGlzIGludmFsaWQuIiwKKwkJCSAgbHYtPm5hbWUsIG5ld19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVuYW1lIGl0ICovCisJcmV0dXJuIF9yZW5hbWVfc2luZ2xlX2x2KGx2LCBuZXdfbmFtZSk7Cit9CisKKy8qIENhbGxiYWNrIGZvciBmb3JfZWFjaF9zdWJfbHYgKi8KK3N0YXRpYyBpbnQgX3JlbmFtZV9jYihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBsdl9uYW1lcyAqbHZfbmFtZXMgPSAoc3RydWN0IGx2X25hbWVzICopIGRhdGE7CisKKwlyZXR1cm4gX3JlbmFtZV9zdWJfbHYobHYsIGx2X25hbWVzLT5vbGQsIGx2X25hbWVzLT5uZXcpOworfQorCisvKgorICogTG9vcCBkb3duIHN1YiBMVnMgYW5kIGNhbGwgZm4gZm9yIGVhY2guCisgKiBmbiBpcyByZXNwb25zaWJsZSB0byBsb2cgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX2Zvcl9lYWNoX3N1Yl9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgc2tpcF9wb29scywKKwkJCSAgICBpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSksCisJCQkgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yZzsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXVpbnQzMl90IHM7CisKKwlpZiAobHZfaXNfY293KGx2KSAmJiBsdl9pc192aXJ0dWFsX29yaWdpbihvcmcgPSBvcmlnaW5fZnJvbV9jb3cobHYpKSkgeworCQlpZiAoIWZuKG9yZywgZGF0YSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFfZm9yX2VhY2hfc3ViX2x2KG9yZywgc2tpcF9wb29scywgZm4sIGRhdGEpKQorCQkJcmV0dXJuXzA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlpZiAoc2VnLT5sb2dfbHYpIHsKKwkJCWlmICghZm4oc2VnLT5sb2dfbHYsIGRhdGEpKQorCQkJCXJldHVybl8wOworCQkJaWYgKCFfZm9yX2VhY2hfc3ViX2x2KHNlZy0+bG9nX2x2LCBza2lwX3Bvb2xzLCBmbiwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlpZiAoc2VnLT5tZXRhZGF0YV9sdikgeworCQkJaWYgKCFmbihzZWctPm1ldGFkYXRhX2x2LCBkYXRhKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmICghX2Zvcl9lYWNoX3N1Yl9sdihzZWctPm1ldGFkYXRhX2x2LCBza2lwX3Bvb2xzLCBmbiwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlpZiAoc2VnLT5wb29sX2x2ICYmICFza2lwX3Bvb2xzKSB7CisJCQlpZiAoIWZuKHNlZy0+cG9vbF9sdiwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIV9mb3JfZWFjaF9zdWJfbHYoc2VnLT5wb29sX2x2LCBza2lwX3Bvb2xzLCBmbiwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpCisJCQkJY29udGludWU7CisJCQlpZiAoIWZuKHNlZ19sdihzZWcsIHMpLCBkYXRhKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmICghX2Zvcl9lYWNoX3N1Yl9sdihzZWdfbHYoc2VnLCBzKSwgc2tpcF9wb29scywgZm4sIGRhdGEpKQorCQkJCXJldHVybl8wOworCQl9CisKKwkJaWYgKCFzZWdfaXNfcmFpZF93aXRoX21ldGEoc2VnKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJBSUQgaGFzIG1ldGFfYXJlYXMgKi8KKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoKHNlZ19tZXRhdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpIHx8ICFzZWdfbWV0YWx2KHNlZywgcykpCisJCQkJY29udGludWU7CisJCQlpZiAoIWZuKHNlZ19tZXRhbHYoc2VnLCBzKSwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIV9mb3JfZWFjaF9zdWJfbHYoc2VnX21ldGFsdihzZWcsIHMpLCBza2lwX3Bvb2xzLCBmbiwgZGF0YSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGZvcl9lYWNoX3N1Yl9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgaW50ICgqZm4pKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHZvaWQgKmRhdGEpLAorCQkgICAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gX2Zvcl9lYWNoX3N1Yl9sdihsdiwgMCwgZm4sIGRhdGEpOworfQorCitpbnQgZm9yX2VhY2hfc3ViX2x2X2V4Y2VwdF9wb29scyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIF9mb3JfZWFjaF9zdWJfbHYobHYsIDEsIGZuLCBkYXRhKTsKK30KKworLyoKKyAqIENvcmUgb2YgTFYgcmVuYW1pbmcgcm91dGluZS4KKyAqIFZHIG11c3QgYmUgbG9ja2VkIGJ5IGNhbGxlci4KKyAqLworaW50IGx2X3JlbmFtZV91cGRhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgY29uc3QgY2hhciAqbmV3X25hbWUsIGludCB1cGRhdGVfbWRhKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCXN0cnVjdCBsdl9uYW1lcyBsdl9uYW1lcyA9IHsgLm9sZCA9IGx2LT5uYW1lIH07CisJaW50IG9sZF9sdl9pc19oaXN0b3JpY2FsID0gbHZfaXNfaGlzdG9yaWNhbChsdik7CisJaW50IGhpc3RvcmljYWw7CisKKwkvKgorCSAqIHJlbmFtZSBpcyBub3QgYWxsb3dlZCBvbiBzdWIgTFZzIGV4Y2VwdCBmb3IgcG9vbHMKKwkgKiAodGhpbiBwb29sIGlzICd2aXNpYmxlJywgYnV0IGNhY2hlIG1heSBub3QpCisJICovCisJaWYgKCFsdl9pc19wb29sKGx2KSAmJgorCSAgICAhbHZfaXNfdmlzaWJsZShsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgcmVuYW1lIGludGVybmFsIExWIFwiJXNcIi4iLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9uYW1lX2lzX3VzZWRfaW5fdmcodmcsIG5ld19uYW1lLCAmaGlzdG9yaWNhbCkpIHsKKwkJbG9nX2Vycm9yKCIlc0xvZ2ljYWwgVm9sdW1lIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyBpbiAiCisJCQkgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgaGlzdG9yaWNhbCA/ICJIaXN0b3JpY2FsICIgOiAiIiwKKwkJCSAgbmV3X25hbWUsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2xvY2tlZChsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgcmVuYW1lIGxvY2tlZCBMViAlcyIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVwZGF0ZV9tZGEgJiYgIWFyY2hpdmUodmcpKQorCQlyZXR1cm5fMDsKKworCWlmIChvbGRfbHZfaXNfaGlzdG9yaWNhbCkgeworCQkvKgorCQkgKiBIaXN0b3JpY2FsIExWcyBoYXZlIG5laXRoZXIgc3ViIExWcyBub3IgYW55CisJCSAqIGRldmljZXMgdG8gcmVsb2FkLCBzbyBqdXN0IHVwZGF0ZSBtZXRhZGF0YS4KKwkJICovCisJCWx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+bmFtZSA9IGx2LT5uYW1lID0gbmV3X25hbWU7CisJCWlmICh1cGRhdGVfbWRhICYmCisJCSAgICAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgeworCQlpZiAoIShsdl9uYW1lcy5uZXcgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgbmV3X25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIG5ldyBuYW1lLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiByZW5hbWUgc3ViIExWcyAqLworCQlpZiAoIWZvcl9lYWNoX3N1Yl9sdl9leGNlcHRfcG9vbHMobHYsIF9yZW5hbWVfY2IsICh2b2lkICopICZsdl9uYW1lcykpCisJCQlyZXR1cm5fMDsKKworCQkvKiByZW5hbWUgbWFpbiBMViAqLworCQlsdi0+bmFtZSA9IGx2X25hbWVzLm5ldzsKKworCQlpZiAobHZfaXNfY293KGx2KSkKKwkJCWx2ID0gb3JpZ2luX2Zyb21fY293KGx2KTsKKworCQlpZiAodXBkYXRlX21kYSAmJiAhbHZfdXBkYXRlX2FuZF9yZWxvYWQoKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKWx2X2xvY2tfaG9sZGVyKGx2KSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENvcmUgb2YgTFYgcmVuYW1pbmcgcm91dGluZS4KKyAqIFZHIG11c3QgYmUgbG9ja2VkIGJ5IGNhbGxlci4KKyAqLworaW50IGx2X3JlbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkgICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlyZXR1cm4gbHZfcmVuYW1lX3VwZGF0ZShjbWQsIGx2LCBuZXdfbmFtZSwgMSk7Cit9CisKKy8qCisgKiBDb3JlIGx2IHJlc2l6ZSBjb2RlCisgKi8KKworI2RlZmluZSBTSVpFX0JVRiAxMjgKKworLyogVE9ETzogdW5pZnkgc3RyaXBlIHNpemUgdmFsaWRhdGlvbiBhY3Jvc3Mgc291cmNlIGNvZGUgKi8KK3N0YXRpYyBpbnQgX3ZhbGlkYXRlX3N0cmlwZXNpemUoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqbHApCit7CisJaWYgKGxwLT5zdHJpcGVfc2l6ZSA+IChTVFJJUEVfU0laRV9MSU1JVCAqIDIpKSB7CisJCWxvZ19lcnJvcigiU3RyaXBlIHNpemUgY2Fubm90IGJlIGxhcmdlciB0aGFuICVzLiIsCisJCQkgIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCAodWludDY0X3QpIFNUUklQRV9TSVpFX0xJTUlUKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChscC0+c3RyaXBlX3NpemUgPiB2Zy0+ZXh0ZW50X3NpemUpIHsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlZHVjaW5nIHN0cmlwZSBzaXplICVzIHRvIG1heGltdW0sICIKKwkJCQkJInBoeXNpY2FsIGV4dGVudCBzaXplICVzLiIsCisJCQkJCWRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCBscC0+c3RyaXBlX3NpemUpLAorCQkJCQlkaXNwbGF5X3NpemUodmctPmNtZCwgdmctPmV4dGVudF9zaXplKSk7CisJCWxwLT5zdHJpcGVfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwl9CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIobHAtPnN0cmlwZV9zaXplKSkgeworCQlsb2dfZXJyb3IoIlN0cmlwZSBzaXplIG11c3QgYmUgcG93ZXIgb2YgMi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcXVlc3RfY29uZmlybWF0aW9uKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJIGNvbnN0IHN0cnVjdCBsdnJlc2l6ZV9wYXJhbXMgKmxwKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCXN0cnVjdCBsdmluZm8gaW5mbyA9IHsgMCB9OworCisJaWYgKCFsdl9pbmZvKHZnLT5jbWQsIGx2LCAwLCAmaW5mbywgMSwgMCkgJiYgZHJpdmVyX3ZlcnNpb24oTlVMTCwgMCkpIHsKKwkJbG9nX2Vycm9yKCJsdl9pbmZvIGZhaWxlZDogYWJvcnRpbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChscC0+cmVzaXplZnMpIHsKKwkJaWYgKCFpbmZvLmV4aXN0cykgeworCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBtdXN0IGJlIGFjdGl2YXRlZCAiCisJCQkJICAiYmVmb3JlIHJlc2l6aW5nIGZpbGVzeXN0ZW0uIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWluZm8uZXhpc3RzKQorCQlyZXR1cm4gMTsKKworCWxvZ193YXJuKCJXQVJOSU5HOiBSZWR1Y2luZyBhY3RpdmUlcyBsb2dpY2FsIHZvbHVtZSB0byAlcy4iLAorCQkgaW5mby5vcGVuX2NvdW50ID8gIiBhbmQgb3BlbiIgOiAiIiwKKwkJIGRpc3BsYXlfc2l6ZSh2Zy0+Y21kLCAodWludDY0X3QpIGxwLT5leHRlbnRzICogdmctPmV4dGVudF9zaXplKSk7CisKKwlsb2dfd2FybigiVEhJUyBNQVkgREVTVFJPWSBZT1VSIERBVEEgKGZpbGVzeXN0ZW0gZXRjLikiKTsKKworCWlmICghbHAtPmZvcmNlKSB7CisJCWlmICh5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVkdWNlICVzPyBbeS9uXTogIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIE5PVCByZWR1Y2VkLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworZW51bSBmc2FkbV9jbWRfZSB7IEZTQURNX0NNRF9DSEVDSywgRlNBRE1fQ01EX1JFU0laRSB9OworI2RlZmluZSBGU0FETV9DTUQgImZzYWRtIgorI2RlZmluZSBGU0FETV9DTURfTUFYX0FSR1MgNgorI2RlZmluZSBGU0FETV9DSEVDS19GQUlMU19GT1JfTU9VTlRFRCAzIC8qIHNoZWxsIGV4aXN0IHN0YXR1cyBjb2RlICovCisKKy8qCisgKiBGU0FETV9DTUQgLS1kcnktcnVuIC0tdmVyYm9zZSAtLWZvcmNlIGNoZWNrIGx2X3BhdGgKKyAqIEZTQURNX0NNRCAtLWRyeS1ydW4gLS12ZXJib3NlIC0tZm9yY2UgcmVzaXplIGx2X3BhdGggc2l6ZQorICovCitzdGF0aWMgaW50IF9mc2FkbV9jbWQoZW51bSBmc2FkbV9jbWRfZSBmY21kLAorCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICB1aW50MzJfdCBleHRlbnRzLAorCQkgICAgICBpbnQgZm9yY2UsCisJCSAgICAgIGludCAqc3RhdHVzKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gdmctPmNtZDsKKwljaGFyIGx2X3BhdGhbUEFUSF9NQVhdOworCWNoYXIgc2l6ZV9idWZbU0laRV9CVUZdOworCWNvbnN0IGNoYXIgKmFyZ3ZbRlNBRE1fQ01EX01BWF9BUkdTICsgMl07CisJdW5zaWduZWQgaSA9IDA7CisKKwlhcmd2W2krK10gPSBGU0FETV9DTUQ7CisKKwlpZiAodGVzdF9tb2RlKCkpCisJCWFyZ3ZbaSsrXSA9ICItLWRyeS1ydW4iOworCisJaWYgKHZlcmJvc2VfbGV2ZWwoKSA+PSBfTE9HX05PVElDRSkKKwkJYXJndltpKytdID0gIi0tdmVyYm9zZSI7CisKKwlpZiAoZm9yY2UpCisJCWFyZ3ZbaSsrXSA9ICItLWZvcmNlIjsKKworCWFyZ3ZbaSsrXSA9IChmY21kID09IEZTQURNX0NNRF9SRVNJWkUpID8gInJlc2l6ZSIgOiAiY2hlY2siOworCisJaWYgKHN0YXR1cykKKwkJKnN0YXR1cyA9IC0xOworCisJaWYgKGRtX3NucHJpbnRmKGx2X3BhdGgsIHNpemVvZihsdl9wYXRoKSwgIiVzJXMvJXMiLCBjbWQtPmRldl9kaXIsCisJCQl2Zy0+bmFtZSwgbHYtPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBMViBwYXRoIGZvciAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhcmd2W2krK10gPSBsdl9wYXRoOworCisJaWYgKGZjbWQgPT0gRlNBRE1fQ01EX1JFU0laRSkgeworCQlpZiAoZG1fc25wcmludGYoc2l6ZV9idWYsIHNpemVvZihzaXplX2J1ZiksIEZNVHU2NCAiSyIsCisJCQkJKHVpbnQ2NF90KSBleHRlbnRzICogKHZnLT5leHRlbnRfc2l6ZSAvIDIpKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZ2VuZXJhdGUgbmV3IExWIHNpemUgc3RyaW5nLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlhcmd2W2krK10gPSBzaXplX2J1ZjsKKwl9CisKKwlhcmd2W2ldID0gTlVMTDsKKworCXJldHVybiBleGVjX2NtZChjbWQsIGFyZ3YsIHN0YXR1cywgMSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfYWRqdXN0X2Ftb3VudChkbV9wZXJjZW50X3QgcGVyY2VudCwgaW50IHBvbGljeV90aHJlc2hvbGQsIGludCBwb2xpY3lfYW1vdW50KQoreworCWlmICghKERNX1BFUkNFTlRfMCA8IHBlcmNlbnQgJiYgcGVyY2VudCA8PSBETV9QRVJDRU5UXzEwMCkgfHwKKwkgICAgcGVyY2VudCA8PSAocG9saWN5X3RocmVzaG9sZCAqIERNX1BFUkNFTlRfMSkpCisJCXJldHVybiAwOyAvKiBub3RoaW5nIHRvIGRvICovCisJLyoKKwkgKiBFdmFsdWF0ZSB0aGUgbWluaW1hbCBhbW91bnQgbmVlZGVkIHRvIGdldCBiZWxsb3cgdGhyZXNob2xkLgorCSAqIEtlZXAgdXNpbmcgRE1fUEVSQ0VOVF8xIHVuaXRzIGZvciBiZXR0ZXIgcHJlY2lzaW9uLgorCSAqIFJvdW5kLXVwIHRvIG5lZWRlZCBwZXJjZW50YWdlIHZhbHVlCisJICovCisJcGVyY2VudCA9IChwZXJjZW50IC8gcG9saWN5X3RocmVzaG9sZCArIChETV9QRVJDRU5UXzEgLSAxKSAvIDEwMCkgLyAoRE1fUEVSQ0VOVF8xIC8gMTAwKSAtIDEwMDsKKworCS8qIFVzZSBpdCBpZiBjdXJyZW50IHBvbGljeSBhbW91bnQgaXMgc21hbGxlciAqLworCXJldHVybiAocG9saWN5X2Ftb3VudCA8IHBlcmNlbnQpID8gKHVpbnQzMl90KSBwZXJjZW50IDogKHVpbnQzMl90KSBwb2xpY3lfYW1vdW50OworfQorCitzdGF0aWMgaW50IF9sdnJlc2l6ZV9hZGp1c3RfcG9saWN5KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgdWludDMyX3QgKmFtb3VudCwgdWludDMyX3QgKm1ldGFfYW1vdW50KQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gbHYtPnZnLT5jbWQ7CisJZG1fcGVyY2VudF90IHBlcmNlbnQ7CisJaW50IHBvbGljeV90aHJlc2hvbGQsIHBvbGljeV9hbW91bnQ7CisKKwkqYW1vdW50ID0gKm1ldGFfYW1vdW50ID0gMDsKKworCWlmIChsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCXBvbGljeV90aHJlc2hvbGQgPQorCQkJZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBhY3RpdmF0aW9uX3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG9sZF9DRkcsCisJCQkJCSAgICAgbHZfY29uZmlnX3Byb2ZpbGUobHYpKTsKKwkJcG9saWN5X2Ftb3VudCA9CisJCQlmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudF9DRkcsCisJCQkJCSAgICAgbHZfY29uZmlnX3Byb2ZpbGUobHYpKTsKKwkJaWYgKHBvbGljeV90aHJlc2hvbGQgPCA1MCkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFRoaW4gcG9vbCBhdXRvZXh0ZW5kIHRocmVzaG9sZCAlZCUlIGlzIHNldCBiZWxvdyAiCisJCQkJICJtaW5pbXVtIHN1cHBvcnRlZCA1MCUlLiIsIHBvbGljeV90aHJlc2hvbGQpOworCQkJcG9saWN5X3RocmVzaG9sZCA9IDUwOworCQl9CisJfSBlbHNlIHsKKwkJcG9saWN5X3RocmVzaG9sZCA9CisJCQlmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fc25hcHNob3RfYXV0b2V4dGVuZF90aHJlc2hvbGRfQ0ZHLCBOVUxMKTsKKwkJcG9saWN5X2Ftb3VudCA9CisJCQlmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fc25hcHNob3RfYXV0b2V4dGVuZF9wZXJjZW50X0NGRywgTlVMTCk7CisJCWlmIChwb2xpY3lfdGhyZXNob2xkIDwgNTApIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBTbmFwc2hvdCBhdXRvZXh0ZW5kIHRocmVzaG9sZCAlZCUlIGlzIHNldCBiZWxsb3cgIgorCQkJCSAibWluaW1hbCBzdXBwb3J0ZWQgdmFsdWUgNTAlJS4iLCBwb2xpY3lfdGhyZXNob2xkKTsKKwkJCXBvbGljeV90aHJlc2hvbGQgPSA1MDsKKwkJfQorCX0KKworCWlmIChwb2xpY3lfdGhyZXNob2xkID49IDEwMCkKKwkJcmV0dXJuIDE7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworCWlmICghcG9saWN5X2Ftb3VudCkgeworCQlsb2dfZXJyb3IoIkNhbid0IGV4dGVuZCAlcyB3aXRoICVzIGF1dG9leHRlbmQgcGVyY2VudCBzZXQgdG8gMCUlLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgIGZpcnN0X3NlZyhsdiktPnNlZ3R5cGUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlYWQgc3RhdGUgb2YgbG9jYWxseSBpbmFjdGl2ZSBMViAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQlpZiAoIWx2X3RoaW5fcG9vbF9wZXJjZW50KGx2LCAxLCAmcGVyY2VudCkpCisJCQlyZXR1cm5fMDsKKworCQkqbWV0YV9hbW91bnQgPSBfYWRqdXN0X2Ftb3VudChwZXJjZW50LCBwb2xpY3lfdGhyZXNob2xkLCBwb2xpY3lfYW1vdW50KTsKKworCQlpZiAoIWx2X3RoaW5fcG9vbF9wZXJjZW50KGx2LCAwLCAmcGVyY2VudCkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgeworCQlpZiAoIWx2X3NuYXBzaG90X3BlcmNlbnQobHYsICZwZXJjZW50KSkKKwkJCXJldHVybl8wOworCX0KKworCSphbW91bnQgPSBfYWRqdXN0X2Ftb3VudChwZXJjZW50LCBwb2xpY3lfdGhyZXNob2xkLCBwb2xpY3lfYW1vdW50KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdWludDMyX3QgbHZzZWdfZ2V0X3N0cmlwZXMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgKnN0cmlwZXNpemUpCit7CisJdWludDMyX3QgczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX21pcnI7CisKKwkvKiBJZiBzZWdtZW50IG1pcnJvcmVkLCBjaGVjayBpZiBpbWFnZXMgYXJlIHN0cmlwZWQgKi8KKwlpZiAoc2VnX2lzX21pcnJvcmVkKHNlZykpCisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9MVikKKwkJCQljb250aW51ZTsKKwkJCXNlZ19taXJyID0gZmlyc3Rfc2VnKHNlZ19sdihzZWcsIHMpKTsKKworCQkJaWYgKHNlZ19pc19zdHJpcGVkKHNlZ19taXJyKSkgeworCQkJCXNlZyA9IHNlZ19taXJyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKworCWlmIChzZWdfaXNfc3RyaXBlZChzZWcpKSB7CisJCSpzdHJpcGVzaXplID0gc2VnLT5zdHJpcGVfc2l6ZTsKKwkJcmV0dXJuIHNlZy0+YXJlYV9jb3VudDsKKwl9CisKKwkqc3RyaXBlc2l6ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2x2cmVzaXplX2NoZWNrKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICBzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zICpscCkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKworCWlmIChsdl9pc19leHRlcm5hbF9vcmlnaW4obHYpKSB7CisJCS8qCisJCSAqIFNpbmNlIGV4dGVybmFsLW9yaWdpbiBjYW4gYmUgYWN0aXZhdGVkIHJlYWQtb25seSwKKwkJICogdGhlcmUgaXMgbm8gd2F5IHRvIHVzZSBleHRlbmRlZCBhcmVhcy4KKwkJICovCisJCWxvZ19lcnJvcigiQ2Fubm90IHJlc2l6ZSBleHRlcm5hbCBvcmlnaW4gbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3JhaWRfaW1hZ2UobHYpIHx8IGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlc2l6ZSBhIFJBSUQgJXMgZGlyZWN0bHkiLAorCQkJICAobHYtPnN0YXR1cyAmIFJBSURfSU1BR0UpID8gImltYWdlIiA6CisJCQkgICJtZXRhZGF0YSBhcmVhIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19yYWlkX3dpdGhfdHJhY2tpbmcobHYpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlc2l6ZSBsb2dpY2FsIHZvbHVtZSAlcyB3aGlsZSBpdCBpcyAiCisJCQkgICJ0cmFja2luZyBhIHNwbGl0IGltYWdlLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChscC0+dXNlX3BvbGljaWVzICYmICFsdl9pc19jb3cobHYpICYmICFsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCWxvZ19lcnJvcigiUG9saWN5LWJhc2VkIHJlc2l6ZSBpcyBzdXBwb3J0ZWQgb25seSBmb3Igc25hcHNob3QgYW5kIHRoaW4gcG9vbCB2b2x1bWVzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X2lzX3Zpc2libGUobHYpICYmCisJICAgICFsdl9pc190aGluX3Bvb2xfbWV0YWRhdGEobHYpICYmCisJICAgICFsdl9pc19sb2NrZF9zYW5sb2NrX2x2KGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlc2l6ZSBpbnRlcm5hbCBsb2dpY2FsIHZvbHVtZSAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbG9ja2VkKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlc2l6ZSBsb2NrZWQgbG9naWNhbCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2NvbnZlcnRpbmcobHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcmVzaXplIGxvZ2ljYWwgdm9sdW1lICVzIHdoaWxlICIKKwkJCSAgImx2Y29udmVydCBpbiBwcm9ncmVzcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X2lzX3RoaW5fcG9vbChsdikgJiYgbHAtPnBvb2xtZXRhZGF0YV9zaXplKSB7CisJCWxvZ19lcnJvcigiLS1wb29sbWV0YWRhdGFzaXplIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCB0aGluIHBvb2xzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHAtPnN0cmlwZV9zaXplKSB7CisJCWlmICghKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfU0VHTUVOVFMpKSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVmFyaWVkIHN0cmlwZXNpemUgbm90IHN1cHBvcnRlZC4gSWdub3JpbmcuIik7CisJCQlscC0+c3RyaXBlX3NpemUgPSBscC0+c3RyaXBlcyA9IDA7CisJCX0gZWxzZSBpZiAoIV92YWxpZGF0ZV9zdHJpcGVzaXplKHZnLCBscCkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAobHAtPnJlc2l6ZWZzICYmCisJICAgIChsdl9pc190aGluX3Bvb2wobHYpIHx8CisJICAgICBsdl9pc190aGluX3Bvb2xfZGF0YShsdikgfHwKKwkgICAgIGx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShsdikgfHwKKwkgICAgIGx2X2lzX3Bvb2xfbWV0YWRhdGFfc3BhcmUobHYpIHx8CisJICAgICBsdl9pc19sb2NrZF9zYW5sb2NrX2x2KGx2KSkpIHsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIklnbm9yaW5nIC0tcmVzaXplZnMgYXMgdm9sdW1lICVzIGRvZXMgbm90IGhhdmUgYSBmaWxlc3lzdGVtLiIsCisJCQkJCWRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWxwLT5yZXNpemVmcyA9IDA7CisJfQorCisJaWYgKGxwLT5zdHJpcGVzICYmCisJICAgICEodmctPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9TRUdNRU5UUykpIHsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZhcmllZCBzdHJpcGluZyBub3Qgc3VwcG9ydGVkLiBJZ25vcmluZy4iKTsKKwkJbHAtPnN0cmlwZXMgPSAwOworCX0KKworCWlmIChscC0+bWlycm9ycyAmJgorCSAgICAhKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfU0VHTUVOVFMpKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJNaXJyb3JzIG5vdCBzdXBwb3J0ZWQuIElnbm9yaW5nLiIpOworCQlscC0+bWlycm9ycyA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2cmVzaXplX2FkanVzdF9zaXplKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSB1aW50NjRfdCBzaXplLCBzaWduX3Qgc2lnbiwKKwkJCQkgdWludDMyX3QgKmV4dGVudHMpCit7CisJdWludDMyX3QgZXh0ZW50X3NpemUgPSB2Zy0+ZXh0ZW50X3NpemU7CisJdWludDMyX3QgYWRqdXN0OworCisJLyoKKwkgKiBGaXJzdCBhZGp1c3QgdG8gYW4gZXhhY3QgbXVsdGlwbGUgb2YgZXh0ZW50IHNpemUuCisJICogV2hlbiBjaGFuZ2luZyB0byBhbiBhYnNvbHV0ZSBzaXplLCB3ZSByb3VuZCB0aGF0IHNpemUgdXAuCisJICogV2hlbiBleHRlbmRpbmcgYnkgYSByZWxhdGl2ZSBhbW91bnQgd2Ugcm91bmQgdGhhdCBhbW91bnQgdXAuCisJICogV2hlbiByZWR1Y2luZyBieSBhIHJlbGF0aXZlIGFtb3VudCB3ZSByZW1vdmUgYXQgbW9zdCB0aGF0IGFtb3VudC4KKwkgKi8KKwlpZiAoKGFkanVzdCA9IChzaXplICUgZXh0ZW50X3NpemUpKSkgeworCQlpZiAoc2lnbiAhPSBTSUdOX01JTlVTKSAvKiBub3QgcmVkdWNpbmcgKi8KKwkJCXNpemUgKz0gZXh0ZW50X3NpemU7CisKKwkJc2l6ZSAtPSBhZGp1c3Q7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSb3VuZGluZyBzaXplIHRvIGJvdW5kYXJ5IGJldHdlZW4gcGh5c2ljYWwgZXh0ZW50czogJXMuIiwKKwkJCQkJZGlzcGxheV9zaXplKHZnLT5jbWQsIHNpemUpKTsKKwl9CisKKwkqZXh0ZW50cyA9IHNpemUgLyBleHRlbnRfc2l6ZTsKKworCXJldHVybiAxOworfQorCisvKgorICogSWYgcGVyY2VudCBvcHRpb25zIHdlcmUgdXNlZCwgY29udmVydCB0aGVtIGludG8gYWN0dWFsIG51bWJlcnMgb2YgZXh0ZW50cy4KKyAqLworc3RhdGljIGludCBfbHZyZXNpemVfZXh0ZW50c19mcm9tX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICBzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zICpscCwKKwkJCQkJICBzdHJ1Y3QgZG1fbGlzdCAqcHZoKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCXVpbnQzMl90IHB2X2V4dGVudF9jb3VudDsKKwl1aW50MzJfdCBvbGRfZXh0ZW50cyA9IGxwLT5leHRlbnRzOworCisJc3dpdGNoIChscC0+cGVyY2VudCkgeworCQljYXNlIFBFUkNFTlRfVkc6CisJCQlscC0+ZXh0ZW50cyA9IHBlcmNlbnRfb2ZfZXh0ZW50cyhscC0+ZXh0ZW50cywgdmctPmV4dGVudF9jb3VudCwKKwkJCQkJCQkgKGxwLT5zaWduICE9IFNJR05fTUlOVVMpKTsKKwkJCWJyZWFrOworCQljYXNlIFBFUkNFTlRfRlJFRToKKwkJCWxwLT5leHRlbnRzID0gcGVyY2VudF9vZl9leHRlbnRzKGxwLT5leHRlbnRzLCB2Zy0+ZnJlZV9jb3VudCwKKwkJCQkJCQkgKGxwLT5zaWduICE9IFNJR05fTUlOVVMpKTsKKwkJCWJyZWFrOworCQljYXNlIFBFUkNFTlRfTFY6CisJCQlscC0+ZXh0ZW50cyA9IHBlcmNlbnRfb2ZfZXh0ZW50cyhscC0+ZXh0ZW50cywgbHYtPmxlX2NvdW50LAorCQkJCQkJCSAobHAtPnNpZ24gIT0gU0lHTl9NSU5VUykpOworCQkJYnJlYWs7CisJCWNhc2UgUEVSQ0VOVF9QVlM6CisJCQlpZiAocHZoICE9ICZ2Zy0+cHZzKSB7CisJCQkJcHZfZXh0ZW50X2NvdW50ID0gcHZfbGlzdF9leHRlbnRzX2ZyZWUocHZoKTsKKwkJCQlscC0+ZXh0ZW50cyA9IHBlcmNlbnRfb2ZfZXh0ZW50cyhscC0+ZXh0ZW50cywgcHZfZXh0ZW50X2NvdW50LAorCQkJCQkJCQkgKGxwLT5zaWduICE9IFNJR05fTUlOVVMpKTsKKwkJCX0gZWxzZQorCQkJCWxwLT5leHRlbnRzID0gcGVyY2VudF9vZl9leHRlbnRzKGxwLT5leHRlbnRzLCB2Zy0+ZXh0ZW50X2NvdW50LAorCQkJCQkJCQkgKGxwLT5zaWduICE9IFNJR05fTUlOVVMpKTsKKwkJCWJyZWFrOworCQljYXNlIFBFUkNFTlRfT1JJR0lOOgorCQkJaWYgKCFsdl9pc19jb3cobHYpKSB7CisJCQkJbG9nX2Vycm9yKCJTcGVjaWZpZWQgTFYgZG9lcyBub3QgaGF2ZSBhbiBvcmlnaW4gTFYuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlscC0+ZXh0ZW50cyA9IHBlcmNlbnRfb2ZfZXh0ZW50cyhscC0+ZXh0ZW50cywgb3JpZ2luX2Zyb21fY293KGx2KS0+bGVfY291bnQsCisJCQkJCQkJIChscC0+c2lnbiAhPSBTSUdOX01JTlVTKSk7CisJCQlicmVhazsKKwkJY2FzZSBQRVJDRU5UX05PTkU6CisJCQlyZXR1cm4gMTsJLyogTm90aGluZyB0byBkbyAqLworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbnN1cHBvcnRlZCBwZXJjZW50IHR5cGUgJXUuIiwgbHAtPnBlcmNlbnQpOworCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxwLT5wZXJjZW50ID09IFBFUkNFTlRfVkcgfHwgbHAtPnBlcmNlbnQgPT0gUEVSQ0VOVF9GUkVFIHx8IGxwLT5wZXJjZW50ID09IFBFUkNFTlRfUFZTKQorCQlscC0+ZXh0ZW50c19hcmVfcGVzID0gMTsKKworCWlmIChscC0+c2lnbiA9PSBTSUdOX05PTkUgJiYgKGxwLT5wZXJjZW50ID09IFBFUkNFTlRfVkcgfHwgbHAtPnBlcmNlbnQgPT0gUEVSQ0VOVF9GUkVFIHx8IGxwLT5wZXJjZW50ID09IFBFUkNFTlRfUFZTKSkKKwkJbHAtPmFwcHJveF9hbGxvYyA9IDE7CisKKwlpZiAobHAtPnNpZ24gPT0gU0lHTl9QTFVTICYmIGxwLT5wZXJjZW50ID09IFBFUkNFTlRfRlJFRSkKKwkJbHAtPmFwcHJveF9hbGxvYyA9IDE7CisKKwlsb2dfdmVyYm9zZSgiQ29udmVydGVkICUiIFBSSXUzMiAiJSUlcyBpbnRvICVzJSIgUFJJdTMyICIgJXMgZXh0ZW50cy4iLCBvbGRfZXh0ZW50cywgZ2V0X3BlcmNlbnRfc3RyaW5nKGxwLT5wZXJjZW50KSwKKwkJICAgIGxwLT5hcHByb3hfYWxsb2MgPyAiYXQgbW9zdCAiIDogIiIsIGxwLT5leHRlbnRzLCBscC0+ZXh0ZW50c19hcmVfcGVzID8gInBoeXNpY2FsIiA6ICJsb2dpY2FsIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYWRkX3BlcyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCXVpbnQzMl90ICpwZV90b3RhbCA9IGRhdGE7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwl1aW50MzJfdCBzOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfUFYpCisJCQkJY29udGludWU7CisKKwkJCSpwZV90b3RhbCArPSBzZWdfcHZzZWcoc2VnLCBzKS0+bGVuOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfbHZfcGVfY291bnQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwl1aW50MzJfdCBwZV90b3RhbCA9IDA7CisKKwkvKiBUb3AtbGV2ZWwgTFYgZmlyc3QgKi8KKwlpZiAoIV9hZGRfcGVzKGx2LCAmcGVfdG90YWwpKQorCQlzdGFjazsKKworCS8qIEFueSBzdWItTFZzICovCisJaWYgKCFmb3JfZWFjaF9zdWJfbHYobHYsIF9hZGRfcGVzLCAmcGVfdG90YWwpKQorCQlzdGFjazsKKworCXJldHVybiBwZV90b3RhbDsKK30KKworLyogRklYTUUgQXZvaWQgaGF2aW5nIHZhcmlhYmxlcyBsaWtlIGxwLT5leHRlbnRzIG1lYW4gZGlmZmVyZW50IHRoaW5ncyBhdCBkaWZmZXJlbnQgcGxhY2VzICovCitzdGF0aWMgaW50IF9sdnJlc2l6ZV9hZGp1c3RfZXh0ZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zICpscCwKKwkJCQkgICAgc3RydWN0IGRtX2xpc3QgKnB2aCkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IHZnLT5jbWQ7CisJdWludDMyX3QgbG9naWNhbF9leHRlbnRzX3VzZWQgPSAwOworCXVpbnQzMl90IHBoeXNpY2FsX2V4dGVudHNfdXNlZCA9IDA7CisJdWludDMyX3Qgc2VnX3N0cmlwZXMgPSAwLCBzZWdfc3RyaXBlc2l6ZSA9IDA7CisJdWludDMyX3Qgc2VnX21pcnJvcnMgPSAwOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsICpzZWdfbGFzdDsKKwl1aW50MzJfdCBzeiwgc3RyOworCXVpbnQzMl90IHNlZ19sb2dpY2FsX2V4dGVudHM7CisJdWludDMyX3Qgc2VnX3BoeXNpY2FsX2V4dGVudHM7CisJdWludDMyX3QgYXJlYV9tdWx0aXBsZTsKKwl1aW50MzJfdCBzdHJpcGVzX2V4dGVudHM7CisJdWludDMyX3Qgc2l6ZV9yZXN0OworCXVpbnQzMl90IGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50cyA9IGx2LT5sZV9jb3VudDsKKwl1aW50MzJfdCBleGlzdGluZ19waHlzaWNhbF9leHRlbnRzLCBzYXZlZF9leGlzdGluZ19waHlzaWNhbF9leHRlbnRzOworCXVpbnQzMl90IGV4aXN0aW5nX2V4dGVudHM7CisJdWludDMyX3Qgc2VnX3NpemUgPSAwOworCXVpbnQzMl90IG5ld19leHRlbnRzOworCWludCByZWR1Y2luZyA9IDA7CisKKwlzZWdfbGFzdCA9IGxhc3Rfc2VnKGx2KTsKKworCS8qIEZJWE1FIFN1cHBvcnQgTFZzIHdpdGggbWl4ZWQgc2VnbWVudCB0eXBlcyAqLworCWlmIChscC0+c2VndHlwZSAmJiAobHAtPnNlZ3R5cGUgIT0gc2VnX2xhc3QtPnNlZ3R5cGUpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lVHlwZSBkb2VzIG5vdCBtYXRjaCAoJXMpLiIsIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVXNlIHNlZ21lbnQgdHlwZSBvZiBsYXN0IHNlZ21lbnQgKi8KKwlscC0+c2VndHlwZSA9IHNlZ19sYXN0LT5zZWd0eXBlOworCisJLyogRm9yIHZpcnR1YWwgZGV2aWNlcywganVzdCBwcmV0ZW5kIHRoZSBwaHlzaWNhbCBzaXplIG1hdGNoZXMuICovCisJZXhpc3RpbmdfcGh5c2ljYWxfZXh0ZW50cyA9IHNhdmVkX2V4aXN0aW5nX3BoeXNpY2FsX2V4dGVudHMgPSBfbHZfcGVfY291bnQobHYpOworCWlmICghZXhpc3RpbmdfcGh5c2ljYWxfZXh0ZW50cykgeworCQlleGlzdGluZ19waHlzaWNhbF9leHRlbnRzID0gbHYtPmxlX2NvdW50OworCQlscC0+ZXh0ZW50c19hcmVfcGVzID0gMDsKKwl9CisKKwlleGlzdGluZ19leHRlbnRzID0gKGxwLT5leHRlbnRzX2FyZV9wZXMpCisJCT8gZXhpc3RpbmdfcGh5c2ljYWxfZXh0ZW50cyA6IGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50czsKKworCS8qIEluaXRpYWwgZGVjaXNpb24gb24gd2hldGhlciB3ZSBhcmUgZXh0ZW5kaW5nIG9yIHJlZHVjaW5nICovCisJaWYgKGxwLT5zaWduID09IFNJR05fTUlOVVMgfHwKKwkgICAgKGxwLT5zaWduID09IFNJR05fTk9ORSAmJiAobHAtPmV4dGVudHMgPCBleGlzdGluZ19leHRlbnRzKSkpCisJCXJlZHVjaW5nID0gMTsKKworCS8qIElmIGV4dGVuZGluZywgZmluZCBwcm9wZXJ0aWVzIG9mIGxhc3Qgc2VnbWVudCAqLworCWlmICghcmVkdWNpbmcpIHsKKwkJc2VnX21pcnJvcnMgPSBzZWdfaXNfbWlycm9yZWQoc2VnX2xhc3QpID8gbHZfbWlycm9yX2NvdW50KGx2KSA6IDA7CisKKwkJaWYgKCFscC0+bWlycm9ycyAmJiBzZWdfbWlycm9ycykgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkV4dGVuZGluZyAlIiBQUkl1MzIgIiBtaXJyb3IgaW1hZ2VzLiIsIHNlZ19taXJyb3JzKTsKKwkJCWxwLT5taXJyb3JzID0gc2VnX21pcnJvcnM7CisJCX0gZWxzZSBpZiAoKGxwLT5taXJyb3JzIHx8IHNlZ19taXJyb3JzKSAmJiAobHAtPm1pcnJvcnMgIT0gc2VnX21pcnJvcnMpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCB2YXJ5IG51bWJlciBvZiBtaXJyb3JzIGluIExWIHlldC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHNlZ19pc19yYWlkMTAoc2VnX2xhc3QpKSB7CisJCQlpZiAoIXNlZ19taXJyb3JzKSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNaXNzaW5nIG1pcnJvciBzZWdtZW50cyBmb3IgJXMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogRklYTUUgV2FybiBpZiBjb21tYW5kIGxpbmUgdmFsdWVzIGFyZSBiZWluZyBvdmVycmlkZGVuPyAqLworCQkJbHAtPnN0cmlwZXMgPSBzZWdfbGFzdC0+YXJlYV9jb3VudCAvIHNlZ19taXJyb3JzOworCQkJbHAtPnN0cmlwZV9zaXplID0gc2VnX2xhc3QtPnN0cmlwZV9zaXplOworCQl9IGVsc2UgaWYgKCEobHAtPnN0cmlwZXMgPT0gMSB8fCAobHAtPnN0cmlwZXMgPiAxICYmIGxwLT5zdHJpcGVfc2l6ZSkpKSB7CisJCQkvKiBJZiBleHRlbmRpbmcsIGZpbmQgc3RyaXBlcywgc3RyaXBlc2l6ZSAmIHNpemUgb2YgbGFzdCBzZWdtZW50ICovCisJCQkvKiBGSVhNRSBEb24ndCBhc3N1bWUgbWlycm9yIHNlZyB3aWxsIGFsd2F5cyBiZSBBUkVBX0xWICovCisJCQkvKiBGSVhNRSBXZSB3aWxsIG5lZWQgdG8gc3VwcG9ydCByZXNpemUgZm9yIG1ldGFkYXRhIExWIGFzIHdlbGwsCisJCQkgKiAgICAgICBhbmQgZGF0YSBMViBjb3VsZCBiZSBhbnkgdHlwZSAoaS5lLiBtaXJyb3IpKSAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgc2VnX21pcnJvcnMgPyAmc2VnX2x2KHNlZ19sYXN0LCAwKS0+c2VnbWVudHMgOiAmbHYtPnNlZ21lbnRzKSB7CisJCQkJLyogQWxsb3cgdGhyb3VnaCAic3RyaXBlZCIgYW5kIFJBSUQgNC81LzYvMTAgKi8KKwkJCQlpZiAoIXNlZ19pc19zdHJpcGVkKHNlZykgJiYKKwkJCQkgICAgKCFzZWdfaXNfcmFpZChzZWcpIHx8IHNlZ19pc19taXJyb3JlZChzZWcpKSAmJgorCQkJCSAgICAhc2VnX2lzX3JhaWQxMChzZWcpKQorCQkJCQljb250aW51ZTsKKworCQkJCXN6ID0gc2VnLT5zdHJpcGVfc2l6ZTsKKwkJCQlzdHIgPSBzZWctPmFyZWFfY291bnQgLSBscC0+c2VndHlwZS0+cGFyaXR5X2RldnM7CisKKwkJCQlpZiAoKHNlZ19zdHJpcGVzaXplICYmIHNlZ19zdHJpcGVzaXplICE9IHN6ICYmCisJCQkJICAgICBzeiAmJiAhbHAtPnN0cmlwZV9zaXplKSB8fAorCQkJCSAgICAoc2VnX3N0cmlwZXMgJiYgc2VnX3N0cmlwZXMgIT0gc3RyICYmICFscC0+c3RyaXBlcykpIHsKKwkJCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBudW1iZXIgb2YgIgorCQkJCQkJICAic3RyaXBlcyAoLWkpIGFuZCBzdHJpcGVzaXplICgtSSkiKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJc2VnX3N0cmlwZXNpemUgPSBzejsKKwkJCQlzZWdfc3RyaXBlcyA9IHN0cjsKKwkJCX0KKworCQkJaWYgKCFscC0+c3RyaXBlcykKKwkJCQlscC0+c3RyaXBlcyA9IHNlZ19zdHJpcGVzOworCQkJZWxzZSBpZiAoc2VnX2lzX3JhaWQoZmlyc3Rfc2VnKGx2KSkgJiYKKwkJCQkgKGxwLT5zdHJpcGVzICE9IHNlZ19zdHJpcGVzKSkgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGV4dGVuZCBcIiVzXCIgc2VnbWVudCB0eXBlIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBzdHJpcGVzLiIsCisJCQkJCSAgbHZzZWdfbmFtZShmaXJzdF9zZWcobHYpKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmICghbHAtPnN0cmlwZV9zaXplICYmIGxwLT5zdHJpcGVzID4gMSkgeworCQkJCWlmIChzZWdfc3RyaXBlc2l6ZSkgeworCQkJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVXNpbmcgc3RyaXBlc2l6ZSBvZiBsYXN0IHNlZ21lbnQgJXMiLAorCQkJCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIHNlZ19zdHJpcGVzaXplKSk7CisJCQkJCWxwLT5zdHJpcGVfc2l6ZSA9IHNlZ19zdHJpcGVzaXplOworCQkJCX0gZWxzZSB7CisJCQkJCWxwLT5zdHJpcGVfc2l6ZSA9CisJCQkJCQlmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIG1ldGFkYXRhX3N0cmlwZXNpemVfQ0ZHLCBOVUxMKSAqIDI7CisJCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJVc2luZyBkZWZhdWx0IHN0cmlwZXNpemUgJXMiLAorCQkJCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIGxwLT5zdHJpcGVfc2l6ZSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChscC0+c3RyaXBlcyA+IDEgJiYgIWxwLT5zdHJpcGVfc2l6ZSkgeworCQkJbG9nX2Vycm9yKCJTdHJpcGVzaXplIGZvciBzdHJpcGVkIHNlZ21lbnQgc2hvdWxkIG5vdCBiZSAwISIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBEZXRlcm1pbmUgdGhlIGFtb3VudCB0byBleHRlbmQgYnkgKi8KKwkJaWYgKGxwLT5zaWduID09IFNJR05fUExVUykKKwkJCXNlZ19zaXplID0gbHAtPmV4dGVudHM7CisJCWVsc2UKKwkJCXNlZ19zaXplID0gbHAtPmV4dGVudHMgLSBleGlzdGluZ19leHRlbnRzOworCisJCS8qIENvbnZlcnQgUEVzIHRvIExFcyAqLworCQlpZiAobHAtPmV4dGVudHNfYXJlX3BlcyAmJiAhc2VnX2lzX3N0cmlwZWQoc2VnX2xhc3QpICYmICFzZWdfaXNfdmlydHVhbChzZWdfbGFzdCkpIHsKKwkJCWFyZWFfbXVsdGlwbGUgPSBfY2FsY19hcmVhX211bHRpcGxlKHNlZ19sYXN0LT5zZWd0eXBlLCBzZWdfbGFzdC0+YXJlYV9jb3VudCwgMCk7CisJCQlzZWdfc2l6ZSA9IHNlZ19zaXplICogYXJlYV9tdWx0aXBsZSAvIChzZWdfbGFzdC0+YXJlYV9jb3VudCAtIHNlZ19sYXN0LT5zZWd0eXBlLT5wYXJpdHlfZGV2cyk7CisJCQlzZWdfc2l6ZSA9IChzZWdfc2l6ZSAvIGFyZWFfbXVsdGlwbGUpICogYXJlYV9tdWx0aXBsZTsKKwkJfQorCisJCWlmIChzZWdfc2l6ZSA+PSAoTUFYX0VYVEVOVF9DT1VOVCAtIGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50cykpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGV4dGVuZCAlcyBieSAldSBsb2dpY2FsIGV4dGVudHM6IGV4Y2VlZHMgbGltaXQgKCV1KS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBzZWdfc2l6ZSwgTUFYX0VYVEVOVF9DT1VOVCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwLT5leHRlbnRzID0gZXhpc3RpbmdfbG9naWNhbF9leHRlbnRzICsgc2VnX3NpemU7CisKKwkJLyogRG9uJ3QgYWxsb3cgYSBjb3cgdG8gZ3JvdyBsYXJnZXIgdGhhbiBuZWNlc3NhcnkuICovCisJCWlmIChsdl9pc19jb3cobHYpKSB7CisJCQlsb2dpY2FsX2V4dGVudHNfdXNlZCA9IGNvd19tYXhfZXh0ZW50cyhvcmlnaW5fZnJvbV9jb3cobHYpLCBmaW5kX3NuYXBzaG90KGx2KS0+Y2h1bmtfc2l6ZSk7CisJCQlpZiAobG9naWNhbF9leHRlbnRzX3VzZWQgPCBscC0+ZXh0ZW50cykgeworCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSZWFjaGVkIG1heGltdW0gQ09XIHNpemUgJXMgKCUiIFBSSXUzMiAiIGV4dGVudHMpLiIsCisJCQkJCQkJZGlzcGxheV9zaXplKHZnLT5jbWQsICh1aW50NjRfdCkgdmctPmV4dGVudF9zaXplICogbG9naWNhbF9leHRlbnRzX3VzZWQpLAorCQkJCQkJCWxvZ2ljYWxfZXh0ZW50c191c2VkKTsKKwkJCQlscC0+ZXh0ZW50cyA9IGxvZ2ljYWxfZXh0ZW50c191c2VkOwkvLyBDSEFOR0VTIGxwLT5leHRlbnRzCisJCQkJc2VnX3NpemUgPSBscC0+ZXh0ZW50cyAtIGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50czsJLy8gUmVjYWxjdWxhdGUKKwkJCQlpZiAobHAtPmV4dGVudHMgPT0gZXhpc3RpbmdfbG9naWNhbF9leHRlbnRzKSB7CisJCQkJCS8qIFNpZ25hbCB0aGF0IG5vcm1hbCByZXNpemluZyBpcyBub3QgcmVxdWlyZWQgKi8KKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsgIC8qIElmIHJlZHVjaW5nLCBmaW5kIHN0cmlwZXMsIHN0cmlwZXNpemUgJiBzaXplIG9mIGxhc3Qgc2VnbWVudCAqLworCQlpZiAobHAtPnN0cmlwZXMgfHwgbHAtPnN0cmlwZV9zaXplIHx8IGxwLT5taXJyb3JzKQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIklnbm9yaW5nIHN0cmlwZXMsIHN0cmlwZXNpemUgYW5kIG1pcnJvcnMgIgorCQkJCQkJImFyZ3VtZW50cyB3aGVuIHJlZHVjaW5nLiIpOworCisJCWlmIChscC0+c2lnbiA9PSBTSUdOX01JTlVTKSAgeworCQkJaWYgKGxwLT5leHRlbnRzID49IGV4aXN0aW5nX2V4dGVudHMpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZWR1Y2UgJXMgYmVsb3cgMSBleHRlbnQuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbmV3X2V4dGVudHMgPSBleGlzdGluZ19leHRlbnRzIC0gbHAtPmV4dGVudHM7CisJCX0gZWxzZQorCQkJbmV3X2V4dGVudHMgPSBscC0+ZXh0ZW50czsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCQlzZWdfbG9naWNhbF9leHRlbnRzID0gc2VnLT5sZW47CisJCQlzZWdfcGh5c2ljYWxfZXh0ZW50cyA9IHNlZy0+YXJlYV9sZW4gKiBzZWctPmFyZWFfY291bnQ7CS8qIEZJWE1FIEFsc28gbWV0YWRhdGEsIGNvdyBldGMuICovCisKKwkJCS8qIENoZWNrIGZvciB1bmRlcmx5aW5nIHN0cmlwZSBzaXplcyAqLworCQkJc2VnX3N0cmlwZXMgPSBsdnNlZ19nZXRfc3RyaXBlcyhzZWcsICZzZWdfc3RyaXBlc2l6ZSk7CisKKwkJCWlmIChzZWdfaXNfbWlycm9yZWQoc2VnKSkKKwkJCQlzZWdfbWlycm9ycyA9IGx2X21pcnJvcl9jb3VudChzZWctPmx2KTsKKwkJCWVsc2UKKwkJCQlzZWdfbWlycm9ycyA9IDA7CisKKwkJCS8qIEhhdmUgd2UgcmVhY2hlZCB0aGUgZmluYWwgc2VnbWVudCBvZiB0aGUgbmV3IExWPyAqLworCQkJaWYgKGxwLT5leHRlbnRzX2FyZV9wZXMpIHsKKwkJCQlpZiAobmV3X2V4dGVudHMgPD0gcGh5c2ljYWxfZXh0ZW50c191c2VkICsgc2VnX3BoeXNpY2FsX2V4dGVudHMpIHsKKwkJCQkJc2VnX3NpemUgPSBuZXdfZXh0ZW50cyAtIHBoeXNpY2FsX2V4dGVudHNfdXNlZDsKKwkJCQkJaWYgKHNlZ19taXJyb3JzKQorCQkJCQkJc2VnX3NpemUgLz0gc2VnX21pcnJvcnM7CisJCQkJCWxwLT5leHRlbnRzID0gbG9naWNhbF9leHRlbnRzX3VzZWQgKyBzZWdfc2l6ZTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl9IGVsc2UgaWYgKG5ld19leHRlbnRzIDw9IGxvZ2ljYWxfZXh0ZW50c191c2VkICsgc2VnX2xvZ2ljYWxfZXh0ZW50cykgeworCQkJCXNlZ19zaXplID0gbmV3X2V4dGVudHMgLSBsb2dpY2FsX2V4dGVudHNfdXNlZDsKKwkJCQlscC0+ZXh0ZW50cyA9IG5ld19leHRlbnRzOworCQkJCWJyZWFrOworCQkJfQorCisJCQlsb2dpY2FsX2V4dGVudHNfdXNlZCArPSBzZWdfbG9naWNhbF9leHRlbnRzOworCQkJcGh5c2ljYWxfZXh0ZW50c191c2VkICs9IHNlZ19waHlzaWNhbF9leHRlbnRzOworCQl9CisKKwkJbHAtPnN0cmlwZV9zaXplID0gc2VnX3N0cmlwZXNpemU7CisJCWxwLT5zdHJpcGVzID0gc2VnX3N0cmlwZXM7CisJCWxwLT5taXJyb3JzID0gc2VnX21pcnJvcnM7CisJfQorCisJLyogQXQgdGhpcyBwb2ludCwgbHAtPmV4dGVudHMgc2hvdWxkIGhvbGQgdGhlIGNvcnJlY3QgTkVXIGxvZ2ljYWwgc2l6ZSByZXF1aXJlZC4gKi8KKworCWlmICghbHAtPmV4dGVudHMpIHsKKwkJbG9nX2Vycm9yKCJOZXcgc2l6ZSBvZiAwIG5vdCBwZXJtaXR0ZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChscC0+ZXh0ZW50cyA9PSBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpIHsKKwkJaWYgKCFscC0+cmVzaXplZnMpIHsKKwkJCWxvZ19lcnJvcigiTmV3IHNpemUgKCVkIGV4dGVudHMpIG1hdGNoZXMgZXhpc3Rpbmcgc2l6ZSAoJWQgZXh0ZW50cykuIiwKKwkJCQkgIGxwLT5leHRlbnRzLCBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHAtPnJlc2l6ZSA9IExWX0VYVEVORDsgLyogbGV0cyBwcmV0ZW5kIHplcm8gc2l6ZSBleHRlbnNpb24gKi8KKwl9CisKKwkvKiBQZXJmb3JtIGFueSByb3VuZGluZyB0byBwcm9kdWNlIGNvbXBsZXRlIHN0cmlwZXMuICovCisJaWYgKGxwLT5zdHJpcGVzID4gMSkgeworCQlpZiAobHAtPnN0cmlwZV9zaXplIDwgU1RSSVBFX1NJWkVfTUlOKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgc3RyaXBlIHNpemUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgbHAtPnN0cmlwZV9zaXplKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFNlZ21lbnQgc2l6ZSBpbiBleHRlbnRzIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHN0cmlwZXMgKi8KKwkJc3RyaXBlc19leHRlbnRzID0gbHAtPnN0cmlwZXM7CisJCWlmIChscC0+c3RyaXBlX3NpemUgPiB2Zy0+ZXh0ZW50X3NpemUpCisJCQkvKiBTdHJpcCBzaXplIGlzIGJpZ2dlciB0aGVuIGV4dGVudCBzaXplIG5lZWRzIG1vcmUgZXh0ZW50cyAqLworCQkJc3RyaXBlc19leHRlbnRzICo9IChscC0+c3RyaXBlX3NpemUgLyB2Zy0+ZXh0ZW50X3NpemUpOworCisJCXNpemVfcmVzdCA9IHNlZ19zaXplICUgc3RyaXBlc19leHRlbnRzOworCQkvKiBSb3VuZCB0b3dhcmQgdGhlIG9yaWdpbmFsIHNpemUuICovCisJCWlmIChzaXplX3Jlc3QgJiYKKwkJICAgICgobHAtPmV4dGVudHMgPCBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpIHx8CisJCSAgICAgIWxwLT5wZXJjZW50IHx8CisJCSAgICAgKHZnLT5mcmVlX2NvdW50ID49IChscC0+ZXh0ZW50cyAtIGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50cyAtIHNpemVfcmVzdCArCisJCQkJCSBzdHJpcGVzX2V4dGVudHMpKSkpIHsKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSb3VuZGluZyBzaXplICglZCBleHRlbnRzKSB1cCB0byBzdHJpcGUgIgorCQkJCQkJImJvdW5kYXJ5IHNpemUgZm9yIHNlZ21lbnQgKCVkIGV4dGVudHMpLiIsCisJCQkJCQlscC0+ZXh0ZW50cywKKwkJCQkJCWxwLT5leHRlbnRzIC0gc2l6ZV9yZXN0ICsgc3RyaXBlc19leHRlbnRzKTsKKwkJCWxwLT5leHRlbnRzID0gbHAtPmV4dGVudHMgLSBzaXplX3Jlc3QgKyBzdHJpcGVzX2V4dGVudHM7CisJCX0gZWxzZSBpZiAoc2l6ZV9yZXN0KSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUm91bmRpbmcgc2l6ZSAoJWQgZXh0ZW50cykgZG93biB0byBzdHJpcGUgIgorCQkJCQkJImJvdW5kYXJ5IHNpemUgZm9yIHNlZ21lbnQgKCVkIGV4dGVudHMpIiwKKwkJCQkJCWxwLT5leHRlbnRzLCBscC0+ZXh0ZW50cyAtIHNpemVfcmVzdCk7CisJCQlscC0+ZXh0ZW50cyA9IGxwLT5leHRlbnRzIC0gc2l6ZV9yZXN0OworCQl9CisJfQorCisJLyogRmluYWwgc2FuaXR5IGNoZWNraW5nICovCisJaWYgKGxwLT5leHRlbnRzIDwgZXhpc3RpbmdfbG9naWNhbF9leHRlbnRzKSB7CisJCWlmIChscC0+cmVzaXplID09IExWX0VYVEVORCkgeworCQkJbG9nX2Vycm9yKCJOZXcgc2l6ZSBnaXZlbiAoJWQgZXh0ZW50cykgbm90IGxhcmdlciAiCisJCQkJICAidGhhbiBleGlzdGluZyBzaXplICglZCBleHRlbnRzKSIsCisJCQkJICBscC0+ZXh0ZW50cywgZXhpc3RpbmdfbG9naWNhbF9leHRlbnRzKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxwLT5yZXNpemUgPSBMVl9SRURVQ0U7CisJfSBlbHNlIGlmIChscC0+ZXh0ZW50cyA+IGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50cykgeworCQlpZiAobHAtPnJlc2l6ZSA9PSBMVl9SRURVQ0UpIHsKKwkJCWxvZ19lcnJvcigiTmV3IHNpemUgZ2l2ZW4gKCVkIGV4dGVudHMpIG5vdCBsZXNzIHRoYW4gIgorCQkJCSAgImV4aXN0aW5nIHNpemUgKCVkIGV4dGVudHMpIiwgbHAtPmV4dGVudHMsCisJCQkJICBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHAtPnJlc2l6ZSA9IExWX0VYVEVORDsKKwl9IGVsc2UgaWYgKChscC0+ZXh0ZW50cyA9PSBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpICYmICFscC0+dXNlX3BvbGljaWVzKSB7CisJCWlmICghbHAtPnJlc2l6ZWZzKSB7CisJCQlsb2dfZXJyb3IoIk5ldyBzaXplICglZCBleHRlbnRzKSBtYXRjaGVzIGV4aXN0aW5nIHNpemUgIgorCQkJCSAgIiglZCBleHRlbnRzKSIsIGxwLT5leHRlbnRzLCBleGlzdGluZ19sb2dpY2FsX2V4dGVudHMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHAtPnJlc2l6ZSA9IExWX0VYVEVORDsKKwl9CisKKwkvKgorCSAqIEhhcyB0aGUgdXNlciBzcGVjaWZpZWQgdGhhdCB0aGV5IHdvdWxkIGxpa2UgdGhlIGFkZGl0aW9uYWwKKwkgKiBleHRlbnRzIG9mIGEgbWlycm9yIG5vdCB0byBoYXZlIGFuIGluaXRpYWwgc3luYz8KKwkgKi8KKwlpZiAoKGxwLT5leHRlbnRzID4gZXhpc3RpbmdfbG9naWNhbF9leHRlbnRzKSkgeworCQlpZiAoc2VnX2lzX21pcnJvcmVkKGZpcnN0X3NlZyhsdikpICYmIGxwLT5ub3N5bmMpCisJCQlsdi0+c3RhdHVzIHw9IExWX05PVFNZTkNFRDsKKwl9CisKKwlsb2dfZGVidWcoIk5ldyBzaXplIGZvciAlczogJSIgUFJJdTMyICIuIEV4aXN0aW5nIGxvZ2ljYWwgZXh0ZW50czogJSIgUFJJdTMyICIgLyBwaHlzaWNhbCBleHRlbnRzOiAlIiBQUkl1MzIgIi4iLAorCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHAtPmV4dGVudHMsIGV4aXN0aW5nX2xvZ2ljYWxfZXh0ZW50cywgc2F2ZWRfZXhpc3RpbmdfcGh5c2ljYWxfZXh0ZW50cyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZyZXNpemVfY2hlY2tfdHlwZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCWNvbnN0IHN0cnVjdCBsdnJlc2l6ZV9wYXJhbXMgKmxwKQoreworCWlmIChsdl9pc19vcmlnaW4obHYpKSB7CisJCWlmIChscC0+cmVzaXplID09IExWX1JFRFVDRSkgeworCQkJbG9nX2Vycm9yKCJTbmFwc2hvdCBvcmlnaW4gdm9sdW1lcyBjYW5ub3QgYmUgcmVkdWNlZCBpbiBzaXplIHlldC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGx2X2lzX2FjdGl2ZShsdikpIHsKKwkJCWxvZ19lcnJvcigiU25hcHNob3Qgb3JpZ2luIHZvbHVtZXMgY2FuIGJlIHJlc2l6ZWQgIgorCQkJCSAgIm9ubHkgd2hpbGUgaW5hY3RpdmU6IHRyeSBsdmNoYW5nZSAtYW4uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChscC0+cmVzaXplID09IExWX1JFRFVDRSkgeworCQlpZiAobHZfaXNfdGhpbl9wb29sX2RhdGEobHYpKSB7CisJCQlsb2dfZXJyb3IoIlRoaW4gcG9vbCB2b2x1bWVzICVzIGNhbm5vdCBiZSByZWR1Y2VkIGluIHNpemUgeWV0LiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShsdikpIHsKKwkJCWxvZ19lcnJvcigiVGhpbiBwb29sIG1ldGFkYXRhIHZvbHVtZXMgY2Fubm90IGJlIHJlZHVjZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAobHAtPnJlc2l6ZSA9PSBMVl9FWFRFTkQpICB7CisJCWlmIChsdl9pc190aGluX3Bvb2xfbWV0YWRhdGEobHYpICYmCisJCSAgICAhdGhpbl9wb29sX2ZlYXR1cmVfc3VwcG9ydGVkKGZpbmRfcG9vbF9zZWcoZmlyc3Rfc2VnKGx2KSktPmx2LCBUSElOX0ZFQVRVUkVfTUVUQURBVEFfUkVTSVpFKSkgeworCQkJbG9nX2Vycm9yKCJTdXBwb3J0IGZvciBvbmxpbmUgbWV0YWRhdGEgcmVzaXplIG9mICVzIG5vdCBkZXRlY3RlZC4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogVmFsaWRhdGUgdGhpbiB0YXJnZXQgc3VwcG9ydHMgYmlnZ2VyIHNpemUgb2YgdGhpbiB2b2x1bWUgdGhlbiBleHRlcm5hbCBvcmlnaW4gKi8KKwkJaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSAmJiBmaXJzdF9zZWcobHYpLT5leHRlcm5hbF9sdiAmJgorCQkgICAgKGx2LT5zaXplID4gZmlyc3Rfc2VnKGx2KS0+ZXh0ZXJuYWxfbHYtPnNpemUpICYmCisJCSAgICAhdGhpbl9wb29sX2ZlYXR1cmVfc3VwcG9ydGVkKGZpcnN0X3NlZyhsdiktPnBvb2xfbHYsIFRISU5fRkVBVFVSRV9FWFRFUk5BTF9PUklHSU5fRVhURU5EKSkgeworCQkJbG9nX2Vycm9yKCJUaGluIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG9yaWdpbiBzbWFsbGVyIHRoZW4gdGhpbiB2b2x1bWUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdnJlc2l6ZV92b2x1bWUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zICpscCwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqcHZoKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gdmctPmNtZDsKKwl1aW50MzJfdCBvbGRfZXh0ZW50czsKKwlhbGxvY19wb2xpY3lfdCBhbGxvYyA9IGxwLT5hbGxvYyA/IDogbHYtPmFsbG9jOworCisJb2xkX2V4dGVudHMgPSBsdi0+bGVfY291bnQ7CisJbG9nX3ZlcmJvc2UoIiVzaW5nIGxvZ2ljYWwgdm9sdW1lICVzIHRvICVzJXMiLAorCQkgICAgKGxwLT5yZXNpemUgPT0gTFZfUkVEVUNFKSA/ICJSZWR1YyIgOiAiRXh0ZW5kIiwKKwkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHAtPmFwcHJveF9hbGxvYyA/ICJ1cCB0byAiIDogIiIsCisJCSAgICBkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIGxwLT5leHRlbnRzICogdmctPmV4dGVudF9zaXplKSk7CisKKwlpZiAobHAtPnJlc2l6ZSA9PSBMVl9SRURVQ0UpIHsKKwkJaWYgKCFsdl9yZWR1Y2UobHYsIGx2LT5sZV9jb3VudCAtIGxwLT5leHRlbnRzKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSBpZiAoKGxwLT5leHRlbnRzID4gbHYtPmxlX2NvdW50KSAmJiAvKiBFbnN1cmUgd2UgZXh0ZW5kICovCisJCSAgICFsdl9leHRlbmQobHYsIGxwLT5zZWd0eXBlLAorCQkJICAgICAgbHAtPnN0cmlwZXMsIGxwLT5zdHJpcGVfc2l6ZSwKKwkJCSAgICAgIGxwLT5taXJyb3JzLCBmaXJzdF9zZWcobHYpLT5yZWdpb25fc2l6ZSwKKwkJCSAgICAgIGxwLT5leHRlbnRzIC0gbHYtPmxlX2NvdW50LAorCQkJICAgICAgcHZoLCBhbGxvYywgbHAtPmFwcHJveF9hbGxvYykpCisJCXJldHVybl8wOworCS8qIENoZWNrIGZvciBvdmVyIHByb3Zpc2lvbmluZyBvbmx5IHdoZW4gbHZfZXh0ZW5kKCkgcGFzc2VkLAorCSAqIEFUTSB0aGlzIGNoZWNrIGRvZXMgbm90IGZhaWwgKi8KKwllbHNlIGlmICghcG9vbF9jaGVja19vdmVycHJvdmlzaW9uaW5nKGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAob2xkX2V4dGVudHMgPT0gbHYtPmxlX2NvdW50KQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU2l6ZSBvZiBsb2dpY2FsIHZvbHVtZSAlcyB1bmNoYW5nZWQgZnJvbSAlcyAoJSIgUFJJdTMyICIgZXh0ZW50cykuIiwKKwkJCQkJZGlzcGxheV9sdm5hbWUobHYpLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIG9sZF9leHRlbnRzICogdmctPmV4dGVudF9zaXplKSwgb2xkX2V4dGVudHMpOworCWVsc2UgeworCQlscC0+c2l6ZV9jaGFuZ2VkID0gMTsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlNpemUgb2YgbG9naWNhbCB2b2x1bWUgJXMgY2hhbmdlZCBmcm9tICVzICglIiBQUkl1MzIgIiBleHRlbnRzKSB0byAlcyAoJSIgUFJJdTMyICIgZXh0ZW50cykuIiwKKwkJCQkJZGlzcGxheV9sdm5hbWUobHYpLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIG9sZF9leHRlbnRzICogdmctPmV4dGVudF9zaXplKSwgb2xkX2V4dGVudHMsCisJCQkJCWRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgbHYtPmxlX2NvdW50ICogdmctPmV4dGVudF9zaXplKSwgbHYtPmxlX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZyZXNpemVfcHJlcGFyZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKipsdiwKKwkJCSAgICAgc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqbHAsCisJCQkgICAgIHN0cnVjdCBkbV9saXN0ICpwdmgpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoKmx2KS0+dmc7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKCpsdikpCisJCSpsdiA9IHNlZ19sdihmaXJzdF9zZWcoKmx2KSwgMCk7IC8qIHN3aXRjaCB0byBkYXRhIExWICovCisKKwkvKiBSZXNvbHZlIGV4dGVudHMgZnJvbSBzaXplICovCisJaWYgKGxwLT5zaXplICYmICFfbHZyZXNpemVfYWRqdXN0X3NpemUodmcsIGxwLT5zaXplLCBscC0+c2lnbiwgJmxwLT5leHRlbnRzKSkKKwkJcmV0dXJuXzA7CisJZWxzZSBpZiAobHAtPmV4dGVudHMgJiYgIV9sdnJlc2l6ZV9leHRlbnRzX2Zyb21fcGVyY2VudCgqbHYsIGxwLCBwdmgpKQorCQlyZXR1cm5fMDsKKworCWlmICghX2x2cmVzaXplX2FkanVzdF9leHRlbnRzKCpsdiwgbHAsIHB2aCkpCisJCXJldHVybl8wOworCisJaWYgKCFfbHZyZXNpemVfY2hlY2tfdHlwZSgqbHYsIGxwKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyogU2V0IGF1eCBMViBwcm9wZXJ0aWVzLCB3ZSBjYW4ndCB1c2UgdGhvc2UgZnJvbSBjb21tYW5kIGxpbmUgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKl9sdnJlc2l6ZV9zZXR1cF9hdXgoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJCSAgc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqbHApCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKm1zZWcgPSBsYXN0X3NlZyhsdik7CisKKwlscC0+YWxsb2MgPSBsdi0+YWxsb2M7CisJbHAtPm1pcnJvcnMgPSBzZWdfaXNfbWlycm9yZWQobXNlZykgPyBsdl9taXJyb3JfY291bnQobHYpIDogMDsKKwlscC0+cmVzaXplZnMgPSAwOworCWxwLT5zdHJpcGVzID0gbHAtPm1pcnJvcnMgPyBtc2VnLT5hcmVhX2NvdW50IC8gbHAtPm1pcnJvcnMgOiAwOworCWxwLT5zdHJpcGVfc2l6ZSA9IG1zZWctPnN0cmlwZV9zaXplOworCisJcmV0dXJuIGx2OworfQorCitpbnQgbHZfcmVzaXplKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJICAgICAgc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqbHAsCisJICAgICAgc3RydWN0IGRtX2xpc3QgKnB2aCkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IHZnLT5jbWQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2NrX2x2ID0gKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSopIGx2X2xvY2tfaG9sZGVyKGx2KTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmF1eF9sdiA9IE5VTEw7IC8qIE5vdGU6IGF1eF9sdiBuZXZlciByZXNpemVzIGZzICovCisJc3RydWN0IGx2cmVzaXplX3BhcmFtcyBhdXhfbHA7CisJaW50IGFjdGl2YXRlZCA9IDA7CisJaW50IHJldCA9IDA7CisJaW50IHN0YXR1czsKKworCWlmICghX2x2cmVzaXplX2NoZWNrKGx2LCBscCkpCisJCXJldHVybl8wOworCisJaWYgKGxwLT51c2VfcG9saWNpZXMpIHsKKwkJbHAtPmV4dGVudHMgPSAwOworCQlscC0+c2lnbiA9IFNJR05fUExVUzsKKwkJbHAtPnBlcmNlbnQgPSBQRVJDRU5UX0xWOworCisJCWF1eF9scCA9ICpscDsKKwkJaWYgKCFfbHZyZXNpemVfYWRqdXN0X3BvbGljeShsdiwgJmxwLT5leHRlbnRzLCAmYXV4X2xwLmV4dGVudHMpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFscC0+ZXh0ZW50cykgeworCQkJaWYgKCFhdXhfbHAuZXh0ZW50cykKKwkJCQlyZXR1cm4gMTsgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJCS8qIFJlc2l6ZSB0aGluLXBvb2wgbWV0YWRhdGEgYXMgbWFpbmx2ICovCisJCQlsdiA9IGZpcnN0X3NlZyhsdiktPm1ldGFkYXRhX2x2OyAvKiBtZXRhZGF0YSBMViAqLworCQkJbHAtPmV4dGVudHMgPSBhdXhfbHAuZXh0ZW50czsKKwkJfSBlbHNlIGlmIChhdXhfbHAuZXh0ZW50cykgeworCQkJLyogQWxzbyByZXNpemUgdGhpbi1wb29sIG1ldGFkYXRhICovCisJCQlhdXhfbHYgPSBfbHZyZXNpemVfc2V0dXBfYXV4KGZpcnN0X3NlZyhsdiktPm1ldGFkYXRhX2x2LCAmYXV4X2xwKTsKKwkJfQorCX0gZWxzZSBpZiAobHAtPnBvb2xtZXRhZGF0YV9zaXplKSB7CisJCWlmICghbHAtPmV4dGVudHMgJiYgIWxwLT5zaXplKSB7CisJCQkvKiBXaGVuIG9ubHkgLS1wb29sbWV0YWRhdGFzaXplIGdpdmVuIGFuZCBub3QgLS1zaXplCisJCQkgKiBzd2l0Y2ggZGlyZWN0bHkgdG8gcmVzaXplIG1ldGFkYXRhIExWICovCisJCQlsdiA9IGZpcnN0X3NlZyhsdiktPm1ldGFkYXRhX2x2OworCQkJbHAtPnNpemUgPSBscC0+cG9vbG1ldGFkYXRhX3NpemU7CisJCQlscC0+c2lnbiA9IGxwLT5wb29sbWV0YWRhdGFfc2lnbjsKKwkJfSBlbHNlIHsKKwkJCWF1eF9scCA9ICpscDsKKwkJCWF1eF9sdiA9IF9sdnJlc2l6ZV9zZXR1cF9hdXgoZmlyc3Rfc2VnKGx2KS0+bWV0YWRhdGFfbHYsICZhdXhfbHApOworCQkJYXV4X2xwLnNpemUgPSBscC0+cG9vbG1ldGFkYXRhX3NpemU7CisJCQlhdXhfbHAuc2lnbiA9IGxwLT5wb29sbWV0YWRhdGFfc2lnbjsKKwkJfQorCX0KKworCWlmIChhdXhfbHYgJiYgIV9sdnJlc2l6ZV9wcmVwYXJlKCZhdXhfbHYsICZhdXhfbHAsIHB2aCkpCisJCXJldHVybl8wOworCisJLyogQWx3YXlzIHNob3VsZCBoYXZlIGxwLT5zaXplIG9yIGxwLT5leHRlbnRzICovCisJaWYgKCFfbHZyZXNpemVfcHJlcGFyZSgmbHYsIGxwLCBwdmgpKQorCQlyZXR1cm5fMDsKKworCWlmICgoKGxwLT5yZXNpemUgPT0gTFZfUkVEVUNFKSB8fAorCSAgICAgKGF1eF9sdiAmJiBhdXhfbHAucmVzaXplID09IExWX1JFRFVDRSkpICYmCisJICAgIChwdmggIT0gJnZnLT5wdnMpKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiSWdub3JpbmcgUFZzIG9uIGNvbW1hbmQgbGluZSB3aGVuIHJlZHVjaW5nLiIpOworCisJLyogUmVxdWVzdCBjb25maXJtYXRpb24gYmVmb3JlIG9wZXJhdGlvbnMgdGhhdCBhcmUgb2Z0ZW4gbWlzdGFrZXMuICovCisJLyogYXV4X2x2IG5ldmVyIHJlc2l6ZSBmcyAqLworCWlmICgobHAtPnJlc2l6ZWZzIHx8IChscC0+cmVzaXplID09IExWX1JFRFVDRSkpICYmCisJICAgICFfcmVxdWVzdF9jb25maXJtYXRpb24obHYsIGxwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHAtPnJlc2l6ZWZzKSB7CisJCWlmICghbHAtPm5vZnNjayAmJgorCQkgICAgIV9mc2FkbV9jbWQoRlNBRE1fQ01EX0NIRUNLLCBsdiwgMCwgbHAtPmZvcmNlLCAmc3RhdHVzKSkgeworCQkJaWYgKHN0YXR1cyAhPSBGU0FETV9DSEVDS19GQUlMU19GT1JfTU9VTlRFRCkgeworCQkJCWxvZ19lcnJvcigiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKiBzb21lIGZpbGVzeXN0ZW1zIHN1cHBvcnQgb25saW5lIHJlc2l6ZSAqLworCQl9CisKKwkJLyogRklYTUUgZm9ya3MgaGVyZSAqLworCQlpZiAoKGxwLT5yZXNpemUgPT0gTFZfUkVEVUNFKSAmJgorCQkgICAgIV9mc2FkbV9jbWQoRlNBRE1fQ01EX1JFU0laRSwgbHYsIGxwLT5leHRlbnRzLCBscC0+Zm9yY2UsIE5VTEwpKSB7CisJCQlsb2dfZXJyb3IoIkZpbGVzeXN0ZW0gcmVzaXplIGZhaWxlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFscC0+ZXh0ZW50cyAmJiAoIWF1eF9sdiB8fCAhYXV4X2xwLmV4dGVudHMpKSB7CisJCWxwLT5leHRlbnRzID0gbHYtPmxlX2NvdW50OworCQlnb3RvIG91dDsgLyogTm90aGluZyB0byBkbyAqLworCX0KKworCWlmIChsdl9pc190aGluX3Bvb2wobG9ja19sdikgJiYgIC8qIExvY2sgaG9sZGVyIGlzIHRoaW4tcG9vbCAqLworCSAgICAhbHZfaXNfYWN0aXZlKGxvY2tfbHYpKSB7CisKKwkJaWYgKCFhY3RpdmF0aW9uKCkpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IHJlc2l6ZSAlcyB3aXRob3V0IHVzaW5nICIKKwkJCQkgICJkZXZpY2UtbWFwcGVyIGtlcm5lbCBkcml2ZXIuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGxvY2tfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIEFjdGl2ZSAnaGlkZGVuJyAtdHBvb2wgY2FuIGJlIHdhaXRpbmcgZm9yIHJlc2l6ZSwgYnV0IHRoZQorCQkgKiBwb29sIExWIGl0c2VsZiBtaWdodCBiZSBpbmFjdGl2ZS4KKwkJICogSGVyZSBwbGFpbiBzdXNwZW5kL3Jlc3VtZSB3b3VsZCBub3Qgd29yay4KKwkJICogU28gYWN0aXZlIHRlbXBvcmFyaWx5IHBvb2wgTFYgKHdpdGggb24gZGlzayBtZXRhZGF0YSkKKwkJICogdGhlbiB1c2Ugc3VzcGVuZCBhbmQgcmVzdW1lIGFuZCBkZWFjdGl2YXRlIHBvb2wgTFYsCisJCSAqIGluc3RlYWQgb2Ygc2VhcmNoaW5nIGZvciBhbiBhY3RpdmUgdGhpbiB2b2x1bWUuCisJCSAqLworCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2woY21kLCBsb2NrX2x2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWN0aXZhdGUgJXMuIiwgZGlzcGxheV9sdm5hbWUobG9ja19sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlhY3RpdmF0ZWQgPSAxOworCX0KKworCS8qCisJICogSWYgdGhlIExWIGlzIGxvY2tlZCBmcm9tIGFjdGl2YXRpb24sIHRoaXMgbG9jayBjYWxsIGlzIGEgbm8tb3AuCisJICogT3RoZXJ3aXNlLCB0aGlzIGFjcXVpcmVzIGEgdHJhbnNpZW50IGxvY2sgb24gdGhlIGx2IChub3QgUEVSU0lTVEVOVCkuCisJICovCisJaWYgKCFsb2NrZF9sdihjbWQsIGxvY2tfbHYsICJleCIsIDApKQorCQlyZXR1cm5fMDsKKworCWlmICghYXJjaGl2ZSh2ZykpCisJCXJldHVybl8wOworCisJaWYgKGF1eF9sdikgeworCQlpZiAoIV9sdnJlc2l6ZV92b2x1bWUoYXV4X2x2LCAmYXV4X2xwLCBwdmgpKQorCQkJZ290b19iYWQ7CisKKwkJLyogc3RvcmUgdmcgb24gZGlzayhzKSAqLworCQlpZiAoYXV4X2xwLnNpemVfY2hhbmdlZCAmJiAhbHZfdXBkYXRlX2FuZF9yZWxvYWQobG9ja19sdikpCisJCQlnb3RvX2JhZDsKKwl9CisKKwlpZiAoIV9sdnJlc2l6ZV92b2x1bWUobHYsIGxwLCBwdmgpKQorCQlnb3RvX2JhZDsKKworCS8qIHN0b3JlIHZnIG9uIGRpc2socykgKi8KKwlpZiAoIWxwLT5zaXplX2NoYW5nZWQpCisJCWdvdG8gb3V0OyAvKiBObyB0YWJsZSByZWxvYWQgbmVlZGVkICovCisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKGxvY2tfbHYpKQorCQlnb3RvX2JhZDsKKworCWlmIChsdl9pc19jb3dfY292ZXJpbmdfb3JpZ2luKGx2KSkKKwkJaWYgKCFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgbHYsIDAsIDApKQorCQkJc3RhY2s7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGxvY2tfbHYpKSB7CisJCS8qIFVwZGF0ZSBsdm0gcG9vbCBtZXRhZGF0YSAoZHJvcCBtZXNzYWdlcykuICovCisJCWlmICghdXBkYXRlX3Bvb2xfbHYobG9ja19sdiwgMCkpCisJCQlnb3RvX2JhZDsKKworCQliYWNrdXAodmcpOworCX0KK291dDoKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgc3VjY2Vzc2Z1bGx5IHJlc2l6ZWQuIiwKKwkJCQlkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKGxwLT5yZXNpemVmcyAmJiAobHAtPnJlc2l6ZSA9PSBMVl9FWFRFTkQpICYmCisJICAgICFfZnNhZG1fY21kKEZTQURNX0NNRF9SRVNJWkUsIGx2LCBscC0+ZXh0ZW50cywgbHAtPmZvcmNlLCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwlyZXQgPSAxOworYmFkOgorCWlmIChhY3RpdmF0ZWQgJiYgIWRlYWN0aXZhdGVfbHYoY21kLCBsb2NrX2x2KSkgeworCQlsb2dfZXJyb3IoIlByb2JsZW0gZGVhY3RpdmF0aW5nICVzLiIsIGRpc3BsYXlfbHZuYW1lKGxvY2tfbHYpKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitjaGFyICpnZW5lcmF0ZV9sdl9uYW1lKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpmb3JtYXQsCisJCSAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmdsdmw7CisJaW50IGhpZ2ggPSAtMSwgaTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWlmIChzc2NhbmYobHZsLT5sdi0+bmFtZSwgZm9ybWF0LCAmaSkgIT0gMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpID4gaGlnaCkKKwkJCWhpZ2ggPSBpOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhnbHZsLCAmdmctPmhpc3RvcmljYWxfbHZzKSB7CisJCWlmIChzc2NhbmYoZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT5uYW1lLCBmb3JtYXQsICZpKSAhPSAxKQorCQkJY29udGludWU7CisKKwkJaWYgKGkgPiBoaWdoKQorCQkJaGlnaCA9IGk7CisJfQorCisJaWYgKGRtX3NucHJpbnRmKGJ1ZmZlciwgbGVuLCBmb3JtYXQsIGhpZ2ggKyAxKSA8IDApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdldF9vcl9jcmVhdGVfZ2x2KHN0cnVjdCBkbV9wb29sKm1lbSwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50ICpnbHZfY3JlYXRlZCkKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqZ2x2OworCisJaWYgKCEoZ2x2ID0gbHYtPnRoaXNfZ2x2KSkgeworCQlpZiAoIShnbHYgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSkpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZ2VuZXJpYyBsb2dpY2FsIHZvbHVtZSBzdHJ1Y3R1cmUuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlnbHYtPmxpdmUgPSBsdjsKKwkJbHYtPnRoaXNfZ2x2ID0gZ2x2OworCQlpZiAoZ2x2X2NyZWF0ZWQpCisJCQkqZ2x2X2NyZWF0ZWQgPSAxOworCX0gZWxzZSBpZiAoZ2x2X2NyZWF0ZWQpCisJCSpnbHZfY3JlYXRlZCA9IDA7CisKKwlyZXR1cm4gZ2x2OworfQorCitzdHJ1Y3QgZ2x2X2xpc3QgKmdldF9vcl9jcmVhdGVfZ2x2bChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgKmdsdl9jcmVhdGVkKQoreworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKworCWlmICghKGdsdmwgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgZ2x2X2xpc3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZ2VuZXJpYyBsb2dpY2FsIHZvbHVtZSBsaXN0IGl0ZW0uIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGdsdmwtPmdsdiA9IGdldF9vcl9jcmVhdGVfZ2x2KG1lbSwgbHYsIGdsdl9jcmVhdGVkKSkpIHsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgZ2x2bCk7CisJCXJldHVybl9OVUxMOworCX0KKworCXJldHVybiBnbHZsOworfQorCitpbnQgYWRkX2dsdl90b19pbmRpcmVjdF9nbHZzKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICBzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2dsdiwKKwkJCQkgIHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpnbHYpCit7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsOworCisJaWYgKCEoZ2x2bCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCBnbHZfbGlzdCkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBnZW5lcmljIHZvbHVtZSBsaXN0IGl0ZW0gIgorCQkJICAiZm9yIGluZGlyZWN0IGdsdiAlcyIsIGdsdi0+aXNfaGlzdG9yaWNhbCA/IGdsdi0+aGlzdG9yaWNhbC0+bmFtZQorCQkJCQkJCQkgICAgOiBnbHYtPmxpdmUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnbHZsLT5nbHYgPSBnbHY7CisKKwlpZiAoZ2x2LT5pc19oaXN0b3JpY2FsKQorCQlnbHYtPmhpc3RvcmljYWwtPmluZGlyZWN0X29yaWdpbiA9IG9yaWdpbl9nbHY7CisJZWxzZQorCQlmaXJzdF9zZWcoZ2x2LT5saXZlKS0+aW5kaXJlY3Rfb3JpZ2luID0gb3JpZ2luX2dsdjsKKworCWlmIChvcmlnaW5fZ2x2KSB7CisJCWlmIChvcmlnaW5fZ2x2LT5pc19oaXN0b3JpY2FsKQorCQkJZG1fbGlzdF9hZGQoJm9yaWdpbl9nbHYtPmhpc3RvcmljYWwtPmluZGlyZWN0X2dsdnMsICZnbHZsLT5saXN0KTsKKwkJZWxzZQorCQkJZG1fbGlzdF9hZGQoJm9yaWdpbl9nbHYtPmxpdmUtPmluZGlyZWN0X2dsdnMsICZnbHZsLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHJlbW92ZV9nbHZfZnJvbV9pbmRpcmVjdF9nbHZzKHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpvcmlnaW5fZ2x2LAorCQkJCSAgc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdsdikKK3sKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmdsdmwsICp0Z2x2bDsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdCA9IG9yaWdpbl9nbHYtPmlzX2hpc3RvcmljYWwgPyAmb3JpZ2luX2dsdi0+aGlzdG9yaWNhbC0+aW5kaXJlY3RfZ2x2cworCQkJCQkJCSA6ICZvcmlnaW5fZ2x2LT5saXZlLT5pbmRpcmVjdF9nbHZzOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZ2x2bCwgdGdsdmwsIGxpc3QpIHsKKwkJaWYgKGdsdmwtPmdsdiAhPSBnbHYpCisJCQljb250aW51ZTsKKworCQlkbV9saXN0X2RlbCgmZ2x2bC0+bGlzdCk7CisKKwkJaWYgKGdsdmwtPmdsdi0+aXNfaGlzdG9yaWNhbCkKKwkJCWdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+aW5kaXJlY3Rfb3JpZ2luID0gTlVMTDsKKwkJZWxzZQorCQkJZmlyc3Rfc2VnKGdsdmwtPmdsdi0+bGl2ZSktPmluZGlyZWN0X29yaWdpbiA9IE5VTEw7CisKKwkJcmV0dXJuIDE7CisJfQorCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBsb2dpY2FsIHZvbHVtZSAlcyBpcyBub3QgYSB1c2VyIG9mICVzLiIsCisJCSAgZ2x2LT5pc19oaXN0b3JpY2FsID8gImhpc3RvcmljYWwiIDogIkxpdmUiLAorCQkgIGdsdi0+aXNfaGlzdG9yaWNhbCA/IGdsdi0+aGlzdG9yaWNhbC0+bmFtZSA6IGdsdi0+bGl2ZS0+bmFtZSwKKwkJICBvcmlnaW5fZ2x2LT5pc19oaXN0b3JpY2FsID8gb3JpZ2luX2dsdi0+aGlzdG9yaWNhbC0+bmFtZSA6IG9yaWdpbl9nbHYtPmxpdmUtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmFsbG9jX2x2KHN0cnVjdCBkbV9wb29sICptZW0pCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWlmICghKGx2ID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKmx2KSkpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIGxvZ2ljYWwgdm9sdW1lIHN0cnVjdHVyZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2luaXQoJmx2LT5zbmFwc2hvdF9zZWdzKTsKKwlkbV9saXN0X2luaXQoJmx2LT5zZWdtZW50cyk7CisJZG1fbGlzdF9pbml0KCZsdi0+dGFncyk7CisJZG1fbGlzdF9pbml0KCZsdi0+c2Vnc191c2luZ190aGlzX2x2KTsKKwlkbV9saXN0X2luaXQoJmx2LT5pbmRpcmVjdF9nbHZzKTsKKwlkbV9saXN0X2luaXQoJmx2LT5yc2l0ZXMpOworCisJcmV0dXJuIGx2OworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IGVtcHR5IExWLgorICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NyZWF0ZV9lbXB0eShjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICB1bmlvbiBsdmlkICpsdmlkLAorCQkJCSAgICAgICB1aW50NjRfdCBzdGF0dXMsCisJCQkJICAgICAgIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaSA9IHZnLT5maWQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwljaGFyIGRuYW1lW05BTUVfTEVOXTsKKwlpbnQgaGlzdG9yaWNhbDsKKworCWlmICh2Z19tYXhfbHZfcmVhY2hlZCh2ZykpCisJCXN0YWNrOworCisJaWYgKHN0cnN0cihuYW1lLCAiJWQiKSAmJgorCSAgICAhKG5hbWUgPSBnZW5lcmF0ZV9sdl9uYW1lKHZnLCBuYW1lLCBkbmFtZSwgc2l6ZW9mKGRuYW1lKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIHVuaXF1ZSBuYW1lIGZvciB0aGUgbmV3ICIKKwkJCSAgImxvZ2ljYWwgdm9sdW1lIik7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAobHZfbmFtZV9pc191c2VkX2luX3ZnKHZnLCBuYW1lLCAmaGlzdG9yaWNhbCkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIExWICVzIGluIFZvbHVtZSBHcm91cCAlczogIgorCQkJICAibmFtZSBhbHJlYWR5IGluIHVzZSVzLiIsIG5hbWUsIHZnLT5uYW1lLAorCQkJICBoaXN0b3JpY2FsID8gIiBieSBoaXN0b3JpY2FsIExWIiA6ICIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbG9nX3ZlcmJvc2UoIkNyZWF0aW5nIGxvZ2ljYWwgdm9sdW1lICVzIiwgbmFtZSk7CisKKwlpZiAoIShsdiA9IGFsbG9jX2x2KHZnLT52Z21lbSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKGx2LT5uYW1lID0gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCBuYW1lKSkpCisJCWdvdG9fYmFkOworCisJbHYtPnN0YXR1cyA9IHN0YXR1czsKKwlsdi0+YWxsb2MgPSBhbGxvYzsKKwlsdi0+cmVhZF9haGVhZCA9IHZnLT5jbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZDsKKwlsdi0+bWFqb3IgPSAtMTsKKwlsdi0+bWlub3IgPSAtMTsKKwlsdi0+c2l6ZSA9IFVJTlQ2NF9DKDApOworCWx2LT5sZV9jb3VudCA9IDA7CisKKwlpZiAobHZpZCkKKwkJbHYtPmx2aWQgPSAqbHZpZDsKKworCWlmICghbGlua19sdl90b192Zyh2ZywgbHYpKQorCQlnb3RvX2JhZDsKKworCWlmICghbHZfc2V0X2NyZWF0aW9uKGx2LCBOVUxMLCAwKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoZmktPmZtdC0+b3BzLT5sdl9zZXR1cCAmJiAhZmktPmZtdC0+b3BzLT5sdl9zZXR1cChmaSwgbHYpKQorCQlnb3RvX2JhZDsKKworCWlmICh2Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX0NPTkZJR19QUk9GSUxFKQorCQlsdi0+cHJvZmlsZSA9IHZnLT5jbWQtPnByb2ZpbGVfcGFyYW1zLT5nbG9iYWxfbWV0YWRhdGFfcHJvZmlsZTsKKworCXJldHVybiBsdjsKK2JhZDoKKwlkbV9wb29sX2ZyZWUodmctPnZnbWVtLCBsdik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF9wdnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwdl9zZWdtZW50ICpwZWcsCisJCSAgICB1aW50MzJfdCBzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzZWdfcHZzICpzcHZzID0gKHN0cnVjdCBzZWdfcHZzICopIGRhdGE7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCS8qIERvbid0IGFkZCBhZ2FpbiBpZiBpdCdzIGFscmVhZHkgb24gbGlzdC4gKi8KKwlpZiAoZmluZF9wdl9pbl9wdl9saXN0KCZzcHZzLT5wdnMsIHBlZy0+cHYpKQorCQlyZXR1cm4gMTsKKworCWlmICghKHB2bCA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHNpemVvZigqcHZsKSkpKSB7CisJCWxvZ19lcnJvcigicHZfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdmwtPnB2ID0gcGVnLT5wdjsKKworCWRtX2xpc3RfYWRkKCZzcHZzLT5wdnMsICZwdmwtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBidWlsZF9wYXJhbGxlbF9hcmVhc19mcm9tX2x2CisgKiBAbHYKKyAqIEB1c2VfcHZtb3ZlX3BhcmVudF9sdgorICogQGNyZWF0ZV9zaW5nbGVfbGlzdAorICoKKyAqIEZvciBlYWNoIHNlZ21lbnQgaW4gYW4gTFYsIGNyZWF0ZSBhIGxpc3Qgb2YgUFZzIHVzZWQgYnkgdGhlIHNlZ21lbnQuCisgKiBUaHVzLCB0aGUgcmV0dXJuZWQgbGlzdCBpcyByZWFsbHkgYSBsaXN0IG9mIHNlZ21lbnRzIChzZWdfcHZzKQorICogY29udGFpbmluZyBhIGxpc3Qgb2YgUFZzIHRoYXQgYXJlIGluIHVzZSBieSB0aGF0IHNlZ21lbnQuCisgKgorICogdXNlX3B2bW92ZV9wYXJlbnRfbHY6ICBGb3IgcHZtb3ZlIHdlIHVzZSB0aGUgKnBhcmVudCogTFYgc28gd2UgY2FuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHBpY2sgdXAgc3RyaXBlcyAmIGV4aXN0aW5nIG1pcnJvcnMgZXRjLgorICogY3JlYXRlX3NpbmdsZV9saXN0ICA6ICBJbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbGlzdCBvZiBzZWdtZW50cyB0aGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY29udGFpbiBhIGxpc3Qgb2YgUFZzLCByZXR1cm4gYSBsaXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcganVzdCBvbmUgc2VnbWVudCAoaS5lLiBzZWdfcHZzKQorICogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIFBWcyB1c2VkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgTFYgYW5kIGFsbCBpdCdzIHNlZ21lbnRzLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqYnVpbGRfcGFyYWxsZWxfYXJlYXNfZnJvbV9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgIHVuc2lnbmVkIHVzZV9wdm1vdmVfcGFyZW50X2x2LAorCQkJCQkgICAgIHVuc2lnbmVkIGNyZWF0ZV9zaW5nbGVfbGlzdCkKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IGx2LT52Zy0+Y21kOworCXN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9hcmVhczsKKwlzdHJ1Y3Qgc2VnX3B2cyAqc3B2cyA9IE5VTEw7CisJdWludDMyX3QgY3VycmVudF9sZSA9IDA7CisJdWludDMyX3QgcmFpZF9tdWx0aXBsZTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCWlmICghKHBhcmFsbGVsX2FyZWFzID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpwYXJhbGxlbF9hcmVhcykpKSkgeworCQlsb2dfZXJyb3IoInBhcmFsbGVsX2FyZWFzIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdChwYXJhbGxlbF9hcmVhcyk7CisKKwlkbyB7CisJCWlmICghc3B2cyB8fCAhY3JlYXRlX3NpbmdsZV9saXN0KSB7CisJCQlpZiAoIShzcHZzID0gZG1fcG9vbF96YWxsb2MoY21kLT5tZW0sIHNpemVvZigqc3B2cykpKSkgeworCQkJCWxvZ19lcnJvcigiYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJZG1fbGlzdF9pbml0KCZzcHZzLT5wdnMpOworCQkJZG1fbGlzdF9hZGQocGFyYWxsZWxfYXJlYXMsICZzcHZzLT5saXN0KTsKKwkJfQorCQlzcHZzLT5sZSA9IGN1cnJlbnRfbGU7CisJCXNwdnMtPmxlbiA9IGx2LT5sZV9jb3VudCAtIGN1cnJlbnRfbGU7CisKKwkJaWYgKHVzZV9wdm1vdmVfcGFyZW50X2x2ICYmCisJCSAgICAhKHNlZyA9IGZpbmRfc2VnX2J5X2xlKGx2LCBjdXJyZW50X2xlKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgc2VnbWVudCBmb3IgJXMgZXh0ZW50ICUiIFBSSXUzMiwKKwkJCQkgIGx2LT5uYW1lLCBjdXJyZW50X2xlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRmluZCBuZXh0IHNlZ21lbnQgZW5kICovCisJCS8qIEZJWE1FIFVubmVjZXNzYXJ5IG5lc3RpbmchICovCisJCWlmICghX2Zvcl9lYWNoX3B2KGNtZCwgdXNlX3B2bW92ZV9wYXJlbnRfbHYgPyBzZWctPnB2bW92ZV9zb3VyY2Vfc2VnLT5sdiA6IGx2LAorCQkJCSAgdXNlX3B2bW92ZV9wYXJlbnRfbHYgPyBzZWctPnB2bW92ZV9zb3VyY2Vfc2VnLT5sZSA6IGN1cnJlbnRfbGUsCisJCQkJICB1c2VfcHZtb3ZlX3BhcmVudF9sdiA/IHNwdnMtPmxlbiAqIF9jYWxjX2FyZWFfbXVsdGlwbGUoc2VnLT5wdm1vdmVfc291cmNlX3NlZy0+c2VndHlwZSwgc2VnLT5wdm1vdmVfc291cmNlX3NlZy0+YXJlYV9jb3VudCwgMCkgOiBzcHZzLT5sZW4sCisJCQkJICB1c2VfcHZtb3ZlX3BhcmVudF9sdiA/IHNlZy0+cHZtb3ZlX3NvdXJjZV9zZWcgOiBOVUxMLAorCQkJCSAgJnNwdnMtPmxlbiwKKwkJCQkgIDAsIDAsIC0xLCAwLCBfYWRkX3B2cywgKHZvaWQgKikgc3B2cykpCisJCQlyZXR1cm5fTlVMTDsKKworCQljdXJyZW50X2xlID0gc3B2cy0+bGUgKyBzcHZzLT5sZW47CisJCXJhaWRfbXVsdGlwbGUgPSAoc2VnLT5zZWd0eXBlLT5wYXJpdHlfZGV2cykgPworCQkJc2VnLT5hcmVhX2NvdW50IC0gc2VnLT5zZWd0eXBlLT5wYXJpdHlfZGV2cyA6IDE7CisJfSB3aGlsZSAoKGN1cnJlbnRfbGUgKiByYWlkX211bHRpcGxlKSA8IGx2LT5sZV9jb3VudCk7CisKKwlpZiAoY3JlYXRlX3NpbmdsZV9saXN0KSB7CisJCXNwdnMtPmxlID0gMDsKKwkJc3B2cy0+bGVuID0gbHYtPmxlX2NvdW50OworCX0KKworCS8qCisJICogRklYTUU6ICBNZXJnZSBhZGphY2VudCBzZWdtZW50cyB3aXRoIGlkZW50aWNhbCBQViBsaXN0cworCSAqIChhdm9pZHMgbmVlZCBmb3IgY29udGlndW91cyBhbGxvY2F0aW9uIGF0dGVtcHRzIGJldHdlZW4KKwkgKiBzdWNjZXNzZnVsIGFsbG9jYXRpb25zKQorCSAqLworCisJcmV0dXJuIHBhcmFsbGVsX2FyZWFzOworfQorCit2b2lkIGx2X3NldF92aXNpYmxlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKGx2X2lzX3Zpc2libGUobHYpKQorCQlyZXR1cm47CisKKwlsdi0+c3RhdHVzIHw9IFZJU0lCTEVfTFY7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkxWICVzIGluIFZHICVzIGlzIG5vdyB2aXNpYmxlLiIsICBsdi0+bmFtZSwgbHYtPnZnLT5uYW1lKTsKK30KKwordm9pZCBsdl9zZXRfaGlkZGVuKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKCFsdl9pc192aXNpYmxlKGx2KSkKKwkJcmV0dXJuOworCisJbHYtPnN0YXR1cyAmPSB+VklTSUJMRV9MVjsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiTFYgJXMgaW4gVkcgJXMgaXMgbm93IGhpZGRlbi4iLCAgbHYtPm5hbWUsIGx2LT52Zy0+bmFtZSk7Cit9CisKK2ludCBsdl9yZW1vdmVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIGZvcmNlX3QgZm9yY2UsIGludCBzdXBwcmVzc19yZW1vdmVfbWVzc2FnZSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZvcm1hdDFfb3JpZ2luID0gTlVMTDsKKwlpbnQgZm9ybWF0MV9yZWxvYWRfcmVxdWlyZWQgPSAwOworCWludCB2aXNpYmxlLCBoaXN0b3JpY2FsOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiA9IE5VTEw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2NrX2x2ID0gbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKmNhY2hlX3NlZyA9IE5VTEw7CisJaW50IGFza19kaXNjYXJkOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IHNlZ19saXN0ICpzbDsKKwlpbnQgaXNfbGFzdF9wb29sID0gbHZfaXNfcG9vbChsdik7CisKKwl2ZyA9IGx2LT52ZzsKKworCWlmICghdmdfY2hlY2tfc3RhdHVzKHZnLCBMVk1fV1JJVEUpKQorCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19vcmlnaW4obHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcmVtb3ZlIGxvZ2ljYWwgdm9sdW1lICVzIHVuZGVyIHNuYXBzaG90LiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19leHRlcm5hbF9vcmlnaW4obHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcmVtb3ZlIGV4dGVybmFsIG9yaWdpbiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbWlycm9yX2ltYWdlKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlbW92ZSBsb2dpY2FsIHZvbHVtZSAlcyB1c2VkIGJ5IGEgbWlycm9yLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19taXJyb3JfbG9nKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlbW92ZSBsb2dpY2FsIHZvbHVtZSAlcyB1c2VkIGFzIG1pcnJvciBsb2cuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpIHx8IGx2X2lzX3JhaWRfaW1hZ2UobHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcmVtb3ZlIGxvZ2ljYWwgdm9sdW1lICVzIHVzZWQgYXMgUkFJRCBkZXZpY2UuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSB8fCBsdl9pc190aGluX3Bvb2xfbWV0YWRhdGEobHYpIHx8CisJICAgIGx2X2lzX2NhY2hlX3Bvb2xfZGF0YShsdikgfHwgbHZfaXNfY2FjaGVfcG9vbF9tZXRhZGF0YShsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCByZW1vdmUgbG9naWNhbCB2b2x1bWUgJXMgdXNlZCBieSBhIHBvb2wuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChsdl9pc190aGluX3ZvbHVtZShsdikpIHsKKwkJaWYgKCEocG9vbF9sdiA9IGZpcnN0X3NlZyhsdiktPnBvb2xfbHYpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlRoaW4gTFYgJXMgd2l0aG91dCBwb29sLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9ja19sdiA9IHBvb2xfbHY7CisJfQorCisJaWYgKGx2X2lzX2xvY2tlZChsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCByZW1vdmUgbG9ja2VkIGxvZ2ljYWwgdm9sdW1lICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbG9ja2RfbHYoY21kLCBsb2NrX2x2LCAiZXgiLCBMRExWX1BFUlNJU1RFTlQpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FIEVuc3VyZSBub3QgcmVmZXJyZWQgdG8gYnkgYW5vdGhlciBleGlzdGluZyBMVnMgKi8KKwlhc2tfZGlzY2FyZCA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGRldmljZXNfaXNzdWVfZGlzY2FyZHNfQ0ZHLCBOVUxMKTsKKworCWlmICghbHZfaXNfY2FjaGVfcG9vbChsdikgJiYgLyogY2FjaGUgcG9vbCBjYW5ub3QgYmUgYWN0aXZlICovCisJICAgIGx2X2lzX2FjdGl2ZShsdikpIHsKKwkJaWYgKCFsdl9jaGVja19ub3RfaW5fdXNlKGx2LCAxKSkKKwkJCXJldHVybl8wOworCisJCWlmICgoZm9yY2UgPT0gUFJPTVBUKSAmJgorCQkgICAgIWx2X2lzX3BlbmRpbmdfZGVsZXRlKGx2KSAmJgorCQkgICAgbHZfaXNfdmlzaWJsZShsdikgJiYKKwkJICAgIGx2X2lzX2FjdGl2ZShsdikpIHsKKwkJCWlmICh5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVtb3ZlJXMgYWN0aXZlICIKKwkJCQkJICAiJXNsb2dpY2FsIHZvbHVtZSAlcz8gW3kvbl06ICIsCisJCQkJCSAgYXNrX2Rpc2NhcmQgPyAiIGFuZCBESVNDQVJEIiA6ICIiLAorCQkJCQkgIHZnX2lzX2NsdXN0ZXJlZCh2ZykgPyAiY2x1c3RlcmVkICIgOiAiIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgbm90IHJlbW92ZWQuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJYXNrX2Rpc2NhcmQgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKCFsdl9pc19oaXN0b3JpY2FsKGx2KSAmJiAoZm9yY2UgPT0gUFJPTVBUKSAmJiBhc2tfZGlzY2FyZCAmJgorCSAgICB5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcmVtb3ZlIGFuZCBESVNDQVJEICIKKwkJCSAgImxvZ2ljYWwgdm9sdW1lICVzPyBbeS9uXTogIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKSA9PSAnbicpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBub3QgcmVtb3ZlZC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfY2FjaGUobHYpICYmICFsdl9pc19wZW5kaW5nX2RlbGV0ZShsdikpIHsKKwkJaWYgKCFsdl9yZW1vdmVfc2luZ2xlKGNtZCwgZmlyc3Rfc2VnKGx2KS0+cG9vbF9sdiwgZm9yY2UsCisJCQkJICAgICAgc3VwcHJlc3NfcmVtb3ZlX21lc3NhZ2UpKSB7CisJCQlpZiAoZm9yY2UgPCBET05UX1BST01QVF9PVkVSUklERSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVuY2FjaGUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIFByb2NlZWQgd2l0aCAtZmYgKi8KKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJZ25vcmluZyB1bmNhY2hlIGZhaWx1cmUgb2YgJXMuIiwKKwkJCQkJCWRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCX0KKwkJaXNfbGFzdF9wb29sID0gMTsKKwl9CisKKwkvKiBVc2VkIGNhY2hlIHBvb2wsIENPVyBvciBoaXN0b3JpY2FsIExWIGNhbm5vdCBiZSBhY3RpdmF0ZWQgKi8KKwlpZiAoKCFsdl9pc19jYWNoZV9wb29sKGx2KSB8fCBkbV9saXN0X2VtcHR5KCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSkgJiYKKwkgICAgIWx2X2lzX2NvdyhsdikgJiYgIWx2X2lzX2hpc3RvcmljYWwobHYpICYmCisJICAgICFkZWFjdGl2YXRlX2x2KGNtZCwgbHYpKSB7CisJCS8qIEZJWE1FIFJldmlldyBhbmQgZml4IHRoZSBzbmFwc2hvdCBlcnJvciBwYXRocyEgKi8KKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFyIHRoaW4gcG9vbCBzdGFja2VkIG1lc3NhZ2VzICovCisJaWYgKHBvb2xfbHYgJiYgIXBvb2xfaGFzX21lc3NhZ2UoZmlyc3Rfc2VnKHBvb2xfbHYpLCBsdiwgMCkgJiYKKwkgICAgIXVwZGF0ZV9wb29sX2x2KHBvb2xfbHYsIDEpKSB7CisJCWlmIChmb3JjZSA8IERPTlRfUFJPTVBUX09WRVJSSURFKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgcG9vbCAlcy4iLCBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiSWdub3JpbmcgdXBkYXRlIGZhaWx1cmUgb2YgcG9vbCAlcy4iLAorCQkJCQlkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXBvb2xfbHYgPSBOVUxMOyAvKiBEbyBub3QgcmV0cnkgKi8KKwl9CisKKwkvKiBXaGVuIHJlZmVyZW5jZWQgYnkgdGhlIExWIHdpdGggcGVuZGluZyBkZWxldGUgZmxhZywgcmVtb3ZlIHRoaXMgZGVsZXRlZCBMViBmaXJzdCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJCWlmIChsdl9pc19wZW5kaW5nX2RlbGV0ZShzbC0+c2VnLT5sdikgJiYgIWx2X3JlbW92ZShzbC0+c2VnLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiRXJyb3IgcmVsZWFzaW5nIGxvZ2ljYWwgdm9sdW1lICVzIHdpdGggcGVuZGluZyBkZWxldGUuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNsLT5zZWctPmx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKGx2X2lzX2NvdyhsdikpIHsKKwkJLyogT2xkIGZvcm1hdDEgY29kZSAqLworCQlpZiAoIShsdi0+dmctPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9NREFTKSkKKwkJCWZvcm1hdDFfb3JpZ2luID0gb3JpZ2luX2Zyb21fY293KGx2KTsKKworCQlsb2dfdmVyYm9zZSgiUmVtb3Zpbmcgc25hcHNob3Qgdm9sdW1lICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCS8qIHZnX3JlbW92ZV9zbmFwc2hvdCgpIHdpbGwgcHJlbG9hZCBvcmlnaW4vZm9ybWVyIHNuYXBzaG90cyAqLworCQlpZiAoIXZnX3JlbW92ZV9zbmFwc2hvdChsdikpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdikpIHsKKwkJCS8qIEZJWE1FIFJldmlldyBhbmQgZml4IHRoZSBzbmFwc2hvdCBlcnJvciBwYXRocyEgKi8KKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChsdl9pc19jYWNoZV9wb29sKGx2KSkgeworCQkvKiBDYWNoZSBwb29sIHJlbW92YWwgZHJvcHMgY2FjaGUgbGF5ZXIKKwkJICogSWYgdGhlIGNhY2hlIHBvb2wgaXMgbm90IGxpbmtlZCwgd2UgY2FuIHNpbXBseSByZW1vdmUgaXQuICovCisJCWlmICghZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpIHsKKwkJCWlmICghKGNhY2hlX3NlZyA9IGdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihsdikpKQorCQkJCXJldHVybl8wOworCQkJLyogVE9ETzogcG9sbGluZyAqLworCQkJaWYgKCFsdl9jYWNoZV9yZW1vdmUoY2FjaGVfc2VnLT5sdikpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwl2aXNpYmxlID0gbHZfaXNfdmlzaWJsZShsdik7CisJaGlzdG9yaWNhbCA9IGx2X2lzX2hpc3RvcmljYWwobHYpOworCisJbG9nX3ZlcmJvc2UoIlJlbGVhc2luZyAlc2xvZ2ljYWwgdm9sdW1lIFwiJXNcIiIsCisJCSAgICBoaXN0b3JpY2FsID8gImhpc3RvcmljYWwgIiA6ICIiLAorCQkgICAgaGlzdG9yaWNhbCA/IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+bmFtZSA6IGx2LT5uYW1lKTsKKwlpZiAoIWx2X3JlbW92ZShsdikpIHsKKwkJbG9nX2Vycm9yKCJFcnJvciByZWxlYXNpbmcgJXNsb2dpY2FsIHZvbHVtZSBcIiVzXCIiLAorCQkJICBoaXN0b3JpY2FsID8gImhpc3RvcmljYWwgIjogIiIsCisJCQkgIGhpc3RvcmljYWwgPyBsdi0+dGhpc19nbHYtPmhpc3RvcmljYWwtPm5hbWUgOiBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpc19sYXN0X3Bvb2wgJiYgdmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYpIHsKKwkJLyogV2hlbiByZW1vdmVkIGxhc3QgcG9vbCwgYWxzbyByZW1vdmUgdGhlIHNwYXJlICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQkJaWYgKGx2X2lzX3Bvb2xfbWV0YWRhdGEobHZsLT5sdikpIHsKKwkJCQlpc19sYXN0X3Bvb2wgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoaXNfbGFzdF9wb29sKSB7CisJCQkvKiBUaGlzIGlzIHB1cmVseSBpbnRlcm5hbCBMViB2b2x1bWUsIG5vIHF1ZXN0aW9uICovCisJCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCB2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdikpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZWFjdGl2YXRlIHNwYXJlIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUodmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghbHZfcmVtb3ZlKHZnLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2KSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0KKworCS8qCisJICogT2xkIGZvcm1hdDEgY29kZTogSWYgbm8gc25hcHNob3RzIGxlZnQgcmVsb2FkIHdpdGhvdXQgLXJlYWwuCisJICovCisJaWYgKGZvcm1hdDFfb3JpZ2luICYmICFsdl9pc19vcmlnaW4oZm9ybWF0MV9vcmlnaW4pKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBTdXBwb3J0IGZvciBzbmFwc2hvdHMgd2l0aCBvbGQgTFZNMS1zdHlsZSBtZXRhZGF0YSBpcyBkZXByZWNhdGVkLiIpOworCQlsb2dfd2FybigiV0FSTklORzogUGxlYXNlIHVzZSBsdmNvbnZlcnQgdG8gdXBkYXRlIHRvIGx2bTIgbWV0YWRhdGEgYXQgeW91ciBjb252ZW5pZW5jZS4iKTsKKwkJZm9ybWF0MV9yZWxvYWRfcmVxdWlyZWQgPSAxOworCX0KKworCS8qIHN0b3JlIGl0IG9uIGRpc2tzICovCisJaWYgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpCisJCXJldHVybl8wOworCisJLyogZm9ybWF0MSAqLworCWlmIChmb3JtYXQxX3JlbG9hZF9yZXF1aXJlZCkgeworCQlpZiAoIXN1c3BlbmRfbHYoY21kLCBmb3JtYXQxX29yaWdpbikpCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWZyZXNoICVzIHdpdGhvdXQgc25hcHNob3QuIiwgZm9ybWF0MV9vcmlnaW4tPm5hbWUpOworCisJCWlmICghcmVzdW1lX2x2KGNtZCwgZm9ybWF0MV9vcmlnaW4pKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXN1bWUgJXMuIiwgZm9ybWF0MV9vcmlnaW4tPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIHVubmVlZGVkIGJsb2NrcyBpbiB0aGluIHBvb2wgKi8KKwkvKiBUT0RPOiBkZWZlciB3aGVuIG11bHRpcGxlIExWcyByZWxhc2VkIGF0IG9uY2UgKi8KKwlpZiAocG9vbF9sdiAmJiAhdXBkYXRlX3Bvb2xfbHYocG9vbF9sdiwgMSkpIHsKKwkJaWYgKGZvcmNlIDwgRE9OVF9QUk9NUFRfT1ZFUlJJREUpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBwb29sICVzLiIsIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJZ25vcmluZyB1cGRhdGUgZmFpbHVyZSBvZiBwb29sICVzLiIsCisJCQkJCWRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwl9CisKKwliYWNrdXAodmcpOworCisJbG9ja2RfbHYoY21kLCBsb2NrX2x2LCAidW4iLCBMRExWX1BFUlNJU1RFTlQpOworCWxvY2tkX2ZyZWVfbHYoY21kLCB2ZywgbHYtPm5hbWUsICZsdi0+bHZpZC5pZFsxXSwgbHYtPmxvY2tfYXJncyk7CisKKwlpZiAoIXN1cHByZXNzX3JlbW92ZV9tZXNzYWdlICYmICh2aXNpYmxlIHx8IGhpc3RvcmljYWwpKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiJXNvZ2ljYWwgdm9sdW1lIFwiJXNcIiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCIsCisJCQkJCWhpc3RvcmljYWwgPyAiSGlzdG9yaWNhbCBsIiA6ICJMIiwKKwkJCQkJaGlzdG9yaWNhbCA/IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+bmFtZSA6IGx2LT5uYW1lKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdl9yZW1vdmVfc2Vnc191c2luZ190aGlzX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgY29uc3QgZm9yY2VfdCBmb3JjZSwgdW5zaWduZWQgbGV2ZWwsCisJCQkJCSBjb25zdCBjaGFyICpsdl90eXBlKQoreworCXN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwlpZiAoKGZvcmNlID09IFBST01QVCkgJiYKKwkgICAgeWVzX25vX3Byb21wdCgiUmVtb3ZpbmcgJXMgXCIlc1wiIHdpbGwgcmVtb3ZlICV1IGRlcGVuZGVudCB2b2x1bWUocykuICIKKwkJCSAgIlByb2NlZWQ/IFt5L25dOiAiLCBsdl90eXBlLCBsdi0+bmFtZSwKKwkJCSAgZG1fbGlzdF9zaXplKCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBub3QgcmVtb3ZlZC4iLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCS8qCisJICogTm90IHVzaW5nIF9zYWZlIGl0ZXJhdG9yIGhlcmUgLSBzaW5jZSB3ZSBtYXkgZGVsZXRlIHdob2xlIHN1YnRyZWUKKwkgKiAoc2ltaWxhciBhcyBwcm9jZXNzX2VhY2hfbHZfaW5fdmcoKSkKKwkgKiB0aGUgY29kZSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhpczoKKwkgKgorCSAqIHdoaWxlICghZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikpCisJICogCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJICogCQlicmVhazsKKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KQorCQlpZiAoIWx2X3JlbW92ZV93aXRoX2RlcGVuZGVuY2llcyhjbWQsIHNsLT5zZWctPmx2LAorCQkJCQkJIGZvcmNlLCBsZXZlbCArIDEpKQorCQkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKy8qCisgKiByZW1vdmUgTFZzIHdpdGggaXRzIGRlcGVuZGVuY2llcyAtIExWIGxlYWYgbm9kZXMgc2hvdWxkIGJlIHJlbW92ZWQgZmlyc3QKKyAqLworaW50IGx2X3JlbW92ZV93aXRoX2RlcGVuZGVuY2llcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQljb25zdCBmb3JjZV90IGZvcmNlLCB1bnNpZ25lZCBsZXZlbCkKK3sKKwlkbV9wZXJjZW50X3Qgc25hcF9wZXJjZW50OworCXN0cnVjdCBkbV9saXN0ICpzbmgsICpzbmh0OworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luOworCisJaWYgKGx2X2lzX2NvdyhsdikpIHsKKwkJLyoKKwkJICogQSBtZXJnaW5nIHNuYXBzaG90IGNhbm5vdCBiZSByZW1vdmVkIGRpcmVjdGx5IHVubGVzcworCQkgKiBpdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCBvciBmYWlsZWQgbWVyZ2UgcmVtb3ZhbCBpcyByZXF1ZXN0ZWQuCisJCSAqLworCQlpZiAobHZfaXNfbWVyZ2luZ19jb3cobHYpICYmICFsZXZlbCkgeworCQkJaWYgKGx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAwLCAmaW5mbywgMSwgMCkgJiYKKwkJCSAgICBpbmZvLmV4aXN0cyAmJiBpbmZvLmxpdmVfdGFibGUpIHsKKwkJCQlpZiAoIWx2X3NuYXBzaG90X3BlcmNlbnQobHYsICZzbmFwX3BlcmNlbnQpKSB7CisJCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIG9idGFpbiBtZXJnaW5nIHNuYXBzaG90IHByb2dyZXNzICIKKwkJCQkJCSAgInBlcmNlbnRhZ2UgZm9yIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAoKHNuYXBfcGVyY2VudCAhPSBETV9QRVJDRU5UX0lOVkFMSUQpICYmCisJCQkJICAgICAoc25hcF9wZXJjZW50ICE9IExWTV9QRVJDRU5UX01FUkdFX0ZBSUxFRCkpIHsKKwkJCQkJbG9nX2Vycm9yKCJDYW4ndCByZW1vdmUgbWVyZ2luZyBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9IGVsc2UgaWYgKChzbmFwX3BlcmNlbnQgPT0gTFZNX1BFUkNFTlRfTUVSR0VfRkFJTEVEKSAmJgorCQkJCQkgICAoZm9yY2UgPT0gUFJPTVBUKSAmJgorCQkJCQkgICB5ZXNfbm9fcHJvbXB0KCJSZW1vdmluZyBzbmFwc2hvdCAlcyB0aGF0IGZhaWxlZCB0byBtZXJnZSAiCisJCQkJCQkJICJtYXkgbGVhdmUgb3JpZ2luICVzIGluY29uc2lzdGVudC4gUHJvY2VlZD8gW3kvbl06ICIsCisJCQkJCQkJIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCQkJCQkgZGlzcGxheV9sdm5hbWUob3JpZ2luX2Zyb21fY293KGx2KSkpID09ICduJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vX3JlbW92ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbGV2ZWwgJiYgbHZfaXNfdmlydHVhbF9vcmlnaW4ob3JpZ2luID0gb3JpZ2luX2Zyb21fY293KGx2KSkpCisJCQkvKiBJZiB0aGlzIGlzIGEgc3BhcnNlIGRldmljZSwgcmVtb3ZlIGl0cyBvcmlnaW4gdG9vLiAqLworCQkJLyogU3RhY2tpbmcgaXMgbm90IHN1cHBvcnRlZCAqLworCQkJbHYgPSBvcmlnaW47CisJfQorCisJaWYgKGx2X2lzX29yaWdpbihsdikpIHsKKwkJLyogUmVtb3ZlIHNuYXBzaG90IExWcyBmaXJzdCAqLworCQlpZiAoKGZvcmNlID09IFBST01QVCkgJiYKKwkJICAgIC8qIEFjdGl2ZSBzbmFwc2hvdCBhbHJlYWR5IG5lZWRzIHRvIGNvbmZpcm0gZWFjaCBhY3RpdmUgTFYgKi8KKwkJICAgICFsdl9pc19hY3RpdmUobHYpICYmCisJCSAgICB5ZXNfbm9fcHJvbXB0KCJSZW1vdmluZyBvcmlnaW4gJXMgd2lsbCBhbHNvIHJlbW92ZSAldSAiCisJCQkJICAic25hcHNob3RzKHMpLiBQcm9jZWVkPyBbeS9uXTogIiwKKwkJCQkgIGx2LT5uYW1lLCBsdi0+b3JpZ2luX2NvdW50KSA9PSAnbicpCisJCQlnb3RvIG5vX3JlbW92ZTsKKworCQlkbV9saXN0X2l0ZXJhdGVfc2FmZShzbmgsIHNuaHQsICZsdi0+c25hcHNob3Rfc2VncykKKwkJCWlmICghbHZfcmVtb3ZlX3dpdGhfZGVwZW5kZW5jaWVzKGNtZCwgZG1fbGlzdF9zdHJ1Y3RfYmFzZShzbmgsIHN0cnVjdCBsdl9zZWdtZW50LAorCQkJCQkJCQkJCSAgb3JpZ2luX2xpc3QpLT5jb3csCisJCQkJCQkJIGZvcmNlLCBsZXZlbCArIDEpKQorCQkJCXJldHVybl8wOworCX0KKworCWlmIChsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbHYpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBmdWxseSBkZWFjdGl2YXRlIG1lcmdpbmcgb3JpZ2luICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFsdl9yZW1vdmVfd2l0aF9kZXBlbmRlbmNpZXMoY21kLCBmaW5kX3NuYXBzaG90KGx2KS0+bHYsCisJCQkJCQkgZm9yY2UsIGxldmVsICsgMSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBtZXJnaW5nIG9yaWdpbiAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFsZXZlbCAmJiBsdl9pc19tZXJnaW5nX3RoaW5fc25hcHNob3QobHYpKSB7CisJCS8qIE1lcmdlZCBzbmFwc2hvdCBMViBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGZvciB0aGUgdXNlciAqLworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZW1vdmUgJXMsIHZvbHVtZSBpcyBtZXJnZWQgdG8gJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShmaXJzdF9zZWcobHYpLT5tZXJnZV9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSAmJgorCSAgICAhX2x2X3JlbW92ZV9zZWdzX3VzaW5nX3RoaXNfbHYoY21kLCBsdiwgZm9yY2UsIGxldmVsLCAiZXh0ZXJuYWwgb3JpZ2luIikpCisJCXJldHVybl8wOworCisJaWYgKGx2X2lzX3VzZWRfdGhpbl9wb29sKGx2KSAmJgorCSAgICAhX2x2X3JlbW92ZV9zZWdzX3VzaW5nX3RoaXNfbHYoY21kLCBsdiwgZm9yY2UsIGxldmVsLCAicG9vbCIpKQorCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19wb29sX21ldGFkYXRhX3NwYXJlKGx2KSAmJgorCSAgICAoZm9yY2UgPT0gUFJPTVBUKSkgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmbHYtPnZnLT5sdnMpCisJCQlpZiAobHZfaXNfcG9vbF9tZXRhZGF0YShsdmwtPmx2KSkgeworCQkJCWlmICh5ZXNfbm9fcHJvbXB0KCJSZW1vdmFsIG9mIHBvb2wgbWV0YWRhdGEgc3BhcmUgbG9naWNhbCB2b2x1bWUgIgorCQkJCQkJICAiJXMgZGlzYWJsZXMgYXV0b21hdGljIHJlY292ZXJ5IGF0dGVtcHRzICIKKwkJCQkJCSAgImFmdGVyIGRhbWFnZSB0byBhIHRoaW4gb3IgY2FjaGUgcG9vbC4gIgorCQkJCQkJICAiUHJvY2VlZD8gW3kvbl06ICIsIGRpc3BsYXlfbHZuYW1lKGx2KSkgPT0gJ24nKQorCQkJCQlnb3RvIG5vX3JlbW92ZTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlyZXR1cm4gbHZfcmVtb3ZlX3NpbmdsZShjbWQsIGx2LCBmb3JjZSwgMCk7CisKK25vX3JlbW92ZToKKwlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIG5vdCByZW1vdmVkLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbHZfdXBkYXRlX2FuZF9yZWxvYWQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IG9yaWdpbl9vbmx5KQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gbHYtPnZnOworCWludCBkb19iYWNrdXAgPSAwLCByID0gMDsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvY2tfbHYgPSBsdl9sb2NrX2hvbGRlcihsdik7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJVcGRhdGluZyBsb2dpY2FsIHZvbHVtZSAlcyBvbiBkaXNrKHMpLiIsCisJCQkgZGlzcGxheV9sdm5hbWUobG9ja19sdikpOworCisJaWYgKCF2Z193cml0ZSh2ZykpCisJCXJldHVybl8wOworCisJaWYgKCEob3JpZ2luX29ubHkgPyBzdXNwZW5kX2x2X29yaWdpbih2Zy0+Y21kLCBsb2NrX2x2KSA6IHN1c3BlbmRfbHYodmctPmNtZCwgbG9ja19sdikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGxvY2sgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobG9ja19sdikpOworCQl2Z19yZXZlcnQodmcpOworCX0gZWxzZSBpZiAoIShyID0gdmdfY29tbWl0KHZnKSkpCisJCXN0YWNrOyAvKiAhdmdfY29tbWl0KCkgaGFzIGltcGxpY3QgdmdfcmV2ZXJ0KCkgKi8KKwllbHNlCisJCWRvX2JhY2t1cCA9IDE7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJVcGRhdGluZyBsb2dpY2FsIHZvbHVtZSAlcyBpbiBrZXJuZWwuIiwKKwkJCSBkaXNwbGF5X2x2bmFtZShsb2NrX2x2KSk7CisKKwlpZiAoIShvcmlnaW5fb25seSA/IHJlc3VtZV9sdl9vcmlnaW4odmctPmNtZCwgbG9ja19sdikgOiByZXN1bWVfbHYodmctPmNtZCwgbG9ja19sdikpKSB7CisJCWxvZ19lcnJvcigiUHJvYmxlbSByZWFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobG9ja19sdikpOworCQlyID0gMDsKKwl9CisKKwlpZiAoZG9fYmFja3VwKQorCQliYWNrdXAodmcpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBsdl91cGRhdGVfYW5kX3JlbG9hZChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworICAgICAgICByZXR1cm4gX2x2X3VwZGF0ZV9hbmRfcmVsb2FkKGx2LCAwKTsKK30KKworaW50IGx2X3VwZGF0ZV9hbmRfcmVsb2FkX29yaWdpbihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworICAgICAgICByZXR1cm4gX2x2X3VwZGF0ZV9hbmRfcmVsb2FkKGx2LCAxKTsKK30KKworLyoKKyAqIGluc2VydF9sYXllcl9mb3Jfc2VnbWVudHNfb25fcHYoKSBpbnNlcnRzIGEgbGF5ZXIgc2VnbWVudCBmb3IgYSBzZWdtZW50IGFyZWEuCisgKiBIb3dldmVyLCBsYXllciBtb2RpZmljYXRpb24gY291bGQgc3BsaXQgdGhlIHVuZGVybHlpbmcgbGF5ZXIgc2VnbWVudC4KKyAqIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSBwYXJlbnQgYXJlYSBhY2NvcmRpbmcgdG8ga2VlcCB0aGUgMToxIHJlbGF0aW9uc2hpcAorICogYmV0d2VlbiB0aGUgcGFyZW50IGFyZWEgYW5kIHRoZSB1bmRlcmx5aW5nIGxheWVyIHNlZ21lbnQuCisgKiBTaW5jZSB0aGUgbGF5ZXIgTFYgbWlnaHQgaGF2ZSBvdGhlciBsYXllcnMgYmVsb3csIGJ1aWxkX3BhcmFsbGVsX2FyZWFzKCkKKyAqIGlzIHVzZWQgdG8gZmluZCB0aGUgbG93ZXN0LWxldmVsIHNlZ21lbnQgYm91bmRhcmllcy4KKyAqLworc3RhdGljIGludCBfc3BsaXRfcGFyZW50X2FyZWEoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgcywKKwkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICpsYXllcl9zZWdfcHZzKQoreworCXVpbnQzMl90IHBhcmVudF9hcmVhX2xlbiwgcGFyZW50X2xlLCBsYXllcl9sZTsKKwl1aW50MzJfdCBhcmVhX211bHRpcGxlOworCXN0cnVjdCBzZWdfcHZzICpzcHZzOworCisJaWYgKHNlZ19pc19zdHJpcGVkKHNlZykpCisJCWFyZWFfbXVsdGlwbGUgPSBzZWctPmFyZWFfY291bnQ7CisJZWxzZQorCQlhcmVhX211bHRpcGxlID0gMTsKKworCXBhcmVudF9hcmVhX2xlbiA9IHNlZy0+YXJlYV9sZW47CisJcGFyZW50X2xlID0gc2VnLT5sZTsKKwlsYXllcl9sZSA9IHNlZ19sZShzZWcsIHMpOworCisJd2hpbGUgKHBhcmVudF9hcmVhX2xlbiA+IDApIHsKKwkJLyogRmluZCB0aGUgbGF5ZXIgc2VnbWVudCBwb2ludGVkIGF0ICovCisJCWlmICghKHNwdnMgPSBfZmluZF9zZWdfcHZzX2J5X2xlKGxheWVyX3NlZ19wdnMsIGxheWVyX2xlKSkpIHsKKwkJCWxvZ19lcnJvcigibGF5ZXIgc2VnbWVudCBmb3IgJXM6IiBGTVR1MzIgIiBub3QgZm91bmQuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpLCBwYXJlbnRfbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoc3B2cy0+bGUgIT0gbGF5ZXJfbGUpIHsKKwkJCWxvZ19lcnJvcigiSW5jb21wYXRpYmxlIGxheWVyIGJvdW5kYXJ5OiAiCisJCQkJICAiJXM6IiBGTVR1MzIgIlsiIEZNVHUzMiAiXSBvbiAlczoiIEZNVHUzMiAiLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSwgcGFyZW50X2xlLCBzLAorCQkJCSAgZGlzcGxheV9sdm5hbWUoc2VnX2x2KHNlZywgcykpLCBsYXllcl9sZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChzcHZzLT5sZW4gPCBwYXJlbnRfYXJlYV9sZW4pIHsKKwkJCXBhcmVudF9sZSArPSBzcHZzLT5sZW4gKiBhcmVhX211bHRpcGxlOworCQkJaWYgKCFsdl9zcGxpdF9zZWdtZW50KHNlZy0+bHYsIHBhcmVudF9sZSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlwYXJlbnRfYXJlYV9sZW4gLT0gc3B2cy0+bGVuOworCQlsYXllcl9sZSArPSBzcHZzLT5sZW47CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTcGxpdCB0aGUgcGFyZW50IExWIHNlZ21lbnRzIGlmIHRoZSBsYXllciBMViBiZWxvdyBpdCBpcyBzcGxpdHRlZC4KKyAqLworaW50IHNwbGl0X3BhcmVudF9zZWdtZW50c19mb3JfbGF5ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBhcmVudF9sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXVpbnQzMl90IHM7CisJc3RydWN0IGRtX2xpc3QgKnBhcmFsbGVsX2FyZWFzOworCisJaWYgKCEocGFyYWxsZWxfYXJlYXMgPSBidWlsZF9wYXJhbGxlbF9hcmVhc19mcm9tX2x2KGxheWVyX2x2LCAwLCAwKSkpCisJCXJldHVybl8wOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCBMVnMgZXhjZXB0IGl0c2VsZiAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZsYXllcl9sdi0+dmctPmx2cykgeworCQlwYXJlbnRfbHYgPSBsdmwtPmx2OworCQlpZiAocGFyZW50X2x2ID09IGxheWVyX2x2KQorCQkJY29udGludWU7CisKKwkJLyogRmluZCBhbGwgc2VnbWVudHMgdGhhdCBwb2ludCBhdCB0aGUgbGF5ZXIgTFYgKi8KKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJnBhcmVudF9sdi0+c2VnbWVudHMpIHsKKwkJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYgfHwKKwkJCQkgICAgc2VnX2x2KHNlZywgcykgIT0gbGF5ZXJfbHYpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKCFfc3BsaXRfcGFyZW50X2FyZWEoc2VnLCBzLCBwYXJhbGxlbF9hcmVhcykpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFJlbW92ZSBhIGxheWVyIGZyb20gdGhlIExWICovCitpbnQgcmVtb3ZlX2xheWVyc19mb3Jfc2VnbWVudHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxheWVyX2x2LAorCQkJICAgICAgIHVpbnQ2NF90IHN0YXR1c19tYXNrLCBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgKmxzZWc7CisJdWludDMyX3QgczsKKwlpbnQgbHZfY2hhbmdlZCA9IDA7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlJlbW92aW5nIGxheWVyICVzIGZvciBzZWdtZW50cyBvZiAlcyIsCisJCQkgbGF5ZXJfbHYtPm5hbWUsIGx2LT5uYW1lKTsKKworCS8qIEZpbmQgYWxsIHNlZ21lbnRzIHRoYXQgcG9pbnQgYXQgdGhlIHRlbXBvcmFyeSBtaXJyb3IgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9MViB8fAorCQkJICAgIHNlZ19sdihzZWcsIHMpICE9IGxheWVyX2x2KQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBGaW5kIHRoZSBsYXllciBzZWdtZW50IHBvaW50ZWQgYXQgKi8KKwkJCWlmICghKGxzZWcgPSBmaW5kX3NlZ19ieV9sZShsYXllcl9sdiwgc2VnX2xlKHNlZywgcykpKSkgeworCQkJCWxvZ19lcnJvcigiTGF5ZXIgc2VnbWVudCBmb3VuZDogJXM6JSIgUFJJdTMyLAorCQkJCQkgIGxheWVyX2x2LT5uYW1lLCBzZWdfbGUoc2VnLCBzKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIENoZWNrIHRoZSBzZWdtZW50IHBhcmFtcyBhcmUgY29tcGF0aWJsZSAqLworCQkJaWYgKCFzZWdfaXNfc3RyaXBlZChsc2VnKSB8fCBsc2VnLT5hcmVhX2NvdW50ICE9IDEpIHsKKwkJCQlsb2dfZXJyb3IoIkxheWVyIGlzIG5vdCBsaW5lYXI6ICVzOiUiIFBSSXUzMiwKKwkJCQkJICBsYXllcl9sdi0+bmFtZSwgbHNlZy0+bGUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKChsc2VnLT5zdGF0dXMgJiBzdGF0dXNfbWFzaykgIT0gc3RhdHVzX21hc2spIHsKKwkJCQlsb2dfZXJyb3IoIkxheWVyIHN0YXR1cyBkb2VzIG5vdCBtYXRjaDogIgorCQkJCQkgICIlczolIiBQUkl1MzIgIiBzdGF0dXM6IDB4JSIgUFJJeDY0ICIvMHglIiBQUkl4NjQsCisJCQkJCSAgbGF5ZXJfbHYtPm5hbWUsIGxzZWctPmxlLAorCQkJCQkgIGxzZWctPnN0YXR1cywgc3RhdHVzX21hc2spOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGxzZWctPmxlICE9IHNlZ19sZShzZWcsIHMpIHx8CisJCQkgICAgbHNlZy0+YXJlYV9sZW4gIT0gc2VnLT5hcmVhX2xlbikgeworCQkJCWxvZ19lcnJvcigiTGF5ZXIgYm91bmRhcnkgbWlzbWF0Y2g6ICIKKwkJCQkJICAiJXM6JSIgUFJJdTMyICItJSIgUFJJdTMyICIgb24gIgorCQkJCQkgICIlczolIiBQUkl1MzIgIiAvICIKKwkJCQkJICBGTVR1MzIgIi0iIEZNVHUzMiAiIC8gIiwKKwkJCQkJICBsdi0+bmFtZSwgc2VnLT5sZSwgc2VnLT5hcmVhX2xlbiwKKwkJCQkJICBsYXllcl9sdi0+bmFtZSwgc2VnX2xlKHNlZywgcyksCisJCQkJCSAgbHNlZy0+bGUsIGxzZWctPmFyZWFfbGVuKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKCFtb3ZlX2x2X3NlZ21lbnRfYXJlYShzZWcsIHMsIGxzZWcsIDApKQorCQkJCXJldHVybl8wOworCisJCQkvKiBSZXBsYWNlIG1pcnJvciB3aXRoIGVycm9yIHNlZ21lbnQgKi8KKwkJCWlmICghKGxzZWctPnNlZ3R5cGUgPQorCQkJICAgICAgZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfRVJST1IpKSkgeworCQkJCWxvZ19lcnJvcigiTWlzc2luZyBlcnJvciBzZWd0eXBlIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsc2VnLT5hcmVhX2NvdW50ID0gMDsKKworCQkJLyogRmlyc3QgdGltZSwgYWRkIExWIHRvIGxpc3Qgb2YgTFZzIGFmZmVjdGVkICovCisJCQlpZiAoIWx2X2NoYW5nZWQgJiYgbHZzX2NoYW5nZWQpIHsKKwkJCQlpZiAoIShsdmwgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKmx2bCkpKSkgeworCQkJCQlsb2dfZXJyb3IoImx2X2xpc3QgYWxsb2MgZmFpbGVkIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlsdmwtPmx2ID0gbHY7CisJCQkJZG1fbGlzdF9hZGQobHZzX2NoYW5nZWQsICZsdmwtPmxpc3QpOworCQkJCWx2X2NoYW5nZWQgPSAxOworCQkJfQorCQl9CisJfQorCWlmIChsdl9jaGFuZ2VkICYmICFsdl9tZXJnZV9zZWdtZW50cyhsdikpCisJCXN0YWNrOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFJlbW92ZSBhIGxheWVyICovCitpbnQgcmVtb3ZlX2xheWVyc19mb3Jfc2VnbWVudHNfYWxsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYsCisJCQkJICAgdWludDY0X3Qgc3RhdHVzX21hc2ssCisJCQkJICAgc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjE7CisKKwkvKiBMb29wIHRocm91Z2ggYWxsIExWcyBleGNlcHQgdGhlIHRlbXBvcmFyeSBtaXJyb3IgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmbGF5ZXJfbHYtPnZnLT5sdnMpIHsKKwkJbHYxID0gbHZsLT5sdjsKKwkJaWYgKGx2MSA9PSBsYXllcl9sdikKKwkJCWNvbnRpbnVlOworCisJCWlmICghcmVtb3ZlX2xheWVyc19mb3Jfc2VnbWVudHMoY21kLCBsdjEsIGxheWVyX2x2LAorCQkJCQkJc3RhdHVzX21hc2ssIGx2c19jaGFuZ2VkKSkKKwkJCXJldHVybl8wOworCX0KKworCWlmICghbHZfZW1wdHkobGF5ZXJfbHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgbW92ZV9sdl9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3RvLAorCQkgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfZnJvbSwKKwkJICAgICB1aW50NjRfdCBzZXRfc3RhdHVzLCB1aW50NjRfdCByZXNldF9zdGF0dXMpCit7CisJY29uc3QgdWludDY0X3QgTU9WRV9CSVRTID0gKFJBSUQgfCBNSVJST1IgfCBUSElOX1ZPTFVNRSk7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdl90by0+c2VnbWVudHMpCisJCWlmIChzZWctPm9yaWdpbikgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBtb3ZlIHNuYXBzaG90IHNlZ21lbnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJZG1fbGlzdF9pbml0KCZsdl90by0+c2VnbWVudHMpOworCWRtX2xpc3Rfc3BsaWNlKCZsdl90by0+c2VnbWVudHMsICZsdl9mcm9tLT5zZWdtZW50cyk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHZfdG8tPnNlZ21lbnRzKSB7CisJCXNlZy0+bHYgPSBsdl90bzsKKwkJc2VnLT5zdGF0dXMgJj0gfnJlc2V0X3N0YXR1czsKKwkJc2VnLT5zdGF0dXMgfD0gc2V0X3N0YXR1czsKKwl9CisKKwkvKgorCSAqIE1vdmUgTFYgc3RhdHVzIGJpdHMgZm9yIHNlbGVjdGVkIHR5cGVzIHdpdGggdGhlaXIgc2VnbWVudHMKKwkgKiBpLmUuIHdoZW4gaW5zZXJ0aW5nIGxheWVyIHRvIGNhY2hlIExWLCB3ZSBtb3ZlIHJhaWQgc2VnbWVudHMKKwkgKiB0byBhIG5ldyBwbGFjZSwgdGh1cyAncmFpZCcgTFYgcHJvcGVydHkgbm93IGJlbG9uZ3MgdG8gdGhpcyBMVi4KKwkgKgorCSAqIEJpdHMgc2hvdWxkIG1hdGNoIHRvIHRob3NlIHdoaWNoIGFwcGVhcnMgYWZ0ZXIgcmVhZCBmcm9tIGRpc2suCisJICovCisJbHZfdG8tPnN0YXR1cyB8PSBsdl9mcm9tLT5zdGF0dXMgJiBNT1ZFX0JJVFM7CisJbHZfZnJvbS0+c3RhdHVzICY9IH5NT1ZFX0JJVFM7CisKKwlsdl90by0+bGVfY291bnQgPSBsdl9mcm9tLT5sZV9jb3VudDsKKwlsdl90by0+c2l6ZSA9IGx2X2Zyb20tPnNpemU7CisKKwlsdl9mcm9tLT5sZV9jb3VudCA9IDA7CisJbHZfZnJvbS0+c2l6ZSA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogUmVtb3ZlIGEgbGF5ZXIgZnJvbSB0aGUgTFYgKi8KK2ludCByZW1vdmVfbGF5ZXJfZnJvbV9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX3N1ZmZpeGVzW11bOF0gPSB7ICJfdGRhdGEiLCAiX2NkYXRhIiwgIl9jb3JpZyIgfTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBhcmVudF9sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqcGFyZW50X3NlZzsKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCXN0cnVjdCBsdl9uYW1lcyBsdl9uYW1lczsKKwl1bnNpZ25lZCByOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiUmVtb3ZpbmcgbGF5ZXIgJXMgZm9yICVzIiwgbGF5ZXJfbHYtPm5hbWUsIGx2LT5uYW1lKTsKKworCWlmICghKHBhcmVudF9zZWcgPSBnZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYobGF5ZXJfbHYpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIGxheWVyICVzIGluICVzIiwKKwkJCSAgbGF5ZXJfbHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXBhcmVudF9sdiA9IHBhcmVudF9zZWctPmx2OworCWlmIChwYXJlbnRfbHYgIT0gbHYpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJXcm9uZyBsYXllciAlcyBpbiAlcyIsCisJCQkgIGxheWVyX2x2LT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQmVmb3JlIHJlbW92YWwsIHRoZSBsYXllciBzaG91bGQgYmUgY2xlYW5lZCB1cCwKKwkgKiBpLmUuIGFkZGl0aW9uYWwgc2VnbWVudHMgYW5kIGFyZWFzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlpZiAoZG1fbGlzdF9zaXplKCZwYXJlbnRfbHYtPnNlZ21lbnRzKSAhPSAxIHx8CisJICAgIHBhcmVudF9zZWctPmFyZWFfY291bnQgIT0gMSB8fAorCSAgICBzZWdfdHlwZShwYXJlbnRfc2VnLCAwKSAhPSBBUkVBX0xWIHx8CisJICAgIGxheWVyX2x2ICE9IHNlZ19sdihwYXJlbnRfc2VnLCAwKSB8fAorCSAgICBwYXJlbnRfbHYtPmxlX2NvdW50ICE9IGxheWVyX2x2LT5sZV9jb3VudCkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWx2X2VtcHR5KHBhcmVudF9sdikpCisJCXJldHVybl8wOworCisJaWYgKCFtb3ZlX2x2X3NlZ21lbnRzKHBhcmVudF9sdiwgbGF5ZXJfbHYsIDAsIDApKQorCQlyZXR1cm5fMDsKKworCS8qIFJlcGxhY2UgdGhlIGVtcHR5IGxheWVyIHdpdGggZXJyb3Igc2VnbWVudCAqLworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9FUlJPUikpKQorCQlyZXR1cm5fMDsKKwlpZiAoIWx2X2FkZF92aXJ0dWFsX3NlZ21lbnQobGF5ZXJfbHYsIDAsIHBhcmVudF9sdi0+bGVfY291bnQsIHNlZ3R5cGUpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogcmVjdXJlc2l2ZWx5IHJlbmFtZSBzdWIgTFZzCisJICogICBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgZm9yIHRoaW4gZGF0YSBsYXllcgorCSAqICAgRklYTUU6IHdpdGhvdXQgc3RyY21wIGl0IGJyZWFrcyBtaXJyb3JzLi4uLgorCSAqLworCWlmICghc3Ryc3RyKGxheWVyX2x2LT5uYW1lLCAiX21pbWFnZSIpKQorCQlmb3IgKHIgPSAwOyByIDwgRE1fQVJSQVlfU0laRShfc3VmZml4ZXMpOyArK3IpCisJCQlpZiAoc3Ryc3RyKGxheWVyX2x2LT5uYW1lLCBfc3VmZml4ZXNbcl0pID09IDApIHsKKwkJCQlsdl9uYW1lcy5vbGQgPSBsYXllcl9sdi0+bmFtZTsKKwkJCQlsdl9uYW1lcy5uZXcgPSBwYXJlbnRfbHYtPm5hbWU7CisJCQkJaWYgKCFmb3JfZWFjaF9zdWJfbHYocGFyZW50X2x2LCBfcmVuYW1lX2NiLCAodm9pZCAqKSAmbHZfbmFtZXMpKQorCQkJCQlyZXR1cm5fMDsKKwkJCQlicmVhazsKKwkJCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQ3JlYXRlIGFuZCBpbnNlcnQgYSBsaW5lYXIgTFYgImFib3ZlIiBsdl93aGVyZS4KKyAqIEFmdGVyIHRoZSBpbnNlcnRpb24sIGEgbmV3IExWIG5hbWVkIGx2X3doZXJlLT5uYW1lICsgc3VmZml4IGlzIGNyZWF0ZWQKKyAqIGFuZCBhbGwgc2VnbWVudHMgb2YgbHZfd2hlcmUgaXMgbW92ZWQgdG8gdGhlIG5ldyBMVi4KKyAqIGx2X3doZXJlIHdpbGwgaGF2ZSBhIHNpbmdsZSBzZWdtZW50IHdoaWNoIG1hcHMgbGluZWFybHkgdG8gdGhlIG5ldyBMVi4KKyAqLworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICppbnNlcnRfbGF5ZXJfZm9yX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3doZXJlLAorCQkJCQkgICB1aW50NjRfdCBzdGF0dXMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmxheWVyX3N1ZmZpeCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBfc3VmZml4ZXNbXVs4XSA9IHsgIl90ZGF0YSIsICJfY2RhdGEiLCAiX2NvcmlnIiB9OworCWludCByOworCWNoYXIgbmFtZVtOQU1FX0xFTl07CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxheWVyX2x2OworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IGx2X3NlZ21lbnQgKm1hcHNlZzsKKwlzdHJ1Y3QgbHZfbmFtZXMgbHZfbmFtZXM7CisJdW5zaWduZWQgZXhjbHVzaXZlID0gMCwgaTsKKworCS8qIGNyZWF0ZSBhbiBlbXB0eSBsYXllciBMViAqLworCWlmIChkbV9zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzIiwgbHZfd2hlcmUtPm5hbWUsIGxheWVyX3N1ZmZpeCkgPCAwKSB7CisJCWxvZ19lcnJvcigiTGF5ZXJlZCBuYW1lIGlzIHRvbyBsb25nLiBQbGVhc2UgdXNlIHNob3J0ZXIgTFYgbmFtZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobGF5ZXJfbHYgPSBsdl9jcmVhdGVfZW1wdHkobmFtZSwgTlVMTCwKKwkJCQkJIC8qIFByZXNlcnZlIHJlYWQtb25seSBmbGFnICovCisJCQkJCSBMVk1fUkVBRCB8IChsdl93aGVyZS0+c3RhdHVzICYgTFZNX1dSSVRFKSwKKwkJCQkJIEFMTE9DX0lOSEVSSVQsIGx2X3doZXJlLT52ZykpKSB7CisJCWxvZ19lcnJvcigiQ3JlYXRpb24gb2YgbGF5ZXIgTFYgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkobHZfd2hlcmUpKQorCQlleGNsdXNpdmUgPSAxOworCisJaWYgKGx2X2lzX2FjdGl2ZShsdl93aGVyZSkgJiYgc3Ryc3RyKG5hbWUsICJfbWltYWdldG1wIikpIHsKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiQ3JlYXRpbmcgdHJhbnNpZW50IExWICVzIGZvciBtaXJyb3IgY29udmVyc2lvbiBpbiBWRyAlcy4iLCBuYW1lLCBsdl93aGVyZS0+dmctPm5hbWUpOworCisJCXNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfRVJST1IpOworCisJCWlmICghbHZfYWRkX3ZpcnR1YWxfc2VnbWVudChsYXllcl9sdiwgMCwgbHZfd2hlcmUtPmxlX2NvdW50LCBzZWd0eXBlKSkgeworCQkJbG9nX2Vycm9yKCJDcmVhdGlvbiBvZiB0cmFuc2llbnQgTFYgJXMgZm9yIG1pcnJvciBjb252ZXJzaW9uIGluIFZHICVzIGZhaWxlZC4iLCBuYW1lLCBsdl93aGVyZS0+dmctPm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBUZW1wb3JhcnkgdGFncyBmb3IgYWN0aXZhdGlvbiBvZiB0aGUgdHJhbnNpZW50IExWICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2X3doZXJlLT50YWdzKQorCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sICZsYXllcl9sdi0+dGFncywgc2wtPnN0cikpIHsKKwkJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiAgVW5hYmxlIHRvIHRhZyIKKwkJCQkJICAiIHRyYW5zaWVudCBtaXJyb3IgbGF5ZXIuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJaWYgKCF2Z193cml0ZShsdl93aGVyZS0+dmcpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBpbnRlcm1lZGlhdGUgVkcgJXMgbWV0YWRhdGEgZm9yIG1pcnJvciBjb252ZXJzaW9uLiIsIGx2X3doZXJlLT52Zy0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICghdmdfY29tbWl0KGx2X3doZXJlLT52ZykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvbW1pdCBpbnRlcm1lZGlhdGUgVkcgJXMgbWV0YWRhdGEgZm9yIG1pcnJvciBjb252ZXJzaW9uLiIsIGx2X3doZXJlLT52Zy0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChleGNsdXNpdmUpCisJCQlyID0gYWN0aXZhdGVfbHZfZXhjbChjbWQsIGxheWVyX2x2KTsKKwkJZWxzZQorCQkJciA9IGFjdGl2YXRlX2x2KGNtZCwgbGF5ZXJfbHYpOworCisJCWlmICghcikgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVzdW1lIHRyYW5zaWVudCBMViIKKwkJCQkgICIgJXMgZm9yIG1pcnJvciBjb252ZXJzaW9uIGluIFZHICVzLiIsCisJCQkJICBuYW1lLCBsdl93aGVyZS0+dmctPm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBSZW1vdmUgdGhlIHRlbXBvcmFyeSB0YWdzICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2X3doZXJlLT50YWdzKQorCQkJc3RyX2xpc3RfZGVsKCZsYXllcl9sdi0+dGFncywgc2wtPnN0cik7CisJfQorCisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5zZXJ0aW5nIGxheWVyICVzIGZvciAlcyIsCisJCQkgbGF5ZXJfbHYtPm5hbWUsIGx2X3doZXJlLT5uYW1lKTsKKworCWlmICghbW92ZV9sdl9zZWdtZW50cyhsYXllcl9sdiwgbHZfd2hlcmUsIDAsIDApKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQlyZXR1cm5fTlVMTDsKKworCS8qIGFsbG9jYXRlIGEgbmV3IGxpbmVhciBzZWdtZW50ICovCisJaWYgKCEobWFwc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdl93aGVyZSwgMCwgbGF5ZXJfbHYtPmxlX2NvdW50LAorCQkJCQlzdGF0dXMsIDAsIE5VTEwsIDEsIGxheWVyX2x2LT5sZV9jb3VudCwKKwkJCQkJMCwgMCwgMCwgTlVMTCkpKQorCQlyZXR1cm5fTlVMTDsKKworCS8qIG1hcCB0aGUgbmV3IHNlZ21lbnQgdG8gdGhlIG9yaWdpbmFsIHVuZGVybHlpbmcgYXJlICovCisJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KG1hcHNlZywgMCwgbGF5ZXJfbHYsIDAsIDApKQorCQlyZXR1cm5fTlVMTDsKKworCS8qIGFkZCB0aGUgbmV3IHNlZ21lbnQgdG8gdGhlIGxheWVyIExWICovCisJZG1fbGlzdF9hZGQoJmx2X3doZXJlLT5zZWdtZW50cywgJm1hcHNlZy0+bGlzdCk7CisJbHZfd2hlcmUtPmxlX2NvdW50ID0gbGF5ZXJfbHYtPmxlX2NvdW50OworCWx2X3doZXJlLT5zaXplID0gKHVpbnQ2NF90KSBsdl93aGVyZS0+bGVfY291bnQgKiBsdl93aGVyZS0+dmctPmV4dGVudF9zaXplOworCisJLyoKKwkgKiByZWN1cmVzaXZlbHkgcmVuYW1lIHN1YiBMVnMKKwkgKiAgIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgdGhpbiBkYXRhIGxheWVyCisJICogICBGSVhNRTogd2l0aG91dCBzdHJjbXAgaXQgYnJlYWtzIG1pcnJvcnMuLi4uCisJICovCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX3N1ZmZpeGVzKTsgKytpKQorCQlpZiAoc3RyY21wKGxheWVyX3N1ZmZpeCwgX3N1ZmZpeGVzW2ldKSA9PSAwKSB7CisJCQlsdl9uYW1lcy5vbGQgPSBsdl93aGVyZS0+bmFtZTsKKwkJCWx2X25hbWVzLm5ldyA9IGxheWVyX2x2LT5uYW1lOworCQkJaWYgKCFmb3JfZWFjaF9zdWJfbHYobGF5ZXJfbHYsIF9yZW5hbWVfY2IsICh2b2lkICopICZsdl9uYW1lcykpCisJCQkJcmV0dXJuX05VTEw7CisJCQlicmVhazsKKwkJfQorCisJcmV0dXJuIGxheWVyX2x2OworfQorCisvKgorICogRXh0ZW5kIGFuZCBpbnNlcnQgYSBsaW5lYXIgbGF5ZXIgTFYgYmVuZWF0aCB0aGUgc291cmNlIHNlZ21lbnQgYXJlYS4KKyAqLworc3RhdGljIGludCBfZXh0ZW5kX2xheWVyX2x2X2Zvcl9zZWdtZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYsCisJCQkJCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHVpbnQzMl90IHMsCisJCQkJCXVpbnQ2NF90IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqbWFwc2VnOworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqc3JjX3B2ID0gc2VnX3B2KHNlZywgcyk7CisJdWludDMyX3Qgc3JjX3BlID0gc2VnX3BlKHNlZywgcyk7CisKKwlpZiAoc2VnX3R5cGUoc2VnLCBzKSAhPSBBUkVBX1BWICYmIHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9MVikKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobGF5ZXJfbHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FIEluY29tcGxldGUgbWVzc2FnZT8gTmVlZHMgbW9yZSBjb250ZXh0ICovCisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5zZXJ0aW5nICVzOiUiIFBSSXUzMiAiLSUiIFBSSXUzMiAiIG9mICVzLyVzIiwKKwkJCSBwdl9kZXZfbmFtZShzcmNfcHYpLAorCQkJIHNyY19wZSwgc3JjX3BlICsgc2VnLT5hcmVhX2xlbiAtIDEsCisJCQkgc2VnLT5sdi0+dmctPm5hbWUsIHNlZy0+bHYtPm5hbWUpOworCisJLyogYWxsb2NhdGUgYSBuZXcgc2VnbWVudCAqLworCWlmICghKG1hcHNlZyA9IGFsbG9jX2x2X3NlZ21lbnQoc2VndHlwZSwgbGF5ZXJfbHYsIGxheWVyX2x2LT5sZV9jb3VudCwKKwkJCQkJc2VnLT5hcmVhX2xlbiwgc3RhdHVzLCAwLAorCQkJCQlOVUxMLCAxLCBzZWctPmFyZWFfbGVuLCAwLCAwLCAwLCBzZWcpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBtYXAgdGhlIG5ldyBzZWdtZW50IHRvIHRoZSBvcmlnaW5hbCB1bmRlcmx5aW5nIGFyZSAqLworCWlmICghbW92ZV9sdl9zZWdtZW50X2FyZWEobWFwc2VnLCAwLCBzZWcsIHMpKQorCQlyZXR1cm5fMDsKKworCS8qIGFkZCB0aGUgbmV3IHNlZ21lbnQgdG8gdGhlIGxheWVyIExWICovCisJZG1fbGlzdF9hZGQoJmxheWVyX2x2LT5zZWdtZW50cywgJm1hcHNlZy0+bGlzdCk7CisJbGF5ZXJfbHYtPmxlX2NvdW50ICs9IHNlZy0+YXJlYV9sZW47CisJbGF5ZXJfbHYtPnNpemUgKz0gKHVpbnQ2NF90KSBzZWctPmFyZWFfbGVuICogbGF5ZXJfbHYtPnZnLT5leHRlbnRfc2l6ZTsKKworCS8qIG1hcCB0aGUgb3JpZ2luYWwgYXJlYSB0byB0aGUgbmV3IHNlZ21lbnQgKi8KKwlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYoc2VnLCBzLCBsYXllcl9sdiwgbWFwc2VnLT5sZSwgMCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBNYXRjaCB0aGUgc2VnbWVudCBhcmVhIHRvIFBFcyBpbiB0aGUgcHZsCisgKiAodGhlIHNlZ21lbnQgYXJlYSBib3VuZGFyeSBzaG91bGQgYmUgYWxpZ25lZCB0byBQRSByYW5nZXMgYnkKKyAqICBfYWRqdXN0X2xheWVyX3NlZ21lbnRzKCkgc28gdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIG92ZXJsYXAuKQorICovCitzdGF0aWMgaW50IF9tYXRjaF9zZWdfYXJlYV90b19wZV9yYW5nZShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBzLAorCQkJCSAgICAgICBzdHJ1Y3QgcHZfbGlzdCAqcHZsKQoreworCXN0cnVjdCBwZV9yYW5nZSAqcGVyOworCXVpbnQzMl90IHBlX3N0YXJ0LCBwZXJfZW5kOworCisJaWYgKCFwdmwpCisJCXJldHVybiAxOworCisJaWYgKHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9QViB8fCBzZWdfZGV2KHNlZywgcykgIT0gcHZsLT5wdi0+ZGV2KQorCQlyZXR1cm4gMDsKKworCXBlX3N0YXJ0ID0gc2VnX3BlKHNlZywgcyk7CisKKwkvKiBEbyB0aGVzZSBQRXMgbWF0Y2ggdG8gYW55IG9mIHRoZSBQRXMgaW4gcHZsPyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwZXIsIHB2bC0+cGVfcmFuZ2VzKSB7CisJCXBlcl9lbmQgPSBwZXItPnN0YXJ0ICsgcGVyLT5jb3VudCAtIDE7CisKKwkJaWYgKChwZV9zdGFydCA8IHBlci0+c3RhcnQpIHx8IChwZV9zdGFydCA+IHBlcl9lbmQpKQorCQkJY29udGludWU7CisKKwkJLyogRklYTUUgTWlzc2luZyBjb250ZXh0IGluIHRoaXMgbWVzc2FnZSAtIGFkZCBMVi9zZWcgZGV0YWlscyAqLworCQlsb2dfZGVidWdfYWxsb2MoIk1hdGNoZWQgUEUgcmFuZ2UgJXM6JSIgUFJJdTMyICItJSIgUFJJdTMyICIgYWdhaW5zdCAiCisJCQkJIiVzICUiIFBSSXUzMiAiIGxlbiAlIiBQUkl1MzIsIGRldl9uYW1lKHB2bC0+cHYtPmRldiksCisJCQkJcGVyLT5zdGFydCwgcGVyX2VuZCwgZGV2X25hbWUoc2VnX2RldihzZWcsIHMpKSwKKwkJCQlzZWdfcGUoc2VnLCBzKSwgc2VnLT5hcmVhX2xlbik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb3IgZWFjaCBzZWdtZW50IGluIGx2X3doZXJlIHRoYXQgdXNlcyBhIFBWIGluIHB2bCBkaXJlY3RseSwKKyAqIHNwbGl0IHRoZSBzZWdtZW50IGlmIGl0IHNwYW5zIG1vcmUgdGhhbiBvbmUgdW5kZXJseWluZyBQVi4KKyAqLworc3RhdGljIGludCBfYWxpZ25fc2VnbWVudF9ib3VuZGFyeV90b19wZV9yYW5nZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3doZXJlLAorCQkJCQkgICAgICAgc3RydWN0IHB2X2xpc3QgKnB2bCkKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBwZV9yYW5nZSAqcGVyOworCXVpbnQzMl90IHBlX3N0YXJ0LCBwZV9lbmQsIHBlcl9lbmQsIHN0cmlwZV9tdWx0aXBsaWVyLCBzOworCisJaWYgKCFwdmwpCisJCXJldHVybiAxOworCisJLyogU3BsaXQgTFYgc2VnbWVudHMgdG8gbWF0Y2ggUEUgcmFuZ2VzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2X3doZXJlLT5zZWdtZW50cykgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfUFYgfHwKKwkJCSAgICBzZWdfZGV2KHNlZywgcykgIT0gcHZsLT5wdi0+ZGV2KQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBEbyB0aGVzZSBQRXMgbWF0Y2ggd2l0aCB0aGUgY29uZGl0aW9uPyAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBlciwgcHZsLT5wZV9yYW5nZXMpIHsKKwkJCQlwZV9zdGFydCA9IHNlZ19wZShzZWcsIHMpOworCQkJCXBlX2VuZCA9IHBlX3N0YXJ0ICsgc2VnLT5hcmVhX2xlbiAtIDE7CisJCQkJcGVyX2VuZCA9IHBlci0+c3RhcnQgKyBwZXItPmNvdW50IC0gMTsKKworCQkJCS8qIE5vIG92ZXJsYXA/ICovCisJCQkJaWYgKChwZV9lbmQgPCBwZXItPnN0YXJ0KSB8fAorCQkJCSAgICAocGVfc3RhcnQgPiBwZXJfZW5kKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoc2VnX2lzX3N0cmlwZWQoc2VnKSkKKwkJCQkJc3RyaXBlX211bHRpcGxpZXIgPSBzZWctPmFyZWFfY291bnQ7CisJCQkJZWxzZQorCQkJCQlzdHJpcGVfbXVsdGlwbGllciA9IDE7CisKKwkJCQlpZiAoKHBlci0+c3RhcnQgIT0gcGVfc3RhcnQgJiYKKwkJCQkgICAgIHBlci0+c3RhcnQgPiBwZV9zdGFydCkgJiYKKwkJCQkgICAgIWx2X3NwbGl0X3NlZ21lbnQobHZfd2hlcmUsIHNlZy0+bGUgKworCQkJCQkJICAgICAgKHBlci0+c3RhcnQgLSBwZV9zdGFydCkgKgorCQkJCQkJICAgICAgc3RyaXBlX211bHRpcGxpZXIpKQorCQkJCQlyZXR1cm5fMDsKKworCQkJCWlmICgocGVyX2VuZCAhPSBwZV9lbmQgJiYKKwkJCQkgICAgIHBlcl9lbmQgPCBwZV9lbmQpICYmCisJCQkJICAgICFsdl9zcGxpdF9zZWdtZW50KGx2X3doZXJlLCBzZWctPmxlICsKKwkJCQkJCSAgICAgIChwZXJfZW5kIC0gcGVfc3RhcnQgKyAxKSAqCisJCQkJCQkgICAgICBzdHJpcGVfbXVsdGlwbGllcikpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTY2FuIGx2X3doZXJlIGZvciBzZWdtZW50cyBvbiBhIFBWIGluIHB2bCwgYW5kIGZvciBlYWNoIG9uZSBmb3VuZAorICogYXBwZW5kIGEgbGluZWFyIHNlZ21lbnQgdG8gbHZfbGF5ZXIgYW5kIGluc2VydCBpdCBiZXR3ZWVuIHRoZSB0d28uCisgKgorICogSWYgcHZsIGlzIGVtcHR5LCBhIGxheWVyIGlzIHBsYWNlZCB1bmRlciB0aGUgd2hvbGUgb2YgbHZfd2hlcmUuCisgKiBJZiB0aGUgbGF5ZXIgaXMgaW5zZXJ0ZWQsIGx2X3doZXJlIGlzIGFkZGVkIHRvIGx2c19jaGFuZ2VkLgorICovCitpbnQgaW5zZXJ0X2xheWVyX2Zvcl9zZWdtZW50c19vbl9wdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl93aGVyZSwKKwkJCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsYXllcl9sdiwKKwkJCQkgICAgdWludDY0X3Qgc3RhdHVzLAorCQkJCSAgICBzdHJ1Y3QgcHZfbGlzdCAqcHZsLAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCWludCBsdl91c2VkID0gMDsKKwl1aW50MzJfdCBzOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5zZXJ0aW5nIGxheWVyICVzIGZvciBzZWdtZW50cyBvZiAlcyBvbiAlcyIsCisJCQkgbGF5ZXJfbHYtPm5hbWUsIGx2X3doZXJlLT5uYW1lLAorCQkJIHB2bCA/IHB2X2Rldl9uYW1lKHB2bC0+cHYpIDogImFueSIpOworCisJaWYgKCFfYWxpZ25fc2VnbWVudF9ib3VuZGFyeV90b19wZV9yYW5nZShsdl93aGVyZSwgcHZsKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBXb3JrIHRocm91Z2ggYWxsIHNlZ21lbnRzIG9uIHRoZSBzdXBwbGllZCBQViAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdl93aGVyZS0+c2VnbWVudHMpIHsKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoIV9tYXRjaF9zZWdfYXJlYV90b19wZV9yYW5nZShzZWcsIHMsIHB2bCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIEZpcnN0IHRpbWUsIGFkZCBMViB0byBsaXN0IG9mIExWcyBhZmZlY3RlZCAqLworCQkJaWYgKCFsdl91c2VkICYmIGx2c19jaGFuZ2VkKSB7CisJCQkJaWYgKCEobHZsID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpsdmwpKSkpIHsKKwkJCQkJbG9nX2Vycm9yKCJsdl9saXN0IGFsbG9jIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJbHZsLT5sdiA9IGx2X3doZXJlOworCQkJCWRtX2xpc3RfYWRkKGx2c19jaGFuZ2VkLCAmbHZsLT5saXN0KTsKKwkJCQlsdl91c2VkID0gMTsKKwkJCX0KKworCQkJaWYgKCFfZXh0ZW5kX2xheWVyX2x2X2Zvcl9zZWdtZW50KGxheWVyX2x2LCBzZWcsIHMsCisJCQkJCQkJICBzdGF0dXMpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5zZXJ0IHNlZ21lbnQgaW4gbGF5ZXIgIgorCQkJCQkgICJMViAlcyB1bmRlciAlczolIiBQUkl1MzIgIi0lIiBQUkl1MzIsCisJCQkJCSAgbGF5ZXJfbHYtPm5hbWUsIGx2X3doZXJlLT5uYW1lLAorCQkJCQkgIHNlZy0+bGUsIHNlZy0+bGUgKyBzZWctPmxlbik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIExWIHdpdGggJ3ZhbHVlJy4KKyAqLworaW50IHdpcGVfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IHdpcGVfcGFyYW1zIHdwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCXVpbnQ2NF90IHplcm9fc2VjdG9yczsKKworCWlmICghd3AuZG9femVybyAmJiAhd3AuZG9fd2lwZV9zaWduYXR1cmVzKQorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCXJldHVybiAxOworCisJLyogV2FpdCB1bnRpbCBkZXZpY2VzIGFyZSBhdmFpbGFibGUgKi8KKwlpZiAoIXN5bmNfbG9jYWxfZGV2X25hbWVzKGx2LT52Zy0+Y21kKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzeW5jIGxvY2FsIGRldmljZXMgYmVmb3JlIHdpcGluZyBMViAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBcIiVzLyVzXCIgaXMgbm90IGFjdGl2ZSBsb2NhbGx5LiIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZJWE1FOgorCSAqIDxjbGF1c2VuPiBhbHNvLCBtb3JlIHRoYW4gNGsKKwkgKiA8Y2xhdXNlbj4gc2F5LCByZWlzZXJmcyBwdXRzIGl0J3Mgc3VwZXJibG9jayAzMmsgaW4sIElJUkMKKwkgKiA8ZWp0Xz4gaywgSSdsbCBkcm9wIGEgZml4bWUgdG8gdGhhdCBlZmZlY3QKKwkgKgkgICAoSSBrbm93IHRoZSBkZXZpY2UgaXMgYXQgbGVhc3QgNGssIGJ1dCBub3QgMzJrKQorCSAqLworCWlmIChkbV9zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzLyVzIiwgbHYtPnZnLT5jbWQtPmRldl9kaXIsCisJCQlsdi0+dmctPm5hbWUsIGx2LT5uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJOYW1lIHRvbyBsb25nIC0gZGV2aWNlIG5vdCBjbGVhcmVkICglcykiLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQobmFtZSwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiJXM6IG5vdCBmb3VuZDogZGV2aWNlIG5vdCBjbGVhcmVkIiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGV2X29wZW5fcXVpZXQoZGV2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAod3AuZG9fd2lwZV9zaWduYXR1cmVzKSB7CisJCWxvZ192ZXJib3NlKCJXaXBpbmcga25vd24gc2lnbmF0dXJlcyBvbiBsb2dpY2FsIHZvbHVtZSBcIiVzLyVzXCIiLAorCQkJICAgICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJaWYgKCF3aXBlX2tub3duX3NpZ25hdHVyZXMobHYtPnZnLT5jbWQsIGRldiwgbmFtZSwgMCwKKwkJCQkJICAgVFlQRV9ETV9TTkFQU0hPVF9DT1csCisJCQkJCSAgIHdwLnllcywgd3AuZm9yY2UsIE5VTEwpKQorCQkJc3RhY2s7CisJfQorCisJaWYgKHdwLmRvX3plcm8pIHsKKwkJemVyb19zZWN0b3JzID0gd3AuemVyb19zZWN0b3JzID8gOiBVSU5UNjRfQyg0MDk2KSA+PiBTRUNUT1JfU0hJRlQ7CisKKwkJaWYgKHplcm9fc2VjdG9ycyA+IGx2LT5zaXplKQorCQkJemVyb19zZWN0b3JzID0gbHYtPnNpemU7CisKKwkJbG9nX3ZlcmJvc2UoIkluaXRpYWxpemluZyAlcyBvZiBsb2dpY2FsIHZvbHVtZSBcIiVzLyVzXCIgd2l0aCB2YWx1ZSAlZC4iLAorCQkJICAgIGRpc3BsYXlfc2l6ZShsdi0+dmctPmNtZCwgemVyb19zZWN0b3JzKSwKKwkJCSAgICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLCB3cC56ZXJvX3ZhbHVlKTsKKworCQlpZiAoIWRldl9zZXQoZGV2LCBVSU5UNjRfQygwKSwgKHNpemVfdCkgemVyb19zZWN0b3JzIDw8IFNFQ1RPUl9TSElGVCwgd3AuemVyb192YWx1ZSkpCisJCQlzdGFjazsKKwl9CisKKwlkZXZfZmx1c2goZGV2KTsKKworCWlmICghZGV2X2Nsb3NlX2ltbWVkaWF0ZShkZXYpKQorCQlzdGFjazsKKworCWx2LT5zdGF0dXMgJj0gfkxWX05PU0NBTjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpfY3JlYXRlX3ZpcnR1YWxfb3JpZ2luKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJCSAgICAgY29uc3QgY2hhciAqbHZfbmFtZSwKKwkJCQkJCSAgICAgdWludDMyX3QgcGVybWlzc2lvbiwKKwkJCQkJCSAgICAgdWludDY0X3Qgdm9yaWdpbmV4dGVudHMpCit7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwljaGFyIHZvcmlnaW5fbmFtZVtOQU1FX0xFTl07CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfWkVSTykpKSB7CisJCWxvZ19lcnJvcigiWmVybyBzZWdtZW50IHR5cGUgZm9yIHZpcnR1YWwgb3JpZ2luIG5vdCBmb3VuZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYodm9yaWdpbl9uYW1lLCBzaXplb2Yodm9yaWdpbl9uYW1lKSwgIiVzX3ZvcmlnaW4iLCBsdl9uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJWaXJ0dWFsIG9yaWdpbiBuYW1lIGlzIHRvbyBsb25nLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShsdiA9IGx2X2NyZWF0ZV9lbXB0eSh2b3JpZ2luX25hbWUsIE5VTEwsIHBlcm1pc3Npb24sCisJCQkJICAgQUxMT0NfSU5IRVJJVCwgdmcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIWx2X2V4dGVuZChsdiwgc2VndHlwZSwgMSwgMCwgMSwgMCwgdm9yaWdpbmV4dGVudHMsCisJCSAgICAgICBOVUxMLCBBTExPQ19JTkhFUklULCAwKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gbHY7Cit9CisKKy8qCisgKiBBdXRvbWF0aWNhbGx5IHNldCBBQ1RJVkFUSU9OX1NLSVAgZmxhZyBmb3IgdGhlIExWIHN1cHBsaWVkIC0gdGhpcworICogaXMgZGVmYXVsdCBiZWhhdmlvdXIuIElmIG92ZXJyaWRlX2RlZmF1bHQgaXMgc2V0LCB0aGVuIG92ZXJyaWRlCisgKiB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYW5kIGFkZC9jbGVhciB0aGUgZmxhZyBiYXNlZCBvbiAnYWRkX3NraXAnIGFyZworICogc3VwcGxpZWQgaW5zdGVhZC4KKyAqLwordm9pZCBsdl9zZXRfYWN0aXZhdGlvbl9za2lwKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBvdmVycmlkZV9kZWZhdWx0LAorCQkJICAgIGludCBhZGRfc2tpcCkKK3sKKwlpbnQgc2tpcCA9IDA7CisKKwkvKiBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW91ciAqLworCWlmIChvdmVycmlkZV9kZWZhdWx0KQorCQlza2lwID0gYWRkX3NraXA7CisJLyogZGVmYXVsdCBiZWhhdmlvdXIgKi8KKwllbHNlIGlmIChsdi0+dmctPmNtZC0+YXV0b19zZXRfYWN0aXZhdGlvbl9za2lwKSB7CisJCSAvKiBza2lwIGFjdGl2YXRpb24gZm9yIHRoaW4gc25hcHNob3RzIGJ5IGRlZmF1bHQgKi8KKwkJaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSAmJiBmaXJzdF9zZWcobHYpLT5vcmlnaW4pCisJCQlza2lwID0gMTsKKwl9CisKKwlpZiAoc2tpcCkKKwkJbHYtPnN0YXR1cyB8PSBMVl9BQ1RJVkFUSU9OX1NLSVA7CisJZWxzZQorCQlsdi0+c3RhdHVzICY9IH5MVl9BQ1RJVkFUSU9OX1NLSVA7Cit9CisKKy8qCisgKiBHZXQgaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBMViBzaG91bGQgYmUgc2tpcHBlZCBkdXJpbmcgYWN0aXZhdGlvbgorICogYmFzZWQgb24gdGhlIEFDVElWQVRJT05fU0tJUCBmbGFnIChkZWFjdGl2YXRpb24gaXMgbmV2ZXIgc2tpcHBlZCEpLgorICogSWYgJ292ZXJyaWRlX2x2X3NraXBfZmxhZycgaXMgc2V0LCB0aGVuIG92ZXJyaWRlIGl0IGJhc2VkIG9uIHRoZSB2YWx1ZQorICogb2YgdGhlICdza2lwJyBhcmcgc3VwcGxpZWQgaW5zdGVhZC4KKyAqLworaW50IGx2X2FjdGl2YXRpb25fc2tpcChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBhY3RpdmF0aW9uX2NoYW5nZV90IGFjdGl2YXRlLAorCQkgICAgICAgaW50IG92ZXJyaWRlX2x2X3NraXBfZmxhZykKK3sKKwlpZiAoIShsdi0+c3RhdHVzICYgTFZfQUNUSVZBVElPTl9TS0lQKSB8fAorCSAgICAhaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGUpIHx8IC8qIERvIG5vdCBza2lwIGRlYWN0aXZhdGlvbiAqLworCSAgICBvdmVycmlkZV9sdl9za2lwX2ZsYWcpCisJCXJldHVybiAwOworCisJbG9nX3ZlcmJvc2UoIkFDVElWQVRJT05fU0tJUCBmbGFnIHNldCBmb3IgTFYgJXMvJXMsIHNraXBwaW5nIGFjdGl2YXRpb24uIiwKKwkJICAgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zaG91bGRfd2lwZV9sdihzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCwKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCB3YXJuKQoreworCS8qIFVuemVyb2FibGUgc2VnbWVudCAqLworCWlmIChmaXJzdF9zZWcobHYpLT5zZWd0eXBlLT5mbGFncyAmIFNFR19DQU5OT1RfQkVfWkVST0VEKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaW4gc25hcHNob3QgbmVlZCBub3QgdG8gYmUgemVyb2VkICovCisJLyogVGhpbiBwb29sIHdpdGggemVyb2luZyBkb2Vzbid0IG5lZWQgemVyb2luZyBvciB3aXBpbmcgKi8KKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpICYmCisJICAgIChmaXJzdF9zZWcobHYpLT5vcmlnaW4gfHwKKwkgICAgIGZpcnN0X3NlZyhmaXJzdF9zZWcobHYpLT5wb29sX2x2KS0+emVyb19uZXdfYmxvY2tzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDYW5ub3QgemVybyByZWFkLW9ubHkgdm9sdW1lICovCisJaWYgKChsdi0+c3RhdHVzICYgTFZNX1dSSVRFKSAmJgorCSAgICAobHAtPnplcm8gfHwgbHAtPndpcGVfc2lnbmF0dXJlcykpCisJCXJldHVybiAxOworCisJaWYgKHdhcm4gJiYgKCFscC0+emVybyB8fCAhKGx2LT5zdGF0dXMgJiBMVk1fV1JJVEUpKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IExvZ2ljYWwgdm9sdW1lICVzIG5vdCB6ZXJvZWQuIiwKKwkJCSBkaXNwbGF5X2x2bmFtZShsdikpOworCWlmICh3YXJuICYmICghbHAtPndpcGVfc2lnbmF0dXJlcyB8fCAhKGx2LT5zdGF0dXMgJiBMVk1fV1JJVEUpKSkKKwkJbG9nX3ZlcmJvc2UoIlNpZ25hdHVyZSB3aXBpbmcgb24gbG9naWNhbCB2b2x1bWUgJXMgbm90IHJlcXVlc3RlZC4iLAorCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgaWYgVkcgbWV0YWRhdGEgc3VwcG9ydHMgbmVlZGVkIGZlYXR1cmVzICovCitzdGF0aWMgaW50IF92Z19jaGVja19mZWF0dXJlcyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCXVpbnQzMl90IGZlYXR1cmVzID0gdmctPmZpZC0+Zm10LT5mZWF0dXJlczsKKworCWlmICh2Z19tYXhfbHZfcmVhY2hlZCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJNYXhpbXVtIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgKCV1KSByZWFjaGVkICIKKwkJCSAgImluIHZvbHVtZSBncm91cCAlcyIsIHZnLT5tYXhfbHYsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZmVhdHVyZXMgJiBGTVRfU0VHTUVOVFMpICYmCisJICAgIChzZWdfaXNfY2FjaGUobHApIHx8CisJICAgICBzZWdfaXNfY2FjaGVfcG9vbChscCkgfHwKKwkgICAgIHNlZ19pc19taXJyb3JlZChscCkgfHwKKwkgICAgIHNlZ19pc19yYWlkKGxwKSB8fAorCSAgICAgc2VnX2lzX3RoaW4obHApKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGRvZXMgbm90IHN1cHBvcnQgJXMgc2VnbWVudHMuIiwKKwkJCSAgbHAtPnNlZ3R5cGUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShmZWF0dXJlcyAmIEZNVF9UQUdTKSAmJiAhZG1fbGlzdF9lbXB0eSgmbHAtPnRhZ3MpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwICVzIGRvZXMgbm90IHN1cHBvcnQgdGFncy4iLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoZmVhdHVyZXMgJiBGTVRfUkVTVFJJQ1RFRF9SRUFEQUhFQUQpICYmCisJICAgIGxwLT5yZWFkX2FoZWFkICE9IERNX1JFQURfQUhFQURfQVVUTyAmJgorCSAgICBscC0+cmVhZF9haGVhZCAhPSBETV9SRUFEX0FIRUFEX05PTkUgJiYKKwkgICAgKGxwLT5yZWFkX2FoZWFkIDwgMiB8fCBscC0+cmVhZF9haGVhZCA+IDEyMCkpIHsKKwkJbG9nX2Vycm9yKCJNZXRhZGF0YSBvbmx5IHN1cHBvcnRzIHJlYWRhaGVhZCB2YWx1ZXMgYmV0d2VlbiAyIGFuZCAxMjAuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIE5lZWQgdG8gY2hlY2sgdGhlIHZnJ3MgZm9ybWF0IHRvIHZlcmlmeSB0aGlzIC0gdGhlIGNtZCBmb3JtYXQgaXNuJ3Qgc2V0dXAgcHJvcGVybHkgeWV0ICovCisJaWYgKCEoZmVhdHVyZXMgJiBGTVRfVU5MSU1JVEVEX1NUUklQRVNJWkUpICYmCisJICAgIChscC0+c3RyaXBlcyA+IDEpICYmIChscC0+c3RyaXBlX3NpemUgPiBTVFJJUEVfU0laRV9NQVgpKSB7CisJCWxvZ19lcnJvcigiU3RyaXBlIHNpemUgbWF5IG5vdCBleGNlZWQgJXMuIiwKKwkJCSAgZGlzcGxheV9zaXplKHZnLT5jbWQsICh1aW50NjRfdCkgU1RSSVBFX1NJWkVfTUFYKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBUaGluIG5vdGVzOgorICogSWYgbHAtPnRoaW4gT1IgbHAtPmFjdGl2YXRlIGlzIEFZKiwgYWN0aXZhdGUgdGhlIHBvb2wgaWYgbm90IGFscmVhZHkgYWN0aXZlLgorICogSWYgbHAtPnRoaW4sIGNyZWF0ZSB0aGluIExWIHdpdGhpbiB0aGUgcG9vbCAtIGFzIGEgc25hcHNob3QgaWYgbHAtPnNuYXBzaG90LgorICogICBJZiBscC0+YWN0aXZhdGUgaXMgQVkqLCBhY3RpdmF0ZSBpdC4KKyAqICAgSWYgbHAtPmFjdGl2YXRlIHdhcyBBTiogYW5kIHRoZSBwb29sIHdhcyBvcmlnaW5hbGx5IGluYWN0aXZlLCBkZWFjdGl2YXRlIGl0LgorICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpfbHZfY3JlYXRlX2FuX2x2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICAgICAgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHAsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuZXdfbHZfbmFtZSkKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IHZnLT5jbWQ7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50NjRfdCBzdGF0dXMgPSBscC0+cGVybWlzc2lvbiB8IFZJU0lCTEVfTFY7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqY3JlYXRlX3NlZ3R5cGUgPSBscC0+c2VndHlwZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCAqb3JpZ2luX2x2ID0gTlVMTDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqdG1wX2x2OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsICpwb29sX3NlZzsKKwlpbnQgdGhpbl9wb29sX3dhc19hY3RpdmUgPSAtMTsgLyogbm90IHNjYW5uZWQsIGluYWN0aXZlLCBhY3RpdmUgKi8KKwlpbnQgaGlzdG9yaWNhbDsKKworCWlmIChuZXdfbHZfbmFtZSAmJiBsdl9uYW1lX2lzX3VzZWRfaW5fdmcodmcsIG5ld19sdl9uYW1lLCAmaGlzdG9yaWNhbCkpIHsKKwkJbG9nX2Vycm9yKCIlc0xvZ2ljYWwgVm9sdW1lIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyBpbiAiCisJCQkgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgaGlzdG9yaWNhbCA/ICJoaXN0b3JpY2FsICIgOiAiIiwKKwkJCSAgbmV3X2x2X25hbWUsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFfdmdfY2hlY2tfZmVhdHVyZXModmcsIGxwKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkgeworCQlpZiAoc2VnX2lzX2NhY2hlKGxwKSB8fAorCQkgICAgc2VnX2lzX21pcnJvcihscCkgfHwKKwkJICAgIChzZWdfaXNfcmFpZChscCkgJiYgIXNlZ19pc19yYWlkMChscCkpIHx8CisJCSAgICBzZWdfaXNfdGhpbihscCkgfHwKKwkJICAgIGxwLT5zbmFwc2hvdCkgeworCQkJLyoKKwkJCSAqIEZJWE1FOiBGb3IgdGhpbiBwb29sIGFkZCBzb21lIGNvZGUgdG8gYWxsb3cgZGVsYXllZAorCQkJICogaW5pdGlhbGl6YXRpb24gb2YgZW1wdHkgdGhpbiBwb29sIHZvbHVtZS4KKwkJCSAqIGkuZS4gdXNpbmcgc29tZSBMViBmbGFnLCBmYWtlIG1lc3NhZ2UsLi4uCisJCQkgKiBhbmQgdGVzdGluZyBmb3IgbWV0YWRhdGEgcG9vbCBoZWFkZXIgc2lnbmF0dXJlPworCQkJICovCisJCQlsb2dfZXJyb3IoIkNhbid0IGNyZWF0ZSAlcyB3aXRob3V0IHVzaW5nICIKKwkJCQkgICJkZXZpY2UtbWFwcGVyIGtlcm5lbCBkcml2ZXIuIiwKKwkJCQkgIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIERvZXMgTFYgbmVlZCB0byBiZSB6ZXJvZWQ/ICovCisJCWlmIChscC0+emVybyAmJiAhc2VnX2lzX3RoaW4obHApKSB7CisJCQlsb2dfZXJyb3IoIkNhbid0IHdpcGUgc3RhcnQgb2YgbmV3IExWIHdpdGhvdXQgdXNpbmcgIgorCQkJCSAgImRldmljZS1tYXBwZXIga2VybmVsIGRyaXZlci4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKGxwLT5zdHJpcGVfc2l6ZSA+IHZnLT5leHRlbnRfc2l6ZSkgeworCQlpZiAoc2VnX2lzX3JhaWQobHApICYmICh2Zy0+ZXh0ZW50X3NpemUgPCBTVFJJUEVfU0laRV9NSU4pKSB7CisJCQkvKgorCQkJICogRklYTUU6IFJBSUQgd2lsbCBzaW1wbHkgZmFpbCB0byBsb2FkIHRoZSB0YWJsZSBpZgorCQkJICogICAgICAgIHRoaXMgaXMgdGhlIGNhc2UsIGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkKKwkJCSAqICAgICAgICBob25vciB0aGUgc3RyaXBlIG1pbmltdW0gZm9yIHJlZ3VsYXIgc3RyaXBlCisJCQkgKiAgICAgICAgdm9sdW1lcyBhcyB3ZWxsLiAgQXZvaWRpbmcgZG9pbmcgdGhhdCBub3cKKwkJCSAqICAgICAgICBvbmx5IHRvIG1pbmltaXplIHRoZSBjaGFuZ2UuCisJCQkgKi8KKwkJCWxvZ19lcnJvcigiVGhlIGV4dGVudCBzaXplIGluIHZvbHVtZSBncm91cCAlcyBpcyB0b28gIgorCQkJCSAgInNtYWxsIHRvIHN1cHBvcnQgc3RyaXBlZCBSQUlEIHZvbHVtZXMuIiwKKwkJCQkgIHZnLT5uYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlZHVjaW5nIHJlcXVlc3RlZCBzdHJpcGUgc2l6ZSAlcyB0byBtYXhpbXVtLCAiCisJCQkJCSJwaHlzaWNhbCBleHRlbnQgc2l6ZSAlcy4iLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIGxwLT5zdHJpcGVfc2l6ZSksCisJCQkJCWRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgdmctPmV4dGVudF9zaXplKSk7CisJCWxwLT5zdHJpcGVfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwl9CisKKwlscC0+ZXh0ZW50cyA9IF9yb3VuZF90b19zdHJpcGVfYm91bmRhcnkodmcsIGxwLT5leHRlbnRzLCBscC0+c3RyaXBlcywgMSk7CisKKwlpZiAoIWxwLT5leHRlbnRzICYmICFzZWdfaXNfdGhpbl92b2x1bWUobHApKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgbG9naWNhbCB2b2x1bWUgd2l0aCBubyBleHRlbnRzLiIpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlpZiAoKHNlZ19pc19wb29sKGxwKSB8fCBzZWdfaXNfY2FjaGUobHApKSAmJgorCSAgICAoKHVpbnQ2NF90KWxwLT5leHRlbnRzICogdmctPmV4dGVudF9zaXplIDwgbHAtPmNodW5rX3NpemUpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSAlcyBzbWFsbGVyIHRoYW4gMSBjaHVuay4iLAorCQkJICBscC0+c2VndHlwZS0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICgobHAtPmFsbG9jICE9IEFMTE9DX0FOWVdIRVJFKSAmJiAobHAtPnN0cmlwZXMgPiBkbV9saXN0X3NpemUobHAtPnB2aCkpKSB7CisJCWxvZ19lcnJvcigiTnVtYmVyIG9mIHN0cmlwZXMgKCV1KSBtdXN0IG5vdCBleGNlZWQgIgorCQkJICAibnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgKCVkKSIsIGxwLT5zdHJpcGVzLAorCQkJICBkbV9saXN0X3NpemUobHAtPnB2aCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2VnX2lzX3Bvb2wobHApKQorCQlzdGF0dXMgfD0gTFZNX1dSSVRFOyAvKiBQb29sIGlzIGFsd2F5cyB3cml0YWJsZSAqLworCWVsc2UgaWYgKHNlZ19pc19jYWNoZShscCkgfHwgc2VnX2lzX3RoaW5fdm9sdW1lKGxwKSkgeworCQkvKiBSZXNvbHZlIHBvb2wgdm9sdW1lICovCisJCWlmICghbHAtPnBvb2xfbmFtZSkgeworCQkJLyogU2hvdWxkIGJlIGFscmVhZHkgY2hlY2tlZCAqLworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW5ub3QgY3JlYXRlICVzIHZvbHVtZSB3aXRob3V0ICVzIHBvb2wuIiwKKwkJCQkgIGxwLT5zZWd0eXBlLT5uYW1lLCBscC0+c2VndHlwZS0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICghKHBvb2xfbHYgPSBmaW5kX2x2KHZnLCBscC0+cG9vbF9uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCB2b2x1bWUgJXMgaW4gVm9sdW1lIGdyb3VwICVzLiIsCisJCQkJICBscC0+cG9vbF9uYW1lLCB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChsdl9pc19sb2NrZWQocG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSBsb2NrZWQgcG9vbCB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKHNlZ19pc19jYWNoZShscCkpIHsKKwkJCS8qIHZhbGlkYXRlIG1ldGFkYXRhIHNpemUgKi8KKwkJCWlmICghdmFsaWRhdGVfbHZfY2FjaGVfY2h1bmtfc2l6ZShwb29sX2x2LCBscC0+Y2h1bmtfc2l6ZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWZpcnN0X3NlZyhwb29sX2x2KS0+Y2h1bmtfc2l6ZSA9IGxwLT5jaHVua19zaXplOworCQl9CisKKwkJLyogVmFsaWRhdGUgdm9sdW1lIHNpemUgdG8gdG8gYWxpbmcgb24gY2h1bmsgZm9yIHNtYWxsIGV4dGVudHMgKi8KKwkJLyogQ2FjaGUgY2h1bmsgc2l6ZSBpcyBhbHdheXMgc2V0ICovCisJCXNpemUgPSBmaXJzdF9zZWcocG9vbF9sdiktPmNodW5rX3NpemU7CisJCWlmIChzaXplID4gdmctPmV4dGVudF9zaXplKSB7CisJCQkvKiBBbGlnbiBleHRlbnRzIG9uIGNodW5rIGJvdW5kYXJ5IHNpemUgKi8KKwkJCXNpemUgPSAoKHVpbnQ2NF90KXZnLT5leHRlbnRfc2l6ZSAqIGxwLT5leHRlbnRzICsgc2l6ZSAtIDEpIC8KKwkJCQlzaXplICogc2l6ZSAvIHZnLT5leHRlbnRfc2l6ZTsKKwkJCWlmIChzaXplICE9IGxwLT5leHRlbnRzKSB7CisJCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJvdW5kaW5nIHNpemUgKCVkIGV4dGVudHMpIHVwIHRvIGNodW5rIGJvdW5kYXJ5ICIKKwkJCQkJCQkic2l6ZSAoJWQgZXh0ZW50cykuIiwgbHAtPmV4dGVudHMsIHNpemUpOworCQkJCWxwLT5leHRlbnRzID0gc2l6ZTsKKwkJCX0KKwkJfQorCisJCWlmIChzZWdfaXNfdGhpbl92b2x1bWUobHApKSB7CisJCQl0aGluX3Bvb2xfd2FzX2FjdGl2ZSA9IGx2X2lzX2FjdGl2ZShwb29sX2x2KTsKKwkJCWlmIChsdl9pc19uZXdfdGhpbl9wb29sKHBvb2xfbHYpKSB7CisJCQkJaWYgKCFjaGVja19uZXdfdGhpbl9wb29sKHBvb2xfbHYpKQorCQkJCQlyZXR1cm5fTlVMTDsKKwkJCQkvKiBOZXcgcG9vbCBpcyBub3cgaW5hY3RpdmUgKi8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGNtZCwgcG9vbF9sdikpIHsKKwkJCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGxvY2FsbHkgYWN0aXZhdGUgdGhpbiBwb29sICVzLiIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmICghcG9vbF9iZWxvd190aHJlc2hvbGQoZmlyc3Rfc2VnKHBvb2xfbHYpKSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbm5vdCBjcmVhdGUgbmV3IHRoaW4gdm9sdW1lLCBmcmVlIHNwYWNlIGluICIKKwkJCQkJCSAgInRoaW4gcG9vbCAlcyByZWFjaGVkIHRocmVzaG9sZC4iLAorCQkJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChzZWdfaXNfY2FjaGUobHApICYmCisJCSAgICAhd2lwZV9jYWNoZV9wb29sKHBvb2xfbHYpKQorCQkJcmV0dXJuX05VTEw7CisJfQorCisJLyogUmVzb2x2ZSBvcmlnaW4gdm9sdW1lICovCisJaWYgKGxwLT5vcmlnaW5fbmFtZSAmJgorCSAgICAhKG9yaWdpbl9sdiA9IGZpbmRfbHYodmcsIGxwLT5vcmlnaW5fbmFtZSkpKSB7CisJCWxvZ19lcnJvcigiT3JpZ2luIHZvbHVtZSAlcyBub3QgZm91bmQgaW4gVm9sdW1lIGdyb3VwICVzLiIsCisJCQkgIGxwLT5vcmlnaW5fbmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAob3JpZ2luX2x2ICYmIHNlZ19pc19jYWNoZV9wb29sKGxwKSkgeworCQkvKiBDb252ZXJ0aW5nIGV4aXRpbmcgb3JpZ2luIGFuZCBjcmVhdGluZyBjYWNoZSBwb29sICovCisJCWlmICghdmFsaWRhdGVfbHZfY2FjaGVfY3JlYXRlX29yaWdpbihvcmlnaW5fbHYpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJaWYgKG9yaWdpbl9sdi0+c2l6ZSA8IGxwLT5jaHVua19zaXplKSB7CisJCQlsb2dfZXJyb3IoIkNhY2hpbmcgb2Ygb3JpZ2luIGNhY2hlIHZvbHVtZSBzbWFsbGVyIHRoZW4gY2h1bmsgc2l6ZSBpcyB1bnN1cHBvcnRlZC4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogVmFsaWRhdGUgY2FjaGUgb3JpZ2luIGlzIGV4Y2x1c2l2ZWx5IGFjdGl2ZSAqLworCQlpZiAodmdfaXNfY2x1c3RlcmVkKG9yaWdpbl9sdi0+dmcpICYmCisJCSAgICBsb2NraW5nX2lzX2NsdXN0ZXJlZCgpICYmCisJCSAgICBsb2NraW5nX3N1cHBvcnRzX3JlbW90ZV9xdWVyaWVzKCkgJiYKKwkJICAgIGx2X2lzX2FjdGl2ZShvcmlnaW5fbHYpICYmCisJCSAgICAhbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZShvcmlnaW5fbHYpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBjYWNoZSBub3QgZXhjbHVzaXZlbHkgYWN0aXZlIG9yaWdpbiB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKG9yaWdpbl9sdikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKHNlZ19pc19jYWNoZShscCkpIHsKKwkJaWYgKCFwb29sX2x2KSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlBvb2wgTFYgZm9yIGNhY2hlIGlzIG1pc3NpbmcuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoIWx2X2lzX2NhY2hlX3Bvb2wocG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm90IGEgY2FjaGUgcG9vbC4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogQ3JlYXRlIGNhY2hlIG9yaWdpbiBmb3IgY2FjaGUgcG9vbCAqLworCQkvKiBGSVhNRSBFdmVudHVhbGx5IHN1cHBvcnQgcmFpZC9taXJyb3JzIHdpdGggLW0gKi8KKwkJaWYgKCEoY3JlYXRlX3NlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyh2Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSBpZiAoc2VnX2lzX21pcnJvcmVkKGxwKSB8fCAoc2VnX2lzX3JhaWQobHApICYmICFzZWdfaXNfYW55X3JhaWQwKGxwKSkpIHsKKwkJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKGxwLT5hY3RpdmF0ZSkgJiYgKGxwLT5hY3RpdmF0ZSAhPSBDSEFOR0VfQUVZKSAmJgorCQkgICAgdmdfaXNfY2x1c3RlcmVkKHZnKSAmJiBzZWdfaXNfbWlycm9yZWQobHApICYmICFzZWdfaXNfcmFpZChscCkgJiYKKwkJICAgICFjbHVzdGVyX21pcnJvcl9pc19hdmFpbGFibGUodmctPmNtZCkpIHsKKwkJCWxvZ19lcnJvcigiU2hhcmVkIGNsdXN0ZXIgbWlycm9ycyBhcmUgbm90IGF2YWlsYWJsZS4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogRklYTUUgVGhpcyB3aWxsIG5vdCBwYXNzIGNsdXN0ZXIgbG9jayEgKi8KKwkJaW5pdF9taXJyb3JfaW5fc3luYyhscC0+bm9zeW5jKTsKKworCQlpZiAobHAtPm5vc3luYykgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5ldyAlcyB3b24ndCBiZSBzeW5jaHJvbmlzZWQuICIKKwkJCQkgIkRvbid0IHJlYWQgd2hhdCB5b3UgZGlkbid0IHdyaXRlISIsCisJCQkJIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJCXN0YXR1cyB8PSBMVl9OT1RTWU5DRUQ7CisJCX0KKworCQlscC0+cmVnaW9uX3NpemUgPSBhZGp1c3RlZF9taXJyb3JfcmVnaW9uX3NpemUodmctPmV4dGVudF9zaXplLAorCQkJCQkJCSAgICAgIGxwLT5leHRlbnRzLAorCQkJCQkJCSAgICAgIGxwLT5yZWdpb25fc2l6ZSwgMCwKKwkJCQkJCQkgICAgICB2Z19pc19jbHVzdGVyZWQodmcpKTsKKwl9IGVsc2UgaWYgKHBvb2xfbHYgJiYgc2VnX2lzX3RoaW5fdm9sdW1lKGxwKSkgeworCQlpZiAoIWx2X2lzX3RoaW5fcG9vbChwb29sX2x2KSkgeworCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBpcyBub3QgYSB0aGluIHBvb2wuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKG9yaWdpbl9sdikgeworCQkJaWYgKGx2X2lzX2xvY2tlZChvcmlnaW5fbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJTbmFwc2hvdHMgb2YgbG9ja2VkIGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWxwLT52aXJ0dWFsX2V4dGVudHMgPSBvcmlnaW5fbHYtPmxlX2NvdW50OworCisJCQkvKgorCQkJICogQ2hlY2sgaWYgdXNpbmcgJ2V4dGVybmFsIG9yaWdpbicgb3IgdGhlICdub3JtYWwnIHNuYXBzaG90CisJCQkgKiB3aXRoaW4gdGhlIHNhbWUgdGhpbiBwb29sCisJCQkgKi8KKwkJCWlmIChmaXJzdF9zZWcob3JpZ2luX2x2KS0+cG9vbF9sdiAhPSBwb29sX2x2KSB7CisJCQkJaWYgKCFwb29sX3N1cHBvcnRzX2V4dGVybmFsX29yaWdpbihmaXJzdF9zZWcocG9vbF9sdiksIG9yaWdpbl9sdikpCisJCQkJCXJldHVybl9OVUxMOworCQkJCWlmIChvcmlnaW5fbHYtPnN0YXR1cyAmIExWTV9XUklURSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbm5vdCB1c2Ugd3JpdGFibGUgTFYgYXMgdGhlIGV4dGVybmFsIG9yaWdpbi4iKTsKKwkJCQkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FIGNvbnZlcnNpb24gZm9yIGluYWN0aXZlICovCisJCQkJfQorCQkJCWlmIChsdl9pc19hY3RpdmUob3JpZ2luX2x2KSAmJiAhbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKG9yaWdpbl9sdikpIHsKKwkJCQkJbG9nX2Vycm9yKCJDYW5ub3QgdXNlIGFjdGl2ZSBMViBmb3IgdGhlIGV4dGVybmFsIG9yaWdpbi4iKTsKKwkJCQkJcmV0dXJuIE5VTEw7IC8qIFdlIGNhbid0IGJlIHN1cmUgZGV2aWNlIGlzIHJlYWQtb25seSAqLworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobHAtPnNuYXBzaG90KSB7CisJCWlmICghbHAtPnZpcnR1YWxfZXh0ZW50cykgeworCQkJaWYgKCFvcmlnaW5fbHYpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgb3JpZ2luIHZvbHVtZSAnJXMnLiIsCisJCQkJCSAgbHAtPm9yaWdpbl9uYW1lKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWlmIChsdl9pc192aXJ0dWFsX29yaWdpbihvcmlnaW5fbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJDYW4ndCBzaGFyZSB2aXJ0dWFsIG9yaWdpbnMuICIKKwkJCQkJICAiVXNlIC0tdmlydHVhbHNpemUuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAobHZfaXNfY293KG9yaWdpbl9sdikpIHsKKwkJCQlsb2dfZXJyb3IoIlNuYXBzaG90cyBvZiBzbmFwc2hvdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAobHZfaXNfbG9ja2VkKG9yaWdpbl9sdikpIHsKKwkJCQlsb2dfZXJyb3IoIlNuYXBzaG90cyBvZiBsb2NrZWQgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWlmIChsdl9pc19tZXJnaW5nX29yaWdpbihvcmlnaW5fbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJTbmFwc2hvdHMgb2YgYW4gb3JpZ2luIHRoYXQgaGFzIGEgIgorCQkJCQkgICJtZXJnaW5nIHNuYXBzaG90IGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJaWYgKGx2X2lzX2NhY2hlX3R5cGUob3JpZ2luX2x2KSkgeworCQkJCWxvZ19lcnJvcigiU25hcHNob3RzIG9mIGNhY2hlIHR5cGUgdm9sdW1lICVzICIKKwkJCQkJICAiaXMgbm90IHN1cHBvcnRlZC4iLCBkaXNwbGF5X2x2bmFtZShvcmlnaW5fbHYpKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJaWYgKGx2X2lzX3RoaW5fdHlwZShvcmlnaW5fbHYpICYmICFsdl9pc190aGluX3ZvbHVtZShvcmlnaW5fbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJTbmFwc2hvdHMgb2YgdGhpbiBwb29sICVzZGV2aWNlcyAiCisJCQkJCSAgImFyZSBub3Qgc3VwcG9ydGVkLiIsCisJCQkJCSAgbHZfaXNfdGhpbl9wb29sX2RhdGEob3JpZ2luX2x2KSA/ICJkYXRhICIgOgorCQkJCQkgIGx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShvcmlnaW5fbHYpID8KKwkJCQkJICAibWV0YWRhdGEgIiA6ICIiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJaWYgKGx2X2lzX21pcnJvcl90eXBlKG9yaWdpbl9sdikpIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogU25hcHNob3RzIG9mIG1pcnJvcnMgY2FuIGRlYWRsb2NrIHVuZGVyIHJhcmUgZGV2aWNlIGZhaWx1cmVzLiIpOworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBDb25zaWRlciB1c2luZyB0aGUgcmFpZDEgbWlycm9yIHR5cGUgdG8gYXZvaWQgdGhpcy4iKTsKKwkJCQlsb2dfd2FybigiV0FSTklORzogU2VlIGdsb2JhbC9taXJyb3Jfc2VndHlwZV9kZWZhdWx0IGluIGx2bS5jb25mLiIpOworCQkJfQorCisJCQlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSAmJiBsdl9pc19hY3RpdmUob3JpZ2luX2x2KSAmJgorCQkJICAgICFsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkob3JpZ2luX2x2KSkgeworCQkJCWxvZ19lcnJvcigiJXMgbXVzdCBiZSBhY3RpdmUgZXhjbHVzaXZlbHkgdG8iCisJCQkJCSAgIiBjcmVhdGUgc25hcHNob3QiLCBvcmlnaW5fbHYtPm5hbWUpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKCFjb3dfaGFzX21pbl9jaHVua3ModmcsIGxwLT5leHRlbnRzLCBscC0+Y2h1bmtfc2l6ZSkpCisJCQlyZXR1cm5fTlVMTDsKKworCQkvKiBUaGUgc25hcHNob3Qgc2VnbWVudCBnZXRzIGNyZWF0ZWQgbGF0ZXIgKi8KKwkJaWYgKCEoY3JlYXRlX3NlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJLyogTXVzdCB6ZXJvIGNvdyAqLworCQlzdGF0dXMgfD0gTFZNX1dSSVRFOworCQlscC0+emVybyA9IDE7CisJCWxwLT53aXBlX3NpZ25hdHVyZXMgPSAwOworCX0KKworCWlmICghc2VndHlwZV9pc192aXJ0dWFsKGNyZWF0ZV9zZWd0eXBlKSAmJiAhbHAtPmFwcHJveF9hbGxvYyAmJgorCSAgICAodmctPmZyZWVfY291bnQgPCBscC0+ZXh0ZW50cykpIHsKKwkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgXCIlc1wiIGhhcyBpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSAiCisJCQkgICIoJXUgZXh0ZW50cyk6ICV1IHJlcXVpcmVkLiIsCisJCQkgIHZnLT5uYW1lLCB2Zy0+ZnJlZV9jb3VudCwgbHAtPmV4dGVudHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmIChwb29sX2x2ICYmIHNlZ3R5cGVfaXNfdGhpbl92b2x1bWUoY3JlYXRlX3NlZ3R5cGUpKSB7CisJCS8qIEVuc3VyZSBhbGwgc3RhY2tlZCBtZXNzYWdlcyBhcmUgc3VibWl0dGVkICovCisJCWlmICgocG9vbF9pc19hY3RpdmUocG9vbF9sdikgfHwgaXNfY2hhbmdlX2FjdGl2YXRpbmcobHAtPmFjdGl2YXRlKSkgJiYKKwkJICAgICF1cGRhdGVfcG9vbF9sdihwb29sX2x2LCAxKSkKKwkJCXJldHVybl9OVUxMOworCX0KKworCWlmICghKGx2ID0gbHZfY3JlYXRlX2VtcHR5KG5ld19sdl9uYW1lID8gOiAibHZvbCVkIiwgTlVMTCwKKwkJCQkgICBzdGF0dXMsIGxwLT5hbGxvYywgdmcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAobHAtPnJlYWRfYWhlYWQgIT0gbHYtPnJlYWRfYWhlYWQpIHsKKwkJbHYtPnJlYWRfYWhlYWQgPSBscC0+cmVhZF9haGVhZDsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJTZXR0aW5nIHJlYWQgYWhlYWQgc2VjdG9ycyAldS4iLCBsdi0+cmVhZF9haGVhZCk7CisJfQorCisJaWYgKCFzZWd0eXBlX2lzX3Bvb2woY3JlYXRlX3NlZ3R5cGUpICYmIGxwLT5taW5vciA+PSAwKSB7CisJCWx2LT5tYWpvciA9IGxwLT5tYWpvcjsKKwkJbHYtPm1pbm9yID0gbHAtPm1pbm9yOworCQlsdi0+c3RhdHVzIHw9IEZJWEVEX01JTk9SOworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlNldHRpbmcgZGV2aWNlIG51bWJlciB0byAoJWQsICVkKS4iLAorCQkJCSAgIGx2LT5tYWpvciwgbHYtPm1pbm9yKTsKKwl9CisKKwkvKgorCSAqIFRoZSBzcGVjaWZpYyBMViBtYXkgbm90IHVzZSBhIGxvY2suICBsb2NrZF9pbml0X2x2KCkgc2V0cworCSAqIGx2LT5sb2NrX2FyZ3MgdG8gTlVMTCBpZiB0aGlzIExWIGRvZXMgbm90IHVzZSBpdHMgb3duIGxvY2suCisJICovCisKKwlpZiAoIWxvY2tkX2luaXRfbHYodmctPmNtZCwgdmcsIGx2LCBscCkpCisJCXJldHVybl9OVUxMOworCisJZG1fbGlzdF9zcGxpY2UoJmx2LT50YWdzLCAmbHAtPnRhZ3MpOworCisJaWYgKCFsdl9leHRlbmQobHYsIGNyZWF0ZV9zZWd0eXBlLAorCQkgICAgICAgbHAtPnN0cmlwZXMsIGxwLT5zdHJpcGVfc2l6ZSwKKwkJICAgICAgIGxwLT5taXJyb3JzLAorCQkgICAgICAgc2VndHlwZV9pc19wb29sKGNyZWF0ZV9zZWd0eXBlKSA/IGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMgOiBscC0+cmVnaW9uX3NpemUsCisJCSAgICAgICBzZWd0eXBlX2lzX3RoaW5fdm9sdW1lKGNyZWF0ZV9zZWd0eXBlKSA/IGxwLT52aXJ0dWFsX2V4dGVudHMgOiBscC0+ZXh0ZW50cywKKwkJICAgICAgIGxwLT5wdmgsIGxwLT5hbGxvYywgbHAtPmFwcHJveF9hbGxvYykpCisJCXJldHVybl9OVUxMOworCisJLyogVW5sb2NrIG1lbW9yeSBpZiBwb3NzaWJsZSAqLworCW1lbWxvY2tfdW5sb2NrKHZnLT5jbWQpOworCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2wobHYpKSB7CisJCWlmICghY2FjaGVfc2V0X3BhcmFtcyhmaXJzdF9zZWcobHYpLAorCQkJCSAgICAgIGxwLT5jYWNoZV9tb2RlLAorCQkJCSAgICAgIGxwLT5wb2xpY3lfbmFtZSwKKwkJCQkgICAgICBscC0+cG9saWN5X3NldHRpbmdzLAorCQkJCSAgICAgIGxwLT5jaHVua19zaXplKSkgeworCQkJc3RhY2s7CisJCQlnb3RvIHJldmVydF9uZXdfbHY7CisJCX0KKwl9IGVsc2UgaWYgKGx2X2lzX3JhaWQobHYpICYmICFzZWdfaXNfYW55X3JhaWQwKGZpcnN0X3NlZyhsdikpKSB7CisJCWZpcnN0X3NlZyhsdiktPm1pbl9yZWNvdmVyeV9yYXRlID0gbHAtPm1pbl9yZWNvdmVyeV9yYXRlOworCQlmaXJzdF9zZWcobHYpLT5tYXhfcmVjb3ZlcnlfcmF0ZSA9IGxwLT5tYXhfcmVjb3ZlcnlfcmF0ZTsKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJZmlyc3Rfc2VnKGx2KS0+Y2h1bmtfc2l6ZSA9IGxwLT5jaHVua19zaXplOworCQlmaXJzdF9zZWcobHYpLT56ZXJvX25ld19ibG9ja3MgPSBscC0+emVybyA/IDEgOiAwOworCQlmaXJzdF9zZWcobHYpLT5kaXNjYXJkcyA9IGxwLT5kaXNjYXJkczsKKwkJaWYgKCFyZWNhbGN1bGF0ZV9wb29sX2NodW5rX3NpemVfd2l0aF9kZXZfaGludHMobHYsIGxwLT5wYXNzZWRfYXJncywKKwkJCQkJCQkJbHAtPnRoaW5fY2h1bmtfc2l6ZV9jYWxjX3BvbGljeSkpIHsKKwkJCXN0YWNrOworCQkJZ290byByZXZlcnRfbmV3X2x2OworCQl9CisJCWlmIChscC0+ZXJyb3Jfd2hlbl9mdWxsKQorCQkJbHYtPnN0YXR1cyB8PSBMVl9FUlJPUl9XSEVOX0ZVTEw7CisJfSBlbHNlIGlmIChwb29sX2x2ICYmIGx2X2lzX3ZpcnR1YWwobHYpKSB7IC8qIGdvaW5nIHRvIGJlIGEgdGhpbiB2b2x1bWUgKi8KKwkJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwkJcG9vbF9zZWcgPSBmaXJzdF9zZWcocG9vbF9sdik7CisJCWlmICghKHNlZy0+ZGV2aWNlX2lkID0gZ2V0X2ZyZWVfcG9vbF9kZXZpY2VfaWQocG9vbF9zZWcpKSkKKwkJCXJldHVybl9OVUxMOworCQlzZWctPnRyYW5zYWN0aW9uX2lkID0gcG9vbF9zZWctPnRyYW5zYWN0aW9uX2lkOworCQlpZiAob3JpZ2luX2x2ICYmIGx2X2lzX3RoaW5fdm9sdW1lKG9yaWdpbl9sdikgJiYKKwkJICAgIChmaXJzdF9zZWcob3JpZ2luX2x2KS0+cG9vbF9sdiA9PSBwb29sX2x2KSkgeworCQkJLyogRm9yIHRoaW4gc25hcHNob3QgcG9vbCBtdXN0IG1hdGNoICovCisJCQlpZiAoIWF0dGFjaF9wb29sX2x2KHNlZywgcG9vbF9sdiwgb3JpZ2luX2x2LCBOVUxMLCBOVUxMKSkKKwkJCQlyZXR1cm5fTlVMTDsKKwkJCS8qIFVzZSB0aGUgc2FtZSBleHRlcm5hbCBvcmlnaW4gKi8KKwkJCWlmICghYXR0YWNoX3RoaW5fZXh0ZXJuYWxfb3JpZ2luKHNlZywgZmlyc3Rfc2VnKG9yaWdpbl9sdiktPmV4dGVybmFsX2x2KSkKKwkJCQlyZXR1cm5fTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmICghYXR0YWNoX3Bvb2xfbHYoc2VnLCBwb29sX2x2LCBOVUxMLCBOVUxMLCBOVUxMKSkKKwkJCQlyZXR1cm5fTlVMTDsKKwkJCS8qIElmIHRoZXJlIGlzIGFuIGV4dGVybmFsIG9yaWdpbi4uLiAqLworCQkJaWYgKCFhdHRhY2hfdGhpbl9leHRlcm5hbF9vcmlnaW4oc2VnLCBvcmlnaW5fbHYpKQorCQkJCXJldHVybl9OVUxMOworCQl9CisKKwkJaWYgKCFhdHRhY2hfcG9vbF9tZXNzYWdlKHBvb2xfc2VnLCBETV9USElOX01FU1NBR0VfQ1JFQVRFX1RISU4sIGx2LCAwLCAwKSkKKwkJCXJldHVybl9OVUxMOworCX0KKworCWlmICghcG9vbF9jaGVja19vdmVycHJvdmlzaW9uaW5nKGx2KSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBGSVhNRSBMb2cgYWxsb2NhdGlvbiBhbmQgYXR0YWNobWVudCBzaG91bGQgaGF2ZSBoYXBwZW5lZCBpbnNpZGUgbHZfZXh0ZW5kLiAqLworCWlmIChscC0+bG9nX2NvdW50ICYmCisJICAgICFzZWdfaXNfcmFpZChmaXJzdF9zZWcobHYpKSAmJiBzZWdfaXNfbWlycm9yZWQoZmlyc3Rfc2VnKGx2KSkpIHsKKwkJaWYgKCFhZGRfbWlycm9yX2xvZyhjbWQsIGx2LCBscC0+bG9nX2NvdW50LAorCQkJCSAgICBmaXJzdF9zZWcobHYpLT5yZWdpb25fc2l6ZSwKKwkJCQkgICAgbHAtPnB2aCwgbHAtPmFsbG9jKSkgeworCQkJc3RhY2s7CisJCQlnb3RvIHJldmVydF9uZXdfbHY7CisJCX0KKwl9CisKKwlsdl9zZXRfYWN0aXZhdGlvbl9za2lwKGx2LCBscC0+YWN0aXZhdGlvbl9za2lwICYgQUNUSVZBVElPTl9TS0lQX1NFVCwKKwkJCSAgICAgICBscC0+YWN0aXZhdGlvbl9za2lwICYgQUNUSVZBVElPTl9TS0lQX1NFVF9FTkFCTEVEKTsKKwkvKgorCSAqIENoZWNrIGZvciBhdXRvYWN0aXZhdGlvbi4KKwkgKiBJZiB0aGUgTFYgcGFzc2VzIHRoZSBhdXRvIGFjdGl2YXRpb24gZmlsdGVyLCBhY3RpdmF0ZQorCSAqIGl0IGp1c3QgYXMgaWYgQ0hBTkdFX0FZIHdhcyB1c2VkLCBDSEFOR0VfQU4gb3RoZXJ3aXNlLgorCSAqLworCWlmIChscC0+YWN0aXZhdGUgPT0gQ0hBTkdFX0FBWSkKKwkJbHAtPmFjdGl2YXRlID0gbHZfcGFzc2VzX2F1dG9fYWN0aXZhdGlvbl9maWx0ZXIoY21kLCBsdikKKwkJCT8gQ0hBTkdFX0FMWSA6IENIQU5HRV9BTE47CisKKwlpZiAobHZfYWN0aXZhdGlvbl9za2lwKGx2LCBscC0+YWN0aXZhdGUsIGxwLT5hY3RpdmF0aW9uX3NraXAgJiBBQ1RJVkFUSU9OX1NLSVBfSUdOT1JFKSkKKwkJbHAtPmFjdGl2YXRlID0gQ0hBTkdFX0FOOworCisJLyogc3RvcmUgdmcgb24gZGlzayhzKSAqLworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKQorCQkvKiBQb29sIGNyZWF0ZWQgbWV0YWRhdGEgTFYsIGJ1dCBiZXR0ZXIgYXZvaWQgcmVjb3ZlciB3aGVuIHZnX3dyaXRlL2NvbW1pdCBmYWlscyAqLworCQlyZXR1cm5fTlVMTDsKKworCWJhY2t1cCh2Zyk7CisKKwlpZiAodGVzdF9tb2RlKCkpIHsKKwkJbG9nX3ZlcmJvc2UoIlRlc3QgbW9kZTogU2tpcHBpbmcgYWN0aXZhdGlvbiwgemVyb2luZyBhbmQgc2lnbmF0dXJlIHdpcGluZy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRG8gbm90IHNjYW4gdGhpcyBMViB1bnRpbCBwcm9wZXJseSB6ZXJvZWQvd2lwZWQuICovCisJaWYgKF9zaG91bGRfd2lwZV9sdihscCwgbHYsIDApKQorCQlsdi0+c3RhdHVzIHw9IExWX05PU0NBTjsKKworCWlmIChscC0+dGVtcG9yYXJ5KQorCQlsdi0+c3RhdHVzIHw9IExWX1RFTVBPUkFSWTsKKworCWlmIChzZWdfaXNfY2FjaGUobHApKSB7CisJCS8qIEZJWE1FIFN1cHBvcnQgcmVtb3RlIGV4Y2x1c2l2ZSBhY3RpdmF0aW9uPyAqLworCQkvKiBOb3QgeWV0ICdjYWNoZScgTFYsIGl0IGlzIHN0cmlwZSB2b2x1bWUgZm9yIHdpcGluZyAqLworCQlpZiAoaXNfY2hhbmdlX2FjdGl2YXRpbmcobHAtPmFjdGl2YXRlKSAmJgorCQkgICAgIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdikpIHsKKwkJCWxvZ19lcnJvcigiQWJvcnRpbmcuIEZhaWxlZCB0byBhY3RpdmF0ZSBMViAlcyBsb2NhbGx5IGV4Y2x1c2l2ZWx5LiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJZ290byByZXZlcnRfbmV3X2x2OworCQl9CisJfSBlbHNlIGlmIChsdl9pc19jYWNoZV9wb29sKGx2KSkgeworCQkvKiBDYWNoZSBwb29sIGNhbm5vdCBiZSBhY3RpdmVkIGFuZCB6ZXJvZWQgKi8KKwkJbG9nX3ZlcnlfdmVyYm9zZSgiQ2FjaGUgcG9vbCBpcyBwcmVwYXJlZC4iKTsKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSkgeworCQkvKiBGb3Igc25hcHNob3QsIHN1c3BlbmQgYWN0aXZlIHRoaW4gb3JpZ2luIGZpcnN0ICovCisJCWlmIChvcmlnaW5fbHYgJiYgbHZfaXNfYWN0aXZlKG9yaWdpbl9sdikgJiYgbHZfaXNfdGhpbl92b2x1bWUob3JpZ2luX2x2KSkgeworCQkJaWYgKCFzdXNwZW5kX2x2X29yaWdpbihjbWQsIG9yaWdpbl9sdikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdXNwZW5kIHRoaW4gc25hcHNob3Qgb3JpZ2luICVzLyVzLiIsCisJCQkJCSAgb3JpZ2luX2x2LT52Zy0+bmFtZSwgb3JpZ2luX2x2LT5uYW1lKTsKKwkJCQlnb3RvIHJldmVydF9uZXdfbHY7CisJCQl9CisJCQlpZiAoIXJlc3VtZV9sdl9vcmlnaW4oY21kLCBvcmlnaW5fbHYpKSB7IC8qIGRlcHRyZWUgdXBkYXRlcyB0aGluLXBvb2wgKi8KKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXN1bWUgdGhpbiBzbmFwc2hvdCBvcmlnaW4gJXMvJXMuIiwKKwkJCQkJICBvcmlnaW5fbHYtPnZnLT5uYW1lLCBvcmlnaW5fbHYtPm5hbWUpOworCQkJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwkJCX0KKwkJCS8qIEF0IHRoaXMgcG9pbnQgcmVtb3ZlIHBvb2wgbWVzc2FnZXMsIHNuYXBzaG90IGlzIGFjdGl2ZSAqLworCQkJaWYgKCF1cGRhdGVfcG9vbF9sdihwb29sX2x2LCAwKSkgeworCQkJCXN0YWNrOworCQkJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwkJCX0KKwkJfQorCQlpZiAoIWRtX2xpc3RfZW1wdHkoJmZpcnN0X3NlZyhwb29sX2x2KS0+dGhpbl9tZXNzYWdlcykpIHsKKwkJCS8qIFNlbmQgbWVzc2FnZSBzbyB0aGF0IHRhYmxlIHByZWxvYWQga25vd3MgbmV3IHRoaW4gKi8KKwkJCWlmICghbHZfaXNfYWN0aXZlKHBvb2xfbHYpKSB7CisJCQkJLyogQXZvaWQgbXVsdGlwbGUgdGhpbi1wb29sIGFjdGl2YXRpb25zIGluIHRoaXMgY2FzZSAqLworCQkJCWlmICh0aGluX3Bvb2xfd2FzX2FjdGl2ZSA8IDApCisJCQkJCXRoaW5fcG9vbF93YXNfYWN0aXZlID0gMDsKKwkJCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2woY21kLCBwb29sX2x2KSkgeworCQkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSB0aGluIHBvb2wgJXMuIiwKKwkJCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJCQlnb3RvIHJldmVydF9uZXdfbHY7CisJCQkJfQorCQkJCWlmICghbHZfaXNfYWN0aXZlKHBvb2xfbHYpKSB7CisJCQkJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIHRoaW4gcG9vbCAlcywgcGVyaGFwcyBza2lwcGVkIGluIGx2bS5jb25mIHZvbHVtZV9saXN0PyIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJLyogS2VlcCB0aGluIHBvb2wgYWN0aXZlIHVudGlsIHRoaW4gdm9sdW1lIGlzIGFjdGl2YXRlZCAqLworCQkJaWYgKCF1cGRhdGVfcG9vbF9sdihwb29sX2x2LCAxKSkgeworCQkJCXN0YWNrOworCQkJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwkJCX0KKwkJfQorCQliYWNrdXAodmcpOworCisJCWlmICghbHZfYWN0aXZlX2NoYW5nZShjbWQsIGx2LCBscC0+YWN0aXZhdGUsIDApKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSB0aGluICVzLiIsIGx2LT5uYW1lKTsKKwkJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsKKwkJfQorCisJCS8qIFJlc3RvcmUgaW5hY3RpdmUgc3RhdGUgaWYgbmVlZGVkICovCisJCWlmICghdGhpbl9wb29sX3dhc19hY3RpdmUgJiYKKwkJICAgICFkZWFjdGl2YXRlX2x2KGNtZCwgcG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRlYWN0aXZhdGUgdGhpbiBwb29sICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAobHAtPnNuYXBzaG90KSB7CisJCWx2LT5zdGF0dXMgfD0gTFZfVEVNUE9SQVJZOworCQlpZiAoIWFjdGl2YXRlX2x2X2xvY2FsKGNtZCwgbHYpKSB7CisJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gYWN0aXZhdGUgc25hcHNob3QgIgorCQkJCSAgImV4Y2VwdGlvbiBzdG9yZS4iKTsKKwkJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwkJfQorCQlsdi0+c3RhdHVzICY9IH5MVl9URU1QT1JBUlk7CisJfSBlbHNlIGlmICghbHZfYWN0aXZlX2NoYW5nZShjbWQsIGx2LCBscC0+YWN0aXZhdGUsIDApKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyBMVi4iKTsKKwkJZ290byBkZWFjdGl2YXRlX2FuZF9yZXZlcnRfbmV3X2x2OworCX0KKworCWlmIChfc2hvdWxkX3dpcGVfbHYobHAsIGx2LCAhbHAtPnN1cHByZXNzX3plcm9fd2FybikpIHsKKwkJaWYgKCF3aXBlX2x2KGx2LCAoc3RydWN0IHdpcGVfcGFyYW1zKQorCQkJICAgICB7CisJCQkJICAgICAuZG9femVybyA9IGxwLT56ZXJvLAorCQkJCSAgICAgLmRvX3dpcGVfc2lnbmF0dXJlcyA9IGxwLT53aXBlX3NpZ25hdHVyZXMsCisJCQkJICAgICAueWVzID0gbHAtPnllcywKKwkJCQkgICAgIC5mb3JjZSA9IGxwLT5mb3JjZQorCQkJICAgICB9KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgJXMuIiwgbHAtPnNuYXBzaG90CisJCQkJICA/ICJzbmFwc2hvdCBleGNlcHRpb24gc3RvcmUiIDogInN0YXJ0IG9mIG5ldyBMViIpOworCQkJZ290byBkZWFjdGl2YXRlX2FuZF9yZXZlcnRfbmV3X2x2OworCQl9CisJfQorCisJaWYgKHNlZ19pc19jYWNoZShscCkgfHwgKG9yaWdpbl9sdiAmJiBsdl9pc19jYWNoZV9wb29sKGx2KSkpIHsKKwkJLyogRmluaXNoIGNhY2hlIGNvbnZlcnNpb24gbWFnaWMgKi8KKwkJaWYgKG9yaWdpbl9sdikgeworCQkJLyogQ29udmVydCBvcmlnaW4gdG8gY2FjaGVkIExWICovCisJCQlpZiAoISh0bXBfbHYgPSBsdl9jYWNoZV9jcmVhdGUobHYsIG9yaWdpbl9sdikpKSB7CisJCQkJLyogRklYTUUgRG8gYSBiZXR0ZXIgcmV2ZXJ0ICovCisJCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gTGVhdmluZyBjYWNoZSBwb29sICVzIGFuZCB1bmNhY2hlZCBvcmlnaW4gdm9sdW1lICVzLiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShvcmlnaW5fbHYpKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKHRtcF9sdiA9IGx2X2NhY2hlX2NyZWF0ZShwb29sX2x2LCBsdikpKSB7CisJCQkJLyogJ2x2JyBzdGlsbCBrZWVwcyBjcmVhdGVkIG5ldyBMViAqLworCQkJCXN0YWNrOworCQkJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsKKwkJCX0KKwkJfQorCQlsdiA9IHRtcF9sdjsKKworCQlpZiAoIWNhY2hlX3NldF9wYXJhbXMoZmlyc3Rfc2VnKGx2KSwKKwkJCQkgICAgICBscC0+Y2FjaGVfbW9kZSwKKwkJCQkgICAgICBscC0+cG9saWN5X25hbWUsCisJCQkJICAgICAgbHAtPnBvbGljeV9zZXR0aW5ncywKKwkJCQkgICAgICAobHAtPnBhc3NlZF9hcmdzICYgUEFTU19BUkdfQ0hVTktfU0laRSkgPyBscC0+Y2h1bmtfc2l6ZSA6IDApKQorCQkJcmV0dXJuX05VTEw7IC8qIHJldmVydD8gKi8KKworCQljYWNoZV9jaGVja19mb3Jfd2FybnMoZmlyc3Rfc2VnKGx2KSk7CisKKwkJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpIHsKKwkJCS8qIEZJWE1FIERvIGEgYmV0dGVyIHJldmVydCAqLworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gTWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZC4iKTsKKwkJCXJldHVybiBOVUxMOyAvKiBGSVhNRTogcmV2ZXJ0ICovCisJCX0KKwl9IGVsc2UgaWYgKGxwLT5zbmFwc2hvdCkgeworCQkvKiBEZWFjdGl2YXRlIHplcm9lZCBDT1csIGF2b2lkIGFueSByYWNlIHVzYWdlICovCisJCWlmICghZGVhY3RpdmF0ZV9sdihjbWQsIGx2KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gQ291bGRuJ3QgZGVhY3RpdmF0ZSBzbmFwc2hvdCBDT1cgYXJlYSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsgLyogTGV0J3MgcmV0cnkgb24gZXJyb3IgcGF0aCAqLworCQl9CisKKwkJLyogR2V0IGluIHN5bmMgd2l0aCBkZWFjdGl2YXRpb24sIGJlZm9yZSByZXVzaW5nIExWIGFzIHNuYXBzaG90ICovCisJCWlmICghc3luY19sb2NhbF9kZXZfbmFtZXMobHYtPnZnLT5jbWQpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzeW5jIGxvY2FsIGRldmljZXMgYmVmb3JlIGNyZWF0aW5nIHNuYXBzaG90IHVzaW5nICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJZ290byByZXZlcnRfbmV3X2x2OworCQl9CisKKwkJLyogQ3JlYXRlIHplcm8gb3JpZ2luIHZvbHVtZSBmb3Igc3BhcmUgc25hcHNob3QgKi8KKwkJaWYgKGxwLT52aXJ0dWFsX2V4dGVudHMgJiYKKwkJICAgICEob3JpZ2luX2x2ID0gX2NyZWF0ZV92aXJ0dWFsX29yaWdpbihjbWQsIHZnLCBsdi0+bmFtZSwKKwkJCQkJCQkgbHAtPnBlcm1pc3Npb24sCisJCQkJCQkJIGxwLT52aXJ0dWFsX2V4dGVudHMpKSkKKwkJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKworCQkvKiBSZXNldCBwZXJtaXNzaW9uIGFmdGVyIHplcm9pbmcgKi8KKwkJaWYgKCEobHAtPnBlcm1pc3Npb24gJiBMVk1fV1JJVEUpKQorCQkJbHYtPnN0YXR1cyAmPSB+TFZNX1dSSVRFOworCisJCS8qCisJCSAqIENPVyBMViBpcyBhY3RpdmF0ZWQgdmlhIGltcGxpY2l0IGFjdGl2YXRpb24gb2Ygb3JpZ2luIExWCisJCSAqIE9ubHkgdGhlIHNuYXBzaG90IG9yaWdpbiBob2xkcyB0aGUgTFYgbG9jayBpbiBjbHVzdGVyCisJCSAqLworCQlpZiAoIXZnX2FkZF9zbmFwc2hvdChvcmlnaW5fbHYsIGx2LCBOVUxMLAorCQkJCSAgICAgb3JpZ2luX2x2LT5sZV9jb3VudCwgbHAtPmNodW5rX3NpemUpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzbmFwc2hvdC4iKTsKKwkJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsKKwkJfQorCisJCWlmIChscC0+dmlydHVhbF9leHRlbnRzKSB7CisJCQkvKiBTdG9yZSB2ZyBvbiBkaXNrKHMpICovCisJCQlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJCQlyZXR1cm5fTlVMTDsgLyogTWV0YWRhdGEgdXBkYXRlIGZhaWxzLCBkZWVwIHRyb3VibGVzICovCisKKwkJCWJhY2t1cCh2Zyk7CisJCQkvKgorCQkJICogRklYTUUgV2UgZG8gbm90IGFjdHVhbGx5IG5lZWQgc25hcHNob3Qtb3JpZ2luIGFzIGFuIGFjdGl2ZSBkZXZpY2UsCisJCQkgKiBhcyB2aXJ0dWFsIG9yaWdpbiBpcyBhbHJlYWR5ICdoaWRkZW4nIHByaXZhdGUgZGV2aWNlIHdpdGhvdXQKKwkJCSAqIHZnL2x2IGxpbmtzLiBBcyBzdWNoIGl0IGlzIG5vdCBzdXBwb3NlZCB0byBiZSB1c2VkIGJ5IGFueSB1c2VyLgorCQkJICogQWxzbyBpdCB3b3VsZCBzYXZlIG9uZSBkbSB0YWJsZSBlbnRyeSwgYnV0IGl0IG5lZWRzIHF1aXRlIGEgZmV3CisJCQkgKiBjaGFuZ2VzIGluIHRoZSBsaWJkbS9sdm0yIGNvZGUgYmFzZSB0byBzdXBwb3J0IGl0LgorCQkJICovCisKKwkJCS8qIEFjdGl2YXRlIHNwYXJlIHNuYXBzaG90IG9uY2UgaXQgaXMgYSBjb21wbGV0ZSBMViAqLworCQkJaWYgKCFsdl9hY3RpdmVfY2hhbmdlKGNtZCwgb3JpZ2luX2x2LCBscC0+YWN0aXZhdGUsIDEpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWN0aXZhdGUgc3BhcmNlIHZvbHVtZSAlcy4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKG9yaWdpbl9sdikpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChvcmlnaW5fbHYpKSB7CisJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBNYW51YWwgaW50ZXJ2ZW50aW9uIHJlcXVpcmVkLiIpOworCQkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FOiByZXZlcnQgKi8KKwkJfQorCX0KK291dDoKKwlyZXR1cm4gbHY7CisKK2RlYWN0aXZhdGVfYW5kX3JldmVydF9uZXdfbHY6CisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgZmFpbGVkIG5ldyBMViAlcy4gIgorCQkJICAiTWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZC4iLCAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCityZXZlcnRfbmV3X2x2OgorCWxvY2tkX2ZyZWVfbHYodmctPmNtZCwgdmcsIGxwLT5sdl9uYW1lLCAmbHYtPmx2aWQuaWRbMV0sIGxwLT5sb2NrX2FyZ3MpOworCisJLyogRklYTUUgQmV0dGVyIHRvIHJldmVydCB0byBiYWNrdXAgb2YgbWV0YWRhdGE/ICovCisJaWYgKCFsdl9yZW1vdmUobHYpIHx8ICF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpCisJCWxvZ19lcnJvcigiTWFudWFsIGludGVydmVudGlvbiBtYXkgYmUgcmVxdWlyZWQgdG8gcmVtb3ZlICIKKwkJCSAgImFiYW5kb25lZCBMVihzKSBiZWZvcmUgcmV0cnlpbmcuIik7CisJZWxzZQorCQliYWNrdXAodmcpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfY3JlYXRlX3NpbmdsZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHApCit7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCisJLyogQ3JlYXRlIHBvb2wgZmlyc3QgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGxwLT5jcmVhdGVfcG9vbCAmJiAhc2VnX2lzX3Bvb2wobHApKSB7CisJCXNlZ3R5cGUgPSBscC0+c2VndHlwZTsKKwkJaWYgKHNlZ19pc190aGluX3ZvbHVtZShscCkpIHsKKwkJCWlmICghKGxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9USElOX1BPT0wpKSkKKwkJCQlyZXR1cm5fTlVMTDsKKworCQkJaWYgKCEobHYgPSBfbHZfY3JlYXRlX2FuX2x2KHZnLCBscCwgbHAtPnBvb2xfbmFtZSkpKQorCQkJCXJldHVybl9OVUxMOworCQl9IGVsc2UgaWYgKHNlZ19pc19jYWNoZShscCkpIHsKKwkJCWlmICghbHAtPm9yaWdpbl9uYW1lKSB7CisJCQkJLyogVW50aWwgd2UgaGF2ZSAtLXBvb2xkYXRhc2l6ZSB3ZSBhcmUgbG9zdCAqLworCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5zdXBwb3J0ZWQgY3JlYXRpb24gb2YgY2FjaGUgYW5kIGNhY2hlIHBvb2wgdm9sdW1lLiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJLyogb3JpZ2luX25hbWUgaXMgZGVmaW5lZCAtPiBjcmVhdGVzIGNhY2hlIExWIHdpdGggbmV3IGNhY2hlIHBvb2wgKi8KKwkJCWlmICghKGxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9DQUNIRV9QT09MKSkpCisJCQkJcmV0dXJuX05VTEw7CisKKwkJCWlmICghKGx2ID0gX2x2X2NyZWF0ZV9hbl9sdih2ZywgbHAsIGxwLT5wb29sX25hbWUpKSkKKwkJCQlyZXR1cm5fTlVMTDsKKworCQkJaWYgKCFsdl9pc19jYWNoZShsdikpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxvZ2ljYWwgdm9sdW1lIGlzIG5vdCBjYWNoZSAlcy4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCS8qIENvbnZlcnRpb24gdmlhIGx2Y3JlYXRlICovCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm93IGNhY2hlZC4iLAorCQkJCQkJZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiBsdjsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQ3JlYXRpb24gb2YgcG9vbCBmb3IgdW5zdXBwb3J0ZWQgc2VnbWVudCB0eXBlICVzLiIsCisJCQkJICBscC0+c2VndHlwZS0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlscC0+cG9vbF9uYW1lID0gbHYtPm5hbWU7CisJCWxwLT5zZWd0eXBlID0gc2VndHlwZTsKKwl9CisKKwlpZiAoIShsdiA9IF9sdl9jcmVhdGVfYW5fbHYodmcsIGxwLCBscC0+bHZfbmFtZSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmIChscC0+dGVtcG9yYXJ5KQorCQlsb2dfdmVyYm9zZSgiVGVtcG9yYXJ5IGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBjcmVhdGVkLiIsIGx2LT5uYW1lKTsKKwllbHNlCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJMb2dpY2FsIHZvbHVtZSBcIiVzXCIgY3JlYXRlZC4iLCBsdi0+bmFtZSk7CisKKwlyZXR1cm4gbHY7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvbWVyZ2UuYyBiL2xpYi9tZXRhZGF0YS9tZXJnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzM4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvbWVyZ2UuYwpAQCAtMCwwICsxLDg5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlIDxkZWZhdWx0cy5oPgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAibHZfYWxsb2MuaCIKKyNpbmNsdWRlICJwdl9hbGxvYy5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorCisvKgorICogQXR0ZW1wdCB0byBtZXJnZSB0d28gYWRqYWNlbnQgc2VnbWVudHMuCisgKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBzdHJpcGVkIHNlZ21lbnRzIG9uIEFSRUFfUFYuCisgKiBSZXR1cm5zIHN1Y2Nlc3MgaWYgc3VjY2Vzc2Z1bCwgaW4gd2hpY2ggY2FzZSAnZmlyc3QnCisgKiBnZXRzIGFkanVzdGVkIHRvIGNvbnRhaW4gYm90aCBhcmVhcy4KKyAqLworc3RhdGljIGludCBfbWVyZ2Uoc3RydWN0IGx2X3NlZ21lbnQgKmZpcnN0LCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2Vjb25kKQoreworCWlmICghZmlyc3QgfHwgIXNlY29uZCB8fCBmaXJzdC0+c2VndHlwZSAhPSBzZWNvbmQtPnNlZ3R5cGUgfHwKKwkgICAgIWZpcnN0LT5zZWd0eXBlLT5vcHMtPm1lcmdlX3NlZ21lbnRzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmaXJzdC0+c2VndHlwZS0+b3BzLT5tZXJnZV9zZWdtZW50cyhmaXJzdCwgc2Vjb25kKTsKK30KKworaW50IGx2X21lcmdlX3NlZ21lbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGRtX2xpc3QgKnNlZ2gsICp0OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsICpjdXJyZW50LCAqcHJldiA9IE5VTEw7CisKKwkvKgorCSAqIERvbid0IGludGVyZmVyZSB3aXRoIHB2bW92ZXMgYXMgdGhleSByZWx5IHVwb24gdHdvIExWcworCSAqIGhhdmluZyBhIG1hdGNoaW5nIHNlZ21lbnQgc3RydWN0dXJlLgorCSAqLworCisJaWYgKGx2X2lzX2xvY2tlZChsdikgfHwgbHZfaXNfcHZtb3ZlKGx2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobHZfaXNfbWlycm9yX2ltYWdlKGx2KSAmJgorCSAgICAoc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KGx2KSkgJiYKKwkgICAgKGx2X2lzX2xvY2tlZChzZWctPmx2KSB8fCBsdl9pc19wdm1vdmUoc2VnLT5sdikpKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKHNlZ2gsIHQsICZsdi0+c2VnbWVudHMpIHsKKwkJY3VycmVudCA9IGRtX2xpc3RfaXRlbShzZWdoLCBzdHJ1Y3QgbHZfc2VnbWVudCk7CisKKwkJaWYgKF9tZXJnZShwcmV2LCBjdXJyZW50KSkKKwkJCWRtX2xpc3RfZGVsKCZjdXJyZW50LT5saXN0KTsKKwkJZWxzZQorCQkJcHJldiA9IGN1cnJlbnQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgRVJST1JfTUFYIDEwMAorI2RlZmluZSBpbmNfZXJyb3JfY291bnQgXAorCWlmIChlcnJvcl9jb3VudCsrID4gRVJST1JfTUFYKQlcCisJCWdvdG8gb3V0CisKKy8qCisgKiBSQUlEIHNlZ21lbnQgcHJvcGVydHkgY2hlY2tzLgorICoKKyAqIENoZWNrcyBpbiBoZXJlIHNoYWxsIGNhdGNoIGFueQorICogYm9ndXMgc2VnbWVudCBzdHJ1Y3R1cmUgc2V0dXAuCisgKi8KKyNkZWZpbmUgcmFpZF9zZWdfZXJyb3IobXNnKSB7IFwKKwlsb2dfZXJyb3IoIkxWICVzIGludmFsaWQ6ICVzIGZvciAlcyBzZWdtZW50IiwgXAorCQkgIHNlZy0+bHYtPm5hbWUsIChtc2cpLCBsdnNlZ19uYW1lKHNlZykpOyBcCisJaWYgKCgqZXJyb3JfY291bnQpKysgPiBFUlJPUl9NQVgpIFwKKwkJcmV0dXJuOyBcCit9CisKKyNkZWZpbmUgcmFpZF9zZWdfZXJyb3JfdmFsKG1zZywgdmFsKSB7IFwKKwlsb2dfZXJyb3IoIkxWICVzIGludmFsaWQ6ICVzIChpcyAldSkgZm9yICVzIHNlZ21lbnQiLCBcCisJCSAgc2VnLT5sdi0+bmFtZSwgKG1zZyksICh2YWwpLCBsdnNlZ19uYW1lKHNlZykpOyBcCisJaWYgKCgqZXJyb3JfY291bnQpKysgPiBFUlJPUl9NQVgpIFwKKwkJcmV0dXJuOyBcCit9CisKKy8qIENoZWNrIHJhaWQwIHNlZ21lbnQgcHJvcGVydGllcyBpbiBAc2VnICovCitzdGF0aWMgdm9pZCBfY2hlY2tfcmFpZDBfc2VnKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqZXJyb3JfY291bnQpCit7CisJaWYgKHNlZ19pc19yYWlkMF9tZXRhKHNlZykgJiYKKwkgICAgIXNlZy0+bWV0YV9hcmVhcykKKwkJcmFpZF9zZWdfZXJyb3IoIm5vIG1ldGEgYXJlYXMiKTsKKwlpZiAoIXNlZy0+c3RyaXBlX3NpemUpCisJCXJhaWRfc2VnX2Vycm9yKCJ6ZXJvIHN0cmlwZSBzaXplIik7CisJaWYgKCFpc19wb3dlcl9vZl8yKHNlZy0+c3RyaXBlX3NpemUpKQorCQlyYWlkX3NlZ19lcnJvcl92YWwoIm5vbiBwb3dlciBvZiAyIHN0cmlwZSBzaXplIiwgc2VnLT5zdHJpcGVfc2l6ZSk7CisJaWYgKHNlZy0+cmVnaW9uX3NpemUpCisJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibm9uLXplcm8gcmVnaW9uX3NpemUiLCBzZWctPnJlZ2lvbl9zaXplKTsKKwlpZiAoc2VnLT53cml0ZWJlaGluZCkKKwkJcmFpZF9zZWdfZXJyb3JfdmFsKCJub24temVybyB3cml0ZSBiZWhpbmQiLCBzZWctPndyaXRlYmVoaW5kKTsKKwlpZiAoc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZSkKKwkJcmFpZF9zZWdfZXJyb3JfdmFsKCJub24temVybyBtaW4gcmVjb3ZlcnkgcmF0ZSIsIHNlZy0+bWluX3JlY292ZXJ5X3JhdGUpOworCWlmIChzZWctPm1heF9yZWNvdmVyeV9yYXRlKQorCQlyYWlkX3NlZ19lcnJvcl92YWwoIm5vbi16ZXJvIG1heCByZWNvdmVyeSByYXRlIiwgc2VnLT5tYXhfcmVjb3ZlcnlfcmF0ZSk7Cit9CisKKy8qIENoZWNrIFJBSUQgQHNlZyBmb3Igbm9uLXplcm8sIHBvd2VyIG9mIDIgcmVnaW9uIHNpemUgYW5kIG1pbiByZWNvdmVyeSByYXRlIDw9IG1heCAqLworc3RhdGljIHZvaWQgX2NoZWNrX3JhaWRfcmVnaW9uX3JlY292ZXJ5KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqZXJyb3JfY291bnQpCit7CisJaWYgKCFzZWctPnJlZ2lvbl9zaXplKQorCQlyYWlkX3NlZ19lcnJvcigiemVybyByZWdpb25fc2l6ZSIpOworCWlmICghaXNfcG93ZXJfb2ZfMihzZWctPnJlZ2lvbl9zaXplKSkKKwkJcmFpZF9zZWdfZXJyb3JfdmFsKCJub24gcG93ZXIgb2YgMiByZWdpb24gc2l6ZSIsIHNlZy0+cmVnaW9uX3NpemUpOworCS8qIG1pbi9tYXggcmVjb3ZlcnkgcmF0ZSBtYXkgYmUgemVybyBidXQgbWluIG1heSBub3QgYmUgbGFyZ2VyIHRoYW4gbWF4IGlmIHNldCAqLworCWlmIChzZWctPm1heF9yZWNvdmVyeV9yYXRlICYmCisJICAgIHNlZy0+bWluX3JlY292ZXJ5X3JhdGUgPiBzZWctPm1heF9yZWNvdmVyeV9yYXRlKQorCQlyYWlkX3NlZ19lcnJvcl92YWwoIm1pbiByZWNvdmVyeSBsYXJnZXIgdGhhbiBtYXggcmVjb3ZlcnkgbGFyZ2VyIiwgc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZSk7Cit9CisKKy8qIENoZWNrIHJhaWQxIHNlZ21lbnQgcHJvcGVydGllcyBpbiBAc2VnICovCitzdGF0aWMgdm9pZCBfY2hlY2tfcmFpZDFfc2VnKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqZXJyb3JfY291bnQpCit7CisJaWYgKCFzZWctPm1ldGFfYXJlYXMpCisJCXJhaWRfc2VnX2Vycm9yKCJubyBtZXRhIGFyZWFzIik7CisJaWYgKHNlZy0+c3RyaXBlX3NpemUpCisJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibm9uLXplcm8gc3RyaXBlIHNpemUiLCBzZWctPnN0cmlwZV9zaXplKTsKKwlfY2hlY2tfcmFpZF9yZWdpb25fcmVjb3Zlcnkoc2VnLCBlcnJvcl9jb3VudCk7Cit9CisKKy8qIENoZWNrIHJhaWQ0LzUvNi8xMCBzZWdtZW50IHByb3BlcnRpZXMgaW4gQHNlZyAqLworc3RhdGljIHZvaWQgX2NoZWNrX3JhaWQ0NTYxMF9zZWcoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50ICplcnJvcl9jb3VudCkKK3sKKwkvKiBDaGVja3MgYXBwbHlpbmcgdG8gYW55IHJhaWQ0LzUvNi8xMCAqLworCWlmICghc2VnLT5tZXRhX2FyZWFzKQorCQlyYWlkX3NlZ19lcnJvcigibm8gbWV0YSBhcmVhcyIpOworCWlmICghc2VnLT5zdHJpcGVfc2l6ZSkKKwkJcmFpZF9zZWdfZXJyb3IoInplcm8gc3RyaXBlIHNpemUiKTsKKwlpZiAoIWlzX3Bvd2VyX29mXzIoc2VnLT5zdHJpcGVfc2l6ZSkpCisJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibm9uIHBvd2VyIG9mIDIgc3RyaXBlIHNpemUiLCBzZWctPnN0cmlwZV9zaXplKTsKKwlfY2hlY2tfcmFpZF9yZWdpb25fcmVjb3Zlcnkoc2VnLCBlcnJvcl9jb3VudCk7CisJLyogRU5EOiBjaGVja3MgYXBwbHlpbmcgdG8gYW55IHJhaWQ0LzUvNi8xMCAqLworCisJLyogU3BlY2lmaWMgY2hlY2tzIHBlciByYWlkIGxldmVsICovCisJaWYgKHNlZ19pc19yYWlkNChzZWcpIHx8CisJICAgIHNlZ19pc19hbnlfcmFpZDUoc2VnKSkgeworCQkvKgorCQkgKiBUbyBhbGxvdyBmb3IgdGFrZW92ZXIgYmV0d2VlbiB0aGUgTUQgcmFpZDEgYW5kCisJCSAqIHJhaWQ0LzUgcGVyc29uYWxpdGllcywgZXhhY3RseSAyIGFyZWFzIChpLmUuIERhdGFMVnMpCisJCSAqIGNhbiBiZSBtaXJyb3JlZCBieSBhbGwgcmFpZDEsIHJhaWQ0IGFuZCByYWlkNSBwZXJzb25hbGl0aWVzLgorCQkgKiBIZW5jZSBhbGxvdyBhIG1pbmltdW0gb2YgMiBhcmVhcy4KKwkJICovCisJCWlmIChzZWctPmFyZWFfY291bnQgPCAyKQorCQkJcmFpZF9zZWdfZXJyb3JfdmFsKCJtaW5pbXVtIDIgYXJlYXMgcmVxdWlyZWQiLCBzZWctPmFyZWFfY291bnQpOworCX0gZWxzZSBpZiAoc2VnX2lzX2FueV9yYWlkNihzZWcpKSB7CisJCS8qCisJCSAqIEZJWE1FOiBNRCByYWlkNiBzdXBwb3J0cyBhIG1pbmltdW0gb2YgNCBhcmVhcy4KKwkJICoJICBMVk0gcmVxdWVzdHMgYSBtaW5pbXVtIG9mIDUgZHVlIHRvIGVhc2llcgorCQkgKgkgIHByb2Nlc3Npbmcgb2YgU3ViTFZzIHRvIHJlcGxhY2UuCisJCSAqCisJCSAqCSAgT25jZSB0aGF0IG9ic3RhY2xlIGdvdCByZW1vdmVkLCBhbGxvdyBmb3IgYSBtaW5pbXVtIG9mIDQuCisJCSAqLworCQlpZiAoc2VnLT5hcmVhX2NvdW50IDwgNSkKKwkJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibWluaW11bSA1IGFyZWFzIHJlcXVpcmVkIiwgc2VnLT5hcmVhX2NvdW50KTsKKwl9IGVsc2UgaWYgKHNlZ19pc19yYWlkMTAoc2VnKSkgeworCQkvKgorCQkgKiBGSVhNRTogcmFpZDEwIGFyZWFfY291bnQgbWluaW11bSBoYXMgdG8gY2hhbmdlIHRvIDIgb25jZSB3ZQorCQkgKgkgIHN1cHBvcnQgZGF0YV9jb3BpZXMgYW5kIG9kZCBudW1iZXJzIG9mIHN0cmlwZXMKKwkJICovCisJCWlmIChzZWctPmFyZWFfY291bnQgPCA0KQorCQkJcmFpZF9zZWdfZXJyb3JfdmFsKCJtaW5pbXVtIDQgYXJlYXMgcmVxdWlyZWQiLCBzZWctPmFyZWFfY291bnQpOworCQlpZiAoc2VnLT53cml0ZWJlaGluZCkKKwkJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibm9uLXplcm8gd3JpdGViZWhpbmQiLCBzZWctPndyaXRlYmVoaW5kKTsKKwl9Cit9CisKKy8qIENoZWNrIGFueSBub24tUkFJRCBzZWdtZW50IHN0cnVjdCBtZW1iZXJzIGluIEBzZWcgYW5kIGluY3JlbWVudCBAZXJyb3JfY291bnQgZm9yIGFueSBib2d1cyBvbmVzICovCitzdGF0aWMgdm9pZCBfY2hlY2tfbm9uX3JhaWRfc2VnX21lbWJlcnMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50ICplcnJvcl9jb3VudCkKK3sKKwlpZiAoc2VnLT5vcmlnaW4pIC8qIHNuYXAgYW5kIHRoaW4gKi8KKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIG9yaWdpbiBMViIpOworCWlmIChzZWctPmluZGlyZWN0X29yaWdpbikgLyogdGhpbiAqLworCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gaW5kaXJlY3Rfb3JpZ2luIExWIik7CisJaWYgKHNlZy0+bWVyZ2VfbHYpIC8qIHRoaW4gKi8KKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIG1lcmdlIExWIik7CisJaWYgKHNlZy0+Y293KSAvKiBzbmFwICovCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyBjb3cgTFYiKTsKKwlpZiAoIWRtX2xpc3RfZW1wdHkoJnNlZy0+b3JpZ2luX2xpc3QpKSAvKiBzbmFwICovCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyBvcmlnaW5fbGlzdCIpOworCWlmIChzZWctPmxvZ19sdikKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIGxvZyBMViIpOworCWlmIChzZWctPnNlZ3R5cGVfcHJpdmF0ZSkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIHNlZ3R5cGVfcHJpdmF0ZSIpOworCS8qIHRoaW4gbWVtYmVycyAqLworCWlmIChzZWctPm1ldGFkYXRhX2x2KQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gbWV0YWRhdGEgTFYiKTsKKwlpZiAoc2VnLT50cmFuc2FjdGlvbl9pZCkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIHRyYW5zYWN0aW9uX2lkIik7CisJaWYgKHNlZy0+emVyb19uZXdfYmxvY2tzKQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gemVyb19uZXdfYmxvY2tzIik7CisJaWYgKHNlZy0+ZGlzY2FyZHMpCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyBkaXNjYXJkcyIpOworCWlmICghZG1fbGlzdF9lbXB0eSgmc2VnLT50aGluX21lc3NhZ2VzKSkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIHRoaW5fbWVzc2FnZXMgbGlzdCIpOworCWlmIChzZWctPmV4dGVybmFsX2x2KQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gZXh0ZXJuYWwgTFYiKTsKKwlpZiAoc2VnLT5wb29sX2x2KQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gcG9vbCBMViIpOworCWlmIChzZWctPmRldmljZV9pZCkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIGRldmljZV9pZCIpOworCS8qIGNhY2hlIG1lbWJlcnMgKi8KKwlpZiAoc2VnLT5jYWNoZV9tb2RlKQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gY2FjaGVfbW9kZSIpOworCWlmIChzZWctPnBvbGljeV9uYW1lKQorCQlyYWlkX3NlZ19lcnJvcigibm9uLXplcm8gcG9saWN5X25hbWUiKTsKKwlpZiAoc2VnLT5wb2xpY3lfc2V0dGluZ3MpCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyBwb2xpY3lfc2V0dGluZ3MiKTsKKwlpZiAoc2VnLT5jbGVhbmVyX3BvbGljeSkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIGNsZWFuZXJfcG9saWN5Iik7CisJLyogcmVwbGljYXRvciBtZW1iZXJzIChkZXByZWNhdGVkKSAqLworCWlmIChzZWctPnJlcGxpY2F0b3IpCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyByZXBsaWNhdG9yIik7CisJaWYgKHNlZy0+cmxvZ19sdikKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIHJsb2cgTFYiKTsKKwlpZiAoc2VnLT5ybG9nX3R5cGUpCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyBybG9nIHR5cGUiKTsKKwlpZiAoc2VnLT5yZGV2aWNlX2luZGV4X2hpZ2hlc3QpCisJCXJhaWRfc2VnX2Vycm9yKCJub24temVybyByZGV2aWNlX2luZGV4X2hpZ2hlc3RzIik7CisJaWYgKHNlZy0+cnNpdGVfaW5kZXhfaGlnaGVzdCkKKwkJcmFpZF9zZWdfZXJyb3IoIm5vbi16ZXJvIHJzaXRlX2luZGV4X2hpZ2hlc3RzIik7CisJLyogLi4uLiBtb3JlIG1lbWJlcnM/ICovCit9CisKKy8qCisgKiBDaGVjayBSQUlEIHNlZ21lbnQgc3J1Y3QgbWVtYmVycyBvZiBAc2VnIGZvciBhY2NlcHRhYmxlCisgKiBwcm9wZXJ0aWVzIGFuZCBpbmNyZW1lbnQgQGVycm9yX2NvdW50IGZvciBhbnkgYm9ndXMgb25lcy4KKyAqLworc3RhdGljIHZvaWQgX2NoZWNrX3JhaWRfc2VnKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqZXJyb3JfY291bnQpCit7CisJdWludDMyX3QgYXJlYV9sZW4sIHM7CisKKwkvKiBHZW5lcmFsIGNoZWNrcyBhcHBseWluZyB0byBhbGwgUkFJRHMgKi8KKwlpZiAoIXNlZ19pc19yYWlkKHNlZykpCisJCXJhaWRfc2VnX2Vycm9yKCJlcnJvbmVvdXMgUkFJRCBjaGVjayIpOworCisJaWYgKCFzZWctPmFyZWFfY291bnQpCisJCXJhaWRfc2VnX2Vycm9yKCJ6ZXJvIGFyZWEgY291bnQiKTsKKworCWlmICghc2VnLT5hcmVhcykKKwkJcmFpZF9zZWdfZXJyb3IoInplcm8gYXJlYXMiKTsKKworCWlmIChzZWctPmV4dGVudHNfY29waWVkID4gc2VnLT5hcmVhX2xlbikKKwkJcmFpZF9zZWdfZXJyb3JfdmFsKCJleHRlbnRzX2NvcGllZCB0b28gbGFyZ2UiLCBzZWctPmV4dGVudHNfY29waWVkKTsKKworCS8qIERlZmF1bHQgc3RpbGwgOCwgY2hhbmdlISAqLworCWlmIChzZWctPmFyZWFfY291bnQgPiBERUZBVUxUX1JBSURfTUFYX0lNQUdFUykgeworCQlsb2dfZXJyb3IoIkxWICVzIGludmFsaWQ6IG1heGltdW0gc3VwcG9ydGVkIGFyZWFzICV1IChpcyAldSkgZm9yICVzIHNlZ21lbnQiLAorCQkJICBzZWctPmx2LT5uYW1lLCBERUZBVUxUX1JBSURfTUFYX0lNQUdFUywgc2VnLT5hcmVhX2NvdW50LCBsdnNlZ19uYW1lKHNlZykpOworCQkJaWYgKCgqZXJyb3JfY291bnQpKysgPiBFUlJPUl9NQVgpCisJCQkJcmV0dXJuOworCX0KKworCWlmIChzZWctPmNodW5rX3NpemUpCisJCXJhaWRfc2VnX2Vycm9yX3ZhbCgibm9uLXplcm8gY2h1bmtfc2l6ZSIsIHNlZy0+Y2h1bmtfc2l6ZSk7CisKKwkvKiBGSVhNRTogc2hvdWxkIHdlIGNoZWNrIGFueSBub24tUkFJRCBzZWdtZW50IHN0cnVjdCBtZW1iZXJzIGF0IGFsbD8gKi8KKwlfY2hlY2tfbm9uX3JhaWRfc2VnX21lbWJlcnMoc2VnLCBlcnJvcl9jb3VudCk7CisKKwkvKiBDaGVjayBmb3IgYW55IERhdGFMViBmbGF3cyBsaWtlIG5vbi1leGlzdGluZyBvbmVzIG9yIHNpemUgdmFyaWF0aW9ucyAqLworCWZvciAoYXJlYV9sZW4gPSBzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpCisJCQlyYWlkX3NlZ19lcnJvcigibm8gRGF0YUxWIik7CisJCWlmICghbHZfaXNfcmFpZF9pbWFnZShzZWdfbHYoc2VnLCBzKSkpCisJCQlyYWlkX3NlZ19lcnJvcigiRGF0YUxWIHdpdGhvdXQgUkFJRCBpbWFnZSBmbGFnIik7CisJCWlmIChhcmVhX2xlbiAmJgorCQkgICAgYXJlYV9sZW4gIT0gc2VnX2x2KHNlZywgcyktPmxlX2NvdW50KSB7CisJCQkJcmFpZF9zZWdfZXJyb3JfdmFsKCJEYXRhTFYgc2l6ZSB2YXJpYXRpb25zIiwKKwkJICAgIAkJCQkgICBzZWdfbHYoc2VnLCBzKS0+bGVfY291bnQpOworCQl9IGVsc2UKKwkJCWFyZWFfbGVuID0gc2VnX2x2KHNlZywgcyktPmxlX2NvdW50OworCX0KKworCS8qIENoZWNrIGZvciBhbnkgTWV0YUxWIGZsYXdzIGxpa2Ugbm9uLWV4aXN0aW5nIG9uZXMgb3Igc2l6ZSB2YXJpYXRpb25zICovCisJaWYgKHNlZy0+bWV0YV9hcmVhcykKKwkJZm9yIChhcmVhX2xlbiA9IHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfbWV0YXR5cGUoc2VnLCBzKSAhPSBBUkVBX0xWKQorCQkJCXJhaWRfc2VnX2Vycm9yKCJubyBNZXRhTFYiKTsKKwkJCWlmICghbHZfaXNfcmFpZF9tZXRhZGF0YShzZWdfbWV0YWx2KHNlZywgcykpKQorCQkJCXJhaWRfc2VnX2Vycm9yKCJNZXRhTFYgd2l0aG91dCBSQUlEIG1ldGFkYXRhIGZsYWciKTsKKwkJCWlmIChhcmVhX2xlbiAmJgorCQkJICAgIGFyZWFfbGVuICE9IHNlZ19tZXRhbHYoc2VnLCBzKS0+bGVfY291bnQpIHsKKwkJCQlyYWlkX3NlZ19lcnJvcl92YWwoIk1ldGFMViBzaXplIHZhcmlhdGlvbnMiLAorCQkgICAgCQkJCSAgIHNlZ19tZXRhbHYoc2VnLCBzKS0+bGVfY291bnQpOworCQkJfSBlbHNlCisJCQkJYXJlYV9sZW4gPSBzZWdfbWV0YWx2KHNlZywgcyktPmxlX2NvdW50OworCQl9CisJLyogRU5EOiBnZW5lcmFsIGNoZWNrcyBhcHBseWluZyB0byBhbGwgUkFJRHMgKi8KKworCS8qIFNwZWNpZmljIHNlZ21lbnQgdHlwZSBjaGVja3MgZnJvbSBoZXJlIG9uICovCisJaWYgKHNlZ19pc19hbnlfcmFpZDAoc2VnKSkKKwkJX2NoZWNrX3JhaWQwX3NlZyhzZWcsIGVycm9yX2NvdW50KTsKKwllbHNlIGlmIChzZWdfaXNfcmFpZDEoc2VnKSkKKwkJX2NoZWNrX3JhaWQxX3NlZyhzZWcsIGVycm9yX2NvdW50KTsKKwllbHNlIGlmIChzZWdfaXNfcmFpZDQoc2VnKSB8fAorCQkgc2VnX2lzX2FueV9yYWlkNShzZWcpIHx8CisJCSBzZWdfaXNfYW55X3JhaWQ2KHNlZykgfHwKKwkJIHNlZ19pc19yYWlkMTAoc2VnKSkKKwkJX2NoZWNrX3JhaWQ0NTYxMF9zZWcoc2VnLCBlcnJvcl9jb3VudCk7CisJZWxzZQorCQlyYWlkX3NlZ19lcnJvcigiYm9ndXMgUkFJRCBzZWdtZW50IHR5cGUiKTsKK30KKy8qIEVORDogUkFJRCBzZWdtZW50IHByb3BlcnR5IGNoZWNrcy4gKi8KKworLyoKKyAqIFZlcmlmeSB0aGF0IGFuIExWJ3Mgc2VnbWVudHMgYXJlIGNvbnNlY3V0aXZlLCBjb21wbGV0ZSBhbmQgZG9uJ3Qgb3ZlcmxhcC4KKyAqLworaW50IGNoZWNrX2x2X3NlZ21lbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBjb21wbGV0ZV92ZykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCAqc2VnMjsKKwl1aW50MzJfdCBsZSA9IDA7CisJdW5zaWduZWQgc2VnX2NvdW50ID0gMCwgc2VnX2ZvdW5kOworCXVpbnQzMl90IGFyZWFfbXVsdGlwbGllciwgczsKKwlzdHJ1Y3Qgc2VnX2xpc3QgKnNsOworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKwlpbnQgZXJyb3JfY291bnQgPSAwOworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldjsKKworCS8qIENoZWNrIExWIGZsYWdzIG1hdGNoIGZpcnN0IHNlZ21lbnQgdHlwZSAqLworCWlmIChjb21wbGV0ZV92ZykgeworCQlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCQlpZiAoZG1fbGlzdF9zaXplKCZsdi0+c2VnbWVudHMpICE9IDEpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzIGlzIHRoaW4gdm9sdW1lIHdpdGhvdXQgZXhhY3RseSBvbmUgc2VnbWVudC4iLAorCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9IGVsc2UgaWYgKCFzZWdfaXNfdGhpbl92b2x1bWUoZmlyc3Rfc2VnKGx2KSkpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzIGlzIHRoaW4gdm9sdW1lIHdpdGhvdXQgZmlyc3QgdGhpbiB2b2x1bWUgc2VnbWVudC4iLAorCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9CisJCX0KKworCQlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQkJaWYgKGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSAhPSAxKSB7CisJCQkJbG9nX2Vycm9yKCJMViAlcyBpcyB0aGluIHBvb2wgdm9sdW1lIHdpdGhvdXQgZXhhY3RseSBvbmUgc2VnbWVudC4iLAorCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9IGVsc2UgaWYgKCFzZWdfaXNfdGhpbl9wb29sKGZpcnN0X3NlZyhsdikpKSB7CisJCQkJbG9nX2Vycm9yKCJMViAlcyBpcyB0aGluIHBvb2wgd2l0aG91dCBmaXJzdCB0aGluIHBvb2wgc2VnbWVudC4iLAorCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9CisJCX0KKworCQlpZiAobHZfaXNfcG9vbF9kYXRhKGx2KSAmJgorCQkgICAgKCEoc2VnMiA9IGZpcnN0X3NlZyhsdikpIHx8ICEoc2VnMiA9IGZpbmRfcG9vbF9zZWcoc2VnMikpIHx8CisJCSAgICAgc2VnMi0+YXJlYV9jb3VudCAhPSAxIHx8IHNlZ190eXBlKHNlZzIsIDApICE9IEFSRUFfTFYgfHwKKwkJICAgICBzZWdfbHYoc2VnMiwgMCkgIT0gbHYpKSB7CisJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50IDEgcG9vbCBkYXRhIExWIGRvZXMgbm90IHBvaW50IGJhY2sgdG8gc2FtZSBMViIsCisJCQkJICBsdi0+bmFtZSk7CisJCQlpbmNfZXJyb3JfY291bnQ7CisJCX0KKworCQlpZiAobHZfaXNfcG9vbF9tZXRhZGF0YShsdikpIHsKKwkJCWlmICghKHNlZzIgPSBmaXJzdF9zZWcobHYpKSB8fCAhKHNlZzIgPSBmaW5kX3Bvb2xfc2VnKHNlZzIpKSB8fAorCQkJICAgIHNlZzItPm1ldGFkYXRhX2x2ICE9IGx2KSB7CisJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAxIHBvb2wgbWV0YWRhdGEgTFYgZG9lcyBub3QgcG9pbnQgYmFjayB0byBzYW1lIExWIiwKKwkJCQkJICBsdi0+bmFtZSk7CisJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJfQorCQkJaWYgKGx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShsdikgJiYKKwkJCSAgICAhc3Ryc3RyKGx2LT5uYW1lLCAiX3RtZXRhIikpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzOiB0aGluIHBvb2wgbWV0YWRhdGEgTFYgZG9lcyBub3QgdXNlIF90bWV0YSIsCisJCQkJCSAgbHYtPm5hbWUpOworCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCX0gZWxzZSBpZiAobHZfaXNfY2FjaGVfcG9vbF9tZXRhZGF0YShsdikgJiYKKwkJCQkgICAhc3Ryc3RyKGx2LT5uYW1lLCAiX2NtZXRhIikpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzOiBjYWNoZSBwb29sIG1ldGFkYXRhIExWIGRvZXMgbm90IHVzZSBfY21ldGEiLAorCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9CisJCX0KKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCXNlZ19jb3VudCsrOworCisJCWlmIChzZWdfaXNfcmFpZChzZWcpKQorCQkJIF9jaGVja19yYWlkX3NlZyhzZWcsICZlcnJvcl9jb3VudCk7CisJCQorCQlpZiAoc2VnLT5sZSAhPSBsZSkgeworCQkJbG9nX2Vycm9yKCJMViAlcyBpbnZhbGlkOiBzZWdtZW50ICV1IHNob3VsZCBiZWdpbiBhdCAiCisJCQkJICAiTEUgJSIgUFJJdTMyICIgKGZvdW5kICUiIFBSSXUzMiAiKS4iLAorCQkJCSAgbHYtPm5hbWUsIHNlZ19jb3VudCwgbGUsIHNlZy0+bGUpOworCQkJaW5jX2Vycm9yX2NvdW50OworCQl9CisKKwkJYXJlYV9tdWx0aXBsaWVyID0gc2VndHlwZV9pc19zdHJpcGVkKHNlZy0+c2VndHlwZSkgPworCQkJCQlzZWctPmFyZWFfY291bnQgOiAxOworCisJCWlmIChzZWctPmFyZWFfbGVuICogYXJlYV9tdWx0aXBsaWVyICE9IHNlZy0+bGVuKSB7CisJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IGhhcyBpbmNvbnNpc3RlbnQgIgorCQkJCSAgImFyZWFfbGVuICV1IiwKKwkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHNlZy0+YXJlYV9sZW4pOworCQkJaW5jX2Vycm9yX2NvdW50OworCQl9CisKKwkJaWYgKGx2X2lzX2Vycm9yX3doZW5fZnVsbChsdikgJiYKKwkJICAgICFzZWdfY2FuX2Vycm9yX3doZW5fZnVsbChzZWcpKSB7CisJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1ICglcykgZG9lcyBub3Qgc3VwcG9ydCBmbGFnICIKKwkJCQkgICJFUlJPUl9XSEVOX0ZVTEwuIiwgbHYtPm5hbWUsIHNlZ19jb3VudCwgc2VnLT5zZWd0eXBlLT5uYW1lKTsKKwkJCWluY19lcnJvcl9jb3VudDsKKwkJfQorCisJCWlmIChjb21wbGV0ZV92ZyAmJiBzZWctPmxvZ19sdiAmJgorCQkgICAgIXNlZ19pc19taXJyb3JlZChzZWcpICYmICEoc2VnLT5zdGF0dXMgJiBSQUlEX0lNQUdFKSkgeworCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBsb2cgTFYgJXMgaXMgbm90IGEgIgorCQkJCSAgIm1pcnJvciBsb2cgb3IgYSBSQUlEIGltYWdlIiwKKwkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHNlZy0+bG9nX2x2LT5uYW1lKTsKKwkJCWluY19lcnJvcl9jb3VudDsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIG1pcnJvciBsb2cgLSB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGUgbWlycm9yZWQgc2VnCisJCSAqLworCQlpZiAoY29tcGxldGVfdmcgJiYgc2VnLT5sb2dfbHYgJiYgc2VnX2lzX21pcnJvcmVkKHNlZykpIHsKKwkJCWlmICghbHZfaXNfbWlycm9yX2xvZyhzZWctPmxvZ19sdikpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IGxvZyBMViAlcyBpcyBub3QgIgorCQkJCQkgICJhIG1pcnJvciBsb2ciLAorCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHNlZy0+bG9nX2x2LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9CisKKwkJCWlmICghKHNlZzIgPSBmaXJzdF9zZWcoc2VnLT5sb2dfbHYpKSB8fAorCQkJICAgIGZpbmRfbWlycm9yX3NlZyhzZWcyKSAhPSBzZWcpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IGxvZyBMViBkb2VzIG5vdCAiCisJCQkJCSAgInBvaW50IGJhY2sgdG8gbWlycm9yIHNlZ21lbnQiLAorCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQpOworCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCX0KKwkJfQorCisJCWlmIChjb21wbGV0ZV92ZyAmJiBzZWctPnN0YXR1cyAmIE1JUlJPUl9JTUFHRSkgeworCQkJaWYgKCFmaW5kX21pcnJvcl9zZWcoc2VnKSB8fAorCQkJICAgICFzZWdfaXNfbWlycm9yZWQoZmluZF9taXJyb3Jfc2VnKHNlZykpKSB7CisJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBtaXJyb3IgaW1hZ2UgIgorCQkJCQkgICJpcyBub3QgbWlycm9yZWQiLAorCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQpOworCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHRoZSB2YXJpb3VzIHRoaW4gc2VnbWVudCB0eXBlcyAqLworCQlpZiAoY29tcGxldGVfdmcpIHsKKwkJCWlmIChzZWdfaXNfdGhpbl9wb29sKHNlZykpIHsKKwkJCQlpZiAoIWx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlcyBpcyBtaXNzaW5nIHRoaW4gcG9vbCBmbGFnIGZvciBzZWdtZW50ICV1IiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZ19jb3VudCk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisKKwkJCQlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgaXMgYSB0aGluIHZvbHVtZSB0aGF0IG11c3Qgbm90IGNvbnRhaW4gdGhpbiBwb29sIHNlZ21lbnQgJXUiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKworCQkJfQorCQkJaWYgKHNlZ19pc19jYWNoZV9wb29sKHNlZykgJiYKKwkJCSAgICAhZG1fbGlzdF9lbXB0eSgmc2VnLT5sdi0+c2Vnc191c2luZ190aGlzX2x2KSkgeworCQkJCXN3aXRjaCAoc2VnLT5jYWNoZV9tb2RlKSB7CisJCQkJY2FzZSBDQUNIRV9NT0RFX1dSSVRFVEhST1VHSDoKKwkJCQljYXNlIENBQ0hFX01PREVfV1JJVEVCQUNLOgorCQkJCWNhc2UgQ0FDSEVfTU9ERV9QQVNTVEhST1VHSDoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJbG9nX2Vycm9yKCJMViAlcyBoYXMgaW52YWxpZCBjYWNoZSdzIGZlYXR1cmUgZmxhZy4iLAorCQkJCQkJICBsdi0+bmFtZSk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisJCQkJaWYgKCFzZWctPnBvbGljeV9uYW1lKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgaXMgbWlzc2luZyBjYWNoZSBwb2xpY3kgbmFtZS4iLCBsdi0+bmFtZSk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2VnX2lzX3Bvb2woc2VnKSkgeworCQkJCWlmIChzZWctPmFyZWFfY291bnQgIT0gMSB8fAorCQkJCSAgICBzZWdfdHlwZShzZWcsIDApICE9IEFSRUFfTFYpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogJXMgc2VnbWVudCAldSBpcyBtaXNzaW5nIGEgcG9vbCBkYXRhIExWIiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZy0+c2VndHlwZS0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0gZWxzZSBpZiAoIShzZWcyID0gZmlyc3Rfc2VnKHNlZ19sdihzZWcsIDApKSkgfHwgZmluZF9wb29sX3NlZyhzZWcyKSAhPSBzZWcpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogJXMgc2VnbWVudCAldSBkYXRhIExWIGRvZXMgbm90IHJlZmVyIGJhY2sgdG8gcG9vbCBMViIsCisJCQkJCQkgIGx2LT5uYW1lLCBzZWctPnNlZ3R5cGUtPm5hbWUsIHNlZ19jb3VudCk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisKKwkJCQlpZiAoIXNlZy0+bWV0YWRhdGFfbHYpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogJXMgc2VnbWVudCAldSBpcyBtaXNzaW5nIGEgcG9vbCBtZXRhZGF0YSBMViIsCisJCQkJCQkgIGx2LT5uYW1lLCBzZWctPnNlZ3R5cGUtPm5hbWUsIHNlZ19jb3VudCk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9IGVsc2UgaWYgKCEoc2VnMiA9IGZpcnN0X3NlZyhzZWctPm1ldGFkYXRhX2x2KSkgfHwKKwkJCQkJICAgZmluZF9wb29sX3NlZyhzZWcyKSAhPSBzZWcpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogJXMgc2VnbWVudCAldSBtZXRhZGF0YSBMViBkb2VzIG5vdCByZWZlciBiYWNrIHRvIHBvb2wgTFYiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnLT5zZWd0eXBlLT5uYW1lLCBzZWdfY291bnQpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfQorCisJCQkJaWYgKCF2YWxpZGF0ZV9wb29sX2NodW5rX3NpemUobHYtPnZnLT5jbWQsIHNlZy0+c2VndHlwZSwgc2VnLT5jaHVua19zaXplKSkgeworCQkJCQlsb2dfZXJyb3IoIkxWICVzOiAlcyBzZWdtZW50ICV1IGhhcyBpbnZhbGlkIGNodW5rIHNpemUgJXUuIiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZy0+c2VndHlwZS0+bmFtZSwgc2VnX2NvdW50LCBzZWctPmNodW5rX3NpemUpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2VnLT5tZXRhZGF0YV9sdikgeworCQkJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IG11c3Qgbm90IGhhdmUgcG9vbCBtZXRhZGF0YSBMViBzZXQiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKwkJCX0KKworCQkJaWYgKHNlZ19pc190aGluX3ZvbHVtZShzZWcpKSB7CisJCQkJaWYgKCFsdl9pc190aGluX3ZvbHVtZShsdikpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlcyBpcyBtaXNzaW5nIHRoaW4gdm9sdW1lIGZsYWcgZm9yIHNlZ21lbnQgJXUiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKworCQkJCWlmIChsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgaXMgYSB0aGluIHBvb2wgdGhhdCBtdXN0IG5vdCBjb250YWluIHRoaW4gdm9sdW1lIHNlZ21lbnQgJXUiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKworCQkJCWlmICghc2VnLT5wb29sX2x2KSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXM6IHNlZ21lbnQgJXUgaXMgbWlzc2luZyB0aGluIHBvb2wgTFYiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0gZWxzZSBpZiAoIWx2X2lzX3RoaW5fcG9vbChzZWctPnBvb2xfbHYpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXM6IHRoaW4gdm9sdW1lIHNlZ21lbnQgJXUgcG9vbCBMViBpcyBub3QgZmxhZ2dlZCBhcyBhIHBvb2wgTFYiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKworCQkJCWlmIChzZWctPmRldmljZV9pZCA+IERNX1RISU5fTUFYX0RFVklDRV9JRCkgeworCQkJCQlsb2dfZXJyb3IoIkxWICVzOiB0aGluIHZvbHVtZSBzZWdtZW50ICV1IGhhcyB0b28gbGFyZ2UgZGV2aWNlIGlkICV1IiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZ19jb3VudCwgc2VnLT5kZXZpY2VfaWQpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfQorCQkJCWlmIChzZWctPmV4dGVybmFsX2x2ICYmIChzZWctPmV4dGVybmFsX2x2LT5zdGF0dXMgJiBMVk1fV1JJVEUpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXM6IGV4dGVybmFsIG9yaWdpbiAlcyBpcyB3cml0YWJsZS4iLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnLT5leHRlcm5hbF9sdi0+bmFtZSk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisKKwkJCQlpZiAoc2VnLT5tZXJnZV9sdikgeworCQkJCQlpZiAoIWx2X2lzX3RoaW5fdm9sdW1lKHNlZy0+bWVyZ2VfbHYpKSB7CisJCQkJCQlsb2dfZXJyb3IoIkxWICVzOiB0aGluIHZvbHVtZSBzZWdtZW50ICV1IG1lcmdpbmcgTFYgJXMgaXMgbm90IGZsYWdnZWQgYXMgYSB0aGluIExWIiwKKwkJCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHNlZy0+bWVyZ2VfbHYtPm5hbWUpOworCQkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCQl9CisJCQkJCWlmICghbHZfaXNfbWVyZ2luZ19vcmlnaW4oc2VnLT5tZXJnZV9sdikpIHsKKwkJCQkJCWxvZ19lcnJvcigiTFYgJXM6IG1lcmdpbmcgTFYgJXMgaXMgbm90IGZsYWdnZWQgYXMgbWVyZ2luZy4iLAorCQkJCQkJCSAgbHYtPm5hbWUsIHNlZy0+bWVyZ2VfbHYtPm5hbWUpOworCQkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChzZWdfaXNfY2FjaGUoc2VnKSkgeworCQkJCWlmICghbHZfaXNfY2FjaGUobHYpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgaXMgbWlzc2luZyBjYWNoZSBmbGFnIGZvciBzZWdtZW50ICV1IiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZ19jb3VudCk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisJCQkJaWYgKCFzZWctPnBvb2xfbHYpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBpcyBtaXNzaW5nIGNhY2hlX3Bvb2wgTFYiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNlZy0+cG9vbF9sdikgeworCQkJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IG11c3Qgbm90IGhhdmUgcG9vbCBMViBzZXQiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChzZWdfaXNfc25hcHNob3Qoc2VnKSkgeworCQkJaWYgKHNlZy0+Y293ICYmIHNlZy0+Y293ID09IHNlZy0+b3JpZ2luKSB7CisJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBoYXMgc2FtZSBMViAlcyBmb3IgIgorCQkJCQkgICJib3RoIG9yaWdpbiBhbmQgc25hcHNob3QiLAorCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHNlZy0+Y293LT5uYW1lKTsKKwkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQl9CisJCX0KKworCQlpZiAoc2VnX2lzX3JlcGxpY2F0b3Ioc2VnKSAmJiAhY2hlY2tfcmVwbGljYXRvcl9zZWdtZW50KHNlZykpCisJCQlpbmNfZXJyb3JfY291bnQ7CisKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSA9PSBBUkVBX1VOQVNTSUdORUQpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzOiBzZWdtZW50ICV1IGhhcyB1bmFzc2lnbmVkICIKKwkJCQkJICAiYXJlYSAldS4iLAorCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHMpOworCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCX0gZWxzZSBpZiAoc2VnX3R5cGUoc2VnLCBzKSA9PSBBUkVBX1BWKSB7CisJCQkJaWYgKCFzZWdfcHZzZWcoc2VnLCBzKSB8fAorCQkJCSAgICBzZWdfcHZzZWcoc2VnLCBzKS0+bHZzZWcgIT0gc2VnIHx8CisJCQkJICAgIHNlZ19wdnNlZyhzZWcsIHMpLT5sdl9hcmVhICE9IHMpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBoYXMgIgorCQkJCQkJICAiaW5jb25zaXN0ZW50IFBWIGFyZWEgJXUiLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50LCBzKTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFzZWdfbHYoc2VnLCBzKSB8fAorCQkJCSAgICBzZWdfbHYoc2VnLCBzKS0+dmcgIT0gbHYtPnZnIHx8CisJCQkJICAgIHNlZ19sdihzZWcsIHMpID09IGx2KSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXM6IHNlZ21lbnQgJXUgaGFzICIKKwkJCQkJCSAgImluY29uc2lzdGVudCBMViBhcmVhICV1IiwKKwkJCQkJCSAgbHYtPm5hbWUsIHNlZ19jb3VudCwgcyk7CisJCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCQl9CisKKwkJCQlpZiAoY29tcGxldGVfdmcgJiYgc2VnX2x2KHNlZywgcykgJiYKKwkJCQkgICAgbHZfaXNfbWlycm9yX2ltYWdlKHNlZ19sdihzZWcsIHMpKSAmJgorCQkJCSAgICAoIShzZWcyID0gZmluZF9zZWdfYnlfbGUoc2VnX2x2KHNlZywgcyksCisJCQkJCQkJICAgIHNlZ19sZShzZWcsIHMpKSkgfHwKKwkJCQkgICAgIGZpbmRfbWlycm9yX3NlZyhzZWcyKSAhPSBzZWcpKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXM6IHNlZ21lbnQgJXUgbWlycm9yICIKKwkJCQkJCSAgImltYWdlICV1IG1pc3NpbmcgbWlycm9yIHB0ciIsCisJCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHMpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfQorCisvKiBGSVhNRSBJIGRvbid0IHRoaW5rIHRoaXMgZXZlciBob2xkcz8KKwkJCQlpZiAoc2VnX2xlKHNlZywgcykgIT0gbGUpIHsKKwkJCQkJbG9nX2Vycm9yKCJMViAlczogc2VnbWVudCAldSBoYXMgIgorCQkJCQkJICAiaW5jb25zaXN0ZW50IExWIGFyZWEgJXUgIgorCQkJCQkJICAic2l6ZSIsCisJCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsIHMpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfQorICovCisJCQkJc2VnX2ZvdW5kID0gMDsKKwkJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZzZWdfbHYoc2VnLCBzKS0+c2Vnc191c2luZ190aGlzX2x2KQorCQkJCQlpZiAoc2wtPnNlZyA9PSBzZWcpCisJCQkJCQlzZWdfZm91bmQrKzsKKworCQkJCWlmICghc2VnX2ZvdW5kKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgc2VnbWVudCAldSB1c2VzIExWICVzLCIKKwkJCQkJCSAgIiBidXQgbWlzc2luZyBwdHIgZnJvbSAlcyB0byAlcyIsCisJCQkJCQkgIGx2LT5uYW1lLCBzZWdfY291bnQsCisJCQkJCQkgIHNlZ19sdihzZWcsIHMpLT5uYW1lLAorCQkJCQkJICBzZWdfbHYoc2VnLCBzKS0+bmFtZSwgbHYtPm5hbWUpOworCQkJCQlpbmNfZXJyb3JfY291bnQ7CisJCQkJfSBlbHNlIGlmIChzZWdfZm91bmQgPiAxKSB7CisJCQkJCWxvZ19lcnJvcigiTFYgJXMgaGFzIGR1cGxpY2F0ZWQgbGlua3MgIgorCQkJCQkJICAidG8gTFYgJXMgc2VnbWVudCAldSIsCisJCQkJCQkgIHNlZ19sdihzZWcsIHMpLT5uYW1lLAorCQkJCQkJICBsdi0+bmFtZSwgc2VnX2NvdW50KTsKKwkJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNvbXBsZXRlX3ZnICYmCisJCQkgICAgc2VnX2lzX21pcnJvcmVkKHNlZykgJiYgIXNlZ19pc19yYWlkKHNlZykgJiYKKwkJCSAgICBzZWdfdHlwZShzZWcsIHMpID09IEFSRUFfTFYgJiYKKwkJCSAgICBzZWdfbHYoc2VnLCBzKS0+bGVfY291bnQgIT0gc2VnLT5hcmVhX2xlbikgeworCQkJCWxvZ19lcnJvcigiTFYgJXM6IG1pcnJvcmVkIExWIHNlZ21lbnQgJXUgaGFzICIKKwkJCQkJICAid3Jvbmcgc2l6ZSAldSAoc2hvdWxkIGJlICV1KS4iLAorCQkJCQkgIGx2LT5uYW1lLCBzLCBzZWdfbHYoc2VnLCBzKS0+bGVfY291bnQsCisJCQkJCSAgc2VnLT5hcmVhX2xlbik7CisJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJfQorCQl9CisKKwkJbGUgKz0gc2VnLT5sZW47CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmbHYtPnNlZ3NfdXNpbmdfdGhpc19sdikgeworCQlzZWcgPSBzbC0+c2VnOworCQlzZWdfZm91bmQgPSAwOworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpCisJCQkJY29udGludWU7CisJCQlpZiAobHYgPT0gc2VnX2x2KHNlZywgcykpCisJCQkJc2VnX2ZvdW5kKys7CisJCQlpZiAoc2VnX2lzX3JhaWRfd2l0aF9tZXRhKHNlZykgJiYgKGx2ID09IHNlZ19tZXRhbHYoc2VnLCBzKSkpCisJCQkJc2VnX2ZvdW5kKys7CisJCX0KKwkJaWYgKHNlZ19pc19yZXBsaWNhdG9yX2RldihzZWcpKSB7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocnNpdGUsICZzZWctPnJlcGxpY2F0b3ItPnJzaXRlcykgeworCQkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKSB7CisJCQkJCWlmIChsdiA9PSByZGV2LT5sdiB8fCBsdiA9PSByZGV2LT5zbG9nKQorCQkJCQkJc2VnX2ZvdW5kKys7CisJCQkJfQorCQkJfQorCQkJaWYgKGx2ID09IHNlZy0+cmVwbGljYXRvcikKKwkJCQlzZWdfZm91bmQrKzsKKwkJfQorCQlpZiAoc2VnX2lzX3JlcGxpY2F0b3Ioc2VnKSAmJiBsdiA9PSBzZWctPnJsb2dfbHYpCisJCQlzZWdfZm91bmQrKzsKKwkJaWYgKHNlZy0+bG9nX2x2ID09IGx2KQorCQkJc2VnX2ZvdW5kKys7CisJCWlmIChzZWctPm1ldGFkYXRhX2x2ID09IGx2IHx8IHNlZy0+cG9vbF9sdiA9PSBsdikKKwkJCXNlZ19mb3VuZCsrOworCQlpZiAoc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykgJiYgKHNlZy0+b3JpZ2luID09IGx2IHx8IHNlZy0+ZXh0ZXJuYWxfbHYgPT0gbHYpKQorCQkJc2VnX2ZvdW5kKys7CisKKwkJaWYgKCFzZWdfZm91bmQpIHsKKwkJCWxvZ19lcnJvcigiTFYgJXMgaXMgdXNlZCBieSBMViAlczolIiBQUkl1MzIgIi0lIiBQUkl1MzIKKwkJCQkgICIsIGJ1dCBtaXNzaW5nIHB0ciBmcm9tICVzIHRvICVzIiwKKwkJCQkgIGx2LT5uYW1lLCBzZWctPmx2LT5uYW1lLCBzZWctPmxlLAorCQkJCSAgc2VnLT5sZSArIHNlZy0+bGVuIC0gMSwKKwkJCQkgIHNlZy0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJCWluY19lcnJvcl9jb3VudDsKKwkJfSBlbHNlIGlmIChzZWdfZm91bmQgIT0gc2wtPmNvdW50KSB7CisJCQlsb2dfZXJyb3IoIlJlZmVyZW5jZSBjb3VudCBtaXNtYXRjaDogTFYgJXMgaGFzICV1ICIKKwkJCQkgICJsaW5rcyB0byBMViAlczolIiBQUkl1MzIgIi0lIiBQUkl1MzIKKwkJCQkgICIsIHdoaWNoIGhhcyAldSBsaW5rcyIsCisJCQkJICBsdi0+bmFtZSwgc2wtPmNvdW50LCBzZWctPmx2LT5uYW1lLCBzZWctPmxlLAorCQkJCSAgc2VnLT5sZSArIHNlZy0+bGVuIC0gMSwgc2VnX2ZvdW5kKTsKKwkJCWluY19lcnJvcl9jb3VudDsKKwkJfQorCisJCXNlZ19mb3VuZCA9IDA7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcyLCAmc2VnLT5sdi0+c2VnbWVudHMpCisJCQlpZiAoc2VnID09IHNlZzIpIHsKKwkJCQlzZWdfZm91bmQrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAoIXNlZ19mb3VuZCkgeworCQkJbG9nX2Vycm9yKCJMViBzZWdtZW50ICVzOiUiIFBSSXUzMiAiLSUiIFBSSXUzMgorCQkJCSAgIiBpcyBpbmNvcnJlY3RseSBsaXN0ZWQgYXMgYmVpbmcgdXNlZCBieSBMViAlcyIsCisJCQkJICBzZWctPmx2LT5uYW1lLCBzZWctPmxlLCBzZWctPmxlICsgc2VnLT5sZW4gLSAxLAorCQkJCSAgbHYtPm5hbWUpOworCQkJaW5jX2Vycm9yX2NvdW50OworCQl9CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdsdmwsICZsdi0+aW5kaXJlY3RfZ2x2cykgeworCQlpZiAoZ2x2bC0+Z2x2LT5pc19oaXN0b3JpY2FsKSB7CisJCQlpZiAoZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT5pbmRpcmVjdF9vcmlnaW4gIT0gbHYtPnRoaXNfZ2x2KSB7CisJCQkJbG9nX2Vycm9yKCJMViAlcyBpcyBpbmRpcmVjdGx5IHVzZWQgYnkgaGlzdG9yaWNhbCBMViAlcyIKKwkJCQkJICAiYnV0IHRoYXQgaGlzdG9yaWNhbCBMViBkb2VzIG5vdCBwb2ludCBiYWNrIHRvIExWICVzIiwKKwkJCQkJICAgbHYtPm5hbWUsIGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSwgbHYtPm5hbWUpOworCQkJCWluY19lcnJvcl9jb3VudDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKHNlZyA9IGZpcnN0X3NlZyhnbHZsLT5nbHYtPmxpdmUpKSB8fAorCQkJICAgIHNlZy0+aW5kaXJlY3Rfb3JpZ2luICE9IGx2LT50aGlzX2dsdikgeworCQkJCWxvZ19lcnJvcigiTFYgJXMgaXMgaW5kaXJlY3RseSB1c2VkIGJ5IExWICVzIgorCQkJCQkgICJidXQgdGhhdCBMViBkb2VzIG5vdCBwb2ludCBiYWNrIHRvIExWICVzIiwKKwkJCQkJICBsdi0+bmFtZSwgZ2x2bC0+Z2x2LT5saXZlLT5uYW1lLCBsdi0+bmFtZSk7CisJCQkJaW5jX2Vycm9yX2NvdW50OworCQkJfQorCQl9CisJfQorCisJaWYgKGxlICE9IGx2LT5sZV9jb3VudCkgeworCQlsb2dfZXJyb3IoIkxWICVzOiBpbmNvbnNpc3RlbnQgTEUgY291bnQgJXUgIT0gJXUiLAorCQkJICBsdi0+bmFtZSwgbGUsIGx2LT5sZV9jb3VudCk7CisJCWluY19lcnJvcl9jb3VudDsKKwl9CisKK291dDoKKwlyZXR1cm4gIWVycm9yX2NvdW50OworfQorCisvKgorICogU3BsaXQgdGhlIHN1cHBsaWVkIHNlZ21lbnQgYXQgdGhlIHN1cHBsaWVkIGxvZ2ljYWwgZXh0ZW50CisgKiBOQiBVc2UgTEUgbnVtYmVyaW5nIHRoYXQgd29ya3MgYWNyb3NzIHN0cmlwZXMgUFYxOiAwLDIsNCBQVjI6IDEsMyw1IGV0Yy4KKyAqLworc3RhdGljIGludCBfbHZfc3BsaXRfc2VnbWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJICAgICB1aW50MzJfdCBsZSkKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc3BsaXRfc2VnOworCXVpbnQzMl90IHM7CisJdWludDMyX3Qgb2Zmc2V0ID0gbGUgLSBzZWctPmxlOworCXVpbnQzMl90IGFyZWFfb2Zmc2V0OworCisJaWYgKCFzZWdfY2FuX3NwbGl0KHNlZykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgdGhlICVzIHNlZ21lbnQgYXQgTEUgJSIgUFJJdTMyCisJCQkgICIgaW4gTFYgJXMiLCBsdnNlZ19uYW1lKHNlZyksIGxlLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIENsb25lIHRoZSBleGlzdGluZyBzZWdtZW50ICovCisJaWYgKCEoc3BsaXRfc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWctPnNlZ3R5cGUsCisJCQkJCSAgIHNlZy0+bHYsIHNlZy0+bGUsIHNlZy0+bGVuLAorCQkJCQkgICBzZWctPnN0YXR1cywgc2VnLT5zdHJpcGVfc2l6ZSwKKwkJCQkJICAgc2VnLT5sb2dfbHYsCisJCQkJCSAgIHNlZy0+YXJlYV9jb3VudCwgc2VnLT5hcmVhX2xlbiwKKwkJCQkJICAgc2VnLT5jaHVua19zaXplLCBzZWctPnJlZ2lvbl9zaXplLAorCQkJCQkgICBzZWctPmV4dGVudHNfY29waWVkLCBzZWctPnB2bW92ZV9zb3VyY2Vfc2VnKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBjbG9uZWQgTFYgc2VnbWVudC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJfbGlzdF9kdXAobHYtPnZnLT52Z21lbSwgJnNwbGl0X3NlZy0+dGFncywgJnNlZy0+dGFncykpIHsKKwkJbG9nX2Vycm9yKCJMViBzZWdtZW50IHRhZ3MgZHVwbGljYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluIGNhc2Ugb2YgYSBzdHJpcGVkIHNlZ21lbnQsIHRoZSBvZmZzZXQgaGFzIHRvIGJlIC8gc3RyaXBlcyAqLworCWFyZWFfb2Zmc2V0ID0gb2Zmc2V0OworCWlmIChzZWdfaXNfc3RyaXBlZChzZWcpKQorCQlhcmVhX29mZnNldCAvPSBzZWctPmFyZWFfY291bnQ7CisKKwlzcGxpdF9zZWctPmFyZWFfbGVuIC09IGFyZWFfb2Zmc2V0OworCXNlZy0+YXJlYV9sZW4gPSBhcmVhX29mZnNldDsKKworCXNwbGl0X3NlZy0+bGVuIC09IG9mZnNldDsKKwlzZWctPmxlbiA9IG9mZnNldDsKKworCXNwbGl0X3NlZy0+bGUgPSBzZWctPmxlICsgc2VnLT5sZW47CisKKwkvKiBBZGp1c3QgdGhlIFBWIG1hcHBpbmcgKi8KKwlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJc2VnX3R5cGUoc3BsaXRfc2VnLCBzKSA9IHNlZ190eXBlKHNlZywgcyk7CisKKwkJLyogU3BsaXQgYXJlYSBhdCB0aGUgb2Zmc2V0ICovCisJCXN3aXRjaCAoc2VnX3R5cGUoc2VnLCBzKSkgeworCQljYXNlIEFSRUFfTFY6CisJCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYoc3BsaXRfc2VnLCBzLCBzZWdfbHYoc2VnLCBzKSwKKwkJCQkJCSAgICBzZWdfbGUoc2VnLCBzKSArIHNlZy0+YXJlYV9sZW4sIDApKQorCQkJCXJldHVybl8wOworCQkJbG9nX2RlYnVnX2FsbG9jKCJTcGxpdCAlczoldVsldV0gYXQgJXU6ICVzIExFICV1IiwgbHYtPm5hbWUsCisJCQkJCXNlZy0+bGUsIHMsIGxlLCBzZWdfbHYoc2VnLCBzKS0+bmFtZSwKKwkJCQkJc2VnX2xlKHNwbGl0X3NlZywgcykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUkVBX1BWOgorCQkJaWYgKCEoc2VnX3B2c2VnKHNwbGl0X3NlZywgcykgPQorCQkJICAgICBhc3NpZ25fcGVnX3RvX2x2c2VnKHNlZ19wdihzZWcsIHMpLAorCQkJCQkJIHNlZ19wZShzZWcsIHMpICsKKwkJCQkJCSAgICAgc2VnLT5hcmVhX2xlbiwKKwkJCQkJCSBzZWdfcHZzZWcoc2VnLCBzKS0+bGVuIC0KKwkJCQkJCSAgICAgc2VnLT5hcmVhX2xlbiwKKwkJCQkJCSBzcGxpdF9zZWcsIHMpKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWxvZ19kZWJ1Z19hbGxvYygiU3BsaXQgJXM6JXVbJXVdIGF0ICV1OiAlcyBQRSAldSIsIGx2LT5uYW1lLAorCQkJCQlzZWctPmxlLCBzLCBsZSwKKwkJCQkJZGV2X25hbWUoc2VnX2RldihzZWcsIHMpKSwKKwkJCQkJc2VnX3BlKHNwbGl0X3NlZywgcykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUkVBX1VOQVNTSUdORUQ6CisJCQlsb2dfZXJyb3IoIlVuYXNzaWduZWQgYXJlYSAldSBmb3VuZCBpbiBzZWdtZW50Iiwgcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEFkZCBzcGxpdCBvZmYgc2VnbWVudCB0byB0aGUgbGlzdCBfYWZ0ZXJfIHRoZSBvcmlnaW5hbCBvbmUgKi8KKwlkbV9saXN0X2FkZF9oKCZzZWctPmxpc3QsICZzcGxpdF9zZWctPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFbnN1cmUgdGhlcmUncyBhIHNlZ21lbnQgYm91bmRhcnkgYXQgdGhlIGdpdmVuIGxvZ2ljYWwgZXh0ZW50CisgKi8KK2ludCBsdl9zcGxpdF9zZWdtZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlpZiAoIShzZWcgPSBmaW5kX3NlZ19ieV9sZShsdiwgbGUpKSkgeworCQlsb2dfZXJyb3IoIlNlZ21lbnQgd2l0aCBleHRlbnQgJSIgUFJJdTMyICIgaW4gTFYgJXMgbm90IGZvdW5kIiwKKwkJCSAgbGUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhpcyBpcyBhIHNlZ21lbnQgc3RhcnQgYWxyZWFkeSAqLworCWlmIChsZSA9PSBzZWctPmxlKQorCQlyZXR1cm4gMTsKKworCWlmICghX2x2X3NwbGl0X3NlZ21lbnQobHYsIHNlZywgbGUpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmdfdmFsaWRhdGUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9tZXRhZGF0YS9tZXRhZGF0YS1leHBvcnRlZC5oIGIvbGliL21ldGFkYXRhL21ldGFkYXRhLWV4cG9ydGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tZXRhZGF0YS9tZXRhZGF0YS1leHBvcnRlZC5oCkBAIC0wLDAgKzEsMTMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBMVk0gbWV0YWRhdGEgdGhhdCBpcyBiZWluZyBhZGFwdGVkCisgKiBmb3IgbGlicmFyeSBleHBvcnQuCisgKi8KKworI2lmbmRlZiBfTFZNX01FVEFEQVRBX0VYUE9SVEVEX0gKKyNkZWZpbmUgX0xWTV9NRVRBREFUQV9FWFBPUlRFRF9ICisKKyNpbmNsdWRlICJ1dWlkLmgiCisjaW5jbHVkZSAicHYuaCIKKyNpbmNsdWRlICJ2Zy5oIgorI2luY2x1ZGUgImx2LmgiCisjaW5jbHVkZSAibHZtLXBlcmNlbnQuaCIKKworI2RlZmluZSBNQVhfU1RSSVBFUyAxMjhVCisjZGVmaW5lIFNFQ1RPUl9TSElGVCA5TAorI2RlZmluZSBTRUNUT1JfU0laRSAoIDFMIDw8IFNFQ1RPUl9TSElGVCApCisjZGVmaW5lIFNUUklQRV9TSVpFX01JTiAoICh1bnNpZ25lZCkgbHZtX2dldHBhZ2VzaXplKCkgPj4gU0VDVE9SX1NISUZUKQkvKiBQQUdFU0laRSBpbiBzZWN0b3JzICovCisjZGVmaW5lIFNUUklQRV9TSVpFX01BWCAoIDUxMkwgKiAxMDI0TCA+PiBTRUNUT1JfU0hJRlQpCS8qIDUxMiBLQiBpbiBzZWN0b3JzICovCisjZGVmaW5lIFNUUklQRV9TSVpFX0xJTUlUICgoVUlOVF9NQVggPj4gMikgKyAxKQorI2RlZmluZSBNQVhfUkVTVFJJQ1RFRF9MVlMgMjU1CS8qIFVzZWQgYnkgRk1UX1JFU1RSSUNURURfTFZJRFMgKi8KKyNkZWZpbmUgTUFYX0VYVEVOVF9TSVpFICgodWludDMyX3QpIC0xKQorI2RlZmluZSBNSU5fTk9OX1BPV0VSMl9FWFRFTlRfU0laRSAoMTI4VSAqIDJVKQkvKiAxMjhLQiBpbiBzZWN0b3JzICovCisKKyNkZWZpbmUgSElTVE9SSUNBTF9MVl9QUkVGSVggIi0iCisKKy8qIExheWVyIHN1ZmZpeCAqLworI2RlZmluZSBNSVJST1JfU1lOQ19MQVlFUiAiX21pbWFnZXRtcCIKKworLyogUFYgZXh0ZW5zaW9uIGZsYWdzICovCisjZGVmaW5lIFBWX0VYVF9VU0VECQlVSU5UMzJfQygweDAwMDAwMDAxKQorCisvKiBWYXJpb3VzIGZsYWdzICovCisvKiBOb3RlIHRoYXQgdGhlIGJpdHMgbm8gbG9uZ2VyIG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gTFZNMSBkaXNrIGZvcm1hdCAqLworCisjZGVmaW5lIFBBUlRJQUxfVkcJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDAwMSkJLyogVkcgKi8KKyNkZWZpbmUgRVhQT1JURURfVkcJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDAwMikJLyogVkcgUFYgKi8KKyNkZWZpbmUgUkVTSVpFQUJMRV9WRwkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwMDAwMDA0KQkvKiBWRyAqLworCisvKiBNYXkgYW55IGZyZWUgZXh0ZW50cyBvbiB0aGlzIFBWIGJlIHVzZWQgb3IgbXVzdCB0aGV5IGJlIGxlZnQgZnJlZT8gKi8KKyNkZWZpbmUgQUxMT0NBVEFCTEVfUFYJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDAwOCkJLyogUFYgKi8KKyNkZWZpbmUgQVJDSElWRURfVkcJCUFMTE9DQVRBQkxFX1BWCQkvKiBWRywgcmV1c2Ugc2FtZSBiaXQgKi8KKworLy8jZGVmaW5lIFNQSU5ET1dOX0xWCQlVSU5UNjRfQygweDAwMDAwMDAwMDAwMDAwMTApCS8qIExWICovCisvLyNkZWZpbmUgQkFEQkxPQ0tfT04JCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDAyMCkJLyogTFYgKi8KKyNkZWZpbmUgVklTSUJMRV9MVgkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwMDAwMDQwKQkvKiBMViAqLworI2RlZmluZSBGSVhFRF9NSU5PUgkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwMDAwMDgwKQkvKiBMViAqLworCisjZGVmaW5lIExWTV9SRUFECQlVSU5UNjRfQygweDAwMDAwMDAwMDAwMDAxMDApCS8qIExWLCBWRyAqLworI2RlZmluZSBMVk1fV1JJVEUJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDIwMCkJLyogTFYsIFZHICovCisjZGVmaW5lIExWTV9XUklURV9MT0NLRUQJVUlOVDY0X0MoMHgwMDIwMDAwMDAwMDAwMDAwKSAgICAvKiBMViwgVkcgKi8KKworI2RlZmluZSBDTFVTVEVSRUQJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDQwMCkJLyogVkcgKi8KKy8vI2RlZmluZSBTSEFSRUQJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMDgwMCkJLyogVkcgKi8KKworLyogRklYTUUgUmVtb3ZlIHdoZW4gbWV0YWRhdGEgcmVzdHJ1Y3R1cmluZyBpcyBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgU05BUFNIT1QJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAwMTAwMCkJLyogTFYgLSBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBQVk1PVkUJCQlVSU5UNjRfQygweDAwMDAwMDAwMDAwMDIwMDApCS8qIFZHIExWIFNFRyAqLworI2RlZmluZSBMT0NLRUQJCQlVSU5UNjRfQygweDAwMDAwMDAwMDAwMDQwMDApCS8qIExWICovCisjZGVmaW5lIE1JUlJPUkVECQlVSU5UNjRfQygweDAwMDAwMDAwMDAwMDgwMDApCS8qIExWIC0gaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgVklSVFVBTAkJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDAxMDAwMCkJLyogTFYgLSBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBNSVJST1IJCQlVSU5UNjRfQygweDAwMDIwMDAwMDAwMDAwMDApICAgIC8qIExWIC0gSW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgTUlSUk9SX0xPRwkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwMDIwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIE1JUlJPUl9JTUFHRQkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwMDQwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisKKyNkZWZpbmUgTFZfTk9UU1lOQ0VECQlVSU5UNjRfQygweDAwMDAwMDAwMDAwODAwMDApCS8qIExWICovCisjZGVmaW5lIExWX1JFQlVJTEQJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDEwMDAwMCkJLyogTFYgKi8KKy8vI2RlZmluZSBQUkVDT01NSVRURUQJCVVJTlQ2NF9DKDB4MDAwMDAwMDAwMDIwMDAwMCkJLyogVkcgLSBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBDT05WRVJUSU5HCQlVSU5UNjRfQygweDAwMDAwMDAwMDA0MDAwMDApCS8qIExWICovCisKKyNkZWZpbmUgTUlTU0lOR19QVgkJVUlOVDY0X0MoMHgwMDAwMDAwMDAwODAwMDAwKQkvKiBQViAqLworI2RlZmluZSBQQVJUSUFMX0xWCQlVSU5UNjRfQygweDAwMDAwMDAwMDEwMDAwMDApCS8qIExWIC0gZGVyaXZlZCBmbGFnLCBub3QKKwkJCQkJCQkgICB3cml0dGVuIG91dCBpbiBtZXRhZGF0YSovCisKKy8vI2RlZmluZSBQT1NUT1JERVJfRkxBRwlVSU5UNjRfQygweDAwMDAwMDAwMDIwMDAwMDApIC8qIE5vdCByZWFsIGZsYWdzLCByZXNlcnZlZCBmb3IKKy8vI2RlZmluZSBQT1NUT1JERVJfT1BFTl9GTEFHCVVJTlQ2NF9DKDB4MDAwMDAwMDAwNDAwMDAwMCkgICAgdGVtcG9yYXJ5IHVzZSBpbnNpZGUgdmdfcmVhZF9pbnRlcm5hbC4gKi8KKyNkZWZpbmUgVklSVFVBTF9PUklHSU4JCVVJTlQ2NF9DKDB4MDAwMDAwMDAwODAwMDAwMCkJLyogTFYgLSBpbnRlcm5hbCB1c2Ugb25seSAqLworCisjZGVmaW5lIE1FUkdJTkcJCQlVSU5UNjRfQygweDAwMDAwMDAwMTAwMDAwMDApCS8qIExWIFNFRyAqLworCisjZGVmaW5lIFJFUExJQ0FUT1IJCVVJTlQ2NF9DKDB4MDAwMDAwMDAyMDAwMDAwMCkJLyogTFYgLWludGVybmFsIHVzZSBvbmx5IGZvciByZXBsaWNhdG9yICovCisjZGVmaW5lIFJFUExJQ0FUT1JfTE9HCQlVSU5UNjRfQygweDAwMDAwMDAwNDAwMDAwMDApCS8qIExWIC1pbnRlcm5hbCB1c2Ugb25seSBmb3IgcmVwbGljYXRvci1kZXYgKi8KKyNkZWZpbmUgVU5MQUJFTExFRF9QVgkJVUlOVDY0X0MoMHgwMDAwMDAwMDgwMDAwMDAwKQkvKiBQViAtdGhpcyBQViBoYWQgbm8gbGFiZWwgd3JpdHRlbiB5ZXQgKi8KKworI2RlZmluZSBSQUlECQkJVUlOVDY0X0MoMHgwMDAwMDAwMTAwMDAwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIFJBSURfTUVUQQkJVUlOVDY0X0MoMHgwMDAwMDAwMjAwMDAwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIFJBSURfSU1BR0UJCVVJTlQ2NF9DKDB4MDAwMDAwMDQwMDAwMDAwMCkJLyogTFYgLSBJbnRlcm5hbCB1c2Ugb25seSAqLworCisjZGVmaW5lIFRISU5fVk9MVU1FCQlVSU5UNjRfQygweDAwMDAwMDEwMDAwMDAwMDApCS8qIExWIC0gSW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgVEhJTl9QT09MCQlVSU5UNjRfQygweDAwMDAwMDIwMDAwMDAwMDApCS8qIExWIC0gSW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgVEhJTl9QT09MX0RBVEEJCVVJTlQ2NF9DKDB4MDAwMDAwNDAwMDAwMDAwMCkJLyogTFYgLSBJbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBUSElOX1BPT0xfTUVUQURBVEEJVUlOVDY0X0MoMHgwMDAwMDA4MDAwMDAwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIFBPT0xfTUVUQURBVEFfU1BBUkUJVUlOVDY0X0MoMHgwMDAwMDEwMDAwMDAwMDAwKQkvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIExWX1dSSVRFTU9TVExZCQlVSU5UNjRfQygweDAwMDAwMjAwMDAwMDAwMDApCS8qIExWIChSQUlEMSkgKi8KKworI2RlZmluZSBMVl9BQ1RJVkFUSU9OX1NLSVAJVUlOVDY0X0MoMHgwMDAwMDQwMDAwMDAwMDAwKQkvKiBMViAqLworI2RlZmluZSBMVl9OT1NDQU4JCVVJTlQ2NF9DKDB4MDAwMDA4MDAwMDAwMDAwMCkJLyogTFYgLSBpbnRlcm5hbCB1c2Ugb25seSAtIHRoZSBMVgorCQkJCQkJCQkJc2hvdWxkIG5vdCBiZSBzY2FubmVkICovCisjZGVmaW5lIExWX1RFTVBPUkFSWQkJVUlOVDY0X0MoMHgwMDAwMTAwMDAwMDAwMDAwKQkvKiBMViAtIGludGVybmFsIHVzZSBvbmx5IC0gdGhlIExWCisJCQkJCQkJCQlpcyBzdXBwb3NlZCB0byBiZSBjcmVhdGVkIGFuZAorCQkJCQkJCQkJcmVtb3ZlZCBvciByZWFjdGl2YXRlZCB3aXRoCisJCQkJCQkJCQl0aGlzIGZsYWcgZHJvcHBlZCBkdXJpbmcgc2luZ2xlCisJCQkJCQkJCQlMVk0gY29tbWFuZCBleGVjdXRpb24uICovCisKKyNkZWZpbmUgQ0FDSEVfUE9PTAkJVUlOVDY0X0MoMHgwMDAwMjAwMDAwMDAwMDAwKSAgICAvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIENBQ0hFX1BPT0xfREFUQQkJVUlOVDY0X0MoMHgwMDAwNDAwMDAwMDAwMDAwKSAgICAvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIENBQ0hFX1BPT0xfTUVUQURBVEEJVUlOVDY0X0MoMHgwMDAwODAwMDAwMDAwMDAwKSAgICAvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIENBQ0hFCQkJVUlOVDY0X0MoMHgwMDAxMDAwMDAwMDAwMDAwKSAgICAvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisKKyNkZWZpbmUgTFZfUEVORElOR19ERUxFVEUJVUlOVDY0X0MoMHgwMDA0MDAwMDAwMDAwMDAwKSAgICAvKiBMViAtIEludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIExWX1JFTU9WRUQJCVVJTlQ2NF9DKDB4MDA0MDAwMDAwMDAwMDAwMCkJLyogTFYgLSBJbnRlcm5hbCB1c2Ugb25seQorCQkJCQkJCQkgICBUaGlzIGZsYWcgaXMgdXNlZCB0byBtYXJrIGFuIExWIG9uY2UgaXQgaGFzCisJCQkJCQkJCSAgIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBWRy4gSXQgbWlnaHQgc3RpbGwKKwkJCQkJCQkJICAgYmUgcmVmZXJlbmNlZCBvbiBpbnRlcm5hbCBsaXN0cyBvZiBMVnMuCisJCQkJCQkJCSAgIEFueSByZW1haW5pbmcgcmVmZXJlbmNlcyBzaG91bGQgY2hlY2sgZm9yCisJCQkJCQkJCSAgIHRoaXMgZmxhZyBhbmQgaWdub3JlIHRoZSBMViBpcyBzZXQuCisJCQkJCQkJCSAgIEZJWE1FOiBSZW1vdmUgdGhpcyBmbGFnIG9uY2Ugd2UgaGF2ZSBpbmRleGVkCisJCQkJCQkJCQkgIHZnLT5yZW1vdmVkX2x2cyBmb3IgcXVpY2sgbG9va3VwLgorCQkJCQkJCQkqLworI2RlZmluZSBMVl9FUlJPUl9XSEVOX0ZVTEwJVUlOVDY0X0MoMHgwMDA4MDAwMDAwMDAwMDAwKSAgICAvKiBMViAtIGVycm9yIHdoZW4gZnVsbCAqLworI2RlZmluZSBQVl9BTExPQ0FUSU9OX1BST0hJQklURUQJVUlOVDY0X0MoMHgwMDEwMDAwMDAwMDAwMDAwKQkvKiBQViAtIGludGVybmFsIHVzZSBvbmx5IC0gYWxsb2NhdGlvbiBwcm9oaWJpdGVkCisJCQkJCQkJCQllLmcuIHRvIHByb2hpYml0IGFsbG9jYXRpb24gb2YgYSBSQUlEIGltYWdlCisJCQkJCQkJCQlvbiBhIFBWIGFscmVhZHkgaG9saW5nIGFuIGltYWdlIG9mIHRoZSBSQUlEIHNldCAqLworI2RlZmluZSBMT0NLRF9TQU5MT0NLX0xWCVVJTlQ2NF9DKDB4MDA4MDAwMDAwMDAwMDAwMCkJLyogTFYgLSBJbnRlcm5hbCB1c2Ugb25seSAqLworLyogTmV4dCB1bnVzZWQgZmxhZzoJCVVJTlQ2NF9DKDB4MDEwMDAwMDAwMDAwMDAwMCkgICAgKi8KKworLyogRm9ybWF0IGZlYXR1cmVzIGZsYWdzICovCisjZGVmaW5lIEZNVF9TRUdNRU5UUwkJMHgwMDAwMDAwMVUJLyogQXJiaXRyYXJ5IHNlZ21lbnQgcGFyYW1zPyAqLworI2RlZmluZSBGTVRfTURBUwkJMHgwMDAwMDAwMlUJLyogUHJvcGVyIG1ldGFkYXRhIGFyZWFzPyAqLworI2RlZmluZSBGTVRfVEFHUwkJMHgwMDAwMDAwNFUJLyogVGFnZ2luZz8gKi8KKyNkZWZpbmUgRk1UX1VOTElNSVRFRF9WT0xTCTB4MDAwMDAwMDhVCS8qIFVubGltaXRlZCBQVnMvTFZzPyAqLworI2RlZmluZSBGTVRfUkVTVFJJQ1RFRF9MVklEUwkweDAwMDAwMDEwVQkvKiBMVklEIDw9IDI1NSAqLworI2RlZmluZSBGTVRfT1JQSEFOX0FMTE9DQVRBQkxFCTB4MDAwMDAwMjBVCS8qIE9ycGhhbiBQViBhbGxvY2F0YWJsZT8gKi8KKy8vI2RlZmluZSBGTVRfUFJFQ09NTUlUCQkweDAwMDAwMDQwVQkvKiBTdXBwb3J0cyBwcmUtY29tbWl0PyAqLworI2RlZmluZSBGTVRfUkVTSVpFX1BWCQkweDAwMDAwMDgwVQkvKiBTdXBwb3J0cyBwdnJlc2l6ZT8gKi8KKyNkZWZpbmUgRk1UX1VOTElNSVRFRF9TVFJJUEVTSVpFIDB4MDAwMDAxMDBVCS8qIFVubGltaXRlZCBzdHJpcGUgc2l6ZT8gKi8KKyNkZWZpbmUgRk1UX1JFU1RSSUNURURfUkVBREFIRUFEIDB4MDAwMDAyMDBVCS8qIFJlYWRhaGVhZCByZXN0cmljdGVkIHRvIDItMTIwPyAqLworI2RlZmluZSBGTVRfQkFTCQkJMHgwMDAwMDA0MDBVCS8qIFN1cHBvcnRzIGJvb3Rsb2FkZXIgYXJlYXM/ICovCisjZGVmaW5lIEZNVF9DT05GSUdfUFJPRklMRQkweDAwMDAwMDgwMFUJLyogU3VwcG9ydHMgY29uZmlndXJhdGlvbiBwcm9maWxlcz8gKi8KKyNkZWZpbmUgRk1UX09CU09MRVRFCQkweDAwMDAwMTAwMFUJLyogT2Jzb2xldGUgZm9ybWF0PyAqLworI2RlZmluZSBGTVRfTk9OX1BPV0VSMl9FWFRFTlRTCTB4MDAwMDAyMDAwVQkvKiBOb24tcG93ZXItb2YtMiBleHRlbnQgc2l6ZXM/ICovCisjZGVmaW5lIEZNVF9TWVNURU1JRF9PTl9QVlMJMHgwMDAwMDQwMDBVCS8qIFN5c3RlbSBJRCBpcyBzdG9yZWQgb24gUFZzIG5vdCBWRyAqLworI2RlZmluZSBGTVRfUFZfRkxBR1MJCTB4MDAwMDA4MDAwVQkvKiBTdXBwb3J0cyBQViBmbGFncyAqLworCisjZGVmaW5lIHN5c3RlbWlkX29uX3B2cyh2ZykJKCh2ZyktPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9TWVNURU1JRF9PTl9QVlMpCisKKy8qIE1pcnJvciBjb252ZXJzaW9uIHR5cGUgZmxhZ3MgKi8KKyNkZWZpbmUgTUlSUk9SX0JZX1NFRwkJMHgwMDAwMDAwMVUJLyogc2VnbWVudC1ieS1zZWdtZW50IG1pcnJvciAqLworI2RlZmluZSBNSVJST1JfQllfTFYJCTB4MDAwMDAwMDJVCS8qIG1pcnJvciB1c2luZyB3aG9sZSBtaW1hZ2UgTFZzICovCisjZGVmaW5lIE1JUlJPUl9CWV9TRUdNRU5URURfTFYJMHgwMDAwMDAwNFUJLyogbWlycm9yIHVzaW5nIHdob2xlIG1pbWFnZSBMVnMgdGhhdAorCQkJCQkJICogcHJlc2VydmUgdGhlIHNlZ21lbnQgc3RydWN0dXJlICovCisjZGVmaW5lIE1JUlJPUl9TS0lQX0lOSVRfU1lOQwkweDAwMDAwMDEwVQkvKiBza2lwIGluaXRpYWwgc3luYyAqLworCisvKiB2Z19yZWFkIGFuZCB2Z19yZWFkX2Zvcl91cGRhdGUgZmxhZ3MgKi8KKyNkZWZpbmUgUkVBRF9BTExPV19JTkNPTlNJU1RFTlQJMHgwMDAxMDAwMFUKKyNkZWZpbmUgUkVBRF9BTExPV19FWFBPUlRFRAkweDAwMDIwMDAwVQorI2RlZmluZSBSRUFEX09LX05PVEZPVU5ECTB4MDAwNDAwMDBVCisjZGVmaW5lIFJFQURfV0FSTl9JTkNPTlNJU1RFTlQJMHgwMDA4MDAwMFUKKyNkZWZpbmUgUkVBRF9GT1JfVVBEQVRFCQkweDAwMTAwMDAwVSAvKiBBIG1ldGEtZmxhZywgdXNlZnVsIHdpdGggdG9vbGxpYiBmb3JfZWFjaF8qIGZ1bmN0aW9ucy4gKi8KKworLyogdmcncyAicmVhZF9zdGF0dXMiIGZpZWxkICovCisjZGVmaW5lIEZBSUxFRF9JTkNPTlNJU1RFTlQJMHgwMDAwMDAwMVUKKyNkZWZpbmUgRkFJTEVEX0xPQ0tJTkcJCTB4MDAwMDAwMDJVCisjZGVmaW5lIEZBSUxFRF9OT1RGT1VORAkJMHgwMDAwMDAwNFUKKyNkZWZpbmUgRkFJTEVEX1JFQURfT05MWQkweDAwMDAwMDA4VQorI2RlZmluZSBGQUlMRURfRVhQT1JURUQJCTB4MDAwMDAwMTBVCisjZGVmaW5lIEZBSUxFRF9SRVNJWkVBQkxFCTB4MDAwMDAwMjBVCisjZGVmaW5lIEZBSUxFRF9DTFVTVEVSRUQJMHgwMDAwMDA0MFUKKyNkZWZpbmUgRkFJTEVEX0FMTE9DQVRJT04JMHgwMDAwMDA4MFUKKyNkZWZpbmUgRkFJTEVEX0VYSVNUCQkweDAwMDAwMTAwVQorI2RlZmluZSBGQUlMRURfUkVDT1ZFUlkJCTB4MDAwMDAyMDBVCisjZGVmaW5lIEZBSUxFRF9TWVNURU1JRAkJMHgwMDAwMDQwMFUKKyNkZWZpbmUgRkFJTEVEX0xPQ0tfVFlQRQkweDAwMDAwODAwVQorI2RlZmluZSBGQUlMRURfTE9DS19NT0RFCTB4MDAwMDEwMDBVCisjZGVmaW5lIFNVQ0NFU1MJCQkweDAwMDAwMDAwVQorCisjZGVmaW5lIFZHTUVUQURBVEFDT1BJRVNfQUxMIFVJTlQzMl9NQVgKKyNkZWZpbmUgVkdNRVRBREFUQUNPUElFU19VTk1BTkFHRUQgMAorCisjZGVmaW5lIHZnX2lzX2FyY2hpdmVkKHZnKQkoKCh2ZyktPnN0YXR1cyAmIEFSQ0hJVkVEX1ZHKSA/IDEgOiAwKQorCisjZGVmaW5lIGx2X2lzX2xvY2tlZChsdikJKCgobHYpLT5zdGF0dXMgJiBMT0NLRUQpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3BhcnRpYWwobHYpCSgoKGx2KS0+c3RhdHVzICYgUEFSVElBTF9MVikgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfdmlydHVhbChsdikJKCgobHYpLT5zdGF0dXMgJiBWSVJUVUFMKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19tZXJnaW5nKGx2KQkoKChsdiktPnN0YXR1cyAmIE1FUkdJTkcpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX21lcmdpbmdfb3JpZ2luKGx2KSAobHZfaXNfbWVyZ2luZyhsdikpCisjZGVmaW5lIGx2X2lzX3NuYXBzaG90KGx2KQkoKChsdiktPnN0YXR1cyAmIFNOQVBTSE9UKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19jb252ZXJ0aW5nKGx2KQkoKChsdiktPnN0YXR1cyAmIENPTlZFUlRJTkcpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX2V4dGVybmFsX29yaWdpbihsdikJKCgobHYpLT5leHRlcm5hbF9jb3VudCA+IDApID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3ZpcnR1YWxfb3JpZ2luKGx2KSAoKChsdiktPnN0YXR1cyAmIFZJUlRVQUxfT1JJR0lOKSA/IDEgOiAwKQorCisjZGVmaW5lIGx2X2lzX3RoaW5fdm9sdW1lKGx2KQkoKChsdiktPnN0YXR1cyAmIFRISU5fVk9MVU1FKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc190aGluX3Bvb2wobHYpCSgoKGx2KS0+c3RhdHVzICYgVEhJTl9QT09MKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19uZXdfdGhpbl9wb29sKGx2KQkobHZfaXNfdGhpbl9wb29sKGx2KSAmJiAhZmlyc3Rfc2VnKGx2KS0+dHJhbnNhY3Rpb25faWQpCisjZGVmaW5lIGx2X2lzX3VzZWRfdGhpbl9wb29sKGx2KQkobHZfaXNfdGhpbl9wb29sKGx2KSAmJiAhZG1fbGlzdF9lbXB0eSgmKGx2KS0+c2Vnc191c2luZ190aGlzX2x2KSkKKyNkZWZpbmUgbHZfaXNfdGhpbl9wb29sX2RhdGEobHYpCSgoKGx2KS0+c3RhdHVzICYgVEhJTl9QT09MX0RBVEEpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShsdikJKCgobHYpLT5zdGF0dXMgJiBUSElOX1BPT0xfTUVUQURBVEEpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3RoaW5fdHlwZShsdikJKCgobHYpLT5zdGF0dXMgJiAoVEhJTl9QT09MIHwgVEhJTl9WT0xVTUUgfCBUSElOX1BPT0xfREFUQSB8IFRISU5fUE9PTF9NRVRBREFUQSkpID8gMSA6IDApCisKKyNkZWZpbmUgbHZfaXNfbWlycm9yZWQobHYpCSgoKGx2KS0+c3RhdHVzICYgTUlSUk9SRUQpID8gMSA6IDApCisKKyNkZWZpbmUgbHZfaXNfbWlycm9yX2ltYWdlKGx2KQkoKChsdiktPnN0YXR1cyAmIE1JUlJPUl9JTUFHRSkgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfbWlycm9yX2xvZyhsdikJKCgobHYpLT5zdGF0dXMgJiBNSVJST1JfTE9HKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19taXJyb3IobHYpCSgoKGx2KS0+c3RhdHVzICYgTUlSUk9SKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19taXJyb3JfdHlwZShsdikJKCgobHYpLT5zdGF0dXMgJiAoTUlSUk9SIHwgTUlSUk9SX0xPRyB8IE1JUlJPUl9JTUFHRSkpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX25vdF9zeW5jZWQobHYpCSgoKGx2KS0+c3RhdHVzICYgTFZfTk9UU1lOQ0VEKSA/IDEgOiAwKQorCisjZGVmaW5lIGx2X2lzX3BlbmRpbmdfZGVsZXRlKGx2KSAoKChsdiktPnN0YXR1cyAmIExWX1BFTkRJTkdfREVMRVRFKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19lcnJvcl93aGVuX2Z1bGwobHYpICgoKGx2KS0+c3RhdHVzICYgTFZfRVJST1JfV0hFTl9GVUxMKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19wdm1vdmUobHYpCSgoKGx2KS0+c3RhdHVzICYgUFZNT1ZFKSA/IDEgOiAwKQorCisjZGVmaW5lIGx2X2lzX3JhaWQobHYpCQkoKChsdiktPnN0YXR1cyAmIFJBSUQpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3JhaWRfaW1hZ2UobHYpCSgoKGx2KS0+c3RhdHVzICYgUkFJRF9JTUFHRSkgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfcmFpZF9tZXRhZGF0YShsdikJKCgobHYpLT5zdGF0dXMgJiBSQUlEX01FVEEpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3JhaWRfdHlwZShsdikJKCgobHYpLT5zdGF0dXMgJiAoUkFJRCB8IFJBSURfSU1BR0UgfCBSQUlEX01FVEEpKSA/IDEgOiAwKQorCisjZGVmaW5lIGx2X2lzX2NhY2hlKGx2KQkJKCgobHYpLT5zdGF0dXMgJiBDQUNIRSkgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfY2FjaGVfcG9vbChsdikJKCgobHYpLT5zdGF0dXMgJiBDQUNIRV9QT09MKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc191c2VkX2NhY2hlX3Bvb2wobHYpCShsdl9pc19jYWNoZV9wb29sKGx2KSAmJiAhZG1fbGlzdF9lbXB0eSgmKGx2KS0+c2Vnc191c2luZ190aGlzX2x2KSkKKyNkZWZpbmUgbHZfaXNfY2FjaGVfcG9vbF9kYXRhKGx2KQkoKChsdiktPnN0YXR1cyAmIENBQ0hFX1BPT0xfREFUQSkgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfY2FjaGVfcG9vbF9tZXRhZGF0YShsdikJKCgobHYpLT5zdGF0dXMgJiBDQUNIRV9QT09MX01FVEFEQVRBKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19jYWNoZV90eXBlKGx2KQkoKChsdiktPnN0YXR1cyAmIChDQUNIRSB8IENBQ0hFX1BPT0wgfCBDQUNIRV9QT09MX0RBVEEgfCBDQUNIRV9QT09MX01FVEFEQVRBKSkgPyAxIDogMCkKKworI2RlZmluZSBsdl9pc19wb29sKGx2KQkJKCgobHYpLT5zdGF0dXMgJiAoQ0FDSEVfUE9PTCB8IFRISU5fUE9PTCkpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX3Bvb2xfZGF0YShsdikJCSgoKGx2KS0+c3RhdHVzICYgKENBQ0hFX1BPT0xfREFUQSB8IFRISU5fUE9PTF9EQVRBKSkgPyAxIDogMCkKKyNkZWZpbmUgbHZfaXNfcG9vbF9tZXRhZGF0YShsdikJCSgoKGx2KS0+c3RhdHVzICYgKENBQ0hFX1BPT0xfTUVUQURBVEEgfCBUSElOX1BPT0xfTUVUQURBVEEpKSA/IDEgOiAwKQorI2RlZmluZSBsdl9pc19wb29sX21ldGFkYXRhX3NwYXJlKGx2KQkoKChsdiktPnN0YXR1cyAmIFBPT0xfTUVUQURBVEFfU1BBUkUpID8gMSA6IDApCisjZGVmaW5lIGx2X2lzX2xvY2tkX3NhbmxvY2tfbHYobHYpCSgoKGx2KS0+c3RhdHVzICYgTE9DS0RfU0FOTE9DS19MVikgPyAxIDogMCkKKworI2RlZmluZSBsdl9pc19ybG9nKGx2KQkJKCgobHYpLT5zdGF0dXMgJiBSRVBMSUNBVE9SX0xPRykgPyAxIDogMCkKKworI2RlZmluZSBsdl9pc19yZW1vdmVkKGx2KQkoKChsdiktPnN0YXR1cyAmIExWX1JFTU9WRUQpID8gMSA6IDApCisKK2ludCBsdl9sYXlvdXRfYW5kX3JvbGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgIHN0cnVjdCBkbV9saXN0ICoqbGF5b3V0LCBzdHJ1Y3QgZG1fbGlzdCAqKnJvbGUpOworCisvKiBPcmRlcmVkIGxpc3QgLSBzZWUgbHZfbWFuaXAuYyAqLwordHlwZWRlZiBlbnVtIHsKKwlBUkVBX1VOQVNTSUdORUQsCisJQVJFQV9QViwKKwlBUkVBX0xWCit9IGFyZWFfdHlwZV90OworCisvKiBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZSBhbiBvcGVyYXRpb24gKi8KK3R5cGVkZWYgZW51bSB7CisJUFJPTVBUID0gMCwgLyogSXNzdWUgeWVzL25vIHByb21wdCB0byBjb25maXJtIG9wZXJhdGlvbiAqLworCURPTlRfUFJPTVBUID0gMSwgLyogQWRkIG1vcmUgcHJvbXB0cyAqLworCURPTlRfUFJPTVBUX09WRVJSSURFID0gMiAvKiBBZGQgZXZlbiBtb3JlIGRhbmdlcm91cyBwcm9tcHRzICovCit9IGZvcmNlX3Q7CisKK2VudW0geworCU1JUlJPUl9MT0dfQ09SRSwKKwlNSVJST1JfTE9HX0RJU0ssCisJTUlSUk9SX0xPR19NSVJST1JFRCwKK307CisKK3R5cGVkZWYgZW51bSB7CisJVEhJTl9ESVNDQVJEU19JR05PUkUsCisJVEhJTl9ESVNDQVJEU19OT19QQVNTRE9XTiwKKwlUSElOX0RJU0NBUkRTX1BBU1NET1dOLAorfSB0aGluX2Rpc2NhcmRzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJQ0FDSEVfTU9ERV9VTkRFRklORUQgPSAwLAorCUNBQ0hFX01PREVfV1JJVEVUSFJPVUdILAorCUNBQ0hFX01PREVfV1JJVEVCQUNLLAorCUNBQ0hFX01PREVfUEFTU1RIUk9VR0gsCit9IGNhY2hlX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlMT0NLX1RZUEVfSU5WQUxJRCA9IC0xLAorCUxPQ0tfVFlQRV9OT05FID0gMCwKKwlMT0NLX1RZUEVfQ0xWTSA9IDEsCisJTE9DS19UWVBFX0RMTSA9IDIsCisJTE9DS19UWVBFX1NBTkxPQ0sgPSAzLAorfSBsb2NrX3R5cGVfdDsKKworc3RydWN0IGNtZF9jb250ZXh0Oworc3RydWN0IGZvcm1hdF9oYW5kbGVyOworc3RydWN0IGxhYmVsbGVyOworCitzdHJ1Y3QgZm9ybWF0X3R5cGUgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CisJc3RydWN0IGZvcm1hdF9oYW5kbGVyICpvcHM7CisJc3RydWN0IGRtX2xpc3QgbWRhX29wczsgLyogTGlzdCBvZiBwZXJtaXNzaWJsZSBtZGEgb3BzLiAqLworCXN0cnVjdCBsYWJlbGxlciAqbGFiZWxsZXI7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICphbGlhczsKKwljb25zdCBjaGFyICpvcnBoYW5fdmdfbmFtZTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpvcnBoYW5fdmc7IC8qIE9ubHkgb25lIGV2ZXIgZXhpc3RzLiAqLworCXVpbnQzMl90IGZlYXR1cmVzOworCXZvaWQgKmxpYnJhcnk7CisJdm9pZCAqcHJpdmF0ZTsKK307CisKK3N0cnVjdCBwdl9zZWdtZW50IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OwkvKiBNZW1iZXIgb2YgcHYtPnNlZ21lbnRzOiBvcmRlcmVkIGxpc3QKKwkJCQkgKiBjb3ZlcmluZyBlbnRpcmUgZGF0YSBhcmVhIG9uIHRoaXMgUFYgKi8KKworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXVpbnQzMl90IHBlOworCXVpbnQzMl90IGxlbjsKKworCXN0cnVjdCBsdl9zZWdtZW50ICpsdnNlZzsJLyogTlVMTCBpZiBmcmVlIHNwYWNlICovCisJdWludDMyX3QgbHZfYXJlYTsJLyogSW5kZXggdG8gYXJlYSBpbiBMViBzZWdtZW50ICovCit9OworCisjZGVmaW5lIHB2c2VnX2lzX2FsbG9jYXRlZChwdnNlZykgKChwdnNlZyktPmx2c2VnID8gMSA6IDApCisKKy8qCisgKiBQcm9wZXJ0aWVzIG9mIGVhY2ggZm9ybWF0IGluc3RhbmNlIHR5cGUuCisgKiBUaGUgcHJpbWFyeSByb2xlIG9mIHRoZSBmb3JtYXRfaW5zdGFuY2UgaXMgdG8gdGVtcG9yYXJpbHkgc3RvcmUgbWV0YWRhdGEKKyAqIGFyZWEgaW5mb3JtYXRpb24gd2UgYXJlIHdvcmtpbmcgd2l0aC4KKyAqLworCisvKiBJbmNsdWRlIGFueSBleGlzdGluZyBQViAoIm9uLWRpc2siKSBtZGFzIGR1cmluZyBmb3JtYXRfaW5zdGFuY2UgaW5pdGlhbGlzYXRpb24uICovCisjZGVmaW5lIEZNVF9JTlNUQU5DRV9NREFTCQkweDAwMDAwMDAyVQorCisvKgorICogSW5jbHVkZSBhbnkgYXV4aWxpYXJ5IG1kYXMgZHVyaW5nIGZvcm1hdF9pbnN0YW5jZSBpbnRpYWxpc2F0aW9uLgorICogQ3VycmVudGx5LCB0aGlzIGluY2x1ZGVzIG1ldGFkYXRhIGFyZWFzIGFzIGRlZmluZWQgYnkKKyAqIG1ldGFkYXRhL2RpcnMgYW5kIG1ldGFkYXRhL3Jhd3Mgc2V0dGluZy4KKyAqLworI2RlZmluZSBGTVRfSU5TVEFOQ0VfQVVYX01EQVMJCTB4MDAwMDAwMDRVCisKKy8qCisgKiBJbmNsdWRlIGFueSBvdGhlciBmb3JtYXQtc3BlY2lmaWMgbWRhcyBkdXJpbmcgZm9ybWF0X2luc3RhbmNlIGluaXRpYWxpc2F0aW9uLgorICogRm9yIGV4YW1wbGUgbWV0YWRhdGEgYXJlYXMgdXNlZCBkdXJpbmcgYmFja3VwL3Jlc3RvcmUvYXJjaGl2ZSBoYW5kbGluZy4KKyAqLworI2RlZmluZSBGTVRfSU5TVEFOQ0VfUFJJVkFURV9NREFTCTB4MDAwMDAwMDhVCisKK3N0cnVjdCBmb3JtYXRfaW5zdGFuY2UgeworCXVuc2lnbmVkIHJlZl9jb3VudDsJLyogUmVmcyB0byB0aGlzIGZpZCBmcm9tIFZHIGFuZCBQViBzdHJ1Y3RzICovCisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKworCXVpbnQzMl90IHR5cGU7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisKKwkvKgorCSAqIEVhY2ggbWRhIGluIGEgdmcgaXMgb24gZXhhY3RseSBvbmUgb2YgdGhlIGJlbG93IGxpc3RzLgorCSAqIE1EQXMgb24gdGhlICdpbl91c2UnIGxpc3Qgd2lsbCBiZSByZWFkIGZyb20gLyB3cml0dGVuIHRvCisJICogZGlzaywgd2hpbGUgTURBcyBvbiB0aGUgJ2lnbm9yZWQnIGxpc3Qgd2lsbCBub3QgYmUgcmVhZAorCSAqIG9yIHdyaXR0ZW4gdG8uCisJICovCisJLyogRklYTUU6IFRyeSB0byB1c2UgdGhlIGluZGV4IG9ubHkuIFJlbW92ZSB0aGVzZSBsaXN0cy4gKi8KKwlzdHJ1Y3QgZG1fbGlzdCBtZXRhZGF0YV9hcmVhc19pbl91c2U7CisJc3RydWN0IGRtX2xpc3QgbWV0YWRhdGFfYXJlYXNfaWdub3JlZDsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqbWV0YWRhdGFfYXJlYXNfaW5kZXg7CisKKwl2b2lkICpwcml2YXRlOworfTsKKworLyogVGhlcmUgd2lsbCBiZSBvbmUgYXJlYSBmb3IgZWFjaCBzdHJpcGUgKi8KK3N0cnVjdCBsdl9zZWdtZW50X2FyZWEgeworCWFyZWFfdHlwZV90IHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnOworCQl9IHB2OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwkJCXVpbnQzMl90IGxlOworCQl9IGx2OworCX0gdTsKK307CisKK3N0cnVjdCBsdl90aGluX21lc3NhZ2UgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CQkvKiBDaGFpbmVkIGxpc3Qgb2YgbWVzc2FnZXMgKi8KKwlkbV90aGluX21lc3NhZ2VfdCB0eXBlOwkJLyogVXNlIGRtIHRoaW4gbWVzc2FnZSBkYXRhdHlwZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsgLyogRm9yOiBjcmVhdGVfdGhpbiwgY3JlYXRlX3NuYXAsIHRyaW0gKi8KKwkJdWludDMyX3QgZGVsZXRlX2lkOwkvKiBGb3IgZGVsZXRlLCBuZWVkcyBkZXZpY2VfaWQgKi8KKwl9IHU7Cit9OworCitzdHJ1Y3Qgc2VnbWVudF90eXBlOworCisvKiBMaXN0IHdpdGggdmdfbmFtZSwgdmdpZCBhbmQgZmxhZ3MgKi8KK3N0cnVjdCBjbWRfdmcgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICp2Z2lkOworCXVpbnQzMl90IGZsYWdzOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworfTsKKworLyogKysgUmVwbGljYXRvciBkYXRhdHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJUkVQTElDQVRPUl9TVEFURV9QQVNTSVZFLAorCVJFUExJQ0FUT1JfU1RBVEVfQUNUSVZFLAorCU5VTV9SRVBMSUNBVE9SX1NUQVRFCit9IHJlcGxpY2F0b3Jfc3RhdGVfdDsKKworc3RydWN0IHJlcGxpY2F0b3Jfc2l0ZSB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsJCS8qIENoYWluZWQgbGlzdCBvZiBzaXRlcyAqLworCXN0cnVjdCBkbV9saXN0IHJkZXZpY2VzOwkvKiBEZXZpY2UgbGlzdCAqLworCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpyZXBsaWNhdG9yOyAvKiBSZWZlcmVuY2UgdG8gcmVwbGljYXRvciAqLworCisJY29uc3QgY2hhciAqbmFtZTsJCS8qIFNpdGUgbmFtZSAqLworCWNvbnN0IGNoYXIgKnZnX25hbWU7CQkvKiBWRyBuYW1lICovCisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CS8qIHJlc29sdmVkIHZnICAoYWN0aXZhdGUvZGVhY3RpdmUpICovCisJdW5zaWduZWQgc2l0ZV9pbmRleDsKKwlyZXBsaWNhdG9yX3N0YXRlX3Qgc3RhdGU7CS8qIEFjdGl2ZSBvciBwYXNpdmUgc3RhdGUgb2Ygc2l0ZSAqLworCWRtX3JlcGxpY2F0b3JfbW9kZV90IG9wX21vZGU7CS8qIE9wZXJhdGlvbiBtb2RlIHN5bmMgb3IgYXN5bmMgZmFpbHx3YXJufGRyb3B8c3RhbGwgKi8KKwl1aW50NjRfdCBmYWxsX2JlaGluZF9kYXRhOwkvKiBCeXRlcyAqLworCXVpbnQzMl90IGZhbGxfYmVoaW5kX2lvczsJLyogSU8gb3BlcmF0aW9ucyAqLworCXVpbnQzMl90IGZhbGxfYmVoaW5kX3RpbWVvdXQ7CS8qIFNlY29uZHMgKi8KK307CisKK3N0cnVjdCByZXBsaWNhdG9yX2RldmljZSB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsJCS8qIENoYWluZWQgbGlzdCBvZiBkZXZpY2VzIGZyb20gc2FtZSBzaXRlICovCisKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqcmVwbGljYXRvcl9kZXY7IC8qIFJlZmVyZW5jZSB0byByZXBsaWNhdG9yLWRldiBzZWdtZW50ICovCisJc3RydWN0IHJlcGxpY2F0b3Jfc2l0ZSAqcnNpdGU7CS8qIFJlZmVyZW5jZSB0byBzaXRlIHBhcmFtZXRlcnMgKi8KKworCXVpbnQ2NF90IGRldmljZV9pbmRleDsKKwljb25zdCBjaGFyICpuYW1lOwkJLyogRGV2aWNlIExWIG5hbWUgKi8KKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OwkvKiBMViBmcm9tIHJlcGxpY2F0b3Igc2l0ZSdzIFZHICovCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzbG9nOwkvKiBTeW5jbG9nIGx2IGZyb20gVkcgICovCisJY29uc3QgY2hhciAqc2xvZ19uYW1lOwkJLyogRGVidWcgLSBzcGVjaWZ5IHNpemUgb2YgY29yZSBzeW5jbG9nICovCit9OworLyogLS0gUmVwbGljYXRvciBkYXRhdHlwZXMgKi8KKworc3RydWN0IGx2X3NlZ21lbnQgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJdWludDMyX3QgbGU7CisJdWludDMyX3QgbGVuOworCisJdWludDY0X3Qgc3RhdHVzOworCisJLyogRklYTUUgRmllbGRzIGRlcGVuZCBvbiBzZWdtZW50IHR5cGUgKi8KKwl1aW50MzJfdCBzdHJpcGVfc2l6ZTsJLyogRm9yIHN0cmlwZSBhbmQgUkFJRCAtIGluIHNlY3RvcnMgKi8KKwl1aW50MzJfdCB3cml0ZWJlaGluZDsgICAvKiBGb3IgUkFJRCAoUkFJRDEgb25seSkgKi8KKwl1aW50MzJfdCBtaW5fcmVjb3ZlcnlfcmF0ZTsgLyogRm9yIFJBSUQgKi8KKwl1aW50MzJfdCBtYXhfcmVjb3ZlcnlfcmF0ZTsgLyogRm9yIFJBSUQgKi8KKwl1aW50MzJfdCBhcmVhX2NvdW50OworCXVpbnQzMl90IGFyZWFfbGVuOworCXVpbnQzMl90IGNodW5rX3NpemU7CS8qIEZvciBzbmFwc2hvdHMvdGhpbl9wb29sLiAgSW4gc2VjdG9ycy4gKi8KKwkJCQkvKiBGb3IgdGhpbl9wb29sLCAxMjguLjIwOTcxNTIuICovCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW47CS8qIHNuYXAgYW5kIHRoaW4gKi8KKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqaW5kaXJlY3Rfb3JpZ2luOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWVyZ2VfbHY7IC8qIHRoaW4sIG1lcmdlIGRlc2NlbmRlbnQgbHYgaW50byB0aGlzIGFuY2VzdG9yICovCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjb3c7CisJc3RydWN0IGRtX2xpc3Qgb3JpZ2luX2xpc3Q7CisJdWludDMyX3QgcmVnaW9uX3NpemU7CS8qIEZvciBtaXJyb3JzLCByZXBsaWNhdG9ycyAtIGluIHNlY3RvcnMgKi8KKwl1aW50MzJfdCBleHRlbnRzX2NvcGllZDsvKiBOdW1iZXIgb2YgZXh0ZW50cyBzeW5jZWQgZm9yIHJhaWRzL21pcnJvcnMgKi8KKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqcHZtb3ZlX3NvdXJjZV9zZWc7CisJdm9pZCAqc2VndHlwZV9wcml2YXRlOworCisJc3RydWN0IGRtX2xpc3QgdGFnczsKKworCXN0cnVjdCBsdl9zZWdtZW50X2FyZWEgKmFyZWFzOworCXN0cnVjdCBsdl9zZWdtZW50X2FyZWEgKm1ldGFfYXJlYXM7CS8qIEZvciBSQUlEICovCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptZXRhZGF0YV9sdjsJLyogRm9yIHRoaW5fcG9vbCAqLworCXVpbnQ2NF90IHRyYW5zYWN0aW9uX2lkOwkJLyogRm9yIHRoaW5fcG9vbCwgdGhpbiAqLworCXVuc2lnbmVkIHplcm9fbmV3X2Jsb2NrczsJCS8qIEZvciB0aGluX3Bvb2wgKi8KKwl0aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7CQkvKiBGb3IgdGhpbl9wb29sICovCisJc3RydWN0IGRtX2xpc3QgdGhpbl9tZXNzYWdlczsJCS8qIEZvciB0aGluX3Bvb2wgKi8KKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmV4dGVybmFsX2x2OwkvKiBGb3IgdGhpbiAqLworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdjsJCS8qIEZvciB0aGluLCBjYWNoZSAqLworCXVpbnQzMl90IGRldmljZV9pZDsJCQkvKiBGb3IgdGhpbiwgMjRiaXQgKi8KKworCWNhY2hlX21vZGVfdCBjYWNoZV9tb2RlOwkJLyogRm9yIGNhY2hlX3Bvb2wgKi8KKwljb25zdCBjaGFyICpwb2xpY3lfbmFtZTsJCS8qIEZvciBjYWNoZV9wb29sICovCisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwb2xpY3lfc2V0dGluZ3M7CS8qIEZvciBjYWNoZV9wb29sICovCisJdW5zaWduZWQgY2xlYW5lcl9wb2xpY3k7CQkvKiBGb3IgY2FjaGUgKi8KKworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcjsvKiBGb3IgcmVwbGljYXRvci1kZXZzIC0gbGluayB0byByZXBsaWNhdG9yIExWICovCisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpybG9nX2x2OwkvKiBGb3IgcmVwbGljYXRvcnMgKi8KKwljb25zdCBjaGFyICpybG9nX3R5cGU7CQkvKiBGb3IgcmVwbGljYXRvcnMgKi8KKwl1aW50NjRfdCByZGV2aWNlX2luZGV4X2hpZ2hlc3Q7CS8qIEZvciByZXBsaWNhdG9ycyAqLworCXVuc2lnbmVkIHJzaXRlX2luZGV4X2hpZ2hlc3Q7CS8qIEZvciByZXBsaWNhdG9ycyAqLworfTsKKworI2RlZmluZSBzZWdfdHlwZShzZWcsIHMpCShzZWcpLT5hcmVhc1socyldLnR5cGUKKyNkZWZpbmUgc2VnX3B2KHNlZywgcykJCShzZWcpLT5hcmVhc1socyldLnUucHYucHZzZWctPnB2CisjZGVmaW5lIHNlZ19sdihzZWcsIHMpCQkoc2VnKS0+YXJlYXNbKHMpXS51Lmx2Lmx2CisjZGVmaW5lIHNlZ19tZXRhbHYoc2VnLCBzKQkoc2VnKS0+bWV0YV9hcmVhc1socyldLnUubHYubHYKKyNkZWZpbmUgc2VnX21ldGF0eXBlKHNlZywgcykJKHNlZyktPm1ldGFfYXJlYXNbKHMpXS50eXBlCisKK3N0cnVjdCBwZV9yYW5nZSB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwl1aW50MzJfdCBzdGFydDsJCS8qIFBFcyAqLworCXVpbnQzMl90IGNvdW50OwkJLyogUEVzICovCit9OworCitzdHJ1Y3QgcHZfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgZG1fbGlzdCAqbWRhczsJLyogTWV0YWRhdGEgYXJlYXMgKi8KKwlzdHJ1Y3QgZG1fbGlzdCAqcGVfcmFuZ2VzOwkvKiBSYW5nZXMgb2YgUEVzIGUuZy4gZm9yIGFsbG9jYXRpb24gKi8KK307CisKK3N0cnVjdCBsdl9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7Cit9OworCitzdHJ1Y3QgZ2x2X2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdsdjsKK307CisKK3N0cnVjdCB2Z19saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworfTsKKworc3RydWN0IHZnbmFtZWlkX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICp2Z2lkOworfTsKKworI2RlZmluZSBQVl9QRV9TVEFSVF9DQUxDICgodWludDY0X3QpIC0xKSAvKiBDYWxjdWxhdGUgcGVfc3RhcnQgdmFsdWUgKi8KKworLyoKKyAqIFZhbHVlcyB1c2VkIGJ5IHB2X2NyZWF0ZSgpLgorICovCitzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgeworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3QgZGF0YV9hbGlnbm1lbnQ7CisJdWludDY0X3QgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0OworCXVpbnQ2NF90IGxhYmVsX3NlY3RvcjsKKwlpbnQgcHZtZXRhZGF0YWNvcGllczsKKwl1aW50NjRfdCBwdm1ldGFkYXRhc2l6ZTsKKwl1bnNpZ25lZCBtZXRhZGF0YWlnbm9yZTsKKworCS8qIHVzZWQgd2hlbiByZXN0b3JpbmcgKi8KKwlzdHJ1Y3QgaWQgaWQ7CisJc3RydWN0IGlkICppZHA7CisJdWludDY0X3QgYmFfc3RhcnQ7CisJdWludDY0X3QgYmFfc2l6ZTsKKwl1aW50NjRfdCBwZV9zdGFydDsKKwl1aW50MzJfdCBleHRlbnRfY291bnQ7CisJdWludDMyX3QgZXh0ZW50X3NpemU7Cit9OworCitzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zIHsKKwkvKgorCSAqIEZyb20gYXJnYyBhbmQgYXJndi4KKwkgKi8KKwljaGFyICoqcHZfbmFtZXM7CisJdWludDMyX3QgcHZfY291bnQ7CisKKwkvKgorCSAqIEZyb20gY29tbWFuZCBsaW5lIGFyZ3MuCisJICovCisJaW50IHplcm87CisJZm9yY2VfdCBmb3JjZTsKKwl1bnNpZ25lZCB5ZXM7CisKKwkvKgorCSAqIEZyb20gcmVjb3Zlcnktc3BlY2lmaWMgY29tbWFuZCBsaW5lIGFyZ3MuCisJICovCisJY29uc3QgY2hhciAqcmVzdG9yZWZpbGU7IC8qIE5VTEwgaWYgbm8gLS1yZXN0b3JlZmlsZSBvcHRpb24gKi8KKwljb25zdCBjaGFyICp1dWlkX3N0cjsgICAgLyogaWQgaW4gcHJpbnRhYmxlIGZvcm1hdCwgTlVMTCBpZiBubyBpZCAqLworCisJLyoKKwkgKiBWYWx1ZXMgdXNlZCBieSBwdl9jcmVhdGUoKS4KKwkgKi8KKwlzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgcHZhOworCisJLyoKKwkgKiBVc2VkIGZvciBjb21tYW5kIHByb2Nlc3NpbmcuCisJICovCisJc3RydWN0IGRtX2xpc3QgcHJvbXB0czsgICAgICAgICAvKiBwdmNyZWF0ZV9wcm9tcHQgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBhcmdfZGV2aWNlczsgICAgIC8qIHB2Y3JlYXRlX2RldmljZSwgb25lIGZvciBlYWNoIHB2X25hbWUgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBhcmdfcHJvY2VzczsgICAgIC8qIHB2Y3JlYXRlX2RldmljZSwgdXNlZCBmb3IgcHJvY2Vzc2luZyAqLworCXN0cnVjdCBkbV9saXN0IGFyZ19jb25maXJtOyAgICAgLyogcHZjcmVhdGVfZGV2aWNlLCB1c2VkIGZvciBwcm9jZXNzaW5nICovCisJc3RydWN0IGRtX2xpc3QgYXJnX2NyZWF0ZTsgICAgICAvKiBwdmNyZWF0ZV9kZXZpY2UsIHVzZWQgZm9yIHB2Y3JlYXRlICovCisJc3RydWN0IGRtX2xpc3QgYXJnX3JlbW92ZTsgICAgICAvKiBwdmNyZWF0ZV9kZXZpY2UsIHVzZWQgZm9yIHB2cmVtb3ZlICovCisJc3RydWN0IGRtX2xpc3QgYXJnX2ZhaWw7ICAgICAgICAvKiBwdmNyZWF0ZV9kZXZpY2UsIGZhaWxlZCB0byBjcmVhdGUgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBwdnM7ICAgICAgICAgICAgIC8qIHB2X2xpc3QsIGNyZWF0ZWQgYW5kIHVzYWJsZSBmb3IgdmdjcmVhdGUvdmdleHRlbmQgKi8KKwljb25zdCBjaGFyICpvcnBoYW5fdmdfbmFtZTsKKwl1bnNpZ25lZCBpc19yZW1vdmUgOiAxOyAgICAgICAgIC8qIGlzIHJlbW92aW5nIFBWcywgbm90IGNyZWF0aW5nICovCisJdW5zaWduZWQgcHJlc2VydmVfZXhpc3RpbmcgOiAxOworCXVuc2lnbmVkIGNoZWNrX2ZhaWxlZCA6IDE7Cit9OworCitzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zIHsKKwlpbnQgYXJnYzsKKwljaGFyICoqYXJndjsKKworCWNvbnN0IGNoYXIgKnZnX25hbWU7IC8qIG9ubHktdXNlZCB3aGVuIFZHIGlzIG5vdCB5ZXQgb3BlbmVkIChpbiAvdG9vbHMpICovCisJY29uc3QgY2hhciAqbHZfbmFtZTsKKworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisKKwl1aW50NjRfdCBwb29sbWV0YWRhdGFfc2l6ZTsKKwlzaWduX3QgcG9vbG1ldGFkYXRhX3NpZ247CisKKwkvKiBQZXIgTFYgYXBwbGllZCBwYXJhbWV0ZXJzICovCisKKwllbnVtIHsKKwkJTFZfQU5ZID0gMCwKKwkJTFZfUkVEVUNFID0gMSwKKwkJTFZfRVhURU5EID0gMgorCX0gcmVzaXplOworCisJaW50IHVzZV9wb2xpY2llczsKKworCWFsbG9jX3BvbGljeV90IGFsbG9jOworCWludCBmb3JjZTsKKwlpbnQgbm9zeW5jOworCWludCBub2ZzY2s7CisJaW50IHJlc2l6ZWZzOworCisJdW5zaWduZWQgbWlycm9yczsKKwl1aW50MzJfdCBzdHJpcGVzOworCXVpbnQ2NF90IHN0cmlwZV9zaXplOworCisJdWludDMyX3QgZXh0ZW50czsKKwl1aW50NjRfdCBzaXplOworCXNpZ25fdCBzaWduOworCXBlcmNlbnRfdHlwZV90IHBlcmNlbnQ7CisKKwlpbnQgYXBwcm94X2FsbG9jOworCWludCBleHRlbnRzX2FyZV9wZXM7CS8qIElzICdleHRlbnRzJyBjb3VudGluZyBQRXMgb3IgTEVzPyAqLworCWludCBzaXplX2NoYW5nZWQ7CS8qIFdhcyB0aGVyZSBhY3R1YWxseSBhIHNpemUgY2hhbmdlICovCit9OworCit2b2lkIHB2Y3JlYXRlX3BhcmFtc19zZXRfZGVmYXVsdHMoc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApOworCisvKgorICogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCB3YXJuaW5ncyBhIGxpYnJhcnkgZnVuY3Rpb24gc2hvdWxkIGlzc3VlLgorICovIAorI2RlZmluZSBXQVJOX1BWX1JFQUQgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdBUk5fSU5DT05TSVNURU5UIDB4MDAwMDAwMDIKKworLyoKKyogVXRpbGl0eSBmdW5jdGlvbnMKKyovCitpbnQgdmdfd3JpdGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX2NvbW1pdChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit2b2lkIHZnX3JldmVydChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19yZWFkX2ludGVybmFsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZnaWQsIHVpbnQzMl90IHdhcm5fZmxhZ3MsIGludCAqY29uc2lzdGVudCk7CisKKyNkZWZpbmUgZ2V0X3B2cyggY21kICkgZ2V0X3B2c19pbnRlcm5hbCgoY21kKSwgTlVMTCwgTlVMTCkKKyNkZWZpbmUgZ2V0X3B2c19wZXJzZXJ2ZV92ZyggY21kLCBwdl9saXN0LCB2Z19saXN0ICkgZ2V0X3B2c19pbnRlcm5hbCgoY21kKSwgKHB2X2xpc3QpLCAodmdfbGlzdCkpCisKK3N0cnVjdCBkbV9saXN0ICpnZXRfcHZzX2ludGVybmFsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQlzdHJ1Y3QgZG1fbGlzdCAqcHZzbGlzdCwgc3RydWN0IGRtX2xpc3QgKnZnc2xpc3QpOworCisvKgorICogQWRkL3JlbW92ZSBMViB0by9mcm9tIHZvbHVtZSBncm91cAorICovCitpbnQgbGlua19sdl90b192ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgdW5saW5rX2x2X2Zyb21fdmcoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7Cit2b2lkIGx2X3NldF92aXNpYmxlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOwordm9pZCBsdl9zZXRfaGlkZGVuKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCitzdHJ1Y3QgZG1fbGlzdCAqZ2V0X3ZnbmFtZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBpbmNsdWRlX2ludGVybmFsKTsKK3N0cnVjdCBkbV9saXN0ICpnZXRfdmdpZHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBpbmNsdWRlX2ludGVybmFsKTsKK2ludCBnZXRfdmduYW1laWRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqdmduYW1laWRzLAorCQkgIGNvbnN0IGNoYXIgKm9ubHlfdGhpc192Z25hbWUsIGludCBpbmNsdWRlX2ludGVybmFsKTsKK2ludCBzY2FuX3Znc19mb3JfcHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1aW50MzJfdCB3YXJuX2ZsYWdzKTsKKworaW50IHB2X3dyaXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IGFsbG93X25vbl9vcnBoYW4pOworaW50IG1vdmVfcHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8sCisJICAgIGNvbnN0IGNoYXIgKnB2X25hbWUpOworaW50IG1vdmVfcHZzX3VzZWRfYnlfbHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvLAorCQkJY29uc3QgY2hhciAqbHZfbmFtZSk7CitpbnQgaXNfZ2xvYmFsX3ZnKGNvbnN0IGNoYXIgKnZnX25hbWUpOworaW50IGlzX29ycGhhbl92Zyhjb25zdCBjaGFyICp2Z19uYW1lKTsKK2ludCBpc19yZWFsX3ZnKGNvbnN0IGNoYXIgKnZnX25hbWUpOworaW50IHZnX21pc3NpbmdfcHZfY291bnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnc19hcmVfY29tcGF0aWJsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sCisJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190byk7Cit1aW50MzJfdCB2Z19sb2NrX25ld25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSk7CisKK2ludCBsdl9yZXNpemUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkgICAgICBzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zICpscCwKKwkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcHZoKTsKKworLyoKKyAqIFJldHVybiBhIGhhbmRsZSB0byBWRyBtZXRhZGF0YS4KKyAqLworc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfcmVhZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICAgY29uc3QgY2hhciAqdmdpZCwgdWludDMyX3QgcmVhZF9mbGFncywgdWludDMyX3QgbG9ja2Rfc3RhdGUpOworc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfcmVhZF9mb3JfdXBkYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJIGNvbnN0IGNoYXIgKnZnaWQsIHVpbnQzMl90IHJlYWRfZmxhZ3MsIHVpbnQzMl90IGxvY2tkX3N0YXRlKTsKKworLyogCisgKiBUZXN0IHZhbGlkaXR5IG9mIGEgVkcgaGFuZGxlLgorICovCit1aW50MzJfdCB2Z19yZWFkX2Vycm9yKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2hhbmRsZSk7CisKKy8qIHBlX3N0YXJ0IGFuZCBwZV9lbmQgcmVsYXRlIHRvIGFueSBleGlzdGluZyBkYXRhIHNvIHRoYXQgbmV3IG1ldGFkYXRhCisqIGFyZWFzIGNhbiBhdm9pZCBvdmVybGFwICovCitzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdl9jcmVhdGUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwdl9jcmVhdGVfYXJncyAqcHZhKTsKKworaW50IHB2cmVtb3ZlX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcHZfbmFtZSwKKwkJICAgIHZvaWQgKmhhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdW5zaWduZWQgZm9yY2VfY291bnQsCisJCSAgICB1bnNpZ25lZCBwcm9tcHQsIHN0cnVjdCBkbV9saXN0ICpwdnNsaXN0KTsKK2ludCBwdnJlbW92ZV9tYW55KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fbGlzdCAqcHZfbmFtZXMsCisJCSAgdW5zaWduZWQgZm9yY2VfY291bnQsIHVuc2lnbmVkIHByb21wdCk7CisKK2ludCBwdl9yZXNpemVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgICAgIGNvbnN0IHVpbnQ2NF90IG5ld19zaXplKTsKKworaW50IHB2X2FuYWx5emUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJICAgICAgIHVpbnQ2NF90IGxhYmVsX3NlY3Rvcik7CisKKy8qIEZJWE1FOiBtb3ZlIGludGVybmFsIHRvIGxpYnJhcnkgKi8KK3VpbnQzMl90IHB2X2xpc3RfZXh0ZW50c19mcmVlKGNvbnN0IHN0cnVjdCBkbV9saXN0ICpwdmgpOworCitpbnQgdmFsaWRhdGVfbmV3X3ZnX25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUpOworaW50IHZnX3ZhbGlkYXRlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2NyZWF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSk7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19sb2NrX2FuZF9jcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUpOworaW50IHZnX3JlbW92ZV9tZGFzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCB2Z19yZW1vdmVfY2hlY2soc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordm9pZCB2Z19yZW1vdmVfcHZzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCB2Z19yZW1vdmVfZGlyZWN0KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCB2Z19yZW1vdmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX3JlbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJICAgICAgY29uc3QgY2hhciAqbmV3X25hbWUpOworaW50IHZnX2V4dGVuZChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgaW50IHB2X2NvdW50LCBjb25zdCBjaGFyICpjb25zdCAqcHZfbmFtZXMsCisJICAgICAgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApOworaW50IHZnX2V4dGVuZF9lYWNoX3B2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCk7CitpbnQgdmdfcmVkdWNlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpwdl9uYW1lKTsKKworaW50IHZncmVkdWNlX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIGludCBjb21taXQpOworCitpbnQgdmdfY2hhbmdlX3RhZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqdGFnLCBpbnQgYWRkX3RhZyk7CitpbnQgdmdfc3BsaXRfbWRhcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190byk7CisvKiBGSVhNRTogSW52ZXN0aWdhdGUgcmVmYWN0b3JpbmcgdGhlc2UgZnVuY3Rpb25zIHRvIHRha2UgYSBwdiBJU08gcHZfbGlzdCAqLwordm9pZCBhZGRfcHZsX3RvX3ZncyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHB2X2xpc3QgKnB2bCk7Cit2b2lkIGRlbF9wdmxfZnJvbV92Z3Moc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwdl9saXN0ICpwdmwpOworCisvKgorICogZnJlZV9wdl9maWQoKSBtdXN0IGJlIGNhbGxlZCBvbiBldmVyeSBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lIGFsbG9jYXRlZAorICogYnkgcHZfY3JlYXRlLCBwdl9yZWFkLCBmaW5kX3B2X2J5X25hbWUgb3IgdG8gZnJlZSBpdCB3aGVuIG5vIGxvbmdlciByZXF1aXJlZC4KKyAqLwordm9pZCBmcmVlX3B2X2ZpZChzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CisKKy8qIE1hbmlwdWxhdGUgTFZzICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X2NyZWF0ZV9lbXB0eShjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICB1bmlvbiBsdmlkICpsdmlkLAorCQkJCSAgICAgICB1aW50NjRfdCBzdGF0dXMsCisJCQkJICAgICAgIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKK3N0cnVjdCB3aXBlX3BhcmFtcyB7CisJaW50IGRvX3plcm87CQkvKiBzaG91bGQgd2UgZG8gemVyb2luZyBvZiBMViBzdGFydD8gKi8KKwl1aW50NjRfdCB6ZXJvX3NlY3RvcnM7CS8qIHNlY3RvciBjb3VudCB0byB6ZXJvICovCisJaW50IHplcm9fdmFsdWU7CQkvKiB6ZXJvLW91dCB3aXRoIHRoaXMgdmFsdWUgKi8KKwlpbnQgZG9fd2lwZV9zaWduYXR1cmVzOwkvKiBzaG91bGQgd2Ugd2lwZSBrbm93biBzaWduYXR1cmVzIGZvdW5kIG9uIExWPyAqLworCWludCB5ZXM7CQkvKiBhbnN3ZXIgeWVzIGF1dG9tYXRpY2FsbHkgdG8gYWxsIHF1ZXN0aW9ucyAqLworCWZvcmNlX3QgZm9yY2U7CQkvKiBmb3JjZSBtb2RlICovCit9OworCisvKiBaZXJvIG91dCBMViBhbmQvb3Igd2lwZSBzaWduYXR1cmVzICovCitpbnQgd2lwZV9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3Qgd2lwZV9wYXJhbXMgcGFyYW1zKTsKKworaW50IGx2X2NoYW5nZV90YWcoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3QgY2hhciAqdGFnLCBpbnQgYWRkX3RhZyk7CisKKy8qIFJlZHVjZSB0aGUgc2l6ZSBvZiBhbiBMViBieSBleHRlbnRzICovCitpbnQgbHZfcmVkdWNlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGV4dGVudHMpOworCisvKiBFbXB0eSBhbiBMViBwcmlvciB0byBkZWxldGluZyBpdCAqLworaW50IGx2X2VtcHR5KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBFbXB0eSBhbiBMViBhbmQgYWRkIGVycm9yIHNlZ21lbnQgKi8KK2ludCByZXBsYWNlX2x2X3dpdGhfZXJyb3Jfc2VnbWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGx2X3JlZnJlc2hfc3VzcGVuZF9yZXN1bWUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisKKy8qIEVudHJ5IHBvaW50IGZvciBhbGwgTFYgZXh0ZW50IGFsbG9jYXRpb25zICovCitpbnQgbHZfZXh0ZW5kKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJICAgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkgICAgICB1aW50MzJfdCBzdHJpcGVzLCB1aW50MzJfdCBzdHJpcGVfc2l6ZSwKKwkgICAgICB1aW50MzJfdCBtaXJyb3JzLCB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkgICAgICB1aW50MzJfdCBleHRlbnRzLAorCSAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnMsIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCSAgICAgIGludCBhcHByb3hfYWxsb2MpOworCisvKiBsdiBtdXN0IGJlIHBhcnQgb2YgbHYtPnZnLT5sdnMgKi8KK2ludCBsdl9yZW1vdmUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisKKy8qIGhpc3RvcmljYWxfZ2x2IG11c3QgYmUgcGFydCBvZiBsdi0+dmctPmhpc3RvcmljYWxfbHZzICovCitpbnQgaGlzdG9yaWNhbF9nbHZfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpoaXN0b3JpY2FsX2dsdik7CisKK2ludCBsdl9yZW1vdmVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIGZvcmNlX3QgZm9yY2UsIGludCBzdXBwcmVzc19yZW1vdmVfbWVzc2FnZSk7CisKK2ludCBsdl9yZW1vdmVfd2l0aF9kZXBlbmRlbmNpZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJZm9yY2VfdCBmb3JjZSwgdW5zaWduZWQgbGV2ZWwpOworCitpbnQgbHZfcmVuYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCSAgICAgIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKK2ludCBsdl9yZW5hbWVfdXBkYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgIGNvbnN0IGNoYXIgKm5ld19uYW1lLCBpbnQgdXBkYXRlX21kYSk7CisKKy8qIFVwZGF0ZXMgYW5kIHJlbG9hZHMgbWV0YWRhdGEgZm9yIGdpdmVuIGx2ICovCitpbnQgbHZfdXBkYXRlX2FuZF9yZWxvYWQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfdXBkYXRlX2FuZF9yZWxvYWRfb3JpZ2luKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCit1aW50MzJfdCBleHRlbnRzX2Zyb21fc2l6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDY0X3Qgc2l6ZSwKKwkJCSAgIHVpbnQzMl90IGV4dGVudF9zaXplKTsKK3VpbnQzMl90IGV4dGVudHNfZnJvbV9wZXJjZW50X3NpemUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGNvbnN0IHN0cnVjdCBkbV9saXN0ICpwdmgsCisJCQkJICAgdWludDMyX3QgZXh0ZW50cywgaW50IHJvdW5kdXAsCisJCQkJICAgcGVyY2VudF90eXBlX3QgcGVyY2VudCwgdWludDY0X3Qgc2l6ZSk7CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9wb29sX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IHBvb2xfaXNfYWN0aXZlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdik7CitpbnQgcG9vbF9zdXBwb3J0c19leHRlcm5hbF9vcmlnaW4oY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmV4dGVybmFsX2x2KTsKK2ludCB0aGluX3Bvb2xfZmVhdHVyZV9zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2LCBpbnQgZmVhdHVyZSk7CitpbnQgcmVjYWxjdWxhdGVfcG9vbF9jaHVua19zaXplX3dpdGhfZGV2X2hpbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJCQkJICAgICAgIGludCBwYXNzZWRfYXJncywKKwkJCQkJICAgICAgIGludCBjaHVua19zaXplX2NhbGNfcG9saWN5KTsKK2ludCB2YWxpZGF0ZV9wb29sX2NodW5rX3NpemUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsIHVpbnQzMl90IGNodW5rX3NpemUpOworaW50IHVwZGF0ZV9wb29sX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBhY3RpdmF0ZSk7CitpbnQgdXBkYXRlX3Bvb2xfcGFyYW1zKGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdW5zaWduZWQgdGFyZ2V0X2F0dHIsCisJCSAgICAgICBpbnQgcGFzc2VkX2FyZ3MsIHVpbnQzMl90IHBvb2xfZGF0YV9leHRlbnRzLAorCQkgICAgICAgdWludDMyX3QgKnBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJICAgICAgIGludCAqY2h1bmtfc2l6ZV9jYWxjX3BvbGljeSwgdWludDMyX3QgKmNodW5rX3NpemUsCisJCSAgICAgICB0aGluX2Rpc2NhcmRzX3QgKmRpc2NhcmRzLCBpbnQgKnplcm8pOworaW50IHVwZGF0ZV9wcm9maWxhYmxlX3Bvb2xfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkgIGludCBwYXNzZWRfYXJncywgaW50ICpjaHVua19zaXplX2NhbGNfbWV0aG9kLAorCQkJCSAgdWludDMyX3QgKmNodW5rX3NpemUsIHRoaW5fZGlzY2FyZHNfdCAqZGlzY2FyZHMsCisJCQkJICBpbnQgKnplcm8pOworaW50IHVwZGF0ZV90aGluX3Bvb2xfcGFyYW1zKGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUsCisJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVuc2lnbmVkIGF0dHIsCisJCQkgICAgaW50IHBhc3NlZF9hcmdzLCB1aW50MzJfdCBwb29sX2RhdGFfZXh0ZW50cywKKwkJCSAgICB1aW50MzJfdCAqcG9vbF9tZXRhZGF0YV9leHRlbnRzLAorCQkJICAgIGludCAqY2h1bmtfc2l6ZV9jYWxjX21ldGhvZCwgdWludDMyX3QgKmNodW5rX3NpemUsCisJCQkgICAgdGhpbl9kaXNjYXJkc190ICpkaXNjYXJkcywgaW50ICp6ZXJvKTsKK2NvbnN0IGNoYXIgKmdldF9wb29sX2Rpc2NhcmRzX25hbWUodGhpbl9kaXNjYXJkc190IGRpc2NhcmRzKTsKK2ludCBzZXRfcG9vbF9kaXNjYXJkcyh0aGluX2Rpc2NhcmRzX3QgKmRpc2NhcmRzLCBjb25zdCBjaGFyICpzdHIpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICphbGxvY19wb29sX21ldGFkYXRhKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgcmVhZF9haGVhZCwKKwkJCQkJICAgdWludDMyX3Qgc3RyaXBlcywgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJCSAgIHVpbnQzMl90IGV4dGVudHMsIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqcHZoKTsKK2ludCBoYW5kbGVfcG9vbF9tZXRhZGF0YV9zcGFyZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdWludDMyX3QgZXh0ZW50cywKKwkJCSAgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcHZoLCBpbnQgcG9vbG1ldGFkYXRhc3BhcmUpOworaW50IHZnX3NldF9wb29sX21ldGFkYXRhX3NwYXJlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IHZnX3JlbW92ZV9wb29sX21ldGFkYXRhX3NwYXJlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworaW50IGF0dGFjaF90aGluX2V4dGVybmFsX29yaWdpbihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZXh0ZXJuYWxfbHYpOworaW50IGRldGFjaF90aGluX2V4dGVybmFsX29yaWdpbihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK2ludCBhdHRhY2hfcG9vbF9tZXRhZGF0YV9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqcG9vbF9zZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX21ldGFkYXRhX2x2KTsKK2ludCBkZXRhY2hfcG9vbF9tZXRhZGF0YV9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqcG9vbF9zZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqcG9vbF9tZXRhZGF0YV9sdik7CitpbnQgYXR0YWNoX3Bvb2xfZGF0YV9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqcG9vbF9zZWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfZGF0YV9sdik7CitpbnQgaXNfbWlycm9yX2ltYWdlX3JlbW92YWJsZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1pbWFnZV9sdiwgdm9pZCAqYmF0b24pOworCisvKgorICogQWN0aXZhdGlvbiBvcHRpb25zCisgKi8KK3R5cGVkZWYgZW51bSBhY3RpdmF0aW9uX2NoYW5nZSB7CisJQ0hBTkdFX0FZID0gMCwgIC8qIGFjdGl2YXRlICovCisJQ0hBTkdFX0FOID0gMSwgIC8qIGRlYWN0aXZhdGUgKi8KKwlDSEFOR0VfQUVZID0gMiwgLyogYWN0aXZhdGUgZXhjbHVzaXZlbHkgKi8KKwlDSEFOR0VfQUxZID0gMywgLyogYWN0aXZhdGUgbG9jYWxseSAqLworCUNIQU5HRV9BTE4gPSA0LCAvKiBkZWFjdGl2YXRlIGxvY2FsbHkgKi8KKwlDSEFOR0VfQUFZID0gNSwgLyogYXV0b21hdGljIGFjdGl2YXRpb24gKi8KKwlDSEFOR0VfQVNZID0gNiAgLyogYWN0aXZhdGUgc2hhcmVkICovCit9IGFjdGl2YXRpb25fY2hhbmdlX3Q7CisKKy8qIFJldHVybnMgdHJ1ZSwgd2hlbiBjaGFuZ2UgYWN0aXZhdGVzIGRldmljZSAqLworc3RhdGljIGlubGluZSBpbnQgaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGlvbl9jaGFuZ2VfdCBjaGFuZ2UpCit7CisgICAgICAgIHJldHVybiAoKGNoYW5nZSAhPSBDSEFOR0VfQU4pICYmIChjaGFuZ2UgIT0gQ0hBTkdFX0FMTikpOworfQorCisvKiBGSVhNRTogcmVmYWN0b3IgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGlzIHN0cnVjdCEgKi8KK3N0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgeworCS8qIGZsYWdzICovCisJaW50IHNuYXBzaG90OyAvKiBzbmFwICovCisJaW50IGNyZWF0ZV9wb29sOyAvKiBwb29scyAqLworCWludCB6ZXJvOyAvKiBhbGwgKi8KKwlpbnQgd2lwZV9zaWduYXR1cmVzOyAvKiBhbGwgKi8KKwlpbnQzMl90IG1ham9yOyAvKiBhbGwgKi8KKwlpbnQzMl90IG1pbm9yOyAvKiBhbGwgKi8KKwlpbnQgbG9nX2NvdW50OyAvKiBtaXJyb3IgKi8KKwlpbnQgbm9zeW5jOyAvKiBtaXJyb3IgKi8KKwlpbnQgcG9vbF9tZXRhZGF0YV9zcGFyZTsgLyogcG9vbHMgKi8KKwlpbnQgdHlwZTsgICAvKiB0eXBlIGFyZyBpcyBnaXZlbiAqLworCWludCB0ZW1wb3Jhcnk7IC8qIHRlbXBvcmFyeSBMViAqLworI2RlZmluZSBBQ1RJVkFUSU9OX1NLSVBfU0VUCQkweDAxIC8qIHJlcXVlc3QgdG8gc2V0IExWIGFjdGl2YXRpb24gc2tpcCBmbGFnIHN0YXRlICovCisjZGVmaW5lIEFDVElWQVRJT05fU0tJUF9TRVRfRU5BQkxFRAkweDAyIC8qIHNldCB0aGUgTFYgYWN0aXZhdGlvbiBza2lwIGZsYWcgc3RhdGUgdG8gJ2VuYWJsZWQnICovCisjZGVmaW5lIEFDVElWQVRJT05fU0tJUF9JR05PUkUJCTB4MDQgLyogcmVxdWVzdCB0byBpZ25vcmUgTFYgYWN0aXZhdGlvbiBza2lwIGZsYWcgKGlmIGFueSkgKi8KKwlpbnQgYWN0aXZhdGlvbl9za2lwOyAvKiBhY3RpdmF0aW9uIHNraXAgZmxhZ3MgKi8KKwlhY3RpdmF0aW9uX2NoYW5nZV90IGFjdGl2YXRlOyAvKiBub24tc25hcHNob3QsIG5vbi1taXJyb3IgKi8KKwl0aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7ICAgICAvKiB0aGluICovCisjZGVmaW5lIFRISU5fQ0hVTktfU0laRV9DQUxDX01FVEhPRF9HRU5FUklDIDB4MDEKKyNkZWZpbmUgVEhJTl9DSFVOS19TSVpFX0NBTENfTUVUSE9EX1BFUkZPUk1BTkNFIDB4MDIKKwlpbnQgdGhpbl9jaHVua19zaXplX2NhbGNfcG9saWN5OworCXVuc2lnbmVkIHN1cHByZXNzX3plcm9fd2FybiA6IDE7CisJdW5zaWduZWQgbmVlZHNfbG9ja2RfaW5pdCA6IDE7CisKKwljb25zdCBjaGFyICp2Z19uYW1lOyAvKiBvbmx5LXVzZWQgd2hlbiBWRyBpcyBub3QgeWV0IG9wZW5lZCAoaW4gL3Rvb2xzKSAqLworCWNvbnN0IGNoYXIgKmx2X25hbWU7IC8qIGFsbCAqLworCWNvbnN0IGNoYXIgKm9yaWdpbl9uYW1lOyAvKiBzbmFwICovCisJY29uc3QgY2hhciAqcG9vbF9uYW1lOyAgIC8qIHRoaW4gKi8KKworCWNvbnN0IGNoYXIgKmxvY2tfYXJnczsKKworCS8qIEtlZXAgYXJncyBnaXZlbiBieSB0aGUgdXNlciBvbiBjb21tYW5kIGxpbmUgKi8KKwkvKiBGSVhNRTogY3JlYXRlIHNvbWUgbW9yZSB1bml2ZXJzYWwgc29sdXRpb24gaGVyZSAqLworI2RlZmluZSBQQVNTX0FSR19DSFVOS19TSVpFCQkweDAxCisjZGVmaW5lIFBBU1NfQVJHX0RJU0NBUkRTCQkweDAyCisjZGVmaW5lIFBBU1NfQVJHX1BPT0xfTUVUQURBVEFfU0laRQkweDA0CisjZGVmaW5lIFBBU1NfQVJHX1pFUk8JCQkweDA4CisJaW50IHBhc3NlZF9hcmdzOworCisJdWludDMyX3Qgc3RyaXBlczsgLyogc3RyaXBlZCAqLworCXVpbnQzMl90IHN0cmlwZV9zaXplOyAvKiBzdHJpcGVkICovCisJdWludDMyX3QgY2h1bmtfc2l6ZTsgLyogc25hcHNob3QgKi8KKwl1aW50MzJfdCByZWdpb25fc2l6ZTsgLyogbWlycm9yICovCisKKwl1aW50MzJfdCBtaXJyb3JzOyAvKiBtaXJyb3IgKi8KKworCXVpbnQzMl90IG1pbl9yZWNvdmVyeV9yYXRlOyAvKiBSQUlEICovCisJdWludDMyX3QgbWF4X3JlY292ZXJ5X3JhdGU7IC8qIFJBSUQgKi8KKworCWNhY2hlX21vZGVfdCBjYWNoZV9tb2RlOyAvKiBjYWNoZSAqLworCWNvbnN0IGNoYXIgKnBvbGljeV9uYW1lOyAvKiBjYWNoZSAqLworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcG9saWN5X3NldHRpbmdzOyAvKiBjYWNoZSAqLworCisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsgLyogYWxsICovCisJdW5zaWduZWQgdGFyZ2V0X2F0dHI7IC8qIGFsbCAqLworCisJLyogc2l6ZSAqLworCXVpbnQzMl90IGV4dGVudHM7IC8qIGFsbCAqLworCXVpbnQzMl90IHBvb2xfbWV0YWRhdGFfZXh0ZW50czsgLyogcG9vbHMgKi8KKwl1aW50NjRfdCBwb29sX21ldGFkYXRhX3NpemU7IC8qIHBvb2xzICovCisJdWludDMyX3QgcG9vbF9kYXRhX2V4dGVudHM7IC8qIHBvb2xzICovCisJdWludDY0X3QgcG9vbF9kYXRhX3NpemU7IC8qIHBvb2xzICovCisJdWludDMyX3QgdmlydHVhbF9leHRlbnRzOyAvKiBzbmFwc2hvdHMsIHRoaW5zICovCisJc3RydWN0IGRtX2xpc3QgKnB2aDsgLyogYWxsICovCisKKwl1aW50NjRfdCBwZXJtaXNzaW9uOyAvKiBhbGwgKi8KKwl1bnNpZ25lZCBlcnJvcl93aGVuX2Z1bGw7IC8qIHdoZW4gc2VnbWVudCBzdXBwb3J0cyBpdCAqLworCXVpbnQzMl90IHJlYWRfYWhlYWQ7IC8qIGFsbCAqLworCWludCBhcHByb3hfYWxsb2M7ICAgICAvKiBhbGwgKi8KKwlhbGxvY19wb2xpY3lfdCBhbGxvYzsgLyogYWxsICovCisKKwlzdHJ1Y3QgZG1fbGlzdCB0YWdzOwkvKiBhbGwgKi8KKworCWludCB5ZXM7CisJZm9yY2VfdCBmb3JjZTsKK307CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfY3JlYXRlX3NpbmdsZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHApOworCisvKgorICogVGhlIGFjdGl2YXRpb24gY2FuIGJlIHNraXBwZWQgZm9yIHNlbGVjdGVkIExWcy4gU29tZSBMVnMgYXJlIHNraXBwZWQKKyAqIGJ5IGRlZmF1bHQgKGUuZy4gdGhpbiBzbmFwc2hvdHMpLCBvdGhlcnMgY2FuIGJlIHNraXBwZWQgb24gZGVtYW5kIGJ5CisgKiBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4gVGhlIGZsYWcgdGhhdCBjYXVzZXMgdGhlIGFjdGl2YXRpb24KKyAqIHNraXAgb24gbmV4dCBhY3RpdmF0aW9ucyBpcyBzdG9yZWQgZGlyZWN0bHkgaW4gbWV0YWRhdGEgZm9yIGVhY2ggTFYKKyAqIGFzIEFDVElWQVRJT05fU0tJUCBmbGFnLgorICovCit2b2lkIGx2X3NldF9hY3RpdmF0aW9uX3NraXAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IG92ZXJyaWRlX2RlZmF1bHQsIGludCBhZGRfc2tpcF9mbGFnKTsKK2ludCBsdl9hY3RpdmF0aW9uX3NraXAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgYWN0aXZhdGlvbl9jaGFuZ2VfdCBhY3RpdmF0ZSwKKwkJICAgICAgIGludCBvdmVycmlkZV9sdl9za2lwX2ZsYWcpOworCisvKgorICogRnVuY3Rpb25zIGZvciBsYXllciBtYW5pcHVsYXRpb24KKyAqLworaW50IGluc2VydF9sYXllcl9mb3Jfc2VnbWVudHNfb25fcHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfd2hlcmUsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYsCisJCQkJICAgIHVpbnQ2NF90IHN0YXR1cywKKwkJCQkgICAgc3RydWN0IHB2X2xpc3QgKnB2LAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQpOworaW50IHJlbW92ZV9sYXllcnNfZm9yX3NlZ21lbnRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsYXllcl9sdiwKKwkJCSAgICAgICB1aW50NjRfdCBzdGF0dXNfbWFzaywgc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkKTsKK2ludCByZW1vdmVfbGF5ZXJzX2Zvcl9zZWdtZW50c19hbGwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsYXllcl9sdiwKKwkJCQkgICB1aW50NjRfdCBzdGF0dXNfbWFzaywKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQpOworaW50IHNwbGl0X3BhcmVudF9zZWdtZW50c19mb3JfbGF5ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbGF5ZXJfbHYpOworaW50IHJlbW92ZV9sYXllcl9mcm9tX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsYXllcl9sdik7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmluc2VydF9sYXllcl9mb3JfbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfd2hlcmUsCisJCQkJCSAgIHVpbnQ2NF90IHN0YXR1cywKKwkJCQkJICAgY29uc3QgY2hhciAqbGF5ZXJfc3VmZml4KTsKKworLyogRmluZCBhIFBWIHdpdGhpbiBhIGdpdmVuIFZHICovCitzdHJ1Y3QgcHZfbGlzdCAqZmluZF9wdl9pbl92Zyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnB2X25hbWUpOworc3RydWN0IHB2X2xpc3QgKmZpbmRfcHZfaW5fdmdfYnlfdXVpZChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaWQgKmlkKTsKKworLyogRmluZCBhbiBMViB3aXRoaW4gYSBnaXZlbiBWRyAqLworc3RydWN0IGx2X2xpc3QgKmZpbmRfbHZfaW5fdmcoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgICBjb25zdCBjaGFyICpsdl9uYW1lKTsKKworLyogRklYTUUgTWVyZ2UgdGhlc2UgZnVuY3Rpb25zIHdpdGggb25lcyBhYm92ZSAqLworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpmaW5kX2x2KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmx2X25hbWUpOworCitzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqZmluZF9oaXN0b3JpY2FsX2dsdihjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJCSAgICBjb25zdCBjaGFyICpoaXN0b3JpY2FsX2x2X25hbWUsCisJCQkJCQkgICAgaW50IGNoZWNrX3JlbW92ZWRfbGlzdCwKKwkJCQkJCSAgICBzdHJ1Y3QgZ2x2X2xpc3QgKipnbHZsX2ZvdW5kKTsKKworaW50IGx2X25hbWVfaXNfdXNlZF9pbl92Zyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqbmFtZSwgaW50ICpoaXN0b3JpY2FsKTsKKworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqZmluZF9wdl9ieV9uYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQljb25zdCBjaGFyICpwdl9uYW1lLAorCQkJCQlpbnQgYWxsb3dfb3JwaGFuLCBpbnQgYWxsb3dfdW5mb3JtYXR0ZWQpOworCitjb25zdCBjaGFyICpmaW5kX3ZnbmFtZV9mcm9tX3B2bmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgY29uc3QgY2hhciAqcHZuYW1lKTsKK2NvbnN0IGNoYXIgKmZpbmRfdmduYW1lX2Zyb21fcHZpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIGNvbnN0IGNoYXIgKnB2aWQpOworCitpbnQgbHZfaXNfb25fcHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworaW50IGx2X2lzX29uX3B2cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgZG1fbGlzdCAqcHZzKTsKK2ludCBnZXRfcHZfbGlzdF9mb3JfbHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBkbV9saXN0ICpwdnMpOworCisKKy8qIEZpbmQgTFYgc2VnbWVudCBjb250YWluaW5nIGdpdmVuIExFICovCitzdHJ1Y3QgbHZfc2VnbWVudCAqZmlyc3Rfc2VnKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGx2X3NlZ21lbnQgKmxhc3Rfc2VnKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGx2X3NlZ21lbnQgKmdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworLyoKKyogVXNlZnVsIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgc25hcHNob3RzLgorKi8KK2ludCBsdl9pc19vcmlnaW4oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfdGhpbl9vcmlnaW4oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdW5zaWduZWQgKnNuYXBfY291bnQpOworaW50IGx2X2lzX2NhY2hlX29yaWdpbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9pc19jb3coY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfbWVyZ2luZ19jb3coY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjb3cpOwordWludDMyX3QgY293X21heF9leHRlbnRzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luLCB1aW50MzJfdCBjaHVua19zaXplKTsKK2ludCBjb3dfaGFzX21pbl9jaHVua3MoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IGNvd19leHRlbnRzLCB1aW50MzJfdCBjaHVua19zaXplKTsKK2ludCBsdl9pc19jb3dfY292ZXJpbmdfb3JpZ2luKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBUZXN0IGlmIGdpdmVuIExWIGlzIHZpc2libGUgZnJvbSB1c2VyJ3MgcGVyc3BlY3RpdmUgKi8KK2ludCBsdl9pc192aXNpYmxlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCitpbnQgbHZfaXNfaGlzdG9yaWNhbChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IHB2X2lzX2luX3ZnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CisKKy8qIEdpdmVuIGEgY293IG9yIHRoaW4gTFYsIHJldHVybiB0aGUgc25hcHNob3QgbHZfc2VnbWVudCB0aGF0IHVzZXMgaXQgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpmaW5kX3NuYXBzaG90KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBHaXZlbiBhIGNvdyBMViwgcmV0dXJuIGl0cyBvcmlnaW4gKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2Zyb21fY293KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBHaXZlbiBhbiBpbnRlcm5hbCBzbmFwc2hvdCBMViwgcmV0dXJuIGl0cyBjb3cgKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9jb3coY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzbmFwKTsKKwordm9pZCBpbml0X3NuYXBzaG90X3NlZyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbiwKKwkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY293LCB1aW50MzJfdCBjaHVua19zaXplLCBpbnQgbWVyZ2UpOworCit2b2lkIGluaXRfc25hcHNob3RfbWVyZ2Uoc3RydWN0IGx2X3NlZ21lbnQgKnNuYXBfc2VnLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbik7CisKK3ZvaWQgY2xlYXJfc25hcHNob3RfbWVyZ2Uoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW4pOworCitpbnQgdmdfYWRkX3NuYXBzaG90KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvdywKKwkJICAgIHVuaW9uIGx2aWQgKmx2aWQsIHVpbnQzMl90IGV4dGVudF9jb3VudCwKKwkJICAgIHVpbnQzMl90IGNodW5rX3NpemUpOworCitpbnQgdmdfcmVtb3ZlX3NuYXBzaG90KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY293KTsKKworaW50IHZnX2NoZWNrX3N0YXR1cyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdWludDY0X3Qgc3RhdHVzKTsKKworaW50IHZnX2NoZWNrX3B2X2Rldl9ibG9ja19zaXplcyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgVkcgcmVhY2hlZCBtYXhpbWFsIExWcyBjb3VudCAoaWYgc2V0KQorICovCitpbnQgdmdfbWF4X2x2X3JlYWNoZWQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCisvKgorKiBNaXJyb3JpbmcgZnVuY3Rpb25zCisqLworaW50IGdldF9kZWZhdWx0X3JlZ2lvbl9zaXplKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsgIC8qIGluIGx2X21hbmlwLmMgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpmaW5kX21pcnJvcl9zZWcoc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitpbnQgbHZfYWRkX21pcnJvcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IHN0cmlwZXMsIHVpbnQzMl90IHN0cmlwZV9zaXplLAorCQkgICB1aW50MzJfdCByZWdpb25fc2l6ZSwgdWludDMyX3QgbG9nX2NvdW50LAorCQkgICBzdHJ1Y3QgZG1fbGlzdCAqcHZzLCBhbGxvY19wb2xpY3lfdCBhbGxvYywgdWludDMyX3QgZmxhZ3MpOworaW50IGx2X3NwbGl0X21pcnJvcl9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3QgY2hhciAqc3BsaXRfbHZfbmFtZSwKKwkJCSAgIHVpbnQzMl90IHNwbGl0X2NvdW50LCBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhYmxlX3B2cyk7CitpbnQgbHZfcmVtb3ZlX21pcnJvcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IGxvZ19jb3VudCwKKwkJICAgICAgaW50ICgqaXNfcmVtb3ZhYmxlKShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKiwgdm9pZCAqKSwKKwkJICAgICAgdm9pZCAqcmVtb3ZhYmxlX2JhdG9uLCB1aW50NjRfdCBzdGF0dXNfbWFzayk7Citjb25zdCBjaGFyICpnZXRfbWlycm9yX2xvZ19uYW1lKGludCBsb2dfY291bnQpOworaW50IHNldF9taXJyb3JfbG9nX2NvdW50KGludCAqbG9nX2NvdW50LCBjb25zdCBjaGFyICptaXJyb3Jsb2cpOworCitpbnQgY2x1c3Rlcl9taXJyb3JfaXNfYXZhaWxhYmxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK2ludCBpc190ZW1wb3JhcnlfbWlycm9yX2xheWVyKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICogZmluZF90ZW1wb3JhcnlfbWlycm9yKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOwordWludDMyX3QgbHZfbWlycm9yX2NvdW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCisvKiBSZW1vdmUgQ01JUlJPUl9SRUdJT05fQ09VTlRfTElNSVQgd2hlbiBodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS82ODI3NzEgaXMgZml4ZWQgKi8KKyNkZWZpbmUgQ01JUlJPUl9SRUdJT05fQ09VTlRfTElNSVQgKDI1NioxMDI0ICogOCkKK3VpbnQzMl90IGFkanVzdGVkX21pcnJvcl9yZWdpb25fc2l6ZSh1aW50MzJfdCBleHRlbnRfc2l6ZSwgdWludDMyX3QgZXh0ZW50cywKKwkJCQkgICAgIHVpbnQzMl90IHJlZ2lvbl9zaXplLCBpbnQgaW50ZXJuYWwsIGludCBjbHVzdGVyZWQpOworCitpbnQgcmVtb3ZlX21pcnJvcnNfZnJvbV9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSB1aW50MzJfdCBuZXdfbWlycm9ycywgdWludDY0X3Qgc3RhdHVzX21hc2spOworaW50IGFkZF9taXJyb3JzX3RvX3NlZ21lbnRzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnMsIGFsbG9jX3BvbGljeV90IGFsbG9jKTsKKworaW50IHJlbW92ZV9taXJyb3JfaW1hZ2VzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IG51bV9taXJyb3JzLAorCQkJIGludCAoKmlzX3JlbW92YWJsZSkoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICosIHZvaWQgKiksCisJCQkgdm9pZCAqcmVtb3ZhYmxlX2JhdG9uLCB1bnNpZ25lZCByZW1vdmVfbG9nKTsKK2ludCBhZGRfbWlycm9yX2ltYWdlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgdWludDMyX3QgbWlycm9ycywgdWludDMyX3Qgc3RyaXBlcywgdWludDMyX3Qgc3RyaXBlX3NpemUsIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzLCBhbGxvY19wb2xpY3lfdCBhbGxvYywKKwkJICAgICAgdWludDMyX3QgbG9nX2NvdW50KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZGV0YWNoX21pcnJvcl9sb2coc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitpbnQgYXR0YWNoX21pcnJvcl9sb2coc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgcmVtb3ZlX21pcnJvcl9sb2coc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIHN0cnVjdCBkbV9saXN0ICpyZW1vdmFibGVfcHZzLCBpbnQgZm9yY2UpOworaW50IGFkZF9taXJyb3JfbG9nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICB1aW50MzJfdCBsb2dfY291bnQsIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCQkgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzLCBhbGxvY19wb2xpY3lfdCBhbGxvYyk7CisKKyNpZiAwCisvKiBGSVhNRTogcmVjb25maWd1cmVfbWlycm9yX2ltYWdlczogcmVtb3ZlIHRoaXMgY29kZT8gKi8KK2ludCByZWNvbmZpZ3VyZV9taXJyb3JfaW1hZ2VzKHN0cnVjdCBsdl9zZWdtZW50ICptaXJyb3JlZF9zZWcsIHVpbnQzMl90IG51bV9taXJyb3JzLAorCQkJICAgICAgc3RydWN0IGRtX2xpc3QgKnJlbW92YWJsZV9wdnMsIHVuc2lnbmVkIHJlbW92ZV9sb2cpOworI2VuZGlmCitpbnQgY29sbGFwc2VfbWlycm9yZWRfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgc2hpZnRfbWlycm9yX2ltYWdlcyhzdHJ1Y3QgbHZfc2VnbWVudCAqbWlycm9yZWRfc2VnLCB1bnNpZ25lZCBtaW1hZ2UpOworCisvKiArKyAgbWV0YWRhdGEvcmVwbGljYXRvcl9tYW5pcC5jICovCitpbnQgcmVwbGljYXRvcl9hZGRfcmVwbGljYXRvcl9kZXYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpyZXBsaWNhdG9yX2x2LAorCQkJCSAgc3RydWN0IGx2X3NlZ21lbnQgKnJkZXZfc2VnKTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcl9yZW1vdmVfcmVwbGljYXRvcl9kZXYoc3RydWN0IGx2X3NlZ21lbnQgKnJkZXZfc2VnKTsKK2ludCByZXBsaWNhdG9yX2FkZF9ybG9nKHN0cnVjdCBsdl9zZWdtZW50ICpyZXBsaWNhdG9yX3NlZywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpybG9nX2x2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcl9yZW1vdmVfcmxvZyhzdHJ1Y3QgbHZfc2VnbWVudCAqcmVwbGljYXRvcl9zZWcpOworCitpbnQgcmVwbGljYXRvcl9kZXZfYWRkX3Nsb2coc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2LCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnNsb2dfbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpyZXBsaWNhdG9yX2Rldl9yZW1vdmVfc2xvZyhzdHJ1Y3QgcmVwbGljYXRvcl9kZXZpY2UgKnJkZXYpOworaW50IHJlcGxpY2F0b3JfZGV2X2FkZF9yaW1hZ2Uoc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2LCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcl9kZXZfcmVtb3ZlX3JpbWFnZShzdHJ1Y3QgcmVwbGljYXRvcl9kZXZpY2UgKnJkZXYpOworCitpbnQgbHZfaXNfYWN0aXZlX3JlcGxpY2F0b3JfZGV2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2lzX3JlcGxpY2F0b3IoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfcmVwbGljYXRvcl9kZXYoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgbHZfaXNfcmltYWdlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IGx2X2lzX3Nsb2coY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpcnN0X3JlcGxpY2F0b3JfZGV2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworLyogLS0gIG1ldGFkYXRhL3JlcGxpY2F0b3JfbWFuaXAuYyAqLworCisvKiArKyAgbWV0YWRhdGEvcmFpZF9tYW5pcC5jICovCitpbnQgbHZfaXNfcmFpZF93aXRoX3RyYWNraW5nKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOwordWludDMyX3QgbHZfcmFpZF9pbWFnZV9jb3VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9yYWlkX2NoYW5nZV9pbWFnZV9jb3VudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIHVpbnQzMl90IG5ld19jb3VudCwgc3RydWN0IGRtX2xpc3QgKnB2cyk7CitpbnQgbHZfcmFpZF9zcGxpdChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBjaGFyICpzcGxpdF9uYW1lLAorCQkgIHVpbnQzMl90IG5ld19jb3VudCwgc3RydWN0IGRtX2xpc3QgKnNwbGl0dGFibGVfcHZzKTsKK2ludCBsdl9yYWlkX3NwbGl0X2FuZF90cmFjayhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICpzcGxpdHRhYmxlX3B2cyk7CitpbnQgbHZfcmFpZF9tZXJnZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCBsdl9yYWlkX2NvbnZlcnQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKm5ld19zZWd0eXBlLAorCQkgICAgaW50IHllcywgaW50IGZvcmNlLAorCQkgICAgY29uc3QgdW5zaWduZWQgc3RyaXBlcywKKwkJICAgIGNvbnN0IHVuc2lnbmVkIG5ld19zdHJpcGVfc2l6ZSwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMpOworaW50IGx2X3JhaWRfcmVwbGFjZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZlX3B2cywKKwkJICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMpOworaW50IGx2X3JhaWRfcmVtb3ZlX21pc3Npbmcoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgcGFydGlhbF9yYWlkX2x2X3N1cHBvcnRzX2RlZ3JhZGVkX2FjdGl2YXRpb24oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisvKiAtLSAgbWV0YWRhdGEvcmFpZF9tYW5pcC5jICovCisKKy8qICsrICBtZXRhZGF0YS9jYWNoZV9tYW5pcC5jICovCitzdHJ1Y3QgbHZfc3RhdHVzX2NhY2hlIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBkbV9zdGF0dXNfY2FjaGUgKmNhY2hlOworCWRtX3BlcmNlbnRfdCBkYXRhX3VzYWdlOworCWRtX3BlcmNlbnRfdCBtZXRhZGF0YV91c2FnZTsKKwlkbV9wZXJjZW50X3QgZGlydHlfdXNhZ2U7Cit9OworCitjb25zdCBjaGFyICpkaXNwbGF5X2NhY2hlX21vZGUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7Citjb25zdCBjaGFyICpnZXRfY2FjaGVfbW9kZV9uYW1lKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpjYWNoZV9zZWcpOworaW50IHNldF9jYWNoZV9tb2RlKGNhY2hlX21vZGVfdCAqbW9kZSwgY29uc3QgY2hhciAqY2FjaGVfbW9kZSk7CitpbnQgY2FjaGVfc2V0X2NhY2hlX21vZGUoc3RydWN0IGx2X3NlZ21lbnQgKmNhY2hlX3NlZywgY2FjaGVfbW9kZV90IG1vZGUpOworaW50IGNhY2hlX3NldF9wb2xpY3koc3RydWN0IGx2X3NlZ21lbnQgKmNhY2hlX3NlZywgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnNldHRpbmdzKTsKK2ludCBjYWNoZV9zZXRfcGFyYW1zKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCSAgICAgY2FjaGVfbW9kZV90IG1vZGUsCisJCSAgICAgY29uc3QgY2hhciAqcG9saWN5X25hbWUsCisJCSAgICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpwb2xpY3lfc2V0dGluZ3MsCisJCSAgICAgdWludDMyX3QgY2h1bmtfc2l6ZSk7Cit2b2lkIGNhY2hlX2NoZWNrX2Zvcl93YXJucyhjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKK2ludCB1cGRhdGVfY2FjaGVfcG9vbF9wYXJhbXMoY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJCSAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVuc2lnbmVkIGF0dHIsCisJCQkgICAgIGludCBwYXNzZWRfYXJncywgdWludDMyX3QgcG9vbF9kYXRhX2V4dGVudHMsCisJCQkgICAgIHVpbnQzMl90ICpwb29sX21ldGFkYXRhX2V4dGVudHMsCisJCQkgICAgIGludCAqY2h1bmtfc2l6ZV9jYWxjX21ldGhvZCwgdWludDMyX3QgKmNodW5rX3NpemUpOworaW50IHZhbGlkYXRlX2x2X2NhY2hlX2NodW5rX3NpemUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2LCB1aW50MzJfdCBjaHVua19zaXplKTsKK2ludCB2YWxpZGF0ZV9sdl9jYWNoZV9jcmVhdGVfcG9vbChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYpOworaW50IHZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9vcmlnaW4oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW5fbHYpOworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9jYWNoZV9jcmVhdGUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sLAorCQkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbik7CitpbnQgbHZfY2FjaGVfd2FpdF9mb3JfY2xlYW4oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9sdiwgaW50ICppc19jbGVhbik7CitpbnQgbHZfY2FjaGVfcmVtb3ZlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY2FjaGVfbHYpOworaW50IHdpcGVfY2FjaGVfcG9vbChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNhY2hlX3Bvb2xfbHYpOworLyogLS0gIG1ldGFkYXRhL2NhY2hlX21hbmlwLmMgKi8KKworc3RydWN0IGNtZF92ZyAqY21kX3ZnX2FkZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqY21kX3ZncywKKwkJCSAgY29uc3QgY2hhciAqdmdfbmFtZSwgY29uc3QgY2hhciAqdmdpZCwKKwkJCSAgdWludDMyX3QgZmxhZ3MpOworc3RydWN0IGNtZF92ZyAqY21kX3ZnX2xvb2t1cChzdHJ1Y3QgZG1fbGlzdCAqY21kX3ZncywKKwkJCSAgICAgY29uc3QgY2hhciAqdmdfbmFtZSwgY29uc3QgY2hhciAqdmdpZCk7CitpbnQgY21kX3ZnX3JlYWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpjbWRfdmdzKTsKK3ZvaWQgZnJlZV9jbWRfdmdzKHN0cnVjdCBkbV9saXN0ICpjbWRfdmdzKTsKKworaW50IGZpbmRfcmVwbGljYXRvcl92Z3MoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CisKK2ludCBsdl9yZWFkX3JlcGxpY2F0b3JfdmdzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOwordm9pZCBsdl9yZWxlYXNlX3JlcGxpY2F0b3JfdmdzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpbmRfcHZtb3ZlX2x2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDY0X3QgbHZfdHlwZSk7Citjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpbmRfcHZtb3ZlX2x2X2luX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworY29uc3QgY2hhciAqZ2V0X3B2bW92ZV9wdm5hbWVfZnJvbV9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2NvbnN0IGNoYXIgKmdldF9wdm1vdmVfcHZuYW1lX2Zyb21fbHZfbWlycihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIpOworc3RydWN0IGRtX2xpc3QgKmx2c191c2luZ19sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworCit1aW50MzJfdCBmaW5kX2ZyZWVfbHZudW0oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitkbV9wZXJjZW50X3QgY29weV9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlycik7CitjaGFyICpnZW5lcmF0ZV9sdl9uYW1lKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpmb3JtYXQsCisJCSAgICAgICBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pOworCitzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqZ2V0X29yX2NyZWF0ZV9nbHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50ICpnbHZfY3JlYXRlZCk7CitzdHJ1Y3QgZ2x2X2xpc3QgKmdldF9vcl9jcmVhdGVfZ2x2bChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgKmdsdl9jcmVhdGVkKTsKKworLyoKKyogQmVnaW4gc2tlbGV0b24gZm9yIGV4dGVybmFsIExWTSBsaWJyYXJ5CisqLworaW50IHB2X2NoYW5nZV9tZXRhZGF0YWlnbm9yZShzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgdWludDMyX3QgbWRhX2lnbm9yZSk7CisKKworaW50IHZnX2ZsYWdfd3JpdGVfbG9ja2VkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2ludCB2Z19jaGVja193cml0ZV9tb2RlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKyNkZWZpbmUgdmdfaXNfY2x1c3RlcmVkKHZnKSAoKHZnX3N0YXR1cygodmcpKSAmIENMVVNURVJFRCkgPyAxIDogMCkKKyNkZWZpbmUgdmdfaXNfZXhwb3J0ZWQodmcpICgodmdfc3RhdHVzKCh2ZykpICYgRVhQT1JURURfVkcpID8gMSA6IDApCisjZGVmaW5lIHZnX2lzX3Jlc2l6ZWFibGUodmcpICgodmdfc3RhdHVzKCh2ZykpICYgUkVTSVpFQUJMRV9WRykgPyAxIDogMCkKKworaW50IGx2X2hhc191bmtub3duX3NlZ21lbnRzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpOworaW50IHZnX2hhc191bmtub3duX3NlZ21lbnRzKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworaW50IHZnX21hcmtfcGFydGlhbF9sdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBjbGVhcik7CisKK3N0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgeworCWNvbnN0IGNoYXIgKnZnX25hbWU7CisJdWludDMyX3QgZXh0ZW50X3NpemU7CisJc2l6ZV90IG1heF9wdjsKKwlzaXplX3QgbWF4X2x2OworCWFsbG9jX3BvbGljeV90IGFsbG9jOworCWludCBjbHVzdGVyZWQ7IC8qIEZJWE1FOiBwdXQgdGhpcyBpbnRvIGEgJ3N0YXR1cycgdmFyaWFibGUgaW5zdGVhZD8gKi8KKwl1aW50MzJfdCB2Z21ldGFkYXRhY29waWVzOworCWNvbnN0IGNoYXIgKnN5c3RlbV9pZDsKKwljb25zdCBjaGFyICpsb2NrX3R5cGU7CisJY29uc3QgY2hhciAqbG9ja19hcmdzOworfTsKKworaW50IHZhbGlkYXRlX21ham9yX21pbm9yKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJIGludDMyX3QgbWFqb3IsIGludDMyX3QgbWlub3IpOworaW50IHZnY3JlYXRlX3BhcmFtc192YWxpZGF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgc3RydWN0IHZnY3JlYXRlX3BhcmFtcyAqdnApOworCitpbnQgdmFsaWRhdGVfdmdfcmVuYW1lX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWVfb2xkLAorCQkJICAgICAgY29uc3QgY2hhciAqdmdfbmFtZV9uZXcpOworCitpbnQgaXNfbG9ja2RfdHlwZShjb25zdCBjaGFyICpsb2NrX3R5cGUpOworCitpbnQgaXNfc3lzdGVtX2lkX2FsbG93ZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnN5c3RlbV9pZCk7CisKK2ludCB2Z19zdHJpcF9vdXRkYXRlZF9oaXN0b3JpY2FsX2x2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL21ldGFkYXRhLmMgYi9saWIvbWV0YWRhdGEvbWV0YWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzI2NDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL21ldGFkYXRhLmMKQEAgLTAsMCArMSw2NDA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAibHZtLWZpbGUuaCIKKyNpbmNsdWRlICJsdm0tc2lnbmFsLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm1ldGFkLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgInN0cl9saXN0LmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKyNpbmNsdWRlICJsdm1sb2NrZC5oIgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJsdm1ub3RpZnkuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworc3RhdGljIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKl9wdl9yZWFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQlzdHJ1Y3QgZG1fcG9vbCAqcHZtZW0sCisJCQkJCWNvbnN0IGNoYXIgKnB2X25hbWUsCisJCQkJCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJdWludDMyX3Qgd2Fybl9mbGFncywgaW50IHNjYW5fbGFiZWxfb25seSk7CisKK3N0YXRpYyB1aW50MzJfdCBfdmdfYmFkX3N0YXR1c19iaXRzKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICB1aW50NjRfdCBzdGF0dXMpOworCitzdGF0aWMgaW50IF9hbGlnbm1lbnRfb3ZlcnJpZGVzX2RlZmF1bHQodW5zaWduZWQgbG9uZyBkYXRhX2FsaWdubWVudCwKKwkJCQkJdW5zaWduZWQgbG9uZyBkZWZhdWx0X3BlX2FsaWduKQoreworCXJldHVybiBkYXRhX2FsaWdubWVudCAmJiAoZGVmYXVsdF9wZV9hbGlnbiAlIGRhdGFfYWxpZ25tZW50KTsKK30KKwordW5zaWduZWQgbG9uZyBzZXRfcGVfYWxpZ24oc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHVuc2lnbmVkIGxvbmcgZGF0YV9hbGlnbm1lbnQpCit7CisJdW5zaWduZWQgbG9uZyBkZWZhdWx0X3BlX2FsaWduLCB0ZW1wX3BlX2FsaWduOworCisJaWYgKHB2LT5wZV9hbGlnbikKKwkJZ290byBvdXQ7CisKKwlpZiAoZGF0YV9hbGlnbm1lbnQpIHsKKwkJLyogQWx3YXlzIHVzZSBzcGVjaWZpZWQgZGF0YV9hbGlnbm1lbnQgKi8KKwkJcHYtPnBlX2FsaWduID0gZGF0YV9hbGlnbm1lbnQ7CisJCWdvdG8gb3V0OworCX0KKworCWRlZmF1bHRfcGVfYWxpZ24gPSBmaW5kX2NvbmZpZ190cmVlX2ludChwdi0+Zm10LT5jbWQsIGRldmljZXNfZGVmYXVsdF9kYXRhX2FsaWdubWVudF9DRkcsIE5VTEwpOworCisJaWYgKGRlZmF1bHRfcGVfYWxpZ24pCisJCS8qIGFsaWduIG9uIDEgTWlCIG11bHRpcGxlICovCisJCWRlZmF1bHRfcGVfYWxpZ24gKj0gREVGQVVMVF9QRV9BTElHTjsKKwllbHNlCisJCS8qIGFsaWduIG9uIDY0IEtpQiBtdWx0aXBsZSAob2xkIGRlZmF1bHQpICovCisJCWRlZmF1bHRfcGVfYWxpZ24gPSBERUZBVUxUX1BFX0FMSUdOX09MRDsKKworCXB2LT5wZV9hbGlnbiA9IE1BWCgoZGVmYXVsdF9wZV9hbGlnbiA8PCBTRUNUT1JfU0hJRlQpLAorCQkJICAgbHZtX2dldHBhZ2VzaXplKCkpID4+IFNFQ1RPUl9TSElGVDsKKworCWlmICghcHYtPmRldikKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEFsaWduIHRvIHN0cmlwZS13aWR0aCBvZiB1bmRlcmx5aW5nIG1kIGRldmljZSBpZiBwcmVzZW50CisJICovCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChwdi0+Zm10LT5jbWQsIGRldmljZXNfbWRfY2h1bmtfYWxpZ25tZW50X0NGRywgTlVMTCkpIHsKKwkJdGVtcF9wZV9hbGlnbiA9IGRldl9tZF9zdHJpcGVfd2lkdGgocHYtPmZtdC0+Y21kLT5kZXZfdHlwZXMsIHB2LT5kZXYpOworCQlpZiAoX2FsaWdubWVudF9vdmVycmlkZXNfZGVmYXVsdCh0ZW1wX3BlX2FsaWduLCBkZWZhdWx0X3BlX2FsaWduKSkKKwkJCXB2LT5wZV9hbGlnbiA9IHRlbXBfcGVfYWxpZ247CisJfQorCisJLyoKKwkgKiBBbGlnbiB0byB0b3BvbG9neSdzIG1pbmltdW1faW9fc2l6ZSBvciBvcHRpbWFsX2lvX3NpemUgaWYgcHJlc2VudAorCSAqIC0gbWluaW11bV9pb19zaXplIC0gdGhlIHNtYWxsZXN0IHJlcXVlc3QgdGhlIGRldmljZSBjYW4gcGVyZm9ybQorCSAqICAgdy9vIGluY3VycmluZyBhIHJlYWQtbW9kaWZ5LXdyaXRlIHBlbmFsdHkgKGUuZy4gTUQncyBjaHVuayBzaXplKQorCSAqIC0gb3B0aW1hbF9pb19zaXplIC0gdGhlIGRldmljZSdzIHByZWZlcnJlZCB1bml0IG9mIHJlY2VpdmluZyBJL08KKwkgKiAgIChlLmcuIE1EJ3Mgc3RyaXBlIHdpZHRoKQorCSAqLworCWlmIChmaW5kX2NvbmZpZ190cmVlX2Jvb2wocHYtPmZtdC0+Y21kLCBkZXZpY2VzX2RhdGFfYWxpZ25tZW50X2RldGVjdGlvbl9DRkcsIE5VTEwpKSB7CisJCXRlbXBfcGVfYWxpZ24gPSBkZXZfbWluaW11bV9pb19zaXplKHB2LT5mbXQtPmNtZC0+ZGV2X3R5cGVzLCBwdi0+ZGV2KTsKKwkJaWYgKF9hbGlnbm1lbnRfb3ZlcnJpZGVzX2RlZmF1bHQodGVtcF9wZV9hbGlnbiwgZGVmYXVsdF9wZV9hbGlnbikpCisJCQlwdi0+cGVfYWxpZ24gPSB0ZW1wX3BlX2FsaWduOworCisJCXRlbXBfcGVfYWxpZ24gPSBkZXZfb3B0aW1hbF9pb19zaXplKHB2LT5mbXQtPmNtZC0+ZGV2X3R5cGVzLCBwdi0+ZGV2KTsKKwkJaWYgKF9hbGlnbm1lbnRfb3ZlcnJpZGVzX2RlZmF1bHQodGVtcF9wZV9hbGlnbiwgZGVmYXVsdF9wZV9hbGlnbikpCisJCQlwdi0+cGVfYWxpZ24gPSB0ZW1wX3BlX2FsaWduOworCX0KKworb3V0OgorCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiBTZXR0aW5nIFBFIGFsaWdubWVudCB0byAlbHUgc2VjdG9ycy4iLAorCQkJIGRldl9uYW1lKHB2LT5kZXYpLCBwdi0+cGVfYWxpZ24pOworCisJcmV0dXJuIHB2LT5wZV9hbGlnbjsKK30KKwordW5zaWduZWQgbG9uZyBzZXRfcGVfYWxpZ25fb2Zmc2V0KHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhX2FsaWdubWVudF9vZmZzZXQpCit7CisJaWYgKHB2LT5wZV9hbGlnbl9vZmZzZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGRhdGFfYWxpZ25tZW50X29mZnNldCkgeworCQkvKiBBbHdheXMgdXNlIHNwZWNpZmllZCBkYXRhX2FsaWdubWVudF9vZmZzZXQgKi8KKwkJcHYtPnBlX2FsaWduX29mZnNldCA9IGRhdGFfYWxpZ25tZW50X29mZnNldDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFwdi0+ZGV2KQorCQlnb3RvIG91dDsKKworCWlmIChmaW5kX2NvbmZpZ190cmVlX2Jvb2wocHYtPmZtdC0+Y21kLCBkZXZpY2VzX2RhdGFfYWxpZ25tZW50X29mZnNldF9kZXRlY3Rpb25fQ0ZHLCBOVUxMKSkgeworCQlpbnQgYWxpZ25fb2Zmc2V0ID0gZGV2X2FsaWdubWVudF9vZmZzZXQocHYtPmZtdC0+Y21kLT5kZXZfdHlwZXMsIHB2LT5kZXYpOworCQkvKiBtdXN0IGhhbmRsZSBhIC0xIGFsaWdubWVudF9vZmZzZXQ7IG1lYW5zIGRldiBpcyBtaXNhbGlnbmVkICovCisJCWlmIChhbGlnbl9vZmZzZXQgPCAwKQorCQkJYWxpZ25fb2Zmc2V0ID0gMDsKKwkJcHYtPnBlX2FsaWduX29mZnNldCA9IE1BWChwdi0+cGVfYWxpZ25fb2Zmc2V0LCBhbGlnbl9vZmZzZXQpOworCX0KKworb3V0OgorCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzOiBTZXR0aW5nIFBFIGFsaWdubWVudCBvZmZzZXQgdG8gJWx1IHNlY3RvcnMuIiwKKwkJCSBkZXZfbmFtZShwdi0+ZGV2KSwgcHYtPnBlX2FsaWduX29mZnNldCk7CisKKwlyZXR1cm4gcHYtPnBlX2FsaWduX29mZnNldDsKK30KKwordm9pZCBhZGRfcHZsX3RvX3ZncyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHB2X2xpc3QgKnB2bCkKK3sKKwlkbV9saXN0X2FkZCgmdmctPnB2cywgJnB2bC0+bGlzdCk7CisJdmctPnB2X2NvdW50Kys7CisJcHZsLT5wdi0+dmcgPSB2ZzsKKwlwdl9zZXRfZmlkKHB2bC0+cHYsIHZnLT5maWQpOworfQorCit2b2lkIGRlbF9wdmxfZnJvbV92Z3Moc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwdl9saXN0ICpwdmwpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisKKwl2Zy0+cHZfY291bnQtLTsKKwlkbV9saXN0X2RlbCgmcHZsLT5saXN0KTsKKworCXB2bC0+cHYtPnZnID0gdmctPmZpZC0+Zm10LT5vcnBoYW5fdmc7IC8qIG9ycGhhbiAqLworCWlmICgoaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKChjb25zdCBjaGFyICopICZwdmwtPnB2LT5pZCwgcHZsLT5wdi0+ZGV2LCAwKSkpCisJCWx2bWNhY2hlX2ZpZF9hZGRfbWRhcyhpbmZvLCB2Zy0+ZmlkLT5mbXQtPm9ycGhhbl92Zy0+ZmlkLAorCQkJCSAgICAgIChjb25zdCBjaGFyICopICZwdmwtPnB2LT5pZCwgSURfTEVOKTsKKwlwdl9zZXRfZmlkKHB2bC0+cHYsIHZnLT5maWQtPmZtdC0+b3JwaGFuX3ZnLT5maWQpOworfQorCisvKioKKyAqIGFkZF9wdl90b192ZyAtIEFkZCBhIHBoeXNpY2FsIHZvbHVtZSB0byBhIHZvbHVtZSBncm91cAorICogQHZnIC0gdm9sdW1lIGdyb3VwIHRvIGFkZCB0bworICogQHB2X25hbWUgLSBuYW1lIG9mIHRoZSBwdiAodG8gYmUgcmVtb3ZlZCkKKyAqIEBwdiAtIHBoeXNpY2FsIHZvbHVtZSB0byBhZGQgdG8gdm9sdW1lIGdyb3VwCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gZmFpbHVyZQorICogIDEgLSBzdWNjZXNzCisgKiBGSVhNRTogcmVtb3ZlIHB2X25hbWUgLSBvYnRhaW4gc2FmZWx5IGZyb20gcHYKKyAqLworc3RhdGljIGludCBhZGRfcHZfdG9fdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJCSAgICAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIGludCBuZXdfcHYpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQgPSB2Zy0+ZmlkOworCXN0cnVjdCBkbV9wb29sICptZW0gPSB2Zy0+dmdtZW07CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJaW50IHVzZWQ7CisKKwlsb2dfdmVyYm9zZSgiQWRkaW5nIHBoeXNpY2FsIHZvbHVtZSAnJXMnIHRvIHZvbHVtZSBncm91cCAnJXMnIiwKKwkJICAgIHB2X25hbWUsIHZnLT5uYW1lKTsKKworCWlmICghKHB2bCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpwdmwpKSkpIHsKKwkJbG9nX2Vycm9yKCJwdl9saXN0IGFsbG9jYXRpb24gZm9yICclcycgZmFpbGVkIiwgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaXNfb3JwaGFuX3ZnKHB2LT52Z19uYW1lKSkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSAnJXMnIGlzIGFscmVhZHkgaW4gdm9sdW1lIGdyb3VwICIKKwkJCSAgIiclcyciLCBwdl9uYW1lLCBwdi0+dmdfbmFtZSk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoIW5ld19wdikgeworCQlpZiAoKHVzZWQgPSBpc191c2VkX3B2KHB2KSkgPCAwKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKHVzZWQpIHsKKwkJCWxvZ19lcnJvcigiUFYgJXMgaXMgdXNlZCBieSBhIFZHIGJ1dCBpdHMgbWV0YWRhdGEgaXMgbWlzc2luZy4iLCBwdl9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHB2LT5mbXQgIT0gZmlkLT5mbXQpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgJXMgaXMgb2YgZGlmZmVyZW50IGZvcm1hdCB0eXBlICglcykiLAorCQkJICBwdl9uYW1lLCBwdi0+Zm10LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRW5zdXJlIFBWIGRvZXNuJ3QgZGVwZW5kIG9uIGFub3RoZXIgUFYgYWxyZWFkeSBpbiB0aGUgVkcgKi8KKwlpZiAocHZfdXNlc192ZyhwdiwgdmcpKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICVzIG1pZ2h0IGJlIGNvbnN0cnVjdGVkIGZyb20gc2FtZSAiCisJCQkgICJ2b2x1bWUgZ3JvdXAgJXMiLCBwdl9uYW1lLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHB2LT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCB2Zy0+bmFtZSkpKSB7CisJCWxvZ19lcnJvcigidmctPm5hbWUgYWxsb2NhdGlvbiBmYWlsZWQgZm9yICclcyciLCBwdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KCZwdi0+dmdpZCwgJnZnLT5pZCwgc2l6ZW9mKHZnLT5pZCkpOworCisJLyogVW5pdHMgb2YgNTEyLWJ5dGUgc2VjdG9ycyAqLworCXB2LT5wZV9zaXplID0gdmctPmV4dGVudF9zaXplOworCisJLyoKKwkgKiBwZV9jb3VudCBtdXN0IGFsd2F5cyBiZSBjYWxjdWxhdGVkIGJ5IHB2X3NldHVwCisJICovCisJcHYtPnBlX2FsbG9jX2NvdW50ID0gMDsKKworCS8qIExWTTEgc3RvcmVzIHRoaXMgb3V0c2lkZSBhIFZHOyBMVk0yIG9ubHkgc3RvcmVzIGl0IGluc2lkZSAqLworCS8qIEZJWE1FIERlZmF1bHQgZnJvbSBjb25maWcgZmlsZT8gdmdleHRlbmQgY21kbGluZSBmbGFnPyAqLworCXB2LT5zdGF0dXMgfD0gQUxMT0NBVEFCTEVfUFY7CisKKwlpZiAoIWZpZC0+Zm10LT5vcHMtPnB2X3NldHVwKGZpZC0+Zm10LCBwdiwgdmcpKSB7CisJCWxvZ19lcnJvcigiRm9ybWF0LXNwZWNpZmljIHNldHVwIG9mIHBoeXNpY2FsIHZvbHVtZSAnJXMnICIKKwkJCSAgImZhaWxlZC4iLCBwdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZpbmRfcHZfaW5fdmcodmcsIHB2X25hbWUpIHx8CisJICAgIGZpbmRfcHZfaW5fdmdfYnlfdXVpZCh2ZywgJnB2LT5pZCkpIHsKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2LT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkgeworCQkJc3RhY2s7CisJCQl1dWlkWzBdID0gJ1wwJzsKKwkJfQorCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSAnJXMgKCVzKScgYWxyZWFkeSBpbiB0aGUgVkcuIiwKKwkJCSAgcHZfbmFtZSwgdXVpZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh2Zy0+cHZfY291bnQgJiYgKHZnLT5wdl9jb3VudCA9PSB2Zy0+bWF4X3B2KSkgeworCQlsb2dfZXJyb3IoIk5vIHNwYWNlIGZvciAnJXMnIC0gdm9sdW1lIGdyb3VwICclcycgIgorCQkJICAiaG9sZHMgbWF4ICVkIHBoeXNpY2FsIHZvbHVtZShzKS4iLCBwdl9uYW1lLAorCQkJICB2Zy0+bmFtZSwgdmctPm1heF9wdik7CisJCXJldHVybiAwOworCX0KKworCWlmICghYWxsb2NfcHZfc2VnbWVudF93aG9sZV9wdihtZW0sIHB2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X2NvdW50ICsgcHYtPnBlX2NvdW50ID4gTUFYX0VYVEVOVF9DT1VOVCkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhZGQgJXMgdG8gJXM6IG5ldyBleHRlbnQgY291bnQgKCUiCisJCQkgIFBSSXU2NCAiKSBleGNlZWRzIGxpbWl0ICglIiBQUkl1MzIgIikuIiwKKwkJCSAgcHZfbmFtZSwgdmctPm5hbWUsCisJCQkgICh1aW50NjRfdCkgdmctPmV4dGVudF9jb3VudCArIHB2LT5wZV9jb3VudCwKKwkJCSAgTUFYX0VYVEVOVF9DT1VOVCk7CisJCXJldHVybiAwOworCX0KKworCXB2bC0+cHYgPSBwdjsKKwlhZGRfcHZsX3RvX3Zncyh2ZywgcHZsKTsKKwl2Zy0+ZXh0ZW50X2NvdW50ICs9IHB2LT5wZV9jb3VudDsKKwl2Zy0+ZnJlZV9jb3VudCArPSBwdi0+cGVfY291bnQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmZmlkLT5mbXQtPm9ycGhhbl92Zy0+cHZzKQorCQlpZiAocHYgPT0gcHZsLT5wdikgeyAvKiB1bmxpbmsgZnJvbSBvcnBoYW4gKi8KKwkJCWRtX2xpc3RfZGVsKCZwdmwtPmxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jb3B5X3B2KHN0cnVjdCBkbV9wb29sICpwdm1lbSwKKwkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2X3RvLAorCQkgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHZfZnJvbSkKK3sKKwltZW1jcHkocHZfdG8sIHB2X2Zyb20sIHNpemVvZigqcHZfdG8pKTsKKworCS8qIFdlIG11c3QgdXNlIHB2X3NldF9maWQgaGVyZSB0byB1cGRhdGUgdGhlIHJlZmVyZW5jZSBjb3VudGVyISAqLworCXB2X3RvLT5maWQgPSBOVUxMOworCXB2X3NldF9maWQocHZfdG8sIHB2X2Zyb20tPmZpZCk7CisKKwlpZiAoIShwdl90by0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKHB2bWVtLCBwdl9mcm9tLT52Z19uYW1lKSkpCisJCXJldHVybl8wOworCisJaWYgKCFzdHJfbGlzdF9kdXAocHZtZW0sICZwdl90by0+dGFncywgJnB2X2Zyb20tPnRhZ3MpKQorCQlyZXR1cm5fMDsKKworCWlmICghcGVnX2R1cChwdm1lbSwgJnB2X3RvLT5zZWdtZW50cywgJnB2X2Zyb20tPnNlZ21lbnRzKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwdl9saXN0ICpfY29weV9wdmwoc3RydWN0IGRtX3Bvb2wgKnB2bWVtLCBzdHJ1Y3QgcHZfbGlzdCAqcHZsX2Zyb20pCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bF90byA9IE5VTEw7CisKKwlpZiAoIShwdmxfdG8gPSBkbV9wb29sX3phbGxvYyhwdm1lbSwgc2l6ZW9mKCpwdmxfdG8pKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEocHZsX3RvLT5wdiA9IGRtX3Bvb2xfYWxsb2MocHZtZW0sIHNpemVvZigqcHZsX3RvLT5wdikpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIV9jb3B5X3B2KHB2bWVtLCBwdmxfdG8tPnB2LCBwdmxfZnJvbS0+cHYpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiBwdmxfdG87CisKK2JhZDoKKwlkbV9wb29sX2ZyZWUocHZtZW0sIHB2bF90byk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnZXRfcHZfZnJvbV92Z19ieV9pZChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSBjb25zdCBjaGFyICp2Z2lkLCBjb25zdCBjaGFyICpwdmlkLAorCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJdWludDMyX3Qgd2Fybl9mbGFncyA9IFdBUk5fUFZfUkVBRCB8IFdBUk5fSU5DT05TSVNURU5UOworCWludCByID0gMCwgY29uc2lzdGVudCA9IDA7CisKKwlpZiAoISh2ZyA9IHZnX3JlYWRfaW50ZXJuYWwoZm10LT5jbWQsIHZnX25hbWUsIHZnaWQsIHdhcm5fZmxhZ3MsICZjb25zaXN0ZW50KSkpIHsKKwkJbG9nX2Vycm9yKCJnZXRfcHZfZnJvbV92Z19ieV9pZDogdmdfcmVhZF9pbnRlcm5hbCBmYWlsZWQgdG8gcmVhZCBWRyAlcyIsCisJCQkgIHZnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlpZiAoaWRfZXF1YWwoJnB2bC0+cHYtPmlkLCAoY29uc3Qgc3RydWN0IGlkICopIHB2aWQpKSB7CisJCQlpZiAoIV9jb3B5X3B2KGZtdC0+Y21kLT5tZW0sIHB2LCBwdmwtPnB2KSkgeworCQkJCWxvZ19lcnJvcigiaW50ZXJuYWwgUFYgZHVwbGljYXRpb24gZmFpbGVkIik7CisJCQkJciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXJlbGVhc2VfdmcodmcpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9tb3ZlX3B2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvLAorCQkgICAgY29uc3QgY2hhciAqcHZfbmFtZSwgaW50IGVuZm9yY2VfcHZfZnJvbV9zb3VyY2UpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCS8qIEZJWE1FOiBoYW5kbGUgdGFncyAqLworCWlmICghKHB2bCA9IGZpbmRfcHZfaW5fdmcodmdfZnJvbSwgcHZfbmFtZSkpKSB7CisJCWlmICghZW5mb3JjZV9wdl9mcm9tX3NvdXJjZSAmJgorCQkgICAgZmluZF9wdl9pbl92Zyh2Z190bywgcHZfbmFtZSkpCisJCQkvKgorCQkJICogUFYgaGFzIGFscmVhZHkgYmVlbiBtb3ZlZC4gIFRoaXMgY2FuIGhhcHBlbiBpZiBhbgorCQkJICogTFYgaXMgYmVpbmcgbW92ZWQgdGhhdCBoYXMgbXVsdGlwbGUgc3ViLUxWcyBvbiB0aGUKKwkJCSAqIHNhbWUgUFYuCisJCQkgKi8KKwkJCXJldHVybiAxOworCisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICVzIG5vdCBpbiB2b2x1bWUgZ3JvdXAgJXMiLAorCQkJICBwdl9uYW1lLCB2Z19mcm9tLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF92Z19iYWRfc3RhdHVzX2JpdHModmdfZnJvbSwgUkVTSVpFQUJMRV9WRykgfHwKKwkgICAgX3ZnX2JhZF9zdGF0dXNfYml0cyh2Z190bywgUkVTSVpFQUJMRV9WRykpCisJCXJldHVybiAwOworCisJZGVsX3B2bF9mcm9tX3Zncyh2Z19mcm9tLCBwdmwpOworCWFkZF9wdmxfdG9fdmdzKHZnX3RvLCBwdmwpOworCisJcHYgPSBwdmwtPnB2OworCisJdmdfZnJvbS0+ZXh0ZW50X2NvdW50IC09IHB2X3BlX2NvdW50KHB2KTsKKwl2Z190by0+ZXh0ZW50X2NvdW50ICs9IHB2X3BlX2NvdW50KHB2KTsKKworCXZnX2Zyb20tPmZyZWVfY291bnQgLT0gcHZfcGVfY291bnQocHYpIC0gcHZfcGVfYWxsb2NfY291bnQocHYpOworCXZnX3RvLT5mcmVlX2NvdW50ICs9IHB2X3BlX2NvdW50KHB2KSAtIHB2X3BlX2FsbG9jX2NvdW50KHB2KTsKKworCXJldHVybiAxOworfQorCitpbnQgbW92ZV9wdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19mcm9tLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190bywKKwkgICAgY29uc3QgY2hhciAqcHZfbmFtZSkKK3sKKwlyZXR1cm4gX21vdmVfcHYodmdfZnJvbSwgdmdfdG8sIHB2X25hbWUsIDEpOworfQorCitpbnQgbW92ZV9wdnNfdXNlZF9ieV9sdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19mcm9tLAorCQkJc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8sCisJCQljb25zdCBjaGFyICpsdl9uYW1lKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpsdnNlZzsKKwl1bnNpZ25lZCBzOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCS8qIEZJWE1FOiBoYW5kbGUgdGFncyAqLworCWlmICghKGx2bCA9IGZpbmRfbHZfaW5fdmcodmdfZnJvbSwgbHZfbmFtZSkpKSB7CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgbm90IGluIHZvbHVtZSBncm91cCAlcyIsCisJCQkgIGx2X25hbWUsIHZnX2Zyb20tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoX3ZnX2JhZF9zdGF0dXNfYml0cyh2Z19mcm9tLCBSRVNJWkVBQkxFX1ZHKSB8fAorCSAgICBfdmdfYmFkX3N0YXR1c19iaXRzKHZnX3RvLCBSRVNJWkVBQkxFX1ZHKSkKKwkJcmV0dXJuIDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZzZWcsICZsdmwtPmx2LT5zZWdtZW50cykgeworCQlpZiAobHZzZWctPmxvZ19sdikKKwkJCWlmICghbW92ZV9wdnNfdXNlZF9ieV9sdih2Z19mcm9tLCB2Z190bywKKwkJCQkJCSAgICAgbHZzZWctPmxvZ19sdi0+bmFtZSkpCisJCQkJcmV0dXJuXzA7CisJCWZvciAocyA9IDA7IHMgPCBsdnNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoc2VnX3R5cGUobHZzZWcsIHMpID09IEFSRUFfUFYpIHsKKwkJCQlpZiAoIV9tb3ZlX3B2KHZnX2Zyb20sIHZnX3RvLAorCQkJCQkgICAgICBwdl9kZXZfbmFtZShzZWdfcHYobHZzZWcsIHMpKSwgMCkpCisJCQkJCXJldHVybl8wOworCQkJfSBlbHNlIGlmIChzZWdfdHlwZShsdnNlZywgcykgPT0gQVJFQV9MVikgeworCQkJCWx2ID0gc2VnX2x2KGx2c2VnLCBzKTsKKwkJCQlpZiAoIW1vdmVfcHZzX3VzZWRfYnlfbHYodmdfZnJvbSwgdmdfdG8sCisJCQkJCQkJICAgICBsdi0+bmFtZSkpCisJCQkJICAgIHJldHVybl8wOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorCitpbnQgdmFsaWRhdGVfbmV3X3ZnX25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RhdGljIGNoYXIgdmdfcGF0aFtQQVRIX01BWF07CisJbmFtZV9lcnJvcl90IG5hbWVfZXJyb3I7CisKKwluYW1lX2Vycm9yID0gdmFsaWRhdGVfbmFtZV9kZXRhaWxlZCh2Z19uYW1lKTsKKwlpZiAoTkFNRV9WQUxJRCAhPSBuYW1lX2Vycm9yKSB7CisJCWRpc3BsYXlfbmFtZV9lcnJvcihuYW1lX2Vycm9yKTsKKwkJbG9nX2Vycm9yKCJOZXcgdm9sdW1lIGdyb3VwIG5hbWUgXCIlc1wiIGlzIGludmFsaWQuIiwgdmdfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXNucHJpbnRmKHZnX3BhdGgsIHNpemVvZih2Z19wYXRoKSwgIiVzJXMiLCBjbWQtPmRldl9kaXIsIHZnX25hbWUpOworCWlmIChwYXRoX2V4aXN0cyh2Z19wYXRoKSkgeworCQlsb2dfZXJyb3IoIiVzOiBhbHJlYWR5IGV4aXN0cyBpbiBmaWxlc3lzdGVtIiwgdmdfcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmFsaWRhdGVfdmdfcmVuYW1lX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWVfb2xkLAorCQkJICAgICAgY29uc3QgY2hhciAqdmdfbmFtZV9uZXcpCit7CisJdW5zaWduZWQgbGVuZ3RoOworCWNoYXIgKmRldl9kaXI7CisKKwlkZXZfZGlyID0gY21kLT5kZXZfZGlyOworCWxlbmd0aCA9IHN0cmxlbihkZXZfZGlyKTsKKworCS8qIENoZWNrIHNhbml0eSBvZiBuZXcgbmFtZSAqLworCWlmIChzdHJsZW4odmdfbmFtZV9uZXcpID4gTkFNRV9MRU4gLSBsZW5ndGggLSAyKSB7CisJCWxvZ19lcnJvcigiTmV3IHZvbHVtZSBncm91cCBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggIgorCQkJICAib2YgJWQhIiwgTkFNRV9MRU4gLSBsZW5ndGggLSAyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2YWxpZGF0ZV9uZXdfdmdfbmFtZShjbWQsIHZnX25hbWVfbmV3KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXN0cmNtcCh2Z19uYW1lX29sZCwgdmdfbmFtZV9uZXcpKSB7CisJCWxvZ19lcnJvcigiT2xkIGFuZCBuZXcgdm9sdW1lIGdyb3VwIG5hbWVzIG11c3QgZGlmZmVyIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmdfcmVuYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkgICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gdmctPnZnbWVtOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwl2Zy0+b2xkX25hbWUgPSB2Zy0+bmFtZTsKKworCWlmICghKHZnLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBuZXdfbmFtZSkpKSB7CisJCWxvZ19lcnJvcigidmctPm5hbWUgYWxsb2NhdGlvbiBmYWlsZWQgZm9yICclcyciLCBuZXdfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmICghKHB2bC0+cHYtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIG5ld19uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigicHYtPnZnX25hbWUgYWxsb2NhdGlvbiBmYWlsZWQgZm9yICclcyciLAorCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3JlbW92ZV9jaGVjayhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwl1bnNpZ25lZCBsdl9jb3VudDsKKworCWlmICh2Z19yZWFkX2Vycm9yKHZnKSB8fCB2Z19taXNzaW5nX3B2X2NvdW50KHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgbm90IGZvdW5kLCBpcyBpbmNvbnNpc3RlbnQgIgorCQkJICAib3IgaGFzIFBWcyBtaXNzaW5nLiIsIHZnID8gdmctPm5hbWUgOiAiIik7CisJCWxvZ19lcnJvcigiQ29uc2lkZXIgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIGlmIG1ldGFkYXRhICIKKwkJCSAgImlzIGluY29uc2lzdGVudC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2Z19jaGVja19zdGF0dXModmcsIEVYUE9SVEVEX1ZHKSkKKwkJcmV0dXJuIDA7CisKKwlsdl9jb3VudCA9IHZnX3Zpc2libGVfbHZzKHZnKTsKKworCWlmIChsdl9jb3VudCkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgc3RpbGwgY29udGFpbnMgJXUgIgorCQkJICAibG9naWNhbCB2b2x1bWUocykiLCB2Zy0+bmFtZSwgbHZfY291bnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCit2b2lkIHZnX3JlbW92ZV9wdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnRwdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwdmwsIHRwdmwsICZ2Zy0+cHZzKSB7CisJCWRlbF9wdmxfZnJvbV92Z3ModmcsIHB2bCk7CisJCWRtX2xpc3RfYWRkKCZ2Zy0+cmVtb3ZlZF9wdnMsICZwdmwtPmxpc3QpOworCX0KK30KKworaW50IHZnX3JlbW92ZV9kaXJlY3Qoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlpbnQgcmV0ID0gMTsKKworCWlmICghbHZtZXRhZF92Z19yZW1vdmVfcGVuZGluZyh2ZykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGx2bWV0YWQgZm9yIHBlbmRpbmcgcmVtb3ZlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZnX3JlbW92ZV9tZGFzKHZnKSkgeworCQlsb2dfZXJyb3IoInZnX3JlbW92ZV9tZGFzICVzIGZhaWxlZCIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaW5pdCBwaHlzaWNhbCB2b2x1bWVzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5yZW1vdmVkX3B2cykgeworCQlwdiA9IHB2bC0+cHY7CisJCWlmIChpc19taXNzaW5nX3B2KHB2KSkKKwkJCWNvbnRpbnVlOworCisJCWxvZ192ZXJib3NlKCJSZW1vdmluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGZyb20gIgorCQkJICAgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgcHZfZGV2X25hbWUocHYpLCB2Zy0+bmFtZSk7CisJCXB2LT52Z19uYW1lID0gdmctPmZpZC0+Zm10LT5vcnBoYW5fdmdfbmFtZTsKKwkJcHYtPnN0YXR1cyAmPSB+QUxMT0NBVEFCTEVfUFY7CisKKwkJaWYgKCFkZXZfZ2V0X3NpemUocHZfZGV2KHB2KSwgJnB2LT5zaXplKSkgeworCQkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZ2V0IHNpemUuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEZJWE1FIFdyaXRlIHRvIHNhbWUgc2VjdG9yIGxhYmVsIHdhcyByZWFkIGZyb20gKi8KKwkJaWYgKCFwdl93cml0ZSh2Zy0+Y21kLCBwdiwgMCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIgorCQkJCSAgIiBmcm9tIHZvbHVtZSBncm91cCBcIiVzXCIiLAorCQkJCSAgcHZfZGV2X25hbWUocHYpLCB2Zy0+bmFtZSk7CisJCQlyZXQgPSAwOworCQl9CisJfQorCisJaWYgKCFsdm1ldGFkX3ZnX3JlbW92ZV9maW5pc2godmcpKQorCQlzdGFjazsKKworCWxvY2tkX3ZnX3VwZGF0ZSh2Zyk7CisKKwlzZXRfdmdfbm90aWZ5KHZnLT5jbWQpOworCisJaWYgKCFiYWNrdXBfcmVtb3ZlKHZnLT5jbWQsIHZnLT5uYW1lKSkKKwkJc3RhY2s7CisKKwlpZiAocmV0KQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVm9sdW1lIGdyb3VwIFwiJXNcIiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCIsIHZnLT5uYW1lKTsKKwllbHNlCisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBub3QgcHJvcGVybHkgcmVtb3ZlZCIsIHZnLT5uYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2Z19yZW1vdmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaW50IHJldDsKKworCWlmICghbG9ja192b2wodmctPmNtZCwgVkdfT1JQSEFOUywgTENLX1ZHX1dSSVRFLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIkNhbid0IGdldCBsb2NrIGZvciBvcnBoYW4gUFZzIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IHZnX3JlbW92ZV9kaXJlY3QodmcpOworCisJdW5sb2NrX3ZnKHZnLT5jbWQsIHZnLCBWR19PUlBIQU5TKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY2hlY2tfZGV2X2Jsb2NrX3NpemVfZm9yX3ZnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJdW5zaWduZWQgaW50ICptYXhfcGh5c19ibG9ja19zaXplX2ZvdW5kKQoreworCXVuc2lnbmVkIGludCBwaHlzX2Jsb2NrX3NpemUsIGJsb2NrX3NpemU7CisKKwlpZiAoIShkZXZfZ2V0X2Jsb2NrX3NpemUoZGV2LCAmcGh5c19ibG9ja19zaXplLCAmYmxvY2tfc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCWlmIChwaHlzX2Jsb2NrX3NpemUgPiAqbWF4X3BoeXNfYmxvY2tfc2l6ZV9mb3VuZCkKKwkJKm1heF9waHlzX2Jsb2NrX3NpemVfZm91bmQgPSBwaHlzX2Jsb2NrX3NpemU7CisKKwlpZiAocGh5c19ibG9ja19zaXplID4+IFNFQ1RPUl9TSElGVCA+IHZnLT5leHRlbnRfc2l6ZSkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIGV4dGVudCBzaXplIHVzZWQgZm9yIHZvbHVtZSBncm91cCAlcyAiCisJCQkgICJpcyBsZXNzIHRoYW4gcGh5c2ljYWwgYmxvY2sgc2l6ZSB0aGF0ICVzIHVzZXMuIiwKKwkJCSAgIHZnLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z19jaGVja19wdl9kZXZfYmxvY2tfc2l6ZXMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwl1bnNpZ25lZCBpbnQgbWF4X3BoeXNfYmxvY2tfc2l6ZV9mb3VuZCA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlpZiAoIWNoZWNrX2Rldl9ibG9ja19zaXplX2Zvcl92ZyhwdmwtPnB2LT5kZXYsIHZnLCAmbWF4X3BoeXNfYmxvY2tfc2l6ZV9mb3VuZCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfcHZfZGV2X3NpemVzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJdWludDY0X3QgZGV2X3NpemUsIHNpemU7CisJaW50IHIgPSAxOworCisJaWYgKCF2Zy0+Y21kLT5jaGVja19wdl9kZXZfc2l6ZXMgfHwKKwkgICAgaXNfb3JwaGFuX3ZnKHZnLT5uYW1lKSkKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlpZiAoaXNfbWlzc2luZ19wdihwdmwtPnB2KSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBEb24ndCBjb21wYXJlIHRoZSBzaXplcyBpZiB3ZSdyZSBub3QgYWJsZQorCQkgKiB0byBkZXRlcm1pbmUgdGhlIHJlYWwgZGV2X3NpemUuIFRoaXMgbWF5CisJCSAqIGhhcHBlbiBpZiB0aGUgZGV2aWNlIGhhcyBnb25lIHNpbmNlIHdlIGRpZAorCQkgKiBWRyByZWFkLgorCQkgKi8KKwkJaWYgKCFkZXZfZ2V0X3NpemUocHZsLT5wdi0+ZGV2LCAmZGV2X3NpemUpKQorCQkJY29udGludWU7CisJCXNpemUgPSBwdl9zaXplKHB2bC0+cHYpOworCisJCWlmIChkZXZfc2l6ZSA8IHNpemUpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBEZXZpY2UgJXMgaGFzIHNpemUgb2YgJSIgUFJJdTY0ICIgc2VjdG9ycyB3aGljaCAiCisJCQkJICJpcyBzbWFsbGVyIHRoYW4gY29ycmVzcG9uZGluZyBQViBzaXplIG9mICUiIFBSSXU2NAorCQkJCSAgIiBzZWN0b3JzLiBXYXMgZGV2aWNlIHJlc2l6ZWQ/IiwKKwkJCQkgIHB2X2Rldl9uYW1lKHB2bC0+cHYpLCBkZXZfc2l6ZSwgc2l6ZSk7CisJCQlyID0gMDsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCisvKgorICogRXh0ZW5kIGEgVkcgYnkgYSBzaW5nbGUgUFYgLyBkZXZpY2UgcGF0aAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAtIHZnOiBoYW5kbGUgb2Ygdm9sdW1lIGdyb3VwIHRvIGV4dGVuZCBieSAncHZfbmFtZScKKyAqIC0gcHZfbmFtZTogZGV2aWNlIHBhdGggb2YgUFYgdG8gYWRkIHRvIFZHCisgKiAtIHBwOiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gaW1wbGljaXQgcHZjcmVhdGU7IGlmIE5VTEwsIGRvIG5vdCBwdmNyZWF0ZQorICogLSBtYXhfcGh5c19ibG9ja19zaXplOiBsYXJnZXN0IHBoeXNpY2FsIGJsb2NrIHNpemUgZm91bmQgYW1vbmdzdCBQVnMgaW4gYSBWRworICoKKyAqLworc3RhdGljIGludCB2Z19leHRlbmRfc2luZ2xlX3B2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjaGFyICpwdl9uYW1lLAorCQkJICAgICAgIHN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnBwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqbWF4X3BoeXNfYmxvY2tfc2l6ZSkKK3sKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgcHZfdG9fd3JpdGUgKnB2dzsKKwlpbnQgbmV3X3B2ID0gMDsKKworCXB2ID0gZmluZF9wdl9ieV9uYW1lKHZnLT5jbWQsIHB2X25hbWUsIDEsIDEpOworCisJaWYgKCFwdiAmJiAhcHApIHsKKwkJbG9nX2Vycm9yKCIlcyBub3QgaWRlbnRpZmllZCBhcyBhbiBleGlzdGluZyAiCisJCQkgICJwaHlzaWNhbCB2b2x1bWUiLCBwdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghcHYgJiYgcHApIHsKKwkJaWYgKCEocHYgPSBwdmNyZWF0ZV92b2wodmctPmNtZCwgcHZfbmFtZSwgcHAsIDApKSkKKwkJCXJldHVybl8wOworCQluZXdfcHYgPSAxOworCX0KKworCWlmICghKGNoZWNrX2Rldl9ibG9ja19zaXplX2Zvcl92Zyhwdi0+ZGV2LCAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSB2ZywKKwkJCQkJICBtYXhfcGh5c19ibG9ja19zaXplKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFhZGRfcHZfdG9fdmcodmcsIHB2X25hbWUsIHB2LCBuZXdfcHYpKQorCQlnb3RvX2JhZDsKKworCWlmICgocHYtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfUFZfRkxBR1MpIHx8CisJICAgIChwdi0+c3RhdHVzICYgVU5MQUJFTExFRF9QVikpIHsKKwkJaWYgKCEocHZ3ID0gZG1fcG9vbF96YWxsb2ModmctPnZnbWVtLCBzaXplb2YoKnB2dykpKSkgeworCQkJbG9nX2Vycm9yKCJwdl90b193cml0ZSBhbGxvY2F0aW9uIGZvciAnJXMnIGZhaWxlZCIsIHB2X25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHZ3LT5wdiA9IHB2OworCQlwdnctPnBwID0gbmV3X3B2ID8gcHAgOiBOVUxMOworCQlwdnctPm5ld19wdiA9IG5ld19wdjsKKwkJZG1fbGlzdF9hZGQoJnZnLT5wdnNfdG9fd3JpdGUsICZwdnctPmxpc3QpOworCX0KKworCXJldHVybiAxOworYmFkOgorCWZyZWVfcHZfZmlkKHB2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZJWE1FOiBjb21tYW5kcyBzaGlmdGluZyB0byBjb21tb24gY29kZSBpbiB0b29sbGliIGhhdmUgbGVmdCBhIGxhcmdlCisgKiBhbW91bnQgb2YgY29kZSBvbmx5IHVzZWQgYnkgbGlibHZtLiAgRWl0aGVyIHJlbW92ZSB0aGlzIGJ5IHNoaWZ0aW5nCisgKiBsaWJsdm0gdG8gdXNlIHRvb2xsaWIsIG9yIGlzb2xhdGUgYWxsIHRoaXMgY29kZSBpbnRvIGEgbGlibHZtLXNwZWNpZmljCisgKiBzb3VyY2UgZmlsZS4gIEFsbCB0aGUgZm9sbG93aW5nIGFuZCBtb3JlIGFyZSBvbmx5IHVzZWQgYnkgbGlibHZtOgorICoKKyAqIC4gdmdfZXh0ZW5kKCkKKyAqIC4gdmdfZXh0ZW5kX3NpbmdsZV9wdigpCisgKiAuIHB2Y3JlYXRlX3ZvbCgpCisgKiAuIF9wdmNyZWF0ZV9jaGVjaygpCisgKiAuIF9wdmNyZWF0ZV93cml0ZSgpCisgKiAuIHB2cmVtb3ZlX21hbnkoKQorICogLiBwdnJlbW92ZV9zaW5nbGUoKQorICogLiBmaW5kX3B2X2J5X25hbWUoKQorICogLiBnZXRfcHZzKCkKKyAqIC4gdGhlIHZnLT5wdnNfdG9fd3JpdGUgbGlzdCBhbmQgcHZfdG9fd3JpdGUgc3RydWN0CisgKiAuIHZnX3JlZHVjZSgpCisgKi8KKworLyoKKyAqIEV4dGVuZCBhIFZHIGJ5IGEgc2luZ2xlIFBWIC8gZGV2aWNlIHBhdGgKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogLSB2ZzogaGFuZGxlIG9mIHZvbHVtZSBncm91cCB0byBleHRlbmQgYnkgJ3B2X25hbWUnCisgKiAtIHB2X2NvdW50OiBjb3VudCBvZiBkZXZpY2UgcGF0aHMgb2YgUFZzCisgKiAtIHB2X25hbWVzOiBkZXZpY2UgcGF0aHMgb2YgUFZzIHRvIGFkZCB0byBWRworICogLSBwcDogcGFyYW1ldGVycyB0byBwYXNzIHRvIGltcGxpY2l0IHB2Y3JlYXRlOyBpZiBOVUxMLCBkbyBub3QgcHZjcmVhdGUKKyAqCisgKi8KK2ludCB2Z19leHRlbmQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBwdl9jb3VudCwgY29uc3QgY2hhciAqY29uc3QgKnB2X25hbWVzLAorCSAgICAgIHN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnBwKQoreworCWludCBpOworCWNoYXIgKnB2X25hbWU7CisJdW5zaWduZWQgaW50IG1heF9waHlzX2Jsb2NrX3NpemUgPSAwOworCisJaWYgKF92Z19iYWRfc3RhdHVzX2JpdHModmcsIFJFU0laRUFCTEVfVkcpKQorCQlyZXR1cm5fMDsKKworCS8qIGF0dGFjaCBlYWNoIHB2ICovCisJZm9yIChpID0gMDsgaSA8IHB2X2NvdW50OyBpKyspIHsKKwkJaWYgKCEocHZfbmFtZSA9IGRtX3N0cmR1cChwdl9uYW1lc1tpXSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgcHYgbmFtZSAlcy4iLCBwdl9uYW1lc1tpXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkbV91bmVzY2FwZV9jb2xvbnNfYW5kX2F0X3NpZ25zKHB2X25hbWUsIE5VTEwsIE5VTEwpOworCQlpZiAoIXZnX2V4dGVuZF9zaW5nbGVfcHYodmcsIHB2X25hbWUsIHBwLCAmbWF4X3BoeXNfYmxvY2tfc2l6ZSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFkZCBwaHlzaWNhbCB2b2x1bWUgJyVzJyB0byAiCisJCQkJICAidm9sdW1lIGdyb3VwICclcycuIiwgcHZfbmFtZSwgdmctPm5hbWUpOworCQkJZG1fZnJlZShwdl9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRtX2ZyZWUocHZfbmFtZSk7CisJfQorCisJKHZvaWQpIF9jaGVja19wdl9kZXZfc2l6ZXModmcpOworCisvKiBGSVhNRSBEZWNpZGUgd2hldGhlciB0byBpbml0aWFsaXNlIGFuZCBhZGQgbmV3IG1kYWhzIHRvIGZvcm1hdCBpbnN0YW5jZSAqLworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z19leHRlbmRfZWFjaF9wdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwl1bnNpZ25lZCBpbnQgbWF4X3BoeXNfYmxvY2tfc2l6ZSA9IDA7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkFkZGluZyBQVnMgdG8gVkcgJXMiLCB2Zy0+bmFtZSk7CisKKwlpZiAoX3ZnX2JhZF9zdGF0dXNfYml0cyh2ZywgUkVTSVpFQUJMRV9WRykpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnBwLT5wdnMpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBZGRpbmcgUFYgJXMgdG8gVkcgJXMiLCBwdl9kZXZfbmFtZShwdmwtPnB2KSwgdmctPm5hbWUpOworCisJCWlmICghKGNoZWNrX2Rldl9ibG9ja19zaXplX2Zvcl92ZyhwdmwtPnB2LT5kZXYsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIHZnLAorCQkJCQkJICAmbWF4X3BoeXNfYmxvY2tfc2l6ZSkpKSB7CisJCQlsb2dfZXJyb3IoIlBWICVzIGhhcyB3cm9uZyBibG9jayBzaXplIiwgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQkJcmV0dXJuXzA7CisJCX0KKworCQlpZiAoIWFkZF9wdl90b192Zyh2ZywgcHZfZGV2X25hbWUocHZsLT5wdiksIHB2bC0+cHYsIDApKSB7CisJCQlsb2dfZXJyb3IoIlBWICVzIGNhbm5vdCBiZSBhZGRlZCB0byBWRyAlcy4iLAorCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdiksIHZnLT5uYW1lKTsKKwkJCXJldHVybl8wOworCQl9CisJfQorCisJKHZvaWQpIF9jaGVja19wdl9kZXZfc2l6ZXModmcpOworCisJZG1fbGlzdF9zcGxpY2UoJnZnLT5wdl93cml0ZV9saXN0LCAmcHAtPnB2cyk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3JlZHVjZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqcHZfbmFtZSkKK3sKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJaWYgKCEocHZsID0gZmluZF9wdl9pbl92Zyh2ZywgcHZfbmFtZSkpKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICVzIG5vdCBpbiB2b2x1bWUgZ3JvdXAgJXMuIiwKKwkJCSAgcHZfbmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdiA9IHB2bC0+cHY7CisKKwlpZiAodmdyZWR1Y2Vfc2luZ2xlKHZnLT5jbWQsIHZnLCBwdiwgMCkpIHsKKwkJZG1fbGlzdF9hZGQoJnZnLT5yZW1vdmVkX3B2cywgJnB2bC0+bGlzdCk7CisJCXJldHVybiAxOworCX0KKworCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSBwaHlzaWNhbCB2b2x1bWUgJyVzJyBmcm9tICIKKwkJICAidm9sdW1lIGdyb3VwICclcycuIiwgcHZfbmFtZSwgdmctPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsdl9jaGFuZ2VfdGFnKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKnRhZywgaW50IGFkZF90YWcpCit7CisJY2hhciAqdGFnX25ldzsKKworCWlmICghKGx2LT52Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX1RBR1MpKSB7CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMvJXMgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhZGRfdGFnKSB7CisJCWlmICghKHRhZ19uZXcgPSBkbV9wb29sX3N0cmR1cChsdi0+dmctPnZnbWVtLCB0YWcpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZHVwbGljYXRlIHRhZyAlcyBmcm9tICVzLyVzIiwKKwkJCQkgIHRhZywgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXN0cl9saXN0X2FkZChsdi0+dmctPnZnbWVtLCAmbHYtPnRhZ3MsIHRhZ19uZXcpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgdGFnICVzIHRvICVzLyVzIiwKKwkJCQkgIHRhZywgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlzdHJfbGlzdF9kZWwoJmx2LT50YWdzLCB0YWcpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z19jaGFuZ2VfdGFnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICp0YWcsIGludCBhZGRfdGFnKQoreworCWNoYXIgKnRhZ19uZXc7CisKKwlpZiAoISh2Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX1RBR1MpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwICVzIGRvZXMgbm90IHN1cHBvcnQgdGFncyIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFkZF90YWcpIHsKKwkJaWYgKCEodGFnX25ldyA9IGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgdGFnKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGR1cGxpY2F0ZSB0YWcgJXMgZnJvbSAlcyIsCisJCQkJICB0YWcsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghc3RyX2xpc3RfYWRkKHZnLT52Z21lbSwgJnZnLT50YWdzLCB0YWdfbmV3KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIHRhZyAlcyB0byB2b2x1bWUgZ3JvdXAgJXMiLAorCQkJCSAgdGFnLCB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlzdHJfbGlzdF9kZWwoJnZnLT50YWdzLCB0YWcpOworCisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKnN0cmlwX2Rpcihjb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICpkZXZfZGlyKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZGV2X2Rpcik7CisJaWYgKCFzdHJuY21wKHZnX25hbWUsIGRldl9kaXIsIGxlbikpCisJCXZnX25hbWUgKz0gbGVuOworCisJcmV0dXJuIHZnX25hbWU7Cit9CisKKy8qCisgKiBWYWxpZGF0ZXMgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMuCisgKiBPbiA+Mi40IGtlcm5lbCB3ZSBvbmx5IHN1cHBvcnQgZHluYW1pYyBtYWpvciBudW1iZXIuCisgKi8KK2ludCB2YWxpZGF0ZV9tYWpvcl9taW5vcihjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSBjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCSBpbnQzMl90IG1ham9yLCBpbnQzMl90IG1pbm9yKQoreworCWludCByID0gMTsKKworCWlmICghc3RybmNtcChjbWQtPmtlcm5lbF92c24sICIyLjQuIiwgNCkgfHwKKwkgICAgKGZtdC0+ZmVhdHVyZXMgJiBGTVRfUkVTVFJJQ1RFRF9MVklEUykpIHsKKwkJaWYgKG1ham9yIDwgMCB8fCBtYWpvciA+IDI1NSkgeworCQkJbG9nX2Vycm9yKCJNYWpvciBudW1iZXIgJWQgb3V0c2lkZSByYW5nZSAwLTI1NS4iLCBtYWpvcik7CisJCQlyID0gMDsKKwkJfQorCQlpZiAobWlub3IgPCAwIHx8IG1pbm9yID4gMjU1KSB7CisJCQlsb2dfZXJyb3IoIk1pbm9yIG51bWJlciAlZCBvdXRzaWRlIHJhbmdlIDAtMjU1LiIsIG1pbm9yKTsKKwkJCXIgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogMTIgYml0cyBmb3IgbWFqb3IgbnVtYmVyICovCisJCWlmICgobWFqb3IgIT0gLTEpICYmCisJCSAgICAobWFqb3IgIT0gY21kLT5kZXZfdHlwZXMtPmRldmljZV9tYXBwZXJfbWFqb3IpKSB7CisJCQkvKiBVc2VyIHN1cHBsaWVkIHNvbWUgbWFqb3IgbnVtYmVyICovCisJCQlpZiAobWFqb3IgPCAwIHx8IG1ham9yID4gNDA5NSkgeworCQkJCWxvZ19lcnJvcigiTWFqb3IgbnVtYmVyICVkIG91dHNpZGUgcmFuZ2UgMC00MDk1LiIsIG1ham9yKTsKKwkJCQlyID0gMDsKKwkJCX0gZWxzZQorCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJZ25vcmluZyBzdXBwbGllZCBtYWpvciAlZCBudW1iZXIgLSAiCisJCQkJCQkJImtlcm5lbCBhc3NpZ25zIG1ham9yIG51bWJlcnMgZHluYW1pY2FsbHkuIiwKKwkJCQkJCQltYWpvcik7CisJCX0KKwkJLyogMjAgYml0cyBmb3IgbWlub3IgbnVtYmVyICovCisJCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPiAxMDQ4NTc1KSB7CisJCQlsb2dfZXJyb3IoIk1pbm9yIG51bWJlciAlZCBvdXRzaWRlIHJhbmdlIDAtMTA0ODU3NS4iLCBtaW5vcik7CisJCQlyID0gMDsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCisvKgorICogVmFsaWRhdGUgcGFyYW1ldGVycyB0byB2Z19jcmVhdGUoKSBiZWZvcmUgY2FsbGluZy4KKyAqIEZJWE1FOiBNb3ZlIGluc2lkZSB2Z19jcmVhdGUgbGlicmFyeSBmdW5jdGlvbi4KKyAqIEZJWE1FOiBDaGFuZ2UgdmdjcmVhdGVfcGFyYW1zIHN0cnVjdCB0byBpbmRpdmlkdWFsIGdldHMvc2V0cworICovCitpbnQgdmdjcmVhdGVfcGFyYW1zX3ZhbGlkYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICBzdHJ1Y3QgdmdjcmVhdGVfcGFyYW1zICp2cCkKK3sKKwlpZiAoIXZhbGlkYXRlX25ld192Z19uYW1lKGNtZCwgdnAtPnZnX25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmICh2cC0+YWxsb2MgPT0gQUxMT0NfSU5IRVJJVCkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBHcm91cCBhbGxvY2F0aW9uIHBvbGljeSBjYW5ub3QgaW5oZXJpdCAiCisJCQkgICJmcm9tIGFueXRoaW5nIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghdnAtPmV4dGVudF9zaXplKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgZXh0ZW50IHNpemUgbWF5IG5vdCBiZSB6ZXJvIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGNtZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9VTkxJTUlURURfVk9MUykpIHsKKwkJaWYgKCF2cC0+bWF4X2x2KQorCQkJdnAtPm1heF9sdiA9IDI1NTsKKwkJaWYgKCF2cC0+bWF4X3B2KQorCQkJdnAtPm1heF9wdiA9IDI1NTsKKwkJaWYgKHZwLT5tYXhfbHYgPiAyNTUgfHwgdnAtPm1heF9wdiA+IDI1NSkgeworCQkJbG9nX2Vycm9yKCJOdW1iZXIgb2Ygdm9sdW1lcyBtYXkgbm90IGV4Y2VlZCAyNTUiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBVcGRhdGUgY29udGVudCBvZiBwcmVjb21taXR0ZWQgVkcKKyAqCisgKiBUT0RPOiBPcHRpbWl6ZSBpbiB0aGUgZnV0dXJlLCBzaW5jZSBsdm1ldGFkIG5lZWRzIHNpbWlsYXIKKyAqICAgICAgIGNvbmZpZyB0cmVlIHByb2Nlc3NpbmcgaW4gbHZtZXRhZF92Z191cGRhdGUoKS4KKyAqLworc3RhdGljIGludCBfdmdfdXBkYXRlX3ZnX3ByZWNvbW1pdHRlZChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZWxlYXNlX3ZnKHZnLT52Z19wcmVjb21taXR0ZWQpOworCXZnLT52Z19wcmVjb21taXR0ZWQgPSBOVUxMOworCisJaWYgKHZnLT5jZnRfcHJlY29tbWl0dGVkKSB7CisJCWRtX2NvbmZpZ19kZXN0cm95KHZnLT5jZnRfcHJlY29tbWl0dGVkKTsKKwkJdmctPmNmdF9wcmVjb21taXR0ZWQgPSBOVUxMOworCX0KKworCWlmICghKHZnLT5jZnRfcHJlY29tbWl0dGVkID0gZXhwb3J0X3ZnX3RvX2NvbmZpZ190cmVlKHZnKSkpCisJCXJldHVybl8wOworCisJaWYgKCEodmctPnZnX3ByZWNvbW1pdHRlZCA9IGltcG9ydF92Z19mcm9tX2NvbmZpZ190cmVlKHZnLT5jZnRfcHJlY29tbWl0dGVkLCB2Zy0+ZmlkKSkpIHsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kodmctPmNmdF9wcmVjb21taXR0ZWQpOworCQl2Zy0+Y2Z0X3ByZWNvbW1pdHRlZCA9IE5VTEw7CisJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z191cGRhdGVfdmdfY29tbWl0dGVkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmIChkbV9wb29sX2xvY2tlZCh2Zy0+dmdtZW0pKQorCQlyZXR1cm4gMTsKKworCWlmICh2Zy0+dmdfY29tbWl0dGVkIHx8IGlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpIC8qIHdlIGFscmVhZHkgaGF2ZSBpdCAqLworCQlyZXR1cm4gMTsKKworCWlmICghX3ZnX3VwZGF0ZV92Z19wcmVjb21taXR0ZWQodmcpKQorCQlyZXR1cm5fMDsKKworCXZnLT52Z19jb21taXR0ZWQgPSB2Zy0+dmdfcHJlY29tbWl0dGVkOworCXZnLT52Z19wcmVjb21taXR0ZWQgPSBOVUxMOworCWlmICh2Zy0+Y2Z0X3ByZWNvbW1pdHRlZCkgeworCQlkbV9jb25maWdfZGVzdHJveSh2Zy0+Y2Z0X3ByZWNvbW1pdHRlZCk7CisJCXZnLT5jZnRfcHJlY29tbWl0dGVkID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENyZWF0ZSBhIChzdHJ1Y3Qgdm9sdW1lX2dyb3VwKSB2b2x1bWUgZ3JvdXAgaGFuZGxlIGZyb20gYSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIHBvaW50ZXIgYW5kIGEKKyAqIHBvc3NpYmxlIGZhaWx1cmUgY29kZSBvciB6ZXJvIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqX3ZnX21ha2VfaGFuZGxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJCSAgICB1aW50MzJfdCBmYWlsdXJlKQoreworCisJLyogTmV2ZXIgcmV0dXJuIGEgY2FjaGVkIFZHIHN0cnVjdHVyZSBmb3IgYSBmYWlsdXJlICovCisJaWYgKHZnICYmIHZnLT52Z2luZm8gJiYgZmFpbHVyZSAhPSBTVUNDRVNTKSB7CisJCXJlbGVhc2VfdmcodmcpOworCQl2ZyA9IE5VTEw7CisJfQorCisJaWYgKCF2ZyAmJiAhKHZnID0gYWxsb2NfdmcoInZnX21ha2VfaGFuZGxlIiwgY21kLCBOVUxMKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKHZnLT5yZWFkX3N0YXR1cyAhPSBmYWlsdXJlKQorCQl2Zy0+cmVhZF9zdGF0dXMgPSBmYWlsdXJlOworCisJaWYgKHZnLT5maWQgJiYgIV92Z191cGRhdGVfdmdfY29tbWl0dGVkKHZnKSkKKwkJdmctPnJlYWRfc3RhdHVzIHw9IEZBSUxFRF9BTExPQ0FUSU9OOworCisJcmV0dXJuIHZnOworfQorCitpbnQgbHZfaGFzX3Vua25vd25fc2VnbWVudHMoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCS8qIGZvcmVhY2ggc2VnbWVudCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpCisJCWlmIChzZWdfdW5rbm93bihzZWcpKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2Z19oYXNfdW5rbm93bl9zZWdtZW50cyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJLyogZm9yZWFjaCBMViAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAobHZfaGFzX3Vua25vd25fc2VnbWVudHMobHZsLT5sdikpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfbG9ja19hbmRfY3JlYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lKQoreworCXVpbnQzMl90IHJjOworCisJaWYgKCF2YWxpZGF0ZV9uYW1lKHZnX25hbWUpKSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCB2ZyBuYW1lICVzIiwgdmdfbmFtZSk7CisJCS8qIEZJWE1FOiB1c2UgX3ZnX21ha2VfaGFuZGxlKCkgdy9wcm9wZXIgZXJyb3IgY29kZSAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyYyA9IHZnX2xvY2tfbmV3bmFtZShjbWQsIHZnX25hbWUpOworCWlmIChyYyAhPSBTVUNDRVNTKQorCQkvKiBOT1RFOiBsZXQgY2FsbGVyIGRlY2lkZSAtIHRoaXMgbWF5IGJlIGNoZWNrIGZvciBleGlzdGVuY2UgKi8KKwkJcmV0dXJuIF92Z19tYWtlX2hhbmRsZShjbWQsIE5VTEwsIHJjKTsKKworCXJldHVybiB2Z19jcmVhdGUoY21kLCB2Z19uYW1lKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIFZHIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgorICogUmV0dXJuczoKKyAqIC0gc3RydWN0IHZvbHVtZV9ncm91cCogd2l0aCBTVUNDRVNTIGNvZGU6IFZHIHN0cnVjdHVyZSBjcmVhdGVkCisgKiAtIE5VTEwgb3Igc3RydWN0IHZvbHVtZV9ncm91cCogd2l0aCBGQUlMRURfKiBjb2RlOiBlcnJvciBjcmVhdGluZyBWRyBzdHJ1Y3R1cmUKKyAqIFVzZSB2Z19yZWFkX2Vycm9yKCkgdG8gZGV0ZXJtaW5lIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqIEZJWE1FOiBjbGVhbnVwIHVzYWdlIG9mIF92Z19tYWtlX2hhbmRsZSgpCisgKi8KK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2NyZWF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWMgPSB7CisJCS50eXBlID0gRk1UX0lOU1RBTkNFX01EQVMgfCBGTVRfSU5TVEFOQ0VfQVVYX01EQVMsCisJCS5jb250ZXh0LnZnX3JlZi52Z19uYW1lID0gdmdfbmFtZQorCX07CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCisJaWYgKCEodmcgPSBhbGxvY192ZygidmdfY3JlYXRlIiwgY21kLCB2Z19uYW1lKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCFpZF9jcmVhdGUoJnZnLT5pZCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgdXVpZCBmb3Igdm9sdW1lIGdyb3VwICclcycuIiwKKwkJCSAgdmdfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCXZnLT5zdGF0dXMgPSAoUkVTSVpFQUJMRV9WRyB8IExWTV9SRUFEIHwgTFZNX1dSSVRFKTsKKwl2Zy0+c3lzdGVtX2lkID0gTlVMTDsKKwlpZiAoISh2Zy0+bHZtMV9zeXN0ZW1faWQgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIE5BTUVfTEVOICsgMSkpKQorCQlnb3RvX2JhZDsKKworCXZnLT5leHRlbnRfc2l6ZSA9IERFRkFVTFRfRVhURU5UX1NJWkUgKiAyOworCXZnLT5tYXhfbHYgPSBERUZBVUxUX01BWF9MVjsKKwl2Zy0+bWF4X3B2ID0gREVGQVVMVF9NQVhfUFY7CisJdmctPmFsbG9jID0gREVGQVVMVF9BTExPQ19QT0xJQ1k7CisJdmctPm1kYV9jb3BpZXMgPSBERUZBVUxUX1ZHTUVUQURBVEFDT1BJRVM7CisKKwlpZiAoIShmaWQgPSBjbWQtPmZtdC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoY21kLT5mbXQsICZmaWMpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgZm9ybWF0IGluc3RhbmNlIik7CisJCWdvdG8gYmFkOworCX0KKwl2Z19zZXRfZmlkKHZnLCBmaWQpOworCisJaWYgKHZnLT5maWQtPmZtdC0+b3BzLT52Z19zZXR1cCAmJgorCSAgICAhdmctPmZpZC0+Zm10LT5vcHMtPnZnX3NldHVwKHZnLT5maWQsIHZnKSkgeworCQlsb2dfZXJyb3IoIkZvcm1hdCBzcGVjaWZpYyBzZXR1cCBvZiB2b2x1bWUgZ3JvdXAgJyVzJyBmYWlsZWQuIiwKKwkJCSAgdmdfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKwlyZXR1cm4gX3ZnX21ha2VfaGFuZGxlKGNtZCwgdmcsIFNVQ0NFU1MpOworCitiYWQ6CisJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmcsIHZnX25hbWUpOworCS8qIEZJWE1FOiB1c2UgX3ZnX21ha2VfaGFuZGxlKCkgdy9wcm9wZXIgZXJyb3IgY29kZSAqLworCXJldHVybiBOVUxMOworfQorCisvKiBSb3VuZHMgdXAgYnkgZGVmYXVsdCAqLwordWludDMyX3QgZXh0ZW50c19mcm9tX3NpemUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IHNpemUsCisJCQkgICB1aW50MzJfdCBleHRlbnRfc2l6ZSkKK3sKKwlpZiAoc2l6ZSAlIGV4dGVudF9zaXplKSB7CisJCXNpemUgKz0gZXh0ZW50X3NpemUgLSBzaXplICUgZXh0ZW50X3NpemU7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSb3VuZGluZyB1cCBzaXplIHRvIGZ1bGwgcGh5c2ljYWwgZXh0ZW50ICVzIiwKKwkJCSAgCQlkaXNwbGF5X3NpemUoY21kLCBzaXplKSk7CisJfQorCisJaWYgKHNpemUgPiAodWludDY0X3QpIE1BWF9FWFRFTlRfQ09VTlQgKiBleHRlbnRfc2l6ZSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSB0b28gbGFyZ2UgKCVzKSBmb3IgZXh0ZW50IHNpemUgJXMuICIKKwkJCSAgIlVwcGVyIGxpbWl0IGlzIGxlc3MgdGhlbiAlcy4iLAorCQkJICBkaXNwbGF5X3NpemUoY21kLCBzaXplKSwKKwkJCSAgZGlzcGxheV9zaXplKGNtZCwgKHVpbnQ2NF90KSBleHRlbnRfc2l6ZSksCisJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgTUFYX0VYVEVOVF9DT1VOVCAqCisJCQkJICAgICAgIGV4dGVudF9zaXplKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAodWludDMyX3QpIChzaXplIC8gZXh0ZW50X3NpemUpOworfQorCisvKgorICogQ29udmVydHMgc2l6ZSBhY2NvcmRpbmcgdG8gcGVyY2VudGFnZSB3aXRoIHNwZWNpZmllZCByb3VuZGluZyB0byBleHRlbnRzCisgKgorICogRm9yIFBFUkNFTlRfTk9ORSBzaXplIGlzIGluIHN0YW5kYXJkIHNlY3RvciB1bml0cy4KKyAqIEZvciBhbGwgb3RoZXIgcGVyY2VudCB0eXBlIGlzIGluIERNX1BFUkNFTlRfMSBiYXNlIHVuaXQgKHN1cHBvcnRzIGRlY2ltYWwgcG9pbnQpCisgKgorICogUmV0dXJuIHZhbHVlIG9mIDAgZXh0ZW50cyBpcyBhbiBlcnJvci4KKyAqLwordWludDMyX3QgZXh0ZW50c19mcm9tX3BlcmNlbnRfc2l6ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnB2aCwKKwkJCQkgICB1aW50MzJfdCBleHRlbnRzLCBpbnQgcm91bmR1cCwKKwkJCQkgICBwZXJjZW50X3R5cGVfdCBwZXJjZW50LCB1aW50NjRfdCBzaXplKQoreworCXVpbnQzMl90IGNvdW50OworCisJc3dpdGNoIChwZXJjZW50KSB7CisJY2FzZSBQRVJDRU5UX05PTkU6CisJCWlmICghcm91bmR1cCAmJiAoc2l6ZSAlIHZnLT5leHRlbnRfc2l6ZSkpIHsKKwkJCWlmICghKHNpemUgLT0gc2l6ZSAlIHZnLT5leHRlbnRfc2l6ZSkpIHsKKwkJCQlsb2dfZXJyb3IoIlNwZWNpZmllZCBzaXplIGlzIHNtYWxsZXIgdGhlbiBwaHlzaWNhbCBleHRlbnQgYm91bmRhcnkuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUm91bmRpbmcgc2l6ZSB0byBib3VuZGFyeSBiZXR3ZWVuIHBoeXNpY2FsIGV4dGVudHM6ICVzLiIsCisJCQkJCQlkaXNwbGF5X3NpemUodmctPmNtZCwgc2l6ZSkpOworCQl9CisJCXJldHVybiBleHRlbnRzX2Zyb21fc2l6ZSh2Zy0+Y21kLCBzaXplLCB2Zy0+ZXh0ZW50X3NpemUpOworCWNhc2UgUEVSQ0VOVF9MVjoKKwkJYnJlYWs7CS8qIEJhc2UgZXh0ZW50cyBhbHJlYWR5IHBhc3NlZCBpbi4gKi8KKwljYXNlIFBFUkNFTlRfVkc6CisJCWV4dGVudHMgPSB2Zy0+ZXh0ZW50X2NvdW50OworCQlicmVhazsKKwljYXNlIFBFUkNFTlRfUFZTOgorCQlpZiAocHZoICE9ICZ2Zy0+cHZzKSB7CisJCQkvKiBQaHlzaWNhbCB2b2x1bWVzIGFyZSBzcGVjaWZpZWQgb24gY21kbGluZSAqLworCQkJaWYgKCEoZXh0ZW50cyA9IHB2X2xpc3RfZXh0ZW50c19mcmVlKHB2aCkpKSB7CisJCQkJbG9nX2Vycm9yKCJObyBmcmVlIGV4dGVudHMgaW4gdGhlIGxpc3Qgb2YgcGh5c2ljYWwgdm9sdW1lcy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8qIEZhbGwgYmFjayB0byB1c2UgYWxsIFBWcyBpbiBWRyBsaWtlICVGUkVFICovCisJY2FzZSBQRVJDRU5UX0ZSRUU6CisJCWlmICghKGV4dGVudHMgPSB2Zy0+ZnJlZV9jb3VudCkpIHsKKwkJCWxvZ19lcnJvcigiTm8gZnJlZSBleHRlbnRzIGluIFZvbHVtZSBncm91cCAlcy4iLCB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuc3VwcG9ydGVkIHBlcmNlbnQgdHlwZSAldS4iLCBwZXJjZW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoY291bnQgPSBwZXJjZW50X29mX2V4dGVudHMoc2l6ZSwgZXh0ZW50cywgcm91bmR1cCkpKQorCQlsb2dfZXJyb3IoIkNvbnZlcnRlZCAgJS4yZiUlJXMgaW50byAwIGV4dGVudHMuIiwKKwkJCSAgKGRvdWJsZSkgc2l6ZSAvIERNX1BFUkNFTlRfMSwgZ2V0X3BlcmNlbnRfc3RyaW5nKHBlcmNlbnQpKTsKKwllbHNlCisJCWxvZ192ZXJib3NlKCJDb252ZXJ0ZWQgJS4yZiUlJXMgaW50byAlIiBQUkl1MzIgIiBleHRlbnRzLiIsCisJCQkgICAgKGRvdWJsZSkgc2l6ZSAvIERNX1BFUkNFTlRfMSwgZ2V0X3BlcmNlbnRfc3RyaW5nKHBlcmNlbnQpLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBkbV9iaXRzZXRfdCBfYml0c2V0X3dpdGhfcmFuZG9tX2JpdHMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgdWludDMyX3QgbnVtX2JpdHMsCisJCQkJCSAgICB1aW50MzJfdCBudW1fc2V0X2JpdHMsIHVuc2lnbmVkICpzZWVkKQoreworCWRtX2JpdHNldF90IGJzOworCXVuc2lnbmVkIGJpdF9zZWxlY3RlZDsKKwljaGFyIGJ1ZlszMl07CisJdWludDMyX3QgaSA9IG51bV9iaXRzIC0gbnVtX3NldF9iaXRzOworCisJaWYgKCEoYnMgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgKHVuc2lnbmVkKSBudW1fYml0cykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGJpdHNldCBmb3Igc2V0dGluZyByYW5kb20gYml0cy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAgIGlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCA1MTIpKSB7CisgICAgICAgICAgICAgICAgbG9nX2Vycm9yKCJkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQgZm9yIHJhbmRvbSBsaXN0IG9mIGJpdHMuIik7CisJCWRtX3Bvb2xfZnJlZShtZW0sIGJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisJLyogUGVyZm9ybSBsb29wIG51bV9zZXRfYml0cyB0aW1lcywgc2VsZWN0aW5nIG9uZSBiaXQgZWFjaCB0aW1lICovCisJd2hpbGUgKGkrKyA8IG51bV9iaXRzKSB7CisJCS8qIFNlbGVjdCBhIHJhbmRvbSBiaXQgYmV0d2VlbiAwIGFuZCAoaS0xKSBpbmNsdXNpdmUuICovCisJCWJpdF9zZWxlY3RlZCA9IGx2bV9ldmVuX3JhbmQoc2VlZCwgaSk7CisKKwkJLyoKKwkJICogSWYgdGhlIGJpdCB3YXMgYWxyZWFkeSBzZXQsIHNldCB0aGUgbmV3IGJpdCB0aGF0IGJlY2FtZQorCQkgKiBjaG9vc2FibGUgZm9yIHRoZSBmaXJzdCB0aW1lIGR1cmluZyB0aGlzIHBhc3MuCisJCSAqIFRoaXMgbWFpbnRhaW5zIGEgdW5pZm9ybSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gYnkgY29tcGVuc2F0aW5nCisJCSAqIGZvciBiZWluZyB1bmFibGUgdG8gc2VsZWN0IGl0IHVudGlsIHRoaXMgcGFzcy4KKwkJICovCisJCWlmIChkbV9iaXQoYnMsIGJpdF9zZWxlY3RlZCkpCisJCQliaXRfc2VsZWN0ZWQgPSBpIC0gMTsKKworCQlkbV9iaXRfc2V0KGJzLCBiaXRfc2VsZWN0ZWQpOworCisJCWlmIChkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUgIiwgYml0X3NlbGVjdGVkKSA8IDApIHsKKwkJCWxvZ19lcnJvcigic25wcmludGYgcmFuZG9tIGJpdCBmYWlsZWQuIik7CisJCQlkbV9wb29sX2ZyZWUobWVtLCBicyk7CisgICAgICAgICAgICAgICAgCXJldHVybiBOVUxMOworCQl9CisJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sIGJ1Ziwgc3RybGVuKGJ1ZikpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSBsaXN0IG9mIHJhbmRvbSBiaXRzLiIpOworCQkJZG1fcG9vbF9mcmVlKG1lbSwgYnMpOworICAgICAgICAgICAgICAgIAlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICJcMCIsIDEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmlzaCBsaXN0IG9mIHJhbmRvbSBiaXRzLiIpOworCQlkbV9wb29sX2ZyZWUobWVtLCBicyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiU2VsZWN0ZWQgJSIgUFJJdTMyICIgcmFuZG9tIGJpdHMgZnJvbSAlIiBQUkl1MzIgIjogJXMiLCBudW1fc2V0X2JpdHMsIG51bV9iaXRzLCAoY2hhciAqKSBkbV9wb29sX2VuZF9vYmplY3QobWVtKSk7CisKKwlyZXR1cm4gYnM7Cit9CisKK3N0YXRpYyBpbnQgX3ZnX2lnbm9yZV9tZGFzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1aW50MzJfdCBudW1fdG9faWdub3JlKQoreworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisJdWludDMyX3QgbWRhX3VzZWRfY291bnQgPSB2Z19tZGFfdXNlZF9jb3VudCh2Zyk7CisJZG1fYml0c2V0X3QgbWRhX3RvX2lnbm9yZV9iczsKKwlpbnQgciA9IDE7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkFkanVzdGluZyBpZ25vcmVkIG1kYXMgZm9yICVzOiAlIiBQUkl1MzIgIiBvZiAlIiBQUkl1MzIgIiBtZGFzIGluIHVzZSAiCisJCQkgICAiYnV0ICUiIFBSSXUzMiAiIHJlcXVpcmVkLiAgQ2hhbmdpbmcgJSIgUFJJdTMyICIgbWRhLiIsCisJCQkgICB2Zy0+bmFtZSwgbWRhX3VzZWRfY291bnQsIHZnX21kYV9jb3VudCh2ZyksIHZnX21kYV9jb3BpZXModmcpLCBudW1fdG9faWdub3JlKTsKKworCWlmICghbnVtX3RvX2lnbm9yZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShtZGFfdG9faWdub3JlX2JzID0gX2JpdHNldF93aXRoX3JhbmRvbV9iaXRzKHZnLT52Z21lbSwgbWRhX3VzZWRfY291bnQsCisJCQkJCQkJICBudW1fdG9faWdub3JlLCAmdmctPmNtZC0+cmFuZF9zZWVkKSkpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkKKwkJaWYgKCFtZGFfaXNfaWdub3JlZChtZGEpICYmICgtLW1kYV91c2VkX2NvdW50LAorCQkgICAgZG1fYml0KG1kYV90b19pZ25vcmVfYnMsIG1kYV91c2VkX2NvdW50KSkpIHsKKwkJCW1kYV9zZXRfaWdub3JlZChtZGEsIDEpOworCQkJaWYgKCEtLW51bV90b19pZ25vcmUpCisJCQkJZ290byBvdXQ7CisJCX0KKworCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5hYmxlIHRvIGZpbmQgJSJQUkl1MzIiIG1ldGFkYXRhIGFyZWFzIHRvIGlnbm9yZSAiCisJCSAgIm9uIHZvbHVtZSBncm91cCAlcyIsIG51bV90b19pZ25vcmUsIHZnLT5uYW1lKTsKKworCXIgPSAwOworCitvdXQ6CisJZG1fcG9vbF9mcmVlKHZnLT52Z21lbSwgbWRhX3RvX2lnbm9yZV9icyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3ZnX3VuaWdub3JlX21kYXMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG51bV90b191bmlnbm9yZSkKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCAqdG1kYTsKKwl1aW50MzJfdCBtZGFfdXNlZF9jb3VudCA9IHZnX21kYV91c2VkX2NvdW50KHZnKTsKKwl1aW50MzJfdCBtZGFfY291bnQgPSB2Z19tZGFfY291bnQodmcpOworCXVpbnQzMl90IG1kYV9mcmVlX2NvdW50ID0gbWRhX2NvdW50IC0gbWRhX3VzZWRfY291bnQ7CisJZG1fYml0c2V0X3QgbWRhX3RvX3VuaWdub3JlX2JzOworCWludCByID0gMTsKKworCWlmICghbnVtX3RvX3VuaWdub3JlKQorCQlyZXR1cm4gMTsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQWRqdXN0aW5nIGlnbm9yZWQgbWRhcyBmb3IgJXM6ICUiIFBSSXUzMiAiIG9mICUiIFBSSXUzMiAiIG1kYXMgaW4gdXNlICIKKwkJCSAgICJidXQgJSIgUFJJdTMyICIgcmVxdWlyZWQuICBDaGFuZ2luZyAlIiBQUkl1MzIgIiBtZGEuIiwKKwkJCSAgIHZnLT5uYW1lLCBtZGFfdXNlZF9jb3VudCwgbWRhX2NvdW50LCB2Z19tZGFfY29waWVzKHZnKSwgbnVtX3RvX3VuaWdub3JlKTsKKworCWlmICghKG1kYV90b191bmlnbm9yZV9icyA9IF9iaXRzZXRfd2l0aF9yYW5kb21fYml0cyh2Zy0+dmdtZW0sIG1kYV9mcmVlX2NvdW50LAorCQkJCQkJCSAgICBudW1fdG9fdW5pZ25vcmUsICZ2Zy0+Y21kLT5yYW5kX3NlZWQpKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShtZGEsIHRtZGEsICZ2Zy0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pZ25vcmVkKQorCQlpZiAobWRhX2lzX2lnbm9yZWQobWRhKSAmJiAoLS1tZGFfZnJlZV9jb3VudCwKKwkJICAgIGRtX2JpdChtZGFfdG9fdW5pZ25vcmVfYnMsIG1kYV9mcmVlX2NvdW50KSkpIHsKKwkJCW1kYV9zZXRfaWdub3JlZChtZGEsIDApOworCQkJZG1fbGlzdF9tb3ZlKCZ2Zy0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UsCisJCQkJICAgICAmbWRhLT5saXN0KTsKKwkJCWlmICghLS1udW1fdG9fdW5pZ25vcmUpCisJCQkJZ290byBvdXQ7CisJCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhtZGEsICZ2Zy0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpCisJCWlmIChtZGFfaXNfaWdub3JlZChtZGEpICYmICgtLW1kYV9mcmVlX2NvdW50LAorCQkgICAgZG1fYml0KG1kYV90b191bmlnbm9yZV9icywgbWRhX2ZyZWVfY291bnQpKSkgeworCQkJbWRhX3NldF9pZ25vcmVkKG1kYSwgMCk7CisJCQlpZiAoIS0tbnVtX3RvX3VuaWdub3JlKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuYWJsZSB0byBmaW5kICUiUFJJdTMyIiBtZXRhZGF0YSBhcmVhcyB0byB1bmlnbm9yZSAiCisJCSAib24gdm9sdW1lIGdyb3VwICVzIiwgbnVtX3RvX3VuaWdub3JlLCB2Zy0+bmFtZSk7CisKKwlyID0gMDsKKworb3V0OgorCWRtX3Bvb2xfZnJlZSh2Zy0+dmdtZW0sIG1kYV90b191bmlnbm9yZV9icyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3ZnX2FkanVzdF9pZ25vcmVkX21kYXMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJdWludDMyX3QgbWRhX2NvcGllc191c2VkID0gdmdfbWRhX3VzZWRfY291bnQodmcpOworCisJaWYgKHZnLT5tZGFfY29waWVzID09IFZHTUVUQURBVEFDT1BJRVNfVU5NQU5BR0VEKSB7CisJCS8qIEVuc3VyZSBhdCBsZWFzdCBvbmUgbWRhIGlzIGluIHVzZS4gKi8KKwkJaWYgKCFtZGFfY29waWVzX3VzZWQgJiYgdmdfbWRhX2NvdW50KHZnKSAmJiAhX3ZnX3VuaWdub3JlX21kYXModmcsIDEpKQorCQkJcmV0dXJuXzA7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKworCisJLyogTm90IGFuIGVycm9yIHRvIGhhdmUgdmdfbWRhX2NvdW50IGxhcmdlciB0aGFuIHRvdGFsIG1kYXMuICovCisJaWYgKHZnLT5tZGFfY29waWVzID09IFZHTUVUQURBVEFDT1BJRVNfQUxMIHx8CisJICAgIHZnLT5tZGFfY29waWVzID49IHZnX21kYV9jb3VudCh2ZykpIHsKKwkJLyogVXNlIGFsbCAqLworCQlpZiAoIV92Z191bmlnbm9yZV9tZGFzKHZnLCB2Z19tZGFfY291bnQodmcpIC0gbWRhX2NvcGllc191c2VkKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSBpZiAobWRhX2NvcGllc191c2VkIDwgdmctPm1kYV9jb3BpZXMpIHsKKwkJaWYgKCFfdmdfdW5pZ25vcmVfbWRhcyh2ZywgdmctPm1kYV9jb3BpZXMgLSBtZGFfY29waWVzX3VzZWQpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmIChtZGFfY29waWVzX3VzZWQgPiB2Zy0+bWRhX2NvcGllcykKKwkJaWYgKCFfdmdfaWdub3JlX21kYXModmcsIG1kYV9jb3BpZXNfdXNlZCAtIHZnLT5tZGFfY29waWVzKSkKKwkJCXJldHVybl8wOworCisJLyoKKwkgKiBUaGUgVkdNRVRBREFUQUNPUElFU19BTEwgdmFsdWUgd2lsbCBuZXZlciBiZSB3cml0dGVuIGRpc2suCisJICogSXQgaXMgYSBzcGVjaWFsIGNtZGxpbmUgdmFsdWUgdGhhdCBtZWFucyAyIHRoaW5nczoKKwkgKiAxLiBjbGVhciBhbGwgaWdub3JlIGJpdHMgaW4gYWxsIG1kYXMgaW4gdGhpcyB2ZworCSAqIDIuIHNldCB0aGUgInVubWFuYWdlZCIgcG9saWN5IGdvaW5nIGZvcndhcmQgZm9yIG1ldGFkYXRhIGJhbGFuY2luZworCSAqLworCWlmICh2Zy0+bWRhX2NvcGllcyA9PSBWR01FVEFEQVRBQ09QSUVTX0FMTCkKKwkJdmctPm1kYV9jb3BpZXMgPSBWR01FVEFEQVRBQ09QSUVTX1VOTUFOQUdFRDsKKworCXJldHVybiAxOworfQorCit1aW50NjRfdCBmaW5kX21pbl9tZGFfc2l6ZShzdHJ1Y3QgZG1fbGlzdCAqbWRhcykKK3sKKwl1aW50NjRfdCBtaW5fbWRhX3NpemUgPSBVSU5UNjRfTUFYLCBtZGFfc2l6ZTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgbWRhcykgeworCQlpZiAoIW1kYS0+b3BzLT5tZGFfdG90YWxfc2VjdG9ycykKKwkJCWNvbnRpbnVlOworCQltZGFfc2l6ZSA9IG1kYS0+b3BzLT5tZGFfdG90YWxfc2VjdG9ycyhtZGEpOworCQlpZiAobWRhX3NpemUgPCBtaW5fbWRhX3NpemUpCisJCQltaW5fbWRhX3NpemUgPSBtZGFfc2l6ZTsKKwl9CisKKwlpZiAobWluX21kYV9zaXplID09IFVJTlQ2NF9NQVgpCisJCW1pbl9tZGFfc2l6ZSA9IFVJTlQ2NF9DKDApOworCisJcmV0dXJuIG1pbl9tZGFfc2l6ZTsKK30KKworc3RhdGljIGludCBfbW92ZV9tZGFzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvLAorCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqbWRhc19mcm9tLCBzdHJ1Y3QgZG1fbGlzdCAqbWRhc190bykKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCAqbWRhMjsKKwlpbnQgY29tbW9uX21kYSA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShtZGEsIG1kYTIsIG1kYXNfZnJvbSkgeworCQlpZiAoIW1kYS0+b3BzLT5tZGFfaW5fdmcpIHsKKwkJCWNvbW1vbl9tZGEgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIW1kYS0+b3BzLT5tZGFfaW5fdmcodmdfZnJvbS0+ZmlkLCB2Z19mcm9tLCBtZGEpKSB7CisJCQlpZiAoaXNfb3JwaGFuX3ZnKHZnX3RvLT5uYW1lKSkKKwkJCQlkbV9saXN0X2RlbCgmbWRhLT5saXN0KTsKKwkJCWVsc2UKKwkJCQlkbV9saXN0X21vdmUobWRhc190bywgJm1kYS0+bGlzdCk7CisJCX0KKwl9CisJcmV0dXJuIGNvbW1vbl9tZGE7Cit9CisKKy8qCisgKiBTZXBhcmF0ZSBtZXRhZGF0YSBhcmVhcyBhZnRlciBzcGxpdHRpbmcgYSBWRy4KKyAqIEFsc28gYWNjZXB0cyBvcnBoYW4gVkcgYXMgZGVzdGluYXRpb24gKGZvciB2Z3JlZHVjZSkuCisgKi8KK2ludCB2Z19zcGxpdF9tZGFzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvKQoreworCXN0cnVjdCBkbV9saXN0ICptZGFzX2Zyb21faW5fdXNlLCAqbWRhc190b19pbl91c2U7CisJc3RydWN0IGRtX2xpc3QgKm1kYXNfZnJvbV9pZ25vcmVkLCAqbWRhc190b19pZ25vcmVkOworCWludCBjb21tb25fbWRhID0gMDsKKworCW1kYXNfZnJvbV9pbl91c2UgPSAmdmdfZnJvbS0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2U7CisJbWRhc19mcm9tX2lnbm9yZWQgPSAmdmdfZnJvbS0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pZ25vcmVkOworCW1kYXNfdG9faW5fdXNlID0gJnZnX3RvLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZTsKKwltZGFzX3RvX2lnbm9yZWQgPSAmdmdfdG8tPmZpZC0+bWV0YWRhdGFfYXJlYXNfaWdub3JlZDsKKworCWNvbW1vbl9tZGEgPSBfbW92ZV9tZGFzKHZnX2Zyb20sIHZnX3RvLAorCQkJCW1kYXNfZnJvbV9pbl91c2UsIG1kYXNfdG9faW5fdXNlKTsKKwljb21tb25fbWRhID0gX21vdmVfbWRhcyh2Z19mcm9tLCB2Z190bywKKwkJCQltZGFzX2Zyb21faWdub3JlZCwgbWRhc190b19pZ25vcmVkKTsKKworCWlmICgoZG1fbGlzdF9lbXB0eShtZGFzX2Zyb21faW5fdXNlKSAmJgorCSAgICAgZG1fbGlzdF9lbXB0eShtZGFzX2Zyb21faWdub3JlZCkpIHx8CisJICAgICgoIWlzX29ycGhhbl92Zyh2Z190by0+bmFtZSkgJiYKKwkgICAgICBkbV9saXN0X2VtcHR5KG1kYXNfdG9faW5fdXNlKSAmJgorCSAgICAgIGRtX2xpc3RfZW1wdHkobWRhc190b19pZ25vcmVkKSkpKQorCQlyZXR1cm4gY29tbW9uX21kYTsKKworCXJldHVybiAxOworfQorCit2b2lkIHB2Y3JlYXRlX3BhcmFtc19zZXRfZGVmYXVsdHMoc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApCit7CisJbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisKKwlwcC0+emVybyA9IDE7CisJcHAtPmZvcmNlID0gUFJPTVBUOworCXBwLT55ZXMgPSAwOworCXBwLT5yZXN0b3JlZmlsZSA9IE5VTEw7CisJcHAtPnV1aWRfc3RyID0gTlVMTDsKKworCXBwLT5wdmEuc2l6ZSA9IDA7CisJcHAtPnB2YS5kYXRhX2FsaWdubWVudCA9IFVJTlQ2NF9DKDApOworCXBwLT5wdmEuZGF0YV9hbGlnbm1lbnRfb2Zmc2V0ID0gVUlOVDY0X0MoMCk7CisJcHAtPnB2YS5wdm1ldGFkYXRhY29waWVzID0gREVGQVVMVF9QVk1FVEFEQVRBQ09QSUVTOworCXBwLT5wdmEucHZtZXRhZGF0YXNpemUgPSBERUZBVUxUX1BWTUVUQURBVEFTSVpFOworCXBwLT5wdmEubGFiZWxfc2VjdG9yID0gREVGQVVMVF9MQUJFTFNFQ1RPUjsKKwlwcC0+cHZhLm1ldGFkYXRhaWdub3JlID0gREVGQVVMVF9QVk1FVEFEQVRBSUdOT1JFOworCXBwLT5wdmEuYmFfc3RhcnQgPSAwOworCXBwLT5wdmEuYmFfc2l6ZSA9IDA7CisJcHAtPnB2YS5wZV9zdGFydCA9IFBWX1BFX1NUQVJUX0NBTEM7CisJcHAtPnB2YS5leHRlbnRfY291bnQgPSAwOworCXBwLT5wdmEuZXh0ZW50X3NpemUgPSAwOworCisJZG1fbGlzdF9pbml0KCZwcC0+cHJvbXB0cyk7CisJZG1fbGlzdF9pbml0KCZwcC0+YXJnX2RldmljZXMpOworCWRtX2xpc3RfaW5pdCgmcHAtPmFyZ19wcm9jZXNzKTsKKwlkbV9saXN0X2luaXQoJnBwLT5hcmdfY29uZmlybSk7CisJZG1fbGlzdF9pbml0KCZwcC0+YXJnX2NyZWF0ZSk7CisJZG1fbGlzdF9pbml0KCZwcC0+YXJnX3JlbW92ZSk7CisJZG1fbGlzdF9pbml0KCZwcC0+YXJnX2ZhaWwpOworCWRtX2xpc3RfaW5pdCgmcHAtPnB2cyk7Cit9CisKKy8qCisgKiBTZWUgaWYgd2UgbWF5IHB2Y3JlYXRlIG9uIHRoaXMgZGV2aWNlLgorICogMCBpbmRpY2F0ZXMgd2UgbWF5IG5vdC4KKyAqLworc3RhdGljIGludCBfcHZjcmVhdGVfY2hlY2soc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCwgaW50ICp3aXBlZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciByZWFsbHlfaW5pdF9tc2dbXSA9ICJSZWFsbHkgSU5JVElBTElaRSBwaHlzaWNhbCB2b2x1bWUiOworCXN0YXRpYyBjb25zdCBjaGFyIG5vdF9pbml0X21zZ1tdID0gInBoeXNpY2FsIHZvbHVtZSBub3QgaW5pdGlhbGl6ZWQiOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgciA9IDA7CisJaW50IHNjYW5fbmVlZGVkID0gMDsKKwlpbnQgZmlsdGVyX3JlZnJlc2hfbmVlZGVkID0gMDsKKwlpbnQgdXNlZDsKKworCS8qIEZJWE1FIENoZWNrIHBhcnRpdGlvbiB0eXBlIGlzIExWTSB1bmxlc3MgLS1mb3JjZSBpcyBnaXZlbiAqLworCisJKndpcGVkID0gMDsKKworCS8qIElzIHRoZXJlIGEgcHYgaGVyZSBhbHJlYWR5PyAqLworCXB2ID0gZmluZF9wdl9ieV9uYW1lKGNtZCwgbmFtZSwgMSwgMSk7CisKKwkvKiBBbGxvdyBwYXJ0aWFsICYgZXhwb3J0ZWQgVkdzIHRvIGJlIGRlc3Ryb3llZC4gKi8KKwkvKiBXZSBtdXN0IGhhdmUgLWZmIHRvIG92ZXJ3cml0ZSBhIG5vbiBvcnBoYW4gKi8KKwlpZiAocHYpIHsKKwkJaWYgKCFpc19vcnBoYW4ocHYpICYmIHBwLT5mb3JjZSAhPSBET05UX1BST01QVF9PVkVSUklERSkgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBpbml0aWFsaXplIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgb2YgIgorCQkJCSAgInZvbHVtZSBncm91cCBcIiVzXCIgd2l0aG91dCAtZmYuIiwgbmFtZSwgcHZfdmdfbmFtZShwdikpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoKHVzZWQgPSBpc191c2VkX3B2KHB2KSkgPCAwKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKHVzZWQgJiYgcHAtPmZvcmNlICE9IERPTlRfUFJPTVBUX09WRVJSSURFKSB7CisJCQlsb2dfZXJyb3IoIlBWICVzIGlzIHVzZWQgYnkgYSBWRyBidXQgaXRzIG1ldGFkYXRhIGlzIG1pc3NpbmcuIiwgbmFtZSk7CisJCQlsb2dfZXJyb3IoIkNhbid0IGluaXRpYWxpemUgUFYgJyVzJyB3aXRob3V0IC1mZi4iLCBuYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogcHJvbXB0ICovCisJaWYgKHB2ICYmICFwcC0+eWVzKSB7CisJCWlmIChpc19vcnBoYW4ocHYpKSB7CisJCQlpZiAodXNlZCkgeworCQkJCWlmICh5ZXNfbm9fcHJvbXB0KCIlcyBcIiVzXCIgdGhhdCBpcyBtYXJrZWQgYXMgYmVsb25naW5nIHRvIGEgVkcgW3kvbl0/ICIsCisJCQkJCQkgIHJlYWxseV9pbml0X21zZywgbmFtZSkgPT0gJ24nKSB7CisJCQkJCWxvZ19lcnJvcigiJXM6ICVzIiwgbmFtZSwgbm90X2luaXRfbXNnKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHllc19ub19wcm9tcHQoIiVzIFwiJXNcIiBvZiB2b2x1bWUgZ3JvdXAgXCIlc1wiIFt5L25dPyAiLAorCQkJCQkgIHJlYWxseV9pbml0X21zZywgbmFtZSwgcHZfdmdfbmFtZShwdikpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiJXM6ICVzIiwgbmFtZSwgbm90X2luaXRfbXNnKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzaWdpbnRfY2F1Z2h0KCkpCisJCWdvdG9fb3V0OworCisJZGV2ID0gZGV2X2NhY2hlX2dldChuYW1lLCBjbWQtPmZ1bGxfZmlsdGVyKTsKKworCS8qCisJICogUmVmcmVzaCtyZXNjYW4gYXQgdGhlIGVuZCBpcyBuZWVkZWQgaWY6CisJICogICAtIHdlIGRvbid0IG9idGFpbiBkZXZpY2UgbGlzdCBmcm9tIHVkZXYsCisJICogICAgIGhlbmNlIHBlcnNpc3RlbnQgY2FjaGUgZmlsZSBpcyB1c2VkCisJICogICAgIGFuZCB3ZSBuZWVkIHRvIHRyYXNoIGl0IGFuZCByZWV2YWx1YXRlCisJICogICAgIGZvciBhbnkgY2hhbmdlcyBkb25lIG91dHNpZGUgLSBhZGRpbmcKKwkgKiAgICAgYW55IG5ldyBmb3JlaWduIHNpZ25hdHVyZSB3aGljaCBtYXkgYWZmZWN0CisJICogICAgIGZpbHRlcmluZyAtIGJlZm9yZSB3ZSBkbyBwdmNyZWF0ZSwgd2UKKwkgKiAgICAgbmVlZCB0byBiZSBzdXJlIHRoYXQgd2UgaGF2ZSB1cC10by1kYXRlCisJICogICAgIHZpZXcgZm9yIGZpbHRlcnMKKwkgKgorCSAqICAgLSB3ZSBoYXZlIHdpcGVkIGV4aXN0aW5nIGZvcmVpZ24gc2lnbmF0dXJlcworCSAqICAgICBmcm9tIGRldiBhcyB0aGlzIG1heSBhZmZlY3Qgd2hhdCdzIGZpbHRlcmVkCisJICogICAgIGFzIHdlbGwKKwkgKgorCSAqCisJICogT25seSByZXNjYW4gYXQgdGhlIGVuZCBpcyBuZWVkZWQgaWY6CisJICogICAtIHdlJ3ZlIGp1c3QgY2hlY2tlZCB3aGV0aGVyIGRldiBpcyBmaWxldGVyZAorCSAqICAgICBieSBNRCBmaWx0ZXIuIFdlIGRvIHRoZSByZWZyZXNoIGluLXNpdHUsCisJICogICAgIHNvIG5vIG5lZWQgdG8gcmVxdWlyZSB0aGUgcmVmcmVzaCBhdCB0aGUKKwkgKiAgICAgZW5kIG9mIHRoaXMgZm4uIFRoaXMgaXMgdG8gYWxsb3cgZm9yCisJICogICAgIHdpcGluZyBNRCBzaWduYXR1cmUgZHVyaW5nIHB2Y3JlYXRlIGZvcgorCSAqICAgICB0aGUgZGV2IC0gdGhlIGRldiB3b3VsZCBub3JtYWxseSBiZQorCSAqICAgICBmaWx0ZXJlZCBiZWNhdXNlIG9mIE1EIGZpbHRlci4KKwkgKiAgICAgVGhpcyBpcyBhbiBleGNlcHRpb24uCisJICovCisKKwkvKiBJcyB0aGVyZSBhbiBtZCBzdXBlcmJsb2NrIGhlcmU/ICovCisJaWYgKCFkZXYgJiYgbWRfZmlsdGVyaW5nKCkpIHsKKwkJaWYgKCFyZWZyZXNoX2ZpbHRlcnMoY21kKSkKKwkJCWdvdG9fb3V0OworCisJCWluaXRfbWRfZmlsdGVyaW5nKDApOworCQlkZXYgPSBkZXZfY2FjaGVfZ2V0KG5hbWUsIGNtZC0+ZnVsbF9maWx0ZXIpOworCQlpbml0X21kX2ZpbHRlcmluZygxKTsKKworCQlzY2FuX25lZWRlZCA9IDE7CisJfSBlbHNlIGlmICghb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldigpKQorCQlmaWx0ZXJfcmVmcmVzaF9uZWVkZWQgPSBzY2FuX25lZWRlZCA9IDE7CisKKwlpZiAoIWRldikgeworCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQgKG9yIGlnbm9yZWQgYnkgZmlsdGVyaW5nKS4iLCBuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHRoZSBkZXZpY2UgYmVsb25ncyB0byBhbiBNRCBhcnJheS4KKwkgKi8KKwlpZiAoIWRldl90ZXN0X2V4Y2woZGV2KSkgeworCQkvKiBGSVhNRSBEZXRlY3Qgd2hldGhlciBkZXZpY2UtbWFwcGVyIGl0c2VsZiBpcyBzdGlsbCB1c2luZyBpdCAqLworCQlsb2dfZXJyb3IoIkNhbid0IG9wZW4gJXMgZXhjbHVzaXZlbHkuICBNb3VudGVkIGZpbGVzeXN0ZW0/IiwKKwkJCSAgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghd2lwZV9rbm93bl9zaWduYXR1cmVzKGNtZCwgZGV2LCBuYW1lLAorCQkJCSAgIFRZUEVfTFZNMV9NRU1CRVIgfCBUWVBFX0xWTTJfTUVNQkVSLAorCQkJCSAgIDAsIHBwLT55ZXMsIHBwLT5mb3JjZSwgd2lwZWQpKSB7CisJCWxvZ19lcnJvcigiQWJvcnRpbmcgcHZjcmVhdGUgb24gJXMuIiwgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgqd2lwZWQpCisJCWZpbHRlcl9yZWZyZXNoX25lZWRlZCA9IHNjYW5fbmVlZGVkID0gMTsKKworCWlmIChzaWdpbnRfY2F1Z2h0KCkpCisJCWdvdG9fb3V0OworCisJaWYgKHB2ICYmICFpc19vcnBoYW4ocHYpICYmIHBwLT5mb3JjZSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEZvcmNpbmcgcGh5c2ljYWwgdm9sdW1lIGNyZWF0aW9uIG9uICIKKwkJCSAgIiVzJXMlcyVzIiwgbmFtZSwKKwkJCSAgIWlzX29ycGhhbihwdikgPyAiIG9mIHZvbHVtZSBncm91cCBcIiIgOiAiIiwKKwkJCSAgcHZfdmdfbmFtZShwdiksCisJCQkgICFpc19vcnBoYW4ocHYpID8gIlwiIiA6ICIiKTsKKworCXIgPSAxOworCitvdXQ6CisJaWYgKGZpbHRlcl9yZWZyZXNoX25lZWRlZCkKKwkJaWYgKCFyZWZyZXNoX2ZpbHRlcnMoY21kKSkgeworCQkJc3RhY2s7CisJCQlyID0gMDsKKwkJfQorCisJaWYgKHNjYW5fbmVlZGVkKSB7CisJCWx2bWNhY2hlX2ZvcmNlX25leHRfbGFiZWxfc2NhbigpOworCQlpZiAoIWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKSkgeworCQkJc3RhY2s7CisJCQlyID0gMDsKKwkJfQorCX0KKworCWZyZWVfcHZfZmlkKHB2KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcHZjcmVhdGVfd3JpdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwdl90b193cml0ZSAqcHZ3KQoreworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0gcHZ3LT5wdjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwdi0+ZGV2OworCWNvbnN0IGNoYXIgKnB2X25hbWUgPSBkZXZfbmFtZShkZXYpOworCisJaWYgKHB2dy0+bmV3X3B2KSB7CisJCS8qIFdpcGUgZXhpc3RpbmcgbGFiZWwgZmlyc3QgKi8KKwkJaWYgKCFsYWJlbF9yZW1vdmUocHZfZGV2KHB2KSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwgb24gJXMiLCBwdl9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHB2dy0+cHAtPnplcm8pIHsKKwkJCWxvZ192ZXJib3NlKCJaZXJvaW5nIHN0YXJ0IG9mIGRldmljZSAlcyIsIHB2X25hbWUpOworCQkJaWYgKCFkZXZfb3Blbl9xdWlldChkZXYpKSB7CisJCQkJbG9nX2Vycm9yKCIlcyBub3Qgb3BlbmVkOiBkZXZpY2Ugbm90IHplcm9lZCIsIHB2X25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoIWRldl9zZXQoZGV2LCBVSU5UNjRfQygwKSwgKHNpemVfdCkgMjA0OCwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoIiVzIG5vdCB3aXBlZDogYWJvcnRpbmciLCBwdl9uYW1lKTsKKwkJCQlpZiAoIWRldl9jbG9zZShkZXYpKQorCQkJCQlzdGFjazsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghZGV2X2Nsb3NlKGRldikpCisJCQkJc3RhY2s7CisJCX0KKwl9CisKKwlsb2dfdmVyYm9zZSgiV3JpdGluZyBwaHlzaWNhbCB2b2x1bWUgZGF0YSB0byBkaXNrIFwiJXNcIiIsCisJCSAgICBwdl9uYW1lKTsKKworCWlmICghKHB2X3dyaXRlKGNtZCwgcHYsIDEpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIiwgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwdnctPm5ld19wdikKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQiLCBwdl9uYW1lKTsKKwllbHNlCisJCWxvZ192ZXJib3NlKCJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIHN1Y2Nlc3NmdWxseSB3cml0dGVuIiwgcHZfbmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmVyaWZ5X3B2X2NyZWF0ZV9wYXJhbXMoc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApCit7CisJLyoKKwkgKiBGSVhNRTogU29tZSBvZiB0aGVzZSBjaGVja3MgYXJlIGR1cGxpY2F0ZXMgaW4gcHZjcmVhdGVfcGFyYW1zX3ZhbGlkYXRlLgorCSAqLworCWlmIChwcC0+cHZhLnB2bWV0YWRhdGFjb3BpZXMgPiAyKSB7CisJCWxvZ19lcnJvcigiTWV0YWRhdGFjb3BpZXMgbWF5IG9ubHkgYmUgMCwgMSBvciAyIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcC0+cHZhLmRhdGFfYWxpZ25tZW50ID4gVUlOVDMyX01BWCkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSBkYXRhIGFsaWdubWVudCBpcyB0b28gYmlnLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHAtPnB2YS5kYXRhX2FsaWdubWVudF9vZmZzZXQgPiBVSU5UMzJfTUFYKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lIGRhdGEgYWxpZ25tZW50IG9mZnNldCBpcyB0b28gYmlnLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogcHZjcmVhdGVfdm9sKCkgLSBpbml0aWFsaXplIGEgZGV2aWNlIHdpdGggUFYgbGFiZWwgYW5kIG1ldGFkYXRhIGFyZWEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogLSBwdl9uYW1lOiBkZXZpY2UgcGF0aCB0byBpbml0aWFsaXplCisgKiAtIHBwOiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gcHZfY3JlYXRlOyBpZiBOVUxMLCB1c2UgZGVmYXVsdCB2YWx1ZXMKKyAqCisgKiBSZXR1cm5zOgorICogTlVMTDogZXJyb3IKKyAqIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKiAobm9uLU5VTEwpOiBoYW5kbGUgdG8gcGh5c2ljYWwgdm9sdW1lIGNyZWF0ZWQKKyAqLworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHZjcmVhdGVfdm9sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpwdl9uYW1lLAorCQkJCSAgICAgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHAsIGludCB3cml0ZV9ub3cpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgd2lwZWQgPSAwOworCXN0cnVjdCBkbV9saXN0IG1kYXM7CisJc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyBkZWZhdWx0X3BwOworCWNoYXIgYnVmZmVyWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJZGV2X2V4dF90IGRldl9leHRfc3JjOworCisJcHZjcmVhdGVfcGFyYW1zX3NldF9kZWZhdWx0cygmZGVmYXVsdF9wcCk7CisJaWYgKCFwcCkKKwkJcHAgPSAmZGVmYXVsdF9wcDsKKworCWlmICghX3ZlcmlmeV9wdl9jcmVhdGVfcGFyYW1zKHBwKSkgeworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAocHAtPnB2YS5pZHApIHsKKwkJaWYgKChkZXYgPSBsdm1jYWNoZV9kZXZpY2VfZnJvbV9wdmlkKGNtZCwgcHAtPnB2YS5pZHAsIE5VTEwsIE5VTEwpKSAmJgorCQkgICAgKGRldiAhPSBkZXZfY2FjaGVfZ2V0KHB2X25hbWUsIGNtZC0+ZnVsbF9maWx0ZXIpKSkgeworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoKGNvbnN0IHN0cnVjdCBpZCopJnBwLT5wdmEuaWRwLT51dWlkLAorCQkJICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQkJCWdvdG9fYmFkOworCQkJbG9nX2Vycm9yKCJ1dWlkICVzIGFscmVhZHkgaW4gdXNlIG9uIFwiJXNcIiIsIGJ1ZmZlciwKKwkJCQkgIGRldl9uYW1lKGRldikpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwlpZiAoIV9wdmNyZWF0ZV9jaGVjayhjbWQsIHB2X25hbWUsIHBwLCAmd2lwZWQpKQorCQlnb3RvX2JhZDsKKworCWlmIChzaWdpbnRfY2F1Z2h0KCkpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiB3aXBlX2tub3duX3NpZ25hdHVyZXMgY2FsbGVkIGluIF9wdmNyZWF0ZV9jaGVjayBmaXJlcworCSAqIFdBVENIIGV2ZW50IHRvIHVwZGF0ZSB1ZGV2IGRhdGFiYXNlLiBCdXQgYXQgdGhlIG1vbWVudCwKKwkgKiB3ZSBoYXZlIG5vIHdheSB0byBzeW5jaHJvbml6ZSB3aXRoIHN1Y2ggZXZlbnQgLSB3ZSBtYXkKKwkgKiBlbmQgdXAgc3RpbGwgc2VlaW5nIHRoZSBvbGQgaW5mbyBpbiB1ZGV2IGRiIGFuZCBwdmNyZWF0ZQorCSAqIGNhbiBmYWlsIHRvIHByb2NlZWQgYmVjYXVzZSBvZiB0aGUgZGV2aWNlIHN0aWxsIGJlaW5nCisJICogZmlsdGVyZWQgKGJlY2F1c2Ugb2YgdGhlIHN0YWxlIGluZm8gaW4gdWRldiBkYikuCisJICogRGlzYWJsZSB1ZGV2IGRldi1leHQgc291cmNlIHRlbXBvcmFyaWx5IGhlcmUgZm9yCisJICogdGhpcyByZWFzb24gYW5kIHJlc2NhbiB3aXRoIERFVl9FWFRfTk9ORSBkZXYtZXh0CisJICogc291cmNlIChzbyBmaWx0ZXJzIHVzZSBERVZfRVhUX05PTkUgc291cmNlKS4KKwkgKi8KKwlkZXZfZXh0X3NyYyA9IGV4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZSgpOworCWlmICh3aXBlZCAmJiAoZGV2X2V4dF9zcmMgPT0gREVWX0VYVF9VREVWKSkKKwkJaW5pdF9leHRlcm5hbF9kZXZpY2VfaW5mb19zb3VyY2UoREVWX0VYVF9OT05FKTsKKworCWRldiA9IGRldl9jYWNoZV9nZXQocHZfbmFtZSwgY21kLT5mdWxsX2ZpbHRlcik7CisKKwlpbml0X2V4dGVybmFsX2RldmljZV9pbmZvX3NvdXJjZShkZXZfZXh0X3NyYyk7CisKKwlpZiAoIWRldikgeworCQlsb2dfZXJyb3IoIiVzOiBDb3VsZG4ndCBmaW5kIGRldmljZS4gIENoZWNrIHlvdXIgZmlsdGVycz8iLAorCQkJICBwdl9uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJZG1fbGlzdF9pbml0KCZtZGFzKTsKKworCWlmICghKHB2ID0gcHZfY3JlYXRlKGNtZCwgZGV2LCAmcHAtPnB2YSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldHVwIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIiLCBwdl9uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJbG9nX3ZlcmJvc2UoIlNldCB1cCBwaHlzaWNhbCB2b2x1bWUgZm9yIFwiJXNcIiB3aXRoICUiIFBSSXU2NAorCQkgICAgIiBhdmFpbGFibGUgc2VjdG9ycyIsIHB2X25hbWUsIHB2X3NpemUocHYpKTsKKworCXB2LT5zdGF0dXMgfD0gVU5MQUJFTExFRF9QVjsKKwlpZiAod3JpdGVfbm93KSB7CisJCXN0cnVjdCBwdl90b193cml0ZSBwdnc7CisJCXB2dy5wcCA9IHBwOworCQlwdncucHYgPSBwdjsKKwkJcHZ3Lm5ld19wdiA9IDE7CisJCWlmICghX3B2Y3JlYXRlX3dyaXRlKGNtZCwgJnB2dykpCisJCQlnb3RvIGJhZDsKKwl9CisKKwlyZXR1cm4gcHY7CisKK2JhZDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKl9hbGxvY19wdihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisKKwlpZiAoIShwdiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpwdikpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBwdiBzdHJ1Y3R1cmUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXB2LT5kZXYgPSBkZXY7CisKKwlkbV9saXN0X2luaXQoJnB2LT50YWdzKTsKKwlkbV9saXN0X2luaXQoJnB2LT5zZWdtZW50cyk7CisKKwlyZXR1cm4gcHY7Cit9CisKKy8qKgorICogcHZfY3JlYXRlIC0gaW5pdGlhbGl6ZSBhIHBoeXNpY2FsIHZvbHVtZSBmb3IgdXNlIHdpdGggYSB2b2x1bWUgZ3JvdXAKKyAqIGNyZWF0ZWQgUFYgYmVsb25ncyB0byBPcnBoYW4gVkcuCisgKgorICogUmV0dXJuczoKKyAqICAgUFYgaGFuZGxlIC0gcGh5c2ljYWwgdm9sdW1lIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICogICBOVUxMIC0gaW52YWxpZCBwYXJhbWV0ZXIgb3IgcHJvYmxlbSBpbml0aWFsaXppbmcgdGhlIHBoeXNpY2FsIHZvbHVtZQorICovCisKK3N0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2X2NyZWF0ZShjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBwdl9jcmVhdGVfYXJncyAqcHZhKQoreworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10ID0gY21kLT5mbXQ7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGZtdC0+b3JwaGFuX3ZnLT52Z21lbTsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiA9IF9hbGxvY19wdihtZW0sIGRldik7CisJdW5zaWduZWQgbWRhX2luZGV4OworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJdWludDY0X3Qgc2l6ZSA9IHB2YS0+c2l6ZTsKKwl1bnNpZ25lZCBsb25nIGRhdGFfYWxpZ25tZW50ID0gcHZhLT5kYXRhX2FsaWdubWVudDsKKwl1bnNpZ25lZCBsb25nIGRhdGFfYWxpZ25tZW50X29mZnNldCA9IHB2YS0+ZGF0YV9hbGlnbm1lbnRfb2Zmc2V0OworCXVuc2lnbmVkIHB2bWV0YWRhdGFjb3BpZXMgPSBwdmEtPnB2bWV0YWRhdGFjb3BpZXM7CisJdWludDY0X3QgcHZtZXRhZGF0YXNpemUgPSBwdmEtPnB2bWV0YWRhdGFzaXplOworCXVuc2lnbmVkIG1ldGFkYXRhaWdub3JlID0gcHZhLT5tZXRhZGF0YWlnbm9yZTsKKworCWlmICghcHYpCisJCXJldHVybl9OVUxMOworCisJaWYgKHB2YS0+aWRwKQorCQltZW1jcHkoJnB2LT5pZCwgcHZhLT5pZHAsIHNpemVvZigqcHZhLT5pZHApKTsKKwllbHNlIGlmICghaWRfY3JlYXRlKCZwdi0+aWQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSByYW5kb20gdXVpZCBmb3IgJXMuIiwKKwkJCSAgZGV2X25hbWUoZGV2KSk7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghZGV2X2dldF9zaXplKHB2LT5kZXYsICZwdi0+c2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZ2V0IHNpemUuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKHNpemUpIHsKKwkJaWYgKHNpemUgPiBwdi0+c2l6ZSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiAlczogT3ZlcnJpZGluZyByZWFsIHNpemUuICIKKwkJCQkgICJZb3UgY291bGQgbG9zZSBkYXRhLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCWxvZ192ZXJib3NlKCIlczogUHJldGVuZGluZyBzaXplIGlzICUiIFBSSXU2NCAiIHNlY3RvcnMuIiwKKwkJCSAgICBwdl9kZXZfbmFtZShwdiksIHNpemUpOworCQlwdi0+c2l6ZSA9IHNpemU7CisJfQorCisJaWYgKHB2LT5zaXplIDwgcHZfbWluX3NpemUoKSkgeworCQlsb2dfZXJyb3IoIiVzOiBTaXplIG11c3QgZXhjZWVkIG1pbmltdW0gb2YgJSIgUFJJdTY0ICIgc2VjdG9ycy4iLAorCQkJICBwdl9kZXZfbmFtZShwdiksIHB2X21pbl9zaXplKCkpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAocHYtPnNpemUgPCBkYXRhX2FsaWdubWVudCArIGRhdGFfYWxpZ25tZW50X29mZnNldCkgeworCQlsb2dfZXJyb3IoIiVzOiBEYXRhIGFsaWdubWVudCBtdXN0IG5vdCBleGNlZWQgZGV2aWNlIHNpemUuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCEocHZsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnB2bCkpKSkgeworCQlsb2dfZXJyb3IoInB2X2xpc3QgYWxsb2NhdGlvbiBpbiBwdl9jcmVhdGUgZmFpbGVkIik7CisJCWdvdG8gYmFkOworCX0KKworCXB2bC0+cHYgPSBwdjsKKwlhZGRfcHZsX3RvX3ZncyhmbXQtPm9ycGhhbl92ZywgcHZsKTsKKwlmbXQtPm9ycGhhbl92Zy0+ZXh0ZW50X2NvdW50ICs9IHB2LT5wZV9jb3VudDsKKwlmbXQtPm9ycGhhbl92Zy0+ZnJlZV9jb3VudCArPSBwdi0+cGVfY291bnQ7CisKKwlwdi0+Zm10ID0gZm10OworCXB2LT52Z19uYW1lID0gZm10LT5vcnBoYW5fdmdfbmFtZTsKKworCWlmICghZm10LT5vcHMtPnB2X2luaXRpYWxpc2UoZm10LCBwdmEsIHB2KSkgeworCQlsb2dfZXJyb3IoIkZvcm1hdC1zcGVjaWZpYyBpbml0aWFsaXNhdGlvbiBvZiBwaHlzaWNhbCAiCisJCQkgICJ2b2x1bWUgJXMgZmFpbGVkLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCWdvdG8gYmFkOworCX0KKworCWZvciAobWRhX2luZGV4ID0gMDsgbWRhX2luZGV4IDwgcHZtZXRhZGF0YWNvcGllczsgbWRhX2luZGV4KyspIHsKKwkJaWYgKHB2LT5mbXQtPm9wcy0+cHZfYWRkX21ldGFkYXRhX2FyZWEgJiYKKwkJICAgICFwdi0+Zm10LT5vcHMtPnB2X2FkZF9tZXRhZGF0YV9hcmVhKHB2LT5mbXQsIHB2LAorCQkJCQlwdmEtPnBlX3N0YXJ0ICE9IFBWX1BFX1NUQVJUX0NBTEMsCisJCQkJCW1kYV9pbmRleCwgcHZtZXRhZGF0YXNpemUsCisJCQkJCW1ldGFkYXRhaWdub3JlKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIG1ldGFkYXRhIGFyZWEgZm9yICIKKwkJCQkgICJuZXcgcGh5c2ljYWwgdm9sdW1lICVzIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJcmV0dXJuIHB2OworCisgICAgICBiYWQ6CisJLy8gRklYTUU6IGRldGFjaCBmcm9tIG9ycGhhbiBpbiBlcnJvciBwYXRoCisJLy9mcmVlX3B2X2ZpZChwdik7CisJLy9kbV9wb29sX2ZyZWUobWVtLCBwdik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZJWE1FOiBsaWJsdm0gdG9kbyAtIG1ha2UgaW50byBmdW5jdGlvbiB0aGF0IHJldHVybnMgaGFuZGxlICovCitzdHJ1Y3QgcHZfbGlzdCAqZmluZF9wdl9pbl92Zyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgICBjb25zdCBjaGFyICpwdl9uYW1lKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2X2NhY2hlX2dldChwdl9uYW1lLCB2Zy0+Y21kLT5maWx0ZXIpOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGZpbHRlcmVkIG91dCwgZG9uJ3QgYm90aGVyIHRyeWluZworCSAqIHRvIGZpbmQgaXQgaW4gdGhlIGxpc3QuIFRoaXMgYWxzbyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgZmluZGluZyBhCisJICogbm9uLU5VTEwgUFYgd2hpY2ggaGFwcGVucyB0byBiZSBtaXNzaW5nIChpLmUuIGl0cyBwdi0+ZGV2IGlzIE5VTEwpCisJICogZm9yIHN1Y2ggZGV2aWNlcy4KKwkgKi8KKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykKKwkJaWYgKHB2bC0+cHYtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gcHZsOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBwdl9saXN0ICpmaW5kX3B2X2luX3B2X2xpc3QoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnBsLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwbCkKKwkJaWYgKHB2bC0+cHYgPT0gcHYpCisJCQlyZXR1cm4gcHZsOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBwdl9pc19pbl92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKQorCQlpZiAocHYgPT0gcHZsLT5wdikKKwkJCSByZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpbmRfcHZfaW5fdmdfYnlfdXVpZCAtIEZpbmQgUFYgaW4gVkcgYnkgUFYgVVVJRAorICogQHZnOiB2b2x1bWUgZ3JvdXAgdG8gc2VhcmNoCisgKiBAaWQ6IFVVSUQgb2YgdGhlIFBWIHRvIG1hdGNoCisgKgorICogUmV0dXJuczoKKyAqICAgc3RydWN0IHB2X2xpc3Qgd2l0aGluIG93bmluZyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIC0gaWYgVVVJRCBvZiBQViBmb3VuZCBpbiBWRworICogICBOVUxMIC0gaW52YWxpZCBwYXJhbWV0ZXIgb3IgVVVJRCBvZiBQViBub3QgZm91bmQgaW4gVkcKKyAqCisgKiBOb3RlCisgKiAgIEZJWE1FIC0gbGlibHZtIHRvZG8gLSBtYWtlIGludG8gZnVuY3Rpb24gdGhhdCB0YWtlcyBWRyBoYW5kbGUKKyAqLworc3RydWN0IHB2X2xpc3QgKmZpbmRfcHZfaW5fdmdfYnlfdXVpZChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaWQgKmlkKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykKKwkJaWYgKGlkX2VxdWFsKCZwdmwtPnB2LT5pZCwgaWQpKQorCQkJcmV0dXJuIHB2bDsKKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbHZfbGlzdCAqZmluZF9sdl9pbl92Zyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmx2X25hbWUpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwljb25zdCBjaGFyICpwdHI7CisKKwkvKiBVc2UgbGFzdCBjb21wb25lbnQgKi8KKwlpZiAoKHB0ciA9IHN0cnJjaHIobHZfbmFtZSwgJy8nKSkpCisJCXB0cisrOworCWVsc2UKKwkJcHRyID0gbHZfbmFtZTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAoIXN0cmNtcChsdmwtPmx2LT5uYW1lLCBwdHIpKQorCQkJcmV0dXJuIGx2bDsKKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbHZfbGlzdCAqZmluZF9sdl9pbl9sdl9saXN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpsbCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsbCkKKwkJaWYgKGx2bC0+bHYgPT0gbHYpCisJCQlyZXR1cm4gbHZsOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9sdl9pbl92Z19ieV9sdmlkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICAgIGNvbnN0IHVuaW9uIGx2aWQgKmx2aWQpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAoIXN0cm5jbXAobHZsLT5sdi0+bHZpZC5zLCBsdmlkLT5zLCBzaXplb2YoKmx2aWQpKSkKKwkJCXJldHVybiBsdmwtPmx2OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9sdihjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgICBjb25zdCBjaGFyICpsdl9uYW1lKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmwgPSBmaW5kX2x2X2luX3ZnKHZnLCBsdl9uYW1lKTsKKwlyZXR1cm4gbHZsID8gbHZsLT5sdiA6IE5VTEw7Cit9CisKK3N0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpmaW5kX2hpc3RvcmljYWxfZ2x2KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqaGlzdG9yaWNhbF9sdl9uYW1lLAorCQkJCQkgICAgICAgaW50IGNoZWNrX3JlbW92ZWRfbGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBnbHZfbGlzdCAqKmdsdmxfZm91bmQpCit7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsOworCWNvbnN0IGNoYXIgKnB0cjsKKwljb25zdCBzdHJ1Y3QgZG1fbGlzdCAqbGlzdCA9IGNoZWNrX3JlbW92ZWRfbGlzdCA/ICZ2Zy0+cmVtb3ZlZF9oaXN0b3JpY2FsX2x2cworCQkJCQkJCTogJnZnLT5oaXN0b3JpY2FsX2x2czsKKworCS8qIFVzZSBsYXN0IGNvbXBvbmVudCAqLworCWlmICgocHRyID0gc3RycmNocihoaXN0b3JpY2FsX2x2X25hbWUsICcvJykpKQorCQlwdHIrKzsKKwllbHNlCisJCXB0ciA9IGhpc3RvcmljYWxfbHZfbmFtZTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhnbHZsLCBsaXN0KSB7CisJCWlmICghc3RyY21wKGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSwgcHRyKSkgeworCQkJaWYgKGdsdmxfZm91bmQpCisJCQkJKmdsdmxfZm91bmQgPSBnbHZsOworCQkJcmV0dXJuIGdsdmwtPmdsdjsKKwkJfQorCX0KKworCWlmIChnbHZsX2ZvdW5kKQorCQkqZ2x2bF9mb3VuZCA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBsdl9uYW1lX2lzX3VzZWRfaW5fdmcoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqaGlzdG9yaWNhbCkKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqaGlzdG9yaWNhbF9sdjsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoKGx2ID0gZmluZF9sdih2ZywgbmFtZSkpKSB7CisJCWZvdW5kID0gMTsKKwkJaWYgKGhpc3RvcmljYWwpCisJCQkqaGlzdG9yaWNhbCA9IDA7CisJfSBlbHNlIGlmICgoaGlzdG9yaWNhbF9sdiA9IGZpbmRfaGlzdG9yaWNhbF9nbHYodmcsIG5hbWUsIDAsIE5VTEwpKSkgeworCQlmb3VuZCA9IDE7CisJCWlmIChoaXN0b3JpY2FsKQorCQkJKmhpc3RvcmljYWwgPSAxOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqZmluZF9wdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykKKwkJaWYgKGRldiA9PSBwdmwtPnB2LT5kZXYpCisJCQlyZXR1cm4gcHZsLT5wdjsKKworCXJldHVybiBOVUxMOworfQorCisvKiBGSVhNRTogbGlibHZtIHRvZG8gLSBtYWtlIGludG8gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGhhbmRsZSAqLworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqZmluZF9wdl9ieV9uYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQljb25zdCBjaGFyICpwdl9uYW1lLAorCQkJCQlpbnQgYWxsb3dfb3JwaGFuLCBpbnQgYWxsb3dfdW5mb3JtYXR0ZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGRtX2xpc3QgKnB2c2xpc3Q7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPSBOVUxMOworCisJbHZtY2FjaGVfc2VlZF9pbmZvc19mcm9tX2x2bWV0YWQoY21kKTsKKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQocHZfbmFtZSwgY21kLT5maWx0ZXIpKSkgeworCQlpZiAoIWFsbG93X3VuZm9ybWF0dGVkKQorCQkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgJXMgbm90IGZvdW5kIiwgcHZfbmFtZSk7CisJCXJldHVybl9OVUxMOworCX0KKworCWlmICghKHB2c2xpc3QgPSBnZXRfcHZzKGNtZCkpKQorCQlyZXR1cm5fTlVMTDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHB2c2xpc3QpCisJCWlmIChwdmwtPnB2LT5kZXYgPT0gZGV2KQorCQkJcHYgPSBwdmwtPnB2OworCQllbHNlCisJCQlmcmVlX3B2X2ZpZChwdmwtPnB2KTsKKworCWlmICghcHYgJiYgIWFsbG93X3VuZm9ybWF0dGVkKQorCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSAlcyBub3QgZm91bmQiLCBwdl9uYW1lKTsKKworCWlmIChwdiAmJiAhYWxsb3dfb3JwaGFuICYmIGlzX29ycGhhbl92Zyhwdi0+dmdfbmFtZSkpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgJXMgbm90IGluIGEgdm9sdW1lIGdyb3VwIiwgcHZfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCXJldHVybiBwdjsKKworYmFkOgorCWZyZWVfcHZfZmlkKHB2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBzZWdtZW50IGF0IGEgZ2l2ZW4gbG9naWNhbCBleHRlbnQgaW4gYW4gTFYgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpmaW5kX3NlZ19ieV9sZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBsZSkKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykKKwkJaWYgKGxlID49IHNlZy0+bGUgJiYgbGUgPCBzZWctPmxlICsgc2VnLT5sZW4pCisJCQlyZXR1cm4gc2VnOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBsdl9zZWdtZW50ICpmaXJzdF9zZWcoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykKKwkJcmV0dXJuIHNlZzsKKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbHZfc2VnbWVudCAqbGFzdF9zZWcoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKQorCQlyZXR1cm4gc2VnOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCB2Z19yZW1vdmVfbWRhcyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCisJLyogRklYTUUgSW1wcm92ZSByZWNvdmVyeSBzaXR1YXRpb24/ICovCisJLyogUmVtb3ZlIGVhY2ggY29weSBvZiB0aGUgbWV0YWRhdGEgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKSB7CisJCWlmIChtZGEtPm9wcy0+dmdfcmVtb3ZlICYmCisJCSAgICAhbWRhLT5vcHMtPnZnX3JlbW92ZSh2Zy0+ZmlkLCB2ZywgbWRhKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIHZncyBhcmUgY29tcGF0aWJsZSBmb3IgbWVyZ2luZy4KKyAqLworaW50IHZnc19hcmVfY29tcGF0aWJsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sCisJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190bykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsMSwgKmx2bDI7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwljb25zdCBjaGFyICpuYW1lMSwgKm5hbWUyOworCisJaWYgKGx2c19pbl92Z19hY3RpdmF0ZWQodmdfZnJvbSkpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZXMgaW4gXCIlc1wiIG11c3QgYmUgaW5hY3RpdmUiLAorCQkJICB2Z19mcm9tLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgY29tcGF0aWJpbGl0eSAqLworCWlmICh2Z190by0+ZXh0ZW50X3NpemUgIT0gdmdfZnJvbS0+ZXh0ZW50X3NpemUpIHsKKwkJbG9nX2Vycm9yKCJFeHRlbnQgc2l6ZXMgZGlmZmVyOiAlZCAoJXMpIGFuZCAlZCAoJXMpIiwKKwkJCSAgdmdfdG8tPmV4dGVudF9zaXplLCB2Z190by0+bmFtZSwKKwkJCSAgdmdfZnJvbS0+ZXh0ZW50X3NpemUsIHZnX2Zyb20tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodmdfdG8tPm1heF9wdiAmJgorCSAgICAodmdfdG8tPm1heF9wdiA8IHZnX3RvLT5wdl9jb3VudCArIHZnX2Zyb20tPnB2X2NvdW50KSkgeworCQlsb2dfZXJyb3IoIk1heGltdW0gbnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgKCVkKSBleGNlZWRlZCAiCisJCQkgICIgZm9yIFwiJXNcIiBhbmQgXCIlc1wiIiwgdmdfdG8tPm1heF9wdiwgdmdfdG8tPm5hbWUsCisJCQkgIHZnX2Zyb20tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodmdfdG8tPm1heF9sdiAmJgorCSAgICAodmdfdG8tPm1heF9sdiA8IHZnX3Zpc2libGVfbHZzKHZnX3RvKSArIHZnX3Zpc2libGVfbHZzKHZnX2Zyb20pKSkgeworCQlsb2dfZXJyb3IoIk1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAoJWQpIGV4Y2VlZGVkICIKKwkJCSAgIiBmb3IgXCIlc1wiIGFuZCBcIiVzXCIiLCB2Z190by0+bWF4X2x2LCB2Z190by0+bmFtZSwKKwkJCSAgdmdfZnJvbS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE1ldGFkYXRhIHR5cGVzIG11c3QgYmUgdGhlIHNhbWUgKi8KKwlpZiAodmdfdG8tPmZpZC0+Zm10ICE9IHZnX2Zyb20tPmZpZC0+Zm10KSB7CisJCWxvZ19lcnJvcigiTWV0YWRhdGEgdHlwZXMgZGlmZmVyIGZvciBcIiVzXCIgYW5kIFwiJXNcIiIsCisJCQkgIHZnX3RvLT5uYW1lLCB2Z19mcm9tLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2x1c3RlcmluZyBhdHRyaWJ1dGUgbXVzdCBiZSB0aGUgc2FtZSAqLworCWlmICh2Z19pc19jbHVzdGVyZWQodmdfdG8pICE9IHZnX2lzX2NsdXN0ZXJlZCh2Z19mcm9tKSkgeworCQlsb2dfZXJyb3IoIkNsdXN0ZXJlZCBhdHRyaWJ1dGUgZGlmZmVycyBmb3IgXCIlc1wiIGFuZCBcIiVzXCIiLAorCQkJICB2Z190by0+bmFtZSwgdmdfZnJvbS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIG5vIGNvbmZsaWN0cyB3aXRoIExWIG5hbWVzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bDEsICZ2Z190by0+bHZzKSB7CisJCW5hbWUxID0gbHZsMS0+bHYtPm5hbWU7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bDIsICZ2Z19mcm9tLT5sdnMpIHsKKwkJCW5hbWUyID0gbHZsMi0+bHYtPm5hbWU7CisKKwkJCWlmICghc3RyY21wKG5hbWUxLCBuYW1lMikpIHsKKwkJCQlsb2dfZXJyb3IoIkR1cGxpY2F0ZSBsb2dpY2FsIHZvbHVtZSAiCisJCQkJCSAgIm5hbWUgXCIlc1wiICIKKwkJCQkJICAiaW4gXCIlc1wiIGFuZCBcIiVzXCIiLAorCQkJCQkgIG5hbWUxLCB2Z190by0+bmFtZSwgdmdfZnJvbS0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayBubyBQVnMgYXJlIGNvbnN0cnVjdGVkIGZyb20gZWl0aGVyIFZHICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnX3RvLT5wdnMpIHsKKwkJaWYgKHB2X3VzZXNfdmcocHZsLT5wdiwgdmdfZnJvbSkpIHsKKwkJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICVzIG1pZ2h0IGJlIGNvbnN0cnVjdGVkICIKKwkJCQkgICJmcm9tIHNhbWUgdm9sdW1lIGdyb3VwICVzLiIsCisJCQkJICBwdl9kZXZfbmFtZShwdmwtPnB2KSwgdmdfZnJvbS0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Z19mcm9tLT5wdnMpIHsKKwkJaWYgKHB2X3VzZXNfdmcocHZsLT5wdiwgdmdfdG8pKSB7CisJCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSAlcyBtaWdodCBiZSBjb25zdHJ1Y3RlZCAiCisJCQkJICAiZnJvbSBzYW1lIHZvbHVtZSBncm91cCAlcy4iLAorCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdiksIHZnX3RvLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBfbHZfcG9zdG9yZGVyX2JhdG9uIHsKKwlpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSk7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyBpbnQgX2x2X3Bvc3RvcmRlcl92aXNpdChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKiwKKwkJCSAgICAgICBpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSksCisJCQkgICAgICAgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbnQgX2x2X2VhY2hfZGVwZW5kZW5jeShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIGludCAoKmZuKShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKSwKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGksIHM7CisJc3RydWN0IGx2X3NlZ21lbnQgKmx2c2VnOworCXN0cnVjdCBkbV9saXN0ICpzbmg7CisKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmRlcHNbXSA9IHsKKwkJKGx2LT5yZGV2aWNlICYmIGx2ICE9IGx2LT5yZGV2aWNlLT5sdikgPyBsdi0+cmRldmljZS0+bHYgOiAwLAorCQkobHYtPnJkZXZpY2UgJiYgbHYgIT0gbHYtPnJkZXZpY2UtPnNsb2cpID8gbHYtPnJkZXZpY2UtPnNsb2cgOiAwLAorCQlsdi0+c25hcHNob3QgPyBsdi0+c25hcHNob3QtPm9yaWdpbiA6IDAsCisJCWx2LT5zbmFwc2hvdCA/IGx2LT5zbmFwc2hvdC0+Y293IDogMCB9OworCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKGRlcHMpOyArK2kpIHsKKwkJaWYgKGRlcHNbaV0gJiYgIWZuKGRlcHNbaV0sIGRhdGEpKQorCQkJcmV0dXJuXzA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2c2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWlmIChsdnNlZy0+ZXh0ZXJuYWxfbHYgJiYgIWZuKGx2c2VnLT5leHRlcm5hbF9sdiwgZGF0YSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKGx2c2VnLT5sb2dfbHYgJiYgIWZuKGx2c2VnLT5sb2dfbHYsIGRhdGEpKQorCQkJcmV0dXJuXzA7CisJCWlmIChsdnNlZy0+cmxvZ19sdiAmJiAhZm4obHZzZWctPnJsb2dfbHYsIGRhdGEpKQorCQkJcmV0dXJuXzA7CisJCWlmIChsdnNlZy0+cG9vbF9sdiAmJiAhZm4obHZzZWctPnBvb2xfbHYsIGRhdGEpKQorCQkJcmV0dXJuXzA7CisJCWlmIChsdnNlZy0+bWV0YWRhdGFfbHYgJiYgIWZuKGx2c2VnLT5tZXRhZGF0YV9sdiwgZGF0YSkpCisJCQlyZXR1cm5fMDsKKwkJZm9yIChzID0gMDsgcyA8IGx2c2VnLT5hcmVhX2NvdW50OyArK3MpIHsKKwkJCWlmIChzZWdfdHlwZShsdnNlZywgcykgPT0gQVJFQV9MViAmJiAhZm4oc2VnX2x2KGx2c2VnLHMpLCBkYXRhKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0KKworCWlmIChsdl9pc19vcmlnaW4obHYpKQorCQlkbV9saXN0X2l0ZXJhdGUoc25oLCAmbHYtPnNuYXBzaG90X3NlZ3MpCisJCQlpZiAoIWZuKGRtX2xpc3Rfc3RydWN0X2Jhc2Uoc25oLCBzdHJ1Y3QgbHZfc2VnbWVudCwgb3JpZ2luX2xpc3QpLT5jb3csIGRhdGEpKQorCQkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2X3Bvc3RvcmRlcl9jbGVhbnVwKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHZvaWQgKmRhdGEpCit7CisJaWYgKCEobHYtPnN0YXR1cyAmIFBPU1RPUkRFUl9GTEFHKSkKKwkJcmV0dXJuIDE7CisJbHYtPnN0YXR1cyAmPSB+UE9TVE9SREVSX0ZMQUc7CisKKwlpZiAoIV9sdl9lYWNoX2RlcGVuZGVuY3kobHYsIF9sdl9wb3N0b3JkZXJfY2xlYW51cCwgZGF0YSkpCisJCXJldHVybl8wOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdl9wb3N0b3JkZXJfbGV2ZWwoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgX2x2X3Bvc3RvcmRlcl9iYXRvbiAqYmF0b24gPSBkYXRhOworCXJldHVybiAoZGF0YSkgPyBfbHZfcG9zdG9yZGVyX3Zpc2l0KGx2LCBiYXRvbi0+Zm4sIGJhdG9uLT5kYXRhKSA6IDA7Cit9OworCitzdGF0aWMgaW50IF9sdl9wb3N0b3JkZXJfdmlzaXQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgICBpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSksCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgX2x2X3Bvc3RvcmRlcl9iYXRvbiBiYXRvbjsKKwlpbnQgcjsKKworCWlmIChsdi0+c3RhdHVzICYgUE9TVE9SREVSX0ZMQUcpCisJCXJldHVybiAxOworCWlmIChsdi0+c3RhdHVzICYgUE9TVE9SREVSX09QRU5fRkxBRykKKwkJcmV0dXJuIDE7IC8vIGEgZGF0YSBzdHJ1Y3R1cmUgbG9vcCBoYXMgY2xvc2VkLi4uCisJbHYtPnN0YXR1cyB8PSBQT1NUT1JERVJfT1BFTl9GTEFHOworCisJYmF0b24uZm4gPSBmbjsKKwliYXRvbi5kYXRhID0gZGF0YTsKKwlyID0gX2x2X2VhY2hfZGVwZW5kZW5jeShsdiwgX2x2X3Bvc3RvcmRlcl9sZXZlbCwgJmJhdG9uKTsKKworCWlmIChyKQorCQlyID0gZm4obHYsIGRhdGEpOworCisJbHYtPnN0YXR1cyAmPSB+UE9TVE9SREVSX09QRU5fRkxBRzsKKwlsdi0+c3RhdHVzIHw9IFBPU1RPUkRFUl9GTEFHOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgd2FsayB0aGUgTFYgZGVwZW5kZW5jeSBncmFwaCBpbiBkZXB0aC1maXJzdCBvcmRlciBhbmQgaW4gdGhlCisgKiBwb3N0b3JkZXIsIGNhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiAiZm4iLiBUaGUgdm9pZCAqZGF0YSBpcyBwYXNzZWQgYWxvbmcgYWxsCisgKiB0aGUgY2FsbHMuIFRoZSBjYWxsYmFjayBtYXkgcmV0dXJuIHplcm8gdG8gaW5kaWNhdGUgYW4gZXJyb3IgYW5kIHRlcm1pbmF0ZQorICogdGhlIGRlcHRoLWZpcnN0IHdhbGsuIFRoZSBlcnJvciBpcyBwcm9wYWdhdGVkIHRvIHJldHVybiB2YWx1ZSBvZgorICogX2x2X3Bvc3RvcmRlci4KKyAqLworc3RhdGljIGludCBfbHZfcG9zdG9yZGVyKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgaW50ICgqZm4pKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHZvaWQgKmRhdGEpLAorCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJaW50IHI7CisJaW50IHBvb2xfbG9ja2VkID0gZG1fcG9vbF9sb2NrZWQobHYtPnZnLT52Z21lbSk7CisKKwlpZiAocG9vbF9sb2NrZWQgJiYgIWRtX3Bvb2xfdW5sb2NrKGx2LT52Zy0+dmdtZW0sIDApKQorCQlyZXR1cm5fMDsKKworCXIgPSBfbHZfcG9zdG9yZGVyX3Zpc2l0KGx2LCBmbiwgZGF0YSk7CisJX2x2X3Bvc3RvcmRlcl9jbGVhbnVwKGx2LCAwKTsKKworCWlmIChwb29sX2xvY2tlZCAmJiAhZG1fcG9vbF9sb2NrKGx2LT52Zy0+dmdtZW0sIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiByOworfQorCisvKgorICogQ2FsbHMgX2x2X3Bvc3RvcmRlcigpIG9uIGVhY2ggTFYgZnJvbSBWRy4gQXZvaWRzIGR1cGxpY2F0ZSB0cmFuc2l0aXZpdHkgdmlzaXRzLgorICogQ2xlYXJzIHdpdGggX2x2X3Bvc3RvcmRlcl9jbGVhbnVwKCkgd2hlbiBhbGwgTFZzIHdlcmUgdmlzaXRlZCBieSBwb3N0b3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgX2x2X3Bvc3RvcmRlcl92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICBpbnQgKCpmbikoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSksCisJCQkgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCWludCByID0gMTsKKwlpbnQgcG9vbF9sb2NrZWQgPSBkbV9wb29sX2xvY2tlZCh2Zy0+dmdtZW0pOworCisJaWYgKHBvb2xfbG9ja2VkICYmICFkbV9wb29sX3VubG9jayh2Zy0+dmdtZW0sIDApKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAoIV9sdl9wb3N0b3JkZXJfdmlzaXQobHZsLT5sdiwgZm4sIGRhdGEpKSB7CisJCQlzdGFjazsKKwkJCXIgPSAwOworCQl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykKKwkJX2x2X3Bvc3RvcmRlcl9jbGVhbnVwKGx2bC0+bHYsIDApOworCisJaWYgKHBvb2xfbG9ja2VkICYmICFkbV9wb29sX2xvY2sodmctPnZnbWVtLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IF9sdl9tYXJrX2lmX3BhcnRpYWxfYmF0b24geworCWludCBwYXJ0aWFsOworfTsKKworc3RhdGljIGludCBfbHZfbWFya19pZl9wYXJ0aWFsX2NvbGxlY3Qoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgX2x2X21hcmtfaWZfcGFydGlhbF9iYXRvbiAqYmF0b24gPSBkYXRhOworCisJaWYgKGJhdG9uICYmIGx2X2lzX3BhcnRpYWwobHYpKQorCQliYXRvbi0+cGFydGlhbCA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZfbWFya19pZl9wYXJ0aWFsX3NpbmdsZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIHM7CisJc3RydWN0IF9sdl9tYXJrX2lmX3BhcnRpYWxfYmF0b24gYmF0b247CisJc3RydWN0IGx2X3NlZ21lbnQgKmx2c2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2c2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWZvciAocyA9IDA7IHMgPCBsdnNlZy0+YXJlYV9jb3VudDsgKytzKSB7CisJCQlpZiAoc2VnX3R5cGUobHZzZWcsIHMpID09IEFSRUFfUFYpIHsKKwkJCQlpZiAoaXNfbWlzc2luZ19wdihzZWdfcHYobHZzZWcsIHMpKSkKKwkJCQkJbHYtPnN0YXR1cyB8PSBQQVJUSUFMX0xWOworCQkJfQorCQl9CisJfQorCisJYmF0b24ucGFydGlhbCA9IDA7CisJaWYgKCFfbHZfZWFjaF9kZXBlbmRlbmN5KGx2LCBfbHZfbWFya19pZl9wYXJ0aWFsX2NvbGxlY3QsICZiYXRvbikpCisJCXJldHVybl8wOworCisJaWYgKGJhdG9uLnBhcnRpYWwpCisJCWx2LT5zdGF0dXMgfD0gUEFSVElBTF9MVjsKKworCXJldHVybiAxOworfQorCisvKgorICogTWFyayBMVnMgd2l0aCBtaXNzaW5nIFBWcyB1c2luZyBQQVJUSUFMX0xWIHN0YXR1cyBmbGFnLiBUaGUgZmxhZyBpcworICogcHJvcGFnYXRlZCB0cmFuc2l0aXZlbHksIHNvIExWcyByZWZlcmVuY2luZyBvdGhlciBMVnMgYXJlIG1hcmtlZAorICogcGFydGlhbCBhcyB3ZWxsLCBpZiBhbnkgb2YgdGhlaXIgcmVmZXJlbmNlZCBMVnMgYXJlIG1hcmtlZCBwYXJ0aWFsLgorICovCitpbnQgdmdfbWFya19wYXJ0aWFsX2x2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgaW50IGNsZWFyKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlpZiAoY2xlYXIpCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQkJbHZsLT5sdi0+c3RhdHVzICY9IH5QQVJUSUFMX0xWOworCisJaWYgKCFfbHZfcG9zdG9yZGVyX3ZnKHZnLCBfbHZfbWFya19pZl9wYXJ0aWFsX3NpbmdsZSwgTlVMTCkpCisJCXJldHVybl8wOworCXJldHVybiAxOworfQorCisvKgorICogQmUgc3VyZSB0aGF0IGFsbCBQViBkZXZpY2VzIGhhdmUgY2FjaGVkIHJlYWQgYWhlYWQgaW4gZGV2LWNhY2hlCisgKiBDdXJyZW50bHkgaXQgdGFrZXMgcmVhZF9haGVhZCBmcm9tIGZpcnN0IFBWIHNlZ21lbnQgb25seQorICovCitzdGF0aWMgaW50IF9sdl9yZWFkX2FoZWFkX3NpbmdsZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCXVpbnQzMl90IHNlZ19yZWFkX2FoZWFkID0gMCwgKnJlYWRfYWhlYWQgPSBkYXRhOworCisJaWYgKCFyZWFkX2FoZWFkKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUmVhZCBhaGVhZCBkYXRhIG1pc3NpbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWcgJiYgc2VnLT5hcmVhX2NvdW50ICYmIHNlZ190eXBlKHNlZywgMCkgPT0gQVJFQV9QVikKKwkJZGV2X2dldF9yZWFkX2FoZWFkKHNlZ19wdihzZWcsIDApLT5kZXYsICZzZWdfcmVhZF9haGVhZCk7CisKKwlpZiAoc2VnX3JlYWRfYWhlYWQgPiAqcmVhZF9haGVhZCkKKwkJKnJlYWRfYWhlYWQgPSBzZWdfcmVhZF9haGVhZDsKKworCXJldHVybiAxOworfQorCisvKgorICogQ2FsY3VsYXRlIHJlYWRhaGVhZCBmb3IgbG9naWNhbCB2b2x1bWUgZnJvbSB1bmRlcmx5aW5nIFBWIGRldmljZXMuCisgKiBJZiByZWFkX2FoZWFkIGlzIE5VTEwsIG9ubHkgZW5zdXJlIHRoYXQgcmVhZGFoZWFkIG9mIFBWcyBhcmUgcHJlbG9hZGVkCisgKiBpbnRvIFBWIHN0cnVjdCBkZXZpY2UgaW4gZGV2IGNhY2hlLgorICovCit2b2lkIGx2X2NhbGN1bGF0ZV9yZWFkYWhlYWQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDMyX3QgKnJlYWRfYWhlYWQpCit7CisJdWludDMyX3QgX3JlYWRfYWhlYWQgPSAwOworCisJaWYgKGx2LT5yZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfQVVUTykKKwkJX2x2X3Bvc3RvcmRlcigoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopbHYsIF9sdl9yZWFkX2FoZWFkX3NpbmdsZSwgJl9yZWFkX2FoZWFkKTsKKworCWlmIChyZWFkX2FoZWFkKSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ2FsY3VsYXRlZCByZWFkYWhlYWQgb2YgTFYgJXMgaXMgJXUiLCBsdi0+bmFtZSwgX3JlYWRfYWhlYWQpOworCQkqcmVhZF9haGVhZCA9IF9yZWFkX2FoZWFkOworCX0KK30KKworc3RydWN0IHZhbGlkYXRlX2hhc2ggeworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpsdm5hbWU7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmhpc3RvcmljYWxfbHZuYW1lOworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpsdmlkOworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpoaXN0b3JpY2FsX2x2aWQ7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2aWQ7CisJc3RydWN0IGRtX2hhc2hfdGFibGUgKmx2X2xvY2tfYXJnczsKK307CisKKy8qCisgKiBDaGVjayB0aGF0IGFuIExWIGFuZCBhbGwgaXRzIFBWIHJlZmVyZW5jZXMgYXJlIGNvcnJlY3RseSBsaXN0ZWQgaW4gdmctPmx2cworICogYW5kIHZnLT5wdnMsIHJlc3BlY3RpdmVseS4gVGhpcyBvbmx5IGxvb2tzIGF0IGEgc2luZ2xlIExWLCBidXQgKm5vdCogYXQgdGhlCisgKiBMVnMgaXQgaXMgdXNpbmcuIFRvIGRvIHRoZSBsYXR0ZXIsIHlvdSBzaG91bGQgdXNlIF9sdl9wb3N0b3JkZXIgd2l0aCB0aGlzCisgKiBmdW5jdGlvbi4gQy5mLiB2Z192YWxpZGF0ZS4KKyAqLworc3RhdGljIGludCBfbHZfdmFsaWRhdGVfcmVmZXJlbmNlc19zaW5nbGUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKwlzdHJ1Y3QgdmFsaWRhdGVfaGFzaCAqdmhhc2ggPSBkYXRhOworCXN0cnVjdCBsdl9zZWdtZW50ICpsdnNlZzsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwl1bnNpZ25lZCBzOworCWludCByID0gMTsKKworCWlmIChsdiAhPSBkbV9oYXNoX2xvb2t1cF9iaW5hcnkodmhhc2gtPmx2aWQsICZsdi0+bHZpZC5pZFsxXSwKKwkJCQkJc2l6ZW9mKGx2LT5sdmlkLmlkWzFdKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJSZWZlcmVuY2VkIExWICVzIG5vdCBsaXN0ZWQgaW4gVkcgJXMuIiwKKwkJCSAgbHYtPm5hbWUsIHZnLT5uYW1lKTsKKwkJciA9IDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2c2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWZvciAocyA9IDA7IHMgPCBsdnNlZy0+YXJlYV9jb3VudDsgKytzKSB7CisJCQlpZiAoc2VnX3R5cGUobHZzZWcsIHMpICE9IEFSRUFfUFYpCisJCQkJY29udGludWU7CisJCQlwdiA9IHNlZ19wdihsdnNlZywgcyk7CisJCQkvKiBsb29rIHVwIHRoZSByZWZlcmVuY2UgaW4gdmctPnB2cyAqLworCQkJaWYgKHB2ICE9IGRtX2hhc2hfbG9va3VwX2JpbmFyeSh2aGFzaC0+cHZpZCwgJnB2LT5pZCwKKwkJCQkJCQlzaXplb2YocHYtPmlkKSkpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCQkJICAiUmVmZXJlbmNlZCBQViAlcyBub3QgbGlzdGVkIGluIFZHICVzLiIsCisJCQkJCSAgcHZfZGV2X25hbWUocHYpLCB2Zy0+bmFtZSk7CisJCQkJciA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEZvcm1hdCBpcyA8dmVyc2lvbj46PGluZm8+CisgKi8KK3N0YXRpYyBpbnQgX3ZhbGlkYXRlX2xvY2tfYXJnc19jaGFycyhjb25zdCBjaGFyICpsb2NrX2FyZ3MpCit7CisJdW5zaWduZWQgaTsKKwljaGFyIGM7CisJaW50IGZvdW5kX2NvbG9uID0gMDsKKwlpbnQgciA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGxvY2tfYXJncyk7IGkrKykgeworCQljID0gbG9ja19hcmdzW2ldOworCisJCWlmICghaXNhbG51bShjKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJiBjICE9ICctJyAmJiBjICE9ICcrJyAmJiBjICE9ICc6JykgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbnZhbGlkIGNoYXJhY3RlciBhdCBpbmRleCAldSBvZiBsb2NrX2FyZ3MgXCIlc1wiIiwKKwkJCQkgIGksIGxvY2tfYXJncyk7CisJCQlyID0gMDsKKwkJfQorCisJCWlmIChjID09ICc6JyAmJiBmb3VuZF9jb2xvbikgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbnZhbGlkIGNvbG9uIGF0IGluZGV4ICV1IG9mIGxvY2tfYXJncyBcIiVzXCIiLAorCQkJCSAgaSwgbG9ja19hcmdzKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKGMgPT0gJzonKQorCQkJZm91bmRfY29sb24gPSAxOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF92YWxpZGF0ZV92Z19sb2NrX2FyZ3Moc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCFfdmFsaWRhdGVfbG9ja19hcmdzX2NoYXJzKHZnLT5sb2NrX2FyZ3MpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgJXMgaGFzIGludmFsaWQgbG9ja19hcmdzIGNoYXJzIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZvciBsb2NrX3R5cGUgc2FubG9jaywgTFYgbG9ja19hcmdzIGFyZSA8dmVyc2lvbj46PGluZm8+CisgKiBGb3IgbG9ja190eXBlIGRsbSwgTFYgbG9ja19hcmdzIGFyZSBub3QgdXNlZCwgYW5kIGxvY2tfYXJncyBpcworICoganVzdCBzZXQgdG8gImRsbSIuCisgKi8KK3N0YXRpYyBpbnQgX3ZhbGlkYXRlX2x2X2xvY2tfYXJncyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWludCByID0gMTsKKworCWlmICghc3RyY21wKGx2LT52Zy0+bG9ja190eXBlLCAic2FubG9jayIpKSB7CisJCWlmICghX3ZhbGlkYXRlX2xvY2tfYXJnc19jaGFycyhsdi0+bG9ja19hcmdzKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcy8lcyBoYXMgaW52YWxpZCBsb2NrX2FyZ3MgY2hhcnMiLAorCQkJCSAgbHYtPnZnLT5uYW1lLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0gZWxzZSBpZiAoIXN0cmNtcChsdi0+dmctPmxvY2tfdHlwZSwgImRsbSIpKSB7CisJCWlmIChzdHJjbXAobHYtPmxvY2tfYXJncywgImRsbSIpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzLyVzIGhhcyBpbnZhbGlkIGxvY2tfYXJncyBcIiVzXCIiLAorCQkJCSAgIGx2LT52Zy0+bmFtZSwgZGlzcGxheV9sdm5hbWUobHYpLCBsdi0+bG9ja19hcmdzKTsKKwkJCXIgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCB2Z192YWxpZGF0ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGdsdl9saXN0ICpnbHZsOworCXN0cnVjdCBoaXN0b3JpY2FsX2xvZ2ljYWxfdm9sdW1lICpobHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWNoYXIgdXVpZDJbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlpbnQgciA9IDE7CisJdW5zaWduZWQgaGlkZGVuX2x2X2NvdW50ID0gMCwgbHZfY291bnQgPSAwLCBsdl92aXNpYmxlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBwdl9jb3VudCA9IDA7CisJdW5zaWduZWQgbnVtX3NuYXBzaG90cyA9IDA7CisJdW5zaWduZWQgc3BhcmVfY291bnQgPSAwOworCXNpemVfdCB2Z19uYW1lX2xlbiA9IHN0cmxlbih2Zy0+bmFtZSk7CisJc2l6ZV90IGRldl9uYW1lX2xlbjsKKwlzdHJ1Y3QgdmFsaWRhdGVfaGFzaCB2aGFzaCA9IHsgTlVMTCB9OworCisJaWYgKHZnLT5hbGxvYyA9PSBBTExPQ19DTElOR19CWV9UQUdTKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgJXMgYWxsb2NhdGlvbiBwb2xpY3kgc2V0IHRvIGludmFsaWQgY2xpbmdfYnlfdGFncy4iLAorCQkJICB2Zy0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCWlmICh2Zy0+c3RhdHVzICYgTFZNX1dSSVRFX0xPQ0tFRCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHICVzIGhhcyBleHRlcm5hbCBmbGFnIExWTV9XUklURV9MT0NLRUQgc2V0IGludGVybmFsbHkuIiwKKwkJCSAgdmctPm5hbWUpOworCQlyID0gMDsKKwl9CisKKwkvKiBGSVhNRSBBbHNvIGNoZWNrIHRoZXJlJ3Mgbm8gZGF0YS9tZXRhZGF0YSBvdmVybGFwICovCisJaWYgKCEodmhhc2gucHZpZCA9IGRtX2hhc2hfY3JlYXRlKHZnLT5wdl9jb3VudCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHB2aWQgaGFzaC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmdmctPnRhZ3MpCisJCWlmICghdmFsaWRhdGVfdGFnKHNsLT5zdHIpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHICVzIHRhZyAlcyBoYXMgaW52YWxpZCBmb3JtLiIsCisJCQkJICB2Zy0+bmFtZSwgc2wtPnN0cik7CisJCQlyID0gMDsKKwkJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKCsrcHZfY291bnQgPiB2Zy0+cHZfY291bnQpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUFYgbGlzdCBjb3JydXB0aW9uIGRldGVjdGVkIGluIFZHICVzLiIsIHZnLT5uYW1lKTsKKwkJCS8qIEZJWE1FIER1bXAgbGlzdCBzdHJ1Y3R1cmU/ICovCisJCQlyID0gMDsKKwkJfQorCisJCWlmIChwdmwtPnB2LT52ZyAhPSB2ZykgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJWRyAlcyBQViBsaXN0IGVudHJ5IHBvaW50cyAiCisJCQkJICAidG8gZGlmZmVyZW50IFZHICVzLiIsIHZnLT5uYW1lLAorCQkJCSAgcHZsLT5wdi0+dmcgPyBwdmwtPnB2LT52Zy0+bmFtZSA6ICJOVUxMIik7CisJCQlyID0gMDsKKwkJfQorCisJCWlmIChzdHJjbXAocHZsLT5wdi0+dmdfbmFtZSwgdmctPm5hbWUpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHIG5hbWUgZm9yIFBWICVzIGlzIGNvcnJ1cHRlZC4iLAorCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQkJciA9IDA7CisJCX0KKworCQlpZiAoZG1faGFzaF9sb29rdXBfYmluYXJ5KHZoYXNoLnB2aWQsICZwdmwtPnB2LT5pZCwKKwkJCQkJICBzaXplb2YocHZsLT5wdi0+aWQpKSkgeworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2bC0+cHYtPmlkLCB1dWlkLAorCQkJCQkgICAgIHNpemVvZih1dWlkKSkpCisJCQkJc3RhY2s7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkR1cGxpY2F0ZSBQViBpZCAiCisJCQkJICAiJXMgZGV0ZWN0ZWQgZm9yICVzIGluICVzLiIsCisJCQkJICB1dWlkLCBwdl9kZXZfbmFtZShwdmwtPnB2KSwKKwkJCQkgIHZnLT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmcHZsLT5wdi0+dGFncykKKwkJCWlmICghdmFsaWRhdGVfdGFnKHNsLT5zdHIpKSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJQViAlcyB0YWcgJXMgaGFzIGludmFsaWQgZm9ybS4iLAorCQkJCQkgIHB2X2Rldl9uYW1lKHB2bC0+cHYpLCBzbC0+c3RyKTsKKwkJCQlyID0gMDsKKwkJCX0KKworCQlpZiAoIWRtX2hhc2hfaW5zZXJ0X2JpbmFyeSh2aGFzaC5wdmlkLCAmcHZsLT5wdi0+aWQsCisJCQkJCSAgIHNpemVvZihwdmwtPnB2LT5pZCksIHB2bC0+cHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBoYXNoIHB2aWQuIik7CisJCQlyID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisKKwlpZiAoIWNoZWNrX3B2X3NlZ21lbnRzKHZnKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlBWIHNlZ21lbnRzIGNvcnJ1cHRlZCBpbiAlcy4iLAorCQkJICB2Zy0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+cmVtb3ZlZF9sdnMpIHsKKwkJaWYgKCEobHZsLT5sdi0+c3RhdHVzICYgTFZfUkVNT1ZFRCkpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgaXMgbm90IG1hcmtlZCBhcyByZW1vdmVkIHdoaWxlIGl0J3MgcGFydCAiCisJCQkJICAib2YgcmVtb3ZlZCBMViBsaXN0IGZvciBWRyAlcyIsIGx2bC0+bHYtPm5hbWUsIHZnLT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBDb3VudCBhbGwgbm9uLXNuYXBzaG90IGludmlzaWJsZSBMVnMKKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlsdl9jb3VudCsrOworCisJCWlmIChsdmwtPmx2LT5zdGF0dXMgJiBMVl9SRU1PVkVEKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIGlzIG1hcmtlZCBhcyByZW1vdmVkIHdoaWxlIGl0J3MgIgorCQkJCSAgInN0aWxsIHBhcnQgb2YgdGhlIFZHICVzIiwgbHZsLT5sdi0+bmFtZSwgdmctPm5hbWUpOworCQkJciA9IDA7CisJCX0KKworCQlpZiAobHZsLT5sdi0+c3RhdHVzICYgTFZNX1dSSVRFX0xPQ0tFRCkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBoYXMgZXh0ZXJuYWwgZmxhZyBMVk1fV1JJVEVfTE9DS0VEIHNldCBpbnRlcm5hbGx5LiIsCisJCQkJICBsdmwtPmx2LT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwkJZGV2X25hbWVfbGVuID0gc3RybGVuKGx2bC0+bHYtPm5hbWUpICsgdmdfbmFtZV9sZW4gKyAzOworCQlpZiAoZGV2X25hbWVfbGVuID49IE5BTUVfTEVOKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWIG5hbWUgXCIlcy8lc1wiIGxlbmd0aCAlIgorCQkJCSAgUFJJc2l6ZV90ICIgaXMgbm90IHN1cHBvcnRlZC4iLAorCQkJCSAgdmctPm5hbWUsIGx2bC0+bHYtPm5hbWUsIGRldl9uYW1lX2xlbik7CisJCQlyID0gMDsKKwkJfQorCisJCWlmICghaWRfZXF1YWwoJmx2bC0+bHYtPmx2aWQuaWRbMF0sICZsdmwtPmx2LT52Zy0+aWQpKSB7CisJCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmbHZsLT5sdi0+bHZpZC5pZFswXSwgdXVpZCwKKwkJCQkJICAgICBzaXplb2YodXVpZCkpKQorCQkJCXN0YWNrOworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmx2bC0+bHYtPnZnLT5pZCwgdXVpZDIsCisJCQkJCSAgICAgc2l6ZW9mKHV1aWQyKSkpCisJCQkJc3RhY2s7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIGhhcyBWRyBVVUlEICVzIGJ1dCBpdHMgVkcgJXMgaGFzIFVVSUQgJXMiLAorCQkJCSAgbHZsLT5sdi0+bmFtZSwgdXVpZCwgbHZsLT5sdi0+dmctPm5hbWUsIHV1aWQyKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKGx2X2lzX3Bvb2xfbWV0YWRhdGFfc3BhcmUobHZsLT5sdikpIHsKKwkJCWlmICgrK3NwYXJlX2NvdW50ID4gMSkgeworCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMgaXMgZXh0cmEgcG9vbCBtZXRhZGF0YSBzcGFyZSB2b2x1bWUuICV1IGZvdW5kIGJ1dCBvbmx5IDEgYWxsb3dlZC4iLAorCQkJCQkgIGx2bC0+bHYtPm5hbWUsIHNwYXJlX2NvdW50KTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJCWlmICh2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdiAhPSBsdmwtPmx2KSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBpcyBub3QgdGhlIFZHJ3MgcG9vbCBtZXRhZGF0YSBzcGFyZSB2b2x1bWUuIiwKKwkJCQkJICBsdmwtPmx2LT5uYW1lKTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChsdl9pc19jb3cobHZsLT5sdikpCisJCQludW1fc25hcHNob3RzKys7CisKKwkJaWYgKGx2X2lzX3Zpc2libGUobHZsLT5sdikpCisJCQlsdl92aXNpYmxlX2NvdW50Kys7CisKKwkJaWYgKCFjaGVja19sdl9zZWdtZW50cyhsdmwtPmx2LCAwKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViBzZWdtZW50cyBjb3JydXB0ZWQgaW4gJXMuIiwKKwkJCQkgIGx2bC0+bHYtPm5hbWUpOworCQkJciA9IDA7CisJCX0KKworCQlpZiAobHZsLT5sdi0+YWxsb2MgPT0gQUxMT0NfQ0xJTkdfQllfVEFHUykgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBhbGxvY2F0aW9uIHBvbGljeSBzZXQgdG8gaW52YWxpZCBjbGluZ19ieV90YWdzLiIsCisJCQkJICBsdmwtPmx2LT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKCF2YWxpZGF0ZV9uYW1lKGx2bC0+bHYtPm5hbWUpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWIG5hbWUgJXMgaGFzIGludmFsaWQgZm9ybS4iLCBsdmwtPmx2LT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCAmbHZsLT5sdi0+dGFncykKKwkJCWlmICghdmFsaWRhdGVfdGFnKHNsLT5zdHIpKSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyB0YWcgJXMgaGFzIGludmFsaWQgZm9ybS4iLAorCQkJCQkgIGx2bC0+bHYtPm5hbWUsIHNsLT5zdHIpOworCQkJCXIgPSAwOworCQkJfQorCisJCWlmIChsdmwtPmx2LT5zdGF0dXMgJiBWSVNJQkxFX0xWKQorCQkJY29udGludWU7CisKKwkJLyogc25hcHNob3RzICovCisJCWlmIChsdl9pc19jb3cobHZsLT5sdikpCisJCQljb250aW51ZTsKKworCQkvKiB2aXJ0dWFsIG9yaWdpbnMgYXJlIGFsd2F5cyBoaWRkZW4gKi8KKwkJaWYgKGx2X2lzX29yaWdpbihsdmwtPmx2KSAmJiAhbHZfaXNfdmlydHVhbF9vcmlnaW4obHZsLT5sdikpCisJCQljb250aW51ZTsKKworCQkvKiBjb3VudCBvdGhlciBub24tc25hcHNob3QgaW52aXNpYmxlIHZvbHVtZXMgKi8KKwkJaGlkZGVuX2x2X2NvdW50Kys7CisKKwkJLyoKKwkJICogIEZJWE1FOiBhZGQgY2hlY2sgZm9yIHVucmVmZXJlbmNlZCBpbnZpc2libGUgTFZzCisJCSAqICAgLSBzbmFwc2hvdCBjb3cgJiBvcmlnaW4KKwkJICogICAtIG1pcnJvciBsb2cgJiBpbWFnZXMKKwkJICogICAtIG1pcnJvciBjb252ZXJzaW9uIHZvbHVtZXMgKF9taW1hZ2V0bXAqKQorCQkgKi8KKwl9CisKKwkvKgorCSAqIGFsbCB2b2x1bWVzID0gdmlzaWJsZSBMVnMgKyBzbmFwc2hvdF9jb3dzICsgaW52aXNpYmxlIExWcworCSAqLworCWlmIChsdl9jb3VudCAhPSBsdl92aXNpYmxlX2NvdW50ICsgbnVtX3NuYXBzaG90cyArIGhpZGRlbl9sdl9jb3VudCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiNMVnMgKCV1KSAhPSAjdmlzaWJsZSBMVnMgKCV1KSAiCisJCQkgICIrICNzbmFwc2hvdHMgKCV1KSArICNpbnRlcm5hbCBMVnMgKCV1KSBpbiBWRyAlcyIsCisJCQkgIGx2X2NvdW50LCBsdl92aXNpYmxlX2NvdW50LCBudW1fc25hcHNob3RzLAorCQkJICBoaWRkZW5fbHZfY291bnQsIHZnLT5uYW1lKTsKKwkJciA9IDA7CisJfQorCisJLyogQXZvaWQgZW5kbGVzcyBsb29wIGlmIGx2LT5zZWdtZW50cyBsaXN0IGlzIGNvcnJ1cHQgKi8KKwlpZiAoIXIpCisJCWdvdG8gb3V0OworCisJaWYgKCEodmhhc2gubHZuYW1lID0gZG1faGFzaF9jcmVhdGUobHZfY291bnQpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBsdl9uYW1lIGhhc2giKTsKKwkJciA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHZoYXNoLmx2aWQgPSBkbV9oYXNoX2NyZWF0ZShsdl9jb3VudCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHV1aWQgaGFzaCIpOworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKGRtX2hhc2hfbG9va3VwKHZoYXNoLmx2bmFtZSwgbHZsLT5sdi0+bmFtZSkpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJCSAgIkR1cGxpY2F0ZSBMViBuYW1lICVzIGRldGVjdGVkIGluICVzLiIsCisJCQkJICBsdmwtPmx2LT5uYW1lLCB2Zy0+bmFtZSk7CisJCQlyID0gMDsKKwkJfQorCisJCWlmIChkbV9oYXNoX2xvb2t1cF9iaW5hcnkodmhhc2gubHZpZCwgJmx2bC0+bHYtPmx2aWQuaWRbMV0sCisJCQkJCSAgc2l6ZW9mKGx2bC0+bHYtPmx2aWQuaWRbMV0pKSkgeworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmx2bC0+bHYtPmx2aWQuaWRbMV0sIHV1aWQsCisJCQkJCSAgICAgc2l6ZW9mKHV1aWQpKSkKKwkJCQlzdGFjazsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRHVwbGljYXRlIExWIGlkICIKKwkJCQkgICIlcyBkZXRlY3RlZCBmb3IgJXMgaW4gJXMuIiwKKwkJCQkgIHV1aWQsIGx2bC0+bHYtPm5hbWUsIHZnLT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKCFjaGVja19sdl9zZWdtZW50cyhsdmwtPmx2LCAxKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViBzZWdtZW50cyBjb3JydXB0ZWQgaW4gJXMuIiwKKwkJCQkgIGx2bC0+bHYtPm5hbWUpOworCQkJciA9IDA7CisJCX0KKworCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KHZoYXNoLmx2bmFtZSwgbHZsLT5sdi0+bmFtZSwgbHZsKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaGFzaCBsdm5hbWUuIik7CisJCQlyID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFkbV9oYXNoX2luc2VydF9iaW5hcnkodmhhc2gubHZpZCwgJmx2bC0+bHYtPmx2aWQuaWRbMV0sCisJCQkJCSAgIHNpemVvZihsdmwtPmx2LT5sdmlkLmlkWzFdKSwgbHZsLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGhhc2ggbHZpZC4iKTsKKwkJCXIgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIV9sdl9wb3N0b3JkZXJfdmcodmcsIF9sdl92YWxpZGF0ZV9yZWZlcmVuY2VzX3NpbmdsZSwgJnZoYXNoKSkgeworCQlzdGFjazsKKwkJciA9IDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKCFsdl9pc19wdm1vdmUobHZsLT5sdikpCisJCQljb250aW51ZTsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2bC0+bHYtPnNlZ21lbnRzKSB7CisJCQlpZiAoc2VnX2lzX21pcnJvcmVkKHNlZykpIHsKKwkJCQlpZiAoc2VnLT5hcmVhX2NvdW50ICE9IDIpIHsKKwkJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkJCQkgICJTZWdtZW50IGluICVzIGlzIG5vdCAyLXdheS4iLAorCQkJCQkJICBsdmwtPmx2LT5uYW1lKTsKKwkJCQkJciA9IDA7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzZWctPmFyZWFfY291bnQgIT0gMSkgeworCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJCQkgICJTZWdtZW50IGluICVzIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJlYXM6ICVkLiIsCisJCQkJCSAgbHZsLT5sdi0+bmFtZSwgc2VnLT5hcmVhX2NvdW50KTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmICghKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfVU5MSU1JVEVEX1ZPTFMpICYmCisJICAgICghdmctPm1heF9sdiB8fCAhdmctPm1heF9wdikpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJWb2x1bWUgZ3JvdXAgJXMgaGFzIGxpbWl0ZWQgUFYvTFYgY291bnQiCisJCQkgICIgYnV0IGxpbWl0IGlzIG5vdCBzZXQuIiwgdmctPm5hbWUpOworCQlyID0gMDsKKwl9CisKKwlpZiAodmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYgJiYKKwkgICAgIWx2X2lzX3Bvb2xfbWV0YWRhdGFfc3BhcmUodmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgcmVmZXJlbmNlcyBub24gcG9vbCBtZXRhZGF0YSBzcGFyZSBMViAlcy4iLAorCQkJICB2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdi0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCWlmICh2Z19tYXhfbHZfcmVhY2hlZCh2ZykpCisJCXN0YWNrOworCisJaWYgKCEodmhhc2gubHZfbG9ja19hcmdzID0gZG1faGFzaF9jcmVhdGUobHZfY291bnQpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBsdl9sb2NrX2FyZ3MgaGFzaCIpOworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJaWYgKCF2Zy0+bG9ja19hcmdzKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHICVzIHdpdGggbG9ja190eXBlICVzIHdpdGhvdXQgbG9ja19hcmdzIiwKKwkJCQkgIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKHZnX2lzX2NsdXN0ZXJlZCh2ZykpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgJXMgd2l0aCBsb2NrX3R5cGUgJXMgaXMgY2x1c3RlcmVkIiwKKwkJCQkgIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKHZnLT5zeXN0ZW1faWQgJiYgdmctPnN5c3RlbV9pZFswXSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJWRyAlcyB3aXRoIGxvY2tfdHlwZSAlcyBoYXMgc3lzdGVtX2lkICVzIiwKKwkJCQkgIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlLCB2Zy0+c3lzdGVtX2lkKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKHN0cmNtcCh2Zy0+bG9ja190eXBlLCAic2FubG9jayIpICYmIHN0cmNtcCh2Zy0+bG9ja190eXBlLCAiZGxtIikpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVkcgJXMgaGFzIHVua25vd24gbG9ja190eXBlICVzIiwKKwkJCQkgIHZnLT5uYW1lLCB2Zy0+bG9ja190eXBlKTsKKwkJCXIgPSAwOworCQl9CisKKwkJaWYgKCFfdmFsaWRhdGVfdmdfbG9ja19hcmdzKHZnKSkKKwkJCXIgPSAwOworCX0gZWxzZSB7CisJCWlmICh2Zy0+bG9ja19hcmdzKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHICVzIGhhcyBsb2NrX2FyZ3MgJXMgd2l0aG91dCBsb2NrX3R5cGUiLAorCQkJCSAgdmctPm5hbWUsIHZnLT5sb2NrX2FyZ3MpOworCQkJciA9IDA7CisJCX0KKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlpZiAoaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkgeworCQkJaWYgKGxvY2tkX2x2X3VzZXNfbG9jayhsdmwtPmx2KSkgeworCQkJCWlmICh2Zy0+c2tpcF92YWxpZGF0ZV9sb2NrX2FyZ3MpCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyoKKwkJCQkgKiBGSVhNRTogbWFrZSBtaXNzaW5nIGxvY2tfYXJncyBhbiBlcnJvci4KKwkJCQkgKiBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIGNhc2VzIHdoZXJlIHRoaXMKKwkJCQkgKiBjaGVjayBkb2Vzbid0IHdvcmsgY29ycmVjdGx5OgorCQkJCSAqCisJCQkJICogMS4gV2hlbiBjcmVhdGluZyBhIGNvdyBzbmFwc2hvdCwKKwkJCQkgKiAobHZjcmVhdGUgLXMgLUwxTSAtbiBzbmFwMSB2Zy9sdjEpLAorCQkJCSAqIGxvY2tkX2x2X3VzZXNfbG9jaygpIHVzZXMgbHZfaXNfY293KCkKKwkJCQkgKiB3aGljaCBkZXBlbmRzIG9uIGx2LT5zbmFwc2hvdCBiZWluZworCQkJCSAqIHNldCwgYnV0IGl0J3Mgbm90IHNldCBhdCB0aGlzIHBvaW50LAorCQkJCSAqIHNvIGxvY2tkX2x2X3VzZXNfbG9jaygpIGNhbm5vdCBpZGVudGlmeQorCQkJCSAqIHRoZSBMViBhcyBhIGNvd19sdiwgYW5kIHRoaW5rcyBpdCBuZWVkcworCQkJCSAqIGEgbG9jayB3aGVuIGl0IGRvZXNuJ3QuICBUbyBmaXggdGhpcyB3ZQorCQkJCSAqIHByb2JhYmx5IG5lZWQgdG8gdmFsaWRhdGUgYnkgZmluZGluZyB0aGUKKwkJCQkgKiBvcmlnaW4gTFYsIHRoZW4gZmluZGluZyBhbGwgaXRzIHNuYXBzaG90cworCQkJCSAqIHdoaWNoIHdpbGwgaGF2ZSBubyBsb2NrX2FyZ3MuCisJCQkJICoKKwkJCQkgKiAyLiBXaGVuIGNvbnZlcnRpbmcgYW4gTFYgdG8gYSB0aGluIHBvb2wKKwkJCQkgKiB3aXRob3V0IHVzaW5nIGFuIGV4aXN0aW5nIG1ldGFkYXRhIExWLAorCQkJCSAqIChsdmNvbnZlcnQgLS10eXBlIHRoaW4tcG9vbCB2Zy9wb29sWCksCisJCQkJICogdGhlcmUgaXMgYW4gaW50ZXJtZWRpYXRlIExWIGNyZWF0ZWQsCisJCQkJICogcHJvYmFibHkgZm9yIHRoZSBtZXRhZGF0YSBMViwgYW5kCisJCQkJICogdmFsaWRhdGUgaXMgY2FsbGVkIG9uIHRoZSBWRyBpbiB0aGlzCisJCQkJICogaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCBmaW5kcyB0aGUKKwkJCQkgKiBuZXdseSBjcmVhdGVkIExWIHdoaWNoIGlzIG5vdCB5ZXQKKwkJCQkgKiBpZGVudGlmaWVkIGFzIGEgbWV0YWRhdGEgTFYsIGFuZAorCQkJCSAqIGRvZXMgbm90IGhhdmUgYW55IGxvY2tfYXJncy4gIFRvIGZpeAorCQkJCSAqIHRoaXMgd2UgbWlnaHQgYmUgYWJsZSB0byBmaW5kIHRoZSBwbGFjZQorCQkJCSAqIHdoZXJlIHRoZSBpbnRlcm1lZGlhdGUgTFYgaXMgY3JlYXRlZCwKKwkJCQkgKiBhbmQgc2V0IG5ldyB2YXJpYWJsZSBvbiBpdCBsaWtlIGZvciB2Z3MsCisJCQkJICogbHYtPnNraXBfdmFsaWRhdGVfbG9ja19hcmdzLgorCQkJCSAqLworCQkJCWlmICghbHZsLT5sdi0+bG9ja19hcmdzKSB7CisJCQkJCS8qCisJCQkJCWxvZ192ZXJib3NlKCJMViAlcy8lcyBtaXNzaW5nIGxvY2tfYXJncyIsCisJCQkJCQkgICAgdmctPm5hbWUsIGx2bC0+bHYtPm5hbWUpOworCQkJCQlyID0gMDsKKwkJCQkJKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKCFfdmFsaWRhdGVfbHZfbG9ja19hcmdzKGx2bC0+bHYpKSB7CisJCQkJCXIgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIXN0cmNtcCh2Zy0+bG9ja190eXBlLCAic2FubG9jayIpKSB7CisJCQkJCWlmIChkbV9oYXNoX2xvb2t1cCh2aGFzaC5sdl9sb2NrX2FyZ3MsIGx2bC0+bHYtPmxvY2tfYXJncykpIHsKKwkJCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMvJXMgaGFzIGR1cGxpY2F0ZSBsb2NrX2FyZ3MgJXMuIiwKKwkJCQkJCQkgIHZnLT5uYW1lLCBsdmwtPmx2LT5uYW1lLCBsdmwtPmx2LT5sb2NrX2FyZ3MpOworCQkJCQkJciA9IDA7CisJCQkJCX0KKworCQkJCQlpZiAoIWRtX2hhc2hfaW5zZXJ0KHZoYXNoLmx2X2xvY2tfYXJncywgbHZsLT5sdi0+bG9ja19hcmdzLCBsdmwpKSB7CisJCQkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBoYXNoIGx2bmFtZS4iKTsKKwkJCQkJCXIgPSAwOworCQkJCQl9CisKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChsdmwtPmx2LT5sb2NrX2FyZ3MpIHsKKwkJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcy8lcyBzaG91bGRuJ3QgaGF2ZSBsb2NrX2FyZ3MiLAorCQkJCQkJICB2Zy0+bmFtZSwgbHZsLT5sdi0+bmFtZSk7CisJCQkJCXIgPSAwOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChsdmwtPmx2LT5sb2NrX2FyZ3MpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzLyVzIHdpdGggbm8gbG9ja190eXBlIGhhcyBsb2NrX2FyZ3MgJXMiLAorCQkJCQkgIHZnLT5uYW1lLCBsdmwtPmx2LT5uYW1lLCBsdmwtPmx2LT5sb2NrX2FyZ3MpOworCQkJCXIgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKCEodmhhc2guaGlzdG9yaWNhbF9sdm5hbWUgPSBkbV9oYXNoX2NyZWF0ZShkbV9saXN0X3NpemUoJnZnLT5oaXN0b3JpY2FsX2x2cykpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBoaXN0b3JpY2FsIExWIG5hbWUgaGFzaCIpOworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisgICAgICAgIGlmICghKHZoYXNoLmhpc3RvcmljYWxfbHZpZCA9IGRtX2hhc2hfY3JlYXRlKGRtX2xpc3Rfc2l6ZSgmdmctPmhpc3RvcmljYWxfbHZzKSkpKSB7CisgICAgICAgICAgICAgICAgbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgaGlzdG9yaWNhbCBMViB1dWlkIGhhc2giKTsKKyAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpIHsKKwkJaWYgKCFnbHZsLT5nbHYtPmlzX2hpc3RvcmljYWwpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTFYgJXMvJXMgYXBwZWFyaW5nIGluIFZHJ3MgaGlzdG9yaWNhbCBsaXN0IGlzIG5vdCBhIGhpc3RvcmljYWwgTFYiLAorCQkJCSAgdmctPm5hbWUsIGdsdmwtPmdsdi0+bGl2ZS0+bmFtZSk7CisJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGx2ID0gZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsOworCisJCWlmIChobHYtPnZnICE9IHZnKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkhpc3RvcmljYWwgTFYgJXMgcG9pbnRzIHRvIGRpZmZlcmVudCBWRyAlcyB3aGlsZSBpdCBpcyBsaXN0ZWQgaW4gVkcgJXMiLAorCQkJCSAgaGx2LT5uYW1lLCBobHYtPnZnLT5uYW1lLCB2Zy0+bmFtZSk7CisJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFpZF9lcXVhbCgmaGx2LT5sdmlkLmlkWzBdLCAmaGx2LT52Zy0+aWQpKSB7CisJCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmaGx2LT5sdmlkLmlkWzBdLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQkJCXN0YWNrOworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmhsdi0+dmctPmlkLCB1dWlkMiwgc2l6ZW9mKHV1aWQyKSkpCisJCQkJc3RhY2s7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkhpc3RvcmljYWwgTFYgJXMgaGFzIFZHIFVVSUQgJXMgYnV0IGl0cyBWRyAlcyBoYXMgVVVJRCAlcyIsCisJCQkJICBobHYtPm5hbWUsIHV1aWQsIGhsdi0+dmctPm5hbWUsIHV1aWQyKTsKKwkJCXIgPSAwOworCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisJCWlmIChkbV9oYXNoX2xvb2t1cF9iaW5hcnkodmhhc2guaGlzdG9yaWNhbF9sdmlkLCAmaGx2LT5sdmlkLmlkWzFdLCBzaXplb2YoaGx2LT5sdmlkLmlkWzFdKSkpIHsKKwkJCWlmICghaWRfd3JpdGVfZm9ybWF0KCZobHYtPmx2aWQuaWRbMV0sIHV1aWQsc2l6ZW9mKHV1aWQpKSkKKwkJCQlzdGFjazsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRHVwbGljYXRlIGhpc3RvcmljYWwgTFYgaWQgJXMgZGV0ZWN0ZWQgZm9yICVzIGluICVzIiwKKwkJCQkgIHV1aWQsIGhsdi0+bmFtZSwgdmctPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICAgICAgfQorCisJCWlmIChkbV9oYXNoX2xvb2t1cCh2aGFzaC5oaXN0b3JpY2FsX2x2bmFtZSwgaGx2LT5uYW1lKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJEdXBsaWNhdGUgaGlzdG9yaWNhbCBMViBuYW1lICVzIGRldGVjdGVkIGluICVzIiwgaGx2LT5uYW1lLCB2Zy0+bmFtZSk7CisJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKyAgICAgICAgICAgICAgICBpZiAoIWRtX2hhc2hfaW5zZXJ0KHZoYXNoLmhpc3RvcmljYWxfbHZuYW1lLCBobHYtPm5hbWUsIGhsdikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19lcnJvcigiRmFpbGVkIHRvIGhhc2ggaGlzdG9yaWNhbCBMViBuYW1lIik7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZG1faGFzaF9pbnNlcnRfYmluYXJ5KHZoYXNoLmhpc3RvcmljYWxfbHZpZCwgJmhsdi0+bHZpZC5pZFsxXSwgc2l6ZW9mKGhsdi0+bHZpZC5pZFsxXSksIGhsdikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19lcnJvcigiRmFpbGVkIHRvIGhhc2ggaGlzdG9yaWNhbCBMViBpZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKwkJaWYgKGRtX2hhc2hfbG9va3VwKHZoYXNoLmx2bmFtZSwgaGx2LT5uYW1lKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJOYW1lICVzIGFwcGVhcnMgYXMgbGl2ZSBhbmQgaGlzdG9yaWNhbCBMViBhdCB0aGUgc2FtZSB0aW1lIGluIFZHICVzIiwKKwkJCQkgIGhsdi0+bmFtZSwgdmctPm5hbWUpOworCQkJciA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghaGx2LT5pbmRpcmVjdF9vcmlnaW4gJiYgIWRtX2xpc3Rfc2l6ZSgmaGx2LT5pbmRpcmVjdF9nbHZzKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJIaXN0b3JpY2FsIExWICVzIGlzIG5vdCBwYXJ0IG9mIGFueSBMViBjaGFpbiBpbiBWRyAlcyIsIGhsdi0+bmFtZSwgdmctPm5hbWUpOworCQkJciA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworb3V0OgorCWlmICh2aGFzaC5sdmlkKQorCQlkbV9oYXNoX2Rlc3Ryb3kodmhhc2gubHZpZCk7CisJaWYgKHZoYXNoLmx2bmFtZSkKKwkJZG1faGFzaF9kZXN0cm95KHZoYXNoLmx2bmFtZSk7CisJaWYgKHZoYXNoLmhpc3RvcmljYWxfbHZpZCkKKwkJZG1faGFzaF9kZXN0cm95KHZoYXNoLmhpc3RvcmljYWxfbHZpZCk7CisJaWYgKHZoYXNoLmhpc3RvcmljYWxfbHZuYW1lKQorCQlkbV9oYXNoX2Rlc3Ryb3kodmhhc2guaGlzdG9yaWNhbF9sdm5hbWUpOworCWlmICh2aGFzaC5wdmlkKQorCQlkbV9oYXNoX2Rlc3Ryb3kodmhhc2gucHZpZCk7CisJaWYgKHZoYXNoLmx2X2xvY2tfYXJncykKKwkJZG1faGFzaF9kZXN0cm95KHZoYXNoLmx2X2xvY2tfYXJncyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcHZfaW5fcHZfbGlzdChzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IGRtX2xpc3QgKmhlYWQpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIGhlYWQpIHsKKwkJaWYgKHB2bC0+cHYgPT0gcHYpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmIGFueSBvZiB0aGUgUFZzIGluIFZHIHN0aWxsIGNvbnRhaW4gb2xkIFBWIGhlYWRlcnMKKyAqIGFuZCBpZiB5ZXMsIHNjaGVkdWxlIHRoZW0gZm9yIFBWIGhlYWRlciB1cGRhdGUuCisgKi8KK3N0YXRpYyBpbnQgX3ZnX3VwZGF0ZV9vbGRfcHZfZXh0X2lmX25lZWRlZChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqbmV3X3B2bDsKKwlpbnQgcHZfbmVlZHNfcmV3cml0ZTsKKworCWlmICghKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfUFZfRkxBR1MpKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmIChpc19taXNzaW5nX3B2KHB2bC0+cHYpIHx8CisJCSAgICAhcHZsLT5wdi0+Zm10LT5vcHMtPnB2X25lZWRzX3Jld3JpdGUpCisJCQljb250aW51ZTsKKworCQlpZiAoX3B2X2luX3B2X2xpc3QocHZsLT5wdiwgJnZnLT5wdl93cml0ZV9saXN0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghcHZsLT5wdi0+Zm10LT5vcHMtPnB2X25lZWRzX3Jld3JpdGUocHZsLT5wdi0+Zm10LCBwdmwtPnB2LAorCQkJCQkJCSAmcHZfbmVlZHNfcmV3cml0ZSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAocHZfbmVlZHNfcmV3cml0ZSkgeworCQkJLyoKKwkJCSAqIFNjaGVkdWxlIFBWIGZvciB3cml0aW5nIG9ubHkgb25jZSEKKwkJCSAqLworCQkJaWYgKF9wdl9pbl9wdl9saXN0KHB2bC0+cHYsICZ2Zy0+cHZfd3JpdGVfbGlzdCkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghKG5ld19wdmwgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZigqbmV3X3B2bCkpKSkgeworCQkJCWxvZ19lcnJvcigicHZfdG9fd3JpdGUgYWxsb2NhdGlvbiBmb3IgJyVzJyBmYWlsZWQiLCBwdl9kZXZfbmFtZShwdmwtPnB2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQluZXdfcHZsLT5wdiA9IHB2bC0+cHY7CisJCQlkbV9saXN0X2FkZCgmdmctPnB2X3dyaXRlX2xpc3QsICZuZXdfcHZsLT5saXN0KTsKKwkJCWxvZ19kZWJ1ZygiUFYgJXMgaGFzIG9sZCBleHRlbnNpb24gaGVhZGVyLCB1cGRhdGluZyB0byBuZXdlc3QgdmVyc2lvbi4iLAorCQkJCSAgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQl9CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZ2Zy0+cHZfd3JpdGVfbGlzdCkgJiYKKwkgICAgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBvbGQgUFYgZXh0ZW5zaW9uIGhlYWRlcnMgaW4gVkcgJXMuIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfaGlzdG9yaWNhbF9sdl9pc192YWxpZChzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSAqaGx2KQoreworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKworCWlmIChobHYtPmNoZWNrZWQpCisJCXJldHVybiBobHYtPnZhbGlkOworCisJLyoKKwkgKiBIaXN0b3JpY2FsIExWIGlzIHZhbGlkIGlmIHRoZXJlIGlzCisJICogYXQgbGVhc3Qgb25lIGxpdmUgTFYgYW1vbmcgYW5jZXN0b3JzLgorCSAqLworCWhsdi0+dmFsaWQgPSAwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhnbHZsLCAmaGx2LT5pbmRpcmVjdF9nbHZzKSB7CisJCWlmICghZ2x2bC0+Z2x2LT5pc19oaXN0b3JpY2FsIHx8CisJCSAgICBfY2hlY2tfaGlzdG9yaWNhbF9sdl9pc192YWxpZChnbHZsLT5nbHYtPmhpc3RvcmljYWwpKSB7CisJCQlobHYtPnZhbGlkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaGx2LT5jaGVja2VkID0gMTsKKwlyZXR1cm4gaGx2LT52YWxpZDsKK30KKworc3RhdGljIGludCBfaGFuZGxlX2hpc3RvcmljYWxfbHZzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bCwgKnRnbHZsOworCXRpbWVfdCBjdXJyZW50X3RpbWVzdGFtcCA9IDA7CisJc3RydWN0IGhpc3RvcmljYWxfbG9naWNhbF92b2x1bWUgKmhsdjsKKwlpbnQgdmFsaWQgPSAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpCisJCWdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+Y2hlY2tlZCA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZ2x2bCwgJnZnLT5oaXN0b3JpY2FsX2x2cykgeworCQlobHYgPSBnbHZsLT5nbHYtPmhpc3RvcmljYWw7CisKKwkJdmFsaWQgJj0gX2NoZWNrX2hpc3RvcmljYWxfbHZfaXNfdmFsaWQoaGx2KTsKKworCQlpZiAoIWhsdi0+dGltZXN0YW1wX3JlbW92ZWQpIHsKKwkJCWlmICghY3VycmVudF90aW1lc3RhbXApCisJCQkJY3VycmVudF90aW1lc3RhbXAgPSB0aW1lKE5VTEwpOworCQkJaGx2LT50aW1lc3RhbXBfcmVtb3ZlZCA9ICh1aW50NjRfdCkgY3VycmVudF90aW1lc3RhbXA7CisJCX0KKwl9CisKKwlpZiAodmFsaWQpCisJCXJldHVybiAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZ2x2bCwgdGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpIHsKKwkJaGx2ID0gZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsOworCQlpZiAoaGx2LT5jaGVja2VkICYmIGhsdi0+dmFsaWQpCisJCQljb250aW51ZTsKKworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiQXV0b21hdGljYWxseSByZW1vdmluZyBoaXN0b3JpY2FsICIKKwkJCQkJImxvZ2ljYWwgdm9sdW1lICVzLyVzJXMuIiwKKwkJCQkJIHZnLT5uYW1lLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgaGx2LT5uYW1lKTsKKwkJaWYgKCFoaXN0b3JpY2FsX2dsdl9yZW1vdmUoZ2x2bC0+Z2x2KSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQWZ0ZXIgdmdfd3JpdGUoKSByZXR1cm5zIHN1Y2Nlc3MsCisgKiBjYWxsZXIgTVVTVCBjYWxsIGVpdGhlciB2Z19jb21taXQoKSBvciB2Z19yZXZlcnQoKQorICovCitpbnQgdmdfd3JpdGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGRtX2xpc3QgKm1kYWg7CisJc3RydWN0IHB2X3RvX3dyaXRlICpwdl90b193cml0ZSwgKnB2X3RvX3dyaXRlX3NhZmU7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnB2bF9zYWZlOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlpbnQgcmV2ZXJ0ID0gMCwgd3JvdGUgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKGx2bC0+bHYtPmxvY2tfYXJncyAmJiAhc3RyY21wKGx2bC0+bHYtPmxvY2tfYXJncywgInBlbmRpbmciKSkgeworCQkJaWYgKCFsb2NrZF9pbml0X2x2X2FyZ3ModmctPmNtZCwgdmcsIGx2bC0+bHYsIHZnLT5sb2NrX3R5cGUsICZsdmwtPmx2LT5sb2NrX2FyZ3MpKSB7CisJCQkJbG9nX2Vycm9yKCJDYW5ub3QgYWxsb2NhdGUgbG9jayBmb3IgbmV3IExWLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHZsLT5sdi0+bmV3X2xvY2tfYXJncyA9IDE7CisJCX0KKwl9CisKKwlpZiAoIV9oYW5kbGVfaGlzdG9yaWNhbF9sdnModmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGhhbmRsZSBoaXN0b3JpY2FsIExWcyBpbiBWRyAlcy4iLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmdfdmFsaWRhdGUodmcpKQorCQlyZXR1cm5fMDsKKworCWlmICh2Zy0+c3RhdHVzICYgUEFSVElBTF9WRykgeworCQlsb2dfZXJyb3IoIkNhbm5vdCB1cGRhdGUgcGFydGlhbCB2b2x1bWUgZ3JvdXAgJXMuIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodmdfbWlzc2luZ19wdl9jb3VudCh2ZykgJiYgIXZnLT5jbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdXBkYXRlIHZvbHVtZSBncm91cCAlcyB3aGlsZSBwaHlzaWNhbCAiCisJCQkgICJ2b2x1bWVzIGFyZSBtaXNzaW5nLiIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2bWNhY2hlX2ZvdW5kX2R1cGxpY2F0ZV9wdnMoKSAmJiB2Z19oYXNfZHVwbGljYXRlX3B2cyh2ZykgJiYKKwkgICAgIWZpbmRfY29uZmlnX3RyZWVfYm9vbCh2Zy0+Y21kLCBkZXZpY2VzX2FsbG93X2NoYW5nZXNfd2l0aF9kdXBsaWNhdGVfcHZzX0NGRywgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdXBkYXRlIHZvbHVtZSBncm91cCAlcyB3aXRoIGR1cGxpY2F0ZSBQViBkZXZpY2VzLiIsCisJCQkgIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZnX2hhc191bmtub3duX3NlZ21lbnRzKHZnKSAmJiAhdmctPmNtZC0+aGFuZGxlc191bmtub3duX3NlZ21lbnRzKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVwZGF0ZSB2b2x1bWUgZ3JvdXAgJXMgd2l0aCB1bmtub3duIHNlZ21lbnRzIGluIGl0ISIsCisJCQkgIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCh2Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX01EQVMpICYmICFfdmdfYWRqdXN0X2lnbm9yZWRfbWRhcyh2ZykpCisJCXJldHVybl8wOworCisJaWYgKCF2Z19tZGFfdXNlZF9jb3VudCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZyB2Z193cml0ZTogTm8gbWV0YWRhdGEgYXJlYXMgdG8gd3JpdGUgdG8hIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZHJvcF9jYWNoZWRfbWV0YWRhdGEodmcpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRyb3AgY2FjaGVkIG1ldGFkYXRhIGZvciBWRyAlcy4iLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjcml0aWNhbF9zZWN0aW9uKCkpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiV3JpdGluZyBtZXRhZGF0YSBpbiBjcml0aWNhbCBzZWN0aW9uLiIpOworCisJLyogVW5sb2NrIG1lbW9yeSBpZiBwb3NzaWJsZSAqLworCW1lbWxvY2tfdW5sb2NrKHZnLT5jbWQpOworCXZnLT5zZXFubysrOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUocHZsLCBwdmxfc2FmZSwgJnZnLT5wdl93cml0ZV9saXN0KSB7CisJCWlmICghcHZfd3JpdGUodmctPmNtZCwgcHZsLT5wdiwgMSkpCisJCQlyZXR1cm5fMDsKKwkJZG1fbGlzdF9kZWwoJnB2bC0+bGlzdCk7CisJfQorCisgICAgICAgIGRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHB2X3RvX3dyaXRlLCBwdl90b193cml0ZV9zYWZlLCAmdmctPnB2c190b193cml0ZSkgeworCQlpZiAoIV9wdmNyZWF0ZV93cml0ZSh2Zy0+Y21kLCBwdl90b193cml0ZSkpCisJCQlyZXR1cm5fMDsKKwkJZG1fbGlzdF9kZWwoJnB2X3RvX3dyaXRlLT5saXN0KTsKKwl9CisKKwkvKiBXcml0ZSB0byBlYWNoIGNvcHkgb2YgdGhlIG1ldGFkYXRhIGFyZWEgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKSB7CisJCWlmICghbWRhLT5vcHMtPnZnX3dyaXRlKSB7CisJCQlsb2dfZXJyb3IoIkZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgdm9sdW1lIgorCQkJCSAgImdyb3VwIG1ldGFkYXRhIGFyZWFzIik7CisJCQlyZXZlcnQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFtZGEtPm9wcy0+dmdfd3JpdGUodmctPmZpZCwgdmcsIG1kYSkpIHsKKwkJCWlmICh2Zy0+Y21kLT5oYW5kbGVzX21pc3NpbmdfcHZzKSB7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IEZhaWxlZCB0byB3cml0ZSBhbiBNREEgb2YgVkcgJXMuIiwgdmctPm5hbWUpOworCQkJCW1kYS0+c3RhdHVzIHw9IE1EQV9GQUlMRUQ7CisJCQl9IGVsc2UgeworCQkJCXN0YWNrOworCQkJCXJldmVydCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJKysgd3JvdGU7CisJfQorCisJaWYgKHJldmVydCB8fCAhd3JvdGUpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgVkcgJXMuIiwgdmctPm5hbWUpOworCQlkbV9saXN0X3VuaXRlcmF0ZShtZGFoLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlLCAmbWRhLT5saXN0KSB7CisJCQltZGEgPSBkbV9saXN0X2l0ZW0obWRhaCwgc3RydWN0IG1ldGFkYXRhX2FyZWEpOworCisJCQlpZiAobWRhLT5vcHMtPnZnX3JldmVydCAmJgorCQkJICAgICFtZGEtPm9wcy0+dmdfcmV2ZXJ0KHZnLT5maWQsIHZnLCBtZGEpKSB7CisJCQkJc3RhY2s7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IHByZS1jb21taXQgZWFjaCBjb3B5IG9mIHRoZSBuZXcgbWV0YWRhdGEgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKSB7CisJCWlmIChtZGEtPnN0YXR1cyAmIE1EQV9GQUlMRUQpCisJCQljb250aW51ZTsKKwkJaWYgKG1kYS0+b3BzLT52Z19wcmVjb21taXQgJiYKKwkJICAgICFtZGEtPm9wcy0+dmdfcHJlY29tbWl0KHZnLT5maWQsIHZnLCBtZGEpKSB7CisJCQlzdGFjazsKKwkJCS8qIFJldmVydCAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkgeworCQkJCWlmIChtZGEtPnN0YXR1cyAmIE1EQV9GQUlMRUQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChtZGEtPm9wcy0+dmdfcmV2ZXJ0ICYmCisJCQkJICAgICFtZGEtPm9wcy0+dmdfcmV2ZXJ0KHZnLT5maWQsIHZnLCBtZGEpKSB7CisJCQkJCXN0YWNrOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFfdmdfdXBkYXRlX3ZnX3ByZWNvbW1pdHRlZCh2ZykpIC8qIHByZXBhcmUgcHJlY29tbWl0ZWQgKi8KKwkJcmV0dXJuXzA7CisKKwlsb2NrZF92Z191cGRhdGUodmcpOworCisJLyoKKwkgKiBUaGlzIHRlbGxzIGx2bWV0YWQgdGhlIG5ldyBzZXFubyBpdCBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUKKwkgKiB0aGUgbWV0YWRhdGEgZm9yIGFmdGVyIHRoZSBjb21taXQuICBUaGUgY2FjaGVkIFZHIHdpbGwgYmUKKwkgKiBpbnZhbGlkIGluIGx2bWV0YWQgdW50aWwgdGhpcyBjb21tYW5kIHNlbmRzIHRoZSBuZXcgbWV0YWRhdGEKKwkgKiBhZnRlciBpdCdzIGNvbW1pdHRlZC4KKwkgKi8KKwlpZiAoIWx2bWV0YWRfdmdfdXBkYXRlX3BlbmRpbmcodmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHByZXBhcmUgbmV3IFZHIG1ldGFkYXRhIGluIGx2bWV0YWQgY2FjaGUuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z19jb21taXRfbWRhcyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCAqdG1kYTsKKwlzdHJ1Y3QgZG1fbGlzdCBpZ25vcmVkOworCWludCBmYWlsZWQgPSAwOworCWludCBjYWNoZV91cGRhdGVkID0gMDsKKworCS8qIFJlYXJyYW5nZSB0aGUgbWV0YWRhdGFfYXJlYXNfaW5fdXNlIHNvIGlnbm9yZWQgbWRhcyBjb21lIGZpcnN0LiAqLworCWRtX2xpc3RfaW5pdCgmaWdub3JlZCk7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUobWRhLCB0bWRhLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKQorCQlpZiAobWRhX2lzX2lnbm9yZWQobWRhKSkKKwkJCWRtX2xpc3RfbW92ZSgmaWdub3JlZCwgJm1kYS0+bGlzdCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShtZGEsIHRtZGEsICZpZ25vcmVkKQorCQlkbV9saXN0X21vdmUoJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSwgJm1kYS0+bGlzdCk7CisKKwkvKiBDb21taXQgdG8gZWFjaCBjb3B5IG9mIHRoZSBtZXRhZGF0YSBhcmVhICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkgeworCQlpZiAobWRhLT5zdGF0dXMgJiBNREFfRkFJTEVEKQorCQkJY29udGludWU7CisJCWZhaWxlZCA9IDA7CisJCWlmIChtZGEtPm9wcy0+dmdfY29tbWl0ICYmCisJCSAgICAhbWRhLT5vcHMtPnZnX2NvbW1pdCh2Zy0+ZmlkLCB2ZywgbWRhKSkgeworCQkJc3RhY2s7CisJCQlmYWlsZWQgPSAxOworCQl9CisJCS8qIFVwZGF0ZSBjYWNoZSBmaXJzdCB0aW1lIHdlIHN1Y2NlZWQgKi8KKwkJaWYgKCFmYWlsZWQgJiYgIWNhY2hlX3VwZGF0ZWQpIHsKKwkJCWx2bWNhY2hlX3VwZGF0ZV92Zyh2ZywgMCk7CisJCQkvLyBsdm1ldGFkX3ZnX2NvbW1pdCh2Zyk7CisJCQljYWNoZV91cGRhdGVkID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gY2FjaGVfdXBkYXRlZDsKK30KKworLyogQ29tbWl0IHBlbmRpbmcgY2hhbmdlcyAqLworaW50IHZnX2NvbW1pdChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlpbnQgY2FjaGVfdXBkYXRlZCA9IDA7CisKKwlpZiAoIWx2bWNhY2hlX3ZnbmFtZV9pc19sb2NrZWQodmctPm5hbWUpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byB3cml0ZSBuZXcgVkcgbWV0YWRhdGEgIgorCQkJICAid2l0aG91dCBsb2NraW5nICVzIiwgdmctPm5hbWUpOworCQlyZXR1cm4gY2FjaGVfdXBkYXRlZDsKKwl9CisKKwljYWNoZV91cGRhdGVkID0gX3ZnX2NvbW1pdF9tZGFzKHZnKTsKKworCXNldF92Z19ub3RpZnkodmctPmNtZCk7CisKKwlpZiAoY2FjaGVfdXBkYXRlZCkgeworCQkvKiBJbnN0cnVjdCByZW1vdGUgbm9kZXMgdG8gdXBncmFkZSBjYWNoZWQgbWV0YWRhdGEuICovCisJCWlmICghcmVtb3RlX2NvbW1pdF9jYWNoZWRfbWV0YWRhdGEodmcpKQorCQkJc3RhY2s7IC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbz8KKwkJLyoKKwkJICogV2UgbmVlZCB0byBjbGVhciBvbGRfbmFtZSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29tbWl0LgorCQkgKiBUaGUgdm9sdW1lX2dyb3VwIHN0cnVjdHVyZSBjb3VsZCBiZSByZXVzZWQgbGF0ZXIuCisJCSAqLworCQl2Zy0+b2xkX25hbWUgPSBOVUxMOworCisJCS8qIFRoaXMgKmlzKiB0aGUgb3JpZ2luYWwgbm93IHRoYXQgaXQncyBjb21taXRlZC4gKi8KKwkJcmVsZWFzZV92Zyh2Zy0+dmdfY29tbWl0dGVkKTsKKwkJdmctPnZnX2NvbW1pdHRlZCA9IHZnLT52Z19wcmVjb21taXR0ZWQ7CisJCXZnLT52Z19wcmVjb21taXR0ZWQgPSBOVUxMOworCQlpZiAodmctPmNmdF9wcmVjb21taXR0ZWQpIHsKKwkJCWRtX2NvbmZpZ19kZXN0cm95KHZnLT5jZnRfcHJlY29tbWl0dGVkKTsKKwkJCXZnLT5jZnRfcHJlY29tbWl0dGVkID0gTlVMTDsKKwkJfQorCX0KKworCS8qIElmIHVwZGF0ZSBmYWlsZWQsIHJlbW92ZSBhbnkgY2FjaGVkIHByZWNvbW1pdHRlZCBtZXRhZGF0YS4gKi8KKwlpZiAoIWNhY2hlX3VwZGF0ZWQgJiYgIWRyb3BfY2FjaGVkX21ldGFkYXRhKHZnKSkKKwkJbG9nX2Vycm9yKCJBdHRlbXB0IHRvIGRyb3AgY2FjaGVkIG1ldGFkYXRhIGZhaWxlZCAiCisJCQkgICJhZnRlciBjb21taXQgZm9yIFZHICVzLiIsIHZnLT5uYW1lKTsKKworCS8qIElmIGF0IGxlYXN0IG9uZSBtZGEgY29tbWl0IHN1Y2NlZWRlZCwgaXQgd2FzIGNvbW1pdHRlZCAqLworCXJldHVybiBjYWNoZV91cGRhdGVkOworfQorCisvKiBEb24ndCBjb21taXQgYW55IHBlbmRpbmcgY2hhbmdlcyAqLwordm9pZCB2Z19yZXZlcnQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJLyoKKwkgKiBUaGlzIHdpbGwgbGVhdmUgdGhlIGNhY2hlZCBjb3B5IGluIGx2bWV0YWQgSU5WQUxJRCAoZnJvbQorCSAqIGx2bWV0YWRfdmdfdXBkYXRlX3BlbmRpbmcpIGFuZCBtZWFucyB0aGUgVkcgd2lsbCBiZSByZXJlYWQgZnJvbSBkaXNrCisJICogdG8gdXBkYXRlIHRoZSBsdm1ldGFkIGNvcHksIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUKKwkgKiBjYWNoZWQgY29weSBpcyBjb3JyZWN0LgorCSAqLworCXZnLT5sdm1ldGFkX3VwZGF0ZV9wZW5kaW5nID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWlmIChsdmwtPmx2LT5uZXdfbG9ja19hcmdzKSB7CisJCQlsb2NrZF9mcmVlX2x2KHZnLT5jbWQsIHZnLCBsdmwtPmx2LT5uYW1lLCAmbHZsLT5sdi0+bHZpZC5pZFsxXSwgbHZsLT5sdi0+bG9ja19hcmdzKTsKKwkJCWx2bC0+bHYtPm5ld19sb2NrX2FyZ3MgPSAwOworCQl9CisJfQorCisJcmVsZWFzZV92Zyh2Zy0+dmdfcHJlY29tbWl0dGVkKTsgIC8qIFZHIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKwl2Zy0+dmdfcHJlY29tbWl0dGVkID0gTlVMTDsKKwlpZiAodmctPmNmdF9wcmVjb21taXR0ZWQpIHsKKwkJZG1fY29uZmlnX2Rlc3Ryb3kodmctPmNmdF9wcmVjb21taXR0ZWQpOworCQl2Zy0+Y2Z0X3ByZWNvbW1pdHRlZCA9IE5VTEw7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkgeworCQlpZiAobWRhLT5vcHMtPnZnX3JldmVydCAmJgorCQkgICAgIW1kYS0+b3BzLT52Z19yZXZlcnQodmctPmZpZCwgdmcsIG1kYSkpIHsKKwkJCXN0YWNrOworCQl9CisJfQorCisJaWYgKCFkcm9wX2NhY2hlZF9tZXRhZGF0YSh2ZykpCisJCWxvZ19lcnJvcigiQXR0ZW1wdCB0byBkcm9wIGNhY2hlZCBtZXRhZGF0YSBmYWlsZWQgIgorCQkJICAiYWZ0ZXIgcmV2ZXJ0ZWQgdXBkYXRlIGZvciBWRyAlcy4iLCB2Zy0+bmFtZSk7CisKKwlpZiAoIXJlbW90ZV9yZXZlcnRfY2FjaGVkX21ldGFkYXRhKHZnKSkKKwkJc3RhY2s7IC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbz8KK30KKworc3RhdGljIGludCBfY2hlY2tfbWRhX2luX3VzZShzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCB2b2lkICpfaW5fdXNlKQoreworCWludCAqaW5fdXNlID0gX2luX3VzZTsKKwlpZiAoIW1kYV9pc19pZ25vcmVkKG1kYSkpCisJCSppbl91c2UgPSAxOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgX3ZnX3JlYWRfb3JwaGFuX2JhdG9uIHsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZDsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwl1aW50MzJfdCB3YXJuX2ZsYWdzOworCWludCBjb25zaXN0ZW50OworCWludCByZXBhaXI7Cit9OworCitzdGF0aWMgaW50IF9jaGVja19vcl9yZXBhaXJfb3JwaGFuX3B2X2V4dChzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkJICBzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywKKwkJCQkJICBzdHJ1Y3QgX3ZnX3JlYWRfb3JwaGFuX2JhdG9uICpiKQoreworCXVpbnQzMl90IGV4dF92ZXJzaW9uID0gbHZtY2FjaGVfZXh0X3ZlcnNpb24oaW5mbyk7CisJdWludDMyX3QgZXh0X2ZsYWdzID0gbHZtY2FjaGVfZXh0X2ZsYWdzKGluZm8pOworCWludCBhdF9sZWFzdF9vbmVfbWRhX3VzZWQ7CisKKwkvKgorCSAqIE5vdGhpbmcgdG8gZG8gaWYgUFYgaGVhZGVyIGV4dGVuc2lvbiA8IDI6CisJICogIC0gdmVyc2lvbiAwIGlzIFBWIGhlYWRlciB3aXRob3V0IGFueSBleHRlbnNpb25zLAorCSAqICAtIHZlcnNpb24gMSBoYXMgYm9vdGxvYWRlciBhcmVhIHN1cHBvcnQgb25seSBhbmQKKwkgKiAgICB3ZSdyZSBub3QgY2hlY2tpbmcgYW55dGhpbmcgZm9yIHRoYXQgb25lIGhlcmUuCisJICovCisJaWYgKGV4dF92ZXJzaW9uIDwgMikgeworCQliLT5jb25zaXN0ZW50ID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGV4dF9mbGFncyAmIFBWX0VYVF9VU0VEKSB7CisJCWlmIChsdm1jYWNoZV9tZGFfY291bnQoaW5mbykpIHsKKwkJCWF0X2xlYXN0X29uZV9tZGFfdXNlZCA9IDA7CisJCQlsdm1jYWNoZV9mb3JlYWNoX21kYShpbmZvLCBfY2hlY2tfbWRhX2luX3VzZSwgJmF0X2xlYXN0X29uZV9tZGFfdXNlZCk7CisKKwkJCS8qCisJCQkgKiBXZSd2ZSBmb3VuZCBhIFBWIHRoYXQgaXMgbWFya2VkIGFzIHVzZWQgd2l0aCBQVl9FWFRfVVNFRCBmbGFnCisJCQkgKiBhbmQgaXQncyBvcnBoYW4gYXQgdGhlIHNhbWUgdGltZSB3aGlsZSBpdCBjb250YWlucyBNREFzLgorCQkJICogVGhpcyBpcyBpbmNvcnJlY3Qgc3RhdGUgYW5kIGl0IG5lZWRzIHRvIGJlIGZpeGVkLgorCQkJICogVGhlIFBWX0VYVF9VU0VEIGZsYWcgbmVlZHMgdG8gYmUgZHJvcHBlZCEKKwkJCSAqLworCQkJaWYgKGItPnJlcGFpcikgeworCQkJCWlmIChhdF9sZWFzdF9vbmVfbWRhX3VzZWQpIHsKKwkJCQkJbG9nX3dhcm4oIldBUk5JTkc6IFJlcGFpcmluZyBmbGFnIGluY29ycmVjdGx5IG1hcmtpbmcgIgorCQkJCQkJICJQaHlzaWNhbCBWb2x1bWUgJXMgYXMgdXNlZC4iLCBwdl9kZXZfbmFtZShwdikpOworCisJCQkJCS8qIHB2X3dyaXRlIHdpbGwgc2V0IGNvcnJlY3QgZXh0X2ZsYWdzICovCisJCQkJCWlmICghcHZfd3JpdGUoYi0+Y21kLCBwdiwgMCkpIHsKKwkJCQkJCWItPmNvbnNpc3RlbnQgPSAwOworCQkJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVwYWlyIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIuIiwKKwkJCQkJCQkgIHB2X2Rldl9uYW1lKHB2KSk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQliLT5jb25zaXN0ZW50ID0gMTsKKwkJCX0gZWxzZSBpZiAoYXRfbGVhc3Rfb25lX21kYV91c2VkKSB7CisJCQkJLyogbWFyayBhcyBpbmNvbnNpc3RlbnQgb25seSBpZiB0aGVyZSdzIGF0IGxlYXN0IDEgTURBIHVzZWQgKi8KKwkJCQliLT5jb25zaXN0ZW50ID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z19yZWFkX29ycGhhbl9wdihzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbywgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IF92Z19yZWFkX29ycGhhbl9iYXRvbiAqYiA9IGJhdG9uOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0gTlVMTDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJaWYgKCEocHYgPSBfcHZfcmVhZChiLT52Zy0+Y21kLCBiLT52Zy0+dmdtZW0sIGRldl9uYW1lKGx2bWNhY2hlX2RldmljZShpbmZvKSksCisJCQkgICAgYi0+dmctPmZpZCwgYi0+d2Fybl9mbGFncywgMCkpKSB7CisJCXN0YWNrOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShwdmwgPSBkbV9wb29sX3phbGxvYyhiLT52Zy0+dmdtZW0sIHNpemVvZigqcHZsKSkpKSB7CisJCWxvZ19lcnJvcigicHZfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlmcmVlX3B2X2ZpZChwdik7CisJCXJldHVybiAwOworCX0KKwlwdmwtPnB2ID0gcHY7CisJYWRkX3B2bF90b192Z3MoYi0+dmcsIHB2bCk7CisKKwlpZiAoIV9jaGVja19vcl9yZXBhaXJfb3JwaGFuX3B2X2V4dChwdiwgaW5mbywgYmF0b24pKSB7CisJCXN0YWNrOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogTWFrZSBvcnBoYW4gUFZzIGxvb2sgbGlrZSBhIFZHLiAqLworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkX29ycGhhbnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICAgdWludDMyX3Qgd2Fybl9mbGFncywKKwkJCQkJICAgICBjb25zdCBjaGFyICpvcnBoYW5fdmduYW1lLAorCQkJCQkgICAgIGludCAqY29uc2lzdGVudCkKK3sKKwljb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKwlzdHJ1Y3QgbHZtY2FjaGVfdmdpbmZvICp2Z2luZm87CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBOVUxMOworCXN0cnVjdCBfdmdfcmVhZF9vcnBoYW5fYmF0b24gYmF0b247CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnRwdmw7CisJc3RydWN0IHB2X2xpc3QgaGVhZDsKKworCWRtX2xpc3RfaW5pdCgmaGVhZC5saXN0KTsKKwlsdm1jYWNoZV9sYWJlbF9zY2FuKGNtZCk7CisJbHZtY2FjaGVfc2VlZF9pbmZvc19mcm9tX2x2bWV0YWQoY21kKTsKKworCWlmICghKHZnaW5mbyA9IGx2bWNhY2hlX3ZnaW5mb19mcm9tX3ZnbmFtZShvcnBoYW5fdmduYW1lLCBOVUxMKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEoZm10ID0gbHZtY2FjaGVfZm10X2Zyb21fdmduYW1lKGNtZCwgb3JwaGFuX3ZnbmFtZSwgTlVMTCwgMCkpKQorCQlyZXR1cm5fTlVMTDsKKworCXZnID0gZm10LT5vcnBoYW5fdmc7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwdmwsIHRwdmwsICZ2Zy0+cHZzKQorCQlpZiAocHZsLT5wdi0+c3RhdHVzICYgVU5MQUJFTExFRF9QViApCisJCQlkbV9saXN0X21vdmUoJmhlYWQubGlzdCwgJnB2bC0+bGlzdCk7CisJCWVsc2UKKwkJCXB2X3NldF9maWQocHZsLT5wdiwgTlVMTCk7CisKKwlkbV9saXN0X2luaXQoJnZnLT5wdnMpOworCXZnLT5wdl9jb3VudCA9IDA7CisJdmctPmV4dGVudF9jb3VudCA9IDA7CisJdmctPmZyZWVfY291bnQgPSAwOworCisJYmF0b24uY21kID0gY21kOworCWJhdG9uLndhcm5fZmxhZ3MgPSB3YXJuX2ZsYWdzOworCWJhdG9uLnZnID0gdmc7CisJYmF0b24uY29uc2lzdGVudCA9IDE7CisJYmF0b24ucmVwYWlyID0gKmNvbnNpc3RlbnQ7CisKKwl3aGlsZSAoKHB2bCA9IChzdHJ1Y3QgcHZfbGlzdCAqKSBkbV9saXN0X2ZpcnN0KCZoZWFkLmxpc3QpKSkgeworCQlkbV9saXN0X2RlbCgmcHZsLT5saXN0KTsKKwkJYWRkX3B2bF90b192Z3ModmcsIHB2bCk7CisJCXZnLT5leHRlbnRfY291bnQgKz0gcHZsLT5wdi0+cGVfY291bnQ7CisJCXZnLT5mcmVlX2NvdW50ICs9IHB2bC0+cHYtPnBlX2NvdW50OworCX0KKworCWlmICghbHZtY2FjaGVfZm9yZWFjaF9wdih2Z2luZm8sIF92Z19yZWFkX29ycGhhbl9wdiwgJmJhdG9uKSkKKwkJcmV0dXJuX05VTEw7CisKKwkqY29uc2lzdGVudCA9IGJhdG9uLmNvbnNpc3RlbnQ7CisJcmV0dXJuIHZnOworfQorCitzdGF0aWMgaW50IF91cGRhdGVfcHZfbGlzdChzdHJ1Y3QgZG1fcG9vbCAqcHZtZW0sIHN0cnVjdCBkbV9saXN0ICphbGxfcHZzLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqcHZsMjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwyLCBhbGxfcHZzKSB7CisJCQlpZiAocHZsLT5wdi0+ZGV2ID09IHB2bDItPnB2LT5kZXYpCisJCQkJZ290byBuZXh0X3B2OworCQl9CisKKwkJLyoKKwkJICogUFYgaXMgbm90IG9uIGxpc3Qgc28gYWRkIGl0LgorCQkgKi8KKwkJaWYgKCEocHZsMiA9IF9jb3B5X3B2bChwdm1lbSwgcHZsKSkpIHsKKwkJCWxvZ19lcnJvcigicHZfbGlzdCBhbGxvY2F0aW9uIGZvciAnJXMnIGZhaWxlZCIsCisJCQkJICBwdl9kZXZfbmFtZShwdmwtPnB2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkbV9saXN0X2FkZChhbGxfcHZzLCAmcHZsMi0+bGlzdCk7CisgIG5leHRfcHY6CisJCTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2ZyZWVfcHZfbGlzdChzdHJ1Y3QgZG1fbGlzdCAqYWxsX3B2cykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgYWxsX3B2cykKKwkJcHZsLT5wdi0+ZmlkLT5mbXQtPm9wcy0+ZGVzdHJveV9pbnN0YW5jZShwdmwtPnB2LT5maWQpOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveV9maWQoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqKmZpZCkKK3sKKwlpZiAoKmZpZCkgeworCQkoKmZpZCktPmZtdC0+b3BzLT5kZXN0cm95X2luc3RhbmNlKCpmaWQpOworCQkqZmlkID0gTlVMTDsKKwl9Cit9CisKK2ludCB2Z19taXNzaW5nX3B2X2NvdW50KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKGlzX21pc3NpbmdfcHYocHZsLT5wdikpCisJCQkrKyByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX3JlYXBwZWFyZWRfcHYoc3RydWN0IHZvbHVtZV9ncm91cCAqY29ycmVjdF92ZywKKwkJCQlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IGFjdCkKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWludCBydiA9IDA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2tpcCB0aGVzZSBjaGVja3MgaW4gY2FzZSB0aGUgdG9vbCBpcyBnb2luZyB0byBkZWFsIHdpdGggbWlzc2luZworICAgICAgICAgKiBQVnMsIGVzcGVjaWFsbHkgc2luY2UgdGhlIHJlc3VsdGluZyBtZXNzYWdlcyBjYW4gYmUgcHJldHR5CisgICAgICAgICAqIGNvbmZ1c2luZy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChjb3JyZWN0X3ZnLT5jbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMpCisgICAgICAgICAgICByZXR1cm4gcnY7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmY29ycmVjdF92Zy0+cHZzKQorCQlpZiAocHYtPmRldiA9PSBwdmwtPnB2LT5kZXYgJiYgaXNfbWlzc2luZ19wdihwdmwtPnB2KSkgeworCQkJaWYgKGFjdCkKKwkJCQlsb2dfd2FybigiV0FSTklORzogTWlzc2luZyBkZXZpY2UgJXMgcmVhcHBlYXJlZCwgdXBkYXRpbmcgIgorCQkJCQkgIm1ldGFkYXRhIGZvciBWRyAlcyB0byB2ZXJzaW9uICV1LiIsCisJCQkJCSBwdl9kZXZfbmFtZShwdmwtPnB2KSwgIHB2X3ZnX25hbWUocHZsLT5wdiksIAorCQkJCQkgY29ycmVjdF92Zy0+c2Vxbm8pOworCQkJaWYgKHB2bC0+cHYtPnBlX2FsbG9jX2NvdW50ID09IDApIHsKKwkJCQlpZiAoYWN0KSB7CisJCQkJCXB2LT5zdGF0dXMgJj0gfk1JU1NJTkdfUFY7CisJCQkJCXB2bC0+cHYtPnN0YXR1cyAmPSB+TUlTU0lOR19QVjsKKwkJCQl9CisJCQkJKysgcnY7CisJCQl9IGVsc2UgaWYgKGFjdCkKKwkJCQlsb2dfd2FybigiV0FSTklORzogRGV2aWNlICVzIHN0aWxsIG1hcmtlZCBtaXNzaW5nIGJlY2F1c2Ugb2YgYWxsb2NhdGVkIGRhdGEgIgorCQkJCQkgIm9uIGl0LCByZW1vdmUgdm9sdW1lcyBhbmQgY29uc2lkZXIgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nLiIsCisJCQkJCSBwdl9kZXZfbmFtZShwdmwtPnB2KSk7CisJCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBfaXNfZm9yZWlnbl92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gdmctPmNtZC0+c3lzdGVtX2lkICYmIHN0cmNtcCh2Zy0+c3lzdGVtX2lkLCB2Zy0+Y21kLT5zeXN0ZW1faWQpOworfQorCitzdGF0aWMgaW50IF9yZXBhaXJfaW5jb25zaXN0ZW50X3ZnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXVuc2lnbmVkIHNhdmVkX2hhbmRsZXNfbWlzc2luZ19wdnMgPSB2Zy0+Y21kLT5oYW5kbGVzX21pc3NpbmdfcHZzOworCisJaWYgKGx2bWNhY2hlX2ZvdW5kX2R1cGxpY2F0ZV9wdnMoKSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlNraXAgbWV0YWRhdGEgcmVwYWlyIHdpdGggZHVwbGljYXRlcy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2Fubm90IHdyaXRlIGZvcmVpZ24gVkdzLCB0aGUgb3duZXIgd2lsbCByZXBhaXIgaXQuICovCisJaWYgKF9pc19mb3JlaWduX3ZnKHZnKSkgeworCQlsb2dfdmVyYm9zZSgiU2tpcCBtZXRhZGF0YSByZXBhaXIgZm9yIGZvcmVpZ24gVkcuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEZJWE1FOiBkbyB0aGlzIGF0IGhpZ2hlciBsZXZlbCB3aGVyZSBsdm1sb2NrZCBsb2NrIGNhbiBiZSBjaGFuZ2VkLiAqLworCWlmIChpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKSB7CisJCWxvZ192ZXJib3NlKCJTa2lwIG1ldGFkYXRhIHJlcGFpciBmb3Igc2hhcmVkIFZHLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfd2FybigiV0FSTklORzogSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAlcyAtIHVwZGF0aW5nIHRvIHVzZSB2ZXJzaW9uICV1IiwgdmctPm5hbWUsIHZnLT5zZXFubyk7CisKKwl2Zy0+Y21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKwlpZiAoIXZnX3dyaXRlKHZnKSkgeworCQlsb2dfZXJyb3IoIkF1dG9tYXRpYyBtZXRhZGF0YSBjb3JyZWN0aW9uIGZhaWxlZCIpOworCQl2Zy0+Y21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gc2F2ZWRfaGFuZGxlc19taXNzaW5nX3B2czsKKwkJcmV0dXJuIDA7CisJfQorCisJdmctPmNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IHNhdmVkX2hhbmRsZXNfbWlzc2luZ19wdnM7CisKKwlpZiAoIXZnX2NvbW1pdCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBdXRvbWF0aWMgbWV0YWRhdGEgY29ycmVjdGlvbiBjb21taXQgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93aXBlX291dGRhdGVkX3B2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9saXN0ICp0b19jaGVjaykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqcHZsMjsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCWlmIChsdm1jYWNoZV9mb3VuZF9kdXBsaWNhdGVfcHZzKCkpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJTa2lwIHdpcGluZyBvdXRkYXRlZCBQVnMgd2l0aCBkdXBsaWNhdGVzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENhbm5vdCB3cml0ZSBmb3JlaWduIFZHcywgdGhlIG93bmVyIHdpbGwgcmVwYWlyIGl0LgorCSAqIEFsc28sIGlmIGFub3RoZXIgaG9zdCBpcyB1cGRhdGluZyBpdHMgVkcsIHdlIG1heSByZWFkCisJICogdGhlIFBWcyB3aGlsZSBzb21lIGFyZSB3cml0dGVuIGJ1dCBub3Qgb3RoZXJzLCBtYWtpbmcKKwkgKiBzb21lIFBWcyBsb29rIG91dGRhdGVkIHRvIHVzIGp1c3QgYmVjYXVzZSB3ZSdyZSByZWFkaW5nCisJICogdGhlIFZHIHdoaWxlIGl0J3Mgb25seSBwYXJ0aWFsbHkgd3JpdHRlbiBvdXQuCisJICovCisJaWYgKF9pc19mb3JlaWduX3ZnKHZnKSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlNraXAgd2lwaW5nIG91dGRhdGVkIFBWcyBmb3IgZm9yZWlnbiBWRy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGSVhNRTogZG8gdGhpcyBhdCBoaWdoZXIgbGV2ZWwgd2hlcmUgbHZtbG9ja2QgbG9jayBjYW4gYmUgY2hhbmdlZC4KKwkgKiBBbHNvIGlmIHdlJ3JlIHJlYWRpbmcgdGhlIFZHIHdpdGggdGhlIC0tc2hhcmVkIG9wdGlvbiAobm90IHVzaW5nCisJICogbHZtbG9ja2QpLCB3ZSBjYW4gc2VlIGEgVkcgd2hpbGUgaXQncyBiZWluZyB3cml0dGVuIGJ5IGFub3RoZXIKKwkgKiBob3N0LCBzYW1lIGFzIHRoZSBmb3JlaWduIFZHIGNhc2UuCisJICovCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJTa2lwIHdpcGluZyBvdXRkYXRlZCBQVnMgZm9yIHNoYXJlZCBWRy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgdG9fY2hlY2spIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bDIsICZ2Zy0+cHZzKSB7CisJCQlpZiAocHZsLT5wdi0+ZGV2ID09IHB2bDItPnB2LT5kZXYpCisJCQkJZ290byBuZXh0X3B2OworCQl9CisJCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdmwtPnB2LT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJCXJldHVybl8wOworCQlsb2dfd2FybigiV0FSTklORzogUmVtb3ZpbmcgUFYgJXMgKCVzKSB0aGF0IG5vIGxvbmdlciBiZWxvbmdzIHRvIFZHICVzIiwKKwkJCSBwdl9kZXZfbmFtZShwdmwtPnB2KSwgdXVpZCwgdmctPm5hbWUpOworCQlpZiAoIXB2X3dyaXRlX29ycGhhbihjbWQsIHB2bC0+cHYpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogUmVmcmVzaCBtZXRhZGF0YSBhZnRlciBvcnBoYW4gd3JpdGUgKi8KKwkJaWYgKCFkcm9wX2NhY2hlZF9tZXRhZGF0YSh2ZykpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRyb3AgY2FjaGVkIG1ldGFkYXRhIGZvciBWRyAlcyB3aGlsZSB3aXBpbmcgb3V0ZGF0ZWQgUFZzLiIsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CituZXh0X3B2OgorCQk7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja19vcl9yZXBhaXJfcHZfZXh0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgIGludCByZXBhaXIsIGludCAqaW5jb25zaXN0ZW50X3B2cykKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwl1aW50MzJfdCBleHRfdmVyc2lvbiwgZXh0X2ZsYWdzOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJdW5zaWduZWQgcHZzX2ZpeGVkID0gMDsKKwlpbnQgciA9IDA7CisKKwkqaW5jb25zaXN0ZW50X3B2cyA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQkvKiBNaXNzaW5nIFBWIC0gbm90aGluZyB0byBkby4gKi8KKwkJaWYgKGlzX21pc3NpbmdfcHYocHZsLT5wdikpCisJCQljb250aW51ZTsKKworCQlpZiAoIShpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQocHZsLT5wdi0+ZGV2LT5wdmlkLCBwdmwtPnB2LT5kZXYsIDApKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBjYWNoZWQgaW5mbyBmb3IgUFYgJXMuIiwgcHZfZGV2X25hbWUocHZsLT5wdikpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlleHRfdmVyc2lvbiA9IGx2bWNhY2hlX2V4dF92ZXJzaW9uKGluZm8pOworCQlpZiAoZXh0X3ZlcnNpb24gPCAyKQorCQkJY29udGludWU7CisKKwkJZXh0X2ZsYWdzID0gbHZtY2FjaGVfZXh0X2ZsYWdzKGluZm8pOworCQlpZiAoIShleHRfZmxhZ3MgJiBQVl9FWFRfVVNFRCkpIHsKKwkJCWlmICghcmVwYWlyKSB7CisJCQkJKmluY29uc2lzdGVudF9wdnMgPSAxOworCQkJCS8qIHdlJ3JlIG5vdCByZXBhaXJpbmcgbm93LCBzbyBubyBuZWVkIHRvCisJCQkJICogY2hlY2sgZnVydGhlciBQVnMgLSBpbmNvbnNpc3RlbnRfcHZzIGlzIGFscmVhZHkKKwkJCQkgKiBzZXQgYW5kIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSByZXBhaXIgbmV4dCB0aW1lICovCisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWlmIChfaXNfZm9yZWlnbl92Zyh2ZykpIHsKKwkJCQlsb2dfdmVyYm9zZSgiU2tpcCByZXBhaXIgb2YgUFYgJXMgdGhhdCBpcyBpbiBmb3JlaWduICIKKwkJCQkJICAgICJWRyAlcyBidXQgbm90IG1hcmtlZCBhcyB1c2VkLiIsCisJCQkJCSAgICBwdl9kZXZfbmFtZShwdmwtPnB2KSwgdmctPm5hbWUpOworCQkJCSppbmNvbnNpc3RlbnRfcHZzID0gMTsKKwkJCX0gZWxzZSBpZiAoaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkgeworCQkJCS8qCisJCQkJICogRklYTUU6IGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlcGFpciBmb3Igc2hhcmVkIFZHcy4KKwkJCQkgKi8KKwkJCQlsb2dfd2FybigiU2tpcCByZXBhaXIgb2YgUFYgJXMgdGhhdCBpcyBpbiBzaGFyZWQgIgorCQkJCQkgICAgIlZHICVzIGJ1dCBub3QgbWFya2VkIGFzIHVzZWQuIiwKKwkJCQkJICAgIHB2X2Rldl9uYW1lKHB2bC0+cHYpLCB2Zy0+bmFtZSk7CisJCQkJKmluY29uc2lzdGVudF9wdnMgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfd2FybigiV0FSTklORzogUmVwYWlyaW5nIFBoeXNpY2FsIFZvbHVtZSAlcyB0aGF0IGlzICIKKwkJCQkJICJpbiBWb2x1bWUgR3JvdXAgJXMgYnV0IG5vdCBtYXJrZWQgYXMgdXNlZC4iLAorCQkJCQkgIHB2X2Rldl9uYW1lKHB2bC0+cHYpLCB2Zy0+bmFtZSk7CisKKwkJCQkvKiBwdiB3cml0ZSB3aWxsIHNldCBjb3JyZWN0IGV4dF9mbGFncyAqLworCQkJCWlmICghcHZfd3JpdGUoY21kLCBwdmwtPnB2LCAxKSkgeworCQkJCQkqaW5jb25zaXN0ZW50X3B2cyA9IDE7CisJCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlcGFpciBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiLiIsCisJCQkJCQkgIHB2X2Rldl9uYW1lKHB2bC0+cHYpKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXB2c19maXhlZCsrOworCQkJfQorCQl9CisJfQorCisJciA9IDE7CitvdXQ6CisJaWYgKChwdnNfZml4ZWQgPiAwKSAmJiAhX3JlcGFpcl9pbmNvbnNpc3RlbnRfdmcodmcpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiByOworfQorCisvKiBDYWxsZXIgc2V0cyBjb25zaXN0ZW50IHRvIDEgaWYgaXQncyBzYWZlIGZvciB2Z19yZWFkX2ludGVybmFsIHRvIGNvcnJlY3QKKyAqIGluY29uc2lzdGVudCBtZXRhZGF0YSBvbiBkaXNrIChpLmUuIHRoZSBWRyB3cml0ZSBsb2NrIGlzIGhlbGQpLgorICogVGhpcyBndWFyYW50ZWVzIG9ubHkgY29uc2lzdGVudCBtZXRhZGF0YSBpcyByZXR1cm5lZC4KKyAqIElmIGNvbnNpc3RlbnQgaXMgMCwgY2FsbGVyIG11c3QgY2hlY2sgd2hldGhlciBjb25zaXN0ZW50ID09IDEgb24gcmV0dXJuCisgKiBhbmQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXNuJ3QgKGUuZy4gYWJvcnQ7IGdldCB3cml0ZSBsb2NrCisgKiBhbmQgY2FsbCB2Z19yZWFkX2ludGVybmFsIGFnYWluKS4KKyAqCisgKiBJZiBwcmVjb21taXR0ZWQgaXMgc2V0LCB1c2UgcHJlY29tbWl0dGVkIG1ldGFkYXRhIGlmIHByZXNlbnQuCisgKgorICogRWl0aGVyIG9mIHZnbmFtZSBvciB2Z2lkIG1heSBiZSBOVUxMLgorICoKKyAqIE5vdGU6IHZnaW5mbyBzdHJ1Y3RzIG11c3Qgbm90IGJlIGhlbGQgb3IgdXNlZCBhcyBwYXJhbWV0ZXJzCisgKiAgICAgICBhY3Jvc3MgdGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19yZWFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgY29uc3QgY2hhciAqdmduYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqdmdpZCwKKwkJCQkgICAgIHVpbnQzMl90IHdhcm5fZmxhZ3MsIAorCQkJCSAgICAgaW50ICpjb25zaXN0ZW50LCB1bnNpZ25lZCBwcmVjb21taXR0ZWQpCit7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkID0gTlVMTDsKKwlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCBmaWM7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsICpjb3JyZWN0X3ZnID0gTlVMTDsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWludCBpbmNvbnNpc3RlbnQgPSAwOworCWludCBpbmNvbnNpc3RlbnRfdmdpZCA9IDA7CisJaW50IGluY29uc2lzdGVudF9wdnMgPSAwOworCWludCBpbmNvbnNpc3RlbnRfbWRhcyA9IDA7CisJaW50IGluY29uc2lzdGVudF9tZGFfY291bnQgPSAwOworCWludCBzdHJpcF9oaXN0b3JpY2FsX2x2cyA9ICpjb25zaXN0ZW50OworCWludCB1cGRhdGVfb2xkX3B2X2V4dCA9ICpjb25zaXN0ZW50OworCXVuc2lnbmVkIHVzZV9wcmVjb21taXR0ZWQgPSBwcmVjb21taXR0ZWQ7CisJc3RydWN0IGRtX2xpc3QgKnB2aWRzOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGRtX2xpc3QgYWxsX3B2czsKKwl1bnNpZ25lZCBzZXFubyA9IDA7CisJaW50IHJlYXBwZWFyZWQgPSAwOworCXN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqdmdfZm10ZGF0YSA9IE5VTEw7CS8qIEFkZGl0aW9uYWwgZm9ybWF0LXNwZWNpZmljIGRhdGEgYWJvdXQgdGhlIHZnICovCisJdW5zaWduZWQgdXNlX3ByZXZpb3VzX3ZnOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiUmVhZGluZyBWRyAlcyAlLjMycyIsIHZnbmFtZSA/OiAiPG5vIG5hbWU+IiwgdmdpZCA/OiAiPG5vIHZnaWQ+Iik7CisKKwlpZiAoaXNfb3JwaGFuX3ZnKHZnbmFtZSkpIHsKKwkJaWYgKHVzZV9wcmVjb21taXR0ZWQpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAidmdfcmVhZF9pbnRlcm5hbCByZXF1aXJlcyB2Z25hbWUgIgorCQkJCSAgIndpdGggcHJlLWNvbW1pdC4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBfdmdfcmVhZF9vcnBoYW5zKGNtZCwgd2Fybl9mbGFncywgdmduYW1lLCBjb25zaXN0ZW50KTsKKwl9CisKKwlpZiAobHZtZXRhZF91c2VkKCkgJiYgIXVzZV9wcmVjb21taXR0ZWQpIHsKKwkJaWYgKChjb3JyZWN0X3ZnID0gbHZtY2FjaGVfZ2V0X3ZnKGNtZCwgdmduYW1lLCB2Z2lkLCBwcmVjb21taXR0ZWQpKSkgeworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJmNvcnJlY3RfdmctPnB2cykKKwkJCQlpZiAocHZsLT5wdi0+ZGV2KQorCQkJCQlyZWFwcGVhcmVkICs9IF9jaGVja19yZWFwcGVhcmVkX3B2KGNvcnJlY3RfdmcsIHB2bC0+cHYsICpjb25zaXN0ZW50KTsKKwkJCWlmIChyZWFwcGVhcmVkICYmICpjb25zaXN0ZW50KQorCQkJCSpjb25zaXN0ZW50ID0gX3JlcGFpcl9pbmNvbnNpc3RlbnRfdmcoY29ycmVjdF92Zyk7CisJCQllbHNlCisJCQkJKmNvbnNpc3RlbnQgPSAhcmVhcHBlYXJlZDsKKwkJCWlmIChfd2lwZV9vdXRkYXRlZF9wdnMoY21kLCBjb3JyZWN0X3ZnLCAmY29ycmVjdF92Zy0+cHZzX291dGRhdGVkKSkgeworCQkJCS8qIGNsZWFyIHRoZSBsaXN0ICovCisJCQkJZG1fbGlzdF9pbml0KCZjb3JyZWN0X3ZnLT5wdnNfb3V0ZGF0ZWQpOworCQkJCWx2bWV0YWRfdmdfY2xlYXJfb3V0ZGF0ZWRfcHZzKGNvcnJlY3RfdmcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKworCQlpZiAoY29ycmVjdF92ZykgeworCQkJaWYgKHVwZGF0ZV9vbGRfcHZfZXh0ICYmICFfdmdfdXBkYXRlX29sZF9wdl9leHRfaWZfbmVlZGVkKGNvcnJlY3RfdmcpKSB7CisJCQkJcmVsZWFzZV92Zyhjb3JyZWN0X3ZnKTsKKwkJCQlyZXR1cm5fTlVMTDsKKwkJCX0KKworCQkJaWYgKHN0cmlwX2hpc3RvcmljYWxfbHZzICYmICF2Z19zdHJpcF9vdXRkYXRlZF9oaXN0b3JpY2FsX2x2cyhjb3JyZWN0X3ZnKSkgeworCQkJCXJlbGVhc2VfdmcoY29ycmVjdF92Zyk7CisJCQkJcmV0dXJuX05VTEw7CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29ycmVjdF92ZzsKKwl9CisKKwkvKgorCSAqIElmIGNhY2hlZCBtZXRhZGF0YSB3YXMgaW5jb25zaXN0ZW50IGFuZCAqY29uc2lzdGVudCBpcyBzZXQKKwkgKiB0aGVuIHJlcGFpciBpdCBub3cuICBPdGhlcndpc2UganVzdCByZXR1cm4gaXQuCisJICogQWxzbyByZXR1cm4gaWYgdXNlX3ByZWNvbW1pdHRlZCBpcyBzZXQgZHVlIHRvIHRoZSBGSVhNRSBpbgorCSAqIHRoZSBtaXNzaW5nIFBWIGxvZ2ljIGJlbG93LgorCSAqLworCWlmICgoY29ycmVjdF92ZyA9IGx2bWNhY2hlX2dldF92ZyhjbWQsIHZnbmFtZSwgdmdpZCwgcHJlY29tbWl0dGVkKSkgJiYKKwkgICAgKHVzZV9wcmVjb21taXR0ZWQgfHwgISpjb25zaXN0ZW50KSkgeworCQkqY29uc2lzdGVudCA9IDE7CisJCXJldHVybiBjb3JyZWN0X3ZnOworCX0gZWxzZSB7CisJCWlmIChjb3JyZWN0X3ZnICYmIGNvcnJlY3RfdmctPnNlcW5vID4gc2Vxbm8pCisJCQlzZXFubyA9IGNvcnJlY3RfdmctPnNlcW5vOworCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQljb3JyZWN0X3ZnID0gTlVMTDsKKwl9CisKKworCS8qIEZpbmQgdGhlIHZnbmFtZSBpbiB0aGUgY2FjaGUgKi8KKwkvKiBJZiBpdCdzIG5vdCB0aGVyZSB3ZSBtdXN0IGRvIGZ1bGwgc2NhbiB0byBiZSBjb21wbGV0ZWx5IHN1cmUgKi8KKwlpZiAoIShmbXQgPSBsdm1jYWNoZV9mbXRfZnJvbV92Z25hbWUoY21kLCB2Z25hbWUsIHZnaWQsIDEpKSkgeworCQlsdm1jYWNoZV9sYWJlbF9zY2FuKGNtZCk7CisJCWlmICghKGZtdCA9IGx2bWNhY2hlX2ZtdF9mcm9tX3ZnbmFtZShjbWQsIHZnbmFtZSwgdmdpZCwgMSkpKSB7CisJCQkvKiBJbmRlcGVuZGVudCBNREFzIGFyZW4ndCBzdXBwb3J0ZWQgdW5kZXIgbG93IG1lbW9yeSAqLworCQkJaWYgKCFjbWQtPmluZGVwZW5kZW50X21ldGFkYXRhX2FyZWFzICYmIGNyaXRpY2FsX3NlY3Rpb24oKSkKKwkJCQlyZXR1cm5fTlVMTDsKKwkJCWx2bWNhY2hlX2ZvcmNlX25leHRfbGFiZWxfc2NhbigpOworCQkJbHZtY2FjaGVfbGFiZWxfc2NhbihjbWQpOworCQkJaWYgKCEoZm10ID0gbHZtY2FjaGVfZm10X2Zyb21fdmduYW1lKGNtZCwgdmduYW1lLCB2Z2lkLCAwKSkpCisJCQkJcmV0dXJuX05VTEw7CisJCX0KKwl9CisKKwkvKiBOb3cgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZnbmFtZSBpZiBub25lIHdhcyBzdXBwbGllZCAqLworCWlmICghdmduYW1lICYmICEodmduYW1lID0gbHZtY2FjaGVfdmduYW1lX2Zyb21fdmdpZChjbWQtPm1lbSwgdmdpZCkpKSB7CisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ2FjaGUgZGlkIG5vdCBmaW5kIFZHIG5hbWUgZnJvbSB2Z2lkICUuMzJzIiwgdmdpZCk7CisJCXJldHVybl9OVUxMOworCX0KKworCS8qIERldGVybWluZSB0aGUgY29ycmVjdCB2Z2lkIGlmIG5vbmUgd2FzIHN1cHBsaWVkICovCisJaWYgKCF2Z2lkICYmICEodmdpZCA9IGx2bWNhY2hlX3ZnaWRfZnJvbV92Z25hbWUoY21kLCB2Z25hbWUpKSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIkNhY2hlIGRpZCBub3QgZmluZCBWRyB2Z2lkIGZyb20gbmFtZSAlcyIsIHZnbmFtZSk7CisJCXJldHVybl9OVUxMOworCX0KKworCWlmICh1c2VfcHJlY29tbWl0dGVkICYmICEoZm10LT5mZWF0dXJlcyAmIEZNVF9QUkVDT01NSVQpKQorCQl1c2VfcHJlY29tbWl0dGVkID0gMDsKKworCS8qIGNyZWF0ZSBmb3JtYXQgaW5zdGFuY2Ugd2l0aCBhcHByb3ByaWF0ZSBtZXRhZGF0YSBhcmVhICovCisJZmljLnR5cGUgPSBGTVRfSU5TVEFOQ0VfTURBUyB8IEZNVF9JTlNUQU5DRV9BVVhfTURBUzsKKwlmaWMuY29udGV4dC52Z19yZWYudmdfbmFtZSA9IHZnbmFtZTsKKwlmaWMuY29udGV4dC52Z19yZWYudmdfaWQgPSB2Z2lkOworCWlmICghKGZpZCA9IGZtdC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoZm10LCAmZmljKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGZvcm1hdCBpbnN0YW5jZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTdG9yZSBwdmlkcyBmb3IgbGF0ZXIgc28gd2UgY2FuIGNoZWNrIGlmIGFueSBhcmUgbWlzc2luZyAqLworCWlmICghKHB2aWRzID0gbHZtY2FjaGVfZ2V0X3B2aWRzKGNtZCwgdmduYW1lLCB2Z2lkKSkpIHsKKwkJX2Rlc3Ryb3lfZmlkKCZmaWQpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwkvKgorCSAqIFdlIHVzZSB0aGUgZmlkIGdsb2JhbGx5IGhlcmUgc28gcHJldmVudCB0aGUgcmVsZWFzZV92ZworCSAqIGNhbGwgdG8gZGVzdHJveSB0aGUgZmlkIC0gd2UgbWF5IHdhbnQgdG8gcmV1c2UgaXQhCisJICovCisJZmlkLT5yZWZfY291bnQrKzsKKwkvKiBFbnN1cmUgY29udGVudHMgb2YgYWxsIG1ldGFkYXRhIGFyZWFzIG1hdGNoIC0gZWxzZSBkbyByZWNvdmVyeSAqLworCWluY29uc2lzdGVudF9tZGFfY291bnQ9MDsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpIHsKKwkJdXNlX3ByZXZpb3VzX3ZnID0gMDsKKworCQlpZiAoKHVzZV9wcmVjb21taXR0ZWQgJiYKKwkJICAgICAhKHZnID0gbWRhLT5vcHMtPnZnX3JlYWRfcHJlY29tbWl0KGZpZCwgdmduYW1lLCBtZGEsICZ2Z19mbXRkYXRhLCAmdXNlX3ByZXZpb3VzX3ZnKSkgJiYgIXVzZV9wcmV2aW91c192ZykgfHwKKwkJICAgICghdXNlX3ByZWNvbW1pdHRlZCAmJgorCQkgICAgICEodmcgPSBtZGEtPm9wcy0+dmdfcmVhZChmaWQsIHZnbmFtZSwgbWRhLCAmdmdfZm10ZGF0YSwgJnVzZV9wcmV2aW91c192ZywgMCkpICYmICF1c2VfcHJldmlvdXNfdmcpKSB7CisJCQlpbmNvbnNpc3RlbnQgPSAxOworCQkJdmdfZm10ZGF0YSA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFVzZSBwcmV2aW91cyBWRyBiZWNhdXNlIGNoZWNrc3VtIG1hdGNoZXMgKi8KKwkJaWYgKCF2ZykgeworCQkJdmcgPSBjb3JyZWN0X3ZnOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWNvcnJlY3RfdmcpIHsKKwkJCWNvcnJlY3RfdmcgPSB2ZzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRklYTUUgQWxzbyBlbnN1cmUgY29udGVudHMgc2FtZSAtIGNoZWNrc3VtIGNvbXBhcmU/ICovCisJCWlmIChjb3JyZWN0X3ZnLT5zZXFubyAhPSB2Zy0+c2Vxbm8pIHsKKwkJCWlmIChjbWQtPm1ldGFkYXRhX3JlYWRfb25seSkKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCJOb3QgcmVwYWlyaW5nIFZHICVzIG1ldGFkYXRhIHNlcW5vICglZCAhPSAlZCkgIgorCQkJCQkJICAiYXMgZ2xvYmFsL21ldGFkYXRhX3JlYWRfb25seSBpcyBzZXQuIiwKKwkJCQkJCSAgdmduYW1lLCB2Zy0+c2Vxbm8sIGNvcnJlY3RfdmctPnNlcW5vKTsKKwkJCWVsc2UKKwkJCQlpbmNvbnNpc3RlbnQgPSAxOworCisJCQlpZiAodmctPnNlcW5vID4gY29ycmVjdF92Zy0+c2Vxbm8pIHsKKwkJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJCWNvcnJlY3RfdmcgPSB2ZzsKKwkJCX0gZWxzZSB7CisJCQkJbWRhLT5zdGF0dXMgfD0gTURBX0lOQ09OU0lTVEVOVDsKKwkJCQkrK2luY29uc2lzdGVudF9tZGFfY291bnQ7CisJCQl9CisJCX0KKworCQlpZiAodmcgIT0gY29ycmVjdF92ZykgeworCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQl2Z19mbXRkYXRhID0gTlVMTDsKKwkJfQorCX0KKwlmaWQtPnJlZl9jb3VudC0tOworCisJLyogRW5zdXJlIGV2ZXJ5IFBWIGluIHRoZSBWRyB3YXMgaW4gdGhlIGNhY2hlICovCisJaWYgKGNvcnJlY3RfdmcpIHsKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBzZXFubyBmcm9tIHRoZSBjYWNoZSwgZm9yIHRoZSBiZW5lZml0IG9mCisJCSAqIHJldHJvLXN0eWxlIG1ldGFkYXRhIGZvcm1hdHMgbGlrZSBMVk0xLgorCQkgKi8KKwkJLy8gY29ycmVjdF92Zy0+c2Vxbm8gPSBzZXFubyA+IGNvcnJlY3RfdmctPnNlcW5vID8gc2Vxbm8gOiBjb3JyZWN0X3ZnLT5zZXFubzsKKworCQkvKgorCQkgKiBJZiB0aGUgVkcgaGFzIFBWcyB3aXRob3V0IG1kYXMsIG9yIGlnbm9yZWQgbWRhcywgdGhleSBtYXkKKwkJICogc3RpbGwgYmUgb3JwaGFucyBpbiB0aGUgY2FjaGU6IHVwZGF0ZSB0aGUgY2FjaGUgc3RhdGUgaGVyZSwKKwkJICogYW5kIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGlzdHMgaW4gdGhlIHZnLgorCQkgKi8KKwkJaWYgKCFpbmNvbnNpc3RlbnQgJiYKKwkJICAgIGRtX2xpc3Rfc2l6ZSgmY29ycmVjdF92Zy0+cHZzKSA+IGRtX2xpc3Rfc2l6ZShwdmlkcykpIHsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZjb3JyZWN0X3ZnLT5wdnMpIHsKKwkJCQlpZiAoIXB2bC0+cHYtPmRldikgeworCQkJCQlpbmNvbnNpc3RlbnRfcHZzID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHN0cl9saXN0X21hdGNoX2l0ZW0ocHZpZHMsIHB2bC0+cHYtPmRldi0+cHZpZCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyoKKwkJCQkgKiBQViBub3QgbWFya2VkIGFzIGJlbG9uZ2luZyB0byB0aGlzIFZHIGluIGNhY2hlLgorCQkJCSAqIENoZWNrIGl0J3MgYW4gb3JwaGFuIHdpdGhvdXQgbWV0YWRhdGEgYXJlYQorCQkJCSAqIG5vdCBpZ25vcmVkLgorCQkJCSAqLworCQkJCWlmICghKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmwtPnB2LT5kZXYtPnB2aWQsIHB2bC0+cHYtPmRldiwgMSkpIHx8CisJCQkJICAgICFsdm1jYWNoZV9pc19vcnBoYW4oaW5mbykpIHsKKwkJCQkJaW5jb25zaXN0ZW50X3B2cyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChsdm1jYWNoZV9tZGFfY291bnQoaW5mbykpIHsKKwkJCQkJaWYgKCFsdm1jYWNoZV9maWRfYWRkX21kYXNfcHYoaW5mbywgZmlkKSkgeworCQkJCQkJcmVsZWFzZV92Zyhjb3JyZWN0X3ZnKTsKKwkJCQkJCXJldHVybl9OVUxMOworCQkJCQl9CisKKwkJCQkJbG9nX2RlYnVnX21ldGFkYXRhKCJFbXB0eSBtZGEgZm91bmQgZm9yIFZHICVzLiIsIHZnbmFtZSk7CisKKwkJCQkJaWYgKGluY29uc2lzdGVudF9tZGFzKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyoKKwkJCQkJICogSWYgYW55IG5ld2x5LWFkZGVkIG1kYXMgYXJlIGluLXVzZSB0aGVuIHRoZWlyCisJCQkJCSAqIG1ldGFkYXRhIG5lZWRzIHVwZGF0aW5nLgorCQkJCQkgKi8KKwkJCQkJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX2NoZWNrX21kYV9pbl91c2UsCisJCQkJCQkJICAgICAmaW5jb25zaXN0ZW50X21kYXMpOworCQkJCX0KKwkJCX0KKworCQkJLyogSWYgdGhlIGNoZWNrIHBhc3NlZCwgbGV0J3MgdXBkYXRlIFZHIGFuZCByZWNhbGN1bGF0ZSBwdmlkcyAqLworCQkJaWYgKCFpbmNvbnNpc3RlbnRfcHZzKSB7CisJCQkJbG9nX2RlYnVnX21ldGFkYXRhKCJVcGRhdGluZyBjYWNoZSBmb3IgUFZzIHdpdGhvdXQgbWRhcyAiCisJCQkJCQkgICAiaW4gVkcgJXMuIiwgdmduYW1lKTsKKwkJCQkvKgorCQkJCSAqIElmIHRoZXJlIGlzIG5vIHByZWNvbW1pdHRlZCBtZXRhZGF0YSwgY29tbWl0dGVkIG1ldGFkYXRhCisJCQkJICogaXMgcmVhZCBhbmQgc3RvcmVkIGluIHRoZSBjYWNoZSBldmVuIGlmIHVzZV9wcmVjb21taXR0ZWQgaXMgc2V0CisJCQkJICovCisJCQkJbHZtY2FjaGVfdXBkYXRlX3ZnKGNvcnJlY3RfdmcsIGNvcnJlY3RfdmctPnN0YXR1cyAmIFBSRUNPTU1JVFRFRCk7CisKKwkJCQlpZiAoIShwdmlkcyA9IGx2bWNhY2hlX2dldF9wdmlkcyhjbWQsIHZnbmFtZSwgdmdpZCkpKSB7CisJCQkJCXJlbGVhc2VfdmcoY29ycmVjdF92Zyk7CisJCQkJCXJldHVybl9OVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZpZC0+cmVmX2NvdW50Kys7CisJCWlmIChkbV9saXN0X3NpemUoJmNvcnJlY3RfdmctPnB2cykgIT0KKwkJICAgIGRtX2xpc3Rfc2l6ZShwdmlkcykgKyB2Z19taXNzaW5nX3B2X2NvdW50KGNvcnJlY3RfdmcpKSB7CisJCQlsb2dfZGVidWdfbWV0YWRhdGEoIkNhY2hlZCBWRyAlcyBoYWQgaW5jb3JyZWN0IFBWIGxpc3QiLAorCQkJCQkgICB2Z25hbWUpOworCisJCQlpZiAoY3JpdGljYWxfc2VjdGlvbigpKQorCQkJCWluY29uc2lzdGVudCA9IDE7CisJCQllbHNlIHsKKwkJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJCWNvcnJlY3RfdmcgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJmNvcnJlY3RfdmctPnB2cykgeworCQkJaWYgKGlzX21pc3NpbmdfcHYocHZsLT5wdikpCisJCQkJY29udGludWU7CisJCQlpZiAoIXN0cl9saXN0X21hdGNoX2l0ZW0ocHZpZHMsIHB2bC0+cHYtPmRldi0+cHZpZCkpIHsKKwkJCQlsb2dfZGVidWdfbWV0YWRhdGEoIkNhY2hlZCBWRyAlcyBoYWQgaW5jb3JyZWN0IFBWIGxpc3QiLAorCQkJCQkJICAgdmduYW1lKTsKKwkJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJCWNvcnJlY3RfdmcgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGNvcnJlY3RfdmcgJiYgaW5jb25zaXN0ZW50X21kYXMpIHsKKwkJCXJlbGVhc2VfdmcoY29ycmVjdF92Zyk7CisJCQljb3JyZWN0X3ZnID0gTlVMTDsKKwkJfQorCQlmaWQtPnJlZl9jb3VudC0tOworCX0KKworCWRtX2xpc3RfaW5pdCgmYWxsX3B2cyk7CisKKwkvKiBGYWlsZWQgdG8gZmluZCBWRyB3aGVyZSB3ZSBleHBlY3RlZCBpdCAtIGZ1bGwgc2NhbiBhbmQgcmV0cnkgKi8KKwlpZiAoIWNvcnJlY3RfdmcpIHsKKwkJLyoKKwkJICogRnJlZSBvdXRzdGFuZGluZyBmb3JtYXQgaW5zdGFuY2UgdGhhdCByZW1haW5lZCB1bmFzc2lnbmVkCisJCSAqIGZyb20gcHJldmlvdXMgc3RlcCB3aGVyZSB3ZSB0cmllZCB0byBnZXQgdGhlICJjb3JyZWN0X3ZnIiwKKwkJICogYnV0IHdlIGZhaWxlZCB0byBkbyBzbyAoc28gdGhlcmUncyBhIGRhbmdsaW5nIGZpZCBub3cpLgorCQkgKi8KKwkJX2Rlc3Ryb3lfZmlkKCZmaWQpOworCQl2Z19mbXRkYXRhID0gTlVMTDsKKworCQlpbmNvbnNpc3RlbnQgPSAwOworCisJCS8qIEluZGVwZW5kZW50IE1EQXMgYXJlbid0IHN1cHBvcnRlZCB1bmRlciBsb3cgbWVtb3J5ICovCisJCWlmICghY21kLT5pbmRlcGVuZGVudF9tZXRhZGF0YV9hcmVhcyAmJiBjcml0aWNhbF9zZWN0aW9uKCkpCisJCQlyZXR1cm5fTlVMTDsKKwkJbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKCk7CisJCWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKTsKKwkJaWYgKCEoZm10ID0gbHZtY2FjaGVfZm10X2Zyb21fdmduYW1lKGNtZCwgdmduYW1lLCB2Z2lkLCAwKSkpCisJCQlyZXR1cm5fTlVMTDsKKworCQlpZiAocHJlY29tbWl0dGVkICYmICEoZm10LT5mZWF0dXJlcyAmIEZNVF9QUkVDT01NSVQpKQorCQkJdXNlX3ByZWNvbW1pdHRlZCA9IDA7CisKKwkJLyogY3JlYXRlIGZvcm1hdCBpbnN0YW5jZSB3aXRoIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGFyZWEgKi8KKwkJZmljLnR5cGUgPSBGTVRfSU5TVEFOQ0VfTURBUyB8IEZNVF9JTlNUQU5DRV9BVVhfTURBUzsKKwkJZmljLmNvbnRleHQudmdfcmVmLnZnX25hbWUgPSB2Z25hbWU7CisJCWZpYy5jb250ZXh0LnZnX3JlZi52Z19pZCA9IHZnaWQ7CisJCWlmICghKGZpZCA9IGZtdC0+b3BzLT5jcmVhdGVfaW5zdGFuY2UoZm10LCAmZmljKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBmb3JtYXQgaW5zdGFuY2UiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyoKKwkJICogV2UgdXNlIHRoZSBmaWQgZ2xvYmFsbHkgaGVyZSBzbyBwcmV2ZW50IHRoZSByZWxlYXNlX3ZnCisJCSAqIGNhbGwgdG8gZGVzdHJveSB0aGUgZmlkIC0gd2UgbWF5IHdhbnQgdG8gcmV1c2UgaXQhCisJCSovCisJCWZpZC0+cmVmX2NvdW50Kys7CisJCS8qIEVuc3VyZSBjb250ZW50cyBvZiBhbGwgbWV0YWRhdGEgYXJlYXMgbWF0Y2ggLSBlbHNlIHJlY292ZXIgKi8KKwkJaW5jb25zaXN0ZW50X21kYV9jb3VudD0wOworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpIHsKKwkJCXVzZV9wcmV2aW91c192ZyA9IDA7CisKKwkJCWlmICgodXNlX3ByZWNvbW1pdHRlZCAmJgorCQkJICAgICAhKHZnID0gbWRhLT5vcHMtPnZnX3JlYWRfcHJlY29tbWl0KGZpZCwgdmduYW1lLCBtZGEsICZ2Z19mbXRkYXRhLCAmdXNlX3ByZXZpb3VzX3ZnKSkgJiYgIXVzZV9wcmV2aW91c192ZykgfHwKKwkJCSAgICAoIXVzZV9wcmVjb21taXR0ZWQgJiYKKwkJCSAgICAgISh2ZyA9IG1kYS0+b3BzLT52Z19yZWFkKGZpZCwgdmduYW1lLCBtZGEsICZ2Z19mbXRkYXRhLCAmdXNlX3ByZXZpb3VzX3ZnLCAwKSkgJiYgIXVzZV9wcmV2aW91c192ZykpIHsKKwkJCQlpbmNvbnNpc3RlbnQgPSAxOworCQkJCXZnX2ZtdGRhdGEgPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBVc2UgcHJldmlvdXMgVkcgYmVjYXVzZSBjaGVja3N1bSBtYXRjaGVzICovCisJCQlpZiAoIXZnKSB7CisJCQkJdmcgPSBjb3JyZWN0X3ZnOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWNvcnJlY3RfdmcpIHsKKwkJCQljb3JyZWN0X3ZnID0gdmc7CisJCQkJaWYgKCFfdXBkYXRlX3B2X2xpc3QoY21kLT5tZW0sICZhbGxfcHZzLCBjb3JyZWN0X3ZnKSkgeworCQkJCQlfZnJlZV9wdl9saXN0KCZhbGxfcHZzKTsKKwkJCQkJZmlkLT5yZWZfY291bnQtLTsKKwkJCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQkJCXJldHVybl9OVUxMOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFpZF9lcXVhbCgmdmctPmlkLCAmY29ycmVjdF92Zy0+aWQpKSB7CisJCQkJaW5jb25zaXN0ZW50ID0gMTsKKwkJCQlpbmNvbnNpc3RlbnRfdmdpZCA9IDE7CisJCQl9CisKKwkJCS8qIEZJWE1FIEFsc28gZW5zdXJlIGNvbnRlbnRzIHNhbWUgLSBjaGVja3N1bXMgc2FtZT8gKi8KKwkJCWlmIChjb3JyZWN0X3ZnLT5zZXFubyAhPSB2Zy0+c2Vxbm8pIHsKKwkJCQkvKiBJZ25vcmUgaW5jb25zaXN0ZW50IHNlcW5vIGlmIHRvbGQgdG8gc2tpcCByZXBhaXIgbG9naWMgKi8KKwkJCQlpZiAoY21kLT5tZXRhZGF0YV9yZWFkX29ubHkpCisJCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIk5vdCByZXBhaXJpbmcgVkcgJXMgbWV0YWRhdGEgc2Vxbm8gKCVkICE9ICVkKSAiCisJCQkJCQkJICAiYXMgZ2xvYmFsL21ldGFkYXRhX3JlYWRfb25seSBpcyBzZXQuIiwKKwkJCQkJCQkgIHZnbmFtZSwgdmctPnNlcW5vLCBjb3JyZWN0X3ZnLT5zZXFubyk7CisJCQkJZWxzZQorCQkJCQlpbmNvbnNpc3RlbnQgPSAxOworCisJCQkJaWYgKCFfdXBkYXRlX3B2X2xpc3QoY21kLT5tZW0sICZhbGxfcHZzLCB2ZykpIHsKKwkJCQkJX2ZyZWVfcHZfbGlzdCgmYWxsX3B2cyk7CisJCQkJCWZpZC0+cmVmX2NvdW50LS07CisJCQkJCXJlbGVhc2VfdmcodmcpOworCQkJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJCQlyZXR1cm5fTlVMTDsKKwkJCQl9CisJCQkJaWYgKHZnLT5zZXFubyA+IGNvcnJlY3RfdmctPnNlcW5vKSB7CisJCQkJCXJlbGVhc2VfdmcoY29ycmVjdF92Zyk7CisJCQkJCWNvcnJlY3RfdmcgPSB2ZzsKKwkJCQl9IGVsc2UgeworCQkJCQltZGEtPnN0YXR1cyB8PSBNREFfSU5DT05TSVNURU5UOworCQkJCQkrK2luY29uc2lzdGVudF9tZGFfY291bnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAodmcgIT0gY29ycmVjdF92ZykgeworCQkJCXJlbGVhc2VfdmcodmcpOworCQkJCXZnX2ZtdGRhdGEgPSBOVUxMOworCQkJfQorCQl9CisJCWZpZC0+cmVmX2NvdW50LS07CisKKwkJLyogR2l2ZSB1cCBsb29raW5nICovCisJCWlmICghY29ycmVjdF92ZykgeworCQkJX2ZyZWVfcHZfbGlzdCgmYWxsX3B2cyk7CisJCQlfZGVzdHJveV9maWQoJmZpZCk7CisJCQlyZXR1cm5fTlVMTDsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gcHJlY29tbWl0dGVkIG1ldGFkYXRhLCBjb21taXR0ZWQgbWV0YWRhdGEKKwkgKiBpcyByZWFkIGFuZCBzdG9yZWQgaW4gdGhlIGNhY2hlIGV2ZW4gaWYgdXNlX3ByZWNvbW1pdHRlZCBpcyBzZXQKKwkgKi8KKwlsdm1jYWNoZV91cGRhdGVfdmcoY29ycmVjdF92ZywgKGNvcnJlY3RfdmctPnN0YXR1cyAmIFBSRUNPTU1JVFRFRCkpOworCisJaWYgKGluY29uc2lzdGVudCkgeworCQkvKiBGSVhNRSBUZXN0IHNob3VsZCBiZSBpZiB3ZSdyZSAqdXNpbmcqIHByZWNvbW1pdHRlZCBtZXRhZGF0YSBub3QgaWYgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yIGl0ICovCisJCWlmICh1c2VfcHJlY29tbWl0dGVkKSB7CisJCQlsb2dfZXJyb3IoIkluY29uc2lzdGVudCBwcmUtY29tbWl0IG1ldGFkYXRhIGNvcGllcyAiCisJCQkJICAiZm9yIHZvbHVtZSBncm91cCAlcyIsIHZnbmFtZSk7CisKKwkJCS8qCisJCQkgKiBDaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgaW5jb25zaXN0ZW50IE1EQXMgd2VyZSBvbgorCQkJICogTUlTU0lORyBQVnMgLS0gaW4gdGhhdCBjYXNlLCB3ZSBzaG91bGQgYmUgc2FmZS4KKwkJCSAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgJmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKSB7CisJCQkJaWYgKG1kYS0+c3RhdHVzICYgTURBX0lOQ09OU0lTVEVOVCkgeworCQkJCQlsb2dfZGVidWdfbWV0YWRhdGEoIkNoZWNraW5nIGluY29uc2lzdGVudCBNREE6ICVzIiwgZGV2X25hbWUobWRhX2dldF9kZXZpY2UobWRhKSkpOworCQkJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmY29ycmVjdF92Zy0+cHZzKSB7CisJCQkJCQlpZiAobWRhX2dldF9kZXZpY2UobWRhKSA9PSBwdmwtPnB2LT5kZXYgJiYKKwkJCQkJCSAgICAocHZsLT5wdi0+c3RhdHVzICYgTUlTU0lOR19QVikpCisJCQkJCQkJLS1pbmNvbnNpc3RlbnRfbWRhX2NvdW50OworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5jb25zaXN0ZW50X21kYV9jb3VudCA8IDApCisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJUb28gbWFueSBpbmNvbnNpc3RlbnQgTURBcy4iKTsKKworCQkJaWYgKCFpbmNvbnNpc3RlbnRfbWRhX2NvdW50KSB7CisJCQkJKmNvbnNpc3RlbnQgPSAwOworCQkJCV9mcmVlX3B2X2xpc3QoJmFsbF9wdnMpOworCQkJCXJldHVybiBjb3JyZWN0X3ZnOworCQkJfQorCQkJX2ZyZWVfcHZfbGlzdCgmYWxsX3B2cyk7CisJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoISpjb25zaXN0ZW50KSB7CisJCQlfZnJlZV9wdl9saXN0KCZhbGxfcHZzKTsKKwkJCXJldHVybiBjb3JyZWN0X3ZnOworCQl9CisKKwkJLyogRG9uJ3QgdG91Y2ggaWYgdmdpZHMgZGlkbid0IG1hdGNoICovCisJCWlmIChpbmNvbnNpc3RlbnRfdmdpZCkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IEluY29uc2lzdGVudCBtZXRhZGF0YSBVVUlEcyBmb3VuZCBmb3IgIgorCQkJCSAidm9sdW1lIGdyb3VwICVzLiIsIHZnbmFtZSk7CisJCQkqY29uc2lzdGVudCA9IDA7CisJCQlfZnJlZV9wdl9saXN0KCZhbGxfcHZzKTsKKwkJCXJldHVybiBjb3JyZWN0X3ZnOworCQl9CisKKwkJLyoKKwkJICogSWYgUFYgaXMgbWFya2VkIG1pc3NpbmcgYnV0IHdlIGZvdW5kIGl0LAorCQkgKiB1cGRhdGUgbWV0YWRhdGEgYW5kIHJlbW92ZSBNSVNTSU5HIGZsYWcKKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZhbGxfcHZzKQorCQkJX2NoZWNrX3JlYXBwZWFyZWRfcHYoY29ycmVjdF92ZywgcHZsLT5wdiwgMSk7CisKKwkJaWYgKCFfcmVwYWlyX2luY29uc2lzdGVudF92Zyhjb3JyZWN0X3ZnKSkgeworCQkJX2ZyZWVfcHZfbGlzdCgmYWxsX3B2cyk7CisJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoIV93aXBlX291dGRhdGVkX3B2cyhjbWQsIGNvcnJlY3RfdmcsICZhbGxfcHZzKSkgeworCQkJX2ZyZWVfcHZfbGlzdCgmYWxsX3B2cyk7CisJCQlyZWxlYXNlX3ZnKGNvcnJlY3RfdmcpOworCQkJcmV0dXJuX05VTEw7CisJCX0KKwl9CisKKwlfZnJlZV9wdl9saXN0KCZhbGxfcHZzKTsKKworCWlmICh2Z19taXNzaW5nX3B2X2NvdW50KGNvcnJlY3RfdmcpKSB7CisJCWxvZ192ZXJib3NlKCJUaGVyZSBhcmUgJWQgcGh5c2ljYWwgdm9sdW1lcyBtaXNzaW5nLiIsCisJCQkgICAgdmdfbWlzc2luZ19wdl9jb3VudChjb3JyZWN0X3ZnKSk7CisJCXZnX21hcmtfcGFydGlhbF9sdnMoY29ycmVjdF92ZywgMSk7CisJfQorCisJaWYgKChjb3JyZWN0X3ZnLT5zdGF0dXMgJiBQVk1PVkUpICYmICFwdm1vdmVfbW9kZSgpKSB7CisJCWxvZ19lcnJvcigiSW50ZXJydXB0ZWQgcHZtb3ZlIGRldGVjdGVkIGluIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICBjb3JyZWN0X3ZnLT5uYW1lKTsKKwkJbG9nX3ByaW50KCJQbGVhc2UgcmVzdG9yZSB0aGUgbWV0YWRhdGEgYnkgcnVubmluZyB2Z2NmZ3Jlc3RvcmUuIik7CisJCXJlbGVhc2VfdmcoY29ycmVjdF92Zyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFdlIGhhdmUgdGhlIFZHIG5vdyBmaW5hbGx5LCBjaGVjayBpZiBQViBleHQgaW5mbyBpcyBpbiBzeW5jIHdpdGggVkcgbWV0YWRhdGEuICovCisJaWYgKCFfY2hlY2tfb3JfcmVwYWlyX3B2X2V4dChjbWQsIGNvcnJlY3RfdmcsICpjb25zaXN0ZW50LCAmaW5jb25zaXN0ZW50X3B2cykpIHsKKwkJcmVsZWFzZV92Zyhjb3JyZWN0X3ZnKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJKmNvbnNpc3RlbnQgPSAhaW5jb25zaXN0ZW50X3B2czsKKworCWlmIChjb3JyZWN0X3ZnICYmICpjb25zaXN0ZW50KSB7CisJCWlmICh1cGRhdGVfb2xkX3B2X2V4dCAmJiAhX3ZnX3VwZGF0ZV9vbGRfcHZfZXh0X2lmX25lZWRlZChjb3JyZWN0X3ZnKSkgeworCQkJcmVsZWFzZV92Zyhjb3JyZWN0X3ZnKTsKKwkJCXJldHVybl9OVUxMOworCQl9CisKKwkJaWYgKHN0cmlwX2hpc3RvcmljYWxfbHZzICYmICF2Z19zdHJpcF9vdXRkYXRlZF9oaXN0b3JpY2FsX2x2cyhjb3JyZWN0X3ZnKSkgeworCQkJcmVsZWFzZV92Zyhjb3JyZWN0X3ZnKTsKKwkJCXJldHVybl9OVUxMOworCQl9CisJfQorCisJcmV0dXJuIGNvcnJlY3Rfdmc7Cit9CisKKyNkZWZpbmUgREVWX0xJU1RfREVMSU0gIiwgIgorCitzdGF0aWMgaW50IF9jaGVja19kZXZzX3VzZWRfY29ycmVzcG9uZF93aXRoX2x2KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpsaXN0LCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBkZXZpY2VfbGlzdCAqZGw7CisJaW50IGZvdW5kX2luY29uc2lzdGVudCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJdWludDMyX3QgczsKKwlpbnQgd2FybmVkX2Fib3V0X25vX2RldiA9IDA7CisJY2hhciAqdXNlZF9kZXZuYW1lcyA9IE5VTEwsICphc3N1bWVkX2Rldm5hbWVzID0gTlVMTDsKKworCWlmICghKGxpc3QgPSBkZXZfY2FjaGVfZ2V0X2Rldl9saXN0X2Zvcl9sdmlkKGx2LT5sdmlkLnMgKyBJRF9MRU4pKSkKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIGxpc3QpIHsKKwkJZGV2ID0gZGwtPmRldjsKKwkJaWYgKCEoZGV2LT5mbGFncyAmIERFVl9BU1NVTUVEX0ZPUl9MVikpIHsKKwkJCWlmICghZm91bmRfaW5jb25zaXN0ZW50KSB7CisJCQkJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDMyKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJZm91bmRfaW5jb25zaXN0ZW50ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgREVWX0xJU1RfREVMSU0sIHNpemVvZihERVZfTElTVF9ERUxJTSkgLSAxKSkKKwkJCQkJcmV0dXJuXzA7CisJCQl9CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBkZXZfbmFtZShkZXYpLCAwKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0KKworCWlmICghZm91bmRfaW5jb25zaXN0ZW50KQorCQlyZXR1cm4gMTsKKworCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICJcMCIsIDEpKQorCQlyZXR1cm5fMDsKKwl1c2VkX2Rldm5hbWVzID0gZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7CisKKwlmb3VuZF9pbmNvbnNpc3RlbnQgPSAwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpIHsKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSA9PSBBUkVBX1BWKSB7CisJCQkJaWYgKCEoZGV2ID0gc2VnX2RldihzZWcsIHMpKSkgeworCQkJCQlpZiAoIXdhcm5lZF9hYm91dF9ub19kZXYpIHsKKwkJCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBDb3VsZG4ndCBmaW5kIGFsbCBkZXZpY2VzIGZvciBMViAlcyAiCisJCQkJCQkJICJ3aGlsZSBjaGVja2luZyB1c2VkIGFuZCBhc3N1bWVkIGRldmljZXMuIiwKKwkJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJCQl3YXJuZWRfYWJvdXRfbm9fZGV2ID0gMTsKKwkJCQkJfQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCEoZGV2LT5mbGFncyAmIERFVl9VU0VEX0ZPUl9MVikpIHsKKwkJCQkJaWYgKCFmb3VuZF9pbmNvbnNpc3RlbnQpIHsKKwkJCQkJCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAzMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl8wOworCQkJCQkJZm91bmRfaW5jb25zaXN0ZW50ID0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sIERFVl9MSVNUX0RFTElNLCBzaXplb2YoREVWX0xJU1RfREVMSU0pIC0gMSkpCisJCQkJCQkJcmV0dXJuXzA7CisJCQkJCX0KKwkJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgZGV2X25hbWUoZGV2KSwgMCkpCisJCQkJCQlyZXR1cm5fMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZm91bmRfaW5jb25zaXN0ZW50KSB7CisJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICJcMCIsIDEpKQorCQkJcmV0dXJuXzA7CisJCWFzc3VtZWRfZGV2bmFtZXMgPSBkbV9wb29sX2VuZF9vYmplY3QobWVtKTsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IERldmljZSBtaXNtYXRjaCBkZXRlY3RlZCBmb3IgJXMgd2hpY2ggaXMgYWNjZXNzaW5nICVzIGluc3RlYWQgb2YgJXMuIiwKKwkJCSBkaXNwbGF5X2x2bmFtZShsdiksIHVzZWRfZGV2bmFtZXMsIGFzc3VtZWRfZGV2bmFtZXMpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja19kZXZzX3VzZWRfY29ycmVzcG9uZF93aXRoX3ZnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBkbV9wb29sICptZW07CisJY2hhciB2Z2lkW0lEX0xFTiArIDFdOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRsOworCWludCBmb3VuZF9pbmNvbnNpc3RlbnQgPSAwOworCisJaWYgKGlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpCisJCXJldHVybiAxOworCisJc3RybmNweSh2Z2lkLCAoY29uc3QgY2hhciAqKSB2Zy0+aWQudXVpZCwgc2l6ZW9mKHZnaWQpKTsKKwl2Z2lkW0lEX0xFTl0gPSAnXDAnOworCisJLyogTWFyayBhbGwgUFZzIGluIFZHIGFzIHVzZWQuICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJLyoKKwkJICogRklYTUU6IEl0J3Mgbm90IGNsZWFyIGlmIHRoZSBtZWFuaW5nCisJCSAqIG9mICJtaXNzaW5nIiBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlCisJCSAqICFwdi0+ZGV2IGNhc2UsIG9yIGlmICJtaXNzaW5nIiBpcyB0aGUKKwkJICogbW9yZSBuYXJyb3cgY2FzZSB3aGVyZSBWRyBtZXRhZGF0YSBoYXMKKwkJICogYmVlbiB3cml0dGVuIHdpdGggdGhlIE1JU1NJTkcgZmxhZy4KKwkJICovCisJCWlmICghcHZsLT5wdi0+ZGV2KQorCQkJY29udGludWU7CisJCWlmIChpc19taXNzaW5nX3B2KHB2bC0+cHYpKQorCQkJY29udGludWU7CisJCXB2bC0+cHYtPmRldi0+ZmxhZ3MgfD0gREVWX0FTU1VNRURfRk9SX0xWOworCX0KKworCWlmICghKGxpc3QgPSBkZXZfY2FjaGVfZ2V0X2Rldl9saXN0X2Zvcl92Z2lkKHZnaWQpKSkKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGwsIGxpc3QpIHsKKwkJaWYgKCEoZGwtPmRldi0+ZmxhZ3MgJiBERVZfT1BFTl9GQUlMVVJFKSAmJgorCQkgICAgIShkbC0+ZGV2LT5mbGFncyAmIERFVl9BU1NVTUVEX0ZPUl9MVikpIHsKKwkJCWZvdW5kX2luY29uc2lzdGVudCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmb3VuZF9pbmNvbnNpc3RlbnQpIHsKKwkJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoInZnX2RldnNfY2hlY2siLCAxMDI0KSkpCisJCQlyZXR1cm5fMDsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQkJaWYgKCFfY2hlY2tfZGV2c191c2VkX2NvcnJlc3BvbmRfd2l0aF9sdihtZW0sIGxpc3QsIGx2bC0+bHYpKSB7CisJCQkJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJCQkJcmV0dXJuXzA7CisJCQl9CisJCX0KKworCQlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfcmVhZF9pbnRlcm5hbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmduYW1lLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZnaWQsIHVpbnQzMl90IHdhcm5fZmxhZ3MsIGludCAqY29uc2lzdGVudCkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJaWYgKCEodmcgPSBfdmdfcmVhZChjbWQsIHZnbmFtZSwgdmdpZCwgd2Fybl9mbGFncywgY29uc2lzdGVudCwgMCkpKQorCQlnb3RvX291dDsKKworCWlmICghX2NoZWNrX3B2X2Rldl9zaXplcyh2ZykpCisJCWxvZ193YXJuKCJPbmUgb3IgbW9yZSBkZXZpY2VzIHVzZWQgYXMgUFZzIGluIFZHICVzICIKKwkJCSAiaGF2ZSBjaGFuZ2VkIHNpemVzLiIsIHZnLT5uYW1lKTsKKworCWlmICghY2hlY2tfcHZfc2VnbWVudHModmcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUFYgc2VnbWVudHMgY29ycnVwdGVkIGluICVzLiIsCisJCQkgIHZnLT5uYW1lKTsKKwkJcmVsZWFzZV92Zyh2Zyk7CisJCXZnID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKCFjaGVja19sdl9zZWdtZW50cyhsdmwtPmx2LCAwKSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViBzZWdtZW50cyBjb3JydXB0ZWQgaW4gJXMuIiwKKwkJCQkgIGx2bC0+bHYtPm5hbWUpOworCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQl2ZyA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCS8qCisJCSAqIENoZWNrcyB0aGF0IGNyb3NzLXJlZmVyZW5jZSBvdGhlciBMVnMuCisJCSAqLworCQlpZiAoIWNoZWNrX2x2X3NlZ21lbnRzKGx2bC0+bHYsIDEpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWIHNlZ21lbnRzIGNvcnJ1cHRlZCBpbiAlcy4iLAorCQkJCSAgbHZsLT5sdi0+bmFtZSk7CisJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJCXZnID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJKHZvaWQpIF9jaGVja19kZXZzX3VzZWRfY29ycmVzcG9uZF93aXRoX3ZnKHZnKTsKK291dDoKKwlpZiAoISpjb25zaXN0ZW50ICYmICh3YXJuX2ZsYWdzICYgV0FSTl9JTkNPTlNJU1RFTlQpKSB7CisJCWlmIChpc19vcnBoYW5fdmcodmduYW1lKSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBGb3VuZCBpbmNvbnNpc3RlbnQgc3RhbmRhbG9uZSBQaHlzaWNhbCBWb2x1bWVzLiIpOworCQllbHNlCisJCQlsb2dfd2FybigiV0FSTklORzogVm9sdW1lIEdyb3VwICVzIGlzIG5vdCBjb25zaXN0ZW50LiIsIHZnbmFtZSk7CisJfQorCisJcmV0dXJuIHZnOworfQorCit2b2lkIGZyZWVfcHZfZmlkKHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCWlmICghcHYpCisJCXJldHVybjsKKworCXB2X3NldF9maWQocHYsIE5VTEwpOworfQorCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IGx2X2Zyb21fbHZpZCwgd2hpY2ggaXMgb25seSBjYWxsZWQgZnJvbQorICogYWN0aXZhdGUuYyBzbyB3ZSBrbm93IHRoZSBhcHByb3ByaWF0ZSBWRyBsb2NrIGlzIGFscmVhZHkgaGVsZCBhbmQKKyAqIHRoZSB2Z19yZWFkX2ludGVybmFsIGlzIHRoZXJlZm9yZSBzYWZlLgorICovCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqX3ZnX3JlYWRfYnlfdmdpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKnZnaWQsCisJCQkJCSAgICB1bnNpZ25lZCBwcmVjb21taXR0ZWQpCit7CisJY29uc3QgY2hhciAqdmduYW1lOworCXN0cnVjdCBkbV9saXN0ICp2Z25hbWVzOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc3RybDsKKwl1aW50MzJfdCB3YXJuX2ZsYWdzID0gV0FSTl9QVl9SRUFEIHwgV0FSTl9JTkNPTlNJU1RFTlQ7CisJaW50IGNvbnNpc3RlbnQgPSAwOworCisJLyogSXMgY29ycmVzcG9uZGluZyB2Z25hbWUgYWxyZWFkeSBjYWNoZWQ/ICovCisJaWYgKGx2bWNhY2hlX3ZnaWRfaXNfY2FjaGVkKHZnaWQpKSB7CisJCWlmICgodmcgPSBfdmdfcmVhZChjbWQsIE5VTEwsIHZnaWQsIHdhcm5fZmxhZ3MsICZjb25zaXN0ZW50LCBwcmVjb21taXR0ZWQpKSAmJgorCQkgICAgaWRfZXF1YWwoJnZnLT5pZCwgKGNvbnN0IHN0cnVjdCBpZCAqKXZnaWQpKSB7CisJCQlyZXR1cm4gdmc7CisJCX0KKwkJcmVsZWFzZV92Zyh2Zyk7CisJfQorCisJLyoKKwkgKiBXaGVuIHVzaW5nIGx2bWxvY2tkIHdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50LgorCSAqIFRoZSBWRyBpcyBsb2NrZWQsIHRoZW4gdmdfcmVhZCgpIGlzIGRvbmUsIHdoaWNoIGdldHMKKwkgKiB0aGUgbGF0ZXN0IFZHIGZyb20gbHZtZXRhZCwgb3IgZGlzayBpZiBsdm1ldGFkIGhhcworCSAqIGJlZW4gaW52YWxpZGF0ZWQuICBXaGVuIHdlIGdldCBoZXJlIHRoZSBWRyBzaG91bGQKKwkgKiBhbHdheXMgYmUgY2FjaGVkIGFuZCByZXR1cm5lZCBhYm92ZS4KKwkgKi8KKwlpZiAobHZtbG9ja2RfdXNlKCkpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAidmdfcmVhZF9ieV92Z2lkIGZhaWxlZCB3aXRoIGx2bWxvY2tkIik7CisKKwkvKiBNdXN0bid0IHNjYW4gaWYgbWVtb3J5IGxvY2tlZDogZW5zdXJlIGNhY2hlIGdldHMgcHJlLXBvcHVsYXRlZCEgKi8KKwlpZiAoY3JpdGljYWxfc2VjdGlvbigpKQorCQlyZXR1cm5fTlVMTDsKKworCS8qIEZJWE1FIE5lZWQgYSBnZW51aW5lIHJlYWQgYnkgSUQgaGVyZSAtIGRvbid0IHZnX3JlYWRfaW50ZXJuYWwgYnkgbmFtZSEgKi8KKwkvKiBGSVhNRSBEaXNhYmxlZCB2Z3JlbmFtZXMgd2hpbGUgYWN0aXZlIGZvciBub3cgYmVjYXVzZSB3ZSBhcmVuJ3QKKwkgKiAgICAgICBhbGxvd2VkIHRvIGRvIGEgZnVsbCBzY2FuIGhlcmUgYW55IG1vcmUuICovCisKKwkvLyBUaGUgc2xvdyB3YXkgLSBmdWxsIHNjYW4gcmVxdWlyZWQgdG8gY29wZSB3aXRoIHZncmVuYW1lCisJbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKCk7CisJbHZtY2FjaGVfbGFiZWxfc2NhbihjbWQpOworCWlmICghKHZnbmFtZXMgPSBnZXRfdmduYW1lcyhjbWQsIDApKSkgeworCQlsb2dfZXJyb3IoInZnX3JlYWRfYnlfdmdpZDogZ2V0X3ZnbmFtZXMgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzdHJsLCB2Z25hbWVzKSB7CisJCXZnbmFtZSA9IHN0cmwtPnN0cjsKKwkJaWYgKCF2Z25hbWUpCisJCQljb250aW51ZTsJLy8gRklYTUUgVW5uZWNlc3Nhcnk/CisJCWNvbnNpc3RlbnQgPSAwOworCQlpZiAoKHZnID0gX3ZnX3JlYWQoY21kLCB2Z25hbWUsIHZnaWQsIHdhcm5fZmxhZ3MsICZjb25zaXN0ZW50LCBwcmVjb21taXR0ZWQpKSAmJgorCQkgICAgaWRfZXF1YWwoJnZnLT5pZCwgKGNvbnN0IHN0cnVjdCBpZCAqKXZnaWQpKSB7CisJCQlpZiAoIWNvbnNpc3RlbnQpIHsKKwkJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXJldHVybiB2ZzsKKwkJfQorCQlyZWxlYXNlX3ZnKHZnKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogT25seSBjYWxsZWQgYnkgYWN0aXZhdGUuYyAqLworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9mcm9tX2x2aWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmx2aWRfcywKKwkJCQkgICAgdW5zaWduZWQgcHJlY29tbWl0dGVkKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJY29uc3QgdW5pb24gbHZpZCAqbHZpZDsKKworCWx2aWQgPSAoY29uc3QgdW5pb24gbHZpZCAqKSBsdmlkX3M7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJGaW5kaW5nICVzdm9sdW1lIGdyb3VwIGZvciB1dWlkICVzIiwgcHJlY29tbWl0dGVkID8gInByZWNvbW1pdHRlZCAiIDogIiIsIGx2aWRfcyk7CisJaWYgKCEodmcgPSBfdmdfcmVhZF9ieV92Z2lkKGNtZCwgKGNvbnN0IGNoYXIgKilsdmlkLT5pZFswXS51dWlkLCBwcmVjb21taXR0ZWQpKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBmb3IgdXVpZCBub3QgZm91bmQ6ICVzIiwgbHZpZF9zKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbG9nX3ZlcmJvc2UoIkZvdW5kIHZvbHVtZSBncm91cCBcIiVzXCIiLCB2Zy0+bmFtZSk7CisJaWYgKHZnLT5zdGF0dXMgJiBFWFBPUlRFRF9WRykgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgZXhwb3J0ZWQiLCB2Zy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIShsdiA9IGZpbmRfbHZfaW5fdmdfYnlfbHZpZCh2ZywgbHZpZCkpKSB7CisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkNhbid0IGZpbmQgbG9naWNhbCB2b2x1bWUgaWQgJXMiLCBsdmlkX3MpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gbHY7CitvdXQ6CisJcmVsZWFzZV92Zyh2Zyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKmZpbmRfdmduYW1lX2Zyb21fcHZpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIGNvbnN0IGNoYXIgKnB2aWQpCit7CisJY2hhciAqdmduYW1lOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCisJdmduYW1lID0gbHZtY2FjaGVfdmduYW1lX2Zyb21fcHZpZChjbWQsIHB2aWQpOworCisJaWYgKGlzX29ycGhhbl92Zyh2Z25hbWUpKSB7CisJCWlmICghKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmlkLCBOVUxMLCAwKSkpIHsKKwkJCXJldHVybl9OVUxMOworCQl9CisJCS8qCisJCSAqIElmIGFuIG9ycGhhbiBQViBoYXMgbm8gTURBcywgb3IgaXQgaGFzIE1EQXMgYnV0IHRoZQorCQkgKiBNREEgaXMgaWdub3JlZCwgaXQgbWF5IGFwcGVhciB0byBiZSBhbiBvcnBoYW4gdW50aWwKKwkJICogdGhlIG1ldGFkYXRhIGlzIHJlYWQgb2ZmIGFub3RoZXIgUFYgaW4gdGhlIHNhbWUgVkcuCisJCSAqIERldGVjdGluZyB0aGlzIG1lYW5zIGNoZWNraW5nIGV2ZXJ5IFZHIGJ5IHNjYW5uaW5nCisJCSAqIGV2ZXJ5IFBWIG9uIHRoZSBzeXN0ZW0uCisJCSAqLworCQlpZiAobHZtY2FjaGVfdW5jZXJ0YWluX293bmVyc2hpcChpbmZvKSkgeworCQkJaWYgKCFzY2FuX3Znc19mb3JfcHZzKGNtZCwgV0FSTl9QVl9SRUFEKSkgeworCQkJCWxvZ19lcnJvcigiUmVzY2FuIGZvciBQVnMgd2l0aG91dCAiCisJCQkJCSAgIm1ldGFkYXRhIGFyZWFzIGZhaWxlZC4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgKiBBc2sgbHZtY2FjaGUgYWdhaW4gLSB3ZSBtYXkgaGF2ZSBhIG5vbi1vcnBoYW4KKwkJCSAqIG5hbWUgbm93CisJCQkgKi8KKwkJCXZnbmFtZSA9IGx2bWNhY2hlX3ZnbmFtZV9mcm9tX3B2aWQoY21kLCBwdmlkKTsKKwkJfQorCX0KKwlyZXR1cm4gdmduYW1lOworfQorCisKK2NvbnN0IGNoYXIgKmZpbmRfdmduYW1lX2Zyb21fcHZuYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBjb25zdCBjaGFyICpwdm5hbWUpCit7CisJY29uc3QgY2hhciAqcHZpZDsKKworCXB2aWQgPSBsdm1jYWNoZV9wdmlkX2Zyb21fZGV2bmFtZShjbWQsIHB2bmFtZSk7CisJaWYgKCFwdmlkKQorCQkvKiBOb3QgYSBQViAqLworCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBmaW5kX3ZnbmFtZV9mcm9tX3B2aWQoY21kLCBwdmlkKTsKK30KKworLyogRklYTUUgVXNlIGxhYmVsIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIFBWIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKl9wdl9yZWFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQlzdHJ1Y3QgZG1fcG9vbCAqcHZtZW0sCisJCQkJCWNvbnN0IGNoYXIgKnB2X25hbWUsCisJCQkJCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwKKwkJCQkJdWludDMyX3Qgd2Fybl9mbGFncywgaW50IHNjYW5fbGFiZWxfb25seSkKK3sKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKwlpbnQgZm91bmQ7CisKKwlpZiAoIShkZXYgPSBkZXZfY2FjaGVfZ2V0KHB2X25hbWUsIGNtZC0+ZmlsdGVyKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKGx2bWV0YWRfdXNlZCgpKSB7CisJCWluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXYtPnB2aWQsIGRldiwgMCk7CisJCWlmICghaW5mbykgeworCQkJaWYgKCFsdm1ldGFkX3B2X2xvb2t1cF9ieV9kZXYoY21kLCBkZXYsICZmb3VuZCkpCisJCQkJcmV0dXJuX05VTEw7CisJCQlpZiAoIWZvdW5kKSB7CisJCQkJaWYgKHdhcm5fZmxhZ3MgJiBXQVJOX1BWX1JFQUQpCisJCQkJCWxvZ19lcnJvcigiTm8gcGh5c2ljYWwgdm9sdW1lIGZvdW5kIGluIGx2bWV0YWQgY2FjaGUgZm9yICVzIiwKKwkJCQkJCSAgcHZfbmFtZSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoIShpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoZGV2LT5wdmlkLCBkZXYsIDApKSkgeworCQkJCWlmICh3YXJuX2ZsYWdzICYgV0FSTl9QVl9SRUFEKQorCQkJCQlsb2dfZXJyb3IoIk5vIGNhY2hlIGluZm8gaW4gbHZtZXRhZCBjYWNoZSBmb3IgJXMuIiwKKwkJCQkJCSAgcHZfbmFtZSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJbGFiZWwgPSBsdm1jYWNoZV9nZXRfbGFiZWwoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKCEobGFiZWxfcmVhZChkZXYsICZsYWJlbCwgVUlOVDY0X0MoMCkpKSkgeworCQkJaWYgKHdhcm5fZmxhZ3MgJiBXQVJOX1BWX1JFQUQpCisJCQkJbG9nX2Vycm9yKCJObyBwaHlzaWNhbCB2b2x1bWUgbGFiZWwgcmVhZCBmcm9tICVzIiwKKwkJCQkJICBwdl9uYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWluZm8gPSAoc3RydWN0IGx2bWNhY2hlX2luZm8gKikgbGFiZWwtPmluZm87CisJfQorCisJZm10ID0gbHZtY2FjaGVfZm10KGluZm8pOworCisJcHYgPSBfYWxsb2NfcHYocHZtZW0sIGRldik7CisJaWYgKCFwdikgeworCQlsb2dfZXJyb3IoInB2IGFsbG9jYXRpb24gZm9yICclcycgZmFpbGVkIiwgcHZfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXB2LT5sYWJlbF9zZWN0b3IgPSBsYWJlbC0+c2VjdG9yOworCisJLyogRklYTUUgTW92ZSBtb3JlIGNvbW1vbiBjb2RlIHVwIGhlcmUgKi8KKwlpZiAoIShsdm1jYWNoZV9mbXQoaW5mbyktPm9wcy0+cHZfcmVhZChsdm1jYWNoZV9mbXQoaW5mbyksIHB2X25hbWUsIHB2LCBzY2FuX2xhYmVsX29ubHkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWFkIGV4aXN0aW5nIHBoeXNpY2FsIHZvbHVtZSAnJXMnIiwKKwkJCSAgcHZfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghcHYtPnNpemUpCisJCWdvdG8gYmFkOworCisJaWYgKCFhbGxvY19wdl9zZWdtZW50X3dob2xlX3B2KHB2bWVtLCBwdikpCisJCWdvdG9fYmFkOworCisJaWYgKGZpZCkKKwkJbHZtY2FjaGVfZmlkX2FkZF9tZGFzKGluZm8sIGZpZCwgKGNvbnN0IGNoYXIgKikgJnB2LT5pZCwgSURfTEVOKTsKKwllbHNlIHsKKwkJbHZtY2FjaGVfZmlkX2FkZF9tZGFzKGluZm8sIGZtdC0+b3JwaGFuX3ZnLT5maWQsIChjb25zdCBjaGFyICopICZwdi0+aWQsIElEX0xFTik7CisJCXB2X3NldF9maWQocHYsIGZtdC0+b3JwaGFuX3ZnLT5maWQpOworCX0KKworCXJldHVybiBwdjsKK2JhZDoKKwlmcmVlX3B2X2ZpZChwdik7CisJZG1fcG9vbF9mcmVlKHB2bWVtLCBwdik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIE1heSByZXR1cm4gZW1wdHkgbGlzdCAqLworc3RydWN0IGRtX2xpc3QgKmdldF92Z25hbWVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgaW5jbHVkZV9pbnRlcm5hbCkKK3sKKwlyZXR1cm4gbHZtY2FjaGVfZ2V0X3ZnbmFtZXMoY21kLCBpbmNsdWRlX2ludGVybmFsKTsKK30KKworc3RydWN0IGRtX2xpc3QgKmdldF92Z2lkcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGluY2x1ZGVfaW50ZXJuYWwpCit7CisJcmV0dXJuIGx2bWNhY2hlX2dldF92Z2lkcyhjbWQsIGluY2x1ZGVfaW50ZXJuYWwpOworfQorCitpbnQgZ2V0X3ZnbmFtZWlkcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKnZnbmFtZWlkcywKKwkJICBjb25zdCBjaGFyICpvbmx5X3RoaXNfdmduYW1lLCBpbnQgaW5jbHVkZV9pbnRlcm5hbCkKK3sKKwlzdHJ1Y3QgdmduYW1laWRfbGlzdCAqdmdubDsKKwlzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdDsKKworCWlmIChvbmx5X3RoaXNfdmduYW1lKSB7CisJCWlmICghKHZnbmwgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnZnbmwpKSkpIHsKKwkJCWxvZ19lcnJvcigidmduYW1laWRfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdmdubC0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBvbmx5X3RoaXNfdmduYW1lKTsKKwkJdmdubC0+dmdpZCA9IE5VTEw7CisJCWRtX2xpc3RfYWRkKHZnbmFtZWlkcywgJnZnbmwtPmxpc3QpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJLyoKKwkJICogVGhpcyBqdXN0IGdldHMgdGhlIGxpc3Qgb2YgbmFtZXMvaWRzIGZyb20gbHZtZXRhZAorCQkgKiBhbmQgZG9lcyBub3QgcG9wdWxhdGUgbHZtY2FjaGUuCisJCSAqLworCQlsdm1ldGFkX2dldF92Z25hbWVpZHMoY21kLCB2Z25hbWVpZHMpOworCisJCWlmIChpbmNsdWRlX2ludGVybmFsKSB7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZm10LCAmY21kLT5mb3JtYXRzKSB7CisJCQkJaWYgKCEodmdubCA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHNpemVvZigqdmdubCkpKSkgeworCQkJCQlsb2dfZXJyb3IoInZnbmFtZWlkX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCXZnbmwtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgZm10LT5vcnBoYW5fdmdfbmFtZSk7CisJCQkJdmdubC0+dmdpZCA9IE5VTEw7CisJCQkJZG1fbGlzdF9hZGQodmduYW1laWRzLCAmdmdubC0+bGlzdCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgbm9uLWx2bWV0YWQgY2FzZS4gVGhpcyBmdW5jdGlvbiBiZWdpbnMgYnkgY2FsbGluZworCQkgKiBsdm1jYWNoZV9sYWJlbF9zY2FuKCkgdG8gcG9wdWxhdGUgbHZtY2FjaGUuCisJCSAqLworCQlsdm1jYWNoZV9nZXRfdmduYW1laWRzKGNtZCwgaW5jbHVkZV9pbnRlcm5hbCwgdmduYW1laWRzKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZ2V0X3B2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDMyX3Qgd2Fybl9mbGFncywKKwkJc3RydWN0IGRtX2xpc3QgKnB2c2xpc3QsIHN0cnVjdCBkbV9saXN0ICp2Z3NsaXN0KQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc3RybDsKKwljb25zdCBjaGFyICp2Z25hbWUsICp2Z2lkOworCXN0cnVjdCBwdl9saXN0ICpwdmwsICpwdmxfY29weTsKKwlzdHJ1Y3QgZG1fbGlzdCAqdmdpZHM7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJaW50IGNvbnNpc3RlbnQgPSAwOworCWludCBvbGRfcHZtb3ZlOworCXN0cnVjdCB2Z19saXN0ICp2Z2xfaXRlbSA9IE5VTEw7CisJaW50IGhhdmVfcHYgPSAwOworCisJbHZtY2FjaGVfbGFiZWxfc2NhbihjbWQpOworCisJLyogR2V0IGxpc3Qgb2YgVkdzICovCisJaWYgKCEodmdpZHMgPSBnZXRfdmdpZHMoY21kLCAxKSkpIHsKKwkJbG9nX2Vycm9yKCJnZXRfcHZzOiBnZXRfdmdpZHMgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFJlYWQgZXZlcnkgVkcgdG8gZW5zdXJlIGNhY2hlIGNvbnNpc3RlbmN5ICovCisJLyogT3JwaGFuIFZHIGlzIGxhc3Qgb24gbGlzdCAqLworCW9sZF9wdm1vdmUgPSBwdm1vdmVfbW9kZSgpOworCWluaXRfcHZtb3ZlKDEpOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzdHJsLCB2Z2lkcykgeworCQl2Z2lkID0gc3RybC0+c3RyOworCQlpZiAoIXZnaWQpCisJCQljb250aW51ZTsJLyogRklYTUUgVW5uZWNlc3Nhcnk/ICovCisJCWNvbnNpc3RlbnQgPSAwOworCQlpZiAoISh2Z25hbWUgPSBsdm1jYWNoZV92Z25hbWVfZnJvbV92Z2lkKE5VTEwsIHZnaWQpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFdoZW4gd2UgYXJlIHJldHJpZXZpbmcgYSBsaXN0IHRvIHJldHVybiB0b2xpYmx2bSB3ZSBuZWVkCisJCSAqIHRoYXQgbGlzdCB0byBjb250YWluIFZHcyB0aGF0IGFyZSBtb2RpZmlhYmxlIGFzIHdlIGFyZSB1c2luZworCQkgKiB0aGUgdmdtZW0gcG9vbCBpbiB0aGUgdmcgdG8gcHJvdmlkZSBhbGxvY2F0aW9uIGZvciBsaWJsdm0uCisJCSAqIFRoaXMgaXMgYSBoYWNrIHRvIHByZXZlbnQgdGhlIHZnIGZyb20gZ2V0dGluZyBjYWNoZWQgYXMgdGhlCisJCSAqIHZnaWQgd2lsbCBiZSBOVUxMLgorCQkgKiBGSVhNRSBSZW1vdmUgdGhpcyBoYWNrLgorCQkgKi8KKworCQl3YXJuX2ZsYWdzIHw9IFdBUk5fSU5DT05TSVNURU5UOworCisJCWlmICghKHZnID0gdmdfcmVhZF9pbnRlcm5hbChjbWQsIHZnbmFtZSwgKCF2Z3NsaXN0KSA/IHZnaWQgOiBOVUxMLCB3YXJuX2ZsYWdzLCAmY29uc2lzdGVudCkpKSB7CisJCQlzdGFjazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTW92ZSBQVnMgb250byByZXN1bHRzIGxpc3QgKi8KKwkJaWYgKHB2c2xpc3QpCisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQkJCWlmICghKHB2bF9jb3B5ID0gX2NvcHlfcHZsKGNtZC0+bWVtLCBwdmwpKSkgeworCQkJCQlsb2dfZXJyb3IoIlBWIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCQkJcmVsZWFzZV92Zyh2Zyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gcmVsZWFzZSB0aGUgVkcsIGRvbid0CisJCQkJICogc3RvcmUgYSBwb2ludGVyIHRvIGl0IGluIHRoZSBQViBzdHJ1Y3R1cmUuCisJCQkJICovCisJCQkJaWYgKCF2Z3NsaXN0KQorCQkJCQlwdmxfY29weS0+cHYtPnZnID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCS8qCisJCQkJCSAqIE1ha2Ugc3VyZSB0aGUgdmcgbW9kZSBpbmRpY2F0ZXMKKwkJCQkJICogd3JpdGVhYmxlLgorCQkJCQkgKiBGSVhNRSBSZXdvcmsgZnVuY3Rpb24gdG8gdGFrZSBhCisJCQkJCSAqIHBhcmFtZXRlciB0byBjb250cm9sIHRoaXMKKwkJCQkJICovCisJCQkJCXB2bF9jb3B5LT5wdi0+dmctPm9wZW5fbW9kZSA9ICd3JzsKKwkJCQloYXZlX3B2ID0gMTsKKwkJCQlkbV9saXN0X2FkZChwdnNsaXN0LCAmcHZsX2NvcHktPmxpc3QpOworCQkJfQorCisJCS8qCisJCSAqIEluIHRoZSBjYXNlIG9mIHRoZSBsaWJyYXJ5IHdlIHdhbnQgdG8gcHJlc2VydmUgdGhlIGVtYmVkZGVkCisJCSAqIHZvbHVtZSBncm91cCBhcyBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgdGhlCisJCSAqIFBWIHJlcXVpcmUgaXQuCisJCSAqLworCQlpZiAoIXZnc2xpc3QgfHwgIWhhdmVfcHYpCisJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogQWRkIFZHIHRvIGxpc3Qgb2YgVkcgb2JqZWN0cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKKwkJCSAqLworCQkJdmdsX2l0ZW0gPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnZnbF9pdGVtKSk7CisJCQlpZiAoIXZnbF9pdGVtKSB7CisJCQkJbG9nX2Vycm9yKCJWRyBsaXN0IGVsZW1lbnQgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXZnbF9pdGVtLT52ZyA9IHZnOworCQkJdmcgPSBOVUxMOworCQkJZG1fbGlzdF9hZGQodmdzbGlzdCwgJnZnbF9pdGVtLT5saXN0KTsKKwkJfQorCQloYXZlX3B2ID0gMDsKKwl9CisJaW5pdF9wdm1vdmUob2xkX3B2bW92ZSk7CisKKwlpZiAoIXB2c2xpc3QpCisJCWRtX3Bvb2xfZnJlZShjbWQtPm1lbSwgdmdpZHMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHBoeXNpY2FsIHZvbHVtZXMuCisgKiBAcGFyYW0gCWNtZAlDb21tYW5kIGNvbnRleHQKKyAqIEBwYXJhbQlwdnNsaXN0CVNldCB0byBOVUxMIGlmIHlvdSB3YW50IG1lbW9yeSBmb3IgbGlzdCBjcmVhdGVkLAorICogCQkJZWxzZSB2YWxpZCBtZW1vcnkKKyAqIEBwYXJhbQl2Z3NsaXN0CVNldCB0byBOVUxMIGlmIHlvdSBuZWVkIHRoZSBwdiBzdHJ1Y3R1cmVzIHRvIGNvbnRhaW4KKyAqIAkJCXZhbGlkIHZnIHBvaW50ZXIuICBUaGlzIGlzIHRoZSBsaXN0IG9mIFZHcworICogQHJldHVybnMgTlVMTCBvbiBlcnJvcnMsIGVsc2UgcHZzbGlzdCB3aGljaCB3aWxsIGVxdWFsIHBhc3NlZC1pbiB2YWx1ZSBpZgorICogc3VwcGxpZWQuCisgKi8KK3N0cnVjdCBkbV9saXN0ICpnZXRfcHZzX2ludGVybmFsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSBzdHJ1Y3QgZG1fbGlzdCAqcHZzbGlzdCwKKwkJCQkgc3RydWN0IGRtX2xpc3QgKnZnc2xpc3QpCit7CisJc3RydWN0IGRtX2xpc3QgKnJlc3VsdHMgPSBwdnNsaXN0OworCisJaWYgKE5VTEwgPT0gcmVzdWx0cykgeworCQlpZiAoIShyZXN1bHRzID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpyZXN1bHRzKSkpKSB7CisJCQlsb2dfZXJyb3IoIlBWIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZG1fbGlzdF9pbml0KHJlc3VsdHMpOworCX0KKworCWlmICghX2dldF9wdnMoY21kLCBXQVJOX1BWX1JFQUQsIHJlc3VsdHMsIHZnc2xpc3QpKSB7CisJCWlmICghcHZzbGlzdCkKKwkJCWRtX3Bvb2xfZnJlZShjbWQtPm1lbSwgcmVzdWx0cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcmVzdWx0czsKK30KKworaW50IHNjYW5fdmdzX2Zvcl9wdnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQzMl90IHdhcm5fZmxhZ3MpCit7CisJcmV0dXJuIF9nZXRfcHZzKGNtZCwgd2Fybl9mbGFncywgTlVMTCwgTlVMTCk7Cit9CisKK2ludCBwdl93cml0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCBpbnQgYWxsb3dfbm9uX29ycGhhbikKK3sKKwlpZiAoIXB2LT5mbXQtPm9wcy0+cHZfd3JpdGUpIHsKKwkJbG9nX2Vycm9yKCJGb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIHBoeXNpY2FsIHZvbHVtZXMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGSVhNRTogVHJ5IHRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uLiBUaGlzIHJlcXVpcmVzIGNoZWNraW5nCisJICogICAgICAgIHRoYXQgdGhlIFBWIGFuZCB0aGUgVkcgYXJlIGluIGEgY29uc2lzdGVudCBzdGF0ZS4gV2UgbmVlZAorCSAqICAgICAgICB0byBwcm92aWRlIHNvbWUgcmV2ZXJ0IG1lY2hhbmlzbSBzaW5jZSBQViBsYWJlbCB0b2dldGhlcgorCSAqICAgICAgICB3aXRoIFZHIG1ldGFkYXRhIHdyaXRlIGlzIG5vdCBhdG9taWMuCisJICovCisJaWYgKCFhbGxvd19ub25fb3JwaGFuICYmCisJICAgICghaXNfb3JwaGFuX3ZnKHB2LT52Z19uYW1lKSB8fCBwdi0+cGVfYWxsb2NfY291bnQpKSB7CisJCWxvZ19lcnJvcigiQXNzZXJ0aW9uIGZhaWxlZDogY2FuJ3QgX3B2X3dyaXRlIG5vbi1vcnBoYW4gUFYgIgorCQkJICAiKGluIFZHICVzKSIsIHB2X3ZnX25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwdi0+Zm10LT5vcHMtPnB2X3dyaXRlKHB2LT5mbXQsIHB2KSkKKwkJcmV0dXJuXzA7CisKKwlwdi0+c3RhdHVzICY9IH5VTkxBQkVMTEVEX1BWOworCisJaWYgKCFsdm1ldGFkX3B2X2ZvdW5kKGNtZCwgJnB2LT5pZCwgcHYtPmRldiwgcHYtPmZtdCwgcHYtPmxhYmVsX3NlY3RvciwgTlVMTCwgTlVMTCwgTlVMTCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBwdl93cml0ZV9vcnBoYW4oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCWNvbnN0IGNoYXIgKm9sZF92Z19uYW1lID0gcHYtPnZnX25hbWU7CisKKwlwdi0+dmdfbmFtZSA9IGNtZC0+Zm10LT5vcnBoYW5fdmdfbmFtZTsKKwlwdi0+c3RhdHVzID0gQUxMT0NBVEFCTEVfUFY7CisJcHYtPnBlX2FsbG9jX2NvdW50ID0gMDsKKworCWlmICghZGV2X2dldF9zaXplKHB2LT5kZXYsICZwdi0+c2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZ2V0IHNpemUuIiwgcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwdl93cml0ZShjbWQsIHB2LCAwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbGVhciBtZXRhZGF0YSBmcm9tIHBoeXNpY2FsICIKKwkJCSAgInZvbHVtZSBcIiVzXCIgYWZ0ZXIgcmVtb3ZhbCBmcm9tIFwiJXNcIiIsCisJCQkgIHB2X2Rldl9uYW1lKHB2KSwgb2xkX3ZnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGlzX2dsb2JhbF92Zyhjb25zdCBjaGFyICp2Z19uYW1lKQoreworCXJldHVybiAodmdfbmFtZSAmJiAhc3RyY21wKHZnX25hbWUsIFZHX0dMT0JBTCkpID8gMSA6IDA7Cit9CisKKy8qKgorICogaXNfb3JwaGFuX3ZnIC0gRGV0ZXJtaW5lIHdoZXRoZXIgYSB2Z19uYW1lIGlzIGFuIG9ycGhhbgorICogQHZnX25hbWU6IHBvaW50ZXIgdG8gdGhlIHZnX25hbWUKKyAqLworaW50IGlzX29ycGhhbl92Zyhjb25zdCBjaGFyICp2Z19uYW1lKQoreworCXJldHVybiAodmdfbmFtZSAmJiAhc3RybmNtcCh2Z19uYW1lLCBPUlBIQU5fUFJFRklYLCBzaXplb2YoT1JQSEFOX1BSRUZJWCkgLSAxKSkgPyAxIDogMDsKK30KKworLyoKKyAqIEV4Y2x1ZGUgcHNldWRvIFZHIG5hbWVzIHVzZWQgZm9yIGxvY2tpbmcuCisgKi8KK2ludCBpc19yZWFsX3ZnKGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJcmV0dXJuICh2Z19uYW1lICYmICp2Z19uYW1lICE9ICcjJyk7Cit9CisKK3N0YXRpYyBpbnQgX2FuYWx5emVfbWRhKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHZvaWQgKmJhdG9uKQoreworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10ID0gYmF0b247CisJbWRhLT5vcHMtPnB2X2FuYWx5emVfbWRhKGZtdCwgbWRhKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnM6CisgKiAgMCAtIGZhaWwKKyAqICAxIC0gc3VjY2VzcworICovCitpbnQgcHZfYW5hbHl6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcHZfbmFtZSwKKwkgICAgICAgdWludDY0X3QgbGFiZWxfc2VjdG9yKQoreworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCisJZGV2ID0gZGV2X2NhY2hlX2dldChwdl9uYW1lLCBjbWQtPmZpbHRlcik7CisJaWYgKCFkZXYpIHsKKwkJbG9nX2Vycm9yKCJEZXZpY2UgJXMgbm90IGZvdW5kIChvciBpZ25vcmVkIGJ5IGZpbHRlcmluZykuIiwKKwkJCSAgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogRmlyc3QsIHNjYW4gZm9yIExWTSBsYWJlbHMuCisJICovCisJaWYgKCFsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCBsYWJlbF9zZWN0b3IpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGZpbmQgTFZNIGxhYmVsIG9uICVzIiwKKwkJCSAgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWxvZ19wcmludCgiRm91bmQgbGFiZWwgb24gJXMsIHNlY3RvciAlIlBSSXU2NCIsIHR5cGU9JS44cyIsCisJCSAgcHZfbmFtZSwgbGFiZWwtPnNlY3RvciwgbGFiZWwtPnR5cGUpOworCisJLyoKKwkgKiBOZXh0LCBsb29wIHRocm91Z2ggbWV0YWRhdGEgYXJlYXMKKwkgKi8KKwlpbmZvID0gbGFiZWwtPmluZm87CisJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX2FuYWx5emVfbWRhLCAodm9pZCAqKWx2bWNhY2hlX2ZtdChpbmZvKSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogRklYTUU6IHJlbW92ZSAvIGNvbWJpbmUgdGhpcyB3aXRoIGxvY2tpbmc/ICovCitpbnQgdmdfY2hlY2tfd3JpdGVfbW9kZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlpZiAodmctPm9wZW5fbW9kZSAhPSAndycpIHsKKwkJbG9nX2Vycm5vKEVQRVJNLCAiQXR0ZW1wdCB0byBtb2RpZnkgYSByZWFkLW9ubHkgVkciKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJuIDEgaWYgdGhlIFZHIG1ldGFkYXRhIHNob3VsZCBiZSB3cml0dGVuCisgKiAqd2l0aG91dCogdGhlIExWTV9XUklURSBmbGFnIGluIHRoZSBzdGF0dXMgbGluZSwgYW5kCisgKiAqd2l0aCogdGhlIExWTV9XUklURV9MT0NLRUQgZmxhZyBpbiB0aGUgZmxhZ3MgbGluZS4KKyAqCisgKiBJZiB0aGlzIGlzIGRvbmUgZm9yIGEgVkcsIGl0IGZvcmNlcyBwcmV2aW91cyB2ZXJzaW9ucworICogb2YgbHZtIChiZWZvcmUgdGhlIExWTV9XUklURV9MT0NLRUQgZmxhZyB3YXMgYWRkZWQpLCB0byB2aWV3CisgKiB0aGUgVkcgYW5kIGl0cyBMVnMgYXMgcmVhZC1vbmx5IChiZWNhdXNlIHRoZSBMVk1fV1JJVEUgZmxhZworICogaXMgbWlzc2luZykuICBWZXJzaW9ucyBvZiBsdm0gdGhhdCB1bmRlcnN0YW5kIHRoZQorICogTFZNX1dSSVRFX0xPQ0tFRCBmbGFnIGtub3cgdG8gY2hlY2sgdGhlIG90aGVyIG1ldGhvZHMgb2YKKyAqIGFjY2VzcyBjb250cm9sIGZvciB0aGUgVkcsIHNwZWNpZmljYWxseSBzeXN0ZW1faWQgYW5kIGxvY2tfdHlwZS4KKyAqCisgKiBTbywgaWYgYSBWRyBoYXMgYSBzeXN0ZW1faWQgb3IgbG9ja190eXBlLCB0aGVuIHRoZQorICogc3lzdGVtX2lkIGFuZCBsb2NrX3R5cGUgY29udHJvbCBhY2Nlc3MgdG8gdGhlIFZHIGluCisgKiBhZGRpdGlvbiB0byBpdHMgYmFzaWMgd3JpdGFibGUgc3RhdHVzLiAgQmVjYXVzZSBwcmV2aW91cworICogbHZtIHZlcnNpb25zIGRvIG5vdCBrbm93IGFib3V0IHN5c3RlbV9pZCBvciBsb2NrX3R5cGUsCisgKiBWR3MgZGVwZW5kaW5nIG9uIGVpdGhlciBvZiB0aGVzZSBzaG91bGQgaGF2ZSBMVk1fV1JJVEVfTE9DS0VECisgKiBpbnN0ZWFkIG9mIExWTV9XUklURSB0byBwcmV2ZW50IHRoZSBwcmV2aW91cyBsdm0gdmVyc2lvbnMgZnJvbQorICogYXNzdW1pbmcgdGhleSBjYW4gd3JpdGUgdGhlIFZHIGFuZCBpdHMgTFZzLgorICovCitpbnQgdmdfZmxhZ193cml0ZV9sb2NrZWQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKHZnLT5zeXN0ZW1faWQgJiYgdmctPnN5c3RlbV9pZFswXSkKKwkJcmV0dXJuIDE7CisKKwlpZiAodmctPmxvY2tfdHlwZSAmJiB2Zy0+bG9ja190eXBlWzBdICYmIHN0cmNtcCh2Zy0+bG9ja190eXBlLCAibm9uZSIpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogUGVyZm9ybXMgYSBzZXQgb2YgY2hlY2tzIGFnYWluc3QgYSBWRyBhY2NvcmRpbmcgdG8gYml0cyBzZXQgaW4gc3RhdHVzCisgKiBhbmQgcmV0dXJucyBGQUlMRURfKiBiaXRzIGZvciB0aG9zZSB0aGF0IGFyZW4ndCBhY2NlcHRhYmxlLgorICoKKyAqIEZJWE1FIFJlbW92ZSB0aGUgdW5uZWNlc3NhcnkgZHVwbGljYXRlIGRlZmluaXRpb25zIGFuZCByZXR1cm4gYml0cyBkaXJlY3RseS4KKyAqLworc3RhdGljIHVpbnQzMl90IF92Z19iYWRfc3RhdHVzX2JpdHMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJICAgIHVpbnQ2NF90IHN0YXR1cykKK3sKKwl1aW50MzJfdCBmYWlsdXJlID0gMDsKKworCWlmICgoc3RhdHVzICYgQ0xVU1RFUkVEKSAmJgorCSAgICAodmdfaXNfY2x1c3RlcmVkKHZnKSkgJiYgIWxvY2tpbmdfaXNfY2x1c3RlcmVkKCkpIHsKKwkJaWYgKCF2Zy0+Y21kLT5pZ25vcmVfY2x1c3RlcmVkX3ZncykKKwkJCWxvZ19lcnJvcigiU2tpcHBpbmcgY2x1c3RlcmVkIHZvbHVtZSBncm91cCAlcyIsIHZnLT5uYW1lKTsKKwkJZWxzZQorCQkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIGNsdXN0ZXJlZCB2b2x1bWUgZ3JvdXAgJXMiLCB2Zy0+bmFtZSk7CisJCS8qIFJldHVybiBiZWNhdXNlIG90aGVyIGZsYWdzIGFyZSBjb25zaWRlcmVkIHVuZGVmaW5lZC4gKi8KKwkJcmV0dXJuIEZBSUxFRF9DTFVTVEVSRUQ7CisJfQorCisJaWYgKChzdGF0dXMgJiBFWFBPUlRFRF9WRykgJiYKKwkgICAgdmdfaXNfZXhwb3J0ZWQodmcpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwICVzIGlzIGV4cG9ydGVkIiwgdmctPm5hbWUpOworCQlmYWlsdXJlIHw9IEZBSUxFRF9FWFBPUlRFRDsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIExWTV9XUklURSkgJiYKKwkgICAgISh2Zy0+c3RhdHVzICYgTFZNX1dSSVRFKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCAlcyBpcyByZWFkLW9ubHkiLCB2Zy0+bmFtZSk7CisJCWZhaWx1cmUgfD0gRkFJTEVEX1JFQURfT05MWTsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIFJFU0laRUFCTEVfVkcpICYmCisJICAgICF2Z19pc19yZXNpemVhYmxlKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCAlcyBpcyBub3QgcmVzaXplYWJsZS4iLCB2Zy0+bmFtZSk7CisJCWZhaWx1cmUgfD0gRkFJTEVEX1JFU0laRUFCTEU7CisJfQorCisJcmV0dXJuIGZhaWx1cmU7Cit9CisKKy8qKgorICogdmdfY2hlY2tfc3RhdHVzIC0gY2hlY2sgdm9sdW1lIGdyb3VwIHN0YXR1cyBmbGFncyBhbmQgbG9nIGVycm9yCisgKiBAdmcgLSB2b2x1bWUgZ3JvdXAgdG8gY2hlY2sgc3RhdHVzIGZsYWdzCisgKiBAc3RhdHVzIC0gc3BlY2lmaWMgc3RhdHVzIGZsYWdzIHRvIGNoZWNrIChlLmcuIEVYUE9SVEVEX1ZHKQorICovCitpbnQgdmdfY2hlY2tfc3RhdHVzKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1aW50NjRfdCBzdGF0dXMpCit7CisJcmV0dXJuICFfdmdfYmFkX3N0YXR1c19iaXRzKHZnLCBzdGF0dXMpOworfQorCisvKgorICogVkcgaXMgbGVmdCB1bmxvY2tlZCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpfcmVjb3Zlcl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSBjb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICp2Z2lkKQoreworCWludCBjb25zaXN0ZW50ID0gMTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKworCXVubG9ja192ZyhjbWQsIE5VTEwsIHZnX25hbWUpOworCisJZGV2X2Nsb3NlX2FsbCgpOworCisJaWYgKCFsb2NrX3ZvbChjbWQsIHZnX25hbWUsIExDS19WR19XUklURSwgTlVMTCkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEodmcgPSB2Z19yZWFkX2ludGVybmFsKGNtZCwgdmdfbmFtZSwgdmdpZCwgV0FSTl9QVl9SRUFELCAmY29uc2lzdGVudCkpKSB7CisJCXVubG9ja192ZyhjbWQsIE5VTEwsIHZnX25hbWUpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlpZiAoIWNvbnNpc3RlbnQpIHsKKwkJcmVsZWFzZV92Zyh2Zyk7CisJCXVubG9ja192ZyhjbWQsIE5VTEwsIHZnX25hbWUpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlyZXR1cm4gKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKil2ZzsKK30KKworc3RhdGljIGludCBfYWxsb3dfZXh0cmFfc3lzdGVtX2lkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpzeXN0ZW1faWQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwljb25zdCBjaGFyICpzdHI7CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBsb2NhbF9leHRyYV9zeXN0ZW1faWRzX0NGRywgTlVMTCkpKQorCQlyZXR1cm4gMDsKKworCWZvciAoY3YgPSBjbi0+djsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKKwkJaWYgKGN2LT50eXBlID09IERNX0NGR19FTVBUWV9BUlJBWSkKKwkJCWJyZWFrOworCQkvKiBJZ25vcmUgaW52YWxpZCBkYXRhOiBXYXJuaW5nIG1lc3NhZ2UgYWxyZWFkeSBpc3N1ZWQgYnkgY29uZmlnLmMgKi8KKwkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpCisJCQljb250aW51ZTsKKwkJc3RyID0gY3YtPnYuc3RyOworCQlpZiAoISpzdHIpCisJCQljb250aW51ZTsKKworCQlpZiAoIXN0cmNtcChzdHIsIHN5c3RlbV9pZCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfYWNjZXNzX3ZnX2NsdXN0ZXJlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKHZnX2lzX2NsdXN0ZXJlZCh2ZykgJiYgIWxvY2tpbmdfaXNfY2x1c3RlcmVkKCkpIHsKKwkJaWYgKCFjbWQtPmlnbm9yZV9jbHVzdGVyZWRfdmdzKQorCQkJbG9nX2Vycm9yKCJTa2lwcGluZyBjbHVzdGVyZWQgdm9sdW1lIGdyb3VwICVzIiwgdmctPm5hbWUpOworCQllbHNlCisJCQlsb2dfdmVyYm9zZSgiU2tpcHBpbmcgY2x1c3RlcmVkIHZvbHVtZSBncm91cCAlcyIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FjY2Vzc192Z19sb2NrX3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCXVpbnQzMl90IGxvY2tkX3N0YXRlLCB1aW50MzJfdCAqZmFpbHVyZSkKK3sKKwlpZiAoIWlzX3JlYWxfdmcodmctPm5hbWUpKQorCQlyZXR1cm4gMTsKKworCWlmIChjbWQtPmxvY2tkX3ZnX2Rpc2FibGUpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBMb2NhbCBWRyByZXF1aXJlcyBubyBsb2NrIGZyb20gbHZtbG9ja2QuCisJICovCisJaWYgKCFpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogV2hlbiBsdm1sb2NrZCBpcyBub3QgdXNlZCwgbG9ja2QgVkdzIGFyZSBpZ25vcmVkIGJ5IGx2bQorCSAqIGFuZCBjYW5ub3QgYmUgdXNlZCwgd2l0aCB0d28gZXhjZXB0aW9uczoKKwkgKgorCSAqIC4gVGhlIC0tc2hhcmVkIG9wdGlvbiBhbGxvd3MgdGhlbSB0byBiZSByZXZlYWxlZCB3aXRoCisJICogICByZXBvcnRpbmcvZGlzcGxheSBjb21tYW5kcy4KKwkgKgorCSAqIC4gSWYgYSBjb21tYW5kIGFza3MgdG8gb3BlcmF0ZSBvbiBvbmUgc3BlY2lmaWNhbGx5CisJICogICBieSBuYW1lLCB0aGVuIGFuIGVycm9yIGlzIHByaW50ZWQuCisJICovCisJaWYgKCFsdm1sb2NrZF91c2UoKSkgeworCQkvKgorCSAJICogU29tZSByZXBvcnRpbmcvZGlzcGxheSBjb21tYW5kcyBoYXZlIHRoZSAtLXNoYXJlZCBvcHRpb24KKwkJICogKGxpa2UgLS1mb3JlaWduKSB0byBhbGxvdyB0aGVtIHRvIHJldmVhbCBsb2NrZCBWR3MgdGhhdAorCQkgKiBhcmUgb3RoZXJ3aXNlIGlnbm9yZWQuICBUaGUgLS1zaGFyZWQgb3B0aW9uIG11c3Qgb25seSBiZQorCQkgKiBwZXJtaXR0ZWQgaW4gY29tbWFuZHMgdGhhdCByZWFkIHRoZSBWRyBmb3IgcmVwb3J0IG9yIGRpc3BsYXksCisJCSAqIG5vdCBhbnkgdGhhdCB3cml0ZSB0aGUgVkcgb3IgYWN0aXZhdGUgTFZzLgorCSAJICovCisJCWlmIChjbWQtPmluY2x1ZGVfc2hhcmVkX3ZncykKKwkJCXJldHVybiAxOworCisJCS8qCisJCSAqIFNvbWUgY29tbWFuZHMgd2FudCB0aGUgZXJyb3IgcHJpbnRlZCBieSB2Z19yZWFkLCBvdGhlcnMgYnkgaWdub3JlX3ZnLgorCQkgKiBUaG9zZSB1c2luZyBpZ25vcmVfdmcgbWF5IGNob29zZSB0byBza2lwIHRoZSBlcnJvci4KKwkJICovCisJCWlmIChjbWQtPnZnX3JlYWRfcHJpbnRfYWNjZXNzX2Vycm9yKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBhY2Nlc3MgVkcgJXMgd2l0aCBsb2NrIHR5cGUgJXMgdGhhdCByZXF1aXJlcyBsdm1sb2NrZC4iLAorCQkJCSAgdmctPm5hbWUsIHZnLT5sb2NrX3R5cGUpOworCQl9CisKKwkJKmZhaWx1cmUgfD0gRkFJTEVEX0xPQ0tfVFlQRTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGUgbG9jayByZXF1ZXN0IGZyb20gbHZtbG9ja2QgZmFpbGVkLiAgSWYgdGhlIGxvY2sgd2FzIGV4LAorCSAqIHdlIGNhbm5vdCBjb250aW51ZS4gIElmIHRoZSBsb2NrIHdhcyBzaCwgd2UgY291bGQgYWxzbyBmYWlsCisJICogdG8gY29udGludWUgYnV0IHNpbmNlIHRoZSBsb2NrIHdhcyBzaCwgaXQgbWVhbnMgdGhlIFZHIGlzCisJICogb25seSBiZWluZyByZWFkLCBhbmQgaXQgZG9lc24ndCBodXJ0IHRvIGFsbG93IHJlYWRpbmcgd2l0aAorCSAqIG5vIGxvY2suCisJICovCisJaWYgKGxvY2tkX3N0YXRlICYgTERTVF9GQUlMKSB7CisJCWlmICgobG9ja2Rfc3RhdGUgJiBMRFNUX0VYKSB8fCBjbWQtPmxvY2tkX3ZnX2VuZm9yY2Vfc2gpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGFjY2VzcyBWRyAlcyBkdWUgdG8gZmFpbGVkIGxvY2suIiwgdmctPm5hbWUpOworCQkJKmZhaWx1cmUgfD0gRkFJTEVEX0xPQ0tfTU9ERTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJbG9nX3dhcm4oIlJlYWRpbmcgVkcgJXMgd2l0aG91dCBhIGxvY2suIiwgdmctPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGlzX3N5c3RlbV9pZF9hbGxvd2VkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpzeXN0ZW1faWQpCit7CisJLyoKKwkgKiBBIFZHIHdpdGhvdXQgYSBzeXN0ZW1faWQgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueW9uZS4KKwkgKi8KKwlpZiAoIXN5c3RlbV9pZCB8fCAhc3lzdGVtX2lkWzBdKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQWxsb3dlZCBpZiB0aGUgaG9zdCBhbmQgVkcgc3lzdGVtX2lkJ3MgbWF0Y2guCisJICovCisJaWYgKGNtZC0+c3lzdGVtX2lkICYmICFzdHJjbXAoY21kLT5zeXN0ZW1faWQsIHN5c3RlbV9pZCkpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBBbGxvd2VkIGlmIGEgaG9zdCdzIGV4dHJhIHN5c3RlbV9pZCBtYXRjaGVzLgorCSAqLworCWlmIChjbWQtPnN5c3RlbV9pZCAmJiBfYWxsb3dfZXh0cmFfc3lzdGVtX2lkKGNtZCwgc3lzdGVtX2lkKSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIE5vdCBhbGxvd2VkIGlmIHRoZSBob3N0IGRvZXMgbm90IGhhdmUgYSBzeXN0ZW1faWQKKwkgKiBhbmQgdGhlIFZHIGRvZXMsIG9yIGlmIHRoZSBob3N0IGFuZCBWRydzIHN5c3RlbV9pZCdzCisJICogZG8gbm90IG1hdGNoLgorCSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2FjY2Vzc192Z19zeXN0ZW1pZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJLyoKKwkgKiBMVk0xIFZHcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBpZiBhIG5ldy1zdHlsZSBMVk0yIHN5c3RlbSBJRCBpcyBzZXQuCisJICovCisJaWYgKGNtZC0+c3lzdGVtX2lkICYmIHN5c3RlbWlkX29uX3B2cyh2ZykpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgYWNjZXNzIFZHICVzIHdpdGggTFZNMSBzeXN0ZW0gSUQgJXMgd2hlbiBob3N0IHN5c3RlbSBJRCBpcyBzZXQuIiwKKwkJCSAgdmctPm5hbWUsIHZnLT5sdm0xX3N5c3RlbV9pZCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQSBmZXcgY29tbWFuZHMgYWxsb3cgcmVhZC1vbmx5IGFjY2VzcyB0byBmb3JlaWduIFZHcy4KKwkgKi8KKwlpZiAoY21kLT5pbmNsdWRlX2ZvcmVpZ25fdmdzKQorCQlyZXR1cm4gMTsKKworCWlmIChpc19zeXN0ZW1faWRfYWxsb3dlZChjbWQsIHZnLT5zeXN0ZW1faWQpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQWxsb3cgVkcgYWNjZXNzIGlmIHRoZSBsb2NhbCBob3N0IGhhcyBhY3RpdmUgTFZzIGluIGl0LgorCSAqLworCWlmIChsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQlsb2dfd2FybigiV0FSTklORzogRm91bmQgTFZzIGFjdGl2ZSBpbiBWRyAlcyB3aXRoIGZvcmVpZ24gc3lzdGVtIElEICVzLiAgUG9zc2libGUgZGF0YSBjb3JydXB0aW9uLiIsCisJCQkgIHZnLT5uYW1lLCB2Zy0+c3lzdGVtX2lkKTsKKwkJaWYgKGNtZC0+aW5jbHVkZV9hY3RpdmVfZm9yZWlnbl92Z3MpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBQcmludCBhbiBlcnJvciB3aGVuIHJlYWRpbmcgYSBWRyB0aGF0IGhhcyBhIHN5c3RlbV9pZAorCSAqIGFuZCB0aGUgaG9zdCBzeXN0ZW1faWQgaXMgdW5rbm93bi4KKwkgKi8KKwlpZiAoIWNtZC0+c3lzdGVtX2lkIHx8IGNtZC0+dW5rbm93bl9zeXN0ZW1faWQpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgYWNjZXNzIFZHICVzIHdpdGggc3lzdGVtIElEICVzIHdpdGggdW5rbm93biBsb2NhbCBzeXN0ZW0gSUQuIiwKKwkJCSAgdmctPm5hbWUsIHZnLT5zeXN0ZW1faWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNvbWUgY29tbWFuZHMgd2FudCB0aGUgZXJyb3IgcHJpbnRlZCBieSB2Z19yZWFkLCBvdGhlcnMgYnkgaWdub3JlX3ZnLgorCSAqIFRob3NlIHVzaW5nIGlnbm9yZV92ZyBtYXkgY2hvb3NlIHRvIHNraXAgdGhlIGVycm9yLgorCSAqLworCWlmIChjbWQtPnZnX3JlYWRfcHJpbnRfYWNjZXNzX2Vycm9yKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGFjY2VzcyBWRyAlcyB3aXRoIHN5c3RlbSBJRCAlcyB3aXRoIGxvY2FsIHN5c3RlbSBJRCAlcy4iLAorCQkJICB2Zy0+bmFtZSwgdmctPnN5c3RlbV9pZCwgY21kLT5zeXN0ZW1faWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTaWxlbnRseSBpZ25vcmUgZm9yZWlnbiB2Z3MuICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZJWE1FOiBtb3ZlIF92Z19iYWRfc3RhdHVzX2JpdHMoKSBjaGVja3MgaW4gaGVyZS4KKyAqLworc3RhdGljIGludCBfdmdfYWNjZXNzX3Blcm1pdHRlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJdWludDMyX3QgbG9ja2Rfc3RhdGUsIHVpbnQzMl90ICpmYWlsdXJlKQoreworCWlmICghaXNfcmVhbF92Zyh2Zy0+bmFtZSkpIHsKKwkJLyogRGlzYWxsb3cgdXNlIG9mIExWTTEgb3JwaGFucyB3aGVuIGEgaG9zdCBzeXN0ZW0gSUQgaXMgc2V0LiAqLworCQlpZiAoY21kLT5zeXN0ZW1faWQgJiYgKmNtZC0+c3lzdGVtX2lkICYmIHN5c3RlbWlkX29uX3B2cyh2ZykpIHsKKwkJCSpmYWlsdXJlIHw9IEZBSUxFRF9TWVNURU1JRDsKKwkJCXJldHVybl8wOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmICghX2FjY2Vzc192Z19jbHVzdGVyZWQoY21kLCB2ZykpIHsKKwkJKmZhaWx1cmUgfD0gRkFJTEVEX0NMVVNURVJFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfYWNjZXNzX3ZnX2xvY2tfdHlwZShjbWQsIHZnLCBsb2NrZF9zdGF0ZSwgZmFpbHVyZSkpIHsKKwkJLyogRWl0aGVyIEZBSUxFRF9MT0NLX1RZUEUgb3IgRkFJTEVEX0xPQ0tfTU9ERSB3ZXJlIHNldC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfYWNjZXNzX3ZnX3N5c3RlbWlkKGNtZCwgdmcpKSB7CisJCSpmYWlsdXJlIHw9IEZBSUxFRF9TWVNURU1JRDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDb25zb2xpZGF0ZWQgbG9ja2luZywgcmVhZGluZywgYW5kIHN0YXR1cyBmbGFnIGNoZWNraW5nLgorICoKKyAqIElmIHRoZSBtZXRhZGF0YSBpcyBpbmNvbnNpc3RlbnQsIHNldHRpbmcgUkVBRF9BTExPV19JTkNPTlNJU1RFTlQgaW4KKyAqIHJlYWRfZmxhZ3Mgd2lsbCByZXR1cm4gaXQgd2l0aCBGQUlMRURfSU5DT05TSVNURU5UIHNldCBpbnN0ZWFkIG9mIAorICogZ2l2aW5nIHlvdSBub3RoaW5nLgorICoKKyAqIFVzZSB2Z19yZWFkX2Vycm9yKHZnKSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdC4gIE5vbnplcm8gbWVhbnMgdGhlcmUgd2VyZQorICogcHJvYmxlbXMgcmVhZGluZyB0aGUgdm9sdW1lIGdyb3VwLgorICogWmVybyB2YWx1ZSBtZWFucyB0aGF0IHRoZSBWRyBpcyBvcGVuIGFuZCBhcHByb3ByaWF0ZSBsb2NrcyBhcmUgaGVsZC4KKyAqLworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z19sb2NrX2FuZF9yZWFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnZnaWQsCisJCQkgICAgICAgdWludDMyX3QgbG9ja19mbGFncywKKwkJCSAgICAgICB1aW50NjRfdCBzdGF0dXNfZmxhZ3MsCisJCQkgICAgICAgdWludDMyX3QgcmVhZF9mbGFncywKKwkJCSAgICAgICB1aW50MzJfdCBsb2NrZF9zdGF0ZSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IE5VTEw7CisJaW50IGNvbnNpc3RlbnQgPSAxOworCWludCBjb25zaXN0ZW50X2luOworCXVpbnQzMl90IGZhaWx1cmUgPSAwOworCXVpbnQzMl90IHdhcm5fZmxhZ3MgPSAwOworCWludCBhbHJlYWR5X2xvY2tlZDsKKworCWlmICgocmVhZF9mbGFncyAmIFJFQURfQUxMT1dfSU5DT05TSVNURU5UKSB8fCAobG9ja19mbGFncyAhPSBMQ0tfVkdfV1JJVEUpKQorCQljb25zaXN0ZW50ID0gMDsKKworCWlmICghdmFsaWRhdGVfbmFtZSh2Z19uYW1lKSAmJiAhaXNfb3JwaGFuX3ZnKHZnX25hbWUpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIG5hbWUgXCIlc1wiIGhhcyBpbnZhbGlkIGNoYXJhY3RlcnMuIiwKKwkJCSAgdmdfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWFscmVhZHlfbG9ja2VkID0gbHZtY2FjaGVfdmduYW1lX2lzX2xvY2tlZCh2Z19uYW1lKTsKKworCWlmICghYWxyZWFkeV9sb2NrZWQgJiYKKwkgICAgIWxvY2tfdm9sKGNtZCwgdmdfbmFtZSwgbG9ja19mbGFncywgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3IgJXMiLCB2Z19uYW1lKTsKKwkJcmV0dXJuIF92Z19tYWtlX2hhbmRsZShjbWQsIHZnLCBGQUlMRURfTE9DS0lORyk7CisJfQorCisJaWYgKGFscmVhZHlfbG9ja2VkKQorCQlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nICVzIGFscmVhZHkgZG9uZSIsIHZnX25hbWUpOworCisJaWYgKGlzX29ycGhhbl92Zyh2Z19uYW1lKSkKKwkJc3RhdHVzX2ZsYWdzICY9IH5MVk1fV1JJVEU7CisKKwljb25zaXN0ZW50X2luID0gY29uc2lzdGVudDsKKworCXdhcm5fZmxhZ3MgPSBXQVJOX1BWX1JFQUQ7CisJaWYgKGNvbnNpc3RlbnQgfHwgKHJlYWRfZmxhZ3MgJiBSRUFEX1dBUk5fSU5DT05TSVNURU5UKSkKKwkJd2Fybl9mbGFncyB8PSBXQVJOX0lOQ09OU0lTVEVOVDsKKworCS8qIElmIGNvbnNpc3RlbnQgPT0gMSwgd2UgZ2V0IE5VTEwgaGVyZSBpZiBjb3JyZWN0aW9uIGZhaWxzLiAqLworCWlmICghKHZnID0gdmdfcmVhZF9pbnRlcm5hbChjbWQsIHZnX25hbWUsIHZnaWQsIHdhcm5fZmxhZ3MsICZjb25zaXN0ZW50KSkpIHsKKwkJaWYgKGNvbnNpc3RlbnRfaW4gJiYgIWNvbnNpc3RlbnQpIHsKKwkJCWZhaWx1cmUgfD0gRkFJTEVEX0lOQ09OU0lTVEVOVDsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmICghKHJlYWRfZmxhZ3MgJiBSRUFEX09LX05PVEZPVU5EKSkKKwkJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBub3QgZm91bmQiLCB2Z19uYW1lKTsKKwkJZmFpbHVyZSB8PSBGQUlMRURfTk9URk9VTkQ7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghX3ZnX2FjY2Vzc19wZXJtaXR0ZWQoY21kLCB2ZywgbG9ja2Rfc3RhdGUsICZmYWlsdXJlKSkKKwkJZ290byBiYWQ7CisKKwkvKiBjb25zaXN0ZW50ID09IDAgd2hlbiBWRyBpcyBub3QgZm91bmQsIGJ1dCBmYWlsZWQgPT0gRkFJTEVEX05PVEZPVU5EICovCisJaWYgKCFjb25zaXN0ZW50ICYmICFmYWlsdXJlKSB7CisJCXJlbGVhc2VfdmcodmcpOworCQlpZiAoISh2ZyA9IF9yZWNvdmVyX3ZnKGNtZCwgdmdfbmFtZSwgdmdpZCkpKSB7CisJCQlpZiAoaXNfb3JwaGFuX3ZnKHZnX25hbWUpKQorCQkJCWxvZ19lcnJvcigiUmVjb3Zlcnkgb2Ygc3RhbmRhbG9uZSBwaHlzaWNhbCB2b2x1bWVzIGZhaWxlZC4iKTsKKwkJCWVsc2UKKwkJCQlsb2dfZXJyb3IoIlJlY292ZXJ5IG9mIHZvbHVtZSBncm91cCBcIiVzXCIgZmFpbGVkLiIsCisJCQkJCSAgdmdfbmFtZSk7CisJCQlmYWlsdXJlIHw9IEZBSUxFRF9SRUNPVkVSWTsKKwkJCWdvdG8gYmFkX25vX3VubG9jazsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgdG9vbCBjYW4gaGFuZGxlIHRyaWNreSBjYXNlcyAtLSBtaXNzaW5nIFBWcyBhbmQKKwkgKiB1bmtub3duIHNlZ21lbnQgdHlwZXMuCisJICovCisKKwlpZiAoIWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyAmJiB2Z19taXNzaW5nX3B2X2NvdW50KHZnKSAmJgorCSAgICBsb2NrX2ZsYWdzID09IExDS19WR19XUklURSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgVkcgJXMgd2hpbGUgUFZzIGFyZSBtaXNzaW5nLiIsIHZnLT5uYW1lKTsKKwkJbG9nX2Vycm9yKCJDb25zaWRlciB2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcuIik7CisJCWZhaWx1cmUgfD0gRkFJTEVEX0lOQ09OU0lTVEVOVDsgLyogRklYTUUgbmV3IGZhaWx1cmUgY29kZSBoZXJlPyAqLworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIWNtZC0+aGFuZGxlc191bmtub3duX3NlZ21lbnRzICYmIHZnX2hhc191bmtub3duX3NlZ21lbnRzKHZnKSAmJgorCSAgICBsb2NrX2ZsYWdzID09IExDS19WR19XUklURSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgVkcgJXMgd2l0aCB1bmtub3duIHNlZ21lbnRzIGluIGl0ISIsCisJCQkgIHZnLT5uYW1lKTsKKwkJZmFpbHVyZSB8PSBGQUlMRURfSU5DT05TSVNURU5UOyAvKiBGSVhNRSBuZXcgZmFpbHVyZSBjb2RlIGhlcmU/ICovCisJCWdvdG8gYmFkOworCX0KKworCWZhaWx1cmUgfD0gX3ZnX2JhZF9zdGF0dXNfYml0cyh2Zywgc3RhdHVzX2ZsYWdzKTsKKwlpZiAoZmFpbHVyZSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gX3ZnX21ha2VfaGFuZGxlKGNtZCwgdmcsIGZhaWx1cmUpOworCitiYWQ6CisJaWYgKCFhbHJlYWR5X2xvY2tlZCkKKwkJdW5sb2NrX3ZnKGNtZCwgdmcsIHZnX25hbWUpOworCitiYWRfbm9fdW5sb2NrOgorCXJldHVybiBfdmdfbWFrZV9oYW5kbGUoY21kLCB2ZywgZmFpbHVyZSk7Cit9CisKKy8qCisgKiB2Z19yZWFkOiBIaWdoLWxldmVsIHZvbHVtZSBncm91cCBtZXRhZGF0YSByZWFkIGZ1bmN0aW9uLgorICoKKyAqIHZnX3JlYWRfZXJyb3IoKSBtdXN0IGJlIHVzZWQgb24gYW55IGhhbmRsZSByZXR1cm5lZCB0byBjaGVjayBmb3IgZXJyb3JzLgorICoKKyAqICAtIG1ldGFkYXRhIGluY29uc2lzdGVudCBhbmQgYXV0b21hdGljIGNvcnJlY3Rpb24gZmFpbGVkOiBGQUlMRURfSU5DT05TSVNURU5UCisgKiAgLSBWRyBpcyByZWFkLW9ubHk6IEZBSUxFRF9SRUFEX09OTFkKKyAqICAtIFZHIGlzIEVYUE9SVEVELCB1bmxlc3MgZmxhZ3MgaGFzIFJFQURfQUxMT1dfRVhQT1JURUQ6IEZBSUxFRF9FWFBPUlRFRAorICogIC0gVkcgaXMgbm90IFJFU0laRUFCTEU6IEZBSUxFRF9SRVNJWkVBQkxFCisgKiAgLSBsb2NraW5nIGZhaWxlZDogRkFJTEVEX0xPQ0tJTkcKKyAqCisgKiBPbiBmYWlsdXJlcywgYWxsIGxvY2tzIGFyZSByZWxlYXNlZCwgdW5sZXNzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGFwcGxpZXM6CisgKiAgLSB2Z25hbWVfaXNfbG9ja2VkKGxvY2tfbmFtZSkgaXMgdHJ1ZQorICogRklYTUU6IHJlbW92ZSB0aGUgYWJvdmUgMiBjb25kaXRpb25zIGlmIHBvc3NpYmxlIGFuZCBtYWtlIGFuIGVycm9yIGFsd2F5cworICogcmVsZWFzZSB0aGUgbG9jay4KKyAqCisgKiBWb2x1bWUgZ3JvdXBzIGFyZSBvcGVuZWQgcmVhZC1vbmx5IHVubGVzcyBmbGFncyBjb250YWlucyBSRUFEX0ZPUl9VUERBVEUuCisgKgorICogQ2hlY2tpbmcgZm9yIFZHIGV4aXN0ZW5jZToKKyAqCisgKiBGSVhNRTogV2Ugd2FudCB2Z19yZWFkIHRvIGF0dGVtcHQgYXV0b21hdGljIHJlY292ZXJ5IGFmdGVyIGFjcXVpcmluZyBhCisgKiB0ZW1wb3Jhcnkgd3JpdGUgbG9jazogaWYgdGhhdCBmYWlscywgd2UgYmFpbCBvdXQgYXMgdXN1YWwsIHdpdGggZmFpbGVkICYKKyAqIEZBSUxFRF9JTkNPTlNJU1RFTlQuIElmIGl0IHdvcmtzLCB3ZSBhcmUgZ29vZCB0byBnby4gQ29kZSB0aGF0J3MgYmVlbiBpbgorICogdG9vbGxpYiBqdXN0IHNldCBsb2NrX2ZsYWdzIHRvIExDS19WR19XUklURSBhbmQgY2FsbGVkIHZnX3JlYWRfaW50ZXJuYWwgd2l0aAorICogKmNvbnNpc3RlbnQgPSAxLgorICovCitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19yZWFkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgICBjb25zdCBjaGFyICp2Z2lkLCB1aW50MzJfdCByZWFkX2ZsYWdzLCB1aW50MzJfdCBsb2NrZF9zdGF0ZSkKK3sKKwl1aW50NjRfdCBzdGF0dXNfZmxhZ3MgPSBVSU5UNjRfQygwKTsKKwl1aW50MzJfdCBsb2NrX2ZsYWdzID0gTENLX1ZHX1JFQUQ7CisKKwlpZiAocmVhZF9mbGFncyAmIFJFQURfRk9SX1VQREFURSkgeworCQlzdGF0dXNfZmxhZ3MgfD0gRVhQT1JURURfVkcgfCBMVk1fV1JJVEU7CisJCWxvY2tfZmxhZ3MgPSBMQ0tfVkdfV1JJVEU7CisJfQorCisJaWYgKHJlYWRfZmxhZ3MgJiBSRUFEX0FMTE9XX0VYUE9SVEVEKQorCQlzdGF0dXNfZmxhZ3MgJj0gfkVYUE9SVEVEX1ZHOworCisJcmV0dXJuIF92Z19sb2NrX2FuZF9yZWFkKGNtZCwgdmdfbmFtZSwgdmdpZCwgbG9ja19mbGFncywgc3RhdHVzX2ZsYWdzLCByZWFkX2ZsYWdzLCBsb2NrZF9zdGF0ZSk7Cit9CisKKy8qCisgKiBBIGhpZ2gtbGV2ZWwgdm9sdW1lIGdyb3VwIG1ldGFkYXRhIHJlYWRpbmcgZnVuY3Rpb24uIE9wZW4gYSB2b2x1bWUgZ3JvdXAgZm9yCisgKiBsYXRlciB1cGRhdGUgKHRoaXMgbWVhbnMgdGhlIHVzZXIgY29kZSBjYW4gY2hhbmdlIHRoZSBtZXRhZGF0YSBhbmQgbGF0ZXIKKyAqIHJlcXVlc3QgdGhlIG5ldyBtZXRhZGF0YSB0byBiZSB3cml0dGVuIGFuZCBjb21taXR0ZWQpLgorICovCitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19yZWFkX2Zvcl91cGRhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgY29uc3QgY2hhciAqdmdpZCwgdWludDMyX3QgcmVhZF9mbGFncywgdWludDMyX3QgbG9ja2Rfc3RhdGUpCit7CisJcmV0dXJuIHZnX3JlYWQoY21kLCB2Z19uYW1lLCB2Z2lkLCByZWFkX2ZsYWdzIHwgUkVBRF9GT1JfVVBEQVRFLCBsb2NrZF9zdGF0ZSk7Cit9CisKKy8qCisgKiBUZXN0IHRoZSB2YWxpZGl0eSBvZiBhIFZHIGhhbmRsZSByZXR1cm5lZCBieSB2Z19yZWFkKCkgb3IgdmdfcmVhZF9mb3JfdXBkYXRlKCkuCisgKi8KK3VpbnQzMl90IHZnX3JlYWRfZXJyb3Ioc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfaGFuZGxlKQoreworCWlmICghdmdfaGFuZGxlKQorCQlyZXR1cm4gRkFJTEVEX0FMTE9DQVRJT047CisKKwlyZXR1cm4gdmdfaGFuZGxlLT5yZWFkX3N0YXR1czsKK30KKworLyoKKyAqIExvY2sgYSB2Z25hbWUgYW5kL29yIGNoZWNrIGZvciBleGlzdGVuY2UuCisgKiBUYWtlcyBhIFdSSVRFIGxvY2sgb24gdGhlIHZnbmFtZSBiZWZvcmUgc2Nhbm5pbmcuCisgKiBJZiBzY2FubmluZyBmYWlscyBvciB2Z25hbWUgZm91bmQsIHJlbGVhc2UgdGhlIGxvY2suCisgKiBOT1RFOiBJZiB5b3UgZmluZCB0aGUgcmV0dXJuIGNvZGVzIGNvbmZ1c2luZywgeW91IG1pZ2h0IHRoaW5rIG9mIHRoaXMKKyAqIGZ1bmN0aW9uIGFzIHNpbWlsYXIgdG8gYW4gb3BlbigpIGNhbGwgd2l0aCBPX0NSRUFUIGFuZCBPX0VYQ0wgZmxhZ3MKKyAqIChvcGVuIHJldHVybnMgZmFpbCB3aXRoIC1FRVhJU1QgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cykuCisgKgorICogUmV0dXJuczoKKyAqIEZBSUxFRF9MT0NLSU5HIC0gQ2Fubm90IGxvY2sgbmFtZQorICogRkFJTEVEX0VYSVNUIC0gVkcgbmFtZSBhbHJlYWR5IGV4aXN0cyAtIGNhbm5vdCByZXNlcnZlCisgKiBTVUNDRVNTIC0gVkcgbmFtZSBkb2VzIG5vdCBleGlzdCBpbiBzeXN0ZW0gYW5kIFdSSVRFIGxvY2sgaGVsZAorICovCit1aW50MzJfdCB2Z19sb2NrX25ld25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwlpZiAoIWxvY2tfdm9sKGNtZCwgdmduYW1lLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCXJldHVybiBGQUlMRURfTE9DS0lORzsKKwl9CisKKwkvKiBGaW5kIHRoZSB2Z25hbWUgaW4gdGhlIGNhY2hlICovCisJLyogSWYgaXQncyBub3QgdGhlcmUgd2UgbXVzdCBkbyBmdWxsIHNjYW4gdG8gYmUgY29tcGxldGVseSBzdXJlICovCisJaWYgKCFsdm1jYWNoZV9mbXRfZnJvbV92Z25hbWUoY21kLCB2Z25hbWUsIE5VTEwsIDEpKSB7CisJCWx2bWNhY2hlX2xhYmVsX3NjYW4oY21kKTsKKwkJaWYgKCFsdm1jYWNoZV9mbXRfZnJvbV92Z25hbWUoY21kLCB2Z25hbWUsIE5VTEwsIDEpKSB7CisJCQkvKiBJbmRlcGVuZGVudCBNREFzIGFyZW4ndCBzdXBwb3J0ZWQgdW5kZXIgbG93IG1lbW9yeSAqLworCQkJaWYgKCFjbWQtPmluZGVwZW5kZW50X21ldGFkYXRhX2FyZWFzICYmIGNyaXRpY2FsX3NlY3Rpb24oKSkgeworCQkJCS8qCisJCQkJICogRklYTUU6IERpc2FsbG93IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpZgorCQkJCSAqIGNyaXRpY2FsX3NlY3Rpb24oKSBpcyB0cnVlLgorCQkJCSAqLworCQkJCXVubG9ja192ZyhjbWQsIE5VTEwsIHZnbmFtZSk7CisJCQkJcmV0dXJuIEZBSUxFRF9MT0NLSU5HOworCQkJfQorCQkJbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKCk7CisJCQlsdm1jYWNoZV9sYWJlbF9zY2FuKGNtZCk7CisJCQlpZiAoIWx2bWNhY2hlX2ZtdF9mcm9tX3ZnbmFtZShjbWQsIHZnbmFtZSwgTlVMTCwgMCkpIHsKKwkJCQkvKiB2Z25hbWUgbm90IGZvdW5kIGFmdGVyIHNjYW5uaW5nICovCisJCQkJcmV0dXJuIFNVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGb3VuZCB2Z25hbWUgc28gY2Fubm90IHJlc2VydmUuICovCisJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgdmduYW1lKTsKKwlyZXR1cm4gRkFJTEVEX0VYSVNUOworfQorCitzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICphbGxvY19maWQoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJICBjb25zdCBzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlX2N0eCAqZmljKQoreworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoImZvcm1hdF9pbnN0YW5jZSIsIDEwMjQpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIShmaWQgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqZmlkKSkpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgZm9ybWF0X2luc3RhbmNlIG9iamVjdC4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJZmlkLT5yZWZfY291bnQgPSAxOworCWZpZC0+bWVtID0gbWVtOworCWZpZC0+dHlwZSA9IGZpYy0+dHlwZTsKKwlmaWQtPmZtdCA9IGZtdDsKKworCWRtX2xpc3RfaW5pdCgmZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpOworCWRtX2xpc3RfaW5pdCgmZmlkLT5tZXRhZGF0YV9hcmVhc19pZ25vcmVkKTsKKworCXJldHVybiBmaWQ7CisKK2JhZDoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBwdl9zZXRfZmlkKHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQlzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQpCit7CisJaWYgKGZpZCA9PSBwdi0+ZmlkKQorCQlyZXR1cm47CisKKwlpZiAoZmlkKQorCQlmaWQtPnJlZl9jb3VudCsrOworCisJaWYgKHB2LT5maWQpCisJCXB2LT5maWQtPmZtdC0+b3BzLT5kZXN0cm95X2luc3RhbmNlKHB2LT5maWQpOworCisJcHYtPmZpZCA9IGZpZDsKK30KKwordm9pZCB2Z19zZXRfZmlkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlpZiAoZmlkID09IHZnLT5maWQpCisJCXJldHVybjsKKworCWlmIChmaWQpCisJCWZpZC0+cmVmX2NvdW50Kys7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykKKwkJcHZfc2V0X2ZpZChwdmwtPnB2LCBmaWQpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5yZW1vdmVkX3B2cykKKwkJcHZfc2V0X2ZpZChwdmwtPnB2LCBmaWQpOworCisJaWYgKHZnLT5maWQpCisJCXZnLT5maWQtPmZtdC0+b3BzLT5kZXN0cm95X2luc3RhbmNlKHZnLT5maWQpOworCisJdmctPmZpZCA9IGZpZDsKK30KKworc3RhdGljIGludCBfY29udmVydF9rZXlfdG9fc3RyaW5nKGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGtleV9sZW4sCisJCQkJICB1bnNpZ25lZCBzdWJfa2V5LCBjaGFyICpidWYsIHNpemVfdCBidWZfbGVuKQoreworCW1lbWNweShidWYsIGtleSwga2V5X2xlbik7CisJYnVmICs9IGtleV9sZW47CisJYnVmX2xlbiAtPSBrZXlfbGVuOworCWlmICgoZG1fc25wcmludGYoYnVmLCBidWZfbGVuLCAiXyV1Iiwgc3ViX2tleSkgPT0gLTEpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZmlkX2FkZF9tZGEoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLAorCQkgY29uc3QgY2hhciAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgdW5zaWduZWQgc3ViX2tleSkKK3sKKwlzdGF0aWMgY2hhciBmdWxsX2tleVtQQVRIX01BWF07CisKKwlkbV9saXN0X2FkZChtZGFfaXNfaWdub3JlZChtZGEpID8gJmZpZC0+bWV0YWRhdGFfYXJlYXNfaWdub3JlZCA6CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlLCAmbWRhLT5saXN0KTsKKworCS8qIFJldHVybiBpZiB0aGUgbWRhIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBpbmRleGVkLiAqLworCWlmICgha2V5KQorCQlyZXR1cm4gMTsKKworCWlmICghZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgbWV0YWRhdGEgYXJlYSB0byBpbmRleC4gKi8KKwlpZiAoIV9jb252ZXJ0X2tleV90b19zdHJpbmcoa2V5LCBrZXlfbGVuLCBzdWJfa2V5LAorCQkJCSAgICBmdWxsX2tleSwgc2l6ZW9mKGZ1bGxfa2V5KSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9oYXNoX2luc2VydChmaWQtPm1ldGFkYXRhX2FyZWFzX2luZGV4LAorCQkJICAgIGZ1bGxfa2V5LCBtZGEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGhhc2ggbWRhLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGZpZF9hZGRfbWRhcyhzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsIHN0cnVjdCBkbV9saXN0ICptZGFzLAorCQkgY29uc3QgY2hhciAqa2V5LCBzaXplX3Qga2V5X2xlbikKK3sKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCAqbWRhX25ldzsKKwl1bnNpZ25lZCBtZGFfaW5kZXggPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgbWRhcykgeworCQltZGFfbmV3ID0gbWRhX2NvcHkoZmlkLT5tZW0sIG1kYSk7CisJCWlmICghbWRhX25ldykKKwkJCXJldHVybl8wOworCQlmaWRfcmVtb3ZlX21kYShmaWQsIE5VTEwsIGtleSwga2V5X2xlbiwgbWRhX2luZGV4KTsKKwkJZmlkX2FkZF9tZGEoZmlkLCBtZGFfbmV3LCBrZXksIGtleV9sZW4sIG1kYV9pbmRleCk7CisJCW1kYV9pbmRleCsrOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqZmlkX2dldF9tZGFfaW5kZXhlZChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsCisJCQkJCSAgY29uc3QgY2hhciAqa2V5LCBzaXplX3Qga2V5X2xlbiwKKwkJCQkJICBjb25zdCB1bnNpZ25lZCBzdWJfa2V5KQoreworCXN0YXRpYyBjaGFyIGZ1bGxfa2V5W1BBVEhfTUFYXTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhID0gTlVMTDsKKworCWlmICghZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIV9jb252ZXJ0X2tleV90b19zdHJpbmcoa2V5LCBrZXlfbGVuLCBzdWJfa2V5LAorCQkJCSAgICBmdWxsX2tleSwgc2l6ZW9mKGZ1bGxfa2V5KSkpCisJCXJldHVybl9OVUxMOworCisJbWRhID0gKHN0cnVjdCBtZXRhZGF0YV9hcmVhICopIGRtX2hhc2hfbG9va3VwKGZpZC0+bWV0YWRhdGFfYXJlYXNfaW5kZXgsCisJCQkJCQkgICAgICBmdWxsX2tleSk7CisKKwlyZXR1cm4gbWRhOworfQorCitpbnQgZmlkX3JlbW92ZV9tZGEoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLCBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLAorCQkgICBjb25zdCBjaGFyICprZXksIHNpemVfdCBrZXlfbGVuLCBjb25zdCB1bnNpZ25lZCBzdWJfa2V5KQoreworCXN0YXRpYyBjaGFyIGZ1bGxfa2V5W1BBVEhfTUFYXTsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhX2luZGV4ZWQgPSBOVUxMOworCisJLyogQXQgbGVhc3Qgb25lIG9mIG1kYSBvciBrZXkgbXVzdCBiZSBzcGVjaWZpZWQuICovCisJaWYgKCFtZGEgJiYgIWtleSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoa2V5KSB7CisJCS8qCisJCSAqIElmIGJvdGggbWRhIGFuZCBrZXkgc3BlY2lmaWVkLCBjaGVjayBnaXZlbiBtZGEKKwkJICogd2l0aCB3aGF0IHdlIGZpbmQgdXNpbmcgdGhlIGluZGV4IGFuZCByZXR1cm4KKwkJICogaW1tZWRpYXRlbHkgaWYgdGhlc2UgdHdvIGRvIG5vdCBtYXRjaC4KKwkJICovCisJCWlmICghKG1kYV9pbmRleGVkID0gZmlkX2dldF9tZGFfaW5kZXhlZChmaWQsIGtleSwga2V5X2xlbiwgc3ViX2tleSkpIHx8CisJCSAgICAgKG1kYSAmJiBtZGEgIT0gbWRhX2luZGV4ZWQpKQorCQkJcmV0dXJuIDE7CisKKwkJbWRhID0gbWRhX2luZGV4ZWQ7CisKKwkJaWYgKCFfY29udmVydF9rZXlfdG9fc3RyaW5nKGtleSwga2V5X2xlbiwgc3ViX2tleSwKKwkJCQkgICAgZnVsbF9rZXksIHNpemVvZihmdWxsX2tleSkpKQorCQkJcmV0dXJuXzA7CisKKwkJZG1faGFzaF9yZW1vdmUoZmlkLT5tZXRhZGF0YV9hcmVhc19pbmRleCwgZnVsbF9rZXkpOworCX0KKworCWRtX2xpc3RfZGVsKCZtZGEtPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDb3B5IGNvbnN0cnVjdG9yIGZvciBhIG1ldGFkYXRhX2FyZWEuCisgKi8KK3N0cnVjdCBtZXRhZGF0YV9hcmVhICptZGFfY29weShzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpCit7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYV9uZXc7CisKKwlpZiAoIShtZGFfbmV3ID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqbWRhX25ldykpKSkgeworCQlsb2dfZXJyb3IoIm1ldGFkYXRhX2FyZWEgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShtZGFfbmV3LCBtZGEsIHNpemVvZigqbWRhKSk7CisJaWYgKG1kYS0+b3BzLT5tZGFfbWV0YWRhdGFfbG9jbl9jb3B5ICYmIG1kYS0+bWV0YWRhdGFfbG9jbikgeworCQltZGFfbmV3LT5tZXRhZGF0YV9sb2NuID0KKwkJCW1kYS0+b3BzLT5tZGFfbWV0YWRhdGFfbG9jbl9jb3B5KG1lbSwgbWRhLT5tZXRhZGF0YV9sb2NuKTsKKwkJaWYgKCFtZGFfbmV3LT5tZXRhZGF0YV9sb2NuKSB7CisJCQlkbV9wb29sX2ZyZWUobWVtLCBtZGFfbmV3KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJZG1fbGlzdF9pbml0KCZtZGFfbmV3LT5saXN0KTsKKworCXJldHVybiBtZGFfbmV3OworfQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiBvbiBhIGZvcm1hdCBzcGVjaWZpYworICogYmFzaXMgLSBkb2VzIHRoZSBmb3JtYXQgc3BlY2ZpYyBjb250ZXh0IG9mIHRoZXNlIHR3byBtZXRhZGF0YSBhcmVhcworICogbWF0Y2g/CisgKgorICogQSBtZXRhdGRhdGFfYXJlYSBpcyBkZWZpbmVkIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZSB1bmRlcmx5aW5nIGNvbnRleHQuCisgKiBUaGlzIGhhcyB0aGUgYmVuZWZpdCB0aGF0IHdlIGNhbiB1c2UgdGhlIHNhbWUgYWJzdHJhY3Rpb24gdG8gcmVhZCBkaXNrcworICogKHNlZSBfbWV0YWRhdGFfdGV4dF9yYXdfb3BzKSBvciBmaWxlcyAoc2VlIF9tZXRhZGF0YV90ZXh0X2ZpbGVfb3BzKS4KKyAqIEhvd2V2ZXIsIG9uZSBkb3duc2lkZSBpcyB0aGVyZSBpcyBubyBmb3JtYXQtaW5kZXBlbmRlbnQgd2F5IHRvIGRldGVybWluZQorICogd2hldGhlciBhIGdpdmVuIG1ldGFkYXRhX2FyZWEgaXMgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBkZXZpY2UgLSBpbiBmYWN0LAorICogaXQgbWF5IG5vdCBiZSBhdHRhY2hlZCB0byBhIGRldmljZSBhdCBhbGwuCisgKgorICogVGh1cywgTFZNIGlzIHN0cnVjdHVyZWQgc3VjaCB0aGF0IGFuIG1kYSBpcyBub3QgYSBtZW1iZXIgb2Ygc3RydWN0CisgKiBwaHlzaWNhbF92b2x1bWUuICBUaGUgbG9jYXRpb24gb2YgdGhlIG1kYSBkZXBlbmRzIG9uIHdoZXRoZXIKKyAqIHRoZSBQViBpcyBpbiBhIHZvbHVtZSBncm91cC4gIEEgUFYgbm90IGluIGEgVkcgaGFzIGFuIG1kYSBvbiB0aGUKKyAqICdpbmZvLT5tZGEnIGxpc3QgaW4gbHZtY2FjaGUsIHdoaWxlIGEgUFYgaW4gYSBWRyBoYXMgYW4gbWRhIG9uCisgKiB0aGUgdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlIGxpc3QuICBGb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgX3ZnX3JlYWQoKSwKKyAqIGFuZCB0aGUgc2VxdWVuY2Ugb2YgY3JlYXRpbmcgdGhlIGZvcm1hdF9pbnN0YW5jZSB3aXRoIGZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlCisgKiBsaXN0LCBhcyB3ZWxsIGFzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIFZHLCB3aXRoIGxpc3Qgb2YgUFZzIChjb21lcworICogYWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgZmlkIGFuZCBsaXN0IG9mIG1kYXMpLgorICovCit1bnNpZ25lZCBtZGFfbG9jbnNfbWF0Y2goc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTEsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEyKQoreworCWlmICghbWRhMS0+b3BzLT5tZGFfbG9jbnNfbWF0Y2ggfHwgIW1kYTItPm9wcy0+bWRhX2xvY25zX21hdGNoIHx8CisJICAgIG1kYTEtPm9wcy0+bWRhX2xvY25zX21hdGNoICE9IG1kYTItPm9wcy0+bWRhX2xvY25zX21hdGNoKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBtZGExLT5vcHMtPm1kYV9sb2Nuc19tYXRjaChtZGExLCBtZGEyKTsKK30KKworc3RydWN0IGRldmljZSAqbWRhX2dldF9kZXZpY2Uoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSkKK3sKKwlpZiAoIW1kYS0+b3BzLT5tZGFfZ2V0X2RldmljZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1kYS0+b3BzLT5tZGFfZ2V0X2RldmljZShtZGEpOworfQorCit1bnNpZ25lZCBtZGFfaXNfaWdub3JlZChzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKQoreworCXJldHVybiAobWRhLT5zdGF0dXMgJiBNREFfSUdOT1JFRCk7Cit9CisKK3ZvaWQgbWRhX3NldF9pZ25vcmVkKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHVuc2lnbmVkIG1kYV9pZ25vcmVkKQoreworCXZvaWQgKmxvY24gPSBtZGEtPm1ldGFkYXRhX2xvY247CisJdW5zaWduZWQgb2xkX21kYV9pZ25vcmVkID0gbWRhX2lzX2lnbm9yZWQobWRhKTsKKworCWlmIChtZGFfaWdub3JlZCAmJiAhb2xkX21kYV9pZ25vcmVkKQorCQltZGEtPnN0YXR1cyB8PSBNREFfSUdOT1JFRDsKKwllbHNlIGlmICghbWRhX2lnbm9yZWQgJiYgb2xkX21kYV9pZ25vcmVkKQorCQltZGEtPnN0YXR1cyAmPSB+TURBX0lHTk9SRUQ7CisJZWxzZQorCQlyZXR1cm47CS8qIE5vIGNoYW5nZSAqLworCisJbG9nX2RlYnVnX21ldGFkYXRhKCIlcyBpZ25vcmVkIGZsYWcgZm9yIG1kYSAlcyBhdCBvZmZzZXQgJSIgUFJJdTY0ICIuIiwKKwkJCSAgIG1kYV9pZ25vcmVkID8gIlNldHRpbmciIDogIkNsZWFyaW5nIiwKKwkJCSAgIG1kYS0+b3BzLT5tZGFfbWV0YWRhdGFfbG9jbl9uYW1lID8gbWRhLT5vcHMtPm1kYV9tZXRhZGF0YV9sb2NuX25hbWUobG9jbikgOiAiIiwKKwkJCSAgIG1kYS0+b3BzLT5tZGFfbWV0YWRhdGFfbG9jbl9vZmZzZXQgPyBtZGEtPm9wcy0+bWRhX21ldGFkYXRhX2xvY25fb2Zmc2V0KGxvY24pIDogVUlOVDY0X0MoMCkpOworfQorCitpbnQgbWRhc19lbXB0eV9vcl9pZ25vcmVkKHN0cnVjdCBkbV9saXN0ICptZGFzKQoreworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGE7CisKKwlpZiAoZG1fbGlzdF9lbXB0eShtZGFzKSkKKwkJcmV0dXJuIDE7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgbWRhcykgeworCQlpZiAobWRhX2lzX2lnbm9yZWQobWRhKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHB2X2NoYW5nZV9tZXRhZGF0YWlnbm9yZShzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgdWludDMyX3QgbWRhX2lnbm9yZWQpCit7CisJY29uc3QgY2hhciAqcHZfbmFtZSA9IHB2X2Rldl9uYW1lKHB2KTsKKworCWlmIChtZGFfaWdub3JlZCAmJiAhcHZfbWRhX3VzZWRfY291bnQocHYpKSB7CisJCWxvZ19lcnJvcigiTWV0YWRhdGEgYXJlYXMgb24gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBhbHJlYWR5ICIKKwkJCSAgImlnbm9yZWQuIiwgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbWRhX2lnbm9yZWQgJiYgKHB2X21kYV91c2VkX2NvdW50KHB2KSA9PSBwdl9tZGFfY291bnQocHYpKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGFyZWFzIG9uIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgYWxyZWFkeSAiCisJCQkgICJtYXJrZWQgYXMgaW4tdXNlLiIsIHB2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXB2X21kYV9jb3VudChwdikpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGhhcyBubyBtZXRhZGF0YSAiCisJCQkgICJhcmVhcy4iLCBwdl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ZlcmJvc2UoIk1hcmtpbmcgbWV0YWRhdGEgYXJlYXMgb24gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiAiCisJCSAgICAiYXMgJXMuIiwgcHZfbmFtZSwgbWRhX2lnbm9yZWQgPyAiaWdub3JlZCIgOiAiaW4tdXNlIik7CisKKwlpZiAoIXB2X21kYV9zZXRfaWdub3JlZChwdiwgbWRhX2lnbm9yZWQpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogVXBkYXRlIHZnX21kYV9jb3BpZXMgYmFzZWQgb24gdGhlIG1kYXMgaW4gdGhpcyBQVi4KKwkgKiBUaGlzIGlzIG1vc3QgbGlrZWx5IHdoYXQgdGhlIHVzZXIgd291bGQgZXhwZWN0IC0gaWYgdGhleQorCSAqIHNwZWNpZnkgYSBzcGVjaWZpYyBQViB0byBiZSBpZ25vcmVkL3VuLWlnbm9yZWQsIHRoZXkgd2lsbAorCSAqIG1vc3QgbGlrZWx5IG5vdCB3YW50IExWTSB0byB0dXJuIGFyb3VuZCBhbmQgY2hhbmdlIHRoZQorCSAqIGlnbm9yZSAvIHVuLWlnbm9yZSB2YWx1ZSB3aGVuIGl0IHdyaXRlcyB0aGUgVkcgdG8gZGlzay4KKwkgKiBUaGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIFBWJ3MgaWdub3JlIGJpdHMgd2lsbCBiZQorCSAqIHByZXNlcnZlZCBpbiBmdXR1cmUgb3BlcmF0aW9ucy4KKwkgKi8KKwlpZiAoIWlzX29ycGhhbihwdikgJiYKKwkgICAgdmdfbWRhX2NvcGllcyhwdi0+dmcpICE9IFZHTUVUQURBVEFDT1BJRVNfVU5NQU5BR0VEKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBDaGFuZ2luZyBwcmVmZXJyZWQgbnVtYmVyIG9mIGNvcGllcyBvZiBWRyAlcyAiCisJCQkgIm1ldGFkYXRhIGZyb20gJSJQUkl1MzIiIHRvICUiUFJJdTMyLCBwdl92Z19uYW1lKHB2KSwKKwkJCSB2Z19tZGFfY29waWVzKHB2LT52ZyksIHZnX21kYV91c2VkX2NvdW50KHB2LT52ZykpOworCQl2Z19zZXRfbWRhX2NvcGllcyhwdi0+dmcsIHZnX21kYV91c2VkX2NvdW50KHB2LT52ZykpOworCX0KKworCXJldHVybiAxOworfQorCitjaGFyICp0YWdzX2Zvcm1hdF9hbmRfY29weShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqdGFnc2wpCit7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAyNTYpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9iZWdpbl9vYmplY3QgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgdGFnc2wpIHsKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgc2wtPnN0ciwgc3RybGVuKHNsLT5zdHIpKSB8fAorCQkgICAgKHNsLT5saXN0Lm4gIT0gdGFnc2wgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiLCIsIDEpKSkgeworCQkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7Cit9CisKK2NvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfY29tbWl0dGVkKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpmb3VuZF9sdjsKKworCWlmICghbHYpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFsdi0+dmctPnZnX2NvbW1pdHRlZCkKKwkJcmV0dXJuIGx2OworCisJdmcgPSBsdi0+dmctPnZnX2NvbW1pdHRlZDsKKworCWlmICghKGZvdW5kX2x2ID0gZmluZF9sdl9pbl92Z19ieV9sdmlkKHZnLCAmbHYtPmx2aWQpKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIChVVUlEICVzKSBub3QgZm91bmQgaW4gY29tbWl0dGVkIG1ldGFkYXRhLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHYtPmx2aWQucyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBmb3VuZF9sdjsKK30KKworLyoKKyAqIENoZWNrIGlmIGEgbG9ja190eXBlIHVzZXMgbHZtbG9ja2QuCisgKiBJZiBub3QgKG5vbmUsIGNsdm0pLCByZXR1cm4gMC4KKyAqIElmIHNvIChkbG0sIHNhbmxvY2spLCByZXR1cm4gMS4KKyAqLworCitpbnQgaXNfbG9ja2RfdHlwZShjb25zdCBjaGFyICpsb2NrX3R5cGUpCit7CisJaWYgKCFsb2NrX3R5cGUpCisJCXJldHVybiAwOworCWlmICghc3RyY21wKGxvY2tfdHlwZSwgImRsbSIpKQorCQlyZXR1cm4gMTsKKwlpZiAoIXN0cmNtcChsb2NrX3R5cGUsICJzYW5sb2NrIikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgdmdfc3RyaXBfb3V0ZGF0ZWRfaGlzdG9yaWNhbF9sdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpIHsKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmdsdmwsICp0Z2x2bDsKKwl0aW1lX3QgY3VycmVudF90aW1lID0gdGltZShOVUxMKTsKKwl1aW50NjRfdCB0aHJlc2hvbGQgPSBmaW5kX2NvbmZpZ190cmVlX2ludCh2Zy0+Y21kLCBtZXRhZGF0YV9sdnNfaGlzdG9yeV9yZXRlbnRpb25fdGltZV9DRkcsIE5VTEwpOworCisJaWYgKCF0aHJlc2hvbGQpCisJCXJldHVybiAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZ2x2bCwgdGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpIHsKKwkJLyoKKwkJICogUmVtb3ZhbCB0aW1lIGluIHRoZSBmdXR1cmU/IE5vdCBsaWtlbHksCisJCSAqIGJ1dCBza2lwIHRoaXMgaXRlbSBpbiBhbnkgY2FzZS4KKwkJKi8KKwkJaWYgKChjdXJyZW50X3RpbWUpIDwgZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT50aW1lc3RhbXBfcmVtb3ZlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoY3VycmVudF90aW1lIC0gZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT50aW1lc3RhbXBfcmVtb3ZlZCkgPiB0aHJlc2hvbGQpIHsKKwkJCWlmICghaGlzdG9yaWNhbF9nbHZfcmVtb3ZlKGdsdmwtPmdsdikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZXN0cm95IHJlY29yZCBhYm91dCBoaXN0b3JpY2FsIExWICVzLyVzLiIsCisJCQkJCSAgdmctPm5hbWUsIGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsb2dfdmVyYm9zZSgiT3V0ZGF0ZWQgcmVjb3JkIGZvciBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiAiCisJCQkJICAgICJhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZC4iLCBnbHZsLT5nbHYtPmhpc3RvcmljYWwtPm5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvbWV0YWRhdGEuaCBiL2xpYi9tZXRhZGF0YS9tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGMxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvbWV0YWRhdGEuaApAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIGluIGNvcmUgcmVwcmVzZW50YXRpb24gb2YgYSB2b2x1bWUgZ3JvdXAgYW5kIGl0cworICogYXNzb2NpYXRlZCBwaHlzaWNhbCBhbmQgbG9naWNhbCB2b2x1bWVzLgorICovCisKKyNpZm5kZWYgX0xWTV9NRVRBREFUQV9ICisjZGVmaW5lIF9MVk1fTUVUQURBVEFfSAorCisjaW5jbHVkZSAiY3R5cGUuaCIKKyNpbmNsdWRlICJkZXYtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKworLy8jZGVmaW5lIE1BWF9TVFJJUEVTIDEyOFUKKy8vI2RlZmluZSBTRUNUT1JfU0hJRlQgOUwKKy8vI2RlZmluZSBTRUNUT1JfU0laRSAoIDFMIDw8IFNFQ1RPUl9TSElGVCApCisvLyNkZWZpbmUgU1RSSVBFX1NJWkVfTUlOICggKHVuc2lnbmVkKSBsdm1fZ2V0cGFnZXNpemUoKSA+PiBTRUNUT1JfU0hJRlQpCS8qIFBBR0VTSVpFIGluIHNlY3RvcnMgKi8KKy8vI2RlZmluZSBTVFJJUEVfU0laRV9NQVggKCA1MTJMICogMTAyNEwgPj4gU0VDVE9SX1NISUZUKQkvKiA1MTIgS0IgaW4gc2VjdG9ycyAqLworLy8jZGVmaW5lIFNUUklQRV9TSVpFX0xJTUlUICgoVUlOVF9NQVggPj4gMikgKyAxKQorLy8jZGVmaW5lIE1BWF9SRVNUUklDVEVEX0xWUyAyNTUJLyogVXNlZCBieSBGTVRfUkVTVFJJQ1RFRF9MVklEUyAqLworI2RlZmluZSBNSU5fUEVfU0laRSAgICAgKDgxOTJMID4+IFNFQ1RPUl9TSElGVCkgLyogOCBLQiBpbiBzZWN0b3JzIC0gZm9ybWF0MSBvbmx5ICovCisjZGVmaW5lIE1BWF9QRV9TSVpFICAgICAoMTZMICogMTAyNEwgKiAoMTAyNEwgPj4gU0VDVE9SX1NISUZUKSAqIDEwMjRMKSAvKiBmb3JtYXQxIG9ubHkgKi8KKyNkZWZpbmUgTUlSUk9SX0xPR19PRkZTRVQJMgkvKiBzZWN0b3JzICovCisjZGVmaW5lIFZHX01FTVBPT0xfQ0hVTksJMTAyNDAJLyogaW4gYnl0ZXMsIGhpbnQgb25seSAqLworCisvKgorICogQ2VpbGluZyhuIC8gc3opCisgKi8KKyNkZWZpbmUgZG1fZGl2X3VwKG4sIHN6KSAoKChuKSArIChzeikgLSAxKSAvIChzeikpCisKKy8qCisgKiBDZWlsaW5nKG4gLyBzaXplKSAqIHNpemUKKyAqLworI2RlZmluZSBkbV9yb3VuZF91cChuLCBzeikgKGRtX2Rpdl91cCgobiksIChzeikpICogKHN6KSkKKworCisvKiBWYXJpb3VzIGZsYWdzICovCisvKiBTZWUgbWV0YWRhdGEtZXhwb3J0ZWQuaCBmb3IgdGhlIGNvbXBsZXRlIGxpc3QuICovCisvKiBOb3RlIHRoYXQgdGhlIGJpdHMgbm8gbG9uZ2VyIG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gTFZNMSBkaXNrIGZvcm1hdCAqLworCisvKiBNYXkgYW55IGZyZWUgZXh0ZW50cyBvbiB0aGlzIFBWIGJlIHVzZWQgb3IgbXVzdCB0aGV5IGJlIGxlZnQgZnJlZT8gKi8KKworI2RlZmluZSBTUElORE9XTl9MViAgICAgICAgICAJVUlOVDY0X0MoMHgwMDAwMDAxMCkJLyogTFYgKi8KKyNkZWZpbmUgQkFEQkxPQ0tfT04gICAgICAgCVVJTlQ2NF9DKDB4MDAwMDAwMjApCS8qIExWICovCisvLyNkZWZpbmUgVklSVFVBTAkJCVVJTlQ2NF9DKDB4MDAwMTAwMDApCS8qIExWIC0gaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgUFJFQ09NTUlUVEVECQlVSU5UNjRfQygweDAwMjAwMDAwKQkvKiBWRyAtIGludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIFBPU1RPUkRFUl9GTEFHCQlVSU5UNjRfQygweDAyMDAwMDAwKSAvKiBOb3QgcmVhbCBmbGFncywgcmVzZXJ2ZWQgZm9yICAqLworI2RlZmluZSBQT1NUT1JERVJfT1BFTl9GTEFHCVVJTlQ2NF9DKDB4MDQwMDAwMDApIC8qIHRlbXBvcmFyeSB1c2UgaW5zaWRlIHZnX3JlYWRfaW50ZXJuYWwuICovCisKKyNkZWZpbmUgU0hBUkVEICAgICAgICAgICAgCVVJTlQ2NF9DKDB4MDAwMDA4MDApCS8qIFZHICovCisKKy8qIEZvcm1hdCBmZWF0dXJlcyBmbGFncyAqLworI2RlZmluZSBGTVRfUFJFQ09NTUlUCQkweDAwMDAwMDQwVQkvKiBTdXBwb3J0cyBwcmUtY29tbWl0PyAqLworCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWU7CitzdHJ1Y3QgbWV0YWRhdGFfYXJlYTsKK3N0cnVjdCBhbGxvY19oYW5kbGU7CitzdHJ1Y3QgbHZtY2FjaGVfaW5mbzsKK3N0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YTsKKworLyogUGVyLWZvcm1hdCBwZXItbWV0YWRhdGEgYXJlYSBvcGVyYXRpb25zICovCitzdHJ1Y3QgbWV0YWRhdGFfYXJlYV9vcHMgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqKCp2Z19yZWFkKSAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqIGZpLAorCQkJCQkgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCQkJIHN0cnVjdCBtZXRhZGF0YV9hcmVhICogbWRhLAorCQkJCQkgc3RydWN0IGNhY2hlZF92Z19mbXRkYXRhICoqdmdfZm10ZGF0YSwKKwkJCQkJIHVuc2lnbmVkICp1c2VfcHJldmlvdXNfdmcsCisJCQkJCSBpbnQgc2luZ2xlX2RldmljZSk7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqKCp2Z19yZWFkX3ByZWNvbW1pdCkgKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKiBmaSwKKwkJCQkJIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJCSBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqIG1kYSwKKwkJCQkJIHN0cnVjdCBjYWNoZWRfdmdfZm10ZGF0YSAqKnZnX2ZtdGRhdGEsCisJCQkJCSB1bnNpZ25lZCAqdXNlX3ByZXZpb3VzX3ZnKTsKKwkvKgorCSAqIFdyaXRlIG91dCBjb21wbGV0ZSBWRyBtZXRhZGF0YS4gIFlvdSBtdXN0IGVuc3VyZSBpbnRlcm5hbAorCSAqIGNvbnNpc3RlbmN5IGJlZm9yZSBjYWxsaW5nLiBlZy4gUEVzIGNhbid0IHJlZmVyIHRvIFBWcyBub3QKKwkgKiBwYXJ0IG9mIHRoZSBWRy4KKwkgKgorCSAqIEl0IGlzIGFsc28gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZW5zdXJlIGV4dGVybmFsCisJICogY29uc2lzdGVuY3ksIGVnIGJ5IGNhbGxpbmcgcHZfd3JpdGUoKSBpZiByZW1vdmluZyBQVnMgZnJvbQorCSAqIGEgVkcgb3IgY2FsbGluZyB2Z193cml0ZSgpIGEgc2Vjb25kIHRpbWUgaWYgc3BsaXR0aW5nIGEgVkcKKwkgKiBpbnRvIHR3by4KKwkgKgorCSAqIHZnX3dyaXRlKCkgc2hvdWxkIG5vdCByZWFkIG9yIHdyaXRlIGZyb20gYW55IFBWcyBub3QgaW5jbHVkZWQKKwkgKiBpbiB0aGUgdm9sdW1lX2dyb3VwIHN0cnVjdHVyZSBpdCBpcyBoYW5kZWQuCisJICogKGZvcm1hdDEgY3VycmVudGx5IGJyZWFrcyB0aGlzIHJ1bGUuKQorCSAqLworCWludCAoKnZnX3dyaXRlKSAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqIGZpZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqIHZnLAorCQkJIHN0cnVjdCBtZXRhZGF0YV9hcmVhICogbWRhKTsKKwlpbnQgKCp2Z19wcmVjb21taXQpIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmlkLAorCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICogdmcsCisJCQkgICAgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICogbWRhKTsKKwlpbnQgKCp2Z19jb21taXQpIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmlkLAorCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICogdmcsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICogbWRhKTsKKwlpbnQgKCp2Z19yZXZlcnQpIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmlkLAorCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICogdmcsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICogbWRhKTsKKwlpbnQgKCp2Z19yZW1vdmUpIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmksIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKiB2ZywKKwkJCSAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKiBtZGEpOworCisJLyoKKwkgKiBQZXIgbG9jYXRpb24gY29weSBjb25zdHJ1Y3Rvci4KKwkgKi8KKwl2b2lkICooKm1kYV9tZXRhZGF0YV9sb2NuX2NvcHkpIChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB2b2lkICptZXRhZGF0YV9sb2NuKTsKKworCS8qCisJICogUGVyIGxvY2F0aW9uIGRlc2NyaXB0aW9uIGZvciBsb2dnaW5nLgorCSAqLworCWNvbnN0IGNoYXIgKigqbWRhX21ldGFkYXRhX2xvY25fbmFtZSkgKHZvaWQgKm1ldGFkYXRhX2xvY24pOworCXVpbnQ2NF90ICgqbWRhX21ldGFkYXRhX2xvY25fb2Zmc2V0KSAodm9pZCAqbWV0YWRhdGFfbG9jbik7CisKKwkvKgorCSAqIFJldHVybnMgbnVtYmVyIG9mIGZyZWUgc2VjdG9ycyBpbiBnaXZlbiBtZXRhZGF0YSBhcmVhLgorCSAqLworCXVpbnQ2NF90ICgqbWRhX2ZyZWVfc2VjdG9ycykgKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpOworCisJLyoKKwkgKiBSZXR1cm5zIG51bWJlciBvZiB0b3RhbCBzZWN0b3JzIGluIGdpdmVuIG1ldGFkYXRhIGFyZWEuCisJICovCisJdWludDY0X3QgKCptZGFfdG90YWxfc2VjdG9ycykgKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpOworCisJLyoKKwkgKiBDaGVjayBpZiBtZXRhZGF0YSBhcmVhIGJlbG9uZ3MgdG8gdmcKKwkgKi8KKwlpbnQgKCptZGFfaW5fdmcpIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmksCisJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqIHZnLCBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKTsKKwkvKgorCSAqIEFuYWx5emUgYSBtZXRhZGF0YSBhcmVhIG9uIGEgUFYuCisJICovCisJaW50ICgqcHZfYW5hbHl6ZV9tZGEpIChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQsCisJCQkgICAgICAgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSk7CisKKwkvKgorCSAqIERvIHRoZXNlIHR3byBtZXRhZGF0YV9hcmVhIHN0cnVjdHVyZXMgbWF0Y2ggd2l0aCByZXNwZWN0IHRvCisJICogdGhlaXIgdW5kZXJseWluZyBsb2NhdGlvbj8KKwkgKi8KKwl1bnNpZ25lZCAoKm1kYV9sb2Nuc19tYXRjaCkoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTEsCisJCQkJICAgIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEyKTsKKworCXN0cnVjdCBkZXZpY2UgKigqbWRhX2dldF9kZXZpY2UpKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEpOworCWludCAoKm1kYV9leHBvcnRfdGV4dCkoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQpOworCWludCAoKm1kYV9pbXBvcnRfdGV4dCkoc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24pOworfTsKKworI2RlZmluZSBNREFfSUdOT1JFRCAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTURBX0lOQ09OU0lTVEVOVCAweDAwMDAwMDAyCisjZGVmaW5lIE1EQV9GQUlMRUQgICAgICAgMHgwMDAwMDAwNAorCitzdHJ1Y3QgbWV0YWRhdGFfYXJlYSB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYV9vcHMgKm9wczsKKwl2b2lkICptZXRhZGF0YV9sb2NuOworCXVpbnQzMl90IHN0YXR1czsKK307CitzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhX2NvcHkoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgICBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhKTsKKwordW5zaWduZWQgbWRhX2lzX2lnbm9yZWQoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSk7Cit2b2lkIG1kYV9zZXRfaWdub3JlZChzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCB1bnNpZ25lZCBpZ25vcmVkKTsKK3Vuc2lnbmVkIG1kYV9sb2Nuc19tYXRjaChzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhMSwgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTIpOworc3RydWN0IGRldmljZSAqbWRhX2dldF9kZXZpY2Uoc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSk7CisKK3N0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4IHsKKwl1aW50MzJfdCB0eXBlOworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqcHZfaWQ7CisJCXN0cnVjdCB7CisJCQljb25zdCBjaGFyICp2Z19uYW1lOworCQkJY29uc3QgY2hhciAqdmdfaWQ7CisJCX0gdmdfcmVmOworCQl2b2lkICpwcml2YXRlOworCX0gY29udGV4dDsKK307CisKK3N0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmFsbG9jX2ZpZChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBmb3JtYXRfaW5zdGFuY2VfY3R4ICpmaWMpOworCisvKgorICogRm9ybWF0IGluc3RhbmNlIG11c3QgYWx3YXlzIGJlIHNldCB1c2luZyBwdl9zZXRfZmlkIG9yIHZnX3NldF9maWQKKyAqIChOVUxMIHZhbHVlIGFzIHdlbGwpLCBuZXZlciBhc2lnbiBpdCBkaXJlY3RseSEgVGhpcyBpcyBlc3NlbnRpYWwKKyAqIGZvciBwcm9wZXIgcmVmZXJlbmNlIGNvdW50aW5nIGZvciB0aGUgZm9ybWF0IGluc3RhbmNlLgorICovCit2b2lkIHB2X3NldF9maWQoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCk7Cit2b2lkIHZnX3NldF9maWQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCk7CisKKy8qIEZJWE1FOiBBZGQgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIG1kYSBjb3VudHMgYmFzZWQgb24gZ2l2ZW4ga2V5LiAqLworaW50IGZpZF9hZGRfbWRhKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYSwKKwkJY29uc3QgY2hhciAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgdW5zaWduZWQgc3ViX2tleSk7CitpbnQgZmlkX2FkZF9tZGFzKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCwgc3RydWN0IGRtX2xpc3QgKm1kYXMsCisJCSBjb25zdCBjaGFyICprZXksIHNpemVfdCBrZXlfbGVuKTsKK2ludCBmaWRfcmVtb3ZlX21kYShzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICpmaWQsIHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsCisJCSAgIGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IHVuc2lnbmVkIHN1Yl9rZXkpOworc3RydWN0IG1ldGFkYXRhX2FyZWEgKmZpZF9nZXRfbWRhX2luZGV4ZWQoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQljb25zdCBjaGFyICprZXksIHNpemVfdCBrZXlfbGVuLCBjb25zdCB1bnNpZ25lZCBzdWJfa2V5KTsKK2ludCBtZGFzX2VtcHR5X29yX2lnbm9yZWQoc3RydWN0IGRtX2xpc3QgKm1kYXMpOworCisjZGVmaW5lIHNlZ19wdnNlZyhzZWcsIHMpCShzZWcpLT5hcmVhc1socyldLnUucHYucHZzZWcKKyNkZWZpbmUgc2VnX2RldihzZWcsIHMpCQkoc2VnKS0+YXJlYXNbKHMpXS51LnB2LnB2c2VnLT5wdi0+ZGV2CisjZGVmaW5lIHNlZ19wZShzZWcsIHMpCQkoc2VnKS0+YXJlYXNbKHMpXS51LnB2LnB2c2VnLT5wZQorI2RlZmluZSBzZWdfbGUoc2VnLCBzKQkJKHNlZyktPmFyZWFzWyhzKV0udS5sdi5sZQorI2RlZmluZSBzZWdfbWV0YWxlKHNlZywgcykJKHNlZyktPm1ldGFfYXJlYXNbKHMpXS51Lmx2LmxlCisKK3N0cnVjdCBuYW1lX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBtZGFfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlX2FyZWEgbWRhOworfTsKKworc3RydWN0IHBlZ19saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBwdl9zZWdtZW50ICpwZWc7Cit9OworCitzdHJ1Y3Qgc2VnX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJdW5zaWduZWQgY291bnQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKK307CisKKy8qCisgKiBPd25lcnNoaXAgb2Ygb2JqZWN0cyBwYXNzZXMgdG8gY2FsbGVyLgorICovCitzdHJ1Y3QgZm9ybWF0X2hhbmRsZXIgeworCS8qCisJICogU2NhbiBhbnkgbWV0YWRhdGEgYXJlYXMgdGhhdCBhcmVuJ3QgcmVmZXJlbmNlZCBpbiBQViBsYWJlbHMKKwkgKi8KKwlpbnQgKCpzY2FuKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICogZm10LCBjb25zdCBjaGFyICp2Z25hbWUpOworCisJLyoKKwkgKiBSZXR1cm4gUFYgd2l0aCBnaXZlbiBwYXRoLgorCSAqLworCWludCAoKnB2X3JlYWQpIChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJCQlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICogcHYsIGludCBzY2FuX2xhYmVsX29ubHkpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIGEgbmV3IFBWLgorCSAqLworCWludCAoKnB2X2luaXRpYWxpc2UpIChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQsCisJCQkgICAgICBzdHJ1Y3QgcHZfY3JlYXRlX2FyZ3MgKnB2YSwKKwkJCSAgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKiBwdik7CisKKwkvKgorCSAqIFR3ZWFrIGFuIGFscmVhZHkgZmlsbGVkIG91dCBhIHB2IHJlYWR5IGZvciBpbXBvcnRpbmcgaW50byBhCisJICogdmcuICBlZy4gcGVfY291bnQgaXMgZm9ybWF0IHNwZWNpZmljLgorCSAqLworCWludCAoKnB2X3NldHVwKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICogZm10LAorCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKiBwdiwKKwkJCSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICogdmcpOworCisJLyoKKwkgKiBBZGQgbWV0YWRhdGEgYXJlYSB0byBhIFBWLiBDaGFuZ2VzIHdpbGwgdGFrZSBlZmZlY3Qgb24gcHZfd3JpdGUuCisJICovCisJaW50ICgqcHZfYWRkX21ldGFkYXRhX2FyZWEpIChjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQsCisJCQkJICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICogcHYsCisJCQkJICAgICBpbnQgcGVfc3RhcnRfbG9ja2VkLAorCQkJCSAgICAgdW5zaWduZWQgbWV0YWRhdGFfaW5kZXgsCisJCQkJICAgICB1aW50NjRfdCBtZXRhZGF0YV9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgbWV0YWRhdGFfaWdub3JlZCk7CisKKwkvKgorCSAqIFJlbW92ZSBtZXRhZGF0YSBhcmVhIGZyb20gYSBQVi4gQ2hhbmdlcyB3aWxsIHRha2UgZWZmZWN0IG9uIHB2X3dyaXRlLgorCSAqLworCWludCAoKnB2X3JlbW92ZV9tZXRhZGF0YV9hcmVhKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCQl1bnNpZ25lZCBtZXRhZGF0YV9pbmRleCk7CisKKwkvKgorCSAqIFJlY2FsY3VsYXRlIHRoZSBQViBzaXplIHRha2luZyBpbnRvIGFjY291bnQgYW55IGV4aXN0aW5nIG1ldGFkYXRhIGFyZWFzLgorCSAqLworCWludCAoKnB2X3Jlc2l6ZSkgKGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCSAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHVpbnQ2NF90IHNpemUpOworCisJLyoKKwkgKiBXcml0ZSBhIFBWIHN0cnVjdHVyZSB0byBkaXNrLiBGYWlscyBpZiB0aGUgUFYgaXMgaW4gYSBWRyBpZQorCSAqIHB2LT52Z19uYW1lIG11c3QgYmUgYSB2YWxpZCBvcnBoYW4gVkcgbmFtZQorCSAqLworCWludCAoKnB2X3dyaXRlKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICogZm10LAorCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKiBwdik7CisKKwkvKgorCSAqIENoZWNrIGlmIFBWIG5lZWRzIHJld3JpdGluZy4gVGhpcyBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueQorCSAqIGZvcm1hdC1zcGVjaWZpYyBjaGFuZ2VzICBiZWZvcmUgYWN0dWFsbHkgd3JpdGluZyB0aGUgUFYgKGJ5IGNhbGxpbmcgcHZfd3JpdGUpLgorCSAqIFdpdGggdGhpcywgd2UgY2FuIGNhbGwgcHZfd3JpdGUgY29uZGl0aW9uYWxseSBvbmx5IGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KKwkgKi8KKwlpbnQgKCpwdl9uZWVkc19yZXdyaXRlKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSBpbnQgKm5lZWRzX3Jld3JpdGUpOworCisJLyoKKwkgKiBUd2VhayBhbiBhbHJlYWR5IGZpbGxlZCBvdXQgYSBsdiBlZywgY2hlY2sgdGhlcmUKKwkgKiBhcmVuJ3QgdG9vIG1hbnkgZXh0ZW50cy4KKwkgKi8KKwlpbnQgKCpsdl9zZXR1cCkgKHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKiBmaSwKKwkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKiBsdik7CisKKwkvKgorCSAqIFR3ZWFrIGFuIGFscmVhZHkgZmlsbGVkIG91dCB2Zy4gIGVnLCBtYXhfcHYgaXMgZm9ybWF0CisJICogc3BlY2lmaWMuCisJICovCisJaW50ICgqdmdfc2V0dXApIChzdHJ1Y3QgZm9ybWF0X2luc3RhbmNlICogZmksIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKiB2Zyk7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgcGFydGljdWxhciBzZWdtZW50IHR5cGUgaXMgc3VwcG9ydGVkLgorCSAqLworCWludCAoKnNlZ3R5cGVfc3VwcG9ydGVkKSAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkLAorCQkJCSAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSk7CisKKwkvKgorCSAqIENyZWF0ZSBmb3JtYXQgaW5zdGFuY2Ugd2l0aCBhIHBhcnRpY3VsYXIgbWV0YWRhdGEgYXJlYQorCSAqLworCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKigqY3JlYXRlX2luc3RhbmNlKSAoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsCisJCQkJCQkgICAgY29uc3Qgc3RydWN0IGZvcm1hdF9pbnN0YW5jZV9jdHggKmZpYyk7CisKKwkvKgorCSAqIERlc3RydWN0b3IgZm9yIGZvcm1hdCBpbnN0YW5jZQorCSAqLworCXZvaWQgKCpkZXN0cm95X2luc3RhbmNlKSAoc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqIGZpZCk7CisKKwkvKgorCSAqIERlc3RydWN0b3IgZm9yIGZvcm1hdCB0eXBlCisJICovCisJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgZm9ybWF0X3R5cGUgKiBmbXQpOworfTsKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KK3Vuc2lnbmVkIGxvbmcgc2V0X3BlX2FsaWduKHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCB1bnNpZ25lZCBsb25nIGRhdGFfYWxpZ25tZW50KTsKK3Vuc2lnbmVkIGxvbmcgc2V0X3BlX2FsaWduX29mZnNldChzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0KTsKKworaW50IHB2X3dyaXRlX29ycGhhbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworCitzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdmNyZWF0ZV92b2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHAsIGludCB3cml0ZV9ub3cpOworCitpbnQgY2hlY2tfZGV2X2Jsb2NrX3NpemVfZm9yX3ZnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJdW5zaWduZWQgaW50ICptYXhfcGh5c19ibG9ja19zaXplX2ZvdW5kKTsKKworLyogTWFuaXB1bGF0ZSBQViBzdHJ1Y3R1cmVzICovCitpbnQgcHZfYWRkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CitpbnQgcHZfcmVtb3ZlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CitzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdl9maW5kKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpwdl9uYW1lKTsKKworLyogRmluZCBhIFBWIHdpdGhpbiBhIGdpdmVuIFZHICovCitpbnQgZ2V0X3B2X2Zyb21fdmdfYnlfaWQoY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgY29uc3QgY2hhciAqdmdpZCwgY29uc3QgY2hhciAqcHZpZCwKKwkJCSBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9sdl9pbl92Z19ieV9sdmlkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICAgIGNvbnN0IHVuaW9uIGx2aWQgKmx2aWQpOworCitzdHJ1Y3QgbHZfbGlzdCAqZmluZF9sdl9pbl9sdl9saXN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpsbCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworLyogUmV0dXJuIHRoZSBWRyB0aGF0IGNvbnRhaW5zIGEgZ2l2ZW4gTFYgKGJhc2VkIG9uIHBhdGggZ2l2ZW4gaW4gbHZfbmFtZSkgKi8KKy8qIG9yIGVudmlyb25tZW50IHZhciAqLworc3RydWN0IHZvbHVtZV9ncm91cCAqZmluZF92Z193aXRoX2x2KGNvbnN0IGNoYXIgKmx2X25hbWUpOworCisvKiBGaW5kIExWIHdpdGggZ2l2ZW4gbHZpZCAodXNlZCBkdXJpbmcgYWN0aXZhdGlvbikgKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfZnJvbV9sdmlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBjb25zdCBjaGFyICpsdmlkX3MsCisJCQkJICAgIHVuc2lnbmVkIHByZWNvbW1pdHRlZCk7CisKKy8qIEZJWE1FIE1lcmdlIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIG9uZXMgYWJvdmUgKi8KK3N0cnVjdCBwaHlzaWNhbF92b2x1bWUgKmZpbmRfcHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKK3N0cnVjdCBwdl9saXN0ICpmaW5kX3B2X2luX3B2X2xpc3QoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnBsLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKKworLyogRmluZCBMViBzZWdtZW50IGNvbnRhaW5pbmcgZ2l2ZW4gTEUgKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpmaW5kX3NlZ19ieV9sZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBsZSk7CisKKy8qIEZpbmQgcG9vbCBMViBzZWdtZW50IGdpdmVuIGEgdGhpbiBwb29sIGRhdGEgb3IgbWV0YWRhdGEgc2VnbWVudC4gKi8KK3N0cnVjdCBsdl9zZWdtZW50ICpmaW5kX3Bvb2xfc2VnKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworCisvKiBGaW5kIHNvbWUgdW51c2VkIGRldmljZV9pZCBmb3IgdGhpbiBwb29sIExWIHNlZ21lbnQuICovCit1aW50MzJfdCBnZXRfZnJlZV9wb29sX2RldmljZV9pZChzdHJ1Y3QgbHZfc2VnbWVudCAqdGhpbl9wb29sX3NlZyk7CisKKy8qIENoZWNrIGlmIHRoZSBuZXcgdGhpbi1wb29sIGNvdWxkIGJlIHVzZWQgZm9yIGx2bTIgdGhpbiB2b2x1bWVzICovCitpbnQgY2hlY2tfbmV3X3RoaW5fcG9vbChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYpOworCisvKgorICogUmVtb3ZlIGEgZGV2X2RpciBpZiBwcmVzZW50LgorICovCitjb25zdCBjaGFyICpzdHJpcF9kaXIoY29uc3QgY2hhciAqdmdfbmFtZSwgY29uc3QgY2hhciAqZGlyKTsKKworc3RydWN0IGxvZ2ljYWxfdm9sdW1lICphbGxvY19sdihzdHJ1Y3QgZG1fcG9vbCAqbWVtKTsKKworLyoKKyAqIENoZWNrcyB0aGF0IGFuIGx2IGhhcyBubyBnYXBzIG9yIG92ZXJsYXBwaW5nIHNlZ21lbnRzLgorICogU2V0IGNvbXBsZXRlX3ZnIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBWRyBsZXZlbCBjaGVja3MuCisgKi8KK2ludCBjaGVja19sdl9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgY29tcGxldGVfdmcpOworCisvKgorICogRG9lcyBldmVyeSBMViBzZWdtZW50IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHN0cmlwZXM/CisgKi8KK2ludCBsdl9oYXNfY29uc3RhbnRfc3RyaXBlcyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworLyoKKyAqIENoZWNrcyB0aGF0IGEgcmVwbGljYXRvciBzZWdtZW50IGlzIGNvcnJlY3QuCisgKi8KK2ludCBjaGVja19yZXBsaWNhdG9yX3NlZ21lbnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnJlcGxpY2F0b3Jfc2VnKTsKKworLyoKKyAqIFNvbWV0aW1lcyAoZWcsIGFmdGVyIGFuIGx2ZXh0ZW5kKSwgaXQgaXMgcG9zc2libGUgdG8gbWVyZ2UgdHdvCisgKiBhZGphY2VudCBzZWdtZW50cyBpbnRvIGEgc2luZ2xlIHNlZ21lbnQuICBUaGlzIGZ1bmN0aW9uIHRyeXMKKyAqIHRvIG1lcmdlIGFzIG1hbnkgc2VnbWVudHMgYXMgcG9zc2libGUuCisgKi8KK2ludCBsdl9tZXJnZV9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworLyoKKyAqIEVuc3VyZSB0aGVyZSdzIGEgc2VnbWVudCBib3VuZGFyeSBhdCBhIGdpdmVuIExFLCBzcGxpdHRpbmcgaWYgbmVjZXNzYXJ5CisgKi8KK2ludCBsdl9zcGxpdF9zZWdtZW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGxlKTsKKworLyoKKyAqIEFkZC9yZW1vdmUgdXB3YXJkIGxpbmsgZnJvbSB1bmRlcmx5aW5nIExWIHRvIHRoZSBzZWdtZW50IHVzaW5nIGl0CisgKiBGSVhNRTogcmlkaWN1bG91c2x5IGxvbmcgbmFtZQorICovCitpbnQgYWRkX3NlZ190b19zZWdzX3VzaW5nX3RoaXNfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyk7CitpbnQgcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKTsKKworaW50IGFkZF9nbHZfdG9faW5kaXJlY3RfZ2x2cyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICBzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2dsdiwKKwkJCSAgICAgc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKnVzZXJfZ2x2KTsKK2ludCByZW1vdmVfZ2x2X2Zyb21faW5kaXJlY3RfZ2x2cyhzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqZ2x2LAorCQkJCSAgc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKnVzZXJfZ2x2KTsKKworaW50IGZvcl9lYWNoX3N1Yl9sdl9leGNlcHRfcG9vbHMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgaW50ICgqZm4pKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHZvaWQgKmRhdGEpLAorCQkJCSB2b2lkICpkYXRhKTsKK2ludCBmb3JfZWFjaF9zdWJfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIGludCAoKmZuKShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKSwKKwkJICAgIHZvaWQgKmRhdGEpOworCitpbnQgbW92ZV9sdl9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X3RvLAorCQkgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfZnJvbSwKKwkJICAgICB1aW50NjRfdCBzZXRfc3RhdHVzLCB1aW50NjRfdCByZXNldF9zdGF0dXMpOworCisvKgorICogQ2FsY3VsYXRlIHJlYWRhaGVhZCBmcm9tIHVuZGVybHlpbmcgUFYgZGV2aWNlcworICovCit2b2lkIGx2X2NhbGN1bGF0ZV9yZWFkYWhlYWQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDMyX3QgKnJlYWRfYWhlYWQpOworCisvKgorICogRm9yIGludGVybmFsIG1ldGFkYXRhIGNhY2hpbmcuCisgKi8KK3NpemVfdCBleHBvcnRfdmdfdG9fYnVmZmVyKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjaGFyICoqYnVmKTsKK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZXhwb3J0X3ZnX3RvX2NvbmZpZ190cmVlKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKmltcG9ydF92Z19mcm9tX2J1ZmZlcihjb25zdCBjaGFyICpidWYsCisJCQkJCSAgIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCk7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICppbXBvcnRfdmdfZnJvbV9jb25maWdfdHJlZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCk7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwICppbXBvcnRfdmdfZnJvbV9sdm1ldGFkX2NvbmZpZ190cmVlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkJCXN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgKmZpZCk7CisKKy8qCisgKiBNaXJyb3JpbmcgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIEdpdmVuIG1pcnJvciBpbWFnZSBvciBtaXJyb3IgbG9nIHNlZ21lbnQsIGZpbmQgY29ycmVzcG9uZGluZyBtaXJyb3Igc2VnbWVudCAKKyAqLworaW50IGZpeHVwX2ltcG9ydGVkX21pcnJvcnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCisvKgorICogRnJvbSB0aGluX21hbmlwLmMKKyAqLworaW50IGF0dGFjaF9wb29sX2x2KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW5fbHYsCisJCSAgIHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICppbmRpcmVjdF9vcmlnaW4sCisJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWVyZ2VfbHYpOworaW50IGRldGFjaF9wb29sX2x2KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpOworaW50IGF0dGFjaF9wb29sX21lc3NhZ2Uoc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnLCBkbV90aGluX21lc3NhZ2VfdCB0eXBlLAorCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDMyX3QgZGVsZXRlX2lkLAorCQkJaW50IGF1dG9faW5jcmVtZW50KTsKK2ludCBsdl9pc19tZXJnaW5nX3RoaW5fc25hcHNob3QoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgcG9vbF9oYXNfbWVzc2FnZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGRldmljZV9pZCk7CitpbnQgcG9vbF9iZWxvd190aHJlc2hvbGQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnKTsKK2ludCBwb29sX2NoZWNrX292ZXJwcm92aXNpb25pbmcoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgY3JlYXRlX3Bvb2woc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHVpbnQzMl90IHN0cmlwZXMsIHVpbnQzMl90IHN0cmlwZV9zaXplKTsKKworLyoKKyAqIEJlZ2luIHNrZWxldG9uIGZvciBleHRlcm5hbCBMVk0gbGlicmFyeQorICovCitzdHJ1Y3QgaWQgcHZfaWQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpwdl9mb3JtYXRfdHlwZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CitzdHJ1Y3QgaWQgcHZfdmdpZChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CisKK3VpbnQ2NF90IGZpbmRfbWluX21kYV9zaXplKHN0cnVjdCBkbV9saXN0ICptZGFzKTsKK2NoYXIgKnRhZ3NfZm9ybWF0X2FuZF9jb3B5KHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBkbV9saXN0ICp0YWdzbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL21pcnJvci5jIGIvbGliL21ldGFkYXRhL21pcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhN2JlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvbWlycm9yLmMKQEAgLTAsMCArMSwyMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJsdl9hbGxvYy5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIJLyogRklYTUUgU2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoaXMgZmlsZSAqLworCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGRlZmF1bHRzLmg/ICovCisKKy8qIFRoZXNlIGFyZSBuZWNlc3NhcnkgZm9yIF93cml0ZV9sb2dfaGVhZGVyKCkgKi8KKyNpbmNsdWRlICJ4bGF0ZS5oIgorI2RlZmluZSBNSVJST1JfTUFHSUMgMHg0RDY5NTI3MgorI2RlZmluZSBNSVJST1JfRElTS19WRVJTSU9OIDIKKworLyogVGhlc2UgYXJlIHRoZSBmbGFncyB0aGF0IHJlcHJlc2VudCB0aGUgbWlycm9yIGZhaWx1cmUgcmVzdG9yYXRpb24gcG9saWNpZXMgKi8KKyNkZWZpbmUgTUlSUk9SX1JFTU9WRQkJIDAKKyNkZWZpbmUgTUlSUk9SX0FMTE9DQVRFCQkgMQorI2RlZmluZSBNSVJST1JfQUxMT0NBVEVfQU5ZV0hFUkUgMgorCisvKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBsdiBpcyB0ZW1wb3JhcnkgbWlycm9yIGxheWVyIGZvciByZXN5bmMKKyAqLworaW50IGlzX3RlbXBvcmFyeV9taXJyb3JfbGF5ZXIoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpZiAobHZfaXNfbWlycm9yX2ltYWdlKGx2KSAmJiBsdl9pc19taXJyb3JlZChsdikgJiYgIWx2X2lzX2xvY2tlZChsdikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSB0ZW1wb3JhcnkgTFYgZm9yIHJlc3luY2luZyBhZGRlZCBtaXJyb3IgaW1hZ2UuCisgKiBBZGQgb3RoZXIgbWlycm9yIGxlZ3MgdG8gbHZzIGxpc3QuCisgKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF90ZW1wb3JhcnlfbWlycm9yKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmICghbHZfaXNfbWlycm9yZWQobHYpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwkvKiBUZW1wb3JhcnkgbWlycm9yIGlzIGFsd2F5cyBhcmVhX251bSA9PSAwICovCisJaWYgKHNlZ190eXBlKHNlZywgMCkgPT0gQVJFQV9MViAmJgorCSAgICBpc190ZW1wb3JhcnlfbWlycm9yX2xheWVyKHNlZ19sdihzZWcsIDApKSkKKwkJcmV0dXJuIHNlZ19sdihzZWcsIDApOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBjbHVzdGVyX21pcnJvcl9pc19hdmFpbGFibGUKKyAqCisgKiBDaGVjayBpZiB0aGUgcHJvcGVyIGtlcm5lbCBtb2R1bGUgYW5kIGxvZyBkYWVtb24gYXJlIHJ1bm5pbmcuCisgKiBDYWxsZXIgc2hvdWxkIGNoZWNrIGZvciAndmdfaXNfY2x1c3RlcmVkKGx2LT52ZyknIGJlZm9yZSBtYWtpbmcKKyAqIHRoaXMgY2FsbC4KKyAqCisgKiBSZXR1cm5zOiAxIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UKKyAqLworaW50IGNsdXN0ZXJfbWlycm9yX2lzX2F2YWlsYWJsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKyAgICAgICB1bnNpZ25lZCBhdHRyID0gMDsKKyAgICAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCisgICAgICAgaWYgKCEoc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgU0VHX1RZUEVfTkFNRV9NSVJST1IpKSkKKyAgICAgICAgICAgICAgIHJldHVybl8wOworCisgICAgICAgaWYgKCFzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KQorICAgICAgICAgICAgICAgcmV0dXJuXzA7CisKKyAgICAgICBpZiAoIXNlZ3R5cGUtPm9wcy0+dGFyZ2V0X3ByZXNlbnQoY21kLCBOVUxMLCAmYXR0cikpCisgICAgICAgICAgICAgICByZXR1cm5fMDsKKworICAgICAgIGlmICghKGF0dHIgJiBNSVJST1JfTE9HX0NMVVNURVJFRCkpCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgIHJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pcnJvcnMgb2YgdGhlIExWCisgKi8KK3VpbnQzMl90IGx2X21pcnJvcl9jb3VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJdWludDMyX3QgcywgbWlycm9yczsKKworCWlmICghbHZfaXNfbWlycm9yZWQobHYpKQorCQlyZXR1cm4gMTsKKworCXNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwkvKiBGSVhNRTogUkFJRDEwIG9ubHkgc3VwcG9ydHMgMiBjb3BpZXMgcmlnaHQgbm93ICovCisJaWYgKHNlZ19pc19yYWlkMTAoc2VnKSkKKwkJcmV0dXJuIDI7CisKKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkKKwkJcmV0dXJuIHNlZy0+YXJlYV9jb3VudDsKKworCW1pcnJvcnMgPSAwOworCisJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpCisJCQljb250aW51ZTsKKwkJaWYgKGlzX3RlbXBvcmFyeV9taXJyb3JfbGF5ZXIoc2VnX2x2KHNlZywgcykpKQorCQkJbWlycm9ycyArPSBsdl9taXJyb3JfY291bnQoc2VnX2x2KHNlZywgcykpOworCQllbHNlCisJCQltaXJyb3JzKys7CisJfQorCisJcmV0dXJuIG1pcnJvcnMgPyBtaXJyb3JzIDogMTsKK30KKworc3RydWN0IGx2X3NlZ21lbnQgKmZpbmRfbWlycm9yX3NlZyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICptaXJyb3Jfc2VnOworCisJbWlycm9yX3NlZyA9IGdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihzZWctPmx2KTsKKworCWlmICghbWlycm9yX3NlZykgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIG1pcnJvcl9zZWcgZm9yICVzIiwgc2VnLT5sdi0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghc2VnX2lzX21pcnJvcmVkKG1pcnJvcl9zZWcpKSB7CisJCWxvZ19lcnJvcigiJXMgb24gJXMgaXMgbm90IGEgbWlycm9yIHNlZ21lbnRzIiwKKwkJCSAgbWlycm9yX3NlZy0+bHYtPm5hbWUsIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbWlycm9yX3NlZzsKK30KKworLyoKKyAqIFJlZHVjZSB0aGUgcmVnaW9uIHNpemUgaWYgbmVjZXNzYXJ5IHRvIGVuc3VyZQorICogdGhlIHZvbHVtZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHJlZ2lvbiBzaXplLgorICoKKyAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSBsb2cgb25seSBpbiB2ZXJib3NlIG1vZGUKKyAqLwordWludDMyX3QgYWRqdXN0ZWRfbWlycm9yX3JlZ2lvbl9zaXplKHVpbnQzMl90IGV4dGVudF9zaXplLCB1aW50MzJfdCBleHRlbnRzLAorCQkJCSAgICAgdWludDMyX3QgcmVnaW9uX3NpemUsIGludCBpbnRlcm5hbCwgaW50IGNsdXN0ZXJlZCkKK3sKKwl1aW50NjRfdCByZWdpb25fbWF4OworCXVpbnQ2NF90IHJlZ2lvbl9taW4sIHJlZ2lvbl9taW5fcG93MjsKKworCXJlZ2lvbl9tYXggPSAoVUlOVDY0X0MoMSkgPDwgKGZmcygoaW50KWV4dGVudHMpIC0gMSkpICogKFVJTlQ2NF9DKDEpIDw8IChmZnMoKGludClleHRlbnRfc2l6ZSkgLSAxKSk7CisKKwlpZiAocmVnaW9uX21heCA8IFVJTlQzMl9NQVggJiYgcmVnaW9uX3NpemUgPiByZWdpb25fbWF4KSB7CisJCXJlZ2lvbl9zaXplID0gKHVpbnQzMl90KSByZWdpb25fbWF4OworCQlpZiAoIWludGVybmFsKQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlVzaW5nIHJlZHVjZWQgbWlycm9yIHJlZ2lvbiBzaXplIG9mICUiCisJCQkJCQlQUkl1MzIgIiBzZWN0b3JzLiIsIHJlZ2lvbl9zaXplKTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCQlsb2dfdmVyYm9zZSgiVXNpbmcgcmVkdWNlZCBtaXJyb3IgcmVnaW9uIHNpemUgb2YgJSIKKwkJCQkgICAgUFJJdTMyICIgc2VjdG9ycy4iLCByZWdpb25fc2l6ZSk7CisJfQorCisjaWZkZWYgQ01JUlJPUl9SRUdJT05fQ09VTlRfTElNSVQKKwlpZiAoY2x1c3RlcmVkKSB7CisJCS8qCisJCSAqIFRoZSBDUEcgY29kZSB1c2VkIGJ5IGNsdXN0ZXIgbWlycm9ycyBjYW4gb25seSBoYW5kbGUgYQorCQkgKiBwYXlsb2FkIG9mIDwgMU1CIGN1cnJlbnRseS4gIChUaGlzIGRlZmljaWVuY3kgaXMgdHJhY2tlZCBieQorCQkgKiBodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS82ODI3NzEuKSAgVGhlIHJlZ2lvbiBzaXplIGZvciBjbHVzdGVyCisJCSAqIG1pcnJvcnMgbXVzdCBiZSByZXN0cmljdGVkIGluIHN1Y2ggYSB3YXkgYXMgdG8gbGltaXQgdGhlCisJCSAqIHNpemUgb2YgdGhlIGJpdG1hcCB0byA8IDUxMmtCLCBiZWNhdXNlIHRoZXJlIGFyZSB0d28gYml0bWFwcworCQkgKiB3aGljaCBnZXQgc2VudCBhcm91bmQgZHVyaW5nIGNoZWNrcG9pbnRpbmcgd2hpbGUgYSBjbHVzdGVyCisJCSAqIG1pcnJvciBzdGFydHMgdXAuICBFcmdvLCB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgbXVzdCBub3QKKwkJICogZXhjZWVkIDUxMmsgKiA4LiAgV2UgYWxzbyBuZWVkIHNvbWUgcm9vbSBmb3IgdGhlIG90aGVyCisJCSAqIGNoZWNrcG9pbnRpbmcgc3RydWN0dXJlcyBhcyB3ZWxsLCBzbyB3ZSByZWR1Y2UgYnkgYW5vdGhlcgorCQkgKiBmYWN0b3Igb2YgdHdvLgorCQkgKgorCQkgKiBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgQ1BHIHJlc3RyaWN0aW9uIGlzCisJCSAqIGxpZnRlZC4KKwkJICovCisJCXJlZ2lvbl9taW4gPSAodWludDY0X3QpIGV4dGVudHMgKiBleHRlbnRfc2l6ZSAvIENNSVJST1JfUkVHSU9OX0NPVU5UX0xJTUlUOworCQlyZWdpb25fbWluX3BvdzIgPSAxOworCQl3aGlsZSAocmVnaW9uX21pbl9wb3cyIDwgcmVnaW9uX21pbikKKwkJCXJlZ2lvbl9taW5fcG93MiAqPSAyOworCisJCWlmIChyZWdpb25fc2l6ZSA8IHJlZ2lvbl9taW5fcG93MikgeworCQkJaWYgKGludGVybmFsKQorCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJbmNyZWFzaW5nIG1pcnJvciByZWdpb24gc2l6ZSBmcm9tICUiCisJCQkJCQkJUFJJdTMyICIgdG8gJSIgUFJJdTY0ICIgc2VjdG9ycy4iLAorCQkJCQkJCXJlZ2lvbl9zaXplLCByZWdpb25fbWluX3BvdzIpOworCQkJZWxzZQorCQkJCWxvZ192ZXJib3NlKCJJbmNyZWFzaW5nIG1pcnJvciByZWdpb24gc2l6ZSBmcm9tICUiCisJCQkJCSAgICBQUkl1MzIgIiB0byAlIiBQUkl1NjQgIiBzZWN0b3JzLiIsCisJCQkJCSAgICByZWdpb25fc2l6ZSwgcmVnaW9uX21pbl9wb3cyKTsKKwkJCXJlZ2lvbl9zaXplID0gcmVnaW9uX21pbl9wb3cyOworCQl9CisJfQorI2VuZGlmIC8qIENNSVJST1JfUkVHSU9OX0NPVU5UX0xJTUlUICovCisKKwlyZXR1cm4gcmVnaW9uX3NpemU7Cit9CisKKy8qCisgKiBzaGlmdF9taXJyb3JfaW1hZ2VzCisgKiBAbWlycm9yZWRfc2VnCisgKiBAbWltYWdlOiAgVGhlIHBvc2l0aW9uIChpbmRleCkgb2YgdGhlIGltYWdlIHRvIG1vdmUgdG8gdGhlIGVuZAorICoKKyAqIFdoZW4gZGVhbGluZyB3aXRoIHJlbW92YWwgb2YgbGVncywgd2Ugb2Z0ZW4gbW92ZSBhICdyZW1vdmFibGUgbGVnJworICogdG8gdGhlIGJhY2sgb2YgdGhlICdhcmVhcycgYXJyYXkuICBJdCBpcyBjcml0aWNhbGx5IGltcG9ydGFudCBub3QKKyAqIHRvIHNpbXBseSBzd2FwIGl0IGZvciB0aGUgbGFzdCBhcmVhIGluIHRoZSBhcnJheS4gIFRoaXMgd291bGQgaGF2ZQorICogdGhlIGFmZmVjdCBvZiByZW9yZGVyaW5nIHRoZSByZW1haW5pbmcgbGVncyAtIGFsdGVyaW5nIHBvc2l0aW9uIG9mCisgKiB0aGUgcHJpbWFyeS4gIFNvLCB3ZSBtdXN0IHNodWZmbGUgYWxsIG9mIHRoZSBhcmVhcyBpbiB0aGUgYXJyYXkKKyAqIHRvIG1haW50YWluIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9uIGJlZm9yZSBtb3ZpbmcgdGhlICdyZW1vdmFibGUKKyAqIGxlZycgdG8gdGhlIGVuZC4KKyAqCisgKiBTaG9ydCBpbGx1c3RyYXRpb24gb2YgdGhlIHByb2JsZW06CisgKiAgIC0gTWlycm9yIGNvbnNpc3RzIG9mIGxlZ3MgQSwgQiwgQyBhbmQgd2Ugd2FudCB0byByZW1vdmUgQQorICogICAtIFdlIHN3YXAgQSBhbmQgQyBhbmQgdGhlbiByZW1vdmUgQSwgbGVhdmluZyBDLCBCCisgKiBUaGlzIHNjZW5hcmlvIGlzIHByb2JsZW1hdGljIGluIGZhaWx1cmUgY2FzZXMgd2hlcmUgQSBkaWVzLCBiZWNhdXNlCisgKiBCIGJlY29tZXMgdGhlIHByaW1hcnkuICBJZiB0aGUgYWJvdmUgaGFwcGVucywgd2UgZWZmZWN0aXZlbHkgdGhyb3cKKyAqIGF3YXkgYW55IGNoYW5nZXMgbWFkZSBiZXR3ZWVuIHRoZSB0aW1lIG9mIGZhaWx1cmUgYW5kIHRoZSB0aW1lIG9mCisgKiByZXN0cnVjdHVyaW5nIHRoZSBtaXJyb3IuCisgKgorICogU28sIGFueSB0aW1lIHdlIHdhbnQgdG8gbW92ZSBhcmVhcyB0byB0aGUgZW5kIHRvIGJlIHJlbW92ZWQsIHVzZQorICogdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IHNoaWZ0X21pcnJvcl9pbWFnZXMoc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcmVkX3NlZywgdW5zaWduZWQgbWltYWdlKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGx2X3NlZ21lbnRfYXJlYSBhcmVhOworCisJaWYgKG1pbWFnZSA+PSBtaXJyb3JlZF9zZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIGluZGV4ICgldSkgb2YgbWlycm9yIGltYWdlIHN1cHBsaWVkICIKKwkJCSAgInRvIHNoaWZ0X21pcnJvcl9pbWFnZXMoKSIsIG1pbWFnZSk7CisJCXJldHVybiAwOworCX0KKworCWFyZWEgPSBtaXJyb3JlZF9zZWctPmFyZWFzW21pbWFnZV07CisKKwkvKiBTaGlmdCByZW1haW5pbmcgaW1hZ2VzIGRvd24gdG8gZmlsbCB0aGUgaG9sZSAqLworCWZvciAoaSA9IG1pbWFnZSArIDE7IGkgPCBtaXJyb3JlZF9zZWctPmFyZWFfY291bnQ7IGkrKykKKwkJbWlycm9yZWRfc2VnLT5hcmVhc1tpLTFdID0gbWlycm9yZWRfc2VnLT5hcmVhc1tpXTsKKworCS8qIFBsYWNlIHRoaXMgb25lIGF0IHRoZSBlbmQgKi8KKwltaXJyb3JlZF9zZWctPmFyZWFzW2ktMV0gPSBhcmVhOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIG5ldyBoZWFkZXIgdG8gdGhlIG1pcnJvciBsb2cgaGVhZGVyIHRvIHRoZSBsdgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX3dyaXRlX2xvZ19oZWFkZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNoYXIgKm5hbWU7CisJc3RydWN0IHsgLyogVGhlIG1pcnJvciBsb2cgaGVhZGVyICovCisJCXVpbnQzMl90IG1hZ2ljOworCQl1aW50MzJfdCB2ZXJzaW9uOworCQl1aW50NjRfdCBucl9yZWdpb25zOworCX0gbG9nX2hlYWRlcjsKKworCWxvZ19oZWFkZXIubWFnaWMgPSB4bGF0ZTMyKE1JUlJPUl9NQUdJQyk7CisJbG9nX2hlYWRlci52ZXJzaW9uID0geGxhdGUzMihNSVJST1JfRElTS19WRVJTSU9OKTsKKwlsb2dfaGVhZGVyLm5yX3JlZ2lvbnMgPSB4bGF0ZTY0KCh1aW50NjRfdCktMSk7CisKKwlpZiAoIShuYW1lID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgUEFUSF9NQVgpKSkgeworCQlsb2dfZXJyb3IoIk5hbWUgYWxsb2NhdGlvbiBmYWlsZWQgLSBsb2cgaGVhZGVyIG5vdCB3cml0dGVuICglcykiLAorCQkJbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYobmFtZSwgUEFUSF9NQVgsICIlcyVzLyVzIiwgY21kLT5kZXZfZGlyLAorCQkJIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIk5hbWUgdG9vIGxvbmcgLSBsb2cgaGVhZGVyIG5vdCB3cml0dGVuICglcykiLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJib3NlKCJXcml0aW5nIGxvZyBoZWFkZXIgdG8gZGV2aWNlLCAlcyIsIGx2LT5uYW1lKTsKKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQobmFtZSwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiJXM6IG5vdCBmb3VuZDogbG9nIGhlYWRlciBub3Qgd3JpdHRlbiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldl9vcGVuX3F1aWV0KGRldikpCisJCXJldHVybiAwOworCisJaWYgKCFkZXZfd3JpdGUoZGV2LCBVSU5UNjRfQygwKSwgc2l6ZW9mKGxvZ19oZWFkZXIpLCAmbG9nX2hlYWRlcikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgbG9nIGhlYWRlciB0byAlcyIsIG5hbWUpOworCQlkZXZfY2xvc2VfaW1tZWRpYXRlKGRldik7CisJCXJldHVybiAwOworCX0KKworCWRldl9jbG9zZV9pbW1lZGlhdGUoZGV2KTsKKworCXJldHVybiAxOworfQorCisvKgorICogSW5pdGlhbGl6ZSBtaXJyb3IgbG9nIGNvbnRlbnRzCisgKi8KK3N0YXRpYyBpbnQgX2luaXRfbWlycm9yX2xvZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdiwgaW50IGluX3N5bmMsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKnRhZ3NsLCBpbnQgcmVtb3ZlX29uX2ZhaWx1cmUpCit7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwl1aW50NjRfdCBvcmlnX3N0YXR1cyA9IGxvZ19sdi0+c3RhdHVzOworCWludCB3YXNfYWN0aXZlID0gMDsKKworCWlmICh0ZXN0X21vZGUoKSkgeworCQlsb2dfdmVyYm9zZSgiVGVzdCBtb2RlOiBTa2lwcGluZyBtaXJyb3IgbG9nIGluaXRpYWxpc2F0aW9uLiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWFjdGl2YXRpb24oKSAmJiBpbl9zeW5jKSB7CisJCWxvZ19lcnJvcigiQWJvcnRpbmcuIFVuYWJsZSB0byBjcmVhdGUgaW4tc3luYyBtaXJyb3IgbG9nICIKKwkJCSAgIndoaWxlIGFjdGl2YXRpb24gaXMgZGlzYWJsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHRoZSBMViBpcyBhY3RpdmUsIGRlYWN0aXZhdGUgaXQgZmlyc3QuICovCisJaWYgKGx2X2lzX2FjdGl2ZShsb2dfbHYpKSB7CisJCSh2b2lkKSBkZWFjdGl2YXRlX2x2KGNtZCwgbG9nX2x2KTsKKwkJLyoKKwkJICogRklYTUU6IHdvcmthcm91bmQgdG8gZmFpbCBlYXJseQorCQkgKiBFbnN1cmUgdGhhdCBsb2cgaXMgcmVhbGx5IGRlYWN0aXZhdGVkIGJlY2F1c2UgZGVhY3RpdmF0ZV9sdgorCQkgKiBvbiBjbHVzdGVyIGRvIG5vdCBmYWlsIGlmIHRoZXJlIGlzIGxvZ19sdiB3aXRoIGRpZmZlcmVudCBVVUlELgorCQkgKi8KKwkJaWYgKGx2X2lzX2FjdGl2ZShsb2dfbHYpKSB7CisJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBVbmFibGUgdG8gZGVhY3RpdmF0ZSBtaXJyb3IgbG9nLiIpOworCQkJZ290byByZXZlcnRfbmV3X2x2OworCQl9CisJCXdhc19hY3RpdmUgPSAxOworCX0KKworCS8qIFRlbXBvcmFyeSBtYWtlIGl0IHZpc2libGUgZm9yIHNldF9sdigpICovCisJbHZfc2V0X3Zpc2libGUobG9nX2x2KTsKKworCS8qIFRlbXBvcmFyeSB0YWcgbWlycm9yIGxvZyBmb3IgYWN0aXZhdGlvbiAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgdGFnc2wpCisJCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bWVtLCAmbG9nX2x2LT50YWdzLCBzbC0+c3RyKSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gVW5hYmxlIHRvIHRhZyBtaXJyb3IgbG9nLiIpOworCQkJZ290byBhY3RpdmF0ZV9sdjsKKwkJfQorCisJLyogc3RvcmUgbWlycm9yIGxvZyBvbiBkaXNrKHMpICovCisJaWYgKCF2Z193cml0ZShsb2dfbHYtPnZnKSB8fCAhdmdfY29tbWl0KGxvZ19sdi0+dmcpKQorCQlnb3RvIGFjdGl2YXRlX2x2OworCisJYmFja3VwKGxvZ19sdi0+dmcpOworCisJLyogV2FpdCBmb3IgZXZlbnRzIGZvbGxvd2luZyBhbnkgZGVhY3RpdmF0aW9uIGJlZm9yZSByZWFjdGl2YXRpbmcgKi8KKwlpZiAoIXN5bmNfbG9jYWxfZGV2X25hbWVzKGNtZCkpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHN5bmMgbG9jYWwgZGV2aWNlcyBiZWZvcmUgaW5pdGlhbGlzaW5nIG1pcnJvciBsb2cgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobG9nX2x2KSk7CisJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwl9CisKKwlpZiAoIWFjdGl2YXRlX2x2KGNtZCwgbG9nX2x2KSkgeworCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gYWN0aXZhdGUgbWlycm9yIGxvZy4iKTsKKwkJZ290byByZXZlcnRfbmV3X2x2OworCX0KKworCS8qIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IHRhZ3MgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIHRhZ3NsKQorCQlzdHJfbGlzdF9kZWwoJmxvZ19sdi0+dGFncywgc2wtPnN0cik7CisKKwlpZiAoYWN0aXZhdGlvbigpKSB7CisJCWlmICghd2lwZV9sdihsb2dfbHYsIChzdHJ1Y3Qgd2lwZV9wYXJhbXMpCisJCQkgICAgIHsgLmRvX3plcm8gPSAxLCAuemVyb19zZWN0b3JzID0gbG9nX2x2LT5zaXplLAorCQkJICAgICAgIC56ZXJvX3ZhbHVlID0gaW5fc3luYyA/IC0xIDogMCB9KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgbWlycm9yIGxvZy4iKTsKKwkJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsKKwkJfQorCX0KKworCWlmIChhY3RpdmF0aW9uKCkgJiYgIV93cml0ZV9sb2dfaGVhZGVyKGNtZCwgbG9nX2x2KSkgeworCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gd3JpdGUgbWlycm9yIGxvZyBoZWFkZXIuIik7CisJCWdvdG8gZGVhY3RpdmF0ZV9hbmRfcmV2ZXJ0X25ld19sdjsKKwl9CisKKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsb2dfbHYpKSB7CisJCWxvZ19lcnJvcigiQWJvcnRpbmcuIEZhaWxlZCB0byBkZWFjdGl2YXRlIG1pcnJvciBsb2cuICIKKwkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWx2X3NldF9oaWRkZW4obG9nX2x2KTsKKworCWlmICh3YXNfYWN0aXZlICYmICFhY3RpdmF0ZV9sdihjbWQsIGxvZ19sdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7CisKK2RlYWN0aXZhdGVfYW5kX3JldmVydF9uZXdfbHY6CisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbG9nX2x2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZWFjdGl2YXRlIG1pcnJvciBsb2cgTFYuICIKKwkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuIik7CisJCXJldHVybiAwOworCX0KKworcmV2ZXJ0X25ld19sdjoKKwlsb2dfbHYtPnN0YXR1cyA9IG9yaWdfc3RhdHVzOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCB0YWdzbCkKKwkJc3RyX2xpc3RfZGVsKCZsb2dfbHYtPnRhZ3MsIHNsLT5zdHIpOworCisJaWYgKHJlbW92ZV9vbl9mYWlsdXJlICYmICFsdl9yZW1vdmUobG9nX2x2KSkgeworCQlsb2dfZXJyb3IoIk1hbnVhbCBpbnRlcnZlbnRpb24gbWF5IGJlIHJlcXVpcmVkIHRvIHJlbW92ZSAiCisJCQkgICJhYmFuZG9uZWQgbG9nIExWIGJlZm9yZSByZXRyeWluZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2Z193cml0ZShsb2dfbHYtPnZnKSB8fCAhdmdfY29tbWl0KGxvZ19sdi0+dmcpKQorCQlsb2dfZXJyb3IoIk1hbnVhbCBpbnRlcnZlbnRpb24gbWF5IGJlIHJlcXVpcmVkIHRvICIKKwkJCSAgInJlbW92ZS9yZXN0b3JlIGFiYW5kb25lZCBsb2cgTFYgYmVmb3JlIHJldHJ5aW5nLiIpOworCWVsc2UKKwkJYmFja3VwKGxvZ19sdi0+dmcpOworCithY3RpdmF0ZV9sdjoKKwlpZiAod2FzX2FjdGl2ZSAmJiAhcmVtb3ZlX29uX2ZhaWx1cmUgJiYgIWFjdGl2YXRlX2x2KGNtZCwgbG9nX2x2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFjdGl2YXRlIGFuIExWIHNpbWlsYXJseSAoaS5lLiBTSCBvciBFWCkgdG8gYSBnaXZlbiAibW9kZWwiIExWCisgKi8KK3N0YXRpYyBpbnQgX2FjdGl2YXRlX2x2X2xpa2VfbW9kZWwoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptb2RlbCwKKwkJCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWlmIChsdl9pc19hY3RpdmVfZXhjbHVzaXZlKG1vZGVsKSkgeworCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2wobHYtPnZnLT5jbWQsIGx2KSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCWlmICghYWN0aXZhdGVfbHYobHYtPnZnLT5jbWQsIGx2KSkKKwkJCXJldHVybl8wOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERlbGV0ZSBpbmRlcGVuZGVudC9vcnBoYW4gTFYsIGl0IG11c3QgYWNxdWlyZSBsb2NrLgorICovCitzdGF0aWMgaW50IF9kZWxldGVfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptaXJyb3JfbHYsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIGludCByZWFjdGl2YXRlKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gbWlycm9yX2x2LT52Zy0+Y21kOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2w7CisKKwkvKiBJbmhlcml0IHRhZ3MgLSBtYXliZSBuZWVkZWQgZm9yIGFjdGl2YXRpb24gKi8KKwlpZiAoIXN0cl9saXN0X21hdGNoX2xpc3QoJm1pcnJvcl9sdi0+dGFncywgJmx2LT50YWdzLCBOVUxMKSkgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZtaXJyb3JfbHYtPnRhZ3MpCisJCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgJmx2LT50YWdzLCBzbC0+c3RyKSkgeworCQkJCWxvZ19lcnJvcigiQWJvcnRpbmcuIFVuYWJsZSB0byB0YWcuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKCF2Z193cml0ZShtaXJyb3JfbHYtPnZnKSB8fAorCQkgICAgIXZnX2NvbW1pdChtaXJyb3JfbHYtPnZnKSkgeworCQkJbG9nX2Vycm9yKCJJbnRlcm1lZGlhdGUgVkcgY29tbWl0IGZvciBvcnBoYW4gdm9sdW1lIGZhaWxlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHJlYWN0aXZhdGUpIHsKKwkJLyogRklYTUU6IHRoZSAnbW9kZWwnIHNob3VsZCBiZSAnbWlycm9yX2x2JyBub3QgJ2x2JywgSSB0aGluay4gKi8KKwkJaWYgKCFfYWN0aXZhdGVfbHZfbGlrZV9tb2RlbChsdiwgbHYpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogRklYTUUgSXMgdGhpcyBzdXBlcmZsdW91cyBub3c/ICovCisJCWlmICghc3luY19sb2NhbF9kZXZfbmFtZXMoY21kKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3luYyBsb2NhbCBkZXZpY2VzIHdoZW4gcmVhY3RpdmF0aW5nICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIWx2X3JlbW92ZShsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX21lcmdlX21pcnJvcl9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQljb25zdCBzdHJ1Y3QgZG1fbGlzdCAqbWltYWdlcykKK3sKKwl1aW50MzJfdCBhZGRpdGlvbiA9IGRtX2xpc3Rfc2l6ZShtaW1hZ2VzKTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKippbWdfbHZzOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IGkgPSAwOworCisJaWYgKCFhZGRpdGlvbikKKwkJcmV0dXJuIDE7CisKKwlpbWdfbHZzID0gYWxsb2NhKHNpemVvZigqaW1nX2x2cykgKiBhZGRpdGlvbik7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBtaW1hZ2VzKQorCQlpbWdfbHZzW2krK10gPSBsdmwtPmx2OworCisJcmV0dXJuIGx2X2FkZF9taXJyb3JfbHZzKGx2LCBpbWdfbHZzLCBhZGRpdGlvbiwKKwkJCQkgTUlSUk9SX0lNQUdFLCBmaXJzdF9zZWcobHYpLT5yZWdpb25fc2l6ZSk7Cit9CisKKy8qIFVubGluayB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHNlZ21lbnQgYW5kIGl0cyBsb2dfbHYgKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZGV0YWNoX21pcnJvcl9sb2coc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcmVkX3NlZykKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdjsKKworCWlmICghbWlycm9yZWRfc2VnLT5sb2dfbHYpCisJCXJldHVybiBOVUxMOworCisJbG9nX2x2ID0gbWlycm9yZWRfc2VnLT5sb2dfbHY7CisJbWlycm9yZWRfc2VnLT5sb2dfbHYgPSBOVUxMOworCWx2X3NldF92aXNpYmxlKGxvZ19sdik7CisJbG9nX2x2LT5zdGF0dXMgJj0gfk1JUlJPUl9MT0c7CisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGxvZ19sdiwgbWlycm9yZWRfc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gbG9nX2x2OworfQorCisvKiBDaGVjayBpZiBtaXJyb3IgaW1hZ2UgTFYgaXMgcmVtb3ZhYmxlIHdpdGggcmVnYXJkIHRvIGdpdmVuIHJlbW92YWJsZV9wdnMgKi8KK2ludCBpc19taXJyb3JfaW1hZ2VfcmVtb3ZhYmxlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWltYWdlX2x2LCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWludCBwdl9mb3VuZDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXVpbnQzMl90IHM7CisJc3RydWN0IGRtX2xpc3QgKnJlbW92YWJsZV9wdnMgPSBiYXRvbjsKKworCWlmICghYmF0b24gfHwgZG1fbGlzdF9lbXB0eShyZW1vdmFibGVfcHZzKSkKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbWltYWdlX2x2LT5zZWdtZW50cykgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfUFYpIHsKKwkJCQkvKiBGSVhNRSBSZWN1cnNlIGZvciBBUkVBX0xWPyAqLworCQkJCS8qIFN0cnVjdHVyZSBvZiBzZWdfbHYgaXMgdW5rbm93bi4KKwkJCQkgKiBOb3QgcmVtb3ZpbmcgdGhpcyBMViBmb3Igc2FmZXR5LiAqLworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlwdiA9IHNlZ19wdihzZWcsIHMpOworCisJCQlwdl9mb3VuZCA9IDA7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCByZW1vdmFibGVfcHZzKSB7CisJCQkJaWYgKGlkX2VxdWFsKCZwdi0+aWQsICZwdmwtPnB2LT5pZCkpIHsKKwkJCQkJcHZfZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHB2bC0+cHYtPmRldiAmJiBwdi0+ZGV2ICYmCisJCQkJICAgIHB2LT5kZXYtPmRldiA9PSBwdmwtPnB2LT5kZXYtPmRldikgeworCQkJCQlwdl9mb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghcHZfZm91bmQpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIF9tb3ZlX3JlbW92YWJsZV9taW1hZ2VzX3RvX2VuZAorICoKKyAqIFdlIGFsd2F5cyBkZXRhY2ggbWltYWdlIExWcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGFyZWFzIGFycmF5LgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHB1c2ggJ2NvdW50JyBtaW1hZ2VzIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5CisgKiBiYXNlZCBvbiBpZiB0aGVpciBQVnMgYXJlIHJlbW92YWJsZS4KKyAqCisgKiBUaGlzIGlzIGFuIGFsbCBvciBub3RoaW5nIGZ1bmN0aW9uLiAgRWl0aGVyIHRoZSB1c2VyIHNwZWNpZmllcworICogZW5vdWdoIHJlbW92YWJsZSBQVnMgdG8gc2F0aXNmeSBjb3VudCwgb3IgdGhleSBkb24ndCBzcGVjaWZ5CisgKiBhbnkgcmVtb3ZhYmxlX3B2cyBhdCBhbGwgKGluIHdoaWNoIGNhc2UgYWxsIFBWcyBpbiB0aGUgbWlycm9yCisgKiBhcmUgY29uc2lkZXJlZCByZW1vdmFibGUpLgorICovCitzdGF0aWMgaW50IF9tb3ZlX3JlbW92YWJsZV9taW1hZ2VzX3RvX2VuZChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgIHVpbnQzMl90IGNvdW50LAorCQkJCQkgIHN0cnVjdCBkbV9saXN0ICpyZW1vdmFibGVfcHZzKQoreworCWludCBpOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc3ViX2x2OworCXN0cnVjdCBsdl9zZWdtZW50ICptaXJyb3JlZF9zZWcgPSBmaXJzdF9zZWcobHYpOworCisJaWYgKCFyZW1vdmFibGVfcHZzKQorCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudCAtIDE7IChpID49IDApICYmIGNvdW50OyBpLS0pIHsKKwkJc3ViX2x2ID0gc2VnX2x2KG1pcnJvcmVkX3NlZywgaSk7CisKKwkJaWYgKCFpc190ZW1wb3JhcnlfbWlycm9yX2xheWVyKHN1Yl9sdikgJiYKKwkJICAgIGlzX21pcnJvcl9pbWFnZV9yZW1vdmFibGUoc3ViX2x2LCByZW1vdmFibGVfcHZzKSkgeworCQkJaWYgKCFzaGlmdF9taXJyb3JfaW1hZ2VzKG1pcnJvcmVkX3NlZywgaSkpCisJCQkJcmV0dXJuXzA7CisJCQljb3VudC0tOworCQl9CisJfQorCisJcmV0dXJuICFjb3VudDsKK30KKworc3RhdGljIGludCBfbWlycm9yZWRfbHZfaW5fc3luYyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWRtX3BlcmNlbnRfdCBzeW5jX3BlcmNlbnQ7CisKKwlpZiAoIWx2X21pcnJvcl9wZXJjZW50KGx2LT52Zy0+Y21kLCBsdiwgMCwgJnN5bmNfcGVyY2VudCwKKwkJCSAgICAgICBOVUxMKSkgeworCQlpZiAobHZfaXNfYWN0aXZlX2J1dF9ub3RfbG9jYWxseShsdikpCisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgbWlycm9yIHN5bmMgc3RhdHVzIG9mIgorCQkJCSAgIiByZW1vdGVseSBhY3RpdmUgTFYsICVzLyVzIiwKKwkJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgbWlycm9yICIKKwkJCQkgICJzeW5jIHN0YXR1cyBvZiAlcy8lcy4iLAorCQkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAoc3luY19wZXJjZW50ID09IERNX1BFUkNFTlRfMTAwKSA/IDEgOiAwOworfQorCisvKgorICogU3BsaXQgb2ZmICdzcGxpdF9jb3VudCcgbGVncyBmcm9tIGEgbWlycm9yCisgKgorICogUmV0dXJuczogMCBvbiBlcnJvciwgMSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX3NwbGl0X21pcnJvcl9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQljb25zdCBjaGFyICpzcGxpdF9uYW1lLAorCQkJCXVpbnQzMl90IHNwbGl0X2NvdW50LAorCQkJCXN0cnVjdCBkbV9saXN0ICpyZW1vdmFibGVfcHZzKQoreworCXVpbnQzMl90IGk7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzdWJfbHYgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbmV3X2x2ID0gTlVMTDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmRldGFjaGVkX2xvZ19sdiA9IE5VTEw7CisJc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcmVkX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJc3RydWN0IGRtX2xpc3Qgc3BsaXRfaW1hZ2VzOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBsdi0+dmctPmNtZDsKKworCWlmICghbHZfaXNfbWlycm9yZWQobHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNwbGl0IG5vbi1taXJyb3JlZCBMViwgJXMiLAorCQkJICBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3BsaXRfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJzcGxpdF9jb3VudCBpcyB6ZXJvISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyYm9zZSgiRGV0YWNoaW5nICVkIGltYWdlcyBmcm9tIG1pcnJvciwgJXMiLAorCQkgICAgc3BsaXRfY291bnQsIGx2LT5uYW1lKTsKKworCWlmICghX21vdmVfcmVtb3ZhYmxlX21pbWFnZXNfdG9fZW5kKGx2LCBzcGxpdF9jb3VudCwgcmVtb3ZhYmxlX3B2cykpIHsKKwkJLyoKKwkJICogRklYTUU6IEFsbG93IGluY29tcGxldGUgc3BlY2lmaWNhdGlvbiBvZiByZW1vdmFibGUgUFZzPworCQkgKgorCQkgKiBJIGFtIGZvcmNpbmcgdGhlIHVzZXIgdG8gZWl0aGVyIHNwZWNpZnkgbm8KKwkJICogcmVtb3ZhYmxlIFBWcyBvciBhbGwgb2YgdGhlbS4gIFNob3VsZCB3ZSBhbGxvdworCQkgKiB0aGVtIHRvIGp1c3Qgc3BlY2lmeSBzb21lIC0gbWFraW5nIHVzIHBpY2sgdGhlIHJlc3Q/CisJCSAqLworCQlsb2dfZXJyb3IoIkluc3VmZmljaWVudCByZW1vdmFibGUgUFZzIGdpdmVuIgorCQkJICAiIHRvIHNhdGlzZnkgcmVxdWVzdCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFN0ZXAgMToKKwkgKiAgIFJlbW92ZSB0aGUgaW1hZ2VzIGZyb20gdGhlIG1pcnJvci4KKwkgKiAgIE1ha2UgdGhlbSB2aXNpYmxlLCBpbmRlcGVuZGVudCBMVnMgKGRvbid0IGNoYW5nZSBuYW1lcyB5ZXQpLgorCSAqICAgVHJhY2sgdGhlbSBpbiBhIGxpc3QgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24uCisJICovCisJZG1fbGlzdF9pbml0KCZzcGxpdF9pbWFnZXMpOworCWZvciAoaSA9IDA7IGkgPCBzcGxpdF9jb3VudDsgaSsrKSB7CisJCW1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudC0tOworCQlzdWJfbHYgPSBzZWdfbHYobWlycm9yZWRfc2VnLCBtaXJyb3JlZF9zZWctPmFyZWFfY291bnQpOworCisJCXN1Yl9sdi0+c3RhdHVzICY9IH5NSVJST1JfSU1BR0U7CisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEobWlycm9yZWRfc2VnLCBtaXJyb3JlZF9zZWctPmFyZWFfY291bnQsIG1pcnJvcmVkX3NlZy0+YXJlYV9sZW4pKQorCQkJcmV0dXJuXzA7CisKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiJXMgYXNzaWduZWQgdG8gYmUgc3BsaXQiLCBzdWJfbHYtPm5hbWUpOworCisJCWlmICghbmV3X2x2KSB7CisJCQlsdl9zZXRfdmlzaWJsZShzdWJfbHYpOworCQkJbmV3X2x2ID0gc3ViX2x2OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGltYWdlIGJlaW5nIHNwbGl0LCBhZGQgdG8gbGlzdCAqLworCQlsdmwgPSBkbV9wb29sX2FsbG9jKGx2LT52Zy0+dmdtZW0sIHNpemVvZigqbHZsKSk7CisJCWlmICghbHZsKSB7CisJCQlsb2dfZXJyb3IoImx2X2xpc3QgYWxsb2MgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsdmwtPmx2ID0gc3ViX2x2OworCQlkbV9saXN0X2FkZCgmc3BsaXRfaW1hZ2VzLCAmbHZsLT5saXN0KTsKKwl9CisKKwluZXdfbHYtPm5hbWUgPSBkbV9wb29sX3N0cmR1cChsdi0+dmctPnZnbWVtLCBzcGxpdF9uYW1lKTsKKwlpZiAoIW5ld19sdi0+bmFtZSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZW5hbWUgbmV3bHkgc3BsaXQgTFYiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZzcGxpdF9pbWFnZXMpKSB7CisJCXNpemVfdCBsZW4gPSBzdHJsZW4obmV3X2x2LT5uYW1lKSArIDMyOworCQljaGFyICpsYXllcl9uYW1lLCBmb3JtYXRbbGVuXTsKKworCQkvKgorCQkgKiBBIG51bWJlciBvZiBpbWFnZXMgaGF2ZSBiZWVuIHNwbGl0IGFuZAorCQkgKiBhIG5ldyBtaXJyb3IgbGF5ZXIgbXVzdCBiZSBmb3JtZWQKKwkJICovCisKKwkJaWYgKCFpbnNlcnRfbGF5ZXJfZm9yX2x2KGNtZCwgbmV3X2x2LCAwLCAiX21pbWFnZV8lZCIpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBidWlsZCBuZXcgbWlycm9yLCAlcyIsCisJCQkJICBuZXdfbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlmaXJzdF9zZWcobmV3X2x2KS0+cmVnaW9uX3NpemUgPSBtaXJyb3JlZF9zZWctPnJlZ2lvbl9zaXplOworCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZzcGxpdF9pbWFnZXMpIHsKKwkJCXN1Yl9sdiA9IGx2bC0+bHY7CisKKwkJCWlmIChkbV9zbnByaW50Zihmb3JtYXQsIGxlbiwgIiVzX21pbWFnZV8lJWQiLAorCQkJCQluZXdfbHYtPm5hbWUpIDwgMCkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIG5ldyBpbWFnZSBuYW1lLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbGF5ZXJfbmFtZSA9IGRtX3Bvb2xfYWxsb2MobHYtPnZnLT52Z21lbSwgbGVuKTsKKwkJCWlmICghbGF5ZXJfbmFtZSkgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFnZW5lcmF0ZV9sdl9uYW1lKGx2LT52ZywgZm9ybWF0LCBsYXllcl9uYW1lLCBsZW4pfHwKKwkJCSAgICBzc2NhbmYobGF5ZXJfbmFtZSwgZm9ybWF0LCAmaSkgIT0gMSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyBpbWFnZSBuYW1lcyIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJc3ViX2x2LT5uYW1lID0gbGF5ZXJfbmFtZTsKKwkJfQorCisJCWlmICghX21lcmdlX21pcnJvcl9pbWFnZXMobmV3X2x2LCAmc3BsaXRfaW1hZ2VzKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ3JvdXAgc3BsaXQgIgorCQkJCSAgImltYWdlcyBpbnRvIG5ldyBtaXJyb3IiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgYWxsb3cgc3BsaXR0aW5nIGEgbWlycm9yIHRoYXQgaXMgbm90IGluLXN5bmMsCisJCSAqIHNvIHdlIGNhbiBicmluZyB0aGUgbmV3bHkgc3BsaXQgbWlycm9yIHVwIHdpdGhvdXQgYQorCQkgKiByZXN5bmMuICAoSXQgd2lsbCBiZSBhICdjb3JlJyBsb2cgbWlycm9yIGFmdGVyIGFsbC4pCisJCSAqLworCQlpbml0X21pcnJvcl9pbl9zeW5jKDEpOworCX0KKworCXN1Yl9sdiA9IE5VTEw7CisKKwkvKgorCSAqIElmIG5vIG1vcmUgbWlycm9ycywgcmVtb3ZlIG1pcnJvciBsYXllci4KKwkgKiBUaGUgc3ViX2x2IGlzIHJlbW92ZWQgZW50aXJlbHkgbGF0ZXIgLSBsZWF2aW5nCisJICogb25seSB0aGUgdG9wLWxldmVsIChub3cgbGluZWFyKSBMVi4KKwkgKi8KKwlpZiAobWlycm9yZWRfc2VnLT5hcmVhX2NvdW50ID09IDEpIHsKKwkJc3ViX2x2ID0gc2VnX2x2KG1pcnJvcmVkX3NlZywgMCk7CisJCXN1Yl9sdi0+c3RhdHVzICY9IH5NSVJST1JfSU1BR0U7CisJCWx2X3NldF92aXNpYmxlKHN1Yl9sdik7CisJCWRldGFjaGVkX2xvZ19sdiA9IGRldGFjaF9taXJyb3JfbG9nKG1pcnJvcmVkX3NlZyk7CisJCWlmICghcmVtb3ZlX2xheWVyX2Zyb21fbHYobHYsIHN1Yl9sdikpCisJCQlyZXR1cm5fMDsKKwkJbHYtPnN0YXR1cyAmPSB+TUlSUk9SOworCQlsdi0+c3RhdHVzICY9IH5NSVJST1JFRDsKKwkJbHYtPnN0YXR1cyAmPSB+TFZfTk9UU1lOQ0VEOworCX0KKworCWlmICghdmdfd3JpdGUobWlycm9yZWRfc2VnLT5sdi0+dmcpKSB7CisJCWxvZ19lcnJvcigiSW50ZXJtZWRpYXRlIFZHIG1ldGFkYXRhIHdyaXRlIGZhaWxlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTdXNwZW5kIHRoZSBtaXJyb3IgLSB0aGlzIGluY2x1ZGVzIGFsbCB0aGUgc3ViLUxWcyBhbmQKKwkgKiAgICAgICAgICAgICAgICAgICAgICBzb29uLXRvLWJlLXNwbGl0IHN1Yi1MVnMKKwkgKi8KKwlpZiAoIXN1c3BlbmRfbHYoY21kLCBtaXJyb3JlZF9zZWctPmx2KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBsb2NrICVzIiwgbWlycm9yZWRfc2VnLT5sdi0+bmFtZSk7CisJCXZnX3JldmVydChtaXJyb3JlZF9zZWctPmx2LT52Zyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmdfY29tbWl0KG1pcnJvcmVkX3NlZy0+bHYtPnZnKSkgeworCQlyZXN1bWVfbHYoY21kLCBtaXJyb3JlZF9zZWctPmx2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ZlcnlfdmVyYm9zZSgiVXBkYXRpbmcgXCIlc1wiIGluIGtlcm5lbCIsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCisJLyoKKwkgKiBSZXN1bWUgdGhlIG1pcnJvciAtIHRoaXMgYWxzbyBhY3RpdmF0ZXMgdGhlIHZpc2libGUsIGluZGVwZW5kZW50CisJICogICAgICAgICAgICAgICAgICAgICBzb29uLXRvLWJlLXNwbGl0IHN1Yi1MVnMKKwkgKi8KKwlpZiAoIXJlc3VtZV9sdihjbWQsIG1pcnJvcmVkX3NlZy0+bHYpKSB7CisJCWxvZ19lcnJvcigiUHJvYmxlbSByZXN1bWluZyAlcyIsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJlY3ljbGUgbmV3bHkgc3BsaXQgTFYgc28gaXQgaXMgcHJvcGVybHkgcmVuYW1lZC4KKwkgKiAgIENsdXN0ZXIgcmVxdWlyZXMgdGhlIGV4dHJhIGRlYWN0aXZhdGUvYWN0aXZhdGUgY2FsbHMuCisJICovCisJaWYgKHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpICYmCisJICAgICghZGVhY3RpdmF0ZV9sdihjbWQsIG5ld19sdikgfHwKKwkgICAgICFfYWN0aXZhdGVfbHZfbGlrZV9tb2RlbChsdiwgbmV3X2x2KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVuYW1lIG5ld2x5IHNwbGl0IExWIGluIHRoZSBrZXJuZWwiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3VzcGVuZF9sdihjbWQsIG5ld19sdikgfHwgIXJlc3VtZV9sdihjbWQsIG5ld19sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVuYW1lIG5ld2x5IHNwbGl0IExWIGluIHRoZSBrZXJuZWwiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVtb3ZlIG9yaWdpbmFsIG1pcnJvciBsYXllciBpZiBpdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gbGluZWFyICovCisJaWYgKHN1Yl9sdiAmJiAhX2RlbGV0ZV9sdihsdiwgc3ViX2x2LCAxKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBSZW1vdmUgdGhlIGxvZyBpZiBpdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gbGluZWFyICovCisJaWYgKGRldGFjaGVkX2xvZ19sdiAmJiAhX2RlbGV0ZV9sdihsdiwgZGV0YWNoZWRfbG9nX2x2LCAxKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlbW92ZSBudW1fcmVtb3ZlZCBpbWFnZXMgZnJvbSBtaXJyb3JlZF9zZWcKKyAqCisgKiBBcmd1bWVudHM6CisgKiAgIG51bV9yZW1vdmVkOiAgIHRoZSByZXF1ZXN0ZWQgKG1heGltdW0pIG51bWJlciBvZiBtaXJyb3JzIHRvIGJlIHJlbW92ZWQKKyAqICAgcmVtb3ZhYmxlX3B2czogaWYgbm90IE5VTEwgYW5kIGxpc3Qgbm90IGVtcHR5LCBvbmx5IG1pcnJvcnMgdXNpbmcgUFZzCisgKiAgICAgICAgICAgICAgICAgIGluIHRoaXMgbGlzdCB3aWxsIGJlIHJlbW92ZWQKKyAqICAgcmVtb3ZlX2xvZzogICAgaWYgbm9uLXplcm8sIGxvZ19sdiB3aWxsIGJlIHJlbW92ZWQKKyAqICAgICAgICAgICAgICAgICAgKGV2ZW4gaWYgaXQncyAwLCBsb2dfbHYgd2lsbCBiZSByZW1vdmVkIGlmIHRoZXJlIGlzIG5vCisgKiAgICAgICAgICAgICAgICAgICBtaXJyb3IgcmVtYWluaW5nIGFmdGVyIHRoZSByZW1vdmFsKQorICogICBjb2xsYXBzZTogICAgICBpZiBub24temVybywgaW5zdGVhZCBvZiByZW1vdmluZywgcmVtb3ZlIHRoZSB0ZW1wb3JhcnkKKyAqICAgICAgICAgICAgICAgICAgbWlycm9yIGxheWVyIGFuZCBtZXJnZSBtaXJyb3JzIHRvIHRoZSBvcmlnaW5hbCBMVi4KKyAqICAgICAgICAgICAgICAgICAgcmVtb3ZhYmxlX3B2cyBzaG91bGQgYmUgTlVMTCBhbmQgbnVtX3JlbW92ZWQgc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgIHNlZy0+YXJlYV9jb3VudCAtIDEuCisgKiAgIHJlbW92ZWQ6ICAgICAgIGlmIG5vbiBOVUxMLCB0aGUgbnVtYmVyIG9mIHJlbW92ZWQgbWlycm9yIGltYWdlcyBpcyBzZXQKKyAqICAgICAgICAgICAgICAgICAgYXMgYSByZXN1bHQKKyAqCisgKiBJZiBjb2xsYXBzZSBpcyBub24temVybywgPHJlbW92ZWQ+IGlzIGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwgdG8gbnVtX3JlbW92ZWQuCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgRmFpbHVyZSAoMCkgbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFzIGhhcHBlbmQgYW5kCisgKiAgIHRoZSBjYWxsZXIgc2hvdWxkIGFib3J0LgorICogICBFdmVuIGlmIG5vIG1pcnJvciB3YXMgcmVtb3ZlZCAoZS5nLiBubyBMViBtYXRjaGVzIHRvICdyZW1vdmFibGVfcHZzJyksCisgKiAgIHJldHVybnMgc3VjY2VzcyAoMSkuCisgKi8KK3N0YXRpYyBpbnQgX3JlbW92ZV9taXJyb3JfaW1hZ2VzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJIHVpbnQzMl90IG51bV9yZW1vdmVkLAorCQkJCSBpbnQgKCppc19yZW1vdmFibGUpKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqLCB2b2lkICopLAorCQkJCSB2b2lkICpyZW1vdmFibGVfYmF0b24sCisJCQkJIHVuc2lnbmVkIHJlbW92ZV9sb2csIHVuc2lnbmVkIGNvbGxhcHNlLAorCQkJCSB1aW50MzJfdCAqcmVtb3ZlZCwgaW50IHByZWZlcnJlZF9vbmx5KQoreworCXVpbnQzMl90IG07CisJaW50MzJfdCBzOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc3ViX2x2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZGV0YWNoZWRfbG9nX2x2ID0gTlVMTDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnRlbXBfbGF5ZXJfbHYgPSBOVUxMOworCXN0cnVjdCBsdl9zZWdtZW50ICpwdm1vdmVfc2VnLCAqbWlycm9yZWRfc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwl1aW50MzJfdCBvbGRfYXJlYV9jb3VudCA9IG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudDsKKwl1aW50MzJfdCBuZXdfYXJlYV9jb3VudCA9IG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudDsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBkbV9saXN0IHRtcF9vcnBoYW5fbHZzOworCXVpbnQzMl90IG9yaWdfcmVtb3ZlZCA9IG51bV9yZW1vdmVkOworCWludCByZWFjdGl2YXRlOworCisJaWYgKHJlbW92ZWQpCisJCSpyZW1vdmVkID0gMDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlJlZHVjaW5nIG1pcnJvciBzZXQgJXMgZnJvbSAlIiBQUkl1MzIgIiB0byAlIgorCQkJIFBSSXUzMiAiIGltYWdlKHMpJXMuIiwgbHYtPm5hbWUsCisJCQkgb2xkX2FyZWFfY291bnQsIG9sZF9hcmVhX2NvdW50IC0gbnVtX3JlbW92ZWQsCisJCQkgcmVtb3ZlX2xvZyA/ICIgYW5kIG5vIGxvZyB2b2x1bWUiIDogIiIpOworCisJaWYgKGNvbGxhcHNlICYmIChvbGRfYXJlYV9jb3VudCAtIG51bV9yZW1vdmVkICE9IDEpKSB7CisJCWxvZ19lcnJvcigiSW5jb21wYXRpYmxlIHBhcmFtZXRlcnMgdG8gX3JlbW92ZV9taXJyb3JfaW1hZ2VzIik7CisJCXJldHVybiAwOworCisJfQorCisJbnVtX3JlbW92ZWQgPSAwOworCisJLyogTW92ZSByZW1vdmFibGVfcHZzIHRvIGVuZCBvZiBhcnJheSAqLworCWZvciAocyA9IG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudCAtIDE7CisJICAgICBzID49IDAgJiYgb2xkX2FyZWFfY291bnQgLSBuZXdfYXJlYV9jb3VudCA8IG9yaWdfcmVtb3ZlZDsKKwkgICAgIHMtLSkgeworCQlzdWJfbHYgPSBzZWdfbHYobWlycm9yZWRfc2VnLCBzKTsKKwkJaWYgKCEoaXNfdGVtcG9yYXJ5X21pcnJvcl9sYXllcihzdWJfbHYpICYmIGx2X21pcnJvcl9jb3VudChzdWJfbHYpICE9IDEpKSB7CisJCQlpZiAoIWlzX3JlbW92YWJsZSkgeworCQkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX3JlbW92ZV9taXJyb3JfaW1hZ2VzIGNhbGxlZCBpbmNvcnJlY3RseSB3aXRoIGlzX3JlbW92YWJsZSB1bmRlZmluZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIWlzX3JlbW92YWJsZShzdWJfbHYsIHJlbW92YWJsZV9iYXRvbikpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogQ2hlY2sgaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHB1bGwgdGhlCisJCQkgKiBwcmltYXJ5IG1pcnJvciBpbWFnZSB3aGVuIHRoZSBtaXJyb3IgaXMKKwkJCSAqIG5vdCBpbi1zeW5jLgorCQkJICovCisJCQlpZiAoKHMgPT0gMCkgJiYgIV9taXJyb3JlZF9sdl9pbl9zeW5jKGx2KSAmJgorCQkJICAgICEobHZfaXNfcGFydGlhbChsdikpKSB7CisJCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVtb3ZlIHByaW1hcnkgbWlycm9yIGltYWdlIHdoaWxlIG1pcnJvciBpcyBub3QgaW4tc3luYyIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFzaGlmdF9taXJyb3JfaW1hZ2VzKG1pcnJvcmVkX3NlZywgcykpCisJCQkJcmV0dXJuXzA7CisJCQktLW5ld19hcmVhX2NvdW50OworCQkJKytudW1fcmVtb3ZlZDsKKwkJfQorCX0KKworCWlmICghcHJlZmVycmVkX29ubHkpCisJCW51bV9yZW1vdmVkID0gb3JpZ19yZW1vdmVkOworCisJLyoKKwkgKiBJZiByZW1vdmFibGVfcHZzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIHRoZXkgaGF2ZSBiZWVuIHNoaWZ0ZWQKKwkgKiB0byB0aGUgZW5kIHRvIGVuc3VyZSB0aGV5IGFyZSByZW1vdmVkLiAgVGhlIHJlbWFpbmluZyBiYWxhbmNlCisJICogb2YgaW1hZ2VzIGxlZnQgdG8gcmVtb3ZlIHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgdW5zcGVjaWZpZWQuCisJICovCisJbmV3X2FyZWFfY291bnQgPSBvbGRfYXJlYV9jb3VudCAtIG51bV9yZW1vdmVkOworCisJaWYgKG51bV9yZW1vdmVkICYmIG9sZF9hcmVhX2NvdW50ID09IG5ld19hcmVhX2NvdW50KQorCQlyZXR1cm4gMTsKKworCS8qIFJlbW92ZSBtaW1hZ2UgTFZzIGZyb20gdGhlIHNlZ21lbnQgKi8KKwlkbV9saXN0X2luaXQoJnRtcF9vcnBoYW5fbHZzKTsKKwlmb3IgKG0gPSBuZXdfYXJlYV9jb3VudDsgbSA8IG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudDsgbSsrKSB7CisJCXNlZ19sdihtaXJyb3JlZF9zZWcsIG0pLT5zdGF0dXMgJj0gfk1JUlJPUl9JTUFHRTsKKwkJbHZfc2V0X3Zpc2libGUoc2VnX2x2KG1pcnJvcmVkX3NlZywgbSkpOworCQlpZiAoIShsdmwgPSBkbV9wb29sX2FsbG9jKGx2LT52Zy0+Y21kLT5tZW0sIHNpemVvZigqbHZsKSkpKSB7CisJCQlsb2dfZXJyb3IoImx2X2xpc3QgYWxsb2MgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsdmwtPmx2ID0gc2VnX2x2KG1pcnJvcmVkX3NlZywgbSk7CisJCWRtX2xpc3RfYWRkKCZ0bXBfb3JwaGFuX2x2cywgJmx2bC0+bGlzdCk7CisJCWlmICghcmVsZWFzZV9sdl9zZWdtZW50X2FyZWEobWlycm9yZWRfc2VnLCBtLCBtaXJyb3JlZF9zZWctPmFyZWFfbGVuKSkKKwkJCXJldHVybl8wOworCX0KKwltaXJyb3JlZF9zZWctPmFyZWFfY291bnQgPSBuZXdfYXJlYV9jb3VudDsKKworCS8qIElmIG5vIG1vcmUgbWlycm9ycywgcmVtb3ZlIG1pcnJvciBsYXllciAqLworCS8qIEFzIGFuIGV4Y2VwdGlvbmFsIGNhc2UsIGlmIHRoZSBsdiBpcyB0ZW1wb3JhcnkgbGF5ZXIsCisJICogbGVhdmUgdGhlIExWIGFzIG1pcnJvcmVkIGFuZCBsZXQgdGhlIGx2Y29udmVydCBjb21wbGV0aW9uCisJICogdG8gcmVtb3ZlIHRoZSBsYXllci4gKi8KKwlpZiAobmV3X2FyZWFfY291bnQgPT0gMSAmJiAhaXNfdGVtcG9yYXJ5X21pcnJvcl9sYXllcihsdikpIHsKKwkJdGVtcF9sYXllcl9sdiA9IHNlZ19sdihtaXJyb3JlZF9zZWcsIDApOworCQl0ZW1wX2xheWVyX2x2LT5zdGF0dXMgJj0gfk1JUlJPUl9JTUFHRTsKKwkJbHZfc2V0X3Zpc2libGUodGVtcF9sYXllcl9sdik7CisJCWRldGFjaGVkX2xvZ19sdiA9IGRldGFjaF9taXJyb3JfbG9nKG1pcnJvcmVkX3NlZyk7CisJCWlmICghcmVtb3ZlX2xheWVyX2Zyb21fbHYobHYsIHRlbXBfbGF5ZXJfbHYpKQorCQkJcmV0dXJuXzA7CisJCWlmIChjb2xsYXBzZSAmJiAhX21lcmdlX21pcnJvcl9pbWFnZXMobHYsICZ0bXBfb3JwaGFuX2x2cykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCBtaXJyb3IgaW1hZ2VzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTm8gbG9uZ2VyIGEgbWlycm9yPyBFdmVuIHRob3VnaCBuZXdfYXJlYV9jb3VudCB3YXMgMSwKKyAgICAgICAgICAgICAgICAgKiBfbWVyZ2VfbWlycm9yX2ltYWdlcyBtYXkgaGF2ZSByZXN1bHRlZCBpbnRvIGx2IGJlaW5nIHN0aWxsIGEKKyAgICAgICAgICAgICAgICAgKiBtaXJyb3IuIEZpeCB1cCB0aGUgZmxhZ3MgaWYgd2Ugb25seSBoYXZlIG9uZSBpbWFnZSBsZWZ0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChsdl9taXJyb3JfY291bnQobHYpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbHYtPnN0YXR1cyAmPSB+TUlSUk9SOworICAgICAgICAgICAgICAgICAgICBsdi0+c3RhdHVzICY9IH5NSVJST1JFRDsKKyAgICAgICAgICAgICAgICAgICAgbHYtPnN0YXR1cyAmPSB+TFZfTk9UU1lOQ0VEOworICAgICAgICAgICAgICAgIH0KKwkJbWlycm9yZWRfc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwkJaWYgKHJlbW92ZV9sb2cgJiYgIWRldGFjaGVkX2xvZ19sdikKKwkJCWRldGFjaGVkX2xvZ19sdiA9IGRldGFjaF9taXJyb3JfbG9nKG1pcnJvcmVkX3NlZyk7CisKKwkJaWYgKGx2X2lzX3B2bW92ZShsdikpCisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZtb3ZlX3NlZywgJmx2LT5zZWdtZW50cykKKwkJCQlwdm1vdmVfc2VnLT5zdGF0dXMgfD0gUFZNT1ZFOworCX0gZWxzZSBpZiAobmV3X2FyZWFfY291bnQgPT0gMCkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJBbGwgbWltYWdlcyBvZiAlcyBhcmUgZ29uZSIsIGx2LT5uYW1lKTsKKworCQkvKiBBbGwgbWlycm9yIGltYWdlcyBhcmUgZ29uZS4KKwkJICogSXQgY2FuIGhhcHBlbiBmb3IgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nLiAqLworCQlkZXRhY2hlZF9sb2dfbHYgPSBkZXRhY2hfbWlycm9yX2xvZyhtaXJyb3JlZF9zZWcpOworCQlsdi0+c3RhdHVzICY9IH5NSVJST1I7CisJCWx2LT5zdGF0dXMgJj0gfk1JUlJPUkVEOworCQlsdi0+c3RhdHVzICY9IH5MVl9OT1RTWU5DRUQ7CisJCWlmICghcmVwbGFjZV9sdl93aXRoX2Vycm9yX3NlZ21lbnQobHYpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmIChyZW1vdmVfbG9nKQorCQlkZXRhY2hlZF9sb2dfbHYgPSBkZXRhY2hfbWlycm9yX2xvZyhtaXJyb3JlZF9zZWcpOworCisJLyoKKwkgKiBUaGUgbG9nIG1heSBiZSByZW1vdmVkIGR1ZSB0byByZXBhaXIuICBJZiB0aGUgbG9nCisJICogaGFwcGVucyB0byBiZSBhIG1pcnJvcmVkIGxvZywgdGhlbiB0aGVyZSBpcyBhIHNwZWNpYWwKKwkgKiBjYXNlIHdlIG5lZWQgdG8gY29uc2lkZXIuICBPbmUgb2YgdGhlIGltYWdlcyBvZiBhCisJICogbWlycm9yZWQgbG9nIGNhbiBmYWlsIGZvbGxvd2VkIHNob3J0bHkgYWZ0ZXJ3YXJkcyBieQorCSAqIGEgZmFpbHVyZSBvZiB0aGUgc2Vjb25kLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB0b3AtbGV2ZWwKKwkgKiBtaXJyb3IgaXMgd2FpdGluZyBmb3Igd3JpdGVzIHRvIHRoZSBsb2cgdG8gZmluaXNoLCBidXQKKwkgKiB0aGV5IG5ldmVyIHdpbGwgdW5sZXNzIHRoZSBtaXJyb3JlZCBsb2cgY2FuIGJlIHJlcGFpcmVkCisJICogb3IgcmVwbGFjZWQgd2l0aCBhbiBlcnJvciB0YXJnZXQuICBTaW5jZSBib3RoIHRoZSBkZXZpY2VzCisJICogaGF2ZSBmYWlsZWQsIHdlIG11c3QgcmVwbGFjZSB3aXRoIGVycm9yIHRhcmdldCAtIGl0IGlzCisJICogdGhlIG9ubHkgd2F5IHRvIHJlbGVhc2UgdGhlIHBlbmRpbmcgd3JpdGVzLgorCSAqLworCWlmIChkZXRhY2hlZF9sb2dfbHYgJiYgbHZfaXNfbWlycm9yZWQoZGV0YWNoZWRfbG9nX2x2KSAmJgorCSAgICBsdl9pc19wYXJ0aWFsKGRldGFjaGVkX2xvZ19sdikpIHsKKwkJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhkZXRhY2hlZF9sb2dfbHYpOworCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIGJlaW5nIHJlbW92ZWQgZHVlIHRvIGZhaWx1cmVzIiwKKwkJCQkgZGV0YWNoZWRfbG9nX2x2LT5uYW1lKTsKKworCQkvKgorCQkgKiBXZSBhcmUgZ29pbmcgdG8gcmVwbGFjZSB0aGUgbWlycm9yIHdpdGggYW4KKwkJICogZXJyb3Igc2VnbWVudCwgYnV0IGJlZm9yZSB3ZSBkbywgd2UgbXVzdCByZW1lbWJlcgorCQkgKiBhbGwgb2YgdGhlIExWcyB0aGF0IG11c3QgYmUgZGVsZXRlZCBsYXRlciAoaS5lLgorCQkgKiB0aGUgc3ViLWx2J3MpCisJCSAqLworCQlmb3IgKG0gPSAwOyBtIDwgc2VnLT5hcmVhX2NvdW50OyBtKyspIHsKKwkJCXNlZ19sdihzZWcsIG0pLT5zdGF0dXMgJj0gfk1JUlJPUl9JTUFHRTsKKwkJCWx2X3NldF92aXNpYmxlKHNlZ19sdihzZWcsIG0pKTsKKwkJCWlmICghKGx2bCA9IGRtX3Bvb2xfYWxsb2MobHYtPnZnLT5jbWQtPm1lbSwKKwkJCQkJCSAgc2l6ZW9mKCpsdmwpKSkpIHsKKwkJCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsdmwtPmx2ID0gc2VnX2x2KHNlZywgbSk7CisJCQlkbV9saXN0X2FkZCgmdG1wX29ycGhhbl9sdnMsICZsdmwtPmxpc3QpOworCQl9CisKKwkJaWYgKCFyZXBsYWNlX2x2X3dpdGhfZXJyb3Jfc2VnbWVudChkZXRhY2hlZF9sb2dfbHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCBlcnJvciB0YXJnZXQgc3Vic3RpdHV0aW9uIGZvciAlcyIsCisJCQkJICBkZXRhY2hlZF9sb2dfbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXZnX3dyaXRlKGRldGFjaGVkX2xvZ19sdi0+dmcpKSB7CisJCQlsb2dfZXJyb3IoImludGVybWVkaWF0ZSBWRyB3cml0ZSBmYWlsZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc3VzcGVuZF9sdihkZXRhY2hlZF9sb2dfbHYtPnZnLT5jbWQsCisJCQkJZGV0YWNoZWRfbG9nX2x2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3VzcGVuZCAlcyIsCisJCQkJICBkZXRhY2hlZF9sb2dfbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisgCQl9CisKKwkJaWYgKCF2Z19jb21taXQoZGV0YWNoZWRfbG9nX2x2LT52ZykpIHsKKwkJCWlmICghcmVzdW1lX2x2KGRldGFjaGVkX2xvZ19sdi0+dmctPmNtZCwKKwkJCQkgICAgICAgZGV0YWNoZWRfbG9nX2x2KSkKKwkJCQlzdGFjazsKKwkJCXJldHVybl8wOworCQl9CisKKwkJaWYgKCFyZXN1bWVfbHYoZGV0YWNoZWRfbG9nX2x2LT52Zy0+Y21kLCBkZXRhY2hlZF9sb2dfbHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXN1bWUgJXMiLAorCQkJCSAgZGV0YWNoZWRfbG9nX2x2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBUbyBzdWNjZXNzZnVsbHkgcmVtb3ZlIHRoZXNlIHVud2FudGVkIExWcyB3ZSBuZWVkIHRvCisJICogcmVtb3ZlIHRoZSBMVnMgZnJvbSB0aGUgbWlycm9yIHNldCwgY29tbWl0IHRoYXQgbWV0YWRhdGEKKwkgKiB0aGVuIGRlYWN0aXZhdGUgYW5kIHJlbW92ZSB0aGVtIGZ1bGx5LgorCSAqLworCisJaWYgKCF2Z193cml0ZShtaXJyb3JlZF9zZWctPmx2LT52ZykpIHsKKwkJbG9nX2Vycm9yKCJpbnRlcm1lZGlhdGUgVkcgd3JpdGUgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN1c3BlbmRfbHZfb3JpZ2luKG1pcnJvcmVkX3NlZy0+bHYtPnZnLT5jbWQsIG1pcnJvcmVkX3NlZy0+bHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGxvY2sgJXMiLCBtaXJyb3JlZF9zZWctPmx2LT5uYW1lKTsKKwkJdmdfcmV2ZXJ0KG1pcnJvcmVkX3NlZy0+bHYtPnZnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRklYTUU6IHNlY29uZCBzdXNwZW5kIHNob3VsZCBub3QgYmUgbmVlZGVkCisJICogRXhwbGljaXRseSBzdXNwZW5kIHRlbXBvcmFyeSBMVi4KKwkgKiBUaGlzIGJhbGFuY2VzIGNyaXRpY2FsX3NlY3Rpb25faW5jKCkgY2FsbHMgd2l0aCBjcml0aWNhbF9zZWN0aW9uX2RlYygpCisJICogaW4gcmVzdW1lIChib3RoIGxvY2FsIGFuZCBjbHVzdGVyKSBhbmQgYWxzbyBwcm9wZXJseSBwcm9wYWdhdGVzIHByZWNvbW1pdHRlZAorCSAqIG1ldGFkYXRhIGludG8gZG0gdGFibGUgb24gb3RoZXIgbm9kZXMuCisJICogRklYTUU6IGNoZWNrIHByb3BhZ2F0aW9uIG9mIHN1c3BlbmQgd2l0aCB2aXNpYmxlIGZsYWcKKwkgKi8KKwlpZiAodGVtcF9sYXllcl9sdiAmJiAhc3VzcGVuZF9sdih0ZW1wX2xheWVyX2x2LT52Zy0+Y21kLCB0ZW1wX2xheWVyX2x2KSkKKwkJbG9nX2Vycm9yKCJQcm9ibGVtIHN1c3BlbmRpbmcgdGVtcG9yYXJ5IExWICVzIiwgdGVtcF9sYXllcl9sdi0+bmFtZSk7CisKKwlpZiAoIXZnX2NvbW1pdChtaXJyb3JlZF9zZWctPmx2LT52ZykpIHsKKwkJaWYgKCFyZXN1bWVfbHYobWlycm9yZWRfc2VnLT5sdi0+dmctPmNtZCwgbWlycm9yZWRfc2VnLT5sdikpCisJCQlzdGFjazsKKwkJcmV0dXJuXzA7CisJfQorCisJbG9nX3ZlcnlfdmVyYm9zZSgiVXBkYXRpbmcgXCIlc1wiIGluIGtlcm5lbCIsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCisJLyoKKwkgKiBBdm9pZCBoYXZpbmcgc2FtZSBtaXJyb3IgdGFyZ2V0IGxvYWRlZCB0d2ljZSBzaW11bHRhbmVvdXNseSBieSBmaXJzdAorCSAqIHJlc3VtaW5nIHRoZSByZW1vdmVkIExWIHdoaWNoIG5vdyBjb250YWlucyBhbiBlcnJvciBzZWdtZW50LgorCSAqIEFzIGl0J3Mgbm93IGRldGFjaGVkIGZyb20gbWlycm9yZWRfc2VnLT5sdiB3ZSBtdXN0IHJlc3VtZSBpdAorCSAqIGV4cGxpY2l0bHkuCisJICovCisJaWYgKHRlbXBfbGF5ZXJfbHYgJiYgIXJlc3VtZV9sdih0ZW1wX2xheWVyX2x2LT52Zy0+Y21kLCB0ZW1wX2xheWVyX2x2KSkgeworCQlsb2dfZXJyb3IoIlByb2JsZW0gcmVzdW1pbmcgdGVtcG9yYXJ5IExWLCAlcyIsIHRlbXBfbGF5ZXJfbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJlc3VtZV9sdl9vcmlnaW4obWlycm9yZWRfc2VnLT5sdi0+dmctPmNtZCwgbWlycm9yZWRfc2VnLT5sdikpIHsKKwkJbG9nX2Vycm9yKCJQcm9ibGVtIHJlYWN0aXZhdGluZyAlcyIsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTYXZlIG9yIGRlbGV0ZSB0aGUgJ29ycGhhbicgTFZzICovCisJcmVhY3RpdmF0ZSA9IGx2X2lzX2FjdGl2ZShsdl9sb2NrX2hvbGRlcihsdikpOworCWlmICghY29sbGFwc2UpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnRtcF9vcnBoYW5fbHZzKQorCQkJaWYgKCFfZGVsZXRlX2x2KGx2LCBsdmwtPmx2LCByZWFjdGl2YXRlKSkKKwkJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAodGVtcF9sYXllcl9sdiAmJiAhX2RlbGV0ZV9sdihsdiwgdGVtcF9sYXllcl9sdiwgcmVhY3RpdmF0ZSkpCisJCXJldHVybl8wOworCisJaWYgKGRldGFjaGVkX2xvZ19sdiAmJiAhX2RlbGV0ZV9sdihsdiwgZGV0YWNoZWRfbG9nX2x2LCByZWFjdGl2YXRlKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBNaXJyb3Igd2l0aCBvbmx5IDEgYXJlYSBpcyAnaW4gc3luYycuICovCisJaWYgKG5ld19hcmVhX2NvdW50ID09IDEgJiYgaXNfdGVtcG9yYXJ5X21pcnJvcl9sYXllcihsdikpIHsKKwkJaWYgKGZpcnN0X3NlZyhsdiktPmxvZ19sdiAmJgorCQkgICAgIV9pbml0X21pcnJvcl9sb2cobHYtPnZnLT5jbWQsIGZpcnN0X3NlZyhsdiktPmxvZ19sdiwKKwkJCQkgICAgICAxLCAmbHYtPnRhZ3MsIDApKSB7CisJCQkvKiBBcyBhIHJlc3VsdCwgdW5uZWNlc3Nhcnkgc3luYyBtYXkgcnVuIGFmdGVyCisJCQkgKiBjb2xsYXBzaW5nLiBCdXQgc2FmZS4qLworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBsb2cgZGV2aWNlIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChyZW1vdmVkKQorCQkqcmVtb3ZlZCA9IG9sZF9hcmVhX2NvdW50IC0gbmV3X2FyZWFfY291bnQ7CisKKwlsb2dfdmVyeV92ZXJib3NlKEZNVHUzMiAiIGltYWdlKHMpIHJlbW92ZWQgZnJvbSAlcyIsCisJCQkgb2xkX2FyZWFfY291bnQgLSBuZXdfYXJlYV9jb3VudCwgbHYtPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIG51bWJlciBvZiBtaXJyb3IgaW1hZ2VzIGZyb20gdGhlIExWCisgKi8KK2ludCByZW1vdmVfbWlycm9yX2ltYWdlcyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1aW50MzJfdCBudW1fbWlycm9ycywKKwkJCSBpbnQgKCppc19yZW1vdmFibGUpKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqLCB2b2lkICopLAorCQkJIHZvaWQgKnJlbW92YWJsZV9iYXRvbiwgdW5zaWduZWQgcmVtb3ZlX2xvZykKK3sKKwl1aW50MzJfdCBudW1fcmVtb3ZlZCwgcmVtb3ZlZF9vbmNlLCByOworCXVpbnQzMl90IGV4aXN0aW5nX21pcnJvcnMgPSBsdl9taXJyb3JfY291bnQobHYpOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbmV4dF9sdiA9IGx2OworCisJaW50IHByZWZlcnJlZF9vbmx5ID0gMTsKKwlpbnQgcmV0cmllcyA9IDA7CisKKwludW1fcmVtb3ZlZCA9IGV4aXN0aW5nX21pcnJvcnMgLSBudW1fbWlycm9yczsKKworCS8qIG51bV9yZW1vdmVkIGNhbiBiZSAwIGlmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCB0byByZW1vdmUgbG9nICovCisJZG8geworCQlpZiAobnVtX3JlbW92ZWQgPCBmaXJzdF9zZWcobmV4dF9sdiktPmFyZWFfY291bnQpCisJCQlyZW1vdmVkX29uY2UgPSBudW1fcmVtb3ZlZDsKKwkJZWxzZQorCQkJcmVtb3ZlZF9vbmNlID0gZmlyc3Rfc2VnKG5leHRfbHYpLT5hcmVhX2NvdW50IC0gMTsKKworCQlpZiAoIV9yZW1vdmVfbWlycm9yX2ltYWdlcyhuZXh0X2x2LCByZW1vdmVkX29uY2UsCisJCQkJCSAgIGlzX3JlbW92YWJsZSwgcmVtb3ZhYmxlX2JhdG9uLAorCQkJCQkgICByZW1vdmVfbG9nLCAwLCAmciwgcHJlZmVycmVkX29ubHkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKHIgPCByZW1vdmVkX29uY2UgfHwgIXJlbW92ZWRfb25jZSkgeworCQkJLyogU29tZSBtaXJyb3JzIGFyZSByZW1vdmVkIGZyb20gdGhlIHRlbXBvcmFyeSBtaXJyb3IsCisJCQkgKiBidXQgdGhlIHRlbXBvcmFyeSBsYXllciBzdGlsbCBleGlzdHMuCisJCQkgKiBEb3duIHRoZSBzdGFjayBhbmQgcmV0cnkgZm9yIHJlbWFpbmRlci4gKi8KKwkJCW5leHRfbHYgPSBmaW5kX3RlbXBvcmFyeV9taXJyb3IobmV4dF9sdik7CisJCQlpZiAoIW5leHRfbHYpIHsKKwkJCQlwcmVmZXJyZWRfb25seSA9IDA7CisJCQkJbmV4dF9sdiA9IGx2OworCQkJfQorCQl9CisKKwkJbnVtX3JlbW92ZWQgLT0gcjsKKworCQkvKgorCQkgKiBpZiB0aGVyZSBhcmUgc3RpbGwgaW1hZ2VzIHRvIGJlIHJlbW92ZWQsIHRyeSBhZ2FpbjsgdGhpcyBpcworCQkgKiByZXF1aXJlZCBzaW5jZSBzb21lIHRlbXBvcmFyeSBsYXllcnMgbWF5IGhhdmUgYmVlbiByZWR1Y2VkCisJCSAqIHRvIDEsIGF0IHdoaWNoIHBvaW50IHRoZXkgYXJlIG1hZGUgcmVtb3ZhYmxlLCBqdXN0IGxpa2UKKwkJICogbm9ybWFsIGltYWdlcworCQkgKi8KKwkJaWYgKCFuZXh0X2x2ICYmICFwcmVmZXJyZWRfb25seSAmJiAhcmV0cmllcyAmJiBudW1fcmVtb3ZlZCkgeworCQkJKytyZXRyaWVzOworCQkJcHJlZmVycmVkX29ubHkgPSAxOworCQl9CisKKwl9IHdoaWxlIChuZXh0X2x2ICYmIG51bV9yZW1vdmVkKTsKKworCWlmIChudW1fcmVtb3ZlZCkgeworCQlpZiAobnVtX3JlbW92ZWQgPT0gZXhpc3RpbmdfbWlycm9ycyAtIG51bV9taXJyb3JzKQorCQkJbG9nX2Vycm9yKCJObyBtaXJyb3IgaW1hZ2VzIGZvdW5kIHVzaW5nIHNwZWNpZmllZCBQVnMuIik7CisJCWVsc2UgeworCQkJbG9nX2Vycm9yKCIldSBpbWFnZXMgYXJlIHJlbW92ZWQgb3V0IG9mIHJlcXVlc3RlZCAldS4iLAorCQkJCSAgZXhpc3RpbmdfbWlycm9ycyAtIGx2X21pcnJvcl9jb3VudChsdiksCisJCQkJICBleGlzdGluZ19taXJyb3JzIC0gbnVtX21pcnJvcnMpOworCQl9CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9ub19yZW1vdmFibGVfaW1hZ2VzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJdm9pZCAqYmF0b24gX19hdHRyaWJ1dGVfXygodW51c2VkKSkpIHsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbGxhcHNpbmcgdGVtcG9yYXJ5IG1pcnJvciBsYXllcnMuCisgKgorICogV2hlbiBtaXJyb3JzIGFyZSBhZGRlZCB0byBhbHJlYWR5LW1pcnJvcmVkIExWLCBhIHRlbXBvcmFyeSBtaXJyb3IgbGF5ZXIKKyAqIGlzIGluc2VydGVkIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHRvIHJlZHVjZSByZXN5bmMgd29yay4KKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGxheWVyIGFuZCBjb2xsYXBzZSB0aGUgc3RhY2sKKyAqIGFzIGZhciBhcyBtaXJyb3JzIGFyZSBpbi1zeW5jLgorICoKKyAqIFRoZSBmdW5jdGlvbiBpcyBkZXN0cnVjdGl2ZTogdG8gcmVtb3ZlIGludGVybWVkaWF0ZSBtaXJyb3IgbGF5ZXJzLAorICogVkcgbWV0YWRhdGEgY29tbWl0cyBhbmQgc3VzcGVuZC9yZXN1bWUgYXJlIG5lY2Vzc2FyeS4KKyAqLworaW50IGNvbGxhcHNlX21pcnJvcmVkX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICp0bXBfbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcl9zZWc7CisKKwl3aGlsZSAoKHRtcF9sdiA9IGZpbmRfdGVtcG9yYXJ5X21pcnJvcihsdikpKSB7CisJCW1pcnJvcl9zZWcgPSBmaW5kX21pcnJvcl9zZWcoZmlyc3Rfc2VnKHRtcF9sdikpOworCQlpZiAoIW1pcnJvcl9zZWcpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgbWlycm9yZWQgTFYgZm9yICVzIiwKKwkJCQkgIHRtcF9sdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghX21pcnJvcmVkX2x2X2luX3N5bmMobWlycm9yX3NlZy0+bHYpKSB7CisJCQlsb2dfdmVyYm9zZSgiTm90IGNvbGxhcHNpbmcgJXM6IG91dC1vZi1zeW5jIiwKKwkJCQkgICAgbWlycm9yX3NlZy0+bHYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoIV9yZW1vdmVfbWlycm9yX2ltYWdlcyhtaXJyb3Jfc2VnLT5sdiwKKwkJCQkJICAgbWlycm9yX3NlZy0+YXJlYV9jb3VudCAtIDEsCisJCQkJCSAgIF9ub19yZW1vdmFibGVfaW1hZ2VzLCBOVUxMLCAwLCAxLCBOVUxMLCAwKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVsZWFzZSBtaXJyb3IgaW1hZ2VzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisjaWYgMAorLyogRklYTUU6IHJlY29uZmlndXJlX21pcnJvcl9pbWFnZXM6IHJlbW92ZSB0aGlzIGNvZGU/ICovCitzdGF0aWMgaW50IF9nZXRfbWlycm9yX2ZhdWx0X3BvbGljeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICBpbnQgbG9nX3BvbGljeSkKK3sKKwljb25zdCBjaGFyICpwb2xpY3kgPSBOVUxMOworLyoKKwlpZiAobG9nX3BvbGljeSkKKwkJcG9saWN5ID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBhY3RpdmF0aW9uX21pcnJvcl9sb2dfZmF1bHRfcG9saWN5X0NGRyk7CisJZWxzZSB7CisJCXBvbGljeSA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgYWN0aXZhdGlvbl9taXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5X0NGRyk7CisJCWlmICghcG9saWN5KQorCQkJcG9saWN5ID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBhY3RpdmF0aW9uX21pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5X0NGRyk7CisJfQorKi8KKwlpZiAoIXN0cmNtcChwb2xpY3ksICJyZW1vdmUiKSkKKwkJcmV0dXJuIE1JUlJPUl9SRU1PVkU7CisJZWxzZSBpZiAoIXN0cmNtcChwb2xpY3ksICJhbGxvY2F0ZSIpKQorCQlyZXR1cm4gTUlSUk9SX0FMTE9DQVRFOworCWVsc2UgaWYgKCFzdHJjbXAocG9saWN5LCAiYWxsb2NhdGVfYW55d2hlcmUiKSkKKwkJcmV0dXJuIE1JUlJPUl9BTExPQ0FURV9BTllXSEVSRTsKKworCWlmIChsb2dfcG9saWN5KQorCQlsb2dfZXJyb3IoIkJhZCBhY3RpdmF0aW9uL21pcnJvcl9sb2dfZmF1bHRfcG9saWN5Iik7CisJZWxzZQorCQlsb2dfZXJyb3IoIkJhZCBhY3RpdmF0aW9uL21pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5Iik7CisKKwlyZXR1cm4gTUlSUk9SX1JFTU9WRTsKK30KKworc3RhdGljIGludCBfZ2V0X21pcnJvcl9sb2dfZmF1bHRfcG9saWN5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybiBfZ2V0X21pcnJvcl9mYXVsdF9wb2xpY3koY21kLCAxKTsKK30KKworc3RhdGljIGludCBfZ2V0X21pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybiBfZ2V0X21pcnJvcl9mYXVsdF9wb2xpY3koY21kLCAwKTsKK30KKworLyoKKyAqIHJlcGxhY2VfbWlycm9yX2ltYWdlcworICogQG1pcnJvcmVkX3NlZzogc2VnbWVudCAod2hpY2ggbWF5IGJlIGxpbmVhciBub3cpIHRvIHJlc3RvcmUKKyAqIEBudW1fbWlycm9yczogbnVtYmVyIG9mIGNvcGllcyB3ZSBzaG91bGQgZW5kIHVwIHdpdGgKKyAqIEByZXBsYWNlX2xvZzogcmVwbGFjZSBsb2cgaWYgbm90IHByZXNlbnQKKyAqIEBpbl9zeW5jOiB3YXMgdGhlIG9yaWdpbmFsIG1pcnJvciBpbi1zeW5jPworICoKKyAqIGluX3N5bmMgd2lsbCBiZSBzZXQgdG8gMCBpZiBuZXcgbWlycm9yIGRldmljZXMgYXJlIGJlaW5nIGFkZGVkCisgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgb25seSB1c2VmdWwgaWYgdGhlIGxvZyAoYW5kIG9ubHkgdGhlIGxvZykKKyAqIGlzIGJlaW5nIHJlc3RvcmVkLgorICoKKyAqIFJldHVybnM6IDAgb24gZmFpbHVyZSwgMSBvbiByZWNvbmZpZywgLTEgaWYgbm8gcmVjb25maWcgZG9uZQorICovCitzdGF0aWMgaW50IF9yZXBsYWNlX21pcnJvcl9pbWFnZXMoc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcmVkX3NlZywKKwkJCQkgdWludDMyX3QgbnVtX21pcnJvcnMsCisJCQkJIGludCBsb2dfcG9saWN5LCBpbnQgaW5fc3luYykKK3sKKwlpbnQgciA9IC0xOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBtaXJyb3JlZF9zZWctPmx2OworCisJLyogRklYTUU6IFVzZSBsdmNvbnZlcnQgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgaXRzIGNvZGUgKi8KKworCWlmIChtaXJyb3JlZF9zZWctPmFyZWFfY291bnQgPCBudW1fbWlycm9ycykgeworCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHJlcGxhY2UgbWlycm9yIGRldmljZSBpbiAlcy8lcyIsCisJCQkgbWlycm9yZWRfc2VnLT5sdi0+dmctPm5hbWUsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCisJCWlmICgobWlycm9yZWRfc2VnLT5hcmVhX2NvdW50ID4gMSkgJiYgIW1pcnJvcmVkX3NlZy0+bG9nX2x2KQorCQkJbG9nX3dhcm4oIldBUk5JTkc6IFVzZSAnbHZjb252ZXJ0IC1tICVkICVzLyVzIC0tY29yZWxvZycgdG8gcmVwbGFjZSBmYWlsZWQgZGV2aWNlcyIsCisJCQkJIG51bV9taXJyb3JzIC0gMSwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCWVsc2UKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBVc2UgJ2x2Y29udmVydCAtbSAlZCAlcy8lcycgdG8gcmVwbGFjZSBmYWlsZWQgZGV2aWNlcyIsCisJCQkJIG51bV9taXJyb3JzIC0gMSwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXIgPSAwOworCisJCS8qIFJFTUVNQkVSL0ZJWE1FOiBzZXQgaW5fc3luYyB0byAwIGlmIGEgbmV3IG1pcnJvciBkZXZpY2Ugd2FzIGFkZGVkICovCisJCWluX3N5bmMgPSAwOworCX0KKworCS8qCisJICogRklYTUU6IHJpZ2h0IG5vdywgd2UgaWdub3JlIHRoZSBhbGxvY2F0aW9uIHBvbGljeSBzcGVjaWZpZWQgdG8KKwkgKiBhbGxvY2F0ZSB0aGUgbmV3IGxvZy4KKwkgKi8KKwlpZiAoKG1pcnJvcmVkX3NlZy0+YXJlYV9jb3VudCA+IDEpICYmICFtaXJyb3JlZF9zZWctPmxvZ19sdiAmJgorCSAgICAobG9nX3BvbGljeSAhPSBNSVJST1JfUkVNT1ZFKSkgeworCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHJlcGxhY2UgbWlycm9yIGxvZyBkZXZpY2UgaW4gJXMvJXMiLAorCQkJIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCisJCWxvZ193YXJuKCJXQVJOSU5HOiBVc2UgJ2x2Y29udmVydCAtbSAlZCAlcy8lcycgdG8gcmVwbGFjZSBmYWlsZWQgZGV2aWNlcyIsCisJCQkgbWlycm9yZWRfc2VnLT5hcmVhX2NvdW50IC0gMSAsIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IHJlY29uZmlndXJlX21pcnJvcl9pbWFnZXMoc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcmVkX3NlZywgdWludDMyX3QgbnVtX21pcnJvcnMsCisJCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhYmxlX3B2cywgdW5zaWduZWQgcmVtb3ZlX2xvZykKK3sKKwlpbnQgcjsKKwlpbnQgaW5fc3luYzsKKwlpbnQgbG9nX3BvbGljeSwgZGV2X3BvbGljeTsKKwl1aW50MzJfdCBvbGRfbnVtX21pcnJvcnMgPSBtaXJyb3JlZF9zZWctPmFyZWFfY291bnQ7CisJaW50IGhhZF9sb2cgPSAobWlycm9yZWRfc2VnLT5sb2dfbHYpID8gMSA6IDA7CisKKwkvKiB3YXMgdGhlIG1pcnJvciBpbi1zeW5jIGJlZm9yZSBwcm9ibGVtcz8gKi8KKwlpbl9zeW5jID0gX21pcnJvcmVkX2x2X2luX3N5bmMobWlycm9yZWRfc2VnLT5sdik7CisKKwkvKgorCSAqIFdoaWxlIHdlIGFyZSBvbmx5IHJlbW92aW5nIGRldmljZXMsIHdlIGNhbiBoYXZlIHN5bmMgc2V0LgorCSAqIFNldHRpbmcgdGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB3ZSBhcmUgbW92aW5nIHRvIGNvcmUgbG9nCisJICogb3RoZXJ3aXNlIHRoZSBkaXNrIGxvZyB3aWxsIGNvbnRhaW4gdGhlIHN5bmMgaW5mb3JtYXRpb24KKwkgKi8KKwlpbml0X21pcnJvcl9pbl9zeW5jKGluX3N5bmMpOworCisJciA9IF9yZW1vdmVfbWlycm9yX2ltYWdlcyhtaXJyb3JlZF9zZWctPmx2LCBvbGRfbnVtX21pcnJvcnMgLSBudW1fbWlycm9ycywKKwkJCQkgIGlzX21pcnJvcl9pbWFnZV9yZW1vdmFibGUsIHJlbW92YWJsZV9wdnMsCisJCQkJICByZW1vdmVfbG9nLCAwLCBOVUxMLCAwKTsKKwlpZiAoIXIpCisJCS8qIFVuYWJsZSB0byByZW1vdmUgYmFkIGRldmljZXMgKi8KKwkJcmV0dXJuIDA7CisKKwlsb2dfd2FybigiV0FSTklORzogQmFkIGRldmljZSByZW1vdmVkIGZyb20gbWlycm9yIHZvbHVtZSwgJXMvJXMiLAorCQkgIG1pcnJvcmVkX3NlZy0+bHYtPnZnLT5uYW1lLCBtaXJyb3JlZF9zZWctPmx2LT5uYW1lKTsKKworCWxvZ19wb2xpY3kgPSBfZ2V0X21pcnJvcl9sb2dfZmF1bHRfcG9saWN5KG1pcnJvcmVkX3NlZy0+bHYtPnZnLT5jbWQpOworCWRldl9wb2xpY3kgPSBfZ2V0X21pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5KG1pcnJvcmVkX3NlZy0+bHYtPnZnLT5jbWQpOworCisJciA9IF9yZXBsYWNlX21pcnJvcl9pbWFnZXMobWlycm9yZWRfc2VnLAorCQkJCSAgKGRldl9wb2xpY3kgIT0gTUlSUk9SX1JFTU9WRSkgPworCQkJCSAgb2xkX251bV9taXJyb3JzIDogbnVtX21pcnJvcnMsCisJCQkJICBsb2dfcG9saWN5LCBpbl9zeW5jKTsKKworCWlmICghcikKKwkJLyogRmFpbGVkIHRvIHJlcGxhY2UgZGV2aWNlKHMpICovCisJCWxvZ193YXJuKCJXQVJOSU5HOiBVbmFibGUgdG8gZmluZCBzdWJzdGl0dXRlIGRldmljZSBmb3IgbWlycm9yIHZvbHVtZSwgJXMvJXMiLAorCQkJIG1pcnJvcmVkX3NlZy0+bHYtPnZnLT5uYW1lLCBtaXJyb3JlZF9zZWctPmx2LT5uYW1lKTsKKwllbHNlIGlmIChyID4gMCkKKwkJLyogU3VjY2VzcyBpbiByZXBsYWNpbmcgZGV2aWNlKHMpICovCisJCWxvZ193YXJuKCJXQVJOSU5HOiBNaXJyb3Igdm9sdW1lLCAlcy8lcyByZXN0b3JlZCAtIHN1YnN0aXR1dGUgZm9yIGZhaWxlZCBkZXZpY2UgZm91bmQuIiwKKwkJCSAgbWlycm9yZWRfc2VnLT5sdi0+dmctPm5hbWUsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCWVsc2UKKwkJLyogQmFkIGRldmljZSByZW1vdmVkLCBidXQgbm90IHJlcGxhY2VkIGJlY2F1c2Ugb2YgcG9saWN5ICovCisJCWlmIChtaXJyb3JlZF9zZWctPmFyZWFfY291bnQgPT0gMSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE1pcnJvciB2b2x1bWUsICVzLyVzIGNvbnZlcnRlZCB0byBsaW5lYXIgZHVlIHRvIGRldmljZSBmYWlsdXJlLiIsCisJCQkJICBtaXJyb3JlZF9zZWctPmx2LT52Zy0+bmFtZSwgbWlycm9yZWRfc2VnLT5sdi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoaGFkX2xvZyAmJiAhbWlycm9yZWRfc2VnLT5sb2dfbHYpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBNaXJyb3Igdm9sdW1lLCAlcy8lcyBkaXNrIGxvZyByZW1vdmVkIGR1ZSB0byBkZXZpY2UgZmFpbHVyZS4iLAorCQkJCSAgbWlycm9yZWRfc2VnLT5sdi0+dmctPm5hbWUsIG1pcnJvcmVkX3NlZy0+bHYtPm5hbWUpOworCQl9CisJLyoKKwkgKiBJZiB3ZSBtYWRlIGl0IGhlcmUsIHdlIGF0IGxlYXN0IHJlbW92ZWQgdGhlIGJhZCBkZXZpY2UuCisJICogQ29uc2lkZXIgdGhpcyBzdWNjZXNzLgorCSAqLworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9taW1hZ2VfbHZzKHN0cnVjdCBhbGxvY19oYW5kbGUgKmFoLAorCQkJICAgICAgdWludDMyX3QgbnVtX21pcnJvcnMsCisJCQkgICAgICB1aW50MzJfdCBzdHJpcGVzLAorCQkJICAgICAgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqaW1nX2x2cywKKwkJCSAgICAgIGludCBsb2cpCit7CisJdWludDMyX3QgbSwgZmlyc3RfYXJlYTsKKwljaGFyICppbWdfbmFtZTsKKwlzaXplX3QgbGVuOworCQorCWxlbiA9IHN0cmxlbihsdi0+bmFtZSkgKyAzMjsKKwlpbWdfbmFtZSA9IGFsbG9jYShsZW4pOworCisJaWYgKGRtX3NucHJpbnRmKGltZ19uYW1lLCBsZW4sICIlc19taW1hZ2VfJSVkIiwgbHYtPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoImltZ19uYW1lIGFsbG9jYXRpb24gZmFpbGVkLiAiCisJCQkgICJSZW1vdmUgbmV3IExWIGFuZCByZXRyeS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChtID0gMDsgbSA8IG51bV9taXJyb3JzOyBtKyspIHsKKwkJaWYgKCEoaW1nX2x2c1ttXSA9IGx2X2NyZWF0ZV9lbXB0eShpbWdfbmFtZSwKKwkJCQkJICAgICBOVUxMLCBMVk1fUkVBRCB8IExWTV9XUklURSwKKwkJCQkJICAgICBBTExPQ19JTkhFUklULCBsdi0+dmcpKSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGNyZWF0ZSBtaXJyb3IgaW1hZ2UgTFYuICIKKwkJCQkgICJSZW1vdmUgbmV3IExWIGFuZCByZXRyeS4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGxvZykgeworCQkJZmlyc3RfYXJlYSA9IG0gKiBzdHJpcGVzICsgKGxvZyAtIDEpOworCisJCQlpZiAoIWx2X2FkZF9sb2dfc2VnbWVudChhaCwgZmlyc3RfYXJlYSwgaW1nX2x2c1ttXSwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgbWlycm9yIGltYWdlIHNlZ21lbnQiCisJCQkJCSAgIiB0byAlcy4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIiwKKwkJCQkJICBpbWdfbHZzW21dLT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghbHZfYWRkX3NlZ21lbnQoYWgsIG0gKiBzdHJpcGVzLCBzdHJpcGVzLCBpbWdfbHZzW21dLAorCQkJCQkgICAgZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCksCisJCQkJCSAgICBzdHJpcGVfc2l6ZSwgMCwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gYWRkIG1pcnJvciBpbWFnZSBzZWdtZW50ICIKKwkJCQkJICAidG8gJXMuIFJlbW92ZSBuZXcgTFYgYW5kIHJldHJ5LiIsCisJCQkJCSAgaW1nX2x2c1ttXS0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlbW92ZSBtaXJyb3JzIGZyb20gZWFjaCBzZWdtZW50LgorICogJ25ld19taXJyb3JzJyBpcyB0aGUgbnVtYmVyIG9mIG1pcnJvcnMgYWZ0ZXIgdGhlIHJlbW92YWwuICcwJyBmb3IgbGluZWFyLgorICogSWYgJ3N0YXR1c19tYXNrJyBpcyBub24temVybywgdGhlIHJlbW92YWwgaGFwcGVucyBvbmx5IHdoZW4gYWxsIHNlZ21lbnRzCisgKiBoYXMgdGhlIHN0YXR1cyBiaXRzIG9uLgorICovCitpbnQgcmVtb3ZlX21pcnJvcnNfZnJvbV9zZWdtZW50cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSB1aW50MzJfdCBuZXdfbWlycm9ycywgdWludDY0X3Qgc3RhdHVzX21hc2spCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwl1aW50MzJfdCBzOworCisJLyogQ2hlY2sgdGhlIHNlZ21lbnQgcGFyYW1zIGFyZSBjb21wYXRpYmxlICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlpZiAoIXNlZ19pc19taXJyb3JlZChzZWcpKSB7CisJCQlsb2dfZXJyb3IoIlNlZ21lbnQgaXMgbm90IG1pcnJvcmVkOiAlczolIiBQUkl1MzIsCisJCQkJICBsdi0+bmFtZSwgc2VnLT5sZSk7CisJCQlyZXR1cm4gMDsKKwkJfSBpZiAoKHNlZy0+c3RhdHVzICYgc3RhdHVzX21hc2spICE9IHN0YXR1c19tYXNrKSB7CisJCQlsb2dfZXJyb3IoIlNlZ21lbnQgc3RhdHVzIGRvZXMgbm90IG1hdGNoOiAlczolIiBQUkl1MzIKKwkJCQkgICIgc3RhdHVzOjB4JSIgUFJJeDY0ICIvMHglIiBQUkl4NjQsIGx2LT5uYW1lLCBzZWctPmxlLAorCQkJCSAgc2VnLT5zdGF0dXMsIHN0YXR1c19tYXNrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogQ29udmVydCB0aGUgc2VnbWVudHMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCWlmICghbmV3X21pcnJvcnMgJiYgc2VnLT5leHRlbnRzX2NvcGllZCA9PSBzZWctPmFyZWFfbGVuKSB7CisJCQlpZiAoIW1vdmVfbHZfc2VnbWVudF9hcmVhKHNlZywgMCwgc2VnLCAxKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCWZvciAocyA9IG5ld19taXJyb3JzICsgMTsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQkJaWYgKCFyZWxlYXNlX2FuZF9kaXNjYXJkX2x2X3NlZ21lbnRfYXJlYShzZWcsIHMsIHNlZy0+YXJlYV9sZW4pKQorCQkJCXJldHVybl8wOworCisJCXNlZy0+YXJlYV9jb3VudCA9IG5ld19taXJyb3JzICsgMTsKKworCQlpZiAoIW5ld19taXJyb3JzKQorCQkJc2VnLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9wdm1vdmVfcHZuYW1lX2Zyb21fbHZfbWlycihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdl9taXJyLT5zZWdtZW50cykgeworCQlpZiAoIXNlZ19pc19taXJyb3JlZChzZWcpKQorCQkJY29udGludWU7CisJCWlmIChzZWdfdHlwZShzZWcsIDApID09IEFSRUFfUFYpCisJCQlyZXR1cm4gZGV2X25hbWUoc2VnX2RldihzZWcsIDApKTsKKwkJaWYgKHNlZ190eXBlKHNlZywgMCkgPT0gQVJFQV9MVikKKwkJCXJldHVybiBkZXZfbmFtZShzZWdfZGV2KGZpcnN0X3NlZyhzZWdfbHYoc2VnLCAwKSksIDApKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZpbmQgZmlyc3QgcHZtb3ZlIExWIHJlZmVyZW5jZWQgYnkgYSBzZWdtZW50IG9mIGFuIExWLgorICovCitjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpbmRfcHZtb3ZlX2x2X2luX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwl1aW50MzJfdCBzOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmIChzZWdfdHlwZShzZWcsIHMpICE9IEFSRUFfTFYpCisJCQkJY29udGludWU7CisJCQlpZiAobHZfaXNfcHZtb3ZlKHNlZ19sdihzZWcsIHMpKSkKKwkJCQlyZXR1cm4gc2VnX2x2KHNlZywgcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqZ2V0X3B2bW92ZV9wdm5hbWVfZnJvbV9sdihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcHZtb3ZlX2x2OworCisJcHZtb3ZlX2x2ID0gZmluZF9wdm1vdmVfbHZfaW5fbHYobHYpOworCisJaWYgKHB2bW92ZV9sdikKKwkJcmV0dXJuIGdldF9wdm1vdmVfcHZuYW1lX2Zyb21fbHZfbWlycihwdm1vdmVfbHYpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9wdm1vdmVfbHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHVpbnQ2NF90IGx2X3R5cGUpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwkvKiBMb29wIHRocm91Z2ggYWxsIExWcyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWx2ID0gbHZsLT5sdjsKKworCQlpZiAoIShsdi0+c3RhdHVzICYgbHZfdHlwZSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGFuIGF0b21pYyBwdm1vdmUsIHRoZSBmaXJzdAorCQkgKiBzZWdtZW50IHdpbGwgYmUgYSBtaXJyb3IgY29udGFpbmluZworCQkgKiBtaW1hZ2VzIChpLmUuIEFSRUFfTFZzKQorCQkgKi8KKwkJaWYgKHNlZ190eXBlKGZpcnN0X3NlZyhsdiksIDApID09IEFSRUFfTFYpIHsKKwkJCXNlZyA9IGZpcnN0X3NlZyhsdik7ICAgICAgICAgICAgLyogdGhlIG1pcnJvciBzZWdtZW50ICovCisJCQlzZWcgPSBmaXJzdF9zZWcoc2VnX2x2KHNlZywgMCkpOyAvKiBtaW1hZ2VfMCBzZWdtZW50MCAqLworCQkJaWYgKHNlZ19kZXYoc2VnLCAwKSAhPSBkZXYpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gbHY7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGEgbm9ybWFsIHB2bW92ZSwgY2hlY2sgYWxsIHRoZSBzZWdtZW50cycKKwkJICogZmlyc3QgYXJlYXMgZm9yIHRoZSByZXF1ZXN0ZWQgZGV2aWNlCisJCSAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCQlpZiAoc2VnX3R5cGUoc2VnLCAwKSAhPSBBUkVBX1BWKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNlZ19kZXYoc2VnLCAwKSAhPSBkZXYpCisJCQkJY29udGludWU7CisKKwkJCXJldHVybiBsdjsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZzX3VzaW5nX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZzOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYxOworCXN0cnVjdCBsdl9saXN0ICpsdmwsICpsdmwxOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJdWludDMyX3QgczsKKworCWlmICghKGx2cyA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHNpemVvZigqbHZzKSkpKSB7CisJCWxvZ19lcnJvcigibHZzIGxpc3QgYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdChsdnMpOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCBMVnMgZXhjZXB0IHRoZSBvbmUgc3VwcGxpZWQgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsMSwgJnZnLT5sdnMpIHsKKwkJbHYxID0gbHZsMS0+bHY7CisJCWlmIChsdjEgPT0gbHYpCisJCQljb250aW51ZTsKKworCQkvKiBGaW5kIHdoZXRoZXIgYW55IHNlZ21lbnQgcG9pbnRzIGF0IHRoZSBzdXBwbGllZCBMViAqLworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYxLT5zZWdtZW50cykgeworCQkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQkJaWYgKHNlZ190eXBlKHNlZywgcykgIT0gQVJFQV9MViB8fAorCQkJCSAgICBzZWdfbHYoc2VnLCBzKSAhPSBsdikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCEobHZsID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpsdmwpKSkpIHsKKwkJCQkJbG9nX2Vycm9yKCJsdl9saXN0IGFsbG9jIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQkJbHZsLT5sdiA9IGx2MTsKKwkJCQlkbV9saXN0X2FkZChsdnMsICZsdmwtPmxpc3QpOworCQkJCWdvdG8gbmV4dF9sdjsKKwkJCX0KKwkJfQorCSAgICAgIG5leHRfbHY6CisJCTsKKwl9CisKKwlyZXR1cm4gbHZzOworfQorCisvKgorICogRml4dXAgbWlycm9yIHBvaW50ZXJzIGFmdGVyIHNpbmdsZS1wYXNzIHNlZ21lbnQgaW1wb3J0CisgKi8KK2ludCBmaXh1cF9pbXBvcnRlZF9taXJyb3JzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdmwtPmx2LT5zZWdtZW50cykgeworCQkJaWYgKHNlZy0+c2VndHlwZSAhPQorCQkJICAgIGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKHZnLT5jbWQsIFNFR19UWVBFX05BTUVfTUlSUk9SKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNlZy0+bG9nX2x2ICYmICFhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihzZWctPmxvZ19sdiwgc2VnKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfbWlycm9yc190aGF0X3ByZXNlcnZlX3NlZ21lbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgICAgICB1aW50MzJfdCBmbGFncywKKwkJCQkJICAgICAgIHVpbnQzMl90IG1pcnJvcnMsCisJCQkJCSAgICAgICB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJCQkJICAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnMsCisJCQkJCSAgICAgICBhbGxvY19wb2xpY3lfdCBhbGxvYykKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IGx2LT52Zy0+Y21kOworCXN0cnVjdCBhbGxvY19oYW5kbGUgKmFoOworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IGRtX2xpc3QgKnBhcmFsbGVsX2FyZWFzOworCXVpbnQzMl90IGFkanVzdGVkX3JlZ2lvbl9zaXplOworCWludCByID0gMTsKKworCWlmICghKHBhcmFsbGVsX2FyZWFzID0gYnVpbGRfcGFyYWxsZWxfYXJlYXNfZnJvbV9sdihsdiwgMSwgMCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfTUlSUk9SKSkpCisJCXJldHVybl8wOworCisJYWRqdXN0ZWRfcmVnaW9uX3NpemUgPSBhZGp1c3RlZF9taXJyb3JfcmVnaW9uX3NpemUobHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkJCQkgICBsdi0+bGVfY291bnQsCisJCQkJCQkJICAgcmVnaW9uX3NpemUsIDEsCisJCQkJCQkJICAgdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpOworCisJaWYgKCEoYWggPSBhbGxvY2F0ZV9leHRlbnRzKGx2LT52ZywgTlVMTCwgc2VndHlwZSwgMSwgbWlycm9ycywgMCwgMCwKKwkJCQkgICAgbHYtPmxlX2NvdW50LCBhbGxvY2F0YWJsZV9wdnMsIGFsbG9jLCAwLAorCQkJCSAgICBwYXJhbGxlbF9hcmVhcykpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1pcnJvciBleHRlbnRzIGZvciAlcy4iLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmbGFncyAmIE1JUlJPUl9CWV9TRUcpIHsKKwkJaWYgKCFsdl9hZGRfbWlycm9yX2FyZWFzKGFoLCBsdiwgMCwgYWRqdXN0ZWRfcmVnaW9uX3NpemUpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgbWlycm9yIGFyZWFzIHRvICVzIiwgbHYtPm5hbWUpOworCQkJciA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGZsYWdzICYgTUlSUk9SX0JZX1NFR01FTlRFRF9MVikgeworCQlpZiAoIWx2X2FkZF9zZWdtZW50ZWRfbWlycm9yX2ltYWdlKGFoLCBsdiwgMCwKKwkJCQkJCSAgIGFkanVzdGVkX3JlZ2lvbl9zaXplKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIG1pcnJvciBhcmVhcyB0byAlcyIsIGx2LT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmtub3duIG1pcnJvciBmbGFnIik7CisJCXIgPSAwOworCX0KKwlhbGxvY19kZXN0cm95KGFoKTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEFkZCBtaXJyb3JzIHRvICJsaW5lYXIiIG9yICJtaXJyb3IiIHNlZ21lbnRzCisgKi8KK2ludCBhZGRfbWlycm9yc190b19zZWdtZW50cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICB1aW50MzJfdCBtaXJyb3JzLCB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzLCBhbGxvY19wb2xpY3lfdCBhbGxvYykKK3sKKwlyZXR1cm4gX2FkZF9taXJyb3JzX3RoYXRfcHJlc2VydmVfc2VnbWVudHMobHYsIE1JUlJPUl9CWV9TRUcsCisJCQkJCQkgICBtaXJyb3JzLCByZWdpb25fc2l6ZSwKKwkJCQkJCSAgIGFsbG9jYXRhYmxlX3B2cywgYWxsb2MpOworfQorCisvKgorICogQ29udmVydCBtaXJyb3IgbG9nCisgKgorICogRklYTUU6IENhbid0IGhhbmRsZSBzZWdtZW50LWJ5LXNlZ21lbnQgbWlycm9yIChsaWtlIHB2bW92ZSkKKyAqLworaW50IHJlbW92ZV9taXJyb3JfbG9nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhYmxlX3B2cywKKwkJICAgICAgaW50IGZvcmNlKQoreworCWRtX3BlcmNlbnRfdCBzeW5jX3BlcmNlbnQ7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBsdi0+dmc7CisKKwkvKiBVbmltcGxlbWVudGVkIGZlYXR1cmVzICovCisJaWYgKGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSAhPSAxKSB7CisJCWxvZ19lcnJvcigiTXVsdGlwbGUtc2VnbWVudCBtaXJyb3IgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBIYWQgZGlzayBsb2csIHN3aXRjaCB0byBjb3JlLiAqLworCWlmIChsdl9pc19hY3RpdmVfbG9jYWxseShsdikpIHsKKwkJaWYgKCFsdl9taXJyb3JfcGVyY2VudChjbWQsIGx2LCAwLCAmc3luY19wZXJjZW50LAorCQkJCSAgICAgICBOVUxMKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIG1pcnJvciBzeW5jIHN0YXR1cy4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChsdl9pc19hY3RpdmUobHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSBzeW5jIHN0YXR1cyBvZiIKKwkJCSAgIiByZW1vdGVseSBhY3RpdmUgbWlycm9yLCAlcyIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICh2Z19pc19jbHVzdGVyZWQodmcpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgdGhlIGxvZyBvZiBhbiBpbmFjdGl2ZSAiCisJCQkgICJjbHVzdGVyIG1pcnJvciwgJXMiLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoZm9yY2UgfHwgeWVzX25vX3Byb21wdCgiRnVsbCByZXN5bmMgcmVxdWlyZWQgdG8gY29udmVydCAiCisJCQkJICJpbmFjdGl2ZSBtaXJyb3IgJXMgdG8gY29yZSBsb2cuICIKKwkJCQkgIlByb2NlZWQ/IFt5L25dOiAiLCBsdi0+bmFtZSkgPT0gJ3knKQorCQlzeW5jX3BlcmNlbnQgPSAwOworCWVsc2UgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIE5PVCBjb252ZXJ0ZWQuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3luY19wZXJjZW50ID09IERNX1BFUkNFTlRfMTAwKQorCQlpbml0X21pcnJvcl9pbl9zeW5jKDEpOworCWVsc2UgeworCQkvKiBBIGZ1bGwgcmVzeW5jIHdpbGwgdGFrZSBwbGFjZSAqLworCQlsdi0+c3RhdHVzICY9IH5MVl9OT1RTWU5DRUQ7CisJCWluaXRfbWlycm9yX2luX3N5bmMoMCk7CisJfQorCisJaWYgKCFyZW1vdmVfbWlycm9yX2ltYWdlcyhsdiwgbHZfbWlycm9yX2NvdW50KGx2KSwKKwkJCQkgIGlzX21pcnJvcl9pbWFnZV9yZW1vdmFibGUsIHJlbW92YWJsZV9wdnMsIDFVKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqX2NyZWF0ZV9taXJyb3JfbG9nKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCQkgc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsCisJCQkJCQkgYWxsb2NfcG9saWN5X3QgYWxsb2MsCisJCQkJCQkgY29uc3QgY2hhciAqbHZfbmFtZSwKKwkJCQkJCSBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2dfbHY7CisJY2hhciAqbG9nX25hbWU7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHN0cmxlbihsdl9uYW1lKSArIDMyOworCWxvZ19uYW1lID0gYWxsb2NhKGxlbik7IC8qIGFsbG9jYSBuZXZlciBmYWlscyAqLworCisJaWYgKGRtX3NucHJpbnRmKGxvZ19uYW1lLCBsZW4sICIlcyVzIiwgbHZfbmFtZSwgc3VmZml4KSA8IDApIHsKKwkJbG9nX2Vycm9yKCJsb2dfbmFtZSBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobG9nX2x2ID0gbHZfY3JlYXRlX2VtcHR5KGxvZ19uYW1lLCBOVUxMLAorCQkJCSAgICAgICBWSVNJQkxFX0xWIHwgTFZNX1JFQUQgfCBMVk1fV1JJVEUsCisJCQkJICAgICAgIGFsbG9jLCBsdi0+dmcpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIWx2X2FkZF9sb2dfc2VnbWVudChhaCwgMCwgbG9nX2x2LCBNSVJST1JfTE9HKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gbG9nX2x2OworfQorCisvKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX2Zvcm1fbWlycm9yKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwKKwkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQl1aW50MzJfdCBtaXJyb3JzLCB1aW50MzJfdCBzdHJpcGVzLAorCQkJdWludDMyX3Qgc3RyaXBlX3NpemUsIHVpbnQzMl90IHJlZ2lvbl9zaXplLCBpbnQgbG9nKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKmltZ19sdnM7CisKKwkvKgorCSAqIGluc2VydCBhIG1pcnJvciBsYXllcgorCSAqLworCWlmIChkbV9saXN0X3NpemUoJmx2LT5zZWdtZW50cykgIT0gMSB8fAorCSAgICBzZWdfdHlwZShmaXJzdF9zZWcobHYpLCAwKSAhPSBBUkVBX0xWKQorCQlpZiAoIWluc2VydF9sYXllcl9mb3JfbHYoY21kLCBsdiwgMCwgIl9taW1hZ2VfJWQiKSkKKwkJCXJldHVybiAwOworCisJLyoKKwkgKiBjcmVhdGUgbWlycm9yIGltYWdlIExWcworCSAqLworCWltZ19sdnMgPSBhbGxvY2Eoc2l6ZW9mKCppbWdfbHZzKSAqIG1pcnJvcnMpOworCisJaWYgKCFfY3JlYXRlX21pbWFnZV9sdnMoYWgsIG1pcnJvcnMsIHN0cmlwZXMsIHN0cmlwZV9zaXplLCBsdiwgaW1nX2x2cywgbG9nKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWx2X2FkZF9taXJyb3JfbHZzKGx2LCBpbWdfbHZzLCBtaXJyb3JzLAorCQkJICAgICAgIE1JUlJPUl9JTUFHRSB8IChsdi0+c3RhdHVzICYgTE9DS0VEKSwKKwkJCSAgICAgICByZWdpb25fc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGFkZCBtaXJyb3Igc2VnbWVudC4gIgorCQkJICAiUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpfc2V0X3VwX21pcnJvcl9sb2coc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCQkgc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsCisJCQkJCQkgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJCSB1aW50MzJfdCBsb2dfY291bnQsCisJCQkJCQkgdWludDMyX3QgcmVnaW9uX3NpemUsCisJCQkJCQkgYWxsb2NfcG9saWN5X3QgYWxsb2MsCisJCQkJCQkgaW50IGluX3N5bmMpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2dfbHY7CisJY29uc3QgY2hhciAqc3VmZml4LCAqbHZfbmFtZTsKKwljaGFyICp0bXBfbmFtZTsKKwlzaXplX3QgbGVuOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlpbml0X21pcnJvcl9pbl9zeW5jKGluX3N5bmMpOworCisJLyogTWlycm9yIGxvZyBuYW1lIGlzIGx2X25hbWUgKyBzdWZmaXgsIGRldGVybWluZWQgYXMgdGhlIGZvbGxvd2luZzoKKwkgKiAgIDEuIHN1ZmZpeCBpczoKKwkgKiAgICAgICAgbyAiX21sb2ciIGZvciB0aGUgb3JpZ2luYWwgbWlycm9yIExWLgorCSAqICAgICAgICBvICJfbWxvZ3RtcF8lZCIgZm9yIHRlbXBvcmFyeSBtaXJyb3IgTFYsCisJICogICAyLiBsdl9uYW1lIGlzOgorCSAqICAgICAgICBvIGx2LT5uYW1lLCBpZiB0aGUgbG9nIGlzIHRlbXBvcmFyeQorCSAqICAgICAgICBvIG90aGVyd2lzZSwgdGhlIHRvcC1sZXZlbCBMViBuYW1lCisJICovCisJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwlpZiAoc2VnX3R5cGUoc2VnLCAwKSA9PSBBUkVBX0xWICYmCisJICAgIHN0cnN0cihzZWdfbHYoc2VnLCAwKS0+bmFtZSwgTUlSUk9SX1NZTkNfTEFZRVIpKSB7CisJCWx2X25hbWUgPSBsdi0+bmFtZTsKKwkJc3VmZml4ID0gIl9tbG9ndG1wXyVkIjsKKwl9IGVsc2UgaWYgKChsdl9uYW1lID0gc3Ryc3RyKGx2LT5uYW1lLCBNSVJST1JfU1lOQ19MQVlFUikpKSB7CisJCWxlbiA9IGx2X25hbWUgLSBsdi0+bmFtZTsKKwkJdG1wX25hbWUgPSBhbGxvY2EobGVuICsgMSk7CisJCXRtcF9uYW1lW2xlbl0gPSAnXDAnOworCQlsdl9uYW1lID0gc3RybmNweSh0bXBfbmFtZSwgbHYtPm5hbWUsIGxlbik7CisJCXN1ZmZpeCA9ICJfbWxvZyI7CisJfSBlbHNlIHsKKwkJbHZfbmFtZSA9IGx2LT5uYW1lOworCQlzdWZmaXggPSAiX21sb2ciOworCX0KKworCWlmICghKGxvZ19sdiA9IF9jcmVhdGVfbWlycm9yX2xvZyhsdiwgYWgsIGFsbG9jLCBsdl9uYW1lLCBzdWZmaXgpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgbWlycm9yIGxvZy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChsb2dfY291bnQgPiAxKSAmJgorCSAgICAhX2Zvcm1fbWlycm9yKGNtZCwgYWgsIGxvZ19sdiwgbG9nX2NvdW50LTEsIDEsIDAsIHJlZ2lvbl9zaXplLCAyKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmb3JtIG1pcnJvcmVkIGxvZy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFfaW5pdF9taXJyb3JfbG9nKGNtZCwgbG9nX2x2LCBpbl9zeW5jLCAmbHYtPnRhZ3MsIDEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpc2UgbWlycm9yIGxvZy4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxvZ19sdjsKK30KKworaW50IGF0dGFjaF9taXJyb3JfbG9nKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2KQoreworCXNlZy0+bG9nX2x2ID0gbG9nX2x2OworCWxvZ19sdi0+c3RhdHVzIHw9IE1JUlJPUl9MT0c7CisJbHZfc2V0X2hpZGRlbihsb2dfbHYpOworCXJldHVybiBhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihsb2dfbHYsIHNlZyk7Cit9CisKK2ludCBhZGRfbWlycm9yX2xvZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgdWludDMyX3QgbG9nX2NvdW50LCB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRhYmxlX3B2cywgYWxsb2NfcG9saWN5X3QgYWxsb2MpCit7CisJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWg7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwlzdHJ1Y3QgZG1fbGlzdCAqcGFyYWxsZWxfYXJlYXM7CisJZG1fcGVyY2VudF90IHN5bmNfcGVyY2VudDsKKwlpbnQgaW5fc3luYzsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdjsKKwl1bnNpZ25lZCBvbGRfbG9nX2NvdW50OworCWludCByID0gMDsKKworCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSAmJiAobG9nX2NvdW50ID4gMSkpIHsKKwkJbG9nX2Vycm9yKCJMb2cgdHlwZSwgXCJtaXJyb3JlZFwiLCBpcyB1bmF2YWlsYWJsZSB0byBjbHVzdGVyIG1pcnJvcnMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSAhPSAxKSB7CisJCWxvZ19lcnJvcigiTXVsdGlwbGUtc2VnbWVudCBtaXJyb3IgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfYWN0aXZlX2J1dF9ub3RfbG9jYWxseShsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY29udmVydCB0aGUgbG9nIG9mIGEgbWlycm9yLCAlcywgdGhhdCBpcyAiCisJCQkgICJhY3RpdmUgcmVtb3RlbHkgYnV0IG5vdCBsb2NhbGx5IiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfbHYgPSBmaXJzdF9zZWcobHYpLT5sb2dfbHY7CisJb2xkX2xvZ19jb3VudCA9IChsb2dfbHYpID8gbHZfbWlycm9yX2NvdW50KGxvZ19sdikgOiAwOworCWlmIChvbGRfbG9nX2NvdW50ID09IGxvZ19jb3VudCkgeworCQlsb2dfdmVyYm9zZSgiTWlycm9yIGFscmVhZHkgaGFzIGEgJXMgbG9nIiwKKwkJCSAgICAhbG9nX2NvdW50ID8gImNvcmUiIDoKKwkJCSAgICAobG9nX2NvdW50ID09IDEpID8gImRpc2siIDogIm1pcnJvcmVkIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghKHBhcmFsbGVsX2FyZWFzID0gYnVpbGRfcGFyYWxsZWxfYXJlYXNfZnJvbV9sdihsdiwgMCwgMCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfTUlSUk9SKSkpCisJCXJldHVybl8wOworCisJaWYgKGFjdGl2YXRpb24oKSAmJiBzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50ICYmCisJICAgICFzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KGNtZCwgTlVMTCwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCIlczogUmVxdWlyZWQgZGV2aWNlLW1hcHBlciB0YXJnZXQocykgbm90ICIKKwkJCSAgImRldGVjdGVkIGluIHlvdXIga2VybmVsIiwgc2VndHlwZS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGFsbG9jYXRlIGRlc3RpbmF0aW9uIGV4dGVudHMgKi8KKwlhaCA9IGFsbG9jYXRlX2V4dGVudHMobHYtPnZnLCBOVUxMLCBzZWd0eXBlLAorCQkJICAgICAgMCwgMCwgbG9nX2NvdW50IC0gb2xkX2xvZ19jb3VudCwgcmVnaW9uX3NpemUsCisJCQkgICAgICBsdi0+bGVfY291bnQsIGFsbG9jYXRhYmxlX3B2cywKKwkJCSAgICAgIGFsbG9jLCAwLCBwYXJhbGxlbF9hcmVhcyk7CisJaWYgKCFhaCkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBleHRlbnRzIGZvciBtaXJyb3IgbG9nLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob2xkX2xvZ19jb3VudCkgeworCQkvKiBDb252ZXJ0aW5nIGZyb20gZGlzayB0byBtaXJyb3JlZCBsb2cgKi8KKwkJaWYgKCFfZm9ybV9taXJyb3IoY21kLCBhaCwgbG9nX2x2LCBsb2dfY291bnQgLSAxLCAxLCAwLAorCQkJCSAgcmVnaW9uX3NpemUsIDEpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjb252ZXJ0IG1pcnJvciBsb2ciKTsKKwkJCXJldHVybiAwOworCQl9CisJCXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjaGVjayBzeW5jIHN0YXR1cyAqLworCWlmIChtaXJyb3JfaW5fc3luYygpIHx8CisJICAgIChsdl9taXJyb3JfcGVyY2VudChjbWQsIGx2LCAwLCAmc3luY19wZXJjZW50LCBOVUxMKSAmJgorCSAgICAgKHN5bmNfcGVyY2VudCA9PSBETV9QRVJDRU5UXzEwMCkpKQorCQlpbl9zeW5jID0gMTsKKwllbHNlCisJCWluX3N5bmMgPSAwOworCisJaWYgKCEobG9nX2x2ID0gX3NldF91cF9taXJyb3JfbG9nKGNtZCwgYWgsIGx2LCBsb2dfY291bnQsCisJCQkJCSAgcmVnaW9uX3NpemUsIGFsbG9jLCBpbl9zeW5jKSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFhdHRhY2hfbWlycm9yX2xvZyhmaXJzdF9zZWcobHYpLCBsb2dfbHYpKQorCQlnb3RvX291dDsKKworCXIgPSAxOworb3V0OgorCWFsbG9jX2Rlc3Ryb3koYWgpOworCXJldHVybiByOworfQorCisvKgorICogQ29udmVydCAibGluZWFyIiBMViB0byAibWlycm9yIi4KKyAqLworaW50IGFkZF9taXJyb3JfaW1hZ2VzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICB1aW50MzJfdCBtaXJyb3JzLCB1aW50MzJfdCBzdHJpcGVzLAorCQkgICAgICB1aW50MzJfdCBzdHJpcGVfc2l6ZSwgdWludDMyX3QgcmVnaW9uX3NpemUsCisJCSAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnMsIGFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkgICAgICB1aW50MzJfdCBsb2dfY291bnQpCit7CisJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWg7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwlzdHJ1Y3QgZG1fbGlzdCAqcGFyYWxsZWxfYXJlYXM7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2dfbHYgPSBOVUxMOworCisJLyoKKwkgKiBhbGxvY2F0ZSBkZXN0aW5hdGlvbiBleHRlbnRzCisJICovCisKKwlpZiAoIShwYXJhbGxlbF9hcmVhcyA9IGJ1aWxkX3BhcmFsbGVsX2FyZWFzX2Zyb21fbHYobHYsIDAsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX01JUlJPUikpKQorCQlyZXR1cm5fMDsKKworCWFoID0gYWxsb2NhdGVfZXh0ZW50cyhsdi0+dmcsIE5VTEwsIHNlZ3R5cGUsCisJCQkgICAgICBzdHJpcGVzLCBtaXJyb3JzLCBsb2dfY291bnQsIHJlZ2lvbl9zaXplLCBsdi0+bGVfY291bnQsCisJCQkgICAgICBhbGxvY2F0YWJsZV9wdnMsIGFsbG9jLCAwLCBwYXJhbGxlbF9hcmVhcyk7CisJaWYgKCFhaCkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBleHRlbnRzIGZvciBtaXJyb3IocykuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogY3JlYXRlIGFuZCBpbml0aWFsaXplIG1pcnJvciBsb2cKKwkgKi8KKwlpZiAobG9nX2NvdW50ICYmCisJICAgICEobG9nX2x2ID0gX3NldF91cF9taXJyb3JfbG9nKGNtZCwgYWgsIGx2LCBsb2dfY291bnQsCisJCQkJCSAgKHJlZ2lvbl9zaXplID4gbHYtPnZnLT5leHRlbnRfc2l6ZSkgPworCQkJCQkgIGx2LT52Zy0+ZXh0ZW50X3NpemUgOiByZWdpb25fc2l6ZSwKKwkJCQkJICBhbGxvYywgbWlycm9yX2luX3N5bmMoKSkpKSB7CisJCXN0YWNrOworCQlnb3RvIG91dF9yZW1vdmVfaW1hZ2VzOworCX0KKworCS8qIFRoZSBsb2cgaW5pdGlhbGl6YXRpb24gaW52b2x2ZXMgdmcgbWV0YWRhdGEgY29tbWl0LgorCSAgIFNvIGZyb20gaGVyZSBvbiwgaWYgZmFpbHVyZSBvY2N1cnMsIHRoZSBsb2cgbXVzdCBiZSBleHBsaWNpdGx5CisJICAgcmVtb3ZlZCBhbmQgdGhlIHVwZGF0ZWQgdmcgbWV0YWRhdGEgc2hvdWxkIGJlIGNvbW1pdHRlZC4gKi8KKworCWlmICghX2Zvcm1fbWlycm9yKGNtZCwgYWgsIGx2LCBtaXJyb3JzLCBzdHJpcGVzLCBzdHJpcGVfc2l6ZSwgcmVnaW9uX3NpemUsIDApKQorCQlnb3RvIG91dF9yZW1vdmVfbG9nOworCisJaWYgKGxvZ19jb3VudCAmJiAhYXR0YWNoX21pcnJvcl9sb2coZmlyc3Rfc2VnKGx2KSwgbG9nX2x2KSkKKwkJc3RhY2s7CisKKwlhbGxvY19kZXN0cm95KGFoKTsKKwlyZXR1cm4gMTsKKworICBvdXRfcmVtb3ZlX2xvZzoKKwlpZiAobG9nX2x2KSB7CisJCWlmICghbHZfcmVtb3ZlKGxvZ19sdikgfHwKKwkJICAgICF2Z193cml0ZShsb2dfbHYtPnZnKSB8fAorCQkgICAgIXZnX2NvbW1pdChsb2dfbHYtPnZnKSkKKwkJCWxvZ19lcnJvcigiTWFudWFsIGludGVydmVudGlvbiBtYXkgYmUgcmVxdWlyZWQgdG8gcmVtb3ZlICIKKwkJCQkgICJhYmFuZG9uZWQgbG9nIExWIGJlZm9yZSByZXRyeWluZy4iKTsKKwkJZWxzZQorCQkJYmFja3VwKGxvZ19sdi0+dmcpOworCX0KKyAgb3V0X3JlbW92ZV9pbWFnZXM6CisJYWxsb2NfZGVzdHJveShhaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZW5lcmljIGludGVyZmFjZSBmb3IgYWRkaW5nIG1pcnJvciBhbmQvb3IgbWlycm9yIGxvZy4KKyAqICdtaXJyb3InIGlzIHRoZSBudW1iZXIgb2YgbWlycm9ycyB0byBiZSBhZGRlZC4KKyAqICdwdnMnIGlzIGVpdGhlciBhbGxvY2F0YWJsZSBwdnMuCisgKi8KK2ludCBsdl9hZGRfbWlycm9ycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgdWludDMyX3QgbWlycm9ycywgdWludDMyX3Qgc3RyaXBlcywgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCSAgIHVpbnQzMl90IHJlZ2lvbl9zaXplLCB1aW50MzJfdCBsb2dfY291bnQsCisJCSAgIHN0cnVjdCBkbV9saXN0ICpwdnMsIGFsbG9jX3BvbGljeV90IGFsbG9jLCB1aW50MzJfdCBmbGFncykKK3sKKwlpZiAoIW1pcnJvcnMgJiYgIWxvZ19jb3VudCkgeworCQlsb2dfZXJyb3IoIk5vIGNvbnZlcnNpb24gaXMgcmVxdWVzdGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSkgeworCQkvKiBGSVhNRTogbW92ZSB0aGlzIHRlc3Qgb3V0IG9mIHRoaXMgZnVuY3Rpb24gKi8KKwkJLyogU2tpcCB0ZXN0IGZvciBwdm1vdmUgbWlycm9ycywgaXQgY2FuIHVzZSBsb2NhbCBtaXJyb3IgKi8KKwkJaWYgKCFsdl9pc19wdm1vdmUobHYpICYmICFsdl9pc19sb2NrZWQobHYpICYmCisJCSAgICBsdl9pc19hY3RpdmUobHYpICYmCisJCSAgICAhbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9sb2NhbGx5KGx2KSAmJiAvKiBsdl9pc19hY3RpdmVfcmVtb3RlbHkgKi8KKwkJICAgICFjbHVzdGVyX21pcnJvcl9pc19hdmFpbGFibGUobHYtPnZnLT5jbWQpKSB7CisJCQlsb2dfZXJyb3IoIlNoYXJlZCBjbHVzdGVyIG1pcnJvcnMgYXJlIG5vdCBhdmFpbGFibGUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIE5vIG1pcnJvcmVkIGxvZ3MgZm9yIGNsdXN0ZXIgbWlycm9ycyB1bnRpbAorCQkgKiBsb2cgZGFlbW9uIGlzIG11bHRpLXRocmVhZGVkLgorCQkgKi8KKwkJaWYgKGxvZ19jb3VudCA+IDEpIHsKKwkJCWxvZ19lcnJvcigiTG9nIHR5cGUsIFwibWlycm9yZWRcIiwgaXMgdW5hdmFpbGFibGUgdG8gY2x1c3RlciBtaXJyb3JzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEZvciBjb3JlbG9nIG1pcnJvciwgYWN0aXZhdGlvbiBjb2RlIGRlcGVuZHMgb24KKwkgKiB0aGUgZ2xvYmFsIG1pcnJvcl9pbl9zeW5jIHN0YXR1cy4gQXMgd2UgYXJlIGFkZGluZworCSAqIGEgbmV3IG1pcnJvciwgaXQgc2hvdWxkIGJlIHNldCBhcyAnb3V0LW9mLXN5bmMnCisJICogc28gdGhhdCB0aGUgc3luYyBzdGFydHMuICovCisJLyogSG93ZXZlciwgTUlSUk9SX1NLSVBfSU5JVF9TWU5DIGV2ZW4gb3ZlcnJpZGVzIGl0LiAqLworCWlmIChmbGFncyAmIE1JUlJPUl9TS0lQX0lOSVRfU1lOQykKKwkJaW5pdF9taXJyb3JfaW5fc3luYygxKTsKKwllbHNlIGlmICghbG9nX2NvdW50KQorCQlpbml0X21pcnJvcl9pbl9zeW5jKDApOworCisJaWYgKGZsYWdzICYgTUlSUk9SX0JZX1NFRykgeworCQlpZiAobG9nX2NvdW50KSB7CisJCQlsb2dfZXJyb3IoIlBlcnNpc3RlbnQgbG9nIGlzIG5vdCBzdXBwb3J0ZWQgb24gIgorCQkJCSAgInNlZ21lbnQtYnktc2VnbWVudCBtaXJyb3JpbmciKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzdHJpcGVzID4gMSkgeworCQkJbG9nX2Vycm9yKCJTdHJpcGVkLW1pcnJvcmluZyBpcyBub3Qgc3VwcG9ydGVkIG9uICIKKwkJCQkgICJzZWdtZW50LWJ5LXNlZ21lbnQgbWlycm9yaW5nIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiBfYWRkX21pcnJvcnNfdGhhdF9wcmVzZXJ2ZV9zZWdtZW50cyhsdiwgTUlSUk9SX0JZX1NFRywKKwkJCQkJCQkgICBtaXJyb3JzLCByZWdpb25fc2l6ZSwKKwkJCQkJCQkgICBwdnMsIGFsbG9jKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgTUlSUk9SX0JZX1NFR01FTlRFRF9MVikgeworCQlpZiAoc3RyaXBlcyA+IDEpIHsKKwkJCWxvZ19lcnJvcigiU3RyaXBlZC1taXJyb3JpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiAiCisJCQkJICAic2VnbWVudC1ieS1zZWdtZW50IG1pcnJvcmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXR1cm4gX2FkZF9taXJyb3JzX3RoYXRfcHJlc2VydmVfc2VnbWVudHMobHYsIE1JUlJPUl9CWV9TRUdNRU5URURfTFYsCisJCQkJCQkJICAgbWlycm9ycywgcmVnaW9uX3NpemUsCisJCQkJCQkJICAgcHZzLCBhbGxvYyk7CisJfSBlbHNlIGlmIChmbGFncyAmIE1JUlJPUl9CWV9MVikgeworCQlpZiAoIW1pcnJvcnMpCisJCQlyZXR1cm4gYWRkX21pcnJvcl9sb2coY21kLCBsdiwgbG9nX2NvdW50LAorCQkJCQkgICAgICByZWdpb25fc2l6ZSwgcHZzLCBhbGxvYyk7CisJCXJldHVybiBhZGRfbWlycm9yX2ltYWdlcyhjbWQsIGx2LCBtaXJyb3JzLAorCQkJCQkgc3RyaXBlcywgc3RyaXBlX3NpemUsIHJlZ2lvbl9zaXplLAorCQkJCQkgcHZzLCBhbGxvYywgbG9nX2NvdW50KTsKKwl9CisKKwlsb2dfZXJyb3IoIlVuc3VwcG9ydGVkIG1pcnJvciBjb252ZXJzaW9uIHR5cGUiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGx2X3NwbGl0X21pcnJvcl9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3QgY2hhciAqc3BsaXRfbmFtZSwKKwkJCSAgIHVpbnQzMl90IHNwbGl0X2NvdW50LCBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhYmxlX3B2cykKK3sKKwlpbnQgcjsKKwlpbnQgaGlzdG9yaWNhbDsKKworCWlmIChsdl9uYW1lX2lzX3VzZWRfaW5fdmcobHYtPnZnLCBzcGxpdF9uYW1lLCAmaGlzdG9yaWNhbCkpIHsKKwkJbG9nX2Vycm9yKCIlc0xvZ2ljYWwgVm9sdW1lIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyBpbiAiCisJCQkgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgaGlzdG9yaWNhbCA/ICJoaXN0b3JpY2FsICIgOiAiIiwKKwkJCSAgc3BsaXRfbmFtZSwgbHYtPnZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2FuJ3Qgc3BsaXQgYSBtaXJyb3IgdGhhdCBpcyBub3QgaW4tc3luYy4uLiB1bmxlc3MgZm9yY2U/ICovCisJaWYgKCFfbWlycm9yZWRfbHZfaW5fc3luYyhsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgbWlycm9yIHRoYXQgaXMgbm90IGluLXN5bmMuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogRklYTUU6IEdlbmVyYXRlIGRlZmF1bHQgbmFtZSB3aGVuIG5vdCBzdXBwbGllZC4KKwkgKgorCSAqIElmIHdlIHdlcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IG5hbWUsIHdlIHdvdWxkCisJICogZG8gaXQgaGVyZS4gIEJldHRlciB0byB3YWl0IGZvciBhIGRlY2lzaW9uIG9uIHRoZSBmb3JtCisJICogb2YgdGhlIGRlZmF1bHQgbmFtZSB3aGVuICctLXRyYWNrX2RlbHRhcycgKHRoZSBhYmlsaXR5CisJICogdG8gbWVyZ2UgYSBzcGxpdCBsZWcgYmFjayBpbiBhbmQgb25seSBjb3B5IHRoZSBjaGFuZ2VzKQorCSAqIGlzIGJlaW5nIGltcGxlbWVudGVkLiAgRm9yIG5vdywgd2UgZm9yY2UgdGhlIHVzZXIgdG8KKwkgKiBjb21lIHVwIHdpdGggYSBuYW1lIGZvciB0aGVpciBMVi4KKwkgKi8KKwlyID0gX3NwbGl0X21pcnJvcl9pbWFnZXMobHYsIHNwbGl0X25hbWUsIHNwbGl0X2NvdW50LCByZW1vdmFibGVfcHZzKTsKKwlpZiAoIXIpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZW5lcmljIGludGVyZmFjZSBmb3IgcmVtb3ZpbmcgbWlycm9yIGFuZC9vciBtaXJyb3IgbG9nLgorICogJ21pcnJvcicgaXMgdGhlIG51bWJlciBvZiBtaXJyb3JzIHRvIGJlIHJlbW92ZWQuCisgKiAncHZzJyBpcyByZW1vdmFibGUgcHZzLgorICovCitpbnQgbHZfcmVtb3ZlX21pcnJvcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgIHVpbnQzMl90IG1pcnJvcnMsIHVpbnQzMl90IGxvZ19jb3VudCwKKwkJICAgICAgaW50ICgqaXNfcmVtb3ZhYmxlKShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKiwgdm9pZCAqKSwKKwkJICAgICAgdm9pZCAqcmVtb3ZhYmxlX2JhdG9uLAorCQkgICAgICB1aW50NjRfdCBzdGF0dXNfbWFzaykKK3sKKwl1aW50MzJfdCBuZXdfbWlycm9yczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJaWYgKCFtaXJyb3JzICYmICFsb2dfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJObyBjb252ZXJzaW9uIGlzIHJlcXVlc3RlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCWlmICghc2VnX2lzX21pcnJvcmVkKHNlZykpIHsKKwkJbG9nX2Vycm9yKCJOb3QgYSBtaXJyb3Igc2VnbWVudCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfbWlycm9yX2NvdW50KGx2KSA8PSBtaXJyb3JzKSB7CisJCWxvZ19lcnJvcigiUmVtb3ZpbmcgbW9yZSB0aGFuIGV4aXN0aW5nOiAlZCA8PSAlZCIsCisJCQkgIHNlZy0+YXJlYV9jb3VudCwgbWlycm9ycyk7CisJCXJldHVybiAwOworCX0KKwluZXdfbWlycm9ycyA9IGx2X21pcnJvcl9jb3VudChsdikgLSBtaXJyb3JzIC0gMTsKKworCS8qIE1JUlJPUl9CWV9MViAqLworCWlmIChzZWdfdHlwZShzZWcsIDApID09IEFSRUFfTFYgJiYKKwkgICAgbHZfaXNfbWlycm9yX2ltYWdlKHNlZ19sdihzZWcsIDApKSkKKwkJcmV0dXJuIHJlbW92ZV9taXJyb3JfaW1hZ2VzKGx2LCBuZXdfbWlycm9ycyArIDEsCisJCQkJCSAgICBpc19yZW1vdmFibGUsIHJlbW92YWJsZV9iYXRvbiwKKwkJCQkJICAgIGxvZ19jb3VudCA/IDFVIDogMCk7CisKKwkvKiBNSVJST1JfQllfU0VHICovCisJaWYgKGxvZ19jb3VudCkgeworCQlsb2dfZXJyb3IoIlBlcnNpc3RlbnQgbG9nIGlzIG5vdCBzdXBwb3J0ZWQgb24gIgorCQkJICAic2VnbWVudC1ieS1zZWdtZW50IG1pcnJvcmluZyIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHJlbW92ZV9taXJyb3JzX2Zyb21fc2VnbWVudHMobHYsIG5ld19taXJyb3JzLCBzdGF0dXNfbWFzayk7Cit9CisKK2ludCBzZXRfbWlycm9yX2xvZ19jb3VudChpbnQgKmxvZ19jb3VudCwgY29uc3QgY2hhciAqbWlycm9ybG9nKQoreworCWlmICghc3RyY21wKCJjb3JlIiwgbWlycm9ybG9nKSkKKwkJKmxvZ19jb3VudCA9IE1JUlJPUl9MT0dfQ09SRTsKKwllbHNlIGlmICghc3RyY21wKCJkaXNrIiwgbWlycm9ybG9nKSkKKwkJKmxvZ19jb3VudCA9IE1JUlJPUl9MT0dfRElTSzsKKwllbHNlIGlmICghc3RyY21wKCJtaXJyb3JlZCIsIG1pcnJvcmxvZykpCisJCSpsb2dfY291bnQgPSBNSVJST1JfTE9HX01JUlJPUkVEOworCWVsc2UgeworCQlsb2dfZXJyb3IoIk1pcnJvciBsb2cgdHlwZSBcIiVzXCIgaXMgdW5rbm93bi4iLCBtaXJyb3Jsb2cpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworY29uc3QgY2hhciAqZ2V0X21pcnJvcl9sb2dfbmFtZShpbnQgbG9nX2NvdW50KQoreworCXN3aXRjaCAobG9nX2NvdW50KSB7CisJY2FzZSBNSVJST1JfTE9HX0NPUkU6IHJldHVybiAiY29yZSI7CisJY2FzZSBNSVJST1JfTE9HX0RJU0s6IHJldHVybiAiZGlzayI7CisJY2FzZSBNSVJST1JfTE9HX01JUlJPUkVEOiByZXR1cm4gIm1pcnJvcmVkIjsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVua25vd24gbWlycm9yIGxvZyBjb3VudCAlZC4iLCBsb2dfY291bnQpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvcG9vbF9tYW5pcC5jIGIvbGliL21ldGFkYXRhL3Bvb2xfbWFuaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NhOTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL3Bvb2xfbWFuaXAuYwpAQCAtMCwwICsxLDg4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaG9sZHMgY29tbW9uIHBvb2wgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJsdl9hbGxvYy5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAiZGV2LXR5cGUuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworaW50IGF0dGFjaF9wb29sX21ldGFkYXRhX2x2KHN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZywKKwkJCSAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1ldGFkYXRhX2x2KQoreworCWlmICghc2VnX2lzX3Bvb2wocG9vbF9zZWcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiVW5hYmxlIHRvIGF0dGFjaCBwb29sIG1ldGFkYXRhIExWIHRvICVzIHNlZ3R5cGUuIiwKKwkJCSAgbHZzZWdfbmFtZShwb29sX3NlZykpOworCQlyZXR1cm4gMDsKKwl9CisJcG9vbF9zZWctPm1ldGFkYXRhX2x2ID0gbWV0YWRhdGFfbHY7CisJbWV0YWRhdGFfbHYtPnN0YXR1cyB8PSBzZWdfaXNfdGhpbl9wb29sKHBvb2xfc2VnKSA/CisJCVRISU5fUE9PTF9NRVRBREFUQSA6IENBQ0hFX1BPT0xfTUVUQURBVEE7CisJbHZfc2V0X2hpZGRlbihtZXRhZGF0YV9sdik7CisKKwlyZXR1cm4gYWRkX3NlZ190b19zZWdzX3VzaW5nX3RoaXNfbHYobWV0YWRhdGFfbHYsIHBvb2xfc2VnKTsKK30KKworaW50IGRldGFjaF9wb29sX21ldGFkYXRhX2x2KHN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqbWV0YWRhdGFfbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IHBvb2xfc2VnLT5tZXRhZGF0YV9sdjsKKworCWlmICghbHYgfHwKKwkgICAgIWx2X2lzX3Bvb2xfbWV0YWRhdGEobHYpIHx8CisJICAgICFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGx2LCBwb29sX3NlZykpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMb2dpY2FsIHZvbHVtZSAlcyBpcyBub3QgdmFsaWQgcG9vbC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX3NlZy0+bHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHZfc2V0X3Zpc2libGUobHYpOworCWx2LT5zdGF0dXMgJj0gfihUSElOX1BPT0xfTUVUQURBVEEgfCBDQUNIRV9QT09MX01FVEFEQVRBKTsKKwkqbWV0YWRhdGFfbHYgPSBsdjsKKwlwb29sX3NlZy0+bWV0YWRhdGFfbHYgPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBhdHRhY2hfcG9vbF9kYXRhX2x2KHN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZywKKwkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9kYXRhX2x2KQoreworCWlmICghc2VnX2lzX3Bvb2wocG9vbF9zZWcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiVW5hYmxlIHRvIGF0dGFjaCBwb29sIGRhdGEgTFYgdG8gJXMgc2VndHlwZS4iLAorCQkJICBsdnNlZ19uYW1lKHBvb2xfc2VnKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihwb29sX3NlZywgMCwgcG9vbF9kYXRhX2x2LAorCQkJCSAgICAwLCBzZWdfaXNfdGhpbl9wb29sKHBvb2xfc2VnKSA/CisJCQkJICAgIFRISU5fUE9PTF9EQVRBIDogQ0FDSEVfUE9PTF9EQVRBKSkKKwkJcmV0dXJuXzA7CisKKwlwb29sX3NlZy0+bHYtPnN0YXR1cyB8PSBzZWdfaXNfdGhpbl9wb29sKHBvb2xfc2VnKSA/CisJCVRISU5fUE9PTCA6IENBQ0hFX1BPT0w7CisJbHZfc2V0X2hpZGRlbihwb29sX2RhdGFfbHYpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBhdHRhY2hfcG9vbF9sdihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYsCisJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luLAorCQkgICBzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqaW5kaXJlY3Rfb3JpZ2luLAorCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1lcmdlX2x2KQoreworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKworCWlmICghc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykgJiYgIXNlZ19pc19jYWNoZShzZWcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5hYmxlIHRvIGF0dGFjaCBwb29sIHRvICVzLyVzIgorCQkJICAiIHRoYXQgaXMgbm90IGNhY2hlIG9yIHRoaW4gdm9sdW1lLiIsCisJCQkgIHBvb2xfbHYtPnZnLT5uYW1lLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VnLT5wb29sX2x2ID0gcG9vbF9sdjsKKwlzZWctPm9yaWdpbiA9IG9yaWdpbjsKKwlzZWctPmx2LT5zdGF0dXMgfD0gc2VnX2lzX2NhY2hlKHNlZykgPyBDQUNIRSA6IFRISU5fVk9MVU1FOworCisJaWYgKHNlZ19pc19jYWNoZShzZWcpKQorCQlsdl9zZXRfaGlkZGVuKHBvb2xfbHYpOyAvKiBVc2VkIGNhY2hlLXBvb2wgaXMgaGlkZGVuICovCisKKwlpZiAob3JpZ2luICYmICFhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihvcmlnaW4sIHNlZykpCisJCXJldHVybl8wOworCisJaWYgKGluZGlyZWN0X29yaWdpbikgeworCQlpZiAoIShnbHZsID0gZ2V0X29yX2NyZWF0ZV9nbHZsKHNlZy0+bHYtPnZnLT52Z21lbSwgc2VnLT5sdiwgTlVMTCkpKQorCQkJcmV0dXJuXzA7CisKKwkJc2VnLT5pbmRpcmVjdF9vcmlnaW4gPSBpbmRpcmVjdF9vcmlnaW47CisJCWlmIChpbmRpcmVjdF9vcmlnaW4tPmlzX2hpc3RvcmljYWwpCisJCQlkbV9saXN0X2FkZCgmaW5kaXJlY3Rfb3JpZ2luLT5oaXN0b3JpY2FsLT5pbmRpcmVjdF9nbHZzLCAmZ2x2bC0+bGlzdCk7CisJCWVsc2UKKwkJCWRtX2xpc3RfYWRkKCZpbmRpcmVjdF9vcmlnaW4tPmxpdmUtPmluZGlyZWN0X2dsdnMsICZnbHZsLT5saXN0KTsKKworCX0KKworCWlmICghYWRkX3NlZ190b19zZWdzX3VzaW5nX3RoaXNfbHYocG9vbF9sdiwgc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobWVyZ2VfbHYpIHsKKwkJaWYgKG9yaWdpbiAhPSBtZXJnZV9sdikgeworCQkJaWYgKCFhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihtZXJnZV9sdiwgc2VnKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCWluaXRfc25hcHNob3RfbWVyZ2Uoc2VnLCBtZXJnZV9sdik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2x2X2xpc3QgKl9pbml0X2hpc3RvcmljYWxfZ2x2bChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKwlzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSAqaGx2OworCisJaWYgKCEoZ2x2bCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCBnbHZfbGlzdCkpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShnbHZsLT5nbHYgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSkpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShobHYgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgaGlzdG9yaWNhbF9sb2dpY2FsX3ZvbHVtZSkpKSkKKwkJZ290b19iYWQ7CisKKwlobHYtPmx2aWQgPSBzZWctPmx2LT5sdmlkOworCWhsdi0+bmFtZSA9IHNlZy0+bHYtPm5hbWU7CisJaGx2LT52ZyA9IHNlZy0+bHYtPnZnOworCWhsdi0+dGltZXN0YW1wID0gc2VnLT5sdi0+dGltZXN0YW1wOworCWRtX2xpc3RfaW5pdCgmaGx2LT5pbmRpcmVjdF9nbHZzKTsKKworCWdsdmwtPmdsdi0+aXNfaGlzdG9yaWNhbCA9IDE7CisJZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsID0gaGx2OworCisJcmV0dXJuIGdsdmw7CitiYWQ6CisJbG9nX2Vycm9yKCJJbml0aWFsaXphdGlvbiBvZiBoaXN0b3JpY2FsIExWIHJlcHJlc2VudGF0aW9uIGZvciByZW1vdmVkIGxvZ2ljYWwgIgorCQkgICJ2b2x1bWUgJXMvJXMgZmFpbGVkLiIsIHNlZy0+bHYtPnZnLT5uYW1lLCBzZWctPmx2LT5uYW1lKTsKKwlpZiAoZ2x2bCkKKwkJZG1fcG9vbF9mcmVlKG1lbSwgZ2x2bCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqX2NyZWF0ZV9oaXN0b3JpY2FsX2dsdihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX3RvX3JlbW92ZSkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gc2VnX3RvX3JlbW92ZS0+bHYtPnZnLT52Z21lbTsKKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqaGlzdG9yaWNhbF9nbHYsICpvcmlnaW5fZ2x2ID0gTlVMTDsKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmhpc3RvcmljYWxfZ2x2bDsKKwlpbnQgb3JpZ2luX2dsdl9jcmVhdGVkID0gMDsKKworCWlmICghKGhpc3RvcmljYWxfZ2x2bCA9IF9pbml0X2hpc3RvcmljYWxfZ2x2bChtZW0sIHNlZ190b19yZW1vdmUpKSkKKwkJZ290b19iYWQ7CisJaGlzdG9yaWNhbF9nbHYgPSBoaXN0b3JpY2FsX2dsdmwtPmdsdjsKKworCWlmIChzZWdfdG9fcmVtb3ZlLT5vcmlnaW4pIHsKKwkJaWYgKCEob3JpZ2luX2dsdiA9IGdldF9vcl9jcmVhdGVfZ2x2KG1lbSwgc2VnX3RvX3JlbW92ZS0+b3JpZ2luLCAmb3JpZ2luX2dsdl9jcmVhdGVkKSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoIWFkZF9nbHZfdG9faW5kaXJlY3RfZ2x2cyhtZW0sIG9yaWdpbl9nbHYsIGhpc3RvcmljYWxfZ2x2KSkKKwkJCWdvdG9fYmFkOworCX0gZWxzZSBpZiAoc2VnX3RvX3JlbW92ZS0+aW5kaXJlY3Rfb3JpZ2luKSB7CisJCW9yaWdpbl9nbHYgPSBzZWdfdG9fcmVtb3ZlLT5pbmRpcmVjdF9vcmlnaW47CisKKwkJaWYgKCFyZW1vdmVfZ2x2X2Zyb21faW5kaXJlY3RfZ2x2cyhvcmlnaW5fZ2x2LCBzZWdfdG9fcmVtb3ZlLT5sdi0+dGhpc19nbHYpKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKCFhZGRfZ2x2X3RvX2luZGlyZWN0X2dsdnMobWVtLCBvcmlnaW5fZ2x2LCBoaXN0b3JpY2FsX2dsdikpCisJCQlnb3RvX2JhZDsKKwl9CisKKwlkbV9saXN0X2FkZCgmc2VnX3RvX3JlbW92ZS0+bHYtPnZnLT5oaXN0b3JpY2FsX2x2cywgJmhpc3RvcmljYWxfZ2x2bC0+bGlzdCk7CisJcmV0dXJuIGhpc3RvcmljYWxfZ2x2bC0+Z2x2OworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBoaXN0b3JpY2FsIExWIHJlcHJlc2VudGF0aW9uIGZvciByZW1vdmVkIGxvZ2ljYWwgIgorCQkgICJ2b2x1bWUgJXMvJXMuIiwgc2VnX3RvX3JlbW92ZS0+bHYtPnZnLT5uYW1lLCBzZWdfdG9fcmVtb3ZlLT5sdi0+bmFtZSk7CisJaWYgKG9yaWdpbl9nbHZfY3JlYXRlZCkKKwkJc2VnX3RvX3JlbW92ZS0+b3JpZ2luLT50aGlzX2dsdiA9IE5VTEw7CisJaWYgKGhpc3RvcmljYWxfZ2x2bCkKKwkJZG1fcG9vbF9mcmVlKG1lbSwgaGlzdG9yaWNhbF9nbHZsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfc2V0X3VwX2hpc3RvcmljYWxfbHYoc3RydWN0IGx2X3NlZ21lbnQgKnNlZ190b19yZW1vdmUsCisJCQkJIHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICoqcHJldmlvdXNfZ2x2KQoreworCXN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lICpnbHYgPSBOVUxMOworCisJaWYgKHNlZ190b19yZW1vdmUtPmx2LT52Zy0+Y21kLT5yZWNvcmRfaGlzdG9yaWNhbF9sdnMpIHsKKwkJaWYgKHNlZ190b19yZW1vdmUtPm9yaWdpbiB8fCBzZWdfdG9fcmVtb3ZlLT5pbmRpcmVjdF9vcmlnaW4gfHwKKwkJICAgIGRtX2xpc3Rfc2l6ZSgmc2VnX3RvX3JlbW92ZS0+bHYtPnNlZ3NfdXNpbmdfdGhpc19sdikgfHwKKwkJICAgIGRtX2xpc3Rfc2l6ZSgmc2VnX3RvX3JlbW92ZS0+bHYtPmluZGlyZWN0X2dsdnMpKSB7CisJCQlpZiAoIShnbHYgPSBfY3JlYXRlX2hpc3RvcmljYWxfZ2x2KHNlZ190b19yZW1vdmUpKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzZWdfdG9fcmVtb3ZlLT5pbmRpcmVjdF9vcmlnaW4gJiYKKwkJICAgICFyZW1vdmVfZ2x2X2Zyb21faW5kaXJlY3RfZ2x2cyhzZWdfdG9fcmVtb3ZlLT5pbmRpcmVjdF9vcmlnaW4sCisJCQkJCQkgICBzZWdfdG9fcmVtb3ZlLT5sdi0+dGhpc19nbHYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJKnByZXZpb3VzX2dsdiA9IGdsdjsKKwlyZXR1cm4gMTsKK30KKworCitpbnQgZGV0YWNoX3Bvb2xfbHYoc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqcHJldmlvdXNfZ2x2ID0gTlVMTCwgKmdsdiwgKnVzZXJfZ2x2OworCXN0cnVjdCBnbHZfbGlzdCAqdXNlcl9nbHZsLCAqdGdsdmw7CisJc3RydWN0IGx2X3RoaW5fbWVzc2FnZSAqdG1zZywgKnRtcDsKKwlzdHJ1Y3Qgc2VnX2xpc3QgKnNsLCAqdHNsOworCWludCBub191cGRhdGUgPSAwOworCisJaWYgKCFzZWctPnBvb2xfbHYpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJObyBwb29sIGFzc29jaWF0ZWQgd2l0aCAlcyBMViwgJXMuIiwKKwkJCSAgbHZzZWdfbmFtZShzZWcpLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlZ19pc19jYWNoZShzZWcpKSB7CisJCWlmICghcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihzZWctPnBvb2xfbHYsIHNlZykpCisJCQlyZXR1cm5fMDsKKwkJc2VnLT5sdi0+c3RhdHVzICY9IH5DQUNIRTsKKwkJbHZfc2V0X3Zpc2libGUoc2VnLT5wb29sX2x2KTsKKwkJc2VnLT5wb29sX2x2ID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFsdl9pc190aGluX3Bvb2woc2VnLT5wb29sX2x2KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCSAgIkNhbm5vdCBkZXRhY2ggcG9vbCBmcm9tIExWICVzLiIsCisJCQkgIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEcm9wIGFueSBtZXNzYWdlIHJlZmVyZW5jaW5nIHJlbW92ZWQgc2VnbWVudCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHRtc2csIHRtcCwgJihmaXJzdF9zZWcoc2VnLT5wb29sX2x2KS0+dGhpbl9tZXNzYWdlcykpIHsKKwkJc3dpdGNoICh0bXNnLT50eXBlKSB7CisJCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9TTkFQOgorCQljYXNlIERNX1RISU5fTUVTU0FHRV9DUkVBVEVfVEhJTjoKKwkJCWlmICh0bXNnLT51Lmx2ID09IHNlZy0+bHYpIHsKKwkJCQlsb2dfZGVidWdfbWV0YWRhdGEoIkRpc2NhcmRpbmcgbWVzc2FnZSBmb3IgTFYgJXMuIiwKKwkJCQkJCSAgIHRtc2ctPnUubHYtPm5hbWUpOworCQkJCWRtX2xpc3RfZGVsKCZ0bXNnLT5saXN0KTsKKwkJCQlub191cGRhdGUgPSAxOyAvKiBSZXBsYWNpbmcgZXhpc3RpbmcgKi8KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERNX1RISU5fTUVTU0FHRV9ERUxFVEU6CisJCQlpZiAodG1zZy0+dS5kZWxldGVfaWQgPT0gc2VnLT5kZXZpY2VfaWQpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlRyeWluZyB0byBkZWxldGUgJXUgYWdhaW4uIiwKKwkJCQkJICB0bXNnLT51LmRlbGV0ZV9pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlICV1LiIsIHRtc2ctPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIV9zZXRfdXBfaGlzdG9yaWNhbF9sdihzZWcsICZwcmV2aW91c19nbHYpKQorCQlyZXR1cm5fMDsKKworCWlmICghZGV0YWNoX3RoaW5fZXh0ZXJuYWxfb3JpZ2luKHNlZykpCisJCXJldHVybl8wOworCisJaWYgKCFhdHRhY2hfcG9vbF9tZXNzYWdlKGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpLAorCQkJCSBETV9USElOX01FU1NBR0VfREVMRVRFLAorCQkJCSBOVUxMLCBzZWctPmRldmljZV9pZCwgbm9fdXBkYXRlKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXJlbW92ZV9zZWdfZnJvbV9zZWdzX3VzaW5nX3RoaXNfbHYoc2VnLT5wb29sX2x2LCBzZWcpKQorCQlyZXR1cm5fMDsKKworCWlmIChzZWctPm9yaWdpbiAmJgorCSAgICAhcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihzZWctPm9yaWdpbiwgc2VnKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBJZiB0aGluIG9yaWdpbiwgcmVtb3ZlIGl0IGZyb20gcmVsYXRlZCB0aGluIHNuYXBzaG90cyAqLworCS8qCisJICogVE9ETzogbWFwIHJlbW92YWwgb2Ygb3JpZ2luIGFzIHNuYXBzaG90IGx2Y29udmVydCAtLW1lcmdlPworCSAqIGkuZS4gcmVuYW1lIHRoaW4gc25hcHNob3QgdG8gb3JpZ2luIHRoaW4gb3JpZ2luCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoc2wsIHRzbCwgJnNlZy0+bHYtPnNlZ3NfdXNpbmdfdGhpc19sdikgeworCQlpZiAoIXNlZ19pc190aGluX3ZvbHVtZShzbC0+c2VnKSB8fAorCQkgICAgKHNlZy0+bHYgIT0gc2wtPnNlZy0+b3JpZ2luKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwcmV2aW91c19nbHYpIHsKKwkJCWlmICghKHVzZXJfZ2x2ID0gZ2V0X29yX2NyZWF0ZV9nbHYoc2VnLT5sdi0+dmctPnZnbWVtLCBzbC0+c2VnLT5sdiwgTlVMTCkpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoIWFkZF9nbHZfdG9faW5kaXJlY3RfZ2x2cyhzZWctPmx2LT52Zy0+dmdtZW0sIHByZXZpb3VzX2dsdiwgdXNlcl9nbHYpKQorCQkJCXJldHVybl8wOworCQl9CisKKwkJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KHNlZy0+bHYsIHNsLT5zZWcpKQorCQkJcmV0dXJuXzA7CisJCS8qIFRoaW4gc25hcHNob3QgaXMgbm93IHJlZ3VsYXIgdGhpbiB2b2x1bWUgKi8KKwkJc2wtPnNlZy0+b3JpZ2luID0gTlVMTDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZSh1c2VyX2dsdmwsIHRnbHZsLCAmc2VnLT5sdi0+aW5kaXJlY3RfZ2x2cykgeworCQl1c2VyX2dsdiA9IHVzZXJfZ2x2bC0+Z2x2OworCisJCWlmICghKGdsdiA9IGdldF9vcl9jcmVhdGVfZ2x2KHNlZy0+bHYtPnZnLT52Z21lbSwgc2VnLT5sdiwgTlVMTCkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFyZW1vdmVfZ2x2X2Zyb21faW5kaXJlY3RfZ2x2cyhnbHYsIHVzZXJfZ2x2KSkKKwkJCXJldHVybl8wOworCisJCWlmIChwcmV2aW91c19nbHYpIHsKKwkJCWlmICghYWRkX2dsdl90b19pbmRpcmVjdF9nbHZzKHNlZy0+bHYtPnZnLT52Z21lbSwgcHJldmlvdXNfZ2x2LCB1c2VyX2dsdikpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlzZWctPmx2LT5zdGF0dXMgJj0gflRISU5fVk9MVU1FOworCXNlZy0+cG9vbF9sdiA9IE5VTEw7CisJc2VnLT5vcmlnaW4gPSBOVUxMOworCXNlZy0+aW5kaXJlY3Rfb3JpZ2luID0gTlVMTDsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgbHZfc2VnbWVudCAqZmluZF9wb29sX3NlZyhjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZyA9IE5VTEw7CisJc3RydWN0IHNlZ19saXN0ICpzbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJnNlZy0+bHYtPnNlZ3NfdXNpbmdfdGhpc19sdikgeworCQkvKiBOZWVkcyB0byBiZSBoZSBvbmx5IGl0ZW0gaW4gbGlzdCAqLworCQlpZiAobHZfaXNfcGVuZGluZ19kZWxldGUoc2wtPnNlZy0+bHYpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBvb2xfc2VnKSB7CisJCQlsb2dfZXJyb3IoIiVzIGlzIHJlZmVyZW5jZWQgYnkgbW9yZSB0aGVuIG9uZSBzZWdtZW50cyAoJXMsICVzKS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUoc2VnLT5sdiksIGRpc3BsYXlfbHZuYW1lKHBvb2xfc2VnLT5sdiksCisJCQkJICBkaXNwbGF5X2x2bmFtZShzbC0+c2VnLT5sdikpOworCQkJcmV0dXJuIE5VTEw7IC8qIE1vcmUgdGhlbiBvbmUgc2VnbWVudCAqLworCQl9CisKKwkJcG9vbF9zZWcgPSBzbC0+c2VnOworCX0KKworCWlmICghcG9vbF9zZWcpIHsKKwkJbG9nX2Vycm9yKCJQb29sIHNlZ21lbnQgbm90IGZvdW5kIGZvciAlcy4iLCBkaXNwbGF5X2x2bmFtZShzZWctPmx2KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICgobHZfaXNfdGhpbl90eXBlKHNlZy0+bHYpICYmICFzZWdfaXNfcG9vbChwb29sX3NlZykpKSB7CisJCWxvZ19lcnJvcigiJXMgb24gJXMgaXMgbm90IGEgJXMgcG9vbCBzZWdtZW50IiwKKwkJCSAgcG9vbF9zZWctPmx2LT5uYW1lLCBzZWctPmx2LT5uYW1lLAorCQkJICBsdl9pc190aGluX3R5cGUoc2VnLT5sdikgPyAidGhpbiIgOiAiY2FjaGUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBvb2xfc2VnOworfQorCitpbnQgdmFsaWRhdGVfcG9vbF9jaHVua19zaXplKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCQkJICAgICB1aW50MzJfdCBjaHVua19zaXplKQoreworCXVpbnQzMl90IG1pbl9zaXplLCBtYXhfc2l6ZTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByID0gMTsKKworCWlmIChzZWd0eXBlX2lzX2NhY2hlKHNlZ3R5cGUpIHx8IHNlZ3R5cGVfaXNfY2FjaGVfcG9vbChzZWd0eXBlKSkgeworCQltaW5fc2l6ZSA9IERNX0NBQ0hFX01JTl9EQVRBX0JMT0NLX1NJWkU7CisJCW1heF9zaXplID0gRE1fQ0FDSEVfTUFYX0RBVEFfQkxPQ0tfU0laRTsKKwkJbmFtZSA9ICJDYWNoZSI7CisJfSBlbHNlIGlmIChzZWd0eXBlX2lzX3RoaW4oc2VndHlwZSkpIHsKKwkJbWluX3NpemUgPSBETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkU7CisJCW1heF9zaXplID0gRE1fVEhJTl9NQVhfREFUQV9CTE9DS19TSVpFOworCQluYW1lID0gIlRoaW4iOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQ2Fubm90IHZhbGlkYXRlIGNodW5rIHNpemUgb2YgIgorCQkJICAiJXMgc2VndHlwZS4iLCBzZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChjaHVua19zaXplIDwgbWluX3NpemUpIHx8IChjaHVua19zaXplID4gbWF4X3NpemUpKSB7CisJCWxvZ19lcnJvcigiJXMgcG9vbCBjaHVuayBzaXplICVzIGlzIG5vdCBpbiB0aGUgcmFuZ2UgJXMgdG8gJXMuIiwKKwkJCSAgbmFtZSwgZGlzcGxheV9zaXplKGNtZCwgY2h1bmtfc2l6ZSksCisJCQkgIGRpc3BsYXlfc2l6ZShjbWQsIG1pbl9zaXplKSwKKwkJCSAgZGlzcGxheV9zaXplKGNtZCwgbWF4X3NpemUpKTsKKwkJciA9IDA7CisJfQorCisJaWYgKGNodW5rX3NpemUgJiAobWluX3NpemUgLSAxKSkgeworCQlsb2dfZXJyb3IoIiVzIHBvb2wgY2h1bmsgc2l6ZSAlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJXMuIiwKKwkJCSAgbmFtZSwgZGlzcGxheV9zaXplKGNtZCwgY2h1bmtfc2l6ZSksCisJCQkgIGRpc3BsYXlfc2l6ZShjbWQsIG1pbl9zaXplKSk7CisJCXIgPSAwOworCX0KKworCXJldHVybiByOworfQorCisvKiBHcmVhdGVzdCBjb21tb24gZGl2aXNvciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX2djZCh1bnNpZ25lZCBsb25nIG4xLCB1bnNpZ25lZCBsb25nIG4yKQoreworCXVuc2lnbmVkIGxvbmcgcmVtYWluZGVyOworCisJZG8geworCQlyZW1haW5kZXIgPSBuMSAlIG4yOworCQluMSA9IG4yOworCQluMiA9IHJlbWFpbmRlcjsKKwl9IHdoaWxlIChuMik7CisKKwlyZXR1cm4gbjE7Cit9CisKKy8qIExlYXN0IGNvbW1vbiBtdWx0aXBsZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX2xjbSh1bnNpZ25lZCBsb25nIG4xLCB1bnNpZ25lZCBsb25nIG4yKQoreworCWlmICghbjEgfHwgIW4yKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKG4xICogbjIpIC8gX2djZChuMSwgbjIpOworfQorCitpbnQgcmVjYWxjdWxhdGVfcG9vbF9jaHVua19zaXplX3dpdGhfZGV2X2hpbnRzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJCQkJICAgICAgIGludCBwYXNzZWRfYXJncywKKwkJCQkJICAgICAgIGludCBjaHVua19zaXplX2NhbGNfcG9saWN5KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9kYXRhX2x2OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBwb29sX2x2LT52Zy0+Y21kOworCXVuc2lnbmVkIGxvbmcgcHJldmlvdXNfaGludCA9IDAsIGhpbnQgPSAwOworCXVpbnQzMl90IGRlZmF1bHRfY2h1bmtfc2l6ZTsKKwl1aW50MzJfdCBtaW5fY2h1bmtfc2l6ZSwgbWF4X2NodW5rX3NpemU7CisKKwlpZiAocGFzc2VkX2FyZ3MgJiBQQVNTX0FSR19DSFVOS19TSVpFKQorCQlyZXR1cm4gMTsKKworCWlmIChsdl9pc190aGluX3Bvb2wocG9vbF9sdikpIHsKKwkJaWYgKGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgYWxsb2NhdGlvbl90aGluX3Bvb2xfY2h1bmtfc2l6ZV9DRkcsIE5VTEwpKQorCQkJcmV0dXJuIDE7CisJCW1pbl9jaHVua19zaXplID0gRE1fVEhJTl9NSU5fREFUQV9CTE9DS19TSVpFOworCQltYXhfY2h1bmtfc2l6ZSA9IERNX1RISU5fTUFYX0RBVEFfQkxPQ0tfU0laRTsKKwkJZGVmYXVsdF9jaHVua19zaXplID0gZ2V0X2RlZmF1bHRfYWxsb2NhdGlvbl90aGluX3Bvb2xfY2h1bmtfc2l6ZV9DRkcoY21kLCBOVUxMKTsKKwl9IGVsc2UgaWYgKGx2X2lzX2NhY2hlX3Bvb2wocG9vbF9sdikpIHsKKwkJaWYgKGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NodW5rX3NpemVfQ0ZHLCBOVUxMKSkKKwkJCXJldHVybiAxOworCQltaW5fY2h1bmtfc2l6ZSA9IERNX0NBQ0hFX01JTl9EQVRBX0JMT0NLX1NJWkU7CisJCW1heF9jaHVua19zaXplID0gRE1fQ0FDSEVfTUFYX0RBVEFfQkxPQ0tfU0laRTsKKwkJZGVmYXVsdF9jaHVua19zaXplID0gZ2V0X2RlZmF1bHRfYWxsb2NhdGlvbl9jYWNoZV9wb29sX2NodW5rX3NpemVfQ0ZHKGNtZCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyBpcyBub3QgYSBwb29sIGxvZ2ljYWwgdm9sdW1lLiIsIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9vbF9kYXRhX2x2ID0gc2VnX2x2KGZpcnN0X3NlZyhwb29sX2x2KSwgMCk7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJnBvb2xfZGF0YV9sdi0+c2VnbWVudHMpIHsKKwkJc3dpdGNoIChzZWdfdHlwZShzZWcsIDApKSB7CisJCWNhc2UgQVJFQV9QVjoKKwkJCXB2ID0gc2VnX3B2KHNlZywgMCk7CisJCQlpZiAoY2h1bmtfc2l6ZV9jYWxjX3BvbGljeSA9PSBUSElOX0NIVU5LX1NJWkVfQ0FMQ19NRVRIT0RfUEVSRk9STUFOQ0UpCisJCQkJaGludCA9IGRldl9vcHRpbWFsX2lvX3NpemUoY21kLT5kZXZfdHlwZXMsIHB2X2RldihwdikpOworCQkJZWxzZQorCQkJCWhpbnQgPSBkZXZfbWluaW11bV9pb19zaXplKGNtZC0+ZGV2X3R5cGVzLCBwdl9kZXYocHYpKTsKKwkJCWlmICghaGludCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHByZXZpb3VzX2hpbnQpCisJCQkJaGludCA9IF9sY20ocHJldmlvdXNfaGludCwgaGludCk7CisJCQlwcmV2aW91c19oaW50ID0gaGludDsKKwkJCWJyZWFrOworCQljYXNlIEFSRUFfTFY6CisJCQkvKiBGSVhNRTogaGludCBmb3Igc3RhY2tlZCAocmFpZCkgTFZzIC0gZXN0aW1hdGUgZ2VvbWV0cnkgZnJvbSBMViA/PyAqLworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWhpbnQpCisJCWxvZ19kZWJ1Z19hbGxvYygiTm8gdXNhYmxlIGRldmljZSBoaW50IGZvdW5kIHdoaWxlIHJlY2FsY3VsYXRpbmcgIgorCQkJCSJwb29sIGNodW5rIHNpemUgZm9yICVzLiIsIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwllbHNlIGlmICgoaGludCA8IG1pbl9jaHVua19zaXplKSB8fCAoaGludCA+IG1heF9jaHVua19zaXplKSkKKwkJbG9nX2RlYnVnX2FsbG9jKCJDYWxjdWxhdGVkIGNodW5rIHNpemUgJXMgZm9yIHBvb2wgJXMgIgorCQkJCSJpcyBvdXQgb2YgYWxsb3dlZCByYW5nZSAoJXMtJXMpLiIsCisJCQkJZGlzcGxheV9zaXplKGNtZCwgaGludCksIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpLAorCQkJCWRpc3BsYXlfc2l6ZShjbWQsIG1pbl9jaHVua19zaXplKSwKKwkJCQlkaXNwbGF5X3NpemUoY21kLCBtYXhfY2h1bmtfc2l6ZSkpOworCWVsc2UKKwkJZmlyc3Rfc2VnKHBvb2xfbHYpLT5jaHVua19zaXplID0KKwkJCShoaW50ID49IGRlZmF1bHRfY2h1bmtfc2l6ZSkgPyBoaW50IDogZGVmYXVsdF9jaHVua19zaXplOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB1cGRhdGVfcG9vbF9wYXJhbXMoY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1bnNpZ25lZCB0YXJnZXRfYXR0ciwKKwkJICAgICAgIGludCBwYXNzZWRfYXJncywgdWludDMyX3QgcG9vbF9kYXRhX2V4dGVudHMsCisJCSAgICAgICB1aW50MzJfdCAqcG9vbF9tZXRhZGF0YV9leHRlbnRzLAorCQkgICAgICAgaW50ICpjaHVua19zaXplX2NhbGNfcG9saWN5LCB1aW50MzJfdCAqY2h1bmtfc2l6ZSwKKwkJICAgICAgIHRoaW5fZGlzY2FyZHNfdCAqZGlzY2FyZHMsIGludCAqemVybykKK3sKKwlpZiAoc2VndHlwZV9pc19jYWNoZV9wb29sKHNlZ3R5cGUpIHx8IHNlZ3R5cGVfaXNfY2FjaGUoc2VndHlwZSkpIHsKKwkJaWYgKCF1cGRhdGVfY2FjaGVfcG9vbF9wYXJhbXMoc2VndHlwZSwgdmcsIHRhcmdldF9hdHRyLCBwYXNzZWRfYXJncywKKwkJCQkJICAgICAgcG9vbF9kYXRhX2V4dGVudHMsIHBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJCQkJICAgICAgY2h1bmtfc2l6ZV9jYWxjX3BvbGljeSwgY2h1bmtfc2l6ZSkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKCF1cGRhdGVfdGhpbl9wb29sX3BhcmFtcyhzZWd0eXBlLCB2ZywgdGFyZ2V0X2F0dHIsIHBhc3NlZF9hcmdzLAorCQkJCQkgICAgcG9vbF9kYXRhX2V4dGVudHMsIHBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJCQkJICAgIGNodW5rX3NpemVfY2FsY19wb2xpY3ksIGNodW5rX3NpemUsCisJCQkJCSAgICBkaXNjYXJkcywgemVybykpIC8qIHRoaW4tcG9vbCAqLworCQkJcmV0dXJuXzA7CisKKwlpZiAoKHVpbnQ2NF90KSAqY2h1bmtfc2l6ZSA+ICh1aW50NjRfdCkgcG9vbF9kYXRhX2V4dGVudHMgKiB2Zy0+ZXh0ZW50X3NpemUpIHsKKwkJbG9nX2Vycm9yKCJTaXplIG9mICVzIGRhdGEgdm9sdW1lIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gY2h1bmsgc2l6ZSAlcy4iLAorCQkJICBzZWd0eXBlLT5uYW1lLCBkaXNwbGF5X3NpemUodmctPmNtZCwgKmNodW5rX3NpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ZlcmJvc2UoIlVzaW5nIHBvb2wgbWV0YWRhdGEgc2l6ZSAlcy4iLAorCQkgICAgZGlzcGxheV9zaXplKHZnLT5jbWQsICh1aW50NjRfdCkqcG9vbF9tZXRhZGF0YV9leHRlbnRzICogdmctPmV4dGVudF9zaXplKSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGNyZWF0ZV9wb29sKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWgsIHVpbnQzMl90IHN0cmlwZXMsIHVpbnQzMl90IHN0cmlwZV9zaXplKQoreworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnN0cmlwZWQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptZXRhX2x2LCAqZGF0YV9sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWNoYXIgbmFtZVtOQU1FX0xFTl07CisJaW50IHI7CisKKwlpZiAocG9vbF9sdi0+bGVfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJQb29sICVzIGFscmVhZHkgaGFzIGV4dGVudHMuIiwKKwkJCSAgcG9vbF9sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lcyIsIHBvb2xfbHYtPm5hbWUsCisJCQkoc2VndHlwZV9pc19jYWNoZV9wb29sKHNlZ3R5cGUpKSA/CisJCQkiY21ldGEiIDogInRtZXRhIikgPCAwKSB7CisJCWxvZ19lcnJvcigiTmFtZSBvZiBsb2dpY2FsIHZvbHVtZSAlcyBpcyB0b28gbG9uZyB0byBiZSBhIHBvb2wgbmFtZS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIExWIGlzIG5vdCB5ZXQgYSBwb29sLCBzbyBpdCdzIGV4dGVuc2lvbiBmcm9tIGx2Y3JlYXRlICovCisJaWYgKCEoc3RyaXBlZCA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKHBvb2xfbHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQlyZXR1cm5fMDsKKworCWlmIChhY3RpdmF0aW9uKCkgJiYgc3RyaXBlZC0+b3BzLT50YXJnZXRfcHJlc2VudCAmJgorCSAgICAhc3RyaXBlZC0+b3BzLT50YXJnZXRfcHJlc2VudChwb29sX2x2LT52Zy0+Y21kLCBOVUxMLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIiVzOiBSZXF1aXJlZCBkZXZpY2UtbWFwcGVyIHRhcmdldChzKSBub3QgIgorCQkJICAiZGV0ZWN0ZWQgaW4geW91ciBrZXJuZWwuIiwgc3RyaXBlZC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE1ldGFkYXRhIHNlZ21lbnQgKi8KKwlpZiAoIWx2X2FkZF9zZWdtZW50KGFoLCBzdHJpcGVzLCAxLCBwb29sX2x2LCBzdHJpcGVkLCAxLCAwLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFBvb2wgJXMgaXMgY3JlYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiIsCisJCQkgcG9vbF9sdi0+bmFtZSk7CisJZWxzZSBpZiAoIXRlc3RfbW9kZSgpKSB7CisJCWlmICghdmdfd3JpdGUocG9vbF9sdi0+dmcpIHx8ICF2Z19jb21taXQocG9vbF9sdi0+dmcpKQorCQkJcmV0dXJuXzA7CisKKwkJLyoKKwkJICogSWYga2lsbGVkIGhlcmUsIG9ubHkgdGhlIFZJU0lCTEUgc3RyaXBlZCBwb29sIExWIGlzIGxlZnQKKwkJICogYW5kIHVzZXIgY291bGQgZWFzaWx5IHJlbW92ZSBpdC4KKwkJICoKKwkJICogRklYTUU6IGltcGxlbWVudCBsYXp5IGNsZWFyaW5nIHdoZW4gYWN0aXZhdGlvbiBpcyBkaXNhYmxlZAorCQkgKi8KKwkJLyoKKwkJICogcG9vbF9sdiBpcyBhIG5ldyBMViBzbyB0aGUgVkcgbG9jayBwcm90ZWN0cyB1cworCQkgKiBQYXNzIGluIExWX1RFTVBPUkFSWSBmbGFnLCBzaW5jZSBkZXZpY2UgaXMgYWN0aXZhdGVkIHB1cmVseSBmb3Igd2lwZQorCQkgKiBhbmQgbGF0ZXIgaXQgaXMgZWl0aGVyIGRlYWN0aXZhdGVkIChpbiBjbHVzdGVyKQorCQkgKiBvciBkaXJlY3RseSBjb252ZXJ0ZWQgdG8gaW52aXNpYmxlIGRldmljZSB2aWEgc3VzcGVuZC9yZXN1bWUKKwkJICovCisJCXBvb2xfbHYtPnN0YXR1cyB8PSBMVl9URU1QT1JBUlk7CisJCWlmICghYWN0aXZhdGVfbHZfbG9jYWwocG9vbF9sdi0+dmctPmNtZCwgcG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiQWJvcnRpbmcuIEZhaWxlZCB0byBhY3RpdmF0ZSBwb29sIG1ldGFkYXRhICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQkvKiBDbGVhciA0S0Igb2YgcG9vbCBtZXRhZGF0YSBkZXZpY2UuICovCisJCWlmICghKHIgPSB3aXBlX2x2KHBvb2xfbHYsIChzdHJ1Y3Qgd2lwZV9wYXJhbXMpIHsgLmRvX3plcm8gPSAxIH0pKSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgcG9vbCBtZXRhZGF0YSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQl9CisJCXBvb2xfbHYtPnN0YXR1cyAmPSB+TFZfVEVNUE9SQVJZOworCQkvKiBEZWFjdGl2YXRlcyBjbGVhcmVkIG1ldGFkYXRhIExWICovCisJCWlmICghZGVhY3RpdmF0ZV9sdl9sb2NhbChwb29sX2x2LT52Zy0+Y21kLCBwb29sX2x2KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gQ291bGQgbm90IGRlYWN0aXZhdGUgcG9vbCBtZXRhZGF0YSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFyKQorCQkJZ290byBiYWQ7CisJfQorCisJaWYgKCEobWV0YV9sdiA9IGx2X2NyZWF0ZV9lbXB0eShuYW1lLCBOVUxMLCBMVk1fUkVBRCB8IExWTV9XUklURSwKKwkJCQkJQUxMT0NfSU5IRVJJVCwgcG9vbF9sdi0+dmcpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIW1vdmVfbHZfc2VnbWVudHMobWV0YV9sdiwgcG9vbF9sdiwgMCwgMCkpCisJCWdvdG9fYmFkOworCisJLyogUG9vbCBkYXRhIHNlZ21lbnQgKi8KKwlpZiAoIWx2X2FkZF9zZWdtZW50KGFoLCAwLCBzdHJpcGVzLCBwb29sX2x2LCBzdHJpcGVkLCBzdHJpcGVfc2l6ZSwgMCwgMCkpCisJCWdvdG9fYmFkOworCisJaWYgKCEoZGF0YV9sdiA9IGluc2VydF9sYXllcl9mb3JfbHYocG9vbF9sdi0+dmctPmNtZCwgcG9vbF9sdiwKKwkJCQkJICAgIHBvb2xfbHYtPnN0YXR1cywKKwkJCQkJICAgIChzZWd0eXBlX2lzX2NhY2hlX3Bvb2woc2VndHlwZSkpID8KKwkJCQkJICAgICJfY2RhdGEiIDogIl90ZGF0YSIpKSkKKwkJZ290b19iYWQ7CisKKwlzZWcgPSBmaXJzdF9zZWcocG9vbF9sdik7CisJLyogRHJvcCByZWZlcmVuY2UgYXMgYXR0YWNoX3Bvb2xfZGF0YV9sdigpIHRha2VzIGl0IGFnYWluICovCisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGRhdGFfbHYsIHNlZykpCisJCWdvdG9fYmFkOworCisJc2VnLT5zZWd0eXBlID0gc2VndHlwZTsgLyogU2V0IGFzIHRoaW5fcG9vbCBvciBjYWNoZV9wb29sIHNlZ21lbnQgKi8KKworCWlmICghYXR0YWNoX3Bvb2xfZGF0YV9sdihzZWcsIGRhdGFfbHYpKQorCQlnb3RvX2JhZDsKKworCWlmICghYXR0YWNoX3Bvb2xfbWV0YWRhdGFfbHYoc2VnLCBtZXRhX2x2KSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gMTsKKworYmFkOgorCWlmIChhY3RpdmF0aW9uKCkpIHsKKwkJLyogV2l0aG91dCBhY3RpdmF0aW9uIHRoZXJlIHdhcyBubyBpbnRlcm1lZGlhdGUgY29tbWl0ICovCisJCWlmICghbHZfcmVtb3ZlKHBvb2xfbHYpIHx8CisJCSAgICAhdmdfd3JpdGUocG9vbF9sdi0+dmcpIHx8ICF2Z19jb21taXQocG9vbF9sdi0+dmcpKQorCQkJbG9nX2Vycm9yKCJNYW51YWwgaW50ZXJ2ZW50aW9uIG1heSBiZSByZXF1aXJlZCB0byAiCisJCQkJICAicmVtb3ZlIGFiYW5kb25lZCBMVihzKSBiZWZvcmUgcmV0cnlpbmcuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqYWxsb2NfcG9vbF9tZXRhZGF0YShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHJlYWRfYWhlYWQsCisJCQkJCSAgIHVpbnQzMl90IHN0cmlwZXMsIHVpbnQzMl90IHN0cmlwZV9zaXplLAorCQkJCQkgICB1aW50MzJfdCBleHRlbnRzLCBhbGxvY19wb2xpY3lfdCBhbGxvYywKKwkJCQkJICAgc3RydWN0IGRtX2xpc3QgKnB2aCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1ldGFkYXRhX2x2OworCS8qIEZJWE1FOiBNYWtlIGx2bTJhcGkgdXNhYmxlICovCisJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyBsdmMgPSB7CisJCS5hY3RpdmF0ZSA9IENIQU5HRV9BTFksCisJCS5hbGxvYyA9IGFsbG9jLAorCQkuZXh0ZW50cyA9IGV4dGVudHMsCisJCS5tYWpvciA9IC0xLAorCQkubWlub3IgPSAtMSwKKwkJLnBlcm1pc3Npb24gPSBMVk1fUkVBRCB8IExWTV9XUklURSwKKwkJLnB2aCA9IHB2aCwKKwkJLnJlYWRfYWhlYWQgPSByZWFkX2FoZWFkLAorCQkuc3RyaXBlX3NpemUgPSBzdHJpcGVfc2l6ZSwKKwkJLnN0cmlwZXMgPSBzdHJpcGVzLAorCQkudGFncyA9IERNX0xJU1RfSEVBRF9JTklUKGx2Yy50YWdzKSwKKwkJLnRlbXBvcmFyeSA9IDEsCisJCS56ZXJvID0gMSwKKwl9OworCisJaWYgKCEobHZjLnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhwb29sX2x2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRTogYWxsb2NhdGUgcHJvcGVybHkgc3BhY2UgZm9yIG1ldGFkYXRhX2x2ICovCisKKwlpZiAoIShtZXRhZGF0YV9sdiA9IGx2X2NyZWF0ZV9zaW5nbGUocG9vbF9sdi0+dmcsICZsdmMpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWx2X3JlbmFtZV91cGRhdGUocG9vbF9sdi0+dmctPmNtZCwgbWV0YWRhdGFfbHYsIG5hbWUsIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBtZXRhZGF0YV9sdjsKK30KKworc3RhdGljIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqX2FsbG9jX3Bvb2xfbWV0YWRhdGFfc3BhcmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJCQkJIHVpbnQzMl90IGV4dGVudHMsCisJCQkJCQkJIHN0cnVjdCBkbV9saXN0ICpwdmgpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCS8qIEZJWE1FOiBNYWtlIGx2bTJhcGkgdXNhYmxlICovCisJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyBscCA9IHsKKwkJLmFjdGl2YXRlID0gQ0hBTkdFX0FMWSwKKwkJLmFsbG9jID0gQUxMT0NfSU5IRVJJVCwKKwkJLmV4dGVudHMgPSBleHRlbnRzLAorCQkubWFqb3IgPSAtMSwKKwkJLm1pbm9yID0gLTEsCisJCS5wZXJtaXNzaW9uID0gTFZNX1JFQUQgfCBMVk1fV1JJVEUsCisJCS5wdmggPSBwdmggPyA6ICZ2Zy0+cHZzLAorCQkucmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfQVVUTywKKwkJLnN0cmlwZXMgPSAxLAorCQkudGFncyA9IERNX0xJU1RfSEVBRF9JTklUKGxwLnRhZ3MpLAorCQkudGVtcG9yYXJ5ID0gMSwKKwkJLnplcm8gPSAxLAorCX07CisKKwlpZiAoIShscC5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJLyogRklYTUU6IE1heWJlIHVzaW5nIHNpbGVudCBtb2RlID8gKi8KKwlsb2dfdmVyYm9zZSgiUHJlcGFyaW5nIHBvb2wgbWV0YWRhdGEgc3BhcmUgdm9sdW1lIGZvciBWb2x1bWUgZ3JvdXAgJXMuIiwgdmctPm5hbWUpOworCWlmICghKGx2ID0gbHZfY3JlYXRlX3NpbmdsZSh2ZywgJmxwKSkpCisJCXJldHVybl8wOworCisJLyogU3BhcmUgTFYgc2hvdWxkIG5vdCBiZSBhY3RpdmUgKi8KKwlpZiAoIWRlYWN0aXZhdGVfbHZfbG9jYWwodmctPmNtZCwgbHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgcG9vbCBtZXRhZGF0YSBzcGFyZSBMVi4gIgorCQkJICAiTWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2Z19zZXRfcG9vbF9tZXRhZGF0YV9zcGFyZShsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIGx2OworfQorCisvKgorICogQ3JlYXRlL3Jlc2l6ZSBwb29sIG1ldGFkYXRhIHNwYXJlIExWCisgKiBDYWxsZXIgZG9lcyB2Z193cml0ZSgpLCB2Z19jb21taXQoKSB3aXRoIHBvb2wgY3JlYXRpb24KKyAqIGV4dGVudHMgaXMgMCwgbWF4IHNpemUgaXMgZGV0ZXJtaW5lZAorICovCitpbnQgaGFuZGxlX3Bvb2xfbWV0YWRhdGFfc3BhcmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IGV4dGVudHMsCisJCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKnB2aCwgaW50IHBvb2xtZXRhZGF0YXNwYXJlKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSB2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdjsKKwl1aW50MzJfdCBzZWdfbWlycm9yczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWNvbnN0IHN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlpZiAoIWV4dGVudHMpCisJCS8qIEZpbmQgbWF4aW1hbCBzaXplIG9mIG1ldGFkYXRhIExWICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQkJaWYgKGx2X2lzX3Bvb2xfbWV0YWRhdGEobHZsLT5sdikgJiYKKwkJCSAgICAobHZsLT5sdi0+bGVfY291bnQgPiBleHRlbnRzKSkKKwkJCQlleHRlbnRzID0gbHZsLT5sdi0+bGVfY291bnQ7CisKKwlpZiAoIXBvb2xtZXRhZGF0YXNwYXJlKSB7CisJCS8qIFRPRE86IE5vdCBzaG93aW5nIHdoZW4gbHZtLmNvbmYgd291bGQgZGVmaW5lICduJyA/ICovCisJCWlmIChERUZBVUxUX1BPT0xfTUVUQURBVEFfU1BBUkUgJiYgZXh0ZW50cykKKwkJCS8qIFdhcm4gaWYgdGhlcmUgd291bGQgYmUgYW55IHVzZXIgKi8KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiByZWNvdmVyeSBvZiBwb29scyB3aXRob3V0IHBvb2wgIgorCQkJCSAibWV0YWRhdGEgc3BhcmUgTFYgaXMgbm90IGF1dG9tYXRlZC4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFsdikgeworCQlpZiAoIV9hbGxvY19wb29sX21ldGFkYXRhX3NwYXJlKHZnLCBleHRlbnRzLCBwdmgpKQorCQkJcmV0dXJuXzA7CisKKwkJcmV0dXJuIDE7CisJfQorCisJc2VnID0gbGFzdF9zZWcobHYpOworCXNlZ19taXJyb3JzID0gbHZfbWlycm9yX2NvdW50KGx2KTsKKworCS8qIENoZWNrIHNwYXJlIExWIGlzIGJpZyBlbm91Z2ggYW5kIHByZXNlcnZlIHNlZ3R5cGUgKi8KKwlpZiAoKGx2LT5sZV9jb3VudCA8IGV4dGVudHMpICYmIHNlZyAmJgorCSAgICAhbHZfZXh0ZW5kKGx2LCBzZWctPnNlZ3R5cGUsCisJCSAgICAgICBzZWctPmFyZWFfY291bnQgLyBzZWdfbWlycm9ycywKKwkJICAgICAgIHNlZy0+c3RyaXBlX3NpemUsCisJCSAgICAgICBzZWdfbWlycm9ycywKKwkJICAgICAgIHNlZy0+cmVnaW9uX3NpemUsCisJCSAgICAgICBleHRlbnRzIC0gbHYtPmxlX2NvdW50LAorCQkgICAgICAgcHZoLCBsdi0+YWxsb2MsIDApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgdmdfc2V0X3Bvb2xfbWV0YWRhdGFfc3BhcmUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljaGFyIG5ld19uYW1lW05BTUVfTEVOXTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKworCWlmICh2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdikgeworCQlpZiAodmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYgPT0gbHYpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCF2Z19yZW1vdmVfcG9vbF9tZXRhZGF0YV9zcGFyZSh2ZykpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYobmV3X25hbWUsIHNpemVvZihuZXdfbmFtZSksICIlc19wbXNwYXJlIiwgbHYtPm5hbWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNhbid0IGNyZWF0ZSBwb29sIG1ldGFkYXRhIHNwYXJlLiBOYW1lIG9mIHBvb2wgTFYgIgorCQkJICAiJXMgaXMgdG9vIGxvbmcuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyYm9zZSgiUmVuYW1pbmcgJXMgYXMgcG9vbCBtZXRhZGF0YSBzcGFyZSB2b2x1bWUgJXMuIiwgbHYtPm5hbWUsIG5ld19uYW1lKTsKKwlpZiAoIWx2X3JlbmFtZV91cGRhdGUodmctPmNtZCwgbHYsIG5ld19uYW1lLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlsdl9zZXRfaGlkZGVuKGx2KTsKKwlsdi0+c3RhdHVzIHw9IFBPT0xfTUVUQURBVEFfU1BBUkU7CisJdmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYgPSBsdjsKKworCXJldHVybiAxOworfQorCitpbnQgdmdfcmVtb3ZlX3Bvb2xfbWV0YWRhdGFfc3BhcmUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY2hhciBuZXdfbmFtZVtOQU1FX0xFTl07CisJY2hhciAqYzsKKworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSB2Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdjsKKworCWlmICghKGx2LT5zdGF0dXMgJiBQT09MX01FVEFEQVRBX1NQQVJFKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIGlzIG5vdCBwb29sIG1ldGFkYXRhIHNwYXJlLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCXZnLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2ID0gTlVMTDsKKwlsdi0+c3RhdHVzICY9IH5QT09MX01FVEFEQVRBX1NQQVJFOworCWx2X3NldF92aXNpYmxlKGx2KTsKKworCS8qIEN1dCBvZmYgc3VmZml4IF9wbXNwYXJlICovCisJaWYgKCFkbV9zdHJuY3B5KG5ld19uYW1lLCBsdi0+bmFtZSwgc2l6ZW9mKG5ld19uYW1lKSkgfHwKKwkgICAgIShjID0gc3RyY2hyKG5ld19uYW1lLCAnXycpKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIGhhcyBubyBzdWZmaXggZm9yIHBvb2wgbWV0YWRhdGEgc3BhcmUuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCSpjID0gMDsKKworCS8qIElmIHRoZSBuYW1lIGlzIGluIHVzZSwgZ2VuZXJhdGUgbmV3IGx2b2wlZCAqLworCWlmIChsdl9uYW1lX2lzX3VzZWRfaW5fdmcodmcsIG5ld19uYW1lLCBOVUxMKSAmJgorCSAgICAhZ2VuZXJhdGVfbHZfbmFtZSh2ZywgImx2b2wlZCIsIG5ld19uYW1lLCBzaXplb2YobmV3X25hbWUpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSB1bmlxdWUgbmFtZSBmb3IgIgorCQkJICAicG9vbCBtZXRhZGF0YSBzcGFyZSBsb2dpY2FsIHZvbHVtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlbmFtaW5nIGV4aXN0aW5nIHBvb2wgbWV0YWRhdGEgc3BhcmUgIgorCQkJCSJsb2dpY2FsIHZvbHVtZSBcIiVzXCIgdG8gXCIlcy8lc1wiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgdmctPm5hbWUsIG5ld19uYW1lKTsKKworCWlmICghbHZfcmVuYW1lX3VwZGF0ZSh2Zy0+Y21kLCBsdiwgbmV3X25hbWUsIDApKQorCQlyZXR1cm5fMDsKKworCS8qIFRvIGRpc3BsYXkgZGVmYXVsdCB3YXJuaW5nICovCisJKHZvaWQpIGhhbmRsZV9wb29sX21ldGFkYXRhX3NwYXJlKHZnLCAwLCAwLCAwKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL3B2LmMgYi9saWIvbWV0YWRhdGEvcHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY2MDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL3B2LmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorCisvKgorICogRklYTUU6IENoZWNrIGZvciB2YWxpZCBoYW5kbGUgYmVmb3JlIGRlcmVmZXJlbmNpbmcgZmllbGQgb3IgbG9nIGVycm9yPworICovCisjZGVmaW5lIHB2X2ZpZWxkKGhhbmRsZSwgZmllbGQpCSgoaGFuZGxlKS0+ZmllbGQpCisKK2NoYXIgKnB2X2ZtdF9kdXAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJaWYgKCFwdi0+Zm10KQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAocHYtPnZnLT52Z21lbSwgcHYtPmZtdC0+bmFtZSk7Cit9CisKK2NoYXIgKnB2X25hbWVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXJldHVybiBkbV9wb29sX3N0cmR1cChtZW0gPyBtZW0gOiBwdi0+dmctPnZnbWVtLCBkZXZfbmFtZShwdi0+ZGV2KSk7Cit9CisKKy8qCisgKiBHZXRzL1NldHMgZm9yIGV4dGVybmFsIExWTSBsaWJyYXJ5CisgKi8KK3N0cnVjdCBpZCBwdl9pZChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIGlkKTsKK30KKworY2hhciAqcHZfdXVpZF9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIGlkX2Zvcm1hdF9hbmRfY29weShtZW0gPyBtZW0gOiBwdi0+dmctPnZnbWVtLCAmcHYtPmlkKTsKK30KKworY2hhciAqcHZfdGFnc19kdXAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIHRhZ3NfZm9ybWF0X2FuZF9jb3B5KHB2LT52Zy0+dmdtZW0sICZwdi0+dGFncyk7Cit9CisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqcHZfZm9ybWF0X3R5cGUoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIHB2X2ZpZWxkKHB2LCBmbXQpOworfQorCitzdHJ1Y3QgaWQgcHZfdmdpZChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIHZnaWQpOworfQorCitzdHJ1Y3QgZGV2aWNlICpwdl9kZXYoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIHB2X2ZpZWxkKHB2LCBkZXYpOworfQorCitjb25zdCBjaGFyICpwdl92Z19uYW1lKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCS8qIEF2b2lkIGV4cG9zaW5nIGludGVybmFsIG9ycGhhbiBuYW1lcyB0byB1c2VycyAqLworCXJldHVybiAoIWlzX29ycGhhbihwdikpID8gcHZfZmllbGQocHYsIHZnX25hbWUpIDogIiI7Cit9CisKK2NvbnN0IGNoYXIgKnB2X2Rldl9uYW1lKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXJldHVybiBkZXZfbmFtZShwdl9kZXYocHYpKTsKK30KKwordWludDY0X3QgcHZfc2l6ZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIHNpemUpOworfQorCit1aW50NjRfdCBwdl9kZXZfc2l6ZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwl1aW50NjRfdCBzaXplOworCisJaWYgKCFkZXZfZ2V0X3NpemUocHYtPmRldiwgJnNpemUpKQorCQlzaXplID0gMDsKKworCXJldHVybiBzaXplOworfQorCit1aW50NjRfdCBwdl9zaXplX2ZpZWxkKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXVpbnQ2NF90IHNpemU7CisKKwlpZiAoIXB2LT5wZV9jb3VudCkKKwkJc2l6ZSA9IHB2LT5zaXplOworCWVsc2UKKwkJc2l6ZSA9ICh1aW50NjRfdCkgcHYtPnBlX2NvdW50ICogcHYtPnBlX3NpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKwordWludDY0X3QgcHZfZnJlZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwl1aW50NjRfdCBmcmVlc3BhY2U7CisKKwlpZiAoIXB2LT52ZyB8fCBpc19vcnBoYW5fdmcocHYtPnZnLT5uYW1lKSkKKwkJZnJlZXNwYWNlID0gcHYtPnNpemU7CisJZWxzZQorCQlmcmVlc3BhY2UgPSAodWludDY0X3QpCisJCQkocHYtPnBlX2NvdW50IC0gcHYtPnBlX2FsbG9jX2NvdW50KSAqIHB2LT5wZV9zaXplOworCisJcmV0dXJuIGZyZWVzcGFjZTsKK30KKwordWludDY0X3QgcHZfc3RhdHVzKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXJldHVybiBwdl9maWVsZChwdiwgc3RhdHVzKTsKK30KKwordWludDMyX3QgcHZfcGVfc2l6ZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIHBlX3NpemUpOworfQorCit1aW50NjRfdCBwdl9iYV9zdGFydChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIGJhX3N0YXJ0KTsKK30KKwordWludDY0X3QgcHZfYmFfc2l6ZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIGJhX3NpemUpOworfQorCit1aW50NjRfdCBwdl9wZV9zdGFydChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gcHZfZmllbGQocHYsIHBlX3N0YXJ0KTsKK30KKwordWludDMyX3QgcHZfcGVfY291bnQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIHB2X2ZpZWxkKHB2LCBwZV9jb3VudCk7Cit9CisKK3VpbnQzMl90IHB2X3BlX2FsbG9jX2NvdW50KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXJldHVybiBwdl9maWVsZChwdiwgcGVfYWxsb2NfY291bnQpOworfQorCit1aW50MzJfdCBwdl9tZGFfY291bnQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisKKwlpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoKGNvbnN0IGNoYXIgKikmcHYtPmlkLnV1aWQsIHB2LT5kZXYsIDApOworCisJcmV0dXJuIGluZm8gPyBsdm1jYWNoZV9tZGFfY291bnQoaW5mbykgOiBVSU5UNjRfQygwKTsKK30KKworc3RhdGljIGludCBfY291bnRfdW5pZ25vcmVkKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHZvaWQgKmJhdG9uKQoreworCXVpbnQzMl90ICpjb3VudCA9IGJhdG9uOworCisJaWYgKCFtZGFfaXNfaWdub3JlZChtZGEpKQorCQkoKmNvdW50KSArKzsKKworCXJldHVybiAxOworfQorCit1aW50MzJfdCBwdl9tZGFfdXNlZF9jb3VudChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwl1aW50MzJfdCB1c2VkX2NvdW50PTA7CisKKwlpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQoKGNvbnN0IGNoYXIgKikmcHYtPmlkLnV1aWQsIHB2LT5kZXYsIDApOworCWlmICghaW5mbykKKwkJcmV0dXJuIDA7CisJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX2NvdW50X3VuaWdub3JlZCwgJnVzZWRfY291bnQpOworCisJcmV0dXJuIHVzZWRfY291bnQ7Cit9CisKKy8qKgorICogaXNfb3JwaGFuIC0gRGV0ZXJtaW5lIHdoZXRoZXIgYSBwdiBpcyBhbiBvcnBoYW4gYmFzZWQgb24gaXRzIHZnX25hbWUKKyAqIEBwdjogaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCB2b2x1bWUKKyAqLworaW50IGlzX29ycGhhbihjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlyZXR1cm4gaXNfb3JwaGFuX3ZnKHB2X2ZpZWxkKHB2LCB2Z19uYW1lKSk7Cit9CisKKy8qKgorICogaXNfcHYgLSBEZXRlcm1pbmUgd2hldGhlciBhIHB2IGlzIGEgcmVhbCBwdiBvciBkdW1teSBvbmUKKyAqIEBwdjogaGFuZGxlIHRvIGRldmljZQorICovCitpbnQgaXNfcHYoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJcmV0dXJuIChwdl9maWVsZChwdiwgdmdfbmFtZSkgPyAxIDogMCk7Cit9CisKK2ludCBpc19taXNzaW5nX3B2KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KQoreworCXJldHVybiBwdl9maWVsZChwdiwgc3RhdHVzKSAmIE1JU1NJTkdfUFYgPyAxIDogMDsKK30KKworaW50IGlzX3VzZWRfcHYoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJdWludDMyX3QgZXh0X2ZsYWdzOworCisJaWYgKCFwdi0+Zm10KQorCQlyZXR1cm4gMDsKKworCWlmICghaXNfb3JwaGFuKHB2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShwdi0+Zm10LT5mZWF0dXJlcyAmIEZNVF9QVl9GTEFHUykpCisJCXJldHVybiAwOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKChjb25zdCBjaGFyICopJnB2LT5pZCwgcHYtPmRldiwgMCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgY2FjaGVkIGluZm8gZm9yIFBWICVzLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlleHRfZmxhZ3MgPSBsdm1jYWNoZV9leHRfZmxhZ3MoaW5mbyk7CisKKwlyZXR1cm4gZXh0X2ZsYWdzICYgUFZfRVhUX1VTRUQgPyAxIDogMDsKK30KKworY2hhciAqcHZfYXR0cl9kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJY2hhciAqcmVwc3RyOworCWludCB1c2VkID0gaXNfdXNlZF9wdihwdik7CisJaW50IGR1cGxpY2F0ZSA9IGx2bWNhY2hlX2Rldl9pc191bmNob3Nlbl9kdXBsaWNhdGUocHYtPmRldik7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3phbGxvYyhtZW0sIDQpKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogQW4gYWxsb2NhdGFibGUgUFYgaXMgYWx3YXlzIHVzZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gc2hvdyAndScuCisJICovCisJaWYgKGR1cGxpY2F0ZSkKKwkJcmVwc3RyWzBdID0gJ2QnOworCWVsc2UgaWYgKHB2LT5zdGF0dXMgJiBBTExPQ0FUQUJMRV9QVikKKwkJcmVwc3RyWzBdID0gJ2EnOworCWVsc2UgaWYgKHVzZWQgPiAwKQorCQlyZXBzdHJbMF0gPSAndSc7CisJZWxzZQorCQlyZXBzdHJbMF0gPSAnLSc7CisKKwlyZXBzdHJbMV0gPSAocHYtPnN0YXR1cyAmIEVYUE9SVEVEX1ZHKSA/ICd4JyA6ICctJzsKKwlyZXBzdHJbMl0gPSAocHYtPnN0YXR1cyAmIE1JU1NJTkdfUFYpID8gJ20nIDogJy0nOworCisJcmV0dXJuIHJlcHN0cjsKK30KKwordWludDY0X3QgcHZfbWRhX3NpemUoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisJdWludDY0X3QgbWluX21kYV9zaXplID0gMDsKKwljb25zdCBjaGFyICpwdmlkID0gKGNvbnN0IGNoYXIgKikoJnB2LT5pZC51dWlkKTsKKworCS8qIFBWcyBjb3VsZCBoYXZlIDIgbWRhcyBvZiBkaWZmZXJlbnQgc2l6ZXMgKHJvdW5kaW5nIGVmZmVjdCkgKi8KKwlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmlkLCBwdi0+ZGV2LCAwKSkpCisJCW1pbl9tZGFfc2l6ZSA9IGx2bWNhY2hlX3NtYWxsZXN0X21kYV9zaXplKGluZm8pOworCXJldHVybiBtaW5fbWRhX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgX3B2X21kYV9mcmVlKHN0cnVjdCBtZXRhZGF0YV9hcmVhICptZGEsIHZvaWQgKmJhdG9uKQoreworCXVpbnQ2NF90IG1kYV9mcmVlOworCXVpbnQ2NF90ICpmcmVlc3BhY2UgPSBiYXRvbjsKKworCWlmICghbWRhLT5vcHMtPm1kYV9mcmVlX3NlY3RvcnMpCisJCXJldHVybiAxOworCisJbWRhX2ZyZWUgPSBtZGEtPm9wcy0+bWRhX2ZyZWVfc2VjdG9ycyhtZGEpOworCWlmIChtZGFfZnJlZSA8ICpmcmVlc3BhY2UpCisJCSpmcmVlc3BhY2UgPSBtZGFfZnJlZTsKKworCXJldHVybiAxOworfQorCit1aW50NjRfdCBsdm1jYWNoZV9pbmZvX21kYV9mcmVlKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKQoreworCXVpbnQ2NF90IGZyZWVzcGFjZSA9IFVJTlQ2NF9NQVg7CisKKwlpZiAoaW5mbykKKwkJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX3B2X21kYV9mcmVlLCAmZnJlZXNwYWNlKTsKKworCWlmIChmcmVlc3BhY2UgPT0gVUlOVDY0X01BWCkKKwkJZnJlZXNwYWNlID0gVUlOVDY0X0MoMCk7CisKKwlyZXR1cm4gZnJlZXNwYWNlOworfQorCit1aW50NjRfdCBwdl9tZGFfZnJlZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwljb25zdCBjaGFyICpwdmlkID0gKGNvbnN0IGNoYXIgKikmcHYtPmlkLnV1aWQ7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm87CisKKwlpZiAoKGluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwdmlkLCBwdi0+ZGV2LCAwKSkpCisJCXJldHVybiBsdm1jYWNoZV9pbmZvX21kYV9mcmVlKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3VpbnQ2NF90IHB2X3VzZWQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJdWludDY0X3QgdXNlZDsKKworCWlmICghcHYtPnBlX2NvdW50KQorCQl1c2VkID0gMExMOworCWVsc2UKKwkJdXNlZCA9ICh1aW50NjRfdCkgcHYtPnBlX2FsbG9jX2NvdW50ICogcHYtPnBlX3NpemU7CisKKwlyZXR1cm4gdXNlZDsKK30KKworc3RydWN0IF9wdl9tZGFfc2V0X2lnbm9yZWRfYmF0b24geworCXVuc2lnbmVkIG1kYV9pZ25vcmVkOworCXN0cnVjdCBkbV9saXN0ICptZGFzX2luX3VzZSwgKm1kYXNfaWdub3JlZCwgKm1kYXNfdG9fY2hhbmdlOworfTsKKworc3RhdGljIGludCBfcHZfbWRhX3NldF9pZ25vcmVkX29uZShzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhLCB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgX3B2X21kYV9zZXRfaWdub3JlZF9iYXRvbiAqYiA9IGJhdG9uOworCXN0cnVjdCBtZXRhZGF0YV9hcmVhICp2Z19tZGEsICp0bWRhOworCisJaWYgKG1kYV9pc19pZ25vcmVkKG1kYSkgJiYgIWItPm1kYV9pZ25vcmVkKSB7CisJCS8qIENoYW5naW5nIGFuIGlnbm9yZWQgbWRhIHRvIG9uZSBpbl91c2UgcmVxdWlyZXMgbW92aW5nIGl0ICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHZnX21kYSwgdG1kYSwgYi0+bWRhc19pZ25vcmVkKQorCQkJaWYgKG1kYV9sb2Nuc19tYXRjaChtZGEsIHZnX21kYSkpIHsKKwkJCQltZGFfc2V0X2lnbm9yZWQodmdfbWRhLCBiLT5tZGFfaWdub3JlZCk7CisJCQkJZG1fbGlzdF9tb3ZlKGItPm1kYXNfaW5fdXNlLCAmdmdfbWRhLT5saXN0KTsKKwkJCX0KKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZSh2Z19tZGEsIHRtZGEsIGItPm1kYXNfaW5fdXNlKQorCQlpZiAobWRhX2xvY25zX21hdGNoKG1kYSwgdmdfbWRhKSkKKwkJCS8qIERvbid0IG1vdmUgbWRhOiBuZWVkcyB3cml0aW5nIHRvIGRpc2suICovCisJCQltZGFfc2V0X2lnbm9yZWQodmdfbWRhLCBiLT5tZGFfaWdub3JlZCk7CisKKwltZGFfc2V0X2lnbm9yZWQobWRhLCBiLT5tZGFfaWdub3JlZCk7CisKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgcHZfbWRhX3NldF9pZ25vcmVkKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCB1bnNpZ25lZCBtZGFfaWdub3JlZCkKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgX3B2X21kYV9zZXRfaWdub3JlZF9iYXRvbiBiYXRvbjsKKwlzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCisJaWYgKCEoaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKChjb25zdCBjaGFyICopJnB2LT5pZC51dWlkLCBwdi0+ZGV2LCAwKSkpCisJCXJldHVybl8wOworCisJYmF0b24ubWRhX2lnbm9yZWQgPSBtZGFfaWdub3JlZDsKKwliYXRvbi5tZGFzX2luX3VzZSA9ICZwdi0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2U7CisJYmF0b24ubWRhc19pZ25vcmVkID0gJnB2LT5maWQtPm1ldGFkYXRhX2FyZWFzX2lnbm9yZWQ7CisJYmF0b24ubWRhc190b19jaGFuZ2UgPSBiYXRvbi5tZGFfaWdub3JlZCA/IGJhdG9uLm1kYXNfaW5fdXNlIDogYmF0b24ubWRhc19pZ25vcmVkOworCisJaWYgKGlzX29ycGhhbihwdikpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKG1kYSwgYmF0b24ubWRhc190b19jaGFuZ2UpCisJCQltZGFfc2V0X2lnbm9yZWQobWRhLCBiYXRvbi5tZGFfaWdub3JlZCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogRG8gbm90IGFsbG93IGRpc2FibGluZyBvZiB0aGUgdGhlIGxhc3QgUFYgaW4gYSBWRy4KKwkgKi8KKwlpZiAocHZfbWRhX3VzZWRfY291bnQocHYpID09IHZnX21kYV91c2VkX2NvdW50KHB2LT52ZykpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgZGlzYWJsZSBhbGwgbWV0YWRhdGEgYXJlYXMgaW4gdm9sdW1lIGdyb3VwICVzLiIsCisJCQkgIHB2LT52Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTm9uLW9ycGhhbiBjYXNlIGlzIG1vcmUgY29tcGxleC4KKwkgKiBJZiB0aGUgUFYncyBtZGFzIGFyZSBpZ25vcmVkLCBhbmQgd2Ugd2lzaCB0byB1bi1pZ25vcmUsCisJICogd2UgY2xlYXIgdGhlIGJpdCBhbmQgbW92ZSB0aGVtIGZyb20gdGhlIGlnbm9yZWQgbWRhIGxpc3QgdG8gdGhlCisJICogaW5fdXNlIGxpc3QsIGVuc3VyaW5nIHRoZSBuZXcgc3RhdGUgd2lsbCBnZXQgd3JpdHRlbiB0byBkaXNrCisJICogaW4gdGhlIHZnX3dyaXRlKCkgcGF0aC4KKwkgKiBJZiB0aGUgUFYncyBtZGFzIGFyZSBub3QgaWdub3JlZCwgYW5kIHdlIGFyZSBzZXR0aW5nCisJICogdGhlbSB0byBpZ25vcmVkLCB3ZSBzZXQgdGhlIGJpdCBidXQgbGVhdmUgdGhlbSBvbiB0aGUgaW5fdXNlCisJICogbGlzdCwgZW5zdXJpbmcgdGhlIG5ldyBzdGF0ZSB3aWxsIGdldCB3cml0dGVuIHRvIGRpc2sgaW4gdGhlCisJICogdmdfd3JpdGUoKSBwYXRoLgorCSAqLworCS8qIEZJWE1FOiBUcnkgbm90IHRvIHVwZGF0ZSB0aGUgY2FjaGUgaGVyZSEgQWxzbywgdHJ5IHRvIGl0ZXJhdGUgb3ZlcgorCSAqCSAgUFYgbWRhcyBvbmx5IHVzaW5nIHRoZSBmb3JtYXQgaW5zdGFuY2UncyBpbmRleCBzb21laG93CisJICogCSAgKGkuZS4gdHJ5IHRvIGF2b2lkIHVzaW5nIG1kYV9sb2NuX21hdGNoIGNhbGwpLiAqLworCisJbHZtY2FjaGVfZm9yZWFjaF9tZGEoaW5mbywgX3B2X21kYV9zZXRfaWdub3JlZF9vbmUsICZiYXRvbik7CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGxhYmVsICpwdl9sYWJlbChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbyA9CisJCWx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKChjb25zdCBjaGFyICopJnB2LT5pZC51dWlkLCBwdi0+ZGV2LCAwKTsKKworCWlmIChpbmZvKQorCQlyZXR1cm4gbHZtY2FjaGVfZ2V0X2xhYmVsKGluZm8pOworCisJLyogcHJvY2Vzc19lYWNoX3B2KCkgbWF5IGNyZWF0ZSBkdW1teSBQVnMgdGhhdCBoYXZlIG5vIGxhYmVsICovCisJaWYgKHB2LT52ZyAmJiBwdi0+ZGV2KQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlBWICVzIHVuZXhwZWN0ZWRseSBub3QgaW4gY2FjaGUuIiwKKwkJCSAgZGV2X25hbWUocHYtPmRldikpOworCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvcHYuaCBiL2xpYi9tZXRhZGF0YS9wdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODIwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvcHYuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIF9MVk1fUFZfSAorI2RlZmluZSBfTFZNX1BWX0gKKworI2luY2x1ZGUgInV1aWQuaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKworc3RydWN0IGRldmljZTsKK3N0cnVjdCBmb3JtYXRfdHlwZTsKK3N0cnVjdCB2b2x1bWVfZ3JvdXA7CisKK3N0cnVjdCBwaHlzaWNhbF92b2x1bWUgeworCXN0cnVjdCBpZCBpZDsKKwlzdHJ1Y3QgaWQgb2xkX2lkOwkJLyogU2V0IGR1cmluZyBwdmNoYW5nZSAtdS4gKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IGZvcm1hdF90eXBlICpmbXQ7CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCisJLyoKKwkgKiB2Z19uYW1lIGFuZCB2Z2lkIGFyZSB1c2VkIGJlZm9yZSB0aGUgcGFyZW50IFZHIHN0cnVjdCBleGlzdHMuCisJICogRklYTUU6IEludmVzdGlnYXRlIHJlbW92YWwvc3Vic3RpdHV0aW9uIHdpdGggJ3ZnJyBmaWVsZHMuCisJICovCisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwlzdHJ1Y3QgaWQgdmdpZDsKKworCS8qCisJICogJ3ZnJyBpcyBzZXQgYW5kIG1haW50YWluZWQgd2hlbiB0aGUgUFYgYmVsb25ncyB0byBhICdwdnMnCisJICogbGlzdCBpbiBhIHBhcmVudCBWRyBzdHJ1Y3QuCisJICovCisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisKKwl1aW50NjRfdCBzdGF0dXM7CisJdWludDY0X3Qgc2l6ZTsKKworCS8qIGJvb3Rsb2FkZXIgYXJlYSAqLworCXVpbnQ2NF90IGJhX3N0YXJ0OworCXVpbnQ2NF90IGJhX3NpemU7CisKKwkvKiBwaHlzaWNhbCBleHRlbnRzICovCisJdWludDMyX3QgcGVfc2l6ZTsKKwl1aW50NjRfdCBwZV9zdGFydDsKKwl1aW50MzJfdCBwZV9jb3VudDsKKwl1aW50MzJfdCBwZV9hbGxvY19jb3VudDsKKwl1bnNpZ25lZCBsb25nIHBlX2FsaWduOworCXVuc2lnbmVkIGxvbmcgcGVfYWxpZ25fb2Zmc2V0OworCisgICAgICAgIC8qIFRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgcmVwcmVzZW50ZWQgUFYgaGFzIGEgbGFiZWwgYXNzb2NpYXRlZC4gKi8KKyAgICAgICAgdWludDY0X3QgaXNfbGFiZWxsZWQ6MTsKKworICAgICAgICAvKiBOQi4gbGFiZWxfc2VjdG9yIGlzIHZhbGlkIHdoZW5ldmVyIGlzX2xhYmVsbGVkIGlzIHRydWUgKi8KKwl1aW50NjRfdCBsYWJlbF9zZWN0b3I7CisKKwlzdHJ1Y3QgZG1fbGlzdCBzZWdtZW50czsJLyogT3JkZXJlZCBwdl9zZWdtZW50cyBjb3ZlcmluZyBjb21wbGV0ZSBQViAqLworCXN0cnVjdCBkbV9saXN0IHRhZ3M7Cit9OworCitjaGFyICpwdl9mbXRfZHVwKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2NoYXIgKnB2X25hbWVfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3N0cnVjdCBkZXZpY2UgKnB2X2Rldihjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Citjb25zdCBjaGFyICpwdl92Z19uYW1lKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2NoYXIgKnB2X2F0dHJfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2NvbnN0IGNoYXIgKnB2X2Rldl9uYW1lKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2NoYXIgKnB2X3V1aWRfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2NoYXIgKnB2X3RhZ3NfZHVwKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X3NpemUoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOwordWludDY0X3QgcHZfc2l6ZV9maWVsZChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Cit1aW50NjRfdCBwdl9kZXZfc2l6ZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Cit1aW50NjRfdCBwdl9mcmVlKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X3N0YXR1cyhjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7Cit1aW50MzJfdCBwdl9wZV9zaXplKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X3BlX3N0YXJ0KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X2JhX3N0YXJ0KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X2JhX3NpemUoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOwordWludDMyX3QgcHZfcGVfY291bnQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOwordWludDMyX3QgcHZfcGVfYWxsb2NfY291bnQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOwordWludDY0X3QgcHZfbWRhX3NpemUoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworc3RydWN0IGx2bWNhY2hlX2luZm87Cit1aW50NjRfdCBsdm1jYWNoZV9pbmZvX21kYV9mcmVlKHN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvKTsKK3VpbnQ2NF90IHB2X21kYV9mcmVlKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQ2NF90IHB2X3VzZWQoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOwordWludDMyX3QgcHZfbWRhX2NvdW50KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3VpbnQzMl90IHB2X21kYV91c2VkX2NvdW50KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK3Vuc2lnbmVkIHB2X21kYV9zZXRfaWdub3JlZChjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgdW5zaWduZWQgaWdub3JlZCk7CitpbnQgaXNfb3JwaGFuKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2ludCBpc19taXNzaW5nX3B2KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2ludCBpc191c2VkX3B2KGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKK2ludCBpc19wdihjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CitzdHJ1Y3QgbGFiZWwgKnB2X2xhYmVsKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2KTsKKworI2VuZGlmIC8qIF9MVk1fUFZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL3B2X2FsbG9jLmggYi9saWIvbWV0YWRhdGEvcHZfYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjExZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL3B2X2FsbG9jLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fUFZfQUxMT0NfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworc3RydWN0IGRtX2xpc3Q7CitzdHJ1Y3QgZG1fcG9vbDsKK3N0cnVjdCBsdl9zZWdtZW50Oworc3RydWN0IHBoeXNpY2FsX3ZvbHVtZTsKK3N0cnVjdCBwdl9zZWdtZW50Oworc3RydWN0IHZvbHVtZV9ncm91cDsKKworaW50IGFsbG9jX3B2X3NlZ21lbnRfd2hvbGVfcHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpOworaW50IHBlZ19kdXAoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnBlZ19uZXcsIHN0cnVjdCBkbV9saXN0ICpwZWdfb2xkKTsKK3N0cnVjdCBwdl9zZWdtZW50ICphc3NpZ25fcGVnX3RvX2x2c2VnKHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCB1aW50MzJfdCBwZSwKKwkJCQkgICAgICAgdWludDMyX3QgYXJlYV9sZW4sCisJCQkJICAgICAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgICAgIHVpbnQzMl90IGFyZWFfbnVtKTsKK2ludCBwdl9zcGxpdF9zZWdtZW50KHN0cnVjdCBkbV9wb29sICptZW0sCisJCSAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHVpbnQzMl90IHBlLAorCQkgICAgIHN0cnVjdCBwdl9zZWdtZW50ICoqcHZzZWdfYWxsb2NhdGVkKTsKK2ludCBkaXNjYXJkX3B2X3NlZ21lbnQoc3RydWN0IHB2X3NlZ21lbnQgKnBlZywgdWludDMyX3QgZGlzY2FyZF9hcmVhX3JlZHVjdGlvbik7CitpbnQgcmVsZWFzZV9wdl9zZWdtZW50KHN0cnVjdCBwdl9zZWdtZW50ICpwZWcsIHVpbnQzMl90IGFyZWFfcmVkdWN0aW9uKTsKK2ludCBjaGVja19wdl9zZWdtZW50cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit2b2lkIG1lcmdlX3B2X3NlZ21lbnRzKHN0cnVjdCBwdl9zZWdtZW50ICpwZWcxLCBzdHJ1Y3QgcHZfc2VnbWVudCAqcGVnMik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL3B2X21hbmlwLmMgYi9saWIvbWV0YWRhdGEvcHZfbWFuaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg5YTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21ldGFkYXRhL3B2X21hbmlwLmMKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAicHZfYWxsb2MuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisjaW5jbHVkZSAibHZtZXRhZC5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJsYWJlbC5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAibHZtLXNpZ25hbC5oIgorCitzdGF0aWMgc3RydWN0IHB2X3NlZ21lbnQgKl9hbGxvY19wdl9zZWdtZW50KHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCSAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkJICAgIHVpbnQzMl90IHBlLCB1aW50MzJfdCBsZW4sCisJCQkJCSAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZzZWcsCisJCQkJCSAgICB1aW50MzJfdCBsdl9hcmVhKQoreworCXN0cnVjdCBwdl9zZWdtZW50ICpwZWc7CisKKwlpZiAoIShwZWcgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcGVnKSkpKSB7CisJCWxvZ19lcnJvcigicHZfc2VnbWVudCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZWctPnB2ID0gcHY7CisJcGVnLT5wZSA9IHBlOworCXBlZy0+bGVuID0gbGVuOworCXBlZy0+bHZzZWcgPSBsdnNlZzsKKwlwZWctPmx2X2FyZWEgPSBsdl9hcmVhOworCisJZG1fbGlzdF9pbml0KCZwZWctPmxpc3QpOworCisJcmV0dXJuIHBlZzsKK30KKworaW50IGFsbG9jX3B2X3NlZ21lbnRfd2hvbGVfcHYoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYpCit7CisJc3RydWN0IHB2X3NlZ21lbnQgKnBlZzsKKworCWlmICghcHYtPnBlX2NvdW50KQorCQlyZXR1cm4gMTsKKworCS8qIEZJWE1FIENvcGUgd2l0aCBob2xlcyBpbiBQVnMgKi8KKwlpZiAoIShwZWcgPSBfYWxsb2NfcHZfc2VnbWVudChtZW0sIHB2LCAwLCBwdi0+cGVfY291bnQsIE5VTEwsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2FkZCgmcHYtPnNlZ21lbnRzLCAmcGVnLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitpbnQgcGVnX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqcGVnX25ldywgc3RydWN0IGRtX2xpc3QgKnBlZ19vbGQpCit7CisJc3RydWN0IHB2X3NlZ21lbnQgKnBlZywgKnBlZ287CisKKwlkbV9saXN0X2luaXQocGVnX25ldyk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGVnbywgcGVnX29sZCkgeworCQlpZiAoIShwZWcgPSBfYWxsb2NfcHZfc2VnbWVudChtZW0sIHBlZ28tPnB2LCBwZWdvLT5wZSwKKwkJCQkJICAgICAgcGVnby0+bGVuLCBwZWdvLT5sdnNlZywKKwkJCQkJICAgICAgcGVnby0+bHZfYXJlYSkpKQorCQkJcmV0dXJuXzA7CisJCWRtX2xpc3RfYWRkKHBlZ19uZXcsICZwZWctPmxpc3QpOworCX0KKworCXJldHVybiAxOworfQorCisvKiBGaW5kIHNlZ21lbnQgYXQgYSBnaXZlbiBwaHlzaWNhbCBleHRlbnQgaW4gYSBQViAqLworc3RhdGljIHN0cnVjdCBwdl9zZWdtZW50ICpmaW5kX3BlZ19ieV9wZShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkJIHVpbnQzMl90IHBlKQoreworCXN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZzsKKworCS8qIHNlYXJjaCBiYWNrd2FyZHMgdG8gb3B0aW1pc2UgbW9zdGx5IHVzZWQgbGFzdCBzZWdtZW50IHNwbGl0ICovCisJZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXMocHZzZWcsICZwdi0+c2VnbWVudHMpCisJCWlmIChwZSA+PSBwdnNlZy0+cGUgJiYgcGUgPCBwdnNlZy0+cGUgKyBwdnNlZy0+bGVuKQorCQkJcmV0dXJuIHB2c2VnOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBTcGxpdCBwZWcgYXQgZ2l2ZW4gZXh0ZW50LgorICogU2Vjb25kIHBhcnQgaXMgYWx3YXlzIG5vdCBhbGxvY2F0ZWQgdG8gYSBMViBhbmQgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHZfc2VnbWVudCAqX3B2X3NwbGl0X3NlZ21lbnQoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCQkgICAgc3RydWN0IHB2X3NlZ21lbnQgKnBlZywKKwkJCQkJICAgIHVpbnQzMl90IHBlKQoreworCXN0cnVjdCBwdl9zZWdtZW50ICpwZWdfbmV3OworCisJaWYgKCEocGVnX25ldyA9IF9hbGxvY19wdl9zZWdtZW50KG1lbSwgcGVnLT5wdiwgcGUsCisJCQkJCSAgcGVnLT5sZW4gKyBwZWctPnBlIC0gcGUsCisJCQkJCSAgTlVMTCwgMCkpKQorCQlyZXR1cm5fTlVMTDsKKworCXBlZy0+bGVuID0gcGVnLT5sZW4gLSBwZWdfbmV3LT5sZW47CisKKwlkbV9saXN0X2FkZF9oKCZwZWctPmxpc3QsICZwZWdfbmV3LT5saXN0KTsKKworCWlmIChwZWctPmx2c2VnKSB7CisJCXBlZy0+cHYtPnBlX2FsbG9jX2NvdW50IC09IHBlZ19uZXctPmxlbjsKKwkJcGVnLT5sdnNlZy0+bHYtPnZnLT5mcmVlX2NvdW50ICs9IHBlZ19uZXctPmxlbjsKKwl9CisKKwlyZXR1cm4gcGVnX25ldzsKK30KKworLyoKKyAqIEVuc3VyZSB0aGVyZSBpcyBhIFBWIHNlZ21lbnQgYm91bmRhcnkgYXQgdGhlIGdpdmVuIGV4dGVudC4KKyAqLworaW50IHB2X3NwbGl0X3NlZ21lbnQoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgdWludDMyX3QgcGUsCisJCSAgICAgc3RydWN0IHB2X3NlZ21lbnQgKipwdnNlZ19hbGxvY2F0ZWQpCit7CisJc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLCAqcHZzZWdfbmV3ID0gTlVMTDsKKworCWlmIChwZSA9PSBwdi0+cGVfY291bnQpCisJCWdvdG8gb3V0OworCisJaWYgKCEocHZzZWcgPSBmaW5kX3BlZ19ieV9wZShwdiwgcGUpKSkgeworCQlsb2dfZXJyb3IoIlNlZ21lbnQgd2l0aCBleHRlbnQgJSIgUFJJdTMyICIgaW4gUFYgJXMgbm90IGZvdW5kIiwKKwkJCSAgcGUsIHB2X2Rldl9uYW1lKHB2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoaXMgaXMgYSBwZWcgc3RhcnQgYWxyZWFkeSAqLworCWlmIChwZSA9PSBwdnNlZy0+cGUpIHsKKwkJcHZzZWdfbmV3ID0gcHZzZWc7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHB2c2VnX25ldyA9IF9wdl9zcGxpdF9zZWdtZW50KG1lbSwgcHYsIHB2c2VnLCBwZSkpKQorCQlyZXR1cm5fMDsKK291dDoKKwlpZiAocHZzZWdfYWxsb2NhdGVkKQorCQkqcHZzZWdfYWxsb2NhdGVkID0gcHZzZWdfbmV3OworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHZfc2VnbWVudCBudWxsX3B2X3NlZ21lbnQgPSB7CisJLnB2ID0gTlVMTCwKKwkucGUgPSAwLAorfTsKKworc3RydWN0IHB2X3NlZ21lbnQgKmFzc2lnbl9wZWdfdG9fbHZzZWcoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkJICAgICAgIHVpbnQzMl90IHBlLCB1aW50MzJfdCBhcmVhX2xlbiwKKwkJCQkgICAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgICAgdWludDMyX3QgYXJlYV9udW0pCit7CisJc3RydWN0IHB2X3NlZ21lbnQgKnBlZyA9IE5VTEw7CisKKwkvKiBNaXNzaW5nIGZvcm1hdDEgUFYgKi8KKwlpZiAoIXB2KQorCQlyZXR1cm4gJm51bGxfcHZfc2VnbWVudDsKKworCWlmICghcHZfc3BsaXRfc2VnbWVudChzZWctPmx2LT52Zy0+dmdtZW0sIHB2LCBwZSwgJnBlZykgfHwKKwkgICAgIXB2X3NwbGl0X3NlZ21lbnQoc2VnLT5sdi0+dmctPnZnbWVtLCBwdiwgcGUgKyBhcmVhX2xlbiwgTlVMTCkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCFwZWcpIHsKKwkJbG9nX2Vycm9yKCJNaXNzaW5nIFBWIHNlZ21lbnQgb24gJXMgYXQgJXUuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpLCBwZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBlZy0+bHZzZWcgPSBzZWc7CisJcGVnLT5sdl9hcmVhID0gYXJlYV9udW07CisKKwlwZWctPnB2LT5wZV9hbGxvY19jb3VudCArPSBhcmVhX2xlbjsKKwlwZWctPmx2c2VnLT5sdi0+dmctPmZyZWVfY291bnQgLT0gYXJlYV9sZW47CisKKwlyZXR1cm4gcGVnOworfQorCitpbnQgZGlzY2FyZF9wdl9zZWdtZW50KHN0cnVjdCBwdl9zZWdtZW50ICpwZWcsIHVpbnQzMl90IGRpc2NhcmRfYXJlYV9yZWR1Y3Rpb24pCit7CisJdWludDY0X3QgZGlzY2FyZF9vZmZzZXRfc2VjdG9yczsKKwl1aW50NjRfdCBwZV9zdGFydCA9IHBlZy0+cHYtPnBlX3N0YXJ0OworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKCFwZWctPmx2c2VnKSB7CisJCWxvZ19lcnJvcigiZGlzY2FyZF9wdl9zZWdtZW50IHdpdGggdW5hbGxvY2F0ZWQgc2VnbWVudDogIgorCQkJICAiJXMgUEUgJSIgUFJJdTMyLCBwdl9kZXZfbmFtZShwZWctPnB2KSwgcGVnLT5wZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogT25seSBpc3N1ZSBkaXNjYXJkcyBpZiBlbmFibGVkIGluIGx2bS5jb25mIGFuZCBib3RoCisJICogdGhlIGRldmljZSBhbmQga2VybmVsICg+PSAyLjYuMzUpIHN1cHBvcnRzIGRpc2NhcmRzLgorCSAqLworCWlmICghZmluZF9jb25maWdfdHJlZV9ib29sKHBlZy0+cHYtPmZtdC0+Y21kLCBkZXZpY2VzX2lzc3VlX2Rpc2NhcmRzX0NGRywgTlVMTCkpCisJCXJldHVybiAxOworIAorCS8qIE1pc3NpbmcgUFY/ICovCisJaWYgKGlzX21pc3NpbmdfcHYocGVnLT5wdikgfHwgIXBlZy0+cHYtPmRldikgeworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcGVnLT5wdi0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCQlyZXR1cm5fMDsKKworCQlsb2dfdmVyYm9zZSgiU2tpcHBpbmcgZGlzY2FyZCBvbiBtaXNzaW5nIGRldmljZSB3aXRoIHV1aWQgJXMuIiwgdXVpZCk7CisKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFkZXZfZGlzY2FyZF9tYXhfYnl0ZXMocGVnLT5wdi0+Zm10LT5jbWQtPmRldl90eXBlcywgcGVnLT5wdi0+ZGV2KSB8fAorCSAgICAhZGV2X2Rpc2NhcmRfZ3JhbnVsYXJpdHkocGVnLT5wdi0+Zm10LT5jbWQtPmRldl90eXBlcywgcGVnLT5wdi0+ZGV2KSkKKwkJcmV0dXJuIDE7CisKKwlkaXNjYXJkX29mZnNldF9zZWN0b3JzID0gKHBlZy0+cGUgKyBwZWctPmx2c2VnLT5hcmVhX2xlbiAtIGRpc2NhcmRfYXJlYV9yZWR1Y3Rpb24pICoKKwkJCQkgKHVpbnQ2NF90KSBwZWctPnB2LT52Zy0+ZXh0ZW50X3NpemUgKyBwZV9zdGFydDsKKwlpZiAoIWRpc2NhcmRfb2Zmc2V0X3NlY3RvcnMpIHsKKwkJLyoKKwkJICogcGVfc3RhcnQ9MCBhbmQgdGhlIFBWJ3MgZmlyc3QgZXh0ZW50IGNvbnRhaW5zIHRoZSBsYWJlbC4KKwkJICogTXVzdCBza2lwIHBhc3QgdGhlIGZpcnN0IGV4dGVudC4KKwkJICovCisJCWRpc2NhcmRfb2Zmc2V0X3NlY3RvcnMgPSBwZWctPnB2LT52Zy0+ZXh0ZW50X3NpemU7CisJCWRpc2NhcmRfYXJlYV9yZWR1Y3Rpb24tLTsKKwl9CisKKwlsb2dfZGVidWdfYWxsb2MoIkRpc2NhcmRpbmcgJSIgUFJJdTMyICIgZXh0ZW50cyBvZmZzZXQgJSIgUFJJdTY0ICIgc2VjdG9ycyBvbiAlcy4iLAorCQkJZGlzY2FyZF9hcmVhX3JlZHVjdGlvbiwgZGlzY2FyZF9vZmZzZXRfc2VjdG9ycywgZGV2X25hbWUocGVnLT5wdi0+ZGV2KSk7CisJaWYgKGRpc2NhcmRfYXJlYV9yZWR1Y3Rpb24gJiYKKwkgICAgIWRldl9kaXNjYXJkX2Jsb2NrcyhwZWctPnB2LT5kZXYsIGRpc2NhcmRfb2Zmc2V0X3NlY3RvcnMgPDwgU0VDVE9SX1NISUZULAorCQkJCWRpc2NhcmRfYXJlYV9yZWR1Y3Rpb24gKiAodWludDY0X3QpIHBlZy0+cHYtPnZnLT5leHRlbnRfc2l6ZSAqIFNFQ1RPUl9TSVpFKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbWVyZ2VfZnJlZV9wdl9zZWdtZW50KHN0cnVjdCBwdl9zZWdtZW50ICpwZWcpCit7CisJc3RydWN0IGRtX2xpc3QgKmw7CisJc3RydWN0IHB2X3NlZ21lbnQgKm1lcmdlX3BlZzsKKworCWlmIChwZWctPmx2c2VnKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiX21lcmdlX2ZyZWVfcHZfc2VnIGNhbGxlZCBvbiBhIgorCQkJICAiIHNlZ21lbnQgdGhhdCBpcyBub3QgZnJlZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGSVhNRToKKwkgKiBTaG91bGQgd2UgZnJlZSB0aGUgbGlzdCBlbGVtZW50IG9uY2UgaXQgaXMgZGVsZXRlZAorCSAqIGZyb20gdGhlIGxpc3Q/ICBJIHRoaW5rIG5vdC4gIEl0IGlzIGxpa2VseSBwYXJ0IG9mCisJICogYSBtZW1wb29sLgorCSAqLworCS8qIEF0dGVtcHQgdG8gbWVyZ2Ugd2l0aCBGcmVlIHNwYWNlIGJlZm9yZSAqLworCWlmICgobCA9IGRtX2xpc3RfcHJldigmcGVnLT5wdi0+c2VnbWVudHMsICZwZWctPmxpc3QpKSkgeworCQltZXJnZV9wZWcgPSBkbV9saXN0X2l0ZW0obCwgc3RydWN0IHB2X3NlZ21lbnQpOworCQlpZiAoIW1lcmdlX3BlZy0+bHZzZWcpIHsKKwkJCW1lcmdlX3BlZy0+bGVuICs9IHBlZy0+bGVuOworCQkJZG1fbGlzdF9kZWwoJnBlZy0+bGlzdCk7CisJCQlwZWcgPSBtZXJnZV9wZWc7CisJCX0KKwl9CisKKwkvKiBBdHRlbXB0IHRvIG1lcmdlIHdpdGggRnJlZSBzcGFjZSBhZnRlciAqLworCWlmICgobCA9IGRtX2xpc3RfbmV4dCgmcGVnLT5wdi0+c2VnbWVudHMsICZwZWctPmxpc3QpKSkgeworCQltZXJnZV9wZWcgPSBkbV9saXN0X2l0ZW0obCwgc3RydWN0IHB2X3NlZ21lbnQpOworCQlpZiAoIW1lcmdlX3BlZy0+bHZzZWcpIHsKKwkJCXBlZy0+bGVuICs9IG1lcmdlX3BlZy0+bGVuOworCQkJZG1fbGlzdF9kZWwoJm1lcmdlX3BlZy0+bGlzdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHJlbGVhc2VfcHZfc2VnbWVudAorICogQHBlZworICogQGFyZWFfcmVkdWN0aW9uCisgKgorICogV0FSTklORzogV2hlbiByZWxlYXNlX3B2X3NlZ21lbnQgaXMgY2FsbGVkLCB0aGUgZnJlZWQgc3BhY2UgbWF5IGJlCisgKiAgICAgICAgICBtZXJnZWQgaW50byB0aGUgJ3B2X3NlZ21lbnQncyBiZWZvcmUgYW5kIGFmdGVyIGl0IGluIHRoZQorICogICAgICAgICAgbGlzdCBpZiB0aGV5IGFyZSBhbHNvIGZyZWUuICBUaHVzLCBhbnkgaXRlcmF0b3JzIG9mIHRoZQorICogICAgICAgICAgJ3B2LT5zZWdtZW50cycgbGlzdCB0aGF0IGNhbGwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGF3YXJlCisgKiAgICAgICAgICB0aGF0IHRoZSBsaXN0IGNhbiBjaGFuZ2UgaW4gYSB3YXkgdGhhdCBpcyB1bnNhZmUgZXZlbiBmb3IKKyAqICAgICAgICAgICpfc2FmZSBpdGVyYXRvcnMuICBSZXN0YXJ0IHRoZSBpdGVyYXRvciBpbiB0aGVzZSBjYXNlcy4KKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZQorICovCitpbnQgcmVsZWFzZV9wdl9zZWdtZW50KHN0cnVjdCBwdl9zZWdtZW50ICpwZWcsIHVpbnQzMl90IGFyZWFfcmVkdWN0aW9uKQoreworCXN0cnVjdCBkbV9saXN0ICpsOworCXN0cnVjdCBwdl9zZWdtZW50ICptZXJnZV9wZWc7CisKKwlpZiAoIXBlZy0+bHZzZWcpIHsKKwkJbG9nX2Vycm9yKCJyZWxlYXNlX3B2X3NlZ21lbnQgd2l0aCB1bmFsbG9jYXRlZCBzZWdtZW50OiAiCisJCQkgICIlcyBQRSAlIiBQUkl1MzIsIHB2X2Rldl9uYW1lKHBlZy0+cHYpLCBwZWctPnBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBlZy0+bHZzZWctPmFyZWFfbGVuID09IGFyZWFfcmVkdWN0aW9uKSB7CisJCXBlZy0+cHYtPnBlX2FsbG9jX2NvdW50IC09IGFyZWFfcmVkdWN0aW9uOworCQlwZWctPmx2c2VnLT5sdi0+dmctPmZyZWVfY291bnQgKz0gYXJlYV9yZWR1Y3Rpb247CisKKwkJcGVnLT5sdnNlZyA9IE5VTEw7CisJCXBlZy0+bHZfYXJlYSA9IDA7CisKKwkJcmV0dXJuIF9tZXJnZV9mcmVlX3B2X3NlZ21lbnQocGVnKTsKKwl9CisKKwlpZiAoIXB2X3NwbGl0X3NlZ21lbnQocGVnLT5sdnNlZy0+bHYtPnZnLT52Z21lbSwKKwkJCSAgICAgIHBlZy0+cHYsIHBlZy0+cGUgKyBwZWctPmx2c2VnLT5hcmVhX2xlbiAtCisJCQkgICAgICBhcmVhX3JlZHVjdGlvbiwgTlVMTCkpCisJCXJldHVybl8wOworCisJLyogVGhlIHNlZ21lbnQgYWZ0ZXIgJ3BlZycgbm93IGhvbGRzIGZyZWUgc3BhY2UsIHRyeSB0byBtZXJnZSBpdCAqLworCWlmICgobCA9IGRtX2xpc3RfbmV4dCgmcGVnLT5wdi0+c2VnbWVudHMsICZwZWctPmxpc3QpKSkgeworCQltZXJnZV9wZWcgPSBkbV9saXN0X2l0ZW0obCwgc3RydWN0IHB2X3NlZ21lbnQpOworCQlyZXR1cm4gX21lcmdlX2ZyZWVfcHZfc2VnbWVudChtZXJnZV9wZWcpOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogT25seSBmb3IgdXNlIGJ5IGx2X3NlZ21lbnQgbWVyZ2luZyByb3V0aW5lcy4KKyAqLwordm9pZCBtZXJnZV9wdl9zZWdtZW50cyhzdHJ1Y3QgcHZfc2VnbWVudCAqcGVnMSwgc3RydWN0IHB2X3NlZ21lbnQgKnBlZzIpCit7CisJcGVnMS0+bGVuICs9IHBlZzItPmxlbjsKKworCWRtX2xpc3RfZGVsKCZwZWcyLT5saXN0KTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgb3ZlcmxhcCwgaW4gZXh0ZW50cywgYmV0d2VlbiBhIHN0cnVjdCBwdl9zZWdtZW50IGFuZAorICogYSBzdHJ1Y3QgcGVfcmFuZ2UuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfb3ZlcmxhcF9wZShjb25zdCBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWcsCisJCQkgICAgY29uc3Qgc3RydWN0IHBlX3JhbmdlICpwZXIpCit7CisJdWludDMyX3Qgc3RhcnQ7CisJdWludDMyX3QgZW5kOworCisJc3RhcnQgPSBtYXgocHZzZWctPnBlLCBwZXItPnN0YXJ0KTsKKwllbmQgPSBtaW4ocHZzZWctPnBlICsgcHZzZWctPmxlbiwgcGVyLT5zdGFydCArIHBlci0+Y291bnQpOworCWlmIChlbmQgPCBzdGFydCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gZW5kIC0gc3RhcnQ7Cit9CisKKy8qCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgZnJlZSBQRXMgaW4gYSBzdHJ1Y3QgcHZfbGlzdAorICovCit1aW50MzJfdCBwdl9saXN0X2V4dGVudHNfZnJlZShjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqcHZoKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IHBlX3JhbmdlICpwZXI7CisJdWludDMyX3QgZXh0ZW50cyA9IDA7CisJc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZoKSB7CisJCWlmICghcHZsLT5wZV9yYW5nZXMpIHsKKwkJCWxvZ193YXJuKElOVEVSTkFMX0VSUk9SICJXQVJOSU5HOiBQViAlcyBpcyB3aXRob3V0IGluaXRpYWxpemVkIFBFIHJhbmdlcy4iLCBkZXZfbmFtZShwdmwtPnB2LT5kZXYpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwZXIsIHB2bC0+cGVfcmFuZ2VzKSB7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZzZWcsICZwdmwtPnB2LT5zZWdtZW50cykgeworCQkJCWlmICghcHZzZWdfaXNfYWxsb2NhdGVkKHB2c2VnKSkKKwkJCQkJZXh0ZW50cyArPSBfb3ZlcmxhcF9wZShwdnNlZywgcGVyKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBleHRlbnRzOworfQorCisvKgorICogQ2hlY2sgYWxsIHB2X3NlZ21lbnRzIGluIFZHIGZvciBjb25zaXN0ZW5jeQorICovCitpbnQgY2hlY2tfcHZfc2VnbWVudHMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgcHZfc2VnbWVudCAqcGVnOworCXVuc2lnbmVkIHMsIHNlZ25vOworCXVpbnQzMl90IHN0YXJ0X3BlLCBhbGxvY2VkOworCXVpbnQzMl90IHB2X2NvdW50ID0gMCwgZnJlZV9jb3VudCA9IDAsIGV4dGVudF9jb3VudCA9IDA7CisJaW50IHJldCA9IDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlwdiA9IHB2bC0+cHY7CisJCXNlZ25vID0gMDsKKwkJc3RhcnRfcGUgPSAwOworCQlhbGxvY2VkID0gMDsKKwkJcHZfY291bnQrKzsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGVnLCAmcHYtPnNlZ21lbnRzKSB7CisJCQlzID0gcGVnLT5sdl9hcmVhOworCisJCQkvKiBGSVhNRSBSZW1vdmUgdGhpcyBuZXh0IGxpbmUgZXZlbnR1YWxseSAqLworCQkJbG9nX2RlYnVnX2FsbG9jKCIlcyAldTogJTZ1ICU2dTogJXMoJXU6JXUpIiwKKwkJCQkJcHZfZGV2X25hbWUocHYpLCBzZWdubysrLCBwZWctPnBlLCBwZWctPmxlbiwKKwkJCQkJcGVnLT5sdnNlZyA/IHBlZy0+bHZzZWctPmx2LT5uYW1lIDogIk5VTEwiLAorCQkJCQlwZWctPmx2c2VnID8gcGVnLT5sdnNlZy0+bGUgOiAwLCBzKTsKKwkJCS8qIEZJWE1FIEFkZCBkZXRhaWxzIGhlcmUgb24gZmFpbHVyZSBpbnN0ZWFkICovCisJCQlpZiAoc3RhcnRfcGUgIT0gcGVnLT5wZSkgeworCQkJCWxvZ19lcnJvcigiR2FwIGluIHB2c2VnczogJXUsICV1IiwKKwkJCQkJICBzdGFydF9wZSwgcGVnLT5wZSk7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJCWlmIChwZWctPmx2c2VnKSB7CisJCQkJaWYgKHNlZ190eXBlKHBlZy0+bHZzZWcsIHMpICE9IEFSRUFfUFYpIHsKKwkJCQkJbG9nX2Vycm9yKCJXcm9uZyBsdnNlZyBhcmVhIHR5cGUiKTsKKwkJCQkJcmV0ID0gMDsKKwkJCQl9CisJCQkJaWYgKHNlZ19wdnNlZyhwZWctPmx2c2VnLCBzKSAhPSBwZWcpIHsKKwkJCQkJbG9nX2Vycm9yKCJJbmNvbnNpc3RlbnQgcHZzZWcgcG9pbnRlcnMiKTsKKwkJCQkJcmV0ID0gMDsKKwkJCQl9CisJCQkJaWYgKHBlZy0+bHZzZWctPmFyZWFfbGVuICE9IHBlZy0+bGVuKSB7CisJCQkJCWxvZ19lcnJvcigiSW5jb25zaXN0ZW50IGxlbmd0aDogJXUgJXUiLAorCQkJCQkJICBwZWctPmxlbiwKKwkJCQkJCSAgcGVnLT5sdnNlZy0+YXJlYV9sZW4pOworCQkJCQlyZXQgPSAwOworCQkJCX0KKwkJCQlhbGxvY2VkICs9IHBlZy0+bGVuOworCQkJfQorCQkJc3RhcnRfcGUgKz0gcGVnLT5sZW47CisJCX0KKworCQlpZiAoc3RhcnRfcGUgIT0gcHYtPnBlX2NvdW50KSB7CisJCQlsb2dfZXJyb3IoIlBWIHNlZ21lbnQgcGVfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IiwKKwkJCQkgIHN0YXJ0X3BlLCBwdi0+cGVfY291bnQpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCWlmIChhbGxvY2VkICE9IHB2LT5wZV9hbGxvY19jb3VudCkgeworCQkJbG9nX2Vycm9yKCJQViBzZWdtZW50IHBlX2FsbG9jX2NvdW50IG1pc21hdGNoOiAiCisJCQkJICAiJXUgIT0gJXUiLCBhbGxvY2VkLCBwdi0+cGVfYWxsb2NfY291bnQpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCWV4dGVudF9jb3VudCArPSBzdGFydF9wZTsKKwkJZnJlZV9jb3VudCArPSAoc3RhcnRfcGUgLSBhbGxvY2VkKTsKKwl9CisKKwlpZiAocHZfY291bnQgIT0gdmctPnB2X2NvdW50KSB7CisJCWxvZ19lcnJvcigiUFYgc2VnbWVudCBWRyBwdl9jb3VudCBtaXNtYXRjaDogJXUgIT0gJXUiLAorCQkJICBwdl9jb3VudCwgdmctPnB2X2NvdW50KTsKKwkJcmV0ID0gMDsKKwl9CisKKwlpZiAoZnJlZV9jb3VudCAhPSB2Zy0+ZnJlZV9jb3VudCkgeworCQlsb2dfZXJyb3IoIlBWIHNlZ21lbnQgVkcgZnJlZV9jb3VudCBtaXNtYXRjaDogJXUgIT0gJXUiLAorCQkJICBmcmVlX2NvdW50LCB2Zy0+ZnJlZV9jb3VudCk7CisJCXJldCA9IDA7CisJfQorCisJaWYgKGV4dGVudF9jb3VudCAhPSB2Zy0+ZXh0ZW50X2NvdW50KSB7CisJCWxvZ19lcnJvcigiUFYgc2VnbWVudCBWRyBleHRlbnRfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IiwKKwkJCSAgZXh0ZW50X2NvdW50LCB2Zy0+ZXh0ZW50X2NvdW50KTsKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9yZWR1Y2VfcHYoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgICB1aW50MzJfdCBvbGRfcGVfY291bnQsIHVpbnQzMl90IG5ld19wZV9jb3VudCkKK3sKKwlzdHJ1Y3QgcHZfc2VnbWVudCAqcGVnLCAqcGVndDsKKworCWlmIChuZXdfcGVfY291bnQgPCBwdi0+cGVfYWxsb2NfY291bnQpIHsKKwkJbG9nX2Vycm9yKCIlczogY2Fubm90IHJlc2l6ZSB0byAlIiBQUkl1MzIgIiBleHRlbnRzICIKKwkJCSAgImFzICUiIFBSSXUzMiAiIGFyZSBhbGxvY2F0ZWQuIiwKKwkJCSAgcHZfZGV2X25hbWUocHYpLCBuZXdfcGVfY291bnQsCisJCQkgIHB2LT5wZV9hbGxvY19jb3VudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIFBFcyB0byBiZSByZW1vdmVkIGFyZSBub3QgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGVnLCAmcHYtPnNlZ21lbnRzKSB7CisgCQlpZiAocGVnLT5wZSArIHBlZy0+bGVuIDw9IG5ld19wZV9jb3VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwZWctPmx2c2VnKSB7CisJCQlsb2dfZXJyb3IoIiVzOiBjYW5ub3QgcmVzaXplIHRvICUiIFBSSXUzMiAiIGV4dGVudHMgYXMgIgorCQkJCSAgImxhdGVyIG9uZXMgYXJlIGFsbG9jYXRlZC4iLAorCQkJCSAgcHZfZGV2X25hbWUocHYpLCBuZXdfcGVfY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIXB2X3NwbGl0X3NlZ21lbnQodmctPnZnbWVtLCBwdiwgbmV3X3BlX2NvdW50LCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwZWcsIHBlZ3QsICZwdi0+c2VnbWVudHMpIHsKKyAJCWlmIChwZWctPnBlICsgcGVnLT5sZW4gPiBuZXdfcGVfY291bnQpCisJCQlkbV9saXN0X2RlbCgmcGVnLT5saXN0KTsKKwl9CisKKwlwdi0+cGVfY291bnQgPSBuZXdfcGVfY291bnQ7CisKKwl2Zy0+ZXh0ZW50X2NvdW50IC09IChvbGRfcGVfY291bnQgLSBuZXdfcGVfY291bnQpOworCXZnLT5mcmVlX2NvdW50IC09IChvbGRfcGVfY291bnQgLSBuZXdfcGVfY291bnQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2V4dGVuZF9wdihzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICAgIHVpbnQzMl90IG9sZF9wZV9jb3VudCwgdWludDMyX3QgbmV3X3BlX2NvdW50KQoreworCXN0cnVjdCBwdl9zZWdtZW50ICpwZWc7CisKKwlpZiAoKHVpbnQ2NF90KSBuZXdfcGVfY291bnQgKiBwdi0+cGVfc2l6ZSA+IHB2LT5zaXplICkgeworCQlsb2dfZXJyb3IoIiVzOiBjYW5ub3QgcmVzaXplIHRvICUiIFBSSXUzMiAiIGV4dGVudHMgYXMgdGhlcmUgIgorCQkJICAiaXMgb25seSByb29tIGZvciAlIiBQUkl1NjQgIi4iLCBwdl9kZXZfbmFtZShwdiksCisJCQkgIG5ld19wZV9jb3VudCwgcHYtPnNpemUgLyBwdi0+cGVfc2l6ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHBlZyA9IF9hbGxvY19wdl9zZWdtZW50KHB2LT5mbXQtPmNtZC0+bWVtLCBwdiwKKwkJCQkgICAgICBvbGRfcGVfY291bnQsCisJCQkJICAgICAgbmV3X3BlX2NvdW50IC0gb2xkX3BlX2NvdW50LAorCQkJCSAgICAgIE5VTEwsIDApKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2FkZCgmcHYtPnNlZ21lbnRzLCAmcGVnLT5saXN0KTsKKworCXB2LT5wZV9jb3VudCA9IG5ld19wZV9jb3VudDsKKworCXZnLT5leHRlbnRfY291bnQgKz0gKG5ld19wZV9jb3VudCAtIG9sZF9wZV9jb3VudCk7CisJdmctPmZyZWVfY291bnQgKz0gKG5ld19wZV9jb3VudCAtIG9sZF9wZV9jb3VudCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlc2l6ZSBhIFBWIGluIGEgVkcsIGFkZGluZyBvciByZW1vdmluZyBzZWdtZW50cyBhcyBuZWVkZWQuCisgKiBOZXcgc2l6ZSBtdXN0IGZpdCB3aXRoaW4gcHYtPnNpemUuCisgKi8KK3N0YXRpYyBpbnQgcHZfcmVzaXplKHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCSAgICAgIHVpbnQ2NF90IHNpemUpCit7CisJdWludDMyX3Qgb2xkX3BlX2NvdW50LCBuZXdfcGVfY291bnQgPSAwOworCisJaWYgKHNpemUgPCBwdl9taW5fc2l6ZSgpKSB7CisJCWxvZ19lcnJvcigiU2l6ZSBtdXN0IGV4Y2VlZCBtaW5pbXVtIG9mICUiIFBSSXU2NCAiIHNlY3RvcnMgb24gUFYgJXMuIiwKKwkJCSAgIHB2X21pbl9zaXplKCksIHB2X2Rldl9uYW1lKHB2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzaXplIDwgcHZfcGVfc3RhcnQocHYpKSB7CisJCWxvZ19lcnJvcigiU2l6ZSBtdXN0IGV4Y2VlZCBwaHlzaWNhbCBleHRlbnQgc3RhcnQgIgorCQkJICAib2YgJSIgUFJJdTY0ICIgc2VjdG9ycyBvbiBQViAlcy4iLAorCQkJICBwdl9wZV9zdGFydChwdiksIHB2X2Rldl9uYW1lKHB2KSk7CisJfQorCisJb2xkX3BlX2NvdW50ID0gcHYtPnBlX2NvdW50OworCisJaWYgKCFwdi0+Zm10LT5vcHMtPnB2X3Jlc2l6ZShwdi0+Zm10LCBwdiwgdmcsIHNpemUpKSB7CisJCWxvZ19lcnJvcigiRm9ybWF0IHNwZWNpZmljIHJlc2l6ZSBvZiBQViAlcyBmYWlsZWQuIiwKKwkJCSAgIHB2X2Rldl9uYW1lKHB2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIHB2LT5wZV9jb3VudCBpcyAwIG5vdyEgV2UgbmVlZCB0byByZWNhbGN1bGF0ZSEgKi8KKworCS8qIElmIHRoZXJlJ3MgYSBWRywgY2FsY3VsYXRlIG5ldyBQRSBjb3VudCB2YWx1ZS4gKi8KKwkvKiBEb24ndCBkbyBmb3Igb3JwaGFuIFZHICovCisJaWYgKHZnICYmICFpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCS8qIEZJWE1FOiBNYXliZSBQRSBjYWxjdWxhdGlvbiBzaG91bGQgZ28gaW50byBwdi0+Zm10LT5yZXNpemU/CisJCSAgICAgICAgICAobGlrZSBpdCBpcyBmb3IgcHYtPmZtdC0+c2V0dXApICovCisJCWlmICghKG5ld19wZV9jb3VudCA9IHB2X3NpemUocHYpIC8gdmctPmV4dGVudF9zaXplKSkgeworCQkJbG9nX2Vycm9yKCJTaXplIG11c3QgbGVhdmUgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwaHlzaWNhbCAiCisJCQkJICAiZXh0ZW50IG9mICUiIFBSSXUzMiAiIHNlY3RvcnMgb24gUFYgJXMuIiwKKwkJCQkgICBwdl9wZV9zaXplKHB2KSwgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG5ld19wZV9jb3VudCA9PSBvbGRfcGVfY291bnQpIHsKKwkJCXB2LT5wZV9jb3VudCA9IG9sZF9wZV9jb3VudDsKKwkJCWxvZ192ZXJib3NlKCJObyBjaGFuZ2UgdG8gc2l6ZSBvZiBwaHlzaWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgICAgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJbG9nX3ZlcmJvc2UoIlJlc2l6aW5nIHBoeXNpY2FsIHZvbHVtZSAlcyBmcm9tICUiIFBSSXUzMgorCQkJICAgICIgdG8gJSIgUFJJdTMyICIgZXh0ZW50cy4iLAorCQkJICAgIHB2X2Rldl9uYW1lKHB2KSwgcHYtPnBlX2NvdW50LCBuZXdfcGVfY291bnQpOworCisJCWlmIChuZXdfcGVfY291bnQgPiBvbGRfcGVfY291bnQpCisJCQlyZXR1cm4gX2V4dGVuZF9wdihwdiwgdmcsIG9sZF9wZV9jb3VudCwgbmV3X3BlX2NvdW50KTsKKwkJZWxzZQorCQkJcmV0dXJuIF9yZWR1Y2VfcHYocHYsIHZnLCBvbGRfcGVfY291bnQsIG5ld19wZV9jb3VudCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBwdl9yZXNpemVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICAgIGNvbnN0IHVpbnQ2NF90IG5ld19zaXplKQoreworCXVpbnQ2NF90IHNpemUgPSAwOworCWludCByID0gMDsKKwljb25zdCBjaGFyICpwdl9uYW1lID0gcHZfZGV2X25hbWUocHYpOworCWNvbnN0IGNoYXIgKnZnX25hbWUgPSBwdi0+dmdfbmFtZTsKKwlpbnQgdmdfbmVlZHNfcHZfd3JpdGUgPSAwOworCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShwdi0+Zm10LT5mZWF0dXJlcyAmIEZNVF9SRVNJWkVfUFYpKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICVzIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IHJlc2l6aW5nLiIsCisJCQkgIHB2X25hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgbmV3IHNpemUgKi8KKwlpZiAoIWRldl9nZXRfc2l6ZShwdl9kZXYocHYpLCAmc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZ2V0IHNpemUuIiwgcHZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuZXdfc2l6ZSkgeworCQlpZiAobmV3X3NpemUgPiBzaXplKQorCQkJbG9nX3dhcm4oIldBUk5JTkc6ICVzOiBPdmVycmlkaW5nIHJlYWwgc2l6ZS4gIgorCQkJCSAgIllvdSBjb3VsZCBsb3NlIGRhdGEuIiwgcHZfbmFtZSk7CisJCWxvZ192ZXJib3NlKCIlczogUHJldGVuZGluZyBzaXplIGlzICUiIFBSSXU2NCAiIG5vdCAlIiBQUkl1NjQKKwkJCSAgICAiIHNlY3RvcnMuIiwgcHZfbmFtZSwgbmV3X3NpemUsIHB2X3NpemUocHYpKTsKKwkJc2l6ZSA9IG5ld19zaXplOworCX0KKworCWxvZ192ZXJib3NlKCJSZXNpemluZyB2b2x1bWUgXCIlc1wiIHRvICUiIFBSSXU2NCAiIHNlY3RvcnMuIiwKKwkJICAgIHB2X25hbWUsIHNpemUpOworCisJaWYgKCFwdl9yZXNpemUocHYsIHZnLCBzaXplKSkKKwkJZ290b19vdXQ7CisKKwlsb2dfdmVyYm9zZSgiVXBkYXRpbmcgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIsIHB2X25hbWUpOworCisJLyogV3JpdGUgUFYgbGFiZWwgb25seSBpZiB0aGlzIGFuIG9ycGhhbiBQViBvciBpdCBoYXMgMm5kIG1kYS4gKi8KKwlpZiAoKGlzX29ycGhhbl92Zyh2Z19uYW1lKSB8fAorCSAgICAgKHZnX25lZWRzX3B2X3dyaXRlID0gKGZpZF9nZXRfbWRhX2luZGV4ZWQodmctPmZpZCwKKwkJCShjb25zdCBjaGFyICopICZwdi0+aWQsIElEX0xFTiwgMSkgIT0gTlVMTCkpKSAmJgorCSAgICAhcHZfd3JpdGUoY21kLCBwdiwgMSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3RvcmUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIsCisJCQkgIHB2X25hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWlzX29ycGhhbl92Zyh2Z19uYW1lKSkgeworCQlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3RvcmUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBpbiAiCisJCQkJICAidm9sdW1lIGdyb3VwIFwiJXNcIiIsIHB2X25hbWUsIHZnX25hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYmFja3VwKHZnKTsKKwl9CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBjaGFuZ2VkIiwgcHZfbmFtZSk7CisJciA9IDE7CisKK291dDoKKwlpZiAoIXIgJiYgdmdfbmVlZHNfcHZfd3JpdGUpCisJCWxvZ19lcnJvcigiVXNlIHB2Y3JlYXRlIGFuZCB2Z2NmZ3Jlc3RvcmUgIgorCQkJICAidG8gcmVwYWlyIGZyb20gYXJjaGl2ZWQgbWV0YWRhdGEuIik7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBEZWNpZGUgd2hldGhlciBpdCBpcyAic2FmZSIgdG8gd2lwZSB0aGUgbGFiZWxzIG9uIHRoaXMgZGV2aWNlLgorICogMCBpbmRpY2F0ZXMgd2UgbWF5IG5vdC4KKyAqLworc3RhdGljIGludCBwdnJlbW92ZV9jaGVjayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdW5zaWduZWQgZm9yY2VfY291bnQsIHVuc2lnbmVkIHByb21wdCwgc3RydWN0IGRtX2xpc3QgKnB2c2xpc3QpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcmVhbGx5X3dpcGVfbXNnW10gPSAiUmVhbGx5IFdJUEUgTEFCRUxTIGZyb20gcGh5c2ljYWwgdm9sdW1lIjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGxhYmVsICpsYWJlbDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0gTlVMTDsKKwlpbnQgdXNlZDsKKwlpbnQgciA9IDA7CisKKwkvKiBGSVhNRSBDaGVjayBwYXJ0aXRpb24gdHlwZSBpcyBMVk0gdW5sZXNzIC0tZm9yY2UgaXMgZ2l2ZW4gKi8KKworCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQobmFtZSwgY21kLT5maWx0ZXIpKSkgeworCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQuIiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIElzIHRoZXJlIGEgcHYgaGVyZSBhbHJlYWR5PyAqLworCS8qIElmIG5vdCwgdGhpcyBpcyBhbiBlcnJvciB1bmxlc3MgeW91IHVzZWQgLWYuICovCisJaWYgKCFsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCAwKSkgeworCQlpZiAoZm9yY2VfY291bnQpCisJCQlyZXR1cm4gMTsKKwkJbG9nX2Vycm9yKCJObyBQViBsYWJlbCBmb3VuZCBvbiAlcy4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzbGlzdCkKKwkJaWYgKHB2bC0+cHYtPmRldiA9PSBkZXYpCisJCQlwdiA9IHB2bC0+cHY7CisKKwlpZiAoIXB2KSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUGh5c2ljYWwgVm9sdW1lICVzIGhhcyBhIGxhYmVsLCAiCisJCQkgICJidXQgaXMgbmVpdGhlciBpbiBhIFZHIG5vciBvcnBoYW4uIiwgbmFtZSk7CisJCWdvdG8gb3V0OyAvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCisJfQorCisJaWYgKGlzX29ycGhhbihwdikpIHsKKwkJaWYgKCh1c2VkID0gaXNfdXNlZF9wdihwdikpIDwgMCkKKwkJCWdvdG9fb3V0OworCisJCWlmICh1c2VkKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgaXMgdXNlZCBieSBhIFZHIGJ1dCBpdHMgbWV0YWRhdGEgaXMgbWlzc2luZy4iLCBuYW1lKTsKKworCQkJaWYgKGZvcmNlX2NvdW50IDwgMikKKwkJCQlnb3RvX2JhZDsKKworCQkJaWYgKCFwcm9tcHQgJiYKKwkJCSAgICB5ZXNfbm9fcHJvbXB0KCIlcyBcIiVzXCIgdGhhdCBpcyBtYXJrZWQgYXMgYmVsb25naW5nIHRvIGEgVkcgW3kvbl0/ICIsCisJCQkJCSAgcmVhbGx5X3dpcGVfbXNnLCBuYW1lKSA9PSAnbicpCisJCQkJZ290b19iYWQ7CisJCX0KKwl9IGVsc2UgeworCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgaXMgdXNlZCBieSBWRyAlcyAoY29uc2lkZXIgdXNpbmcgdmdyZWR1Y2UpLiIsIG5hbWUsIHB2X3ZnX25hbWUocHYpKTsKKworCQlpZiAoZm9yY2VfY291bnQgPCAyKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKCFwcm9tcHQgJiYKKwkJICAgIHllc19ub19wcm9tcHQoIiVzIFwiJXNcIiBvZiB2b2x1bWUgZ3JvdXAgXCIlc1wiIFt5L25dPyAiLAorCQkJCSAgcmVhbGx5X3dpcGVfbXNnLCBuYW1lLCBwdl92Z19uYW1lKHB2KSkgPT0gJ24nKQorCQkJZ290b19iYWQ7CisJfQorCisJaWYgKGZvcmNlX2NvdW50KQorCQlsb2dfd2FybigiV0FSTklORzogV2lwaW5nIHBoeXNpY2FsIHZvbHVtZSBsYWJlbCBmcm9tICIKKwkJCSAiJXMlcyVzJXMiLCBuYW1lLAorCQkJICFpc19vcnBoYW4ocHYpID8gIiBvZiB2b2x1bWUgZ3JvdXAgXCIiIDogIiIsCisJCQkgcHZfdmdfbmFtZShwdiksCisJCQkgIWlzX29ycGhhbihwdikgPyAiXCIiIDogIiIpOworCisJciA9IDE7CitiYWQ6CisJaWYgKCFyKSB7CisJCWxvZ19lcnJvcigiJXM6IHBoeXNpY2FsIHZvbHVtZSBsYWJlbCBub3QgcmVtb3ZlZC4iLCBuYW1lKTsKKworCQlpZiAoZm9yY2VfY291bnQgPCAyKSAvKiBTaG93IGhpbnQgYXMgbG9nX2Vycm9yKCkgKi8KKwkJCWxvZ19lcnJvcigiKElmIHlvdSBhcmUgY2VydGFpbiB5b3UgbmVlZCBwdnJlbW92ZSwgIgorCQkJCSAgInRoZW4gY29uZmlybSBieSB1c2luZyAtLWZvcmNlIHR3aWNlLikiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHI7Cit9CisKK2ludCBwdnJlbW92ZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnB2X25hbWUsCisJCSAgICB2b2lkICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHVuc2lnbmVkIGZvcmNlX2NvdW50LAorCSAgICAgICAgICAgIHVuc2lnbmVkIHByb21wdCwgc3RydWN0IGRtX2xpc3QgKnB2c2xpc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWludCByID0gMDsKKworCWlmICghcHZyZW1vdmVfY2hlY2soY21kLCBwdl9uYW1lLCBmb3JjZV9jb3VudCwgcHJvbXB0LCBwdnNsaXN0KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShkZXYgPSBkZXZfY2FjaGVfZ2V0KHB2X25hbWUsIGNtZC0+ZmlsdGVyKSkpIHsKKwkJbG9nX2Vycm9yKCIlczogQ291bGRuJ3QgZmluZCBkZXZpY2UuICBDaGVjayB5b3VyIGZpbHRlcnM/IiwKKwkJCSAgcHZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChkZXYtPnB2aWQsIGRldiwgMCk7CisKKwlpZiAoIWRldl90ZXN0X2V4Y2woZGV2KSkgeworCQkvKiBGSVhNRSBEZXRlY3Qgd2hldGhlciBkZXZpY2UtbWFwcGVyIGlzIHN0aWxsIHVzaW5nIHRoZSBkZXZpY2UgKi8KKwkJbG9nX2Vycm9yKCJDYW4ndCBvcGVuICVzIGV4Y2x1c2l2ZWx5IC0gbm90IHJlbW92aW5nLiAiCisJCQkgICJNb3VudGVkIGZpbGVzeXN0ZW0/IiwgZGV2X25hbWUoZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdpcGUgZXhpc3RpbmcgbGFiZWwocykgKi8KKwlpZiAoIWxhYmVsX3JlbW92ZShkZXYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwocykgb24gJXMiLCBwdl9uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGluZm8pCisJCWx2bWNhY2hlX2RlbChpbmZvKTsKKworCWlmICghbHZtZXRhZF9wdl9nb25lX2J5X2RldihkZXYpKQorCQlnb3RvX291dDsKKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJMYWJlbHMgb24gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBzdWNjZXNzZnVsbHkgd2lwZWQiLAorCQkJCXB2X25hbWUpOworCisJciA9IDE7CisKK291dDoKKwlyZXR1cm4gcjsKK30KKworaW50IHB2cmVtb3ZlX21hbnkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpwdl9uYW1lcywKKwkJICB1bnNpZ25lZCBmb3JjZV9jb3VudCwgdW5zaWduZWQgcHJvbXB0KQoreworCWludCByZXQgPSAxOworCXN0cnVjdCBkbV9saXN0ICpwdnNsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCWNvbnN0IHN0cnVjdCBkbV9zdHJfbGlzdCAqcHZfbmFtZTsKKworCWlmICghbG9ja192b2woY21kLCBWR19PUlBIQU5TLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgZ2V0IGxvY2sgZm9yIG9ycGhhbiBQVnMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHZtY2FjaGVfc2VlZF9pbmZvc19mcm9tX2x2bWV0YWQoY21kKTsKKworCWlmICghKHB2c2xpc3QgPSBnZXRfcHZzKGNtZCkpKSB7CisJCXJldCA9IDA7CisJCWdvdG9fb3V0OworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdl9uYW1lLCBwdl9uYW1lcykgeworCQlpZiAoIXB2cmVtb3ZlX3NpbmdsZShjbWQsIHB2X25hbWUtPnN0ciwgTlVMTCwgZm9yY2VfY291bnQsIHByb21wdCwgcHZzbGlzdCkpIHsKKwkJCXN0YWNrOworCQkJcmV0ID0gMDsKKwkJfQorCQlpZiAoc2lnaW50X2NhdWdodCgpKSB7CisJCQlyZXQgPSAwOworCQkJZ290b19vdXQ7CisJCX0KKwl9CisKK291dDoKKwl1bmxvY2tfdmcoY21kLCBOVUxMLCBWR19PUlBIQU5TKTsKKworCWlmIChwdnNsaXN0KQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwdnNsaXN0KQorCQkJZnJlZV9wdl9maWQocHZsLT5wdik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL3B2X21hcC5jIGIvbGliL21ldGFkYXRhL3B2X21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDc2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvcHZfbWFwLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAicHZfbWFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyoKKyAqIEFyZWFzIGFyZSBtYWludGFpbmVkIGluIHNpemUgb3JkZXIsIGxhcmdlc3QgZmlyc3QuCisgKgorICogRklYTUUgQ29wZSB3aXRoIG92ZXJsYXAuCisgKi8KK3N0YXRpYyB2b2lkIF9pbnNlcnRfYXJlYShzdHJ1Y3QgZG1fbGlzdCAqaGVhZCwgc3RydWN0IHB2X2FyZWEgKmEsIHVuc2lnbmVkIHJlZHVjZWQpCit7CisJc3RydWN0IHB2X2FyZWEgKnB2YTsKKwl1aW50MzJfdCBjb3VudCA9IHJlZHVjZWQgPyBhLT51bnJlc2VydmVkIDogYS0+Y291bnQ7CisJCQorCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmEsIGhlYWQpCisJCWlmIChjb3VudCA+IHB2YS0+Y291bnQpCisJCQlicmVhazsKKworCWRtX2xpc3RfYWRkKCZwdmEtPmxpc3QsICZhLT5saXN0KTsKKwlhLT5tYXAtPnBlX2NvdW50ICs9IGEtPmNvdW50OworfQorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2FyZWEoc3RydWN0IHB2X2FyZWEgKmEpCit7CisJZG1fbGlzdF9kZWwoJmEtPmxpc3QpOworCWEtPm1hcC0+cGVfY291bnQgLT0gYS0+Y291bnQ7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9zaW5nbGVfYXJlYShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgcHZfbWFwICpwdm0sCisJCQkgICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcHZfYXJlYSAqcHZhOworCisJaWYgKCEocHZhID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnB2YSkpKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWdfYWxsb2MoIkFsbG93aW5nIGFsbG9jYXRpb24gb24gJXMgc3RhcnQgUEUgJSIgUFJJdTMyICIgbGVuZ3RoICUiCisJCQlQUkl1MzIsIHB2X2Rldl9uYW1lKHB2bS0+cHYpLCBzdGFydCwgbGVuZ3RoKTsKKwlwdmEtPm1hcCA9IHB2bTsKKwlwdmEtPnN0YXJ0ID0gc3RhcnQ7CisJcHZhLT5jb3VudCA9IGxlbmd0aDsKKwlwdmEtPnVucmVzZXJ2ZWQgPSBwdmEtPmNvdW50OworCV9pbnNlcnRfYXJlYSgmcHZtLT5hcmVhcywgcHZhLCAwKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jcmVhdGVfYWxsb2NfYXJlYXNfZm9yX3B2KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBwdl9tYXAgKnB2bSwKKwkJCQkgICAgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgY291bnQpCit7CisJc3RydWN0IHB2X3NlZ21lbnQgKnBlZzsKKwl1aW50MzJfdCBwZSwgZW5kLCBhcmVhX2xlbjsKKworCS8qIE9ubHkgc2VsZWN0IGV4dGVudHMgZnJvbSBzdGFydCB0byBlbmQgaW5jbHVzaXZlICovCisJZW5kID0gc3RhcnQgKyBjb3VudCAtIDE7CisJaWYgKGVuZCA+IHB2bS0+cHYtPnBlX2NvdW50IC0gMSkKKwkJZW5kID0gcHZtLT5wdi0+cGVfY291bnQgLSAxOworCisJcGUgPSBzdGFydDsKKworCS8qIFdhbGsgdGhyb3VnaCBjb21wbGV0ZSBvcmRlcmVkIGxpc3Qgb2YgZGV2aWNlIHNlZ21lbnRzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBlZywgJnB2bS0+cHYtPnNlZ21lbnRzKSB7CisJCS8qIHBlIGhvbGRzIHRoZSBuZXh0IGV4dGVudCB3ZSB3YW50IHRvIGNoZWNrICovCisKKwkJLyogQmV5b25kIHRoZSByYW5nZSB3ZSdyZSBpbnRlcmVzdGVkIGluPyAqLworCQlpZiAocGUgPiBlbmQpCisJCQlicmVhazsKKworCQkvKiBTa2lwIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZmlyc3Qgc2VnIHdlIHdhbnQgeWV0ICovCisJCWlmIChwZSA+IHBlZy0+cGUgKyBwZWctPmxlbiAtIDEpCisJCQljb250aW51ZTsKKworCQkvKiBGcmVlPyAqLworCQlpZiAocGVnLT5sdnNlZykKKwkJCWdvdG8gbmV4dDsKKworCQkvKiBIb3cgbXVjaCBvZiB0aGlzIHBlZyBkbyB3ZSBuZWVkPyAqLworCQlhcmVhX2xlbiA9IChlbmQgPj0gcGVnLT5wZSArIHBlZy0+bGVuIC0gMSkgPworCQkJICAgcGVnLT5sZW4gLSAocGUgLSBwZWctPnBlKSA6IGVuZCAtIHBlICsgMTsKKworCQlpZiAoIV9jcmVhdGVfc2luZ2xlX2FyZWEobWVtLCBwdm0sIHBlLCBhcmVhX2xlbikpCisJCQlyZXR1cm5fMDsKKworICAgICAgbmV4dDoKKwkJcGUgPSBwZWctPnBlICsgcGVnLT5sZW47CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9hbGxfYXJlYXNfZm9yX3B2KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBwdl9tYXAgKnB2bSwKKwkJCQkgICAgc3RydWN0IGRtX2xpc3QgKnBlX3JhbmdlcykKK3sKKwlzdHJ1Y3QgcGVfcmFuZ2UgKmFhOworCisJaWYgKCFwZV9yYW5nZXMpIHsKKwkJLyogVXNlIHdob2xlIFBWICovCisJCWlmICghX2NyZWF0ZV9hbGxvY19hcmVhc19mb3JfcHYobWVtLCBwdm0sIFVJTlQzMl9DKDApLAorCQkJCQkJcHZtLT5wdi0+cGVfY291bnQpKQorCQkJcmV0dXJuXzA7CisKKwkJcmV0dXJuIDE7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFhLCBwZV9yYW5nZXMpIHsKKwkJaWYgKCFfY3JlYXRlX2FsbG9jX2FyZWFzX2Zvcl9wdihtZW0sIHB2bSwgYWEtPnN0YXJ0LAorCQkJCQkJYWEtPmNvdW50KSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jcmVhdGVfbWFwcyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqcHZzLCBzdHJ1Y3QgZG1fbGlzdCAqcHZtcykKK3sKKwlzdHJ1Y3QgcHZfbWFwICpwdm0sICpwdm0yOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwdnMpIHsKKwkJaWYgKCEocHZsLT5wdi0+c3RhdHVzICYgQUxMT0NBVEFCTEVfUFYpIHx8CisJCSAgICAocHZsLT5wdi0+c3RhdHVzICYgUFZfQUxMT0NBVElPTl9QUk9ISUJJVEVEKSkgeworCQkgICAgCXB2bC0+cHYtPnN0YXR1cyAmPSB+UFZfQUxMT0NBVElPTl9QUk9ISUJJVEVEOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlzX21pc3NpbmdfcHYocHZsLT5wdikpCisJCQljb250aW51ZTsKKwkJYXNzZXJ0KHB2bC0+cHYtPmRldik7CisKKwkJcHZtID0gTlVMTDsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZtMiwgcHZtcykKKwkJCWlmIChwdm0yLT5wdi0+ZGV2ID09IHB2bC0+cHYtPmRldikgeworCQkJCXB2bSA9IHB2bTI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKCFwdm0pIHsKKwkJCWlmICghKHB2bSA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpwdm0pKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCXB2bS0+cHYgPSBwdmwtPnB2OworCQkJZG1fbGlzdF9pbml0KCZwdm0tPmFyZWFzKTsKKwkJCWRtX2xpc3RfYWRkKHB2bXMsICZwdm0tPmxpc3QpOworCQl9CisKKwkJaWYgKCFfY3JlYXRlX2FsbF9hcmVhc19mb3JfcHYobWVtLCBwdm0sIHB2bC0+cGVfcmFuZ2VzKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQ3JlYXRlIGxpc3Qgb2YgUFYgYXJlYXMgYXZhaWxhYmxlIGZvciB0aGlzIHBhcnRpY3VsYXIgYWxsb2NhdGlvbgorICovCitzdHJ1Y3QgZG1fbGlzdCAqY3JlYXRlX3B2X21hcHMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRhYmxlX3B2cykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZtczsKKworCWlmICghKHB2bXMgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcHZtcykpKSkgeworCQlsb2dfZXJyb3IoImNyZWF0ZV9wdl9tYXBzIGFsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2luaXQocHZtcyk7CisKKwlpZiAoIV9jcmVhdGVfbWFwcyhtZW0sIGFsbG9jYXRhYmxlX3B2cywgcHZtcykpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgcGh5c2ljYWwgdm9sdW1lIG1hcHMgaW4gJXMiLAorCQkJICB2Zy0+bmFtZSk7CisJCWRtX3Bvb2xfZnJlZShtZW0sIHB2bXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcHZtczsKK30KKwordm9pZCBjb25zdW1lX3B2X2FyZWEoc3RydWN0IHB2X2FyZWEgKnB2YSwgdWludDMyX3QgdG9fZ28pCit7CisJX3JlbW92ZV9hcmVhKHB2YSk7CisKKwlhc3NlcnQodG9fZ28gPD0gcHZhLT5jb3VudCk7CisKKwlpZiAodG9fZ28gPCBwdmEtPmNvdW50KSB7CisJCS8qIHNwbGl0IHRoZSBhcmVhICovCisJCXB2YS0+c3RhcnQgKz0gdG9fZ287CisJCXB2YS0+Y291bnQgLT0gdG9fZ287CisJCXB2YS0+dW5yZXNlcnZlZCA9IHB2YS0+Y291bnQ7CisJCV9pbnNlcnRfYXJlYSgmcHZhLT5tYXAtPmFyZWFzLCBwdmEsIDApOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBhbiBhcmVhIGZyb20gbGlzdCBhbmQgcmVpbnNlcnQgaXQgYmFzZWQgb24gaXRzIG5ldyBzaXplCisgKiBhZnRlciBhIHByb3Zpc2lvbmFsIGFsbG9jYXRpb24gKG9yIHJldmVydGluZyBvbmUpLgorICovCit2b2lkIHJlaW5zZXJ0X2NoYW5nZWRfcHZfYXJlYShzdHJ1Y3QgcHZfYXJlYSAqcHZhKQoreworCV9yZW1vdmVfYXJlYShwdmEpOworCV9pbnNlcnRfYXJlYSgmcHZhLT5tYXAtPmFyZWFzLCBwdmEsIDEpOworfQorCit1aW50MzJfdCBwdl9tYXBzX3NpemUoc3RydWN0IGRtX2xpc3QgKnB2bXMpCit7CisJc3RydWN0IHB2X21hcCAqcHZtOworCXVpbnQzMl90IHBlX2NvdW50ID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdm0sIHB2bXMpCisJCXBlX2NvdW50ICs9IHB2bS0+cGVfY291bnQ7CisKKwlyZXR1cm4gcGVfY291bnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvcHZfbWFwLmggYi9saWIvbWV0YWRhdGEvcHZfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmMjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tZXRhZGF0YS9wdl9tYXAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1BWX01BUF9ICisjZGVmaW5lIF9MVk1fUFZfTUFQX0gKKworI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKKy8qCisgKiBUaGUgaW4gY29yZSByZXAuIG9ubHkgc3RvcmVzIGEgbWFwcGluZyBmcm9tCisgKiBsb2dpY2FsIGV4dGVudHMgdG8gcGh5c2ljYWwgZXh0ZW50cyBhZ2FpbnN0IGFuCisgKiBsdi4gIFNvbWV0aW1lcywgd2hlbiBhbGxvY2F0aW5nIGEgbmV3IGx2IGZvcgorICogaW5zdGFuY2UsIGl0IGlzIHVzZWZ1bCB0byBoYXZlIHRoZSBpbnZlcnNlCisgKiBtYXBwaW5nIGF2YWlsYWJsZS4KKyAqLworCitzdHJ1Y3QgcHZfYXJlYSB7CisJc3RydWN0IHB2X21hcCAqbWFwOworCXVpbnQzMl90IHN0YXJ0OworCXVpbnQzMl90IGNvdW50OworCisJLyogTnVtYmVyIG9mIGV4dGVudHMgdW5yZXNlcnZlZCBkdXJpbmcgYSBzaW5nbGUgYWxsb2NhdGlvbiBwYXNzLiAqLworCXVpbnQzMl90IHVucmVzZXJ2ZWQ7CisKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OwkJLyogcHZfbWFwLmFyZWFzICovCit9OworCisvKgorICogV2hlbiBidWlsZGluZyB1cCBhIHBvdGVudGlhbCBncm91cCBvZiAicGFyYWxsZWwiIGV4dGVudCByYW5nZXMgZHVyaW5nCisgKiBhbiBhbGxvY2F0aW9uIGF0dGVtcHQsIHRyYWNrIHRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnRzIHRoYXQgbWF5CisgKiBuZWVkIHRvIGJlIHVzZWQgYXMgYSBwYXJ0aWN1bGFyIHBhcmFsbGVsIGFyZWEuICBTZXZlcmFsIG9mIHRoZXNlCisgKiBzdHJ1Y3RzIG1heSByZWZlcmVuY2UgdGhlIHNhbWUgcHZfYXJlYSwgYnV0ICd1c2VkJyBtYXkgZGlmZmVyIGJldHdlZW4KKyAqIHRoZW0uICBUaGUgc3VtIG9mIGFsbCB0aGUgJ3VzZWQnIHZhcmlhYmxlcyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKKyAqIHB2X2FyZWEgbWF5IG5vdCBleGNlZWQgdGhhdCBhcmVhJ3MgY291bnQsIHNvIHdlIGNhbm5vdCBhbGxvY2F0ZSB0aGUKKyAqIHNhbWUgZXh0ZW50cyB0d2ljZS4KKyAqLworc3RydWN0IHB2X2FyZWFfdXNlZCB7CisJc3RydWN0IHB2X2FyZWEgKnB2YTsKKwl1aW50MzJfdCB1c2VkOworfTsKKworc3RydWN0IHB2X21hcCB7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGRtX2xpc3QgYXJlYXM7CQkvKiBzdHJ1Y3QgcHZfYXJlYXMgKi8KKwl1aW50MzJfdCBwZV9jb3VudDsJCS8qIFRvdGFsIG51bWJlciBvZiBQRXMgKi8KKworCXN0cnVjdCBkbV9saXN0IGxpc3Q7Cit9OworCisvKgorICogRmluZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiBhdmFpbGFibGVfcHZzIGFuZCBmcmVlIHNwYWNlIGluIFZHCisgKi8KK3N0cnVjdCBkbV9saXN0ICpjcmVhdGVfcHZfbWFwcyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGFibGVfcHZzKTsKKwordm9pZCBjb25zdW1lX3B2X2FyZWEoc3RydWN0IHB2X2FyZWEgKmFyZWEsIHVpbnQzMl90IHRvX2dvKTsKK3ZvaWQgcmVpbnNlcnRfY2hhbmdlZF9wdl9hcmVhKHN0cnVjdCBwdl9hcmVhICpwdmEpOworCit1aW50MzJfdCBwdl9tYXBzX3NpemUoc3RydWN0IGRtX2xpc3QgKnB2bXMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9tZXRhZGF0YS9yYWlkX21hbmlwLmMgYi9saWIvbWV0YWRhdGEvcmFpZF9tYW5pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzc0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvcmFpZF9tYW5pcC5jCkBAIC0wLDAgKzEsMzI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJhcmNoaXZlci5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAibHZfYWxsb2MuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisKK3N0YXRpYyBpbnQgX2NoZWNrX3Jlc3RyaXBpbmcodWludDMyX3QgbmV3X3N0cmlwZXMsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKG5ld19zdHJpcGVzICYmIG5ld19zdHJpcGVzICE9IGZpcnN0X3NlZyhsdiktPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgcmVzdHJpcGUgTFYgJXMgZnJvbSAlIiBQUkl1MzIgIiB0byAldSBzdHJpcGVzIGR1cmluZyBjb252ZXJzaW9uLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgZmlyc3Rfc2VnKGx2KS0+YXJlYV9jb3VudCwgbmV3X3N0cmlwZXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2hlY2sgdGhhdCBhbGwgbHYgaGFzIHNlZ21lbnRzIGhhdmUgZXhhY3RseSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGFyZWFzICovCitzdGF0aWMgaW50IF9jaGVja19udW1fYXJlYXNfaW5fbHZfc2VnbWVudHMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdW5zaWduZWQgbnVtX2FyZWFzKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKQorCQlpZiAoc2VnLT5hcmVhX2NvdW50ICE9IG51bV9hcmVhcykgeworCQkJbG9nX2Vycm9yKCJGb3IgdGhpcyBvcGVyYXRpb24gTFYgJXMgbmVlZHMgZXhhY3RseSAldSBkYXRhIGFyZWFzIHBlciBzZWdtZW50LiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdiksIG51bV9hcmVhcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEVuc3VyZSByZWdpb24gc2l6ZSBleGNlZWRzIHRoZSBtaW5pbXVtIGZvciBsdiAqLworc3RhdGljIHZvaWQgX2Vuc3VyZV9taW5fcmVnaW9uX3NpemUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwl1aW50MzJfdCBtaW5fcmVnaW9uX3NpemUsIHJlZ2lvbl9zaXplOworCisJLyogTUQncyBiaXRtYXAgaXMgbGltaXRlZCB0byB0cmFja2luZyAyXjIxIHJlZ2lvbnMgKi8KKwltaW5fcmVnaW9uX3NpemUgPSBsdi0+c2l6ZSAvICgxIDw8IDIxKTsKKwlyZWdpb25fc2l6ZSA9IHNlZy0+cmVnaW9uX3NpemU7CisKKwl3aGlsZSAocmVnaW9uX3NpemUgPCBtaW5fcmVnaW9uX3NpemUpCisJCXJlZ2lvbl9zaXplICo9IDI7CisKKwlpZiAoc2VnLT5yZWdpb25fc2l6ZSAhPSByZWdpb25fc2l6ZSkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nIHJlZ2lvbl9zaXplIHRvICV1IGZvciAlcyIsIHNlZy0+cmVnaW9uX3NpemUsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXNlZy0+cmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZTsKKwl9Cit9CisKKy8qCisgKiBDaGVjayBmb3IgbWF4aW11bSBudW1iZXIgb2YgcmFpZCBkZXZpY2VzLgorICogQ29uc3RyYWluZWQgYnkga2VybmVsIE1EIG1heGltdW0gZGV2aWNlIGxpbWl0cyBfYW5kXyBkbS1yYWlkIHN1cGVyYmxvY2sKKyAqIGJpdGZpZWxkIGNvbnN0cmFpbnRzLgorICovCitzdGF0aWMgaW50IF9jaGVja19tYXhfcmFpZF9kZXZpY2VzKHVpbnQzMl90IGltYWdlX2NvdW50KQoreworCWlmIChpbWFnZV9jb3VudCA+IERFRkFVTFRfUkFJRF9NQVhfSU1BR0VTKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGhhbmRsZSByYWlkIGFycmF5cyB3aXRoIG1vcmUgdGhhbiAldSBkZXZpY2VzIiwKKwkJCSAgREVGQVVMVF9SQUlEX01BWF9JTUFHRVMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfbWF4X21pcnJvcl9kZXZpY2VzKHVpbnQzMl90IGltYWdlX2NvdW50KQoreworCWlmIChpbWFnZV9jb3VudCA+IERFRkFVTFRfTUlSUk9SX01BWF9JTUFHRVMpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gaGFuZGxlIG1pcnJvcnMgd2l0aCBtb3JlIHRoYW4gJXUgZGV2aWNlcyIsCisJCQkgIERFRkFVTFRfTUlSUk9SX01BWF9JTUFHRVMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpeCB1cCBMViByZWdpb25fc2l6ZSBpZiBub3QgeWV0IHNldC4KKyAqLworLyogRklYTUUgQ2hlY2sgdGhpcyBoYXBwZW5zIGV4YWN0bHkgb25jZSBhdCB0aGUgcmlnaHQgcGxhY2UuICovCitzdGF0aWMgdm9pZCBfY2hlY2tfYW5kX2FkanVzdF9yZWdpb25fc2l6ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCisJc2VnLT5yZWdpb25fc2l6ZSA9IHNlZy0+cmVnaW9uX3NpemUgPyA6IGdldF9kZWZhdWx0X3JlZ2lvbl9zaXplKGx2LT52Zy0+Y21kKTsKKworCXJldHVybiBfZW5zdXJlX21pbl9yZWdpb25fc2l6ZShsdik7Cit9CisKK3N0YXRpYyBpbnQgX2x2X2lzX3JhaWRfd2l0aF90cmFja2luZyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqdHJhY2tpbmcpCit7CisJdWludDMyX3QgczsKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCSp0cmFja2luZyA9IE5VTEw7CisKKwlpZiAoIShsdi0+c3RhdHVzICYgUkFJRCkpCisJCXJldHVybiAwOworCisJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQlpZiAobHZfaXNfdmlzaWJsZShzZWdfbHYoc2VnLCBzKSkgJiYKKwkJICAgICEoc2VnX2x2KHNlZywgcyktPnN0YXR1cyAmIExWTV9XUklURSkpCisJCQkqdHJhY2tpbmcgPSBzZWdfbHYoc2VnLCBzKTsKKworCXJldHVybiAqdHJhY2tpbmcgPyAxIDogMDsKK30KKworaW50IGx2X2lzX3JhaWRfd2l0aF90cmFja2luZyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqdHJhY2tpbmc7CisKKwlyZXR1cm4gX2x2X2lzX3JhaWRfd2l0aF90cmFja2luZyhsdiwgJnRyYWNraW5nKTsKK30KKwordWludDMyX3QgbHZfcmFpZF9pbWFnZV9jb3VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCisJaWYgKCFzZWdfaXNfcmFpZChzZWcpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBzZWctPmFyZWFfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgX2FjdGl2YXRlX3N1Ymx2X3ByZXNlcnZpbmdfZXhjbChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnRvcF9sdiwKKwkJCQkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzdWJfbHYpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSB0b3BfbHYtPnZnLT5jbWQ7CisKKwkvKiBJZiB0b3AgUkFJRCB3YXMgRVgsIHVzZSBFWCAqLworCWlmIChsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkodG9wX2x2KSkgeworCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBzdWJfbHYpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIHsKKwkJaWYgKCFhY3RpdmF0ZV9sdihjbWQsIHN1Yl9sdikpCisJCQlyZXR1cm5fMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2F2b2lkX3B2c19vZl9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMgPSAoc3RydWN0IGRtX2xpc3QgKikgZGF0YTsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgYWxsb2NhdGVfcHZzKQorCQlpZiAoIWx2X2lzX3BhcnRpYWwobHYpICYmIGx2X2lzX29uX3B2KGx2LCBwdmwtPnB2KSkKKwkJCXB2bC0+cHYtPnN0YXR1cyB8PSBQVl9BTExPQ0FUSU9OX1BST0hJQklURUQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFByZXZlbnQgYW55IFBWcyBob2xkaW5nIG90aGVyIGltYWdlIGNvbXBvbmVudHMgb2YgQGx2IGZyb20gYmVpbmcgdXNlZCBmb3IgYWxsb2NhdGlvbgorICogYnkgc2V0dGluZyB0aGUgaW50ZXJuYWwgUFZfQUxMT0NBVElPTl9QUk9ISUJJVEVEIGZsYWcgdG8gdXNlIGl0IHRvIGF2b2lkIGdlbmVyYXRpbmcKKyAqIHB2IG1hcHMgZm9yIHRob3NlIFBWcy4KKyAqLworc3RhdGljIGludCBfYXZvaWRfcHZzX3dpdGhfb3RoZXJfaW1hZ2VzX29mX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMpCit7CisJcmV0dXJuIGZvcl9lYWNoX3N1Yl9sdihsdiwgX2F2b2lkX3B2c19vZl9sdiwgYWxsb2NhdGVfcHZzKTsKK30KKworc3RhdGljIHZvaWQgX2NsZWFyX2FsbG9jYXRpb25fcHJvaGliaXRlZChzdHJ1Y3QgZG1fbGlzdCAqcHZzKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlpZiAocHZzKQorCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwdnMpCisJCQlwdmwtPnB2LT5zdGF0dXMgJj0gflBWX0FMTE9DQVRJT05fUFJPSElCSVRFRDsKK30KKworLyoKKyAqIF9yYWlkX2luX3N5bmMKKyAqIEBsdgorICoKKyAqIF9yYWlkX2luX3N5bmMgd29ya3MgZm9yIGFsbCB0eXBlcyBvZiBSQUlEIHNlZ3R5cGVzLCBhcyB3ZWxsCisgKiBhcyAnbWlycm9yJyBzZWd0eXBlLiAgKFRoaXMgaXMgYmVjYXVzZSAnbHZfcmFpZF9wZXJjZW50JyBpcworICogc2ltcGx5IGEgd3JhcHBlciBhcm91bmQgJ2x2X21pcnJvcl9wZXJjZW50Jy4KKyAqCisgKiBSZXR1cm5zOiAxIGlmIGluLXN5bmMsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IF9yYWlkX2luX3N5bmMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlkbV9wZXJjZW50X3Qgc3luY19wZXJjZW50OworCisJaWYgKHNlZ19pc19zdHJpcGVkKGZpcnN0X3NlZyhsdikpKQorCQlyZXR1cm4gMTsKKworCWlmICghbHZfcmFpZF9wZXJjZW50KGx2LCAmc3luY19wZXJjZW50KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZXRlcm1pbmUgc3luYyBzdGF0dXMgb2YgJXMvJXMuIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3luY19wZXJjZW50ID09IERNX1BFUkNFTlRfMCkgeworCQkvKgorCQkgKiBGSVhNRSBXZSByZXBlYXQgdGhlIHN0YXR1cyByZWFkIGhlcmUgdG8gd29ya2Fyb3VuZCBhbgorCQkgKiB1bnJlc29sdmVkIGtlcm5lbCBidWcgd2hlbiB3ZSBzZWUgMCBldmVuIHRob3VnaCB0aGUKKwkJICogdGhlIGFycmF5IGlzIDEwMCUgaW4gc3luYy4KKwkJICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzEyMTA2MzcKKwkJICovCisJCWlmICghbHZfcmFpZF9wZXJjZW50KGx2LCAmc3luY19wZXJjZW50KSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHN5bmMgc3RhdHVzIG9mICVzLyVzLiIsCisJCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzeW5jX3BlcmNlbnQgPT0gRE1fUEVSQ0VOVF8xMDApCisJCQlsb2dfd2FybigiV0FSTklORzogU3luYyBzdGF0dXMgZm9yICVzIGlzIGluY29uc2lzdGVudC4iLAorCQkJCSBkaXNwbGF5X2x2bmFtZShsdikpOworCX0KKworCXJldHVybiAoc3luY19wZXJjZW50ID09IERNX1BFUkNFTlRfMTAwKSA/IDEgOiAwOworfQorCisvKgorICogX3JhaWRfcmVtb3ZlX3RvcF9sYXllcgorICogQGx2CisgKiBAcmVtb3ZhbF9sdnMKKyAqCisgKiBSZW1vdmUgdG9wIGxheWVyIG9mIFJBSUQgTFYgaW4gb3JkZXIgdG8gY29udmVydCB0byBsaW5lYXIuCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIG9uLWRpc2sgY2hhbmdlcy4gIFRoZSByZXNpZHVhbCBMVnMKKyAqIHJldHVybmVkIGluICdyZW1vdmFsX2x2cycgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzLCAwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfcmFpZF9yZW1vdmVfdG9wX2xheWVyKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhbF9sdnMpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bF9hcnJheSwgKmx2bDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCWlmICghc2VnX2lzX21pcnJvcmVkKHNlZykpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJVbmFibGUgdG8gcmVtb3ZlIFJBSUQgbGF5ZXIgZnJvbSBzZWdtZW50IHR5cGUgJXMiLAorCQkJICBsdnNlZ19uYW1lKHNlZykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2VnLT5hcmVhX2NvdW50ICE9IDEpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJVbmFibGUgdG8gcmVtb3ZlIFJBSUQgbGF5ZXIgd2hlbiB0aGVyZSIKKwkJCSAgIiBpcyBtb3JlIHRoYW4gb25lIHN1Yi1sdiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShsdmxfYXJyYXkgPSBkbV9wb29sX2FsbG9jKGx2LT52Zy0+dmdtZW0sIDIgKiBzaXplb2YoKmx2bCkpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgbGFzdCBtZXRhZGF0YSBhcmVhIHRvIHJlbW92YWxfbHZzICovCisJbHZsX2FycmF5WzBdLmx2ID0gc2VnX21ldGFsdihzZWcsIDApOworCWx2X3NldF92aXNpYmxlKHNlZ19tZXRhbHYoc2VnLCAwKSk7CisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KHNlZ19tZXRhbHYoc2VnLCAwKSwgc2VnKSkKKwkJcmV0dXJuXzA7CisJc2VnX21ldGF0eXBlKHNlZywgMCkgPSBBUkVBX1VOQVNTSUdORUQ7CisJZG1fbGlzdF9hZGQocmVtb3ZhbF9sdnMsICYobHZsX2FycmF5WzBdLmxpc3QpKTsKKworCS8qIFJlbW92ZSBSQUlEIGxheWVyIGFuZCBhZGQgcmVzaWR1YWwgTFYgdG8gcmVtb3ZhbF9sdnMqLworCXNlZ19sdihzZWcsIDApLT5zdGF0dXMgJj0gflJBSURfSU1BR0U7CisJbHZfc2V0X3Zpc2libGUoc2VnX2x2KHNlZywgMCkpOworCWx2bF9hcnJheVsxXS5sdiA9IHNlZ19sdihzZWcsIDApOworCWRtX2xpc3RfYWRkKHJlbW92YWxfbHZzLCAmKGx2bF9hcnJheVsxXS5saXN0KSk7CisKKwlpZiAoIXJlbW92ZV9sYXllcl9mcm9tX2x2KGx2LCBzZWdfbHYoc2VnLCAwKSkpCisJCXJldHVybl8wOworCisJbHYtPnN0YXR1cyAmPSB+KE1JUlJPUkVEIHwgUkFJRCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIF9jbGVhcl9sdgorICogQGx2CisgKgorICogSWYgTFYgaXMgYWN0aXZlOgorICoJY2xlYXIgZmlyc3QgYmxvY2sgb2YgZGV2aWNlCisgKiBvdGhlcndpc2U6CisgKglhY3RpdmF0ZSwgY2xlYXIsIGRlYWN0aXZhdGUKKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9jbGVhcl9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWludCB3YXNfYWN0aXZlID0gbHZfaXNfYWN0aXZlX2xvY2FsbHkobHYpOworCisJaWYgKHRlc3RfbW9kZSgpKQorCQlyZXR1cm4gMTsKKworCWx2LT5zdGF0dXMgfD0gTFZfVEVNUE9SQVJZOworCWlmICghd2FzX2FjdGl2ZSAmJiAhYWN0aXZhdGVfbHZfbG9jYWwobHYtPnZnLT5jbWQsIGx2KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSBsb2NhbHkgJXMgZm9yIGNsZWFyaW5nIiwKKwkJCSAgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJbHYtPnN0YXR1cyAmPSB+TFZfVEVNUE9SQVJZOworCisJbG9nX3ZlcmJvc2UoIkNsZWFyaW5nIG1ldGFkYXRhIGFyZWEgb2YgJXMvJXMiLAorCQkgICAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJLyoKKwkgKiBSYXRoZXIgdGhhbiB3aXBpbmcgbHYtPnNpemUsIHdlIGNhbiBzaW1wbHkKKwkgKiB3aXBlIHRoZSBmaXJzdCBzZWN0b3IgdG8gcmVtb3ZlIHRoZSBzdXBlcmJsb2NrIG9mIGFueSBwcmV2aW91cworCSAqIFJBSUQgZGV2aWNlcy4gIEl0IGlzIG11Y2ggcXVpY2tlci4KKwkgKi8KKwlpZiAoIXdpcGVfbHYobHYsIChzdHJ1Y3Qgd2lwZV9wYXJhbXMpIHsgLmRvX3plcm8gPSAxLCAuemVyb19zZWN0b3JzID0gMSB9KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB6ZXJvICVzIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXdhc19hY3RpdmUgJiYgIWRlYWN0aXZhdGVfbHYobHYtPnZnLT5jbWQsIGx2KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlICVzIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogTWFrZXMgb24tZGlzayBtZXRhZGF0YSBjaGFuZ2VzICovCitzdGF0aWMgaW50IF9jbGVhcl9sdnMoc3RydWN0IGRtX2xpc3QgKmx2X2xpc3QpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IE5VTEw7CisKKwlpZiAoZG1fbGlzdF9lbXB0eShsdl9saXN0KSkgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoSU5URVJOQUxfRVJST1IgIkVtcHR5IGxpc3Qgb2YgTFZzIGdpdmVuIGZvciBjbGVhcmluZyIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsdl9saXN0KSB7CisJCWlmICghbHZfaXNfdmlzaWJsZShsdmwtPmx2KSkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkJICAiTFZzIG11c3QgYmUgc2V0IHZpc2libGUgYmVmb3JlIGNsZWFyaW5nIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl2ZyA9IGx2bC0+bHYtPnZnOworCX0KKworCS8qCisJICogRklYTUU6IG9ubHkgdmdfW3dyaXRlfGNvbW1pdF0gaWYgTFZzIGFyZSBub3QgYWxyZWFkeSB3cml0dGVuCisJICogYXMgdmlzaWJsZSBpbiB0aGUgTFZNIG1ldGFkYXRhICh3aGljaCBpcyBuZXZlciB0aGUgY2FzZSB5ZXQpLgorCSAqLworCWlmICghdmcgfHwgIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsdl9saXN0KQorCQlpZiAoIV9jbGVhcl9sdihsdmwtPmx2KSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfc2hpZnRfYW5kX3JlbmFtZV9pbWFnZV9jb21wb25lbnRzCisgKiBAc2VnOiBUb3AtbGV2ZWwgUkFJRCBzZWdtZW50CisgKgorICogU2hpZnQgYWxsIGhpZ2hlciBpbmRleGVkIHNlZ21lbnQgYXJlYXMgZG93biB0byBmaWxsIGluIGdhcHMgd2hlcmUKKyAqIHRoZXJlIGFyZSAnQVJFQV9VTkFTU0lHTkVEJyBhcmVhcyBhbmQgcmVuYW1lIGRhdGEvbWV0YWRhdGEgTFZzIHNvCisgKiB0aGF0IHRoZWlyIG5hbWVzIG1hdGNoIHRoZWlyIG5ldyBpbmRleC4gIFdoZW4gZmluaXNoZWQsIHNldAorICogc2VnLT5hcmVhX2NvdW50IHRvIG5ldyByZWR1Y2VkIHRvdGFsLgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX3NoaWZ0X2FuZF9yZW5hbWVfaW1hZ2VfY29tcG9uZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCWludCBsZW47CisJY2hhciAqc2hpZnRfbmFtZTsKKwl1aW50MzJfdCBzLCBtaXNzaW5nOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gc2VnLT5sdi0+dmctPmNtZDsKKworCS8qCisJICogQWxsIExWcyBtdXN0IGJlIHByb3Blcmx5IG5hbWVkIGZvciB0aGVpciBpbmRleCBiZWZvcmUKKwkgKiBzaGlmdGluZyBiZWdpbnMuICAoZS5nLiAgSW5kZXggJzAnIG11c3QgY29udGFpbiAqX3JpbWFnZV8wIGFuZAorCSAqICpfcm1ldGFfMC4gIEluZGV4ICduJyBtdXN0IGNvbnRhaW4gKl9yaW1hZ2VfbiBhbmQgKl9ybWV0YV9uLikKKwkgKi8KKworCWlmICghc2VnX2lzX3JhaWQoc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoc2VnLT5hcmVhX2NvdW50ID4gMTApIHsKKwkJLyoKKwkJICogRklYTUU6IEhhbmRsaW5nIG1vcmUgd291bGQgbWVhbiBJJ2QgaGF2ZQorCQkgKiB0byBoYW5kbGUgZG91YmxlIGRpZ2l0cworCQkgKi8KKwkJbG9nX2Vycm9yKCJVbmFibGUgaGFuZGxlIGFycmF5cyB3aXRoIG1vcmUgdGhhbiAxMCBkZXZpY2VzIik7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlNoaWZ0aW5nIGltYWdlcyBpbiAlcyIsIHNlZy0+bHYtPm5hbWUpOworCisJZm9yIChzID0gMCwgbWlzc2luZyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSA9PSBBUkVBX1VOQVNTSUdORUQpIHsKKwkJCWlmIChzZWdfbWV0YXR5cGUoc2VnLCBzKSAhPSBBUkVBX1VOQVNTSUdORUQpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1ldGFkYXRhIHNlZ21lbnQgYXJlYSIKKwkJCQkJICAiICMlZCBzaG91bGQgYmUgQVJFQV9VTkFTU0lHTkVEIiwgcyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltaXNzaW5nKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW1pc3NpbmcpCisJCQljb250aW51ZTsKKworCQlsb2dfdmVyeV92ZXJib3NlKCJTaGlmdGluZyAlcyBhbmQgJXMgYnkgJXUiLAorCQkJCSBzZWdfbWV0YWx2KHNlZywgcyktPm5hbWUsCisJCQkJIHNlZ19sdihzZWcsIHMpLT5uYW1lLCBtaXNzaW5nKTsKKworCQkvKiBBbHRlciBybWV0YSBuYW1lICovCisJCXNoaWZ0X25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgc2VnX21ldGFsdihzZWcsIHMpLT5uYW1lKTsKKwkJaWYgKCFzaGlmdF9uYW1lKSB7CisJCQlsb2dfZXJyb3IoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxlbiA9IHN0cmxlbihzaGlmdF9uYW1lKSAtIDE7CisJCXNoaWZ0X25hbWVbbGVuXSAtPSBtaXNzaW5nOworCQlzZWdfbWV0YWx2KHNlZywgcyktPm5hbWUgPSBzaGlmdF9uYW1lOworCisJCS8qIEFsdGVyIHJpbWFnZSBuYW1lICovCisJCXNoaWZ0X25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgc2VnX2x2KHNlZywgcyktPm5hbWUpOworCQlpZiAoIXNoaWZ0X25hbWUpIHsKKwkJCWxvZ19lcnJvcigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGVuID0gc3RybGVuKHNoaWZ0X25hbWUpIC0gMTsKKwkJc2hpZnRfbmFtZVtsZW5dIC09IG1pc3Npbmc7CisJCXNlZ19sdihzZWcsIHMpLT5uYW1lID0gc2hpZnRfbmFtZTsKKworCQlzZWctPmFyZWFzW3MgLSBtaXNzaW5nXSA9IHNlZy0+YXJlYXNbc107CisJCXNlZy0+bWV0YV9hcmVhc1tzIC0gbWlzc2luZ10gPSBzZWctPm1ldGFfYXJlYXNbc107CisJfQorCisJc2VnLT5hcmVhX2NvdW50IC09IG1pc3Npbmc7CisJcmV0dXJuIDE7Cit9CisKKy8qIEdlbmVyYXRlIHJhaWQgc3Vidm9sdW1lIG5hbWUgYW5kIHZhbGlkYXRlIGl0ICovCitzdGF0aWMgY2hhciAqX2dlbmVyYXRlX3JhaWRfbmFtZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBjb25zdCBjaGFyICpzdWZmaXgsIGludCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpmb3JtYXQgPSAoY291bnQgPj0gMCkgPyAiJXNfJXNfJXUiIDogIiVzXyVzIjsKKwlzaXplX3QgbGVuID0gc3RybGVuKGx2LT5uYW1lKSArIHN0cmxlbihzdWZmaXgpICsgKChjb3VudCA+PSAwKSA/IDUgOiAyKTsKKwljaGFyICpuYW1lOworCWludCBoaXN0b3JpY2FsOworCisJaWYgKCEobmFtZSA9IGRtX3Bvb2xfYWxsb2MobHYtPnZnLT52Z21lbSwgbGVuKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IG5hbWUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbV9zbnByaW50ZihuYW1lLCBsZW4sIGZvcm1hdCwgbHYtPm5hbWUsIHN1ZmZpeCwgY291bnQpIDwgMCkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAoIXZhbGlkYXRlX25hbWUobmFtZSkpIHsKKwkJbG9nX2Vycm9yKCJOZXcgbG9naWNhbCB2b2x1bWUgbmFtZSBcIiVzXCIgaXMgbm90IHZhbGlkLiIsIG5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobHZfbmFtZV9pc191c2VkX2luX3ZnKGx2LT52ZywgbmFtZSwgJmhpc3RvcmljYWwpKSB7CisJCWxvZ19lcnJvcigiJXNMb2dpY2FsIFZvbHVtZSAlcyBhbHJlYWR5IGV4aXN0cyBpbiB2b2x1bWUgZ3JvdXAgJXMuIiwKKwkJCSAgaGlzdG9yaWNhbCA/ICJoaXN0b3JpY2FsICIgOiAiIiwgbmFtZSwgbHYtPnZnLT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisvKgorICogQ3JlYXRlIGFuIExWIG9mIHNwZWNpZmllZCB0eXBlLiAgU2V0IHZpc2libGUgYWZ0ZXIgY3JlYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1ha2UgbWV0YWRhdGEgY2hhbmdlcy4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqX2FsbG9jX2ltYWdlX2NvbXBvbmVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkJICAgICBjb25zdCBjaGFyICphbHRfYmFzZV9uYW1lLAorCQkJCQkJICAgICBzdHJ1Y3QgYWxsb2NfaGFuZGxlICphaCwgdWludDMyX3QgZmlyc3RfYXJlYSwKKwkJCQkJCSAgICAgdWludDY0X3QgdHlwZSkKK3sKKwl1aW50NjRfdCBzdGF0dXM7CisJY2hhciBpbWdfbmFtZVtOQU1FX0xFTl07CisJY29uc3QgY2hhciAqdHlwZV9zdWZmaXg7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICp0bXBfbHY7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUkFJRF9NRVRBOgorCQl0eXBlX3N1ZmZpeCA9ICJybWV0YSI7CisJCWJyZWFrOworCWNhc2UgUkFJRF9JTUFHRToKKwkJdHlwZV9zdWZmaXggPSAicmltYWdlIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJCYWQgdHlwZSBwcm92aWRlZCB0byBfYWxsb2NfcmFpZF9jb21wb25lbnQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihpbWdfbmFtZSwgc2l6ZW9mKGltZ19uYW1lKSwgIiVzXyVzXyUlZCIsCisJCQkoYWx0X2Jhc2VfbmFtZSkgPyA6IGx2LT5uYW1lLCB0eXBlX3N1ZmZpeCkgPCAwKSB7CisJCWxvZ19lcnJvcigiQ29tcG9uZW50IG5hbWUgZm9yIHJhaWQgJXMgaXMgdG9vIGxvbmcuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGF0dXMgPSBMVk1fUkVBRCB8IExWTV9XUklURSB8IExWX1JFQlVJTEQgfCB0eXBlOworCWlmICghKHRtcF9sdiA9IGx2X2NyZWF0ZV9lbXB0eShpbWdfbmFtZSwgTlVMTCwgc3RhdHVzLCBBTExPQ19JTkhFUklULCBsdi0+dmcpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcmFpZCBjb21wb25lbnQsICVzLiIsIGltZ19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFoKSB7CisJCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIWx2X2FkZF9zZWdtZW50KGFoLCBmaXJzdF9hcmVhLCAxLCB0bXBfbHYsIHNlZ3R5cGUsIDAsIHN0YXR1cywgMCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCBzZWdtZW50IHRvIExWLCAlcyIsIGltZ19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJbHZfc2V0X3Zpc2libGUodG1wX2x2KTsKKworCXJldHVybiB0bXBfbHY7Cit9CisKK3N0YXRpYyBpbnQgX2FsbG9jX2ltYWdlX2NvbXBvbmVudHMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqcHZzLCB1aW50MzJfdCBjb3VudCwKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqbmV3X21ldGFfbHZzLAorCQkJCSAgIHN0cnVjdCBkbV9saXN0ICpuZXdfZGF0YV9sdnMpCit7CisJdWludDMyX3QgczsKKwl1aW50MzJfdCByZWdpb25fc2l6ZTsKKwl1aW50MzJfdCBleHRlbnRzOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWggPSBOVUxMOworCXN0cnVjdCBkbV9saXN0ICpwYXJhbGxlbF9hcmVhczsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsX2FycmF5OworCisJaWYgKCEobHZsX2FycmF5ID0gZG1fcG9vbF9hbGxvYyhsdi0+dmctPnZnbWVtLAorCQkJCQlzaXplb2YoKmx2bF9hcnJheSkgKiBjb3VudCAqIDIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShwYXJhbGxlbF9hcmVhcyA9IGJ1aWxkX3BhcmFsbGVsX2FyZWFzX2Zyb21fbHYobHYsIDAsIDEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoc2VnX2lzX2xpbmVhcihzZWcpKQorCQlyZWdpb25fc2l6ZSA9IGdldF9kZWZhdWx0X3JlZ2lvbl9zaXplKGx2LT52Zy0+Y21kKTsKKwllbHNlCisJCXJlZ2lvbl9zaXplID0gc2VnLT5yZWdpb25fc2l6ZTsKKworCWlmIChzZWdfaXNfcmFpZChzZWcpKQorCQlzZWd0eXBlID0gc2VnLT5zZWd0eXBlOworCWVsc2UgaWYgKCEoc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGx2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX1JBSUQxKSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIGV4dGVudHMgaXMgYmFzZWQgb24gdGhlIFJBSUQgdHlwZS4gIEZvciBSQUlEMSwKKwkgKiBlYWNoIG9mIHRoZSByaW1hZ2VzIGlzIHRoZSBzYW1lIHNpemUgLSAnbGVfY291bnQnLiAgSG93ZXZlcgorCSAqIGZvciBSQUlEIDQvNS82LCB0aGUgc3RyaXBlcyBhZGQgdG9nZXRoZXIgKE5PVCBpbmNsdWRpbmcgdGhlIHBhcml0eQorCSAqIGRldmljZXMpIHRvIGVxdWFsICdsZV9jb3VudCcuICBUaHVzLCB3aGVuIHdlIGFyZSBhbGxvY2F0aW5nCisJICogaW5kaXZpZHVhbCBkZXZpZXMsIHdlIG11c3Qgc3BlY2lmeSBob3cgbGFyZ2UgdGhlIGluZGl2aWR1YWwgZGV2aWNlCisJICogaXMgYWxvbmcgd2l0aCB0aGUgbnVtYmVyIHdlIHdhbnQgKCdjb3VudCcpLgorCSAqLworCWlmIChzZWd0eXBlX2lzX3JhaWQxMChzZWd0eXBlKSkgeworCQlpZiAoc2VnLT5hcmVhX2NvdW50IDwgMikgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBuZWVkcyBhdCBsZWFzdCAyIGFyZWFzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZXh0ZW50cyA9IGx2LT5sZV9jb3VudCAvIChzZWctPmFyZWFfY291bnQgLyAyKTsgLyogd2UgZW5mb3JjZSAyIG1pcnJvcnMgcmlnaHQgbm93ICovCisJfSBlbHNlCisJCWV4dGVudHMgPSAoc2VndHlwZS0+cGFyaXR5X2RldnMpID8KKwkJCSAgIChsdi0+bGVfY291bnQgLyAoc2VnLT5hcmVhX2NvdW50IC0gc2VndHlwZS0+cGFyaXR5X2RldnMpKSA6CisJCQkgICBsdi0+bGVfY291bnQ7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFueSBleHRlbnRzPyAqLworCWlmIChwdnMgJiYgIWRtX2xpc3RfZW1wdHkocHZzKSAmJgorCSAgICAhKGFoID0gYWxsb2NhdGVfZXh0ZW50cyhsdi0+dmcsIE5VTEwsIHNlZ3R5cGUsIDAsIGNvdW50LCBjb3VudCwKKwkJCQkgICAgcmVnaW9uX3NpemUsIGV4dGVudHMsIHB2cywKKwkJCQkgICAgbHYtPmFsbG9jLCAwLCBwYXJhbGxlbF9hcmVhcykpKQorCQlyZXR1cm5fMDsKKworCWZvciAocyA9IDA7IHMgPCBjb3VudDsgKytzKSB7CisJCS8qCisJCSAqIFRoZSBhbGxvY2F0aW9uIGFyZWFzIGFyZSBncm91cGVkIHRvZ2V0aGVyLiAgRmlyc3QKKwkJICogY29tZSB0aGUgcmltYWdlIGFsbG9jYXRlZCBhcmVhcywgdGhlbiBjb21lIHRoZSBtZXRhZGF0YQorCQkgKiBhbGxvY2F0ZWQgYXJlYXMuICBUaHVzLCB0aGUgbWV0YWRhdGEgYXJlYXMgYXJlIHB1bGxlZAorCQkgKiBmcm9tICdzICsgY291bnQnLgorCQkgKi8KKworCQkvKiBuZXdfbWV0YV9sdnMgYXJlIG9wdGlvbmFsIGZvciByYWlkMCAqLworCQlpZiAobmV3X21ldGFfbHZzKSB7CisJCQlpZiAoIShsdmxfYXJyYXlbcyArIGNvdW50XS5sdiA9CisJCQkgICAgICBfYWxsb2NfaW1hZ2VfY29tcG9uZW50KGx2LCBOVUxMLCBhaCwgcyArIGNvdW50LCBSQUlEX01FVEEpKSkgeworCQkJCWFsbG9jX2Rlc3Ryb3koYWgpOworCQkJCXJldHVybl8wOworCQkJfQorCQkJZG1fbGlzdF9hZGQobmV3X21ldGFfbHZzLCAmKGx2bF9hcnJheVtzICsgY291bnRdLmxpc3QpKTsKKwkJfQorCisJCWlmIChuZXdfZGF0YV9sdnMpIHsKKwkJCWlmICghKGx2bF9hcnJheVtzXS5sdiA9CisJCQkgICAgICBfYWxsb2NfaW1hZ2VfY29tcG9uZW50KGx2LCBOVUxMLCBhaCwgcywgUkFJRF9JTUFHRSkpKSB7CisJCQkJYWxsb2NfZGVzdHJveShhaCk7CisJCQkJcmV0dXJuXzA7CisJCQl9CisJCQlkbV9saXN0X2FkZChuZXdfZGF0YV9sdnMsICYobHZsX2FycmF5W3NdLmxpc3QpKTsKKwkJfQorCX0KKworCWFsbG9jX2Rlc3Ryb3koYWgpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfYWxsb2Nfcm1ldGFfZm9yX2x2CisgKiBAbHYKKyAqCisgKiBBbGxvY2F0ZSBhIFJBSUQgbWV0YWRhdGEgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gTFYgKHdoaWNoIGlzIG9yIHdpbGwKKyAqIGJlIHRoZSBhc3NvY2lhdGVkIFJBSUQgZGF0YSBkZXZpY2UpLiAgVGhlIG5ldyBtZXRhZGF0YSBkZXZpY2UgbXVzdAorICogYmUgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgUFYocykgYXMgdGhlIGRhdGEgZGV2aWNlLgorICovCitzdGF0aWMgaW50IF9hbGxvY19ybWV0YV9mb3JfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpkYXRhX2x2LAorCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKm1ldGFfbHYsCisJCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCBhbGxvY2F0YWJsZV9wdnM7CisJc3RydWN0IGFsbG9jX2hhbmRsZSAqYWg7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhkYXRhX2x2KTsKKwljaGFyICpwLCBiYXNlX25hbWVbTkFNRV9MRU5dOworCisJZG1fbGlzdF9pbml0KCZhbGxvY2F0YWJsZV9wdnMpOworCisJaWYgKCFhbGxvY2F0ZV9wdnMpCisJCWFsbG9jYXRlX3B2cyA9ICZhbGxvY2F0YWJsZV9wdnM7CisKKwlpZiAoIXNlZ19pc19saW5lYXIoc2VnKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuYWJsZSB0byBhbGxvY2F0ZSBSQUlEIG1ldGFkYXRhICIKKwkJCSAgImFyZWEgZm9yIG5vbi1saW5lYXIgTFYsICVzIiwgZGF0YV9sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCSh2b2lkKSBkbV9zdHJuY3B5KGJhc2VfbmFtZSwgZGF0YV9sdi0+bmFtZSwgc2l6ZW9mKGJhc2VfbmFtZSkpOworCWlmICgocCA9IHN0cnN0cihiYXNlX25hbWUsICJfbWltYWdlXyIpKSkKKwkJKnAgPSAnXDAnOworCisJaWYgKCFnZXRfcHZfbGlzdF9mb3JfbHYoZGF0YV9sdi0+dmctPmNtZC0+bWVtLAorCQkJCWRhdGFfbHYsICZhbGxvY2F0YWJsZV9wdnMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIGxpc3Qgb2YgUFZzIGZvciAlcy8lcyIsCisJCQkgIGRhdGFfbHYtPnZnLT5uYW1lLCBkYXRhX2x2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoYWggPSBhbGxvY2F0ZV9leHRlbnRzKGRhdGFfbHYtPnZnLCBOVUxMLCBzZWctPnNlZ3R5cGUsIDAsIDEsIDAsCisJCQkJICAgIHNlZy0+cmVnaW9uX3NpemUsCisJCQkJICAgIDEgLypSQUlEX01FVEFEQVRBX0FSRUFfTEVOKi8sCisJCQkJICAgICZhbGxvY2F0YWJsZV9wdnMsIGRhdGFfbHYtPmFsbG9jLCAwLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoKm1ldGFfbHYgPSBfYWxsb2NfaW1hZ2VfY29tcG9uZW50KGRhdGFfbHYsIGJhc2VfbmFtZSwgYWgsIDAsIFJBSURfTUVUQSkpKSB7CisJCWFsbG9jX2Rlc3Ryb3koYWgpOworCQlyZXR1cm5fMDsKKwl9CisKKwlhbGxvY19kZXN0cm95KGFoKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yYWlkX2FkZF9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICB1aW50MzJfdCBuZXdfY291bnQsIHN0cnVjdCBkbV9saXN0ICpwdnMpCit7CisJaW50IHJlYnVpbGRfZmxhZ19jbGVhcmVkID0gMDsKKwl1aW50MzJfdCBzOworCXVpbnQzMl90IG9sZF9jb3VudCA9IGx2X3JhaWRfaW1hZ2VfY291bnQobHYpOworCXVpbnQzMl90IGNvdW50ID0gbmV3X2NvdW50IC0gb2xkX2NvdW50OworCXVpbnQ2NF90IHN0YXR1c19tYXNrID0gLTE7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisJc3RydWN0IGRtX2xpc3QgbWV0YV9sdnMsIGRhdGFfbHZzOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGx2X3NlZ21lbnRfYXJlYSAqbmV3X2FyZWFzOworCisJaWYgKGx2X2lzX25vdF9zeW5jZWQobHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgYWRkIGltYWdlIHRvIG91dC1vZi1zeW5jIFJBSUQgTFY6IgorCQkJICAiIHVzZSAnbHZjaGFuZ2UgLS1yZXN5bmMnIGZpcnN0LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9yYWlkX2luX3N5bmMobHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgYWRkIGltYWdlIHRvIFJBSUQgTFYgdGhhdCIKKwkJCSAgIiBpcyBzdGlsbCBpbml0aWFsaXppbmcuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaW5pdCgmbWV0YV9sdnMpOyAvKiBGb3IgaW1hZ2UgYWRkaXRpb24gKi8KKwlkbV9saXN0X2luaXQoJmRhdGFfbHZzKTsgLyogRm9yIGltYWdlIGFkZGl0aW9uICovCisKKwkvKgorCSAqIElmIHRoZSBzZWd0eXBlIGlzIGxpbmVhciwgdGhlbiB3ZSBtdXN0IGFsbG9jYXRlIGEgbWV0YWRhdGEKKwkgKiBMViB0byBhY2NvbXBhbnkgaXQuCisJICovCisJaWYgKHNlZ19pc19saW5lYXIoc2VnKSkgeworCQkvKiBBIGNvbXBsZXRlIHJlc3luYyB3aWxsIGJlIGRvbmUsIG5vIG5lZWQgdG8gbWFyayBlYWNoIHN1Yi1sdiAqLworCQlzdGF0dXNfbWFzayA9IH4oTFZfUkVCVUlMRCk7CisKKwkJaWYgKCEobHZsID0gZG1fcG9vbF9hbGxvYyhsdi0+dmctPnZnbWVtLCBzaXplb2YoKmx2bCkpKSkgeworCQkJbG9nX2Vycm9yKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFfYWxsb2Nfcm1ldGFfZm9yX2x2KGx2LCAmbHZsLT5sdiwgTlVMTCkpCisJCQlyZXR1cm5fMDsKKworCQlkbV9saXN0X2FkZCgmbWV0YV9sdnMsICZsdmwtPmxpc3QpOworCX0gZWxzZSBpZiAoIXNlZ19pc19yYWlkKHNlZykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWRkIFJBSUQgaW1hZ2VzIHRvICVzIG9mIHNlZ21lbnQgdHlwZSAlcyIsCisJCQkgIGx2LT5uYW1lLCBsdnNlZ19uYW1lKHNlZykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9hbGxvY19pbWFnZV9jb21wb25lbnRzKGx2LCBwdnMsIGNvdW50LCAmbWV0YV9sdnMsICZkYXRhX2x2cykpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBJZiBsaW5lYXIsIHdlIG11c3QgY29ycmVjdCBkYXRhIExWIG5hbWVzLiAgVGhleSBhcmUgb2ZmLWJ5LW9uZQorCSAqIGJlY2F1c2UgdGhlIGxpbmVhciB2b2x1bWUgaGFzbid0IHRha2VuIGl0cyBwcm9wZXIgbmFtZSBvZiAiX3JpbWFnZV8wIgorCSAqIHlldC4gIFRoaXMgYWN0aW9uIG11c3QgYmUgZG9uZSBiZWZvcmUgJ19jbGVhcl9sdnMnIGJlY2F1c2UgaXQKKwkgKiBjb21taXRzIHRoZSBMVk0gbWV0YWRhdGEgYmVmb3JlIGNsZWFyaW5nIHRoZSBMVnMuCisJICovCisJaWYgKHNlZ19pc19saW5lYXIoc2VnKSkgeworCQlzdHJ1Y3QgZG1fbGlzdCAqbDsKKwkJc3RydWN0IGx2X2xpc3QgKmx2bF90bXA7CisKKwkJZG1fbGlzdF9pdGVyYXRlKGwsICZkYXRhX2x2cykgeworCQkJaWYgKGwgPT0gZG1fbGlzdF9sYXN0KCZkYXRhX2x2cykpIHsKKwkJCQlsdmwgPSBkbV9saXN0X2l0ZW0obCwgc3RydWN0IGx2X2xpc3QpOworCQkJCWlmICghKGx2bC0+bHYtPm5hbWUgPSBfZ2VuZXJhdGVfcmFpZF9uYW1lKGx2LCAicmltYWdlIiwgY291bnQpKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsdmwgPSBkbV9saXN0X2l0ZW0obCwgc3RydWN0IGx2X2xpc3QpOworCQkJbHZsX3RtcCA9IGRtX2xpc3RfaXRlbShsLT5uLCBzdHJ1Y3QgbHZfbGlzdCk7CisJCQlsdmwtPmx2LT5uYW1lID0gbHZsX3RtcC0+bHYtPm5hbWU7CisJCX0KKwl9CisKKwkvKiBNZXRhZGF0YSBMVnMgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSBiZWluZyBhZGRlZCB0byB0aGUgYXJyYXkgKi8KKwlpZiAoIV9jbGVhcl9sdnMoJm1ldGFfbHZzKSkKKwkJZ290byBmYWlsOworCisJaWYgKHNlZ19pc19saW5lYXIoc2VnKSkgeworCQlmaXJzdF9zZWcobHYpLT5zdGF0dXMgfD0gUkFJRF9JTUFHRTsKKwkJaWYgKCFpbnNlcnRfbGF5ZXJfZm9yX2x2KGx2LT52Zy0+Y21kLCBsdiwKKwkJCQkJIFJBSUQgfCBMVk1fUkVBRCB8IExWTV9XUklURSwKKwkJCQkJICJfcmltYWdlXzAiKSkKKwkJCXJldHVybl8wOworCisJCWx2LT5zdGF0dXMgfD0gUkFJRDsKKwkJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwkJc2VnX2x2KHNlZywgMCktPnN0YXR1cyB8PSBSQUlEX0lNQUdFIHwgTFZNX1JFQUQgfCBMVk1fV1JJVEU7CisJCXNlZy0+cmVnaW9uX3NpemUgPSBnZXRfZGVmYXVsdF9yZWdpb25fc2l6ZShsdi0+dmctPmNtZCk7CisKKwkJLyogTUQncyBiaXRtYXAgaXMgbGltaXRlZCB0byB0cmFja2luZyAyXjIxIHJlZ2lvbnMgKi8KKwkJd2hpbGUgKHNlZy0+cmVnaW9uX3NpemUgPCAobHYtPnNpemUgLyAoMSA8PCAyMSkpKSB7CisJCQlzZWctPnJlZ2lvbl9zaXplICo9IDI7CisJCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nIFJBSUQxIHJlZ2lvbl9zaXplIHRvICV1UyIsCisJCQkJCSBzZWctPnJlZ2lvbl9zaXplKTsKKwkJfQorCQlpZiAoIShzZWctPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9SQUlEMSkpKQorCQkJcmV0dXJuXzA7CisJfQorLyoKK0ZJWE1FOiBJdCB3b3VsZCBiZSBwcm9wZXIgdG8gYWN0aXZhdGUgdGhlIG5ldyBMVnMgaGVyZSwgaW5zdGVhZCBvZiBoYXZpbmcKK3RoZW0gYWN0aXZhdGVkIGJ5IHRoZSBzdXNwZW5kLiAgSG93ZXZlciwgdGhpcyBjYXVzZXMgcmVzaWR1YWwgZGV2aWNlIG5vZGVzCit0byBiZSBsZWZ0IGZvciB0aGVzZSBzdWItbHZzLgorCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZtZXRhX2x2cykKKwkJaWYgKCFkb19jb3JyZWN0X2FjdGl2YXRlKGx2LCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZkYXRhX2x2cykKKwkJaWYgKCFkb19jb3JyZWN0X2FjdGl2YXRlKGx2LCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworKi8KKwkvKiBFeHBhbmQgYXJlYXMgYXJyYXkgKi8KKwlpZiAoIShuZXdfYXJlYXMgPSBkbV9wb29sX3phbGxvYyhsdi0+dmctPmNtZC0+bWVtLAorCQkJCQkgbmV3X2NvdW50ICogc2l6ZW9mKCpuZXdfYXJlYXMpKSkpIHsKKwkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIG5ldyBhcmVhcyBmYWlsZWQuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJbWVtY3B5KG5ld19hcmVhcywgc2VnLT5hcmVhcywgc2VnLT5hcmVhX2NvdW50ICogc2l6ZW9mKCpzZWctPmFyZWFzKSk7CisJc2VnLT5hcmVhcyA9IG5ld19hcmVhczsKKworCS8qIEV4cGFuZCBtZXRhX2FyZWFzIGFycmF5ICovCisJaWYgKCEobmV3X2FyZWFzID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT5jbWQtPm1lbSwKKwkJCQkJIG5ld19jb3VudCAqIHNpemVvZigqbmV3X2FyZWFzKSkpKSB7CisJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBuZXcgbWV0YSBhcmVhcyBmYWlsZWQuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHNlZy0+bWV0YV9hcmVhcykKKwkJbWVtY3B5KG5ld19hcmVhcywgc2VnLT5tZXRhX2FyZWFzLAorCQkgICAgICAgc2VnLT5hcmVhX2NvdW50ICogc2l6ZW9mKCpzZWctPm1ldGFfYXJlYXMpKTsKKwlzZWctPm1ldGFfYXJlYXMgPSBuZXdfYXJlYXM7CisJc2VnLT5hcmVhX2NvdW50ID0gbmV3X2NvdW50OworCisJLyogQWRkIGV4dHJhIG1ldGEgYXJlYSB3aGVuIGNvbnZlcnRpbmcgZnJvbSBsaW5lYXIgKi8KKwlzID0gKG9sZF9jb3VudCA9PSAxKSA/IDAgOiBvbGRfY291bnQ7CisKKwkvKiBTZXQgc2VnbWVudCBhcmVhcyBmb3IgbWV0YWRhdGEgc3ViX2x2cyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZtZXRhX2x2cykgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIkFkZGluZyAlcyB0byAlcyIsCisJCQkJICAgbHZsLT5sdi0+bmFtZSwgbHYtPm5hbWUpOworCQlsdmwtPmx2LT5zdGF0dXMgJj0gc3RhdHVzX21hc2s7CisJCWZpcnN0X3NlZyhsdmwtPmx2KS0+c3RhdHVzICY9IHN0YXR1c19tYXNrOworCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYoc2VnLCBzLCBsdmwtPmx2LCAwLAorCQkJCQkgICAgbHZsLT5sdi0+c3RhdHVzKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkICVzIHRvICVzIiwKKwkJCQkgIGx2bC0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlzKys7CisJfQorCisJcyA9IG9sZF9jb3VudDsKKworCS8qIFNldCBzZWdtZW50IGFyZWFzIGZvciBkYXRhIHN1Yl9sdnMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmZGF0YV9sdnMpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBZGRpbmcgJXMgdG8gJXMiLAorCQkJCSAgIGx2bC0+bHYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJbHZsLT5sdi0+c3RhdHVzICY9IHN0YXR1c19tYXNrOworCQlmaXJzdF9zZWcobHZsLT5sdiktPnN0YXR1cyAmPSBzdGF0dXNfbWFzazsKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KHNlZywgcywgbHZsLT5sdiwgMCwKKwkJCQkJICAgIGx2bC0+bHYtPnN0YXR1cykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCAlcyB0byAlcyIsCisJCQkJICBsdmwtPmx2LT5uYW1lLCBsdi0+bmFtZSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcysrOworCX0KKworCS8qCisJICogRklYTUU6IEZhaWx1cmUgaGFuZGxpbmcgZHVyaW5nIHRoZXNlIHBvaW50cyBpcyBoYXJkZXIuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJm1ldGFfbHZzKQorCQlsdl9zZXRfaGlkZGVuKGx2bC0+bHYpOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZkYXRhX2x2cykKKwkJbHZfc2V0X2hpZGRlbihsdmwtPmx2KTsKKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogTm93IHRoYXQgdGhlICdSRUJVSUxEJyBoYXMgbWFkZSBpdHMgd2F5IHRvIHRoZSBrZXJuZWwsIHdlIG11c3QKKwkgKiByZW1vdmUgdGhlIGZsYWcgc28gdGhhdCB0aGUgaW5kaXZpZHVhbCBkZXZpY2VzIGFyZSBub3QgcmVidWlsdAorCSAqIHVwb24gZXZlcnkgYWN0aXZhdGlvbi4KKwkgKi8KKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlpZiAoKHNlZ19sdihzZWcsIHMpLT5zdGF0dXMgJiBMVl9SRUJVSUxEKSB8fAorCQkgICAgKHNlZ19tZXRhbHYoc2VnLCBzKS0+c3RhdHVzICYgTFZfUkVCVUlMRCkpIHsKKwkJCXNlZ19tZXRhbHYoc2VnLCBzKS0+c3RhdHVzICY9IH5MVl9SRUJVSUxEOworCQkJc2VnX2x2KHNlZywgcyktPnN0YXR1cyAmPSB+TFZfUkVCVUlMRDsKKwkJCXJlYnVpbGRfZmxhZ19jbGVhcmVkID0gMTsKKwkJfQorCX0KKwlpZiAocmVidWlsZF9mbGFnX2NsZWFyZWQpIHsKKwkJaWYgKCF2Z193cml0ZShsdi0+dmcpIHx8ICF2Z19jb21taXQobHYtPnZnKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY2xlYXIgUkVCVUlMRCBmbGFnIGZvciAlcy8lcyBjb21wb25lbnRzIiwKKwkJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmFja3VwKGx2LT52Zyk7CisJfQorCisJcmV0dXJuIDE7CisKK2ZhaWw6CisJLyogQ2xlYW5seSByZW1vdmUgbmV3bHktYWxsb2NhdGVkIExWcyB0aGF0IGZhaWxlZCBpbnNlcnRpb24gYXR0ZW1wdCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZtZXRhX2x2cykKKwkJaWYgKCFsdl9yZW1vdmUobHZsLT5sdikpCisJCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZkYXRhX2x2cykKKwkJaWYgKCFsdl9yZW1vdmUobHZsLT5sdikpCisJCQlyZXR1cm5fMDsKKworCXJldHVybiAwOworfQorCisvKgorICogX2V4dHJhY3RfaW1hZ2VfY29tcG9uZW50cworICogQHNlZworICogQGlkeDogIFRoZSBpbmRleCBpbiB0aGUgYXJlYXMgYXJyYXkgdG8gcmVtb3ZlCisgKiBAZXh0cmFjdGVkX3JtZXRhOiAgVGhlIGRpc3BsYWNlZCBtZXRhZGF0YSBMVgorICogQGV4dHJhY3RlZF9yaW1hZ2U6ICBUaGUgZGlzcGxhY2VkIGRhdGEgTFYKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBpbWFnZSBjb21wb25lbnRzIC0gc2V0dGluZyB0aGUgcmVzcGVjdGl2ZQorICogJ2V4dHJhY3RlZCcgcG9pbnRlcnMuICBJdCBhcHBlbmRzICdfZXh0cmFjdGVkJyB0byB0aGUgTFZzJyBuYW1lcywgc28gdGhhdAorICogdGhlcmUgYXJlIG5vdCBmdXR1cmUgY29uZmxpY3RzLiAgSXQgZG9lcyAvbm90LyBjb21taXQgdGhlIHJlc3VsdHMuCisgKiAoSU9XLCBlcnJvcmluZy1vdXQgcmVxdWlyZXMgbm8gdW53aW5kaW5nIG9mIG9wZXJhdGlvbnMuKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyAvbm90LyBhdHRlbXB0IHRvOgorICogICAgMSkgc2hpZnQgdGhlICdhcmVhcycgb3IgJ21ldGFfYXJlYXMnIGFycmF5cy4KKyAqICAgICAgIFRoZSAnW21ldGFfXWFyZWFzJyBhcmUgbGVmdCBhcyBBUkVBX1VOQVNTSUdORUQuCisgKiAgICAyKSBBZGp1c3QgdGhlIHNlZy0+YXJlYV9jb3VudAorICogICAgMykgTmFtZSB0aGUgZXh0cmFjdGVkIExWcyBhcHByb3ByaWF0ZWx5IChhcHBlbmRzICdfZXh0cmFjdGVkJyB0byBuYW1lcykKKyAqIFRoZXNlIGFjdGlvbnMgbXVzdCBiZSBwZXJmb3JtZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IF9leHRyYWN0X2ltYWdlX2NvbXBvbmVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgaWR4LAorCQkJCSAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqZXh0cmFjdGVkX3JtZXRhLAorCQkJCSAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICoqZXh0cmFjdGVkX3JpbWFnZSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmRhdGFfbHYgPSBzZWdfbHYoc2VnLCBpZHgpOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWV0YV9sdiA9IHNlZ19tZXRhbHYoc2VnLCBpZHgpOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiRXh0cmFjdGluZyBpbWFnZSBjb21wb25lbnRzICVzIGFuZCAlcyBmcm9tICVzIiwKKwkJCSBkYXRhX2x2LT5uYW1lLCBtZXRhX2x2LT5uYW1lLCBzZWctPmx2LT5uYW1lKTsKKworCWRhdGFfbHYtPnN0YXR1cyAmPSB+UkFJRF9JTUFHRTsKKwltZXRhX2x2LT5zdGF0dXMgJj0gflJBSURfTUVUQTsKKwlsdl9zZXRfdmlzaWJsZShkYXRhX2x2KTsKKwlsdl9zZXRfdmlzaWJsZShtZXRhX2x2KTsKKworCS8qIHJlbGVhc2UgcmVtb3ZlcyBkYXRhIGFuZCBtZXRhIGFyZWFzICovCisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGRhdGFfbHYsIHNlZykgfHwKKwkgICAgIXJlbW92ZV9zZWdfZnJvbV9zZWdzX3VzaW5nX3RoaXNfbHYobWV0YV9sdiwgc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlzZWdfdHlwZShzZWcsIGlkeCkgPSBBUkVBX1VOQVNTSUdORUQ7CisJc2VnX21ldGF0eXBlKHNlZywgaWR4KSA9IEFSRUFfVU5BU1NJR05FRDsKKworCWlmICghKGRhdGFfbHYtPm5hbWUgPSBfZ2VuZXJhdGVfcmFpZF9uYW1lKGRhdGFfbHYsICJfZXh0cmFjdGVkIiwgLTEpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShtZXRhX2x2LT5uYW1lID0gX2dlbmVyYXRlX3JhaWRfbmFtZShtZXRhX2x2LCAiX2V4dHJhY3RlZCIsIC0xKSkpCisJCXJldHVybl8wOworCisJKmV4dHJhY3RlZF9ybWV0YSA9IG1ldGFfbHY7CisJKmV4dHJhY3RlZF9yaW1hZ2UgPSBkYXRhX2x2OworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfcmFpZF9leHRyYWN0X2ltYWdlcworICogQGx2CisgKiBAbmV3X2NvdW50OiAgVGhlIGFic29sdXRlIGNvdW50IG9mIGltYWdlcyAoZS5nLiAnMicgZm9yIGEgMi13YXkgbWlycm9yKQorICogQHRhcmdldF9wdnM6ICBUaGUgbGlzdCBvZiBQVnMgdGhhdCBhcmUgY2FuZGlkYXRlcyBmb3IgcmVtb3ZhbAorICogQHNoaWZ0OiAgSWYgc2V0LCB1c2UgX3NoaWZ0X2FuZF9yZW5hbWVfaW1hZ2VfY29tcG9uZW50cygpLgorICoJICBPdGhlcndpc2UsIGxlYXZlIHRoZSBbbWV0YV9dYXJlYXMgYXMgQVJFQV9VTkFTU0lHTkVEIGFuZAorICoJICBzZWctPmFyZWFfY291bnQgdW5jaGFuZ2VkLgorICogQGV4dHJhY3RlZF9bbWV0YXxkYXRhXV9sdnM6ICBUaGUgTFZzIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuICBJZiAnc2hpZnQnCisgKgkJCSAgICAgIGlzIHNldCwgdGhlbiB0aGVyZSB3aWxsIGxpa2VseSBiZSBuYW1lIGNvbmZsaWN0cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIF9ib3RoXyBwb3J0aW9ucyBvZiB0aGUgaW5kZXhlZCBpbWFnZS4gIEl0CisgKiBkb2VzIC9ub3QvIGNvbW1pdCB0aGUgcmVzdWx0cy4gIChJT1csIGVycm9yaW5nLW91dCByZXF1aXJlcyBubyB1bndpbmRpbmcKKyAqIG9mIG9wZXJhdGlvbnMuKQorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgX3JhaWRfZXh0cmFjdF9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdWludDMyX3QgbmV3X2NvdW50LAorCQkJCXN0cnVjdCBkbV9saXN0ICp0YXJnZXRfcHZzLCBpbnQgc2hpZnQsCisJCQkJc3RydWN0IGRtX2xpc3QgKmV4dHJhY3RlZF9tZXRhX2x2cywKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqZXh0cmFjdGVkX2RhdGFfbHZzKQoreworCWludCBzcywgcywgZXh0cmFjdCwgbHZsX2lkeCA9IDA7CisJc3RydWN0IGx2X2xpc3QgKmx2bF9hcnJheTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJtZXRhX2x2LCAqcmltYWdlX2x2OworCXN0cnVjdCBzZWdtZW50X3R5cGUgKmVycm9yX3NlZ3R5cGU7CisKKwlleHRyYWN0ID0gc2VnLT5hcmVhX2NvdW50IC0gbmV3X2NvdW50OworCWxvZ192ZXJib3NlKCJFeHRyYWN0aW5nICV1ICVzIGZyb20gJXMvJXMiLCBleHRyYWN0LAorCQkgICAgKGV4dHJhY3QgPiAxKSA/ICJpbWFnZXMiIDogImltYWdlIiwKKwkJICAgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCWlmICgoaW50KSBkbV9saXN0X3NpemUodGFyZ2V0X3B2cykgPCBleHRyYWN0KSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlbW92ZSAlZCBpbWFnZXM6ICBPbmx5ICVkIGRldmljZSVzIGdpdmVuLiIsCisJCQkgIGV4dHJhY3QsIGRtX2xpc3Rfc2l6ZSh0YXJnZXRfcHZzKSwKKwkJCSAgKGRtX2xpc3Rfc2l6ZSh0YXJnZXRfcHZzKSA9PSAxKSA/ICIiIDogInMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobHZsX2FycmF5ID0gZG1fcG9vbF9hbGxvYyhsdi0+dmctPnZnbWVtLAorCQkJCQlzaXplb2YoKmx2bF9hcnJheSkgKiBleHRyYWN0ICogMikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGVycm9yX3NlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9FUlJPUikpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogV2UgbWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIGRldmljZXMuCisJICogLSBUaGUgZmlyc3QgcGFzcyB3ZSBsb29rIGZvciBlcnJvciBMVnMKKwkgKiAtIFRoZSBzZWNvbmQgcGFzcyB3ZSBsb29rIGZvciBQVnMgdGhhdCBtYXRjaCB0YXJnZXRfcHZzCisJICovCisJZm9yIChzcyA9IChzZWctPmFyZWFfY291bnQgKiAyKSAtIDE7IChzcyA+PSAwKSAmJiBleHRyYWN0OyBzcy0tKSB7CisJCXMgPSBzcyAlIHNlZy0+YXJlYV9jb3VudDsKKworCQlpZiAoc3MgLyBzZWctPmFyZWFfY291bnQpIHsKKwkJCS8qIENvbmRpdGlvbnMgZm9yIGZpcnN0IHBhc3MgKi8KKwkJCWlmICgoZmlyc3Rfc2VnKHNlZ19sdihzZWcsIHMpKS0+c2VndHlwZSAhPSBlcnJvcl9zZWd0eXBlKSAmJgorCQkJICAgIChmaXJzdF9zZWcoc2VnX21ldGFsdihzZWcsIHMpKS0+c2VndHlwZSAhPSBlcnJvcl9zZWd0eXBlKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFkbV9saXN0X2VtcHR5KHRhcmdldF9wdnMpICYmCisJCQkgICAgKHRhcmdldF9wdnMgIT0gJmx2LT52Zy0+cHZzKSkgeworCQkJCS8qCisJCQkJICogVXNlciBoYXMgc3VwcGxpZWQgYSBsaXN0IG9mIFBWcywgYnV0IHdlCisJCQkJICogY2Fubm90IGhvbm9yIHRoYXQgbGlzdCBiZWNhdXNlIGVycm9yIExWcworCQkJCSAqIG11c3QgY29tZSBmaXJzdC4KKwkJCQkgKi8KKwkJCQlsb2dfZXJyb3IoIiVzIGhhcyBjb21wb25lbnRzIHdpdGggZXJyb3IgdGFyZ2V0cyIKKwkJCQkJICAiIHRoYXQgbXVzdCBiZSByZW1vdmVkIGZpcnN0OiAlcy4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShzZWdfbHYoc2VnLCBzKSkpOworCisJCQkJbG9nX2Vycm9yKCJUcnkgcmVtb3ZpbmcgdGhlIFBWIGxpc3QgYW5kIHJlcnVuIgorCQkJCQkgICIgdGhlIGNvbW1hbmQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsb2dfZGVidWcoIkxWcyB3aXRoIGVycm9yIHNlZ21lbnRzIHRvIGJlIHJlbW92ZWQ6ICVzICVzIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZ19tZXRhbHYoc2VnLCBzKSksCisJCQkJICBkaXNwbGF5X2x2bmFtZShzZWdfbHYoc2VnLCBzKSkpOworCQl9IGVsc2UgeworCQkJLyogQ29uZGl0aW9ucyBmb3Igc2Vjb25kIHBhc3MgKi8KKwkJCWlmICghbHZfaXNfb25fcHZzKHNlZ19sdihzZWcsIHMpLCB0YXJnZXRfcHZzKSAmJgorCQkJICAgICFsdl9pc19vbl9wdnMoc2VnX21ldGFsdihzZWcsIHMpLCB0YXJnZXRfcHZzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFfcmFpZF9pbl9zeW5jKGx2KSAmJgorCQkJICAgICghc2VnX2lzX21pcnJvcmVkKHNlZykgfHwgKHMgPT0gMCkpKSB7CisJCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZXh0cmFjdCAlc1JBSUQgaW1hZ2UiCisJCQkJCSAgIiB3aGlsZSBSQUlEIGFycmF5IGlzIG5vdCBpbi1zeW5jIiwKKwkJCQkJICBzZWdfaXNfbWlycm9yZWQoc2VnKSA/ICJwcmltYXJ5ICIgOiAiIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKCFfZXh0cmFjdF9pbWFnZV9jb21wb25lbnRzKHNlZywgcywgJnJtZXRhX2x2LCAmcmltYWdlX2x2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZXh0cmFjdCAlcyBmcm9tICVzIiwKKwkJCQkgIHNlZ19sdihzZWcsIHMpLT5uYW1lLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChzaGlmdCAmJiAhX3NoaWZ0X2FuZF9yZW5hbWVfaW1hZ2VfY29tcG9uZW50cyhzZWcpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzaGlmdCBhbmQgcmVuYW1lIGltYWdlIGNvbXBvbmVudHMiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbHZsX2FycmF5W2x2bF9pZHhdLmx2ID0gcm1ldGFfbHY7CisJCWx2bF9hcnJheVtsdmxfaWR4ICsgMV0ubHYgPSByaW1hZ2VfbHY7CisJCWRtX2xpc3RfYWRkKGV4dHJhY3RlZF9tZXRhX2x2cywgJihsdmxfYXJyYXlbbHZsX2lkeCsrXS5saXN0KSk7CisJCWRtX2xpc3RfYWRkKGV4dHJhY3RlZF9kYXRhX2x2cywgJihsdmxfYXJyYXlbbHZsX2lkeCsrXS5saXN0KSk7CisKKwkJZXh0cmFjdC0tOworCX0KKwlpZiAoZXh0cmFjdCkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBleHRyYWN0IGVub3VnaCBpbWFnZXMgdG8gc2F0aXNmeSByZXF1ZXN0Iik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yYWlkX3JlbW92ZV9pbWFnZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgICB1aW50MzJfdCBuZXdfY291bnQsIHN0cnVjdCBkbV9saXN0ICpwdnMpCit7CisJc3RydWN0IGRtX2xpc3QgcmVtb3ZhbF9sdnM7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaW5pdCgmcmVtb3ZhbF9sdnMpOworCisJaWYgKCFfcmFpZF9leHRyYWN0X2ltYWdlcyhsdiwgbmV3X2NvdW50LCBwdnMsIDEsCisJCQkJICZyZW1vdmFsX2x2cywgJnJlbW92YWxfbHZzKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBleHRyYWN0IGltYWdlcyBmcm9tICVzLyVzIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIENvbnZlcnQgdG8gbGluZWFyPyAqLworCWlmIChuZXdfY291bnQgPT0gMSkgeworCQlpZiAoIV9yYWlkX3JlbW92ZV90b3BfbGF5ZXIobHYsICZyZW1vdmFsX2x2cykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBSQUlEIGxheWVyIgorCQkJCSAgIiBhZnRlciBsaW5lYXIgY29udmVyc2lvbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHYtPnN0YXR1cyAmPSB+KExWX05PVFNZTkNFRCB8IExWX1dSSVRFTU9TVExZKTsKKwkJZmlyc3Rfc2VnKGx2KS0+d3JpdGViZWhpbmQgPSAwOworCX0KKworCWlmICghdmdfd3JpdGUobHYtPnZnKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB3cml0ZSBjaGFuZ2VzIHRvICVzIGluICVzIiwKKwkJCSAgbHYtPm5hbWUsIGx2LT52Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3VzcGVuZF9sdihsdi0+dmctPmNtZCwgbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN1c3BlbmQgJXMvJXMgYmVmb3JlIGNvbW1pdHRpbmcgY2hhbmdlcyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQl2Z19yZXZlcnQobHYtPnZnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2Z19jb21taXQobHYtPnZnKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjb21taXQgY2hhbmdlcyB0byAlcyBpbiAlcyIsCisJCQkgIGx2LT5uYW1lLCBsdi0+dmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGFjdGl2YXRlIHRoZSBleHRyYWN0ZWQgc3ViLUxWcyBmaXJzdCBzbyB0aGV5IGFyZSByZW5hbWVkCisJICogYW5kIHdvbid0IGNvbmZsaWN0IHdpdGggdGhlIHJlbWFpbmluZyAocG9zc2libHkgc2hpZnRlZCkKKwkgKiBzdWItTFZzLgorCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZyZW1vdmFsX2x2cykgeworCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwobHYtPnZnLT5jbWQsIGx2bC0+bHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXN1bWUgZXh0cmFjdGVkIExWcyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIXJlc3VtZV9sdihsdi0+dmctPmNtZCwgbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlc3VtZSAlcy8lcyBhZnRlciBjb21taXR0aW5nIGNoYW5nZXMiLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzeW5jX2xvY2FsX2Rldl9uYW1lcyhsdi0+dmctPmNtZCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3luYyBsb2NhbCBkZXZpY2VzIGFmdGVyIGNvbW1pdHRpbmcgY2hhbmdlcyBmb3IgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBFbGltaW5hdGUgdGhlIGV4dHJhY3RlZCBMVnMKKwkgKi8KKwlpZiAoIWRtX2xpc3RfZW1wdHkoJnJlbW92YWxfbHZzKSkgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmcmVtb3ZhbF9sdnMpIHsKKwkJCWlmICghZGVhY3RpdmF0ZV9sdihsdi0+dmctPmNtZCwgbHZsLT5sdikpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIWx2X3JlbW92ZShsdmwtPmx2KSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCWlmICghdmdfd3JpdGUobHYtPnZnKSB8fCAhdmdfY29tbWl0KGx2LT52ZykpCisJCQlyZXR1cm5fMDsKKwl9CisKKwliYWNrdXAobHYtPnZnKTsKKworCXJldHVybiAxOworfQorCisvKgorICogbHZfcmFpZF9jaGFuZ2VfaW1hZ2VfY291bnQKKyAqIEBsdgorICogQG5ld19jb3VudDogVGhlIGFic29sdXRlIGNvdW50IG9mIGltYWdlcyAoZS5nLiAnMicgZm9yIGEgMi13YXkgbWlycm9yKQorICogQHB2czogVGhlIGxpc3Qgb2YgUFZzIHRoYXQgYXJlIGNhbmRpZGF0ZXMgZm9yIHJlbW92YWwgKG9yIGVtcHR5IGxpc3QpCisgKgorICogUkFJRCBhcnJheXMgaGF2ZSAnaW1hZ2VzJyB3aGljaCBhcmUgY29tcG9zZWQgb2YgdHdvIHBhcnRzLCB0aGV5IGFyZToKKyAqICAgIC0gJ3JpbWFnZSc6IFRoZSBkYXRhL3Bhcml0eSBob2xkaW5nIHBvcnRpb24KKyAqICAgIC0gJ3JtZXRhJyA6IFRoZSBtZXRhZGF0YSBob2xkaW5nIHBvcnRpb24gKGkuZS4gc3VwZXJibG9jay9iaXRtYXAgYXJlYSkKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBvciByZW1vdmVzIF9ib3RoXyBwb3J0aW9ucyBvZiB0aGUgaW1hZ2UgYW5kIGNvbW1pdHMKKyAqIHRoZSByZXN1bHRzLgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCisgKi8KK2ludCBsdl9yYWlkX2NoYW5nZV9pbWFnZV9jb3VudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIHVpbnQzMl90IG5ld19jb3VudCwgc3RydWN0IGRtX2xpc3QgKnB2cykKK3sKKwl1aW50MzJfdCBvbGRfY291bnQgPSBsdl9yYWlkX2ltYWdlX2NvdW50KGx2KTsKKworCWlmIChvbGRfY291bnQgPT0gbmV3X2NvdW50KSB7CisJCWxvZ193YXJuKCIlcy8lcyBhbHJlYWR5IGhhcyBpbWFnZSBjb3VudCBvZiAlZC4iLAorCQkJIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsIG5ld19jb3VudCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogTFYgbXVzdCBiZSBlaXRoZXIgaW4tYWN0aXZlIG9yIGV4Y2x1c2l2ZWx5IGFjdGl2ZQorCSAqLworCWlmIChsdl9pc19hY3RpdmUobHZfbG9ja19ob2xkZXIobHYpKSAmJiB2Z19pc19jbHVzdGVyZWQobHYtPnZnKSAmJgorCSAgICAhbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9sb2NhbGx5KGx2X2xvY2tfaG9sZGVyKGx2KSkpIHsKKwkJbG9nX2Vycm9yKCIlcy8lcyBtdXN0IGJlIGFjdGl2ZSBleGNsdXNpdmUgbG9jYWxseSB0byIKKwkJCSAgIiBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLiIsIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob2xkX2NvdW50ID4gbmV3X2NvdW50KQorCQlyZXR1cm4gX3JhaWRfcmVtb3ZlX2ltYWdlcyhsdiwgbmV3X2NvdW50LCBwdnMpOworCisJcmV0dXJuIF9yYWlkX2FkZF9pbWFnZXMobHYsIG5ld19jb3VudCwgcHZzKTsKK30KKworaW50IGx2X3JhaWRfc3BsaXQoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3QgY2hhciAqc3BsaXRfbmFtZSwKKwkJICB1aW50MzJfdCBuZXdfY291bnQsIHN0cnVjdCBkbV9saXN0ICpzcGxpdHRhYmxlX3B2cykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBkbV9saXN0IHJlbW92YWxfbHZzLCBkYXRhX2xpc3Q7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBsdi0+dmctPmNtZDsKKwl1aW50MzJfdCBvbGRfY291bnQgPSBsdl9yYWlkX2ltYWdlX2NvdW50KGx2KTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnRyYWNraW5nOworCXN0cnVjdCBkbV9saXN0IHRyYWNraW5nX3B2czsKKwlpbnQgaGlzdG9yaWNhbDsKKworCWRtX2xpc3RfaW5pdCgmcmVtb3ZhbF9sdnMpOworCWRtX2xpc3RfaW5pdCgmZGF0YV9saXN0KTsKKworCWlmIChpc19sb2NrZF90eXBlKGx2LT52Zy0+bG9ja190eXBlKSkgeworCQlsb2dfZXJyb3IoIlNwbGl0dGluZyByYWlkIGltYWdlIGlzIG5vdCBhbGxvd2VkIHdpdGggbG9ja190eXBlICVzIiwKKwkJCSAgbHYtPnZnLT5sb2NrX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKG9sZF9jb3VudCAtIG5ld19jb3VudCkgIT0gMSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzcGxpdCBtb3JlIHRoYW4gb25lIGltYWdlIGZyb20gJXMvJXMiLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzZWdfaXNfbWlycm9yZWQoZmlyc3Rfc2VnKGx2KSkgfHwKKwkgICAgc2VnX2lzX3JhaWQxMChmaXJzdF9zZWcobHYpKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzcGxpdCBsb2dpY2FsIHZvbHVtZSBvZiBzZWdtZW50IHR5cGUsICVzIiwKKwkJCSAgbHZzZWdfbmFtZShmaXJzdF9zZWcobHYpKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9uYW1lX2lzX3VzZWRfaW5fdmcobHYtPnZnLCBzcGxpdF9uYW1lLCAmaGlzdG9yaWNhbCkpIHsKKwkJbG9nX2Vycm9yKCIlc0xvZ2ljYWwgVm9sdW1lIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyBpbiAlcyIsCisJCQkgIGhpc3RvcmljYWwgPyAiaGlzdG9yaWNhbCAiIDogIiIsIHNwbGl0X25hbWUsIGx2LT52Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3JhaWRfaW5fc3luYyhsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgJXMvJXMgd2hpbGUgaXQgaXMgbm90IGluLXN5bmMuIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2Ugb25seSBhbGxvdyBhIHNwbGl0IHdoaWxlIHRoZXJlIGlzIHRyYWNraW5nIGlmIGl0IGlzIHRvCisJICogY29tcGxldGUgdGhlIHNwbGl0IG9mIHRoZSB0cmFja2luZyBzdWItTFYKKwkgKi8KKwlpZiAoX2x2X2lzX3JhaWRfd2l0aF90cmFja2luZyhsdiwgJnRyYWNraW5nKSkgeworCQlpZiAoIWx2X2lzX29uX3B2cyh0cmFja2luZywgc3BsaXR0YWJsZV9wdnMpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzcGxpdCBhZGRpdGlvbmFsIGltYWdlIGZyb20gJXMgIgorCQkJCSAgIndoaWxlIHRyYWNraW5nIGNoYW5nZXMgZm9yICVzIiwKKwkJCQkgIGx2LT5uYW1lLCB0cmFja2luZy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEVuc3VyZSB3ZSBvbmx5IHNwbGl0IHRoZSB0cmFja2luZyBpbWFnZSAqLworCQlkbV9saXN0X2luaXQoJnRyYWNraW5nX3B2cyk7CisJCXNwbGl0dGFibGVfcHZzID0gJnRyYWNraW5nX3B2czsKKwkJaWYgKCFnZXRfcHZfbGlzdF9mb3JfbHYodHJhY2tpbmctPnZnLT5jbWQtPm1lbSwKKwkJCQkJdHJhY2tpbmcsIHNwbGl0dGFibGVfcHZzKSkKKwkJCXJldHVybl8wOworCX0KKworCWlmICghX3JhaWRfZXh0cmFjdF9pbWFnZXMobHYsIG5ld19jb3VudCwgc3BsaXR0YWJsZV9wdnMsIDEsCisJCQkJICZyZW1vdmFsX2x2cywgJmRhdGFfbGlzdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZXh0cmFjdCBpbWFnZXMgZnJvbSAlcy8lcyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb252ZXJ0IHRvIGxpbmVhcj8gKi8KKwlpZiAoKG5ld19jb3VudCA9PSAxKSAmJiAhX3JhaWRfcmVtb3ZlX3RvcF9sYXllcihsdiwgJnJlbW92YWxfbHZzKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZW1vdmUgUkFJRCBsYXllciBhZnRlciBsaW5lYXIgY29udmVyc2lvbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgZmlyc3QgaXRlbSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZkYXRhX2xpc3QpCisJCWJyZWFrOworCisJbHZsLT5sdi0+bmFtZSA9IHNwbGl0X25hbWU7CisKKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgY2hhbmdlcyB0byAlcyBpbiAlcyIsCisJCQkgIGx2LT5uYW1lLCBsdi0+dmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN1c3BlbmRfbHYoY21kLCBsdl9sb2NrX2hvbGRlcihsdikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN1c3BlbmQgJXMvJXMgYmVmb3JlIGNvbW1pdHRpbmcgY2hhbmdlcyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQl2Z19yZXZlcnQobHYtPnZnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF2Z19jb21taXQobHYtPnZnKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjb21taXQgY2hhbmdlcyB0byAlcyBpbiAlcyIsCisJCQkgIGx2LT5uYW1lLCBsdi0+dmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZpcnN0IGFjdGl2YXRlIHRoZSBuZXdseSBzcGxpdCBMViBhbmQgTFZzIG9uIHRoZSByZW1vdmFsIGxpc3QuCisJICogVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGVyZSBhcmUgbm8gbmFtZSBjb2xsaXNpb25zIGR1ZSB0bworCSAqIHRoZSBvcmlnaW5hbCBSQUlEIExWIGhhdmluZyBwb3NzaWJseSBoYWQgc3ViLUxWcyB0aGF0IGhhdmUgYmVlbgorCSAqIHNoaWZ0ZWQgYW5kIHJlbmFtZWQuCisJICovCisJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGNtZCwgbHZsLT5sdikpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnJlbW92YWxfbHZzKQorCQlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCisJaWYgKCFyZXN1bWVfbHYoY21kLCBsdl9sb2NrX2hvbGRlcihsdikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlc3VtZSAlcy8lcyBhZnRlciBjb21taXR0aW5nIGNoYW5nZXMiLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTaW5jZSBuZXdseSBzcGxpdCBMViBpcyB0eXBpY2FsbHkgYWxyZWFkeSBhY3RpdmUgLSB3ZSBuZWVkIHRvIGNhbGwKKwkgKiBzdXNwZW5kKCkgYW5kIHJlc3VtZSgpIHRvIGFsc28gcmVuYW1lIGl0LgorCSAqCisJICogVE9ETzogYWN0aXZhdGUgc2hvdWxkIHJlY29nbml6ZSBpdCBhbmQgYXZvaWQgdGhlc2UgMiBjYWxscworCSAqLworCisJLyoKKwkgKiBFbGltaW5hdGUgdGhlIHJlc2lkdWFsIExWcworCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZyZW1vdmFsX2x2cykgeworCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCisJCWlmICghbHZfcmVtb3ZlKGx2bC0+bHYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJaWYgKCF2Z193cml0ZShsdi0+dmcpIHx8ICF2Z19jb21taXQobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwliYWNrdXAobHYtPnZnKTsKKworCXJldHVybiAxOworfQorCisvKgorICogbHZfcmFpZF9zcGxpdF9hbmRfdHJhY2sKKyAqIEBsdgorICogQHNwbGl0dGFibGVfcHZzCisgKgorICogT25seSBhbGxvd3MgYSBzaW5nbGUgaW1hZ2UgdG8gYmUgc3BsaXQgd2hpbGUgdHJhY2tpbmcuICBUaGUgaW1hZ2UKKyAqIG5ldmVyIGFjdHVhbGx5IGxlYXZlcyB0aGUgbWlycm9yLiAgSXQgaXMgc2ltcGx5IG1hZGUgdmlzaWJsZS4gIFRoaXMKKyAqIGFjdGlvbiB0cmlnZ2VycyB0d28gdGhpbmdzOiAxKSB1c2VycyBhcmUgYWJsZSB0byBhY2Nlc3MgdGhlIChkYXRhKSBpbWFnZQorICogYW5kIDIpIGxvd2VyIGxheWVycyByZXBsYWNlIGltYWdlcyBtYXJrZWQgd2l0aCBhIHZpc2libGUgZmxhZyB3aXRoCisgKiBlcnJvciB0YXJnZXRzLgorICoKKyAqIFJldHVybnM6IDEgb24gc3VjY2VzcywgMCBvbiBlcnJvcgorICovCitpbnQgbHZfcmFpZF9zcGxpdF9hbmRfdHJhY2soc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqc3BsaXR0YWJsZV9wdnMpCit7CisJaW50IHM7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlpZiAoIXNlZ19pc19taXJyb3JlZChzZWcpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNwbGl0IGltYWdlcyBmcm9tIG5vbi1taXJyb3JlZCBSQUlEIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3JhaWRfaW5fc3luYyhsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgaW1hZ2UgZnJvbSAlcy8lcyB3aGlsZSBub3QgaW4tc3luYyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYW5ub3QgdHJhY2sgdHdvIHNwbGl0IGltYWdlcyBhdCBvbmNlICovCisJaWYgKGx2X2lzX3JhaWRfd2l0aF90cmFja2luZyhsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdHJhY2sgbW9yZSB0aGFuIG9uZSBzcGxpdCBpbWFnZSBhdCBhIHRpbWUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChzID0gc2VnLT5hcmVhX2NvdW50IC0gMTsgcyA+PSAwOyAtLXMpIHsKKwkJaWYgKCFsdl9pc19vbl9wdnMoc2VnX2x2KHNlZywgcyksIHNwbGl0dGFibGVfcHZzKSkKKwkJCWNvbnRpbnVlOworCQlsdl9zZXRfdmlzaWJsZShzZWdfbHYoc2VnLCBzKSk7CisJCXNlZ19sdihzZWcsIHMpLT5zdGF0dXMgJj0gfkxWTV9XUklURTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHMgPj0gKGludCkgc2VnLT5hcmVhX2NvdW50KSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGZpbmQgaW1hZ2UgdG8gc2F0aXNmeSByZXF1ZXN0Iik7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCIlcyBzcGxpdCBmcm9tICVzIGZvciByZWFkLW9ubHkgcHVycG9zZXMuIiwKKwkJCQlzZWdfbHYoc2VnLCBzKS0+bmFtZSwgbHYtPm5hbWUpOworCisJLyogQWN0aXZhdGUgdGhlIHNwbGl0IChhbmQgdHJhY2tpbmcpIExWICovCisJaWYgKCFfYWN0aXZhdGVfc3VibHZfcHJlc2VydmluZ19leGNsKGx2LCBzZWdfbHYoc2VnLCBzKSkpCisJCXJldHVybl8wOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlVzZSAnbHZjb252ZXJ0IC0tbWVyZ2UgJXMvJXMnIHRvIG1lcmdlIGJhY2sgaW50byAlcyIsCisJCQkJbHYtPnZnLT5uYW1lLCBzZWdfbHYoc2VnLCBzKS0+bmFtZSwgbHYtPm5hbWUpOworCXJldHVybiAxOworfQorCitpbnQgbHZfcmFpZF9tZXJnZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmltYWdlX2x2KQoreworCXVpbnQzMl90IHM7CisJY2hhciAqcCwgKmx2X25hbWU7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWV0YV9sdiA9IE5VTEw7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGltYWdlX2x2LT52ZzsKKworCWlmIChpbWFnZV9sdi0+c3RhdHVzICYgTFZNX1dSSVRFKSB7CisJCWxvZ19lcnJvcigiJXMgaXMgbm90IHJlYWQtb25seSAtIHJlZnVzaW5nIHRvIG1lcmdlLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGltYWdlX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGx2X25hbWUgPSBkbV9wb29sX3N0cmR1cCh2Zy0+dmdtZW0sIGltYWdlX2x2LT5uYW1lKSkpCisJCXJldHVybl8wOworCisJaWYgKCEocCA9IHN0cnN0cihsdl9uYW1lLCAiX3JpbWFnZV8iKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gbWVyZ2Ugbm9uLW1pcnJvciBpbWFnZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShpbWFnZV9sdikpOworCQlyZXR1cm4gMDsKKwl9CisJKnAgPSAnXDAnOyAvKiBsdl9uYW1lIGlzIG5vdyB0aGF0IG9mIHRvcC1sZXZlbCBSQUlEICovCisKKwlpZiAoIShsdmwgPSBmaW5kX2x2X2luX3ZnKHZnLCBsdl9uYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZmluZCBjb250YWluaW5nIFJBSUQgYXJyYXkgZm9yICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGltYWdlX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWx2ID0gbHZsLT5sdjsKKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7ICsrcykKKwkJaWYgKHNlZ19sdihzZWcsIHMpID09IGltYWdlX2x2KQorCQkJbWV0YV9sdiA9IHNlZ19tZXRhbHYoc2VnLCBzKTsKKworCWlmICghbWV0YV9sdikgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIG1ldGEgZm9yICVzIGluIFJBSUQgYXJyYXkgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoaW1hZ2VfbHYpLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRlYWN0aXZhdGVfbHYodmctPmNtZCwgbWV0YV9sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGVhY3RpdmF0ZSAlcyBiZWZvcmUgbWVyZ2luZy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShtZXRhX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGVhY3RpdmF0ZV9sdih2Zy0+Y21kLCBpbWFnZV9sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGVhY3RpdmF0ZSAlcyBiZWZvcmUgbWVyZ2luZy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShpbWFnZV9sdikpOworCQlyZXR1cm4gMDsKKwl9CisJbHZfc2V0X2hpZGRlbihpbWFnZV9sdik7CisJaW1hZ2VfbHYtPnN0YXR1cyB8PSAobHYtPnN0YXR1cyAmIExWTV9XUklURSk7CisJaW1hZ2VfbHYtPnN0YXR1cyB8PSBSQUlEX0lNQUdFOworCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCXJldHVybl8wOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzLyVzIHN1Y2Nlc3NmdWxseSBtZXJnZWQgYmFjayBpbnRvICVzLyVzIiwKKwkJCQl2Zy0+bmFtZSwgaW1hZ2VfbHYtPm5hbWUsIHZnLT5uYW1lLCBsdi0+bmFtZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBEZWFjdGl2YXRlIGFuZCByZW1vdmUgdGhlIExWcyBvbiByZW1vdmFsX2x2cyBsaXN0IGZyb20gdmcuCisgKi8KK3N0YXRpYyBpbnQgX2RlYWN0aXZhdGVfYW5kX3JlbW92ZV9sdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBkbV9saXN0ICpyZW1vdmFsX2x2cykKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgcmVtb3ZhbF9sdnMpCisJCWlmICghZGVhY3RpdmF0ZV9sdih2Zy0+Y21kLCBsdmwtPmx2KSB8fAorCQkgICAgIWx2X3JlbW92ZShsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBtZXRhZGF0YSBkZXZzIGZvciBhbGwgQG5ld19kYXRhX2RldnMgYW5kIGxpbmsgdGhlbSB0byBsaXN0IEBuZXdfbWV0YV9sdnMKKyAqLworc3RhdGljIGludCBfYWxsb2Nfcm1ldGFfZGV2c19mb3JfcmltYWdlX2RldnMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqbmV3X2RhdGFfbHZzLAorCQkJCQkgICAgIHN0cnVjdCBkbV9saXN0ICpuZXdfbWV0YV9sdnMsCisJCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwl1aW50MzJfdCBhID0gMCwgcmFpZF9kZXZzID0gZG1fbGlzdF9zaXplKG5ld19kYXRhX2x2cyk7CisJc3RydWN0IGx2X2xpc3QgKmx2bCwgKmx2bDEsICpsdmxfYXJyYXk7CisKKwlpZiAoIXJhaWRfZGV2cykKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShsdmxfYXJyYXkgPSBkbV9wb29sX3phbGxvYyhsdi0+dmctPnZnbWVtLCByYWlkX2RldnMgKiBzaXplb2YoKmx2bF9hcnJheSkpKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBuZXdfZGF0YV9sdnMpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBbGxvY2F0aW5nIG5ldyBtZXRhZGF0YSBMViBmb3IgJXMiLCBsdmwtPmx2LT5uYW1lKTsKKworCQlpZiAoIV9hbGxvY19ybWV0YV9mb3JfbHYobHZsLT5sdiwgJmx2bF9hcnJheVthXS5sdiwgYWxsb2NhdGVfcHZzKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWV0YWRhdGEgTFYgZm9yICVzIGluICVzIiwKKwkJCQkgIGx2bC0+bHYtPm5hbWUsIGx2LT52Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRtX2xpc3RfYWRkKG5ld19tZXRhX2x2cywgJmx2bF9hcnJheVthKytdLmxpc3QpOworCQkKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bDEsIG5ld19tZXRhX2x2cykKKwkJCWlmICghX2F2b2lkX3B2c193aXRoX290aGVyX2ltYWdlc19vZl9sdihsdmwxLT5sdiwgYWxsb2NhdGVfcHZzKSkKKwkJCQlyZXR1cm5fMDsKKwl9CisKKwlfY2xlYXJfYWxsb2NhdGlvbl9wcm9oaWJpdGVkKGFsbG9jYXRlX3B2cyk7CisKKwlyZXR1cm4gMTsKK30KKy8qIEFkZCBuZXcgQGx2cyB0byBAbHYgYXQgQGFyZWFfb2Zmc2V0ICovCitzdGF0aWMgaW50IF9hZGRfaW1hZ2VfY29tcG9uZW50X2xpc3Qoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50IGRlbGV0ZV9mcm9tX2xpc3QsCisJCQkJICAgICB1aW50NjRfdCBsdl9mbGFncywgc3RydWN0IGRtX2xpc3QgKmx2cywgdWludDMyX3QgYXJlYV9vZmZzZXQpCit7CisJdWludDMyX3QgcyA9IGFyZWFfb2Zmc2V0OworCXN0cnVjdCBsdl9saXN0ICpsdmwsICp0bXA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShsdmwsIHRtcCwgbHZzKSB7CisJCWlmIChkZWxldGVfZnJvbV9saXN0KQorCQkJZG1fbGlzdF9kZWwoJmx2bC0+bGlzdCk7CisKKwkJaWYgKGx2X2ZsYWdzICYgVklTSUJMRV9MVikKKwkJCWx2X3NldF92aXNpYmxlKGx2bC0+bHYpOworCQllbHNlCisJCQlsdl9zZXRfaGlkZGVuKGx2bC0+bHYpOworCisJCWlmIChsdl9mbGFncyAmIExWX1JFQlVJTEQpCisJCQlsdmwtPmx2LT5zdGF0dXMgfD0gTFZfUkVCVUlMRDsKKwkJZWxzZQorCQkJbHZsLT5sdi0+c3RhdHVzICY9IH5MVl9SRUJVSUxEOworCisJCWlmICghc2V0X2x2X3NlZ21lbnRfYXJlYV9sdihzZWcsIHMrKywgbHZsLT5sdiwgMCAvKiBsZSAqLywgbHZsLT5sdi0+c3RhdHVzKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIHN1Ymx2ICVzIiwgbHZsLT5sdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogU3BsaXQgc2VnbWVudHMgaW4gc2VnbWVudCBMVnMgaW4gYWxsIGFyZWFzIG9mIHNlZyBhdCBvZmZzZXQgYXJlYV9sZQorICovCitzdGF0aWMgaW50IF9zcGxpdF9hcmVhX2x2c19zZWdtZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCB1aW50MzJfdCBhcmVhX2xlKQoreworCXVpbnQzMl90IHM7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSdzIGEgc2VnbWVudCBzdGFydGluZyBhdCBhcmVhX2xlIGluIGFsbCBkYXRhIExWcyAqLworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykKKwkJaWYgKGFyZWFfbGUgPCBzZWdfbHYoc2VnLCBzKS0+bGVfY291bnQgJiYKKwkJICAgICFsdl9zcGxpdF9zZWdtZW50KHNlZ19sdihzZWcsIHMpLCBhcmVhX2xlKSkKKwkJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2FsbG9jX2FuZF9hZGRfbmV3X3N0cmlwZWRfc2VnbWVudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgICB1aW50MzJfdCBsZSwgdWludDMyX3QgYXJlYV9sZW4sCisJCQkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICpuZXdfc2VnbWVudHMpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgKm5ld19zZWc7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc3RyaXBlZF9zZWd0eXBlOworCisJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCWlmICghKHN0cmlwZWRfc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGx2LT52Zy0+Y21kLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgd2l0aCBzZWctPmFyZWFfY291bnQgYXJlYXMgKi8KKwlpZiAoIShuZXdfc2VnID0gYWxsb2NfbHZfc2VnbWVudChzdHJpcGVkX3NlZ3R5cGUsIGx2LCBsZSwgYXJlYV9sZW4gKiBzZWctPmFyZWFfY291bnQsCisJCQkJCSBzZWctPnN0YXR1cyAmIH5SQUlELAorCQkJCQkgc2VnLT5zdHJpcGVfc2l6ZSwgTlVMTCwgc2VnLT5hcmVhX2NvdW50LAorCQkJCQkgYXJlYV9sZW4sIHNlZy0+Y2h1bmtfc2l6ZSwgMCwgMCwgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfYWRkKG5ld19zZWdtZW50cywgJm5ld19zZWctPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2V4dHJhY3RfaW1hZ2VfY29tcG9uZW50X2Vycm9yX3NlZyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCQkgICAgICB1aW50NjRfdCB0eXBlLCB1aW50MzJfdCBpZHgsCisJCQkJCSAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKmV4dHJhY3RlZF9sdiwKKwkJCQkJICAgICAgaW50IHNldF9lcnJvcl9zZWcpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFJBSURfTUVUQToKKwkJCWx2ID0gc2VnX21ldGFsdihzZWcsIGlkeCk7CisJCQlzZWdfbWV0YWx2KHNlZywgaWR4KSA9IE5VTEw7CisJCQlzZWdfbWV0YXR5cGUoc2VnLCBpZHgpID0gQVJFQV9VTkFTU0lHTkVEOworCQkJYnJlYWs7CisJCWNhc2UgUkFJRF9JTUFHRToKKwkJCWx2ID0gc2VnX2x2KHNlZywgaWR4KTsKKwkJCXNlZ19sdihzZWcsIGlkeCkgPSBOVUxMOworCQkJc2VnX3R5cGUoc2VnLCBpZHgpID0gQVJFQV9VTkFTU0lHTkVEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkJhZCB0eXBlIHByb3ZpZGVkIHRvICVzLiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkV4dHJhY3RpbmcgaW1hZ2UgY29tcG9uZW50ICVzIGZyb20gJXMiLCBsdi0+bmFtZSwgbHZzZWdfbmFtZShzZWcpKTsKKwlsdi0+c3RhdHVzICY9IH4odHlwZSB8IFJBSUQpOworCWx2X3NldF92aXNpYmxlKGx2KTsKKworCS8qIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBzZWcgdG8gbHYgKi8KKwlpZiAoIXJlbW92ZV9zZWdfZnJvbV9zZWdzX3VzaW5nX3RoaXNfbHYobHYsIHNlZykpCisJCXJldHVybl8wOworCisJaWYgKCEobHYtPm5hbWUgPSBfZ2VuZXJhdGVfcmFpZF9uYW1lKGx2LCAiZXh0cmFjdGVkXyIsIC0xKSkpCisJCXJldHVybl8wOworCisJaWYgKHNldF9lcnJvcl9zZWcgJiYgIXJlcGxhY2VfbHZfd2l0aF9lcnJvcl9zZWdtZW50KGx2KSkKKwkJcmV0dXJuXzA7CisKKwkqZXh0cmFjdGVkX2x2ID0gbHY7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEV4dHJhY3QgYWxsIHN1YiBMVnMgb2YgdHlwZSBmcm9tIHNlZyBzdGFydGluZyBhdCBpZHggZXhjbHVkaW5nIGVuZCBhbmQKKyAqIHB1dCB0aGVtIG9uIHJlbW92YWxfbHZzIHNldHRpbmcgbWFwcGluZ3MgdG8gImVycm9yIiBpZiBlcnJvcl9zZWcuCisgKi8KK3N0YXRpYyBpbnQgX2V4dHJhY3RfaW1hZ2VfY29tcG9uZW50X3N1Ymxpc3Qoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkJICAgIHVpbnQ2NF90IHR5cGUsIHVpbnQzMl90IGlkeCwgdWludDMyX3QgZW5kLAorCQkJCQkgICAgc3RydWN0IGRtX2xpc3QgKnJlbW92YWxfbHZzLAorCQkJCQkgICAgaW50IGVycm9yX3NlZykKK3sKKwl1aW50MzJfdCBzOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlpZiAoIShsdmwgPSBkbV9wb29sX2FsbG9jKHNlZ19sdihzZWcsIGlkeCktPnZnLT52Z21lbSwgc2l6ZW9mKCpsdmwpICogKGVuZCAtIGlkeCkpKSkKKwkJcmV0dXJuXzA7CisKKwlmb3IgKHMgPSBpZHg7IHMgPCBlbmQ7IHMrKykgeworCQlpZiAoIV9leHRyYWN0X2ltYWdlX2NvbXBvbmVudF9lcnJvcl9zZWcoc2VnLCB0eXBlLCBzLCAmbHZsLT5sdiwgZXJyb3Jfc2VnKSkKKwkJCXJldHVybiAwOworCisJCWRtX2xpc3RfYWRkKHJlbW92YWxfbHZzLCAmbHZsLT5saXN0KTsKKwkJbHZsKys7CisJfQorCisJaWYgKCFpZHggJiYgZW5kID09IHNlZy0+YXJlYV9jb3VudCkgeworCQlpZiAodHlwZSA9PSBSQUlEX0lNQUdFKQorCQkJc2VnLT5hcmVhcyA9IE5VTEw7CisJCWVsc2UKKwkJCXNlZy0+bWV0YV9hcmVhcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEV4dHJhY3QgYWxsIHN1YiBMVnMgb2YgdHlwZSBmcm9tIHNlZyBzdGFydGluZyB3aXRoIGlkeCBhbmQgcHV0IHRoZW0gb24gcmVtb3ZhbF9MdnMgKi8KK3N0YXRpYyBpbnQgX2V4dHJhY3RfaW1hZ2VfY29tcG9uZW50X2xpc3Qoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkJIHVpbnQ2NF90IHR5cGUsIHVpbnQzMl90IGlkeCwKKwkJCQkJIHN0cnVjdCBkbV9saXN0ICpyZW1vdmFsX2x2cykKK3sKKwlyZXR1cm4gX2V4dHJhY3RfaW1hZ2VfY29tcG9uZW50X3N1Ymxpc3Qoc2VnLCB0eXBlLCBpZHgsIHNlZy0+YXJlYV9jb3VudCwgcmVtb3ZhbF9sdnMsIDEpOworfQorCisvKgorICogQWxsb2NhdGUgbWV0YWRhdGEgZGV2cyBmb3IgYWxsIGRhdGEgZGV2cyBvZiBhbiBMVgorICovCitzdGF0aWMgaW50IF9hbGxvY19ybWV0YV9kZXZzX2Zvcl9sdihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbWV0YV9sdnMsCisJCQkJICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMpCit7CisJdWludDMyX3QgczsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsX2FycmF5OworCXN0cnVjdCBkbV9saXN0IGRhdGFfbHZzOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCisJZG1fbGlzdF9pbml0KCZkYXRhX2x2cyk7CisKKwlpZiAoIShzZWctPm1ldGFfYXJlYXMgPSBkbV9wb29sX3phbGxvYyhsdi0+dmctPnZnbWVtLCBzZWctPmFyZWFfY291bnQgKiBzaXplb2YoKnNlZy0+bWV0YV9hcmVhcykpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShsdmxfYXJyYXkgPSBkbV9wb29sX2FsbG9jKGx2LT52Zy0+dmdtZW0sIHNlZy0+YXJlYV9jb3VudCAqIHNpemVvZigqbHZsX2FycmF5KSkpKQorCQlyZXR1cm5fMDsKKworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlsdmxfYXJyYXlbc10ubHYgPSBzZWdfbHYoc2VnLCBzKTsKKwkJZG1fbGlzdF9hZGQoJmRhdGFfbHZzLCAmbHZsX2FycmF5W3NdLmxpc3QpOworCX0KKworCWlmICghX2FsbG9jX3JtZXRhX2RldnNfZm9yX3JpbWFnZV9kZXZzKGx2LCAmZGF0YV9sdnMsIG1ldGFfbHZzLCBhbGxvY2F0ZV9wdnMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1ldGFkYXRhIExWcyBmb3IgJXMiLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQWRkIG1ldGFkYXRhIGFyZWFzIHRvIHJhaWQwCisgKi8KK3N0YXRpYyBpbnQgX2FsbG9jX2FuZF9hZGRfcm1ldGFfZGV2c19mb3JfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwlzdHJ1Y3QgZG1fbGlzdCBtZXRhX2x2czsKKworCWRtX2xpc3RfaW5pdCgmbWV0YV9sdnMpOworCisJbG9nX2RlYnVnX21ldGFkYXRhKCJBbGxvY2F0aW5nIG1ldGFkYXRhIExWcyBmb3IgJXMiLCBkaXNwbGF5X2x2bmFtZShsdikpOworCWlmICghX2FsbG9jX3JtZXRhX2RldnNfZm9yX2x2KGx2LCAmbWV0YV9sdnMsIGFsbG9jYXRlX3B2cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWV0YWRhdGEgTFZzIGZvciAlcyIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybl8wOworCX0KKworCS8qIE1ldGFkYXRhIExWcyBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIGJlaW5nIGFkZGVkIHRvIHRoZSBhcnJheSAqLworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ2xlYXJpbmcgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhIExWcyBmb3IgJXMiLCBkaXNwbGF5X2x2bmFtZShsdikpOworCWlmICghX2NsZWFyX2x2cygmbWV0YV9sdnMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEgTFZzIGZvciAlcyIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybl8wOworCX0KKworCS8qIFNldCBzZWdtZW50IGFyZWFzIGZvciBtZXRhZGF0YSBzdWJfbHZzICovCisJbG9nX2RlYnVnX21ldGFkYXRhKCJBZGRpbmcgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhIExWcyB0byAlcyIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJaWYgKCFfYWRkX2ltYWdlX2NvbXBvbmVudF9saXN0KHNlZywgMSwgMCwgJm1ldGFfbHZzLCAwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhZGQgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhIExWcyB0byAlcyIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCisKKy8qIEZJWE1FIE1vdmUgdGhpcyBvdXQgKi8KKy8qIFdyaXRlLCBjb21taXQgYW5kIG9wdGlvbmFsbHkgYmFja3VwIG1ldGFkYXRhIG9mIHZnICovCitzdGF0aWMgaW50IF92Z193cml0ZV9jb21taXRfYmFja3VwKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvbW1pdCBWRyAlcyBtZXRhZGF0YS4iLCB2Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghYmFja3VwKHZnKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEJhY2t1cCBvZiBWRyAlcyBtZXRhZGF0YSBmYWlsZWQuIENvbnRpbnVpbmcuIiwgdmctPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFbGltaW5hdGUgdGhlIGV4dHJhY3RlZCBMVnMgb24gQHJlbW92YWxfbHZzIGZyb20gQHZnIGluY2wuIHZnIHdyaXRlLCBjb21taXQgYW5kIGJhY2t1cCAKKyAqLworc3RhdGljIGludCBfZWxpbWluYXRlX2V4dHJhY3RlZF9sdnNfb3B0aW9uYWxfd3JpdGVfdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhbF9sdnMsCisJCQkJCQkgICAgICBpbnQgdmdfd3JpdGVfcmVxdWVzdGVkKQoreworCWlmICghcmVtb3ZhbF9sdnMgfHwgZG1fbGlzdF9lbXB0eShyZW1vdmFsX2x2cykpCisJCXJldHVybiAxOworCisJaWYgKCFfZGVhY3RpdmF0ZV9hbmRfcmVtb3ZlX2x2cyh2ZywgcmVtb3ZhbF9sdnMpKQorCQlyZXR1cm5fMDsKKworCS8qIFdhaXQgZm9yIGV2ZW50cyBmb2xsb3dpbmcgYW55IGRlYWN0aXZhdGlvbi4gKi8KKwlpZiAoIXN5bmNfbG9jYWxfZGV2X25hbWVzKHZnLT5jbWQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN5bmMgbG9jYWwgZGV2aWNlcyBhZnRlciByZW1vdmluZyAldSBMVnMgaW4gVkcgJXMuIiwKKwkJCSAgZG1fbGlzdF9zaXplKHJlbW92YWxfbHZzKSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbV9saXN0X2luaXQocmVtb3ZhbF9sdnMpOworCisJaWYgKHZnX3dyaXRlX3JlcXVlc3RlZCAmJiAhX3ZnX3dyaXRlX2NvbW1pdF9iYWNrdXAodmcpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9lbGltaW5hdGVfZXh0cmFjdGVkX2x2cyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRtX2xpc3QgKnJlbW92YWxfbHZzKQoreworCXJldHVybiBfZWxpbWluYXRlX2V4dHJhY3RlZF9sdnNfb3B0aW9uYWxfd3JpdGVfdmcodmcsIHJlbW92YWxfbHZzLCAxKTsKK30KKworLyoKKyAqIEFkZC9yZW1vdmUgbWV0YWRhdGEgYXJlYXMgdG8vZnJvbSByYWlkMAorICovCitzdGF0aWMgaW50IF9yYWlkMF9hZGRfb3JfcmVtb3ZlX21ldGFkYXRhX2x2cyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgIGludCB1cGRhdGVfYW5kX3JlbG9hZCwKKwkJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGVfcHZzLAorCQkJCQkgICAgIHN0cnVjdCBkbV9saXN0ICpyZW1vdmFsX2x2cykKK3sKKwl1aW50NjRfdCBuZXdfcmFpZF90eXBlX2ZsYWc7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlpZiAocmVtb3ZhbF9sdnMpIHsKKwkJaWYgKHNlZy0+bWV0YV9hcmVhcykgeworCQkJaWYgKCFfZXh0cmFjdF9pbWFnZV9jb21wb25lbnRfbGlzdChzZWcsIFJBSURfTUVUQSwgMCwgcmVtb3ZhbF9sdnMpKQorCQkJCXJldHVybl8wOworCQkJc2VnLT5tZXRhX2FyZWFzID0gTlVMTDsKKwkJfQorCQluZXdfcmFpZF90eXBlX2ZsYWcgPSBTRUdfUkFJRDA7CisJfSBlbHNlIHsKKwkJaWYgKCFfYWxsb2NfYW5kX2FkZF9ybWV0YV9kZXZzX2Zvcl9sdihsdiwgYWxsb2NhdGVfcHZzKSkKKwkJCXJldHVybiAwOworCisJCW5ld19yYWlkX3R5cGVfZmxhZyA9IFNFR19SQUlEMF9NRVRBOworCX0KKworCWlmICghKHNlZy0+c2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fZmxhZyhsdi0+dmctPmNtZCwgbmV3X3JhaWRfdHlwZV9mbGFnKSkpCisJCXJldHVybl8wOworCisJaWYgKHVwZGF0ZV9hbmRfcmVsb2FkKSB7CisJCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWRfb3JpZ2luKGx2KSkKKwkJCXJldHVybl8wOworCisJCS8qIElmIGFueSByZXNpZHVhbCBMVnMsIGVsaW1pbmF0ZSB0aGVtLCB3cml0ZSBWRywgY29tbWl0IGl0IGFuZCB0YWtlIGEgYmFja3VwICovCisJCXJldHVybiBfZWxpbWluYXRlX2V4dHJhY3RlZF9sdnMobHYtPnZnLCByZW1vdmFsX2x2cyk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZW5lcmFsIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIENvbnZlcnQgYSBSQUlEMCBzZXQgdG8gc3RyaXBlZAorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X21pcnJvcl90b19yYWlkMShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSkKK3sKKwl1aW50MzJfdCBzOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cnVjdCBsdl9saXN0IGx2bF9hcnJheVtzZWctPmFyZWFfY291bnRdLCAqbHZsOworCXN0cnVjdCBkbV9saXN0IG1ldGFfbHZzOworCXN0cnVjdCBsdl9zZWdtZW50X2FyZWEgKm1ldGFfYXJlYXM7CisJY2hhciAqbmV3X25hbWU7CisKKwlkbV9saXN0X2luaXQoJm1ldGFfbHZzKTsKKworCWlmICghX3JhaWRfaW5fc3luYyhsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY29udmVydCAlcy8lcyB3aGlsZSBpdCBpcyBub3QgaW4tc3luYyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShtZXRhX2FyZWFzID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT52Z21lbSwKKwkJCQkJICBsdl9taXJyb3JfY291bnQobHYpICogc2l6ZW9mKCptZXRhX2FyZWFzKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1ldGEgYXJlYXMgbWVtb3J5LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBbGxvY2F0aW5nIG5ldyBtZXRhZGF0YSBMViBmb3IgJXMiLAorCQkJCSAgIHNlZ19sdihzZWcsIHMpLT5uYW1lKTsKKwkJaWYgKCFfYWxsb2Nfcm1ldGFfZm9yX2x2KHNlZ19sdihzZWcsIHMpLCAmKGx2bF9hcnJheVtzXS5sdiksIE5VTEwpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZXRhZGF0YSBMViBmb3IgJXMgaW4gJXMiLAorCQkJCSAgc2VnX2x2KHNlZywgcyktPm5hbWUsIGx2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRtX2xpc3RfYWRkKCZtZXRhX2x2cywgJihsdmxfYXJyYXlbc10ubGlzdCkpOworCX0KKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQ2xlYXJpbmcgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhIExWcyIpOworCWlmICghX2NsZWFyX2x2cygmbWV0YV9sdnMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEgTFZzIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWctPmxvZ19sdikgeworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlJlbW92aW5nIG1pcnJvciBsb2csICVzIiwgc2VnLT5sb2dfbHYtPm5hbWUpOworCQlpZiAoIXJlbW92ZV9taXJyb3JfbG9nKGx2LT52Zy0+Y21kLCBsdiwgTlVMTCwgMCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBtaXJyb3IgbG9nIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXNlZy0+bWV0YV9hcmVhcyA9IG1ldGFfYXJlYXM7CisJcyA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmbWV0YV9sdnMpIHsKKwkJbG9nX2RlYnVnX21ldGFkYXRhKCJBZGRpbmcgJXMgdG8gJXMiLCBsdmwtPmx2LT5uYW1lLCBsdi0+bmFtZSk7CisKKwkJLyogSW1hZ2VzIGFyZSBrbm93biB0byBiZSBpbi1zeW5jICovCisJCWx2bC0+bHYtPnN0YXR1cyAmPSB+TFZfUkVCVUlMRDsKKwkJZmlyc3Rfc2VnKGx2bC0+bHYpLT5zdGF0dXMgJj0gfkxWX1JFQlVJTEQ7CisJCWx2X3NldF9oaWRkZW4obHZsLT5sdik7CisKKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KHNlZywgcywgbHZsLT5sdiwgMCwKKwkJCQkJICAgIGx2bC0+bHYtPnN0YXR1cykpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCAlcyB0byAlcyIsCisJCQkJICBsdmwtPmx2LT5uYW1lLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzKys7CisJfQorCisJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgKytzKSB7CisJCWlmICghKG5ld19uYW1lID0gX2dlbmVyYXRlX3JhaWRfbmFtZShsdiwgInJpbWFnZSIsIHMpKSkKKwkJCXJldHVybl8wOworCQlsb2dfZGVidWdfbWV0YWRhdGEoIlJlbmFtaW5nICVzIHRvICVzIiwgc2VnX2x2KHNlZywgcyktPm5hbWUsIG5ld19uYW1lKTsKKwkJc2VnX2x2KHNlZywgcyktPm5hbWUgPSBuZXdfbmFtZTsKKwkJc2VnX2x2KHNlZywgcyktPnN0YXR1cyAmPSB+TUlSUk9SX0lNQUdFOworCQlzZWdfbHYoc2VnLCBzKS0+c3RhdHVzIHw9IFJBSURfSU1BR0U7CisJfQorCWluaXRfbWlycm9yX2luX3N5bmMoMSk7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIlNldHRpbmcgbmV3IHNlZ3R5cGUgZm9yICVzIiwgbHYtPm5hbWUpOworCXNlZy0+c2VndHlwZSA9IG5ld19zZWd0eXBlOworCWx2LT5zdGF0dXMgJj0gfk1JUlJPUjsKKwlsdi0+c3RhdHVzICY9IH5NSVJST1JFRDsKKwlsdi0+c3RhdHVzIHw9IFJBSUQ7CisJc2VnLT5zdGF0dXMgfD0gUkFJRDsKKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogQWxsIGFyZWFzIGZyb20gTFYgc2VnbWVudHMgYXJlIG1vdmVkIHRvIG5ldworICogc2VnbWVudHMgYWxsb2NhdGVkIHdpdGggYXJlYV9jb3VudD0xIGZvciBkYXRhX2x2cy4KKyAqLworc3RhdGljIGludCBfc3RyaXBlZF90b19yYWlkMF9tb3ZlX3NlZ3NfdG9fcmFpZDBfbHZzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCQkgICAgc3RydWN0IGRtX2xpc3QgKmRhdGFfbHZzKQoreworCXVpbnQzMl90IHMgPSAwLCBsZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmRsdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnX2Zyb20sICpzZWdfbmV3OworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwl1aW50NjRfdCBzdGF0dXM7CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU1RSSVBFRCkpKQorCQlyZXR1cm5fMDsKKworCS8qIE1vdmUgc2VnbWVudCBhcmVhcyBhY3Jvc3MgdG8gdGhlIE4gZGF0YSBMVnMgb2YgdGhlIG5ldyByYWlkMCBMViAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGRhdGFfbHZzKSAgeworCQlkbHYgPSBsdmwtPmx2OworCQlsZSA9IDA7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWdfZnJvbSwgJmx2LT5zZWdtZW50cykgeworCQkJc3RhdHVzID0gUkFJRCB8IFNFR19SQUlEIHwgKHNlZ19mcm9tLT5zdGF0dXMgJiAoTFZNX1JFQUQgfCBMVk1fV1JJVEUpKTsKKworCQkJLyogQWxsb2NhdGUgYSBkYXRhIExWIHNlZ21lbnQgd2l0aCBvbmUgYXJlYSBmb3IgZWFjaCBzZWdtZW50IGluIHRoZSBzdHJpcGVkIExWICovCisJCQlpZiAoIShzZWdfbmV3ID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBkbHYsCisJCQkJCQkJIGxlLCBzZWdfZnJvbS0+YXJlYV9sZW4sCisJCQkJCQkJIHN0YXR1cywKKwkJCQkJCQkgMCAvKiBzdHJpcGVfc2l6ZSAqLywgTlVMTCwgMSAvKiBhcmVhX2NvdW50ICovLAorCQkJCQkJCSBzZWdfZnJvbS0+YXJlYV9sZW4sCisJCQkJCQkJIDAgLyogY2h1bmtfc2l6ZSAqLywgMCAvKiByZWdpb25fc2l6ZSAqLywgMCwgTlVMTCkpKQorCQkJCXJldHVybl8wOworCisJCQlzZWdfdHlwZShzZWdfbmV3LCAwKSA9IEFSRUFfVU5BU1NJR05FRDsKKwkJCWRtX2xpc3RfYWRkKCZkbHYtPnNlZ21lbnRzLCAmc2VnX25ldy0+bGlzdCk7CisJCQlsZSArPSBzZWdfZnJvbS0+YXJlYV9sZW47CisKKwkJCS8qIE1vdmUgdGhlIHJlc3BlY3RpdmUgYXJlYSBhY3Jvc3MgdG8gb3VyIG5ldyBzZWdtZW50ICovCisJCQlpZiAoIW1vdmVfbHZfc2VnbWVudF9hcmVhKHNlZ19uZXcsIDAsIHNlZ19mcm9tLCBzKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCS8qIEFkanVzdCBsZSBjb3VudCBhbmQgTFYgc2l6ZSAqLworCQlkbHYtPmxlX2NvdW50ID0gbGU7CisJCWRsdi0+c2l6ZSA9ICh1aW50NjRfdCkgbGUgKiBsdi0+dmctPmV4dGVudF9zaXplOworCQlzKys7CisJfQorCisJLyogUmVtb3ZlIHRoZSBlbXB0eSBzZWdtZW50cyBmcm9tIHRoZSBzdHJpcGVkIExWICovCisJZG1fbGlzdF9pbml0KCZsdi0+c2VnbWVudHMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBzbWFsbGVzdCBhcmVhIGFjcm9zcyBhbGwgdGhlIHN1YkxWIHNlZ21lbnRzIGF0IGFyZWFfbGUuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfbWluX3N1Ymx2X2FyZWFfYXRfbGUoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgdWludDMyX3QgYXJlYV9sZSkKK3sKKwl1aW50MzJfdCBzLCBhcmVhX2xlbiA9IH4wVTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnMTsKKworCS8qIEZpbmQgc21hbGxlc3Qgc2VnbWVudCBvZiBlYWNoIG9mIHRoZSBkYXRhIGltYWdlIExWcyBhdCBvZmZzZXQgYXJlYV9sZSAqLworCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlpZiAoIShzZWcxID0gZmluZF9zZWdfYnlfbGUoc2VnX2x2KHNlZywgcyksIGFyZWFfbGUpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBzZWdtZW50IGZvciAlcyBleHRlbnQgJSIgUFJJdTMyLAorCQkJCSAgc2VnX2x2KHNlZywgcyktPm5hbWUsIGFyZWFfbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlhcmVhX2xlbiA9IG1pbihhcmVhX2xlbiwgc2VnMS0+bGVuKTsKKwl9CisKKwlyZXR1cm4gYXJlYV9sZW47Cit9CisvKgorICogQWxsIGFyZWFzIGZyb20gbHYgaW1hZ2UgY29tcG9uZW50IExWJ3Mgc2VnbWVudHMgYXJlCisgKiBiZWluZyBzcGxpdCBhdCAic3RyaXBlZCIgY29tcGF0aWJsZSBib3VuZGFyaWVzIGFuZAorICogbW92ZWQgdG8gYWxsb2NhdGVkIG5ld19zZWdtZW50cy4KKyAqCisgKiBUaGUgZGF0YSBjb21wb25lbnQgTFZzIGFyZSBtYXBwZWQgdG8gYW4KKyAqIGVycm9yIHRhcmdldCBhbmQgbGlua2VkIHRvIHJlbW92YWxfbHZzIGZvciBkaXNwb3NhbAorICogYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludCBfcmFpZDBfdG9fc3RyaXBlZF9yZXRyaWV2ZV9zZWdtZW50c19hbmRfbHZzKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKnJlbW92YWxfbHZzKQoreworCXVpbnQzMl90IHMsIGFyZWFfbGUsIGFyZWFfbGVuLCBsZTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqZGF0YV9zZWcgPSBOVUxMLCAqc2VnLCAqc2VnX3RvOworCXN0cnVjdCBkbV9saXN0IG5ld19zZWdtZW50czsKKworCXNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlkbV9saXN0X2luaXQoJm5ld19zZWdtZW50cyk7CisKKwkvKgorCSAqIFdhbGsgYWxsIHNlZ21lbnRzIG9mIGFsbCBkYXRhIExWcyBzcGxpdHRpbmcgdGhlbSB1cCBhdCBwcm9wZXIgYm91bmRhcmllcworCSAqIGFuZCBjcmVhdGUgdGhlIG51bWJlciBvZiBuZXcgc3RyaXBlZCBzZWdtZW50cyB3ZSBuZWVkIHRvIG1vdmUgdGhlbSBhY3Jvc3MKKwkgKi8KKwlhcmVhX2xlID0gbGUgPSAwOworCXdoaWxlIChsZSA8IGx2LT5sZV9jb3VudCkgeworCQlpZiAoIShhcmVhX2xlbiA9IF9taW5fc3VibHZfYXJlYV9hdF9sZShzZWcsIGFyZWFfbGUpKSkKKwkJCXJldHVybl8wOworCQlhcmVhX2xlICs9IGFyZWFfbGVuOworCisJCWlmICghX3NwbGl0X2FyZWFfbHZzX3NlZ21lbnRzKHNlZywgYXJlYV9sZSkgfHwKKwkJICAgICFfYWxsb2NfYW5kX2FkZF9uZXdfc3RyaXBlZF9zZWdtZW50KGx2LCBsZSwgYXJlYV9sZW4sICZuZXdfc2VnbWVudHMpKQorCQkJcmV0dXJuXzA7CisKKwkJbGUgPSBhcmVhX2xlICogc2VnLT5hcmVhX2NvdW50OworCX0KKworCS8qIE5vdyBtb3ZlIHRoZSBwcmVwYXJlZCBzcGxpdCBhcmVhcyBhY3Jvc3MgdG8gdGhlIG5ldyBzZWdtZW50cyAqLworCWFyZWFfbGUgPSAwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWdfdG8sICZuZXdfc2VnbWVudHMpIHsKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQlpZiAoIShkYXRhX3NlZyA9IGZpbmRfc2VnX2J5X2xlKHNlZ19sdihzZWcsIHMpLCBhcmVhX2xlKSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNlZ21lbnQgZm9yICVzIGV4dGVudCAlIiBQUkl1MzIsCisJCQkJCSAgc2VnX2x2KHNlZywgcyktPm5hbWUsIGFyZWFfbGUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBNb3ZlIHRoZSByZXNwZWN0aXZlIGFyZWEgYWNyb3NzIHRvIG91ciBuZXcgc2VnbWVudHMgYXJlYSAqLworCQkJaWYgKCFtb3ZlX2x2X3NlZ21lbnRfYXJlYShzZWdfdG8sIHMsIGRhdGFfc2VnLCAwKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCS8qIFByZXN1bWVzIGFsbCBkYXRhIExWcyBoYXZlIGVxdWFsIHNpemUgKi8KKwkJYXJlYV9sZSArPSBkYXRhX3NlZy0+bGVuOworCX0KKworCS8qIEV4dHJhY3QgYW55IG1ldGFkYXRhIExWcyBhbmQgdGhlIGVtcHR5IGRhdGEgTFZzIGZvciBkaXNwb3NhbCBieSB0aGUgY2FsbGVyICovCisJaWYgKCFfZXh0cmFjdF9pbWFnZV9jb21wb25lbnRfbGlzdChzZWcsIFJBSURfSU1BR0UsIDAsIHJlbW92YWxfbHZzKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgb25lIHNlZ21lbnQgaG9sZGluZyB0aGUgaW1hZ2UgY29tcG9uZW50IGFyZWFzCisJICogZnJvbSB0aGUgdG9wLWxldmVsIExWLCB0aGVuIGFkZCB0aGUgbmV3IHNlZ21lbnRzIHRvIGl0CisJICovCisJZG1fbGlzdF9kZWwoJnNlZy0+bGlzdCk7CisJZG1fbGlzdF9zcGxpY2UoJmx2LT5zZWdtZW50cywgJm5ld19zZWdtZW50cyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29udmVydF9yYWlkMF90b19zdHJpcGVkKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICBpbnQgdXBkYXRlX2FuZF9yZWxvYWQsCisJCQkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqcmVtb3ZhbF9sdnMpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwkvKiBSZW1vdmUgbWV0YWRhdGEgZGV2aWNlcyAqLworCWlmIChzZWdfaXNfcmFpZDBfbWV0YShzZWcpICYmCisJICAgICFfcmFpZDBfYWRkX29yX3JlbW92ZV9tZXRhZGF0YV9sdnMobHYsIDAgLyogdXBkYXRlX2FuZF9yZWxvYWQgKi8sIE5VTEwsIHJlbW92YWxfbHZzKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBNb3ZlIHRoZSBBUkVBX1BWIGFyZWFzIGFjcm9zcyB0byBuZXcgdG9wLWxldmVsIHNlZ21lbnRzIG9mIHR5cGUgInN0cmlwZWQiICovCisJaWYgKCFfcmFpZDBfdG9fc3RyaXBlZF9yZXRyaWV2ZV9zZWdtZW50c19hbmRfbHZzKGx2LCByZW1vdmFsX2x2cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgcmFpZDAgc2VnbWVudHMgZnJvbSAlcy4iLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWx2LT5zdGF0dXMgJj0gflJBSUQ7CisKKwlpZiAoIShzZWctPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCXJldHVybl8wOworCisJaWYgKHVwZGF0ZV9hbmRfcmVsb2FkKSB7CisJCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogRWxpbWluYXRlIHRoZSByZXNpZHVhbCBMVnMsIHdyaXRlIFZHLCBjb21taXQgaXQgYW5kIHRha2UgYSBiYWNrdXAgKi8KKwkJcmV0dXJuIF9lbGltaW5hdGVfZXh0cmFjdGVkX2x2cyhsdi0+dmcsIHJlbW92YWxfbHZzKTsKKwl9IAorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJbnNlcnRzIGhpZGRlbiBMVnMgZm9yIGFsbCBzZWdtZW50cyBhbmQgdGhlIHBhcmFsbGVsIGFyZWFzIGluIGx2IGFuZCBtb3ZlcyAKKyAqIGdpdmVuIHNlZ21lbnRzIGFuZCBhcmVhcyBhY3Jvc3MuCisgKgorICogT3B0aW9uYWxseSB1cGRhdGVzIG1ldGFkYXRhIGFuZCByZWxvYWRzIG1hcHBpbmdzLgorICovCitzdGF0aWMgc3RydWN0IGx2X3NlZ21lbnQgKl9jb252ZXJ0X3N0cmlwZWRfdG9fcmFpZDAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJCSAgICBpbnQgYWxsb2NfbWV0YWRhdGFfZGV2cywKKwkJCQkJCSAgICBpbnQgdXBkYXRlX2FuZF9yZWxvYWQsCisJCQkJCQkgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwl1aW50MzJfdCBhcmVhX2NvdW50LCBhcmVhX2xlbiA9IDAsIHN0cmlwZV9zaXplOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsICpyYWlkMF9zZWc7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwlzdHJ1Y3QgZG1fbGlzdCBkYXRhX2x2czsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWcsICZsdi0+c2VnbWVudHMpCisJCWFyZWFfbGVuICs9IHNlZy0+YXJlYV9sZW47CisKKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cmlwZV9zaXplID0gc2VnLT5zdHJpcGVfc2l6ZTsKKwlhcmVhX2NvdW50ID0gc2VnLT5hcmVhX2NvdW50OworCisJLyogQ2hlY2sgZm9yIG5vdCAoeWV0KSBzdXBwb3J0ZWQgdmFyeWluZyBhcmVhX2NvdW50IG9uIG11bHRpLXNlZ21lbnQgc3RyaXBlZCBMVnMgKi8KKwlpZiAoIWx2X2hhc19jb25zdGFudF9zdHJpcGVzKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjb252ZXJ0IHN0cmlwZWQgTFYgJXMgd2l0aCB2YXJ5aW5nIHN0cmlwZSBjb3VudCB0byByYWlkMCIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaXNfcG93ZXJfb2ZfMihzZWctPnN0cmlwZV9zaXplKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjb252ZXJ0IHN0cmlwZWQgTFYgJXMgd2l0aCBub24tcG93ZXIgb2YgMiBzdHJpcGUgc2l6ZSAldSIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgc2VnLT5zdHJpcGVfc2l6ZSk7CisJCS8vIGxvZ19lcnJvcigiUGxlYXNlIHVzZSBcImx2Y29udmVydCAtLWR1cGxpY2F0ZSAuLi5cIiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9mbGFnKGx2LT52Zy0+Y21kLCBTRUdfUkFJRDApKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBBbGxvY2F0ZSBlbXB0eSByaW1hZ2UgY29tcG9uZW50cyAqLworCWRtX2xpc3RfaW5pdCgmZGF0YV9sdnMpOworCWlmICghX2FsbG9jX2ltYWdlX2NvbXBvbmVudHMobHYsIE5VTEwsIGFyZWFfY291bnQsIE5VTEwsICZkYXRhX2x2cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZW1wdHkgaW1hZ2UgY29tcG9uZW50cyBmb3IgcmFpZDAgTFYgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogTW92ZSB0aGUgQVJFQV9QViBhcmVhcyBhY3Jvc3MgdG8gdGhlIG5ldyByaW1hZ2UgY29tcG9uZW50czsgZW1wdGllcyBsdi0+c2VnbWVudHMgKi8KKwlpZiAoIV9zdHJpcGVkX3RvX3JhaWQwX21vdmVfc2Vnc190b19yYWlkMF9sdnMobHYsICZkYXRhX2x2cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5zZXJ0IGxpbmVhciBMVnMgdW5kZXJuZWF0aCAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHNpbmdsZSBzZWdtZW50IHRvIGhvbGQgdGhlIGltYWdlIGNvbXBvbmVudAorCSAqIGFyZWFzIGJhc2VkIG9uIHRoZSBmaXJzdCBkYXRhIExWcyBwcm9wZXJ0aWVzIGRlcml2ZWQKKwkgKiBmcm9tIHRoZSBmaXJzdCBuZXcgcmFpZDAgTFZzIGZpcnN0IHNlZ21lbnQKKwkgKi8KKwlzZWcgPSBmaXJzdF9zZWcoZG1fbGlzdF9pdGVtKGRtX2xpc3RfZmlyc3QoJmRhdGFfbHZzKSwgc3RydWN0IGx2X2xpc3QpLT5sdik7CisJaWYgKCEocmFpZDBfc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdiwKKwkJCQkJICAgMCAvKiBsZSAqLywgbHYtPmxlX2NvdW50IC8qIGxlbiAqLywKKwkJCQkJICAgc2VnLT5zdGF0dXMgfCBTRUdfUkFJRCwKKwkJCQkJICAgc3RyaXBlX3NpemUsIE5VTEwgLyogbG9nX2x2ICovLAorCQkJCQkgICBhcmVhX2NvdW50LCBhcmVhX2xlbiwKKwkJCQkJICAgMCAvKiBjaHVua19zaXplICovLAorCQkJCQkgICAwIC8qIHNlZy0+cmVnaW9uX3NpemUgKi8sIDB1IC8qIGV4dGVudHNfY29waWVkICovICwKKwkJCQkJICAgTlVMTCAvKiBwdm1vdmVfc291cmNlX3NlZyAqLykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyByYWlkMCBzZWdlbWVudCBmb3IgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQWRkIG5ldyBzaW5nbGUgcmFpZDAgc2VnbWVudCB0byBlbXB0aWVkIExWIHNlZ21lbnRzIGxpc3QgKi8KKwlkbV9saXN0X2FkZCgmbHYtPnNlZ21lbnRzLCAmcmFpZDBfc2VnLT5saXN0KTsKKworCS8qIEFkZCBkYXRhIExWcyB0byB0aGUgdG9wLWxldmVsIExWcyBzZWdtZW50OyByZXNldHMgTFZfUkVCVUlMRCBmbGFnIG9uIHRoZW0gKi8KKwlpZiAoIV9hZGRfaW1hZ2VfY29tcG9uZW50X2xpc3QocmFpZDBfc2VnLCAxLCAwLCAmZGF0YV9sdnMsIDApKQorCQlyZXR1cm4gTlVMTDsKKworCWx2LT5zdGF0dXMgfD0gUkFJRDsKKworCS8qIEFsbG9jYXRlIG1ldGFkYXRhIExWcyBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAoYWxsb2NfbWV0YWRhdGFfZGV2cyAmJiAhX3JhaWQwX2FkZF9vcl9yZW1vdmVfbWV0YWRhdGFfbHZzKGx2LCAwLCBhbGxvY2F0ZV9wdnMsIE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1cGRhdGVfYW5kX3JlbG9hZCAmJiAhbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiByYWlkMF9zZWc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUQUtFT1ZFUl9GTl9BUkdTCQkJXAorCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCQlcCisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqbmV3X3NlZ3R5cGUsCVwKKwlpbnQgeWVzLAkJCQlcCisJaW50IGZvcmNlLAkJCQlcCisJdW5zaWduZWQgbmV3X2ltYWdlX2NvdW50LAkJXAorCWNvbnN0IHVuc2lnbmVkIG5ld19zdHJpcGVzLAkJXAorCXVpbnQzMl90IG5ld19zdHJpcGVfc2l6ZSwJCVwKKwlzdHJ1Y3QgZG1fbGlzdCAqYWxsb2NhdGVfcHZzCisKK3R5cGVkZWYgaW50ICgqdGFrZW92ZXJfZm5fdCkoVEFLRU9WRVJfRk5fQVJHUyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFVuc3VwcG9ydGVkIHRha2VvdmVyIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBfdGFrZW92ZXJfbm9vcChUQUtFT1ZFUl9GTl9BUkdTKQoreworCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgYWxyZWFkeSBvZiByZXF1ZXN0ZWQgdHlwZSAlcy4iLAorCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHZzZWdfbmFtZShmaXJzdF9zZWcobHYpKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfdW5zdXBwb3J0ZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlsb2dfZXJyb3IoIkNvbnZlcnRpbmcgdGhlIHNlZ21lbnQgdHlwZSBmb3IgJXMgZnJvbSAlcyB0byAlcyBpcyBub3Qgc3VwcG9ydGVkLiIsCisJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBsdnNlZ19uYW1lKGZpcnN0X3NlZyhsdikpLAorCQkgIChzZWd0eXBlX2lzX3N0cmlwZWQobmV3X3NlZ3R5cGUpICYmICFzZWd0eXBlX2lzX2FueV9yYWlkMChuZXdfc2VndHlwZSkgJiYKKwkJICAgKG5ld19zdHJpcGVzID09IDEpKSA/IFNFR19UWVBFX05BTUVfTElORUFSIDogbmV3X3NlZ3R5cGUtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCB1bnNpZ25lZCBuZXdfc3RyaXBlcywgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqbmV3X3NlZ3R5cGUpCit7CisJbG9nX2Vycm9yKCJDb252ZXJ0aW5nIHRoZSBzZWdtZW50IHR5cGUgZm9yICVzIGZyb20gJXMgdG8gJXMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIiwKKwkJICBkaXNwbGF5X2x2bmFtZShsdiksIGx2c2VnX25hbWUoZmlyc3Rfc2VnKGx2KSksCisJCSAgKHNlZ3R5cGVfaXNfc3RyaXBlZChuZXdfc2VndHlwZSkgJiYgIXNlZ3R5cGVfaXNfYW55X3JhaWQwKG5ld19zZWd0eXBlKSAmJgorCQkgICAobmV3X3N0cmlwZXMgPT0gMSkpID8gU0VHX1RZUEVfTkFNRV9MSU5FQVIgOiBuZXdfc2VndHlwZS0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpbGwgdGhpcyBwYXJ0aWN1bGFyIHRha2VvdmVyIGNvbWJpbmF0aW9uIGJlIHBvc3NpYmxlPworICovCitzdGF0aWMgaW50IF90YWtlb3Zlcl9ub3RfcG9zc2libGUodGFrZW92ZXJfZm5fdCB0YWtlb3Zlcl9mbikKK3sKKwlpZiAodGFrZW92ZXJfZm4gPT0gX3Rha2VvdmVyX25vb3AgfHwgdGFrZW92ZXJfZm4gPT0gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBXcmFwcGVyIGZ1bmN0aW9ucyB0aGF0IHNoYXJlIGNvbnZlcnNpb24gY29kZS4KKyAqLworCitzdGF0aWMgaW50IF9yYWlkMF9tZXRhX2NoYW5nZV93cmFwcGVyKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSwKKwkJCQkgICAgIHVpbnQzMl90IG5ld19zdHJpcGVzLAorCQkJCSAgICAgaW50IHllcywgaW50IGZvcmNlLCBpbnQgYWxsb2NfbWV0YWRhdGFfZGV2cywKKwkJCQkgICAgIHN0cnVjdCBkbV9saXN0ICphbGxvY2F0ZV9wdnMpCit7CisJc3RydWN0IGRtX2xpc3QgcmVtb3ZhbF9sdnM7CisKKwlkbV9saXN0X2luaXQoJnJlbW92YWxfbHZzKTsKKworCWlmICghX2NoZWNrX3Jlc3RyaXBpbmcobmV3X3N0cmlwZXMsIGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoYWxsb2NfbWV0YWRhdGFfZGV2cykKKwkJcmV0dXJuIF9yYWlkMF9hZGRfb3JfcmVtb3ZlX21ldGFkYXRhX2x2cyhsdiwgMSwgYWxsb2NhdGVfcHZzLCBOVUxMKTsKKwllbHNlCisJCXJldHVybiBfcmFpZDBfYWRkX29yX3JlbW92ZV9tZXRhZGF0YV9sdnMobHYsIDEsIGFsbG9jYXRlX3B2cywgJnJlbW92YWxfbHZzKTsKK30KKworc3RhdGljIGludCBfcmFpZDBfdG9fc3RyaXBlZF93cmFwcGVyKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSwKKwkJCQkgICAgIHVpbnQzMl90IG5ld19zdHJpcGVzLAorCQkJCSAgICAgaW50IHllcywgaW50IGZvcmNlLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCByZW1vdmFsX2x2czsKKworCWRtX2xpc3RfaW5pdCgmcmVtb3ZhbF9sdnMpOworCisJaWYgKCFfY2hlY2tfcmVzdHJpcGluZyhuZXdfc3RyaXBlcywgbHYpKQorCQlyZXR1cm5fMDsKKworCS8qIEFyY2hpdmUgbWV0YWRhdGEgKi8KKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRSB1cGRhdGVfYW5kX3JlbG9hZCBpcyBvbmx5IG5lZWRlZCBpZiB0aGUgTFYgaXMgYWxyZWFkeSBhY3RpdmUgKi8KKwkvKiBGSVhNRSBTb21lIG9mIHRoZSB2YWxpZGF0aW9uIGluIGhlcmUgbmVlZHMgbW92aW5nIGJlZm9yZSB0aGUgYXJjaGl2aW5nICovCisJaWYgKCFfY29udmVydF9yYWlkMF90b19zdHJpcGVkKGx2LCAxIC8qIHVwZGF0ZV9hbmRfcmVsb2FkICovLCAmcmVtb3ZhbF9sdnMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdHJpcGVkX3RvX3JhaWQwX3dyYXBwZXIoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKm5ld19zZWd0eXBlLAorCQkJCSAgICAgdWludDMyX3QgbmV3X3N0cmlwZXMsCisJCQkJICAgICBpbnQgeWVzLCBpbnQgZm9yY2UsIGludCBhbGxvY19tZXRhZGF0YV9kZXZzLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlpZiAoIV9jaGVja19yZXN0cmlwaW5nKG5ld19zdHJpcGVzLCBsdikpCisJCXJldHVybl8wOworCisJLyogQXJjaGl2ZSBtZXRhZGF0YSAqLworCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FIHVwZGF0ZV9hbmRfcmVsb2FkIGlzIG9ubHkgbmVlZGVkIGlmIHRoZSBMViBpcyBhbHJlYWR5IGFjdGl2ZSAqLworCS8qIEZJWE1FIFNvbWUgb2YgdGhlIHZhbGlkYXRpb24gaW4gaGVyZSBuZWVkcyBtb3ZpbmcgYmVmb3JlIHRoZSBhcmNoaXZpbmcgKi8KKwlpZiAoIV9jb252ZXJ0X3N0cmlwZWRfdG9fcmFpZDAobHYsIGFsbG9jX21ldGFkYXRhX2RldnMsIDEgLyogdXBkYXRlX2FuZF9yZWxvYWQgKi8sIGFsbG9jYXRlX3B2cykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDdXN0b21pc2VkIHRha2VvdmVyIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX2xpbmVhcl90b19yYWlkMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX2xpbmVhcl90b19yYWlkMShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX2xpbmVhcl90b19yYWlkMTAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9saW5lYXJfdG9fcmFpZDQ1KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9taXJyb3JlZF90b19yYWlkMF9tZXRhKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX2NvbnZlcnRfbWlycm9yX3RvX3JhaWQxKGx2LCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDEwKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDQ1KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fbGluZWFyKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fbWlycm9yZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fcmFpZDBfbWV0YShUQUtFT1ZFUl9GTl9BUkdTKQoreworCWlmICghX3JhaWQwX21ldGFfY2hhbmdlX3dyYXBwZXIobHYsIG5ld19zZWd0eXBlLCBuZXdfc3RyaXBlcywgeWVzLCBmb3JjZSwgMSwgYWxsb2NhdGVfcHZzKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMF90b19yYWlkMShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX3RvX3JhaWQxMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX3RvX3JhaWQ0NShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX3RvX3JhaWQ2KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fc3RyaXBlZChUQUtFT1ZFUl9GTl9BUkdTKQoreworCWlmICghX3JhaWQwX3RvX3N0cmlwZWRfd3JhcHBlcihsdiwgbmV3X3NlZ3R5cGUsIG5ld19zdHJpcGVzLCB5ZXMsIGZvcmNlLCBhbGxvY2F0ZV9wdnMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX21ldGFfdG9fbGluZWFyKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19taXJyb3JlZChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX21ldGFfdG9fcmFpZDAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlpZiAoIV9yYWlkMF9tZXRhX2NoYW5nZV93cmFwcGVyKGx2LCBuZXdfc2VndHlwZSwgbmV3X3N0cmlwZXMsIHllcywgZm9yY2UsIDAsIGFsbG9jYXRlX3B2cykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19yYWlkMShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwX21ldGFfdG9fcmFpZDEwKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19yYWlkNDUoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMF9tZXRhX3RvX3JhaWQ2KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19zdHJpcGVkKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJaWYgKCFfcmFpZDBfdG9fc3RyaXBlZF93cmFwcGVyKGx2LCBuZXdfc2VndHlwZSwgbmV3X3N0cmlwZXMsIHllcywgZm9yY2UsIGFsbG9jYXRlX3B2cykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDFfdG9fbGluZWFyKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDFfdG9fbWlycm9yZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMV90b19yYWlkMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQwX21ldGEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMV90b19yYWlkMShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQxMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQ0NShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3N0cmlwZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fbGluZWFyKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX21pcnJvcmVkKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3JhaWQwKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3JhaWQwX21ldGEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fcmFpZDEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fcmFpZDU0KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3JhaWQ2KFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3N0cmlwZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNl90b19yYWlkMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQ2X3RvX3JhaWQwX21ldGEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNl90b19yYWlkNDUoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkNl90b19zdHJpcGVkKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fc3RyaXBlZF90b19yYWlkMChUQUtFT1ZFUl9GTl9BUkdTKQoreworCWlmICghX3N0cmlwZWRfdG9fcmFpZDBfd3JhcHBlcihsdiwgbmV3X3NlZ3R5cGUsIG5ld19zdHJpcGVzLCB5ZXMsIGZvcmNlLCAwLCBhbGxvY2F0ZV9wdnMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3N0cmlwZWRfdG9fcmFpZDAxKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fc3RyaXBlZF90b19yYWlkMF9tZXRhKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJaWYgKCFfc3RyaXBlZF90b19yYWlkMF93cmFwcGVyKGx2LCBuZXdfc2VndHlwZSwgbmV3X3N0cmlwZXMsIHllcywgZm9yY2UsIDEsIGFsbG9jYXRlX3B2cykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fc3RyaXBlZF90b19yYWlkMTAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9zdHJpcGVkX3RvX3JhaWQ0NShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3N0cmlwZWRfdG9fcmFpZDYoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworLyoKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDAxX3RvX3JhaWQwMShUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQwMV90b19yYWlkMTAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMDFfdG9fc3RyaXBlZChUQUtFT1ZFUl9GTl9BUkdTKQoreworCXJldHVybiBfdGFrZW92ZXJfdW5zdXBwb3J0ZWRfeWV0KGx2LCBuZXdfc3RyaXBlcywgbmV3X3NlZ3R5cGUpOworfQorCitzdGF0aWMgaW50IF90YWtlb3Zlcl9mcm9tX3JhaWQxMF90b19saW5lYXIoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fbWlycm9yZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fcmFpZDAoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fcmFpZDAxKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3JhaWQwX21ldGEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fcmFpZDEoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKworc3RhdGljIGludCBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fcmFpZDEwKFRBS0VPVkVSX0ZOX0FSR1MpCit7CisJcmV0dXJuIF90YWtlb3Zlcl91bnN1cHBvcnRlZF95ZXQobHYsIG5ld19zdHJpcGVzLCBuZXdfc2VndHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3N0cmlwZWQoVEFLRU9WRVJfRk5fQVJHUykKK3sKKwlyZXR1cm4gX3Rha2VvdmVyX3Vuc3VwcG9ydGVkX3lldChsdiwgbmV3X3N0cmlwZXMsIG5ld19zZWd0eXBlKTsKK30KKyovCisKKy8qCisgKiBJbXBvcnQgdGFrZW92ZXIgbWF0cml4LgorICovCisjaW5jbHVkZSAidGFrZW92ZXJfbWF0cml4LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBfc2VndHlwZV9peChjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLCB1aW50MzJfdCBhcmVhX2NvdW50KQoreworCWludCBpID0gMiwgajsKKworCS8qIExpbmVhciBzcGVjaWFsIGNhc2UgKi8KKwlpZiAoc2VndHlwZV9pc19zdHJpcGVkKHNlZ3R5cGUpICYmICFzZWd0eXBlX2lzX2FueV9yYWlkMChzZWd0eXBlKSkgeworCQlpZiAoYXJlYV9jb3VudCA9PSAxKQorCQkJcmV0dXJuIDA7CS8qIGxpbmVhciAqLworCQlyZXR1cm4gMTsJLyogc3RyaXBlZCAqLworCX0KKworCXdoaWxlICgoaiA9IF9zZWd0eXBlX2luZGV4W2krK10pKQorCQlpZiAoc2VndHlwZS0+ZmxhZ3MgJiBqKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gKGkgLSAxKTsKK30KKworLyogQ2FsbCBhcHByb3ByaWF0ZSB0YWtlb3ZlciBmdW5jdGlvbiAqLworc3RhdGljIHRha2VvdmVyX2ZuX3QgX2dldF90YWtlb3Zlcl9mbihjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSwgdW5zaWduZWQgbmV3X2ltYWdlX2NvdW50KQoreworCXJldHVybiBfdGFrZW92ZXJfZm5zW19zZWd0eXBlX2l4KHNlZy0+c2VndHlwZSwgc2VnLT5hcmVhX2NvdW50KV1bX3NlZ3R5cGVfaXgobmV3X3NlZ3R5cGUsIG5ld19pbWFnZV9jb3VudCldOworfQorCisvKiBOdW1iZXIgb2YgZGF0YSAobm90IHBhcml0eSkgcmltYWdlcyAqLworc3RhdGljIHVpbnQzMl90IF9kYXRhX3JpbWFnZXNfY291bnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY29uc3QgdWludDMyX3QgdG90YWxfcmltYWdlcykKK3sKKwlyZXR1cm4gdG90YWxfcmltYWdlcyAtIHNlZy0+c2VndHlwZS0+cGFyaXR5X2RldnM7Cit9CisKKy8qCisgKiBsdl9yYWlkX2NvbnZlcnQKKyAqCisgKiBDb252ZXJ0IGFuIExWIGZyb20gb25lIFJBSUQgdHlwZSAob3IgJ21pcnJvcicgc2VndHlwZSkgdG8gYW5vdGhlci4KKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZQorICovCitpbnQgbHZfcmFpZF9jb252ZXJ0KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSwKKwkJICAgIGludCB5ZXMsIGludCBmb3JjZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIG5ld19zdHJpcGVzLAorCQkgICAgY29uc3QgdW5zaWduZWQgbmV3X3N0cmlwZV9zaXplLAorCQkgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKwl1aW50MzJfdCBzdHJpcGVzLCBzdHJpcGVfc2l6ZTsKKwl1aW50MzJfdCBuZXdfaW1hZ2VfY291bnQgPSBzZWctPmFyZWFfY291bnQ7CisJdGFrZW92ZXJfZm5fdCB0YWtlb3Zlcl9mbjsKKworCWlmICghbmV3X3NlZ3R5cGUpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJOZXcgc2VndHlwZSBub3Qgc3BlY2lmaWVkIik7CisJCXJldHVybiAwOworCX0KKworCXN0cmlwZXMgPSBuZXdfc3RyaXBlcyA/OiBfZGF0YV9yaW1hZ2VzX2NvdW50KHNlZywgc2VnLT5hcmVhX2NvdW50KTsKKworCWlmIChzZWd0eXBlX2lzX3N0cmlwZWQobmV3X3NlZ3R5cGUpKQorCQluZXdfaW1hZ2VfY291bnQgPSBzdHJpcGVzOworCisJaWYgKHNlZ3R5cGVfaXNfcmFpZChuZXdfc2VndHlwZSkgJiYgIV9jaGVja19tYXhfcmFpZF9kZXZpY2VzKG5ld19pbWFnZV9jb3VudCkpCisJCXJldHVybl8wOworCisJLyogRklYTUUgRW5zdXJlIGNhbGxlciBkb2VzICpub3QqIHNldCB3cm9uZyBkZWZhdWx0IHZhbHVlISAqLworCS8qIERlZmluZSBuZXcgc3RyaXBlIHNpemUgaWYgbm90IHBhc3NlZCBpbiAqLworCXN0cmlwZV9zaXplID0gbmV3X3N0cmlwZV9zaXplID86IHNlZy0+c3RyaXBlX3NpemU7CisKKwl0YWtlb3Zlcl9mbiA9IF9nZXRfdGFrZW92ZXJfZm4oZmlyc3Rfc2VnKGx2KSwgbmV3X3NlZ3R5cGUsIG5ld19pbWFnZV9jb3VudCk7CisKKwkvKiBFeGl0IHdpdGhvdXQgZG9pbmcgYWN0aXZhdGlvbiBjaGVja3MgaWYgdGhlIGNvbWJpbmF0aW9uIGlzbid0IHBvc3NpYmxlICovCisJaWYgKF90YWtlb3Zlcl9ub3RfcG9zc2libGUodGFrZW92ZXJfZm4pKQorCQlyZXR1cm4gdGFrZW92ZXJfZm4obHYsIG5ld19zZWd0eXBlLCB5ZXMsIGZvcmNlLCBuZXdfaW1hZ2VfY291bnQsIG5ld19zdHJpcGVzLCBzdHJpcGVfc2l6ZSwgYWxsb2NhdGVfcHZzKTsKKworCWxvZ192ZXJib3NlKCJDb252ZXJ0aW5nICVzIGZyb20gJXMgdG8gJXMuIiwKKwkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHZzZWdfbmFtZShmaXJzdF9zZWcobHYpKSwKKwkJICAgIChzZWd0eXBlX2lzX3N0cmlwZWQobmV3X3NlZ3R5cGUpICYmICFzZWd0eXBlX2lzX2FueV9yYWlkMChuZXdfc2VndHlwZSkgJiYKKwkJICAgIChuZXdfc3RyaXBlcyA9PSAxKSkgPyBTRUdfVFlQRV9OQU1FX0xJTkVBUiA6IG5ld19zZWd0eXBlLT5uYW1lKTsKKworCS8qIEZJWE1FIElmIG5vdCBhY3RpdmUsIHByb21wdCBhbmQgYWN0aXZhdGUgKi8KKwkvKiBGSVhNRSBTb21lIG9wZXJhdGlvbnMgZG8gbm90IHJlcXVpcmUgdGhlIExWIHRvIGJlIGFjdGl2ZSAqLworCS8qIExWIG11c3QgYmUgYWN0aXZlIHRvIHBlcmZvcm0gcmFpZCBjb252ZXJzaW9uIG9wZXJhdGlvbnMgKi8KKwlpZiAoIWx2X2lzX2FjdGl2ZShsdikpIHsKKwkJbG9nX2Vycm9yKCIlcyBtdXN0IGJlIGFjdGl2ZSB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEluIGNsdXN0ZXJlZCBWR3MsIHRoZSBMViBtdXN0IGJlIGFjdGl2ZSBvbiB0aGlzIG5vZGUgZXhjbHVzaXZlbHkuICovCisJaWYgKHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpICYmICFsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkobHYpKSB7CisJCWxvZ19lcnJvcigiJXMgbXVzdCBiZSBhY3RpdmUgZXhjbHVzaXZlIGxvY2FsbHkgdG8gIgorCQkJICAicGVyZm9ybSB0aGlzIG9wZXJhdGlvbi4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMViBtdXN0IGJlIGluIHN5bmMuICovCisJaWYgKCFfcmFpZF9pbl9zeW5jKGx2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHdoaWxlIGl0IGlzIG5vdCBpbi1zeW5jIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHRha2VvdmVyX2ZuKGx2LCBuZXdfc2VndHlwZSwgeWVzLCBmb3JjZSwgbmV3X2ltYWdlX2NvdW50LCBuZXdfc3RyaXBlcywgc3RyaXBlX3NpemUsIGFsbG9jYXRlX3B2cyk7Cit9CisKK3N0YXRpYyBpbnQgX3JlbW92ZV9wYXJ0aWFsX211bHRpX3NlZ21lbnRfaW1hZ2Uoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgICAgIHN0cnVjdCBkbV9saXN0ICpyZW1vdmVfcHZzKQoreworCXVpbnQzMl90IHMsIGV4dGVudHNfbmVlZGVkOworCXN0cnVjdCBsdl9zZWdtZW50ICpybV9zZWcsICpyYWlkX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpybV9pbWFnZSA9IE5VTEw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisKKwlpZiAoIWx2X2lzX3BhcnRpYWwobHYpKQorCQlyZXR1cm5fMDsKKworCWZvciAocyA9IDA7IHMgPCByYWlkX3NlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCWV4dGVudHNfbmVlZGVkID0gMDsKKwkJaWYgKGx2X2lzX3BhcnRpYWwoc2VnX2x2KHJhaWRfc2VnLCBzKSkgJiYKKwkJICAgIGx2X2lzX29uX3B2cyhzZWdfbHYocmFpZF9zZWcsIHMpLCByZW1vdmVfcHZzKSAmJgorCQkgICAgKGRtX2xpc3Rfc2l6ZSgmKHNlZ19sdihyYWlkX3NlZywgcyktPnNlZ21lbnRzKSkgPiAxKSkgeworCQkJcm1faW1hZ2UgPSBzZWdfbHYocmFpZF9zZWcsIHMpOworCisJCQkvKiBGaXJzdCwgaG93IG1hbnkgZGFtYWdlZCBleHRlbnRzIGFyZSB0aGVyZSAqLworCQkJaWYgKGx2X2lzX3BhcnRpYWwoc2VnX21ldGFsdihyYWlkX3NlZywgcykpKQorCQkJCWV4dGVudHNfbmVlZGVkICs9IHNlZ19tZXRhbHYocmFpZF9zZWcsIHMpLT5sZV9jb3VudDsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhybV9zZWcsICZybV9pbWFnZS0+c2VnbWVudHMpIHsKKwkJCQkvKgorCQkJCSAqIHNlZ21lbnQgYXJlYXMgYXJlIGZvciBzdHJpcGUsIG1pcnJvciwgcmFpZCwKKwkJCQkgKiBldGMuICBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGFyZWEKKwkJCQkgKiBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIFJBSUQgaW1hZ2UgTFZzLgorCQkJCSAqLworCQkJCWlmIChzZWdfdHlwZShybV9zZWcsIDApICE9IEFSRUFfUFYpCisJCQkJCWNvbnRpbnVlOworCQkJCXB2ID0gc2VnX3B2KHJtX3NlZywgMCk7CisJCQkJaWYgKHB2LT5zdGF0dXMgJiBNSVNTSU5HX1BWKQorCQkJCQlleHRlbnRzX25lZWRlZCArPSBybV9zZWctPmxlbjsKKwkJCX0KKwkJCWxvZ19kZWJ1ZygiJXUgZXh0ZW50cyBuZWVkZWQgdG8gcmVwYWlyICVzIiwKKwkJCQkgIGV4dGVudHNfbmVlZGVkLCBybV9pbWFnZS0+bmFtZSk7CisKKwkJCS8qIFNlY29uZCwgZG8gdGhlIG90aGVyIFBWcyBoYXZlIHRoZSBzcGFjZSAqLworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJtX3NlZywgJnJtX2ltYWdlLT5zZWdtZW50cykgeworCQkJCWlmIChzZWdfdHlwZShybV9zZWcsIDApICE9IEFSRUFfUFYpCisJCQkJCWNvbnRpbnVlOworCQkJCXB2ID0gc2VnX3B2KHJtX3NlZywgMCk7CisJCQkJaWYgKHB2LT5zdGF0dXMgJiBNSVNTSU5HX1BWKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmICgocHYtPnBlX2NvdW50IC0gcHYtPnBlX2FsbG9jX2NvdW50KSA+CisJCQkJICAgIGV4dGVudHNfbmVlZGVkKSB7CisJCQkJCWxvZ19kZWJ1ZygiJXMgaGFzIGVub3VnaCBzcGFjZSBmb3IgJXMiLAorCQkJCQkJICBwdl9kZXZfbmFtZShwdiksCisJCQkJCQkgIHJtX2ltYWdlLT5uYW1lKTsKKwkJCQkJZ290byBoYXNfZW5vdWdoX3NwYWNlOworCQkJCX0KKwkJCQlsb2dfZGVidWcoIk5vdCBlbm91Z2ggc3BhY2Ugb24gJXMgZm9yICVzIiwKKwkJCQkJICBwdl9kZXZfbmFtZShwdiksIHJtX2ltYWdlLT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogVGhpcyBpcyBsaWtlbHkgdG8gYmUgdGhlIG5vcm1hbCBjYXNlIC0gc2luZ2xlCisJICogc2VnbWVudCBpbWFnZXMuCisJICovCisJcmV0dXJuXzA7CisKK2hhc19lbm91Z2hfc3BhY2U6CisJLyoKKwkgKiBOb3cgd2UgaGF2ZSBhIG11bHRpLXNlZ21lbnQsIHBhcnRpYWwgaW1hZ2UgdGhhdCBoYXMgZW5vdWdoCisJICogc3BhY2Ugb24ganVzdCBvbmUgb2YgaXRzIFBWcyBmb3IgdGhlIGVudGlyZSBpbWFnZSB0byBiZQorCSAqIHJlcGxhY2VkLiAgU28sIHdlIHJlcGxhY2UgdGhlIGltYWdlJ3Mgc3BhY2Ugd2l0aCBhbiBlcnJvcgorCSAqIHRhcmdldCBzbyB0aGF0IHRoZSBhbGxvY2F0b3IgY2FuIGZpbmQgdGhhdCBzcGFjZSAoYWxvbmcgd2l0aAorCSAqIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSkgaW4gb3JkZXIgdG8gYWxsb2NhdGUgdGhlIGltYWdlCisJICogYW5ldy4KKwkgKi8KKwlpZiAoIXJlcGxhY2VfbHZfd2l0aF9lcnJvcl9zZWdtZW50KHJtX2ltYWdlKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGx2X3JhaWRfcmVwbGFjZQorICogQGx2CisgKiBAcmVtb3ZlX3B2cworICogQGFsbG9jYXRlX3B2cworICoKKyAqIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBQVnMuCisgKi8KK2ludCBsdl9yYWlkX3JlcGxhY2Uoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICpyZW1vdmVfcHZzLAorCQkgICAgc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRlX3B2cykKK3sKKwlpbnQgcGFydGlhbF9zZWdtZW50X3JlbW92ZWQgPSAwOworCXVpbnQzMl90IHMsIHNkLCBtYXRjaF9jb3VudCA9IDA7CisJc3RydWN0IGRtX2xpc3Qgb2xkX2x2czsKKwlzdHJ1Y3QgZG1fbGlzdCBuZXdfbWV0YV9sdnMsIG5ld19kYXRhX2x2czsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqcmFpZF9zZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJY2hhciAqdG1wX25hbWVzW3JhaWRfc2VnLT5hcmVhX2NvdW50ICogMl07CisKKwlpZiAoc2VnX2lzX2FueV9yYWlkMChyYWlkX3NlZykpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCByZXBsYWNlIGFueSBkZXZpY2VzIGluICVzIExWICVzIiwKKwkJCSAgbHZzZWdfbmFtZShyYWlkX3NlZyksIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaW5pdCgmb2xkX2x2cyk7CisJZG1fbGlzdF9pbml0KCZuZXdfbWV0YV9sdnMpOworCWRtX2xpc3RfaW5pdCgmbmV3X2RhdGFfbHZzKTsKKworCWlmIChsdl9pc19wYXJ0aWFsKGx2KSkKKwkJbHYtPnZnLT5jbWQtPnBhcnRpYWxfYWN0aXZhdGlvbiA9IDE7CisKKwlpZiAoIWx2X2lzX2FjdGl2ZV9leGNsdXNpdmVfbG9jYWxseShsdl9sb2NrX2hvbGRlcihsdikpKSB7CisJCWxvZ19lcnJvcigiJXMvJXMgbXVzdCBiZSBhY3RpdmUgJXN0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLiIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsCisJCQkgIHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpID8gImV4Y2x1c2l2ZSBsb2NhbGx5ICIgOiAiIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghbWlycm9yX2luX3N5bmMoKSAmJiAhX3JhaWRfaW5fc3luYyhsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVwbGFjZSBkZXZpY2VzIGluICVzLyVzIHdoaWxlIGl0IGlzIgorCQkJICAiIG5vdCBpbi1zeW5jLiIsIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIEhvdyBtYW55IHN1Yi1MVnMgYXJlIGJlaW5nIHJlbW92ZWQ/CisJICovCisJZm9yIChzID0gMDsgcyA8IHJhaWRfc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKChzZWdfdHlwZShyYWlkX3NlZywgcykgPT0gQVJFQV9VTkFTU0lHTkVEKSB8fAorCQkgICAgKHNlZ19tZXRhdHlwZShyYWlkX3NlZywgcykgPT0gQVJFQV9VTkFTU0lHTkVEKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVwbGFjZSBSQUlEIGltYWdlcyB3aGlsZSB0aGUgIgorCQkJCSAgImFycmF5IGhhcyB1bmFzc2lnbmVkIGFyZWFzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChsdl9pc192aXJ0dWFsKHNlZ19sdihyYWlkX3NlZywgcykpIHx8CisJCSAgICBsdl9pc192aXJ0dWFsKHNlZ19tZXRhbHYocmFpZF9zZWcsIHMpKSB8fAorCQkgICAgbHZfaXNfb25fcHZzKHNlZ19sdihyYWlkX3NlZywgcyksIHJlbW92ZV9wdnMpIHx8CisJCSAgICBsdl9pc19vbl9wdnMoc2VnX21ldGFsdihyYWlkX3NlZywgcyksIHJlbW92ZV9wdnMpKQorCQkJbWF0Y2hfY291bnQrKzsKKwl9CisKKwlpZiAoIW1hdGNoX2NvdW50KSB7CisJCWxvZ192ZXJib3NlKCIlcy8lcyBkb2VzIG5vdCBjb250YWluIGRldmljZXMgc3BlY2lmaWVkIgorCQkJICAgICIgZm9yIHJlcGxhY2VtZW50IiwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAobWF0Y2hfY291bnQgPT0gcmFpZF9zZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVtb3ZlIGFsbCBQVnMgZnJvbSAlcy8lcyBhdCBvbmNlLiIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHJhaWRfc2VnLT5zZWd0eXBlLT5wYXJpdHlfZGV2cyAmJgorCQkgICAobWF0Y2hfY291bnQgPiByYWlkX3NlZy0+c2VndHlwZS0+cGFyaXR5X2RldnMpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlcGxhY2UgbW9yZSB0aGFuICV1IFBWcyBmcm9tICglcykgJXMvJXMiLAorCQkJICByYWlkX3NlZy0+c2VndHlwZS0+cGFyaXR5X2RldnMsCisJCQkgIGx2c2VnX25hbWUocmFpZF9zZWcpLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChzZWdfaXNfcmFpZDEwKHJhaWRfc2VnKSkgeworCQl1aW50MzJfdCBpLCByZWJ1aWxkc19wZXJfZ3JvdXAgPSAwOworCQkvKiBGSVhNRTogV2Ugb25seSBzdXBwb3J0IDItd2F5IG1pcnJvcnMgaW4gUkFJRDEwIGN1cnJlbnRseSAqLworCQl1aW50MzJfdCBjb3BpZXMgPSAyOworCisJCWZvciAoaSA9IDA7IGkgPCByYWlkX3NlZy0+YXJlYV9jb3VudCAqIGNvcGllczsgaSsrKSB7CisJCQlzID0gaSAlIHJhaWRfc2VnLT5hcmVhX2NvdW50OworCQkJaWYgKCEoaSAlIGNvcGllcykpCisJCQkJcmVidWlsZHNfcGVyX2dyb3VwID0gMDsKKwkJCWlmIChsdl9pc19vbl9wdnMoc2VnX2x2KHJhaWRfc2VnLCBzKSwgcmVtb3ZlX3B2cykgfHwKKwkJCSAgICBsdl9pc19vbl9wdnMoc2VnX21ldGFsdihyYWlkX3NlZywgcyksIHJlbW92ZV9wdnMpIHx8CisJCQkgICAgbHZfaXNfdmlydHVhbChzZWdfbHYocmFpZF9zZWcsIHMpKSB8fAorCQkJICAgIGx2X2lzX3ZpcnR1YWwoc2VnX21ldGFsdihyYWlkX3NlZywgcykpKQorCQkJCXJlYnVpbGRzX3Blcl9ncm91cCsrOworCQkJaWYgKHJlYnVpbGRzX3Blcl9ncm91cCA+PSBjb3BpZXMpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZXBsYWNlIGFsbCB0aGUgZGV2aWNlcyAiCisJCQkJCSAgImluIGEgUkFJRDEwIG1pcnJvciBncm91cC4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFByZXZlbnQgYW55IFBWcyBob2xkaW5nIGltYWdlIGNvbXBvbmVudHMgZnJvbSBiZWluZyB1c2VkIGZvciBhbGxvY2F0aW9uICovCisJaWYgKCFfYXZvaWRfcHZzX3dpdGhfb3RoZXJfaW1hZ2VzX29mX2x2KGx2LCBhbGxvY2F0ZV9wdnMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHByZXZlbnQgUFZzIGhvbGRpbmcgaW1hZ2UgY29tcG9uZW50cyAiCisJCQkgICJmcm9tIGJlaW5nIHVzZWQgZm9yIGFsbG9jYXRpb24uIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlIG5ldyBpbWFnZSBjb21wb25lbnRzIGZpcnN0CisJICogLSBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gYXZvaWQgYWxsIGN1cnJlbnRseSB1c2VkIGRldnMKKwkgKiAtIFdlIGNhbiBpbW1lZGlhdGVseSB0ZWxsIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZQorCSAqCisJICogLSBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTFYgbmFtZXMgd2hlbiB3ZSBpbnNlcnQgdGhlbS4KKwkgKi8KK3RyeV9hZ2FpbjoKKwlpZiAoIV9hbGxvY19pbWFnZV9jb21wb25lbnRzKGx2LCBhbGxvY2F0ZV9wdnMsIG1hdGNoX2NvdW50LAorCQkJCSAgICAgJm5ld19tZXRhX2x2cywgJm5ld19kYXRhX2x2cykpIHsKKwkJaWYgKCFsdl9pc19wYXJ0aWFsKGx2KSkgeworCQkJbG9nX2Vycm9yKCJMViAlcyBpbiBub3QgcGFydGlhbC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBUaGlzIGlzIGEgcmVwYWlyLCBzbyB0cnkgdG8gZG8gYmV0dGVyIHRoYW4gYWxsLW9yLW5vdGhpbmcgKi8KKwkJbWF0Y2hfY291bnQtLTsKKwkJaWYgKG1hdGNoX2NvdW50ID4gMCkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVwbGFjZSAldSBkZXZpY2VzLiIKKwkJCQkgICIgIEF0dGVtcHRpbmcgdG8gcmVwbGFjZSAldSBpbnN0ZWFkLiIsCisJCQkJICBtYXRjaF9jb3VudCwgbWF0Y2hfY291bnQrMSk7CisJCQkvKgorCQkJICogU2luY2Ugd2UgYXJlIHJlcGxhY2luZyBzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSBiYWQKKwkJCSAqIGRldmljZXMsIHdlIG11c3Qgc2V0IHBhcnRpYWxfYWN0aXZhdGlvbgorCQkJICovCisJCQlsdi0+dmctPmNtZC0+cGFydGlhbF9hY3RpdmF0aW9uID0gMTsKKwkJCWdvdG8gdHJ5X2FnYWluOworCQl9IGVsc2UgaWYgKCFtYXRjaF9jb3VudCAmJiAhcGFydGlhbF9zZWdtZW50X3JlbW92ZWQpIHsKKwkJCS8qCisJCQkgKiBXZSBhcmUgZG93biB0byB0aGUgbGFzdCBzdHJhdy4gIFdlIGNhbiBvbmx5IGhvcGUKKwkJCSAqIHRoYXQgYSBmYWlsZWQgUFYgaXMganVzdCBvbmUgb2Ygc2V2ZXJhbCBQVnMgaW4KKwkJCSAqIHRoZSBpbWFnZTsgYW5kIGlmIHdlIGV4dHJhY3QgdGhlIGltYWdlLCB0aGVyZSBtYXkKKwkJCSAqIGJlIGVub3VnaCByb29tIG9uIHRoZSBpbWFnZSdzIG90aGVyIFBWcyBmb3IgYQorCQkJICogcmVhbGxvY2F0aW9uIG9mIHRoZSBpbWFnZS4KKwkJCSAqLworCQkJaWYgKCFfcmVtb3ZlX3BhcnRpYWxfbXVsdGlfc2VnbWVudF9pbWFnZShsdiwgcmVtb3ZlX3B2cykpCisJCQkJcmV0dXJuXzA7CisKKwkJCW1hdGNoX2NvdW50ID0gMTsKKwkJCXBhcnRpYWxfc2VnbWVudF9yZW1vdmVkID0gMTsKKwkJCWx2LT52Zy0+Y21kLT5wYXJ0aWFsX2FjdGl2YXRpb24gPSAxOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVwbGFjZW1lbnQgaW1hZ2VzIGZvciAlcy8lcyIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUmVtb3ZlIHRoZSBvbGQgaW1hZ2VzCisJICogLSBJZiB3ZSBkaWQgdGhpcyBiZWZvcmUgdGhlIGFsbG9jYXRlLCB3ZSB3b3VsZG4ndCBoYXZlIHRvIHJlbmFtZQorCSAqICAgdGhlIGFsbG9jYXRlZCBpbWFnZXMsIGJ1dCBpdCdkIGJlIG11Y2ggaGFyZGVyIHRvIGF2b2lkIHRoZSByaWdodAorCSAqICAgUFZzIGR1cmluZyBhbGxvY2F0aW9uLgorCSAqCisJICogLSBJZiB0aGlzIGlzIGEgcmVwYWlyIGFuZCB3ZSB3ZXJlIGZvcmNlZCB0byBjYWxsCisJICogICBfcmVtb3ZlX3BhcnRpYWxfbXVsdGlfc2VnbWVudF9pbWFnZSwgdGhlbiB0aGUgcmVtb3ZlX3B2cyBsaXN0CisJICogICBpcyBubyBsb25nZXIgcmVsZXZhbnQgLSBfcmFpZF9leHRyYWN0X2ltYWdlcyBpcyBmb3JjZWQgdG8gcmVwbGFjZQorCSAqICAgdGhlIGltYWdlIHdpdGggdGhlIGVycm9yIHRhcmdldC4gIFRodXMsIHRoZSBmdWxsIHNldCBvZiBQVnMgaXMKKwkgKiAgIHN1cHBsaWVkIC0ga25vd2luZyB0aGF0IG9ubHkgdGhlIGltYWdlIHdpdGggdGhlIGVycm9yIHRhcmdldAorCSAqICAgd2lsbCBiZSBhZmZlY3RlZC4KKwkgKi8KKwlpZiAoIV9yYWlkX2V4dHJhY3RfaW1hZ2VzKGx2LCByYWlkX3NlZy0+YXJlYV9jb3VudCAtIG1hdGNoX2NvdW50LAorCQkJCSAgcGFydGlhbF9zZWdtZW50X3JlbW92ZWQgPworCQkJCSAgJmx2LT52Zy0+cHZzIDogcmVtb3ZlX3B2cywgMCwKKwkJCQkgICZvbGRfbHZzLCAmb2xkX2x2cykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgaW1hZ2VzIGZyb20gJXMvJXMiLAorCQkJICBsdi0+dmctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB0aGV5IGFyZSBleHRyYWN0ZWQgYW5kIHZpc2libGUsIG1ha2UgdGhlIHN5c3RlbSBhd2FyZQorCSAqIG9mIHRoZWlyIG5ldyBuYW1lcy4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmb2xkX2x2cykKKwkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGx2LT52Zy0+Y21kLCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCisJLyoKKwkgKiBTa2lwIG1ldGFkYXRhIG9wZXJhdGlvbiBub3JtYWxseSBkb25lIHRvIGNsZWFyIHRoZSBtZXRhZGF0YSBzdWItTFZzLgorCSAqCisJICogVGhlIExWX1JFQlVJTEQgZmxhZyBpcyBzZXQgb24gdGhlIG5ldyBzdWItTFZzLAorCSAqIHNvIHRoZXkgd2lsbCBiZSByZWJ1aWx0IGFuZCB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIHRoZSBtZXRhZGF0YSBkZXYuCisJICovCisKKwlmb3IgKHMgPSAwOyBzIDwgcmFpZF9zZWctPmFyZWFfY291bnQ7IHMrKykgeworCQlzZCA9IHMgKyByYWlkX3NlZy0+YXJlYV9jb3VudDsKKworCQlpZiAoKHNlZ190eXBlKHJhaWRfc2VnLCBzKSA9PSBBUkVBX1VOQVNTSUdORUQpICYmCisJCSAgICAoc2VnX21ldGF0eXBlKHJhaWRfc2VnLCBzKSA9PSBBUkVBX1VOQVNTSUdORUQpKSB7CisJCQkvKiBBZGp1c3QgdGhlIG5ldyBtZXRhZGF0YSBMViBuYW1lICovCisJCQlsdmwgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9maXJzdCgmbmV3X21ldGFfbHZzKSwKKwkJCQkJICAgc3RydWN0IGx2X2xpc3QpOworCQkJZG1fbGlzdF9kZWwoJmx2bC0+bGlzdCk7CisJCQlpZiAoISh0bXBfbmFtZXNbc10gPSBfZ2VuZXJhdGVfcmFpZF9uYW1lKGx2LCAicm1ldGEiLCBzKSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYocmFpZF9zZWcsIHMsIGx2bC0+bHYsIDAsCisJCQkJCQkgICAgbHZsLT5sdi0+c3RhdHVzKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCAlcyB0byAlcyIsCisJCQkJCSAgbHZsLT5sdi0+bmFtZSwgbHYtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHZfc2V0X2hpZGRlbihsdmwtPmx2KTsKKworCQkJLyogQWRqdXN0IHRoZSBuZXcgZGF0YSBMViBuYW1lICovCisJCQlsdmwgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9maXJzdCgmbmV3X2RhdGFfbHZzKSwKKwkJCQkJICAgc3RydWN0IGx2X2xpc3QpOworCQkJZG1fbGlzdF9kZWwoJmx2bC0+bGlzdCk7CisJCQkvKiBjb3Zlcml0eVtjb3B5X3Bhc3RlX2Vycm9yXSBpbnRlbnRpb25hbCAqLworCQkJaWYgKCEodG1wX25hbWVzW3NkXSA9IF9nZW5lcmF0ZV9yYWlkX25hbWUobHYsICJyaW1hZ2UiLCBzKSkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIXNldF9sdl9zZWdtZW50X2FyZWFfbHYocmFpZF9zZWcsIHMsIGx2bC0+bHYsIDAsCisJCQkJCQkgICAgbHZsLT5sdi0+c3RhdHVzKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCAlcyB0byAlcyIsCisJCQkJCSAgbHZsLT5sdi0+bmFtZSwgbHYtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHZfc2V0X2hpZGRlbihsdmwtPmx2KTsKKwkJfSBlbHNlCisJCQl0bXBfbmFtZXNbc10gPSB0bXBfbmFtZXNbc2RdID0gTlVMTDsKKwl9CisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkX29yaWdpbihsdikpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJm9sZF9sdnMpIHsKKwkJaWYgKCFkZWFjdGl2YXRlX2x2KGx2LT52Zy0+Y21kLCBsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCQlpZiAoIWx2X3JlbW92ZShsdmwtPmx2KSkKKwkJCXJldHVybl8wOworCX0KKworCS8qIFVwZGF0ZSBuZXcgc3ViLUxWcyB0byBjb3JyZWN0IG5hbWUgYW5kIGNsZWFyIFJFQlVJTEQgZmxhZyAqLworCWZvciAocyA9IDA7IHMgPCByYWlkX3NlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCXNkID0gcyArIHJhaWRfc2VnLT5hcmVhX2NvdW50OworCQlpZiAodG1wX25hbWVzW3NdICYmIHRtcF9uYW1lc1tzZF0pIHsKKwkJCXNlZ19tZXRhbHYocmFpZF9zZWcsIHMpLT5uYW1lID0gdG1wX25hbWVzW3NdOworCQkJc2VnX2x2KHJhaWRfc2VnLCBzKS0+bmFtZSA9IHRtcF9uYW1lc1tzZF07CisJCQlzZWdfbWV0YWx2KHJhaWRfc2VnLCBzKS0+c3RhdHVzICY9IH5MVl9SRUJVSUxEOworCQkJc2VnX2x2KHJhaWRfc2VnLCBzKS0+c3RhdHVzICY9IH5MVl9SRUJVSUxEOworCQl9CisJfQorCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZF9vcmlnaW4obHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgbHZfcmFpZF9yZW1vdmVfbWlzc2luZyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVpbnQzMl90IHM7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlpZiAoIWx2X2lzX3BhcnRpYWwobHYpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMvJXMgaXMgbm90IGEgcGFydGlhbCBMViIsCisJCQkgIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWcoIkF0dGVtcHRpbmcgdG8gcmVtb3ZlIG1pc3NpbmcgZGV2aWNlcyBmcm9tICVzIExWLCAlcyIsCisJCSAgbHZzZWdfbmFtZShzZWcpLCBsdi0+bmFtZSk7CisKKwkvKgorCSAqIEZJWE1FOiBNYWtlIHN1cmUgIyBvZiBjb21wcm9taXNlZCBjb21wb25lbnRzIHdpbGwgbm90IGFmZmVjdCBSQUlECisJICovCisKKwlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKCFsdl9pc19wYXJ0aWFsKHNlZ19sdihzZWcsIHMpKSAmJgorCQkgICAgKCFzZWctPm1ldGFfYXJlYXMgfHwgIXNlZ19tZXRhbHYoc2VnLCBzKSB8fCAhbHZfaXNfcGFydGlhbChzZWdfbWV0YWx2KHNlZywgcykpKSkKKwkJCWNvbnRpbnVlOworCisJCWxvZ19kZWJ1ZygiUmVwbGFjaW5nICVzIHNlZ21lbnRzIHdpdGggZXJyb3IgdGFyZ2V0IiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoc2VnX2x2KHNlZywgcykpKTsKKwkJaWYgKHNlZy0+bWV0YV9hcmVhcyAmJiBzZWdfbWV0YWx2KHNlZywgcykpCisJCQlsb2dfZGVidWcoIlJlcGxhY2luZyAlcyBzZWdtZW50cyB3aXRoIGVycm9yIHRhcmdldCIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShzZWdfbWV0YWx2KHNlZywgcykpKTsKKwkJaWYgKCFyZXBsYWNlX2x2X3dpdGhfZXJyb3Jfc2VnbWVudChzZWdfbHYoc2VnLCBzKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlcGxhY2UgJXMncyBleHRlbnRzIHdpdGggZXJyb3IgdGFyZ2V0LiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShzZWdfbHYoc2VnLCBzKSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHNlZy0+bWV0YV9hcmVhcyAmJiAhcmVwbGFjZV9sdl93aXRoX2Vycm9yX3NlZ21lbnQoc2VnX21ldGFsdihzZWcsIHMpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVwbGFjZSAlcydzIGV4dGVudHMgd2l0aCBlcnJvciB0YXJnZXQuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZ19tZXRhbHYoc2VnLCBzKSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKGx2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJuIDEgaWYgYSBwYXJ0aWFsIHJhaWQgTFYgY2FuIGJlIGFjdGl2YXRlZCByZWR1bmRhbnRseSAqLworc3RhdGljIGludCBfcGFydGlhbF9yYWlkX2x2X2lzX3JlZHVuZGFudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpyYWlkX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJdWludDMyX3QgY29waWVzOworCXVpbnQzMl90IGksIHMsIHJlYnVpbGRzX3Blcl9ncm91cCA9IDA7CisJdWludDMyX3QgZmFpbGVkX2NvbXBvbmVudHMgPSAwOworCisJaWYgKHNlZ19pc19yYWlkMTAocmFpZF9zZWcpKSB7CisJCS8qIEZJWE1FOiBXZSBvbmx5IHN1cHBvcnQgMi13YXkgbWlycm9ycyBpbiBSQUlEMTAgY3VycmVudGx5ICovCisJCWNvcGllcyA9IDI7CisJCWZvciAoaSA9IDA7IGkgPCByYWlkX3NlZy0+YXJlYV9jb3VudCAqIGNvcGllczsgaSsrKSB7CisJCQlzID0gaSAlIHJhaWRfc2VnLT5hcmVhX2NvdW50OworCisJCQlpZiAoIShpICUgY29waWVzKSkKKwkJCQlyZWJ1aWxkc19wZXJfZ3JvdXAgPSAwOworCisJCQlpZiAobHZfaXNfcGFydGlhbChzZWdfbHYocmFpZF9zZWcsIHMpKSB8fAorCQkJICAgIGx2X2lzX3BhcnRpYWwoc2VnX21ldGFsdihyYWlkX3NlZywgcykpIHx8CisJCQkgICAgbHZfaXNfdmlydHVhbChzZWdfbHYocmFpZF9zZWcsIHMpKSB8fAorCQkJICAgIGx2X2lzX3ZpcnR1YWwoc2VnX21ldGFsdihyYWlkX3NlZywgcykpKQorCQkJCXJlYnVpbGRzX3Blcl9ncm91cCsrOworCisJCQlpZiAocmVidWlsZHNfcGVyX2dyb3VwID49IGNvcGllcykgeworCQkJCWxvZ192ZXJib3NlKCJBbiBlbnRpcmUgbWlycm9yIGdyb3VwIGhhcyBmYWlsZWQgaW4gJXMuIiwKKwkJCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJcmV0dXJuIDA7CS8qIEluc3VmZmljaWVudCByZWR1bmRhbmN5IHRvIGFjdGl2YXRlICovCisJCQl9CisJCX0KKworCQlyZXR1cm4gMTsgLyogUmVkdW5kYW50ICovCisJfQorCisJZm9yIChzID0gMDsgcyA8IHJhaWRfc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKGx2X2lzX3BhcnRpYWwoc2VnX2x2KHJhaWRfc2VnLCBzKSkgfHwKKwkJICAgIGx2X2lzX3BhcnRpYWwoc2VnX21ldGFsdihyYWlkX3NlZywgcykpIHx8CisJCSAgICBsdl9pc192aXJ0dWFsKHNlZ19sdihyYWlkX3NlZywgcykpIHx8CisJCSAgICBsdl9pc192aXJ0dWFsKHNlZ19tZXRhbHYocmFpZF9zZWcsIHMpKSkKKwkJCWZhaWxlZF9jb21wb25lbnRzKys7CisJfQorCisJaWYgKGZhaWxlZF9jb21wb25lbnRzID09IHJhaWRfc2VnLT5hcmVhX2NvdW50KSB7CisJCWxvZ192ZXJib3NlKCJBbGwgY29tcG9uZW50cyBvZiByYWlkIExWICVzIGhhdmUgZmFpbGVkLiIsCisJCQkgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CS8qIEluc3VmZmljaWVudCByZWR1bmRhbmN5IHRvIGFjdGl2YXRlICovCisJfSBlbHNlIGlmIChyYWlkX3NlZy0+c2VndHlwZS0+cGFyaXR5X2RldnMgJiYKKwkJICAgKGZhaWxlZF9jb21wb25lbnRzID4gcmFpZF9zZWctPnNlZ3R5cGUtPnBhcml0eV9kZXZzKSkgeworCQlsb2dfdmVyYm9zZSgiTW9yZSB0aGFuICV1IGNvbXBvbmVudHMgZnJvbSAlcyAlcyBoYXZlIGZhaWxlZC4iLAorCQkJICAgIHJhaWRfc2VnLT5zZWd0eXBlLT5wYXJpdHlfZGV2cywKKwkJCSAgICBsdnNlZ19uYW1lKHJhaWRfc2VnKSwKKwkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsJLyogSW5zdWZmaWNpZW50IHJlZHVuZGFuY3kgdG8gYWN0aXZhdGUgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogU2V0cyAqZGF0YSB0byAxIGlmIHRoZSBMViBjYW5ub3QgYmUgYWN0aXZhdGVkIHdpdGhvdXQgZGF0YSBsb3NzICovCitzdGF0aWMgaW50IF9sdl9tYXlfYmVfYWN0aXZhdGVkX2luX2RlZ3JhZGVkX21vZGUoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgKm5vdF9jYXBhYmxlID0gKGludCAqKWRhdGE7CisJdWludDMyX3QgczsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJaWYgKCpub3RfY2FwYWJsZSkKKwkJcmV0dXJuIDE7CS8qIE5vIGZ1cnRoZXIgY2hlY2tzIG5lZWRlZCAqLworCisJaWYgKCFsdl9pc19wYXJ0aWFsKGx2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobHZfaXNfcmFpZChsdikpIHsKKwkJKm5vdF9jYXBhYmxlID0gIV9wYXJ0aWFsX3JhaWRfbHZfaXNfcmVkdW5kYW50KGx2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogSWdub3JlIFJBSUQgc3ViLUxWcy4gKi8KKwlpZiAobHZfaXNfcmFpZF90eXBlKGx2KSkKKwkJcmV0dXJuIDE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKQorCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspCisJCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSAhPSBBUkVBX0xWKSB7CisJCQkJbG9nX3ZlcmJvc2UoIiVzIGNvbnRhaW5zIGEgc2VnbWVudCBpbmNhcGFibGUgb2YgZGVncmFkZWQgYWN0aXZhdGlvbiIsCisJCQkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCSpub3RfY2FwYWJsZSA9IDE7CisJCQl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHBhcnRpYWxfcmFpZF9sdl9zdXBwb3J0c19kZWdyYWRlZF9hY3RpdmF0aW9uKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY2x2KQoreworCWludCBub3RfY2FwYWJsZSA9IDA7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICogbHYgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopY2x2OyAvKiBkcm9wIGNvbnN0ICovCisKKwlpZiAoIV9sdl9tYXlfYmVfYWN0aXZhdGVkX2luX2RlZ3JhZGVkX21vZGUobHYsICZub3RfY2FwYWJsZSkgfHwgbm90X2NhcGFibGUpCisJCXJldHVybl8wOworCisJaWYgKCFmb3JfZWFjaF9zdWJfbHYobHYsIF9sdl9tYXlfYmVfYWN0aXZhdGVkX2luX2RlZ3JhZGVkX21vZGUsICZub3RfY2FwYWJsZSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJmb3JfZWFjaF9zdWJfbHYgZmFpbHVyZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuICFub3RfY2FwYWJsZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9tZXRhZGF0YS9yZXBsaWNhdG9yX21hbmlwLmMgYi9saWIvbWV0YWRhdGEvcmVwbGljYXRvcl9tYW5pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDE3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvcmVwbGljYXRvcl9tYW5pcC5jCkBAIC0wLDAgKzEsNjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKworLyogQWRkIGx2IGFzIHJlcGxpY2F0b3JfZGV2IGRldmljZSAqLworaW50IHJlcGxpY2F0b3JfZGV2X2FkZF9yaW1hZ2Uoc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2LAorCQkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpZiAoIWx2IHx8ICFyZGV2KQorCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19yaW1hZ2UobHYpKSB7CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgYWxyZWFkeSBwYXJ0IG9mIG90aGVyICIKKwkJCSAgInJlcGxpY2F0b3IuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmRldi0+bHYpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBjYW4gbm90IGJlIGF0dGFjaGVkIHRvIGFuICIKKwkJCSAgImFscmVhZHkgZGVmaW5lZCByZXBsaWNhdG9yIGRldmljZSIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHZfc2V0X2hpZGRlbihsdik7CisJbHYtPnJkZXZpY2UgPSByZGV2OworCXJkZXYtPmx2ID0gbHY7CisKKwlyZXR1cm4gYWRkX3NlZ190b19zZWdzX3VzaW5nX3RoaXNfbHYobHYsIHJkZXYtPnJlcGxpY2F0b3JfZGV2KTsKK30KKworLyogUmVtb3ZlIGx2IGZyb20gcmVwbGljYXRvcl9kZXYgZGV2aWNlICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJlcGxpY2F0b3JfZGV2X3JlbW92ZV9yaW1hZ2Uoc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisKKwlpZiAoIXJkZXYgfHwgIXJkZXYtPmx2KQorCQlyZXR1cm5fTlVMTDsKKworCWx2ID0gcmRldi0+bHY7CisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGx2LCByZGV2LT5yZXBsaWNhdG9yX2RldikpCisJCXJldHVybl9OVUxMOworCisJLyogRklYTUU6IC0gY2hlY2sgZm9yIHNpdGUgcmVmZXJlbmNlcyAqLworCXJkZXYtPmx2ID0gTlVMTDsKKwlsdi0+cmRldmljZSA9IE5VTEw7CisJbHZfc2V0X3Zpc2libGUobHYpOworCisJcmV0dXJuIGx2OworfQorCitpbnQgcmVwbGljYXRvcl9kZXZfYWRkX3Nsb2coc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2LAorCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc2xvZykKK3sKKwlpZiAoIXNsb2cgfHwgIXJkZXYpCisJCXJldHVybl8wOworCisJaWYgKHJkZXYtPnNsb2cpIHsKKwkJbG9nX2Vycm9yKCJSZXBsaWNhdG9yIGRldmljZSBpbiBzaXRlICVzIGFscmVhZHkgaGFzIHN5bmMgbG9nLiIsCisJCQkgIHJkZXYtPnJzaXRlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNsb2ctPnJkZXZpY2UpIHsKKwkJbG9nX2Vycm9yKCJTeW5jIGxvZyAlcyBpcyBhbHJlYWR5IHVzZWQgYnkgcmVwbGljYXRvciAlcy4iLAorCQkJICBzbG9nLT5uYW1lLCBzbG9nLT5yZGV2aWNlLT5yc2l0ZS0+cmVwbGljYXRvci0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWx2X3NldF9oaWRkZW4oc2xvZyk7CisJc2xvZy0+cmRldmljZSA9IHJkZXY7CisJcmRldi0+c2xvZyA9IHNsb2c7CisKKwlyZXR1cm4gYWRkX3NlZ190b19zZWdzX3VzaW5nX3RoaXNfbHYoc2xvZywgcmRldi0+cmVwbGljYXRvcl9kZXYpOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJlcGxpY2F0b3JfZGV2X3JlbW92ZV9zbG9nKHN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCisJaWYgKCFyZGV2KQorCQlyZXR1cm5fTlVMTDsKKworCWx2ID0gcmRldi0+c2xvZzsKKwlpZiAoIWx2KSB7CisJCWxvZ19lcnJvcigiUmVwbGljYXRvciBkZXZpY2UgaW4gc2l0ZSAlcyBkb2VzIG5vdCBoYXZlIHN5bmMgbG9nLiIsCisJCQkgIHJkZXYtPnJzaXRlLT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGx2LCByZGV2LT5yZXBsaWNhdG9yX2RldikpCisJCXJldHVybl9OVUxMOworCisJcmRldi0+c2xvZyA9IE5VTEw7CisJbHYtPnJkZXZpY2UgPSBOVUxMOworCWx2X3NldF92aXNpYmxlKGx2KTsKKworCXJldHVybiBsdjsKK30KKworaW50IHJlcGxpY2F0b3JfYWRkX3JlcGxpY2F0b3JfZGV2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcl9sdiwKKwkJCQkgIHN0cnVjdCBsdl9zZWdtZW50ICpyZXBsaWNhdG9yX2Rldl9zZWcpCit7CisJaWYgKCFyZXBsaWNhdG9yX2x2KQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcGxpY2F0b3JfbHYtPnN0YXR1cyAmIFJFUExJQ0FUT1IpKSB7CisJCWRtX2xpc3RfaW5pdCgmcmVwbGljYXRvcl9sdi0+cnNpdGVzKTsKKwkJbHZfc2V0X2hpZGRlbihyZXBsaWNhdG9yX2x2KTsKKwkJcmVwbGljYXRvcl9sdi0+c3RhdHVzIHw9IFJFUExJQ0FUT1I7CisJfQorCisJaWYgKCFyZXBsaWNhdG9yX2Rldl9zZWcpCisJCXJldHVybiAxOworCisJaWYgKHJlcGxpY2F0b3JfZGV2X3NlZy0+cmVwbGljYXRvcikgeworCQlsb2dfZXJyb3IoIlJlcGxpY2F0b3IgZGV2aWNlICVzIGlzIGFscmVhZHkgcGFydCBvZiByZXBsaWNhdG9yLiIsCisJCQkgIHJlcGxpY2F0b3JfZGV2X3NlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXBsaWNhdG9yX2Rldl9zZWctPnJlcGxpY2F0b3IgPSByZXBsaWNhdG9yX2x2OworCisJcmV0dXJuIGFkZF9zZWdfdG9fc2Vnc191c2luZ190aGlzX2x2KHJlcGxpY2F0b3JfbHYsIHJlcGxpY2F0b3JfZGV2X3NlZyk7Cit9CisKKy8qKgorICogUmV0dXJucyByaW1hZ2UgPz8gbHYgdXBvbiBzdWNjZWZ1bCBkZXRhY2ggb2YgZGV2aWNlCisgKiBlbnRpcmUgTFYgZW50cnkgc2hvdWxkIGJlIHJlbW92ZWQgYnkgdGhpcyBjcm9vdGFsbCA/PworICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJlcGxpY2F0b3JfcmVtb3ZlX3JlcGxpY2F0b3JfZGV2KHN0cnVjdCBsdl9zZWdtZW50ICpyZXBsaWNhdG9yX2Rldl9zZWcpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IE5VTEw7CisKKwlsb2dfZXJyb3IoIkZJWE1FOiBub3QgaW1wbGVtZW50ZWQuIik7CisjaWYgMAorCS8qIEZJWE1FOiAtIHRoaXMgaXMgZ29pbmcgdG8gYmUgY29tcGxleC4uLi4gKi8KKwlpZiAoIXJlcGxpY2F0b3JfZGV2X3NlZykKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBpZiBzbG9nIG9yIHJpbWFnZSAtIGV4aXQgKi8KKworCWlmICghcmVtb3ZlX3NlZ19mcm9tX3NlZ3NfdXNpbmdfdGhpc19sdihsdiwgcmVwbGljYXRvcl9zZWcpKQorCQlyZXR1cm5fTlVMTDsKKworCXJlcGxpY2F0b3Jfc2VnLT5ybG9nX2x2ID0gTlVMTDsKKwlsdi0+c3RhdHVzICY9IH5SRVBMSUNBVE9SX0xPRzsKKwlsdl9zZXRfdmlzaWJsZShsdik7CisjZW5kaWYKKworCXJldHVybiBsdjsKK30KKworaW50IHJlcGxpY2F0b3JfYWRkX3Jsb2coc3RydWN0IGx2X3NlZ21lbnQgKnJlcGxpY2F0b3Jfc2VnLAorCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpybG9nX2x2KQoreworCWlmICghcmxvZ19sdikKKwkJcmV0dXJuXzA7CisKKwlpZiAocmxvZ19sdi0+c3RhdHVzICYgUkVQTElDQVRPUl9MT0cpIHsKKwkJbG9nX2Vycm9yKCJSbG9nIGRldmljZSAlcyBpcyBhbHJlYWR5IHVzZWQuIiwgcmxvZ19sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWx2X3NldF9oaWRkZW4ocmxvZ19sdik7CisJcmxvZ19sdi0+c3RhdHVzIHw9IFJFUExJQ0FUT1JfTE9HOworCXJlcGxpY2F0b3Jfc2VnLT5ybG9nX2x2ID0gcmxvZ19sdjsKKworCXJldHVybiBhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihybG9nX2x2LCByZXBsaWNhdG9yX3NlZyk7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcmVwbGljYXRvcl9yZW1vdmVfcmxvZyhzdHJ1Y3QgbHZfc2VnbWVudCAqcmVwbGljYXRvcl9zZWcpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWlmICghcmVwbGljYXRvcl9zZWcpCisJCXJldHVybl8wOworCisJaWYgKCEobHYgPSByZXBsaWNhdG9yX3NlZy0+cmxvZ19sdikpIHsKKwkJbG9nX2Vycm9yKCJSZXBsb2cgc2VnbWVudCAlcyBkb2VzIG5vdCBoYXZlIHJsb2cuIiwKKwkJCSAgcmVwbGljYXRvcl9zZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFyZW1vdmVfc2VnX2Zyb21fc2Vnc191c2luZ190aGlzX2x2KGx2LCByZXBsaWNhdG9yX3NlZykpCisJCXJldHVybl9OVUxMOworCisJcmVwbGljYXRvcl9zZWctPnJsb2dfbHYgPSBOVUxMOworCWx2LT5zdGF0dXMgJj0gflJFUExJQ0FUT1JfTE9HOworCWx2X3NldF92aXNpYmxlKGx2KTsKKworCXJldHVybiBsdjsKK30KKworCisjaWYgMAorLyoKKyAqIENyZWF0ZSBuZXcgTFYgdG8gcHJldGVuZCB0aGUgb3JpZ2luYWwgTFYKKyAqIHRoaXMgdGFyZ2V0IHdpbGwgaGF2ZSBhICdyZXBsaWNhdG9yJyBzZWdtZW50CisgKi8KK2ludCBsdl9hZGRfcmVwbGljYXRvcihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbiwgY29uc3QgY2hhciAqcmVwX3N1ZmZpeCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJlcF9sdjsKKwljaGFyICpuYW1lOworCXNpemVfdCBzbGVuOworCisJaWYgKCEobmFtZSA9IHN0cnN0cihvcmlnaW4tPm5hbWUsIHJlcF9zdWZmaXgpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHJlcGxpY2F0b3Igc3VmZml4ICVzIGluIExWIG5hbWUgJXMiLAorCQkJICByZXBfc3VmZml4LCBvcmlnaW4tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJc2xlbiA9IChzaXplX3QpKG5hbWUgLSBvcmlnaW4tPm5hbWUpOworCW5hbWUgPSBhbGxvY2Eoc2xlbiArIDEpOworCW1lbWNweShuYW1lLCBvcmlnaW4tPm5hbWUsIHNsZW4pOworCW5hbWVbc2xlbl0gPSAwOworCisJaWYgKChyZXBfbHYgPSBmaW5kX2x2KG9yaWdpbi0+dmcsIG5hbWUpKSkgeworCQlyZXBfbHYtPnN0YXR1cyB8PSBWSVJUVUFMOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShyZXBfbHYgPSBsdl9jcmVhdGVfZW1wdHkobmFtZSwgJm9yaWdpbi0+bHZpZCwKKwkJCQkgICAgICAgTFZNX1JFQUQgfCBMVk1fV1JJVEUgfCBWSVNJQkxFX0xWLAorCQkJCSAgICAgICBBTExPQ19JTkhFUklULCBvcmlnaW4tPnZnKSkpCisJCXJldHVybl8wOworCisJaWYgKCFsdl9hZGRfdmlydHVhbF9zZWdtZW50KHJlcF9sdiwgMCwgb3JpZ2luLT5sZV9jb3VudCwKKwkJCQkgICAgZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcob3JpZ2luLT52Zy0+Y21kLAorCQkJCQkJCSAgICAiZXJyb3IiKSkpCisJCXJldHVybl8wOworCisJcmVwX2x2LT5zdGF0dXMgfD0gVklSVFVBTDsKKwlyZXR1cm4gMTsKK30KKworaW50IGx2X3JlbW92ZV9yZXBsaWNhdG9yKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGFsbCByZXBsaWNhdG9yIHN0cnVjdHVyZXM6CisgKiAgb25seSBub24tY2x1c3RlcmVkIFZHIGZvciBSZXBsaWNhdG9yCisgKiAgb25seSBvbmUgc2VnbWVudCBpbiByZXBsaWNhdG9yIExWCisgKiAgc2l0ZSBoYXMgY29ycmVjdCBjb21iaW5hdGlvbiBvZiBvcGVyYXRpb25fbW9kZSBwYXJhbWV0ZXJzCisgKiAgc2l0ZSBhbmQgcmVsYXRlZCBkZXZpY2VzIGhhdmUgY29ycmVjdCBpbmRleCBudW1iZXJzCisgKiAgZHVwbGljYXRlIHNpdGUgbmFtZXMsIHNpdGUgaW5kZXhlcywgZGV2aWNlIG5hbWVzLCBkZXZpY2UgaW5kZXhlcworICovCitpbnQgY2hlY2tfcmVwbGljYXRvcl9zZWdtZW50KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpyc2VnKQoreworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlLCAqcnNpdGViOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldiwgKnJkZXZiOworICAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gcnNlZy0+bHY7CisJaW50IHIgPSAxOworCisJaWYgKHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIEdyb3VwICVzIG9mIHJlcGxpY2F0b3IgJXMgaXMgY2x1c3RlcmVkIiwKKwkJCSAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9saXN0X3NpemUoJmx2LT5zZWdtZW50cykgIT0gMSkgeworCQlsb2dfZXJyb3IoIlJlcGxpY2F0b3IgJXMgc2VnbWVudCBzaXplICVkICE9IDEiLAorCQkJICBsdi0+bmFtZSwgZG1fbGlzdF9zaXplKCZsdi0+c2VnbWVudHMpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlLCAmbHYtPnJzaXRlcykgeworCQlpZiAocnNpdGUtPm9wX21vZGUgPT0gRE1fUkVQTElDQVRPUl9TWU5DKSB7CisJCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX3RpbWVvdXQpIHsKKwkJCQlsb2dfZXJyb3IoIkRlZmluZWQgZmFsbF9iZWhpbmRfdGltZW91dD0iCisJCQkJCSAgIiVkIGZvciBzeW5jIHJlcGxpY2F0b3IgJXMvJXMuIiwKKwkJCQkJICByc2l0ZS0+ZmFsbF9iZWhpbmRfdGltZW91dCwgbHYtPm5hbWUsCisJCQkJCSAgcnNpdGUtPm5hbWUpOworCQkJCXIgPSAwOworCQkJfQorCQkJaWYgKHJzaXRlLT5mYWxsX2JlaGluZF9pb3MpIHsKKwkJCQlsb2dfZXJyb3IoIkRlZmluZWQgZmFsbF9iZWhpbmRfaW9zPSIKKwkJCQkJICAiJWQgZm9yIHN5bmMgcmVwbGljYXRvciAlcy8lcy4iLAorCQkJCQkgIHJzaXRlLT5mYWxsX2JlaGluZF9pb3MsIGx2LT5uYW1lLCByc2l0ZS0+bmFtZSk7CisJCQkJciA9IDA7CisJCQl9CisJCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEpIHsKKwkJCQlsb2dfZXJyb3IoIkRlZmluZWQgZmFsbF9iZWhpbmRfZGF0YT0iCisJCQkJCSAgRk1UdTY0ICIgZm9yIHN5bmMgcmVwbGljYXRvciAlcy8lcy4iLAorCQkJCQkgIHJzaXRlLT5mYWxsX2JlaGluZF9kYXRhLCBsdi0+bmFtZSwgcnNpdGUtPm5hbWUpOworCQkJCXIgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJzaXRlLT5mYWxsX2JlaGluZF90aW1lb3V0ICYmIHJzaXRlLT5mYWxsX2JlaGluZF9pb3MpIHsKKwkJCQlsb2dfZXJyb3IoIkRlZmluZWQgZmFsbF9iZWhpbmRfdGltZW91dCBhbmQiCisJCQkJCSAgIiBmYWxsX2JlaGluZF9pb3MgZm9yIGFzeW5jIHJlcGxpY2F0b3IgJXMvJXMuIiwKKwkJCQkJICBsdi0+bmFtZSwgcnNpdGUtPm5hbWUpOworCQkJCXIgPSAwOworCQkJfQorCQkJaWYgKHJzaXRlLT5mYWxsX2JlaGluZF90aW1lb3V0ICYmIHJzaXRlLT5mYWxsX2JlaGluZF9kYXRhKSB7CisJCQkJbG9nX2Vycm9yKCJEZWZpbmVkIGZhbGxfYmVoaW5kX3RpbWVvdXQgYW5kIgorCQkJCQkgICIgZmFsbF9iZWhpbmRfZGF0YSBmb3IgYXN5bmMgcmVwbGljYXRvciAlcy8lcy4iLAorCQkJCQkgIGx2LT5uYW1lLCByc2l0ZS0+bmFtZSk7CisJCQkJciA9IDA7CisJCQl9CisJCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2lvcyAmJiByc2l0ZS0+ZmFsbF9iZWhpbmRfZGF0YSkgeworCQkJCWxvZ19lcnJvcigiRGVmaW5lZCBmYWxsX2JlaGluZF9pb3MgYW5kIgorCQkJCQkgICIgZmFsbF9iZWhpbmRfZGF0YSBmb3IgYXN5bmMgcmVwbGljYXRvciAlcy8lcy4iLAorCQkJCQkgIGx2LT5uYW1lLCByc2l0ZS0+bmFtZSk7CisJCQkJciA9IDA7CisJCQl9CisJCQlpZiAoIXJzaXRlLT5mYWxsX2JlaGluZF9pb3MgJiYKKwkJCSAgICAhcnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEgJiYKKwkJCSAgICAhcnNpdGUtPmZhbGxfYmVoaW5kX3RpbWVvdXQpIHsKKwkJCQlsb2dfZXJyb3IoImZhbGxfYmVoaW5kX3RpbWVvdXQsIgorCQkJCQkgICIgZmFsbF9iZWhpbmRfaW9zIGFuZCBmYWxsX2JlaGluZF9kYXRhIGFyZSIKKwkJCQkJICAiIHVuZGVmaW5lZCBmb3IgYXN5bmMgcmVwbGljYXRvciAlcy8lcy4iLAorCQkJCQkgIGx2LT5uYW1lLCByc2l0ZS0+bmFtZSk7CisJCQkJciA9IDA7CisJCQl9CisJCX0KKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlYiwgJmx2LT5yc2l0ZXMpIHsKKwkJCWlmIChyc2l0ZSA9PSByc2l0ZWIpCisJCQkJYnJlYWs7CisJCQlpZiAoc3RyY2FzZWNtcChyc2l0ZS0+bmFtZSwgcnNpdGViLT5uYW1lKSA9PSAwKSB7CisJCQkJbG9nX2Vycm9yKCJEdXBsaWNhdGUgc2l0ZSBuYW1lICIKKwkJCQkJICAiJXMgZGV0ZWN0ZWQgZm9yIHJlcGxpY2F0b3IgJXMuIiwKKwkJCQkJICByc2l0ZS0+bmFtZSwgbHYtPm5hbWUpOworCQkJCXIgPSAwOworCQkJfQorCQkJaWYgKChyc2l0ZS0+dmdfbmFtZSAmJiByc2l0ZWItPnZnX25hbWUgJiYKKwkJCSAgICAgc3RyY2FzZWNtcChyc2l0ZS0+dmdfbmFtZSwgcnNpdGViLT52Z19uYW1lKSA9PSAwKSB8fAorCQkJICAgICghcnNpdGUtPnZnX25hbWUgJiYgIXJzaXRlYi0+dmdfbmFtZSkpIHsKKwkJCQlsb2dfZXJyb3IoIkR1cGxpY2F0ZSBWRyBuYW1lICIKKwkJCQkJICAiJXMgZGV0ZWN0ZWQgZm9yIHJlcGxpY2F0b3IgJXMuIiwKKwkJCQkJICAocnNpdGUtPnZnX25hbWUpID8gcnNpdGUtPnZnX25hbWUgOiAiPGxvY2FsPiIsCisJCQkJCSAgbHYtPm5hbWUpOworCQkJCXIgPSAwOworCQkJfQorCQkJaWYgKHJzaXRlLT5zaXRlX2luZGV4ID09IHJzaXRlYi0+c2l0ZV9pbmRleCkgeworCQkJCWxvZ19lcnJvcigiRHVwbGljYXRlIHNpdGUgaW5kZXggJWQgZGV0ZWN0ZWQgIgorCQkJCQkgICJmb3IgcmVwbGljYXRvciBzaXRlICVzLyVzLiIsCisJCQkJCSAgcnNpdGUtPnNpdGVfaW5kZXgsIGx2LT5uYW1lLAorCQkJCQkgIHJzaXRlLT5uYW1lKTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJCWlmIChyc2l0ZS0+c2l0ZV9pbmRleCA+IHJzZWctPnJzaXRlX2luZGV4X2hpZ2hlc3QpIHsKKwkJCQlsb2dfZXJyb3IoIlNpdGUgaW5kZXggJWQgPiAlZCAodG9vIGhpZ2gpICIKKwkJCQkJICAiZm9yIHJlcGxpY2F0b3Igc2l0ZSAlcy8lcy4iLAorCQkJCQkgIHJzaXRlLT5zaXRlX2luZGV4LAorCQkJCQkgIHJzZWctPnJzaXRlX2luZGV4X2hpZ2hlc3QsCisJCQkJCSAgbHYtPm5hbWUsIHJzaXRlLT5uYW1lKTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJfQorCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKSB7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocmRldmIsICZyc2l0ZS0+cmRldmljZXMpIHsKKwkJCQlpZiAocmRldiA9PSByZGV2YikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHJkZXYtPnNsb2cgJiYgKHJkZXYtPnNsb2cgPT0gcmRldmItPnNsb2cpKSB7CisJCQkJCWxvZ19lcnJvcigiRHVwbGljYXRlIHN5bmMgbG9nICVzICIKKwkJCQkJCSAgImRldGVjdGVkIGZvciByZXBsaWNhdG9yICVzLiIsCisJCQkJCQkgIHJkZXYtPnNsb2ctPm5hbWUsIGx2LT5uYW1lKTsKKwkJCQkJciA9IDA7CisJCQkJfQorCQkJCWlmIChzdHJjYXNlY21wKHJkZXYtPm5hbWUsIHJkZXZiLT5uYW1lKSA9PSAwKSB7CisJCQkJCWxvZ19lcnJvcigiRHVwbGljYXRlIGRldmljZSBuYW1lICVzICIKKwkJCQkJCSAgImRldGVjdGVkIGZvciByZXBsaWNhdG9yICVzLiIsCisJCQkJCQkgIHJkZXYtPm5hbWUsIGx2LT5uYW1lKTsKKwkJCQkJciA9IDA7CisJCQkJfQorCQkJCWlmIChyZGV2LT5kZXZpY2VfaW5kZXggPT0gcmRldmItPmRldmljZV9pbmRleCkgeworCQkJCQlsb2dfZXJyb3IoIkR1cGxpY2F0ZSBkZXZpY2UgaW5kZXggJSIKKwkJCQkJCSAgUFJJZDY0ICIgZGV0ZWN0ZWQgZm9yICIKKwkJCQkJCSAgInJlcGxpY2F0b3Igc2l0ZSAlcy8lcy4iLAorCQkJCQkJICByZGV2LT5kZXZpY2VfaW5kZXgsCisJCQkJCQkgIGx2LT5uYW1lLCByc2l0ZS0+bmFtZSk7CisJCQkJCXIgPSAwOworCQkJCX0KKwkJCQlpZiAocmRldi0+ZGV2aWNlX2luZGV4ID4gcnNlZy0+cmRldmljZV9pbmRleF9oaWdoZXN0KSB7CisJCQkJCWxvZ19lcnJvcigiRGV2aWNlIGluZGV4ICUiIFBSSXU2NAorCQkJCQkJICAiID4gJSIgUFJJdTY0ICIgKHRvbyBoaWdoKSAiCisJCQkJCQkgICJmb3IgcmVwbGljYXRvciBzaXRlICVzLyVzLiIsCisJCQkJCQkgIHJkZXYtPmRldmljZV9pbmRleCwKKwkJCQkJCSAgcnNlZy0+cmRldmljZV9pbmRleF9oaWdoZXN0LAorCQkJCQkJICBsdi0+bmFtZSwgcnNpdGUtPm5hbWUpOworCQkJCQlyID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoqCisgKiBJcyB0aGlzIHNlZ21lbnQgcGFydCBvZiBhY3RpdmUgcmVwbGljYXRvcgorICovCitpbnQgbHZfaXNfYWN0aXZlX3JlcGxpY2F0b3JfZGV2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuICgobHYtPnN0YXR1cyAmIFJFUExJQ0FUT1IpICYmCisJCWx2LT5yZGV2aWNlICYmCisJCWx2LT5yZGV2aWNlLT5yc2l0ZSAmJgorCQlsdi0+cmRldmljZS0+cnNpdGUtPnN0YXRlID09IFJFUExJQ0FUT1JfU1RBVEVfQUNUSVZFKTsKK30KKworLyoqCisgKiBJcyB0aGlzIExWIHJlcGxpY2F0b3IgY29udHJvbCBkZXZpY2UKKyAqLworaW50IGx2X2lzX3JlcGxpY2F0b3IoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gKChsdi0+c3RhdHVzICYgUkVQTElDQVRPUikgJiYKKwkJIWRtX2xpc3RfZW1wdHkoJmx2LT5zZWdtZW50cykgJiYKKwkJc2VnX2lzX3JlcGxpY2F0b3IoZmlyc3Rfc2VnKGx2KSkpOworfQorCisvKioKKyAqIElzIHRoaXMgTFYgcmVwbGljYXRvciBkZXZpY2UKKyAqLworaW50IGx2X2lzX3JlcGxpY2F0b3JfZGV2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuICgobHYtPnN0YXR1cyAmIFJFUExJQ0FUT1IpICYmCisJCSFkbV9saXN0X2VtcHR5KCZsdi0+c2VnbWVudHMpICYmCisJCXNlZ19pc19yZXBsaWNhdG9yX2RldihmaXJzdF9zZWcobHYpKSk7Cit9CisKKy8qKgorICogSXMgdGhpcyBMViByZXBsaWNhdGVkIG9yaWdpbiBsdgorICovCitpbnQgbHZfaXNfcmltYWdlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIChsdi0+cmRldmljZSAmJiBsdi0+cmRldmljZS0+bHYgPT0gbHYpOworfQorCisvKioKKyAqIElzIHRoaXMgTFYgc3luYyBsb2cKKyAqLworaW50IGx2X2lzX3Nsb2coY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gKGx2LT5yZGV2aWNlICYmIGx2LT5yZGV2aWNlLT5zbG9nID09IGx2KTsKK30KKworLyoqCisgKiBSZXR1cm5zIGZpcnN0IHJlcGxpY2F0b3ItZGV2IGluIHNpdGUgaW4gY2FzZSB0aGUgTFYgaXMgcmVwbGljYXRvci1kZXYsCisgKiBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpcnN0X3JlcGxpY2F0b3JfZGV2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IHJlcGxpY2F0b3JfZGV2aWNlICpyZGV2OworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJaWYgKGx2X2lzX3JlcGxpY2F0b3JfZGV2KGx2KSkKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlLCAmZmlyc3Rfc2VnKGx2KS0+cmVwbGljYXRvci0+cnNpdGVzKSB7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocmRldiwgJnJzaXRlLT5yZGV2aWNlcykKKwkJCQlyZXR1cm4gcmRldi0+cmVwbGljYXRvcl9kZXYtPmx2OworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIEFkZCBWRyBvcGVuIHBhcmFtZXRlcnMgdG8gc29ydGVkIGNtZF92ZyBsaXN0LgorICoKKyAqIE1haW50YWluIHRoZSBhbHBoYWJldGljYWx5IG9yZGVyZWQgbGlzdCwgYXZvaWQgZHVwbGljYXRpb25zLgorICoKKyAqIFxyZXR1cm4JUmV0dXJucyBuZXdseSBjcmVhdGVkIG9yIGFscmVhZHkgcHJlc2VudCBjbWRfdmcgZW50cnksCisgKgkJb3IgTlVMTCBpbiBlcnJvciBjYXNlLgorICovCitzdHJ1Y3QgY21kX3ZnICpjbWRfdmdfYWRkKHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBkbV9saXN0ICpjbWRfdmdzLAorCQkJICBjb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICp2Z2lkLAorCQkJICB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgY21kX3ZnICpjdmwsICppbnM7CisKKwlpZiAoIXZnX25hbWUgJiYgIXZnaWQpIHsKKwkJbG9nX2Vycm9yKCJFaXRoZXIgdmdfbmFtZSBvciB2Z2lkIG11c3QgYmUgc2V0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJcyBpdCBhbHJlYWR5IGluIHRoZSBsaXN0ID8gKi8KKwlpZiAoKGN2bCA9IGNtZF92Z19sb29rdXAoY21kX3ZncywgdmdfbmFtZSwgdmdpZCkpKQorCQlyZXR1cm4gY3ZsOworCisJaWYgKCEoY3ZsID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKmN2bCkpKSkgeworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgY21kX3ZnIGZhaWxlZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHZnX25hbWUgJiYgIShjdmwtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIHZnX25hbWUpKSkgeworCQlkbV9wb29sX2ZyZWUobWVtLCBjdmwpOworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgdmdfbmFtZSBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh2Z2lkICYmICEoY3ZsLT52Z2lkID0gZG1fcG9vbF9zdHJkdXAobWVtLCB2Z2lkKSkpIHsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgY3ZsKTsKKwkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIHZnaWQgZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljdmwtPmZsYWdzID0gZmxhZ3M7CisKKwlpZiAodmdfbmFtZSkKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGlucywgY21kX3ZncykKKwkJCWlmIChzdHJjbXAodmdfbmFtZSwgaW5zLT52Z19uYW1lKSA8IDApIHsKKwkJCQljbWRfdmdzID0gJmlucy0+bGlzdDsgLyogbmV3IHBvc2l0aW9uICovCisJCQkJYnJlYWs7CisJCQl9CisKKwlkbV9saXN0X2FkZChjbWRfdmdzLCAmY3ZsLT5saXN0KTsKKworCXJldHVybiBjdmw7Cit9CisKKy8qKgorICogRmluZCBjbWRfdmcgd2l0aCBnaXZlbiB2Z19uYW1lIGluIGNtZF92Z3MgbGlzdC4KKyAqCisgKiBccGFyYW0gY21kX3ZncwlMaXN0IG9mIGNtZF92ZyBlbnRyaWVzLgorICoKKyAqIFxwYXJhbSB2Z19uYW1lCU5hbWUgb2YgVkcgdG8gYmUgZm91bmQuCisKKyAqIFxwYXJhbSB2Z2lkCQlVVUlEIG9mIFZHIHRvIGJlIGZvdW5kLgorICoKKyAqIFxyZXR1cm4JCVJldHVybnMgY21kX3ZnIGVudHJ5IGlmIHZnX25hbWUgb3IgdmdpZCBpcyBmb3VuZCwKKyAqCQkJTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0cnVjdCBjbWRfdmcgKmNtZF92Z19sb29rdXAoc3RydWN0IGRtX2xpc3QgKmNtZF92Z3MsCisJCQkgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsIGNvbnN0IGNoYXIgKnZnaWQpCit7CisJc3RydWN0IGNtZF92ZyAqY3ZsOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN2bCwgY21kX3ZncykKKwkJaWYgKCh2Z2lkICYmIGN2bC0+dmdpZCAmJiAhc3RyY21wKHZnaWQsIGN2bC0+dmdpZCkpIHx8CisJCSAgICAodmdfbmFtZSAmJiBjdmwtPnZnX25hbWUgJiYgIXN0cmNtcCh2Z19uYW1lLCBjdmwtPnZnX25hbWUpKSkKKwkJCXJldHVybiBjdmw7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVhZCBhbmQgbG9jayBtdWx0aXBsZSBWR3Mgc3RvcmVkIGluIGNtZF92Z3MgbGlzdCBhbHBoYWJldGljYWx5LgorICogT24gdGhlIHN1Y2Nlc3MgbGlzdCBoZWFkIHBvaW50ZXIgaXMgc2V0IHRvIFZHcycgY21kX3Zncy4KKyAqIChzdXBwb3J0cyBGQUlMRURfSU5DT05TSVNURU5UKQorICoKKyAqIFxwYXJhbSBjbWRfdmcJQ29udGFpbnMgbGlzdCBvZiBjbWRfdmcgZW50cmllcy4KKyAqCisgKiBccmV0dXJuCQlSZXR1cm5zIDEgaWYgYWxsIFZHIGluIGNtZF92Z3MgbGlzdCBhcmUgY29ycmVjdGx5CisgKgkJCW9wZW5uZWQgYW5kIGxvY2tlZCwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBjbWRfdmdfcmVhZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKmNtZF92Z3MpCit7CisJc3RydWN0IGNtZF92ZyAqY3ZsOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIGFscGhhYmV0aWNhbHkgb3JkZXJlZCBjbWRfdmcgbGlzdCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhjdmwsIGNtZF92Z3MpIHsKKwkJY3ZsLT52ZyA9IHZnX3JlYWQoY21kLCBjdmwtPnZnX25hbWUsIGN2bC0+dmdpZCwgY3ZsLT5mbGFncywgMCk7CisJCWlmICh2Z19yZWFkX2Vycm9yKGN2bC0+dmcpKSB7CisJCQlsb2dfZGVidWdfbWV0YWRhdGEoIkZhaWxlZCB0byB2Z19yZWFkICVzIiwgY3ZsLT52Z19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWN2bC0+dmctPmNtZF92Z3MgPSBjbWRfdmdzOwkvKiBNYWtlIGl0IHVzYWJsZSBpbiBWRyAqLworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIFJlbGVhc2Ugb3BlbmVkIGFuZCBsb2NrZWQgVkdzIGZyb20gbGlzdC4KKyAqCisgKiBccGFyYW0gY21kX3ZncwlDb250YWlucyBsaXN0IG9mIGNtZF92ZyBlbnRyaWVzLgorICovCit2b2lkIGZyZWVfY21kX3ZncyhzdHJ1Y3QgZG1fbGlzdCAqY21kX3ZncykKK3sKKwlzdHJ1Y3QgY21kX3ZnICpjdmw7CisKKwkvKiBCYWNrd2FyZCBpdGVyYXRlIGNtZF92ZyBsaXN0ICovCisJZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXMoY3ZsLCBjbWRfdmdzKSB7CisJCWlmICh2Z19yZWFkX2Vycm9yKGN2bC0+dmcpKQorCQkJcmVsZWFzZV92ZyhjdmwtPnZnKTsKKwkJZWxzZQorCQkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGN2bC0+dmctPmNtZCwgY3ZsLT52ZywgY3ZsLT52Z19uYW1lKTsKKwkJY3ZsLT52ZyA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIEZpbmQgYWxsIG5lZWRlZCByZW1vdGUgVkdzIGZvciBwcm9jZXNzaW5nIGdpdmVuIExWLgorICogTWlzc2luZyBWR3MgYXJlIGFkZGVkIHRvIFZHJ3MgY21kX3ZnIGxpc3QgYW5kIGZsYWcgY21kX21pc3NpbmdfdmdzIGlzIHNldC4KKyAqLworaW50IGZpbmRfcmVwbGljYXRvcl92Z3MoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlICpyc2l0ZTsKKwlpbnQgcmV0ID0gMTsKKworCWlmICghbHZfaXNfcmVwbGljYXRvcl9kZXYobHYpKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJmZpcnN0X3NlZyhsdiktPnJlcGxpY2F0b3ItPnJzaXRlcykgeworCQlpZiAoIXJzaXRlLT52Z19uYW1lIHx8ICFsdi0+dmctPmNtZF92Z3MgfHwKKwkJICAgIGNtZF92Z19sb29rdXAobHYtPnZnLT5jbWRfdmdzLCByc2l0ZS0+dmdfbmFtZSwgTlVMTCkpCisJCQljb250aW51ZTsKKwkJcmV0ID0gMDsKKwkJLyogVXNpbmcgY21kIG1lbW9yeSBwb29sIGZvciBjbWRfdmcgbGlzdCBhbGxvY2F0aW9uICovCisJCWlmICghY21kX3ZnX2FkZChsdi0+dmctPmNtZC0+bWVtLCBsdi0+dmctPmNtZF92Z3MsCisJCQkJcnNpdGUtPnZnX25hbWUsIE5VTEwsIDApKSB7CisJCQlsdi0+dmctPmNtZF9taXNzaW5nX3ZncyA9IDA7IC8qIGRvIG5vdCByZXRyeSAqLworCQkJc3RhY2s7CisJCQlicmVhazsKKwkJfQorCisJCWxvZ19kZWJ1Z19tZXRhZGF0YSgiVkc6ICVzIGFkZGVkIGFzIG1pc3NpbmcuIiwgcnNpdGUtPnZnX25hbWUpOworCQlsdi0+dmctPmNtZF9taXNzaW5nX3ZncysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmVhZCBhbGwgcmVtb3RlIFZHcyBmcm9tIGx2J3MgcmVwbGljYXRvciBzaXRlcy4KKyAqIEZ1bmN0aW9uIGlzIHVzZWQgaW4gYWN0aXZhdGlvbiBjb250ZXh0IGFuZCBuZWVkcyBhbGwgVkdzIGFscmVhZHkgbG9ja2VkLgorICovCitpbnQgbHZfcmVhZF9yZXBsaWNhdG9yX3Zncyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldjsKKwlzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlICpyc2l0ZTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKworCWlmICghbHZfaXNfcmVwbGljYXRvcl9kZXYobHYpKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJmZpcnN0X3NlZyhsdiktPnJlcGxpY2F0b3ItPnJzaXRlcykgeworCQlpZiAoIXJzaXRlLT52Z19uYW1lKQorCQkJY29udGludWU7CisJCXZnID0gdmdfcmVhZChsdi0+dmctPmNtZCwgcnNpdGUtPnZnX25hbWUsIDAsIDAsIDApOyAvLyBSRUFEX1dJVEhPVVRfTE9DSworCQlpZiAodmdfcmVhZF9lcnJvcih2ZykpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlYWQgdm9sdW1lIGdyb3VwICVzIiwKKwkJCQkgIHJzaXRlLT52Z19uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCXJzaXRlLT52ZyA9IHZnOworCQkvKiBGSVhNRTogaGFuZGxpbmcgbWlzc2luZyBMVnMgbmVlZHMgdG8gYmUgYmV0dGVyICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKQorCQkJaWYgKCEocmRldi0+bHYgPSBmaW5kX2x2KHZnLCByZGV2LT5uYW1lKSkpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBmaW5kICVzIGluIHZvbHVtZSBncm91cCAlcyIsCisJCQkJCSAgcmRldi0+bmFtZSwgcnNpdGUtPnZnX25hbWUpOworCQkJCWdvdG8gYmFkOworCQkJfQorCX0KKworCXJldHVybiAxOworYmFkOgorCWx2X3JlbGVhc2VfcmVwbGljYXRvcl92Z3MobHYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIFJlbGVhc2UgYWxsIFZHIHJlc291cmNlcyB0YWtlbiBieSBsdidzIHJlcGxpY2F0b3Igc2l0ZXMuCisgKiBGdW5jdGlvbiBpcyB1c2VkIGluIGFjdGl2YXRpb24gY29udGV4dCBhbmQgbmVlZHMgYWxsIFZHcyBhbHJlYWR5IGxvY2tlZC4KKyAqLwordm9pZCBsdl9yZWxlYXNlX3JlcGxpY2F0b3JfdmdzKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IHJlcGxpY2F0b3Jfc2l0ZSAqcnNpdGU7CisKKwlpZiAoIWx2X2lzX3JlcGxpY2F0b3JfZGV2KGx2KSkKKwkJcmV0dXJuOworCisJZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXMocnNpdGUsICZmaXJzdF9zZWcobHYpLT5yZXBsaWNhdG9yLT5yc2l0ZXMpCisJCWlmIChyc2l0ZS0+dmdfbmFtZSAmJiByc2l0ZS0+dmcpIHsKKwkJCXJlbGVhc2VfdmcocnNpdGUtPnZnKTsKKwkJCXJzaXRlLT52ZyA9IE5VTEw7CisJCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9tZXRhZGF0YS9zZWd0eXBlLmMgYi9saWIvbWV0YWRhdGEvc2VndHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODIzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvc2VndHlwZS5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorCitzdHJ1Y3Qgc2VnbWVudF90eXBlICpnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICAgICBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCS8qIEZJWE1FIFJlZ2lzdGVyIHRoaXMgcHJvcGVybHkgd2l0aGluIHN0cmlwZWQuYyAqLworCWlmICghc3RyY21wKHN0ciwgU0VHX1RZUEVfTkFNRV9MSU5FQVIpKQorCQlzdHIgPSBTRUdfVFlQRV9OQU1FX1NUUklQRUQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VndHlwZSwgJmNtZC0+c2VndHlwZXMpCisJCWlmICghc3RyY21wKHNlZ3R5cGUtPm5hbWUsIHN0cikpCisJCQlyZXR1cm4gc2VndHlwZTsKKworCWlmICghKHNlZ3R5cGUgPSBpbml0X3Vua25vd25fc2VndHlwZShjbWQsIHN0cikpKQorCQlyZXR1cm5fTlVMTDsKKworCWRtX2xpc3RfYWRkKCZjbWQtPnNlZ3R5cGVzLCAmc2VndHlwZS0+bGlzdCk7CisJbG9nX3dhcm4oIldBUk5JTkc6IFVucmVjb2duaXNlZCBzZWdtZW50IHR5cGUgJXMiLCBzdHIpOworCisJcmV0dXJuIHNlZ3R5cGU7Cit9CisKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmdldF9zZWd0eXBlX2Zyb21fZmxhZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDY0X3QgZmxhZykKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZ3R5cGUsICZjbWQtPnNlZ3R5cGVzKQorCQlpZiAoZmxhZyAmIHNlZ3R5cGUtPmZsYWdzKQorCQkJcmV0dXJuIHNlZ3R5cGU7CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVucmVjb2duaXNlZCBzZWdtZW50IHR5cGUgZmxhZyAweCUiIFBSSXg2NCwgZmxhZyk7CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYi9tZXRhZGF0YS9zZWd0eXBlLmggYi9saWIvbWV0YWRhdGEvc2VndHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmIwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvc2VndHlwZS5oCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9TRUdUWVBFU19ICisjZGVmaW5lIF9TRUdUWVBFU19ICisKKyNpbmNsdWRlICJtZXRhZGF0YS1leHBvcnRlZC5oIgorCitzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyOworc3RydWN0IGNtZF9jb250ZXh0Oworc3RydWN0IGRtX2NvbmZpZ190cmVlOworc3RydWN0IGx2X3NlZ21lbnQ7CitzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0czsKK3N0cnVjdCBmb3JtYXR0ZXI7CitzdHJ1Y3QgZG1fY29uZmlnX25vZGU7CitzdHJ1Y3QgZGV2X21hbmFnZXI7CisKKy8qIEZlYXR1cmUgZmxhZ3MgKi8KKyNkZWZpbmUgU0VHX0NBTl9TUExJVAkJMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lIFNFR19BUkVBU19TVFJJUEVECTB4MDAwMDAwMDAwMDAwMDAwMlVMTAorI2RlZmluZSBTRUdfQVJFQVNfTUlSUk9SRUQJMHgwMDAwMDAwMDAwMDAwMDA0VUxMCisjZGVmaW5lIFNFR19TTkFQU0hPVAkJMHgwMDAwMDAwMDAwMDAwMDA4VUxMCisjZGVmaW5lIFNFR19GT1JNQVQxX1NVUFBPUlQJMHgwMDAwMDAwMDAwMDAwMDEwVUxMCisjZGVmaW5lIFNFR19WSVJUVUFMCQkweDAwMDAwMDAwMDAwMDAwMjBVTEwKKyNkZWZpbmUgU0VHX0NBTk5PVF9CRV9aRVJPRUQJMHgwMDAwMDAwMDAwMDAwMDQwVUxMCisjZGVmaW5lIFNFR19NT05JVE9SRUQJCTB4MDAwMDAwMDAwMDAwMDA4MFVMTAorI2RlZmluZSBTRUdfUkVQTElDQVRPUgkJMHgwMDAwMDAwMDAwMDAwMTAwVUxMCisjZGVmaW5lIFNFR19SRVBMSUNBVE9SX0RFVgkweDAwMDAwMDAwMDAwMDAyMDBVTEwKKyNkZWZpbmUgU0VHX1JBSUQJCTB4MDAwMDAwMDAwMDAwMDQwMFVMTAorI2RlZmluZSBTRUdfVEhJTl9QT09MCQkweDAwMDAwMDAwMDAwMDA4MDBVTEwKKyNkZWZpbmUgU0VHX1RISU5fVk9MVU1FCQkweDAwMDAwMDAwMDAwMDEwMDBVTEwKKyNkZWZpbmUgU0VHX0NBQ0hFCQkweDAwMDAwMDAwMDAwMDIwMDBVTEwKKyNkZWZpbmUgU0VHX0NBQ0hFX1BPT0wJCTB4MDAwMDAwMDAwMDAwNDAwMFVMTAorI2RlZmluZSBTRUdfTUlSUk9SCQkweDAwMDAwMDAwMDAwMDgwMDBVTEwKKyNkZWZpbmUgU0VHX09OTFlfRVhDTFVTSVZFCTB4MDAwMDAwMDAwMDAxMDAwMFVMTCAvKiBJbiBjbHVzdGVyIG9ubHkgZXhsdXNpdmUgYWN0aXZhdGlvbiAqLworI2RlZmluZSBTRUdfQ0FOX0VSUk9SX1dIRU5fRlVMTAkweDAwMDAwMDAwMDAwMjAwMDBVTEwKKworI2RlZmluZSBTRUdfUkFJRDAJCTB4MDAwMDAwMDAwMDA0MDAwMFVMTAorI2RlZmluZSBTRUdfUkFJRDBfTUVUQQkJMHgwMDAwMDAwMDAwMDgwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlEMQkJMHgwMDAwMDAwMDAwMTAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlEMTAJCTB4MDAwMDAwMDAwMDIwMDAwMFVMTAorI2RlZmluZSBTRUdfUkFJRDQJCTB4MDAwMDAwMDAwMDQwMDAwMFVMTAorI2RlZmluZSBTRUdfUkFJRDVfTgkJMHgwMDAwMDAwMDAwODAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENV9MQQkJMHgwMDAwMDAwMDAxMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENV9MUwkJMHgwMDAwMDAwMDAyMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENV9SQQkJMHgwMDAwMDAwMDA0MDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENV9SUwkJMHgwMDAwMDAwMDA4MDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENQkJU0VHX1JBSUQ1X0xTCisjZGVmaW5lIFNFR19SQUlENl9OQwkJMHgwMDAwMDAwMDEwMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENl9OUgkJMHgwMDAwMDAwMDIwMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENl9aUgkJMHgwMDAwMDAwMDQwMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENl9MQV82CQkweDAwMDAwMDAwODAwMDAwMDBVTEwKKyNkZWZpbmUgU0VHX1JBSUQ2X0xTXzYJCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAorI2RlZmluZSBTRUdfUkFJRDZfUkFfNgkJMHgwMDAwMDAwMjAwMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENl9SU182CQkweDAwMDAwMDA0MDAwMDAwMDBVTEwKKyNkZWZpbmUgU0VHX1JBSUQ2X05fNgkJMHgwMDAwMDAwODAwMDAwMDAwVUxMCisjZGVmaW5lIFNFR19SQUlENgkJU0VHX1JBSUQ2X1pSCisKKyNkZWZpbmUgU0VHX1VOS05PV04JCTB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCisjZGVmaW5lIFNFR19UWVBFX05BTUVfTElORUFSCQkibGluZWFyIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1NUUklQRUQJCSJzdHJpcGVkIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX01JUlJPUgkJIm1pcnJvciIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9TTkFQU0hPVAkJInNuYXBzaG90IgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1RISU4JCSJ0aGluIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1RISU5fUE9PTAkJInRoaW4tcG9vbCIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9DQUNIRQkJImNhY2hlIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX0NBQ0hFX1BPT0wJImNhY2hlLXBvb2wiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfRVJST1IJCSJlcnJvciIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9GUkVFCQkiZnJlZSIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9aRVJPCQkiemVybyIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlECQkicmFpZCIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlEMAkJInJhaWQwIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1JBSUQwX01FVEEJInJhaWQwX21ldGEiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfUkFJRDEJCSJyYWlkMSIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlEMTAJCSJyYWlkMTAiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfUkFJRDQJCSJyYWlkNCIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlENQkJInJhaWQ1IgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1JBSUQ1X0xBCQkicmFpZDVfbGEiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfUkFJRDVfTFMJCSJyYWlkNV9scyIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlENV9SQQkJInJhaWQ1X3JhIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1JBSUQ1X1JTCQkicmFpZDVfcnMiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfUkFJRDYJCSJyYWlkNiIKKyNkZWZpbmUgU0VHX1RZUEVfTkFNRV9SQUlENl9OQwkJInJhaWQ2X25jIgorI2RlZmluZSBTRUdfVFlQRV9OQU1FX1JBSUQ2X05SCQkicmFpZDZfbnIiCisjZGVmaW5lIFNFR19UWVBFX05BTUVfUkFJRDZfWlIJCSJyYWlkNl96ciIKKworI2RlZmluZSBzZWd0eXBlX2lzX2xpbmVhcihzZWd0eXBlKQkoIXN0cmNtcChzZWd0eXBlLT5uYW1lLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpCisjZGVmaW5lIHNlZ3R5cGVfaXNfY2FjaGUoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfQ0FDSEUgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19jYWNoZV9wb29sKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX0NBQ0hFX1BPT0wgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19taXJyb3JlZChzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19BUkVBU19NSVJST1JFRCA/IDEgOiAwKQorI2RlZmluZSBzZWd0eXBlX2lzX21pcnJvcihzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19NSVJST1IgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19wb29sKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgKFNFR19DQUNIRV9QT09MIHwgU0VHX1RISU5fUE9PTCkgID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZDAoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfUkFJRDAgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19yYWlkMF9tZXRhKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1JBSUQwX01FVEEgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19hbnlfcmFpZDAoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiAoU0VHX1JBSUQwIHwgU0VHX1JBSUQwX01FVEEpID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZChzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19SQUlEID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZDEoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfUkFJRDEgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19yYWlkNChzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19SQUlENCA/IDEgOiAwKQorI2RlZmluZSBzZWd0eXBlX2lzX2FueV9yYWlkNShzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFwKKwkJCQkJIChTRUdfUkFJRDVfTFN8U0VHX1JBSUQ1X0xBfFNFR19SQUlENV9SU3xTRUdfUkFJRDVfUkF8U0VHX1JBSUQ1X04pID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZDVfbGEoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfUkFJRDVfTEEgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19yYWlkNV9yYShzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19SQUlENV9SQSA/IDEgOiAwKQorI2RlZmluZSBzZWd0eXBlX2lzX3JhaWQ1X2xzKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1JBSUQ1X0xTID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZDVfcnMoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfUkFJRDVfUlMgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19hbnlfcmFpZDYoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBcCisJCQkJCSAoU0VHX1JBSUQ2X1pSfFNFR19SQUlENl9OQ3xTRUdfUkFJRDZfTlJ8IFwKKwkJCQkJICBTRUdfUkFJRDZfTEFfNnxTRUdfUkFJRDZfTFNfNnxTRUdfUkFJRDZfUkFfNnxTRUdfUkFJRDZfUlNfNnxTRUdfUkFJRDZfTl82KSA/IDEgOiAwKQorI2RlZmluZSBzZWd0eXBlX2lzX3JhaWQ2X25jKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1JBSUQ2X05DID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfcmFpZDZfbnIoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfUkFJRDZfTlIgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19yYWlkNl96cihzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19SQUlENl9aUiA/IDEgOiAwKQorI2RlZmluZSBzZWd0eXBlX2lzX3JhaWQxMChzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19SQUlEMTAgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc19yYWlkX3dpdGhfbWV0YShzZWd0eXBlKQkoc2VndHlwZV9pc19yYWlkKHNlZ3R5cGUpICYmICFzZWd0eXBlX2lzX3JhaWQwKHNlZ3R5cGUpKQorI2RlZmluZSBzZWd0eXBlX2lzX3NuYXBzaG90KHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1NOQVBTSE9UID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfc3RyaXBlZChzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIFNFR19BUkVBU19TVFJJUEVEID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfdGhpbihzZWd0eXBlKQkoKHNlZ3R5cGUpLT5mbGFncyAmIChTRUdfVEhJTl9QT09MfFNFR19USElOX1ZPTFVNRSkgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc190aGluX3Bvb2woc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfVEhJTl9QT09MID8gMSA6IDApCisjZGVmaW5lIHNlZ3R5cGVfaXNfdGhpbl92b2x1bWUoc2VndHlwZSkJKChzZWd0eXBlKS0+ZmxhZ3MgJiBTRUdfVEhJTl9WT0xVTUUgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc192aXJ0dWFsKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1ZJUlRVQUwgPyAxIDogMCkKKyNkZWZpbmUgc2VndHlwZV9pc191bmtub3duKHNlZ3R5cGUpCSgoc2VndHlwZSktPmZsYWdzICYgU0VHX1VOS05PV04gPyAxIDogMCkKKworI2RlZmluZSBzZWdfaXNfY2FjaGUoc2VnKQlzZWd0eXBlX2lzX2NhY2hlKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfY2FjaGVfcG9vbChzZWcpCXNlZ3R5cGVfaXNfY2FjaGVfcG9vbCgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX2xpbmVhcihzZWcpCShzZWdfaXNfc3RyaXBlZChzZWcpICYmICgoc2VnKS0+YXJlYV9jb3VudCA9PSAxKSkKKyNkZWZpbmUgc2VnX2lzX21pcnJvcihzZWcpCXNlZ3R5cGVfaXNfbWlycm9yKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfbWlycm9yZWQoc2VnKQlzZWd0eXBlX2lzX21pcnJvcmVkKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfcG9vbChzZWcpCXNlZ3R5cGVfaXNfcG9vbCgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQwKHNlZykJc2VndHlwZV9pc19yYWlkMCgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQwX21ldGEoc2VnKQlzZWd0eXBlX2lzX3JhaWQwX21ldGEoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19hbnlfcmFpZDAoc2VnKQlzZWd0eXBlX2lzX2FueV9yYWlkMCgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQoc2VnKQlzZWd0eXBlX2lzX3JhaWQoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19yYWlkMShzZWcpCXNlZ3R5cGVfaXNfcmFpZDEoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19yYWlkNChzZWcpCXNlZ3R5cGVfaXNfcmFpZDQoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19hbnlfcmFpZDUoc2VnKQlzZWd0eXBlX2lzX2FueV9yYWlkNSgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQ1X2xhKHNlZykJc2VndHlwZV9pc19yYWlkNV9sYSgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQ1X3JhKHNlZykJc2VndHlwZV9pc19yYWlkNV9yYSgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQ1X2xzKHNlZykJc2VndHlwZV9pc19yYWlkNV9scygoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3JhaWQ1X3JzKHNlZykJc2VndHlwZV9pc19yYWlkNV9ycygoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX2FueV9yYWlkNihzZWcpCXNlZ3R5cGVfaXNfYW55X3JhaWQ2KChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfcmFpZDZfenIoc2VnKQlzZWd0eXBlX2lzX3JhaWQ2X3pyKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfcmFpZDZfbnIoc2VnKQlzZWd0eXBlX2lzX3JhaWQ2X25yKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfcmFpZDZfbmMoc2VnKQlzZWd0eXBlX2lzX3JhaWQ2X25jKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfcmFpZDEwKHNlZykJc2VndHlwZV9pc19yYWlkMTAoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19yYWlkX3dpdGhfbWV0YShzZWcpCXNlZ3R5cGVfaXNfcmFpZF93aXRoX21ldGEoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc19yZXBsaWNhdG9yKHNlZykJKChzZWcpLT5zZWd0eXBlLT5mbGFncyAmIFNFR19SRVBMSUNBVE9SID8gMSA6IDApCisjZGVmaW5lIHNlZ19pc19yZXBsaWNhdG9yX2RldihzZWcpICgoc2VnKS0+c2VndHlwZS0+ZmxhZ3MgJiBTRUdfUkVQTElDQVRPUl9ERVYgPyAxIDogMCkKKyNkZWZpbmUgc2VnX2lzX3NuYXBzaG90KHNlZykJc2VndHlwZV9pc19zbmFwc2hvdCgoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2lzX3N0cmlwZWQoc2VnKQlzZWd0eXBlX2lzX3N0cmlwZWQoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc190aGluKHNlZykJc2VndHlwZV9pc190aGluKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfaXNfdGhpbl9wb29sKHNlZykJc2VndHlwZV9pc190aGluX3Bvb2woKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc190aGluX3ZvbHVtZShzZWcpCXNlZ3R5cGVfaXNfdGhpbl92b2x1bWUoKHNlZyktPnNlZ3R5cGUpCisjZGVmaW5lIHNlZ19pc192aXJ0dWFsKHNlZykJc2VndHlwZV9pc192aXJ0dWFsKChzZWcpLT5zZWd0eXBlKQorI2RlZmluZSBzZWdfdW5rbm93bihzZWcpCXNlZ3R5cGVfaXNfdW5rbm93bigoc2VnKS0+c2VndHlwZSkKKyNkZWZpbmUgc2VnX2Nhbl9zcGxpdChzZWcpCSgoc2VnKS0+c2VndHlwZS0+ZmxhZ3MgJiBTRUdfQ0FOX1NQTElUID8gMSA6IDApCisjZGVmaW5lIHNlZ19jYW5ub3RfYmVfemVyb2VkKHNlZykgKChzZWcpLT5zZWd0eXBlLT5mbGFncyAmIFNFR19DQU5OT1RfQkVfWkVST0VEID8gMSA6IDApCisjZGVmaW5lIHNlZ19tb25pdG9yZWQoc2VnKQkoKHNlZyktPnNlZ3R5cGUtPmZsYWdzICYgU0VHX01PTklUT1JFRCA/IDEgOiAwKQorI2RlZmluZSBzZWdfb25seV9leGNsdXNpdmUoc2VnKQkoKHNlZyktPnNlZ3R5cGUtPmZsYWdzICYgU0VHX09OTFlfRVhDTFVTSVZFID8gMSA6IDApCisjZGVmaW5lIHNlZ19jYW5fZXJyb3Jfd2hlbl9mdWxsKHNlZykgKChzZWcpLT5zZWd0eXBlLT5mbGFncyAmIFNFR19DQU5fRVJST1JfV0hFTl9GVUxMID8gMSA6IDApCisKK3N0cnVjdCBzZWdtZW50X3R5cGUgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CQkvKiBJbnRlcm5hbCAqLworCisJdWludDY0X3QgZmxhZ3M7CisJdWludDMyX3QgcGFyaXR5X2RldnM7CQkvKiBQYXJpdHkgZHJpdmVzIHJlcXVpcmVkIGJ5IHNlZ3R5cGUgKi8KKworCXN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgKm9wczsKKwljb25zdCBjaGFyICpuYW1lOworCisJdm9pZCAqbGlicmFyeTsJCQkvKiBsdm1fcmVnaXN0ZXJfc2VndHlwZSgpIHNldHMgdGhpcy4gKi8KKwl2b2lkICpwcml2YXRlOwkJCS8qIEZvciB0aGUgc2VndHlwZSBoYW5kbGVyIHRvIHVzZS4gKi8KK307CisKK3N0cnVjdCBzZWd0eXBlX2hhbmRsZXIgeworCWNvbnN0IGNoYXIgKigqbmFtZSkgKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICogc2VnKTsKKwljb25zdCBjaGFyICooKnRhcmdldF9uYW1lKSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cyk7CisJdm9pZCAoKmRpc3BsYXkpIChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqIHNlZyk7CisJaW50ICgqdGV4dF9leHBvcnQpIChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqIHNlZywKKwkJCSAgICBzdHJ1Y3QgZm9ybWF0dGVyICogZik7CisJaW50ICgqdGV4dF9pbXBvcnRfYXJlYV9jb3VudCkgKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqIHNuLAorCQkJCSAgICAgICB1aW50MzJfdCAqYXJlYV9jb3VudCk7CisJaW50ICgqdGV4dF9pbXBvcnQpIChzdHJ1Y3QgbHZfc2VnbWVudCAqIHNlZywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKiBzbiwKKwkJCSAgICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqIHB2X2hhc2gpOworCWludCAoKm1lcmdlX3NlZ21lbnRzKSAoc3RydWN0IGx2X3NlZ21lbnQgKiBzZWcxLAorCQkJICAgICAgIHN0cnVjdCBsdl9zZWdtZW50ICogc2VnMik7CisJaW50ICgqYWRkX3RhcmdldF9saW5lKSAoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdm9pZCAqKnRhcmdldF9zdGF0ZSwKKwkJCQlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCWNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsCisJCQkJc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDY0X3QgbGVuLAorCQkJCXVpbnQzMl90ICpwdm1vdmVfbWlycm9yX2NvdW50KTsKKwlpbnQgKCp0YXJnZXRfc3RhdHVzX2NvbXBhdGlibGUpIChjb25zdCBjaGFyICp0eXBlKTsKKwlpbnQgKCpjaGVja190cmFuc2llbnRfc3RhdHVzKSAoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY2hhciAqcGFyYW1zKTsKKwlpbnQgKCp0YXJnZXRfcGVyY2VudCkgKHZvaWQgKip0YXJnZXRfc3RhdGUsCisJCQkgICAgICAgZG1fcGVyY2VudF90ICpwZXJjZW50LAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICogbWVtLAorCQkJICAgICAgIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGNoYXIgKnBhcmFtcywKKwkJCSAgICAgICB1aW50NjRfdCAqdG90YWxfbnVtZXJhdG9yLAorCQkJICAgICAgIHVpbnQ2NF90ICp0b3RhbF9kZW5vbWluYXRvcik7CisJaW50ICgqdGFyZ2V0X3ByZXNlbnQpIChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJICAgICAgIHVuc2lnbmVkICphdHRyaWJ1dGVzKTsKKwlpbnQgKCptb2R1bGVzX25lZWRlZCkgKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCSAgICAgICBzdHJ1Y3QgZG1fbGlzdCAqbW9kdWxlcyk7CisJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3Qgc2VnbWVudF90eXBlICogc2VndHlwZSk7CisJaW50ICgqdGFyZ2V0X21vbml0b3JlZCkgKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqcGVuZGluZyk7CisJaW50ICgqdGFyZ2V0X21vbml0b3JfZXZlbnRzKSAoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50IGV2ZW50cyk7CisJaW50ICgqdGFyZ2V0X3VubW9uaXRvcl9ldmVudHMpIChzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZlbnRzKTsKK307CisKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnN0cik7CitzdHJ1Y3Qgc2VnbWVudF90eXBlICpnZXRfc2VndHlwZV9mcm9tX2ZsYWcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgIHVpbnQ2NF90IGZsYWcpOworCitzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5OworaW50IGx2bV9yZWdpc3Rlcl9zZWd0eXBlKHN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYiwKKwkJCSBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKTsKKworc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF9zdHJpcGVkX3NlZ3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF96ZXJvX3NlZ3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF9lcnJvcl9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfZnJlZV9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfdW5rbm93bl9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZGVmaW5lIFJBSURfRkVBVFVSRV9SQUlEMTAJCQkoMVUgPDwgMCkgLyogdmVyc2lvbiAxLjMgKi8KKyNkZWZpbmUgUkFJRF9GRUFUVVJFX1JBSUQwCQkJKDFVIDw8IDEpIC8qIHZlcnNpb24gMS43ICovCisjZGVmaW5lIFJBSURfRkVBVFVSRV9SRVNIQVBJTkcJCQkoMVUgPDwgMikgLyogdmVyc2lvbiAxLjggKi8KKworI2lmZGVmIFJBSURfSU5URVJOQUwKK2ludCBpbml0X3JhaWRfc2VndHlwZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYik7CisjZW5kaWYKKworI2lmZGVmIFJFUExJQ0FUT1JfSU5URVJOQUwKK2ludCBpbml0X3JlcGxpY2F0b3Jfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKTsKKyNlbmRpZgorCisjZGVmaW5lIFRISU5fRkVBVFVSRV9ESVNDQVJEUwkJCSgxVSA8PCAwKQorI2RlZmluZSBUSElOX0ZFQVRVUkVfRVhURVJOQUxfT1JJR0lOCQkoMVUgPDwgMSkKKyNkZWZpbmUgVEhJTl9GRUFUVVJFX0hFTERfUk9PVAkJCSgxVSA8PCAyKQorI2RlZmluZSBUSElOX0ZFQVRVUkVfQkxPQ0tfU0laRQkJCSgxVSA8PCAzKQorI2RlZmluZSBUSElOX0ZFQVRVUkVfRElTQ0FSRFNfTk9OX1BPV0VSXzIJKDFVIDw8IDQpCisjZGVmaW5lIFRISU5fRkVBVFVSRV9NRVRBREFUQV9SRVNJWkUJCSgxVSA8PCA1KQorI2RlZmluZSBUSElOX0ZFQVRVUkVfRVhURVJOQUxfT1JJR0lOX0VYVEVORAkoMVUgPDwgNikKKyNkZWZpbmUgVEhJTl9GRUFUVVJFX0VSUk9SX0lGX05PX1NQQUNFCQkoMVUgPDwgNykKKworI2lmZGVmIFRISU5fSU5URVJOQUwKK2ludCBpbml0X3RoaW5fc2VndHlwZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYik7CisjZW5kaWYKKworI2lmZGVmIENBQ0hFX0lOVEVSTkFMCitpbnQgaW5pdF9jYWNoZV9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKTsKKyNlbmRpZgorCisjZGVmaW5lIENBQ0hFX0ZFQVRVUkVfUE9MSUNZX01RCQkJKDFVIDw8IDApCisjZGVmaW5lIENBQ0hFX0ZFQVRVUkVfUE9MSUNZX1NNUQkJKDFVIDw8IDEpCisKKyNkZWZpbmUgU05BUFNIT1RfRkVBVFVSRV9GSVhFRF9MRUFLCQkoMVUgPDwgMCkgLyogdmVyc2lvbiAxLjEyICovCisKKyNpZmRlZiBTTkFQU0hPVF9JTlRFUk5BTAorc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF9zbmFwc2hvdF9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKyNlbmRpZgorCisjZGVmaW5lIE1JUlJPUl9MT0dfQ0xVU1RFUkVECQkJKDFVIDw8IDApCisKKyNpZmRlZiBNSVJST1JFRF9JTlRFUk5BTAorc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF9taXJyb3JlZF9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKyNlbmRpZgorCisjaWZkZWYgQ1JZUFRfSU5URVJOQUwKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfY3J5cHRfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvc25hcHNob3RfbWFuaXAuYyBiL2xpYi9tZXRhZGF0YS9zbmFwc2hvdF9tYW5pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTNhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvc25hcHNob3RfbWFuaXAuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJsdl9hbGxvYy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisKKyNkZWZpbmUgU05BUFNIT1RfTUlOX0NIVU5LUwkzICAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGNodW5rcyBpbiBzbmFwc2hvdCAqLworCitpbnQgbHZfaXNfb3JpZ2luKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIGx2LT5vcmlnaW5fY291bnQgPyAxIDogMDsKK30KKworaW50IGx2X2lzX2Nvdyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCS8qIE1ha2Ugc3VyZSBhIG1lcmdpbmcgdGhpbiBvcmlnaW4gaXNuJ3QgY29uZnVzZWQgYXMgYSBjb3cgTFYgKi8KKwlyZXR1cm4gKCFsdl9pc190aGluX3ZvbHVtZShsdikgJiYgIWx2X2lzX29yaWdpbihsdikgJiYgbHYtPnNuYXBzaG90KSA/IDEgOiAwOworfQorCitzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmZpbmRfY293KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc25hcCkKK3sKKwlyZXR1cm4gZmlyc3Rfc2VnKHNuYXApLT5jb3c7Cit9CisKKy8qCisgKiBTb21lIGtlcm5lbHMgaGF2ZSBhIGJ1ZyB0aGF0IHRoZXkgbWF5IGxlYWsgc3BhY2UgaW4gdGhlIHNuYXBzaG90IG9uIGNyYXNoLgorICogSWYgdGhlIGtlcm5lbCBpcyBidWdneSwgd2UgYWRkIHNvbWUgZXh0cmEgc3BhY2UuCisgKi8KK3N0YXRpYyB1aW50NjRfdCBfY293X2V4dHJhX2NodW5rcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDY0X3Qgbl9jaHVua3MpCit7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwl1bnNpZ25lZCBhdHRycyA9IDA7CisKKwlpZiAoYWN0aXZhdGlvbigpICYmCisJICAgIChzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX1NOQVBTSE9UKSkgJiYKKwkgICAgc2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudCAmJgorCSAgICBzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KGNtZCwgTlVMTCwgJmF0dHJzKSAmJgorCSAgICAoYXR0cnMgJiBTTkFQU0hPVF9GRUFUVVJFX0ZJWEVEX0xFQUspKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAobl9jaHVua3MgKyA2MykgLyA2NDsKK30KKworc3RhdGljIHVpbnQ2NF90IF9jb3dfbWF4X3NpemUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQ2NF90IG9yaWdpbl9zaXplLCB1aW50MzJfdCBjaHVua19zaXplKQoreworCS8qIFNuYXBzaG90IGRpc2sgbGF5b3V0OgorCSAqICAgIENPVyBpcyBkaXZpZGVkIGludG8gY2h1bmtzCisJICogICAgICAgIDFzdC4gY2h1bmsgaXMgcmVzZXJ2ZWQgZm9yIGhlYWRlcgorCSAqICAgICAgICAybmQuIGNodW5rIGlzIHRoZSAxc3QuIG1ldGFkYXRhIGNodW5rCisJICogICAgICAgIDNyZC4gY2h1bmsgaXMgdGhlIDFzdC4gZGF0YSBjaHVuaworCSAqLworCisJdWludDY0X3Qgb3JpZ2luX2NodW5rcyA9IChvcmlnaW5fc2l6ZSArIGNodW5rX3NpemUgLSAxKSAvIGNodW5rX3NpemU7CisJdWludDY0X3QgY2h1bmtzX3Blcl9tZXRhZGF0YV9hcmVhID0gKHVpbnQ2NF90KWNodW5rX3NpemUgPDwgKFNFQ1RPUl9TSElGVCAtIDQpOworCisJLyoKKwkgKiBOb3RlOiBpZiBvcmlnaW5fY2h1bmtzIGlzIGRpdmlzaWJsZSBieSBjaHVua3NfcGVyX21ldGFkYXRhX2FyZWEsIHdlCisJICogbmVlZCBvbmUgZXh0cmEgbWV0YWRhdGEgY2h1bmsgYXMgYSB0ZXJtaW5hdG9yLgorCSAqLworCXVpbnQ2NF90IG1ldGFkYXRhX2NodW5rcyA9IChvcmlnaW5fY2h1bmtzICsgY2h1bmtzX3Blcl9tZXRhZGF0YV9hcmVhKSAvIGNodW5rc19wZXJfbWV0YWRhdGFfYXJlYTsKKwl1aW50NjRfdCBuX2NodW5rcyA9IDEgKyBvcmlnaW5fY2h1bmtzICsgbWV0YWRhdGFfY2h1bmtzOworCisJcmV0dXJuIChuX2NodW5rcyArIF9jb3dfZXh0cmFfY2h1bmtzKGNtZCwgbl9jaHVua3MpKSAqIGNodW5rX3NpemU7Cit9CisKK3VpbnQzMl90IGNvd19tYXhfZXh0ZW50cyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbiwgdWludDMyX3QgY2h1bmtfc2l6ZSkKK3sKKwl1aW50NjRfdCBzaXplID0gX2Nvd19tYXhfc2l6ZShvcmlnaW4tPnZnLT5jbWQsIG9yaWdpbi0+c2l6ZSwgY2h1bmtfc2l6ZSk7CisJdWludDMyX3QgZXh0ZW50X3NpemUgPSBvcmlnaW4tPnZnLT5leHRlbnRfc2l6ZTsKKwl1aW50NjRfdCBtYXhfc2l6ZSA9ICh1aW50NjRfdCkgTUFYX0VYVEVOVF9DT1VOVCAqIGV4dGVudF9zaXplOworCisJaWYgKHNpemUgJSBleHRlbnRfc2l6ZSkKKwkJc2l6ZSArPSBleHRlbnRfc2l6ZSAtIHNpemUgJSBleHRlbnRfc2l6ZTsKKworCWlmIChzaXplID4gbWF4X3NpemUpCisJCXNpemUgPSBtYXhfc2l6ZTsgLyogT3JpZ2luIGlzIHRvbyBiaWcgZm9yIDEwMCUgc25hcHNob3QgYW55d2F5ICovCisKKwlyZXR1cm4gKHVpbnQzMl90KSAoc2l6ZSAvIGV4dGVudF9zaXplKTsKK30KKworaW50IGNvd19oYXNfbWluX2NodW5rcyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdWludDMyX3QgY293X2V4dGVudHMsIHVpbnQzMl90IGNodW5rX3NpemUpCit7CisJaWYgKCgodWludDY0X3QpdmctPmV4dGVudF9zaXplICogY293X2V4dGVudHMpID49IChTTkFQU0hPVF9NSU5fQ0hVTktTICogY2h1bmtfc2l6ZSkpCisJCXJldHVybiAxOworCisJbG9nX2Vycm9yKCJTbmFwc2hvdCB2b2x1bWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAiIERNX1RPX1NUUklORyhTTkFQU0hPVF9NSU5fQ0hVTktTKQorCQkgICIgY2h1bmtzICgldSBleHRlbnRzLCAlcykuIiwgKHVuc2lnbmVkKQorCQkgICgoKHVpbnQ2NF90KSBTTkFQU0hPVF9NSU5fQ0hVTktTICogY2h1bmtfc2l6ZSArCisJCSAgICB2Zy0+ZXh0ZW50X3NpemUgLSAxKSAvIHZnLT5leHRlbnRfc2l6ZSksCisJCSAgZGlzcGxheV9zaXplKHZnLT5jbWQsICh1aW50NjRfdCkgU05BUFNIT1RfTUlOX0NIVU5LUyAqIGNodW5rX3NpemUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgbHZfaXNfY293X2NvdmVyaW5nX29yaWdpbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBsdl9pc19jb3cobHYpICYmCisJCShsdi0+c2l6ZSA+PSBfY293X21heF9zaXplKGx2LT52Zy0+Y21kLCBvcmlnaW5fZnJvbV9jb3cobHYpLT5zaXplLAorCQkJCQkgICBmaW5kX3NuYXBzaG90KGx2KS0+Y2h1bmtfc2l6ZSkpOworfQorCitpbnQgbHZfaXNfdmlzaWJsZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWlmIChsdl9pc19oaXN0b3JpY2FsKGx2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobHYtPnN0YXR1cyAmIFNOQVBTSE9UKQorCQlyZXR1cm4gMDsKKworCWlmIChsdl9pc19jb3cobHYpKSB7CisJCWlmIChsdl9pc192aXJ0dWFsX29yaWdpbihvcmlnaW5fZnJvbV9jb3cobHYpKSkKKwkJCXJldHVybiAxOworCisJCWlmIChsdl9pc19tZXJnaW5nX2NvdyhsdikpCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gbHZfaXNfdmlzaWJsZShvcmlnaW5fZnJvbV9jb3cobHYpKTsKKwl9CisKKwlyZXR1cm4gbHYtPnN0YXR1cyAmIFZJU0lCTEVfTFYgPyAxIDogMDsKK30KKworaW50IGx2X2lzX21lcmdpbmdfY293KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY293KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzbmFwX3NlZzsKKworCWlmICghbHZfaXNfY293KGNvdykpCisJCXJldHVybiAwOworCisJc25hcF9zZWcgPSBmaW5kX3NuYXBzaG90KGNvdyk7CisKKwkvKiBjaGVja3MgbHZfc2VnbWVudCdzIHN0YXR1cyB0byBzZWUgaWYgc25hcHNob3QgaXMgbWVyZ2luZyAqLworCXJldHVybiAoc25hcF9zZWcgJiYgKHNuYXBfc2VnLT5zdGF0dXMgJiBNRVJHSU5HKSkgPyAxIDogMDsKK30KKworc3RydWN0IGx2X3NlZ21lbnQgKmZpbmRfc25hcHNob3QoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gbHYtPnNuYXBzaG90OworfQorCisvKiBHaXZlbiBhIGNvdyBMViwgcmV0dXJuIGl0cyBvcmlnaW4gKi8KK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2Zyb21fY293KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKGx2LT5zbmFwc2hvdCkKKwkJcmV0dXJuIGx2LT5zbmFwc2hvdC0+b3JpZ2luOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGluaXRfc25hcHNob3Rfc2VnKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luLAorCQkgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjb3csIHVpbnQzMl90IGNodW5rX3NpemUsIGludCBtZXJnZSkKK3sKKwlzZWctPmNodW5rX3NpemUgPSBjaHVua19zaXplOworCXNlZy0+b3JpZ2luID0gb3JpZ2luOworCXNlZy0+Y293ID0gY293OworCisJbHZfc2V0X2hpZGRlbihjb3cpOworCisJY293LT5zbmFwc2hvdCA9IHNlZzsKKworCW9yaWdpbi0+b3JpZ2luX2NvdW50Kys7CisKKwkvKiBGSVhNRSBBc3N1bWVzIGFuIGludmlzaWJsZSBvcmlnaW4gYmVsb25ncyB0byBhIHNwYXJzZSBkZXZpY2UgKi8KKwlpZiAoIWx2X2lzX3Zpc2libGUob3JpZ2luKSkKKwkJb3JpZ2luLT5zdGF0dXMgfD0gVklSVFVBTF9PUklHSU47CisKKwlzZWctPmx2LT5zdGF0dXMgfD0gKFNOQVBTSE9UIHwgVklSVFVBTCk7CisJaWYgKG1lcmdlKQorCQlpbml0X3NuYXBzaG90X21lcmdlKHNlZywgb3JpZ2luKTsKKworCWRtX2xpc3RfYWRkKCZvcmlnaW4tPnNuYXBzaG90X3NlZ3MsICZzZWctPm9yaWdpbl9saXN0KTsKK30KKwordm9pZCBpbml0X3NuYXBzaG90X21lcmdlKHN0cnVjdCBsdl9zZWdtZW50ICpzbmFwX3NlZywKKwkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbikKK3sKKwlzbmFwX3NlZy0+c3RhdHVzIHw9IE1FUkdJTkc7CisJb3JpZ2luLT5zbmFwc2hvdCA9IHNuYXBfc2VnOworCW9yaWdpbi0+c3RhdHVzIHw9IE1FUkdJTkc7CisKKwlpZiAoc2VnX2lzX3RoaW5fdm9sdW1lKHNuYXBfc2VnKSkgeworCQlzbmFwX3NlZy0+bWVyZ2VfbHYgPSBvcmlnaW47CisJCS8qIE1ha2luZyB0aGluIExWIGludmlzaWJsZSB3aXRoIHJlZ3VsYXIgbG9nICovCisJCWx2X3NldF9oaWRkZW4oc25hcF9zZWctPmx2KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRXZlbiB0aG91Z2ggbHZfaXNfdmlzaWJsZShzbmFwX3NlZy0+bHYpIHJldHVybnMgMCwKKwkgKiB0aGUgc25hcF9zZWctPmx2IChuYW1lOiBzbmFwc2hvdFgpIGlzIF9ub3RfIGhpZGRlbjsKKwkgKiB0aGlzIGlzIHBhcnQgb2YgdGhlIGx2bTIgc25hcHNob3QgZmljdGlvbi4gIE11c3QKKwkgKiBjbGVhciBWSVNJQkxFX0xWIGRpcmVjdGx5IChsdl9zZXRfdmlzaWJsZSBjYW4ndCkKKwkgKiAtIHNuYXBfc2VnLT5sdi0+c3RhdHVzIGlzIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyICdsdicKKwkgKiAgICh3aXRoIHVzZXIgcHJvdmlkZWQgc25hcHNob3QgTFYgbmFtZSkgaXMgdmlzaWJsZQorCSAqIC0gdGhpcyBhbHNvIGVuYWJsZXMgdmdfdmFsaWRhdGUoKSB0byBzdWNjZWVkIHdpdGgKKwkgKiAgIG1lcmdlIG1ldGFkYXRhIChzbmFwX3NlZy0+bHYgaXMgbm93ICJpbnRlcm5hbCIpCisJICovCisJc25hcF9zZWctPmx2LT5zdGF0dXMgJj0gflZJU0lCTEVfTFY7Cit9CisKK3ZvaWQgY2xlYXJfc25hcHNob3RfbWVyZ2Uoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW4pCit7CisJLyogY2xlYXIgbWVyZ2UgYXR0cmlidXRlcyAqLworCWlmIChvcmlnaW4tPnNuYXBzaG90LT5tZXJnZV9sdikKKwkJLyogUmVtb3ZlZCB0aGluIHZvbHVtZSBoYXMgdG8gYmUgdmlzaWJsZSAqLworCQlsdl9zZXRfdmlzaWJsZShvcmlnaW4tPnNuYXBzaG90LT5sdik7CisKKwlvcmlnaW4tPnNuYXBzaG90LT5tZXJnZV9sdiA9IE5VTEw7CisJb3JpZ2luLT5zbmFwc2hvdC0+c3RhdHVzICY9IH5NRVJHSU5HOworCW9yaWdpbi0+c25hcHNob3QgPSBOVUxMOworCW9yaWdpbi0+c3RhdHVzICY9IH5NRVJHSU5HOworfQorCitzdGF0aWMgc3RydWN0IGx2X3NlZ21lbnQgKl9hbGxvY19zbmFwc2hvdF9zZWcoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisKKwlzZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU05BUFNIT1QpOworCWlmICghc2VndHlwZSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNuYXBzaG90IHNlZ3R5cGUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoc2VnID0gYWxsb2NfbHZfc2VnbWVudChzZWd0eXBlLCBsdiwgMCwgbHYtPmxlX2NvdW50LCAwLCAwLAorCQkJCSAgICAgTlVMTCwgMCwgbHYtPmxlX2NvdW50LCAwLCAwLCAwLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgc25hcHNob3Qgc2VnbWVudC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG1fbGlzdF9hZGQoJmx2LT5zZWdtZW50cywgJnNlZy0+bGlzdCk7CisKKwlyZXR1cm4gc2VnOworfQorCitpbnQgdmdfYWRkX3NuYXBzaG90KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luLAorCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjb3csIHVuaW9uIGx2aWQgKmx2aWQsCisJCSAgICB1aW50MzJfdCBleHRlbnRfY291bnQsIHVpbnQzMl90IGNodW5rX3NpemUpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzbmFwOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwkvKgorCSAqIElzIHRoZSBjb3cgZGV2aWNlIGFscmVhZHkgYmVpbmcgdXNlZCA/CisJICovCisJaWYgKGx2X2lzX2Nvdyhjb3cpKSB7CisJCWxvZ19lcnJvcigiJyVzJyBpcyBhbHJlYWR5IGluIHVzZSBhcyBhIHNuYXBzaG90LiIsIGNvdy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjb3cgPT0gb3JpZ2luKSB7CisJCWxvZ19lcnJvcigiU25hcHNob3QgYW5kIG9yaWdpbiBMVnMgbXVzdCBkaWZmZXIuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHNuYXAgPSBsdl9jcmVhdGVfZW1wdHkoInNuYXBzaG90JWQiLAorCQkJCSAgICAgbHZpZCwgTFZNX1JFQUQgfCBMVk1fV1JJVEUgfCBWSVNJQkxFX0xWLAorCQkJCSAgICAgQUxMT0NfSU5IRVJJVCwgb3JpZ2luLT52ZykpKQorCQlyZXR1cm5fMDsKKworCXNuYXAtPmxlX2NvdW50ID0gZXh0ZW50X2NvdW50OworCisJaWYgKCEoc2VnID0gX2FsbG9jX3NuYXBzaG90X3NlZyhzbmFwKSkpCisJCXJldHVybl8wOworCisJaW5pdF9zbmFwc2hvdF9zZWcoc2VnLCBvcmlnaW4sIGNvdywgY2h1bmtfc2l6ZSwgMCk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3JlbW92ZV9zbmFwc2hvdChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvdykKK3sKKwlpbnQgbWVyZ2luZ19zbmFwc2hvdCA9IDA7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW4gPSBvcmlnaW5fZnJvbV9jb3coY293KTsKKwlpbnQgaXNfb3JpZ2luX2FjdGl2ZSA9IGx2X2lzX2FjdGl2ZShvcmlnaW4pOworCisJaWYgKGlzX29yaWdpbl9hY3RpdmUgJiYKKwkgICAgbHZfaXNfdmlydHVhbF9vcmlnaW4ob3JpZ2luKSkgeworCQlpZiAoIWRlYWN0aXZhdGVfbHYob3JpZ2luLT52Zy0+Y21kLCBvcmlnaW4pKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiIsCisJCQkJICBvcmlnaW4tPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaXNfb3JpZ2luX2FjdGl2ZSA9IDA7CisJfQorCisJZG1fbGlzdF9kZWwoJmNvdy0+c25hcHNob3QtPm9yaWdpbl9saXN0KTsKKwlvcmlnaW4tPm9yaWdpbl9jb3VudC0tOworCisJaWYgKGx2X2lzX21lcmdpbmdfb3JpZ2luKG9yaWdpbikgJiYKKwkgICAgKGZpbmRfc25hcHNob3Qob3JpZ2luKSA9PSBmaW5kX3NuYXBzaG90KGNvdykpKSB7CisJCWNsZWFyX3NuYXBzaG90X21lcmdlKG9yaWdpbik7CisJCS8qCisJCSAqIHByZWxvYWQgb3JpZ2luIElGRiAic25hcHNob3QtbWVyZ2UiIHRhcmdldCBpcyBhY3RpdmUKKwkJICogLSBJTVBPUlRBTlQ6IGF2b2lkcyBwcmVsb2FkIGlmIGluYWN0aXZhdGUgbWVyZ2UgaXMgcGVuZGluZworCQkgKi8KKwkJaWYgKGx2X2hhc190YXJnZXRfdHlwZShvcmlnaW4tPnZnLT52Z21lbSwgb3JpZ2luLCBOVUxMLAorCQkJCSAgICAgICBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkpIHsKKwkJCS8qCisJCQkgKiBwcmVsb2FkIG9yaWdpbiB0bzoKKwkJCSAqIC0gYWxsb3cgcHJvcGVyIHJlbGVhc2Ugb2YgLWNvdworCQkJICogLSBhdm9pZCBhbGxvY2F0aW9ucyB3aXRoIG90aGVyIGRldmljZXMgc3VzcGVuZGVkCisJCQkgKiAgIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tICJzbmFwc2hvdC1tZXJnZSIgdG8KKwkJCSAqICAgInNuYXBzaG90LW9yaWdpbiBhZnRlciBhIG1lcmdlIGNvbXBsZXRlcy4KKwkJCSAqLworCQkJbWVyZ2luZ19zbmFwc2hvdCA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWx2X3JlbW92ZShjb3ctPnNuYXBzaG90LT5sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVtb3ZlIGludGVybmFsIHNuYXBzaG90IExWICVzIiwKKwkJCSAgY293LT5zbmFwc2hvdC0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwljb3ctPnNuYXBzaG90ID0gTlVMTDsKKwlsdl9zZXRfdmlzaWJsZShjb3cpOworCisJLyogZm9ybWF0MSBtdXN0IGRvIHRoZSBjaGFuZ2UgaW4gb25lIHN0ZXAsIHdpdGggdGhlIGNvbW1pdCBsYXN0LiAqLworCWlmICghKG9yaWdpbi0+dmctPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9NREFTKSkgeworCQkvKiBHZXQgdGhlIGxvY2sgZm9yIENPVyB2b2x1bWUgKi8KKwkJaWYgKGlzX29yaWdpbl9hY3RpdmUgJiYgIWFjdGl2YXRlX2x2KGNvdy0+dmctPmNtZCwgY293KSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWN0aXZhdGUgbG9naWNhbCB2b2x1bWUgXCIlc1wiIiwKKwkJCQkgIGNvdy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIXZnX3dyaXRlKG9yaWdpbi0+dmcpKQorCQlyZXR1cm5fMDsKKworCS8qIFNraXAgY2FsbCBzdXNwZW5kLCBpZiBkZXZpY2UgaXMgbm90IGFjdGl2ZSAqLworCWlmIChpc19vcmlnaW5fYWN0aXZlICYmICFzdXNwZW5kX2x2KG9yaWdpbi0+dmctPmNtZCwgb3JpZ2luKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZWZyZXNoICVzIHdpdGhvdXQgc25hcHNob3QuIiwKKwkJCSAgb3JpZ2luLT5uYW1lKTsKKwkJdmdfcmV2ZXJ0KG9yaWdpbi0+dmcpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCF2Z19jb21taXQob3JpZ2luLT52ZykpCisJCXJldHVybl8wOworCisJaWYgKGlzX29yaWdpbl9hY3RpdmUpIHsKKwkJLyoKKwkJICogSWYgdGhlIHNuYXBzaG90IHdhcyBhY3RpdmUgYW5kIHRoZSBDT1cgTFYgaXMgdGFrZW4gYXdheQorCQkgKiB0aGUgTFYgbG9jayBvbiBjbHVzdGVyIGhhcyB0byBiZSBncmFiYmVkLCBzbyB1c2UKKwkJICogYWN0aXZhdGVfbHYoKSB3aGljaCByZXN1bWVzIHN1c3BlbmQgY293IGRldmljZS4KKwkJICovCisJCWlmICghbWVyZ2luZ19zbmFwc2hvdCAmJiAhYWN0aXZhdGVfbHYoY293LT52Zy0+Y21kLCBjb3cpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhY3RpdmF0ZSAlcy4iLCBjb3ctPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXJlc3VtZV9sdihvcmlnaW4tPnZnLT5jbWQsIG9yaWdpbikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlc3VtZSAlcy4iLCBvcmlnaW4tPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBGb3IgbWVyZ2VkIHNuYXBzaG90IGFuZCBjbHVzdGVyZWQgVkcgYWN0aXZhdGUgY293IExWIHNvCisJCSAqIHRoZSBmb2xsb3dpbmcgY2FsbCB0byBkZWFjdGl2YXRlX2x2KCkgY2FuIGNsZWFuLXVwIHRhYmxlCisJCSAqIGVudHJpZXMuIEZvciB0aGlzIGNsdXN0ZXJlZCBsb2NrIG5lZWQgdG8gYmUgaGVsZC4KKwkJICovCisJCWlmICh2Z19pc19jbHVzdGVyZWQoY293LT52ZykgJiYKKwkJICAgIG1lcmdpbmdfc25hcHNob3QgJiYgIWFjdGl2YXRlX2x2KGNvdy0+dmctPmNtZCwgY293KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWN0aXZhdGUgJXMuIiwgY293LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvdGFrZW92ZXJfbWF0cml4LmggYi9saWIvbWV0YWRhdGEvdGFrZW92ZXJfbWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczNjY0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tZXRhZGF0YS90YWtlb3Zlcl9tYXRyaXguaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIE4gX3Rha2VvdmVyX25vb3AKKyNkZWZpbmUgWCBfdGFrZW92ZXJfdW5zdXBwb3J0ZWQKKworI2RlZmluZSBsaW5fcjAgICBfdGFrZW92ZXJfZnJvbV9saW5lYXJfdG9fcmFpZDAKKyNkZWZpbmUgbGluX3IwICAgX3Rha2VvdmVyX2Zyb21fbGluZWFyX3RvX3JhaWQwCisjZGVmaW5lIGxpbl9yMSAgIF90YWtlb3Zlcl9mcm9tX2xpbmVhcl90b19yYWlkMQorI2RlZmluZSBsaW5fcjEwICBfdGFrZW92ZXJfZnJvbV9saW5lYXJfdG9fcmFpZDEwCisjZGVmaW5lIGxpbl9yNDUgIF90YWtlb3Zlcl9mcm9tX2xpbmVhcl90b19yYWlkNDUKKyNkZWZpbmUgbWlyX3IwICAgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDAKKyNkZWZpbmUgbWlyX3IwbSAgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDBfbWV0YQorI2RlZmluZSBtaXJfcjEgICBfdGFrZW92ZXJfZnJvbV9taXJyb3JlZF90b19yYWlkMQorI2RlZmluZSBtaXJfcjEwICBfdGFrZW92ZXJfZnJvbV9taXJyb3JlZF90b19yYWlkMTAKKyNkZWZpbmUgbWlyX3I0NSAgX3Rha2VvdmVyX2Zyb21fbWlycm9yZWRfdG9fcmFpZDQ1CisjZGVmaW5lIHIwMV9yMDEgIF90YWtlb3Zlcl9mcm9tX3JhaWQwMV90b19yYWlkMDEKKyNkZWZpbmUgcjAxX3IxMCAgX3Rha2VvdmVyX2Zyb21fcmFpZDAxX3RvX3JhaWQxMAorI2RlZmluZSByMDFfc3RyICBfdGFrZW92ZXJfZnJvbV9yYWlkMDFfdG9fc3RyaXBlZAorI2RlZmluZSByMF9fbGluICBfdGFrZW92ZXJfZnJvbV9yYWlkMF90b19saW5lYXIKKyNkZWZpbmUgcjBfX21pciAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fbWlycm9yZWQKKyNkZWZpbmUgcjBtX2xpbiAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19saW5lYXIKKyNkZWZpbmUgcjBtX21pciAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19taXJyb3JlZAorI2RlZmluZSByMG1fcjAgICBfdGFrZW92ZXJfZnJvbV9yYWlkMF9tZXRhX3RvX3JhaWQwCisjZGVmaW5lIHIwbV9yMSAgIF90YWtlb3Zlcl9mcm9tX3JhaWQwX21ldGFfdG9fcmFpZDEKKyNkZWZpbmUgcjBtX3IxMCAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19yYWlkMTAKKyNkZWZpbmUgcjBtX3I0NSAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19yYWlkNDUKKyNkZWZpbmUgcjBtX3I2ICAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfbWV0YV90b19yYWlkNgorI2RlZmluZSByMG1fc3RyICBfdGFrZW92ZXJfZnJvbV9yYWlkMF9tZXRhX3RvX3N0cmlwZWQKKyNkZWZpbmUgcjBfX3IwbSAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fcmFpZDBfbWV0YQorI2RlZmluZSByMF9fcjEgICBfdGFrZW92ZXJfZnJvbV9yYWlkMF90b19yYWlkMQorI2RlZmluZSByMF9fcjEwICBfdGFrZW92ZXJfZnJvbV9yYWlkMF90b19yYWlkMTAKKyNkZWZpbmUgcjBfX3I0NSAgX3Rha2VvdmVyX2Zyb21fcmFpZDBfdG9fcmFpZDQ1CisjZGVmaW5lIHIwX19yNiAgIF90YWtlb3Zlcl9mcm9tX3JhaWQwX3RvX3JhaWQ2CisjZGVmaW5lIHIwX19zdHIgIF90YWtlb3Zlcl9mcm9tX3JhaWQwX3RvX3N0cmlwZWQKKyNkZWZpbmUgcjEwX2xpbiAgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX2xpbmVhcgorI2RlZmluZSByMTBfbWlyICBfdGFrZW92ZXJfZnJvbV9yYWlkMTBfdG9fbWlycm9yZWQKKyNkZWZpbmUgcjEwX3IwICAgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3JhaWQwCisjZGVmaW5lIHIxMF9yMDEgIF90YWtlb3Zlcl9mcm9tX3JhaWQxMF90b19yYWlkMDEKKyNkZWZpbmUgcjEwX3IwbSAgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3JhaWQwX21ldGEKKyNkZWZpbmUgcjEwX3IxICAgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3JhaWQxCisjZGVmaW5lIHIxMF9yMTAgIF90YWtlb3Zlcl9mcm9tX3JhaWQxMF90b19yYWlkMTAKKyNkZWZpbmUgcjEwX3N0ciAgX3Rha2VvdmVyX2Zyb21fcmFpZDEwX3RvX3N0cmlwZWQKKyNkZWZpbmUgcjFfX2xpbiAgX3Rha2VvdmVyX2Zyb21fcmFpZDFfdG9fbGluZWFyCisjZGVmaW5lIHIxX19taXIgIF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX21pcnJvcmVkCisjZGVmaW5lIHIxX19yMCAgIF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQwCisjZGVmaW5lIHIxX19yMG0gIF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQwX21ldGEKKyNkZWZpbmUgcjFfX3IxICAgX3Rha2VvdmVyX2Zyb21fcmFpZDFfdG9fcmFpZDEKKyNkZWZpbmUgcjFfX3IxMCAgX3Rha2VvdmVyX2Zyb21fcmFpZDFfdG9fcmFpZDEwCisjZGVmaW5lIHIxX19yNDUgIF90YWtlb3Zlcl9mcm9tX3JhaWQxX3RvX3JhaWQ0NQorI2RlZmluZSByMV9fc3RyICBfdGFrZW92ZXJfZnJvbV9yYWlkMV90b19zdHJpcGVkCisjZGVmaW5lIHI0NV9saW4gIF90YWtlb3Zlcl9mcm9tX3JhaWQ0NV90b19saW5lYXIKKyNkZWZpbmUgcjQ1X21pciAgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX21pcnJvcmVkCisjZGVmaW5lIHI0NV9yMCAgIF90YWtlb3Zlcl9mcm9tX3JhaWQ0NV90b19yYWlkMAorI2RlZmluZSByNDVfcjBtICBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fcmFpZDBfbWV0YQorI2RlZmluZSByNDVfcjEgICBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fcmFpZDEKKyNkZWZpbmUgcjQ1X3I1NCAgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3JhaWQ1NAorI2RlZmluZSByNDVfcjYgICBfdGFrZW92ZXJfZnJvbV9yYWlkNDVfdG9fcmFpZDYKKyNkZWZpbmUgcjQ1X3N0ciAgX3Rha2VvdmVyX2Zyb21fcmFpZDQ1X3RvX3N0cmlwZWQKKyNkZWZpbmUgcjZfX3IwICAgX3Rha2VvdmVyX2Zyb21fcmFpZDZfdG9fcmFpZDAKKyNkZWZpbmUgcjZfX3IwbSAgX3Rha2VvdmVyX2Zyb21fcmFpZDZfdG9fcmFpZDBfbWV0YQorI2RlZmluZSByNl9fcjQ1ICBfdGFrZW92ZXJfZnJvbV9yYWlkNl90b19yYWlkNDUKKyNkZWZpbmUgcjZfX3N0ciAgX3Rha2VvdmVyX2Zyb21fcmFpZDZfdG9fc3RyaXBlZAorI2RlZmluZSBzdHJfcjAgICBfdGFrZW92ZXJfZnJvbV9zdHJpcGVkX3RvX3JhaWQwCisjZGVmaW5lIHN0cl9yMDEgIF90YWtlb3Zlcl9mcm9tX3N0cmlwZWRfdG9fcmFpZDAxCisjZGVmaW5lIHN0cl9yMG0gIF90YWtlb3Zlcl9mcm9tX3N0cmlwZWRfdG9fcmFpZDBfbWV0YQorI2RlZmluZSBzdHJfcjEwICBfdGFrZW92ZXJfZnJvbV9zdHJpcGVkX3RvX3JhaWQxMAorI2RlZmluZSBzdHJfcjQ1ICBfdGFrZW92ZXJfZnJvbV9zdHJpcGVkX3RvX3JhaWQ0NQorI2RlZmluZSBzdHJfcjYgICBfdGFrZW92ZXJfZnJvbV9zdHJpcGVkX3RvX3JhaWQ2CisKK3N0YXRpYyB1aW50NjRfdCBfc2VndHlwZV9pbmRleFtdID0geworCTEsIC8qIGxpbmVhciAqLworCTEsIC8qIHN0cmlwZWQgKi8KKwlTRUdfTUlSUk9SLAorCVNFR19SQUlEMCwKKwlTRUdfUkFJRDBfTUVUQSwKKwlTRUdfUkFJRDEsCisJU0VHX1JBSUQ0IHwgU0VHX1JBSUQ1X0xTIHwgU0VHX1JBSUQ1X0xBIHwgU0VHX1JBSUQ1X0xTIHwgU0VHX1JBSUQ1X1JTIHwgU0VHX1JBSUQ1X1JBIHwgU0VHX1JBSUQ1X04sCisJU0VHX1JBSUQ2X0xTXzYgfCBTRUdfUkFJRDZfTEFfNiB8IFNFR19SQUlENl9SU182IHwgU0VHX1JBSUQ2X1JBXzYgfCBTRUdfUkFJRDZfTkMgfCBTRUdfUkFJRDZfTlIgfCBTRUdfUkFJRDZfWlIgfCBTRUdfUkFJRDZfTl82LAorCTAsIC8vIFNFR19SQUlEMTBfTkVBUiB8IFNFR19SQUlEMTBfRkFSIHwgU0VHX1JBSUQxMF9PRkZTRVQsCisJMCwgLy8gU0VHX1JBSUQwMSwKKwkwCit9OworCisvKgorICogTWF0cml4IG9mIHRha2VvdmVyIGZ1bmN0aW9ucy4KKyAqIFJvdyBjb3JyZXNwb25kcyB0byBvcmlnaW5hbCBzZWdtZW50IHR5cGUuCisgKiBDb2x1bW4gY29ycmVzcG9uZHMgdG8gbmV3IHNlZ21lbnQgdHlwZS4KKyAqIE4gcmVwcmVzZW50cyBhIGNvbWJpbmF0aW9uIHRoYXQgaGFzIG5vIGVmZmVjdCAobm8tb3ApLgorICogWCByZXByZXNlbnRzIGEgY29tYmluYXRpb24gdGhhdCBpcyB1bnN1cHBvcnRlZC4KKyAqLworc3RhdGljIHRha2VvdmVyX2ZuX3QgX3Rha2VvdmVyX2Zuc1tdWzExXSA9IHsKKyAgICAgICAgLyogZnJvbSwgdG8gLT4gICAgbGluZWFyICAgICBzdHJpcGVkICAgbWlycm9yICAgIHJhaWQwICAgIHJhaWQwX21ldGEgcmFpZDEgICByYWlkNC81ICAgcmFpZDYgICAgcmFpZDEwICAgIHJhaWQwMSAgIG90aGVyKi8KKyAgICAgICAgLyogICB8ICovCisgICAgICAgIC8qICAgdiAqLworICAgICAgICAvKiBsaW5lYXIgICAgICovIHsgTiAgICAgICwgIFggICAgICAsICBYICAgICAgLCAgbGluX3IwLCAgbGluX3IwICwgIGxpbl9yMSwgIGxpbl9yNDUsICBYICAgICAsICBsaW5fcjEwLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiBzdHJpcGVkICAgICovIHsgWCAgICAgICwgIE4gICAgICAsICBYICAgICAgLCAgc3RyX3IwLCAgc3RyX3IwbSwgIGxpbl9yMSwgIHN0cl9yNDUsICBzdHJfcjYsICBzdHJfcjEwLCAgc3RyX3IwMSwgWCB9LAorICAgICAgICAvKiBtaXJyb3IgICAgICovIHsgWCAgICAgICwgIFggICAgICAsICBOICAgICAgLCAgbWlyX3IwLCAgbWlyX3IwbSwgIG1pcl9yMSwgIG1pcl9yNDUsICBYICAgICAsICBtaXJfcjEwLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkMCAgICAgICovIHsgcjBfX2xpbiwgIHIwX19zdHIsICByMF9fbWlyLCAgTiAgICAgLCAgcjBfX3IwbSwgIHIwX19yMSwgIHIwX19yNDUsICByMF9fcjYsICByMF9fcjEwLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkMF9tZXRhICovIHsgcjBtX2xpbiwgIHIwbV9zdHIsICByMG1fbWlyLCAgcjBtX3IwLCAgTiAgICAgICwgIHIwbV9yMSwgIHIwbV9yNDUsICByMG1fcjYsICByMG1fcjEwLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkMSAgICAgICovIHsgcjFfX2xpbiwgIHIxX19zdHIsICByMV9fbWlyLCAgcjFfX3IwLCAgcjFfX3IwbSwgIHIxX19yMSwgIHIxX19yNDUsICBYICAgICAsICByMV9fcjEwLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkNC81ICAgICovIHsgcjQ1X2xpbiwgIHI0NV9zdHIsICByNDVfbWlyLCAgcjQ1X3IwLCAgcjQ1X3IwbSwgIHI0NV9yMSwgIHI0NV9yNTQsICByNDVfcjYsICBYICAgICAgLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkNiAgICAgICovIHsgWCAgICAgICwgIHI2X19zdHIsICBYICAgICAgLCAgcjZfX3IwLCAgcjZfX3IwbSwgIFggICAgICwgIHI2X19yNDUsICBYICAgICAsICBYICAgICAgLCAgWCAgICAgICwgWCB9LAorICAgICAgICAvKiByYWlkMTAgICAgICovIC8vIHsgcjEwX2xpbiwgIHIxMF9zdHIsICByMTBfbWlyLCAgcjEwX3IwLCAgcjEwX3IwbSwgIHIxMF9yMSwgIFggICAgICAsICBYICAgICAsICByMTBfcjEwLCAgcjEwX3IwMSwgWCB9LAorICAgICAgICAvKiByYWlkMDEgICAgICovIC8vIHsgWCAgICAgICwgIHIwMV9zdHIsICBYICAgICAgLCAgWCAgICAgLCAgWCAgICAgICwgIFggICAgICwgIFggICAgICAsICBYICAgICAsICByMDFfcjEwLCAgcjAxX3IwMSwgWCB9LAorICAgICAgICAvKiBvdGhlciAgICAgICovIHsgWCAgICAgICwgIFggICAgICAsICBYICAgICAgLCAgWCAgICAgLCAgWCAgICAgICwgIFggICAgICwgIFggICAgICAsICBYICAgICAsICBYICAgICAgLCAgWCAgICAgICwgWCB9LAorfTsKKyN1bmRlZiBYCisjdW5kZWYgTgpkaWZmIC0tZ2l0IGEvbGliL21ldGFkYXRhL3RoaW5fbWFuaXAuYyBiL2xpYi9tZXRhZGF0YS90aGluX21hbmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5MjkwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tZXRhZGF0YS90aGluX21hbmlwLmMKQEAgLTAsMCArMSw3NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorCisvKiBUT0RPOiBkcm9wIHVudXNlZCBub191cGRhdGUgKi8KK2ludCBhdHRhY2hfcG9vbF9tZXNzYWdlKHN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZywgZG1fdGhpbl9tZXNzYWdlX3QgdHlwZSwKKwkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGRlbGV0ZV9pZCwKKwkJCWludCBub191cGRhdGUpCit7CisJc3RydWN0IGx2X3RoaW5fbWVzc2FnZSAqdG1zZzsKKworCWlmICghc2VnX2lzX3RoaW5fcG9vbChwb29sX3NlZykpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDYW5ub3QgYXR0YWNoIG1lc3NhZ2UgdG8gbm9uLXBvb2wgTFYgJXMuIiwgcG9vbF9zZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBvb2xfaGFzX21lc3NhZ2UocG9vbF9zZWcsIGx2LCBkZWxldGVfaWQpKSB7CisJCWlmIChsdikKKwkJCWxvZ19lcnJvcigiTWVzc2FnZSByZWZlcnJpbmcgTFYgJXMgYWxyZWFkeSBxdWV1ZWQgaW4gcG9vbCAlcy4iLAorCQkJCSAgbHYtPm5hbWUsIHBvb2xfc2VnLT5sdi0+bmFtZSk7CisJCWVsc2UKKwkJCWxvZ19lcnJvcigiRGVsZXRlIGZvciBkZXZpY2UgJXUgYWxyZWFkeSBxdWV1ZWQgaW4gcG9vbCAlcy4iLAorCQkJCSAgZGVsZXRlX2lkLCBwb29sX3NlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISh0bXNnID0gZG1fcG9vbF9hbGxvYyhwb29sX3NlZy0+bHYtPnZnLT52Z21lbSwgc2l6ZW9mKCp0bXNnKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVzc2FnZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1NOQVA6CisJY2FzZSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1RISU46CisJCXRtc2ctPnUubHYgPSBsdjsKKwkJYnJlYWs7CisJY2FzZSBETV9USElOX01FU1NBR0VfREVMRVRFOgorCQl0bXNnLT51LmRlbGV0ZV9pZCA9IGRlbGV0ZV9pZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJXUuIiwgdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCXRtc2ctPnR5cGUgPSB0eXBlOworCisJLyogSWYgdGhlIDFzdCBtZXNzYWdlIGlzIGFkZCBpbiBub24tcmVhZC1vbmx5IG1vZGUsIG1vZGlmeSB0cmFuc2FjdGlvbl9pZCAqLworCWlmICghbm9fdXBkYXRlICYmIGRtX2xpc3RfZW1wdHkoJnBvb2xfc2VnLT50aGluX21lc3NhZ2VzKSkKKwkJcG9vbF9zZWctPnRyYW5zYWN0aW9uX2lkKys7CisKKwlkbV9saXN0X2FkZCgmcG9vbF9zZWctPnRoaW5fbWVzc2FnZXMsICZ0bXNnLT5saXN0KTsKKworCWxvZ19kZWJ1Z19tZXRhZGF0YSgiQWRkZWQgJXMgbWVzc2FnZS4iLAorCQkJICAgKHR5cGUgPT0gRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9TTkFQIHx8CisJCQkgICAgdHlwZSA9PSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1RISU4pID8gImNyZWF0ZSIgOgorCQkJICAgKHR5cGUgPT0gRE1fVEhJTl9NRVNTQUdFX0RFTEVURSkgPyAiZGVsZXRlIiA6ICJ1bmtub3duIik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGF0dGFjaF90aGluX2V4dGVybmFsX29yaWdpbihzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZXh0ZXJuYWxfbHYpCit7CisJaWYgKHNlZy0+ZXh0ZXJuYWxfbHYpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViBcIiVzXCIgYWxyZWFkeSBoYXMgZXh0ZXJuYWwgb3JpZ2luLiIsCisJCQkgIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWctPmV4dGVybmFsX2x2ID0gZXh0ZXJuYWxfbHY7CisKKwlpZiAoZXh0ZXJuYWxfbHYpIHsKKwkJaWYgKCFhZGRfc2VnX3RvX3NlZ3NfdXNpbmdfdGhpc19sdihleHRlcm5hbF9sdiwgc2VnKSkKKwkJCXJldHVybl8wOworCisJCWV4dGVybmFsX2x2LT5leHRlcm5hbF9jb3VudCsrOworCisJCWlmIChleHRlcm5hbF9sdi0+c3RhdHVzICYgTFZNX1dSSVRFKSB7CisJCQlsb2dfdmVyYm9zZSgiU2V0dGluZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIgcmVhZC1vbmx5LiIsCisJCQkJICAgIGV4dGVybmFsX2x2LT5uYW1lKTsKKwkJCWV4dGVybmFsX2x2LT5zdGF0dXMgJj0gfkxWTV9XUklURTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgZGV0YWNoX3RoaW5fZXh0ZXJuYWxfb3JpZ2luKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJaWYgKHNlZy0+ZXh0ZXJuYWxfbHYpIHsKKwkJaWYgKCFsdl9pc19leHRlcm5hbF9vcmlnaW4oc2VnLT5leHRlcm5hbF9sdikpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiSW5jb25zaXRlbnQgZXh0ZXJuYWwgb3JpZ2luLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXJlbW92ZV9zZWdfZnJvbV9zZWdzX3VzaW5nX3RoaXNfbHYoc2VnLT5leHRlcm5hbF9sdiwgc2VnKSkKKwkJCXJldHVybl8wOworCisJCXNlZy0+ZXh0ZXJuYWxfbHYtPmV4dGVybmFsX2NvdW50LS07CisJCXNlZy0+ZXh0ZXJuYWxfbHYgPSBOVUxMOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgbHZfaXNfbWVyZ2luZ190aGluX3NuYXBzaG90KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlyZXR1cm4gKHNlZyAmJiBzZWctPnN0YXR1cyAmIE1FUkdJTkcpID8gMSA6IDA7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHBvb2wgaGFzIHNvbWUgbWVzc2FnZSBxdWV1ZWQgZm9yIExWIG9yIGZvciBkZXZpY2VfaWQKKyAqIFdoZW4gTFYgaXMgTlVMTCBhbmQgZGV2aWNlX2lkIGlzIDAgaXQganVzdCBjaGVja3MgZm9yIGFueSBtZXNzYWdlLgorICovCitpbnQgcG9vbF9oYXNfbWVzc2FnZShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHVpbnQzMl90IGRldmljZV9pZCkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfdGhpbl9tZXNzYWdlICp0bXNnOworCisJaWYgKCFzZWdfaXNfdGhpbl9wb29sKHNlZykpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJMViAlcyBpcyBub3QgcG9vbC4iLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsdiAmJiAhZGV2aWNlX2lkKQorCQlyZXR1cm4gIWRtX2xpc3RfZW1wdHkoJnNlZy0+dGhpbl9tZXNzYWdlcyk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModG1zZywgJnNlZy0+dGhpbl9tZXNzYWdlcykgeworCQlzd2l0Y2ggKHRtc2ctPnR5cGUpIHsKKwkJY2FzZSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1NOQVA6CisJCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOOgorCQkJaWYgKHRtc2ctPnUubHYgPT0gbHYpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBETV9USElOX01FU1NBR0VfREVMRVRFOgorCQkJaWYgKHRtc2ctPnUuZGVsZXRlX2lkID09IGRldmljZV9pZCkKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBvb2xfaXNfYWN0aXZlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCWNvbnN0IHN0cnVjdCBzZWdfbGlzdCAqc2w7CisKKwlpZiAoIWx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJwb29sX2lzX2FjdGl2ZSBjYWxsZWQgd2l0aCBub24tcG9vbCB2b2x1bWUgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT24gY2x1c3RlcmVkIFZHLCBxdWVyeSBldmVyeSByZWxhdGVkIHRoaW4gcG9vbCB2b2x1bWUgKi8KKwlpZiAodmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpIHsKKwkJaWYgKGx2X2lzX2FjdGl2ZShsdikpCisJCQlyZXR1cm4gMTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZsdi0+c2Vnc191c2luZ190aGlzX2x2KQorCQkJaWYgKGx2X2lzX2FjdGl2ZShzbC0+c2VnLT5sdikpIHsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUG9vbCdzIHRoaW4gdm9sdW1lICVzIGlzIGFjdGl2ZS4iLAorCQkJCQkJICAgICBkaXNwbGF5X2x2bmFtZShzbC0+c2VnLT5sdikpOworCQkJCXJldHVybiAxOworCQkJfQorCX0gZWxzZSBpZiAobHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDEsICZpbmZvLCAwLCAwKSAmJiBpbmZvLmV4aXN0cykKKwkJcmV0dXJuIDE7IC8qIE5vbiBjbHVzdGVyZWQgVkcgLSBqdXN0IGNoZWNrcyBmb3IgJy10cG9vbCcgKi8KKworCXJldHVybiAwOworfQorCitpbnQgdGhpbl9wb29sX2ZlYXR1cmVfc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBmZWF0dXJlKQoreworCXN0YXRpYyB1bnNpZ25lZCBhdHRyID0gMFU7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmICghbHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkxWICVzIGlzIG5vdCB0aGluIHBvb2wuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWcgPSBmaXJzdF9zZWcobHYpOworCWlmICgoYXR0ciA9PSAwVSkgJiYgYWN0aXZhdGlvbigpICYmIHNlZy0+c2VndHlwZSAmJgorCSAgICBzZWctPnNlZ3R5cGUtPm9wcy0+dGFyZ2V0X3ByZXNlbnQgJiYKKwkgICAgIXNlZy0+c2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudChsdi0+dmctPmNtZCwgTlVMTCwgJmF0dHIpKSB7CisJCWxvZ19lcnJvcigiJXM6IFJlcXVpcmVkIGRldmljZS1tYXBwZXIgdGFyZ2V0KHMpIG5vdCAiCisJCQkgICJkZXRlY3RlZCBpbiB5b3VyIGtlcm5lbC4iLCBzZWctPnNlZ3R5cGUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKGF0dHIgJiBmZWF0dXJlKSA/IDEgOiAwOworfQorCitpbnQgcG9vbF9iZWxvd190aHJlc2hvbGQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnKQoreworCWRtX3BlcmNlbnRfdCBwZXJjZW50OworCWRtX3BlcmNlbnRfdCB0aHJlc2hvbGQgPSBETV9QRVJDRU5UXzEgKgorCQlmaW5kX2NvbmZpZ190cmVlX2ludChwb29sX3NlZy0+bHYtPnZnLT5jbWQsIGFjdGl2YXRpb25fdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkX0NGRywKKwkJCQkgICAgIGx2X2NvbmZpZ19wcm9maWxlKHBvb2xfc2VnLT5sdikpOworCisJLyogRGF0YSAqLworCWlmICghbHZfdGhpbl9wb29sX3BlcmNlbnQocG9vbF9zZWctPmx2LCAwLCAmcGVyY2VudCkpCisJCXJldHVybl8wOworCisJaWYgKHBlcmNlbnQgPiB0aHJlc2hvbGQpIHsKKwkJbG9nX2RlYnVnKCJUaHJlc2hvbGQgY29uZmlndXJlZCBmb3IgZnJlZSBkYXRhIHNwYWNlIGluICIKKwkJCSAgInRoaW4gcG9vbCAlcyBoYXMgYmVlbiByZWFjaGVkICglLjJmJSUgPj0gJS4yZiUlKS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX3NlZy0+bHYpLAorCQkJICBkbV9wZXJjZW50X3RvX2Zsb2F0KHBlcmNlbnQpLAorCQkJICBkbV9wZXJjZW50X3RvX2Zsb2F0KHRocmVzaG9sZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNZXRhZGF0YSAqLworCWlmICghbHZfdGhpbl9wb29sX3BlcmNlbnQocG9vbF9zZWctPmx2LCAxLCAmcGVyY2VudCkpCisJCXJldHVybl8wOworCisJaWYgKHBlcmNlbnQgPiB0aHJlc2hvbGQpIHsKKwkJbG9nX2RlYnVnKCJUaHJlc2hvbGQgY29uZmlndXJlZCBmb3IgZnJlZSBtZXRhZGF0YSBzcGFjZSBpbiAiCisJCQkgICJ0aGluIHBvb2wgJXMgaGFzIGJlZW4gcmVhY2hlZCAoJS4yZiUlID4gJS4yZiUlKS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX3NlZy0+bHYpLAorCQkJICBkbV9wZXJjZW50X3RvX2Zsb2F0KHBlcmNlbnQpLAorCQkJICBkbV9wZXJjZW50X3RvX2Zsb2F0KHRocmVzaG9sZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERldGVjdCBvdmVycHJvdmlzaW9uaW5nIGFuZCBjaGVjayBsdm0yIGlzIGNvbmZpZ3VyZWQgZm9yIGF1dG8gcmVzaXplLgorICoKKyAqIElmIHBhc3NlZCBMViBpcyB0aGluIHZvbHVtZS9wb29sLCBjaGVjayBmaXJzdCBvbmx5IHRoaXMgb25lIGZvciBvdmVycHJvdmlzaW9uZy4KKyAqIExvdHMgb2YgdGVzdCBjb21iaW5lZCB0b2dldGhlci4KKyAqIFRlc3QgaXMgbm90IGRldGVjdGluZyBzdGF0dXMgb2YgZG1ldmVudGQsIHRvbyBjb21wbGV4IGZvciBub3cuLi4KKyAqLworaW50IHBvb2xfY2hlY2tfb3ZlcnByb3Zpc2lvbmluZyhjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IHN0cnVjdCBsdl9saXN0ICpsdmw7CisJY29uc3Qgc3RydWN0IHNlZ19saXN0ICpzbDsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYgPSBOVUxMOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gbHYtPnZnLT5jbWQ7CisJY29uc3QgY2hhciAqdHh0ID0gIiI7CisJdWludDY0X3QgdGhpbnN1bSA9IDAsIHBvb2xzdW0gPSAwLCBzeiA9IH4wOworCWludCB0aHJlc2hvbGQsIG1heF90aHJlc2hvbGQgPSAwOworCWludCBwZXJjZW50LCBtaW5fcGVyY2VudCA9IDEwMDsKKwlpbnQgbW9yZV9wb29scyA9IDA7CisKKwkvKiBXaGVuIHBhc3NlZCB0aGluIHZvbHVtZSwgY2hlY2sgcmVsYXRlZCBwb29sIGZpcnN0ICovCisJaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSkKKwkJcG9vbF9sdiA9IGZpcnN0X3NlZyhsdiktPnBvb2xfbHY7CisJZWxzZSBpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkKKwkJcG9vbF9sdiA9IGx2OworCisJaWYgKHBvb2xfbHYpIHsKKwkJcG9vbHN1bSArPSBwb29sX2x2LT5zaXplOworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsICZwb29sX2x2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJCQl0aGluc3VtICs9IHNsLT5zZWctPmx2LT5zaXplOworCisJCWlmICh0aGluc3VtIDw9IHBvb2xzdW0pCisJCQlyZXR1cm4gMTsgLyogQWxsIHRoaW5zIGZpdCBpbnRvIHRoaXMgdGhpbiBwb29sICovCisJfQorCisJLyogU3VtIGFsbCB0aGlucyBhbmQgYWxsIHRoaW4gcG9vbHMgaW4gVkcgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmbHYtPnZnLT5sdnMpIHsKKwkJaWYgKCFsdl9pc190aGluX3Bvb2wobHZsLT5sdikpCisJCQljb250aW51ZTsKKworCQl0aHJlc2hvbGQgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkX0NGRywKKwkJCQkJCSBsdl9jb25maWdfcHJvZmlsZShsdmwtPmx2KSk7CisJCXBlcmNlbnQgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudF9DRkcsCisJCQkJCSAgICAgICBsdl9jb25maWdfcHJvZmlsZShsdmwtPmx2KSk7CisJCWlmICh0aHJlc2hvbGQgPiBtYXhfdGhyZXNob2xkKQorCQkJbWF4X3RocmVzaG9sZCA9IHRocmVzaG9sZDsKKwkJaWYgKHBlcmNlbnQgPCBtaW5fcGVyY2VudCkKKwkJCW1pbl9wZXJjZW50ID0gcGVyY2VudDsKKworCQlpZiAobHZsLT5sdiA9PSBwb29sX2x2KQorCQkJY29udGludWU7IC8qIFNraXAgaXRlcmF0aW9uIGZvciBhbHJlYWR5IGNoZWNrZWQgdGhpbiBwb29sICovCisKKwkJbW9yZV9wb29scysrOworCQlwb29sc3VtICs9IGx2bC0+bHYtPnNpemU7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJmx2bC0+bHYtPnNlZ3NfdXNpbmdfdGhpc19sdikKKwkJCXRoaW5zdW0gKz0gc2wtPnNlZy0+bHYtPnNpemU7CisJfQorCisJaWYgKHRoaW5zdW0gPD0gcG9vbHN1bSkKKwkJcmV0dXJuIDE7IC8qIEFsbCBmaXRzIGZvciBhbGwgcG9vbHMgKi8KKworCWlmICgoc3ogPSB2Z19zaXplKGx2LT52ZykpIDwgdGhpbnN1bSkKKwkJLyogVGhpbiBzdW0gc2l6ZSBpcyBhYm92ZSBWRyBzaXplICovCisJCXR4dCA9ICIgYW5kIHRoZSBzaXplIG9mIHdob2xlIHZvbHVtZSBncm91cCI7CisJZWxzZSBpZiAoKHN6ID0gdmdfZnJlZShsdi0+dmcpKSA8IHRoaW5zdW0pCisJCS8qIFRoaW4gc3VtIHNpemUgaXMgbW9yZSB0aGVuIGZyZWUgc3BhY2UgaW4gYSBWRyAqLworCQl0eHQgPSAhc3ogPyAiIiA6ICIgYW5kIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBpbiB2b2x1bWUgZ3JvdXAiOworCWVsc2UgaWYgKChtYXhfdGhyZXNob2xkID4gOTkpIHx8ICFtaW5fcGVyY2VudCkKKwkJLyogVGhlcmUgaXMgc29tZSBmcmVlIHNwYWNlIGluIFZHLCBidXQgaXQgaXMgbm90IGNvbmZpZ3VyZWQKKwkJICogZm9yIGdyb3dpbmcgLSB0aHJlc2hvbGQgaXMgMTAwJSBvciBwZXJjZW50IGlzIDAlICovCisJCXN6ID0gcG9vbHN1bTsKKwllbHNlCisJCXN6ID0gVUlOVDY0X0MofjApOyAvKiBObyB3YXJuaW5nICovCisKKwlpZiAoc3ogIT0gVUlOVDY0X0MofjApKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBTdW0gb2YgYWxsIHRoaW4gdm9sdW1lIHNpemVzICglcykgZXhjZWVkcyB0aGUgIgorCQkJICJzaXplIG9mIHRoaW4gcG9vbCVzJXMlcyAoJXMpISIsCisJCQkgZGlzcGxheV9zaXplKGNtZCwgdGhpbnN1bSksCisJCQkgbW9yZV9wb29scyA/ICIiIDogIiAiLAorCQkJIG1vcmVfcG9vbHMgPyAicyIgOiBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSwKKwkJCSB0eHQsCisJCQkgKHN6ID4gMCkgPyBkaXNwbGF5X3NpemUoY21kLCBzeikgOiAibm8gZnJlZSBzcGFjZSBpbiB2b2x1bWUgZ3JvdXAiKTsKKwkJaWYgKG1heF90aHJlc2hvbGQgPiA5OSkKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJGb3IgdGhpbiBwb29sIGF1dG8gZXh0ZW5zaW9uIGFjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkIHNob3VsZCBiZSBiZWxvdyAxMDAuIik7CisJCWlmICghbWluX3BlcmNlbnQpCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiRm9yIHRoaW4gcG9vbCBhdXRvIGV4dGVuc2lvbiBhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQgc2hvdWxkIGJlIGFib3ZlIDAuIik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSBnaXZlbiBleHRlcm5hbCBvcmlnaW4gY291bGQgYmUgdXNlZCB3aXRoIHRoaW4gcG9vbAorICovCitpbnQgcG9vbF9zdXBwb3J0c19leHRlcm5hbF9vcmlnaW4oY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnBvb2xfc2VnLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmV4dGVybmFsX2x2KQoreworCXVpbnQzMl90IGNzaXplID0gcG9vbF9zZWctPmNodW5rX3NpemU7CisKKwlpZiAoKChleHRlcm5hbF9sdi0+c2l6ZSA8IGNzaXplKSB8fCAoZXh0ZXJuYWxfbHYtPnNpemUgJSBjc2l6ZSkpICYmCisJICAgICF0aGluX3Bvb2xfZmVhdHVyZV9zdXBwb3J0ZWQocG9vbF9zZWctPmx2LCBUSElOX0ZFQVRVUkVfRVhURVJOQUxfT1JJR0lOX0VYVEVORCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCB1c2UgXCIlc1wiIGFzIGV4dGVybmFsIG9yaWdpbiB3aXRoIFwiJXNcIiBwb29sLiAiCisJCQkgICJTaXplICVzIGlzIG5vdCBhIG11bHRpcGxlIG9mIHBvb2wncyBjaHVuayBzaXplICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGV4dGVybmFsX2x2KSwgZGlzcGxheV9sdm5hbWUocG9vbF9zZWctPmx2KSwKKwkJCSAgZGlzcGxheV9zaXplKGV4dGVybmFsX2x2LT52Zy0+Y21kLCBleHRlcm5hbF9sdi0+c2l6ZSksCisJCQkgIGRpc3BsYXlfc2l6ZShleHRlcm5hbF9sdi0+dmctPmNtZCwgY3NpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqZmluZF9wb29sX2x2KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCWlmICghKHNlZyA9IGZpcnN0X3NlZyhsdikpKSB7CisJCWxvZ19lcnJvcigiTFYgJXMgaGFzIG5vIHNlZ21lbnQiLCBsdi0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHNlZyA9IGZpbmRfcG9vbF9zZWcoc2VnKSkpCisJCXJldHVybl9OVUxMOworCisJcmV0dXJuIHNlZy0+bHY7Cit9CisKKy8qCisgKiBGaW5kIGEgZnJlZSBkZXZpY2VfaWQgZm9yIGdpdmVuIHRoaW5fcG9vbCBzZWdtZW50LgorICoKKyAqIFxyZXR1cm4KKyAqIEZyZWUgZGV2aWNlIGlkLCBvciAwIGlmIGZyZWUgZGV2aWNlX2lkIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBGSVhNRTogSW1wcm92ZSBuYWl2ZSBzZWFyY2ggYW5kIGtlZXAgdGhlIHZhbHVlIGNhY2hlZAorICogYW5kIHVwZGF0ZWQgZHVyaW5nIFZHIGxpZmV0aW1lIChzbyBubyBjb25zdCBmb3IgbHZfc2VnbWVudCkKKyAqLwordWludDMyX3QgZ2V0X2ZyZWVfcG9vbF9kZXZpY2VfaWQoc3RydWN0IGx2X3NlZ21lbnQgKnRoaW5fcG9vbF9zZWcpCit7CisJdWludDMyX3QgbWF4X2lkID0gMDsKKwlzdHJ1Y3Qgc2VnX2xpc3QgKnNsOworCisJaWYgKCFzZWdfaXNfdGhpbl9wb29sKHRoaW5fcG9vbF9zZWcpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUgorCQkJICAiU2VnbWVudCBpbiAlcyBpcyBub3QgYSB0aGluIHBvb2wgc2VnbWVudC4iLAorCQkJICB0aGluX3Bvb2xfc2VnLT5sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgJnRoaW5fcG9vbF9zZWctPmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpCisJCWlmIChzbC0+c2VnLT5kZXZpY2VfaWQgPiBtYXhfaWQpCisJCQltYXhfaWQgPSBzbC0+c2VnLT5kZXZpY2VfaWQ7CisKKwlpZiAoKyttYXhfaWQgPiBETV9USElOX01BWF9ERVZJQ0VfSUQpIHsKKwkJLyogRklYTUUgRmluZCBlbXB0eSBob2xlcyBpbnN0ZWFkIG9mIGFib3J0aW5nISAqLworCQlsb2dfZXJyb3IoIkNhbm5vdCBmaW5kIGZyZWUgZGV2aWNlX2lkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIkZvdW5kIGZyZWUgcG9vbCBkZXZpY2VfaWQgJXUuIiwgbWF4X2lkKTsKKworCXJldHVybiBtYXhfaWQ7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX3Bvb2xfY3JlYXRlKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3Qgc3RydWN0IGx2X3RoaW5fbWVzc2FnZSAqbG1zZzsKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobG1zZywgJmZpcnN0X3NlZyhsdiktPnRoaW5fbWVzc2FnZXMpIHsKKwkJaWYgKGxtc2ctPnR5cGUgIT0gRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOKQorCQkJY29udGludWU7CisJCS8qIFdoZW4gY3JlYXRpbmcgbmV3IHRoaW4gTFYsIGNoZWNrIGZvciBzaXplIHdvdWxkIGJlIG5lZWRlZCAqLworCQlpZiAoIWx2X2luZm8obHYtPnZnLT5jbWQsIGx2LCAxLCAmaW5mbywgMCwgMCkgfHwKKwkJICAgICFpbmZvLmV4aXN0cykgeworCQkJbG9nX2Vycm9yKCJQb29sICVzIG5lZWRzIHRvIGJlIGxvY2FsbHkgYWN0aXZlIGZvciB0aHJlc2hvbGQgY2hlY2suIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXBvb2xfYmVsb3dfdGhyZXNob2xkKGZpcnN0X3NlZyhsdikpKSB7CisJCQlsb2dfZXJyb3IoIkZyZWUgc3BhY2UgaW4gcG9vbCAlcyBpcyBhYm92ZSB0aHJlc2hvbGQsIG5ldyB2b2x1bWVzIGFyZSBub3QgYWxsb3dlZC4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdXBkYXRlX3Bvb2xfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgaW50IGFjdGl2YXRlKQoreworCWludCBtb25pdG9yZWQgPSBETUVWRU5URF9NT05JVE9SX0lHTk9SRTsKKwlpbnQgcmV0ID0gMTsKKworCWlmICghbHZfaXNfdGhpbl9wb29sKGx2KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVwZGF0ZWQgTFYgJXMgaXMgbm90IHBvb2wuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmKGZpcnN0X3NlZyhsdiktPnRoaW5fbWVzc2FnZXMpKSkKKwkJcmV0dXJuIDE7IC8qIE5vIG1lc3NhZ2VzICovCisKKwlpZiAoYWN0aXZhdGUpIHsKKwkJLyogSWYgdGhlIHBvb2wgaXMgbm90IGFjdGl2ZSwgZG8gYWN0aXZhdGUgZGVhY3RpdmF0ZSAqLworCQltb25pdG9yZWQgPSBkbWV2ZW50ZF9tb25pdG9yX21vZGUoKTsKKwkJaW5pdF9kbWV2ZW50ZF9tb25pdG9yKERNRVZFTlREX01PTklUT1JfSUdOT1JFKTsKKwkJaWYgKCFsdl9pc19hY3RpdmUobHYpKSB7CisJCQkvKgorCQkJICogRklYTUU6CisJCQkgKiAgIFJld3JpdGUgYWN0aXZhdGlvbiBjb2RlIHRvIGhhbmRsZSB3aG9sZSB0cmVlIG9mIHRoaW5MVnMKKwkJCSAqICAgYXMgdGhpcyB2ZXJzaW9uIGhhcyBtYWpvciBwcm9ibGVtIHdoZW4gaXQgZG9lcyBub3Qga25vdworCQkJICogICB3aGljaCBOb2RlIGhhcyBwb29sIGFjdGl2ZS4KKwkJCSAqLworCQkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsKGx2LT52Zy0+Y21kLCBsdikpIHsKKwkJCQlpbml0X2RtZXZlbnRkX21vbml0b3IobW9uaXRvcmVkKTsKKwkJCQlyZXR1cm5fMDsKKwkJCX0KKwkJCWlmICghbHZfaXNfYWN0aXZlKGx2KSkgeworCQkJCWluaXRfZG1ldmVudGRfbW9uaXRvcihtb25pdG9yZWQpOworCQkJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIHRoaW4gcG9vbCAlcywgcGVyaGFwcyBza2lwcGVkIGluIGx2bS5jb25mIHZvbHVtZV9saXN0PyIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQlhY3RpdmF0ZSA9IDA7IC8qIFdhcyBhbHJlYWR5IGFjdGl2ZSAqLworCisJCWlmICghKHJldCA9IF9jaGVja19wb29sX2NyZWF0ZShsdikpKQorCQkJc3RhY2s7IC8qIFNhZmV0eSBndWFyZCwgbmVlZHMgbG9jYWwgcHJlc2VuY2Ugb2YgdGhpbi1wb29sIHRhcmdldCAqLworCQllbHNlIHsKKwkJCWlmICghKHJldCA9IHN1c3BlbmRfbHZfb3JpZ2luKGx2LT52Zy0+Y21kLCBsdikpKQorCQkJCS8qIFNlbmQgbWVzc2FnZXMgKi8KKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdXNwZW5kICVzIHdpdGggcXVldWVkIG1lc3NhZ2VzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwkJCS8qIEV2ZW4gZmFpbGluZyBzdXNwZW5kIG5lZWRzIHJlc3VtZSAqLworCQkJaWYgKCFyZXN1bWVfbHZfb3JpZ2luKGx2LT52Zy0+Y21kLCBsdikpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXN1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXQgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKGFjdGl2YXRlICYmCisJCSAgICAhZGVhY3RpdmF0ZV9sdihsdi0+dmctPmNtZCwgbHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXQgPSAwOworCQl9CisJCWluaXRfZG1ldmVudGRfbW9uaXRvcihtb25pdG9yZWQpOworCisJCS8qIFVubG9jayBtZW1vcnkgaWYgcG9zc2libGUgKi8KKwkJbWVtbG9ja191bmxvY2sobHYtPnZnLT5jbWQpOworCisJCWlmICghcmV0KQorCQkJcmV0dXJuXzA7CisJfQorCisJZG1fbGlzdF9pbml0KCYoZmlyc3Rfc2VnKGx2KS0+dGhpbl9tZXNzYWdlcykpOworCisJaWYgKCF2Z193cml0ZShsdi0+dmcpIHx8ICF2Z19jb21taXQobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBFc3RpbWF0ZSB0aGluIHBvb2wgY2h1bmsgc2l6ZSBmcm9tIGRhdGEgYW5kIG1ldGFkYXRhIHNpemUgKGluIHNlY3RvciB1bml0cykgKi8KK3N0YXRpYyBzaXplX3QgX2VzdGltYXRlX2NodW5rX3NpemUodWludDY0X3QgZGF0YV9zaXplLCB1aW50NjRfdCBtZXRhZGF0YV9zaXplLCBpbnQgYXR0cikKK3sKKwkvKgorCSAqIG5yX3Bvb2xfYmxvY2tzID0gZGF0YV9zaXplIC8gbWV0YWRhdGFfc2l6ZQorCSAqIGNodW5rX3NpemUgPSBucl9wb29sX2Jsb2NrcyAqIDY0YiAvIHNlY3Rvcl9zaXplCisJICovCisJc2l6ZV90IGNodW5rX3NpemUgPSBkYXRhX3NpemUgLyAobWV0YWRhdGFfc2l6ZSAqIChTRUNUT1JfU0laRSAvIDY0KSk7CisKKwlpZiAoYXR0ciAmIFRISU5fRkVBVFVSRV9CTE9DS19TSVpFKSB7CisJCS8qIFJvdW5kIHVwIHRvIDY0S0IgKi8KKwkJY2h1bmtfc2l6ZSArPSBETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkUgLSAxOworCQljaHVua19zaXplICY9IH4oc2l6ZV90KShETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkUgLSAxKTsKKwl9IGVsc2UgeworCQkvKiBSb3VuZCB1cCB0byBuZWFyZXN0IHBvd2VyIG9mIDIgKi8KKwkJY2h1bmtfc2l6ZS0tOworCQljaHVua19zaXplIHw9IGNodW5rX3NpemUgPj4gMTsKKwkJY2h1bmtfc2l6ZSB8PSBjaHVua19zaXplID4+IDI7CisJCWNodW5rX3NpemUgfD0gY2h1bmtfc2l6ZSA+PiA0OworCQljaHVua19zaXplIHw9IGNodW5rX3NpemUgPj4gODsKKwkJY2h1bmtfc2l6ZSB8PSBjaHVua19zaXplID4+IDE2OworCQljaHVua19zaXplKys7CisJfQorCisJcmV0dXJuIGNodW5rX3NpemU7Cit9CisKK2ludCB1cGRhdGVfdGhpbl9wb29sX3BhcmFtcyhjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHVuc2lnbmVkIGF0dHIsIGludCBwYXNzZWRfYXJncywKKwkJCSAgICB1aW50MzJfdCBwb29sX2RhdGFfZXh0ZW50cywKKwkJCSAgICB1aW50MzJfdCAqcG9vbF9tZXRhZGF0YV9leHRlbnRzLAorCQkJICAgIGludCAqY2h1bmtfc2l6ZV9jYWxjX21ldGhvZCwgdWludDMyX3QgKmNodW5rX3NpemUsCisJCQkgICAgdGhpbl9kaXNjYXJkc190ICpkaXNjYXJkcywgaW50ICp6ZXJvKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gdmctPmNtZDsKKwlzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSA9IHZnLT5wcm9maWxlOworCXVpbnQzMl90IGV4dGVudF9zaXplID0gdmctPmV4dGVudF9zaXplOworCXVpbnQ2NF90IHBvb2xfbWV0YWRhdGFfc2l6ZSA9ICh1aW50NjRfdCkgKnBvb2xfbWV0YWRhdGFfZXh0ZW50cyAqIGV4dGVudF9zaXplOworCXNpemVfdCBlc3RpbWF0ZV9jaHVua19zaXplOworCWNvbnN0IGNoYXIgKnN0cjsKKworCWlmICghKHBhc3NlZF9hcmdzICYgUEFTU19BUkdfQ0hVTktfU0laRSkpIHsKKwkJaWYgKCEoKmNodW5rX3NpemUgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFsbG9jYXRpb25fdGhpbl9wb29sX2NodW5rX3NpemVfQ0ZHLCBwcm9maWxlKSAqIDIpKSB7CisJCQlpZiAoIShzdHIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGFsbG9jYXRpb25fdGhpbl9wb29sX2NodW5rX3NpemVfcG9saWN5X0NGRywgcHJvZmlsZSkpKSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDb3VsZCBub3QgZmluZCBjb25maWd1cmF0aW9uLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKHN0ciwgImdlbmVyaWMiKSkKKwkJCQkqY2h1bmtfc2l6ZV9jYWxjX21ldGhvZCA9IFRISU5fQ0hVTktfU0laRV9DQUxDX01FVEhPRF9HRU5FUklDOworCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAicGVyZm9ybWFuY2UiKSkKKwkJCQkqY2h1bmtfc2l6ZV9jYWxjX21ldGhvZCA9IFRISU5fQ0hVTktfU0laRV9DQUxDX01FVEhPRF9QRVJGT1JNQU5DRTsKKwkJCWVsc2UgeworCQkJCWxvZ19lcnJvcigiVGhpbiBwb29sIGNodW5rIHNpemUgY2FsY3VsYXRpb24gcG9saWN5IFwiJXNcIiBpcyB1bnJlY29nbmlzZWQuIiwgc3RyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghKCpjaHVua19zaXplID0gZ2V0X2RlZmF1bHRfYWxsb2NhdGlvbl90aGluX3Bvb2xfY2h1bmtfc2l6ZV9DRkcoY21kLCBwcm9maWxlKSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlpZiAoIXZhbGlkYXRlX3Bvb2xfY2h1bmtfc2l6ZShjbWQsIHNlZ3R5cGUsICpjaHVua19zaXplKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShwYXNzZWRfYXJncyAmIFBBU1NfQVJHX0RJU0NBUkRTKSkgeworCQlpZiAoIShzdHIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGFsbG9jYXRpb25fdGhpbl9wb29sX2Rpc2NhcmRzX0NGRywgcHJvZmlsZSkpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNvdWxkIG5vdCBmaW5kIGNvbmZpZ3VyYXRpb24uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXNldF9wb29sX2Rpc2NhcmRzKGRpc2NhcmRzLCBzdHIpKQorCQkJcmV0dXJuXzA7CisJfQorCisJaWYgKCEocGFzc2VkX2FyZ3MgJiBQQVNTX0FSR19aRVJPKSkKKwkJKnplcm8gPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhbGxvY2F0aW9uX3RoaW5fcG9vbF96ZXJvX0NGRywgcHJvZmlsZSk7CisKKwlpZiAoIShhdHRyICYgVEhJTl9GRUFUVVJFX0JMT0NLX1NJWkUpICYmCisJICAgICFpc19wb3dlcl9vZl8yKCpjaHVua19zaXplKSkgeworCQlsb2dfZXJyb3IoIkNodW5rIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgZm9yIHRoaXMgdGhpbiB0YXJnZXQgdmVyc2lvbi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwb29sX21ldGFkYXRhX3NpemUpIHsKKwkJLyogRGVmYXVsdHMgdG8gbnJfcG9vbF9ibG9ja3MgKiA2NGIgY29udmVydGVkIHRvIHNpemUgaW4gc2VjdG9ycyAqLworCQlwb29sX21ldGFkYXRhX3NpemUgPSAodWludDY0X3QpIHBvb2xfZGF0YV9leHRlbnRzICogZXh0ZW50X3NpemUgLworCQkJKCpjaHVua19zaXplICogKFNFQ1RPUl9TSVpFIC8gVUlOVDY0X0MoNjQpKSk7CisJCS8qIENoZWNrIGlmIHdlIGNvdWxkIGV2ZW50dWFsbHkgdXNlIGJpZ2dlciBjaHVuayBzaXplICovCisJCWlmICghKHBhc3NlZF9hcmdzICYgUEFTU19BUkdfQ0hVTktfU0laRSkpIHsKKwkJCXdoaWxlICgocG9vbF9tZXRhZGF0YV9zaXplID4KKwkJCQkoREVGQVVMVF9USElOX1BPT0xfT1BUSU1BTF9TSVpFIC8gU0VDVE9SX1NJWkUpKSAmJgorCQkJICAgICAgICgqY2h1bmtfc2l6ZSA8IERNX1RISU5fTUFYX0RBVEFfQkxPQ0tfU0laRSkpIHsKKwkJCQkqY2h1bmtfc2l6ZSA8PD0gMTsKKwkJCQlwb29sX21ldGFkYXRhX3NpemUgPj49IDE7CisJCQl9CisJCQlsb2dfdmVyYm9zZSgiU2V0dGluZyBjaHVuayBzaXplIHRvICVzLiIsCisJCQkJICAgIGRpc3BsYXlfc2l6ZShjbWQsICpjaHVua19zaXplKSk7CisJCX0gZWxzZSBpZiAocG9vbF9tZXRhZGF0YV9zaXplID4gKERFRkFVTFRfVEhJTl9QT09MX01BWF9NRVRBREFUQV9TSVpFICogMikpIHsKKwkJCS8qIFN1Z2dlc3QgYmlnZ2VyIGNodW5rIHNpemUgKi8KKwkJCWVzdGltYXRlX2NodW5rX3NpemUgPQorCQkJCV9lc3RpbWF0ZV9jaHVua19zaXplKCh1aW50NjRfdCkgcG9vbF9kYXRhX2V4dGVudHMgKiBleHRlbnRfc2l6ZSwKKwkJCQkJCSAgICAgKERFRkFVTFRfVEhJTl9QT09MX01BWF9NRVRBREFUQV9TSVpFICogMiksIGF0dHIpOworCQkJbG9nX3dhcm4oIldBUk5JTkc6IENodW5rIHNpemUgaXMgdG9vIHNtYWxsIGZvciBwb29sLCBzdWdnZXN0ZWQgbWluaW11bSBpcyAlcy4iLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBlc3RpbWF0ZV9jaHVua19zaXplKSk7CisJCX0KKworCQkvKiBSb3VuZCB1cCB0byBleHRlbnQgc2l6ZSBzaWxlbnRseSAqLworCQlpZiAocG9vbF9tZXRhZGF0YV9zaXplICUgZXh0ZW50X3NpemUpCisJCQlwb29sX21ldGFkYXRhX3NpemUgKz0gZXh0ZW50X3NpemUgLSBwb29sX21ldGFkYXRhX3NpemUgJSBleHRlbnRfc2l6ZTsKKwl9IGVsc2UgeworCQllc3RpbWF0ZV9jaHVua19zaXplID0KKwkJCV9lc3RpbWF0ZV9jaHVua19zaXplKCh1aW50NjRfdCkgcG9vbF9kYXRhX2V4dGVudHMgKiBleHRlbnRfc2l6ZSwKKwkJCQkJICAgICBwb29sX21ldGFkYXRhX3NpemUsIGF0dHIpOworCQlpZiAoZXN0aW1hdGVfY2h1bmtfc2l6ZSA8IERNX1RISU5fTUlOX0RBVEFfQkxPQ0tfU0laRSkKKwkJCWVzdGltYXRlX2NodW5rX3NpemUgPSBETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkU7CisJCWVsc2UgaWYgKGVzdGltYXRlX2NodW5rX3NpemUgPiBETV9USElOX01BWF9EQVRBX0JMT0NLX1NJWkUpCisJCQllc3RpbWF0ZV9jaHVua19zaXplID0gRE1fVEhJTl9NQVhfREFUQV9CTE9DS19TSVpFOworCisJCS8qIENoZWNrIHRvIGV2ZW50dWFsbHkgdXNlIGJpZ2dlciBjaHVuayBzaXplICovCisJCWlmICghKHBhc3NlZF9hcmdzICYgUEFTU19BUkdfQ0hVTktfU0laRSkpIHsKKwkJCSpjaHVua19zaXplID0gZXN0aW1hdGVfY2h1bmtfc2l6ZTsKKwkJCWxvZ192ZXJib3NlKCJTZXR0aW5nIGNodW5rIHNpemUgJXMuIiwgZGlzcGxheV9zaXplKGNtZCwgKmNodW5rX3NpemUpKTsKKwkJfSBlbHNlIGlmICgqY2h1bmtfc2l6ZSA8IGVzdGltYXRlX2NodW5rX3NpemUpIHsKKwkJCS8qIFN1Z2dlc3QgYmlnZ2VyIGNodW5rIHNpemUgKi8KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBDaHVuayBzaXplIGlzIHNtYWxsZXIgdGhlbiBzdWdnZXN0ZWQgbWluaW11bSBzaXplICVzLiIsCisJCQkJIGRpc3BsYXlfc2l6ZShjbWQsIGVzdGltYXRlX2NodW5rX3NpemUpKTsKKwkJfQorCX0KKworCWlmIChwb29sX21ldGFkYXRhX3NpemUgPiAoMiAqIERFRkFVTFRfVEhJTl9QT09MX01BWF9NRVRBREFUQV9TSVpFKSkgeworCQlwb29sX21ldGFkYXRhX3NpemUgPSAyICogREVGQVVMVF9USElOX1BPT0xfTUFYX01FVEFEQVRBX1NJWkU7CisJCWlmIChwYXNzZWRfYXJncyAmIFBBU1NfQVJHX1BPT0xfTUVUQURBVEFfU0laRSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBNYXhpbXVtIHN1cHBvcnRlZCBwb29sIG1ldGFkYXRhIHNpemUgaXMgJXMuIiwKKwkJCQkgZGlzcGxheV9zaXplKGNtZCwgcG9vbF9tZXRhZGF0YV9zaXplKSk7CisJfSBlbHNlIGlmIChwb29sX21ldGFkYXRhX3NpemUgPCAoMiAqIERFRkFVTFRfVEhJTl9QT09MX01JTl9NRVRBREFUQV9TSVpFKSkgeworCQlwb29sX21ldGFkYXRhX3NpemUgPSAyICogREVGQVVMVF9USElOX1BPT0xfTUlOX01FVEFEQVRBX1NJWkU7CisJCWlmIChwYXNzZWRfYXJncyAmIFBBU1NfQVJHX1BPT0xfTUVUQURBVEFfU0laRSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBNaW5pbXVtIHN1cHBvcnRlZCBwb29sIG1ldGFkYXRhIHNpemUgaXMgJXMuIiwKKwkJCQkgZGlzcGxheV9zaXplKGNtZCwgcG9vbF9tZXRhZGF0YV9zaXplKSk7CisJfQorCisJaWYgKCEoKnBvb2xfbWV0YWRhdGFfZXh0ZW50cyA9CisJICAgICAgZXh0ZW50c19mcm9tX3NpemUodmctPmNtZCwgcG9vbF9tZXRhZGF0YV9zaXplLCBleHRlbnRfc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgc2V0X3Bvb2xfZGlzY2FyZHModGhpbl9kaXNjYXJkc190ICpkaXNjYXJkcywgY29uc3QgY2hhciAqc3RyKQoreworCWlmICghc3RyY2FzZWNtcChzdHIsICJwYXNzZG93biIpKQorCQkqZGlzY2FyZHMgPSBUSElOX0RJU0NBUkRTX1BBU1NET1dOOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgIm5vcGFzc2Rvd24iKSkKKwkJKmRpc2NhcmRzID0gVEhJTl9ESVNDQVJEU19OT19QQVNTRE9XTjsKKwllbHNlIGlmICghc3RyY2FzZWNtcChzdHIsICJpZ25vcmUiKSkKKwkJKmRpc2NhcmRzID0gVEhJTl9ESVNDQVJEU19JR05PUkU7CisJZWxzZSB7CisJCWxvZ19lcnJvcigiVGhpbiBwb29sIGRpc2NhcmRzIHR5cGUgXCIlc1wiIGlzIHVua25vd24uIiwgc3RyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9wb29sX2Rpc2NhcmRzX25hbWUodGhpbl9kaXNjYXJkc190IGRpc2NhcmRzKQoreworCXN3aXRjaCAoZGlzY2FyZHMpIHsKKwljYXNlIFRISU5fRElTQ0FSRFNfUEFTU0RPV046CisgICAgICAgICAgICAgICAgcmV0dXJuICJwYXNzZG93biI7CisJY2FzZSBUSElOX0RJU0NBUkRTX05PX1BBU1NET1dOOgorCQlyZXR1cm4gIm5vcGFzc2Rvd24iOworCWNhc2UgVEhJTl9ESVNDQVJEU19JR05PUkU6CisJCXJldHVybiAiaWdub3JlIjsKKwl9CisKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVua25vd24gZGlzY2FyZHMgdHlwZSBlbmNvdW50ZXJlZC4iKTsKKworCXJldHVybiAidW5rbm93biI7Cit9CisKK2ludCBsdl9pc190aGluX29yaWdpbihjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCB1bnNpZ25lZCBpbnQgKnNuYXBfY291bnQpCit7CisJc3RydWN0IHNlZ19saXN0ICpzZWdsOworCWludCByID0gMDsKKworCWlmIChzbmFwX2NvdW50KQorCQkqc25hcF9jb3VudCA9IDA7CisKKwlpZiAoIWx2X2lzX3RoaW5fdm9sdW1lKGx2KSB8fAorCSAgICBkbV9saXN0X2VtcHR5KCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSkKKwkJcmV0dXJuIDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnbCwgJmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpIHsKKwkJaWYgKHNlZ2wtPnNlZy0+b3JpZ2luID09IGx2KSB7CisJCQlyID0gMTsKKwkJCWlmIChzbmFwX2NvdW50KQorCQkJCSgqc25hcF9jb3VudCkrKzsKKwkJCWVsc2UKKwkJCQkvKiBub3QgaW50ZXJlc3RlZCBpbiBudW1iZXIgb2Ygc25hcHNob3RzICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEV4cGxpY3QgY2hlY2sgb2YgbmV3IHRoaW4gcG9vbCBmb3IgdXNhYmlsaXR5CisgKgorICogQWxsb3cgdXNlIG9mIHRoaW4gcG9vbHMgYnkgZXh0ZXJuYWwgYXBwcy4gV2hlbiBsdm0yIG1ldGFkYXRhIGhhcworICogdHJhbnNhY3Rpb25faWQgPT0gMCBmb3IgYSBuZXcgdGhpbiBwb29sLCBpdCB3aWxsIGV4cGxpY2l0ZWx5IHZhbGlkYXRlCisgKiB0aGUgcG9vbCBpcyBzdGlsbCB1bnVzZWQuCisgKgorICogVG8gcHJldmVudCBsdm0yIHRvIGNyZWF0ZSB0aGluIHZvbHVtZXMgaW4gZXh0ZXJuYWxseSB1c2VkIHRoaW4gcG9vbHMKKyAqIHNpbXBseSBpbmNyZW1lbnQgaXRzIHRyYW5zYWN0aW9uX2lkLgorICovCitpbnQgY2hlY2tfbmV3X3RoaW5fcG9vbChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBwb29sX2x2LT52Zy0+Y21kOworCXVpbnQ2NF90IHRyYW5zYWN0aW9uX2lkOworCisJLyogRm9yIHRyYW5zYWN0aW9uX2lkIGNoZWNrIExPQ0FMIGFjdGl2YXRpb24gaXMgcmVxdWlyZWQgKi8KKwlpZiAoIWFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBwb29sX2x2KSkgeworCQlsb2dfZXJyb3IoIkFib3J0aW5nLiBGYWlsZWQgdG8gbG9jYWxseSBhY3RpdmF0ZSB0aGluIHBvb2wgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXaXRoIHZvbHVtZSBsaXN0cywgY2hlY2sgcG9vbCByZWFsbHkgaXMgbG9jYWxseSBhY3RpdmUgKi8KKwlpZiAoIWx2X3RoaW5fcG9vbF90cmFuc2FjdGlvbl9pZChwb29sX2x2LCAmdHJhbnNhY3Rpb25faWQpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlYWQgdGhpbiBwb29sICVzIHRyYW5zYWN0aW9uIGlkIGxvY2FsbHksIHBlcmhhcHMgc2tpcHBlZCBpbiBsdm0uY29uZiB2b2x1bWVfbGlzdD8iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFJlcXVpcmUgcG9vbCB0byBoYXZlIHNhbWUgdHJhbnNhY3Rpb25faWQgYXMgbmV3ICAqLworCWlmIChmaXJzdF9zZWcocG9vbF9sdiktPnRyYW5zYWN0aW9uX2lkICE9IHRyYW5zYWN0aW9uX2lkKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSB0aGluIHBvb2wgJXMgd2l0aCB0cmFuc2FjdGlvbiBpZCAiCisJCQkgIEZNVHU2NCAiIGZvciB0aGluIHZvbHVtZXMuICIKKwkJCSAgIkV4cGVjdGVkIHRyYW5zYWN0aW9uIGlkICUiIFBSSXU2NCAiLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpLCB0cmFuc2FjdGlvbl9pZCwKKwkJCSAgZmlyc3Rfc2VnKHBvb2xfbHYpLT50cmFuc2FjdGlvbl9pZCk7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJib3NlKCJEZWFjdGl2YXRpbmcgcHVibGljIHRoaW4gcG9vbCAlcy4iLAorCQkgICAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCisJLyogUHJldmVudCBhbnkgJ3JhY2UnIHdpdGggaW4tdXNlIHRoaW4gcG9vbCBhbmQgYWx3YXlzIGRlYWN0aXZhdGUgKi8KKwlpZiAoIWRlYWN0aXZhdGVfbHYocG9vbF9sdi0+dmctPmNtZCwgcG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gQ291bGQgbm90IGRlYWN0aXZhdGUgdGhpbiBwb29sICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvdmcuYyBiL2xpYi9tZXRhZGF0YS92Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDhhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvdmcuYwpAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJhcmNoaXZlci5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKworc3RydWN0IHZvbHVtZV9ncm91cCAqYWxsb2NfdmcoY29uc3QgY2hhciAqcG9vbF9uYW1lLCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RydWN0IGRtX3Bvb2wgKnZnbWVtOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCisJaWYgKCEodmdtZW0gPSBkbV9wb29sX2NyZWF0ZShwb29sX25hbWUsIFZHX01FTVBPT0xfQ0hVTkspKSB8fAorCSAgICAhKHZnID0gZG1fcG9vbF96YWxsb2ModmdtZW0sIHNpemVvZigqdmcpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgdm9sdW1lIGdyb3VwIHN0cnVjdHVyZSIpOworCQlpZiAodmdtZW0pCisJCQlkbV9wb29sX2Rlc3Ryb3kodmdtZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodmdfbmFtZSAmJiAhKHZnLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAodmdtZW0sIHZnX25hbWUpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBWRyBuYW1lLiIpOworCQlkbV9wb29sX2Rlc3Ryb3kodmdtZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoISh2Zy0+bHZtMV9zeXN0ZW1faWQgPSBkbV9wb29sX3phbGxvYyh2Z21lbSwgTkFNRV9MRU4gKyAxKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgVkcgc3lzdGVtZCBpZC4iKTsKKwkJZG1fcG9vbF9kZXN0cm95KHZnbWVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmctPnN5c3RlbV9pZCA9ICIiOworCisJdmctPmNtZCA9IGNtZDsKKwl2Zy0+dmdtZW0gPSB2Z21lbTsKKwl2Zy0+YWxsb2MgPSBBTExPQ19OT1JNQUw7CisKKwlpZiAoISh2Zy0+aG9zdG5hbWVzID0gZG1faGFzaF9jcmVhdGUoMTYpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBWRyBob3N0bmFtZSBoYXNodGFibGUuIik7CisJCWRtX3Bvb2xfZGVzdHJveSh2Z21lbSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdCgmdmctPnB2cyk7CisJZG1fbGlzdF9pbml0KCZ2Zy0+cHZzX3RvX3dyaXRlKTsKKwlkbV9saXN0X2luaXQoJnZnLT5wdl93cml0ZV9saXN0KTsKKwlkbV9saXN0X2luaXQoJnZnLT5wdnNfb3V0ZGF0ZWQpOworCWRtX2xpc3RfaW5pdCgmdmctPmx2cyk7CisJZG1fbGlzdF9pbml0KCZ2Zy0+aGlzdG9yaWNhbF9sdnMpOworCWRtX2xpc3RfaW5pdCgmdmctPnRhZ3MpOworCWRtX2xpc3RfaW5pdCgmdmctPnJlbW92ZWRfbHZzKTsKKwlkbV9saXN0X2luaXQoJnZnLT5yZW1vdmVkX2hpc3RvcmljYWxfbHZzKTsKKwlkbV9saXN0X2luaXQoJnZnLT5yZW1vdmVkX3B2cyk7CisKKwlsb2dfZGVidWdfbWVtKCJBbGxvY2F0ZWQgVkcgJXMgYXQgJXAuIiwgdmctPm5hbWUsIHZnKTsKKworCXJldHVybiB2ZzsKK30KKworc3RhdGljIHZvaWQgX2ZyZWVfdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJdmdfc2V0X2ZpZCh2ZywgTlVMTCk7CisKKwlpZiAodmctPmNtZCAmJiB2Zy0+dmdtZW0gPT0gdmctPmNtZC0+bWVtKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiZ2xvYmFsIG1lbW9yeSBwb29sIHVzZWQgZm9yIFZHICVzIiwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJbG9nX2RlYnVnX21lbSgiRnJlZWluZyBWRyAlcyBhdCAlcC4iLCB2Zy0+bmFtZSwgdmcpOworCisJZG1faGFzaF9kZXN0cm95KHZnLT5ob3N0bmFtZXMpOworCWRtX3Bvb2xfZGVzdHJveSh2Zy0+dmdtZW0pOworfQorCit2b2lkIHJlbGVhc2Vfdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCF2ZyB8fCAodmctPmZpZCAmJiB2ZyA9PSB2Zy0+ZmlkLT5mbXQtPm9ycGhhbl92ZykpCisJCXJldHVybjsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdmdpbmZvIGhvbGRlcnMgKi8KKwlpZiAodmctPnZnaW5mbyAmJgorCSAgICAhbHZtY2FjaGVfdmdpbmZvX2hvbGRlcnNfZGVjX2FuZF90ZXN0X2Zvcl96ZXJvKHZnLT52Z2luZm8pKQorCQlyZXR1cm47CisKKwlyZWxlYXNlX3ZnKHZnLT52Z19jb21taXR0ZWQpOworCXJlbGVhc2VfdmcodmctPnZnX3ByZWNvbW1pdHRlZCk7CisJaWYgKHZnLT5jZnRfcHJlY29tbWl0dGVkKQorCQlkbV9jb25maWdfZGVzdHJveSh2Zy0+Y2Z0X3ByZWNvbW1pdHRlZCk7CisJX2ZyZWVfdmcodmcpOworfQorCisvKgorICogRklYTUUgb3V0IG9mIHBsYWNlLCBidXQgdGhlIG1haW4gKGNtZCkgcG9vbCBoYXMgYmVlbiBhbHJlYWR5CisgKiBkZXN0cm95ZWQgYW5kIHRvdWNoaW5nIHRoZSBmaWQgKGFsc28gdmlhIHJlbGVhc2VfdmcpIHdpbGwgY3Jhc2ggdGhlCisgKiBwcm9ncmFtCisgKgorICogRm9yIG5vdyBxdWljayB3cmFwcGVyIHRvIGFsbG93IGRlc3Ryb3kgb2Ygb3JwaGFuIHZnCisgKi8KK3ZvaWQgZnJlZV9vcnBoYW5fdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJX2ZyZWVfdmcodmcpOworfQorCitpbnQgbGlua19sdl90b192ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJaWYgKHZnX21heF9sdl9yZWFjaGVkKHZnKSkKKwkJc3RhY2s7CisKKwlpZiAoIShsdmwgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZigqbHZsKSkpKQorCQlyZXR1cm5fMDsKKworCWx2bC0+bHYgPSBsdjsKKwlsdi0+dmcgPSB2ZzsKKwlkbV9saXN0X2FkZCgmdmctPmx2cywgJmx2bC0+bGlzdCk7CisJbHYtPnN0YXR1cyAmPSB+TFZfUkVNT1ZFRDsKKworCXJldHVybiAxOworfQorCitpbnQgdW5saW5rX2x2X2Zyb21fdmcoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJaWYgKCEobHZsID0gZmluZF9sdl9pbl92Zyhsdi0+dmcsIGx2LT5uYW1lKSkpCisJCXJldHVybl8wOworCisJZG1fbGlzdF9tb3ZlKCZsdi0+dmctPnJlbW92ZWRfbHZzLCAmbHZsLT5saXN0KTsKKwlsdi0+c3RhdHVzIHw9IExWX1JFTU9WRUQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX21heF9sdl9yZWFjaGVkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmICghdmctPm1heF9sdikKKwkJcmV0dXJuIDA7CisKKwlpZiAodmctPm1heF9sdiA+IHZnX3Zpc2libGVfbHZzKHZnKSkKKwkJcmV0dXJuIDA7CisKKwlsb2dfdmVyYm9zZSgiTWF4aW11bSBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzICgldSkgcmVhY2hlZCAiCisJCSAgICAiaW4gdm9sdW1lIGdyb3VwICVzIiwgdmctPm1heF9sdiwgdmctPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKK2NoYXIgKnZnX2ZtdF9kdXAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaWYgKCF2Zy0+ZmlkIHx8ICF2Zy0+ZmlkLT5mbXQpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkbV9wb29sX3N0cmR1cCh2Zy0+dmdtZW0sIHZnLT5maWQtPmZtdC0+bmFtZSk7Cit9CisKK2NoYXIgKnZnX25hbWVfZHVwKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiBkbV9wb29sX3N0cmR1cCh2Zy0+dmdtZW0sIHZnLT5uYW1lKTsKK30KKworY2hhciAqdmdfc3lzdGVtX2lkX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCB2Zy0+c3lzdGVtX2lkID8gOiB2Zy0+bHZtMV9zeXN0ZW1faWQgPyA6ICIiKTsKK30KKworY2hhciAqdmdfbG9ja190eXBlX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCB2Zy0+bG9ja190eXBlID8gOiB2Zy0+bG9ja190eXBlID8gOiAiIik7Cit9CisKK2NoYXIgKnZnX2xvY2tfYXJnc19kdXAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgdmctPmxvY2tfYXJncyA/IDogdmctPmxvY2tfYXJncyA/IDogIiIpOworfQorCitjaGFyICp2Z191dWlkX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gaWRfZm9ybWF0X2FuZF9jb3B5KHZnLT52Z21lbSwgJnZnLT5pZCk7Cit9CisKK2NoYXIgKnZnX3RhZ3NfZHVwKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiB0YWdzX2Zvcm1hdF9hbmRfY29weSh2Zy0+dmdtZW0sICZ2Zy0+dGFncyk7Cit9CisKK3VpbnQzMl90IHZnX3NlcW5vKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiB2Zy0+c2Vxbm87Cit9CisKK3VpbnQ2NF90IHZnX3N0YXR1cyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gdmctPnN0YXR1czsKK30KKwordWludDY0X3Qgdmdfc2l6ZShjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X2NvdW50ICogdmctPmV4dGVudF9zaXplOworfQorCit1aW50NjRfdCB2Z19mcmVlKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiAodWludDY0X3QpIHZnLT5mcmVlX2NvdW50ICogdmctPmV4dGVudF9zaXplOworfQorCit1aW50NjRfdCB2Z19leHRlbnRfc2l6ZShjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X3NpemU7Cit9CisKK3VpbnQ2NF90IHZnX2V4dGVudF9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X2NvdW50OworfQorCit1aW50NjRfdCB2Z19mcmVlX2NvdW50KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiAodWludDY0X3QpIHZnLT5mcmVlX2NvdW50OworfQorCit1aW50NjRfdCB2Z19wdl9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSB2Zy0+cHZfY291bnQ7Cit9CisKK3VpbnQ2NF90IHZnX21heF9wdihjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSB2Zy0+bWF4X3B2OworfQorCit1aW50NjRfdCB2Z19tYXhfbHYoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuICh1aW50NjRfdCkgdmctPm1heF9sdjsKK30KKwordW5zaWduZWQgc25hcHNob3RfY291bnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwl1bnNpZ25lZCBudW1fc25hcHNob3RzID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQlpZiAobHZfaXNfY293KGx2bC0+bHYpKQorCQkJbnVtX3NuYXBzaG90cysrOworCisJcmV0dXJuIG51bV9zbmFwc2hvdHM7Cit9CisKK3Vuc2lnbmVkIHZnX3Zpc2libGVfbHZzKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJdW5zaWduZWQgbHZfY291bnQgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKGx2X2lzX3Zpc2libGUobHZsLT5sdikpCisJCQlsdl9jb3VudCsrOworCX0KKworCXJldHVybiBsdl9jb3VudDsKK30KKwordWludDMyX3QgdmdfbWRhX2NvdW50KGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiBkbV9saXN0X3NpemUoJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkgKworCQlkbV9saXN0X3NpemUoJnZnLT5maWQtPm1ldGFkYXRhX2FyZWFzX2lnbm9yZWQpOworfQorCit1aW50MzJfdCB2Z19tZGFfdXNlZF9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKyAgICAgICB1aW50MzJfdCB1c2VkX2NvdW50ID0gMDsKKyAgICAgICBzdHJ1Y3QgbWV0YWRhdGFfYXJlYSAqbWRhOworCisJLyoKKwkgKiBJZ25vcmVkIG1kYXMgY291bGQgYmUgb24gZWl0aGVyIGxpc3QgLSB0aGUgcmVhc29uIGJlaW5nIHRoZSBzdGF0ZQorCSAqIG1heSBoYXZlIGNoYW5nZWQgZnJvbSBpZ25vcmVkIHRvIHVuLWlnbm9yZWQgYW5kIHdlIG5lZWQgdG8gd3JpdGUKKwkgKiB0aGUgc3RhdGUgdG8gZGlzay4KKwkgKi8KKyAgICAgICBkbV9saXN0X2l0ZXJhdGVfaXRlbXMobWRhLCAmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKQorCSAgICAgICBpZiAoIW1kYV9pc19pZ25vcmVkKG1kYSkpCisJCSAgICAgICB1c2VkX2NvdW50Kys7CisKKyAgICAgICByZXR1cm4gdXNlZF9jb3VudDsKK30KKwordWludDMyX3QgdmdfbWRhX2NvcGllcyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gdmctPm1kYV9jb3BpZXM7Cit9CisKK3VpbnQ2NF90IHZnX21kYV9zaXplKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXJldHVybiBmaW5kX21pbl9tZGFfc2l6ZSgmdmctPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlKTsKK30KKwordWludDY0X3QgdmdfbWRhX2ZyZWUoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJdWludDY0X3QgZnJlZXNwYWNlID0gVUlOVDY0X01BWCwgbWRhX2ZyZWU7CisJc3RydWN0IG1ldGFkYXRhX2FyZWEgKm1kYTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhtZGEsICZ2Zy0+ZmlkLT5tZXRhZGF0YV9hcmVhc19pbl91c2UpIHsKKwkJaWYgKCFtZGEtPm9wcy0+bWRhX2ZyZWVfc2VjdG9ycykKKwkJCWNvbnRpbnVlOworCQltZGFfZnJlZSA9IG1kYS0+b3BzLT5tZGFfZnJlZV9zZWN0b3JzKG1kYSk7CisJCWlmIChtZGFfZnJlZSA8IGZyZWVzcGFjZSkKKwkJCWZyZWVzcGFjZSA9IG1kYV9mcmVlOworCX0KKworCWlmIChmcmVlc3BhY2UgPT0gVUlOVDY0X01BWCkKKwkJZnJlZXNwYWNlID0gVUlOVDY0X0MoMCk7CisJcmV0dXJuIGZyZWVzcGFjZTsKK30KKworaW50IHZnX3NldF9tZGFfY29waWVzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1aW50MzJfdCBtZGFfY29waWVzKQoreworCXZnLT5tZGFfY29waWVzID0gbWRhX2NvcGllczsKKworCS8qIEZJWE1FIFVzZSBsb2dfdmVyYm9zZSB3aGVuIHRoaXMgaXMgZHVlIHRvIHNwZWNpZmljIGNtZGxpbmUgcmVxdWVzdC4gKi8KKwlsb2dfZGVidWdfbWV0YWRhdGEoIlNldHRpbmcgbWRhX2NvcGllcyB0byAlIlBSSXUzMiIgZm9yIFZHICVzIiwKKwkJCSAgIG1kYV9jb3BpZXMsIHZnLT5uYW1lKTsKKworCXJldHVybiAxOworfQorCitjaGFyICp2Z19wcm9maWxlX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwljb25zdCBjaGFyICpwcm9maWxlX25hbWUgPSB2Zy0+cHJvZmlsZSA/IHZnLT5wcm9maWxlLT5uYW1lIDogIiI7CisJcmV0dXJuIGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgcHJvZmlsZV9uYW1lKTsKK30KKworc3RhdGljIGludCBfcmVjYWxjX2V4dGVudHModWludDMyX3QgKmV4dGVudHMsIGNvbnN0IGNoYXIgKmRlc2MxLAorCQkJICAgY29uc3QgY2hhciAqZGVzYzIsIHVpbnQzMl90IG9sZF9leHRlbnRfc2l6ZSwKKwkJCSAgIHVpbnQzMl90IG5ld19leHRlbnRfc2l6ZSkKK3sKKwl1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KSBvbGRfZXh0ZW50X3NpemUgKiAoKmV4dGVudHMpOworCisJaWYgKHNpemUgJSBuZXdfZXh0ZW50X3NpemUpIHsKKwkJbG9nX2Vycm9yKCJOZXcgc2l6ZSAlIiBQUkl1NjQgIiBmb3IgJXMlcyBub3QgYW4gZXhhY3QgbnVtYmVyICIKKwkJCSAgIm9mIG5ldyBleHRlbnRzLiIsIHNpemUsIGRlc2MxLCBkZXNjMik7CisJCXJldHVybiAwOworCX0KKworCXNpemUgLz0gbmV3X2V4dGVudF9zaXplOworCisJaWYgKHNpemUgPiBNQVhfRVhURU5UX0NPVU5UKSB7CisJCWxvZ19lcnJvcigiTmV3IGV4dGVudCBjb3VudCAlIiBQUkl1NjQgIiBmb3IgJXMlcyBleGNlZWRzICIKKwkJCSAgIjMyIGJpdHMuIiwgc2l6ZSwgZGVzYzEsIGRlc2MyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKmV4dGVudHMgPSAodWludDMyX3QpIHNpemU7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX2NoZWNrX25ld19leHRlbnRfc2l6ZShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgdWludDMyX3QgbmV3X2V4dGVudF9zaXplKQoreworCWlmICghbmV3X2V4dGVudF9zaXplKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgZXh0ZW50IHNpemUgbWF5IG5vdCBiZSB6ZXJvIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoZm10LT5mZWF0dXJlcyAmIEZNVF9OT05fUE9XRVIyX0VYVEVOVFMpKSB7CisJCWlmICghaXNfcG93ZXJfb2ZfMihuZXdfZXh0ZW50X3NpemUpICYmCisJCSAgICAobmV3X2V4dGVudF9zaXplICUgTUlOX05PTl9QT1dFUjJfRVhURU5UX1NJWkUpKSB7CisJCQlsb2dfZXJyb3IoIlBoeXNpY2FsIEV4dGVudCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAlcyB3aGVuIG5vdCBhIHBvd2VyIG9mIDIuIiwKKwkJCQkgIGRpc3BsYXlfc2l6ZShmbXQtPmNtZCwgKHVpbnQ2NF90KSBNSU5fTk9OX1BPV0VSMl9FWFRFTlRfU0laRSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJLyogQXBwbHkgb3JpZ2luYWwgZm9ybWF0MSByZXN0cmljdGlvbnMgKi8KKwlpZiAoIWlzX3Bvd2VyX29mXzIobmV3X2V4dGVudF9zaXplKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGZvcm1hdCBvbmx5IHN1cHBvcnRzIFBoeXNpY2FsIEV4dGVudCBzaXplcyB0aGF0IGFyZSBwb3dlcnMgb2YgMi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5ld19leHRlbnRfc2l6ZSA+IE1BWF9QRV9TSVpFIHx8IG5ld19leHRlbnRfc2l6ZSA8IE1JTl9QRV9TSVpFKSB7CisJCWxvZ19lcnJvcigiRXh0ZW50IHNpemUgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcyIsCisJCQkgIGRpc3BsYXlfc2l6ZShmbXQtPmNtZCwgKHVpbnQ2NF90KSBNSU5fUEVfU0laRSksCisJCQkgIGRpc3BsYXlfc2l6ZShmbXQtPmNtZCwgKHVpbnQ2NF90KSBNQVhfUEVfU0laRSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV3X2V4dGVudF9zaXplICUgTUlOX1BFX1NJWkUpIHsKKwkJbG9nX2Vycm9yKCJFeHRlbnQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mICVzIiwKKwkJCSAgZGlzcGxheV9zaXplKGZtdC0+Y21kLCAodWludDY0X3QpIE1JTl9QRV9TSVpFKSk7CisJCXJldHVybiAwOworCX0KKworIAlyZXR1cm4gMTsKK30KKworaW50IHZnX3NldF9leHRlbnRfc2l6ZShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgdWludDMyX3QgbmV3X2V4dGVudF9zaXplKQoreworCXVpbnQzMl90IG9sZF9leHRlbnRfc2l6ZSA9IHZnLT5leHRlbnRfc2l6ZTsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZzsKKwl1aW50MzJfdCBzOworCisJaWYgKCF2Z19pc19yZXNpemVhYmxlKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgbXVzdCBiZSByZXNpemVhYmxlICIKKwkJCSAgInRvIGNoYW5nZSBQRSBzaXplIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV3X2V4dGVudF9zaXplID09IHZnLT5leHRlbnRfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXZnX2NoZWNrX25ld19leHRlbnRfc2l6ZSh2Zy0+ZmlkLT5mbXQsIG5ld19leHRlbnRfc2l6ZSkpCisJCXJldHVybl8wOworCisJaWYgKG5ld19leHRlbnRfc2l6ZSA+IHZnLT5leHRlbnRfc2l6ZSkgeworCQlpZiAoKHVpbnQ2NF90KSB2Z19zaXplKHZnKSAlIG5ld19leHRlbnRfc2l6ZSkgeworCQkJLyogRklYTUUgQWRqdXN0IHVzZWQgUFYgc2l6ZXMgaW5zdGVhZCAqLworCQkJbG9nX2Vycm9yKCJOZXcgZXh0ZW50IHNpemUgaXMgbm90IGEgcGVyZmVjdCBmaXQiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdmctPmV4dGVudF9zaXplID0gbmV3X2V4dGVudF9zaXplOworCisJaWYgKHZnLT5maWQtPmZtdC0+b3BzLT52Z19zZXR1cCAmJgorCSAgICAhdmctPmZpZC0+Zm10LT5vcHMtPnZnX3NldHVwKHZnLT5maWQsIHZnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9yZWNhbGNfZXh0ZW50cygmdmctPmV4dGVudF9jb3VudCwgdmctPm5hbWUsICIiLCBvbGRfZXh0ZW50X3NpemUsCisJCQkgICAgIG5ld19leHRlbnRfc2l6ZSkpCisJCXJldHVybl8wOworCisJaWYgKCFfcmVjYWxjX2V4dGVudHMoJnZnLT5mcmVlX2NvdW50LCB2Zy0+bmFtZSwgIiBmcmVlIHNwYWNlIiwKKwkJCSAgICAgb2xkX2V4dGVudF9zaXplLCBuZXdfZXh0ZW50X3NpemUpKQorCQlyZXR1cm5fMDsKKworCS8qIGZvcmVhY2ggUFYgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlwdiA9IHB2bC0+cHY7CisKKwkJcHYtPnBlX3NpemUgPSBuZXdfZXh0ZW50X3NpemU7CisJCWlmICghX3JlY2FsY19leHRlbnRzKCZwdi0+cGVfY291bnQsIHB2X2Rldl9uYW1lKHB2KSwgIiIsCisJCQkJICAgICBvbGRfZXh0ZW50X3NpemUsIG5ld19leHRlbnRfc2l6ZSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIV9yZWNhbGNfZXh0ZW50cygmcHYtPnBlX2FsbG9jX2NvdW50LCBwdl9kZXZfbmFtZShwdiksCisJCQkJICAgICAiIGFsbG9jYXRlZCBzcGFjZSIsIG9sZF9leHRlbnRfc2l6ZSwgbmV3X2V4dGVudF9zaXplKSkKKwkJCXJldHVybl8wOworCisJCS8qIGZvcmVhY2ggZnJlZSBQViBTZWdtZW50ICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdnNlZywgJnB2LT5zZWdtZW50cykgeworCQkJaWYgKHB2c2VnX2lzX2FsbG9jYXRlZChwdnNlZykpCisJCQkJY29udGludWU7CisKKwkJCWlmICghX3JlY2FsY19leHRlbnRzKCZwdnNlZy0+cGUsIHB2X2Rldl9uYW1lKHB2KSwKKwkJCQkJICAgICAiIFBWIHNlZ21lbnQgc3RhcnQiLCBvbGRfZXh0ZW50X3NpemUsCisJCQkJCSAgICAgbmV3X2V4dGVudF9zaXplKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmICghX3JlY2FsY19leHRlbnRzKCZwdnNlZy0+bGVuLCBwdl9kZXZfbmFtZShwdiksCisJCQkJCSAgICAgIiBQViBzZWdtZW50IGxlbmd0aCIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkJICAgICBuZXdfZXh0ZW50X3NpemUpKQorCQkJCXJldHVybl8wOworCQl9CisJfQorCisJLyogZm9yZWFjaCBMViAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWx2ID0gbHZsLT5sdjsKKworCQlpZiAoIV9yZWNhbGNfZXh0ZW50cygmbHYtPmxlX2NvdW50LCBsdi0+bmFtZSwgIiIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkgICAgIG5ld19leHRlbnRfc2l6ZSkpCisJCQlyZXR1cm5fMDsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCQlpZiAoIV9yZWNhbGNfZXh0ZW50cygmc2VnLT5sZSwgbHYtPm5hbWUsCisJCQkJCSAgICAgIiBzZWdtZW50IHN0YXJ0Iiwgb2xkX2V4dGVudF9zaXplLAorCQkJCQkgICAgIG5ld19leHRlbnRfc2l6ZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICghX3JlY2FsY19leHRlbnRzKCZzZWctPmxlbiwgbHYtPm5hbWUsCisJCQkJCSAgICAgIiBzZWdtZW50IGxlbmd0aCIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkJICAgICBuZXdfZXh0ZW50X3NpemUpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoIV9yZWNhbGNfZXh0ZW50cygmc2VnLT5hcmVhX2xlbiwgbHYtPm5hbWUsCisJCQkJCSAgICAgIiBhcmVhIGxlbmd0aCIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkJICAgICBuZXdfZXh0ZW50X3NpemUpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoIV9yZWNhbGNfZXh0ZW50cygmc2VnLT5leHRlbnRzX2NvcGllZCwgbHYtPm5hbWUsCisJCQkJCSAgICAgIiBleHRlbnRzIG1vdmVkIiwgb2xkX2V4dGVudF9zaXplLAorCQkJCQkgICAgIG5ld19leHRlbnRfc2l6ZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCS8qIGZvcmVhY2ggYXJlYSAqLworCQkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQkJc3dpdGNoIChzZWdfdHlwZShzZWcsIHMpKSB7CisJCQkJY2FzZSBBUkVBX1BWOgorCQkJCQlpZiAoIV9yZWNhbGNfZXh0ZW50cworCQkJCQkgICAgKCZzZWdfcGUoc2VnLCBzKSwKKwkJCQkJICAgICBsdi0+bmFtZSwKKwkJCQkJICAgICAiIHB2c2VnIHN0YXJ0Iiwgb2xkX2V4dGVudF9zaXplLAorCQkJCQkgICAgIG5ld19leHRlbnRfc2l6ZSkpCisJCQkJCQlyZXR1cm5fMDsKKwkJCQkJaWYgKCFfcmVjYWxjX2V4dGVudHMKKwkJCQkJICAgICgmc2VnX3B2c2VnKHNlZywgcyktPmxlbiwKKwkJCQkJICAgICBsdi0+bmFtZSwKKwkJCQkJICAgICAiIHB2c2VnIGxlbmd0aCIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkJICAgICBuZXdfZXh0ZW50X3NpemUpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVJFQV9MVjoKKwkJCQkJaWYgKCFfcmVjYWxjX2V4dGVudHMKKwkJCQkJICAgICgmc2VnX2xlKHNlZywgcyksIGx2LT5uYW1lLAorCQkJCQkgICAgICIgYXJlYSBzdGFydCIsIG9sZF9leHRlbnRfc2l6ZSwKKwkJCQkJICAgICBuZXdfZXh0ZW50X3NpemUpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVJFQV9VTkFTU0lHTkVEOgorCQkJCQlsb2dfZXJyb3IoIlVuYXNzaWduZWQgYXJlYSAldSBmb3VuZCBpbiAiCisJCQkJCQkgICJzZWdtZW50Iiwgcyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z19zZXRfbWF4X2x2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCB1aW50MzJfdCBtYXhfbHYpCit7CisJaWYgKCF2Z19pc19yZXNpemVhYmxlKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgbXVzdCBiZSByZXNpemVhYmxlICIKKwkJCSAgInRvIGNoYW5nZSBNYXhMb2dpY2FsVm9sdW1lIiwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISh2Zy0+ZmlkLT5mbXQtPmZlYXR1cmVzICYgRk1UX1VOTElNSVRFRF9WT0xTKSkgeworCQlpZiAoIW1heF9sdikKKwkJCW1heF9sdiA9IDI1NTsKKwkJZWxzZSBpZiAobWF4X2x2ID4gMjU1KSB7CisJCQlsb2dfZXJyb3IoIk1heExvZ2ljYWxWb2x1bWUgbGltaXQgaXMgMjU1Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChtYXhfbHYgJiYgbWF4X2x2IDwgdmdfdmlzaWJsZV9sdnModmcpKSB7CisJCWxvZ19lcnJvcigiTWF4TG9naWNhbFZvbHVtZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyICIKKwkJCSAgIiVkIG9mIExWcyBmb3IgJXMiLCB2Z192aXNpYmxlX2x2cyh2ZyksCisJCQkgIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXZnLT5tYXhfbHYgPSBtYXhfbHY7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3NldF9tYXhfcHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG1heF9wdikKK3sKKwlpZiAoIXZnX2lzX3Jlc2l6ZWFibGUodmcpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBtdXN0IGJlIHJlc2l6ZWFibGUgIgorCQkJICAidG8gY2hhbmdlIE1heFBoeXNpY2FsVm9sdW1lcyIsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEodmctPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9VTkxJTUlURURfVk9MUykpIHsKKwkJaWYgKCFtYXhfcHYpCisJCQltYXhfcHYgPSAyNTU7CisJCWVsc2UgaWYgKG1heF9wdiA+IDI1NSkgeworCQkJbG9nX2Vycm9yKCJNYXhQaHlzaWNhbFZvbHVtZSBsaW1pdCBpcyAyNTUiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKG1heF9wdiAmJiBtYXhfcHYgPCB2Zy0+cHZfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJNYXhQaHlzaWNhbFZvbHVtZXMgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG51bWJlciAiCisJCQkgICIlZCBvZiBQVnMgZm9yIFwiJXNcIiIsIHZnLT5wdl9jb3VudCwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJdmctPm1heF9wdiA9IG1heF9wdjsKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3NldF9hbGxvY19wb2xpY3koc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGFsbG9jX3BvbGljeV90IGFsbG9jKQoreworCWlmIChhbGxvYyA9PSBBTExPQ19JTkhFUklUKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIEdyb3VwIGFsbG9jYXRpb24gcG9saWN5IGNhbm5vdCBpbmhlcml0ICIKKwkJCSAgImZyb20gYW55dGhpbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFsbG9jID09IHZnLT5hbGxvYykKKwkJcmV0dXJuIDE7CisKKwl2Zy0+YWxsb2MgPSBhbGxvYzsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFNldHRpbmcgdGhlIGNsdXN0ZXIgYXR0cmlidXRlIG1hcmtzIGFjdGl2ZSB2b2x1bWVzIGV4Y2x1c2l2ZS4KKyAqCisgKiBGSVhNRTogcmVzb2x2ZSBsb2dpYyB3aXRoIHJlYWNxdWlyaW5nIHByb3BlciB0b3AtbGV2ZWwgTFYgbG9ja3MKKyAqICAgICAgICBhbmQgd2UgbGlrZWx5IGNhbid0IGdpdmV1cCBETE0gbG9ja3MgZm9yIGFjdGl2ZSBMVnMuLi4KKyAqLworaW50IHZnX3NldF9jbHVzdGVyZWQoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCBjbHVzdGVyZWQpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlpbnQgZmFpbCA9IDA7CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSAmJgorCSAgICBsb2NraW5nX2lzX2NsdXN0ZXJlZCgpICYmCisJICAgIGxvY2tpbmdfc3VwcG9ydHNfcmVtb3RlX3F1ZXJpZXMoKSAmJgorCSAgICAhY2x1c3RlcmVkKSB7CisJCS8qCisJCSAqIElmIHRoZSB2b2x1bWUgaXMgbG9jYWxseSBhY3RpdmUgYnV0IG5vdCBleGNsdXNpdmVseQorCQkgKiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHdoZW4gb3RoZXIgbm9kZXMgYWxzbyB1c2UKKwkJICogbG9jYWxseSBhY3RpdmUgKENSIGxvY2spLCBzbyByZWZ1c2UgY29udmVyc2lvbi4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQkJaWYgKChsdl9sb2NrX2hvbGRlcihsdmwtPmx2KSA9PSBsdmwtPmx2KSAmJgorCQkJICAgIGx2X2lzX2FjdGl2ZShsdmwtPmx2KSAmJgorCQkJICAgICFsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkobHZsLT5sdikpIHsKKwkJCQkvKiBTaG93IGFsbCBub24tbG9jYWwtZXhjbHVzaXZlbHkgYWN0aXZlIExWcworCQkJCSAqIHRoaXMgaW5jbHVkZXMgaS5lLiBjbHVzdGVyZWQgbWlycm9ycyAqLworCQkJCWxvZ19lcnJvcigiQ2FuJ3QgY2hhbmdlIGNsdXN0ZXIgYXR0cmlidXRlIHdpdGggIgorCQkJCQkgICJhY3RpdmUgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdmwtPmx2KSk7CisJCQkJZmFpbCA9IDE7CisJCQl9CisKKwkJaWYgKGZhaWwpIHsKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJDb252ZXJzaW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciAiCisJCQkJCQkibG9jYWxseSBleGNsdXNpdmUgdm9sdW1lcy4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGNsdXN0ZXJlZCkKKwkJdmctPnN0YXR1cyB8PSBDTFVTVEVSRUQ7CisJZWxzZQorCQl2Zy0+c3RhdHVzICY9IH5DTFVTVEVSRUQ7CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIlNldHRpbmcgdm9sdW1lIGdyb3VwICVzIGFzICVzY2x1c3RlcmVkLiIsCisJCQkgICB2Zy0+bmFtZSwgY2x1c3RlcmVkID8gIiIgOiAibm90ICIgKTsKKworCXJldHVybiAxOworfQorCisvKiBUaGUgaW5wdXQgc3RyaW5nIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkLiAqLworCitpbnQgdmdfc2V0X3N5c3RlbV9pZChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqc3lzdGVtX2lkKQoreworCWlmICghc3lzdGVtX2lkIHx8ICEqc3lzdGVtX2lkKSB7CisJCXZnLT5zeXN0ZW1faWQgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc3lzdGVtaWRfb25fcHZzKHZnKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIGZvcm1hdCAlcyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgdHlwZSBvZiBzeXN0ZW0gSUQuIiwKKwkJCSAgdmctPmZpZC0+Zm10LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEodmctPnN5c3RlbV9pZCA9IGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgc3lzdGVtX2lkKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzeXN0ZW1faWQgaW4gdmdfc2V0X3N5c3RlbV9pZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZnLT5sdm0xX3N5c3RlbV9pZCkKKwkJKnZnLT5sdm0xX3N5c3RlbV9pZCA9ICdcMCc7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZnX3NldF9sb2NrX3R5cGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGNvbnN0IGNoYXIgKmxvY2tfdHlwZSkKK3sKKwlpZiAoIWxvY2tfdHlwZSkKKwkJbG9ja190eXBlID0gIm5vbmUiOworCisJaWYgKCEodmctPmxvY2tfdHlwZSA9IGRtX3Bvb2xfc3RyZHVwKHZnLT52Z21lbSwgbG9ja190eXBlKSkpIHsKKwkJbG9nX2Vycm9yKCJ2Z19zZXRfbG9ja190eXBlICVzIG5vIG1lbSIsIGxvY2tfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitjaGFyICp2Z19hdHRyX2R1cChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwljaGFyICpyZXBzdHI7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3phbGxvYyhtZW0sIDcpKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJlcHN0clswXSA9ICh2Zy0+c3RhdHVzICYgTFZNX1dSSVRFKSA/ICd3JyA6ICdyJzsKKwlyZXBzdHJbMV0gPSAodmdfaXNfcmVzaXplYWJsZSh2ZykpID8gJ3onIDogJy0nOworCXJlcHN0clsyXSA9ICh2Z19pc19leHBvcnRlZCh2ZykpID8gJ3gnIDogJy0nOworCXJlcHN0clszXSA9ICh2Z19taXNzaW5nX3B2X2NvdW50KHZnKSkgPyAncCcgOiAnLSc7CisJcmVwc3RyWzRdID0gYWxsb2NfcG9saWN5X2NoYXIodmctPmFsbG9jKTsKKworCWlmICh2Z19pc19jbHVzdGVyZWQodmcpKQorCQlyZXBzdHJbNV0gPSAnYyc7CisJZWxzZSBpZiAoaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkKKwkJcmVwc3RyWzVdID0gJ3MnOworCWVsc2UKKwkJcmVwc3RyWzVdID0gJy0nOworCisJcmV0dXJuIHJlcHN0cjsKK30KKworaW50IHZncmVkdWNlX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsIGludCBjb21taXQpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpvcnBoYW5fdmcgPSBOVUxMOworCWludCByID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gcHZfZGV2X25hbWUocHYpOworCisJaWYgKCF2ZykgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlZHIGlzIE5VTEwuIik7CisJCXJldHVybiByOworCX0KKworCWlmIChwdl9wZV9hbGxvY19jb3VudChwdikpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIHN0aWxsIGluIHVzZSIsIG5hbWUpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAodmctPnB2X2NvdW50ID09IDEpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCByZW1vdmUgZmluYWwgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBmcm9tICIKKwkJCSAgInZvbHVtZSBncm91cCBcIiVzXCIiLCBuYW1lLCB2Zy0+bmFtZSk7CisJCXJldHVybiByOworCX0KKworCWlmICghbG9ja192b2woY21kLCBWR19PUlBIQU5TLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgZ2V0IGxvY2sgZm9yIG9ycGhhbiBQVnMiKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcHZsID0gZmluZF9wdl9pbl92Zyh2ZywgbmFtZSk7CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlnb3RvX2JhZDsKKworCWxvZ192ZXJib3NlKCJSZW1vdmluZyBcIiVzXCIgZnJvbSB2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgbmFtZSwgdmctPm5hbWUpOworCisJaWYgKHB2bCkKKwkJZGVsX3B2bF9mcm9tX3Zncyh2ZywgcHZsKTsKKworCXB2LT52Z19uYW1lID0gdmctPmZpZC0+Zm10LT5vcnBoYW5fdmdfbmFtZTsKKwlwdi0+c3RhdHVzID0gQUxMT0NBVEFCTEVfUFY7CisKKwlpZiAoIWRldl9nZXRfc2l6ZShwdl9kZXYocHYpLCAmcHYtPnNpemUpKSB7CisJCWxvZ19lcnJvcigiJXM6IENvdWxkbid0IGdldCBzaXplLiIsIHB2X2Rldl9uYW1lKHB2KSk7CisJCWdvdG8gYmFkOworCX0KKworCXZnLT5mcmVlX2NvdW50IC09IHB2X3BlX2NvdW50KHB2KSAtIHB2X3BlX2FsbG9jX2NvdW50KHB2KTsKKwl2Zy0+ZXh0ZW50X2NvdW50IC09IHB2X3BlX2NvdW50KHB2KTsKKworCW9ycGhhbl92ZyA9IHZnX3JlYWRfZm9yX3VwZGF0ZShjbWQsIHZnLT5maWQtPmZtdC0+b3JwaGFuX3ZnX25hbWUsCisJCQkJICAgICAgIE5VTEwsIDAsIDApOworCisJaWYgKHZnX3JlYWRfZXJyb3Iob3JwaGFuX3ZnKSkKKwkJZ290byBiYWQ7CisKKwlpZiAoIXZnX3NwbGl0X21kYXMoY21kLCB2Zywgb3JwaGFuX3ZnKSB8fCAhdmctPnB2X2NvdW50KSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHJlbW92ZSBmaW5hbCBtZXRhZGF0YSBhcmVhIG9uIFwiJXNcIiBmcm9tIFwiJXNcIiIsCisJCQkgIG5hbWUsIHZnLT5uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyoKKwkgKiBPbmx5IHdyaXRlIG91dCB0aGUgbmVlZGVkIGNoYW5nZXMgaWYgc28gcmVxdWVzdGVkIGJ5IGNhbGxlci4KKwkgKi8KKwlpZiAoY29tbWl0KSB7CisJCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCQlsb2dfZXJyb3IoIlJlbW92YWwgb2YgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBmcm9tICIKKwkJCQkgICJcIiVzXCIgZmFpbGVkIiwgbmFtZSwgdmctPm5hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoIXB2X3dyaXRlKGNtZCwgcHYsIDApKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbGVhciBtZXRhZGF0YSBmcm9tIHBoeXNpY2FsICIKKwkJCQkgICJ2b2x1bWUgXCIlc1wiICIKKwkJCQkgICJhZnRlciByZW1vdmFsIGZyb20gXCIlc1wiIiwgbmFtZSwgdmctPm5hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKworCQliYWNrdXAodmcpOworCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSZW1vdmVkIFwiJXNcIiBmcm9tIHZvbHVtZSBncm91cCBcIiVzXCIiLAorCQkJCW5hbWUsIHZnLT5uYW1lKTsKKwl9CisJciA9IDE7CitiYWQ6CisJLyogSWYgd2UgYXJlIGNvbW1pdHRpbmcgaGVyZSBvciB3ZSBoYWQgYW4gZXJyb3IgdGhlbiB3ZSB3aWxsIGZyZWUgZmlkICovCisJaWYgKHB2bCAmJiAoY29tbWl0IHx8IHIgIT0gMSkpCisJCWZyZWVfcHZfZmlkKHB2bC0+cHYpOworCXVubG9ja19hbmRfcmVsZWFzZV92ZyhjbWQsIG9ycGhhbl92ZywgVkdfT1JQSEFOUyk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWIvbWV0YWRhdGEvdmcuaCBiL2xpYi9tZXRhZGF0YS92Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTcxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWV0YWRhdGEvdmcuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIF9MVk1fVkdfSAorI2RlZmluZSBfTFZNX1ZHX0gKKworI2luY2x1ZGUgInV1aWQuaCIKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKworc3RydWN0IGNtZF9jb250ZXh0Oworc3RydWN0IGZvcm1hdF9pbnN0YW5jZTsKK3N0cnVjdCBsb2dpY2FsX3ZvbHVtZTsKKwordHlwZWRlZiBlbnVtIHsKKwlBTExPQ19JTlZBTElELAorCUFMTE9DX0NPTlRJR1VPVVMsCisJQUxMT0NfQ0xJTkcsCisJQUxMT0NfQ0xJTkdfQllfVEFHUywJLyogSW50ZXJuYWwgLSBuZXZlciB3cml0dGVuIG9yIGRpc3BsYXllZC4gKi8KKwlBTExPQ19OT1JNQUwsCisJQUxMT0NfQU5ZV0hFUkUsCisJQUxMT0NfSU5IRVJJVAorfSBhbGxvY19wb2xpY3lfdDsKKworc3RydWN0IHB2X3RvX3dyaXRlIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnBwOworCWludCBuZXdfcHY7Cit9OworCisjZGVmaW5lIE1BWF9FWFRFTlRfQ09VTlQgIChVSU5UMzJfTUFYKQorCitzdHJ1Y3Qgdm9sdW1lX2dyb3VwIHsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZDsKKwlzdHJ1Y3QgZG1fcG9vbCAqdmdtZW07CisJc3RydWN0IGZvcm1hdF9pbnN0YW5jZSAqZmlkOworCWNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqb3JpZ2luYWxfZm10OwkvKiBTZXQgd2hlbiBwcm9jZXNzaW5nIGJhY2t1cCBmaWxlcyAqLworCXN0cnVjdCBsdm1jYWNoZV92Z2luZm8gKnZnaW5mbzsKKwlzdHJ1Y3QgZG1fbGlzdCAqY21kX3ZnczsvKiBMaXN0IG9mIHdhbnRlZC9sb2NrZWQgYW5kIG9wZW5lZCBWR3MgKi8KKwl1aW50MzJfdCBjbWRfbWlzc2luZ192Z3M7LyogRmxhZyBtYXJrcyBtaXNzaW5nIFZHICovCisJdWludDMyX3Qgc2Vxbm87CQkvKiBNZXRhZGF0YSBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBza2lwX3ZhbGlkYXRlX2xvY2tfYXJncyA6IDE7CisJdW5zaWduZWQgbHZtZXRhZF91cGRhdGVfcGVuZGluZzogMTsKKworCS8qCisJICogVGhlIHBhcnNlZCBjb21taXR0ZWQgKG9uLWRpc2spIGNvcHkgb2YgdGhpcyBWRzsgaXMgTlVMTCBpZiB0aGlzIFZHIGlzIGNvbW1pdHRlZAorCSAqIHZlcnNpb24gKGkuZS4gdmdfY29tbWl0dGVkID09IE5VTEwgKmltcGxpZXMqIHRoaXMgaXMgdGhlIGNvbW1pdHRlZCBjb3B5LAorCSAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGlmIHRoaXMgVkcgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbW1pdHRlZCBvbmUKKwkgKiB0aGlzIHdpbGwgYmUgTlVMTCkuIFRoZSBwb2ludGVyIGlzIG1haW50YWluZWQgYnkgY2FsbHMgdG8KKwkgKiBfdmdfdXBkYXRlX3ZnX2NvbW1pdHRlZC4KKwkgKi8KKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19jb21taXR0ZWQ7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnRfcHJlY29tbWl0dGVkOyAvKiBQcmVjb21taXR0ZWQgbWV0YWRhdGEgKi8KKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19wcmVjb21taXR0ZWQ7IC8qIFBhcnNlZCBmcm9tIGNmdCAqLworCisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CisJc3RydWN0IHByb2ZpbGUgKnByb2ZpbGU7CisJdWludDY0X3Qgc3RhdHVzOworCisJc3RydWN0IGlkIGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqb2xkX25hbWU7CQkvKiBTZXQgZHVyaW5nIHZncmVuYW1lIGFuZCB2Z2NmZ3Jlc3RvcmUgKi8KKwljb25zdCBjaGFyICpzeXN0ZW1faWQ7CisJY2hhciAqbHZtMV9zeXN0ZW1faWQ7CisJY29uc3QgY2hhciAqbG9ja190eXBlOworCWNvbnN0IGNoYXIgKmxvY2tfYXJnczsKKworCXVpbnQzMl90IGV4dGVudF9zaXplOworCXVpbnQzMl90IGV4dGVudF9jb3VudDsKKwl1aW50MzJfdCBmcmVlX2NvdW50OworCisJdWludDMyX3QgbWF4X2x2OworCXVpbnQzMl90IG1heF9wdjsKKworCS8qIHBoeXNpY2FsIHZvbHVtZXMgKi8KKwl1aW50MzJfdCBwdl9jb3VudDsKKwlzdHJ1Y3QgZG1fbGlzdCBwdnM7CisKKwkvKgorCSAqIExpc3Qgb2YgcGh5c2ljYWwgdm9sdW1lcyB0aGF0IHdlcmUgdXNlZCBpbiB2Z2V4dGVuZCBidXQgZG8gbm90IGNhcnJ5CisJICogYSBQViBsYWJlbCB5ZXQuIFRoZXkgbmVlZCB0byBiZSBwdmNyZWF0ZSdkIGF0IHZnX3dyaXRlIHRpbWUuCisJICovCisKKwlzdHJ1Y3QgZG1fbGlzdCBwdnNfdG9fd3JpdGU7IC8qIHN0cnVjdCBwdl90b193cml0ZSAqLworCisJc3RydWN0IGRtX2xpc3QgcHZfd3JpdGVfbGlzdDsgLyogc3RydWN0IHB2X2xpc3QgKi8KKworCS8qCisJICogTGlzdCBvZiBwaHlzaWNhbCB2b2x1bWVzIHRoYXQgY2Fycnkgb3V0ZGF0ZWQgbWV0YWRhdGEgdGhhdCBiZWxvbmdzCisJICogdG8gdGhpcyBWRy4gQ3VycmVudGx5IG9ubHkgcG9wdWxhdGVkIHdoZW4gbHZtZXRhZCBpcyBpbiB1c2UuIFRoZSBQVnMKKwkgKiBvbiB0aGlzIGxpc3QgY291bGQgc3RpbGwgYmVsb25nIHRvIHRoZSBWRyAoYnV0IHRoZWlyIE1EQSBjYXJyaWVzIGFuCisJICogb3V0LW9mLWRhdGUgY29weSBvZiB0aGUgVkcgbWV0YWRhdGEpIG9yIHRoZXkgY291bGQgbm8gbG9uZ2VyIGJlbG9uZworCSAqIHRvIHRoZSBWRy4gV2l0aCBsdm1ldGFkLCB0aGlzIGxpc3QgaXMgcG9wdWxhdGVkIHdpdGggYWxsIFBWcyB0aGF0CisJICogaGF2ZSBhIFZHSUQgbWF0Y2hpbmcgb3VycywgYnV0IHNlcW5vIHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZQorCSAqIGN1cnJlbnQgc2Vxbm8gZm9yIHRoZSBWRy4gVGhlIE1EQXMgb24gc3RpbGwtaW4tVkcgUFZzIGFyZSB1cGRhdGVkIGFzCisJICogcGFydCBvZiB0aGUgbm9ybWFsIHZnX3dyaXRlL3ZnX2NvbW1pdCBwcm9jZXNzLiBUaGUgTURBcyBvbiBQVnMgdGhhdAorCSAqIG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlIFZHIGFyZSB3aXBlZCBkdXJpbmcgdmdfcmVhZC4KKwkgKgorCSAqIEhvd2V2ZXIsIGV2ZW4gdGhvdWdoIHN0aWxsLWluLVZHIFBWcyAqbWF5KiBiZSBvbiB0aGUgbGlzdCwgdGhpcyBpcworCSAqIG5vdCBndWFyYW50ZWVkLiBUaGUgaW4tbHZtZXRhZCBsaXN0IGlzIGNsZWFyZWQgd2hlbmV2ZXIgb3V0LW9mLVZHCisJICogb3V0ZGF0ZWQgUFZzIGFyZSB3aXBlZCBkdXJpbmcgdmdfcmVhZC4KKwkgKi8KKworCXN0cnVjdCBkbV9saXN0IHB2c19vdXRkYXRlZDsKKworCS8qCisJICogbG9naWNhbCB2b2x1bWVzCisJICogVGhlIGZvbGxvd2luZyByZWxhdGlvbnNoaXAgc2hvdWxkIGFsd2F5cyBob2xkOgorCSAqIGRtX2xpc3Rfc2l6ZShsdnMpID0gdXNlciB2aXNpYmxlIGx2X2NvdW50ICsgc25hcHNob3RfY291bnQgKyBvdGhlciBpbnZpc2libGUgTFZzCisJICoKKwkgKiBTbmFwc2hvdHMgY29uc2lzdCBvZiAyIGluc3RhbmNlcyBvZiAic3RydWN0IGxvZ2ljYWxfdm9sdW1lIjoKKwkgKiAtIGNvdyAobHZfbmFtZSBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyKQorCSAqIC0gc25hcHNob3QgKGx2X25hbWUgaXMgJ3NuYXBzaG90TicpCisJICoKKwkgKiBNaXJyb3JzIGNvbnNpc3Qgb2YgbXVsdGlwbGUgaW5zdGFuY2VzIG9mICJzdHJ1Y3QgbG9naWNhbF92b2x1bWUiOgorCSAqIC0gb25lIGZvciB0aGUgbWlycm9yIGxvZworCSAqIC0gb25lIGZvciBlYWNoIG1pcnJvciBsZWcKKwkgKiAtIG9uZSBmb3IgdGhlIHVzZXItdmlzaWJsZSBtaXJyb3IgTFYKKwkgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBsdnM7CisJc3RydWN0IGRtX2xpc3QgaGlzdG9yaWNhbF9sdnM7CisKKwlzdHJ1Y3QgZG1fbGlzdCB0YWdzOworCisJLyoKKwkgKiBGSVhNRTogTW92ZSB0aGUgbmV4dCBmaWVsZHMgaW50byBhIGRpZmZlcmVudCBzdHJ1Y3Q/CisJICovCisKKwkvKgorCSAqIExpc3Qgb2YgcmVtb3ZlZCBsb2dpY2FsIHZvbHVtZXMgYnkgX2x2X3JlZHVjZS4KKwkgKi8KKwlzdHJ1Y3QgZG1fbGlzdCByZW1vdmVkX2x2czsKKworCS8qCisJICogTGlzdCBvZiByZW1vdmVkIGhpc3RvcmljYWwgbG9naWNhbCB2b2x1bWVzIGJ5IGhpc3RvcmljYWxfZ2x2X3JlbW92ZS4KKwkgKi8KKwlzdHJ1Y3QgZG1fbGlzdCByZW1vdmVkX2hpc3RvcmljYWxfbHZzOworCisJLyoKKwkgKiBMaXN0IG9mIHJlbW92ZWQgcGh5c2ljYWwgdm9sdW1lcyBieSBwdnJlZHVjZS4KKwkgKiBUaGV5IGhhdmUgdG8gZ2V0IGNsZWFyZWQgb24gdmdfY29tbWl0LgorCSAqLworCXN0cnVjdCBkbV9saXN0IHJlbW92ZWRfcHZzOworCXVpbnQzMl90IG9wZW5fbW9kZTsgLyogRklYTUU6IHJlYWQgb3Igd3JpdGUgLSBjaGVjayBsb2NrIHR5cGU/ICovCisKKwkvKgorCSAqIFN0b3JlIHJlc3VsdCBvZiB0aGUgbGFzdCB2Z19yZWFkKCkuCisJICogMCBmb3Igc3VjY2VzcyBlbHNlIGFwcHJvcHJpYXRlIEZBSUxVUkVfKiBiaXRzIHNldC4KKwkgKi8KKwl1aW50MzJfdCByZWFkX3N0YXR1czsKKwl1aW50MzJfdCBtZGFfY29waWVzOyAvKiB0YXJnZXQgbnVtYmVyIG9mIG1kYXMgZm9yIHRoaXMgVkcgKi8KKworCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpob3N0bmFtZXM7IC8qIG1hcCBvZiBjcmVhdGlvbiBob3N0bmFtZXMgKi8KKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbWV0YWRhdGFfc3BhcmVfbHY7IC8qIG9uZSBwZXIgVkcgKi8KKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnNhbmxvY2tfbHY7IC8qIG9uZSBwZXIgVkcgKi8KK307CisKK3N0cnVjdCB2b2x1bWVfZ3JvdXAgKmFsbG9jX3ZnKGNvbnN0IGNoYXIgKnBvb2xfbmFtZSwgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICBjb25zdCBjaGFyICp2Z19uYW1lKTsKKworLyoKKyAqIHJlbGVhc2VfdmcoKSBtdXN0IGJlIGNhbGxlZCBvbiBldmVyeSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIGFsbG9jYXRlZAorICogYnkgdmdfY3JlYXRlKCkgb3IgdmdfcmVhZF9pbnRlcm5hbCgpIHRvIGZyZWUgaXQgd2hlbiBubyBsb25nZXIgcmVxdWlyZWQuCisgKi8KK3ZvaWQgcmVsZWFzZV92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit2b2lkIGZyZWVfb3JwaGFuX3ZnKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworY2hhciAqdmdfZm10X2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitjaGFyICp2Z19uYW1lX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitjaGFyICp2Z19zeXN0ZW1faWRfZHVwKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2NoYXIgKnZnX2xvY2tfdHlwZV9kdXAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworY2hhciAqdmdfbG9ja19hcmdzX2R1cChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit1aW50MzJfdCB2Z19zZXFubyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit1aW50NjRfdCB2Z19zdGF0dXMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX3NldF9hbGxvY19wb2xpY3koc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGFsbG9jX3BvbGljeV90IGFsbG9jKTsKK2ludCB2Z19zZXRfY2x1c3RlcmVkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgY2x1c3RlcmVkKTsKK2ludCB2Z19zZXRfc3lzdGVtX2lkKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBjb25zdCBjaGFyICpzeXN0ZW1faWQpOworaW50IHZnX3NldF9sb2NrX3R5cGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGNvbnN0IGNoYXIgKmxvY2tfdHlwZSk7Cit1aW50NjRfdCB2Z19zaXplKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK3VpbnQ2NF90IHZnX2ZyZWUoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordWludDY0X3QgdmdfZXh0ZW50X3NpemUoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX2NoZWNrX25ld19leHRlbnRfc2l6ZShjb25zdCBzdHJ1Y3QgZm9ybWF0X3R5cGUgKmZtdCwgdWludDMyX3QgbmV3X2V4dGVudF9zaXplKTsKK2ludCB2Z19zZXRfZXh0ZW50X3NpemUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG5ld19leHRlbnRfc2l6ZSk7Cit1aW50NjRfdCB2Z19leHRlbnRfY291bnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordWludDY0X3QgdmdfZnJlZV9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit1aW50NjRfdCB2Z19wdl9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7Cit1aW50NjRfdCB2Z19tYXhfcHYoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX3NldF9tYXhfcHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG1heF9wdik7Cit1aW50NjRfdCB2Z19tYXhfbHYoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnX3NldF9tYXhfbHYoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG1heF9sdik7Cit1aW50MzJfdCB2Z19tZGFfY291bnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordWludDMyX3QgdmdfbWRhX3VzZWRfY291bnQoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOwordWludDMyX3QgdmdfbWRhX2NvcGllcyhjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CitpbnQgdmdfc2V0X21kYV9jb3BpZXMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHVpbnQzMl90IG1kYV9jb3BpZXMpOworY2hhciAqdmdfcHJvZmlsZV9kdXAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCisvKgorICogUmV0dXJucyB2aXNpYmxlIExWIGNvdW50IC0gbnVtYmVyIG9mIExWcyBmcm9tIHVzZXIgcGVyc3BlY3RpdmUKKyAqLwordW5zaWduZWQgdmdfdmlzaWJsZV9sdnMoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworCisvKgorICogQ291bnQgc25hcHNob3QgTFZzLgorICovCit1bnNpZ25lZCBzbmFwc2hvdF9jb3VudChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKK3VpbnQ2NF90IHZnX21kYV9zaXplKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK3VpbnQ2NF90IHZnX21kYV9mcmVlKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2NoYXIgKnZnX2F0dHJfZHVwKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2NoYXIgKnZnX3V1aWRfZHVwKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK2NoYXIgKnZnX3RhZ3NfZHVwKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKKworI2VuZGlmIC8qIF9MVk1fVkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL21pcnJvci8uZXhwb3J0ZWRfc3ltYm9scyBiL2xpYi9taXJyb3IvLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5MmM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXJyb3IvLmV4cG9ydGVkX3N5bWJvbHMKQEAgLTAsMCArMSBAQAoraW5pdF9zZWd0eXBlCmRpZmYgLS1naXQgYS9saWIvbWlycm9yL01ha2VmaWxlLmluIGIvbGliL21pcnJvci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzhkYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21pcnJvci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IG1pcnJvcmVkLmMKKworTElCX1NIQVJFRCA9IGxpYmx2bTJtaXJyb3IuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMl9wbHVnaW4KZGlmZiAtLWdpdCBhL2xpYi9taXJyb3IvbWlycm9yZWQuYyBiL2xpYi9taXJyb3IvbWlycm9yZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJhNzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pcnJvci9taXJyb3JlZC5jCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInRleHRfZXhwb3J0LmgiCisjaW5jbHVkZSAidGV4dF9pbXBvcnQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAidGFyZ2V0cy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAic3RyX2xpc3QuaCIKKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK2VudW0geworCU1JUlJfRElTQUJMRUQsCisJTUlSUl9SVU5OSU5HLAorCU1JUlJfQ09NUExFVEVECit9OworCitzdHJ1Y3QgbWlycm9yX3N0YXRlIHsKKwl1aW50MzJfdCBkZWZhdWx0X3JlZ2lvbl9zaXplOworfTsKKworc3RhdGljIHZvaWQgX21pcnJvcmVkX2Rpc3BsYXkoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwljb25zdCBjaGFyICpzaXplOworCXVpbnQzMl90IHM7CisKKwlsb2dfcHJpbnQoIiAgTWlycm9yc1x0XHQldSIsIHNlZy0+YXJlYV9jb3VudCk7CisJbG9nX3ByaW50KCIgIE1pcnJvciBzaXplXHRcdCV1Iiwgc2VnLT5hcmVhX2xlbik7CisJaWYgKHNlZy0+bG9nX2x2KQorCQlsb2dfcHJpbnQoIiAgTWlycm9yIGxvZyB2b2x1bWVcdCVzIiwgc2VnLT5sb2dfbHYtPm5hbWUpOworCisJaWYgKHNlZy0+cmVnaW9uX3NpemUpIHsKKwkJc2l6ZSA9IGRpc3BsYXlfc2l6ZShzZWctPmx2LT52Zy0+Y21kLAorCQkJCSAgICAodWludDY0X3QpIHNlZy0+cmVnaW9uX3NpemUpOworCQlsb2dfcHJpbnQoIiAgTWlycm9yIHJlZ2lvbiBzaXplXHQlcyIsIHNpemUpOworCX0KKworCWxvZ19wcmludCgiICBNaXJyb3Igb3JpZ2luYWw6Iik7CisJZGlzcGxheV9zdHJpcGUoc2VnLCAwLCAiICAgICIpOworCWxvZ19wcmludCgiICBNaXJyb3IgZGVzdGluYXRpb25zOiIpOworCWZvciAocyA9IDE7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykKKwkJZGlzcGxheV9zdHJpcGUoc2VnLCBzLCAiICAgICIpOworCWxvZ19wcmludCgiICIpOworfQorCitzdGF0aWMgaW50IF9taXJyb3JlZF90ZXh0X2ltcG9ydF9hcmVhX2NvdW50KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sIHVpbnQzMl90ICphcmVhX2NvdW50KQoreworCWlmICghZG1fY29uZmlnX2dldF91aW50MzIoc24sICJtaXJyb3JfY291bnQiLCBhcmVhX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgJ21pcnJvcl9jb3VudCcgZm9yICIKKwkJCSAgInNlZ21lbnQgJyVzJy4iLCBkbV9jb25maWdfcGFyZW50X25hbWUoc24pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX21pcnJvcmVkX3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwljb25zdCBjaGFyICpsb2duYW1lID0gTlVMTDsKKworCWlmIChkbV9jb25maWdfaGFzX25vZGUoc24sICJleHRlbnRzX21vdmVkIikpIHsKKwkJaWYgKGRtX2NvbmZpZ19nZXRfdWludDMyKHNuLCAiZXh0ZW50c19tb3ZlZCIsCisJCQkJICAgICAgJnNlZy0+ZXh0ZW50c19jb3BpZWQpKQorCQkJc2VnLT5zdGF0dXMgfD0gUFZNT1ZFOworCQllbHNlIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCAnZXh0ZW50c19tb3ZlZCcgZm9yICIKKwkJCQkgICJzZWdtZW50ICVzIG9mIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkJICBkbV9jb25maWdfcGFyZW50X25hbWUoc24pLCBzZWctPmx2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgInJlZ2lvbl9zaXplIikpIHsKKwkJaWYgKCFkbV9jb25maWdfZ2V0X3VpbnQzMihzbiwgInJlZ2lvbl9zaXplIiwKKwkJCQkgICAgICAmc2VnLT5yZWdpb25fc2l6ZSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCAncmVnaW9uX3NpemUnIGZvciAiCisJCQkJICAic2VnbWVudCAlcyBvZiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCSAgZG1fY29uZmlnX3BhcmVudF9uYW1lKHNuKSwgc2VnLT5sdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChkbV9jb25maWdfZ2V0X3N0cihzbiwgIm1pcnJvcl9sb2ciLCAmbG9nbmFtZSkpIHsKKwkJaWYgKCEoc2VnLT5sb2dfbHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBsb2duYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIG1pcnJvciBsb2cgaW4gIgorCQkJCSAgInNlZ21lbnQgJXMgb2YgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbiksIHNlZy0+bHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2VnLT5sb2dfbHYtPnN0YXR1cyB8PSBNSVJST1JfTE9HOworCX0KKworCWlmIChsb2duYW1lICYmICFzZWctPnJlZ2lvbl9zaXplKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyByZWdpb24gc2l6ZSBmb3IgbWlycm9yIGxvZyBmb3IgIgorCQkJICAic2VnbWVudCAlcyBvZiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkbV9jb25maWdfcGFyZW50X25hbWUoc24pLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9jb25maWdfZ2V0X2xpc3Qoc24sICJtaXJyb3JzIiwgJmN2KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgbWlycm9ycyBhcnJheSBmb3IgIgorCQkJICAic2VnbWVudCAlcyBvZiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkbV9jb25maWdfcGFyZW50X25hbWUoc24pLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHRleHRfaW1wb3J0X2FyZWFzKHNlZywgc24sIGN2LCBwdl9oYXNoLCBNSVJST1JfSU1BR0UpOworfQorCitzdGF0aWMgaW50IF9taXJyb3JlZF90ZXh0X2V4cG9ydChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCW91dGYoZiwgIm1pcnJvcl9jb3VudCA9ICV1Iiwgc2VnLT5hcmVhX2NvdW50KTsKKwlpZiAoc2VnLT5zdGF0dXMgJiBQVk1PVkUpCisJCW91dHNpemUoZiwgKHVpbnQ2NF90KSBzZWctPmV4dGVudHNfY29waWVkICogc2VnLT5sdi0+dmctPmV4dGVudF9zaXplLAorCQkJImV4dGVudHNfbW92ZWQgPSAlIiBQUkl1MzIsIHNlZy0+ZXh0ZW50c19jb3BpZWQpOworCWlmIChzZWctPmxvZ19sdikKKwkJb3V0ZihmLCAibWlycm9yX2xvZyA9IFwiJXNcIiIsIHNlZy0+bG9nX2x2LT5uYW1lKTsKKwlpZiAoc2VnLT5yZWdpb25fc2l6ZSkKKwkJb3V0ZihmLCAicmVnaW9uX3NpemUgPSAlIiBQUkl1MzIsIHNlZy0+cmVnaW9uX3NpemUpOworCisJcmV0dXJuIG91dF9hcmVhcyhmLCBzZWcsICJtaXJyb3IiKTsKK30KKworI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCitzdGF0aWMgaW50IF9ibG9ja19vbl9lcnJvcl9hdmFpbGFibGUgPSAwOworCitzdGF0aWMgc3RydWN0IG1pcnJvcl9zdGF0ZSAqX21pcnJvcmVkX2luaXRfdGFyZ2V0KHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCSBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3QgbWlycm9yX3N0YXRlICptaXJyX3N0YXRlOworCisJaWYgKCEobWlycl9zdGF0ZSA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKm1pcnJfc3RhdGUpKSkpIHsKKwkJbG9nX2Vycm9yKCJzdHJ1Y3QgbWlycl9zdGF0ZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltaXJyX3N0YXRlLT5kZWZhdWx0X3JlZ2lvbl9zaXplID0gZ2V0X2RlZmF1bHRfcmVnaW9uX3NpemUoY21kKTsKKworCXJldHVybiBtaXJyX3N0YXRlOworfQorCitzdGF0aWMgaW50IF9taXJyb3JlZF90YXJnZXRfcGVyY2VudCh2b2lkICoqdGFyZ2V0X3N0YXRlLAorCQkJCSAgICBkbV9wZXJjZW50X3QgKnBlcmNlbnQsCisJCQkJICAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBjaGFyICpwYXJhbXMsCisJCQkJICAgIHVpbnQ2NF90ICp0b3RhbF9udW1lcmF0b3IsCisJCQkJICAgIHVpbnQ2NF90ICp0b3RhbF9kZW5vbWluYXRvcikKK3sKKwlzdHJ1Y3QgZG1fc3RhdHVzX21pcnJvciAqc207CisKKwlpZiAoISp0YXJnZXRfc3RhdGUpCisJCSp0YXJnZXRfc3RhdGUgPSBfbWlycm9yZWRfaW5pdF90YXJnZXQobWVtLCBjbWQpOworCisJaWYgKCFkbV9nZXRfc3RhdHVzX21pcnJvcihtZW0sIHBhcmFtcywgJnNtKSkKKwkJcmV0dXJuXzA7CisKKwkqdG90YWxfbnVtZXJhdG9yICs9IHNtLT5pbnN5bmNfcmVnaW9uczsKKwkqdG90YWxfZGVub21pbmF0b3IgKz0gc20tPnRvdGFsX3JlZ2lvbnM7CisKKwlpZiAoc2VnKQorCQlzZWctPmV4dGVudHNfY29waWVkID0gc2VnLT5hcmVhX2xlbiAqIHNtLT5pbnN5bmNfcmVnaW9ucyAvIHNtLT50b3RhbF9yZWdpb25zOworCisJKnBlcmNlbnQgPSBkbV9tYWtlX3BlcmNlbnQoc20tPmluc3luY19yZWdpb25zLCBzbS0+dG90YWxfcmVnaW9ucyk7CisKKwlkbV9wb29sX2ZyZWUobWVtLCBzbSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbWlycm9yZWRfdHJhbnNpZW50X3N0YXR1cyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBjaGFyICpwYXJhbXMpCit7CisJc3RydWN0IGRtX3N0YXR1c19taXJyb3IgKnNtOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBzZWctPmx2OworCWludCBmYWlsZWQgPSAwLCByID0gMDsKKwl1bnNpZ25lZCBpLCBqOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIk1pcnJvcmVkIHRyYW5zaWVudCBzdGF0dXM6IFwiJXNcIiIsIHBhcmFtcyk7CisKKwlpZiAoIWRtX2dldF9zdGF0dXNfbWlycm9yKG1lbSwgcGFyYW1zLCAmc20pKQorCQlyZXR1cm5fMDsKKworCWlmIChzbS0+ZGV2X2NvdW50ICE9IHNlZy0+YXJlYV9jb3VudCkgeworCQlsb2dfZXJyb3IoIkFjdGl2ZSBtaXJyb3IgaGFzIGEgd3JvbmcgbnVtYmVyIG9mIG1pcnJvciBpbWFnZXMhIik7CisJCWxvZ19lcnJvcigiTWV0YWRhdGEgc2F5cyAldSwga2VybmVsIHNheXMgJXUuIiwKKwkJCSAgc2VnLT5hcmVhX2NvdW50LCBzbS0+ZGV2X2NvdW50KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFzdHJjbXAoc20tPmxvZ190eXBlLCAiZGlzayIpKSB7CisJCWxvZyA9IGZpcnN0X3NlZyhsdiktPmxvZ19sdjsKKwkJaWYgKCFsdl9pbmZvKGx2LT52Zy0+Y21kLCBsb2csIDAsICZpbmZvLCAwLCAwKSkgeworCQkJbG9nX2Vycm9yKCJDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1pcnJvciBsb2cgJXMgZmFpbGVkLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsb2cpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJGb3VuZCBtaXJyb3IgbG9nIGF0ICVkOiVkIiwgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisJCWlmIChpbmZvLm1ham9yICE9IChpbnQpc20tPmxvZ3NbMF0ubWFqb3IgfHwKKwkJICAgIGluZm8ubWlub3IgIT0gKGludClzbS0+bG9nc1swXS5taW5vcikgeworCQkJbG9nX2Vycm9yKCJNaXJyb3IgbG9nIG1pc21hdGNoLiBNZXRhZGF0YSBzYXlzICVkOiVkLCBrZXJuZWwgc2F5cyAldToldS4iLAorCQkJCSAgaW5mby5tYWpvciwgaW5mby5taW5vciwKKwkJCQkgIHNtLT5sb2dzWzBdLm1ham9yLCBzbS0+bG9nc1swXS5taW5vcik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsb2dfdmVyeV92ZXJib3NlKCJTdGF0dXMgb2YgbG9nICglZDolZCk6ICVjLiIsCisJCQkJIGluZm8ubWFqb3IsIGluZm8ubWlub3IsCisJCQkJIHNtLT5sb2dzWzBdLmhlYWx0aCk7CisJCWlmIChzbS0+bG9nc1swXS5oZWFsdGggIT0gRE1fU1RBVFVTX01JUlJPUl9BTElWRSkgeworCQkJbG9nLT5zdGF0dXMgfD0gUEFSVElBTF9MVjsKKwkJCSsrZmFpbGVkOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNlZy0+YXJlYV9jb3VudDsgKytpKSB7CisJCWlmICghbHZfaW5mbyhsdi0+dmctPmNtZCwgc2VnX2x2KHNlZywgaSksIDAsICZpbmZvLCAwLCAwKSkgeworCQkJbG9nX2Vycm9yKCJDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1pcnJvciBpbWFnZSAlcyBmYWlsZWQuIiwKKwkJCQkgIHNlZ19sdihzZWcsIGkpLT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJGb3VuZCBtaXJyb3IgaW1hZ2UgYXQgJWQ6JWQiLCBpbmZvLm1ham9yLCBpbmZvLm1pbm9yKTsKKwkJZm9yIChqID0gMDsgaiA8IHNtLT5kZXZfY291bnQ7ICsraikKKwkJCWlmIChpbmZvLm1ham9yID09IChpbnQpc20tPmRldnNbal0ubWFqb3IgJiYKKwkJCSAgICBpbmZvLm1pbm9yID09IChpbnQpc20tPmRldnNbal0ubWlub3IpIHsKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCJTdGF0dXMgb2YgaW1hZ2UgJWQ6ICVjLiIsCisJCQkJCQkgaSwgc20tPmRldnNbal0uaGVhbHRoKTsKKwkJCQlpZiAoc20tPmRldnNbal0uaGVhbHRoICE9IERNX1NUQVRVU19NSVJST1JfQUxJVkUpIHsKKwkJCQkJc2VnX2x2KHNlZywgaSktPnN0YXR1cyB8PSBQQVJUSUFMX0xWOworCQkJCQkrK2ZhaWxlZDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChqID09IHNtLT5kZXZfY291bnQpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgaW1hZ2UgJWQgKCVkOiVkKS4iLAorCQkJCSAgaSwgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHVwZGF0ZSBQQVJUSUFMX0xWIGZsYWdzIGFjcm9zcyB0aGUgVkcgKi8KKwlpZiAoZmFpbGVkKQorCQl2Z19tYXJrX3BhcnRpYWxfbHZzKGx2LT52ZywgMCk7CisKKwlyID0gMTsKK291dDoKKwlkbV9wb29sX2ZyZWUobWVtLCBzbSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfYWRkX2xvZyhzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQzMl90IGFyZWFfY291bnQsIHVpbnQzMl90IHJlZ2lvbl9zaXplKQoreworCXVuc2lnbmVkIGNsdXN0ZXJlZCA9IDA7CisJY2hhciAqbG9nX2RsaWQgPSBOVUxMOworCXVpbnQzMl90IGxvZ19mbGFncyA9IDA7CisKKwkvKgorCSAqIFVzZSBjbHVzdGVyZWQgbWlycm9yIGxvZyBmb3Igbm9uLWV4Y2x1c2l2ZSBhY3RpdmF0aW9uCisJICogaW4gY2x1c3RlcmVkIFZHLgorCSAqLworCWlmICghbGFvcHRzLT5leGNsdXNpdmUgJiYgdmdfaXNfY2x1c3RlcmVkKHNlZy0+bHYtPnZnKSkKKwkJY2x1c3RlcmVkID0gMTsKKworCWlmIChzZWctPmxvZ19sdikgeworCQkvKiBJZiBkaXNrIGxvZywgdXNlIGl0cyBVVUlEICovCisJCWlmICghKGxvZ19kbGlkID0gYnVpbGRfZG1fdXVpZChtZW0sIHNlZy0+bG9nX2x2LCBOVUxMKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHV1aWQgZm9yIGxvZyBMViAlcy4iLAorCQkJCSAgc2VnLT5sb2dfbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiBjb3JlIGxvZywgdXNlIG1pcnJvcidzIFVVSUQgYW5kIHNldCBETV9DT1JFTE9HIGZsYWcgKi8KKwkJaWYgKCEobG9nX2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgc2VnLT5sdiwgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBidWlsZCB1dWlkIGZvciBtaXJyb3IgTFYgJXMuIiwKKwkJCQkgIHNlZy0+bHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX2ZsYWdzIHw9IERNX0NPUkVMT0c7CisJfQorCisJaWYgKG1pcnJvcl9pbl9zeW5jKCkgJiYgIShzZWctPnN0YXR1cyAmIFBWTU9WRSkpCisJCWxvZ19mbGFncyB8PSBETV9OT1NZTkM7CisKKwlpZiAoX2Jsb2NrX29uX2Vycm9yX2F2YWlsYWJsZSAmJiAhKHNlZy0+c3RhdHVzICYgUFZNT1ZFKSkKKwkJbG9nX2ZsYWdzIHw9IERNX0JMT0NLX09OX0VSUk9SOworCisJcmV0dXJuIGRtX3RyZWVfbm9kZV9hZGRfbWlycm9yX3RhcmdldF9sb2cobm9kZSwgcmVnaW9uX3NpemUsIGNsdXN0ZXJlZCwgbG9nX2RsaWQsIGFyZWFfY291bnQsIGxvZ19mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX21pcnJvcmVkX2FkZF90YXJnZXRfbGluZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICAgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHZvaWQgKip0YXJnZXRfc3RhdGUsCisJCQkJICAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cywKKwkJCQkgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IGxlbiwKKwkJCQkgICAgIHVpbnQzMl90ICpwdm1vdmVfbWlycm9yX2NvdW50KQoreworCXN0cnVjdCBtaXJyb3Jfc3RhdGUgKm1pcnJfc3RhdGU7CisJdWludDMyX3QgYXJlYV9jb3VudCA9IHNlZy0+YXJlYV9jb3VudDsKKwl1bnNpZ25lZCBzdGFydF9hcmVhID0gMHU7CisJaW50IG1pcnJvcl9zdGF0dXMgPSBNSVJSX1JVTk5JTkc7CisJdWludDMyX3QgcmVnaW9uX3NpemU7CisJaW50IHI7CisKKwlpZiAoISp0YXJnZXRfc3RhdGUgJiYKKwkgICAgISgqdGFyZ2V0X3N0YXRlID0gX21pcnJvcmVkX2luaXRfdGFyZ2V0KG1lbSwgY21kKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuXzA7CisKKwltaXJyX3N0YXRlID0gKnRhcmdldF9zdGF0ZTsKKworCS8qCisJICogTWlycm9yIHNlZ21lbnQgY291bGQgaGF2ZSBvbmx5IDEgYXJlYSB0ZW1wb3JhcmlseQorCSAqIGlmIHRoZSBzZWdtZW50IGlzIHVuZGVyIGNvbnZlcnNpb24uCisJICovCisgCWlmIChzZWctPmFyZWFfY291bnQgPT0gMSkKKwkJbWlycm9yX3N0YXR1cyA9IE1JUlJfRElTQUJMRUQ7CisKKwkvKgorCSAqIEZvciBwdm1vdmUsIG9ubHkgaGF2ZSBvbmUgbWlycm9yIHNlZ21lbnQgUlVOTklORyBhdCBvbmNlLgorCSAqIFNlZ21lbnRzIGJlZm9yZSB0aGlzIGFyZSBDT01QTEVURUQgYW5kIHVzZSAybmQgYXJlYS4KKwkgKiBTZWdtZW50cyBhZnRlciB0aGlzIGFyZSBESVNBQkxFRCBhbmQgdXNlIDFzdCBhcmVhLgorCSAqLworCWlmIChzZWctPnN0YXR1cyAmIFBWTU9WRSkgeworCQlpZiAoc2VnLT5leHRlbnRzX2NvcGllZCA9PSBzZWctPmFyZWFfbGVuKSB7CisJCQltaXJyb3Jfc3RhdHVzID0gTUlSUl9DT01QTEVURUQ7CisJCQlzdGFydF9hcmVhID0gMTsKKwkJfSBlbHNlIGlmICgoKnB2bW92ZV9taXJyb3JfY291bnQpKyspIHsKKwkJCW1pcnJvcl9zdGF0dXMgPSBNSVJSX0RJU0FCTEVEOworCQkJYXJlYV9jb3VudCA9IDE7CisJCX0KKwkJLyogZWxzZSBNSVJSX1JVTk5JTkcgKi8KKwl9CisKKwlpZiAobWlycm9yX3N0YXR1cyAhPSBNSVJSX1JVTk5JTkcpIHsKKwkJaWYgKCFhZGRfbGluZWFyX2FyZWFfdG9fZHRyZWUobm9kZSwgbGVuLCBzZWctPmx2LT52Zy0+ZXh0ZW50X3NpemUsCisJCQkJCSAgICAgIGNtZC0+dXNlX2xpbmVhcl90YXJnZXQsCisJCQkJCSAgICAgIHNlZy0+bHYtPnZnLT5uYW1lLCBzZWctPmx2LT5uYW1lKSkKKwkJCXJldHVybl8wOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCEoc2VnLT5zdGF0dXMgJiBQVk1PVkUpKSB7CisJCWlmICghc2VnLT5yZWdpb25fc2l6ZSkgeworCQkJbG9nX2Vycm9yKCJNaXNzaW5nIHJlZ2lvbiBzaXplIGZvciBtaXJyb3Igc2VnbWVudC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJlZ2lvbl9zaXplID0gc2VnLT5yZWdpb25fc2l6ZTsKKworCX0gZWxzZQorCQlyZWdpb25fc2l6ZSA9IGFkanVzdGVkX21pcnJvcl9yZWdpb25fc2l6ZShzZWctPmx2LT52Zy0+ZXh0ZW50X3NpemUsCisJCQkJCQkJICBzZWctPmFyZWFfbGVuLAorCQkJCQkJCSAgbWlycl9zdGF0ZS0+ZGVmYXVsdF9yZWdpb25fc2l6ZSwgMSwKKwkJCQkJCQkgIHZnX2lzX2NsdXN0ZXJlZChzZWctPmx2LT52ZykpOworCisJaWYgKCFkbV90cmVlX25vZGVfYWRkX21pcnJvcl90YXJnZXQobm9kZSwgbGVuKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKHIgPSBfYWRkX2xvZyhtZW0sIHNlZywgbGFvcHRzLCBub2RlLCBhcmVhX2NvdW50LCByZWdpb25fc2l6ZSkpIDw9IDApIHsKKwkJc3RhY2s7CisJCXJldHVybiByOworCX0KKworICAgICAgZG9uZToKKwlyZXR1cm4gYWRkX2FyZWFzX2xpbmUoZG0sIHNlZywgbm9kZSwgc3RhcnRfYXJlYSwgYXJlYV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX21pcnJvcmVkX3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICB1bnNpZ25lZCAqYXR0cmlidXRlcykKK3sKKwlzdGF0aWMgaW50IF9taXJyb3JlZF9jaGVja2VkID0gMDsKKwlzdGF0aWMgaW50IF9taXJyb3JlZF9wcmVzZW50ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgX21pcnJvcl9hdHRyaWJ1dGVzID0gMDsKKwl1aW50MzJfdCBtYWosIG1pbiwgcGF0Y2hsZXZlbDsKKwl1bnNpZ25lZCBtYWoyLCBtaW4yLCBwYXRjaGxldmVsMjsKKwljaGFyIHZzbls4MF07CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV9taXJyb3JlZF9jaGVja2VkKSB7CisJCV9taXJyb3JlZF9jaGVja2VkID0gMTsKKworCQlpZiAoIShfbWlycm9yZWRfcHJlc2VudCA9IHRhcmdldF9wcmVzZW50KGNtZCwgVEFSR0VUX05BTUVfTUlSUk9SLCAxKSkpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBibG9ja19vbl9lcnJvciBhdmFpbGFibGUgYXMgImJsb2NrX29uX2Vycm9yIiBsb2cKKwkJICogYXJndW1lbnQgd2l0aCBtaXJyb3IgdGFyZ2V0ID49IDEuMSBhbmQgPD0gMS4xMQorCQkgKiBvciB3aXRoIDEuMCBpbiBSSEVMNFUzIGRyaXZlciA+PSA0LjUKKwkJICoKKwkJICogYmxvY2tfb25fZXJyb3IgYXZhaWxhYmxlIGFzICJoYW5kbGVfZXJyb3JzIiBtaXJyb3IKKwkJICogYXJndW1lbnQgd2l0aCBtaXJyb3IgdGFyZ2V0ID49IDEuMTIuCisJCSAqCisJCSAqIGxpYmRtLWRlcHRyZWUuYyBpcyBzbWFydCBlbm91Z2ggdG8gaGFuZGxlIHRoZSBkaWZmZXJlbmNlcworCQkgKiBiZXR3ZWVuIGJsb2NrX29uX2Vycm9yIGFuZCBoYW5kbGVfZXJyb3JzIGZvciBhbGwKKwkJICogbWlycm9yIHRhcmdldCB2ZXJzaW9ucyA+PSAxLjEKKwkJICovCisJCS8qIEZJWE1FIE1vdmUgdGhpcyBpbnRvIGxpYmRldm1hcHBlciAqLworCisJCWlmICh0YXJnZXRfdmVyc2lvbihUQVJHRVRfTkFNRV9NSVJST1IsICZtYWosICZtaW4sICZwYXRjaGxldmVsKSAmJgorCQkgICAgbWFqID09IDEgJiYKKwkJICAgICgobWluID49IDEpIHx8CisJCSAgICAgKG1pbiA9PSAwICYmIGRyaXZlcl92ZXJzaW9uKHZzbiwgc2l6ZW9mKHZzbikpICYmCisJCSAgICAgIHNzY2FuZih2c24sICIldS4ldS4ldSIsICZtYWoyLCAmbWluMiwgJnBhdGNobGV2ZWwyKSA9PSAzICYmCisJCSAgICAgIG1hajIgPT0gNCAmJiBtaW4yID09IDUgJiYgcGF0Y2hsZXZlbDIgPT0gMCkpKQkvKiBSSEVMNFUzICovCisJCQlfYmxvY2tfb25fZXJyb3JfYXZhaWxhYmxlID0gMTsKKworI2lmZGVmIENNSVJST1JEX1BJREZJTEUKKwkJLyoKKwkJICogVGhlIGNsdXN0ZXIgbWlycm9yIGxvZyBkYWVtb24gbXVzdCBiZSBydW5uaW5nLAorCQkgKiBvdGhlcndpc2UsIHRoZSBrZXJuZWwgbW9kdWxlIHdpbGwgZmFpbCB0byBtYWtlCisJCSAqIGNvbnRhY3QuCisJCSAqLworCQlpZiAoY21pcnJvcmRfaXNfcnVubmluZygpKSB7CisJCQlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJCQl1bnNpZ25lZCBrbWFqLCBrbWluLCBrcmVsOworCQkJLyoKKwkJCSAqIFRoZSBkbS1sb2ctdXNlcnNwYWNlIG1vZHVsZSB3YXMgYWRkZWQgdG8gdGhlCisJCQkgKiAyLjYuMzEga2VybmVsLgorCQkJICovCisJCQlpZiAoIXVuYW1lKCZ1dHMpICYmCisJCQkgICAgKHNzY2FuZih1dHMucmVsZWFzZSwgIiV1LiV1LiV1IiwgJmttYWosICZrbWluLCAma3JlbCkgPT0gMykgJiYKKwkJCSAgICBLRVJORUxfVkVSU0lPTihrbWFqLCBrbWluLCBrcmVsKSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDMxKSkgeworCQkJCWlmIChtb2R1bGVfcHJlc2VudChjbWQsIE1PRFVMRV9OQU1FX0xPR19DTFVTVEVSRUQpKQorCQkJCV9taXJyb3JfYXR0cmlidXRlcyB8PSBNSVJST1JfTE9HX0NMVVNURVJFRDsKKwkJCX0gZWxzZSBpZiAobW9kdWxlX3ByZXNlbnQoY21kLCBNT0RVTEVfTkFNRV9MT0dfVVNFUlNQQUNFKSkKKwkJCQlfbWlycm9yX2F0dHJpYnV0ZXMgfD0gTUlSUk9SX0xPR19DTFVTVEVSRUQ7CisKKwkJCWlmICghKF9taXJyb3JfYXR0cmlidXRlcyAmIE1JUlJPUl9MT0dfQ0xVU1RFUkVEKSkKKwkJCQlsb2dfdmVyYm9zZSgiQ2x1c3RlciBtaXJyb3IgbG9nIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLiIpOworCQl9IGVsc2UKKwkJCWxvZ192ZXJib3NlKCJDbHVzdGVyIG1pcnJvciBsb2cgZGFlbW9uIGlzIG5vdCBydW5uaW5nLiIpOworI2Vsc2UKKwkJbG9nX3ZlcmJvc2UoIkNsdXN0ZXIgbWlycm9yIGxvZyBkYWVtb24gbm90IGluY2x1ZGVkIGluIGJ1aWxkLiIpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBDaGVjayBvbmx5IGZvciBtb2R1bGVzIGlmIGF0dHRyaWJ1dGVzIHJlcXVlc3RlZCBhbmQgbm8gcHJldmlvdXMgY2hlY2suCisJICogRklYTUU6IEZhaWxzIGluY29ycmVjdGx5IGlmIGNtaXJyb3Igd2FzIGJ1aWx0IGludG8ga2VybmVsLgorCSAqLworCWlmIChhdHRyaWJ1dGVzKQorCQkqYXR0cmlidXRlcyA9IF9taXJyb3JfYXR0cmlidXRlczsKKworCXJldHVybiBfbWlycm9yZWRfcHJlc2VudDsKK30KKworIyAgaWZkZWYgRE1FVkVOVEQKK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0X21pcnJvcl9kc29fcGF0aChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gZ2V0X21vbml0b3JfZHNvX3BhdGgoY21kLCBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGRtZXZlbnRkX21pcnJvcl9saWJyYXJ5X0NGRywgTlVMTCkpOworfQorCisvKiBGSVhNRSBDYWNoZSB0aGlzICovCitzdGF0aWMgaW50IF90YXJnZXRfcmVnaXN0ZXJlZChzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgKnBlbmRpbmcpCit7CisJcmV0dXJuIHRhcmdldF9yZWdpc3RlcmVkX3dpdGhfZG1ldmVudGQoc2VnLT5sdi0+dmctPmNtZCwgX2dldF9taXJyb3JfZHNvX3BhdGgoc2VnLT5sdi0+dmctPmNtZCksCisJCQkJCSAgICAgICBzZWctPmx2LCBwZW5kaW5nKTsKK30KKworLyogRklYTUUgVGhpcyBnZXRzIHJ1biB3aGlsZSBzdXNwZW5kZWQgYW5kIHBlcmZvcm1zIGJhbm5lZCBvcGVyYXRpb25zLiAqLworc3RhdGljIGludCBfdGFyZ2V0X3NldF9ldmVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50IGV2bWFzaywgaW50IHNldCkKK3sKKwlyZXR1cm4gdGFyZ2V0X3JlZ2lzdGVyX2V2ZW50cyhzZWctPmx2LT52Zy0+Y21kLCBfZ2V0X21pcnJvcl9kc29fcGF0aChzZWctPmx2LT52Zy0+Y21kKSwKKwkJCQkgICAgICBzZWctPmx2LCBldm1hc2ssIHNldCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX3RhcmdldF9tb25pdG9yX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZlbnRzKQoreworCXJldHVybiBfdGFyZ2V0X3NldF9ldmVudHMoc2VnLCBldmVudHMsIDEpOworfQorCitzdGF0aWMgaW50IF90YXJnZXRfdW5tb25pdG9yX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZlbnRzKQoreworCXJldHVybiBfdGFyZ2V0X3NldF9ldmVudHMoc2VnLCBldmVudHMsIDApOworfQorCisjICBlbmRpZiAvKiBETUVWRU5URCAqLworCitzdGF0aWMgaW50IF9taXJyb3JlZF9tb2R1bGVzX25lZWRlZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbW9kdWxlcykKK3sKKwlpZiAoc2VnLT5sb2dfbHYgJiYKKwkgICAgIWxpc3Rfc2VnbWVudF9tb2R1bGVzKG1lbSwgZmlyc3Rfc2VnKHNlZy0+bG9nX2x2KSwgbW9kdWxlcykpCisJCXJldHVybl8wOworCisJaWYgKHZnX2lzX2NsdXN0ZXJlZChzZWctPmx2LT52ZykgJiYKKwkgICAgIXN0cl9saXN0X2FkZChtZW0sIG1vZHVsZXMsIE1PRFVMRV9OQU1FX0NMVVNURVJFRF9NSVJST1IpKSB7CisJCWxvZ19lcnJvcigiY2x1c3RlciBsb2cgc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJfbGlzdF9hZGQobWVtLCBtb2R1bGVzLCBNT0RVTEVfTkFNRV9NSVJST1IpKSB7CisJCWxvZ19lcnJvcigibWlycm9yIHN0cmluZyBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIERFVk1BUFBFUl9TVVBQT1JUICovCisKK3N0YXRpYyB2b2lkIF9taXJyb3JlZF9kZXN0cm95KHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUpCit7CisJZG1fZnJlZShzZWd0eXBlKTsKK30KKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX21pcnJvcmVkX29wcyA9IHsKKwkuZGlzcGxheSA9IF9taXJyb3JlZF9kaXNwbGF5LAorCS50ZXh0X2ltcG9ydF9hcmVhX2NvdW50ID0gX21pcnJvcmVkX3RleHRfaW1wb3J0X2FyZWFfY291bnQsCisJLnRleHRfaW1wb3J0ID0gX21pcnJvcmVkX3RleHRfaW1wb3J0LAorCS50ZXh0X2V4cG9ydCA9IF9taXJyb3JlZF90ZXh0X2V4cG9ydCwKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorCS5hZGRfdGFyZ2V0X2xpbmUgPSBfbWlycm9yZWRfYWRkX3RhcmdldF9saW5lLAorCS50YXJnZXRfcGVyY2VudCA9IF9taXJyb3JlZF90YXJnZXRfcGVyY2VudCwKKwkudGFyZ2V0X3ByZXNlbnQgPSBfbWlycm9yZWRfdGFyZ2V0X3ByZXNlbnQsCisJLmNoZWNrX3RyYW5zaWVudF9zdGF0dXMgPSBfbWlycm9yZWRfdHJhbnNpZW50X3N0YXR1cywKKwkubW9kdWxlc19uZWVkZWQgPSBfbWlycm9yZWRfbW9kdWxlc19uZWVkZWQsCisjICBpZmRlZiBETUVWRU5URAorCS50YXJnZXRfbW9uaXRvcmVkID0gX3RhcmdldF9yZWdpc3RlcmVkLAorCS50YXJnZXRfbW9uaXRvcl9ldmVudHMgPSBfdGFyZ2V0X21vbml0b3JfZXZlbnRzLAorCS50YXJnZXRfdW5tb25pdG9yX2V2ZW50cyA9IF90YXJnZXRfdW5tb25pdG9yX2V2ZW50cywKKyMgIGVuZGlmCS8qIERNRVZFTlREICovCisjZW5kaWYKKwkuZGVzdHJveSA9IF9taXJyb3JlZF9kZXN0cm95LAorfTsKKworI2lmZGVmIE1JUlJPUkVEX0lOVEVSTkFMCitzdHJ1Y3Qgc2VnbWVudF90eXBlICppbml0X21pcnJvcmVkX3NlZ3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCisjZWxzZQkJCQkvKiBTaGFyZWQgKi8KK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CitzdHJ1Y3Qgc2VnbWVudF90eXBlICppbml0X3NlZ3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCisjZW5kaWYKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJaWYgKCFzZWd0eXBlKQorCQlyZXR1cm5fTlVMTDsKKworCXNlZ3R5cGUtPm9wcyA9ICZfbWlycm9yZWRfb3BzOworCXNlZ3R5cGUtPm5hbWUgPSBTRUdfVFlQRV9OQU1FX01JUlJPUjsKKwlzZWd0eXBlLT5mbGFncyA9IFNFR19NSVJST1IgfCBTRUdfQVJFQVNfTUlSUk9SRUQ7CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorIyAgaWZkZWYgRE1FVkVOVEQKKwlpZiAoX2dldF9taXJyb3JfZHNvX3BhdGgoY21kKSkKKwkJc2VndHlwZS0+ZmxhZ3MgfD0gU0VHX01PTklUT1JFRDsKKyMgIGVuZGlmCS8qIERNRVZFTlREICovCisjZW5kaWYKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIiwgc2VndHlwZS0+bmFtZSk7CisKKwlyZXR1cm4gc2VndHlwZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9taXNjL2NyYy5jIGIvbGliL21pc2MvY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0ZDNmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2NyYy5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisjaW5jbHVkZSAiY3JjLmgiCisjaW5jbHVkZSAieGxhdGUuaCIKKworLyogQ2FsY3VsYXRlIGFuIGVuZGlhbi1pbmRlcGVuZGVudCBDUkMgb2Ygc3VwcGxpZWQgYnVmZmVyICovCisjaWZuZGVmIERFQlVHX0NSQzMyCit1aW50MzJfdCBjYWxjX2NyYyh1aW50MzJfdCBpbml0aWFsLCBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IHNpemUpCisjZWxzZQorc3RhdGljIHVpbnQzMl90IF9jYWxjX2NyY19uZXcodWludDMyX3QgaW5pdGlhbCwgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKQorI2VuZGlmCit7CisJLyogQ1JDLTMyIGJ5dGUgbG9va3VwIHRhYmxlIGdlbmVyYXRlZCBieSBjcmNfZ2VuLmMgKi8KKwlzdGF0aWMgY29uc3QgdWludDMyX3QgY3JjdGFiW10gPSB7CisJCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsIDB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsCisJCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJCTB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisJCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDksIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsCisJCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJCTB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisJCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsCisJCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJCTB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisJCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsIDB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsCisJCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJCTB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisJCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsCisJCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsIDB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJCTB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisJCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsCisJCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJCTB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisJCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsCisJCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJCTB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsIDB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisJCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksCisJCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsIDB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJCTB4YzViYTNiYmUsIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisJCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsCisJCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJCTB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisJCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsIDB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsCisJCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJCTB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsIDB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisJCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsCisJCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQsCisJfTsKKwljb25zdCB1aW50MzJfdCAqc3RhcnQgPSAoY29uc3QgdWludDMyX3QgKikgYnVmOworCWNvbnN0IHVpbnQzMl90ICplbmQgPSAoY29uc3QgdWludDMyX3QgKikgKGJ1ZiArIChzaXplICYgMHhmZmZmZmZmYykpOworCXVpbnQzMl90IGNyYyA9IGluaXRpYWw7CisgICAKKwkvKiBQcm9jZXNzIDQgYnl0ZXMgcGVyIGl0ZXJhdGlvbiAqLworCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQljcmMgPSBjcmMgXiB4bGF0ZTMyKCpzdGFydCsrKTsKKwkJY3JjID0gY3JjdGFiW2NyYyAmIDB4ZmZdIF4gY3JjID4+IDg7CisJCWNyYyA9IGNyY3RhYltjcmMgJiAweGZmXSBeIGNyYyA+PiA4OworCQljcmMgPSBjcmN0YWJbY3JjICYgMHhmZl0gXiBjcmMgPj4gODsKKwkJY3JjID0gY3JjdGFiW2NyYyAmIDB4ZmZdIF4gY3JjID4+IDg7CisJfQorCisJLyogUHJvY2VzcyBhbnkgYnl0ZXMgbGVmdCBvdmVyICovCisJYnVmID0gKGNvbnN0IHVpbnQ4X3QgKikgc3RhcnQ7CisJc2l6ZSA9IHNpemUgJiAweDM7CisJd2hpbGUgKHNpemUtLSkgeworCQljcmMgPSBjcmMgXiAqYnVmKys7CisJCWNyYyA9IGNyY3RhYltjcmMgJiAweGZmXSBeIGNyYyA+PiA4OworCX0KKworCXJldHVybiBjcmM7Cit9CisKKyNpZmRlZiBERUJVR19DUkMzMgorc3RhdGljIHVpbnQzMl90IF9jYWxjX2NyY19vbGQodWludDMyX3QgaW5pdGlhbCwgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBjcmN0YWJbXSA9IHsKKwkJMHgwMDAwMDAwMCwgMHgxZGI3MTA2NCwgMHgzYjZlMjBjOCwgMHgyNmQ5MzBhYywKKwkJMHg3NmRjNDE5MCwgMHg2YjZiNTFmNCwgMHg0ZGIyNjE1OCwgMHg1MDA1NzEzYywKKwkJMHhlZGI4ODMyMCwgMHhmMDBmOTM0NCwgMHhkNmQ2YTNlOCwgMHhjYjYxYjM4YywKKwkJMHg5YjY0YzJiMCwgMHg4NmQzZDJkNCwgMHhhMDBhZTI3OCwgMHhiZGJkZjIxYworCX07CisJdWludDMyX3QgaSwgY3JjID0gaW5pdGlhbDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJY3JjIF49ICpidWYrKzsKKwkJY3JjID0gKGNyYyA+PiA0KSBeIGNyY3RhYltjcmMgJiAweGZdOworCQljcmMgPSAoY3JjID4+IDQpIF4gY3JjdGFiW2NyYyAmIDB4Zl07CisJfQorCXJldHVybiBjcmM7Cit9CisKK3VpbnQzMl90IGNhbGNfY3JjKHVpbnQzMl90IGluaXRpYWwsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKwl1aW50MzJfdCBuZXdfY3JjID0gX2NhbGNfY3JjX25ldyhpbml0aWFsLCBidWYsIHNpemUpOworCXVpbnQzMl90IG9sZF9jcmMgPSBfY2FsY19jcmNfb2xkKGluaXRpYWwsIGJ1Ziwgc2l6ZSk7CisKKwlpZiAobmV3X2NyYyAhPSBvbGRfY3JjKQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk9sZCBhbmQgbmV3IGNyYzMyIGFsZ29yaXRobXMgbWlzbWF0Y2g6IDB4JTA4eCAhPSAweCUwOHgiLCBvbGRfY3JjLCBuZXdfY3JjKTsKKworCXJldHVybiBvbGRfY3JjOworfQorCisjZW5kaWYgLyogREVCVUdfQ1JDMzIgKi8KZGlmZiAtLWdpdCBhL2xpYi9taXNjL2NyYy5oIGIvbGliL21pc2MvY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhYTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2NyYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9DUkNfSAorI2RlZmluZSBfTFZNX0NSQ19ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIElOSVRJQUxfQ1JDIDB4ZjU5N2E2Y2YKKwordWludDMyX3QgY2FsY19jcmModWludDMyX3QgaW5pdGlhbCwgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbWlzYy9jcmNfZ2VuLmMgYi9saWIvbWlzYy9jcmNfZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkMDE4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2NyY19nZW4uYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBIZWxwZXIgcHJvZ3JhbSB0byBnZW5lcmF0ZSB0YWJsZSBpbmNsdWRlZCBpbiBjcmMuYy4KKyAqLworI2luY2x1ZGUgImxpYi5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdWludDMyX3QgY3JjLCBpLCBqOworCisJcHJpbnRmKCJcdC8qIENSQy0zMiBieXRlIGxvb2t1cCB0YWJsZSBnZW5lcmF0ZWQgYnkgY3JjX2dlbi5jICovXG4iKTsKKwlwcmludGYoIlx0c3RhdGljIGNvbnN0IHVpbnQzMl90IGNyY3RhYltdID0geyIpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWNyYyA9IGk7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWlmIChjcmMgJiAxKQorCQkJCWNyYyA9IDB4ZWRiODgzMjBMIF4gKGNyYyA+PiAxKTsKKwkJCWVsc2UKKwkJCQljcmMgPSBjcmMgPj4gMTsKKwkJfQorCisJCWlmIChpICUgOCkKKwkJCXByaW50ZigiICIpOworCQllbHNlCisJCQlwcmludGYoIlxuXHRcdCIpOworCisJCXByaW50ZigiMHglMDguOHgsIiwgY3JjKTsKKwl9CisKKwlwcmludGYoIlxuXHR9O1xuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9taXNjL2ludGwuaCBiL2xpYi9taXNjL2ludGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZlMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvaW50bC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0lOVExfSAorI2RlZmluZSBfTFZNX0lOVExfSAorCisjaWZkZWYgSU5UTF9QQUNLQUdFCisjICBpbmNsdWRlIDxsaWJpbnRsLmg+CisjICBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0KElOVExfUEFDS0FHRSwgKFN0cmluZykpCisjZWxzZQorIyAgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbGFzdC1wYXRoLWNvbXBvbmVudC5oIGIvbGliL21pc2MvbGFzdC1wYXRoLWNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDk1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sYXN0LXBhdGgtY29tcG9uZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGZpbGUgbmFtZSBjb21wb25lbnQgb2YgTkFNRS4KKyAqIElmIE5BTUUgZW5kcyBpbiBhIHNsYXNoLCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqbGFzdF9wYXRoX2NvbXBvbmVudChjaGFyIGNvbnN0ICpuYW1lKQoreworCWNoYXIgY29uc3QgKnNsYXNoID0gc3RycmNocihuYW1lLCAnLycpOworCisJcmV0dXJuIChzbGFzaCkgPyBzbGFzaCArIDEgOiBuYW1lOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbGliLmggYi9saWIvbWlzYy9saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZmZmVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvbGliLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGZpcnN0IGJ5IGV2ZXJ5IGxpYnJhcnkgc291cmNlIGZpbGUuCisgKi8KKyNpZm5kZWYgX0xWTV9MSUJfSAorI2RlZmluZSBfTFZNX0xJQl9ICisKKyNpbmNsdWRlICJjb25maWd1cmUuaCIKKworI2RlZmluZSBfUkVFTlRSQU5UCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKy8qCisgKiBTeW1ib2wgZXhwb3J0IGNvbnRyb2wgbWFjcm9zCisgKgorICogICBETV9FWFBPUlRfU1lNQk9MKGZ1bmMsdmVyKQorICogICBETV9FWFBPUlRfU1lNQk9MX0JBU0UoZnVuYyx2ZXIpCisgKgorICogRm9yIGZ1bmN0aW9ucyB0aGF0IGhhdmUgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIHRoZXNlIG1hY3JvcyBjb250cm9sCisgKiBzeW1ib2wgZXhwb3J0IGFuZCB2ZXJzaW9uaW5nLgorICoKKyAqIEZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgZXhpc3QgaW4gb25seSBvbmUgdmVyc2lvbiBuZXZlciBuZWVkIHRvIHVzZQorICogdGhlc2UgbWFjcm9zLgorICoKKyAqIEJhY2t3YXJkcyBjb21wYXRpYmxlIGltcGxlbWVudGF0aW9ucyBtdXN0IGluY2x1ZGUgYSB2ZXJzaW9uIHRhZyBvZgorICogdGhlIGZvcm0gIl92MV8wMl8xMDQiIGFzIGEgc3VmZml4IHRvIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB1c2UgdGhlCisgKiBtYWNybyBETV9FWFBPUlRfU1lNQk9MIHRvIGV4cG9ydCB0aGUgZnVuY3Rpb24gYW5kIGJpbmQgaXQgdG8gdGhlCisgKiBzcGVjaWZpZWQgdmVyc2lvbiBzdHJpbmcuCisgKgorICogU2luY2UgdmVyc2lvbmluZyBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGluZyB3aXRoIEdDQyB0aGUgZW50aXJlCisgKiBjb21wYXRpYmlsaXR5IHZlcnNpb24gc2hvdWxkIGJlIGVuY2xvc2VkIGluICcjaWYgZGVmaW5lZChfX0dOVUNfXyknLAorICogZm9yIGV4YW1wbGU6CisgKgorICogICBpbnQgZG1fZm9vKGludCBiYXIpCisgKiAgIHsKKyAqICAgICByZXR1cm4gYmFyOworICogICB9CisgKgorICogICAjaWYgZGVmaW5lZChfX0dOVUNfXykKKyAqICAgLy8gQmFja3dhcmQgY29tcGF0aWJsZSBkbV9mb28oKSB2ZXJzaW9uIDEuMDIuMTA0CisgKiAgIGludCBkbV9mb29fdjFfMDJfMTA0KHZvaWQpOworICogICBpbnQgZG1fZm9vX3YxXzAyXzEwNCh2b2lkKQorICogICB7CisgKiAgICAgcmV0dXJuIDA7CisgKiAgIH0KKyAqICAgRE1fRVhQT1JUX1NZTUJPTChkbV9mb28sMV8wMl8xMDQpCisgKiAgICNlbmRpZgorICoKKyAqIEEgcHJvdG90eXBlIGZvciB0aGUgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIGlzIHJlcXVpcmVkIGFzIHRoZXNlCisgKiBmdW5jdGlvbnMgbXVzdCBub3QgYmUgZGVjbGFyZWQgc3RhdGljLgorICoKKyAqIFRoZSBETV9FWFBPUlRfU1lNQk9MX0JBU0UgbWFjcm8gaXMgb25seSB1c2VkIHRvIGV4cG9ydCB0aGUgYmFzZQorICogdmVyc2lvbnMgb2YgbGlicmFyeSBzeW1ib2xzIHByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygc3ltYm9sCisgKiB2ZXJzaW9uaW5nOiBpdCBtdXN0IG5ldmVyIGJlIHVzZWQgZm9yIG5ldyBzeW1ib2xzLgorICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgRE1fRVhQT1JUX1NZTUJPTChmdW5jLCB2ZXIpIFwKKwlfX2FzbV9fKCIuc3ltdmVyICIgI2Z1bmMgIl92IiAjdmVyICIsICIgI2Z1bmMgIkBETV8iICN2ZXIgKQorI2RlZmluZSBETV9FWFBPUlRfU1lNQk9MX0JBU0UoZnVuYykgXAorCV9fYXNtX18oIi5zeW12ZXIgIiAjZnVuYyAiX2Jhc2UsICIgI2Z1bmMgIkBCYXNlIiApCisjZWxzZQorI2RlZmluZSBETV9FWFBPUlRfU1lNQk9MKGZ1bmMsIHZlcikKKyNkZWZpbmUgRE1fRVhQT1JUX1NZTUJPTF9CQVNFKGZ1bmMpCisjZW5kaWYKKworCisjaW5jbHVkZSAiaW50bC5oIgorI2luY2x1ZGUgImxpYmRldm1hcHBlci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI2lmZGVmIERNCisjICBpbmNsdWRlICJkbS1sb2dnaW5nLmgiCisjZWxzZQorIyAgaW5jbHVkZSAibHZtLWxvZ2dpbmcuaCIKKyMgIGluY2x1ZGUgImx2bS1nbG9iYWxzLmgiCisjICBpbmNsdWRlICJsdm0td3JhcHBlcnMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLWV4ZWMuYyBiL2xpYi9taXNjL2x2bS1leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwZDQyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1leGVjLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgImx2bS1leGVjLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKy8qCisgKiBDcmVhdGUgdmVyYm9zZSBzdHJpbmcgd2l0aCBsaXN0IG9mIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGNoYXIgKl92ZXJib3NlX2FyZ3MoY29uc3QgY2hhciAqY29uc3QgYXJndltdLCBjaGFyICpidWYsIHNpemVfdCBzeikKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGk7CisKKwlidWZbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoKGxlbiA9IGRtX3NucHJpbnRmKGJ1ZiArIHBvcywgc3ogLSBwb3MsCisJCQkJICAgICAgICIgJXMiLCBhcmd2W2ldKSkgPCAwKQorCQkJLyogVHJ1bmNhdGVkICovCisJCQlicmVhazsKKwkJcG9zICs9IGxlbjsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogRXhlY3V0ZSBhbmQgd2FpdCBmb3IgZXh0ZXJuYWwgY29tbWFuZAorICovCitpbnQgZXhlY19jbWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmNvbnN0IGFyZ3ZbXSwKKwkgICAgIGludCAqcnN0YXR1cywgaW50IHN5bmNfbmVlZGVkKQoreworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCWNoYXIgYnVmW1BBVEhfTUFYICogMl07CisKKwlpZiAocnN0YXR1cykKKwkJKnJzdGF0dXMgPSAtMTsKKworCWlmICghYXJndlswXSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1pc3NpbmcgY29tbWFuZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN5bmNfbmVlZGVkKQorCQkvKiBGbHVzaCBvcHMgYW5kIHJlc2V0IGRtIGNvb2tpZSAqLworCQlpZiAoIXN5bmNfbG9jYWxfZGV2X25hbWVzKGNtZCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN5bmMgbG9jYWwgZGV2aWNlIG5hbWVzIGJlZm9yZSBmb3JraW5nLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCWxvZ192ZXJib3NlKCJFeGVjdXRpbmc6JXMiLCBfdmVyYm9zZV9hcmdzKGFyZ3YsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKworCWlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgeworCQlsb2dfc3lzX2Vycm9yKCJmb3JrIiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBpZCkgeworCQkvKiBDaGlsZCAqLworCQlyZXNldF9sb2NraW5nKCk7CisJCWRldl9jbG9zZV9hbGwoKTsKKwkJLyogRklYTUUgRml4IGVmZmVjdCBvZiByZXNldF9sb2NraW5nIG9uIGNhY2hlIHRoZW4gaW5jbHVkZSB0aGlzICovCisJCS8qIGRlc3Ryb3lfdG9vbGNvbnRleHQoY21kKTsgKi8KKwkJLyogRklYTUUgVXNlIGV4ZWN2ZSBkaXJlY3RseSAqLworCQlleGVjdnAoYXJndlswXSwgKGNoYXIgKiopIGFyZ3YpOworCQlsb2dfc3lzX2Vycm9yKCJleGVjdnAiLCBhcmd2WzBdKTsKKwkJX2V4aXQoZXJybm8pOworCX0KKworCS8qIFBhcmVudCAqLworCWlmICh3YWl0NChwaWQsICZzdGF0dXMsIDAsIE5VTEwpICE9IHBpZCkgeworCQlsb2dfZXJyb3IoIndhaXQ0IGNoaWxkIHByb2Nlc3MgJXUgZmFpbGVkOiAlcyIsIHBpZCwKKwkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworCQlsb2dfZXJyb3IoIkNoaWxkICV1IGV4aXRlZCBhYm5vcm1hbGx5IiwgcGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykpIHsKKwkJaWYgKHJzdGF0dXMpIHsKKwkJCSpyc3RhdHVzID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkJCWxvZ192ZXJib3NlKCIlcyBmYWlsZWQ6ICV1IiwgYXJndlswXSwgKnJzdGF0dXMpOworCQl9IGVsc2UKKwkJCWxvZ19lcnJvcigiJXMgZmFpbGVkOiAldSIsIGFyZ3ZbMF0sIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocnN0YXR1cykKKwkJKnJzdGF0dXMgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Jlb3Blbl9mZF90b19udWxsKGludCBmZCkKK3sKKwlpbnQgbnVsbF9mZDsKKwlpbnQgciA9IDA7CisKKwlpZiAoKG51bGxfZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpKSA9PSAtMSkgeworCQlsb2dfc3lzX2Vycm9yKCJvcGVuIiwgIi9kZXYvbnVsbCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2xvc2UoZmQpKSB7CisJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgIiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHVwMihudWxsX2ZkLCBmZCkgPT0gLTEpIHsKKwkJbG9nX3N5c19lcnJvcigiZHVwMiIsICIiKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CitvdXQ6CisJaWYgKGNsb3NlKG51bGxfZmQpKSB7CisJCWxvZ19zeXNfZXJyb3IoImR1cDIiLCAiIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiByOworfQorCitGSUxFICpwaXBlX29wZW4oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmNvbnN0IGFyZ3ZbXSwKKwkJaW50IHN5bmNfbmVlZGVkLCBzdHJ1Y3QgcGlwZV9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcGlwZWZkWzJdOworCWNoYXIgYnVmW1BBVEhfTUFYICogMl07CisKKwlpZiAoc3luY19uZWVkZWQpCisJCS8qIEZsdXNoIG9wcyBhbmQgcmVzZXQgZG0gY29va2llICovCisJCWlmICghc3luY19sb2NhbF9kZXZfbmFtZXMoY21kKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3luYyBsb2NhbCBkZXZpY2UgbmFtZXMgYmVmb3JlIGZvcmtpbmcuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKHBpcGUocGlwZWZkKSkgeworCQlsb2dfc3lzX2Vycm9yKCJwaXBlIiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfdmVyYm9zZSgiUGlwaW5nOiVzIiwgX3ZlcmJvc2VfYXJncyhhcmd2LCBidWYsIHNpemVvZihidWYpKSk7CisKKwlpZiAoKHBkYXRhLT5waWQgPSBmb3JrKCkpID09IC0xKSB7CisJCWxvZ19zeXNfZXJyb3IoInBpcGUiLCAiIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwZGF0YS0+cGlkID09IDApIHsKKwkJLyogQ2hpbGQgLT4gd3JpdGVyLCBjb252ZXJ0IHBpcGVbMF0gdG8gU1RET1VUICovCisJCWlmICghX3Jlb3Blbl9mZF90b19udWxsKFNURElOX0ZJTEVOTykpCisJCQlzdGFjazsKKwkJZWxzZSBpZiAoY2xvc2UocGlwZWZkWzAgLypyZWFkKi9dKSkKKwkJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgInBpcGVbMF0iKTsKKwkJZWxzZSBpZiAoY2xvc2UoU1RET1VUX0ZJTEVOTykpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJTVERPVVQiKTsKKwkJZWxzZSBpZiAoZHVwMihwaXBlZmRbMSAvKndyaXRlKi9dLCBTVERPVVRfRklMRU5PKSA9PSAtMSkKKwkJCWxvZ19zeXNfZXJyb3IoImR1cDIiLCAiU1RET1VUIik7CisJCWVsc2UgaWYgKGNsb3NlKHBpcGVmZFsxXSkpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJwaXBlWzFdIik7CisJCWVsc2UgaWYgKGFyZ3ZbMF0pIHsKKwkJCWV4ZWN2cChhcmd2WzBdLCAoY2hhciAqKikgYXJndik7CisJCQlsb2dfc3lzX2Vycm9yKCJleGVjdnAiLCBhcmd2WzBdKTsKKwkJfQorCQlfZXhpdChlcnJubyk7CisJfQorCisJLyogUGFyZW50IC0+IHJlYWRlciAqLworCWlmIChjbG9zZShwaXBlZmRbMSAvKndyaXRlKi9dKSkgeworCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJTVERPVVQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEocGRhdGEtPmZwID0gZmRvcGVuKHBpcGVmZFswIC8qcmVhZCovXSwgICJyIikpKSB7CisJCWxvZ19zeXNfZXJyb3IoImZkb3BlbiIsICJTVERJTiIpOworCQlpZiAoY2xvc2UocGlwZWZkWzBdKSkKKwkJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgIlNURElOIik7CisJCXJldHVybiBOVUxMOyAvKiBGSVhNRToga2lsbCAqLworCX0KKworCXJldHVybiBwZGF0YS0+ZnA7Cit9CisKK2ludCBwaXBlX2Nsb3NlKHN0cnVjdCBwaXBlX2RhdGEgKnBkYXRhKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoZmNsb3NlKHBkYXRhLT5mcCkpCisJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsICJTVERJTiIpOworCisJaWYgKHdhaXRwaWQocGRhdGEtPnBpZCwgJnN0YXR1cywgMCkgIT0gcGRhdGEtPnBpZCkgeworCQlsb2dfc3lzX2Vycm9yKCJ3YWl0cGlkIiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyA9PSAwKSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLWV4ZWMuaCBiL2xpYi9taXNjL2x2bS1leGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNWE0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1leGVjLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0VYRUNfSAorI2RlZmluZSBfTFZNX0VYRUNfSAorCisjaW5jbHVkZSAibGliLmgiCisKK3N0cnVjdCBjbWRfY29udGV4dDsKKworLyoqCisgKiBFeGVjdXRlIGNvbW1hbmQgd2l0aCBwYXJhbWF0ZXJzIGFuZCByZXR1cm4gc3RhdHVzCisgKgorICogXHBhcmFtIHJzdGF0dXMKKyAqIFJldHVybnMgY29tbWFuZCdzIGV4aXQgc3RhdHVzIGNvZGUuCisgKgorICogXHBhcmFtIHN5bmNfbmVlZGVkCisgKiBCb29sIHNwZWNpZnlpbmcgd2hldGhlciBsb2NhbCBkZXZpY2VzIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZAorICogYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kLgorICogTm90ZTogWW91IGNhbm5vdCBzeW5jaHJvbml6ZSBkZXZpY2VzIHdpdGhpbiBhY3RpdmF0aW9uIGNvbnRleHQuCisgKgorICogXHJldHVybgorICogMSAoc3VjY2Vzcykgb3IgMCAoZmFpbHVyZSkuCisgKi8KK2ludCBleGVjX2NtZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqY29uc3QgYXJndltdLAorCSAgICAgaW50ICpyc3RhdHVzLCBpbnQgc3luY19uZWVkZWQpOworCisKK3N0cnVjdCBGSUxFOworc3RydWN0IHBpcGVfZGF0YSB7CisJRklMRSAqZnA7CisJcGlkX3QgcGlkOworfTsKKworLyoqCisgKiBwb3BlbigpIGxpa2UgZnVuY3Rpb24gdG8gcmVhZC1vbmx5IG91dHB1dCBmcm9tIGV4ZWN1dGVkIGNvbW1hbmQKKyAqIHdpdGhvdXQgcnVubmluZyBzaGVsbC4KKyAqCisgKiBccGFyYW0gYXJndgorICogQXJndW1lbnRzIGZvciBleGVjdnAuCisgKgorICogXHBhcmFtIHN5bmNfbmVlZGVkCisgKiBCb29sIHNwZWNpZnlpbmcgd2hldGhlciBsb2NhbCBkZXZpY2VzIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZAorICogYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kLgorICogTm90ZTogWW91IGNhbm5vdCBzeW5jaHJvbml6ZSBkZXZpY2VzIHdpdGhpbiBhY3RpdmF0aW9uIGNvbnRleHQuCisgKgorICogXHBhcmFtIHBkYXRhCisgKiBBcmd1bWVudHMgdG8gc3RvcmUgZGF0YSBuZWVkZWQgZm9yIHBjbG9zZV9leGVjKCkuCisgKgorICogXHJldHVybgorICogMSAoc3VjY2Vzcykgb3IgMCAoZmFpbHVyZSkuCisgKi8KK0ZJTEUgKnBpcGVfb3BlbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqY29uc3QgYXJndltdLAorCQlpbnQgc3luY19uZWVkZWQsIHN0cnVjdCBwaXBlX2RhdGEgKnBkYXRhKTsKKworaW50IHBpcGVfY2xvc2Uoc3RydWN0IHBpcGVfZGF0YSAqcGRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9taXNjL2x2bS1maWxlLmMgYi9saWIvbWlzYy9sdm0tZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2FhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0tZmlsZS5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImx2bS1maWxlLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworLyoKKyAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZW5hbWUsIGFuZCBvcGVucyBhIGRlc2NyaXB0b3IgdG8gdGhlCisgKiBmaWxlLiAgQm90aCB0aGUgZmlsZW5hbWUgYW5kIGRlc2NyaXB0b3IgYXJlIG5lZWRlZCBzbyB3ZSBjYW4KKyAqIHJlbmFtZSB0aGUgZmlsZSBhZnRlciBzdWNjZXNzZnVsbHkgd3JpdGluZyBpdC4gIEdyYWIKKyAqIE5GUy1zdXBwb3J0ZWQgZXhjbHVzaXZlIGZjbnRsIGRpc2NyZXRpb25hcnkgbG9jay4KKyAqLworaW50IGNyZWF0ZV90ZW1wX25hbWUoY29uc3QgY2hhciAqZGlyLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4sIGludCAqZmQsCisJCSAgICAgdW5zaWduZWQgKnNlZWQpCit7CisJY29uc3Qgc3RydWN0IGZsb2NrIGxvY2sgPSB7IC5sX3R5cGUgPSBGX1dSTENLIH07CisJaW50IGksIG51bTsKKwlwaWRfdCBwaWQ7CisJY2hhciBob3N0bmFtZVsyNTVdOworCWNoYXIgKnA7CisKKwludW0gPSByYW5kX3Ioc2VlZCk7CisJcGlkID0gZ2V0cGlkKCk7CisJaWYgKGdldGhvc3RuYW1lKGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigiZ2V0aG9zdG5hbWUiLCAiIik7CisJCXN0cmNweShob3N0bmFtZSwgIm5vaG9zdG5hbWUiKTsKKwl9IGVsc2UgeworCQkvKiBSZXBsYWNlIGFueSAnLycgd2l0aCAnPycgZm91bmQgaW4gdGhlIGhvc3RuYW1lLiAqLworCQlwID0gaG9zdG5hbWU7CisJCXdoaWxlICgocCA9IHN0cmNocihwLCAnLycpKSkKKwkJCSpwID0gJz8nOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrLCBudW0rKykgeworCisJCWlmIChkbV9zbnByaW50ZihidWZmZXIsIGxlbiwgIiVzLy5sdm1fJXNfJWRfJWQiLAorCQkJCSBkaXIsIGhvc3RuYW1lLCBwaWQsIG51bSkgPT0gLTEpIHsKKwkJCWxvZ19lcnJvcigiTm90IGVub3VnaCBzcGFjZSB0byBidWlsZCB0ZW1wb3JhcnkgZmlsZSAiCisJCQkJICAic3RyaW5nLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkqZmQgPSBvcGVuKGJ1ZmZlciwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZIHwgT19BUFBFTkQsCisJCQkgICBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEggfAorCQkJICAgU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKTsKKwkJaWYgKCpmZCA8IDApCisJCQljb250aW51ZTsKKworCQlpZiAoIWZjbnRsKCpmZCwgRl9TRVRMSywgJmxvY2spKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGNsb3NlKCpmZCkpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIGJ1ZmZlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBORlMtc2FmZSByZW5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZSB0byBhIGNvbW1vbiBuYW1lLCBkZXNpZ25lZAorICogdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIGFuZCBub3Qgb3ZlcndyaXRlIHRoZSBkZXN0aW5hdGlvbiBpZgorICogaXQgZXhpc3RzLgorICoKKyAqIFRyeSB0byBjcmVhdGUgdGhlIG5ldyBmaWxlbmFtZSBhcyBhIGhhcmQgbGluayB0byB0aGUgb3JpZ2luYWwuCisgKiBDaGVjayB0aGUgbGluayBjb3VudCBvZiB0aGUgb3JpZ2luYWwgZmlsZSB0byBzZWUgaWYgaXQgd29ya2VkLgorICogKEFzc3VtZXMgbm90aGluZyBlbHNlIHRvdWNoZXMgb3VyIHRlbXBvcmFyeSBmaWxlISkgIElmIGl0CisgKiB3b3JrZWQsIHVubGluayB0aGUgb2xkIGZpbGVuYW1lLgorICovCitpbnQgbHZtX3JlbmFtZShjb25zdCBjaGFyICpvbGQsIGNvbnN0IGNoYXIgKm5ldykKK3sKKwlzdHJ1Y3Qgc3RhdCBidWY7CisKKwlpZiAobGluayhvbGQsIG5ldykpIHsKKwkJbG9nX2Vycm9yKCIlczogcmVuYW1lIHRvICVzIGZhaWxlZDogJXMiLCBvbGQsIG5ldywKKwkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0YXQob2xkLCAmYnVmKSkgeworCQlsb2dfc3lzX2Vycm9yKCJzdGF0Iiwgb2xkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGJ1Zi5zdF9ubGluayAhPSAyKSB7CisJCWxvZ19lcnJvcigiJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQiLCBvbGQsIG5ldyk7CisJCXJldHVybiAwOworCX0KKworCWlmICh1bmxpbmsob2xkKSkgeworCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBvbGQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHBhdGhfZXhpc3RzKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgaW5mbzsKKworCWlmICghKnBhdGgpCisJCXJldHVybiAwOworCisJaWYgKHN0YXQocGF0aCwgJmluZm8pIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRpcl9leGlzdHMoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKCEqcGF0aCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RhdChwYXRoLCAmaW5mbykgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmICghU19JU0RJUihpbmZvLnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQgaXNfZW1wdHlfZGlyKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkaXJlbnQ7CisJRElSICpkOworCisJaWYgKCEoZCA9IG9wZW5kaXIoZGlyKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbmRpciIsIGRpcik7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgoZGlyZW50ID0gcmVhZGRpcihkKSkpCisJCWlmIChzdHJjbXAoZGlyZW50LT5kX25hbWUsICIuIikgJiYgc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLi4iKSkKKwkJCWJyZWFrOworCisJaWYgKGNsb3NlZGlyKGQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZWRpciIsIGRpcik7CisKKwlyZXR1cm4gZGlyZW50ID8gMCA6IDE7Cit9CisKK3ZvaWQgc3luY19kaXIoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpbnQgZmQ7CisJY2hhciAqZGlyLCAqYzsKKworCWlmICghKGRpciA9IGRtX3N0cmR1cChmaWxlKSkpIHsKKwkJbG9nX2Vycm9yKCJzeW5jX2RpciBmYWlsZWQgaW4gc3RyZHVwIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWRpcl9leGlzdHMoZGlyKSkgeworCQljID0gZGlyICsgc3RybGVuKGRpcik7CisJCXdoaWxlICgqYyAhPSAnLycgJiYgYyA+IGRpcikKKwkJCWMtLTsKKworCQlpZiAoYyA9PSBkaXIpCisJCQkqYysrID0gJy4nOworCisJCSpjID0gJ1wwJzsKKwl9CisKKwlpZiAoKGZkID0gb3BlbihkaXIsIE9fUkRPTkxZKSkgPT0gLTEpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIGRpcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChmc3luYyhmZCkgJiYgKGVycm5vICE9IEVST0ZTKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKwkJbG9nX3N5c19lcnJvcigiZnN5bmMiLCBkaXIpOworCisJaWYgKGNsb3NlKGZkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBkaXIpOworCisgICAgICBvdXQ6CisJZG1fZnJlZShkaXIpOworfQorCisvKgorICogQXR0ZW1wdCB0byBvYnRhaW4gZmNudGwgbG9jayBvbiBhIGZpbGUsIGlmIG5lY2Vzc2FyeSBjcmVhdGluZyBmaWxlIGZpcnN0CisgKiBvciB3YWl0aW5nLgorICogUmV0dXJucyBmaWxlIGRlc2NyaXB0b3Igb24gc3VjY2VzcywgZWxzZSAtMS4KKyAqIG1vZGUgaXMgRl9XUkxDSyBvciBGX1JETENLCisgKi8KK2ludCBmY250bF9sb2NrX2ZpbGUoY29uc3QgY2hhciAqZmlsZSwgc2hvcnQgbG9ja190eXBlLCBpbnQgd2Fybl9pZl9yZWFkX29ubHkpCit7CisJY29uc3Qgc3RydWN0IGZsb2NrIGxvY2sgPSB7IC5sX3R5cGUgPSBsb2NrX3R5cGUgfTsKKwlpbnQgbG9ja2ZkOworCWNoYXIgKmRpcjsKKwljaGFyICpjOworCisJaWYgKCEoZGlyID0gZG1fc3RyZHVwKGZpbGUpKSkgeworCQlsb2dfZXJyb3IoImZjbnRsX2xvY2tfZmlsZSBmYWlsZWQgaW4gc3RyZHVwLiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChjID0gc3RycmNocihkaXIsICcvJykpKQorCQkqYyA9ICdcMCc7CisKKwlpZiAoIWRtX2NyZWF0ZV9kaXIoZGlyKSkgeworCQlkbV9mcmVlKGRpcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkbV9mcmVlKGRpcik7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nICVzICglcywgJWhkKSIsIGZpbGUsCisJCQkgKGxvY2tfdHlwZSA9PSBGX1dSTENLKSA/ICJGX1dSTENLIiA6ICJGX1JETENLIiwKKwkJCSBsb2NrX3R5cGUpOworCWlmICgobG9ja2ZkID0gb3BlbihmaWxlLCBPX1JEV1IgfCBPX0NSRUFULCAwNzc3KSkgPCAwKSB7CisJCS8qIEVBQ0NFUyBoYXMgYmVlbiByZXBvcnRlZCBvbiBORlMgKi8KKwkJaWYgKHdhcm5faWZfcmVhZF9vbmx5IHx8IChlcnJubyAhPSBFUk9GUyAmJiBlcnJubyAhPSBFQUNDRVMpKQorCQkJbG9nX3N5c19lcnJvcigib3BlbiIsIGZpbGUpOworCQllbHNlCisJCQlzdGFjazsKKworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZjbnRsKGxvY2tmZCwgRl9TRVRMS1csICZsb2NrKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmY250bCIsIGZpbGUpOworCQlpZiAoY2xvc2UobG9ja2ZkKSkKKwkJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgZmlsZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gbG9ja2ZkOworfQorCit2b2lkIGZjbnRsX3VubG9ja19maWxlKGludCBsb2NrZmQpCit7CisJY29uc3Qgc3RydWN0IGZsb2NrIGxvY2sgPSB7IC5sX3R5cGUgPSBGX1VOTENLIH07CisKKwlsb2dfdmVyeV92ZXJib3NlKCJVbmxvY2tpbmcgZmQgJWQiLCBsb2NrZmQpOworCisJaWYgKGZjbnRsKGxvY2tmZCwgRl9TRVRMSywgJmxvY2spID09IC0xKQorCQlsb2dfc3lzX2Vycm9yKCJmY250bCIsICIiKTsKKworCWlmIChjbG9zZShsb2NrZmQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIiIpOworfQorCitpbnQgbHZtX2ZjbG9zZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaWYgKCFkbV9mY2xvc2UoZnApKQorCQlyZXR1cm4gMDsKKworCWlmIChlcnJubyA9PSAwKQorCQlsb2dfZXJyb3IoIiVzOiB3cml0ZSBlcnJvciIsIGZpbGVuYW1lKTsKKwllbHNlCisJCWxvZ19zeXNfZXJyb3IoIndyaXRlIGVycm9yIiwgZmlsZW5hbWUpOworCisJcmV0dXJuIEVPRjsKK30KKwordm9pZCBsdm1fc3RhdF9jdGltKHN0cnVjdCB0aW1lc3BlYyAqY3RpbSwgY29uc3Qgc3RydWN0IHN0YXQgKmJ1ZikKK3sKKyNpZmRlZiBIQVZFX1NUQVRfU1RfQ1RJTQorCSpjdGltID0gYnVmLT5zdF9jdGltOworI2Vsc2UKKwljdGltLT50dl9zZWMgPSBidWYtPnN0X2N0aW1lOworCWN0aW0tPnR2X25zZWMgPSAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWIvbWlzYy9sdm0tZmlsZS5oIGIvbGliL21pc2MvbHZtLWZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJmNzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvbHZtLWZpbGUuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fRklMRV9ICisjZGVmaW5lIF9MVk1fRklMRV9ICisKKy8qCisgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZW5hbWUsIGFuZCBvcGVucyBhIGRlc2NyaXB0b3IgdG8gdGhlIGZpbGUuCisgKi8KK2ludCBjcmVhdGVfdGVtcF9uYW1lKGNvbnN0IGNoYXIgKmRpciwgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuLCBpbnQgKmZkLAorCQkgICAgIHVuc2lnbmVkICpzZWVkKTsKKworLyoKKyAqIE5GUy1zYWZlIHJlbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIHRvIGEgY29tbW9uIG5hbWUsIGRlc2lnbmVkCisgKiB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgYW5kIG5vdCBvdmVyd3JpdGUgdGhlIGRlc3RpbmF0aW9uIGlmCisgKiBpdCBleGlzdHMuCisgKi8KK2ludCBsdm1fcmVuYW1lKGNvbnN0IGNoYXIgKm9sZCwgY29uc3QgY2hhciAqbmV3KTsKKworLyoKKyAqIFJldHVybiAxIGlmIHBhdGggZXhpc3RzIGVsc2UgcmV0dXJuIDAKKyAqLworaW50IHBhdGhfZXhpc3RzKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGRpcl9leGlzdHMoY29uc3QgY2hhciAqcGF0aCk7CisKKy8qCisgKiBSZXR1cm4gMSBpZiBkaXIgaXMgZW1wdHkKKyAqLworaW50IGlzX2VtcHR5X2Rpcihjb25zdCBjaGFyICpkaXIpOworCisvKiBTeW5jIGRpcmVjdG9yeSBjaGFuZ2VzICovCit2b2lkIHN5bmNfZGlyKGNvbnN0IGNoYXIgKmZpbGUpOworCisvKiBmY250bCBsb2NraW5nIHdyYXBwZXJzICovCitpbnQgZmNudGxfbG9ja19maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHNob3J0IGxvY2tfdHlwZSwgaW50IHdhcm5faWZfcmVhZF9vbmx5KTsKK3ZvaWQgZmNudGxfdW5sb2NrX2ZpbGUoaW50IGxvY2tmZCk7CisKKyNkZWZpbmUgaXNfc2FtZV9pbm9kZShidWYxLCBidWYyKSBcCisgICgoYnVmMSkuc3RfaW5vID09IChidWYyKS5zdF9pbm8gJiYgXAorICAgKGJ1ZjEpLnN0X2RldiA9PSAoYnVmMikuc3RfZGV2KQorCisjZGVmaW5lIGlzX3ZhbGlkX2ZkKGZkKSAoIShmY250bChmZCwgRl9HRVRGRCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpKQorCisvKgorICogQ2xvc2UgdGhlIHNwZWNpZmllZCBzdHJlYW0sIHRha2luZyBjYXJlIHRvIGRldGVjdCBhbmQgZGlhZ25vc2UgYW55IHdyaXRlCisgKiBlcnJvci4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCB1c2UgdGhlIHN1cHBsaWVkIGZpbGUgbmFtZSBpbiBhIGRpYWdub3N0aWMKKyAqIHRoYXQgaXMgcmVwb3J0ZWQgdmlhIGxvZ19lcnJvciBvciBsb2dfc3lzX2Vycm9yLCBhcyBhcHByb3ByaWF0ZS4KKyAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNsb3NlIGEgc3RyZWFtIHdoZW4geW91J3ZlIHdyaXR0ZW4gZGF0YSB0byBpdCB2aWEKKyAqIHVuY2hlY2tlZCBmcHJpbnRmLCBmcHV0YywgZXRjLiBjYWxscy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIEVPRiBvbiBmYWlsdXJlLgorICovCitpbnQgbHZtX2ZjbG9zZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKgorICogQ29udmVydCBzdGF0LT5zdF9jdGltICBzdGF0dXMgb2YgbGFzdCBjaGFuZ2UgaW4gbmFub3NlY29uZHMKKyAqIHVzZXMgIHN0X2N0aW1lIHdoZW4gbm90IGF2YWlsYWJsZS4KKyAqLwordm9pZCBsdm1fc3RhdF9jdGltKHN0cnVjdCB0aW1lc3BlYyAqdHMsIGNvbnN0IHN0cnVjdCBzdGF0ICpidWYpOworCisvKiBJbnNwaXJlZCBieSA8c3lzL3RpbWUuaD4gIHRpbWVyY21wKCkgbWFjcm8gZm9yIHRpbWV2YWwgKi8KKyNkZWZpbmUgdGltZXNwZWNjbXAodHNwLCB1c3AsIGNtcClcCisJKCgodHNwKS0+dHZfc2VjID09ICh1c3ApLT50dl9zZWMpID9cCisJCSgodHNwKS0+dHZfbnNlYyBjbXAgKHVzcCktPnR2X25zZWMpIDpcCisJCSgodHNwKS0+dHZfc2VjIGNtcCAodXNwKS0+dHZfc2VjKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLWZsb2NrLmMgYi9saWIvbWlzYy9sdm0tZmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjkwZjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvbHZtLWZsb2NrLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibHZtLWZpbGUuaCIKKyNpbmNsdWRlICJsdm0tZmxvY2suaCIKKyNpbmNsdWRlICJsdm0tc2lnbmFsLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdHJ1Y3QgbG9ja19saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWludCBsZjsKKwljaGFyICpyZXM7Cit9OworCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgX2xvY2tfbGlzdDsKK3N0YXRpYyBpbnQgX3ByaW9yaXRpc2Vfd3JpdGVfbG9ja3M7CisKKy8qIERyb3AgbG9jayBrbm93biB0byBiZSBzaGFyZWQgd2l0aCBhbm90aGVyIGZpbGUgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyB2b2lkIF9kcm9wX3NoYXJlZF9mbG9jayhjb25zdCBjaGFyICpmaWxlLCBpbnQgZmQpCit7CisJbG9nX2RlYnVnX2xvY2tpbmcoIl9kcm9wX3NoYXJlZF9mbG9jayAlcy4iLCBmaWxlKTsKKworCWlmIChjbG9zZShmZCkgPCAwKQorCQlsb2dfc3lzX2RlYnVnKCJjbG9zZSIsIGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBfdW5kb19mbG9jayhjb25zdCBjaGFyICpmaWxlLCBpbnQgZmQpCit7CisJc3RydWN0IHN0YXQgYnVmMSwgYnVmMjsKKworCWxvZ19kZWJ1Z19sb2NraW5nKCJfdW5kb19mbG9jayAlcyIsIGZpbGUpOworCWlmICghZmxvY2soZmQsIExPQ0tfTkIgfCBMT0NLX0VYKSAmJgorCSAgICAhc3RhdChmaWxlLCAmYnVmMSkgJiYKKwkgICAgIWZzdGF0KGZkLCAmYnVmMikgJiYKKwkgICAgaXNfc2FtZV9pbm9kZShidWYxLCBidWYyKSkKKwkJaWYgKHVubGluayhmaWxlKSkKKwkJCWxvZ19zeXNfZGVidWcoInVubGluayIsIGZpbGUpOworCisJaWYgKGNsb3NlKGZkKSA8IDApCisJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgX3JlbGVhc2VfbG9jayhjb25zdCBjaGFyICpmaWxlLCBpbnQgdW5sb2NrKQoreworCXN0cnVjdCBsb2NrX2xpc3QgKmxsOworCXN0cnVjdCBkbV9saXN0ICpsbGgsICpsbHQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShsbGgsIGxsdCwgJl9sb2NrX2xpc3QpIHsKKwkJbGwgPSBkbV9saXN0X2l0ZW0obGxoLCBzdHJ1Y3QgbG9ja19saXN0KTsKKworCQlpZiAoIWZpbGUgfHwgIXN0cmNtcChsbC0+cmVzLCBmaWxlKSkgeworCQkJZG1fbGlzdF9kZWwobGxoKTsKKwkJCWlmICh1bmxvY2spIHsKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCJVbmxvY2tpbmcgJXMiLCBsbC0+cmVzKTsKKwkJCQlpZiAoZmxvY2sobGwtPmxmLCBMT0NLX05CIHwgTE9DS19VTikpCisJCQkJCWxvZ19zeXNfZGVidWcoImZsb2NrIiwgbGwtPnJlcyk7CisJCQkJX3VuZG9fZmxvY2sobGwtPnJlcywgbGwtPmxmKTsKKwkJCX0gZWxzZQorCQkJCV9kcm9wX3NoYXJlZF9mbG9jayhsbC0+cmVzLCBsbC0+bGYpOworCisJCQlkbV9mcmVlKGxsLT5yZXMpOworCQkJZG1fZnJlZShsbGgpOworCisJCQlpZiAoZmlsZSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfZmxvY2tzKGludCB1bmxvY2spCit7CisJX3JlbGVhc2VfbG9jayhOVUxMLCB1bmxvY2spOworfQorCitzdGF0aWMgaW50IF9kb19mbG9jayhjb25zdCBjaGFyICpmaWxlLCBpbnQgKmZkLCBpbnQgb3BlcmF0aW9uLCB1aW50MzJfdCBub25ibG9jaykKK3sKKwlpbnQgcjsKKwlpbnQgb2xkX2Vycm5vOworCXN0cnVjdCBzdGF0IGJ1ZjEsIGJ1ZjI7CisKKwlsb2dfZGVidWdfbG9ja2luZygiX2RvX2Zsb2NrICVzICVjJWMiLCBmaWxlLAorCQkJICBvcGVyYXRpb24gPT0gTE9DS19FWCA/ICdXJyA6ICdSJywgbm9uYmxvY2sgPyAnICcgOiAnQicpOworCWRvIHsKKwkJaWYgKCgqZmQgPiAtMSkgJiYgY2xvc2UoKmZkKSkKKwkJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZmlsZSk7CisKKwkJaWYgKCgqZmQgPSBvcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX0FQUEVORCB8IE9fUkRXUiwgMDc3NykpIDwgMCkgeworCQkJbG9nX3N5c19lcnJvcigib3BlbiIsIGZpbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobm9uYmxvY2spCisJCQlvcGVyYXRpb24gfD0gTE9DS19OQjsKKwkJZWxzZQorCQkJc2lnaW50X2FsbG93KCk7CisKKwkJciA9IGZsb2NrKCpmZCwgb3BlcmF0aW9uKTsKKwkJb2xkX2Vycm5vID0gZXJybm87CisJCWlmICghbm9uYmxvY2spIHsKKwkJCXNpZ2ludF9yZXN0b3JlKCk7CisJCQlpZiAoc2lnaW50X2NhdWdodCgpKQorCQkJCWxvZ19lcnJvcigiR2l2aW5nIHVwIHdhaXRpbmcgZm9yIGxvY2suIik7CisJCX0KKworCQlpZiAocikgeworCQkJZXJybm8gPSBvbGRfZXJybm87CisJCQlsb2dfc3lzX2Vycm9yKCJmbG9jayIsIGZpbGUpOworCQkJaWYgKGNsb3NlKCpmZCkpCisJCQkJbG9nX3N5c19kZWJ1ZygiY2xvc2UiLCBmaWxlKTsKKwkJCSpmZCA9IC0xOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXN0YXQoZmlsZSwgJmJ1ZjEpICYmICFmc3RhdCgqZmQsICZidWYyKSAmJgorCQkgICAgaXNfc2FtZV9pbm9kZShidWYxLCBidWYyKSkKKwkJCXJldHVybiAxOworCX0gd2hpbGUgKCFub25ibG9jayk7CisKKwlyZXR1cm5fMDsKK30KKworI2RlZmluZSBBVVhfTE9DS19TVUZGSVggIjphdXgiCisKK3N0YXRpYyBpbnQgX2RvX3dyaXRlX3ByaW9yaXR5X2Zsb2NrKGNvbnN0IGNoYXIgKmZpbGUsIGludCAqZmQsIGludCBvcGVyYXRpb24sIHVpbnQzMl90IG5vbmJsb2NrKQoreworCWludCByLCBmZF9hdXggPSAtMTsKKwljaGFyICpmaWxlX2F1eCA9IGFsbG9jYShzdHJsZW4oZmlsZSkgKyBzaXplb2YoQVVYX0xPQ0tfU1VGRklYKSk7CisKKwlzdHJjcHkoZmlsZV9hdXgsIGZpbGUpOworCXN0cmNhdChmaWxlX2F1eCwgQVVYX0xPQ0tfU1VGRklYKTsKKworCWlmICgociA9IF9kb19mbG9jayhmaWxlX2F1eCwgJmZkX2F1eCwgTE9DS19FWCwgMCkpKSB7CisJCWlmIChvcGVyYXRpb24gPT0gTE9DS19FWCkgeworCQkJciA9IF9kb19mbG9jayhmaWxlLCBmZCwgb3BlcmF0aW9uLCBub25ibG9jayk7CisJCQlfdW5kb19mbG9jayhmaWxlX2F1eCwgZmRfYXV4KTsKKwkJfSBlbHNlIHsKKwkJCV91bmRvX2Zsb2NrKGZpbGVfYXV4LCBmZF9hdXgpOworCQkJciA9IF9kb19mbG9jayhmaWxlLCBmZCwgb3BlcmF0aW9uLCBub25ibG9jayk7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGxvY2tfZmlsZShjb25zdCBjaGFyICpmaWxlLCB1aW50MzJfdCBmbGFncykKK3sKKwlpbnQgb3BlcmF0aW9uOworCXVpbnQzMl90IG5vbmJsb2NrID0gZmxhZ3MgJiBMQ0tfTk9OQkxPQ0s7CisJaW50IHI7CisKKwlzdHJ1Y3QgbG9ja19saXN0ICpsbDsKKwljaGFyIHN0YXRlOworCisJc3dpdGNoIChmbGFncyAmIExDS19UWVBFX01BU0spIHsKKwljYXNlIExDS19SRUFEOgorCQlvcGVyYXRpb24gPSBMT0NLX1NIOworCQlzdGF0ZSA9ICdSJzsKKwkJYnJlYWs7CisJY2FzZSBMQ0tfV1JJVEU6CisJCW9wZXJhdGlvbiA9IExPQ0tfRVg7CisJCXN0YXRlID0gJ1cnOworCQlicmVhazsKKwljYXNlIExDS19VTkxPQ0s6CisJCXJldHVybiBfcmVsZWFzZV9sb2NrKGZpbGUsIDEpOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIGxvY2sgdHlwZTogJWQiLCBmbGFncyAmIExDS19UWVBFX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShsbCA9IGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IGxvY2tfbGlzdCkpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShsbC0+cmVzID0gZG1fc3RyZHVwKGZpbGUpKSkgeworCQlkbV9mcmVlKGxsKTsKKwkJcmV0dXJuXzA7CisJfQorCisJbGwtPmxmID0gLTE7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJMb2NraW5nICVzICVjJWMiLCBsbC0+cmVzLCBzdGF0ZSwKKwkJCSBub25ibG9jayA/ICcgJyA6ICdCJyk7CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoZmlsZSwgU19JRlJFRyk7CisJaWYgKF9wcmlvcml0aXNlX3dyaXRlX2xvY2tzKQorCQlyID0gX2RvX3dyaXRlX3ByaW9yaXR5X2Zsb2NrKGZpbGUsICZsbC0+bGYsIG9wZXJhdGlvbiwgbm9uYmxvY2spOworCWVsc2UgCisJCXIgPSBfZG9fZmxvY2soZmlsZSwgJmxsLT5sZiwgb3BlcmF0aW9uLCBub25ibG9jayk7CisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCisJaWYgKHIpCisJCWRtX2xpc3RfYWRkKCZfbG9ja19saXN0LCAmbGwtPmxpc3QpOworCWVsc2UgeworCQlkbV9mcmVlKGxsLT5yZXMpOworCQlkbV9mcmVlKGxsKTsKKwkJc3RhY2s7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgaW5pdF9mbG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlkbV9saXN0X2luaXQoJl9sb2NrX2xpc3QpOworCisJX3ByaW9yaXRpc2Vfd3JpdGVfbG9ja3MgPQorCSAgICBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfcHJpb3JpdGlzZV93cml0ZV9sb2Nrc19DRkcsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLWZsb2NrLmggYi9saWIvbWlzYy9sdm0tZmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM3ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvbHZtLWZsb2NrLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fRkxPQ0tfSAorI2RlZmluZSBfTFZNX0ZMT0NLX0gKKwordm9pZCBpbml0X2Zsb2NrKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK2ludCBsb2NrX2ZpbGUoY29uc3QgY2hhciAqZmlsZSwgdWludDMyX3QgZmxhZ3MpOwordm9pZCByZWxlYXNlX2Zsb2NrcyhpbnQgdW5sb2NrKTsKKworI2VuZGlmIC8qIF9MVk1fRkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLWdsb2JhbHMuYyBiL2xpYi9taXNjL2x2bS1nbG9iYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3OGYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1nbG9iYWxzLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworc3RhdGljIGludCBfdmVyYm9zZV9sZXZlbCA9IFZFUkJPU0VfQkFTRV9MRVZFTDsKK3N0YXRpYyBpbnQgX3NpbGVudCA9IDA7CitzdGF0aWMgaW50IF90ZXN0ID0gMDsKK3N0YXRpYyBpbnQgX21kX2ZpbHRlcmluZyA9IDA7CitzdGF0aWMgaW50IF9pbnRlcm5hbF9maWx0ZXJpbmcgPSAwOworc3RhdGljIGludCBfZndyYWlkX2ZpbHRlcmluZyA9IDA7CitzdGF0aWMgaW50IF9wdm1vdmUgPSAwOworc3RhdGljIGludCBfZnVsbF9zY2FuX2RvbmUgPSAwOwkvKiBSZXN0cmljdCB0byBvbmUgZnVsbCBzY2FuIGR1cmluZyBlYWNoIGNtZCAqLworc3RhdGljIGludCBfb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldiA9IERFRkFVTFRfT0JUQUlOX0RFVklDRV9MSVNUX0ZST01fVURFVjsKK3N0YXRpYyBlbnVtIGRldl9leHRfZSBfZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlID0gREVWX0VYVF9OT05FOworc3RhdGljIGludCBfdHJ1c3RfY2FjaGUgPSAwOyAvKiBEb24ndCBzY2FuIHdoZW4gaW5jb21wbGV0ZSBWR3MgZW5jb3VudGVyZWQgKi8KK3N0YXRpYyBpbnQgX2RlYnVnX2xldmVsID0gMDsKK3N0YXRpYyBpbnQgX2RlYnVnX2NsYXNzZXNfbG9nZ2VkID0gMDsKK3N0YXRpYyBpbnQgX2xvZ19jbWRfbmFtZSA9IDA7CitzdGF0aWMgaW50IF9pZ25vcmVsb2NraW5nZmFpbHVyZSA9IDA7CitzdGF0aWMgaW50IF9zZWN1cml0eV9sZXZlbCA9IFNFQ1VSSVRZX0xFVkVMOworc3RhdGljIGNoYXIgX2NtZF9uYW1lWzMwXSA9ICIiOworc3RhdGljIGludCBfbWlycm9yX2luX3N5bmMgPSAwOworc3RhdGljIGludCBfZG1ldmVudGRfbW9uaXRvciA9IERFRkFVTFRfRE1FVkVOVERfTU9OSVRPUjsKKy8qIFdoZW4gc2V0LCBkaXNhYmxlcyB1cGRhdGUgb2YgX2RtZXZlbnRkX21vbml0b3IgJiBfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzICovCitzdGF0aWMgaW50IF9kaXNhYmxlX2RtZXZlbnRkX21vbml0b3JpbmcgPSAwOworc3RhdGljIGludCBfYmFja2dyb3VuZF9wb2xsaW5nID0gREVGQVVMVF9CQUNLR1JPVU5EX1BPTExJTkc7CitzdGF0aWMgaW50IF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMgPSAwOworc3RhdGljIGludCBfaWdub3JlX2x2bV9taXJyb3JzID0gREVGQVVMVF9JR05PUkVfTFZNX01JUlJPUlM7CitzdGF0aWMgaW50IF9lcnJvcl9tZXNzYWdlX3Byb2R1Y2VkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBfaXNfc3RhdGljID0gMDsKK3N0YXRpYyBpbnQgX3VkZXZfY2hlY2tpbmcgPSAxOworc3RhdGljIGludCBfcmV0cnlfZGVhY3RpdmF0aW9uID0gREVGQVVMVF9SRVRSWV9ERUFDVElWQVRJT047CitzdGF0aWMgaW50IF9hY3RpdmF0aW9uX2NoZWNrcyA9IDA7CitzdGF0aWMgY2hhciBfc3lzZnNfZGlyX3BhdGhbUEFUSF9NQVhdID0gIiI7CitzdGF0aWMgaW50IF9kZXZfZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudCA9IERFRkFVTFRfRElTQUJMRV9BRlRFUl9FUlJPUl9DT1VOVDsKK3N0YXRpYyB1aW50NjRfdCBfcHZfbWluX3NpemUgPSAoREVGQVVMVF9QVl9NSU5fU0laRV9LQiAqIDEwMjRMID4+IFNFQ1RPUl9TSElGVCk7CitzdGF0aWMgaW50IF9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbiA9CisJREVGQVVMVF9ERVRFQ1RfSU5URVJOQUxfVkdfQ0FDSEVfQ09SUlVQVElPTjsKK3N0YXRpYyBjb25zdCBjaGFyICpfdW5rbm93bl9kZXZpY2VfbmFtZSA9IERFRkFVTFRfVU5LTk9XTl9ERVZJQ0VfTkFNRTsKKwordm9pZCBpbml0X3ZlcmJvc2UoaW50IGxldmVsKQoreworCV92ZXJib3NlX2xldmVsID0gbGV2ZWw7Cit9CisKK3ZvaWQgaW5pdF9zaWxlbnQoaW50IHNpbGVudCkKK3sKKwlfc2lsZW50ID0gc2lsZW50OworfQorCit2b2lkIGluaXRfdGVzdChpbnQgbGV2ZWwpCit7CisJaWYgKCFfdGVzdCAmJiBsZXZlbCkKKwkJbG9nX3dhcm4oIlRFU1QgTU9ERTogTWV0YWRhdGEgd2lsbCBOT1QgYmUgdXBkYXRlZCBhbmQgdm9sdW1lcyB3aWxsIG5vdCBiZSAoZGUpYWN0aXZhdGVkLiIpOworCV90ZXN0ID0gbGV2ZWw7Cit9CisKK3ZvaWQgaW5pdF9tZF9maWx0ZXJpbmcoaW50IGxldmVsKQoreworCV9tZF9maWx0ZXJpbmcgPSBsZXZlbDsKK30KKwordm9pZCBpbml0X2ludGVybmFsX2ZpbHRlcmluZyhpbnQgbGV2ZWwpCit7CisJX2ludGVybmFsX2ZpbHRlcmluZyA9IGxldmVsOworfQorCit2b2lkIGluaXRfZndyYWlkX2ZpbHRlcmluZyhpbnQgbGV2ZWwpCit7CisJX2Z3cmFpZF9maWx0ZXJpbmcgPSBsZXZlbDsKK30KKwordm9pZCBpbml0X3B2bW92ZShpbnQgbGV2ZWwpCit7CisJX3B2bW92ZSA9IGxldmVsOworfQorCit2b2lkIGluaXRfZnVsbF9zY2FuX2RvbmUoaW50IGxldmVsKQoreworCV9mdWxsX3NjYW5fZG9uZSA9IGxldmVsOworfQorCit2b2lkIGluaXRfb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldihpbnQgZGV2aWNlX2xpc3RfZnJvbV91ZGV2KQoreworCV9vYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2ID0gZGV2aWNlX2xpc3RfZnJvbV91ZGV2OworfQorCit2b2lkIGluaXRfZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlKGVudW0gZGV2X2V4dF9lIHNyYykKK3sKKwlfZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlID0gc3JjOworfQorCit2b2lkIGluaXRfdHJ1c3RfY2FjaGUoaW50IHRydXN0Y2FjaGUpCit7CisJX3RydXN0X2NhY2hlID0gdHJ1c3RjYWNoZTsKK30KKwordm9pZCBpbml0X2lnbm9yZWxvY2tpbmdmYWlsdXJlKGludCBsZXZlbCkKK3sKKwlfaWdub3JlbG9ja2luZ2ZhaWx1cmUgPSBsZXZlbDsKK30KKwordm9pZCBpbml0X3NlY3VyaXR5X2xldmVsKGludCBsZXZlbCkKK3sKKwlfc2VjdXJpdHlfbGV2ZWwgPSBsZXZlbDsKK30KKwordm9pZCBpbml0X21pcnJvcl9pbl9zeW5jKGludCBpbl9zeW5jKQoreworCV9taXJyb3JfaW5fc3luYyA9IGluX3N5bmM7Cit9CisKK3ZvaWQgaW5pdF9kbWV2ZW50ZF9tb25pdG9yKGludCByZWcpCit7CisJaWYgKCFfZGlzYWJsZV9kbWV2ZW50ZF9tb25pdG9yaW5nKQorCQlfZG1ldmVudGRfbW9uaXRvciA9IHJlZzsKK30KKwordm9pZCBpbml0X2Rpc2FibGVfZG1ldmVudGRfbW9uaXRvcmluZyhpbnQgcmVnKQoreworCV9kaXNhYmxlX2RtZXZlbnRkX21vbml0b3JpbmcgPSByZWc7Cit9CisKK3ZvaWQgaW5pdF9iYWNrZ3JvdW5kX3BvbGxpbmcoaW50IHBvbGxpbmcpCit7CisJX2JhY2tncm91bmRfcG9sbGluZyA9IHBvbGxpbmc7Cit9CisKK3ZvaWQgaW5pdF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMoaW50IGlnbm9yZSkKK3sKKwlpZiAoIV9kaXNhYmxlX2RtZXZlbnRkX21vbml0b3JpbmcpCisJCV9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMgPSBpZ25vcmU7Cit9CisKK3ZvaWQgaW5pdF9pZ25vcmVfbHZtX21pcnJvcnMoaW50IHNjYW4pCit7CisJX2lnbm9yZV9sdm1fbWlycm9ycyA9IHNjYW47Cit9CisKK3ZvaWQgaW5pdF9jbWRfbmFtZShpbnQgc3RhdHVzKQoreworCV9sb2dfY21kX25hbWUgPSBzdGF0dXM7Cit9CisKK3ZvaWQgaW5pdF9pc19zdGF0aWModW5zaWduZWQgdmFsdWUpCit7CisJX2lzX3N0YXRpYyA9IHZhbHVlOworfQorCit2b2lkIGluaXRfdWRldl9jaGVja2luZyhpbnQgY2hlY2tpbmcpCit7CisJaWYgKChfdWRldl9jaGVja2luZyA9IGNoZWNraW5nKSkKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkxWTSB1ZGV2IGNoZWNraW5nIGVuYWJsZWQiKTsKKwllbHNlCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJMVk0gdWRldiBjaGVja2luZyBkaXNhYmxlZCIpOworfQorCit2b2lkIGluaXRfcmV0cnlfZGVhY3RpdmF0aW9uKGludCByZXRyeSkKK3sKKwlfcmV0cnlfZGVhY3RpdmF0aW9uID0gcmV0cnk7Cit9CisKK3ZvaWQgaW5pdF9hY3RpdmF0aW9uX2NoZWNrcyhpbnQgY2hlY2tzKQoreworCWlmICgoX2FjdGl2YXRpb25fY2hlY2tzID0gY2hlY2tzKSkKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkxWTSBhY3RpdmF0aW9uIGNoZWNrcyBlbmFibGVkIik7CisJZWxzZQorCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiTFZNIGFjdGl2YXRpb24gY2hlY2tzIGRpc2FibGVkIik7Cit9CisKK3ZvaWQgaW5pdF9kZXZfZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudChpbnQgdmFsdWUpCit7CisJX2Rldl9kaXNhYmxlX2FmdGVyX2Vycm9yX2NvdW50ID0gdmFsdWU7Cit9CisKK3ZvaWQgaW5pdF9wdl9taW5fc2l6ZSh1aW50NjRfdCBzZWN0b3JzKQoreworCV9wdl9taW5fc2l6ZSA9IHNlY3RvcnM7Cit9CisKK3ZvaWQgaW5pdF9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbihpbnQgZGV0ZWN0KQoreworCV9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbiA9IGRldGVjdDsKK30KKwordm9pZCBzZXRfY21kX25hbWUoY29uc3QgY2hhciAqY21kKQoreworCXN0cm5jcHkoX2NtZF9uYW1lLCBjbWQsIHNpemVvZihfY21kX25hbWUpIC0gMSk7CisJX2NtZF9uYW1lW3NpemVvZihfY21kX25hbWUpIC0gMV0gPSAnXDAnOworfQorCitjb25zdCBjaGFyICpnZXRfY21kX25hbWUodm9pZCkKK3sKKwlyZXR1cm4gX2NtZF9uYW1lOworfQorCit2b2lkIHNldF9zeXNmc19kaXJfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cm5jcHkoX3N5c2ZzX2Rpcl9wYXRoLCBwYXRoLCBzaXplb2YoX3N5c2ZzX2Rpcl9wYXRoKSAtIDEpOworCV9zeXNmc19kaXJfcGF0aFtzaXplb2YoX3N5c2ZzX2Rpcl9wYXRoKSAtIDFdID0gJ1wwJzsKK30KKworY29uc3QgY2hhciAqbG9nX2NvbW1hbmRfbmFtZSh2b2lkKQoreworCWlmICghX2xvZ19jbWRfbmFtZSkKKwkJcmV0dXJuICIiOworCisJcmV0dXJuIF9jbWRfbmFtZTsKK30KKwordm9pZCBpbml0X2Vycm9yX21lc3NhZ2VfcHJvZHVjZWQoaW50IHZhbHVlKQoreworCV9lcnJvcl9tZXNzYWdlX3Byb2R1Y2VkID0gdmFsdWU7Cit9CisKK2ludCBlcnJvcl9tZXNzYWdlX3Byb2R1Y2VkKHZvaWQpCit7CisJcmV0dXJuIF9lcnJvcl9tZXNzYWdlX3Byb2R1Y2VkOworfQorCitpbnQgdGVzdF9tb2RlKHZvaWQpCit7CisJcmV0dXJuIF90ZXN0OworfQorCitpbnQgbWRfZmlsdGVyaW5nKHZvaWQpCit7CisJcmV0dXJuIF9tZF9maWx0ZXJpbmc7Cit9CisKK2ludCBpbnRlcm5hbF9maWx0ZXJpbmcodm9pZCkKK3sKKwlyZXR1cm4gX2ludGVybmFsX2ZpbHRlcmluZzsKK30KKworaW50IGZ3cmFpZF9maWx0ZXJpbmcodm9pZCkKK3sKKwlyZXR1cm4gX2Z3cmFpZF9maWx0ZXJpbmc7Cit9CisKK2ludCBwdm1vdmVfbW9kZSh2b2lkKQoreworCXJldHVybiBfcHZtb3ZlOworfQorCitpbnQgZnVsbF9zY2FuX2RvbmUodm9pZCkKK3sKKwlyZXR1cm4gX2Z1bGxfc2Nhbl9kb25lOworfQorCitpbnQgb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldih2b2lkKQoreworCXJldHVybiBfb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldjsKK30KKworZW51bSBkZXZfZXh0X2UgZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlKHZvaWQpCit7CisJcmV0dXJuIF9leHRlcm5hbF9kZXZpY2VfaW5mb19zb3VyY2U7Cit9CisKK2ludCB0cnVzdF9jYWNoZSh2b2lkKQoreworCXJldHVybiBfdHJ1c3RfY2FjaGU7Cit9CisKK2ludCBiYWNrZ3JvdW5kX3BvbGxpbmcodm9pZCkKK3sKKwlyZXR1cm4gX2JhY2tncm91bmRfcG9sbGluZzsKK30KKworaW50IGlnbm9yZWxvY2tpbmdmYWlsdXJlKHZvaWQpCit7CisJcmV0dXJuIF9pZ25vcmVsb2NraW5nZmFpbHVyZTsKK30KKworaW50IHNlY3VyaXR5X2xldmVsKHZvaWQpCit7CisJcmV0dXJuIF9zZWN1cml0eV9sZXZlbDsKK30KKworaW50IG1pcnJvcl9pbl9zeW5jKHZvaWQpCit7CisJcmV0dXJuIF9taXJyb3JfaW5fc3luYzsKK30KKworaW50IGRtZXZlbnRkX21vbml0b3JfbW9kZSh2b2lkKQoreworCXJldHVybiBfZG1ldmVudGRfbW9uaXRvcjsKK30KKworaW50IGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyh2b2lkKQoreworCXJldHVybiBfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzOworfQorCitpbnQgaWdub3JlX2x2bV9taXJyb3JzKHZvaWQpCit7CisJcmV0dXJuIF9pZ25vcmVfbHZtX21pcnJvcnM7Cit9CisKK3ZvaWQgaW5pdF9kZWJ1ZyhpbnQgbGV2ZWwpCit7CisJX2RlYnVnX2xldmVsID0gbGV2ZWw7Cit9CisKK3ZvaWQgaW5pdF9kZWJ1Z19jbGFzc2VzX2xvZ2dlZChpbnQgY2xhc3NlcykKK3sKKwlfZGVidWdfY2xhc3Nlc19sb2dnZWQgPSBjbGFzc2VzOworfQorCitpbnQgZGVidWdfY2xhc3NfaXNfbG9nZ2VkKGludCBjbGFzcykKK3sKKwkvKiBJZiBubyBjbGFzcyBnaXZlbiwgbG9nIGl0ICovCisJaWYgKCFjbGFzcykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gKF9kZWJ1Z19jbGFzc2VzX2xvZ2dlZCAmIGNsYXNzKSA/IDEgOiAwOworfQorCitpbnQgdmVyYm9zZV9sZXZlbCh2b2lkKQoreworCXJldHVybiBfdmVyYm9zZV9sZXZlbDsKK30KKworaW50IGRlYnVnX2xldmVsKHZvaWQpCit7CisJcmV0dXJuIF9kZWJ1Z19sZXZlbDsKK30KKworaW50IHNpbGVudF9tb2RlKHZvaWQpCit7CisJcmV0dXJuIF9zaWxlbnQ7Cit9CisKK3Vuc2lnbmVkIGlzX3N0YXRpYyh2b2lkKQoreworCXJldHVybiBfaXNfc3RhdGljOworfQorCitpbnQgdWRldl9jaGVja2luZyh2b2lkKQoreworCXJldHVybiBfdWRldl9jaGVja2luZzsKK30KKworaW50IHJldHJ5X2RlYWN0aXZhdGlvbih2b2lkKQoreworCXJldHVybiBfcmV0cnlfZGVhY3RpdmF0aW9uOworfQorCitpbnQgYWN0aXZhdGlvbl9jaGVja3Modm9pZCkKK3sKKwlyZXR1cm4gX2FjdGl2YXRpb25fY2hlY2tzOworfQorCitjb25zdCBjaGFyICpzeXNmc19kaXJfcGF0aCh2b2lkKQoreworCXJldHVybiBfc3lzZnNfZGlyX3BhdGg7Cit9CisKK2ludCBkZXZfZGlzYWJsZV9hZnRlcl9lcnJvcl9jb3VudCh2b2lkKQoreworCXJldHVybiBfZGV2X2Rpc2FibGVfYWZ0ZXJfZXJyb3JfY291bnQ7Cit9CisKK3VpbnQ2NF90IHB2X21pbl9zaXplKHZvaWQpCit7CisJcmV0dXJuIF9wdl9taW5fc2l6ZTsKK30KKworaW50IGRldGVjdF9pbnRlcm5hbF92Z19jYWNoZV9jb3JydXB0aW9uKHZvaWQpCit7CisJcmV0dXJuIF9kZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbjsKK30KKworY29uc3QgY2hhciAqdW5rbm93bl9kZXZpY2VfbmFtZSh2b2lkKQoreworCXJldHVybiBfdW5rbm93bl9kZXZpY2VfbmFtZTsKK30KKwordm9pZCBpbml0X3Vua25vd25fZGV2aWNlX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlfdW5rbm93bl9kZXZpY2VfbmFtZSA9IG5hbWU7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9taXNjL2x2bS1nbG9iYWxzLmggYi9saWIvbWlzYy9sdm0tZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTdkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0tZ2xvYmFscy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9HTE9CQUxTX0gKKyNkZWZpbmUgX0xWTV9HTE9CQUxTX0gKKworI2RlZmluZSBWRVJCT1NFX0JBU0VfTEVWRUwgX0xPR19XQVJOCisjZGVmaW5lIFNFQ1VSSVRZX0xFVkVMIDAKKyNkZWZpbmUgUFZfTUlOX1NJWkVfS0IgNTEyCisKK2VudW0gZGV2X2V4dF9lOworCit2b2lkIGluaXRfdmVyYm9zZShpbnQgbGV2ZWwpOwordm9pZCBpbml0X3NpbGVudChpbnQgc2lsZW50KTsKK3ZvaWQgaW5pdF90ZXN0KGludCBsZXZlbCk7Cit2b2lkIGluaXRfbWRfZmlsdGVyaW5nKGludCBsZXZlbCk7Cit2b2lkIGluaXRfaW50ZXJuYWxfZmlsdGVyaW5nKGludCBsZXZlbCk7Cit2b2lkIGluaXRfZndyYWlkX2ZpbHRlcmluZyhpbnQgbGV2ZWwpOwordm9pZCBpbml0X3B2bW92ZShpbnQgbGV2ZWwpOwordm9pZCBpbml0X2Z1bGxfc2Nhbl9kb25lKGludCBsZXZlbCk7Cit2b2lkIGluaXRfZXh0ZXJuYWxfZGV2aWNlX2luZm9fc291cmNlKGVudW0gZGV2X2V4dF9lIHNyYyk7Cit2b2lkIGluaXRfb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldihpbnQgZGV2aWNlX2xpc3RfZnJvbV91ZGV2KTsKK3ZvaWQgaW5pdF90cnVzdF9jYWNoZShpbnQgdHJ1c3RjYWNoZSk7Cit2b2lkIGluaXRfZGVidWcoaW50IGxldmVsKTsKK3ZvaWQgaW5pdF9kZWJ1Z19jbGFzc2VzX2xvZ2dlZChpbnQgY2xhc3Nlcyk7Cit2b2lkIGluaXRfY21kX25hbWUoaW50IHN0YXR1cyk7Cit2b2lkIGluaXRfaWdub3JlbG9ja2luZ2ZhaWx1cmUoaW50IGxldmVsKTsKK3ZvaWQgaW5pdF9sb2NraW5nZmFpbGVkKGludCBsZXZlbCk7Cit2b2lkIGluaXRfc2VjdXJpdHlfbGV2ZWwoaW50IGxldmVsKTsKK3ZvaWQgaW5pdF9taXJyb3JfaW5fc3luYyhpbnQgaW5fc3luYyk7Cit2b2lkIGluaXRfZG1ldmVudGRfbW9uaXRvcihpbnQgcmVnKTsKK3ZvaWQgaW5pdF9kaXNhYmxlX2RtZXZlbnRkX21vbml0b3JpbmcoaW50IGRpc2FibGUpOwordm9pZCBpbml0X2JhY2tncm91bmRfcG9sbGluZyhpbnQgcG9sbGluZyk7Cit2b2lkIGluaXRfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKGludCBpZ25vcmUpOwordm9pZCBpbml0X2lnbm9yZV9sdm1fbWlycm9ycyhpbnQgc2Nhbik7Cit2b2lkIGluaXRfZXJyb3JfbWVzc2FnZV9wcm9kdWNlZChpbnQgcHJvZHVjZWQpOwordm9pZCBpbml0X2lzX3N0YXRpYyh1bnNpZ25lZCB2YWx1ZSk7Cit2b2lkIGluaXRfdWRldl9jaGVja2luZyhpbnQgY2hlY2tpbmcpOwordm9pZCBpbml0X2Rldl9kaXNhYmxlX2FmdGVyX2Vycm9yX2NvdW50KGludCB2YWx1ZSk7Cit2b2lkIGluaXRfcHZfbWluX3NpemUodWludDY0X3Qgc2VjdG9ycyk7Cit2b2lkIGluaXRfYWN0aXZhdGlvbl9jaGVja3MoaW50IGNoZWNrcyk7Cit2b2lkIGluaXRfZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24oaW50IGRldGVjdCk7Cit2b2lkIGluaXRfcmV0cnlfZGVhY3RpdmF0aW9uKGludCByZXRyeSk7Cit2b2lkIGluaXRfdW5rbm93bl9kZXZpY2VfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKwordm9pZCBzZXRfY21kX25hbWUoY29uc3QgY2hhciAqY21kX25hbWUpOworY29uc3QgY2hhciAqZ2V0X2NtZF9uYW1lKHZvaWQpOwordm9pZCBzZXRfc3lzZnNfZGlyX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CisKK2ludCB0ZXN0X21vZGUodm9pZCk7CitpbnQgbWRfZmlsdGVyaW5nKHZvaWQpOworaW50IGludGVybmFsX2ZpbHRlcmluZyh2b2lkKTsKK2ludCBmd3JhaWRfZmlsdGVyaW5nKHZvaWQpOworaW50IHB2bW92ZV9tb2RlKHZvaWQpOworaW50IGZ1bGxfc2Nhbl9kb25lKHZvaWQpOworaW50IG9idGFpbl9kZXZpY2VfbGlzdF9mcm9tX3VkZXYodm9pZCk7CitlbnVtIGRldl9leHRfZSBleHRlcm5hbF9kZXZpY2VfaW5mb19zb3VyY2Uodm9pZCk7CitpbnQgdHJ1c3RfY2FjaGUodm9pZCk7CitpbnQgdmVyYm9zZV9sZXZlbCh2b2lkKTsKK2ludCBzaWxlbnRfbW9kZSh2b2lkKTsKK2ludCBkZWJ1Z19sZXZlbCh2b2lkKTsKK2ludCBkZWJ1Z19jbGFzc19pc19sb2dnZWQoaW50IGNsYXNzKTsKK2ludCBpZ25vcmVsb2NraW5nZmFpbHVyZSh2b2lkKTsKK2ludCBsb2NraW5nZmFpbGVkKHZvaWQpOworaW50IHNlY3VyaXR5X2xldmVsKHZvaWQpOworaW50IG1pcnJvcl9pbl9zeW5jKHZvaWQpOworaW50IGJhY2tncm91bmRfcG9sbGluZyh2b2lkKTsKK2ludCBpZ25vcmVfc3VzcGVuZGVkX2RldmljZXModm9pZCk7CitpbnQgaWdub3JlX2x2bV9taXJyb3JzKHZvaWQpOworY29uc3QgY2hhciAqbG9nX2NvbW1hbmRfbmFtZSh2b2lkKTsKK3Vuc2lnbmVkIGlzX3N0YXRpYyh2b2lkKTsKK2ludCB1ZGV2X2NoZWNraW5nKHZvaWQpOworY29uc3QgY2hhciAqc3lzZnNfZGlyX3BhdGgodm9pZCk7Cit1aW50NjRfdCBwdl9taW5fc2l6ZSh2b2lkKTsKK2ludCBhY3RpdmF0aW9uX2NoZWNrcyh2b2lkKTsKK2ludCBkZXRlY3RfaW50ZXJuYWxfdmdfY2FjaGVfY29ycnVwdGlvbih2b2lkKTsKK2ludCByZXRyeV9kZWFjdGl2YXRpb24odm9pZCk7Citjb25zdCBjaGFyICp1bmtub3duX2RldmljZV9uYW1lKHZvaWQpOworCisjZGVmaW5lIERNRVZFTlREX01PTklUT1JfSUdOT1JFIC0xCitpbnQgZG1ldmVudGRfbW9uaXRvcl9tb2RlKHZvaWQpOworCisjZGVmaW5lIE5PX0RFVl9FUlJPUl9DT1VOVF9MSU1JVCAwCitpbnQgZGV2X2Rpc2FibGVfYWZ0ZXJfZXJyb3JfY291bnQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXBlcmNlbnQuYyBiL2xpYi9taXNjL2x2bS1wZXJjZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMzhmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1wZXJjZW50LmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibHZtLXBlcmNlbnQuaCIKKwordWludDMyX3QgcGVyY2VudF9vZl9leHRlbnRzKHVpbnQzMl90IHBlcmNlbnRzLCB1aW50MzJfdCBjb3VudCwgaW50IHJvdW5kdXApCit7CisJcmV0dXJuICh1aW50MzJfdCkoKCh1aW50NjRfdClwZXJjZW50cyAqICh1aW50NjRfdCljb3VudCArCisJCQkgICAoKHJvdW5kdXApID8gOTkgOiAwKSkgLyAxMDApOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXBlcmNlbnQuaCBiL2xpYi9taXNjL2x2bS1wZXJjZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmNzE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1wZXJjZW50LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fUEVSQ0VOVF9ICisjZGVmaW5lIF9MVk1fUEVSQ0VOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgZW51bSB7CisJU0lHTl9OT05FID0gMCwKKwlTSUdOX1BMVVMgPSAxLAorCVNJR05fTUlOVVMgPSAyCit9IHNpZ25fdDsKKwordHlwZWRlZiBlbnVtIHsKKwlQRVJDRU5UX05PTkUgPSAwLAorCVBFUkNFTlRfVkcsCisJUEVSQ0VOVF9GUkVFLAorCVBFUkNFTlRfTFYsCisJUEVSQ0VOVF9QVlMsCisJUEVSQ0VOVF9PUklHSU4KK30gcGVyY2VudF90eXBlX3Q7CisKKyNkZWZpbmUgTFZNX1BFUkNFTlRfTUVSR0VfRkFJTEVEIERNX1BFUkNFTlRfRkFJTEVECisKK3VpbnQzMl90IHBlcmNlbnRfb2ZfZXh0ZW50cyh1aW50MzJfdCBwZXJjZW50cywgdWludDMyX3QgY291bnQsIGludCByb3VuZHVwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbWlzYy9sdm0tc2lnbmFsLmMgYi9saWIvbWlzYy9sdm0tc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ODQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9taXNjL2x2bS1zaWduYWwuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJsdm0tc2lnbmFsLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyBzaWdzZXRfdCBfb2xkc2V0Oworc3RhdGljIGludCBfc2lnbmFsc19ibG9ja2VkID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgX3NpZ2ludF9jYXVnaHQgPSAwOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBfaGFuZGxlcl9pbnN0YWxsZWQ7CisKKy8qIFN1cHBvcnQgMyBsZXZlbCBuZXN0aW5nLCBpbmNyZWFzZSBpZiBuZWVkZWQgbW9yZSAqLworI2RlZmluZSBNQVhfU0lHSU5UUyAzCitzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBfb2xkaGFuZGxlcltNQVhfU0lHSU5UU107CitzdGF0aWMgaW50IF9vbGRtYXNrZWRbTUFYX1NJR0lOVFNdOworCitzdGF0aWMgdm9pZCBfY2F0Y2hfc2lnaW50KGludCB1bnVzZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJX3NpZ2ludF9jYXVnaHQgPSAxOworfQorCitpbnQgc2lnaW50X2NhdWdodCh2b2lkKSB7CisJaWYgKF9zaWdpbnRfY2F1Z2h0KQorCQlsb2dfZXJyb3IoIkludGVycnVwdGVkLi4uIik7CisKKwlyZXR1cm4gX3NpZ2ludF9jYXVnaHQ7Cit9CisKK3ZvaWQgc2lnaW50X2NsZWFyKHZvaWQpCit7CisJX3NpZ2ludF9jYXVnaHQgPSAwOworfQorCisvKgorICogVGVtcG9yYXJpbHkgYWxsb3cga2V5Ym9hcmQgaW50ZXJydXB0cyB0byBiZSBpbnRlcmNlcHRlZCBhbmQgbm90ZWQ7CisgKiBzYXZlcyBpbnRlcnJ1cHQgaGFuZGxlciBzdGF0ZSBmb3Igc2lnaW50X3Jlc3RvcmUoKS4gIFVzZXJzIHNob3VsZAorICogdXNlIHRoZSBzaWdpbnRfY2F1Z2h0KCkgcHJlZGljYXRlIHRvIGNoZWNrIHdoZXRoZXIgaW50ZXJydXB0IHdhcworICogcmVxdWVzdGVkIGFuZCBhY3QgYXBwcm9wcmlhdGVseS4gIEludGVycnVwdCBmbGFncyBhcmUgbmV2ZXIKKyAqIGNsZWFyZWQgYXV0b21hdGljYWxseSBieSB0aGlzIGNvZGUsIGJ1dCB0aGUgdG9vbHMgY2xlYXIgdGhlIGZsYWcKKyAqIGJlZm9yZSBydW5uaW5nIGVhY2ggY29tbWFuZCBpbiBsdm1fcnVuX2NvbW1hbmQoKS4gIEFsbCBvdGhlciBwbGFjZXMKKyAqIHdoZXJlIHRoZSBmbGFnIG5lZWRzIHRvIGJlIGNsZWFyZWQgbmVlZCB0byBjYWxsIHNpZ2ludF9jbGVhcigpLgorICovCisKK3ZvaWQgc2lnaW50X2FsbG93KHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBoYW5kbGVyOworCXNpZ3NldF90IHNpZ3M7CisKKwlpZiAobWVtbG9ja19jb3VudF9kYWVtb24oKSkKKwkJcmV0dXJuOworCS8qCisJICogRG8gbm90IG92ZXJ3cml0ZSB0aGUgYmFja2VkLXVwIGhhbmRsZXIgZGF0YSAtCisJICoganVzdCBpbmNyZWFzZSBuZXN0aW5nIGNvdW50LgorCSAqLworCWlmICgrK19oYW5kbGVyX2luc3RhbGxlZCA+PSBNQVhfU0lHSU5UUykKKwkJcmV0dXJuOworCisJLyogR3JhYiBvbGQgc2lnYWN0aW9uIGZvciBTSUdJTlQ6IHNoYWxsIG5vdCBmYWlsLiAqLworCWlmIChzaWdhY3Rpb24oU0lHSU5ULCBOVUxMLCAmaGFuZGxlcikpCisJCWxvZ19zeXNfZGVidWcoInNpZ2FjdGlvbiIsICJTSUdJTlQiKTsKKworCWhhbmRsZXIuc2FfZmxhZ3MgJj0gflNBX1JFU1RBUlQ7IC8qIENsZWFyIHJlc3RhcnQgZmxhZyAqLworCWhhbmRsZXIuc2FfaGFuZGxlciA9IF9jYXRjaF9zaWdpbnQ7CisKKwkvKiBPdmVycmlkZSB0aGUgc2lnbmFsIGhhbmRsZXI6IHNoYWxsIG5vdCBmYWlsLiAqLworCWlmIChzaWdhY3Rpb24oU0lHSU5ULCAmaGFuZGxlciwgJl9vbGRoYW5kbGVyW19oYW5kbGVyX2luc3RhbGxlZCAgLSAxXSkpCisJCWxvZ19zeXNfZGVidWcoInNpZ2FjdGlvbiIsICJTSUdJTlQiKTsKKworCS8qIFVubWFzayBTSUdJTlQuICBSZW1lbWJlciB0byBtYXNrIGl0IGFnYWluIG9uIHJlc3RvcmUuICovCisJaWYgKHNpZ3Byb2NtYXNrKDAsIE5VTEwsICZzaWdzKSkKKwkJbG9nX3N5c19kZWJ1Zygic2lncHJvY21hc2siLCAiIik7CisKKwlpZiAoKF9vbGRtYXNrZWRbX2hhbmRsZXJfaW5zdGFsbGVkXSA9IHNpZ2lzbWVtYmVyKCZzaWdzLCBTSUdJTlQpKSkgeworCQlzaWdkZWxzZXQoJnNpZ3MsIFNJR0lOVCk7CisJCWlmIChzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3MsIE5VTEwpKQorCQkJbG9nX3N5c19kZWJ1Zygic2lncHJvY21hc2siLCAiU0lHX1NFVE1BU0siKTsKKwl9Cit9CisKK3ZvaWQgc2lnaW50X3Jlc3RvcmUodm9pZCkKK3sKKwlpZiAobWVtbG9ja19jb3VudF9kYWVtb24oKSkKKwkJcmV0dXJuOworCisJaWYgKCFfaGFuZGxlcl9pbnN0YWxsZWQgfHwKKwkgICAgLS1faGFuZGxlcl9pbnN0YWxsZWQgPj0gTUFYX1NJR0lOVFMpCisJCXJldHVybjsKKworCS8qIE5lc3RpbmcgY291bnQgd2VudCBiZWxvdyBNQVhfU0lHSU5UUy4gKi8KKwlpZiAoX29sZG1hc2tlZFtfaGFuZGxlcl9pbnN0YWxsZWRdKSB7CisJCXNpZ3NldF90IHNpZ3M7CisJCXNpZ3Byb2NtYXNrKDAsIE5VTEwsICZzaWdzKTsKKwkJc2lnYWRkc2V0KCZzaWdzLCBTSUdJTlQpOworCQlpZiAoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaWdzLCBOVUxMKSkKKwkJCWxvZ19zeXNfZGVidWcoInNpZ3Byb2NtYXNrIiwgIlNJR19TRVRNQVNLIik7CisJfQorCisJaWYgKHNpZ2FjdGlvbihTSUdJTlQsICZfb2xkaGFuZGxlcltfaGFuZGxlcl9pbnN0YWxsZWRdLCBOVUxMKSkKKwkJbG9nX3N5c19kZWJ1Zygic2lnYWN0aW9uIiwgIlNJR0lOVCByZXN0b3JlIik7Cit9CisKK3ZvaWQgYmxvY2tfc2lnbmFscyh1aW50MzJfdCBmbGFncyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzaWdzZXRfdCBzZXQ7CisKKwlpZiAobWVtbG9ja19jb3VudF9kYWVtb24oKSkKKwkJcmV0dXJuOworCisJaWYgKF9zaWduYWxzX2Jsb2NrZWQpCisJCXJldHVybjsKKworCWlmIChzaWdmaWxsc2V0KCZzZXQpKSB7CisJCWxvZ19zeXNfZXJyb3IoInNpZ2ZpbGxzZXQiLCAiX2Jsb2NrX3NpZ25hbHMiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNldCwgJl9vbGRzZXQpKSB7CisJCWxvZ19zeXNfZXJyb3IoInNpZ3Byb2NtYXNrIiwgIl9ibG9ja19zaWduYWxzIik7CisJCXJldHVybjsKKwl9CisKKwlfc2lnbmFsc19ibG9ja2VkID0gMTsKK30KKwordm9pZCB1bmJsb2NrX3NpZ25hbHModm9pZCkKK3sKKwlpZiAobWVtbG9ja19jb3VudF9kYWVtb24oKSkKKwkJcmV0dXJuOworCisJLyogRG9uJ3QgdW5ibG9jayBzaWduYWxzIHdoaWxlIGFueSBsb2NrcyBhcmUgaGVsZCAqLworCWlmICghX3NpZ25hbHNfYmxvY2tlZCkKKwkJcmV0dXJuOworCisJaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmX29sZHNldCwgTlVMTCkpIHsKKwkJbG9nX3N5c19lcnJvcigic2lncHJvY21hc2siLCAiX2Jsb2NrX3NpZ25hbHMiKTsKKwkJcmV0dXJuOworCX0KKworCV9zaWduYWxzX2Jsb2NrZWQgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXNpZ25hbC5oIGIvbGliL21pc2MvbHZtLXNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzMwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0tc2lnbmFsLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9TSUdOQUxfSAorI2RlZmluZSBfTFZNX1NJR05BTF9ICisKK3ZvaWQgcmVtb3ZlX2N0cmxfY19oYW5kbGVyKHZvaWQpOwordm9pZCBpbnN0YWxsX2N0cmxfY19oYW5kbGVyKHZvaWQpOworaW50IGluaXRfc2lnbmFscyhpbnQgc3VwcHJlc3NfbWVzc2FnZXMpOworCit2b2lkIHNpZ2ludF9hbGxvdyh2b2lkKTsKK2ludCBzaWdpbnRfY2F1Z2h0KHZvaWQpOwordm9pZCBzaWdpbnRfcmVzdG9yZSh2b2lkKTsKK3ZvaWQgc2lnaW50X2NsZWFyKHZvaWQpOworCit2b2lkIGJsb2NrX3NpZ25hbHModWludDMyX3QgZmxhZ3MpOwordm9pZCB1bmJsb2NrX3NpZ25hbHModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXN0cmluZy5jIGIvbGliL21pc2MvbHZtLXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2M5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0tc3RyaW5nLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IGVtaXRfdG9fYnVmZmVyKGNoYXIgKipidWZmZXIsIHNpemVfdCAqc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IG47CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCW4gPSB2c25wcmludGYoKmJ1ZmZlciwgKnNpemUsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwkvKgorCSAqIFJldmVydCB0byBvbGQgZ2xpYmMgYmVoYXZpb3VyICh2ZXJzaW9uIDw9IDIuMC42KSB3aGVyZSBzbnByaW50ZgorCSAqIHJldHVybmVkIC0xIGlmIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLiBGcm9tIGdsaWJjIDIuMSBpdCByZXR1cm5zIG51bWJlcgorCSAqIG9mIGNoYXJzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gaGFkIHRoZXJlIGJlZW4gcm9vbS4KKwkgKi8KKwlpZiAobiA8IDAgfHwgKCh1bnNpZ25lZCkgbiArIDEgPiAqc2l6ZSkpCisJCW4gPSAtMTsKKworCWlmIChuIDwgMCB8fCAoKHNpemVfdCluID09ICpzaXplKSkKKwkJcmV0dXJuIDA7CisKKwkqYnVmZmVyICs9IG47CisJKnNpemUgLT0gbjsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEEtWmEtejAtOS5fLSsvPSE6JiMKKyAqLworaW50IHZhbGlkYXRlX3RhZyhjb25zdCBjaGFyICpuKQoreworCXJlZ2lzdGVyIGNoYXIgYzsKKwkvKiBpbnQgbGVuID0gMDsgKi8KKworCWlmICghbiB8fCAhKm4pCisJCXJldHVybiAwOworCisJLyogRklYTUU6IElzIHVubGltaXRlZCB0YWcgc2l6ZSBzdXBwb3J0IG5lZWRlZCA/ICovCisJd2hpbGUgKCgvKiBsZW4rKywgKi8gYyA9ICpuKyspKQorCQlpZiAoIWlzYWxudW0oYykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYgYyAhPSAnLScgJiYgYyAhPSAnKycgJiYgYyAhPSAnLycKKwkJICAgICYmIGMgIT0gJz0nICYmIGMgIT0gJyEnICYmIGMgIT0gJzonICYmIGMgIT0gJyYnICYmIGMgIT0gJyMnKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIG5hbWVfZXJyb3JfdCBfdmFsaWRhdGVfbmFtZShjb25zdCBjaGFyICpuKQoreworCXJlZ2lzdGVyIGNoYXIgYzsKKwlyZWdpc3RlciBpbnQgbGVuID0gMDsKKworCWlmICghbiB8fCAhKm4pCisJCXJldHVybiBOQU1FX0lOVkFMSURfRU1QVFk7CisKKwkvKiBIeXBoZW4gdXNlZCBhcyBWRy1MViBzZXBhcmF0b3IgLSBhbWJpZ3VpdHkgaWYgTFYgc3RhcnRzIHdpdGggaXQgKi8KKwlpZiAoKm4gPT0gJy0nKQorCQlyZXR1cm4gTkFNRV9JTlZBTElEX0hZUEhFTjsKKworCWlmICgoKm4gPT0gJy4nKSAmJiAoIW5bMV0gfHwgKG5bMV0gPT0gJy4nICYmICFuWzJdKSkpIC8qICIuIiwgIi4uIiAqLworCQlyZXR1cm4gTkFNRV9JTlZBTElEX0RPVFM7CisKKwl3aGlsZSAoKGxlbisrLCBjID0gKm4rKykpCisJCWlmICghaXNhbG51bShjKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJiBjICE9ICctJyAmJiBjICE9ICcrJykKKwkJCXJldHVybiBOQU1FX0lOVkFMSURfQ0hBUlNFVDsKKworCWlmIChsZW4gPiBOQU1FX0xFTikKKwkJcmV0dXJuIE5BTUVfSU5WQUxJRF9MRU5HVEg7CisKKwlyZXR1cm4gTkFNRV9WQUxJRDsKK30KKworLyoKKyAqIERldmljZSBsYXllciBuYW1lcyBhcmUgYWxsIG9mIHRoZSBmb3JtIDx2Zz4tPGx2Pi08bGF5ZXI+LCBhbnkKKyAqIG90aGVyIGh5cGhlbnMgdGhhdCBhcHBlYXIgaW4gdGhlc2UgbmFtZXMgYXJlIHF1b3RlZCB3aXRoIHlldAorICogYW5vdGhlciBoeXBoZW4uICBUaGUgdG9wIGxheWVyIG9mIGFueSBkZXZpY2UgaGFzIG5vIGxheWVyCisgKiBuYW1lLiAgZWcsIHZnMC1sdm9sMC4KKyAqLworaW50IHZhbGlkYXRlX25hbWUoY29uc3QgY2hhciAqbikKK3sKKwlyZXR1cm4gKF92YWxpZGF0ZV9uYW1lKG4pID09IE5BTUVfVkFMSUQpID8gMSA6IDA7Cit9CisKKy8qCisgKiBDb3B5IHZhbGlkIHN5c3RlbWlkIGNoYXJhY3RlcnMgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uCisgKiBJbnZhbGlkIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQuICBDb3B5aW5nIGlzIHN0b3BwZWQKKyAqIHdoZW4gTkFNRV9MRU4gY2hhcmFjdGVycyBoYXZlIGJlZW4gY29waWVkLgorICogQSB0ZXJtaW5hdGluZyBOVUwgaXMgYXBwZW5kZWQuCisgKi8KK3ZvaWQgY29weV9zeXN0ZW1pZF9jaGFycyhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCkKK3sKKwljb25zdCBjaGFyICpzID0gc3JjOworCWNoYXIgKmQgPSBkc3Q7CisJaW50IGxlbiA9IDA7CisJY2hhciBjOworCisJaWYgKCFzIHx8ICEqcykKKwkJcmV0dXJuOworCisJLyogU2tpcCBub24tYWxwaGFudW1lcmljIHN0YXJ0aW5nIGNoYXJhY3RlcnMgKi8KKwl3aGlsZSAoKnMgJiYgIWlzYWxudW0oKnMpKQorCQlzKys7CisKKwl3aGlsZSAoKGMgPSAqcysrKSkgeworCQlpZiAoIWlzYWxudW0oYykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYgYyAhPSAnLScgJiYgYyAhPSAnKycpCisJCQljb250aW51ZTsKKworCQkqZCsrID0gYzsKKworCQlpZiAoKytsZW4gPj0gTkFNRV9MRU4pCisJCQlicmVhazsKKwl9CisKKwkqZCA9ICdcMCc7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfbHZuYW1lX2hhc19yZXNlcnZlZF9wcmVmaXgoY29uc3QgY2hhciAqbHZuYW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIF9wcmVmaXhlc1tdWzEyXSA9IHsKKwkJInB2bW92ZSIsCisJCSJzbmFwc2hvdCIKKwl9OworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfcHJlZml4ZXMpOyArK2kpCisJCWlmICghc3RybmNtcChsdm5hbWUsIF9wcmVmaXhlc1tpXSwgc3RybGVuKF9wcmVmaXhlc1tpXSkpKQorCQkJcmV0dXJuIF9wcmVmaXhlc1tpXTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2x2bmFtZV9oYXNfcmVzZXJ2ZWRfc3RyaW5nKGNvbnN0IGNoYXIgKmx2bmFtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBfc3RyaW5nc1tdWzEyXSA9IHsKKwkJIl9jZGF0YSIsCisJCSJfY21ldGEiLAorCQkiX2NvcmlnIiwKKwkJIl9taW1hZ2UiLAorCQkiX21sb2ciLAorCQkiX3Btc3BhcmUiLAorCQkiX3JpbWFnZSIsCisJCSJfcm1ldGEiLAorCQkiX3RkYXRhIiwKKwkJIl90bWV0YSIsCisJCSJfdm9yaWdpbiIKKwl9OworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfc3RyaW5ncyk7ICsraSkKKwkJaWYgKHN0cnN0cihsdm5hbWUsIF9zdHJpbmdzW2ldKSkKKwkJCXJldHVybiBfc3RyaW5nc1tpXTsKKworCXJldHVybiBOVUxMOworfQorCisKK2ludCBhcHBseV9sdm5hbWVfcmVzdHJpY3Rpb25zKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqczsKKworCWlmICgocyA9IF9sdm5hbWVfaGFzX3Jlc2VydmVkX3ByZWZpeChuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJOYW1lcyBzdGFydGluZyBcIiVzXCIgYXJlIHJlc2VydmVkLiAiCisJCQkgICJQbGVhc2UgY2hvb3NlIGEgZGlmZmVyZW50IExWIG5hbWUuIiwgcyk7CisJCXJldHVybiAwOworCX0KKworCWlmICgocyA9IF9sdm5hbWVfaGFzX3Jlc2VydmVkX3N0cmluZyhuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJOYW1lcyBpbmNsdWRpbmcgXCIlc1wiIGFyZSByZXNlcnZlZC4gIgorCQkJICAiUGxlYXNlIGNob29zZSBhIGRpZmZlcmVudCBMViBuYW1lLiIsIHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFZhbGlkYXRlcyBuYW1lIGFuZCByZXR1cm5zIGFuIGVtdW5lcmF0ZWQgcmVhc29uIGZvciBuYW1lIHZhbGlkYXRhaW9uIGZhaWx1cmUuCisgKi8KK25hbWVfZXJyb3JfdCB2YWxpZGF0ZV9uYW1lX2RldGFpbGVkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIF92YWxpZGF0ZV9uYW1lKG5hbWUpOworfQorCitpbnQgaXNfcmVzZXJ2ZWRfbHZuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChfbHZuYW1lX2hhc19yZXNlcnZlZF9wcmVmaXgobmFtZSkgfHwKKwkJX2x2bmFtZV9oYXNfcmVzZXJ2ZWRfc3RyaW5nKG5hbWUpKSA/IDEgOiAwOworfQorCitjaGFyICpidWlsZF9kbV91dWlkKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICBjb25zdCBjaGFyICpsYXllcikKK3sKKwljb25zdCBjaGFyICpsdmlkID0gbHYtPmx2aWQuczsKKwljaGFyICpkbGlkOworCisJaWYgKCFsYXllcikgeworCQkvKgorCQkgKiBNYXJrIGludGVybmFsIExWcyB3aXRoIGxheWVyIHN1ZmZpeAorCQkgKiBzbyB0b29scyBsaWtlIGJsa2lkIG1heSBpbW1lZGl0ZWxseSBzZWUgaXQncworCQkgKiBhbiBpbnRlcm5hbCBMViB0aGV5IHNob3VsZCBub3Qgc2Nhbi4KKwkJICogU2hvdWxkIGFsc28gbWFrZSBpbnRlcm5hbCBkZXRlY3Rpb24gc2ltcGxlci4KKwkJICovCisJCS8qIFN1ZmZpeGVzIHVzZWQgaGVyZSBNVVNUIG1hdGNoIGxpYi9hY3RpdmF0ZS9kZXZfbWFuYWdlci5jICovCisJCWxheWVyID0gbHZfaXNfY2FjaGVfb3JpZ2luKGx2KSA/ICJyZWFsIiA6CisJCQkobHZfaXNfY2FjaGUobHYpICYmIGx2X2lzX3BlbmRpbmdfZGVsZXRlKGx2KSkgPyAicmVhbCIgOgorCQkJbHZfaXNfY2FjaGVfcG9vbF9kYXRhKGx2KSA/ICJjZGF0YSIgOgorCQkJbHZfaXNfY2FjaGVfcG9vbF9tZXRhZGF0YShsdikgPyAiY21ldGEiIDoKKwkJCS8vIEZJWE1FOiBkbS10cmVlIG5lZWRzIGZpeGVzIGZvciBtaXJyb3JzL3JhaWRzCisJCQkvL2x2X2lzX21pcnJvcl9pbWFnZShsdikgPyAibWltYWdlIiA6CisJCQkvL2x2X2lzX21pcnJvcl9sb2cobHYpID8gIm1sb2ciIDoKKwkJCS8vbHZfaXNfcmFpZF9pbWFnZShsdikgPyAicmltYWdlIiA6CisJCQkvL2x2X2lzX3JhaWRfbWV0YWRhdGEobHYpID8gInJtZXRhIiA6CisJCQlsdl9pc190aGluX3Bvb2wobHYpID8gInBvb2wiIDoKKwkJCWx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSA/ICJ0ZGF0YSIgOgorCQkJbHZfaXNfdGhpbl9wb29sX21ldGFkYXRhKGx2KSA/ICJ0bWV0YSIgOgorCQkJTlVMTDsKKwl9CisKKwlpZiAoIShkbGlkID0gZG1fYnVpbGRfZG1fdXVpZChtZW0sIFVVSURfUFJFRklYLCBsdmlkLCBsYXllcikpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBidWlsZCBMVk0gZGxpZCBmb3IgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCXJldHVybiBkbGlkOworfQorCitjaGFyICpmaXJzdF9zdWJzdHJpbmcoY29uc3QgY2hhciAqc3RyLCAuLi4pCit7CisJY2hhciAqc3Vic3RyLCAqciA9IE5VTEw7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBzdHIpOworCisJd2hpbGUgKChzdWJzdHIgPSB2YV9hcmcoYXAsIGNoYXIgKikpKQorCQlpZiAoKHIgPSBzdHJzdHIoc3RyLCBzdWJzdHIpKSkKKwkJCWJyZWFrOworCisJdmFfZW5kKGFwKTsKKworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXN0cmluZy5oIGIvbGliL21pc2MvbHZtLXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZGY5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0tc3RyaW5nLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9TVFJJTkdfSAorI2RlZmluZSBfTFZNX1NUUklOR19ICisKKyNkZWZpbmUgTkFNRV9MRU4gMTI4CisjZGVmaW5lIFVVSURfUFJFRklYICJMVk0tIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0cnVjdCBkbV9wb29sOworc3RydWN0IHBvb2w7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWU7CisKK3R5cGVkZWYgZW51bSBuYW1lX2Vycm9yIHsKKwlOQU1FX1ZBTElEID0gMCwKKwlOQU1FX0lOVkFMSURfRU1QVFkgPSAtMSwKKwlOQU1FX0lOVkFMSURfSFlQSEVOID0gLTIsCisJTkFNRV9JTlZBTElEX0RPVFMgPSAtMywKKwlOQU1FX0lOVkFMSURfQ0hBUlNFVCA9IC00LAorCU5BTUVfSU5WQUxJRF9MRU5HVEggPSAtNQorfSBuYW1lX2Vycm9yX3Q7CisKK2ludCBlbWl0X3RvX2J1ZmZlcihjaGFyICoqYnVmZmVyLCBzaXplX3QgKnNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKKworY2hhciAqYnVpbGRfZG1fdXVpZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2aWQsCisJCSAgICBjb25zdCBjaGFyICpsYXllcik7CisKK2ludCB2YWxpZGF0ZV9uYW1lKGNvbnN0IGNoYXIgKm4pOworbmFtZV9lcnJvcl90IHZhbGlkYXRlX25hbWVfZGV0YWlsZWQoY29uc3QgY2hhciAqbik7CitpbnQgdmFsaWRhdGVfdGFnKGNvbnN0IGNoYXIgKm4pOworCit2b2lkIGNvcHlfc3lzdGVtaWRfY2hhcnMoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QpOworCitpbnQgYXBwbHlfbHZuYW1lX3Jlc3RyaWN0aW9ucyhjb25zdCBjaGFyICpuYW1lKTsKK2ludCBpc19yZXNlcnZlZF9sdm5hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qCisgKiBQcm92aWRlZCB3aXRoIGEgTlVMTC10ZXJtaW5hdGVkIGFyZ3VtZW50IGxpc3Qgb2YgY29uc3QgY2hhciAqCisgKiBzdWJzdHJpbmdzIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgc3RyaW5nIHN0ciwgdXNlCisgKiBzdHJzdHIoKSB0byBzZWFyY2ggc3RyIGZvciBlYWNoIGluIHR1cm4gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCisgKiBmaXJzdCBtYXRjaCBvciBlbHNlIE5VTEwuCisgKi8KK2NoYXIgKmZpcnN0X3N1YnN0cmluZyhjb25zdCBjaGFyICpzdHIsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2MvbHZtLXdyYXBwZXJzLmMgYi9saWIvbWlzYy9sdm0td3JhcHBlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmIxNGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvbHZtLXdyYXBwZXJzLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCisjaW5jbHVkZSA8bGlidWRldi5oPgorCitzdHJ1Y3QgdWRldiAqX3VkZXY7CisKK2ludCB1ZGV2X2luaXRfbGlicmFyeV9jb250ZXh0KHZvaWQpCit7CisJaWYgKF91ZGV2KQorCQl1ZGV2X3VucmVmKF91ZGV2KTsKKworCWlmICghKF91ZGV2ID0gdWRldl9uZXcoKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHVkZXYgbGlicmFyeSBjb250ZXh0LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCB1ZGV2X2Zpbl9saWJyYXJ5X2NvbnRleHQodm9pZCkKK3sKKwl1ZGV2X3VucmVmKF91ZGV2KTsKKwlfdWRldiA9IE5VTEw7Cit9CisKK2ludCB1ZGV2X2lzX3J1bm5pbmcodm9pZCkKK3sKKwlzdHJ1Y3QgdWRldl9xdWV1ZSAqdWRldl9xdWV1ZTsKKwlpbnQgcjsKKworCWlmICghX3VkZXYpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgbGlicmFyeSBjb250ZXh0IG5vdCBzZXQuIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICghKHVkZXZfcXVldWUgPSB1ZGV2X3F1ZXVlX25ldyhfdWRldikpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJDb3VsZCBub3QgZ2V0IHVkZXYgc3RhdGUuIik7CisJCWdvdG8gYmFkOworCX0KKworCXIgPSB1ZGV2X3F1ZXVlX2dldF91ZGV2X2lzX2FjdGl2ZSh1ZGV2X3F1ZXVlKTsKKwl1ZGV2X3F1ZXVlX3VucmVmKHVkZXZfcXVldWUpOworCisJcmV0dXJuIHI7CisKK2JhZDoKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiQXNzdW1pbmcgdWRldiBpcyBub3QgcnVubmluZy4iKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqdWRldl9nZXRfbGlicmFyeV9jb250ZXh0KHZvaWQpCit7CisJcmV0dXJuIF91ZGV2OworfQorCisjZWxzZQkvKiBVREVWX1NZTkNfU1VQUE9SVCAqLworCitpbnQgdWRldl9pbml0X2xpYnJhcnlfY29udGV4dCh2b2lkKQoreworCXJldHVybiAxOworfQorCit2b2lkICp1ZGV2X2dldF9saWJyYXJ5X2NvbnRleHQodm9pZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB1ZGV2X2Zpbl9saWJyYXJ5X2NvbnRleHQodm9pZCkKK3sKK30KKworaW50IHVkZXZfaXNfcnVubmluZyh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworaW50IGx2bV9nZXRwYWdlc2l6ZSh2b2lkKQoreworCXJldHVybiBnZXRwYWdlc2l6ZSgpOworfQorCitpbnQgcmVhZF91cmFuZG9tKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgZmQ7CisKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIHN0YXQgaGVyZSwgYW5kIGhhbmRsZSBvdGhlciBjYXNlcyAqLworCS8qIEZJWE1FOiB1c2UgY29tbW9uIF9pbygpIHJvdXRpbmUncyBvcGVuL3JlYWQvY2xvc2UgKi8KKwlpZiAoKGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsICJyZWFkX3VyYW5kb206IC9kZXYvdXJhbmRvbSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVhZChmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KSBsZW4pIHsKKwkJbG9nX3N5c19lcnJvcigicmVhZCIsICJyZWFkX3VyYW5kb206IC9kZXYvdXJhbmRvbSIpOworCQlpZiAoY2xvc2UoZmQpKQorCQkJc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCWlmIChjbG9zZShmZCkpCisJCXN0YWNrOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm4gcmFuZG9tIGludGVnZXIgaW4gWzAsbWF4KSBpbnRlcnZhbAorICoKKyAqIFRoZSBsb29wIHJlamVjdHMgbnVtYmVycyB0aGF0IGNvbWUgZnJvbSBhbiAiaW5jb21wbGV0ZSIgc2xpY2Ugb2YgdGhlCisgKiBSQU5EX01BWCBzcGFjZS4gIENvbnNpZGVyaW5nIHRoZSBudW1iZXIgc3BhY2UgWzAsIFJBTkRfTUFYXSBpcyBkaXZpZGVkCisgKiBpbnRvIHNvbWUgIm1heCItc2l6ZWQgc2xpY2VzIGFuZCBhdCBtb3N0IGEgc2luZ2xlIHNtYWxsZXIgc2xpY2UsCisgKiBiZXR3ZWVuIFtuKm1heCwgUkFORF9NQVhdIGZvciBzdWl0YWJsZSBuLCBudW1iZXJzIGZyb20gdGhpcyBsYXN0IHNsaWNlCisgKiBhcmUgZGlzY2FyZGVkIGJlY2F1c2UgdGhleSBjb3VsZCBkaXN0b3J0IHRoZSBkaXN0cmlidXRpb24gaW4gZmF2b3VyIG9mCisgKiBzbWFsbGVyIG51bWJlcnMuCisgKi8KK3Vuc2lnbmVkIGx2bV9ldmVuX3JhbmQodW5zaWduZWQgKnNlZWQsIHVuc2lnbmVkIG1heCkKK3sKKwl1bnNpZ25lZCByLCByZXQ7CisKKwlkbyB7CisJCXIgPSAodW5zaWduZWQpIHJhbmRfcihzZWVkKTsKKwkJcmV0ID0gciAlIG1heDsKKwl9IHdoaWxlIChyIC0gcmV0ID4gUkFORF9NQVggLSBtYXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGNsdm1kX2lzX3J1bm5pbmcodm9pZCkKK3sKKyNpZmRlZiBDTFZNRF9QSURGSUxFCisJcmV0dXJuIGRtX2RhZW1vbl9pc19ydW5uaW5nKENMVk1EX1BJREZJTEUpOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgY21pcnJvcmRfaXNfcnVubmluZyh2b2lkKQoreworI2lmZGVmIENNSVJST1JEX1BJREZJTEUKKwlyZXR1cm4gZG1fZGFlbW9uX2lzX3J1bm5pbmcoQ01JUlJPUkRfUElERklMRSk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWIvbWlzYy9sdm0td3JhcHBlcnMuaCBiL2xpYi9taXNjL2x2bS13cmFwcGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDVhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9sdm0td3JhcHBlcnMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fV1JBUFBFUlNfSAorI2RlZmluZSBfTFZNX1dSQVBQRVJTX0gKKworaW50IHVkZXZfaW5pdF9saWJyYXJ5X2NvbnRleHQodm9pZCk7Cit2b2lkICp1ZGV2X2dldF9saWJyYXJ5X2NvbnRleHQodm9pZCk7Cit2b2lkIHVkZXZfZmluX2xpYnJhcnlfY29udGV4dCh2b2lkKTsKK2ludCB1ZGV2X2lzX3J1bm5pbmcodm9pZCk7CisKK2ludCBsdm1fZ2V0cGFnZXNpemUodm9pZCk7CisKKy8qCisgKiBSZWFkICdsZW4nIGJ5dGVzIG9mIGVudHJvcHkgZnJvbSAvZGV2L3VyYW5kb20gYW5kIHN0b3JlIGluICdidWYnLgorICovCitpbnQgcmVhZF91cmFuZG9tKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qCisgKiBSZXR1cm4gcmFuZG9tIGludGVnZXIgaW4gWzAsbWF4KSBpbnRlcnZhbAorICovCit1bnNpZ25lZCBsdm1fZXZlbl9yYW5kKHVuc2lnbmVkICpzZWVkLCB1bnNpZ25lZCBtYXgpOworCitpbnQgY2x2bWRfaXNfcnVubmluZyh2b2lkKTsKK2ludCBjbWlycm9yZF9pc19ydW5uaW5nKHZvaWQpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21pc2Mvc2hhcmVkbGliLmMgYi9saWIvbWlzYy9zaGFyZWRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjFiYTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2Mvc2hhcmVkbGliLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzaGFyZWRsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCit2b2lkIGdldF9zaGFyZWRfbGlicmFyeV9wYXRoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsaWJuYW1lLAorCQkJICAgICBjaGFyICpwYXRoLCBzaXplX3QgcGF0aF9sZW4pCit7CisJc3RydWN0IHN0YXQgaW5mbzsKKworCWlmICghcGF0aF9sZW4pCisJCXJldHVybjsKKworCS8qIElmIGxpYm5hbWUgZG9lc24ndCBiZWdpbiB3aXRoICcvJyB0aGVuIHVzZSBsaWJfZGlyL2xpYm5hbWUsCisJICogaWYgcHJlc2VudCAqLworCWlmIChsaWJuYW1lWzBdID09ICcvJyB8fAorCSAgICAoIWNtZC0+bGliX2RpciAmJgorCSAgICAgIShjbWQtPmxpYl9kaXIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9saWJyYXJ5X2Rpcl9DRkcsIE5VTEwpKSkgfHwKKwkgICAgKGRtX3NucHJpbnRmKHBhdGgsIHBhdGhfbGVuLCAiJXMvJXMiLCBjbWQtPmxpYl9kaXIsCisJCQkgbGlibmFtZSkgPT0gLTEpIHx8IHN0YXQocGF0aCwgJmluZm8pID09IC0xKSB7CisJCXN0cm5jcHkocGF0aCwgbGlibmFtZSwgcGF0aF9sZW4gLSAxKTsKKwkJcGF0aFtwYXRoX2xlbiAtIDFdID0gJ1wwJzsKKwl9Cit9CisKK3ZvaWQgKmxvYWRfc2hhcmVkX2xpYnJhcnkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmxpYm5hbWUsCisJCQkgIGNvbnN0IGNoYXIgKmRlc2MsIGludCBzaWxlbnQpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwl2b2lkICpsaWJyYXJ5OworCisJaWYgKGlzX3N0YXRpYygpKSB7CisJCWxvZ19lcnJvcigiTm90IGxvYWRpbmcgc2hhcmVkICVzIGxpYnJhcnkgJXMgaW4gc3RhdGljIG1vZGUuIiwKKwkJCSAgZGVzYywgbGlibmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWdldF9zaGFyZWRfbGlicmFyeV9wYXRoKGNtZCwgbGlibmFtZSwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIk9wZW5pbmcgc2hhcmVkICVzIGxpYnJhcnkgJXMiLCBkZXNjLCBwYXRoKTsKKworCWlmICghKGxpYnJhcnkgPSBkbG9wZW4ocGF0aCwgUlRMRF9MQVpZIHwgUlRMRF9HTE9CQUwpKSkgeworCQlpZiAoc2lsZW50ICYmIGlnbm9yZWxvY2tpbmdmYWlsdXJlKCkpCisJCQlsb2dfdmVyYm9zZSgiVW5hYmxlIHRvIG9wZW4gZXh0ZXJuYWwgJXMgbGlicmFyeSAlczogJXMiLAorCQkJCSAgICBkZXNjLCBwYXRoLCBkbGVycm9yKCkpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBvcGVuIGV4dGVybmFsICVzIGxpYnJhcnkgJXM6ICVzIiwKKwkJCQkgIGRlc2MsIHBhdGgsIGRsZXJyb3IoKSk7CisJfQorCisJcmV0dXJuIGxpYnJhcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvbWlzYy9zaGFyZWRsaWIuaCBiL2xpYi9taXNjL3NoYXJlZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTQ4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbWlzYy9zaGFyZWRsaWIuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fU0hBUkVETElCX0gKKyNkZWZpbmUgX0xWTV9TSEFSRURMSUJfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKwordm9pZCBnZXRfc2hhcmVkX2xpYnJhcnlfcGF0aChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbGlibmFtZSwKKwkJCSAgICAgY2hhciAqcGF0aCwgc2l6ZV90IHBhdGhfbGVuKTsKK3ZvaWQgKmxvYWRfc2hhcmVkX2xpYnJhcnkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmxpYm5hbWUsCisJCQkgIGNvbnN0IGNoYXIgKndoYXQsIGludCBzaWxlbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9taXNjL3V0aWwuaCBiL2xpYi9taXNjL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBiOTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL21pc2MvdXRpbC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1VUSUxfSAorI2RlZmluZSBfTFZNX1VUSUxfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2RlZmluZSBtaW4oYSwgYikgKHsgdHlwZW9mKGEpIF9hID0gKGEpOyBcCisJCSAgICAgdHlwZW9mKGIpIF9iID0gKGIpOyBcCisJCSAgICAgKHZvaWQpICgmX2EgPT0gJl9iKTsgXAorCQkgICAgIF9hIDwgX2IgPyBfYSA6IF9iOyB9KQorCisjZGVmaW5lIG1heChhLCBiKSAoeyB0eXBlb2YoYSkgX2EgPSAoYSk7IFwKKwkJICAgICB0eXBlb2YoYikgX2IgPSAoYik7IFwKKwkJICAgICAodm9pZCkgKCZfYSA9PSAmX2IpOyBcCisJCSAgICAgX2EgPiBfYiA/IF9hIDogX2I7IH0pCisKKyNkZWZpbmUgaXNfcG93ZXJfb2ZfMihuKSAoKG4pICYmICEoKG4pICYgKChuKSAtIDEpKSkKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2KQorI2RlZmluZSB1bmluaXRpYWxpemVkX3Zhcih4KSB4CisjZWxzZQorI2RlZmluZSB1bmluaXRpYWxpemVkX3Zhcih4KSB4ID0geAorI2VuZGlmCisKKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04obWFqb3IsIG1pbm9yLCByZWxlYXNlKSAoKChtYWpvcikgPDwgMTYpICsgKChtaW5vcikgPDwgOCkgKyAocmVsZWFzZSkpCisKKy8qIERlZmluZSBzb21lIHBvcnRhYmxlIHByaW50aW5nIHR5cGVzICovCisjZGVmaW5lIFBSSXNpemVfdCAienUiCisjZGVmaW5lIFBSSXNzaXplX3QgInpkIgorI2RlZmluZSBQUklwdHJkaWZmX3QgInRkIgorI2RlZmluZSBQUklwaWRfdCBQUklkMzIKKworLyogRm9yIGNvbnZlbmllbmNlICovCisjZGVmaW5lIEZNVHNpemVfdCAiJSIgUFJJc2l6ZV90CisjZGVmaW5lIEZNVHNzaXplX3QgIiUiIFBSSXNzaXplX3QKKyNkZWZpbmUgRk1UcHRyZGlmZl90ICIlIiBQUklwdHJkaWZmX3QKKyNkZWZpbmUgRk1UcGlkX3QgIiUiIFBSSXBpZF90CisKKyNkZWZpbmUgRk1UZDggICIlIiBQUklkOAorI2RlZmluZSBGTVRkMTYgIiUiIFBSSWQxNgorI2RlZmluZSBGTVRkMzIgIiUiIFBSSWQzMgorI2RlZmluZSBGTVRkNjQgIiUiIFBSSWQ2NAorCisjZGVmaW5lIEZNVGk4ICAiJSIgUFJJaTgKKyNkZWZpbmUgRk1UaTE2ICIlIiBQUklpMTYKKyNkZWZpbmUgRk1UaTMyICIlIiBQUklpMzIKKyNkZWZpbmUgRk1UaTY0ICIlIiBQUklpNjQKKworI2RlZmluZSBGTVRvOCAgIiUiIFBSSW84CisjZGVmaW5lIEZNVG8xNiAiJSIgUFJJbzE2CisjZGVmaW5lIEZNVG8zMiAiJSIgUFJJbzMyCisjZGVmaW5lIEZNVG82NCAiJSIgUFJJbzY0CisKKyNkZWZpbmUgRk1UdTggICIlIiBQUkl1OAorI2RlZmluZSBGTVR1MTYgIiUiIFBSSXUxNgorI2RlZmluZSBGTVR1MzIgIiUiIFBSSXUzMgorI2RlZmluZSBGTVR1NjQgIiUiIFBSSXU2NAorCisjZGVmaW5lIEZNVHg4ICAiJSIgUFJJeDgKKyNkZWZpbmUgRk1UeDE2ICIlIiBQUkl4MTYKKyNkZWZpbmUgRk1UeDMyICIlIiBQUkl4MzIKKyNkZWZpbmUgRk1UeDY0ICIlIiBQUkl4NjQKKworI2RlZmluZSBGTVRWR0lEICIlLiIgRE1fVE9fU1RSSU5HKElEX0xFTikgInMiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21tL21lbWxvY2suYyBiL2xpYi9tbS9tZW1sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MDE0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tbS9tZW1sb2NrLmMKQEAgLTAsMCArMSw2NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaWZkZWYgSEFWRV9WQUxHUklORAorI2luY2x1ZGUgPHZhbGdyaW5kLmg+CisjZW5kaWYKKworI2lmbmRlZiBERVZNQVBQRVJfU1VQUE9SVAorCit2b2lkIG1lbWxvY2tfaW5jX2RhZW1vbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgbWVtbG9ja19kZWNfZGFlbW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybjsKK30KKwordm9pZCBjcml0aWNhbF9zZWN0aW9uX2luYyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcmVhc29uKQoreworCXJldHVybjsKK30KKwordm9pZCBjcml0aWNhbF9zZWN0aW9uX2RlYyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcmVhc29uKQoreworCXJldHVybjsKK30KKworaW50IGNyaXRpY2FsX3NlY3Rpb24odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3ZvaWQgbWVtbG9ja19pbml0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybjsKK30KKwordm9pZCBtZW1sb2NrX3VubG9jayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgbWVtbG9ja19yZXNldCh2b2lkKQoreworCXJldHVybjsKK30KKworaW50IG1lbWxvY2tfY291bnRfZGFlbW9uKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCQkJCS8qIERFVk1BUFBFUl9TVVBQT1JUICovCisKK3N0YXRpYyBzaXplX3QgX3NpemVfc3RhY2s7CitzdGF0aWMgc2l6ZV90IF9zaXplX21hbGxvY190bXA7CitzdGF0aWMgc2l6ZV90IF9zaXplX21hbGxvYyA9IDIwMDAwMDA7CisKK3N0YXRpYyB2b2lkICpfbWFsbG9jX21lbSA9IE5VTEw7CitzdGF0aWMgaW50IF9tZW1fbG9ja2VkID0gMDsKK3N0YXRpYyBpbnQgX2NyaXRpY2FsX3NlY3Rpb24gPSAwOworc3RhdGljIGludCBfbWVtbG9ja19jb3VudF9kYWVtb24gPSAwOworc3RhdGljIGludCBfcHJpb3JpdHk7CitzdGF0aWMgaW50IF9kZWZhdWx0X3ByaW9yaXR5OworCisvKiBsaXN0IG9mIG1hcHMsIHRoYXQgYXJlIHVuY29uZGl0aW9uYWx5IGlnbm9yZWQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2lnbm9yZV9tYXBzW10gPSB7CisJIlt2ZHNvXSIsCisJIlt2c3lzY2FsbF0iLAorCSJbdmVjdG9yc10iLAorfTsKKworLyogZGVmYXVsdCBibGFja2xpc3QgZm9yIG1hcHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2JsYWNrbGlzdF9tYXBzW10gPSB7CisJImxvY2FsZS9sb2NhbGUtYXJjaGl2ZSIsCisJIi9MQ19NRVNTQUdFUy8iLAorCSJnY29udi9nY29udi1tb2R1bGVzLmNhY2hlIiwKKwkiL2xkLTIuIiwJCS8qIG5vdCB1c2luZyBkbG9wZW4sZGxzeW0gZHVyaW5nIG1sb2NrICovCisJIi9saWJhdHRyLnNvLiIsCQkvKiBub3QgdXNpbmcgZHVyaW5nIG1sb2NrICh1ZGV2KSAqLworCSIvbGliYmxraWQuc28uIiwJLyogbm90IHVzaW5nIGx6bWEgZHVyaW5nIG1sb2NrIChzZWxpbnV4KSAqLworCSIvbGliYnoyLnNvLiIsCQkvKiBub3QgdXNpbmcgZHVyaW5nIG1sb2NrICh1ZGV2KSAqLworCSIvbGliY2FwLnNvLiIsCQkvKiBub3QgdXNpbmcgZHVyaW5nIG1sb2NrICh1ZGV2KSAqLworCSIvbGliZHctIiwJCS8qIG5vdCB1c2luZyBkdXJpbmcgbWxvY2sgKHVkZXYpICovCisJIi9saWJlbGYtIiwJCS8qIG5vdCB1c2luZyBkdXJpbmcgbWxvY2sgKHVkZXYpICovCisJIi9saWJsem1hLnNvLiIsCS8qIG5vdCB1c2luZyBsem1hIGR1cmluZyBtbG9jayAoc2VsaW51eCkgKi8KKwkiL2xpYm5jdXJzZXMuc28uIiwJLyogbm90IHVzaW5nIG5jdXJzZXMgZHVyaW5nIG1sb2NrICovCisJIi9saWJwY3JlLnNvLiIsCS8qIG5vdCB1c2luZyBwY3JlIGR1cmluZyBtbG9jayAoc2VsaW51eCkgKi8KKwkiL2xpYnJlYWRsaW5lLnNvLiIsCS8qIG5vdCB1c2luZyByZWFkbGluZSBkdXJpbmcgbWxvY2sgKi8KKwkiL2xpYnJlc29sdi0iLAkvKiBub3QgdXNpbmcgZHVyaW5nIG1sb2NrICh1ZGV2KSAqLworCSIvbGlic2VsaW51eC5zby4iLAkvKiBub3QgdXNpbmcgc2VsaW51eCBkdXJpbmcgbWxvY2sgKi8KKwkiL2xpYnNlcG9sLnNvLiIsCS8qIG5vdCB1c2luZyBzZXBvbCBkdXJpbmcgbWxvY2sgKi8KKwkiL2xpYnRpbmZvLnNvLiIsCS8qIG5vdCB1c2luZyB0aW5mbyBkdXJpbmcgbWxvY2sgKi8KKwkiL2xpYnVkZXYuc28uIiwJCS8qIG5vdCB1c2luZyB1ZGV2IGR1cmluZyBtbG9jayAqLworCSIvbGlidXVpZC5zby4iLAkJLyogbm90IHVzaW5nIHV1aWQgZHVyaW5nIG1sb2NrIChibGtpZCkgKi8KKwkiL2xpYmRsLSIsCQkvKiBub3QgdXNpbmcgZGxvcGVuLGRsc3ltIGR1cmluZyBtbG9jayAqLworCSIvbGliei5zby4iLAkJLyogbm90IHVzaW5nIGR1cmluZyBtbG9jayAodWRldikgKi8KKwkiL2V0Yy9zZWxpbnV4IiwJCS8qIG5vdCB1c2luZyBzZWxpbnV4IGR1cmluZyBtbG9jayAqLworCS8qICIvbGliZGV2bWFwcGVyLWV2ZW50LnNvIiAqLworfTsKKwordHlwZWRlZiBlbnVtIHsgTFZNX01MT0NLLCBMVk1fTVVOTE9DSyB9IGx2bWxvY2tfdDsKKworc3RhdGljIHVuc2lnbmVkIF91c2VfbWxvY2thbGw7CitzdGF0aWMgaW50IF9tYXBzX2ZkOworc3RhdGljIHNpemVfdCBfbWFwc19sZW4gPSA4MTkyOyAvKiBJbml0aWFsIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nIC9wcm9jL3NlbGYvbWFwcyAqLworc3RhdGljIGNoYXIgKl9tYXBzX2J1ZmZlcjsKK3N0YXRpYyBjaGFyIF9wcm9jc2VsZm1hcHNbUEFUSF9NQVhdID0gIiI7CisjZGVmaW5lIFNFTEZfTUFQUyAiL3NlbGYvbWFwcyIKKworc3RhdGljIHNpemVfdCBfbXN0YXRzOyAvKiBzdGF0aXN0aWMgZm9yIG1hcHMgbG9ja2luZyAqLworCitzdGF0aWMgdm9pZCBfdG91Y2hfbWVtb3J5KHZvaWQgKm1lbSwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IHBhZ2VzaXplID0gbHZtX2dldHBhZ2VzaXplKCk7CisJY2hhciAqcG9zID0gbWVtOworCWNoYXIgKmVuZCA9IHBvcyArIHNpemUgLSBzaXplb2YobG9uZyk7CisKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCSoobG9uZyAqKSBwb3MgPSAxOworCQlwb3MgKz0gcGFnZXNpemU7CisJfQorfQorCitzdGF0aWMgdm9pZCBfYWxsb2NhdGVfbWVtb3J5KHZvaWQpCit7CisjaWZuZGVmIFZBTEdSSU5EX1BPT0wKKwl2b2lkICpzdGFja19tZW07CisJc3RydWN0IHJsaW1pdCBsaW1pdDsKKwlpbnQgaSwgYXJlYSA9IDAsIG1pc3NpbmcgPSBfc2l6ZV9tYWxsb2NfdG1wLCBtYXhfYXJlYXMgPSAzMiwgaGJsa3M7CisJY2hhciAqYXJlYXNbbWF4X2FyZWFzXTsKKworCS8qIENoZWNrIGlmIHdlIGNvdWxkIHByZWFsbG9jYXRlIHJlcXVlc3RlZCBzdGFjayAqLworCWlmICgoZ2V0cmxpbWl0IChSTElNSVRfU1RBQ0ssICZsaW1pdCkgPT0gMCkgJiYKKwkgICAgKChfc2l6ZV9zdGFjayAqIDIpIDwgbGltaXQucmxpbV9jdXIpICYmCisJICAgICgoc3RhY2tfbWVtID0gYWxsb2NhKF9zaXplX3N0YWNrKSkpKQorCQlfdG91Y2hfbWVtb3J5KHN0YWNrX21lbSwgX3NpemVfc3RhY2spOworCS8qIEZJWE1FIGVsc2Ugd2FybiB1c2VyIHNldHRpbmcgZ290IGlnbm9yZWQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiAgV2hlbiBhIGJyaygpIGZhaWxzIGR1ZSB0byBmcmFnbWVudGVkIGFkZHJlc3Mgc3BhY2UgKHdoaWNoIHNvbWV0aW1lcworICAgICAgICAgKiAgaGFwcGVucyB3aGVuIHdlIHRyeSB0byBncmFiIDhNIG9yIHNvKSwgZ2xpYmMgd2lsbCBtYWtlIGEgbmV3CisgICAgICAgICAqICBhcmVuYS4gSW4gdGhpcyBhcmVuYSwgdGhlIHJ1bGVzIGZvciB1c2luZyDigJxkaXJlY3TigJ0gbW1hcCBhcmUgcmVsYXhlZCwKKyAgICAgICAgICogIGNpcmN1bXZlbnRpbmcgdGhlIE1BWF9NTUFQcyBhbmQgTU1BUF9USFJFU0hPTEQgc2V0dGluZ3MuIFdlIGNhbiwKKyAgICAgICAgICogIGhvd2V2ZXIsIGRldGVjdCB3aGVuIHRoaXMgaGFwcGVucyB3aXRoIG1hbGxpbmZvKCkgYW5kIHRyeSB0byBjby1vcHQKKyAgICAgICAgICogIG1hbGxvYyBpbnRvIHVzaW5nIE1NQVAgYXMgYSBNT1JFQ09SRSBzdWJzdGl0dXRlIGluc3RlYWQgb2YgcmV0dXJuaW5nCisgICAgICAgICAqICBNTUFQJ2QgbWVtb3J5IGRpcmVjdGx5LiBTaW5jZSBNTUFQLWFzLU1PUkVDT1JFIGRvZXMgbm90IG11bm1hcCB0aGUKKyAgICAgICAgICogIG1lbW9yeSBvbiBmcmVlKCksIHRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KKyAgICAgICAgICovCisJd2hpbGUgKG1pc3NpbmcgPiAwKSB7CisJCXN0cnVjdCBtYWxsaW5mbyBpbmYgPSBtYWxsaW5mbygpOworCQloYmxrcyA9IGluZi5oYmxrczsKKworCQlpZiAoKGFyZWFzW2FyZWFdID0gbWFsbG9jKF9zaXplX21hbGxvY190bXApKSkKKwkJCV90b3VjaF9tZW1vcnkoYXJlYXNbYXJlYV0sIF9zaXplX21hbGxvY190bXApOworCisJCWluZiA9IG1hbGxpbmZvKCk7CisKKwkJaWYgKGhibGtzIDwgaW5mLmhibGtzKSB7CisJCQkvKiBtYWxsb2MgY2hlYXRlZCBhbmQgdXNlZCBtbWFwLCBldmVuIHRob3VnaCB3ZSB0b2xkIGl0CisJCQkgICBub3QgdG87IHdlIHRyeSB3aXRoIHR3aWNlIGFzIG1hbnkgYXJlYXMsIGVhY2ggaGFsZgorCQkJICAgdGhlIHNpemUsIHRvIGNpcmN1bXZlbnQgdGhlIGZhdWx0eSBsb2dpYyBpbiBnbGliYyAqLworCQkJZnJlZShhcmVhc1thcmVhXSk7CisJCQlfc2l6ZV9tYWxsb2NfdG1wIC89IDI7CisJCX0gZWxzZSB7CisJCQkrKyBhcmVhOworCQkJbWlzc2luZyAtPSBfc2l6ZV9tYWxsb2NfdG1wOworCQl9CisKKwkJaWYgKGFyZWEgPT0gbWF4X2FyZWFzICYmIG1pc3NpbmcgPiAwKSB7CisJCQkvKiBUb28gYmFkLiBXYXJuIHRoZSB1c2VyIGFuZCBwcm9jZWVkLCBhcyB0aGluZ3MgYXJlCisJCQkgKiBtb3N0IGxpa2VseSBnb2luZyB0byB3b3JrIG91dCBhbnl3YXkuICovCisJCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHJlc2VydmUgbWVtb3J5LCAlZCBieXRlcyBtaXNzaW5nLiIsIG1pc3NpbmcpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKF9tYWxsb2NfbWVtID0gbWFsbG9jKF9zaXplX21hbGxvYykpKQorCQlfdG91Y2hfbWVtb3J5KF9tYWxsb2NfbWVtLCBfc2l6ZV9tYWxsb2MpOworCisJLyogZnJlZSB1cCB0aGUgcmVzZXJ2ZXMgc28gc3Vic2VxdWVudCBtYWxsb2MncyBjYW4gdXNlIHRoYXQgbWVtb3J5ICovCisJZm9yIChpID0gMDsgaSA8IGFyZWE7ICsraSkKKwkJZnJlZShhcmVhc1tpXSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX3JlbGVhc2VfbWVtb3J5KHZvaWQpCit7CisJZnJlZShfbWFsbG9jX21lbSk7Cit9CisKKy8qCisgKiBtbG9jay9tdW5sb2NrIG1lbW9yeSBhcmVhcyBmcm9tIC9wcm9jL3NlbGYvbWFwcworICogZm9ybWF0IGRlc2NyaWJlZCBpbiBrZXJuZWwvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtL3Byb2MudHh0CisgKi8KK3N0YXRpYyBpbnQgX21hcHNfbGluZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBsdm1sb2NrX3QgbG9jaywKKwkJICAgICAgY29uc3QgY2hhciAqbGluZSwgc2l6ZV90ICptc3RhdHMpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3Y7CisJbG9uZyBmcm9tLCB0bzsKKwlpbnQgcG9zOworCXVuc2lnbmVkIGk7CisJY2hhciBmciwgZncsIGZ4LCBmcDsKKwlzaXplX3Qgc3o7CisJY29uc3QgY2hhciAqbG9ja19zdHIgPSAobG9jayA9PSBMVk1fTUxPQ0spID8gIm1sb2NrIiA6ICJtdW5sb2NrIjsKKworCWlmIChzc2NhbmYobGluZSwgIiVseC0lbHggJWMlYyVjJWMlbiIsCisJCSAgICZmcm9tLCAmdG8sICZmciwgJmZ3LCAmZngsICZmcCwgJnBvcykgIT0gNikgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBtYXBzIGxpbmU6ICVzIiwgbGluZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFNlbGVjdCByZWFkYWJsZSBtYXBzICovCisJaWYgKGZyICE9ICdyJykgeworCQlsb2dfZGVidWdfbWVtKCIlcyBhcmVhIHVucmVhZGFibGUgJXMgOiBTa2lwcGluZy4iLCBsb2NrX3N0ciwgbGluZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIGFsd2F5cyBpZ25vcmVkIGFyZWFzICovCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX2lnbm9yZV9tYXBzKTsgKytpKQorCQlpZiAoc3Ryc3RyKGxpbmUgKyBwb3MsIF9pZ25vcmVfbWFwc1tpXSkpIHsKKwkJCWxvZ19kZWJ1Z19tZW0oIiVzIGlnbm9yZSBmaWx0ZXIgJyVzJyBtYXRjaGVzICclcyc6IFNraXBwaW5nLiIsCisJCQkJICAgICAgbG9ja19zdHIsIF9pZ25vcmVfbWFwc1tpXSwgbGluZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJc3ogPSB0byAtIGZyb207CisJaWYgKCFjbikgeworCQkvKiBJZiBubyBibGFja2xpc3QgY29uZmlndXJlZCwgdXNlIGFuIGludGVybmFsIHNldCAqLworCQlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfYmxhY2tsaXN0X21hcHMpOyArK2kpCisJCQlpZiAoc3Ryc3RyKGxpbmUgKyBwb3MsIF9ibGFja2xpc3RfbWFwc1tpXSkpIHsKKwkJCQlsb2dfZGVidWdfbWVtKCIlcyBkZWZhdWx0IGZpbHRlciAnJXMnIG1hdGNoZXMgJyVzJzogU2tpcHBpbmcuIiwKKwkJCQkJICAgICAgbG9ja19zdHIsIF9ibGFja2xpc3RfbWFwc1tpXSwgbGluZSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJfSBlbHNlIHsKKwkJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQkJaWYgKChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB8fCAhY3YtPnYuc3RyWzBdKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0cnN0cihsaW5lICsgcG9zLCBjdi0+di5zdHIpKSB7CisJCQkJbG9nX2RlYnVnX21lbSgiJXNfZmlsdGVyICclcycgbWF0Y2hlcyAnJXMnOiBTa2lwcGluZy4iLAorCQkJCQkgICAgICBsb2NrX3N0ciwgY3YtPnYuc3RyLCBsaW5lKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKwkvKgorCSAqIFZhbGdyaW5kIGlzIGNvbnRpbnVhbGx5IGVhdGluZyBtZW1vcnkgd2hpbGUgZXhlY3V0aW5nIGNvZGUKKwkgKiBzbyB3ZSBuZWVkIHRvIGRlYWN0aXZhdGUgY2hlY2sgb2YgbG9ja2VkIG1lbW9yeSBzaXplCisJICovCisjaWZuZGVmIFZBTEdSSU5EX1BPT0wKKwlpZiAoUlVOTklOR19PTl9WQUxHUklORCkKKyNlbmRpZgorCQlzeiAtPSBzejsgLyogPSAwLCBidXQgYXZvaWRzIGdldHRpbmcgd2FybmluZyBhYm91dCBkZWFkIGFzc2lnbWVudCAqLworCisjZW5kaWYKKwkqbXN0YXRzICs9IHN6OworCWxvZ19kZWJ1Z19tZW0oIiVzICUxMGxkS2lCICUxMmx4IC0gJTEybHggJWMlYyVjJWMlcyIsIGxvY2tfc3RyLAorCQkgICAgICAoKGxvbmcpc3ogKyAxMDIzKSAvIDEwMjQsIGZyb20sIHRvLCBmciwgZncsIGZ4LCBmcCwgbGluZSArIHBvcyk7CisKKwlpZiAobG9jayA9PSBMVk1fTUxPQ0spIHsKKwkJaWYgKG1sb2NrKChjb25zdCB2b2lkKilmcm9tLCBzeikgPCAwKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJtbG9jayIsIGxpbmUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobXVubG9jaygoY29uc3Qgdm9pZCopZnJvbSwgc3opIDwgMCkgeworCQkJbG9nX3N5c19lcnJvcigibXVubG9jayIsIGxpbmUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbWVtbG9ja19tYXBzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBsdm1sb2NrX3QgbG9jaywgc2l6ZV90ICptc3RhdHMpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljaGFyICpsaW5lLCAqbGluZV9lbmQ7CisJc2l6ZV90IGxlbjsKKwlzc2l6ZV90IG47CisJaW50IHJldCA9IDE7CisKKwlpZiAoX3VzZV9tbG9ja2FsbCkgeworI2lmZGVmIE1DTF9DVVJSRU5UCisJCWlmIChsb2NrID09IExWTV9NTE9DSykgeworCQkJaWYgKG1sb2NrYWxsKE1DTF9DVVJSRU5UIHwgTUNMX0ZVVFVSRSkpIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJtbG9ja2FsbCIsICIiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtdW5sb2NrYWxsKCkpIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJtdW5sb2NrYWxsIiwgIiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJldHVybiAxOworI2Vsc2UKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwl9CisKKwkvKiBSZXNldCBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwkqbXN0YXRzID0gMDsKKworCS8qIHJlYWQgbWFwcGluZyBpbnRvIGEgc2luZ2xlIG1lbW9yeSBjaHVuayB3aXRob3V0IHJlYWxsb2NhdGlvbgorCSAqIGluIHRoZSBtaWRkbGUgb2YgcmVhZGluZyBtYXBzIGZpbGUgKi8KKwlmb3IgKGxlbiA9IDA7OykgeworCQlpZiAoIV9tYXBzX2J1ZmZlciB8fCBsZW4gPj0gX21hcHNfbGVuKSB7CisJCQlpZiAoX21hcHNfYnVmZmVyKQorCQkJCV9tYXBzX2xlbiAqPSAyOworCQkJaWYgKCEobGluZSA9IGRtX3JlYWxsb2MoX21hcHNfYnVmZmVyLCBfbWFwc19sZW4pKSkgeworCQkJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBtYXBzIGJ1ZmZlciBmYWlsZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlfbWFwc19idWZmZXIgPSBsaW5lOworCQl9CisJCWlmIChsc2VlayhfbWFwc19mZCwgMCwgU0VFS19TRVQpKQorCQkJbG9nX3N5c19lcnJvcigibHNlZWsiLCBfcHJvY3NlbGZtYXBzKTsKKwkJZm9yIChsZW4gPSAwIDsgbGVuIDwgX21hcHNfbGVuOyBsZW4gKz0gbikgeworCQkJaWYgKCEobiA9IHJlYWQoX21hcHNfZmQsIF9tYXBzX2J1ZmZlciArIGxlbiwgX21hcHNfbGVuIC0gbGVuKSkpCisJCQkJYnJlYWs7IC8qIEVPRiAqLworCQkJaWYgKG4gPT0gLTEpIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJyZWFkIiwgX3Byb2NzZWxmbWFwcyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKGxlbiA8IF9tYXBzX2xlbikgeyAvKiBmaXRzIGluIGJ1ZmZlciAqLworCQkJX21hcHNfYnVmZmVyW2xlbl0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlsaW5lID0gX21hcHNfYnVmZmVyOworCWNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGFjdGl2YXRpb25fbWxvY2tfZmlsdGVyX0NGRywgTlVMTCk7CisKKwl3aGlsZSAoKGxpbmVfZW5kID0gc3RyY2hyKGxpbmUsICdcbicpKSkgeworCQkqbGluZV9lbmQgPSAnXDAnOyAvKiByZW1vdmUgXG4gKi8KKwkJaWYgKCFfbWFwc19saW5lKGNuLCBsb2NrLCBsaW5lLCBtc3RhdHMpKQorCQkJcmV0ID0gMDsKKwkJbGluZSA9IGxpbmVfZW5kICsgMTsKKwl9CisKKwlsb2dfZGVidWdfbWVtKCIlc29ja2VkICVsZCBieXRlcyIsCisJCSAgICAgIChsb2NrID09IExWTV9NTE9DSykgPyAiTCIgOiAiVW5sIiwgKGxvbmcpKm1zdGF0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgREVCVUdfTUVNTE9DSworLyoKKyAqIExWTSBpcyBub3Qgc3VwcG9zZWQgdG8gdXNlIG1tYXAgd2hpbGUgZGV2aWNlcyBhcmUgc3VzcGVuZGVkLgorICogVGhpcyBjb2RlIGNhdXNlcyBhIGNvcmUgZHVtcCBpZiBnZXRzIGNhbGxlZC4iCisgKi8KKyMgIGlmZGVmIF9faTM4Nl9fCisjICAgIGRlZmluZSBBUkNIX1g4NgorIyAgZW5kaWYgLyogX19pMzg2X18gKi8KKyMgIGlmZGVmIF9feDg2XzY0X18KKyMgICAgaWZuZGVmIEFSQ0hfWDg2CisjICAgICAgZGVmaW5lIEFSQ0hfWDg2CisjICAgIGVuZGlmIC8qIEFSQ0hfWDg2ICovCisjICBlbmRpZiAvKiBfX3g4Nl82NF9fICovCisKKyNlbmRpZiAvKiBERUJVR19NRU1MT0NLICovCisKKyNpZmRlZiBBUkNIX1g4NgorI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisjaW5jbHVkZSA8ZGxmY24uaD4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIElOU1RSVUNUSU9OX0hMVCA9IDB4OTQ7CitzdGF0aWMgY2hhciBfbW1hcF9vcmlnOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKl9tbWFwX2FkZHI7CisjaWZkZWYgX19pMzg2X18KK3N0YXRpYyBjaGFyIF9tbWFwNjRfb3JpZzsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpfbW1hcDY0X2FkZHI7CisjZW5kaWYgLyogX19pMzg2X18gKi8KKyNlbmRpZiAvKiBBUkNIX1g4NiAqLworCitzdGF0aWMgaW50IF9kaXNhYmxlX21tYXAodm9pZCkKK3sKKyNpZmRlZiBBUkNIX1g4NgorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmFic19hZGRyOworCisJaWYgKCFfbW1hcF9hZGRyKSB7CisJCV9tbWFwX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkbHN5bShSVExEX05FWFQsICJtbWFwIik7CisJCWlmIChfbW1hcF9hZGRyWzBdID09IDB4ZmYgJiYgX21tYXBfYWRkclsxXSA9PSAweDI1KSB7IC8qIHBsdCAqLworI2lmZGVmIF9feDg2XzY0X18KKwkJCWFic19hZGRyID0gX21tYXBfYWRkciArIDYgKyAqKGludDMyX3QgKikoX21tYXBfYWRkciArIDIpOworI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KKyNpZmRlZiBfX2kzODZfXworCQkJYWJzX2FkZHIgPSAqKHZvaWQgKiopKF9tbWFwX2FkZHIgKyAyKTsKKyNlbmRpZiAvKiBfX2kzODZfXyAqLworCQkJX21tYXBfYWRkciA9ICoodm9pZCAqKilhYnNfYWRkcjsKKwkJfSBlbHNlCisJCQlsb2dfZGVidWdfbWVtKCJDYW4ndCBmaW5kIFBMVCBqdW1wIGVudHJ5IGFzc3VtaW5nIC1mUElFIGxpbmthZ2UuIik7CisJCWlmIChtcHJvdGVjdCgodm9pZCAqKSgodW5zaWduZWQgbG9uZylfbW1hcF9hZGRyICYgfjQwOTVVTCksIDQwOTYsIFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQykpIHsKKwkJCWxvZ19zeXNfZXJyb3IoIm1wcm90ZWN0IiwgIiIpOworCQkJX21tYXBfYWRkciA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlfbW1hcF9vcmlnID0gKl9tbWFwX2FkZHI7CisJfQorCWxvZ19kZWJ1Z19tZW0oIlJlbWFwcGluZyBtbWFwIGVudHJ5ICUwMnggdG8gJTAyeC4iLCBfbW1hcF9vcmlnLCBJTlNUUlVDVElPTl9ITFQpOworCSpfbW1hcF9hZGRyID0gSU5TVFJVQ1RJT05fSExUOworCisjaWZkZWYgX19pMzg2X18KKwlpZiAoIV9tbWFwNjRfYWRkcikgeworCQlfbW1hcDY0X2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkbHN5bShSVExEX05FWFQsICJtbWFwNjQiKTsKKwkJaWYgKF9tbWFwNjRfYWRkclswXSA9PSAweGZmICYmIF9tbWFwNjRfYWRkclsxXSA9PSAweDI1KSB7CisJCQlhYnNfYWRkciA9ICoodm9pZCAqKikoX21tYXA2NF9hZGRyICsgMik7CisJCQlfbW1hcDY0X2FkZHIgPSAqKHZvaWQgKiopYWJzX2FkZHI7CisJCX0gLyogQ2FuJ3QgZmluZCBQTFQganVtcCBlbnRyeSBhc3N1bWluZyAtZlBJRSBsaW5rYWdlICovCisJCWlmIChtcHJvdGVjdCgodm9pZCAqKSgodW5zaWduZWQgbG9uZylfbW1hcDY0X2FkZHIgJiB+NDA5NVVMKSwgNDA5NiwgUFJPVF9SRUFEfFBST1RfV1JJVEV8UFJPVF9FWEVDKSkgeworCQkJbG9nX3N5c19lcnJvcigibXByb3RlY3QiLCAiIik7CisJCQlfbW1hcDY0X2FkZHIgPSBOVUxMOworCQkJcmV0dXJuIDA7CisJCX0KKwkJX21tYXA2NF9vcmlnID0gKl9tbWFwNjRfYWRkcjsKKwl9CisJKl9tbWFwNjRfYWRkciA9IElOU1RSVUNUSU9OX0hMVDsKKyNlbmRpZiAvKiBfX2kzODZfXyAqLworI2VuZGlmIC8qIEFSQ0hfWDg2ICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Jlc3RvcmVfbW1hcCh2b2lkKQoreworI2lmZGVmIEFSQ0hfWDg2CisJaWYgKF9tbWFwX2FkZHIpCisJCSpfbW1hcF9hZGRyID0gX21tYXBfb3JpZzsKKyNpZmRlZiBfX2kzODZfXworCWlmIChfbW1hcDY0X2FkZHIpCisJCSpfbW1hcDY0X2FkZHIgPSBfbW1hcDY0X29yaWc7CisjZW5kaWYgLyogX19pMzg2X18gKi8KKwlsb2dfZGVidWdfbWVtKCJSZXN0b3JlZCBtbWFwIGVudHJ5LiIpOworI2VuZGlmIC8qIEFSQ0hfWDg2ICovCisJcmV0dXJuIDE7Cit9CisKKy8qIFN0b3AgbWVtb3J5IGdldHRpbmcgc3dhcHBlZCBvdXQgKi8KK3N0YXRpYyB2b2lkIF9sb2NrX21lbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlfYWxsb2NhdGVfbWVtb3J5KCk7CisJKHZvaWQpc3RyZXJyb3IoMCk7CQkvKiBGb3JjZSBsaWJjLm1vIGxvYWQgKi8KKwkodm9pZClkbV91ZGV2X2dldF9zeW5jX3N1cHBvcnQoKTsgLyogdWRldiBpcyBpbml0aWFsaXplZCAqLworCWxvZ192ZXJ5X3ZlcmJvc2UoIkxvY2tpbmcgbWVtb3J5Iik7CisKKwkvKgorCSAqIEZvciBkYWVtb24gd2UgbmVlZCB0byB1c2UgbWxvY2thbGwoKQorCSAqIHNvIGV2ZW4gZnV0dXJlIGFkaXRpb24gb2YgdGhyZWFkIHdoaWNoIG1heSBub3QgZXZlbiB1c2UgbHZtIGxpYgorCSAqIHdpbGwgbm90IGJsb2NrIG1lbW9yeSBsb2NrZWQgdGhyZWFkCisJICogTm90ZTogYXNzdW1pbmcgX21lbWxvY2tfY291bnRfZGFlbW9uIGlzIHVwZGF0ZWQgYmVmb3JlIF9tZW1sb2NrX2NvdW50CisJICovCisJX3VzZV9tbG9ja2FsbCA9IF9tZW1sb2NrX2NvdW50X2RhZW1vbiA/IDEgOgorCQlmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhY3RpdmF0aW9uX3VzZV9tbG9ja2FsbF9DRkcsIE5VTEwpOworCisJaWYgKCFfdXNlX21sb2NrYWxsKSB7CisJCWlmICghKl9wcm9jc2VsZm1hcHMgJiYKKwkJICAgIGRtX3NucHJpbnRmKF9wcm9jc2VsZm1hcHMsIHNpemVvZihfcHJvY3NlbGZtYXBzKSwKKwkJCQkiJXMiIFNFTEZfTUFQUywgY21kLT5wcm9jX2RpcikgPCAwKSB7CisJCQlsb2dfZXJyb3IoInByb2NfZGlyIHRvbyBsb25nIik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIShfbWFwc19mZCA9IG9wZW4oX3Byb2NzZWxmbWFwcywgT19SRE9OTFkpKSkgeworCQkJbG9nX3N5c19lcnJvcigib3BlbiIsIF9wcm9jc2VsZm1hcHMpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCFfZGlzYWJsZV9tbWFwKCkpCisJCQlzdGFjazsKKwl9CisKKwlpZiAoIV9tZW1sb2NrX21hcHMoY21kLCBMVk1fTUxPQ0ssICZfbXN0YXRzKSkKKwkJc3RhY2s7CisKKwllcnJubyA9IDA7CisJaWYgKCgoX3ByaW9yaXR5ID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwKSkgPT0gLTEpICYmIGVycm5vKQorCQlsb2dfc3lzX2Vycm9yKCJnZXRwcmlvcml0eSIsICIiKTsKKwllbHNlCisJCWlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIF9kZWZhdWx0X3ByaW9yaXR5KSkKKwkJCWxvZ19lcnJvcigic2V0cHJpb3JpdHkgJWQgZmFpbGVkOiAlcyIsCisJCQkJICBfZGVmYXVsdF9wcmlvcml0eSwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgX3VubG9ja19tZW0oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc2l6ZV90IHVubG9ja19tc3RhdHM7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJVbmxvY2tpbmcgbWVtb3J5Iik7CisKKwlpZiAoIV9tZW1sb2NrX21hcHMoY21kLCBMVk1fTVVOTE9DSywgJnVubG9ja19tc3RhdHMpKQorCQlzdGFjazsKKworCWlmICghX3VzZV9tbG9ja2FsbCkgeworCQlfcmVzdG9yZV9tbWFwKCk7CisJCWlmIChjbG9zZShfbWFwc19mZCkpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsIF9wcm9jc2VsZm1hcHMpOworCQlkbV9mcmVlKF9tYXBzX2J1ZmZlcik7CisJCV9tYXBzX2J1ZmZlciA9IE5VTEw7CisJCWlmIChfbXN0YXRzIDwgdW5sb2NrX21zdGF0cykgeworCQkJaWYgKChfbXN0YXRzICsgbHZtX2dldHBhZ2VzaXplKCkpIDwgdW5sb2NrX21zdGF0cykKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCQkJICAiUmVzZXJ2ZWQgbWVtb3J5ICglbGQpIG5vdCBlbm91Z2g6IHVzZWQgJWxkLiBJbmNyZWFzZSBhY3RpdmF0aW9uL3Jlc2VydmVkX21lbW9yeT8iLAorCQkJCQkgIChsb25nKV9tc3RhdHMsIChsb25nKXVubG9ja19tc3RhdHMpOworCQkJZWxzZQorCQkJCS8qIEZJWE1FIEJlbGlldmVkIGR1ZSB0byBpbmNvcnJlY3QgdXNlIG9mIHllc19ub19wcm9tcHQgd2hpbGUgbG9ja3MgaGVsZCAqLworCQkJCWxvZ19kZWJ1Z19tZW0oIlN1cHByZXNzZWQgaW50ZXJuYWwgZXJyb3I6IE1hcHMgbG9jayAlbGQgPCB1bmxvY2sgJWxkLCBhIG9uZS1wYWdlIGRpZmZlcmVuY2UuIiwKKwkJCQkJICAgICAgKGxvbmcpX21zdGF0cywgKGxvbmcpdW5sb2NrX21zdGF0cyk7CisJCX0KKwl9CisKKwlpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBfcHJpb3JpdHkpKQorCQlsb2dfZXJyb3IoInNldHByaW9yaXR5ICV1IGZhaWxlZDogJXMiLCBfcHJpb3JpdHksCisJCQkgIHN0cmVycm9yKGVycm5vKSk7CisJX3JlbGVhc2VfbWVtb3J5KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9sb2NrX21lbV9pZl9uZWVkZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJbG9nX2RlYnVnX21lbSgiTG9jazogICBNZW1sb2NrIGNvdW50ZXJzOiBsb2NrZWQ6JWQgY3JpdGljYWw6JWQgZGFlbW9uOiVkIHN1c3BlbmRlZDolZCIsCisJCSAgICAgIF9tZW1fbG9ja2VkLCBfY3JpdGljYWxfc2VjdGlvbiwgX21lbWxvY2tfY291bnRfZGFlbW9uLCBkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIoKSk7CisJaWYgKCFfbWVtX2xvY2tlZCAmJgorCSAgICAoKF9jcml0aWNhbF9zZWN0aW9uICsgX21lbWxvY2tfY291bnRfZGFlbW9uKSA9PSAxKSkgeworCQlfbWVtX2xvY2tlZCA9IDE7CisJCV9sb2NrX21lbShjbWQpOworCX0KK30KKworc3RhdGljIHZvaWQgX3VubG9ja19tZW1faWZfcG9zc2libGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJbG9nX2RlYnVnX21lbSgiVW5sb2NrOiBNZW1sb2NrIGNvdW50ZXJzOiBsb2NrZWQ6JWQgY3JpdGljYWw6JWQgZGFlbW9uOiVkIHN1c3BlbmRlZDolZCIsCisJCSAgICAgIF9tZW1fbG9ja2VkLCBfY3JpdGljYWxfc2VjdGlvbiwgX21lbWxvY2tfY291bnRfZGFlbW9uLCBkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIoKSk7CisJaWYgKF9tZW1fbG9ja2VkICYmCisJICAgICFfY3JpdGljYWxfc2VjdGlvbiAmJgorCSAgICAhX21lbWxvY2tfY291bnRfZGFlbW9uKSB7CisJCV91bmxvY2tfbWVtKGNtZCk7CisJCV9tZW1fbG9ja2VkID0gMDsKKwl9Cit9CisKK3ZvaWQgY3JpdGljYWxfc2VjdGlvbl9pbmMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwkvKgorCSAqIFByb2ZpbGVzIGFyZSBsb2FkZWQgb24tZGVtYW5kIHNvIG1ha2Ugc3VyZSB0aGF0IGJlZm9yZQorCSAqIGVudGVyaW5nIHRoZSBjcml0aWNhbCBzZWN0aW9uIGFsbCBuZWVkZWQgcHJvZmlsZXMgYXJlCisJICogbG9hZGVkIHRvIGF2b2lkIHRoZSBkaXNrIGFjY2VzcyBsYXRlci4KKwkgKi8KKwkodm9pZCkgbG9hZF9wZW5kaW5nX3Byb2ZpbGVzKGNtZCk7CisKKwlpZiAoIV9jcml0aWNhbF9zZWN0aW9uKSB7CisJCV9jcml0aWNhbF9zZWN0aW9uID0gMTsKKwkJbG9nX2RlYnVnX21lbSgiRW50ZXJpbmcgY3JpdGljYWwgc2VjdGlvbiAoJXMpLiIsIHJlYXNvbik7CisJfQorCisJX2xvY2tfbWVtX2lmX25lZWRlZChjbWQpOworfQorCit2b2lkIGNyaXRpY2FsX3NlY3Rpb25fZGVjKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisJaWYgKF9jcml0aWNhbF9zZWN0aW9uICYmICFkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIoKSkgeworCQlfY3JpdGljYWxfc2VjdGlvbiA9IDA7CisJCWxvZ19kZWJ1Z19tZW0oIkxlYXZpbmcgY3JpdGljYWwgc2VjdGlvbiAoJXMpLiIsIHJlYXNvbik7CisJfQorfQorCitpbnQgY3JpdGljYWxfc2VjdGlvbih2b2lkKQoreworCXJldHVybiBfY3JpdGljYWxfc2VjdGlvbjsKK30KKworLyoKKyAqIFRoZSBtZW1sb2NrXypfZGFlbW9uIGZ1bmN0aW9ucyB3aWxsIGZvcmNlIHRoZSBtbG9ja2FsbCgpIGNhbGwgdGhhdCB3ZSBuZWVkCisgKiB0byBzdGF5IGluIG1lbW9yeSwgYnV0IHRoZXkgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBkZXZpY2Ugc2NhbnMgKHVubGlrZQorICogbm9ybWFsIGNyaXRpY2FsX3NlY3Rpb25faW5jL2RlYykuIE1lbW9yeSBpcyBrZXB0IGxvY2tlZCBhcyBsb25nIGFzIGVpdGhlcgorICogb2YgY3JpdGljYWxfc2VjdGlvbiBvciBtZW1sb2NrX2RhZW1vbiBpcyBpbiBlZmZlY3QuCisgKi8KKwordm9pZCBtZW1sb2NrX2luY19kYWVtb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJKytfbWVtbG9ja19jb3VudF9kYWVtb247CisJaWYgKF9tZW1sb2NrX2NvdW50X2RhZW1vbiA9PSAxICYmIF9jcml0aWNhbF9zZWN0aW9uID4gMCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfbWVtbG9ja19pbmNfZGFlbW9uIHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbi4iKTsKKwlsb2dfZGVidWdfbWVtKCJtZW1sb2NrX2NvdW50X2RhZW1vbiBpbmMgdG8gJWQiLCBfbWVtbG9ja19jb3VudF9kYWVtb24pOworCV9sb2NrX21lbV9pZl9uZWVkZWQoY21kKTsKK30KKwordm9pZCBtZW1sb2NrX2RlY19kYWVtb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJaWYgKCFfbWVtbG9ja19jb3VudF9kYWVtb24pCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX21lbWxvY2tfY291bnRfZGFlbW9uIGhhcyBkcm9wcGVkIGJlbG93IDAuIik7CisJLS1fbWVtbG9ja19jb3VudF9kYWVtb247CisJbG9nX2RlYnVnX21lbSgibWVtbG9ja19jb3VudF9kYWVtb24gZGVjIHRvICVkIiwgX21lbWxvY2tfY291bnRfZGFlbW9uKTsKKwlpZiAoIV9tZW1sb2NrX2NvdW50X2RhZW1vbiAmJiBfY3JpdGljYWxfc2VjdGlvbiAmJiBfbWVtX2xvY2tlZCkgeworCQlsb2dfZXJyb3IoIlVubG9ja2luZyBkYWVtb24gbWVtb3J5IGluIGNyaXRpY2FsIHNlY3Rpb24uIik7CisJCV91bmxvY2tfbWVtKGNtZCk7CisJCV9tZW1fbG9ja2VkID0gMDsKKwl9CisJX3VubG9ja19tZW1faWZfcG9zc2libGUoY21kKTsKK30KKwordm9pZCBtZW1sb2NrX2luaXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJLyogV2hlbiB0aHJlYWRlZCwgY2FsbGVyIGFscmVhZHkgbGltaXRlZCBzdGFjayBzaXplIHNvIGp1c3QgdXNlIHRoZSBkZWZhdWx0LiAqLworCV9zaXplX3N0YWNrID0gMTAyNFVMTCAqIChjbWQtPnRocmVhZGVkID8gREVGQVVMVF9SRVNFUlZFRF9TVEFDSyA6CisJCQkJIGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgYWN0aXZhdGlvbl9yZXNlcnZlZF9zdGFja19DRkcsIE5VTEwpKTsKKwlfc2l6ZV9tYWxsb2NfdG1wID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBhY3RpdmF0aW9uX3Jlc2VydmVkX21lbW9yeV9DRkcsIE5VTEwpICogMTAyNFVMTDsKKwlfZGVmYXVsdF9wcmlvcml0eSA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgYWN0aXZhdGlvbl9wcm9jZXNzX3ByaW9yaXR5X0NGRywgTlVMTCk7Cit9CisKK3ZvaWQgbWVtbG9ja19yZXNldCh2b2lkKQoreworCWxvZ19kZWJ1Z19tZW0oIm1lbWxvY2sgcmVzZXQuIik7CisJX21lbV9sb2NrZWQgPSAwOworCV9jcml0aWNhbF9zZWN0aW9uID0gMDsKKwlfbWVtbG9ja19jb3VudF9kYWVtb24gPSAwOworfQorCit2b2lkIG1lbWxvY2tfdW5sb2NrKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCV91bmxvY2tfbWVtX2lmX3Bvc3NpYmxlKGNtZCk7Cit9CisKK2ludCBtZW1sb2NrX2NvdW50X2RhZW1vbih2b2lkKQoreworCXJldHVybiBfbWVtbG9ja19jb3VudF9kYWVtb247Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL21tL21lbWxvY2suaCBiL2xpYi9tbS9tZW1sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZWJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tbS9tZW1sb2NrLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBMVk1fTUVNTE9DS19ICisjZGVmaW5lIExWTV9NRU1MT0NLX0gKKworc3RydWN0IGNtZF9jb250ZXh0OworCisvKgorICogSW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiwgbWVtb3J5IGlzIGFsd2F5cyBsb2NrZWQuCisgKgorICogQWZ0ZXIgbGVhdmluZyB0aGUgY3JpdGljYWwgc2VjdGlvbiwgbWVtb3J5IHN0YXlzIGxvY2tlZCB1bnRpbCAKKyAqIG1lbWxvY2tfdW5sb2NrKCkgaXMgY2FsbGVkLiAgVGhpcyBoYXBwZW5zIHdpdGgKKyAqIHN5bmNfbG9jYWxfZGV2X25hbWVzKCkgYW5kIHN5bmNfZGV2X25hbWVzKCkuCisgKgorICogVGhpcyBhbGxvd3MgY3JpdGljYWwgc2VjdGlvbnMgdG8gYmUgZW50ZXJlZCBhbmQgZXhpdGVkIHJlcGVhdGVkbHkgd2l0aG91dAorICogaW5jdXJyaW5nIHRoZSBleHBlbnNlIG9mIGxvY2tpbmcgbWVtb3J5IGV2ZXJ5IHRpbWUuCisgKgorICogbWVtbG9ja19yZXNldCgpIGlzIG5lY2Vzc2FyeSB0byBjbGVhciB0aGUgc3RhdGUgYWZ0ZXIgZm9ya2luZyAocG9sbGRhZW1vbikuCisgKi8KKwordm9pZCBjcml0aWNhbF9zZWN0aW9uX2luYyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqcmVhc29uKTsKK3ZvaWQgY3JpdGljYWxfc2VjdGlvbl9kZWMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnJlYXNvbik7CitpbnQgY3JpdGljYWxfc2VjdGlvbih2b2lkKTsKK3ZvaWQgbWVtbG9ja19pbmNfZGFlbW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3ZvaWQgbWVtbG9ja19kZWNfZGFlbW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK2ludCBtZW1sb2NrX2NvdW50X2RhZW1vbih2b2lkKTsKK3ZvaWQgbWVtbG9ja19pbml0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3ZvaWQgbWVtbG9ja19yZXNldCh2b2lkKTsKK3ZvaWQgbWVtbG9ja191bmxvY2soc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9tbS94bGF0ZS5oIGIvbGliL21tL3hsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNTk0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9tbS94bGF0ZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fWExBVEVfSAorI2RlZmluZSBfTFZNX1hMQVRFX0gKKworI2lmZGVmIF9fbGludXhfXworIyAgaW5jbHVkZSA8ZW5kaWFuLmg+CisjICBpbmNsdWRlIDxieXRlc3dhcC5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+CisjICBkZWZpbmUgYnN3YXBfMTYoeCkgKCgoeCkgJiAweDAwZmZVKSA8PCA4IHwgXAorCQkgICAgICAgKCh4KSAmIDB4ZmYwMFUpID4+IDgpCisjICBkZWZpbmUgYnN3YXBfMzIoeCkgKCgoeCkgJiAweDAwMDAwMGZmVSkgPDwgMjQgfCBcCisJCSAgICAgICAoKHgpICYgMHhmZjAwMDAwMFUpID4+IDI0IHwgXAorCQkgICAgICAgKCh4KSAmIDB4MDAwMGZmMDBVKSA8PCA4ICB8IFwKKwkJICAgICAgICgoeCkgJiAweDAwZmYwMDAwVSkgPj4gOCkKKyMgIGRlZmluZSBic3dhcF82NCh4KSAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYgfCBcCisJCSAgICAgICAoKHgpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NiB8IFwKKwkJICAgICAgICgoeCkgJiAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwIHwgXAorCQkgICAgICAgKCh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDAgfCBcCisJCSAgICAgICAoKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCB8IFwKKwkJICAgICAgICgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0IHwgXAorCQkgICAgICAgKCh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgOCB8IFwKKwkJICAgICAgICgoeCkgJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+IDgpCisjZW5kaWYKKworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorLyogTmV3IGNsZWFyZXIgdmFyaWFudHMuICovCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpICh4KQorI2RlZmluZSBsZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgbGU2NF90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpICh4KQorI2RlZmluZSBjcHVfdG9fbGUzMih4KSAoeCkKKyNkZWZpbmUgY3B1X3RvX2xlNjQoeCkgKHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGJlNjRfdG9fY3B1KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19iZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19iZTY0KHgpIGJzd2FwXzY0KHgpCisvKiBPbGQgYWx0ZXJuYXRpdmUgdmFyaWFudHMuICovCisjZGVmaW5lIHhsYXRlMTYoeCkgKHgpCisjZGVmaW5lIHhsYXRlMzIoeCkgKHgpCisjZGVmaW5lIHhsYXRlNjQoeCkgKHgpCisjZGVmaW5lIHhsYXRlMTZfYmUoeCkgYnN3YXBfMTYoeCkKKyNkZWZpbmUgeGxhdGUzMl9iZSh4KSBic3dhcF8zMih4KQorI2RlZmluZSB4bGF0ZTY0X2JlKHgpIGJzd2FwXzY0KHgpCisKKyNlbGlmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorLyogTmV3IGNsZWFyZXIgdmFyaWFudHMuICovCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGxlNjRfdG9fY3B1KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIGNwdV90b19sZTY0KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpICh4KQorI2RlZmluZSBiZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgYmU2NF90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpICh4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KSAoeCkKKyNkZWZpbmUgY3B1X3RvX2JlNjQoeCkgKHgpCisvKiBPbGQgYWx0ZXJuYXRpdmUgdmFyaWFudHMuICovCisjZGVmaW5lIHhsYXRlMTYoeCkgYnN3YXBfMTYoeCkKKyNkZWZpbmUgeGxhdGUzMih4KSBic3dhcF8zMih4KQorI2RlZmluZSB4bGF0ZTY0KHgpIGJzd2FwXzY0KHgpCisjZGVmaW5lIHhsYXRlMTZfYmUoeCkgKHgpCisjZGVmaW5lIHhsYXRlMzJfYmUoeCkgKHgpCisjZGVmaW5lIHhsYXRlNjRfYmUoeCkgKHgpCisKKyNlbHNlCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorLyogTmV3IGNsZWFyZXIgdmFyaWFudHMuICovCisjZGVmaW5lIGxlMTZfdG9fY3B1KHgpIF9fbGUxNl90b19jcHUoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkgX19sZTMyX3RvX2NwdSh4KQorI2RlZmluZSBsZTY0X3RvX2NwdSh4KSBfX2xlNjRfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpIF9fY3B1X3RvX2xlMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgX19jcHVfdG9fbGUzMih4KQorI2RlZmluZSBjcHVfdG9fbGU2NCh4KSBfX2NwdV90b19sZTY0KHgpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHgpIF9fYmUxNl90b19jcHUoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkgX19iZTMyX3RvX2NwdSh4KQorI2RlZmluZSBiZTY0X3RvX2NwdSh4KSBfX2JlNjRfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b19iZTE2KHgpIF9fY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2JlMzIoeCkgX19jcHVfdG9fYmUzMih4KQorI2RlZmluZSBjcHVfdG9fYmU2NCh4KSBfX2NwdV90b19iZTY0KHgpCisvKiBPbGQgYWx0ZXJuYXRpdmUgdmFyaWFudHMuICovCisjZGVmaW5lIHhsYXRlMTYoeCkgX19jcHVfdG9fbGUxNih4KQorI2RlZmluZSB4bGF0ZTMyKHgpIF9fY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgeGxhdGU2NCh4KSBfX2NwdV90b19sZTY0KHgpCisjZGVmaW5lIHhsYXRlMTZfYmUoeCkgX19jcHVfdG9fYmUxNih4KQorI2RlZmluZSB4bGF0ZTMyX2JlKHgpIF9fY3B1X3RvX2JlMzIoeCkKKyNkZWZpbmUgeGxhdGU2NF9iZSh4KSBfX2NwdV90b19iZTY0KHgpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbm90aWZ5L2x2bW5vdGlmeS5jIGIvbGliL25vdGlmeS9sdm1ub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFkOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vdGlmeS9sdm1ub3RpZnkuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bW5vdGlmeS5oIgorCisjZGVmaW5lIExWTV9EQlVTX0RFU1RJTkFUSU9OICJjb20ucmVkaGF0Lmx2bWRidXMxIgorI2RlZmluZSBMVk1fREJVU19QQVRIICAgICAgICAiL2NvbS9yZWRoYXQvbHZtZGJ1czEvTWFuYWdlciIKKyNkZWZpbmUgTFZNX0RCVVNfSU5URVJGQUNFICAgImNvbS5yZWRoYXQubHZtZGJ1czEuTWFuYWdlciIKKworI2lmZGVmIE5PVElGWURCVVNfU1VQUE9SVAorI2luY2x1ZGUgPHN5c3RlbWQvc2QtYnVzLmg+CisKK2ludCBsdm1ub3RpZnlfaXNfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbHZtbm90aWZ5X3NlbmQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc2RfYnVzICpidXMgPSBOVUxMOworCXNkX2J1c19tZXNzYWdlICptID0gTlVMTDsKKwlzZF9idXNfZXJyb3IgZXJyb3IgPSBTRF9CVVNfRVJST1JfTlVMTDsKKwljb25zdCBjaGFyICpjbWRfbmFtZTsKKwlpbnQgcmV0OworCWludCByZXN1bHQgPSAwOworCisJaWYgKCFjbWQtPnZnX25vdGlmeSAmJiAhY21kLT5sdl9ub3RpZnkgJiYgIWNtZC0+cHZfbm90aWZ5KQorCQlyZXR1cm47CisKKwljbWQtPnZnX25vdGlmeSA9IDA7CisJY21kLT5sdl9ub3RpZnkgPSAwOworCWNtZC0+cHZfbm90aWZ5ID0gMDsKKworCWNtZF9uYW1lID0gZ2V0X2NtZF9uYW1lKCk7CisKKwlyZXQgPSBzZF9idXNfb3Blbl9zeXN0ZW0oJmJ1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJbG9nX2RlYnVnX2RidXMoIkZhaWxlZCB0byBjb25uZWN0IHRvIGRidXM6ICVkIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWxvZ19kZWJ1Z19kYnVzKCJOb2ZpZnkgZGJ1cyBhdCAlcy4iLCBMVk1fREJVU19ERVNUSU5BVElPTik7CisKKwlyZXQgPSBzZF9idXNfY2FsbF9tZXRob2QoYnVzLAorCQkJCSBMVk1fREJVU19ERVNUSU5BVElPTiwKKwkJCQkgTFZNX0RCVVNfUEFUSCwKKwkJCQkgTFZNX0RCVVNfSU5URVJGQUNFLAorCQkJCSAiRXh0ZXJuYWxFdmVudCIsCisJCQkJICZlcnJvciwKKwkJCQkgJm0sCisJCQkJICJzIiwKKwkJCQkgY21kX25hbWUpOworCisJaWYgKHJldCA8IDApIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEQtQnVzIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHNkX2J1c19tZXNzYWdlX3JlYWQobSwgImkiLCAmcmVzdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJbG9nX2RlYnVnX2RidXMoIkZhaWxlZCB0byBwYXJzZSBkYnVzIHJlc3BvbnNlIG1lc3NhZ2U6ICVkIiwgcmV0KTsKKwlpZiAocmVzdWx0KQorCQlsb2dfZGVidWdfZGJ1cygiQmFkIHJldHVybiB2YWx1ZSBmcm9tIGRidXMgc2VydmljZTogJWQiLCByZXN1bHQpOworb3V0OgorCXNkX2J1c19lcnJvcl9mcmVlKCZlcnJvcik7CisJc2RfYnVzX21lc3NhZ2VfdW5yZWYobSk7CisJc2RfYnVzX3VucmVmKGJ1cyk7Cit9CisKK3ZvaWQgc2V0X3ZnX25vdGlmeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljbWQtPnZnX25vdGlmeSA9IDE7Cit9CisKK3ZvaWQgc2V0X2x2X25vdGlmeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljbWQtPmx2X25vdGlmeSA9IDE7Cit9CisKK3ZvaWQgc2V0X3B2X25vdGlmeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljbWQtPnB2X25vdGlmeSA9IDE7Cit9CisKKyNlbHNlCisKK2ludCBsdm1ub3RpZnlfaXNfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbHZtbm90aWZ5X3NlbmQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7Cit9CisKK3ZvaWQgc2V0X3ZnX25vdGlmeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKK30KKwordm9pZCBzZXRfbHZfbm90aWZ5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworfQorCit2b2lkIHNldF9wdl9ub3RpZnkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvbm90aWZ5L2x2bW5vdGlmeS5oIGIvbGliL25vdGlmeS9sdm1ub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU2YjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vdGlmeS9sdm1ub3RpZnkuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKi8KKworI2lmbmRlZiBfTFZNTk9USUZZX0gKKyNkZWZpbmUgX0xWTU5PVElGWV9ICisKK2ludCBsdm1ub3RpZnlfaXNfc3VwcG9ydGVkKHZvaWQpOwordm9pZCBsdm1ub3RpZnlfc2VuZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Cit2b2lkIHNldF92Z19ub3RpZnkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpOwordm9pZCBzZXRfbHZfbm90aWZ5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3ZvaWQgc2V0X3B2X25vdGlmeShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvcHJvcGVydGllcy9wcm9wX2NvbW1vbi5jIGIvbGliL3Byb3BlcnRpZXMvcHJvcF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQ5Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3Byb3BlcnRpZXMvcHJvcF9jb21tb24uYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJwcm9wX2NvbW1vbi5oIgorCitpbnQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0KGNvbnN0IHZvaWQgKm9iaiwgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKQoreworCWxvZ19lcnJubyhFTk9TWVMsICJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0KHZvaWQgKm9iaiwgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKQoreworCWxvZ19lcnJubyhFTk9TWVMsICJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHJvcF9nZXRfcHJvcGVydHkoc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwLCBjb25zdCB2b2lkICpvYmosCisJCXN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCwKKwkJdW5zaWduZWQgdHlwZSkKK3sKKwl3aGlsZSAocC0+aWRbMF0pIHsKKwkJaWYgKCFzdHJjbXAocC0+aWQsIHByb3AtPmlkKSkKKwkJCWJyZWFrOworCQlwKys7CisJfQorCWlmICghcC0+aWRbMF0pIHsKKwkJbG9nX2Vycm5vKEVJTlZBTCwgIkludmFsaWQgcHJvcGVydHkgbmFtZSAlcyIsIHByb3AtPmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKHAtPnR5cGUgJiB0eXBlKSkgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiUHJvcGVydHkgbmFtZSAlcyBkb2VzIG5vdCBtYXRjaCB0eXBlICVkIiwKKwkJCSAgcHJvcC0+aWQsIHAtPnR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcHJvcCA9ICpwOworCWlmICghcC0+Z2V0KG9iaiwgcHJvcCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBwcm9wX3NldF9wcm9wZXJ0eShzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnAsIHZvaWQgKm9iaiwKKwkJc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wLAorCQl1bnNpZ25lZCB0eXBlKQoreworCXdoaWxlIChwLT5pZFswXSkgeworCQlpZiAoIXN0cmNtcChwLT5pZCwgcHJvcC0+aWQpKQorCQkJYnJlYWs7CisJCXArKzsKKwl9CisJaWYgKCFwLT5pZFswXSkgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiSW52YWxpZCBwcm9wZXJ0eSBuYW1lICVzIiwgcHJvcC0+aWQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwLT5pc19zZXR0YWJsZSkgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiVW5hYmxlIHRvIHNldCByZWFkLW9ubHkgcHJvcGVydHkgJXMiLAorCQkJICBwcm9wLT5pZCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIShwLT50eXBlICYgdHlwZSkpIHsKKwkJbG9nX2Vycm5vKEVJTlZBTCwgIlByb3BlcnR5IG5hbWUgJXMgZG9lcyBub3QgbWF0Y2ggdHlwZSAlZCIsCisJCQkgIHByb3AtPmlkLCBwLT50eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHAtPmlzX3N0cmluZykKKwkJcC0+dmFsdWUuc3RyaW5nID0gcHJvcC0+dmFsdWUuc3RyaW5nOworCWVsc2UKKwkJcC0+dmFsdWUuaW50ZWdlciA9IHByb3AtPnZhbHVlLmludGVnZXI7CisJaWYgKCFwLT5zZXQob2JqLCBwKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9wcm9wZXJ0aWVzL3Byb3BfY29tbW9uLmggYi9saWIvcHJvcGVydGllcy9wcm9wX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmViNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHJvcGVydGllcy9wcm9wX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZuZGVmIF9MVk1fUFJPUF9DT01NT05fSAorI2RlZmluZSBfTFZNX1BST1BfQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKgorICogQ29tbW9uIGNvZGUgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgcHJvcGVydGllcy4KKyAqLworCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgeworCXVuc2lnbmVkIHR5cGU7CisJY29uc3QgY2hhciAqaWQ7CisJdW5zaWduZWQgaXNfc2V0dGFibGU6MTsKKwl1bnNpZ25lZCBpc19zdHJpbmc6MTsKKwl1bnNpZ25lZCBpc19pbnRlZ2VyOjE7CisJdW5zaWduZWQgaXNfc2lnbmVkOjE7CisJdW5pb24geworCQljb25zdCBjaGFyICpzdHJpbmc7CisJCXVpbnQ2NF90IGludGVnZXI7CisJCWludDY0X3Qgc2lnbmVkX2ludGVnZXI7CisJfSB2YWx1ZTsKKwlpbnQgKCpnZXQpIChjb25zdCB2b2lkICpvYmosIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCk7CisJaW50ICgqc2V0KSAodm9pZCAqb2JqLCBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworfTsKKworaW50IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldChjb25zdCB2b2lkICpvYmosIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCk7CitpbnQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0KHZvaWQgKm9iaiwgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKTsKKworaW50IHByb3BfZ2V0X3Byb3BlcnR5KHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcCwgY29uc3Qgdm9pZCAqb2JqLAorCQlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3AsCisJCXVuc2lnbmVkIHR5cGUpOworaW50IHByb3Bfc2V0X3Byb3BlcnR5KHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcCwgdm9pZCAqb2JqLAorCQlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3AsCisJCXVuc2lnbmVkIHR5cGUpOworCisjZGVmaW5lIEdFVF9OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIFRZUEUsIFZBUikJCQlcCitzdGF0aWMgaW50IF8gIyMgTkFNRSAjIyBfZ2V0IChjb25zdCB2b2lkICpvYmosIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkgXAoreyBcCisJY29uc3Qgc3RydWN0IFRZUEUgKlZBUiA9IChjb25zdCBzdHJ1Y3QgVFlQRSAqKW9iajsgXAorXAorCXByb3AtPnZhbHVlLmludGVnZXIgPSBWQUxVRTsgXAorCXJldHVybiAxOyBcCit9CisKKyNkZWZpbmUgU0VUX05VTV9QUk9QRVJUWV9GTihOQU1FLCBTRVRGTiwgVFlQRSwgVkFSKQkJCVwKK3N0YXRpYyBpbnQgXyAjIyBOQU1FICMjIF9zZXQgKHZvaWQgKm9iaiwgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKSBcCit7IFwKKwlzdHJ1Y3QgVFlQRSAqVkFSID0gKHN0cnVjdCBUWVBFICopb2JqOyBcCitcCisJU0VURk4oVkFSLCBwcm9wLT52YWx1ZS5pbnRlZ2VyKTsJCVwKKwlyZXR1cm4gMTsgXAorfQorCisjZGVmaW5lIFNFVF9OVU1fUFJPUEVSVFkoTkFNRSwgVkFMVUUsIFRZUEUsIFZBUikJCQlcCitzdGF0aWMgaW50IF8gIyMgTkFNRSAjIyBfc2V0ICh2b2lkICpvYmosIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkgXAoreyBcCisJc3RydWN0IFRZUEUgKlZBUiA9IChzdHJ1Y3QgVFlQRSAqKW9iajsgXAorXAorCVZBTFVFID0gcHJvcC0+dmFsdWUuaW50ZWdlcjsJCVwKKwlyZXR1cm4gMTsgXAorfQorCisjZGVmaW5lIEdFVF9TVFJfUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIFRZUEUsIFZBUikJCQlcCitzdGF0aWMgaW50IF8gIyMgTkFNRSAjIyBfZ2V0IChjb25zdCB2b2lkICpvYmosIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkgXAoreyBcCisJY29uc3Qgc3RydWN0IFRZUEUgKlZBUiA9IChjb25zdCBzdHJ1Y3QgVFlQRSAqKW9iajsgXAorXAorCXByb3AtPnZhbHVlLnN0cmluZyA9IChjaGFyICopVkFMVUU7CVwKKwlyZXR1cm4gMTsgXAorfQorCisvKgorICogVGhlICdGSUVMRCcgbWFjcm8gYXJndW1lbnRzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKiAxLiByZXBvcnRfdHlwZS4gIEFuIGVudW0gdmFsdWUgdGhhdCBzZWxlY3RzIGEgc3BlY2lmaWMKKyAqIHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgaW4gdGhlIF9yZXBvcnRfdHlwZXMgYXJyYXkuICBUaGUgdmFsdWUgaXMKKyAqIHVzZWQgdG8gc2VsZWN0IHRoZSBjb250YWluaW5nIGJhc2Ugb2JqZWN0IGFkZHJlc3MgKHNlZSAqb2JqX2dldCoKKyAqIGZ1bmN0aW9ucykgZm9yIGFueSBkYXRhIHZhbHVlcyBvZiBhbnkgZmllbGQgaW4gdGhlIHJlcG9ydC4KKyAqIDIuIENvbnRhaW5pbmcgc3RydWN0LiAgVGhlIHN0cnVjdHVyZSB0aGF0IGVpdGhlciBjb250YWlucyB0aGUgZmllbGQgZGF0YQorICogYXMgYSBtZW1iZXIgb3Igc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBmaWVsZCBkYXRhLiAgVGhlIGNvbnRhaW5pbmcKKyAqIHN0cnVjdCBzaG91bGQgbWF0Y2ggdGhlIGJhc2Ugb2JqZWN0IG9mIHRoZSByZXBvcnRfdHlwZS4KKyAqIDMuIEZpZWxkIHR5cGUuICBUaGlzIG11c3QgYmUgZWl0aGVyICdTVFInIG9yICdOVU0nLgorICogNC4gUmVwb3J0IGhlYWRpbmcuICBUaGlzIGlzIHRoZSBmaWVsZCBoZWFkaW5nIHRoYXQgaXMgZGlzcGxheWVkIGJ5IHRoZQorICogcmVwb3J0aW5nIGNvbW1hbmRzLgorICogNS4gRGF0YSB2YWx1ZSBwb2ludGVyLiAgVGhpcyBhcmd1bWVudCBpcyBhbHdheXMgYSBtZW1iZXIgb2YgdGhlCisgKiBjb250YWluaW5nIHN0cnVjdC4gIEl0IG1heSBwb2ludCBkaXJlY3RseSB0byB0aGUgZGF0YSB2YWx1ZSAoZm9yIGV4YW1wbGUsCisgKiBsdl91dWlkIC0gc2VlIF91dWlkX2Rpc3AoKSkgb3IgbWF5IGJlIHVzZWQgdG8gZGVyaXZlIHRoZSBkYXRhIHZhbHVlIChmb3IKKyAqIGV4YW1wbGUsIHNlZ19jb3VudCAtIHNlZSBfbHZzZWdjb3VudF9kaXNwKCkpLiAgSW4gdGhlIEZJRUxEIG1hY3JvCisgKiBkZWZpbml0aW9uLCBpdCBpcyB1c2VkIGluIGFuIG9mZnNldCBjYWxjdWxhdGlvbiB0byBkZXJpdmUgdGhlIG9mZnNldCB0bworICogdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgY29udGFpbmluZyBzdHJ1Y3QgYmFzZSBhZGRyZXNzLiAgTm90ZSB0aGF0IGluIHNvbWUKKyAqIGNhc2VzLCB0aGUgYXJndW1lbnQgaXMgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0LCBpbiB3aGljaCBjYXNlIHRoZQorICogZGF0YSB2YWx1ZSBwb2ludGVyIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdCBpdHNlbGYgKGZvciBleGFtcGxlLAorICogJ2x2aWQnIGZpZWxkIG9mIHN0cnVjdCAnbHYnKS4KKyAqIDYuIE1pbmltdW0gZGlzcGxheSB3aWR0aC4gIFRoaXMgaXMgdGhlIG1pbmltdW0gd2lkdGggdXNlZCB0byBkaXNwbGF5CisgKiB0aGUgZmllbGQgdmFsdWUsIHR5cGljYWxseSBtYXRjaGluZyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbiBoZWFkaW5nLgorICogNy4gRGlzcGxheSBmdW5jdGlvbiBpZGVudGlmaWVyLiAgVXNlZCB0byBkZXJpdmUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUKKyAqIGZ1bmN0aW9uIHRoYXQgZGlzcGxheXMgdGhpcyBmaWVsZC4gIERlcml2YXRpb24gaXMgZG9uZSBieSBhcHBlbmRpbmcgJ18nCisgKiB0aGVuIHByZXBlbmRpbmcgdGhpcyBhcmd1bWVudCB0byAnX2Rpc3AnLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgYXJndW1lbnQKKyAqIGlzICd1dWlkJywgdGhlIGRpc3BsYXkgZnVuY3Rpb24gaXMgX3V1aWRfZGlzcCgpLiAgQWRkaW5nIGEgbmV3IGZpZWxkIG1heQorICogcmVxdWlyZSBkZWZpbmluZyBhIG5ldyBkaXNwbGF5IGZ1bmN0aW9uIChmb3IgZXhhbXBsZSBfbXlmaWVsZG5hbWVfZGlzcCgpKSwKKyAqIG9yIHJlLXVzZSBvZiBhbiBleGlzdGluZyBvbmUgKGZvciBleGFtcGxlLCBfdWludDMyX2Rpc3AoKSkuCisgKiA4LiBVbmlxdWUgZm9ybWF0IGlkZW50aWZpZXIgLyBmaWVsZCBpZC4gIFRoaXMgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbmQgaXMKKyAqIHVzZWQgdG8gc2VsZWN0IGZpZWxkcyB2aWEgJy1vJyBpbiB0aGUgcmVwb3J0aW5nIGNvbW1hbmRzIChwdnMvdmdzL2x2cykuCisgKiBUaGUgc3RyaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmllbGQgLSB0aGUgJ2lkJyBtZW1iZXIgb2YKKyAqIHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZS4KKyAqIDkuIERlc2NyaXB0aW9uIG9mIGZpZWxkLiAgVGhpcyBpcyBhIGJyaWVmIChpZGVhbGx5IDw9IDUyIGNoYXJzKSBkZXNjcmlwdGlvbgorICogb2YgdGhlIGZpZWxkIHVzZWQgaW4gdGhlIHJlcG9ydGluZyBjb21tYW5kcy4KKyAqIDEwLiBGbGFncy4KKyAqICAgICBGSUVMRF9NT0RJRklBQkxFLiAgQSAnX3NldCcgZnVuY3Rpb24gZXhpc3RzIHRvIGNoYW5nZSB0aGUgZmllbGQncyB2YWx1ZS4KKyAqICAgICBUaGUgZnVuY3Rpb24gbmFtZSBpcyBkZXJpdmVkIGluIGEgc2ltaWxhciB3YXkgdG8gaXRlbSA3IGFib3ZlLgorICovCisKKyNkZWZpbmUgU1RSIDEKKyNkZWZpbmUgTlVNIDIKKyNkZWZpbmUgQklOIDMKKyNkZWZpbmUgU0laIDQKKyNkZWZpbmUgUENUIDUKKyNkZWZpbmUgVElNIDYKKyNkZWZpbmUgU05VTSA3ICAgICAgICAgICAgICAvKiBTaWduZWQgTnVtYmVyICovCisjZGVmaW5lIFNUUl9MSVNUIDgKKworI2RlZmluZSBGSUVMRF9NT0RJRklBQkxFIDB4MDAwMDAwMDEKKyNkZWZpbmUgRklFTEQodHlwZSwgc3RyY3QsIGZpZWxkX3R5cGUsIGhlYWQsIGZpZWxkLCB3aWR0aCwgZm4sIGlkLCBkZXNjLCBzZXR0YWJsZSkgXAorCXsgdHlwZSwgI2lkLCBzZXR0YWJsZSwgKGZpZWxkX3R5cGUgPT0gU1RSIHx8IGZpZWxkX3R5cGUgPT0gU1RSX0xJU1QpLCAoKGZpZWxkX3R5cGUgPT0gTlVNKSB8fCAoZmllbGRfdHlwZSA9PSBCSU4pIHx8IChmaWVsZF90eXBlID09IFNJWikgfHwgKGZpZWxkX3R5cGUgPT0gUENUKSB8fCAoZmllbGRfdHlwZSA9PSBTTlVNKSksICgoZmllbGRfdHlwZSA9PSBTTlVNKSB8fCAoZmllbGRfdHlwZSA9PSBQQ1QpKSwgeyAuaW50ZWdlciA9IDAgfSwgXyAjIyBpZCAjIyBfZ2V0LCBfICMjIGlkICMjIF9zZXQgfSwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvcmFpZC8uZXhwb3J0ZWRfc3ltYm9scyBiL2xpYi9yYWlkLy5leHBvcnRlZF9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDEyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFpZC8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxIEBACitpbml0X211bHRpcGxlX3NlZ3R5cGVzCmRpZmYgLS1naXQgYS9saWIvcmFpZC9NYWtlZmlsZS5pbiBiL2xpYi9yYWlkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWVhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFpZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IHJhaWQuYworCitMSUJfU0hBUkVEID0gbGlibHZtMnJhaWQuJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMl9wbHVnaW4KZGlmZiAtLWdpdCBhL2xpYi9yYWlkL3JhaWQuYyBiL2xpYi9yYWlkL3JhaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU3OTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JhaWQvcmFpZC5jCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAidGV4dF9leHBvcnQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgInRhcmdldHMuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImx2X2FsbG9jLmgiCisKK3N0YXRpYyB2b2lkIF9yYWlkX2Rpc3BsYXkoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwl1bnNpZ25lZCBzOworCisJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgKytzKSB7CisJCWxvZ19wcmludCgiICBSYWlkIERhdGEgTFYlMmQiLCBzKTsKKwkJZGlzcGxheV9zdHJpcGUoc2VnLCBzLCAiICAgICIpOworCX0KKworCWlmIChzZWctPm1ldGFfYXJlYXMpCisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7ICsrcykKKwkJCWlmIChzZWdfbWV0YWx2KHNlZywgcykpCisJCQkJbG9nX3ByaW50KCIgIFJhaWQgTWV0YWRhdGEgTFYlMmRcdCVzIiwgcywgc2VnX21ldGFsdihzZWcsIHMpLT5uYW1lKTsKKworCWxvZ19wcmludCgiICIpOworfQorCitzdGF0aWMgaW50IF9yYWlkX3RleHRfaW1wb3J0X2FyZWFfY291bnQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCQkJdWludDMyX3QgKmFyZWFfY291bnQpCit7CisJdWludDMyX3Qgc3RyaXBlX2NvdW50ID0gMCwgZGV2aWNlX2NvdW50ID0gMDsKKwlpbnQgc3RyaXBlX2NvdW50X2ZvdW5kLCBkZXZpY2VfY291bnRfZm91bmQ7CisKKwlkZXZpY2VfY291bnRfZm91bmQgPSBkbV9jb25maWdfZ2V0X3VpbnQzMihzbiwgImRldmljZV9jb3VudCIsICZkZXZpY2VfY291bnQpOworCXN0cmlwZV9jb3VudF9mb3VuZCA9IGRtX2NvbmZpZ19nZXRfdWludDMyKHNuLCAic3RyaXBlX2NvdW50IiwgJnN0cmlwZV9jb3VudCk7CisKKwlpZiAoIWRldmljZV9jb3VudF9mb3VuZCAmJiAhc3RyaXBlX2NvdW50X2ZvdW5kKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCAnZGV2aWNlX2NvdW50JyBvciAnc3RyaXBlX2NvdW50JyBmb3IgIgorCQkJICAic2VnbWVudCAnJXMnLiIsIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2aWNlX2NvdW50X2ZvdW5kICYmIHN0cmlwZV9jb3VudF9mb3VuZCkgeworCQlsb2dfZXJyb3IoIk9ubHkgb25lIG9mICdkZXZpY2VfY291bnQnIGFuZCAnc3RyaXBlX2NvdW50JyBhbGxvd2VkIGZvciAiCisJCQkgICJzZWdtZW50ICclcycuIiwgZG1fY29uZmlnX3BhcmVudF9uYW1lKHNuKSk7CisJCXJldHVybiAwOworCX0KKworCSphcmVhX2NvdW50ID0gc3RyaXBlX2NvdW50ICsgZGV2aWNlX2NvdW50OworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWRfdGV4dF9pbXBvcnRfYXJlYXMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2KQoreworCXVuc2lnbmVkIGludCBzOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJY29uc3QgY2hhciAqc2VnX25hbWUgPSBkbV9jb25maWdfcGFyZW50X25hbWUoc24pOworCisJaWYgKCFzZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKCJObyBhcmVhcyBmb3VuZCBmb3Igc2VnbWVudCAlcyIsIHNlZ19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChzID0gMDsgY3YgJiYgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrLCBjdiA9IGN2LT5uZXh0KSB7CisJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQlsb2dfZXJyb3IoIkJhZCB2b2x1bWUgbmFtZSBpbiBhcmVhcyBhcnJheSBmb3Igc2VnbWVudCAlcy4iLCBzZWdfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIE1ldGFkYXRhIGRldmljZSBjb21lcyBmaXJzdC4gKi8KKwkJaWYgKCFzZWdfaXNfcmFpZDAoc2VnKSkgeworCQkJaWYgKCEobHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBjdi0+di5zdHIpKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCB2b2x1bWUgJyVzJyBmb3Igc2VnbWVudCAnJXMnLiIsCisJCQkJCSAgY3YtPnYuc3RyID8gOiAiTlVMTCIsIHNlZ19uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KHNlZywgcywgbHYsIDAsIFJBSURfTUVUQSkpCisJCQkJcmV0dXJuXzA7CisJCQljdiA9IGN2LT5uZXh0OworCQl9CisKKwkJaWYgKCFjdikgeworCQkJbG9nX2Vycm9yKCJNaXNzaW5nIGRhdGEgZGV2aWNlIGluIGFyZWFzIGFycmF5IGZvciBzZWdtZW50ICVzLiIsIHNlZ19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRGF0YSBkZXZpY2UgY29tZXMgc2Vjb25kICovCisJCWlmICghKGx2ID0gZmluZF9sdihzZWctPmx2LT52ZywgY3YtPnYuc3RyKSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCB2b2x1bWUgJyVzJyBmb3Igc2VnbWVudCAnJXMnLiIsCisJCQkJICBjdi0+di5zdHIgPyA6ICJOVUxMIiwgc2VnX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFzZXRfbHZfc2VnbWVudF9hcmVhX2x2KHNlZywgcywgbHYsIDAsIFJBSURfSU1BR0UpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyoKKwkgKiBDaGVjayB3ZSByZWFkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBSQUlEIGRhdGEvbWV0YSBwYWlycy4KKwkgKi8KKwlpZiAoY3YgfHwgKHMgPCBzZWctPmFyZWFfY291bnQpKSB7CisJCWxvZ19lcnJvcigiSW5jb3JyZWN0IG51bWJlciBvZiBhcmVhcyBpbiBhcmVhIGFycmF5ICIKKwkJCSAgImZvciBzZWdtZW50ICclcycuIiwgc2VnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmFpZF90ZXh0X2ltcG9ydChzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkJICAgICBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqcHZfaGFzaCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwljb25zdCBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpuYW1lOworCQl1aW50MzJfdCAqdmFyOworCX0gcmFpZF9hdHRyX2ltcG9ydFtdID0geworCQl7ICJyZWdpb25fc2l6ZSIsCSZzZWctPnJlZ2lvbl9zaXplIH0sCisJCXsgInN0cmlwZV9zaXplIiwJJnNlZy0+c3RyaXBlX3NpemUgfSwKKwkJeyAid3JpdGViZWhpbmQiLAkmc2VnLT53cml0ZWJlaGluZCB9LAorCQl7ICJtaW5fcmVjb3ZlcnlfcmF0ZSIsCSZzZWctPm1pbl9yZWNvdmVyeV9yYXRlIH0sCisJCXsgIm1heF9yZWNvdmVyeV9yYXRlIiwJJnNlZy0+bWF4X3JlY292ZXJ5X3JhdGUgfSwKKwl9LCAqYWlwID0gcmFpZF9hdHRyX2ltcG9ydDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUocmFpZF9hdHRyX2ltcG9ydCk7IGkrKywgYWlwKyspIHsKKwkJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgYWlwLT5uYW1lKSkgeworCQkJaWYgKCFkbV9jb25maWdfZ2V0X3VpbnQzMihzbiwgYWlwLT5uYW1lLCBhaXAtPnZhcikpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgJyVzJyBmb3Igc2VnbWVudCAlcyBvZiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCQkgIGFpcC0+bmFtZSwgZG1fY29uZmlnX3BhcmVudF9uYW1lKHNuKSwgc2VnLT5sdi0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfbGlzdChzbiwgc2VnX2lzX3JhaWQwKHNlZykgPyAicmFpZDBfbHZzIiA6ICJyYWlkcyIsICZjdikpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIFJBSUQgYXJyYXkgZm9yICIKKwkJCSAgInNlZ21lbnQgJXMgb2YgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCSAgZG1fY29uZmlnX3BhcmVudF9uYW1lKHNuKSwgc2VnLT5sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3JhaWRfdGV4dF9pbXBvcnRfYXJlYXMoc2VnLCBzbiwgY3YpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGltcG9ydCBSQUlEIGNvbXBvbmVudCBwYWlycy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlZ19pc19hbnlfcmFpZDAoc2VnKSkKKwkJc2VnLT5hcmVhX2xlbiAvPSBzZWctPmFyZWFfY291bnQ7CisJc2VnLT5zdGF0dXMgfD0gUkFJRDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yYWlkX3RleHRfZXhwb3J0X3JhaWQwKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJb3V0ZihmLCAic3RyaXBlX2NvdW50ID0gJXUiLCBzZWctPmFyZWFfY291bnQpOworCisJaWYgKHNlZy0+c3RyaXBlX3NpemUpCisJCW91dGYoZiwgInN0cmlwZV9zaXplID0gJSIgUFJJdTMyLCBzZWctPnN0cmlwZV9zaXplKTsKKworCXJldHVybiBvdXRfYXJlYXMoZiwgc2VnLCBzZWdfaXNfcmFpZDAoc2VnKSA/ICJyYWlkMF9sdiIgOiAicmFpZCIpOworfQorCitzdGF0aWMgaW50IF9yYWlkX3RleHRfZXhwb3J0X3JhaWQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKwlvdXRmKGYsICJkZXZpY2VfY291bnQgPSAldSIsIHNlZy0+YXJlYV9jb3VudCk7CisKKwlpZiAoc2VnLT5zdHJpcGVfc2l6ZSkKKwkJb3V0ZihmLCAic3RyaXBlX3NpemUgPSAlIiBQUkl1MzIsIHNlZy0+c3RyaXBlX3NpemUpOworCWlmIChzZWctPnJlZ2lvbl9zaXplKQorCQlvdXRmKGYsICJyZWdpb25fc2l6ZSA9ICUiIFBSSXUzMiwgc2VnLT5yZWdpb25fc2l6ZSk7CisJaWYgKHNlZy0+d3JpdGViZWhpbmQpCisJCW91dGYoZiwgIndyaXRlYmVoaW5kID0gJSIgUFJJdTMyLCBzZWctPndyaXRlYmVoaW5kKTsKKwlpZiAoc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZSkKKwkJb3V0ZihmLCAibWluX3JlY292ZXJ5X3JhdGUgPSAlIiBQUkl1MzIsIHNlZy0+bWluX3JlY292ZXJ5X3JhdGUpOworCWlmIChzZWctPm1heF9yZWNvdmVyeV9yYXRlKQorCQlvdXRmKGYsICJtYXhfcmVjb3ZlcnlfcmF0ZSA9ICUiIFBSSXUzMiwgc2VnLT5tYXhfcmVjb3ZlcnlfcmF0ZSk7CisKKwlyZXR1cm4gb3V0X2FyZWFzKGYsIHNlZywgInJhaWQiKTsKK30KKworc3RhdGljIGludCBfcmFpZF90ZXh0X2V4cG9ydChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCWlmIChzZWdfaXNfYW55X3JhaWQwKHNlZykpCisJCXJldHVybiBfcmFpZF90ZXh0X2V4cG9ydF9yYWlkMChzZWcsIGYpOworCisJcmV0dXJuIF9yYWlkX3RleHRfZXhwb3J0X3JhaWQoc2VnLCBmKTsKK30KKworc3RhdGljIGludCBfcmFpZF9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHZvaWQgKip0YXJnZXRfc3RhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IGxlbiwKKwkJCQkgdWludDMyX3QgKnB2bW92ZV9taXJyb3JfY291bnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJdWludDMyX3QgczsKKwl1aW50NjRfdCBmbGFncyA9IDA7CisJdWludDY0X3QgcmVidWlsZHMgPSAwOworCXVpbnQ2NF90IHdyaXRlbW9zdGx5ID0gMDsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlX3JhaWRfcGFyYW1zIHBhcmFtczsKKwlpbnQgcmFpZDAgPSBzZWdfaXNfYW55X3JhaWQwKHNlZyk7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCisJaWYgKCFzZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfcmFpZF9hZGRfdGFyZ2V0X2xpbmUgY2FsbGVkICIKKwkJCSAgIndpdGggbm8gYXJlYXMgZm9yICVzLiIsIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIDY0IGRldmljZSByZXN0cmljdGlvbiBpbXBvc2VkIGJ5IGtlcm5lbCBhcyB3ZWxsLiAgSXQgaXMKKwkgKiBub3Qgc3RyaWN0bHkgYSB1c2Vyc3BhY2UgbGltaXRhdGlvbi4KKwkgKi8KKwlpZiAoc2VnLT5hcmVhX2NvdW50ID4gNjQpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbiA2NCBkZXZpY2VzIGluIGEgIgorCQkJICAic2luZ2xlIFJBSUQgYXJyYXkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyYWlkMCkgeworCQlpZiAoIXNlZy0+cmVnaW9uX3NpemUpIHsKKwkJCWxvZ19lcnJvcigiTWlzc2luZyByZWdpb24gc2l6ZSBmb3IgbWlycm9yIHNlZ21lbnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykKKwkJCWlmIChzZWdfbHYoc2VnLCBzKS0+c3RhdHVzICYgTFZfUkVCVUlMRCkKKwkJCQlyZWJ1aWxkcyB8PSAxVUxMIDw8IHM7CisKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQkJaWYgKHNlZ19sdihzZWcsIHMpLT5zdGF0dXMgJiBMVl9XUklURU1PU1RMWSkKKwkJCQl3cml0ZW1vc3RseSB8PSAxVUxMIDw8IHM7CisKKwkJaWYgKG1pcnJvcl9pbl9zeW5jKCkpCisJCQlmbGFncyA9IERNX05PU1lOQzsKKwl9CisKKwlwYXJhbXMucmFpZF90eXBlID0gbHZzZWdfbmFtZShzZWcpOworCXBhcmFtcy5zdHJpcGVfc2l6ZSA9IHNlZy0+c3RyaXBlX3NpemU7CisJcGFyYW1zLmZsYWdzID0gZmxhZ3M7CisKKwlpZiAocmFpZDApIHsKKwkJcGFyYW1zLm1pcnJvcnMgPSAxOworCQlwYXJhbXMuc3RyaXBlcyA9IHNlZy0+YXJlYV9jb3VudDsKKwl9IGVsc2UgaWYgKHNlZy0+c2VndHlwZS0+cGFyaXR5X2RldnMpIHsKKwkJLyogUkFJRCA0LzUvNiAqLworCQlwYXJhbXMubWlycm9ycyA9IDE7CisJCXBhcmFtcy5zdHJpcGVzID0gc2VnLT5hcmVhX2NvdW50IC0gc2VnLT5zZWd0eXBlLT5wYXJpdHlfZGV2czsKKwl9IGVsc2UgaWYgKHNlZ19pc19yYWlkMTAoc2VnKSkgeworCQkvKiBSQUlEIDEwIG9ubHkgc3VwcG9ydHMgMiBtaXJyb3JzIG5vdyAqLworCQlwYXJhbXMubWlycm9ycyA9IDI7CisJCXBhcmFtcy5zdHJpcGVzID0gc2VnLT5hcmVhX2NvdW50IC8gMjsKKwl9IGVsc2UgeworCQkvKiBSQUlEIDEgKi8KKwkJcGFyYW1zLm1pcnJvcnMgPSBzZWctPmFyZWFfY291bnQ7CisJCXBhcmFtcy5zdHJpcGVzID0gMTsKKwkJcGFyYW1zLndyaXRlYmVoaW5kID0gc2VnLT53cml0ZWJlaGluZDsKKwl9CisKKwlpZiAoIXJhaWQwKSB7CisJCXBhcmFtcy5yZWdpb25fc2l6ZSA9IHNlZy0+cmVnaW9uX3NpemU7CisJCXBhcmFtcy5yZWJ1aWxkcyA9IHJlYnVpbGRzOworCQlwYXJhbXMud3JpdGVtb3N0bHkgPSB3cml0ZW1vc3RseTsKKwkJcGFyYW1zLm1pbl9yZWNvdmVyeV9yYXRlID0gc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZTsKKwkJcGFyYW1zLm1heF9yZWNvdmVyeV9yYXRlID0gc2VnLT5tYXhfcmVjb3ZlcnlfcmF0ZTsKKwl9CisKKwlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfcmFpZF90YXJnZXRfd2l0aF9wYXJhbXMobm9kZSwgbGVuLCAmcGFyYW1zKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gYWRkX2FyZWFzX2xpbmUoZG0sIHNlZywgbm9kZSwgMHUsIHNlZy0+YXJlYV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWRfdGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlKGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIChzdHJzdHIodHlwZSwgInJhaWQiKSAhPSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX3JhaWRfZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoKHZvaWQgKikgc2VndHlwZSk7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfcmFpZF90YXJnZXRfcGVyY2VudCh2b2lkICoqdGFyZ2V0X3N0YXRlLAorCQkJCWRtX3BlcmNlbnRfdCAqcGVyY2VudCwKKwkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCXN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGNoYXIgKnBhcmFtcywKKwkJCQl1aW50NjRfdCAqdG90YWxfbnVtZXJhdG9yLAorCQkJCXVpbnQ2NF90ICp0b3RhbF9kZW5vbWluYXRvcikKK3sKKwlpbnQgaTsKKwl1aW50NjRfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOworCWNoYXIgKnBvcyA9IHBhcmFtczsKKwkvKgorCSAqIFN0YXR1cyBsaW5lOgorCSAqICAgIDxyYWlkX3R5cGU+IDwjZGV2cz4gPHN0YXR1c19jaGFycz4gPHN5bmNlZD4vPHRvdGFsPgorCSAqIEV4YW1wbGU6CisJICogICAgcmFpZDEgMiBBQSAxMDI0MDAwLzEwMjQwMDAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXBvcyA9IHN0cnN0cihwb3MsICIgIik7CisJCWlmIChwb3MpCisJCQlwb3MrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICghcG9zIHx8IChzc2NhbmYocG9zLCBGTVR1NjQgIi8iIEZNVHU2NCAiJW4iLCAmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsICZpKSAhPSAyKSB8fAorCSAgICAhZGVub21pbmF0b3IpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2UgJXMgc3RhdHVzIGZyYWN0aW9uOiAlcyIsCisJCQkgIChzZWcpID8gc2VnLT5zZWd0eXBlLT5uYW1lIDogInNlZ21lbnQiLCBwYXJhbXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqdG90YWxfbnVtZXJhdG9yICs9IG51bWVyYXRvcjsKKwkqdG90YWxfZGVub21pbmF0b3IgKz0gZGVub21pbmF0b3I7CisKKwlpZiAoc2VnKQorCQlzZWctPmV4dGVudHNfY29waWVkID0gc2VnLT5hcmVhX2xlbiAqIG51bWVyYXRvciAvIGRlbm9taW5hdG9yOworCisJKnBlcmNlbnQgPSBkbV9tYWtlX3BlcmNlbnQobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmFpZF90YXJnZXRfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXVuc2lnbmVkICphdHRyaWJ1dGVzKQoreworCS8qIExpc3Qgb2YgZmVhdHVyZXMgd2l0aCB0aGVpciBrZXJuZWwgdGFyZ2V0IHZlcnNpb24gKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZlYXR1cmUgeworCQl1aW50MzJfdCBtYWo7CisJCXVpbnQzMl90IG1pbjsKKwkJdW5zaWduZWQgcmFpZF9mZWF0dXJlOworCQljb25zdCBjaGFyICpmZWF0dXJlOworCX0gX2ZlYXR1cmVzW10gPSB7CisJCXsgMSwgMywgUkFJRF9GRUFUVVJFX1JBSUQxMCwgU0VHX1RZUEVfTkFNRV9SQUlEMTAgfSwKKwkJeyAxLCA3LCBSQUlEX0ZFQVRVUkVfUkFJRDAsIFNFR19UWVBFX05BTUVfUkFJRDAgfSwKKwl9OworCisJc3RhdGljIGludCBfcmFpZF9jaGVja2VkID0gMDsKKwlzdGF0aWMgaW50IF9yYWlkX3ByZXNlbnQgPSAwOworCXN0YXRpYyBpbnQgX3JhaWRfYXR0cnMgPSAwOworCXVpbnQzMl90IG1haiwgbWluLCBwYXRjaGxldmVsOworCXVuc2lnbmVkIGk7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV9yYWlkX2NoZWNrZWQpIHsKKwkJX3JhaWRfY2hlY2tlZCA9IDE7CisKKwkJaWYgKCEoX3JhaWRfcHJlc2VudCA9IHRhcmdldF9wcmVzZW50KGNtZCwgVEFSR0VUX05BTUVfUkFJRCwgMSkpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKCF0YXJnZXRfdmVyc2lvbigicmFpZCIsICZtYWosICZtaW4sICZwYXRjaGxldmVsKSkKKwkJCXJldHVybl8wOworCisJCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKF9mZWF0dXJlcyk7ICsraSkKKwkJCWlmICgobWFqID4gX2ZlYXR1cmVzW2ldLm1haikgfHwKKwkJCSAgICAobWFqID09IF9mZWF0dXJlc1tpXS5tYWogJiYgbWluID49IF9mZWF0dXJlc1tpXS5taW4pKQorCQkJCV9yYWlkX2F0dHJzIHw9IF9mZWF0dXJlc1tpXS5yYWlkX2ZlYXR1cmU7CisJCQllbHNlCisJCQkJbG9nX3ZlcnlfdmVyYm9zZSgiVGFyZ2V0IHJhaWQgZG9lcyBub3Qgc3VwcG9ydCAlcy4iLAorCQkJCQkJIF9mZWF0dXJlc1tpXS5mZWF0dXJlKTsKKwl9CisKKwlpZiAoYXR0cmlidXRlcykKKwkJKmF0dHJpYnV0ZXMgPSBfcmFpZF9hdHRyczsKKworCXJldHVybiBfcmFpZF9wcmVzZW50OworfQorCitzdGF0aWMgaW50IF9yYWlkX21vZHVsZXNfbmVlZGVkKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqbW9kdWxlcykKK3sKKwlpZiAoIXN0cl9saXN0X2FkZChtZW0sIG1vZHVsZXMsIE1PRFVMRV9OQU1FX1JBSUQpKSB7CisJCWxvZ19lcnJvcigicmFpZCBtb2R1bGUgc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyMgIGlmZGVmIERNRVZFTlRECitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9yYWlkX2Rzb19wYXRoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IGNoYXIgKmNvbmZpZ19zdHIgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGRtZXZlbnRkX3JhaWRfbGlicmFyeV9DRkcsIE5VTEwpOworCXJldHVybiBnZXRfbW9uaXRvcl9kc29fcGF0aChjbWQsIGNvbmZpZ19zdHIpOworfQorCitzdGF0aWMgaW50IF9yYWlkX3RhcmdldF9tb25pdG9yZWQoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgaW50ICpwZW5kaW5nKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gc2VnLT5sdi0+dmctPmNtZDsKKwljb25zdCBjaGFyICpkc29fcGF0aCA9IF9nZXRfcmFpZF9kc29fcGF0aChjbWQpOworCisJcmV0dXJuIHRhcmdldF9yZWdpc3RlcmVkX3dpdGhfZG1ldmVudGQoY21kLCBkc29fcGF0aCwgc2VnLT5sdiwgcGVuZGluZyk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWRfc2V0X2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZtYXNrLCBpbnQgc2V0KQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gc2VnLT5sdi0+dmctPmNtZDsKKwljb25zdCBjaGFyICpkc29fcGF0aCA9IF9nZXRfcmFpZF9kc29fcGF0aChjbWQpOworCisJcmV0dXJuIHRhcmdldF9yZWdpc3Rlcl9ldmVudHMoY21kLCBkc29fcGF0aCwgc2VnLT5sdiwgZXZtYXNrLCBzZXQsIDApOworfQorCitzdGF0aWMgaW50IF9yYWlkX3RhcmdldF9tb25pdG9yX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZlbnRzKQoreworCXJldHVybiBfcmFpZF9zZXRfZXZlbnRzKHNlZywgZXZlbnRzLCAxKTsKK30KKworc3RhdGljIGludCBfcmFpZF90YXJnZXRfdW5tb25pdG9yX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZlbnRzKQoreworCXJldHVybiBfcmFpZF9zZXRfZXZlbnRzKHNlZywgZXZlbnRzLCAwKTsKK30KKyMgIGVuZGlmIC8qIERNRVZFTlREICovCisjZW5kaWYgLyogREVWTUFQUEVSX1NVUFBPUlQgKi8KKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX3JhaWRfb3BzID0geworCS5kaXNwbGF5ID0gX3JhaWRfZGlzcGxheSwKKwkudGV4dF9pbXBvcnRfYXJlYV9jb3VudCA9IF9yYWlkX3RleHRfaW1wb3J0X2FyZWFfY291bnQsCisJLnRleHRfaW1wb3J0ID0gX3JhaWRfdGV4dF9pbXBvcnQsCisJLnRleHRfZXhwb3J0ID0gX3JhaWRfdGV4dF9leHBvcnQsCisJLmFkZF90YXJnZXRfbGluZSA9IF9yYWlkX2FkZF90YXJnZXRfbGluZSwKKwkudGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlID0gX3JhaWRfdGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlLAorI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisJLnRhcmdldF9wZXJjZW50ID0gX3JhaWRfdGFyZ2V0X3BlcmNlbnQsCisJLnRhcmdldF9wcmVzZW50ID0gX3JhaWRfdGFyZ2V0X3ByZXNlbnQsCisJLm1vZHVsZXNfbmVlZGVkID0gX3JhaWRfbW9kdWxlc19uZWVkZWQsCisjICBpZmRlZiBETUVWRU5URAorCS50YXJnZXRfbW9uaXRvcmVkID0gX3JhaWRfdGFyZ2V0X21vbml0b3JlZCwKKwkudGFyZ2V0X21vbml0b3JfZXZlbnRzID0gX3JhaWRfdGFyZ2V0X21vbml0b3JfZXZlbnRzLAorCS50YXJnZXRfdW5tb25pdG9yX2V2ZW50cyA9IF9yYWlkX3RhcmdldF91bm1vbml0b3JfZXZlbnRzLAorIyAgZW5kaWYgICAgICAgIC8qIERNRVZFTlREICovCisjZW5kaWYKKwkuZGVzdHJveSA9IF9yYWlkX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhaWRfdHlwZSB7CisJY29uc3QgY2hhciBuYW1lWzEyXTsKKwl1bnNpZ25lZCBwYXJpdHk7CisJdWludDY0X3QgZXh0cmFfZmxhZ3M7Cit9IF9yYWlkX3R5cGVzW10gPSB7CisJeyBTRUdfVFlQRV9OQU1FX1JBSUQwLCAgICAgIDAsIFNFR19SQUlEMCB8IFNFR19BUkVBU19TVFJJUEVEIH0sCisJeyBTRUdfVFlQRV9OQU1FX1JBSUQwX01FVEEsIDAsIFNFR19SQUlEMF9NRVRBIHwgU0VHX0FSRUFTX1NUUklQRUQgfSwKKwl7IFNFR19UWVBFX05BTUVfUkFJRDEsICAgICAgMCwgU0VHX1JBSUQxIHwgU0VHX0FSRUFTX01JUlJPUkVEIH0sCisJeyBTRUdfVFlQRV9OQU1FX1JBSUQxMCwgICAgIDAsIFNFR19SQUlEMTAgfCBTRUdfQVJFQVNfTUlSUk9SRUQgfSwKKwl7IFNFR19UWVBFX05BTUVfUkFJRDQsICAgICAgMSwgU0VHX1JBSUQ0IH0sCisJeyBTRUdfVFlQRV9OQU1FX1JBSUQ1LCAgICAgIDEsIFNFR19SQUlENSB9LAorCXsgU0VHX1RZUEVfTkFNRV9SQUlENV9MQSwgICAxLCBTRUdfUkFJRDVfTEEgfSwKKwl7IFNFR19UWVBFX05BTUVfUkFJRDVfTFMsICAgMSwgU0VHX1JBSUQ1X0xTIH0sCisJeyBTRUdfVFlQRV9OQU1FX1JBSUQ1X1JBLCAgIDEsIFNFR19SQUlENV9SQSB9LAorCXsgU0VHX1RZUEVfTkFNRV9SQUlENV9SUywgICAxLCBTRUdfUkFJRDVfUlMgfSwKKwl7IFNFR19UWVBFX05BTUVfUkFJRDYsICAgICAgMiwgU0VHX1JBSUQ2IH0sCisJeyBTRUdfVFlQRV9OQU1FX1JBSUQ2X05DLCAgIDIsIFNFR19SQUlENl9OQyB9LAorCXsgU0VHX1RZUEVfTkFNRV9SQUlENl9OUiwgICAyLCBTRUdfUkFJRDZfTlIgfSwKKwl7IFNFR19UWVBFX05BTUVfUkFJRDZfWlIsICAgMiwgU0VHX1JBSUQ2X1pSIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VnbWVudF90eXBlICpfaW5pdF9yYWlkX3NlZ3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmFpZF90eXBlICpydCwKKwkJCQkJICAgICAgIHVpbnQ2NF90IG1vbml0b3JlZCkKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJaWYgKCFzZWd0eXBlKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgc2VndHlwZSIsCisJCQkgIHJ0LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2VndHlwZS0+b3BzID0gJl9yYWlkX29wczsKKwlzZWd0eXBlLT5uYW1lID0gcnQtPm5hbWU7CisJc2VndHlwZS0+ZmxhZ3MgPSBTRUdfUkFJRCB8IFNFR19PTkxZX0VYQ0xVU0lWRSB8IHJ0LT5leHRyYV9mbGFncyB8IG1vbml0b3JlZDsKKwlzZWd0eXBlLT5wYXJpdHlfZGV2cyA9IHJ0LT5wYXJpdHk7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBzZWd0eXBlOiAlcyIsIHNlZ3R5cGUtPm5hbWUpOworCisJcmV0dXJuIHNlZ3R5cGU7Cit9CisKKyNpZmRlZiBSQUlEX0lOVEVSTkFMIC8qIFNoYXJlZCAqLworaW50IGluaXRfcmFpZF9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKQorI2Vsc2UKK2ludCBpbml0X211bHRpcGxlX3NlZ3R5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICpzZWdsaWIpOworCitpbnQgaW5pdF9tdWx0aXBsZV9zZWd0eXBlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKQorI2VuZGlmCit7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKwl1bnNpZ25lZCBpOworCXVpbnQ2NF90IG1vbml0b3JlZCA9IDA7CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorIyAgaWZkZWYgRE1FVkVOVEQKKwlpZiAoX2dldF9yYWlkX2Rzb19wYXRoKGNtZCkpCisJCW1vbml0b3JlZCA9IFNFR19NT05JVE9SRUQ7CisjICBlbmRpZgorI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfcmFpZF90eXBlcyk7ICsraSkKKwkJaWYgKChzZWd0eXBlID0gX2luaXRfcmFpZF9zZWd0eXBlKGNtZCwgJl9yYWlkX3R5cGVzW2ldLCBtb25pdG9yZWQpKSAmJgorCQkgICAgIWx2bV9yZWdpc3Rlcl9zZWd0eXBlKHNlZ2xpYiwgc2VndHlwZSkpCisJCQkvKiBzZWd0eXBlIGlzIGFscmVhZHkgZGVzdHJveWVkICovCisJCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL3JlcGxpY2F0b3IvLmV4cG9ydGVkX3N5bWJvbHMgYi9saWIvcmVwbGljYXRvci8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzkyYzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JlcGxpY2F0b3IvLmV4cG9ydGVkX3N5bWJvbHMKQEAgLTAsMCArMSBAQAoraW5pdF9zZWd0eXBlCmRpZmYgLS1naXQgYS9saWIvcmVwbGljYXRvci9NYWtlZmlsZS5pbiBiL2xpYi9yZXBsaWNhdG9yL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDJkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmVwbGljYXRvci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVMgPSByZXBsaWNhdG9yLmMKKworTElCX1NIQVJFRCA9IGxpYmx2bTJyZXBsaWNhdG9yLiQoTElCX1NVRkZJWCkKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9MVk0pCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitpbnN0YWxsOiBpbnN0YWxsX2xpYl9zaGFyZWRfcGx1Z2luCmRpZmYgLS1naXQgYS9saWIvcmVwbGljYXRvci9yZXBsaWNhdG9yLmMgYi9saWIvcmVwbGljYXRvci9yZXBsaWNhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmMjI5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yZXBsaWNhdG9yL3JlcGxpY2F0b3IuYwpAQCAtMCwwICsxLDc5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAic2VndHlwZS5oIgorI2luY2x1ZGUgInRleHRfZXhwb3J0LmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2lmZGVmIERNRVZFTlRECisjICBpbmNsdWRlICJsaWJkZXZtYXBwZXItZXZlbnQuaCIKKyNlbmRpZgorCisvKiBEbSBrZXJuZWwgbW9kdWxlIG5hbWUgZm9yIHJlcGxpY2F0b3IgKi8KKyNkZWZpbmUgUkVQTElDQVRPUl9NT0RVTEUgInJlcGxpY2F0b3IiCisjZGVmaW5lIFJFUExJQ0FUT1JfREVWX01PRFVMRSAicmVwbGljYXRvci1kZXYiCisKKy8qCisgKiBNYWNybyB1c2VkIGFzIHJldHVybiBhcmd1bWVudCAtIHJldHVybnMgMC4KKyAqIHJldHVybiBpcyBsZWZ0IHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkuCisgKi8KKyNkZWZpbmUgU0VHX0xPR19FUlJPUih0LCBwLi4uKSBcCisJbG9nX2Vycm9yKHQgIiBzZWdtZW50ICVzIG9mIGxvZ2ljYWwgdm9sdW1lICVzLiIsICMjIHAsIFwKKwkJICBkbV9jb25maWdfcGFyZW50X25hbWUoc24pLCBzZWctPmx2LT5uYW1lKSwgMDsKKworCisvKgorICogIFJlcGxpY2F0b3IgdGFyZ2V0CisgKi8KKworLyogRklYTUU6IG1pc3NpbmcgaW1wbGVtZW50YXRpb24gKi8KK3N0YXRpYyB2b2lkIF9yZXBsaWNhdG9yX2Rpc3BsYXkoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZykKK3sKKwkvL2NvbnN0IGNoYXIgKnNpemU7CisJLy91aW50MzJfdCBzOworCisJbG9nX3ByaW50KCIgIFJlcGxpY2F0b3IiKTsKKwlpZiAoc2VnLT5ybG9nX2x2KQorCQlsb2dfcHJpbnQoIiAgUmVwbGljYXRvciB2b2x1bWVcdCVzIiwgc2VnLT5ybG9nX2x2LT5uYW1lKTsKK30KKworLyogV3JhcHBlciBmb3IgZG1fY29uZmlnX2dldF91aW50MzIoKSB3aXRoIGRlZmF1bHQgdmFsdWUgKi8KK3N0YXRpYyB1aW50MzJfdCBfZ2V0X2NvbmZpZ191aW50MzIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwKKwkJCQkgICBjb25zdCBjaGFyICpwYXRoLAorCQkJCSAgIHVpbnQzMl90IGRlZikKK3sKKwl1aW50MzJfdCB0OworCisJcmV0dXJuIGRtX2NvbmZpZ19nZXRfdWludDMyKGNuLCBwYXRoLCAmdCkgPyB0IDogZGVmOworfQorCisvKiBXcmFwcGVyIGZvciBkbV9jb25maWdfZ2V0X3VpbnQ2NCgpIHdpdGggZGVmYXVsdCB2YWx1ZSAqLworc3RhdGljIHVpbnQ2NF90IF9nZXRfY29uZmlnX3VpbnQ2NChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLAorCQkJCSAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJICAgdWludDY0X3QgZGVmKQoreworCXVpbnQ2NF90IHQ7CisKKwlyZXR1cm4gZG1fY29uZmlnX2dldF91aW50NjQoY24sIHBhdGgsICZ0KSA/IHQgOiBkZWY7Cit9CisKKworLyogU3RyaW5ncyByZXBsaWNhdG9yX3N0YXRlX3QgZW51bSAqLworc3RhdGljIGNvbnN0IGNoYXIgX3N0YXRlX3R4dFtOVU1fUkVQTElDQVRPUl9TVEFURV1bOF0gPSB7CisJInBhc3NpdmUiLAorCSJhY3RpdmUiCit9OworCisvKiBQYXJzZSBzdGF0ZSBzdHJpbmcgKi8KK3N0YXRpYyByZXBsaWNhdG9yX3N0YXRlX3QgX2dldF9zdGF0ZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkJCSAgICAgY29uc3QgY2hhciAqcGF0aCwgcmVwbGljYXRvcl9zdGF0ZV90IGRlZikKK3sKKwljb25zdCBjaGFyICpzdHI7CisJdW5zaWduZWQgaTsKKworCWlmIChkbV9jb25maWdfZ2V0X3N0cihzbiwgcGF0aCwgJnN0cikpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihfc3RhdGVfdHh0KS9zaXplb2YoX3N0YXRlX3R4dFswXSk7ICsraSkKKwkJCWlmIChzdHJjYXNlY21wKHN0ciwgX3N0YXRlX3R4dFtpXSkgPT0gMCkKKwkJCQlyZXR1cm4gKHJlcGxpY2F0b3Jfc3RhdGVfdCkgaTsKKworCQlsb2dfd2FybigiJXM6IHVua25vd24gdmFsdWUgJyVzJywgdXNpbmcgZGVmYXVsdCAnJXMnIHN0YXRlIiwKKwkJCSBwYXRoLCBzdHIsIF9zdGF0ZV90eHRbZGVmXSk7CisJfQorCisJcmV0dXJuIGRlZjsKK30KKworLyogU3RyaW5ncyBmb3IgcmVwbGljYXRvcl9hY3Rpb25fdCBlbnVtICovCitzdGF0aWMgY29uc3QgY2hhciBfb3BfbW9kZV90eHRbTlVNX0RNX1JFUExJQ0FUT1JfTU9ERVNdWzhdID0geworCSJzeW5jIiwKKwkid2FybiIsCisJInN0YWxsIiwKKwkiZHJvcCIsCisJImZhaWwiCit9OworCisKKy8qIFBhcnNlIGFjdGlvbiBzdHJpbmcgKi8KK3N0YXRpYyBkbV9yZXBsaWNhdG9yX21vZGVfdCBfZ2V0X29wX21vZGUoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCQkJIGNvbnN0IGNoYXIgKnBhdGgsIGRtX3JlcGxpY2F0b3JfbW9kZV90IGRlZikKK3sKKwljb25zdCBjaGFyICpzdHI7CisJdW5zaWduZWQgaTsKKworCWlmIChkbV9jb25maWdfZ2V0X3N0cihzbiwgcGF0aCwgJnN0cikpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihfb3BfbW9kZV90eHQpL3NpemVvZihfb3BfbW9kZV90eHRbMF0pOyArK2kpCisJCQlpZiAoc3RyY2FzZWNtcChzdHIsIF9vcF9tb2RlX3R4dFtpXSkgPT0gMCkgeworCQkJCWxvZ192ZXJ5X3ZlcmJvc2UoIlNldHRpbmcgJXMgdG8gJXMiLAorCQkJCQkJIHBhdGgsIF9vcF9tb2RlX3R4dFtpXSk7CisJCQkJcmV0dXJuIChkbV9yZXBsaWNhdG9yX21vZGVfdCkgaTsKKwkJCX0KKwkJbG9nX3dhcm4oIiVzOiB1bmtub3duIHZhbHVlICclcycsIHVzaW5nIGRlZmF1bHQgJyVzJyBvcGVyYXRpb24gbW9kZSIsCisJCQkgcGF0aCwgc3RyLCBfb3BfbW9kZV90eHRbZGVmXSk7CisJfQorCisJcmV0dXJuIGRlZjsKK30KKworc3RhdGljIHN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKl9nZXRfc2l0ZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJlcGxpY2F0b3IsCisJCQkJCSBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IHJlcGxpY2F0b3ItPnZnLT52Z21lbTsKKwlzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlICpyc2l0ZTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnJlcGxpY2F0b3ItPnJzaXRlcykKKwkJaWYgKHN0cmNhc2VjbXAocnNpdGUtPm5hbWUsIGtleSkgPT0gMCkKKwkJCXJldHVybiByc2l0ZTsKKworCWlmICghKHJzaXRlID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnJzaXRlKSkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghKHJzaXRlLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBrZXkpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyc2l0ZS0+cmVwbGljYXRvciA9IHJlcGxpY2F0b3I7CisJZG1fbGlzdF9pbml0KCZyc2l0ZS0+cmRldmljZXMpOworCWRtX2xpc3RfYWRkKCZyZXBsaWNhdG9yLT5yc2l0ZXMsICZyc2l0ZS0+bGlzdCk7CisKKwlyZXR1cm4gcnNpdGU7Cit9CisKKworLyogUGFyc2UgcmVwbGljYXRvciBzaXRlIGVsZW1lbnQgKi8KK3N0YXRpYyBpbnQgX2FkZF9zaXRlKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCSAgICAgY29uc3QgY2hhciAqa2V5LAorCQkgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24pCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IHNlZy0+bHYtPnZnLT52Z21lbTsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJaWYgKCEocnNpdGUgPSBfZ2V0X3NpdGUoc2VnLT5sdiwga2V5KSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9jb25maWdfZmluZF9ub2RlKHNuLCAic2l0ZV9pbmRleCIpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiTWFuZGF0b3J5IHNpdGVfaW5kZXggaXMgbWlzc2luZyBmb3IiKTsKKworCXJzaXRlLT5zdGF0ZSA9IF9nZXRfc3RhdGUoc24sICJzdGF0ZSIsIFJFUExJQ0FUT1JfU1RBVEVfUEFTU0lWRSk7CisJcnNpdGUtPnNpdGVfaW5kZXggPSBfZ2V0X2NvbmZpZ191aW50MzIoc24sICJzaXRlX2luZGV4IiwgMCk7CisJaWYgKHJzaXRlLT5zaXRlX2luZGV4ID4gc2VnLT5yc2l0ZV9pbmRleF9oaWdoZXN0KQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigic2l0ZV9pbmRleD0lZCA+IGhpZ2hlc3Rfc2l0ZV9pbmRleD0lZCBmb3IiLAorCQkJCSAgICAgcnNpdGUtPnNpdGVfaW5kZXgsIHNlZy0+cnNpdGVfaW5kZXhfaGlnaGVzdCk7CisKKwlyc2l0ZS0+ZmFsbF9iZWhpbmRfZGF0YSA9IF9nZXRfY29uZmlnX3VpbnQ2NChzbiwgImZhbGxfYmVoaW5kX2RhdGEiLCAwKTsKKwlyc2l0ZS0+ZmFsbF9iZWhpbmRfaW9zID0gX2dldF9jb25maWdfdWludDMyKHNuLCAiZmFsbF9iZWhpbmRfaW9zIiwgMCk7CisJcnNpdGUtPmZhbGxfYmVoaW5kX3RpbWVvdXQgPSBfZ2V0X2NvbmZpZ191aW50MzIoc24sICJmYWxsX2JlaGluZF90aW1lb3V0IiwgMCk7CisJcnNpdGUtPm9wX21vZGUgPSBETV9SRVBMSUNBVE9SX1NZTkM7CisKKwlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEgfHwKKwkgICAgcnNpdGUtPmZhbGxfYmVoaW5kX2lvcyB8fAorCSAgICByc2l0ZS0+ZmFsbF9iZWhpbmRfdGltZW91dCkgeworCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEgJiYgcnNpdGUtPmZhbGxfYmVoaW5kX2lvcykKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJEZWZpbmVkIGJvdGggZmFsbF9iZWhpbmRfZGF0YSAiCisJCQkJCSAgICAgImFuZCBmYWxsX2JlaGluZF9pb3MgaW4iKTsKKworCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEgJiYgcnNpdGUtPmZhbGxfYmVoaW5kX3RpbWVvdXQpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiRGVmaW5lZCBib3RoIGZhbGxfYmVoaW5kX2RhdGEgIgorCQkJCQkgICAgICJhbmQgZmFsbF9iZWhpbmRfdGltZW91dCBpbiIpOworCisJCWlmIChyc2l0ZS0+ZmFsbF9iZWhpbmRfaW9zICYmIHJzaXRlLT5mYWxsX2JlaGluZF90aW1lb3V0KQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkRlZmluZWQgYm90aCBmYWxsX2JlaGluZF9pb3MgIgorCQkJCQkgICAgICJhbmQgZmFsbF9iZWhpbmRfdGltZW91dCBpbiIpOworCisJCXJzaXRlLT5vcF9tb2RlID0gX2dldF9vcF9tb2RlKHNuLCAib3BlcmF0aW9uX21vZGUiLAorCQkJCQkgICAgICByc2l0ZS0+b3BfbW9kZSk7CisJfQorCisJaWYgKChjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoc24sICJ2b2x1bWVfZ3JvdXAiKSkpIHsKKwkJaWYgKCFjbi0+diB8fCBjbi0+di0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoInZvbHVtZV9ncm91cCBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisKKwkJaWYgKCEocnNpdGUtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIGNuLT52LT52LnN0cikpKQorCQkJcmV0dXJuXzA7CisKKwl9IGVsc2UgaWYgKHJzaXRlLT5zaXRlX2luZGV4ICE9IDApCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJ2b2x1bWVfZ3JvdXAgaXMgbWFuZGF0b3J5IGZvciByZW1vdGUgc2l0ZSBpbiIpOworCisJcmV0dXJuIDE7Cit9CisKKworLyogSW1wb3J0IHJlcGxpY2F0b3Igc2VnbWVudCAqLworc3RhdGljIGludCBfcmVwbGljYXRvcl90ZXh0X2ltcG9ydChzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQkJICAgc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2ggX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnJsb2dfbHY7CisKKwlpZiAoIXJlcGxpY2F0b3JfYWRkX3JlcGxpY2F0b3JfZGV2KHNlZy0+bHYsIE5VTEwpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShzbiwgInJlcGxpY2F0b3JfbG9nIikpIHx8CisJICAgICFjbi0+diB8fCBjbi0+di0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiUmVwbGljYXRvciBsb2cgdHlwZSBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisKKwlpZiAoIShybG9nX2x2ID0gZmluZF9sdihzZWctPmx2LT52ZywgY24tPnYtPnYuc3RyKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJVbmtub3duIHJlcGxpY2F0b3IgbG9nICVzIGluIiwKKwkJCQkgICAgIGNuLT52LT52LnN0cik7CisKKwlpZiAoIShjbiA9IGRtX2NvbmZpZ19maW5kX25vZGUoc24sICJyZXBsaWNhdG9yX2xvZ190eXBlIikpIHx8CisJICAgICFjbi0+diB8fCBjbi0+di0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiUmVwbGljYXRvciBsb2cncyB0eXBlIG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKwlpZiAoc3RyY2FzZWNtcChjbi0+di0+di5zdHIsICJyaW5nYnVmZmVyIikpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJPbmx5IHJpbmdidWZmZXIgcmVwbGljYXRvciBsb2cgdHlwZSBpcyBzdXBwb3J0ZWQgaW4iKTsKKworCWlmICghKHNlZy0+cmxvZ190eXBlID0gZG1fcG9vbF9zdHJkdXAoc2VnLT5sdi0+dmctPnZnbWVtLCBjbi0+di0+di5zdHIpKSkKKwkJcmV0dXJuXzA7CisKKworCWxvZ192ZXJ5X3ZlcmJvc2UoInJlcGxpY2F0b3JfbG9nID0gJXMiLCBybG9nX2x2LT5uYW1lKTsKKwlsb2dfdmVyeV92ZXJib3NlKCJyZXBsaWNhdG9yX2xvZ190eXBlID0gJXMiLCBzZWctPnJsb2dfdHlwZSk7CisKKwlpZiAoIXJlcGxpY2F0b3JfYWRkX3Jsb2coc2VnLCBybG9nX2x2KSkKKwkJcmV0dXJuXzA7CisKKwlzZWctPnJkZXZpY2VfaW5kZXhfaGlnaGVzdCA9IF9nZXRfY29uZmlnX3VpbnQ2NChzbiwgImhpZ2hlc3RfZGV2aWNlX2luZGV4IiwgMCk7CisJc2VnLT5yc2l0ZV9pbmRleF9oaWdoZXN0ID0gX2dldF9jb25maWdfdWludDMyKHNuLCAiaGlnaGVzdF9zaXRlX2luZGV4IiwgMCk7CisKKwlzZWctPnJlZ2lvbl9zaXplID0gX2dldF9jb25maWdfdWludDMyKHNuLCAic3luY19sb2dfc2l6ZSIsIDApOworCisJZm9yICg7IHNuOyBzbiA9IHNuLT5zaWIpCisJCWlmICghc24tPnYpIHsKKwkJCWZvciAoY24gPSBzbi0+c2liOyBjbjsgY24gPSBjbi0+c2liKQorCQkJCWlmICghY24tPnYgJiYgKHN0cmNhc2VjbXAoY24tPmtleSAsc24tPmtleSkgPT0gMCkpCisJCQkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJEZXRlY3RlZCBkdXBsaWNhdGUgc2l0ZSAiCisJCQkJCQkJICAgICAibmFtZSAlcyBpbiIsIHNuLT5rZXkpOworCQkJaWYgKCFfYWRkX3NpdGUoc2VnLCBzbi0+a2V5LCBzbi0+Y2hpbGQpKQorCQkJCXJldHVybl8wOworCQl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEV4cG9ydCByZXBsaWNhdG9yIHNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfdGV4dF9leHBvcnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJaWYgKCFzZWctPnJsb2dfbHYpCisgICAgICAgICAgICAgICAgcmV0dXJuXzA7CisKKwlvdXRmKGYsICJyZXBsaWNhdG9yX2xvZyA9IFwiJXNcIiIsIHNlZy0+cmxvZ19sdi0+bmFtZSk7CisJb3V0ZihmLCAicmVwbGljYXRvcl9sb2dfdHlwZSA9IFwiJXNcIiIsIHNlZy0+cmxvZ190eXBlKTsKKwlvdXRmKGYsICJoaWdoZXN0X2RldmljZV9pbmRleCA9ICUiIFBSSXU2NCwgc2VnLT5yZGV2aWNlX2luZGV4X2hpZ2hlc3QpOworCW91dGYoZiwgImhpZ2hlc3Rfc2l0ZV9pbmRleCA9ICVkIiwgc2VnLT5yc2l0ZV9pbmRleF9oaWdoZXN0KTsKKworCWlmIChzZWctPnJlZ2lvbl9zaXplKQorCQlvdXRzaXplKGYsICh1aW50NjRfdClzZWctPnJlZ2lvbl9zaXplLAorCQkJInN5bmNfbG9nX3NpemUgPSAlIiBQUkl1MzIsIHNlZy0+cmVnaW9uX3NpemUpOworCisJaWYgKCFkbV9saXN0X2VtcHR5KCZzZWctPmx2LT5yc2l0ZXMpKQorCQlvdXRubChmKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnNlZy0+bHYtPnJzaXRlcykgeworCQlvdXRmKGYsICIlcyB7IiwgcnNpdGUtPm5hbWUpOworCQlvdXRfaW5jX2luZGVudChmKTsKKworCQlvdXRmKGYsICJzdGF0ZSA9IFwiJXNcIiIsIF9zdGF0ZV90eHRbcnNpdGUtPnN0YXRlXSk7CisJCW91dGYoZiwgInNpdGVfaW5kZXggPSAlZCIsIHJzaXRlLT5zaXRlX2luZGV4KTsKKworCQkvKiBPbmx5IG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gKi8KKwkJaWYgKHJzaXRlLT5vcF9tb2RlICE9IERNX1JFUExJQ0FUT1JfU1lOQykKKwkJCW91dGYoZiwgIm9wZXJhdGlvbl9tb2RlID0gXCIlc1wiIiwKKwkJCSAgICAgX29wX21vZGVfdHh0W3JzaXRlLT5vcF9tb2RlXSk7CisJCWlmIChyc2l0ZS0+ZmFsbF9iZWhpbmRfdGltZW91dCkKKwkJCW91dGZjKGYsICIjIHNlY29uZHMiLCAiZmFsbF9iZWhpbmRfdGltZW91dCA9ICV1IiwKKwkJCSAgICAgcnNpdGUtPmZhbGxfYmVoaW5kX3RpbWVvdXQpOworCQlpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2lvcykKKwkJCW91dGZjKGYsICIjIGlvIG9wZXJhdGlvbnMiLCAiZmFsbF9iZWhpbmRfaW9zID0gJXUiLAorCQkJICAgICByc2l0ZS0+ZmFsbF9iZWhpbmRfaW9zKTsKKwkJaWYgKHJzaXRlLT5mYWxsX2JlaGluZF9kYXRhKQorCQkJb3V0c2l6ZShmLCByc2l0ZS0+ZmFsbF9iZWhpbmRfZGF0YSwgImZhbGxfYmVoaW5kX2RhdGEgPSAlIiBQUkl1NjQsCisJCQkJcnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEpOworCQlpZiAocnNpdGUtPnN0YXRlICE9IFJFUExJQ0FUT1JfU1RBVEVfQUNUSVZFICYmIHJzaXRlLT52Z19uYW1lKQorCQkJb3V0ZihmLCAidm9sdW1lX2dyb3VwID0gXCIlc1wiIiwgcnNpdGUtPnZnX25hbWUpOworCisJCW91dF9kZWNfaW5kZW50KGYpOworCQlvdXRmKGYsICJ9Iik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfcmVwbGljYXRvcl9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgIHZvaWQgKip0YXJnZXRfc3RhdGUsCisJCQkJICAgICAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsCisJCQkJICAgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgICAgIHVpbnQ2NF90IGxlbiwKKwkJCQkgICAgICAgdWludDMyX3QgKnB2bW92ZV9taXJyb3JfY291bnQpCit7CisJY29uc3QgY2hhciAqcmxvZ19kbGlkOworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJaWYgKCFzZWctPnJsb2dfbHYpCisJCXJldHVybl8wOworCisJaWYgKCEocmxvZ19kbGlkID0gYnVpbGRfZG1fdXVpZChtZW0sIHNlZy0+cmxvZ19sdiwgTlVMTCkpKQorCQlyZXR1cm5fMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnNlZy0+bHYtPnJzaXRlcykgeworCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfcmVwbGljYXRvcl90YXJnZXQobm9kZSwKKwkJCQkJCQlzZWctPnJsb2dfbHYtPnNpemUsCisJCQkJCQkJcmxvZ19kbGlkLAorCQkJCQkJCXNlZy0+cmxvZ190eXBlLAorCQkJCQkJCXJzaXRlLT5zaXRlX2luZGV4LAorCQkJCQkJCXJzaXRlLT5vcF9tb2RlLAorCQkJCQkJCXJzaXRlLT5mYWxsX2JlaGluZF90aW1lb3V0LAorCQkJCQkJCXJzaXRlLT5mYWxsX2JlaGluZF9kYXRhLAorCQkJCQkJCXJzaXRlLT5mYWxsX2JlaGluZF9pb3MpKSB7CisJCQlpZiAocnNpdGUtPnNpdGVfaW5kZXggPT0gMCkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCByZXBsaWNhdG9yIGxvZyAnJXMnICIKKwkJCQkJICAidG8gcmVwbGljYXRvciAnJXMnLiIsCisJCQkJCSAgcmxvZ19kbGlkLCBzZWctPmx2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8vIEZJWE1FOgorCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEZJWE1FOiB3cml0ZSBzb21ldGhpbmcgdXNlZnVsIGZvciByZXBsaWNhdG9yIGhlcmUgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfdGFyZ2V0X3BlcmNlbnQodm9pZCAqKnRhcmdldF9zdGF0ZSwKKwkJCQkgICAgICBkbV9wZXJjZW50X3QgKnBlcmNlbnQsCisJCQkJICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgICBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICAgIGNoYXIgKnBhcmFtcywgdWludDY0X3QgKnRvdGFsX251bWVyYXRvciwKKwkJCQkgICAgICB1aW50NjRfdCAqdG90YWxfZGVub21pbmF0b3IpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIENoZWNrIGZvciBtb2R1bGUgcHJlc2VuY2UgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfdGFyZ2V0X3ByZXNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgICB1bnNpZ25lZCAqYXR0cmlidXRlcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdGF0aWMgaW50IF9jaGVja2VkID0gMDsKKwlzdGF0aWMgaW50IF9wcmVzZW50ID0gMDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWlmICghX2NoZWNrZWQpIHsKKwkJX2NoZWNrZWQgPSAxOworCQlfcHJlc2VudCA9IHRhcmdldF9wcmVzZW50KGNtZCwgUkVQTElDQVRPUl9NT0RVTEUsIDEpOworCX0KKworCXJldHVybiBfcHJlc2VudDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfbW9kdWxlc19uZWVkZWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICptb2R1bGVzKQoreworCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgbW9kdWxlcywgUkVQTElDQVRPUl9NT0RVTEUpKQorCQlyZXR1cm5fMDsKKworCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgbW9kdWxlcywgUkVQTElDQVRPUl9ERVZfTU9EVUxFKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3JlcGxpY2F0b3JfZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoc2VndHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF9yZXBsaWNhdG9yX29wcyA9IHsKKwkuZGlzcGxheSA9IF9yZXBsaWNhdG9yX2Rpc3BsYXksCisJLnRleHRfaW1wb3J0ID0gX3JlcGxpY2F0b3JfdGV4dF9pbXBvcnQsCisJLnRleHRfZXhwb3J0ID0gX3JlcGxpY2F0b3JfdGV4dF9leHBvcnQsCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwkuYWRkX3RhcmdldF9saW5lID0gX3JlcGxpY2F0b3JfYWRkX3RhcmdldF9saW5lLAorCS50YXJnZXRfcGVyY2VudCA9IF9yZXBsaWNhdG9yX3RhcmdldF9wZXJjZW50LAorCS50YXJnZXRfcHJlc2VudCA9IF9yZXBsaWNhdG9yX3RhcmdldF9wcmVzZW50LAorI2VuZGlmCisJLm1vZHVsZXNfbmVlZGVkID0gX3JlcGxpY2F0b3JfbW9kdWxlc19uZWVkZWQsCisJLmRlc3Ryb3kgPSBfcmVwbGljYXRvcl9kZXN0cm95LAorfTsKKworLyoKKyAqICBSZXBsaWNhdG9yLWRldiAgdGFyZ2V0CisgKi8KK3N0YXRpYyB2b2lkIF9yZXBsaWNhdG9yX2Rldl9kaXNwbGF5KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJLy9jb25zdCBjaGFyICpzaXplOworCS8vdWludDMyX3QgczsKKwkvLyBGSVhNRTogZGVidWcgdGVzdCBjb2RlIGZvciBub3cKKwlsb2dfcHJpbnQoIiAgUmVwbGljYXRvclx0XHQldSIsIHNlZy0+YXJlYV9jb3VudCk7CisJbG9nX3ByaW50KCIgIE1pcnJvciBzaXplXHRcdCV1Iiwgc2VnLT5hcmVhX2xlbik7CisJaWYgKHNlZy0+bG9nX2x2KQorCQlsb2dfcHJpbnQoIiAgUmVwbGljYXRvciBsb2cgdm9sdW1lXHQlcyIsIHNlZy0+cmxvZ19sdi0+bmFtZSk7CisKK30KKworc3RhdGljIGludCBfYWRkX2RldmljZShzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkgICAgICAgY29uc3QgY2hhciAqc2l0ZV9uYW1lLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJICAgICAgIHVpbnQ2NF90IGRldmlkeCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gc2VnLT5sdi0+dmctPnZnbWVtOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc2xvZ19sdiA9IE5VTEw7CisJc3RydWN0IHJlcGxpY2F0b3Jfc2l0ZSAqcnNpdGUgPSBfZ2V0X3NpdGUoc2VnLT5yZXBsaWNhdG9yLCBzaXRlX25hbWUpOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldjsKKwljb25zdCBjaGFyICpkZXZfc3RyID0gTlVMTDsKKwljb25zdCBjaGFyICpzbG9nX3N0ciA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyZGV2LCAmcnNpdGUtPnJkZXZpY2VzKQorCQlpZiAocmRldi0+cmVwbGljYXRvcl9kZXYgPT0gc2VnKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkR1cGxpY2F0ZSBzaXRlIGZvdW5kIGluIik7CisKKwlpZiAoKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShzbiwgInN5bmNfbG9nIikpKSB7CisJCWlmICghY24tPnYgfHwgIWNuLT52LT52LnN0cikKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJTeW5jIGxvZyBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisJCXNsb2dfc3RyID0gY24tPnYtPnYuc3RyOworCX0KKworCWlmICghKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShzbiwgImxvZ2ljYWxfdm9sdW1lIikpIHx8CisJICAgICFjbi0+diB8fCAhY24tPnYtPnYuc3RyKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiTG9naWNhbCB2b2x1bWUgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCisJZGV2X3N0ciA9IGNuLT52LT52LnN0cjsKKworCWlmICghc2VnLT5sdi0+cmRldmljZSkgeworCQlpZiAoc2xvZ19zdHIpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiU3luYyBsb2cgJXMgZGVmaW5lZCBmb3IgbG9jYWwgIgorCQkJCQkgICAgICJkZXZpY2UgaW4iLCBzbG9nX3N0cik7CisKKwkJLyogQ2hlY2sgZm9yIGRldmljZSBpbiBjdXJyZW50IFZHICovCisJCWlmICghKGx2ID0gZmluZF9sdihzZWctPmx2LT52ZywgZGV2X3N0cikpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkxvZ2ljYWwgdm9sdW1lICVzIG5vdCBmb3VuZCBpbiIsCisJCQkJCSAgICAgZGV2X3N0cik7CisJfSBlbHNlIHsKKwkJaWYgKCFzbG9nX3N0cikKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJTeW5jIGxvZyBpcyBtaXNzaW5nIGZvciByZW1vdGUgIgorCQkJCQkgICAgICJkZXZpY2UgaW4iKTsKKwkJLyogQ2hlY2sgZm9yIHNsb2cgZGV2aWNlIGluIGN1cnJlbnQgVkcgKi8KKwkJaWYgKCEoc2xvZ19sdiA9IGZpbmRfbHYoc2VnLT5sdi0+dmcsIHNsb2dfc3RyKSkpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiU3luYyBsb2cgJXMgbm90IGZvdW5kIGluIiwKKwkJCQkJICAgICBzbG9nX3N0cik7CisJfQorCisJaWYgKCEocmRldiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpyZGV2KSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJkZXYtPm5hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIGRldl9zdHIpKSkKKwkJcmV0dXJuXzA7CisKKwlyZGV2LT5yZXBsaWNhdG9yX2RldiA9IHNlZzsKKwlyZGV2LT5yc2l0ZSA9IHJzaXRlOworCXJkZXYtPmRldmljZV9pbmRleCA9IGRldmlkeDsKKworCWlmICghc2VnLT5sdi0+cmRldmljZSkgeworCQlpZiAoIXJlcGxpY2F0b3JfZGV2X2FkZF9yaW1hZ2UocmRldiwgbHYpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkxWIGluY29uc2lzdGVuY3kgZm91bmQgaW4iKTsKKwkJc2VnLT5sdi0+cmRldmljZSA9IHJkZXY7CisJfSBlbHNlIHsKKwkJaWYgKCFzbG9nX3N0ciB8fAorCQkgICAgIShyZGV2LT5zbG9nX25hbWUgPSBkbV9wb29sX3N0cmR1cChtZW0sIHNsb2dfc3RyKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIXJlcGxpY2F0b3JfZGV2X2FkZF9zbG9nKHJkZXYsIHNsb2dfbHYpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlN5bmMgbG9nIGluY29uc2lzdGVuY3kgZm91bmQgaW4iKTsKKwl9CisKKwlkbV9saXN0X2FkZCgmcnNpdGUtPnJkZXZpY2VzLCAmcmRldi0+bGlzdCk7Ly8gbGlua2VkIHNpdGUgbGlzdAorCisJcmV0dXJuIDE7Cit9CisKKy8qIEltcG9ydCByZXBsaWNhdG9yIHNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfZGV2X3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQkJICAgICAgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpyZXBsaWNhdG9yOworCXVpbnQ2NF90IGRldmlkeDsKKworCWlmICghKGNuID0gZG1fY29uZmlnX2ZpbmRfbm9kZShzbiwgInJlcGxpY2F0b3IiKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJSZXBsaWNhdG9yIGlzIG1pc3NpbmcgZm9yIik7CisKKwlpZiAoIWNuLT52IHx8ICFjbi0+di0+di5zdHIpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJSZXBsaWNhdG9yIG11c3QgYmUgYSBzdHJpbmcgZm9yIik7CisKKwlpZiAoIShyZXBsaWNhdG9yID0gZmluZF9sdihzZWctPmx2LT52ZywgY24tPnYtPnYuc3RyKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJVbmtub3duIHJlcGxpY2F0b3IgJXMgZm9yIiwgY24tPnYtPnYuc3RyKTsKKworCWlmICghcmVwbGljYXRvcl9hZGRfcmVwbGljYXRvcl9kZXYocmVwbGljYXRvciwgc2VnKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJyZXBsaWNhdG9yPSVzIiwgcmVwbGljYXRvci0+bmFtZSk7CisKKwkvKiBNYW5kYXRvcnkgKi8KKwlpZiAoIWRtX2NvbmZpZ19maW5kX25vZGUoc24sICJkZXZpY2VfaW5kZXgiKSB8fAorCSAgICAhZG1fY29uZmlnX2dldF91aW50NjQoc24sICJkZXZpY2VfaW5kZXgiLCAmZGV2aWR4KSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkNvdWxkIG5vdCByZWFkICdkZXZpY2VfaW5kZXgnIGZvciIpOworCisJLyogUmVhZCBkZXZpY2VzIGZyb20gc2l0ZXMgKi8KKwlmb3IgKDsgc247IHNuID0gc24tPnNpYikKKwkJaWYgKCEoc24tPnYpICYmICFfYWRkX2RldmljZShzZWcsIHNuLT5rZXksIHNuLT5jaGlsZCwgZGV2aWR4KSkKKwkJCXJldHVybl8wOworCisJaWYgKCFzZWctPmx2LT5yZGV2aWNlKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiUmVwbGljYXRvciBkZXZpY2Ugd2l0aG91dCBzaXRlIGluIik7CisKKwlzZWctPnJsb2dfbHYgPSBOVUxMOworCXNlZy0+bHYtPnN0YXR1cyB8PSBSRVBMSUNBVE9SOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEV4cG9ydCByZXBsaWNhdG9yLWRldiBzZWdtZW50ICovCitzdGF0aWMgaW50IF9yZXBsaWNhdG9yX2Rldl90ZXh0X2V4cG9ydChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICAgICBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldjsKKworCWlmICghc2VnLT5yZXBsaWNhdG9yIHx8ICFzZWctPmx2LT5yZGV2aWNlKQorCQlyZXR1cm5fMDsKKworCW91dGYoZiwgInJlcGxpY2F0b3IgPSBcIiVzXCIiLCBzZWctPnJlcGxpY2F0b3ItPm5hbWUpOworCW91dGYoZiwgImRldmljZV9pbmRleCA9ICUiIFBSSWQ2NCwgc2VnLT5sdi0+cmRldmljZS0+ZGV2aWNlX2luZGV4KTsKKworCW91dG5sKGYpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlLCAmc2VnLT5yZXBsaWNhdG9yLT5yc2l0ZXMpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJkZXYsICZyc2l0ZS0+cmRldmljZXMpIHsKKwkJCWlmIChyZGV2LT5yZXBsaWNhdG9yX2RldiAhPSBzZWcpCisJCQkJY29udGludWU7CisKKwkJCW91dGYoZiwgIiVzIHsiLCByZGV2LT5yc2l0ZS0+bmFtZSk7CisKKwkJCW91dF9pbmNfaW5kZW50KGYpOworCisJCQlvdXRmKGYsICJsb2dpY2FsX3ZvbHVtZSA9IFwiJXNcIiIsCisJCQkgICAgIHJkZXYtPm5hbWUgPyByZGV2LT5uYW1lIDogcmRldi0+bHYtPm5hbWUpOworCisJCQlpZiAocmRldi0+c2xvZykKKwkJCQlvdXRmKGYsICJzeW5jX2xvZyA9IFwiJXNcIiIsIHJkZXYtPnNsb2ctPm5hbWUpOworCQkJZWxzZSBpZiAocmRldi0+c2xvZ19uYW1lKQorCQkJCW91dGYoZiwgInN5bmNfbG9nID0gXCIlc1wiIiwgcmRldi0+c2xvZ19uYW1lKTsKKworCQkJb3V0X2RlY19pbmRlbnQoZik7CisKKwkJCW91dGYoZiwgIn0iKTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKy8qCisgKiBBZGQgdGFyZ2V0IGZvciBwYXNzaXZlIHNpdGUgbWF0Y2hpbmcgdGhlIGRldmljZSBpbmRleAorICovCitzdGF0aWMgaW50IF9yZXBsaWNhdG9yX2Rldl9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkJICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkJICAgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgIHZvaWQgKip0YXJnZXRfc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsCisJCQkJCSAgIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCSAgIHVpbnQ2NF90IGxlbiwKKwkJCQkJICAgdWludDMyX3QgKnB2bW92ZV9taXJyb3JfY291bnQpCit7CisJY29uc3QgY2hhciAqcmVwbGljYXRvcl9kbGlkLCAqcmRldl9kbGlkLCAqc2xvZ19kbGlkOworCXN0cnVjdCByZXBsaWNhdG9yX2RldmljZSAqcmRldiwgKnJkZXZfc2VhcmNoOworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCXVpbnQzMl90IHNsb2dfc2l6ZTsKKwl1aW50MzJfdCBzbG9nX2ZsYWdzOworCisJaWYgKCFsdl9pc19hY3RpdmVfcmVwbGljYXRvcl9kZXYoc2VnLT5sdikpIHsKKwkJLyogQ3JlYXRlIHBhc3NpdmUgbGluZWFyIG1hcHBpbmcgKi8KKwkJbG9nX3ZlcnlfdmVyYm9zZSgiSW5hY3RpdmUgcmVwbGljYXRvciAlcyB1c2luZyAlcy4iLAorCQkJCSBzZWctPmx2LT5uYW1lLCBzZWctPmx2LT5yZGV2aWNlLT5sdi0+bmFtZSk7CisJCWlmICghYWRkX2xpbmVhcl9hcmVhX3RvX2R0cmVlKG5vZGUsIHNlZy0+bHYtPnNpemUsIHNlZy0+bHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkJICAgICAgY21kLT51c2VfbGluZWFyX3RhcmdldCwKKwkJCQkJICAgICAgc2VnLT5sdi0+dmctPm5hbWUsIHNlZy0+bHYtPm5hbWUpKQorCQkJcmV0dXJuXzA7CisJCWlmICghKHJkZXZfZGxpZCA9IGJ1aWxkX2RtX3V1aWQobWVtLCBzZWctPmx2LT5yZGV2aWNlLT5sdiwgTlVMTCkpKQorCQkJcmV0dXJuXzA7CisJCXJldHVybiBkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhKG5vZGUsIE5VTEwsIHJkZXZfZGxpZCwgMCk7CisJfSBlbHNlIGlmIChzZWctPmx2LT5yZGV2aWNlLT5yc2l0ZS0+c2l0ZV9pbmRleCkgeworCQlsb2dfZXJyb3IoIkFjdGl2ZSBzaXRlIHdpdGggc2l0ZV9pbmRleCAhPSAwICglcywgJWQpIiwKKwkJCSAgc2VnLT5sdi0+cmRldmljZS0+cnNpdGUtPm5hbWUsCisJCQkgIHNlZy0+bHYtPnJkZXZpY2UtPnJzaXRlLT5zaXRlX2luZGV4KTsKKwkJcmV0dXJuIDA7IC8qIFJlcGxpY2F0b3Igd2l0aG91dCBhbnkgYWN0aXZlIHNpdGUgKi8KKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgYWxsIGRldmljZXMgdGhhdCBoYXZlIHNvbWUgY29ubmVjdGlvbiB3aXRoIHJlcGxpY2F0b3IKKwkgKiBtdXN0IGJlIHByZXNlbnQgaW4gZG1fdHJlZQorCSAqLworCWlmICghc2VnX2lzX3JlcGxpY2F0b3JfZGV2KHNlZykgfHwKKwkgICAgIShyZXBsaWNhdG9yX2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgc2VnLT5yZXBsaWNhdG9yLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJLyogU2VsZWN0IHJlbW90ZSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgZGV2aWNlIGluZGV4ICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJzaXRlLCAmc2VnLT5yZXBsaWNhdG9yLT5yc2l0ZXMpIHsKKwkJaWYgKHJzaXRlLT5zaXRlX2luZGV4ID09IDApIHsKKwkJCS8qIExvY2FsIHNsaW5rMCBkZXZpY2UgKi8KKwkJCXJkZXYgPSBzZWctPmx2LT5yZGV2aWNlOworCQl9IGVsc2UgeworCQkJcmRldiA9IE5VTEw7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocmRldl9zZWFyY2gsICZyc2l0ZS0+cmRldmljZXMpIHsKKwkJCQlpZiAocmRldl9zZWFyY2gtPnJlcGxpY2F0b3JfZGV2ID09IHNlZykgeworCQkJCQlyZGV2ID0gcmRldl9zZWFyY2g7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFyZGV2KSB7CisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJyZGV2IGxpc3Qgbm90IGZvdW5kLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJaWYgKCFyZGV2LT5sdiB8fAorCQkgICAgIShyZGV2X2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgcmRldi0+bHYsIE5VTEwpKSkKKwkJCXJldHVybl8wOworCisJCXNsb2dfZGxpZCA9IE5VTEw7CisKKwkJLyogVXNpbmcgZWl0aGVyIGRpc2sgb3IgY29yZSAoaW4gbWVtb3J5KSBsb2cgKi8KKwkJaWYgKHJkZXYtPnNsb2cpIHsKKwkJCXNsb2dfZmxhZ3MgPSBETV9OT1NZTkM7CisJCQlzbG9nX3NpemUgPSAodWludDMyX3QpIHJkZXYtPnNsb2ctPnNpemU7CisJCQlpZiAoIShzbG9nX2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgcmRldi0+c2xvZywgTlVMTCkpKQorCQkJCXJldHVybl8wOworCQl9IGVsc2UgaWYgKHJkZXYtPnNsb2dfbmFtZSAmJgorCQkJICAgc3NjYW5mKHJkZXYtPnNsb2dfbmFtZSwgRk1UdTMyLCAmc2xvZ19zaXplKSA9PSAxKSB7CisJCQlzbG9nX2ZsYWdzID0gRE1fQ09SRUxPRyB8IERNX0ZPUkNFU1lOQzsKKwkJCWlmIChzbG9nX3NpemUgPT0gMCkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVzZSBlbXB0eSBjb3JlbG9nIHNpemUgIgorCQkJCQkgICJpbiByZXBsaWNhdG9yICclcycuIiwKKwkJCQkJICByc2l0ZS0+cmVwbGljYXRvci0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSAgeworCQkJc2xvZ19mbGFncyA9IERNX0NPUkVMT0cgfCBETV9GT1JDRVNZTkM7CisJCQlzbG9nX3NpemUgPSAwOyAvKiBOT0xPRyAqLworCQl9CisKKwkJaWYgKCFkbV90cmVlX25vZGVfYWRkX3JlcGxpY2F0b3JfZGV2X3RhcmdldChub2RlLAorCQkJCQkJCSAgICBzZWctPmx2LT5zaXplLAorCQkJCQkJCSAgICByZXBsaWNhdG9yX2RsaWQsCisJCQkJCQkJICAgIHNlZy0+bHYtPnJkZXZpY2UtPmRldmljZV9pbmRleCwKKwkJCQkJCQkgICAgcmRldl9kbGlkLAorCQkJCQkJCSAgICByc2l0ZS0+c2l0ZV9pbmRleCwKKwkJCQkJCQkgICAgc2xvZ19kbGlkLAorCQkJCQkJCSAgICBzbG9nX2ZsYWdzLAorCQkJCQkJCSAgICBzbG9nX3NpemUpKSB7CisJCQlyZXR1cm5fMDsKKwkJCS8qIEZJWE1FOiBoYW5kbGUgJ3N0YXRlID0gZHJvcHBlZCcgaW4gZnV0dXJlICovCisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRklYTUU6IHdyaXRlIHNvbWV0aGluZyB1c2VmdWwgZm9yIHJlcGxpY2F0b3ItZGV2IGhlcmUgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfZGV2X3RhcmdldF9wZXJjZW50KHZvaWQgKip0YXJnZXRfc3RhdGUsCisJCQkJCSAgZG1fcGVyY2VudF90ICpwZXJjZW50LAorCQkJCQkgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCSAgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkJICBjaGFyICpwYXJhbXMsCisJCQkJCSAgdWludDY0X3QgKnRvdGFsX251bWVyYXRvciwKKwkJCQkJICB1aW50NjRfdCAqdG90YWxfZGVub21pbmF0b3IpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIENoZWNrIGZvciBtb2R1bGUgcHJlc2VuY2UgKi8KK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfZGV2X3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSAgdW5zaWduZWQgKmF0dHJpYnV0ZXMgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RhdGljIGludCBfY2hlY2tlZCA9IDA7CisJc3RhdGljIGludCBfcHJlc2VudCA9IDA7CisKKwlpZiAoIV9jaGVja2VkKSB7CisJCV9wcmVzZW50ID0gdGFyZ2V0X3ByZXNlbnQoY21kLCBSRVBMSUNBVE9SX0RFVl9NT0RVTEUsIDEpOworCQlfY2hlY2tlZCA9IDE7CisJfQorCisJcmV0dXJuIF9wcmVzZW50OworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX3JlcGxpY2F0b3JfZGV2X29wcyA9IHsKKwkuZGlzcGxheSA9IF9yZXBsaWNhdG9yX2Rldl9kaXNwbGF5LAorCS50ZXh0X2ltcG9ydCA9IF9yZXBsaWNhdG9yX2Rldl90ZXh0X2ltcG9ydCwKKwkudGV4dF9leHBvcnQgPSBfcmVwbGljYXRvcl9kZXZfdGV4dF9leHBvcnQsCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwkuYWRkX3RhcmdldF9saW5lID0gX3JlcGxpY2F0b3JfZGV2X2FkZF90YXJnZXRfbGluZSwKKwkudGFyZ2V0X3BlcmNlbnQgPSBfcmVwbGljYXRvcl9kZXZfdGFyZ2V0X3BlcmNlbnQsCisJLnRhcmdldF9wcmVzZW50ID0gX3JlcGxpY2F0b3JfZGV2X3RhcmdldF9wcmVzZW50LAorI2VuZGlmCisJLm1vZHVsZXNfbmVlZGVkID0gX3JlcGxpY2F0b3JfbW9kdWxlc19uZWVkZWQsCisJLmRlc3Ryb3kgPSBfcmVwbGljYXRvcl9kZXN0cm95LAorfTsKKworI2lmZGVmIFJFUExJQ0FUT1JfSU5URVJOQUwKK2ludCBpbml0X3JlcGxpY2F0b3Jfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKQorI2Vsc2UgLyogU2hhcmVkICovCitpbnQgaW5pdF9tdWx0aXBsZV9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICpzZWdsaWIpOworaW50IGluaXRfbXVsdGlwbGVfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHNlZ3R5cGVfbGlicmFyeSAqc2VnbGliKQorI2VuZGlmCit7CisJc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZTsKKworCWlmICghKHNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSkpKQorCQlyZXR1cm5fMDsKKworCXNlZ3R5cGUtPm9wcyA9ICZfcmVwbGljYXRvcl9vcHM7CisJc2VndHlwZS0+bmFtZSA9IFJFUExJQ0FUT1JfTU9EVUxFOworCXNlZ3R5cGUtPnByaXZhdGUgPSBOVUxMOworCXNlZ3R5cGUtPmZsYWdzID0gU0VHX1JFUExJQ0FUT1I7CisKKwlpZiAoIWx2bV9yZWdpc3Rlcl9zZWd0eXBlKHNlZ2xpYiwgc2VndHlwZSkpCisJCS8qIHNlZ3R5cGUgaXMgYWxyZWFkeSBkZXN0cm95ZWQgKi8KKwkJcmV0dXJuXzA7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBzZWd0eXBlOiAiIFJFUExJQ0FUT1JfTU9EVUxFKTsKKworCWlmICghKHNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSkpKQorCQlyZXR1cm5fMDsKKworCXNlZ3R5cGUtPm9wcyA9ICZfcmVwbGljYXRvcl9kZXZfb3BzOworCXNlZ3R5cGUtPm5hbWUgPSBSRVBMSUNBVE9SX0RFVl9NT0RVTEU7CisJc2VndHlwZS0+cHJpdmF0ZSA9IE5VTEw7CisJc2VndHlwZS0+ZmxhZ3MgPSBTRUdfUkVQTElDQVRPUl9ERVY7CisKKwlpZiAoIWx2bV9yZWdpc3Rlcl9zZWd0eXBlKHNlZ2xpYiwgc2VndHlwZSkpCisJCS8qIHNlZ3R5cGUgaXMgYWxyZWFkeSBkZXN0cm95ZWQgKi8KKwkJcmV0dXJuXzA7CisKKwlsb2dfdmVyeV92ZXJib3NlKCJJbml0aWFsaXNlZCBzZWd0eXBlOiAiIFJFUExJQ0FUT1JfREVWX01PRFVMRSk7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9yZXBvcnQvY29sdW1ucy1jbWRsb2cuaCBiL2xpYi9yZXBvcnQvY29sdW1ucy1jbWRsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQ3ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JlcG9ydC9jb2x1bW5zLWNtZGxvZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBmaWVsZHMgKGNvbHVtbnMpIGZvciB0aGUgY29tbWFuZCBsb2cgcmVwb3J0aW5nLgorICoKKyAqIFRoZSBwcmVmZXJyZWQgb3JkZXIgb2YgdGhlIGZpZWxkIGRlc2NyaXB0aW9ucyBpbiB0aGUgaGVscCB0ZXh0CisgKiBkZXRlcm1pbmVzIHRoZSBvcmRlciB0aGUgZW50cmllcyBhcHBlYXIgaW4gdGhpcyBmaWxlLgorICoKKyAqIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzIHRha2UgY2FyZSB0byB1c2UgdGhlIGV4aXN0aW5nIHN0eWxlLgorICogRGlzcGxheWVkIGZpZWxkcyBuYW1lcyBub3JtYWxseSBoYXZlIGEgdHlwZSBwcmVmaXggYW5kIHVzZSB1bmRlcnNjb3Jlcy4KKyAqIEZpZWxkLXNwZWNpZmljIGludGVybmFsIGZ1bmN0aW9ucyBuYW1lcyBub3JtYWxseSBtYXRjaCB0aGUgZGlzcGxheWVkCisgKiBmaWVsZCBuYW1lcyBidXQgd2l0aG91dCB1bmRlcnNjb3Jlcy4KKyAqIEhlbHAgdGV4dCBlbmRzIHdpdGggYSBmdWxsIHN0b3AuCisgKi8KKworLyogKklOREVOVC1PRkYqICovCitGSUVMRChDTURMT0csIGNtZF9sb2dfaXRlbSwgTlVNLCAiU2VxIiwgc2VxX251bSwgMywgdWludDMyLCBsb2dfc2VxX251bSwgIkxvZyBzZXF1ZW5jZSBudW1iZXIuIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTVFIsICJMb2dUeXBlIiwgdHlwZSwgNywgc3RyaW5nLCBsb2dfdHlwZSwgIkxvZyB0eXBlLiIsIDApCitGSUVMRChDTURMT0csIGNtZF9sb2dfaXRlbSwgU1RSLCAiQ29udGV4dCIsIGNvbnRleHQsIDcsIHN0cmluZywgbG9nX2NvbnRleHQsICJDdXJyZW50IGNvbnRleHQuIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTVFIsICJPYmpUeXBlIiwgb2JqZWN0X3R5cGVfbmFtZSwgNywgc3RyaW5nLCBsb2dfb2JqZWN0X3R5cGUsICJDdXJyZW50IG9iamVjdCB0eXBlLiIsIDApCitGSUVMRChDTURMT0csIGNtZF9sb2dfaXRlbSwgU1RSLCAiT2JqTmFtZSIsIG9iamVjdF9uYW1lLCA3LCBzdHJpbmcsIGxvZ19vYmplY3RfbmFtZSwgIkN1cnJlbnQgb2JqZWN0IG5hbWUuIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTVFIsICJPYmpJRCIsIG9iamVjdF9pZCwgNywgc3RyaW5nLCBsb2dfb2JqZWN0X2lkLCAiQ3VycmVudCBvYmplY3QgSUQuIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTVFIsICJPYmpHcnAiLCBvYmplY3RfZ3JvdXAsIDcsIHN0cmluZywgbG9nX29iamVjdF9ncm91cCwgIkN1cnJlbnQgb2JqZWN0IGdyb3VwLiIsIDApCitGSUVMRChDTURMT0csIGNtZF9sb2dfaXRlbSwgU1RSLCAiT2JqR3JwSUQiLCBvYmplY3RfZ3JvdXBfaWQsIDgsIHN0cmluZywgbG9nX29iamVjdF9ncm91cF9pZCwgIkN1cnJlbnQgb2JqZWN0IGdyb3VwIElELiIsIDApCitGSUVMRChDTURMT0csIGNtZF9sb2dfaXRlbSwgU1RSLCAiTXNnIiwgbXNnLCA3LCBzdHJpbmcsIGxvZ19tZXNzYWdlLCAiTG9nIG1lc3NhZ2UuIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTTlVNLCAiRXJybm8iLCBjdXJyZW50X2Vycm5vLCA1LCBpbnQzMiwgbG9nX2Vycm5vLCAiRXJybm8uIiwgMCkKK0ZJRUxEKENNRExPRywgY21kX2xvZ19pdGVtLCBTTlVNLCAiUmV0Q29kZSIsIHJldF9jb2RlLCA3LCBpbnQzMiwgbG9nX3JldF9jb2RlLCAiUmV0dXJuIGNvZGUuIiwgMCkKKy8qICpJTkRFTlQtT04qICovCmRpZmYgLS1naXQgYS9saWIvcmVwb3J0L2NvbHVtbnMtZGV2dHlwZXMuaCBiL2xpYi9yZXBvcnQvY29sdW1ucy1kZXZ0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjQ2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmVwb3J0L2NvbHVtbnMtZGV2dHlwZXMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZmllbGRzIChjb2x1bW5zKSBmb3IgdGhlIGRldnR5cGVzIHJlcG9ydGluZyBjb21tYW5kLgorICoKKyAqIFRoZSBwcmVmZXJyZWQgb3JkZXIgb2YgdGhlIGZpZWxkIGRlc2NyaXB0aW9ucyBpbiB0aGUgaGVscCB0ZXh0CisgKiBkZXRlcm1pbmVzIHRoZSBvcmRlciB0aGUgZW50cmllcyBhcHBlYXIgaW4gdGhpcyBmaWxlLgorICoKKyAqIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzIHRha2UgY2FyZSB0byB1c2UgdGhlIGV4aXN0aW5nIHN0eWxlLgorICogRGlzcGxheWVkIGZpZWxkcyBuYW1lcyBub3JtYWxseSBoYXZlIGEgdHlwZSBwcmVmaXggYW5kIHVzZSB1bmRlcnNjb3Jlcy4KKyAqIEZpZWxkLXNwZWNpZmljIGludGVybmFsIGZ1bmN0aW9ucyBuYW1lcyBub3JtYWxseSBtYXRjaCB0aGUgZGlzcGxheWVkCisgKiBmaWVsZCBuYW1lcyBidXQgd2l0aG91dCB1bmRlcnNjb3Jlcy4KKyAqIEhlbHAgdGV4dCBlbmRzIHdpdGggYSBmdWxsIHN0b3AuCisgKi8KKworLyogKklOREVOVC1PRkYqICovCitGSUVMRChERVZUWVBFUywgZGV2dHlwZSwgU1RSLCAiRGV2VHlwZSIsIG5hbWUsIDcsIGNoYXJzLCBkZXZ0eXBlX25hbWUsICJOYW1lIG9mIERldmljZSBUeXBlIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiAvcHJvYy9kZXZpY2VzLiIsIDApCitGSUVMRChERVZUWVBFUywgZGV2dHlwZSwgTlVNLCAiTWF4UGFydHMiLCBtYXhfcGFydGl0aW9ucywgOCwgaW50OCwgZGV2dHlwZV9tYXhfcGFydGl0aW9ucywgIk1heGltdW0gbnVtYmVyIG9mIHBhcnRpdGlvbnMuIChIb3cgbWFueSBkZXZpY2UgbWlub3IgbnVtYmVycyBnZXQgcmVzZXJ2ZWQgZm9yIGVhY2ggZGV2aWNlLikiLCAwKQorRklFTEQoREVWVFlQRVMsIGRldnR5cGUsIFNUUiwgIkRlc2NyaXB0aW9uIiwgZGVzYywgMTEsIHN0cmluZywgZGV2dHlwZV9kZXNjcmlwdGlvbiwgIkRlc2NyaXB0aW9uIG9mIERldmljZSBUeXBlLiIsIDApCisvKiAqSU5ERU5ULU9OKiAqLwpkaWZmIC0tZ2l0IGEvbGliL3JlcG9ydC9jb2x1bW5zLmggYi9saWIvcmVwb3J0L2NvbHVtbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJmOWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JlcG9ydC9jb2x1bW5zLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGZpZWxkcyAoY29sdW1ucykgZm9yIHRoZSByZXBvcnRpbmcgY29tbWFuZHMKKyAqIChwdnMvdmdzL2x2cykuCisgKgorICogVGhlIHByZWZlcnJlZCBvcmRlciBvZiB0aGUgZmllbGQgZGVzY3JpcHRpb25zIGluIHRoZSBoZWxwIHRleHQKKyAqIGRldGVybWluZXMgdGhlIG9yZGVyIHRoZSBlbnRyaWVzIGFwcGVhciBpbiB0aGlzIGZpbGUuCisgKgorICogV2hlbiBhZGRpbmcgbmV3IGVudHJpZXMgdGFrZSBjYXJlIHRvIHVzZSB0aGUgZXhpc3Rpbmcgc3R5bGUuCisgKiBEaXNwbGF5ZWQgZmllbGRzIG5hbWVzIG5vcm1hbGx5IGhhdmUgYSB0eXBlIHByZWZpeCBhbmQgdXNlIHVuZGVyc2NvcmVzLgorICogRmllbGQtc3BlY2lmaWMgaW50ZXJuYWwgZnVuY3Rpb25zIG5hbWVzIG5vcm1hbGx5IG1hdGNoIHRoZSBkaXNwbGF5ZWQKKyAqIGZpZWxkIG5hbWVzIGJ1dCB3aXRob3V0IHVuZGVyc2NvcmVzLgorICogSGVscCB0ZXh0IGVuZHMgd2l0aCBhIGZ1bGwgc3RvcC4KKyAqLworCisvKgorICogRklFTEQocmVwb3J0X29iamVjdF90eXBlLCBzdHJ1Y3R1cmUsIHNvcnRfdHlwZSwgaGVhZGluZywgc3RydWN0dXJlX2ZpZWxkLCBvdXRwdXRfd2lkdGgsIHJlcG9ydGluZ19mdW5jdGlvbiwgZmllbGRfaWQsIGRlc2NyaXB0aW9uLCBzZXR0YWJsZV92aWFfbGliKQorICovCisKKy8qICpJTkRFTlQtT0ZGKiAqLworRklFTEQoTFZTLCBsdiwgU1RSLCAiTFYgVVVJRCIsIGx2aWQsIDM4LCBsdnV1aWQsIGx2X3V1aWQsICJVbmlxdWUgaWRlbnRpZmllci4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiTFYiLCBsdmlkLCA0LCBsdm5hbWUsIGx2X25hbWUsICJOYW1lLiAgTFZzIGNyZWF0ZWQgZm9yIGludGVybmFsIHVzZSBhcmUgZW5jbG9zZWQgaW4gYnJhY2tldHMuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIkxWIiwgbHZpZCwgNCwgbHZmdWxsbmFtZSwgbHZfZnVsbF9uYW1lLCAiRnVsbCBuYW1lIG9mIExWIGluY2x1ZGluZyBpdHMgVkcsIG5hbWVseSBWRy9MVi4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiUGF0aCIsIGx2aWQsIDAsIGx2cGF0aCwgbHZfcGF0aCwgIkZ1bGwgcGF0aG5hbWUgZm9yIExWLiBCbGFuayBmb3IgaW50ZXJuYWwgTFZzLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJETVBhdGgiLCBsdmlkLCAwLCBsdmRtcGF0aCwgbHZfZG1fcGF0aCwgIkludGVybmFsIGRldmljZS1tYXBwZXIgcGF0aG5hbWUgZm9yIExWIChpbiAvZGV2L21hcHBlciBkaXJlY3RvcnkpLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJQYXJlbnQiLCBsdmlkLCAwLCBsdnBhcmVudCwgbHZfcGFyZW50LCAiRm9yIExWcyB0aGF0IGFyZSBjb21wb25lbnRzIG9mIGFub3RoZXIgTFYsIHRoZSBwYXJlbnQgTFYuIiwgMCkKK0ZJRUxEKExWU0lORk9TVEFUVVMsIGx2LCBTVFIsICJBdHRyIiwgbHZpZCwgMCwgbHZzdGF0dXMsIGx2X2F0dHIsICJWYXJpb3VzIGF0dHJpYnV0ZXMgLSBzZWUgbWFuIHBhZ2UuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUl9MSVNULCAiTGF5b3V0IiwgbHZpZCwgMTAsIGx2bGF5b3V0LCBsdl9sYXlvdXQsICJMViBsYXlvdXQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUl9MSVNULCAiUm9sZSIsIGx2aWQsIDEwLCBsdnJvbGUsIGx2X3JvbGUsICJMViByb2xlLiIsIDApCitGSUVMRChMVlMsIGx2LCBCSU4sICJJbml0SW1nU3luYyIsIGx2aWQsIDEwLCBsdmluaXRpYWxpbWFnZXN5bmMsIGx2X2luaXRpYWxfaW1hZ2Vfc3luYywgIlNldCBpZiBtaXJyb3IvUkFJRCBpbWFnZXMgdW5kZXJ3ZW50IGluaXRpYWwgcmVzeW5jaHJvbml6YXRpb24uIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIkltZ1N5bmNlZCIsIGx2aWQsIDEwLCBsdmltYWdlc3luY2VkLCBsdl9pbWFnZV9zeW5jZWQsICJTZXQgaWYgbWlycm9yL1JBSUQgaW1hZ2UgaXMgc3luY2hyb25pemVkLiIsIDApCitGSUVMRChMVlMsIGx2LCBCSU4sICJNZXJnaW5nIiwgbHZpZCwgMTAsIGx2bWVyZ2luZywgbHZfbWVyZ2luZywgIlNldCBpZiBzbmFwc2hvdCBMViBpcyBiZWluZyBtZXJnZWQgdG8gb3JpZ2luLiIsIDApCitGSUVMRChMVlMsIGx2LCBCSU4sICJDb252ZXJ0aW5nIiwgbHZpZCwgMCwgbHZjb252ZXJ0aW5nLCBsdl9jb252ZXJ0aW5nLCAiU2V0IGlmIExWIGlzIGJlaW5nIGNvbnZlcnRlZC4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiQWxsb2NQb2wiLCBsdmlkLCAxMCwgbHZhbGxvY2F0aW9ucG9saWN5LCBsdl9hbGxvY2F0aW9uX3BvbGljeSwgIkxWIGFsbG9jYXRpb24gcG9saWN5LiIsIDApCitGSUVMRChMVlMsIGx2LCBCSU4sICJBbGxvY0xvY2siLCBsdmlkLCAxMCwgbHZhbGxvY2F0aW9ubG9ja2VkLCBsdl9hbGxvY2F0aW9uX2xvY2tlZCwgIlNldCBpZiBMViBpcyBsb2NrZWQgYWdhaW5zdCBhbGxvY2F0aW9uIGNoYW5nZXMuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIkZpeE1pbiIsIGx2aWQsIDEwLCBsdmZpeGVkbWlub3IsIGx2X2ZpeGVkX21pbm9yLCAiU2V0IGlmIExWIGhhcyBmaXhlZCBtaW5vciBudW1iZXIgYXNzaWduZWQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIk1lcmdlRmFpbGVkIiwgbHZpZCwgMTUsIGx2bWVyZ2VmYWlsZWQsIGx2X21lcmdlX2ZhaWxlZCwgIlNldCBpZiBzbmFwc2hvdCBtZXJnZSBmYWlsZWQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIlNuYXBJbnZhbGlkIiwgbHZpZCwgMTUsIGx2c25hcHNob3RpbnZhbGlkLCBsdl9zbmFwc2hvdF9pbnZhbGlkLCAiU2V0IGlmIHNuYXBzaG90IExWIGlzIGludmFsaWQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIlNraXBBY3QiLCBsdmlkLCAxNSwgbHZza2lwYWN0aXZhdGlvbiwgbHZfc2tpcF9hY3RpdmF0aW9uLCAiU2V0IGlmIExWIGlzIHNraXBwZWQgb24gYWN0aXZhdGlvbi4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiV2hlbkZ1bGwiLCBsdmlkLCAxNSwgbHZ3aGVuZnVsbCwgbHZfd2hlbl9mdWxsLCAiRm9yIHRoaW4gcG9vbHMsIGJlaGF2aW9yIHdoZW4gZnVsbC4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiQWN0aXZlIiwgbHZpZCwgMCwgbHZhY3RpdmUsIGx2X2FjdGl2ZSwgIkFjdGl2ZSBzdGF0ZSBvZiB0aGUgTFYuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIkFjdExvY2FsIiwgbHZpZCwgMTAsIGx2YWN0aXZlbG9jYWxseSwgbHZfYWN0aXZlX2xvY2FsbHksICJTZXQgaWYgdGhlIExWIGlzIGFjdGl2ZSBsb2NhbGx5LiIsIDApCitGSUVMRChMVlMsIGx2LCBCSU4sICJBY3RSZW1vdGUiLCBsdmlkLCAxMCwgbHZhY3RpdmVyZW1vdGVseSwgbHZfYWN0aXZlX3JlbW90ZWx5LCAiU2V0IGlmIHRoZSBMViBpcyBhY3RpdmUgcmVtb3RlbHkuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIkFjdEV4Y2wiLCBsdmlkLCAxMCwgbHZhY3RpdmVleGNsdXNpdmVseSwgbHZfYWN0aXZlX2V4Y2x1c2l2ZWx5LCAiU2V0IGlmIHRoZSBMViBpcyBhY3RpdmUgZXhjbHVzaXZlbHkuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNOVU0sICJNYWoiLCBtYWpvciwgMCwgaW50MzIsIGx2X21ham9yLCAiUGVyc2lzdGVudCBtYWpvciBudW1iZXIgb3IgLTEgaWYgbm90IHBlcnNpc3RlbnQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNOVU0sICJNaW4iLCBtaW5vciwgMCwgaW50MzIsIGx2X21pbm9yLCAiUGVyc2lzdGVudCBtaW5vciBudW1iZXIgb3IgLTEgaWYgbm90IHBlcnNpc3RlbnQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNJWiwgIlJhaGVhZCIsIGx2aWQsIDAsIGx2cmVhZGFoZWFkLCBsdl9yZWFkX2FoZWFkLCAiUmVhZCBhaGVhZCBzZXR0aW5nIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNJWiwgIkxTaXplIiwgc2l6ZSwgMCwgc2l6ZTY0LCBsdl9zaXplLCAiU2l6ZSBvZiBMViBpbiBjdXJyZW50IHVuaXRzLiIsIDApCitGSUVMRChMVlMsIGx2LCBTSVosICJNU2l6ZSIsIGx2aWQsIDAsIGx2bWV0YWRhdGFzaXplLCBsdl9tZXRhZGF0YV9zaXplLCAiRm9yIHRoaW4gYW5kIGNhY2hlIHBvb2xzLCB0aGUgc2l6ZSBvZiB0aGUgTFYgdGhhdCBob2xkcyB0aGUgbWV0YWRhdGEuIiwgMCkKK0ZJRUxEKExWUywgbHYsIE5VTSwgIiNTZWciLCBsdmlkLCAwLCBsdnNlZ2NvdW50LCBzZWdfY291bnQsICJOdW1iZXIgb2Ygc2VnbWVudHMgaW4gTFYuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIk9yaWdpbiIsIGx2aWQsIDAsIG9yaWdpbiwgb3JpZ2luLCAiRm9yIHNuYXBzaG90cyBhbmQgdGhpbnMsIHRoZSBvcmlnaW4gZGV2aWNlIG9mIHRoaXMgTFYuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIk9yaWdpbiBVVUlEIiwgbHZpZCwgMzgsIG9yaWdpbnV1aWQsIG9yaWdpbl91dWlkLCAiRm9yIHNuYXBzaG90cyBhbmQgdGhpbnMsIHRoZSBVVUlEIG9mIG9yaWdpbiBkZXZpY2Ugb2YgdGhpcyBMVi4iLCAwKQorRklFTEQoTFZTLCBsdiwgU0laLCAiT1NpemUiLCBsdmlkLCAwLCBvcmlnaW5zaXplLCBvcmlnaW5fc2l6ZSwgIkZvciBzbmFwc2hvdHMsIHRoZSBzaXplIG9mIHRoZSBvcmlnaW4gZGV2aWNlIG9mIHRoaXMgTFYuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUl9MSVNULCAiQW5jZXN0b3JzIiwgbHZpZCwgMCwgbHZhbmNlc3RvcnMsIGx2X2FuY2VzdG9ycywgIkxWIGFuY2VzdG9ycyBpZ25vcmluZyBhbnkgc3RvcmVkIGhpc3Rvcnkgb2YgdGhlIGFuY2VzdHJ5IGNoYWluLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFJfTElTVCwgIkZBbmNlc3RvcnMiLCBsdmlkLCAwLCBsdmZ1bGxhbmNlc3RvcnMsIGx2X2Z1bGxfYW5jZXN0b3JzLCAiTFYgYW5jZXN0b3JzIGluY2x1ZGluZyBzdG9yZWQgaGlzdG9yeSBvZiB0aGUgYW5jZXN0cnkgY2hhaW4uIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUl9MSVNULCAiRGVzY2VuZGFudHMiLCBsdmlkLCAwLCBsdmRlc2NlbmRhbnRzLCBsdl9kZXNjZW5kYW50cywgIkxWIGRlc2NlbmRhbnRzIGlnbm9yaW5nIGFueSBzdG9yZWQgaGlzdG9yeSBvZiB0aGUgYW5jZXN0cnkgY2hhaW4uIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUl9MSVNULCAiRkRlc2NlbmRhbnRzIiwgbHZpZCwgMCwgbHZmdWxsZGVzY2VuZGFudHMsIGx2X2Z1bGxfZGVzY2VuZGFudHMsICJMViBkZXNjZW5kYW50cyBpbmNsdWRpbmcgc3RvcmVkIGhpc3Rvcnkgb2YgdGhlIGFuY2VzdHJ5IGNoYWluLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBQQ1QsICJEYXRhJSIsIGx2aWQsIDYsIGRhdGFwZXJjZW50LCBkYXRhX3BlcmNlbnQsICJGb3Igc25hcHNob3QsIGNhY2hlIGFuZCB0aGluIHBvb2xzIGFuZCB2b2x1bWVzLCB0aGUgcGVyY2VudGFnZSBmdWxsIGlmIExWIGlzIGFjdGl2ZS4iLCAwKQorRklFTEQoTFZTU1RBVFVTLCBsdiwgUENULCAiU25hcCUiLCBsdmlkLCA2LCBzbnBlcmNlbnQsIHNuYXBfcGVyY2VudCwgIkZvciBzbmFwc2hvdHMsIHRoZSBwZXJjZW50YWdlIGZ1bGwgaWYgTFYgaXMgYWN0aXZlLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBQQ1QsICJNZXRhJSIsIGx2aWQsIDYsIG1ldGFkYXRhcGVyY2VudCwgbWV0YWRhdGFfcGVyY2VudCwgIkZvciBjYWNoZSBhbmQgdGhpbiBwb29scywgdGhlIHBlcmNlbnRhZ2Ugb2YgbWV0YWRhdGEgZnVsbCBpZiBMViBpcyBhY3RpdmUuIiwgMCkKK0ZJRUxEKExWU1NUQVRVUywgbHYsIFBDVCwgIkNweSVTeW5jIiwgbHZpZCwgMCwgY29weXBlcmNlbnQsIGNvcHlfcGVyY2VudCwgIkZvciBDYWNoZSwgUkFJRCwgbWlycm9ycyBhbmQgcHZtb3ZlLCBjdXJyZW50IHBlcmNlbnRhZ2UgaW4tc3luYy4iLCAwKQorRklFTEQoTFZTU1RBVFVTLCBsdiwgUENULCAiQ3B5JVN5bmMiLCBsdmlkLCAwLCBjb3B5cGVyY2VudCwgc3luY19wZXJjZW50LCAiRm9yIENhY2hlLCBSQUlELCBtaXJyb3JzIGFuZCBwdm1vdmUsIGN1cnJlbnQgcGVyY2VudGFnZSBpbi1zeW5jLiIsIDApCitGSUVMRChMVlMsIGx2LCBOVU0sICJNaXNtYXRjaGVzIiwgbHZpZCwgMCwgcmFpZG1pc21hdGNoY291bnQsIHJhaWRfbWlzbWF0Y2hfY291bnQsICJGb3IgUkFJRCwgbnVtYmVyIG9mIG1pc21hdGNoZXMgZm91bmQgb3IgcmVwYWlyZWQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIlN5bmNBY3Rpb24iLCBsdmlkLCAwLCByYWlkc3luY2FjdGlvbiwgcmFpZF9zeW5jX2FjdGlvbiwgIkZvciBSQUlELCB0aGUgY3VycmVudCBzeW5jaHJvbml6YXRpb24gYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4iLCAwKQorRklFTEQoTFZTLCBsdiwgTlVNLCAiV0JlaGluZCIsIGx2aWQsIDAsIHJhaWR3cml0ZWJlaGluZCwgcmFpZF93cml0ZV9iZWhpbmQsICJGb3IgUkFJRDEsIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgd3JpdGVzIGFsbG93ZWQgdG8gd3JpdGVtb3N0bHkgZGV2aWNlcy4iLCAwKQorRklFTEQoTFZTLCBsdiwgTlVNLCAiTWluU3luYyIsIGx2aWQsIDAsIHJhaWRtaW5yZWNvdmVyeXJhdGUsIHJhaWRfbWluX3JlY292ZXJ5X3JhdGUsICJGb3IgUkFJRDEsIHRoZSBtaW5pbXVtIHJlY292ZXJ5IEkvTyBsb2FkIGluIGtpQi9zZWMvZGlzay4iLCAwKQorRklFTEQoTFZTLCBsdiwgTlVNLCAiTWF4U3luYyIsIGx2aWQsIDAsIHJhaWRtYXhyZWNvdmVyeXJhdGUsIHJhaWRfbWF4X3JlY292ZXJ5X3JhdGUsICJGb3IgUkFJRDEsIHRoZSBtYXhpbXVtIHJlY292ZXJ5IEkvTyBsb2FkIGluIGtpQi9zZWMvZGlzay4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiTW92ZSIsIGx2aWQsIDAsIG1vdmVwdiwgbW92ZV9wdiwgIkZvciBwdm1vdmUsIFNvdXJjZSBQViBvZiB0ZW1wb3JhcnkgTFYgY3JlYXRlZCBieSBwdm1vdmUuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIk1vdmUgVVVJRCIsIGx2aWQsIDM4LCBtb3ZlcHZ1dWlkLCBtb3ZlX3B2X3V1aWQsICJGb3IgcHZtb3ZlLCB0aGUgVVVJRCBvZiBTb3VyY2UgUFYgb2YgdGVtcG9yYXJ5IExWIGNyZWF0ZWQgYnkgcHZtb3ZlLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJDb252ZXJ0IiwgbHZpZCwgMCwgY29udmVydGx2LCBjb252ZXJ0X2x2LCAiRm9yIGx2Y29udmVydCwgTmFtZSBvZiB0ZW1wb3JhcnkgTFYgY3JlYXRlZCBieSBsdmNvbnZlcnQuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIkNvbnZlcnQgVVVJRCIsIGx2aWQsIDM4LCBjb252ZXJ0bHZ1dWlkLCBjb252ZXJ0X2x2X3V1aWQsICJGb3IgbHZjb252ZXJ0LCBVVUlEIG9mIHRlbXBvcmFyeSBMViBjcmVhdGVkIGJ5IGx2Y29udmVydC4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiTG9nIiwgbHZpZCwgMCwgbG9nbHYsIG1pcnJvcl9sb2csICJGb3IgbWlycm9ycywgdGhlIExWIGhvbGRpbmcgdGhlIHN5bmNocm9uaXNhdGlvbiBsb2cuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIkxvZyBVVUlEIiwgbHZpZCwgMzgsIGxvZ2x2dXVpZCwgbWlycm9yX2xvZ191dWlkLCAiRm9yIG1pcnJvcnMsIHRoZSBVVUlEIG9mIHRoZSBMViBob2xkaW5nIHRoZSBzeW5jaHJvbmlzYXRpb24gbG9nLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJEYXRhIiwgbHZpZCwgMCwgZGF0YWx2LCBkYXRhX2x2LCAiRm9yIHRoaW4gYW5kIGNhY2hlIHBvb2xzLCB0aGUgTFYgaG9sZGluZyB0aGUgYXNzb2NpYXRlZCBkYXRhLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJEYXRhIFVVSUQiLCBsdmlkLCAzOCwgZGF0YWx2dXVpZCwgZGF0YV9sdl91dWlkLCAiRm9yIHRoaW4gYW5kIGNhY2hlIHBvb2xzLCB0aGUgVVVJRCBvZiB0aGUgTFYgaG9sZGluZyB0aGUgYXNzb2NpYXRlZCBkYXRhLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJNZXRhIiwgbHZpZCwgMCwgbWV0YWRhdGFsdiwgbWV0YWRhdGFfbHYsICJGb3IgdGhpbiBhbmQgY2FjaGUgcG9vbHMsIHRoZSBMViBob2xkaW5nIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJNZXRhIFVVSUQiLCBsdmlkLCAzOCwgbWV0YWRhdGFsdnV1aWQsIG1ldGFkYXRhX2x2X3V1aWQsICJGb3IgdGhpbiBhbmQgY2FjaGUgcG9vbHMsIHRoZSBVVUlEIG9mIHRoZSBMViBob2xkaW5nIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhLiIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJQb29sIiwgbHZpZCwgMCwgcG9vbGx2LCBwb29sX2x2LCAiRm9yIHRoaW4gdm9sdW1lcywgdGhlIHRoaW4gcG9vbCBMViBmb3IgdGhpcyB2b2x1bWUuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFNUUiwgIlBvb2wgVVVJRCIsIGx2aWQsIDM4LCBwb29sbHZ1dWlkLCBwb29sX2x2X3V1aWQsICJGb3IgdGhpbiB2b2x1bWVzLCB0aGUgVVVJRCBvZiB0aGUgdGhpbiBwb29sIExWIGZvciB0aGlzIHZvbHVtZS4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSX0xJU1QsICJMViBUYWdzIiwgdGFncywgMCwgdGFncywgbHZfdGFncywgIlRhZ3MsIGlmIGFueS4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiTFByb2ZpbGUiLCBsdmlkLCAwLCBsdnByb2ZpbGUsIGx2X3Byb2ZpbGUsICJDb25maWd1cmF0aW9uIHByb2ZpbGUgYXR0YWNoZWQgdG8gdGhpcyBMVi4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSLCAiTExvY2tBcmdzIiwgbHZpZCwgMCwgbHZsb2NrYXJncywgbHZfbG9ja2FyZ3MsICJMb2NrIGFyZ3Mgb2YgdGhlIExWIHVzZWQgYnkgbHZtbG9ja2QuIiwgMCkKK0ZJRUxEKExWUywgbHYsIFRJTSwgIkNUaW1lIiwgbHZpZCwgMjYsIGx2dGltZSwgbHZfdGltZSwgIkNyZWF0aW9uIHRpbWUgb2YgdGhlIExWLCBpZiBrbm93biIsIDApCitGSUVMRChMVlMsIGx2LCBUSU0sICJSVGltZSIsIGx2aWQsIDI2LCBsdnRpbWVyZW1vdmVkLCBsdl90aW1lX3JlbW92ZWQsICJSZW1vdmFsIHRpbWUgb2YgdGhlIExWLCBpZiBrbm93biIsIDApCitGSUVMRChMVlMsIGx2LCBTVFIsICJIb3N0IiwgbHZpZCwgMTAsIGx2aG9zdCwgbHZfaG9zdCwgIkNyZWF0aW9uIGhvc3Qgb2YgdGhlIExWLCBpZiBrbm93bi4iLCAwKQorRklFTEQoTFZTLCBsdiwgU1RSX0xJU1QsICJNb2R1bGVzIiwgbHZpZCwgMCwgbW9kdWxlcywgbHZfbW9kdWxlcywgIktlcm5lbCBkZXZpY2UtbWFwcGVyIG1vZHVsZXMgcmVxdWlyZWQgZm9yIHRoaXMgTFYuIiwgMCkKK0ZJRUxEKExWUywgbHYsIEJJTiwgIkhpc3RvcmljYWwiLCBsdmlkLCAwLCBsdmhpc3RvcmljYWwsIGx2X2hpc3RvcmljYWwsICJTZXQgaWYgdGhlIExWIGlzIGhpc3RvcmljYWwuIiwgMCkKKworRklFTEQoTFZTSU5GTywgbHYsIFNOVU0sICJLTWFqIiwgbHZpZCwgMCwgbHZrbWFqLCBsdl9rZXJuZWxfbWFqb3IsICJDdXJyZW50bHkgYXNzaWduZWQgbWFqb3IgbnVtYmVyIG9yIC0xIGlmIExWIGlzIG5vdCBhY3RpdmUuIiwgMCkKK0ZJRUxEKExWU0lORk8sIGx2LCBTTlVNLCAiS01pbiIsIGx2aWQsIDAsIGx2a21pbiwgbHZfa2VybmVsX21pbm9yLCAiQ3VycmVudGx5IGFzc2lnbmVkIG1pbm9yIG51bWJlciBvciAtMSBpZiBMViBpcyBub3QgYWN0aXZlLiIsIDApCitGSUVMRChMVlNJTkZPLCBsdiwgU0laLCAiS1JhaGVhZCIsIGx2aWQsIDAsIGx2a3JlYWRhaGVhZCwgbHZfa2VybmVsX3JlYWRfYWhlYWQsICJDdXJyZW50bHktaW4tdXNlIHJlYWQgYWhlYWQgc2V0dGluZyBpbiBjdXJyZW50IHVuaXRzLiIsIDApCitGSUVMRChMVlNJTkZPLCBsdiwgU1RSLCAiTFBlcm1zIiwgbHZpZCwgOCwgbHZwZXJtaXNzaW9ucywgbHZfcGVybWlzc2lvbnMsICJMViBwZXJtaXNzaW9ucy4iLCAwKQorRklFTEQoTFZTSU5GTywgbHYsIEJJTiwgIlN1c3BlbmRlZCIsIGx2aWQsIDEwLCBsdnN1c3BlbmRlZCwgbHZfc3VzcGVuZGVkLCAiU2V0IGlmIExWIGlzIHN1c3BlbmRlZC4iLCAwKQorRklFTEQoTFZTSU5GTywgbHYsIEJJTiwgIkxpdmVUYWJsZSIsIGx2aWQsIDIwLCBsdmxpdmV0YWJsZSwgbHZfbGl2ZV90YWJsZSwgIlNldCBpZiBMViBoYXMgbGl2ZSB0YWJsZSBwcmVzZW50LiIsIDApCitGSUVMRChMVlNJTkZPLCBsdiwgQklOLCAiSW5hY3RpdmVUYWJsZSIsIGx2aWQsIDIwLCBsdmluYWN0aXZldGFibGUsIGx2X2luYWN0aXZlX3RhYmxlLCAiU2V0IGlmIExWIGhhcyBpbmFjdGl2ZSB0YWJsZSBwcmVzZW50LiIsIDApCitGSUVMRChMVlNJTkZPLCBsdiwgQklOLCAiRGV2T3BlbiIsIGx2aWQsIDEwLCBsdmRldmljZW9wZW4sIGx2X2RldmljZV9vcGVuLCAiU2V0IGlmIExWIGRldmljZSBpcyBvcGVuLiIsIDApCisKK0ZJRUxEKExWU1NUQVRVUywgbHYsIE5VTSwgIkNhY2hlVG90YWxCbG9ja3MiLCBsdmlkLCAwLCBjYWNoZV90b3RhbF9ibG9ja3MsIGNhY2hlX3RvdGFsX2Jsb2NrcywgIlRvdGFsIGNhY2hlIGJsb2Nrcy4iLCAwKQorRklFTEQoTFZTU1RBVFVTLCBsdiwgTlVNLCAiQ2FjaGVVc2VkQmxvY2tzIiwgbHZpZCwgMTYsIGNhY2hlX3VzZWRfYmxvY2tzLCBjYWNoZV91c2VkX2Jsb2NrcywgIlVzZWQgY2FjaGUgYmxvY2tzLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBOVU0sICJDYWNoZURpcnR5QmxvY2tzIiwgbHZpZCwgMCwgY2FjaGVfZGlydHlfYmxvY2tzLCBjYWNoZV9kaXJ0eV9ibG9ja3MsICJEaXJ0eSBjYWNoZSBibG9ja3MuIiwgMCkKK0ZJRUxEKExWU1NUQVRVUywgbHYsIE5VTSwgIkNhY2hlUmVhZEhpdHMiLCBsdmlkLCAxNiwgY2FjaGVfcmVhZF9oaXRzLCBjYWNoZV9yZWFkX2hpdHMsICJDYWNoZSByZWFkIGhpdHMuIiwgMCkKK0ZJRUxEKExWU1NUQVRVUywgbHYsIE5VTSwgIkNhY2hlUmVhZE1pc3NlcyIsIGx2aWQsIDE2LCBjYWNoZV9yZWFkX21pc3NlcywgY2FjaGVfcmVhZF9taXNzZXMsICJDYWNoZSByZWFkIG1pc3Nlcy4iLCAwKQorRklFTEQoTFZTU1RBVFVTLCBsdiwgTlVNLCAiQ2FjaGVXcml0ZUhpdHMiLCBsdmlkLCAxNiwgY2FjaGVfd3JpdGVfaGl0cywgY2FjaGVfd3JpdGVfaGl0cywgIkNhY2hlIHdyaXRlIGhpdHMuIiwgMCkKK0ZJRUxEKExWU1NUQVRVUywgbHYsIE5VTSwgIkNhY2hlV3JpdGVNaXNzZXMiLCBsdmlkLCAwLCBjYWNoZV93cml0ZV9taXNzZXMsIGNhY2hlX3dyaXRlX21pc3NlcywgIkNhY2hlIHdyaXRlIG1pc3Nlcy4iLCAwKQorRklFTEQoTFZTU1RBVFVTLCBsdiwgU1RSX0xJU1QsICJLQ2FjaGVTZXR0aW5ncyIsIGx2aWQsIDE4LCBrZXJuZWxfY2FjaGVfc2V0dGluZ3MsIGtlcm5lbF9jYWNoZV9zZXR0aW5ncywgIkNhY2hlIHNldHRpbmdzL3BhcmFtZXRlcnMgYXMgc2V0IGluIGtlcm5lbCwgaW5jbHVkaW5nIGRlZmF1bHQgdmFsdWVzIChjYWNoZWQgc2VnbWVudHMgb25seSkuIiwgMCkKK0ZJRUxEKExWU1NUQVRVUywgbHYsIFNUUiwgIktDYWNoZVBvbGljeSIsIGx2aWQsIDE4LCBrZXJuZWxfY2FjaGVfcG9saWN5LCBrZXJuZWxfY2FjaGVfcG9saWN5LCAiQ2FjaGUgcG9saWN5IHVzZWQgaW4ga2VybmVsLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBTVFIsICJIZWFsdGgiLCBsdmlkLCAxNSwgbHZoZWFsdGhzdGF0dXMsIGx2X2hlYWx0aF9zdGF0dXMsICJMViBoZWFsdGggc3RhdHVzLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBTVFIsICJLRGlzY2FyZHMiLCBsdmlkLCAwLCBrZGlzY2FyZHMsIGtlcm5lbF9kaXNjYXJkcywgIkZvciB0aGluIHBvb2xzLCBob3cgZGlzY2FyZHMgYXJlIGhhbmRsZWQgaW4ga2VybmVsLiIsIDApCitGSUVMRChMVlNTVEFUVVMsIGx2LCBCSU4sICJDaGVja05lZWRlZCIsIGx2aWQsIDE1LCBsdmNoZWNrbmVlZGVkLCBsdl9jaGVja19uZWVkZWQsICJGb3IgdGhpbiBwb29scyBhbmQgY2FjaGUgdm9sdW1lcywgd2hldGhlciBtZXRhZGF0YSBjaGVjayBpcyBuZWVkZWQuIiwgMCkKKworRklFTEQoTEFCRUwsIGxhYmVsLCBTVFIsICJGbXQiLCB0eXBlLCAwLCBwdmZtdCwgcHZfZm10LCAiVHlwZSBvZiBtZXRhZGF0YS4iLCAwKQorRklFTEQoTEFCRUwsIGxhYmVsLCBTVFIsICJQViBVVUlEIiwgdHlwZSwgMzgsIHB2dXVpZCwgcHZfdXVpZCwgIlVuaXF1ZSBpZGVudGlmaWVyLiIsIDApCitGSUVMRChMQUJFTCwgbGFiZWwsIFNJWiwgIkRldlNpemUiLCBkZXYsIDAsIGRldnNpemUsIGRldl9zaXplLCAiU2l6ZSBvZiB1bmRlcmx5aW5nIGRldmljZSBpbiBjdXJyZW50IHVuaXRzLiIsIDApCitGSUVMRChMQUJFTCwgbGFiZWwsIFNUUiwgIlBWIiwgZGV2LCAxMCwgZGV2X25hbWUsIHB2X25hbWUsICJOYW1lLiIsIDApCitGSUVMRChMQUJFTCwgbGFiZWwsIFNUUiwgIk1haiIsIGRldiwgMCwgZGV2bWFqb3IsIHB2X21ham9yLCAiRGV2aWNlIG1ham9yIG51bWJlci4iLCAwKQorRklFTEQoTEFCRUwsIGxhYmVsLCBTVFIsICJNaW4iLCBkZXYsIDAsIGRldm1pbm9yLCBwdl9taW5vciwgIkRldmljZSBtaW5vciBudW1iZXIuIiwgMCkKK0ZJRUxEKExBQkVMLCBsYWJlbCwgU0laLCAiUE1kYUZyZWUiLCB0eXBlLCA5LCBwdm1kYWZyZWUsIHB2X21kYV9mcmVlLCAiRnJlZSBtZXRhZGF0YSBhcmVhIHNwYWNlIG9uIHRoaXMgZGV2aWNlIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKExBQkVMLCBsYWJlbCwgU0laLCAiUE1kYVNpemUiLCB0eXBlLCA5LCBwdm1kYXNpemUsIHB2X21kYV9zaXplLCAiU2l6ZSBvZiBzbWFsbGVzdCBtZXRhZGF0YSBhcmVhIG9uIHRoaXMgZGV2aWNlIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKExBQkVMLCBsYWJlbCwgTlVNLCAiUEV4dFZzbiIsIHR5cGUsIDAsIHB2ZXh0dnNuLCBwdl9leHRfdnNuLCAiUFYgaGVhZGVyIGV4dGVuc2lvbiB2ZXJzaW9uLiIsIDApCisKK0ZJRUxEKFBWUywgcHYsIE5VTSwgIjFzdCBQRSIsIHBlX3N0YXJ0LCA3LCBzaXplNjQsIHBlX3N0YXJ0LCAiT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiBkYXRhIG9uIHRoZSB1bmRlcmx5aW5nIGRldmljZS4iLCAwKQorRklFTEQoUFZTLCBwdiwgU0laLCAiUFNpemUiLCBpZCwgMCwgcHZzaXplLCBwdl9zaXplLCAiU2l6ZSBvZiBQViBpbiBjdXJyZW50IHVuaXRzLiIsIDApCitGSUVMRChQVlMsIHB2LCBTSVosICJQRnJlZSIsIGlkLCAwLCBwdmZyZWUsIHB2X2ZyZWUsICJUb3RhbCBhbW91bnQgb2YgdW5hbGxvY2F0ZWQgc3BhY2UgaW4gY3VycmVudCB1bml0cy4iLCAwKQorRklFTEQoUFZTLCBwdiwgU0laLCAiVXNlZCIsIGlkLCAwLCBwdnVzZWQsIHB2X3VzZWQsICJUb3RhbCBhbW91bnQgb2YgYWxsb2NhdGVkIHNwYWNlIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFBWUywgcHYsIFNUUiwgIkF0dHIiLCBpZCwgMCwgcHZzdGF0dXMsIHB2X2F0dHIsICJWYXJpb3VzIGF0dHJpYnV0ZXMgLSBzZWUgbWFuIHBhZ2UuIiwgMCkKK0ZJRUxEKFBWUywgcHYsIEJJTiwgIkFsbG9jYXRhYmxlIiwgaWQsIDAsIHB2YWxsb2NhdGFibGUsIHB2X2FsbG9jYXRhYmxlLCAiU2V0IGlmIHRoaXMgZGV2aWNlIGNhbiBiZSB1c2VkIGZvciBhbGxvY2F0aW9uLiIsIDApCitGSUVMRChQVlMsIHB2LCBCSU4sICJFeHBvcnRlZCIsIGlkLCAxMCwgcHZleHBvcnRlZCwgcHZfZXhwb3J0ZWQsICJTZXQgaWYgdGhpcyBkZXZpY2UgaXMgZXhwb3J0ZWQuIiwgMCkKK0ZJRUxEKFBWUywgcHYsIEJJTiwgIk1pc3NpbmciLCBpZCwgMTAsIHB2bWlzc2luZywgcHZfbWlzc2luZywgIlNldCBpZiB0aGlzIGRldmljZSBpcyBtaXNzaW5nIGluIHN5c3RlbS4iLCAwKQorRklFTEQoUFZTLCBwdiwgTlVNLCAiUEUiLCBwZV9jb3VudCwgMywgdWludDMyLCBwdl9wZV9jb3VudCwgIlRvdGFsIG51bWJlciBvZiBQaHlzaWNhbCBFeHRlbnRzLiIsIDApCitGSUVMRChQVlMsIHB2LCBOVU0sICJBbGxvYyIsIHBlX2FsbG9jX2NvdW50LCAwLCB1aW50MzIsIHB2X3BlX2FsbG9jX2NvdW50LCAiVG90YWwgbnVtYmVyIG9mIGFsbG9jYXRlZCBQaHlzaWNhbCBFeHRlbnRzLiIsIDApCitGSUVMRChQVlMsIHB2LCBTVFJfTElTVCwgIlBWIFRhZ3MiLCB0YWdzLCAwLCB0YWdzLCBwdl90YWdzLCAiVGFncywgaWYgYW55LiIsIDApCitGSUVMRChQVlMsIHB2LCBOVU0sICIjUE1kYSIsIGlkLCAwLCBwdm1kYXMsIHB2X21kYV9jb3VudCwgIk51bWJlciBvZiBtZXRhZGF0YSBhcmVhcyBvbiB0aGlzIGRldmljZS4iLCAwKQorRklFTEQoUFZTLCBwdiwgTlVNLCAiI1BNZGFVc2UiLCBpZCwgMCwgcHZtZGFzdXNlZCwgcHZfbWRhX3VzZWRfY291bnQsICJOdW1iZXIgb2YgbWV0YWRhdGEgYXJlYXMgaW4gdXNlIG9uIHRoaXMgZGV2aWNlLiIsIDApCitGSUVMRChQVlMsIHB2LCBTSVosICJCQSBTdGFydCIsIGJhX3N0YXJ0LCAwLCBzaXplNjQsIHB2X2JhX3N0YXJ0LCAiT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiBQViBCb290bG9hZGVyIEFyZWEgb24gdGhlIHVuZGVybHlpbmcgZGV2aWNlIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFBWUywgcHYsIFNJWiwgIkJBIFNpemUiLCBiYV9zaXplLCAwLCBzaXplNjQsIHB2X2JhX3NpemUsICJTaXplIG9mIFBWIEJvb3Rsb2FkZXIgQXJlYSBpbiBjdXJyZW50IHVuaXRzLiIsIDApCitGSUVMRChQVlMsIHB2LCBCSU4sICJQSW5Vc2UiLCBpZCwgMCwgcHZpbnVzZSwgcHZfaW5fdXNlLCAiU2V0IGlmIFBWIGlzIHVzZWQuIiwgMCkKK0ZJRUxEKFBWUywgcHYsIEJJTiwgIkR1cGxpY2F0ZSIsIGlkLCAwLCBwdmR1cGxpY2F0ZSwgcHZfZHVwbGljYXRlLCAiU2V0IGlmIFBWIGlzIGFuIHVuY2hvc2VuIGR1cGxpY2F0ZS4iLCAwKQorCitGSUVMRChWR1MsIHZnLCBTVFIsICJGbXQiLCBjbWQsIDAsIHZnZm10LCB2Z19mbXQsICJUeXBlIG9mIG1ldGFkYXRhLiIsIDApCitGSUVMRChWR1MsIHZnLCBTVFIsICJWRyBVVUlEIiwgaWQsIDM4LCB1dWlkLCB2Z191dWlkLCAiVW5pcXVlIGlkZW50aWZpZXIuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNUUiwgIlZHIiwgbmFtZSwgMCwgc3RyaW5nLCB2Z19uYW1lLCAiTmFtZS4iLCAwKQorRklFTEQoVkdTLCB2ZywgU1RSLCAiQXR0ciIsIGNtZCwgNSwgdmdzdGF0dXMsIHZnX2F0dHIsICJWYXJpb3VzIGF0dHJpYnV0ZXMgLSBzZWUgbWFuIHBhZ2UuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNUUiwgIlZQZXJtcyIsIGNtZCwgMTAsIHZncGVybWlzc2lvbnMsIHZnX3Blcm1pc3Npb25zLCAiVkcgcGVybWlzc2lvbnMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIEJJTiwgIkV4dGVuZGFibGUiLCBjbWQsIDAsIHZnZXh0ZW5kYWJsZSwgdmdfZXh0ZW5kYWJsZSwgIlNldCBpZiBWRyBpcyBleHRlbmRhYmxlLiIsIDApCitGSUVMRChWR1MsIHZnLCBCSU4sICJFeHBvcnRlZCIsIGNtZCwgMTAsIHZnZXhwb3J0ZWQsIHZnX2V4cG9ydGVkLCAiU2V0IGlmIFZHIGlzIGV4cG9ydGVkLiIsIDApCitGSUVMRChWR1MsIHZnLCBCSU4sICJQYXJ0aWFsIiwgY21kLCAxMCwgdmdwYXJ0aWFsLCB2Z19wYXJ0aWFsLCAiU2V0IGlmIFZHIGlzIHBhcnRpYWwuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNUUiwgIkFsbG9jUG9sIiwgY21kLCAxMCwgdmdhbGxvY2F0aW9ucG9saWN5LCB2Z19hbGxvY2F0aW9uX3BvbGljeSwgIlZHIGFsbG9jYXRpb24gcG9saWN5LiIsIDApCitGSUVMRChWR1MsIHZnLCBCSU4sICJDbHVzdGVyZWQiLCBjbWQsIDEwLCB2Z2NsdXN0ZXJlZCwgdmdfY2x1c3RlcmVkLCAiU2V0IGlmIFZHIGlzIGNsdXN0ZXJlZC4iLCAwKQorRklFTEQoVkdTLCB2ZywgU0laLCAiVlNpemUiLCBjbWQsIDAsIHZnc2l6ZSwgdmdfc2l6ZSwgIlRvdGFsIHNpemUgb2YgVkcgaW4gY3VycmVudCB1bml0cy4iLCAwKQorRklFTEQoVkdTLCB2ZywgU0laLCAiVkZyZWUiLCBjbWQsIDAsIHZnZnJlZSwgdmdfZnJlZSwgIlRvdGFsIGFtb3VudCBvZiBmcmVlIHNwYWNlIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNUUiwgIlNZUyBJRCIsIGNtZCwgMCwgdmdzeXN0ZW1pZCwgdmdfc3lzaWQsICJTeXN0ZW0gSUQgb2YgdGhlIFZHIGluZGljYXRpbmcgd2hpY2ggaG9zdCBvd25zIGl0LiIsIDApCitGSUVMRChWR1MsIHZnLCBTVFIsICJTeXN0ZW0gSUQiLCBjbWQsIDAsIHZnc3lzdGVtaWQsIHZnX3N5c3RlbWlkLCAiU3lzdGVtIElEIG9mIHRoZSBWRyBpbmRpY2F0aW5nIHdoaWNoIGhvc3Qgb3ducyBpdC4iLCAwKQorRklFTEQoVkdTLCB2ZywgU1RSLCAiTG9ja1R5cGUiLCBjbWQsIDAsIHZnbG9ja3R5cGUsIHZnX2xvY2tfdHlwZSwgIkxvY2sgdHlwZSBvZiB0aGUgVkcgdXNlZCBieSBsdm1sb2NrZC4iLCAwKQorRklFTEQoVkdTLCB2ZywgU1RSLCAiVkxvY2tBcmdzIiwgY21kLCAwLCB2Z2xvY2thcmdzLCB2Z19sb2NrX2FyZ3MsICJMb2NrIGFyZ3Mgb2YgdGhlIFZHIHVzZWQgYnkgbHZtbG9ja2QuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNJWiwgIkV4dCIsIGV4dGVudF9zaXplLCAwLCBzaXplMzIsIHZnX2V4dGVudF9zaXplLCAiU2l6ZSBvZiBQaHlzaWNhbCBFeHRlbnRzIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIiNFeHQiLCBleHRlbnRfY291bnQsIDAsIHVpbnQzMiwgdmdfZXh0ZW50X2NvdW50LCAiVG90YWwgbnVtYmVyIG9mIFBoeXNpY2FsIEV4dGVudHMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIkZyZWUiLCBmcmVlX2NvdW50LCAwLCB1aW50MzIsIHZnX2ZyZWVfY291bnQsICJUb3RhbCBudW1iZXIgb2YgdW5hbGxvY2F0ZWQgUGh5c2ljYWwgRXh0ZW50cy4iLCAwKQorRklFTEQoVkdTLCB2ZywgTlVNLCAiTWF4TFYiLCBtYXhfbHYsIDAsIHVpbnQzMiwgbWF4X2x2LCAiTWF4aW11bSBudW1iZXIgb2YgTFZzIGFsbG93ZWQgaW4gVkcgb3IgMCBpZiB1bmxpbWl0ZWQuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIk1heFBWIiwgbWF4X3B2LCAwLCB1aW50MzIsIG1heF9wdiwgIk1heGltdW0gbnVtYmVyIG9mIFBWcyBhbGxvd2VkIGluIFZHIG9yIDAgaWYgdW5saW1pdGVkLiIsIDApCitGSUVMRChWR1MsIHZnLCBOVU0sICIjUFYiLCBwdl9jb3VudCwgMCwgdWludDMyLCBwdl9jb3VudCwgIk51bWJlciBvZiBQVnMgaW4gVkcuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIiNQViBNaXNzaW5nIiwgY21kLCAwLCB2Z21pc3NpbmdwdmNvdW50LCB2Z19taXNzaW5nX3B2X2NvdW50LCAiTnVtYmVyIG9mIFBWcyBpbiBWRyB3aGljaCBhcmUgbWlzc2luZy4iLCAwKQorRklFTEQoVkdTLCB2ZywgTlVNLCAiI0xWIiwgY21kLCAwLCBsdmNvdW50LCBsdl9jb3VudCwgIk51bWJlciBvZiBMVnMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIiNTTiIsIGNtZCwgMCwgc25hcGNvdW50LCBzbmFwX2NvdW50LCAiTnVtYmVyIG9mIHNuYXBzaG90cy4iLCAwKQorRklFTEQoVkdTLCB2ZywgTlVNLCAiU2VxIiwgc2Vxbm8sIDAsIHVpbnQzMiwgdmdfc2Vxbm8sICJSZXZpc2lvbiBudW1iZXIgb2YgaW50ZXJuYWwgbWV0YWRhdGEuICBJbmNyZW1lbnRlZCB3aGVuZXZlciBpdCBjaGFuZ2VzLiIsIDApCitGSUVMRChWR1MsIHZnLCBTVFJfTElTVCwgIlZHIFRhZ3MiLCB0YWdzLCAwLCB0YWdzLCB2Z190YWdzLCAiVGFncywgaWYgYW55LiIsIDApCitGSUVMRChWR1MsIHZnLCBTVFIsICJWUHJvZmlsZSIsIGNtZCwgMCwgdmdwcm9maWxlLCB2Z19wcm9maWxlLCAiQ29uZmlndXJhdGlvbiBwcm9maWxlIGF0dGFjaGVkIHRvIHRoaXMgVkcuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIiNWTWRhIiwgY21kLCAwLCB2Z21kYXMsIHZnX21kYV9jb3VudCwgIk51bWJlciBvZiBtZXRhZGF0YSBhcmVhcyBvbiB0aGlzIFZHLiIsIDApCitGSUVMRChWR1MsIHZnLCBOVU0sICIjVk1kYVVzZSIsIGNtZCwgMCwgdmdtZGFzdXNlZCwgdmdfbWRhX3VzZWRfY291bnQsICJOdW1iZXIgb2YgbWV0YWRhdGEgYXJlYXMgaW4gdXNlIG9uIHRoaXMgVkcuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNJWiwgIlZNZGFGcmVlIiwgY21kLCA5LCB2Z21kYWZyZWUsIHZnX21kYV9mcmVlLCAiRnJlZSBtZXRhZGF0YSBhcmVhIHNwYWNlIGZvciB0aGlzIFZHIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIFNJWiwgIlZNZGFTaXplIiwgY21kLCA5LCB2Z21kYXNpemUsIHZnX21kYV9zaXplLCAiU2l6ZSBvZiBzbWFsbGVzdCBtZXRhZGF0YSBhcmVhIGZvciB0aGlzIFZHIGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFZHUywgdmcsIE5VTSwgIiNWTWRhQ3BzIiwgY21kLCAwLCB2Z21kYWNvcGllcywgdmdfbWRhX2NvcGllcywgIlRhcmdldCBudW1iZXIgb2YgaW4gdXNlIG1ldGFkYXRhIGFyZWFzIGluIHRoZSBWRy4iLCAxKQorCitGSUVMRChTRUdTLCBzZWcsIFNUUiwgIlR5cGUiLCBsaXN0LCAwLCBzZWd0eXBlLCBzZWd0eXBlLCAiVHlwZSBvZiBMViBzZWdtZW50LiIsIDApCitGSUVMRChTRUdTLCBzZWcsIE5VTSwgIiNTdHIiLCBhcmVhX2NvdW50LCAwLCB1aW50MzIsIHN0cmlwZXMsICJOdW1iZXIgb2Ygc3RyaXBlcyBvciBtaXJyb3IgbGVncy4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBTSVosICJTdHJpcGUiLCBzdHJpcGVfc2l6ZSwgMCwgc2l6ZTMyLCBzdHJpcGVfc2l6ZSwgIkZvciBzdHJpcGVzLCBhbW91bnQgb2YgZGF0YSBwbGFjZWQgb24gb25lIGRldmljZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHRoZSBuZXh0LiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNJWiwgIlJlZ2lvbiIsIHJlZ2lvbl9zaXplLCAwLCBzaXplMzIsIHJlZ2lvbl9zaXplLCAiRm9yIG1pcnJvcnMsIHRoZSB1bml0IG9mIGRhdGEgY29waWVkIHdoZW4gc3luY2hyb25pc2luZyBkZXZpY2VzLiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNJWiwgIkNodW5rIiwgbGlzdCwgMCwgY2h1bmtzaXplLCBjaHVua19zaXplLCAiRm9yIHNuYXBzaG90cywgdGhlIHVuaXQgb2YgZGF0YSB1c2VkIHdoZW4gdHJhY2tpbmcgY2hhbmdlcy4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBOVU0sICIjVGhpbnMiLCBsaXN0LCAwLCB0aGluY291bnQsIHRoaW5fY291bnQsICJGb3IgdGhpbiBwb29scywgdGhlIG51bWJlciBvZiB0aGluIHZvbHVtZXMgaW4gdGhpcyBwb29sLiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNUUiwgIkRpc2NhcmRzIiwgbGlzdCwgMCwgZGlzY2FyZHMsIGRpc2NhcmRzLCAiRm9yIHRoaW4gcG9vbHMsIGhvdyBkaXNjYXJkcyBhcmUgaGFuZGxlZC4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBTVFIsICJDYWNoZU1vZGUiLCBsaXN0LCAwLCBjYWNoZW1vZGUsIGNhY2hlX21vZGUsICJGb3IgY2FjaGUgcG9vbHMsIGhvdyB3cml0ZXMgYXJlIGNhY2hlZC4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBCSU4sICJaZXJvIiwgbGlzdCwgMCwgdGhpbnplcm8sIHplcm8sICJGb3IgdGhpbiBwb29scyBhbmQgdm9sdW1lcywgaWYgemVyb2luZyBpcyBlbmFibGVkLiIsIDApCitGSUVMRChTRUdTLCBzZWcsIE5VTSwgIlRyYW5zSWQiLCBsaXN0LCAwLCB0cmFuc2FjdGlvbmlkLCB0cmFuc2FjdGlvbl9pZCwgIkZvciB0aGluIHBvb2xzLCB0aGUgdHJhbnNhY3Rpb24gaWQgYW5kIGNyZWF0aW9uIHRyYW5zYWN0aW9uIGlkIGZvciB0aGlucy4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBOVU0sICJUaElkIiwgbGlzdCwgMCwgdGhpbmlkLCB0aGluX2lkLCAiRm9yIHRoaW4gdm9sdW1lLCB0aGUgdGhpbiBkZXZpY2UgaWQuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgU0laLCAiU3RhcnQiLCBsaXN0LCAwLCBzZWdzdGFydCwgc2VnX3N0YXJ0LCAiT2Zmc2V0IHdpdGhpbiB0aGUgTFYgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgTlVNLCAiU3RhcnQiLCBsaXN0LCAwLCBzZWdzdGFydHBlLCBzZWdfc3RhcnRfcGUsICJPZmZzZXQgd2l0aGluIHRoZSBMViB0byB0aGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQgaW4gcGh5c2ljYWwgZXh0ZW50cy4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBTSVosICJTU2l6ZSIsIGxpc3QsIDAsIHNlZ3NpemUsIHNlZ19zaXplLCAiU2l6ZSBvZiBzZWdtZW50IGluIGN1cnJlbnQgdW5pdHMuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgU0laLCAiU1NpemUiLCBsaXN0LCAwLCBzZWdzaXplcGUsIHNlZ19zaXplX3BlLCAiU2l6ZSBvZiBzZWdtZW50IGluIHBoeXNpY2FsIGV4dGVudHMuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgU1RSX0xJU1QsICJTZWcgVGFncyIsIHRhZ3MsIDAsIHRhZ3MsIHNlZ190YWdzLCAiVGFncywgaWYgYW55LiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNUUl9MSVNULCAiUEUgUmFuZ2VzIiwgbGlzdCwgMCwgcGVyYW5nZXMsIHNlZ19wZV9yYW5nZXMsICJSYW5nZXMgb2YgUGh5c2ljYWwgRXh0ZW50cyBvZiB1bmRlcmx5aW5nIGRldmljZXMgaW4gY29tbWFuZCBsaW5lIGZvcm1hdCAoZGVwcmVjYXRlZCwgdXNlIHNlZ19sZV9yYW5nZXMgZm9yIGNvbW1vbiBmb3JtYXQpLiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNUUl9MSVNULCAiTEUgUmFuZ2VzIiwgbGlzdCwgMCwgbGVyYW5nZXMsIHNlZ19sZV9yYW5nZXMsICJSYW5nZXMgb2YgTG9naWNhbCBFeHRlbnRzIG9mIHVuZGVybHlpbmcgZGV2aWNlcyBpbiBjb21tYW5kIGxpbmUgZm9ybWF0LiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNUUl9MSVNULCAiTWV0YWRhdGEgTEUgUmFuZ2VzIiwgbGlzdCwgMCwgbWV0YWRhdGFsZXJhbmdlcywgc2VnX21ldGFkYXRhX2xlX3JhbmdlcywgIlJhbmdlcyBvZiBMb2dpY2FsIEV4dGVudHMgb2YgdW5kZXJseWluZyBtZXRhZGF0YSBkZXZpY2VzIGluIGNvbW1hbmQgbGluZSBmb3JtYXQuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgU1RSX0xJU1QsICJEZXZpY2VzIiwgbGlzdCwgMCwgZGV2aWNlcywgZGV2aWNlcywgIlVuZGVybHlpbmcgZGV2aWNlcyB1c2VkIHdpdGggc3RhcnRpbmcgZXh0ZW50IG51bWJlcnMuIiwgMCkKK0ZJRUxEKFNFR1MsIHNlZywgU1RSX0xJU1QsICJNZXRhZGF0YSBEZXZzIiwgbGlzdCwgMCwgbWV0YWRhdGFkZXZpY2VzLCBtZXRhZGF0YV9kZXZpY2VzLCAiVW5kZXJseWluZyBtZXRhZGF0YSBkZXZpY2VzIHVzZWQgd2l0aCBzdGFydGluZyBleHRlbnQgbnVtYmVycy4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBTVFIsICJNb25pdG9yIiwgbGlzdCwgMCwgc2VnbW9uaXRvciwgc2VnX21vbml0b3IsICJEbWV2ZW50ZCBtb25pdG9yaW5nIHN0YXR1cyBvZiB0aGUgc2VnbWVudC4iLCAwKQorRklFTEQoU0VHUywgc2VnLCBTVFIsICJDYWNoZVBvbGljeSIsIGxpc3QsIDAsIGNhY2hlX3BvbGljeSwgY2FjaGVfcG9saWN5LCAiVGhlIGNhY2hlIHBvbGljeSAoY2FjaGVkIHNlZ21lbnRzIG9ubHkpLiIsIDApCitGSUVMRChTRUdTLCBzZWcsIFNUUl9MSVNULCAiQ2FjaGVTZXR0aW5ncyIsIGxpc3QsIDAsIGNhY2hlX3NldHRpbmdzLCBjYWNoZV9zZXR0aW5ncywgIkNhY2hlIHNldHRpbmdzL3BhcmFtZXRlcnMgKGNhY2hlZCBzZWdtZW50cyBvbmx5KS4iLCAwKQorCitGSUVMRChQVlNFR1MsIHB2c2VnLCBOVU0sICJTdGFydCIsIHBlLCAwLCB1aW50MzIsIHB2c2VnX3N0YXJ0LCAiUGh5c2ljYWwgRXh0ZW50IG51bWJlciBvZiBzdGFydCBvZiBzZWdtZW50LiIsIDApCitGSUVMRChQVlNFR1MsIHB2c2VnLCBOVU0sICJTU2l6ZSIsIGxlbiwgMCwgdWludDMyLCBwdnNlZ19zaXplLCAiTnVtYmVyIG9mIGV4dGVudHMgaW4gc2VnbWVudC4iLCAwKQorLyogKklOREVOVC1PTiogKi8KZGlmZiAtLWdpdCBhL2xpYi9yZXBvcnQvcHJvcGVydGllcy5jIGIvbGliL3JlcG9ydC9wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmZWIwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yZXBvcnQvcHJvcGVydGllcy5jCkBAIC0wLDAgKzEsNTcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKKworI2RlZmluZSBHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFKSBcCisJR0VUX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSwgdm9sdW1lX2dyb3VwLCB2ZykKKyNkZWZpbmUgR0VUX1BWX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSkgXAorCUdFVF9OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIHBoeXNpY2FsX3ZvbHVtZSwgcHYpCisjZGVmaW5lIEdFVF9MVl9OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlHRVRfTlVNX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFLCBsb2dpY2FsX3ZvbHVtZSwgbHYpCisjZGVmaW5lIEdFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlHRVRfTlVNX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFLCBsdl9zZWdtZW50LCBsdnNlZykKKyNkZWZpbmUgR0VUX1BWU0VHX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSkgXAorCUdFVF9OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIHB2X3NlZ21lbnQsIHB2c2VnKQorCisjZGVmaW5lIFNFVF9WR19OVU1fUFJPUEVSVFlfRk4oTkFNRSwgU0VURk4pIFwKKwlTRVRfTlVNX1BST1BFUlRZX0ZOKE5BTUUsIFNFVEZOLCB2b2x1bWVfZ3JvdXAsIHZnKQorI2RlZmluZSBTRVRfUFZfTlVNX1BST1BFUlRZX0ZOKE5BTUUsIFNFVEZOKSBcCisJU0VUX05VTV9QUk9QRVJUWV9GTihOQU1FLCBTRVRGTiwgcGh5c2ljYWxfdm9sdW1lLCBwdikKKyNkZWZpbmUgU0VUX0xWX05VTV9QUk9QRVJUWV9GTihOQU1FLCBTRVRGTikgXAorCVNFVF9OVU1fUFJPUEVSVFlfRk4oTkFNRSwgU0VURk4sIGxvZ2ljYWxfdm9sdW1lLCBsdikKKworI2RlZmluZSBHRVRfVkdfU1RSX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFKSBcCisJR0VUX1NUUl9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSwgdm9sdW1lX2dyb3VwLCB2ZykKKyNkZWZpbmUgR0VUX1BWX1NUUl9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSkgXAorCUdFVF9TVFJfUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIHBoeXNpY2FsX3ZvbHVtZSwgcHYpCisjZGVmaW5lIEdFVF9MVl9TVFJfUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlHRVRfU1RSX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFLCBsb2dpY2FsX3ZvbHVtZSwgbHYpCisjZGVmaW5lIEdFVF9MVlNFR19TVFJfUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlHRVRfU1RSX1BST1BFUlRZX0ZOKE5BTUUsIFZBTFVFLCBsdl9zZWdtZW50LCBsdnNlZykKKyNkZWZpbmUgR0VUX1BWU0VHX1NUUl9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSkgXAorCUdFVF9TVFJfUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUsIHB2X3NlZ21lbnQsIHB2c2VnKQorCitzdGF0aWMgZG1fcGVyY2VudF90IF9jb3B5X3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlkbV9wZXJjZW50X3QgcGVyY2VudDsKKworCWlmICghbHZfbWlycm9yX3BlcmNlbnQobHYtPnZnLT5jbWQsIGx2LCAwLCAmcGVyY2VudCwgTlVMTCkpCisJCXBlcmNlbnQgPSBETV9QRVJDRU5UX0lOVkFMSUQ7CisKKwlyZXR1cm4gcGVyY2VudDsKK30KKworc3RhdGljIHVpbnQ2NF90IF9yYWlkbWlzbWF0Y2hjb3VudChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVpbnQ2NF90IGNudDsKKworCWlmICghbHZfcmFpZF9taXNtYXRjaF9jb3VudChsdiwgJmNudCkpCisJCXJldHVybiAwOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBjaGFyICpfcmFpZHN5bmNhY3Rpb24oY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljaGFyICphY3Rpb247CisKKwlpZiAoIWx2X3JhaWRfc3luY19hY3Rpb24obHYsICZhY3Rpb24pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhY3Rpb247Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfcmFpZHdyaXRlYmVoaW5kKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJcmV0dXJuIGZpcnN0X3NlZyhsdiktPndyaXRlYmVoaW5kOworfQorCitzdGF0aWMgdWludDMyX3QgX3JhaWRtaW5yZWNvdmVyeXJhdGUoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlyZXR1cm4gZmlyc3Rfc2VnKGx2KS0+bWluX3JlY292ZXJ5X3JhdGU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfcmFpZG1heHJlY292ZXJ5cmF0ZShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXJldHVybiBmaXJzdF9zZWcobHYpLT5tYXhfcmVjb3ZlcnlfcmF0ZTsKK30KKworc3RhdGljIGRtX3BlcmNlbnRfdCBfc25hcF9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJZG1fcGVyY2VudF90IHBlcmNlbnQ7CisKKwlpZiAoIWx2X2lzX2NvdyhsdikgfHwgIWx2X3NuYXBzaG90X3BlcmNlbnQobHYsICZwZXJjZW50KSkKKwkJcGVyY2VudCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKworCXJldHVybiBwZXJjZW50OworfQorCitzdGF0aWMgZG1fcGVyY2VudF90IF9kYXRhX3BlcmNlbnQoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlkbV9wZXJjZW50X3QgcGVyY2VudDsKKwlzdHJ1Y3QgbHZfc3RhdHVzX2NhY2hlICpzdGF0dXM7CisKKwlpZiAobHZfaXNfY293KGx2KSkKKwkJcmV0dXJuIF9zbmFwX3BlcmNlbnQobHYpOworCisJaWYgKGx2X2lzX2NhY2hlKGx2KSB8fCBsdl9pc191c2VkX2NhY2hlX3Bvb2wobHYpKSB7CisJCWlmICghbHZfY2FjaGVfc3RhdHVzKGx2LCAmc3RhdHVzKSkgeworCQkJc3RhY2s7CisJCQlyZXR1cm4gRE1fUEVSQ0VOVF9JTlZBTElEOworCQl9CisJCXBlcmNlbnQgPSBzdGF0dXMtPmRpcnR5X3VzYWdlOworCQlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLT5tZW0pOworCQlyZXR1cm4gcGVyY2VudDsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKQorCQlyZXR1cm4gbHZfdGhpbl9wZXJjZW50KGx2LCAwLCAmcGVyY2VudCkgPyBwZXJjZW50IDogRE1fUEVSQ0VOVF9JTlZBTElEOworCisJcmV0dXJuIGx2X3RoaW5fcG9vbF9wZXJjZW50KGx2LCAwLCAmcGVyY2VudCkgPyBwZXJjZW50IDogRE1fUEVSQ0VOVF9JTlZBTElEOworfQorCitzdGF0aWMgZG1fcGVyY2VudF90IF9tZXRhZGF0YV9wZXJjZW50KGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJZG1fcGVyY2VudF90IHBlcmNlbnQ7CisJc3RydWN0IGx2X3N0YXR1c19jYWNoZSAqc3RhdHVzOworCisJaWYgKGx2X2lzX2NhY2hlKGx2KSB8fCBsdl9pc191c2VkX2NhY2hlX3Bvb2wobHYpKSB7CisJCWlmICghbHZfY2FjaGVfc3RhdHVzKGx2LCAmc3RhdHVzKSkgeworCQkJc3RhY2s7CisJCQlyZXR1cm4gRE1fUEVSQ0VOVF9JTlZBTElEOworCQl9CisJCXBlcmNlbnQgPSBzdGF0dXMtPmRpcnR5X3VzYWdlOworCQlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLT5tZW0pOworCQlyZXR1cm4gcGVyY2VudDsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkKKwkJcmV0dXJuIGx2X3RoaW5fcG9vbF9wZXJjZW50KGx2LCAxLCAmcGVyY2VudCkgPyBwZXJjZW50IDogRE1fUEVSQ0VOVF9JTlZBTElEOworCisJcmV0dXJuIERNX1BFUkNFTlRfSU5WQUxJRDsKK30KKworLyogUFYgKi8KK0dFVF9QVl9TVFJfUFJPUEVSVFlfRk4ocHZfZm10LCBwdl9mbXRfZHVwKHB2KSkKKyNkZWZpbmUgX3B2X2ZtdF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfU1RSX1BST1BFUlRZX0ZOKHB2X3V1aWQsIHB2X3V1aWRfZHVwKHB2LT52Zy0+dmdtZW0sIHB2KSkKKyNkZWZpbmUgX3B2X3V1aWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1BWX05VTV9QUk9QRVJUWV9GTihkZXZfc2l6ZSwgU0VDVE9SX1NJWkUgKiBwdl9kZXZfc2l6ZShwdikpCisjZGVmaW5lIF9kZXZfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfU1RSX1BST1BFUlRZX0ZOKHB2X25hbWUsIHB2X25hbWVfZHVwKHB2LT52Zy0+dmdtZW0sIHB2KSkKKyNkZWZpbmUgX3B2X25hbWVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1BWX05VTV9QUk9QRVJUWV9GTihwdl9tZGFfZnJlZSwgU0VDVE9SX1NJWkUgKiBwdl9tZGFfZnJlZShwdikpCisjZGVmaW5lIF9wdl9tZGFfZnJlZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfTlVNX1BST1BFUlRZX0ZOKHB2X21kYV9zaXplLCBTRUNUT1JfU0laRSAqIHB2X21kYV9zaXplKHB2KSkKKyNkZWZpbmUgX3B2X21kYV9zaXplX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9OVU1fUFJPUEVSVFlfRk4ocGVfc3RhcnQsIFNFQ1RPUl9TSVpFICogcHYtPnBlX3N0YXJ0KQorI2RlZmluZSBfcGVfc3RhcnRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1BWX05VTV9QUk9QRVJUWV9GTihwdl9zaXplLCBTRUNUT1JfU0laRSAqIHB2X3NpemVfZmllbGQocHYpKQorI2RlZmluZSBfcHZfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfTlVNX1BST1BFUlRZX0ZOKHB2X2ZyZWUsIFNFQ1RPUl9TSVpFICogcHZfZnJlZShwdikpCisjZGVmaW5lIF9wdl9mcmVlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9OVU1fUFJPUEVSVFlfRk4ocHZfdXNlZCwgU0VDVE9SX1NJWkUgKiBwdl91c2VkKHB2KSkKKyNkZWZpbmUgX3B2X3VzZWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1BWX1NUUl9QUk9QRVJUWV9GTihwdl9hdHRyLCBwdl9hdHRyX2R1cChwdi0+dmctPnZnbWVtLCBwdikpCisjZGVmaW5lIF9wdl9hdHRyX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9OVU1fUFJPUEVSVFlfRk4ocHZfcGVfY291bnQsIHB2LT5wZV9jb3VudCkKKyNkZWZpbmUgX3B2X3BlX2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9OVU1fUFJPUEVSVFlfRk4ocHZfcGVfYWxsb2NfY291bnQsIHB2LT5wZV9hbGxvY19jb3VudCkKKyNkZWZpbmUgX3B2X3BlX2FsbG9jX2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9TVFJfUFJPUEVSVFlfRk4ocHZfdGFncywgcHZfdGFnc19kdXAocHYpKQorI2RlZmluZSBfcHZfdGFnc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfTlVNX1BST1BFUlRZX0ZOKHB2X21kYV9jb3VudCwgcHZfbWRhX2NvdW50KHB2KSkKKyNkZWZpbmUgX3B2X21kYV9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfTlVNX1BST1BFUlRZX0ZOKHB2X21kYV91c2VkX2NvdW50LCBwdl9tZGFfdXNlZF9jb3VudChwdikpCisjZGVmaW5lIF9wdl9tZGFfdXNlZF9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZfTlVNX1BST1BFUlRZX0ZOKHB2X2JhX3N0YXJ0LCBTRUNUT1JfU0laRSAqIHB2LT5iYV9zdGFydCkKKyNkZWZpbmUgX3B2X2JhX3N0YXJ0X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9QVl9OVU1fUFJPUEVSVFlfRk4ocHZfYmFfc2l6ZSwgU0VDVE9SX1NJWkUgKiBwdi0+YmFfc2l6ZSkKKyNkZWZpbmUgX3B2X2JhX3NpemVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorCisjZGVmaW5lIF9wdl9hbGxvY2F0YWJsZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9wdl9hbGxvY2F0YWJsZV9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9leHBvcnRlZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9wdl9leHBvcnRlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9taXNzaW5nX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX3B2X21pc3NpbmdfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfcHZfZXh0X3Zzbl9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9leHRfdnNuX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX3B2X2luX3VzZV9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9pbl91c2Vfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfcHZfZHVwbGljYXRlX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX3B2X2R1cGxpY2F0ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9wdl9tYWpvcl9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9tYWpvcl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9wdl9taW5vcl9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9wdl9taW5vcl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisKKyNkZWZpbmUgX3ZnX3Blcm1pc3Npb25zX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX3ZnX3Blcm1pc3Npb25zX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX3ZnX2V4dGVuZGFibGVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfdmdfZXh0ZW5kYWJsZV9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF92Z19leHBvcnRlZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF92Z19leHBvcnRlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF92Z19wYXJ0aWFsX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX3ZnX3BhcnRpYWxfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfdmdfYWxsb2NhdGlvbl9wb2xpY3lfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfdmdfYWxsb2NhdGlvbl9wb2xpY3lfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfdmdfY2x1c3RlcmVkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX3ZnX2NsdXN0ZXJlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisKKyNkZWZpbmUgX2x2X2xheW91dF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9sYXlvdXRfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfcm9sZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9yb2xlX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2luaXRpYWxfaW1hZ2Vfc3luY19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9pbml0aWFsX2ltYWdlX3N5bmNfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfaW1hZ2Vfc3luY2VkX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2ltYWdlX3N5bmNlZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9pbWFnZV9zeW5jZWRfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfbWVyZ2luZ19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9tZXJnaW5nX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2NvbnZlcnRpbmdfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfY29udmVydGluZ19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9wZXJtaXNzaW9uc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9wZXJtaXNzaW9uc19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9hbGxvY2F0aW9uX3BvbGljeV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9hbGxvY2F0aW9uX3BvbGljeV9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9hbGxvY2F0aW9uX2xvY2tlZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9hbGxvY2F0aW9uX2xvY2tlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9hY3RpdmVfbG9jYWxseV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9hY3RpdmVfbG9jYWxseV9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9hY3RpdmVfcmVtb3RlbHlfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfYWN0aXZlX3JlbW90ZWx5X2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2FjdGl2ZV9leGNsdXNpdmVseV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9hY3RpdmVfZXhjbHVzaXZlbHlfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfZml4ZWRfbWlub3Jfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfZml4ZWRfbWlub3JfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfbWVyZ2VfZmFpbGVkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X21lcmdlX2ZhaWxlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9zbmFwc2hvdF9pbnZhbGlkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X3NuYXBzaG90X2ludmFsaWRfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfc3VzcGVuZGVkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X3N1c3BlbmRlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9saXZlX3RhYmxlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X2xpdmVfdGFibGVfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfaW5hY3RpdmVfdGFibGVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfaW5hY3RpdmVfdGFibGVfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfZGV2aWNlX29wZW5fc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfZGV2aWNlX29wZW5fZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfaGVhbHRoX3N0YXR1c19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9oZWFsdGhfc3RhdHVzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X3NraXBfYWN0aXZhdGlvbl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9za2lwX2FjdGl2YXRpb25fZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfbHZfY2hlY2tfbmVlZGVkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X2NoZWNrX25lZWRlZF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl9oaXN0b3JpY2FsX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X2hpc3RvcmljYWxfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorCisjZGVmaW5lIF9jYWNoZV90b3RhbF9ibG9ja3Nfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfY2FjaGVfdG90YWxfYmxvY2tzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2NhY2hlX3VzZWRfYmxvY2tzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2NhY2hlX3VzZWRfYmxvY2tzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2NhY2hlX2RpcnR5X2Jsb2Nrc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9jYWNoZV9kaXJ0eV9ibG9ja3NfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfY2FjaGVfcmVhZF9oaXRzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2NhY2hlX3JlYWRfaGl0c19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9jYWNoZV9yZWFkX21pc3Nlc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9jYWNoZV9yZWFkX21pc3Nlc19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9jYWNoZV93cml0ZV9oaXRzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2NhY2hlX3dyaXRlX2hpdHNfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfY2FjaGVfd3JpdGVfbWlzc2VzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2NhY2hlX3dyaXRlX21pc3Nlc19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisKKy8qIExWICovCitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X3V1aWQsIGx2X3V1aWRfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2x2X3V1aWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihsdl9uYW1lLCBsdl9uYW1lX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9sdl9uYW1lX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obHZfZnVsbF9uYW1lLCBsdl9mdWxsbmFtZV9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfbHZfZnVsbF9uYW1lX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obHZfcGF0aCwgbHZfcGF0aF9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfbHZfcGF0aF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X2RtX3BhdGgsIGx2X2RtcGF0aF9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfbHZfZG1fcGF0aF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X3BhcmVudCwgbHZfcGFyZW50X2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9sdl9wYXJlbnRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihsdl9hdHRyLCBsdl9hdHRyX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9sdl9hdHRyX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4obHZfbWFqb3IsIGx2LT5tYWpvcikKKyNkZWZpbmUgX2x2X21ham9yX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4obHZfbWlub3IsIGx2LT5taW5vcikKKyNkZWZpbmUgX2x2X3doZW5fZnVsbF9nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9sdl93aGVuX2Z1bGxfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfbWlub3Jfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX05VTV9QUk9QRVJUWV9GTihsdl9yZWFkX2FoZWFkLCBsdi0+cmVhZF9haGVhZCAqIFNFQ1RPUl9TSVpFKQorI2RlZmluZSBfbHZfcmVhZF9haGVhZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKGx2X2tlcm5lbF9tYWpvciwgbHZfa2VybmVsX21ham9yKGx2KSkKKyNkZWZpbmUgX2x2X2tlcm5lbF9tYWpvcl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKGx2X2tlcm5lbF9taW5vciwgbHZfa2VybmVsX21pbm9yKGx2KSkKKyNkZWZpbmUgX2x2X2tlcm5lbF9taW5vcl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKGx2X2tlcm5lbF9yZWFkX2FoZWFkLCBsdl9rZXJuZWxfcmVhZF9haGVhZChsdikgKiBTRUNUT1JfU0laRSkKKyNkZWZpbmUgX2x2X2tlcm5lbF9yZWFkX2FoZWFkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4obHZfc2l6ZSwgbHYtPnNpemUgKiBTRUNUT1JfU0laRSkKKyNkZWZpbmUgX2x2X3NpemVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX05VTV9QUk9QRVJUWV9GTihzZWdfY291bnQsIGRtX2xpc3Rfc2l6ZSgmbHYtPnNlZ21lbnRzKSkKKyNkZWZpbmUgX3NlZ19jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKG9yaWdpbiwgbHZfb3JpZ2luX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9vcmlnaW5fc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihvcmlnaW5fdXVpZCwgbHZfb3JpZ2luX3V1aWRfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX29yaWdpbl91dWlkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4ob3JpZ2luX3NpemUsIChTRUNUT1JfU0laRSAqIGx2X29yaWdpbl9zaXplKGx2KSkpCisjZGVmaW5lIF9vcmlnaW5fc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9sdl9hbmNlc3RvcnNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfYW5jZXN0b3JzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2Z1bGxfYW5jZXN0b3JzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X2Z1bGxfYW5jZXN0b3JzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2Rlc2NlbmRhbnRzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2x2X2Rlc2NlbmRhbnRzX2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2x2X2Z1bGxfZGVzY2VuZGFudHNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorI2RlZmluZSBfbHZfZnVsbF9kZXNjZW5kYW50c19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKHNuYXBfcGVyY2VudCwgX3NuYXBfcGVyY2VudChsdikpCisjZGVmaW5lIF9zbmFwX3BlcmNlbnRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX05VTV9QUk9QRVJUWV9GTihjb3B5X3BlcmNlbnQsIF9jb3B5X3BlcmNlbnQobHYpKQorI2RlZmluZSBfY29weV9wZXJjZW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4oc3luY19wZXJjZW50LCBfY29weV9wZXJjZW50KGx2KSkKKyNkZWZpbmUgX3N5bmNfcGVyY2VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKHJhaWRfbWlzbWF0Y2hfY291bnQsIF9yYWlkbWlzbWF0Y2hjb3VudChsdikpCisjZGVmaW5lIF9yYWlkX21pc21hdGNoX2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4ocmFpZF93cml0ZV9iZWhpbmQsIF9yYWlkd3JpdGViZWhpbmQobHYpKQorI2RlZmluZSBfcmFpZF93cml0ZV9iZWhpbmRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX05VTV9QUk9QRVJUWV9GTihyYWlkX21pbl9yZWNvdmVyeV9yYXRlLCBfcmFpZG1pbnJlY292ZXJ5cmF0ZShsdikpCisjZGVmaW5lIF9yYWlkX21pbl9yZWNvdmVyeV9yYXRlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4ocmFpZF9tYXhfcmVjb3ZlcnlfcmF0ZSwgX3JhaWRtYXhyZWNvdmVyeXJhdGUobHYpKQorI2RlZmluZSBfcmFpZF9tYXhfcmVjb3ZlcnlfcmF0ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKHJhaWRfc3luY19hY3Rpb24sIF9yYWlkc3luY2FjdGlvbihsdikpCisjZGVmaW5lIF9yYWlkX3N5bmNfYWN0aW9uX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obW92ZV9wdiwgbHZfbW92ZV9wdl9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfbW92ZV9wdl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKG1vdmVfcHZfdXVpZCwgbHZfbW92ZV9wdl91dWlkX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9tb3ZlX3B2X3V1aWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihjb252ZXJ0X2x2LCBsdl9jb252ZXJ0X2x2X2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9jb252ZXJ0X2x2X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4oY29udmVydF9sdl91dWlkLCBsdl9jb252ZXJ0X2x2X3V1aWRfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2NvbnZlcnRfbHZfdXVpZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X3RhZ3MsIGx2X3RhZ3NfZHVwKGx2KSkKKyNkZWZpbmUgX2x2X3RhZ3Nfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihtaXJyb3JfbG9nLCBsdl9taXJyb3JfbG9nX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9taXJyb3JfbG9nX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obWlycm9yX2xvZ191dWlkLCBsdl9taXJyb3JfbG9nX3V1aWRfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX21pcnJvcl9sb2dfdXVpZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X21vZHVsZXMsIGx2X21vZHVsZXNfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2x2X21vZHVsZXNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihkYXRhX2x2LCBsdl9kYXRhX2x2X2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9kYXRhX2x2X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4oZGF0YV9sdl91dWlkLCBsdl9kYXRhX2x2X3V1aWRfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2RhdGFfbHZfdXVpZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKG1ldGFkYXRhX2x2LCBsdl9tZXRhZGF0YV9sdl9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfbWV0YWRhdGFfbHZfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihtZXRhZGF0YV9sdl91dWlkLCBsdl9tZXRhZGF0YV9sdl91dWlkX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9tZXRhZGF0YV9sdl91dWlkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4ocG9vbF9sdiwgbHZfcG9vbF9sdl9kdXAobHYtPnZnLT52Z21lbSwgbHYpKQorI2RlZmluZSBfcG9vbF9sdl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKHBvb2xfbHZfdXVpZCwgbHZfcG9vbF9sdl91dWlkX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9wb29sX2x2X3V1aWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX05VTV9QUk9QRVJUWV9GTihkYXRhX3BlcmNlbnQsIF9kYXRhX3BlcmNlbnQobHYpKQorI2RlZmluZSBfZGF0YV9wZXJjZW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9OVU1fUFJPUEVSVFlfRk4obWV0YWRhdGFfcGVyY2VudCwgX21ldGFkYXRhX3BlcmNlbnQobHYpKQorI2RlZmluZSBfbWV0YWRhdGFfcGVyY2VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfTlVNX1BST1BFUlRZX0ZOKGx2X21ldGFkYXRhX3NpemUsIGx2X21ldGFkYXRhX3NpemUobHYpICogU0VDVE9SX1NJWkUpCisjZGVmaW5lIF9sdl9tZXRhZGF0YV9zaXplX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obHZfdGltZSwgbHZfY3JlYXRpb25fdGltZV9kdXAobHYtPnZnLT52Z21lbSwgbHYsIDApKQorI2RlZmluZSBfbHZfdGltZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X3RpbWVfcmVtb3ZlZCwgbHZfcmVtb3ZhbF90aW1lX2R1cChsdi0+dmctPnZnbWVtLCBsdiwgMCkpCisjZGVmaW5lIF9sdl90aW1lX3JlbW92ZWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihsdl9ob3N0LCBsdl9ob3N0X2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9sdl9ob3N0X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVl9TVFJfUFJPUEVSVFlfRk4obHZfYWN0aXZlLCBsdl9hY3RpdmVfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2x2X2FjdGl2ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZfU1RSX1BST1BFUlRZX0ZOKGx2X3Byb2ZpbGUsIGx2X3Byb2ZpbGVfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KSkKKyNkZWZpbmUgX2x2X3Byb2ZpbGVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWX1NUUl9QUk9QRVJUWV9GTihsdl9sb2NrYXJncywgbHZfbG9ja19hcmdzX2R1cChsdi0+dmctPnZnbWVtLCBsdikpCisjZGVmaW5lIF9sdl9sb2NrYXJnc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisKKy8qIFZHICovCitHRVRfVkdfU1RSX1BST1BFUlRZX0ZOKHZnX2ZtdCwgdmdfZm10X2R1cCh2ZykpCisjZGVmaW5lIF92Z19mbXRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1ZHX1NUUl9QUk9QRVJUWV9GTih2Z191dWlkLCB2Z191dWlkX2R1cCh2ZykpCisjZGVmaW5lIF92Z191dWlkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19TVFJfUFJPUEVSVFlfRk4odmdfbmFtZSwgdmdfbmFtZV9kdXAodmcpKQorI2RlZmluZSBfdmdfbmFtZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfU1RSX1BST1BFUlRZX0ZOKHZnX2F0dHIsIHZnX2F0dHJfZHVwKHZnLT52Z21lbSwgdmcpKQorI2RlZmluZSBfdmdfYXR0cl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX3NpemUsIChTRUNUT1JfU0laRSAqIHZnX3NpemUodmcpKSkKKyNkZWZpbmUgX3ZnX3NpemVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1ZHX05VTV9QUk9QRVJUWV9GTih2Z19mcmVlLCAoU0VDVE9SX1NJWkUgKiB2Z19mcmVlKHZnKSkpCisjZGVmaW5lIF92Z19mcmVlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19TVFJfUFJPUEVSVFlfRk4odmdfc3lzaWQsIHZnX3N5c3RlbV9pZF9kdXAodmcpKQorI2RlZmluZSBfdmdfc3lzaWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1ZHX1NUUl9QUk9QRVJUWV9GTih2Z19zeXN0ZW1pZCwgdmdfc3lzdGVtX2lkX2R1cCh2ZykpCisjZGVmaW5lIF92Z19zeXN0ZW1pZF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfU1RSX1BST1BFUlRZX0ZOKHZnX2xvY2tfdHlwZSwgdmdfbG9ja190eXBlX2R1cCh2ZykpCisjZGVmaW5lIF92Z19sb2NrX3R5cGVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1ZHX1NUUl9QUk9QRVJUWV9GTih2Z19sb2NrX2FyZ3MsIHZnX2xvY2tfYXJnc19kdXAodmcpKQorI2RlZmluZSBfdmdfbG9ja19hcmdzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4odmdfZXh0ZW50X3NpemUsIChTRUNUT1JfU0laRSAqIHZnLT5leHRlbnRfc2l6ZSkpCisjZGVmaW5lIF92Z19leHRlbnRfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX2V4dGVudF9jb3VudCwgdmctPmV4dGVudF9jb3VudCkKKyNkZWZpbmUgX3ZnX2V4dGVudF9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX2ZyZWVfY291bnQsIHZnLT5mcmVlX2NvdW50KQorI2RlZmluZSBfdmdfZnJlZV9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKG1heF9sdiwgdmctPm1heF9sdikKKyNkZWZpbmUgX21heF9sdl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKG1heF9wdiwgdmctPm1heF9wdikKKyNkZWZpbmUgX21heF9wdl9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHB2X2NvdW50LCB2Zy0+cHZfY291bnQpCisjZGVmaW5lIF9wdl9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKGx2X2NvdW50LCAodmdfdmlzaWJsZV9sdnModmcpKSkKKyNkZWZpbmUgX2x2X2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4oc25hcF9jb3VudCwgKHNuYXBzaG90X2NvdW50KHZnKSkpCisjZGVmaW5lIF9zbmFwX2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4odmdfc2Vxbm8sIHZnLT5zZXFubykKKyNkZWZpbmUgX3ZnX3NlcW5vX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19TVFJfUFJPUEVSVFlfRk4odmdfdGFncywgdmdfdGFnc19kdXAodmcpKQorI2RlZmluZSBfdmdfdGFnc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX21kYV9jb3VudCwgKHZnX21kYV9jb3VudCh2ZykpKQorI2RlZmluZSBfdmdfbWRhX2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4odmdfbWRhX3VzZWRfY291bnQsICh2Z19tZGFfdXNlZF9jb3VudCh2ZykpKQorI2RlZmluZSBfdmdfbWRhX3VzZWRfY291bnRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX1ZHX05VTV9QUk9QRVJUWV9GTih2Z19tZGFfZnJlZSwgKFNFQ1RPUl9TSVpFICogdmdfbWRhX2ZyZWUodmcpKSkKKyNkZWZpbmUgX3ZnX21kYV9mcmVlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4odmdfbWRhX3NpemUsIChTRUNUT1JfU0laRSAqIHZnX21kYV9zaXplKHZnKSkpCisjZGVmaW5lIF92Z19tZGFfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX21kYV9jb3BpZXMsICh2Z19tZGFfY29waWVzKHZnKSkpCitTRVRfVkdfTlVNX1BST1BFUlRZX0ZOKHZnX21kYV9jb3BpZXMsIHZnX3NldF9tZGFfY29waWVzKQorR0VUX1ZHX1NUUl9QUk9QRVJUWV9GTih2Z19wcm9maWxlLCB2Z19wcm9maWxlX2R1cCh2ZykpCisjZGVmaW5lIF92Z19wcm9maWxlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9WR19OVU1fUFJPUEVSVFlfRk4odmdfbWlzc2luZ19wdl9jb3VudCwgdmdfbWlzc2luZ19wdl9jb3VudCh2ZykpCisjZGVmaW5lIF92Z19taXNzaW5nX3B2X2NvdW50X3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKworLyogTFZTRUcgKi8KK0dFVF9MVlNFR19TVFJfUFJPUEVSVFlfRk4oc2VndHlwZSwgbHZzZWdfc2VndHlwZV9kdXAobHZzZWctPmx2LT52Zy0+dmdtZW0sIGx2c2VnKSkKKyNkZWZpbmUgX3NlZ3R5cGVfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWU0VHX05VTV9QUk9QRVJUWV9GTihzdHJpcGVzLCBsdnNlZy0+YXJlYV9jb3VudCkKKyNkZWZpbmUgX3N0cmlwZXNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWU0VHX05VTV9QUk9QRVJUWV9GTihzdHJpcGVfc2l6ZSwgKFNFQ1RPUl9TSVpFICogbHZzZWctPnN0cmlwZV9zaXplKSkKKyNkZWZpbmUgX3N0cmlwZV9zaXplX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4ocmVnaW9uX3NpemUsIChTRUNUT1JfU0laRSAqIGx2c2VnLT5yZWdpb25fc2l6ZSkpCisjZGVmaW5lIF9yZWdpb25fc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfTlVNX1BST1BFUlRZX0ZOKGNodW5rX3NpemUsIChTRUNUT1JfU0laRSAqIGx2c2VnX2NodW5rc2l6ZShsdnNlZykpKQorI2RlZmluZSBfY2h1bmtfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfTlVNX1BST1BFUlRZX0ZOKHRoaW5fY291bnQsIGRtX2xpc3Rfc2l6ZSgmbHZzZWctPmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpKQorI2RlZmluZSBfdGhpbl9jb3VudF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfTlVNX1BST1BFUlRZX0ZOKHplcm8sIGx2c2VnLT56ZXJvX25ld19ibG9ja3MpCisjZGVmaW5lIF96ZXJvX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4odHJhbnNhY3Rpb25faWQsIGx2c2VnLT50cmFuc2FjdGlvbl9pZCkKKyNkZWZpbmUgX3RyYW5zYWN0aW9uX2lkX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4odGhpbl9pZCwgbHZzZWctPmRldmljZV9pZCkKKyNkZWZpbmUgX3RoaW5faWRfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWU0VHX1NUUl9QUk9QRVJUWV9GTihkaXNjYXJkcywgbHZzZWdfZGlzY2FyZHNfZHVwKGx2c2VnLT5sdi0+dmctPnZnbWVtLCBsdnNlZykpCisjZGVmaW5lIF9kaXNjYXJkc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfU1RSX1BST1BFUlRZX0ZOKGtlcm5lbF9kaXNjYXJkcywgbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cChsdnNlZy0+bHYtPnZnLT52Z21lbSwgbHZzZWcpKQorI2RlZmluZSBfa2VybmVsX2Rpc2NhcmRzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19TVFJfUFJPUEVSVFlfRk4oY2FjaGVfbW9kZSwgbHZzZWdfY2FjaGVtb2RlX2R1cChsdnNlZy0+bHYtPnZnLT52Z21lbSwgbHZzZWcpKQorI2RlZmluZSBfY2FjaGVfbW9kZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfTlVNX1BST1BFUlRZX0ZOKHNlZ19zdGFydCwgKFNFQ1RPUl9TSVpFICogbHZzZWdfc3RhcnQobHZzZWcpKSkKKyNkZWZpbmUgX3NlZ19zdGFydF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfTlVNX1BST1BFUlRZX0ZOKHNlZ19zdGFydF9wZSwgbHZzZWctPmxlKQorI2RlZmluZSBfc2VnX3N0YXJ0X3BlX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4oc2VnX3NpemUsIChTRUNUT1JfU0laRSAqIGx2c2VnX3NpemUobHZzZWcpKSkKKyNkZWZpbmUgX3NlZ19zaXplX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19OVU1fUFJPUEVSVFlfRk4oc2VnX3NpemVfcGUsIGx2c2VnLT5sZW4pCisjZGVmaW5lIF9zZWdfc2l6ZV9wZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfU1RSX1BST1BFUlRZX0ZOKHNlZ190YWdzLCBsdnNlZ190YWdzX2R1cChsdnNlZykpCisjZGVmaW5lIF9zZWdfdGFnc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfU1RSX1BST1BFUlRZX0ZOKHNlZ19wZV9yYW5nZXMsIGx2c2VnX3NlZ19wZV9yYW5nZXNfc3RyKGx2c2VnLT5sdi0+dmctPnZnbWVtLCBsdnNlZykpCisjZGVmaW5lIF9zZWdfcGVfcmFuZ2VzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19TVFJfUFJPUEVSVFlfRk4oc2VnX2xlX3JhbmdlcywgbHZzZWdfc2VnX2xlX3Jhbmdlc19zdHIobHZzZWctPmx2LT52Zy0+dmdtZW0sIGx2c2VnKSkKKyNkZWZpbmUgX3NlZ19sZV9yYW5nZXNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWU0VHX1NUUl9QUk9QRVJUWV9GTihzZWdfbWV0YWRhdGFfbGVfcmFuZ2VzLCBsdnNlZ19zZWdfbWV0YWRhdGFfbGVfcmFuZ2VzX3N0cihsdnNlZy0+bHYtPnZnLT52Z21lbSwgbHZzZWcpKQorI2RlZmluZSBfc2VnX21ldGFkYXRhX2xlX3Jhbmdlc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfTFZTRUdfU1RSX1BST1BFUlRZX0ZOKGRldmljZXMsIGx2c2VnX2RldmljZXNfc3RyKGx2c2VnLT5sdi0+dmctPnZnbWVtLCBsdnNlZykpCisjZGVmaW5lIF9kZXZpY2VzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKK0dFVF9MVlNFR19TVFJfUFJPUEVSVFlfRk4obWV0YWRhdGFfZGV2aWNlcywgbHZzZWdfbWV0YWRhdGFfZGV2aWNlc19zdHIobHZzZWctPmx2LT52Zy0+dmdtZW0sIGx2c2VnKSkKKyNkZWZpbmUgX21ldGFkYXRhX2RldmljZXNfc2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX3NldAorR0VUX0xWU0VHX1NUUl9QUk9QRVJUWV9GTihzZWdfbW9uaXRvciwgbHZzZWdfbW9uaXRvcl9kdXAobHZzZWctPmx2LT52Zy0+dmdtZW0sIGx2c2VnKSkKKyNkZWZpbmUgX3NlZ19tb25pdG9yX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKworI2RlZmluZSBfY2FjaGVfcG9saWN5X2dldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9nZXQKKyNkZWZpbmUgX2NhY2hlX3BvbGljeV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9jYWNoZV9zZXR0aW5nc19nZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0CisjZGVmaW5lIF9jYWNoZV9zZXR0aW5nc19zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisjZGVmaW5lIF9rZXJuZWxfY2FjaGVfc2V0dGluZ3NfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfa2VybmVsX2NhY2hlX3NldHRpbmdzX3NldCBwcm9wX25vdF9pbXBsZW1lbnRlZF9zZXQKKyNkZWZpbmUgX2tlcm5lbF9jYWNoZV9wb2xpY3lfZ2V0IHByb3Bfbm90X2ltcGxlbWVudGVkX2dldAorI2RlZmluZSBfa2VybmVsX2NhY2hlX3BvbGljeV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisKKy8qIFBWU0VHICovCitHRVRfUFZTRUdfTlVNX1BST1BFUlRZX0ZOKHB2c2VnX3N0YXJ0LCBwdnNlZy0+cGUpCisjZGVmaW5lIF9wdnNlZ19zdGFydF9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CitHRVRfUFZTRUdfTlVNX1BST1BFUlRZX0ZOKHB2c2VnX3NpemUsIChTRUNUT1JfU0laRSAqIHB2c2VnLT5sZW4pKQorI2RlZmluZSBfcHZzZWdfc2l6ZV9zZXQgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0CisKKworc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlIF9wcm9wZXJ0aWVzW10gPSB7CisjaW5jbHVkZSAiY29sdW1ucy5oIgorCXsgMCwgIiIsIDAsIDAsIDAsIDAsIHsgLmludGVnZXIgPSAwIH0sIHByb3Bfbm90X2ltcGxlbWVudGVkX2dldCwgcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0IH0sCit9OworCisjdW5kZWYgU1RSCisjdW5kZWYgTlVNCisjdW5kZWYgQklOCisjdW5kZWYgU0laCisjdW5kZWYgUENUCisjdW5kZWYgU1RSX0xJU1QKKyN1bmRlZiBTTlVNCisjdW5kZWYgRklFTEQKKworaW50IGx2c2VnX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZzZWcsCisJCSAgICAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3BfZ2V0X3Byb3BlcnR5KF9wcm9wZXJ0aWVzLCBsdnNlZywgcHJvcCwgU0VHUyk7Cit9CisKK2ludCBsdl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkKK3sKKwlyZXR1cm4gcHJvcF9nZXRfcHJvcGVydHkoX3Byb3BlcnRpZXMsIGx2LCBwcm9wLCBMVlMgfCBMVlNJTkZPIHwgTFZTU1RBVFVTIHwgTFZTSU5GT1NUQVRVUyk7Cit9CisKK2ludCB2Z19nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3BfZ2V0X3Byb3BlcnR5KF9wcm9wZXJ0aWVzLCB2ZywgcHJvcCwgVkdTKTsKK30KKworaW50IHB2c2VnX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWcsCisJCSAgICAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3BfZ2V0X3Byb3BlcnR5KF9wcm9wZXJ0aWVzLCBwdnNlZywgcHJvcCwgUFZTRUdTKTsKK30KKworaW50IHB2X2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkKK3sKKwlyZXR1cm4gcHJvcF9nZXRfcHJvcGVydHkoX3Byb3BlcnRpZXMsIHB2LCBwcm9wLCBQVlMgfCBMQUJFTCk7Cit9CisKK2ludCBsdl9zZXRfcHJvcGVydHkoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkKK3sKKwlyZXR1cm4gcHJvcF9zZXRfcHJvcGVydHkoX3Byb3BlcnRpZXMsIGx2LCBwcm9wLCBMVlMgfCBMVlNJTkZPIHwgTFZTU1RBVFVTIHwgTFZTSU5GT1NUQVRVUyk7Cit9CisKK2ludCB2Z19zZXRfcHJvcGVydHkoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3Bfc2V0X3Byb3BlcnR5KF9wcm9wZXJ0aWVzLCB2ZywgcHJvcCwgVkdTKTsKK30KKworaW50IHB2X3NldF9wcm9wZXJ0eShzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCkKK3sKKwlyZXR1cm4gcHJvcF9zZXRfcHJvcGVydHkoX3Byb3BlcnRpZXMsIHB2LCBwcm9wLCBQVlMgfCBMQUJFTCk7Cit9CmRpZmYgLS1naXQgYS9saWIvcmVwb3J0L3Byb3BlcnRpZXMuaCBiL2xpYi9yZXBvcnQvcHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWFiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmVwb3J0L3Byb3BlcnRpZXMuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX0xWTV9QUk9QRVJUSUVTX0gKKyNkZWZpbmUgX0xWTV9QUk9QRVJUSUVTX0gKKworI2luY2x1ZGUgImxpYmRldm1hcHBlci5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisjaW5jbHVkZSAicmVwb3J0LmgiCisjaW5jbHVkZSAicHJvcF9jb21tb24uaCIKKworaW50IGx2c2VnX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqbHZzZWcsCisJCSAgICAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworaW50IGx2X2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKTsKK2ludCB2Z19nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworaW50IHB2c2VnX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWcsCisJCSAgICAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworaW50IHB2X2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCk7CitpbnQgbHZfc2V0X3Byb3BlcnR5KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworaW50IHZnX3NldF9wcm9wZXJ0eShzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgIHN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCk7CitpbnQgcHZfc2V0X3Byb3BlcnR5KHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICAgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvcmVwb3J0L3JlcG9ydC5jIGIvbGliL3JlcG9ydC9yZXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWI2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JlcG9ydC9yZXBvcnQuYwpAQCAtMCwwICsxLDM4OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJyZXBvcnQuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJkZXZpY2UtdHlwZXMuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIG9mZnNldG9mKCkgKi8KKyNpbmNsdWRlIDxmbG9hdC5oPiAvKiBEQkxfTUFYICovCisjaW5jbHVkZSA8dGltZS5oPgorCitzdHJ1Y3QgbHZtX3JlcG9ydF9vYmplY3QgeworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG07CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWc7CisJc3RydWN0IGxhYmVsICpsYWJlbDsKK307CisKKy8qCisgKiAgRW51bSBmb3IgZmllbGRfbnVtIGluZGV4IHRvIHVzZSBpbiBwZXItZmllbGQgcmVzZXJ2ZWQgdmFsdWUgZGVmaW5pdGlvbi4KKyAqICBFYWNoIGZpZWxkIGlzIHJlcHJlc2VudGVkIGJ5IGVudW0gdmFsdWUgd2l0aCBuYW1lICJmaWVsZF88aWQ+IiB3aGVyZSA8aWQ+CisgKiAgaXMgdGhlIGZpZWxkX2lkIG9mIHRoZSBmaWVsZCBhcyByZWdpc3RlcmVkIGluIGNvbHVtbnMuaC4KKyAqLworI2RlZmluZSBGSUVMRCh0eXBlLCBzdHJjdCwgc29ydHR5cGUsIGhlYWQsIGZpZWxkX25hbWUsIHdpZHRoLCBmdW5jLCBpZCwgZGVzYywgd3JpdGVhYmxlKSBmaWVsZF8gIyMgaWQsCitlbnVtIHsKKyNpbmNsdWRlICJjb2x1bW5zLmgiCit9OworI3VuZGVmIEZJRUxECisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBfemVybzY0ID0gVUlOVDY0X0MoMCk7CitzdGF0aWMgY29uc3QgdWludDY0X3QgX29uZTY0ID0gVUlOVDY0X0MoMSk7CitzdGF0aWMgY29uc3QgY2hhciBfc3RyX3plcm9bXSA9ICIwIjsKK3N0YXRpYyBjb25zdCBjaGFyIF9zdHJfb25lW10gPSAiMSI7CitzdGF0aWMgY29uc3QgY2hhciBfc3RyX25vW10gPSAibm8iOworc3RhdGljIGNvbnN0IGNoYXIgX3N0cl95ZXNbXSA9ICJ5ZXMiOworc3RhdGljIGNvbnN0IGNoYXIgX3N0cl91bmtub3duW10gPSAidW5rbm93biI7CitzdGF0aWMgY29uc3QgZG91YmxlIF9zaXpfbWF4ID0gREJMX01BWDsKKworLyoKKyAqIDMyIGJpdCBzaWduZWQgaXMgY2FzdGVkIHRvIDY0IGJpdCB1bnNpZ25lZCBpbiBkbV9yZXBvcnRfZmllbGQgaW50ZXJuYWxseSEKKyAqIFNvIHdoZW4gc3RvcmVkIGluIHRoZSBzdHJ1Y3QsIHRoZSBfcmVzZXJ2ZWRfbnVtX3VuZGVmXzMyIGlzIGFjdHVhbGx5CisgKiBlcXVhbCB0byBfcmVzZXJ2ZWRfbnVtX3VuZGVmXzY0LgorICovCitzdGF0aWMgY29uc3QgaW50MzJfdCBfcmVzZXJ2ZWRfbnVtX3VuZGVmXzMyID0gSU5UMzJfQygtMSk7CisKK3R5cGVkZWYgZW51bSB7CisJLyogdG9wLWxldmVsIGlkZW50aWZpY2F0aW9uICovCisJVElNRV9OVUxMLAorCVRJTUVfTlVNLAorCVRJTUVfU1RSLAorCisJLyogZGlyZWN0IG51bWVyaWMgdmFsdWUgKi8KKwlUSU1FX05VTV9fU1RBUlQsCisJVElNRV9OVU1fTVVMVElQTElFUiwKKwlUSU1FX05VTV9NVUxUSVBMSUVSX05FR0FUSVZFLAorCVRJTUVfTlVNX0RBWSwKKwlUSU1FX05VTV9ZRUFSLAorCVRJTUVfTlVNX19FTkQsCisKKwkvKiBkaXJlY3Qgc3RyaW5nIHZhbHVlICovCisJVElNRV9TVFJfVElNRVpPTkUsCisKKwkvKiB0aW1lIGZyYW1lIHN0cmluZ3MgKi8KKwlUSU1FX0ZSQU1FX19TVEFSVCwKKwlUSU1FX0ZSQU1FX0FHTywKKwlUSU1FX0ZSQU1FX19FTkQsCisKKwkvKiBsYWJlbHMgZm9yIGRhdGVzICovCisJVElNRV9MQUJFTF9EQVRFX19TVEFSVCwKKworCVRJTUVfTEFCRUxfREFURV9UT0RBWSwKKwlUSU1FX0xBQkVMX0RBVEVfWUVTVEVSREFZLAorCisJLyogd2Vla2RheSBuYW1lIHN0cmluZ3MgKi8KKwlUSU1FX1dFRUtEQVlfX1NUQVJULAorCVRJTUVfV0VFS0RBWV9TVU5EQVksCisJVElNRV9XRUVLREFZX01PTkRBWSwKKwlUSU1FX1dFRUtEQVlfVFVFU0RBWSwKKwlUSU1FX1dFRUtEQVlfV0VETkVTREFZLAorCVRJTUVfV0VFS0RBWV9USFVSU0RBWSwKKwlUSU1FX1dFRUtEQVlfRlJJREFZLAorCVRJTUVfV0VFS0RBWV9TQVRVUkRBWSwKKwlUSU1FX1dFRUtEQVlfX0VORCwKKworCVRJTUVfTEFCRUxfREFURV9fRU5ELAorCisJLyogbGFiZWxzIGZvciB0aW1lcyAqLworCVRJTUVfTEFCRUxfVElNRV9fU1RBUlQsCisJVElNRV9MQUJFTF9USU1FX05PT04sCisJVElNRV9MQUJFTF9USU1FX01JRE5JR0hULAorCVRJTUVfTEFCRUxfVElNRV9fRU5ELAorCisJLyogdGltZSB1bml0IHN0cmluZ3MgKi8KKwlUSU1FX1VOSVRfX1NUQVJULAorCVRJTUVfVU5JVF9TRUNPTkQsCisJVElNRV9VTklUX1NFQ09ORF9SRUwsCisJVElNRV9VTklUX01JTlVURSwKKwlUSU1FX1VOSVRfTUlOVVRFX1JFTCwKKwlUSU1FX1VOSVRfSE9VUiwKKwlUSU1FX1VOSVRfSE9VUl9SRUwsCisJVElNRV9VTklUX0FNLAorCVRJTUVfVU5JVF9QTSwKKwlUSU1FX1VOSVRfREFZLAorCVRJTUVfVU5JVF9XRUVLLAorCVRJTUVfVU5JVF9NT05USCwKKwlUSU1FX1VOSVRfWUVBUiwKKwlUSU1FX1VOSVRfVFpfTUlOVVRFLAorCVRJTUVfVU5JVF9UWl9IT1VSLAorCVRJTUVfVU5JVF9fRU5ELAorCisJLyogbW9udGggbmFtZSBzdHJpbmdzICovCisJVElNRV9NT05USF9fU1RBUlQsCisJVElNRV9NT05USF9KQU5VQVJZLAorCVRJTUVfTU9OVEhfRkVCUlVBUlksCisJVElNRV9NT05USF9NQVJDSCwKKwlUSU1FX01PTlRIX0FQUklMLAorCVRJTUVfTU9OVEhfTUFZLAorCVRJTUVfTU9OVEhfSlVORSwKKwlUSU1FX01PTlRIX0pVTFksCisJVElNRV9NT05USF9BVUdVU1QsCisJVElNRV9NT05USF9TRVBURU1CRVIsCisJVElNRV9NT05USF9PQ1RPQkVSLAorCVRJTUVfTU9OVEhfTk9WRU1CRVIsCisJVElNRV9NT05USF9ERUNFTUJFUiwKKwlUSU1FX01PTlRIX19FTkQsCit9IHRpbWVfaWRfdDsKKworI2RlZmluZSBUSU1FX1BST1BfREFURSAweDAwMDAwMDAxIC8qIGRhdGUtcmVsYXRlZCAqLworI2RlZmluZSBUSU1FX1BST1BfVElNRSAweDAwMDAwMDAyIC8qIHRpbWUtcmVsYXRlZCAqLworI2RlZmluZSBUSU1FX1BST1BfQUJTICAweDAwMDAwMDA0IC8qIGFic29sdXRlIHZhbHVlICovCisjZGVmaW5lIFRJTUVfUFJPUF9SRUwgIDB4MDAwMDAwMDggLyogcmVsYXRpdmUgdmFsdWUgKi8KKworc3RydWN0IHRpbWVfcHJvcCB7CisJdGltZV9pZF90IGlkOworCXVpbnQzMl90IHByb3BfZmxhZ3M7CisJdGltZV9pZF90IGdyYW51bGFyaXR5OworfTsKKworI2RlZmluZSBBRERfVElNRV9QUk9QKGlkLCBmbGFncywgZ3JhbnVsYXJpdHkpIFtpZF0gPSB7aWQsIGZsYWdzLCBncmFudWxhcml0eX0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZV9wcm9wIF90aW1lX3Byb3BzW10gPSB7CisJQUREX1RJTUVfUFJPUChUSU1FX05VTEwsICAgICAgICAgICAgICAgICAgICAwLAkJCQkJCQlUSU1FX05VTEwpCisJQUREX1RJTUVfUFJPUChUSU1FX05VTSwgICAgICAgICAgICAgICAgICAgICAwLAkJCQkJCQlUSU1FX05VTEwpCisJQUREX1RJTUVfUFJPUChUSU1FX1NUUiwgICAgICAgICAgICAgICAgICAgICAwLAkJCQkJCQlUSU1FX05VTEwpCisKKwlBRERfVElNRV9QUk9QKFRJTUVfTlVNX01VTFRJUExJRVIsICAgICAgICAgIDAsCQkJCQkJCVRJTUVfTlVMTCkKKwlBRERfVElNRV9QUk9QKFRJTUVfTlVNX01VTFRJUExJRVJfTkVHQVRJVkUsIDAsCQkJCQkJCVRJTUVfTlVMTCkKKwlBRERfVElNRV9QUk9QKFRJTUVfTlVNX0RBWSwgICAgICAgICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfREFZKQorCUFERF9USU1FX1BST1AoVElNRV9OVU1fWUVBUiwgICAgICAgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9ZRUFSKQorCisJQUREX1RJTUVfUFJPUChUSU1FX1NUUl9USU1FWk9ORSwgICAgICAgICAgICBUSU1FX1BST1BfVElNRSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9OVUxMKQorCisJQUREX1RJTUVfUFJPUChUSU1FX0ZSQU1FX0FHTywgICAgICAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9USU1FIHwgVElNRV9QUk9QX1JFTCwJVElNRV9OVUxMKQorCisJQUREX1RJTUVfUFJPUChUSU1FX0xBQkVMX0RBVEVfVE9EQVksICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX0RBWSkKKwlBRERfVElNRV9QUk9QKFRJTUVfTEFCRUxfREFURV9ZRVNURVJEQVksICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfREFZKQorCUFERF9USU1FX1BST1AoVElNRV9XRUVLREFZX1NVTkRBWSwgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9EQVkpCisJQUREX1RJTUVfUFJPUChUSU1FX1dFRUtEQVlfTU9OREFZLCAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX0RBWSkKKwlBRERfVElNRV9QUk9QKFRJTUVfV0VFS0RBWV9UVUVTREFZLCAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfREFZKQorCUFERF9USU1FX1BST1AoVElNRV9XRUVLREFZX1dFRE5FU0RBWSwgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9EQVkpCisJQUREX1RJTUVfUFJPUChUSU1FX1dFRUtEQVlfVEhVUlNEQVksICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX0RBWSkKKwlBRERfVElNRV9QUk9QKFRJTUVfV0VFS0RBWV9GUklEQVksICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfREFZKQorCUFERF9USU1FX1BST1AoVElNRV9XRUVLREFZX1NBVFVSREFZLCAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9EQVkpCisKKwlBRERfVElNRV9QUk9QKFRJTUVfTEFCRUxfVElNRV9OT09OLCAgICAgICAgIFRJTUVfUFJPUF9USU1FIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfU0VDT05EKQorCUFERF9USU1FX1BST1AoVElNRV9MQUJFTF9USU1FX01JRE5JR0hULCAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9TRUNPTkQpCisKKwlBRERfVElNRV9QUk9QKFRJTUVfVU5JVF9TRUNPTkQsICAgICAgICAgICAgIFRJTUVfUFJPUF9USU1FIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfU0VDT05EKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX1NFQ09ORF9SRUwsICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfUkVMLAkJCVRJTUVfVU5JVF9TRUNPTkQpCisJQUREX1RJTUVfUFJPUChUSU1FX1VOSVRfTUlOVVRFLCAgICAgICAgICAgICBUSU1FX1BST1BfVElNRSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX01JTlVURSkKKwlBRERfVElNRV9QUk9QKFRJTUVfVU5JVF9NSU5VVEVfUkVMLCAgICAgICAgIFRJTUVfUFJPUF9USU1FIHwgVElNRV9QUk9QX1JFTCwJCQlUSU1FX1VOSVRfTUlOVVRFKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX0hPVVIsICAgICAgICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9IT1VSKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX0hPVVJfUkVMLCAgICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfUkVMLAkJCVRJTUVfVU5JVF9IT1VSKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX0FNLCAgICAgICAgICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9IT1VSKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX1BNLCAgICAgICAgICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9IT1VSKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX0RBWSwgICAgICAgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfUkVMLAkJCVRJTUVfVU5JVF9EQVkpCisJQUREX1RJTUVfUFJPUChUSU1FX1VOSVRfV0VFSywgICAgICAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9SRUwsCQkJVElNRV9VTklUX1dFRUspCisJQUREX1RJTUVfUFJPUChUSU1FX1VOSVRfTU9OVEgsICAgICAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9SRUwsCQkJVElNRV9VTklUX01PTlRIKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX1lFQVIsICAgICAgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfUkVMLAkJCVRJTUVfVU5JVF9ZRUFSKQorCUFERF9USU1FX1BST1AoVElNRV9VTklUX1RaX01JTlVURSwgICAgICAgICAgVElNRV9QUk9QX1RJTUUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfTlVMTCkKKwlBRERfVElNRV9QUk9QKFRJTUVfVU5JVF9UWl9IT1VSLCAgICAgICAgICAgIFRJTUVfUFJPUF9USU1FIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX05VTEwpCisKKwlBRERfVElNRV9QUk9QKFRJTUVfTU9OVEhfSkFOVUFSWSwgICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfTU9OVEgpCisJQUREX1RJTUVfUFJPUChUSU1FX01PTlRIX0ZFQlJVQVJZLCAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX01PTlRIKQorCUFERF9USU1FX1BST1AoVElNRV9NT05USF9NQVJDSCwgICAgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9NT05USCkKKwlBRERfVElNRV9QUk9QKFRJTUVfTU9OVEhfQVBSSUwsICAgICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfTU9OVEgpCisJQUREX1RJTUVfUFJPUChUSU1FX01PTlRIX01BWSwgICAgICAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX01PTlRIKQorCUFERF9USU1FX1BST1AoVElNRV9NT05USF9KVU5FLCAgICAgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9NT05USCkKKwlBRERfVElNRV9QUk9QKFRJTUVfTU9OVEhfSlVMWSwgICAgICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfTU9OVEgpCisJQUREX1RJTUVfUFJPUChUSU1FX01PTlRIX0FVR1VTVCwgICAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX01PTlRIKQorCUFERF9USU1FX1BST1AoVElNRV9NT05USF9TRVBURU1CRVIsICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9NT05USCkKKwlBRERfVElNRV9QUk9QKFRJTUVfTU9OVEhfT0NUT0JFUiwgICAgICAgICAgIFRJTUVfUFJPUF9EQVRFIHwgVElNRV9QUk9QX0FCUywJCQlUSU1FX1VOSVRfTU9OVEgpCisJQUREX1RJTUVfUFJPUChUSU1FX01PTlRIX05PVkVNQkVSLCAgICAgICAgICBUSU1FX1BST1BfREFURSB8IFRJTUVfUFJPUF9BQlMsCQkJVElNRV9VTklUX01PTlRIKQorCUFERF9USU1FX1BST1AoVElNRV9NT05USF9ERUNFTUJFUiwgICAgICAgICAgVElNRV9QUk9QX0RBVEUgfCBUSU1FX1BST1BfQUJTLAkJCVRJTUVfVU5JVF9NT05USCkKK307CisKKyNkZWZpbmUgVElNRV9SRUdfUExVUkFMX1MgIDB4MDAwMDAwMDEgLyogYWxzbyByZWNvZ25pemUgcGx1cmFsIGZvcm0gd2l0aCAicyIgc3VmZml4ICovCisKK3N0cnVjdCB0aW1lX3JlZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgdGltZV9wcm9wICpwcm9wOworCXVpbnQzMl90IHJlZ19mbGFnczsKK307CisKKyNkZWZpbmUgVElNRV9QUk9QKGlkKSAoX3RpbWVfcHJvcHMgKyBpZCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1lX3JlZyBfdGltZV9yZWdbXSA9IHsKKwkvKgorCSAqIEdyb3VwIG9mIHRva2VucyByZXByZXNlbnRpbmcgdGltZSBmcmFtZSBhbmQgdXNlZAorCSAqIHdpdGggcmVsYXRpdmUgZGF0ZS90aW1lIHRvIHNwZWNpZnkgZGlmZmVyZW50IGZsYXZvdXJzCisJICogb2YgcmVsYXRpdml0eS4KKwkgKi8KKwl7ImFnbyIsICAgICAgIFRJTUVfUFJPUChUSU1FX0ZSQU1FX0FHTyksICAgICAgICAgICAgMH0sCisKKwkvKgorCSAqIEdyb3VwIG9mIHRva2VucyBsYWJlbGluZyBzb21lIGRhdGUgYW5kIHVzZWQKKwkgKiBpbnN0ZWFkIG9mIGRpcmVjdCBhYnNvbHV0ZSBzcGVjaWZpY2F0aW9uLgorCSAqLworCXsidG9kYXkiLCAgICAgVElNRV9QUk9QKFRJTUVfTEFCRUxfREFURV9UT0RBWSksICAgICAwfSwgLyogMDowMCAtIDIzOjU5OjU5IGZvciBjdXJyZW50IGRhdGUgKi8KKwl7Inllc3RlcmRheSIsIFRJTUVfUFJPUChUSU1FX0xBQkVMX0RBVEVfWUVTVEVSREFZKSwgMH0sIC8qIDA6MDAgLSAyMzo1OTo1OSBmb3IgY3VycmVudCBkYXRlIG1pbnVzIDEgZGF5Ki8KKworCS8qCisJICogR3JvdXAgb2YgdG9rZW5zIGxhYmVsaW5nIHNvbWUgZGF0ZSAtIHdlZWtkYXkKKwkgKiBuYW1lcyB1c2VkIHRvIGJ1aWxkIHVwIGRhdGUuCisJICovCisJeyJTdW5kYXkiLCAgICBUSU1FX1BST1AoVElNRV9XRUVLREFZX1NVTkRBWSksICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IlN1biIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfU1VOREFZKSwgICAgICAgMH0sCisJeyJNb25kYXkiLCAgICBUSU1FX1BST1AoVElNRV9XRUVLREFZX01PTkRBWSksICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7Ik1vbiIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfTU9OREFZKSwgICAgICAgMH0sCisJeyJUdWVzZGF5IiwgICBUSU1FX1BST1AoVElNRV9XRUVLREFZX1RVRVNEQVkpLCAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IlR1ZSIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfVFVFU0RBWSksICAgICAgMH0sCisJeyJXZWRuZXNkYXkiLCBUSU1FX1BST1AoVElNRV9XRUVLREFZX1dFRE5FU0RBWSksICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IldlZCIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfV0VETkVTREFZKSwgICAgMH0sCisJeyJUaHVyc2RheSIsICBUSU1FX1BST1AoVElNRV9XRUVLREFZX1RIVVJTREFZKSwgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IlRodSIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfVEhVUlNEQVkpLCAgICAgMH0sCisJeyJGcmlkYXkiLCAgICBUSU1FX1BST1AoVElNRV9XRUVLREFZX0ZSSURBWSksICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IkZyaSIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfRlJJREFZKSwgICAgICAgMH0sCisJeyJTYXR1cmRheSIsICBUSU1FX1BST1AoVElNRV9XRUVLREFZX1NBVFVSREFZKSwgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IlNhdCIsICAgICAgIFRJTUVfUFJPUChUSU1FX1dFRUtEQVlfU0FUVVJEQVkpLCAgICAgMH0sCisKKwkvKgorCSAqIEdyb3VwIG9mIHRva2VucyBsYWJlbGluZyBzb21lIHRpbWUgYW5kIHVzZWQKKwkgKiBpbnN0ZWFkIG9mIGRpcmVjdCBhYnNvbHV0ZSBzcGVjaWZpY2F0aW9uLgorCSAqLworCXsibm9vbiIsICAgICAgVElNRV9QUk9QKFRJTUVfTEFCRUxfVElNRV9OT09OKSwgICAgICBUSU1FX1JFR19QTFVSQUxfU30sIC8qIDEyOjAwOjAwICovCisJeyJtaWRuaWdodCIsICBUSU1FX1BST1AoVElNRV9MQUJFTF9USU1FX01JRE5JR0hUKSwgIFRJTUVfUkVHX1BMVVJBTF9TfSwgLyogMDA6MDA6MDAgKi8KKworCS8qCisJICogR3JvdXAgb2YgdG9rZW5zIHVzZWQgdG8gYnVpbGQgdXAgdGltZS4gTW9zdCBvZiB0aGVzZQorCSAqIGFyZSB1c2VkIGVpdGhlciBhcyByZWxhdGl2ZSBvciBhYnNvbHV0ZSB0aW1lIHVuaXRzLgorCSAqIFRoZSBhYnNvbHV0ZSBvbmVzIGFyZSBhbHdheXMgdXNlZCB3aXRoIFRJTUVfRlJBTUVfKgorCSAqIHRva2VuLCBvdGhlcndpc2UgdGhlIHVuaXQgaXMgcmVsYXRpdmUuCisJICovCisJeyJzZWNvbmQiLCAgICBUSU1FX1BST1AoVElNRV9VTklUX1NFQ09ORCksICAgICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7InNlYyIsICAgICAgIFRJTUVfUFJPUChUSU1FX1VOSVRfU0VDT05EKSwgICAgICAgICAgVElNRV9SRUdfUExVUkFMX1N9LAorCXsicyIsICAgICAgICAgVElNRV9QUk9QKFRJTUVfVU5JVF9TRUNPTkQpLCAgICAgICAgICAwfSwKKwl7Im1pbnV0ZSIsICAgIFRJTUVfUFJPUChUSU1FX1VOSVRfTUlOVVRFKSwgICAgICAgICAgVElNRV9SRUdfUExVUkFMX1N9LAorCXsibWluIiwgICAgICAgVElNRV9QUk9QKFRJTUVfVU5JVF9NSU5VVEUpLCAgICAgICAgICBUSU1FX1JFR19QTFVSQUxfU30sCisJeyJtIiwgICAgICAgICBUSU1FX1BST1AoVElNRV9VTklUX01JTlVURSksICAgICAgICAgIDB9LAorCXsiaG91ciIsICAgICAgVElNRV9QUk9QKFRJTUVfVU5JVF9IT1VSKSwgICAgICAgICAgICBUSU1FX1JFR19QTFVSQUxfU30sCisJeyJociIsICAgICAgICBUSU1FX1BST1AoVElNRV9VTklUX0hPVVIpLCAgICAgICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7ImgiLCAgICAgICAgIFRJTUVfUFJPUChUSU1FX1VOSVRfSE9VUiksICAgICAgICAgICAgMH0sCisJeyJBTSIsICAgICAgICBUSU1FX1BST1AoVElNRV9VTklUX0FNKSwgICAgICAgICAgICAgIDB9LAorCXsiUE0iLCAgICAgICAgVElNRV9QUk9QKFRJTUVfVU5JVF9QTSksICAgICAgICAgICAgICAwfSwKKworCS8qCisJICogR3JvdXAgb2YgdG9rZW5zIHVzZWQgdG8gYnVpbGQgdXAgZGF0ZS4KKwkgKiBUaGVzZSBhcmUgYWxsIHJlbGF0aXZlIG9uZXMuCisJICovCisJeyJkYXkiLCAgICAgICBUSU1FX1BST1AoVElNRV9VTklUX0RBWSksICAgICAgICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7IndlZWsiLCAgICAgIFRJTUVfUFJPUChUSU1FX1VOSVRfV0VFSyksICAgICAgICAgICAgVElNRV9SRUdfUExVUkFMX1N9LAorCXsibW9udGgiLCAgICAgVElNRV9QUk9QKFRJTUVfVU5JVF9NT05USCksICAgICAgICAgICBUSU1FX1JFR19QTFVSQUxfU30sCisJeyJ5ZWFyIiwgICAgICBUSU1FX1BST1AoVElNRV9VTklUX1lFQVIpLCAgICAgICAgICAgIFRJTUVfUkVHX1BMVVJBTF9TfSwKKwl7InlyIiwgICAgICAgIFRJTUVfUFJPUChUSU1FX1VOSVRfWUVBUiksICAgICAgICAgICAgVElNRV9SRUdfUExVUkFMX1N9LAorCisJLyoKKwkgKiBHcm91cCBvZiB0b2tlcyB1c2VkIHRvIGJ1aWxkIHVwIGRhdGUuCisJICogVGhlc2UgYXJlIGFsbCBhYnNvbHV0ZS4KKwkgKi8KKwl7IkphbnVhcnkiLCAgIFRJTUVfUFJPUChUSU1FX01PTlRIX0pBTlVBUlkpLCAgICAgICAgMH0sCisJeyJKYW4iLCAgICAgICBUSU1FX1BST1AoVElNRV9NT05USF9KQU5VQVJZKSwgICAgICAgIDB9LAorCXsiRmVicnVhcnkiLCAgVElNRV9QUk9QKFRJTUVfTU9OVEhfRkVCUlVBUlkpLCAgICAgICAwfSwKKwl7IkZlYiIsICAgICAgIFRJTUVfUFJPUChUSU1FX01PTlRIX0ZFQlJVQVJZKSwgICAgICAgMH0sCisJeyJNYXJjaCIsICAgICBUSU1FX1BST1AoVElNRV9NT05USF9NQVJDSCksICAgICAgICAgIDB9LAorCXsiTWFyIiwgICAgICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfTUFSQ0gpLCAgICAgICAgICAwfSwKKwl7IkFwcmlsIiwgICAgIFRJTUVfUFJPUChUSU1FX01PTlRIX0FQUklMKSwgICAgICAgICAgMH0sCisJeyJBcHIiLCAgICAgICBUSU1FX1BST1AoVElNRV9NT05USF9BUFJJTCksICAgICAgICAgIDB9LAorCXsiTWF5IiwgICAgICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfTUFZKSwgICAgICAgICAgICAwfSwKKwl7Ikp1bmUiLCAgICAgIFRJTUVfUFJPUChUSU1FX01PTlRIX0pVTkUpLCAgICAgICAgICAgMH0sCisJeyJKdW4iLCAgICAgICBUSU1FX1BST1AoVElNRV9NT05USF9KVU5FKSwgICAgICAgICAgIDB9LAorCXsiSnVseSIsICAgICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfSlVMWSksICAgICAgICAgICAwfSwKKwl7Ikp1bCIsICAgICAgIFRJTUVfUFJPUChUSU1FX01PTlRIX0pVTFkpLCAgICAgICAgICAgMH0sCisJeyJBdWd1c3QiLCAgICBUSU1FX1BST1AoVElNRV9NT05USF9BVUdVU1QpLCAgICAgICAgIDB9LAorCXsiQXVnIiwgICAgICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfQVVHVVNUKSwgICAgICAgICAwfSwKKwl7IlNlcHRlbWJlciIsIFRJTUVfUFJPUChUSU1FX01PTlRIX1NFUFRFTUJFUiksICAgICAgMH0sCisJeyJTZXAiLCAgICAgICBUSU1FX1BST1AoVElNRV9NT05USF9TRVBURU1CRVIpLCAgICAgIDB9LAorCXsiT2N0b2JlciIsICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfT0NUT0JFUiksICAgICAgICAwfSwKKwl7Ik9jdCIsICAgICAgIFRJTUVfUFJPUChUSU1FX01PTlRIX09DVE9CRVIpLCAgICAgICAgMH0sCisJeyJOb3ZlbWJlciIsICBUSU1FX1BST1AoVElNRV9NT05USF9OT1ZFTUJFUiksICAgICAgIDB9LAorCXsiTm92IiwgICAgICAgVElNRV9QUk9QKFRJTUVfTU9OVEhfTk9WRU1CRVIpLCAgICAgICAwfSwKKwl7IkRlY2VtYmVyIiwgIFRJTUVfUFJPUChUSU1FX01PTlRIX0RFQ0VNQkVSKSwgICAgICAgMH0sCisJeyJEZWMiLCAgICAgICBUSU1FX1BST1AoVElNRV9NT05USF9ERUNFTUJFUiksICAgICAgIDB9LAorCXtOVUxMLCAgICAgICAgVElNRV9QUk9QKFRJTUVfTlVMTCksICAgICAgICAgICAgICAgICAwfSwKK307CisKK3N0cnVjdCB0aW1lX2l0ZW0geworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJY29uc3Qgc3RydWN0IHRpbWVfcHJvcCAqcHJvcDsKKwljb25zdCBjaGFyICpzOworCXNpemVfdCBsZW47Cit9OworCitzdHJ1Y3QgdGltZV9pbmZvIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBkbV9saXN0ICp0aV9saXN0OworCXRpbWVfdCAqbm93OworCXRpbWVfaWRfdCBtaW5fYWJzX2RhdGVfZ3JhbnVsYXJpdHk7CisJdGltZV9pZF90IG1heF9hYnNfZGF0ZV9ncmFudWxhcml0eTsKKwl0aW1lX2lkX3QgbWluX2Fic190aW1lX2dyYW51bGFyaXR5OworCXRpbWVfaWRfdCBtaW5fcmVsX3RpbWVfZ3JhbnVsYXJpdHk7Cit9OworCitzdGF0aWMgaW50IF9pc190aW1lX251bSh0aW1lX2lkX3QgaWQpCit7CisJcmV0dXJuICgoaWQgPiBUSU1FX05VTV9fU1RBUlQpICYmIChpZCA8IFRJTUVfTlVNX19FTkQpKTsKK307CisKKy8qCitzdGF0aWMgaW50IF9pc190aW1lX2ZyYW1lKHRpbWVfaWRfdCBpZCkKK3sKKwlyZXR1cm4gKChpZCA+IFRJTUVfRlJBTUVfX1NUQVJUKSAmJiAoaWQgPCBUSU1FX0ZSQU1FX19FTkQpKTsKK307CisqLworCitzdGF0aWMgaW50IF9pc190aW1lX2xhYmVsX2RhdGUodGltZV9pZF90IGlkKQoreworCXJldHVybiAoKGlkID4gVElNRV9MQUJFTF9EQVRFX19TVEFSVCkgJiYgKGlkIDwgVElNRV9MQUJFTF9EQVRFX19FTkQpKTsKK307CisKK3N0YXRpYyBpbnQgX2lzX3RpbWVfbGFiZWxfdGltZSh0aW1lX2lkX3QgaWQpCit7CisJcmV0dXJuICgoaWQgPiBUSU1FX0xBQkVMX1RJTUVfX1NUQVJUKSAmJiAoaWQgPCBUSU1FX0xBQkVMX1RJTUVfX0VORCkpOworfTsKKworc3RhdGljIGludCBfaXNfdGltZV91bml0KHRpbWVfaWRfdCBpZCkKK3sKKwlyZXR1cm4gKChpZCA+IFRJTUVfVU5JVF9fU1RBUlQpICYmIChpZCA8IFRJTUVfVU5JVF9fRU5EKSk7Cit9OworCitzdGF0aWMgaW50IF9pc190aW1lX3dlZWtkYXkodGltZV9pZF90IGlkKQoreworCXJldHVybiAoKGlkID4gVElNRV9XRUVLREFZX19TVEFSVCkgJiYgKGlkIDwgVElNRV9XRUVLREFZX19FTkQpKTsKK307CisKK3N0YXRpYyBpbnQgX2lzX3RpbWVfbW9udGgodGltZV9pZF90IGlkKQoreworCXJldHVybiAoKGlkID4gVElNRV9NT05USF9fU1RBUlQpICYmIChpZCA8IFRJTUVfTU9OVEhfX0VORCkpOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKl9za2lwX3NwYWNlKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzICYmIGlzc3BhY2UoKnMpKQorCQlzKys7CisJcmV0dXJuIHM7Cit9CisKKy8qIE1vdmUgdGlsbCBkZWxpbSBvciBzcGFjZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKl9tb3ZlX3RpbGxfaXRlbV9lbmQoY29uc3QgY2hhciAqcykKK3sKKwljaGFyIGMgPSAqczsKKwlpbnQgaXNfbnVtID0gaXNkaWdpdChjKTsKKworCS8qCisJICogQWxsb3cgbnVtYmVycyB0byBiZSBhdHRhY2hlZCB0byBuZXh0IHRva2VuLCBmb3IgZXhhbXBsZQorCSAqIGl0J3MgY29ycmVjdCB0byB3cml0ZSAiMTIgaG91cnMiIGFzIHdlbGwgYXMgIjEyaG91cnMiLgorCSAqLworCXdoaWxlIChjICYmICFpc3NwYWNlKGMpICYmIChpc19udW0gPyAoaXNfbnVtID0gaXNkaWdpdChjKSkgOiAxKSkKKwkJYyA9ICorK3M7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lX2l0ZW0gKl9hbGxvY190aW1lX2l0ZW0oc3RydWN0IGRtX3Bvb2wgKm1lbSwgdGltZV9pZF90IGlkLAorCQkJCQkgIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHRpbWVfaXRlbSAqdGk7CisKKwlpZiAoISh0aSA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCB0aW1lX2l0ZW0pKSkpIHsKKwkJbG9nX2Vycm9yKCJhbGxvY190aW1lX2l0ZW06IGRtX3Bvb2xfemFsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0aS0+cHJvcCA9ICZfdGltZV9wcm9wc1tpZF07CisJdGktPnMgPSBzOworCXRpLT5sZW4gPSBsZW47CisKKwlyZXR1cm4gdGk7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF90aW1lX3BhcnRfdG9fbGlzdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwKKwkJCQkgIHRpbWVfaWRfdCBpZCwgaW50IG1pbnVzLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB0aW1lX2l0ZW0gKnRpMSwgKnRpMjsKKworCWlmICghKHRpMSA9IF9hbGxvY190aW1lX2l0ZW0obWVtLCBtaW51cyA/IFRJTUVfTlVNX01VTFRJUExJRVJfTkVHQVRJVkUKKwkJCQkJCTogVElNRV9OVU1fTVVMVElQTElFUiwgcywgbGVuKSkgfHwKKwkgICAgISh0aTIgPSBfYWxsb2NfdGltZV9pdGVtKG1lbSwgaWQsIHMgKyBsZW4sIDApKSkKKwkJcmV0dXJuIDA7CisJZG1fbGlzdF9hZGQobGlzdCwgJnRpMS0+bGlzdCk7CisJZG1fbGlzdF9hZGQobGlzdCwgJnRpMi0+bGlzdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZ2V0X3RpbWUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqKnN0ciwKKwkJICAgICBzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgaW50IHR6KQoreworCWNvbnN0IGNoYXIgKmVuZCwgKnMgPSAqc3RyOworCWludCByID0gMDsKKworCS8qIGhvdXIgKi8KKwllbmQgPSBfbW92ZV90aWxsX2l0ZW1fZW5kKHMpOworCWlmICghX2FkZF90aW1lX3BhcnRfdG9fbGlzdChtZW0sIGxpc3QsIHR6ID8gVElNRV9VTklUX1RaX0hPVVIgOiBUSU1FX1VOSVRfSE9VUiwKKwkJCQkgICAgdHogPT0gLTEsIHMsIGVuZCAtIHMpKQorCQlnb3RvIG91dDsKKworCS8qIG1pbnV0ZSAqLworCWlmICgqZW5kICE9ICc6JykKKwkJLyogbWludXRlIHJlcXVpcmVkICovCisJCWdvdG8gb3V0OworCXMgPSBlbmQgKyAxOworCWVuZCA9IF9tb3ZlX3RpbGxfaXRlbV9lbmQocyk7CisJaWYgKCFfYWRkX3RpbWVfcGFydF90b19saXN0KG1lbSwgbGlzdCwgdHogPyBUSU1FX1VOSVRfVFpfTUlOVVRFIDogVElNRV9VTklUX01JTlVURSwKKwkJCQkgICAgdHogPT0gLTEsIHMsIGVuZCAtIHMpKQorCQlnb3RvIG91dDsKKworCS8qIHNlY29uZCAqLworCWlmICgqZW5kICE9ICc6JykgeworCQkvKiBzZWNvbmQgbm90IHJlcXVpcmVkICovCisJCXMgPSBlbmQgKyAxOworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICh0eikKKwkJLyogdGltZXpvbmUgZG9lcyBub3QgaGF2ZSBzZWNvbmRzICovCisJCWdvdG8gb3V0OworCisJcyA9IGVuZCArIDE7CisJZW5kID0gX21vdmVfdGlsbF9pdGVtX2VuZChzKTsKKwlpZiAoIV9hZGRfdGltZV9wYXJ0X3RvX2xpc3QobWVtLCBsaXN0LCBUSU1FX1VOSVRfU0VDT05ELCAwLCBzLCBlbmQgLSBzKSkKKwkJZ290byBvdXQ7CisKKwlzID0gZW5kICsgMTsKKwlyID0gMTsKK291dDoKKwkqc3RyID0gczsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcHJlcGFyc2VfZnV6enlfdGltZShjb25zdCBjaGFyICpzLCBzdHJ1Y3QgdGltZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCXN0cnVjdCB0aW1lX2l0ZW0gKnRpOworCWNvbnN0IGNoYXIgKmVuZDsKKwlpbnQgZnV6enkgPSAwOworCXRpbWVfaWRfdCBpZDsKKwlzaXplX3QgbGVuOworCWludCByID0gMDsKKwljaGFyIGM7CisKKwlpZiAoIShsaXN0ID0gZG1fcG9vbF9hbGxvYyhpbmZvLT5tZW0sIHNpemVvZihzdHJ1Y3QgZG1fbGlzdCkpKSkgeworCQlsb2dfZXJyb3IoIl9wcmVwYXJzZV9mdXp6eV90aW1lOiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisJZG1fbGlzdF9pbml0KGxpc3QpOworCXMgPSBfc2tpcF9zcGFjZShzKTsKKworCXdoaWxlICgoYyA9ICpzKSkgeworCQkvKgorCQkgKiBJZiB0aGUgc3RyaW5nIGNvbnNpc3RzIG9mIC06KywgZGlnaXRzIG9yIHNwYWNlcywKKwkJICogaXQncyBub3Qgd29ydGggbG9va2luZyBmb3IgZnV6enkgbmFtZXMgaGVyZSAtCisJCSAqIGl0J3Mgc3RhbmRhcmQgWVlZWS1NTS1ERCBISDpNTTpTUyArLUhIOk1NIGZvcm1hdAorCQkgKiBhbmQgdGhhdCBpcyBwYXJzZWFibGUgYnkgbGliZG0gZGlyZWN0bHkuCisJCSAqLworCQlpZiAoIShpc2RpZ2l0KGMpIHx8IChjID09ICctJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnKycpKSkKKwkJCWZ1enp5ID0gMTsKKworCQllbmQgPSBfbW92ZV90aWxsX2l0ZW1fZW5kKHMpOworCisJCWlmIChpc2FscGhhKGMpKQorCQkJaWQgPSBUSU1FX1NUUjsKKwkJZWxzZSBpZiAoaXNkaWdpdChjKSkgeworCQkJaWYgKCplbmQgPT0gJzonKSB7CisJCQkJLyogd2UgaGF2ZSB0aW1lICovCisJCQkJaWYgKCFfZ2V0X3RpbWUoaW5mby0+bWVtLCAmcywgbGlzdCwgMCkpCisJCQkJCWdvdG8gb3V0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogd2UgaGF2ZSBzb21lIG90aGVyIG51bWJlciAqLworCQkJaWQgPSBUSU1FX05VTTsKKwkJfSBlbHNlIGlmICgoYyA9PSAnLScpIHx8IChjID09ICcrJykpIHsKKwkJCXMrKzsKKwkJCS8qIHdlIGhhdmUgdGltZXpvbmUgKi8KKwkJCWlmICghX2dldF90aW1lKGluZm8tPm1lbSwgJnMsIGxpc3QsIChjID09ICctJykgPyAtMSA6IDEpKQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJZ290byBvdXQ7CisKKwkJbGVuID0gZW5kIC0gczsKKwkJaWYgKCEodGkgPSBfYWxsb2NfdGltZV9pdGVtKGluZm8tPm1lbSwgaWQsIHMsIGxlbikpKQorCQkJZ290byBvdXQ7CisJCWRtX2xpc3RfYWRkKGxpc3QsICZ0aS0+bGlzdCk7CisJCXMgKz0gbGVuOworCQlzID0gX3NraXBfc3BhY2Uocyk7CisJfQorCisJaW5mby0+dGlfbGlzdCA9IGxpc3Q7CisJciA9IDE7CitvdXQ6CisJaWYgKCEociAmJiBmdXp6eSkpIHsKKwkJZG1fcG9vbF9mcmVlKGluZm8tPm1lbSwgbGlzdCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9tYXRjaF90aW1lX3N0cihzdHJ1Y3QgZG1fbGlzdCAqdGlfbGlzdCwgc3RydWN0IHRpbWVfaXRlbSAqdGkpCit7CisJc3RydWN0IHRpbWVfaXRlbSAqdGlfY29udGV4dF9wID0gKHN0cnVjdCB0aW1lX2l0ZW0gKikgZG1fbGlzdF9wcmV2KHRpX2xpc3QsICZ0aS0+bGlzdCk7CisJc2l6ZV90IHJlZ19sZW47CisJaW50IGk7CisKKwl0aS0+cHJvcCA9IFRJTUVfUFJPUChUSU1FX05VTEwpOworCisJZm9yIChpID0gMDsgX3RpbWVfcmVnW2ldLm5hbWU7IGkrKykgeworCQlyZWdfbGVuID0gc3RybGVuKF90aW1lX3JlZ1tpXS5uYW1lKTsKKwkJaWYgKCh0aS0+bGVuICE9IHJlZ19sZW4pICYmCisJCSAgICAhKChfdGltZV9yZWdbaV0ucmVnX2ZsYWdzICYgVElNRV9SRUdfUExVUkFMX1MpICYmCisJCSAgICAgICh0aS0+bGVuID09IHJlZ19sZW4rMSkgJiYgKHRpLT5zW3JlZ19sZW5dID09ICdzJykpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdHJuY2FzZWNtcCh0aS0+cywgX3RpbWVfcmVnW2ldLm5hbWUsIHJlZ19sZW4pKSB7CisJCQl0aS0+cHJvcCA9IF90aW1lX3JlZ1tpXS5wcm9wOworCQkJaWYgKCh0aS0+cHJvcC0+aWQgPiBUSU1FX1VOSVRfX1NUQVJUKSAmJiAodGktPnByb3AtPmlkIDwgVElNRV9VTklUX19FTkQpICYmCisJCQkgICAgdGlfY29udGV4dF9wICYmICh0aV9jb250ZXh0X3AtPnByb3AtPmlkID09IFRJTUVfTlVNKSkKKwkJCQl0aV9jb250ZXh0X3AtPnByb3AgPSBUSU1FX1BST1AoVElNRV9OVU1fTVVMVElQTElFUik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB0aS0+cHJvcC0+aWQ7Cit9CisKK3N0YXRpYyBpbnQgX21hdGNoX3RpbWVfbnVtKHN0cnVjdCBkbV9saXN0ICp0aV9saXN0LCBzdHJ1Y3QgdGltZV9pdGVtICp0aSkKK3sKKwlzdHJ1Y3QgdGltZV9pdGVtICp0aV9jb250ZXh0X3AgPSAoc3RydWN0IHRpbWVfaXRlbSAqKSBkbV9saXN0X3ByZXYodGlfbGlzdCwgJnRpLT5saXN0KTsKKwlzdHJ1Y3QgdGltZV9pdGVtICp0aV9jb250ZXh0X24gPSAoc3RydWN0IHRpbWVfaXRlbSAqKSBkbV9saXN0X25leHQodGlfbGlzdCwgJnRpLT5saXN0KTsKKwlzdHJ1Y3QgdGltZV9pdGVtICp0aV9jb250ZXh0X25uID0gdGlfY29udGV4dF9uID8gKHN0cnVjdCB0aW1lX2l0ZW0gKikgZG1fbGlzdF9uZXh0KHRpX2xpc3QsICZ0aV9jb250ZXh0X24tPmxpc3QpIDogTlVMTDsKKworCWlmICh0aV9jb250ZXh0X24gJiYKKwkgICAgKHRpX2NvbnRleHRfbi0+cHJvcC0+aWQgPiBUSU1FX01PTlRIX19TVEFSVCkgJiYKKwkgICAgKHRpX2NvbnRleHRfbi0+cHJvcC0+aWQgPCBUSU1FX01PTlRIX19FTkQpKSB7CisJCWlmICh0aV9jb250ZXh0X25uICYmIHRpX2NvbnRleHRfbm4tPnByb3AtPmlkID09IFRJTUVfTlVNKSB7CisJCQlpZiAodGktPmxlbiA8IHRpX2NvbnRleHRfbm4tPmxlbikgeworCQkJCS8qIDI0IEZlYiAyMDE1ICovCisJCQkJdGktPnByb3AgPSBUSU1FX1BST1AoVElNRV9OVU1fREFZKTsKKwkJCQl0aV9jb250ZXh0X25uLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfTlVNX1lFQVIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiAyMDE1IEZlYiAyNCAqLworCQkJCXRpLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfTlVNX1lFQVIpOworCQkJCXRpX2NvbnRleHRfbm4tPnByb3AgPSBUSU1FX1BST1AoVElNRV9OVU1fREFZKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0aS0+bGVuIDw9IDIpCisJCQkJLyogMjQgRmViICovCisJCQkJdGktPnByb3AgPSBUSU1FX1BST1AoVElNRV9OVU1fREFZKTsKKwkJCWVsc2UKKwkJCQkvKiAyMDE1IEZlYiAqLworCQkJCXRpLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfTlVNX1lFQVIpOworCQl9CisJfSBlbHNlIGlmICh0aV9jb250ZXh0X3AgJiYKKwkJICAgKHRpX2NvbnRleHRfcC0+cHJvcC0+aWQgPiBUSU1FX01PTlRIX19TVEFSVCkgJiYKKwkJICAgKHRpX2NvbnRleHRfcC0+cHJvcC0+aWQgPCBUSU1FX01PTlRIX19FTkQpKSB7CisJCWlmICh0aS0+bGVuIDw9IDIpCisJCQkvKiBGZWIgMjQgKi8KKwkJCXRpLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfTlVNX0RBWSk7CisJCWVsc2UKKwkJCS8qIEZlYiAyMDE1ICovCisJCQl0aS0+cHJvcCA9IFRJTUVfUFJPUChUSU1FX05VTV9ZRUFSKTsKKwl9IGVsc2UKKwkJdGktPnByb3AgPSBUSU1FX1BST1AoVElNRV9OVU1fWUVBUik7CisKKwlyZXR1cm4gdGktPnByb3AtPmlkOworfQorCitzdGF0aWMgdm9pZCBfZGV0ZWN0X3RpbWVfZ3JhbnVsYXJpdHkoc3RydWN0IHRpbWVfaW5mbyAqaW5mbywgc3RydWN0IHRpbWVfaXRlbSAqdGkpCit7CisJdGltZV9pZF90IGdyYW4gPSB0aS0+cHJvcC0+Z3JhbnVsYXJpdHk7CisJaW50IGlzX2RhdGUsIGlzX2FicywgaXNfcmVsOworCisJaWYgKGdyYW4gPT0gVElNRV9OVUxMKQorCQlyZXR1cm47CisKKwlpc19kYXRlID0gdGktPnByb3AtPnByb3BfZmxhZ3MgJiBUSU1FX1BST1BfREFURTsKKwlpc19hYnMgPSB0aS0+cHJvcC0+cHJvcF9mbGFncyAmIFRJTUVfUFJPUF9BQlM7CisJaXNfcmVsID0gdGktPnByb3AtPnByb3BfZmxhZ3MgJiBUSU1FX1BST1BfUkVMOworCisJaWYgKGlzX2RhdGUgJiYgaXNfYWJzKSB7CisJCWlmIChncmFuID4gaW5mby0+bWF4X2Fic19kYXRlX2dyYW51bGFyaXR5KQorCQkJaW5mby0+bWF4X2Fic19kYXRlX2dyYW51bGFyaXR5ID0gZ3JhbjsKKwkJaWYgKGdyYW4gPCBpbmZvLT5taW5fYWJzX2RhdGVfZ3JhbnVsYXJpdHkpCisJCQlpbmZvLT5taW5fYWJzX2RhdGVfZ3JhbnVsYXJpdHkgPSBncmFuOworCX0gZWxzZSB7CisJCWlmIChpc19hYnMgJiYgKGdyYW4gPCBpbmZvLT5taW5fYWJzX3RpbWVfZ3JhbnVsYXJpdHkpKQorCQkJaW5mby0+bWluX2Fic190aW1lX2dyYW51bGFyaXR5ID0gZ3JhbjsKKwkJZWxzZSBpZiAoaXNfcmVsICYmIChncmFuIDwgaW5mby0+bWluX3JlbF90aW1lX2dyYW51bGFyaXR5KSkKKwkJCWluZm8tPm1pbl9yZWxfdGltZV9ncmFudWxhcml0eSA9IGdyYW47CisJfQorfQorCitzdGF0aWMgdm9pZCBfY2hhbmdlX3RvX3JlbGF0aXZlKHN0cnVjdCB0aW1lX2luZm8gKmluZm8sIHN0cnVjdCB0aW1lX2l0ZW0gKnRpKQoreworCXN0cnVjdCB0aW1lX2l0ZW0gKnRpMjsKKworCXRpMiA9IHRpOworCXdoaWxlICgodGkyID0gKHN0cnVjdCB0aW1lX2l0ZW0gKikgZG1fbGlzdF9wcmV2KGluZm8tPnRpX2xpc3QsICZ0aTItPmxpc3QpKSkgeworCQlpZiAodGkyLT5wcm9wLT5pZCA9PSBUSU1FX0ZSQU1FX0FHTykKKwkJCWJyZWFrOworCisJCXN3aXRjaCAodGkyLT5wcm9wLT5pZCkgeworCQkJY2FzZSBUSU1FX1VOSVRfU0VDT05EOgorCQkJCXRpMi0+cHJvcCA9IFRJTUVfUFJPUChUSU1FX1VOSVRfU0VDT05EX1JFTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJTUVfVU5JVF9NSU5VVEU6CisJCQkJdGkyLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfVU5JVF9NSU5VVEVfUkVMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElNRV9VTklUX0hPVVI6CisJCQkJdGkyLT5wcm9wID0gVElNRV9QUk9QKFRJTUVfVU5JVF9IT1VSX1JFTCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9yZWNvZ25pemVfdGltZV9pdGVtcyhzdHJ1Y3QgdGltZV9pbmZvICppbmZvKQoreworCXN0cnVjdCB0aW1lX2l0ZW0gKnRpOworCisJLyoKKwkgKiBBdCBmaXJzdCwgdHJ5IHRvIHJlY29nbml6ZSBzdHJpbmdzLgorCSAqIEFsc28sIGlmIHRoZXJlIGFyZSBhbnkgaXRlbXMgd2hpY2ggbWF5IGJlIGFic29sdXRlIG9yCisJICogcmVsYXRpdmUgYW5kIHdlIGhhdmUgIlRJTUVfRlJBTUVfQUdPIiwgY2hhbmdlIHRoZW0gdG8gcmVsYXRpdmUuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHRpLCBpbmZvLT50aV9saXN0KSB7CisJCWlmICgodGktPnByb3AtPmlkID09IFRJTUVfU1RSKSAmJiAhX21hdGNoX3RpbWVfc3RyKGluZm8tPnRpX2xpc3QsIHRpKSkgeworCQkJbG9nX2Vycm9yKCJVbnJlY29nbml6ZWQgc3RyaW5nIGluIGRhdGUvdGltZSAiCisJCQkJICAic3BlY2lmaWNhdGlvbiBhdCBcIiVzXCIuIiwgdGktPnMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHRpLT5wcm9wLT5pZCA9PSBUSU1FX0ZSQU1FX0FHTykKKwkJCV9jaGFuZ2VfdG9fcmVsYXRpdmUoaW5mbywgdGkpOworCX0KKworCS8qCisJICogTm93LCByZWNvZ25pemUgYW55IG51bWJlcnMgYW5kIGJlIHNlbnNpdGl2ZSB0byB0aGUgY29udGV4dAorCSAqIGdpdmVuIGJ5IHN0cmluZ3Mgd2UgcmVjb2duaXplZCBiZWZvcmUuIEFsc28sIGRldGVjdCB0aW1lCisJICogZ3JhbnVsYXJpdHkgdXNlZCAoYm90aCBmb3IgYWJzb2x1dGUgYW5kL29yIHJlbGF0aXZlIHBhcnRzKS4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModGksIGluZm8tPnRpX2xpc3QpIHsKKwkJaWYgKCh0aS0+cHJvcC0+aWQgPT0gVElNRV9OVU0pICYmICFfbWF0Y2hfdGltZV9udW0oaW5mby0+dGlfbGlzdCwgdGkpKSB7CisJCQlsb2dfZXJyb3IoIlVucmVjb2duaXplZCBudW1iZXIgaW4gZGF0ZS90aW1lICIKKwkJCQkgICJzcGVjaWZpY2F0aW9uIGF0IFwiJXNcIi4iLCB0aS0+cyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlfZGV0ZWN0X3RpbWVfZ3JhbnVsYXJpdHkoaW5mbywgdGkpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja190aW1lX2l0ZW1zKHN0cnVjdCB0aW1lX2luZm8gKmluZm8pCit7CisJc3RydWN0IHRpbWVfaXRlbSAqdGk7CisJdWludDMyX3QgZmxhZ3M7CisJaW50IHJlbDsKKwlpbnQgZGF0ZV9pc19yZWxhdGl2ZSA9IC0xLCB0aW1lX2lzX3JlbGF0aXZlID0gLTE7CisJaW50IGxhYmVsX3RpbWUgPSAwLCBsYWJlbF9kYXRlID0gMDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh0aSwgaW5mby0+dGlfbGlzdCkgeworCQlmbGFncyA9IHRpLT5wcm9wLT5wcm9wX2ZsYWdzOworCQlyZWwgPSBmbGFncyAmIFRJTUVfUFJPUF9SRUw7CisKKwkJaWYgKGZsYWdzICYgVElNRV9QUk9QX0RBVEUpIHsKKwkJCWlmIChkYXRlX2lzX3JlbGF0aXZlIDwgMCkKKwkJCQlkYXRlX2lzX3JlbGF0aXZlID0gcmVsOworCQkJZWxzZSBpZiAoKGRhdGVfaXNfcmVsYXRpdmUgXiByZWwpICYmCisJCQkJIChpbmZvLT5tYXhfYWJzX2RhdGVfZ3JhbnVsYXJpdHkgPj0gaW5mby0+bWluX3JlbF90aW1lX2dyYW51bGFyaXR5KSkgeworCQkJCWxvZ19lcnJvcigiTWl4ZWQgYWJzb2x1dGUgYW5kIHJlbGF0aXZlIGRhdGUgIgorCQkJCQkgICJzcGVjaWZpY2F0aW9uIGZvdW5kIGF0IFwiJXNcIi4iLCB0aS0+cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIERhdGUgbGFiZWwgY2FuIGJlIHVzZWQgb25seSBvbmNlIGFuZCBub3QgbWl4ZWQgd2l0aCBvdGhlciBkYXRlIHNwZWMuICovCisJCQlpZiAobGFiZWxfZGF0ZSkgeworCQkJCWxvZ19lcnJvcigiQW1iaWd1b3VzIGRhdGUgc3BlY2lmaWNhdGlvbiBmb3VuZCBhdCBcIiVzXCIuIiwgdGktPnMpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIGlmIChfaXNfdGltZV9sYWJlbF9kYXRlKHRpLT5wcm9wLT5pZCkpCisJCQkJbGFiZWxfZGF0ZSA9IDE7CisJCX0KKworCQllbHNlIGlmIChmbGFncyAmIFRJTUVfUFJPUF9USU1FKSB7CisJCQlpZiAodGltZV9pc19yZWxhdGl2ZSA8IDApCisJCQkJdGltZV9pc19yZWxhdGl2ZSA9IHJlbDsKKwkJCWVsc2UgaWYgKCh0aW1lX2lzX3JlbGF0aXZlIF4gcmVsKSkgeworCQkJCWxvZ19lcnJvcigiTWl4ZWQgYWJzb2x1dGUgYW5kIHJlbGF0aXZlIHRpbWUgIgorCQkJCQkgICJzcGVjaWZpY2F0aW9uIGZvdW5kIGF0IFwiJXNcIi4iLCB0aS0+cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIFRpbWUgbGFiZWwgY2FuIGJlIHVzZWQgb25seSBvbmNlIGFuZCBub3QgbWl4ZWQgd2l0aCBvdGhlciB0aW1lIHNwZWMuICovCisJCQlpZiAobGFiZWxfdGltZSkgeworCQkJCWxvZ19lcnJvcigiQW1iaWd1b3VzIHRpbWUgc3BlY2lmaWNhdGlvbiBmb3VuZCBhdCBcIiVzXCIuIiwgdGktPnMpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIGlmIChfaXNfdGltZV9sYWJlbF90aW1lKHRpLT5wcm9wLT5pZCkpCisJCQkJbGFiZWxfdGltZSA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBDQUNIRV9JRF9USU1FX05PVyAidGltZV9ub3ciCisKK3N0YXRpYyB0aW1lX3QgKl9nZXRfbm93KHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtKQoreworCWNvbnN0IHZvaWQgKmNhY2hlZF9vYmo7CisJdGltZV90ICpub3c7CisKKwlpZiAoIShjYWNoZWRfb2JqID0gZG1fcmVwb3J0X3ZhbHVlX2NhY2hlX2dldChyaCwgQ0FDSEVfSURfVElNRV9OT1cpKSkgeworCQlpZiAoIShub3cgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZih0aW1lX3QpKSkpIHsKKwkJCWxvZ19lcnJvcigiX2dldF9ub3c6IGRtX3Bvb2xfemFsbG9jIGZhaWxlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdGltZShub3cpOworCQlpZiAoIWRtX3JlcG9ydF92YWx1ZV9jYWNoZV9zZXQocmgsIENBQ0hFX0lEX1RJTUVfTk9XLCBub3cpKSB7CisJCQlsb2dfZXJyb3IoIl9nZXRfbm93OiBmYWlsZWQgdG8gY2FjaGUgY3VycmVudCB0aW1lIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZQorCQlub3cgPSAodGltZV90ICopIGNhY2hlZF9vYmo7CisKKwlyZXR1cm4gbm93OworfQorCitzdGF0aWMgdm9pZCBfYWRqdXN0X3RpbWVfZm9yX2dyYW51bGFyaXR5KHN0cnVjdCB0aW1lX2luZm8gKmluZm8sIHN0cnVjdCB0bSAqdG0sIHRpbWVfdCAqdCkKK3sKKwlzd2l0Y2ggKGluZm8tPm1pbl9hYnNfZGF0ZV9ncmFudWxhcml0eSkgeworCQljYXNlIFRJTUVfVU5JVF9ZRUFSOgorCQkJdG0tPnRtX21vbiA9IDA7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBUSU1FX1VOSVRfTU9OVEg6CisJCQl0bS0+dG1fbWRheSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+bWluX2Fic190aW1lX2dyYW51bGFyaXR5KSB7CisJCWNhc2UgVElNRV9VTklUX0hPVVI6CisJCQl0bS0+dG1fbWluID0gMDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFRJTUVfVU5JVF9NSU5VVEU6CisJCQl0bS0+dG1fc2VjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVfVU5JVF9fRU5EOgorCQkJaWYgKGluZm8tPm1pbl9yZWxfdGltZV9ncmFudWxhcml0eSA9PSBUSU1FX1VOSVRfX0VORCkKKwkJCQl0bS0+dG1faG91ciA9IHRtLT50bV9taW4gPSB0bS0+dG1fc2VjID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJaWYgKChpbmZvLT5taW5fYWJzX3RpbWVfZ3JhbnVsYXJpdHkgPT0gVElNRV9VTklUX19FTkQpICYmCisJICAgIChpbmZvLT5taW5fcmVsX3RpbWVfZ3JhbnVsYXJpdHkgPj0gVElNRV9VTklUX0RBWSkgJiYKKwkgICAgKGluZm8tPm1pbl9yZWxfdGltZV9ncmFudWxhcml0eSA8PSBUSU1FX1VOSVRfWUVBUikpCisJCXRtLT50bV9ob3VyID0gdG0tPnRtX21pbiA9IHRtLT50bV9zZWMgPSAwOworfQorCisjZGVmaW5lIFNFQ1NfUEVSX01JTlVURSA2MAorI2RlZmluZSBTRUNTX1BFUl9IT1VSICAgMzYwMAorI2RlZmluZSBTRUNTX1BFUl9EQVkgICAgODY0MDAKKworc3RhdGljIGludCBfZGF5c19pbl9tb250aFsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07CisKK3N0YXRpYyBpbnQgX2lzX2xlYXBfeWVhcihsb25nIHllYXIpCit7CisJcmV0dXJuICgoKHllYXIgJSA0PT0wKSAmJiAoeWVhciAlIDEwMCAhPSAwKSkgfHwgKHllYXIgJSA0MDAgPT0gMCkpOworfQorCitzdGF0aWMgaW50IF9nZXRfZGF5c19pbl9tb250aChsb25nIG1vbnRoLCBsb25nIHllYXIpCit7CisJcmV0dXJuIChtb250aCA9PSAyICYmIF9pc19sZWFwX3llYXIoeWVhcikpID8gX2RheXNfaW5fbW9udGhbbW9udGgtMV0gKyAxCisJCQkJCQkgICA6IF9kYXlzX2luX21vbnRoW21vbnRoLTFdOworfQorCitzdGF0aWMgdm9pZCBfZ2V0X3Jlc3VsdGluZ190aW1lX3NwYW4oc3RydWN0IHRpbWVfaW5mbyAqaW5mbywKKwkJCQkgICAgIHN0cnVjdCB0bSAqdG0sIHRpbWVfdCB0LAorCQkJCSAgICAgdGltZV90ICp0X3Jlc3VsdDEsIHRpbWVfdCAqdF9yZXN1bHQyKQoreworCXRpbWVfdCB0MSA9IG1rdGltZSh0bSkgLSB0OworCXRpbWVfdCB0MiA9IHQxOworCXN0cnVjdCB0bSB0bXA7CisKKwlpZiAoaW5mby0+bWluX2Fic190aW1lX2dyYW51bGFyaXR5ICE9IFRJTUVfVU5JVF9fRU5EKSB7CisJCWlmIChpbmZvLT5taW5fYWJzX3RpbWVfZ3JhbnVsYXJpdHkgPT0gVElNRV9VTklUX01JTlVURSkKKwkJCXQyICs9IChTRUNTX1BFUl9NSU5VVEUgLSAxKTsKKwkJZWxzZSBpZiAoaW5mby0+bWluX2Fic190aW1lX2dyYW51bGFyaXR5ID09IFRJTUVfVU5JVF9IT1VSKQorCQkJdDIgKz0gKFNFQ1NfUEVSX0hPVVIgLSAxKTsKKwl9IGVsc2UgaWYgKGluZm8tPm1pbl9yZWxfdGltZV9ncmFudWxhcml0eSAhPSBUSU1FX1VOSVRfX0VORCkgeworCQlpZiAoaW5mby0+bWluX3JlbF90aW1lX2dyYW51bGFyaXR5ID09IFRJTUVfVU5JVF9NSU5VVEUpCisJCQl0MSAtPSAoU0VDU19QRVJfTUlOVVRFICsgMSk7CisJCWVsc2UgaWYgKGluZm8tPm1pbl9yZWxfdGltZV9ncmFudWxhcml0eSA9PSBUSU1FX1VOSVRfSE9VUikKKwkJCXQxIC09IChTRUNTX1BFUl9IT1VSICsgMSk7CisJCWVsc2UgaWYgKChpbmZvLT5taW5fcmVsX3RpbWVfZ3JhbnVsYXJpdHkgPj0gVElNRV9VTklUX0RBWSkgJiYKKwkJCShpbmZvLT5taW5fcmVsX3RpbWVfZ3JhbnVsYXJpdHkgPD0gVElNRV9VTklUX1lFQVIpKQorCQkJdDIgKz0gKFNFQ1NfUEVSX0RBWSAtIDEpOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT5taW5fYWJzX2RhdGVfZ3JhbnVsYXJpdHkgPT0gVElNRV9VTklUX01PTlRIKQorCQkJdDIgKz0gKFNFQ1NfUEVSX0RBWSAqIF9nZXRfZGF5c19pbl9tb250aCh0bS0+dG1fbW9uICsgMSwgdG0tPnRtX3llYXIpIC0gMSk7CisJCWVsc2UgaWYgKGluZm8tPm1pbl9hYnNfZGF0ZV9ncmFudWxhcml0eSAhPSBUSU1FX1VOSVRfX0VORCkKKwkJCXQyICs9IChTRUNTX1BFUl9EQVkgLSAxKTsKKwl9CisKKwkvKiBBZGp1c3QgZm9yIERTVCBpZiBuZWVkZWQuICovCisJbG9jYWx0aW1lX3IoJnQxLCAmdG1wKTsKKwlpZiAodG1wLnRtX2lzZHN0KQorCQl0MSAtPSBTRUNTX1BFUl9IT1VSOworCWxvY2FsdGltZV9yKCZ0MiwgJnRtcCk7CisJaWYgKHRtcC50bV9pc2RzdCkKKwkJdDIgLT0gU0VDU19QRVJfSE9VUjsKKworCSp0X3Jlc3VsdDEgPSB0MTsKKwkqdF9yZXN1bHQyID0gdDI7Cit9CisKK3N0YXRpYyBpbnQgX3RyYW5zbGF0ZV90aW1lX2l0ZW1zKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgdGltZV9pbmZvICppbmZvLAorCQkJCSBjb25zdCBjaGFyICoqZGF0YV9vdXQpCit7CisJc3RydWN0IHRpbWVfaXRlbSAqdGksICp0aV9wID0gTlVMTDsKKwlsb25nIG11bHRpcGxpZXIgPSAxOworCXN0cnVjdCB0bSB0bV9ub3c7CisJdGltZV9pZF90IGlkOworCWNoYXIgKmVuZDsKKwlsb25nIG51bTsKKwlzdHJ1Y3QgdG0gdG07IC8qIGFic29sdXRlIHRpbWUgKi8KKwl0aW1lX3QgdCA9IDA7IC8qIG9mZnNldCBpbnRvIHBhc3QgYmVmb3JlIGFic29sdXRlIHRpbWUgKi8KKwl0aW1lX3QgdDEsIHQyOworCWNoYXIgYnVmWzMyXTsKKworCWxvY2FsdGltZV9yKGluZm8tPm5vdywgJnRtX25vdyk7CisJdG0gPSB0bV9ub3c7CisJdG0udG1faXNkc3QgPSAwOyAvKiB3ZSdsbCBhZGp1c3QgZm9yIGRzdCBsYXRlciAqLworCXRtLnRtX3dkYXkgPSB0bS50bV95ZGF5ID0gLTE7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModGksIGluZm8tPnRpX2xpc3QpIHsKKwkJaWQgPSB0aS0+cHJvcC0+aWQ7CisKKwkJaWYgKF9pc190aW1lX251bShpZCkpIHsKKwkJCW51bSA9IHN0cnRvbCh0aS0+cywgJmVuZCwgMTApOworCQkJc3dpdGNoIChpZCkgeworCQkJCWNhc2UgVElNRV9OVU1fTVVMVElQTElFUl9ORUdBVElWRToKKwkJCQkJbXVsdGlwbGllciA9IC1udW07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9OVU1fTVVMVElQTElFUjoKKwkJCQkJbXVsdGlwbGllciA9IG51bTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX05VTV9EQVk6CisJCQkJCXRtLnRtX21kYXkgPSBudW07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9OVU1fWUVBUjoKKwkJCQkJdG0udG1feWVhciA9IG51bSAtIDE5MDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKF9pc190aW1lX21vbnRoKGlkKSkgeworCQkJdG0udG1fbW9uID0gaWQgLSBUSU1FX01PTlRIX19TVEFSVCAtIDE7CisJCX0gZWxzZSBpZiAoX2lzX3RpbWVfbGFiZWxfZGF0ZShpZCkpIHsKKwkJCWlmIChfaXNfdGltZV93ZWVrZGF5KGlkKSkgeworCQkJCW51bSA9IGlkIC0gVElNRV9XRUVLREFZX19TVEFSVCAtIDE7CisJCQkJaWYgKHRtX25vdy50bV93ZGF5IDwgbnVtKQorCQkJCQludW0gPSA3IC0gbnVtICsgdG1fbm93LnRtX3dkYXk7CisJCQkJZWxzZQorCQkJCQludW0gPSB0bV9ub3cudG1fd2RheSAtIG51bTsKKwkJCQl0ICs9IG51bSAqIFNFQ1NfUEVSX0RBWTsKKwkJCX0gZWxzZSBzd2l0Y2ggKGlkKSB7CisJCQkJY2FzZSBUSU1FX0xBQkVMX0RBVEVfWUVTVEVSREFZOgorCQkJCQl0ICs9IFNFQ1NfUEVSX0RBWTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX0xBQkVMX0RBVEVfVE9EQVk6CisJCQkJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAtIHdlIHN0YXJ0ZWQgd2l0aCB0b2RheS4gKi8KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoX2lzX3RpbWVfbGFiZWxfdGltZShpZCkpIHsKKwkJCXN3aXRjaCAoaWQpIHsKKwkJCQljYXNlIFRJTUVfTEFCRUxfVElNRV9OT09OOgorCQkJCQl0bS50bV9ob3VyID0gMTI7CisJCQkJCXRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9MQUJFTF9USU1FX01JRE5JR0hUOgorCQkJCQl0bS50bV9ob3VyID0gdG0udG1fbWluID0gdG0udG1fc2VjID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoX2lzX3RpbWVfdW5pdChpZCkpIHsKKwkJCXN3aXRjaCAoaWQpIHsKKwkJCQljYXNlIFRJTUVfVU5JVF9TRUNPTkQ6CisJCQkJCXRtLnRtX3NlYyA9IG11bHRpcGxpZXI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9VTklUX1NFQ09ORF9SRUw6CisJCQkJCXQgKz0gbXVsdGlwbGllcjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX1VOSVRfTUlOVVRFOgorCQkJCQl0bS50bV9taW4gPSBtdWx0aXBsaWVyOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJTUVfVU5JVF9NSU5VVEVfUkVMOgorCQkJCQl0ICs9IChtdWx0aXBsaWVyICogU0VDU19QRVJfTUlOVVRFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX1VOSVRfSE9VUjoKKwkJCQkJdG0udG1faG91ciA9IG11bHRpcGxpZXI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9VTklUX0hPVVJfUkVMOgorCQkJCQl0ICs9IChtdWx0aXBsaWVyICogU0VDU19QRVJfSE9VUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9VTklUX0FNOgorCQkJCQlpZiAodGlfcCAmJiB0aV9wLT5wcm9wLT5pZCA9PSBUSU1FX05VTV9NVUxUSVBMSUVSKQorCQkJCQkJdG0udG1faG91ciA9IG11bHRpcGxpZXI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElNRV9VTklUX1BNOgorCQkJCQlpZiAodGlfcCAmJiBfaXNfdGltZV91bml0KHRpX3AtPnByb3AtPmlkKSkKKwkJCQkJCXQgLT0gMTIgKiBTRUNTX1BFUl9IT1VSOworCQkJCQllbHNlIGlmICh0aV9wICYmIHRpX3AtPnByb3AtPmlkID09IFRJTUVfTlVNX01VTFRJUExJRVIpCisJCQkJCQl0bS50bV9ob3VyID0gbXVsdGlwbGllciArIDEyOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJTUVfVU5JVF9EQVk6CisJCQkJCXQgKz0gbXVsdGlwbGllciAqIFNFQ1NfUEVSX0RBWTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX1VOSVRfV0VFSzoKKwkJCQkJdCArPSBtdWx0aXBsaWVyICogNyAqIFNFQ1NfUEVSX0RBWTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSU1FX1VOSVRfTU9OVEg6CisJCQkJCS8qIGlmIG1vbnRocyA+IDEyLCBjb252ZXJ0IHRvIHllYXJzIGZpcnN0ICovCisJCQkJCW51bSA9IG11bHRpcGxpZXIgLyAxMjsKKwkJCQkJdG0udG1feWVhciAtPSBudW07CisKKwkJCQkJbnVtID0gbXVsdGlwbGllciAlIDEyOworCQkJCQlpZiAobnVtID4gKHRtLnRtX21vbiArIDEpKSB7CisJCQkJCQl0bS50bV95ZWFyLS07CisJCQkJCQl0bS50bV9tb24gPSAxMiAtIG51bSArIHRtLnRtX21vbjsKKwkJCQkJfSBlbHNlCisJCQkJCQl0bS50bV9tb24gLT0gbnVtOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJTUVfVU5JVF9ZRUFSOgorCQkJCQl0bS50bV95ZWFyIC09IG11bHRpcGxpZXI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJdGlfcCA9IHRpOworCX0KKworCV9hZGp1c3RfdGltZV9mb3JfZ3JhbnVsYXJpdHkoaW5mbywgJnRtLCAmdCk7CisJX2dldF9yZXN1bHRpbmdfdGltZV9zcGFuKGluZm8sICZ0bSwgdCwgJnQxLCAmdDIpOworCisJZG1fcG9vbF9mcmVlKGluZm8tPm1lbSwgaW5mby0+dGlfbGlzdCk7CisJaW5mby0+dGlfbGlzdCA9IE5VTEw7CisKKwlpZiAoZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkAlbGQ6QCVsZCIsIHQxLCB0MikgPT0gLTEpIHsKKwkJbG9nX2Vycm9yKCJfdHJhbnNsYXRlX3RpbWVfaXRlbXM6IGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISgqZGF0YV9vdXQgPSBkbV9wb29sX3N0cmR1cChpbmZvLT5tZW0sIGJ1ZikpKSB7CisJCWxvZ19lcnJvcigiX3RyYW5zbGF0ZV90aW1lX2l0ZW1zOiBkbV9wb29sX3N0cmR1cCBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfbHZfdGltZV9oYW5kbGVyX3BhcnNlX2Z1enp5X25hbWUoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCQkgICAgIGNvbnN0IGNoYXIgKmRhdGFfaW4pCit7CisJY29uc3QgY2hhciAqcyA9IGRhdGFfaW47CisJY29uc3QgY2hhciAqZGF0YV9vdXQgPSBOVUxMOworCXN0cnVjdCB0aW1lX2luZm8gaW5mbyA9IHsubWVtID0gbWVtLAorCQkJCSAudGlfbGlzdCA9IE5VTEwsCisJCQkJIC5ub3cgPSBfZ2V0X25vdyhyaCwgbWVtKSwKKwkJCQkgLm1pbl9hYnNfZGF0ZV9ncmFudWxhcml0eSA9IFRJTUVfVU5JVF9fRU5ELAorCQkJCSAubWF4X2Fic19kYXRlX2dyYW51bGFyaXR5ID0gVElNRV9VTklUX19TVEFSVCwKKwkJCQkgLm1pbl9hYnNfdGltZV9ncmFudWxhcml0eSA9IFRJTUVfVU5JVF9fRU5ELAorCQkJCSAubWluX3JlbF90aW1lX2dyYW51bGFyaXR5ID0gVElNRV9VTklUX19FTkR9OworCisJaWYgKCFpbmZvLm5vdykKKwkJZ290b19vdXQ7CisKKwkvKiByZWNvZ25pemUgdG9wLWxldmVsIHBhcnRzIC0gc3RyaW5nL251bWJlci90aW1lL3RpbWV6b25lPyAqLworCWlmICghX3ByZXBhcnNlX2Z1enp5X3RpbWUocywgJmluZm8pKQorCQlnb3RvIG91dDsKKworCS8qIHJlY29nbml6ZSBlYWNoIHBhcnQgaW4gbW9yZSBkZXRhaWwsIGFsc28gbG9vayBhdCB0aGUgY29udGV4dCBhcm91bmQgaWYgbmVlZGVkICovCisJaWYgKCFfcmVjb2duaXplX3RpbWVfaXRlbXMoJmluZm8pKQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBpdGVtcyBpcyBhbGxvd2VkIG9yIHdoZXRoZXIgaXQgbWFrZXMgc2Vuc2UgYXQgYWxsICovCisJaWYgKCFfY2hlY2tfdGltZV9pdGVtcygmaW5mbykpCisJCWdvdG8gb3V0OworCisJLyogdHJhbnNsYXRlIGl0ZW1zIGludG8gZmluYWwgdGltZSByYW5nZSAqLworCWlmICghX3RyYW5zbGF0ZV90aW1lX2l0ZW1zKHJoLCAmaW5mbywgJmRhdGFfb3V0KSkKKwkJZ290byBvdXQ7CitvdXQ6CisJaWYgKGluZm8udGlfbGlzdCkKKwkJZG1fcG9vbF9mcmVlKGluZm8ubWVtLCBpbmZvLnRpX2xpc3QpOworCXJldHVybiBkYXRhX291dDsKK30KKworc3RhdGljIHZvaWQgKl9sdl90aW1lX2hhbmRsZXJfZ2V0X2R5bmFtaWNfdmFsdWUoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkJY29uc3QgY2hhciAqZGF0YV9pbikKK3sKKwl0aW1lX3QgdDEsIHQyOworCXRpbWVfdCAqcmVzdWx0OworCisJaWYgKHNzY2FuZihkYXRhX2luLCAiQCVsZDpAJWxkIiwgJnQxLCAmdDIpICE9IDIpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBwYXJzZWQgdGltZSBzcGVjaWZpY2F0aW9uLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShyZXN1bHQgPSBkbV9wb29sX2FsbG9jKG1lbSwgMiAqIHNpemVvZih0aW1lX3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgdG8gc3RvcmUgdGltZSByYW5nZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmVzdWx0WzBdID0gdDE7CisJcmVzdWx0WzFdID0gdDI7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGx2X3RpbWVfaGFuZGxlcihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHVpbnQzMl90IGZpZWxkX251bSwKKwkJCSAgIGRtX3JlcG9ydF9yZXNlcnZlZF9hY3Rpb25fdCBhY3Rpb24sCisJCQkgICBjb25zdCB2b2lkICpkYXRhX2luLCBjb25zdCB2b2lkICoqZGF0YV9vdXQpCit7CisJKmRhdGFfb3V0ID0gTlVMTDsKKwlpZiAoIWRhdGFfaW4pCisJCXJldHVybiAxOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSBETV9SRVBPUlRfUkVTRVJWRURfUEFSU0VfRlVaWllfTkFNRToKKwkJCSpkYXRhX291dCA9IF9sdl90aW1lX2hhbmRsZXJfcGFyc2VfZnV6enlfbmFtZShyaCwgbWVtLCBkYXRhX2luKTsKKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9SRVNFUlZFRF9HRVRfRFlOQU1JQ19WQUxVRToKKwkJCWlmICghKCpkYXRhX291dCA9IF9sdl90aW1lX2hhbmRsZXJfZ2V0X2R5bmFtaWNfdmFsdWUocmgsIG1lbSwgZGF0YV9pbikpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZXQgdHlwZSByZXNlcnZlZCB2YWx1ZSAtIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgZGlyZWN0IHZhbHVlIG9mIHRoYXQgdHlwZS4KKyAqLworI2RlZmluZSBHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShpZCkgX3Jlc2VydmVkXyAjIyBpZAorCisvKgorICogR2V0IGZpZWxkIHJlc2VydmVkIHZhbHVlIC0gdGhlIHZhbHVlIHJldHVybmVkIGlzIGFsd2F5cyBhIHBvaW50ZXIgKGNvbnN0IHZvaWQgKikuCisgKi8KKyNkZWZpbmUgR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGlkKSBfcmVzZXJ2ZWRfICMjIGlkLnZhbHVlCisKKy8qCisgKiBHZXQgZmlyc3QgbmFtZSBhc3NpZ25lZCB0byB0aGUgcmVzZXJ2ZWQgdmFsdWUgLSB0aGlzIGlzIHRoZSBvbmUgdGhhdAorICogc2hvdWxkIGJlIHJlcG9ydGVkL2Rpc3BsYXllZC4gQWxsIHRoZSBvdGhlciBuYW1lcyBhc3NpZ25lZCBmb3IgdGhlIHJlc2VydmVkCisgKiB2YWx1ZSBhcmUgc3lub255bXMgcmVjb2duaXplZCBpbiBzZWxlY3Rpb24gY3JpdGVyaWEuCisgKi8KKyNkZWZpbmUgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUoaWQpIF9yZXNlcnZlZF8gIyMgaWQgIyMgX25hbWVzWzBdCisKKy8qCisgKiBSZXNlcnZlZCB2YWx1ZXMgYW5kIHRoZWlyIGFzc2lnbmVkIG5hbWVzLgorICogVGhlIGZpcnN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IGlzIGFsc28gdXNlZCBmb3IgcmVwb3J0aW5nLgorICogQWxsIG5hbWVzIGxpc3RlZCBhcmUgc3lub255bXMgcmVjb2duaXplZCBpbiBzZWxlY3Rpb24gY3JpdGVyaWEuCisgKiBGb3IgYmluYXJ5LWJhc2VkIHZhbHVlcyB3ZSBtYXAgYWxsIHJlc2VydmVkIG5hbWVzIGxpc3RlZCBvbnRvIHZhbHVlIDEsIGJsYW5rIG9udG8gdmFsdWUgMC4KKyAqCisgKiBUWVBFX1JFU0VSVkVEX1ZBTFVFKHR5cGUsIHJlc2VydmVkX3ZhbHVlX2lkLCBkZXNjcmlwdGlvbiwgdmFsdWUsIHJlc2VydmVkIG5hbWUsIC4uLikKKyAqIEZJRUxEX1JFU0VSVkVEX1ZBTFVFKGZpZWxkX2lkLCByZXNlcnZlZF92YWx1ZV9pZCwgZGVzY3JpcHRpb24sIHZhbHVlLCByZXNlcnZlZCBuYW1lLCAuLi4pCisgKiBGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUoZmllbGRfaWQsIHJlc2VydmVkX3ZhbHVlX2lkLCBkZXNjcmlwdGlvbiwgcmVzZXJ2ZWQgbmFtZSBmb3IgMSwgLi4uKQorICoKKyAqIE5vdGU6IEZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRSBjcmVhdGVzOgorICogCQktICdyZXNlcnZlZF92YWx1ZV9pZF95JyAoZm9yIDEpCisgKiAJCS0gJ3Jlc2VydmVkX3ZhbHVlX2lkX24nIChmb3IgMCkKKyAqLworI2RlZmluZSBOVU0gdWludDY0X3QKKyNkZWZpbmUgTlVNX0hORCBkbV9yZXBvcnRfcmVzZXJ2ZWRfaGFuZGxlcgorI2RlZmluZSBITkQgKGRtX3JlcG9ydF9yZXNlcnZlZF9oYW5kbGVyKQorI2RlZmluZSBOT0ZMQUcgMAorI2RlZmluZSBOQU1FRCBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfTkFNRUQKKyNkZWZpbmUgUkFOR0UgRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX1JBTkdFCisjZGVmaW5lIEZVWlpZIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9GVVpaWV9OQU1FUworI2RlZmluZSBEWU5BTUlDIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9EWU5BTUlDX1ZBTFVFCisKKyNkZWZpbmUgVFlQRV9SRVNFUlZFRF9WQUxVRSh0eXBlLCBmbGFncywgaWQsIGRlc2MsIHZhbHVlLCAuLi4pIFwKKwlzdGF0aWMgY29uc3QgY2hhciAqX3Jlc2VydmVkXyAjIyBpZCAjIyBfbmFtZXNbXSA9IHsgX19WQV9BUkdTX18sIE5VTEx9OyBcCisJc3RhdGljIGNvbnN0IHR5cGUgX3Jlc2VydmVkXyAjIyBpZCA9IHZhbHVlOworCisjZGVmaW5lIEZJRUxEX1JFU0VSVkVEX1ZBTFVFKGZsYWdzLCBmaWVsZF9pZCwgaWQsIGRlc2MsIHZhbHVlLCAuLi4pIFwKKwlzdGF0aWMgY29uc3QgY2hhciAqX3Jlc2VydmVkXyAjIyBpZCAjIyBfbmFtZXNbXSA9IHsgX19WQV9BUkdTX18gLCBOVUxMfTsgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3Jlc2VydmVkX3ZhbHVlIF9yZXNlcnZlZF8gIyMgaWQgPSB7ZmllbGRfICMjIGZpZWxkX2lkLCB2YWx1ZX07CisKKyNkZWZpbmUgRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKGZpZWxkX2lkLCBpZCwgZGVzYywgLi4uKSBcCisJRklFTERfUkVTRVJWRURfVkFMVUUoTkFNRUQsIGZpZWxkX2lkLCBpZCAjIyBfeSwgZGVzYywgJl9vbmU2NCwgX19WQV9BUkdTX18sIF9zdHJfeWVzKSBcCisJRklFTERfUkVTRVJWRURfVkFMVUUoTkFNRUQsIGZpZWxkX2lkLCBpZCAjIyBfbiwgZGVzYywgJl96ZXJvNjQsIF9fVkFfQVJHU19fLCBfc3RyX25vKQorCisjaW5jbHVkZSAidmFsdWVzLmgiCisKKyN1bmRlZiBOVU0KKyN1bmRlZiBOVU1fSE5ECisjdW5kZWYgSE5ECisjdW5kZWYgTk9GTEFHCisjdW5kZWYgTkFNRUQKKyN1bmRlZiBSQU5HRQorI3VuZGVmIFRZUEVfUkVTRVJWRURfVkFMVUUKKyN1bmRlZiBGSUVMRF9SRVNFUlZFRF9WQUxVRQorI3VuZGVmIEZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRQorI3VuZGVmIEZVWlpZCisjdW5kZWYgRFlOQU1JQworCisvKgorICogQ3JlYXRlIGFycmF5IG9mIHJlc2VydmVkIHZhbHVlcyB0byBiZSByZWdpc3RlcmVkIHdpdGggcmVwb3J0aW5nIGNvZGUgdmlhCisgKiBkbV9yZXBvcnRfaW5pdF93aXRoX3NlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHJlcG9ydCB3aXRoCisgKiBzZWxlY3Rpb24gY3JpdGVyaWEuIFNlbGVjdGlvbiBjb2RlIHRoZW4gcmVjb2duaXplcyB0aGVzZSByZXNlcnZlZCB2YWx1ZXMKKyAqIHdoZW4gcGFyc2luZyBzZWxlY3Rpb24gY3JpdGVyaWEuCisqLworCisjZGVmaW5lIE5VTSBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIKKyNkZWZpbmUgTlVNX0hORCBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIKKyNkZWZpbmUgSE5EIDAKKyNkZWZpbmUgTk9GTEFHIDAKKyNkZWZpbmUgTkFNRUQgRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX05BTUVECisjZGVmaW5lIFJBTkdFIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9SQU5HRQorI2RlZmluZSBGVVpaWSBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfRlVaWllfTkFNRVMKKyNkZWZpbmUgRFlOQU1JQyBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfRFlOQU1JQ19WQUxVRQorCisjZGVmaW5lIFRZUEVfUkVTRVJWRURfVkFMVUUodHlwZSwgZmxhZ3MsIGlkLCBkZXNjLCB2YWx1ZSwgLi4uKSB7dHlwZSB8IGZsYWdzLCAmX3Jlc2VydmVkXyAjIyBpZCwgX3Jlc2VydmVkXyAjIyBpZCAjIyBfbmFtZXMsIGRlc2N9LAorCisjZGVmaW5lIEZJRUxEX1JFU0VSVkVEX1ZBTFVFKGZsYWdzLCBmaWVsZF9pZCwgaWQsIGRlc2MsIHZhbHVlLCAuLi4pIHtETV9SRVBPUlRfRklFTERfVFlQRV9OT05FIHwgZmxhZ3MsICZfcmVzZXJ2ZWRfICMjIGlkLCBfcmVzZXJ2ZWRfICMjIGlkICMjIF9uYW1lcywgZGVzY30sCisKKyNkZWZpbmUgRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKGZpZWxkX2lkLCBpZCwgZGVzYywgLi4uKSBcCisJRklFTERfUkVTRVJWRURfVkFMVUUoTkFNRUQsIGZpZWxkX2lkLCBpZCAjIyBfeSwgZGVzYywgJl9vbmU2NCwgX19WQV9BUkdTX18pIFwKKwlGSUVMRF9SRVNFUlZFRF9WQUxVRShOQU1FRCwgZmllbGRfaWQsIGlkICMjIF9uLCBkZXNjLCAmX3plcm82NCwgX19WQV9BUkdTX18pCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X3Jlc2VydmVkX3ZhbHVlIF9yZXBvcnRfcmVzZXJ2ZWRfdmFsdWVzW10gPSB7CisJI2luY2x1ZGUgInZhbHVlcy5oIgorCXswLCBOVUxMLCBOVUxMLCBOVUxMfQorfTsKKworI3VuZGVmIE5VTQorI3VuZGVmIE5VTV9ITkQKKyN1bmRlZiBITkQKKyN1bmRlZiBOT0ZMQUcKKyN1bmRlZiBOQU1FRAorI3VuZGVmIFJBTkdFCisjdW5kZWYgRlVaWlkKKyN1bmRlZiBEWU5BTUlDCisjdW5kZWYgVFlQRV9SRVNFUlZFRF9WQUxVRQorI3VuZGVmIEZJRUxEX1JFU0VSVkVEX1ZBTFVFCisjdW5kZWYgRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFCisKK3N0YXRpYyBpbnQgX2ZpZWxkX3N0cmluZyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAmZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX2ZpZWxkX3NldF92YWx1ZShzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwgY29uc3Qgdm9pZCAqc29ydCkKK3sKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBkYXRhLCBzb3J0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9maWVsZF9zZXRfc3RyaW5nX2xpc3Qoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmxpc3QsIHZvaWQgKnByaXZhdGUsIGludCBzb3J0ZWQsCisJCQkJICBjb25zdCBjaGFyICpkZWxpbWl0ZXIpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopIHByaXZhdGU7CisJcmV0dXJuIHNvcnRlZCA/IGRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdChyaCwgZmllbGQsIGxpc3QsIGRlbGltaXRlciA/IDogY21kLT5yZXBvcnRfbGlzdF9pdGVtX3NlcGFyYXRvcikKKwkJICAgICAgOiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nX2xpc3RfdW5zb3J0ZWQocmgsIGZpZWxkLCBsaXN0LCBkZWxpbWl0ZXIgPyA6IGNtZC0+cmVwb3J0X2xpc3RfaXRlbV9zZXBhcmF0b3IpOworfQorCisvKgorICogRGF0YS1tdW5naW5nIGZ1bmN0aW9ucyB0byBwcmVwYXJlIGVhY2ggZGF0YSB0eXBlIGZvciBkaXNwbGF5IGFuZCBzb3J0aW5nCisgKi8KKworLyoKKyAqIERpc3BsYXkgZWl0aGVyICIwIi8iMSIgb3IgIiIvIndvcmQiIGJhc2VkIG9uIGJpbl92YWx1ZSwKKyAqIGNtZC0+cmVwb3J0X2JpbmFyeV92YWx1ZXNfYXNfbnVtZXJpYyBzZWxlY3RzIHRoZSBtb2RlIHRvIHVzZS4KKyovCitzdGF0aWMgaW50IF9iaW5hcnlfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBpbnQgYmluX3ZhbHVlLCBjb25zdCBjaGFyICp3b3JkLAorCQkJdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IChjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKikgcHJpdmF0ZTsKKworCWlmIChjbWQtPnJlcG9ydF9iaW5hcnlfdmFsdWVzX2FzX251bWVyaWMpCisJCS8qICIwIi8iMSIgKi8KKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIGJpbl92YWx1ZSA/IF9zdHJfb25lIDogX3N0cl96ZXJvLCBiaW5fdmFsdWUgPyAmX29uZTY0IDogJl96ZXJvNjQpOworCWVsc2UKKwkJLyogYmxhbmsvIndvcmQiICovCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBiaW5fdmFsdWUgPyB3b3JkIDogIiIsIGJpbl92YWx1ZSA/ICZfb25lNjQgOiAmX3plcm82NCk7Cit9CisKK3N0YXRpYyBpbnQgX2JpbmFyeV91bmRlZl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICopIHByaXZhdGU7CisKKwlpZiAoY21kLT5yZXBvcnRfYmluYXJ5X3ZhbHVlc19hc19udW1lcmljKQorCQlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobnVtX3VuZGVmXzY0KSwgJkdFVF9UWVBFX1JFU0VSVkVEX1ZBTFVFKG51bV91bmRlZl82NCkpOworCWVsc2UKKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIF9zdHJfdW5rbm93biwgJkdFVF9UWVBFX1JFU0VSVkVEX1ZBTFVFKG51bV91bmRlZl82NCkpOworfQorCitzdGF0aWMgaW50IF9zdHJpbmdfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX2NoYXJzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCBkYXRhKTsKK30KKworc3RhdGljIGludCBfdXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljaGFyICpyZXBzdHI7CisKKwlpZiAoIShyZXBzdHIgPSBpZF9mb3JtYXRfYW5kX2NvcHkobWVtLCBkYXRhKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2Rldm1pbm9yX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBkZXZtaW5vciA9IChpbnQpIE1JTk9SKCgqKGNvbnN0IHN0cnVjdCBkZXZpY2UgKiBjb25zdCAqKSBkYXRhKS0+ZGV2KTsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50KHJoLCBmaWVsZCwgJmRldm1pbm9yKTsKK30KKworc3RhdGljIGludCBfZGV2bWFqb3JfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJaW50IGRldm1ham9yID0gKGludCkgTUFKT1IoKCooY29uc3Qgc3RydWN0IGRldmljZSAqIGNvbnN0ICopIGRhdGEpLT5kZXYpOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9pbnQocmgsIGZpZWxkLCAmZGV2bWFqb3IpOworfQorCitzdGF0aWMgaW50IF9kZXZfbmFtZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGRldl9uYW1lKCooY29uc3Qgc3RydWN0IGRldmljZSAqIGNvbnN0ICopIGRhdGEpKTsKK30KKworc3RhdGljIGludCBfZGV2aWNlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKSBkYXRhOworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCisJaWYgKCEobGlzdCA9IGx2c2VnX2RldmljZXMobWVtLCBzZWcpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF9zdHJpbmdfbGlzdChyaCwgZmllbGQsIGxpc3QsIHByaXZhdGUsIDAsICIsIik7Cit9CisKK3N0YXRpYyBpbnQgX21ldGFkYXRhZGV2aWNlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisJc3RydWN0IGRtX2xpc3QgKmxpc3Q7CisKKwlpZiAoIShsaXN0ID0gbHZzZWdfbWV0YWRhdGFfZGV2aWNlcyhtZW0sIHNlZykpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgbGlzdCwgcHJpdmF0ZSwgMCwgIiwiKTsKK30KKworc3RhdGljIGludCBfcGVyYW5nZXNfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKSBkYXRhOworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCisJaWYgKCEobGlzdCA9IGx2c2VnX3NlZ19wZV9yYW5nZXMobWVtLCBzZWcpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF9zdHJpbmdfbGlzdChyaCwgZmllbGQsIGxpc3QsIHByaXZhdGUsIDAsICIgIik7Cit9CisKK3N0YXRpYyBpbnQgX2xlcmFuZ2VzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKworCWlmICghKGxpc3QgPSBsdnNlZ19zZWdfbGVfcmFuZ2VzKG1lbSwgc2VnKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIF9maWVsZF9zZXRfc3RyaW5nX2xpc3QocmgsIGZpZWxkLCBsaXN0LCBwcml2YXRlLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfbWV0YWRhdGFsZXJhbmdlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKworCWlmICghKGxpc3QgPSBsdnNlZ19zZWdfbWV0YWRhdGFfbGVfcmFuZ2VzKG1lbSwgc2VnKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIF9maWVsZF9zZXRfc3RyaW5nX2xpc3QocmgsIGZpZWxkLCBsaXN0LCBwcml2YXRlLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfdGFnc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fbGlzdCAqdGFnc2wgPSAoY29uc3Qgc3RydWN0IGRtX2xpc3QgKikgZGF0YTsKKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgdGFnc2wsIHByaXZhdGUsIDEsIE5VTEwpOworfQorCitzdHJ1Y3QgX3N0cl9saXN0X2FwcGVuZF9iYXRvbiB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZG1fbGlzdCAqcmVzdWx0OworfTsKKworc3RhdGljIGludCBfc3RyX2xpc3RfYXBwZW5kKGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBfc3RyX2xpc3RfYXBwZW5kX2JhdG9uICpiID0gYmF0b247CisJY29uc3QgY2hhciAqbGluZTIgPSBkbV9wb29sX3N0cmR1cChiLT5tZW0sIGxpbmUpOworCisJaWYgKCFsaW5lMikKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXN0cl9saXN0X2FkZChiLT5tZW0sIGItPnJlc3VsdCwgbGluZTIpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jYWNoZV9zZXR0aW5nc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKSBkYXRhOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc2V0dGluZ3M7CisJc3RydWN0IGRtX2xpc3QgKnJlc3VsdDsKKwlzdHJ1Y3QgX3N0cl9saXN0X2FwcGVuZF9iYXRvbiBiYXRvbjsKKwlzdHJ1Y3QgZG1fbGlzdCBkdW1teV9saXN0OyAvKiBkdW1teSBsaXN0IHRvIGRpc3BsYXkgIm5vdGhpbmciICovCisKKwlpZiAoc2VnX2lzX2NhY2hlKHNlZykpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCWVsc2UgaWYgKCFzZWdfaXNfY2FjaGVfcG9vbChzZWcpKSB7CisJCWRtX2xpc3RfaW5pdCgmZHVtbXlfbGlzdCk7CisJCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgJmR1bW15X2xpc3QsIHByaXZhdGUsIDAsIE5VTEwpOworCQkvKiBUT0RPOiBvbmNlIHdlIGhhdmUgc3VwcG9ydCBmb3IgU1RSX0xJU1QgcmVzZXJ2ZWQgdmFsdWVzLCByZXBsYWNlIHdpdGg6CisJCSAqIHJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUoY2FjaGVfc2V0dGluZ3NfdW5kZWYpLCBHRVRfRklFTERfUkVTRVJWRURfVkFMVUUoY2FjaGVfc2V0dGluZ3NfdW5kZWYpKTsKKwkJICovCisJfQorCisJaWYgKHNlZy0+cG9saWN5X3NldHRpbmdzKQorCQlzZXR0aW5ncyA9IHNlZy0+cG9saWN5X3NldHRpbmdzLT5jaGlsZDsKKwllbHNlIHsKKwkJZG1fbGlzdF9pbml0KCZkdW1teV9saXN0KTsKKwkJcmV0dXJuIF9maWVsZF9zZXRfc3RyaW5nX2xpc3QocmgsIGZpZWxkLCAmZHVtbXlfbGlzdCwgcHJpdmF0ZSwgMCwgTlVMTCk7CisJCS8qIFRPRE86IG9uY2Ugd2UgaGF2ZSBzdXBwb3J0IGZvciBTVFJfTElTVCByZXNlcnZlZCB2YWx1ZXMsIHJlcGxhY2Ugd2l0aDoKKwkJICogcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShjYWNoZV9zZXR0aW5nc191bmRlZiksIEdFVF9GSUVMRF9SRVNFUlZFRF9WQUxVRShjYWNoZV9zZXR0aW5nc191bmRlZikpOworCQkgKi8KKwl9CisKKwlpZiAoIShyZXN1bHQgPSBzdHJfbGlzdF9jcmVhdGUobWVtKSkpCisJCXJldHVybl8wOworCisJYmF0b24ubWVtID0gbWVtOworCWJhdG9uLnJlc3VsdCA9IHJlc3VsdDsKKworCXdoaWxlIChzZXR0aW5ncykgeworCQlkbV9jb25maWdfd3JpdGVfb25lX25vZGUoc2V0dGluZ3MsIF9zdHJfbGlzdF9hcHBlbmQsICZiYXRvbik7CisJCXNldHRpbmdzID0gc2V0dGluZ3MtPnNpYjsKKwl9OworCisJcmV0dXJuIF9maWVsZF9zZXRfc3RyaW5nX2xpc3QocmgsIGZpZWxkLCByZXN1bHQsIHByaXZhdGUsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9kb19nZXRfa2VybmVsX2NhY2hlX3NldHRpbmdzX2xpc3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkJICAgICAgaW50IGNhY2hlX2FyZ2MsIGNoYXIgKipjYWNoZV9hcmd2LAorCQkJCQkgICAgICBzdHJ1Y3QgZG1fbGlzdCAqcmVzdWx0KQoreworCWNvbnN0IGNoYXIgKmtleSwgKnZhbHVlOworCWNoYXIgKmJ1ZjsKKwlzaXplX3QgYnVmX2xlbjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkrMSA8IGNhY2hlX2FyZ2M7IGkgKz0gMikgeworCQlrZXkgPSBjYWNoZV9hcmd2W2ldOworCQl2YWx1ZSA9IGNhY2hlX2FyZ3ZbaSsxXTsKKwkJLyogKzEgZm9yICI9IiBjaGFyIGFuZCArMSBmb3IgdHJhaWxpbmcgemVybyAqLworCQlidWZfbGVuID0gc3RybGVuKGtleSkgKyBzdHJsZW4odmFsdWUpICsgMjsKKwkJaWYgKCEoYnVmID0gZG1fcG9vbF9hbGxvYyhtZW0sIGJ1Zl9sZW4pKSkKKwkJCXJldHVybl8wOworCQlpZiAoZG1fc25wcmludGYoYnVmLCBidWZfbGVuLCAiJXM9JXMiLCBrZXksIHZhbHVlKSA8IDApCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFzdHJfbGlzdF9hZGRfbm9fZHVwX2NoZWNrKG1lbSwgcmVzdWx0LCBidWYpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9rZXJuZWxfY2FjaGVfc2V0dGluZ3NfbGlzdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkgICBzdHJ1Y3QgZG1fc3RhdHVzX2NhY2hlICpjYWNoZV9zdGF0dXMsCisJCQkJCSAgIHN0cnVjdCBkbV9saXN0ICoqcmVzdWx0KQoreworCWlmICghKCpyZXN1bHQgPSBzdHJfbGlzdF9jcmVhdGUobWVtKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfZG9fZ2V0X2tlcm5lbF9jYWNoZV9zZXR0aW5nc19saXN0KG1lbSwgY2FjaGVfc3RhdHVzLT5jb3JlX2FyZ2MsCisJCQkJCQljYWNoZV9zdGF0dXMtPmNvcmVfYXJndiwgKnJlc3VsdCkpCisJCXJldHVybl8wOworCisJaWYgKCFfZG9fZ2V0X2tlcm5lbF9jYWNoZV9zZXR0aW5nc19saXN0KG1lbSwgY2FjaGVfc3RhdHVzLT5wb2xpY3lfYXJnYywKKwkJCQkJCWNhY2hlX3N0YXR1cy0+cG9saWN5X2FyZ3YsICpyZXN1bHQpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9rZXJuZWxfY2FjaGVfc2V0dGluZ3NfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisJc3RydWN0IGRtX2xpc3QgZHVtbXlfbGlzdDsgLyogZHVtbXkgbGlzdCB0byBkaXNwbGF5ICJub3RoaW5nIiAqLworCXN0cnVjdCBkbV9saXN0ICpyZXN1bHQ7CisJaW50IHIgPSAwOworCisJaWYgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX0NBQ0hFKSB7CisJCWRtX2xpc3RfaW5pdCgmZHVtbXlfbGlzdCk7CisJCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgJmR1bW15X2xpc3QsIHByaXZhdGUsIDAsIE5VTEwpOworCX0KKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJyZXBvcnRlcl9wb29sIiwgMTAyNCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghX2dldF9rZXJuZWxfY2FjaGVfc2V0dGluZ3NfbGlzdChtZW0sIGx2ZG0tPnNlZ19zdGF0dXMuY2FjaGUsICZyZXN1bHQpKQorCQlnb3RvX291dDsKKworCXIgPSBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgcmVzdWx0LCBwcml2YXRlLCAwLCBOVUxMKTsKK291dDoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfa2VybmVsX2NhY2hlX3BvbGljeV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0gPSAoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqKSBkYXRhOworCisJaWYgKChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19DQUNIRSkgJiYKKwkgICAgbHZkbS0+c2VnX3N0YXR1cy5jYWNoZS0+cG9saWN5X25hbWUpCisJCXJldHVybiBfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgbHZkbS0+c2VnX3N0YXR1cy5jYWNoZS0+cG9saWN5X25hbWUpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGNhY2hlX3BvbGljeV91bmRlZiksCisJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGNhY2hlX3BvbGljeV91bmRlZikpOworfQorCitzdGF0aWMgaW50IF9jYWNoZV9wb2xpY3lfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisKKwlpZiAoc2VnX2lzX2NhY2hlKHNlZykpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCWVsc2UgaWYgKCFzZWdfaXNfY2FjaGVfcG9vbChzZWcpIHx8ICFzZWctPnBvbGljeV9uYW1lKQorCQlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUoY2FjaGVfcG9saWN5X3VuZGVmKSwKKwkJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGNhY2hlX3BvbGljeV91bmRlZikpOworCisJaWYgKCFzZWctPnBvbGljeV9uYW1lKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5leHBlY3RlZCBOVUxMIHBvbGljeSBuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIHNlZy0+cG9saWN5X25hbWUpOworfQorCitzdGF0aWMgaW50IF9tb2R1bGVzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXN0cnVjdCBkbV9saXN0ICptb2R1bGVzOworCisJaWYgKCEobW9kdWxlcyA9IHN0cl9saXN0X2NyZWF0ZShtZW0pKSkgeworCQlsb2dfZXJyb3IoIm1vZHVsZXMgc3RyX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobGlzdF9sdl9tb2R1bGVzKG1lbSwgbHYsIG1vZHVsZXMpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF9zdHJpbmdfbGlzdChyaCwgZmllbGQsIG1vZHVsZXMsIHByaXZhdGUsIDEsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9sdnByb2ZpbGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCisJaWYgKGx2LT5wcm9maWxlKQorCQlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGx2LT5wcm9maWxlLT5uYW1lKTsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2bG9ja2FyZ3NfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGx2LT5sb2NrX2FyZ3MgPyA6ICIiKTsKK30KKworc3RhdGljIGludCBfdmdmbXRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisKKwlpZiAodmctPmZpZCAmJiB2Zy0+ZmlkLT5mbXQpCisJCXJldHVybiBfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgdmctPmZpZC0+Zm10LT5uYW1lKTsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX3B2Zm10X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGxhYmVsICpsID0gKGNvbnN0IHN0cnVjdCBsYWJlbCAqKSBkYXRhOworCisJaWYgKGwtPmxhYmVsbGVyICYmIGwtPmxhYmVsbGVyLT5mbXQpCisJCXJldHVybiBfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgbC0+bGFiZWxsZXItPmZtdC0+bmFtZSk7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9sdmttYWpfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWlmIChsdmRtLT5pbmZvLmV4aXN0cyAmJiBsdmRtLT5pbmZvLm1ham9yID49IDApCisJCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50KHJoLCBmaWVsZCwgJmx2ZG0tPmluZm8ubWFqb3IpOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9pbnQzMihyaCwgZmllbGQsICZHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShudW1fdW5kZWZfMzIpKTsKK30KKworc3RhdGljIGludCBfbHZrbWluX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisKKwlpZiAobHZkbS0+aW5mby5leGlzdHMgJiYgbHZkbS0+aW5mby5taW5vciA+PSAwKQorCQlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX2ludChyaCwgZmllbGQsICZsdmRtLT5pbmZvLm1pbm9yKTsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50MzIocmgsIGZpZWxkLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzMyKSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c3RhdHVzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmggX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0gPSAoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGx2X2F0dHJfZHVwX3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyhtZW0sIGx2ZG0pKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfcHZzdGF0dXNfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPQorCSAgICAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IHB2X2F0dHJfZHVwKG1lbSwgcHYpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfdmdzdGF0dXNfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IHZnX2F0dHJfZHVwKG1lbSwgdmcpKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfc2VndHlwZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisJY2hhciAqbmFtZTsKKworCWlmICghKG5hbWUgPSBsdnNlZ19zZWd0eXBlX2R1cChtZW0sIHNlZykpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBzZWd0eXBlIG5hbWUuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBuYW1lLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfbHZuYW1lX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopIHByaXZhdGU7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwlpbnQgaXNfaGlzdG9yaWNhbCA9IGx2X2lzX2hpc3RvcmljYWwobHYpOworCWNvbnN0IGNoYXIgKnRtcF9sdm5hbWU7CisJY2hhciAqcmVwc3RyLCAqbHZuYW1lOworCXNpemVfdCBsZW47CisKKwlpZiAoIWlzX2hpc3RvcmljYWwgJiYgKGx2X2lzX3Zpc2libGUobHYpIHx8ICFjbWQtPnJlcG9ydF9tYXJrX2hpZGRlbl9kZXZpY2VzKSkKKwkJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCBsdi0+bmFtZSk7CisKKwlpZiAoaXNfaGlzdG9yaWNhbCkgeworCQl0bXBfbHZuYW1lID0gbHYtPnRoaXNfZ2x2LT5oaXN0b3JpY2FsLT5uYW1lOworCQlsZW4gPSBzdHJsZW4odG1wX2x2bmFtZSkgKyBzdHJsZW4oSElTVE9SSUNBTF9MVl9QUkVGSVgpICsgMTsKKwl9IGVsc2UgeworCQl0bXBfbHZuYW1lID0gbHYtPm5hbWU7CisJCWxlbiA9IHN0cmxlbih0bXBfbHZuYW1lKSArIDM7CisJfQorCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF96YWxsb2MobWVtLCBsZW4pKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihyZXBzdHIsIGxlbiwgIiVzJXMlcyIsCisJCQlpc19oaXN0b3JpY2FsID8gSElTVE9SSUNBTF9MVl9QUkVGSVggOiAiWyIsCisJCQl0bXBfbHZuYW1lLAorCQkJaXNfaGlzdG9yaWNhbCA/ICIiIDogIl0iKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJsdm5hbWUgc25wcmludGYgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGx2bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgdG1wX2x2bmFtZSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIGx2bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX2RvX2xvZ2x2X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlLAorCQkJICBpbnQgdXVpZCkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWlycm9yX2xvZ19sdiA9IGx2X21pcnJvcl9sb2dfbHYobHYpOworCisJaWYgKCFtaXJyb3JfbG9nX2x2KQorCQlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsIE5VTEwpOworCisJaWYgKHV1aWQpCisJCXJldHVybiBfdXVpZF9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmbWlycm9yX2xvZ19sdi0+bHZpZC5pZFsxXSwgcHJpdmF0ZSk7CisJZWxzZQorCQlyZXR1cm4gX2x2bmFtZV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBtaXJyb3JfbG9nX2x2LCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbG9nbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX2xvZ2x2X2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDApOworfQorCitzdGF0aWMgaW50IF9sb2dsdnV1aWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX2xvZ2x2X2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDEpOworfQorCitzdGF0aWMgaW50IF9sdmZ1bGxuYW1lX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGx2X2Z1bGxuYW1lX2R1cChtZW0sIGx2KSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2cGFyZW50X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwYXJlbnRfbHYgPSBsdl9wYXJlbnQobHYpOworCisJaWYgKCFwYXJlbnRfbHYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CisKKwlyZXR1cm4gX2x2bmFtZV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwYXJlbnRfbHYsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9kb19kYXRhbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIGludCB1dWlkKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpkYXRhX2x2ID0gbHZfZGF0YV9sdihsdik7CisKKwlpZiAoIWRhdGFfbHYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CisKKwlpZiAodXVpZCkKKwkJcmV0dXJuIF91dWlkX2Rpc3AocmgsIG1lbSwgZmllbGQsICZkYXRhX2x2LT5sdmlkLmlkWzFdLCBwcml2YXRlKTsKKwllbHNlCisJCXJldHVybiBfbHZuYW1lX2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGFfbHYsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9kYXRhbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX2RhdGFsdl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAwKTsKK30KKworc3RhdGljIGludCBfZGF0YWx2dXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9kb19kYXRhbHZfZGlzcChyaCwgbWVtLCBmaWVsZCwgZGF0YSwgcHJpdmF0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX2RvX21ldGFkYXRhbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgIGludCB1dWlkKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptZXRhZGF0YV9sdiA9IGx2X21ldGFkYXRhX2x2KGx2KTsKKworCWlmICghbWV0YWRhdGFfbHYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CQkKKworCWlmICh1dWlkKQorCQlyZXR1cm4gX3V1aWRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJm1ldGFkYXRhX2x2LT5sdmlkLmlkWzFdLCBwcml2YXRlKTsKKwllbHNlCisJCXJldHVybiBfbHZuYW1lX2Rpc3AocmgsIG1lbSwgZmllbGQsIG1ldGFkYXRhX2x2LCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbWV0YWRhdGFsdl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9kb19tZXRhZGF0YWx2X2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDApOworfQorCitzdGF0aWMgaW50IF9tZXRhZGF0YWx2dXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9kb19tZXRhZGF0YWx2X2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDEpOworfQorCitzdGF0aWMgaW50IF9kb19wb29sbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSwKKwkJCSAgIGludCB1dWlkKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2ID0gbHZfcG9vbF9sdihsdik7CisKKwlpZiAoIXBvb2xfbHYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CisKKwlpZiAodXVpZCkKKwkJcmV0dXJuIF91dWlkX2Rpc3AocmgsIG1lbSwgZmllbGQsICZwb29sX2x2LT5sdmlkLmlkWzFdLCBwcml2YXRlKTsKKwllbHNlCisJCXJldHVybiBfbHZuYW1lX2Rpc3AocmgsIG1lbSwgZmllbGQsIHBvb2xfbHYsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9wb29sbHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX3Bvb2xsdl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAwKTsKK30KKworc3RhdGljIGludCBfcG9vbGx2dXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9kb19wb29sbHZfZGlzcChyaCwgbWVtLCBmaWVsZCwgZGF0YSwgcHJpdmF0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2cGF0aF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJY2hhciAqcmVwc3RyOworCisJaWYgKCEocmVwc3RyID0gbHZfcGF0aF9kdXAobWVtLCBsdikpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9sdmRtcGF0aF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGx2X2RtcGF0aF9kdXAobWVtLCBsdikpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9kb19vcmlnaW5fZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSwKKwkJCSAgIGludCB1dWlkKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW5fbHYgPSBsdl9vcmlnaW5fbHYobHYpOworCisJaWYgKCFvcmlnaW5fbHYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CisKKwlpZiAodXVpZCkKKwkJcmV0dXJuIF91dWlkX2Rpc3AocmgsIG1lbSwgZmllbGQsICZvcmlnaW5fbHYtPmx2aWQuaWRbMV0sIHByaXZhdGUpOworCWVsc2UKKwkJcmV0dXJuIF9sdm5hbWVfZGlzcChyaCwgbWVtLCBmaWVsZCwgb3JpZ2luX2x2LCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfb3JpZ2luX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJcmV0dXJuIF9kb19vcmlnaW5fZGlzcChyaCwgbWVtLCBmaWVsZCwgZGF0YSwgcHJpdmF0ZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX29yaWdpbnV1aWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCXJldHVybiBfZG9fb3JpZ2luX2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9nbHZfc3RyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCisJCQkJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdsdikKK3sKKwlpZiAoIWdsdi0+aXNfaGlzdG9yaWNhbCkKKwkJcmV0dXJuIGdsdi0+bGl2ZS0+bmFtZTsKKworCWlmIChkbV9zbnByaW50ZihidWYsIGJ1Zl9sZW4sICIlcyVzIiwgSElTVE9SSUNBTF9MVl9QUkVGSVgsIGdsdi0+aGlzdG9yaWNhbC0+bmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiX2dldF9nbHZfc3RyOiBkbV9zbnByaW50ZiBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBfZmluZF9hbmNlc3RvcnMoc3RydWN0IF9zdHJfbGlzdF9hcHBlbmRfYmF0b24gKmFuY2VzdG9ycywKKwkJCSAgIHN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lIGdsdiwKKwkJCSAgIGludCBmdWxsLCBpbnQgaW5jbHVkZV9oaXN0b3JpY2FsX2x2cykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXZvaWQgKm9yaWdfcCA9IGdsdi5saXZlOworCWNvbnN0IGNoYXIgKmFuY2VzdG9yX3N0cjsKKwljaGFyIGJ1ZltOQU1FX0xFTiArIHN0cmxlbihISVNUT1JJQ0FMX0xWX1BSRUZJWCkgKyAxXTsKKworCWlmIChnbHYuaXNfaGlzdG9yaWNhbCkgeworCQlpZiAoZnVsbCAmJiBnbHYuaGlzdG9yaWNhbC0+aW5kaXJlY3Rfb3JpZ2luKQorCQkJZ2x2ID0gKmdsdi5oaXN0b3JpY2FsLT5pbmRpcmVjdF9vcmlnaW47CisJfSBlbHNlIGlmIChsdl9pc19jb3coZ2x2LmxpdmUpKSB7CisJCWdsdi5saXZlID0gb3JpZ2luX2Zyb21fY293KGdsdi5saXZlKTsKKwl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGdsdi5saXZlKSkgeworCQlzZWcgPSBmaXJzdF9zZWcoZ2x2LmxpdmUpOworCQlpZiAoc2VnLT5vcmlnaW4pCisJCQlnbHYubGl2ZSA9IHNlZy0+b3JpZ2luOworCQllbHNlIGlmIChzZWctPmV4dGVybmFsX2x2KQorCQkJZ2x2LmxpdmUgPSBzZWctPmV4dGVybmFsX2x2OworCQllbHNlIGlmIChmdWxsICYmIHNlZy0+aW5kaXJlY3Rfb3JpZ2luKQorCQkJZ2x2ID0gKnNlZy0+aW5kaXJlY3Rfb3JpZ2luOworCX0KKworCWlmIChvcmlnX3AgIT0gZ2x2LmxpdmUpIHsKKwkJaWYgKCEoYW5jZXN0b3Jfc3RyID0gX2dldF9nbHZfc3RyKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZnbHYpKSkKKwkJCXJldHVybl8wOworCQlpZiAoIWdsdi5pc19oaXN0b3JpY2FsIHx8IGluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpIHsKKwkJCWlmICghX3N0cl9saXN0X2FwcGVuZChhbmNlc3Rvcl9zdHIsIGFuY2VzdG9ycykpCisJCQkJcmV0dXJuXzA7CisJCX0KKwkJaWYgKCFfZmluZF9hbmNlc3RvcnMoYW5jZXN0b3JzLCBnbHYsIGZ1bGwsIGluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2YW5jZXN0b3JzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopIHByaXZhdGU7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwlzdHJ1Y3QgX3N0cl9saXN0X2FwcGVuZF9iYXRvbiBhbmNlc3RvcnM7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgZ2x2OworCisJYW5jZXN0b3JzLm1lbSA9IG1lbTsKKwlpZiAoIShhbmNlc3RvcnMucmVzdWx0ID0gc3RyX2xpc3RfY3JlYXRlKG1lbSkpKQorCQlyZXR1cm5fMDsKKworCWlmICgoZ2x2LmlzX2hpc3RvcmljYWwgPSBsdl9pc19oaXN0b3JpY2FsKGx2KSkpCisJCWdsdi5oaXN0b3JpY2FsID0gbHYtPnRoaXNfZ2x2LT5oaXN0b3JpY2FsOworCWVsc2UKKwkJZ2x2LmxpdmUgPSBsdjsKKworCWlmICghX2ZpbmRfYW5jZXN0b3JzKCZhbmNlc3RvcnMsIGdsdiwgMCwgY21kLT5pbmNsdWRlX2hpc3RvcmljYWxfbHZzKSkgeworCQlkbV9wb29sX2ZyZWUoYW5jZXN0b3JzLm1lbSwgYW5jZXN0b3JzLnJlc3VsdCk7CisJCXJldHVybl8wOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgYW5jZXN0b3JzLnJlc3VsdCwgcHJpdmF0ZSwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2ZnVsbGFuY2VzdG9yc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IChzdHJ1Y3QgY21kX2NvbnRleHQgKikgcHJpdmF0ZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXN0cnVjdCBfc3RyX2xpc3RfYXBwZW5kX2JhdG9uIGZ1bGxfYW5jZXN0b3JzOworCXN0cnVjdCBnZW5lcmljX2xvZ2ljYWxfdm9sdW1lIGdsdjsKKworCWZ1bGxfYW5jZXN0b3JzLm1lbSA9IG1lbTsKKwlpZiAoIShmdWxsX2FuY2VzdG9ycy5yZXN1bHQgPSBzdHJfbGlzdF9jcmVhdGUobWVtKSkpCisJCXJldHVybl8wOworCisJaWYgKChnbHYuaXNfaGlzdG9yaWNhbCA9IGx2X2lzX2hpc3RvcmljYWwobHYpKSkKKwkJZ2x2Lmhpc3RvcmljYWwgPSBsdi0+dGhpc19nbHYtPmhpc3RvcmljYWw7CisJZWxzZQorCQlnbHYubGl2ZSA9IGx2OworCisJaWYgKCFfZmluZF9hbmNlc3RvcnMoJmZ1bGxfYW5jZXN0b3JzLCBnbHYsIDEsIGNtZC0+aW5jbHVkZV9oaXN0b3JpY2FsX2x2cykpIHsKKwkJZG1fcG9vbF9mcmVlKGZ1bGxfYW5jZXN0b3JzLm1lbSwgZnVsbF9hbmNlc3RvcnMucmVzdWx0KTsKKwkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIF9maWVsZF9zZXRfc3RyaW5nX2xpc3QocmgsIGZpZWxkLCBmdWxsX2FuY2VzdG9ycy5yZXN1bHQsIHByaXZhdGUsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9maW5kX2Rlc2NlbmRhbnRzKHN0cnVjdCBfc3RyX2xpc3RfYXBwZW5kX2JhdG9uICpkZXNjZW5kYW50cywKKwkJCSAgICAgc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgZ2x2LAorCQkJICAgICBpbnQgZnVsbCwgaW50IGluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpCit7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgZ2x2X25leHQgPSB7MH07CisJY29uc3Qgc3RydWN0IHNlZ19saXN0ICpzbDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBnbHZfbGlzdCAqZ2x2bDsKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKwljb25zdCBjaGFyICpkZXNjZW5kYW50X3N0cjsKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoZ2x2LmlzX2hpc3RvcmljYWwpIHsKKwkJaWYgKGZ1bGwpIHsKKwkJCWxpc3QgPSAmZ2x2Lmhpc3RvcmljYWwtPmluZGlyZWN0X2dsdnM7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZ2x2bCwgbGlzdCkgeworCQkJCWlmICghZ2x2bC0+Z2x2LT5pc19oaXN0b3JpY2FsIHx8IGluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpIHsKKwkJCQkJaWYgKCEoZGVzY2VuZGFudF9zdHIgPSBfZ2V0X2dsdl9zdHIoYnVmLCBzaXplb2YoYnVmKSwgZ2x2bC0+Z2x2KSkpCisJCQkJCQlyZXR1cm5fMDsKKwkJCQkJaWYgKCFfc3RyX2xpc3RfYXBwZW5kKGRlc2NlbmRhbnRfc3RyLCBkZXNjZW5kYW50cykpCisJCQkJCQlyZXR1cm5fMDsKKwkJCQl9CisJCQkJaWYgKCFfZmluZF9kZXNjZW5kYW50cyhkZXNjZW5kYW50cywgKmdsdmwtPmdsdiwgZnVsbCwgaW5jbHVkZV9oaXN0b3JpY2FsX2x2cykpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChsdl9pc19vcmlnaW4oZ2x2LmxpdmUpKSB7CisJCWxpc3QgPSAmZ2x2LmxpdmUtPnNuYXBzaG90X3NlZ3M7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4oc2VnLCBsaXN0LCBvcmlnaW5fbGlzdCkgeworCQkJaWYgKChnbHYubGl2ZSA9IHNlZy0+Y293KSkgeworCQkJCWlmICghKGRlc2NlbmRhbnRfc3RyID0gX2dldF9nbHZfc3RyKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZnbHYpKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJaWYgKCFfc3RyX2xpc3RfYXBwZW5kKGRlc2NlbmRhbnRfc3RyLCBkZXNjZW5kYW50cykpCisJCQkJCXJldHVybl8wOworCQkJCWlmICghX2ZpbmRfZGVzY2VuZGFudHMoZGVzY2VuZGFudHMsIGdsdiwgZnVsbCwgaW5jbHVkZV9oaXN0b3JpY2FsX2x2cykpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbGlzdCA9ICZnbHYubGl2ZS0+c2Vnc191c2luZ190aGlzX2x2OworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIGxpc3QpIHsKKwkJCWlmIChsdl9pc190aGluX3ZvbHVtZShzbC0+c2VnLT5sdikpIHsKKwkJCQlzZWcgPSBmaXJzdF9zZWcoc2wtPnNlZy0+bHYpOworCQkJCWlmICgoc2VnLT5vcmlnaW4gPT0gZ2x2LmxpdmUpIHx8IChzZWctPmV4dGVybmFsX2x2ID09IGdsdi5saXZlKSkgeworCQkJCQlnbHZfbmV4dC5saXZlID0gc2wtPnNlZy0+bHY7CisJCQkJCWlmICghKGRlc2NlbmRhbnRfc3RyID0gX2dldF9nbHZfc3RyKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZnbHZfbmV4dCkpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCWlmICghX3N0cl9saXN0X2FwcGVuZChkZXNjZW5kYW50X3N0ciwgZGVzY2VuZGFudHMpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCWlmICghX2ZpbmRfZGVzY2VuZGFudHMoZGVzY2VuZGFudHMsIGdsdl9uZXh0LCBmdWxsLCBpbmNsdWRlX2hpc3RvcmljYWxfbHZzKSkKKwkJCQkJCXJldHVybl8wOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChmdWxsKSB7CisJCQlsaXN0ID0gJmdsdi5saXZlLT5pbmRpcmVjdF9nbHZzOworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdsdmwsIGxpc3QpIHsKKwkJCQlpZiAoIWdsdmwtPmdsdi0+aXNfaGlzdG9yaWNhbCB8fCBpbmNsdWRlX2hpc3RvcmljYWxfbHZzKSB7CisJCQkJCWlmICghKGRlc2NlbmRhbnRfc3RyID0gX2dldF9nbHZfc3RyKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGdsdmwtPmdsdikpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCWlmICghX3N0cl9saXN0X2FwcGVuZChkZXNjZW5kYW50X3N0ciwgZGVzY2VuZGFudHMpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJfQorCQkJCWlmICghX2ZpbmRfZGVzY2VuZGFudHMoZGVzY2VuZGFudHMsICpnbHZsLT5nbHYsIGZ1bGwsIGluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpKQorCQkJCQlyZXR1cm5fMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmRlc2NlbmRhbnRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKSBwcml2YXRlOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IF9zdHJfbGlzdF9hcHBlbmRfYmF0b24gZGVzY2VuZGFudHM7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgZ2x2OworCisJZGVzY2VuZGFudHMubWVtID0gbWVtOworCWlmICghKGRlc2NlbmRhbnRzLnJlc3VsdCA9IHN0cl9saXN0X2NyZWF0ZShtZW0pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKGdsdi5pc19oaXN0b3JpY2FsID0gbHZfaXNfaGlzdG9yaWNhbChsdikpKQorCQlnbHYuaGlzdG9yaWNhbCA9IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbDsKKwllbHNlCisJCWdsdi5saXZlID0gbHY7CisKKwlpZiAoIV9maW5kX2Rlc2NlbmRhbnRzKCZkZXNjZW5kYW50cywgZ2x2LCAwLCBjbWQtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpKSB7CisJCWRtX3Bvb2xfZnJlZShkZXNjZW5kYW50cy5tZW0sIGRlc2NlbmRhbnRzLnJlc3VsdCk7CisJCXJldHVybl8wOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgZGVzY2VuZGFudHMucmVzdWx0LCBwcml2YXRlLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfbHZmdWxsZGVzY2VuZGFudHNfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKSBwcml2YXRlOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IF9zdHJfbGlzdF9hcHBlbmRfYmF0b24gZGVzY2VuZGFudHM7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgZ2x2OworCisJZGVzY2VuZGFudHMubWVtID0gbWVtOworCWlmICghKGRlc2NlbmRhbnRzLnJlc3VsdCA9IHN0cl9saXN0X2NyZWF0ZShtZW0pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKGdsdi5pc19oaXN0b3JpY2FsID0gbHZfaXNfaGlzdG9yaWNhbChsdikpKQorCQlnbHYuaGlzdG9yaWNhbCA9IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbDsKKwllbHNlCisJCWdsdi5saXZlID0gbHY7CisKKwlpZiAoIV9maW5kX2Rlc2NlbmRhbnRzKCZkZXNjZW5kYW50cywgZ2x2LCAxLCBjbWQtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnMpKSB7CisJCWRtX3Bvb2xfZnJlZShkZXNjZW5kYW50cy5tZW0sIGRlc2NlbmRhbnRzLnJlc3VsdCk7CisJCXJldHVybl8wOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgZGVzY2VuZGFudHMucmVzdWx0LCBwcml2YXRlLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfZG9fbW92ZXB2X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUsCisJCQkgICBpbnQgdXVpZCkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNvbnN0IGNoYXIgKnJlcHN0cjsKKworCWlmICh1dWlkKQorCQlyZXBzdHIgPSBsdl9tb3ZlX3B2X3V1aWRfZHVwKG1lbSwgbHYpOworCWVsc2UKKwkJcmVwc3RyID0gbHZfbW92ZV9wdl9kdXAobWVtLCBsdik7CisKKwlpZiAocmVwc3RyKQorCQlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIHJlcHN0cik7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9tb3ZlcHZfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX21vdmVwdl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAwKTsKK30KKworc3RhdGljIGludCBfbW92ZXB2dXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9kb19tb3ZlcHZfZGlzcChyaCwgbWVtLCBmaWVsZCwgZGF0YSwgcHJpdmF0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX2RvX2NvbnZlcnRsdl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlLAorCQkJICAgICAgaW50IHV1aWQpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvbnZlcnRfbHYgPSBsdl9jb252ZXJ0X2x2KGx2KTsKKworCWlmICghY29udmVydF9sdikKKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCBOVUxMKTsKKworCWlmICh1dWlkKQorCQlyZXR1cm4gX3V1aWRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJmNvbnZlcnRfbHYtPmx2aWQuaWRbMV0sIHByaXZhdGUpOworCWVsc2UKKwkJcmV0dXJuIF9sdm5hbWVfZGlzcChyaCwgbWVtLCBmaWVsZCwgY29udmVydF9sdiwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnZlcnRsdl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBfZG9fY29udmVydGx2X2Rpc3AocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDApOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0bHZ1dWlkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX2RvX2NvbnZlcnRsdl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAxKTsKK30KKworc3RhdGljIGludCBfc2l6ZTMyX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmggX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3QgdWludDMyX3Qgc2l6ZSA9ICooY29uc3QgdWludDMyX3QgKikgZGF0YTsKKwljb25zdCBjaGFyICpkaXNwLCAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbDsKKworCWlmICghKihkaXNwID0gZGlzcGxheV9zaXplX3VuaXRzKHByaXZhdGUsICh1aW50NjRfdCkgc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgZGlzcCkpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9hbGxvYyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSAoZG91YmxlKSBzaXplOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgX3NpemU2NF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCB1aW50NjRfdCBzaXplID0gKihjb25zdCB1aW50NjRfdCAqKSBkYXRhOworCWNvbnN0IGNoYXIgKmRpc3AsICpyZXBzdHI7CisJZG91YmxlICpzb3J0dmFsOworCisJaWYgKCEqKGRpc3AgPSBkaXNwbGF5X3NpemVfdW5pdHMocHJpdmF0ZSwgc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgZGlzcCkpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKGRvdWJsZSkpKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCSpzb3J0dmFsID0gKGRvdWJsZSkgc2l6ZTsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworfQorCitzdGF0aWMgaW50IF91aW50MzJfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3VpbnQzMihyaCwgZmllbGQsIGRhdGEpOworfQorCitzdGF0aWMgaW50IF9pbnQ4X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3QgaW50MzJfdCB2YWwgPSAqKGNvbnN0IGludDhfdCAqKWRhdGE7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX2ludDMyKHJoLCBmaWVsZCwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgX2ludDMyX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9pbnQzMihyaCwgZmllbGQsIGRhdGEpOworfQorCitzdGF0aWMgaW50IF9sdndoZW5mdWxsX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJaWYgKGx2LT5zdGF0dXMgJiBMVl9FUlJPUl9XSEVOX0ZVTEwpCisJCQlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobHZfd2hlbl9mdWxsX2Vycm9yKSwKKwkJCQkJCUdFVF9GSUVMRF9SRVNFUlZFRF9WQUxVRShsdl93aGVuX2Z1bGxfZXJyb3IpKTsKKwkJZWxzZQorCQkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X3doZW5fZnVsbF9xdWV1ZSksCisJCQkJCQlHRVRfRklFTERfUkVTRVJWRURfVkFMVUUobHZfd2hlbl9mdWxsX3F1ZXVlKSk7CisJfQorCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X3doZW5fZnVsbF91bmRlZiksCisJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGx2X3doZW5fZnVsbF91bmRlZikpOworfQorCitzdGF0aWMgaW50IF9sdnJlYWRhaGVhZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCisJaWYgKGx2LT5yZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfQVVUTykKKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X3JlYWRfYWhlYWRfYXV0byksCisJCQkJCUdFVF9GSUVMRF9SRVNFUlZFRF9WQUxVRShsdl9yZWFkX2FoZWFkX2F1dG8pKTsKKworCXJldHVybiBfc2l6ZTMyX2Rpc3AocmgsIG1lbSwgZmllbGQsICZsdi0+cmVhZF9haGVhZCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2a3JlYWRhaGVhZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWlmICghbHZkbS0+aW5mby5leGlzdHMpCisJCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50MzIocmgsIGZpZWxkLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzMyKSk7CisKKwlyZXR1cm4gX3NpemUzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmbHZkbS0+aW5mby5yZWFkX2FoZWFkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfdmdzaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhOworCXVpbnQ2NF90IHNpemUgPSB2Z19zaXplKHZnKTsKKworCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZzaXplLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfc2VnbW9uaXRvcl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKWRhdGE7CisJY2hhciAqc3RyOworCisJaWYgKCEoc3RyID0gbHZzZWdfbW9uaXRvcl9kdXAobWVtLCBzZWcpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKnN0cikKKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHN0ciwgTlVMTCk7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUoc2VnX21vbml0b3JfdW5kZWYpLAorCQkJCUdFVF9GSUVMRF9SRVNFUlZFRF9WQUxVRShzZWdfbW9uaXRvcl91bmRlZikpOworfQorCitzdGF0aWMgaW50IF9zZWdzdGFydF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisJdWludDY0X3Qgc3RhcnQgPSBsdnNlZ19zdGFydChzZWcpOworCisJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJnN0YXJ0LCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfc2Vnc3RhcnRwZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDMyKHJoLCBmaWVsZCwgJnNlZy0+bGUpOworfQorCitzdGF0aWMgaW50IF9zZWdzaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisJdWludDY0X3Qgc2l6ZSA9IGx2c2VnX3NpemUoc2VnKTsKKworCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZzaXplLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfc2Vnc2l6ZXBlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3VpbnQzMihyaCwgZmllbGQsICZzZWctPmxlbik7Cit9CisKK3N0YXRpYyBpbnQgX2NodW5rc2l6ZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKwl1aW50NjRfdCBzaXplID0gbHZzZWdfY2h1bmtzaXplKHNlZyk7CisKKwlyZXR1cm4gX3NpemU2NF9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmc2l6ZSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3RyYW5zYWN0aW9uaWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKworCWlmIChzZWdfaXNfdGhpbl9wb29sKHNlZykgfHwgc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykpCisJCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDY0KHJoLCBmaWVsZCwgJnNlZy0+dHJhbnNhY3Rpb25faWQpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzY0KSk7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5pZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKworCWlmIChzZWdfaXNfdGhpbl92b2x1bWUoc2VnKSkKKwkJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50MzIocmgsIGZpZWxkLCAmc2VnLT5kZXZpY2VfaWQpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzY0KSk7Cit9CisKK3N0YXRpYyBpbnQgX2Rpc2NhcmRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKwljb25zdCBjaGFyICpkaXNjYXJkc19zdHI7CisKKwlpZiAoc2VnX2lzX3RoaW5fdm9sdW1lKHNlZykpCisJCXNlZyA9IGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpOworCisJaWYgKHNlZ19pc190aGluX3Bvb2woc2VnKSkgeworCQlkaXNjYXJkc19zdHIgPSBnZXRfcG9vbF9kaXNjYXJkc19uYW1lKHNlZy0+ZGlzY2FyZHMpOworCQlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGRpc2NhcmRzX3N0cik7CisJfQorCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfa2Rpc2NhcmRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisJY29uc3QgY2hhciAqZGlzY2FyZHNfc3RyOworCisJaWYgKCEoZGlzY2FyZHNfc3RyID0gbHZzZWdfa2VybmVsX2Rpc2NhcmRzX2R1cF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMobWVtLCBsdmRtKSkpCisJCXJldHVybl8wOworCisJaWYgKCpkaXNjYXJkc19zdHIpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBkaXNjYXJkc19zdHIsIE5VTEwpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKHNlZ19rZXJuZWxfZGlzY2FyZHNfdW5kZWYpLAorCQkJCUdFVF9GSUVMRF9SRVNFUlZFRF9WQUxVRShzZWdfa2VybmVsX2Rpc2NhcmRzX3VuZGVmKSk7Cit9CisKK3N0YXRpYyBpbnQgX2NhY2hlbW9kZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSAoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKikgZGF0YTsKKworCXJldHVybiBfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgZGlzcGxheV9jYWNoZV9tb2RlKHNlZykpOworfQorCitzdGF0aWMgaW50IF9vcmlnaW5zaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXVpbnQ2NF90IHNpemUgPSBsdl9vcmlnaW5fc2l6ZShsdik7CisKKwlpZiAoc2l6ZSkKKwkJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJnNpemUsIHByaXZhdGUpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmX3plcm82NCk7Cit9CisKK3N0YXRpYyBpbnQgX3B2dXNlZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0KKwkgICAgKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YTsKKworCXVpbnQ2NF90IHVzZWQgPSBwdl91c2VkKHB2KTsKKworCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZ1c2VkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfcHZmcmVlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPQorCSAgICAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXVpbnQ2NF90IGZyZWVzcGFjZTsKKworCWlmIChpc19vcnBoYW4ocHYpICYmIGlzX3VzZWRfcHYocHYpKQorCQlmcmVlc3BhY2UgPSAwOworCWVsc2UKKwkJZnJlZXNwYWNlID0gcHZfZnJlZShwdik7CisKKwlyZXR1cm4gX3NpemU2NF9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmZnJlZXNwYWNlLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfcHZzaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPQorCSAgICAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXVpbnQ2NF90IHNpemUgPSBwdl9zaXplX2ZpZWxkKHB2KTsKKworCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZzaXplLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfZGV2c2l6ZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKihzdHJ1Y3QgZGV2aWNlICogY29uc3QgKikgZGF0YTsKKwl1aW50NjRfdCBzaXplOworCisJaWYgKCFkZXYgfHwgIWRldi0+ZGV2IHx8ICFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpCisJCXNpemUgPSBfemVybzY0OworCisJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJnNpemUsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF92Z2ZyZWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisJdWludDY0X3QgZnJlZXNwYWNlID0gdmdfZnJlZSh2Zyk7CisKKwlyZXR1cm4gX3NpemU2NF9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmZnJlZXNwYWNlLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfdmdzeXN0ZW1pZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhOworCWNvbnN0IGNoYXIgKnJlcHN0ciA9ICh2Zy0+c3lzdGVtX2lkICYmICp2Zy0+c3lzdGVtX2lkKSA/IHZnLT5zeXN0ZW1faWQgOiB2Zy0+bHZtMV9zeXN0ZW1faWQgPyA6ICIiOworCisJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCByZXBzdHIpOworfQorCitzdGF0aWMgaW50IF92Z2xvY2t0eXBlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIHZnLT5sb2NrX3R5cGUgPyA6ICIiKTsKK30KKworc3RhdGljIGludCBfdmdsb2NrYXJnc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhOworCisJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCB2Zy0+bG9ja19hcmdzID8gOiAiIik7Cit9CisKK3N0YXRpYyBpbnQgX2x2dXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJY29uc3QgdW5pb24gbHZpZCAqbHZpZDsKKwljaGFyICpyZXBzdHI7CisKKwlpZiAobHZfaXNfaGlzdG9yaWNhbChsdikpCisJCWx2aWQgPSAmbHYtPnRoaXNfZ2x2LT5oaXN0b3JpY2FsLT5sdmlkOworCWVsc2UKKwkJbHZpZCA9ICZsdi0+bHZpZDsKKworCWlmICghKHJlcHN0ciA9IGlkX2Zvcm1hdF9hbmRfY29weShtZW0sICZsdmlkLT5pZFsxXSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9wdnV1aWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJICAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsYWJlbCAqbGFiZWwgPSAoY29uc3Qgc3RydWN0IGxhYmVsICopIGRhdGE7CisKKwlpZiAoIWxhYmVsLT5kZXYpCisJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgTlVMTCk7CisKKwlyZXR1cm4gX3V1aWRfZGlzcChyaCwgbWVtLCBmaWVsZCwgbGFiZWwtPmRldi0+cHZpZCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2bWRhc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0KKwkgICAgKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHB2X21kYV9jb3VudChwdik7CisKKwlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9wdm1kYXN1c2VkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0KKwkgICAgKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHB2X21kYV91c2VkX2NvdW50KHB2KTsKKworCXJldHVybiBfdWludDMyX2Rpc3AocmgsIG1lbSwgZmllbGQsICZjb3VudCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3ZnbWRhc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHZnX21kYV9jb3VudCh2Zyk7CisKKwlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF92Z21kYXN1c2VkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHZnX21kYV91c2VkX2NvdW50KHZnKTsKKworCXJldHVybiBfdWludDMyX2Rpc3AocmgsIG1lbSwgZmllbGQsICZjb3VudCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3ZnbWRhY29waWVzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisJdWludDMyX3QgY291bnQgPSB2Z19tZGFfY29waWVzKHZnKTsKKworCWlmIChjb3VudCA9PSBWR01FVEFEQVRBQ09QSUVTX1VOTUFOQUdFRCkKKwkJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKHZnX21kYV9jb3BpZXNfdW5tYW5hZ2VkKSwKKwkJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKHZnX21kYV9jb3BpZXNfdW5tYW5hZ2VkKSk7CisKKwlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF92Z3Byb2ZpbGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisKKwlpZiAodmctPnByb2ZpbGUpCisJCXJldHVybiBfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgdmctPnByb2ZpbGUtPm5hbWUpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfdmdtaXNzaW5ncHZjb3VudF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHZnX21pc3NpbmdfcHZfY291bnQodmcpOworCisJcmV0dXJuIF91aW50MzJfZGlzcChyaCwgbWVtLCBmaWVsZCwgJmNvdW50LCBwcml2YXRlKTsKK30KKworCitzdGF0aWMgaW50IF9wdm1kYWZyZWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbGFiZWwgKmxhYmVsID0gKGNvbnN0IHN0cnVjdCBsYWJlbCAqKSBkYXRhOworCXVpbnQ2NF90IGZyZWVzcGFjZSA9IGx2bWNhY2hlX2luZm9fbWRhX2ZyZWUobGFiZWwtPmluZm8pOworCisJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJmZyZWVzcGFjZSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2bWRhc2l6ZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsYWJlbCAqbGFiZWwgPSAoY29uc3Qgc3RydWN0IGxhYmVsICopIGRhdGE7CisJdWludDY0X3QgbWluX21kYV9zaXplID0gbHZtY2FjaGVfc21hbGxlc3RfbWRhX3NpemUobGFiZWwtPmluZm8pOworCisJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJm1pbl9tZGFfc2l6ZSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2ZXh0dnNuX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsYWJlbCAqbGFiZWwgPSAoY29uc3Qgc3RydWN0IGxhYmVsICopIGRhdGE7CisJc3RydWN0IGx2bWNhY2hlX2luZm8gKmluZm8gPSBsYWJlbC0+aW5mbzsKKwl1aW50MzJfdCBleHRfdmVyc2lvbjsKKworCWlmIChpbmZvKSB7CisJCWV4dF92ZXJzaW9uID0gbHZtY2FjaGVfZXh0X3ZlcnNpb24oaW5mbyk7CisJCXJldHVybiBfdWludDMyX2Rpc3AocmgsIG1lbSwgZmllbGQsICZleHRfdmVyc2lvbiwgcHJpdmF0ZSk7CisJfQorCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzY0KSk7Cit9CisKKworc3RhdGljIGludCBfdmdtZGFzaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSAoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhOworCXVpbnQ2NF90IG1pbl9tZGFfc2l6ZSA9IHZnX21kYV9zaXplKHZnKTsKKworCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZtaW5fbWRhX3NpemUsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF92Z21kYWZyZWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisJdWludDY0X3QgZnJlZXNwYWNlID0gdmdfbWRhX2ZyZWUodmcpOworCisJcmV0dXJuIF9zaXplNjRfZGlzcChyaCwgbWVtLCBmaWVsZCwgJmZyZWVzcGFjZSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y291bnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YTsKKwl1aW50MzJfdCBjb3VudCA9IHZnX3Zpc2libGVfbHZzKHZnKTsKKworCXJldHVybiBfdWludDMyX2Rpc3AocmgsIG1lbSwgZmllbGQsICZjb3VudCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c2VnY291bnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJdWludDMyX3QgY291bnQgPSBkbV9saXN0X3NpemUoJmx2LT5zZWdtZW50cyk7CisKKwlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9zbmFwY291bnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGE7CisJdWludDMyX3QgY291bnQgPSBzbmFwc2hvdF9jb3VudCh2Zyk7CisKKwlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9zbnBlcmNlbnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWRtX3BlcmNlbnRfdCBwZXJjZW50ID0gbHZzZWdfcGVyY2VudF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMobHZkbSwgUEVSQ0VOVF9HRVRfREFUQSk7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQocmgsIGZpZWxkLCAmcGVyY2VudCk7Cit9CisKK3N0YXRpYyBpbnQgX2NvcHlwZXJjZW50X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0gPSAoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqKSBkYXRhOworCisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IGx2ZG0tPmx2OworCWRtX3BlcmNlbnRfdCBwZXJjZW50ID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCisJLyogVE9ETzoganVzdCBjYWNoZSBwYXNzZXMgdGhyb3VnaCBsdnNlZ19wZXJjZW50Li4uICovCisJaWYgKGx2X2lzX2NhY2hlKGx2KSB8fCBsdl9pc191c2VkX2NhY2hlX3Bvb2wobHYpKQorCQlwZXJjZW50ID0gbHZzZWdfcGVyY2VudF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMobHZkbSwgUEVSQ0VOVF9HRVRfRElSVFkpOworCWVsc2UgaWYgKCgobHZfaXNfcmFpZChsdikgJiYgIXNlZ19pc19hbnlfcmFpZDAoZmlyc3Rfc2VnKGx2KSkgJiYKKwkJICAgbHZfcmFpZF9wZXJjZW50KGx2LCAmcGVyY2VudCkpIHx8CisJCSAgKGx2X2lzX21pcnJvcihsdikgJiYKKwkJICAgbHZfbWlycm9yX3BlcmNlbnQobHYtPnZnLT5jbWQsIGx2LCAwLCAmcGVyY2VudCwgTlVMTCkpKSAmJgorCQkgKHBlcmNlbnQgIT0gRE1fUEVSQ0VOVF9JTlZBTElEKSkKKwkJcGVyY2VudCA9IGNvcHlfcGVyY2VudChsdik7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQocmgsIGZpZWxkLCAmcGVyY2VudCk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWRzeW5jYWN0aW9uX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmggX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJY2hhciAqc3luY19hY3Rpb247CisKKwlpZiAobHZfaXNfcmFpZChsdikgJiYgbHZfcmFpZF9zeW5jX2FjdGlvbihsdiwgJnN5bmNfYWN0aW9uKSkKKwkJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCBzeW5jX2FjdGlvbik7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9yYWlkbWlzbWF0Y2hjb3VudF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQl2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJdWludDY0X3QgbWlzbWF0Y2hfY291bnQ7CisKKwlpZiAobHZfaXNfcmFpZChsdikgJiYgbHZfcmFpZF9taXNtYXRjaF9jb3VudChsdiwgJm1pc21hdGNoX2NvdW50KSkKKwkJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50NjQocmgsIGZpZWxkLCAmbWlzbWF0Y2hfY291bnQpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzY0KSk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWR3cml0ZWJlaGluZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKworCWlmIChsdl9pc19yYWlkX3R5cGUobHYpICYmIGZpcnN0X3NlZyhsdiktPndyaXRlYmVoaW5kKQorCQlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3VpbnQzMihyaCwgZmllbGQsICZmaXJzdF9zZWcobHYpLT53cml0ZWJlaGluZCk7CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsICZHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShudW1fdW5kZWZfNjQpKTsKK30KKworc3RhdGljIGludCBfcmFpZG1pbnJlY292ZXJ5cmF0ZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisKKwlpZiAobHZfaXNfcmFpZF90eXBlKGx2KSAmJiBmaXJzdF9zZWcobHYpLT5taW5fcmVjb3ZlcnlfcmF0ZSkKKwkJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50MzIocmgsIGZpZWxkLAorCQkJCQkgICAgICAmZmlyc3Rfc2VnKGx2KS0+bWluX3JlY292ZXJ5X3JhdGUpOworCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICIiLCAmR0VUX1RZUEVfUkVTRVJWRURfVkFMVUUobnVtX3VuZGVmXzY0KSk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWRtYXhyZWNvdmVyeXJhdGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCisJaWYgKGx2X2lzX3JhaWRfdHlwZShsdikgJiYgZmlyc3Rfc2VnKGx2KS0+bWF4X3JlY292ZXJ5X3JhdGUpCisJCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDMyKHJoLCBmaWVsZCwKKwkJCQkJICAgICAgJmZpcnN0X3NlZyhsdiktPm1heF9yZWNvdmVyeV9yYXRlKTsKKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgJkdFVF9UWVBFX1JFU0VSVkVEX1ZBTFVFKG51bV91bmRlZl82NCkpOworfQorCitzdGF0aWMgaW50IF9kYXRhcGVyY2VudF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWRtX3BlcmNlbnRfdCBwZXJjZW50ID0gbHZzZWdfcGVyY2VudF93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMobHZkbSwgUEVSQ0VOVF9HRVRfREFUQSk7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQocmgsIGZpZWxkLCAmcGVyY2VudCk7Cit9CisKK3N0YXRpYyBpbnQgX21ldGFkYXRhcGVyY2VudF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKwlkbV9wZXJjZW50X3QgcGVyY2VudCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKworCWlmIChsdl9pc190aGluX3Bvb2wobHZkbS0+bHYpIHx8CisJICAgIGx2X2lzX3VzZWRfY2FjaGVfcG9vbChsdmRtLT5sdikpCisJCXBlcmNlbnQgPSBsdnNlZ19wZXJjZW50X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyhsdmRtLCBQRVJDRU5UX0dFVF9NRVRBREFUQSk7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQocmgsIGZpZWxkLCAmcGVyY2VudCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2bWV0YWRhdGFzaXplX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCXVpbnQ2NF90IHNpemU7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSB8fCBsdl9pc19jYWNoZV9wb29sKGx2KSkgeworCQlzaXplID0gbHZfbWV0YWRhdGFfc2l6ZShsdik7CisJCXJldHVybiBfc2l6ZTY0X2Rpc3AocmgsIG1lbSwgZmllbGQsICZzaXplLCBwcml2YXRlKTsKKwl9CisKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsICZHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShudW1fdW5kZWZfNjQpKTsKK30KKworc3RhdGljIGludCBfdGhpbmNvdW50X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICopIGRhdGE7CisJdWludDMyX3QgY291bnQ7CisKKwlpZiAoc2VnX2lzX3RoaW5fcG9vbChzZWcpKSB7CisJCWNvdW50ID0gZG1fbGlzdF9zaXplKCZzZWctPmx2LT5zZWdzX3VzaW5nX3RoaXNfbHYpOworCQlyZXR1cm4gX3VpbnQzMl9kaXNwKHJoLCBtZW0sIGZpZWxkLCAmY291bnQsIHByaXZhdGUpOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgJkdFVF9UWVBFX1JFU0VSVkVEX1ZBTFVFKG51bV91bmRlZl82NCkpOworfQorCitzdGF0aWMgaW50IF9sdnRpbWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKwl1aW50NjRfdCAqc29ydHZhbDsKKworCWlmICghKHJlcHN0ciA9IGx2X2NyZWF0aW9uX3RpbWVfZHVwKG1lbSwgbHYsIDApKSB8fAorCSAgICAhKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdGltZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSBsdl9pc19oaXN0b3JpY2FsKGx2KSA/IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+dGltZXN0YW1wIDogbHYtPnRpbWVzdGFtcDsKKwlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKK30KKworc3RhdGljIGludCBfbHZ0aW1lcmVtb3ZlZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwljaGFyICpyZXBzdHI7CisJdWludDY0X3QgKnNvcnR2YWw7CisKKwlpZiAoIShyZXBzdHIgPSBsdl9yZW1vdmFsX3RpbWVfZHVwKG1lbSwgbHYsIDApKSB8fAorCSAgICAhKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdGltZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSBsdl9pc19oaXN0b3JpY2FsKGx2KSA/IGx2LT50aGlzX2dsdi0+aGlzdG9yaWNhbC0+dGltZXN0YW1wX3JlbW92ZWQgOiAwOworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworfQorCitzdGF0aWMgaW50IF9sdmhvc3RfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGx2X2hvc3RfZHVwKG1lbSwgbHYpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGhvc3QuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIE5VTEwpOworfQorCisvKiBQVi9WRy9MViBBdHRyaWJ1dGVzICovCisKK3N0YXRpYyBpbnQgX3B2YWxsb2NhdGFibGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBhbGxvY2F0YWJsZSA9ICgoKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YSktPnN0YXR1cyAmIEFMTE9DQVRBQkxFX1BWKSAhPSAwOworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGFsbG9jYXRhYmxlLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShwdl9hbGxvY2F0YWJsZV95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2ZXhwb3J0ZWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBleHBvcnRlZCA9ICgoKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YSktPnN0YXR1cyAmIEVYUE9SVEVEX1ZHKSAhPSAwOworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGV4cG9ydGVkLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShwdl9leHBvcnRlZF95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2bWlzc2luZ19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBtaXNzaW5nID0gKCgoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBkYXRhKS0+c3RhdHVzICYgTUlTU0lOR19QVikgIT0gMDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBtaXNzaW5nLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShwdl9taXNzaW5nX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfcHZpbnVzZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYgPSAoY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCB1c2VkID0gaXNfdXNlZF9wdihwdik7CisKKwlpZiAodXNlZCA8IDApCisJCXJldHVybiBfYmluYXJ5X3VuZGVmX2Rpc3AocmgsIG1lbSwgZmllbGQsIHByaXZhdGUpOworCisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgdXNlZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUocHZfaW5fdXNlX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfcHZkdXBsaWNhdGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0gKGNvbnN0IHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKikgZGF0YTsKKwlpbnQgZHVwbGljYXRlID0gbHZtY2FjaGVfZGV2X2lzX3VuY2hvc2VuX2R1cGxpY2F0ZShwdi0+ZGV2KTsKKworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGR1cGxpY2F0ZSwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUocHZfZHVwbGljYXRlX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfdmdwZXJtaXNzaW9uc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3QgY2hhciAqcGVybXMgPSAoKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YSktPnN0YXR1cyAmIExWTV9XUklURSA/IEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKHZnX3Blcm1pc3Npb25zX3J3KQorCQkJCQkJCQkJCSAgICAgOiBHRVRfRklSU1RfUkVTRVJWRURfTkFNRSh2Z19wZXJtaXNzaW9uc19yKTsKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIHBlcm1zKTsKK30KKworc3RhdGljIGludCBfdmdleHRlbmRhYmxlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJaW50IGV4dGVuZGFibGUgPSAodmdfaXNfcmVzaXplYWJsZSgoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhKSkgIT0gMDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBleHRlbmRhYmxlLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRSh2Z19leHRlbmRhYmxlX3kpLHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF92Z2V4cG9ydGVkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpbnQgZXhwb3J0ZWQgPSAodmdfaXNfZXhwb3J0ZWQoKGNvbnN0IHN0cnVjdCB2b2x1bWVfZ3JvdXAgKikgZGF0YSkpICE9IDA7CisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgZXhwb3J0ZWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKHZnX2V4cG9ydGVkX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfdmdwYXJ0aWFsX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJaW50IHBhcnRpYWwgPSAodmdfbWlzc2luZ19wdl9jb3VudCgoY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqKSBkYXRhKSkgIT0gMDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwYXJ0aWFsLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRSh2Z19wYXJ0aWFsX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfdmdhbGxvY2F0aW9ucG9saWN5X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IGNoYXIgKmFsbG9jX3BvbGljeSA9IGdldF9hbGxvY19zdHJpbmcoKChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGEpLT5hbGxvYykgPyA6IF9zdHJfdW5rbm93bjsKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGFsbG9jX3BvbGljeSk7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2x1c3RlcmVkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBjbHVzdGVyZWQgPSAodmdfaXNfY2x1c3RlcmVkKChjb25zdCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICopIGRhdGEpKSAhPSAwOworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGNsdXN0ZXJlZCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUodmdfY2x1c3RlcmVkX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZsYXlvdXRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQljb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJc3RydWN0IGRtX2xpc3QgKmx2X2xheW91dDsKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZfcm9sZTsKKworCWlmICghbHZfbGF5b3V0X2FuZF9yb2xlKG1lbSwgbHYsICZsdl9sYXlvdXQsICZsdl9yb2xlKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkaXNwbGF5IGxheW91dCBmb3IgTFYgJXMvJXMuIiwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgbHZfbGF5b3V0LCBwcml2YXRlLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBfbHZyb2xlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZfbGF5b3V0OworCXN0cnVjdCBkbV9saXN0ICpsdl9yb2xlOworCisJaWYgKCFsdl9sYXlvdXRfYW5kX3JvbGUobWVtLCBsdiwgJmx2X2xheW91dCwgJmx2X3JvbGUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRpc3BsYXkgcm9sZSBmb3IgTFYgJXMvJXMuIiwgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfZmllbGRfc2V0X3N0cmluZ19saXN0KHJoLCBmaWVsZCwgbHZfcm9sZSwgcHJpdmF0ZSwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2aW5pdGlhbGltYWdlc3luY19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCBpbml0aWFsX2ltYWdlX3N5bmM7CisKKwlpZiAobHZfaXNfcmFpZChsdikgfHwgbHZfaXNfbWlycm9yZWQobHYpKQorCQlpbml0aWFsX2ltYWdlX3N5bmMgPSAhbHZfaXNfbm90X3N5bmNlZChsdik7CisJZWxzZQorCQlpbml0aWFsX2ltYWdlX3N5bmMgPSAwOworCisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgaW5pdGlhbF9pbWFnZV9zeW5jLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9pbml0aWFsX2ltYWdlX3N5bmNfeSksIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9sdmltYWdlc3luY2VkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCBpbWFnZV9zeW5jZWQ7CisKKwlpZiAobHZfaXNfcmFpZF9pbWFnZShsdikpCisJCWltYWdlX3N5bmNlZCA9ICFsdl9pc192aXNpYmxlKGx2KSAmJiBsdl9yYWlkX2ltYWdlX2luX3N5bmMobHYpOworCWVsc2UgaWYgKGx2X2lzX21pcnJvcl9pbWFnZShsdikpCisJCWltYWdlX3N5bmNlZCA9IGx2X21pcnJvcl9pbWFnZV9pbl9zeW5jKGx2KTsKKwllbHNlCisJCWltYWdlX3N5bmNlZCA9IDA7CisKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBpbWFnZV9zeW5jZWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X2ltYWdlX3N5bmNlZF95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2bWVyZ2luZ19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGE7CisJaW50IG1lcmdpbmc7CisKKwlpZiAobHZfaXNfb3JpZ2luKGx2KSB8fCBsdl9pc19leHRlcm5hbF9vcmlnaW4obHYpKQorCQltZXJnaW5nID0gbHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpOworCWVsc2UgaWYgKGx2X2lzX2NvdyhsdikpCisJCW1lcmdpbmcgPSBsdl9pc19tZXJnaW5nX2Nvdyhsdik7CisJZWxzZSBpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKQorCQltZXJnaW5nID0gbHZfaXNfbWVyZ2luZ190aGluX3NuYXBzaG90KGx2KTsKKwllbHNlCisJCW1lcmdpbmcgPSAwOworCisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgbWVyZ2luZywgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobHZfbWVyZ2luZ195KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydGluZ19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBjb252ZXJ0aW5nID0gbHZfaXNfY29udmVydGluZygoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGEpOworCisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgY29udmVydGluZywgImNvbnZlcnRpbmciLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZwZXJtaXNzaW9uc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisJY29uc3QgY2hhciAqcGVybXMgPSAiIjsKKworCWlmICghbHZfaXNfcHZtb3ZlKGx2ZG0tPmx2KSkgeworCQlpZiAobHZkbS0+bHYtPnN0YXR1cyAmIExWTV9XUklURSkgeworCQkJaWYgKCFsdmRtLT5pbmZvLmV4aXN0cykKKwkJCQlwZXJtcyA9IF9zdHJfdW5rbm93bjsKKwkJCWVsc2UgaWYgKGx2ZG0tPmluZm8ucmVhZF9vbmx5KQorCQkJCXBlcm1zID0gR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobHZfcGVybWlzc2lvbnNfcl9vdmVycmlkZSk7CisJCQllbHNlCisJCQkJcGVybXMgPSBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9wZXJtaXNzaW9uc19ydyk7CisJCX0gZWxzZSBpZiAobHZkbS0+bHYtPnN0YXR1cyAmIExWTV9SRUFEKQorCQkJcGVybXMgPSBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9wZXJtaXNzaW9uc19yKTsKKwkJZWxzZQorCQkJcGVybXMgPSBfc3RyX3Vua25vd247CisJfQorCisJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCBwZXJtcyk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWxsb2NhdGlvbnBvbGljeV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBjaGFyICphbGxvY19wb2xpY3kgPSBnZXRfYWxsb2Nfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGEpLT5hbGxvYykgPyA6IF9zdHJfdW5rbm93bjsKKwlyZXR1cm4gX2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIGFsbG9jX3BvbGljeSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWxsb2NhdGlvbmxvY2tlZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpbnQgYWxsb2NfbG9ja2VkID0gKCgoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGEpLT5zdGF0dXMgJiBMT0NLRUQpICE9IDA7CisKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBhbGxvY19sb2NrZWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X2FsbG9jYXRpb25fbG9ja2VkX3kpLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZmaXhlZG1pbm9yX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJaW50IGZpeGVkX21pbm9yID0gKCgoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGEpLT5zdGF0dXMgJiBGSVhFRF9NSU5PUikgIT0gMDsKKworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGZpeGVkX21pbm9yLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9maXhlZF9taW5vcl95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWN0aXZlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGx2X2FjdGl2ZV9kdXAobWVtLCAoY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIGRhdGEpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGFjdGl2ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWN0aXZlbG9jYWxseV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCBhY3RpdmVfbG9jYWxseTsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKKworCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSkgeworCQlsdiA9IGx2X2xvY2tfaG9sZGVyKGx2KTsKKwkJYWN0aXZlX2xvY2FsbHkgPSBsdl9pc19hY3RpdmVfbG9jYWxseShsdik7CisJfSBlbHNlCisJCWFjdGl2ZV9sb2NhbGx5ID0gbHZfaXNfYWN0aXZlKGx2KTsKKworCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGFjdGl2ZV9sb2NhbGx5LCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9hY3RpdmVfbG9jYWxseV95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWN0aXZlcmVtb3RlbHlfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCBhY3RpdmVfcmVtb3RlbHk7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIF9iaW5hcnlfdW5kZWZfZGlzcChyaCwgbWVtLCBmaWVsZCwgcHJpdmF0ZSk7CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpIHsKKwkJbHYgPSBsdl9sb2NrX2hvbGRlcihsdik7CisJCS8qIEZJWE1FOiBJdCBzZWVtcyB3ZSBoYXZlIG5vIHdheSB0byBnZXQgdGhpcyBpbmZvIGNvcnJlY3RseQorCQkgKiAJICB3aXRoIGN1cnJlbnQgaW50ZXJmYWNlIC0gd2UnZCBuZWVkIHRvIGNoZWNrIG51bWJlcgorCQkgKiAJICBvZiByZXNwb25zZXMgZnJvbSB0aGUgY2x1c3RlcjoKKwkJICogCSAgICAtIGlmIG51bWJlciBvZiBub2RlcyB0aGF0IHJlc3BvbmRlZCA9PSAxCisJCSAqIAkgICAgLSBhbmQgTFYgaXMgYWN0aXZlIG9uIGxvY2FsIG5vZGUKKwkJICogCSAgLi50aGVuIHdlIG1heSBzYXkgdGhhdCBMViBpcyAqbm90KiBhY3RpdmUgcmVtb3RlbHkuCisJCSAqCisJCSAqIAkgIE90aGVyd2lzZSAoKHJlc3BvbnNlcyA+IDEgJiYgTFYgYWN0aXZlIGxvY2FsbHkpIHx8CisJCSAqIAkgIChyZXNwb25zZXMgPT0gMSAmJiBMViBub3QgYWN0aXZlIGxvY2FsbHkpKSwgaXQncworCQkgKiAJICBhY3RpdmUgcmVtb3RlbHkuCisJCSAqCisJCSAqIAkgIFdlIGhhdmUgdGhpcyBpbmZvLCBidXQgaGlkZGVuIHVuZGVybmVhdGggdGhlCisJCSAqIAkgIGxvY2tpbmcgaW50ZXJmYWNlIChsb2NraW5nX3R5cGUucXVlcnlfcmVzb3VyY2UgZm4pLgorCQkgKgorCQkgKiAJICBGb3Igbm93LCBsZXQncyB1c2UgJ3Vua25vd24nIGZvciByZW1vdGUgc3RhdHVzIGlmCisJCSAqIAkgIHRoZSBMViBpcyBmb3VuZCBhY3RpdmUgbG9jYWxseSB1bnRpbCB3ZSBmaW5kIGEgd2F5IHRvCisJCSAqIAkgIHNtdWdnbGUgdGhlIHByb3BlciBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIGludGVyZmFjZS4KKwkJICovCisJCWlmIChsdl9pc19hY3RpdmVfbG9jYWxseShsdikpCisJCQlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKKwkJZWxzZQorCQkJYWN0aXZlX3JlbW90ZWx5ID0gbHZfaXNfYWN0aXZlX2J1dF9ub3RfbG9jYWxseShsdik7CisJfSBlbHNlCisJCWFjdGl2ZV9yZW1vdGVseSA9IDA7CisKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBhY3RpdmVfcmVtb3RlbHksIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X2FjdGl2ZV9yZW1vdGVseV95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2YWN0aXZlZXhjbHVzaXZlbHlfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWludCBhY3RpdmVfZXhjbHVzaXZlbHk7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIF9iaW5hcnlfdW5kZWZfZGlzcChyaCwgbWVtLCBmaWVsZCwgcHJpdmF0ZSk7CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpIHsKKwkJbHYgPSBsdl9sb2NrX2hvbGRlcihsdik7CisJCWFjdGl2ZV9leGNsdXNpdmVseSA9IGx2X2lzX2FjdGl2ZV9leGNsdXNpdmUobHYpOworCX0gZWxzZQorCQlhY3RpdmVfZXhjbHVzaXZlbHkgPSBsdl9pc19hY3RpdmUobHYpOworCisJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgYWN0aXZlX2V4Y2x1c2l2ZWx5LCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9hY3RpdmVfZXhjbHVzaXZlbHlfeSksIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9sdm1lcmdlZmFpbGVkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWRtX3BlcmNlbnRfdCBzbmFwX3BlcmNlbnQ7CisJaW50IG1lcmdlX2ZhaWxlZDsKKworCWlmICghbHZfaXNfY293KGx2KSB8fCAhbHZfc25hcHNob3RfcGVyY2VudChsdiwgJnNuYXBfcGVyY2VudCkpCisJCXJldHVybiBfYmluYXJ5X3VuZGVmX2Rpc3AocmgsIG1lbSwgZmllbGQsIHByaXZhdGUpOworCisJbWVyZ2VfZmFpbGVkID0gc25hcF9wZXJjZW50ID09IExWTV9QRVJDRU5UX01FUkdFX0ZBSUxFRDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBtZXJnZV9mYWlsZWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X21lcmdlX2ZhaWxlZF95KSwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c25hcHNob3RpbnZhbGlkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2ID0gKGNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSBkYXRhOworCWRtX3BlcmNlbnRfdCBzbmFwX3BlcmNlbnQ7CisJaW50IHNuYXBfaW52YWxpZDsKKworCWlmICghbHZfaXNfY293KGx2KSkKKwkJcmV0dXJuIF9iaW5hcnlfdW5kZWZfZGlzcChyaCwgbWVtLCBmaWVsZCwgcHJpdmF0ZSk7CisKKwlzbmFwX2ludmFsaWQgPSAhbHZfc25hcHNob3RfcGVyY2VudChsdiwgJnNuYXBfcGVyY2VudCkgfHwgc25hcF9wZXJjZW50ID09IERNX1BFUkNFTlRfSU5WQUxJRDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBzbmFwX2ludmFsaWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X3NuYXBzaG90X2ludmFsaWRfeSksIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9sdnN1c3BlbmRlZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWlmIChsdmRtLT5pbmZvLmV4aXN0cykKKwkJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgbHZkbS0+aW5mby5zdXNwZW5kZWQsIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X3N1c3BlbmRlZF95KSwgcHJpdmF0ZSk7CisKKwlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZsaXZldGFibGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisKKwlpZiAobHZkbS0+aW5mby5leGlzdHMpCisJCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGx2ZG0tPmluZm8ubGl2ZV90YWJsZSwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobHZfbGl2ZV90YWJsZV95KSwgcHJpdmF0ZSk7CisKKwlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZpbmFjdGl2ZXRhYmxlX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0gPSAoY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqKSBkYXRhOworCisJaWYgKGx2ZG0tPmluZm8uZXhpc3RzKQorCQlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBsdmRtLT5pbmZvLmluYWN0aXZlX3RhYmxlLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9pbmFjdGl2ZV90YWJsZV95KSwgcHJpdmF0ZSk7CisKKwlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZkZXZpY2VvcGVuX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisKKwlpZiAobHZkbS0+aW5mby5leGlzdHMpCisJCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIGx2ZG0tPmluZm8ub3Blbl9jb3VudCwgR0VUX0ZJUlNUX1JFU0VSVkVEX05BTUUobHZfZGV2aWNlX29wZW5feSksIHByaXZhdGUpOworCisJcmV0dXJuIF9iaW5hcnlfdW5kZWZfZGlzcChyaCwgbWVtLCBmaWVsZCwgcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW56ZXJvX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKSBkYXRhOworCisJaWYgKHNlZ19pc190aGluX3ZvbHVtZShzZWcpKQorCQlzZWcgPSBmaXJzdF9zZWcoc2VnLT5wb29sX2x2KTsKKworCWlmIChzZWdfaXNfdGhpbl9wb29sKHNlZykpCisJCXJldHVybiBfYmluYXJ5X2Rpc3AocmgsIG1lbSwgZmllbGQsIHNlZy0+emVyb19uZXdfYmxvY2tzLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRSh6ZXJvX3kpLCBwcml2YXRlKTsKKworCXJldHVybiBfYmluYXJ5X3VuZGVmX2Rpc3AocmgsIG1lbSwgZmllbGQsIHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IF9sdmhlYWx0aHN0YXR1c19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqbHZkbSA9IChjb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICopIGRhdGE7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IGx2ZG0tPmx2OworCWNvbnN0IGNoYXIgKmhlYWx0aCA9ICIiOworCXVpbnQ2NF90IG47CisKKwlpZiAobHZfaXNfcGFydGlhbChsdikpCisJCWhlYWx0aCA9ICJwYXJ0aWFsIjsKKwllbHNlIGlmIChsdl9pc19yYWlkX3R5cGUobHYpKSB7CisJCWlmICghYWN0aXZhdGlvbigpKQorCQkJaGVhbHRoID0gInVua25vd24iOworCQllbHNlIGlmICghbHZfcmFpZF9oZWFsdGh5KGx2KSkKKwkJCWhlYWx0aCA9ICJyZWZyZXNoIG5lZWRlZCI7CisJCWVsc2UgaWYgKGx2X2lzX3JhaWQobHYpKSB7CisJCQlpZiAobHZfcmFpZF9taXNtYXRjaF9jb3VudChsdiwgJm4pICYmIG4pCisJCQkJaGVhbHRoID0gIm1pc21hdGNoZXMgZXhpc3QiOworCQl9IGVsc2UgaWYgKGx2LT5zdGF0dXMgJiBMVl9XUklURU1PU1RMWSkKKwkJCWhlYWx0aCA9ICJ3cml0ZW1vc3RseSI7CisJfSBlbHNlIGlmIChsdl9pc19jYWNoZShsdikgJiYgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX05PTkUpKSB7CisJCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgIT0gU0VHX1NUQVRVU19DQUNIRSkKKwkJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShoZWFsdGhfdW5kZWYpLAorCQkJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGhlYWx0aF91bmRlZikpOworCQllbHNlIGlmIChsdmRtLT5zZWdfc3RhdHVzLmNhY2hlLT5mYWlsKQorCQkJaGVhbHRoID0gImZhaWxlZCI7CisJCWVsc2UgaWYgKGx2ZG0tPnNlZ19zdGF0dXMuY2FjaGUtPnJlYWRfb25seSkKKwkJCWhlYWx0aCA9ICJtZXRhZGF0YV9yZWFkX29ubHkiOworCX0gZWxzZSBpZiAobHZfaXNfdGhpbl9wb29sKGx2KSAmJiAobHZkbS0+c2VnX3N0YXR1cy50eXBlICE9IFNFR19TVEFUVVNfTk9ORSkpIHsKKwkJaWYgKGx2ZG0tPnNlZ19zdGF0dXMudHlwZSAhPSBTRUdfU1RBVFVTX1RISU5fUE9PTCkKKwkJCXJldHVybiBfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShoZWFsdGhfdW5kZWYpLAorCQkJCQkJR0VUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGhlYWx0aF91bmRlZikpOworCQllbHNlIGlmIChsdmRtLT5zZWdfc3RhdHVzLnRoaW5fcG9vbC0+ZmFpbCkKKwkJCWhlYWx0aCA9ICJmYWlsZWQiOworCQllbHNlIGlmIChsdmRtLT5zZWdfc3RhdHVzLnRoaW5fcG9vbC0+b3V0X29mX2RhdGFfc3BhY2UpCisJCQloZWFsdGggPSAib3V0X29mX2RhdGEiOworCQllbHNlIGlmIChsdmRtLT5zZWdfc3RhdHVzLnRoaW5fcG9vbC0+cmVhZF9vbmx5KQorCQkJaGVhbHRoID0gIm1ldGFkYXRhX3JlYWRfb25seSI7CisJfQorCisJcmV0dXJuIF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCBoZWFsdGgpOworfQorCitzdGF0aWMgaW50IF9sdmNoZWNrbmVlZGVkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsKKworCWlmIChsdl9pc190aGluX3Bvb2wobHZkbS0+bHYpICYmIGx2ZG0tPnNlZ19zdGF0dXMudHlwZSA9PSBTRUdfU1RBVFVTX1RISU5fUE9PTCkKKwkJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgbHZkbS0+c2VnX3N0YXR1cy50aGluX3Bvb2wtPm5lZWRzX2NoZWNrLAorCQkJCSAgICBHRVRfRklSU1RfUkVTRVJWRURfTkFNRShsdl9jaGVja19uZWVkZWRfeSksIHByaXZhdGUpOworCisJaWYgKGx2X2lzX2NhY2hlKGx2ZG0tPmx2KSAmJiBsdmRtLT5zZWdfc3RhdHVzLnR5cGUgPT0gU0VHX1NUQVRVU19DQUNIRSkKKwkJcmV0dXJuIF9iaW5hcnlfZGlzcChyaCwgbWVtLCBmaWVsZCwgbHZkbS0+c2VnX3N0YXR1cy5jYWNoZS0+bmVlZHNfY2hlY2ssCisJCQkJICAgIEdFVF9GSVJTVF9SRVNFUlZFRF9OQU1FKGx2X2NoZWNrX25lZWRlZF95KSwgcHJpdmF0ZSk7CisKKwlyZXR1cm4gX2JpbmFyeV91bmRlZl9kaXNwKHJoLCBtZW0sIGZpZWxkLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZza2lwYWN0aXZhdGlvbl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWludCBza2lwX2FjdGl2YXRpb24gPSAoKChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YSktPnN0YXR1cyAmIExWX0FDVElWQVRJT05fU0tJUCkgIT0gMDsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBza2lwX2FjdGl2YXRpb24sICJza2lwIGFjdGl2YXRpb24iLCBwcml2YXRlKTsKK30KKworc3RhdGljIGludCBfbHZoaXN0b3JpY2FsX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiA9IChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikgZGF0YTsKKwlyZXR1cm4gX2JpbmFyeV9kaXNwKHJoLCBtZW0sIGZpZWxkLCBsdl9pc19oaXN0b3JpY2FsKGx2KSwgImhpc3RvcmljYWwiLCBwcml2YXRlKTsKK30KKworLyoKKyAqIE1hY3JvIHRvIGdlbmVyYXRlICdfY2FjaGVfPGNhY2hlX3N0YXR1c19maWVsZF9uYW1lPl9kaXNwJyByZXBvcnRpbmcgZnVuY3Rpb24uCisgKiBUaGUgJ2NhY2hlX3N0YXR1c19maWVsZF9uYW1lJyBpcyBmaWVsZCBuYW1lIGZyb20gc3RydWN0IGRtX2NhY2hlX3N0YXR1cy4KKyAqLworI2RlZmluZSBHRU5FUkFURV9DQUNIRV9TVEFUVVNfRElTUF9GTihjYWNoZV9zdGF0dXNfZmllbGRfbmFtZSkgXAorc3RhdGljIGludCBfY2FjaGVfICMjIGNhY2hlX3N0YXR1c19maWVsZF9uYW1lICMjIF9kaXNwIChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgXAorCQkJCQkJCXN0cnVjdCBkbV9wb29sICptZW0sIFwKKwkJCQkJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgXAorCQkJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIFwKKwkJCQkJCQl2b2lkICpwcml2YXRlKSBcCit7IFwKKwljb25zdCBzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpsdmRtID0gKGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKikgZGF0YTsgXAorCWlmIChsdmRtLT5zZWdfc3RhdHVzLnR5cGUgIT0gU0VHX1NUQVRVU19DQUNIRSkgXAorCQlyZXR1cm4gX2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIiIsICZHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShudW1fdW5kZWZfNjQpKTsgXAorCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDY0KHJoLCBmaWVsZCwgJmx2ZG0tPnNlZ19zdGF0dXMuY2FjaGUtPmNhY2hlX3N0YXR1c19maWVsZF9uYW1lKTsgXAorfQorCitHRU5FUkFURV9DQUNIRV9TVEFUVVNfRElTUF9GTih0b3RhbF9ibG9ja3MpCitHRU5FUkFURV9DQUNIRV9TVEFUVVNfRElTUF9GTih1c2VkX2Jsb2NrcykKK0dFTkVSQVRFX0NBQ0hFX1NUQVRVU19ESVNQX0ZOKGRpcnR5X2Jsb2NrcykKK0dFTkVSQVRFX0NBQ0hFX1NUQVRVU19ESVNQX0ZOKHJlYWRfaGl0cykKK0dFTkVSQVRFX0NBQ0hFX1NUQVRVU19ESVNQX0ZOKHJlYWRfbWlzc2VzKQorR0VORVJBVEVfQ0FDSEVfU1RBVFVTX0RJU1BfRk4od3JpdGVfaGl0cykKK0dFTkVSQVRFX0NBQ0hFX1NUQVRVU19ESVNQX0ZOKHdyaXRlX21pc3NlcykKKworLyogUmVwb3J0IG9iamVjdCB0eXBlcyAqLworCisvKiBuZWNlc3NhcnkgZm9yIGRpc3BsYXlpbmcgc29tZXRoaW5nIGZvciBQVnMgbm90IGJlbG9uZ2luZyB0byBWRyAqLworc3RhdGljIHN0cnVjdCBmb3JtYXRfaW5zdGFuY2UgX2R1bW15X2ZpZCA9IHsKKwkubWV0YWRhdGFfYXJlYXNfaW5fdXNlID0gRE1fTElTVF9IRUFEX0lOSVQoX2R1bW15X2ZpZC5tZXRhZGF0YV9hcmVhc19pbl91c2UpLAorCS5tZXRhZGF0YV9hcmVhc19pZ25vcmVkID0gRE1fTElTVF9IRUFEX0lOSVQoX2R1bW15X2ZpZC5tZXRhZGF0YV9hcmVhc19pZ25vcmVkKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIF9kdW1teV92ZyA9IHsKKwkuZmlkID0gJl9kdW1teV9maWQsCisJLm5hbWUgPSAiIiwKKwkuc3lzdGVtX2lkID0gKGNoYXIgKikgIiIsCisJLmx2bTFfc3lzdGVtX2lkID0gKGNoYXIgKikgIiIsCisJLnB2cyA9IERNX0xJU1RfSEVBRF9JTklUKF9kdW1teV92Zy5wdnMpLAorCS5sdnMgPSBETV9MSVNUX0hFQURfSU5JVChfZHVtbXlfdmcubHZzKSwKKwkuaGlzdG9yaWNhbF9sdnMgPSBETV9MSVNUX0hFQURfSU5JVChfZHVtbXlfdmcuaGlzdG9yaWNhbF9sdnMpLAorCS50YWdzID0gRE1fTElTVF9IRUFEX0lOSVQoX2R1bW15X3ZnLnRhZ3MpLAorfTsKKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgX3Vua25vd25fdmcgPSB7CisJLmZpZCA9ICZfZHVtbXlfZmlkLAorCS5uYW1lID0gIlt1bmtub3duXSIsCisJLnN5c3RlbV9pZCA9IChjaGFyICopICIiLAorCS5sdm0xX3N5c3RlbV9pZCA9IChjaGFyICopICIiLAorCS5wdnMgPSBETV9MSVNUX0hFQURfSU5JVChfdW5rbm93bl92Zy5wdnMpLAorCS5sdnMgPSBETV9MSVNUX0hFQURfSU5JVChfdW5rbm93bl92Zy5sdnMpLAorCS5oaXN0b3JpY2FsX2x2cyA9IERNX0xJU1RfSEVBRF9JTklUKF91bmtub3duX3ZnLmhpc3RvcmljYWxfbHZzKSwKKwkudGFncyA9IERNX0xJU1RfSEVBRF9JTklUKF91bmtub3duX3ZnLnRhZ3MpLAorfTsKKworc3RhdGljIHZvaWQgKl9vYmpfZ2V0X3ZnKHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9ICgoc3RydWN0IGx2bV9yZXBvcnRfb2JqZWN0ICopb2JqKS0+dmc7CisKKwlyZXR1cm4gdmcgPyB2ZyA6ICZfZHVtbXlfdmc7Cit9CisKK3N0YXRpYyB2b2lkICpfb2JqX2dldF9sdih2b2lkICpvYmopCit7CisJcmV0dXJuIChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikoKHN0cnVjdCBsdm1fcmVwb3J0X29iamVjdCAqKW9iaiktPmx2ZG0tPmx2OworfQorCitzdGF0aWMgdm9pZCAqX29ial9nZXRfbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzKHZvaWQgKm9iaikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgbHZtX3JlcG9ydF9vYmplY3QgKilvYmopLT5sdmRtOworfQorCitzdGF0aWMgdm9pZCAqX29ial9nZXRfcHYodm9pZCAqb2JqKQoreworCXJldHVybiAoKHN0cnVjdCBsdm1fcmVwb3J0X29iamVjdCAqKW9iaiktPnB2OworfQorCitzdGF0aWMgdm9pZCAqX29ial9nZXRfbGFiZWwodm9pZCAqb2JqKQoreworCXJldHVybiAoKHN0cnVjdCBsdm1fcmVwb3J0X29iamVjdCAqKW9iaiktPmxhYmVsOworfQorCitzdGF0aWMgdm9pZCAqX29ial9nZXRfc2VnKHZvaWQgKm9iaikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgbHZtX3JlcG9ydF9vYmplY3QgKilvYmopLT5zZWc7Cit9CisKK3N0YXRpYyB2b2lkICpfb2JqX2dldF9wdnNlZyh2b2lkICpvYmopCit7CisJcmV0dXJuICgoc3RydWN0IGx2bV9yZXBvcnRfb2JqZWN0ICopb2JqKS0+cHZzZWc7Cit9CisKK3N0YXRpYyB2b2lkICpfb2JqX2dldF9kZXZ0eXBlcyh2b2lkICpvYmopCit7CisJcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQgKl9vYmpfZ2V0X2NtZGxvZyh2b2lkICpvYmopCit7CisJcmV0dXJuIG9iajsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgX2xvZ19yZXBvcnRfdHlwZXNbXSA9IHsKKwl7IENNRExPRywgIkNvbW1hbmQgTG9nIiwgImxvZ18iLCBfb2JqX2dldF9jbWRsb2cgfSwKKwl7IDAsICIiLCAiIiwgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgX3JlcG9ydF90eXBlc1tdID0geworCXsgVkdTLCAiVm9sdW1lIEdyb3VwIiwgInZnXyIsIF9vYmpfZ2V0X3ZnIH0sCisJeyBMVlMsICJMb2dpY2FsIFZvbHVtZSIsICJsdl8iLCBfb2JqX2dldF9sdiB9LAorCXsgTFZTSU5GTywgIkxvZ2ljYWwgVm9sdW1lIERldmljZSBJbmZvIiwgImx2XyIsIF9vYmpfZ2V0X2x2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyB9LAorCXsgTFZTU1RBVFVTLCAiTG9naWNhbCBWb2x1bWUgRGV2aWNlIFN0YXR1cyIsICJsdl8iLCBfb2JqX2dldF9sdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgfSwKKwl7IExWU0lORk9TVEFUVVMsICJMb2dpY2FsIFZvbHVtZSBEZXZpY2UgSW5mbyBhbmQgU3RhdHVzIENvbWJpbmVkIiwgImx2XyIsIF9vYmpfZ2V0X2x2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyB9LAorCXsgUFZTLCAiUGh5c2ljYWwgVm9sdW1lIiwgInB2XyIsIF9vYmpfZ2V0X3B2IH0sCisJeyBMQUJFTCwgIlBoeXNpY2FsIFZvbHVtZSBMYWJlbCIsICJwdl8iLCBfb2JqX2dldF9sYWJlbCB9LAorCXsgU0VHUywgIkxvZ2ljYWwgVm9sdW1lIFNlZ21lbnQiLCAic2VnXyIsIF9vYmpfZ2V0X3NlZyB9LAorCXsgUFZTRUdTLCAiUGh5c2ljYWwgVm9sdW1lIFNlZ21lbnQiLCAicHZzZWdfIiwgX29ial9nZXRfcHZzZWcgfSwKKwl7IDAsICIiLCAiIiwgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgX2RldnR5cGVzX3JlcG9ydF90eXBlc1tdID0geworCXsgREVWVFlQRVMsICJEZXZpY2UgVHlwZXMiLCAiZGV2dHlwZV8iLCBfb2JqX2dldF9kZXZ0eXBlcyB9LAorCXsgMCwgIiIsICIiLCBOVUxMIH0sCit9OworCisvKgorICogSW1wb3J0IGNvbHVtbiBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgU1RSIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORworI2RlZmluZSBOVU0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSCisjZGVmaW5lIEJJTiBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIKKyNkZWZpbmUgU0laIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUKKyNkZWZpbmUgUENUIERNX1JFUE9SVF9GSUVMRF9UWVBFX1BFUkNFTlQKKyNkZWZpbmUgVElNIERNX1JFUE9SVF9GSUVMRF9UWVBFX1RJTUUKKyNkZWZpbmUgU1RSX0xJU1QgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1QKKyNkZWZpbmUgU05VTSBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIKKyNkZWZpbmUgRklFTEQodHlwZSwgc3RyY3QsIHNvcnR0eXBlLCBoZWFkLCBmaWVsZCwgd2lkdGgsIGZ1bmMsIGlkLCBkZXNjLCB3cml0ZWFibGUpIFwKKwl7dHlwZSwgc29ydHR5cGUsIG9mZnNldG9mKHR5cGVfICMjIHN0cmN0LCBmaWVsZCksIHdpZHRoID8gOiBzaXplb2YoaGVhZCkgLSAxLCBcCisJICNpZCwgaGVhZCwgJl8gIyMgZnVuYyAjIyBfZGlzcCwgZGVzY30sCisKK3R5cGVkZWYgc3RydWN0IGNtZF9sb2dfaXRlbSB0eXBlX2NtZF9sb2dfaXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lIHR5cGVfcHY7Cit0eXBlZGVmIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSB0eXBlX2x2OwordHlwZWRlZiBzdHJ1Y3Qgdm9sdW1lX2dyb3VwIHR5cGVfdmc7Cit0eXBlZGVmIHN0cnVjdCBsdl9zZWdtZW50IHR5cGVfc2VnOwordHlwZWRlZiBzdHJ1Y3QgcHZfc2VnbWVudCB0eXBlX3B2c2VnOwordHlwZWRlZiBzdHJ1Y3QgbGFiZWwgdHlwZV9sYWJlbDsKKwordHlwZWRlZiBkZXZfa25vd25fdHlwZV90IHR5cGVfZGV2dHlwZTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSBfZmllbGRzW10gPSB7CisjaW5jbHVkZSAiY29sdW1ucy5oIgorezAsIDAsIDAsIDAsICIiLCAiIiwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlIF9kZXZ0eXBlc19maWVsZHNbXSA9IHsKKyNpbmNsdWRlICJjb2x1bW5zLWRldnR5cGVzLmgiCit7MCwgMCwgMCwgMCwgIiIsICIiLCBOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgX2xvZ19maWVsZHNbXSA9IHsKKyNpbmNsdWRlICJjb2x1bW5zLWNtZGxvZy5oIgorezAsIDAsIDAsIDAsICIiLCAiIiwgTlVMTCwgTlVMTH0sCit9OworCisjdW5kZWYgU1RSCisjdW5kZWYgTlVNCisjdW5kZWYgQklOCisjdW5kZWYgU0laCisjdW5kZWYgU1RSX0xJU1QKKyN1bmRlZiBTTlVNCisjdW5kZWYgRklFTEQKKwordm9pZCAqcmVwb3J0X2luaXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3QgY2hhciAqa2V5cywKKwkJICByZXBvcnRfdHlwZV90ICpyZXBvcnRfdHlwZSwgY29uc3QgY2hhciAqc2VwYXJhdG9yLAorCQkgIGludCBhbGlnbmVkLCBpbnQgYnVmZmVyZWQsIGludCBoZWFkaW5ncywgaW50IGZpZWxkX3ByZWZpeGVzLAorCQkgIGludCBxdW90ZWQsIGludCBjb2x1bW5zX2FzX3Jvd3MsIGNvbnN0IGNoYXIgKnNlbGVjdGlvbiwKKwkJICBpbnQgbXVsdGlwbGVfb3V0cHV0KQoreworCXVpbnQzMl90IHJlcG9ydF9mbGFncyA9IDA7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSAqdHlwZXM7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHM7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSAqcmVzZXJ2ZWRfdmFsdWVzOworCXZvaWQgKnJoOworCisJaWYgKGFsaWduZWQpCisJCXJlcG9ydF9mbGFncyB8PSBETV9SRVBPUlRfT1VUUFVUX0FMSUdORUQ7CisKKwlpZiAoYnVmZmVyZWQpCisJCXJlcG9ydF9mbGFncyB8PSBETV9SRVBPUlRfT1VUUFVUX0JVRkZFUkVEOworCisJaWYgKGhlYWRpbmdzKQorCQlyZXBvcnRfZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9IRUFESU5HUzsKKworCWlmIChmaWVsZF9wcmVmaXhlcykKKwkJcmVwb3J0X2ZsYWdzIHw9IERNX1JFUE9SVF9PVVRQVVRfRklFTERfTkFNRV9QUkVGSVg7CisKKwlpZiAoIXF1b3RlZCkKKwkJcmVwb3J0X2ZsYWdzIHw9IERNX1JFUE9SVF9PVVRQVVRfRklFTERfVU5RVU9URUQ7CisKKwlpZiAoY29sdW1uc19hc19yb3dzKQorCQlyZXBvcnRfZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9DT0xVTU5TX0FTX1JPV1M7CisKKwlpZiAobXVsdGlwbGVfb3V0cHV0KQorCQlyZXBvcnRfZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9NVUxUSVBMRV9USU1FUzsKKworCWlmICgqcmVwb3J0X3R5cGUgJiBDTURMT0cpIHsKKwkJdHlwZXMgPSBfbG9nX3JlcG9ydF90eXBlczsKKwkJZmllbGRzID0gX2xvZ19maWVsZHM7CisJCXJlc2VydmVkX3ZhbHVlcyA9IE5VTEw7CisJfSBlbHNlIGlmICgqcmVwb3J0X3R5cGUgJiBERVZUWVBFUykgeworCQl0eXBlcyA9IF9kZXZ0eXBlc19yZXBvcnRfdHlwZXM7CisJCWZpZWxkcyA9IF9kZXZ0eXBlc19maWVsZHM7CisJCXJlc2VydmVkX3ZhbHVlcyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJdHlwZXMgPSBfcmVwb3J0X3R5cGVzOworCQlmaWVsZHMgPSBfZmllbGRzOworCQlyZXNlcnZlZF92YWx1ZXMgPSBfcmVwb3J0X3Jlc2VydmVkX3ZhbHVlczsKKwl9CisKKwlyaCA9IGRtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uKHJlcG9ydF90eXBlLCB0eXBlcywgZmllbGRzLAorCQlmb3JtYXQsIHNlcGFyYXRvciwgcmVwb3J0X2ZsYWdzLCBrZXlzLAorCQlzZWxlY3Rpb24sIHJlc2VydmVkX3ZhbHVlcywgY21kKTsKKworCWlmIChyaCAmJiBmaWVsZF9wcmVmaXhlcykKKwkJZG1fcmVwb3J0X3NldF9vdXRwdXRfZmllbGRfbmFtZV9wcmVmaXgocmgsICJsdm0yXyIpOworCisJcmV0dXJuIHJoOworfQorCit2b2lkICpyZXBvcnRfaW5pdF9mb3Jfc2VsZWN0aW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCXJlcG9ydF90eXBlX3QgKnJlcG9ydF90eXBlLAorCQkJCWNvbnN0IGNoYXIgKnNlbGVjdGlvbl9jcml0ZXJpYSkKK3sKKwlyZXR1cm4gZG1fcmVwb3J0X2luaXRfd2l0aF9zZWxlY3Rpb24ocmVwb3J0X3R5cGUsIF9yZXBvcnRfdHlwZXMsIF9maWVsZHMsCisJCQkJCSAgICAgIiIsIERFRkFVTFRfUkVQX1NFUEFSQVRPUiwKKwkJCQkJICAgICBETV9SRVBPUlRfT1VUUFVUX0ZJRUxEX1VOUVVPVEVELAorCQkJCQkgICAgICIiLCBzZWxlY3Rpb25fY3JpdGVyaWEsCisJCQkJCSAgICAgX3JlcG9ydF9yZXNlcnZlZF92YWx1ZXMsCisJCQkJCSAgICAgY21kKTsKK30KKworaW50IHJlcG9ydF9nZXRfcHJlZml4X2FuZF9kZXNjKHJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGVfaWQsCisJCQkgICAgICAgY29uc3QgY2hhciAqKnJlcG9ydF9wcmVmaXgsCisJCQkgICAgICAgY29uc3QgY2hhciAqKnJlcG9ydF9kZXNjKQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKnJlcG9ydF90eXBlcywgKnJlcG9ydF90eXBlOworCisJaWYgKHJlcG9ydF90eXBlX2lkICYgQ01ETE9HKQorCQlyZXBvcnRfdHlwZXMgPSBfbG9nX3JlcG9ydF90eXBlczsKKwllbHNlIGlmIChyZXBvcnRfdHlwZV9pZCAmIERFVlRZUEVTKQorCQlyZXBvcnRfdHlwZXMgPSBfZGV2dHlwZXNfcmVwb3J0X3R5cGVzOworCWVsc2UKKwkJcmVwb3J0X3R5cGVzID0gX3JlcG9ydF90eXBlczsKKworCWZvciAocmVwb3J0X3R5cGUgPSByZXBvcnRfdHlwZXM7IHJlcG9ydF90eXBlLT5pZDsgcmVwb3J0X3R5cGUrKykgeworCQlpZiAocmVwb3J0X3R5cGVfaWQgJiByZXBvcnRfdHlwZS0+aWQpIHsKKwkJCSpyZXBvcnRfcHJlZml4ID0gcmVwb3J0X3R5cGUtPnByZWZpeDsKKwkJCSpyZXBvcnRfZGVzYyA9IHJlcG9ydF90eXBlLT5kZXNjOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkqcmVwb3J0X3ByZWZpeCA9ICpyZXBvcnRfZGVzYyA9ICIiOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGEgcm93IG9mIGRhdGEgZm9yIGFuIG9iamVjdAorICovCitpbnQgcmVwb3J0X29iamVjdCh2b2lkICpoYW5kbGUsIGludCBzZWxlY3Rpb25fb25seSwgY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCSAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY29uc3Qgc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLAorCQkgIGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0sCisJCSAgY29uc3Qgc3RydWN0IGxhYmVsICpsYWJlbCkKK3sKKwlzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSAqc2ggPSBzZWxlY3Rpb25fb25seSA/IChzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSAqKSBoYW5kbGUgOiBOVUxMOworCXN0cnVjdCBkZXZpY2UgZHVtbXlfZGV2aWNlID0geyAuZGV2ID0gMCB9OworCXN0cnVjdCBsYWJlbCBkdW1teV9sYWJlbCA9IHsgLmRldiA9ICZkdW1teV9kZXZpY2UgfTsKKwlzdHJ1Y3QgbHZtX3JlcG9ydF9vYmplY3Qgb2JqID0geworCQkudmcgPSAoc3RydWN0IHZvbHVtZV9ncm91cCAqKSB2ZywKKwkJLmx2ZG0gPSAoc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyAqKSBsdmRtLAorCQkucHYgPSAoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSBwdiwKKwkJLnNlZyA9IChzdHJ1Y3QgbHZfc2VnbWVudCAqKSBzZWcsCisJCS5wdnNlZyA9IChzdHJ1Y3QgcHZfc2VnbWVudCAqKSBwdnNlZywKKwkJLmxhYmVsID0gKHN0cnVjdCBsYWJlbCAqKSAobGFiZWwgPyA6IChwdiA/IHB2X2xhYmVsKHB2KSA6IE5VTEwpKQorCX07CisKKwkvKiBGSVhNRSB3b3JrYXJvdW5kIGZvciBwdl9sYWJlbCBnb2luZyB0aHJvdWdoIGNhY2hlOyByZW1vdmUgb25jZSBzdHJ1Y3QKKwkgKiBwaHlzaWNhbF92b2x1bWUgZ2FpbnMgYSBwcm9wZXIgImxhYmVsIiBwb2ludGVyICovCisJaWYgKCFvYmoubGFiZWwpIHsKKwkJaWYgKHB2KSB7CisJCQlpZiAocHYtPmZtdCkKKwkJCQlkdW1teV9sYWJlbC5sYWJlbGxlciA9IHB2LT5mbXQtPmxhYmVsbGVyOworCQkJaWYgKHB2LT5kZXYpCisJCQkJZHVtbXlfbGFiZWwuZGV2ID0gcHYtPmRldjsKKwkJCWVsc2UKKwkJCQltZW1jcHkoZHVtbXlfZGV2aWNlLnB2aWQsICZwdi0+aWQsIElEX0xFTik7CisJCX0KKwkJb2JqLmxhYmVsID0gJmR1bW15X2xhYmVsOworCX0KKworCS8qIE5ldmVyIHJlcG9ydCBvcnBoYW4gVkdzLiAqLworCWlmICh2ZyAmJiBpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCW9iai52ZyA9ICZfZHVtbXlfdmc7CisJCWlmIChwdikKKwkJCV9kdW1teV9maWQuZm10ID0gcHYtPmZtdDsKKwl9CisKKwlpZiAodmcgJiYgaXNfb3JwaGFuX3ZnKHZnLT5uYW1lKSAmJiBwdiAmJiBpc191c2VkX3B2KHB2KSkgeworCQlvYmoudmcgPSAmX3Vua25vd25fdmc7CisJCV9kdW1teV9maWQuZm10ID0gcHYtPmZtdDsKKwl9CisKKwlyZXR1cm4gc2ggPyBkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkKHNoLT5zZWxlY3Rpb25fcmgsICZvYmosIDAsICZzaC0+c2VsZWN0ZWQpCisJCSAgOiBkbV9yZXBvcnRfb2JqZWN0KGhhbmRsZSwgJm9iaik7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9kZXZ0eXBlX3NpbmdsZSh2b2lkICpoYW5kbGUsIGNvbnN0IGRldl9rbm93bl90eXBlX3QgKmRldnR5cGUpCit7CisJcmV0dXJuIGRtX3JlcG9ydF9vYmplY3QoaGFuZGxlLCAodm9pZCAqKWRldnR5cGUpOworfQorCitpbnQgcmVwb3J0X2RldnR5cGVzKHZvaWQgKmhhbmRsZSkKK3sKKwlpbnQgZGV2dHlwZWluZCA9IDA7CisKKwl3aGlsZSAoX2Rldl9rbm93bl90eXBlc1tkZXZ0eXBlaW5kXS5uYW1lWzBdKQorCQlpZiAoIV9yZXBvcnRfZGV2dHlwZV9zaW5nbGUoaGFuZGxlLCAmX2Rldl9rbm93bl90eXBlc1tkZXZ0eXBlaW5kKytdKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCByZXBvcnRfY21kbG9nKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqY29udGV4dCwKKwkJICBjb25zdCBjaGFyICpvYmplY3RfdHlwZV9uYW1lLCBjb25zdCBjaGFyICpvYmplY3RfbmFtZSwKKwkJICBjb25zdCBjaGFyICpvYmplY3RfaWQsIGNvbnN0IGNoYXIgKm9iamVjdF9ncm91cCwKKwkJICBjb25zdCBjaGFyICpvYmplY3RfZ3JvdXBfaWQsIGNvbnN0IGNoYXIgKm1zZywKKwkJICBpbnQgY3VycmVudF9lcnJubywgaW50IHJldF9jb2RlKQoreworCXN0YXRpYyB1aW50MzJfdCBzZXFfbnVtID0gMTsKKworCXN0cnVjdCBjbWRfbG9nX2l0ZW0gbG9nX2l0ZW0gPSB7c2VxX251bSsrLCB0eXBlLCBjb250ZXh0LCBvYmplY3RfdHlwZV9uYW1lLAorCQkJCQlvYmplY3RfbmFtZSA/IDogIiIsIG9iamVjdF9pZCA/IDogIiIsCisJCQkJCW9iamVjdF9ncm91cCA/IDogIiIsIG9iamVjdF9ncm91cF9pZCA/IDogIiIsCisJCQkJCW1zZyA/IDogIiIsIGN1cnJlbnRfZXJybm8sIHJldF9jb2RlfTsKKworCWlmIChoYW5kbGUpCisJCXJldHVybiBkbV9yZXBvcnRfb2JqZWN0KGhhbmRsZSwgJmxvZ19pdGVtKTsKKworCXJldHVybiAxOworfQorCitpbnQgcmVwb3J0X2N1cnJlbnRfb2JqZWN0X2NtZGxvZyhjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICptc2csIGludDMyX3QgcmV0X2NvZGUpCit7CisJbG9nX3JlcG9ydF90IGxvZ19zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisKKwlyZXR1cm4gcmVwb3J0X2NtZGxvZyhsb2dfc3RhdGUucmVwb3J0LCB0eXBlLCBsb2dfZ2V0X3JlcG9ydF9jb250ZXh0X25hbWUobG9nX3N0YXRlLmNvbnRleHQpLAorCQkJICAgICBsb2dfZ2V0X3JlcG9ydF9vYmplY3RfdHlwZV9uYW1lKGxvZ19zdGF0ZS5vYmplY3RfdHlwZSksCisJCQkgICAgIGxvZ19zdGF0ZS5vYmplY3RfbmFtZSwgbG9nX3N0YXRlLm9iamVjdF9pZCwKKwkJCSAgICAgbG9nX3N0YXRlLm9iamVjdF9ncm91cCwgbG9nX3N0YXRlLm9iamVjdF9ncm91cF9pZCwKKwkJCSAgICAgbXNnLCBzdG9yZWRfZXJybm8oKSwgcmV0X2NvZGUpOworfQpkaWZmIC0tZ2l0IGEvbGliL3JlcG9ydC9yZXBvcnQuaCBiL2xpYi9yZXBvcnQvcmVwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYThmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yZXBvcnQvcmVwb3J0LmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fUkVQT1JUX0gKKyNkZWZpbmUgX0xWTV9SRVBPUlRfSAorCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKyNpbmNsdWRlICJsYWJlbC5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisKK3R5cGVkZWYgZW51bSB7CisJQ01ETE9HCQk9IDEsCisJRlVMTAkJPSAyLAorCUxWUwkJPSA0LAorCUxWU0lORk8JCT0gOCwKKwlMVlNTVEFUVVMJPSAxNiwKKwlMVlNJTkZPU1RBVFVTICAgPSAzMiwKKwlQVlMJCT0gNjQsCisJVkdTCQk9IDEyOCwKKwlTRUdTCQk9IDI1NiwKKwlQVlNFR1MJCT0gNTEyLAorCUxBQkVMCQk9IDEwMjQsCisJREVWVFlQRVMJPSAyMDQ4Cit9IHJlcG9ydF90eXBlX3Q7CisKKy8qCisgKiBUaGUgInN0cnVjdCBzZWxlY3Rpb25faGFuZGxlIiBpcyB1c2VkIG9ubHkgZm9yIHNlbGVjdGlvbgorICogb2YgaXRlbXMgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIGZ1cnRoZXIgKG5vdCBmb3IgZGlzcGxheSEpLgorICoKKyAqIEl0IGNvbnNpc3RzIG9mIHNlbGVjdGlvbiByZXBvcnRpbmcgaGFuZGxlICJzZWxlY3Rpb25fcmgiCisgKiB1c2VkIGZvciB0aGUgc2VsZWN0aW9uIGl0c2VsZiAobm90IGZvciBkaXNwbGF5IG9uIG91dHB1dCEpLgorICogVGhlIGl0ZW1zIGFyZSByZXBvcnRlZCBkaXJlY3RseSBpbiBtZW1vcnkgdG8gYSBidWZmZXIgYW5kCisgKiB0aGVuIGNvbXBhcmVkIGFnYWluc3Qgc2VsZWN0aW9uIGNyaXRlcmlhLiBPbmNlIHdlIGtub3cgdGhlCisgKiByZXN1bHQgb2YgdGhlIHNlbGVjdGlvbiwgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIQorICoKKyAqIFRoZSAib3JpZ19yZXBvcnRfdHlwZSIgaXMgdGhlIG9yaWdpbmFsIHJlcXVlc3RlZCByZXBvcnQgdHlwZS4KKyAqIFRoZSAicmVwb3J0X3R5cGUiIGlzIHRoZSByZXBvcnRpbmcgdHlwZSBhY3R1YWxseSB1c2VkIHdoaWNoCisgKiBhbHNvIGNvdW50cyB3aXRoIHJlcG9ydCB0eXBlcyBvZiB0aGUgZmllbGRzIHVzZWQgaW4gc2VsZWN0aW9uCisgKiBjcml0ZXJpYS4KKyAqCisgKiBUaGUgInNlbGVjdGVkIiB2YXJpYWJsZSBpcyB1c2VkIGZvciBwcm9wYWdhdGluZyB0aGUgcmVzdWx0CisgKiBvZiB0aGUgc2VsZWN0aW9uLgorICovCitzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSB7CisJc3RydWN0IGRtX3JlcG9ydCAqc2VsZWN0aW9uX3JoOworCXJlcG9ydF90eXBlX3Qgb3JpZ19yZXBvcnRfdHlwZTsKKwlyZXBvcnRfdHlwZV90IHJlcG9ydF90eXBlOworCWludCBzZWxlY3RlZDsKK307CisKK3N0cnVjdCBjbWRfbG9nX2l0ZW0geworCXVpbnQzMl90IHNlcV9udW07CisJY29uc3QgY2hhciAqdHlwZTsKKwljb25zdCBjaGFyICpjb250ZXh0OworCWNvbnN0IGNoYXIgKm9iamVjdF90eXBlX25hbWU7CisJY29uc3QgY2hhciAqb2JqZWN0X25hbWU7CisJY29uc3QgY2hhciAqb2JqZWN0X2lkOworCWNvbnN0IGNoYXIgKm9iamVjdF9ncm91cDsKKwljb25zdCBjaGFyICpvYmplY3RfZ3JvdXBfaWQ7CisJY29uc3QgY2hhciAqbXNnOworCWludCBjdXJyZW50X2Vycm5vOworCWludCByZXRfY29kZTsKK307CisKK3N0cnVjdCBmaWVsZDsKK3N0cnVjdCByZXBvcnRfaGFuZGxlOworc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlOworCit0eXBlZGVmIGludCAoKmZpZWxkX3JlcG9ydF9mbikgKHN0cnVjdCByZXBvcnRfaGFuZGxlICogZGgsIHN0cnVjdCBmaWVsZCAqIGZpZWxkLAorCQkJCWNvbnN0IHZvaWQgKmRhdGEpOworCitpbnQgcmVwb3J0X2Zvcm1hdF9pbml0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBkbV9yZXBvcnRfZ3JvdXBfdHlwZV90ICpyZXBvcnRfZ3JvdXBfdHlwZSwKKwkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKipyZXBvcnRfZ3JvdXAsIHN0cnVjdCBkbV9yZXBvcnQgKipsb2dfcmgsCisJCSAgICAgICBpbnQgKmxvZ19vbmx5LCBsb2dfcmVwb3J0X3QgKnNhdmVkX2xvZ19yZXBvcnRfc3RhdGUpOworCit2b2lkICpyZXBvcnRfaW5pdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICprZXlzLAorCQkgIHJlcG9ydF90eXBlX3QgKnJlcG9ydF90eXBlLCBjb25zdCBjaGFyICpzZXBhcmF0b3IsCisJCSAgaW50IGFsaWduZWQsIGludCBidWZmZXJlZCwgaW50IGhlYWRpbmdzLCBpbnQgZmllbGRfcHJlZml4ZXMsCisJCSAgaW50IHF1b3RlZCwgaW50IGNvbHVtbnNfYXNfcm93cywgY29uc3QgY2hhciAqc2VsZWN0aW9uLAorCQkgIGludCBtdWx0aXBsZV9vdXRwdXQpOworaW50IHJlcG9ydF9nZXRfc2luZ2xlX3NlbGVjdGlvbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgcmVwb3J0X3R5cGVfdCByZXBvcnRfdHlwZSwgY29uc3QgY2hhciAqKnNlbGVjdGlvbik7Cit2b2lkICpyZXBvcnRfaW5pdF9mb3Jfc2VsZWN0aW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCByZXBvcnRfdHlwZV90ICpyZXBvcnRfdHlwZSwKKwkJCQljb25zdCBjaGFyICpzZWxlY3Rpb24pOworaW50IHJlcG9ydF9nZXRfcHJlZml4X2FuZF9kZXNjKHJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGVfaWQsCisJCQkgICAgICAgY29uc3QgY2hhciAqKnJlcG9ydF9wcmVmaXgsCisJCQkgICAgICAgY29uc3QgY2hhciAqKnJlcG9ydF9kZXNjKTsKK2ludCByZXBvcnRfZm9yX3NlbGVjdGlvbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKnBhcmVudF9oYW5kbGUsCisJCQkgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7Cit2b2lkIHJlcG9ydF9mcmVlKHZvaWQgKmhhbmRsZSk7CitpbnQgcmVwb3J0X29iamVjdCh2b2lkICpoYW5kbGUsIGludCBzZWxlY3Rpb25fb25seSwgY29uc3Qgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY29uc3Qgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCSAgY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY29uc3Qgc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLAorCQkgIGNvbnN0IHN0cnVjdCBsdl93aXRoX2luZm9fYW5kX3NlZ19zdGF0dXMgKmx2ZG0sCisJCSAgY29uc3Qgc3RydWN0IGxhYmVsICpsYWJlbCk7CitpbnQgcmVwb3J0X2RldnR5cGVzKHZvaWQgKmhhbmRsZSk7CitpbnQgcmVwb3J0X2NtZGxvZyh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbnRleHQsCisJCSAgY29uc3QgY2hhciAqb2JqZWN0X3R5cGVfbmFtZSwgY29uc3QgY2hhciAqb2JqZWN0X25hbWUsCisJCSAgY29uc3QgY2hhciAqb2JqZWN0X2lkLCBjb25zdCBjaGFyICpvYmplY3RfZ3JvdXAsCisJCSAgY29uc3QgY2hhciAqb2JqZWN0X2dyb3VwX2lkLCBjb25zdCBjaGFyICptc2csCisJCSAgaW50IGN1cnJlbnRfZXJybm8sIGludCByZXRfY29kZSk7CisjZGVmaW5lIFJFUE9SVF9PQkpFQ1RfQ01ETE9HX05BTUUgInN0YXR1cyIKKyNkZWZpbmUgUkVQT1JUX09CSkVDVF9DTURMT0dfU1VDQ0VTUyAic3VjY2VzcyIKKyNkZWZpbmUgUkVQT1JUX09CSkVDVF9DTURMT0dfRkFJTFVSRSAiZmFpbHVyZSIKK2ludCByZXBvcnRfY3VycmVudF9vYmplY3RfY21kbG9nKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm1zZywgaW50MzJfdCByZXRfY29kZSk7CitpbnQgcmVwb3J0X291dHB1dCh2b2lkICpoYW5kbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9yZXBvcnQvdmFsdWVzLmggYi9saWIvcmVwb3J0L3ZhbHVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjY4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmVwb3J0L3ZhbHVlcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyByZXNlcnZlZCBuYW1lcyBmb3IgZmllbGQgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgcmVnaXN0ZXJpbmcgcmVzZXJ2ZWQgbmFtZXMgd2l0aCByZXBvcnRpbmcgY29kZSB0aGF0CisgKiB1c2VzIHRoZSBleGFjdCB2YWx1ZSBkZWZpbmVkIHdoZW5ldmVyIHRoZSByZXNlcnZlZCBuYW1lIGlzIGhpdCwgZm9yCisgKiBleGFtcGxlIGR1cmluZyBzZWxlY3Rpb24gY3JpdGVyaWEgcHJvY2Vzc2luZy4KKyAqCisgKiBUWVBFX1JFU0VSVkVEX1ZBTFVFIGRlZmluZXMgcmVzZXJ2ZWQgdmFsdWUgdGhhdCBpcyBub3QgYm91bmQgdG8gYW55IGZpZWxkLAorICogYnV0IHJhdGhlciBpdCdzIGJvdW5kIHRvIGEgY2VydGFpbiB0eXBlLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgcmVzZXJ2ZWQKKyAqIHZhbHVlIGZvciBhbGwgZmllbGRzIG9mIHRoYXQgdHlwZSB0aGVuLiBXaGVuIG5hbWluZyB0eXBlIHJlc2VydmVkIHZhbHVlLAorICogcGxlYXNlIGZvbGxvdyB0aGlzIG5hbWluZyBzY2hlbWU6CisgKiAgIDxyZXBvcnQgdHlwZSBuYW1lIGluIGxvd2VyY2FzZT5fPHJlc2VydmVkX3ZhbHVlX25hbWU+CisgKgorICogRklFTERfUkVTRVJWRURfVkFMVUUgZGVmaW5lcyByZXNlcnZlZCB2YWx1ZSBib3VuZCB0byBhIHNpbmdsZSBmaWVsZC4KKyAqIFdoZW4gbmFtaW5nIHJlc2VydmVkIHZhbHVlIGZvciB0aGUgZmllbGQsIHBsZWFzZSBmb2xsb3cgdGhpcyBuYW1pbmcgc2NoZW1lOgorICogICA8ZmllbGRfbmFtZT5fPHJlc2VydmVkX3ZhbHVlX25hbWU+CisgKgorICogRklFTERfQklOQVJZX1JFU0VSVkVEX1ZBTFVFIGlzIHNpbWlsYXIgdG8gRklFTERfUkVTRVJWRURfVkFMVUUgYnV0IGl0CisgKiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIGRlZmludGlvbiBvZiByZXNlcnZlZCBuYW1lcyBmb3IgZmllbGRzCisgKiB3aXRoIGJpbmFyeSB2YWx1ZXMgd2hlcmUgdGhlIHJlc2VydmVkIG5hbWVzIGdpdmVuIGRlbm90ZSB2YWx1ZSAxLgorICogVGhlIGZpcnN0IHJlc2VydmVkX25hbWUgZ2l2ZW4gaXMgYWxzbyB1c2VkIGZvciByZXBvcnRpbmcsCisgKiBvdGhlcnMgYXJlIHN5bm9ueW1zIHdoaWNoIGFyZSByZWNvZ25pemVkIGluIGFkZGl0aW9uLgorICoKKyAqLworCisvKgorICogVFlQRV9SRVNFUlZFRF9WQUxVRSh0eXBlLCBmbGFncywgcmVzZXJ2ZWRfdmFsdWVfaWQsIGRlc2NyaXB0aW9uLCB2YWx1ZSwgcmVzZXJ2ZWRfbmFtZSwgLi4uKQorICogRklFTERfUkVTRVJWRURfVkFMVUUoZmllbGRfaWQsIGZsYWdzLCByZXNlcnZlZF92YWx1ZV9pZCwgZGVzY3JpcHRpb24sIHZhbHVlLCByZXNlcnZlZF9uYW1lLCAuLi4pCisgKiBGSUVMRF9CSU5BUllfUkVTRVJWRURfVkFMVUUoZmllbGRfaWQsIHJlc2VydmVkX3ZhbHVlX2lkLCBkZXNjcmlwdGlvbiwgcmVzZXJ2ZWRfbmFtZSBmb3IgMSwgLi4uKQorICovCisKKy8qICpJTkRFTlQtT0ZGKiAqLworCisvKiBQZXItdHlwZSByZXNlcnZlZCB2YWx1ZXMgdXNhYmxlIGZvciBhbGwgZmllbGRzIG9mIGNlcnRhaW4gdHlwZS4gKi8KK1RZUEVfUkVTRVJWRURfVkFMVUUoTlVNLCBOT0ZMQUcsIG51bV91bmRlZl82NCwgIlJlc2VydmVkIHZhbHVlIGZvciB1bmRlZmluZWQgbnVtZXJpYyB2YWx1ZS4iLCBVSU5UNjRfQygtMSksICItMSIsICJ1bmtub3duIiwgInVuZGVmaW5lZCIsICJ1bmRlZiIpCisKKy8qIFJlc2VydmVkIHZhbHVlcyBmb3IgUFYgZmllbGRzICovCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUocHZfYWxsb2NhdGFibGUsIHB2X2FsbG9jYXRhYmxlLCAiIiwgImFsbG9jYXRhYmxlIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShwdl9leHBvcnRlZCwgcHZfZXhwb3J0ZWQsICIiLCAiZXhwb3J0ZWQiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKHB2X21pc3NpbmcsIHB2X21pc3NpbmcsICIiLCAibWlzc2luZyIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUocHZfaW5fdXNlLCBwdl9pbl91c2UsICIiLCAidXNlZCIsICJpbiB1c2UiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKHB2X2R1cGxpY2F0ZSwgcHZfZHVwbGljYXRlLCAiIiwgImR1cGxpY2F0ZSIpCisKKy8qIFJlc2VydmVkIHZhbHVlcyBmb3IgVkcgZmllbGRzICovCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUodmdfZXh0ZW5kYWJsZSwgdmdfZXh0ZW5kYWJsZSwgIiIsICJleHRlbmRhYmxlIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRSh2Z19leHBvcnRlZCwgdmdfZXhwb3J0ZWQsICIiLCAiZXhwb3J0ZWQiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKHZnX3BhcnRpYWwsIHZnX3BhcnRpYWwsICIiLCAicGFydGlhbCIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUodmdfY2x1c3RlcmVkLCB2Z19jbHVzdGVyZWQsICIiLCAiY2x1c3RlcmVkIikKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5BTUVELCB2Z19wZXJtaXNzaW9ucywgdmdfcGVybWlzc2lvbnNfcncsICIiLCAid3JpdGVhYmxlIiwgIndyaXRlYWJsZSIsICJydyIsICJyZWFkLXdyaXRlIikKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5BTUVELCB2Z19wZXJtaXNzaW9ucywgdmdfcGVybWlzc2lvbnNfciwgIiIsICJyZWFkLW9ubHkiLCAicmVhZC1vbmx5IiwgInIiLCAicm8iKQorRklFTERfUkVTRVJWRURfVkFMVUUoTk9GTEFHLCB2Z19tZGFfY29waWVzLCB2Z19tZGFfY29waWVzX3VubWFuYWdlZCwgIiIsICZHRVRfVFlQRV9SRVNFUlZFRF9WQUxVRShudW1fdW5kZWZfNjQpLCAidW5tYW5hZ2VkIikKKworLyogUmVzZXJ2ZWQgdmFsdWVzIGZvciBMViBmaWVsZHMgKi8KK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9pbml0aWFsX2ltYWdlX3N5bmMsIGx2X2luaXRpYWxfaW1hZ2Vfc3luYywgIiIsICJpbml0aWFsIGltYWdlIHN5bmMiLCAic3luYyIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfaW1hZ2Vfc3luY2VkLCBsdl9pbWFnZV9zeW5jZWQsICIiLCAiaW1hZ2Ugc3luY2VkIiwgInN5bmNlZCIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfbWVyZ2luZywgbHZfbWVyZ2luZywgIiIsICJtZXJnaW5nIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9jb252ZXJ0aW5nLCBsdl9jb252ZXJ0aW5nLCAiIiwgImNvbnZlcnRpbmciKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKGx2X2FsbG9jYXRpb25fbG9ja2VkLCBsdl9hbGxvY2F0aW9uX2xvY2tlZCwgIiIsICJhbGxvY2F0aW9uIGxvY2tlZCIsICJsb2NrZWQiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKGx2X2ZpeGVkX21pbm9yLCBsdl9maXhlZF9taW5vciwgIiIsICJmaXhlZCBtaW5vciIsICJmaXhlZCIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfYWN0aXZlX2xvY2FsbHksIGx2X2FjdGl2ZV9sb2NhbGx5LCAiIiwgImFjdGl2ZSBsb2NhbGx5IiwgImFjdGl2ZSIsICJsb2NhbGx5IikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9hY3RpdmVfcmVtb3RlbHksIGx2X2FjdGl2ZV9yZW1vdGVseSwgIiIsICJhY3RpdmUgcmVtb3RlbHkiLCAiYWN0aXZlIiwgInJlbW90ZWx5IikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9hY3RpdmVfZXhjbHVzaXZlbHksIGx2X2FjdGl2ZV9leGNsdXNpdmVseSwgIiIsICJhY3RpdmUgZXhjbHVzaXZlbHkiLCAiYWN0aXZlIiwgImV4Y2x1c2l2ZWx5IikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9tZXJnZV9mYWlsZWQsIGx2X21lcmdlX2ZhaWxlZCwgIiIsICJtZXJnZSBmYWlsZWQiLCAiZmFpbGVkIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9zbmFwc2hvdF9pbnZhbGlkLCBsdl9zbmFwc2hvdF9pbnZhbGlkLCAiIiwgInNuYXBzaG90IGludmFsaWQiLCAiaW52YWxpZCIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfc3VzcGVuZGVkLCBsdl9zdXNwZW5kZWQsICIiLCAic3VzcGVuZGVkIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9saXZlX3RhYmxlLCBsdl9saXZlX3RhYmxlLCAiIiwgImxpdmUgdGFibGUgcHJlc2VudCIsICJsaXZlIHRhYmxlIiwgImxpdmUiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKGx2X2luYWN0aXZlX3RhYmxlLCBsdl9pbmFjdGl2ZV90YWJsZSwgIiIsICJpbmFjdGl2ZSB0YWJsZSBwcmVzZW50IiwgImluYWN0aXZlIHRhYmxlIiwgImluYWN0aXZlIikKK0ZJRUxEX1JFU0VSVkVEX0JJTkFSWV9WQUxVRShsdl9kZXZpY2Vfb3BlbiwgbHZfZGV2aWNlX29wZW4sICIiLCAib3BlbiIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfc2tpcF9hY3RpdmF0aW9uLCBsdl9za2lwX2FjdGl2YXRpb24sICIiLCAic2tpcCBhY3RpdmF0aW9uIiwgInNraXAiKQorRklFTERfUkVTRVJWRURfQklOQVJZX1ZBTFVFKHplcm8sIHplcm8sICIiLCAiemVybyIpCitGSUVMRF9SRVNFUlZFRF9CSU5BUllfVkFMVUUobHZfY2hlY2tfbmVlZGVkLCBsdl9jaGVja19uZWVkZWQsICIiLCAiY2hlY2sgbmVlZGVkIiwgIm5lZWRlZCIpCitGSUVMRF9SRVNFUlZFRF9WQUxVRShOQU1FRCwgbHZfcGVybWlzc2lvbnMsIGx2X3Blcm1pc3Npb25zX3J3LCAiIiwgIndyaXRlYWJsZSIsICJ3cml0ZWFibGUiLCAicnciLCAicmVhZC13cml0ZSIpCitGSUVMRF9SRVNFUlZFRF9WQUxVRShOQU1FRCwgbHZfcGVybWlzc2lvbnMsIGx2X3Blcm1pc3Npb25zX3IsICIiLCAicmVhZC1vbmx5IiwgInJlYWQtb25seSIsICJyIiwgInJvIikKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5BTUVELCBsdl9wZXJtaXNzaW9ucywgbHZfcGVybWlzc2lvbnNfcl9vdmVycmlkZSwgIiIsICJyZWFkLW9ubHktb3ZlcnJpZGUiLCAicmVhZC1vbmx5LW92ZXJyaWRlIiwgInJvLW92ZXJyaWRlIiwgInItb3ZlcnJpZGUiLCAiUiIpCitGSUVMRF9SRVNFUlZFRF9WQUxVRShOT0ZMQUcsIGx2X3JlYWRfYWhlYWQsIGx2X3JlYWRfYWhlYWRfYXV0bywgIiIsICZfc2l6X21heCwgImF1dG8iKQorRklFTERfUkVTRVJWRURfVkFMVUUoTkFNRUQsIGx2X3doZW5fZnVsbCwgbHZfd2hlbl9mdWxsX2Vycm9yLCAiIiwgImVycm9yIiwgImVycm9yIiwgImVycm9yIHdoZW4gZnVsbCIsICJlcnJvciBpZiBubyBzcGFjZSIpCitGSUVMRF9SRVNFUlZFRF9WQUxVRShOQU1FRCwgbHZfd2hlbl9mdWxsLCBsdl93aGVuX2Z1bGxfcXVldWUsICIiLCAicXVldWUiLCAicXVldWUiLCAicXVldWUgd2hlbiBmdWxsIiwgInF1ZXVlIGlmIG5vIHNwYWNlIikKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5PRkxBRywgbHZfd2hlbl9mdWxsLCBsdl93aGVuX2Z1bGxfdW5kZWYsICIiLCAiIiwgIiIsICJ1bmRlZmluZWQiKQorRklFTERfUkVTRVJWRURfVkFMVUUoTkFNRUQgfCBSQU5HRSB8IEZVWlpZIHwgRFlOQU1JQywgbHZfdGltZSwgbHZfdGltZV9mdXp6eSwgIiIsIGx2X3RpbWVfaGFuZGxlciwgTlVMTCkKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5BTUVEIHwgUkFOR0UgfCBGVVpaWSB8IERZTkFNSUMsIGx2X3RpbWVfcmVtb3ZlZCwgbHZfdGltZV9yZW1vdmVkX2Z1enp5LCAiIiwgbHZfdGltZV9oYW5kbGVyLCBOVUxMKQorCisvKiBSZXNlcnZlZCB2YWx1ZXMgZm9yIFNFRyBmaWVsZHMgKi8KK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKE5PRkxBRywgY2FjaGVfcG9saWN5LCBjYWNoZV9wb2xpY3lfdW5kZWYsICIiLCAiIiwgIiIsICJ1bmRlZmluZWQiKQorRklFTERfUkVTRVJWRURfVkFMVUUoTk9GTEFHLCBzZWdfbW9uaXRvciwgc2VnX21vbml0b3JfdW5kZWYsICIiLCAiIiwgIiIsICJ1bmRlZmluZWQiKQorRklFTERfUkVTRVJWRURfVkFMVUUoTk9GTEFHLCBsdl9oZWFsdGhfc3RhdHVzLCBoZWFsdGhfdW5kZWYsICIiLCAiIiwgIiIsICJ1bmRlZmluZWQiKQorRklFTERfUkVTRVJWRURfVkFMVUUoTk9GTEFHLCBrZXJuZWxfZGlzY2FyZHMsIHNlZ19rZXJuZWxfZGlzY2FyZHNfdW5kZWYsICIiLCAiIiwgIiIsICJ1bmRlZmluZWQiKQorLyogVE9ETyB0aGUgZm9sbG93aW5nIDIgbmVlZCBTVFJfTElTVCBzdXBwb3J0IGZvciByZXNlcnZlZCB2YWx1ZXMKK0ZJRUxEX1JFU0VSVkVEX1ZBTFVFKGNhY2hlX3NldHRpbmdzLCBjYWNoZV9zZXR0aW5nc19kZWZhdWx0LCAiIiwgImRlZmF1bHQiLCAiZGVmYXVsdCIpCitGSUVMRF9SRVNFUlZFRF9WQUxVRShjYWNoZV9zZXR0aW5ncywgY2FjaGVfc2V0dGluZ3NfdW5kZWYsICIiLCAidW5kZWZpbmVkIiwgInVuZGVmaW5lZCIpICovCisKKy8qICpJTkRFTlQtT04qICovCmRpZmYgLS1naXQgYS9saWIvc25hcHNob3QvLmV4cG9ydGVkX3N5bWJvbHMgYi9saWIvc25hcHNob3QvLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5MmM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zbmFwc2hvdC8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxIEBACitpbml0X3NlZ3R5cGUKZGlmZiAtLWdpdCBhL2xpYi9zbmFwc2hvdC9NYWtlZmlsZS5pbiBiL2xpYi9zbmFwc2hvdC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU0NGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3NuYXBzaG90L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitTT1VSQ0VTID0gc25hcHNob3QuYworCitMSUJfU0hBUkVEID0gbGlibHZtMnNuYXBzaG90LiQoTElCX1NVRkZJWCkKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9MVk0pCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitpbnN0YWxsOiBpbnN0YWxsX2x2bTJfcGx1Z2luCmRpZmYgLS1naXQgYS9saWIvc25hcHNob3Qvc25hcHNob3QuYyBiL2xpYi9zbmFwc2hvdC9zbmFwc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MGYyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc25hcHNob3Qvc25hcHNob3QuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJ0ZXh0X2V4cG9ydC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAic3RyX2xpc3QuaCIKKworI2RlZmluZSBTRUdfTE9HX0VSUk9SKHQsIHAuLi4pIFwKKwlsb2dfZXJyb3IodCAiIHNlZ21lbnQgJXMgb2YgbG9naWNhbCB2b2x1bWUgJXMuIiwgIyMgcCwgXAorCQkgIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbiksIHNlZy0+bHYtPm5hbWUpLCAwOworCitzdGF0aWMgY29uc3QgY2hhciAqX3NuYXBfdGFyZ2V0X25hbWUoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMpCit7CisJaWYgKCFsYW9wdHMtPm5vX21lcmdpbmcgJiYgKHNlZy0+c3RhdHVzICYgTUVSR0lORykpCisJCXJldHVybiBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRTsKKworCXJldHVybiBsdnNlZ19uYW1lKHNlZyk7Cit9CisKK3N0YXRpYyBpbnQgX3NuYXBfdGV4dF9pbXBvcnQoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXVpbnQzMl90IGNodW5rX3NpemU7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmcsICpjb3c7CisJY29uc3QgY2hhciAqb3JnX25hbWUgPSBOVUxMLCAqY293X25hbWUgPSBOVUxMOworCWludCBtZXJnZSA9IDA7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfdWludDMyKHNuLCAiY2h1bmtfc2l6ZSIsICZjaHVua19zaXplKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgY2h1bmsgc2l6ZSBmb3Igc25hcHNob3QuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9jb25maWdfaGFzX25vZGUoc24sICJtZXJnaW5nX3N0b3JlIikpIHsKKwkJaWYgKCEoY293X25hbWUgPSBkbV9jb25maWdfZmluZF9zdHIoc24sICJtZXJnaW5nX3N0b3JlIiwgTlVMTCkpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIk1lcmdpbmcgc3RvcmUgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCQltZXJnZSA9IDE7CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgImNvd19zdG9yZSIpKSB7CisJCWlmIChjb3dfbmFtZSkKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJCb3RoIHNuYXBzaG90IGNvdyBhbmQgbWVyZ2luZyBzdG9yYWdlIHdlcmUgc3BlY2lmaWVkIGluIik7CisKKwkJaWYgKCEoY293X25hbWUgPSBkbV9jb25maWdfZmluZF9zdHIoc24sICJjb3dfc3RvcmUiLCBOVUxMKSkpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ293IHN0b3JlIG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKwl9CisKKwlpZiAoIWNvd19uYW1lKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiU25hcHNob3QgY293IHN0b3JhZ2Ugbm90IHNwZWNpZmllZCBpbiIpOworCisJaWYgKCFkbV9jb25maWdfaGFzX25vZGUoc24sICJvcmlnaW4iKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlNuYXBzaG90IG9yaWdpbiBub3Qgc3BlY2lmaWVkIGluIik7CisKKwlpZiAoIShvcmdfbmFtZSA9IGRtX2NvbmZpZ19maW5kX3N0cihzbiwgIm9yaWdpbiIsIE5VTEwpKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlNuYXBzaG90IG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisKKwlpZiAoIShjb3cgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBjb3dfbmFtZSkpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBsb2dpY2FsIHZvbHVtZSAlcyBzcGVjaWZpZWQgZm9yICIKKwkJCQkgICAgICJzbmFwc2hvdCBjb3cgc3RvcmUgaW4iLCBjb3dfbmFtZSk7CisKKwlpZiAoIShvcmcgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBvcmdfbmFtZSkpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBsb2dpY2FsIHZvbHVtZSAlcyBzcGVjaWZpZWQgZm9yICIKKwkJCSAgInNuYXBzaG90IG9yaWdpbiBpbiIsIG9yZ19uYW1lKTsKKworCWluaXRfc25hcHNob3Rfc2VnKHNlZywgb3JnLCBjb3csIGNodW5rX3NpemUsIG1lcmdlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zbmFwX3RleHRfZXhwb3J0KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJb3V0ZihmLCAiY2h1bmtfc2l6ZSA9ICV1Iiwgc2VnLT5jaHVua19zaXplKTsKKwlvdXRmKGYsICJvcmlnaW4gPSBcIiVzXCIiLCBzZWctPm9yaWdpbi0+bmFtZSk7CisKKwlpZiAoIShzZWctPnN0YXR1cyAmIE1FUkdJTkcpKQorCQlvdXRmKGYsICJjb3dfc3RvcmUgPSBcIiVzXCIiLCBzZWctPmNvdy0+bmFtZSk7CisJZWxzZQorCQlvdXRmKGYsICJtZXJnaW5nX3N0b3JlID0gXCIlc1wiIiwgc2VnLT5jb3ctPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfc25hcF90YXJnZXRfc3RhdHVzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gKHN0cmNtcCh0eXBlLCBUQVJHRVRfTkFNRV9TTkFQU0hPVF9NRVJHRSkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgX3NuYXBfdGFyZ2V0X3BlcmNlbnQodm9pZCAqKnRhcmdldF9zdGF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlkbV9wZXJjZW50X3QgKnBlcmNlbnQsCisJCQkJc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCWNoYXIgKnBhcmFtcywgdWludDY0X3QgKnRvdGFsX251bWVyYXRvciwKKwkJCQl1aW50NjRfdCAqdG90YWxfZGVub21pbmF0b3IpCit7CisJc3RydWN0IGRtX3N0YXR1c19zbmFwc2hvdCAqczsKKworCWlmICghZG1fZ2V0X3N0YXR1c19zbmFwc2hvdChtZW0sIHBhcmFtcywgJnMpKQorCQlyZXR1cm5fMDsKKworCWlmIChzLT5pbnZhbGlkKQorCQkqcGVyY2VudCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKwllbHNlIGlmIChzLT5tZXJnZV9mYWlsZWQpCisJCSpwZXJjZW50ID0gTFZNX1BFUkNFTlRfTUVSR0VfRkFJTEVEOworCWVsc2UgeworCQkqdG90YWxfbnVtZXJhdG9yICs9IHMtPnVzZWRfc2VjdG9yczsKKwkJKnRvdGFsX2Rlbm9taW5hdG9yICs9IHMtPnRvdGFsX3NlY3RvcnM7CisJCWlmIChzLT5oYXNfbWV0YWRhdGFfc2VjdG9ycyAmJgorCQkgICAgcy0+dXNlZF9zZWN0b3JzID09IHMtPm1ldGFkYXRhX3NlY3RvcnMpCisJCQkqcGVyY2VudCA9IERNX1BFUkNFTlRfMDsKKwkJZWxzZSBpZiAocy0+dXNlZF9zZWN0b3JzID09IHMtPnRvdGFsX3NlY3RvcnMpCisJCQkqcGVyY2VudCA9IERNX1BFUkNFTlRfMTAwOworCQllbHNlCisJCQkqcGVyY2VudCA9IGRtX21ha2VfcGVyY2VudCgqdG90YWxfbnVtZXJhdG9yLCAqdG90YWxfZGVub21pbmF0b3IpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zbmFwX3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJdW5zaWduZWQgKmF0dHJpYnV0ZXMpCit7CisJc3RhdGljIGludCBfc25hcF9jaGVja2VkID0gMDsKKwlzdGF0aWMgaW50IF9zbmFwX21lcmdlX2NoZWNrZWQgPSAwOworCXN0YXRpYyBpbnQgX3NuYXBfcHJlc2VudCA9IDA7CisJc3RhdGljIGludCBfc25hcF9tZXJnZV9wcmVzZW50ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgX3NuYXBfYXR0cnMgPSAwOworCXVpbnQzMl90IG1haiwgbWluLCBwYXRjaGxldmVsOworCisJaWYgKCFhY3RpdmF0aW9uKCkpCisJCXJldHVybiAwOworCisJaWYgKCFfc25hcF9jaGVja2VkKSB7CisJCV9zbmFwX2NoZWNrZWQgPSAxOworCisJCWlmICghKF9zbmFwX3ByZXNlbnQgPSB0YXJnZXRfcHJlc2VudChjbWQsIFRBUkdFVF9OQU1FX1NOQVBTSE9ULCAxKSAmJgorCQkgICAgICB0YXJnZXRfcHJlc2VudChjbWQsIFRBUkdFVF9OQU1FX1NOQVBTSE9UX09SSUdJTiwgMCkpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHRhcmdldF92ZXJzaW9uKFRBUkdFVF9OQU1FX1NOQVBTSE9ULCAmbWFqLCAmbWluLCAmcGF0Y2hsZXZlbCkgJiYKKwkJICAgIChtYWogPiAxIHx8CisJCSAgICAgKG1haiA9PSAxICYmIChtaW4gPj0gMTIgfHwgKG1pbiA9PSAxMCAmJiBwYXRjaGxldmVsID49IDIpKSkpKQorCQkJX3NuYXBfYXR0cnMgfD0gU05BUFNIT1RfRkVBVFVSRV9GSVhFRF9MRUFLOworCQllbHNlCisJCQlsb2dfdmVyeV92ZXJib3NlKCJUYXJnZXQgc25hcHNob3QgbWF5IGxlYWsgbWV0YWRhdGEuIik7CisJfQorCisJaWYgKGF0dHJpYnV0ZXMpCisJCSphdHRyaWJ1dGVzID0gX3NuYXBfYXR0cnM7CisKKwkvKiBUT0RPOiB0ZXN0IGV2ZXJ5dGhpbmcgYXQgb25jZSAqLworCWlmIChfc25hcF9wcmVzZW50ICYmIHNlZyAmJiAoc2VnLT5zdGF0dXMgJiBNRVJHSU5HKSkgeworCQlpZiAoIV9zbmFwX21lcmdlX2NoZWNrZWQpIHsKKwkJCV9zbmFwX21lcmdlX3ByZXNlbnQgPSB0YXJnZXRfcHJlc2VudChjbWQsIFRBUkdFVF9OQU1FX1NOQVBTSE9UX01FUkdFLCAwKTsKKwkJCV9zbmFwX21lcmdlX2NoZWNrZWQgPSAxOworCQl9CisJCXJldHVybiBfc25hcF9tZXJnZV9wcmVzZW50OworCX0KKworCXJldHVybiBfc25hcF9wcmVzZW50OworfQorCisjICBpZmRlZiBETUVWRU5URAorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9zbmFwc2hvdF9kc29fcGF0aChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gZ2V0X21vbml0b3JfZHNvX3BhdGgoY21kLCBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGRtZXZlbnRkX3NuYXBzaG90X2xpYnJhcnlfQ0ZHLCBOVUxMKSk7Cit9CisKKy8qIEZJWE1FIENhY2hlIHRoaXMgKi8KK3N0YXRpYyBpbnQgX3RhcmdldF9yZWdpc3RlcmVkKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqcGVuZGluZykKK3sKKwlyZXR1cm4gdGFyZ2V0X3JlZ2lzdGVyZWRfd2l0aF9kbWV2ZW50ZChzZWctPmx2LT52Zy0+Y21kLCBfZ2V0X3NuYXBzaG90X2Rzb19wYXRoKHNlZy0+bHYtPnZnLT5jbWQpLAorCQkJCQkgICAgICAgc2VnLT5jb3csIHBlbmRpbmcpOworfQorCisvKiBGSVhNRSBUaGlzIGdldHMgcnVuIHdoaWxlIHN1c3BlbmRlZCBhbmQgcGVyZm9ybXMgYmFubmVkIG9wZXJhdGlvbnMuICovCitzdGF0aWMgaW50IF90YXJnZXRfc2V0X2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBpbnQgZXZtYXNrLCBpbnQgc2V0KQoreworCS8qIEZJWE1FIE1ha2UgdGltZW91dCAoMTApIGNvbmZpZ3VyYWJsZSAqLworCXJldHVybiB0YXJnZXRfcmVnaXN0ZXJfZXZlbnRzKHNlZy0+bHYtPnZnLT5jbWQsIF9nZXRfc25hcHNob3RfZHNvX3BhdGgoc2VnLT5sdi0+dmctPmNtZCksCisJCQkJICAgICAgc2VnLT5jb3csIGV2bWFzaywgc2V0LCAxMCk7Cit9CisKK3N0YXRpYyBpbnQgX3RhcmdldF9yZWdpc3Rlcl9ldmVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICBpbnQgZXZlbnRzKQoreworCXJldHVybiBfdGFyZ2V0X3NldF9ldmVudHMoc2VnLCBldmVudHMsIDEpOworfQorCitzdGF0aWMgaW50IF90YXJnZXRfdW5yZWdpc3Rlcl9ldmVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgIGludCBldmVudHMpCit7CisJcmV0dXJuIF90YXJnZXRfc2V0X2V2ZW50cyhzZWcsIGV2ZW50cywgMCk7Cit9CisKKyMgIGVuZGlmIC8qIERNRVZFTlREICovCisKK3N0YXRpYyBpbnQgX3NuYXBfbW9kdWxlc19uZWVkZWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV9saXN0ICptb2R1bGVzKQoreworCWlmICghc3RyX2xpc3RfYWRkKG1lbSwgbW9kdWxlcywgTU9EVUxFX05BTUVfU05BUFNIT1QpKSB7CisJCWxvZ19lcnJvcigic25hcHNob3Qgc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogREVWTUFQUEVSX1NVUFBPUlQgKi8KKworc3RhdGljIHZvaWQgX3NuYXBfZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoc2VndHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF9zbmFwc2hvdF9vcHMgPSB7CisJLnRhcmdldF9uYW1lID0gX3NuYXBfdGFyZ2V0X25hbWUsCisJLnRleHRfaW1wb3J0ID0gX3NuYXBfdGV4dF9pbXBvcnQsCisJLnRleHRfZXhwb3J0ID0gX3NuYXBfdGV4dF9leHBvcnQsCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwkudGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlID0gX3NuYXBfdGFyZ2V0X3N0YXR1c19jb21wYXRpYmxlLAorCS50YXJnZXRfcGVyY2VudCA9IF9zbmFwX3RhcmdldF9wZXJjZW50LAorCS50YXJnZXRfcHJlc2VudCA9IF9zbmFwX3RhcmdldF9wcmVzZW50LAorCS5tb2R1bGVzX25lZWRlZCA9IF9zbmFwX21vZHVsZXNfbmVlZGVkLAorIyAgaWZkZWYgRE1FVkVOVEQKKwkudGFyZ2V0X21vbml0b3JlZCA9IF90YXJnZXRfcmVnaXN0ZXJlZCwKKwkudGFyZ2V0X21vbml0b3JfZXZlbnRzID0gX3RhcmdldF9yZWdpc3Rlcl9ldmVudHMsCisJLnRhcmdldF91bm1vbml0b3JfZXZlbnRzID0gX3RhcmdldF91bnJlZ2lzdGVyX2V2ZW50cywKKyMgIGVuZGlmCS8qIERNRVZFTlREICovCisjZW5kaWYKKwkuZGVzdHJveSA9IF9zbmFwX2Rlc3Ryb3ksCit9OworCisjaWZkZWYgU05BUFNIT1RfSU5URVJOQUwKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfc25hcHNob3Rfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKKyNlbHNlCQkJCS8qIFNoYXJlZCAqLworc3RydWN0IHNlZ21lbnRfdHlwZSAqaW5pdF9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKKyNlbmRpZgoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSk7CisKKwlpZiAoIXNlZ3R5cGUpCisJCXJldHVybl9OVUxMOworCisJc2VndHlwZS0+b3BzID0gJl9zbmFwc2hvdF9vcHM7CisJc2VndHlwZS0+bmFtZSA9IFNFR19UWVBFX05BTUVfU05BUFNIT1Q7CisJc2VndHlwZS0+ZmxhZ3MgPSBTRUdfU05BUFNIT1QgfCBTRUdfQ0FOTk9UX0JFX1pFUk9FRCB8IFNFR19PTkxZX0VYQ0xVU0lWRTsKKworI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisjICBpZmRlZiBETUVWRU5URAorCWlmIChfZ2V0X3NuYXBzaG90X2Rzb19wYXRoKGNtZCkpCisJCXNlZ3R5cGUtPmZsYWdzIHw9IFNFR19NT05JVE9SRUQ7CisjICBlbmRpZgkvKiBETUVWRU5URCAqLworI2VuZGlmCisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5pdGlhbGlzZWQgc2VndHlwZTogJXMiLCBzZWd0eXBlLT5uYW1lKTsKKworCXJldHVybiBzZWd0eXBlOworfQpkaWZmIC0tZ2l0IGEvbGliL3N0cmlwZWQvc3RyaXBlZC5jIGIvbGliL3N0cmlwZWQvc3RyaXBlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGU0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3RyaXBlZC9zdHJpcGVkLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJzZWd0eXBlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgInRleHRfZXhwb3J0LmgiCisjaW5jbHVkZSAidGV4dF9pbXBvcnQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgInRhcmdldHMuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJwdl9hbGxvYy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpfc3RyaXBlZF9uYW1lKGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJcmV0dXJuIChzZWctPmFyZWFfY291bnQgPT0gMSkgPyBTRUdfVFlQRV9OQU1FX0xJTkVBUiA6IHNlZy0+c2VndHlwZS0+bmFtZTsKK30KKworc3RhdGljIHZvaWQgX3N0cmlwZWRfZGlzcGxheShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCXVpbnQzMl90IHM7CisKKwlpZiAoc2VnLT5hcmVhX2NvdW50ID09IDEpCisJCWRpc3BsYXlfc3RyaXBlKHNlZywgMCwgIiAgIik7CisJZWxzZSB7CisJCWxvZ19wcmludCgiICBTdHJpcGVzXHRcdCV1Iiwgc2VnLT5hcmVhX2NvdW50KTsKKworCQlpZiAoc2VnLT5sdi0+dmctPmNtZC0+c2lfdW5pdF9jb25zaXN0ZW5jeSkKKwkJCWxvZ19wcmludCgiICBTdHJpcGUgc2l6ZVx0XHQlcyIsCisJCQkJICBkaXNwbGF5X3NpemUoc2VnLT5sdi0+dmctPmNtZCwKKwkJCQkJICAgICAgICh1aW50NjRfdCkgc2VnLT5zdHJpcGVfc2l6ZSkpOworCQllbHNlCisJCQlsb2dfcHJpbnQoIiAgU3RyaXBlIHNpemVcdFx0JXUgS0IiLAorCQkJCSAgc2VnLT5zdHJpcGVfc2l6ZSAvIDIpOworCisJCWZvciAocyA9IDA7IHMgPCBzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJbG9nX3ByaW50KCIgIFN0cmlwZSAlZDoiLCBzKTsKKwkJCWRpc3BsYXlfc3RyaXBlKHNlZywgcywgIiAgICAiKTsKKwkJfQorCX0KKwlsb2dfcHJpbnQoIiAiKTsKK30KKworc3RhdGljIGludCBfc3RyaXBlZF90ZXh0X2ltcG9ydF9hcmVhX2NvdW50KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sIHVpbnQzMl90ICphcmVhX2NvdW50KQoreworCWlmICghZG1fY29uZmlnX2dldF91aW50MzIoc24sICJzdHJpcGVfY291bnQiLCBhcmVhX2NvdW50KSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IHJlYWQgJ3N0cmlwZV9jb3VudCcgZm9yICIKKwkJCSAgInNlZ21lbnQgJyVzJy4iLCBkbV9jb25maWdfcGFyZW50X25hbWUoc24pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3N0cmlwZWRfdGV4dF9pbXBvcnQoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCXN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCisJaWYgKChzZWctPmFyZWFfY291bnQgIT0gMSkgJiYKKwkgICAgIWRtX2NvbmZpZ19nZXRfdWludDMyKHNuLCAic3RyaXBlX3NpemUiLCAmc2VnLT5zdHJpcGVfc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCByZWFkIHN0cmlwZV9zaXplIGZvciBzZWdtZW50ICVzICIKKwkJCSAgIm9mIGxvZ2ljYWwgdm9sdW1lICVzLiIsIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbiksIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfbGlzdChzbiwgInN0cmlwZXMiLCAmY3YpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBzdHJpcGVzIGFycmF5IGZvciBzZWdtZW50ICVzICIKKwkJCSAgIm9mIGxvZ2ljYWwgdm9sdW1lICVzLiIsIGRtX2NvbmZpZ19wYXJlbnRfbmFtZShzbiksIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWctPmFyZWFfbGVuIC89IHNlZy0+YXJlYV9jb3VudDsKKworCXJldHVybiB0ZXh0X2ltcG9ydF9hcmVhcyhzZWcsIHNuLCBjdiwgcHZfaGFzaCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX3N0cmlwZWRfdGV4dF9leHBvcnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKworCW91dGZjKGYsIChzZWctPmFyZWFfY291bnQgPT0gMSkgPyAiIyBsaW5lYXIiIDogTlVMTCwKKwkgICAgICAic3RyaXBlX2NvdW50ID0gJXUiLCBzZWctPmFyZWFfY291bnQpOworCisJaWYgKHNlZy0+YXJlYV9jb3VudCA+IDEpCisJCW91dHNpemUoZiwgKHVpbnQ2NF90KSBzZWctPnN0cmlwZV9zaXplLAorCQkJInN0cmlwZV9zaXplID0gJXUiLCBzZWctPnN0cmlwZV9zaXplKTsKKworCXJldHVybiBvdXRfYXJlYXMoZiwgc2VnLCAic3RyaXBlIik7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdHdvIHNlZ21lbnRzIGNvdWxkIGJlIG1lcmdlZCBieSB0aGUgY3VycmVudCBtZXJnaW5nIGNvZGUKKyAqLworc3RhdGljIGludCBfc3RyaXBlZF9zZWdtZW50c19jb21wYXRpYmxlKHN0cnVjdCBsdl9zZWdtZW50ICpmaXJzdCwKKwkJCQlzdHJ1Y3QgbHZfc2VnbWVudCAqc2Vjb25kKQoreworCXVpbnQzMl90IHdpZHRoOworCXVuc2lnbmVkIHM7CisKKwlpZiAoKGZpcnN0LT5hcmVhX2NvdW50ICE9IHNlY29uZC0+YXJlYV9jb3VudCkgfHwKKwkgICAgKGZpcnN0LT5zdHJpcGVfc2l6ZSAhPSBzZWNvbmQtPnN0cmlwZV9zaXplKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHMgPSAwOyBzIDwgZmlyc3QtPmFyZWFfY291bnQ7IHMrKykgeworCisJCS8qIEZJWE1FIFJlbGF4IHRoaXMgdG8gZmlyc3QgYXJlYSB0eXBlICE9IHNlY29uZCBhcmVhIHR5cGUgKi8KKwkJLyogICAgICAgcGx1cyB0aGUgYWRkaXRpb25hbCBBUkVBX0xWIGNoZWNrcyBuZWVkZWQgKi8KKwkJaWYgKChzZWdfdHlwZShmaXJzdCwgcykgIT0gQVJFQV9QVikgfHwKKwkJICAgIChzZWdfdHlwZShzZWNvbmQsIHMpICE9IEFSRUFfUFYpKQorCQkJcmV0dXJuIDA7CisKKwkJd2lkdGggPSBmaXJzdC0+YXJlYV9sZW47CisKKwkJaWYgKChzZWdfcHYoZmlyc3QsIHMpICE9CisJCSAgICAgc2VnX3B2KHNlY29uZCwgcykpIHx8CisJCSAgICAoc2VnX3BlKGZpcnN0LCBzKSArIHdpZHRoICE9CisJCSAgICAgc2VnX3BlKHNlY29uZCwgcykpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJfbGlzdF9saXN0c19lcXVhbCgmZmlyc3QtPnRhZ3MsICZzZWNvbmQtPnRhZ3MpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdHJpcGVkX21lcmdlX3NlZ21lbnRzKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcxLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnMikKK3sKKwl1aW50MzJfdCBzOworCisJaWYgKCFfc3RyaXBlZF9zZWdtZW50c19jb21wYXRpYmxlKHNlZzEsIHNlZzIpKQorCQlyZXR1cm4gMDsKKworCXNlZzEtPmxlbiArPSBzZWcyLT5sZW47CisJc2VnMS0+YXJlYV9sZW4gKz0gc2VnMi0+YXJlYV9sZW47CisKKwlmb3IgKHMgPSAwOyBzIDwgc2VnMS0+YXJlYV9jb3VudDsgcysrKQorCQlpZiAoc2VnX3R5cGUoc2VnMSwgcykgPT0gQVJFQV9QVikKKwkJCW1lcmdlX3B2X3NlZ21lbnRzKHNlZ19wdnNlZyhzZWcxLCBzKSwKKwkJCQkJICBzZWdfcHZzZWcoc2VnMiwgcykpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfc3RyaXBlZF9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXZvaWQgKip0YXJnZXRfc3RhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQljb25zdCBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IGxlbiwKKwkJCQl1aW50MzJfdCAqcHZtb3ZlX21pcnJvcl9jb3VudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoIXNlZy0+YXJlYV9jb3VudCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInN0cmlwZWQgYWRkX3RhcmdldF9saW5lIGNhbGxlZCAiCisJCQkgICJ3aXRoIG5vIGFyZWFzIGZvciAlcy4iLCBzZWctPmx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzZWctPmFyZWFfY291bnQgPT0gMSkgeworCQlpZiAoIWFkZF9saW5lYXJfYXJlYV90b19kdHJlZShub2RlLCBsZW4sIHNlZy0+bHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkJICAgICAgY21kLT51c2VfbGluZWFyX3RhcmdldCwKKwkJCQkJICAgICAgc2VnLT5sdi0+dmctPm5hbWUsIHNlZy0+bHYtPm5hbWUpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmICghZG1fdHJlZV9ub2RlX2FkZF9zdHJpcGVkX3RhcmdldChub2RlLCBsZW4sCisJCQkJCQkgIHNlZy0+c3RyaXBlX3NpemUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBhZGRfYXJlYXNfbGluZShkbSwgc2VnLCBub2RlLCAwdSwgc2VnLT5hcmVhX2NvdW50KTsKK30KKworc3RhdGljIGludCBfc3RyaXBlZF90YXJnZXRfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgIHVuc2lnbmVkICphdHRyaWJ1dGVzIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0YXRpYyBpbnQgX3N0cmlwZWRfY2hlY2tlZCA9IDA7CisJc3RhdGljIGludCBfc3RyaXBlZF9wcmVzZW50ID0gMDsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWlmICghX3N0cmlwZWRfY2hlY2tlZCkgeworCQlfc3RyaXBlZF9jaGVja2VkID0gMTsKKwkJX3N0cmlwZWRfcHJlc2VudCA9IHRhcmdldF9wcmVzZW50KGNtZCwgVEFSR0VUX05BTUVfTElORUFSLCAwKSAmJgorCQkJdGFyZ2V0X3ByZXNlbnQoY21kLCBUQVJHRVRfTkFNRV9TVFJJUEVELCAwKTsKKwl9CisKKwlyZXR1cm4gX3N0cmlwZWRfcHJlc2VudDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfc3RyaXBlZF9kZXN0cm95KHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUpCit7CisJZG1fZnJlZShzZWd0eXBlKTsKK30KKworc3RhdGljIHN0cnVjdCBzZWd0eXBlX2hhbmRsZXIgX3N0cmlwZWRfb3BzID0geworCS5uYW1lID0gX3N0cmlwZWRfbmFtZSwKKwkuZGlzcGxheSA9IF9zdHJpcGVkX2Rpc3BsYXksCisJLnRleHRfaW1wb3J0X2FyZWFfY291bnQgPSBfc3RyaXBlZF90ZXh0X2ltcG9ydF9hcmVhX2NvdW50LAorCS50ZXh0X2ltcG9ydCA9IF9zdHJpcGVkX3RleHRfaW1wb3J0LAorCS50ZXh0X2V4cG9ydCA9IF9zdHJpcGVkX3RleHRfZXhwb3J0LAorCS5tZXJnZV9zZWdtZW50cyA9IF9zdHJpcGVkX21lcmdlX3NlZ21lbnRzLAorI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisJLmFkZF90YXJnZXRfbGluZSA9IF9zdHJpcGVkX2FkZF90YXJnZXRfbGluZSwKKwkudGFyZ2V0X3ByZXNlbnQgPSBfc3RyaXBlZF90YXJnZXRfcHJlc2VudCwKKyNlbmRpZgorCS5kZXN0cm95ID0gX3N0cmlwZWRfZGVzdHJveSwKK307CisKK3N0cnVjdCBzZWdtZW50X3R5cGUgKmluaXRfc3RyaXBlZF9zZWd0eXBlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGUgPSBkbV96YWxsb2Moc2l6ZW9mKCpzZWd0eXBlKSk7CisKKwlpZiAoIXNlZ3R5cGUpCisJCXJldHVybl9OVUxMOworCisJc2VndHlwZS0+b3BzID0gJl9zdHJpcGVkX29wczsKKwlzZWd0eXBlLT5uYW1lID0gU0VHX1RZUEVfTkFNRV9TVFJJUEVEOworCXNlZ3R5cGUtPmZsYWdzID0KKwkgICAgU0VHX0NBTl9TUExJVCB8IFNFR19BUkVBU19TVFJJUEVEIHwgU0VHX0ZPUk1BVDFfU1VQUE9SVDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIiwgc2VndHlwZS0+bmFtZSk7CisKKwlyZXR1cm4gc2VndHlwZTsKK30KZGlmZiAtLWdpdCBhL2xpYi90aGluLy5leHBvcnRlZF9zeW1ib2xzIGIvbGliL3RoaW4vLmV4cG9ydGVkX3N5bWJvbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5MmM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90aGluLy5leHBvcnRlZF9zeW1ib2xzCkBAIC0wLDAgKzEgQEAKK2luaXRfc2VndHlwZQpkaWZmIC0tZ2l0IGEvbGliL3RoaW4vTWFrZWZpbGUuaW4gYi9saWIvdGhpbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNmMTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RoaW4vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9IHRoaW4uYworCitMSUJfU0hBUkVEID0gbGlibHZtMnRoaW4uJChMSUJfU1VGRklYKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2luc3RhbGw6IGluc3RhbGxfbGliX3NoYXJlZF9wbHVnaW4KZGlmZiAtLWdpdCBhL2xpYi90aGluL3RoaW4uYyBiL2xpYi90aGluL3RoaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI5NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3RoaW4vdGhpbi5jCkBAIC0wLDAgKzEsODMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJ0ZXh0X2V4cG9ydC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisjaW5jbHVkZSAic3RyX2xpc3QuaCIKKworLyogRG0ga2VybmVsIG1vZHVsZSBuYW1lIGZvciB0aGluIHByb3Zpc2lvbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyIF90aGluX3Bvb2xfbW9kdWxlW10gPSAidGhpbi1wb29sIjsKK3N0YXRpYyBjb25zdCBjaGFyIF90aGluX21vZHVsZVtdID0gInRoaW4iOworCisvKgorICogTWFjcm8gdXNlZCBhcyByZXR1cm4gYXJndW1lbnQgLSByZXR1cm5zIDAuCisgKiByZXR1cm4gaXMgbGVmdCB0byBiZSB3cml0dGVuIGluIHRoZSBmdW5jdGlvbiBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgorICovCisjZGVmaW5lIFNFR19MT0dfRVJST1IodCwgcC4uLikgXAorCWxvZ19lcnJvcih0ICIgc2VnbWVudCAlcyBvZiBsb2dpY2FsIHZvbHVtZSAlcy4iLCAjIyBwLCBcCisJCSAgZG1fY29uZmlnX3BhcmVudF9uYW1lKHNuKSwgc2VnLT5sdi0+bmFtZSksIDA7CisKKy8qIFRPRE86IHVzaW5nIHN0YXRpYyBmaWVsZCBoZXJlLCBtYXliZSBzaG91bGQgYmUgYSBwYXJ0IG9mIHNlZ21lbnRfdHlwZSAqLworc3RhdGljIHVuc2lnbmVkIF9mZWF0dXJlX21hc2s7CisKK3N0YXRpYyB2b2lkIF90aGluX3Bvb2xfZGlzcGxheShjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnKQoreworCWxvZ19wcmludCgiICBDaHVuayBzaXplXHRcdCVzIiwKKwkJICBkaXNwbGF5X3NpemUoc2VnLT5sdi0+dmctPmNtZCwgc2VnLT5jaHVua19zaXplKSk7CisJbG9nX3ByaW50KCIgIERpc2NhcmRzXHRcdCVzIiwgZ2V0X3Bvb2xfZGlzY2FyZHNfbmFtZShzZWctPmRpc2NhcmRzKSk7CisJbG9nX3ByaW50KCIgIFRoaW4gY291bnRcdFx0JXUiLAorCQkgIGRtX2xpc3Rfc2l6ZSgmc2VnLT5sdi0+c2Vnc191c2luZ190aGlzX2x2KSk7CisJbG9nX3ByaW50KCIgIFRyYW5zYWN0aW9uIElEXHQlIiBQUkl1NjQsIHNlZy0+dHJhbnNhY3Rpb25faWQpOworCWxvZ19wcmludCgiICBaZXJvIG5ldyBibG9ja3NcdCVzIiwKKwkJICBzZWctPnplcm9fbmV3X2Jsb2NrcyA/ICJ5ZXMiIDogIm5vIik7CisKKwlsb2dfcHJpbnQoIiAiKTsKK30KKworc3RhdGljIGludCBfdGhpbl9wb29sX2FkZF9tZXNzYWdlKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICBjb25zdCBjaGFyICprZXksCisJCQkJICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuKQoreworCWNvbnN0IGNoYXIgKmx2X25hbWUgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBOVUxMOworCXVpbnQzMl90IGRlbGV0ZV9pZCA9IDA7CisJZG1fdGhpbl9tZXNzYWdlX3QgdHlwZTsKKworCS8qIE1lc3NhZ2UgbXVzdCBoYXZlIG9ubHkgb25lIGZyb206IGNyZWF0ZSwgZGVsZXRlICovCisJaWYgKGRtX2NvbmZpZ19nZXRfc3RyKHNuLCAiY3JlYXRlIiwgJmx2X25hbWUpKSB7CisJCWlmICghKGx2ID0gZmluZF9sdihzZWctPmx2LT52ZywgbHZfbmFtZSkpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVua25vd24gTFYgJXMgZm9yIGNyZWF0ZSBtZXNzYWdlIGluIiwKKwkJCQkJICAgICBsdl9uYW1lKTsKKwkJLyogRklYTUU6IHN3aXRjaCB0byBfU05BUCBsYXRlciwgaWYgdGhlIGNyZWF0ZWQgTFYgaGFzIGFuIG9yaWdpbiAqLworCQl0eXBlID0gRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOOworCX0gZWxzZSBpZiAoZG1fY29uZmlnX2dldF91aW50MzIoc24sICJkZWxldGUiLCAmZGVsZXRlX2lkKSkKKwkJdHlwZSA9IERNX1RISU5fTUVTU0FHRV9ERUxFVEU7CisJZWxzZQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBtZXNzYWdlIGluIik7CisKKwlpZiAoIWF0dGFjaF9wb29sX21lc3NhZ2Uoc2VnLCB0eXBlLCBsdiwgZGVsZXRlX2lkLCAxKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9wb29sX3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnNuLAorCQkJCSAgc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2ggX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3QgY2hhciAqbHZfbmFtZTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfZGF0YV9sdiwgKnBvb2xfbWV0YWRhdGFfbHY7CisJY29uc3QgY2hhciAqZGlzY2FyZHNfc3RyID0gTlVMTDsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoc24sICJtZXRhZGF0YSIsICZsdl9uYW1lKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIk1ldGFkYXRhIG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKworCWlmICghKHBvb2xfbWV0YWRhdGFfbHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBsdl9uYW1lKSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJVbmtub3duIG1ldGFkYXRhICVzIGluIiwgbHZfbmFtZSk7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfc3RyKHNuLCAicG9vbCIsICZsdl9uYW1lKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlBvb2wgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCisJaWYgKCEocG9vbF9kYXRhX2x2ID0gZmluZF9sdihzZWctPmx2LT52ZywgbHZfbmFtZSkpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBwb29sICVzIGluIiwgbHZfbmFtZSk7CisKKwlpZiAoIWF0dGFjaF9wb29sX2RhdGFfbHYoc2VnLCBwb29sX2RhdGFfbHYpKQorCQlyZXR1cm5fMDsKKworCWlmICghYXR0YWNoX3Bvb2xfbWV0YWRhdGFfbHYoc2VnLCBwb29sX21ldGFkYXRhX2x2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfdWludDY0KHNuLCAidHJhbnNhY3Rpb25faWQiLCAmc2VnLT50cmFuc2FjdGlvbl9pZCkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJDb3VsZCBub3QgcmVhZCB0cmFuc2FjdGlvbl9pZCBmb3IiKTsKKworCWlmICghZG1fY29uZmlnX2dldF91aW50MzIoc24sICJjaHVua19zaXplIiwgJnNlZy0+Y2h1bmtfc2l6ZSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJDb3VsZCBub3QgcmVhZCBjaHVua19zaXplIik7CisKKwlpZiAoZG1fY29uZmlnX2hhc19ub2RlKHNuLCAiZGlzY2FyZHMiKSAmJgorCSAgICAhZG1fY29uZmlnX2dldF9zdHIoc24sICJkaXNjYXJkcyIsICZkaXNjYXJkc19zdHIpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ291bGQgbm90IHJlYWQgZGlzY2FyZHMgZm9yIik7CisKKwlpZiAoIWRpc2NhcmRzX3N0cikKKwkJc2VnLT5kaXNjYXJkcyA9IFRISU5fRElTQ0FSRFNfSUdOT1JFOworCWVsc2UgaWYgKCFzZXRfcG9vbF9kaXNjYXJkcygmc2VnLT5kaXNjYXJkcywgZGlzY2FyZHNfc3RyKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIkRpc2NhcmRzIG9wdGlvbiB1bnN1cHBvcnRlZCBmb3IiKTsKKworCWlmICgoc2VnLT5jaHVua19zaXplIDwgRE1fVEhJTl9NSU5fREFUQV9CTE9DS19TSVpFKSB8fAorCSAgICAoc2VnLT5jaHVua19zaXplID4gRE1fVEhJTl9NQVhfREFUQV9CTE9DS19TSVpFKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVuc3VwcG9ydGVkIHZhbHVlICV1IGZvciBjaHVua19zaXplIiwKKwkJCQkgICAgIHNlZy0+ZGV2aWNlX2lkKTsKKworCWlmIChkbV9jb25maWdfaGFzX25vZGUoc24sICJ6ZXJvX25ld19ibG9ja3MiKSAmJgorCSAgICAhZG1fY29uZmlnX2dldF91aW50MzIoc24sICJ6ZXJvX25ld19ibG9ja3MiLCAmc2VnLT56ZXJvX25ld19ibG9ja3MpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ291bGQgbm90IHJlYWQgemVyb19uZXdfYmxvY2tzIGZvciIpOworCisJLyogUmVhZCBtZXNzYWdlcyAqLworCWZvciAoOyBzbjsgc24gPSBzbi0+c2liKQorCQlpZiAoIShzbi0+dikgJiYgIV90aGluX3Bvb2xfYWRkX21lc3NhZ2Uoc2VnLCBzbi0+a2V5LCBzbi0+Y2hpbGQpKQorCQkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9wb29sX3RleHRfaW1wb3J0X2FyZWFfY291bnQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpzbiwKKwkJCQkJICAgICB1aW50MzJfdCAqYXJlYV9jb3VudCkKK3sKKwkqYXJlYV9jb3VudCA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9wb29sX3RleHRfZXhwb3J0KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIHN0cnVjdCBmb3JtYXR0ZXIgKmYpCit7CisJdW5zaWduZWQgY250ID0gMDsKKwljb25zdCBzdHJ1Y3QgbHZfdGhpbl9tZXNzYWdlICp0bXNnOworCisJb3V0ZihmLCAibWV0YWRhdGEgPSBcIiVzXCIiLCBzZWctPm1ldGFkYXRhX2x2LT5uYW1lKTsKKwlvdXRmKGYsICJwb29sID0gXCIlc1wiIiwgc2VnX2x2KHNlZywgMCktPm5hbWUpOworCW91dGYoZiwgInRyYW5zYWN0aW9uX2lkID0gJSIgUFJJdTY0LCBzZWctPnRyYW5zYWN0aW9uX2lkKTsKKwlvdXRzaXplKGYsICh1aW50NjRfdCkgc2VnLT5jaHVua19zaXplLAorCQkiY2h1bmtfc2l6ZSA9ICV1Iiwgc2VnLT5jaHVua19zaXplKTsKKworCXN3aXRjaCAoc2VnLT5kaXNjYXJkcykgeworCWNhc2UgVEhJTl9ESVNDQVJEU19QQVNTRE9XTjoKKwljYXNlIFRISU5fRElTQ0FSRFNfTk9fUEFTU0RPV046CisJY2FzZSBUSElOX0RJU0NBUkRTX0lHTk9SRToKKwkJb3V0ZihmLCAiZGlzY2FyZHMgPSBcIiVzXCIiLCBnZXRfcG9vbF9kaXNjYXJkc19uYW1lKHNlZy0+ZGlzY2FyZHMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbnZhbGlkIGRpc2NhcmRzIHZhbHVlICVkLiIsIHNlZy0+ZGlzY2FyZHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2VnLT56ZXJvX25ld19ibG9ja3MpCisJCW91dGYoZiwgInplcm9fbmV3X2Jsb2NrcyA9IDEiKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh0bXNnLCAmc2VnLT50aGluX21lc3NhZ2VzKSB7CisJCS8qIEV4dHJhIHZhbGlkYXRpb24gKi8KKwkJc3dpdGNoICh0bXNnLT50eXBlKSB7CisJCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9TTkFQOgorCQljYXNlIERNX1RISU5fTUVTU0FHRV9DUkVBVEVfVEhJTjoKKwkJCWlmICghbHZfaXNfdGhpbl92b2x1bWUodG1zZy0+dS5sdikpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IKKwkJCQkJICAiTFYgJXMgaXMgbm90IGEgdGhpbiB2b2x1bWUuIiwKKwkJCQkJICB0bXNnLT51Lmx2LT5uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWNudCkKKwkJCW91dG5sKGYpOworCisJCW91dGYoZiwgIm1lc3NhZ2UlZCB7IiwgKytjbnQpOworCQlvdXRfaW5jX2luZGVudChmKTsKKworCQlzd2l0Y2ggKHRtc2ctPnR5cGUpIHsKKwkJY2FzZSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1NOQVA6CisJCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOOgorCQkJb3V0ZihmLCAiY3JlYXRlID0gXCIlc1wiIiwgdG1zZy0+dS5sdi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBETV9USElOX01FU1NBR0VfREVMRVRFOgorCQkJb3V0ZihmLCAiZGVsZXRlID0gJWQiLCB0bXNnLT51LmRlbGV0ZV9pZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUGFzc2VkIHVuc3VwcG9ydGVkIG1lc3NhZ2UuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCW91dF9kZWNfaW5kZW50KGYpOworCQlvdXRmKGYsICJ9Iik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfdGhpbl90YXJnZXRfcHJlc2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQljb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXVuc2lnbmVkICphdHRyaWJ1dGVzKTsKKworc3RhdGljIGludCBfdGhpbl9wb29sX21vZHVsZXNfbmVlZGVkKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKm1vZHVsZXMpCit7CisJaWYgKCFzdHJfbGlzdF9hZGQobWVtLCBtb2R1bGVzLCBfdGhpbl9wb29sX21vZHVsZSkpIHsKKwkJbG9nX2Vycm9yKCJTdHJpbmcgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgdGhpbl9wb29sLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9tb2R1bGVzX25lZWRlZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJc3RydWN0IGRtX2xpc3QgKm1vZHVsZXMpCit7CisJaWYgKCFfdGhpbl9wb29sX21vZHVsZXNfbmVlZGVkKG1lbSwgc2VnLCBtb2R1bGVzKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXN0cl9saXN0X2FkZChtZW0sIG1vZHVsZXMsIF90aGluX21vZHVsZSkpIHsKKwkJbG9nX2Vycm9yKCJTdHJpbmcgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgdGhpbi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5fcG9vbF9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICAgIHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgICAgIHZvaWQgKip0YXJnZXRfc3RhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHZfYWN0aXZhdGVfb3B0cyAqbGFvcHRzLAorCQkJCSAgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IGxlbiwKKwkJCQkgICAgICB1aW50MzJfdCAqcHZtb3ZlX21pcnJvcl9jb3VudCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdGF0aWMgaW50IF9ub19kaXNjYXJkcyA9IDA7CisJc3RhdGljIGludCBfbm9fZXJyb3JfaWZfbm9fc3BhY2UgPSAwOworCWNoYXIgKm1ldGFkYXRhX2RsaWQsICpwb29sX2RsaWQ7CisJY29uc3Qgc3RydWN0IGx2X3RoaW5fbWVzc2FnZSAqbG1zZzsKKwljb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbjsKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisJdWludDY0X3QgdHJhbnNhY3Rpb25faWQgPSAwOworCXVuc2lnbmVkIGF0dHI7CisJdWludDY0X3QgbG93X3dhdGVyX21hcms7CisJaW50IHRocmVzaG9sZDsKKworCWlmICghX3RoaW5fdGFyZ2V0X3ByZXNlbnQoY21kLCBOVUxMLCAmYXR0cikpCisJCXJldHVybl8wOworCisJaWYgKCFzZWctPm1ldGFkYXRhX2x2KSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVGhpbiBwb29sIGlzIG1pc3NpbmcgbWV0YWRhdGEgZGV2aWNlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShhdHRyICYgVEhJTl9GRUFUVVJFX0JMT0NLX1NJWkUpICYmCisJICAgICFpc19wb3dlcl9vZl8yKHNlZy0+Y2h1bmtfc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJUaGluIHBvb2wgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgJXMgY2h1bmsgc2l6ZSAobmVlZHMiCisJCQkgICIga2VybmVsID49IDMuNikuIiwgZGlzcGxheV9zaXplKGNtZCwgc2VnLT5jaHVua19zaXplKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKG1ldGFkYXRhX2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgc2VnLT5tZXRhZGF0YV9sdiwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHV1aWQgZm9yIG1ldGFkYXRhIExWICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZy0+bWV0YWRhdGFfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEocG9vbF9kbGlkID0gYnVpbGRfZG1fdXVpZChtZW0sIHNlZ19sdihzZWcsIDApLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYnVpbGQgdXVpZCBmb3IgcG9vbCBMViAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShzZWdfbHYoc2VnLCAwKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aHJlc2hvbGQgPSBmaW5kX2NvbmZpZ190cmVlX2ludChzZWctPmx2LT52Zy0+Y21kLAorCQkJCQkgYWN0aXZhdGlvbl90aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGRfQ0ZHLAorCQkJCQkgbHZfY29uZmlnX3Byb2ZpbGUoc2VnLT5sdikpOworCWlmICh0aHJlc2hvbGQgPCA1MCkKKwkJdGhyZXNob2xkID0gNTA7CisJaWYgKHRocmVzaG9sZCA8IDEwMCkKKwkJLyogVHJhbnNsYXRlIHRvIG51bWJlciBvZiBmcmVlIHBvb2wgYmxvY2tzIHRvIHRyaWdnZXIgd2F0ZXJtYXJrICovCisJCWxvd193YXRlcl9tYXJrID0gbGVuIC8gc2VnLT5jaHVua19zaXplICogKDEwMCAtIHRocmVzaG9sZCkgLyAxMDA7CisJZWxzZQorCQlsb3dfd2F0ZXJfbWFyayA9IDA7CisKKwlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX3RhcmdldChub2RlLCBsZW4sCisJCQkJCSAgICAgICBzZWctPnRyYW5zYWN0aW9uX2lkLAorCQkJCQkgICAgICAgbWV0YWRhdGFfZGxpZCwgcG9vbF9kbGlkLAorCQkJCQkgICAgICAgc2VnLT5jaHVua19zaXplLCBsb3dfd2F0ZXJfbWFyaywKKwkJCQkJICAgICAgIHNlZy0+emVyb19uZXdfYmxvY2tzID8gMCA6IDEpKQorCQlyZXR1cm5fMDsKKworCWlmIChhdHRyICYgVEhJTl9GRUFUVVJFX0RJU0NBUkRTKSB7CisJCS8qIFVzZSBpZ25vcmUgZm9yIGRpc2NhcmRzIGlnbm9yZSBvciBub24tcG93ZXItb2YtMiBjaHVua19zaXplIGFuZCA8MS41IHRhcmdldCAqLworCQkvKiBGSVhNRTogQ2hlY2sgd2hldGhlciB1bmRlcmx5aW5nIGRldiBzdXBwb3J0cyBkaXNjYXJkcyAqLworCQlpZiAoKCghKGF0dHIgJiBUSElOX0ZFQVRVUkVfRElTQ0FSRFNfTk9OX1BPV0VSXzIpICYmCisJCSAgICAgICFpc19wb3dlcl9vZl8yKHNlZy0+Y2h1bmtfc2l6ZSkpIHx8CisJCSAgICAgKHNlZy0+ZGlzY2FyZHMgPT0gVEhJTl9ESVNDQVJEU19JR05PUkUpKSkgeworCQkJaWYgKCFkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9kaXNjYXJkKG5vZGUsIDEsIDApKQorCQkJCXJldHVybl8wOworCQl9IGVsc2UgaWYgKCFkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9kaXNjYXJkKG5vZGUsIDAsCisJCQkJCQkJICAgICAgIChzZWctPmRpc2NhcmRzID09IFRISU5fRElTQ0FSRFNfTk9fUEFTU0RPV04pKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSBpZiAoc2VnLT5kaXNjYXJkcyAhPSBUSElOX0RJU0NBUkRTX0lHTk9SRSkKKwkJbG9nX3dhcm5fc3VwcHJlc3MoX25vX2Rpc2NhcmRzKyssICJXQVJOSU5HOiBUaGluIHBvb2wgdGFyZ2V0IGRvZXMgIgorCQkJCSAgIm5vdCBzdXBwb3J0IGRpc2NhcmRzIChuZWVkcyBrZXJuZWwgPj0gMy40KS4iKTsKKworCWlmIChhdHRyICYgVEhJTl9GRUFUVVJFX0VSUk9SX0lGX05PX1NQQUNFKQorCQlkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9lcnJvcl9pZl9ub19zcGFjZShub2RlLCBsdl9pc19lcnJvcl93aGVuX2Z1bGwoc2VnLT5sdikpOworCWVsc2UgaWYgKGx2X2lzX2Vycm9yX3doZW5fZnVsbChzZWctPmx2KSkKKwkJbG9nX3dhcm5fc3VwcHJlc3MoX25vX2Vycm9yX2lmX25vX3NwYWNlKyssICJXQVJOSU5HOiBUaGluIHBvb2wgdGFyZ2V0IGRvZXMgIgorCQkJCSAgIm5vdCBzdXBwb3J0IGVycm9yIGlmIG5vIHNwYWNlIChuZWVkcyB2ZXJzaW9uID49IDEuMTApLiIpOworCisJLyoKKwkgKiBBZGQgbWVzc2FnZXMgb25seSBmb3IgYWN0aXZhdGlvbiB0cmVlLgorCSAqIE90aGVyd2lzZSBhdm9pZCBjaGVja2luZyBmb3IgZXhpc3RlbmNlIG9mIHN1c3BlbmRlZCBvcmlnaW4uCisJICogQWxzbyB0cmFuc2F0aW9uX2lkIGlzIGNoZWNrZWQgb25seSB3aGVuIHNuYXBzaG90IG9yaWdpbiBpcyBhY3RpdmUuCisJICogKFRoaXMgbWlnaHQgY2hhbmdlIGxhdGVyKQorCSAqLworCWlmICghbGFvcHRzLT5zZW5kX21lc3NhZ2VzKQorCQlyZXR1cm4gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsbXNnLCAmc2VnLT50aGluX21lc3NhZ2VzKSB7CisJCXN3aXRjaCAobG1zZy0+dHlwZSkgeworCQljYXNlIERNX1RISU5fTUVTU0FHRV9DUkVBVEVfVEhJTjoKKwkJCW9yaWdpbiA9IGZpcnN0X3NlZyhsbXNnLT51Lmx2KS0+b3JpZ2luOworCQkJLyogQ2hlY2sgaWYgdGhlIG9yaWdpbiBpcyBzdXNwZW5kZWQgKi8KKwkJCWlmIChvcmlnaW4gJiYgbHZfaW5mbyhjbWQsIG9yaWdpbiwgMSwgJmluZm8sIDAsIDApICYmCisJCQkgICAgaW5mby5leGlzdHMgJiYgIWluZm8uc3VzcGVuZGVkKSB7CisJCQkJLyogT3JpZ2luIGlzIG5vdCBzdXNwZW5kZWQsIGJ1dCB0aGUgdHJhbnNhY3Rpb24gbWF5IGhhdmUgYmVlbgorCQkJCSAqIGFscmVhZHkgdHJhbnNmZXJlZCwgc28gdGVzdCBmb3IgdHJhbnNhY3Rpb25faWQgYW5kCisJCQkJICogYWxsb3cgdG8gcGFzcyBpbiB0aGUgbWVzc2FnZSBmb3IgZG10cmVlIHByb2Nlc3NpbmcKKwkJCQkgKiBzbyBpdCB3aWxsIHNraXAgYWxsIG1lc3NhZ2VzIGxhdGVyLgorCQkJCSAqLworCQkJCWlmICghbHZfdGhpbl9wb29sX3RyYW5zYWN0aW9uX2lkKHNlZy0+bHYsICZ0cmFuc2FjdGlvbl9pZCkpCisJCQkJCXJldHVybl8wOyAvKiBUaGluIHBvb2wgc2hvdWxkIGV4aXN0IGFuZCB3b3JrICovCisJCQkJaWYgKCh0cmFuc2FjdGlvbl9pZCArIDEpICE9IHNlZy0+dHJhbnNhY3Rpb25faWQpIHsKKwkJCQkJbG9nX2Vycm9yKCJDYW4ndCBjcmVhdGUgc25hcHNob3QgJXMgYXMgb3JpZ2luICVzIGlzIG5vdCBzdXNwZW5kZWQuIiwKKwkJCQkJCSAgbG1zZy0+dS5sdi0+bmFtZSwgb3JpZ2luLT5uYW1lKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlRoaW4gcG9vbCBjcmVhdGVfJXMgJXMuIiwgKCFvcmlnaW4pID8gInRoaW4iIDogInNuYXAiLCBsbXNnLT51Lmx2LT5uYW1lKTsKKwkJCWlmICghZG1fdHJlZV9ub2RlX2FkZF90aGluX3Bvb2xfbWVzc2FnZShub2RlLAorCQkJCQkJCQkoIW9yaWdpbikgPyBsbXNnLT50eXBlIDogRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9TTkFQLAorCQkJCQkJCQlmaXJzdF9zZWcobG1zZy0+dS5sdiktPmRldmljZV9pZCwKKwkJCQkJCQkJKCFvcmlnaW4pID8gMCA6IGZpcnN0X3NlZyhvcmlnaW4pLT5kZXZpY2VfaWQpKQorCQkJCXJldHVybl8wOworCQkJYnJlYWs7CisJCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0RFTEVURToKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJUaGluIHBvb2wgZGVsZXRlICV1LiIsIGxtc2ctPnUuZGVsZXRlX2lkKTsKKwkJCWlmICghZG1fdHJlZV9ub2RlX2FkZF90aGluX3Bvb2xfbWVzc2FnZShub2RlLAorCQkJCQkJCQlsbXNnLT50eXBlLAorCQkJCQkJCQlsbXNnLT51LmRlbGV0ZV9pZCwgMCkpCisJCQkJcmV0dXJuXzA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiVW5zdXBwb3J0ZWQgbWVzc2FnZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZzZWctPnRoaW5fbWVzc2FnZXMpKSB7CisJCS8qIE1lc3NhZ2VzIHdlcmUgcGFzc2VkLCBtb2RpZnkgdHJhbnNhY3Rpb25faWQgYXMgdGhlIGxhc3Qgb25lICovCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJUaGluIHBvb2wgc2V0IHRyYW5zYWN0aW9uIGlkICUiIFBSSXU2NCAiLiIsIHNlZy0+dHJhbnNhY3Rpb25faWQpOworCQlpZiAoIWRtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX21lc3NhZ2Uobm9kZSwKKwkJCQkJCQlETV9USElOX01FU1NBR0VfU0VUX1RSQU5TQUNUSU9OX0lELAorCQkJCQkJCXNlZy0+dHJhbnNhY3Rpb25faWQgLSAxLAorCQkJCQkJCXNlZy0+dHJhbnNhY3Rpb25faWQpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5fcG9vbF90YXJnZXRfcGVyY2VudCh2b2lkICoqdGFyZ2V0X3N0YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgZG1fcGVyY2VudF90ICpwZXJjZW50LAorCQkJCSAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgIHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywKKwkJCQkgICAgIGNoYXIgKnBhcmFtcywKKwkJCQkgICAgIHVpbnQ2NF90ICp0b3RhbF9udW1lcmF0b3IsCisJCQkJICAgICB1aW50NjRfdCAqdG90YWxfZGVub21pbmF0b3IpCit7CisJc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKnM7CisKKwlpZiAoIWRtX2dldF9zdGF0dXNfdGhpbl9wb29sKG1lbSwgcGFyYW1zLCAmcykpCisJCXJldHVybl8wOworCisJaWYgKHMtPmZhaWwgfHwgcy0+ZXJyb3IpCisJCSpwZXJjZW50ID0gRE1fUEVSQ0VOVF9JTlZBTElEOworCS8qIFdpdGggJ3NlZycgcmVwb3J0IG1ldGFkYXRhIHBlcmNlbnQsIG90aGVyd2ljZSBkYXRhIHBlcmNlbnQgKi8KKwllbHNlIGlmIChzZWcpIHsKKwkJKnBlcmNlbnQgPSBkbV9tYWtlX3BlcmNlbnQocy0+dXNlZF9tZXRhZGF0YV9ibG9ja3MsCisJCQkJCSAgIHMtPnRvdGFsX21ldGFkYXRhX2Jsb2Nrcyk7CisJCSp0b3RhbF9udW1lcmF0b3IgKz0gcy0+dXNlZF9tZXRhZGF0YV9ibG9ja3M7CisJCSp0b3RhbF9kZW5vbWluYXRvciArPSBzLT50b3RhbF9tZXRhZGF0YV9ibG9ja3M7CisJfSBlbHNlIHsKKwkJKnBlcmNlbnQgPSBkbV9tYWtlX3BlcmNlbnQocy0+dXNlZF9kYXRhX2Jsb2NrcywKKwkJCQkJICAgcy0+dG90YWxfZGF0YV9ibG9ja3MpOworCQkqdG90YWxfbnVtZXJhdG9yICs9IHMtPnVzZWRfZGF0YV9ibG9ja3M7CisJCSp0b3RhbF9kZW5vbWluYXRvciArPSBzLT50b3RhbF9kYXRhX2Jsb2NrczsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworIyAgaWZkZWYgRE1FVkVOVEQKK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0X3RoaW5fZHNvX3BhdGgoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJcmV0dXJuIGdldF9tb25pdG9yX2Rzb19wYXRoKGNtZCwgZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBkbWV2ZW50ZF90aGluX2xpYnJhcnlfQ0ZHLCBOVUxMKSk7Cit9CisKKy8qIEZJWE1FIENhY2hlIHRoaXMgKi8KK3N0YXRpYyBpbnQgX3RhcmdldF9yZWdpc3RlcmVkKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCAqcGVuZGluZykKK3sKKwlyZXR1cm4gdGFyZ2V0X3JlZ2lzdGVyZWRfd2l0aF9kbWV2ZW50ZChzZWctPmx2LT52Zy0+Y21kLAorCQkJCQkgICAgICAgX2dldF90aGluX2Rzb19wYXRoKHNlZy0+bHYtPnZnLT5jbWQpLAorCQkJCQkgICAgICAgc2VnLT5sdiwgcGVuZGluZyk7Cit9CisKKy8qIEZJWE1FIFRoaXMgZ2V0cyBydW4gd2hpbGUgc3VzcGVuZGVkIGFuZCBwZXJmb3JtcyBiYW5uZWQgb3BlcmF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgX3RhcmdldF9zZXRfZXZlbnRzKHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGludCBldm1hc2ssIGludCBzZXQpCit7CisJLyogRklYTUUgTWFrZSB0aW1lb3V0ICgxMCkgY29uZmlndXJhYmxlICovCisJcmV0dXJuIHRhcmdldF9yZWdpc3Rlcl9ldmVudHMoc2VnLT5sdi0+dmctPmNtZCwKKwkJCQkgICAgICBfZ2V0X3RoaW5fZHNvX3BhdGgoc2VnLT5sdi0+dmctPmNtZCksCisJCQkJICAgICAgc2VnLT5sdiwgZXZtYXNrLCBzZXQsIDEwKTsKK30KKworc3RhdGljIGludCBfdGFyZ2V0X3JlZ2lzdGVyX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgIGludCBldmVudHMpCit7CisJcmV0dXJuIF90YXJnZXRfc2V0X2V2ZW50cyhzZWcsIGV2ZW50cywgMSk7Cit9CisKK3N0YXRpYyBpbnQgX3RhcmdldF91bnJlZ2lzdGVyX2V2ZW50cyhzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgICAgaW50IGV2ZW50cykKK3sKKwlyZXR1cm4gX3RhcmdldF9zZXRfZXZlbnRzKHNlZywgZXZlbnRzLCAwKTsKK30KKworIyAgZW5kaWYgLyogRE1FVkVOVEQgKi8KKyNlbmRpZiAvKiBERVZNQVBQRVJfU1VQUE9SVCAqLworCitzdGF0aWMgdm9pZCBfdGhpbl9kaXNwbGF5KGNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcpCit7CisJbG9nX3ByaW50KCIgIERldmljZSBJRFx0XHQldSIsIHNlZy0+ZGV2aWNlX2lkKTsKKworCWxvZ19wcmludCgiICIpOworfQorCitzdGF0aWMgaW50IF90aGluX3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQkgICAgIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpwdl9oYXNoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IGNoYXIgKmx2X25hbWU7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2LCAqb3JpZ2luID0gTlVMTCwgKmV4dGVybmFsX2x2ID0gTlVMTCwgKm1lcmdlX2x2ID0gTlVMTDsKKwlzdHJ1Y3QgZ2VuZXJpY19sb2dpY2FsX3ZvbHVtZSAqaW5kaXJlY3Rfb3JpZ2luID0gTlVMTDsKKworCWlmICghZG1fY29uZmlnX2dldF9zdHIoc24sICJ0aGluX3Bvb2wiLCAmbHZfbmFtZSkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJUaGluIHBvb2wgbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCisJaWYgKCEocG9vbF9sdiA9IGZpbmRfbHYoc2VnLT5sdi0+dmcsIGx2X25hbWUpKSkKKwkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVua25vd24gdGhpbiBwb29sICVzIGluIiwgbHZfbmFtZSk7CisKKwlpZiAoIWRtX2NvbmZpZ19nZXRfdWludDY0KHNuLCAidHJhbnNhY3Rpb25faWQiLCAmc2VnLT50cmFuc2FjdGlvbl9pZCkpCisJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJDb3VsZCBub3QgcmVhZCB0cmFuc2FjdGlvbl9pZCBmb3IiKTsKKworCWlmIChkbV9jb25maWdfaGFzX25vZGUoc24sICJvcmlnaW4iKSkgeworCQlpZiAoIWRtX2NvbmZpZ19nZXRfc3RyKHNuLCAib3JpZ2luIiwgJmx2X25hbWUpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIk9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIGluIik7CisKKwkJaWYgKCEob3JpZ2luID0gZmluZF9sdihzZWctPmx2LT52ZywgbHZfbmFtZSkpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVua25vd24gb3JpZ2luICVzIGluIiwgbHZfbmFtZSk7CisJfQorCisJaWYgKGRtX2NvbmZpZ19oYXNfbm9kZShzbiwgIm1lcmdlIikpIHsKKwkJaWYgKCFkbV9jb25maWdfZ2V0X3N0cihzbiwgIm1lcmdlIiwgJmx2X25hbWUpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIk1lcmdlIGx2IG11c3QgYmUgYSBzdHJpbmcgaW4iKTsKKwkJaWYgKCEobWVyZ2VfbHYgPSBmaW5kX2x2KHNlZy0+bHYtPnZnLCBsdl9uYW1lKSkpCisJCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5rbm93biBtZXJnZSBsdiAlcyBpbiIsIGx2X25hbWUpOworCX0KKworCWlmICghZG1fY29uZmlnX2dldF91aW50MzIoc24sICJkZXZpY2VfaWQiLCAmc2VnLT5kZXZpY2VfaWQpKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiQ291bGQgbm90IHJlYWQgZGV2aWNlX2lkIGZvciIpOworCisJaWYgKHNlZy0+ZGV2aWNlX2lkID4gRE1fVEhJTl9NQVhfREVWSUNFX0lEKQorCQlyZXR1cm4gU0VHX0xPR19FUlJPUigiVW5zdXBwb3J0ZWQgdmFsdWUgJXUgZm9yIGRldmljZV9pZCIsCisJCQkJICAgICBzZWctPmRldmljZV9pZCk7CisKKwlpZiAoZG1fY29uZmlnX2hhc19ub2RlKHNuLCAiZXh0ZXJuYWxfb3JpZ2luIikpIHsKKwkJaWYgKCFkbV9jb25maWdfZ2V0X3N0cihzbiwgImV4dGVybmFsX29yaWdpbiIsICZsdl9uYW1lKSkKKwkJCXJldHVybiBTRUdfTE9HX0VSUk9SKCJFeHRlcm5hbCBvcmlnaW4gbXVzdCBiZSBhIHN0cmluZyBpbiIpOworCisJCWlmICghKGV4dGVybmFsX2x2ID0gZmluZF9sdihzZWctPmx2LT52ZywgbHZfbmFtZSkpKQorCQkJcmV0dXJuIFNFR19MT0dfRVJST1IoIlVua25vd24gZXh0ZXJuYWwgb3JpZ2luICVzIGluIiwgbHZfbmFtZSk7CisJfQorCisJaWYgKCFhdHRhY2hfcG9vbF9sdihzZWcsIHBvb2xfbHYsIG9yaWdpbiwgaW5kaXJlY3Rfb3JpZ2luLCBtZXJnZV9sdikpCisJCXJldHVybl8wOworCisJaWYgKCFhdHRhY2hfdGhpbl9leHRlcm5hbF9vcmlnaW4oc2VnLCBleHRlcm5hbF9sdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5fdGV4dF9leHBvcnQoY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGZvcm1hdHRlciAqZikKK3sKKwlvdXRmKGYsICJ0aGluX3Bvb2wgPSBcIiVzXCIiLCBzZWctPnBvb2xfbHYtPm5hbWUpOworCW91dGYoZiwgInRyYW5zYWN0aW9uX2lkID0gJSIgUFJJdTY0LCBzZWctPnRyYW5zYWN0aW9uX2lkKTsKKwlvdXRmKGYsICJkZXZpY2VfaWQgPSAlZCIsIHNlZy0+ZGV2aWNlX2lkKTsKKworCWlmIChzZWctPmV4dGVybmFsX2x2KQorCQlvdXRmKGYsICJleHRlcm5hbF9vcmlnaW4gPSBcIiVzXCIiLCBzZWctPmV4dGVybmFsX2x2LT5uYW1lKTsKKwlpZiAoc2VnLT5vcmlnaW4pCisJCW91dGYoZiwgIm9yaWdpbiA9IFwiJXNcIiIsIHNlZy0+b3JpZ2luLT5uYW1lKTsKKworCWlmIChzZWctPm1lcmdlX2x2KQorCQlvdXRmKGYsICJtZXJnZSA9IFwiJXNcIiIsIHNlZy0+bWVyZ2VfbHYtPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorc3RhdGljIGludCBfdGhpbl9hZGRfdGFyZ2V0X2xpbmUoc3RydWN0IGRldl9tYW5hZ2VyICpkbSwKKwkJCQkgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHZvaWQgKip0YXJnZXRfc3RhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJIGNvbnN0IHN0cnVjdCBsdl9hY3RpdmF0ZV9vcHRzICpsYW9wdHMsCisJCQkJIHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IGxlbiwKKwkJCQkgdWludDMyX3QgKnB2bW92ZV9taXJyb3JfY291bnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY2hhciAqcG9vbF9kbGlkLCAqZXh0ZXJuYWxfZGxpZDsKKwl1aW50MzJfdCBkZXZpY2VfaWQgPSBzZWctPmRldmljZV9pZDsKKwl1bnNpZ25lZCBhdHRyOworCisJaWYgKCFzZWctPnBvb2xfbHYpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJTZWdtZW50ICVzIGhhcyBubyBwb29sLiIsCisJCQkgIHNlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEocG9vbF9kbGlkID0gYnVpbGRfZG1fdXVpZChtZW0sIHNlZy0+cG9vbF9sdiwgbHZfbGF5ZXIoc2VnLT5wb29sX2x2KSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHV1aWQgZm9yIHBvb2wgTFYgJXMuIiwKKwkJCSAgc2VnLT5wb29sX2x2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFsYW9wdHMtPm5vX21lcmdpbmcpIHsKKwkJaWYgKHNlZy0+bWVyZ2VfbHYpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRmFpbGVkIHRvIGFkZCBtZXJnZWQgc2VnbWVudCBvZiAlcy4iLAorCQkJCSAgc2VnLT5sdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBtZXJnZSBzdXBwb3J0IGZvciB0aGlucCBzbmFwc2hvdHMgaXMgaW1wbGVtZW50ZWQgYnkKKwkJICogc2ltcGx5IHN3YXBwaW5nIHRoZSB0aGlucCBkZXZpY2VfaWQgb2YgdGhlIHNuYXBzaG90CisJCSAqIGFuZCBvcmlnaW4uCisJCSAqLworCQlpZiAobHZfaXNfbWVyZ2luZ19vcmlnaW4oc2VnLT5sdikgJiYgc2VnX2lzX3RoaW5fdm9sdW1lKGZpbmRfc25hcHNob3Qoc2VnLT5sdikpKQorCQkJLyogb3JpZ2luLCB1c2UgbWVyZ2luZyBzbmFwc2hvdCdzIGRldmljZV9pZCAqLworCQkJZGV2aWNlX2lkID0gZmluZF9zbmFwc2hvdChzZWctPmx2KS0+ZGV2aWNlX2lkOworCX0KKworCWlmICghZG1fdHJlZV9ub2RlX2FkZF90aGluX3RhcmdldChub2RlLCBsZW4sIHBvb2xfZGxpZCwgZGV2aWNlX2lkKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgZXh0ZXJuYWwgb3JpZ2luIExWICovCisJaWYgKHNlZy0+ZXh0ZXJuYWxfbHYpIHsKKwkJaWYgKCFwb29sX3N1cHBvcnRzX2V4dGVybmFsX29yaWdpbihmaXJzdF9zZWcoc2VnLT5wb29sX2x2KSwgc2VnLT5leHRlcm5hbF9sdikpCisJCQlyZXR1cm5fMDsKKwkJaWYgKHNlZy0+ZXh0ZXJuYWxfbHYtPnNpemUgPCBzZWctPmx2LT5zaXplKSB7CisJCQkvKiBWYWxpZGF0ZSB0YXJnZXQgc3VwcG9ydHMgc21hbGxlciBleHRlcm5hbCBvcmlnaW4gKi8KKwkJCWlmICghX3RoaW5fdGFyZ2V0X3ByZXNlbnQoY21kLCBOVUxMLCAmYXR0cikgfHwKKwkJCSAgICAhKGF0dHIgJiBUSElOX0ZFQVRVUkVfRVhURVJOQUxfT1JJR0lOX0VYVEVORCkpIHsKKwkJCQlsb2dfZXJyb3IoIlRoaW4gdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgc21hbGxlciBzaXplIG9mIGV4dGVybmFsIG9yaWdpbiBMViAlcy4iLAorCQkJCQkgIHNlZy0+ZXh0ZXJuYWxfbHYtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWlmICghKGV4dGVybmFsX2RsaWQgPSBidWlsZF9kbV91dWlkKG1lbSwgc2VnLT5leHRlcm5hbF9sdiwKKwkJCQkJCSAgICBsdl9sYXllcihzZWctPmV4dGVybmFsX2x2KSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBidWlsZCB1dWlkIGZvciBleHRlcm5hbCBvcmlnaW4gTFYgJXMuIiwKKwkJCQkgIHNlZy0+ZXh0ZXJuYWxfbHYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFkbV90cmVlX25vZGVfc2V0X3RoaW5fZXh0ZXJuYWxfb3JpZ2luKG5vZGUsIGV4dGVybmFsX2RsaWQpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5fdGFyZ2V0X3BlcmNlbnQodm9pZCAqKnRhcmdldF9zdGF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlkbV9wZXJjZW50X3QgKnBlcmNlbnQsCisJCQkJc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCWNoYXIgKnBhcmFtcywKKwkJCQl1aW50NjRfdCAqdG90YWxfbnVtZXJhdG9yLAorCQkJCXVpbnQ2NF90ICp0b3RhbF9kZW5vbWluYXRvcikKK3sKKwlzdHJ1Y3QgZG1fc3RhdHVzX3RoaW4gKnM7CisJdWludDY0X3QgY3NpemU7CisKKwkvKiBTdGF0dXMgZm9yIHRoaW4gZGV2aWNlIGlzIGluIHNlY3RvcnMgKi8KKwlpZiAoIWRtX2dldF9zdGF0dXNfdGhpbihtZW0sIHBhcmFtcywgJnMpKQorCQlyZXR1cm5fMDsKKworCWlmIChzLT5mYWlsKQorCQkqcGVyY2VudCA9IERNX1BFUkNFTlRfSU5WQUxJRDsKKwllbHNlIGlmIChzZWcpIHsKKwkJLyogUG9vbCBhbGxvY2F0ZXMgd2hvbGUgY2h1bmsgc28gcm91bmQtdXAgdG8gbmVhcmVzdCBvbmUgKi8KKwkJY3NpemUgPSBmaXJzdF9zZWcoc2VnLT5wb29sX2x2KS0+Y2h1bmtfc2l6ZTsKKwkJY3NpemUgPSAoKHNlZy0+bHYtPnNpemUgKyBjc2l6ZSAtIDEpIC8gY3NpemUpICogY3NpemU7CisJCWlmIChzLT5tYXBwZWRfc2VjdG9ycyA+IGNzaXplKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTFYgJXMgbWFwcyAlcyB3aGlsZSB0aGUgc2l6ZSBpcyBvbmx5ICVzLiIsCisJCQkJIGRpc3BsYXlfbHZuYW1lKHNlZy0+bHYpLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBzLT5tYXBwZWRfc2VjdG9ycyksCisJCQkJIGRpc3BsYXlfc2l6ZShjbWQsIGNzaXplKSk7CisJCQkvKiBEb24ndCBzaG93IG5vbnNlbnNlIG51bWJlcnMgbGlrZSBpLmUuIDEwMDAlIGZ1bGwgKi8KKwkJCXMtPm1hcHBlZF9zZWN0b3JzID0gY3NpemU7CisJCX0KKworCQkqcGVyY2VudCA9IGRtX21ha2VfcGVyY2VudChzLT5tYXBwZWRfc2VjdG9ycywgY3NpemUpOworCQkqdG90YWxfZGVub21pbmF0b3IgKz0gY3NpemU7CisJfSBlbHNlIHsKKwkJLyogTm8gbHZfc2VnbWVudCBpbmZvIGhlcmUgKi8KKwkJKnBlcmNlbnQgPSBETV9QRVJDRU5UX0lOVkFMSUQ7CisJCS8qIEZJWE1FOiBVc2luZyBkZW5vbWluYXRvciB0byBwYXNzIHRoZSBtYXBwZWQgaW5mbyB1cHdhcmQ/ICovCisJCSp0b3RhbF9kZW5vbWluYXRvciArPSBzLT5oaWdoZXN0X21hcHBlZF9zZWN0b3I7CisJfQorCisJKnRvdGFsX251bWVyYXRvciArPSBzLT5tYXBwZWRfc2VjdG9yczsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90aGluX3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJdW5zaWduZWQgKmF0dHJpYnV0ZXMpCit7CisJLyogTGlzdCBvZiBmZWF0dXJlcyB3aXRoIHRoZWlyIGtlcm5lbCB0YXJnZXQgdmVyc2lvbiAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmVhdHVyZSB7CisJCXVpbnQzMl90IG1hajsKKwkJdWludDMyX3QgbWluOworCQl1bnNpZ25lZCB0aGluX2ZlYXR1cmU7CisJCWNvbnN0IGNoYXIgKmZlYXR1cmU7CisJfSBfZmVhdHVyZXNbXSA9IHsKKwkJeyAxLCAxLCBUSElOX0ZFQVRVUkVfRElTQ0FSRFMsICJkaXNjYXJkcyIgfSwKKwkJeyAxLCAxLCBUSElOX0ZFQVRVUkVfRVhURVJOQUxfT1JJR0lOLCAiZXh0ZXJuYWxfb3JpZ2luIiB9LAorCQl7IDEsIDQsIFRISU5fRkVBVFVSRV9CTE9DS19TSVpFLCAiYmxvY2tfc2l6ZSIgfSwKKwkJeyAxLCA1LCBUSElOX0ZFQVRVUkVfRElTQ0FSRFNfTk9OX1BPV0VSXzIsICJkaXNjYXJkc19ub25fcG93ZXJfMiIgfSwKKwkJeyAxLCAxMCwgVEhJTl9GRUFUVVJFX01FVEFEQVRBX1JFU0laRSwgIm1ldGFkYXRhX3Jlc2l6ZSIgfSwKKwkJeyAxLCAxMCwgVEhJTl9GRUFUVVJFX0VSUk9SX0lGX05PX1NQQUNFLCAiZXJyb3JfaWZfbm9fc3BhY2UiIH0sCisJCXsgMSwgMTMsIFRISU5fRkVBVFVSRV9FWFRFUk5BTF9PUklHSU5fRVhURU5ELCAiZXh0ZXJuYWxfb3JpZ2luX2V4dGVuZCIgfSwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgX2x2bWNvbmZbXSA9ICJnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcyI7CisJc3RhdGljIGludCBfY2hlY2tlZCA9IDA7CisJc3RhdGljIGludCBfcHJlc2VudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIF9hdHRycyA9IDA7CisJdWludDMyX3QgbWFqLCBtaW4sIHBhdGNobGV2ZWw7CisJdW5zaWduZWQgaTsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCWNvbnN0IGNoYXIgKnN0cjsKKworCWlmICghYWN0aXZhdGlvbigpKQorCQlyZXR1cm4gMDsKKworCWlmICghX2NoZWNrZWQpIHsKKwkJX2NoZWNrZWQgPSAxOworCisJCWlmICghKF9wcmVzZW50ID0gdGFyZ2V0X3ByZXNlbnQoY21kLCBfdGhpbl9wb29sX21vZHVsZSwgMSkpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKCF0YXJnZXRfdmVyc2lvbihfdGhpbl9wb29sX21vZHVsZSwgJm1haiwgJm1pbiwgJnBhdGNobGV2ZWwpKQorCQkJcmV0dXJuXzA7CisKKwkJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX2ZlYXR1cmVzKTsgKytpKQorCQkJaWYgKChtYWogPiBfZmVhdHVyZXNbaV0ubWFqKSB8fAorCQkJICAgIChtYWogPT0gX2ZlYXR1cmVzW2ldLm1haiAmJiBtaW4gPj0gX2ZlYXR1cmVzW2ldLm1pbikpCisJCQkJX2F0dHJzIHw9IF9mZWF0dXJlc1tpXS50aGluX2ZlYXR1cmU7CisJCQllbHNlCisJCQkJbG9nX3ZlcnlfdmVyYm9zZSgiVGFyZ2V0ICVzIGRvZXMgbm90IHN1cHBvcnQgJXMuIiwKKwkJCQkJCSBfdGhpbl9wb29sX21vZHVsZSwKKwkJCQkJCSBfZmVhdHVyZXNbaV0uZmVhdHVyZSk7CisJfQorCisJaWYgKGF0dHJpYnV0ZXMpIHsKKwkJaWYgKCFfZmVhdHVyZV9tYXNrKSB7CisJCQkvKiBTdXBwb3J0IHJ1bnRpbWUgbHZtLmNvbmYgY2hhbmdlcywgTi5CLiBhdm9pZCAzMiBmZWF0dXJlICovCisJCQlpZiAoKGNuID0gZmluZF9jb25maWdfdHJlZV9hcnJheShjbWQsIGdsb2JhbF90aGluX2Rpc2FibGVkX2ZlYXR1cmVzX0NGRywgTlVMTCkpKSB7CisJCQkJZm9yIChjdiA9IGNuLT52OyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQkJCQlpZiAoY3YtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgeworCQkJCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlICVzLiIsCisJCQkJCQkJICBfbHZtY29uZik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlzdHIgPSBjdi0+di5zdHI7CisJCQkJCWlmICghKnN0cikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfZmVhdHVyZXMpOyArK2kpCisJCQkJCQlpZiAoc3RyY2FzZWNtcChzdHIsIF9mZWF0dXJlc1tpXS5mZWF0dXJlKSA9PSAwKQorCQkJCQkJCV9mZWF0dXJlX21hc2sgfD0gX2ZlYXR1cmVzW2ldLnRoaW5fZmVhdHVyZTsKKwkJCQl9CisJCQl9CisJCQlfZmVhdHVyZV9tYXNrID0gfl9mZWF0dXJlX21hc2s7CisJCQlmb3IgKGkgPSAwOyBpIDwgRE1fQVJSQVlfU0laRShfZmVhdHVyZXMpOyArK2kpCisJCQkJaWYgKChfYXR0cnMgJiBfZmVhdHVyZXNbaV0udGhpbl9mZWF0dXJlKSAmJgorCQkJCSAgICAhKF9mZWF0dXJlX21hc2sgJiBfZmVhdHVyZXNbaV0udGhpbl9mZWF0dXJlKSkKKwkJCQkJbG9nX3ZlcnlfdmVyYm9zZSgiVGFyZ2V0ICVzICVzIHN1cHBvcnQgZGlzYWJsZWQgYnkgJXMiLAorCQkJCQkJCSBfdGhpbl9wb29sX21vZHVsZSwKKwkJCQkJCQkgX2ZlYXR1cmVzW2ldLmZlYXR1cmUsIF9sdm1jb25mKTsKKwkJfQorCQkqYXR0cmlidXRlcyA9IF9hdHRycyAmIF9mZWF0dXJlX21hc2s7CisJfQorCisJcmV0dXJuIF9wcmVzZW50OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF90aGluX2Rlc3Ryb3koc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSkKK3sKKwlkbV9mcmVlKHNlZ3R5cGUpOworfQorCitzdGF0aWMgc3RydWN0IHNlZ3R5cGVfaGFuZGxlciBfdGhpbl9wb29sX29wcyA9IHsKKwkuZGlzcGxheSA9IF90aGluX3Bvb2xfZGlzcGxheSwKKwkudGV4dF9pbXBvcnQgPSBfdGhpbl9wb29sX3RleHRfaW1wb3J0LAorCS50ZXh0X2ltcG9ydF9hcmVhX2NvdW50ID0gX3RoaW5fcG9vbF90ZXh0X2ltcG9ydF9hcmVhX2NvdW50LAorCS50ZXh0X2V4cG9ydCA9IF90aGluX3Bvb2xfdGV4dF9leHBvcnQsCisjaWZkZWYgREVWTUFQUEVSX1NVUFBPUlQKKwkuYWRkX3RhcmdldF9saW5lID0gX3RoaW5fcG9vbF9hZGRfdGFyZ2V0X2xpbmUsCisJLnRhcmdldF9wZXJjZW50ID0gX3RoaW5fcG9vbF90YXJnZXRfcGVyY2VudCwKKwkudGFyZ2V0X3ByZXNlbnQgPSBfdGhpbl90YXJnZXRfcHJlc2VudCwKKwkubW9kdWxlc19uZWVkZWQgPSBfdGhpbl9wb29sX21vZHVsZXNfbmVlZGVkLAorIyAgaWZkZWYgRE1FVkVOVEQKKwkudGFyZ2V0X21vbml0b3JlZCA9IF90YXJnZXRfcmVnaXN0ZXJlZCwKKwkudGFyZ2V0X21vbml0b3JfZXZlbnRzID0gX3RhcmdldF9yZWdpc3Rlcl9ldmVudHMsCisJLnRhcmdldF91bm1vbml0b3JfZXZlbnRzID0gX3RhcmdldF91bnJlZ2lzdGVyX2V2ZW50cywKKyMgIGVuZGlmIC8qIERNRVZFTlREICovCisjZW5kaWYKKwkuZGVzdHJveSA9IF90aGluX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgc3RydWN0IHNlZ3R5cGVfaGFuZGxlciBfdGhpbl9vcHMgPSB7CisJLmRpc3BsYXkgPSBfdGhpbl9kaXNwbGF5LAorCS50ZXh0X2ltcG9ydCA9IF90aGluX3RleHRfaW1wb3J0LAorCS50ZXh0X2V4cG9ydCA9IF90aGluX3RleHRfZXhwb3J0LAorI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisJLmFkZF90YXJnZXRfbGluZSA9IF90aGluX2FkZF90YXJnZXRfbGluZSwKKwkudGFyZ2V0X3BlcmNlbnQgPSBfdGhpbl90YXJnZXRfcGVyY2VudCwKKwkudGFyZ2V0X3ByZXNlbnQgPSBfdGhpbl90YXJnZXRfcHJlc2VudCwKKwkubW9kdWxlc19uZWVkZWQgPSBfdGhpbl9tb2R1bGVzX25lZWRlZCwKKyNlbmRpZgorCS5kZXN0cm95ID0gX3RoaW5fZGVzdHJveSwKK307CisKKyNpZmRlZiBUSElOX0lOVEVSTkFMCitpbnQgaW5pdF90aGluX3NlZ3R5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICpzZWdsaWIpCisjZWxzZSAvKiBTaGFyZWQgKi8KK2ludCBpbml0X211bHRpcGxlX3NlZ3R5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgc2VndHlwZV9saWJyYXJ5ICpzZWdsaWIpOworaW50IGluaXRfbXVsdGlwbGVfc2VndHlwZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBzZWd0eXBlX2xpYnJhcnkgKnNlZ2xpYikKKyNlbmRpZgoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyICpvcHM7CisJCWNvbnN0IGNoYXIgbmFtZVsxNl07CisJCXVpbnQzMl90IGZsYWdzOworCX0gcmVnX3NlZ3R5cGVzW10gPSB7CisJCXsgJl90aGluX3Bvb2xfb3BzLCAidGhpbi1wb29sIiwgU0VHX1RISU5fUE9PTCB8IFNFR19DQU5OT1RfQkVfWkVST0VEIHwKKwkJU0VHX09OTFlfRVhDTFVTSVZFIHwgU0VHX0NBTl9FUlJPUl9XSEVOX0ZVTEwgfSwKKwkJLyogRklYTUUgTWF5YmUgdXNlIFNFR19USElOX1ZPTFVNRSBpbnN0ZWFkIG9mIFNFR19WSVJUVUFMICovCisJCXsgJl90aGluX29wcywgInRoaW4iLCBTRUdfVEhJTl9WT0xVTUUgfCBTRUdfVklSVFVBTCB8IFNFR19PTkxZX0VYQ0xVU0lWRSB9CisJfTsKKworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKHJlZ19zZWd0eXBlcyk7ICsraSkgeworCQlzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJCWlmICghc2VndHlwZSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBzZWd0eXBlIiwKKwkJCQkgIHJlZ19zZWd0eXBlc1tpXS5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2VndHlwZS0+b3BzID0gcmVnX3NlZ3R5cGVzW2ldLm9wczsKKwkJc2VndHlwZS0+bmFtZSA9IHJlZ19zZWd0eXBlc1tpXS5uYW1lOworCQlzZWd0eXBlLT5mbGFncyA9IHJlZ19zZWd0eXBlc1tpXS5mbGFnczsKKworI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCisjICBpZmRlZiBETUVWRU5URAorCQlpZiAoKHJlZ19zZWd0eXBlc1tpXS5mbGFncyAmIFNFR19USElOX1BPT0wpICYmCisJCSAgICBfZ2V0X3RoaW5fZHNvX3BhdGgoY21kKSkKKwkJCXNlZ3R5cGUtPmZsYWdzIHw9IFNFR19NT05JVE9SRUQ7CisjICBlbmRpZiAvKiBETUVWRU5URCAqLworI2VuZGlmCisJCWlmICghbHZtX3JlZ2lzdGVyX3NlZ3R5cGUoc2VnbGliLCBzZWd0eXBlKSkKKwkJCS8qIHNlZ3R5cGUgaXMgYWxyZWFkeSBkZXN0cm95ZWQgKi8KKwkJCXJldHVybl8wOworCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIiwgc2VndHlwZS0+bmFtZSk7CisJfQorCisKKwkvKiBSZXNldCBtYXNrIGZvciByZWNhbGMgKi8KKwlfZmVhdHVyZV9tYXNrID0gMDsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL3Vua25vd24vdW5rbm93bi5jIGIvbGliL3Vua25vd24vdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDExYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdW5rbm93bi91bmtub3duLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJ0ZXh0X2V4cG9ydC5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCitzdGF0aWMgaW50IF91bmtub3duX3RleHRfaW1wb3J0KHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqc24sCisJCQkJc3RydWN0IGRtX2hhc2hfdGFibGUgKnB2X2hhc2gpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuZXcsICpsYXN0ID0gTlVMTCwgKmhlYWQgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY3VycmVudDsKKwlsb2dfdmVyYm9zZSgiaW1wb3J0aW5nIHVua25vd24gc2VnbWVudCIpOworCWZvciAoY3VycmVudCA9IHNuOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5zaWIpIHsKKwkJaWYgKCFzdHJjbXAoY3VycmVudC0+a2V5LCAidHlwZSIpIHx8ICFzdHJjbXAoY3VycmVudC0+a2V5LCAic3RhcnRfZXh0ZW50IikgfHwKKwkJICAgICFzdHJjbXAoY3VycmVudC0+a2V5LCAidGFncyIpIHx8ICFzdHJjbXAoY3VycmVudC0+a2V5LCAiZXh0ZW50X2NvdW50IikpCisJCQljb250aW51ZTsKKwkJbmV3ID0gZG1fY29uZmlnX2Nsb25lX25vZGVfd2l0aF9tZW0oc2VnLT5sdi0+dmctPnZnbWVtLCBjdXJyZW50LCAwKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm5fMDsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5zaWIgPSBuZXc7CisJCWlmICghaGVhZCkKKwkJCWhlYWQgPSBuZXc7CisJCWxhc3QgPSBuZXc7CisJfQorCXNlZy0+c2VndHlwZV9wcml2YXRlID0gaGVhZDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdW5rbm93bl90ZXh0X2V4cG9ydChjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCBzdHJ1Y3QgZm9ybWF0dGVyICpmKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24gPSBzZWctPnNlZ3R5cGVfcHJpdmF0ZTsKKwlyZXR1cm4gb3V0X2NvbmZpZ19ub2RlKGYsIGNuKTsKK30KKworc3RhdGljIHZvaWQgX3Vua25vd25fZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoc2VndHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF91bmtub3duX29wcyA9IHsKKwkudGV4dF9pbXBvcnQgPSBfdW5rbm93bl90ZXh0X2ltcG9ydCwKKwkudGV4dF9leHBvcnQgPSBfdW5rbm93bl90ZXh0X2V4cG9ydCwKKwkuZGVzdHJveSA9IF91bmtub3duX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3Qgc2VnbWVudF90eXBlICppbml0X3Vua25vd25fc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJaWYgKCFzZWd0eXBlKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdW5rbm93biBzZWd0eXBlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlZ3R5cGUtPm9wcyA9ICZfdW5rbm93bl9vcHM7CisJc2VndHlwZS0+bmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bGlibWVtLCBuYW1lKTsKKwlzZWd0eXBlLT5mbGFncyA9IFNFR19VTktOT1dOIHwgU0VHX1ZJUlRVQUwgfCBTRUdfQ0FOTk9UX0JFX1pFUk9FRDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIiwgc2VndHlwZS0+bmFtZSk7CisKKwlyZXR1cm4gc2VndHlwZTsKK30KZGlmZiAtLWdpdCBhL2xpYi91dWlkL3V1aWQuYyBiL2xpYi91dWlkL3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ0ZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3V1aWQvdXVpZC5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInV1aWQuaCIKKyNpbmNsdWRlICJsdm0td3JhcHBlcnMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdGF0aWMgY29uc3QgY2hhciBfY1tdID0KKyAgICAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVohIyI7CisKK3N0YXRpYyBpbnQgX2J1aWx0X2ludmVyc2U7CitzdGF0aWMgY2hhciBfaW52ZXJzZV9jWzI1Nl07CisKK2ludCBsdmlkX2NyZWF0ZSh1bmlvbiBsdmlkICpsdmlkLCBzdHJ1Y3QgaWQgKnZnaWQpCit7CisJbWVtY3B5KGx2aWQtPmlkLCB2Z2lkLCBzaXplb2YoKmx2aWQtPmlkKSk7CisJcmV0dXJuIGlkX2NyZWF0ZSgmbHZpZC0+aWRbMV0pOworfQorCit2b2lkIHV1aWRfZnJvbV9udW0oY2hhciAqdXVpZCwgdWludDMyX3QgbnVtKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSBJRF9MRU47IGk7IGktLSkgeworCQl1dWlkW2kgLSAxXSA9IF9jW251bSAlIChzaXplb2YoX2MpIC0gMSldOworCQludW0gLz0gc2l6ZW9mKF9jKSAtIDE7CisJfQorfQorCitpbnQgbHZpZF9mcm9tX2x2bnVtKHVuaW9uIGx2aWQgKmx2aWQsIHN0cnVjdCBpZCAqdmdpZCwgdWludDMyX3QgbHZfbnVtKQoreworCWludCBpOworCisJbWVtY3B5KGx2aWQtPmlkLCB2Z2lkLCBzaXplb2YoKmx2aWQtPmlkKSk7CisKKwlmb3IgKGkgPSBJRF9MRU47IGk7IGktLSkgeworCQlsdmlkLT5pZFsxXS51dWlkW2kgLSAxXSA9IF9jW2x2X251bSAlIChzaXplb2YoX2MpIC0gMSldOworCQlsdl9udW0gLz0gc2l6ZW9mKF9jKSAtIDE7CisJfQorCisJbHZpZC0+c1tzaXplb2YobHZpZC0+cykgLSAxXSA9ICdcMCc7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGx2bnVtX2Zyb21fbHZpZCh1bmlvbiBsdmlkICpsdmlkKQoreworCWludCBpLCBsdl9udW0gPSAwOworCWNoYXIgKmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgSURfTEVOOyBpKyspIHsKKwkJbHZfbnVtICo9IHNpemVvZihfYykgLSAxOworCQlpZiAoKGMgPSBzdHJjaHIoX2MsIGx2aWQtPmlkWzFdLnV1aWRbaV0pKSkKKwkJCWx2X251bSArPSAoaW50KSAoYyAtIF9jKTsKKwkJaWYgKGx2X251bSA8IDApCisJCQlsdl9udW0gPSAwOworCX0KKworCXJldHVybiBsdl9udW07Cit9CisKK2ludCBsdmlkX2luX3Jlc3RyaWN0ZWRfcmFuZ2UodW5pb24gbHZpZCAqbHZpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJRF9MRU4gLSAzOyBpKyspCisJCWlmIChsdmlkLT5pZFsxXS51dWlkW2ldICE9ICcwJykKKwkJCXJldHVybiAwOworCisJZm9yIChpID0gSURfTEVOIC0gMzsgaSA8IElEX0xFTjsgaSsrKQorCQlpZiAoIWlzZGlnaXQobHZpZC0+aWRbMV0udXVpZFtpXSkpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisKK2ludCBpZF9jcmVhdGUoc3RydWN0IGlkICppZCkKK3sKKwl1bnNpZ25lZCBpOworCXNpemVfdCBsZW4gPSBzaXplb2YoaWQtPnV1aWQpOworCisJbWVtc2V0KGlkLT51dWlkLCAwLCBsZW4pOworCWlmICghcmVhZF91cmFuZG9tKCZpZC0+dXVpZCwgbGVuKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNraXAgb3V0IHRoZSBsYXN0IDIgY2hhcnMgaW4gcmFuZG9taXplZCBjcmVhdGlvbiBmb3IgTFZNMQorCSAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWQtPnV1aWRbaV0gPSBfY1tpZC0+dXVpZFtpXSAlIChzaXplb2YoX2MpIC0gMyldOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgb25seSB2YWxpZGl0eSBjaGVjayB3ZSBoYXZlIGlzIHRoYXQKKyAqIHRoZSB1dWlkIGp1c3QgY29udGFpbnMgY2hhcmFjdGVycyBmcm9tCisgKiAnX2MnLiAgQSBjaGVja3N1bSB3b3VsZCBoYXZlIGJlZW4gbmljZSA6KAorICovCitzdGF0aWMgdm9pZCBfYnVpbGRfaW52ZXJzZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnB0cjsKKworCWlmIChfYnVpbHRfaW52ZXJzZSkKKwkJcmV0dXJuOworCisJX2J1aWx0X2ludmVyc2UgPSAxOworCW1lbXNldChfaW52ZXJzZV9jLCAwLCBzaXplb2YoX2ludmVyc2VfYykpOworCisJZm9yIChwdHIgPSBfYzsgKnB0cjsgcHRyKyspCisJCV9pbnZlcnNlX2NbKGludCkgKnB0cl0gPSAoY2hhcikgMHgxOworfQorCitzdGF0aWMgaW50IF9pZF92YWxpZChzdHJ1Y3QgaWQgKmlkLCBpbnQgZSkKK3sKKwlpbnQgaTsKKworCV9idWlsZF9pbnZlcnNlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSURfTEVOOyBpKyspCisJCWlmICghX2ludmVyc2VfY1tpZC0+dXVpZFtpXV0pIHsKKwkJCWlmIChlKQorCQkJCWxvZ19lcnJvcigiVVVJRCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAnJWMnIiwgaWQtPnV1aWRbaV0pOworCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworfQorCitpbnQgaWRfdmFsaWQoc3RydWN0IGlkICppZCkKK3sKKwlyZXR1cm4gX2lkX3ZhbGlkKGlkLCAxKTsKK30KKworCitpbnQgaWRfZXF1YWwoY29uc3Qgc3RydWN0IGlkICpsaHMsIGNvbnN0IHN0cnVjdCBpZCAqcmhzKQoreworCXJldHVybiAhbWVtY21wKGxocy0+dXVpZCwgcmhzLT51dWlkLCBzaXplb2YobGhzLT51dWlkKSk7Cit9CisKKyNkZWZpbmUgR1JPVVBTIChJRF9MRU4gLyA0KQorCitpbnQgaWRfd3JpdGVfZm9ybWF0KGNvbnN0IHN0cnVjdCBpZCAqaWQsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaW50IGksIHRvdDsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBncm91cF9zaXplW10gPSB7IDYsIDQsIDQsIDQsIDQsIDQsIDYgfTsKKworCWFzc2VydChJRF9MRU4gPT0gMzIpOworCisJLyogc3BsaXQgaW50byBncm91cHMgc2VwYXJhdGVkIGJ5IGRhc2hlcyAqLworCWlmIChzaXplIDwgKDMyICsgNiArIDEpKSB7CisJCWlmIChzaXplID4gMCkKKwkJCWJ1ZmZlclswXSA9ICdcMCc7CisJCWxvZ19lcnJvcigiQ291bGRuJ3Qgd3JpdGUgdXVpZCwgYnVmZmVyIHRvbyBzbWFsbC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMCwgdG90ID0gMDsgaSA8IDc7IGkrKykgeworCQltZW1jcHkoYnVmZmVyLCBpZC0+dXVpZCArIHRvdCwgZ3JvdXBfc2l6ZVtpXSk7CisJCWJ1ZmZlciArPSBncm91cF9zaXplW2ldOworCQl0b3QgKz0gZ3JvdXBfc2l6ZVtpXTsKKwkJKmJ1ZmZlcisrID0gJy0nOworCX0KKworCSotLWJ1ZmZlciA9ICdcMCc7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2lkX3JlYWRfZm9ybWF0KHN0cnVjdCBpZCAqaWQsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGUpCit7CisJaW50IG91dCA9IDA7CisKKwkvKiBqdXN0IHN0cmlwIG91dCBhbnkgZGFzaGVzICovCisJd2hpbGUgKCpidWZmZXIpIHsKKworCQlpZiAoKmJ1ZmZlciA9PSAnLScpIHsKKwkJCWJ1ZmZlcisrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAob3V0ID49IElEX0xFTikgeworCQkJaWYgKGUpCisJCQkJbG9nX2Vycm9yKCJUb28gbWFueSBjaGFyYWN0ZXJzIHRvIGJlIHV1aWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlkLT51dWlkW291dCsrXSA9ICpidWZmZXIrKzsKKwl9CisKKwlpZiAob3V0ICE9IElEX0xFTikgeworCQlpZiAoZSkKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgcmVhZCB1dWlkOiBpbmNvcnJlY3QgbnVtYmVyIG9mICIKKwkJCQkgICJjaGFyYWN0ZXJzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2lkX3ZhbGlkKGlkLCBlKTsKK30KKworaW50IGlkX3JlYWRfZm9ybWF0KHN0cnVjdCBpZCAqaWQsIGNvbnN0IGNoYXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gX2lkX3JlYWRfZm9ybWF0KGlkLCBidWZmZXIsIDEpOworfQorCitpbnQgaWRfcmVhZF9mb3JtYXRfdHJ5KHN0cnVjdCBpZCAqaWQsIGNvbnN0IGNoYXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gX2lkX3JlYWRfZm9ybWF0KGlkLCBidWZmZXIsIDApOworfQorCitjaGFyICppZF9mb3JtYXRfYW5kX2NvcHkoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3Qgc3RydWN0IGlkICppZCkKK3sKKwljaGFyICpyZXBzdHIgPSBOVUxMOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF9hbGxvYyhtZW0sIDQwKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdChpZCwgcmVwc3RyLCA0MCkpCisJCXJldHVybl9OVUxMOworCisJcmV0dXJuIHJlcHN0cjsKK30KZGlmZiAtLWdpdCBhL2xpYi91dWlkL3V1aWQuaCBiL2xpYi91dWlkL3V1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q3ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3V1aWQvdXVpZC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9VVUlEX0gKKyNkZWZpbmUgX0xWTV9VVUlEX0gKKworI2RlZmluZSBJRF9MRU4gMzIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdHJ1Y3QgZG1fcG9vbDsKKworc3RydWN0IGlkIHsKKwlpbnQ4X3QgdXVpZFtJRF9MRU5dOworfTsKKworLyoKKyAqIFVuaXF1ZSBsb2dpY2FsIHZvbHVtZSBpZGVudGlmaWVyCisgKiBXaXRoIGZvcm1hdDEgdGhpcyBpcyBWRyB1dWlkICsgTFYgdXVpZCArICdcMCcgKyBwYWRkaW5nCisgKi8KK3VuaW9uIGx2aWQgeworCXN0cnVjdCBpZCBpZFsyXTsKKwljaGFyIHNbMiAqIHNpemVvZihzdHJ1Y3QgaWQpICsgMSArIDddOworfTsKKworaW50IGx2aWRfZnJvbV9sdm51bSh1bmlvbiBsdmlkICpsdmlkLCBzdHJ1Y3QgaWQgKnZnaWQsIHVpbnQzMl90IGx2X251bSk7CitpbnQgbHZudW1fZnJvbV9sdmlkKHVuaW9uIGx2aWQgKmx2aWQpOworaW50IGx2aWRfaW5fcmVzdHJpY3RlZF9yYW5nZSh1bmlvbiBsdmlkICpsdmlkKTsKKwordm9pZCB1dWlkX2Zyb21fbnVtKGNoYXIgKnV1aWQsIHVpbnQzMl90IG51bSk7CisKK2ludCBsdmlkX2NyZWF0ZSh1bmlvbiBsdmlkICpsdmlkLCBzdHJ1Y3QgaWQgKnZnaWQpOworaW50IGlkX2NyZWF0ZShzdHJ1Y3QgaWQgKmlkKTsKK2ludCBpZF92YWxpZChzdHJ1Y3QgaWQgKmlkKTsKK2ludCBpZF9lcXVhbChjb25zdCBzdHJ1Y3QgaWQgKmxocywgY29uc3Qgc3RydWN0IGlkICpyaHMpOworCisvKgorICogRmlsbHMgJ2J1ZmZlcicgd2l0aCBhIG1vcmUgaHVtYW4gcmVhZGFibGUgZm9ybQorICogb2YgdGhlIHV1aWQuCisgKi8KK2ludCBpZF93cml0ZV9mb3JtYXQoY29uc3Qgc3RydWN0IGlkICppZCwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKy8qCisgKiBSZWFkcyBhIGZvcm1hdHRlZCB1dWlkLgorICovCitpbnQgaWRfcmVhZF9mb3JtYXQoc3RydWN0IGlkICppZCwgY29uc3QgY2hhciAqYnVmZmVyKTsKKy8qCisgKiBUcmllcyB0byByZWFkIGEgZm9ybWF0dGVkIHV1aWQgd2l0aG91dCBsb2dnaW5nIGVycm9yIGZvciBpbnZhbGlkIElECisgKi8KK2ludCBpZF9yZWFkX2Zvcm1hdF90cnkoc3RydWN0IGlkICppZCwgY29uc3QgY2hhciAqYnVmZmVyKTsKKworY2hhciAqaWRfZm9ybWF0X2FuZF9jb3B5KHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBpZCAqaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi96ZXJvL3plcm8uYyBiL2xpYi96ZXJvL3plcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzAyMWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3plcm8vemVyby5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgImFjdGl2YXRlLmgiCisKK3N0YXRpYyBpbnQgX3plcm9fbWVyZ2Vfc2VnbWVudHMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZzEsIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcyKQoreworCXNlZzEtPmxlbiArPSBzZWcyLT5sZW47CisJc2VnMS0+YXJlYV9sZW4gKz0gc2VnMi0+YXJlYV9sZW47CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIERFVk1BUFBFUl9TVVBQT1JUCitzdGF0aWMgaW50IF96ZXJvX2FkZF90YXJnZXRfbGluZShzdHJ1Y3QgZGV2X21hbmFnZXIgKmRtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgdm9pZCAqKnRhcmdldF9zdGF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgY29uc3Qgc3RydWN0IGx2X2FjdGl2YXRlX29wdHMgKmxhb3B0cyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSx1aW50NjRfdCBsZW4sCisJCQkJIHVpbnQzMl90ICpwdm1vdmVfbWlycm9yX2NvdW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBkbV90cmVlX25vZGVfYWRkX3plcm9fdGFyZ2V0KG5vZGUsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgX3plcm9fdGFyZ2V0X3ByZXNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQl1bnNpZ25lZCAqYXR0cmlidXRlcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdGF0aWMgaW50IF96ZXJvX2NoZWNrZWQgPSAwOworCXN0YXRpYyBpbnQgX3plcm9fcHJlc2VudCA9IDA7CisKKwlpZiAoIWFjdGl2YXRpb24oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV96ZXJvX2NoZWNrZWQpIHsKKwkJX3plcm9fY2hlY2tlZCA9IDE7CisJCV96ZXJvX3ByZXNlbnQgPSB0YXJnZXRfcHJlc2VudChjbWQsIFRBUkdFVF9OQU1FX1pFUk8sIDEpOworCX0KKworCXJldHVybiBfemVyb19wcmVzZW50OworfQorCitzdGF0aWMgaW50IF96ZXJvX21vZHVsZXNfbmVlZGVkKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKnNlZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQlzdHJ1Y3QgZG1fbGlzdCAqbW9kdWxlcykKK3sKKwlpZiAoIXN0cl9saXN0X2FkZChtZW0sIG1vZHVsZXMsIE1PRFVMRV9OQU1FX1pFUk8pKSB7CisJCWxvZ19lcnJvcigiemVybyBtb2R1bGUgc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX3plcm9fZGVzdHJveShzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlKQoreworCWRtX2ZyZWUoc2VndHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VndHlwZV9oYW5kbGVyIF96ZXJvX29wcyA9IHsKKwkubWVyZ2Vfc2VnbWVudHMgPSBfemVyb19tZXJnZV9zZWdtZW50cywKKyNpZmRlZiBERVZNQVBQRVJfU1VQUE9SVAorCS5hZGRfdGFyZ2V0X2xpbmUgPSBfemVyb19hZGRfdGFyZ2V0X2xpbmUsCisJLnRhcmdldF9wcmVzZW50ID0gX3plcm9fdGFyZ2V0X3ByZXNlbnQsCisJLm1vZHVsZXNfbmVlZGVkID0gX3plcm9fbW9kdWxlc19uZWVkZWQsCisjZW5kaWYKKwkuZGVzdHJveSA9IF96ZXJvX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3Qgc2VnbWVudF90eXBlICppbml0X3plcm9fc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlID0gZG1femFsbG9jKHNpemVvZigqc2VndHlwZSkpOworCisJaWYgKCFzZWd0eXBlKQorCQlyZXR1cm5fTlVMTDsKKworCXNlZ3R5cGUtPm9wcyA9ICZfemVyb19vcHM7CisJc2VndHlwZS0+bmFtZSA9IFNFR19UWVBFX05BTUVfWkVSTzsKKwlzZWd0eXBlLT5mbGFncyA9IFNFR19DQU5fU1BMSVQgfCBTRUdfVklSVFVBTCB8IFNFR19DQU5OT1RfQkVfWkVST0VEOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiSW5pdGlhbGlzZWQgc2VndHlwZTogJXMiLCBzZWd0eXBlLT5uYW1lKTsKKworCXJldHVybiBzZWd0eXBlOworfQpkaWZmIC0tZ2l0IGEvbGliZGFlbW9uL01ha2VmaWxlLmluIGIvbGliZGFlbW9uL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmUxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCisuUEhPTlk6IGNsaWVudCBzZXJ2ZXIKKworU1VCRElSUyArPSBjbGllbnQKKworaWZlcSAoQEJVSUxEX0xWTUVUQURALHllcykKKyAgU1VCRElSUyArPSBzZXJ2ZXIKK3NlcnZlcjogY2xpZW50CitlbHNlIGlmZXEgKEBCVUlMRF9MVk1QT0xMREAseWVzKQorICBTVUJESVJTICs9IHNlcnZlcgorc2VydmVyOiBjbGllbnQKK2VuZGlmCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxkaXN0Y2xlYW4pCisgIFNVQkRJUlMgPSBjbGllbnQgc2VydmVyCitlbmRpZgorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKZGlmZiAtLWdpdCBhL2xpYmRhZW1vbi9jbGllbnQvTWFrZWZpbGUuaW4gYi9saWJkYWVtb24vY2xpZW50L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODI4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vY2xpZW50L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK0xJQl9TVEFUSUMgPSBsaWJkYWVtb25jbGllbnQuYQorU09VUkNFUyA9IGRhZW1vbi1pby5jIGNvbmZpZy11dGlsLmMgZGFlbW9uLWNsaWVudC5jCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbApkaWZmIC0tZ2l0IGEvbGliZGFlbW9uL2NsaWVudC9jb25maWctdXRpbC5jIGIvbGliZGFlbW9uL2NsaWVudC9jb25maWctdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjIxODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vY2xpZW50L2NvbmZpZy11dGlsLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1pby5oIgorI2luY2x1ZGUgImRtLWxvZ2dpbmcuaCIKKworI2luY2x1ZGUgPG1hdGguaD4gIC8qIGZhYnMoKSAqLworI2luY2x1ZGUgPGZsb2F0Lmg+IC8qIERCTF9FUFNJTE9OICovCisKK2ludCBidWZmZXJfYXBwZW5kX3ZmKHN0cnVjdCBidWZmZXIgKmJ1ZiwgdmFfbGlzdCBhcCkKK3sKKwljaGFyICphcHBlbmQ7CisJY2hhciAqbmV4dDsKKwlpbnQga2V5bGVuOworCWludDY0X3QgdmFsdWU7CisJY2hhciAqc3RyaW5nOworCWNoYXIgKmJsb2NrOworCisJd2hpbGUgKChuZXh0ID0gdmFfYXJnKGFwLCBjaGFyICopKSkgeworCQlhcHBlbmQgPSBOVUxMOworCQlpZiAoIXN0cmNocihuZXh0LCAnPScpKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkJhZCBmb3JtYXQgc3RyaW5nIGF0ICclcyciLCBuZXh0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlrZXlsZW4gPSBzdHJjaHIobmV4dCwgJz0nKSAtIG5leHQ7CisJCWlmIChzdHJzdHIobmV4dCwgIiVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBvZiBwbGFpbiAlZCBpcyBwcm9oaWJpdGVkLCB1c2UgIEZNVGQ2NCAqLworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJEbyBub3QgdXNlICAlJWQgYW5kIHVzZSBjb3JyZWN0IDY0Yml0IGZvcm0iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoc3Ryc3RyKG5leHQsIEZNVGQ2NCkpIHsKKwkJCXZhbHVlID0gdmFfYXJnKGFwLCBpbnQ2NF90KTsKKwkJCWlmIChkbV9hc3ByaW50ZigmYXBwZW5kLCAiJS4qcz0gJSIgUFJJZDY0ICJcbiIsIGtleWxlbiwgbmV4dCwgdmFsdWUpIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCX0gZWxzZSBpZiAoc3Ryc3RyKG5leHQsICIlcyIpKSB7CisJCQlzdHJpbmcgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCQlpZiAoZG1fYXNwcmludGYoJmFwcGVuZCwgIiUuKnM9IFwiJXNcIlxuIiwga2V5bGVuLCBuZXh0LCBzdHJpbmcpIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCX0gZWxzZSBpZiAoc3Ryc3RyKG5leHQsICIlYiIpKSB7CisJCQlpZiAoIShibG9jayA9IHZhX2FyZyhhcCwgY2hhciAqKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoZG1fYXNwcmludGYoJmFwcGVuZCwgIiUuKnMlcyIsIGtleWxlbiwgbmV4dCwgYmxvY2spIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCX0gZWxzZSBpZiAoZG1fYXNwcmludGYoJmFwcGVuZCwgIiVzIiwgbmV4dCkgPCAwKQorCQkJZ290byBmYWlsOworCisJCWlmICghYXBwZW5kIHx8CisJCSAgICAhYnVmZmVyX2FwcGVuZChidWYsIGFwcGVuZCkpCisJCQlnb3RvIGZhaWw7CisKKwkJZG1fZnJlZShhcHBlbmQpOworCX0KKworCXJldHVybiAxOworZmFpbDoKKwlkbV9mcmVlKGFwcGVuZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidWZmZXJfYXBwZW5kX2Yoc3RydWN0IGJ1ZmZlciAqYnVmLCAuLi4pCit7CisJaW50IHJlczsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGJ1Zik7CisJcmVzID0gYnVmZmVyX2FwcGVuZF92ZihidWYsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJlczsKK30KKworaW50IHNldF9mbGFnKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwKKwkgICAgIGNvbnN0IGNoYXIgKmZpZWxkLCBjb25zdCBjaGFyICpmbGFnLCBpbnQgd2FudCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2YWx1ZSA9IE5VTEwsICpwcmVkID0gTlVMTDsKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm5vZGUgPSBkbV9jb25maWdfZmluZF9ub2RlKHBhcmVudC0+Y2hpbGQsIGZpZWxkKTsKKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpuZXc7CisKKwlpZiAobm9kZSkKKwkJdmFsdWUgPSBub2RlLT52OworCisJd2hpbGUgKHZhbHVlICYmIHZhbHVlLT50eXBlICE9IERNX0NGR19FTVBUWV9BUlJBWSAmJiBzdHJjbXAodmFsdWUtPnYuc3RyLCBmbGFnKSkgeworCQlwcmVkID0gdmFsdWU7CisJCXZhbHVlID0gdmFsdWUtPm5leHQ7CisJfQorCisJaWYgKHZhbHVlICYmIHdhbnQpCisJCXJldHVybiAxOworCisJaWYgKCF2YWx1ZSAmJiAhd2FudCkKKwkJcmV0dXJuIDE7CisKKwlpZiAodmFsdWUgJiYgIXdhbnQpIHsKKwkJaWYgKHByZWQpIHsKKwkJCXByZWQtPm5leHQgPSB2YWx1ZS0+bmV4dDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSBub2RlLT52ICYmIHZhbHVlLT5uZXh0KSB7CisJCQlub2RlLT52ID0gdmFsdWUtPm5leHQ7CisJCX0gZWxzZSB7CisJCQlub2RlLT52LT50eXBlID0gRE1fQ0ZHX0VNUFRZX0FSUkFZOworCQl9CisJfQorCisJaWYgKCF2YWx1ZSAmJiB3YW50KSB7CisJCWlmICghbm9kZSkgeworCQkJaWYgKCEobm9kZSA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShjZnQsIGZpZWxkKSkpCisJCQkJcmV0dXJuIDA7CisJCQlub2RlLT5zaWIgPSBwYXJlbnQtPmNoaWxkOworCQkJaWYgKCEobm9kZS0+diA9IGRtX2NvbmZpZ19jcmVhdGVfdmFsdWUoY2Z0KSkpCisJCQkJcmV0dXJuIDA7CisJCQlub2RlLT52LT50eXBlID0gRE1fQ0ZHX0VNUFRZX0FSUkFZOworCQkJbm9kZS0+cGFyZW50ID0gcGFyZW50OworCQkJcGFyZW50LT5jaGlsZCA9IG5vZGU7CisJCX0KKwkJaWYgKCEobmV3ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShjZnQpKSkgeworCQkJLyogRklYTUUgZXJyb3IgcmVwb3J0aW5nICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQluZXctPnR5cGUgPSBETV9DRkdfU1RSSU5HOworCQluZXctPnYuc3RyID0gZmxhZzsKKwkJbmV3LT5uZXh0ID0gbm9kZS0+djsKKwkJbm9kZS0+diA9IG5ldzsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBjaGFpbl9ub2RlKHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisgICAgICAgICAgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisgICAgICAgICAgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwcmVfc2liKQoreworCWNuLT5wYXJlbnQgPSBwYXJlbnQ7CisJY24tPnNpYiA9IE5VTEw7CisKKwlpZiAocGFyZW50ICYmIHBhcmVudC0+Y2hpbGQgJiYgIXByZV9zaWIpIHsgLyogZmluZCB0aGUgbGFzdCBvbmUgKi8KKwkJcHJlX3NpYiA9IHBhcmVudC0+Y2hpbGQ7CisJCXdoaWxlIChwcmVfc2liICYmIHByZV9zaWItPnNpYikKKwkJCXByZV9zaWIgPSBwcmVfc2liLT5zaWI7CisJfQorCisJaWYgKHBhcmVudCAmJiAhcGFyZW50LT5jaGlsZCkKKwkJcGFyZW50LT5jaGlsZCA9IGNuOworCWlmIChwcmVfc2liKSB7CisJCWNuLT5zaWIgPSBwcmVfc2liLT5zaWI7CisJCXByZV9zaWItPnNpYiA9IGNuOworCX0KKworfQorCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm1ha2VfY29uZmlnX25vZGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJCWNvbnN0IGNoYXIgKmtleSwKKwkJCQkJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYikKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJaWYgKCEoY24gPSBkbV9jb25maWdfY3JlYXRlX25vZGUoY2Z0LCBrZXkpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljbi0+diA9IE5VTEw7CisJY24tPmNoaWxkID0gTlVMTDsKKworCWNoYWluX25vZGUoY24sIHBhcmVudCwgcHJlX3NpYik7CisKKwlyZXR1cm4gY247Cit9CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqbWFrZV90ZXh0X25vZGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJICAgICAgY29uc3QgY2hhciAqa2V5LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCSAgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LAorCQkJCSAgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYikKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCisJaWYgKCEoY24gPSBtYWtlX2NvbmZpZ19ub2RlKGNmdCwga2V5LCBwYXJlbnQsIHByZV9zaWIpKSB8fAorCSAgICAhKGNuLT52ID0gZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShjZnQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljbi0+di0+dHlwZSA9IERNX0NGR19TVFJJTkc7CisJY24tPnYtPnYuc3RyID0gdmFsdWU7CisJcmV0dXJuIGNuOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm1ha2VfaW50X25vZGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJICAgICBjb25zdCBjaGFyICprZXksCisJCQkJICAgICBpbnQ2NF90IHZhbHVlLAorCQkJCSAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJICAgICBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnByZV9zaWIpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCWlmICghKGNuID0gbWFrZV9jb25maWdfbm9kZShjZnQsIGtleSwgcGFyZW50LCBwcmVfc2liKSkgfHwKKwkgICAgIShjbi0+diA9IGRtX2NvbmZpZ19jcmVhdGVfdmFsdWUoY2Z0KSkpCisJCXJldHVybiBOVUxMOworCisJY24tPnYtPnR5cGUgPSBETV9DRkdfSU5UOworCWNuLT52LT52LmkgPSB2YWx1ZTsKKwlyZXR1cm4gY247Cit9CisKKy8qCisgKiBGSVhNRTogcmV0dXJuIDEgZXZlbiBpZiBWQSBsaXN0IGlzIGVtcHR5IGFuZCByZXR1cm4gdGhlCisgKiAgICAgICAgZG1fY29uZmlnX25vZGUqIHJlc3VsdCBhcyBvdXRwdXQgcGFyYW1ldGVyCisgKi8KK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqY29uZmlnX21ha2Vfbm9kZXNfdihzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJCSAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYiwKKwkJCQkJICAgdmFfbGlzdCBhcCkKK3sKKwljb25zdCBjaGFyICpuZXh0OworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqZmlyc3QgPSBOVUxMOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgKmtleTsKKworCXdoaWxlICgobmV4dCA9IHZhX2FyZyhhcCwgY2hhciAqKSkpIHsKKwkJY24gPSBOVUxMOworCQlmbXQgPSBzdHJjaHIobmV4dCwgJz0nKTsKKworCQlpZiAoIWZtdCkgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJCYWQgZm9ybWF0IHN0cmluZyAnJXMnIiwgZm10KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKCEoa2V5ID0gZG1fcG9vbF9zdHJkdXAoY2Z0LT5tZW0sIG5leHQpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZHVwbGljYXRlIG5vZGUga2V5LiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlrZXlbZm10IC0gbmV4dF0gPSAnXDAnOworCQlmbXQgKz0gMjsKKworCQlpZiAoIXN0cmNtcChmbXQsICIlZCIpIHx8ICFzdHJjbXAoZm10LCBGTVRkNjQpKSB7CisJCQlpbnQ2NF90IHZhbHVlID0gdmFfYXJnKGFwLCBpbnQ2NF90KTsKKwkJCWlmICghKGNuID0gbWFrZV9pbnRfbm9kZShjZnQsIGtleSwgdmFsdWUsIHBhcmVudCwgcHJlX3NpYikpKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiJXMiKSkgeworCQkJY2hhciAqdmFsdWUgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCQlpZiAoIShjbiA9IG1ha2VfdGV4dF9ub2RlKGNmdCwga2V5LCB2YWx1ZSwgcGFyZW50LCBwcmVfc2liKSkpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChmbXQsICIldCIpKSB7CisJCQlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnRyZWUgPSB2YV9hcmcoYXAsIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqKTsKKwkJCWNuID0gZG1fY29uZmlnX2Nsb25lX25vZGUoY2Z0LCB0cmVlLT5yb290LCAxKTsKKwkJCWlmICghY24pCisJCQkJcmV0dXJuIDA7CisJCQljbi0+a2V5ID0ga2V5OworCQkJY2hhaW5fbm9kZShjbiwgcGFyZW50LCBwcmVfc2liKTsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQmFkIGZvcm1hdCBzdHJpbmcgJyVzJyIsIGZtdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoIWZpcnN0KQorCQkJZmlyc3QgPSBjbjsKKwkJaWYgKGNuKQorCQkJcHJlX3NpYiA9IGNuOworCX0KKworCXJldHVybiBmaXJzdDsKK30KKworc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjb25maWdfbWFrZV9ub2RlcyhzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LAorCQkJCQkgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwcmVfc2liLAorCQkJCQkgLi4uKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcmVzOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgcHJlX3NpYik7CisJcmVzID0gY29uZmlnX21ha2Vfbm9kZXNfdihjZnQsIHBhcmVudCwgcHJlX3NpYiwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKiBUZXN0IGlmIHRoZSBkb3VibGVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCBlcXVhbCAqLworc3RhdGljIGludCBjbG9zZV9lbm91Z2goZG91YmxlIGQxLCBkb3VibGUgZDIpCit7CisJcmV0dXJuIGZhYnMoZDEgLSBkMikgPCBEQkxfRVBTSUxPTjsKK30KKworaW50IGNvbXBhcmVfdmFsdWUoc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqYSwgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqYikKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAoYS0+dHlwZSA+IGItPnR5cGUpCisJCXJldHVybiAxOworCWlmIChhLT50eXBlIDwgYi0+dHlwZSkKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChhLT50eXBlKSB7CisJY2FzZSBETV9DRkdfU1RSSU5HOiByID0gc3RyY21wKGEtPnYuc3RyLCBiLT52LnN0cik7IGJyZWFrOworCWNhc2UgRE1fQ0ZHX0ZMT0FUOiByID0gY2xvc2VfZW5vdWdoKGEtPnYuZiwgYi0+di5mKSA/IDAgOiAoYS0+di5mID4gYi0+di5mKSA/IDEgOiAtMTsgYnJlYWs7CisJY2FzZSBETV9DRkdfSU5UOiByID0gKGEtPnYuaSA9PSBiLT52LmkpID8gMCA6IChhLT52LmkgPiBiLT52LmkpID8gMSA6IC0xOyBicmVhazsKKwljYXNlIERNX0NGR19FTVBUWV9BUlJBWTogcmV0dXJuIDA7CisJfQorCisJaWYgKHIgPT0gMCAmJiBhLT5uZXh0ICYmIGItPm5leHQpCisJCXIgPSBjb21wYXJlX3ZhbHVlKGEtPm5leHQsIGItPm5leHQpOworCXJldHVybiByOworfQorCitpbnQgY29tcGFyZV9jb25maWcoc3RydWN0IGRtX2NvbmZpZ19ub2RlICphLCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmIpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaWYgKGEtPnYgJiYgYi0+dikKKwkJcmVzdWx0ID0gY29tcGFyZV92YWx1ZShhLT52LCBiLT52KTsKKwlpZiAoYS0+diAmJiAhYi0+dikKKwkJcmVzdWx0ID0gMTsKKwlpZiAoIWEtPnYgJiYgYi0+dikKKwkJcmVzdWx0ID0gLTE7CisJaWYgKGEtPmNoaWxkICYmIGItPmNoaWxkKQorCQlyZXN1bHQgPSBjb21wYXJlX2NvbmZpZyhhLT5jaGlsZCwgYi0+Y2hpbGQpOworCisJaWYgKHJlc3VsdCkgeworCQkvLyBERUJVR0xPRygiY29uZmlnIGluZXF1YWxpdHkgYXQgJXMgLyAlcyIsIGEtPmtleSwgYi0+a2V5KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAoYS0+c2liICYmIGItPnNpYikKKwkJcmVzdWx0ID0gY29tcGFyZV9jb25maWcoYS0+c2liLCBiLT5zaWIpOworCWlmIChhLT5zaWIgJiYgIWItPnNpYikKKwkJcmVzdWx0ID0gMTsKKwlpZiAoIWEtPnNpYiAmJiBiLT5zaWIpCisJCXJlc3VsdCA9IC0xOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGJ1ZmZlcl9yZWFsbG9jKHN0cnVjdCBidWZmZXIgKmJ1ZiwgaW50IG5lZWRlZCkKK3sKKwljaGFyICpuZXc7CisJaW50IGFsbG9jID0gYnVmLT5hbGxvY2F0ZWQ7CisJaWYgKGFsbG9jIDwgbmVlZGVkKQorCQlhbGxvYyA9IG5lZWRlZDsKKworCWJ1Zi0+YWxsb2NhdGVkICs9IGFsbG9jOworCW5ldyA9IGRtX3JlYWxsb2MoYnVmLT5tZW0sIGJ1Zi0+YWxsb2NhdGVkKTsKKwlpZiAobmV3KQorCQlidWYtPm1lbSA9IG5ldzsKKwllbHNlIHsgLyogdXR0ZXIgZmFpbHVyZSAqLworCQlkbV9mcmVlKGJ1Zi0+bWVtKTsKKwkJYnVmLT5tZW0gPSAwOworCQlidWYtPmFsbG9jYXRlZCA9IGJ1Zi0+dXNlZCA9IDA7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IGJ1ZmZlcl9hcHBlbmQoc3RydWN0IGJ1ZmZlciAqYnVmLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHJpbmcpOworCisJaWYgKCghYnVmLT5tZW0gfHwgKGJ1Zi0+YWxsb2NhdGVkIC0gYnVmLT51c2VkIDw9IGxlbikpICYmCisJICAgICFidWZmZXJfcmVhbGxvYyhidWYsIGxlbiArIDEpKQorCQlyZXR1cm4gMDsKKworCXN0cmNweShidWYtPm1lbSArIGJ1Zi0+dXNlZCwgc3RyaW5nKTsKKwlidWYtPnVzZWQgKz0gbGVuOworCXJldHVybiAxOworfQorCitpbnQgYnVmZmVyX2xpbmUoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pCit7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gYmF0b247CisJaWYgKCFidWZmZXJfYXBwZW5kKGJ1ZiwgbGluZSkpCisJCXJldHVybiAwOworCWlmICghYnVmZmVyX2FwcGVuZChidWYsICJcbiIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBidWZmZXJfZGVzdHJveShzdHJ1Y3QgYnVmZmVyICpidWYpCit7CisJZG1fZnJlZShidWYtPm1lbSk7CisJYnVmZmVyX2luaXQoYnVmKTsKK30KKwordm9pZCBidWZmZXJfaW5pdChzdHJ1Y3QgYnVmZmVyICpidWYpCit7CisJYnVmLT5hbGxvY2F0ZWQgPSBidWYtPnVzZWQgPSAwOworCWJ1Zi0+bWVtID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmRhZW1vbi9jbGllbnQvY29uZmlnLXV0aWwuaCBiL2xpYmRhZW1vbi9jbGllbnQvY29uZmlnLXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYzNmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZGFlbW9uL2NsaWVudC9jb25maWctdXRpbC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fREFFTU9OX0NPTkZJR19VVElMX0gKKyNkZWZpbmUgX0xWTV9EQUVNT05fQ09ORklHX1VUSUxfSAorCitzdHJ1Y3QgYnVmZmVyIHsKKwlpbnQgYWxsb2NhdGVkOworCWludCB1c2VkOworCWNoYXIgKm1lbTsKK307CisKK2ludCBidWZmZXJfYXBwZW5kX3ZmKHN0cnVjdCBidWZmZXIgKmJ1ZiwgdmFfbGlzdCBhcCk7CitpbnQgYnVmZmVyX2FwcGVuZF9mKHN0cnVjdCBidWZmZXIgKmJ1ZiwgLi4uKTsKK2ludCBidWZmZXJfYXBwZW5kKHN0cnVjdCBidWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqc3RyaW5nKTsKK3ZvaWQgYnVmZmVyX2luaXQoc3RydWN0IGJ1ZmZlciAqYnVmKTsKK3ZvaWQgYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGJ1ZmZlciAqYnVmKTsKK2ludCBidWZmZXJfcmVhbGxvYyhzdHJ1Y3QgYnVmZmVyICpidWYsIGludCBuZWVkZWQpOworCitpbnQgYnVmZmVyX2xpbmUoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYmF0b24pOworCitpbnQgc2V0X2ZsYWcoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LAorCSAgICAgY29uc3QgY2hhciAqZmllbGQsIGNvbnN0IGNoYXIgKmZsYWcsIGludCB3YW50KTsKKwordm9pZCBjaGFpbl9ub2RlKHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisgICAgICAgICAgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisgICAgICAgICAgICAgICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwcmVfc2liKTsKKworc3RydWN0IGRtX2NvbmZpZ19ub2RlICptYWtlX2NvbmZpZ19ub2RlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQljb25zdCBjaGFyICprZXksCisJCQkJCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnByZV9zaWIpOworCitpbnQgY29tcGFyZV92YWx1ZShzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICphLCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpiKTsKK2ludCBjb21wYXJlX2NvbmZpZyhzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmEsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqYik7CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqbWFrZV90ZXh0X25vZGUoc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsCisJCQkJICAgICAgY29uc3QgY2hhciAqa2V5LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCSAgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LAorCQkJCSAgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYik7CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqbWFrZV9pbnRfbm9kZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgICAgIGludDY0X3QgdmFsdWUsCisJCQkJICAgICBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwKKwkJCQkgICAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYik7CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqY29uZmlnX21ha2Vfbm9kZXNfdihzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCQkJICAgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJCSAgIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcHJlX3NpYiwKKwkJCQkJICAgdmFfbGlzdCBhcCk7CitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNvbmZpZ19tYWtlX25vZGVzKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsCisJCQkJCSBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnByZV9zaWIsCisJCQkJCSAuLi4pOworCisjZW5kaWYgLyogX0xWTV9EQUVNT05fQ09ORklHX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZGFlbW9uL2NsaWVudC9kYWVtb24tY2xpZW50LmMgYi9saWJkYWVtb24vY2xpZW50L2RhZW1vbi1jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNkNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZGFlbW9uL2NsaWVudC9kYWVtb24tY2xpZW50LmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1pby5oIgorI2luY2x1ZGUgImRhZW1vbi1jbGllbnQuaCIKKyNpbmNsdWRlICJkbS1sb2dnaW5nLmgiCisKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK2RhZW1vbl9oYW5kbGUgZGFlbW9uX29wZW4oZGFlbW9uX2luZm8gaSkKK3sKKwlkYWVtb25faGFuZGxlIGggPSB7IC5lcnJvciA9IDAgfTsKKwlkYWVtb25fcmVwbHkgciA9IHsgMCB9OworCXN0cnVjdCBzb2NrYWRkcl91biBzb2NrYWRkciA9IHsgLnN1bl9mYW1pbHkgPSBBRl9VTklYIH07CisKKwlsb2dfZGVidWcoIiVzOiBPcGVuaW5nIGRhZW1vbiBzb2NrZXQgdG8gJXMgZm9yIHByb3RvY29sICVzIHZlcnNpb24gJWQuIiwKKwkJICBpLnNvY2tldCwgaS5wYXRoLCBpLnByb3RvY29sLCBpLnByb3RvY29sX3ZlcnNpb24pOworCisJaWYgKChoLnNvY2tldF9mZCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSAvKiB8IFNPQ0tfTk9OQkxPQ0sgKi8sIDApKSA8IDApIHsKKwkJaC5lcnJvciA9IGVycm5vOworCQlsb2dfc3lzX2Vycm9yKCJzb2NrZXQiLCBpLnNvY2tldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKCFkbV9zdHJuY3B5KHNvY2thZGRyLnN1bl9wYXRoLCBpLnNvY2tldCwgc2l6ZW9mKHNvY2thZGRyLnN1bl9wYXRoKSkpIHsKKwkJbG9nX2Vycm9yKCIlczogRGFlbW9uIHNvY2tldCBwYXRoIHRvbyBsb25nLiIsIGkuc29ja2V0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoY29ubmVjdChoLnNvY2tldF9mZCwoc3RydWN0IHNvY2thZGRyICopICZzb2NrYWRkciwgc2l6ZW9mKHNvY2thZGRyKSkpIHsKKwkJaC5lcnJvciA9IGVycm5vOworCQlsb2dfc3lzX2Vycm9yKCJjb25uZWN0IiwgaS5zb2NrZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCWxvZ19kZWJ1ZygiU2VuZGluZyBkYWVtb24gJXM6IGhlbGxvIiwgaS5wYXRoKTsKKwlyID0gZGFlbW9uX3NlbmRfc2ltcGxlKGgsICJoZWxsbyIsIE5VTEwpOworCWlmIChyLmVycm9yIHx8IHN0cmNtcChkYWVtb25fcmVwbHlfc3RyKHIsICJyZXNwb25zZSIsICJ1bmtub3duIiksICJPSyIpKSB7CisJCWguZXJyb3IgPSByLmVycm9yOworCQlsb2dfZXJyb3IoIkRhZW1vbiAlcyByZXR1cm5lZCBlcnJvciAlZCIsIGkucGF0aCwgci5lcnJvcik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogQ2hlY2sgcHJvdG9jb2wgYW5kIHZlcnNpb24gbWF0Y2hlcyAqLworCWgucHJvdG9jb2wgPSBkYWVtb25fcmVwbHlfc3RyKHIsICJwcm90b2NvbCIsIE5VTEwpOworCWlmIChoLnByb3RvY29sKQorCQloLnByb3RvY29sID0gZG1fc3RyZHVwKGgucHJvdG9jb2wpOyAvKiBrZWVwIGFyb3VuZCAqLworCWgucHJvdG9jb2xfdmVyc2lvbiA9IGRhZW1vbl9yZXBseV9pbnQociwgInZlcnNpb24iLCAwKTsKKworCWlmIChpLnByb3RvY29sICYmICghaC5wcm90b2NvbCB8fCBzdHJjbXAoaC5wcm90b2NvbCwgaS5wcm90b2NvbCkpKSB7CisJCWxvZ19lcnJvcigiRGFlbW9uICVzOiByZXF1ZXN0ZWQgcHJvdG9jb2wgJXMgIT0gJXMiLAorCQkJaS5wYXRoLCBpLnByb3RvY29sLCBoLnByb3RvY29sID8gOiAiIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChpLnByb3RvY29sX3ZlcnNpb24gJiYgaC5wcm90b2NvbF92ZXJzaW9uICE9IGkucHJvdG9jb2xfdmVyc2lvbikgeworCQlsb2dfZXJyb3IoIkRhZW1vbiAlczogcmVxdWVzdGVkIHByb3RvY29sIHZlcnNpb24gJWQgIT0gJWQiLAorCQkJICBpLnBhdGgsIGkucHJvdG9jb2xfdmVyc2lvbiwgaC5wcm90b2NvbF92ZXJzaW9uKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkYWVtb25fcmVwbHlfZGVzdHJveShyKTsKKwlyZXR1cm4gaDsKKworZXJyb3I6CisJaWYgKGguc29ja2V0X2ZkID49IDAgJiYgY2xvc2UoaC5zb2NrZXRfZmQpKQorCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJkYWVtb25fb3BlbiIpOworCWguc29ja2V0X2ZkID0gLTE7CisKKwlpZiAoci5jZnQpCisJCWRhZW1vbl9yZXBseV9kZXN0cm95KHIpOworCisJZG1fZnJlZSgoY2hhciAqKWgucHJvdG9jb2wpOworCWgucHJvdG9jb2wgPSBOVUxMOworCisJcmV0dXJuIGg7Cit9CisKK2RhZW1vbl9yZXBseSBkYWVtb25fc2VuZChkYWVtb25faGFuZGxlIGgsIGRhZW1vbl9yZXF1ZXN0IHJxKQoreworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWRhZW1vbl9yZXBseSByZXBseSA9IHsgMCB9OworCisJaWYgKGguc29ja2V0X2ZkIDwgMCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRhZW1vbiBzZW5kOiBzb2NrZXQgZmQgY2Fubm90IGJlIG5lZ2F0aXZlICVkIiwgaC5zb2NrZXRfZmQpOworCQlyZXBseS5lcnJvciA9IEVJTlZBTDsKKwkJcmV0dXJuIHJlcGx5OworCX0KKworCWJ1ZmZlciA9IHJxLmJ1ZmZlcjsKKworCWlmICghYnVmZmVyLm1lbSkKKwkJaWYgKCFkbV9jb25maWdfd3JpdGVfbm9kZShycS5jZnQtPnJvb3QsIGJ1ZmZlcl9saW5lLCAmYnVmZmVyKSkgeworCQkJcmVwbHkuZXJyb3IgPSBFTk9NRU07CisJCQlyZXR1cm4gcmVwbHk7CisJCX0KKworCWlmICghYnVmZmVyLm1lbSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkRhZW1vbiBzZW5kOiBubyBtZW1vcnkgYXZhaWxhYmxlIik7CisJCXJlcGx5LmVycm9yID0gRU5PTUVNOworCQlyZXR1cm4gcmVwbHk7CisJfQorCisJaWYgKCFidWZmZXJfd3JpdGUoaC5zb2NrZXRfZmQsICZidWZmZXIpKQorCQlyZXBseS5lcnJvciA9IGVycm5vOworCisJaWYgKGJ1ZmZlcl9yZWFkKGguc29ja2V0X2ZkLCAmcmVwbHkuYnVmZmVyKSkgeworCQlyZXBseS5jZnQgPSBkbV9jb25maWdfZnJvbV9zdHJpbmcocmVwbHkuYnVmZmVyLm1lbSk7CisJCWlmICghcmVwbHkuY2Z0KQorCQkJcmVwbHkuZXJyb3IgPSBFUFJPVE87CisJfSBlbHNlCisJCXJlcGx5LmVycm9yID0gZXJybm87CisKKwlpZiAoYnVmZmVyLm1lbSAhPSBycS5idWZmZXIubWVtKQorCQlidWZmZXJfZGVzdHJveSgmYnVmZmVyKTsKKworCXJldHVybiByZXBseTsKK30KKwordm9pZCBkYWVtb25fcmVwbHlfZGVzdHJveShkYWVtb25fcmVwbHkgcikKK3sKKwlpZiAoci5jZnQpCisJCWRtX2NvbmZpZ19kZXN0cm95KHIuY2Z0KTsKKwlidWZmZXJfZGVzdHJveSgmci5idWZmZXIpOworfQorCitkYWVtb25fcmVwbHkgZGFlbW9uX3NlbmRfc2ltcGxlX3YoZGFlbW9uX2hhbmRsZSBoLCBjb25zdCBjaGFyICppZCwgdmFfbGlzdCBhcCkKK3sKKwlzdGF0aWMgY29uc3QgZGFlbW9uX3JlcGx5IGVyciA9IHsgLmVycm9yID0gRU5PTUVNIH07CisJZGFlbW9uX3JlcXVlc3QgcnEgPSB7IC5jZnQgPSBOVUxMIH07CisJZGFlbW9uX3JlcGx5IHJlcGw7CisJdmFfbGlzdCBhcGM7CisKKwl2YV9jb3B5KGFwYywgYXApOworCWlmICghYnVmZmVyX2FwcGVuZF9mKCZycS5idWZmZXIsICJyZXF1ZXN0ID0gJXMiLCBpZCwgTlVMTCkgfHwKKwkgICAgIWJ1ZmZlcl9hcHBlbmRfdmYoJnJxLmJ1ZmZlciwgYXBjKSkgeworCQl2YV9lbmQoYXBjKTsKKwkJYnVmZmVyX2Rlc3Ryb3koJnJxLmJ1ZmZlcik7CisJCXJldHVybiBlcnI7CisJfQorCXZhX2VuZChhcGMpOworCisJcmVwbCA9IGRhZW1vbl9zZW5kKGgsIHJxKTsKKwlidWZmZXJfZGVzdHJveSgmcnEuYnVmZmVyKTsKKworCXJldHVybiByZXBsOworfQorCitkYWVtb25fcmVwbHkgZGFlbW9uX3NlbmRfc2ltcGxlKGRhZW1vbl9oYW5kbGUgaCwgY29uc3QgY2hhciAqaWQsIC4uLikKK3sKKwlkYWVtb25fcmVwbHkgcjsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGlkKTsKKwlyID0gZGFlbW9uX3NlbmRfc2ltcGxlX3YoaCwgaWQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZGFlbW9uX2Nsb3NlKGRhZW1vbl9oYW5kbGUgaCkKK3sKKwlpZiAoaC5zb2NrZXRfZmQgPj0gMCkgeworCQlsb2dfZGVidWcoIkNsb3NpbmcgZGFlbW9uIHNvY2tldCAoZmQgJWQpLiIsIGguc29ja2V0X2ZkKTsKKyAJCWlmIChjbG9zZShoLnNvY2tldF9mZCkpCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJkYWVtb25fY2xvc2UiKTsKKwl9CisKKwlkbV9mcmVlKChjaGFyICopaC5wcm90b2NvbCk7Cit9CisKK2RhZW1vbl9yZXF1ZXN0IGRhZW1vbl9yZXF1ZXN0X21ha2UoY29uc3QgY2hhciAqaWQpCit7CisJZGFlbW9uX3JlcXVlc3QgcjsKKworCWJ1ZmZlcl9pbml0KCZyLmJ1ZmZlcik7CisKKwlpZiAoIShyLmNmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCEoci5jZnQtPnJvb3QgPSBtYWtlX3RleHRfbm9kZShyLmNmdCwgInJlcXVlc3QiLCBpZCwgTlVMTCwgTlVMTCkpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiByOworYmFkOgorCWlmIChyLmNmdCkgeworCQlkbV9jb25maWdfZGVzdHJveShyLmNmdCk7CisJCXIuY2Z0ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRhZW1vbl9yZXF1ZXN0X2V4dGVuZF92KGRhZW1vbl9yZXF1ZXN0IHIsIHZhX2xpc3QgYXApCit7CisJaW50IHJlczsKKwl2YV9saXN0IGFwYzsKKworCWlmICghci5jZnQpCisJCXJldHVybiAwOworCisJdmFfY29weShhcGMsIGFwKTsKKwlyZXMgPSBjb25maWdfbWFrZV9ub2Rlc192KHIuY2Z0LCBOVUxMLCByLmNmdC0+cm9vdCwgYXBjKSA/IDEgOiAwOworCXZhX2VuZChhcGMpOworCisJcmV0dXJuIHJlczsKK30KKworaW50IGRhZW1vbl9yZXF1ZXN0X2V4dGVuZChkYWVtb25fcmVxdWVzdCByLCAuLi4pCit7CisJaW50IHJlczsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIHIpOworCXJlcyA9IGRhZW1vbl9yZXF1ZXN0X2V4dGVuZF92KHIsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJlczsKK30KKwordm9pZCBkYWVtb25fcmVxdWVzdF9kZXN0cm95KGRhZW1vbl9yZXF1ZXN0IHIpCit7CisJaWYgKHIuY2Z0KQorCQlkbV9jb25maWdfZGVzdHJveShyLmNmdCk7CisJYnVmZmVyX2Rlc3Ryb3koJnIuYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRhZW1vbi9jbGllbnQvZGFlbW9uLWNsaWVudC5oIGIvbGliZGFlbW9uL2NsaWVudC9kYWVtb24tY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRhZW1vbi9jbGllbnQvZGFlbW9uLWNsaWVudC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0RBRU1PTl9DTElFTlRfSAorI2RlZmluZSBfTFZNX0RBRU1PTl9DTElFTlRfSAorCisjaW5jbHVkZSAiY29uZmlnLXV0aWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBzb2NrZXRfZmQ7IC8qIHRoZSBmZCB3ZSB1c2UgdG8gdGFsayB0byB0aGUgZGFlbW9uICovCisJY29uc3QgY2hhciAqcHJvdG9jb2w7CisJaW50IHByb3RvY29sX3ZlcnNpb247ICAvKiB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCB0aGUgZGFlbW9uIHVzZXMgKi8KKwlpbnQgZXJyb3I7Cit9IGRhZW1vbl9oYW5kbGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyICpwYXRoOyAvKiB0aGUgYmluYXJ5IG9mIHRoZSBkYWVtb24gKi8KKwljb25zdCBjaGFyICpzb2NrZXQ7IC8qIHBhdGggdG8gdGhlIGNvbW1zIHNvY2tldCAqLworCXVuc2lnbmVkIGF1dG9zdGFydDoxOyAvKiBzdGFydCB0aGUgZGFlbW9uIGlmIG5vdCBydW5uaW5nPyAqLworCisJLyoKKwkgKiBJZiB0aGUgZm9sbG93aW5nIGFyZSBub3QgTlVMTC8wLCBhbiBhdHRlbXB0IHRvIHRhbGsgdG8gYSBkYWVtb24gd2hpY2gKKwkgKiB1c2VzIGEgZGlmZmVyZW50IHByb3RvY29sIG9yIHZlcnNpb24gd2lsbCBmYWlsLgorCSAqLworCWNvbnN0IGNoYXIgKnByb3RvY29sOworCWludCBwcm90b2NvbF92ZXJzaW9uOworfSBkYWVtb25faW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCS8qCisJICogVGhlIHJlcXVlc3QgbG9va3MgbGlrZSB0aGlzOgorCSAqICAgIHJlcXVlc3QgPSAiaWQiCisJICogICAgYXJnX2ZvbyA9ICJzb21ldGhpbmciCisJICogICAgYXJnX2JhciA9IDMKKwkgKiAgICBhcmdfd2liYmxlIHsKKwkgKiAgICAgICAgc29tZXRoaW5nX3NwZWNpYWwgPSAiaGVyZSIKKwkgKiAgICAgICAgYW1vdW50ID0gNzUKKwkgKiAgICAgICAga25vYnMgPSBbICJ0d2lkZGxlIiwgInR3ZWFrIiBdCisJICogICAgfQorCSAqLworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworfSBkYWVtb25fcmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBlcnJvcjsgLyogMCBmb3Igc3VjY2VzcyAqLworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OyAvKiBwYXJzZWQgcmVwbHksIGlmIGF2YWlsYWJsZSAqLworfSBkYWVtb25fcmVwbHk7CisKKy8qCisgKiBPcGVuIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgdG8gdGhlIGRhZW1vbi4gSWYgdGhlIGRhZW1vbiBpcyBub3QgcnVubmluZywKKyAqIGl0IG1heSBiZSBhdXRvc3RhcnRlZCBiYXNlZCBvbiB0aGUgYmluYXJ5IHBhdGggcHJvdmlkZWQgaW4gdGhlIGluZm8gKHRoaXMKKyAqIHdpbGwgb25seSBoYXBwZW4gaWYgYXV0b3N0YXJ0IGlzIHNldCB0byB0cnVlKS4gSWYgdGhlIGNhbGwgZmFpbHMgZm9yIGFueQorICogcmVhc29uLCBkYWVtb25faGFuZGxlX3ZhbGlkKGgpIGZvciB0aGUgcmVzcG9uc2Ugd2lsbCByZXR1cm4gZmFsc2UuIE90aGVyd2lzZSwKKyAqIHRoZSBjb25uZWN0aW9uIGlzIGdvb2QgdG8gc3RhcnQgc2VydmluZyByZXF1ZXN0cy4KKyAqLworZGFlbW9uX2hhbmRsZSBkYWVtb25fb3BlbihkYWVtb25faW5mbyBpKTsKKworLyoKKyAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBkYWVtb24sIHdhaXRpbmcgZm9yIHRoZSByZXBseS4gQWxsIGNvbW11bmljYXRpb24gd2l0aAorICogdGhlIGRhZW1vbiBpcyBzeW5jaHJvbm91cy4gVGhlIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIElPIGRldGFpbHMgYW5kIHBhcnNlcyB0aGUKKyAqIHJlc3BvbnNlLCBoYW5kbGluZyBjb21tb24gZXJyb3IgY29uZGl0aW9ucy4gU2VlICJkYWVtb25fcmVwbHkiIGZvciBkZXRhaWxzLgorICoKKyAqIEluIGNhc2UgdGhlIHJlcXVlc3QgY29udGFpbnMgYSBub24tTlVMTCBidWZmZXIgcG9pbnRlciwgdGhpcyBidWZmZXIgaXMgc2VudAorICogKnZlcmJhdGltKiB0byB0aGUgc2VydmVyLiBJbiB0aGlzIGNhc2UsIHRoZSBjZnQgcG9pbnRlciBtYXkgYmUgTlVMTCAoYnV0IHdpbGwKKyAqIGJlIGlnbm9yZWQgZXZlbiBpZiBub24tTlVMTCkuIElmIHRoZSBidWZmZXIgaXMgTlVMTCwgdGhlIGNmdCBpcyByZXF1aXJlZCB0bworICogYmUgYSB2YWxpZCBwb2ludGVyLCBhbmQgaXMgdXNlZCB0byBidWlsZCB1cCB0aGUgcmVxdWVzdC4KKyAqLworZGFlbW9uX3JlcGx5IGRhZW1vbl9zZW5kKGRhZW1vbl9oYW5kbGUgaCwgZGFlbW9uX3JlcXVlc3QgcnEpOworCisvKgorICogQSBzaW1wbGUgaW50ZXJmYWNlIHRvIGRhZW1vbl9zZW5kLiBUaGlzIGZ1bmN0aW9uIGp1c3QgdGFrZXMgdGhlIGNvbW1hbmQgaWQKKyAqIGFuZCBwb3NzaWJseSBhIGxpc3Qgb2YgcGFyYW1ldGVycyAob2YgdGhlIGZvcm0gIm5hbWUgPSAlPyIsICJ2YWx1ZSIpLiBUaGUKKyAqIHR5cGUgKHN0cmluZywgaW50ZWdlcikgb2YgdGhlIHZhbHVlIGlzIGluZGljYXRlZCBieSBhIGNoYXJhY3RlciBzdWJzdGl0dXRlZAorICogZm9yID8gaW4gJT86IGQgZm9yIGludGVnZXIsIHMgZm9yIHN0cmluZy4KKyAqLworZGFlbW9uX3JlcGx5IGRhZW1vbl9zZW5kX3NpbXBsZShkYWVtb25faGFuZGxlIGgsIGNvbnN0IGNoYXIgKmlkLCAuLi4pOworZGFlbW9uX3JlcGx5IGRhZW1vbl9zZW5kX3NpbXBsZV92KGRhZW1vbl9oYW5kbGUgaCwgY29uc3QgY2hhciAqaWQsIHZhX2xpc3QgYXApOworCitkYWVtb25fcmVxdWVzdCBkYWVtb25fcmVxdWVzdF9tYWtlKGNvbnN0IGNoYXIgKmlkKTsKK2ludCBkYWVtb25fcmVxdWVzdF9leHRlbmQoZGFlbW9uX3JlcXVlc3QgciwgLi4uKTsKK2ludCBkYWVtb25fcmVxdWVzdF9leHRlbmRfdihkYWVtb25fcmVxdWVzdCByLCB2YV9saXN0IGFwKTsKK3ZvaWQgZGFlbW9uX3JlcXVlc3RfZGVzdHJveShkYWVtb25fcmVxdWVzdCByKTsKKwordm9pZCBkYWVtb25fcmVwbHlfZGVzdHJveShkYWVtb25fcmVwbHkgcik7CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBkYWVtb25fcmVwbHlfaW50KGRhZW1vbl9yZXBseSByLCBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGRlZikKK3sKKwlyZXR1cm4gZG1fY29uZmlnX2ZpbmRfaW50NjQoci5jZnQtPnJvb3QsIHBhdGgsIGRlZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZGFlbW9uX3JlcGx5X3N0cihkYWVtb25fcmVwbHkgciwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZGVmKQoreworCXJldHVybiBkbV9jb25maWdfZmluZF9zdHJfYWxsb3dfZW1wdHkoci5jZnQtPnJvb3QsIHBhdGgsIGRlZik7Cit9CisKKy8qIFNodXQgZG93biB0aGUgY29tbXVuaWNhdGlvbiB0byB0aGUgZGFlbW9uLiBDb21wdWxzb3J5LiAqLwordm9pZCBkYWVtb25fY2xvc2UoZGFlbW9uX2hhbmRsZSBoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJkYWVtb24vY2xpZW50L2RhZW1vbi1pby5jIGIvbGliZGFlbW9uL2NsaWVudC9kYWVtb24taW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE5ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZGFlbW9uL2NsaWVudC9kYWVtb24taW8uYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBfUkVFTlRSQU5UCisKKyNpbmNsdWRlICJ0b29sLmgiCisKKyNpbmNsdWRlICJkYWVtb24taW8uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qCisgKiBSZWFkIGEgc2luZ2xlIG1lc3NhZ2UgZnJvbSBhIChzb2NrZXQpIGZpbGVkZXNjcmlwdG9yLiBNZXNzYWdlcyBhcmUgZGVsaW1pdGVkCisgKiBieSBibGFuayBsaW5lcy4gVGhpcyBjYWxsIHdpbGwgYmxvY2sgdW50aWwgYWxsIG9mIGEgbWVzc2FnZSBpcyByZWNlaXZlZC4gVGhlCisgKiBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgZnJvbSBoZWFwLiBVcG9uIGVycm9yLCBhbGwgbWVtb3J5IGlzIGZyZWVkIGFuZCB0aGUKKyAqIGJ1ZmZlciBwb2ludGVyIGlzIHNldCB0byBOVUxMLgorICoKKyAqIFNlZSBhbHNvIHdyaXRlX2J1ZmZlciBhYm91dCBibG9ja2luZyAocmVhZF9idWZmZXIgaGFzIGlkZW50aWNhbCBiZWhhdmlvdXIpLgorICovCitpbnQgYnVmZmVyX3JlYWQoaW50IGZkLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpIHsKKwlpbnQgcmVzdWx0OworCisJaWYgKCFidWZmZXJfcmVhbGxvYyhidWZmZXIsIDMyKSkgLyogZW5zdXJlIHdlIGhhdmUgc29tZSBzcGFjZSAqLworCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCXJlc3VsdCA9IHJlYWQoZmQsIGJ1ZmZlci0+bWVtICsgYnVmZmVyLT51c2VkLCBidWZmZXItPmFsbG9jYXRlZCAtIGJ1ZmZlci0+dXNlZCk7CisJCWlmIChyZXN1bHQgPiAwKSB7CisJCQlidWZmZXItPnVzZWQgKz0gcmVzdWx0OworCQkJaWYgKGJ1ZmZlci0+dXNlZCA+PSA0ICYmICFzdHJuY21wKChidWZmZXItPm1lbSkgKyBidWZmZXItPnVzZWQgLSA0LCAiXG4jI1xuIiwgNCkpIHsKKwkJCQlidWZmZXItPnVzZWQgLT0gNDsKKwkJCQlidWZmZXItPm1lbVtidWZmZXItPnVzZWRdID0gMDsKKwkJCQlicmVhazsgLyogc3VjY2Vzcywgd2UgaGF2ZSB0aGUgZnVsbCBtZXNzYWdlIG5vdyAqLworCQkJfQorCQkJaWYgKChidWZmZXItPmFsbG9jYXRlZCAtIGJ1ZmZlci0+dXNlZCA8IDMyKSAmJgorCQkJICAgICFidWZmZXJfcmVhbGxvYyhidWZmZXIsIDEwMjQpKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAwKSB7CisJCQllcnJubyA9IEVDT05OUkVTRVQ7CisJCQlyZXR1cm4gMDsgLyogd2Ugc2hvdWxkIG5ldmVyIGVuY291bnRlciBFT0YgaGVyZSAqLworCQl9IGVsc2UgaWYgKHJlc3VsdCA8IDAgJiYgKGVycm5vID09IEVBR0FJTiB8fAorCQkJCQkgIChFV09VTERCTE9DSyAhPSBFQUdBSU4gJiYgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHx8CisJCQkJCSAgZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUlPKSkgeworCQkJZmRfc2V0IGluOworCQkJRkRfWkVSTygmaW4pOworCQkJRkRfU0VUKGZkLCAmaW4pOworCQkJLyogaWdub3JlIHRoZSByZXN1bHQsIHRoaXMgaXMganVzdCBhIGdsb3JpZmllZCBzbGVlcCAqLworCQkJc2VsZWN0KEZEX1NFVFNJWkUsICZpbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogV3JpdGUgYSBidWZmZXIgdG8gYSBmaWxlZGVzY3JpcHRvci4gS2VlcCB0cnlpbmcuIEJsb2NrcyAoZXZlbiBvbgorICogU09DS19OT05CTE9DSykgdW50aWwgYWxsIG9mIHRoZSB3cml0ZSB3ZW50IHRocm91Z2guCisgKi8KK2ludCBidWZmZXJfd3JpdGUoaW50IGZkLCBjb25zdCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpIHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGJ1ZmZlciBfdGVybWluYXRlID0geyAubWVtID0gKGNoYXIgKikgIlxuIyNcbiIsIC51c2VkID0gNCB9OworCWNvbnN0IHN0cnVjdCBidWZmZXIgKnVzZTsKKwlpbnQgZG9uZSwgd3JpdHRlbiwgcmVzdWx0OworCisJZm9yIChkb25lID0gMDsgZG9uZSA8IDI7ICsrZG9uZSkgeworCQl1c2UgPSAoZG9uZSA9PSAwKSA/IGJ1ZmZlciA6ICZfdGVybWluYXRlOworCQlmb3IgKHdyaXR0ZW4gPSAwOyB3cml0dGVuIDwgdXNlLT51c2VkOykgeworCQkJcmVzdWx0ID0gd3JpdGUoZmQsIHVzZS0+bWVtICsgd3JpdHRlbiwgdXNlLT51c2VkIC0gd3JpdHRlbik7CisJCQlpZiAocmVzdWx0ID4gMCkKKwkJCQl3cml0dGVuICs9IHJlc3VsdDsKKwkJCWVsc2UgaWYgKHJlc3VsdCA8IDAgJiYgKGVycm5vID09IEVBR0FJTiB8fAorCQkJCQkJKEVXT1VMREJMT0NLICE9IEVBR0FJTiAmJiBlcnJubyA9PSBFV09VTERCTE9DSykgfHwKKwkJCQkJCWVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVJTykpIHsKKwkJCQlmZF9zZXQgb3V0OworCQkJCUZEX1pFUk8oJm91dCk7CisJCQkJRkRfU0VUKGZkLCAmb3V0KTsKKwkJCQkvKiBpZ25vcmUgdGhlIHJlc3VsdCwgdGhpcyBpcyBqdXN0IGEgZ2xvcmlmaWVkIHNsZWVwICovCisJCQkJc2VsZWN0KEZEX1NFVFNJWkUsIE5VTEwsICZvdXQsIE5VTEwsIE5VTEwpOworCQkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKQorCQkJCXJldHVybiAwOyAvKiB0b28gYmFkICovCisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmRhZW1vbi9jbGllbnQvZGFlbW9uLWlvLmggYi9saWJkYWVtb24vY2xpZW50L2RhZW1vbi1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2IwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vY2xpZW50L2RhZW1vbi1pby5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fREFFTU9OX0lPX0gKKyNkZWZpbmUgX0xWTV9EQUVNT05fSU9fSAorCisjaW5jbHVkZSAiY29uZmlnLXV0aWwuaCIKKworLyogVE9ETyBmdW5jdGlvbiBuYW1lcyAqLworCitpbnQgYnVmZmVyX3JlYWQoaW50IGZkLCBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpOworaW50IGJ1ZmZlcl93cml0ZShpbnQgZmQsIGNvbnN0IHN0cnVjdCBidWZmZXIgKmJ1ZmZlcik7CisKKyNlbmRpZiAvKiBfTFZNX0RBRU1PTl9JT19IICovCmRpZmYgLS1naXQgYS9saWJkYWVtb24vc2VydmVyL01ha2VmaWxlLmluIGIvbGliZGFlbW9uL3NlcnZlci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTcxYTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZGFlbW9uL3NlcnZlci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitMSUJfU1RBVElDID0gbGliZGFlbW9uc2VydmVyLmEKK1NPVVJDRVMgPSBkYWVtb24tc2VydmVyLmMgZGFlbW9uLWxvZy5jCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitMSUJTICs9ICQoREFFTU9OX0xJQlMpCmRpZmYgLS1naXQgYS9saWJkYWVtb24vc2VydmVyL2RhZW1vbi1sb2cuYyBiL2xpYmRhZW1vbi9zZXJ2ZXIvZGFlbW9uLWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmUxODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vc2VydmVyL2RhZW1vbi1sb2cuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1zZXJ2ZXIuaCIKKyNpbmNsdWRlICJkYWVtb24tbG9nLmgiCisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworc3RydWN0IGJhY2tlbmQgeworCWludCBpZDsKKwl2b2lkICgqbG9nKShsb2dfc3RhdGUgKnMsIHZvaWQgKipzdGF0ZSwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworfTsKKworc3RhdGljIHZvaWQgbG9nX3N5c2xvZyhsb2dfc3RhdGUgKnMsIHZvaWQgKipzdGF0ZSwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJaW50IHByaW87CisKKwlpZiAoISpzdGF0ZSkgeyAvKiBpbml0aWFsaXplICovCisJCSpzdGF0ZSA9ICh2b2lkICopMTsKKwkJb3BlbmxvZyhzLT5uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERBRU1PTl9MT0dfSU5GTzogcHJpbyA9IExPR19JTkZPOyBicmVhazsKKwljYXNlIERBRU1PTl9MT0dfV0FSTjogcHJpbyA9IExPR19XQVJOSU5HOyBicmVhazsKKwljYXNlIERBRU1PTl9MT0dfRVJST1I6IHByaW8gPSBMT0dfRVJSOyBicmVhazsKKwljYXNlIERBRU1PTl9MT0dfRkFUQUw6IHByaW8gPSBMT0dfQ1JJVDsgYnJlYWs7CisJZGVmYXVsdDogcHJpbyA9IExPR19ERUJVRzsgYnJlYWs7CisJfQorCisJc3lzbG9nKHByaW8sICIlcyIsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBsb2dfc3RkZXJyKGxvZ19zdGF0ZSAqcywgdm9pZCAqKnN0YXRlLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwljb25zdCBjaGFyICpwcmVmaXg7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERBRU1PTl9MT0dfSU5GTzogcHJlZml4ID0gIkk6ICI7IGJyZWFrOworCWNhc2UgREFFTU9OX0xPR19XQVJOOiBwcmVmaXggPSAiVzogIiA7IGJyZWFrOworCWNhc2UgREFFTU9OX0xPR19FUlJPUjogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBEQUVNT05fTE9HX0ZBVEFMOiBwcmVmaXggPSAiRTogIiA7IGJyZWFrOworCWRlZmF1bHQ6IHByZWZpeCA9ICIiOyBicmVhazsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzJXNcbiIsIHByZWZpeCwgbWVzc2FnZSk7Cit9CisKK3N0cnVjdCBiYWNrZW5kIGJhY2tlbmRbXSA9IHsKKwl7IERBRU1PTl9MT0dfT1VUTEVUX1NZU0xPRywgbG9nX3N5c2xvZyB9LAorCXsgREFFTU9OX0xPR19PVVRMRVRfU1RERVJSLCBsb2dfc3RkZXJyIH0sCisJeyAwLCAwIH0KK307CisKK3ZvaWQgZGFlbW9uX2xvZyhsb2dfc3RhdGUgKnMsIGludCB0eXBlLCBjb25zdCBjaGFyICptZXNzYWdlKSB7CisJaW50IGkgPSAwOworCXdoaWxlICggYmFja2VuZFtpXS5pZCApIHsKKwkJaWYgKChpbnQpKHMtPmxvZ19jb25maWdbdHlwZV0gJiBiYWNrZW5kW2ldLmlkKSA9PSBiYWNrZW5kW2ldLmlkICkKKwkJCWJhY2tlbmRbaV0ubG9nKCBzLCAmcy0+YmFja2VuZF9zdGF0ZVtpXSwgdHlwZSwgbWVzc2FnZSApOworCQkrKyBpOworCX0KK30KKworc3RhdGljIGludCBfdHlwZV9pbnRlcmVzdGluZyhsb2dfc3RhdGUgKnMsIGludCB0eXBlKSB7CisJaW50IGkgPSAwOworCXdoaWxlICggYmFja2VuZFtpXS5pZCApIHsKKwkJaWYgKChpbnQpKHMtPmxvZ19jb25maWdbdHlwZV0gJiBiYWNrZW5kW2ldLmlkKSA9PSBiYWNrZW5kW2ldLmlkICkKKwkJCXJldHVybiAxOworCQkrKyBpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYWVtb25fbG9nZihsb2dfc3RhdGUgKnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworCWNoYXIgKmJ1ZjsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKGRtX3Zhc3ByaW50ZigmYnVmLCBmbXQsIGFwKSA+PSAwKSB7CisJCWRhZW1vbl9sb2cocywgdHlwZSwgYnVmKTsKKwkJZG1fZnJlZShidWYpOworCX0gLyogZWxzZSByZXR1cm5fMCAqLworCXZhX2VuZChhcCk7Cit9CisKK3N0cnVjdCBsb2dfbGluZV9iYXRvbiB7CisJbG9nX3N0YXRlICpzOworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKnByZWZpeDsKK307CisKK3N0YXRpYyBpbnQgX2xvZ19saW5lKGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmJhdG9uKSB7CisJc3RydWN0IGxvZ19saW5lX2JhdG9uICpiID0gYmF0b247CisJZGFlbW9uX2xvZ2YoYi0+cywgYi0+dHlwZSwgIiVzJXMiLCBiLT5wcmVmaXgsIGxpbmUpOworCXJldHVybiAwOworfQorCit2b2lkIGRhZW1vbl9sb2dfY2Z0KGxvZ19zdGF0ZSAqcywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuKQoreworCXN0cnVjdCBsb2dfbGluZV9iYXRvbiBiID0geyAucyA9IHMsIC50eXBlID0gdHlwZSwgLnByZWZpeCA9IHByZWZpeCB9OworCisJaWYgKCFfdHlwZV9pbnRlcmVzdGluZyhzLCB0eXBlKSkKKwkJcmV0dXJuOworCisJKHZvaWQpIGRtX2NvbmZpZ193cml0ZV9ub2RlKG4sICZfbG9nX2xpbmUsICZiKTsKK30KKwordm9pZCBkYWVtb25fbG9nX211bHRpKGxvZ19zdGF0ZSAqcywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbXNnKQoreworCXN0cnVjdCBsb2dfbGluZV9iYXRvbiBiID0geyAucyA9IHMsIC50eXBlID0gdHlwZSwgLnByZWZpeCA9IHByZWZpeCB9OworCWNoYXIgKmJ1ZjsKKwljaGFyICpwb3M7CisKKwlpZiAoIV90eXBlX2ludGVyZXN0aW5nKHMsIHR5cGUpKQorCQlyZXR1cm47CisKKwlidWYgPSBkbV9zdHJkdXAobXNnKTsKKwlwb3MgPSBidWY7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOyAvKiBfMCAqLworCisJd2hpbGUgKHBvcykgeworCQljaGFyICpuZXh0ID0gc3RyY2hyKHBvcywgJ1xuJyk7CisJCWlmIChuZXh0KQorCQkJKm5leHQgPSAwOworCQlfbG9nX2xpbmUocG9zLCAmYik7CisJCXBvcyA9IG5leHQgPyBuZXh0ICsgMSA6IDA7CisJfQorCWRtX2ZyZWUoYnVmKTsKK30KKwordm9pZCBkYWVtb25fbG9nX2VuYWJsZShsb2dfc3RhdGUgKnMsIGludCBvdXRsZXQsIGludCB0eXBlLCBpbnQgZW5hYmxlKQoreworCWlmICh0eXBlID49IDMyKQorCQlyZXR1cm47CisKKwlpZiAoZW5hYmxlKQorCQlzLT5sb2dfY29uZmlnW3R5cGVdIHw9IG91dGxldDsKKwllbHNlCisJCXMtPmxvZ19jb25maWdbdHlwZV0gJj0gfm91dGxldDsKK30KKworc3RhdGljIGludCBfcGFyc2Vfb25lKGxvZ19zdGF0ZSAqcywgaW50IG91dGxldCwgY29uc3QgY2hhciAqdHlwZSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgaTsKKwlpZiAoIXN0cmNtcCh0eXBlLCAiYWxsIikpCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorCQkJZGFlbW9uX2xvZ19lbmFibGUocywgb3V0bGV0LCBpLCBlbmFibGUpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImZhdGFsIikpCisJCWRhZW1vbl9sb2dfZW5hYmxlKHMsIG91dGxldCwgREFFTU9OX0xPR19GQVRBTCwgZW5hYmxlKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJlcnJvciIpKQorCQlkYWVtb25fbG9nX2VuYWJsZShzLCBvdXRsZXQsIERBRU1PTl9MT0dfRVJST1IsIGVuYWJsZSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAid2FybiIpKQorCQlkYWVtb25fbG9nX2VuYWJsZShzLCBvdXRsZXQsIERBRU1PTl9MT0dfV0FSTiwgZW5hYmxlKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJpbmZvIikpCisJCWRhZW1vbl9sb2dfZW5hYmxlKHMsIG91dGxldCwgREFFTU9OX0xPR19JTkZPLCBlbmFibGUpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgIndpcmUiKSkKKwkJZGFlbW9uX2xvZ19lbmFibGUocywgb3V0bGV0LCBEQUVNT05fTE9HX1dJUkUsIGVuYWJsZSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiZGVidWciKSkKKwkJZGFlbW9uX2xvZ19lbmFibGUocywgb3V0bGV0LCBEQUVNT05fTE9HX0RFQlVHLCBlbmFibGUpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkYWVtb25fbG9nX3BhcnNlKGxvZ19zdGF0ZSAqcywgaW50IG91dGxldCwgY29uc3QgY2hhciAqdHlwZXMsIGludCBlbmFibGUpCit7CisJY2hhciAqYnVmOworCWNoYXIgKnBvczsKKworCWlmICghdHlwZXMgfHwgIXR5cGVzWzBdKQorCQlyZXR1cm4gMTsKKworCWlmICghKGJ1ZiA9IGRtX3N0cmR1cCh0eXBlcykpKQorCQlyZXR1cm4gMDsKKworCXBvcyA9IGJ1ZjsKKwl3aGlsZSAocG9zKSB7CisJCWNoYXIgKm5leHQgPSBzdHJjaHIocG9zLCAnLCcpOworCQlpZiAobmV4dCkKKwkJCSpuZXh0ID0gMDsKKwkJaWYgKCFfcGFyc2Vfb25lKHMsIG91dGxldCwgcG9zLCBlbmFibGUpKSB7CisJCQlkbV9mcmVlKGJ1Zik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwb3MgPSBuZXh0ID8gbmV4dCArIDEgOiAwOworCX0KKworCWRtX2ZyZWUoYnVmKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliZGFlbW9uL3NlcnZlci9kYWVtb24tbG9nLmggYi9saWJkYWVtb24vc2VydmVyL2RhZW1vbi1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTcwZGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZGFlbW9uL3NlcnZlci9kYWVtb24tbG9nLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fREFFTU9OX0xPR19ICisjZGVmaW5lIF9MVk1fREFFTU9OX0xPR19ICisKK2VudW0geyBEQUVNT05fTE9HX0ZBVEFMID0gMCAvKiB1c3VhbGx5IHByZWNlZGluZyBkYWVtb24gZGVhdGggKi8KKyAgICAgLCBEQUVNT05fTE9HX0VSUk9SID0gMSAvKiBzb21ldGhpbmcgc2VyaW91cyBoYXMgaGFwcGVuZWQgKi8KKyAgICAgLCBEQUVNT05fTE9HX1dBUk4gPSAyIC8qIHNvbWV0aGluZyB1bnVzdWFsIGhhcyBoYXBwZW5lZCAqLworICAgICAsIERBRU1PTl9MT0dfSU5GTyA9IDMgLyogdGhvdWdodCB5b3UgbWlnaHQgYmUgaW50ZXJlc3RlZCAqLworICAgICAsIERBRU1PTl9MT0dfV0lSRSA9IDQgLyogZHVtcCB0cmFmZmljIG9uIGNsaWVudCBzb2NrZXRzICovCisgICAgICwgREFFTU9OX0xPR19ERUJVRyA9IDUgLyogdW5zb3J0ZWQgZGVidWcgc3R1ZmYgKi8KK307CisKKyNkZWZpbmUgREVCVUdMT0cocywgeC4uLikgZGFlbW9uX2xvZ2YoKHMpLT5sb2csIERBRU1PTl9MT0dfREVCVUcsIHgpCisjZGVmaW5lIERFQlVHTE9HX2NmdChzLCBpLCBuKSBkYWVtb25fbG9nX2NmdCgocyktPmxvZywgREFFTU9OX0xPR19ERUJVRywgaSwgbikKKyNkZWZpbmUgV0FSTihzLCB4Li4uKSBkYWVtb25fbG9nZigocyktPmxvZywgREFFTU9OX0xPR19XQVJOLCB4KQorI2RlZmluZSBJTkZPKHMsIHguLi4pIGRhZW1vbl9sb2dmKChzKS0+bG9nLCBEQUVNT05fTE9HX0lORk8sIHgpCisjZGVmaW5lIEVSUk9SKHMsIHguLi4pIGRhZW1vbl9sb2dmKChzKS0+bG9nLCBEQUVNT05fTE9HX0VSUk9SLCB4KQorI2RlZmluZSBGQVRBTChzLCB4Li4uKSBkYWVtb25fbG9nZigocyktPmxvZywgREFFTU9OX0xPR19GQVRBTCwgeCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJkYWVtb24vc2VydmVyL2RhZW1vbi1zZXJ2ZXIuYyBiL2xpYmRhZW1vbi9zZXJ2ZXIvZGFlbW9uLXNlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjU0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkYWVtb24vc2VydmVyL2RhZW1vbi1zZXJ2ZXIuYwpAQCAtMCwwICsxLDY3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIF9SRUVOVFJBTlQKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImRhZW1vbi1pby5oIgorI2luY2x1ZGUgImRhZW1vbi1zZXJ2ZXIuaCIKKyNpbmNsdWRlICJkYWVtb24tbG9nLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8c3lzbG9nLmg+IC8qIEZJWE1FLiBGb3IgdGhlIGdsb2JhbCBjbG9zZWxvZygpLiAqLworCisjaWYgMAorLyogQ3JlYXRlIGEgZGV2aWNlIG1vbml0b3JpbmcgdGhyZWFkLiAqLworc3RhdGljIGludCBfcHRocmVhZF9jcmVhdGUocHRocmVhZF90ICp0LCB2b2lkICooKmZ1bikodm9pZCAqKSwgdm9pZCAqYXJnLCBpbnQgc3RhY2tzaXplKQoreworCXB0aHJlYWRfYXR0cl90IGF0dHI7CisJcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworCS8qCisJICogV2UgdXNlIGEgc21hbGxlciBzdGFjayBzaW5jZSBpdCBnZXRzIHByZWFsbG9jYXRlZCBpbiBpdHMgZW50aXJldHkKKwkgKi8KKwlwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRyLCBzdGFja3NpemUpOworCXJldHVybiBwdGhyZWFkX2NyZWF0ZSh0LCAmYXR0ciwgZnVuLCBhcmcpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgX3NodXRkb3duX3JlcXVlc3RlZCA9IDA7CitzdGF0aWMgaW50IF9zeXN0ZW1kX2FjdGl2YXRpb24gPSAwOworCitzdGF0aWMgdm9pZCBfZXhpdF9oYW5kbGVyKGludCBzaWcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJX3NodXRkb3duX3JlcXVlc3RlZCA9IDE7Cit9CisKKyNkZWZpbmUgRVhJVF9BTFJFQURZUlVOTklORyAxMworCisjaWZkZWYgX19saW51eF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoKKyAqIEtlcm5lbCB2ZXJzaW9uIDIuNi4zNiBhbmQgaGlnaGVyIGhhcworICogbmV3IE9PTSBraWxsZXIgYWRqdXN0bWVudCBpbnRlcmZhY2UuCisgKi8KKyMgIGRlZmluZSBPT01fQURKX0ZJTEVfT0xEICIvcHJvYy9zZWxmL29vbV9hZGoiCisjICBkZWZpbmUgT09NX0FESl9GSUxFICIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiCisKKy8qIEZyb20gbGludXgvb29tLmggKi8KKy8qIE9sZCBpbnRlcmZhY2UgKi8KKyMgIGRlZmluZSBPT01fRElTQUJMRSAoLTE3KQorIyAgZGVmaW5lIE9PTV9BREpVU1RfTUlOICgtMTYpCisvKiBOZXcgaW50ZXJmYWNlICovCisjICBkZWZpbmUgT09NX1NDT1JFX0FESl9NSU4gKC0xMDAwKQorCisvKiBTeXN0ZW1kIG9uLWRlbWFuZCBhY3RpdmF0aW9uIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBTRF9BQ1RJVkFUSU9OX0VOVl9WQVJfTkFNRSAiU0RfQUNUSVZBVElPTiIKKyMgIGRlZmluZSBTRF9MSVNURU5fUElEX0VOVl9WQVJfTkFNRSAiTElTVEVOX1BJRCIKKyMgIGRlZmluZSBTRF9MSVNURU5fRkRTX0VOVl9WQVJfTkFNRSAiTElTVEVOX0ZEUyIKKyMgIGRlZmluZSBTRF9MSVNURU5fRkRTX1NUQVJUIDMKKyMgIGRlZmluZSBTRF9GRF9TT0NLRVRfU0VSVkVSIFNEX0xJU1RFTl9GRFNfU1RBUlQKKworc3RhdGljIGludCBfaXNfaWRsZShkYWVtb25fc3RhdGUgcykKK3sKKwlyZXR1cm4gcy5pZGxlICYmIHMuaWRsZS0+aXNfaWRsZSAmJiAhcy50aHJlYWRzLT5uZXh0OworfQorCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgKl9nZXRfdGltZW91dChkYWVtb25fc3RhdGUgcykKK3sKKwlyZXR1cm4gcy5pZGxlID8gcy5pZGxlLT5wdGltZW91dCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9yZXNldF90aW1lb3V0KGRhZW1vbl9zdGF0ZSBzKQoreworCWlmIChzLmlkbGUpIHsKKwkJcy5pZGxlLT5wdGltZW91dC0+dHZfc2VjID0gMTsKKwkJcy5pZGxlLT5wdGltZW91dC0+dHZfdXNlYyA9IDA7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgX2dldF9tYXhfdGltZW91dHMoZGFlbW9uX3N0YXRlIHMpCit7CisJcmV0dXJuIHMuaWRsZSA/IHMuaWRsZS0+bWF4X3RpbWVvdXRzIDogMDsKK30KKworc3RhdGljIGludCBfc2V0X29vbV9hZGooY29uc3QgY2hhciAqb29tX2Fkal9wYXRoLCBpbnQgdmFsKQoreworCUZJTEUgKmZwOworCisJaWYgKCEoZnAgPSBmb3Blbihvb21fYWRqX3BhdGgsICJ3IikpKSB7CisJCXBlcnJvcigib29tX2FkajogZm9wZW4gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWZwcmludGYoZnAsICIlaSIsIHZhbCk7CisKKwlpZiAoZG1fZmNsb3NlKGZwKSkKKwkJcGVycm9yKCJvb21fYWRqOiBmY2xvc2UgZmFpbGVkIik7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFByb3RlY3Rpb24gYWdhaW5zdCBPT00ga2lsbGVyIGlmIGtlcm5lbCBzdXBwb3J0cyBpdAorICovCitzdGF0aWMgaW50IF9wcm90ZWN0X2FnYWluc3Rfb29tX2tpbGxlcih2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQoT09NX0FESl9GSUxFLCAmc3QpID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQlwZXJyb3IoT09NX0FESl9GSUxFICI6IHN0YXQgZmFpbGVkIik7CisKKwkJLyogVHJ5IG9sZCBvb21fYWRqIGludGVyZmFjZSBhcyBhIGZhbGxiYWNrICovCisJCWlmIChzdGF0KE9PTV9BREpfRklMRV9PTEQsICZzdCkgPT0gLTEpIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQkJcGVycm9yKE9PTV9BREpfRklMRV9PTEQgIiBub3QgZm91bmQiKTsKKwkJCWVsc2UKKwkJCQlwZXJyb3IoT09NX0FESl9GSUxFX09MRCAiOiBzdGF0IGZhaWxlZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlyZXR1cm4gX3NldF9vb21fYWRqKE9PTV9BREpfRklMRV9PTEQsIE9PTV9ESVNBQkxFKSB8fAorCQkgICAgICAgX3NldF9vb21fYWRqKE9PTV9BREpfRklMRV9PTEQsIE9PTV9BREpVU1RfTUlOKTsKKwl9CisKKwlyZXR1cm4gX3NldF9vb21fYWRqKE9PTV9BREpfRklMRSwgT09NX1NDT1JFX0FESl9NSU4pOworfQorCit1bmlvbiBzb2NrYWRkcl91bmlvbiB7CisJc3RydWN0IHNvY2thZGRyIHNhOworCXN0cnVjdCBzb2NrYWRkcl91biB1bjsKK307CisKK3N0YXRpYyBpbnQgX2hhbmRsZV9wcmVsb2FkZWRfc29ja2V0KGludCBmZCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdF9mZDsKKwl1bmlvbiBzb2NrYWRkcl91bmlvbiBzb2NrYWRkciA9IHsgLnNhLnNhX2ZhbWlseSA9IDAgfTsKKwlpbnQgdHlwZSA9IDA7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZih0eXBlKTsKKwlzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4ocGF0aCk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChmc3RhdChmZCwgJnN0X2ZkKSA8IDAgfHwgIVNfSVNTT0NLKHN0X2ZkLnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworCWlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19UWVBFLCAmdHlwZSwgJmxlbikgPCAwIHx8CisJICAgIGxlbiAhPSBzaXplb2YodHlwZSkgfHwgdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzaXplb2Yoc29ja2FkZHIpOworCWlmIChnZXRzb2NrbmFtZShmZCwgJnNvY2thZGRyLnNhLCAmbGVuKSA8IDAgfHwKKwkgICAgbGVuIDwgc2l6ZW9mKHNhX2ZhbWlseV90KSB8fAorCSAgICBzb2NrYWRkci5zYS5zYV9mYW1pbHkgIT0gUEZfVU5JWCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShsZW4gPj0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbiArIDEgJiYKKwkgICAgICBtZW1jbXAocGF0aCwgc29ja2FkZHIudW4uc3VuX3BhdGgsIHBhdGhfbGVuKSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc3lzdGVtZF9oYW5kb3ZlcihzdHJ1Y3QgZGFlbW9uX3N0YXRlICpkcykKK3sKKwljb25zdCBjaGFyICplOworCWNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyBlbnZfcGlkLCBlbnZfbGlzdGVuX2ZkczsKKwlpbnQgciA9IDA7CisKKwkvKiBTRF9BQ1RJVkFUSU9OIG11c3QgYmUgc2V0ISAqLworCWlmICghKGUgPSBnZXRlbnYoU0RfQUNUSVZBVElPTl9FTlZfVkFSX05BTUUpKSB8fCBzdHJjbXAoZSwgIjEiKSkKKwkJZ290byBvdXQ7CisKKwkvKiBMSVNURU5fUElEIG11c3QgYmUgZXF1YWwgdG8gb3VyIFBJRCEgKi8KKwlpZiAoIShlID0gZ2V0ZW52KFNEX0xJU1RFTl9QSURfRU5WX1ZBUl9OQU1FKSkpCisJCWdvdG8gb3V0OworCisJZXJybm8gPSAwOworCWVudl9waWQgPSBzdHJ0b3VsKGUsICZwLCAxMCk7CisJaWYgKGVycm5vIHx8ICFwIHx8ICpwIHx8IGVudl9waWQgPD0gMCB8fAorCSAgICBnZXRwaWQoKSAhPSAocGlkX3QpIGVudl9waWQpCisJCWdvdG8gb3V0OworCisJLyogTElTVEVOX0ZEUyBtdXN0IGJlIDEgYW5kIHRoZSBmZCBtdXN0IGJlIGEgc29ja2V0ISAqLworCWlmICghKGUgPSBnZXRlbnYoU0RfTElTVEVOX0ZEU19FTlZfVkFSX05BTUUpKSkKKwkJZ290byBvdXQ7CisKKwllcnJubyA9IDA7CisJZW52X2xpc3Rlbl9mZHMgPSBzdHJ0b3VsKGUsICZwLCAxMCk7CisJaWYgKGVycm5vIHx8ICFwIHx8ICpwIHx8IGVudl9saXN0ZW5fZmRzICE9IDEpCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgYW5kIGhhbmRsZSB0aGUgc29ja2V0IHBhc3NlZCBpbiAqLworCWlmICgociA9IF9oYW5kbGVfcHJlbG9hZGVkX3NvY2tldChTRF9GRF9TT0NLRVRfU0VSVkVSLCBkcy0+c29ja2V0X3BhdGgpKSkKKwkJZHMtPnNvY2tldF9mZCA9IFNEX0ZEX1NPQ0tFVF9TRVJWRVI7CisKK291dDoKKwl1bnNldGVudihTRF9BQ1RJVkFUSU9OX0VOVl9WQVJfTkFNRSk7CisJdW5zZXRlbnYoU0RfTElTVEVOX1BJRF9FTlZfVkFSX05BTUUpOworCXVuc2V0ZW52KFNEX0xJU1RFTl9GRFNfRU5WX1ZBUl9OQU1FKTsKKwlyZXR1cm4gcjsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgX29wZW5fc29ja2V0KGRhZW1vbl9zdGF0ZSBzKQoreworCWludCBmZDsKKwlpbnQgZmlsZV9jcmVhdGVkID0gMDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja2FkZHIgPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OworCXN0cnVjdCBzdGF0IGJ1ZjsKKwltb2RlX3Qgb2xkX21hc2s7CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQocy5zb2NrZXRfcGF0aCwgU19JRlNPQ0spOworCW9sZF9tYXNrID0gdW1hc2soMDA3Nyk7CisKKwkvKiBPcGVuIGxvY2FsIHNvY2tldCAqLworCWZkID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcigiQ2FuJ3QgY3JlYXRlIGxvY2FsIHNvY2tldC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBTZXQgbm9uLWJsb2NraW5nICovCisJaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBmY250bChmZCwgRl9HRVRGTCwgMCkgfCBPX05PTkJMT0NLKSkKKwkJZnByaW50ZihzdGRlcnIsICJzZXR0aW5nIE9fTk9OQkxPQ0sgb24gc29ja2V0IGZkICVkIGZhaWxlZDogJXNcbiIsIGZkLCBzdHJlcnJvcihlcnJubykpOworCisJZnByaW50ZihzdGRlcnIsICJbRF0gY3JlYXRpbmcgJXNcbiIsIHMuc29ja2V0X3BhdGgpOworCWlmICghZG1fc3RybmNweShzb2NrYWRkci5zdW5fcGF0aCwgcy5zb2NrZXRfcGF0aCwgc2l6ZW9mKHNvY2thZGRyLnN1bl9wYXRoKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZGFlbW9uIHNvY2tldCBwYXRoIHRvbyBsb25nLlxuIiwgcy5zb2NrZXRfcGF0aCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2thZGRyLCBzaXplb2Yoc29ja2FkZHIpKSkgeworCQlpZiAoZXJybm8gIT0gRUFERFJJTlVTRSkgeworCQkJcGVycm9yKCJjYW4ndCBiaW5kIGxvY2FsIHNvY2tldCIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIFNvY2tldCBhbHJlYWR5IGV4aXN0cy4gSWYgaXQncyBzdGFsZSwgcmVtb3ZlIGl0LiAqLworCQlpZiAobHN0YXQoc29ja2FkZHIuc3VuX3BhdGgsICZidWYpKSB7CisJCQlwZXJyb3IoInN0YXQgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKCFTX0lTU09DSyhidWYuc3RfbW9kZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBhIHNvY2tldFxuIiwgc29ja2FkZHIuc3VuX3BhdGgpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChidWYuc3RfdWlkIHx8IChidWYuc3RfbW9kZSAmIChTX0lSV1hHIHwgU19JUldYTykpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bnJlY29nbmlzZWQgcGVybWlzc2lvbnNcbiIsIHNvY2thZGRyLnN1bl9wYXRoKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAoIWNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2thZGRyLCBzaXplb2Yoc29ja2FkZHIpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJTb2NrZXQgJXMgYWxyZWFkeSBpbiB1c2VcbiIsIHNvY2thZGRyLnN1bl9wYXRoKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlmcHJpbnRmKHN0ZGVyciwgInJlbW92aW5nIHN0YWxlIHNvY2tldCAlc1xuIiwgc29ja2FkZHIuc3VuX3BhdGgpOworCisJCWlmICh1bmxpbmsoc29ja2FkZHIuc3VuX3BhdGgpICYmIChlcnJubyAhPSBFTk9FTlQpKSB7CisJCQlwZXJyb3IoInVubGluayBmYWlsZWQiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29ja2FkZHIsIHNpemVvZihzb2NrYWRkcikpKSB7CisJCQlwZXJyb3IoImxvY2FsIHNvY2tldCBiaW5kIGZhaWxlZCBhZnRlciB1bmxpbmsiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlmaWxlX2NyZWF0ZWQgPSAxOworCisJaWYgKGxpc3RlbihmZCwgMSkgIT0gMCkgeworCQlwZXJyb3IoImxpc3RlbiBsb2NhbCIpOworCQlnb3RvIGVycm9yOworCX0KKworb3V0OgorCXVtYXNrKG9sZF9tYXNrKTsKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJcmV0dXJuIGZkOworCitlcnJvcjoKKwlpZiAoZmQgPj0gMCkgeworCQlpZiAoY2xvc2UoZmQpKQorCQkJcGVycm9yKCJjbG9zZSBmYWlsZWQiKTsKKwkJaWYgKGZpbGVfY3JlYXRlZCAmJiB1bmxpbmsocy5zb2NrZXRfcGF0aCkpCisJCQlwZXJyb3IoInVubGluayBmYWlsZWQiKTsKKwkJZmQgPSAtMTsKKwl9CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9yZW1vdmVfbG9ja2ZpbGUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpZiAodW5saW5rKGZpbGUpKQorCQlwZXJyb3IoInVubGluayBmYWlsZWQiKTsKK30KKworc3RhdGljIHZvaWQgX2RhZW1vbmlzZShkYWVtb25fc3RhdGUgcykKK3sKKwlpbnQgY2hpbGRfc3RhdHVzOworCWludCBmZDsKKwlwaWRfdCBwaWQ7CisJc3RydWN0IHJsaW1pdCBybGltOworCXN0cnVjdCB0aW1ldmFsIHR2YWw7CisJc2lnc2V0X3QgbXlfc2lnc2V0OworCisJc2lnZW1wdHlzZXQoJm15X3NpZ3NldCk7CisJaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbXlfc2lnc2V0LCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcmVzdG9yZSBzaWduYWxzLlxuIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJc2lnbmFsKFNJR1RFUk0sICZfZXhpdF9oYW5kbGVyKTsKKworCXN3aXRjaCAocGlkID0gZm9yaygpKSB7CisJY2FzZSAtMToKKwkJcGVycm9yKCJmb3JrIGZhaWxlZDoiKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCisJY2FzZSAwOgkJLyogQ2hpbGQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBXYWl0IGZvciByZXNwb25zZSBmcm9tIGNoaWxkICovCisJCXdoaWxlICghd2FpdHBpZChwaWQsICZjaGlsZF9zdGF0dXMsIFdOT0hBTkcpICYmICFfc2h1dGRvd25fcmVxdWVzdGVkKSB7CisJCQl0dmFsLnR2X3NlYyA9IDA7CisJCQl0dmFsLnR2X3VzZWMgPSAyNTAwMDA7CS8qIC4yNSBzZWMgKi8KKwkJCXNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHZhbCk7CisJCX0KKworCQlpZiAoX3NodXRkb3duX3JlcXVlc3RlZCkgLyogQ2hpbGQgaGFzIHNpZ25hbGVkIGl0IGlzIG9rIC0gd2UgY2FuIGV4aXQgbm93ICovCisJCQlleGl0KDApOworCisJCXN3aXRjaCAoV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSkgeworCQljYXNlIEVYSVRfQUxSRUFEWVJVTk5JTkc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhY3F1aXJlIGxvY2sgb24gJXMuIEFscmVhZHkgcnVubmluZz9cbiIsIHMucGlkZmlsZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFByb2JsZW0gd2l0aCBjaGlsZC4gIERldGVybWluZSB3aGF0IGl0IGlzIGJ5IGV4aXQgY29kZSAqLworCQkJZnByaW50ZihzdGRlcnIsICJDaGlsZCBleGl0ZWQgd2l0aCBjb2RlICVkXG4iLCBXRVhJVFNUQVRVUyhjaGlsZF9zdGF0dXMpKTsKKwkJfQorCQlleGl0KFdFWElUU1RBVFVTKGNoaWxkX3N0YXR1cykpOworCX0KKworCWlmIChjaGRpcigiLyIpKQorCQlleGl0KDEpOworCisJaWYgKGdldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxpbSkgPCAwKQorCQlmZCA9IDI1NjsgLyoganVzdCBoYXZlIHRvIGd1ZXNzICovCisJZWxzZQorCQlmZCA9IHJsaW0ucmxpbV9jdXI7CisKKwlmb3IgKC0tZmQ7IGZkID49IDA7IGZkLS0pIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJLyogRG8gbm90IGNsb3NlIGZkcyBwcmVsb2FkZWQgYnkgc3lzdGVtZCEgKi8KKwkJaWYgKF9zeXN0ZW1kX2FjdGl2YXRpb24gJiYgZmQgPT0gU0RfRkRfU09DS0VUX1NFUlZFUikKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCSh2b2lkKSBjbG9zZShmZCk7CisJfQorCisJaWYgKChvcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSkgPCAwKSB8fAorCSAgICAob3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpIDwgMCkgfHwKKwkgICAgKG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKSA8IDApKQorCQlleGl0KDEpOworCisJc2V0c2lkKCk7Cit9CisKK3Jlc3BvbnNlIGRhZW1vbl9yZXBseV9zaW1wbGUoY29uc3QgY2hhciAqaWQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXJlc3BvbnNlIHJlcyA9IHsgLmNmdCA9IE5VTEwgfTsKKworCXZhX3N0YXJ0KGFwLCBpZCk7CisKKwlidWZmZXJfaW5pdCgmcmVzLmJ1ZmZlcik7CisJaWYgKCFidWZmZXJfYXBwZW5kX2YoJnJlcy5idWZmZXIsICJyZXNwb25zZSA9ICVzIiwgaWQsIE5VTEwpKSB7CisJCXJlcy5lcnJvciA9IEVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCWlmICghYnVmZmVyX2FwcGVuZF92ZigmcmVzLmJ1ZmZlciwgYXApKSB7CisJCXJlcy5lcnJvciA9IEVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgcmVzcG9uc2UgX2J1aWx0aW5faGFuZGxlcihkYWVtb25fc3RhdGUgcywgY2xpZW50X2hhbmRsZSBoLCByZXF1ZXN0IHIpCit7CisJY29uc3QgY2hhciAqcnEgPSBkYWVtb25fcmVxdWVzdF9zdHIociwgInJlcXVlc3QiLCAiTk9ORSIpOworCXJlc3BvbnNlIHJlcyA9IHsgLmVycm9yID0gRVBST1RPIH07CisKKwlpZiAoIXN0cmNtcChycSwgImhlbGxvIikpIHsKKwkJcmV0dXJuIGRhZW1vbl9yZXBseV9zaW1wbGUoIk9LIiwgInByb3RvY29sID0gJXMiLCBzLnByb3RvY29sID86ICJkZWZhdWx0IiwKKwkJCQkJICAgInZlcnNpb24gPSAlIiBQUklkNjQsIChpbnQ2NF90KSBzLnByb3RvY29sX3ZlcnNpb24sIE5VTEwpOworCX0KKworCWJ1ZmZlcl9pbml0KCZyZXMuYnVmZmVyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCAqX2NsaWVudF90aHJlYWQodm9pZCAqc3RhdGUpCit7CisJdGhyZWFkX3N0YXRlICp0cyA9IHN0YXRlOworCXJlcXVlc3QgcmVxOworCXJlc3BvbnNlIHJlczsKKworCWJ1ZmZlcl9pbml0KCZyZXEuYnVmZmVyKTsKKworCXdoaWxlICgxKSB7CisJCWlmICghYnVmZmVyX3JlYWQodHMtPmNsaWVudC5zb2NrZXRfZmQsICZyZXEuYnVmZmVyKSkKKwkJCWdvdG8gZmFpbDsKKworCQlyZXEuY2Z0ID0gZG1fY29uZmlnX2Zyb21fc3RyaW5nKHJlcS5idWZmZXIubWVtKTsKKworCQlpZiAoIXJlcS5jZnQpCisJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHBhcnNpbmcgcmVxdWVzdDpcbiAlc1xuIiwgcmVxLmJ1ZmZlci5tZW0pOworCQllbHNlCisJCQlkYWVtb25fbG9nX2NmdCh0cy0+cy5sb2csIERBRU1PTl9MT0dfV0lSRSwgIjwtICIsIHJlcS5jZnQtPnJvb3QpOworCisJCXJlcyA9IF9idWlsdGluX2hhbmRsZXIodHMtPnMsIHRzLT5jbGllbnQsIHJlcSk7CisKKwkJaWYgKHJlcy5lcnJvciA9PSBFUFJPVE8pIC8qIE5vdCBhIGJ1aWx0aW4sIGRlbGVnYXRlIHRvIHRoZSBjdXN0b20gaGFuZGxlci4gKi8KKwkJCXJlcyA9IHRzLT5zLmhhbmRsZXIodHMtPnMsIHRzLT5jbGllbnQsIHJlcSk7CisKKwkJaWYgKCFyZXMuYnVmZmVyLm1lbSkgeworCQkJaWYgKCFkbV9jb25maWdfd3JpdGVfbm9kZShyZXMuY2Z0LT5yb290LCBidWZmZXJfbGluZSwgJnJlcy5idWZmZXIpKQorCQkJCWdvdG8gZmFpbDsKKwkJCWlmICghYnVmZmVyX2FwcGVuZCgmcmVzLmJ1ZmZlciwgIlxuXG4iKSkKKwkJCQlnb3RvIGZhaWw7CisJCQlkbV9jb25maWdfZGVzdHJveShyZXMuY2Z0KTsKKwkJfQorCisJCWlmIChyZXEuY2Z0KQorCQkJZG1fY29uZmlnX2Rlc3Ryb3kocmVxLmNmdCk7CisJCWJ1ZmZlcl9kZXN0cm95KCZyZXEuYnVmZmVyKTsKKworCQlkYWVtb25fbG9nX211bHRpKHRzLT5zLmxvZywgREFFTU9OX0xPR19XSVJFLCAiLT4gIiwgcmVzLmJ1ZmZlci5tZW0pOworCQlidWZmZXJfd3JpdGUodHMtPmNsaWVudC5zb2NrZXRfZmQsICZyZXMuYnVmZmVyKTsKKworCQlidWZmZXJfZGVzdHJveSgmcmVzLmJ1ZmZlcik7CisJfQorZmFpbDoKKwkvKiBUT0RPIHdoYXQgc2hvdWxkIHdlIHJlYWxseSBkbyBoZXJlPyAqLworCWlmIChjbG9zZSh0cy0+Y2xpZW50LnNvY2tldF9mZCkpCisJCXBlcnJvcigiY2xvc2UiKTsKKwlidWZmZXJfZGVzdHJveSgmcmVxLmJ1ZmZlcik7CisJdHMtPmFjdGl2ZSA9IDA7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2Nvbm5lY3QoZGFlbW9uX3N0YXRlIHMpCit7CisJdGhyZWFkX3N0YXRlICp0czsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja2FkZHI7CisJY2xpZW50X2hhbmRsZSBjbGllbnQgPSB7IC50aHJlYWRfaWQgPSAwIH07CisJc29ja2xlbl90IHNsID0gc2l6ZW9mKHNvY2thZGRyKTsKKworCWNsaWVudC5zb2NrZXRfZmQgPSBhY2NlcHQocy5zb2NrZXRfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2thZGRyLCAmc2wpOworCWlmIChjbGllbnQuc29ja2V0X2ZkIDwgMCkgeworCQlFUlJPUigmcywgIkZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJIGlmIChmY250bChjbGllbnQuc29ja2V0X2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSkKKwkJV0FSTigmcywgInNldHRpbmcgQ0xPRVhFQyBvbiBjbGllbnQgc29ja2V0IGZkICVkIGZhaWxlZCIsIGNsaWVudC5zb2NrZXRfZmQpOworCisJaWYgKCEodHMgPSBkbV9tYWxsb2Moc2l6ZW9mKHRocmVhZF9zdGF0ZSkpKSkgeworCQlpZiAoY2xvc2UoY2xpZW50LnNvY2tldF9mZCkpCisJCQlwZXJyb3IoImNsb3NlIik7CisJCUVSUk9SKCZzLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRocmVhZCBzdGF0ZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0cy0+bmV4dCA9IHMudGhyZWFkcy0+bmV4dDsKKwlzLnRocmVhZHMtPm5leHQgPSB0czsKKworCXRzLT5hY3RpdmUgPSAxOworCXRzLT5zID0gczsKKwl0cy0+Y2xpZW50ID0gY2xpZW50OworCisJaWYgKHB0aHJlYWRfY3JlYXRlKCZ0cy0+Y2xpZW50LnRocmVhZF9pZCwgTlVMTCwgX2NsaWVudF90aHJlYWQsIHRzKSkgeworCQlFUlJPUigmcywgIkZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHRocmVhZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9yZWFwKGRhZW1vbl9zdGF0ZSBzLCBpbnQgd2FpdGluZykKK3sKKwl0aHJlYWRfc3RhdGUgKmxhc3QgPSBzLnRocmVhZHMsICp0cyA9IGxhc3QtPm5leHQ7CisJdm9pZCAqcnY7CisKKwl3aGlsZSAodHMpIHsKKwkJaWYgKHdhaXRpbmcgfHwgIXRzLT5hY3RpdmUpIHsKKwkJCWlmICgoZXJybm8gPSBwdGhyZWFkX2pvaW4odHMtPmNsaWVudC50aHJlYWRfaWQsICZydikpKQorCQkJCUVSUk9SKCZzLCAicHRocmVhZF9qb2luIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJbGFzdC0+bmV4dCA9IHRzLT5uZXh0OworCQkJZG1fZnJlZSh0cyk7CisJCX0gZWxzZQorCQkJbGFzdCA9IHRzOworCQl0cyA9IGxhc3QtPm5leHQ7CisJfQorfQorCit2b2lkIGRhZW1vbl9zdGFydChkYWVtb25fc3RhdGUgcykKK3sKKwlpbnQgZmFpbGVkID0gMDsKKwlsb2dfc3RhdGUgX2xvZyA9IHsgeyAwIH0gfTsKKwl0aHJlYWRfc3RhdGUgX3RocmVhZHMgPSB7IC5uZXh0ID0gTlVMTCB9OworCXVuc2lnbmVkIHRpbWVvdXRfY291bnQgPSAwOworCWZkX3NldCBpbjsKKworCS8qCisJICogU3dpdGNoIHRvIEMgbG9jYWxlIHRvIGF2b2lkIHJlYWRpbmcgbGFyZ2UgbG9jYWxlLWFyY2hpdmUgZmlsZSB1c2VkIGJ5CisJICogc29tZSBnbGliYyAob24gc29tZSBkaXN0cmlidXRpb25zIGl0IHRha2VzIG92ZXIgMTAwTUIpLiBTb21lIGRhZW1vbnMKKwkgKiBuZWVkIHRvIHVzZSBtbG9ja2FsbCgpLgorCSAqLworCWlmIChzZXRlbnYoIkxDX0FMTCIsICJDIiwgMSkpCisJCXBlcnJvcigiQ2Fubm90IHNldCBMQ19BTEwgdG8gQyIpOworCisjaWZkZWYgX19saW51eF9fCisJX3N5c3RlbWRfYWN0aXZhdGlvbiA9IF9zeXN0ZW1kX2hhbmRvdmVyKCZzKTsKKyNlbmRpZgorCisJaWYgKCFzLmZvcmVncm91bmQpCisJCV9kYWVtb25pc2Uocyk7CisKKwlzLmxvZyA9ICZfbG9nOworCXMubG9nLT5uYW1lID0gcy5uYW1lOworCXMudGhyZWFkcyA9ICZfdGhyZWFkczsKKworCS8qIExvZyBpbXBvcnRhbnQgdGhpbmdzIHRvIHN5c2xvZyBieSBkZWZhdWx0LiAqLworCWRhZW1vbl9sb2dfZW5hYmxlKHMubG9nLCBEQUVNT05fTE9HX09VVExFVF9TWVNMT0csIERBRU1PTl9MT0dfRkFUQUwsIDEpOworCWRhZW1vbl9sb2dfZW5hYmxlKHMubG9nLCBEQUVNT05fTE9HX09VVExFVF9TWVNMT0csIERBRU1PTl9MT0dfRVJST1IsIDEpOworCisJaWYgKHMucGlkZmlsZSkgeworCQkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQocy5waWRmaWxlLCBTX0lGUkVHKTsKKworCQkvKgorCQkgKiBOQi4gVGFrZSBjYXJlIHRvIG5vdCBrZWVwIHN0YWxlIGxvY2tzIGFyb3VuZC4gQmVzdCBub3QgZXhpdCguLi4pCisJCSAqIGFmdGVyIHRoaXMgcG9pbnQuCisJCSAqLworCQlpZiAoZG1fY3JlYXRlX2xvY2tmaWxlKHMucGlkZmlsZSkgPT0gMCkgeworCQkJRVJST1IoJnMsICJGYWlsZWQgdG8gYWNxdWlyZSBsb2NrIG9uICVzLiBBbHJlYWR5IHJ1bm5pbmc/XG4iLCBzLnBpZGZpbGUpOworCQkJZXhpdChFWElUX0FMUkVBRFlSVU5OSU5HKTsKKwkJfQorCisJCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKwl9CisKKwkvKiBTZXQgbm9ybWFsIGV4aXQgc2lnbmFscyB0byByZXF1ZXN0IHNodXRkb3duIGluc3RlYWQgb2YgZHlpbmcuICovCisJc2lnbmFsKFNJR0lOVCwgJl9leGl0X2hhbmRsZXIpOworCXNpZ25hbChTSUdIVVAsICZfZXhpdF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUVVJVCwgJl9leGl0X2hhbmRsZXIpOworCXNpZ25hbChTSUdURVJNLCAmX2V4aXRfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FMUk0sICZfZXhpdF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKyNpZmRlZiBfX2xpbnV4X18KKwkvKiBTeXN0ZW1kIGhhcyBhZGp1c3RlZCBvb20ga2lsbGVyIGZvciB1cyBhbHJlYWR5ICovCisJaWYgKHMuYXZvaWRfb29tICYmICFfc3lzdGVtZF9hY3RpdmF0aW9uICYmICFfcHJvdGVjdF9hZ2FpbnN0X29vbV9raWxsZXIoKSkKKwkJRVJST1IoJnMsICJGYWlsZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IE9PTSBraWxsZXIiKTsKKyNlbmRpZgorCisJaWYgKCFfc3lzdGVtZF9hY3RpdmF0aW9uICYmIHMuc29ja2V0X3BhdGgpIHsKKwkJcy5zb2NrZXRfZmQgPSBfb3Blbl9zb2NrZXQocyk7CisJCWlmIChzLnNvY2tldF9mZCA8IDApCisJCQlmYWlsZWQgPSAxOworCX0KKworCS8qIFNldCBDbG9zZS1vbi1leGVjICovCisJaWYgKCFmYWlsZWQgJiYgZmNudGwocy5zb2NrZXRfZmQsIEZfU0VURkQsIDEpKQorCQlFUlJPUigmcywgInNldHRpbmcgQ0xPRVhFQyBvbiBzb2NrZXQgZmQgJWQgZmFpbGVkOiAlc1xuIiwgcy5zb2NrZXRfZmQsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBTaWduYWwgcGFyZW50LCBsZXR0aW5nIHRoZW0ga25vdyB3ZSBhcmUgcmVhZHkgdG8gZ28uICovCisJaWYgKCFzLmZvcmVncm91bmQpCisJCWtpbGwoZ2V0cHBpZCgpLCBTSUdURVJNKTsKKworCS8qCisJICogVXNlIGRhZW1vbl9tYWluIGZvciBkYWVtb24tc3BlY2lmaWMgaW5pdCBhbmQgcG9sbGluZywgb3IKKwkgKiB1c2UgZGFlbW9uX2luaXQgZm9yIGRhZW1vbi1zcGVjaWZpYyBpbml0IGFuZCBnZW5lcmljIGxpYiBwb2xsaW5nLgorCSAqLworCisJaWYgKHMuZGFlbW9uX21haW4pIHsKKwkJaWYgKCFzLmRhZW1vbl9tYWluKCZzKSkKKwkJCWZhaWxlZCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzLmRhZW1vbl9pbml0KQorCQlpZiAoIXMuZGFlbW9uX2luaXQoJnMpKQorCQkJZmFpbGVkID0gMTsKKworCXdoaWxlICghZmFpbGVkKSB7CisJCV9yZXNldF90aW1lb3V0KHMpOworCQlGRF9aRVJPKCZpbik7CisJCUZEX1NFVChzLnNvY2tldF9mZCwgJmluKTsKKwkJaWYgKHNlbGVjdChGRF9TRVRTSVpFLCAmaW4sIE5VTEwsIE5VTEwsIF9nZXRfdGltZW91dChzKSkgPCAwICYmIGVycm5vICE9IEVJTlRSKQorCQkJcGVycm9yKCJzZWxlY3QgZXJyb3IiKTsKKwkJaWYgKEZEX0lTU0VUKHMuc29ja2V0X2ZkLCAmaW4pKSB7CisJCQl0aW1lb3V0X2NvdW50ID0gMDsKKwkJCWhhbmRsZV9jb25uZWN0KHMpOworCQl9CisKKwkJX3JlYXAocywgMCk7CisKKwkJaWYgKF9zaHV0ZG93bl9yZXF1ZXN0ZWQgJiYgIXMudGhyZWFkcy0+bmV4dCkKKwkJCWJyZWFrOworCisJCS8qIHMuaWRsZSA9PSBOVUxMIGVxdWFscyBubyBzaHV0ZG93biBvbiB0aW1lb3V0ICovCisJCWlmIChfaXNfaWRsZShzKSkgeworCQkJREVCVUdMT0coJnMsICJ0aW1lb3V0IG9jY3VyZWQiKTsKKwkJCWlmICgrK3RpbWVvdXRfY291bnQgPj0gX2dldF9tYXhfdGltZW91dHMocykpIHsKKwkJCQlJTkZPKCZzLCAiSW5hY3RpdmUgZm9yICVkIHNlY29uZHMuIEV4aXRpbmcuIiwgdGltZW91dF9jb3VudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlJTkZPKCZzLCAiJXMgd2FpdGluZyBmb3IgY2xpZW50IHRocmVhZHMgdG8gZmluaXNoIiwgcy5uYW1lKTsKKwlfcmVhcChzLCAxKTsKK291dDoKKwkvKiBJZiBhY3RpdmF0ZWQgYnkgc3lzdGVtZCwgZG8gbm90IHVubGluayB0aGUgc29ja2V0IC0gc3lzdGVtZCB0YWtlcyBjYXJlIG9mIHRoYXQhICovCisJaWYgKCFfc3lzdGVtZF9hY3RpdmF0aW9uICYmIHMuc29ja2V0X2ZkID49IDApCisJCWlmICh1bmxpbmsocy5zb2NrZXRfcGF0aCkpCisJCQlwZXJyb3IoInVubGluayBlcnJvciIpOworCisJaWYgKHMuc29ja2V0X2ZkID49IDApCisJCWlmIChjbG9zZShzLnNvY2tldF9mZCkpCisJCQlwZXJyb3IoInNvY2tldCBjbG9zZSIpOworCisJaWYgKHMuZGFlbW9uX2ZpbmkpCisJCWlmICghcy5kYWVtb25fZmluaSgmcykpCisJCQlmYWlsZWQgPSAxOworCisJSU5GTygmcywgIiVzIHNodXR0aW5nIGRvd24iLCBzLm5hbWUpOworCisJY2xvc2Vsb2coKTsgLyogRklYTUUgKi8KKwlpZiAocy5waWRmaWxlKQorCQlfcmVtb3ZlX2xvY2tmaWxlKHMucGlkZmlsZSk7CisJaWYgKGZhaWxlZCkKKwkJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRhZW1vbi9zZXJ2ZXIvZGFlbW9uLXNlcnZlci5oIGIvbGliZGFlbW9uL3NlcnZlci9kYWVtb24tc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5Y2VhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRhZW1vbi9zZXJ2ZXIvZGFlbW9uLXNlcnZlci5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0RBRU1PTl9TRVJWRVJfSAorI2RlZmluZSBfTFZNX0RBRU1PTl9TRVJWRVJfSAorCisjaW5jbHVkZSAiZGFlbW9uLWNsaWVudC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHNvY2tldF9mZDsgLyogdGhlIGZkIHdlIHVzZSB0byB0YWxrIHRvIHRoZSBjbGllbnQgKi8KKwlwdGhyZWFkX3QgdGhyZWFkX2lkOworCWNoYXIgKnJlYWRfYnVmOworCXZvaWQgKnByaXZhdGU7IC8qIHRoaXMgaG9sZHMgcGVyLWNsaWVudCBzdGF0ZSAqLworfSBjbGllbnRfaGFuZGxlOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7Cit9IHJlcXVlc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQ7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7Cit9IHJlc3BvbnNlOworCitzdHJ1Y3QgdGltZXZhbDsKKworLyoKKyAqIGlzX2lkbGU6CSBkYWVtb24gaW1wbGVtZW50YXRpb24gc2V0cyBpdCB0byB0cnVlIHdoZW4gbm8gYmFja2dyb3VuZCB0YXNrCisgKgkJIGlzIHJ1bm5pbmcKKyAqIG1heF90aW1lb3V0czogaG93IG1hbnkgc2Vjb25kcyBkbyBkYWVtb24gYWxsb3cgdG8gYmUgaWRsZSBiZWZvcmUgaXQgc2h1dGRvd25zCisgKiBwdGltZW91dDoJIGludGVybmFsIHZhcmlhYmxlIHBhc3NlZCB0byBzZWxlY3QoKS4gaGFzIHRvIGJlIHJlc2V0IHRvIDEgc2Vjb25kCisgKgkJIGJlZm9yZSBlYWNoIHNlbGVjdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaXNfaWRsZTsKKwl1bnNpZ25lZCBtYXhfdGltZW91dHM7CisJc3RydWN0IHRpbWV2YWwgKnB0aW1lb3V0OworfSBkYWVtb25faWRsZTsKKworc3RydWN0IGRhZW1vbl9zdGF0ZTsKKworLyoKKyAqIENyYWZ0IGEgc2ltcGxlIHJlcGx5LCB3aXRob3V0IHRoZSBuZWVkIHRvIGNvbnN0cnVjdCBhIGNvbmZpZ190cmVlLiBTZWUKKyAqIGRhZW1vbl9zZW5kX3NpbXBsZSBpbiBkYWVtb24tY2xpZW50LmggZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycy4KKyAqLworcmVzcG9uc2UgZGFlbW9uX3JlcGx5X3NpbXBsZShjb25zdCBjaGFyICppZCwgLi4uKTsKKworc3RhdGljIGlubGluZSBpbnQgZGFlbW9uX3JlcXVlc3RfaW50KHJlcXVlc3QgciwgY29uc3QgY2hhciAqcGF0aCwgaW50IGRlZikgeworCWlmICghci5jZnQpCisJCXJldHVybiBkZWY7CisJcmV0dXJuIGRtX2NvbmZpZ19maW5kX2ludChyLmNmdC0+cm9vdCwgcGF0aCwgZGVmKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpkYWVtb25fcmVxdWVzdF9zdHIocmVxdWVzdCByLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpkZWYpIHsKKwlpZiAoIXIuY2Z0KQorCQlyZXR1cm4gZGVmOworCXJldHVybiBkbV9jb25maWdfZmluZF9zdHIoci5jZnQtPnJvb3QsIHBhdGgsIGRlZik7Cit9CisKKy8qCisgKiBUaGUgY2FsbGJhY2suIENhbGxlZCBvbmNlIHBlciByZXF1ZXN0IGlzc3VlZCwgaW4gdGhlIHJlc3BlY3RpdmUgY2xpZW50J3MKKyAqIHRocmVhZC4gSXQgaXMgcHJlc2VudGVkIGJ5IGEgcGFyc2VkIHJlcXVlc3QgKGluIHRoZSBmb3JtIG9mIGEgY29uZmlnIHRyZWUpLgorICogVGhlIG91dHB1dCBpcyBhIG5ldyBjb25maWcgdHJlZSB0aGF0IGlzIHNlcmlhbGlzZWQgYW5kIHNlbnQgYmFjayB0byB0aGUKKyAqIGNsaWVudC4gVGhlIGNsaWVudCBibG9ja3MgdW50aWwgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBkb25lIGFuZCByZXBseSBpcworICogc2VudC4KKyAqLwordHlwZWRlZiByZXNwb25zZSAoKmhhbmRsZV9yZXF1ZXN0KShzdHJ1Y3QgZGFlbW9uX3N0YXRlIHMsIGNsaWVudF9oYW5kbGUgaCwgcmVxdWVzdCByKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGxvZ19jb25maWdbMzJdOworCXZvaWQgKmJhY2tlbmRfc3RhdGVbMzJdOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGxvZ19zdGF0ZTsKKworc3RydWN0IHRocmVhZF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgZGFlbW9uX3N0YXRlIHsKKwkvKgorCSAqIFRoZSBtYXhpbWFsIHN0YWNrIHNpemUgZm9yIGluZGl2aWR1YWwgZGFlbW9uIHRocmVhZHMuIFRoaXMgaXMKKwkgKiBlc3NlbnRpYWwgZm9yIGRhZW1vbnMgdGhhdCBuZWVkIHRvIGJlIGxvY2tlZCBpbnRvIG1lbW9yeSwgc2luY2UKKwkgKiBwdGhyZWFkJ3MgZGVmYXVsdCBpcyAxME0gcGVyIHRocmVhZC4KKwkgKi8KKwlpbnQgdGhyZWFkX3N0YWNrX3NpemU7CisKKwkvKiBGbGFncyAmIGF0dHJpYnV0ZXMgYWZmZWN0aW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRhZW1vbi4gKi8KKwl1bnNpZ25lZCBhdm9pZF9vb206MTsKKwl1bnNpZ25lZCBmb3JlZ3JvdW5kOjE7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwaWRmaWxlOworCWNvbnN0IGNoYXIgKnNvY2tldF9wYXRoOworCWNvbnN0IGNoYXIgKnByb3RvY29sOworCWludCBwcm90b2NvbF92ZXJzaW9uOworCisJaGFuZGxlX3JlcXVlc3QgaGFuZGxlcjsKKwlpbnQgKCpkYWVtb25faW5pdCkoc3RydWN0IGRhZW1vbl9zdGF0ZSAqc3QpOworCWludCAoKmRhZW1vbl9maW5pKShzdHJ1Y3QgZGFlbW9uX3N0YXRlICpzdCk7CisJaW50ICgqZGFlbW9uX21haW4pKHN0cnVjdCBkYWVtb25fc3RhdGUgKnN0KTsKKworCS8qIEdsb2JhbCBydW50aW1lIGluZm8gbWFpbnRhaW5lZCBieSB0aGUgZnJhbWV3b3JrLiAqLworCWludCBzb2NrZXRfZmQ7CisKKwlsb2dfc3RhdGUgKmxvZzsKKwlzdHJ1Y3QgdGhyZWFkX3N0YXRlICp0aHJlYWRzOworCisJLyogc3Vwb3J0IGZvciBzaHV0ZG93biBvbiBpZGxlICovCisJZGFlbW9uX2lkbGUgKmlkbGU7CisKKwl2b2lkICpwcml2YXRlOyAvKiB0aGUgZ2xvYmFsIGRhZW1vbiBzdGF0ZSAqLworfSBkYWVtb25fc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHRocmVhZF9zdGF0ZSB7CisJZGFlbW9uX3N0YXRlIHM7CisJY2xpZW50X2hhbmRsZSBjbGllbnQ7CisJc3RydWN0IHRocmVhZF9zdGF0ZSAqbmV4dDsKKwl2b2xhdGlsZSBpbnQgYWN0aXZlOworfSB0aHJlYWRfc3RhdGU7CisKKy8qCisgKiBTdGFydCBzZXJ2aW5nIHRoZSByZXF1ZXN0cy4gVGhpcyBkb2VzIGFsbCB0aGUgZGFlbW9uaXNhdGlvbiwgc29ja2V0IHNldHVwCisgKiB3b3JrIGFuZCBzbyBvbi4gVGhpcyBmdW5jdGlvbiB0YWtlcyBvdmVyIHRoZSBwcm9jZXNzLCBhbmQgdXBvbiBmYWlsdXJlLCBpdAorICogd2lsbCB0ZXJtaW5hdGUgZXhlY3V0aW9uLiBJdCBtYXkgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4KKyAqLwordm9pZCBkYWVtb25fc3RhcnQoZGFlbW9uX3N0YXRlIHMpOworCisvKgorICogVGFrZSBvdmVyIGZyb20gYW4gYWxyZWFkeSBydW5uaW5nIGRhZW1vbi4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGNvbm5lY3RpbmcKKyAqIHRvIHRoZSBydW5uaW5nIGRhZW1vbiBhbmQgdGVsbGluZyBpdCB3ZSBhcmUgZ29pbmcgdG8gdGFrZSBvdmVyLiBUaGUgdGFrZW92ZXIKKyAqIHJlcXVlc3QgbWF5IGJlIGN1c3RvbWlzZWQgYnkgcGFzc2luZyBpbiBhIG5vbi1OVUxMIHJlcXVlc3QuCisgKgorICogVGhlIHRha2VvdmVyIHNlcXVlbmNlOiB0aGUgb2xkIGRhZW1vbiBzdG9wcyBhY2NlcHRpbmcgbmV3IGNsaWVudHMsIHRoZW4gaXQKKyAqIHdhaXRzIHVudGlsIGFsbCBjdXJyZW50IGNsaWVudCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkLiBXaGVuIHRoYXQgaGFwcGVucywgaXQKKyAqIHNlcmlhbGl6ZXMgaXRzIGN1cnJlbnQgc3RhdGUgYW5kIHNlbmRzIHRoYXQgYXMgYSByZXBseSwgd2hpY2ggaXMgdGhlbgorICogcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAodGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIHdvbid0IHJldHVybiB1bnRpbCB0aGUKKyAqIHByZXZpb3VzIGluc3RhbmNlIGhhcyBzaHV0IGRvd24pLgorICoKKyAqIFRoZSBkYWVtb24sIGFmdGVyIGNhbGxpbmcgZGFlbW9uX3Rha2VvdmVyIGlzIGV4cGVjdGVkIHRvIHNldCB1cCBpdHMKKyAqIGRhZW1vbl9zdGF0ZSB1c2luZyB0aGUgcmVwbHkgZnJvbSB0aGlzIGZ1bmN0aW9uIGFuZCBjYWxsIGRhZW1vbl9zdGFydCBhcworICogdXN1YWwuCisgKi8KK2RhZW1vbl9yZXBseSBkYWVtb25fdGFrZW92ZXIoZGFlbW9uX2luZm8gaSwgZGFlbW9uX3JlcXVlc3Qgcik7CisKKy8qIENhbGwgdGhpcyB0byByZXF1ZXN0IGEgY2xlYW4gc2h1dGRvd24gb2YgdGhlIGRhZW1vbi4gQXN5bmMgc2FmZS4gKi8KK3ZvaWQgZGFlbW9uX3N0b3Aodm9pZCk7CisKK2VudW0geyBEQUVNT05fTE9HX09VVExFVF9TWVNMT0cgPSAxLAorICAgICAgIERBRU1PTl9MT0dfT1VUTEVUX1NUREVSUiA9IDIsCisgICAgICAgREFFTU9OX0xPR19PVVRMRVRfU09DS0VUID0gNCB9OworCisvKiBMb2cgYSBtZXNzYWdlIG9mIGEgZ2l2ZW4gdHlwZS4gKi8KK3ZvaWQgZGFlbW9uX2xvZyhsb2dfc3RhdGUgKnMsIGludCB0eXBlLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKworLyogTG9nIGEgY29uZmlnIChzdWIpdHJlZSwgdXNpbmcgYSBnaXZlbiBtZXNzYWdlIHR5cGUsIGVhY2ggbGluZSBwcmVmaXhlZCB3aXRoICJwcmVmaXgiLiAqLwordm9pZCBkYWVtb25fbG9nX2NmdChsb2dfc3RhdGUgKnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbik7CisKKy8qIExvZyBhIG11bHRpLWxpbmUgYmxvY2ssIHByZWZpeGluZyBlYWNoIGxpbmUgd2l0aCAicHJlZml4Ii4gKi8KK3ZvaWQgZGFlbW9uX2xvZ19tdWx0aShsb2dfc3RhdGUgKnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworCisvKiBMb2cgYSBmb3JtYXR0ZWQgbWVzc2FnZSBhcyAidHlwZSIuIFNlZSBhbHNvIGRhZW1vbi1sb2cuaC4gKi8KK3ZvaWQgZGFlbW9uX2xvZ2YobG9nX3N0YXRlICpzLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CisKKy8qCisgKiBDb25maWd1cmUgbG9nX3N0YXRlIHRvIHNlbmQgbWVzc2FnZXMgb2YgdHlwZSAidHlwZSIgdG8gdGhlIGxvZyBvdXRsZXQKKyAqICJvdXRsZXQiLCBpZmYgImVuYWJsZSIgaXMgdHJ1ZS4KKyAqLwordm9pZCBkYWVtb25fbG9nX2VuYWJsZShsb2dfc3RhdGUgKnMsIGludCBvdXRsZXQsIGludCB0eXBlLCBpbnQgZW5hYmxlKTsKKworLyoKKyAqIFNldCB1cCBsb2dnaW5nIG9uIGEgZ2l2ZW4gb3V0bGV0IHVzaW5nIGEgbGlzdCBvZiBtZXNzYWdlIHR5cGVzIChjb21tYQorICogc2VwYXJhdGVkKSB0byBsb2cgdXNpbmcgdGhhdCBvdXRsZXQuIFRoZSBsaXN0IGlzIGV4cGVjdGVkIHRvIGxvb2sgbGlrZSB0aGlzLAorICogImFsbCx3aXJlLGRlYnVnIi4gUmV0dXJucyAwIHVwb24gZW5jb3VudGVyaW5nIGFuIHVua25vd24gbWVzc2FnZSB0eXBlLgorICovCitpbnQgZGFlbW9uX2xvZ19wYXJzZShsb2dfc3RhdGUgKnMsIGludCBvdXRsZXQsIGNvbnN0IGNoYXIgKnR5cGVzLCBpbnQgZW5hYmxlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDA2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scwpAQCAtMCwwICsxLDEyIEBACitkbV9ib3VuZHNfY2hlY2tfZGVidWcKK2RtX2R1bXBfbWVtb3J5X2RlYnVnCitkbV9mcmVlX2F1eAorZG1fbG9nCitkbV9sb2dfd2l0aF9lcnJubworZG1fbWFsbG9jX2F1eAorZG1fbWFsbG9jX2F1eF9kZWJ1ZworZG1fcmVhbGxvY19hdXgKK2RtX3N0cmR1cF9hdXgKK2RtX3Rhc2tfZ2V0X2luZm9fd2l0aF9kZWZlcnJlZF9yZW1vdmUKK2RtX3phbGxvY19hdXgKK2RtX3phbGxvY19hdXhfZGVidWcKZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkJhc2UgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5CYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2M0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5CYXNlCkBAIC0wLDAgKzEsMjg5IEBACitkbV9hc3ByaW50ZgorZG1fYmFzZW5hbWUKK2RtX2JpdF9hbmQKK2RtX2JpdF9nZXRfZmlyc3QKK2RtX2JpdF9nZXRfbmV4dAorZG1fYml0c2V0X2NyZWF0ZQorZG1fYml0c2V0X2Rlc3Ryb3kKK2RtX2JpdHNldF9lcXVhbAorZG1fYml0X3VuaW9uCitkbV9ib3VuZHNfY2hlY2tfZGVidWcKK2RtX2J1aWxkX2RtX25hbWUKK2RtX2J1aWxkX2RtX3V1aWQKK2RtX2NvbmZpZ19jbG9uZV9ub2RlCitkbV9jb25maWdfY2xvbmVfbm9kZV93aXRoX21lbQorZG1fY29uZmlnX2NyZWF0ZQorZG1fY29uZmlnX2NyZWF0ZV9ub2RlCitkbV9jb25maWdfY3JlYXRlX3ZhbHVlCitkbV9jb25maWdfZGVzdHJveQorZG1fY29uZmlnX2ZpbmRfYm9vbAorZG1fY29uZmlnX2ZpbmRfZmxvYXQKK2RtX2NvbmZpZ19maW5kX2ludAorZG1fY29uZmlnX2ZpbmRfaW50NjQKK2RtX2NvbmZpZ19maW5kX25vZGUKK2RtX2NvbmZpZ19maW5kX3N0cgorZG1fY29uZmlnX2ZpbmRfc3RyX2FsbG93X2VtcHR5CitkbV9jb25maWdfZmxhdHRlbgorZG1fY29uZmlnX2Zyb21fc3RyaW5nCitkbV9jb25maWdfZ2V0X2N1c3RvbQorZG1fY29uZmlnX2dldF9saXN0CitkbV9jb25maWdfZ2V0X3NlY3Rpb24KK2RtX2NvbmZpZ19nZXRfc3RyCitkbV9jb25maWdfZ2V0X3VpbnQzMgorZG1fY29uZmlnX2dldF91aW50NjQKK2RtX2NvbmZpZ19oYXNfbm9kZQorZG1fY29uZmlnX2luc2VydF9jYXNjYWRlZF90cmVlCitkbV9jb25maWdfbWF5YmVfc2VjdGlvbgorZG1fY29uZmlnX21lbW9yeQorZG1fY29uZmlnX3BhcmVudF9uYW1lCitkbV9jb25maWdfcGFyc2UKK2RtX2NvbmZpZ19yZW1vdmVfY2FzY2FkZWRfdHJlZQorZG1fY29uZmlnX3JlbW92ZV9ub2RlCitkbV9jb25maWdfc2V0X2N1c3RvbQorZG1fY29uZmlnX3RyZWVfZmluZF9ib29sCitkbV9jb25maWdfdHJlZV9maW5kX2Zsb2F0CitkbV9jb25maWdfdHJlZV9maW5kX2ludAorZG1fY29uZmlnX3RyZWVfZmluZF9pbnQ2NAorZG1fY29uZmlnX3RyZWVfZmluZF9ub2RlCitkbV9jb25maWdfdHJlZV9maW5kX3N0cgorZG1fY29uZmlnX3RyZWVfZmluZF9zdHJfYWxsb3dfZW1wdHkKK2RtX2NvbmZpZ192YWx1ZV9pc19ib29sCitkbV9jb25maWdfd3JpdGVfbm9kZQorZG1fY29uZmlnX3dyaXRlX25vZGVfb3V0CitkbV9jb25maWdfd3JpdGVfb25lX25vZGUKK2RtX2NvbmZpZ193cml0ZV9vbmVfbm9kZV9vdXQKK2RtX2Nvb2tpZV9zdXBwb3J0ZWQKK2RtX2NvdW50X2NoYXJzCitkbV9jcmVhdGVfZGlyCitkbV9jcmVhdGVfbG9ja2ZpbGUKK2RtX2RhZW1vbl9pc19ydW5uaW5nCitkbV9kZXZpY2VfZ2V0X25hbWUKK2RtX2RldmljZV9oYXNfaG9sZGVycworZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzCitkbV9kaXIKK2RtX2RyaXZlcl92ZXJzaW9uCitkbV9kdW1wX21lbW9yeV9kZWJ1ZworZG1fZXNjYXBlZF9sZW4KK2RtX2VzY2FwZV9kb3VibGVfcXVvdGVzCitkbV9mY2xvc2UKK2RtX2Zvcm1hdF9kZXYKK2RtX2ZyZWVfYXV4CitkbV9nZXRfbGlicmFyeV92ZXJzaW9uCitkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlCitkbV9nZXRfbmV4dF90YXJnZXQKK2RtX2dldF9zdGF0dXNfY2FjaGUKK2RtX2dldF9zdGF0dXNfcmFpZAorZG1fZ2V0X3N0YXR1c19zbmFwc2hvdAorZG1fZ2V0X3N0YXR1c190aGluCitkbV9nZXRfc3RhdHVzX3RoaW5fcG9vbAorZG1fZ2V0X3N1c3BlbmRlZF9jb3VudGVyCitkbV9oYXNoX2NyZWF0ZQorZG1faGFzaF9kZXN0cm95CitkbV9oYXNoX2dldF9kYXRhCitkbV9oYXNoX2dldF9maXJzdAorZG1faGFzaF9nZXRfa2V5CitkbV9oYXNoX2dldF9uZXh0CitkbV9oYXNoX2dldF9udW1fZW50cmllcworZG1faGFzaF9pbnNlcnQKK2RtX2hhc2hfaW5zZXJ0X2JpbmFyeQorZG1faGFzaF9pdGVyCitkbV9oYXNoX2xvb2t1cAorZG1faGFzaF9sb29rdXBfYmluYXJ5CitkbV9oYXNoX3JlbW92ZQorZG1faGFzaF9yZW1vdmVfYmluYXJ5CitkbV9oYXNoX3dpcGUKK2RtX2hhc2hfbG9va3VwX3dpdGhfdmFsCitkbV9oYXNoX2xvb2t1cF93aXRoX2NvdW50CitkbV9oYXNoX3JlbW92ZV93aXRoX3ZhbAorZG1faGFzaF9pbnNlcnRfYWxsb3dfbXVsdGlwbGUKK2RtX2lzX2RtX21ham9yCitkbV9pc19lbXB0eV9kaXIKK2RtX2xpYl9leGl0CitkbV9saWJfaW5pdAorZG1fbGliX3JlbGVhc2UKK2RtX2xpc3RfYWRkCitkbV9saXN0X2FkZF9oCitkbV9saXN0X2RlbAorZG1fbGlzdF9lbXB0eQorZG1fbGlzdF9lbmQKK2RtX2xpc3RfZmlyc3QKK2RtX2xpc3RfaW5pdAorZG1fbGlzdF9sYXN0CitkbV9saXN0X21vdmUKK2RtX2xpc3RfbmV4dAorZG1fbGlzdF9wcmV2CitkbV9saXN0X3NpemUKK2RtX2xpc3Rfc3BsaWNlCitkbV9saXN0X3N0YXJ0CitkbV9sb2cKK2RtX2xvZ19pbml0CitkbV9sb2dfaW5pdF92ZXJib3NlCitkbV9sb2dfaXNfbm9uX2RlZmF1bHQKK2RtX2xvZ193aXRoX2Vycm5vCitkbV9sb2dfd2l0aF9lcnJub19pbml0CitkbV9tYWtlX3BlcmNlbnQKK2RtX21hbGxvY19hdXgKK2RtX21hbGxvY19hdXhfZGVidWcKK2RtX21rbm9kZXMKK2RtX21vdW50aW5mb19yZWFkCitkbV9wZXJjZW50X3RvX2Zsb2F0CitkbV9wb29sX2FiYW5kb25fb2JqZWN0CitkbV9wb29sX2FsbG9jCitkbV9wb29sX2FsbG9jX2FsaWduZWQKK2RtX3Bvb2xfYmVnaW5fb2JqZWN0CitkbV9wb29sX2NyZWF0ZQorZG1fcG9vbF9kZXN0cm95CitkbV9wb29sX2VtcHR5CitkbV9wb29sX2VuZF9vYmplY3QKK2RtX3Bvb2xfZnJlZQorZG1fcG9vbF9ncm93X29iamVjdAorZG1fcG9vbF9sb2NrCitkbV9wb29sX2xvY2tlZAorZG1fcG9vbF9zdHJkdXAKK2RtX3Bvb2xfc3RybmR1cAorZG1fcG9vbF91bmxvY2sKK2RtX3Bvb2xfemFsbG9jCitkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dAorZG1fcmVhbGxvY19hdXgKK2RtX3JlZ2V4X2NyZWF0ZQorZG1fcmVnZXhfZmluZ2VycHJpbnQKK2RtX3JlZ2V4X21hdGNoCitkbV9yZXBvcnRfY29tcGFjdF9maWVsZHMKK2RtX3JlcG9ydF9maWVsZF9pbnQKK2RtX3JlcG9ydF9maWVsZF9pbnQzMgorZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQKK2RtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUKK2RtX3JlcG9ydF9maWVsZF9zdHJpbmcKK2RtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdAorZG1fcmVwb3J0X2ZpZWxkX3N0cmluZ19saXN0X3Vuc29ydGVkCitkbV9yZXBvcnRfZmllbGRfdWludDMyCitkbV9yZXBvcnRfZmllbGRfdWludDY0CitkbV9yZXBvcnRfZnJlZQorZG1fcmVwb3J0X2luaXQKK2RtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uCitkbV9yZXBvcnRfb2JqZWN0CitkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkCitkbV9yZXBvcnRfb3V0cHV0CitkbV9yZXBvcnRfc2V0X291dHB1dF9maWVsZF9uYW1lX3ByZWZpeAorZG1fc2V0X2Rldl9kaXIKK2RtX3NldF9uYW1lX21hbmdsaW5nX21vZGUKK2RtX3NldF9zZWxpbnV4X2NvbnRleHQKK2RtX3NldF9zeXNmc19kaXIKK2RtX3NldF91dWlkX3ByZWZpeAorZG1fc25wcmludGYKK2RtX3NwbGl0X2x2bV9uYW1lCitkbV9zcGxpdF93b3JkcworZG1fc3RyZHVwX2F1eAorZG1fc3RybmNweQorZG1fc3lzZnNfZGlyCitkbV90YXNrX2FkZF90YXJnZXQKK2RtX3Rhc2tfY3JlYXRlCitkbV90YXNrX2RlZmVycmVkX3JlbW92ZQorZG1fdGFza19kZXN0cm95CitkbV90YXNrX2VuYWJsZV9jaGVja3MKK2RtX3Rhc2tfZ2V0X2RlcHMKK2RtX3Rhc2tfZ2V0X2RyaXZlcl92ZXJzaW9uCitkbV90YXNrX2dldF9pbmZvX3dpdGhfZGVmZXJyZWRfcmVtb3ZlCitkbV90YXNrX2dldF9tZXNzYWdlX3Jlc3BvbnNlCitkbV90YXNrX2dldF9uYW1lCitkbV90YXNrX2dldF9uYW1lX21hbmdsZWQKK2RtX3Rhc2tfZ2V0X25hbWVzCitkbV90YXNrX2dldF9uYW1lX3VubWFuZ2xlZAorZG1fdGFza19nZXRfcmVhZF9haGVhZAorZG1fdGFza19nZXRfdXVpZAorZG1fdGFza19nZXRfdXVpZF9tYW5nbGVkCitkbV90YXNrX2dldF91dWlkX3VubWFuZ2xlZAorZG1fdGFza19nZXRfdmVyc2lvbnMKK2RtX3Rhc2tfbm9fZmx1c2gKK2RtX3Rhc2tfbm9fb3Blbl9jb3VudAorZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZQorZG1fdGFza19yZXRyeV9yZW1vdmUKK2RtX3Rhc2tfcnVuCitkbV90YXNrX3NlY3VyZV9kYXRhCitkbV90YXNrX3NldF9hZGRfbm9kZQorZG1fdGFza19zZXRfY29va2llCitkbV90YXNrX3NldF9ldmVudF9ucgorZG1fdGFza19zZXRfZ2VvbWV0cnkKK2RtX3Rhc2tfc2V0X2dpZAorZG1fdGFza19zZXRfbWFqb3IKK2RtX3Rhc2tfc2V0X21ham9yX21pbm9yCitkbV90YXNrX3NldF9tZXNzYWdlCitkbV90YXNrX3NldF9taW5vcgorZG1fdGFza19zZXRfbW9kZQorZG1fdGFza19zZXRfbmFtZQorZG1fdGFza19zZXRfbmV3bmFtZQorZG1fdGFza19zZXRfbmV3dXVpZAorZG1fdGFza19zZXRfcmVhZF9haGVhZAorZG1fdGFza19zZXRfcm8KK2RtX3Rhc2tfc2V0X3NlY3RvcgorZG1fdGFza19zZXRfdWlkCitkbV90YXNrX3NldF91dWlkCitkbV90YXNrX3NraXBfbG9ja2ZzCitkbV90YXNrX3N1cHByZXNzX2lkZW50aWNhbF9yZWxvYWQKK2RtX3Rhc2tfdXBkYXRlX25vZGVzCitkbV90cmVlX2FjdGl2YXRlX2NoaWxkcmVuCitkbV90cmVlX2FkZF9kZXYKK2RtX3RyZWVfYWRkX2Rldl93aXRoX3VkZXZfZmxhZ3MKK2RtX3RyZWVfYWRkX25ld19kZXYKK2RtX3RyZWVfYWRkX25ld19kZXZfd2l0aF91ZGV2X2ZsYWdzCitkbV90cmVlX2NyZWF0ZQorZG1fdHJlZV9kZWFjdGl2YXRlX2NoaWxkcmVuCitkbV90cmVlX2ZpbmRfbm9kZQorZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZAorZG1fdHJlZV9mcmVlCitkbV90cmVlX2dldF9jb29raWUKK2RtX3RyZWVfY2hpbGRyZW5fdXNlX3V1aWQKK2RtX3RyZWVfbmV4dF9jaGlsZAorZG1fdHJlZV9ub2RlX2FkZF9jYWNoZV90YXJnZXQKK2RtX3RyZWVfbm9kZV9hZGRfY3J5cHRfdGFyZ2V0CitkbV90cmVlX25vZGVfYWRkX2Vycm9yX3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF9saW5lYXJfdGFyZ2V0CitkbV90cmVlX25vZGVfYWRkX21pcnJvcl90YXJnZXQKK2RtX3RyZWVfbm9kZV9hZGRfbWlycm9yX3RhcmdldF9sb2cKK2RtX3RyZWVfbm9kZV9hZGRfbnVsbF9hcmVhCitkbV90cmVlX25vZGVfYWRkX3JhaWRfdGFyZ2V0CitkbV90cmVlX25vZGVfYWRkX3JhaWRfdGFyZ2V0X3dpdGhfcGFyYW1zCitkbV90cmVlX25vZGVfYWRkX3JlcGxpY2F0b3JfZGV2X3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF9yZXBsaWNhdG9yX3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF9zbmFwc2hvdF9tZXJnZV90YXJnZXQKK2RtX3RyZWVfbm9kZV9hZGRfc25hcHNob3Rfb3JpZ2luX3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF9zbmFwc2hvdF90YXJnZXQKK2RtX3RyZWVfbm9kZV9hZGRfc3RyaXBlZF90YXJnZXQKK2RtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEKK2RtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX21lc3NhZ2UKK2RtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF90aGluX3RhcmdldAorZG1fdHJlZV9ub2RlX2FkZF96ZXJvX3RhcmdldAorZG1fdHJlZV9ub2RlX2dldF9jb250ZXh0CitkbV90cmVlX25vZGVfZ2V0X2luZm8KK2RtX3RyZWVfbm9kZV9nZXRfbmFtZQorZG1fdHJlZV9ub2RlX2dldF91dWlkCitkbV90cmVlX25vZGVfbnVtX2NoaWxkcmVuCitkbV90cmVlX25vZGVfc2V0X2NhbGxiYWNrCitkbV90cmVlX25vZGVfc2V0X3ByZXN1c3BlbmRfbm9kZQorZG1fdHJlZV9ub2RlX3NldF9yZWFkX2FoZWFkCitkbV90cmVlX25vZGVfc2V0X3RoaW5fZXh0ZXJuYWxfb3JpZ2luCitkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9kaXNjYXJkCitkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9lcnJvcl9pZl9ub19zcGFjZQorZG1fdHJlZV9ub2RlX3NldF91ZGV2X2ZsYWdzCitkbV90cmVlX3ByZWxvYWRfY2hpbGRyZW4KK2RtX3RyZWVfcmV0cnlfcmVtb3ZlCitkbV90cmVlX3NldF9jb29raWUKK2RtX3RyZWVfc2V0X29wdGlvbmFsX3V1aWRfc3VmZml4ZXMKK2RtX3RyZWVfc2tpcF9sb2NrZnMKK2RtX3RyZWVfc3VzcGVuZF9jaGlsZHJlbgorZG1fdHJlZV91c2Vfbm9fZmx1c2hfc3VzcGVuZAorZG1fdWRldl9jb21wbGV0ZQorZG1fdWRldl9jcmVhdGVfY29va2llCitkbV91ZGV2X2dldF9jaGVja2luZworZG1fdWRldl9nZXRfc3luY19zdXBwb3J0CitkbV91ZGV2X3NldF9jaGVja2luZworZG1fdWRldl9zZXRfc3luY19zdXBwb3J0CitkbV91ZGV2X3dhaXQKK2RtX3VuZXNjYXBlX2NvbG9uc19hbmRfYXRfc2lnbnMKK2RtX3VuZXNjYXBlX2RvdWJsZV9xdW90ZXMKK2RtX3VuaXRzX3RvX2ZhY3RvcgorZG1fdXVpZF9wcmVmaXgKK2RtX3Zhc3ByaW50ZgorZG1femFsbG9jX2F1eAorZG1femFsbG9jX2F1eF9kZWJ1ZwpkaWZmIC0tZ2l0IGEvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDAgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEwMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ3ZDViCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDAKQEAgLTAsMCArMSwyIEBACitkbV9jb25maWdfdmFsdWVfc2V0X2Zvcm1hdF9mbGFncworZG1fY29uZmlnX3ZhbHVlX2dldF9mb3JtYXRfZmxhZ3MKZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTAxIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwODliYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTAxCkBAIC0wLDAgKzEsMiBAQAorZG1fcmVwb3J0X3ZhbHVlX2NhY2hlX3NldAorZG1fcmVwb3J0X3ZhbHVlX2NhY2hlX2dldApkaWZmIC0tZ2l0IGEvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDMgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGVhNWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDMKQEAgLTAsMCArMSw3IEBACitkbV9ib3VuZHNfY2hlY2tfd3JhcHBlcgorZG1fZHVtcF9tZW1vcnlfd3JhcHBlcgorZG1fZnJlZV93cmFwcGVyCitkbV9tYWxsb2Nfd3JhcHBlcgorZG1fcmVhbGxvY193cmFwcGVyCitkbV9zdHJkdXBfd3JhcHBlcgorZG1femFsbG9jX3dyYXBwZXIKZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTA0IGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOGVkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTA0CkBAIC0wLDAgKzEsNzYgQEAKK2RtX3JlcG9ydF9jb2x1bW5faGVhZGluZ3MKK2RtX3NpemVfdG9fc3RyaW5nCitkbV9zdGF0c19iaW5kX2Rldm5vCitkbV9zdGF0c19iaW5kX25hbWUKK2RtX3N0YXRzX2JpbmRfdXVpZAorZG1fc3RhdHNfYnVmZmVyX2Rlc3Ryb3kKK2RtX3N0YXRzX2NsZWFyX3JlZ2lvbgorZG1fc3RhdHNfY3JlYXRlCitkbV9zdGF0c19kZWxldGVfcmVnaW9uCitkbV9zdGF0c19kZXN0cm95CitkbV9zdGF0c19nZXRfYXJlYV9zdGFydAorZG1fc3RhdHNfZ2V0X2F2ZXJhZ2VfcXVldWVfc2l6ZQorZG1fc3RhdHNfZ2V0X2F2ZXJhZ2VfcmRfd2FpdF90aW1lCitkbV9zdGF0c19nZXRfYXZlcmFnZV9yZXF1ZXN0X3NpemUKK2RtX3N0YXRzX2dldF9hdmVyYWdlX3dhaXRfdGltZQorZG1fc3RhdHNfZ2V0X2F2ZXJhZ2Vfd3Jfd2FpdF90aW1lCitkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhCitkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhX2xlbgorZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9zdGFydAorZG1fc3RhdHNfZ2V0X2N1cnJlbnRfbnJfYXJlYXMKK2RtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbgorZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX2FyZWFfbGVuCitkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fYXV4X2RhdGEKK2RtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9sZW4KK2RtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9wcm9ncmFtX2lkCitkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fc3RhcnQKK2RtX3N0YXRzX2dldF9pb19pbl9wcm9ncmVzcworZG1fc3RhdHNfZ2V0X2lvX25zZWNzCitkbV9zdGF0c19nZXRfbnJfYXJlYXMKK2RtX3N0YXRzX2dldF9ucl9yZWdpb25zCitkbV9zdGF0c19nZXRfcmRfbWVyZ2VzX3Blcl9zZWMKK2RtX3N0YXRzX2dldF9yZWFkX25zZWNzCitkbV9zdGF0c19nZXRfcmVhZHMKK2RtX3N0YXRzX2dldF9yZWFkX3NlY3RvcnMKK2RtX3N0YXRzX2dldF9yZWFkX3NlY3RvcnNfcGVyX3NlYworZG1fc3RhdHNfZ2V0X3JlYWRzX21lcmdlZAorZG1fc3RhdHNfZ2V0X3JlYWRzX3Blcl9zZWMKK2RtX3N0YXRzX2dldF9yZWdpb25fYXJlYV9sZW4KK2RtX3N0YXRzX2dldF9yZWdpb25fYXV4X2RhdGEKK2RtX3N0YXRzX2dldF9yZWdpb25fbGVuCitkbV9zdGF0c19nZXRfcmVnaW9uX25yX2FyZWFzCitkbV9zdGF0c19nZXRfcmVnaW9uX3Byb2dyYW1faWQKK2RtX3N0YXRzX2dldF9yZWdpb25fc3RhcnQKK2RtX3N0YXRzX2dldF9zYW1wbGluZ19pbnRlcnZhbF9tcworZG1fc3RhdHNfZ2V0X3NhbXBsaW5nX2ludGVydmFsX25zCitkbV9zdGF0c19nZXRfc2VydmljZV90aW1lCitkbV9zdGF0c19nZXRfdGhyb3VnaHB1dAorZG1fc3RhdHNfZ2V0X3RvdGFsX3JlYWRfbnNlY3MKK2RtX3N0YXRzX2dldF90b3RhbF93cml0ZV9uc2VjcworZG1fc3RhdHNfZ2V0X3V0aWxpemF0aW9uCitkbV9zdGF0c19nZXRfd2VpZ2h0ZWRfaW9fbnNlY3MKK2RtX3N0YXRzX2dldF93cml0ZV9uc2VjcworZG1fc3RhdHNfZ2V0X3dyaXRlcworZG1fc3RhdHNfZ2V0X3dyaXRlX3NlY3RvcnMKK2RtX3N0YXRzX2dldF93cml0ZV9zZWN0b3JzX3Blcl9zZWMKK2RtX3N0YXRzX2dldF93cml0ZXNfbWVyZ2VkCitkbV9zdGF0c19nZXRfd3JpdGVzX3Blcl9zZWMKK2RtX3N0YXRzX2dldF93cl9tZXJnZXNfcGVyX3NlYworZG1fc3RhdHNfbGlzdAorZG1fc3RhdHNfcG9wdWxhdGUKK2RtX3N0YXRzX3ByaW50X3JlZ2lvbgorZG1fc3RhdHNfcmVnaW9uX3ByZXNlbnQKK2RtX3N0YXRzX3NldF9wcm9ncmFtX2lkCitkbV9zdGF0c19zZXRfc2FtcGxpbmdfaW50ZXJ2YWxfbXMKK2RtX3N0YXRzX3NldF9zYW1wbGluZ19pbnRlcnZhbF9ucworZG1fc3RhdHNfd2Fsa19lbmQKK2RtX3N0YXRzX3dhbGtfbmV4dAorZG1fc3RhdHNfd2Fsa19uZXh0X3JlZ2lvbgorZG1fc3RhdHNfd2Fsa19zdGFydAorZG1fdGFza19nZXRfaW9jdGxfdGltZXN0YW1wCitkbV90YXNrX3NldF9yZWNvcmRfdGltZXN0YW1wCitkbV90aW1lc3RhbXBfYWxsb2MKK2RtX3RpbWVzdGFtcF9jb21wYXJlCitkbV90aW1lc3RhbXBfZGVsdGEKK2RtX3RpbWVzdGFtcF9kZXN0cm95CitkbV90aW1lc3RhbXBfZ2V0CmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEwNSBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTU2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEwNQpAQCAtMCwwICsxLDQgQEAKK2RtX3JlcG9ydF9pc19lbXB0eQorZG1fc3RhdHNfZ2V0X2FyZWFfb2Zmc2V0CitkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhX29mZnNldAorZG1fdGltZXN0YW1wX2NvcHkKZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTA2IGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlYzU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTA2CkBAIC0wLDAgKzEsNSBAQAorZG1fbWVzc2FnZV9zdXBwb3J0c19wcmVjaXNlX3RpbWVzdGFtcHMKK2RtX3N0YXRzX2NyZWF0ZV9yZWdpb24KK2RtX3N0YXRzX2RyaXZlcl9zdXBwb3J0c19wcmVjaXNlCitkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fcHJlY2lzZV90aW1lc3RhbXBzCitkbV9zdGF0c19nZXRfcmVnaW9uX3ByZWNpc2VfdGltZXN0YW1wcwpkaWZmIC0tZ2l0IGEvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDcgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEwNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQzNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMDcKQEAgLTAsMCArMSwxNSBAQAorZG1faGlzdG9ncmFtX2JvdW5kc19kZXN0cm95CitkbV9oaXN0b2dyYW1fYm91bmRzX2Zyb21fc3RyaW5nCitkbV9oaXN0b2dyYW1fYm91bmRzX2Zyb21fdWludDY0CitkbV9oaXN0b2dyYW1fZ2V0X2Jpbl9jb3VudAorZG1faGlzdG9ncmFtX2dldF9iaW5fbG93ZXIKK2RtX2hpc3RvZ3JhbV9nZXRfYmluX3BlcmNlbnQKK2RtX2hpc3RvZ3JhbV9nZXRfYmluX3VwcGVyCitkbV9oaXN0b2dyYW1fZ2V0X2Jpbl93aWR0aAorZG1faGlzdG9ncmFtX2dldF9ucl9iaW5zCitkbV9oaXN0b2dyYW1fZ2V0X3N1bQorZG1faGlzdG9ncmFtX3RvX3N0cmluZworZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbgorZG1fc3RhdHNfZHJpdmVyX3N1cHBvcnRzX2hpc3RvZ3JhbQorZG1fc3RhdHNfZ2V0X2hpc3RvZ3JhbQorZG1fc3RhdHNfZ2V0X3JlZ2lvbl9ucl9oaXN0b2dyYW1fYmlucwpkaWZmIC0tZ2l0IGEvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMTAgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzExMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE1NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMTAKQEAgLTAsMCArMSwzIEBACitkbV9yZXBvcnRfY29tcGFjdF9naXZlbl9maWVsZHMKK2RtX2hvbGRfY29udHJvbF9kZXYKK2RtX3RyZWVfbm9kZV9zaXplX2NoYW5nZWQKZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTEzIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkOTczYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTEzCkBAIC0wLDAgKzEgQEAKK2RtX2dldF9zdGF0dXNfbWlycm9yCmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEyNCBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDAxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEyNApAQCAtMCwwICsxIEBACitkbV91ZGV2X3dhaXRfaW1tZWRpYXRlCmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEyOCBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTI4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjM5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEyOApAQCAtMCwwICsxLDUgQEAKK2RtX3JlcG9ydF9ncm91cF9jcmVhdGUKK2RtX3JlcG9ydF9ncm91cF9wdXNoCitkbV9yZXBvcnRfZ3JvdXBfcG9wCitkbV9yZXBvcnRfZ3JvdXBfZGVzdHJveQorZG1fcmVwb3J0X3NldF9zZWxlY3Rpb24KZGlmZiAtLWdpdCBhL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTI5IGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl8xMjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkM2YxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTI5CkBAIC0wLDAgKzEsMTQgQEAKK2RtX2JpdHNldF9wYXJzZV9saXN0CitkbV9zdGF0c19jcmVhdGVfZ3JvdXAKK2RtX3N0YXRzX2N1cnJlbnRfb2JqZWN0X3R5cGUKK2RtX3N0YXRzX2RlbGV0ZV9ncm91cAorZG1fc3RhdHNfZ2V0X2FsaWFzCitkbV9zdGF0c19nZXRfY291bnRlcgorZG1fc3RhdHNfZ2V0X2dyb3VwX2Rlc2NyaXB0b3IKK2RtX3N0YXRzX2dldF9ncm91cF9pZAorZG1fc3RhdHNfZ2V0X21ldHJpYworZG1fc3RhdHNfZ2V0X25yX2dyb3VwcworZG1fc3RhdHNfZ3JvdXBfcHJlc2VudAorZG1fc3RhdHNfb2JqZWN0X3R5cGUKK2RtX3N0YXRzX3NldF9hbGlhcworZG1fc3RhdHNfd2Fsa19pbml0CmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEzMSBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfMTMxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjY2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzEzMQpAQCAtMCwwICsxIEBACitkbV9zdGF0c19jcmVhdGVfcmVnaW9uc19mcm9tX2ZkCmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzk3IGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl85NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M1MTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl85NwpAQCAtMCwwICsxIEBACitkbV90YXNrX2dldF9pbmZvCmRpZmYgLS1naXQgYS9saWJkbS8uZXhwb3J0ZWRfc3ltYm9scy5ETV8xXzAyXzk4IGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl85OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiY2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl85OApAQCAtMCwwICsxIEBACitkbV90YXNrX2dldF9lcnJubwpkaWZmIC0tZ2l0IGEvbGliZG0vLmV4cG9ydGVkX3N5bWJvbHMuRE1fMV8wMl85OSBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfOTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4NmE1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtLy5leHBvcnRlZF9zeW1ib2xzLkRNXzFfMDJfOTkKQEAgLTAsMCArMSBAQAorZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfcmVhZF9vbmx5CmRpZmYgLS1naXQgYS9saWJkbS9NYWtlZmlsZS5pbiBiL2xpYmRtL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOWE0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDEwMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVMgPVwKKwlkYXRhc3RydWN0L2JpdHNldC5jIFwKKwlkYXRhc3RydWN0L2hhc2guYyBcCisJZGF0YXN0cnVjdC9saXN0LmMgXAorCWxpYmRtLWNvbW1vbi5jIFwKKwlsaWJkbS1jb25maWcuYyBcCisJbGliZG0tZGVwdHJlZS5jIFwKKwlsaWJkbS1maWxlLmMgXAorCWxpYmRtLXJlcG9ydC5jIFwKKwlsaWJkbS1zdGF0cy5jIFwKKwlsaWJkbS1zdHJpbmcuYyBcCisJbGliZG0tdGFyZ2V0cy5jIFwKKwlsaWJkbS10aW1lc3RhbXAuYyBcCisJbW0vZGJnX21hbGxvYy5jIFwKKwltbS9wb29sLmMgXAorCXJlZ2V4L21hdGNoZXIuYyBcCisJcmVnZXgvcGFyc2VfcnguYyBcCisJcmVnZXgvdHRyZWUuYyBcCisJJChpbnRlcmZhY2UpL2xpYmRtLWlmYWNlLmMKKworSU5DTFVERVMgPSAtSSQoc3JjZGlyKS8kKGludGVyZmFjZSkKKworaWZlcSAoIkBTVEFUSUNfTElOS0AiLCAieWVzIikKK0xJQl9TVEFUSUMgPSAkKGludGVyZmFjZSkvbGliZGV2bWFwcGVyLmEKK2VuZGlmCisKK0xJQl9TSEFSRUQgPSAkKGludGVyZmFjZSkvbGliZGV2bWFwcGVyLiQoTElCX1NVRkZJWCkKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9ETSkKK1RBUkdFVFMgPSBsaWJkZXZtYXBwZXIuJChMSUJfU1VGRklYKSBsaWJkZXZtYXBwZXIuJChMSUJfU1VGRklYKS4kKExJQl9WRVJTSU9OKQorCitDRkxPV19MSVNUID0gJChTT1VSQ0VTKQorQ0ZMT1dfTElTVF9UQVJHRVQgPSBsaWJkZXZtYXBwZXIuY2Zsb3cKKworRVhQT1JURURfSEVBREVSID0gJChzcmNkaXIpL2xpYmRldm1hcHBlci5oCitFWFBPUlRFRF9GTl9QUkVGSVggPSBkbQorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworQ0ZMQUdTICs9ICQoVURFVl9DRkxBR1MpICQoVkFMR1JJTkRfQ0ZMQUdTKQorCitMSUJTICs9ICQoU0VMSU5VWF9MSUJTKSAkKFVERVZfTElCUykgJChQVEhSRUFEX0xJQlMpICQoTV9MSUJTKQorCitkZXZpY2UtbWFwcGVyOiBhbGwKKworbGliZGV2bWFwcGVyLiQoTElCX1NVRkZJWCkgbGliZGV2bWFwcGVyLiQoTElCX1NVRkZJWCkuJChMSUJfVkVSU0lPTik6ICQoTElCX1NIQVJFRCkKKwkkKExOX1MpIC1mICQ8ICRACisKKy5QSE9OWTogaW5zdGFsbF9keW5hbWljIGluc3RhbGxfc3RhdGljIGluc3RhbGxfaW5jbHVkZSBcCisJaW5zdGFsbF9pb2N0bCBpbnN0YWxsX2lvY3RsX3N0YXRpYyBcCisJaW5zdGFsbF9wa2djb25maWcKKworSU5TVEFMTF9UWVBFID0gaW5zdGFsbF9keW5hbWljCisKK2lmZXEgKCJAU1RBVElDX0xJTktAIiwgInllcyIpCisgIElOU1RBTExfVFlQRSArPSBpbnN0YWxsX3N0YXRpYworZW5kaWYKKworaWZlcSAoIkBQS0dDT05GSUdAIiwgInllcyIpCisgIElOU1RBTExfVFlQRSArPSBpbnN0YWxsX3BrZ2NvbmZpZworZW5kaWYKKworaW5zdGFsbDogJChJTlNUQUxMX1RZUEUpIGluc3RhbGxfaW5jbHVkZQorCitpbnN0YWxsX2RldmljZS1tYXBwZXI6IGluc3RhbGwKKworaW5zdGFsbF9pbmNsdWRlOiAkKHNyY2RpcikvbGliZGV2bWFwcGVyLmgKKwkkKElOU1RBTExfREFUQSkgLUQgJDwgJChpbmNsdWRlZGlyKS8kKDxGKQorCitpbnN0YWxsX2R5bmFtaWM6IGluc3RhbGxfQGludGVyZmFjZUAKKworaW5zdGFsbF9zdGF0aWM6IGluc3RhbGxfQGludGVyZmFjZUBfc3RhdGljCisKK2luc3RhbGxfaW9jdGw6IGluc3RhbGxfbGliX3NoYXJlZAorCitpbnN0YWxsX3BrZ2NvbmZpZzogbGliZGV2bWFwcGVyLnBjCisJJChJTlNUQUxMX0RBVEEpIC1EICQ8ICQocGtnY29uZmlnZGlyKS9kZXZtYXBwZXIucGMKKworaW5zdGFsbF9pb2N0bF9zdGF0aWM6ICQoTElCX1NUQVRJQykKKwkkKElOU1RBTExfREFUQSkgLUQgJDwgJCh1c3JsaWJkaXIpLyQoPEYpCisKK0NMRUFOX1RBUkdFVFMgKz0gaW9jdGwvbGliZGV2bWFwcGVyLmEKK0RJU1RDTEVBTl9UQVJHRVRTICs9IGxpYmRldm1hcHBlci5wYwpkaWZmIC0tZ2l0IGEvbGliZG0vZGF0YXN0cnVjdC9iaXRzZXQuYyBiL2xpYmRtL2RhdGFzdHJ1Y3QvYml0c2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkNmE5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2RhdGFzdHJ1Y3QvYml0c2V0LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRtbGliLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvKiBGSVhNRTogY2FsY3VsYXRlIHRoaXMuICovCisjZGVmaW5lIElOVF9TSElGVCA1CisKK2RtX2JpdHNldF90IGRtX2JpdHNldF9jcmVhdGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgdW5zaWduZWQgbnVtX2JpdHMpCit7CisJdW5zaWduZWQgbiA9IChudW1fYml0cyAvIERNX0JJVFNfUEVSX0lOVCkgKyAyOworCXNpemVfdCBzaXplID0gc2l6ZW9mKGludCkgKiBuOworCWRtX2JpdHNldF90IGJzOworCQorCWlmIChtZW0pCisJCWJzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplKTsKKwllbHNlCisJCWJzID0gZG1femFsbG9jKHNpemUpOworCisJaWYgKCFicykKKwkJcmV0dXJuIE5VTEw7CisKKwkqYnMgPSBudW1fYml0czsKKworCXJldHVybiBiczsKK30KKwordm9pZCBkbV9iaXRzZXRfZGVzdHJveShkbV9iaXRzZXRfdCBicykKK3sKKwlkbV9mcmVlKGJzKTsKK30KKworaW50IGRtX2JpdHNldF9lcXVhbChkbV9iaXRzZXRfdCBpbjEsIGRtX2JpdHNldF90IGluMikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IChpbjFbMF0gLyBETV9CSVRTX1BFUl9JTlQpICsgMTsgaTsgaS0tKQorCQlpZiAoaW4xW2ldICE9IGluMltpXSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZG1fYml0X2FuZChkbV9iaXRzZXRfdCBvdXQsIGRtX2JpdHNldF90IGluMSwgZG1fYml0c2V0X3QgaW4yKQoreworCWludCBpOworCisJZm9yIChpID0gKGluMVswXSAvIERNX0JJVFNfUEVSX0lOVCkgKyAxOyBpOyBpLS0pCisJCW91dFtpXSA9IGluMVtpXSAmIGluMltpXTsKK30KK3ZvaWQgZG1fYml0X3VuaW9uKGRtX2JpdHNldF90IG91dCwgZG1fYml0c2V0X3QgaW4xLCBkbV9iaXRzZXRfdCBpbjIpCit7CisJaW50IGk7CisJZm9yIChpID0gKGluMVswXSAvIERNX0JJVFNfUEVSX0lOVCkgKyAxOyBpOyBpLS0pCisJCW91dFtpXSA9IGluMVtpXSB8IGluMltpXTsKK30KKworc3RhdGljIGludCBfdGVzdF93b3JkKHVpbnQzMl90IHRlc3QsIGludCBiaXQpCit7CisJdWludDMyX3QgdGIgPSB0ZXN0ID4+IGJpdDsKKworCXJldHVybiAodGIgPyBmZnModGIpICsgYml0IC0gMSA6IC0xKTsKK30KKworaW50IGRtX2JpdF9nZXRfbmV4dChkbV9iaXRzZXRfdCBicywgaW50IGxhc3RfYml0KQoreworCWludCBiaXQsIHdvcmQ7CisJdWludDMyX3QgdGVzdDsKKworCWxhc3RfYml0Kys7CQkvKiBvdGhlcndpc2Ugd2UnbGwgcmV0dXJuIHRoZSBzYW1lIGJpdCBhZ2FpbiAqLworCisJLyoKKwkgKiBic1swXSBob2xkcyBudW1iZXIgb2YgYml0cworCSAqLworCXdoaWxlIChsYXN0X2JpdCA8IChpbnQpIGJzWzBdKSB7CisJCXdvcmQgPSBsYXN0X2JpdCA+PiBJTlRfU0hJRlQ7CisJCXRlc3QgPSBic1t3b3JkICsgMV07CisJCWJpdCA9IGxhc3RfYml0ICYgKERNX0JJVFNfUEVSX0lOVCAtIDEpOworCisJCWlmICgoYml0ID0gX3Rlc3Rfd29yZCh0ZXN0LCBiaXQpKSA+PSAwKQorCQkJcmV0dXJuICh3b3JkICogRE1fQklUU19QRVJfSU5UKSArIGJpdDsKKworCQlsYXN0X2JpdCA9IGxhc3RfYml0IC0gKGxhc3RfYml0ICYgKERNX0JJVFNfUEVSX0lOVCAtIDEpKSArCisJCSAgICBETV9CSVRTX1BFUl9JTlQ7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgZG1fYml0X2dldF9maXJzdChkbV9iaXRzZXRfdCBicykKK3sKKwlyZXR1cm4gZG1fYml0X2dldF9uZXh0KGJzLCAtMSk7Cit9CisKKy8qCisgKiBCYXNlZCBvbiB0aGUgTGludXgga2VybmVsIF9fYml0bWFwX3BhcnNlbGlzdCBmcm9tIGxpYi9iaXRtYXAuYworICovCitkbV9iaXRzZXRfdCBkbV9iaXRzZXRfcGFyc2VfbGlzdChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBkbV9wb29sICptZW0pCit7CisJdW5zaWduZWQgYSwgYjsKKwlpbnQgYywgb2xkX2MsIHRvdGFsZGlnaXRzLCBuZGlnaXRzLCBubWFza2JpdHM7CisJaW50IGF0X3N0YXJ0LCBpbl9yYW5nZTsKKwlkbV9iaXRzZXRfdCBtYXNrID0gTlVMTDsKKwljb25zdCBjaGFyICpzdGFydCA9IHN0cjsKKwlzaXplX3QgbGVuOworCitzY2FuOgorCWxlbiA9IHN0cmxlbihzdHIpOworCXRvdGFsZGlnaXRzID0gYyA9IDA7CisJbm1hc2tiaXRzID0gMDsKKwlkbyB7CisJCWF0X3N0YXJ0ID0gMTsKKwkJaW5fcmFuZ2UgPSAwOworCQlhID0gYiA9IDA7CisJCW5kaWdpdHMgPSB0b3RhbGRpZ2l0czsKKworCQkvKiBHZXQgdGhlIG5leHQgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzICovCisJCXdoaWxlIChsZW4pIHsKKwkJCW9sZF9jID0gYzsKKwkJCWMgPSAqc3RyKys7CisJCQlsZW4tLTsKKwkJCWlmIChpc3NwYWNlKGMpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBICdcMCcgb3IgYSAnLCcgc2lnbmFsIHRoZSBlbmQgb2YgYSB2YWx1ZSBvciByYW5nZSAqLworCQkJaWYgKGMgPT0gJ1wwJyB8fCBjID09ICcsJykKKwkJCQlicmVhazsKKwkJCS8qCisJCQkqIHdoaXRlc3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCwKKwkJCSogYnV0IGl0J3Mgb2sgaWYgd2hpdGVzcGFjZXMgYXJlIG9uIGhlYWQgb3IgdGFpbC4KKwkJCSogd2hlbiBvbGRfYyBpcyB3aGlsZXNwYWNlLAorCQkJKiBpZiB0b3RhbGRpZ2l0cyA9PSBuZGlnaXRzLCB3aGl0ZXNwYWNlIGlzIG9uIGhlYWQuCisJCQkqIGlmIHdoaXRlc3BhY2UgaXMgb24gdGFpbCwgaXQgc2hvdWxkIG5vdCBydW4gaGVyZS4KKwkJCSogYXMgYyB3YXMgJywnIG9yICdcMCcsCisJCQkqIHRoZSBsYXN0IGNvZGUgbGluZSBoYXMgYnJva2VuIHRoZSBjdXJyZW50IGxvb3AuCisJCQkqLworCQkJaWYgKCh0b3RhbGRpZ2l0cyAhPSBuZGlnaXRzKSAmJiBpc3NwYWNlKG9sZF9jKSkKKwkJCQlnb3RvX2JhZDsKKworCQkJaWYgKGMgPT0gJy0nKSB7CisJCQkJaWYgKGF0X3N0YXJ0IHx8IGluX3JhbmdlKQorCQkJCQlnb3RvX2JhZDsKKwkJCQliID0gMDsKKwkJCQlpbl9yYW5nZSA9IDE7CisJCQkJYXRfc3RhcnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWlzZGlnaXQoYykpCisJCQkJZ290b19iYWQ7CisKKwkJCWIgPSBiICogMTAgKyAoYyAtICcwJyk7CisJCQlpZiAoIWluX3JhbmdlKQorCQkJCWEgPSBiOworCQkJYXRfc3RhcnQgPSAwOworCQkJdG90YWxkaWdpdHMrKzsKKwkJfQorCQlpZiAobmRpZ2l0cyA9PSB0b3RhbGRpZ2l0cykKKwkJCWNvbnRpbnVlOworCQkvKiBpZiBubyBkaWdpdCBpcyBhZnRlciAnLScsIGl0J3Mgd3JvbmcgKi8KKwkJaWYgKGF0X3N0YXJ0ICYmIGluX3JhbmdlKQorCQkJZ290b19iYWQ7CisJCWlmICghKGEgPD0gYikpCisJCQlnb3RvX2JhZDsKKwkJaWYgKGIgPj0gbm1hc2tiaXRzKQorCQkJbm1hc2tiaXRzID0gYiArIDE7CisJCXdoaWxlICgoYSA8PSBiKSAmJiBtYXNrKSB7CisJCQlkbV9iaXRfc2V0KG1hc2ssIGEpOworCQkJYSsrOworCQl9CisJfSB3aGlsZSAobGVuICYmIGMgPT0gJywnKTsKKworCWlmICghbWFzaykgeworCQlpZiAoIShtYXNrID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIG5tYXNrYml0cykpKQorCQkJZ290b19iYWQ7CisJCXN0ciA9IHN0YXJ0OworCQlnb3RvIHNjYW47CisJfQorCisJcmV0dXJuIG1hc2s7CitiYWQ6CisJaWYgKG1hc2spIHsKKwkJaWYgKG1lbSkKKwkJCWRtX3Bvb2xfZnJlZShtZW0sIG1hc2spOworCQllbHNlCisJCQlkbV9iaXRzZXRfZGVzdHJveShtYXNrKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9kYXRhc3RydWN0L2hhc2guYyBiL2xpYmRtL2RhdGFzdHJ1Y3QvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjNlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9kYXRhc3RydWN0L2hhc2guYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRtbGliLmgiCisKK3N0cnVjdCBkbV9oYXNoX25vZGUgeworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm5leHQ7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBrZXlsZW47CisJY2hhciBrZXlbMF07Cit9OworCitzdHJ1Y3QgZG1faGFzaF90YWJsZSB7CisJdW5zaWduZWQgbnVtX25vZGVzOworCXVuc2lnbmVkIG51bV9zbG90czsKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICoqc2xvdHM7Cit9OworCisvKiBQZXJtdXRhdGlvbiBvZiB0aGUgSW50ZWdlcnMgMCB0aHJvdWdoIDI1NSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgX251bXNbXSA9IHsKKwkxLCAxNCwgMTEwLCAyNSwgOTcsIDE3NCwgMTMyLCAxMTksIDEzOCwgMTcwLCAxMjUsIDExOCwgMjcsIDIzMywgMTQwLCA1MSwKKwk4NywgMTk3LCAxNzcsIDEwNywgMjM0LCAxNjksIDU2LCA2OCwgMzAsIDcsIDE3MywgNzMsIDE4OCwgNDAsIDM2LCA2NSwKKwk0OSwgMjEzLCAxMDQsIDE5MCwgNTcsIDIxMSwgMTQ4LCAyMjMsIDQ4LCAxMTUsIDE1LCAyLCA2NywgMTg2LCAyMTAsIDI4LAorCTEyLCAxODEsIDEwMywgNzAsIDIyLCA1OCwgNzUsIDc4LCAxODMsIDE2NywgMjM4LCAxNTcsIDEyNCwgMTQ3LCAxNzIsCisJMTQ0LAorCTE3NiwgMTYxLCAxNDEsIDg2LCA2MCwgNjYsIDEyOCwgODMsIDE1NiwgMjQxLCA3OSwgNDYsIDE2OCwgMTk4LCA0MSwgMjU0LAorCTE3OCwgODUsIDI1MywgMjM3LCAyNTAsIDE1NCwgMTMzLCA4OCwgMzUsIDIwNiwgOTUsIDExNiwgMjUyLCAxOTIsIDU0LAorCTIyMSwKKwkxMDIsIDIxOCwgMjU1LCAyNDAsIDgyLCAxMDYsIDE1OCwgMjAxLCA2MSwgMywgODksIDksIDQyLCAxNTUsIDE1OSwgOTMsCisJMTY2LCA4MCwgNTAsIDM0LCAxNzUsIDE5NSwgMTAwLCA5OSwgMjYsIDE1MCwgMTYsIDE0NSwgNCwgMzMsIDgsIDE4OSwKKwkxMjEsIDY0LCA3NywgNzIsIDIwOCwgMjQ1LCAxMzAsIDEyMiwgMTQzLCA1NSwgMTA1LCAxMzQsIDI5LCAxNjQsIDE4NSwKKwkxOTQsCisJMTkzLCAyMzksIDEwMSwgMjQyLCA1LCAxNzEsIDEyNiwgMTEsIDc0LCA1OSwgMTM3LCAyMjgsIDEwOCwgMTkxLCAyMzIsCisJMTM5LAorCTYsIDI0LCA4MSwgMjAsIDEyNywgMTcsIDkxLCA5MiwgMjUxLCAxNTEsIDIyNSwgMjA3LCAyMSwgOTgsIDExMywgMTEyLAorCTg0LCAyMjYsIDE4LCAyMTQsIDE5OSwgMTg3LCAxMywgMzIsIDk0LCAyMjAsIDIyNCwgMjEyLCAyNDcsIDIwNCwgMTk2LAorCTQzLAorCTI0OSwgMjM2LCA0NSwgMjQ0LCAxMTEsIDE4MiwgMTUzLCAxMzYsIDEyOSwgOTAsIDIxNywgMjAyLCAxOSwgMTY1LCAyMzEsCisJNzEsCisJMjMwLCAxNDIsIDk2LCAyMjcsIDYyLCAxNzksIDI0NiwgMTE0LCAxNjIsIDUzLCAxNjAsIDIxNSwgMjA1LCAxODAsIDQ3LAorCTEwOSwKKwk0NCwgMzgsIDMxLCAxNDksIDEzNSwgMCwgMjE2LCA1MiwgNjMsIDIzLCAzNywgNjksIDM5LCAxMTcsIDE0NiwgMTg0LAorCTE2MywgMjAwLCAyMjIsIDIzNSwgMjQ4LCAyNDMsIDIxOSwgMTAsIDE1MiwgMTMxLCAxMjMsIDIyOSwgMjAzLCA3NiwgMTIwLAorCTIwOQorfTsKKworc3RhdGljIHN0cnVjdCBkbV9oYXNoX25vZGUgKl9jcmVhdGVfbm9kZShjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpuID0gZG1fbWFsbG9jKHNpemVvZigqbikgKyBsZW4pOworCisJaWYgKG4pIHsKKwkJbWVtY3B5KG4tPmtleSwgc3RyLCBsZW4pOworCQluLT5rZXlsZW4gPSBsZW47CisJfQorCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9oYXNoKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaCA9IDAsIGc7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQloIDw8PSA0OworCQloICs9IF9udW1zWyh1bnNpZ25lZCBjaGFyKSAqc3RyKytdOworCQlnID0gaCAmICgodW5zaWduZWQgbG9uZykgMHhmIDw8IDE2dSk7CisJCWlmIChnKSB7CisJCQloIF49IGcgPj4gMTZ1OworCQkJaCBePSBnID4+IDV1OworCQl9CisJfQorCisJcmV0dXJuIGg7Cit9CisKK3N0cnVjdCBkbV9oYXNoX3RhYmxlICpkbV9oYXNoX2NyZWF0ZSh1bnNpZ25lZCBzaXplX2hpbnQpCit7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBuZXdfc2l6ZSA9IDE2dTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqaGMgPSBkbV96YWxsb2Moc2l6ZW9mKCpoYykpOworCisJaWYgKCFoYykKKwkJcmV0dXJuXzA7CisKKwkvKiByb3VuZCBzaXplIGhpbnQgdXAgdG8gYSBwb3dlciBvZiB0d28gKi8KKwl3aGlsZSAobmV3X3NpemUgPCBzaXplX2hpbnQpCisJCW5ld19zaXplID0gbmV3X3NpemUgPDwgMTsKKworCWhjLT5udW1fc2xvdHMgPSBuZXdfc2l6ZTsKKwlsZW4gPSBzaXplb2YoKihoYy0+c2xvdHMpKSAqIG5ld19zaXplOworCWlmICghKGhjLT5zbG90cyA9IGRtX21hbGxvYyhsZW4pKSkgeworCQlzdGFjazsKKwkJZ290byBiYWQ7CisJfQorCW1lbXNldChoYy0+c2xvdHMsIDAsIGxlbik7CisJcmV0dXJuIGhjOworCisgICAgICBiYWQ6CisJZG1fZnJlZShoYy0+c2xvdHMpOworCWRtX2ZyZWUoaGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfZnJlZV9ub2RlcyhzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCkKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICpjLCAqbjsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPm51bV9zbG90czsgaSsrKQorCQlmb3IgKGMgPSB0LT5zbG90c1tpXTsgYzsgYyA9IG4pIHsKKwkJCW4gPSBjLT5uZXh0OworCQkJZG1fZnJlZShjKTsKKwkJfQorfQorCit2b2lkIGRtX2hhc2hfZGVzdHJveShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCkKK3sKKwlfZnJlZV9ub2Rlcyh0KTsKKwlkbV9mcmVlKHQtPnNsb3RzKTsKKwlkbV9mcmVlKHQpOworfQorCitzdGF0aWMgc3RydWN0IGRtX2hhc2hfbm9kZSAqKl9maW5kKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCB2b2lkICprZXksCisJCQkJICAgdWludDMyX3QgbGVuKQoreworCXVuc2lnbmVkIGggPSBfaGFzaChrZXksIGxlbikgJiAodC0+bnVtX3Nsb3RzIC0gMSk7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqKmM7CisKKwlmb3IgKGMgPSAmdC0+c2xvdHNbaF07ICpjOyBjID0gJigoKmMpLT5uZXh0KSkgeworCQlpZiAoKCpjKS0+a2V5bGVuICE9IGxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmICghbWVtY21wKGtleSwgKCpjKS0+a2V5LCBsZW4pKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGM7Cit9CisKK3ZvaWQgKmRtX2hhc2hfbG9va3VwX2JpbmFyeShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3Qgdm9pZCAqa2V5LAorCQkJICAgIHVpbnQzMl90IGxlbikKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICoqYyA9IF9maW5kKHQsIGtleSwgbGVuKTsKKworCXJldHVybiAqYyA/ICgqYyktPmRhdGEgOiAwOworfQorCitpbnQgZG1faGFzaF9pbnNlcnRfYmluYXJ5KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCB2b2lkICprZXksCisJCQkgIHVpbnQzMl90IGxlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICoqYyA9IF9maW5kKHQsIGtleSwgbGVuKTsKKworCWlmICgqYykKKwkJKCpjKS0+ZGF0YSA9IGRhdGE7CisJZWxzZSB7CisJCXN0cnVjdCBkbV9oYXNoX25vZGUgKm4gPSBfY3JlYXRlX25vZGUoa2V5LCBsZW4pOworCisJCWlmICghbikKKwkJCXJldHVybiAwOworCisJCW4tPmRhdGEgPSBkYXRhOworCQluLT5uZXh0ID0gMDsKKwkJKmMgPSBuOworCQl0LT5udW1fbm9kZXMrKzsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkbV9oYXNoX3JlbW92ZV9iaW5hcnkoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVpbnQzMl90IGxlbikKK3sKKwlzdHJ1Y3QgZG1faGFzaF9ub2RlICoqYyA9IF9maW5kKHQsIGtleSwgbGVuKTsKKworCWlmICgqYykgeworCQlzdHJ1Y3QgZG1faGFzaF9ub2RlICpvbGQgPSAqYzsKKwkJKmMgPSAoKmMpLT5uZXh0OworCQlkbV9mcmVlKG9sZCk7CisJCXQtPm51bV9ub2Rlcy0tOworCX0KK30KKwordm9pZCAqZG1faGFzaF9sb29rdXAoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlyZXR1cm4gZG1faGFzaF9sb29rdXBfYmluYXJ5KHQsIGtleSwgc3RybGVuKGtleSkgKyAxKTsKK30KKworaW50IGRtX2hhc2hfaW5zZXJ0KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRtX2hhc2hfaW5zZXJ0X2JpbmFyeSh0LCBrZXksIHN0cmxlbihrZXkpICsgMSwgZGF0YSk7Cit9CisKK3ZvaWQgZG1faGFzaF9yZW1vdmUoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlkbV9oYXNoX3JlbW92ZV9iaW5hcnkodCwga2V5LCBzdHJsZW4oa2V5KSArIDEpOworfQorCitzdGF0aWMgc3RydWN0IGRtX2hhc2hfbm9kZSAqKl9maW5kX3N0cl93aXRoX3ZhbChzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwKKwkJCQkJICAgICAgICBjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKnZhbCwKKwkJCQkJICAgICAgICB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHZhbF9sZW4pCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqKmM7CisJdW5zaWduZWQgaDsKKyAgICAgICAKKwloID0gX2hhc2goa2V5LCBsZW4pICYgKHQtPm51bV9zbG90cyAtIDEpOworCisJZm9yIChjID0gJnQtPnNsb3RzW2hdOyAqYzsgYyA9ICYoKCpjKS0+bmV4dCkpIHsKKwkJaWYgKCgqYyktPmtleWxlbiAhPSBsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAoIW1lbWNtcChrZXksICgqYyktPmtleSwgbGVuKSAmJiAoKmMpLT5kYXRhKSB7CisJCQlpZiAoKCgqYyktPmRhdGFfbGVuID09IHZhbF9sZW4pICYmCisJCQkgICAgIW1lbWNtcCh2YWwsICgqYyktPmRhdGEsIHZhbF9sZW4pKQorCQkJCXJldHVybiBjOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBkbV9oYXNoX2luc2VydF9hbGxvd19tdWx0aXBsZShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAorCQkJCSAgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCB2YWxfbGVuKQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKm47CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqZmlyc3Q7CisJaW50IGxlbiA9IHN0cmxlbihrZXkpICsgMTsKKwl1bnNpZ25lZCBoOworCisJbiA9IF9jcmVhdGVfbm9kZShrZXksIGxlbik7CisJaWYgKCFuKQorCQlyZXR1cm4gMDsKKworCW4tPmRhdGEgPSAodm9pZCAqKXZhbDsKKwluLT5kYXRhX2xlbiA9IHZhbF9sZW47CisKKwloID0gX2hhc2goa2V5LCBsZW4pICYgKHQtPm51bV9zbG90cyAtIDEpOworCisJZmlyc3QgPSB0LT5zbG90c1toXTsKKworCWlmIChmaXJzdCkKKwkJbi0+bmV4dCA9IGZpcnN0OworCWVsc2UKKwkJbi0+bmV4dCA9IDA7CisJdC0+c2xvdHNbaF0gPSBuOworCisJdC0+bnVtX25vZGVzKys7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBMb29rIHRocm91Z2ggbXVsdGlwbGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIGtleSBmb3Igb25lIHRoYXQgaGFzIGEKKyAqIG1hdGNoaW5nIHZhbCBhbmQgcmV0dXJuIHRoYXQuICBJZiBub25lIGhhdmUgbWFjaGluZyB2YWwsIHJldHVybiBOVUxMLgorICovCit2b2lkICpkbV9oYXNoX2xvb2t1cF93aXRoX3ZhbChzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAorCQkJICAgICAgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCB2YWxfbGVuKQoreworCXN0cnVjdCBkbV9oYXNoX25vZGUgKipjOworCisJYyA9IF9maW5kX3N0cl93aXRoX3ZhbCh0LCBrZXksIHZhbCwgc3RybGVuKGtleSkgKyAxLCB2YWxfbGVuKTsKKworCXJldHVybiAoYyAmJiAqYykgPyAoKmMpLT5kYXRhIDogMDsKK30KKworLyoKKyAqIExvb2sgdGhyb3VnaCBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUga2V5IGZvciBvbmUgdGhhdCBoYXMgYQorICogbWF0Y2hpbmcgdmFsIGFuZCByZW1vdmUgdGhhdC4KKyAqLwordm9pZCBkbV9oYXNoX3JlbW92ZV93aXRoX3ZhbChzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAorCQkJICAgICBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IHZhbF9sZW4pCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqKmM7CisKKwljID0gX2ZpbmRfc3RyX3dpdGhfdmFsKHQsIGtleSwgdmFsLCBzdHJsZW4oa2V5KSArIDEsIHZhbF9sZW4pOworCisJaWYgKGMgJiYgKmMpIHsKKwkJc3RydWN0IGRtX2hhc2hfbm9kZSAqb2xkID0gKmM7CisJCSpjID0gKCpjKS0+bmV4dDsKKwkJZG1fZnJlZShvbGQpOworCQl0LT5udW1fbm9kZXMtLTsKKwl9Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSB2YWx1ZSBmb3IgYSBrZXkgYW5kIGNvdW50IGhvdyBtYW55CisgKiBlbnRyaWVzIGhhdmUgdGhlIHNhbWUga2V5LgorICoKKyAqIElmIG5vIGVudHJpZXMgaGF2ZSBrZXksIHJldHVybiBOVUxMIGFuZCBzZXQgY291bnQgdG8gMC4KKyAqCisgKiBJZiBvbmUgZW50cnkgaGFzIHRoZSBrZXksIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWwsCisgKiBhbmQgc2V0cyBjb3VudCB0byAxLgorICoKKyAqIElmIE4gZW50cmllcyBoYXZlIHRoZSBrZXksIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWwKKyAqIGZyb20gdGhlIGZpcnN0IGVudHJ5LCBhbmQgc2V0cyBjb3VudCB0byBOLgorICovCit2b2lkICpkbV9oYXNoX2xvb2t1cF93aXRoX2NvdW50KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCBjaGFyICprZXksIGludCAqY291bnQpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqKmM7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqKmMxID0gTlVMTDsKKwl1aW50MzJfdCBsZW4gPSBzdHJsZW4oa2V5KSArIDE7CisJdW5zaWduZWQgaDsKKworCSpjb3VudCA9IDA7CisKKwloID0gX2hhc2goa2V5LCBsZW4pICYgKHQtPm51bV9zbG90cyAtIDEpOworCisJZm9yIChjID0gJnQtPnNsb3RzW2hdOyAqYzsgYyA9ICYoKCpjKS0+bmV4dCkpIHsKKwkJaWYgKCgqYyktPmtleWxlbiAhPSBsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAoIW1lbWNtcChrZXksICgqYyktPmtleSwgbGVuKSkgeworCQkJKCpjb3VudCkrKzsKKwkJCWlmICghYzEpCisJCQkJYzEgPSBjOworCQl9CisJfQorCisJaWYgKCFjMSkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gKmMxID8gKCpjMSktPmRhdGEgOiAwOworfQorCit1bnNpZ25lZCBkbV9oYXNoX2dldF9udW1fZW50cmllcyhzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCkKK3sKKwlyZXR1cm4gdC0+bnVtX25vZGVzOworfQorCit2b2lkIGRtX2hhc2hfaXRlcihzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgZG1faGFzaF9pdGVyYXRlX2ZuIGYpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqYywgKm47CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5udW1fc2xvdHM7IGkrKykKKwkJZm9yIChjID0gdC0+c2xvdHNbaV07IGM7IGMgPSBuKSB7CisJCQluID0gYy0+bmV4dDsKKwkJCWYoYy0+ZGF0YSk7CisJCX0KK30KKwordm9pZCBkbV9oYXNoX3dpcGUoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQpCit7CisJX2ZyZWVfbm9kZXModCk7CisJbWVtc2V0KHQtPnNsb3RzLCAwLCBzaXplb2Yoc3RydWN0IGRtX2hhc2hfbm9kZSAqKSAqIHQtPm51bV9zbG90cyk7CisJdC0+bnVtX25vZGVzID0gMHU7Cit9CisKK2NoYXIgKmRtX2hhc2hfZ2V0X2tleShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgc3RydWN0IGRtX2hhc2hfbm9kZSAqbikKK3sKKwlyZXR1cm4gbi0+a2V5OworfQorCit2b2lkICpkbV9oYXNoX2dldF9kYXRhKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICAgc3RydWN0IGRtX2hhc2hfbm9kZSAqbikKK3sKKwlyZXR1cm4gbi0+ZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCBkbV9oYXNoX25vZGUgKl9uZXh0X3Nsb3Qoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIHVuc2lnbmVkIHMpCit7CisJc3RydWN0IGRtX2hhc2hfbm9kZSAqYyA9IE5VTEw7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IHM7IGkgPCB0LT5udW1fc2xvdHMgJiYgIWM7IGkrKykKKwkJYyA9IHQtPnNsb3RzW2ldOworCisJcmV0dXJuIGM7Cit9CisKK3N0cnVjdCBkbV9oYXNoX25vZGUgKmRtX2hhc2hfZ2V0X2ZpcnN0KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0KQoreworCXJldHVybiBfbmV4dF9zbG90KHQsIDApOworfQorCitzdHJ1Y3QgZG1faGFzaF9ub2RlICpkbV9oYXNoX2dldF9uZXh0KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBzdHJ1Y3QgZG1faGFzaF9ub2RlICpuKQoreworCXVuc2lnbmVkIGggPSBfaGFzaChuLT5rZXksIG4tPmtleWxlbikgJiAodC0+bnVtX3Nsb3RzIC0gMSk7CisKKwlyZXR1cm4gbi0+bmV4dCA/IG4tPm5leHQgOiBfbmV4dF9zbG90KHQsIGggKyAxKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL2RhdGFzdHJ1Y3QvbGlzdC5jIGIvbGliZG0vZGF0YXN0cnVjdC9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkM2IxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2RhdGFzdHJ1Y3QvbGlzdC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKgorICogSW5pdGlhbGlzZSBhIGxpc3QgYmVmb3JlIHVzZS4KKyAqIFRoZSBsaXN0IGhlYWQncyBuZXh0IGFuZCBwcmV2aW91cyBwb2ludGVycyBwb2ludCBiYWNrIHRvIGl0c2VsZi4KKyAqLwordm9pZCBkbV9saXN0X2luaXQoc3RydWN0IGRtX2xpc3QgKmhlYWQpCit7CisJaGVhZC0+biA9IGhlYWQtPnAgPSBoZWFkOworfQorCisvKgorICogSW5zZXJ0IGFuIGVsZW1lbnQgYmVmb3JlICdoZWFkJy4KKyAqIElmICdoZWFkJyBpcyB0aGUgbGlzdCBoZWFkLCB0aGlzIGFkZHMgYW4gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICovCit2b2lkIGRtX2xpc3RfYWRkKHN0cnVjdCBkbV9saXN0ICpoZWFkLCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSkKK3sKKwlhc3NlcnQoaGVhZC0+bik7CisKKwllbGVtLT5uID0gaGVhZDsKKwllbGVtLT5wID0gaGVhZC0+cDsKKworCWhlYWQtPnAtPm4gPSBlbGVtOworCWhlYWQtPnAgPSBlbGVtOworfQorCisvKgorICogSW5zZXJ0IGFuIGVsZW1lbnQgYWZ0ZXIgJ2hlYWQnLgorICogSWYgJ2hlYWQnIGlzIHRoZSBsaXN0IGhlYWQsIHRoaXMgYWRkcyBhbiBlbGVtZW50IHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKyAqLwordm9pZCBkbV9saXN0X2FkZF9oKHN0cnVjdCBkbV9saXN0ICpoZWFkLCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSkKK3sKKwlhc3NlcnQoaGVhZC0+bik7CisKKwllbGVtLT5uID0gaGVhZC0+bjsKKwllbGVtLT5wID0gaGVhZDsKKworCWhlYWQtPm4tPnAgPSBlbGVtOworCWhlYWQtPm4gPSBlbGVtOworfQorCisvKgorICogRGVsZXRlIGFuIGVsZW1lbnQgZnJvbSBpdHMgbGlzdC4KKyAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBlbGVtZW50IGl0c2VsZiAtIGl0IG1heSBzdGlsbCBiZSBzYWZlCisgKiB0byBmb2xsb3cgaXRzIHBvaW50ZXJzLgorICovCit2b2lkIGRtX2xpc3RfZGVsKHN0cnVjdCBkbV9saXN0ICplbGVtKQoreworCWVsZW0tPm4tPnAgPSBlbGVtLT5wOworCWVsZW0tPnAtPm4gPSBlbGVtLT5uOworfQorCisvKgorICogUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBleGlzdGluZyBsaXN0IGFuZCBpbnNlcnQgYmVmb3JlICdoZWFkJy4KKyAqLwordm9pZCBkbV9saXN0X21vdmUoc3RydWN0IGRtX2xpc3QgKmhlYWQsIHN0cnVjdCBkbV9saXN0ICplbGVtKQoreworICAgICAgICBkbV9saXN0X2RlbChlbGVtKTsKKyAgICAgICAgZG1fbGlzdF9hZGQoaGVhZCwgZWxlbSk7Cit9CisKKy8qCisgKiBJcyB0aGUgbGlzdCBlbXB0eT8KKyAqLworaW50IGRtX2xpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGRtX2xpc3QgKmhlYWQpCit7CisJcmV0dXJuIGhlYWQtPm4gPT0gaGVhZDsKK30KKworLyoKKyAqIElzIHRoaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Q/CisgKi8KK2ludCBkbV9saXN0X3N0YXJ0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSkKK3sKKwlyZXR1cm4gZWxlbS0+cCA9PSBoZWFkOworfQorCisvKgorICogSXMgdGhpcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0PworICovCitpbnQgZG1fbGlzdF9lbmQoY29uc3Qgc3RydWN0IGRtX2xpc3QgKmhlYWQsIGNvbnN0IHN0cnVjdCBkbV9saXN0ICplbGVtKQoreworCXJldHVybiBlbGVtLT5uID09IGhlYWQ7Cit9CisKKy8qCisgKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCBvciBOVUxMIGlmIGVtcHR5CisgKi8KK3N0cnVjdCBkbV9saXN0ICpkbV9saXN0X2ZpcnN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkKQoreworCXJldHVybiAoZG1fbGlzdF9lbXB0eShoZWFkKSA/IE5VTEwgOiBoZWFkLT5uKTsKK30KKworLyoKKyAqIFJldHVybiBsYXN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgb3IgTlVMTCBpZiBlbXB0eQorICovCitzdHJ1Y3QgZG1fbGlzdCAqZG1fbGlzdF9sYXN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkKQoreworCXJldHVybiAoZG1fbGlzdF9lbXB0eShoZWFkKSA/IE5VTEwgOiBoZWFkLT5wKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBvZiB0aGUgbGlzdCwgb3IgTlVMTCBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBzdGFydC4KKyAqLworc3RydWN0IGRtX2xpc3QgKmRtX2xpc3RfcHJldihjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmVsZW0pCit7CisJcmV0dXJuIChkbV9saXN0X3N0YXJ0KGhlYWQsIGVsZW0pID8gTlVMTCA6IGVsZW0tPnApOworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QsIG9yIE5VTEwgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqZG1fbGlzdF9uZXh0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSkKK3sKKwlyZXR1cm4gKGRtX2xpc3RfZW5kKGhlYWQsIGVsZW0pID8gTlVMTCA6IGVsZW0tPm4pOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBsaXN0IGJ5IHdhbGtpbmcgaXQuCisgKi8KK3Vuc2lnbmVkIGludCBkbV9saXN0X3NpemUoY29uc3Qgc3RydWN0IGRtX2xpc3QgKmhlYWQpCit7CisJdW5zaWduZWQgaW50IHMgPSAwOworCWNvbnN0IHN0cnVjdCBkbV9saXN0ICp2OworCisJZG1fbGlzdF9pdGVyYXRlKHYsIGhlYWQpCisJICAgIHMrKzsKKworCXJldHVybiBzOworfQorCisvKgorICogSm9pbiB0d28gbGlzdHMgdG9nZXRoZXIuCisgKiBUaGlzIG1vdmVzIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgJ2hlYWQxJyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgKiAnaGVhZCcsIGxlYXZpbmcgJ2hlYWQxJyBlbXB0eS4KKyAqLwordm9pZCBkbV9saXN0X3NwbGljZShzdHJ1Y3QgZG1fbGlzdCAqaGVhZCwgc3RydWN0IGRtX2xpc3QgKmhlYWQxKQoreworCWFzc2VydChoZWFkLT5uKTsKKwlhc3NlcnQoaGVhZDEtPm4pOworCisJaWYgKGRtX2xpc3RfZW1wdHkoaGVhZDEpKQorCSAgICByZXR1cm47CisKKwloZWFkMS0+cC0+biA9IGhlYWQ7CisJaGVhZDEtPm4tPnAgPSBoZWFkLT5wOworCisJaGVhZC0+cC0+biA9IGhlYWQxLT5uOworCWhlYWQtPnAgPSBoZWFkMS0+cDsKKworCWRtX2xpc3RfaW5pdChoZWFkMSk7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9pb2N0bC9saWJkbS1pZmFjZS5jIGIvbGliZG0vaW9jdGwvbGliZG0taWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBkYWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vaW9jdGwvbGliZG0taWZhY2UuYwpAQCAtMCwwICsxLDIxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorI2luY2x1ZGUgImxpYmRtLXRhcmdldHMuaCIKKyNpbmNsdWRlICJsaWJkbS1jb21tb24uaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmZGVmIF9fbGludXhfXworIyAgaW5jbHVkZSAia2Rldl90LmgiCisjICBpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNlbHNlCisjICBkZWZpbmUgTUFKT1IoeCkgbWFqb3IoKHgpKQorIyAgZGVmaW5lIE1JTk9SKHgpIG1pbm9yKCh4KSkKKyMgIGRlZmluZSBNS0RFVih4LHkpIG1ha2VkZXYoKHgpLCh5KSkKKyNlbmRpZgorCisjaW5jbHVkZSAiZG0taW9jdGwuaCIKKworLyoKKyAqIEVuc3VyZSBidWlsZCBjb21wYXRpYmlsaXR5LiAgCisgKiBUaGUgaGFyZC1jb2RlZCB2ZXJzaW9ucyBoZXJlIGFyZSB0aGUgaGlnaGVzdCBwcmVzZW50IAorICogaW4gdGhlIF9jbWRfZGF0YSBhcnJheXMuCisgKi8KKworI2lmICEoKERNX1ZFUlNJT05fTUFKT1IgPT0gNCAmJiBETV9WRVJTSU9OX01JTk9SID49IDYpKQorI2Vycm9yIFRoZSB2ZXJzaW9uIG9mIGRtLWlvY3RsLmggaW5jbHVkZWQgaXMgaW5jb21wYXRpYmxlLgorI2VuZGlmCisKKy8qIEZJWE1FIFRoaXMgc2hvdWxkIGJlIGV4cG9ydGVkIGluIGRldmljZS1tYXBwZXIuaCAqLworI2RlZmluZSBETV9OQU1FICJkZXZpY2UtbWFwcGVyIgorCisjZGVmaW5lIFBST0NfTUlTQyAiL3Byb2MvbWlzYyIKKyNkZWZpbmUgUFJPQ19ERVZJQ0VTICIvcHJvYy9kZXZpY2VzIgorI2RlZmluZSBNSVNDX05BTUUgIm1pc2MiCisKKyNkZWZpbmUgTlVNQkVSX09GX01BSk9SUyA0MDk2CisKKy8qCisgKiBTdGF0aWMgbWlub3IgbnVtYmVyIGFzc2lnbmVkIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zNi4KKyAqIFRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIGlzIGluIGtlcm5lbCdzIGluY2x1ZGUvbGludXgvbWlzY2RldmljZS5oLgorICogVGhpcyBudW1iZXIgaXMgYWxzbyB2aXNpYmxlIGluIG1vZHVsZXMuZGV2bmFtZSBleHBvcnRlZCBieSBkZXBtb2QKKyAqIHV0aWxpdHkgKHN1cHBvcnQgaW5jbHVkZWQgaW4gbW9kdWxlLWluaXQtdG9vbHMgdmVyc2lvbiA+PSAzLjEyKS4KKyAqLworI2RlZmluZSBNQVBQRVJfQ1RSTF9NSU5PUiAyMzYKKyNkZWZpbmUgTUlTQ19NQUpPUiAxMAorCisvKiBkbSBtYWpvciB2ZXJzaW9uIG5vIGZvciBydW5uaW5nIGtlcm5lbCAqLworc3RhdGljIHVuc2lnbmVkIF9kbV92ZXJzaW9uID0gRE1fVkVSU0lPTl9NQUpPUjsKK3N0YXRpYyB1bnNpZ25lZCBfZG1fdmVyc2lvbl9taW5vciA9IDA7CitzdGF0aWMgdW5zaWduZWQgX2RtX3ZlcnNpb25fcGF0Y2hsZXZlbCA9IDA7CitzdGF0aWMgaW50IF9sb2dfc3VwcHJlc3MgPSAwOworc3RhdGljIHN0cnVjdCBkbV90aW1lc3RhbXAgKl9kbV9pb2N0bF90aW1lc3RhbXAgPSBOVUxMOworCisvKgorICogSWYgdGhlIGtlcm5lbCBkbSBkcml2ZXIgb25seSBzdXBwb3J0cyBvbmUgbWFqb3IgbnVtYmVyCisgKiB3ZSBzdG9yZSBpdCBpbiBfZG1fZGV2aWNlX21ham9yLiAgT3RoZXJ3aXNlIHdlIGluZGljYXRlCisgKiB3aGljaCBtYWpvciBudW1iZXJzIGhhdmUgYmVlbiBjbGFpbWVkIGJ5IGRldmljZS1tYXBwZXIKKyAqIGluIF9kbV9iaXRzZXQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfZG1fbXVsdGlwbGVfbWFqb3Jfc3VwcG9ydCA9IDE7CitzdGF0aWMgZG1fYml0c2V0X3QgX2RtX2JpdHNldCA9IE5VTEw7CitzdGF0aWMgdWludDMyX3QgX2RtX2RldmljZV9tYWpvciA9IDA7CisKK3N0YXRpYyBpbnQgX2NvbnRyb2xfZmQgPSAtMTsKK3N0YXRpYyBpbnQgX2hvbGRfY29udHJvbF9mZF9vcGVuID0gMDsKK3N0YXRpYyBpbnQgX3ZlcnNpb25fY2hlY2tlZCA9IDA7CitzdGF0aWMgaW50IF92ZXJzaW9uX29rID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBfaW9jdGxfYnVmZmVyX2RvdWJsZV9mYWN0b3IgPSAwOworCitjb25zdCBpbnQgX2RtX2NvbXBhdCA9IDA7CisKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIHN0cnVjdCBjbWRfZGF0YSBfY21kX2RhdGFfdjRbXSA9IHsKKwl7ImNyZWF0ZSIsCURNX0RFVl9DUkVBVEUsCQl7NCwgMCwgMH19LAorCXsicmVsb2FkIiwJRE1fVEFCTEVfTE9BRCwJCXs0LCAwLCAwfX0sCisJeyJyZW1vdmUiLAlETV9ERVZfUkVNT1ZFLAkJezQsIDAsIDB9fSwKKwl7InJlbW92ZV9hbGwiLAlETV9SRU1PVkVfQUxMLAkJezQsIDAsIDB9fSwKKwl7InN1c3BlbmQiLAlETV9ERVZfU1VTUEVORCwJCXs0LCAwLCAwfX0sCisJeyJyZXN1bWUiLAlETV9ERVZfU1VTUEVORCwJCXs0LCAwLCAwfX0sCisJeyJpbmZvIiwJRE1fREVWX1NUQVRVUywJCXs0LCAwLCAwfX0sCisJeyJkZXBzIiwJRE1fVEFCTEVfREVQUywJCXs0LCAwLCAwfX0sCisJeyJyZW5hbWUiLAlETV9ERVZfUkVOQU1FLAkJezQsIDAsIDB9fSwKKwl7InZlcnNpb24iLAlETV9WRVJTSU9OLAkJezQsIDAsIDB9fSwKKwl7InN0YXR1cyIsCURNX1RBQkxFX1NUQVRVUywJezQsIDAsIDB9fSwKKwl7InRhYmxlIiwJRE1fVEFCTEVfU1RBVFVTLAl7NCwgMCwgMH19LAorCXsid2FpdGV2ZW50IiwJRE1fREVWX1dBSVQsCQl7NCwgMCwgMH19LAorCXsibmFtZXMiLAlETV9MSVNUX0RFVklDRVMsCXs0LCAwLCAwfX0sCisJeyJjbGVhciIsCURNX1RBQkxFX0NMRUFSLAkJezQsIDAsIDB9fSwKKwl7Im1rbm9kZXMiLAlETV9ERVZfU1RBVFVTLAkJezQsIDAsIDB9fSwKKyNpZmRlZiBETV9MSVNUX1ZFUlNJT05TCisJeyJ2ZXJzaW9ucyIsCURNX0xJU1RfVkVSU0lPTlMsCXs0LCAxLCAwfX0sCisjZW5kaWYKKyNpZmRlZiBETV9UQVJHRVRfTVNHCisJeyJtZXNzYWdlIiwJRE1fVEFSR0VUX01TRywJCXs0LCAyLCAwfX0sCisjZW5kaWYKKyNpZmRlZiBETV9ERVZfU0VUX0dFT01FVFJZCisJeyJzZXRnZW9tZXRyeSIsCURNX0RFVl9TRVRfR0VPTUVUUlksCXs0LCA2LCAwfX0sCisjZW5kaWYKK307CisvKiAqSU5ERU5ULU9OKiAqLworCisjZGVmaW5lIEFMSUdOTUVOVCA4CisKKy8qIEZJWE1FIFJlamlnIGxpYnJhcnkgdG8gcmVjb3JkICYgdXNlIGVycm5vIGluc3RlYWQgKi8KKyNpZm5kZWYgRE1fRVhJU1RTX0ZMQUcKKyMgIGRlZmluZSBETV9FWElTVFNfRkxBRyAweDAwMDAwMDA0CisjZW5kaWYKKworc3RhdGljIGNoYXIgKl9hbGlnbihjaGFyICpwdHIsIHVuc2lnbmVkIGludCBhKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWduID0gLS1hOworCisJcmV0dXJuIChjaGFyICopICgoKHVuc2lnbmVkIGxvbmcpIHB0ciArIGFnbikgJiB+YWduKTsKK30KKworI2lmZGVmIERNX0lPQ1RMUworc3RhdGljIGludCBfa2VybmVsX21ham9yID0gMDsKK3N0YXRpYyBpbnQgX2tlcm5lbF9taW5vciA9IDA7CitzdGF0aWMgaW50IF9rZXJuZWxfcmVsZWFzZSA9IDA7CisKK3N0YXRpYyBpbnQgX3VuYW1lKHZvaWQpCit7CisJc3RhdGljIGludCBfdXRzX3NldCA9IDA7CisJc3RydWN0IHV0c25hbWUgX3V0czsKKwlpbnQgcGFydHM7CisKKwlpZiAoX3V0c19zZXQpCisJCXJldHVybiAxOworCisJaWYgKHVuYW1lKCZfdXRzKSkgeworCQlsb2dfZXJyb3IoInVuYW1lIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXJ0cyA9IHNzY2FuZihfdXRzLnJlbGVhc2UsICIlZC4lZC4lZCIsCisJCSAgICAgICAmX2tlcm5lbF9tYWpvciwgJl9rZXJuZWxfbWlub3IsICZfa2VybmVsX3JlbGVhc2UpOworCisJLyogS2VybmVscyB3aXRoIGEgbWFqb3IgbnVtYmVyIG9mIDIgYWx3YXlzIGhhZCAzIHBhcnRzLiAqLworCWlmIChwYXJ0cyA8IDEgfHwgKF9rZXJuZWxfbWFqb3IgPCAzICYmIHBhcnRzIDwgMykpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGtlcm5lbCB2ZXJzaW9uIHVzZWQuIik7CisJCXJldHVybiAwOworCX0KKworCV91dHNfc2V0ID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFNldCBudW1iZXIgdG8gTlVMTCB0byBwb3B1bGF0ZSBfZG1fYml0c2V0IC0gb3RoZXJ3aXNlIGZpcnN0CisgKiBtYXRjaCBpcyByZXR1cm5lZC4KKyAqIFJldHVybnM6CisgKiAJMCAtIGVycm9yCisgKiAJMSAtIHN1Y2Nlc3MgLSBudW1iZXIgZm91bmQKKyAqIAkyIC0gc3VjY2VzcyAtIG51bWJlciBub3QgZm91bmQgKG9ubHkgaWYgcmVxdWlyZV9tb2R1bGVfbG9hZGVkPTApCisgKi8KK3N0YXRpYyBpbnQgX2dldF9wcm9jX251bWJlcihjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIHVpbnQzMl90ICpudW1iZXIsIGludCByZXF1aXJlX21vZHVsZV9sb2FkZWQpCit7CisJRklMRSAqZmw7CisJY2hhciBubVsyNTZdOworCWNoYXIgKmxpbmUgPSBOVUxMOworCXNpemVfdCBsZW47CisJdWludDMyX3QgbnVtOworCisJaWYgKCEoZmwgPSBmb3BlbihmaWxlLCAiciIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIGZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoZ2V0bGluZSgmbGluZSwgJmxlbiwgZmwpICE9IC0xKSB7CisJCWlmIChzc2NhbmYobGluZSwgIiVkICUyNTVzXG4iLCAmbnVtLCAmbm1bMF0pID09IDIpIHsKKwkJCWlmICghc3RyY21wKG5hbWUsIG5tKSkgeworCQkJCWlmIChudW1iZXIpIHsKKwkJCQkJKm51bWJlciA9IG51bTsKKwkJCQkJaWYgKGZjbG9zZShmbCkpCisJCQkJCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBmaWxlKTsKKwkJCQkJZnJlZShsaW5lKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWRtX2JpdF9zZXQoX2RtX2JpdHNldCwgbnVtKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZmNsb3NlKGZsKSkKKwkJbG9nX3N5c19lcnJvcigiZmNsb3NlIiwgZmlsZSk7CisJZnJlZShsaW5lKTsKKworCWlmIChudW1iZXIpIHsKKwkJaWYgKHJlcXVpcmVfbW9kdWxlX2xvYWRlZCkgeworCQkJbG9nX2Vycm9yKCIlczogTm8gZW50cnkgZm9yICVzIGZvdW5kIiwgZmlsZSwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMjsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29udHJvbF9kZXZpY2VfbnVtYmVyKHVpbnQzMl90ICptYWpvciwgdWludDMyX3QgKm1pbm9yKQoreworCWlmICghX2dldF9wcm9jX251bWJlcihQUk9DX0RFVklDRVMsIE1JU0NfTkFNRSwgbWFqb3IsIDEpIHx8CisJICAgICFfZ2V0X3Byb2NfbnVtYmVyKFBST0NfTUlTQywgRE1fTkFNRSwgbWlub3IsIDEpKSB7CisJCSptYWpvciA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyAxIGlmIGl0IGV4aXN0cyBvbiByZXR1cm5pbmc7IDAgaWYgaXQgZG9lc24ndDsgLTEgaWYgaXQncyB3cm9uZy4KKyAqLworc3RhdGljIGludCBfY29udHJvbF9leGlzdHMoY29uc3QgY2hhciAqY29udHJvbCwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKworCWlmIChzdGF0KGNvbnRyb2wsICZidWYpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJbG9nX3N5c19lcnJvcigic3RhdCIsIGNvbnRyb2wpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVNfSVNDSFIoYnVmLnN0X21vZGUpKSB7CisJCWxvZ192ZXJib3NlKCIlczogV3JvbmcgaW5vZGUgdHlwZSIsIGNvbnRyb2wpOworCQlpZiAoIXVubGluayhjb250cm9sKSkKKwkJCXJldHVybiAwOworCQlsb2dfc3lzX2Vycm9yKCJ1bmxpbmsiLCBjb250cm9sKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtYWpvciAmJiBidWYuc3RfcmRldiAhPSBNS0RFVigoZGV2X3QpbWFqb3IsIChkZXZfdCltaW5vcikpIHsKKwkJbG9nX3ZlcmJvc2UoIiVzOiBXcm9uZyBkZXZpY2UgbnVtYmVyOiAoJXUsICV1KSBpbnN0ZWFkIG9mICIKKwkJCSAgICAiKCV1LCAldSkiLCBjb250cm9sLAorCQkJICAgIE1BSk9SKGJ1Zi5zdF9tb2RlKSwgTUlOT1IoYnVmLnN0X21vZGUpLAorCQkJICAgIG1ham9yLCBtaW5vcik7CisJCWlmICghdW5saW5rKGNvbnRyb2wpKQorCQkJcmV0dXJuIDA7CisJCWxvZ19zeXNfZXJyb3IoInVubGluayIsIGNvbnRyb2wpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9jb250cm9sKGNvbnN0IGNoYXIgKmNvbnRyb2wsIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vcikKK3sKKwlpbnQgcmV0OworCW1vZGVfdCBvbGRfdW1hc2s7CisKKwkvKgorCSAqIFJldHVybiBpZiB0aGUgY29udHJvbCBhbHJlYWR5IGV4aXN0cyB3aXRoIGludGVuZGVkIG1ham9yL21pbm9yCisJICogb3IgdGhlcmUncyBhbiBlcnJvciB1bmxpbmtpbmcgYW4gYXBwYXJlbnRseSBpbmNvcnJlY3Qgb25lLgorCSAqLworCXJldCA9IF9jb250cm9sX2V4aXN0cyhjb250cm9sLCBtYWpvciwgbWlub3IpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gdW5saW5rIGV4aXN0aW5nIGluY29ycmVjdCBub2RlICovCisJaWYgKHJldCkKKwkJcmV0dXJuIDE7CS8qIEFscmVhZHkgZXhpc3RzIGFuZCBjb3JyZWN0ICovCisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoZG1fZGlyKCksIFNfSUZESVIpOworCW9sZF91bWFzayA9IHVtYXNrKERNX0RFVl9ESVJfVU1BU0spOworCXJldCA9IGRtX2NyZWF0ZV9kaXIoZG1fZGlyKCkpOworCXVtYXNrKG9sZF91bWFzayk7CisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJbG9nX3ZlcmJvc2UoIkNyZWF0aW5nIGRldmljZSAlcyAoJXUsICV1KSIsIGNvbnRyb2wsIG1ham9yLCBtaW5vcik7CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoY29udHJvbCwgU19JRkNIUik7CisJb2xkX3VtYXNrID0gdW1hc2soRE1fQ09OVFJPTF9OT0RFX1VNQVNLKTsKKwlpZiAobWtub2QoY29udHJvbCwgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgIE1LREVWKChkZXZfdCltYWpvciwgKGRldl90KW1pbm9yKSkgPCAwKSAgeworCQlsb2dfc3lzX2Vycm9yKCJta25vZCIsIGNvbnRyb2wpOworCQkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJCXJldHVybiAwOworCX0KKwl1bWFzayhvbGRfdW1hc2spOworCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dChOVUxMLCAwKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKy8qCisgKiBGSVhNRSBVcGRhdGUgYml0c2V0IGluIGxvbmctcnVubmluZyBwcm9jZXNzIGlmIGRtIGNsYWltcyBuZXcgbWFqb3IgbnVtYmVycy4KKyAqLworLyoKKyAqIElmIHJlcXVpcmVfbW9kdWxlX2xvYWRlZD0wLCBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gY2hlY2sKKyAqIHdoZXRoZXIgX2RtX2RldmljZV9tYWpvciBvciBfZG1fYml0c2V0IGlzIHJlYWxseSBzZXQuIElmCisgKiBpdCdzIG5vdCwgaXQgbWVhbnMgdGhlIG1vZHVsZSBpcyBub3QgbG9hZGVkLgorICovCitzdGF0aWMgaW50IF9jcmVhdGVfZG1fYml0c2V0KGludCByZXF1aXJlX21vZHVsZV9sb2FkZWQpCit7CisJaW50IHI7CisKKyNpZmRlZiBETV9JT0NUTFMKKwlpZiAoX2RtX2JpdHNldCB8fCBfZG1fZGV2aWNlX21ham9yKQorCQlyZXR1cm4gMTsKKworCWlmICghX3VuYW1lKCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiAyLjYga2VybmVscyBhcmUgbGltaXRlZCB0byBvbmUgbWFqb3IgbnVtYmVyLgorCSAqIEFzc3VtZSAyLjQga2VybmVscyBhcmUgcGF0Y2hlZCBub3QgdG8uCisJICogRklYTUUgQ2hlY2sgX2RtX3ZlcnNpb24gYW5kIF9kbV92ZXJzaW9uX21pbm9yIGlmIDIuNiBjaGFuZ2VzIHRoaXMuCisJICovCisJaWYgKEtFUk5FTF9WRVJTSU9OKF9rZXJuZWxfbWFqb3IsIF9rZXJuZWxfbWlub3IsIF9rZXJuZWxfcmVsZWFzZSkgPj0KKwkgICAgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMCkpCisJCV9kbV9tdWx0aXBsZV9tYWpvcl9zdXBwb3J0ID0gMDsKKworCWlmICghX2RtX211bHRpcGxlX21ham9yX3N1cHBvcnQpIHsKKwkJaWYgKCFfZ2V0X3Byb2NfbnVtYmVyKFBST0NfREVWSUNFUywgRE1fTkFNRSwgJl9kbV9kZXZpY2VfbWFqb3IsCisJCQkJICAgICAgcmVxdWlyZV9tb2R1bGVfbG9hZGVkKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBNdWx0aXBsZSBtYWpvciBudW1iZXJzIHN1cHBvcnRlZCAqLworCWlmICghKF9kbV9iaXRzZXQgPSBkbV9iaXRzZXRfY3JlYXRlKE5VTEwsIE5VTUJFUl9PRl9NQUpPUlMpKSkKKwkJcmV0dXJuIDA7CisKKwlyID0gX2dldF9wcm9jX251bWJlcihQUk9DX0RFVklDRVMsIERNX05BTUUsIE5VTEwsIHJlcXVpcmVfbW9kdWxlX2xvYWRlZCk7CisJaWYgKCFyIHx8IHIgPT0gMikgeworCQlkbV9iaXRzZXRfZGVzdHJveShfZG1fYml0c2V0KTsKKwkJX2RtX2JpdHNldCA9IE5VTEw7CisJCS8qCisJCSAqIEl0J3Mgbm90IGFuIGVycm9yIGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGFuZCB3ZQorCQkgKiBkaWRuJ3QgcmVxdWlyZSBtb2R1bGUgdG8gYmUgbG9hZGVkIGF0IHRoZSBzYW1lIHRpbWUuCisJCSAqLworCQlyZXR1cm4gciA9PSAyOworCX0KKworCXJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgZG1faXNfZG1fbWFqb3IodWludDMyX3QgbWFqb3IpCit7CisJaWYgKCFfY3JlYXRlX2RtX2JpdHNldCgwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoX2RtX211bHRpcGxlX21ham9yX3N1cHBvcnQpIHsKKwkJaWYgKCFfZG1fYml0c2V0KQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBkbV9iaXQoX2RtX2JpdHNldCwgbWFqb3IpID8gMSA6IDA7CisJfQorCWVsc2UgeworCQlpZiAoIV9kbV9kZXZpY2VfbWFqb3IpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIChtYWpvciA9PSBfZG1fZGV2aWNlX21ham9yKSA/IDEgOiAwOworCX0KK30KKworc3RhdGljIHZvaWQgX2Nsb3NlX2NvbnRyb2xfZmQodm9pZCkKK3sKKwlpZiAoX2NvbnRyb2xfZmQgIT0gLTEpIHsKKwkJaWYgKGNsb3NlKF9jb250cm9sX2ZkKSA8IDApCisJCQlsb2dfc3lzX2Vycm9yKCJjbG9zZSIsICJfY29udHJvbF9mZCIpOworCQlfY29udHJvbF9mZCA9IC0xOworCX0KK30KKworI2lmZGVmIERNX0lPQ1RMUworc3RhdGljIGludCBfb3Blbl9hbmRfYXNzaWduX2NvbnRyb2xfZmQoY29uc3QgY2hhciAqY29udHJvbCkKK3sKKwlpZiAoKF9jb250cm9sX2ZkID0gb3Blbihjb250cm9sLCBPX1JEV1IpKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIGNvbnRyb2wpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9vcGVuX2NvbnRyb2wodm9pZCkKK3sKKyNpZmRlZiBETV9JT0NUTFMKKwljaGFyIGNvbnRyb2xbUEFUSF9NQVhdOworCXVpbnQzMl90IG1ham9yID0gTUlTQ19NQUpPUjsKKwl1aW50MzJfdCBtaW5vciA9IE1BUFBFUl9DVFJMX01JTk9SOworCisJaWYgKF9jb250cm9sX2ZkICE9IC0xKQorCQlyZXR1cm4gMTsKKworCWlmICghX3VuYW1lKCkpCisJCXJldHVybiAwOworCisJaWYgKGRtX3NucHJpbnRmKGNvbnRyb2wsIHNpemVvZihjb250cm9sKSwgIiVzLyVzIiwgZG1fZGlyKCksIERNX0NPTlRST0xfTk9ERSkgPCAwKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogUHJpb3IgdG8gMi42LjM2IHRoZSBtaW5vciBudW1iZXIgc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiAvcHJvYy4KKwkgKi8KKwlpZiAoKEtFUk5FTF9WRVJTSU9OKF9rZXJuZWxfbWFqb3IsIF9rZXJuZWxfbWlub3IsIF9rZXJuZWxfcmVsZWFzZSkgPAorCSAgICAgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzYpKSAmJgorCSAgICAhX2NvbnRyb2xfZGV2aWNlX251bWJlcigmbWFqb3IsICZtaW5vcikpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIG5vZGUgd2l0aCBjb3JyZWN0IG1ham9yIGFuZCBtaW5vciBpZiBub3QgYWxyZWFkeSBkb25lLgorCSAqIFVkZXYgbWF5IGFscmVhZHkgaGF2ZSBjcmVhdGVkIC9kZXYvbWFwcGVyL2NvbnRyb2wKKwkgKiBmcm9tIHRoZSBtb2R1bGVzLmRldm5hbWUgZmlsZSBnZW5lcmF0ZWQgYnkgZGVwbW9kLgorCSAqLworCWlmICghX2NyZWF0ZV9jb250cm9sKGNvbnRyb2wsIG1ham9yLCBtaW5vcikpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBBcyBvZiAyLjYuMzYga2VybmVscywgdGhlIG9wZW4gY2FuIHRyaWdnZXIgYXV0b2xvYWRpbmcgZG0tbW9kLgorCSAqLworCWlmICghX29wZW5fYW5kX2Fzc2lnbl9jb250cm9sX2ZkKGNvbnRyb2wpKQorCQlnb3RvX2JhZDsKKwkKKwlpZiAoIV9jcmVhdGVfZG1fYml0c2V0KDEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCB1cCBsaXN0IG9mIGRldmljZS1tYXBwZXIgbWFqb3IgbnVtYmVycyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKKworYmFkOgorCWxvZ19lcnJvcigiRmFpbHVyZSB0byBjb21tdW5pY2F0ZSB3aXRoIGtlcm5lbCBkZXZpY2UtbWFwcGVyIGRyaXZlci4iKTsKKwlpZiAoIWdldGV1aWQoKSkKKwkJbG9nX2Vycm9yKCJDaGVjayB0aGF0IGRldmljZS1tYXBwZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwuIik7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9kbV96ZnJlZV9zdHJpbmcoY2hhciAqc3RyaW5nKQoreworCWlmIChzdHJpbmcpIHsKKwkJbWVtc2V0KHN0cmluZywgMCwgc3RybGVuKHN0cmluZykpOworCQlkbV9mcmVlKHN0cmluZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfZG1femZyZWVfZG1pKHN0cnVjdCBkbV9pb2N0bCAqZG1pKQoreworCWlmIChkbWkpIHsKKwkJbWVtc2V0KGRtaSwgMCwgZG1pLT5kYXRhX3NpemUpOworCQlkbV9mcmVlKGRtaSk7CisJfQorfQorCit2b2lkIGRtX3Rhc2tfZGVzdHJveShzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCXN0cnVjdCB0YXJnZXQgKnQsICpuOworCisJZm9yICh0ID0gZG10LT5oZWFkOyB0OyB0ID0gbikgeworCQluID0gdC0+bmV4dDsKKwkJX2RtX3pmcmVlX3N0cmluZyh0LT5wYXJhbXMpOworCQlkbV9mcmVlKHQtPnR5cGUpOworCQlkbV9mcmVlKHQpOworCX0KKworCV9kbV96ZnJlZV9kbWkoZG10LT5kbWkudjQpOworCWRtX2ZyZWUoZG10LT5kZXZfbmFtZSk7CisJZG1fZnJlZShkbXQtPm1hbmdsZWRfZGV2X25hbWUpOworCWRtX2ZyZWUoZG10LT5uZXduYW1lKTsKKwlkbV9mcmVlKGRtdC0+bWVzc2FnZSk7CisJZG1fZnJlZShkbXQtPmdlb21ldHJ5KTsKKwlkbV9mcmVlKGRtdC0+dXVpZCk7CisJZG1fZnJlZShkbXQtPm1hbmdsZWRfdXVpZCk7CisJZG1fZnJlZShkbXQpOworfQorCisvKgorICogUHJvdG9jb2wgVmVyc2lvbiA0IGZ1bmN0aW9ucy4KKyAqLworCitpbnQgZG1fdGFza19nZXRfZHJpdmVyX3ZlcnNpb24oc3RydWN0IGRtX3Rhc2sgKmRtdCwgY2hhciAqdmVyc2lvbiwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgKnY7CisKKwlpZiAoIWRtdC0+ZG1pLnY0KSB7CisJCWlmICh2ZXJzaW9uKQorCQkJdmVyc2lvblswXSA9ICdcMCc7CisJCXJldHVybiAwOworCX0KKworCXYgPSBkbXQtPmRtaS52NC0+dmVyc2lvbjsKKwlfZG1fdmVyc2lvbl9taW5vciA9IHZbMV07CisJX2RtX3ZlcnNpb25fcGF0Y2hsZXZlbCA9IHZbMl07CisJaWYgKHZlcnNpb24gJiYKKwkgICAgKHNucHJpbnRmKHZlcnNpb24sIHNpemUsICIldS4ldS4ldSIsIHZbMF0sIHZbMV0sIHZbMl0pIDwgMCkpIHsKKwkJbG9nX2Vycm9yKCJCdWZmZXIgZm9yIHZlcnNpb24gaXMgdG8gc2hvcnQuIik7CisJCWlmIChzaXplID4gMCkKKwkJCXZlcnNpb25bMF0gPSAnXDAnOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSwgaW50IGxvZ19zdXBwcmVzcykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqdGFzazsKKwlpbnQgcjsKKworCWlmICghKHRhc2sgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfVkVSU0lPTikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCBkZXZpY2UtbWFwcGVyIHZlcnNpb24iKTsKKwkJdmVyc2lvblswXSA9ICdcMCc7CisJCXJldHVybiAwOworCX0KKworCWlmIChsb2dfc3VwcHJlc3MpCisJCV9sb2dfc3VwcHJlc3MgPSAxOworCisJciA9IGRtX3Rhc2tfcnVuKHRhc2spOworCWlmICghZG1fdGFza19nZXRfZHJpdmVyX3ZlcnNpb24odGFzaywgdmVyc2lvbiwgc2l6ZSkpCisJCXN0YWNrOworCWRtX3Rhc2tfZGVzdHJveSh0YXNrKTsKKwlfbG9nX3N1cHByZXNzID0gMDsKKworCXJldHVybiByOworfQorCisvKgorICogRmluZCBvdXQgZGV2aWNlLW1hcHBlcidzIG1ham9yIHZlcnNpb24gbnVtYmVyIHRoZSBmaXJzdCB0aW1lIAorICogdGhpcyBpcyBjYWxsZWQgYW5kIHdoZXRoZXIgb3Igbm90IHdlIHN1cHBvcnQgaXQuCisgKi8KK2ludCBkbV9jaGVja192ZXJzaW9uKHZvaWQpCit7CisJY2hhciBsaWJ2ZXJzaW9uWzY0XSA9ICIiLCBkbXZlcnNpb25bNjRdID0gIiI7CisJY29uc3QgY2hhciAqY29tcGF0ID0gIiI7CisKKwlpZiAoX3ZlcnNpb25fY2hlY2tlZCkKKwkJcmV0dXJuIF92ZXJzaW9uX29rOworCisJX3ZlcnNpb25fY2hlY2tlZCA9IDE7CisKKwlpZiAoX2NoZWNrX3ZlcnNpb24oZG12ZXJzaW9uLCBzaXplb2YoZG12ZXJzaW9uKSwgX2RtX2NvbXBhdCkpCisJCXJldHVybiAxOworCisJaWYgKCFfZG1fY29tcGF0KQorCQlnb3RvX2JhZDsKKworCWxvZ192ZXJib3NlKCJkZXZpY2UtbWFwcGVyIGlvY3RsIHByb3RvY29sIHZlcnNpb24gJXUgZmFpbGVkLiAiCisJCSAgICAiVHJ5aW5nIHByb3RvY29sIHZlcnNpb24gMS4iLCBfZG1fdmVyc2lvbik7CisJX2RtX3ZlcnNpb24gPSAxOworCWlmIChfY2hlY2tfdmVyc2lvbihkbXZlcnNpb24sIHNpemVvZihkbXZlcnNpb24pLCAwKSkgeworCQlsb2dfdmVyYm9zZSgiVXNpbmcgZGV2aWNlLW1hcHBlciBpb2N0bCBwcm90b2NvbCB2ZXJzaW9uIDEiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29tcGF0ID0gIihjb21wYXQpIjsKKworICAgICAgYmFkOgorCWRtX2dldF9saWJyYXJ5X3ZlcnNpb24obGlidmVyc2lvbiwgc2l6ZW9mKGxpYnZlcnNpb24pKTsKKworCWxvZ19lcnJvcigiSW5jb21wYXRpYmxlIGxpYmRldm1hcHBlciAlcyVzIGFuZCBrZXJuZWwgZHJpdmVyICVzLiIsCisJCSAgKmxpYnZlcnNpb24gPyBsaWJ2ZXJzaW9uIDogIih1bmtub3duIHZlcnNpb24pIiwgY29tcGF0LAorCQkgICpkbXZlcnNpb24gPyBkbXZlcnNpb24gOiAiKHVua25vd24gdmVyc2lvbikiKTsKKworCV92ZXJzaW9uX29rID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2Nvb2tpZV9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gKGRtX2NoZWNrX3ZlcnNpb24oKSAmJgorCQlfZG1fdmVyc2lvbiA+PSA0ICYmCisJCV9kbV92ZXJzaW9uX21pbm9yID49IDE1KTsKK30KKworc3RhdGljIGludCBkbV9pbmFjdGl2ZV9zdXBwb3J0ZWQodm9pZCkKK3sKKwlpbnQgaW5hY3RpdmVfc3VwcG9ydGVkID0gMDsKKworCWlmIChkbV9jaGVja192ZXJzaW9uKCkgJiYgX2RtX3ZlcnNpb24gPj0gNCkgeworCQlpZiAoX2RtX3ZlcnNpb25fbWlub3IgPj0gMTYpCisJCQlpbmFjdGl2ZV9zdXBwb3J0ZWQgPSAxOyAvKiB1cHN0cmVhbSAqLworCQllbHNlIGlmIChfZG1fdmVyc2lvbl9taW5vciA9PSAxMSAmJgorCQkJIChfZG1fdmVyc2lvbl9wYXRjaGxldmVsID49IDYgJiYKKwkJCSAgX2RtX3ZlcnNpb25fcGF0Y2hsZXZlbCA8PSA0MCkpIHsKKwkJCWluYWN0aXZlX3N1cHBvcnRlZCA9IDE7IC8qIFJIRUwgNS43ICovCisJCX0KKwl9CisKKwlyZXR1cm4gaW5hY3RpdmVfc3VwcG9ydGVkOworfQorCitpbnQgZG1fbWVzc2FnZV9zdXBwb3J0c19wcmVjaXNlX3RpbWVzdGFtcHModm9pZCkKK3sKKwkvKgorCSAqIDQuMzIuMCBzdXBwb3J0cyAicHJlY2lzZV90aW1lc3RhbXBzIiBhbmQgImhpc3RvZ3JhbToiIG9wdGlvbnMKKwkgKiB0byBAc3RhdHNfY3JlYXRlIG1lc3NhZ2VzIGJ1dCBsYWNrcyB0aGUgYWJpbGl0eSB0byByZXBvcnQKKwkgKiB0aGVzZSBwcm9wZXJ0aWVzIHZpYSBhIHN1YnNlcXVlbnQgQHN0YXRzX2xpc3Q6IHJlcXVpcmUgYXQKKwkgKiBsZWFzdCA0LjMzLjAgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIGZlYXR1cmVzLgorCSAqLworCWlmIChkbV9jaGVja192ZXJzaW9uKCkgJiYgX2RtX3ZlcnNpb24gPj0gNCkKKwkJaWYgKF9kbV92ZXJzaW9uX21pbm9yID49IDMzKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKmRtX2dldF9uZXh0X3RhcmdldChzdHJ1Y3QgZG1fdGFzayAqZG10LCB2b2lkICpuZXh0LAorCQkJIHVpbnQ2NF90ICpzdGFydCwgdWludDY0X3QgKmxlbmd0aCwKKwkJCSBjaGFyICoqdGFyZ2V0X3R5cGUsIGNoYXIgKipwYXJhbXMpCit7CisJc3RydWN0IHRhcmdldCAqdCA9IChzdHJ1Y3QgdGFyZ2V0ICopIG5leHQ7CisKKwlpZiAoIXQpCisJCXQgPSBkbXQtPmhlYWQ7CisKKwlpZiAoIXQpIHsKKwkJKnN0YXJ0ID0gMDsKKwkJKmxlbmd0aCA9IDA7CisJCSp0YXJnZXRfdHlwZSA9IDA7CisJCSpwYXJhbXMgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqc3RhcnQgPSB0LT5zdGFydDsKKwkqbGVuZ3RoID0gdC0+bGVuZ3RoOworCSp0YXJnZXRfdHlwZSA9IHQtPnR5cGU7CisJKnBhcmFtcyA9IHQtPnBhcmFtczsKKworCXJldHVybiB0LT5uZXh0OworfQorCisvKiBVbm1hcnNoYWxsIHRoZSB0YXJnZXQgaW5mbyByZXR1cm5lZCBmcm9tIGEgc3RhdHVzIGNhbGwgKi8KK3N0YXRpYyBpbnQgX3VubWFyc2hhbF9zdGF0dXMoc3RydWN0IGRtX3Rhc2sgKmRtdCwgc3RydWN0IGRtX2lvY3RsICpkbWkpCit7CisJY2hhciAqb3V0YnVmID0gKGNoYXIgKikgZG1pICsgZG1pLT5kYXRhX3N0YXJ0OworCWNoYXIgKm91dHB0ciA9IG91dGJ1ZjsKKwl1aW50MzJfdCBpOworCXN0cnVjdCBkbV90YXJnZXRfc3BlYyAqc3BlYzsKKworCWZvciAoaSA9IDA7IGkgPCBkbWktPnRhcmdldF9jb3VudDsgaSsrKSB7CisJCXNwZWMgPSAoc3RydWN0IGRtX3RhcmdldF9zcGVjICopIG91dHB0cjsKKwkJaWYgKCFkbV90YXNrX2FkZF90YXJnZXQoZG10LCBzcGVjLT5zZWN0b3Jfc3RhcnQsCisJCQkJCXNwZWMtPmxlbmd0aCwKKwkJCQkJc3BlYy0+dGFyZ2V0X3R5cGUsCisJCQkJCW91dHB0ciArIHNpemVvZigqc3BlYykpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCW91dHB0ciA9IG91dGJ1ZiArIHNwZWMtPm5leHQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9mb3JtYXRfZGV2KGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUsIHVpbnQzMl90IGRldl9tYWpvciwKKwkJICB1aW50MzJfdCBkZXZfbWlub3IpCit7CisJaW50IHI7CisKKwlpZiAoYnVmc2l6ZSA8IDgpCisJCXJldHVybiAwOworCisJciA9IHNucHJpbnRmKGJ1ZiwgKHNpemVfdCkgYnVmc2l6ZSwgIiV1OiV1IiwgZGV2X21ham9yLCBkZXZfbWlub3IpOworCWlmIChyIDwgMCB8fCByID4gYnVmc2l6ZSAtIDEpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX2dldF9pbmZvKHN0cnVjdCBkbV90YXNrICpkbXQsIHN0cnVjdCBkbV9pbmZvICppbmZvKQoreworCWlmICghZG10LT5kbWkudjQpCisJCXJldHVybiAwOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+ZXhpc3RzID0gZG10LT5kbWkudjQtPmZsYWdzICYgRE1fRVhJU1RTX0ZMQUcgPyAxIDogMDsKKwlpZiAoIWluZm8tPmV4aXN0cykKKwkJcmV0dXJuIDE7CisKKwlpbmZvLT5zdXNwZW5kZWQgPSBkbXQtPmRtaS52NC0+ZmxhZ3MgJiBETV9TVVNQRU5EX0ZMQUcgPyAxIDogMDsKKwlpbmZvLT5yZWFkX29ubHkgPSBkbXQtPmRtaS52NC0+ZmxhZ3MgJiBETV9SRUFET05MWV9GTEFHID8gMSA6IDA7CisJaW5mby0+bGl2ZV90YWJsZSA9IGRtdC0+ZG1pLnY0LT5mbGFncyAmIERNX0FDVElWRV9QUkVTRU5UX0ZMQUcgPyAxIDogMDsKKwlpbmZvLT5pbmFjdGl2ZV90YWJsZSA9IGRtdC0+ZG1pLnY0LT5mbGFncyAmIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRyA/CisJICAgIDEgOiAwOworCWluZm8tPmRlZmVycmVkX3JlbW92ZSA9IGRtdC0+ZG1pLnY0LT5mbGFncyAmIERNX0RFRkVSUkVEX1JFTU9WRTsKKwlpbmZvLT5pbnRlcm5hbF9zdXNwZW5kID0gKGRtdC0+ZG1pLnY0LT5mbGFncyAmIERNX0lOVEVSTkFMX1NVU1BFTkRfRkxBRykgPyAxIDogMDsKKwlpbmZvLT50YXJnZXRfY291bnQgPSBkbXQtPmRtaS52NC0+dGFyZ2V0X2NvdW50OworCWluZm8tPm9wZW5fY291bnQgPSBkbXQtPmRtaS52NC0+b3Blbl9jb3VudDsKKwlpbmZvLT5ldmVudF9uciA9IGRtdC0+ZG1pLnY0LT5ldmVudF9ucjsKKwlpbmZvLT5tYWpvciA9IE1BSk9SKGRtdC0+ZG1pLnY0LT5kZXYpOworCWluZm8tPm1pbm9yID0gTUlOT1IoZG10LT5kbWkudjQtPmRldik7CisKKwlyZXR1cm4gMTsKK30KKwordWludDMyX3QgZG1fdGFza19nZXRfcmVhZF9haGVhZChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCAqcmVhZF9haGVhZCkKK3sKKwljb25zdCBjaGFyICpkZXZfbmFtZTsKKworCSpyZWFkX2FoZWFkID0gMDsKKworCWlmICghZG10LT5kbWkudjQgfHwgIShkbXQtPmRtaS52NC0+ZmxhZ3MgJiBETV9FWElTVFNfRkxBRykpCisJCXJldHVybiAwOworCisJaWYgKCpkbXQtPmRtaS52NC0+bmFtZSkKKwkJZGV2X25hbWUgPSBkbXQtPmRtaS52NC0+bmFtZTsKKwllbHNlIGlmICghKGRldl9uYW1lID0gREVWX05BTUUoZG10KSkpIHsKKwkJbG9nX2Vycm9yKCJHZXQgcmVhZCBhaGVhZCByZXF1ZXN0IGZhaWxlZDogZGV2aWNlIG5hbWUgdW5yZWNvcmRlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdldF9kZXZfbm9kZV9yZWFkX2FoZWFkKGRldl9uYW1lLCBNQUpPUihkbXQtPmRtaS52NC0+ZGV2KSwKKwkJCQkgICAgICAgTUlOT1IoZG10LT5kbWkudjQtPmRldiksIHJlYWRfYWhlYWQpOworfQorCitzdHJ1Y3QgZG1fZGVwcyAqZG1fdGFza19nZXRfZGVwcyhzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCXJldHVybiAoc3RydWN0IGRtX2RlcHMgKikgKCgoY2hhciAqKSBkbXQtPmRtaS52NCkgKworCQkJCSAgIGRtdC0+ZG1pLnY0LT5kYXRhX3N0YXJ0KTsKK30KKworc3RydWN0IGRtX25hbWVzICpkbV90YXNrX2dldF9uYW1lcyhzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCXJldHVybiAoc3RydWN0IGRtX25hbWVzICopICgoKGNoYXIgKikgZG10LT5kbWkudjQpICsKKwkJCQkgICAgZG10LT5kbWkudjQtPmRhdGFfc3RhcnQpOworfQorCitzdHJ1Y3QgZG1fdmVyc2lvbnMgKmRtX3Rhc2tfZ2V0X3ZlcnNpb25zKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJcmV0dXJuIChzdHJ1Y3QgZG1fdmVyc2lvbnMgKikgKCgoY2hhciAqKSBkbXQtPmRtaS52NCkgKworCQkJCSAgICAgICBkbXQtPmRtaS52NC0+ZGF0YV9zdGFydCk7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3Rhc2tfZ2V0X21lc3NhZ2VfcmVzcG9uc2Uoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwljb25zdCBjaGFyICpzdGFydCwgKmVuZDsKKworCWlmICghKGRtdC0+ZG1pLnY0LT5mbGFncyAmIERNX0RBVEFfT1VUX0ZMQUcpKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXJ0ID0gKGNvbnN0IGNoYXIgKikgZG10LT5kbWkudjQgKyBkbXQtPmRtaS52NC0+ZGF0YV9zdGFydDsKKwllbmQgPSAoY29uc3QgY2hhciAqKSBkbXQtPmRtaS52NCArIGRtdC0+ZG1pLnY0LT5kYXRhX3NpemU7CisKKwlpZiAoZW5kIDwgc3RhcnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJDb3JydXB0ZWQgbWVzc2FnZSBzdHJ1Y3R1cmUgcmV0dXJuZWQ6IHN0YXJ0ICVkID4gZW5kICVkIiwgKGludClkbXQtPmRtaS52NC0+ZGF0YV9zdGFydCwgKGludClkbXQtPmRtaS52NC0+ZGF0YV9zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFtZW1jaHIoc3RhcnQsIDAsIGVuZCAtIHN0YXJ0KSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1lc3NhZ2UgcmVzcG9uc2UgZG9lc24ndCBjb250YWluIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgZG1fdGFza19zZXRfcm8oc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlkbXQtPnJlYWRfb25seSA9IDE7CisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX3NldF9yZWFkX2FoZWFkKHN0cnVjdCBkbV90YXNrICpkbXQsIHVpbnQzMl90IHJlYWRfYWhlYWQsCisJCQkgICB1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzKQoreworCWRtdC0+cmVhZF9haGVhZCA9IHJlYWRfYWhlYWQ7CisJZG10LT5yZWFkX2FoZWFkX2ZsYWdzID0gcmVhZF9haGVhZF9mbGFnczsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zdXBwcmVzc19pZGVudGljYWxfcmVsb2FkKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJZG10LT5zdXBwcmVzc19pZGVudGljYWxfcmVsb2FkID0gMTsKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2V0X2FkZF9ub2RlKHN0cnVjdCBkbV90YXNrICpkbXQsIGRtX2FkZF9ub2RlX3QgYWRkX25vZGUpCit7CisJc3dpdGNoIChhZGRfbm9kZSkgeworCWNhc2UgRE1fQUREX05PREVfT05fUkVTVU1FOgorCWNhc2UgRE1fQUREX05PREVfT05fQ1JFQVRFOgorCQlkbXQtPmFkZF9ub2RlID0gYWRkX25vZGU7CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiVW5rbm93biBhZGQgbm9kZSBwYXJhbWV0ZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgZG1fdGFza19zZXRfbmV3dXVpZChzdHJ1Y3QgZG1fdGFzayAqZG10LCBjb25zdCBjaGFyICpuZXd1dWlkKQoreworCWRtX3N0cmluZ19tYW5nbGluZ190IG1hbmdsaW5nX21vZGUgPSBkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlKCk7CisJY2hhciBtYW5nbGVkX3V1aWRbRE1fVVVJRF9MRU5dOworCWludCByID0gMDsKKworCWlmIChzdHJsZW4obmV3dXVpZCkgPj0gRE1fVVVJRF9MRU4pIHsKKwkJbG9nX2Vycm9yKCJVdWlkIFwiJXNcIiB0b28gbG9uZyIsIG5ld3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNoZWNrX211bHRpcGxlX21hbmdsZWRfc3RyaW5nX2FsbG93ZWQobmV3dXVpZCwgIm5ldyBVVUlEIiwgbWFuZ2xpbmdfbW9kZSkpCisJCXJldHVybl8wOworCisJaWYgKG1hbmdsaW5nX21vZGUgIT0gRE1fU1RSSU5HX01BTkdMSU5HX05PTkUgJiYKKwkgICAgKHIgPSBtYW5nbGVfc3RyaW5nKG5ld3V1aWQsICJuZXcgVVVJRCIsIHN0cmxlbihuZXd1dWlkKSwgbWFuZ2xlZF91dWlkLAorCQkJICAgICAgIHNpemVvZihtYW5nbGVkX3V1aWQpLCBtYW5nbGluZ19tb2RlKSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIG1hbmdsZSBuZXcgZGV2aWNlIFVVSUQgXCIlc1wiIiwgbmV3dXVpZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJOZXcgZGV2aWNlIHV1aWQgbWFuZ2xlZCBbJXNdOiAlcyAtLT4gJXMiLAorCQkJCSAgICAgbWFuZ2xpbmdfbW9kZSA9PSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTyA/ICJhdXRvIiA6ICJoZXgiLAorCQkJCSAgICAgbmV3dXVpZCwgbWFuZ2xlZF91dWlkKTsKKwkJbmV3dXVpZCA9IG1hbmdsZWRfdXVpZDsKKwl9CisKKwlkbV9mcmVlKGRtdC0+bmV3bmFtZSk7CisJaWYgKCEoZG10LT5uZXduYW1lID0gZG1fc3RyZHVwKG5ld3V1aWQpKSkgeworCQlsb2dfZXJyb3IoImRtX3Rhc2tfc2V0X25ld3V1aWQ6IHN0cmR1cCglcykgZmFpbGVkIiwgbmV3dXVpZCk7CisJCXJldHVybiAwOworCX0KKwlkbXQtPm5ld191dWlkID0gMTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZXRfbWVzc2FnZShzdHJ1Y3QgZG1fdGFzayAqZG10LCBjb25zdCBjaGFyICptZXNzYWdlKQoreworCWRtX2ZyZWUoZG10LT5tZXNzYWdlKTsKKwlpZiAoIShkbXQtPm1lc3NhZ2UgPSBkbV9zdHJkdXAobWVzc2FnZSkpKSB7CisJCWxvZ19lcnJvcigiZG1fdGFza19zZXRfbWVzc2FnZTogc3RyZHVwIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2V0X3NlY3RvcihzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50NjRfdCBzZWN0b3IpCit7CisJZG10LT5zZWN0b3IgPSBzZWN0b3I7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2V0X2dlb21ldHJ5KHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKmN5bGluZGVycywgY29uc3QgY2hhciAqaGVhZHMsCisJCQkgY29uc3QgY2hhciAqc2VjdG9ycywgY29uc3QgY2hhciAqc3RhcnQpCit7CisJZG1fZnJlZShkbXQtPmdlb21ldHJ5KTsKKwlpZiAoZG1fYXNwcmludGYoJihkbXQtPmdlb21ldHJ5KSwgIiVzICVzICVzICVzIiwKKwkJCWN5bGluZGVycywgaGVhZHMsIHNlY3RvcnMsIHN0YXJ0KSA8IDApIHsKKwkJbG9nX2Vycm9yKCJkbV90YXNrX3NldF9nZW9tZXRyeTogc3ByaW50ZiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX25vX2ZsdXNoKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJZG10LT5ub19mbHVzaCA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfbm9fb3Blbl9jb3VudChzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWRtdC0+bm9fb3Blbl9jb3VudCA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2tpcF9sb2NrZnMoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlkbXQtPnNraXBfbG9ja2ZzID0gMTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZWN1cmVfZGF0YShzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWRtdC0+c2VjdXJlX2RhdGEgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX3JldHJ5X3JlbW92ZShzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWRtdC0+cmV0cnlfcmVtb3ZlID0gMTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19kZWZlcnJlZF9yZW1vdmUoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlkbXQtPmRlZmVycmVkX3JlbW92ZSA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlkbXQtPnF1ZXJ5X2luYWN0aXZlX3RhYmxlID0gMTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZXRfZXZlbnRfbnIoc3RydWN0IGRtX3Rhc2sgKmRtdCwgdWludDMyX3QgZXZlbnRfbnIpCit7CisJZG10LT5ldmVudF9uciA9IGV2ZW50X25yOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX3NldF9yZWNvcmRfdGltZXN0YW1wKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJaWYgKCFfZG1faW9jdGxfdGltZXN0YW1wKQorCQlfZG1faW9jdGxfdGltZXN0YW1wID0gZG1fdGltZXN0YW1wX2FsbG9jKCk7CisKKwlpZiAoIV9kbV9pb2N0bF90aW1lc3RhbXApCisJCXJldHVybl8wOworCisJZG10LT5yZWNvcmRfdGltZXN0YW1wID0gMTsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZG1fdGltZXN0YW1wICpkbV90YXNrX2dldF9pb2N0bF90aW1lc3RhbXAoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlyZXR1cm4gZG10LT5yZWNvcmRfdGltZXN0YW1wID8gX2RtX2lvY3RsX3RpbWVzdGFtcCA6IE5VTEw7Cit9CisKK3N0cnVjdCB0YXJnZXQgKmNyZWF0ZV90YXJnZXQodWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbiwgY29uc3QgY2hhciAqdHlwZSwKKwkJCSAgICAgY29uc3QgY2hhciAqcGFyYW1zKQoreworCXN0cnVjdCB0YXJnZXQgKnQ7CisKKwlpZiAoc3RybGVuKHR5cGUpID49IERNX01BWF9UWVBFX05BTUUpIHsKKwkJbG9nX2Vycm9yKCJUYXJnZXQgdHlwZSBuYW1lICVzIGlzIHRvbyBsb25nLiIsIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoISh0ID0gZG1femFsbG9jKHNpemVvZigqdCkpKSkgeworCQlsb2dfZXJyb3IoImNyZWF0ZV90YXJnZXQ6IG1hbGxvYyglIiBQUklzaXplX3QgIikgZmFpbGVkIiwKKwkJCSAgc2l6ZW9mKCp0KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHQtPnBhcmFtcyA9IGRtX3N0cmR1cChwYXJhbXMpKSkgeworCQlsb2dfZXJyb3IoImNyZWF0ZV90YXJnZXQ6IHN0cmR1cChwYXJhbXMpIGZhaWxlZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoISh0LT50eXBlID0gZG1fc3RyZHVwKHR5cGUpKSkgeworCQlsb2dfZXJyb3IoImNyZWF0ZV90YXJnZXQ6IHN0cmR1cCh0eXBlKSBmYWlsZWQiKTsKKwkJZ290byBiYWQ7CisJfQorCisJdC0+c3RhcnQgPSBzdGFydDsKKwl0LT5sZW5ndGggPSBsZW47CisJcmV0dXJuIHQ7CisKKyAgICAgIGJhZDoKKwlfZG1femZyZWVfc3RyaW5nKHQtPnBhcmFtcyk7CisJZG1fZnJlZSh0LT50eXBlKTsKKwlkbV9mcmVlKHQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqX2FkZF90YXJnZXQoc3RydWN0IHRhcmdldCAqdCwgY2hhciAqb3V0LCBjaGFyICplbmQpCit7CisJY2hhciAqb3V0X3NwID0gb3V0OworCXN0cnVjdCBkbV90YXJnZXRfc3BlYyBzcDsKKwlzaXplX3Qgc3Bfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOworCXVuc2lnbmVkIGludCBiYWNrc2xhc2hfY291bnQgPSAwOworCWludCBsZW47CisJY2hhciAqcHQ7CisKKwlpZiAoc3RybGVuKHQtPnR5cGUpID49IHNpemVvZihzcC50YXJnZXRfdHlwZSkpIHsKKwkJbG9nX2Vycm9yKCJUYXJnZXQgdHlwZSBuYW1lICVzIGlzIHRvbyBsb25nLiIsIHQtPnR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcC5zdGF0dXMgPSAwOworCXNwLnNlY3Rvcl9zdGFydCA9IHQtPnN0YXJ0OworCXNwLmxlbmd0aCA9IHQtPmxlbmd0aDsKKwlzdHJuY3B5KHNwLnRhcmdldF90eXBlLCB0LT50eXBlLCBzaXplb2Yoc3AudGFyZ2V0X3R5cGUpIC0gMSk7CisJc3AudGFyZ2V0X3R5cGVbc2l6ZW9mKHNwLnRhcmdldF90eXBlKSAtIDFdID0gJ1wwJzsKKworCW91dCArPSBzcF9zaXplOworCXB0ID0gdC0+cGFyYW1zOworCisJd2hpbGUgKCpwdCkKKwkJaWYgKCpwdCsrID09ICdcXCcpCisJCQliYWNrc2xhc2hfY291bnQrKzsKKwlsZW4gPSBzdHJsZW4odC0+cGFyYW1zKSArIGJhY2tzbGFzaF9jb3VudDsKKworCWlmICgob3V0ID49IGVuZCkgfHwgKG91dCArIGxlbiArIDEpID49IGVuZCkgeworCQlsb2dfZXJyb3IoIlJhbiBvdXQgb2YgbWVtb3J5IGJ1aWxkaW5nIGlvY3RsIHBhcmFtZXRlciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYmFja3NsYXNoX2NvdW50KSB7CisJCS8qIHJlcGxhY2UgIlwiIHdpdGggIlxcIiAqLworCQlwdCA9IHQtPnBhcmFtczsKKwkJZG8geworCQkJaWYgKCpwdCA9PSAnXFwnKQorCQkJCSpvdXQrKyA9ICdcXCc7CisJCQkqb3V0KysgPSAqcHQrKzsKKwkJfSB3aGlsZSAoKnB0KTsKKwkJKm91dCsrID0gJ1wwJzsKKwl9CisJZWxzZSB7CisJCXN0cmNweShvdXQsIHQtPnBhcmFtcyk7CisJCW91dCArPSBsZW4gKyAxOworCX0KKworCS8qIGFsaWduIG5leHQgYmxvY2sgKi8KKwlvdXQgPSBfYWxpZ24ob3V0LCBBTElHTk1FTlQpOworCisJc3AubmV4dCA9IG91dCAtIG91dF9zcDsKKwltZW1jcHkob3V0X3NwLCAmc3AsIHNwX3NpemUpOworCisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGludCBfbG9va3VwX2Rldl9uYW1lKHVpbnQ2NF90IGRldiwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBkbV9uYW1lcyAqbmFtZXM7CisJdW5zaWduZWQgbmV4dCA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlpbnQgciA9IDA7CisgCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0xJU1QpKSkKKwkJcmV0dXJuIDA7CisgCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvIG91dDsKKworCWlmICghKG5hbWVzID0gZG1fdGFza19nZXRfbmFtZXMoZG10KSkpCisJCWdvdG8gb3V0OworIAorCWlmICghbmFtZXMtPmRldikKKwkJZ290byBvdXQ7CisgCisJZG8geworCQluYW1lcyA9IChzdHJ1Y3QgZG1fbmFtZXMgKikoKGNoYXIgKikgbmFtZXMgKyBuZXh0KTsKKwkJaWYgKG5hbWVzLT5kZXYgPT0gZGV2KSB7CisJCQlzdHJuY3B5KGJ1ZiwgbmFtZXMtPm5hbWUsIGxlbik7CisJCQlyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCW5leHQgPSBuYW1lcy0+bmV4dDsKKwl9IHdoaWxlIChuZXh0KTsKKworICAgICAgb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGRtX2lvY3RsICpfZmxhdHRlbihzdHJ1Y3QgZG1fdGFzayAqZG10LCB1bnNpZ25lZCByZXBlYXRfY291bnQpCit7CisJY29uc3Qgc2l6ZV90IG1pbl9zaXplID0gMTYgKiAxMDI0OworCWNvbnN0IGludCAoKnZlcnNpb24pWzNdOworCisJc3RydWN0IGRtX2lvY3RsICpkbWk7CisJc3RydWN0IHRhcmdldCAqdDsKKwlzdHJ1Y3QgZG1fdGFyZ2V0X21zZyAqdG1zZzsKKwlzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCk7CisJY2hhciAqYiwgKmU7CisJaW50IGNvdW50ID0gMDsKKworCWZvciAodCA9IGRtdC0+aGVhZDsgdDsgdCA9IHQtPm5leHQpIHsKKwkJbGVuICs9IHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOworCQlsZW4gKz0gc3RybGVuKHQtPnBhcmFtcykgKyAxICsgQUxJR05NRU5UOworCQljb3VudCsrOworCX0KKworCWlmIChjb3VudCAmJiAoZG10LT5zZWN0b3IgfHwgZG10LT5tZXNzYWdlKSkgeworCQlsb2dfZXJyb3IoInRhcmdldHMgYW5kIG1lc3NhZ2UgYXJlIGluY29tcGF0aWJsZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoY291bnQgJiYgZG10LT5uZXduYW1lKSB7CisJCWxvZ19lcnJvcigidGFyZ2V0cyBhbmQgcmVuYW1lIGFyZSBpbmNvbXBhdGlibGUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNvdW50ICYmIGRtdC0+Z2VvbWV0cnkpIHsKKwkJbG9nX2Vycm9yKCJ0YXJnZXRzIGFuZCBnZW9tZXRyeSBhcmUgaW5jb21wYXRpYmxlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbXQtPm5ld25hbWUgJiYgKGRtdC0+c2VjdG9yIHx8IGRtdC0+bWVzc2FnZSkpIHsKKwkJbG9nX2Vycm9yKCJtZXNzYWdlIGFuZCByZW5hbWUgYXJlIGluY29tcGF0aWJsZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG10LT5uZXduYW1lICYmIGRtdC0+Z2VvbWV0cnkpIHsKKwkJbG9nX2Vycm9yKCJnZW9tZXRyeSBhbmQgcmVuYW1lIGFyZSBpbmNvbXBhdGlibGUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRtdC0+Z2VvbWV0cnkgJiYgKGRtdC0+c2VjdG9yIHx8IGRtdC0+bWVzc2FnZSkpIHsKKwkJbG9nX2Vycm9yKCJnZW9tZXRyeSBhbmQgbWVzc2FnZSBhcmUgaW5jb21wYXRpYmxlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbXQtPnNlY3RvciAmJiAhZG10LT5tZXNzYWdlKSB7CisJCWxvZ19lcnJvcigibWVzc2FnZSBpcyByZXF1aXJlZCB3aXRoIHNlY3RvciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG10LT5uZXduYW1lKQorCQlsZW4gKz0gc3RybGVuKGRtdC0+bmV3bmFtZSkgKyAxOworCisJaWYgKGRtdC0+bWVzc2FnZSkKKwkJbGVuICs9IHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X21zZykgKyBzdHJsZW4oZG10LT5tZXNzYWdlKSArIDE7CisKKwlpZiAoZG10LT5nZW9tZXRyeSkKKwkJbGVuICs9IHN0cmxlbihkbXQtPmdlb21ldHJ5KSArIDE7CisKKwkvKgorCSAqIEdpdmUgbGVuIGEgbWluaW11bSBzaXplIHNvIHRoYXQgd2UgaGF2ZSBzcGFjZSB0byBzdG9yZQorCSAqIGRlcGVuZGVuY2llcyBvciBzdGF0dXMgaW5mb3JtYXRpb24uCisJICovCisJaWYgKGxlbiA8IG1pbl9zaXplKQorCQlsZW4gPSBtaW5fc2l6ZTsKKworCS8qIEluY3JlYXNlIGJ1ZmZlciBzaXplIGlmIHJlcGVhdGluZyBiZWNhdXNlIGJ1ZmZlciB3YXMgdG9vIHNtYWxsICovCisJd2hpbGUgKHJlcGVhdF9jb3VudC0tKQorCQlsZW4gKj0gMjsKKworCWlmICghKGRtaSA9IGRtX21hbGxvYyhsZW4pKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoZG1pLCAwLCBsZW4pOworCisJdmVyc2lvbiA9ICZfY21kX2RhdGFfdjRbZG10LT50eXBlXS52ZXJzaW9uOworCisJZG1pLT52ZXJzaW9uWzBdID0gKCp2ZXJzaW9uKVswXTsKKwlkbWktPnZlcnNpb25bMV0gPSAoKnZlcnNpb24pWzFdOworCWRtaS0+dmVyc2lvblsyXSA9ICgqdmVyc2lvbilbMl07CisKKwlkbWktPmRhdGFfc2l6ZSA9IGxlbjsKKwlkbWktPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKKworCWlmIChkbXQtPm1pbm9yID49IDApIHsKKwkJaWYgKGRtdC0+bWFqb3IgPD0gMCkgeworCQkJbG9nX2Vycm9yKCJNaXNzaW5nIG1ham9yIG51bWJlciBmb3IgcGVyc2lzdGVudCBkZXZpY2UuIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmICghX2RtX211bHRpcGxlX21ham9yX3N1cHBvcnQgJiYgZG10LT5hbGxvd19kZWZhdWx0X21ham9yX2ZhbGxiYWNrICYmCisJCSAgICBkbXQtPm1ham9yICE9IChpbnQpIF9kbV9kZXZpY2VfbWFqb3IpIHsKKwkJCWxvZ192ZXJib3NlKCJPdmVycmlkaW5nIG1ham9yIG51bWJlciBvZiAlZCAiCisJCQkJICAgICJ3aXRoICV1IGZvciBwZXJzaXN0ZW50IGRldmljZS4iLAorCQkJCSAgICBkbXQtPm1ham9yLCBfZG1fZGV2aWNlX21ham9yKTsKKwkJCWRtdC0+bWFqb3IgPSBfZG1fZGV2aWNlX21ham9yOworCQl9CisKKwkJZG1pLT5mbGFncyB8PSBETV9QRVJTSVNURU5UX0RFVl9GTEFHOworCQlkbWktPmRldiA9IE1LREVWKChkZXZfdClkbXQtPm1ham9yLCAoZGV2X3QpZG10LT5taW5vcik7CisJfQorCisJLyogRG9lcyBkcml2ZXIgc3VwcG9ydCBkZXZpY2UgbnVtYmVyIHJlZmVyZW5jaW5nPyAqLworCWlmIChfZG1fdmVyc2lvbl9taW5vciA8IDMgJiYgIURFVl9OQU1FKGRtdCkgJiYgIURFVl9VVUlEKGRtdCkgJiYgZG1pLT5kZXYpIHsKKwkJaWYgKCFfbG9va3VwX2Rldl9uYW1lKGRtaS0+ZGV2LCBkbWktPm5hbWUsIHNpemVvZihkbWktPm5hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZmluZCBuYW1lIGZvciBkZXZpY2UgKCUiIFBSSXUzMgorCQkJCSAgIjolIiBQUkl1MzIgIikiLCBkbXQtPm1ham9yLCBkbXQtPm1pbm9yKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWxvZ192ZXJib3NlKCJkZXZpY2UgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSBpcyAlcyAiCisJCQkgICAgImZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGtlcm5lbCIsCisJCQkgICAgZG10LT5tYWpvciwgZG10LT5taW5vciwgZG1pLT5uYW1lKTsKKwl9CisKKwkvKiBGSVhNRSBVbnRpbCByZXN1bWUgaW9jdGwgc3VwcGxpZXMgbmFtZSwgdXNlIGRldl9uYW1lIGZvciByZWFkYWhlYWQgKi8KKwlpZiAoREVWX05BTUUoZG10KSAmJiAoZG10LT50eXBlICE9IERNX0RFVklDRV9SRVNVTUUgfHwgZG10LT5taW5vciA8IDAgfHwKKwkJCSAgICAgIGRtdC0+bWFqb3IgPCAwKSkKKwkJc3RybmNweShkbWktPm5hbWUsIERFVl9OQU1FKGRtdCksIHNpemVvZihkbWktPm5hbWUpKTsKKworCWlmIChERVZfVVVJRChkbXQpKQorCQlzdHJuY3B5KGRtaS0+dXVpZCwgREVWX1VVSUQoZG10KSwgc2l6ZW9mKGRtaS0+dXVpZCkpOworCisJaWYgKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfU1VTUEVORCkKKwkJZG1pLT5mbGFncyB8PSBETV9TVVNQRU5EX0ZMQUc7CisJaWYgKGRtdC0+bm9fZmx1c2gpIHsKKwkJaWYgKF9kbV92ZXJzaW9uX21pbm9yIDwgMTIpCisJCQlsb2dfdmVyYm9zZSgiTm8gZmx1c2ggZmxhZyB1bnN1cHBvcnRlZCBieSBrZXJuZWwuICIKKwkJCQkgICAgIkJ1ZmZlcnMgd2lsbCBiZSBmbHVzaGVkLiIpOworCQllbHNlCisJCQlkbWktPmZsYWdzIHw9IERNX05PRkxVU0hfRkxBRzsKKwl9CisJaWYgKGRtdC0+cmVhZF9vbmx5KQorCQlkbWktPmZsYWdzIHw9IERNX1JFQURPTkxZX0ZMQUc7CisJaWYgKGRtdC0+c2tpcF9sb2NrZnMpCisJCWRtaS0+ZmxhZ3MgfD0gRE1fU0tJUF9MT0NLRlNfRkxBRzsKKwlpZiAoZG10LT5kZWZlcnJlZF9yZW1vdmUgJiYgKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVNT1ZFIHx8IGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVNT1ZFX0FMTCkpCisJCWRtaS0+ZmxhZ3MgfD0gRE1fREVGRVJSRURfUkVNT1ZFOworCisJaWYgKGRtdC0+c2VjdXJlX2RhdGEpIHsKKwkJaWYgKF9kbV92ZXJzaW9uX21pbm9yIDwgMjApCisJCQlsb2dfdmVyYm9zZSgiU2VjdXJlIGRhdGEgZmxhZyB1bnN1cHBvcnRlZCBieSBrZXJuZWwuICIKKwkJCQkgICAgIkJ1ZmZlcnMgd2lsbCBub3QgYmUgd2lwZWQgYWZ0ZXIgdXNlLiIpOworCQlkbWktPmZsYWdzIHw9IERNX1NFQ1VSRV9EQVRBX0ZMQUc7CisJfQorCWlmIChkbXQtPnF1ZXJ5X2luYWN0aXZlX3RhYmxlKSB7CisJCWlmICghZG1faW5hY3RpdmVfc3VwcG9ydGVkKCkpCisJCQlsb2dfd2FybigiV0FSTklORzogSW5hY3RpdmUgdGFibGUgcXVlcnkgdW5zdXBwb3J0ZWQgIgorCQkJCSAiYnkga2VybmVsLiAgSXQgd2lsbCB1c2UgbGl2ZSB0YWJsZS4iKTsKKwkJZG1pLT5mbGFncyB8PSBETV9RVUVSWV9JTkFDVElWRV9UQUJMRV9GTEFHOworCX0KKwlpZiAoZG10LT5uZXdfdXVpZCkgeworCQlpZiAoX2RtX3ZlcnNpb25fbWlub3IgPCAxOSkgeworCQkJbG9nX2Vycm9yKCJXQVJOSU5HOiBTZXR0aW5nIFVVSUQgdW5zdXBwb3J0ZWQgYnkgIgorCQkJCSAgImtlcm5lbC4gIEFib3J0aW5nIG9wZXJhdGlvbi4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWRtaS0+ZmxhZ3MgfD0gRE1fVVVJRF9GTEFHOworCX0KKworCWRtaS0+dGFyZ2V0X2NvdW50ID0gY291bnQ7CisJZG1pLT5ldmVudF9uciA9IGRtdC0+ZXZlbnRfbnI7CisKKwliID0gKGNoYXIgKikgKGRtaSArIDEpOworCWUgPSAoY2hhciAqKSBkbWkgKyBsZW47CisKKwlmb3IgKHQgPSBkbXQtPmhlYWQ7IHQ7IHQgPSB0LT5uZXh0KQorCQlpZiAoIShiID0gX2FkZF90YXJnZXQodCwgYiwgZSkpKQorCQkJZ290b19iYWQ7CisKKwlpZiAoZG10LT5uZXduYW1lKQorCQlzdHJjcHkoYiwgZG10LT5uZXduYW1lKTsKKworCWlmIChkbXQtPm1lc3NhZ2UpIHsKKwkJdG1zZyA9IChzdHJ1Y3QgZG1fdGFyZ2V0X21zZyAqKSBiOworCQl0bXNnLT5zZWN0b3IgPSBkbXQtPnNlY3RvcjsKKwkJc3RyY3B5KHRtc2ctPm1lc3NhZ2UsIGRtdC0+bWVzc2FnZSk7CisJfQorCisJaWYgKGRtdC0+Z2VvbWV0cnkpCisJCXN0cmNweShiLCBkbXQtPmdlb21ldHJ5KTsKKworCXJldHVybiBkbWk7CisKKyAgICAgIGJhZDoKKwlfZG1femZyZWVfZG1pKGRtaSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfbWFwcGVyX2RpcihzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwlESVIgKmQ7CisJY29uc3QgY2hhciAqZGlyOworCWludCByID0gMTsKKworCWRpciA9IGRtX2RpcigpOworCWlmICghKGQgPSBvcGVuZGlyKGRpcikpKSB7CisJCWxvZ19zeXNfZXJyb3IoIm9wZW5kaXIiLCBkaXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZCkpKSB7CisJCWlmICghc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLiIpIHx8CisJCSAgICAhc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLi4iKSB8fAorCQkgICAgIXN0cmNtcChkaXJlbnQtPmRfbmFtZSwgImNvbnRyb2wiKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWRtX3Rhc2tfc2V0X25hbWUoZG10LCBkaXJlbnQtPmRfbmFtZSkpIHsKKwkJCXIgPSAwOworCQkJc3RhY2s7CisJCQljb250aW51ZTsgLyogdHJ5IG5leHQgbmFtZSAqLworCQl9CisJCWlmICghZG1fdGFza19ydW4oZG10KSkgeworCQkJciA9IDA7CisJCQlzdGFjazsgIC8qIGtlZXAgZ29pbmcgKi8KKwkJfQorCX0KKworCWlmIChjbG9zZWRpcihkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2VkaXIiLCBkaXIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfYWxsX3Y0KHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJc3RydWN0IGRtX3Rhc2sgKnRhc2s7CisJc3RydWN0IGRtX25hbWVzICpuYW1lczsKKwl1bnNpZ25lZCBuZXh0ID0gMDsKKwlpbnQgciA9IDE7CisKKwlpZiAoISh0YXNrID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0xJU1QpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKHRhc2spKSB7CisJCXIgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShuYW1lcyA9IGRtX3Rhc2tfZ2V0X25hbWVzKHRhc2spKSkgeworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFuYW1lcy0+ZGV2KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJbmFtZXMgPSAoc3RydWN0IGRtX25hbWVzICopKChjaGFyICopIG5hbWVzICsgbmV4dCk7CisJCWlmICghZG1fdGFza19zZXRfbmFtZShkbXQsIG5hbWVzLT5uYW1lKSkgeworCQkJciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpCisJCQlyID0gMDsKKwkJbmV4dCA9IG5hbWVzLT5uZXh0OworCX0gd2hpbGUgKG5leHQpOworCisgICAgICBvdXQ6CisJZG1fdGFza19kZXN0cm95KHRhc2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9ta25vZGVzX3Y0KHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJKHZvaWQpIF9wcm9jZXNzX21hcHBlcl9kaXIoZG10KTsKKworCXJldHVybiBfcHJvY2Vzc19hbGxfdjQoZG10KTsKK30KKworLyoKKyAqIElmIGFuIG9wZXJhdGlvbiB0aGF0IHVzZXMgYSBjb29raWUgZmFpbHMsIGRlY3JlbWVudCB0aGUKKyAqIHNlbWFwaG9yZSBpbnN0ZWFkIG9mIHVkZXYuCisgKi8KK3N0YXRpYyBpbnQgX3VkZXZfY29tcGxldGUoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwl1aW50MTZfdCBiYXNlOworCisJaWYgKGRtdC0+Y29va2llX3NldCAmJgorCSAgICAoYmFzZSA9IGRtdC0+ZXZlbnRfbnIgJiB+RE1fVURFVl9GTEFHU19NQVNLKSkKKwkJLyogc3RyaXAgZmxhZ3MgZnJvbSB0aGUgY29va2llIGFuZCB1c2UgY29va2llIG1hZ2ljIGluc3RlYWQgKi8KKwkJcmV0dXJuIGRtX3VkZXZfY29tcGxldGUoYmFzZSB8IChETV9DT09LSUVfTUFHSUMgPDwKKwkJCQkJCURNX1VERVZfRkxBR1NfU0hJRlQpKTsKKworCXJldHVybiAxOworfQorCisjaWZkZWYgRE1fSU9DVExTCitzdGF0aWMgaW50IF9jaGVja191ZXZlbnRfZ2VuZXJhdGVkKHN0cnVjdCBkbV9pb2N0bCAqZG1pKQoreworCWlmICghZG1fY2hlY2tfdmVyc2lvbigpIHx8CisJICAgIF9kbV92ZXJzaW9uIDwgNCB8fAorCSAgICBfZG1fdmVyc2lvbl9taW5vciA8IDE3KQorCQkvKiBjYW4ndCBjaGVjaywgYXNzdW1lIHVldmVudCBpcyBnZW5lcmF0ZWQgKi8KKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gZG1pLT5mbGFncyAmIERNX1VFVkVOVF9HRU5FUkFURURfRkxBRzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9jcmVhdGVfYW5kX2xvYWRfdjQoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqdGFzazsKKwlpbnQgcjsKKwl1aW50MzJfdCBjb29raWU7CisKKwkvKiBVc2UgbmV3IHRhc2sgc3RydWN0IHRvIGNyZWF0ZSB0aGUgZGV2aWNlICovCisJaWYgKCEodGFzayA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9DUkVBVEUpKSkgeworCQlfdWRldl9jb21wbGV0ZShkbXQpOworCQlyZXR1cm5fMDsKKwl9CisKKwkvKiBDb3B5IGFjcm9zcyByZWxldmFudCBmaWVsZHMgKi8KKwlpZiAoZG10LT5kZXZfbmFtZSAmJiAhZG1fdGFza19zZXRfbmFtZSh0YXNrLCBkbXQtPmRldl9uYW1lKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoZG10LT51dWlkICYmICFkbV90YXNrX3NldF91dWlkKHRhc2ssIGRtdC0+dXVpZCkpCisJCWdvdG9fYmFkOworCisJdGFzay0+bWFqb3IgPSBkbXQtPm1ham9yOworCXRhc2stPm1pbm9yID0gZG10LT5taW5vcjsKKwl0YXNrLT51aWQgPSBkbXQtPnVpZDsKKwl0YXNrLT5naWQgPSBkbXQtPmdpZDsKKwl0YXNrLT5tb2RlID0gZG10LT5tb2RlOworCS8qIEZJWE1FOiBKdXN0IGZvciB1ZGV2X2NoZWNrIGluIGRtX3Rhc2tfcnVuLiBDYW4gd2UgYXZvaWQgdGhpcz8gKi8KKwl0YXNrLT5ldmVudF9uciA9IGRtdC0+ZXZlbnRfbnIgJiBETV9VREVWX0ZMQUdTX01BU0s7CisJdGFzay0+Y29va2llX3NldCA9IGRtdC0+Y29va2llX3NldDsKKwl0YXNrLT5hZGRfbm9kZSA9IGRtdC0+YWRkX25vZGU7CisKKwlpZiAoIWRtX3Rhc2tfcnVuKHRhc2spKQorCQlnb3RvX2JhZDsKKworCWRtX3Rhc2tfZGVzdHJveSh0YXNrKTsKKworCS8qIE5leHQgbG9hZCB0aGUgdGFibGUgKi8KKwlpZiAoISh0YXNrID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1JFTE9BRCkpKSB7CisJCXN0YWNrOworCQlfdWRldl9jb21wbGV0ZShkbXQpOworCQlnb3RvIHJldmVydDsKKwl9CisKKwkvKiBDb3B5IGFjcm9zcyByZWxldmFudCBmaWVsZHMgKi8KKwlpZiAoZG10LT5kZXZfbmFtZSAmJiAhZG1fdGFza19zZXRfbmFtZSh0YXNrLCBkbXQtPmRldl9uYW1lKSkgeworCQlzdGFjazsKKwkJZG1fdGFza19kZXN0cm95KHRhc2spOworCQlfdWRldl9jb21wbGV0ZShkbXQpOworCQlnb3RvIHJldmVydDsKKwl9CisKKwl0YXNrLT5yZWFkX29ubHkgPSBkbXQtPnJlYWRfb25seTsKKwl0YXNrLT5oZWFkID0gZG10LT5oZWFkOworCXRhc2stPnRhaWwgPSBkbXQtPnRhaWw7CisJdGFzay0+c2VjdXJlX2RhdGEgPSBkbXQtPnNlY3VyZV9kYXRhOworCisJciA9IGRtX3Rhc2tfcnVuKHRhc2spOworCisJdGFzay0+aGVhZCA9IE5VTEw7CisJdGFzay0+dGFpbCA9IE5VTEw7CisJZG1fdGFza19kZXN0cm95KHRhc2spOworCisJaWYgKCFyKSB7CisJCXN0YWNrOworCQlfdWRldl9jb21wbGV0ZShkbXQpOworCQlnb3RvIHJldmVydDsKKwl9CisKKwkvKiBVc2UgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZSBsYXN0IHNvIHRoZSBpbmZvIHdpbGwgYmUgY29ycmVjdCAqLworCWRtdC0+dHlwZSA9IERNX0RFVklDRV9SRVNVTUU7CisJZG1fZnJlZShkbXQtPnV1aWQpOworCWRtdC0+dXVpZCA9IE5VTEw7CisJZG1fZnJlZShkbXQtPm1hbmdsZWRfdXVpZCk7CisJZG10LT5tYW5nbGVkX3V1aWQgPSBOVUxMOworCisJaWYgKGRtX3Rhc2tfcnVuKGRtdCkpCisJCXJldHVybiAxOworCisgICAgICByZXZlcnQ6CisJZG10LT50eXBlID0gRE1fREVWSUNFX1JFTU9WRTsKKwlkbV9mcmVlKGRtdC0+dXVpZCk7CisJZG10LT51dWlkID0gTlVMTDsKKwlkbV9mcmVlKGRtdC0+bWFuZ2xlZF91dWlkKTsKKwlkbXQtPm1hbmdsZWRfdXVpZCA9IE5VTEw7CisKKwkvKgorCSAqIEFsc28gdWRldi1zeW5jaHJvbml6ZSAicmVtb3ZlIiBkbSB0YXNrIHRoYXQgaXMgYSBwYXJ0IG9mIHRoaXMgcmV2ZXJ0IQorCSAqIEJ1dCBvbmx5IGlmIHRoZSBvcmlnaW5hbCBkbSB0YXNrIHdhcyBzdXBwb3NlZCB0byBiZSBzeW5jaHJvbml6ZWQuCisJICovCisJaWYgKGRtdC0+Y29va2llX3NldCkgeworCQljb29raWUgPSAoZG10LT5ldmVudF9uciAmIH5ETV9VREVWX0ZMQUdTX01BU0spIHwKKwkJCSAoRE1fQ09PS0lFX01BR0lDIDw8IERNX1VERVZfRkxBR1NfU0hJRlQpOworCQlpZiAoIWRtX3Rhc2tfc2V0X2Nvb2tpZShkbXQsICZjb29raWUsCisJCQkJCShkbXQtPmV2ZW50X25yICYgRE1fVURFVl9GTEFHU19NQVNLKSA+PgorCQkJCQlETV9VREVWX0ZMQUdTX1NISUZUKSkKKwkJCXN0YWNrOyAvKiBrZWVwIGdvaW5nICovCisJfQorCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byByZXZlcnQgZGV2aWNlIGNyZWF0aW9uLiIpOworCisJcmV0dXJuIDA7CisKKyAgICAgIGJhZDoKKwlkbV90YXNrX2Rlc3Ryb3kodGFzayk7CisJX3VkZXZfY29tcGxldGUoZG10KTsKKworCXJldHVybiAwOworfQorCit1aW50NjRfdCBkbV90YXNrX2dldF9leGlzdGluZ190YWJsZV9zaXplKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJcmV0dXJuIGRtdC0+ZXhpc3RpbmdfdGFibGVfc2l6ZTsKK30KKworc3RhdGljIGludCBfcmVsb2FkX3dpdGhfc3VwcHJlc3Npb25fdjQoc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqdGFzazsKKwlzdHJ1Y3QgdGFyZ2V0ICp0MSwgKnQyOworCXNpemVfdCBsZW47CisJaW50IHI7CisKKwkvKiBOZXcgdGFzayB0byBnZXQgZXhpc3RpbmcgdGFibGUgaW5mb3JtYXRpb24gKi8KKwlpZiAoISh0YXNrID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1RBQkxFKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGRldmljZS1tYXBwZXIgdGFzayBzdHJ1Y3QiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29weSBhY3Jvc3MgcmVsZXZhbnQgZmllbGRzICovCisJaWYgKGRtdC0+ZGV2X25hbWUgJiYgIWRtX3Rhc2tfc2V0X25hbWUodGFzaywgZG10LT5kZXZfbmFtZSkpIHsKKwkJZG1fdGFza19kZXN0cm95KHRhc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG10LT51dWlkICYmICFkbV90YXNrX3NldF91dWlkKHRhc2ssIGRtdC0+dXVpZCkpIHsKKwkJZG1fdGFza19kZXN0cm95KHRhc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwl0YXNrLT5tYWpvciA9IGRtdC0+bWFqb3I7CisJdGFzay0+bWlub3IgPSBkbXQtPm1pbm9yOworCisJciA9IGRtX3Rhc2tfcnVuKHRhc2spOworCisJaWYgKCFyKSB7CisJCWRtX3Rhc2tfZGVzdHJveSh0YXNrKTsKKwkJcmV0dXJuIHI7CisJfQorCisJLyogU3RvcmUgZXhpc3RpbmcgdGFibGUgc2l6ZSAqLworCXQyID0gdGFzay0+aGVhZDsKKwl3aGlsZSAodDIgJiYgdDItPm5leHQpCisJCXQyID0gdDItPm5leHQ7CisJZG10LT5leGlzdGluZ190YWJsZV9zaXplID0gdDIgPyB0Mi0+c3RhcnQgKyB0Mi0+bGVuZ3RoIDogMDsKKworCWlmICgoKHRhc2stPmRtaS52NC0+ZmxhZ3MgJiBETV9SRUFET05MWV9GTEFHKSA/IDEgOiAwKSAhPSBkbXQtPnJlYWRfb25seSkKKwkJZ290byBub19tYXRjaDsKKworCXQxID0gZG10LT5oZWFkOworCXQyID0gdGFzay0+aGVhZDsKKworCXdoaWxlICh0MSAmJiB0MikgeworCQlsZW4gPSBzdHJsZW4odDItPnBhcmFtcyk7CisJCXdoaWxlIChsZW4tLSA+IDAgJiYgdDItPnBhcmFtc1tsZW5dID09ICcgJykKKwkJCXQyLT5wYXJhbXNbbGVuXSA9ICdcMCc7CisJCWlmICgodDEtPnN0YXJ0ICE9IHQyLT5zdGFydCkgfHwKKwkJICAgICh0MS0+bGVuZ3RoICE9IHQyLT5sZW5ndGgpIHx8CisJCSAgICAoc3RyY21wKHQxLT50eXBlLCB0Mi0+dHlwZSkpIHx8CisJCSAgICAoc3RyY21wKHQxLT5wYXJhbXMsIHQyLT5wYXJhbXMpKSkKKwkJCWdvdG8gbm9fbWF0Y2g7CisJCXQxID0gdDEtPm5leHQ7CisJCXQyID0gdDItPm5leHQ7CisJfQorCQorCWlmICghdDEgJiYgIXQyKSB7CisJCWRtdC0+ZG1pLnY0ID0gdGFzay0+ZG1pLnY0OworCQl0YXNrLT5kbWkudjQgPSBOVUxMOworCQlkbV90YXNrX2Rlc3Ryb3kodGFzayk7CisJCXJldHVybiAxOworCX0KKworbm9fbWF0Y2g6CisJZG1fdGFza19kZXN0cm95KHRhc2spOworCisJLyogTm93IGRvIHRoZSBvcmlnaW5hbCByZWxvYWQgKi8KKwlkbXQtPnN1cHByZXNzX2lkZW50aWNhbF9yZWxvYWQgPSAwOworCXIgPSBkbV90YXNrX3J1bihkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX2NoaWxkcmVuX25vdF9zdXNwZW5kZWRfdjQoc3RydWN0IGRtX3Rhc2sgKmRtdCwgdWludDY0X3QgZGV2aWNlKQoreworCXN0cnVjdCBkbV90YXNrICp0YXNrOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJc3RydWN0IGRtX2RlcHMgKmRlcHM7CisJaW50IHIgPSAwOworCXVpbnQzMl90IGk7CisKKwkvKiBGaW5kIGRlcGVuZGVuY2llcyAqLworCWlmICghKHRhc2sgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfREVQUykpKQorCQlyZXR1cm4gMDsKKworCS8qIENvcHkgYWNyb3NzIG9yIHNldCByZWxldmFudCBmaWVsZHMgKi8KKwlpZiAoZGV2aWNlKSB7CisJCXRhc2stPm1ham9yID0gTUFKT1IoZGV2aWNlKTsKKwkJdGFzay0+bWlub3IgPSBNSU5PUihkZXZpY2UpOworCX0gZWxzZSB7CisJCWlmIChkbXQtPmRldl9uYW1lICYmICFkbV90YXNrX3NldF9uYW1lKHRhc2ssIGRtdC0+ZGV2X25hbWUpKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGRtdC0+dXVpZCAmJiAhZG1fdGFza19zZXRfdXVpZCh0YXNrLCBkbXQtPnV1aWQpKQorCQkJZ290byBvdXQ7CisKKwkJdGFzay0+bWFqb3IgPSBkbXQtPm1ham9yOworCQl0YXNrLT5taW5vciA9IGRtdC0+bWlub3I7CisJfQorCisJdGFzay0+dWlkID0gZG10LT51aWQ7CisJdGFzay0+Z2lkID0gZG10LT5naWQ7CisJdGFzay0+bW9kZSA9IGRtdC0+bW9kZTsKKwkvKiBGSVhNRTogSnVzdCBmb3IgdWRldl9jaGVjayBpbiBkbV90YXNrX3J1bi4gQ2FuIHdlIGF2b2lkIHRoaXM/ICovCisJdGFzay0+ZXZlbnRfbnIgPSBkbXQtPmV2ZW50X25yICYgRE1fVURFVl9GTEFHU19NQVNLOworCXRhc2stPmNvb2tpZV9zZXQgPSBkbXQtPmNvb2tpZV9zZXQ7CisJdGFzay0+YWRkX25vZGUgPSBkbXQtPmFkZF9ub2RlOworCQorCWlmICghKHIgPSBkbV90YXNrX3J1bih0YXNrKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKHRhc2ssICZpbmZvKSB8fCAhaW5mby5leGlzdHMpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBXYXJuIGlmIGFueSBvZiB0aGUgZGV2aWNlcyB0aGlzIGRldmljZSBkZXBlbmRzIHVwb24gYXJlIGFscmVhZHkKKwkgKiBzdXNwZW5kZWQ6IEkvTyBjb3VsZCBiZWNvbWUgdHJhcHBlZCBiZXR3ZWVuIHRoZSB0d28gZGV2aWNlcy4KKwkgKi8KKwlpZiAoaW5mby5zdXNwZW5kZWQpIHsKKwkJaWYgKCFkZXZpY2UpCisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiQXR0ZW1wdGluZyB0byBzdXNwZW5kIGEgZGV2aWNlIHRoYXQgaXMgYWxyZWFkeSBzdXNwZW5kZWQgIgorCQkJCQkgICAgICIoJXU6JXUpIiwgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisJCWVsc2UKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byBzdXNwZW5kIGRldmljZSAlcyVzJXMlLjBkJXMlLjBkJXMlcyIKKwkJCQkgICJ0aGF0IHVzZXMgYWxyZWFkeS1zdXNwZW5kZWQgZGV2aWNlICgldToldSkiLCAKKwkJCQkgIERFVl9OQU1FKGRtdCkgPyA6ICIiLCBERVZfVVVJRChkbXQpID8gOiAiIiwKKwkJCQkgIGRtdC0+bWFqb3IgPiAwID8gIigiIDogIiIsCisJCQkJICBkbXQtPm1ham9yID4gMCA/IGRtdC0+bWFqb3IgOiAwLAorCQkJCSAgZG10LT5tYWpvciA+IDAgPyAiOiIgOiAiIiwKKwkJCQkgIGRtdC0+bWlub3IgPiAwID8gZG10LT5taW5vciA6IDAsCisJCQkJICBkbXQtPm1ham9yID4gMCAmJiBkbXQtPm1pbm9yID09IDAgPyAiMCIgOiAiIiwKKwkJCQkgIGRtdC0+bWFqb3IgPiAwID8gIikgIiA6ICIiLAorCQkJCSAgaW5mby5tYWpvciwgaW5mby5taW5vcik7CisKKwkJLyogTm8gbmVlZCBmb3IgZnVydGhlciByZWN1cnNpb24gKi8KKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKGRlcHMgPSBkbV90YXNrX2dldF9kZXBzKHRhc2spKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVwcy0+Y291bnQ7IGkrKykgeworCQkvKiBPbmx5IHJlY3Vyc2Ugd2l0aCBkbSBkZXZpY2VzICovCisJCWlmIChNQUpPUihkZXBzLT5kZXZpY2VbaV0pICE9IF9kbV9kZXZpY2VfbWFqb3IpCisJCQljb250aW51ZTsKKworCQlpZiAoIV9jaGVja19jaGlsZHJlbl9ub3Rfc3VzcGVuZGVkX3Y0KHRhc2ssIGRlcHMtPmRldmljZVtpXSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyID0gMTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveSh0YXNrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zdXNwZW5kX3dpdGhfdmFsaWRhdGlvbl92NChzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCS8qIEF2b2lkIHJlY3Vyc2lvbiAqLworCWRtdC0+ZW5hYmxlX2NoZWNrcyA9IDA7CisKKwkvKgorCSAqIEVuc3VyZSB3ZSBjYW4ndCBsZWF2ZSBhbnkgSS9PIHRyYXBwZWQgYmV0d2VlbiBzdXNwZW5kZWQgZGV2aWNlcy4KKwkgKi8KKwlpZiAoIV9jaGVja19jaGlsZHJlbl9ub3Rfc3VzcGVuZGVkX3Y0KGRtdCwgMCkpCisJCXJldHVybiAwOworCisJLyogRmluYWxseSwgcGVyZm9ybSB0aGUgb3JpZ2luYWwgc3VzcGVuZC4gKi8KKwlyZXR1cm4gZG1fdGFza19ydW4oZG10KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9zYW5pdGlzZV9tZXNzYWdlKGNoYXIgKm1lc3NhZ2UpCit7CisJY29uc3QgY2hhciAqc2FuaXRpc2VkX21lc3NhZ2UgPSBtZXNzYWdlID86ICIiOworCisJLyogRklYTUU6IENoZWNrIGZvciB3aGl0ZXNwYWNlIHZhcmlhdGlvbnMuICovCisJLyogVGhpcyB0cmFwcyB3aGF0IGNyeXB0c2V0dXAgc2VuZHMgdXMuICovCisJaWYgKG1lc3NhZ2UgJiYgIXN0cm5jYXNlY21wKG1lc3NhZ2UsICJrZXkgc2V0IiwgNykpCisJCXNhbml0aXNlZF9tZXNzYWdlID0gImtleSBzZXQiOworCisJcmV0dXJuIHNhbml0aXNlZF9tZXNzYWdlOworfQorCisjaWZkZWYgRE1fSU9DVExTCitzdGF0aWMgaW50IF9kb19kbV9pb2N0bF91bm1hbmdsZV9zdHJpbmcoY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdHJfbmFtZSwKKwkJCQkJY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsCisJCQkJCWRtX3N0cmluZ19tYW5nbGluZ190IG1vZGUpCit7CisJaW50IHI7CisKKwlpZiAobW9kZSA9PSBETV9TVFJJTkdfTUFOR0xJTkdfTk9ORSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWNoZWNrX211bHRpcGxlX21hbmdsZWRfc3RyaW5nX2FsbG93ZWQoc3RyLCBzdHJfbmFtZSwgbW9kZSkpCisJCXJldHVybl8wOworCisJaWYgKChyID0gdW5tYW5nbGVfc3RyaW5nKHN0ciwgc3RyX25hbWUsIHN0cmxlbihzdHIpLCBidWYsIGJ1Zl9zaXplLCBtb2RlKSkgPCAwKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJfZG9fZG1faW9jdGxfdW5tYW5nbGVfc3RyaW5nOiBmYWlsZWQgdG8gIgorCQkJCSAgICAgInVubWFuZ2xlICVzIFwiJXNcIiIsIHN0cl9uYW1lLCBzdHIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHIpCisJCW1lbWNweShzdHIsIGJ1Ziwgc3RybGVuKGJ1ZikgKyAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9pb2N0bF91bm1hbmdsZV9uYW1lcyhpbnQgdHlwZSwgc3RydWN0IGRtX2lvY3RsICpkbWkpCit7CisJY2hhciBidWZbRE1fTkFNRV9MRU5dOworCXN0cnVjdCBkbV9uYW1lcyAqbmFtZXM7CisJdW5zaWduZWQgbmV4dCA9IDA7CisJY2hhciAqbmFtZTsKKwlpbnQgciA9IDE7CisKKwlpZiAoKG5hbWUgPSBkbWktPm5hbWUpKQorCQlyID0gX2RvX2RtX2lvY3RsX3VubWFuZ2xlX3N0cmluZyhuYW1lLCAibmFtZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCQkgZG1fZ2V0X25hbWVfbWFuZ2xpbmdfbW9kZSgpKTsKKworCWlmICh0eXBlID09IERNX0RFVklDRV9MSVNUICYmCisJICAgICgobmFtZXMgPSAoKHN0cnVjdCBkbV9uYW1lcyAqKSAoKGNoYXIgKilkbWkgKyBkbWktPmRhdGFfc3RhcnQpKSkpICYmCisJICAgIG5hbWVzLT5kZXYpIHsKKwkJZG8geworCQkJbmFtZXMgPSAoc3RydWN0IGRtX25hbWVzICopKChjaGFyICopIG5hbWVzICsgbmV4dCk7CisJCQlyID0gX2RvX2RtX2lvY3RsX3VubWFuZ2xlX3N0cmluZyhuYW1lcy0+bmFtZSwgIm5hbWUiLAorCQkJCQkJCSBidWYsIHNpemVvZihidWYpLAorCQkJCQkJCSBkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlKCkpOworCQkJbmV4dCA9IG5hbWVzLT5uZXh0OworCQl9IHdoaWxlIChuZXh0KTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZG1faW9jdGxfdW5tYW5nbGVfdXVpZHMoaW50IHR5cGUsIHN0cnVjdCBkbV9pb2N0bCAqZG1pKQoreworCWNoYXIgYnVmW0RNX1VVSURfTEVOXTsKKwljaGFyICp1dWlkID0gZG1pLT51dWlkOworCisJaWYgKHV1aWQpCisJCXJldHVybiBfZG9fZG1faW9jdGxfdW5tYW5nbGVfc3RyaW5nKHV1aWQsICJVVUlEIiwgYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkJCSAgICBkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlKCkpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkbV9pb2N0bCAqX2RvX2RtX2lvY3RsKHN0cnVjdCBkbV90YXNrICpkbXQsIHVuc2lnbmVkIGNvbW1hbmQsCisJCQkJICAgICB1bnNpZ25lZCBidWZmZXJfcmVwZWF0X2NvdW50LAorCQkJCSAgICAgdW5zaWduZWQgcmV0cnlfcmVwZWF0X2NvdW50LAorCQkJCSAgICAgaW50ICpyZXRyeWFibGUpCit7CisJc3RydWN0IGRtX2lvY3RsICpkbWk7CisJaW50IGlvY3RsX3dpdGhfdWV2ZW50OworCWludCByOworCisJZG10LT5pb2N0bF9lcnJubyA9IDA7CisKKwlkbWkgPSBfZmxhdHRlbihkbXQsIGJ1ZmZlcl9yZXBlYXRfY291bnQpOworCWlmICghZG1pKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgY3JlYXRlIGlvY3RsIGFyZ3VtZW50LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG10LT50eXBlID09IERNX0RFVklDRV9UQUJMRSkKKwkJZG1pLT5mbGFncyB8PSBETV9TVEFUVVNfVEFCTEVfRkxBRzsKKworCWRtaS0+ZmxhZ3MgfD0gRE1fRVhJU1RTX0ZMQUc7CS8qIEZJWE1FICovCisKKwlpZiAoZG10LT5ub19vcGVuX2NvdW50KQorCQlkbWktPmZsYWdzIHw9IERNX1NLSVBfQkRHRVRfRkxBRzsKKworCWlvY3RsX3dpdGhfdWV2ZW50ID0gZG10LT50eXBlID09IERNX0RFVklDRV9SRVNVTUUgfHwKKwkJCSAgICBkbXQtPnR5cGUgPT0gRE1fREVWSUNFX1JFTU9WRSB8fAorCQkJICAgIGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVOQU1FOworCisJaWYgKGlvY3RsX3dpdGhfdWV2ZW50ICYmIGRtX2Nvb2tpZV9zdXBwb3J0ZWQoKSkgeworCQkvKgorCQkgKiBBbHdheXMgbWFyayBldmVudHMgY29taW5nIGZyb20gbGliZGV2bWFwcGVyIGFzCisJCSAqICJwcmltYXJ5IHNvdXJjZWQiLiBUaGlzIGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaAorCQkgKiBhbnkgc3B1cmlvdXMgZXZlbnRzIHNvIHdlIGNhbiBhY3QgYXBwcm9wcmlhdGVseS4KKwkJICogVGhpcyBuZWVkcyB0byBiZSBhcHBsaWVkIGV2ZW4gd2hlbiB1ZGV2X3N5bmMgaXMKKwkJICogbm90IHVzZWQgYmVjYXVzZSB1ZGV2IGZsYWdzIGNvdWxkIGJlIHVzZWQgYWxvbmUuCisJCSAqLworCQlkbWktPmV2ZW50X25yIHw9IERNX1VERVZfUFJJTUFSWV9TT1VSQ0VfRkxBRyA8PAorCQkJCSBETV9VREVWX0ZMQUdTX1NISUZUOworCisJCS8qCisJCSAqIFByZXZlbnQgdWRldiB2cy4gbGliZGV2bWFwcGVyIHJhY2Ugd2hlbiBwcm9jZXNzaW5nIG5vZGVzCisJCSAqIGFuZCBzeW1saW5rcy4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHVkZXYgcnVsZXMgYXJlCisJCSAqIGluc3RhbGxlZCBhbmQgdWRldiBzeW5jaHJvbmlzYXRpb24gY29kZSBpcyBlbmFibGVkIGluCisJCSAqIGxpYmRldm1hcHBlciBidXQgdGhlIHNvZnR3YXJlIHVzaW5nIGxpYmRldm1hcHBlciBkb2VzIG5vdAorCQkgKiBtYWtlIHVzZSBvZiBpdCAoYnkgbm90IGNhbGxpbmcgZG1fdGFza19zZXRfY29va2llIGJlZm9yZSkuCisJCSAqIFdlIG5lZWQgdG8gaW5zdHJ1Y3QgdGhlIHVkZXYgcnVsZXMgbm90IHRvIGJlIGFwcGxpZWQgYXQKKwkJICogYWxsIGluIHRoaXMgc2l0dWF0aW9uIHNvIHdlIGNhbiBncmFjZWZ1bGx5IGZhbGxiYWNrIHRvCisJCSAqIGxpYmRldm1hcHBlcidzIG5vZGUgYW5kIHN5bWxpbmsgY3JlYXRpb24gY29kZS4KKwkJICovCisJCWlmICghZG10LT5jb29raWVfc2V0ICYmIGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpKSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiQ29va2llIHZhbHVlIGlzIG5vdCBzZXQgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgJXMgIgorCQkJCQkgICAgICJpb2N0bC4gUGxlYXNlLCBjb25zaWRlciB1c2luZyBsaWJkZXZtYXBwZXIncyB1ZGV2ICIKKwkJCQkJICAgICAic3luY2hyb25pc2F0aW9uIGludGVyZmFjZSBvciBkaXNhYmxlIGl0IGV4cGxpY2l0bHkgIgorCQkJCQkgICAgICJieSBjYWxsaW5nIGRtX3VkZXZfc2V0X3N5bmNfc3VwcG9ydCgwKS4iLAorCQkJCQkgICAgIGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVTVU1FID8gIkRNX0RFVklDRV9SRVNVTUUiIDoKKwkJCQkJICAgICBkbXQtPnR5cGUgPT0gRE1fREVWSUNFX1JFTU9WRSA/ICJETV9ERVZJQ0VfUkVNT1ZFIiA6CisJCQkJCQkJCQkgICAgICJETV9ERVZJQ0VfUkVOQU1FIik7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiU3dpdGNoaW5nIG9mZiBkZXZpY2UtbWFwcGVyIGFuZCBhbGwgc3Vic3lzdGVtIHJlbGF0ZWQgIgorCQkJCQkgICAgICJ1ZGV2IHJ1bGVzLiBGYWxsaW5nIGJhY2sgdG8gbGliZGV2bWFwcGVyIG5vZGUgY3JlYXRpb24uIik7CisJCQkvKgorCQkJICogRGlzYWJsZSBnZW5lcmFsIGRtIGFuZCBzdWJzeXN0ZW0gcnVsZXMgYnV0IGtlZXAKKwkJCSAqIGRtIGRpc2sgcnVsZXMgaWYgbm90IGZsYWdnZWQgb3V0IGV4cGxpY2l0bHkgYmVmb3JlLgorCQkJICogV2UgbmVlZCAvZGV2L2Rpc2sgY29udGVudCBmb3IgdGhlIHNvZnR3YXJlIHRoYXQgZXhwZWN0cyBpdC4KKwkJCSovCisJCQlkbWktPmV2ZW50X25yIHw9IChETV9VREVWX0RJU0FCTEVfRE1fUlVMRVNfRkxBRyB8CisJCQkJCSAgRE1fVURFVl9ESVNBQkxFX1NVQlNZU1RFTV9SVUxFU19GTEFHKSA8PAorCQkJCQkgRE1fVURFVl9GTEFHU19TSElGVDsKKwkJfQorCX0KKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJkbSAlcyAlcyVzICVzJXMlcyAlcyUuMGQlcyUuMGQlcyIKKwkJCSAgICAgIiVzWyAlcyVzJXMlcyVzJXMlcyVzJXNdICUuMCIgUFJJdTY0ICIgJXMgWyV1XSAoKiV1KSIsCisJCQkgICAgIF9jbWRfZGF0YV92NFtkbXQtPnR5cGVdLm5hbWUsCisJCQkgICAgIGRtdC0+bmV3X3V1aWQgPyAiVVVJRCAiIDogIiIsCisJCQkgICAgIGRtaS0+bmFtZSwgZG1pLT51dWlkLCBkbXQtPm5ld25hbWUgPyAiICIgOiAiIiwKKwkJCSAgICAgZG10LT5uZXduYW1lID8gZG10LT5uZXduYW1lIDogIiIsCisJCQkgICAgIGRtdC0+bWFqb3IgPiAwID8gIigiIDogIiIsCisJCQkgICAgIGRtdC0+bWFqb3IgPiAwID8gZG10LT5tYWpvciA6IDAsCisJCQkgICAgIGRtdC0+bWFqb3IgPiAwID8gIjoiIDogIiIsCisJCQkgICAgIGRtdC0+bWlub3IgPiAwID8gZG10LT5taW5vciA6IDAsCisJCQkgICAgIGRtdC0+bWFqb3IgPiAwICYmIGRtdC0+bWlub3IgPT0gMCA/ICIwIiA6ICIiLAorCQkJICAgICBkbXQtPm1ham9yID4gMCA/ICIpICIgOiAiIiwKKwkJCSAgICAgZG10LT5ub19vcGVuX2NvdW50ID8gIm5vb3BlbmNvdW50ICIgOiAib3BlbmNvdW50ICIsCisJCQkgICAgIGRtdC0+bm9fZmx1c2ggPyAibm9mbHVzaCAiIDogImZsdXNoICIsCisJCQkgICAgIGRtdC0+cmVhZF9vbmx5ID8gInJlYWRvbmx5ICIgOiAiIiwKKwkJCSAgICAgZG10LT5za2lwX2xvY2tmcyA/ICJza2lwbG9ja2ZzICIgOiAiIiwKKwkJCSAgICAgZG10LT5yZXRyeV9yZW1vdmUgPyAicmV0cnlyZW1vdmUgIiA6ICIiLAorCQkJICAgICBkbXQtPmRlZmVycmVkX3JlbW92ZSA/ICJkZWZlcnJlZHJlbW92ZSAiIDogIiIsCisJCQkgICAgIGRtdC0+c2VjdXJlX2RhdGEgPyAic2VjdXJlZGF0YSAiIDogIiIsCisJCQkgICAgIGRtdC0+cXVlcnlfaW5hY3RpdmVfdGFibGUgPyAiaW5hY3RpdmUgIiA6ICIiLAorCQkJICAgICBkbXQtPmVuYWJsZV9jaGVja3MgPyAiZW5hYmxlY2hlY2tzICIgOiAiIiwKKwkJCSAgICAgZG10LT5zZWN0b3IsIF9zYW5pdGlzZV9tZXNzYWdlKGRtdC0+bWVzc2FnZSksCisJCQkgICAgIGRtaS0+ZGF0YV9zaXplLCByZXRyeV9yZXBlYXRfY291bnQpOworI2lmZGVmIERNX0lPQ1RMUworCXIgPSBpb2N0bChfY29udHJvbF9mZCwgY29tbWFuZCwgZG1pKTsKKworCWlmIChkbXQtPnJlY29yZF90aW1lc3RhbXApCisJCWlmICghZG1fdGltZXN0YW1wX2dldChfZG1faW9jdGxfdGltZXN0YW1wKSkKKwkJCXN0YWNrOworCisJaWYgKHIgPCAwICYmIGRtdC0+ZXhwZWN0ZWRfZXJybm8gIT0gZXJybm8pIHsKKwkJZG10LT5pb2N0bF9lcnJubyA9IGVycm5vOworCQlpZiAoZG10LT5pb2N0bF9lcnJubyA9PSBFTlhJTyAmJiAoKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfSU5GTykgfHwKKwkJCQkJCSAgKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfTUtOT0RFUykgfHwKKwkJCQkJCSAgKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfU1RBVFVTKSkpCisJCQlkbWktPmZsYWdzICY9IH5ETV9FWElTVFNfRkxBRzsJLyogRklYTUUgKi8KKwkJZWxzZSB7CisJCQlpZiAoX2xvZ19zdXBwcmVzcyB8fCBkbXQtPmlvY3RsX2Vycm5vID09IEVJTlRSKQorCQkJCWxvZ192ZXJib3NlKCJkZXZpY2UtbWFwcGVyOiAlcyBpb2N0bCBvbiAlcyVzJXMlLjBkJXMlLjBkJXMlcyAiCisJCQkJCSAgICAiZmFpbGVkOiAlcyIsCisJCQkJICAgIAkgICAgX2NtZF9kYXRhX3Y0W2RtdC0+dHlwZV0ubmFtZSwKKwkJCQkJICAgIGRtaS0+bmFtZSwgZG1pLT51dWlkLCAKKwkJCQkJICAgIGRtdC0+bWFqb3IgPiAwID8gIigiIDogIiIsCisJCQkJCSAgICBkbXQtPm1ham9yID4gMCA/IGRtdC0+bWFqb3IgOiAwLAorCQkJCQkgICAgZG10LT5tYWpvciA+IDAgPyAiOiIgOiAiIiwKKwkJCQkJICAgIGRtdC0+bWlub3IgPiAwID8gZG10LT5taW5vciA6IDAsCisJCQkJCSAgICBkbXQtPm1ham9yID4gMCAmJiBkbXQtPm1pbm9yID09IDAgPyAiMCIgOiAiIiwKKwkJCQkJICAgIGRtdC0+bWFqb3IgPiAwID8gIikiIDogIiIsCisJCQkJCSAgICBzdHJlcnJvcihkbXQtPmlvY3RsX2Vycm5vKSk7CisJCQllbHNlCisJCQkJbG9nX2Vycm9yKCJkZXZpY2UtbWFwcGVyOiAlcyBpb2N0bCBvbiAlcyVzJXMlLjBkJXMlLjBkJXMlcyAiCisJCQkJCSAgImZhaWxlZDogJXMiLAorCQkJCQkgIF9jbWRfZGF0YV92NFtkbXQtPnR5cGVdLm5hbWUsCisJCQkJCSAgZG1pLT5uYW1lLCBkbWktPnV1aWQsIAorCQkJCQkgIGRtdC0+bWFqb3IgPiAwID8gIigiIDogIiIsCisJCQkJCSAgZG10LT5tYWpvciA+IDAgPyBkbXQtPm1ham9yIDogMCwKKwkJCQkJICBkbXQtPm1ham9yID4gMCA/ICI6IiA6ICIiLAorCQkJCQkgIGRtdC0+bWlub3IgPiAwID8gZG10LT5taW5vciA6IDAsCisJCQkJCSAgZG10LT5tYWpvciA+IDAgJiYgZG10LT5taW5vciA9PSAwID8gIjAiIDogIiIsCisJCQkJCSAgZG10LT5tYWpvciA+IDAgPyAiKSIgOiAiIiwKKwkJCQkJICBzdHJlcnJvcihkbXQtPmlvY3RsX2Vycm5vKSk7CisKKwkJCS8qCisJCQkgKiBJdCdzIHNvbWV0aW1lcyB3b3J0aCByZXRyeWluZyBhZnRlciBFQlVTWSBpbiBjYXNlCisJCQkgKiBpdCdzIGEgdHJhbnNpZW50IGZhaWx1cmUgY2F1c2VkIGJ5IGFuIGFzeW5jaHJvbm91cworCQkJICogcHJvY2VzcyBxdWlja2x5IHNjYW5uaW5nIHRoZSBkZXZpY2UuCisJCQkgKi8KKwkJCSpyZXRyeWFibGUgPSBkbXQtPmlvY3RsX2Vycm5vID09IEVCVVNZOworCisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJaWYgKGlvY3RsX3dpdGhfdWV2ZW50ICYmIGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpICYmCisJICAgICFfY2hlY2tfdWV2ZW50X2dlbmVyYXRlZChkbWkpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJVZXZlbnQgbm90IGdlbmVyYXRlZCEgQ2FsbGluZyB1ZGV2X2NvbXBsZXRlICIKKwkJCQkgICAgICJpbnRlcm5hbGx5IHRvIGF2b2lkIHByb2Nlc3MgbG9jay11cC4iKTsKKwkJX3VkZXZfY29tcGxldGUoZG10KTsKKwl9CisKKwlpZiAoIV9kbV9pb2N0bF91bm1hbmdsZV9uYW1lcyhkbXQtPnR5cGUsIGRtaSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoZG10LT50eXBlICE9IERNX0RFVklDRV9SRU1PVkUgJiYKKwkgICAgIV9kbV9pb2N0bF91bm1hbmdsZV91dWlkcyhkbXQtPnR5cGUsIGRtaSkpCisJCWdvdG8gZXJyb3I7CisKKyNlbHNlIC8qIFVzZXJzcGFjZSBhbHRlcm5hdGl2ZSBmb3IgdGVzdGluZyAqLworCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlyZXR1cm4gZG1pOworCitlcnJvcjoKKwlfZG1femZyZWVfZG1pKGRtaSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZG1fdGFza191cGRhdGVfbm9kZXModm9pZCkKK3sKKwl1cGRhdGVfZGV2cygpOworfQorCisjZGVmaW5lIERNX0lPQ1RMX1JFVFJJRVMgMjUKKyNkZWZpbmUgRE1fUkVUUllfVVNMRUVQX0RFTEFZIDIwMDAwMAorCitpbnQgZG1fdGFza19nZXRfZXJybm8oc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlyZXR1cm4gZG10LT5pb2N0bF9lcnJubzsKK30KKworaW50IGRtX3Rhc2tfcnVuKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJc3RydWN0IGRtX2lvY3RsICpkbWk7CisJdW5zaWduZWQgY29tbWFuZDsKKwlpbnQgY2hlY2tfdWRldjsKKwlpbnQgcmVseV9vbl91ZGV2OworCWludCBzdXNwZW5kZWRfY291bnRlcjsKKwl1bnNpZ25lZCBpb2N0bF9yZXRyeSA9IDE7CisJaW50IHJldHJ5YWJsZSA9IDA7CisJY29uc3QgY2hhciAqZGV2X25hbWUgPSBERVZfTkFNRShkbXQpOworCWNvbnN0IGNoYXIgKmRldl91dWlkID0gREVWX1VVSUQoZG10KTsKKworCWlmICgodW5zaWduZWQpIGRtdC0+dHlwZSA+PSBETV9BUlJBWV9TSVpFKF9jbWRfZGF0YV92NCkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJ1bmtub3duIGRldmljZS1tYXBwZXIgdGFzayAlZCIsCisJCQkgIGRtdC0+dHlwZSk7CisJCXJldHVybiAwOworCX0KKworCWNvbW1hbmQgPSBfY21kX2RhdGFfdjRbZG10LT50eXBlXS5jbWQ7CisKKwkvKiBPbGQtc3R5bGUgY3JlYXRpb24gaGFkIGEgdGFibGUgc3VwcGxpZWQgKi8KKwlpZiAoZG10LT50eXBlID09IERNX0RFVklDRV9DUkVBVEUgJiYgZG10LT5oZWFkKQorCQlyZXR1cm4gX2NyZWF0ZV9hbmRfbG9hZF92NChkbXQpOworCisJaWYgKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfTUtOT0RFUyAmJiAhZGV2X25hbWUgJiYKKwkgICAgIWRldl91dWlkICYmIGRtdC0+bWFqb3IgPD0gMCkKKwkJcmV0dXJuIF9ta25vZGVzX3Y0KGRtdCk7CisKKwlpZiAoKGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVMT0FEKSAmJiBkbXQtPnN1cHByZXNzX2lkZW50aWNhbF9yZWxvYWQpCisJCXJldHVybiBfcmVsb2FkX3dpdGhfc3VwcHJlc3Npb25fdjQoZG10KTsKKworCWlmICgoZG10LT50eXBlID09IERNX0RFVklDRV9TVVNQRU5EKSAmJiBkbXQtPmVuYWJsZV9jaGVja3MpCisJCXJldHVybiBfc3VzcGVuZF93aXRoX3ZhbGlkYXRpb25fdjQoZG10KTsKKworCWlmICghX29wZW5fY29udHJvbCgpKSB7CisJCV91ZGV2X2NvbXBsZXRlKGRtdCk7CisJCXJldHVybl8wOworCX0KKworCWlmICgoc3VzcGVuZGVkX2NvdW50ZXIgPSBkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIoKSkgJiYKKwkgICAgZG10LT50eXBlID09IERNX0RFVklDRV9SRUxPQUQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUGVyZm9ybWluZyB1bnNhZmUgdGFibGUgbG9hZCB3aGlsZSAlZCBkZXZpY2UocykgIgorCQkJICAiYXJlIGtub3duIHRvIGJlIHN1c3BlbmRlZDogIgorCQkJICAiJXMlcyVzICVzJS4wZCVzJS4wZCVzJXMiLAorCQkJICBzdXNwZW5kZWRfY291bnRlciwKKwkJCSAgZGV2X25hbWUgPyA6ICIiLAorCQkJICBkZXZfdXVpZCA/ICIgVVVJRCAiIDogIiIsCisJCQkgIGRldl91dWlkID8gOiAiIiwKKwkJCSAgZG10LT5tYWpvciA+IDAgPyAiKCIgOiAiIiwKKwkJCSAgZG10LT5tYWpvciA+IDAgPyBkbXQtPm1ham9yIDogMCwKKwkJCSAgZG10LT5tYWpvciA+IDAgPyAiOiIgOiAiIiwKKwkJCSAgZG10LT5taW5vciA+IDAgPyBkbXQtPm1pbm9yIDogMCwKKwkJCSAgZG10LT5tYWpvciA+IDAgJiYgZG10LT5taW5vciA9PSAwID8gIjAiIDogIiIsCisJCQkgIGRtdC0+bWFqb3IgPiAwID8gIikgIiA6ICIiKTsKKworCS8qIEZJWE1FIERldGVjdCBhbmQgd2FybiBpZiBjb29raWUgc2V0IGJ1dCBzaG91bGQgbm90IGJlLiAqLworcmVwZWF0X2lvY3RsOgorCWlmICghKGRtaSA9IF9kb19kbV9pb2N0bChkbXQsIGNvbW1hbmQsIF9pb2N0bF9idWZmZXJfZG91YmxlX2ZhY3RvciwKKwkJCQkgaW9jdGxfcmV0cnksICZyZXRyeWFibGUpKSkgeworCQkvKgorCQkgKiBBc3luYyB1ZGV2IHJ1bGVzIHRoYXQgc2NhbiBkZXZpY2VzIGNvbW1vbmx5IGNhdXNlIHRyYW5zaWVudAorCQkgKiBmYWlsdXJlcy4gIE5vcm1hbGx5IHlvdSdkIGV4cGVjdCB0aGUgdXNlciB0byBoYXZlIG1hZGUgc3VyZQorCQkgKiBub3RoaW5nIHdhcyB1c2luZyB0aGUgZGV2aWNlIGJlZm9yZSBpc3N1aW5nIFJFTU9WRSwgc28gaXQncworCQkgKiB3b3J0aCByZXRyeWluZyBpbiBjYXNlIHRoZSBmYWlsdXJlIGlzIGluZGVlZCB0cmFuc2llbnQuCisJCSAqLworCQlpZiAocmV0cnlhYmxlICYmIGRtdC0+dHlwZSA9PSBETV9ERVZJQ0VfUkVNT1ZFICYmCisJCSAgICBkbXQtPnJldHJ5X3JlbW92ZSAmJiArK2lvY3RsX3JldHJ5IDw9IERNX0lPQ1RMX1JFVFJJRVMpIHsKKwkJCXVzbGVlcChETV9SRVRSWV9VU0xFRVBfREVMQVkpOworCQkJZ290byByZXBlYXRfaW9jdGw7CisJCX0KKworCQlfdWRldl9jb21wbGV0ZShkbXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1pLT5mbGFncyAmIERNX0JVRkZFUl9GVUxMX0ZMQUcpIHsKKwkJc3dpdGNoIChkbXQtPnR5cGUpIHsKKwkJY2FzZSBETV9ERVZJQ0VfTElTVF9WRVJTSU9OUzoKKwkJY2FzZSBETV9ERVZJQ0VfTElTVDoKKwkJY2FzZSBETV9ERVZJQ0VfREVQUzoKKwkJY2FzZSBETV9ERVZJQ0VfU1RBVFVTOgorCQljYXNlIERNX0RFVklDRV9UQUJMRToKKwkJY2FzZSBETV9ERVZJQ0VfV0FJVEVWRU5UOgorCQljYXNlIERNX0RFVklDRV9UQVJHRVRfTVNHOgorCQkJX2lvY3RsX2J1ZmZlcl9kb3VibGVfZmFjdG9yKys7CisJCQlfZG1femZyZWVfZG1pKGRtaSk7CisJCQlnb3RvIHJlcGVhdF9pb2N0bDsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcigiV0FSTklORzogbGliZGV2bWFwcGVyIGJ1ZmZlciB0b28gc21hbGwgZm9yIGRhdGEiKTsKKwkJfQorCX0KKworCS8qCisJICogQXJlIHdlIGV4cGVjdGluZyBhIHVkZXYgb3BlcmF0aW9uIHRvIG9jY3VyIHRoYXQgd2UgbmVlZCB0byBjaGVjayBmb3I/CisJICovCisJY2hlY2tfdWRldiA9IGRtdC0+Y29va2llX3NldCAmJgorCQkgICAgICEoZG10LT5ldmVudF9uciA+PiBETV9VREVWX0ZMQUdTX1NISUZUICYKKwkJICAgICAgIERNX1VERVZfRElTQUJMRV9ETV9SVUxFU19GTEFHKTsKKworCXJlbHlfb25fdWRldiA9IGRtdC0+Y29va2llX3NldCA/IChkbXQtPmV2ZW50X25yID4+IERNX1VERVZfRkxBR1NfU0hJRlQgJgorCQkJCQkgIERNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLKSA6IDA7CisKKwlzd2l0Y2ggKGRtdC0+dHlwZSkgeworCWNhc2UgRE1fREVWSUNFX0NSRUFURToKKwkJaWYgKChkbXQtPmFkZF9ub2RlID09IERNX0FERF9OT0RFX09OX0NSRUFURSkgJiYKKwkJICAgIGRldl9uYW1lICYmICpkZXZfbmFtZSAmJiAhcmVseV9vbl91ZGV2KQorCQkJYWRkX2Rldl9ub2RlKGRldl9uYW1lLCBNQUpPUihkbWktPmRldiksCisJCQkJICAgICBNSU5PUihkbWktPmRldiksIGRtdC0+dWlkLCBkbXQtPmdpZCwKKwkJCQkgICAgIGRtdC0+bW9kZSwgY2hlY2tfdWRldiwgcmVseV9vbl91ZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBETV9ERVZJQ0VfUkVNT1ZFOgorCQkvKiBGSVhNRSBLZXJuZWwgbmVlZHMgdG8gZmlsbCBpbiBkbWktPm5hbWUgKi8KKwkJaWYgKGRldl9uYW1lICYmICFyZWx5X29uX3VkZXYpCisJCQlybV9kZXZfbm9kZShkZXZfbmFtZSwgY2hlY2tfdWRldiwgcmVseV9vbl91ZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERNX0RFVklDRV9SRU5BTUU6CisJCS8qIEZJWE1FIEtlcm5lbCBuZWVkcyB0byBmaWxsIGluIGRtaS0+bmFtZSAqLworCQlpZiAoIWRtdC0+bmV3X3V1aWQgJiYgZGV2X25hbWUpCisJCQlyZW5hbWVfZGV2X25vZGUoZGV2X25hbWUsIGRtdC0+bmV3bmFtZSwKKwkJCQkJY2hlY2tfdWRldiwgcmVseV9vbl91ZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERNX0RFVklDRV9SRVNVTUU6CisJCWlmICgoZG10LT5hZGRfbm9kZSA9PSBETV9BRERfTk9ERV9PTl9SRVNVTUUpICYmCisJCSAgICBkZXZfbmFtZSAmJiAqZGV2X25hbWUpCisJCQlhZGRfZGV2X25vZGUoZGV2X25hbWUsIE1BSk9SKGRtaS0+ZGV2KSwKKwkJCQkgICAgIE1JTk9SKGRtaS0+ZGV2KSwgZG10LT51aWQsIGRtdC0+Z2lkLAorCQkJCSAgICAgZG10LT5tb2RlLCBjaGVja191ZGV2LCByZWx5X29uX3VkZXYpOworCQkvKiBGSVhNRSBLZXJuZWwgbmVlZHMgdG8gZmlsbCBpbiBkbWktPm5hbWUgKi8KKwkJc2V0X2Rldl9ub2RlX3JlYWRfYWhlYWQoZGV2X25hbWUsCisJCQkJCU1BSk9SKGRtaS0+ZGV2KSwgTUlOT1IoZG1pLT5kZXYpLAorCQkJCQlkbXQtPnJlYWRfYWhlYWQsIGRtdC0+cmVhZF9haGVhZF9mbGFncyk7CisJCWJyZWFrOworCQorCWNhc2UgRE1fREVWSUNFX01LTk9ERVM6CisJCWlmIChkbWktPmZsYWdzICYgRE1fRVhJU1RTX0ZMQUcpCisJCQlhZGRfZGV2X25vZGUoZG1pLT5uYW1lLCBNQUpPUihkbWktPmRldiksCisJCQkJICAgICBNSU5PUihkbWktPmRldiksIGRtdC0+dWlkLAorCQkJCSAgICAgZG10LT5naWQsIGRtdC0+bW9kZSwgMCwgcmVseV9vbl91ZGV2KTsKKwkJZWxzZSBpZiAoZGV2X25hbWUpCisJCQlybV9kZXZfbm9kZShkZXZfbmFtZSwgMCwgcmVseV9vbl91ZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERNX0RFVklDRV9TVEFUVVM6CisJY2FzZSBETV9ERVZJQ0VfVEFCTEU6CisJY2FzZSBETV9ERVZJQ0VfV0FJVEVWRU5UOgorCQlpZiAoIV91bm1hcnNoYWxfc3RhdHVzKGRtdCwgZG1pKSkKKwkJCWdvdG8gYmFkOworCQlicmVhazsKKwl9CisKKwkvKiBXYXMgc3RydWN0dXJlIHJldXNlZD8gKi8KKwlfZG1femZyZWVfZG1pKGRtdC0+ZG1pLnY0KTsKKwlkbXQtPmRtaS52NCA9IGRtaTsKKwlyZXR1cm4gMTsKKworICAgICAgYmFkOgorCV9kbV96ZnJlZV9kbWkoZG1pKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkbV9ob2xkX2NvbnRyb2xfZGV2KGludCBob2xkX29wZW4pCit7CisJX2hvbGRfY29udHJvbF9mZF9vcGVuID0gaG9sZF9vcGVuID8gMSA6IDA7CisKKwlsb2dfZGVidWcoIkhvbGQgb2YgY29udHJvbCBkZXZpY2UgaXMgbm93ICVzc2V0LiIsCisJCSAgX2hvbGRfY29udHJvbF9mZF9vcGVuID8gIiIgOiAidW4iKTsKK30KKwordm9pZCBkbV9saWJfcmVsZWFzZSh2b2lkKQoreworCWlmICghX2hvbGRfY29udHJvbF9mZF9vcGVuKQorCQlfY2xvc2VfY29udHJvbF9mZCgpOworCWRtX3RpbWVzdGFtcF9kZXN0cm95KF9kbV9pb2N0bF90aW1lc3RhbXApOworCV9kbV9pb2N0bF90aW1lc3RhbXAgPSBOVUxMOworCXVwZGF0ZV9kZXZzKCk7Cit9CisKK3ZvaWQgZG1fcG9vbHNfY2hlY2tfbGVha3Modm9pZCk7CisKK3ZvaWQgZG1fbGliX2V4aXQodm9pZCkKK3sKKwlpbnQgc3VzcGVuZGVkX2NvdW50ZXI7CisJc3RhdGljIHVuc2lnbmVkIF9leGl0ZWQgPSAwOworCisJaWYgKF9leGl0ZWQrKykKKwkJcmV0dXJuOworCisJaWYgKChzdXNwZW5kZWRfY291bnRlciA9IGRtX2dldF9zdXNwZW5kZWRfY291bnRlcigpKSkKKwkJbG9nX2Vycm9yKCJsaWJkZXZtYXBwZXIgZXhpdGluZyB3aXRoICVkIGRldmljZShzKSBzdGlsbCBzdXNwZW5kZWQuIiwgc3VzcGVuZGVkX2NvdW50ZXIpOworCisJZG1fbGliX3JlbGVhc2UoKTsKKwlzZWxpbnV4X3JlbGVhc2UoKTsKKwlpZiAoX2RtX2JpdHNldCkKKwkJZG1fYml0c2V0X2Rlc3Ryb3koX2RtX2JpdHNldCk7CisJX2RtX2JpdHNldCA9IE5VTEw7CisJZG1fcG9vbHNfY2hlY2tfbGVha3MoKTsKKwlkbV9kdW1wX21lbW9yeSgpOworCV92ZXJzaW9uX29rID0gMTsKKwlfdmVyc2lvbl9jaGVja2VkID0gMDsKK30KKworI2lmIGRlZmluZWQoX19HTlVDX18pCisvKgorICogTWFpbnRhaW4gYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBWZXJzaW9uIHNjcmlwdCBtZWNoYW5pc20gd29ya3Mgd2l0aCAnZ2NjJyBjb21wYXRpYmxlIGNvbXBpbGVycyBvbmx5LgorICovCisKKy8qCisgKiBUaGlzIGZvbGxvd2luZyBjb2RlIGlzIGhlcmUgdG8gcmV0YWluIEFCSSBjb21wYXRpYmlsaXR5IGFmdGVyIGFkZGluZworICogdGhlIGZpZWxkIGRlZmVycmVkX3JlbW92ZSB0byBzdHJ1Y3QgZG1faW5mbyBpbiB2ZXJzaW9uIDEuMDIuODkuCisgKgorICogQmluYXJpZXMgbGlua2VkIGFnYWluc3QgdmVyc2lvbiAxLjAyLjg4IG9mIGxpYmRldm1hcHBlciBvciBlYXJsaWVyCisgKiB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkbV9pbmZvIHdpdGhvdXQgdGhlCisgKiBkZWZlcnJlZF9yZW1vdmUgZmllbGQuCisgKgorICogQmluYXJpZXMgY29tcGlsZWQgYWdhaW5zdCB2ZXJzaW9uIDEuMDIuODkgb253YXJkcyB3aWxsIHVzZQorICogdGhlIG5ldyBmdW5jdGlvbiBkbV90YXNrX2dldF9pbmZvX3dpdGhfZGVmZXJyZWRfcmVtb3ZlIGR1ZSB0byB0aGUKKyAqICNkZWZpbmUuCisgKgorICogTi5CLiBLZWVwIHRoaXMgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgdGhhdAorICogbm8gY29kZSBpbiB0aGlzIGZpbGUgYWNjaWRlbnRhbGx5IGNhbGxzIGl0LgorICovCisKK2ludCBkbV90YXNrX2dldF9pbmZvX2Jhc2Uoc3RydWN0IGRtX3Rhc2sgKmRtdCwgc3RydWN0IGRtX2luZm8gKmluZm8pOworRE1fRVhQT1JUX1NZTUJPTF9CQVNFKGRtX3Rhc2tfZ2V0X2luZm8pOworaW50IGRtX3Rhc2tfZ2V0X2luZm9fYmFzZShzdHJ1Y3QgZG1fdGFzayAqZG10LCBzdHJ1Y3QgZG1faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZG1faW5mbyBuZXdfaW5mbzsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZuZXdfaW5mbykpCisJCXJldHVybiAwOworCisJbWVtY3B5KGluZm8sICZuZXdfaW5mbywgb2Zmc2V0b2Yoc3RydWN0IGRtX2luZm8sIGRlZmVycmVkX3JlbW92ZSkpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX2dldF9pbmZvX3dpdGhfZGVmZXJyZWRfcmVtb3ZlKHN0cnVjdCBkbV90YXNrICpkbXQsIHN0cnVjdCBkbV9pbmZvICppbmZvKTsKK2ludCBkbV90YXNrX2dldF9pbmZvX3dpdGhfZGVmZXJyZWRfcmVtb3ZlKHN0cnVjdCBkbV90YXNrICpkbXQsIHN0cnVjdCBkbV9pbmZvICppbmZvKQoreworCXN0cnVjdCBkbV9pbmZvIG5ld19pbmZvOworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJm5ld19pbmZvKSkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoaW5mbywgJm5ld19pbmZvLCBvZmZzZXRvZihzdHJ1Y3QgZG1faW5mbywgaW50ZXJuYWxfc3VzcGVuZCkpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmRtL2lvY3RsL2xpYmRtLXRhcmdldHMuaCBiL2xpYmRtL2lvY3RsL2xpYmRtLXRhcmdldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIyMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vaW9jdGwvbGliZG0tdGFyZ2V0cy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgTElCX0RNVEFSR0VUU19ICisjZGVmaW5lIExJQl9ETVRBUkdFVFNfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IGRtX2lvY3RsOworCitzdHJ1Y3QgdGFyZ2V0IHsKKwl1aW50NjRfdCBzdGFydDsKKwl1aW50NjRfdCBsZW5ndGg7CisJY2hhciAqdHlwZTsKKwljaGFyICpwYXJhbXM7CisKKwlzdHJ1Y3QgdGFyZ2V0ICpuZXh0OworfTsKKworc3RydWN0IGRtX3Rhc2sgeworCWludCB0eXBlOworCWNoYXIgKmRldl9uYW1lOworCWNoYXIgKm1hbmdsZWRfZGV2X25hbWU7CisKKwlzdHJ1Y3QgdGFyZ2V0ICpoZWFkLCAqdGFpbDsKKworCWludCByZWFkX29ubHk7CisJdWludDMyX3QgZXZlbnRfbnI7CisJaW50IG1ham9yOworCWludCBtaW5vcjsKKwlpbnQgYWxsb3dfZGVmYXVsdF9tYWpvcl9mYWxsYmFjazsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCW1vZGVfdCBtb2RlOworCXVpbnQzMl90IHJlYWRfYWhlYWQ7CisJdWludDMyX3QgcmVhZF9haGVhZF9mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCBkbV9pb2N0bCAqdjQ7CisJfSBkbWk7CisJY2hhciAqbmV3bmFtZTsKKwljaGFyICptZXNzYWdlOworCWNoYXIgKmdlb21ldHJ5OworCXVpbnQ2NF90IHNlY3RvcjsKKwlpbnQgbm9fZmx1c2g7CisJaW50IG5vX29wZW5fY291bnQ7CisJaW50IHNraXBfbG9ja2ZzOworCWludCBxdWVyeV9pbmFjdGl2ZV90YWJsZTsKKwlpbnQgc3VwcHJlc3NfaWRlbnRpY2FsX3JlbG9hZDsKKwlkbV9hZGRfbm9kZV90IGFkZF9ub2RlOworCXVpbnQ2NF90IGV4aXN0aW5nX3RhYmxlX3NpemU7CisJaW50IGNvb2tpZV9zZXQ7CisJaW50IG5ld191dWlkOworCWludCBzZWN1cmVfZGF0YTsKKwlpbnQgcmV0cnlfcmVtb3ZlOworCWludCBkZWZlcnJlZF9yZW1vdmU7CisJaW50IGVuYWJsZV9jaGVja3M7CisJaW50IGV4cGVjdGVkX2Vycm5vOworCWludCBpb2N0bF9lcnJubzsKKworCWludCByZWNvcmRfdGltZXN0YW1wOworCisJY2hhciAqdXVpZDsKKwljaGFyICptYW5nbGVkX3V1aWQ7Cit9OworCitzdHJ1Y3QgY21kX2RhdGEgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgY21kOworCWNvbnN0IGludCB2ZXJzaW9uWzNdOworfTsKKworaW50IGRtX2NoZWNrX3ZlcnNpb24odm9pZCk7Cit1aW50NjRfdCBkbV90YXNrX2dldF9leGlzdGluZ190YWJsZV9zaXplKHN0cnVjdCBkbV90YXNrICpkbXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmRtL2xpYmRldm1hcHBlci5oIGIvbGliZG0vbGliZGV2bWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3MDAxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2xpYmRldm1hcHBlci5oCkBAIC0wLDAgKzEsMzU1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSYWNrYWJsZSBTeXN0ZW1zIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIExJQl9ERVZJQ0VfTUFQUEVSX0gKKyNkZWZpbmUgTElCX0RFVklDRV9NQVBQRVJfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgX19saW51eF9fCisjICBpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX3R5cGVvZl9fIHR5cGVvZgorI2VuZGlmCisKKy8qIE1hY3JvcyB0byBtYWtlIHN0cmluZyBkZWZpbmVzICovCisjZGVmaW5lIERNX1RPX1NUUklOR19FWFAoQSkgI0EKKyNkZWZpbmUgRE1fVE9fU1RSSU5HKEEpIERNX1RPX1NUUklOR19FWFAoQSkKKworI2RlZmluZSBETV9BUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBmaXJzdCBzZWN0aW9uIG9mIHRoaXMgZmlsZSBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZQorICogaW5kaXZpZHVhbCBkZXZpY2UtbWFwcGVyIGlvY3Rscy4gIFNpbmNlIGl0IGlzIHF1aXRlIGxhYm9yaW91cyB0bworICogYnVpbGQgdGhlIGlvY3RsIGFyZ3VtZW50cyBmb3IgdGhlIGRldmljZS1tYXBwZXIsIHBlb3BsZSBhcmUKKyAqIGVuY291cmFnZWQgdG8gdXNlIHRoaXMgbGlicmFyeS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGxpYnJhcnkgdXNlciBtYXkgd2lzaCB0byByZWdpc3RlciB0aGVpciBvd24KKyAqIGxvZ2dpbmcgZnVuY3Rpb24uICBCeSBkZWZhdWx0IGVycm9ycyBnbyB0byBzdGRlcnIuCisgKiBVc2UgZG1fbG9nX3dpdGhfZXJybm9faW5pdChOVUxMKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGxvZyBmbi4KKyAqIEVycm9yIG1lc3NhZ2VzIG1heSBoYXZlIGEgbm9uLXplcm8gZXJybm8uCisgKiBEZWJ1ZyBtZXNzYWdlcyBtYXkgaGF2ZSBhIG5vbi16ZXJvIGNsYXNzLgorICogQWJvcnRzIG9uIGludGVybmFsIGVycm9yIHdoZW4gZW52IERNX0FCT1JUX09OX0lOVEVSTkFMX0VSUk9SUyBpcyAxCisgKi8KKwordHlwZWRlZiB2b2lkICgqZG1fbG9nX3dpdGhfZXJybm9fZm4pIChpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkJCSAgICAgIGludCBkbV9lcnJub19vcl9jbGFzcywgY29uc3QgY2hhciAqZiwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCA1LCA2KSkpOworCit2b2lkIGRtX2xvZ193aXRoX2Vycm5vX2luaXQoZG1fbG9nX3dpdGhfZXJybm9fZm4gZm4pOwordm9pZCBkbV9sb2dfaW5pdF92ZXJib3NlKGludCBsZXZlbCk7CisKKy8qCisgKiBPcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKiBkbV9lcnJubyBpcyBzZXQgdG8gMC4KKyAqCisgKiBEZXByZWNhdGVkOiBVc2UgdGhlIF93aXRoX2Vycm5vXyB2ZXJzaW9ucyBhYm92ZSBpbnN0ZWFkLgorICovCit0eXBlZGVmIHZvaWQgKCpkbV9sb2dfZm4pIChpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkJICAgY29uc3QgY2hhciAqZiwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCA0LCA1KSkpOworCit2b2lkIGRtX2xvZ19pbml0KGRtX2xvZ19mbiBmbik7CisvKgorICogRm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGluZGljYXRlIHRoYXQgZG1fbG9nX2luaXQoKSB3YXMgdXNlZAorICogdG8gc2V0IGEgbm9uLWRlZmF1bHQgdmFsdWUgb2YgZG1fbG9nKCkuCisgKi8KK2ludCBkbV9sb2dfaXNfbm9uX2RlZmF1bHQodm9pZCk7CisKKy8qCisgKiBOdW1iZXIgb2YgZGV2aWNlcyBjdXJyZW50bHkgaW4gc3VzcGVuZGVkIHN0YXRlICh2aWEgdGhlIGxpYnJhcnkpLgorICovCitpbnQgZG1fZ2V0X3N1c3BlbmRlZF9jb3VudGVyKHZvaWQpOworCitlbnVtIHsKKwlETV9ERVZJQ0VfQ1JFQVRFLAorCURNX0RFVklDRV9SRUxPQUQsCisJRE1fREVWSUNFX1JFTU9WRSwKKwlETV9ERVZJQ0VfUkVNT1ZFX0FMTCwKKworCURNX0RFVklDRV9TVVNQRU5ELAorCURNX0RFVklDRV9SRVNVTUUsCisKKwlETV9ERVZJQ0VfSU5GTywKKwlETV9ERVZJQ0VfREVQUywKKwlETV9ERVZJQ0VfUkVOQU1FLAorCisJRE1fREVWSUNFX1ZFUlNJT04sCisKKwlETV9ERVZJQ0VfU1RBVFVTLAorCURNX0RFVklDRV9UQUJMRSwKKwlETV9ERVZJQ0VfV0FJVEVWRU5ULAorCisJRE1fREVWSUNFX0xJU1QsCisKKwlETV9ERVZJQ0VfQ0xFQVIsCisKKwlETV9ERVZJQ0VfTUtOT0RFUywKKworCURNX0RFVklDRV9MSVNUX1ZFUlNJT05TLAorCQorCURNX0RFVklDRV9UQVJHRVRfTVNHLAorCisJRE1fREVWSUNFX1NFVF9HRU9NRVRSWQorfTsKKworLyoKKyAqIFlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYSBzdHJ1Y3QgZG1fdGFzayBmb3IKKyAqIGVhY2ggaW9jdGwgY29tbWFuZCB5b3Ugd2FudCB0byBleGVjdXRlLgorICovCisKK3N0cnVjdCBkbV9wb29sOworc3RydWN0IGRtX3Rhc2s7CitzdHJ1Y3QgZG1fdGltZXN0YW1wOworCitzdHJ1Y3QgZG1fdGFzayAqZG1fdGFza19jcmVhdGUoaW50IHR5cGUpOwordm9pZCBkbV90YXNrX2Rlc3Ryb3koc3RydWN0IGRtX3Rhc2sgKmRtdCk7CisKK2ludCBkbV90YXNrX3NldF9uYW1lKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGRtX3Rhc2tfc2V0X3V1aWQoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqdXVpZCk7CisKKy8qCisgKiBSZXRyaWV2ZSBhdHRyaWJ1dGVzIGFmdGVyIGFuIGluZm8uCisgKi8KK3N0cnVjdCBkbV9pbmZvIHsKKwlpbnQgZXhpc3RzOworCWludCBzdXNwZW5kZWQ7CisJaW50IGxpdmVfdGFibGU7CisJaW50IGluYWN0aXZlX3RhYmxlOworCWludDMyX3Qgb3Blbl9jb3VudDsKKwl1aW50MzJfdCBldmVudF9ucjsKKwl1aW50MzJfdCBtYWpvcjsKKwl1aW50MzJfdCBtaW5vcjsJCS8qIG1pbm9yIGRldmljZSBudW1iZXIgKi8KKwlpbnQgcmVhZF9vbmx5OwkJLyogMDpyZWFkLXdyaXRlOyAxOnJlYWQtb25seSAqLworCisJaW50MzJfdCB0YXJnZXRfY291bnQ7CisKKwlpbnQgZGVmZXJyZWRfcmVtb3ZlOworCWludCBpbnRlcm5hbF9zdXNwZW5kOworfTsKKworc3RydWN0IGRtX2RlcHMgeworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IGZpbGxlcjsKKwl1aW50NjRfdCBkZXZpY2VbMF07Cit9OworCitzdHJ1Y3QgZG1fbmFtZXMgeworCXVpbnQ2NF90IGRldjsKKwl1aW50MzJfdCBuZXh0OwkJLyogT2Zmc2V0IHRvIG5leHQgc3RydWN0IGZyb20gc3RhcnQgb2YgdGhpcyBzdHJ1Y3QgKi8KKwljaGFyIG5hbWVbMF07Cit9OworCitzdHJ1Y3QgZG1fdmVyc2lvbnMgeworCXVpbnQzMl90IG5leHQ7CQkvKiBPZmZzZXQgdG8gbmV4dCBzdHJ1Y3QgZnJvbSBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCXVpbnQzMl90IHZlcnNpb25bM107CisKKwljaGFyIG5hbWVbMF07Cit9OworCitpbnQgZG1fZ2V0X2xpYnJhcnlfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSk7CitpbnQgZG1fdGFza19nZXRfZHJpdmVyX3ZlcnNpb24oc3RydWN0IGRtX3Rhc2sgKmRtdCwgY2hhciAqdmVyc2lvbiwgc2l6ZV90IHNpemUpOworaW50IGRtX3Rhc2tfZ2V0X2luZm8oc3RydWN0IGRtX3Rhc2sgKmRtdCwgc3RydWN0IGRtX2luZm8gKmRtaSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZG0gZGV2aWNlJ3MgVVVJRCBiYXNlZCBvbiB0aGUgdmFsdWUKKyAqIG9mIHRoZSBtYW5nbGluZyBtb2RlIHNldCBkdXJpbmcgcHJlY2VkaW5nIGRtX3Rhc2tfcnVuIGNhbGw6CisgKiAgIC0gdW5tYW5nbGVkIFVVSUQgZm9yIERNX1NUUklOR19NQU5HTElOR197QVVUTywgSEVYfSwKKyAqICAgLSBVVUlEIHdpdGhvdXQgYW55IGNoYW5nZXMgZm9yIERNX1NUUklOR19NQU5HTElOR19OT05FLgorICoKKyAqIFRvIGdldCBtYW5nbGVkIG9yIHVubWFuZ2xlZCBmb3JtIG9mIHRoZSBVVUlEIGRpcmVjdGx5LCB1c2UKKyAqIGRtX3Rhc2tfZ2V0X3V1aWRfbWFuZ2xlZCBvciBkbV90YXNrX2dldF91dWlkX3VubWFuZ2xlZCBmdW5jdGlvbi4KKyAqLworY29uc3QgY2hhciAqZG1fdGFza19nZXRfdXVpZChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10KTsKKworc3RydWN0IGRtX2RlcHMgKmRtX3Rhc2tfZ2V0X2RlcHMoc3RydWN0IGRtX3Rhc2sgKmRtdCk7CitzdHJ1Y3QgZG1fdmVyc2lvbnMgKmRtX3Rhc2tfZ2V0X3ZlcnNpb25zKHN0cnVjdCBkbV90YXNrICpkbXQpOworY29uc3QgY2hhciAqZG1fdGFza19nZXRfbWVzc2FnZV9yZXNwb25zZShzdHJ1Y3QgZG1fdGFzayAqZG10KTsKKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gZGV2aWNlLW1hcHBlciBuYW1lcyBiYXNlZCBvbiB0aGUgdmFsdWUKKyAqIG9mIHRoZSBtYW5nbGluZyBtb2RlIHNldCBkdXJpbmcgcHJlY2VkaW5nIGRtX3Rhc2tfcnVuIGNhbGw6CisgKiAgIC0gdW5tYW5nbGVkIG5hbWUgZm9yIERNX1NUUklOR19NQU5HTElOR197QVVUTywgSEVYfSwKKyAqICAgLSBuYW1lIHdpdGhvdXQgYW55IGNoYW5nZXMgZm9yIERNX1NUUklOR19NQU5HTElOR19OT05FLgorICoKKyAqIFRvIGdldCBtYW5nbGVkIG9yIHVubWFuZ2xlZCBmb3JtIG9mIHRoZSBuYW1lIGRpcmVjdGx5LCB1c2UKKyAqIGRtX3Rhc2tfZ2V0X25hbWVfbWFuZ2xlZCBvciBkbV90YXNrX2dldF9uYW1lX3VubWFuZ2xlZCBmdW5jdGlvbi4KKyAqLworY29uc3QgY2hhciAqZG1fdGFza19nZXRfbmFtZShjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10KTsKK3N0cnVjdCBkbV9uYW1lcyAqZG1fdGFza19nZXRfbmFtZXMoc3RydWN0IGRtX3Rhc2sgKmRtdCk7CisKK2ludCBkbV90YXNrX3NldF9ybyhzdHJ1Y3QgZG1fdGFzayAqZG10KTsKK2ludCBkbV90YXNrX3NldF9uZXduYW1lKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKm5ld25hbWUpOworaW50IGRtX3Rhc2tfc2V0X25ld3V1aWQoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqbmV3dXVpZCk7CitpbnQgZG1fdGFza19zZXRfbWlub3Ioc3RydWN0IGRtX3Rhc2sgKmRtdCwgaW50IG1pbm9yKTsKK2ludCBkbV90YXNrX3NldF9tYWpvcihzdHJ1Y3QgZG1fdGFzayAqZG10LCBpbnQgbWFqb3IpOworaW50IGRtX3Rhc2tfc2V0X21ham9yX21pbm9yKHN0cnVjdCBkbV90YXNrICpkbXQsIGludCBtYWpvciwgaW50IG1pbm9yLCBpbnQgYWxsb3dfZGVmYXVsdF9tYWpvcl9mYWxsYmFjayk7CitpbnQgZG1fdGFza19zZXRfdWlkKHN0cnVjdCBkbV90YXNrICpkbXQsIHVpZF90IHVpZCk7CitpbnQgZG1fdGFza19zZXRfZ2lkKHN0cnVjdCBkbV90YXNrICpkbXQsIGdpZF90IGdpZCk7CitpbnQgZG1fdGFza19zZXRfbW9kZShzdHJ1Y3QgZG1fdGFzayAqZG10LCBtb2RlX3QgbW9kZSk7CitpbnQgZG1fdGFza19zZXRfY29va2llKHN0cnVjdCBkbV90YXNrICpkbXQsIHVpbnQzMl90ICpjb29raWUsIHVpbnQxNl90IGZsYWdzKTsKK2ludCBkbV90YXNrX3NldF9ldmVudF9ucihzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCBldmVudF9ucik7CitpbnQgZG1fdGFza19zZXRfZ2VvbWV0cnkoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqY3lsaW5kZXJzLCBjb25zdCBjaGFyICpoZWFkcywgY29uc3QgY2hhciAqc2VjdG9ycywgY29uc3QgY2hhciAqc3RhcnQpOworaW50IGRtX3Rhc2tfc2V0X21lc3NhZ2Uoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqbWVzc2FnZSk7CitpbnQgZG1fdGFza19zZXRfc2VjdG9yKHN0cnVjdCBkbV90YXNrICpkbXQsIHVpbnQ2NF90IHNlY3Rvcik7CitpbnQgZG1fdGFza19ub19mbHVzaChzdHJ1Y3QgZG1fdGFzayAqZG10KTsKK2ludCBkbV90YXNrX25vX29wZW5fY291bnQoc3RydWN0IGRtX3Rhc2sgKmRtdCk7CitpbnQgZG1fdGFza19za2lwX2xvY2tmcyhzdHJ1Y3QgZG1fdGFzayAqZG10KTsKK2ludCBkbV90YXNrX3F1ZXJ5X2luYWN0aXZlX3RhYmxlKHN0cnVjdCBkbV90YXNrICpkbXQpOworaW50IGRtX3Rhc2tfc3VwcHJlc3NfaWRlbnRpY2FsX3JlbG9hZChzdHJ1Y3QgZG1fdGFzayAqZG10KTsKK2ludCBkbV90YXNrX3NlY3VyZV9kYXRhKHN0cnVjdCBkbV90YXNrICpkbXQpOworaW50IGRtX3Rhc2tfcmV0cnlfcmVtb3ZlKHN0cnVjdCBkbV90YXNrICpkbXQpOworaW50IGRtX3Rhc2tfZGVmZXJyZWRfcmVtb3ZlKHN0cnVjdCBkbV90YXNrICpkbXQpOworCisvKgorICogUmVjb3JkIHRpbWVzdGFtcCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaW9jdGwgcmV0dXJucy4KKyAqLworaW50IGRtX3Rhc2tfc2V0X3JlY29yZF90aW1lc3RhbXAoc3RydWN0IGRtX3Rhc2sgKmRtdCk7CitzdHJ1Y3QgZG1fdGltZXN0YW1wICpkbV90YXNrX2dldF9pb2N0bF90aW1lc3RhbXAoc3RydWN0IGRtX3Rhc2sgKmRtdCk7CisKKy8qCisgKiBFbmFibGUgY2hlY2tzIGZvciBjb21tb24gbWlzdGFrZXMgc3VjaCBhcyBpc3N1aW5nIGlvY3RscyBpbiBhbiB1bnNhZmUgb3JkZXIuCisgKi8KK2ludCBkbV90YXNrX2VuYWJsZV9jaGVja3Moc3RydWN0IGRtX3Rhc2sgKmRtdCk7CisKK3R5cGVkZWYgZW51bSB7CisJRE1fQUREX05PREVfT05fUkVTVU1FLCAvKiBhZGQgL2Rldi9tYXBwZXIgbm9kZSB3aXRoIGRtc2V0dXAgcmVzdW1lICovCisJRE1fQUREX05PREVfT05fQ1JFQVRFICAvKiBhZGQgL2Rldi9tYXBwZXIgbm9kZSB3aXRoIGRtc2V0dXAgY3JlYXRlICovCit9IGRtX2FkZF9ub2RlX3Q7CitpbnQgZG1fdGFza19zZXRfYWRkX25vZGUoc3RydWN0IGRtX3Rhc2sgKmRtdCwgZG1fYWRkX25vZGVfdCBhZGRfbm9kZSk7CisKKy8qCisgKiBDb250cm9sIHJlYWRfYWhlYWQuCisgKi8KKyNkZWZpbmUgRE1fUkVBRF9BSEVBRF9BVVRPIFVJTlQzMl9NQVgJLyogVXNlIGtlcm5lbCBkZWZhdWx0IHJlYWRhaGVhZCAqLworI2RlZmluZSBETV9SRUFEX0FIRUFEX05PTkUgMAkJLyogRGlzYWJsZSByZWFkYWhlYWQgKi8KKworI2RlZmluZSBETV9SRUFEX0FIRUFEX01JTklNVU1fRkxBRwkweDEJLyogVmFsdWUgc3VwcGxpZWQgaXMgbWluaW11bSAqLworCisvKgorICogUmVhZCBhaGVhZCBpcyBzZXQgd2l0aCBETV9ERVZJQ0VfQ1JFQVRFIHdpdGggYSB0YWJsZSBvciBETV9ERVZJQ0VfUkVTVU1FLgorICovCitpbnQgZG1fdGFza19zZXRfcmVhZF9haGVhZChzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCByZWFkX2FoZWFkLAorCQkJICAgdWludDMyX3QgcmVhZF9haGVhZF9mbGFncyk7Cit1aW50MzJfdCBkbV90YXNrX2dldF9yZWFkX2FoZWFkKGNvbnN0IHN0cnVjdCBkbV90YXNrICpkbXQsCisJCQkJdWludDMyX3QgKnJlYWRfYWhlYWQpOworCisvKgorICogVXNlIHRoZXNlIHRvIHByZXBhcmUgZm9yIGEgY3JlYXRlIG9yIHJlbG9hZC4KKyAqLworaW50IGRtX3Rhc2tfYWRkX3RhcmdldChzdHJ1Y3QgZG1fdGFzayAqZG10LAorCQkgICAgICAgdWludDY0X3Qgc3RhcnQsCisJCSAgICAgICB1aW50NjRfdCBzaXplLCBjb25zdCBjaGFyICp0dHlwZSwgY29uc3QgY2hhciAqcGFyYW1zKTsKKworLyoKKyAqIEZvcm1hdCBtYWpvci9taW5vciBudW1iZXJzIGNvcnJlY3RseSBmb3IgaW5wdXQgdG8gZHJpdmVyLgorICovCisjZGVmaW5lIERNX0ZPUk1BVF9ERVZfQlVGU0laRQkxMwkvKiBNaW5pbXVtIGJ1ZnNpemUgdG8gaGFuZGxlIHdvcnN0IGNhc2UuICovCitpbnQgZG1fZm9ybWF0X2RldihjaGFyICpidWYsIGludCBidWZzaXplLCB1aW50MzJfdCBkZXZfbWFqb3IsIHVpbnQzMl90IGRldl9taW5vcik7CisKKy8qIFVzZSB0aGlzIHRvIHJldHJpdmUgdGFyZ2V0IGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gYSBTVEFUVVMgY2FsbCAqLwordm9pZCAqZG1fZ2V0X25leHRfdGFyZ2V0KHN0cnVjdCBkbV90YXNrICpkbXQsCisJCQkgdm9pZCAqbmV4dCwgdWludDY0X3QgKnN0YXJ0LCB1aW50NjRfdCAqbGVuZ3RoLAorCQkJIGNoYXIgKip0YXJnZXRfdHlwZSwgY2hhciAqKnBhcmFtcyk7CisKKy8qCisgKiBGb2xsb3dpbmcgZG1fZ2V0X3N0YXR1c18qIGZ1bmN0aW9ucyB3aWxsIGFsbG9jYXRlIGFwcHJvcmlhdGUgc3RhdHVzIHN0cnVjdHVyZQorICogZnJvbSBwYXNzZWQgbWVtcG9vbCB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgY2hhcmFjdGVyIGFycmF5cy4KKyAqIERlc3Ryb3lpbmcgdGhlIG1lbXBvb2wgd2lsbCByZWxlYXNlIGFsbCBhc29jaWF0ZWQgYWxsb2NhdGlvbi4KKyAqLworCisvKiBQYXJzZSBwYXJhbXMgZnJvbSBTVEFUVVMgY2FsbCBmb3IgbWlycm9yIHRhcmdldCAqLwordHlwZWRlZiBlbnVtIHsKKwlETV9TVEFUVVNfTUlSUk9SX0FMSVZFCSAgICAgID0gJ0EnLC8qIE5vIGZhaWx1cmVzICovCisJRE1fU1RBVFVTX01JUlJPUl9GTFVTSF9GQUlMRUQgPSAnRicsLyogTWlycm9yIG91dC1vZi1zeW5jICovCisJRE1fU1RBVFVTX01JUlJPUl9XUklURV9GQUlMRUQgPSAnRCcsLyogTWlycm9yIG91dC1vZi1zeW5jICovCisJRE1fU1RBVFVTX01JUlJPUl9TWU5DX0ZBSUxFRCAgPSAnUycsLyogTWlycm9yIG91dC1vZi1zeW5jICovCisJRE1fU1RBVFVTX01JUlJPUl9SRUFEX0ZBSUxFRCAgPSAnUicsLyogTWlycm9yIGRhdGEgdW5hZmZlY3RlZCAqLworCURNX1NUQVRVU19NSVJST1JfVU5DTEFTU0lGSUVEID0gJ1UnIC8qIEJ1ZyAqLworfSBkbV9zdGF0dXNfbWlycm9yX2hlYWx0aF90OworCitzdHJ1Y3QgZG1fc3RhdHVzX21pcnJvciB7CisJdWludDY0X3QgdG90YWxfcmVnaW9uczsKKwl1aW50NjRfdCBpbnN5bmNfcmVnaW9uczsKKwl1aW50MzJfdCBkZXZfY291bnQ7ICAgICAgICAgICAgIC8qICMgb2YgZGV2c1tdIGVsZW1lbnRzICg8PSA4KSAqLworCXN0cnVjdCB7CisJCWRtX3N0YXR1c19taXJyb3JfaGVhbHRoX3QgaGVhbHRoOworCQl1aW50MzJfdCBtYWpvcjsKKwkJdWludDMyX3QgbWlub3I7CisJfSAqZGV2czsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSB3aXRoIGluZGl2aWR1YWwgbGVncyAqLworCWNvbnN0IGNoYXIgKmxvZ190eXBlOyAgICAgICAgICAgLyogY29yZSwgZGlzaywuLi4uICovCisJdWludDMyX3QgbG9nX2NvdW50OwkJLyogIyBvZiBsb2dzW10gZWxlbWVudHMgKi8KKwlzdHJ1Y3QgeworCQlkbV9zdGF0dXNfbWlycm9yX2hlYWx0aF90IGhlYWx0aDsKKwkJdWludDMyX3QgbWFqb3I7CisJCXVpbnQzMl90IG1pbm9yOworCX0gKmxvZ3M7CQkJLyogYXJyYXkgd2l0aCBpbmRpdmlkdWFsIGxvZ3MgKi8KK307CisKK2ludCBkbV9nZXRfc3RhdHVzX21pcnJvcihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXJhbXMsCisJCQkgc3RydWN0IGRtX3N0YXR1c19taXJyb3IgKipzdGF0dXMpOworCisvKiBQYXJzZSBwYXJhbXMgZnJvbSBTVEFUVVMgY2FsbCBmb3IgcmFpZCB0YXJnZXQgKi8KK3N0cnVjdCBkbV9zdGF0dXNfcmFpZCB7CisJdWludDY0X3QgcmVzZXJ2ZWQ7CisJdWludDY0X3QgdG90YWxfcmVnaW9uczsJCS8qIHNlY3RvcnMgKi8KKwl1aW50NjRfdCBpbnN5bmNfcmVnaW9uczsJLyogc2VjdG9ycyAqLworCXVpbnQ2NF90IG1pc21hdGNoX2NvdW50OworCXVpbnQzMl90IGRldl9jb3VudDsKKwljaGFyICpyYWlkX3R5cGU7CisJY2hhciAqZGV2X2hlYWx0aDsKKwljaGFyICpzeW5jX2FjdGlvbjsKK307CisKK2ludCBkbV9nZXRfc3RhdHVzX3JhaWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcGFyYW1zLAorCQkgICAgICAgc3RydWN0IGRtX3N0YXR1c19yYWlkICoqc3RhdHVzKTsKKworLyogUGFyc2UgcGFyYW1zIGZyb20gU1RBVFVTIGNhbGwgZm9yIGNhY2hlIHRhcmdldCAqLworc3RydWN0IGRtX3N0YXR1c19jYWNoZSB7CisJdWludDY0X3QgdmVyc2lvbjsgIC8qIHplcm8gZm9yIG5vdyAqLworCisJdWludDMyX3QgbWV0YWRhdGFfYmxvY2tfc2l6ZTsgICAvKiBpbiA1MTJCIHNlY3RvcnMgKi8KKwl1aW50MzJfdCBibG9ja19zaXplOyAgICAgICAgICAgIC8qIEFLQSAnY2h1bmtfc2l6ZScgKi8KKworCXVpbnQ2NF90IG1ldGFkYXRhX3VzZWRfYmxvY2tzOworCXVpbnQ2NF90IG1ldGFkYXRhX3RvdGFsX2Jsb2NrczsKKworCXVpbnQ2NF90IHVzZWRfYmxvY2tzOworCXVpbnQ2NF90IGRpcnR5X2Jsb2NrczsKKwl1aW50NjRfdCB0b3RhbF9ibG9ja3M7CisKKwl1aW50NjRfdCByZWFkX2hpdHM7CisJdWludDY0X3QgcmVhZF9taXNzZXM7CisJdWludDY0X3Qgd3JpdGVfaGl0czsKKwl1aW50NjRfdCB3cml0ZV9taXNzZXM7CisKKwl1aW50NjRfdCBkZW1vdGlvbnM7CisJdWludDY0X3QgcHJvbW90aW9uczsKKworCXVpbnQ2NF90IGZlYXR1cmVfZmxhZ3M7CisKKwlpbnQgY29yZV9hcmdjOworCWNoYXIgKipjb3JlX2FyZ3Y7CisKKwljaGFyICpwb2xpY3lfbmFtZTsKKwlpbnQgcG9saWN5X2FyZ2M7CisJY2hhciAqKnBvbGljeV9hcmd2OworCisJdW5zaWduZWQgZXJyb3IgOiAxOwkJLyogZGV0ZWN0ZWQgZXJyb3IgKHN3aXRjaGVzIHRvIGZhaWwgc29vbikgKi8KKwl1bnNpZ25lZCBmYWlsIDogMTsJCS8qIGFsbCBJL08gZmFpbHMgKi8KKwl1bnNpZ25lZCBuZWVkc19jaGVjayA6IDE7CS8qIG1ldGFkYXRhIG5lZWRzIGNoZWNrICovCisJdW5zaWduZWQgcmVhZF9vbmx5IDogMTsJCS8qIG1ldGFkYXRhIG1heSBub3QgYmUgY2hhbmdlZCAqLworCXVpbnQzMl90IHJlc2VydmVkIDogMjg7Cit9OworCitpbnQgZG1fZ2V0X3N0YXR1c19jYWNoZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXJhbXMsCisJCQlzdHJ1Y3QgZG1fc3RhdHVzX2NhY2hlICoqc3RhdHVzKTsKKworLyoKKyAqIFBhcnNlIHBhcmFtcyBmcm9tIFNUQVRVUyBjYWxsIGZvciBzbmFwc2hvdCB0YXJnZXQKKyAqCisgKiBTbmFwc2hvdCB0YXJnZXQncyBmb3JtYXQ6CisgKiA8PSAxLjcuMDogPHVzZWRfc2VjdG9ycz4vPHRvdGFsX3NlY3RvcnM+CisgKiA+PSAxLjguMDogPHVzZWRfc2VjdG9ycz4vPHRvdGFsX3NlY3RvcnM+IDxtZXRhZGF0YV9zZWN0b3JzPgorICovCitzdHJ1Y3QgZG1fc3RhdHVzX3NuYXBzaG90IHsKKwl1aW50NjRfdCB1c2VkX3NlY3RvcnM7ICAgICAgICAgIC8qIGluIDUxMmIgdW5pdHMgKi8KKwl1aW50NjRfdCB0b3RhbF9zZWN0b3JzOworCXVpbnQ2NF90IG1ldGFkYXRhX3NlY3RvcnM7CisJdW5zaWduZWQgaGFzX21ldGFkYXRhX3NlY3RvcnMgOiAxOyAvKiBzZXQgd2hlbiBtZXRhZGF0YV9zZWN0b3JzIGlzIHByZXNlbnQgKi8KKwl1bnNpZ25lZCBpbnZhbGlkIDogMTsJCS8qIHNldCB3aGVuIHNuYXBzaG90IGlzIGludmFsaWRhdGVkICovCisJdW5zaWduZWQgbWVyZ2VfZmFpbGVkIDogMTsJLyogc2V0IHdoZW4gc25hcHNob3QgbWVyZ2UgZmFpbGVkICovCisJdW5zaWduZWQgb3ZlcmZsb3cgOiAxOwkJLyogc2V0IHdoZW4gc25hcHNob3Qgb3ZlcmZsb3dzICovCit9OworCitpbnQgZG1fZ2V0X3N0YXR1c19zbmFwc2hvdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXJhbXMsCisJCQkgICBzdHJ1Y3QgZG1fc3RhdHVzX3NuYXBzaG90ICoqc3RhdHVzKTsKKworLyogUGFyc2UgcGFyYW1zIGZyb20gU1RBVFVTIGNhbGwgZm9yIHRoaW5fcG9vbCB0YXJnZXQgKi8KK3R5cGVkZWYgZW51bSB7CisJRE1fVEhJTl9ESVNDQVJEU19JR05PUkUsCisJRE1fVEhJTl9ESVNDQVJEU19OT19QQVNTRE9XTiwKKwlETV9USElOX0RJU0NBUkRTX1BBU1NET1dOCit9IGRtX3RoaW5fZGlzY2FyZHNfdDsKKworc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgeworCXVpbnQ2NF90IHRyYW5zYWN0aW9uX2lkOworCXVpbnQ2NF90IHVzZWRfbWV0YWRhdGFfYmxvY2tzOworCXVpbnQ2NF90IHRvdGFsX21ldGFkYXRhX2Jsb2NrczsKKwl1aW50NjRfdCB1c2VkX2RhdGFfYmxvY2tzOworCXVpbnQ2NF90IHRvdGFsX2RhdGFfYmxvY2tzOworCXVpbnQ2NF90IGhlbGRfbWV0YWRhdGFfcm9vdDsKKwl1aW50MzJfdCByZWFkX29ubHk7CQkvKiBtZXRhZGF0YSBtYXkgbm90IGJlIGNoYW5nZWQgKi8KKwlkbV90aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7CisJdWludDMyX3QgZmFpbCA6IDE7CQkvKiBhbGwgSS9PIGZhaWxzICovCisJdWludDMyX3QgZXJyb3JfaWZfbm9fc3BhY2UgOiAxOwkvKiBvdGhlcndpc2UgcXVldWVfaWZfbm9fc3BhY2UgKi8KKwl1aW50MzJfdCBvdXRfb2ZfZGF0YV9zcGFjZSA6IDE7CS8qIG1ldGFkYXRhIG1heSBiZSBjaGFuZ2VkLCBidXQgZGF0YSBtYXkgbm90IGJlIGFsbG9jYXRlZCAobm8gcncpICovCisJdWludDMyX3QgbmVlZHNfY2hlY2sgOiAxOwkvKiBtZXRhZGF0YSBuZWVkcyBjaGVjayAqLworCXVpbnQzMl90IGVycm9yIDogMTsJCS8qIGRldGVjdGVkIGVycm9yIChzd2l0Y2hlcyB0byBmYWlsIHNvb24pICovCisJdWludDMyX3QgcmVzZXJ2ZWQgOiAyNzsKK307CisKK2ludCBkbV9nZXRfc3RhdHVzX3RoaW5fcG9vbChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXJhbXMsCisJCQkgICAgc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKipzdGF0dXMpOworCisvKiBQYXJzZSBwYXJhbXMgZnJvbSBTVEFUVVMgY2FsbCBmb3IgdGhpbiB0YXJnZXQgKi8KK3N0cnVjdCBkbV9zdGF0dXNfdGhpbiB7CisJdWludDY0X3QgbWFwcGVkX3NlY3RvcnM7CisJdWludDY0X3QgaGlnaGVzdF9tYXBwZWRfc2VjdG9yOworCXVpbnQzMl90IGZhaWwgOiAxOyAgICAgICAgICAgICAgLyogVGhpbiB2b2x1bWUgZmFpbHMgSS9PICovCisJdWludDMyX3QgcmVzZXJ2ZWQgOiAzMTsKK307CisKK2ludCBkbV9nZXRfc3RhdHVzX3RoaW4oc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcGFyYW1zLAorCQkgICAgICAgc3RydWN0IGRtX3N0YXR1c190aGluICoqc3RhdHVzKTsKKworLyoKKyAqIGRldmljZS1tYXBwZXIgc3RhdGlzdGljcyBzdXBwb3J0CisgKi8KKworLyoKKyAqIFN0YXRpc3RpY3MgaGFuZGxlLgorICoKKyAqIE9wZXJhdGlvbnMgb24gZG1fc3RhdHMgb2JqZWN0cyBpbmNsdWRlIG1hbmFnaW5nIHN0YXRpc3RpY3MgcmVnaW9ucworICogYW5kIG9idGFpbmluZyBhbmQgbWFuaXB1bGF0aW5nIGN1cnJlbnQgY291bnRlciB2YWx1ZXMgZnJvbSB0aGUKKyAqIGtlcm5lbC4gTWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gcmV0dXJuIGJhaXNjIGNvdW50IHZhbHVlcyBhbmQgdG8KKyAqIGRlcml2ZSB0aW1lLWJhc2VkIG1ldHJpY3Mgd2hlbiBhIHN1aXRhYmxlIGludGVydmFsIGVzdGltYXRlIGlzCisgKiBwcm92aWRlZC4KKyAqCisgKiBJbnRlcm5hbGx5IHRoZSBkbV9zdGF0cyBoYW5kbGUgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgdGFibGUgb2Ygb25lCisgKiBvciBtb3JlIGRtX3N0YXRzX3JlZ2lvbiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgcmVnaW9ucyByZWdpc3RlcmVkCisgKiB3aXRoIHRoZSBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKCkgbWV0aG9kLiBUaGVzZSBpbiB0dXJuIHBvaW50IHRvIGEKKyAqIHRhYmxlIG9mIG9uZSBvciBtb3JlIGRtX3N0YXRzX2NvdW50ZXJzIG9iamVjdHMgY29udGFpbmluZyB0aGUKKyAqIGNvdW50ZXIgc2V0cyBmb3IgZWFjaCBkZWZpbmVkIGFyZWEgd2l0aGluIHRoZSByZWdpb246CisgKgorICogZG1fc3RhdHMtPmRtX3N0YXRzX3JlZ2lvbltucl9yZWdpb25zXS0+ZG1fc3RhdHNfY291bnRlcnNbbnJfYXJlYXNdCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byB0aGUgbGlicmFyeSBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUKKyAqIHZlcnNpb25zOiBhbGwgdXNlcnMgc2hvdWxkIG1ha2UgdXNlIG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGFuZCB0cmVhdAorICogdGhlIGRtX3N0YXRzIHR5cGUgYXMgYW4gb3BhcXVlIGhhbmRsZS4KKyAqCisgKiBSZWdpb25zIGFuZCBjb3VudGVyIHNldHMgYXJlIHN0b3JlZCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHJlZ2lvbl9pZC4KKyAqIERlcGVuZGluZyBvbiByZWdpb24gc3BlY2lmaWNhdGlvbnMgYW5kIHRoZSBzZXF1ZW5jZSBvZiBjcmVhdGUgYW5kCisgKiBkZWxldGUgb3BlcmF0aW9ucyB0aGlzIG1heSBub3QgY29ycmVzcG9uZCB0byBpbmNyZWFzaW5nIHNlY3RvcgorICogbnVtYmVyOiB1c2VycyBvZiB0aGUgbGlicmFyeSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UKKyAqIHVubGVzcyByZWdpb24gY3JlYXRpb24gaXMgZGVsaWJlcmF0ZWx5IG1hbmFnZWQgdG8gZW5zdXJlIHRoaXMgKGJ5CisgKiBhbHdheXMgY3JlYXRpbmcgcmVnaW9ucyBpbiBzdHJpY3Qgb3JkZXIgb2YgYXNjZW5kaW5nIHNlY3RvciBhZGRyZXNzKS4KKyAqCisgKiBSZWdpb25zIG1heSBhbHNvIG92ZXJsYXAgc28gdGhlIHNhbWUgc2VjdG9yIHJhbmdlIG1heSBiZSBpbmNsdWRlZCBpbgorICogbW9yZSB0aGFuIG9uZSByZWdpb24gb3IgYXJlYTogYXBwbGljYXRpb25zIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsCisgKiB3aXRoIHRoaXMgb3IgbWFuYWdlIHJlZ2lvbnMgc3VjaCB0aGF0IGl0IGRvZXMgbm90IG9jY3VyLgorICovCitzdHJ1Y3QgZG1fc3RhdHM7CisKKy8qCisgKiBIaXN0b2dyYW0gaGFuZGxlLgorICoKKyAqIEEgaGlzdG9ncmFtIG9iamVjdCByZXByZXNlbnRzIHRoZSBsYXRlbmN5IGhpc3RvZ3JhbSB2YWx1ZXMgYW5kIGJpbgorICogYm91bmRhcmllcyBvZiB0aGUgaGlzdG9ncmFtIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgYXJlYS4KKyAqCisgKiBPcGVyYXRpb25zIG9uIHRoZSBoYW5kbGUgYWxsb3cgdGhlIG51bWJlciBvZiBiaW5zLCBiaW4gYm91bmRhcmllcywKKyAqIGNvdW50cyBhbmQgcmVsYXRpdmUgcHJvcG9ydGlvbnMgdG8gYmUgb2J0YWluZWQgYXMgd2VsbCBhcyB0aGUKKyAqIGNvbnZlcnNpb24gb2YgYSBoaXN0b2dyYW0gb3IgaXRzIGJvdW5kcyB0byBhIGNvbXBhY3Qgc3RyaW5nCisgKiByZXByZXNlbnRhdGlvbi4KKyAqLworc3RydWN0IGRtX2hpc3RvZ3JhbTsKKworLyoKKyAqIEFsbG9jYXRlIGEgZG1fc3RhdHMgaGFuZGxlIHRvIHVzZSBmb3Igc3Vic2VxdWVudCBkZXZpY2UtbWFwcGVyCisgKiBzdGF0aXN0aWNzIG9wZXJhdGlvbnMuIEEgcHJvZ3JhbV9pZCBtYXkgYmUgc3BlY2lmaWVkIGFuZCB3aWxsIGJlCisgKiB1c2VkIGJ5IGRlZmF1bHQgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyBvbiB0aGlzIGhhbmRsZS4KKyAqCisgKiBJZiBwcm9ncmFtX2lkIGlzIE5VTEwgb3IgdGhlIGVtcHR5IHN0cmluZyBhIHByb2dyYW1faWQgd2lsbCBiZQorICogYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiAvcHJvYy9zZWxmL2NvbW0uCisgKi8KK3N0cnVjdCBkbV9zdGF0cyAqZG1fc3RhdHNfY3JlYXRlKGNvbnN0IGNoYXIgKnByb2dyYW1faWQpOworCisvKgorICogQmluZCBhIGRtX3N0YXRzIGhhbmRsZSB0byB0aGUgc3BlY2lmaWVkIGRldmljZSBtYWpvciBhbmQgbWlub3IKKyAqIHZhbHVlcy4gQW55IHByZXZpb3VzIGJpbmRpbmcgaXMgY2xlYXJlZCBhbmQgYW55IHByZWV4aXN0aW5nIGNvdW50ZXIKKyAqIGRhdGEgY29udGFpbmVkIGluIHRoZSBoYW5kbGUgaXMgcmVsZWFzZWQuCisgKi8KK2ludCBkbV9zdGF0c19iaW5kX2Rldm5vKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBpbnQgbWFqb3IsIGludCBtaW5vcik7CisKKy8qCisgKiBCaW5kIGEgZG1fc3RhdHMgaGFuZGxlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUuCisgKiBBbnkgcHJldmlvdXMgYmluZGluZyBpcyBjbGVhcmVkIGFuZCBhbnkgcHJlZXhpc3RpbmcgY291bnRlcgorICogZGF0YSBjb250YWluZWQgaW4gdGhlIGhhbmRsZSBpcyByZWxlYXNlZC4KKyAqLworaW50IGRtX3N0YXRzX2JpbmRfbmFtZShzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qCisgKiBCaW5kIGEgZG1fc3RhdHMgaGFuZGxlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlIFVVSUQuCisgKiBBbnkgcHJldmlvdXMgYmluZGluZyBpcyBjbGVhcmVkIGFuZCBhbnkgcHJlZXhpc3RpbmcgY291bnRlcgorICogZGF0YSBjb250YWluZWQgaW4gdGhlIGhhbmRsZSBpcyByZWxlYXNlZC4KKyAqLworaW50IGRtX3N0YXRzX2JpbmRfdXVpZChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqdXVpZCk7CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdGhlIHJ1bm5pbmcga2VybmVsIHN1cHBvcnRzIHRoZSBwcmVjaXNlX3RpbWVzdGFtcHMKKyAqIGZlYXR1cmUuIFByZXNlbmNlIG9mIHRoaXMgZmVhdHVyZSBhbHNvIGltcGxpZXMgaGlzdG9ncmFtIHN1cHBvcnQuCisgKiBUaGUgbGlicmFyeSB3aWxsIGNoZWNrIHRoaXMgY2FsbCBpbnRlcm5hbGx5IGFuZCBmYWlscyBhbnkgYXR0ZW1wdAorICogdG8gdXNlIG5hbm9zZWNvbmQgY291bnRlcnMgb3IgaGlzdG9ncmFtcyBvbiBrZXJuZWxzIHRoYXQgZmFpbCB0bworICogbWVldCB0aGlzIGNoZWNrLgorICovCitpbnQgZG1fbWVzc2FnZV9zdXBwb3J0c19wcmVjaXNlX3RpbWVzdGFtcHModm9pZCk7CisKKy8qCisgKiBQcmVjaXNlIHRpbWV0YW1wcyBhbmQgaGlzdG9ncmFtIHN1cHBvcnQuCisgKiAKKyAqIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBwcmVjaXNlX3RpbWVzdGFtcHMgYW5kIGhpc3RvZ3JhbSBzdXBwb3J0LgorICovCitpbnQgZG1fc3RhdHNfZHJpdmVyX3N1cHBvcnRzX3ByZWNpc2Uodm9pZCk7CitpbnQgZG1fc3RhdHNfZHJpdmVyX3N1cHBvcnRzX2hpc3RvZ3JhbSh2b2lkKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBoYXMgdGhlIHByZWNpc2VfdGltZXN0YW1wcyBmZWF0dXJlCisgKiBlbmFibGVkIChpLmUuIHByb2R1Y2VzIG5hbm9zZWNvbmQtcHJlY2lzaW9uIGNvdW50ZXIgdmFsdWVzKSBvciAwIGZvcgorICogYSByZWdpb24gdXNpbmcgdGhlIGRlZmF1bHQgbWlsaXNlY29uZCBwcmVjaXNpb24uCisgKi8KK2ludCBkbV9zdGF0c19nZXRfcmVnaW9uX3ByZWNpc2VfdGltZXN0YW1wcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkJICAgdWludDY0X3QgcmVnaW9uX2lkKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGUgcmVnaW9uIGF0IHRoZSBjdXJyZW50IGN1cnNvciBsb2NhdGlvbiBoYXMgdGhlCisgKiBwcmVjaXNlX3RpbWVzdGFtcHMgZmVhdHVyZSBlbmFibGVkIChpLmUuIHByb2R1Y2VzCisgKiBuYW5vc2Vjb25kLXByZWNpc2lvbiBjb3VudGVyIHZhbHVlcykgb3IgMCBmb3IgYSByZWdpb24gdXNpbmcgdGhlCisgKiBkZWZhdWx0IG1pbGlzZWNvbmQgcHJlY2lzaW9uLgorICovCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX3ByZWNpc2VfdGltZXN0YW1wcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKyNkZWZpbmUgRE1fU1RBVFNfQUxMX1BST0dSQU1TICIiCisvKgorICogUGFyc2UgdGhlIHJlc3BvbnNlIGZyb20gYSBAc3RhdHNfbGlzdCBtZXNzYWdlLiBkbV9zdGF0c19saXN0IHdpbGwKKyAqIGFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgZG1fc3RhdHMgYW5kIGRtX3N0YXRzIHJlZ2lvbiBzdHJ1Y3R1cmVzIGZyb20KKyAqIHRoZSBlbWJlZGRlZCBkbV9wb29sLiBObyBjb3VudGVyIGRhdGEgd2lsbCBiZSBvYnRhaW5lZCAodGhlIGNvdW50ZXJzCisgKiBtZW1iZXJzIG9mIGRtX3N0YXRzX3JlZ2lvbiBvYmplY3RzIGFyZSBzZXQgdG8gTlVMTCkuCisgKgorICogQSBwcm9ncmFtX2lkIG1heSBvcHRpb25hbGx5IGJlIHN1cHBsaWVkOyBpZiB0aGUgYXJndW1lbnQgaXMgbm9uLU5VTEwKKyAqIG9ubHkgcmVnaW9ucyB3aXRoIGEgbWF0Y2hpbmcgcHJvZ3JhbV9pZCB2YWx1ZSB3aWxsIGJlIGNvbnNpZGVyZWQuIElmCisgKiB0aGUgYXJndW1lbnQgaXMgTlVMTCB0aGVuIHRoZSBkZWZhdWx0IHByb2dyYW1faWQgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogZG1fc3RhdHMgaGFuZGxlIHdpbGwgYmUgdXNlZC4gUGFzc2luZyB0aGUgc3BlY2lhbCB2YWx1ZQorICogRE1fU1RBVFNfQUxMX1BST0dSQU1TIHdpbGwgY2F1c2UgYWxsIHJlZ2lvbnMgdG8gYmUgcXVlcmllZAorICogcmVnYXJkbGVzcyBvZiByZWdpb24gcHJvZ3JhbV9pZC4KKyAqLworaW50IGRtX3N0YXRzX2xpc3Qoc3RydWN0IGRtX3N0YXRzICpkbXMsIGNvbnN0IGNoYXIgKnByb2dyYW1faWQpOworCisjZGVmaW5lIERNX1NUQVRTX1JFR0lPTlNfQUxMIFVJTlQ2NF9NQVgKKy8qCisgKiBQb3B1bGF0ZSBhIGRtX3N0YXRzIG9iamVjdCB3aXRoIHN0YXRpc3RpY3MgZm9yIG9uZSBvciBtb3JlIHJlZ2lvbnMgb2YKKyAqIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICoKKyAqIEEgcHJvZ3JhbV9pZCBtYXkgb3B0aW9uYWxseSBiZSBzdXBwbGllZDsgaWYgdGhlIGFyZ3VtZW50IGlzIG5vbi1OVUxMCisgKiBvbmx5IHJlZ2lvbnMgd2l0aCBhIG1hdGNoaW5nIHByb2dyYW1faWQgdmFsdWUgd2lsbCBiZSBjb25zaWRlcmVkLiBJZgorICogdGhlIGFyZ3VtZW50IGlzIE5VTEwgdGhlbiB0aGUgZGVmYXVsdCBwcm9ncmFtX2lkIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGRtX3N0YXRzIGhhbmRsZSB3aWxsIGJlIHVzZWQuIFBhc3NpbmcgdGhlIHNwZWNpYWwgdmFsdWUKKyAqIERNX1NUQVRTX0FMTF9QUk9HUkFNUyB3aWxsIGNhdXNlIGFsbCByZWdpb25zIHRvIGJlIHF1ZXJpZWQKKyAqIHJlZ2FyZGxlc3Mgb2YgcmVnaW9uIHByb2dyYW1faWQuCisgKgorICogUGFzc2luZyB0aGUgc3BlY2lhbCB2YWx1ZSBETV9TVEFUU19SRUdJT05TX0FMTCBhcyB0aGUgcmVnaW9uX2lkCisgKiBhcmd1bWVudCB3aWxsIGF0dGVtcHQgdG8gcmV0cmlldmUgYWxsIHJlZ2lvbnMgc2VsZWN0ZWQgYnkgdGhlCisgKiBwcm9ncmFtX2lkIGFyZ3VtZW50LgorICoKKyAqIElmIHJlZ2lvbl9pZCBpcyB1c2VkIHRvIHJlcXVlc3QgYSBzaW5nbGUgcmVnaW9uX2lkIHRvIGJlIHBvcHVsYXRlZAorICogdGhlIHByb2dyYW1faWQgaXMgaWdub3JlZC4KKyAqLworaW50IGRtX3N0YXRzX3BvcHVsYXRlKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICpwcm9ncmFtX2lkLAorCQkgICAgICB1aW50NjRfdCByZWdpb25faWQpOworCisvKgorICogQ3JlYXRlIGEgbmV3IHN0YXRpc3RpY3MgcmVnaW9uIG9uIHRoZSBkZXZpY2UgYm91bmQgdG8gZG1zLgorICoKKyAqIHN0YXJ0IGFuZCBsZW4gc3BlY2lmeSB0aGUgcmVnaW9uIHN0YXJ0IGFuZCBsZW5ndGggaW4gNTEyYiBzZWN0b3JzLgorICogUGFzc2luZyB6ZXJvIGZvciBib3RoIHN0YXJ0IGFuZCBsZW4gd2lsbCBjcmVhdGUgYSByZWdpb24gc3Bhbm5pbmcKKyAqIHRoZSBlbnRpcmUgZGV2aWNlLgorICoKKyAqIFN0ZXAgZGV0ZXJtaW5lcyBob3cgdG8gc3ViZGl2aWRlIHRoZSByZWdpb24gaW50byBkaXNjcmV0ZSBjb3VudGVyCisgKiBzZXRzOiBhIHBvc2l0aXZlIHZhbHVlIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiBhcmVhcyBpbnRvIHdoaWNoIHRoZQorICogcmVnaW9uIHNob3VsZCBiZSBzcGxpdCB3aGlsZSBhIG5lZ2F0aXZlIHZhbHVlIHdpbGwgc3BsaXQgdGhlIHJlZ2lvbgorICogaW50byBhIG51bWJlciBvZiBhcmVhcyBlcXVhbCB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2Ygc3RlcDoKKyAqCisgKiAtIGEgcmVnaW9uIHdpdGggb25lIGFyZWEgc3Bhbm5pbmcgdGhlIGVudGlyZSBkZXZpY2U6CisgKgorICogICBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKGRtcywgMCwgMCwgLTEsIHAsIGEpOworICoKKyAqIC0gYSByZWdpb24gd2l0aCBhcmVhcyBvZiAxTWlCOgorICoKKyAqICAgZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbihkbXMsIDAsIDAsIDEgPDwgMTEsIHAsIGEpOworICoKKyAqIC0gb25lIDFNaUIgcmVnaW9uIHN0YXJ0aW5nIGF0IDEwMjQgc2VjdG9ycyB3aXRoIHR3byBhcmVhczoKKyAqCisgKiAgIGRtX3N0YXRzX2NyZWF0ZV9yZWdpb24oZG1zLCAxMDI0LCAxIDw8IDExLCAtMiwgcCwgYSk7CisgKgorICogSWYgcHJlY2lzZSBpcyBub24temVybyBhdHRlbXB0IHRvIGNyZWF0ZSBhIHJlZ2lvbiB3aXRoIG5hbm9zZWNvbmQKKyAqIHByZWNpc2lvbiBjb3VudGVycyB1c2luZyB0aGUga2VybmVsIHByZWNpc2VfdGltZXN0YW1wcyBmZWF0dXJlLgorICoKKyAqIHByZWNpc2UgLSBBIGZsYWcgdG8gcmVxdWVzdCBuYW5vc2Vjb25kIHByZWNpc2lvbiBjb3VudGVycworICogdG8gYmUgdXNlZCBmb3IgdGhpcyByZWdpb24uCisgKgorICogaGlzdG9ncmFtX2JvdW5kcyAtIHNwZWNpZnkgdGhlIGJvdW5kYXJpZXMgb2YgYSBsYXRlbmN5IGhpc3RvZ3JhbSB0bworICogYmUgdHJhY2tlZCBmb3IgdGhlIHJlZ2lvbi4gVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGFzIGFuIGFycmF5IG9mCisgKiB1aW50NjRfdCB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvLiBWYWx1ZXMgbXVzdCBiZSBpbiBvcmRlciBvZiBhc2NlbmRpbmcKKyAqIG1hZ25pdHVkZSBhbmQgc3BlY2lmeSB0aGUgdXBwZXIgYm91bmRzIG9mIHN1Y2Nlc3NpdmUgaGlzdG9ncmFtIGJpbnMKKyAqIGluIG5hbm9zZWNvbmRzICh3aXRoIGFuIGltcGxpY2l0IGxvd2VyIGJvdW5kIG9mIHplcm8gb24gdGhlIGZpcnN0IGJpbgorICogYW5kIGFuIGltcGxpY2l0IHVwcGVyIGJvdW5kIG9mIGluZmluaXR5IG9uIHRoZSBmaW5hbCBiaW4pLiBGb3IKKyAqIGV4YW1wbGU6CisgKgorICogICB1aW50NjRfdCBib3VuZHNfYXJ5W10gPSB7IDEwMDAsIDIwMDAsIDMwMDAsIDAgfTsKKyAqCisgKiBTcGVjaWZpZXMgYSBoaXN0b2dyYW0gd2l0aCBmb3VyIGJpbnM6IDAtMTAwMG5zLCAxMDAwLTIwMDBucywKKyAqIDIwMDAtMzAwMG5zIGFuZCA+MzAwMG5zLgorICoKKyAqIFRoZSBzbWFsbGVzdCBsYXRlbmN5IHZhbHVlIHRoYXQgY2FuIGJlIHRyYWNrZWQgZm9yIGEgcmVnaW9uIG5vdCB1c2luZworICogcHJlY2lzZV90aW1lc3RhbXBzIGlzIDFtczogYXR0ZW1wdGluZyB0byBjcmVhdGUgYSByZWdpb24gd2l0aAorICogaGlzdG9ncmFtIGJvdW5kYXJpZXMgPCAxbXMgd2lsbCBjYXVzZSB0aGUgcHJlY2lzZV90aW1lc3RhbXBzIGZlYXR1cmUKKyAqIHRvIGJlIGVuYWJsZWQgZm9yIHRoYXQgcmVnaW9uIGF1dG9tYXRpY2FsbHkgaWYgaXQgd2FzIG5vdCByZXF1ZXN0ZWQKKyAqIGV4cGxpY2l0bHkuCisgKgorICogcHJvZ3JhbV9pZCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgYXJndW1lbnQgdGhhdCBpZGVudGlmaWVzIHRoZQorICogcHJvZ3JhbSBjcmVhdGluZyB0aGUgcmVnaW9uLiBJZiBwcm9ncmFtX2lkIGlzIE5VTEwgb3IgdGhlIGVtcHR5CisgKiBzdHJpbmcgdGhlIGRlZmF1bHQgcHJvZ3JhbV9pZCBzdG9yZWQgaW4gdGhlIGhhbmRsZSB3aWxsIGJlIHVzZWQuCisgKgorICogdXNlcl9kYXRhIGlzIGFuIG9wdGlvbmFsIHN0cmluZyBhcmd1bWVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZQorICogY29udGVudCBvZiB0aGUgYXV4X2RhdGEgZmllbGQgc3RvcmVkIHdpdGggdGhlIHN0YXRpc3RpY3MgcmVnaW9uIGJ5CisgKiB0aGUga2VybmVsLgorICoKKyAqIFRoZSBsaWJyYXJ5IG1heSBhbHNvIHVzZSB0aGlzIHNwYWNlIGludGVybmFsbHksIGZvciBleGFtcGxlLCB0bworICogc3RvcmUgYSBncm91cCBkZXNjcmlwdG9yIG9yIG90aGVyIG1ldGFkYXRhOiBpbiB0aGlzIGNhc2UgdGhlCisgKiBsaWJyYXJ5IHdpbGwgc3RyaXAgYW55IGludGVybmFsIGRhdGEgZmllbGRzIGZyb20gdGhlIHZhbHVlIGJlZm9yZQorICogaXQgaXMgcmV0dXJuZWQgdmlhIGEgY2FsbCB0byBkbV9zdGF0c19nZXRfcmVnaW9uX2F1eF9kYXRhKCkuCisgKgorICogVGhlIHVzZXIgZGF0YSBzdG9yZWQgaXMgbm90IGFjY2Vzc2VkIGJ5IHRoZSBsaWJyYXJ5IG9yIGtlcm5lbCBhbmQKKyAqIG1heSBiZSB1c2VkIHRvIHN0b3JlIGFuIGFyYml0cmFyeSBkYXRhIHdvcmQgKGVtYmVkZGVkIHdoaXRlc3BhY2UgaXMKKyAqIG5vdCBwZXJtaXR0ZWQpLgorICoKKyAqIEFuIGFwcGxpY2F0aW9uIHVzaW5nIGJvdGggdGhlIGxpYnJhcnkgYW5kIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCisgKiBAc3RhdHNfbGlzdCBkZXZpY2UtbWFwcGVyIG1lc3NhZ2UgbWF5IHNlZSB0aGUgaW50ZXJuYWwgdmFsdWVzIHN0b3JlZAorICogaW4gdGhpcyBmaWVsZCBieSB0aGUgbGlicmFyeS4gSW4gc3VjaCBjYXNlcyBhbnkgc3RyaW5nIHVwIHRvIGFuZAorICogaW5jbHVkaW5nIHRoZSBmaXJzdCAnIycgaW4gdGhlIGZpZWxkIG11c3QgYmUgdHJlYXRlZCBhcyBhbiBvcGFxdWUKKyAqIHZhbHVlIGFuZCBwcmVzZXJ2ZWQgYWNyb3NzIGFueSBleHRlcm5hbCBtb2RpZmljYXRpb24gb2YgYXV4X2RhdGEuCisgKgorICogVGhlIHJlZ2lvbl9pZCBvZiB0aGUgbmV3bHktY3JlYXRlZCByZWdpb24gaXMgcmV0dXJuZWQgaW4gKnJlZ2lvbl9pZAorICogaWYgaXQgaXMgbm9uLU5VTEwuCisgKi8KK2ludCBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqcmVnaW9uX2lkLAorCQkJICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbiwgaW50NjRfdCBzdGVwLAorCQkJICAgaW50IHByZWNpc2UsIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCSAgIGNvbnN0IGNoYXIgKnByb2dyYW1faWQsIGNvbnN0IGNoYXIgKnVzZXJfZGF0YSk7CisKKy8qCisgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBzdGF0aXN0aWNzIHJlZ2lvbi4gVGhpcyB3aWxsIGFsc28gbWFyayB0aGUKKyAqIHJlZ2lvbiBhcyBub3QtcHJlc2VudCBhbmQgZGlzY2FyZCBhbnkgZXhpc3Rpbmcgc3RhdGlzdGljcyBkYXRhLgorICovCitpbnQgZG1fc3RhdHNfZGVsZXRlX3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKTsKKworLyoKKyAqIENsZWFyIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljcyByZWdpb24uIFRoaXMgcmVxdWVzdHMgdGhlIGtlcm5lbCB0bworICogemVybyBhbGwgY291bnRlciB2YWx1ZXMgKGV4Y2VwdCBpbi1mbGlnaHQgSS9PKS4gTm90ZSB0aGF0IHRoaXMKKyAqIG9wZXJhdGlvbiBpcyBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byByZWFkcyBvZiB0aGUgY291bnRlcnM7IGFueSBJTworICogZXZlbnRzIG9jY3VycmluZyBiZXR3ZWVuIHRoZSBsYXN0IHByaW50IG9wZXJhdGlvbiBhbmQgdGhlIGNsZWFyIHdpbGwKKyAqIGJlIGxvc3QuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgdXNpbmcgdGhlIGF0b21pYyBwcmludC1hbmQtY2xlYXIKKyAqIGZ1bmN0aW9uIG9mIHRoZSBkbV9zdGF0c19wcmludF9yZWdpb24oKSBjYWxsIG9yIGJ5IHVzaW5nIHRoZSBoaWdoZXIKKyAqIGxldmVsIGRtX3N0YXRzX3BvcHVsYXRlKCkgaW50ZXJmYWNlLgorICovCitpbnQgZG1fc3RhdHNfY2xlYXJfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCByZWdpb25faWQpOworCisvKgorICogUHJpbnQgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljcyByZWdpb24KKyAqIGFuZCByZXR1cm4gdGhlbSBhcyBhIHN0cmluZy4gVGhlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyBidWZmZXIgd2lsbAorICogYmUgYWxsb2NhdGVkIGZyb20gdGhlIGRtX3N0YXRzIGhhbmRsZSdzIHByaXZhdGUgcG9vbCBhbmQgc2hvdWxkIGJlCisgKiByZXR1cm5lZCBieSBjYWxsaW5nIGRtX3N0YXRzX2J1ZmZlcl9kZXN0cm95KCkgd2hlbiBubyBsb25nZXIKKyAqIHJlcXVpcmVkLiBUaGUgcG9pbnRlciB3aWxsIGJlY29tZSBpbnZhbGlkIGZvbGxvd2luZyBhbnkgY2FsbCB0aGF0CisgKiBjbGVhcnMgb3IgcmVpbml0aWFsaXplcyB0aGUgaGFuZGxlIChkZXN0cm95LCBsaXN0LCBwb3B1bGF0ZSwgYmluZCkuCisgKgorICogVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRoYXQgd2lzaCB0byBhY2Nlc3MgdGhlIHJhdyBtZXNzYWdlIHJlc3BvbnNlCisgKiB0byBvYnRhaW4gaXQgdmlhIGEgZG1fc3RhdHMgaGFuZGxlOyBubyBwYXJzaW5nIG9mIHRoZSB0ZXh0dWFsIGNvdW50ZXIKKyAqIGRhdGEgaXMgY2FycmllZCBvdXQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBNb3N0IHVzZXJzIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRtX3N0YXRzX3BvcHVsYXRlKCkgY2FsbAorICogaW5zdGVhZCBzaW5jZSB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBwYXJzZSB0aGUgc3RhdGlzdGljcyBkYXRhIGludG8KKyAqIG51bWVyaWMgZm9ybSBhY2Nlc3NpYmxlIHZpYSB0aGUgZG1fc3RhdHNfZ2V0XyooKSBjb3VudGVyIGFjY2VzcworICogbWV0aG9kcy4KKyAqCisgKiBBIHN1YnNldCBvZiB0aGUgZGF0YSBsaW5lcyBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldHRpbmcgdGhlCisgKiBzdGFydF9saW5lIGFuZCBudW1fbGluZXMgcGFyYW1ldGVycy4gSWYgYm90aCBhcmUgemVybyBhbGwgZGF0YQorICogbGluZXMgYXJlIHJldHVybmVkLgorICoKKyAqIElmIHRoZSBjbGVhciBwYXJhbWV0ZXIgaXMgbm9uLXplcm8gdGhlIG9wZXJhdGlvbiB3aWxsIGFsc28KKyAqIGF0b21pY2FsbHkgcmVzZXQgYWxsIGNvdW50ZXIgdmFsdWVzIHRvIHplcm8gKGV4Y2VwdCBpbi1mbGlnaHQgSU8pLgorICovCitjaGFyICpkbV9zdGF0c19wcmludF9yZWdpb24oc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCSAgICB1bnNpZ25lZCBzdGFydF9saW5lLCB1bnNpZ25lZCBudW1fbGluZXMsCisJCQkgICAgdW5zaWduZWQgY2xlYXIpOworCisvKgorICogRGVzdHJveSBhIHN0YXRpc3RpY3MgcmVzcG9uc2UgYnVmZmVyIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvCisgKiBkbV9zdGF0c19wcmludF9yZWdpb24oKS4KKyAqLwordm9pZCBkbV9zdGF0c19idWZmZXJfZGVzdHJveShzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY2hhciAqYnVmZmVyKTsKKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGluIGEgZG1fc3RhdHMgaGFuZGxlCisgKiBmb2xsb3dpbmcgYSBkbV9zdGF0c19saXN0KCkgb3IgZG1fc3RhdHNfcG9wdWxhdGUoKSBjYWxsLgorICoKKyAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgcmVnaW9ucyB2aXNpYmxlIHdpdGggdGhlCisgKiBwcm9nYW1faWQgdmFsdWUgdXNlZCBmb3IgdGhlIGxpc3Qgb3IgcG9wdWxhdGUgb3BlcmF0aW9uIGFuZCBtYXkgbm90IGJlCisgKiBlcXVhbCB0byB0aGUgaGlnaGVzdCBwcmVzZW50IHJlZ2lvbl9pZCAoZWl0aGVyIGR1ZSB0byBwcm9ncmFtX2lkCisgKiBmaWx0ZXJpbmcgb3IgZ2FwcyBpbiB0aGUgc2VxdWVuY2Ugb2YgcmVnaW9uX2lkIHZhbHVlcykuCisgKgorICogQWx3YXlzIHJldHVybnMgemVybyBvbiBhbiBlbXB0eSBoYW5kbGUuCisgKi8KK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9ucl9yZWdpb25zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGdyb3VwcyBjb250YWluZWQgaW4gYSBkbV9zdGF0cyBoYW5kbGUKKyAqIGZvbGxvd2luZyBhIGRtX3N0YXRzX2xpc3QoKSBvciBkbV9zdGF0c19wb3B1bGF0ZSgpIGNhbGwuCisgKgorICogVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBncm91cHMgdmlzaWJsZSB3aXRoIHRoZQorICogcHJvZ2FtX2lkIHZhbHVlIHVzZWQgZm9yIHRoZSBsaXN0IG9yIHBvcHVsYXRlIG9wZXJhdGlvbiBhbmQgbWF5IG5vdCBiZQorICogZXF1YWwgdG8gdGhlIGhpZ2hlc3QgcHJlc2VudCBncm91cF9pZCAoZWl0aGVyIGR1ZSB0byBwcm9ncmFtX2lkCisgKiBmaWx0ZXJpbmcgb3IgZ2FwcyBpbiB0aGUgc2VxdWVuY2Ugb2YgZ3JvdXBfaWQgdmFsdWVzKS4KKyAqCisgKiBBbHdheXMgcmV0dXJucyB6ZXJvIG9uIGFuIGVtcHR5IGhhbmRsZS4KKyAqLwordWludDY0X3QgZG1fc3RhdHNfZ2V0X25yX2dyb3Vwcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgcmVnaW9uX2lkIGlzIHByZXNlbnQgaW4gdGhpcyBkbV9zdGF0cyBoYW5kbGUuCisgKi8KK2ludCBkbV9zdGF0c19yZWdpb25fcHJlc2VudChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKTsKKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmVhcyAoY291bnRlciBzZXRzKSBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZAorICogcmVnaW9uX2lkIG9mIHRoZSBzdXBwbGllZCBkbV9zdGF0cyBoYW5kbGUuCisgKi8KK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9yZWdpb25fbnJfYXJlYXMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkKTsKKworLyoKKyAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBhcmVhcyAoY291bnRlciBzZXRzKSBpbiBhbGwgcmVnaW9ucyBvZiB0aGUKKyAqIGdpdmVuIGRtX3N0YXRzIG9iamVjdC4KKyAqLwordWludDY0X3QgZG1fc3RhdHNfZ2V0X25yX2FyZWFzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKKworLyoKKyAqIFRlc3Qgd2hldGhlciBncm91cF9pZCBpcyBwcmVzZW50IGluIHRoaXMgZG1fc3RhdHMgaGFuZGxlLgorICovCitpbnQgZG1fc3RhdHNfZ3JvdXBfcHJlc2VudChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgZ3JvdXBfaWQpOworCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYmlucyBpbiB0aGUgaGlzdG9ncmFtIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICogc3BlY2lmaWVkIHJlZ2lvbiBvciB6ZXJvIGlmIG5vIGhpc3RvZ3JhbSBzcGVjaWZpY2F0aW9uIGlzIGNvbmZpZ3VyZWQuCisgKiBWYWxpZCBmb2xsb3dpbmcgYSBkbV9zdGF0c19saXN0KCkgb3IgZG1fc3RhdHNfcG9wdWxhdGUoKSBvcGVyYXRpb24uCisgKi8KK2ludCBkbV9zdGF0c19nZXRfcmVnaW9uX25yX2hpc3RvZ3JhbV9iaW5zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQkgIHVpbnQ2NF90IHJlZ2lvbl9pZCk7CisKKy8qCisgKiBQYXJzZSBhIGhpc3RvZ3JhbSBzdHJpbmcgd2l0aCBvcHRpb25hbCB1bml0IHN1ZmZpeGVzIGludG8gYQorICogZG1faGlzdG9ncmFtIGJvdW5kcyBkZXNjcmlwdGlvbi4KKyAqCisgKiBBIGhpc3RvZ3JhbSBzdHJpbmcgaXMgYSBzdHJpbmcgb2YgbnVtYmVycyAibjEsbjIsbjMsLi4uIiB0aGF0CisgKiByZXByZXNlbnQgdGhlIGJvdW5kYXJpZXMgb2YgYSBoaXN0b2dyYW0uIFRoZSBmaXJzdCBhbmQgZmluYWwgYmlucworICogaGF2ZSBpbXBsaWNpdCBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mIHplcm8gYW5kIGluZmluaXR5CisgKiByZXNwZWN0aXZlbHkgYW5kIGJvdW5kYXJ5IHZhbHVlcyBtdXN0IG9jY3VyIGluIG9yZGVyIG9mIGFzY2VuZGluZworICogbWFnbml0dWRlLiAgVW5sZXNzIGEgdW5pdCBzdWZmaXggaXMgZ2l2ZW4gYWxsIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluCisgKiBuYW5vc2Vjb25kcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgYm91bmRzX3N0cj0iMzAwLDYwMCw5MDAiLCB0aGUgcmVnaW9uIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCBhIGhpc3RvZ3JhbSBjb250YWluaW5nIGZvdXIgYmlucy4gRWFjaCByZXBvcnQgd2lsbCBpbmNsdWRlIGZvdXIKKyAqIG51bWJlcnMgYTpiOmM6ZC4gYSBpcyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgdG9vayBiZXR3ZWVuIDAgYW5kCisgKiAzMDBucyB0byBjb21wbGV0ZSwgYiBpcyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgdG9vayAzMDAtNjAwbnMgdG8KKyAqIGNvbXBsZXRlLCBjIGlzIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCB0b29rIDYwMC05MDBucyB0byBjb21wbGV0ZQorICogYW5kIGQgaXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IHRvb2sgbW9yZSB0aGFuIDkwMG5zIHRvCisgKiBjb21wbGV0ZS4KKyAqCisgKiBBbiBvcHRpb25hbCB1bml0IHN1ZmZpeCBvZiAncycsICdtcycsICd1cycsIG9yICducycgbWF5IGJlIHVzZWQgdG8KKyAqIHNwZWNpZnkgdW5pdHMgb2Ygc2Vjb25kcywgbWlsaXNlY29uZHMsIG1pY3Jvc2Vjb25kcywgb3IgbmFub3NlY29uZHM6CisgKgorICogICBib3VuZHNfc3RyPSIxbnMsMXVzLDFtcywxcyIKKyAqICAgYm91bmRzX3N0cj0iNTAwdXMsMW1zLDE1MDB1cywybXMiCisgKiAgIGJvdW5kc19zdHI9IjIwMG1zLDQwMG1zLDYwMG1zLDgwMG1zLDFzIgorICoKKyAqIFRoZSBzbWFsbGVzdCB2YWxpZCB1bml0IG9mIHRpbWUgZm9yIGEgaGlzdG9ncmFtIHNwZWNpZmljYXRpb24gZGVwZW5kcworICogb24gd2hldGhlciB0aGUgcmVnaW9uIHVzZXMgcHJlY2lzZSB0aW1lc3RhbXBzOiBmb3IgYSByZWdpb24gd2l0aCB0aGUKKyAqIGRlZmF1bHQgbWlsaXNlY29uZCBwcmVjaXNpb24gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGhpc3RvZ3JhbSBib3VuZGFyeQorICogbWFnbml0dWRlIGlzIG9uZSBtaWxpc2Vjb25kOiBhdHRlbXB0aW5nIHRvIHVzZSBhIGhpc3RvZ3JhbSB3aXRoIGEKKyAqIGJvdW5kYXJ5IGxlc3MgdGhhbiBvbmUgbWlsaXNlY29uZCB3aGVuIGNyZWF0aW5nIGEgcmVnaW9uIHdpbGwgY2F1c2UKKyAqIHRoZSByZWdpb24gdG8gYmUgY3JlYXRlZCB3aXRoIHRoZSBwcmVjaXNlX3RpbWVzdGFtcHMgZmVhdHVyZSBlbmFibGVkLgorICoKKyAqIE9uIHN1Y2VzcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkbV9oaXN0b2dyYW0gcmVwcmVzZW50aW5nIHRoZQorICogYm91bmRzIHZhbHVlcyBpcyByZXR1cm5lZCwgb3IgTlVMTCBpbiB0aGUgY2FzZSBvZiBlcnJvci4gVGhlIHJldHVybmVkCisgKiBwb2ludGVyIHNob3VsZCBiZSBmcmVlZCB1c2luZyBkbV9mcmVlKCkgd2hlbiBubyBsb25nZXIgcmVxdWlyZWQuCisgKi8KK3N0cnVjdCBkbV9oaXN0b2dyYW0gKmRtX2hpc3RvZ3JhbV9ib3VuZHNfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqYm91bmRzX3N0cik7CisKKy8qCisgKiBQYXJzZSBhIHplcm8gdGVybWluYXRlZCBhcnJheSBvZiB1aW50NjRfdCBpbnRvIGEgZG1faGlzdG9ncmFtIGJvdW5kcworICogZGVzY3JpcHRpb24uCisgKgorICogRWFjaCB2YWx1ZSBpbiB0aGUgYXJyYXkgc3BlY2lmaWVzIHRoZSB1cHBlciBib3VuZCBvZiBhIGJpbiBpbiB0aGUKKyAqIGxhdGVuY3kgaGlzdG9ncmFtIGluIG5hbm9zZWNvbmRzLiBWYWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nCisgKiBvcmRlciBvZiBtYWduaXR1ZGUuCisgKgorICogVGhlIHNtYWxsZXN0IHZhbGlkIHVuaXQgb2YgdGltZSBmb3IgYSBoaXN0b2dyYW0gc3BlY2lmaWNhdGlvbiBkZXBlbmRzCisgKiBvbiB3aGV0aGVyIHRoZSByZWdpb24gdXNlcyBwcmVjaXNlIHRpbWVzdGFtcHM6IGZvciBhIHJlZ2lvbiB3aXRoIHRoZQorICogZGVmYXVsdCBtaWxpc2Vjb25kIHByZWNpc2lvbiB0aGUgc21hbGxlc3QgcG9zc2libGUgaGlzdG9ncmFtIGJvdW5kYXJ5CisgKiBtYWduaXR1ZGUgaXMgb25lIG1pbGlzZWNvbmQ6IGF0dGVtcHRpbmcgdG8gdXNlIGEgaGlzdG9ncmFtIHdpdGggYQorICogYm91bmRhcnkgbGVzcyB0aGFuIG9uZSBtaWxpc2Vjb25kIHdoZW4gY3JlYXRpbmcgYSByZWdpb24gd2lsbCBjYXVzZQorICogdGhlIHJlZ2lvbiB0byBiZSBjcmVhdGVkIHdpdGggdGhlIHByZWNpc2VfdGltZXN0YW1wcyBmZWF0dXJlIGVuYWJsZWQuCisgKi8KK3N0cnVjdCBkbV9oaXN0b2dyYW0gKmRtX2hpc3RvZ3JhbV9ib3VuZHNfZnJvbV91aW50NjQoY29uc3QgdWludDY0X3QgKmJvdW5kcyk7CisKKy8qCisgKiBEZXN0cm95IHRoZSBoaXN0b2dyYW0gYm91bmRzIGFycmF5IG9idGFpbmVkIGZyb20gYSBjYWxsIHRvCisgKiBkbV9oaXN0b2dyYW1fYm91bmRzX2Zyb21fc3RyaW5nKCkuCisgKi8KK3ZvaWQgZG1faGlzdG9ncmFtX2JvdW5kc19kZXN0cm95KHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcyk7CisKKy8qCisgKiBEZXN0cm95IGEgZG1fc3RhdHMgb2JqZWN0IGFuZCBhbGwgYXNzb2NpYXRlZCByZWdpb25zLCBjb3VudGVyCisgKiBzZXRzIGFuZCBoaXN0b2dyYW1zLgorICovCit2b2lkIGRtX3N0YXRzX2Rlc3Ryb3koc3RydWN0IGRtX3N0YXRzICpkbXMpOworCisvKgorICogQ291bnRlciBzYW1wbGluZyBpbnRlcnZhbAorICovCisKKy8qCisgKiBTZXQgdGhlIHNhbXBsaW5nIGludGVydmFsIGZvciBjb3VudGVyIGRhdGEgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbgorICogZWl0aGVyIG5hbm9zZWNvbmRzIG9yIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBUaGUgaW50ZXJ2YWwgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGltZS1iYXNlZCBtZXRyaWNzIGZyb20gdGhlIGJhc2ljCisgKiBjb3VudGVyIGRhdGE6IGFuIGludGVydmFsIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUKKyAqIG1ldHJpYyBtZXRob2RzLgorICoKKyAqIEZvciBiZXN0IGFjY3VyYWN5IHRoZSBkdXJhdGlvbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIHVwZGF0ZWQgYXQgdGhlCisgKiBlbmQgb2YgZWFjaCBpbnRlcnZhbC4KKyAqCisgKiBBbGwgdmFsdWVzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uIGFuZCBhcmUKKyAqIGNvbnZlcnRlZCB0byBvciBmcm9tIG1zIHdoZW4gdGhlIG1pbGxpc2Vjb25kIGludGVyZmFjZXMgYXJlIHVzZWQuCisgKi8KK3ZvaWQgZG1fc3RhdHNfc2V0X3NhbXBsaW5nX2ludGVydmFsX25zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICAgICB1aW50NjRfdCBpbnRlcnZhbF9ucyk7CisKK3ZvaWQgZG1fc3RhdHNfc2V0X3NhbXBsaW5nX2ludGVydmFsX21zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICAgICB1aW50NjRfdCBpbnRlcnZhbF9tcyk7CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJlZCBzYW1wbGluZyBpbnRlcnZhbCBpbiBlaXRoZXIgbmFub3NlY29uZHMgb3IKKyAqIG1pbGxpc2Vjb25kcy4KKyAqLwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3NhbXBsaW5nX2ludGVydmFsX25zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9zYW1wbGluZ19pbnRlcnZhbF9tcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKy8qCisgKiBPdmVycmlkZSBwcm9ncmFtX2lkLiBUaGlzIG1heSBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAorICogcHJvZ3JhbV9pZCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgaGFuZGxlLiBJZiB0aGUgYWxsb3dfZW1wdHkgYXJndW1lbnQKKyAqIGlzIG5vbi16ZXJvIGEgTlVMTCBvciBlbXB0eSBwcm9ncmFtX2lkIGlzIHBlcm1pdHRlZC4KKyAqCisgKiBVc2Ugd2l0aCBjYXV0aW9uISBNb3N0IHVzZXJzIG9mIHRoZSBsaWJyYXJ5IHNob3VsZCBzZXQgYSB2YWxpZCwKKyAqIG5vbi1OVUxMIHByb2dyYW1faWQgZm9yIGV2ZXJ5IHN0YXRpc3RpY3MgcmVnaW9uIGNyZWF0ZWQuIEZhaWxpbmcgdG8KKyAqIGRvIHNvIG1heSByZXN1bHQgaW4gY29uZnVzaW5nIHN0YXRlIHdoZW4gbXVsdGlwbGUgcHJvZ3JhbXMgYXJlCisgKiBjcmVhdGluZyBhbmQgbWFuYWdpbmcgc3RhdGlzdGljcyByZWdpb25zLgorICoKKyAqIEFsbCB1c2VycyBvZiB0aGUgbGlicmFyeSBhcmUgZW5jb3VyYWdlZCB0byBjaG9vc2UgYW4gdW5hbWJpZ3VvdXMsCisgKiB1bmlxdWUgcHJvZ3JhbV9pZDogdGhpcyBjb3VsZCBiZSBiYXNlZCBvbiBQSUQgKGZvciBwcm9ncmFtcyB0aGF0CisgKiBjcmVhdGUsIHJlcG9ydCwgYW5kIGRlbGV0ZSByZWdpb25zIGluIGEgc2luZ2xlIHByb2Nlc3MpLCBzZXNzaW9uIGlkLAorICogZXhlY3V0YWJsZSBuYW1lLCBvciBzb21lIG90aGVyIGRpc3Rpbmd1aXNoaW5nIHN0cmluZy4KKyAqCisgKiBVc2Ugb2YgdGhlIGVtcHR5IHN0cmluZyBhcyBhIHByb2dyYW1faWQgZG9lcyBub3Qgc2ltcGxpZnkgdXNlIG9mIHRoZQorICogbGlicmFyeSBvciB0aGUgY29tbWFuZCBsaW5lIHRvb2xzIGFuZCB1c2Ugb2YgdGhpcyB2YWx1ZSBpcyBzdHJvbmdseQorICogZGlzY291cmFnZWQuCisgKi8KK2ludCBkbV9zdGF0c19zZXRfcHJvZ3JhbV9pZChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgaW50IGFsbG93X2VtcHR5LAorCQkJICAgIGNvbnN0IGNoYXIgKnByb2dyYW1faWQpOworCisvKgorICogUmVnaW9uIHByb3BlcnRpZXM6IHNpemUsIGxlbmd0aCAmIGFyZWFfbGVuLgorICoKKyAqIFJlZ2lvbiBzdGFydCBhbmQgbGVuZ3RoIGFyZSByZXR1cm5lZCBpbiB1bml0cyBvZiA1MTJiIGFzIHNwZWNpZmllZAorICogYXQgcmVnaW9uIGNyZWF0aW9uIHRpbWUuIFRoZSBhcmVhX2xlbiB2YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiBhcmVhcworICogaW50byB3aGljaCB0aGUgcmVnaW9uIGhhcyBiZWVuIHN1YmRpdmlkZWQuIEZvciByZWdpb25zIHdpdGggYSBzaW5nbGUKKyAqIGFyZWEgc3Bhbm5pbmcgdGhlIHJhbmdlIHRoaXMgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIHJlZ2lvbiBsZW5ndGguCisgKgorICogRm9yIHJlZ2lvbnMgY3JlYXRlZCB3aXRoIGEgc3BlY2lmaWVkIG51bWJlciBvZiBhcmVhcyB0aGUgdmFsdWUKKyAqIHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIGFyZWFzIGludG8gd2hpY2ggdGhlIGtlcm5lbCBkaXZpZGVkIHRoZQorICogcmVnaW9uIGV4Y2x1ZGluZyBhbnkgcm91bmRpbmcgb2YgdGhlIGxhc3QgYXJlYSBzaXplLiBUaGUgbnVtYmVyIG9mCisgKiBhcmVhcyBtYXkgYmUgb2J0YWluZWQgdXNpbmcgdGhlIGRtX3N0YXRzX25yX2FyZWFzX3JlZ2lvbigpIGNhbGwuCisgKgorICogQWxsIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdW5pdHMgb2YgNTEyYiBzZWN0b3JzLgorICovCitpbnQgZG1fc3RhdHNfZ2V0X3JlZ2lvbl9zdGFydChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKnN0YXJ0LAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9yZWdpb25fbGVuKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqbGVuLAorCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCk7CisKK2ludCBkbV9zdGF0c19nZXRfcmVnaW9uX2FyZWFfbGVuKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSB1aW50NjRfdCAqbGVuLCB1aW50NjRfdCByZWdpb25faWQpOworCisvKgorICogQXJlYSBwcm9wZXJ0aWVzOiBzdGFydCwgb2Zmc2V0IGFuZCBsZW5ndGguCisgKgorICogVGhlIGFyZWEgbGVuZ3RoIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgYXJlYSBsZW5ndGggb2YgdGhlIHJlZ2lvbgorICogdGhhdCBjb250YWlucyBpdCBhbmQgaXMgb2J0YWluZWQgZnJvbSBkbV9zdGF0c19nZXRfcmVnaW9uX2FyZWFfbGVuKCkuCisgKgorICogVGhlIHN0YXJ0IG9mIGFuIGFyZWEgaXMgYSBmdW5jdGlvbiBvZiB0aGUgYXJlYV9pZCBhbmQgdGhlIGNvbnRhaW5pbmcKKyAqIHJlZ2lvbidzIHN0YXJ0IGFuZCBhcmVhIGxlbmd0aDogaXQgZ2l2ZXMgdGhlIGFic29sdXRlIG9mZnNldCBpbnRvIHRoZQorICogY29udGFpbmluZyBkZXZpY2Ugb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJlYS4KKyAqCisgKiBUaGUgb2Zmc2V0IGV4cHJlc3NlcyB0aGUgYXJlYSdzIHJlbGF0aXZlIG9mZnNldCBpbnRvIHRoZSBjdXJyZW50CisgKiByZWdpb24uIEkuZS4gdGhlIGFyZWEgc3RhcnQgbWludXMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmluZworICogcmVnaW9uLgorICoKKyAqIEFsbCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHVuaXRzIG9mIDUxMmIgc2VjdG9ycy4KKyAqLworaW50IGRtX3N0YXRzX2dldF9hcmVhX3N0YXJ0KGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqc3RhcnQsCisJCQkgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9hcmVhX29mZnNldChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKm9mZnNldCwKKwkJCSAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworLyoKKyAqIFJldHJpZXZlIHByb2dyYW1faWQgYW5kIHVzZXIgYXV4X2RhdGEgZm9yIGEgc3BlY2lmaWMgcmVnaW9uLgorICoKKyAqIE9ubHkgdmFsaWQgZm9sbG93aW5nIGEgY2FsbCB0byBkbV9zdGF0c19saXN0KCkuCisgKi8KKworLyoKKyAqIFJldHJpZXZlIHByb2dyYW1faWQgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uLgorICoKKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQgc2VwYXJhdGVseSBmcm9tIHRoZQorICogZG1fc3RhdHMgaGFuZGxlIGJ1dCB3aWxsIGJlY29tZSBpbnZhbGlkIGFmdGVyIGEgZG1fc3RhdHNfZGVzdHJveSgpLAorICogZG1fc3RhdHNfbGlzdCgpLCBkbV9zdGF0c19wb3B1bGF0ZSgpLCBvciBkbV9zdGF0c19iaW5kKigpIG9mIHRoZQorICogaGFuZGxlIGZyb20gd2hpY2ggaXQgd2FzIG9idGFpbmVkLgorICovCitjb25zdCBjaGFyICpkbV9zdGF0c19nZXRfcmVnaW9uX3Byb2dyYW1faWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgIHVpbnQ2NF90IHJlZ2lvbl9pZCk7CisKKy8qCisgKiBSZXRyaWV2ZSB1c2VyIGF1eF9kYXRhIHNldCBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24uIFRoaXMgZnVuY3Rpb24KKyAqIHdpbGwgcmV0dXJuIGFueSBzdG9yZWQgdXNlciBhdXhfZGF0YSBhcyBhIHN0cmluZyBpbiB0aGUgbWVtb3J5CisgKiBwb2ludGVkIHRvIGJ5IHRoZSBhdXhfZGF0YSBhcmd1bWVudC4KKyAqCisgKiBBbnkgbGlicmFyeSBpbnRlcm5hbCBhdXhfZGF0YSBmaWVsZHMsIHN1Y2ggYXMgRE1TX0dST1VQIGRlc2NyaXB0b3JzLAorICogYXJlIHN0cmlwcGVkIGJlZm9yZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisgKgorICogVGhlIHJldHVybmVkIHBvaW50ZXIgZG9lcyBub3QgbmVlZCB0byBiZSBmcmVlZCBzZXBhcmF0ZWx5IGZyb20gdGhlCisgKiBkbV9zdGF0cyBoYW5kbGUgYnV0IHdpbGwgYmVjb21lIGludmFsaWQgYWZ0ZXIgYSBkbV9zdGF0c19kZXN0cm95KCksCisgKiBkbV9zdGF0c19saXN0KCksIGRtX3N0YXRzX3BvcHVsYXRlKCksIG9yIGRtX3N0YXRzX2JpbmQqKCkgb2YgdGhlCisgKiBoYW5kbGUgZnJvbSB3aGljaCBpdCB3YXMgb2J0YWluZWQuCisgKi8KK2NvbnN0IGNoYXIgKmRtX3N0YXRzX2dldF9yZWdpb25fYXV4X2RhdGEoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSB1aW50NjRfdCByZWdpb25faWQpOworCit0eXBlZGVmIGVudW0geworCURNX1NUQVRTX09CSkVDVF9UWVBFX05PTkUsCisJRE1fU1RBVFNfT0JKRUNUX1RZUEVfQVJFQSwKKwlETV9TVEFUU19PQkpFQ1RfVFlQRV9SRUdJT04sCisJRE1fU1RBVFNfT0JKRUNUX1RZUEVfR1JPVVAKK30gZG1fc3RhdHNfb2JqX3R5cGVfdDsKKworLyoKKyAqIFN0YXRpc3RpY3MgY3Vyc29yCisgKgorICogQSBkbV9zdGF0cyBoYW5kbGUgbWFpbnRhaW5zIGFuIG9wdGlvbmFsIGN1cnNvciBpbnRvIHRoZSBzdGF0aXN0aWNzCisgKiB0YWJsZXMgdGhhdCBpdCBzdG9yZXMuIEl0ZXJhdG9ycyBhcmUgcHJvdmlkZWQgdG8gdmlzaXQgZWFjaCByZWdpb24sCisgKiBhcmVhLCBvciBncm91cCBpbiBhIGhhbmRsZSBhbmQgYWNjZXNzb3IgbWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8KKyAqIG9idGFpbiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBvYmplY3QgYXQgdGhlIGN1cnJlbnQgY3Vyc29yCisgKiBwb3NpdGlvbi4KKyAqCisgKiBVc2luZyB0aGUgY3Vyc29yIHNpbXBsaWZpZXMgd2Fsa2luZyBhbGwgcmVnaW9ucyBvciBncm91cHMgd2hlbgorICogdGhlIHRhYmxlcyBhcmUgc3BhcnNlIChpLmUuIGNvbnRhaW5zIHNvbWUgcHJlc2VudCBhbmQgc29tZQorICogbm9uLXByZXNlbnQgcmVnaW9uX2lkIG9yIGdyb3VwX2lkIHZhbHVlcyBlaXRoZXIgZHVlIHRvIHByb2dyYW1faWQKKyAqIGZpbHRlcmluZyBvciB0aGUgb3JkZXJpbmcgb2YgcmVnaW9uIGFuZCBncm91cCBjcmVhdGlvbiBhbmQgZGVsZXRpb24pLgorICoKKyAqIFNpbXBsZSBtYWNyb3MgYXJlIHByb3ZpZGVkIHRvIHZpc2l0IGVhY2ggYXJlYSwgcmVnaW9uLCBvciBncm91cCwKKyAqIGNvbnRhaW5lZCBpbiBhIGhhbmRsZSBhbmQgYXBwbGljYXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGVzZQorICogd2hlcmUgcG9zc2libGUuCisgKi8KKworLyoKKyAqIFdhbGsgZmxhZ3MgYXJlIHVzZWQgdG8gaW5pdGlhbGlzZSBhIGRtX3N0YXRzIGhhbmRsZSdzIGN1cnNvciBjb250cm9sCisgKiBhbmQgdG8gc2VsZWN0IHJlZ2lvbiBvciBncm91cCBhZ2dyZWdhdGlvbiB3aGVuIGNhbGxpbmcgYSBtZXRyaWMgb3IKKyAqIGNvdW50ZXIgcHJvcGVydHkgbWV0aG9kIHdpdGggaW1tZWRpYXRlIGdyb3VwLCByZWdpb24sIGFuZCBhcmVhIElECisgKiB2YWx1ZXMuCisgKgorICogV2FsayBmbGFncyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlcm1vc3Qgd29yZCBvZiBhIHVpbnQ2NF90IHNvIHRoYXQKKyAqIGEgcmVnaW9uX2lkIG9yIGdyb3VwX2lkIG1heSBiZSBlbmNvZGVkIGluIHRoZSBsb3dlciBiaXRzLiBUaGlzCisgKiBhbGxvd3MgYW4gYWdncmVnYXRlIHJlZ2lvbl9pZCBvciBncm91cF9pZCB0byBiZSBzcGVjaWZpZWQgd2hlbgorICogcmV0cmlldmluZyBjb3VudGVyIG9yIG1ldHJpYyB2YWx1ZXMuCisgKgorICogRmxhZ3MgbWF5IGJlIE9ScmVkIHRvZ2V0aGVyIHdoZW4gdXNlZCB0byBpbml0aWFsaXNlIGEgZG1fc3RhdHNfd2FsazoKKyAqIHRoZSByZXN1bHRpbmcgd2FsayB3aWxsIHZpc2l0IGluc3RhbmNlIG9mIGVhY2ggdHlwZSBzcGVjaWZpZWQgYnkKKyAqIHRoZSBmbGFnIGNvbWJpbmF0aW9uLgorICovCisjZGVmaW5lIERNX1NUQVRTX1dBTEtfQVJFQSAgIDB4MTAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBETV9TVEFUU19XQUxLX1JFR0lPTiAweDIwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgRE1fU1RBVFNfV0FMS19HUk9VUCAgMHg0MDAwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgRE1fU1RBVFNfV0FMS19BTEwgICAgMHg3MDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIERNX1NUQVRTX1dBTEtfREVGQVVMVCAoRE1fU1RBVFNfV0FMS19BUkVBIHwgRE1fU1RBVFNfV0FMS19SRUdJT04pCisKKy8qCisgKiBTa2lwIHJlZ2lvbnMgZnJvbSBhIERNX1NUQVRTX1dBTEtfUkVHSU9OIHRoYXQgY29udGFpbiBvbmx5IGEgc2luZ2xlCisgKiBhcmVhOiBpbiB0aGlzIGNhc2UgdGhlIHJlZ2lvbidzIGFnZ3JlZ2F0ZSB2YWx1ZXMgYXJlIGlkZW50aWNhbCB0bworICogdGhlIHZhbHVlcyBvZiB0aGUgc2luZ2xlIGNvbnRhaW5lZCBhcmVhLiBTZXR0aW5nIHRoaXMgZmxhZyB3aWxsCisgKiBzdXBwcmVzcyB0aGVzZSBkdXBsaWNhdGUgZW50cmllcyBkdXJpbmcgYSBkbV9zdGF0c193YWxrXyogd2l0aCB0aGUKKyAqIERNX1NUQVRTX1dBTEtfUkVHSU9OIGZsYWcgc2V0LgorICovCisjZGVmaW5lIERNX1NUQVRTX1dBTEtfU0tJUF9TSU5HTEVfQVJFQSAgIDB4ODAwMDAwMDAwMDAwMFVMTAorCisvKgorICogSW5pdGlhbGlzZSB0aGUgY3Vyc29yIGNvbnRyb2wgb2YgYSBkbV9zdGF0cyBoYW5kbGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAqIHdhbGsgdHlwZShzKS4gSW5jbHVkaW5nIGEgd2FsayBmbGFnIGluIHRoZSBmbGFncyBhcmd1bWVudCB3aWxsIGNhdXNlCisgKiBhbnkgc3Vic2VxdWVudCB3YWxrIHRvIHZpc2l0IHRoYXQgdHlwZSBvZiBvYmplY3QgKHVudGlsIHRoZSBuZXh0CisgKiBjYWxsIHRvIGRtX3N0YXRzX3dhbGtfaW5pdCgpKS4KKyAqLworaW50IGRtX3N0YXRzX3dhbGtfaW5pdChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgZmxhZ3MpOworCisvKgorICogU2V0IHRoZSBjdXJzb3Igb2YgYSBkbV9zdGF0cyBoYW5kbGUgdG8gYWRkcmVzcyB0aGUgZmlyc3QgcHJlc2VudAorICogZ3JvdXAsIHJlZ2lvbiwgb3IgYXJlYSBvZiB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2Fsay4gSXQgaXMKKyAqIHZhbGlkIHRvIGF0dGVtcHQgdG8gd2FsayBhIE5VTEwgc3RhdHMgaGFuZGxlIG9yIGEgaGFuZGxlIGNvbnRhaW5pbmcKKyAqIG5vIHByZXNlbnQgcmVnaW9uczsgaW4gdGhpcyBjYXNlIGFueSBjYWxsIHRvIGRtX3N0YXRzX3dhbGtfbmV4dCgpCisgKiBiZWNvbWVzIGEgbm8tb3AgYW5kIGFsbCBjYWxscyB0byBkbV9zdGF0c193YWxrX2VuZCgpIHJldHVybiB0cnVlLgorICovCit2b2lkIGRtX3N0YXRzX3dhbGtfc3RhcnQoc3RydWN0IGRtX3N0YXRzICpkbXMpOworCisvKgorICogQWR2YW5jZSB0aGUgc3RhdGlzdGljcyBjdXJzb3IgdG8gdGhlIG5leHQgYXJlYSwgb3IgdG8gdGhlIG5leHQKKyAqIHByZXNlbnQgcmVnaW9uIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVnaW9uLiBJZiB0aGUgZW5kIG9mCisgKiB0aGUgcmVnaW9uLCBhcmVhLCBvciBncm91cCB0YWJsZXMgaXMgcmVhY2hlZCBhIHN1YnNlcXVlbnQgY2FsbCB0bworICogZG1fc3RhdHNfd2Fsa19lbmQoKSB3aWxsIHJldHVybiAxIGFuZCBkbV9zdGF0c19vYmplY3RfdHlwZSgpIGNhbGxlZAorICogb24gdGhlIGxvY2F0aW9uIHdpbGwgcmV0dXJuIERNX1NUQVRTX09CSkVDVF9UWVBFX05PTkUsCisgKi8KK3ZvaWQgZG1fc3RhdHNfd2Fsa19uZXh0KHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKKworLyoKKyAqIEZvcmNlIHRoZSBzdGF0aXN0aWNzIGN1cnNvciB0byBhZHZhbmNlIHRvIHRoZSBuZXh0IHJlZ2lvbi4gVGhpcyB3aWxsCisgKiBzdG9wIGFueSBpbi1wcm9ncmVzcyBhcmVhIHdhbGsgKGJ5IGNsZWFyaW5nIERNX1NUQVRTX1dBTEtfQVJFQSkgYW5kCisgKiBhZHZhbmNlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgcHJlc2VudCByZWdpb24sIHRoZSBmaXJzdCBwcmVzZW50CisgKiBncm91cCAoaWYgRE1fU1RBVFNfR1JPVVBfV0FMSyBpcyBzZXQpLCBvciB0byB0aGUgZW5kLiBJbiB0aGlzIGNhc2UgYQorICogc3Vic2VxdWVudCBjYWxsIHRvIGRtX3N0YXRzX3dhbGtfZW5kKCkgd2lsbCByZXR1cm4gMSBhbmQgYSBjYWxsIHRvCisgKiBkbV9zdGF0c19vYmplY3RfdHlwZSgpIGZvciB0aGUgbG9jYXRpb24gd2lsbCByZXR1cm4KKyAqIERNX1NUQVRTX09CSkVDVF9UWVBFX05PTkUuCisgKi8KK3ZvaWQgZG1fc3RhdHNfd2Fsa19uZXh0X3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdGhlIGVuZCBvZiBhIHN0YXRpc3RpY3Mgd2FsayBoYXMgYmVlbiByZWFjaGVkLgorICovCitpbnQgZG1fc3RhdHNfd2Fsa19lbmQoc3RydWN0IGRtX3N0YXRzICpkbXMpOworCisvKgorICogUmV0dXJuIHRoZSB0eXBlIG9mIG9iamVjdCBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHJlZ2lvbl9pZAorICogYW5kIGFyZWFfaWQuIElmIGVpdGhlciByZWdpb25faWQgb3IgYXJlYV9pZCB1c2VzIG9uZSBvZiB0aGUgc3BlY2lhbAorICogdmFsdWVzIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UIG9yIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgcmVnaW9uIG9yIGFyZWEgaWRlbnRpZmllciB3aWxsIGJlIHRha2VuIGZyb20gdGhlCisgKiBjdXJyZW50IGN1cnNvciBsb2NhdGlvbi4gSWYgdGhlIGN1cnNvciBsb2NhdGlvbiBvciB0aGUgdmFsdWUgZW5jb2RlZAorICogYnkgcmVnaW9uX2lkIGFuZCBhcmVhX2lkIGluZGljYXRlcyBhbiBhZ2dyZWdhdGUgcmVnaW9uIG9yIGdyb3VwLAorICogdGhpcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgdmFsdWUgcmV0dXJuZWQuCisgKi8KK2RtX3N0YXRzX29ial90eXBlX3QgZG1fc3RhdHNfb2JqZWN0X3R5cGUoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSB1aW50NjRfdCByZWdpb25faWQsCisJCQkJCSB1aW50NjRfdCBhcmVhX2lkKTsKKworLyoKKyAqIFJldHVybiB0aGUgdHlwZSBvZiBvYmplY3QgYXQgdGhlIGN1cnJlbnQgc3RhdHMgY3Vyc29yIGxvY2F0aW9uLgorICovCitkbV9zdGF0c19vYmpfdHlwZV90IGRtX3N0YXRzX2N1cnJlbnRfb2JqZWN0X3R5cGUoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpOworCisvKgorICogU3RhdHMgaXRlcmF0b3JzCisgKgorICogQyAnZm9yJyBhbmQgJ2RvJy8nd2hpbGUnIHN0eWxlIGl0ZXJhdG9ycyBmb3IgZG1fc3RhdHMgZGF0YS4KKyAqCisgKiBJdCBpcyBub3Qgc2FmZSB0byBjYWxsIGFueSBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSByZWdpb24gdGFibGUKKyAqIHdpdGhpbiB0aGUgbG9vcCBib2R5IChpLmUuIGRtX3N0YXRzX2xpc3QoKSwgZG1fc3RhdHNfcG9wdWxhdGUoKSwKKyAqIGRtX3N0YXRzX2luaXQoKSwgb3IgZG1fc3RhdHNfZGVzdHJveSgpKS4KKyAqCisgKiBBbGwgY291bnRlciBhbmQgcHJvcGVydHkgKGRtX3N0YXRzX2dldF8qKSBhY2Nlc3MgbWV0aG9kcywgYXMgd2VsbCBhcworICogZG1fc3RhdHNfcG9wdWxhdGVfcmVnaW9uKCkgY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBsb29wcy4KKyAqCisgKi8KKworLyoKKyAqIEl0ZXJhdGUgb3ZlciB0aGUgcmVnaW9ucyB0YWJsZSB2aXNpdGluZyBlYWNoIHJlZ2lvbi4KKyAqCisgKiBJZiB0aGUgcmVnaW9uIHRhYmxlIGlzIGVtcHR5IG9yIHVucG9wdWxhdGVkIHRoZSBsb29wIGJvZHkgd2lsbCBub3QgYmUKKyAqIGV4ZWN1dGVkLgorICovCisjZGVmaW5lIGRtX3N0YXRzX2ZvcmVhY2hfcmVnaW9uKGRtcykJCQkJXAorZm9yIChkbV9zdGF0c193YWxrX2luaXQoKGRtcyksIERNX1NUQVRTX1dBTEtfUkVHSU9OKSwJCVwKKyAgICAgZG1fc3RhdHNfd2Fsa19zdGFydCgoZG1zKSk7CQkJCVwKKyAgICAgIWRtX3N0YXRzX3dhbGtfZW5kKChkbXMpKTsgZG1fc3RhdHNfd2Fsa19uZXh0X3JlZ2lvbigoZG1zKSkpCisKKy8qCisgKiBJdGVyYXRlIG92ZXIgdGhlIHJlZ2lvbnMgdGFibGUgdmlzaXRpbmcgZWFjaCBhcmVhLgorICoKKyAqIElmIHRoZSByZWdpb24gdGFibGUgaXMgZW1wdHkgb3IgdW5wb3B1bGF0ZWQgdGhlIGxvb3AgYm9keSB3aWxsIG5vdAorICogYmUgZXhlY3V0ZWQuCisgKi8KKyNkZWZpbmUgZG1fc3RhdHNfZm9yZWFjaF9hcmVhKGRtcykJCQkJXAorZm9yIChkbV9zdGF0c193YWxrX2luaXQoKGRtcyksIERNX1NUQVRTX1dBTEtfQVJFQSksCQlcCisgICAgIGRtX3N0YXRzX3dhbGtfc3RhcnQoKGRtcykpOwkJCQlcCisgICAgICFkbV9zdGF0c193YWxrX2VuZCgoZG1zKSk7IGRtX3N0YXRzX3dhbGtfbmV4dCgoZG1zKSkpCisKKy8qCisgKiBJdGVyYXRlIG92ZXIgdGhlIHJlZ2lvbnMgdGFibGUgdmlzaXRpbmcgZWFjaCBncm91cC4gTWV0cmljIGFuZAorICogY291bnRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGdyb3VwLgorICoKKyAqIElmIHRoZSBncm91cCB0YWJsZSBpcyBlbXB0eSBvciB1bnBvcHVsYXRlZCB0aGUgbG9vcCBib2R5IHdpbGwgbm90CisgKiBiZSBleGVjdXRlZC4KKyAqLworI2RlZmluZSBkbV9zdGF0c19mb3JlYWNoX2dyb3VwKGRtcykJCQkJXAorZm9yIChkbV9zdGF0c193YWxrX2luaXQoKGRtcyksIERNX1NUQVRTX1dBTEtfR1JPVVApLAkJXAorICAgICBkbV9zdGF0c19ncm91cF93YWxrX3N0YXJ0KGRtcyk7CQkJCVwKKyAgICAgIWRtX3N0YXRzX2dyb3VwX3dhbGtfZW5kKGRtcyk7CQkJCVwKKyAgICAgZG1fc3RhdHNfZ3JvdXBfd2Fsa19uZXh0KGRtcykpCisKKy8qCisgKiBTdGFydCBhIHdhbGsgaXRlcmF0aW5nIG92ZXIgdGhlIHJlZ2lvbnMgY29udGFpbmVkIGluIGRtX3N0YXRzIGhhbmRsZQorICogJ2RtcycuCisgKgorICogVGhlIGJvZHkgb2YgdGhlIGxvb3Agc2hvdWxkIGNhbGwgZG1fc3RhdHNfd2Fsa19uZXh0KCkgb3IKKyAqIGRtX3N0YXRzX3dhbGtfbmV4dF9yZWdpb24oKSB0byBhZHZhbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQuCisgKgorICogVGhlIGxvb3AgYm9keSBpcyBleGVjdXRlZCBhdCBsZWFzdCBvbmNlIGV2ZW4gaWYgdGhlIHN0YXRzIGhhbmRsZSBpcworICogZW1wdHkuCisgKi8KKyNkZWZpbmUgZG1fc3RhdHNfd2Fsa19kbyhkbXMpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJZG1fc3RhdHNfd2Fsa19zdGFydCgoZG1zKSk7CQkJCVwKKwlkbworCisvKgorICogU3RhcnQgYSAnd2hpbGUnIHN0eWxlIGxvb3Agb3IgZW5kIGEgJ2RvLi53aGlsZScgbG9vcCBpdGVyYXRpbmcgb3ZlciB0aGUKKyAqIHJlZ2lvbnMgY29udGFpbmVkIGluIGRtX3N0YXRzIGhhbmRsZSAnZG1zJy4KKyAqLworI2RlZmluZSBkbV9zdGF0c193YWxrX3doaWxlKGRtcykJCQkJXAorCXdoaWxlKCFkbV9zdGF0c193YWxrX2VuZCgoZG1zKSkpOwkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDdXJzb3IgcmVsYXRpdmUgcHJvcGVydHkgbWV0aG9kcworICoKKyAqIENhbGxzIHdpdGggdGhlIHByZWZpeCBkbV9zdGF0c19nZXRfY3VycmVudF8qIG9wZXJhdGUgcmVsYXRpdmUgdG8gdGhlCisgKiBjdXJyZW50IGN1cnNvciBsb2NhdGlvbiwgcmV0dXJuaW5nIHByb3BlcnRpZXMgZm9yIHRoZSBjdXJyZW50IHJlZ2lvbgorICogb3IgYXJlYSBvZiB0aGUgc3VwcGxpZWQgZG1fc3RhdHMgaGFuZGxlLgorICoKKyAqLworCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZWFzIChjb3VudGVyIHNldHMpIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudAorICogcmVnaW9uIG9mIHRoZSBzdXBwbGllZCBkbV9zdGF0cyBoYW5kbGUuCisgKi8KK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9jdXJyZW50X25yX2FyZWFzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKKworLyoKKyAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgc3RhdHMgY3Vyc29yLgorICovCit1aW50NjRfdCBkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb24oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpOwordWludDY0X3QgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKy8qCisgKiBDdXJyZW50IHJlZ2lvbiBwcm9wZXJ0aWVzOiBzaXplLCBsZW5ndGggJiBhcmVhX2xlbi4KKyAqCisgKiBTZWUgdGhlIGNvbW1lbnRzIGZvciB0aGUgZXF1aXZhbGVudCBkbV9zdGF0c19nZXRfKiB2ZXJzaW9ucyBmb3IgYQorICogY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgbWV0aG9kcy4KKyAqCisgKiBBbGwgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiB1bml0cyBvZiA1MTJiIHNlY3RvcnMuCisgKi8KK2ludCBkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fc3RhcnQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgdWludDY0X3QgKnN0YXJ0KTsKKworaW50IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9sZW4oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgIHVpbnQ2NF90ICpsZW4pOworCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX2FyZWFfbGVuKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQkgdWludDY0X3QgKmFyZWFfbGVuKTsKKworLyoKKyAqIEN1cnJlbnQgYXJlYSBwcm9wZXJ0aWVzOiBzdGFydCBhbmQgbGVuZ3RoLgorICoKKyAqIFNlZSB0aGUgY29tbWVudHMgZm9yIHRoZSBlcXVpdmFsZW50IGRtX3N0YXRzX2dldF8qIHZlcnNpb25zIGZvciBhCisgKiBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBtZXRob2RzLgorICoKKyAqIEFsbCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHVuaXRzIG9mIDUxMmIgc2VjdG9ycy4KKyAqLworaW50IGRtX3N0YXRzX2dldF9jdXJyZW50X2FyZWFfc3RhcnQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgIHVpbnQ2NF90ICpzdGFydCk7CisKK2ludCBkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhX29mZnNldChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgIHVpbnQ2NF90ICpvZmZzZXQpOworCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9sZW4oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgIHVpbnQ2NF90ICpzdGFydCk7CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwcm9ncmFtX2lkIHN0cmluZyBmb3IgcmVnaW9uIGF0IHRoZSBjdXJyZW50CisgKiBjdXJzb3IgbG9jYXRpb24uCisgKi8KK2NvbnN0IGNoYXIgKmRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9wcm9ncmFtX2lkKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKTsKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgYXV4X2RhdGEgc3RyaW5nIGZvciB0aGUgcmVnaW9uIGF0IHRoZQorICogY3VycmVudCBjdXJzb3IgbG9jYXRpb24uCisgKi8KK2NvbnN0IGNoYXIgKmRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9hdXhfZGF0YShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyk7CisKKy8qCisgKiBTdGF0aXN0aWNzIGdyb3VwcyBhbmQgZGF0YSBhZ2dyZWdhdGlvbi4KKyAqLworCisvKgorICogQ3JlYXRlIGEgbmV3IGdyb3VwIGluIHN0YXRzIGhhbmRsZSBkbXMgZnJvbSB0aGUgZ3JvdXAgZGVzY3JpcHRvcgorICogcGFzc2VkIGluIGdyb3VwLiBUaGUgZ3JvdXAgZGVzY3JpcHRvciBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgbGlzdAorICogb2YgcmVnaW9uX2lkIHZhbHVlcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdyb3VwLiBUaGUgZmlyc3QKKyAqIHJlZ2lvbl9pZCBmb3VuZCB3aWxsIGJlIHRoZSBncm91cCBsZWFkZXIuIFJhbmdlcyBvZiBpZGVudGlmaWVycyBtYXkKKyAqIGJlIGV4cHJlc3NlZCBhcyAiTS1OIiwgd2hlcmUgTSBhbmQgTiBhcmUgdGhlIHN0YXJ0IGFuZCBlbmQgcmVnaW9uX2lkCisgKiB2YWx1ZXMgZm9yIHRoZSByYW5nZS4KKyAqLworaW50IGRtX3N0YXRzX2NyZWF0ZV9ncm91cChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqZ3JvdXAsCisJCQkgIGNvbnN0IGNoYXIgKmFsaWFzLCB1aW50NjRfdCAqZ3JvdXBfaWQpOworCisvKgorICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZ3JvdXBfaWQuIElmIHRoZSByZW1vdmUgYXJndW1lbnQgaXMgemVybyB0aGUKKyAqIGdyb3VwIHdpbGwgYmUgcmVtb3ZlZCBidXQgdGhlIHJlZ2lvbnMgdGhhdCBpdCBjb250YWluZWQgd2lsbCByZW1haW4uCisgKiBJZiByZW1vdmUgaXMgbm9uLXplcm8gdGhlbiBhbGwgcmVnaW9ucyB0aGF0IGJlbG9uZyB0byB0aGUgZ3JvdXAgd2lsbAorICogYWxzbyBiZSByZW1vdmVkLgorICovCitpbnQgZG1fc3RhdHNfZGVsZXRlX2dyb3VwKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCwgaW50IHJlbW92ZSk7CisKKy8qCisgKiBTZXQgYW4gYWxpYXMgZm9yIHRoaXMgZ3JvdXAgb3IgcmVnaW9uLiBUaGUgYWxpYXMgd2lsbCBiZSByZXR1cm5lZAorICogaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGRtLXN0YXRzIG5hbWUgZm9yIHRoaXMgcmVnaW9uIG9yIGdyb3VwLgorICovCitpbnQgZG1fc3RhdHNfc2V0X2FsaWFzKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmFsaWFzKTsKKworLyoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBhbGlhcyBmb3IgaWQsIG9yIHRoZQorICogbmFtZSBvZiB0aGUgZG0gZGV2aWNlIHRoZSBoYW5kbGUgaXMgYm91bmQgdG8gaWYgbm8gYWxpYXMgaGFzIGJlZW4KKyAqIHNldC4gVGhlIHBvaW50ZXIgd2lsbCBiZSBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYSBuZXcgYWxpYXMgaXMgc2V0CisgKiBvciB3aGVuIHRoZSBzdGF0cyBoYW5kbGUgaXMgY2xlYXJlZC4KKyAqLworY29uc3QgY2hhciAqZG1fc3RhdHNfZ2V0X2FsaWFzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBpZCk7CisKKyNkZWZpbmUgRE1fU1RBVFNfR1JPVVBfTk9ORSBVSU5UNjRfTUFYCisvKgorICogUmV0dXJuIHRoZSBncm91cF9pZCB0aGF0IHRoZSBzcGVjaWZpZWQgcmVnaW9uX2lkIGJlbG9uZ3MgdG8sIG9yIHRoZQorICogc3BlY2lhbCB2YWx1ZSBETV9TVEFUU19HUk9VUF9OT05FIGlmIHRoZSByZWdpb24gZG9lcyBub3QgYmVsb25nCisgKiB0byBhbnkgZ3JvdXAuCisgKi8KK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9ncm91cF9pZChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKTsKKworLyoKKyAqIFN0b3JlIGEgcG9pbnRlciB0byBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWdpb25zIHRoYXQgYXJlIG1lbWJlcnMKKyAqIG9mIHRoZSBncm91cCBzcGVjaWZpZWQgYnkgZ3JvdXBfaWQgaW4gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGJ1Zi4KKyAqIFRoZSBzdHJpbmcgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSAnZ3JvdXAnIGFyZ3VtZW50IHRvCisgKiBkbV9zdGF0c19jcmVhdGVfZ3JvdXAoKS4KKyAqCisgKiBUaGUgcG9pbnRlciBkb2VzIG5vdCBuZWVkIHRvIGJlIGZyZWVkIGV4cGxpY2l0bHkgYnkgdGhlIGNhbGxlcjogaXQKKyAqIHdpbGwgYmVjb21lIGludmFsaWQgZm9sbG93aW5nIGEgc3Vic2VxdWVudCBkbV9zdGF0c19saXN0KCksCisgKiBkbV9zdGF0c19wb3B1bGF0ZSgpIG9yIGRtX3N0YXRzX2Rlc3Ryb3koKSBvZiB0aGUgY29ycmVzcG9uZGluZworICogZG1fc3RhdHMgaGFuZGxlLgorICovCitpbnQgZG1fc3RhdHNfZ2V0X2dyb3VwX2Rlc2NyaXB0b3IoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICB1aW50NjRfdCBncm91cF9pZCwgY2hhciAqKmJ1Zik7CisKKy8qCisgKiBDcmVhdGUgcmVnaW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGV4dGVudHMgb2YgYSBmaWxlIGluIHRoZQorICogZmlsZXN5c3RlbSBhbmQgb3B0aW9uYWxseSBwbGFjZSB0aGVtIGludG8gYSBncm91cC4KKyAqCisgKiBGaWxlIGRlc2NyaXB0b3IgZmQgbXVzdCByZWZlcmVuY2UgYSByZWd1bGFyIGZpbGUsIG9wZW4gZm9yIHJlYWRpbmcsCisgKiBpbiBhIGxvY2FsIGZpbGUgc3lzdGVtIHRoYXQgc3VwcG9ydHMgdGhlIEZJRU1BUCBpb2N0bCBhbmQgdGhhdAorICogcmV0dXJucyBkYXRhIGRlc2NyaWJpbmcgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGV4dGVudHMuCisgKgorICogVGhlIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgZm9sbG93aW5nIHRoZSBjYWxsCisgKiB0byBkbV9zdGF0c19jcmVhdGVfcmVnaW9uc19mcm9tX2ZkKCkuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpbnQ2NF90IGNvbnRhaW5pbmcKKyAqIHRoZSBJRHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgcmVnaW9ucy4gVGhlIGFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgdGhlCisgKiB2YWx1ZSBETV9TVEFUU19SRUdJT05TX0FMTCBhbmQgc2hvdWxkIGJlIGZyZWVkIHVzaW5nIGRtX2ZyZWUoKSB3aGVuCisgKiBubyBsb25nZXIgcmVxdWlyZWQuCisgKgorICogVW5sZXNzIG5vZ3JvdXAgaXMgbm9uLXplcm8gdGhlIHJlZ2lvbnMgd2lsbCBiZSBwbGFjZWQgaW50byBhIGdyb3VwCisgKiBhbmQgdGhlIGdyb3VwIGFsaWFzIGlzIHNldCB0byB0aGUgdmFsdWUgc3VwcGxpZWQuCisgKgorICogVGhlIGdyb3VwX2lkIGZvciB0aGUgbmV3IGdyb3VwIGlzIGVxdWFsIHRvIHRoZSByZWdpb25faWQgdmFsdWUgaW4KKyAqIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50LgorICoKKyAqIEZpbGUgbWFwcGVkIGhpc3RvZ3JhbXMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KKyAqLwordWludDY0X3QgKmRtX3N0YXRzX2NyZWF0ZV9yZWdpb25zX2Zyb21fZmQoc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBmZCwKKwkJCQkJICBpbnQgZ3JvdXAsIGludCBwcmVjaXNlLAorCQkJCQkgIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCQkJICBjb25zdCBjaGFyICphbGlhcyk7CisKKy8qCisgKiBDYWxsIHRoaXMgdG8gYWN0dWFsbHkgcnVuIHRoZSBpb2N0bC4KKyAqLworaW50IGRtX3Rhc2tfcnVuKHN0cnVjdCBkbV90YXNrICpkbXQpOworCisvKgorICogVGhlIGVycm5vIGZyb20gdGhlIGxhc3QgZGV2aWNlLW1hcHBlciBpb2N0bCBwZXJmb3JtZWQgYnkgZG1fdGFza19ydW4uCisgKi8KK2ludCBkbV90YXNrX2dldF9lcnJubyhzdHJ1Y3QgZG1fdGFzayAqZG10KTsKKworLyoKKyAqIENhbGwgdGhpcyB0byBtYWtlIG9yIHJlbW92ZSB0aGUgZGV2aWNlIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBwcmV2aW91c2x5CisgKiBpc3N1ZWQgY29tbWFuZHMuCisgKi8KK3ZvaWQgZG1fdGFza191cGRhdGVfbm9kZXModm9pZCk7CisKKy8qCisgKiBNYW5nbGluZyBzdXBwb3J0CisgKgorICogQ2hhcmFjdGVyIHdoaXRlbGlzdDogMC05LCBBLVosIGEteiwgIystLjo9QF8KKyAqIEhFWCBtYW5nbGluZyBmb3JtYXQ6IFx4Tk4sIE5OIGJlaW5nIHRoZSBoZXggdmFsdWUgb2YgdGhlIGNoYXJhY3Rlci4KKyAqICh3aGl0ZWxpc3QgYW5kIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdWRldikKKyovCit0eXBlZGVmIGVudW0geworCURNX1NUUklOR19NQU5HTElOR19OT05FLCAvKiBkbyBub3QgbWFuZ2xlIGF0IGFsbCAqLworCURNX1NUUklOR19NQU5HTElOR19BVVRPLCAvKiBtYW5nbGUgb25seSBpZiBub3QgYWxyZWFkeSBtYW5nbGVkIHdpdGggaGV4LCBlcnJvciB3aGVuIG1peGVkICovCisJRE1fU1RSSU5HX01BTkdMSU5HX0hFWAkgLyogYWx3YXlzIG1hbmdsZSB3aXRoIGhleCBlbmNvZGluZywgbm8gbWF0dGVyIHdoYXQgdGhlIGlucHV0IGlzICovCit9IGRtX3N0cmluZ19tYW5nbGluZ190OworCisvKgorICogU2V0L2dldCBtYW5nbGluZyBtb2RlIHVzZWQgZm9yIGRldmljZS1tYXBwZXIgbmFtZXMgYW5kIHV1aWRzLgorICovCitpbnQgZG1fc2V0X25hbWVfbWFuZ2xpbmdfbW9kZShkbV9zdHJpbmdfbWFuZ2xpbmdfdCBuYW1lX21hbmdsaW5nKTsKK2RtX3N0cmluZ19tYW5nbGluZ190IGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUodm9pZCk7CisKKy8qCisgKiBHZXQgbWFuZ2xlZC91bm1hbmdsZWQgZm9ybSBvZiB0aGUgZGV2aWNlLW1hcHBlciBuYW1lIG9yIHV1aWQKKyAqIGlycmVzcGVjdGl2ZSBvZiB0aGUgZ2xvYmFsIHNldHRpbmcgKHNldCBieSBkbV9zZXRfbmFtZV9tYW5nbGluZ19tb2RlKS4KKyAqIFRoZSBuYW1lIG9yIHV1aWQgcmV0dXJuZWQgbmVlZHMgdG8gYmUgZnJlZWQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcgZG1fZnJlZSEKKyAqLworY2hhciAqZG1fdGFza19nZXRfbmFtZV9tYW5nbGVkKGNvbnN0IHN0cnVjdCBkbV90YXNrICpkbXQpOworY2hhciAqZG1fdGFza19nZXRfbmFtZV91bm1hbmdsZWQoY29uc3Qgc3RydWN0IGRtX3Rhc2sgKmRtdCk7CitjaGFyICpkbV90YXNrX2dldF91dWlkX21hbmdsZWQoY29uc3Qgc3RydWN0IGRtX3Rhc2sgKmRtdCk7CitjaGFyICpkbV90YXNrX2dldF91dWlkX3VubWFuZ2xlZChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10KTsKKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgZGV2aWNlLW1hcHBlciBkaXJlY3RvcnkKKyAqLworaW50IGRtX3NldF9kZXZfZGlyKGNvbnN0IGNoYXIgKmRpcik7Citjb25zdCBjaGFyICpkbV9kaXIodm9pZCk7CisKKy8qCisgKiBDb25maWd1cmUgc3lzZnMgZGlyZWN0b3J5LCAvc3lzIGJ5IGRlZmF1bHQKKyAqLworaW50IGRtX3NldF9zeXNmc19kaXIoY29uc3QgY2hhciAqZGlyKTsKK2NvbnN0IGNoYXIgKmRtX3N5c2ZzX2Rpcih2b2lkKTsKKworLyoKKyAqIENvbmZpZ3VyZSBkZWZhdWx0IFVVSUQgcHJlZml4IHN0cmluZy4KKyAqIENvbnZlbnRpb25hbGx5IHRoaXMgaXMgYSBzaG9ydCBjYXBpdGFsaXNlZCBwcmVmaXggaW5kaWNhdGluZyB0aGUgc3Vic3lzdGVtCisgKiB0aGF0IGlzIG1hbmFnaW5nIHRoZSBkZXZpY2VzLCBlLmcuICJMVk0tIiBvciAiTVBBVEgtIi4KKyAqIFRvIHN1cHBvcnQgc3RhY2tzIG9mIGRldmljZXMgZnJvbSBkaWZmZXJlbnQgc3Vic3lzdGVtcywgcmVjdXJzaXZlIGZ1bmN0aW9ucworICogc3RvcCByZWN1cnNpbmcgaWYgdGhleSByZWFjaCBhIGRldmljZSB3aXRoIGEgZGlmZmVyZW50IHByZWZpeC4KKyAqLworaW50IGRtX3NldF91dWlkX3ByZWZpeChjb25zdCBjaGFyICp1dWlkX3ByZWZpeCk7Citjb25zdCBjaGFyICpkbV91dWlkX3ByZWZpeCh2b2lkKTsKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgbWFqb3IgbnVtYmVyIGJlbG9uZ3MgdG8gZGV2aWNlLW1hcHBlciBvciBub3QuCisgKi8KK2ludCBkbV9pc19kbV9tYWpvcih1aW50MzJfdCBtYWpvcik7CisKKy8qCisgKiBHZXQgYXNzb2NpYXRlZCBkZXZpY2UgbmFtZSBmb3IgZ2l2ZW4gbWFqb3IgYW5kIG1pbm9yIG51bWJlciBieSByZWFkaW5nCisgKiB0aGUgc3lzZnMgY29udGVudC4gSWYgdGhpcyBpcyBhIGRtIGRldmljZSwgZ2V0IGFzc29jaWF0ZWQgZG0gbmFtZSwgdGhlIG9uZQorICogdGhhdCBhcHBlYXJzIGluIC9kZXYvbWFwcGVyLiBETSBuYW1lcyBjb3VsZCBiZSByZXNvbHZlZCB0aGlzIHdheSBvbmx5IGlmCisgKiBrZXJuZWwgdXNlZCA+PSAyLjYuMjksIGtlcm5lbCBuYW1lIGlzIGZvdW5kIG90aGVyd2lzZSAoZS5nLiBkbS0wKS4KKyAqIElmIHByZWZlcl9rZXJuZWxfbmFtZSBpcyBzZXQsIHRoZSBrZXJuZWwgbmFtZSBpcyBhbHdheXMgcHJlZmVycmVkIG92ZXIKKyAqIGRldmljZS1tYXBwZXIgbmFtZSBmb3IgZG0gZGV2aWNlcyBubyBtYXR0ZXIgd2hhdCB0aGUga2VybmVsIHZlcnNpb24gaXMuCisgKiBGb3Igbm9uLWRtIGRldmljZXMsIHdlIGFsd2F5cyBnZXQgYXNzb2NpYXRlZCBrZXJuZWwgbmFtZSwgZS5nIHNkYSwgbWQwIGV0Yy4KKyAqIFJldHVybnMgMCBvbiBlcnJvciBvciBpZiBzeXNmcyBpcyBub3QgdXNlZCAob3IgY29uZmlndXJlZCBpbmNvcnJlY3RseSksCisgKiBvdGhlcndpc2UgcmV0dXJucyAxIGFuZCB0aGUgc3VwcGxpZWQgYnVmZmVyIGhvbGRzIHRoZSBkZXZpY2UgbmFtZS4KKyAqLworaW50IGRtX2RldmljZV9nZXRfbmFtZSh1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCSAgICAgICBpbnQgcHJlZmVyX2tlcm5lbF9uYW1lLAorCQkgICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUpOworCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBkZXZpY2UgaGFzIGFueSBob2xkZXJzIChkZXZpY2VzCisgKiB1c2luZyB0aGlzIGRldmljZSkuIElmIHN5c2ZzIGlzIG5vdCB1c2VkIChvciBjb25maWd1cmVkCisgKiBpbmNvcnJlY3RseSksIHJldHVybnMgMC4KKyAqLworaW50IGRtX2RldmljZV9oYXNfaG9sZGVycyh1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IpOworCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBkZXZpY2UgY29udGFpbnMgbW91bnRlZCBmaWxlc3lzdGVtLgorICogSWYgc3lzZnMgaXMgbm90IHVzZWQgKG9yIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHkpLCByZXR1cm5zIDAuCisgKi8KK2ludCBkbV9kZXZpY2VfaGFzX21vdW50ZWRfZnModWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKTsKKworCisvKgorICogQ2FsbGJhY2sgaXMgaW52b2tlZCBmb3IgaW5kaXZpZGFsIG1vdW50aW5mbyBsaW5lcywKKyAqIG1pbm9yLCBtYWpvciBhbmQgbW91bnQgdGFyZ2V0IGFyZSBwYXJzZWQgYW5kIHVubWFuZ2xlZC4KKyAqLwordHlwZWRlZiBpbnQgKCpkbV9tb3VudGluZm9fbGluZV9jYWxsYmFja19mbikgKGNoYXIgKmxpbmUsIHVuc2lnbmVkIG1haiwgdW5zaWduZWQgbWluLAorCQkJCQkgICAgICBjaGFyICp0YXJnZXQsIHZvaWQgKmNiX2RhdGEpOworCisvKgorICogUmVhZCBhbGwgbGluZXMgZnJvbSAvcHJvYy9zZWxmL21vdW50aW5mbywKKyAqIGZvciBlYWNoIGxpbmUgY2FsbHMgcmVhZF9mbiBjYWxsYmFjay4KKyAqLworaW50IGRtX21vdW50aW5mb19yZWFkKGRtX21vdW50aW5mb19saW5lX2NhbGxiYWNrX2ZuIHJlYWRfZm4sIHZvaWQgKmNiX2RhdGEpOworCisvKgorICogSW5pdGlhbGlzZSBsaWJyYXJ5CisgKi8KK3ZvaWQgZG1fbGliX2luaXQodm9pZCkgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKTsKKworLyoKKyAqIFJlbGVhc2UgbGlicmFyeSByZXNvdXJjZXMKKyAqLwordm9pZCBkbV9saWJfcmVsZWFzZSh2b2lkKTsKK3ZvaWQgZG1fbGliX2V4aXQodm9pZCkgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpOworCisvKiBBbiBvcHRpbWlzYXRpb24gZm9yIGNsaWVudHMgbWFraW5nIHJlcGVhdGVkIGNhbGxzIGludm9sdmluZyBkbSBpb2N0bHMgKi8KK3ZvaWQgZG1faG9sZF9jb250cm9sX2RldihpbnQgaG9sZF9vcGVuKTsKKworLyoKKyAqIFVzZSBOVUxMIGZvciBhbGwgZGV2aWNlcy4KKyAqLworaW50IGRtX21rbm9kZXMoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZG1fZHJpdmVyX3ZlcnNpb24oY2hhciAqdmVyc2lvbiwgc2l6ZV90IHNpemUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMgdG8gYnVpbGQgYW5kIG1hbmlwdWxhdGUgdHJlZXMgb2YgZGV2aWNlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRtX3RyZWU7CitzdHJ1Y3QgZG1fdHJlZV9ub2RlOworCisvKgorICogSW5pdGlhbGlzZSBhbiBlbXB0eSBkZXBlbmRlbmN5IHRyZWUuCisgKgorICogVGhlIHRyZWUgY29uc2lzdHMgb2YgYSByb290IG5vZGUgdG9nZXRoZXIgd2l0aCBvbmUgbm9kZSBmb3IgZWFjaCBtYXBwZWQKKyAqIGRldmljZSB3aGljaCBoYXMgY2hpbGQgbm9kZXMgZm9yIGVhY2ggZGV2aWNlIHJlZmVyZW5jZWQgaW4gaXRzIHRhYmxlLgorICoKKyAqIEV2ZXJ5IG5vZGUgaW4gdGhlIHRyZWUgaGFzIG9uZSBvciBtb3JlIGNoaWxkcmVuIGFuZCBvbmUgb3IgbW9yZSBwYXJlbnRzLgorICoKKyAqIFRoZSByb290IG5vZGUgaXMgdGhlIHBhcmVudC9jaGlsZCBvZiBldmVyeSBub2RlIHRoYXQgZG9lc24ndCBoYXZlIG90aGVyCisgKiBwYXJlbnRzL2NoaWxkcmVuLgorICovCitzdHJ1Y3QgZG1fdHJlZSAqZG1fdHJlZV9jcmVhdGUodm9pZCk7Cit2b2lkIGRtX3RyZWVfZnJlZShzdHJ1Y3QgZG1fdHJlZSAqdHJlZSk7CisKKy8qCisgKiBMaXN0IG9mIHN1ZmZpeGVzIHRvIGJlIGlnbm9yZWQgd2hlbiBtYXRjaGluZyB1dWlkcyBhZ2FpbnN0IGV4aXN0aW5nIGRldmljZXMuCisgKi8KK3ZvaWQgZG1fdHJlZV9zZXRfb3B0aW9uYWxfdXVpZF9zdWZmaXhlcyhzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUsIGNvbnN0IGNoYXIgKipvcHRpb25hbF91dWlkX3N1ZmZpeGVzKTsKKworLyoKKyAqIEFkZCBub2RlcyB0byB0aGUgdHJlZSBmb3IgYSBnaXZlbiBkZXZpY2UgYW5kIGFsbCB0aGUgZGV2aWNlcyBpdCB1c2VzLgorICovCitpbnQgZG1fdHJlZV9hZGRfZGV2KHN0cnVjdCBkbV90cmVlICp0cmVlLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IpOworaW50IGRtX3RyZWVfYWRkX2Rldl93aXRoX3VkZXZfZmxhZ3Moc3RydWN0IGRtX3RyZWUgKnRyZWUsIHVpbnQzMl90IG1ham9yLAorCQkJCSAgICB1aW50MzJfdCBtaW5vciwgdWludDE2X3QgdWRldl9mbGFncyk7CisKKy8qCisgKiBBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgKi8KK3N0cnVjdCBkbV90cmVlX25vZGUgKmRtX3RyZWVfYWRkX25ld19kZXYoc3RydWN0IGRtX3RyZWUgKnRyZWUsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgY29uc3QgY2hhciAqdXVpZCwKKwkJCQkJIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJCQkJIGludCByZWFkX29ubHksCisJCQkJCSBpbnQgY2xlYXJfaW5hY3RpdmUsCisJCQkJCSB2b2lkICpjb250ZXh0KTsKK3N0cnVjdCBkbV90cmVlX25vZGUgKmRtX3RyZWVfYWRkX25ld19kZXZfd2l0aF91ZGV2X2ZsYWdzKHN0cnVjdCBkbV90cmVlICp0cmVlLAorCQkJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJCSBjb25zdCBjaGFyICp1dWlkLAorCQkJCQkJCSB1aW50MzJfdCBtYWpvciwKKwkJCQkJCQkgdWludDMyX3QgbWlub3IsCisJCQkJCQkJIGludCByZWFkX29ubHksCisJCQkJCQkJIGludCBjbGVhcl9pbmFjdGl2ZSwKKwkJCQkJCQkgdm9pZCAqY29udGV4dCwKKwkJCQkJCQkgdWludDE2X3QgdWRldl9mbGFncyk7CisKKy8qCisgKiBTZWFyY2ggZm9yIGEgbm9kZSBpbiB0aGUgdHJlZS4KKyAqIFNldCBtYWpvciBhbmQgbWlub3IgdG8gMCBvciB1dWlkIHRvIE5VTEwgdG8gZ2V0IHRoZSByb290IG5vZGUuCisgKi8KK3N0cnVjdCBkbV90cmVlX25vZGUgKmRtX3RyZWVfZmluZF9ub2RlKHN0cnVjdCBkbV90cmVlICp0cmVlLAorCQkJCSAgICAgICB1aW50MzJfdCBtYWpvciwKKwkJCQkgICAgICAgdWludDMyX3QgbWlub3IpOworc3RydWN0IGRtX3RyZWVfbm9kZSAqZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChzdHJ1Y3QgZG1fdHJlZSAqdHJlZSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKnV1aWQpOworCisvKgorICogVXNlIHRoaXMgdG8gd2FsayB0aHJvdWdoIGFsbCBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUuCisgKiBTZXQgaGFuZGxlIHRvIE5VTEwgaW4gZmlyc3QgY2FsbC4KKyAqIFJldHVybnMgTlVMTCBhZnRlciB0aGUgbGFzdCBjaGlsZC4KKyAqIFNldCBpbnZlcnRlZCB0byB1c2UgaW52ZXJ0ZWQgdHJlZS4KKyAqLworc3RydWN0IGRtX3RyZWVfbm9kZSAqZG1fdHJlZV9uZXh0X2NoaWxkKHZvaWQgKipoYW5kbGUsCisJCQkJCWNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKnBhcmVudCwKKwkJCQkJdWludDMyX3QgaW52ZXJ0ZWQpOworCisvKgorICogR2V0IHByb3BlcnRpZXMgb2YgYSBub2RlLgorICovCitjb25zdCBjaGFyICpkbV90cmVlX25vZGVfZ2V0X25hbWUoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSk7Citjb25zdCBjaGFyICpkbV90cmVlX25vZGVfZ2V0X3V1aWQoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSk7Citjb25zdCBzdHJ1Y3QgZG1faW5mbyAqZG1fdHJlZV9ub2RlX2dldF9pbmZvKGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUpOwordm9pZCAqZG1fdHJlZV9ub2RlX2dldF9jb250ZXh0KGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUpOworLyoKKyAqIFJldHVybnMgIDAgd2hlbiBub2RlIHNpemUgYW5kIGl0cyBjaGlsZHJlbiBpcyB1bmNoYW5nZWQuCisgKiBSZXR1cm5zICAxIHdoZW4gbm9kZSBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIGhhcyBpbmNyZWFzZWQgc2l6ZS4KKyAqIFJlcnVybnMgLTEgd2hlbiBub2RlIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gaGFzIHJlZHVjZWQgc2l6ZS4KKyAqLworaW50IGRtX3RyZWVfbm9kZV9zaXplX2NoYW5nZWQoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpOworCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBub2RlIChleGNsdWRpbmcgdGhlIHJvb3Qgbm9kZSkuCisgKiBTZXQgaW52ZXJ0ZWQgZm9yIHRoZSBudW1iZXIgb2YgcGFyZW50cy4KKyAqLworaW50IGRtX3RyZWVfbm9kZV9udW1fY2hpbGRyZW4oY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDMyX3QgaW52ZXJ0ZWQpOworCisvKgorICogRGVhY3RpdmF0ZSBhIGRldmljZSBwbHVzIGFsbCBkZXBlbmRlbmNpZXMuCisgKiBJZ25vcmVzIGRldmljZXMgdGhhdCBkb24ndCBoYXZlIGEgdXVpZCBzdGFydGluZyB3aXRoIHV1aWRfcHJlZml4LgorICovCitpbnQgZG1fdHJlZV9kZWFjdGl2YXRlX2NoaWxkcmVuKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCWNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJCXNpemVfdCB1dWlkX3ByZWZpeF9sZW4pOworLyoKKyAqIFByZWxvYWQvY3JlYXRlIGEgZGV2aWNlIHBsdXMgYWxsIGRlcGVuZGVuY2llcy4KKyAqIElnbm9yZXMgZGV2aWNlcyB0aGF0IGRvbid0IGhhdmUgYSB1dWlkIHN0YXJ0aW5nIHdpdGggdXVpZF9wcmVmaXguCisgKi8KK2ludCBkbV90cmVlX3ByZWxvYWRfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKTsKKworLyoKKyAqIFJlc3VtZSBhIGRldmljZSBwbHVzIGFsbCBkZXBlbmRlbmNpZXMuCisgKiBJZ25vcmVzIGRldmljZXMgdGhhdCBkb24ndCBoYXZlIGEgdXVpZCBzdGFydGluZyB3aXRoIHV1aWRfcHJlZml4LgorICovCitpbnQgZG1fdHJlZV9hY3RpdmF0ZV9jaGlsZHJlbihzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICAgc2l6ZV90IHV1aWRfcHJlZml4X2xlbik7CisKKy8qCisgKiBTdXNwZW5kIGEgZGV2aWNlIHBsdXMgYWxsIGRlcGVuZGVuY2llcy4KKyAqIElnbm9yZXMgZGV2aWNlcyB0aGF0IGRvbid0IGhhdmUgYSB1dWlkIHN0YXJ0aW5nIHdpdGggdXVpZF9wcmVmaXguCisgKi8KK2ludCBkbV90cmVlX3N1c3BlbmRfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKTsKKworLyoKKyAqIFNraXAgdGhlIGZpbGVzeXN0ZW0gc3luYyB3aGVuIHN1c3BlbmRpbmcuCisgKiBEb2VzIG5vdGhpbmcgd2l0aCBvdGhlciBmdW5jdGlvbnMuCisgKiBVc2UgdGhpcyB3aGVuIG5vIHNuYXBzaG90cyBhcmUgaW52b2x2ZWQuCisgKi8KK3ZvaWQgZG1fdHJlZV9za2lwX2xvY2tmcyhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSk7CisKKy8qCisgKiBTZXQgdGhlICdub2ZsdXNoJyBmbGFnIHdoZW4gc3VzcGVuZGluZyBkZXZpY2VzLgorICogSWYgdGhlIGtlcm5lbCBzdXBwb3J0cyBpdCwgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXRzdGFuZGluZyBJL08gdGhhdAorICogY2Fubm90IGJlIGNvbXBsZXRlZCwgdGhlIEkvTyBpcyBxdWV1ZWQgYW5kIHJlc3VibWl0dGVkIHdoZW4gdGhlCisgKiBkZXZpY2UgaXMgcmVzdW1lZC4gIFRoaXMgYWZmZWN0cyBtdWx0aXBhdGggZGV2aWNlcyB3aGVuIGFsbCBwYXRocworICogaGF2ZSBmYWlsZWQgYW5kIHF1ZXVlX2lmX25vX3BhdGggaXMgc2V0LCBhbmQgbWlycm9yIGRldmljZXMgd2hlbgorICogYmxvY2tfb25fZXJyb3IgaXMgc2V0IGFuZCB0aGUgbWlycm9yIGxvZyBoYXMgZmFpbGVkLgorICovCit2b2lkIGRtX3RyZWVfdXNlX25vX2ZsdXNoX3N1c3BlbmQoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpOworCisvKgorICogUmV0cnkgcmVtb3ZhbCBvZiBlYWNoIGRldmljZSBpZiBub3Qgc3VjY2Vzc2Z1bC4KKyAqLwordm9pZCBkbV90cmVlX3JldHJ5X3JlbW92ZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSk7CisKKy8qCisgKiBJcyB0aGUgdXVpZCBwcmVmaXggcHJlc2VudCBpbiB0aGUgdHJlZT8KKyAqIE9ubHkgcmV0dXJucyAwIGlmIGV2ZXJ5IG5vZGUgd2FzIGNoZWNrZWQgc3VjY2Vzc2Z1bGx5LgorICogUmV0dXJucyAxIGlmIHRoZSB0cmVlIHdhbGsgaGFzIHRvIGJlIGFib3J0ZWQuCisgKi8KK2ludCBkbV90cmVlX2NoaWxkcmVuX3VzZV91dWlkKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJICAgICAgY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsCisJCQkgICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKTsKKworLyoKKyAqIENvbnN0cnVjdCB0YWJsZXMgZm9yIG5ldyBub2RlcyBiZWZvcmUgYWN0aXZhdGluZyB0aGVtLgorICovCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9zbmFwc2hvdF9vcmlnaW5fdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCQkgICAgdWludDY0X3Qgc2l6ZSwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKm9yaWdpbl91dWlkKTsKK2ludCBkbV90cmVlX25vZGVfYWRkX3NuYXBzaG90X3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgdWludDY0X3Qgc2l6ZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm9yaWdpbl91dWlkLAorCQkJCSAgICAgY29uc3QgY2hhciAqY293X3V1aWQsCisJCQkJICAgICBpbnQgcGVyc2lzdGVudCwKKwkJCQkgICAgIHVpbnQzMl90IGNodW5rX3NpemUpOworaW50IGRtX3RyZWVfbm9kZV9hZGRfc25hcHNob3RfbWVyZ2VfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCSAgIHVpbnQ2NF90IHNpemUsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm9yaWdpbl91dWlkLAorCQkJCQkgICBjb25zdCBjaGFyICpjb3dfdXVpZCwKKwkJCQkJICAgY29uc3QgY2hhciAqbWVyZ2VfdXVpZCwKKwkJCQkJICAgdWludDMyX3QgY2h1bmtfc2l6ZSk7CitpbnQgZG1fdHJlZV9ub2RlX2FkZF9lcnJvcl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgIHVpbnQ2NF90IHNpemUpOworaW50IGRtX3RyZWVfbm9kZV9hZGRfemVyb190YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgdWludDY0X3Qgc2l6ZSk7CitpbnQgZG1fdHJlZV9ub2RlX2FkZF9saW5lYXJfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgdWludDY0X3Qgc2l6ZSk7CitpbnQgZG1fdHJlZV9ub2RlX2FkZF9zdHJpcGVkX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICB1aW50NjRfdCBzaXplLAorCQkJCSAgICB1aW50MzJfdCBzdHJpcGVfc2l6ZSk7CisKKyNkZWZpbmUgRE1fQ1JZUFRfSVZfREVGQVVMVAlVSU5UNjRfQygtMSkJLyogaXZfb2Zmc2V0ID09IHNlZyBvZmZzZXQgKi8KKy8qCisgKiBGdW5jdGlvbiBhY2NlcHRzIG9uZSBzdHJpbmcgaW4gY2lwaGVyIHNwZWNpZmljYXRpb24KKyAqIChjaGFpbm1vZGUgYW5kIGl2IHNob3VsZCBiZSBOVUxMIGJlY2F1c2UgaW5jbHVkZWQgaW4gY2lwaGVyIHN0cmluZykKKyAqICAgb3IKKyAqIHNlcGFyYXRlIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIGpvaW5lZCB0byAiY2lwaGVyLWNoYWlubW9kZS1pdiIKKyAqLworaW50IGRtX3RyZWVfbm9kZV9hZGRfY3J5cHRfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICB1aW50NjRfdCBzaXplLAorCQkJCSAgY29uc3QgY2hhciAqY2lwaGVyLAorCQkJCSAgY29uc3QgY2hhciAqY2hhaW5tb2RlLAorCQkJCSAgY29uc3QgY2hhciAqaXYsCisJCQkJICB1aW50NjRfdCBpdl9vZmZzZXQsCisJCQkJICBjb25zdCBjaGFyICprZXkpOworaW50IGRtX3RyZWVfbm9kZV9hZGRfbWlycm9yX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgIHVpbnQ2NF90IHNpemUpOworCisvKiBNaXJyb3IgbG9nIGZsYWdzICovCisjZGVmaW5lIERNX05PU1lOQwkJMHgwMDAwMDAwMQkvKiBLbm93biBhbHJlYWR5IGluIHN5bmMgKi8KKyNkZWZpbmUgRE1fRk9SQ0VTWU5DCQkweDAwMDAwMDAyCS8qIEZvcmNlIHJlc3luYyAqLworI2RlZmluZSBETV9CTE9DS19PTl9FUlJPUgkweDAwMDAwMDA0CS8qIE9uIGVycm9yLCBzdXNwZW5kIEkvTyAqLworI2RlZmluZSBETV9DT1JFTE9HCQkweDAwMDAwMDA4CS8qIEluLW1lbW9yeSBsb2cgKi8KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfbWlycm9yX3RhcmdldF9sb2coc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgICAgICAgdWludDMyX3QgcmVnaW9uX3NpemUsCisJCQkJICAgICAgIHVuc2lnbmVkIGNsdXN0ZXJlZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbG9nX3V1aWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGFyZWFfY291bnQsCisJCQkJICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworaW50IGRtX3RyZWVfbm9kZV9hZGRfcmFpZF90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgdWludDY0X3Qgc2l6ZSwKKwkJCQkgY29uc3QgY2hhciAqcmFpZF90eXBlLAorCQkJCSB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJCQkgdWludDMyX3Qgc3RyaXBlX3NpemUsCisJCQkJIHVpbnQ2NF90IHJlYnVpbGRzLAorCQkJCSB1aW50NjRfdCBmbGFncyk7CisKKy8qCisgKiBEZWZpbmVzIGJlbG93IGFyZSBiYXNlZCBvbiBrZXJuZWwncyBkbS1jYWNoZS5jIGRlZmluZXMKKyAqIERNX0NBQ0hFX01JTl9EQVRBX0JMT0NLX1NJWkUgKDMyICogMTAyNCA+PiBTRUNUT1JfU0hJRlQpCisgKiBETV9DQUNIRV9NQVhfREFUQV9CTE9DS19TSVpFICgxMDI0ICogMTAyNCAqIDEwMjQgPj4gU0VDVE9SX1NISUZUKQorICovCisjZGVmaW5lIERNX0NBQ0hFX01JTl9EQVRBX0JMT0NLX1NJWkUgKFVJTlQzMl9DKDY0KSkKKyNkZWZpbmUgRE1fQ0FDSEVfTUFYX0RBVEFfQkxPQ0tfU0laRSAoVUlOVDMyX0MoMjA5NzE1MikpCisvKgorICogTWF4IHN1cHBvcnRlZCBzaXplIGZvciBjYWNoZSBwb29sIG1ldGFkYXRhIGRldmljZS4KKyAqIExpbWl0YXRpb24gaXMgaGFyZGNvZGVkIGludG8gdGhlIGtlcm5lbCBhbmQgYmlnZ2VyIGRldmljZSBzaXplcworICogYXJlIG5vdCBhY2NlcHRlZC4KKyAqCisgKiBMaW1pdCBkZWZpbmVkIGluIGRyaXZlcnMvbWQvZG0tY2FjaGUtbWV0YWRhdGEuaAorICovCisjZGVmaW5lIERNX0NBQ0hFX01FVEFEQVRBX01BWF9TRUNUT1JTIERNX1RISU5fTUVUQURBVEFfTUFYX1NFQ1RPUlMKKworc3RydWN0IGRtX3RyZWVfbm9kZV9yYWlkX3BhcmFtcyB7CisJY29uc3QgY2hhciAqcmFpZF90eXBlOworCisJdWludDMyX3Qgc3RyaXBlczsKKwl1aW50MzJfdCBtaXJyb3JzOworCXVpbnQzMl90IHJlZ2lvbl9zaXplOworCXVpbnQzMl90IHN0cmlwZV9zaXplOworCisJLyoKKwkgKiAncmVidWlsZHMnIGFuZCAnd3JpdGVtb3N0bHknIGFyZSBiaXRmaWVsZHMgdGhhdCBzaWduaWZ5CisJICogd2hpY2ggZGV2aWNlcyBpbiB0aGUgYXJyYXkgYXJlIHRvIGJlIHJlYnVpbHQgb3IgbWFya2VkCisJICogd3JpdGVtb3N0bHkuICBCeSBjaG9vc2luZyBhICd1aW50NjRfdCcsIHdlIGxpbWl0IG91cnNlbGYKKwkgKiB0byBSQUlEIGFycmF5cyB3aXRoIDY0IGRldmljZXMuCisJICovCisJdWludDY0X3QgcmVidWlsZHM7CisJdWludDY0X3Qgd3JpdGVtb3N0bHk7CisJdWludDMyX3Qgd3JpdGViZWhpbmQ7ICAgICAgIC8qIEkvT3MgKGtlcm5lbCBkZWZhdWx0IENPVU5URVJfTUFYIC8gMikgKi8KKwl1aW50MzJfdCBzeW5jX2RhZW1vbl9zbGVlcDsgLyogbXMgKGtlcm5lbCBkZWZhdWx0ID0gNXNlYykgKi8KKwl1aW50MzJfdCBtYXhfcmVjb3ZlcnlfcmF0ZTsgLyoga0Ivc2VjL2Rpc2sgKi8KKwl1aW50MzJfdCBtaW5fcmVjb3ZlcnlfcmF0ZTsgLyoga0Ivc2VjL2Rpc2sgKi8KKwl1aW50MzJfdCBzdHJpcGVfY2FjaGU7ICAgICAgLyogc2VjdG9ycyAqLworCisJdWludDY0X3QgZmxhZ3M7ICAgICAgICAgICAgIC8qIFtub11zeW5jICovCisJdWludDY0X3QgcmVzZXJ2ZWQyOworfTsKKworaW50IGRtX3RyZWVfbm9kZV9hZGRfcmFpZF90YXJnZXRfd2l0aF9wYXJhbXMoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJICAgICB1aW50NjRfdCBzaXplLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGVfcmFpZF9wYXJhbXMgKnApOworCisvKiBDYWNoZSBmZWF0dXJlX2ZsYWdzICovCisjZGVmaW5lIERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVCQUNLICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1fQ0FDSEVfRkVBVFVSRV9XUklURVRIUk9VR0ggMHgwMDAwMDAwMgorI2RlZmluZSBETV9DQUNIRV9GRUFUVVJFX1BBU1NUSFJPVUdIICAweDAwMDAwMDA0CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZTsKKy8qCisgKiBVc2UgZm9yIHBhc3NpbmcgY2FjaGUgcG9saWN5IGFuZCBhbGwgaXRzIGFyZ3MgZS5nLjoKKyAqCisgKiBwb2xpY3lfc2V0dGluZ3MgeworICogICAgbWlncmF0aW9uX3RocmVzaG9sZD0yMDQ4CisgKiAgICBzZXF1ZW50aW9uX3RocmVhc2hvbGQ9MTAwCisgKiAgICAuLi4KKyAqIH0KKyAqCisgKiBGb3IgcG9saWN5IHdpdGhvdXQgYW55IHBhcmFtZXRlcnMgdXNlIE5VTEwuCisgKi8KK2ludCBkbV90cmVlX25vZGVfYWRkX2NhY2hlX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgdWludDY0X3Qgc2l6ZSwKKwkJCQkgIHVpbnQ2NF90IGZlYXR1cmVfZmxhZ3MsIC8qIERNX0NBQ0hFX0ZFQVRVUkVfKiAqLworCQkJCSAgY29uc3QgY2hhciAqbWV0YWRhdGFfdXVpZCwKKwkJCQkgIGNvbnN0IGNoYXIgKmRhdGFfdXVpZCwKKwkJCQkgIGNvbnN0IGNoYXIgKm9yaWdpbl91dWlkLAorCQkJCSAgY29uc3QgY2hhciAqcG9saWN5X25hbWUsCisJCQkJICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBvbGljeV9zZXR0aW5ncywKKwkJCQkgIHVpbnQzMl90IGRhdGFfYmxvY2tfc2l6ZSk7CisKKy8qCisgKiBGSVhNRSBBZGQgaW5kaXZpZHVhbCBjYWNoZSBwb2xpY3kgcGFpcnMgIDxrZXk+ID0gdmFsdWUsIGxpa2U6CisgKiBpbnQgZG1fdHJlZV9ub2RlX2FkZF9jYWNoZV9wb2xpY3lfYXJnKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorICoJCQkJICAgICAgY29uc3QgY2hhciAqa2V5LCB1aW50NjRfdCB2YWx1ZSk7CisgKi8KKworLyoKKyAqIFJlcGxpY2F0b3Igb3BlcmF0aW9uIG1vZGUKKyAqIE5vdGU6IEFQSSBmb3IgUmVwbGljYXRvciBpcyBub3QgeWV0IHN0YWJsZQorICovCit0eXBlZGVmIGVudW0geworCURNX1JFUExJQ0FUT1JfU1lOQywJCQkvKiBTeW5jaHJvbm91cyByZXBsaWNhdGlvbiAqLworCURNX1JFUExJQ0FUT1JfQVNZTkNfV0FSTiwJCS8qIFdhcm4gaWYgYXN5bmMgcmVwbGljYXRvciBpcyBzbG93ICovCisJRE1fUkVQTElDQVRPUl9BU1lOQ19TVEFMTCwJCS8qIFN0YWxsIHJlcGxpY2F0b3IgaWYgbm90IGZhc3QgZW5vdWdoICovCisJRE1fUkVQTElDQVRPUl9BU1lOQ19EUk9QLAkJLyogRHJvcCBzaXRlcyBvdXQgb2Ygc3luYyAqLworCURNX1JFUExJQ0FUT1JfQVNZTkNfRkFJTCwJCS8qIEZhaWwgcmVwbGljYXRvciBpZiBzbG93ICovCisJTlVNX0RNX1JFUExJQ0FUT1JfTU9ERVMKK30gZG1fcmVwbGljYXRvcl9tb2RlX3Q7CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3JlcGxpY2F0b3JfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgICAgIHVpbnQ2NF90IHNpemUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnJsb2dfdXVpZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcmxvZ190eXBlLAorCQkJCSAgICAgICB1bnNpZ25lZCByc2l0ZV9pbmRleCwKKwkJCQkgICAgICAgZG1fcmVwbGljYXRvcl9tb2RlX3QgbW9kZSwKKwkJCQkgICAgICAgdWludDMyX3QgYXN5bmNfdGltZW91dCwKKwkJCQkgICAgICAgdWludDY0X3QgZmFsbF9iZWhpbmRfZGF0YSwKKwkJCQkgICAgICAgdWludDMyX3QgZmFsbF9iZWhpbmRfaW9zKTsKKworaW50IGRtX3RyZWVfbm9kZV9hZGRfcmVwbGljYXRvcl9kZXZfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCSAgIHVpbnQ2NF90IHNpemUsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnJlcGxpY2F0b3JfdXVpZCwJLyogUmVwbGljYXRvciBjb250cm9sIGRldmljZSAqLworCQkJCQkgICB1aW50NjRfdCByZGV2aWNlX2luZGV4LAorCQkJCQkgICBjb25zdCBjaGFyICpyZGV2X3V1aWQsCS8qIFJpbWFnZSBkZXZpY2UgbmFtZS91dWlkICovCisJCQkJCSAgIHVuc2lnbmVkIHJzaXRlX2luZGV4LAorCQkJCQkgICBjb25zdCBjaGFyICpzbG9nX3V1aWQsCisJCQkJCSAgIHVpbnQzMl90IHNsb2dfZmxhZ3MsCQkvKiBNaXJyb3IgbG9nIGZsYWdzICovCisJCQkJCSAgIHVpbnQzMl90IHNsb2dfcmVnaW9uX3NpemUpOworLyogRW5kIG9mIFJlcGxpY2F0b3IgQVBJICovCisKKy8qCisgKiBGSVhNRTogRGVmaW5lcyBiZWxsb3cgYXJlIGJhc2VkIG9uIGtlcm5lbCdzIGRtLXRoaW4uYyBkZWZpbmVzCisgKiBEQVRBX0RFVl9CTE9DS19TSVpFX01JTl9TRUNUT1JTICg2NCAqIDEwMjQgPj4gU0VDVE9SX1NISUZUKQorICogREFUQV9ERVZfQkxPQ0tfU0laRV9NQVhfU0VDVE9SUyAoMTAyNCAqIDEwMjQgKiAxMDI0ID4+IFNFQ1RPUl9TSElGVCkKKyAqLworI2RlZmluZSBETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkUgKFVJTlQzMl9DKDEyOCkpCisjZGVmaW5lIERNX1RISU5fTUFYX0RBVEFfQkxPQ0tfU0laRSAoVUlOVDMyX0MoMjA5NzE1MikpCisvKgorICogTWF4IHN1cHBvcnRlZCBzaXplIGZvciB0aGluIHBvb2wgIG1ldGFkYXRhIGRldmljZSAoMTcxMTI3NjAzMjAgYnl0ZXMpCisgKiBMaW1pdGF0aW9uIGlzIGhhcmRjb2RlZCBpbnRvIHRoZSBrZXJuZWwgYW5kIGJpZ2dlciBkZXZpY2Ugc2l6ZQorICogaXMgbm90IGFjY2VwdGVkLgorICogZHJpdmVycy9tZC9kbS10aGluLW1ldGFkYXRhLmggVEhJTl9NRVRBREFUQV9NQVhfU0VDVE9SUworICovCisjZGVmaW5lIERNX1RISU5fTUFYX01FVEFEQVRBX1NJWkUgICAoVUlOVDY0X0MoMjU1KSAqICgxIDw8IDE0KSAqICg0MDk2IC8gKDEgPDwgOSkpIC0gMjU2ICogMTAyNCkKKworaW50IGRtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgIHVpbnQ2NF90IHNpemUsCisJCQkJICAgICAgdWludDY0X3QgdHJhbnNhY3Rpb25faWQsCisJCQkJICAgICAgY29uc3QgY2hhciAqbWV0YWRhdGFfdXVpZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpwb29sX3V1aWQsCisJCQkJICAgICAgdWludDMyX3QgZGF0YV9ibG9ja19zaXplLAorCQkJCSAgICAgIHVpbnQ2NF90IGxvd193YXRlcl9tYXJrLAorCQkJCSAgICAgIHVuc2lnbmVkIHNraXBfYmxvY2tfemVyb2luZyk7CisKKy8qIFN1cHBvcnRlZCBtZXNzYWdlcyBmb3IgdGhpbiBwcm92aXNpb24gdGFyZ2V0ICovCit0eXBlZGVmIGVudW0geworCURNX1RISU5fTUVTU0FHRV9DUkVBVEVfU05BUCwJCS8qIGRldmljZV9pZCwgb3JpZ2luX2lkICovCisJRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOLAkJLyogZGV2aWNlX2lkICovCisJRE1fVEhJTl9NRVNTQUdFX0RFTEVURSwJCQkvKiBkZXZpY2VfaWQgKi8KKwlETV9USElOX01FU1NBR0VfU0VUX1RSQU5TQUNUSU9OX0lELAkvKiBjdXJyZW50X2lkLCBuZXdfaWQgKi8KKwlETV9USElOX01FU1NBR0VfUkVTRVJWRV9NRVRBREFUQV9TTkFQLAkvKiB0YXJnZXQgdmVyc2lvbiA+PSAxLjEgKi8KKwlETV9USElOX01FU1NBR0VfUkVMRUFTRV9NRVRBREFUQV9TTkFQLAkvKiB0YXJnZXQgdmVyc2lvbiA+PSAxLjEgKi8KK30gZG1fdGhpbl9tZXNzYWdlX3Q7CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3RoaW5fcG9vbF9tZXNzYWdlKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgICAgIGRtX3RoaW5fbWVzc2FnZV90IHR5cGUsCisJCQkJICAgICAgIHVpbnQ2NF90IGlkMSwgdWludDY0X3QgaWQyKTsKKworLyoKKyAqIFNldCB0aGluIHBvb2wgZGlzY2FyZCBmZWF0dXJlcworICogICBpZ25vcmUgICAgICAtIERpc2FibGUgc3VwcG9ydCBmb3IgZGlzY2FyZHMKKyAqICAgbm9fcGFzc2Rvd24gLSBEb24ndCBwYXNzIGRpc2NhcmRzIGRvd24gdG8gdW5kZXJseWluZyBkYXRhIGRldmljZSwKKyAqICAgICAgICAgICAgICAgICBqdXN0IHJlbW92ZSB0aGUgbWFwcGluZworICogRmVhdHVyZSBpcyBhdmFpbGFibGUgc2luY2UgdmVyc2lvbiAxLjEgb2YgdGhlIHRoaW4gdGFyZ2V0LgorICovCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfZGlzY2FyZChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpZ25vcmUsCisJCQkJICAgICAgIHVuc2lnbmVkIG5vX3Bhc3Nkb3duKTsKKy8qCisgKiBTZXQgZXJyb3IgaWYgbm8gc3BhY2UsIGluc3RlYWQgb2YgcXVldWVpbmcgZm9yIHRoaW4gcG9vbC4KKyAqLworaW50IGRtX3RyZWVfbm9kZV9zZXRfdGhpbl9wb29sX2Vycm9yX2lmX25vX3NwYWNlKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCQkgdW5zaWduZWQgZXJyb3JfaWZfbm9fc3BhY2UpOworLyogU3RhcnQgdGhpbiBwb29sIHdpdGggbWV0YWRhdGEgaW4gcmVhZC1vbmx5IG1vZGUgKi8KK2ludCBkbV90cmVlX25vZGVfc2V0X3RoaW5fcG9vbF9yZWFkX29ubHkoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJIHVuc2lnbmVkIHJlYWRfb25seSk7CisvKgorICogRklYTUU6IERlZmluZXMgYmVsbG93IGFyZSBiYXNlZCBvbiBrZXJuZWwncyBkbS10aGluLmMgZGVmaW5lcworICogTUFYX0RFVl9JRCAoKDEgPDwgMjQpIC0gMSkKKyAqLworI2RlZmluZSBETV9USElOX01BWF9ERVZJQ0VfSUQgKFVJTlQzMl9DKCgxIDw8IDI0KSAtIDEpKQoraW50IGRtX3RyZWVfbm9kZV9hZGRfdGhpbl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgdWludDY0X3Qgc2l6ZSwKKwkJCQkgY29uc3QgY2hhciAqcG9vbF91dWlkLAorCQkJCSB1aW50MzJfdCBkZXZpY2VfaWQpOworCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX2V4dGVybmFsX29yaWdpbihzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCQkgIGNvbnN0IGNoYXIgKmV4dGVybmFsX3V1aWQpOworCit2b2lkIGRtX3RyZWVfbm9kZV9zZXRfdWRldl9mbGFncyhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50MTZfdCB1ZGV2X2ZsYWdzKTsKKwordm9pZCBkbV90cmVlX25vZGVfc2V0X3ByZXN1c3BlbmRfbm9kZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKnByZXN1c3BlbmRfbm9kZSk7CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSAgICBjb25zdCBjaGFyICpkbGlkLAorCQkJCSAgICB1aW50NjRfdCBvZmZzZXQpOworCisvKgorICogT25seSBmb3IgdGVtcG9yYXJpbHktbWlzc2luZyByYWlkIGRldmljZXMgd2hlcmUgY2hhbmdlcyBhcmUgdHJhY2tlZC4KKyAqLworaW50IGRtX3RyZWVfbm9kZV9hZGRfbnVsbF9hcmVhKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQ2NF90IG9mZnNldCk7CisKKy8qCisgKiBTZXQgcmVhZGFoZWFkIChpbiBzZWN0b3JzKSBhZnRlciBsb2FkaW5nIHRoZSBub2RlLgorICovCit2b2lkIGRtX3RyZWVfbm9kZV9zZXRfcmVhZF9haGVhZChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkgdWludDMyX3QgcmVhZF9haGVhZCwKKwkJCQkgdWludDMyX3QgcmVhZF9haGVhZF9mbGFncyk7CisKKy8qCisgKiBTZXQgbm9kZSBjYWxsYmFjayBob29rIGJlZm9yZSBkZS9hY3RpdmF0aW9uLgorICogQ2FsbGJhY2sgaXMgY2FsbGVkIGJlZm9yZSAnYWN0aXZhdGlvbicgb2Ygbm9kZSBmb3IgYWN0aXZhdGlvbiB0cmVlLAorICogb3IgJ2RlYWN0aXZhdGlvbicgb2Ygbm9kZSBmb3IgZGVhY3RpdmF0aW9uIHRyZWUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRE1fTk9ERV9DQUxMQkFDS19QUkVMT0FERUQsICAgLyogTm9kZSBoYXMgcHJlbG9hZCBkZXBzICovCisJRE1fTk9ERV9DQUxMQkFDS19ERUFDVElWQVRFRCwgLyogTm9kZSBpcyBkZWFjdGl2YXRlZCAqLworfSBkbV9ub2RlX2NhbGxiYWNrX3Q7Cit0eXBlZGVmIGludCAoKmRtX25vZGVfY2FsbGJhY2tfZm4pIChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICBkbV9ub2RlX2NhbGxiYWNrX3QgdHlwZSwgdm9pZCAqY2JfZGF0YSk7Cit2b2lkIGRtX3RyZWVfbm9kZV9zZXRfY2FsbGJhY2soc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBkbV9ub2RlX2NhbGxiYWNrX2ZuIGNiLCB2b2lkICpjYl9kYXRhKTsKKwordm9pZCBkbV90cmVlX3NldF9jb29raWUoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwgdWludDMyX3QgY29va2llKTsKK3VpbnQzMl90IGRtX3RyZWVfZ2V0X2Nvb2tpZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWJyYXJ5IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKgorICogTWVtb3J5IG1hbmFnZW1lbnQKKyAqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTmV2ZXIgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSAtIHVzZSB0aGUgbWFjcm9zIGZvbGxvd2luZyBpbnN0ZWFkLgorICovCit2b2lkICpkbV9tYWxsb2Nfd3JhcHBlcihzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpIF9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgKmRtX3phbGxvY193cmFwcGVyKHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwlfX2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSkgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOwordm9pZCAqZG1fcmVhbGxvY193cmFwcGVyKHZvaWQgKnAsIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwlfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSk7Cit2b2lkIGRtX2ZyZWVfd3JhcHBlcih2b2lkICpwdHIpOworY2hhciAqZG1fc3RyZHVwX3dyYXBwZXIoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOworaW50IGRtX2R1bXBfbWVtb3J5X3dyYXBwZXIodm9pZCk7Cit2b2lkIGRtX2JvdW5kc19jaGVja193cmFwcGVyKHZvaWQpOworCisjZGVmaW5lIGRtX21hbGxvYyhzKSBkbV9tYWxsb2Nfd3JhcHBlcigocyksIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZG1femFsbG9jKHMpIGRtX3phbGxvY193cmFwcGVyKChzKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBkbV9zdHJkdXAocykgZG1fc3RyZHVwX3dyYXBwZXIoKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIGRtX2ZyZWUocCkgZG1fZnJlZV93cmFwcGVyKHApCisjZGVmaW5lIGRtX3JlYWxsb2MocCwgcykgZG1fcmVhbGxvY193cmFwcGVyKChwKSwgKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIGRtX2R1bXBfbWVtb3J5KCkgZG1fZHVtcF9tZW1vcnlfd3JhcHBlcigpCisjZGVmaW5lIGRtX2JvdW5kc19jaGVjaygpIGRtX2JvdW5kc19jaGVja193cmFwcGVyKCkKKworLyoKKyAqIFRoZSBwb29sIGFsbG9jYXRvciBpcyB1c2VmdWwgd2hlbiB5b3UgYXJlIGdvaW5nIHRvIGFsbG9jYXRlCisgKiBsb3RzIG9mIG1lbW9yeSwgdXNlIHRoZSBtZW1vcnkgZm9yIGEgYml0LCBhbmQgdGhlbiBmcmVlIHRoZQorICogbWVtb3J5IGluIG9uZSBnby4gIEEgc3VycHJpc2luZyBhbW91bnQgb2YgY29kZSBoYXMgdGhpcyB1c2FnZQorICogcHJvZmlsZS4KKyAqCisgKiBZb3Ugc2hvdWxkIHRoaW5rIG9mIHRoZSBwb29sIGFzIGFuIGluZmluaXRlLCBjb250aWd1b3VzIGNodW5rCisgKiBvZiBtZW1vcnkuICBUaGUgZnJvbnQgb2YgdGhpcyBjaHVuayBvZiBtZW1vcnkgY29udGFpbnMKKyAqIGFsbG9jYXRlZCBvYmplY3RzLCB0aGUgc2Vjb25kIGhhbGYgaXMgZnJlZS4gIGRtX3Bvb2xfYWxsb2MgZ3JhYnMKKyAqIHRoZSBuZXh0ICdzaXplJyBieXRlcyBmcm9tIHRoZSBmcmVlIGhhbGYsIGluIGVmZmVjdCBtb3ZpbmcgaXQKKyAqIGludG8gdGhlIGFsbG9jYXRlZCBoYWxmLiAgVGhpcyBvcGVyYXRpb24gaXMgdmVyeSBlZmZpY2llbnQuCisgKgorICogZG1fcG9vbF9mcmVlIGZyZWVzIHRoZSBhbGxvY2F0ZWQgb2JqZWN0ICphbmQqIGFsbCBvYmplY3RzCisgKiBhbGxvY2F0ZWQgYWZ0ZXIgaXQuICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGlzIHNlbWFudGljCisgKiBkaWZmZXJlbmNlIGZyb20gbWFsbG9jL2ZyZWUuICBUaGlzIGlzIGFsc28gZXh0cmVtZWx5CisgKiBlZmZpY2llbnQsIHNpbmNlIGEgc2luZ2xlIGRtX3Bvb2xfZnJlZSBjYW4gZGlzcG9zZSBvZiBhIGxhcmdlCisgKiBjb21wbGV4IG9iamVjdC4KKyAqCisgKiBkbV9wb29sX2Rlc3Ryb3kgZnJlZXMgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogZWcsIElmIHlvdSBhcmUgYnVpbGRpbmcgYSBiaW5hcnkgdHJlZSBpbiB5b3VyIHByb2dyYW0sIGFuZAorICoga25vdyB0aGF0IHlvdSBhcmUgb25seSBldmVyIGdvaW5nIHRvIGluc2VydCBpbnRvIHlvdXIgdHJlZSwKKyAqIGFuZCBub3QgZGVsZXRlIChlZywgbWFpbnRhaW5pbmcgYSBzeW1ib2wgdGFibGUgZm9yIGEKKyAqIGNvbXBpbGVyKS4gIFlvdSBjYW4gY3JlYXRlIHlvdXJzZWxmIGEgcG9vbCwgYWxsb2NhdGUgdGhlIG5vZGVzCisgKiBmcm9tIGl0LCBhbmQgd2hlbiB0aGUgdHJlZSBiZWNvbWVzIHJlZHVuZGFudCBjYWxsIGRtX3Bvb2xfZGVzdHJveQorICogKG5vIG5hc3R5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSB0cmVlIHRvIGZyZWUgbm9kZXMpLgorICoKKyAqIGVnLCBPbiB0aGUgb3RoZXIgaGFuZCBpZiB5b3Ugd2FudGVkIHRvIHJlcGVhdGVkbHkgaW5zZXJ0IGFuZAorICogcmVtb3ZlIG9iamVjdHMgaW50byB0aGUgdHJlZSwgeW91IHdvdWxkIGJlIGJldHRlciBvZmYKKyAqIGFsbG9jYXRpbmcgdGhlIG5vZGVzIGZyb20gYSBmcmVlIGxpc3Q7IHlvdSBjYW5ub3QgZnJlZSBhCisgKiBzaW5nbGUgYXJiaXRyYXJ5IG5vZGUgd2l0aCBwb29sLgorICovCisKK3N0cnVjdCBkbV9wb29sOworCisvKiBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciAqLworc3RydWN0IGRtX3Bvb2wgKmRtX3Bvb2xfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBjaHVua19oaW50KQorCV9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgZG1fcG9vbF9kZXN0cm95KHN0cnVjdCBkbV9wb29sICpwKTsKKworLyogc2ltcGxlIGFsbG9jYXRpb24vZnJlZSByb3V0aW5lcyAqLwordm9pZCAqZG1fcG9vbF9hbGxvYyhzdHJ1Y3QgZG1fcG9vbCAqcCwgc2l6ZV90IHMpCisJX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOwordm9pZCAqZG1fcG9vbF9hbGxvY19hbGlnbmVkKHN0cnVjdCBkbV9wb29sICpwLCBzaXplX3QgcywgdW5zaWduZWQgYWxpZ25tZW50KQorCV9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgZG1fcG9vbF9lbXB0eShzdHJ1Y3QgZG1fcG9vbCAqcCk7Cit2b2lkIGRtX3Bvb2xfZnJlZShzdHJ1Y3QgZG1fcG9vbCAqcCwgdm9pZCAqcHRyKTsKKworLyoKKyAqIFRvIGFpZCBkZWJ1Z2dpbmcsIGEgcG9vbCBjYW4gYmUgbG9ja2VkLiBBbnkgbW9kaWZpY2F0aW9ucyBtYWRlCisgKiB0byB0aGUgY29udGVudCBvZiB0aGUgcG9vbCB3aGlsZSBpdCBpcyBsb2NrZWQgY2FuIGJlIGRldGVjdGVkLgorICogRGVmYXVsdCBjb21waWxhdGlvbiBpcyB1c2luZyBhIGNyYyBjaGVja3N1bSB0byBub3RpY2UgbW9kaWZpY2F0aW9ucy4KKyAqIFRoZSBwb29sIGxvY2tpbmcgaXMgdXNpbmcgdGhlIG1wcm90ZWN0IHdpdGggdGhlIGNvbXBpbGF0aW9uIGZsYWcKKyAqIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HIHRvIGVuZm9yY2UgdGhlIG1lbW9yeSBwcm90ZWN0aW9uLgorICovCisvKiBxdWVyeSBwb29sIGxvY2sgc3RhdHVzICovCitpbnQgZG1fcG9vbF9sb2NrZWQoc3RydWN0IGRtX3Bvb2wgKnApOworLyogbWFyayBwb29sIGFzIGxvY2tlZCAqLworaW50IGRtX3Bvb2xfbG9jayhzdHJ1Y3QgZG1fcG9vbCAqcCwgaW50IGNyYykKKwlfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSk7CisvKiBtYXJrIHBvb2wgYXMgdW5sb2NrZWQgKi8KK2ludCBkbV9wb29sX3VubG9jayhzdHJ1Y3QgZG1fcG9vbCAqcCwgaW50IGNyYykKKwlfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSk7CisKKy8qCisgKiBPYmplY3QgYnVpbGRpbmcgcm91dGluZXM6CisgKgorICogVGhlc2UgYWxsb3cgeW91IHRvICdncm93JyBhbiBvYmplY3QsIHVzZWZ1bCBmb3IKKyAqIGJ1aWxkaW5nIHN0cmluZ3MsIG9yIGZpbGxpbmcgaW4gZHluYW1pYworICogYXJyYXlzLgorICoKKyAqIEl0J3MgcHJvYmFibHkgYmVzdCBleHBsYWluZWQgd2l0aCBhbiBleGFtcGxlOgorICoKKyAqIGNoYXIgKmJ1aWxkX3N0cmluZyhzdHJ1Y3QgZG1fcG9vbCAqbWVtKQorICogeworICogICAgICBpbnQgaTsKKyAqICAgICAgY2hhciBidWZmZXJbMTZdOworICoKKyAqICAgICAgaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDEyOCkpCisgKiAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgKgorICogICAgICBmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworICogICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCwgIiwgaSk7CisgKiAgICAgICAgICAgICAgaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgYnVmZmVyLCAwKSkKKyAqICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICogICAgICB9CisgKgorICoJLy8gYWRkIG51bGwKKyAqICAgICAgaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIlwwIiwgMSkpCisgKiAgICAgICAgICAgICAgZ290byBiYWQ7CisgKgorICogICAgICByZXR1cm4gZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7CisgKgorICogYmFkOgorICoKKyAqICAgICAgZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworICogICAgICByZXR1cm4gTlVMTDsKKyAqfQorICoKKyAqIFNvIHN0YXJ0IGFuIG9iamVjdCBieSBjYWxsaW5nIGRtX3Bvb2xfYmVnaW5fb2JqZWN0CisgKiB3aXRoIGEgZ3Vlc3MgYXQgdGhlIGZpbmFsIG9iamVjdCBzaXplIC0gaWYgaW4KKyAqIGRvdWJ0IG1ha2UgdGhlIGd1ZXNzIHRvbyBzbWFsbC4KKyAqCisgKiBUaGVuIGFwcGVuZCBjaHVua3Mgb2YgZGF0YSB0byB5b3VyIG9iamVjdCB3aXRoCisgKiBkbV9wb29sX2dyb3dfb2JqZWN0LiAgRmluYWxseSBnZXQgeW91ciBvYmplY3Qgd2l0aAorICogYSBjYWxsIHRvIGRtX3Bvb2xfZW5kX29iamVjdC4KKyAqCisgKiBTZXR0aW5nIGRlbHRhIHRvIDAgbWVhbnMgaXQgd2lsbCB1c2Ugc3RybGVuKGV4dHJhKS4KKyAqLworaW50IGRtX3Bvb2xfYmVnaW5fb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwLCBzaXplX3QgaGludCk7CitpbnQgZG1fcG9vbF9ncm93X29iamVjdChzdHJ1Y3QgZG1fcG9vbCAqcCwgY29uc3Qgdm9pZCAqZXh0cmEsIHNpemVfdCBkZWx0YSk7Cit2b2lkICpkbV9wb29sX2VuZF9vYmplY3Qoc3RydWN0IGRtX3Bvb2wgKnApOwordm9pZCBkbV9wb29sX2FiYW5kb25fb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwKTsKKworLyogdXRpbGl0aWVzICovCitjaGFyICpkbV9wb29sX3N0cmR1cChzdHJ1Y3QgZG1fcG9vbCAqcCwgY29uc3QgY2hhciAqc3RyKQorCV9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK2NoYXIgKmRtX3Bvb2xfc3RybmR1cChzdHJ1Y3QgZG1fcG9vbCAqcCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbikKKwlfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSk7Cit2b2lkICpkbV9wb29sX3phbGxvYyhzdHJ1Y3QgZG1fcG9vbCAqcCwgc2l6ZV90IHMpCisJX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOworCisvKioqKioqKioqKioqKioqKioqCisgKiBiaXRzZXQgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHVpbnQzMl90ICpkbV9iaXRzZXRfdDsKKworZG1fYml0c2V0X3QgZG1fYml0c2V0X2NyZWF0ZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB1bnNpZ25lZCBudW1fYml0cyk7Cit2b2lkIGRtX2JpdHNldF9kZXN0cm95KGRtX2JpdHNldF90IGJzKTsKKworaW50IGRtX2JpdHNldF9lcXVhbChkbV9iaXRzZXRfdCBpbjEsIGRtX2JpdHNldF90IGluMik7CisKK3ZvaWQgZG1fYml0X2FuZChkbV9iaXRzZXRfdCBvdXQsIGRtX2JpdHNldF90IGluMSwgZG1fYml0c2V0X3QgaW4yKTsKK3ZvaWQgZG1fYml0X3VuaW9uKGRtX2JpdHNldF90IG91dCwgZG1fYml0c2V0X3QgaW4xLCBkbV9iaXRzZXRfdCBpbjIpOworaW50IGRtX2JpdF9nZXRfZmlyc3QoZG1fYml0c2V0X3QgYnMpOworaW50IGRtX2JpdF9nZXRfbmV4dChkbV9iaXRzZXRfdCBicywgaW50IGxhc3RfYml0KTsKKworI2RlZmluZSBETV9CSVRTX1BFUl9JTlQgKHNpemVvZihpbnQpICogQ0hBUl9CSVQpCisKKyNkZWZpbmUgZG1fYml0KGJzLCBpKSBcCisgICAoKGJzKVsoKGkpIC8gRE1fQklUU19QRVJfSU5UKSArIDFdICYgKDB4MSA8PCAoKGkpICYgKERNX0JJVFNfUEVSX0lOVCAtIDEpKSkpCisKKyNkZWZpbmUgZG1fYml0X3NldChicywgaSkgXAorICAgKChicylbKChpKSAvIERNX0JJVFNfUEVSX0lOVCkgKyAxXSB8PSAoMHgxIDw8ICgoaSkgJiAoRE1fQklUU19QRVJfSU5UIC0gMSkpKSkKKworI2RlZmluZSBkbV9iaXRfY2xlYXIoYnMsIGkpIFwKKyAgICgoYnMpWygoaSkgLyBETV9CSVRTX1BFUl9JTlQpICsgMV0gJj0gfigweDEgPDwgKChpKSAmIChETV9CSVRTX1BFUl9JTlQgLSAxKSkpKQorCisjZGVmaW5lIGRtX2JpdF9zZXRfYWxsKGJzKSBcCisgICBtZW1zZXQoKGJzKSArIDEsIC0xLCAoKCooYnMpIC8gRE1fQklUU19QRVJfSU5UKSArIDEpICogc2l6ZW9mKGludCkpCisKKyNkZWZpbmUgZG1fYml0X2NsZWFyX2FsbChicykgXAorICAgbWVtc2V0KChicykgKyAxLCAwLCAoKCooYnMpIC8gRE1fQklUU19QRVJfSU5UKSArIDEpICogc2l6ZW9mKGludCkpCisKKyNkZWZpbmUgZG1fYml0X2NvcHkoYnMxLCBiczIpIFwKKyAgIG1lbWNweSgoYnMxKSArIDEsIChiczIpICsgMSwgKCgqKGJzMSkgLyBETV9CSVRTX1BFUl9JTlQpICsgMSkgKiBzaXplb2YoaW50KSkKKworLyoKKyAqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYml0c2V0IGludG8gYSBkbV9iaXRzZXRfdC4gVGhlCisgKiBub3RhdGlvbiB1c2VkIGlzIGlkZW50aWNhbCB0byB0aGUga2VybmVsIGJpdG1hcCBwYXJzZXIgKGNwdXNldCBldGMuKQorICogYW5kIHN1cHBvcnRzIGJvdGggbGlzdHMgKCIxLDIsMyIpIGFuZCByYW5nZXMgKCIxLTIsNS04IikuIElmIHRoZSBtZW0KKyAqIHBhcmFtZXRlciBpcyBOVUxMIG1lbW9yeSBmb3IgdGhlIGJpdHNldCB3aWxsIGJlIGFsbG9jYXRlZCB1c2luZworICogZG1fbWFsbG9jKCkuIE90aGVyd2lzZSB0aGUgYml0c2V0IHdpbGwgYmUgYWxsb2NhdGVkIHVzaW5nIHRoZSBzdXBwbGllZAorICogZG1fcG9vbC4KKyAqLworZG1fYml0c2V0X3QgZG1fYml0c2V0X3BhcnNlX2xpc3QoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtKTsKKworLyogUmV0dXJucyBudW1iZXIgb2Ygc2V0IGJpdHMgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaHdlaWdodDMyKHVpbnQzMl90IGkpCit7CisJdW5zaWduZWQgciA9IChpICYgMHg1NTU1NTU1NSkgKyAoKGkgPj4gMSkgJiAweDU1NTU1NTU1KTsKKworCXIgPSAgICAociAmIDB4MzMzMzMzMzMpICsgKChyID4+ICAyKSAmIDB4MzMzMzMzMzMpOworCXIgPSAgICAociAmIDB4MEYwRjBGMEYpICsgKChyID4+ICA0KSAmIDB4MEYwRjBGMEYpOworCXIgPSAgICAociAmIDB4MDBGRjAwRkYpICsgKChyID4+ICA4KSAmIDB4MDBGRjAwRkYpOworCXJldHVybiAociAmIDB4MDAwMEZGRkYpICsgKChyID4+IDE2KSAmIDB4MDAwMEZGRkYpOworfQorCisvKioqKioqKioqKioqKioqKgorICogaGFzaCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZG1faGFzaF90YWJsZTsKK3N0cnVjdCBkbV9oYXNoX25vZGU7CisKK3R5cGVkZWYgdm9pZCAoKmRtX2hhc2hfaXRlcmF0ZV9mbikgKHZvaWQgKmRhdGEpOworCitzdHJ1Y3QgZG1faGFzaF90YWJsZSAqZG1faGFzaF9jcmVhdGUodW5zaWduZWQgc2l6ZV9oaW50KQorCV9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgZG1faGFzaF9kZXN0cm95KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0KTsKK3ZvaWQgZG1faGFzaF93aXBlKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0KTsKKwordm9pZCAqZG1faGFzaF9sb29rdXAoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgZG1faGFzaF9pbnNlcnQoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwgdm9pZCAqZGF0YSk7Cit2b2lkIGRtX2hhc2hfcmVtb3ZlKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCBjaGFyICprZXkpOworCit2b2lkICpkbV9oYXNoX2xvb2t1cF9iaW5hcnkoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwgdWludDMyX3QgbGVuKTsKK2ludCBkbV9oYXNoX2luc2VydF9iaW5hcnkoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwgdWludDMyX3QgbGVuLAorCQkJICB2b2lkICpkYXRhKTsKK3ZvaWQgZG1faGFzaF9yZW1vdmVfYmluYXJ5KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVpbnQzMl90IGxlbik7CisKK3Vuc2lnbmVkIGRtX2hhc2hfZ2V0X251bV9lbnRyaWVzKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0KTsKK3ZvaWQgZG1faGFzaF9pdGVyKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBkbV9oYXNoX2l0ZXJhdGVfZm4gZik7CisKK2NoYXIgKmRtX2hhc2hfZ2V0X2tleShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgc3RydWN0IGRtX2hhc2hfbm9kZSAqbik7Cit2b2lkICpkbV9oYXNoX2dldF9kYXRhKHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBzdHJ1Y3QgZG1faGFzaF9ub2RlICpuKTsKK3N0cnVjdCBkbV9oYXNoX25vZGUgKmRtX2hhc2hfZ2V0X2ZpcnN0KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0KTsKK3N0cnVjdCBkbV9oYXNoX25vZGUgKmRtX2hhc2hfZ2V0X25leHQoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIHN0cnVjdCBkbV9oYXNoX25vZGUgKm4pOworCisvKgorICogZG1faGFzaF9pbnNlcnQoKSByZXBsYWNlcyB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcKKyAqIGVudHJ5IHdpdGggYSBtYXRjaGluZyBrZXkgaWYgb25lIGV4aXN0cy4gIE90aGVyd2lzZQorICogaXQgYWRkcyBhIG5ldyBlbnRyeS4KKyAqCisgKiBkbV9oYXNoX2luc2VydF93aXRoX3ZhbCgpIGluc2VydHMgYSBuZXcgZW50cnkgaWYKKyAqIGFub3RoZXIgZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMuCisgKiB2YWxfbGVuIGlzIHRoZSBzaXplIG9mIHRoZSBkYXRhIGJlaW5nIGluc2VydGVkLgorICoKKyAqIElmIHR3byBlbnRyaWVzIHdpdGggdGhlIHNhbWUga2V5IGV4aXN0LAorICogKGFkZGVkIHVzaW5nIGRtX2hhc2hfaW5zZXJ0X2FsbG93X211bHRpcGxlKSwgdGhlbjoKKyAqIC4gZG1faGFzaF9sb29rdXAoKSByZXR1cm5zIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMsIGFuZAorICogICBkbV9oYXNoX2xvb2t1cF93aXRoX3ZhbCgpIHJldHVybnMgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKKyAqICAgdmFsX2xlbi92YWwuCisgKiAuIGRtX2hhc2hfcmVtb3ZlKCkgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIGl0IGZpbmRzLCBhbmQKKyAqICAgZG1faGFzaF9yZW1vdmVfd2l0aF92YWwoKSByZW1vdmVzIHRoZSBvbmUgd2l0aCBhIG1hdGNoaW5nCisgKiAgIHZhbF9sZW4vdmFsLgorICoKKyAqIElmIGEgc2luZ2xlIGVudHJ5IHdpdGggYSBnaXZlbiBrZXkgZXhpc3RzLCBhbmQgaXQgaGFzCisgKiB6ZXJvIHZhbF9sZW4sIHRoZW46CisgKiAuIGRtX2hhc2hfbG9va3VwKCkgcmV0dXJucyBpdAorICogLiBkbV9oYXNoX2xvb2t1cF93aXRoX3ZhbCh2YWxfbGVuPTApIHJldHVybnMgaXQKKyAqIC4gZG1faGFzaF9yZW1vdmUoKSByZW1vdmVzIGl0CisgKiAuIGRtX2hhc2hfcmVtb3ZlX3dpdGhfdmFsKHZhbF9sZW49MCkgcmVtb3ZlcyBpdAorICoKKyAqIGRtX2hhc2hfbG9va3VwX3dpdGhfY291bnQoKSBpcyBhIHNpbmdsZSBjYWxsIHRoYXQgd2lsbAorICogYm90aCBsb29rdXAgYSBrZXkncyB2YWx1ZSBhbmQgY2hlY2sgaWYgdGhlcmUgaXMgbW9yZQorICogdGhhbiBvbmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5LgorICoKKyAqIChJdCBpcyBub3QgbWVhbnQgdG8gcmV0cmlldmUgYWxsIHRoZSBlbnRyaWVzIHdpdGggdGhlCisgKiBnaXZlbiBrZXkuICBJbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBzaW5nbGUgZW50cnkgZXhpc3RzCisgKiBmb3IgdGhlIGtleSwgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYSBzaW5nbGUgY2FsbCB0aGF0IHdpbGwKKyAqIGJvdGggbG9vayB1cCB0aGUgdmFsdWUgYW5kIGluZGljYXRlIGlmIG11bHRpcGxlIHZhbHVlcworICogZXhpc3QgZm9yIHRoZSBrZXkuKQorICoKKyAqIGRtX2hhc2hfbG9va3VwX3dpdGhfY291bnQ6CisgKiAuIElmIG5vIGVudHJpZXMgZXhpc3QsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwsIGFuZAorICogICB0aGUgY291bnQgaXMgc2V0IHRvIDAuCisgKiAuIElmIG9ubHkgb25lIGVudHJ5IGV4aXN0cywgdGhlIHZhbHVlIG9mIHRoYXQgZW50cnkgaXMKKyAqICAgcmV0dXJuZWQgYW5kIGNvdW50IGlzIHNldCB0byAxLgorICogLiBJZiBOIGVudHJpZXMgZXhpc3RzLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVudHJ5IGlzCisgKiAgIHJldHVybmVkIGFuZCBjb3VudCBpcyBzZXQgdG8gTi4KKyAqLworCit2b2lkICpkbV9oYXNoX2xvb2t1cF93aXRoX3ZhbChzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCB2YWxfbGVuKTsKK3ZvaWQgZG1faGFzaF9yZW1vdmVfd2l0aF92YWwoc3RydWN0IGRtX2hhc2hfdGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCB2YWxfbGVuKTsKK2ludCBkbV9oYXNoX2luc2VydF9hbGxvd19tdWx0aXBsZShzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgdmFsX2xlbik7Cit2b2lkICpkbV9oYXNoX2xvb2t1cF93aXRoX2NvdW50KHN0cnVjdCBkbV9oYXNoX3RhYmxlICp0LCBjb25zdCBjaGFyICprZXksIGludCAqY291bnQpOworCisKKyNkZWZpbmUgZG1faGFzaF9pdGVyYXRlKHYsIGgpIFwKKwlmb3IgKHYgPSBkbV9oYXNoX2dldF9maXJzdCgoaCkpOyB2OyBcCisJICAgICB2ID0gZG1faGFzaF9nZXRfbmV4dCgoaCksIHYpKQorCisvKioqKioqKioqKioqKioqKgorICogbGlzdCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqLworCisvKgorICogQSBsaXN0IGNvbnNpc3RzIG9mIGEgbGlzdCBoZWFkIHBsdXMgZWxlbWVudHMuCisgKiBFYWNoIGVsZW1lbnQgaGFzICduZXh0JyBhbmQgJ3ByZXZpb3VzJyBwb2ludGVycy4KKyAqIFRoZSBsaXN0IGhlYWQncyBwb2ludGVycyBwb2ludCB0byB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGVsZW1lbnQuCisgKi8KKworc3RydWN0IGRtX2xpc3QgeworCXN0cnVjdCBkbV9saXN0ICpuLCAqcDsKK307CisKKy8qCisgKiBTdHJpbmcgbGlzdC4KKyAqLworc3RydWN0IGRtX3N0cl9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNvbnN0IGNoYXIgKnN0cjsKK307CisKKy8qCisgKiBJbml0aWFsaXNlIGEgbGlzdCBiZWZvcmUgdXNlLgorICogVGhlIGxpc3QgaGVhZCdzIG5leHQgYW5kIHByZXZpb3VzIHBvaW50ZXJzIHBvaW50IGJhY2sgdG8gaXRzZWxmLgorICovCisjZGVmaW5lIERNX0xJU1RfSEVBRF9JTklUKG5hbWUpCSB7ICYobmFtZSksICYobmFtZSkgfQorI2RlZmluZSBETV9MSVNUX0lOSVQobmFtZSkJc3RydWN0IGRtX2xpc3QgbmFtZSA9IERNX0xJU1RfSEVBRF9JTklUKG5hbWUpCit2b2lkIGRtX2xpc3RfaW5pdChzdHJ1Y3QgZG1fbGlzdCAqaGVhZCk7CisKKy8qCisgKiBJbnNlcnQgYW4gZWxlbWVudCBiZWZvcmUgJ2hlYWQnLgorICogSWYgJ2hlYWQnIGlzIHRoZSBsaXN0IGhlYWQsIHRoaXMgYWRkcyBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKi8KK3ZvaWQgZG1fbGlzdF9hZGQoc3RydWN0IGRtX2xpc3QgKmhlYWQsIHN0cnVjdCBkbV9saXN0ICplbGVtKTsKKworLyoKKyAqIEluc2VydCBhbiBlbGVtZW50IGFmdGVyICdoZWFkJy4KKyAqIElmICdoZWFkJyBpcyB0aGUgbGlzdCBoZWFkLCB0aGlzIGFkZHMgYW4gZWxlbWVudCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgKi8KK3ZvaWQgZG1fbGlzdF9hZGRfaChzdHJ1Y3QgZG1fbGlzdCAqaGVhZCwgc3RydWN0IGRtX2xpc3QgKmVsZW0pOworCisvKgorICogRGVsZXRlIGFuIGVsZW1lbnQgZnJvbSBpdHMgbGlzdC4KKyAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBlbGVtZW50IGl0c2VsZiAtIGl0IG1heSBzdGlsbCBiZSBzYWZlCisgKiB0byBmb2xsb3cgaXRzIHBvaW50ZXJzLgorICovCit2b2lkIGRtX2xpc3RfZGVsKHN0cnVjdCBkbV9saXN0ICplbGVtKTsKKworLyoKKyAqIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gZXhpc3RpbmcgbGlzdCBhbmQgaW5zZXJ0IGJlZm9yZSAnaGVhZCcuCisgKi8KK3ZvaWQgZG1fbGlzdF9tb3ZlKHN0cnVjdCBkbV9saXN0ICpoZWFkLCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSk7CisKKy8qCisgKiBKb2luICdoZWFkMScgdG8gdGhlIGVuZCBvZiAnaGVhZCcuCisgKi8KK3ZvaWQgZG1fbGlzdF9zcGxpY2Uoc3RydWN0IGRtX2xpc3QgKmhlYWQsIHN0cnVjdCBkbV9saXN0ICpoZWFkMSk7CisKKy8qCisgKiBJcyB0aGUgbGlzdCBlbXB0eT8KKyAqLworaW50IGRtX2xpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGRtX2xpc3QgKmhlYWQpOworCisvKgorICogSXMgdGhpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdD8KKyAqLworaW50IGRtX2xpc3Rfc3RhcnQoY29uc3Qgc3RydWN0IGRtX2xpc3QgKmhlYWQsIGNvbnN0IHN0cnVjdCBkbV9saXN0ICplbGVtKTsKKworLyoKKyAqIElzIHRoaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdD8KKyAqLworaW50IGRtX2xpc3RfZW5kKGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSk7CisKKy8qCisgKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCBvciBOVUxMIGlmIGVtcHR5CisgKi8KK3N0cnVjdCBkbV9saXN0ICpkbV9saXN0X2ZpcnN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkKTsKKworLyoKKyAqIFJldHVybiBsYXN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgb3IgTlVMTCBpZiBlbXB0eQorICovCitzdHJ1Y3QgZG1fbGlzdCAqZG1fbGlzdF9sYXN0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkKTsKKworLyoKKyAqIFJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCBvZiB0aGUgbGlzdCwgb3IgTlVMTCBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBzdGFydC4KKyAqLworc3RydWN0IGRtX2xpc3QgKmRtX2xpc3RfcHJldihjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqaGVhZCwgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmVsZW0pOworCisvKgorICogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QsIG9yIE5VTEwgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqZG1fbGlzdF9uZXh0KGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqZWxlbSk7CisKKy8qCisgKiBHaXZlbiB0aGUgYWRkcmVzcyB2IG9mIGFuIGluc3RhbmNlIG9mICdzdHJ1Y3QgZG1fbGlzdCcgY2FsbGVkICdoZWFkJworICogY29udGFpbmVkIGluIGEgc3RydWN0dXJlIG9mIHR5cGUgdCwgcmV0dXJuIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBkbV9saXN0X3N0cnVjdF9iYXNlKHYsIHQsIGhlYWQpIFwKKyAgICAoKHQgKikoKGNvbnN0IGNoYXIgKikodikgLSAoY29uc3QgY2hhciAqKSYoKHQgKikgMCktPmhlYWQpKQorCisvKgorICogR2l2ZW4gdGhlIGFkZHJlc3MgdiBvZiBhbiBpbnN0YW5jZSBvZiAnc3RydWN0IGRtX2xpc3QgbGlzdCcgY29udGFpbmVkIGluCisgKiBhIHN0cnVjdHVyZSBvZiB0eXBlIHQsIHJldHVybiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVtKHYsIHQpIGRtX2xpc3Rfc3RydWN0X2Jhc2UoKHYpLCB0LCBsaXN0KQorCisvKgorICogR2l2ZW4gdGhlIGFkZHJlc3MgdiBvZiBvbmUga25vd24gZWxlbWVudCBlIGluIGEga25vd24gc3RydWN0dXJlIG9mIHR5cGUgdCwKKyAqIHJldHVybiBhbm90aGVyIGVsZW1lbnQgZi4KKyAqLworI2RlZmluZSBkbV9zdHJ1Y3RfZmllbGQodiwgdCwgZSwgZikgXAorICAgICgoKHQgKikoKHVpbnRwdHJfdCkodikgLSAodWludHB0cl90KSYoKHQgKikgMCktPmUpKS0+ZikKKworLyoKKyAqIEdpdmVuIHRoZSBhZGRyZXNzIHYgb2YgYSBrbm93biBlbGVtZW50IGUgaW4gYSBrbm93biBzdHJ1Y3R1cmUgb2YgdHlwZSB0LAorICogcmV0dXJuIHRoZSBsaXN0IGhlYWQgJ2xpc3QnCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9oZWFkKHYsIHQsIGUpIGRtX3N0cnVjdF9maWVsZCh2LCB0LCBlLCBsaXN0KQorCisvKgorICogU2V0IHYgdG8gZWFjaCBlbGVtZW50IG9mIGEgbGlzdCBpbiB0dXJuLgorICovCisjZGVmaW5lIGRtX2xpc3RfaXRlcmF0ZSh2LCBoZWFkKSBcCisJZm9yICh2ID0gKGhlYWQpLT5uOyB2ICE9IGhlYWQ7IHYgPSB2LT5uKQorCisvKgorICogU2V0IHYgdG8gZWFjaCBlbGVtZW50IGluIGEgbGlzdCBpbiB0dXJuLCBzdGFydGluZyBmcm9tIHRoZSBlbGVtZW50CisgKiBpbiBmcm9udCBvZiAnc3RhcnQnLgorICogWW91IGNhbiB1c2UgdGhpcyB0byAndW53aW5kJyBhIGxpc3RfaXRlcmF0ZSBhbmQgYmFjayBvdXQgYWN0aW9ucyBvbgorICogYWxyZWFkeS1wcm9jZXNzZWQgZWxlbWVudHMuCisgKiBJZiAnc3RhcnQnIGlzICdoZWFkJyBpdCB3YWxrcyB0aGUgbGlzdCBiYWNrd2FyZHMuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF91bml0ZXJhdGUodiwgaGVhZCwgc3RhcnQpIFwKKwlmb3IgKHYgPSAoc3RhcnQpLT5wOyB2ICE9IGhlYWQ7IHYgPSB2LT5wKQorCisvKgorICogQSBzYWZlIHdheSB0byB3YWxrIGEgbGlzdCBhbmQgZGVsZXRlIGFuZCBmcmVlIHNvbWUgZWxlbWVudHMgYWxvbmcKKyAqIHRoZSB3YXkuCisgKiB0IG11c3QgYmUgZGVmaW5lZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHYuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVyYXRlX3NhZmUodiwgdCwgaGVhZCkgXAorCWZvciAodiA9IChoZWFkKS0+biwgdCA9IHYtPm47IHYgIT0gaGVhZDsgdiA9IHQsIHQgPSB2LT5uKQorCisvKgorICogV2FsayBhIGxpc3QsIHNldHRpbmcgJ3YnIGluIHR1cm4gdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIG9mIGVhY2ggaXRlbS4KKyAqIFRoZSBjb250YWluaW5nIHN0cnVjdHVyZSBzaG91bGQgYmUgdGhlIHNhbWUgdHlwZSBhcyAndicuCisgKiBUaGUgJ3N0cnVjdCBkbV9saXN0JyB2YXJpYWJsZSB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIGlzICdmaWVsZCcuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbih2LCBoZWFkLCBmaWVsZCkgXAorCWZvciAodiA9IGRtX2xpc3Rfc3RydWN0X2Jhc2UoKGhlYWQpLT5uLCBfX3R5cGVvZl9fKCp2KSwgZmllbGQpOyBcCisJICAgICAmdi0+ZmllbGQgIT0gKGhlYWQpOyBcCisJICAgICB2ID0gZG1fbGlzdF9zdHJ1Y3RfYmFzZSh2LT5maWVsZC5uLCBfX3R5cGVvZl9fKCp2KSwgZmllbGQpKQorCisvKgorICogV2FsayBhIGxpc3QsIHNldHRpbmcgJ3YnIGluIHR1cm4gdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIG9mIGVhY2ggaXRlbS4KKyAqIFRoZSBjb250YWluaW5nIHN0cnVjdHVyZSBzaG91bGQgYmUgdGhlIHNhbWUgdHlwZSBhcyAndicuCisgKiBUaGUgbGlzdCBzaG91bGQgYmUgJ3N0cnVjdCBkbV9saXN0IGxpc3QnIHdpdGhpbiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHYsIGhlYWQpIGRtX2xpc3RfaXRlcmF0ZV9pdGVtc19nZW4odiwgKGhlYWQpLCBsaXN0KQorCisvKgorICogV2FsayBhIGxpc3QsIHNldHRpbmcgJ3YnIGluIHR1cm4gdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIG9mIGVhY2ggaXRlbS4KKyAqIFRoZSBjb250YWluaW5nIHN0cnVjdHVyZSBzaG91bGQgYmUgdGhlIHNhbWUgdHlwZSBhcyAndicuCisgKiBUaGUgJ3N0cnVjdCBkbV9saXN0JyB2YXJpYWJsZSB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIGlzICdmaWVsZCcuCisgKiB0IG11c3QgYmUgZGVmaW5lZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHYuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbl9zYWZlKHYsIHQsIGhlYWQsIGZpZWxkKSBcCisJZm9yICh2ID0gZG1fbGlzdF9zdHJ1Y3RfYmFzZSgoaGVhZCktPm4sIF9fdHlwZW9mX18oKnYpLCBmaWVsZCksIFwKKwkgICAgIHQgPSBkbV9saXN0X3N0cnVjdF9iYXNlKHYtPmZpZWxkLm4sIF9fdHlwZW9mX18oKnYpLCBmaWVsZCk7IFwKKwkgICAgICZ2LT5maWVsZCAhPSAoaGVhZCk7IFwKKwkgICAgIHYgPSB0LCB0ID0gZG1fbGlzdF9zdHJ1Y3RfYmFzZSh2LT5maWVsZC5uLCBfX3R5cGVvZl9fKCp2KSwgZmllbGQpKQorLyoKKyAqIFdhbGsgYSBsaXN0LCBzZXR0aW5nICd2JyBpbiB0dXJuIHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZSBvZiBlYWNoIGl0ZW0uCisgKiBUaGUgY29udGFpbmluZyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIHR5cGUgYXMgJ3YnLgorICogVGhlIGxpc3Qgc2hvdWxkIGJlICdzdHJ1Y3QgZG1fbGlzdCBsaXN0JyB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLgorICogdCBtdXN0IGJlIGRlZmluZWQgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgb2YgdGhlIHNhbWUgdHlwZSBhcyB2LgorICovCisjZGVmaW5lIGRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHYsIHQsIGhlYWQpIFwKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfZ2VuX3NhZmUodiwgdCwgKGhlYWQpLCBsaXN0KQorCisvKgorICogV2FsayBhIGxpc3QgYmFja3dhcmRzLCBzZXR0aW5nICd2JyBpbiB0dXJuIHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICogb2YgZWFjaCBpdGVtLgorICogVGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlIHNob3VsZCBiZSB0aGUgc2FtZSB0eXBlIGFzICd2Jy4KKyAqIFRoZSAnc3RydWN0IGRtX2xpc3QnIHZhcmlhYmxlIHdpdGhpbiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUgaXMgJ2ZpZWxkJy4KKyAqLworI2RlZmluZSBkbV9saXN0X2l0ZXJhdGVfYmFja19pdGVtc19nZW4odiwgaGVhZCwgZmllbGQpIFwKKwlmb3IgKHYgPSBkbV9saXN0X3N0cnVjdF9iYXNlKChoZWFkKS0+cCwgX190eXBlb2ZfXygqdiksIGZpZWxkKTsgXAorCSAgICAgJnYtPmZpZWxkICE9IChoZWFkKTsgXAorCSAgICAgdiA9IGRtX2xpc3Rfc3RydWN0X2Jhc2Uodi0+ZmllbGQucCwgX190eXBlb2ZfXygqdiksIGZpZWxkKSkKKworLyoKKyAqIFdhbGsgYSBsaXN0IGJhY2t3YXJkcywgc2V0dGluZyAndicgaW4gdHVybiB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqIG9mIGVhY2ggaXRlbS4KKyAqIFRoZSBjb250YWluaW5nIHN0cnVjdHVyZSBzaG91bGQgYmUgdGhlIHNhbWUgdHlwZSBhcyAndicuCisgKiBUaGUgbGlzdCBzaG91bGQgYmUgJ3N0cnVjdCBkbV9saXN0IGxpc3QnIHdpdGhpbiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXModiwgaGVhZCkgZG1fbGlzdF9pdGVyYXRlX2JhY2tfaXRlbXNfZ2VuKHYsIChoZWFkKSwgbGlzdCkKKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgbGlzdCBieSB3YWxraW5nIGl0LgorICovCit1bnNpZ25lZCBpbnQgZG1fbGlzdF9zaXplKGNvbnN0IHN0cnVjdCBkbV9saXN0ICpoZWFkKTsKKworLyoqKioqKioqKgorICogc2VsaW51eAorICoqKioqKioqKi8KKworLyoKKyAqIE9idGFpbiBTRUxpbnV4IHNlY3VyaXR5IGNvbnRleHQgYXNzaWduZWQgZm9yIHRoZSBwYXRoIGFuZCBzZXQgdGhpcworICogY29udGV4dCBmb3IgY3JlYXRpbmcgYSBuZXcgZmlsZSBzeXN0ZW0gb2JqZWN0LiBUaGlzIHNlY3VyaXR5IGNvbnRleHQKKyAqIGlzIGdsb2JhbCBhbmQgaXQgaXMgdXNlZCB1bnRpbCByZXNldCB0byBkZWZhdWx0IHBvbGljeSBiZWhhdmlvdXIKKyAqIGJ5IGNhbGxpbmcgJ2RtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApJy4KKyAqLworaW50IGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKTsKKy8qCisgKiBTZXQgU0VMaW51eCBjb250ZXh0IGZvciBleGlzdGluZyBmaWxlIHN5c3RlbSBvYmplY3QuCisgKi8KK2ludCBkbV9zZXRfc2VsaW51eF9jb250ZXh0KGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKgorICogc3RyaW5nIG1hbmlwdWxhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEJyZWFrIHVwIHRoZSBuYW1lIG9mIGEgbWFwcGVkIGRldmljZSBpbnRvIGl0cyBjb25zdGl0dWVudAorICogVm9sdW1lIEdyb3VwLCBMb2dpY2FsIFZvbHVtZSBhbmQgTGF5ZXIgKGlmIHByZXNlbnQpLgorICogSWYgbWVtIGlzIHN1cHBsaWVkLCB0aGUgcmVzdWx0IGlzIGFsbG9jYXRlZCBmcm9tIHRoZSBtZW1wb29sLgorICogT3RoZXJ3aXNlIHRoZSBzdHJpbmdzIGFyZSBjaGFuZ2VkIGluIHNpdHUuCisgKi8KK2ludCBkbV9zcGxpdF9sdm1fbmFtZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpkbW5hbWUsCisJCSAgICAgIGNoYXIgKip2Z25hbWUsIGNoYXIgKipsdm5hbWUsIGNoYXIgKipsYXllcik7CisKKy8qCisgKiBEZXN0cnVjdGl2ZWx5IHNwbGl0IGJ1ZmZlciBpbnRvIE5VTEwtc2VwYXJhdGVkIHdvcmRzIGluIGFyZ3YuCisgKiBSZXR1cm5zIG51bWJlciBvZiB3b3Jkcy4KKyAqLworaW50IGRtX3NwbGl0X3dvcmRzKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbWF4LAorCQkgICB1bnNpZ25lZCBpZ25vcmVfY29tbWVudHMsIC8qIE5vdCBpbXBsZW1lbnRlZCAqLworCQkgICBjaGFyICoqYXJndik7CisKKy8qCisgKiBSZXR1cm5zIC0xIGlmIGJ1ZmZlciB0b28gc21hbGwKKyAqLworaW50IGRtX3NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworCisvKgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aC4KKyAqLworY29uc3QgY2hhciAqZG1fYmFzZW5hbWUoY29uc3QgY2hhciAqcGF0aCk7CisKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAnYycgaW4gJ3N0cicgb2YgbGVuZ3RoICdzaXplJy4KKyAqLwordW5zaWduZWQgZG1fY291bnRfY2hhcnMoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBjb25zdCBpbnQgYyk7CisKKy8qCisgKiBMZW5ndGggb2Ygc3RyaW5nIGFmdGVyIGVzY2FwaW5nIGRvdWJsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLgorICovCitzaXplX3QgZG1fZXNjYXBlZF9sZW4oY29uc3QgY2hhciAqc3RyKTsKKworLyoKKyAqIDx2Zz4tPGx2Pi08bGF5ZXI+IG9yIGlmICFsYXllciBqdXN0IDx2Zz4tPGx2Pi4KKyAqLworY2hhciAqZG1fYnVpbGRfZG1fbmFtZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICp2Z25hbWUsCisJCSAgICAgICBjb25zdCBjaGFyICpsdm5hbWUsIGNvbnN0IGNoYXIgKmxheWVyKTsKK2NoYXIgKmRtX2J1aWxkX2RtX3V1aWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpsdmlkLCBjb25zdCBjaGFyICpsYXllcik7CisKKy8qCisgKiBDb3BpZXMgYSBzdHJpbmcsIHF1b3RpbmcgZG91YmxlIHF1b3RlcyB3aXRoIGJhY2tzbGFzaGVzLgorICovCitjaGFyICpkbV9lc2NhcGVfZG91YmxlX3F1b3RlcyhjaGFyICpvdXQsIGNvbnN0IGNoYXIgKnNyYyk7CisKKy8qCisgKiBVbmRvIHF1b3RpbmcgaW4gc2l0dS4KKyAqLwordm9pZCBkbV91bmVzY2FwZV9kb3VibGVfcXVvdGVzKGNoYXIgKnNyYyk7CisKKy8qCisgKiBVbmVzY2FwZSBjb2xvbnMgYW5kICJhdCIgc2lnbnMgaW4gc2l0dSBhbmQgc2F2ZSB0aGUgc3Vic3RyaW5ncworICogc3RhcnRpbmcgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCB1bmVzY2FwZWQgY29sb24gYW5kIHRoZQorICogZmlyc3QgdW5lc2NhcGVkICJhdCIgc2lnbi4gVGhpcyBpcyBub3JtYWxseSB1c2VkIHRvIHVuZXNjYXBlCisgKiBkZXZpY2UgbmFtZXMgdXNlZCBhcyBQVnMuCisgKi8KK3ZvaWQgZG1fdW5lc2NhcGVfY29sb25zX2FuZF9hdF9zaWducyhjaGFyICpzcmMsCisJCQkJICAgICBjaGFyICoqc3Vic3RyX2ZpcnN0X3VucXVvdGVkX2NvbG9uLAorCQkJCSAgICAgY2hhciAqKnN1YnN0cl9maXJzdF91bnF1b3RlZF9hdF9zaWduKTsKKworLyoKKyAqIFJlcGxhY2VtZW50IGZvciBzdHJuY3B5KCkgZnVuY3Rpb24uCisgKgorICogQ29waWVzIG5vIG1vcmUgdGhhbiBuIGJ5dGVzIGZyb20gc3RyaW5nIHBvaW50ZWQgYnkgc3JjIHRvIHRoZSBidWZmZXIKKyAqIHBvaW50ZWQgYnkgZGVzdCBhbmQgZW5zdXJlIHN0cmluZyBpcyBmaW5pc2hlZCB3aXRoICdcMCcuCisgKiBSZXR1cm5zIDAgaWYgdGhlIHdob2xlIHN0cmluZyBkb2VzIG5vdCBmaXQuCisgKi8KK2ludCBkbV9zdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pOworCisvKgorICogUmVjb2duaXplIHVuaXQgc3BlY2lmaWVyIGluIHRoZSAndW5pdHMnIGFyZyBhbmQgcmV0dXJuIGEgZmFjdG9yCisgKiByZXByZXNlbnRpbmcgdGhhdCB1bml0LiBJZiB0aGUgJ3VuaXRzJyBjb250YWlucyBhIHByZWZpeCB3aXRoIGRpZ2l0cywKKyAqIHRoZSAndW5pdHMnIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBjdXN0b20gdW5pdC4KKyAqCisgKiBBbHNvLCBzZXQgJ3VuaXRfdHlwZScgb3V0cHV0IGFyZyB0byB0aGUgY2hhcmFjdGVyIHRoYXQgcmVwcmVzZW50cworICogdGhlIHVuaXQgc3BlY2lmaWVkLiBUaGUgJ3VuaXRfdHlwZScgY2hhcmFjdGVyIGVxdWFscyB0byB0aGUgdW5pdAorICogY2hhcmFjdGVyIGl0c2VsZiByZWNvZ25pemVkIGluIHRoZSAndW5pdHMnIGFyZyBmb3IgY2Fub25pY2FsIHVuaXRzLgorICogT3RoZXJ3aXNlLCB0aGUgJ3VuaXRfdHlwZScgY2hhcmFjdGVyIGlzIHNldCB0byAnVScgZm9yIGN1c3RvbSB1bml0LgorICoKKyAqIEFuIGV4YW1wbGUgZm9yIGsvSyBjYW5vbmljYWwgdW5pdHMgYW5kIDhrLzhLIGN1c3RvbSB1bml0czoKKyAqCisgKiAgIHVuaXRzICB1bml0X3R5cGUgIHJldHVybiB2YWx1ZSAoZmFjdG9yKQorICogICBrICAgICAgayAgICAgICAgICAxMDI0CisgKiAgIEsgICAgICBLICAgICAgICAgIDEwMDAKKyAqICAgOGsgICAgIFUgICAgICAgICAgMTAyNCo4CisgKiAgIDhLICAgICBVICAgICAgICAgIDEwMDAqOAorICogICBldGMuLi4KKyAqCisgKiBSZWNvZ25pemVkIHVuaXRzOgorICoKKyAqICAgaC9IIC0gaHVtYW4gcmVhZGFibGUgKHJldHVybnMgMSBmb3IgYm90aCkKKyAqICAgYi9CIC0gYnl0ZSAocmV0dXJucyAxIGZvciBib3RoKQorICogICBzL1MgLSBzZWN0b3IgKHJldHVybnMgNTEyIGZvciBib3RoKQorICogICBrL0sgLSBraWxvIChyZXR1cm5zIDEwMjQvMTAwMCByZXNwZWN0aXZlbHkpCisgKiAgIG0vTSAtIG1lZ2EgKHJldHVybnMgMTAyNF4yLzEwMDBeMiByZXNwZWN0aXZlbHkpCisgKiAgIGcvRyAtIGdpZ2EgKHJldHVybnMgMTAyNF4zLzEwMDBeMyByZXNwZWN0aXZlbHkpCisgKiAgIHQvVCAtIHRlcmEgKHJldHVybnMgMTAyNF40LzEwMDBeNCByZXNwZWN0aXZlbHkpCisgKiAgIHAvUCAtIHBldGEgKHJldHVybnMgMTAyNF41LzEwMDBeNSByZXNwZWN0aXZlbHkpCisgKiAgIGUvRSAtIGV4YSAocmV0dXJucyAxMDI0XjYvMTAwMF42IHJlc3BlY3RpdmVseSkKKyAqCisgKiBPbmx5IG9uZSB1bml0cyBjaGFyYWN0ZXIgaXMgYWxsb3dlZCBpbiB0aGUgJ3VuaXRzJyBhcmcKKyAqIGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYnkgJ3N0cmljdCcgYXJnLgorICoKKyAqIFRoZSAnZW5kcHRyJyBvdXRwdXQgYXJnLCBpZiBub3QgTlVMTCwgc2F2ZXMgdGhlIHBvaW50ZXIKKyAqIGluIHRoZSAndW5pdHMnIHN0cmluZyB3aGljaCBmb2xsb3dzIHRoZSB1bml0IHNwZWNpZmllcgorICogcmVjb2duaXplZCAoSU9XIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgcGFyc2luZyBvZiB0aGUKKyAqIHVuaXQgc3BlY2lmaWVyIHN0b3BwZWQpLgorICoKKyAqIFJldHVybnMgdGhlIHVuaXQgZmFjdG9yIG9yIDAgaWYgbm8gdW5pdCBpcyByZWNvZ25pemVkLgorICovCit1aW50NjRfdCBkbV91bml0c190b19mYWN0b3IoY29uc3QgY2hhciAqdW5pdHMsIGNoYXIgKnVuaXRfdHlwZSwKKwkJCSAgICBpbnQgc3RyaWN0LCBjb25zdCBjaGFyICoqZW5kcHRyKTsKKworLyoKKyAqIFR5cGUgb2YgdW5pdCBzcGVjaWZpZXIgdXNlZCBieSBkbV9zaXplX3RvX3N0cmluZygpLgorICovCit0eXBlZGVmIGVudW0geworCURNX1NJWkVfTE9ORyA9IDAsCS8qIE1lZ2FieXRlICovCisJRE1fU0laRV9TSE9SVCA9IDEsCS8qIE1CIG9yIE1pQiAqLworCURNX1NJWkVfVU5JVCA9IDIJLyogTSBvciBtICovCit9IGRtX3NpemVfc3VmZml4X3Q7CisKKy8qCisgKiBDb252ZXJ0IGEgc2l6ZSAoaW4gNTEyLWJ5dGUgc2VjdG9ycykgaW50byBhIHByaW50YWJsZSBzdHJpbmcgdXNpbmcgdW5pdHMgb2YgdW5pdF90eXBlLgorICogQW4gdXBwZXItY2FzZSB1bml0X3R5cGUgaW5kaWNhdGVzIG91dHB1dCB1bml0cyBiYXNlZCBvbiBwb3dlcnMgb2YgMTAwMCBhcmUKKyAqIHJlcXVpcmVkOyBhIGxvd2VyLWNhc2UgdW5pdF90eXBlIGluZGljYXRlcyBwb3dlcnMgb2YgMTAyNC4KKyAqIEZvciBjb3JyZWN0IG9wZXJhdGlvbiwgdW5pdF9mYWN0b3IgbXVzdCBiZSBvbmUgb2Y6CisgKiAJMCAtIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBpbnRlcm5hbGx5OworICogICBvciB0aGUgb3V0cHV0IGZyb20gZG1fdW5pdHNfdG9fZmFjdG9yKCkgY29ycmVzcG9uZGluZyB0byB1bml0X3R5cGU7CisgKiAgIG9yICd1JyBvciAnVScsIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGFzIHRoZSBwb3dlciBiYXNlLgorICogU2V0IGluY2x1ZGVfc3VmZml4IHRvIDEgdG8gaW5jbHVkZSBhIHN1ZmZpeCBvZiBzdWZmaXhfdHlwZS4KKyAqIFNldCB1c2Vfc2lfdW5pdHMgdG8gMCBmb3Igc3VmZml4ZXMgdGhhdCBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIDEwMDAgYW5kIDEwMjQuCisgKiBTZXQgdXNlX3NpX3VuaXRzIHRvIDEgZm9yIGEgc3VmZml4IHRoYXQgZG9lcyBkaXN0aW5ndWlzaC4KKyAqLworY29uc3QgY2hhciAqZG1fc2l6ZV90b19zdHJpbmcoc3RydWN0IGRtX3Bvb2wgKm1lbSwgdWludDY0X3Qgc2l6ZSwKKwkJCSAgICAgIGNoYXIgdW5pdF90eXBlLCBpbnQgdXNlX3NpX3VuaXRzLAorCQkJICAgICAgdWludDY0X3QgdW5pdF9mYWN0b3IsIGludCBpbmNsdWRlX3N1ZmZpeCwKKwkJCSAgICAgIGRtX3NpemVfc3VmZml4X3Qgc3VmZml4X3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZpbGUvc3RyZWFtIG1hbmlwdWxhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ3JlYXRlIGEgZGlyZWN0b3J5ICh3aXRoIHBhcmVudCBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkpLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKyAqLworaW50IGRtX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqZGlyKTsKKworaW50IGRtX2lzX2VtcHR5X2Rpcihjb25zdCBjaGFyICpkaXIpOworCisvKgorICogQ2xvc2UgYSBzdHJlYW0sIHdpdGggbmljZXIgZXJyb3IgY2hlY2tpbmcgdGhhbiBmY2xvc2Uncy4KKyAqIERlcml2ZWQgZnJvbSBnbnVsaWIncyBjbG9zZS1zdHJlYW0uYy4KKyAqCisgKiBDbG9zZSAic3RyZWFtIi4gIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIGFuZCBFT0YgKHNldHRpbmcgZXJybm8pCisgKiBvdGhlcndpc2UuICBVcG9uIGZhaWx1cmUsIHNldCBlcnJubyB0byAwIGlmIHRoZSBlcnJvciBudW1iZXIKKyAqIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgVXNlZnVsIG1haW5seSBmb3Igd3JpdGFibGUgc3RyZWFtcy4KKyAqLworaW50IGRtX2ZjbG9zZShGSUxFICpzdHJlYW0pOworCisvKgorICogUmV0dXJucyBzaXplIG9mIGEgYnVmZmVyIHdoaWNoIGlzIGFsbG9jYXRlZCB3aXRoIGRtX21hbGxvYy4KKyAqIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gKmJ1Zi4KKyAqIFJldHVybnMgLTEgb24gZmFpbHVyZSBsZWF2aW5nIGJ1ZiB1bmRlZmluZWQuCisgKi8KK2ludCBkbV9hc3ByaW50ZihjaGFyICoqYnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK2ludCBkbV92YXNwcmludGYoY2hhciAqKmJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAwKSkpOworCisvKgorICogY3JlYXRlIGxvY2tmaWxlIChwaWRmaWxlKSAtIGNyZWF0ZSBhbmQgbG9jayBhIGxvY2sgZmlsZQorICogQGxvY2tmaWxlOiBsb2NhdGlvbiBvZiBsb2NrIGZpbGUKKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLCBlcnJubyBpcyBoYW5kbGVkIGludGVybmFsbHkKKyAqLworaW50IGRtX2NyZWF0ZV9sb2NrZmlsZShjb25zdCBjaGFyKiBsb2NrZmlsZSk7CisKKy8qCisgKiBRdWVyeSB3aGV0aGVyIGEgZGFlbW9uIGlzIHJ1bm5pbmcgYmFzZWQgb24gaXRzIGxvY2tmaWxlCisgKgorICogUmV0dXJuczogMSBpZiBydW5uaW5nLCAwIGlmIG5vdAorICovCitpbnQgZG1fZGFlbW9uX2lzX3J1bm5pbmcoY29uc3QgY2hhciogbG9ja2ZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiByZWd1bGFyIGV4cHJlc3Npb25zCisgKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRtX3JlZ2V4OworCisvKgorICogSW5pdGlhbGlzZSBhbiBhcnJheSBvZiBudW0gcGF0dGVybnMgZm9yIG1hdGNoaW5nLgorICogVXNlcyBtZW1vcnkgZnJvbSBtZW0uCisgKi8KK3N0cnVjdCBkbV9yZWdleCAqZG1fcmVnZXhfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKiBjb25zdCAqcGF0dGVybnMsCisJCQkJIHVuc2lnbmVkIG51bV9wYXR0ZXJucyk7CisKKy8qCisgKiBNYXRjaCBzdHJpbmcgcyBhZ2FpbnN0IHRoZSBwYXR0ZXJucy4KKyAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IHBhdHRlcm4gaW4gdGhlIGFycmF5IHRoYXQgbWF0Y2hlcywKKyAqIG9yIC0xIGlmIG5vbmUgbWF0Y2guCisgKi8KK2ludCBkbV9yZWdleF9tYXRjaChzdHJ1Y3QgZG1fcmVnZXggKnJlZ2V4LCBjb25zdCBjaGFyICpzKTsKKworLyoKKyAqIFRoaXMgaXMgdXNlZnVsIGZvciByZWdyZXNzaW9uIHRlc3Rpbmcgb25seS4gIFRoZSBpZGVhIGlzIGlmIHR3bworICogZmluZ2VycHJpbnRzIGFyZSBkaWZmZXJlbnQsIHRoZW4gdGhlIHR3byBkZmFzIGFyZSBjZXJ0YWlubHkgbm90CisgKiBpc29tb3JwaGljLiAgSWYgdHdvIGZpbmdlcnByaW50cyBfYXJlXyB0aGUgc2FtZSB0aGVuIGl0J3MgdmVyeSBsaWtlbHkKKyAqIHRoYXQgdGhlIGRmYXMgYXJlIGlzb21vcnBoaWMuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG1hdGNoaW5nIGlzIGRvbmUuCisgKi8KK3VpbnQzMl90IGRtX3JlZ2V4X2ZpbmdlcnByaW50KHN0cnVjdCBkbV9yZWdleCAqcmVnZXgpOworCisvKioqKioqKioqKioqKioqKioqCisgKiBwZXJjZW50IGhhbmRsaW5nCisgKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEEgZml4ZWQtcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgcGVyY2VudCB2YWx1ZXMuIE9uZSBwZXJjZW50IGVxdWFscyB0bworICogRE1fUEVSQ0VOVF8xIGFzIGRlZmluZWQgYmVsb3cuIFZhbHVlcyB0aGF0IGFyZSBub3QgbXVsdGlwbGVzIG9mIERNX1BFUkNFTlRfMQorICogcmVwcmVzZW50IGZyYWN0aW9ucywgd2l0aCBwcmVjaXNpb24gb2YgMS8xMDAwMDAwIG9mIGEgcGVyY2VudC4gU2VlCisgKiBkbV9wZXJjZW50X3RvX2Zsb2F0IGZvciBhIGNvbnZlcnNpb24gdG8gYSBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgZG1fbWFrZV9wZXJjZW50IHdoZW4gYnVpbGRpbmcgZG1fcGVyY2VudF90IHZhbHVlcy4gVGhlCisgKiBpbXBsZW1lbnRhdGlvbiBvZiBkbV9tYWtlX3BlcmNlbnQgaXMgYmlhc2VkIHRvd2FyZHMgdGhlIG1pZGRsZTogaXQgZW5zdXJlcyB0aGF0CisgKiB0aGUgcmVzdWx0IGlzIERNX1BFUkNFTlRfMCBvciBETV9QRVJDRU5UXzEwMCBpZiBhbmQgb25seSBpZiB0aGlzIGlzIHRoZSBhY3R1YWwKKyAqIHZhbHVlIC0tIGl0IG5ldmVyIHJvdW5kcyBhbnkgaW50ZXJtZWRpYXRlIHZhbHVlICg+IDAgb3IgPCAxMDApIHRvIGVpdGhlciAwCisgKiBvciAxMDAuCisqLworI2RlZmluZSBETV9QRVJDRU5UX0NIQVIgJyUnCisKK3R5cGVkZWYgZW51bSB7CisJRE1fUEVSQ0VOVF8wID0gMCwKKwlETV9QRVJDRU5UXzEgPSAxMDAwMDAwLAorCURNX1BFUkNFTlRfMTAwID0gMTAwICogRE1fUEVSQ0VOVF8xLAorCURNX1BFUkNFTlRfSU5WQUxJRCA9IC0xLAorCURNX1BFUkNFTlRfRkFJTEVEID0gLTIKK30gZG1fcGVyY2VudF9yYW5nZV90OworCit0eXBlZGVmIGludDMyX3QgZG1fcGVyY2VudF90OworCitmbG9hdCBkbV9wZXJjZW50X3RvX2Zsb2F0KGRtX3BlcmNlbnRfdCBwZXJjZW50KTsKK2RtX3BlcmNlbnRfdCBkbV9tYWtlX3BlcmNlbnQodWludDY0X3QgbnVtZXJhdG9yLCB1aW50NjRfdCBkZW5vbWluYXRvcik7CisKKy8qKioqKioqKioqKioqKioqKioqKgorICogdGltZXN0YW1wIGhhbmRsaW5nCisgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDcmVhdGUgYSBkbV90aW1lc3RhbXAgb2JqZWN0IHRvIHVzZSB3aXRoIGRtX3RpbWVzdGFtcF9nZXQuCisgKi8KK3N0cnVjdCBkbV90aW1lc3RhbXAgKmRtX3RpbWVzdGFtcF9hbGxvYyh2b2lkKTsKKworLyoKKyAqIFVwZGF0ZSBkbV90aW1lc3RhbXAgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgY3VycmVudCB0aW1lLgorICovCitpbnQgZG1fdGltZXN0YW1wX2dldChzdHJ1Y3QgZG1fdGltZXN0YW1wICp0cyk7CisKKy8qCisgKiBDb3B5IGEgdGltZXN0YW1wIGZyb20gdHNfb2xkIHRvIHRzX25ldy4KKyAqLwordm9pZCBkbV90aW1lc3RhbXBfY29weShzdHJ1Y3QgZG1fdGltZXN0YW1wICp0c19uZXcsIHN0cnVjdCBkbV90aW1lc3RhbXAgKnRzX29sZCk7CisKKy8qCisgKiBDb21wYXJlIHR3byB0aW1lc3RhbXBzLgorICoKKyAqIFJldHVybjogLTEgaWYgdHMxIGlzIGxlc3MgdGhhbiB0czIKKyAqICAJICAgIDAgaWYgdHMxIGlzIGVxdWFsIHRvIHRzMgorICogICAgICAgICAgMSBpZiB0czEgaXMgZ3JlYXRlciB0aGFuIHRzMgorICovCitpbnQgZG1fdGltZXN0YW1wX2NvbXBhcmUoc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMxLCBzdHJ1Y3QgZG1fdGltZXN0YW1wICp0czIpOworCisvKgorICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluIG5hbm9zZWNvbmRzIGJldHdlZW4KKyAqIHRoZSBkbV90aW1lc3RhbXAgb2JqZWN0cyB0czEgYW5kIHRzMi4KKyAqCisgKiBDYWxsZXJzIHRoYXQgbmVlZCB0byBrbm93IHdoZXRoZXIgdHMxIGlzIGJlZm9yZSwgZXF1YWwgdG8sIG9yIGFmdGVyIHRzMgorICogaW4gYWRkaXRpb24gdG8gdGhlIG1hZ25pdHVkZSBzaG91bGQgdXNlIGRtX3RpbWVzdGFtcF9jb21wYXJlLgorICovCit1aW50NjRfdCBkbV90aW1lc3RhbXBfZGVsdGEoc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMxLCBzdHJ1Y3QgZG1fdGltZXN0YW1wICp0czIpOworCisvKgorICogRGVzdHJveSBhIGRtX3RpbWVzdGFtcCBvYmplY3QuCisgKi8KK3ZvaWQgZG1fdGltZXN0YW1wX2Rlc3Ryb3koc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMpOworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiByZXBvcnRpbmcgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlIHsKKwl1aW50MzJfdCBpZDsJCQkvKiBQb3dlcnMgb2YgMiAqLworCWNvbnN0IGNoYXIgKmRlc2M7CisJY29uc3QgY2hhciAqcHJlZml4OwkJLyogZmllbGQgaWQgc3RyaW5nIHByZWZpeCAob3B0aW9uYWwpICovCisJLyogRklYTUU6IGNvbnZlcnQgdG8gcHJvcGVyIHVzYWdlIG9mIGNvbnN0IHBvaW50ZXJzIGhlcmUgKi8KKwl2b2lkICooKmRhdGFfZm4pKHZvaWQgKm9iamVjdCk7CS8qIGNhbGxiYWNrIGZyb20gcmVwb3J0X29iamVjdCgpICovCit9OworCitzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkOworCisvKgorICogZG1fcmVwb3J0X2ZpZWxkX3R5cGUgZmxhZ3MKKyAqLworI2RlZmluZSBETV9SRVBPUlRfRklFTERfTUFTSwkJCQkweDAwMDAwRkZGCisjZGVmaW5lIERNX1JFUE9SVF9GSUVMRF9BTElHTl9NQVNLCQkJMHgwMDAwMDAwRgorI2RlZmluZSBETV9SRVBPUlRfRklFTERfQUxJR05fTEVGVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX1JJR0hUCQkJMHgwMDAwMDAwMgorI2RlZmluZSBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLCQkJMHgwMDAwMEZGMAorI2RlZmluZSBETV9SRVBPUlRfRklFTERfVFlQRV9OT05FCQkJMHgwMDAwMDAwMAorI2RlZmluZSBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkcJCQkweDAwMDAwMDEwCisjZGVmaW5lIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUgkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfUEVSQ0VOVAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1QJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRQkJCTB4MDAwMDAyMDAKKworLyogRm9yIHVzZSB3aXRoIHJlc2VydmVkIHZhbHVlcyBvbmx5ISAqLworI2RlZmluZSBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfTUFTSwkJMHgwMDAwMDAwRgorI2RlZmluZSBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfTkFNRUQJCTB4MDAwMDAwMDEgLyogb25seSBuYW1lZCB2YWx1ZSwgbGVzcyBzdHJpY3QgZm9ybSBvZiByZXNlcnZhdGlvbiAqLworI2RlZmluZSBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UJCTB4MDAwMDAwMDIgLyogdmFsdWUgaXMgcmFuZ2UgLSBsb3cgYW5kIGhpZ2ggdmFsdWUgZGVmaW5lZCAqLworI2RlZmluZSBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfRFlOQU1JQ19WQUxVRQkweDAwMDAwMDA0IC8qIHZhbHVlIGlzIGNvbXB1dGVkIGluIHJ1bnRpbWUgKi8KKyNkZWZpbmUgRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX0ZVWlpZX05BTUVTCTB4MDAwMDAwMDggLyogdmFsdWUgbmFtZXMgYXJlIHJlY29nbml6ZWQgaW4gcnVudGltZSAqLworCisjZGVmaW5lIERNX1JFUE9SVF9GSUVMRF9UWVBFX0lEX0xFTiAzMgorI2RlZmluZSBETV9SRVBPUlRfRklFTERfVFlQRV9IRUFESU5HX0xFTiAzMgorCitzdHJ1Y3QgZG1fcmVwb3J0Oworc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlIHsKKwl1aW50MzJfdCB0eXBlOwkJLyogb2JqZWN0IHR5cGUgaWQgKi8KKwl1aW50MzJfdCBmbGFnczsJCS8qIERNX1JFUE9SVF9GSUVMRF8qICovCisJdWludDMyX3Qgb2Zmc2V0OwkvKiBieXRlIG9mZnNldCBpbiB0aGUgb2JqZWN0ICovCisJaW50MzJfdCB3aWR0aDsJCS8qIGRlZmF1bHQgd2lkdGggKi8KKwkvKiBzdHJpbmcgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWVsZCAqLworCWNvbnN0IGNoYXIgaWRbRE1fUkVQT1JUX0ZJRUxEX1RZUEVfSURfTEVOXTsKKwkvKiBzdHJpbmcgcHJpbnRlZCBpbiBoZWFkZXIgKi8KKwljb25zdCBjaGFyIGhlYWRpbmdbRE1fUkVQT1JUX0ZJRUxEX1RZUEVfSEVBRElOR19MRU5dOworCWludCAoKnJlcG9ydF9mbikoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKwljb25zdCBjaGFyICpkZXNjOwkvKiBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQgKi8KK307CisKKy8qCisgKiBQZXItZmllbGQgcmVzZXJ2ZWQgdmFsdWUuCisgKi8KK3N0cnVjdCBkbV9yZXBvcnRfZmllbGRfcmVzZXJ2ZWRfdmFsdWUgeworCS8qIGZpZWxkX251bSBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpZWxkIGluICdmaWVsZHMnCisJICAgYXJyYXkgcGFzc2VkIHRvIGRtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uICovCisJdWludDMyX3QgZmllbGRfbnVtOworCS8qIHRoZSB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmaWVsZAorCSAgIGlkZW50aWZpZWQgYnkgZmllbGRfbnVtICovCisJY29uc3Qgdm9pZCAqdmFsdWU7Cit9OworCisvKgorICogUmVzZXJ2ZWQgdmFsdWUgaXMgYSAndmFsdWUnIHRoYXQgaXMgdXNlZCBkaXJlY3RseSBpZiBhbnkgb2YgdGhlICduYW1lcycgaXMgaGl0CisgKiBvciBpbiBjYXNlIG9mIGZ1enp5IG5hbWVzLCBpZiBzdWNoIGZ1enp5IG5hbWUgbWF0Y2hlcy4KKyAqCisgKiBJZiB0eXBlIGlzIGFueSBvZiBETV9SRVBPUlRfRklFTERfVFlQRV8qLCB0aGUgcmVzZXJ2ZWQgdmFsdWUgaXMgcmVjb2duaXplZAorICogZm9yIGFsbCBmaWVsZHMgb2YgdGhhdCB0eXBlLgorICoKKyAqIElmIHR5cGUgaXMgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTk9ORSwgdGhlIHJlc2VydmVkIHZhbHVlIGlzIHJlY29nbml6ZWQKKyAqIGZvciB0aGUgZXhhY3QgZmllbGQgc3BlY2lmaWVkIC0gaGVuY2UgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkKKyAqIHRoZSBzYW1lIGFzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBpdHNlbGYuCisgKgorICogVGhlIGFycmF5IG9mIHJlc2VydmVkIHZhbHVlcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgcmVwb3J0aW5nIHdpdGgKKyAqIHNlbGVjdGlvbiBlbmFibGVkIChzZWUgYWxzbyBkbV9yZXBvcnRfaW5pdF93aXRoX3NlbGVjdGlvbiBmdW5jdGlvbikuCisgKi8KK3N0cnVjdCBkbV9yZXBvcnRfcmVzZXJ2ZWRfdmFsdWUgeworCWNvbnN0IHVpbnQzMl90IHR5cGU7CQkvKiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfKiBhbmQgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfKiAgKi8KKwljb25zdCB2b2lkICp2YWx1ZTsJCS8qIHJlc2VydmVkIHZhbHVlOgorCQkJCQkJdWludDY0X3QgZm9yIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUgorCQkJCQkJdWludDY0X3QgZm9yIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUgKG51bWJlciBvZiA1MTItYnl0ZSBzZWN0b3JzKQorCQkJCQkJdWludDY0X3QgZm9yIERNX1JFUE9SVF9GSUVMRF9UWVBFX1BFUkNFTlQKKwkJCQkJCWNvbnN0IGNoYXIqIGZvciBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkcKKwkJCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGRfcmVzZXJ2ZWRfdmFsdWUgZm9yIERNX1JFUE9SVF9GSUVMRF9UWVBFX05PTkUKKwkJCQkJCWRtX3JlcG9ydF9yZXNlcnZlZF9oYW5kbGVyKiBpZiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfe0RZTkFNSUNfVkFMVUUsRlVaWllfTkFNRVN9IGlzIHVzZWQgKi8KKwljb25zdCBjaGFyICoqbmFtZXM7CQkvKiBudWxsLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RhdGljIG5hbWVzIGZvciB0aGlzIHJlc2VydmVkIHZhbHVlICovCisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CS8qIGRlc2NyaXB0aW9uIG9mIHRoZSByZXNlcnZlZCB2YWx1ZSAqLworfTsKKworLyoKKyAqIEF2YWlsYWJsZSBhY3Rpb25zIGZvciBkbV9yZXBvcnRfcmVzZXJ2ZWRfdmFsdWVfaGFuZGxlci4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlETV9SRVBPUlRfUkVTRVJWRURfUEFSU0VfRlVaWllfTkFNRSwKKwlETV9SRVBPUlRfUkVTRVJWRURfR0VUX0RZTkFNSUNfVkFMVUUsCit9IGRtX3JlcG9ydF9yZXNlcnZlZF9hY3Rpb25fdDsKKworLyoKKyAqIEdlbmVyaWMgcmVzZXJ2ZWQgdmFsdWUgaGFuZGxlciB0byBwcm9jZXNzIHJlc2VydmVkIHZhbHVlIG5hbWVzIGFuZC9vciB2YWx1ZXMuCisgKgorICogQWN0aW9ucyBhbmQgdGhlaXIgaW5wdXQvb3V0cHV0OgorICoKKyAqIAlETV9SRVBPUlRfUkVTRVJWRURfUEFSU0VfRlVaWllfTkFNRQorICoJCWRhdGFfaW46ICBjb25zdCBjaGFyICpmdXp6eV9uYW1lCisgKgkJZGF0YV9vdXQ6IGNvbnN0IGNoYXIgKmNhbm9uaWNhbF9uYW1lLCBOVUxMIGlmIGZ1enp5X25hbWUgbm90IHJlY29nbml6ZWQKKyAqCisgKiAJRE1fUkVQT1JUX1JFU0VSVkVEX0dFVF9EWU5BTUlDX1ZBTFVFCisgKiAJCWRhdGFfaW46ICBjb25zdCBjaGFyICpjYW5vbmljYWxfbmFtZQorICogCQlkYXRhX291dDogdm9pZCAqdmFsdWUsIE5VTEwgaWYgY2Fub25pY2FsX25hbWUgbm90IHJlY29nbml6ZWQKKyAqCisgKiBBbGwgYWN0aW9ucyByZXR1cm46CisgKgorICoJLTEgaWYgYWN0aW9uIG5vdCBpbXBsZW1lbnRlZAorICogCTAgb24gZXJyb3IKKyAqIAkxIG9uIHN1Y2Nlc3MKKyAqLwordHlwZWRlZiBpbnQgKCpkbV9yZXBvcnRfcmVzZXJ2ZWRfaGFuZGxlcikgKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQkgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkgICB1aW50MzJfdCBmaWVsZF9udW0sCisJCQkJCSAgIGRtX3JlcG9ydF9yZXNlcnZlZF9hY3Rpb25fdCBhY3Rpb24sCisJCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGFfaW4sCisJCQkJCSAgIGNvbnN0IHZvaWQgKipkYXRhX291dCk7CisKKy8qCisgKiBUaGUgZG1fcmVwb3J0X3ZhbHVlX2NhY2hlX3tzZXQsZ2V0fSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB0byBzdG9yZSBhbmQgcmV0cmlldmUKKyAqIHZhcmlvdXMgdmFsdWVzIHVzZWQgZHVyaW5nIHJlcG9ydGluZyAoZG1fcmVwb3J0X2ZpZWxkX3R5cGUucmVwb3J0X2ZuKSBhbmQvb3IKKyAqIHNlbGVjdGlvbiBwcm9jZXNzaW5nIChkbV9yZXBvcnRfcmVzZXJ2ZWRfaGFuZGxlciBpbnN0YW5jZXMpIHRvIGF2b2lkCisgKiByZWNhbGN1bGF0aW9uIG9mIHRoZXNlIHZhbHVlcyBvciB0byBzaGFyZSB2YWx1ZXMgYW1vbmcgY2FsbHMuCisgKi8KK2ludCBkbV9yZXBvcnRfdmFsdWVfY2FjaGVfc2V0KHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpkYXRhKTsKK2NvbnN0IHZvaWQgKmRtX3JlcG9ydF92YWx1ZV9jYWNoZV9nZXQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKm5hbWUpOworLyoKKyAqIGRtX3JlcG9ydF9pbml0IG91dHB1dF9mbGFncworICovCisjZGVmaW5lIERNX1JFUE9SVF9PVVRQVVRfTUFTSwkJCTB4MDAwMDAwRkYKKyNkZWZpbmUgRE1fUkVQT1JUX09VVFBVVF9BTElHTkVECQkweDAwMDAwMDAxCisjZGVmaW5lIERNX1JFUE9SVF9PVVRQVVRfQlVGRkVSRUQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRE1fUkVQT1JUX09VVFBVVF9IRUFESU5HUwkJMHgwMDAwMDAwNAorI2RlZmluZSBETV9SRVBPUlRfT1VUUFVUX0ZJRUxEX05BTUVfUFJFRklYCTB4MDAwMDAwMDgKKyNkZWZpbmUgRE1fUkVQT1JUX09VVFBVVF9GSUVMRF9VTlFVT1RFRAkJMHgwMDAwMDAxMAorI2RlZmluZSBETV9SRVBPUlRfT1VUUFVUX0NPTFVNTlNfQVNfUk9XUwkweDAwMDAwMDIwCisjZGVmaW5lIERNX1JFUE9SVF9PVVRQVVRfTVVMVElQTEVfVElNRVMJCTB4MDAwMDAwNDAKKworc3RydWN0IGRtX3JlcG9ydCAqZG1fcmVwb3J0X2luaXQodWludDMyX3QgKnJlcG9ydF90eXBlcywKKwkJCQkgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSAqdHlwZXMsCisJCQkJIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzLAorCQkJCSBjb25zdCBjaGFyICpvdXRwdXRfZmllbGRzLAorCQkJCSBjb25zdCBjaGFyICpvdXRwdXRfc2VwYXJhdG9yLAorCQkJCSB1aW50MzJfdCBvdXRwdXRfZmxhZ3MsCisJCQkJIGNvbnN0IGNoYXIgKnNvcnRfa2V5cywKKwkJCQkgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3N0cnVjdCBkbV9yZXBvcnQgKmRtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uKHVpbnQzMl90ICpyZXBvcnRfdHlwZXMsCisJCQkJCQljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0eXBlcywKKwkJCQkJCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzLAorCQkJCQkJY29uc3QgY2hhciAqb3V0cHV0X2ZpZWxkcywKKwkJCQkJCWNvbnN0IGNoYXIgKm91dHB1dF9zZXBhcmF0b3IsCisJCQkJCQl1aW50MzJfdCBvdXRwdXRfZmxhZ3MsCisJCQkJCQljb25zdCBjaGFyICpzb3J0X2tleXMsCisJCQkJCQljb25zdCBjaGFyICpzZWxlY3Rpb24sCisJCQkJCQljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X3Jlc2VydmVkX3ZhbHVlIHJlc2VydmVkX3ZhbHVlc1tdLAorCQkJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKy8qCisgKiBSZXBvcnQgYW4gb2JqZWN0LCBwYXNzIGl0IHRocm91Z2ggdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBpZiB0aGV5CisgKiBhcmUgcHJlc2VudCBhbmQgZGlzcGxheSB0aGUgcmVzdWx0IG9uIG91dHB1dCBpZiBpdCBwYXNzZXMgdGhlIGNyaXRlcmlhLgorICovCitpbnQgZG1fcmVwb3J0X29iamVjdChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgdm9pZCAqb2JqZWN0KTsKKy8qCisgKiBUaGUgc2FtZSBhcyBkbV9yZXBvcnRfb2JqZWN0LCBidXQgZGlzcGxheSB0aGUgcmVzdWx0IG9uIG91dHB1dCBvbmx5IGlmCisgKiAnZG9fb3V0cHV0JyBhcmcgaXMgc2V0LiBBbHNvLCBzYXZlIHRoZSByZXN1bHQgb2Ygc2VsZWN0aW9uIGluICdzZWxlY3RlZCcKKyAqIGFyZyBpZiBpdCdzIG5vdCBOVUxMIChlaXRoZXIgMSBpZiB0aGUgb2JqZWN0IHBhc3Nlcywgb3RoZXJ3aXNlIDApLgorICovCitpbnQgZG1fcmVwb3J0X29iamVjdF9pc19zZWxlY3RlZChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgdm9pZCAqb2JqZWN0LCBpbnQgZG9fb3V0cHV0LCBpbnQgKnNlbGVjdGVkKTsKKworLyoKKyAqIENvbXBhY3QgcmVwb3J0IG91dHB1dCBzbyB0aGF0IGlmIGZpZWxkIHZhbHVlIGlzIGVtcHR5IGZvciBhbGwgcm93cyBpbgorICogdGhlIHJlcG9ydCwgZHJvcCB0aGUgZmllbGQgZnJvbSBvdXRwdXQgY29tcGxldGVseSAoaW5jbHVkaW5nIGhlYWRlcnMpLgorICogQ29tcGFjdCBvdXRwdXQgaXMgYXBwbGljYWJsZSBvbmx5IGlmIHJlcG9ydCBpcyBidWZmZXJlZCwgb3RoZXJ3aXNlCisgKiB0aGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QuCisgKi8KK2ludCBkbV9yZXBvcnRfY29tcGFjdF9maWVsZHMoc3RydWN0IGRtX3JlcG9ydCAqcmgpOworCisvKgorICogVGhlIHNhbWUgYXMgZG1fcmVwb3J0X2NvbXBhY3RfZmllbGRzLCBidXQgZm9yIHNlbGVjdGVkIGZpZWxkcyBvbmx5LgorICogVGhlICJmaWVsZHMiIGFyZyBpcyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWVsZCBuYW1lcyAodGhlIHNhbWUgZm9ybWF0CisgKiBhcyB1c2VkIGZvciAib3V0cHV0X2ZpZWxkcyIgYXJnIGluIGRtX3JlcG9ydF9pbml0IGZuKS4KKyAqLworaW50IGRtX3JlcG9ydF9jb21wYWN0X2dpdmVuX2ZpZWxkcyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqZmllbGRzKTsKKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBubyBkYXRhIHdhaXRpbmcgdG8gYmUgb3V0cHV0LgorICovCitpbnQgZG1fcmVwb3J0X2lzX2VtcHR5KHN0cnVjdCBkbV9yZXBvcnQgKnJoKTsKKworaW50IGRtX3JlcG9ydF9vdXRwdXQoc3RydWN0IGRtX3JlcG9ydCAqcmgpOworCisvKgorICogT3V0cHV0IHRoZSByZXBvcnQgaGVhZGluZ3MgZm9yIGEgY29sdW1ucy1iYXNlZCByZXBvcnQsIGV2ZW4gaWYgdGhleQorICogaGF2ZSBhbHJlYWR5IGJlZW4gc2hvd24uIFVzZWZ1bCBmb3IgcmVwZWF0aW5nIHJlcG9ydHMgdGhhdCB3aXNoIHRvCisgKiBpc3N1ZSBhIHBlcmlvZGljIHJlbWluZGVyIG9mIHRoZSBjb2x1bW4gaGVhZGluZ3MuCisgKi8KK2ludCBkbV9yZXBvcnRfY29sdW1uX2hlYWRpbmdzKHN0cnVjdCBkbV9yZXBvcnQgKnJoKTsKKwordm9pZCBkbV9yZXBvcnRfZnJlZShzdHJ1Y3QgZG1fcmVwb3J0ICpyaCk7CisKKy8qCisgKiBQcmVmaXggYWRkZWQgdG8gZWFjaCBmaWVsZCBuYW1lIHdpdGggRE1fUkVQT1JUX09VVFBVVF9GSUVMRF9OQU1FX1BSRUZJWAorICovCitpbnQgZG1fcmVwb3J0X3NldF9vdXRwdXRfZmllbGRfbmFtZV9wcmVmaXgoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnJlcG9ydF9wcmVmaXgpOworCitpbnQgZG1fcmVwb3J0X3NldF9zZWxlY3Rpb24oc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKnNlbGVjdGlvbik7CisKKy8qCisgKiBSZXBvcnQgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3Igc2ltcGxlIGRhdGEgdHlwZXMuCisgKiBUaGV5IHRha2UgY2FyZSBvZiBhbGxvY2F0aW5nIGNvcGllcyBvZiB0aGUgZGF0YS4KKyAqLworaW50IGRtX3JlcG9ydF9maWVsZF9zdHJpbmcoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3QgY2hhciAqY29uc3QgKmRhdGEpOworaW50IGRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJY29uc3Qgc3RydWN0IGRtX2xpc3QgKmRhdGEsIGNvbnN0IGNoYXIgKmRlbGltaXRlcik7CitpbnQgZG1fcmVwb3J0X2ZpZWxkX3N0cmluZ19saXN0X3Vuc29ydGVkKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBkbV9saXN0ICpkYXRhLCBjb25zdCBjaGFyICpkZWxpbWl0ZXIpOworaW50IGRtX3JlcG9ydF9maWVsZF9pbnQzMihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IGludDMyX3QgKmRhdGEpOworaW50IGRtX3JlcG9ydF9maWVsZF91aW50MzIoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJICAgY29uc3QgdWludDMyX3QgKmRhdGEpOworaW50IGRtX3JlcG9ydF9maWVsZF9pbnQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJY29uc3QgaW50ICpkYXRhKTsKK2ludCBkbV9yZXBvcnRfZmllbGRfdWludDY0KHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgIGNvbnN0IHVpbnQ2NF90ICpkYXRhKTsKK2ludCBkbV9yZXBvcnRfZmllbGRfcGVyY2VudChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgICAgY29uc3QgZG1fcGVyY2VudF90ICpkYXRhKTsKKworLyoKKyAqIEZvciBjdXN0b20gZmllbGRzLCBhbGxvY2F0ZSB0aGUgZGF0YSBpbiAnbWVtJyBhbmQgdXNlCisgKiBkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKCkuCisgKiAnc29ydHZhbHVlJyBtYXkgYmUgTlVMTCBpZiBpdCBtYXRjaGVzICd2YWx1ZScKKyAqLwordm9pZCBkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICpzb3J0dmFsdWUpOworCisvKgorICogUmVwb3J0IGdyb3VwIHN1cHBvcnQuCisgKi8KK3N0cnVjdCBkbV9yZXBvcnRfZ3JvdXA7CisKK3R5cGVkZWYgZW51bSB7CisJRE1fUkVQT1JUX0dST1VQX1NJTkdMRSwKKwlETV9SRVBPUlRfR1JPVVBfQkFTSUMsCisJRE1fUkVQT1JUX0dST1VQX0pTT04KK30gZG1fcmVwb3J0X2dyb3VwX3R5cGVfdDsKKworc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqZG1fcmVwb3J0X2dyb3VwX2NyZWF0ZShkbV9yZXBvcnRfZ3JvdXBfdHlwZV90IHR5cGUsIHZvaWQgKmRhdGEpOworaW50IGRtX3JlcG9ydF9ncm91cF9wdXNoKHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgZG1fcmVwb3J0ICpyZXBvcnQsIHZvaWQgKmRhdGEpOworaW50IGRtX3JlcG9ydF9ncm91cF9wb3Aoc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqZ3JvdXApOworaW50IGRtX3JlcG9ydF9ncm91cF9kZXN0cm95KHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKTsKKworLyoKKyAqIFN0YXRzIGNvdW50ZXIgYWNjZXNzIG1ldGhvZHMKKyAqCisgKiBFYWNoIG1ldGhvZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRzIGNvdW50ZXIgdmFsdWUgZnJvbSB0aGUKKyAqIHN1cHBsaWVkIGRtX3N0YXRzIGhhbmRsZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpb25faWQgYW5kIGFyZWFfaWQuCisgKiBJZiBlaXRoZXIgcmVnaW9uX2lkIG9yIGFyZWFfaWQgdXNlcyBvbmUgb2YgdGhlIHNwZWNpYWwgdmFsdWVzCisgKiBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCBvciBETV9TVEFUU19BUkVBX0NVUlJFTlQgdGhlbiB0aGUgcmVnaW9uCisgKiBvciBhcmVhIGlzIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG1fc3RhdHMKKyAqIGhhbmRsZSdzIGVtYmVkZGVkIGN1cnNvci4KKyAqCisgKiBUd28gbWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIGNvdW50ZXIgdmFsdWVzOiBhIG5hbWVkIGZ1bmN0aW9uCisgKiBmb3IgZWFjaCBhdmFpbGFibGUgY291bnRlciBmaWVsZCBhbmQgYSBzaW5nbGUgZnVuY3Rpb24gdGhhdCBhY2NlcHRzCisgKiBhbiBlbnVtIHZhbHVlIHNwZWNpZnlpbmcgdGhlIHJlcXVpcmVkIGZpZWxkLiBOZXcgY29kZSBpcyBlbmNvdXJhZ2VkCisgKiB0byB1c2UgdGhlIGVudW0gYmFzZWQgaW50ZXJmYWNlIGFzIGNhbGxzIHRvIHRoZSBuYW1lZCBmdW5jdGlvbnMgYXJlCisgKiBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZW51bSBtZXRob2QgaW50ZXJuYWxseS4KKyAqCisgKiBTZWUgdGhlIGtlcm5lbCBkb2N1bWVudGF0aW9uIGZvciBjb21wbGV0ZSBkZXNjcmlwdGlvbnMgb2YgZWFjaAorICogY291bnRlciBmaWVsZDoKKyAqCisgKiBEb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvc3RhdGlzdGljcy50eHQKKyAqIERvY3VtZW50YXRpb24vaW9zdGF0cy50eHQKKyAqCisgKiByZWFkczogdGhlIG51bWJlciBvZiByZWFkcyBjb21wbGV0ZWQKKyAqIHJlYWRzX21lcmdlZDogdGhlIG51bWJlciBvZiByZWFkcyBtZXJnZWQKKyAqIHJlYWRfc2VjdG9yczogdGhlIG51bWJlciBvZiBzZWN0b3JzIHJlYWQKKyAqIHJlYWRfbnNlY3M6IHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgc3BlbnQgcmVhZGluZworICogd3JpdGVzOiB0aGUgbnVtYmVyIG9mIHdyaXRlcyBjb21wbGV0ZWQKKyAqIHdyaXRlc19tZXJnZWQ6IHRoZSBudW1iZXIgb2Ygd3JpdGVzIG1lcmdlZAorICogd3JpdGVfc2VjdG9yczogdGhlIG51bWJlciBvZiBzZWN0b3JzIHdyaXR0ZW4KKyAqIHdyaXRlX25zZWNzOiB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHNwZW50IHdyaXRpbmcKKyAqIGlvX2luX3Byb2dyZXNzOiB0aGUgbnVtYmVyIG9mIEkvT3MgY3VycmVudGx5IGluIHByb2dyZXNzCisgKiBpb19uc2VjczogdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzcGVudCBkb2luZyBJL09zCisgKiB3ZWlnaHRlZF9pb19uc2VjczogdGhlIHdlaWdodGVkIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzcGVudCBkb2luZyBJL09zCisgKiB0b3RhbF9yZWFkX25zZWNzOiB0aGUgdG90YWwgdGltZSBzcGVudCByZWFkaW5nIGluIG5hbm9zZWNvbmRzCisgKiB0b3RhbF93cml0ZV9uc2VjczogdGhlIHRvdGFsIHRpbWUgc3BlbnQgd3JpdGluZyBpbiBuYW5vc2Vjb25kcworICovCisKKyNkZWZpbmUgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQgVUlOVDY0X01BWAorI2RlZmluZSBETV9TVEFUU19BUkVBX0NVUlJFTlQgVUlOVDY0X01BWAorCit0eXBlZGVmIGVudW0geworCURNX1NUQVRTX1JFQURTX0NPVU5ULAorCURNX1NUQVRTX1JFQURTX01FUkdFRF9DT1VOVCwKKwlETV9TVEFUU19SRUFEX1NFQ1RPUlNfQ09VTlQsCisJRE1fU1RBVFNfUkVBRF9OU0VDUywKKwlETV9TVEFUU19XUklURVNfQ09VTlQsCisJRE1fU1RBVFNfV1JJVEVTX01FUkdFRF9DT1VOVCwKKwlETV9TVEFUU19XUklURV9TRUNUT1JTX0NPVU5ULAorCURNX1NUQVRTX1dSSVRFX05TRUNTLAorCURNX1NUQVRTX0lPX0lOX1BST0dSRVNTX0NPVU5ULAorCURNX1NUQVRTX0lPX05TRUNTLAorCURNX1NUQVRTX1dFSUdIVEVEX0lPX05TRUNTLAorCURNX1NUQVRTX1RPVEFMX1JFQURfTlNFQ1MsCisJRE1fU1RBVFNfVE9UQUxfV1JJVEVfTlNFQ1MsCisJRE1fU1RBVFNfTlJfQ09VTlRFUlMKK30gZG1fc3RhdHNfY291bnRlcl90OworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfY291bnRlcihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCSAgICAgIGRtX3N0YXRzX2NvdW50ZXJfdCBjb3VudGVyLAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3JlYWRzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCk7CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9yZWFkc19tZXJnZWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3JlYWRfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfcmVhZF9uc2Vjcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3dyaXRlcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCSAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3dyaXRlc19tZXJnZWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCk7CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF93cml0ZV9zZWN0b3JzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfd3JpdGVfbnNlY3MoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfaW9faW5fcHJvZ3Jlc3MoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfaW9fbnNlY3MoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkgICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3dlaWdodGVkX2lvX25zZWNzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQl1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCit1aW50NjRfdCBkbV9zdGF0c19nZXRfdG90YWxfcmVhZF9uc2Vjcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3RvdGFsX3dyaXRlX25zZWNzKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQl1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCisvKgorICogRGVyaXZlZCBzdGF0aXN0aWNzIGFjY2VzcyBtZXRob2RzCisgKgorICogRWFjaCBtZXRob2QgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gdGhlCisgKiBjb3VudGVycyBzdG9yZWQgaW4gdGhlIHN1cHBsaWVkIGRtX3N0YXRzIGhhbmRsZSBmb3IgdGhlIHNwZWNpZmllZAorICogcmVnaW9uX2lkIGFuZCBhcmVhX2lkLiBJZiBlaXRoZXIgcmVnaW9uX2lkIG9yIGFyZWFfaWQgdXNlcyBvbmUgb2YgdGhlCisgKiBzcGVjaWFsIHZhbHVlcyBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCBvciBETV9TVEFUU19BUkVBX0NVUlJFTlQgdGhlbgorICogdGhlIHJlZ2lvbiBvciBhcmVhIGlzIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAqIGRtX3N0YXRzIGhhbmRsZSdzIGVtYmVkZGVkIGN1cnNvci4KKyAqCisgKiBUaGUgc2V0IG9mIG1ldHJpY3MgaXMgYmFzZWQgb24gdGhlIGZpZWxkcyBwcm92aWRlZCBieSB0aGUgTGludXgKKyAqIGlvc3RhdHMgcHJvZ3JhbS4KKyAqCisgKiByZF9tZXJnZXNfcGVyX3NlYzogdGhlIG51bWJlciBvZiByZWFkcyBtZXJnZWQgcGVyIHNlY29uZAorICogd3JfbWVyZ2VzX3Blcl9zZWM6IHRoZSBudW1iZXIgb2Ygd3JpdGVzIG1lcmdlZCBwZXIgc2Vjb25kCisgKiByZWFkc19wZXJfc2VjOiB0aGUgbnVtYmVyIG9mIHJlYWRzIGNvbXBsZXRlZCBwZXIgc2Vjb25kCisgKiB3cml0ZXNfcGVyX3NlYzogdGhlIG51bWJlciBvZiB3cml0ZXMgY29tcGxldGVkIHBlciBzZWNvbmQKKyAqIHJlYWRfc2VjdG9yc19wZXJfc2VjOiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgcmVhZCBwZXIgc2Vjb25kCisgKiB3cml0ZV9zZWN0b3JzX3Blcl9zZWM6IHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB3cml0dGVuIHBlciBzZWNvbmQKKyAqIGF2ZXJhZ2VfcmVxdWVzdF9zaXplOiB0aGUgYXZlcmFnZSBzaXplIG9mIHJlcXVlc3RzIHN1Ym1pdHRlZAorICogc2VydmljZV90aW1lOiB0aGUgYXZlcmFnZSBzZXJ2aWNlIHRpbWUgKGluIG5zKSBmb3IgcmVxdWVzdHMgaXNzdWVkCisgKiBhdmVyYWdlX3F1ZXVlX3NpemU6IHRoZSBhdmVyYWdlIHF1ZXVlIGxlbmd0aAorICogYXZlcmFnZV93YWl0X3RpbWU6IHRoZSBhdmVyYWdlIHRpbWUgZm9yIHJlcXVlc3RzIHRvIGJlIHNlcnZlZCAoaW4gbnMpCisgKiBhdmVyYWdlX3JkX3dhaXRfdGltZTogdGhlIGF2ZXJhZ2UgcmVhZCB3YWl0IHRpbWUKKyAqIGF2ZXJhZ2Vfd3Jfd2FpdF90aW1lOiB0aGUgYXZlcmFnZSB3cml0ZSB3YWl0IHRpbWUKKyAqLworCit0eXBlZGVmIGVudW0geworCURNX1NUQVRTX1JEX01FUkdFU19QRVJfU0VDLAorCURNX1NUQVRTX1dSX01FUkdFU19QRVJfU0VDLAorCURNX1NUQVRTX1JFQURTX1BFUl9TRUMsCisJRE1fU1RBVFNfV1JJVEVTX1BFUl9TRUMsCisJRE1fU1RBVFNfUkVBRF9TRUNUT1JTX1BFUl9TRUMsCisJRE1fU1RBVFNfV1JJVEVfU0VDVE9SU19QRVJfU0VDLAorCURNX1NUQVRTX0FWRVJBR0VfUkVRVUVTVF9TSVpFLAorCURNX1NUQVRTX0FWRVJBR0VfUVVFVUVfU0laRSwKKwlETV9TVEFUU19BVkVSQUdFX1dBSVRfVElNRSwKKwlETV9TVEFUU19BVkVSQUdFX1JEX1dBSVRfVElNRSwKKwlETV9TVEFUU19BVkVSQUdFX1dSX1dBSVRfVElNRSwKKwlETV9TVEFUU19TRVJWSUNFX1RJTUUsCisJRE1fU1RBVFNfVEhST1VHSFBVVCwKKwlETV9TVEFUU19VVElMSVpBVElPTiwKKwlETV9TVEFUU19OUl9NRVRSSUNTCit9IGRtX3N0YXRzX21ldHJpY190OworCitpbnQgZG1fc3RhdHNfZ2V0X21ldHJpYyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgaW50IG1ldHJpYywKKwkJCXVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCwgZG91YmxlICp2YWx1ZSk7CisKK2ludCBkbV9zdGF0c19nZXRfcmRfbWVyZ2VzX3Blcl9zZWMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqcnJxbSwKKwkJCQkgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCitpbnQgZG1fc3RhdHNfZ2V0X3dyX21lcmdlc19wZXJfc2VjKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnJycW0sCisJCQkJICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9yZWFkc19wZXJfc2VjKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnJkX3MsCisJCQkgICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF93cml0ZXNfcGVyX3NlYyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICp3cl9zLAorCQkJCXVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCk7CisKK2ludCBkbV9zdGF0c19nZXRfcmVhZF9zZWN0b3JzX3Blcl9zZWMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgZG91YmxlICpyc2VjX3MsIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCQkgICAgICB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF93cml0ZV9zZWN0b3JzX3Blcl9zZWMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgIGRvdWJsZSAqd3JfcywgdWludDY0X3QgcmVnaW9uX2lkLAorCQkJCSAgICAgICB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9hdmVyYWdlX3JlcXVlc3Rfc2l6ZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgICBkb3VibGUgKmFycXN6LCB1aW50NjRfdCByZWdpb25faWQsCisJCQkJICAgICAgdWludDY0X3QgYXJlYV9pZCk7CisKK2ludCBkbV9zdGF0c19nZXRfc2VydmljZV90aW1lKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnN2Y3RtLAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9hdmVyYWdlX3F1ZXVlX3NpemUoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqcXVzeiwKKwkJCQkgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9hdmVyYWdlX3dhaXRfdGltZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICphd2FpdCwKKwkJCQkgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpOworCitpbnQgZG1fc3RhdHNfZ2V0X2F2ZXJhZ2VfcmRfd2FpdF90aW1lKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICAgIGRvdWJsZSAqYXdhaXQsIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCQkgICAgICB1aW50NjRfdCBhcmVhX2lkKTsKKworaW50IGRtX3N0YXRzX2dldF9hdmVyYWdlX3dyX3dhaXRfdGltZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgICBkb3VibGUgKmF3YWl0LCB1aW50NjRfdCByZWdpb25faWQsCisJCQkJICAgICAgdWludDY0X3QgYXJlYV9pZCk7CisKK2ludCBkbV9zdGF0c19nZXRfdGhyb3VnaHB1dChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICp0cHV0LAorCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCk7CisKK2ludCBkbV9zdGF0c19nZXRfdXRpbGl6YXRpb24oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRtX3BlcmNlbnRfdCAqdXRpbCwKKwkJCSAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKTsKKworLyoKKyAqIFN0YXRpc3RpY3MgaGlzdG9ncmFtIGFjY2VzcyBtZXRob2RzLgorICoKKyAqIE1ldGhvZHMgdG8gYWNjZXNzIGxhdGVuY3kgaGlzdG9ncmFtcyBmb3IgcmVnaW9ucyB0aGF0IGhhdmUgdGhlbQorICogZW5hYmxlZC4gRWFjaCBoaXN0b2dyYW0gY29udGFpbnMgYSBjb25maWd1cmFibGUgbnVtYmVyIG9mIGJpbnMKKyAqIHNwYW5uaW5nIGEgdXNlciBkZWZpbmVkIGxhdGVuY3kgaW50ZXJ2YWwuCisgKgorICogVGhlIGJpbiBjb3VudCwgdXBwZXIgYW5kIGxvd2VyIGJpbiBib3VuZHMsIGFuZCBiaW4gdmFsdWVzIGFyZQorICogbWFkZSBhdmFpbGFibGUgdmlhIHRoZSBmb2xsb3dpbmcgYXJlYSBtZXRob2RzLgorICoKKyAqIE1ldGhvZHMgdG8gb2J0YWluIGEgc2ltcGxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGlzdG9ncmFtCisgKiBhbmQgaXRzIGJvdW5kcyBhcmUgYWxzbyBwcm92aWRlZC4KKyAqLworCisvKgorICogUmV0cmlldmUgYSBwb2ludGVyIHRvIHRoZSBoaXN0b2dyYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAqIGFyZWEuIElmIHRoZSBhcmVhIGRvZXMgbm90IGhhdmUgYSBoaXN0b2dyYW0gY29uZmlndXJlZCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIE5VTEwuCisgKgorICogVGhlIHBvaW50ZXIgZG9lcyBub3QgbmVlZCB0byBiZSBmcmVlZCBleHBsaWNpdGx5IGJ5IHRoZSBjYWxsZXI6IGl0CisgKiB3aWxsIGJlY29tZSBpbnZhbGlkIGZvbGxvd2luZyBhIHN1YnNlcXVlbnQgZG1fc3RhdHNfbGlzdCgpLAorICogZG1fc3RhdHNfcG9wdWxhdGUoKSBvciBkbV9zdGF0c19kZXN0cm95KCkgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRtX3N0YXRzIGhhbmRsZS4KKyAqCisgKiBJZiByZWdpb25faWQgb3IgYXJlYV9pZCBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgdmFsdWVzCisgKiBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCBvciBETV9TVEFUU19BUkVBX0NVUlJFTlQgdGhlIGN1cnJlbnQgY3Vyc29yCisgKiB2YWx1ZSBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcmVnaW9uIG9yIGFyZWEuCisgKi8KK3N0cnVjdCBkbV9oaXN0b2dyYW0gKmRtX3N0YXRzX2dldF9oaXN0b2dyYW0oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgICB1aW50NjRfdCByZWdpb25faWQsCisJCQkJCSAgICB1aW50NjRfdCBhcmVhX2lkKTsKKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpbnMgaW4gdGhlIHNwZWNpZmllZCBoaXN0b2dyYW0gaGFuZGxlLgorICovCitpbnQgZG1faGlzdG9ncmFtX2dldF9ucl9iaW5zKGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCk7CisKKy8qCisgKiBHZXQgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBzcGVjaWZpZWQgYmluIG9mIHRoZSBoaXN0b2dyYW0gZm9yIHRoZQorICogYXJlYSBzcGVjaWZpZWQgYnkgcmVnaW9uX2lkIGFuZCBhcmVhX2lkLiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4KKyAqIG5hbm9zZWNvbmRzLgorICovCit1aW50NjRfdCBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl9sb3dlcihjb25zdCBzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbWgsIGludCBiaW4pOworCisvKgorICogR2V0IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgc3BlY2lmaWVkIGJpbiBvZiB0aGUgaGlzdG9ncmFtIGZvciB0aGUKKyAqIGFyZWEgc3BlY2lmaWVkIGJ5IHJlZ2lvbl9pZCBhbmQgYXJlYV9pZC4gVGhlIHZhbHVlIGlzIHJldHVybmVkIGluCisgKiBuYW5vc2Vjb25kcy4KKyAqLwordWludDY0X3QgZG1faGlzdG9ncmFtX2dldF9iaW5fdXBwZXIoY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oLCBpbnQgYmluKTsKKworLyoKKyAqIEdldCB0aGUgd2lkdGggb2YgdGhlIHNwZWNpZmllZCBiaW4gb2YgdGhlIGhpc3RvZ3JhbSBmb3IgdGhlIGFyZWEKKyAqIHNwZWNpZmllZCBieSByZWdpb25faWQgYW5kIGFyZWFfaWQuIFRoZSB3aWR0aCBpcyBlcXVhbCB0byB0aGUgYmluCisgKiB1cHBlciBib3VuZCBtaW51cyB0aGUgbG93ZXIgYm91bmQgYW5kIHlpZWxkcyB0aGUgcmFuZ2Ugb2YgbGF0ZW5jeQorICogdmFsdWVzIGNvdmVyZWQgYnkgdGhpcyBiaW4uIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbiBuYW5vc2Vjb25kcy4KKyAqLwordWludDY0X3QgZG1faGlzdG9ncmFtX2dldF9iaW5fd2lkdGgoY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oLCBpbnQgYmluKTsKKworLyoKKyAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBiaW4gb2YgdGhlIGhpc3RvZ3JhbSBmb3IgdGhlIGFyZWEKKyAqIHNwZWNpZmllZCBieSByZWdpb25faWQgYW5kIGFyZWFfaWQuCisgKi8KK3VpbnQ2NF90IGRtX2hpc3RvZ3JhbV9nZXRfYmluX2NvdW50KGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCwgaW50IGJpbik7CisKKy8qCisgKiBHZXQgdGhlIHBlcmNlbnRhZ2UgKHJlbGF0aXZlIGZyZXF1ZW5jeSkgb2YgdGhlIHNwZWNpZmllZCBiaW4gb2YgdGhlCisgKiBoaXN0b2dyYW0gZm9yIHRoZSBhcmVhIHNwZWNpZmllZCBieSByZWdpb25faWQgYW5kIGFyZWFfaWQuCisgKi8KK2RtX3BlcmNlbnRfdCBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl9wZXJjZW50KGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCwKKwkJCQkJICBpbnQgYmluKTsKKworLyoKKyAqIFJldHVybiB0aGUgdG90YWwgb2JzZXJ2YXRpb25zIChzdW0gb2YgYmluIGNvdW50cykgZm9yIHRoZSBoaXN0b2dyYW0KKyAqIG9mIHRoZSBhcmVhIHNwZWNpZmllZCBieSByZWdpb25faWQgYW5kIGFyZWFfaWQuCisgKi8KK3VpbnQ2NF90IGRtX2hpc3RvZ3JhbV9nZXRfc3VtKGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCk7CisKKy8qCisgKiBIaXN0b2dyYW0gZm9ybWF0dGluZyBmbGFncy4KKyAqLworI2RlZmluZSBETV9ISVNUT0dSQU1fU1VGRklYICAweDEKKyNkZWZpbmUgRE1fSElTVE9HUkFNX1ZBTFVFUyAgMHgyCisjZGVmaW5lIERNX0hJU1RPR1JBTV9QRVJDRU5UIDBYNAorI2RlZmluZSBETV9ISVNUT0dSQU1fQk9VTkRTX0xPV0VSIDB4MTAKKyNkZWZpbmUgRE1fSElTVE9HUkFNX0JPVU5EU19VUFBFUiAweDIwCisjZGVmaW5lIERNX0hJU1RPR1JBTV9CT1VORFNfUkFOR0UgMHgzMAorCisvKgorICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdXBwbGllZCBoaXN0b2dyYW0ncyB2YWx1ZXMgYW5kCisgKiBiaW4gYm91bmRhcmllcy4KKyAqCisgKiBUaGUgYmluIGFyZ3VtZW50IHNlbGVjdHMgdGhlIGJpbiB0byBmb3JtYXQuIElmIHRoaXMgYXJndW1lbnQgaXMgbGVzcworICogdGhhbiB6ZXJvIGFsbCBiaW5zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzdHJpbmcuCisgKgorICogd2lkdGggc3BlY2lmaWVzIGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIGZpZWxkIGluIGNoYXJhY3RlcnM7IGlmIGl0IGlzCisgKiB6ZXJvIHRoZSB3aWR0aCB3aWxsIGJlIGRldGVybWluZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgb3B0aW9ucworICogc2VsZWN0ZWQgZm9yIGZvcm1hdHRpbmcuIEEgdmFsdWUgbGVzcyB0aGFuIHplcm8gZGlzYWJsZXMgZmllbGQgd2lkdGgKKyAqIGNvbnRyb2w6IGJpbiBib3VuZGFyaWVzIGFuZCB2YWx1ZXMgd2lsbCBiZSBvdXRwdXQgd2l0aCBhIG1pbmltdW0KKyAqIGFtb3VudCBvZiB3aGl0ZXNwYWNlLgorICoKKyAqIGZsYWdzIGlzIGEgY29sbGVjdGlvbiBvZiBmbGFnIGFyZ3VtZW50cyB0aGF0IGNvbnRyb2wgdGhlIHN0cmluZyBmb3JtYXQ6CisgKgorICogRE1fSElTVE9HUkFNX1ZBTFVFUyAgLSBJbmNsdWRlIGJpbiB2YWx1ZXMgaW4gdGhlIHN0cmluZy4KKyAqIERNX0hJU1RPR1JBTV9TVUZGSVggIC0gSW5jbHVkZSB0aW1lIHVuaXQgc3VmZml4ZXMgd2hlbiBwcmludGluZyBib3VuZHMuCisgKiBETV9ISVNUT0dSQU1fUEVSQ0VOVCAtIEZvcm1hdCBiaW4gdmFsdWVzIGFzIGEgcGVyY2VudGFnZS4KKyAqCisgKiBETV9ISVNUT0dSQU1fQk9VTkRTX0xPV0VSIC0gSW5jbHVkZSB0aGUgbG93ZXIgYm91bmQgb2YgZWFjaCBiaW4uCisgKiBETV9ISVNUT0dSQU1fQk9VTkRTX1VQUEVSIC0gSW5jbHVkZSB0aGUgdXBwZXIgYm91bmQgb2YgZWFjaCBiaW4uCisgKiBETV9ISVNUT0dSQU1fQk9VTkRTX1JBTkdFIC0gU2hvdyB0aGUgc3BhbiBvZiBlYWNoIGJpbiBhcyAibG8tdXAiLgorICoKKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQgZXhwbGljaXRseSBieSB0aGUKKyAqIGNhbGxlcjogaXQgd2lsbCBiZWNvbWUgaW52YWxpZCBmb2xsb3dpbmcgYSBzdWJzZXF1ZW50CisgKiBkbV9zdGF0c19saXN0KCksIGRtX3N0YXRzX3BvcHVsYXRlKCkgb3IgZG1fc3RhdHNfZGVzdHJveSgpIG9mIHRoZQorICogY29ycmVzcG9uZGluZyBkbV9zdGF0cyBoYW5kbGUuCisgKi8KK2NvbnN0IGNoYXIgKmRtX2hpc3RvZ3JhbV90b19zdHJpbmcoY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oLCBpbnQgYmluLAorCQkJCSAgIGludCB3aWR0aCwgaW50IGZsYWdzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZyBmaWxlIHBhcnNlL3ByaW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJRE1fQ0ZHX0lOVCwKKwlETV9DRkdfRkxPQVQsCisJRE1fQ0ZHX1NUUklORywKKwlETV9DRkdfRU1QVFlfQVJSQVkKK30gZG1fY29uZmlnX3ZhbHVlX3R5cGVfdDsKKworc3RydWN0IGRtX2NvbmZpZ192YWx1ZSB7CisJZG1fY29uZmlnX3ZhbHVlX3R5cGVfdCB0eXBlOworCisJdW5pb24geworCQlpbnQ2NF90IGk7CisJCWZsb2F0IGY7CisJCWRvdWJsZSBkOyAgICAgICAJLyogVW51c2VkLiAqLworCQljb25zdCBjaGFyICpzdHI7CisJfSB2OworCisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqbmV4dDsJLyogRm9yIGFycmF5cyAqLworCXVpbnQzMl90IGZvcm1hdF9mbGFnczsKK307CisKK3N0cnVjdCBkbV9jb25maWdfbm9kZSB7CisJY29uc3QgY2hhciAqa2V5OworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50LCAqc2liLCAqY2hpbGQ7CisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdjsKKwlpbnQgaWQ7Cit9OworCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgeworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcm9vdDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNhc2NhZGU7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwl2b2lkICpjdXN0b207Cit9OworCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmRtX2NvbmZpZ19jcmVhdGUodm9pZCk7CitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmRtX2NvbmZpZ19mcm9tX3N0cmluZyhjb25zdCBjaGFyICpjb25maWdfc2V0dGluZ3MpOworaW50IGRtX2NvbmZpZ19wYXJzZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCk7CisKK3ZvaWQgKmRtX2NvbmZpZ19nZXRfY3VzdG9tKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KTsKK3ZvaWQgZG1fY29uZmlnX3NldF9jdXN0b20oc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIHZvaWQgKmN1c3RvbSk7CisKKy8qCisgKiBXaGVuIHNlYXJjaGluZywgZmlyc3RfY2Z0IGlzIGNoZWNrZWQgYmVmb3JlIHNlY29uZF9jZnQuCisgKi8KK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZG1fY29uZmlnX2luc2VydF9jYXNjYWRlZF90cmVlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqZmlyc3RfY2Z0LCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnNlY29uZF9jZnQpOworCisvKgorICogSWYgdGhlcmUncyBhIGNhc2NhZGVkIGRtX2NvbmZpZ190cmVlLCByZW1vdmUgdGhlIHRvcCBsYXllcgorICogYW5kIHJldHVybiB0aGUgbGF5ZXIgYmVsb3cuICBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgKi8KK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZG1fY29uZmlnX3JlbW92ZV9jYXNjYWRlZF90cmVlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KTsKKworLyoKKyAqIENyZWF0ZSBhIG5ldywgdW5jYXNjYWRlZCBjb25maWcgdHJlZSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCBjYXNjYWRlLgorICovCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmRtX2NvbmZpZ19mbGF0dGVuKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KTsKKwordm9pZCBkbV9jb25maWdfZGVzdHJveShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CisKKy8qIFNpbXBsZSBvdXRwdXQgbGluZSBieSBsaW5lLiAqLwordHlwZWRlZiBpbnQgKCpkbV9wdXRsaW5lX2ZuKShjb25zdCBjaGFyICpsaW5lLCB2b2lkICpiYXRvbik7CisvKiBNb3JlIGFkdmFjZWQgb3V0cHV0IHdpdGggY29uZmlnIG5vZGUgcmVmZXJlbmNlLiAqLwordHlwZWRlZiBpbnQgKCpkbV9jb25maWdfbm9kZV9vdXRfZm4pKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmJhdG9uKTsKKworLyoKKyAqIFNwZWNpZmljYXRpb24gZm9yIGFkdmFuY2VkIGNvbmZpZyBub2RlIG91dHB1dC4KKyAqLworc3RydWN0IGRtX2NvbmZpZ19ub2RlX291dF9zcGVjIHsKKwlkbV9jb25maWdfbm9kZV9vdXRfZm4gcHJlZml4X2ZuOyAvKiBjYWxsZWQgYmVmb3JlIHByb2Nlc3NpbmcgY29uZmlnIG5vZGUgbGluZXMgKi8KKwlkbV9jb25maWdfbm9kZV9vdXRfZm4gbGluZV9mbjsgLyogY2FsbGVkIGZvciBlYWNoIGNvbmZpZyBub2RlIGxpbmUgKi8KKwlkbV9jb25maWdfbm9kZV9vdXRfZm4gc3VmZml4X2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBjb25maWcgbm9kZSBsaW5lcyAqLworfTsKKworLyogV3JpdGUgdGhlIG5vZGUgYW5kIGFueSBzdWJzZXF1ZW50IHNpYmxpbmdzIGl0IGhhcy4gKi8KK2ludCBkbV9jb25maWdfd3JpdGVfbm9kZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBkbV9wdXRsaW5lX2ZuIHB1dGxpbmUsIHZvaWQgKmJhdG9uKTsKK2ludCBkbV9jb25maWdfd3JpdGVfbm9kZV9vdXQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlX291dF9zcGVjICpvdXRfc3BlYywgdm9pZCAqYmF0b24pOworCisvKiBXcml0ZSBnaXZlbiBub2RlIG9ubHkgd2l0aG91dCBzdWJzZXF1ZW50IHNpYmxpbmdzLiAqLworaW50IGRtX2NvbmZpZ193cml0ZV9vbmVfbm9kZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBkbV9wdXRsaW5lX2ZuIHB1dGxpbmUsIHZvaWQgKmJhdG9uKTsKK2ludCBkbV9jb25maWdfd3JpdGVfb25lX25vZGVfb3V0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZV9vdXRfc3BlYyAqb3V0X3NwZWMsIHZvaWQgKmJhdG9uKTsKKworc3RydWN0IGRtX2NvbmZpZ19ub2RlICpkbV9jb25maWdfZmluZF9ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGRtX2NvbmZpZ19oYXNfbm9kZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBkbV9jb25maWdfcmVtb3ZlX25vZGUoc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcmVtb3ZlKTsKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ19maW5kX3N0cihjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmYWlsKTsKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ19maW5kX3N0cl9hbGxvd19lbXB0eShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmYWlsKTsKK2ludCBkbV9jb25maWdfZmluZF9pbnQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZhaWwpOworaW50NjRfdCBkbV9jb25maWdfZmluZF9pbnQ2NChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGZhaWwpOworZmxvYXQgZG1fY29uZmlnX2ZpbmRfZmxvYXQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgZmxvYXQgZmFpbCk7CisKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZG1fY29uZmlnX3RyZWVfZmluZF9ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoKTsKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmYWlsKTsKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyX2FsbG93X2VtcHR5KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmYWlsKTsKK2ludCBkbV9jb25maWdfdHJlZV9maW5kX2ludChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZhaWwpOworaW50NjRfdCBkbV9jb25maWdfdHJlZV9maW5kX2ludDY0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGZhaWwpOworZmxvYXQgZG1fY29uZmlnX3RyZWVfZmluZF9mbG9hdChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqcGF0aCwgZmxvYXQgZmFpbCk7CitpbnQgZG1fY29uZmlnX3RyZWVfZmluZF9ib29sKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgZmFpbCk7CisKKy8qCisgKiBVbmRlcnN0YW5kcyAoMCwgfjApLCAoeSwgbiksICh5ZXMsIG5vKSwgKG9uLAorICogb2ZmKSwgKHRydWUsIGZhbHNlKS4KKyAqLworaW50IGRtX2NvbmZpZ19maW5kX2Jvb2woY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZhaWwpOworaW50IGRtX2NvbmZpZ192YWx1ZV9pc19ib29sKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnYpOworCitpbnQgZG1fY29uZmlnX2dldF91aW50MzIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgdWludDMyX3QgKnJlc3VsdCk7CitpbnQgZG1fY29uZmlnX2dldF91aW50NjQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgdWludDY0X3QgKnJlc3VsdCk7CitpbnQgZG1fY29uZmlnX2dldF9zdHIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqKnJlc3VsdCk7CitpbnQgZG1fY29uZmlnX2dldF9saXN0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKipyZXN1bHQpOworaW50IGRtX2NvbmZpZ19nZXRfc2VjdGlvbihjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKipyZXN1bHQpOworCit1bnNpZ25lZCBkbV9jb25maWdfbWF5YmVfc2VjdGlvbihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxlbik7CisKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ19wYXJlbnRfbmFtZShjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm4pOworCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19jbG9uZV9ub2RlX3dpdGhfbWVtKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbm9kZSwgaW50IHNpYmxpbmdzKTsKK3N0cnVjdCBkbV9jb25maWdfbm9kZSAqZG1fY29uZmlnX2NyZWF0ZV9ub2RlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICprZXkpOworc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqZG1fY29uZmlnX2NyZWF0ZV92YWx1ZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCk7CitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19jbG9uZV9ub2RlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBpbnQgc2libGluZ3MpOworCisvKgorICogQ29tbW9uIGZvcm1hdHRpbmcgZmxhZ3MgYXBwbGljYWJsZSB0byBhbGwgY29uZmlnIG5vZGUgdHlwZXMgKGxvd2VyIDE2IGJpdHMpLgorICovCisjZGVmaW5lIERNX0NPTkZJR19WQUxVRV9GTVRfQ09NTU9OX0FSUkFZICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogdmFsdWUgaXMgYXJyYXkgKi8KKyNkZWZpbmUgRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fRVhUUkFfU1BBQ0VTICAgICAgMHgwMDAwMDAwMiAvKiBhZGQgc3BhY2VzIGluICJrZXkgPSB2YWx1ZSIgcGFpcnMgaW4gY29uc3RyYXN0IHRvICJrZXk9dmFsdWUiIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgKi8KKworLyoKKyAqIFR5cGUtcmVsYXRlZCBjb25maWcgbm9kZSBmb3JtYXR0aW5nIGZsYWdzIChoaWdoZXIgMTYgYml0cykuCisgKi8KKy8qIGludC1yZWxhdGVkIGZvcm1hdHRpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgRE1fQ09ORklHX1ZBTFVFX0ZNVF9JTlRfT0NUQUwgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAvKiBwcmludCBudW1iZXIgaW4gb2N0YWwgZm9ybSAqLworCisvKiBzdHJpbmctcmVsYXRlZCBmb3JtYXR0aW5nIGZsYWdzICovCisjZGVmaW5lIERNX0NPTkZJR19WQUxVRV9GTVRfU1RSSU5HX05PX1FVT1RFUyAgICAgICAgIDB4MDAwMTAwMDAgLyogZG8gbm90IHByaW50IHF1b3RlcyBhcm91bmQgc3RyaW5nIHZhbHVlICovCisKK3ZvaWQgZG1fY29uZmlnX3ZhbHVlX3NldF9mb3JtYXRfZmxhZ3Moc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqY3YsIHVpbnQzMl90IGZvcm1hdF9mbGFncyk7Cit1aW50MzJfdCBkbV9jb25maWdfdmFsdWVfZ2V0X2Zvcm1hdF9mbGFncyhzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdik7CisKK3N0cnVjdCBkbV9wb29sICpkbV9jb25maWdfbWVtb3J5KHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KTsKKworLyogVWRldiBkZXZpY2UgZGlyZWN0b3J5LiAqLworI2RlZmluZSBETV9VREVWX0RFVl9ESVIgIi9kZXYvIgorCisvKiBDb29raWUgcHJlZml4ZXMuCisgKgorICogVGhlIGNvb2tpZSB2YWx1ZSBjb25zaXN0cyBvZiBhIHByZWZpeCAoMTYgYml0cykgYW5kIGEgYmFzZSAoMTYgYml0cykuCisgKiBXZSBjYW4gdXNlIHRoZSBwcmVmaXggdG8gc3RvcmUgdGhlIGZsYWdzLiBUaGVzZSBmbGFncyBhcmUgc2VudCB0bworICoga2VybmVsIHdpdGhpbiBnaXZlbiBkbSB0YXNrLiBXaGVuIHJldHVybmVkIGJhY2sgdG8gdXNlcnNwYWNlIGluCisgKiBETV9DT09LSUUgdWRldiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2UgY2FuIGNvbnRyb2wgc2V2ZXJhbCBhc3BlY3RzCisgKiBvZiB1ZGV2IHJ1bGVzIHdlIHVzZSBieSBkZWNvZGluZyB0aGUgY29va2llIHByZWZpeC4gV2hlbiBkb2luZyB0aGUKKyAqIG5vdGlmaWNhdGlvbiwgd2UgcmVwbGFjZSB0aGUgY29va2llIHByZWZpeCB3aXRoIERNX0NPT0tJRV9NQUdJQywKKyAqIHNvIHdlIG5vdGlmeSB0aGUgcmlnaHQgc2VtYXBob3JlLgorICoKKyAqIEl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHVzZSBjb29raWVzIGZvciBwYXNzaW5nIHRoZSBmbGFncyB0byB1ZGV2CisgKiBydWxlcyBldmVuIHdoZW4gdWRldl9zeW5jIGlzIGRpc2FibGVkLiBUaGUgYmFzZSBwYXJ0IG9mIHRoZSBjb29raWUKKyAqIHdpbGwgYmUgemVybyAodGhlcmUncyBubyBub3RpZmljYXRpb24gc2VtYXBob3JlKSBhbmQgcHJlZml4IHdpbGwgYmUKKyAqIHNldCB0aGVuLiBIb3dldmVyLCBoYXZpbmcgdWRldl9zeW5jIGVuYWJsZWQgaXMgaGlnaGx5IHJlY29tbWVuZGVkLgorICovCisjZGVmaW5lIERNX0NPT0tJRV9NQUdJQyAweDBENEQKKyNkZWZpbmUgRE1fVURFVl9GTEFHU19NQVNLIDB4RkZGRjAwMDAKKyNkZWZpbmUgRE1fVURFVl9GTEFHU19TSElGVCAxNgorCisvKgorICogRE1fVURFVl9ESVNBQkxFX0RNX1JVTEVTX0ZMQUcgaXMgc2V0IGluIGNhc2Ugd2UgbmVlZCB0byBkaXNhYmxlCisgKiBiYXNpYyBkZXZpY2UtbWFwcGVyIHVkZXYgcnVsZXMgdGhhdCBjcmVhdGUgc3ltbGlua3MgaW4gL2Rldi88RE1fRElSPgorICogZGlyZWN0b3J5LiBIb3dldmVyLCB3ZSBjYW4ndCByZWxpYWJseSBwcmV2ZW50IGNyZWF0aW5nIGRlZmF1bHQKKyAqIG5vZGVzIGJ5IHVkZXYgKGNvbW1vbmx5IC9kZXYvZG0tWCwgd2hlcmUgWCBpcyBhIG51bWJlcikuCisgKi8KKyNkZWZpbmUgRE1fVURFVl9ESVNBQkxFX0RNX1JVTEVTX0ZMQUcgMHgwMDAxCisvKgorICogRE1fVURFVl9ESVNBQkxFX1NVQlNZVEVNX1JVTEVTX0ZMQUcgaXMgc2V0IGluIGNhc2Ugd2UgbmVlZCB0byBkaXNhYmxlCisgKiBzdWJzeXN0ZW0gdWRldiBydWxlcywgYnV0IHN0aWxsIHdlIG5lZWQgdGhlIGdlbmVyYWwgRE0gdWRldiBydWxlcyB0bworICogYmUgYXBwbGllZCAodG8gY3JlYXRlIHRoZSBub2RlcyBhbmQgc3ltbGlua3MgdW5kZXIgL2RldiBhbmQgL2Rldi9kaXNrKS4KKyAqLworI2RlZmluZSBETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUcgMHgwMDAyCisvKgorICogRE1fVURFVl9ESVNBQkxFX0RJU0tfUlVMRVNfRkxBRyBpcyBzZXQgaW4gY2FzZSB3ZSBuZWVkIHRvIGRpc2FibGUKKyAqIGdlbmVyYWwgRE0gcnVsZXMgdGhhdCBzZXQgc3ltbGlua3MgaW4gL2Rldi9kaXNrIGRpcmVjdG9yeS4KKyAqLworI2RlZmluZSBETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHIDB4MDAwNAorLyoKKyAqIERNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHIGlzIHNldCBpbiBjYXNlIHdlIG5lZWQgdG8gZGlzYWJsZQorICogYWxsIHRoZSBvdGhlciBydWxlcyB0aGF0IGFyZSBub3QgZ2VuZXJhbCBkZXZpY2UtbWFwcGVyIG5vciBzdWJzeXN0ZW0KKyAqIHJlbGF0ZWQgKHRoZSBydWxlcyBiZWxvbmcgdG8gb3RoZXIgc29mdHdhcmUgb3IgcGFja2FnZXMpLiBBbGwgZm9yZWlnbgorICogcnVsZXMgc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyBkaXJlY3RseSBhbmQgdGhleSBzaG91bGQgaWdub3JlIGZ1cnRoZXIKKyAqIHJ1bGUgcHJvY2Vzc2luZyBmb3Igc3VjaCBldmVudC4KKyAqLworI2RlZmluZSBETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBRyAweDAwMDgKKy8qCisgKiBETV9VREVWX0xPV19QUklPUklUWV9GTEFHIGlzIHNldCBpbiBjYXNlIHdlIG5lZWQgdG8gaW5zdHJ1Y3QgdGhlCisgKiB1ZGV2IHJ1bGVzIHRvIGdpdmUgbG93IHByaW9yaXR5IHRvIHRoZSBkZXZpY2UgdGhhdCBpcyBjdXJyZW50bHkKKyAqIHByb2Nlc3NlZC4gRm9yIGV4YW1wbGUsIHRoaXMgcHJvdmlkZXMgYSB3YXkgdG8gc2VsZWN0IHdoaWNoIHN5bWxpbmtzCisgKiBjb3VsZCBiZSBvdmVyd3JpdHRlbiBieSBoaWdoIHByaW9yaXR5IG9uZXMgaWYgdGhlaXIgbmFtZXMgYXJlIGVxdWFsLgorICogQ29tbW9uIHNpdHVhdGlvbiBpcyBhIG5hbWUgYmFzZWQgb24gRlMgVVVJRCB3aGlsZSB1c2luZyBvcmlnaW4gYW5kCisgKiBzbmFwc2hvdCBkZXZpY2VzLgorICovCisjZGVmaW5lIERNX1VERVZfTE9XX1BSSU9SSVRZX0ZMQUcgMHgwMDEwCisvKgorICogRE1fVURFVl9ESVNBQkxFX0xJQlJBUllfRkFMTEJBQ0sgaXMgc2V0IGluIGNhc2Ugd2UgbmVlZCB0byBkaXNhYmxlCisgKiBsaWJkZXZtYXBwZXIncyBub2RlIG1hbmFnZW1lbnQuIFdlIHdpbGwgcmVseSBvbiB1ZGV2IGNvbXBsZXRlbHkKKyAqIGFuZCB0aGVyZSB3aWxsIGJlIG5vIGZhbGxiYWNrIGFjdGlvbiBwcm92aWRlZCBieSBsaWJkZXZtYXBwZXIgaWYKKyAqIHVkZXYgZG9lcyBzb21ldGhpbmcgaW1wcm9wZXJseS4KKyAqLworI2RlZmluZSBETV9VREVWX0RJU0FCTEVfTElCUkFSWV9GQUxMQkFDSyAweDAwMjAKKy8qCisgKiBETV9VREVWX1BSSU1BUllfU09VUkNFX0ZMQUcgaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBieQorICogbGliZGV2bWFwcGVyIGZvciBhbGwgaW9jdGxzIGdlbmVyYXRpbmcgdWRldiB1ZXZlbnRzLiBPbmNlIHVzZWQgaW4KKyAqIHVkZXYgcnVsZXMsIHdlIGtub3cgaWYgdGhpcyBpcyBhIHJlYWwgInByaW1hcnkgc291cmNlZCIgZXZlbnQgb3Igbm90LgorICogV2UgbmVlZCB0byBkaXN0aW5ndWlzaCByZWFsIGV2ZW50cyBvcmlnaW5hdGVkIGluIGxpYmRldm1hcHBlciBmcm9tCisgKiBhbnkgc3B1cmlvdXMgZXZlbnRzIHRvIGdhdGhlciBhbGwgbWlzc2luZyBpbmZvcm1hdGlvbiAoZS5nLiBldmVudHMKKyAqIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiAidWRldmFkbSB0cmlnZ2VyIiBjb21tYW5kIG9yIGFzIGEgcmVzdWx0CisgKiBvZiB0aGUgIndhdGNoIiB1ZGV2IHJ1bGUpLgorICovCisjZGVmaW5lIERNX1VERVZfUFJJTUFSWV9TT1VSQ0VfRkxBRyAweDAwNDAKKworLyoKKyAqIFVkZXYgZmxhZ3MgcmVzZXJ2ZWQgZm9yIHVzZSBieSBhbnkgZGV2aWNlLW1hcHBlciBzdWJzeXN0ZW0uCisgKi8KKyNkZWZpbmUgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzAgMHgwMTAwCisjZGVmaW5lIERNX1NVQlNZU1RFTV9VREVWX0ZMQUcxIDB4MDIwMAorI2RlZmluZSBETV9TVUJTWVNURU1fVURFVl9GTEFHMiAweDA0MDAKKyNkZWZpbmUgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzMgMHgwODAwCisjZGVmaW5lIERNX1NVQlNZU1RFTV9VREVWX0ZMQUc0IDB4MTAwMAorI2RlZmluZSBETV9TVUJTWVNURU1fVURFVl9GTEFHNSAweDIwMDAKKyNkZWZpbmUgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzYgMHg0MDAwCisjZGVmaW5lIERNX1NVQlNZU1RFTV9VREVWX0ZMQUc3IDB4ODAwMAorCitpbnQgZG1fY29va2llX3N1cHBvcnRlZCh2b2lkKTsKKworLyoKKyAqIFVkZXYgc3luY2hyb25pc2F0aW9uIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBkbV91ZGV2X3NldF9zeW5jX3N1cHBvcnQoaW50IHN5bmNfd2l0aF91ZGV2KTsKK2ludCBkbV91ZGV2X2dldF9zeW5jX3N1cHBvcnQodm9pZCk7Cit2b2lkIGRtX3VkZXZfc2V0X2NoZWNraW5nKGludCBjaGVja2luZyk7CitpbnQgZG1fdWRldl9nZXRfY2hlY2tpbmcodm9pZCk7CisKKy8qCisgKiBEZWZhdWx0IHZhbHVlIHRvIGdldCBuZXcgYXV0byBnZW5lcmF0ZWQgY29va2llIGNyZWF0ZWQKKyAqLworI2RlZmluZSBETV9DT09LSUVfQVVUT19DUkVBVEUgMAoraW50IGRtX3VkZXZfY3JlYXRlX2Nvb2tpZSh1aW50MzJfdCAqY29va2llKTsKK2ludCBkbV91ZGV2X2NvbXBsZXRlKHVpbnQzMl90IGNvb2tpZSk7CitpbnQgZG1fdWRldl93YWl0KHVpbnQzMl90IGNvb2tpZSk7CisKKy8qCisgKiBkbV9kZXZfd2FpdF9pbW1lZGlhdGUgCisgKiBJZiAqcmVhZHkgaXMgMSBvbiByZXR1cm4sIHRoZSB3YWl0IGlzIGNvbXBsZXRlLgorICogSWYgKnJlYWR5IGlzIDAgb24gcmV0dXJuLCB0aGUgd2FpdCBpcyBpbmNvbXBsZXRlIGFuZCBlaXRoZXIKKyAqIHRoaXMgZnVuY3Rpb24gb3IgZG1fdWRldl93YWl0KCkgbXVzdCBiZSBjYWxsZWQgYWdhaW4uCisgKiBSZXR1cm5zIDAgb24gZXJyb3IsIHdoZW4gbmVpdGhlciBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFnYWluLgorICovCitpbnQgZG1fdWRldl93YWl0X2ltbWVkaWF0ZSh1aW50MzJfdCBjb29raWUsIGludCAqcmVhZHkpOworCisjZGVmaW5lIERNX0RFVl9ESVJfVU1BU0sgMDAyMgorI2RlZmluZSBETV9DT05UUk9MX05PREVfVU1BU0sgMDE3NworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCQkJCS8qIExJQl9ERVZJQ0VfTUFQUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmRtL2xpYmRldm1hcHBlci5wYy5pbiBiL2xpYmRtL2xpYmRldm1hcHBlci5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjlmOTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbGliZGV2bWFwcGVyLnBjLmluCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBkZXZtYXBwZXIKK0Rlc2NyaXB0aW9uOiBkZXZpY2UtbWFwcGVyIGxpYnJhcnkKK1ZlcnNpb246IEBETV9MSUJfUEFUQ0hMRVZFTEAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IAorTGliczogLUwke2xpYmRpcn0gLWxkZXZtYXBwZXIKK1JlcXVpcmVzLnByaXZhdGU6IEBTRUxJTlVYX1BDQCBAVURFVl9QQ0AKK0xpYnMucHJpdmF0ZTogLWxtIEBSVF9MSUJACmRpZmYgLS1naXQgYS9saWJkbS9saWJkbS1jb21tb24uYyBiL2xpYmRtL2xpYmRtLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzkzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9saWJkbS1jb21tb24uYwpAQCAtMCwwICsxLDI2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorI2luY2x1ZGUgImxpYmRtLXRhcmdldHMuaCIKKyNpbmNsdWRlICJsaWJkbS1jb21tb24uaCIKKyNpbmNsdWRlICJrZGV2X3QuaCIKKyNpbmNsdWRlICJkbS1pb2N0bC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgIGluY2x1ZGUgPHN5cy9pcGMuaD4KKyMgIGluY2x1ZGUgPHN5cy9zZW0uaD4KKyMgIGluY2x1ZGUgPGxpYnVkZXYuaD4KKyNlbmRpZgorCisjaWZkZWYgX19saW51eF9fCisjICBpbmNsdWRlIDxsaW51eC9mcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyMgIGluY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TRUxJTlVYX0xBQkVMX0gKKyMgIGluY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KKyNlbmRpZgorCisjZGVmaW5lIERNX0RFRkFVTFRfTkFNRV9NQU5HTElOR19NT0RFX0VOVl9WQVJfTkFNRSAiRE1fREVGQVVMVF9OQU1FX01BTkdMSU5HX01PREUiCisKKyNkZWZpbmUgREVWX0RJUiAiL2Rldi8iCisKKyNpZmRlZiBVREVWX1NZTkNfU1VQUE9SVAorI2lmZGVmIF9TRU1fU0VNVU5fVU5ERUZJTkVECit1bmlvbiBzZW11bgoreworCWludCB2YWw7CQkJLyogdmFsdWUgZm9yIFNFVFZBTCAqLworCXN0cnVjdCBzZW1pZF9kcyAqYnVmOwkJLyogYnVmZmVyIGZvciBJUENfU1RBVCAmIElQQ19TRVQgKi8KKwl1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwkvKiBhcnJheSBmb3IgR0VUQUxMICYgU0VUQUxMICovCisJc3RydWN0IHNlbWluZm8gKl9fYnVmOwkJLyogYnVmZmVyIGZvciBJUENfSU5GTyAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBjaGFyIF9kbV9kaXJbUEFUSF9NQVhdID0gREVWX0RJUiBETV9ESVI7CitzdGF0aWMgY2hhciBfc3lzZnNfZGlyW1BBVEhfTUFYXSA9ICIvc3lzLyI7CitzdGF0aWMgY2hhciBfcGF0aDBbUEFUSF9NQVhdOyAgICAgICAgICAgLyogcGF0aCBidWZmZXIsIHNhZmUgNGtCIG9uIHN0YWNrICovCitzdGF0aWMgY29uc3QgY2hhciBfbW91bnRpbmZvW10gPSAiL3Byb2Mvc2VsZi9tb3VudGluZm8iOworCisjZGVmaW5lIERNX01BWF9VVUlEX1BSRUZJWF9MRU4JMTUKK3N0YXRpYyBjaGFyIF9kZWZhdWx0X3V1aWRfcHJlZml4W0RNX01BWF9VVUlEX1BSRUZJWF9MRU4gKyAxXSA9ICJMVk0tIjsKKworc3RhdGljIGludCBfdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IF9zdXNwZW5kZWRfZGV2X2NvdW50ZXIgPSAwOworc3RhdGljIGRtX3N0cmluZ19tYW5nbGluZ190IF9uYW1lX21hbmdsaW5nX21vZGUgPSBERUZBVUxUX0RNX05BTUVfTUFOR0xJTkc7CisKKyNpZmRlZiBIQVZFX1NFTElOVVhfTEFCRUxfSAorc3RhdGljIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqX3NlbGFiZWxfaGFuZGxlID0gTlVMTDsKKyNlbmRpZgorCitzdGF0aWMgaW50IF91ZGV2X2Rpc2FibGVkID0gMDsKKworI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCitzdGF0aWMgaW50IF9zZW1hcGhvcmVfc3VwcG9ydGVkID0gLTE7CitzdGF0aWMgaW50IF91ZGV2X3J1bm5pbmcgPSAtMTsKK3N0YXRpYyBpbnQgX3N5bmNfd2l0aF91ZGV2ID0gMTsKK3N0YXRpYyBpbnQgX3VkZXZfY2hlY2tpbmcgPSAxOworI2VuZGlmCisKK3ZvaWQgZG1fbGliX2luaXQodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnY7CisKKwlpZiAoZ2V0ZW52KCJETV9ESVNBQkxFX1VERVYiKSkKKwkJX3VkZXZfZGlzYWJsZWQgPSAxOworCisJX25hbWVfbWFuZ2xpbmdfbW9kZSA9IERFRkFVTFRfRE1fTkFNRV9NQU5HTElORzsKKwlpZiAoKGVudiA9IGdldGVudihETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERV9FTlZfVkFSX05BTUUpKSkgeworCQlpZiAoIXN0cmNhc2VjbXAoZW52LCAibm9uZSIpKQorCQkJX25hbWVfbWFuZ2xpbmdfbW9kZSA9IERNX1NUUklOR19NQU5HTElOR19OT05FOworCQllbHNlIGlmICghc3RyY2FzZWNtcChlbnYsICJhdXRvIikpCisJCQlfbmFtZV9tYW5nbGluZ19tb2RlID0gRE1fU1RSSU5HX01BTkdMSU5HX0FVVE87CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGVudiwgImhleCIpKQorCQkJX25hbWVfbWFuZ2xpbmdfbW9kZSA9IERNX1NUUklOR19NQU5HTElOR19IRVg7CisJfQorfQorCisvKgorICogTGlicmFyeSB1c2VycyBjYW4gcHJvdmlkZSB0aGVpciBvd24gbG9nZ2luZworICogZnVuY3Rpb24uCisgKi8KKworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNSwgMCkpKQorc3RhdGljIHZvaWQgX2RlZmF1bHRfbG9nX2xpbmUoaW50IGxldmVsLAorCSAgICBjb25zdCBjaGFyICpmaWxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICBpbnQgbGluZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgaW50IGRtX2Vycm5vX29yX2NsYXNzLAorCSAgICBjb25zdCBjaGFyICpmLCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBpbnQgX2Fib3J0X29uX2ludGVybmFsX2Vycm9ycyA9IC0xOworCUZJTEUgKm91dCA9IChsZXZlbCAmIF9MT0dfU1RERVJSKSA/IHN0ZGVyciA6IHN0ZG91dDsKKworCWxldmVsICY9IH4oX0xPR19TVERFUlIgfCBfTE9HX0JZUEFTU19SRVBPUlQpOworCisJaWYgKGxldmVsIDw9IF9MT0dfV0FSTiB8fCBfdmVyYm9zZSkgeworCQlpZiAobGV2ZWwgPCBfTE9HX1dBUk4pCisJCQlvdXQgPSBzdGRlcnI7CisJCXZmcHJpbnRmKG91dCwgZiwgYXApOworCQlmcHV0YygnXG4nLCBvdXQpOworCX0KKworCWlmIChfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzIDwgMCkKKwkJLyogU2V0IHdoZW4gZW52IERNX0FCT1JUX09OX0lOVEVSTkFMX0VSUk9SUyBpcyBub3QgIjAiICovCisJCV9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnMgPQorCQkJc3RyY21wKGdldGVudigiRE1fQUJPUlRfT05fSU5URVJOQUxfRVJST1JTIikgPyA6ICIwIiwgIjAiKTsKKworCWlmIChfYWJvcnRfb25faW50ZXJuYWxfZXJyb3JzICYmCisJICAgICFzdHJuY21wKGYsIElOVEVSTkFMX0VSUk9SLCBzaXplb2YoSU5URVJOQUxfRVJST1IpIC0gMSkpCisJCWFib3J0KCk7Cit9CisKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDUsIDYpKSkKK3N0YXRpYyB2b2lkIF9kZWZhdWx0X2xvZ193aXRoX2Vycm5vKGludCBsZXZlbCwKKwkgICAgY29uc3QgY2hhciAqZmlsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkgICAgaW50IGxpbmUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGludCBkbV9lcnJub19vcl9jbGFzcywKKwkgICAgY29uc3QgY2hhciAqZiwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZik7CisJX2RlZmF1bHRfbG9nX2xpbmUobGV2ZWwsIGZpbGUsIGxpbmUsIGRtX2Vycm5vX29yX2NsYXNzLCBmLCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKQorc3RhdGljIHZvaWQgX2RlZmF1bHRfbG9nKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwKKwkJCSBpbnQgbGluZSwgY29uc3QgY2hhciAqZiwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZik7CisJX2RlZmF1bHRfbG9nX2xpbmUobGV2ZWwsIGZpbGUsIGxpbmUsIDAsIGYsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCitkbV9sb2dfZm4gZG1fbG9nID0gX2RlZmF1bHRfbG9nOworZG1fbG9nX3dpdGhfZXJybm9fZm4gZG1fbG9nX3dpdGhfZXJybm8gPSBfZGVmYXVsdF9sb2dfd2l0aF9lcnJubzsKKwordm9pZCBkbV9sb2dfaW5pdChkbV9sb2dfZm4gZm4pCit7CisJaWYgKGZuKQorCQlkbV9sb2cgPSBmbjsKKwllbHNlCisJCWRtX2xvZyA9IF9kZWZhdWx0X2xvZzsKKworCWRtX2xvZ193aXRoX2Vycm5vID0gX2RlZmF1bHRfbG9nX3dpdGhfZXJybm87Cit9CisKK2ludCBkbV9sb2dfaXNfbm9uX2RlZmF1bHQodm9pZCkKK3sKKwlyZXR1cm4gKGRtX2xvZyA9PSBfZGVmYXVsdF9sb2cpID8gMCA6IDE7Cit9CisKK3ZvaWQgZG1fbG9nX3dpdGhfZXJybm9faW5pdChkbV9sb2dfd2l0aF9lcnJub19mbiBmbikKK3sKKwlpZiAoZm4pCisJCWRtX2xvZ193aXRoX2Vycm5vID0gZm47CisJZWxzZQorCQlkbV9sb2dfd2l0aF9lcnJubyA9IF9kZWZhdWx0X2xvZ193aXRoX2Vycm5vOworCisJZG1fbG9nID0gX2RlZmF1bHRfbG9nOworfQorCit2b2lkIGRtX2xvZ19pbml0X3ZlcmJvc2UoaW50IGxldmVsKQoreworCV92ZXJib3NlID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgX2J1aWxkX2Rldl9wYXRoKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisJaW50IHI7CisKKwkvKiBJZiB0aGVyZSdzIGEgLywgYXNzdW1lIGNhbGxlciBrbm93cyB3aGF0IHRoZXkncmUgZG9pbmcgKi8KKwlpZiAoc3RyY2hyKGRldl9uYW1lLCAnLycpKQorCQlyID0gZG1fc3RybmNweShidWZmZXIsIGRldl9uYW1lLCBsZW4pOworCWVsc2UKKwkJciA9IChkbV9zbnByaW50ZihidWZmZXIsIGxlbiwgIiVzLyVzIiwKKwkJCQkgX2RtX2RpciwgZGV2X25hbWUpIDwgMCkgPyAwIDogMTsKKwlpZiAoIXIpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIGRldiBwYXRoIGZvciBcIiVzXCIuIiwgZGV2X25hbWUpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9nZXRfbGlicmFyeV92ZXJzaW9uKGNoYXIgKnZlcnNpb24sIHNpemVfdCBzaXplKQoreworCXJldHVybiBkbV9zdHJuY3B5KHZlcnNpb24sIERNX0xJQl9WRVJTSU9OLCBzaXplKTsKK30KKwordm9pZCBpbmNfc3VzcGVuZGVkKHZvaWQpCit7CisJX3N1c3BlbmRlZF9kZXZfY291bnRlcisrOworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJTdXNwZW5kZWQgZGV2aWNlIGNvdW50ZXIgaW5jcmVhc2VkIHRvICVkIiwgX3N1c3BlbmRlZF9kZXZfY291bnRlcik7Cit9CisKK3ZvaWQgZGVjX3N1c3BlbmRlZCh2b2lkKQoreworCWlmICghX3N1c3BlbmRlZF9kZXZfY291bnRlcikgeworCQlsb2dfZXJyb3IoIkF0dGVtcHRlZCB0byBkZWNyZW1lbnQgc3VzcGVuZGVkIGRldmljZSBjb3VudGVyIGJlbG93IHplcm8uIik7CisJCXJldHVybjsKKwl9CisKKwlfc3VzcGVuZGVkX2Rldl9jb3VudGVyLS07CisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlN1c3BlbmRlZCBkZXZpY2UgY291bnRlciByZWR1Y2VkIHRvICVkIiwgX3N1c3BlbmRlZF9kZXZfY291bnRlcik7Cit9CisKK2ludCBkbV9nZXRfc3VzcGVuZGVkX2NvdW50ZXIodm9pZCkKK3sKKwlyZXR1cm4gX3N1c3BlbmRlZF9kZXZfY291bnRlcjsKK30KKworaW50IGRtX3NldF9uYW1lX21hbmdsaW5nX21vZGUoZG1fc3RyaW5nX21hbmdsaW5nX3QgbmFtZV9tYW5nbGluZ19tb2RlKQoreworCV9uYW1lX21hbmdsaW5nX21vZGUgPSBuYW1lX21hbmdsaW5nX21vZGU7CisKKwlyZXR1cm4gMTsKK30KKworZG1fc3RyaW5nX21hbmdsaW5nX3QgZG1fZ2V0X25hbWVfbWFuZ2xpbmdfbW9kZSh2b2lkKQoreworCXJldHVybiBfbmFtZV9tYW5nbGluZ19tb2RlOworfQorCitzdHJ1Y3QgZG1fdGFzayAqZG1fdGFza19jcmVhdGUoaW50IHR5cGUpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdCA9IGRtX3phbGxvYyhzaXplb2YoKmRtdCkpOworCisJaWYgKCFkbXQpIHsKKwkJbG9nX2Vycm9yKCJkbV90YXNrX2NyZWF0ZTogbWFsbG9jKCUiIFBSSXNpemVfdCAiKSBmYWlsZWQiLAorCQkJICBzaXplb2YoKmRtdCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWRtX2NoZWNrX3ZlcnNpb24oKSkgeworCQlkbV9mcmVlKGRtdCk7CisJCXJldHVybl9OVUxMOworCX0KKworCWRtdC0+dHlwZSA9IHR5cGU7CisJZG10LT5taW5vciA9IC0xOworCWRtdC0+bWFqb3IgPSAtMTsKKwlkbXQtPmFsbG93X2RlZmF1bHRfbWFqb3JfZmFsbGJhY2sgPSAxOworCWRtdC0+dWlkID0gRE1fREVWSUNFX1VJRDsKKwlkbXQtPmdpZCA9IERNX0RFVklDRV9HSUQ7CisJZG10LT5tb2RlID0gRE1fREVWSUNFX01PREU7CisJZG10LT5ub19vcGVuX2NvdW50ID0gMDsKKwlkbXQtPnJlYWRfYWhlYWQgPSBETV9SRUFEX0FIRUFEX0FVVE87CisJZG10LT5yZWFkX2FoZWFkX2ZsYWdzID0gMDsKKwlkbXQtPmV2ZW50X25yID0gMDsKKwlkbXQtPmNvb2tpZV9zZXQgPSAwOworCWRtdC0+cXVlcnlfaW5hY3RpdmVfdGFibGUgPSAwOworCWRtdC0+bmV3X3V1aWQgPSAwOworCWRtdC0+c2VjdXJlX2RhdGEgPSAwOworCWRtdC0+cmVjb3JkX3RpbWVzdGFtcCA9IDA7CisKKwlyZXR1cm4gZG10OworfQorCisvKgorICogRmluZCB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkZXZpY2UgbnVtYmVyIGJ5IHNjYW5uaW5nIF9kbV9kaXIuCisgKi8KK3N0YXRpYyBpbnQgX2ZpbmRfZG1fbmFtZV9vZl9kZXZpY2UoZGV2X3Qgc3RfcmRldiwgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbikKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJc3RydWN0IGRpcmVudCAqZGlyZW50OworCURJUiAqZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShkID0gb3BlbmRpcihfZG1fZGlyKSkpIHsKKwkJbG9nX3N5c19lcnJvcigib3BlbmRpciIsIF9kbV9kaXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZCkpKSB7CisJCW5hbWUgPSBkaXJlbnQtPmRfbmFtZTsKKworCQlpZiAoIXN0cmNtcChuYW1lLCAiLiIpIHx8ICFzdHJjbXAobmFtZSwgIi4uIikpCisJCQljb250aW51ZTsKKworCQlpZiAoZG1fc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvJXMiLCBfZG1fZGlyLAorCQkJCW5hbWUpID09IC0xKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwYXRoIGZvciAlcyIsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdChwYXRoLCAmc3QpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0LnN0X3JkZXYgPT0gc3RfcmRldikgeworCQkJc3RybmNweShidWYsIG5hbWUsIGJ1Zl9sZW4pOworCQkJciA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChjbG9zZWRpcihkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2VkaXIiLCBfZG1fZGlyKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9pc193aGl0ZWxpc3RlZF9jaGFyKGNoYXIgYykKK3sKKwkvKgorCSAqIEFjdHVhbGx5LCBETSBzdXBwb3J0cyBhbnkgY2hhcmFjdGVyIGluIGEgZGV2aWNlIG5hbWUuCisJICogVGhpcyB3aGl0ZWxpc3QgaXMganVzdCBmb3IgcHJvcGVyIGludGVncmF0aW9uIHdpdGggdWRldi4KKwkgKi8KKyAgICAgICAgaWYgKChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwKKyAgICAgICAgICAgIChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwKKyAgICAgICAgICAgIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICAgIHN0cmNocigiIystLjo9QF8iLCBjKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgY2hlY2tfbXVsdGlwbGVfbWFuZ2xlZF9zdHJpbmdfYWxsb3dlZChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnN0cl9uYW1lLAorCQkJCQkgZG1fc3RyaW5nX21hbmdsaW5nX3QgbW9kZSkKK3sKKwlpZiAobW9kZSA9PSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTyAmJiBzdHJzdHIoc3RyLCAiXFx4NWN4IikpIHsKKwkJbG9nX2Vycm9yKCJUaGUgJXMgXCIlc1wiIHNlZW1zIHRvIGJlIG1hbmdsZWQgbW9yZSB0aGFuIG9uY2UuICIKKwkJCSAgIlRoaXMgaXMgbm90IGFsbG93ZWQgaW4gYXV0byBtb2RlLiIsIHN0cl9uYW1lLCBzdHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE1hbmdsZSBhbGwgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgc3RyaW5nIHdoaWNoIGFyZSBub3Qgb24gYSB3aGl0ZWxpc3QKKyAqIHdpdGggJ1x4Tk4nIGZvcm1hdCB3aGVyZSBOTiBpcyB0aGUgaGV4IHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIuCisgKi8KK2ludCBtYW5nbGVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3RyX25hbWUsIHNpemVfdCBsZW4sCisJCSAgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgZG1fc3RyaW5nX21hbmdsaW5nX3QgbW9kZSkKK3sKKwlpbnQgbmVlZF9tYW5nbGluZyA9IC0xOyAvKiAtMSBkb24ndCBrbm93IHlldCwgMCBubywgMSB5ZXMgKi8KKwlzaXplX3QgaSwgajsKKworCWlmICghc3RyIHx8ICFidWYpCisJCXJldHVybiAtMTsKKworCS8qIElzIHRoZXJlIGFueXRoaW5nIHRvIGRvIGF0IGFsbD8gKi8KKwlpZiAoISpzdHIgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnVmX2xlbiA8IERNX05BTUVfTEVOKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAibWFuZ2xlX3N0cmluZzogc3VwcGxpZWQgYnVmZmVyIHRvbyBzbWFsbCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1vZGUgPT0gRE1fU1RSSU5HX01BTkdMSU5HX05PTkUpCisJCW1vZGUgPSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTzsKKworCWZvciAoaSA9IDAsIGogPSAwOyBzdHJbaV07IGkrKykgeworCQlpZiAobW9kZSA9PSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTykgeworCQkJLyoKKwkJCSAqIERldGVjdCBhbHJlYWR5IG1hbmdsZWQgcGFydCBvZiB0aGUgc3RyaW5nIGFuZCBrZWVwIGl0LgorCQkJICogUmV0dXJuIGVycm9yIG9uIG1peHR1cmUgb2YgbWFuZ2xlZC9ub3QgbWFuZ2xlZCEKKwkJCSAqLworCQkJaWYgKHN0cltpXSA9PSAnXFwnICYmIHN0cltpKzFdID09ICd4JykgeworCQkJCWlmICgobGVuIC0gaSA8IDQpIHx8IChuZWVkX21hbmdsaW5nID09IDEpKQorCQkJCQlnb3RvIGJhZDE7CisJCQkJaWYgKGJ1Zl9sZW4gLSBqIDwgNCkKKwkJCQkJZ290byBiYWQyOworCisJCQkJbWVtY3B5KCZidWZbal0sICZzdHJbaV0sIDQpOworCQkJCWkrPTM7IGorPTQ7CisKKwkJCQluZWVkX21hbmdsaW5nID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChfaXNfd2hpdGVsaXN0ZWRfY2hhcihzdHJbaV0pKSB7CisJCQkvKiB3aGl0ZWxpc3RlZCwga2VlcCBpdC4gKi8KKwkJCWlmIChidWZfbGVuIC0gaiA8IDEpCisJCQkJZ290byBiYWQyOworCQkJYnVmW2pdID0gc3RyW2ldOworCQkJaisrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vdCBvbiBhIHdoaXRlbGlzdCwgbWFuZ2xlIGl0LgorCQkJICogUmV0dXJuIGVycm9yIG9uIG1peHR1cmUgb2YgbWFuZ2xlZC9ub3QgbWFuZ2xlZAorCQkJICogdW5sZXNzIGEgRE1fU1RSSU5HX01BTkdMSU5HX0hFWCBpcyB1c2VkIS4KKwkJCSAqLworCQkJaWYgKChtb2RlICE9IERNX1NUUklOR19NQU5HTElOR19IRVgpICYmIChuZWVkX21hbmdsaW5nID09IDApKQorCQkJCWdvdG8gYmFkMTsKKwkJCWlmIChidWZfbGVuIC0gaiA8IDQpCisJCQkJZ290byBiYWQyOworCisJCQlzcHJpbnRmKCZidWZbal0sICJcXHglMDJ4IiwgKHVuc2lnbmVkIGNoYXIpIHN0cltpXSk7CisJCQlqKz00OworCisJCQluZWVkX21hbmdsaW5nID0gMTsKKwkJfQorCX0KKworCWlmIChidWZfbGVuIC0gaiA8IDEpCisJCWdvdG8gYmFkMjsKKwlidWZbal0gPSAnXDAnOworCisJLyogQWxsIGNoYXJzIGluIHRoZSBzdHJpbmcgd2hpdGVsaXN0ZWQ/ICovCisJaWYgKG5lZWRfbWFuZ2xpbmcgPT0gLTEpCisJCW5lZWRfbWFuZ2xpbmcgPSAwOworCisJcmV0dXJuIG5lZWRfbWFuZ2xpbmc7CisKK2JhZDE6CisJbG9nX2Vycm9yKCJUaGUgJXMgXCIlc1wiIGNvbnRhaW5zIG1peGVkIG1hbmdsZWQgYW5kIHVubWFuZ2xlZCAiCisJCSAgImNoYXJhY3RlcnMgb3IgaXQncyBhbHJlYWR5IG1hbmdsZWQgaW1wcm9wZXJseS4iLCBzdHJfbmFtZSwgc3RyKTsKKwlyZXR1cm4gLTE7CitiYWQyOgorCWxvZ19lcnJvcigiTWFuZ2xlZCBmb3JtIG9mIHRoZSAlcyB0b28gbG9uZyBmb3IgXCIlc1wiLiIsIHN0cl9uYW1lLCBzdHIpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRyeSB0byB1bm1hbmdsZSBzdXBwbGllZCBzdHJpbmcuCisgKiBSZXR1cm4gdmFsdWU6IC0xIG9uIGVycm9yLCAwIHdoZW4gbm8gdW5tYW5nbGluZyBuZWVkZWQsIDEgd2hlbiB1bm1hbmdsaW5nIGFwcGxpZWQKKyAqLworaW50IHVubWFuZ2xlX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnN0cl9uYW1lLCBzaXplX3QgbGVuLAorCQkgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgZG1fc3RyaW5nX21hbmdsaW5nX3QgbW9kZSkKK3sKKwlpbnQgc3RyaWN0ID0gbW9kZSAhPSBETV9TVFJJTkdfTUFOR0xJTkdfTk9ORTsKKwljaGFyIHN0cl9yZXN0W0RNX05BTUVfTEVOXTsKKwlzaXplX3QgaSwgajsKKwlpbnQgY29kZTsKKwlpbnQgciA9IDA7CisKKwlpZiAoIXN0ciB8fCAhYnVmKQorCQlyZXR1cm4gLTE7CisKKwkvKiBJcyB0aGVyZSBhbnl0aGluZyB0byBkbyBhdCBhbGw/ICovCisJaWYgKCEqc3RyIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJaWYgKGJ1Zl9sZW4gPCBETV9OQU1FX0xFTikgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInVubWFuZ2xlX3N0cmluZzogc3VwcGxpZWQgYnVmZmVyIHRvbyBzbWFsbCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMCwgaiA9IDA7IHN0cltpXTsgaSsrLCBqKyspIHsKKwkJaWYgKHN0cmljdCAmJiAhKF9pc193aGl0ZWxpc3RlZF9jaGFyKHN0cltpXSkgfHwgc3RyW2ldPT0nXFwnKSkgeworCQkJbG9nX2Vycm9yKCJUaGUgJXMgXCIlc1wiIHNob3VsZCBiZSBtYW5nbGVkIGJ1dCAiCisJCQkJICAiaXQgY29udGFpbnMgYmxhY2tsaXN0ZWQgY2hhcmFjdGVycy4iLCBzdHJfbmFtZSwgc3RyKTsKKwkJCWo9MDsgcj0tMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHN0cltpXSA9PSAnXFwnICYmIHN0cltpKzFdID09ICd4JykgeworCQkJaWYgKCFzc2NhbmYoJnN0cltpKzJdLCAiJTJ4JXMiLCAmY29kZSwgc3RyX3Jlc3QpKSB7CisJCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkhleCBlbmNvZGluZyBtaXNtYXRjaCBkZXRlY3RlZCBpbiAlcyBcIiVzXCIgIgorCQkJCQkJICAgICAid2hpbGUgdHJ5aW5nIHRvIHVubWFuZ2xlIGl0LiIsIHN0cl9uYW1lLCBzdHIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnVmW2pdID0gKHVuc2lnbmVkIGNoYXIpIGNvZGU7CisKKwkJCS8qIHNraXAgdGhlIGVuY29kZWQgcGFydCB3ZSd2ZSBqdXN0IGRlY29kZWQhICovCisJCQlpKz0gMzsKKworCQkJLyogdW5tYW5nbGluZyBhcHBsaWVkICovCisJCQlyID0gMTsKKwkJfSBlbHNlCisJCQlidWZbal0gPSBzdHJbaV07CisJfQorCitvdXQ6CisJYnVmW2pdID0gJ1wwJzsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZG1fdGFza19zZXRfbmFtZShzdHJ1Y3QgZG1fdGFzayAqZG10LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBkbV9zdHJpbmdfbWFuZ2xpbmdfdCBtYW5nbGluZ19tb2RlKQoreworCWNoYXIgbWFuZ2xlZF9uYW1lW0RNX05BTUVfTEVOXTsKKwlpbnQgciA9IDA7CisKKwlkbV9mcmVlKGRtdC0+ZGV2X25hbWUpOworCWRtdC0+ZGV2X25hbWUgPSBOVUxMOworCWRtX2ZyZWUoZG10LT5tYW5nbGVkX2Rldl9uYW1lKTsKKwlkbXQtPm1hbmdsZWRfZGV2X25hbWUgPSBOVUxMOworCisJaWYgKHN0cmxlbihuYW1lKSA+PSBETV9OQU1FX0xFTikgeworCQlsb2dfZXJyb3IoIk5hbWUgXCIlc1wiIHRvbyBsb25nLiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNoZWNrX211bHRpcGxlX21hbmdsZWRfc3RyaW5nX2FsbG93ZWQobmFtZSwgIm5hbWUiLCBtYW5nbGluZ19tb2RlKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobWFuZ2xpbmdfbW9kZSAhPSBETV9TVFJJTkdfTUFOR0xJTkdfTk9ORSAmJgorCSAgICAociA9IG1hbmdsZV9zdHJpbmcobmFtZSwgIm5hbWUiLCBzdHJsZW4obmFtZSksIG1hbmdsZWRfbmFtZSwKKwkJCSAgICAgICBzaXplb2YobWFuZ2xlZF9uYW1lKSwgbWFuZ2xpbmdfbW9kZSkpIDwgMCkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBtYW5nbGUgZGV2aWNlIG5hbWUgXCIlc1wiLiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdG9yZSBtYW5nbGVkX2Rldl9uYW1lIG9ubHkgaWYgaXQgZGlmZmVycyBmcm9tIGRldl9uYW1lISAqLworCWlmIChyKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJEZXZpY2UgbmFtZSBtYW5nbGVkIFslc106ICVzIC0tPiAlcyIsCisJCQkJICAgICBtYW5nbGluZ19tb2RlID09IERNX1NUUklOR19NQU5HTElOR19BVVRPID8gImF1dG8iIDogImhleCIsCisJCQkJICAgICBuYW1lLCBtYW5nbGVkX25hbWUpOworCQlpZiAoIShkbXQtPm1hbmdsZWRfZGV2X25hbWUgPSBkbV9zdHJkdXAobWFuZ2xlZF9uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigiX2RtX3Rhc2tfc2V0X25hbWU6IGRtX3N0cmR1cCglcykgZmFpbGVkIiwgbWFuZ2xlZF9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCEoZG10LT5kZXZfbmFtZSA9IGRtX3N0cmR1cChuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJfZG1fdGFza19zZXRfbmFtZTogc3RyZHVwKCVzKSBmYWlsZWQiLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3Rhc2tfc2V0X25hbWVfZnJvbV9wYXRoKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciBidWZbUEFUSF9NQVhdOworCXN0cnVjdCBzdGF0IHN0MSwgc3QyOworCWNvbnN0IGNoYXIgKmZpbmFsX25hbWUgPSBOVUxMOworCXNpemVfdCBsZW47CisKKwlpZiAoZG10LT50eXBlID09IERNX0RFVklDRV9DUkVBVEUpIHsKKwkJbG9nX2Vycm9yKCJOYW1lIFwiJXNcIiBpbnZhbGlkLiBJdCBjb250YWlucyBcIi9cIi4iLCBwYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdGF0KHBhdGgsICZzdDEpKSB7CisJCS8qCisJCSAqIEZvdW5kIGRpcmVjdGx5LgorCQkgKiBJZiBzdXBwbGllZCBwYXRoIHBvaW50cyB0byBzYW1lIGRldmljZSBhcyBsYXN0IGNvbXBvbmVudAorCQkgKiB1bmRlciAvZGV2L21hcHBlciwgdXNlIHRoYXQgbmFtZSBkaXJlY3RseS4gIAorCQkgKi8KKwkJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8lcyIsIF9kbV9kaXIsIG5hbWUpID09IC0xKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBwYXRoIGZvciAlcyIsIG5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXN0YXQoYnVmLCAmc3QyKSAmJiAoc3QxLnN0X3JkZXYgPT0gc3QyLnN0X3JkZXYpKQorCQkJZmluYWxfbmFtZSA9IG5hbWU7CisJfSBlbHNlIHsKKwkJLyogTm90IGZvdW5kLiAqLworCQkvKiBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSAnLycgdHJ5IGEgcHJlZml4IG9mIC9kZXYgKi8KKwkJaWYgKChsZW4gPSBzdHJsZW4ocGF0aCkpIDwgMyB8fCBwYXRoWzBdID09ICcvJyB8fAorCQkgICAgZG1fY291bnRfY2hhcnMocGF0aCwgbGVuLCAnLycpICE9IDEpIHsKKwkJCWxvZ19lcnJvcigiRGV2aWNlICVzIG5vdCBmb3VuZCIsIHBhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8uLi8lcyIsIF9kbV9kaXIsIHBhdGgpID09IC0xKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSAvZGV2IHBhdGggZm9yICVzIiwgcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RhdChidWYsICZzdDEpKSB7CisJCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQiLCBwYXRoKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEZvdW5kICovCisJfQorCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSBkbSBuYW1lIHlldCwgQ2FsbCBfZmluZF9kbV9uYW1lX29mX2RldmljZSgpIHRvCisJICogc2NhbiBfZG1fZGlyIGZvciBhIG1hdGNoLgorCSAqLworCWlmICghZmluYWxfbmFtZSkgeworCQlpZiAoX2ZpbmRfZG1fbmFtZV9vZl9kZXZpY2Uoc3QxLnN0X3JkZXYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQkJZmluYWxfbmFtZSA9IGJ1ZjsKKwkJZWxzZSB7CisJCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQiLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogVGhpcyBpcyBhbiBhbHJlYWR5IGV4aXN0aW5nIHBhdGggLSBkbyBub3QgbWFuZ2xlISAqLworCXJldHVybiBfZG1fdGFza19zZXRfbmFtZShkbXQsIGZpbmFsX25hbWUsIERNX1NUUklOR19NQU5HTElOR19OT05FKTsKK30KKworaW50IGRtX3Rhc2tfc2V0X25hbWUoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpwb3M7CisKKwkvKiBQYXRoIHN1cHBsaWVkIGZvciBleGlzdGluZyBkZXZpY2U/ICovCisJaWYgKChwb3MgPSBzdHJyY2hyKG5hbWUsICcvJykpKQorCQlyZXR1cm4gX2RtX3Rhc2tfc2V0X25hbWVfZnJvbV9wYXRoKGRtdCwgbmFtZSwgcG9zICsgMSk7CisKKwlyZXR1cm4gX2RtX3Rhc2tfc2V0X25hbWUoZG10LCBuYW1lLCBkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlKCkpOworfQorCitjb25zdCBjaGFyICpkbV90YXNrX2dldF9uYW1lKGNvbnN0IHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJcmV0dXJuIChkbXQtPmRtaS52NC0+bmFtZSk7Cit9CisKK3N0YXRpYyBjaGFyICpfdGFza19nZXRfc3RyaW5nX21hbmdsZWQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdHJfbmFtZSwKKwkJCQkgICAgICBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwKKwkJCQkgICAgICBkbV9zdHJpbmdfbWFuZ2xpbmdfdCBtb2RlKQoreworCWNoYXIgKnJzOworCWludCByOworCisJaWYgKChyID0gbWFuZ2xlX3N0cmluZyhzdHIsIHN0cl9uYW1lLCBzdHJsZW4oc3RyKSwgYnVmLCBidWZfc2l6ZSwgbW9kZSkpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShycyA9IHIgPyBkbV9zdHJkdXAoYnVmKSA6IGRtX3N0cmR1cChzdHIpKSkKKwkJbG9nX2Vycm9yKCJfdGFza19nZXRfc3RyaW5nX21hbmdsZWQ6IGRtX3N0cmR1cCBmYWlsZWQiKTsKKworCXJldHVybiByczsKK30KKworc3RhdGljIGNoYXIgKl90YXNrX2dldF9zdHJpbmdfdW5tYW5nbGVkKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3RyX25hbWUsCisJCQkJCWNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLAorCQkJCQlkbV9zdHJpbmdfbWFuZ2xpbmdfdCBtb2RlKQoreworCWNoYXIgKnJzOworCWludCByID0gMDsKKworCS8qCisJICogVW5sZXNzIHRoZSBtb2RlIHVzZWQgaXMgJ25vbmUnLCB0aGUgc3RyaW5nCisJICogaXMgKmFscmVhZHkqIHVubWFuZ2xlZCBvbiBpb2N0bCByZXR1cm4hCisJICovCisJaWYgKG1vZGUgPT0gRE1fU1RSSU5HX01BTkdMSU5HX05PTkUgJiYKKwkgICAgKHIgPSB1bm1hbmdsZV9zdHJpbmcoc3RyLCBzdHJfbmFtZSwgc3RybGVuKHN0ciksIGJ1ZiwgYnVmX3NpemUsIG1vZGUpKSA8IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKCEocnMgPSByID8gZG1fc3RyZHVwKGJ1ZikgOiBkbV9zdHJkdXAoc3RyKSkpCisJCWxvZ19lcnJvcigiX3Rhc2tfZ2V0X3N0cmluZ191bm1hbmdsZWQ6IGRtX3N0cmR1cCBmYWlsZWQiKTsKKworCXJldHVybiByczsKK30KKworY2hhciAqZG1fdGFza19nZXRfbmFtZV9tYW5nbGVkKGNvbnN0IHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJY29uc3QgY2hhciAqcyA9IGRtX3Rhc2tfZ2V0X25hbWUoZG10KTsKKwljaGFyIGJ1ZltETV9OQU1FX0xFTl07CisJY2hhciAqcnM7CisKKwlpZiAoIShycyA9IF90YXNrX2dldF9zdHJpbmdfbWFuZ2xlZChzLCAibmFtZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUoKSkpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBtYW5nbGUgZGV2aWNlIG5hbWUgXCIlc1wiLiIsIHMpOworCisJcmV0dXJuIHJzOworfQorCitjaGFyICpkbV90YXNrX2dldF9uYW1lX3VubWFuZ2xlZChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWNvbnN0IGNoYXIgKnMgPSBkbV90YXNrX2dldF9uYW1lKGRtdCk7CisJY2hhciBidWZbRE1fTkFNRV9MRU5dOworCWNoYXIgKnJzOworCisJaWYgKCEocnMgPSBfdGFza19nZXRfc3RyaW5nX3VubWFuZ2xlZChzLCAibmFtZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUoKSkpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB1bm1hbmdsZSBkZXZpY2UgbmFtZSBcIiVzXCIuIiwgcyk7CisKKwlyZXR1cm4gcnM7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3Rhc2tfZ2V0X3V1aWQoY29uc3Qgc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlyZXR1cm4gKGRtdC0+ZG1pLnY0LT51dWlkKTsKK30KKworY2hhciAqZG1fdGFza19nZXRfdXVpZF9tYW5nbGVkKGNvbnN0IHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJY29uc3QgY2hhciAqcyA9IGRtX3Rhc2tfZ2V0X3V1aWQoZG10KTsKKwljaGFyIGJ1ZltETV9VVUlEX0xFTl07CisJY2hhciAqcnM7CisKKwlpZiAoIShycyA9IF90YXNrX2dldF9zdHJpbmdfbWFuZ2xlZChzLCAiVVVJRCIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUoKSkpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBtYW5nbGUgZGV2aWNlIHV1aWQgXCIlc1wiLiIsIHMpOworCisJcmV0dXJuIHJzOworfQorCitjaGFyICpkbV90YXNrX2dldF91dWlkX3VubWFuZ2xlZChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWNvbnN0IGNoYXIgKnMgPSBkbV90YXNrX2dldF91dWlkKGRtdCk7CisJY2hhciBidWZbRE1fVVVJRF9MRU5dOworCWNoYXIgKnJzOworCisJaWYgKCEocnMgPSBfdGFza19nZXRfc3RyaW5nX3VubWFuZ2xlZChzLCAiVVVJRCIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUoKSkpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byB1bm1hbmdsZSBkZXZpY2UgdXVpZCBcIiVzXCIuIiwgcyk7CisKKwlyZXR1cm4gcnM7Cit9CisKK2ludCBkbV90YXNrX3NldF9uZXduYW1lKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKm5ld25hbWUpCit7CisJZG1fc3RyaW5nX21hbmdsaW5nX3QgbWFuZ2xpbmdfbW9kZSA9IGRtX2dldF9uYW1lX21hbmdsaW5nX21vZGUoKTsKKwljaGFyIG1hbmdsZWRfbmFtZVtETV9OQU1FX0xFTl07CisJaW50IHIgPSAwOworCisJaWYgKHN0cmNocihuZXduYW1lLCAnLycpKSB7CisJCWxvZ19lcnJvcigiTmFtZSBcIiVzXCIgaW52YWxpZC4gSXQgY29udGFpbnMgXCIvXCIuIiwgbmV3bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJsZW4obmV3bmFtZSkgPj0gRE1fTkFNRV9MRU4pIHsKKwkJbG9nX2Vycm9yKCJOYW1lIFwiJXNcIiB0b28gbG9uZyIsIG5ld25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISpuZXduYW1lKSB7CisJCWxvZ19lcnJvcigiTm9uIGVtcHR5IG5ldyBuYW1lIGlzIHJlcXVpcmVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNoZWNrX211bHRpcGxlX21hbmdsZWRfc3RyaW5nX2FsbG93ZWQobmV3bmFtZSwgIm5ldyBuYW1lIiwgbWFuZ2xpbmdfbW9kZSkpCisJCXJldHVybl8wOworCisJaWYgKG1hbmdsaW5nX21vZGUgIT0gRE1fU1RSSU5HX01BTkdMSU5HX05PTkUgJiYKKwkgICAgKHIgPSBtYW5nbGVfc3RyaW5nKG5ld25hbWUsICJuZXcgbmFtZSIsIHN0cmxlbihuZXduYW1lKSwgbWFuZ2xlZF9uYW1lLAorCQkJICAgICAgIHNpemVvZihtYW5nbGVkX25hbWUpLCBtYW5nbGluZ19tb2RlKSkgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIG1hbmdsZSBuZXcgZGV2aWNlIG5hbWUgXCIlc1wiIiwgbmV3bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJOZXcgZGV2aWNlIG5hbWUgbWFuZ2xlZCBbJXNdOiAlcyAtLT4gJXMiLAorCQkJCSAgICAgbWFuZ2xpbmdfbW9kZSA9PSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTyA/ICJhdXRvIiA6ICJoZXgiLAorCQkJCSAgICAgbmV3bmFtZSwgbWFuZ2xlZF9uYW1lKTsKKwkJbmV3bmFtZSA9IG1hbmdsZWRfbmFtZTsKKwl9CisKKwlkbV9mcmVlKGRtdC0+bmV3bmFtZSk7CisJaWYgKCEoZG10LT5uZXduYW1lID0gZG1fc3RyZHVwKG5ld25hbWUpKSkgeworCQlsb2dfZXJyb3IoImRtX3Rhc2tfc2V0X25ld25hbWU6IHN0cmR1cCglcykgZmFpbGVkIiwgbmV3bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWRtdC0+bmV3X3V1aWQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX3NldF91dWlkKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKnV1aWQpCit7CisJY2hhciBtYW5nbGVkX3V1aWRbRE1fVVVJRF9MRU5dOworCWRtX3N0cmluZ19tYW5nbGluZ190IG1hbmdsaW5nX21vZGUgPSBkbV9nZXRfbmFtZV9tYW5nbGluZ19tb2RlKCk7CisJaW50IHIgPSAwOworCisJZG1fZnJlZShkbXQtPnV1aWQpOworCWRtdC0+dXVpZCA9IE5VTEw7CisJZG1fZnJlZShkbXQtPm1hbmdsZWRfdXVpZCk7CisJZG10LT5tYW5nbGVkX3V1aWQgPSBOVUxMOworCisJaWYgKCFjaGVja19tdWx0aXBsZV9tYW5nbGVkX3N0cmluZ19hbGxvd2VkKHV1aWQsICJVVUlEIiwgbWFuZ2xpbmdfbW9kZSkpCisJCXJldHVybl8wOworCisJaWYgKG1hbmdsaW5nX21vZGUgIT0gRE1fU1RSSU5HX01BTkdMSU5HX05PTkUgJiYKKwkgICAgKHIgPSBtYW5nbGVfc3RyaW5nKHV1aWQsICJVVUlEIiwgc3RybGVuKHV1aWQpLCBtYW5nbGVkX3V1aWQsCisJCQkgICAgICAgc2l6ZW9mKG1hbmdsZWRfdXVpZCksIG1hbmdsaW5nX21vZGUpKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gbWFuZ2xlIGRldmljZSB1dWlkIFwiJXNcIi4iLCB1dWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHIpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkRldmljZSB1dWlkIG1hbmdsZWQgWyVzXTogJXMgLS0+ICVzIiwKKwkJCQkgICAgIG1hbmdsaW5nX21vZGUgPT0gRE1fU1RSSU5HX01BTkdMSU5HX0FVVE8gPyAiYXV0byIgOiAiaGV4IiwKKwkJCQkgICAgIHV1aWQsIG1hbmdsZWRfdXVpZCk7CisKKwkJaWYgKCEoZG10LT5tYW5nbGVkX3V1aWQgPSBkbV9zdHJkdXAobWFuZ2xlZF91dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigiZG1fdGFza19zZXRfdXVpZDogZG1fc3RyZHVwKCVzKSBmYWlsZWQiLCBtYW5nbGVkX3V1aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIShkbXQtPnV1aWQgPSBkbV9zdHJkdXAodXVpZCkpKSB7CisJCWxvZ19lcnJvcigiZG1fdGFza19zZXRfdXVpZDogc3RyZHVwKCVzKSBmYWlsZWQiLCB1dWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX3NldF9tYWpvcihzdHJ1Y3QgZG1fdGFzayAqZG10LCBpbnQgbWFqb3IpCit7CisJZG10LT5tYWpvciA9IG1ham9yOworCWRtdC0+YWxsb3dfZGVmYXVsdF9tYWpvcl9mYWxsYmFjayA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2V0X21pbm9yKHN0cnVjdCBkbV90YXNrICpkbXQsIGludCBtaW5vcikKK3sKKwlkbXQtPm1pbm9yID0gbWlub3I7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Rhc2tfc2V0X21ham9yX21pbm9yKHN0cnVjdCBkbV90YXNrICpkbXQsIGludCBtYWpvciwgaW50IG1pbm9yLAorCQkJICAgIGludCBhbGxvd19kZWZhdWx0X21ham9yX2ZhbGxiYWNrKQoreworCWRtdC0+bWFqb3IgPSBtYWpvcjsKKwlkbXQtPm1pbm9yID0gbWlub3I7CisJZG10LT5hbGxvd19kZWZhdWx0X21ham9yX2ZhbGxiYWNrID0gYWxsb3dfZGVmYXVsdF9tYWpvcl9mYWxsYmFjazsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZXRfdWlkKHN0cnVjdCBkbV90YXNrICpkbXQsIHVpZF90IHVpZCkKK3sKKwlkbXQtPnVpZCA9IHVpZDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZXRfZ2lkKHN0cnVjdCBkbV90YXNrICpkbXQsIGdpZF90IGdpZCkKK3sKKwlkbXQtPmdpZCA9IGdpZDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdGFza19zZXRfbW9kZShzdHJ1Y3QgZG1fdGFzayAqZG10LCBtb2RlX3QgbW9kZSkKK3sKKwlkbXQtPm1vZGUgPSBtb2RlOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX2VuYWJsZV9jaGVja3Moc3RydWN0IGRtX3Rhc2sgKmRtdCkKK3sKKwlkbXQtPmVuYWJsZV9jaGVja3MgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90YXNrX2FkZF90YXJnZXQoc3RydWN0IGRtX3Rhc2sgKmRtdCwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUsCisJCSAgICAgICBjb25zdCBjaGFyICp0dHlwZSwgY29uc3QgY2hhciAqcGFyYW1zKQoreworCXN0cnVjdCB0YXJnZXQgKnQgPSBjcmVhdGVfdGFyZ2V0KHN0YXJ0LCBzaXplLCB0dHlwZSwgcGFyYW1zKTsKKwlpZiAoIXQpCisJCXJldHVybl8wOworCisJaWYgKCFkbXQtPmhlYWQpCisJCWRtdC0+aGVhZCA9IGRtdC0+dGFpbCA9IHQ7CisJZWxzZSB7CisJCWRtdC0+dGFpbC0+bmV4dCA9IHQ7CisJCWRtdC0+dGFpbCA9IHQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBIQVZFX1NFTElOVVgKK3N0YXRpYyBpbnQgX3NlbGFiZWxfbG9va3VwKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlLAorCQkJICAgc2VjdXJpdHlfY29udGV4dF90ICpzY29udGV4dCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVhfTEFCRUxfSAorCWlmICghX3NlbGFiZWxfaGFuZGxlICYmCisJICAgICEoX3NlbGFiZWxfaGFuZGxlID0gc2VsYWJlbF9vcGVuKFNFTEFCRUxfQ1RYX0ZJTEUsIE5VTEwsIDApKSkgeworCQlsb2dfZXJyb3IoInNlbGFiZWxfb3BlbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlbGFiZWxfbG9va3VwKF9zZWxhYmVsX2hhbmRsZSwgc2NvbnRleHQsIHBhdGgsIG1vZGUpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJzZWxhYmVsX2xvb2t1cCBmYWlsZWQgZm9yICVzOiAlcyIsCisJCQkJICAgICBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisjZWxzZQorCWlmIChtYXRjaHBhdGhjb24ocGF0aCwgbW9kZSwgc2NvbnRleHQpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJtYXRjaHBhdGhjb24gZmFpbGVkIGZvciAlczogJXMiLAorCQkJCSAgICAgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIGludCBfaXNfc2VsaW51eF9lbmFibGVkKHZvaWQpCit7CisJc3RhdGljIGludCBfdGVzdGVkID0gMDsKKwlzdGF0aWMgaW50IF9lbmFibGVkOworCisJaWYgKCFfdGVzdGVkKSB7CisJCV90ZXN0ZWQgPSAxOworCQlfZW5hYmxlZCA9IGlzX3NlbGludXhfZW5hYmxlZCgpOworCX0KKworCXJldHVybiBfZW5hYmxlZDsKK30KKyNlbmRpZgorCitpbnQgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisJc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0ID0gTlVMTDsKKworCWlmIChfaXNfc2VsaW51eF9lbmFibGVkKCkgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAocGF0aCkgeworCQlpZiAoIV9zZWxhYmVsX2xvb2t1cChwYXRoLCBtb2RlLCAmc2NvbnRleHQpKQorCQkJcmV0dXJuXzA7CisKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlByZXBhcmluZyBTRUxpbnV4IGNvbnRleHQgZm9yICVzIHRvICVzLiIsIHBhdGgsIHNjb250ZXh0KTsKKwl9CisJZWxzZQorCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUmVzZXR0aW5nIFNFTGludXggY29udGV4dCB0byBkZWZhdWx0IHZhbHVlLiIpOworCisJaWYgKHNldGZzY3JlYXRlY29uKHNjb250ZXh0KSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigic2V0ZnNjcmVhdGVjb24iLCAocGF0aCA/IDogIlNFTGludXggY29udGV4dCByZXNldCIpKTsKKwkJZnJlZWNvbihzY29udGV4dCk7CisJCXJldHVybiAwOworCX0KKworCWZyZWVjb24oc2NvbnRleHQpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9zZXRfc2VsaW51eF9jb250ZXh0KGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisKKwlpZiAoX2lzX3NlbGludXhfZW5hYmxlZCgpIDw9IDApCisJCXJldHVybiAxOworCisJaWYgKCFfc2VsYWJlbF9sb29rdXAocGF0aCwgbW9kZSwgJnNjb250ZXh0KSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiU2V0dGluZyBTRUxpbnV4IGNvbnRleHQgZm9yICVzIHRvICVzLiIsIHBhdGgsIHNjb250ZXh0KTsKKworCWlmICgobHNldGZpbGVjb24ocGF0aCwgc2NvbnRleHQpIDwgMCkgJiYgKGVycm5vICE9IEVOT1RTVVApKSB7CisJCWxvZ19zeXNfZXJyb3IoImxzZXRmaWxlY29uIiwgcGF0aCk7CisJCWZyZWVjb24oc2NvbnRleHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcmVlY29uKHNjb250ZXh0KTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCit2b2lkIHNlbGludXhfcmVsZWFzZSh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWF9MQUJFTF9ICisJaWYgKF9zZWxhYmVsX2hhbmRsZSkKKwkJc2VsYWJlbF9jbG9zZShfc2VsYWJlbF9oYW5kbGUpOworCV9zZWxhYmVsX2hhbmRsZSA9IE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfd2Fybl9pZl9vcF9uZWVkZWQoaW50IHdhcm5faWZfdWRldl9mYWlsZWQpCit7CisgICAgcmV0dXJuIHdhcm5faWZfdWRldl9mYWlsZWQgJiYgZG1fdWRldl9nZXRfc3luY19zdXBwb3J0KCkgJiYgZG1fdWRldl9nZXRfY2hlY2tpbmcoKTsKK30KKworc3RhdGljIGludCBfYWRkX2Rldl9ub2RlKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIG1vZGVfdCBtb2RlLCBpbnQgd2Fybl9pZl91ZGV2X2ZhaWxlZCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBzdGF0IGluZm87CisJZGV2X3QgZGV2ID0gTUtERVYoKGRldl90KW1ham9yLCAoZGV2X3QpbWlub3IpOworCW1vZGVfdCBvbGRfbWFzazsKKworCWlmICghX2J1aWxkX2Rldl9wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgZGV2X25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmIChzdGF0KHBhdGgsICZpbmZvKSA+PSAwKSB7CisJCWlmICghU19JU0JMSyhpbmZvLnN0X21vZGUpKSB7CisJCQlsb2dfZXJyb3IoIkEgbm9uLWJsb2NrIGRldmljZSBmaWxlIGF0ICclcycgIgorCQkJCSAgImlzIGFscmVhZHkgcHJlc2VudCIsIHBhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBJZiByaWdodCBpbm9kZSBhbHJlYWR5IGV4aXN0cyB3ZSBkb24ndCB0b3VjaCB1aWQgZXRjLiAqLworCQlpZiAoaW5mby5zdF9yZGV2ID09IGRldikKKwkJCXJldHVybiAxOworCisJCWlmICh1bmxpbmsocGF0aCkgPCAwKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byB1bmxpbmsgZGV2aWNlIG5vZGUgZm9yICclcyciLAorCQkJCSAgZGV2X25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKF93YXJuX2lmX29wX25lZWRlZCh3YXJuX2lmX3VkZXZfZmFpbGVkKSkKKwkJbG9nX3dhcm4oIiVzIG5vdCBzZXQgdXAgYnkgdWRldjogRmFsbGluZyBiYWNrIHRvIGRpcmVjdCAiCisJCQkgIm5vZGUgY3JlYXRpb24uIiwgcGF0aCk7CisKKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQocGF0aCwgU19JRkJMSyk7CisJb2xkX21hc2sgPSB1bWFzaygwKTsKKworCS8qIFRoZSBub2RlIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHVkZXYuIFNvIGlnbm9yZSBFRVhJU1QuICovCisJaWYgKG1rbm9kKHBhdGgsIFNfSUZCTEsgfCBtb2RlLCBkZXYpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKwkJbG9nX2Vycm9yKCIlczogbWtub2QgZm9yICVzIGZhaWxlZDogJXMiLCBwYXRoLCBkZXZfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJdW1hc2sob2xkX21hc2spOworCQkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQoTlVMTCwgMCk7CisJCXJldHVybiAwOworCX0KKwl1bWFzayhvbGRfbWFzayk7CisJKHZvaWQpIGRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCisJaWYgKGNob3duKHBhdGgsIHVpZCwgZ2lkKSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigiY2hvd24iLCBwYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkNyZWF0ZWQgJXMiLCBwYXRoKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9ybV9kZXZfbm9kZShjb25zdCBjaGFyICpkZXZfbmFtZSwgaW50IHdhcm5faWZfdWRldl9mYWlsZWQpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKCFfYnVpbGRfZGV2X3BhdGgocGF0aCwgc2l6ZW9mKHBhdGgpLCBkZXZfbmFtZSkpCisJCXJldHVybl8wOworCWlmIChsc3RhdChwYXRoLCAmaW5mbykgPCAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChfd2Fybl9pZl9vcF9uZWVkZWQod2Fybl9pZl91ZGV2X2ZhaWxlZCkpCisJCWxvZ193YXJuKCJOb2RlICVzIHdhcyBub3QgcmVtb3ZlZCBieSB1ZGV2LiAiCisJCQkgIkZhbGxpbmcgYmFjayB0byBkaXJlY3Qgbm9kZSByZW1vdmFsLiIsIHBhdGgpOworCisJLyogdWRldiBtYXkgYWxyZWFkeSBoYXZlIGRlbGV0ZWQgdGhlIG5vZGUuIElnbm9yZSBFTk9FTlQuICovCisJaWYgKHVubGluayhwYXRoKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHVubGluayBkZXZpY2Ugbm9kZSBmb3IgJyVzJyIsIGRldl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlJlbW92ZWQgJXMiLCBwYXRoKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZW5hbWVfZGV2X25vZGUoY29uc3QgY2hhciAqb2xkX25hbWUsIGNvbnN0IGNoYXIgKm5ld19uYW1lLAorCQkJICAgIGludCB3YXJuX2lmX3VkZXZfZmFpbGVkKQoreworCWNoYXIgb2xkcGF0aFtQQVRIX01BWF07CisJY2hhciBuZXdwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3Qgc3RhdCBpbmZvLCBpbmZvMjsKKwlzdHJ1Y3Qgc3RhdCAqaW5mb19ibG9ja19kZXY7CisKKwlpZiAoIV9idWlsZF9kZXZfcGF0aChvbGRwYXRoLCBzaXplb2Yob2xkcGF0aCksIG9sZF9uYW1lKSB8fAorCSAgICAhX2J1aWxkX2Rldl9wYXRoKG5ld3BhdGgsIHNpemVvZihuZXdwYXRoKSwgbmV3X25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmIChsc3RhdChuZXdwYXRoLCAmaW5mbykgPT0gMCkgeworCQlpZiAoU19JU0xOSyhpbmZvLnN0X21vZGUpKSB7CisJCQlpZiAoc3RhdChuZXdwYXRoLCAmaW5mbzIpID09IDApCisJCQkJaW5mb19ibG9ja19kZXYgPSAmaW5mbzI7CisJCQllbHNlIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJzdGF0IiwgbmV3cGF0aCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZQorCQkJaW5mb19ibG9ja19kZXYgPSAmaW5mbzsKKworCQlpZiAoIVNfSVNCTEsoaW5mb19ibG9ja19kZXYtPnN0X21vZGUpKSB7CisJCQlsb2dfZXJyb3IoIkEgbm9uLWJsb2NrIGRldmljZSBmaWxlIGF0ICclcycgIgorCQkJCSAgImlzIGFscmVhZHkgcHJlc2VudCIsIG5ld3BhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSBpZiAoX3dhcm5faWZfb3BfbmVlZGVkKHdhcm5faWZfdWRldl9mYWlsZWQpKSB7CisJCQlpZiAobHN0YXQob2xkcGF0aCwgJmluZm8pIDwgMCAmJgorCQkJCSBlcnJubyA9PSBFTk9FTlQpCisJCQkJLyogYXNzdW1lIHVkZXYgYWxyZWFkeSBkZWxldGVkIHRoaXMgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCWVsc2UgeworCQkJCWxvZ193YXJuKCJUaGUgbm9kZSAlcyBzaG91bGQgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gJXMgIgorCQkJCQkgImJ5IHVkZXYgYnV0IG9sZCBub2RlIGlzIHN0aWxsIHByZXNlbnQuICIKKwkJCQkJICJGYWxsaW5nIGJhY2sgdG8gZGlyZWN0IG9sZCBub2RlIHJlbW92YWwuIiwKKwkJCQkJIG9sZHBhdGgsIG5ld3BhdGgpOworCQkJCXJldHVybiBfcm1fZGV2X25vZGUob2xkX25hbWUsIDApOworCQkJfQorCQl9CisKKwkJaWYgKHVubGluayhuZXdwYXRoKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFUEVSTSkgeworCQkJCS8qIGRldmZzLCBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJlbmFtZWQgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHVubGluayBkZXZpY2Ugbm9kZSBmb3IgJyVzJyIsCisJCQkJICBuZXdfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlIGlmIChfd2Fybl9pZl9vcF9uZWVkZWQod2Fybl9pZl91ZGV2X2ZhaWxlZCkpCisJCWxvZ193YXJuKCJUaGUgbm9kZSAlcyBzaG91bGQgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gJXMgIgorCQkJICJieSB1ZGV2IGJ1dCBuZXcgbm9kZSBpcyBub3QgcHJlc2VudC4gIgorCQkJICJGYWxsaW5nIGJhY2sgdG8gZGlyZWN0IG5vZGUgcmVuYW1lLiIsCisJCQkgb2xkcGF0aCwgbmV3cGF0aCk7CisKKwkvKiB1ZGV2IG1heSBhbHJlYWR5IGhhdmUgcmVuYW1lZCB0aGUgbm9kZS4gSWdub3JlIEVOT0VOVC4gKi8KKwkvKiBGSVhNRTogd2hlbiByZW5hbWluZyB0byB0YXJnZXQgbWFuZ2xpbmcgbW9kZSAibm9uZSIgd2l0aCB1ZGV2CisJICogd2hpbGUgdGhlcmUgYXJlIHNvbWUgYmxhY2tsaXN0ZWQgY2hhcmFjdGVycyBpbiB0aGUgbm9kZSBuYW1lLAorCSAqIHVkZXYgd2lsbCByZW1vdmUgdGhlIG9sZF9ub2RlLCBidXQgZmFpbHMgdG8gcHJvcGVybHkgcmVuYW1lCisJICogdG8gbmV3X25vZGUuIFRoZSBsaWJkZXZtYXBwZXIgY29kZSB0cmllcyB0byBjYWxsCisJICogcmVuYW1lKG9sZF9ub2RlLG5ld19ub2RlKSwgYnV0IHRoYXQgd29uJ3QgZG8gYW55dGhpbmcKKwkgKiBzaW5jZSB0aGUgb2xkIG5vZGUgaXMgYWxyZWFkeSByZW1vdmVkIGJ5IHVkZXYuCisJICogRm9yIGV4YW1wbGUgcmVuYW1pbmcgJ2FceDIwYicgdG8gJ2EgYic6CisJICogICAtIHVkZXYgcmVtb3ZlcyAnYVx4MjBiJworCSAqICAgLSB1ZGV2IGNyZWF0ZXMgJ2EnIGFuZCAnYicgKHNpbmNlIGl0IGNvbnNpZGVycyB0aGUgJyAnIGFzIGEgZGVsaW1pdGVyCisJICogICAtIGxpYmRldm1hcHBlciBjaGVja3MgdWRldiBoYXMgZG9uZSB0aGUgcmVuYW1lIHByb3Blcmx5CisJICogICAtIGxpYmRldm1hcHBlciBjYWxscyBzdGF0KG5ld19ub2RlKSBhbmQgaXQgZG9lcyBub3Qgc2VlIGl0CisJICogICAtIGxpYmRldm1hcHBlciBjYWxscyByZW5hbWUob2xkX25vZGUsbmV3X25vZGUpCisJICogICAtIHRoZSByZW5hbWUgaXMgYSBOT1Agc2luY2UgdGhlIG9sZF9ub2RlIGRvZXMgbm90IGV4aXN0IGFueW1vcmUKKwkgKgorCSAqIEhvd2V2ZXIsIHRoaXMgc2l0dWF0aW9uIGlzIHZlcnkgcmFyZSAtIHdoeSB3b3VsZCBhbnlvbmUgbmVlZAorCSAqIHRvIHJlbmFtZSB0byBhbiB1bnN1cHBvcnRlZCBtb2RlPz8/IFNvIGEgZml4IGZvciB0aGlzIHdvdWxkIGJlCisJICoganVzdCBmb3IgY29tcGxldGVuZXNzLgorCSAqLworCWlmIChyZW5hbWUob2xkcGF0aCwgbmV3cGF0aCkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZW5hbWUgZGV2aWNlIG5vZGUgZnJvbSAnJXMnIHRvICclcyciLAorCQkJICBvbGRfbmFtZSwgbmV3X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiUmVuYW1lZCAlcyB0byAlcyIsIG9sZHBhdGgsIG5ld3BhdGgpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBfX2xpbnV4X18KK3N0YXRpYyBpbnQgX29wZW5fZGV2X25vZGUoY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisJaW50IGZkID0gLTE7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKworCWlmICghX2J1aWxkX2Rldl9wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgZGV2X25hbWUpKQorCQlyZXR1cm4gZmQ7CisKKwlpZiAoKGZkID0gb3BlbihwYXRoLCBPX1JET05MWSwgMCkpIDwgMCkKKwkJbG9nX3N5c19lcnJvcigib3BlbiIsIHBhdGgpOworCisJcmV0dXJuIGZkOworfQorCitpbnQgZ2V0X2Rldl9ub2RlX3JlYWRfYWhlYWQoY29uc3QgY2hhciAqZGV2X25hbWUsIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJCSAgICB1aW50MzJfdCAqcmVhZF9haGVhZCkKK3sKKwljaGFyIGJ1ZlsyNF07CisJaW50IGxlbjsKKwlpbnQgciA9IDE7CisJaW50IGZkOworCWxvbmcgcmVhZF9haGVhZF9sb25nOworCisJLyoKKwkgKiBJZiB3ZSBrbm93IHRoZSBkZXZpY2UgbnVtYmVyLCB1c2Ugc3lzZnMgaWYgd2UgY2FuLgorCSAqIE90aGVyd2lzZSB1c2UgQkxLUkFHRVQgaW9jdGwuCisJICovCisJaWYgKCpfc3lzZnNfZGlyICYmIG1ham9yICE9IDApIHsKKwkJaWYgKGRtX3NucHJpbnRmKF9wYXRoMCwgc2l6ZW9mKF9wYXRoMCksICIlc2Rldi9ibG9jay8lIiBQUkl1MzIKKwkJCQkiOiUiIFBSSXUzMiAiL2JkaS9yZWFkX2FoZWFkX2tiIiwgX3N5c2ZzX2RpciwKKwkJCQltYWpvciwgbWlub3IpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYnVpbGQgc3lzZnNfcGF0aC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKChmZCA9IG9wZW4oX3BhdGgwLCBPX1JET05MWSwgMCkpICE9IC0xKSB7CisJCQkvKiBSZWFkaW5nIGZyb20gc3lzZnMsIGV4cGVjdGluZyBudW1iZXJcbiAqLworCQkJaWYgKChsZW4gPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSkpIDwgMSkgeworCQkJCWxvZ19zeXNfZXJyb3IoInJlYWQiLCBfcGF0aDApOworCQkJCXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlidWZbbGVuXSA9IDA7IC8qIGtpbGwgXG4gYW5kIGVuc3VyZSBcMCAqLworCQkJCSpyZWFkX2FoZWFkID0gYXRvaShidWYpICogMjsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXMgKCVkOiVkKTogcmVhZCBhaGVhZCBpcyAlIiBQUkl1MzIsCisJCQkJCQkgICAgIGRldl9uYW1lLCBtYWpvciwgbWlub3IsICpyZWFkX2FoZWFkKTsKKwkJCX0KKworCQkJaWYgKGNsb3NlKGZkKSkKKwkJCQlsb2dfc3lzX2RlYnVnKCJjbG9zZSIsIF9wYXRoMCk7CisKKwkJCXJldHVybiByOworCQl9CisKKwkJbG9nX3N5c19kZWJ1Zygib3BlbiIsIF9wYXRoMCk7CisJCS8qIEZhbGwgYmFjayB0byB1c2UgZGV2X25hbWUgKi8KKwl9CisKKwkvKgorCSAqIE9wZW4vY2xvc2UgZGV2X25hbWUgbWF5IGJsb2NrIHRoZSBwcm9jZXNzCisJICogKGkuZS4gb3ZlcmZpbGxlZCB0aGluIHBvb2wgdm9sdW1lKQorCSAqLworCWlmICghKmRldl9uYW1lKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgZGV2aWNlIG5hbWUgcGFzc2VkIHRvIEJMS1JBR0VUIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoZmQgPSBfb3Blbl9kZXZfbm9kZShkZXZfbmFtZSkpIDwgMCkKKwkJcmV0dXJuXzA7CisKKwlpZiAoaW9jdGwoZmQsIEJMS1JBR0VULCAmcmVhZF9haGVhZF9sb25nKSkgeworCQlsb2dfc3lzX2Vycm9yKCJCTEtSQUdFVCIsIGRldl9uYW1lKTsKKwkJKnJlYWRfYWhlYWQgPSAwOworCQlyID0gMDsKKwl9IGVsc2UgeworCQkqcmVhZF9haGVhZCA9ICh1aW50MzJfdCkgcmVhZF9haGVhZF9sb25nOworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6IHJlYWQgYWhlYWQgaXMgJSIgUFJJdTMyLCBkZXZfbmFtZSwgKnJlYWRfYWhlYWQpOworCX0KKworCWlmIChjbG9zZShmZCkpCisJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZGV2X25hbWUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9yZWFkX2FoZWFkKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkgICB1aW50MzJfdCByZWFkX2FoZWFkKQoreworCWNoYXIgYnVmWzI0XTsKKwlpbnQgbGVuOworCWludCByID0gMTsKKwlpbnQgZmQ7CisJbG9uZyByZWFkX2FoZWFkX2xvbmcgPSAobG9uZykgcmVhZF9haGVhZDsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlcyAoJWQ6JWQpOiBTZXR0aW5nIHJlYWQgYWhlYWQgdG8gJSIgUFJJdTMyLCBkZXZfbmFtZSwKKwkJCSAgICAgbWFqb3IsIG1pbm9yLCByZWFkX2FoZWFkKTsKKworCS8qCisJICogSWYgd2Uga25vdyB0aGUgZGV2aWNlIG51bWJlciwgdXNlIHN5c2ZzIGlmIHdlIGNhbi4KKwkgKiBPdGhlcndpc2UgdXNlIEJMS1JBU0VUIGlvY3RsLiBSQSBpcyBzZXQgYWZ0ZXIgcmVzdW1lLgorCSAqLworCWlmICgqX3N5c2ZzX2RpciAmJiBtYWpvciAhPSAwKSB7CisJCWlmIChkbV9zbnByaW50ZihfcGF0aDAsIHNpemVvZihfcGF0aDApLCAiJXNkZXYvYmxvY2svJSIgUFJJdTMyCisJCQkJIjolIiBQUkl1MzIgIi9iZGkvcmVhZF9haGVhZF9rYiIsCisJCQkJX3N5c2ZzX2RpciwgbWFqb3IsIG1pbm9yKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHN5c2ZzX3BhdGguIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFN5c2ZzIGlzIGtCIGJhc2VkLCByb3VuZCB1cCB0byBrQiAqLworCQlpZiAoKGxlbiA9IGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIEZNVHUzMiwKKwkJCQkgICAgICAgKHJlYWRfYWhlYWQgKyAxKSAvIDIpKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGJ1aWxkIHNpemUgaW4ga0IuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgoZmQgPSBvcGVuKF9wYXRoMCwgT19XUk9OTFksIDApKSAhPSAtMSkgeworCQkJaWYgKHdyaXRlKGZkLCBidWYsIGxlbikgPCBsZW4pIHsKKwkJCQlsb2dfc3lzX2Vycm9yKCJ3cml0ZSIsIF9wYXRoMCk7CisJCQkJciA9IDA7CisJCQl9CisKKwkJCWlmIChjbG9zZShmZCkpCisJCQkJbG9nX3N5c19kZWJ1ZygiY2xvc2UiLCBfcGF0aDApOworCisJCQlyZXR1cm4gcjsKKwkJfQorCisJCWxvZ19zeXNfZGVidWcoIm9wZW4iLCBfcGF0aDApOworCQkvKiBGYWxsIGJhY2sgdG8gdXNlIGRldl9uYW1lICovCisJfQorCisJaWYgKCEqZGV2X25hbWUpIHsKKwkJbG9nX2Vycm9yKCJFbXB0eSBkZXZpY2UgbmFtZSBwYXNzZWQgdG8gQkxLUkFHRVQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChmZCA9IF9vcGVuX2Rldl9ub2RlKGRldl9uYW1lKSkgPCAwKQorCQlyZXR1cm5fMDsKKworCWlmIChpb2N0bChmZCwgQkxLUkFTRVQsIHJlYWRfYWhlYWRfbG9uZykpIHsKKwkJbG9nX3N5c19lcnJvcigiQkxLUkFTRVQiLCBkZXZfbmFtZSk7CisJCXIgPSAwOworCX0KKworCWlmIChjbG9zZShmZCkpCisJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgZGV2X25hbWUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9kZXZfbm9kZV9yZWFkX2FoZWFkKGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSAgICB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkJICAgIHVpbnQzMl90IHJlYWRfYWhlYWQsIHVpbnQzMl90IHJlYWRfYWhlYWRfZmxhZ3MpCit7CisJdWludDMyX3QgY3VycmVudF9yZWFkX2FoZWFkOworCisJaWYgKHJlYWRfYWhlYWQgPT0gRE1fUkVBRF9BSEVBRF9BVVRPKQorCQlyZXR1cm4gMTsKKworCWlmIChyZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfTk9ORSkKKwkJcmVhZF9haGVhZCA9IDA7CisKKwlpZiAocmVhZF9haGVhZF9mbGFncyAmIERNX1JFQURfQUhFQURfTUlOSU1VTV9GTEFHKSB7CisJCWlmICghZ2V0X2Rldl9ub2RlX3JlYWRfYWhlYWQoZGV2X25hbWUsIG1ham9yLCBtaW5vciwgJmN1cnJlbnRfcmVhZF9haGVhZCkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoY3VycmVudF9yZWFkX2FoZWFkID49IHJlYWRfYWhlYWQpIHsKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogcmV0YWluaW5nIGtlcm5lbCByZWFkIGFoZWFkIG9mICUiIFBSSXUzMgorCQkJCSAgIiAocmVxdWVzdGVkICUiIFBSSXUzMiAiKSIsICAgICAgICAgICAKKwkJCQkgIGRldl9uYW1lLCBjdXJyZW50X3JlYWRfYWhlYWQsIHJlYWRfYWhlYWQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gX3NldF9yZWFkX2FoZWFkKGRldl9uYW1lLCBtYWpvciwgbWlub3IsIHJlYWRfYWhlYWQpOworfQorCisjZWxzZQorCitpbnQgZ2V0X2Rldl9ub2RlX3JlYWRfYWhlYWQoY29uc3QgY2hhciAqZGV2X25hbWUsIHVpbnQzMl90ICpyZWFkX2FoZWFkKQoreworCSpyZWFkX2FoZWFkID0gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zZXRfZGV2X25vZGVfcmVhZF9haGVhZChjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICAgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLAorCQkJCSAgICB1aW50MzJfdCByZWFkX2FoZWFkLCB1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzKQoreworCXJldHVybiAxOworfQorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisJTk9ERV9BREQsCisJTk9ERV9ERUwsCisJTk9ERV9SRU5BTUUsCisJTk9ERV9SRUFEX0FIRUFELAorCU5VTV9OT0RFUworfSBub2RlX29wX3Q7CisKK3N0YXRpYyBpbnQgX2RvX25vZGVfb3Aobm9kZV9vcF90IHR5cGUsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1aW50MzJfdCBtYWpvciwKKwkJICAgICAgIHVpbnQzMl90IG1pbm9yLCB1aWRfdCB1aWQsIGdpZF90IGdpZCwgbW9kZV90IG1vZGUsCisJCSAgICAgICBjb25zdCBjaGFyICpvbGRfbmFtZSwgdWludDMyX3QgcmVhZF9haGVhZCwKKwkJICAgICAgIHVpbnQzMl90IHJlYWRfYWhlYWRfZmxhZ3MsIGludCB3YXJuX2lmX3VkZXZfZmFpbGVkKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTk9ERV9BREQ6CisJCXJldHVybiBfYWRkX2Rldl9ub2RlKGRldl9uYW1lLCBtYWpvciwgbWlub3IsIHVpZCwgZ2lkLAorCQkJCSAgICAgbW9kZSwgd2Fybl9pZl91ZGV2X2ZhaWxlZCk7CisJY2FzZSBOT0RFX0RFTDoKKwkJcmV0dXJuIF9ybV9kZXZfbm9kZShkZXZfbmFtZSwgd2Fybl9pZl91ZGV2X2ZhaWxlZCk7CisJY2FzZSBOT0RFX1JFTkFNRToKKwkJcmV0dXJuIF9yZW5hbWVfZGV2X25vZGUob2xkX25hbWUsIGRldl9uYW1lLCB3YXJuX2lmX3VkZXZfZmFpbGVkKTsKKwljYXNlIE5PREVfUkVBRF9BSEVBRDoKKwkJcmV0dXJuIF9zZXRfZGV2X25vZGVfcmVhZF9haGVhZChkZXZfbmFtZSwgbWFqb3IsIG1pbm9yLAorCQkJCQkJcmVhZF9haGVhZCwgcmVhZF9haGVhZF9mbGFncyk7CisJZGVmYXVsdDoKKwkJOyAvKiBOT1RSRUFDSEVEICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBETV9MSVNUX0lOSVQoX25vZGVfb3BzKTsKK3N0YXRpYyBpbnQgX2NvdW50X25vZGVfb3BzW05VTV9OT0RFU107CisKK3N0cnVjdCBub2RlX29wX3Bhcm1zIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCW5vZGVfb3BfdCB0eXBlOworCWNoYXIgKmRldl9uYW1lOworCXVpbnQzMl90IG1ham9yOworCXVpbnQzMl90IG1pbm9yOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJbW9kZV90IG1vZGU7CisJdWludDMyX3QgcmVhZF9haGVhZDsKKwl1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzOworCWNoYXIgKm9sZF9uYW1lOworCWludCB3YXJuX2lmX3VkZXZfZmFpbGVkOworCXVuc2lnbmVkIHJlbHlfb25fdWRldjsKKwljaGFyIG5hbWVzWzBdOworfTsKKworc3RhdGljIHZvaWQgX3N0b3JlX3N0cihjaGFyICoqcG9zLCBjaGFyICoqcHRyLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RyY3B5KCpwb3MsIHN0cik7CisJKnB0ciA9ICpwb3M7CisJKnBvcyArPSBzdHJsZW4oKnB0cikgKyAxOworfQorCitzdGF0aWMgdm9pZCBfZGVsX25vZGVfb3Aoc3RydWN0IG5vZGVfb3BfcGFybXMgKm5vcCkKK3sKKwlfY291bnRfbm9kZV9vcHNbbm9wLT50eXBlXS0tOworCWRtX2xpc3RfZGVsKCZub3AtPmxpc3QpOworCWRtX2ZyZWUobm9wKTsKKworfQorCisvKiBDaGVjayBpZiB0aGVyZSBpcyBvdGhlciB0aGUgdHlwZSBvZiBub2RlIG9wZXJhdGlvbiBzdGFja2VkICovCitzdGF0aWMgaW50IF9vdGhlcl9ub2RlX29wcyhub2RlX29wX3QgdHlwZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9OT0RFUzsgaSsrKQorCQlpZiAodHlwZSAhPSBpICYmIF9jb3VudF9ub2RlX29wc1tpXSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfbG9nX25vZGVfb3AoY29uc3QgY2hhciAqYWN0aW9uX3N0ciwgc3RydWN0IG5vZGVfb3BfcGFybXMgKm5vcCkKK3sKKwljb25zdCBjaGFyICpyZWx5ID0gbm9wLT5yZWx5X29uX3VkZXYgPyAiIFt0cnVzdF91ZGV2XSIgOiAiIiA7CisJY29uc3QgY2hhciAqdmVyaWZ5ID0gbm9wLT53YXJuX2lmX3VkZXZfZmFpbGVkID8gIiBbdmVyaWZ5X3VkZXZdIiA6ICIiOworCisJc3dpdGNoIChub3AtPnR5cGUpIHsKKwljYXNlIE5PREVfQUREOgorCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiJXM6ICVzIE5PREVfQUREICglIiBQUkl1MzIgIiwlIiBQUkl1MzIgIikgJXU6JXUgMCVvJXMlcyIsCisJCQkJICAgICBub3AtPmRldl9uYW1lLCBhY3Rpb25fc3RyLCBub3AtPm1ham9yLCBub3AtPm1pbm9yLCBub3AtPnVpZCwgbm9wLT5naWQsIG5vcC0+bW9kZSwKKwkJCQkgICAgIHJlbHksIHZlcmlmeSk7CisJCWJyZWFrOworCWNhc2UgTk9ERV9ERUw6CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCIlczogJXMgTk9ERV9ERUwlcyVzIiwgbm9wLT5kZXZfbmFtZSwgYWN0aW9uX3N0ciwgcmVseSwgdmVyaWZ5KTsKKwkJYnJlYWs7CisJY2FzZSBOT0RFX1JFTkFNRToKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIiVzOiAlcyBOT0RFX1JFTkFNRSB0byAlcyVzJXMiLCBub3AtPm9sZF9uYW1lLCBhY3Rpb25fc3RyLCBub3AtPmRldl9uYW1lLCByZWx5LCB2ZXJpZnkpOworCQlicmVhazsKKwljYXNlIE5PREVfUkVBRF9BSEVBRDoKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIiVzOiAlcyBOT0RFX1JFQURfQUhFQUQgJSIgUFJJdTMyICIgKGZsYWdzPSUiIFBSSXUzMiAiKSVzJXMiLAorCQkJCSAgICAgbm9wLT5kZXZfbmFtZSwgYWN0aW9uX3N0ciwgbm9wLT5yZWFkX2FoZWFkLCBub3AtPnJlYWRfYWhlYWRfZmxhZ3MsIHJlbHksIHZlcmlmeSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsgLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKworc3RhdGljIGludCBfc3RhY2tfbm9kZV9vcChub2RlX29wX3QgdHlwZSwgY29uc3QgY2hhciAqZGV2X25hbWUsIHVpbnQzMl90IG1ham9yLAorCQkJICB1aW50MzJfdCBtaW5vciwgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIG1vZGVfdCBtb2RlLAorCQkJICBjb25zdCBjaGFyICpvbGRfbmFtZSwgdWludDMyX3QgcmVhZF9haGVhZCwKKwkJCSAgdWludDMyX3QgcmVhZF9haGVhZF9mbGFncywgaW50IHdhcm5faWZfdWRldl9mYWlsZWQsCisJCQkgIHVuc2lnbmVkIHJlbHlfb25fdWRldikKK3sKKwlzdHJ1Y3Qgbm9kZV9vcF9wYXJtcyAqbm9wOworCXN0cnVjdCBkbV9saXN0ICpub3BoLCAqbm9waHQ7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihkZXZfbmFtZSkgKyBzdHJsZW4ob2xkX25hbWUpICsgMjsKKwljaGFyICpwb3M7CisKKwkvKgorCSAqIE5vdGU6IHdhcm5faWZfdWRldl9mYWlsZWQgbXVzdCBoYXZlIHZhbGlkIGNvbnRlbnQKKwkgKi8KKwlpZiAoKHR5cGUgPT0gTk9ERV9ERUwpICYmIF9vdGhlcl9ub2RlX29wcyh0eXBlKSkKKwkJLyoKKwkJICogSWdub3JlIGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zIG9uIHRoZSBub2RlIGlmIGRlbGV0aW5nIGl0LgorCQkgKi8KKwkJZG1fbGlzdF9pdGVyYXRlX3NhZmUobm9waCwgbm9waHQsICZfbm9kZV9vcHMpIHsKKwkJCW5vcCA9IGRtX2xpc3RfaXRlbShub3BoLCBzdHJ1Y3Qgbm9kZV9vcF9wYXJtcyk7CisJCQlpZiAoIXN0cmNtcChkZXZfbmFtZSwgbm9wLT5kZXZfbmFtZSkpIHsKKwkJCQlfbG9nX25vZGVfb3AoIlVuc3RhY2tpbmciLCBub3ApOworCQkJCV9kZWxfbm9kZV9vcChub3ApOworCQkJCWlmICghX290aGVyX25vZGVfb3BzKHR5cGUpKQorCQkJCQlicmVhazsgLyogbm8gb3RoZXIgbm9uIERFTCBvcHMgKi8KKwkJCX0KKwkJfQorCWVsc2UgaWYgKCh0eXBlID09IE5PREVfQUREKSAmJiBfY291bnRfbm9kZV9vcHNbTk9ERV9ERUxdKQorCQkvKgorCQkgKiBJZ25vcmUgcHJldmlvdXMgREVMIG9wZXJhdGlvbiBvbiBhZGRlZCBub2RlLgorCQkgKiAoTm8gb3RoZXIgb3BlcmF0aW9ucyBmb3IgdGhpcyBkZXZpY2UgdGhlbiBERUwgY291bGQgYmUgc3RhY2tlZCBoZXJlKS4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKG5vcGgsIG5vcGh0LCAmX25vZGVfb3BzKSB7CisJCQlub3AgPSBkbV9saXN0X2l0ZW0obm9waCwgc3RydWN0IG5vZGVfb3BfcGFybXMpOworCQkJaWYgKChub3AtPnR5cGUgPT0gTk9ERV9ERUwpICYmCisJCQkgICAgIXN0cmNtcChkZXZfbmFtZSwgbm9wLT5kZXZfbmFtZSkpIHsKKwkJCQlfbG9nX25vZGVfb3AoIlVuc3RhY2tpbmciLCBub3ApOworCQkJCV9kZWxfbm9kZV9vcChub3ApOworCQkJCWJyZWFrOyAvKiBubyBvdGhlciBERUwgb3BzICovCisJCQl9CisJCX0KKwllbHNlIGlmICh0eXBlID09IE5PREVfUkVOQU1FKQorCQkvKgorCQkgKiBJZ25vcmUgYW55IG91dHN0YW5kaW5nIG9wZXJhdGlvbnMgaWYgcmVuYW1pbmcgaXQuCisJCSAqCisJCSAqIEN1cnJlbnRseSAgUkVOQU1FIG9wZXJhdGlvbiBoYXBwZW5zIHRocm91Z2ggJ3N1c3BlbmQgLT4gcmVzdW1lJy4KKwkJICogT24gJ3Jlc3VtZScgZGV2aWNlIGlzIGFkZGVkIHdpdGggcmVhZF9haGVhZCBzZXR0aW5ncywgc28gaXQgaXMKKwkJICogc2FmZSB0byByZW1vdmUgYW55IHN0YWNrZWQgQURELCBSRU5BTUUsIFJFQURfQUhFQUQgb3BlcmF0aW9uCisJCSAqIFRoZXJlIGNhbm5vdCBiZSBhbnkgREVMIG9wZXJhdGlvbiBvbiB0aGUgcmVuYW1lZCBkZXZpY2UuCisJCSAqLworCQlkbV9saXN0X2l0ZXJhdGVfc2FmZShub3BoLCBub3BodCwgJl9ub2RlX29wcykgeworCQkJbm9wID0gZG1fbGlzdF9pdGVtKG5vcGgsIHN0cnVjdCBub2RlX29wX3Bhcm1zKTsKKwkJCWlmICghc3RyY21wKG9sZF9uYW1lLCBub3AtPmRldl9uYW1lKSkgeworCQkJCV9sb2dfbm9kZV9vcCgiVW5zdGFja2luZyIsIG5vcCk7CisJCQkJX2RlbF9ub2RlX29wKG5vcCk7CisJCQl9CisJCX0KKwllbHNlIGlmICh0eXBlID09IE5PREVfUkVBRF9BSEVBRCkgeworCQkvKiB1ZGV2IGRvZXNuJ3QgcHJvY2VzcyByZWFkYWhlYWQgKi8KKwkJcmVseV9vbl91ZGV2ID0gMDsKKwkJd2Fybl9pZl91ZGV2X2ZhaWxlZCA9IDA7CisJfQorCisJaWYgKCEobm9wID0gZG1fbWFsbG9jKHNpemVvZigqbm9wKSArIGxlbikpKSB7CisJCWxvZ19lcnJvcigiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdGFjayBta25vZCBvcGVyYXRpb24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9zID0gbm9wLT5uYW1lczsKKwlub3AtPnR5cGUgPSB0eXBlOworCW5vcC0+bWFqb3IgPSBtYWpvcjsKKwlub3AtPm1pbm9yID0gbWlub3I7CisJbm9wLT51aWQgPSB1aWQ7CisJbm9wLT5naWQgPSBnaWQ7CisJbm9wLT5tb2RlID0gbW9kZTsKKwlub3AtPnJlYWRfYWhlYWQgPSByZWFkX2FoZWFkOworCW5vcC0+cmVhZF9haGVhZF9mbGFncyA9IHJlYWRfYWhlYWRfZmxhZ3M7CisJbm9wLT5yZWx5X29uX3VkZXYgPSByZWx5X29uX3VkZXY7CisKKwkvKgorCSAqIENsZWFyIHdhcm5faWZfdWRldl9mYWlsZWQgaWYgcmVseV9vbl91ZGV2IGlzIHNldC4gIEl0IGRvZXNuJ3QgZ2V0CisJICogY2hlY2tlZCBpbiB0aGlzIGNhc2UgLSB0aGlzIGp1c3QgcmVtb3ZlcyB0aGUgZmxhZyBmcm9tIGxvZyBtZXNzYWdlcy4KKwkgKi8KKwlub3AtPndhcm5faWZfdWRldl9mYWlsZWQgPSByZWx5X29uX3VkZXYgPyAwIDogd2Fybl9pZl91ZGV2X2ZhaWxlZDsKKworCV9zdG9yZV9zdHIoJnBvcywgJm5vcC0+ZGV2X25hbWUsIGRldl9uYW1lKTsKKwlfc3RvcmVfc3RyKCZwb3MsICZub3AtPm9sZF9uYW1lLCBvbGRfbmFtZSk7CisKKwlfY291bnRfbm9kZV9vcHNbdHlwZV0rKzsKKwlkbV9saXN0X2FkZCgmX25vZGVfb3BzLCAmbm9wLT5saXN0KTsKKworCV9sb2dfbm9kZV9vcCgiU3RhY2tpbmciLCBub3ApOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9wb3Bfbm9kZV9vcHModm9pZCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbm9waCwgKm5vcGh0OworCXN0cnVjdCBub2RlX29wX3Bhcm1zICpub3A7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShub3BoLCBub3BodCwgJl9ub2RlX29wcykgeworCQlub3AgPSBkbV9saXN0X2l0ZW0obm9waCwgc3RydWN0IG5vZGVfb3BfcGFybXMpOworCQlpZiAoIW5vcC0+cmVseV9vbl91ZGV2KSB7CisJCQlfbG9nX25vZGVfb3AoIlByb2Nlc3NpbmciLCBub3ApOworCQkJX2RvX25vZGVfb3Aobm9wLT50eXBlLCBub3AtPmRldl9uYW1lLCBub3AtPm1ham9yLCBub3AtPm1pbm9yLAorCQkJCSAgICBub3AtPnVpZCwgbm9wLT5naWQsIG5vcC0+bW9kZSwgbm9wLT5vbGRfbmFtZSwKKwkJCQkgICAgbm9wLT5yZWFkX2FoZWFkLCBub3AtPnJlYWRfYWhlYWRfZmxhZ3MsCisJCQkJICAgIG5vcC0+d2Fybl9pZl91ZGV2X2ZhaWxlZCk7CisJCX0gZWxzZQorCQkJX2xvZ19ub2RlX29wKCJTa2lwcGluZyIsIG5vcCk7CisJCV9kZWxfbm9kZV9vcChub3ApOworCX0KK30KKworaW50IGFkZF9kZXZfbm9kZShjb25zdCBjaGFyICpkZXZfbmFtZSwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLAorCQkgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIG1vZGVfdCBtb2RlLCBpbnQgY2hlY2tfdWRldiwgdW5zaWduZWQgcmVseV9vbl91ZGV2KQoreworCXJldHVybiBfc3RhY2tfbm9kZV9vcChOT0RFX0FERCwgZGV2X25hbWUsIG1ham9yLCBtaW5vciwgdWlkLAorCQkJICAgICAgZ2lkLCBtb2RlLCAiIiwgMCwgMCwgY2hlY2tfdWRldiwgcmVseV9vbl91ZGV2KTsKK30KKworaW50IHJlbmFtZV9kZXZfbm9kZShjb25zdCBjaGFyICpvbGRfbmFtZSwgY29uc3QgY2hhciAqbmV3X25hbWUsIGludCBjaGVja191ZGV2LCB1bnNpZ25lZCByZWx5X29uX3VkZXYpCit7CisJcmV0dXJuIF9zdGFja19ub2RlX29wKE5PREVfUkVOQU1FLCBuZXdfbmFtZSwgMCwgMCwgMCwKKwkJCSAgICAgIDAsIDAsIG9sZF9uYW1lLCAwLCAwLCBjaGVja191ZGV2LCByZWx5X29uX3VkZXYpOworfQorCitpbnQgcm1fZGV2X25vZGUoY29uc3QgY2hhciAqZGV2X25hbWUsIGludCBjaGVja191ZGV2LCB1bnNpZ25lZCByZWx5X29uX3VkZXYpCit7CisJcmV0dXJuIF9zdGFja19ub2RlX29wKE5PREVfREVMLCBkZXZfbmFtZSwgMCwgMCwgMCwKKwkJCSAgICAgIDAsIDAsICIiLCAwLCAwLCBjaGVja191ZGV2LCByZWx5X29uX3VkZXYpOworfQorCitpbnQgc2V0X2Rldl9ub2RlX3JlYWRfYWhlYWQoY29uc3QgY2hhciAqZGV2X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLAorCQkJICAgIHVpbnQzMl90IHJlYWRfYWhlYWQsIHVpbnQzMl90IHJlYWRfYWhlYWRfZmxhZ3MpCit7CisJaWYgKHJlYWRfYWhlYWQgPT0gRE1fUkVBRF9BSEVBRF9BVVRPKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBfc3RhY2tfbm9kZV9vcChOT0RFX1JFQURfQUhFQUQsIGRldl9uYW1lLCBtYWpvciwgbWlub3IsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAiIiwgcmVhZF9haGVhZCwgcmVhZF9haGVhZF9mbGFncywgMCwgMCk7Cit9CisKK3ZvaWQgdXBkYXRlX2RldnModm9pZCkKK3sKKwlfcG9wX25vZGVfb3BzKCk7Cit9CisKK3N0YXRpYyBpbnQgX2Nhbm9uaWNhbGl6ZV9hbmRfc2V0X2Rpcihjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgc2l6ZV90IG1heF9sZW4sIGNoYXIgKmRpcikKK3sKKwlzaXplX3QgbGVuOworCWNvbnN0IGNoYXIgKnNsYXNoOworCisJaWYgKCpzcmMgIT0gJy8nKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJJbnZhbGlkIGRpcmVjdG9yeSB2YWx1ZSwgJXM6ICIKKwkJCQkgICAgICJub3QgYW4gYWJzb2x1dGUgbmFtZS4iLCBzcmMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZW4gPSBzdHJsZW4oc3JjKTsKKwlzbGFzaCA9IHNyY1tsZW4tMV0gPT0gJy8nID8gIiIgOiAiLyI7CisKKwlpZiAoZG1fc25wcmludGYoZGlyLCBtYXhfbGVuLCAiJXMlcyVzIiwgc3JjLCBzbGFzaCwgc3VmZml4ID8gc3VmZml4IDogIiIpIDwgMCkgeworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiSW52YWxpZCBkaXJlY3RvcnkgdmFsdWUsICVzOiBuYW1lIHRvbyBsb25nLiIsIHNyYyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZG1fc2V0X2Rldl9kaXIoY29uc3QgY2hhciAqZGV2X2RpcikKK3sKKwlyZXR1cm4gX2Nhbm9uaWNhbGl6ZV9hbmRfc2V0X2RpcihkZXZfZGlyLCBETV9ESVIsIHNpemVvZiBfZG1fZGlyLCBfZG1fZGlyKTsKK30KKworY29uc3QgY2hhciAqZG1fZGlyKHZvaWQpCit7CisJcmV0dXJuIF9kbV9kaXI7Cit9CisKK2ludCBkbV9zZXRfc3lzZnNfZGlyKGNvbnN0IGNoYXIgKnN5c2ZzX2RpcikKK3sKKwlpZiAoIXN5c2ZzX2RpciB8fCAhKnN5c2ZzX2RpcikgeworCQlfc3lzZnNfZGlyWzBdID0gJ1wwJzsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIF9jYW5vbmljYWxpemVfYW5kX3NldF9kaXIoc3lzZnNfZGlyLCBOVUxMLCBzaXplb2YgX3N5c2ZzX2RpciwgX3N5c2ZzX2Rpcik7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3N5c2ZzX2Rpcih2b2lkKQoreworCXJldHVybiBfc3lzZnNfZGlyOworfQorCisvKgorICogUmVwbGFjZSBleGlzdGluZyB1dWlkX3ByZWZpeCBwcm92aWRlZCBpdCBpc24ndCB0b28gbG9uZy4KKyAqLworaW50IGRtX3NldF91dWlkX3ByZWZpeChjb25zdCBjaGFyICp1dWlkX3ByZWZpeCkKK3sKKwlpZiAoIXV1aWRfcHJlZml4KQorCQlyZXR1cm5fMDsKKworCWlmIChzdHJsZW4odXVpZF9wcmVmaXgpID4gRE1fTUFYX1VVSURfUFJFRklYX0xFTikgeworCQlsb2dfZXJyb3IoIk5ldyB1dWlkIHByZWZpeCAlcyB0b28gbG9uZy4iLCB1dWlkX3ByZWZpeCk7CisJCXJldHVybiAwOworCX0KKworCXN0cmNweShfZGVmYXVsdF91dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXgpOworCisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3V1aWRfcHJlZml4KHZvaWQpCit7CisJcmV0dXJuIF9kZWZhdWx0X3V1aWRfcHJlZml4OworfQorCitzdGF0aWMgaW50IF9pc19vY3RhbChpbnQgYSkKK3sKKwlyZXR1cm4gKCgoYSkgJiB+NykgPT0gJzAnKTsKK30KKworLyogQ29udmVydCBtYW5nbGVkIG1vdW50aW5mbyBpbnRvIG5vcm1hbCBBU0NJSSBzdHJpbmcgKi8KK3N0YXRpYyB2b2lkIF91bm1hbmdsZV9tb3VudGluZm9fc3RyaW5nKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqYnVmKQoreworCXdoaWxlICgqc3JjKSB7CisJCWlmICgoKnNyYyA9PSAnXFwnKSAmJgorCQkgICAgX2lzX29jdGFsKHNyY1sxXSkgJiYgX2lzX29jdGFsKHNyY1syXSkgJiYgX2lzX29jdGFsKHNyY1szXSkpIHsKKwkJCSpidWYrKyA9IDY0ICogKHNyY1sxXSAmIDcpICsgOCAqIChzcmNbMl0gJiA3KSArIChzcmNbM10gJiA3KTsKKwkJCXNyYyArPSA0OworCQl9IGVsc2UKKwkJCSpidWYrKyA9ICpzcmMrKzsKKwl9CisJKmJ1ZiA9ICdcMCc7Cit9CisKKy8qIFBhcnNlIG9uZSBsaW5lIG9mIG1vdW50aW5mbyBhbmQgdW5tYW5nbGVkIHRhcmdldCBsaW5lICovCitzdGF0aWMgaW50IF9tb3VudGluZm9fcGFyc2VfbGluZShjb25zdCBjaGFyICpsaW5lLCB1bnNpZ25lZCAqbWFqLCB1bnNpZ25lZCAqbWluLCBjaGFyICpidWYpCit7CisJY2hhciByb290W1BBVEhfTUFYICsgMV07IC8qIHNzY2FuZiBuZWVkcyBleHRyYSAnXDAnICovCisJY2hhciB0YXJnZXRbUEFUSF9NQVggKyAxXTsKKworCS8qIFRPRE86IG1heWJlIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YgICVtcyAgZ2xpYiBzdXBwb3J0ID8gKi8KKwlpZiAoc3NjYW5mKGxpbmUsICIlKnUgJSp1ICV1OiV1ICUiIERNX1RPX1NUUklORyhQQVRIX01BWCkKKwkJICAgInMgJSIgRE1fVE9fU1RSSU5HKFBBVEhfTUFYKSAicyIsCisJCSAgIG1haiwgbWluLCByb290LCB0YXJnZXQpIDwgNCkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBtb3VudGluZm8gbGluZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX3VubWFuZ2xlX21vdW50aW5mb19zdHJpbmcodGFyZ2V0LCBidWYpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0byBvcGVyYXRlIG9uIGluZGl2aWRhbCBtb3VudGluZm8gbGluZSwKKyAqIG1pbm9yLCBtYWpvciBhbmQgbW91bnQgdGFyZ2V0IGFyZSBwYXJzZWQgYW5kIHVubWFuZ2xlZAorICovCitpbnQgZG1fbW91bnRpbmZvX3JlYWQoZG1fbW91bnRpbmZvX2xpbmVfY2FsbGJhY2tfZm4gcmVhZF9mbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlGSUxFICptaW5mbzsKKwljaGFyIGJ1ZmZlclsyICogUEFUSF9NQVhdOworCWNoYXIgdGFyZ2V0W1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBtYWosIG1pbjsKKwlpbnQgciA9IDE7CisKKwlpZiAoIShtaW5mbyA9IGZvcGVuKF9tb3VudGluZm8sICJyIikpKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIF9tb3VudGluZm8pOworCQllbHNlCisJCQlsb2dfc3lzX2RlYnVnKCJmb3BlbiIsIF9tb3VudGluZm8pOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoIWZlb2YobWluZm8pICYmIGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIG1pbmZvKSkKKwkJaWYgKCFfbW91bnRpbmZvX3BhcnNlX2xpbmUoYnVmZmVyLCAmbWFqLCAmbWluLCB0YXJnZXQpIHx8CisJCSAgICAhcmVhZF9mbihidWZmZXIsIG1haiwgbWluLCB0YXJnZXQsIGNiX2RhdGEpKSB7CisJCQlzdGFjazsKKwkJCXIgPSAwOworCQkJYnJlYWs7CisJCX0KKworCWlmIChmY2xvc2UobWluZm8pKQorCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBfbW91bnRpbmZvKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zeXNmc19nZXRfZG1fbmFtZSh1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQoreworCWNoYXIgKnN5c2ZzX3BhdGgsICp0ZW1wX2J1ZiA9IE5VTEw7CisJRklMRSAqZnAgPSBOVUxMOworCWludCByID0gMDsKKwlzaXplX3QgbGVuOworCisJaWYgKCEoc3lzZnNfcGF0aCA9IGRtX21hbGxvYyhQQVRIX01BWCkpIHx8CisJICAgICEodGVtcF9idWYgPSBkbV9tYWxsb2MoUEFUSF9NQVgpKSkgeworCQlsb2dfZXJyb3IoIl9zeXNmc19nZXRfZG1fbmFtZTogZmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJzIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChkbV9zbnByaW50ZihzeXNmc19wYXRoLCBQQVRIX01BWCwgIiVzZGV2L2Jsb2NrLyUiIFBSSXUzMiAiOiUiIFBSSXUzMgorCQkJIi9kbS9uYW1lIiwgX3N5c2ZzX2RpciwgbWFqb3IsIG1pbm9yKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJfc3lzZnNfZ2V0X2RtX25hbWU6IGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIShmcCA9IGZvcGVuKHN5c2ZzX3BhdGgsICJyIikpKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQlsb2dfc3lzX2Vycm9yKCJmb3BlbiIsIHN5c2ZzX3BhdGgpOworCQllbHNlCisJCQlsb2dfc3lzX2RlYnVnKCJmb3BlbiIsIHN5c2ZzX3BhdGgpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIWZnZXRzKHRlbXBfYnVmLCBQQVRIX01BWCwgZnApKSB7CisJCWxvZ19zeXNfZXJyb3IoImZnZXRzIiwgc3lzZnNfcGF0aCk7CisJCWdvdG8gYmFkOworCX0KKworCWxlbiA9IHN0cmxlbih0ZW1wX2J1Zik7CisKKwlpZiAobGVuID4gYnVmX3NpemUpIHsKKwkJbG9nX2Vycm9yKCJfc3lzZnNfZ2V0X2RtX25hbWU6IHN1cHBsaWVkIGJ1ZmZlciB0b28gc21hbGwiKTsKKwkJZ290byBiYWQ7CisJfQorCisJdGVtcF9idWZbbGVuID8gbGVuIC0gMSA6IDBdID0gJ1wwJzsgLyogXG4gKi8KKwlzdHJjcHkoYnVmLCB0ZW1wX2J1Zik7CisJciA9IDE7CitiYWQ6CisJaWYgKGZwICYmIGZjbG9zZShmcCkpCisJCWxvZ19zeXNfZXJyb3IoImZjbG9zZSIsIHN5c2ZzX3BhdGgpOworCisJZG1fZnJlZSh0ZW1wX2J1Zik7CisJZG1fZnJlZShzeXNmc19wYXRoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zeXNmc19nZXRfa2VybmVsX25hbWUodWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLCBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwljaGFyICpuYW1lLCAqc3lzZnNfcGF0aCwgKnRlbXBfYnVmID0gTlVMTDsKKwlzc2l6ZV90IHNpemU7CisJc2l6ZV90IGxlbjsKKwlpbnQgciA9IDA7CisKKwlpZiAoIShzeXNmc19wYXRoID0gZG1fbWFsbG9jKFBBVEhfTUFYKSkgfHwKKwkgICAgISh0ZW1wX2J1ZiA9IGRtX21hbGxvYyhQQVRIX01BWCkpKSB7CisJCWxvZ19lcnJvcigiX3N5c2ZzX2dldF9rZXJuZWxfbmFtZTogZmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJzIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChkbV9zbnByaW50ZihzeXNmc19wYXRoLCBQQVRIX01BWCwgIiVzZGV2L2Jsb2NrLyUiIFBSSXUzMiAiOiUiIFBSSXUzMiwKKwkJCV9zeXNmc19kaXIsIG1ham9yLCBtaW5vcikgPCAwKSB7CisJCWxvZ19lcnJvcigiX3N5c2ZzX2dldF9rZXJuZWxfbmFtZTogZG1fc25wcmludGYgZmFpbGVkIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICgoc2l6ZSA9IHJlYWRsaW5rKHN5c2ZzX3BhdGgsIHRlbXBfYnVmLCBQQVRIX01BWCAtIDEpKSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWxvZ19zeXNfZXJyb3IoInJlYWRsaW5rIiwgc3lzZnNfcGF0aCk7CisJCWVsc2UKKwkJCWxvZ19zeXNfZGVidWcoInJlYWRsaW5rIiwgc3lzZnNfcGF0aCk7CisJCWdvdG8gYmFkOworCX0KKwl0ZW1wX2J1ZltzaXplXSA9ICdcMCc7CisKKwlpZiAoIShuYW1lID0gc3RycmNocih0ZW1wX2J1ZiwgJy8nKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgbG9jYXRlIGRldmljZSBrZXJuZWwgbmFtZSBpbiBzeXNmcyBwYXRoICVzIiwgdGVtcF9idWYpOworCQlnb3RvIGJhZDsKKwl9CisJbmFtZSArPSAxOworCWxlbiA9IHNpemUgLSAobmFtZSAtIHRlbXBfYnVmKSArIDE7CisKKwlpZiAobGVuID4gYnVmX3NpemUpIHsKKwkJbG9nX2Vycm9yKCJfc3lzZnNfZ2V0X2tlcm5lbF9uYW1lOiBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlzdHJjcHkoYnVmLCBuYW1lKTsKKwlyID0gMTsKK2JhZDoKKwlkbV9mcmVlKHRlbXBfYnVmKTsKKwlkbV9mcmVlKHN5c2ZzX3BhdGgpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9kZXZpY2VfZ2V0X25hbWUodWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLCBpbnQgcHJlZmVyX2tlcm5lbF9uYW1lLAorCQkgICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUpCit7CisJaWYgKCEqX3N5c2ZzX2RpcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIGRldmljZS1tYXBwZXIgZGV2aWNlcyBhbmQgcHJlZmVyX2tlcm5lbF9uYW1lID0gMAorCSAqIGdldCBkbSBuYW1lIGJ5IHJlYWRpbmcgL3N5cy9kZXYvYmxvY2svbWFqb3I6bWlub3IvZG0vbmFtZSwKKwkgKiBmYWxsYmFjayB0byBfc3lzZnNfZ2V0X2tlcm5lbF9uYW1lIGlmIG5vdCBzdWNjZXNzZnVsCisJICovCisJaWYgKGRtX2lzX2RtX21ham9yKG1ham9yKSAmJiAhcHJlZmVyX2tlcm5lbF9uYW1lKSB7CisJCWlmIChfc3lzZnNfZ2V0X2RtX25hbWUobWFqb3IsIG1pbm9yLCBidWYsIGJ1Zl9zaXplKSkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlzdGFjazsKKwl9CisKKwkvKgorCSAqIG5vbi1kZXZpY2UtbWFwcGVyIGRldmljZXMgb3IgcHJlZmVyX2tlcm5lbF9uYW1lID0gMQorCSAqIGdldCBrZXJuZWwgbmFtZSB1c2luZyByZWFkbGluayAvc3lzL2Rldi9ibG9jay9tYWpvcjptaW5vciAtPiAuLi4vZG0tWAorCSAqLworCXJldHVybiBfc3lzZnNfZ2V0X2tlcm5lbF9uYW1lKG1ham9yLCBtaW5vciwgYnVmLCBidWZfc2l6ZSk7Cit9CisKK2ludCBkbV9kZXZpY2VfaGFzX2hvbGRlcnModWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKQoreworCWNoYXIgc3lzZnNfcGF0aFtQQVRIX01BWF07CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoISpfc3lzZnNfZGlyKQorCQlyZXR1cm4gMDsKKworCWlmIChkbV9zbnByaW50ZihzeXNmc19wYXRoLCBQQVRIX01BWCwgIiVzZGV2L2Jsb2NrLyUiIFBSSXUzMgorCQkJIjolIiBQUkl1MzIgIi9ob2xkZXJzIiwgX3N5c2ZzX2RpciwgbWFqb3IsIG1pbm9yKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJzeXNmc19wYXRoIGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RhdChzeXNmc19wYXRoLCAmc3QpKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQlsb2dfc3lzX2Vycm9yKCJzdGF0Iiwgc3lzZnNfcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAhZG1faXNfZW1wdHlfZGlyKHN5c2ZzX3BhdGgpOworfQorCitzdGF0aWMgaW50IF9tb3VudGVkX2ZzX29uX2RldmljZShjb25zdCBjaGFyICprZXJuZWxfZGV2X25hbWUpCit7CisJY2hhciBzeXNmc19wYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZGlyZW50ICpkaXJlbnQ7CisJRElSICpkOworCXN0cnVjdCBzdGF0IHN0OworCWludCByID0gMDsKKworCWlmIChkbV9zbnByaW50ZihzeXNmc19wYXRoLCBQQVRIX01BWCwgIiVzZnMiLCBfc3lzZnNfZGlyKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJzeXNmc19wYXRoIGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShkID0gb3BlbmRpcihzeXNmc19wYXRoKSkpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWxvZ19zeXNfZXJyb3IoIm9wZW5kaXIiLCBzeXNmc19wYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChkaXJlbnQgPSByZWFkZGlyKGQpKSkgeworCQlpZiAoIXN0cmNtcChkaXJlbnQtPmRfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkbV9zbnByaW50ZihzeXNmc19wYXRoLCBQQVRIX01BWCwgIiVzZnMvJXMvJXMiLAorCQkJCV9zeXNmc19kaXIsIGRpcmVudC0+ZF9uYW1lLCBrZXJuZWxfZGV2X25hbWUpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJzeXNmc19wYXRoIGRtX3NucHJpbnRmIGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXN0YXQoc3lzZnNfcGF0aCwgJnN0KSkgeworCQkJLyogZm91bmQhICovCisJCQlyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJbG9nX3N5c19lcnJvcigic3RhdCIsIHN5c2ZzX3BhdGgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2xvc2VkaXIoZCkpCisJCWxvZ19lcnJvcigiX2ZzX3ByZXNlbnRfb25fZGV2aWNlOiAlczogY2xvc2VkaXIgZmFpbGVkIiwga2VybmVsX2Rldl9uYW1lKTsKKworCXJldHVybiByOworfQorCitzdHJ1Y3QgbW91bnRpbmZvX3MgeworCXVuc2lnbmVkIG1hajsKKwl1bnNpZ25lZCBtaW47CisJaW50IG1vdW50ZWQ7Cit9OworCitzdGF0aWMgaW50IF9kZXZpY2VfaGFzX21vdW50ZWRfZnMoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBtYWpvciwgdW5zaWduZWQgbWlub3IsCisJCQkJICBjaGFyICp0YXJnZXQsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG1vdW50aW5mb19zICpkYXRhID0gY2JfZGF0YTsKKwljaGFyIGtlcm5lbF9kZXZfbmFtZVtQQVRIX01BWF07CisKKwlpZiAoKG1ham9yID09IGRhdGEtPm1haikgJiYgKG1pbm9yID09IGRhdGEtPm1pbikpIHsKKwkJaWYgKCFkbV9kZXZpY2VfZ2V0X25hbWUobWFqb3IsIG1pbm9yLCAxLCBrZXJuZWxfZGV2X25hbWUsCisJCQkJCXNpemVvZihrZXJuZWxfZGV2X25hbWUpKSkgeworCQkJc3RhY2s7CisJCQkqa2VybmVsX2Rldl9uYW1lID0gJ1wwJzsKKwkJfQorCQlsb2dfdmVyYm9zZSgiRGV2aWNlICVzICgldToldSkgYXBwZWFycyB0byBiZSBtb3VudGVkIG9uICVzLiIsCisJCQkgICAga2VybmVsX2Rldl9uYW1lLCBtYWpvciwgbWlub3IsIHRhcmdldCk7CisJCWRhdGEtPm1vdW50ZWQgPSAxOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzKHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vcikKK3sKKwljaGFyIGtlcm5lbF9kZXZfbmFtZVtQQVRIX01BWF07CisJc3RydWN0IG1vdW50aW5mb19zIGRhdGEgPSB7CisJCS5tYWogPSBtYWpvciwKKwkJLm1pbiA9IG1pbm9yLAorCX07CisKKwlpZiAoIWRtX21vdW50aW5mb19yZWFkKF9kZXZpY2VfaGFzX21vdW50ZWRfZnMsICZkYXRhKSkKKwkJc3RhY2s7CisKKwlpZiAoZGF0YS5tb3VudGVkKQorCQlyZXR1cm4gMTsKKwkvKgorCSAqIFRPRE86IFZlcmlmeSBkbV9tb3VudGluZm9fcmVhZCgpIGlzIHN1cGVyc2V0CisJICogYW5kIHJlbW92ZSBzeXNmcyBjaGVjayAobmFtZXNwYWNlcykKKwkgKi8KKwkvKiBHZXQga2VybmVsIGRldmljZSBuYW1lIGZpcnN0ICovCisJaWYgKCFkbV9kZXZpY2VfZ2V0X25hbWUobWFqb3IsIG1pbm9yLCAxLCBrZXJuZWxfZGV2X25hbWUsIFBBVEhfTUFYKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayAvc3lzL2ZzLzxmc19uYW1lPi88a2VybmVsX2Rldl9uYW1lPiBwcmVzZW5jZSAqLworCXJldHVybiBfbW91bnRlZF9mc19vbl9kZXZpY2Uoa2VybmVsX2Rldl9uYW1lKTsKK30KKworaW50IGRtX21rbm9kZXMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByID0gMDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9NS05PREVTKSkpCisJCXJldHVybiAwOworCisJaWYgKG5hbWUgJiYgIWRtX3Rhc2tfc2V0X25hbWUoZG10LCBuYW1lKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvIG91dDsKKworCXIgPSBkbV90YXNrX3J1bihkbXQpOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9kcml2ZXJfdmVyc2lvbihjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByID0gMDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9WRVJTSU9OKSkpCisJCXJldHVybiAwOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgZHJpdmVyIHZlcnNpb24iKTsKKworCWlmICghZG1fdGFza19nZXRfZHJpdmVyX3ZlcnNpb24oZG10LCB2ZXJzaW9uLCBzaXplKSkKKwkJZ290byBvdXQ7CisKKwlyID0gMTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfc2V0X2Nvb2tpZV9mbGFncyhzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MTZfdCBmbGFncykKK3sKKwlpZiAoIWRtX2Nvb2tpZV9zdXBwb3J0ZWQoKSkKKwkJcmV0dXJuOworCisJaWYgKF91ZGV2X2Rpc2FibGVkKSB7CisJCS8qCisJCSAqIElmIHVkZXYgaXMgZGlzYWJsZWQsIGhhcmRjb2RlIHRoaXMgZnVuY3Rpb25hbGl0eToKKwkJICogICAtIHdlIHdhbnQgbGliZG0gdG8gY3JlYXRlIHRoZSBub2RlcworCQkgKiAgIC0gd2UgZG9uJ3Qgd2FudCB0aGUgL2Rldi9tYXBwZXIgYW5kIGFueSBzdWJzeXN0ZW0KKwkJICogICAgIHJlbGF0ZWQgY29udGVudCB0byBiZSBjcmVhdGVkIGJ5IHVkZXYgaWYgdWRldgorCQkgKiAgICAgcnVsZXMgYXJlIGluc3RhbGxlZAorCQkgKi8KKwkJZmxhZ3MgJj0gfkRNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLOworCQlmbGFncyB8PSBETV9VREVWX0RJU0FCTEVfRE1fUlVMRVNfRkxBRyB8IERNX1VERVZfRElTQUJMRV9TVUJTWVNURU1fUlVMRVNfRkxBRzsKKwl9CisKKwlkbXQtPmV2ZW50X25yID0gZmxhZ3MgPDwgRE1fVURFVl9GTEFHU19TSElGVDsKK30KKworI2lmbmRlZiBVREVWX1NZTkNfU1VQUE9SVAordm9pZCBkbV91ZGV2X3NldF9zeW5jX3N1cHBvcnQoaW50IHN5bmNfd2l0aF91ZGV2KQoreworfQorCitpbnQgZG1fdWRldl9nZXRfc3luY19zdXBwb3J0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG1fdWRldl9zZXRfY2hlY2tpbmcoaW50IGNoZWNraW5nKQoreworfQorCitpbnQgZG1fdWRldl9nZXRfY2hlY2tpbmcodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3Rhc2tfc2V0X2Nvb2tpZShzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCAqY29va2llLCB1aW50MTZfdCBmbGFncykKK3sKKwlfc2V0X2Nvb2tpZV9mbGFncyhkbXQsIGZsYWdzKTsKKworCSpjb29raWUgPSAwOworCWRtdC0+Y29va2llX3NldCA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3VkZXZfY29tcGxldGUodWludDMyX3QgY29va2llKQoreworCXJldHVybiAxOworfQorCitpbnQgZG1fdWRldl93YWl0KHVpbnQzMl90IGNvb2tpZSkKK3sKKwl1cGRhdGVfZGV2cygpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV91ZGV2X3dhaXRfaW1tZWRpYXRlKHVpbnQzMl90IGNvb2tpZSwgaW50ICpyZWFkeSkKK3sKKwl1cGRhdGVfZGV2cygpOworCSpyZWFkeSA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UJCS8qIFVERVZfU1lOQ19TVVBQT1JUICovCisKK3N0YXRpYyBpbnQgX2NoZWNrX3NlbWFwaG9yZV9pc19zdXBwb3J0ZWQodm9pZCkKK3sKKwlpbnQgbWF4aWQ7CisJdW5pb24gc2VtdW4gYXJnOworCXN0cnVjdCBzZW1pbmZvIHNlbWluZm87CisKKwlhcmcuX19idWYgPSAmc2VtaW5mbzsKKwltYXhpZCA9IHNlbWN0bCgwLCAwLCBTRU1fSU5GTywgYXJnKTsKKworCWlmIChtYXhpZCA8IDApIHsKKwkJbG9nX3dhcm4oIktlcm5lbCBub3QgY29uZmlndXJlZCBmb3Igc2VtYXBob3JlcyAoU3lzdGVtIFYgSVBDKS4gIgorCQkJICJOb3QgdXNpbmcgdWRldiBzeW5jaHJvbmlzYXRpb24gY29kZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX3VkZXZfaXNfcnVubmluZyh2b2lkKQoreworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X3F1ZXVlICp1ZGV2X3F1ZXVlOworCWludCByOworCisJaWYgKCEodWRldiA9IHVkZXZfbmV3KCkpKQorCQlnb3RvX2JhZDsKKworCWlmICghKHVkZXZfcXVldWUgPSB1ZGV2X3F1ZXVlX25ldyh1ZGV2KSkpIHsKKwkJdWRldl91bnJlZih1ZGV2KTsKKwkJZ290b19iYWQ7CisJfQorCisJaWYgKCEociA9IHVkZXZfcXVldWVfZ2V0X3VkZXZfaXNfYWN0aXZlKHVkZXZfcXVldWUpKSkKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgaXMgbm90IHJ1bm5pbmcuICIKKwkJCQkgICAgICJOb3QgdXNpbmcgdWRldiBzeW5jaHJvbmlzYXRpb24gY29kZS4iKTsKKworCXVkZXZfcXVldWVfdW5yZWYodWRldl9xdWV1ZSk7CisJdWRldl91bnJlZih1ZGV2KTsKKworCXJldHVybiByOworCitiYWQ6CisJbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IHVkZXYgc3RhdGUuIEFzc3VtaW5nIHVkZXYgaXMgbm90IHJ1bm5pbmcuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9jaGVja191ZGV2X3N5bmNfcmVxdWlyZW1lbnRzX29uY2Uodm9pZCkKK3sKKwlpZiAoX3NlbWFwaG9yZV9zdXBwb3J0ZWQgPCAwKQorCQlfc2VtYXBob3JlX3N1cHBvcnRlZCA9IF9jaGVja19zZW1hcGhvcmVfaXNfc3VwcG9ydGVkKCk7CisKKwlpZiAoX3VkZXZfcnVubmluZyA8IDApIHsKKwkJX3VkZXZfcnVubmluZyA9IF9jaGVja191ZGV2X2lzX3J1bm5pbmcoKTsKKwkJaWYgKF91ZGV2X2Rpc2FibGVkICYmIF91ZGV2X3J1bm5pbmcpCisJCQlsb2dfd2FybigiVWRldiBpcyBydW5uaW5nIGFuZCBETV9ESVNBQkxFX1VERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiAiCisJCQkJICJCeXBhc3NpbmcgdWRldiwgZGV2aWNlLW1hcHBlciBsaWJyYXJ5IHdpbGwgbWFuYWdlIGRldmljZSAiCisJCQkJICJub2RlcyBpbiBkZXZpY2UgZGlyZWN0b3J5LiIpOworCX0KK30KKwordm9pZCBkbV91ZGV2X3NldF9zeW5jX3N1cHBvcnQoaW50IHN5bmNfd2l0aF91ZGV2KQoreworCV9jaGVja191ZGV2X3N5bmNfcmVxdWlyZW1lbnRzX29uY2UoKTsKKwlfc3luY193aXRoX3VkZXYgPSBzeW5jX3dpdGhfdWRldjsKK30KKworaW50IGRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCh2b2lkKQoreworCV9jaGVja191ZGV2X3N5bmNfcmVxdWlyZW1lbnRzX29uY2UoKTsKKworCXJldHVybiAhX3VkZXZfZGlzYWJsZWQgJiYgX3NlbWFwaG9yZV9zdXBwb3J0ZWQgJiYKKwkJZG1fY29va2llX3N1cHBvcnRlZCgpICYmX3VkZXZfcnVubmluZyAmJiBfc3luY193aXRoX3VkZXY7Cit9CisKK3ZvaWQgZG1fdWRldl9zZXRfY2hlY2tpbmcoaW50IGNoZWNraW5nKQoreworCWlmICgoX3VkZXZfY2hlY2tpbmcgPSBjaGVja2luZykpCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJETSB1ZGV2IGNoZWNraW5nIGVuYWJsZWQiKTsKKwllbHNlCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJETSB1ZGV2IGNoZWNraW5nIGRpc2FibGVkIik7Cit9CisKK2ludCBkbV91ZGV2X2dldF9jaGVja2luZyh2b2lkKQoreworCXJldHVybiBfdWRldl9jaGVja2luZzsKK30KKworc3RhdGljIGludCBfZ2V0X2Nvb2tpZV9zZW0odWludDMyX3QgY29va2llLCBpbnQgKnNlbWlkKQoreworCWlmIChjb29raWUgPj4gMTYgIT0gRE1fQ09PS0lFX01BR0lDKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGNvbnRpbnVlIHRvIGFjY2VzcyBub3RpZmljYXRpb24gIgorCQkJICAic2VtYXBob3JlIGlkZW50aWZpZWQgYnkgY29va2llIHZhbHVlICUiCisJCQkgIFBSSXUzMiAiICgweCV4KS4gSW5jb3JyZWN0IGNvb2tpZSBwcmVmaXguIiwKKwkJCSAgY29va2llLCBjb29raWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKCpzZW1pZCA9IHNlbWdldCgoa2V5X3QpIGNvb2tpZSwgMSwgMCkpID49IDApCisJCXJldHVybiAxOworCisJc3dpdGNoIChlcnJubykgeworCQljYXNlIEVOT0VOVDoKKwkJCWxvZ19lcnJvcigiQ291bGQgbm90IGZpbmQgbm90aWZpY2F0aW9uICIKKwkJCQkgICJzZW1hcGhvcmUgaWRlbnRpZmllZCBieSBjb29raWUgIgorCQkJCSAgInZhbHVlICUiIFBSSXUzMiAiICgweCV4KSIsCisJCQkJICBjb29raWUsIGNvb2tpZSk7CisJCQlicmVhazsKKwkJY2FzZSBFQUNDRVM6CisJCQlsb2dfZXJyb3IoIk5vIHBlcm1pc3Npb24gdG8gYWNjZXNzICIKKwkJCQkgICJub3RpZmljYXRvbiBzZW1hcGhvcmUgaWRlbnRpZmllZCAiCisJCQkJICAiYnkgY29va2llIHZhbHVlICUiIFBSSXUzMiAiICgweCV4KSIsCisJCQkJICBjb29raWUsIGNvb2tpZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFjY2VzcyBub3RpZmljYXRpb24gIgorCQkJCSAgICJzZW1hcGhvcmUgaWRlbnRpZmllZCBieSBjb29raWUgIgorCQkJCSAgICJ2YWx1ZSAlIiBQUkl1MzIgIiAoMHgleCk6ICVzIiwKKwkJCQkgIGNvb2tpZSwgY29va2llLCBzdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3VkZXZfbm90aWZ5X3NlbV9pbmModWludDMyX3QgY29va2llLCBpbnQgc2VtaWQpCit7CisJc3RydWN0IHNlbWJ1ZiBzYiA9IHswLCAxLCAwfTsKKwlpbnQgdmFsOworCisJaWYgKHNlbW9wKHNlbWlkLCAmc2IsIDEpIDwgMCkgeworCQlsb2dfZXJyb3IoInNlbWlkICVkOiBzZW1vcCBmYWlsZWQgZm9yIGNvb2tpZSAweCUiIFBSSXgzMiAiOiAlcyIsCisJCQkgIHNlbWlkLCBjb29raWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworIAlpZiAoKHZhbCA9IHNlbWN0bChzZW1pZCwgMCwgR0VUVkFMKSkgPCAwKSB7CisJCWxvZ19lcnJvcigic2VtaWQgJWQ6IHNlbV9jdGwgR0VUVkFMIGZhaWxlZCBmb3IgIgorCQkJICAiY29va2llIDB4JSIgUFJJeDMyICI6ICVzIiwKKwkJCSAgc2VtaWQsIGNvb2tpZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CQkKKwl9CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiVWRldiBjb29raWUgMHglIiBQUkl4MzIgIiAoc2VtaWQgJWQpIGluY3JlbWVudGVkIHRvICVkIiwKKwkJICBjb29raWUsIHNlbWlkLCB2YWwpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3VkZXZfbm90aWZ5X3NlbV9kZWModWludDMyX3QgY29va2llLCBpbnQgc2VtaWQpCit7CisJc3RydWN0IHNlbWJ1ZiBzYiA9IHswLCAtMSwgSVBDX05PV0FJVH07CisJaW50IHZhbDsKKworIAlpZiAoKHZhbCA9IHNlbWN0bChzZW1pZCwgMCwgR0VUVkFMKSkgPCAwKSB7CisJCWxvZ19lcnJvcigic2VtaWQgJWQ6IHNlbV9jdGwgR0VUVkFMIGZhaWxlZCBmb3IgIgorCQkJICAiY29va2llIDB4JSIgUFJJeDMyICI6ICVzIiwKKwkJCSAgc2VtaWQsIGNvb2tpZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlbW9wKHNlbWlkLCAmc2IsIDEpIDwgMCkgeworCQlzd2l0Y2ggKGVycm5vKSB7CisJCQljYXNlIEVBR0FJTjoKKwkJCQlsb2dfZXJyb3IoInNlbWlkICVkOiBzZW1vcCBmYWlsZWQgZm9yIGNvb2tpZSAiCisJCQkJCSAgIjB4JSIgUFJJeDMyICI6ICIKKwkJCQkJICAiaW5jb3JyZWN0IHNlbWFwaG9yZSBzdGF0ZSIsCisJCQkJCSAgc2VtaWQsIGNvb2tpZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxvZ19lcnJvcigic2VtaWQgJWQ6IHNlbW9wIGZhaWxlZCBmb3IgY29va2llICIKKwkJCQkJICAiMHglIiBQUkl4MzIgIjogJXMiLAorCQkJCQkgIHNlbWlkLCBjb29raWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgY29va2llIDB4JSIgUFJJeDMyICIgKHNlbWlkICVkKSBkZWNyZW1lbnRlZCB0byAlZCIsCisJCQkgICAgIGNvb2tpZSwgc2VtaWQsIHZhbCAtIDEpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3VkZXZfbm90aWZ5X3NlbV9kZXN0cm95KHVpbnQzMl90IGNvb2tpZSwgaW50IHNlbWlkKQoreworCWlmIChzZW1jdGwoc2VtaWQsIDAsIElQQ19STUlELCAwKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgY2xlYW51cCBub3RpZmljYXRpb24gc2VtYXBob3JlICIKKwkJCSAgImlkZW50aWZpZWQgYnkgY29va2llIHZhbHVlICUiIFBSSXUzMiAiICgweCV4KTogJXMiLAorCQkJICBjb29raWUsIGNvb2tpZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgY29va2llIDB4JSIgUFJJeDMyICIgKHNlbWlkICVkKSBkZXN0cm95ZWQiLCBjb29raWUsCisJCQkgICAgIHNlbWlkKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF91ZGV2X25vdGlmeV9zZW1fY3JlYXRlKHVpbnQzMl90ICpjb29raWUsIGludCAqc2VtaWQpCit7CisJaW50IGZkOworCWludCBnZW5fc2VtaWQ7CisJaW50IHZhbDsKKwl1aW50MTZfdCBiYXNlX2Nvb2tpZTsKKwl1aW50MzJfdCBnZW5fY29va2llOworCXVuaW9uIHNlbXVuIHNlbV9hcmc7CisKKwlpZiAoKGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gb3BlbiAvZGV2L3VyYW5kb20gIgorCQkJICAidG8gY3JlYXRlIHJhbmRvbSBjb29raWUgdmFsdWUiKTsKKwkJKmNvb2tpZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIEdlbmVyYXRlIHJhbmRvbSBjb29raWUgdmFsdWUuIEJlIHN1cmUgaXQgaXMgdW5pcXVlIGFuZCBub24temVyby4gKi8KKwlkbyB7CisJCS8qIEZJWE1FIEhhbmRsZSBub24tZXJyb3IgcmV0dXJucyBmcm9tIHJlYWQoKS4gTW92ZSBfaW8oKSBpbnRvIGxpYmRtPyAqLworCQlpZiAocmVhZChmZCwgJmJhc2VfY29va2llLCBzaXplb2YoYmFzZV9jb29raWUpKSAhPSBzaXplb2YoYmFzZV9jb29raWUpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIG5vdGlmaWNhdGlvbiBjb29raWUiKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJZ2VuX2Nvb2tpZSA9IERNX0NPT0tJRV9NQUdJQyA8PCAxNiB8IGJhc2VfY29va2llOworCisJCWlmIChiYXNlX2Nvb2tpZSAmJiAoZ2VuX3NlbWlkID0gc2VtZ2V0KChrZXlfdCkgZ2VuX2Nvb2tpZSwKKwkJCQkgICAgMSwgMDYwMCB8IElQQ19DUkVBVCB8IElQQ19FWENMKSkgPCAwKSB7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFRVhJU1Q6CisJCQkJCS8qIGlmIHRoZSBzZW1hcGhvcmUga2V5IGV4aXN0cywgd2UKKwkJCQkJICogc2ltcGx5IGdlbmVyYXRlIGFub3RoZXIgcmFuZG9tIG9uZSAqLworCQkJCQliYXNlX2Nvb2tpZSA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRU5PTUVNOgorCQkJCQlsb2dfZXJyb3IoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSAiCisJCQkJCQkgICJub3RpZmljYXRpb24gc2VtYXBob3JlIik7CisJCQkJCWdvdG8gYmFkOworCQkJCWNhc2UgRU5PU1BDOgorCQkJCQlsb2dfZXJyb3IoIkxpbWl0IGZvciB0aGUgbWF4aW11bSBudW1iZXIgIgorCQkJCQkJICAib2Ygc2VtYXBob3JlcyByZWFjaGVkLiBZb3UgY2FuICIKKwkJCQkJCSAgImNoZWNrIGFuZCBzZXQgdGhlIGxpbWl0cyBpbiAiCisJCQkJCQkgICIvcHJvYy9zeXMva2VybmVsL3NlbS4iKTsKKwkJCQkJZ290byBiYWQ7CisJCQkJZGVmYXVsdDoKKwkJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIG5vdGlmaWNhdGlvbiAiCisJCQkJCQkgICJzZW1hcGhvcmU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKwl9IHdoaWxlICghYmFzZV9jb29raWUpOworCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgY29va2llIDB4JSIgUFJJeDMyICIgKHNlbWlkICVkKSBjcmVhdGVkIiwKKwkJCSAgICAgZ2VuX2Nvb2tpZSwgZ2VuX3NlbWlkKTsKKworCXNlbV9hcmcudmFsID0gMTsKKworCWlmIChzZW1jdGwoZ2VuX3NlbWlkLCAwLCBTRVRWQUwsIHNlbV9hcmcpIDwgMCkgeworCQlsb2dfZXJyb3IoInNlbWlkICVkOiBzZW1jdGwgZmFpbGVkOiAlcyIsIGdlbl9zZW1pZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogV2UgaGF2ZSB0byBkZXN0cm95IGp1c3QgY3JlYXRlZCBzZW1hcGhvcmUKKwkJICogc28gaXQgd29uJ3Qgc3RheSBpbiB0aGUgc3lzdGVtLiAqLworCQkodm9pZCkgX3VkZXZfbm90aWZ5X3NlbV9kZXN0cm95KGdlbl9jb29raWUsIGdlbl9zZW1pZCk7CisJCWdvdG8gYmFkOworCX0KKworIAlpZiAoKHZhbCA9IHNlbWN0bChnZW5fc2VtaWQsIDAsIEdFVFZBTCkpIDwgMCkgeworCQlsb2dfZXJyb3IoInNlbWlkICVkOiBzZW1fY3RsIEdFVFZBTCBmYWlsZWQgZm9yICIKKwkJCSAgImNvb2tpZSAweCUiIFBSSXgzMiAiOiAlcyIsCisJCQkgIGdlbl9zZW1pZCwgZ2VuX2Nvb2tpZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgY29va2llIDB4JSIgUFJJeDMyICIgKHNlbWlkICVkKSBpbmNyZW1lbnRlZCB0byAlZCIsCisJCQkgICAgIGdlbl9jb29raWUsIGdlbl9zZW1pZCwgdmFsKTsKKworCWlmIChjbG9zZShmZCkpCisJCXN0YWNrOworCisJKnNlbWlkID0gZ2VuX3NlbWlkOworCSpjb29raWUgPSBnZW5fY29va2llOworCisJcmV0dXJuIDE7CisKK2JhZDoKKwlpZiAoY2xvc2UoZmQpKQorCQlzdGFjazsKKworCSpjb29raWUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV91ZGV2X2NyZWF0ZV9jb29raWUodWludDMyX3QgKmNvb2tpZSkKK3sKKwlpbnQgc2VtaWQ7CisKKwlpZiAoIWRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpKSB7CisJCSpjb29raWUgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gX3VkZXZfbm90aWZ5X3NlbV9jcmVhdGUoY29va2llLCAmc2VtaWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX3Rhc2tfdHlwZV9kaXNwKGludCB0eXBlKQoreworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBETV9ERVZJQ0VfQ1JFQVRFOgorCQlyZXR1cm4gIkNSRUFURSI7CisgICAgICAgIGNhc2UgRE1fREVWSUNFX1JFTE9BRDoKKwkJcmV0dXJuICJSRUxPQUQiOworICAgICAgICBjYXNlIERNX0RFVklDRV9SRU1PVkU6CisJCXJldHVybiAiUkVNT1ZFIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfUkVNT1ZFX0FMTDoKKwkJcmV0dXJuICJSRU1PVkVfQUxMIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfU1VTUEVORDoKKwkJcmV0dXJuICJTVVNQRU5EIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfUkVTVU1FOgorCQlyZXR1cm4gIlJFU1VNRSI7CisgICAgICAgIGNhc2UgRE1fREVWSUNFX0lORk86CisJCXJldHVybiAiSU5GTyI7CisgICAgICAgIGNhc2UgRE1fREVWSUNFX0RFUFM6CisJCXJldHVybiAiREVQUyI7CisgICAgICAgIGNhc2UgRE1fREVWSUNFX1JFTkFNRToKKwkJcmV0dXJuICJSRU5BTUUiOworICAgICAgICBjYXNlIERNX0RFVklDRV9WRVJTSU9OOgorCQlyZXR1cm4gIlZFUlNJT04iOworICAgICAgICBjYXNlIERNX0RFVklDRV9TVEFUVVM6CisJCXJldHVybiAiU1RBVFVTIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfVEFCTEU6CisJCXJldHVybiAiVEFCTEUiOworICAgICAgICBjYXNlIERNX0RFVklDRV9XQUlURVZFTlQ6CisJCXJldHVybiAiV0FJVEVWRU5UIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfTElTVDoKKwkJcmV0dXJuICJMSVNUIjsKKyAgICAgICAgY2FzZSBETV9ERVZJQ0VfQ0xFQVI6CisJCXJldHVybiAiQ0xFQVIiOworICAgICAgICBjYXNlIERNX0RFVklDRV9NS05PREVTOgorCQlyZXR1cm4gIk1LTk9ERVMiOworICAgICAgICBjYXNlIERNX0RFVklDRV9MSVNUX1ZFUlNJT05TOgorCQlyZXR1cm4gIkxJU1RfVkVSU0lPTlMiOworICAgICAgICBjYXNlIERNX0RFVklDRV9UQVJHRVRfTVNHOgorCQlyZXR1cm4gIlRBUkdFVF9NU0ciOworICAgICAgICBjYXNlIERNX0RFVklDRV9TRVRfR0VPTUVUUlk6CisJCXJldHVybiAiU0VUX0dFT01FVFJZIjsKKwl9CisJcmV0dXJuICJ1bmtub3duIjsKK30KKworaW50IGRtX3Rhc2tfc2V0X2Nvb2tpZShzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCAqY29va2llLCB1aW50MTZfdCBmbGFncykKK3sKKwlpbnQgc2VtaWQ7CisKKwlfc2V0X2Nvb2tpZV9mbGFncyhkbXQsIGZsYWdzKTsKKworCWlmICghZG1fdWRldl9nZXRfc3luY19zdXBwb3J0KCkpIHsKKwkJKmNvb2tpZSA9IDA7CisJCWRtdC0+Y29va2llX3NldCA9IDE7CisJCXJldHVybiAxOworCX0KKworCWlmICgqY29va2llKSB7CisJCWlmICghX2dldF9jb29raWVfc2VtKCpjb29raWUsICZzZW1pZCkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgaWYgKCFfdWRldl9ub3RpZnlfc2VtX2NyZWF0ZShjb29raWUsICZzZW1pZCkpCisJCWdvdG9fYmFkOworCisJaWYgKCFfdWRldl9ub3RpZnlfc2VtX2luYygqY29va2llLCBzZW1pZCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3Qgc2V0IG5vdGlmaWNhdGlvbiBzZW1hcGhvcmUgIgorCQkJICAiaWRlbnRpZmllZCBieSBjb29raWUgdmFsdWUgJSIgUFJJdTMyICIgKDB4JXgpIiwKKwkJCSAgKmNvb2tpZSwgKmNvb2tpZSk7CisJCWdvdG8gYmFkOworCX0KKworCWRtdC0+ZXZlbnRfbnIgfD0gfkRNX1VERVZfRkxBR1NfTUFTSyAmICpjb29raWU7CisJZG10LT5jb29raWVfc2V0ID0gMTsKKworCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJVZGV2IGNvb2tpZSAweCUiIFBSSXgzMiAiIChzZW1pZCAlZCkgYXNzaWduZWQgdG8gIgorCQkJICAgICAiJXMgdGFzayglZCkgd2l0aCBmbGFncyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyAoMHglIiBQUkl4MTYgIikiLAorCQkJICAgICAqY29va2llLCBzZW1pZCwgX3Rhc2tfdHlwZV9kaXNwKGRtdC0+dHlwZSksIGRtdC0+dHlwZSwKKwkJCSAgICAgKGZsYWdzICYgRE1fVURFVl9ESVNBQkxFX0RNX1JVTEVTX0ZMQUcpID8gIiBESVNBQkxFX0RNX1JVTEVTIiA6ICIiLAorCQkJICAgICAoZmxhZ3MgJiBETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUcpID8gIiBESVNBQkxFX1NVQlNZU1RFTV9SVUxFUyIgOiAiIiwKKwkJCSAgICAgKGZsYWdzICYgRE1fVURFVl9ESVNBQkxFX0RJU0tfUlVMRVNfRkxBRykgPyAiIERJU0FCTEVfRElTS19SVUxFUyIgOiAiIiwKKwkJCSAgICAgKGZsYWdzICYgRE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUcpID8gIiBESVNBQkxFX09USEVSX1JVTEVTIiA6ICIiLAorCQkJICAgICAoZmxhZ3MgJiBETV9VREVWX0xPV19QUklPUklUWV9GTEFHKSA/ICIgTE9XX1BSSU9SSVRZIiA6ICIiLAorCQkJICAgICAoZmxhZ3MgJiBETV9VREVWX0RJU0FCTEVfTElCUkFSWV9GQUxMQkFDSykgPyAiIERJU0FCTEVfTElCUkFSWV9GQUxMQkFDSyIgOiAiIiwKKwkJCSAgICAgKGZsYWdzICYgRE1fVURFVl9QUklNQVJZX1NPVVJDRV9GTEFHKSA/ICIgUFJJTUFSWV9TT1VSQ0UiIDogIiIsCisJCQkgICAgIChmbGFncyAmIERNX1NVQlNZU1RFTV9VREVWX0ZMQUcwKSA/ICIgU1VCU1lTVEVNXzAiIDogIiAiLAorCQkJICAgICAoZmxhZ3MgJiBETV9TVUJTWVNURU1fVURFVl9GTEFHMSkgPyAiIFNVQlNZU1RFTV8xIiA6ICIgIiwKKwkJCSAgICAgKGZsYWdzICYgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzIpID8gIiBTVUJTWVNURU1fMiIgOiAiICIsCisJCQkgICAgIChmbGFncyAmIERNX1NVQlNZU1RFTV9VREVWX0ZMQUczKSA/ICIgU1VCU1lTVEVNXzMiIDogIiAiLAorCQkJICAgICAoZmxhZ3MgJiBETV9TVUJTWVNURU1fVURFVl9GTEFHNCkgPyAiIFNVQlNZU1RFTV80IiA6ICIgIiwKKwkJCSAgICAgKGZsYWdzICYgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzUpID8gIiBTVUJTWVNURU1fNSIgOiAiICIsCisJCQkgICAgIChmbGFncyAmIERNX1NVQlNZU1RFTV9VREVWX0ZMQUc2KSA/ICIgU1VCU1lTVEVNXzYiIDogIiAiLAorCQkJICAgICAoZmxhZ3MgJiBETV9TVUJTWVNURU1fVURFVl9GTEFHNykgPyAiIFNVQlNZU1RFTV83IiA6ICIgIiwKKwkJCSAgICAgZmxhZ3MpOworCisJcmV0dXJuIDE7CisKK2JhZDoKKwlkbXQtPmV2ZW50X25yID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3VkZXZfY29tcGxldGUodWludDMyX3QgY29va2llKQoreworCWludCBzZW1pZDsKKworCWlmICghY29va2llIHx8ICFkbV91ZGV2X2dldF9zeW5jX3N1cHBvcnQoKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIV9nZXRfY29va2llX3NlbShjb29raWUsICZzZW1pZCkpCisJCXJldHVybl8wOworCisJaWYgKCFfdWRldl9ub3RpZnlfc2VtX2RlYyhjb29raWUsIHNlbWlkKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBzaWduYWwgd2FpdGluZyBwcm9jZXNzIHVzaW5nIG5vdGlmaWNhdGlvbiAiCisJCQkgICJzZW1hcGhvcmUgaWRlbnRpZmllZCBieSBjb29raWUgdmFsdWUgJSIgUFJJdTMyICIgKDB4JXgpIiwKKwkJCSAgY29va2llLCBjb29raWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIElmICpub3dhaXQgaXMgc2V0LCByZXR1cm4gaW1tZWRpYXRlbHkgbGVhdmluZyBpdCBzZXQgaWYgdGhlIHNlbWFwaG9yZQorICogaXMgbm90IHJlYWR5IHRvIGJlIGRlY3JlbWVudGVkIHRvIDAuICAqbm93YWl0IGlzIGNsZWFyZWQgaWYgdGhlIHdhaXQKKyAqIHN1Y2NlZWRzLgorICovCitzdGF0aWMgaW50IF91ZGV2X3dhaXQodWludDMyX3QgY29va2llLCBpbnQgKm5vd2FpdCkKK3sKKwlpbnQgc2VtaWQ7CisJc3RydWN0IHNlbWJ1ZiBzYiA9IHswLCAwLCAwfTsKKwlpbnQgdmFsOworCisJaWYgKCFjb29raWUgfHwgIWRtX3VkZXZfZ2V0X3N5bmNfc3VwcG9ydCgpKQorCQlyZXR1cm4gMTsKKworCWlmICghX2dldF9jb29raWVfc2VtKGNvb2tpZSwgJnNlbWlkKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHNlbWFwaG9yZSB2YWx1ZSBleGNlZWRzIDE/ICovCisJaWYgKCpub3dhaXQpIHsKKwkJaWYgKCh2YWwgPSBzZW1jdGwoc2VtaWQsIDAsIEdFVFZBTCkpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJzZW1pZCAlZDogc2VtX2N0bCBHRVRWQUwgZmFpbGVkIGZvciAiCisJCQkJICAiY29va2llIDB4JSIgUFJJeDMyICI6ICVzIiwKKwkJCQkgIHNlbWlkLCBjb29raWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsJCQorCQl9CisKKwkJaWYgKHZhbCA+IDEpCisJCQlyZXR1cm4gMTsKKworCQkqbm93YWl0ID0gMDsKKwl9CisKKwlpZiAoIV91ZGV2X25vdGlmeV9zZW1fZGVjKGNvb2tpZSwgc2VtaWQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBhIHByb3BlciBzdGF0ZSBmb3Igbm90aWZpY2F0aW9uICIKKwkJCSAgInNlbWFwaG9yZSBpZGVudGlmaWVkIGJ5IGNvb2tpZSB2YWx1ZSAlIiBQUkl1MzIgIiAoMHgleCkgIgorCQkJICAidG8gaW5pdGlhbGl6ZSB3YWl0aW5nIGZvciBpbmNvbWluZyBub3RpZmljYXRpb25zLiIsCisJCQkgIGNvb2tpZSwgY29va2llKTsKKwkJKHZvaWQpIF91ZGV2X25vdGlmeV9zZW1fZGVzdHJveShjb29raWUsIHNlbWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlVkZXYgY29va2llIDB4JSIgUFJJeDMyICIgKHNlbWlkICVkKSB3YWl0aW5nIGZvciB6ZXJvIiwKKwkJCSAgICAgY29va2llLCBzZW1pZCk7CisKK3JlcGVhdF93YWl0OgorCWlmIChzZW1vcChzZW1pZCwgJnNiLCAxKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJZ290byByZXBlYXRfd2FpdDsKKwkJZWxzZSBpZiAoZXJybm8gPT0gRUlEUk0pCisJCQlyZXR1cm4gMTsKKworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBzZXQgd2FpdCBzdGF0ZSBmb3Igbm90aWZpY2F0aW9uIHNlbWFwaG9yZSAiCisJCQkgICJpZGVudGlmaWVkIGJ5IGNvb2tpZSB2YWx1ZSAlIiBQUkl1MzIgIiAoMHgleCk6ICVzIiwKKwkJCSAgY29va2llLCBjb29raWUsIHN0cmVycm9yKGVycm5vKSk7CisJCSh2b2lkKSBfdWRldl9ub3RpZnlfc2VtX2Rlc3Ryb3koY29va2llLCBzZW1pZCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfdWRldl9ub3RpZnlfc2VtX2Rlc3Ryb3koY29va2llLCBzZW1pZCk7Cit9CisKK2ludCBkbV91ZGV2X3dhaXQodWludDMyX3QgY29va2llKQoreworCWludCBub3dhaXQgPSAwOworCWludCByID0gX3VkZXZfd2FpdChjb29raWUsICZub3dhaXQpOworCisJdXBkYXRlX2RldnMoKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fdWRldl93YWl0X2ltbWVkaWF0ZSh1aW50MzJfdCBjb29raWUsIGludCAqcmVhZHkpCit7CisJaW50IG5vd2FpdCA9IDE7CisJaW50IHIgPSBfdWRldl93YWl0KGNvb2tpZSwgJm5vd2FpdCk7CisKKwlpZiAociAmJiBub3dhaXQpIHsKKwkJKnJlYWR5ID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJdXBkYXRlX2RldnMoKTsKKwkqcmVhZHkgPSAxOworCisJcmV0dXJuIHI7Cit9CisjZW5kaWYJCS8qIFVERVZfU1lOQ19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9saWJkbS9saWJkbS1jb21tb24uaCBiL2xpYmRtL2xpYmRtLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzE4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9saWJkbS1jb21tb24uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIExJQl9ETUNPTU1PTl9ICisjZGVmaW5lIExJQl9ETUNPTU1PTl9ICisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKworI2RlZmluZSBETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERV9FTlZfVkFSX05BTUUgIkRNX0RFRkFVTFRfTkFNRV9NQU5HTElOR19NT0RFIgorCisjZGVmaW5lIERFVl9OQU1FKGRtdCkgKGRtdC0+bWFuZ2xlZF9kZXZfbmFtZSA/IDogZG10LT5kZXZfbmFtZSkKKyNkZWZpbmUgREVWX1VVSUQoRE1UKSAoZG10LT5tYW5nbGVkX3V1aWQgPyA6IGRtdC0+dXVpZCkKKworaW50IG1hbmdsZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdHJfbmFtZSwgc2l6ZV90IGxlbiwKKwkJICBjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLCBkbV9zdHJpbmdfbWFuZ2xpbmdfdCBtb2RlKTsKKworaW50IHVubWFuZ2xlX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnN0cl9uYW1lLCBzaXplX3QgbGVuLAorCQkgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgZG1fc3RyaW5nX21hbmdsaW5nX3QgbW9kZSk7CisKK2ludCBjaGVja19tdWx0aXBsZV9tYW5nbGVkX3N0cmluZ19hbGxvd2VkKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3RyX25hbWUsCisJCQkJCSAgZG1fc3RyaW5nX21hbmdsaW5nX3QgbW9kZSk7CisKK3N0cnVjdCB0YXJnZXQgKmNyZWF0ZV90YXJnZXQodWludDY0X3Qgc3RhcnQsCisJCQkgICAgIHVpbnQ2NF90IGxlbiwKKwkJCSAgICAgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqcGFyYW1zKTsKKworaW50IGFkZF9kZXZfbm9kZShjb25zdCBjaGFyICpkZXZfbmFtZSwgdWludDMyX3QgbWlub3IsIHVpbnQzMl90IG1ham9yLAorCQkgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIG1vZGVfdCBtb2RlLCBpbnQgY2hlY2tfdWRldiwgdW5zaWduZWQgcmVseV9vbl91ZGV2KTsKK2ludCBybV9kZXZfbm9kZShjb25zdCBjaGFyICpkZXZfbmFtZSwgaW50IGNoZWNrX3VkZXYsIHVuc2lnbmVkIHJlbHlfb25fdWRldik7CitpbnQgcmVuYW1lX2Rldl9ub2RlKGNvbnN0IGNoYXIgKm9sZF9uYW1lLCBjb25zdCBjaGFyICpuZXdfbmFtZSwKKwkJICAgIGludCBjaGVja191ZGV2LCB1bnNpZ25lZCByZWx5X29uX3VkZXYpOworaW50IGdldF9kZXZfbm9kZV9yZWFkX2FoZWFkKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkgICAgdWludDMyX3QgKnJlYWRfYWhlYWQpOworaW50IHNldF9kZXZfbm9kZV9yZWFkX2FoZWFkKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQkgICAgdWludDMyX3QgcmVhZF9haGVhZCwgdWludDMyX3QgcmVhZF9haGVhZF9mbGFncyk7Cit2b2lkIHVwZGF0ZV9kZXZzKHZvaWQpOwordm9pZCBzZWxpbnV4X3JlbGVhc2Uodm9pZCk7CisKK3ZvaWQgaW5jX3N1c3BlbmRlZCh2b2lkKTsKK3ZvaWQgZGVjX3N1c3BlbmRlZCh2b2lkKTsKKworaW50IHBhcnNlX3RoaW5fcG9vbF9zdGF0dXMoY29uc3QgY2hhciAqcGFyYW1zLCBzdHJ1Y3QgZG1fc3RhdHVzX3RoaW5fcG9vbCAqcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZG0vbGliZG0tY29uZmlnLmMgYi9saWJkbS9saWJkbS1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I3YzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbGliZG0tY29uZmlnLmMKQEAgLTAsMCArMSwxNDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRtbGliLmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIFNFQ1RJT05fQl9DSEFSICd7JworI2RlZmluZSBTRUNUSU9OX0VfQ0hBUiAnfScKKworZW51bSB7CisJVE9LX0lOVCwKKwlUT0tfRkxPQVQsCisJVE9LX1NUUklORywJCS8qIFNpbmdsZSBxdW90ZXMgKi8KKwlUT0tfU1RSSU5HX0VTQ0FQRUQsCS8qIERvdWJsZSBxdW90ZXMgKi8KKwlUT0tfU1RSSU5HX0JBUkUsCS8qIE5vIHF1b3RlcyAqLworCVRPS19FUSwKKwlUT0tfU0VDVElPTl9CLAorCVRPS19TRUNUSU9OX0UsCisJVE9LX0FSUkFZX0IsCisJVE9LX0FSUkFZX0UsCisJVE9LX0lERU5USUZJRVIsCisJVE9LX0NPTU1BLAorCVRPS19FT0YKK307CisKK3N0cnVjdCBwYXJzZXIgeworCWNvbnN0IGNoYXIgKmZiLCAqZmU7CQkvKiBmaWxlIGxpbWl0cyAqLworCisJaW50IHQ7CQkJLyogdG9rZW4gbGltaXRzIGFuZCB0eXBlICovCisJY29uc3QgY2hhciAqdGIsICp0ZTsKKworCWludCBsaW5lOwkJLyogbGluZSBudW1iZXIgd2UgYXJlIG9uICovCisKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworfTsKKworc3RydWN0IGNvbmZpZ19vdXRwdXQgeworCXN0cnVjdCBkbV9wb29sICptZW07CisJZG1fcHV0bGluZV9mbiBwdXRsaW5lOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZV9vdXRfc3BlYyAqc3BlYzsKKwl2b2lkICpiYXRvbjsKK307CisKK3N0YXRpYyB2b2lkIF9nZXRfdG9rZW4oc3RydWN0IHBhcnNlciAqcCwgaW50IHRva19wcmV2KTsKK3N0YXRpYyB2b2lkIF9lYXRfc3BhY2Uoc3RydWN0IHBhcnNlciAqcCk7CitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfZmlsZShzdHJ1Y3QgcGFyc2VyICpwKTsKK3N0YXRpYyBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKl9zZWN0aW9uKHN0cnVjdCBwYXJzZXIgKnAsIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcGFyZW50KTsKK3N0YXRpYyBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpfdmFsdWUoc3RydWN0IHBhcnNlciAqcCk7CitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqX3R5cGUoc3RydWN0IHBhcnNlciAqcCk7CitzdGF0aWMgaW50IF9tYXRjaF9hdXgoc3RydWN0IHBhcnNlciAqcCwgaW50IHQpOworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKl9jcmVhdGVfdmFsdWUoc3RydWN0IGRtX3Bvb2wgKm1lbSk7CitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfY3JlYXRlX25vZGUoc3RydWN0IGRtX3Bvb2wgKm1lbSk7CitzdGF0aWMgY2hhciAqX2R1cF90b2soc3RydWN0IHBhcnNlciAqcCk7CitzdGF0aWMgY2hhciAqX2R1cF90b2tlbihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpiLCBjb25zdCBjaGFyICplKTsKKworc3RhdGljIGNvbnN0IGludCBzZXAgPSAnLyc7CisKKyNkZWZpbmUgTUFYX0lOREVOVCAzMgorCisjZGVmaW5lIG1hdGNoKHQpIGRvIHtcCisgICBpZiAoIV9tYXRjaF9hdXgocCwgKHQpKSkge1wKKwlsb2dfZXJyb3IoIlBhcnNlIGVycm9yIGF0IGJ5dGUgJSIgUFJJcHRyZGlmZl90ICIgKGxpbmUgJWQpOiB1bmV4cGVjdGVkIHRva2VuIiwgXAorCQkgIHAtPnRiIC0gcC0+ZmIgKyAxLCBwLT5saW5lKTsgXAorICAgICAgcmV0dXJuIDA7XAorICAgfSBcCit9IHdoaWxlKDApCisKK3N0YXRpYyBpbnQgX3Rva19tYXRjaChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmIsIGNvbnN0IGNoYXIgKmUpCit7CisJd2hpbGUgKCpzdHIgJiYgKGIgIT0gZSkpIHsKKwkJaWYgKCpzdHIrKyAhPSAqYisrKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuICEoKnN0ciB8fCAoYiAhPSBlKSk7Cit9CisKK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZG1fY29uZmlnX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0OworCXN0cnVjdCBkbV9wb29sICptZW0gPSBkbV9wb29sX2NyZWF0ZSgiY29uZmlnIiwgMTAgKiAxMDI0KTsKKworCWlmICghbWVtKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZyBwb29sLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShjZnQgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqY2Z0KSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZyB0cmVlLiIpOworCQlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwkJcmV0dXJuIDA7CisJfQorCWNmdC0+bWVtID0gbWVtOworCisJcmV0dXJuIGNmdDsKK30KKwordm9pZCBkbV9jb25maWdfc2V0X2N1c3RvbShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgdm9pZCAqY3VzdG9tKQoreworCWNmdC0+Y3VzdG9tID0gY3VzdG9tOworfQorCit2b2lkICpkbV9jb25maWdfZ2V0X2N1c3RvbShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCkKK3sKKwlyZXR1cm4gY2Z0LT5jdXN0b207Cit9CisKK3ZvaWQgZG1fY29uZmlnX2Rlc3Ryb3koc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJZG1fcG9vbF9kZXN0cm95KGNmdC0+bWVtKTsKK30KKworLyoKKyAqIElmIHRoZXJlJ3MgYSBjYXNjYWRlZCBkbV9jb25maWdfdHJlZSwgcmVtb3ZlIGFuZCByZXR1cm4gaXQsIG90aGVyd2lzZQorICogcmV0dXJuIE5VTEwuCisgKi8KK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZG1fY29uZmlnX3JlbW92ZV9jYXNjYWRlZF90cmVlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqc2Vjb25kX2NmdDsKKworCWlmICghY2Z0KQorCQlyZXR1cm4gTlVMTDsKKworCXNlY29uZF9jZnQgPSBjZnQtPmNhc2NhZGU7CisJY2Z0LT5jYXNjYWRlID0gTlVMTDsKKworCXJldHVybiBzZWNvbmRfY2Z0OworfQorCisvKgorICogV2hlbiBzZWFyY2hpbmcsIGZpcnN0X2NmdCBpcyBjaGVja2VkIGJlZm9yZSBzZWNvbmRfY2Z0LgorICovCitzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmRtX2NvbmZpZ19pbnNlcnRfY2FzY2FkZWRfdHJlZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmZpcnN0X2NmdCwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpzZWNvbmRfY2Z0KQoreworCWZpcnN0X2NmdC0+Y2FzY2FkZSA9IHNlY29uZF9jZnQ7CisKKwlyZXR1cm4gZmlyc3RfY2Z0OworfQorCitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfY29uZmlnX3JldmVyc2Uoc3RydWN0IGRtX2NvbmZpZ19ub2RlICpoZWFkKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbGVmdCA9IGhlYWQsICptaWRkbGUgPSBOVUxMLCAqcmlnaHQgPSBOVUxMOworCisJd2hpbGUgKGxlZnQpIHsKKwkJcmlnaHQgPSBtaWRkbGU7CisJCW1pZGRsZSA9IGxlZnQ7CisJCWxlZnQgPSBsZWZ0LT5zaWI7CisJCW1pZGRsZS0+c2liID0gcmlnaHQ7CisJCW1pZGRsZS0+Y2hpbGQgPSBfY29uZmlnX3JldmVyc2UobWlkZGxlLT5jaGlsZCk7CisJfQorCisJcmV0dXJuIG1pZGRsZTsKK30KKworaW50IGRtX2NvbmZpZ19wYXJzZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKwkvKiBUT0RPPyBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gMTsgKi8KKworCXN0cnVjdCBwYXJzZXIgKnA7CisJaWYgKCEocCA9IGRtX3Bvb2xfYWxsb2MoY2Z0LT5tZW0sIHNpemVvZigqcCkpKSkKKwkJcmV0dXJuXzA7CisKKwlwLT5tZW0gPSBjZnQtPm1lbTsKKwlwLT5mYiA9IHN0YXJ0OworCXAtPmZlID0gZW5kOworCXAtPnRiID0gcC0+dGUgPSBwLT5mYjsKKwlwLT5saW5lID0gMTsKKworCV9nZXRfdG9rZW4ocCwgVE9LX1NFQ1RJT05fRSk7CisJaWYgKCEoY2Z0LT5yb290ID0gX2ZpbGUocCkpKQorCQlyZXR1cm5fMDsKKworCWNmdC0+cm9vdCA9IF9jb25maWdfcmV2ZXJzZShjZnQtPnJvb3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbV9jb25maWdfdHJlZSAqZG1fY29uZmlnX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKmNvbmZpZ19zZXR0aW5ncykKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdDsKKworCWlmICghKGNmdCA9IGRtX2NvbmZpZ19jcmVhdGUoKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCFkbV9jb25maWdfcGFyc2UoY2Z0LCBjb25maWdfc2V0dGluZ3MsIGNvbmZpZ19zZXR0aW5ncyArIHN0cmxlbihjb25maWdfc2V0dGluZ3MpKSkgeworCQlkbV9jb25maWdfZGVzdHJveShjZnQpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlyZXR1cm4gY2Z0OworfQorCitzdGF0aWMgaW50IF9saW5lX3N0YXJ0KHN0cnVjdCBjb25maWdfb3V0cHV0ICpvdXQpCit7CisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChvdXQtPm1lbSwgMTI4KSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYmVnaW5fb2JqZWN0IGZhaWxlZCBmb3IgY29uZmlnIGxpbmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK19fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCitzdGF0aWMgaW50IF9saW5lX2FwcGVuZChzdHJ1Y3QgY29uZmlnX291dHB1dCAqb3V0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwljaGFyICpkeW5fYnVmID0gTlVMTDsKKwl2YV9saXN0IGFwOworCWludCBuOworCisJLyoKKwkgKiBXZSBzaG91bGQgYmUgZmluZSB3aXRoIHRoZSA0MDk2IGNoYXIgYnVmZmVyIDk5JSBvZiB0aGUgdGltZSwKKwkgKiBidXQgaWYgd2UgbmVlZCB0byBnbyBiZXlvbmQgdGhhdCwgYWxsb2NhdGUgdGhlIGJ1ZmZlciBkeW5hbWljYWxseS4KKwkgKi8KKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCW4gPSB2c25wcmludGYoJmJ1ZlswXSwgc2l6ZW9mIGJ1ZiAtIDEsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlpZiAobiA8IDApIHsKKwkJbG9nX2Vycm9yKCJ2c25wcmludGYgZmFpbGVkIGZvciBjb25maWcgbGluZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobiA+IChpbnQpIHNpemVvZiBidWYgLSAxKSB7CisJCS8qCisJCSAqIEZpeGVkIHNpemUgYnVmZmVyIHdpdGggc2l6ZW9mIGJ1ZiBpcyBub3QgZW5vdWdoLAorCQkgKiBzbyB0cnkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGJ1ZmZlciBub3cuLi4KKwkJICovCisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQluID0gZG1fdmFzcHJpbnRmKCZkeW5fYnVmLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKworCQlpZiAobiA8IDApIHsKKwkJCWxvZ19lcnJvcigiZG1fdmFzcHJpbnRmIGZhaWxlZCBmb3IgY29uZmlnIGxpbmUiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG91dC0+bWVtLCBkeW5fYnVmID8gOiBidWYsIDApKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQgZm9yIGNvbmZpZyBsaW5lIik7CisJCWRtX2ZyZWUoZHluX2J1Zik7CisJCXJldHVybiAwOworCX0KKworCWRtX2ZyZWUoZHluX2J1Zik7CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBsaW5lX2FwcGVuZChhcmdzLi4uKSBkbyB7aWYgKCFfbGluZV9hcHBlbmQob3V0LCBhcmdzKSkge3JldHVybl8wO319IHdoaWxlICgwKQorCitzdGF0aWMgaW50IF9saW5lX2VuZChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBzdHJ1Y3QgY29uZmlnX291dHB1dCAqb3V0KQoreworCWNvbnN0IGNoYXIgKmxpbmU7CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3Qob3V0LT5tZW0sICJcMCIsIDEpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQgZm9yIGNvbmZpZyBsaW5lIik7CisJCXJldHVybiAwOworCX0KKworCWxpbmUgPSBkbV9wb29sX2VuZF9vYmplY3Qob3V0LT5tZW0pOworCisJaWYgKCFvdXQtPnB1dGxpbmUgJiYgIW91dC0+c3BlYykKKwkJcmV0dXJuIDA7CisKKwlpZiAob3V0LT5wdXRsaW5lKQorCQlvdXQtPnB1dGxpbmUobGluZSwgb3V0LT5iYXRvbik7CisKKwlpZiAob3V0LT5zcGVjICYmIG91dC0+c3BlYy0+bGluZV9mbikKKwkJb3V0LT5zcGVjLT5saW5lX2ZuKGNuLCBsaW5lLCBvdXQtPmJhdG9uKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93cml0ZV92YWx1ZShzdHJ1Y3QgY29uZmlnX291dHB1dCAqb3V0LCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2KQoreworCWNoYXIgKmJ1ZjsKKwljb25zdCBjaGFyICpzOworCisJc3dpdGNoICh2LT50eXBlKSB7CisJY2FzZSBETV9DRkdfU1RSSU5HOgorCQlidWYgPSBhbGxvY2EoZG1fZXNjYXBlZF9sZW4odi0+di5zdHIpKTsKKwkJcyA9ICh2LT5mb3JtYXRfZmxhZ3MgJiBETV9DT05GSUdfVkFMVUVfRk1UX1NUUklOR19OT19RVU9URVMpID8gIiIgOiAiXCIiOworCQlsaW5lX2FwcGVuZCgiJXMlcyVzIiwgcywgZG1fZXNjYXBlX2RvdWJsZV9xdW90ZXMoYnVmLCB2LT52LnN0ciksIHMpOworCQlicmVhazsKKworCWNhc2UgRE1fQ0ZHX0ZMT0FUOgorCQlsaW5lX2FwcGVuZCgiJWYiLCB2LT52LmYpOworCQlicmVhazsKKworCWNhc2UgRE1fQ0ZHX0lOVDoKKwkJaWYgKHYtPmZvcm1hdF9mbGFncyAmIERNX0NPTkZJR19WQUxVRV9GTVRfSU5UX09DVEFMKQorCQkJbGluZV9hcHBlbmQoIjAlIiBQUklvNjQsIHYtPnYuaSk7CisJCWVsc2UKKwkJCWxpbmVfYXBwZW5kKEZNVGQ2NCwgdi0+di5pKTsKKwkJYnJlYWs7CisKKwljYXNlIERNX0NGR19FTVBUWV9BUlJBWToKKwkJcyA9ICh2LT5mb3JtYXRfZmxhZ3MgJiBETV9DT05GSUdfVkFMVUVfRk1UX0NPTU1PTl9FWFRSQV9TUEFDRVMpID8gIiAiIDogIiI7CisJCWxpbmVfYXBwZW5kKCJbJXNdIiwgcyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbG9nX2Vycm9yKCJfd3JpdGVfdmFsdWU6IFVua25vd24gdmFsdWUgdHlwZTogJWQiLCB2LT50eXBlKTsKKworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93cml0ZV9jb25maWcoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuLCBpbnQgb25seV9vbmUsCisJCQkgc3RydWN0IGNvbmZpZ19vdXRwdXQgKm91dCwgaW50IGxldmVsKQoreworCWNvbnN0IGNoYXIgKmV4dHJhX3NwYWNlOworCWludCBmb3JtYXRfYXJyYXk7CisJY2hhciBzcGFjZVtNQVhfSU5ERU5UICsgMV07CisJaW50IGwgPSAobGV2ZWwgPCBNQVhfSU5ERU5UKSA/IGxldmVsIDogTUFYX0lOREVOVDsKKwlpbnQgaTsKKwljaGFyICplc2NhcGVkX2tleSA9IE5VTEw7CisKKwlpZiAoIW4pCisJCXJldHVybiAxOworCisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwkJc3BhY2VbaV0gPSAnXHQnOworCXNwYWNlW2ldID0gJ1wwJzsKKworCWRvIHsKKwkJZXh0cmFfc3BhY2UgPSAobi0+diAmJiAobi0+di0+Zm9ybWF0X2ZsYWdzICYgRE1fQ09ORklHX1ZBTFVFX0ZNVF9DT01NT05fRVhUUkFfU1BBQ0VTKSkgPyAiICIgOiAiIjsKKwkJZm9ybWF0X2FycmF5ID0gKG4tPnYgJiYgKG4tPnYtPmZvcm1hdF9mbGFncyAmIERNX0NPTkZJR19WQUxVRV9GTVRfQ09NTU9OX0FSUkFZKSk7CisKKwkJaWYgKG91dC0+c3BlYyAmJiBvdXQtPnNwZWMtPnByZWZpeF9mbikKKwkJCW91dC0+c3BlYy0+cHJlZml4X2ZuKG4sIHNwYWNlLCBvdXQtPmJhdG9uKTsKKworCQlpZiAoIV9saW5lX3N0YXJ0KG91dCkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKHN0cmNocihuLT5rZXksICcjJykgfHwgc3RyY2hyKG4tPmtleSwgJyInKSB8fCBzdHJjaHIobi0+a2V5LCAnIScpKSB7CisJCQllc2NhcGVkX2tleSA9IGFsbG9jYShkbV9lc2NhcGVkX2xlbihuLT5rZXkpICsgMik7CisJCQkqZXNjYXBlZF9rZXkgPSAnIic7CisJCQlkbV9lc2NhcGVfZG91YmxlX3F1b3Rlcyhlc2NhcGVkX2tleSArIDEsIG4tPmtleSk7CisJCQlzdHJjYXQoZXNjYXBlZF9rZXksICJcIiIpOworCQl9CisJCWxpbmVfYXBwZW5kKCIlcyVzIiwgc3BhY2UsIGVzY2FwZWRfa2V5ID8gZXNjYXBlZF9rZXkgOiBuLT5rZXkpOworCQllc2NhcGVkX2tleSA9IE5VTEw7CisJCWlmICghbi0+dikgeworCQkJLyogaXQncyBhIHN1YiBzZWN0aW9uICovCisJCQlsaW5lX2FwcGVuZCgiIHsiKTsKKwkJCWlmICghX2xpbmVfZW5kKG4sIG91dCkpCisJCQkJcmV0dXJuXzA7CisJCQlpZiAoIV93cml0ZV9jb25maWcobi0+Y2hpbGQsIDAsIG91dCwgbGV2ZWwgKyAxKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmICghX2xpbmVfc3RhcnQob3V0KSkKKwkJCQlyZXR1cm5fMDsKKwkJCWxpbmVfYXBwZW5kKCIlc30iLCBzcGFjZSk7CisJCX0gZWxzZSB7CisJCQkvKiBpdCdzIGEgdmFsdWUgKi8KKwkJCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnYgPSBuLT52OworCQkJbGluZV9hcHBlbmQoIiVzPSVzIiwgZXh0cmFfc3BhY2UsIGV4dHJhX3NwYWNlKTsKKwkJCWlmICh2LT5uZXh0KSB7CisJCQkJbGluZV9hcHBlbmQoIlslcyIsIGV4dHJhX3NwYWNlKTsKKwkJCQl3aGlsZSAodiAmJiB2LT50eXBlICE9IERNX0NGR19FTVBUWV9BUlJBWSkgeworCQkJCQlpZiAoIV93cml0ZV92YWx1ZShvdXQsIHYpKQorCQkJCQkJcmV0dXJuXzA7CisJCQkJCXYgPSB2LT5uZXh0OworCQkJCQlpZiAodiAmJiB2LT50eXBlICE9IERNX0NGR19FTVBUWV9BUlJBWSkKKwkJCQkJCWxpbmVfYXBwZW5kKCIsJXMiLCBleHRyYV9zcGFjZSk7CisJCQkJfQorCQkJCWxpbmVfYXBwZW5kKCIlc10iLCBleHRyYV9zcGFjZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChmb3JtYXRfYXJyYXkgJiYgKHYtPnR5cGUgIT0gRE1fQ0ZHX0VNUFRZX0FSUkFZKSkKKwkJCQkJbGluZV9hcHBlbmQoIlslcyIsIGV4dHJhX3NwYWNlKTsKKwkJCQlpZiAoIV93cml0ZV92YWx1ZShvdXQsIHYpKQorCQkJCQlyZXR1cm5fMDsKKwkJCQlpZiAoZm9ybWF0X2FycmF5ICYmICh2LT50eXBlICE9IERNX0NGR19FTVBUWV9BUlJBWSkpCisJCQkJCWxpbmVfYXBwZW5kKCIlc10iLCBleHRyYV9zcGFjZSk7CisJCQl9CisJCX0KKwkJaWYgKCFfbGluZV9lbmQobiwgb3V0KSkKKwkJCXJldHVybl8wOworCisJCWlmIChvdXQtPnNwZWMgJiYgb3V0LT5zcGVjLT5zdWZmaXhfZm4pCisJCQlvdXQtPnNwZWMtPnN1ZmZpeF9mbihuLCBzcGFjZSwgb3V0LT5iYXRvbik7CisKKwkJbiA9IG4tPnNpYjsKKwl9IHdoaWxlIChuICYmICFvbmx5X29uZSk7CisJLyogRklYTUU6IGFkZCBlcnJvciBjaGVja2luZyAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93cml0ZV9ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGludCBvbmx5X29uZSwKKwkJICAgICAgIGRtX3B1dGxpbmVfZm4gcHV0bGluZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZV9vdXRfc3BlYyAqb3V0X3NwZWMsCisJCSAgICAgICB2b2lkICpiYXRvbikKK3sKKwlzdHJ1Y3QgY29uZmlnX291dHB1dCBvdXQgPSB7CisJCS5tZW0gPSBkbV9wb29sX2NyZWF0ZSgiY29uZmlnX291dHB1dCIsIDEwMjQpLAorCQkucHV0bGluZSA9IHB1dGxpbmUsCisJCS5zcGVjID0gb3V0X3NwZWMsCisJCS5iYXRvbiA9IGJhdG9uCisJfTsKKworCWlmICghb3V0Lm1lbSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV93cml0ZV9jb25maWcoY24sIG9ubHlfb25lLCAmb3V0LCAwKSkgeworCQlkbV9wb29sX2Rlc3Ryb3kob3V0Lm1lbSk7CisJCXJldHVybl8wOworCX0KKwlkbV9wb29sX2Rlc3Ryb3kob3V0Lm1lbSk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9jb25maWdfd3JpdGVfb25lX25vZGUoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgZG1fcHV0bGluZV9mbiBwdXRsaW5lLCB2b2lkICpiYXRvbikKK3sKKwlyZXR1cm4gX3dyaXRlX25vZGUoY24sIDEsIHB1dGxpbmUsIE5VTEwsIGJhdG9uKTsKK30KKworaW50IGRtX2NvbmZpZ193cml0ZV9ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGRtX3B1dGxpbmVfZm4gcHV0bGluZSwgdm9pZCAqYmF0b24pCit7CisJcmV0dXJuIF93cml0ZV9ub2RlKGNuLCAwLCBwdXRsaW5lLCBOVUxMLCBiYXRvbik7Cit9CisKK2ludCBkbV9jb25maWdfd3JpdGVfb25lX25vZGVfb3V0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisJCQkJIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZV9vdXRfc3BlYyAqb3V0X3NwZWMsCisJCQkJIHZvaWQgKmJhdG9uKQoreworCXJldHVybiBfd3JpdGVfbm9kZShjbiwgMSwgTlVMTCwgb3V0X3NwZWMsIGJhdG9uKTsKK30KKworaW50IGRtX2NvbmZpZ193cml0ZV9ub2RlX291dChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGVfb3V0X3NwZWMgKm91dF9zcGVjLAorCQkJICAgICB2b2lkICpiYXRvbikKK3sKKwlyZXR1cm4gX3dyaXRlX25vZGUoY24sIDAsIE5VTEwsIG91dF9zcGVjLCBiYXRvbik7Cit9CisKKy8qCisgKiBwYXJzZXIKKyAqLworc3RhdGljIGNoYXIgKl9kdXBfc3RyaW5nX3RvayhzdHJ1Y3QgcGFyc2VyICpwKQoreworCWNoYXIgKnN0cjsKKworCXAtPnRiKyssIHAtPnRlLS07CS8qIHN0cmlwICIncyAqLworCisJaWYgKHAtPnRlIDwgcC0+dGIpIHsKKwkJbG9nX2Vycm9yKCJQYXJzZSBlcnJvciBhdCBieXRlICUiIFBSSXB0cmRpZmZfdCAiIChsaW5lICVkKTogIgorCQkJICAiZXhwZWN0ZWQgYSBzdHJpbmcgdG9rZW4uIiwKKwkJCSAgcC0+dGIgLSBwLT5mYiArIDEsIHAtPmxpbmUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShzdHIgPSBfZHVwX3RvayhwKSkpCisJCXJldHVybl9OVUxMOworCisJcC0+dGUrKzsKKworCXJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKl9maWxlKHN0cnVjdCBwYXJzZXIgKnApCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlIHJvb3QgPSB7IDAgfTsKKwlyb290LmtleSA9ICI8cm9vdD4iOworCisJd2hpbGUgKHAtPnQgIT0gVE9LX0VPRikKKwkJaWYgKCFfc2VjdGlvbihwLCAmcm9vdCkpCisJCQlyZXR1cm5fTlVMTDsKKwlyZXR1cm4gcm9vdC5jaGlsZDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqX21ha2Vfbm9kZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkgY29uc3QgY2hhciAqa2V5X2IsIGNvbnN0IGNoYXIgKmtleV9lLAorCQkJCQkgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuOworCisJaWYgKCEobiA9IF9jcmVhdGVfbm9kZShtZW0pKSkKKwkJcmV0dXJuX05VTEw7CisKKwluLT5rZXkgPSBfZHVwX3Rva2VuKG1lbSwga2V5X2IsIGtleV9lKTsKKwlpZiAocGFyZW50KSB7CisJCW4tPnBhcmVudCA9IHBhcmVudDsKKwkJbi0+c2liID0gcGFyZW50LT5jaGlsZDsKKwkJcGFyZW50LT5jaGlsZCA9IG47CisJfQorCXJldHVybiBuOworfQorCisvKiB3aGVuIG1lbSBpcyBub3QgTlVMTCwgd2UgY3JlYXRlIHRoZSBwYXRoIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0ICovCitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfZmluZF9vcl9tYWtlX25vZGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkJCSBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwKKwkJCQkJCSBjb25zdCBjaGFyICpwYXRoKQoreworCWNvbnN0IGNoYXIgKmU7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiA9IHBhcmVudCA/IHBhcmVudC0+Y2hpbGQgOiBOVUxMOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY25fZm91bmQgPSBOVUxMOworCisJd2hpbGUgKGNuIHx8IG1lbSkgeworCQkvKiB0cmltIGFueSBsZWFkaW5nIHNsYXNoZXMgKi8KKwkJd2hpbGUgKCpwYXRoICYmICgqcGF0aCA9PSBzZXApKQorCQkJcGF0aCsrOworCisJCS8qIGZpbmQgdGhlIGVuZCBvZiB0aGlzIHNlZ21lbnQgKi8KKwkJZm9yIChlID0gcGF0aDsgKmUgJiYgKCplICE9IHNlcCk7IGUrKykgOworCisJCS8qIGh1bnQgZm9yIHRoZSBub2RlICovCisJCWNuX2ZvdW5kID0gTlVMTDsKKworCQl3aGlsZSAoY24pIHsKKwkJCWlmIChfdG9rX21hdGNoKGNuLT5rZXksIHBhdGgsIGUpKSB7CisJCQkJLyogSW5lZmZpY2llbnQgKi8KKwkJCQlpZiAoIWNuX2ZvdW5kKQorCQkJCQljbl9mb3VuZCA9IGNuOworCQkJCWVsc2UKKwkJCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGR1cGxpY2F0ZSIKKwkJCQkJCSAiIGNvbmZpZyBub2RlOiAlcyAoIgorCQkJCQkJICJzZWVraW5nICVzKSIsIGNuLT5rZXksIHBhdGgpOworCQkJfQorCisJCQljbiA9IGNuLT5zaWI7CisJCX0KKworCQlpZiAoIWNuX2ZvdW5kICYmIG1lbSkgeworCQkJaWYgKCEoY25fZm91bmQgPSBfbWFrZV9ub2RlKG1lbSwgcGF0aCwgZSwgcGFyZW50KSkpCisJCQkJcmV0dXJuX05VTEw7CisJCX0KKworCQlpZiAoY25fZm91bmQgJiYgKmUpIHsKKwkJCXBhcmVudCA9IGNuX2ZvdW5kOworCQkJY24gPSBjbl9mb3VuZC0+Y2hpbGQ7CisJCX0gZWxzZQorCQkJcmV0dXJuIGNuX2ZvdW5kOworCQlwYXRoID0gZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfbm9kZSAqX3NlY3Rpb24oc3RydWN0IHBhcnNlciAqcCwgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwYXJlbnQpCit7CisJLyogSURFTlRJRklFUiBTRUNUSU9OX0JfQ0hBUiBWQUxVRSogU0VDVElPTl9FX0NIQVIgKi8KKworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqcm9vdDsKKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2YWx1ZTsKKwljaGFyICpzdHI7CisKKwlpZiAocC0+dCA9PSBUT0tfU1RSSU5HX0VTQ0FQRUQpIHsKKwkJaWYgKCEoc3RyID0gX2R1cF9zdHJpbmdfdG9rKHApKSkKKwkJCXJldHVybl9OVUxMOworCQlkbV91bmVzY2FwZV9kb3VibGVfcXVvdGVzKHN0cik7CisKKwkJbWF0Y2goVE9LX1NUUklOR19FU0NBUEVEKTsKKwl9IGVsc2UgaWYgKHAtPnQgPT0gVE9LX1NUUklORykgeworCQlpZiAoIShzdHIgPSBfZHVwX3N0cmluZ190b2socCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJbWF0Y2goVE9LX1NUUklORyk7CisJfSBlbHNlIHsKKwkJaWYgKCEoc3RyID0gX2R1cF90b2socCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJbWF0Y2goVE9LX0lERU5USUZJRVIpOworCX0KKworCWlmICghc3RybGVuKHN0cikpIHsKKwkJbG9nX2Vycm9yKCJQYXJzZSBlcnJvciBhdCBieXRlICUiIFBSSXB0cmRpZmZfdCAiIChsaW5lICVkKTogZW1wdHkgc2VjdGlvbiBpZGVudGlmaWVyIiwKKwkJCSAgcC0+dGIgLSBwLT5mYiArIDEsIHAtPmxpbmUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShyb290ID0gX2ZpbmRfb3JfbWFrZV9ub2RlKHAtPm1lbSwgcGFyZW50LCBzdHIpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlpZiAocC0+dCA9PSBUT0tfU0VDVElPTl9CKSB7CisJCW1hdGNoKFRPS19TRUNUSU9OX0IpOworCQl3aGlsZSAocC0+dCAhPSBUT0tfU0VDVElPTl9FKSB7CisJCQlpZiAoIShfc2VjdGlvbihwLCByb290KSkpCisJCQkJcmV0dXJuX05VTEw7CisJCX0KKwkJbWF0Y2goVE9LX1NFQ1RJT05fRSk7CisJfSBlbHNlIHsKKwkJbWF0Y2goVE9LX0VRKTsKKwkJaWYgKCEodmFsdWUgPSBfdmFsdWUocCkpKQorCQkJcmV0dXJuX05VTEw7CisJCWlmIChyb290LT52KQorCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGR1cGxpY2F0ZSIKKwkJCQkgIiBjb25maWcgdmFsdWU6ICVzIiwgc3RyKTsKKwkJcm9vdC0+diA9IHZhbHVlOworCX0KKworCXJldHVybiByb290OworfQorCitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqX3ZhbHVlKHN0cnVjdCBwYXJzZXIgKnApCit7CisJLyogJ1snIFRZUEUqICddJyB8IFRZUEUgKi8KKwlzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpoID0gTlVMTCwgKmwsICpsbCA9IE5VTEw7CisJaWYgKHAtPnQgPT0gVE9LX0FSUkFZX0IpIHsKKwkJbWF0Y2goVE9LX0FSUkFZX0IpOworCQl3aGlsZSAocC0+dCAhPSBUT0tfQVJSQVlfRSkgeworCQkJaWYgKCEobCA9IF90eXBlKHApKSkKKwkJCQlyZXR1cm5fTlVMTDsKKworCQkJaWYgKCFoKQorCQkJCWggPSBsOworCQkJZWxzZQorCQkJCWxsLT5uZXh0ID0gbDsKKwkJCWxsID0gbDsKKworCQkJaWYgKHAtPnQgPT0gVE9LX0NPTU1BKQorCQkJCW1hdGNoKFRPS19DT01NQSk7CisJCX0KKwkJbWF0Y2goVE9LX0FSUkFZX0UpOworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgZm9yIGFuIGVtcHR5IGFycmF5LgorCQkgKi8KKwkJaWYgKCFoKSB7CisJCQlpZiAoIShoID0gX2NyZWF0ZV92YWx1ZShwLT5tZW0pKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHZhbHVlIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWgtPnR5cGUgPSBETV9DRkdfRU1QVFlfQVJSQVk7CisJCX0KKworCX0gZWxzZQorCQlpZiAoIShoID0gX3R5cGUocCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gaDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKl90eXBlKHN0cnVjdCBwYXJzZXIgKnApCit7CisJLyogWystXXswLDF9WzAtOV0rIHwgWzAtOV0qXC5bMC05XSogfCAiLioiICovCisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdiA9IF9jcmVhdGVfdmFsdWUocC0+bWVtKTsKKwljaGFyICpzdHI7CisKKwlpZiAoIXYpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgdHlwZSB2YWx1ZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzd2l0Y2ggKHAtPnQpIHsKKwljYXNlIFRPS19JTlQ6CisJCXYtPnR5cGUgPSBETV9DRkdfSU5UOworCQl2LT52LmkgPSBzdHJ0b2xsKHAtPnRiLCBOVUxMLCAwKTsJLyogRklYTUU6IGNoZWNrIGVycm9yICovCisJCW1hdGNoKFRPS19JTlQpOworCQlicmVhazsKKworCWNhc2UgVE9LX0ZMT0FUOgorCQl2LT50eXBlID0gRE1fQ0ZHX0ZMT0FUOworCQl2LT52LmYgPSBzdHJ0b2QocC0+dGIsIE5VTEwpOwkvKiBGSVhNRTogY2hlY2sgZXJyb3IgKi8KKwkJbWF0Y2goVE9LX0ZMT0FUKTsKKwkJYnJlYWs7CisKKwljYXNlIFRPS19TVFJJTkc6CisJCXYtPnR5cGUgPSBETV9DRkdfU1RSSU5HOworCisJCWlmICghKHYtPnYuc3RyID0gX2R1cF9zdHJpbmdfdG9rKHApKSkKKwkJCXJldHVybl9OVUxMOworCisJCW1hdGNoKFRPS19TVFJJTkcpOworCQlicmVhazsKKworCWNhc2UgVE9LX1NUUklOR19CQVJFOgorCQl2LT50eXBlID0gRE1fQ0ZHX1NUUklORzsKKworCQlpZiAoISh2LT52LnN0ciA9IF9kdXBfdG9rKHApKSkKKwkJCXJldHVybl9OVUxMOworCisJCW1hdGNoKFRPS19TVFJJTkdfQkFSRSk7CisJCWJyZWFrOworCisJY2FzZSBUT0tfU1RSSU5HX0VTQ0FQRUQ6CisJCXYtPnR5cGUgPSBETV9DRkdfU1RSSU5HOworCisJCWlmICghKHN0ciA9IF9kdXBfc3RyaW5nX3RvayhwKSkpCisJCQlyZXR1cm5fTlVMTDsKKwkJZG1fdW5lc2NhcGVfZG91YmxlX3F1b3RlcyhzdHIpOworCQl2LT52LnN0ciA9IHN0cjsKKwkJbWF0Y2goVE9LX1NUUklOR19FU0NBUEVEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlBhcnNlIGVycm9yIGF0IGJ5dGUgJSIgUFJJcHRyZGlmZl90ICIgKGxpbmUgJWQpOiBleHBlY3RlZCBhIHZhbHVlIiwKKwkJCSAgcC0+dGIgLSBwLT5mYiArIDEsIHAtPmxpbmUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgX21hdGNoX2F1eChzdHJ1Y3QgcGFyc2VyICpwLCBpbnQgdCkKK3sKKwlpZiAocC0+dCAhPSB0KQorCQlyZXR1cm4gMDsKKworCV9nZXRfdG9rZW4ocCwgdCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiB0b2tlbmlzZXIKKyAqLworc3RhdGljIHZvaWQgX2dldF90b2tlbihzdHJ1Y3QgcGFyc2VyICpwLCBpbnQgdG9rX3ByZXYpCit7CisJaW50IHZhbHVlc19hbGxvd2VkID0gMDsKKworCWNvbnN0IGNoYXIgKnRlOworCisJcC0+dGIgPSBwLT50ZTsKKwlfZWF0X3NwYWNlKHApOworCWlmIChwLT50YiA9PSBwLT5mZSB8fCAhKnAtPnRiKSB7CisJCXAtPnQgPSBUT0tfRU9GOworCQlyZXR1cm47CisJfQorCisJLyogU2hvdWxkIG5leHQgdG9rZW4gYmUgaW50ZXJwcmV0ZWQgYXMgdmFsdWUgaW5zdGVhZCBvZiBpZGVudGlmaWVyPyAqLworCWlmICh0b2tfcHJldiA9PSBUT0tfRVEgfHwgdG9rX3ByZXYgPT0gVE9LX0FSUkFZX0IgfHwKKwkgICAgdG9rX3ByZXYgPT0gVE9LX0NPTU1BKQorCQl2YWx1ZXNfYWxsb3dlZCA9IDE7CisKKwlwLT50ID0gVE9LX0lOVDsJCS8qIGZ1ZGdlIHNvIHRoZSBmYWxsIHRocm91Z2ggZm9yCisJCQkJICAgZmxvYXRzIHdvcmtzICovCisKKwl0ZSA9IHAtPnRlOworCXN3aXRjaCAoKnRlKSB7CisJY2FzZSBTRUNUSU9OX0JfQ0hBUjoKKwkJcC0+dCA9IFRPS19TRUNUSU9OX0I7CisJCXRlKys7CisJCWJyZWFrOworCisJY2FzZSBTRUNUSU9OX0VfQ0hBUjoKKwkJcC0+dCA9IFRPS19TRUNUSU9OX0U7CisJCXRlKys7CisJCWJyZWFrOworCisJY2FzZSAnWyc6CisJCXAtPnQgPSBUT0tfQVJSQVlfQjsKKwkJdGUrKzsKKwkJYnJlYWs7CisKKwljYXNlICddJzoKKwkJcC0+dCA9IFRPS19BUlJBWV9FOworCQl0ZSsrOworCQlicmVhazsKKworCWNhc2UgJywnOgorCQlwLT50ID0gVE9LX0NPTU1BOworCQl0ZSsrOworCQlicmVhazsKKworCWNhc2UgJz0nOgorCQlwLT50ID0gVE9LX0VROworCQl0ZSsrOworCQlicmVhazsKKworCWNhc2UgJyInOgorCQlwLT50ID0gVE9LX1NUUklOR19FU0NBUEVEOworCQl0ZSsrOworCQl3aGlsZSAoKHRlICE9IHAtPmZlKSAmJiAoKnRlKSAmJiAoKnRlICE9ICciJykpIHsKKwkJCWlmICgoKnRlID09ICdcXCcpICYmICh0ZSArIDEgIT0gcC0+ZmUpICYmCisJCQkgICAgKih0ZSArIDEpKQorCQkJCXRlKys7CisJCQl0ZSsrOworCQl9CisKKwkJaWYgKCh0ZSAhPSBwLT5mZSkgJiYgKCp0ZSkpCisJCQl0ZSsrOworCQlicmVhazsKKworCWNhc2UgJ1wnJzoKKwkJcC0+dCA9IFRPS19TVFJJTkc7CisJCXRlKys7CisJCXdoaWxlICgodGUgIT0gcC0+ZmUpICYmICgqdGUpICYmICgqdGUgIT0gJ1wnJykpCisJCQl0ZSsrOworCisJCWlmICgodGUgIT0gcC0+ZmUpICYmICgqdGUpKQorCQkJdGUrKzsKKwkJYnJlYWs7CisKKwljYXNlICcuJzoKKwkJcC0+dCA9IFRPS19GTE9BVDsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJY2FzZSAnKyc6CisJY2FzZSAnLSc6CisJCWlmICh2YWx1ZXNfYWxsb3dlZCkgeworCQkJd2hpbGUgKCsrdGUgIT0gcC0+ZmUpIHsKKwkJCQlpZiAoIWlzZGlnaXQoKGludCkgKnRlKSkgeworCQkJCQlpZiAoKnRlID09ICcuJykgeworCQkJCQkJaWYgKHAtPnQgIT0gVE9LX0ZMT0FUKSB7CisJCQkJCQkJcC0+dCA9IFRPS19GTE9BVDsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCXAtPnQgPSBUT0tfSURFTlRJRklFUjsKKwkJd2hpbGUgKCh0ZSAhPSBwLT5mZSkgJiYgKCp0ZSkgJiYgIWlzc3BhY2UoKnRlKSAmJgorCQkgICAgICAgKCp0ZSAhPSAnIycpICYmICgqdGUgIT0gJz0nKSAmJgorCQkgICAgICAgKCp0ZSAhPSBTRUNUSU9OX0JfQ0hBUikgJiYKKwkJICAgICAgICgqdGUgIT0gU0VDVElPTl9FX0NIQVIpKQorCQkJdGUrKzsKKwkJaWYgKHZhbHVlc19hbGxvd2VkKQorCQkJcC0+dCA9IFRPS19TVFJJTkdfQkFSRTsKKwkJYnJlYWs7CisJfQorCisJcC0+dGUgPSB0ZTsKK30KKworc3RhdGljIHZvaWQgX2VhdF9zcGFjZShzdHJ1Y3QgcGFyc2VyICpwKQoreworCXdoaWxlIChwLT50YiAhPSBwLT5mZSkgeworCQlpZiAoKnAtPnRlID09ICcjJykKKwkJCXdoaWxlICgocC0+dGUgIT0gcC0+ZmUpICYmICgqcC0+dGUgIT0gJ1xuJykgJiYgKCpwLT50ZSkpCisJCQkJKytwLT50ZTsKKworCQllbHNlIGlmICghaXNzcGFjZSgqcC0+dGUpKQorCQkJYnJlYWs7CisKKwkJd2hpbGUgKChwLT50ZSAhPSBwLT5mZSkgJiYgaXNzcGFjZSgqcC0+dGUpKSB7CisJCQlpZiAoKnAtPnRlID09ICdcbicpCisJCQkJKytwLT5saW5lOworCQkJKytwLT50ZTsKKwkJfQorCisJCXAtPnRiID0gcC0+dGU7CisJfQorfQorCisvKgorICogbWVtb3J5IG1hbmFnZW1lbnQKKyAqLworc3RhdGljIHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKl9jcmVhdGVfdmFsdWUoc3RydWN0IGRtX3Bvb2wgKm1lbSkKK3sKKwlyZXR1cm4gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGRtX2NvbmZpZ192YWx1ZSkpOworfQorCitzdGF0aWMgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfY3JlYXRlX25vZGUoc3RydWN0IGRtX3Bvb2wgKm1lbSkKK3sKKwlyZXR1cm4gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGRtX2NvbmZpZ19ub2RlKSk7Cit9CisKK3N0YXRpYyBjaGFyICpfZHVwX3Rva2VuKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKmIsIGNvbnN0IGNoYXIgKmUpCit7CisJc2l6ZV90IGxlbiA9IGUgLSBiOworCWNoYXIgKnN0ciA9IGRtX3Bvb2xfYWxsb2MobWVtLCBsZW4gKyAxKTsKKwlpZiAoIXN0cikgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgdG9rZW4uIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoc3RyLCBiLCBsZW4pOworCXN0cltsZW5dID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqX2R1cF90b2soc3RydWN0IHBhcnNlciAqcCkKK3sKKwlyZXR1cm4gX2R1cF90b2tlbihwLT5tZW0sIHAtPnRiLCBwLT50ZSk7Cit9CisKKy8qCisgKiBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qCisgKiBub2RlX2xvb2t1cF9mbiBpcyBlaXRoZXI6CisgKiAgIF9maW5kX2NvbmZpZ19ub2RlIHRvIHBlcmZvcm0gYSBsb29rdXAgc3RhcnRpbmcgZnJvbSBhIGdpdmVuIGNvbmZpZ19ub2RlIAorICogICBpbiBhIGNvbmZpZ190cmVlOworICogb3IKKyAqICAgX2ZpbmRfZmlyc3RfY29uZmlnX25vZGUgdG8gZmluZCB0aGUgZmlyc3QgY29uZmlnX25vZGUgaW4gYSBzZXQgb2YgCisgKiAgIGNhc2NhZGVkIHRyZWVzLgorICovCit0eXBlZGVmIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbm9kZV9sb29rdXBfZm4oY29uc3Qgdm9pZCAqc3RhcnQsIGNvbnN0IGNoYXIgKnBhdGgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpfZmluZF9jb25maWdfbm9kZShjb25zdCB2b2lkICpzdGFydCwgY29uc3QgY2hhciAqcGF0aCkgeworCXN0cnVjdCBkbV9jb25maWdfbm9kZSBkdW1teSA9IHsgLmNoaWxkID0gKHZvaWQgKikgc3RhcnQgfTsKKwlyZXR1cm4gX2ZpbmRfb3JfbWFrZV9ub2RlKE5VTEwsICZkdW1teSwgcGF0aCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKl9maW5kX2ZpcnN0X2NvbmZpZ19ub2RlKGNvbnN0IHZvaWQgKnN0YXJ0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0ID0gc3RhcnQ7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiA9IE5VTEw7CisKKwl3aGlsZSAoY2Z0KSB7CisJCWlmICgoY24gPSBfZmluZF9jb25maWdfbm9kZShjZnQtPnJvb3QsIHBhdGgpKSkKKwkJCXJldHVybiBjbjsKKwkJY2Z0ID0gY2Z0LT5jYXNjYWRlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2ZpbmRfY29uZmlnX3N0cihjb25zdCB2b2lkICpzdGFydCwgbm9kZV9sb29rdXBfZm4gZmluZF9mbiwKKwkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmFpbCwgaW50IGFsbG93X2VtcHR5KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbiA9IGZpbmRfZm4oc3RhcnQsIHBhdGgpOworCisJLyogRW1wdHkgc3RyaW5ncyBhcmUgaWdub3JlZCBpZiBhbGxvd19lbXB0eSBpcyBzZXQgKi8KKwlpZiAobiAmJiBuLT52KSB7CisJCWlmICgobi0+di0+dHlwZSA9PSBETV9DRkdfU1RSSU5HKSAmJgorCQkgICAgKGFsbG93X2VtcHR5IHx8ICgqbi0+di0+di5zdHIpKSkgeworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiU2V0dGluZyAlcyB0byAlcyIsIHBhdGgsIG4tPnYtPnYuc3RyKTsKKwkJCXJldHVybiBuLT52LT52LnN0cjsKKwkJfQorCQlpZiAoKG4tPnYtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykgfHwgKCFhbGxvd19lbXB0eSAmJiBmYWlsKSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyB1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgJXMuIiwgcGF0aCk7CisJfQorCisJaWYgKGZhaWwpCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIG5vdCBmb3VuZCBpbiBjb25maWc6IGRlZmF1bHRpbmcgdG8gJXMiLAorCQkJCSBwYXRoLCBmYWlsKTsKKwlyZXR1cm4gZmFpbDsKK30KKworY29uc3QgY2hhciAqZG1fY29uZmlnX2ZpbmRfc3RyKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sCisJCQkgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmFpbCkKK3sKKwlyZXR1cm4gX2ZpbmRfY29uZmlnX3N0cihjbiwgX2ZpbmRfY29uZmlnX25vZGUsIHBhdGgsIGZhaWwsIDApOworfQorCitjb25zdCBjaGFyICpkbV9jb25maWdfZmluZF9zdHJfYWxsb3dfZW1wdHkoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwKKwkJCQkJICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmFpbCkKK3sKKwlyZXR1cm4gX2ZpbmRfY29uZmlnX3N0cihjbiwgX2ZpbmRfY29uZmlnX25vZGUsIHBhdGgsIGZhaWwsIDEpOworfQorCitzdGF0aWMgaW50NjRfdCBfZmluZF9jb25maWdfaW50NjQoY29uc3Qgdm9pZCAqc3RhcnQsIG5vZGVfbG9va3VwX2ZuIGZpbmQsCisJCQkJICBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGZhaWwpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuID0gZmluZChzdGFydCwgcGF0aCk7CisKKwlpZiAobiAmJiBuLT52ICYmIG4tPnYtPnR5cGUgPT0gRE1fQ0ZHX0lOVCkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nICVzIHRvICUiIFBSSWQ2NCwgcGF0aCwgbi0+di0+di5pKTsKKwkJcmV0dXJuIG4tPnYtPnYuaTsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCIlcyBub3QgZm91bmQgaW4gY29uZmlnOiBkZWZhdWx0aW5nIHRvICUiIFBSSWQ2NCwKKwkJCSBwYXRoLCBmYWlsKTsKKwlyZXR1cm4gZmFpbDsKK30KKworc3RhdGljIGZsb2F0IF9maW5kX2NvbmZpZ19mbG9hdChjb25zdCB2b2lkICpzdGFydCwgbm9kZV9sb29rdXBfZm4gZmluZCwKKwkJCQljb25zdCBjaGFyICpwYXRoLCBmbG9hdCBmYWlsKQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbiA9IGZpbmQoc3RhcnQsIHBhdGgpOworCisJaWYgKG4gJiYgbi0+diAmJiBuLT52LT50eXBlID09IERNX0NGR19GTE9BVCkgeworCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nICVzIHRvICVmIiwgcGF0aCwgbi0+di0+di5mKTsKKwkJcmV0dXJuIG4tPnYtPnYuZjsKKwl9CisKKwlsb2dfdmVyeV92ZXJib3NlKCIlcyBub3QgZm91bmQgaW4gY29uZmlnOiBkZWZhdWx0aW5nIHRvICVmIiwKKwkJCSBwYXRoLCBmYWlsKTsKKworCXJldHVybiBmYWlsOworCit9CisKK3N0YXRpYyBpbnQgX3N0cl9pbl9hcnJheShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKiBjb25zdCB2YWx1ZXNbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHZhbHVlc1tpXTsgaSsrKQorCQlpZiAoIXN0cmNhc2VjbXAoc3RyLCB2YWx1ZXNbaV0pKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc3RyX3RvX2Jvb2woY29uc3QgY2hhciAqc3RyLCBpbnQgZmFpbCkKK3sKKwljb25zdCBjaGFyICogY29uc3QgX3RydWVfdmFsdWVzW10gID0geyAieSIsICJ5ZXMiLCAib24iLCAidHJ1ZSIsIE5VTEwgfTsKKwljb25zdCBjaGFyICogY29uc3QgX2ZhbHNlX3ZhbHVlc1tdID0geyAibiIsICJubyIsICJvZmYiLCAiZmFsc2UiLCBOVUxMIH07CisKKwlpZiAoX3N0cl9pbl9hcnJheShzdHIsIF90cnVlX3ZhbHVlcykpCisJCXJldHVybiAxOworCisJaWYgKF9zdHJfaW5fYXJyYXkoc3RyLCBfZmFsc2VfdmFsdWVzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmFpbDsKK30KKworc3RhdGljIGludCBfZmluZF9jb25maWdfYm9vbChjb25zdCB2b2lkICpzdGFydCwgbm9kZV9sb29rdXBfZm4gZmluZCwKKwkJCSAgICAgY29uc3QgY2hhciAqcGF0aCwgaW50IGZhaWwpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuID0gZmluZChzdGFydCwgcGF0aCk7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdjsKKwlpbnQgYjsKKworCWlmIChuKSB7CisJCXYgPSBuLT52OworCisJCXN3aXRjaCAodi0+dHlwZSkgeworCQljYXNlIERNX0NGR19JTlQ6CisJCQliID0gdi0+di5pID8gMSA6IDA7CisJCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nICVzIHRvICVkIiwgcGF0aCwgYik7CisJCQlyZXR1cm4gYjsKKworCQljYXNlIERNX0NGR19TVFJJTkc6CisJCQliID0gX3N0cl90b19ib29sKHYtPnYuc3RyLCBmYWlsKTsKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIlNldHRpbmcgJXMgdG8gJWQiLCBwYXRoLCBiKTsKKwkJCXJldHVybiBiOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorCisJbG9nX3ZlcnlfdmVyYm9zZSgiJXMgbm90IGZvdW5kIGluIGNvbmZpZzogZGVmYXVsdGluZyB0byAlZCIsCisJCQkgcGF0aCwgZmFpbCk7CisKKwlyZXR1cm4gZmFpbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBub2RlLWJhc2VkIGxvb2t1cAorICoqLworCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19maW5kX25vZGUoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwKKwkJCQkJICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBkbV9jb25maWdfbm9kZSAqKSBfZmluZF9jb25maWdfbm9kZShjbiwgcGF0aCk7Cit9CisKK2ludCBkbV9jb25maWdfZmluZF9pbnQoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZhaWwpCit7CisJLyogRklYTUUgQWRkIGxvZ19lcnJvciBtZXNzYWdlIG9uIG92ZXJmbG93ICovCisJcmV0dXJuIChpbnQpIF9maW5kX2NvbmZpZ19pbnQ2NChjbiwgX2ZpbmRfY29uZmlnX25vZGUsIHBhdGgsIChpbnQ2NF90KSBmYWlsKTsKK30KKworaW50NjRfdCBkbV9jb25maWdfZmluZF9pbnQ2NChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGZhaWwpCit7CisJcmV0dXJuIF9maW5kX2NvbmZpZ19pbnQ2NChjbiwgX2ZpbmRfY29uZmlnX25vZGUsIHBhdGgsIGZhaWwpOworfQorCitmbG9hdCBkbV9jb25maWdfZmluZF9mbG9hdChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgZmxvYXQgZmFpbCkKK3sKKwlyZXR1cm4gX2ZpbmRfY29uZmlnX2Zsb2F0KGNuLCBfZmluZF9jb25maWdfbm9kZSwgcGF0aCwgZmFpbCk7Cit9CisKK2ludCBkbV9jb25maWdfZmluZF9ib29sKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmYWlsKQoreworCXJldHVybiBfZmluZF9jb25maWdfYm9vbChjbiwgX2ZpbmRfY29uZmlnX25vZGUsIHBhdGgsIGZhaWwpOworfQorCitpbnQgZG1fY29uZmlnX3ZhbHVlX2lzX2Jvb2woY29uc3Qgc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqdikgeworCWlmICghdikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2godi0+dHlwZSkgeworCQljYXNlIERNX0NGR19JTlQ6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBETV9DRkdfU1RSSU5HOgorCQkJcmV0dXJuIF9zdHJfdG9fYm9vbCh2LT52LnN0ciwgLTEpICE9IC0xOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRyZWUtYmFzZWQgbG9va3VwCisgKiovCisKK2NvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqZG1fY29uZmlnX3RyZWVfZmluZF9ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LAorCQkJCQkJICAgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4gX2ZpbmRfZmlyc3RfY29uZmlnX25vZGUoY2Z0LCBwYXRoKTsKK30KKworY29uc3QgY2hhciAqZG1fY29uZmlnX3RyZWVfZmluZF9zdHIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJICAgIGNvbnN0IGNoYXIgKmZhaWwpCit7CisJcmV0dXJuIF9maW5kX2NvbmZpZ19zdHIoY2Z0LCBfZmluZF9maXJzdF9jb25maWdfbm9kZSwgcGF0aCwgZmFpbCwgMCk7Cit9CisKK2NvbnN0IGNoYXIgKmRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyX2FsbG93X2VtcHR5KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLAorCQkJCQkJY29uc3QgY2hhciAqZmFpbCkKK3sKKwlyZXR1cm4gX2ZpbmRfY29uZmlnX3N0cihjZnQsIF9maW5kX2ZpcnN0X2NvbmZpZ19ub2RlLCBwYXRoLCBmYWlsLCAxKTsKK30KKworaW50IGRtX2NvbmZpZ190cmVlX2ZpbmRfaW50KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgZmFpbCkKK3sKKwkvKiBGSVhNRSBBZGQgbG9nX2Vycm9yIG1lc3NhZ2Ugb24gb3ZlcmZsb3cgKi8KKwlyZXR1cm4gKGludCkgX2ZpbmRfY29uZmlnX2ludDY0KGNmdCwgX2ZpbmRfZmlyc3RfY29uZmlnX25vZGUsIHBhdGgsIChpbnQ2NF90KSBmYWlsKTsKK30KKworaW50NjRfdCBkbV9jb25maWdfdHJlZV9maW5kX2ludDY0KGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBjaGFyICpwYXRoLCBpbnQ2NF90IGZhaWwpCit7CisJcmV0dXJuIF9maW5kX2NvbmZpZ19pbnQ2NChjZnQsIF9maW5kX2ZpcnN0X2NvbmZpZ19ub2RlLCBwYXRoLCBmYWlsKTsKK30KKworZmxvYXQgZG1fY29uZmlnX3RyZWVfZmluZF9mbG9hdChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqcGF0aCwKKwkJCQlmbG9hdCBmYWlsKQoreworCXJldHVybiBfZmluZF9jb25maWdfZmxvYXQoY2Z0LCBfZmluZF9maXJzdF9jb25maWdfbm9kZSwgcGF0aCwgZmFpbCk7Cit9CisKK2ludCBkbV9jb25maWdfdHJlZV9maW5kX2Jvb2woY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmYWlsKQoreworCXJldHVybiBfZmluZF9jb25maWdfYm9vbChjZnQsIF9maW5kX2ZpcnN0X2NvbmZpZ19ub2RlLCBwYXRoLCBmYWlsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbnQgZG1fY29uZmlnX2dldF91aW50MzIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwKKwkJCSB1aW50MzJfdCAqcmVzdWx0KQoreworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbjsKKworCW4gPSBfZmluZF9jb25maWdfbm9kZShjbiwgcGF0aCk7CisKKwlpZiAoIW4gfHwgIW4tPnYgfHwgbi0+di0+dHlwZSAhPSBETV9DRkdfSU5UKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXN1bHQpCisJCSpyZXN1bHQgPSBuLT52LT52Lmk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9jb25maWdfZ2V0X3VpbnQ2NChjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBjb25zdCBjaGFyICpwYXRoLAorCQkJIHVpbnQ2NF90ICpyZXN1bHQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuOworCisJbiA9IF9maW5kX2NvbmZpZ19ub2RlKGNuLCBwYXRoKTsKKworCWlmICghbiB8fCAhbi0+diB8fCBuLT52LT50eXBlICE9IERNX0NGR19JTlQpCisJCXJldHVybiAwOworCisJaWYgKHJlc3VsdCkKKwkJKnJlc3VsdCA9ICh1aW50NjRfdCkgbi0+di0+di5pOworCXJldHVybiAxOworfQorCitpbnQgZG1fY29uZmlnX2dldF9zdHIoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwKKwkJICAgICAgY29uc3QgY2hhciAqKnJlc3VsdCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm47CisKKwluID0gX2ZpbmRfY29uZmlnX25vZGUoY24sIHBhdGgpOworCisJaWYgKCFuIHx8ICFuLT52IHx8IG4tPnYtPnR5cGUgIT0gRE1fQ0ZHX1NUUklORykKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVzdWx0KQorCQkqcmVzdWx0ID0gbi0+di0+di5zdHI7CisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9jb25maWdfZ2V0X2xpc3QoY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbiwgY29uc3QgY2hhciAqcGF0aCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKipyZXN1bHQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpuOworCisJbiA9IF9maW5kX2NvbmZpZ19ub2RlKGNuLCBwYXRoKTsKKwkvKiBUT0RPIHdoZW4gd2UgcmVwcmVzZW50IHNpbmdsZS1pdGVtIGxpc3RzIGNvbnNpc3RlbnRseSwgYWRkIGEgY2hlY2sKKwkgKiBmb3Igbi0+di0+bmV4dCAhPSBOVUxMICovCisJaWYgKCFuIHx8ICFuLT52KQorCQlyZXR1cm4gMDsKKworCWlmIChyZXN1bHQpCisJCSpyZXN1bHQgPSBuLT52OworCXJldHVybiAxOworfQorCitpbnQgZG1fY29uZmlnX2dldF9zZWN0aW9uKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqKnJlc3VsdCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm47CisKKwluID0gX2ZpbmRfY29uZmlnX25vZGUoY24sIHBhdGgpOworCWlmICghbiB8fCBuLT52KQorCQlyZXR1cm4gMDsKKworCWlmIChyZXN1bHQpCisJCSpyZXN1bHQgPSBuOworCXJldHVybiAxOworfQorCitpbnQgZG1fY29uZmlnX2hhc19ub2RlKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIF9maW5kX2NvbmZpZ19ub2RlKGNuLCBwYXRoKSA/IDEgOiAwOworfQorCisvKgorICogQ29udmVydCBhIHRva2VuIHR5cGUgdG8gdGhlIGNoYXIgaXQgcmVwcmVzZW50cy4KKyAqLworc3RhdGljIGNoYXIgX3Rva2VuX3R5cGVfdG9fY2hhcihpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBUT0tfU0VDVElPTl9COgorCQkJcmV0dXJuIFNFQ1RJT05fQl9DSEFSOworCQljYXNlIFRPS19TRUNUSU9OX0U6CisJCQlyZXR1cm4gU0VDVElPTl9FX0NIQVI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm5zOgorICogICMgb2YgJ3R5cGUnIHRva2VucyBpbiAnc3RyJy4KKyAqLworc3RhdGljIHVuc2lnbmVkIF9jb3VudF90b2tlbnMoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4sIGludCB0eXBlKQoreworCWNoYXIgYzsKKworCWMgPSBfdG9rZW5fdHlwZV90b19jaGFyKHR5cGUpOworCisJcmV0dXJuIGRtX2NvdW50X2NoYXJzKHN0ciwgbGVuLCBjKTsKK30KKworY29uc3QgY2hhciAqZG1fY29uZmlnX3BhcmVudF9uYW1lKGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqbikKK3sKKwlyZXR1cm4gKG4tPnBhcmVudCA/IG4tPnBhcmVudC0+a2V5IDogIihyb290KSIpOworfQorLyoKKyAqIEhldXJpc3RpYyBmdW5jdGlvbiB0byBtYWtlIGEgcXVpY2sgZ3Vlc3MgYXMgdG8gd2hldGhlciBhIHRleHQKKyAqIHJlZ2lvbiBwcm9iYWJseSBjb250YWlucyBhIHZhbGlkIGNvbmZpZyAic2VjdGlvbiIuICAoVXNlZnVsIGZvcgorICogc2Nhbm5pbmcgYXJlYXMgb2YgdGhlIGRpc2sgZm9yIG9sZCBtZXRhZGF0YS4pCisgKiBDb25maWcgc2VjdGlvbnMgY29udGFpbiB2YXJpb3VzIHRva2VucywgbWF5IGNvbnRhaW4gb3RoZXIgc2VjdGlvbnMKKyAqIGFuZCBzdHJpbmdzLCBhbmQgYXJlIGRlbGltaXRlZCBieSBiZWdpbiAodHlwZSAnVE9LX1NFQ1RJT05fQicpIGFuZAorICogZW5kICh0eXBlICdUT0tfU0VDVElPTl9FJykgdG9rZW5zLiAgQXMgYSBxdWljayBoZXVyaXN0aWMsIHdlIGp1c3QKKyAqIGNvdW50IHRoZSBudW1iZXIgb2YgYmVnaW4gYW5kIGVuZCB0b2tlbnMsIGFuZCBzZWUgaWYgdGhleSBhcmUKKyAqIG5vbi16ZXJvIGFuZCB0aGUgY291bnRzIG1hdGNoLgorICogRnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBkb25lIHdpdGggYW5vdGhlciBmdW5jdGlvbgorICogKGZvciBleGFtcGxlLCByZWFkX2NvbmZpZ19mZCkuCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gcHJvYmFibHkgaXMgbm90IGEgdmFsaWQgY29uZmlnIHNlY3Rpb24KKyAqICAxIC0gcHJvYmFibHkgX2lzXyBhIHZhbGlkIGNvbmZpZyBzZWN0aW9uCisgKi8KK3Vuc2lnbmVkIGRtX2NvbmZpZ19tYXliZV9zZWN0aW9uKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbGVuKQoreworCWludCBiZWdpbl9jb3VudDsKKwlpbnQgZW5kX2NvdW50OworCisJYmVnaW5fY291bnQgPSBfY291bnRfdG9rZW5zKHN0ciwgbGVuLCBUT0tfU0VDVElPTl9CKTsKKwllbmRfY291bnQgPSBfY291bnRfdG9rZW5zKHN0ciwgbGVuLCBUT0tfU0VDVElPTl9FKTsKKworCWlmIChiZWdpbl9jb3VudCAmJiBlbmRfY291bnQgJiYgKGJlZ2luX2NvdW50ID09IGVuZF9jb3VudCkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK19fYXR0cmlidXRlX18oKG5vbm51bGwoMSwgMikpKQorc3RhdGljIHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKl9jbG9uZV9jb25maWdfdmFsdWUoc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkJCSAgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnYpCit7CisJc3RydWN0IGRtX2NvbmZpZ192YWx1ZSAqbmV3X2N2OworCisJaWYgKCEobmV3X2N2ID0gX2NyZWF0ZV92YWx1ZShtZW0pKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbG9uZSBjb25maWcgdmFsdWUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5ld19jdi0+dHlwZSA9IHYtPnR5cGU7CisJaWYgKHYtPnR5cGUgPT0gRE1fQ0ZHX1NUUklORykgeworCQlpZiAoIShuZXdfY3YtPnYuc3RyID0gZG1fcG9vbF9zdHJkdXAobWVtLCB2LT52LnN0cikpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbG9uZSBjb25maWcgc3RyaW5nIHZhbHVlLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJbmV3X2N2LT52ID0gdi0+djsKKworCWlmICh2LT5uZXh0ICYmICEobmV3X2N2LT5uZXh0ID0gX2Nsb25lX2NvbmZpZ192YWx1ZShtZW0sIHYtPm5leHQpKSkKKwkJcmV0dXJuX05VTEw7CisKKwlyZXR1cm4gbmV3X2N2OworfQorCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19jbG9uZV9ub2RlX3dpdGhfbWVtKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqY24sIGludCBzaWJsaW5ncykKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm5ld19jbjsKKworCWlmICghY24pIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY2xvbmUgTlVMTCBjb25maWcgbm9kZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobmV3X2NuID0gX2NyZWF0ZV9ub2RlKG1lbSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNsb25lIGNvbmZpZyBub2RlLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKGNuLT5rZXkgJiYgIShuZXdfY24tPmtleSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgY24tPmtleSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbG9uZSBjb25maWcgbm9kZSBrZXkuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5ld19jbi0+aWQgPSBjbi0+aWQ7CisKKwlpZiAoKGNuLT52ICYmICEobmV3X2NuLT52ID0gX2Nsb25lX2NvbmZpZ192YWx1ZShtZW0sIGNuLT52KSkpIHx8CisJICAgIChjbi0+Y2hpbGQgJiYgIShuZXdfY24tPmNoaWxkID0gZG1fY29uZmlnX2Nsb25lX25vZGVfd2l0aF9tZW0obWVtLCBjbi0+Y2hpbGQsIDEpKSkgfHwKKwkgICAgKHNpYmxpbmdzICYmIGNuLT5zaWIgJiYgIShuZXdfY24tPnNpYiA9IGRtX2NvbmZpZ19jbG9uZV9ub2RlX3dpdGhfbWVtKG1lbSwgY24tPnNpYiwgc2libGluZ3MpKSkpCisJCXJldHVybl9OVUxMOyAvKiAnbmV3X2NuJyByZWxlYXNlZCB3aXRoIG1lbSBwb29sICovCisKKwlyZXR1cm4gbmV3X2NuOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19jbG9uZV9ub2RlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0LCBjb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm5vZGUsIGludCBzaWIpCit7CisJcmV0dXJuIGRtX2NvbmZpZ19jbG9uZV9ub2RlX3dpdGhfbWVtKGNmdC0+bWVtLCBub2RlLCBzaWIpOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmRtX2NvbmZpZ19jcmVhdGVfbm9kZShzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwgY29uc3QgY2hhciAqa2V5KQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisKKwlpZiAoIShjbiA9IF9jcmVhdGVfbm9kZShjZnQtPm1lbSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjb25maWcgbm9kZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKGNuLT5rZXkgPSBkbV9wb29sX3N0cmR1cChjZnQtPm1lbSwga2V5KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNvbmZpZyBub2RlJ3Mga2V5LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY24tPnBhcmVudCA9IE5VTEw7CisJY24tPnYgPSBOVUxMOworCisJcmV0dXJuIGNuOworfQorCitzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpkbV9jb25maWdfY3JlYXRlX3ZhbHVlKHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCXJldHVybiBfY3JlYXRlX3ZhbHVlKGNmdC0+bWVtKTsKK30KKwordm9pZCBkbV9jb25maWdfdmFsdWVfc2V0X2Zvcm1hdF9mbGFncyhzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdiwgdWludDMyX3QgZm9ybWF0X2ZsYWdzKQoreworCWlmICghY3YpCisJCXJldHVybjsKKworCWN2LT5mb3JtYXRfZmxhZ3MgPSBmb3JtYXRfZmxhZ3M7Cit9CisKK3VpbnQzMl90IGRtX2NvbmZpZ192YWx1ZV9nZXRfZm9ybWF0X2ZsYWdzKHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2KQoreworCWlmICghY3YpCisJCXJldHVybiAwOworCisJcmV0dXJuIGN2LT5mb3JtYXRfZmxhZ3M7Cit9CisKK3N0cnVjdCBkbV9wb29sICpkbV9jb25maWdfbWVtb3J5KHN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0KQoreworCXJldHVybiBjZnQtPm1lbTsKK30KKworc3RhdGljIGludCBfb3ZlcnJpZGVfcGF0aChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKm5vZGUsIHZvaWQgKmJhdG9uKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqY2Z0ID0gYmF0b247CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlIGR1bW15LCAqdGFyZ2V0OworCWR1bW15LmNoaWxkID0gY2Z0LT5yb290OworCWlmICghKHRhcmdldCA9IF9maW5kX29yX21ha2Vfbm9kZShjZnQtPm1lbSwgJmR1bW15LCBwYXRoKSkpCisJCXJldHVybl8wOworCWlmICghKHRhcmdldC0+diA9IF9jbG9uZV9jb25maWdfdmFsdWUoY2Z0LT5tZW0sIG5vZGUtPnYpKSkKKwkJcmV0dXJuXzA7CisJY2Z0LT5yb290ID0gZHVtbXkuY2hpbGQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2VudW1lcmF0ZShjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuLCBpbnQgKCpjYikoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKiwgdm9pZCAqKSwgdm9pZCAqYmF0b24pCit7CisJY2hhciAqc3ViID0gTlVMTDsKKworCXdoaWxlIChjbikgeworCQlpZiAoZG1fYXNwcmludGYoJnN1YiwgIiVzLyVzIiwgcGF0aCwgY24tPmtleSkgPCAwKQorCQkJcmV0dXJuXzA7CisJCWlmIChjbi0+Y2hpbGQpIHsKKwkJCWlmICghX2VudW1lcmF0ZShzdWIsIGNuLT5jaGlsZCwgY2IsIGJhdG9uKSkKKwkJCQlnb3RvX2JhZDsKKwkJfSBlbHNlCisJCQlpZiAoIWNiKHN1YiwgY24sIGJhdG9uKSkKKwkJCQlnb3RvX2JhZDsKKwkJZG1fZnJlZShzdWIpOworCQljbiA9IGNuLT5zaWI7CisJfQorCXJldHVybiAxOworYmFkOgorCWRtX2ZyZWUoc3ViKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRtX2NvbmZpZ190cmVlICpkbV9jb25maWdfZmxhdHRlbihzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnJlcyA9IGRtX2NvbmZpZ19jcmVhdGUoKSwgKmRvbmUgPSBOVUxMLCAqY3VycmVudCA9IE5VTEw7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuX05VTEw7CisKKwl3aGlsZSAoZG9uZSAhPSBjZnQpIHsKKwkJY3VycmVudCA9IGNmdDsKKwkJd2hpbGUgKGN1cnJlbnQtPmNhc2NhZGUgIT0gZG9uZSkKKwkJCWN1cnJlbnQgPSBjdXJyZW50LT5jYXNjYWRlOworCQlfZW51bWVyYXRlKCIiLCBjdXJyZW50LT5yb290LCBfb3ZlcnJpZGVfcGF0aCwgcmVzKTsKKwkJZG9uZSA9IGN1cnJlbnQ7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworaW50IGRtX2NvbmZpZ19yZW1vdmVfbm9kZShzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKnBhcmVudCwgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpyZW1fbm9kZSkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuID0gcGFyZW50LT5jaGlsZCwgKmxhc3QgPSBOVUxMOworCXdoaWxlIChjbikgeworCQlpZiAoY24gPT0gcmVtX25vZGUpIHsKKwkJCWlmIChsYXN0KQorCQkJCWxhc3QtPnNpYiA9IGNuLT5zaWI7CisJCQllbHNlCisJCQkJcGFyZW50LT5jaGlsZCA9IGNuLT5zaWI7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlsYXN0ID0gY247CisJCWNuID0gY24tPnNpYjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9saWJkbS1kZXB0cmVlLmMgYi9saWJkbS9saWJkbS1kZXB0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0YmI5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2xpYmRtLWRlcHRyZWUuYwpAQCAtMCwwICsxLDM5MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorI2luY2x1ZGUgImxpYmRtLXRhcmdldHMuaCIKKyNpbmNsdWRlICJsaWJkbS1jb21tb24uaCIKKyNpbmNsdWRlICJrZGV2X3QuaCIKKyNpbmNsdWRlICJkbS1pb2N0bC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBNQVhfVEFSR0VUX1BBUkFNU0laRSA1MDAwMDAKKworI2RlZmluZSBSRVBMSUNBVE9SX0xPQ0FMX1NJVEUgMAorCisvKiBTdXBwb3J0ZWQgc2VnbWVudCB0eXBlcyAqLworZW51bSB7CisJU0VHX0NBQ0hFLAorCVNFR19DUllQVCwKKwlTRUdfRVJST1IsCisJU0VHX0xJTkVBUiwKKwlTRUdfTUlSUk9SRUQsCisJU0VHX1JFUExJQ0FUT1IsCisJU0VHX1JFUExJQ0FUT1JfREVWLAorCVNFR19TTkFQU0hPVCwKKwlTRUdfU05BUFNIT1RfT1JJR0lOLAorCVNFR19TTkFQU0hPVF9NRVJHRSwKKwlTRUdfU1RSSVBFRCwKKwlTRUdfWkVSTywKKwlTRUdfVEhJTl9QT09MLAorCVNFR19USElOLAorCVNFR19SQUlEMCwKKwlTRUdfUkFJRDBfTUVUQSwKKwlTRUdfUkFJRDEsCisJU0VHX1JBSUQxMCwKKwlTRUdfUkFJRDQsCisJU0VHX1JBSUQ1X0xBLAorCVNFR19SQUlENV9SQSwKKwlTRUdfUkFJRDVfTFMsCisJU0VHX1JBSUQ1X1JTLAorCVNFR19SQUlENl9aUiwKKwlTRUdfUkFJRDZfTlIsCisJU0VHX1JBSUQ2X05DLAorfTsKKworLyogRklYTUUgQWRkIGNyeXB0IGFuZCBtdWx0aXBhdGggc3VwcG9ydCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCB0eXBlOworCWNvbnN0IGNoYXIgdGFyZ2V0WzE2XTsKK30gX2RtX3NlZ3R5cGVzW10gPSB7CisJeyBTRUdfQ0FDSEUsICJjYWNoZSIgfSwKKwl7IFNFR19DUllQVCwgImNyeXB0IiB9LAorCXsgU0VHX0VSUk9SLCAiZXJyb3IiIH0sCisJeyBTRUdfTElORUFSLCAibGluZWFyIiB9LAorCXsgU0VHX01JUlJPUkVELCAibWlycm9yIiB9LAorCXsgU0VHX1JFUExJQ0FUT1IsICJyZXBsaWNhdG9yIiB9LAorCXsgU0VHX1JFUExJQ0FUT1JfREVWLCAicmVwbGljYXRvci1kZXYiIH0sCisJeyBTRUdfU05BUFNIT1QsICJzbmFwc2hvdCIgfSwKKwl7IFNFR19TTkFQU0hPVF9PUklHSU4sICJzbmFwc2hvdC1vcmlnaW4iIH0sCisJeyBTRUdfU05BUFNIT1RfTUVSR0UsICJzbmFwc2hvdC1tZXJnZSIgfSwKKwl7IFNFR19TVFJJUEVELCAic3RyaXBlZCIgfSwKKwl7IFNFR19aRVJPLCAiemVybyJ9LAorCXsgU0VHX1RISU5fUE9PTCwgInRoaW4tcG9vbCJ9LAorCXsgU0VHX1RISU4sICJ0aGluIn0sCisJeyBTRUdfUkFJRDAsICJyYWlkMCJ9LAorCXsgU0VHX1JBSUQwX01FVEEsICJyYWlkMF9tZXRhIn0sCisJeyBTRUdfUkFJRDEsICJyYWlkMSJ9LAorCXsgU0VHX1JBSUQxMCwgInJhaWQxMCJ9LAorCXsgU0VHX1JBSUQ0LCAicmFpZDQifSwKKwl7IFNFR19SQUlENV9MQSwgInJhaWQ1X2xhIn0sCisJeyBTRUdfUkFJRDVfUkEsICJyYWlkNV9yYSJ9LAorCXsgU0VHX1JBSUQ1X0xTLCAicmFpZDVfbHMifSwKKwl7IFNFR19SQUlENV9SUywgInJhaWQ1X3JzIn0sCisJeyBTRUdfUkFJRDZfWlIsICJyYWlkNl96ciJ9LAorCXsgU0VHX1JBSUQ2X05SLCAicmFpZDZfbnIifSwKKwl7IFNFR19SQUlENl9OQywgInJhaWQ2X25jIn0sCisKKwkvKgorCSAqIFdBUk5JTkc6IFNpbmNlICdyYWlkJyB0YXJnZXQgb3ZlcmxvYWRzIHRoaXMgMToxIG1hcHBpbmcgdGFibGUKKwkgKiBmb3Igc2VhcmNoIGRvIG5vdCBhZGQgbmV3IGVudW0gZWxlbWVudHMgcGFzdCB0aGVtIQorCSAqLworCXsgU0VHX1JBSUQ1X0xTLCAicmFpZDUifSwgLyogc2FtZSBhcyAicmFpZDVfbHMiIChkZWZhdWx0IGZvciBNRCBhbHNvKSAqLworCXsgU0VHX1JBSUQ2X1pSLCAicmFpZDYifSwgLyogc2FtZSBhcyAicmFpZDZfenIiICovCit9OworCisvKiBTb21lIHNlZ21lbnQgdHlwZXMgaGF2ZSBhIGxpc3Qgb2YgYXJlYXMgb2Ygb3RoZXIgZGV2aWNlcyBhdHRhY2hlZCAqLworc3RydWN0IHNlZ19hcmVhIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqZGV2X25vZGU7CisKKwl1aW50NjRfdCBvZmZzZXQ7CisKKwl1bnNpZ25lZCByc2l0ZV9pbmRleDsJCS8qIFJlcGxpY2F0b3Igc2l0ZSBpbmRleCAqLworCXN0cnVjdCBkbV90cmVlX25vZGUgKnNsb2c7CS8qIFJlcGxpY2F0b3Igc3luYyBsb2cgbm9kZSAqLworCXVpbnQ2NF90IHJlZ2lvbl9zaXplOwkJLyogUmVwbGljYXRvciBzeW5jIGxvZyBzaXplICovCisJdWludDMyX3QgZmxhZ3M7CQkJLyogUmVwbGljYXRvciBzeW5jIGxvZyBmbGFncyAqLworfTsKKworc3RydWN0IGRtX3RoaW5fbWVzc2FnZSB7CisJZG1fdGhpbl9tZXNzYWdlX3QgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBkZXZpY2VfaWQ7CisJCQl1aW50MzJfdCBvcmlnaW5faWQ7CisJCX0gbV9jcmVhdGVfc25hcDsKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGRldmljZV9pZDsKKwkJfSBtX2NyZWF0ZV90aGluOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgZGV2aWNlX2lkOworCQl9IG1fZGVsZXRlOworCQlzdHJ1Y3QgeworCQkJdWludDY0X3QgY3VycmVudF9pZDsKKwkJCXVpbnQ2NF90IG5ld19pZDsKKwkJfSBtX3NldF90cmFuc2FjdGlvbl9pZDsKKwl9IHU7Cit9OworCitzdHJ1Y3QgdGhpbl9tZXNzYWdlIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkbV90aGluX21lc3NhZ2UgbWVzc2FnZTsKKwlpbnQgZXhwZWN0ZWRfZXJybm87Cit9OworCisvKiBSZXBsaWNhdG9yLWxvZyBoYXMgYSBsaXN0IG9mIHNpdGVzICovCisvKiBGSVhNRTogbWF5YmUgbW92ZSB0byBzZWdfYXJlYSB0b28/ICovCitzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCisJdW5zaWduZWQgcnNpdGVfaW5kZXg7CisJZG1fcmVwbGljYXRvcl9tb2RlX3QgbW9kZTsKKwl1aW50MzJfdCBhc3luY190aW1lb3V0OworCXVpbnQzMl90IGZhbGxfYmVoaW5kX2lvczsKKwl1aW50NjRfdCBmYWxsX2JlaGluZF9kYXRhOworfTsKKworLyogUGVyLXNlZ21lbnQgcHJvcGVydGllcyAqLworc3RydWN0IGxvYWRfc2VnbWVudCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKworCXVuc2lnbmVkIHR5cGU7CisKKwl1aW50NjRfdCBzaXplOworCisJdW5zaWduZWQgYXJlYV9jb3VudDsJCS8qIExpbmVhciArIFN0cmlwZWQgKyBNaXJyb3JlZCArIENyeXB0ICsgUmVwbGljYXRvciAqLworCXN0cnVjdCBkbV9saXN0IGFyZWFzOwkJLyogTGluZWFyICsgU3RyaXBlZCArIE1pcnJvcmVkICsgQ3J5cHQgKyBSZXBsaWNhdG9yICovCisKKwl1aW50MzJfdCBzdHJpcGVfc2l6ZTsJCS8qIFN0cmlwZWQgKyByYWlkICovCisKKwlpbnQgcGVyc2lzdGVudDsJCQkvKiBTbmFwc2hvdCAqLworCXVpbnQzMl90IGNodW5rX3NpemU7CQkvKiBTbmFwc2hvdCAqLworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNvdzsJLyogU25hcHNob3QgKi8KKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpvcmlnaW47CS8qIFNuYXBzaG90ICsgU25hcHNob3Qgb3JpZ2luICsgQ2FjaGUgKi8KKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICptZXJnZTsJLyogU25hcHNob3QgKi8KKworCXN0cnVjdCBkbV90cmVlX25vZGUgKmxvZzsJLyogTWlycm9yICsgUmVwbGljYXRvciAqLworCXVpbnQzMl90IHJlZ2lvbl9zaXplOwkJLyogTWlycm9yICsgcmFpZCAqLworCXVuc2lnbmVkIGNsdXN0ZXJlZDsJCS8qIE1pcnJvciAqLworCXVuc2lnbmVkIG1pcnJvcl9hcmVhX2NvdW50OwkvKiBNaXJyb3IgKi8KKwl1aW50MzJfdCBmbGFnczsJCQkvKiBNaXJyb3IgKyByYWlkICsgQ2FjaGUgKi8KKwljaGFyICp1dWlkOwkJCS8qIENsdXN0ZXJlZCBtaXJyb3IgbG9nICovCisKKwljb25zdCBjaGFyICpwb2xpY3lfbmFtZTsJLyogQ2FjaGUgKi8KKwl1bnNpZ25lZCBwb2xpY3lfYXJnYzsJCS8qIENhY2hlICovCisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpwb2xpY3lfc2V0dGluZ3M7CS8qIENhY2hlICovCisKKwljb25zdCBjaGFyICpjaXBoZXI7CQkvKiBDcnlwdCAqLworCWNvbnN0IGNoYXIgKmNoYWlubW9kZTsJCS8qIENyeXB0ICovCisJY29uc3QgY2hhciAqaXY7CQkJLyogQ3J5cHQgKi8KKwl1aW50NjRfdCBpdl9vZmZzZXQ7CQkvKiBDcnlwdCAqLworCWNvbnN0IGNoYXIgKmtleTsJCS8qIENyeXB0ICovCisKKwljb25zdCBjaGFyICpybG9nX3R5cGU7CQkvKiBSZXBsaWNhdG9yICovCisJc3RydWN0IGRtX2xpc3QgcnNpdGVzOwkJLyogUmVwbGljYXRvciAqLworCXVuc2lnbmVkIHJzaXRlX2NvdW50OwkJLyogUmVwbGljYXRvciAqLworCXVuc2lnbmVkIHJkZXZpY2VfY291bnQ7CQkvKiBSZXBsaWNhdG9yICovCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqcmVwbGljYXRvcjsvKiBSZXBsaWNhdG9yLWRldiAqLworCXVpbnQ2NF90IHJkZXZpY2VfaW5kZXg7CQkvKiBSZXBsaWNhdG9yLWRldiAqLworCisJdWludDY0X3QgcmVidWlsZHM7CQkvKiByYWlkICovCisJdWludDY0X3Qgd3JpdGVtb3N0bHk7CQkvKiByYWlkICovCisJdWludDMyX3Qgd3JpdGViZWhpbmQ7CQkvKiByYWlkICovCisJdWludDMyX3QgbWF4X3JlY292ZXJ5X3JhdGU7CS8qIHJhaWQga0Ivc2VjL2Rpc2sgKi8KKwl1aW50MzJfdCBtaW5fcmVjb3ZlcnlfcmF0ZTsJLyogcmFpZCBrQi9zZWMvZGlzayAqLworCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqbWV0YWRhdGE7CS8qIFRoaW5fcG9vbCArIENhY2hlICovCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqcG9vbDsJLyogVGhpbl9wb29sLCBUaGluICovCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqZXh0ZXJuYWw7CS8qIFRoaW4gKi8KKwlzdHJ1Y3QgZG1fbGlzdCB0aGluX21lc3NhZ2VzOwkvKiBUaGluX3Bvb2wgKi8KKwl1aW50NjRfdCB0cmFuc2FjdGlvbl9pZDsJLyogVGhpbl9wb29sICovCisJdWludDY0X3QgbG93X3dhdGVyX21hcms7CS8qIFRoaW5fcG9vbCAqLworCXVpbnQzMl90IGRhdGFfYmxvY2tfc2l6ZTsgICAgICAgLyogVGhpbl9wb29sICsgY2FjaGUgKi8KKwl1bnNpZ25lZCBza2lwX2Jsb2NrX3plcm9pbmc7CS8qIFRoaW5fcG9vbCAqLworCXVuc2lnbmVkIGlnbm9yZV9kaXNjYXJkOwkvKiBUaGluX3Bvb2wgdGFyZ2V0IHZzbiAxLjEgKi8KKwl1bnNpZ25lZCBub19kaXNjYXJkX3Bhc3Nkb3duOwkvKiBUaGluX3Bvb2wgdGFyZ2V0IHZzbiAxLjEgKi8KKwl1bnNpZ25lZCBlcnJvcl9pZl9ub19zcGFjZTsJLyogVGhpbiBwb29sIHRhcmdldCB2c24gMS4xMCAqLworCXVuc2lnbmVkIHJlYWRfb25seTsJCS8qIFRoaW4gcG9vbCB0YXJnZXQgdnNuIDEuMyAqLworCXVpbnQzMl90IGRldmljZV9pZDsJCS8qIFRoaW4gKi8KKworfTsKKworLyogUGVyLWRldmljZSBwcm9wZXJ0aWVzICovCitzdHJ1Y3QgbG9hZF9wcm9wZXJ0aWVzIHsKKwlpbnQgcmVhZF9vbmx5OworCXVpbnQzMl90IG1ham9yOworCXVpbnQzMl90IG1pbm9yOworCisJdWludDMyX3QgcmVhZF9haGVhZDsKKwl1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzOworCisJdW5zaWduZWQgc2VnbWVudF9jb3VudDsKKwlpbnQgc2l6ZV9jaGFuZ2VkOworCXN0cnVjdCBkbV9saXN0IHNlZ3M7CisKKwljb25zdCBjaGFyICpuZXdfbmFtZTsKKworCS8qIElmIGltbWVkaWF0ZV9kZXZfbm9kZSBpcyBzZXQgdG8gMSwgdHJ5IHRvIGNyZWF0ZSB0aGUgZGV2IG5vZGUKKwkgKiBhcyBzb29uIGFzIHBvc3NpYmxlIChlLmcuIGluIHByZWxvYWQgc3RhZ2UgZXZlbiBkdXJpbmcgdHJhdmVyc2FsCisJICogYW5kIHByb2Nlc3Npbmcgb2YgZG0gdHJlZSkuIFRoaXMgd2lsbCBhbHNvIGZsdXNoIGFsbCBzdGFja2VkIGRldgorCSAqIG5vZGUgb3BlcmF0aW9ucywgc3luY2hyb25pemluZyB3aXRoIHVkZXYuCisJICovCisJdW5zaWduZWQgaW1tZWRpYXRlX2Rldl9ub2RlOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIHNpemUgY2hhbmdlZCBmcm9tIHplcm8gYW5kIHRoaXMgaXMgc2V0LAorCSAqIGRvbid0IHJlc3VtZSB0aGUgZGV2aWNlIGltbWVkaWF0ZWx5LCBldmVuIGlmIHRoZSBkZXZpY2UKKwkgKiBoYXMgcGFyZW50cy4gIFRoaXMgd29ya3MgcHJvdmlkZWQgdGhlIHBhcmVudHMgZG8gbm90CisJICogdmFsaWRhdGUgdGhlIGRldmljZSBzaXplIGFuZCBpcyByZXF1aXJlZCBieSBwdm1vdmUgdG8KKwkgKiBhdm9pZCBzdGFydGluZyB0aGUgbWlycm9yIHJlc3luYyBvcGVyYXRpb24gdG9vIGVhcmx5LgorCSAqLworCXVuc2lnbmVkIGRlbGF5X3Jlc3VtZV9pZl9uZXc7CisKKwkvKgorCSAqIENhbGwgbm9kZV9zZW5kX21lc3NhZ2VzKCksIHNldCB0byAyIGlmIHRoZXJlIGFyZSBtZXNzYWdlcworCSAqIFdoZW4gIT0gMCwgaXQgdmFsaWRhdGVzIG1hdGNoaW5nIHRyYW5zYWN0aW9uIGlkLCB0aHVzIHRoaW4tcG9vbHMKKwkgKiB3aGVyZSB0cmFuc2F0aW9uX2lkIGlzIHBhc3NlZCBhcyAwIGFyZSBuZXZlciB2YWxpZGF0ZWQsIHRoaXMKKwkgKiBhbGxvd3MgZXh0ZXJuYWwgbWFuYWdtZW50IG9mIHRoaW4tcG9vbCBUSUQuCisJICovCisJdW5zaWduZWQgc2VuZF9tZXNzYWdlczsKKwkvKiBTa2lwIHN1c3BlbmRpbmcgbm9kZSdzIGNoaWxkcmVuLCB1c2VkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyB0byB0aGluLXBvb2wgKi8KKwlpbnQgc2tpcF9zdXNwZW5kOworfTsKKworLyogVHdvIG9mIHRoZXNlIHVzZWQgdG8gam9pbiB0d28gbm9kZXMgd2l0aCB1c2VzIGFuZCB1c2VkX2J5LiAqLworc3RydWN0IGRtX3RyZWVfbGluayB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlOworfTsKKworc3RydWN0IGRtX3RyZWVfbm9kZSB7CisJc3RydWN0IGRtX3RyZWUgKmR0cmVlOworCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp1dWlkOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisKKwlzdHJ1Y3QgZG1fbGlzdCB1c2VzOyAgICAgICAJLyogTm9kZXMgdGhpcyBub2RlIHVzZXMgKi8KKwlzdHJ1Y3QgZG1fbGlzdCB1c2VkX2J5OyAgICAJLyogTm9kZXMgdGhhdCB1c2UgdGhpcyBub2RlICovCisKKwlpbnQgYWN0aXZhdGlvbl9wcmlvcml0eTsJLyogMCBnZXRzIGFjdGl2YXRlZCBmaXJzdCAqLworCWludCBpbXBsaWNpdF9kZXBzOwkJLyogMSBkZXZpY2Ugb25seSBpbXBsaWNpdGx5IHJlZmVyZW5jZWQgKi8KKworCXVpbnQxNl90IHVkZXZfZmxhZ3M7CQkvKiBVZGV2IGNvbnRyb2wgZmxhZ3MgKi8KKworCXZvaWQgKmNvbnRleHQ7CQkJLyogRXh0ZXJuYWwgc3VwcGxpZWQgY29udGV4dCAqLworCisJc3RydWN0IGxvYWRfcHJvcGVydGllcyBwcm9wczsJLyogRm9yIGNyZWF0aW9uL3RhYmxlIChyZSlsb2FkICovCisKKwkvKgorCSAqIElmIHByZXN1c3BlbmQgb2YgY2hpbGQgbm9kZSBpcyBuZWVkZWQKKwkgKiBOb3RlOiBvbmx5IGRpcmVjdCBjaGlsZCBpcyBhbGxvd2VkCisJICovCisJc3RydWN0IGRtX3RyZWVfbm9kZSAqcHJlc3VzcGVuZF9ub2RlOworCisJLyogQ2FsbGJhY2sgKi8KKwlkbV9ub2RlX2NhbGxiYWNrX2ZuIGNhbGxiYWNrOworCXZvaWQgKmNhbGxiYWNrX2RhdGE7CisKKwkvKgorCSAqIFRPRE86CisJICoJQWRkIGFkdmFuY2VkIGNvZGUgd2hpY2ggdHJhY2tzIG9mIHNlbmQgaW9jdGxzIGFuZCB0aGVpcgorCSAqCXByb3BlciByZXZlcnQgb3BlcmF0aW9uIGZvciBtb3JlIGFkdmFuY2VkIHJlY292ZXJ5CisJICoJQ3VycmVudCBjb2RlIHNlcnZlcyBtb3N0bHkgb25seSB0byByZWNvdmVyeSB3aGVuCisJICoJdGhpbiBwb29sIG1ldGFkYXRhIGNoZWNrIGZhaWxzIGFuZCBjb21tYW5kIHdvdWxkCisJICoJaGF2ZSBsZWZ0IGFjdGl2ZSB0aGluIGRhdGEgYW5kIG1ldGFkYXRhIHN1YnZvbHVtZXMuCisJICovCisJc3RydWN0IGRtX2xpc3QgYWN0aXZhdGVkOwkvKiBIZWFkIG9mIGFjdGl2YXRlZCBub2RlcyBmb3IgcHJlbG9hZCByZXZlcnQgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBhY3RpdmF0ZWRfbGlzdDsJLyogTGlzdCBvZiBhY3RpdmF0ZWQgbm9kZXMgZm9yIHByZWxvYWQgcmV2ZXJ0ICovCit9OworCitzdHJ1Y3QgZG1fdHJlZSB7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqZGV2czsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdXVpZHM7CisJc3RydWN0IGRtX3RyZWVfbm9kZSByb290OworCWludCBza2lwX2xvY2tmczsJCS8qIDEgc2tpcHMgbG9ja2ZzIChmb3Igbm9uLXNuYXBzaG90cykgKi8KKwlpbnQgbm9fZmx1c2g7CQkJLyogMSBzZXRzIG5vZmx1c2ggKG1pcnJvcnMvbXVsdGlwYXRoKSAqLworCWludCByZXRyeV9yZW1vdmU7CQkvKiAxIHJldHJpZXMgcmVtb3ZlIGlmIG5vdCBzdWNjZXNzZnVsICovCisJdWludDMyX3QgY29va2llOworCWNoYXIgYnVmW0RNX05BTUVfTEVOICsgMzJdOwkvKiBwcmludCBidWZmZXIgZm9yIGRldmljZV9uYW1lIChtYWpvcjptaW5vcikgKi8KKwljb25zdCBjaGFyICoqb3B0aW9uYWxfdXVpZF9zdWZmaXhlczsJLyogdXVpZCBzdWZmaXhlcyBpZ25vcmVkIHdoZW4gbWF0Y2hpbmcgKi8KK307CisKKy8qCisgKiBUcmVlIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IGRtX3RyZWUgKmRtX3RyZWVfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGRtX3Bvb2wgKmRtZW07CisJc3RydWN0IGRtX3RyZWUgKmR0cmVlOworCisJaWYgKCEoZG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJkdHJlZSIsIDEwMjQpKSB8fAorCSAgICAhKGR0cmVlID0gZG1fcG9vbF96YWxsb2MoZG1lbSwgc2l6ZW9mKCpkdHJlZSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkdHJlZS4iKTsKKwkJaWYgKGRtZW0pCisJCQlkbV9wb29sX2Rlc3Ryb3koZG1lbSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWR0cmVlLT5yb290LmR0cmVlID0gZHRyZWU7CisJZG1fbGlzdF9pbml0KCZkdHJlZS0+cm9vdC51c2VzKTsKKwlkbV9saXN0X2luaXQoJmR0cmVlLT5yb290LnVzZWRfYnkpOworCWRtX2xpc3RfaW5pdCgmZHRyZWUtPnJvb3QuYWN0aXZhdGVkKTsKKwlkdHJlZS0+c2tpcF9sb2NrZnMgPSAwOworCWR0cmVlLT5ub19mbHVzaCA9IDA7CisJZHRyZWUtPm1lbSA9IGRtZW07CisJZHRyZWUtPm9wdGlvbmFsX3V1aWRfc3VmZml4ZXMgPSBOVUxMOworCisJaWYgKCEoZHRyZWUtPmRldnMgPSBkbV9oYXNoX2NyZWF0ZSg4KSkpIHsKKwkJbG9nX2Vycm9yKCJkdHJlZSBoYXNoIGNyZWF0aW9uIGZhaWxlZCIpOworCQlkbV9wb29sX2Rlc3Ryb3koZHRyZWUtPm1lbSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGR0cmVlLT51dWlkcyA9IGRtX2hhc2hfY3JlYXRlKDMyKSkpIHsKKwkJbG9nX2Vycm9yKCJkdHJlZSB1dWlkIGhhc2ggY3JlYXRpb24gZmFpbGVkIik7CisJCWRtX2hhc2hfZGVzdHJveShkdHJlZS0+ZGV2cyk7CisJCWRtX3Bvb2xfZGVzdHJveShkdHJlZS0+bWVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGR0cmVlOworfQorCit2b2lkIGRtX3RyZWVfZnJlZShzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUpCit7CisJaWYgKCFkdHJlZSkKKwkJcmV0dXJuOworCisJZG1faGFzaF9kZXN0cm95KGR0cmVlLT51dWlkcyk7CisJZG1faGFzaF9kZXN0cm95KGR0cmVlLT5kZXZzKTsKKwlkbV9wb29sX2Rlc3Ryb3koZHRyZWUtPm1lbSk7Cit9CisKK3ZvaWQgZG1fdHJlZV9zZXRfY29va2llKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVpbnQzMl90IGNvb2tpZSkKK3sKKwlub2RlLT5kdHJlZS0+Y29va2llID0gY29va2llOworfQorCit1aW50MzJfdCBkbV90cmVlX2dldF9jb29raWUoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gbm9kZS0+ZHRyZWUtPmNvb2tpZTsKK30KKwordm9pZCBkbV90cmVlX3NraXBfbG9ja2ZzKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlKQoreworCWRub2RlLT5kdHJlZS0+c2tpcF9sb2NrZnMgPSAxOworfQorCit2b2lkIGRtX3RyZWVfdXNlX25vX2ZsdXNoX3N1c3BlbmQoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpCit7CisJZG5vZGUtPmR0cmVlLT5ub19mbHVzaCA9IDE7Cit9CisKK3ZvaWQgZG1fdHJlZV9yZXRyeV9yZW1vdmUoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpCit7CisJZG5vZGUtPmR0cmVlLT5yZXRyeV9yZW1vdmUgPSAxOworfQorCisvKgorICogTm9kZSBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgX25vZGVzX2FyZV9saW5rZWQoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpjaGlsZCkKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9saW5rICpkbGluazsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkbGluaywgJnBhcmVudC0+dXNlcykKKwkJaWYgKGRsaW5rLT5ub2RlID09IGNoaWxkKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbGluayhzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9saW5rICpkbGluazsKKworCWlmICghKGRsaW5rID0gZG1fcG9vbF9hbGxvYyhub2RlLT5kdHJlZS0+bWVtLCBzaXplb2YoKmRsaW5rKSkpKSB7CisJCWxvZ19lcnJvcigiZHRyZWUgbGluayBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbGluay0+bm9kZSA9IG5vZGU7CisJZG1fbGlzdF9hZGQobGlzdCwgJmRsaW5rLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9saW5rX25vZGVzKHN0cnVjdCBkbV90cmVlX25vZGUgKnBhcmVudCwKKwkJICAgICAgIHN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkKQoreworCWlmIChfbm9kZXNfYXJlX2xpbmtlZChwYXJlbnQsIGNoaWxkKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIV9saW5rKCZwYXJlbnQtPnVzZXMsIGNoaWxkKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV9saW5rKCZjaGlsZC0+dXNlZF9ieSwgcGFyZW50KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX3VubGluayhzdHJ1Y3QgZG1fbGlzdCAqbGlzdCwgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9saW5rICpkbGluazsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkbGluaywgbGlzdCkKKwkJaWYgKGRsaW5rLT5ub2RlID09IG5vZGUpIHsKKwkJCWRtX2xpc3RfZGVsKCZkbGluay0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBfdW5saW5rX25vZGVzKHN0cnVjdCBkbV90cmVlX25vZGUgKnBhcmVudCwKKwkJCSAgc3RydWN0IGRtX3RyZWVfbm9kZSAqY2hpbGQpCit7CisJaWYgKCFfbm9kZXNfYXJlX2xpbmtlZChwYXJlbnQsIGNoaWxkKSkKKwkJcmV0dXJuOworCisJX3VubGluaygmcGFyZW50LT51c2VzLCBjaGlsZCk7CisJX3VubGluaygmY2hpbGQtPnVzZWRfYnksIHBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF90b190b3BsZXZlbChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiBfbGlua19ub2Rlcygmbm9kZS0+ZHRyZWUtPnJvb3QsIG5vZGUpOworfQorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2Zyb21fdG9wbGV2ZWwoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlfdW5saW5rX25vZGVzKCZub2RlLT5kdHJlZS0+cm9vdCwgbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX2FkZF90b19ib3R0b21sZXZlbChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiBfbGlua19ub2Rlcyhub2RlLCAmbm9kZS0+ZHRyZWUtPnJvb3QpOworfQorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2Zyb21fYm90dG9tbGV2ZWwoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlfdW5saW5rX25vZGVzKG5vZGUsICZub2RlLT5kdHJlZS0+cm9vdCk7Cit9CisKK3N0YXRpYyBpbnQgX2xpbmtfdHJlZV9ub2RlcyhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpwYXJlbnQsIHN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkKQoreworCS8qIERvbid0IGxpbmsgdG8gcm9vdCBub2RlIGlmIGNoaWxkIGFscmVhZHkgaGFzIGEgcGFyZW50ICovCisJaWYgKHBhcmVudCA9PSAmcGFyZW50LT5kdHJlZS0+cm9vdCkgeworCQlpZiAoZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgMSkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJX3JlbW92ZV9mcm9tX3RvcGxldmVsKGNoaWxkKTsKKworCWlmIChjaGlsZCA9PSAmY2hpbGQtPmR0cmVlLT5yb290KSB7CisJCWlmIChkbV90cmVlX25vZGVfbnVtX2NoaWxkcmVuKHBhcmVudCwgMCkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJX3JlbW92ZV9mcm9tX2JvdHRvbWxldmVsKHBhcmVudCk7CisKKwlyZXR1cm4gX2xpbmtfbm9kZXMocGFyZW50LCBjaGlsZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpfY3JlYXRlX2RtX3RyZWVfbm9kZShzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUsCisJCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSBjb25zdCBjaGFyICp1dWlkLAorCQkJCQkJIHN0cnVjdCBkbV9pbmZvICppbmZvLAorCQkJCQkJIHZvaWQgKmNvbnRleHQsCisJCQkJCQkgdWludDE2X3QgdWRldl9mbGFncykKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlOworCWRldl90IGRldjsKKworCWlmICghKG5vZGUgPSBkbV9wb29sX3phbGxvYyhkdHJlZS0+bWVtLCBzaXplb2YoKm5vZGUpKSkpIHsKKwkJbG9nX2Vycm9yKCJfY3JlYXRlX2RtX3RyZWVfbm9kZSBhbGxvYyBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbm9kZS0+ZHRyZWUgPSBkdHJlZTsKKworCW5vZGUtPm5hbWUgPSBuYW1lOworCW5vZGUtPnV1aWQgPSB1dWlkOworCW5vZGUtPmluZm8gPSAqaW5mbzsKKwlub2RlLT5jb250ZXh0ID0gY29udGV4dDsKKwlub2RlLT51ZGV2X2ZsYWdzID0gdWRldl9mbGFnczsKKworCWRtX2xpc3RfaW5pdCgmbm9kZS0+dXNlcyk7CisJZG1fbGlzdF9pbml0KCZub2RlLT51c2VkX2J5KTsKKwlkbV9saXN0X2luaXQoJm5vZGUtPmFjdGl2YXRlZCk7CisJZG1fbGlzdF9pbml0KCZub2RlLT5wcm9wcy5zZWdzKTsKKworCWRldiA9IE1LREVWKChkZXZfdClpbmZvLT5tYWpvciwgKGRldl90KWluZm8tPm1pbm9yKTsKKworCWlmICghZG1faGFzaF9pbnNlcnRfYmluYXJ5KGR0cmVlLT5kZXZzLCAoY29uc3QgY2hhciAqKSAmZGV2LAorCQkJCXNpemVvZihkZXYpLCBub2RlKSkgeworCQlsb2dfZXJyb3IoImR0cmVlIG5vZGUgaGFzaCBpbnNlcnRpb24gZmFpbGVkIik7CisJCWRtX3Bvb2xfZnJlZShkdHJlZS0+bWVtLCBub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHV1aWQgJiYgKnV1aWQgJiYKKwkgICAgIWRtX2hhc2hfaW5zZXJ0KGR0cmVlLT51dWlkcywgdXVpZCwgbm9kZSkpIHsKKwkJbG9nX2Vycm9yKCJkdHJlZSB1dWlkIGhhc2ggaW5zZXJ0aW9uIGZhaWxlZCIpOworCQlkbV9oYXNoX3JlbW92ZV9iaW5hcnkoZHRyZWUtPmRldnMsIChjb25zdCBjaGFyICopICZkZXYsCisJCQkJICAgICAgc2l6ZW9mKGRldikpOworCQlkbV9wb29sX2ZyZWUoZHRyZWUtPm1lbSwgbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBub2RlOworfQorCitzdGF0aWMgc3RydWN0IGRtX3RyZWVfbm9kZSAqX2ZpbmRfZG1fdHJlZV9ub2RlKHN0cnVjdCBkbV90cmVlICpkdHJlZSwKKwkJCQkJICAgICAgIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vcikKK3sKKwlkZXZfdCBkZXYgPSBNS0RFVigoZGV2X3QpbWFqb3IsIChkZXZfdCltaW5vcik7CisKKwlyZXR1cm4gZG1faGFzaF9sb29rdXBfYmluYXJ5KGR0cmVlLT5kZXZzLCAoY29uc3QgY2hhciAqKSAmZGV2LAorCQkJCSAgICAgc2l6ZW9mKGRldikpOworfQorCit2b2lkIGRtX3RyZWVfc2V0X29wdGlvbmFsX3V1aWRfc3VmZml4ZXMoc3RydWN0IGRtX3RyZWUgKmR0cmVlLCBjb25zdCBjaGFyICoqb3B0aW9uYWxfdXVpZF9zdWZmaXhlcykKK3sKKwlkdHJlZS0+b3B0aW9uYWxfdXVpZF9zdWZmaXhlcyA9IG9wdGlvbmFsX3V1aWRfc3VmZml4ZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpfZmluZF9kbV90cmVlX25vZGVfYnlfdXVpZChzdHJ1Y3QgZG1fdHJlZSAqZHRyZWUsCisJCQkJCQkgICAgICAgY29uc3QgY2hhciAqdXVpZCkKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlOworCWNvbnN0IGNoYXIgKmRlZmF1bHRfdXVpZF9wcmVmaXg7CisJc2l6ZV90IGRlZmF1bHRfdXVpZF9wcmVmaXhfbGVuOworCWNvbnN0IGNoYXIgKnN1ZmZpeCwgKnN1ZmZpeF9wb3NpdGlvbjsKKwljaGFyIHV1aWRfd2l0aG91dF9zdWZmaXhbRE1fVVVJRF9MRU5dOworCXVuc2lnbmVkIGkgPSAwOworCWNvbnN0IGNoYXIgKipzdWZmaXhfbGlzdCA9IGR0cmVlLT5vcHRpb25hbF91dWlkX3N1ZmZpeGVzOworCisJaWYgKChub2RlID0gZG1faGFzaF9sb29rdXAoZHRyZWUtPnV1aWRzLCB1dWlkKSkpIHsKKwkJbG9nX2RlYnVnKCJNYXRjaGVkIHV1aWQgJXMgaW4gZGVwdHJlZS4iLCB1dWlkKTsKKwkJcmV0dXJuIG5vZGU7CisJfQorCisJZGVmYXVsdF91dWlkX3ByZWZpeCA9IGRtX3V1aWRfcHJlZml4KCk7CisJZGVmYXVsdF91dWlkX3ByZWZpeF9sZW4gPSBzdHJsZW4oZGVmYXVsdF91dWlkX3ByZWZpeCk7CisKKwlpZiAoc3VmZml4X2xpc3QgJiYgKHN1ZmZpeF9wb3NpdGlvbiA9IHJpbmRleCh1dWlkLCAnLScpKSkgeworCQl3aGlsZSAoKHN1ZmZpeCA9IHN1ZmZpeF9saXN0W2krK10pKSB7CisJCQlpZiAoc3RyY21wKHN1ZmZpeF9wb3NpdGlvbiArIDEsIHN1ZmZpeCkpCisJCQkJY29udGludWU7CisKKwkJCSh2b2lkKSBzdHJuY3B5KHV1aWRfd2l0aG91dF9zdWZmaXgsIHV1aWQsIHNpemVvZih1dWlkX3dpdGhvdXRfc3VmZml4KSk7CisJCQl1dWlkX3dpdGhvdXRfc3VmZml4W3N1ZmZpeF9wb3NpdGlvbiAtIHV1aWRdID0gJ1wwJzsKKworCQkJaWYgKChub2RlID0gZG1faGFzaF9sb29rdXAoZHRyZWUtPnV1aWRzLCB1dWlkX3dpdGhvdXRfc3VmZml4KSkpIHsKKwkJCQlsb2dfZGVidWcoIk1hdGNoZWQgdXVpZCAlcyAobWlzc2luZyBzdWZmaXggLSVzKSBpbiBkZXB0cmVlLiIsIHV1aWRfd2l0aG91dF9zdWZmaXgsIHN1ZmZpeCk7CisJCQkJcmV0dXJuIG5vZGU7CisJCQl9CisKKwkJCWJyZWFrOworCQl9OworCX0KKwkKKwlpZiAoc3RybmNtcCh1dWlkLCBkZWZhdWx0X3V1aWRfcHJlZml4LCBkZWZhdWx0X3V1aWRfcHJlZml4X2xlbikpCisJCXJldHVybiBOVUxMOworCisJaWYgKChub2RlID0gZG1faGFzaF9sb29rdXAoZHRyZWUtPnV1aWRzLCB1dWlkICsgZGVmYXVsdF91dWlkX3ByZWZpeF9sZW4pKSkgeworCQlsb2dfZGVidWcoIk1hdGNoZWQgdXVpZCAlcyAobWlzc2luZyBwcmVmaXgpIGluIGRlcHRyZWUuIiwgdXVpZCArIGRlZmF1bHRfdXVpZF9wcmVmaXhfbGVuKTsKKwkJcmV0dXJuIG5vZGU7CisJfQorCisJbG9nX2RlYnVnKCJOb3QgbWF0Y2hlZCB1dWlkICVzIGluIGRlcHRyZWUuIiwgdXVpZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiBub2RlJ3MgZGV2aWNlX25hbWUgKG1ham9yOm1pbm9yKSBmb3IgZGVidWcgbWVzc2FnZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfbm9kZV9uYW1lKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlKQoreworCWlmIChkbV9zbnByaW50Zihkbm9kZS0+ZHRyZWUtPmJ1Ziwgc2l6ZW9mKGRub2RlLT5kdHJlZS0+YnVmKSwKKwkJCSIlcyAoJSIgUFJJdTMyICI6JSIgUFJJdTMyICIpIiwKKwkJCWRub2RlLT5uYW1lLCBkbm9kZS0+aW5mby5tYWpvciwgZG5vZGUtPmluZm8ubWlub3IpIDwgMCkgeworCQlzdGFjazsKKwkJcmV0dXJuIGRub2RlLT5uYW1lOworCX0KKworCXJldHVybiBkbm9kZS0+ZHRyZWUtPmJ1ZjsKK30KKwordm9pZCBkbV90cmVlX25vZGVfc2V0X3VkZXZfZmxhZ3Moc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsIHVpbnQxNl90IHVkZXZfZmxhZ3MpCisKK3sKKwlzdHJ1Y3QgZG1faW5mbyAqZGluZm8gPSAmZG5vZGUtPmluZm87CisKKwlpZiAodWRldl9mbGFncyAhPSBkbm9kZS0+dWRldl9mbGFncykKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlJlc2V0dGluZyAlcyAoJSIgUFJJdTMyICI6JSIgUFJJdTMyCisJCQkJICAgICAiKSB1ZGV2X2ZsYWdzIGZyb20gMHgleCB0byAweCV4IiwKKwkJCQkgICAgIGRub2RlLT5uYW1lLCBkaW5mby0+bWFqb3IsIGRpbmZvLT5taW5vciwKKwkJCQkgICAgIGRub2RlLT51ZGV2X2ZsYWdzLCB1ZGV2X2ZsYWdzKTsKKwlkbm9kZS0+dWRldl9mbGFncyA9IHVkZXZfZmxhZ3M7Cit9CisKK3ZvaWQgZG1fdHJlZV9ub2RlX3NldF9yZWFkX2FoZWFkKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCSB1aW50MzJfdCByZWFkX2FoZWFkLAorCQkJCSB1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzKQoreworCWRub2RlLT5wcm9wcy5yZWFkX2FoZWFkID0gcmVhZF9haGVhZDsKKwlkbm9kZS0+cHJvcHMucmVhZF9haGVhZF9mbGFncyA9IHJlYWRfYWhlYWRfZmxhZ3M7Cit9CisKK3ZvaWQgZG1fdHJlZV9ub2RlX3NldF9wcmVzdXNwZW5kX25vZGUoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpwcmVzdXNwZW5kX25vZGUpCit7CisJbm9kZS0+cHJlc3VzcGVuZF9ub2RlID0gcHJlc3VzcGVuZF9ub2RlOworfQorCitjb25zdCBjaGFyICpkbV90cmVlX25vZGVfZ2V0X25hbWUoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gbm9kZS0+aW5mby5leGlzdHMgPyBub2RlLT5uYW1lIDogIiI7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3RyZWVfbm9kZV9nZXRfdXVpZChjb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiBub2RlLT5pbmZvLmV4aXN0cyA/IG5vZGUtPnV1aWQgOiAiIjsKK30KKworY29uc3Qgc3RydWN0IGRtX2luZm8gKmRtX3RyZWVfbm9kZV9nZXRfaW5mbyhjb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiAmbm9kZS0+aW5mbzsKK30KKwordm9pZCAqZG1fdHJlZV9ub2RlX2dldF9jb250ZXh0KGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIG5vZGUtPmNvbnRleHQ7Cit9CisKK2ludCBkbV90cmVlX25vZGVfc2l6ZV9jaGFuZ2VkKGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlKQoreworCXJldHVybiBkbm9kZS0+cHJvcHMuc2l6ZV9jaGFuZ2VkOworfQorCitpbnQgZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50MzJfdCBpbnZlcnRlZCkKK3sKKwlpZiAoaW52ZXJ0ZWQpIHsKKwkJaWYgKF9ub2Rlc19hcmVfbGlua2VkKCZub2RlLT5kdHJlZS0+cm9vdCwgbm9kZSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGRtX2xpc3Rfc2l6ZSgmbm9kZS0+dXNlZF9ieSk7CisJfQorCisJaWYgKF9ub2Rlc19hcmVfbGlua2VkKG5vZGUsICZub2RlLT5kdHJlZS0+cm9vdCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRtX2xpc3Rfc2l6ZSgmbm9kZS0+dXNlcyk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgbm8gcHJlZml4IHN1cHBsaWVkCisgKi8KK3N0YXRpYyBpbnQgX3V1aWRfcHJlZml4X21hdGNoZXMoY29uc3QgY2hhciAqdXVpZCwgY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsIHNpemVfdCB1dWlkX3ByZWZpeF9sZW4pCit7CisJY29uc3QgY2hhciAqZGVmYXVsdF91dWlkX3ByZWZpeCA9IGRtX3V1aWRfcHJlZml4KCk7CisJc2l6ZV90IGRlZmF1bHRfdXVpZF9wcmVmaXhfbGVuID0gc3RybGVuKGRlZmF1bHRfdXVpZF9wcmVmaXgpOworCisJaWYgKCF1dWlkX3ByZWZpeCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXN0cm5jbXAodXVpZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCXJldHVybiAxOworCisJLyogSGFuZGxlIHRyYW5zaXRpb246IGFjdGl2ZSBkZXZpY2UgdXVpZHMgbWlnaHQgYmUgbWlzc2luZyB0aGUgcHJlZml4ICovCisJaWYgKHV1aWRfcHJlZml4X2xlbiA8PSA0KQorCQlyZXR1cm4gMDsKKworCWlmICghc3RybmNtcCh1dWlkLCBkZWZhdWx0X3V1aWRfcHJlZml4LCBkZWZhdWx0X3V1aWRfcHJlZml4X2xlbikpCisJCXJldHVybiAwOworCisJaWYgKHN0cm5jbXAodXVpZF9wcmVmaXgsIGRlZmF1bHRfdXVpZF9wcmVmaXgsIGRlZmF1bHRfdXVpZF9wcmVmaXhfbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXN0cm5jbXAodXVpZCwgdXVpZF9wcmVmaXggKyBkZWZhdWx0X3V1aWRfcHJlZml4X2xlbiwgdXVpZF9wcmVmaXhfbGVuIC0gZGVmYXVsdF91dWlkX3ByZWZpeF9sZW4pKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyAxIGlmIG5vIGNoaWxkcmVuLgorICovCitzdGF0aWMgaW50IF9jaGlsZHJlbl9zdXNwZW5kZWQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgICAgICB1aW50MzJfdCBpbnZlcnRlZCwKKwkJCSAgICAgICBjb25zdCBjaGFyICp1dWlkX3ByZWZpeCwKKwkJCSAgICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCXN0cnVjdCBkbV90cmVlX2xpbmsgKmRsaW5rOworCWNvbnN0IHN0cnVjdCBkbV9pbmZvICpkaW5mbzsKKwljb25zdCBjaGFyICp1dWlkOworCisJaWYgKGludmVydGVkKSB7CisJCWlmIChfbm9kZXNfYXJlX2xpbmtlZCgmbm9kZS0+ZHRyZWUtPnJvb3QsIG5vZGUpKQorCQkJcmV0dXJuIDE7CisJCWxpc3QgPSAmbm9kZS0+dXNlZF9ieTsKKwl9IGVsc2UgeworCQlpZiAoX25vZGVzX2FyZV9saW5rZWQobm9kZSwgJm5vZGUtPmR0cmVlLT5yb290KSkKKwkJCXJldHVybiAxOworCQlsaXN0ID0gJm5vZGUtPnVzZXM7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRsaW5rLCBsaXN0KSB7CisJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoZGxpbmstPm5vZGUpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIFZHICovCisJCWlmICghX3V1aWRfcHJlZml4X21hdGNoZXModXVpZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUgaWYgcGFyZW50IG5vZGUgd2FudHMgdG8gcHJlc3VzcGVuZCB0aGlzIG5vZGUgKi8KKwkJaWYgKGRsaW5rLT5ub2RlLT5wcmVzdXNwZW5kX25vZGUgPT0gbm9kZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGRpbmZvID0gZG1fdHJlZV9ub2RlX2dldF9pbmZvKGRsaW5rLT5ub2RlKSkpCisJCQlyZXR1cm5fMDsJLyogRklYTUUgSXMgdGhpcyBub3JtYWw/ICovCisKKwkJaWYgKCFkaW5mby0+c3VzcGVuZGVkKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTZXQgbWFqb3IgYW5kIG1pbm9yIHRvIHplcm8gZm9yIHJvb3Qgb2YgdHJlZS4KKyAqLworc3RydWN0IGRtX3RyZWVfbm9kZSAqZG1fdHJlZV9maW5kX25vZGUoc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCSAgICAgICB1aW50MzJfdCBtYWpvciwKKwkJCQkgICAgICAgdWludDMyX3QgbWlub3IpCit7CisJaWYgKCFtYWpvciAmJiAhbWlub3IpCisJCXJldHVybiAmZHRyZWUtPnJvb3Q7CisKKwlyZXR1cm4gX2ZpbmRfZG1fdHJlZV9ub2RlKGR0cmVlLCBtYWpvciwgbWlub3IpOworfQorCisvKgorICogU2V0IHV1aWQgdG8gTlVMTCBmb3Igcm9vdCBvZiB0cmVlLgorICovCitzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKHN0cnVjdCBkbV90cmVlICpkdHJlZSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKnV1aWQpCit7CisJaWYgKCF1dWlkIHx8ICEqdXVpZCkKKwkJcmV0dXJuICZkdHJlZS0+cm9vdDsKKworCXJldHVybiBfZmluZF9kbV90cmVlX25vZGVfYnlfdXVpZChkdHJlZSwgdXVpZCk7Cit9CisKKy8qCisgKiBGaXJzdCB0aW1lIHNldCAqaGFuZGxlIHRvIE5VTEwuCisgKiBTZXQgaW52ZXJ0ZWQgdG8gaW52ZXJ0IHRoZSB0cmVlLgorICovCitzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbV90cmVlX25leHRfY2hpbGQodm9pZCAqKmhhbmRsZSwKKwkJCQkJY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50LAorCQkJCQl1aW50MzJfdCBpbnZlcnRlZCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqKmRsaW5rID0gKHN0cnVjdCBkbV9saXN0ICoqKSBoYW5kbGU7CisJY29uc3Qgc3RydWN0IGRtX2xpc3QgKnVzZV9saXN0OworCisJaWYgKGludmVydGVkKQorCQl1c2VfbGlzdCA9ICZwYXJlbnQtPnVzZWRfYnk7CisJZWxzZQorCQl1c2VfbGlzdCA9ICZwYXJlbnQtPnVzZXM7CisKKwlpZiAoISpkbGluaykKKwkJKmRsaW5rID0gZG1fbGlzdF9maXJzdCh1c2VfbGlzdCk7CisJZWxzZQorCQkqZGxpbmsgPSBkbV9saXN0X25leHQodXNlX2xpc3QsICpkbGluayk7CisKKwlyZXR1cm4gKCpkbGluaykgPyBkbV9saXN0X2l0ZW0oKmRsaW5rLCBzdHJ1Y3QgZG1fdHJlZV9saW5rKS0+bm9kZSA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2RlcHMoc3RydWN0IGRtX3Rhc2sgKipkbXQsIHN0cnVjdCBkbV9wb29sICptZW0sIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyICoqdXVpZCwgdW5zaWduZWQgaW5hY3RpdmVfdGFibGUsCisJCSBzdHJ1Y3QgZG1faW5mbyAqaW5mbywgc3RydWN0IGRtX2RlcHMgKipkZXBzKQoreworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWlmICghZG1faXNfZG1fbWFqb3IobWFqb3IpKSB7CisJCWlmIChuYW1lKQorCQkJKm5hbWUgPSAiIjsKKwkJaWYgKHV1aWQpCisJCQkqdXVpZCA9ICIiOworCQkqZGVwcyA9IE5VTEw7CisJCWluZm8tPm1ham9yID0gbWFqb3I7CisJCWluZm8tPm1pbm9yID0gbWlub3I7CisJCXJldHVybiAxOworCX0KKworCWlmICghKCpkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfREVQUykpKSB7CisJCWxvZ19lcnJvcigiZGVwcyBkbV90YXNrIGNyZWF0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21ham9yKCpkbXQsIG1ham9yKSkgeworCQlsb2dfZXJyb3IoIl9kZXBzOiBmYWlsZWQgdG8gc2V0IG1ham9yIGZvciAoJSIgUFJJdTMyICI6JSIgUFJJdTMyICIpIiwKKwkJCSAgbWFqb3IsIG1pbm9yKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKCFkbV90YXNrX3NldF9taW5vcigqZG10LCBtaW5vcikpIHsKKwkJbG9nX2Vycm9yKCJfZGVwczogZmFpbGVkIHRvIHNldCBtaW5vciBmb3IgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSIsCisJCQkgIG1ham9yLCBtaW5vcik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChpbmFjdGl2ZV90YWJsZSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZSgqZG10KSkgeworCQlsb2dfZXJyb3IoIl9kZXBzOiBmYWlsZWQgdG8gc2V0IGluYWN0aXZlIHRhYmxlIGZvciAoJSIgUFJJdTMyICI6JSIgUFJJdTMyICIpIiwKKwkJCSAgbWFqb3IsIG1pbm9yKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKCFkbV90YXNrX3J1bigqZG10KSkgeworCQlsb2dfZXJyb3IoIl9kZXBzOiB0YXNrIHJ1biBmYWlsZWQgZm9yICglIiBQUkl1MzIgIjolIiBQUkl1MzIgIikiLAorCQkJICBtYWpvciwgbWlub3IpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oKmRtdCwgaW5mbykpIHsKKwkJbG9nX2Vycm9yKCJfZGVwczogZmFpbGVkIHRvIGdldCBpbmZvIGZvciAoJSIgUFJJdTMyICI6JSIgUFJJdTMyICIpIiwKKwkJCSAgbWFqb3IsIG1pbm9yKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKCFpbmZvLT5leGlzdHMpIHsKKwkJaWYgKG5hbWUpCisJCQkqbmFtZSA9ICIiOworCQlpZiAodXVpZCkKKwkJCSp1dWlkID0gIiI7CisJCSpkZXBzID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+bWFqb3IgIT0gbWFqb3IpIHsKKwkJCWxvZ19lcnJvcigiSW5jb25zaXN0ZW50IGR0cmVlIG1ham9yIG51bWJlcjogJXUgIT0gJXUiLAorCQkJCSAgbWFqb3IsIGluZm8tPm1ham9yKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCWlmIChpbmZvLT5taW5vciAhPSBtaW5vcikgeworCQkJbG9nX2Vycm9yKCJJbmNvbnNpc3RlbnQgZHRyZWUgbWlub3IgbnVtYmVyOiAldSAhPSAldSIsCisJCQkJICBtaW5vciwgaW5mby0+bWlub3IpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJaWYgKG5hbWUgJiYgISgqbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgZG1fdGFza19nZXRfbmFtZSgqZG10KSkpKSB7CisJCQlsb2dfZXJyb3IoIm5hbWUgcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQlpZiAodXVpZCAmJiAhKCp1dWlkID0gZG1fcG9vbF9zdHJkdXAobWVtLCBkbV90YXNrX2dldF91dWlkKCpkbXQpKSkpIHsKKwkJCWxvZ19lcnJvcigidXVpZCBwb29sX3N0cmR1cCBmYWlsZWQiKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCSpkZXBzID0gZG1fdGFza19nZXRfZGVwcygqZG10KTsKKwl9CisKKwlyZXR1cm4gMTsKKworZmFpbGVkOgorCWRtX3Rhc2tfZGVzdHJveSgqZG10KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlYWN0aXZhdGUgYSBkZXZpY2Ugd2l0aCBpdHMgZGVwZW5kZW5jaWVzIGlmIHRoZSB1dWlkIHByZWZpeCBtYXRjaGVzLgorICovCitzdGF0aWMgaW50IF9pbmZvX2J5X2Rldih1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsIGludCB3aXRoX29wZW5fY291bnQsCisJCQlzdHJ1Y3QgZG1faW5mbyAqaW5mbywgc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCWNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyICoqdXVpZCkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0lORk8pKSkgeworCQlsb2dfZXJyb3IoIl9pbmZvX2J5X2RldjogZG1fdGFzayBjcmVhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV90YXNrX3NldF9tYWpvcihkbXQsIG1ham9yKSB8fCAhZG1fdGFza19zZXRfbWlub3IoZG10LCBtaW5vcikpIHsKKwkJbG9nX2Vycm9yKCJfaW5mb19ieV9kZXY6IEZhaWxlZCB0byBzZXQgZGV2aWNlIG51bWJlciIpOworCQlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF3aXRoX29wZW5fY291bnQgJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkaXNhYmxlIG9wZW5fY291bnQiKTsKKworCWlmICghKHIgPSBkbV90YXNrX3J1bihkbXQpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShyID0gZG1fdGFza19nZXRfaW5mbyhkbXQsIGluZm8pKSkKKwkJZ290b19vdXQ7CisKKwlpZiAobmFtZSAmJiAhKCpuYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBkbV90YXNrX2dldF9uYW1lKGRtdCkpKSkgeworCQlsb2dfZXJyb3IoIm5hbWUgcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXIgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodXVpZCAmJiAhKCp1dWlkID0gZG1fcG9vbF9zdHJkdXAobWVtLCBkbV90YXNrX2dldF91dWlkKGRtdCkpKSkgeworCQlsb2dfZXJyb3IoInV1aWQgcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCXIgPSAwOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9jaGVja19kZXZpY2Vfbm90X2luX3VzZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZG1faW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPmV4aXN0cykKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiBzeXNmcyBpcyBub3QgdXNlZCwgdXNlIG9wZW5fY291bnQgaW5mb3JtYXRpb24gb25seS4gKi8KKwlpZiAoISpkbV9zeXNmc19kaXIoKSkgeworCQlpZiAoaW5mby0+b3Blbl9jb3VudCkgeworCQkJbG9nX2Vycm9yKCJEZXZpY2UgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSBpbiB1c2UiLAorCQkJCSAgbmFtZSwgaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRtX2RldmljZV9oYXNfaG9sZGVycyhpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpKSB7CisJCWxvZ19lcnJvcigiRGV2aWNlICVzICglIiBQUkl1MzIgIjolIiBQUkl1MzIgIikgaXMgdXNlZCAiCisJCQkgICJieSBhbm90aGVyIGRldmljZS4iLCBuYW1lLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fZGV2aWNlX2hhc19tb3VudGVkX2ZzKGluZm8tPm1ham9yLCBpbmZvLT5taW5vcikpIHsKKwkJbG9nX2Vycm9yKCJEZXZpY2UgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSBjb250YWlucyAiCisJCQkgICJhIGZpbGVzeXN0ZW0gaW4gdXNlLiIsIG5hbWUsIGluZm8tPm1ham9yLCBpbmZvLT5taW5vcik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBDaGVjayBpZiBhbGwgcGFyZW50IG5vZGVzIG9mIGdpdmVuIG5vZGUgaGF2ZSBvcGVuX2NvdW50ID09IDAgKi8KK3N0YXRpYyBpbnQgX25vZGVfaGFzX2Nsb3NlZF9wYXJlbnRzKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJCSAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKQoreworCXN0cnVjdCBkbV90cmVlX2xpbmsgKmRsaW5rOworCWNvbnN0IHN0cnVjdCBkbV9pbmZvICpkaW5mbzsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCWNvbnN0IGNoYXIgKnV1aWQ7CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggcGFyZW50cyBvZiB0aGlzIG5vZGUgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGxpbmssICZub2RlLT51c2VkX2J5KSB7CisJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoZGxpbmstPm5vZGUpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIFZHICovCisJCWlmICghX3V1aWRfcHJlZml4X21hdGNoZXModXVpZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQlpZiAoIShkaW5mbyA9IGRtX3RyZWVfbm9kZV9nZXRfaW5mbyhkbGluay0+bm9kZSkpKQorCQkJcmV0dXJuXzA7CS8qIEZJWE1FIElzIHRoaXMgbm9ybWFsPyAqLworCisJCS8qIFJlZnJlc2ggb3Blbl9jb3VudCAqLworCQlpZiAoIV9pbmZvX2J5X2RldihkaW5mby0+bWFqb3IsIGRpbmZvLT5taW5vciwgMSwgJmluZm8sIE5VTEwsIE5VTEwsIE5VTEwpIHx8CisJCSAgICAhaW5mby5leGlzdHMpCisJCQljb250aW51ZTsKKworCQlpZiAoaW5mby5vcGVuX2NvdW50KSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiTm9kZSAlcyAlZDolZCBoYXMgb3Blbl9jb3VudCAlZCIsIHV1aWRfcHJlZml4LAorCQkJCQkgICAgIGRpbmZvLT5tYWpvciwgZGluZm8tPm1pbm9yLCBpbmZvLm9wZW5fY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZGVhY3RpdmF0ZV9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJCSAgICB1aW50MzJfdCAqY29va2llLCB1aW50MTZfdCB1ZGV2X2ZsYWdzLCBpbnQgcmV0cnkpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlpbnQgciA9IDA7CisKKwlsb2dfdmVyYm9zZSgiUmVtb3ZpbmcgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSIsIG5hbWUsIG1ham9yLCBtaW5vcik7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfUkVNT1ZFKSkpIHsKKwkJbG9nX2Vycm9yKCJEZWFjdGl2YXRpb24gZG1fdGFzayBjcmVhdGlvbiBmYWlsZWQgZm9yICVzIiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZG1fdGFza19zZXRfbWFqb3IoZG10LCBtYWpvcikgfHwgIWRtX3Rhc2tfc2V0X21pbm9yKGRtdCwgbWlub3IpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBkZXZpY2UgbnVtYmVyIGZvciAlcyBkZWFjdGl2YXRpb24iLCBuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGlzYWJsZSBvcGVuX2NvdW50Iik7CisKKwlpZiAoY29va2llKQorCQlpZiAoIWRtX3Rhc2tfc2V0X2Nvb2tpZShkbXQsIGNvb2tpZSwgdWRldl9mbGFncykpCisJCQlnb3RvIG91dDsKKworCWlmIChyZXRyeSkKKwkJZG1fdGFza19yZXRyeV9yZW1vdmUoZG10KTsKKworCXIgPSBkbV90YXNrX3J1bihkbXQpOworCisJLyogRklYTUUgVW50aWwga2VybmVsIHJldHVybnMgYWN0dWFsIG5hbWUgc28gZG0taWZhY2UuYyBjYW4gaGFuZGxlIGl0ICovCisJcm1fZGV2X25vZGUobmFtZSwgZG10LT5jb29raWVfc2V0ICYmICEodWRldl9mbGFncyAmIERNX1VERVZfRElTQUJMRV9ETV9SVUxFU19GTEFHKSwKKwkJICAgIGRtdC0+Y29va2llX3NldCAmJiAodWRldl9mbGFncyAmIERNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLKSk7CisKKwkvKiBGSVhNRSBSZW1vdmUgbm9kZSBmcm9tIHRyZWUgb3IgbWFyayBpbnZhbGlkPyAqLworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfbm9kZV9jbGVhcl90YWJsZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwgdWludDE2X3QgdWRldl9mbGFncykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10ID0gTlVMTCwgKmRlcHNfZG10ID0gTlVMTDsKKwlzdHJ1Y3QgZG1faW5mbyAqaW5mbywgZGVwc19pbmZvOworCXN0cnVjdCBkbV9kZXBzICpkZXBzID0gTlVMTDsKKwljb25zdCBjaGFyICpuYW1lLCAqdXVpZDsKKwljb25zdCBjaGFyICpkZWZhdWx0X3V1aWRfcHJlZml4OworCXNpemVfdCBkZWZhdWx0X3V1aWRfcHJlZml4X2xlbjsKKwl1aW50MzJfdCBpOworCWludCByID0gMDsKKworCWlmICghKGluZm8gPSAmZG5vZGUtPmluZm8pKSB7CisJCWxvZ19lcnJvcigiX25vZGVfY2xlYXJfdGFibGUgZmFpbGVkOiBtaXNzaW5nIGluZm8iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobmFtZSA9IGRtX3RyZWVfbm9kZV9nZXRfbmFtZShkbm9kZSkpKSB7CisJCWxvZ19lcnJvcigiX25vZGVfY2xlYXJfdGFibGUgZmFpbGVkOiBtaXNzaW5nIG5hbWUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSXMgdGhlcmUgYSB0YWJsZT8gKi8KKwlpZiAoIWluZm8tPmV4aXN0cyB8fCAhaW5mby0+aW5hY3RpdmVfdGFibGUpCisJCXJldHVybiAxOworCisJLyogR2V0IGRldmljZXMgdXNlZCBieSBpbmFjdGl2ZSB0YWJsZSB0aGF0J3MgYWJvdXQgdG8gYmUgZGVsZXRlZC4gKi8KKwlpZiAoIV9kZXBzKCZkZXBzX2RtdCwgZG5vZGUtPmR0cmVlLT5tZW0sIGluZm8tPm1ham9yLCBpbmZvLT5taW5vciwgTlVMTCwgTlVMTCwgMSwgaW5mbywgJmRlcHMpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIG9idGFpbiBkZXBlbmRlbmNpZXMgZm9yICVzIGJlZm9yZSBjbGVhcmluZyB0YWJsZS4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ZlcmJvc2UoIkNsZWFyaW5nIGluYWN0aXZlIHRhYmxlICVzICglIiBQUkl1MzIgIjolIiBQUkl1MzIgIikiLAorCQkgICAgbmFtZSwgaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKTsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9DTEVBUikpKSB7CisJCWxvZ19lcnJvcigiVGFibGUgY2xlYXIgZG1fdGFzayBjcmVhdGlvbiBmYWlsZWQgZm9yICVzIiwgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1fdGFza19zZXRfbWFqb3IoZG10LCBpbmZvLT5tYWpvcikgfHwKKwkgICAgIWRtX3Rhc2tfc2V0X21pbm9yKGRtdCwgaW5mby0+bWlub3IpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBkZXZpY2UgbnVtYmVyIGZvciAlcyB0YWJsZSBjbGVhciIsIG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlyID0gZG1fdGFza19ydW4oZG10KTsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsIGluZm8pKSB7CisJCWxvZ19lcnJvcigiX25vZGVfY2xlYXJfdGFibGUgZmFpbGVkOiBpbmZvIG1pc3NpbmcgYWZ0ZXIgcnVubmluZyB0YXNrIGZvciAlcyIsIG5hbWUpOworCQlyID0gMDsKKwl9CisKKwlpZiAoIXIgfHwgIWRlcHMpCisJCWdvdG9fb3V0OworCisJLyoKKwkgKiBSZW1vdmUgKGluY29tcGxldGUpIGRldmljZXMgdGhhdCB0aGUgaW5hY3RpdmUgdGFibGUgcmVmZXJyZWQgdG8gYnV0CisJICogd2hpY2ggYXJlIG5vdCBpbiB0aGUgdHJlZSwgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYW5kIGRvbid0IGhhdmUgYSBsaXZlCisJICogdGFibGUuCisJICovCisJZGVmYXVsdF91dWlkX3ByZWZpeCA9IGRtX3V1aWRfcHJlZml4KCk7CisJZGVmYXVsdF91dWlkX3ByZWZpeF9sZW4gPSBzdHJsZW4oZGVmYXVsdF91dWlkX3ByZWZpeCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVwcy0+Y291bnQ7IGkrKykgeworCQkvKiBJZiBhbHJlYWR5IGluIHRyZWUsIGFzc3VtZSBpdCdzIHVuZGVyIGNvbnRyb2wgKi8KKwkJaWYgKF9maW5kX2RtX3RyZWVfbm9kZShkbm9kZS0+ZHRyZWUsIE1BSk9SKGRlcHMtPmRldmljZVtpXSksIE1JTk9SKGRlcHMtPmRldmljZVtpXSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFfaW5mb19ieV9kZXYoTUFKT1IoZGVwcy0+ZGV2aWNlW2ldKSwgTUlOT1IoZGVwcy0+ZGV2aWNlW2ldKSwgMSwKKwkJCQkgICZkZXBzX2luZm8sIGRub2RlLT5kdHJlZS0+bWVtLCAmbmFtZSwgJnV1aWQpKQorCQkJY29udGludWU7CisKKwkJLyogUHJvY2VlZCBpZiBkZXZpY2UgaXMgYW4gJ29ycGhhbicgLSB1bnJlZmVyZW5jZWQgYW5kIHdpdGhvdXQgYSBsaXZlIHRhYmxlLiAqLworCQlpZiAoIWRlcHNfaW5mby5leGlzdHMgfHwgZGVwc19pbmZvLmxpdmVfdGFibGUgfHwgZGVwc19pbmZvLm9wZW5fY291bnQpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybmNtcCh1dWlkLCBkZWZhdWx0X3V1aWRfcHJlZml4LCBkZWZhdWx0X3V1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQkvKiBSZW1vdmUgZGV2aWNlLiAqLworCQlpZiAoIV9kZWFjdGl2YXRlX25vZGUobmFtZSwgZGVwc19pbmZvLm1ham9yLCBkZXBzX2luZm8ubWlub3IsICZkbm9kZS0+ZHRyZWUtPmNvb2tpZSwgdWRldl9mbGFncywgMCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRlYWN0aXZhdGUgbm8tbG9uZ2VyLXVzZWQgZGV2aWNlICVzICglIgorCQkJCSAgUFJJdTMyICI6JSIgUFJJdTMyICIpIiwgbmFtZSwgZGVwc19pbmZvLm1ham9yLCBkZXBzX2luZm8ubWlub3IpOworCQl9IGVsc2UgaWYgKGRlcHNfaW5mby5zdXNwZW5kZWQpCisJCQlkZWNfc3VzcGVuZGVkKCk7CisJfQorCitvdXQ6CisJaWYgKGRtdCkKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlpZiAoZGVwc19kbXQpCisJCWRtX3Rhc2tfZGVzdHJveShkZXBzX2RtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IGRtX3RyZWVfbm9kZSAqZG1fdHJlZV9hZGRfbmV3X2Rldl93aXRoX3VkZXZfZmxhZ3Moc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJCSBjb25zdCBjaGFyICp1dWlkLAorCQkJCQkJCSB1aW50MzJfdCBtYWpvciwKKwkJCQkJCQkgdWludDMyX3QgbWlub3IsCisJCQkJCQkJIGludCByZWFkX29ubHksCisJCQkJCQkJIGludCBjbGVhcl9pbmFjdGl2ZSwKKwkJCQkJCQkgdm9pZCAqY29udGV4dCwKKwkJCQkJCQkgdWludDE2X3QgdWRldl9mbGFncykKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZTsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvID0geyAwIH07CisJY29uc3QgY2hhciAqbmFtZTI7CisJY29uc3QgY2hhciAqdXVpZDI7CisKKwlpZiAoIW5hbWUgfHwgIXV1aWQpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgYWRkIGRldmljZSB3aXRob3V0IG5hbWUgYW5kIHV1aWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERvIHdlIG5lZWQgdG8gYWRkIG5vZGUgdG8gdHJlZT8gKi8KKwlpZiAoIShkbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQoZHRyZWUsIHV1aWQpKSkgeworCQlpZiAoIShuYW1lMiA9IGRtX3Bvb2xfc3RyZHVwKGR0cmVlLT5tZW0sIG5hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJuYW1lIHBvb2xfc3RyZHVwIGZhaWxlZCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKCEodXVpZDIgPSBkbV9wb29sX3N0cmR1cChkdHJlZS0+bWVtLCB1dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigidXVpZCBwb29sX3N0cmR1cCBmYWlsZWQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKCEoZG5vZGUgPSBfY3JlYXRlX2RtX3RyZWVfbm9kZShkdHJlZSwgbmFtZTIsIHV1aWQyLCAmaW5mbywKKwkJCQkJCSAgIGNvbnRleHQsIDApKSkKKwkJCXJldHVybl9OVUxMOworCisJCS8qIEF0dGFjaCB0byByb290IG5vZGUgdW50aWwgYSB0YWJsZSBpcyBzdXBwbGllZCAqLworCQlpZiAoIV9hZGRfdG9fdG9wbGV2ZWwoZG5vZGUpIHx8ICFfYWRkX3RvX2JvdHRvbWxldmVsKGRub2RlKSkKKwkJCXJldHVybl9OVUxMOworCisJCWRub2RlLT5wcm9wcy5tYWpvciA9IG1ham9yOworCQlkbm9kZS0+cHJvcHMubWlub3IgPSBtaW5vcjsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBkbm9kZS0+bmFtZSkpIHsKKwkJLyogRG8gd2UgbmVlZCB0byByZW5hbWUgbm9kZT8gKi8KKwkJaWYgKCEoZG5vZGUtPnByb3BzLm5ld19uYW1lID0gZG1fcG9vbF9zdHJkdXAoZHRyZWUtPm1lbSwgbmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoIm5hbWUgcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWRub2RlLT5wcm9wcy5yZWFkX29ubHkgPSByZWFkX29ubHkgPyAxIDogMDsKKwlkbm9kZS0+cHJvcHMucmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfQVVUTzsKKwlkbm9kZS0+cHJvcHMucmVhZF9haGVhZF9mbGFncyA9IDA7CisKKwlpZiAoY2xlYXJfaW5hY3RpdmUgJiYgIV9ub2RlX2NsZWFyX3RhYmxlKGRub2RlLCB1ZGV2X2ZsYWdzKSkKKwkJcmV0dXJuX05VTEw7CisKKwlkbm9kZS0+Y29udGV4dCA9IGNvbnRleHQ7CisJZG5vZGUtPnVkZXZfZmxhZ3MgPSB1ZGV2X2ZsYWdzOworCisJcmV0dXJuIGRub2RlOworfQorCitzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbV90cmVlX2FkZF9uZXdfZGV2KHN0cnVjdCBkbV90cmVlICpkdHJlZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIGNvbnN0IGNoYXIgKnV1aWQsIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJCQkJIGludCByZWFkX29ubHksIGludCBjbGVhcl9pbmFjdGl2ZSwgdm9pZCAqY29udGV4dCkKK3sKKwlyZXR1cm4gZG1fdHJlZV9hZGRfbmV3X2Rldl93aXRoX3VkZXZfZmxhZ3MoZHRyZWUsIG5hbWUsIHV1aWQsIG1ham9yLCBtaW5vciwKKwkJCQkJCSAgIHJlYWRfb25seSwgY2xlYXJfaW5hY3RpdmUsIGNvbnRleHQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGRtX3RyZWVfbm9kZSAqX2FkZF9kZXYoc3RydWN0IGRtX3RyZWUgKmR0cmVlLAorCQkJCSAgICAgc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50LAorCQkJCSAgICAgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLAorCQkJCSAgICAgdWludDE2X3QgdWRldl9mbGFncywKKwkJCQkgICAgIGludCBpbXBsaWNpdF9kZXBzKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQgPSBOVUxMOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJc3RydWN0IGRtX2RlcHMgKmRlcHMgPSBOVUxMOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnV1aWQgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUgPSBOVUxMOworCXVpbnQzMl90IGk7CisJaW50IG5ldyA9IDA7CisKKwkvKiBBbHJlYWR5IGluIHRyZWU/ICovCisJaWYgKCEobm9kZSA9IF9maW5kX2RtX3RyZWVfbm9kZShkdHJlZSwgbWFqb3IsIG1pbm9yKSkpIHsKKwkJaWYgKCFfZGVwcygmZG10LCBkdHJlZS0+bWVtLCBtYWpvciwgbWlub3IsICZuYW1lLCAmdXVpZCwgMCwgJmluZm8sICZkZXBzKSkKKwkJCXJldHVybl9OVUxMOworCisJCWlmICghKG5vZGUgPSBfY3JlYXRlX2RtX3RyZWVfbm9kZShkdHJlZSwgbmFtZSwgdXVpZCwgJmluZm8sCisJCQkJCQkgIE5VTEwsIHVkZXZfZmxhZ3MpKSkKKwkJCWdvdG9fb3V0OworCQluZXcgPSAxOworCQlub2RlLT5pbXBsaWNpdF9kZXBzID0gaW1wbGljaXRfZGVwczsKKwl9IGVsc2UgaWYgKCFpbXBsaWNpdF9kZXBzICYmIG5vZGUtPmltcGxpY2l0X2RlcHMpIHsKKwkJbm9kZS0+dWRldl9mbGFncyA9IHVkZXZfZmxhZ3M7CisJCW5vZGUtPmltcGxpY2l0X2RlcHMgPSAwOworCX0KKworCWlmICghX2xpbmtfdHJlZV9ub2RlcyhwYXJlbnQsIG5vZGUpKSB7CisJCW5vZGUgPSBOVUxMOworCQlnb3RvX291dDsKKwl9CisKKwkvKiBJZiBub2RlIHdhcyBhbHJlYWR5IGluIHRyZWUsIG5vIG5lZWQgdG8gcmVjdXJzZS4gKi8KKwlpZiAoIW5ldykKKwkJZ290byBvdXQ7CisKKwkvKiBDYW4ndCByZWN1cnNlIGlmIG5vdCBhIG1hcHBlZCBkZXZpY2Ugb3IgdGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcyAqLworCWlmICghbm9kZS0+aW5mby5leGlzdHMgfHwgIWRlcHMgfHwgIWRlcHMtPmNvdW50KSB7CisJCWlmICghX2FkZF90b19ib3R0b21sZXZlbChub2RlKSkgeworCQkJc3RhY2s7CisJCQlub2RlID0gTlVMTDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBBZGQgZGVwZW5kZW5jaWVzIHRvIHRyZWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGVwcy0+Y291bnQ7IGkrKykKKwkJLyogSW1wbGljaXQgZGV2aWNlcyBhcmUgYnkgZGVmYXVsdCB0ZW1wb3JhcnkgKi8KKwkJaWYgKCFfYWRkX2RldihkdHJlZSwgbm9kZSwgTUFKT1IoZGVwcy0+ZGV2aWNlW2ldKSwKKwkJCSAgICAgIE1JTk9SKGRlcHMtPmRldmljZVtpXSksIHVkZXZfZmxhZ3MgfAorCQkJICAgICAgRE1fVURFVl9ESVNBQkxFX1NVQlNZU1RFTV9SVUxFU19GTEFHIHwKKwkJCSAgICAgIERNX1VERVZfRElTQUJMRV9ESVNLX1JVTEVTX0ZMQUcgfAorCQkJICAgICAgRE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUcsIDEpKSB7CisJCQlub2RlID0gTlVMTDsKKwkJCWdvdG9fb3V0OworCQl9CisKK291dDoKKwlpZiAoZG10KQorCQlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiBub2RlOworfQorCitpbnQgZG1fdHJlZV9hZGRfZGV2KHN0cnVjdCBkbV90cmVlICpkdHJlZSwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKQoreworCXJldHVybiBfYWRkX2RldihkdHJlZSwgJmR0cmVlLT5yb290LCBtYWpvciwgbWlub3IsIDAsIDApID8gMSA6IDA7Cit9CisKK2ludCBkbV90cmVlX2FkZF9kZXZfd2l0aF91ZGV2X2ZsYWdzKHN0cnVjdCBkbV90cmVlICpkdHJlZSwgdWludDMyX3QgbWFqb3IsCisJCQkJICAgIHVpbnQzMl90IG1pbm9yLCB1aW50MTZfdCB1ZGV2X2ZsYWdzKQoreworCXJldHVybiBfYWRkX2RldihkdHJlZSwgJmR0cmVlLT5yb290LCBtYWpvciwgbWlub3IsIHVkZXZfZmxhZ3MsIDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX3JlbmFtZV9ub2RlKGNvbnN0IGNoYXIgKm9sZF9uYW1lLCBjb25zdCBjaGFyICpuZXdfbmFtZSwgdWludDMyX3QgbWFqb3IsCisJCQl1aW50MzJfdCBtaW5vciwgdWludDMyX3QgKmNvb2tpZSwgdWludDE2X3QgdWRldl9mbGFncykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByID0gMDsKKworCWxvZ192ZXJib3NlKCJSZW5hbWluZyAlcyAoJSIgUFJJdTMyICI6JSIgUFJJdTMyICIpIHRvICVzIiwgb2xkX25hbWUsIG1ham9yLCBtaW5vciwgbmV3X25hbWUpOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1JFTkFNRSkpKSB7CisJCWxvZ19lcnJvcigiUmVuYW1lIGRtX3Rhc2sgY3JlYXRpb24gZmFpbGVkIGZvciAlcyIsIG9sZF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV90YXNrX3NldF9uYW1lKGRtdCwgb2xkX25hbWUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBuYW1lIGZvciAlcyByZW5hbWUuIiwgb2xkX25hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X25ld25hbWUoZG10LCBuZXdfbmFtZSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGlzYWJsZSBvcGVuX2NvdW50Iik7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X2Nvb2tpZShkbXQsIGNvb2tpZSwgdWRldl9mbGFncykpCisJCWdvdG8gb3V0OworCisJciA9IGRtX3Rhc2tfcnVuKGRtdCk7CisKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCisvKiBGSVhNRSBNZXJnZSB3aXRoIF9zdXNwZW5kX25vZGU/ICovCitzdGF0aWMgaW50IF9yZXN1bWVfbm9kZShjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IsCisJCQl1aW50MzJfdCByZWFkX2FoZWFkLCB1aW50MzJfdCByZWFkX2FoZWFkX2ZsYWdzLAorCQkJc3RydWN0IGRtX2luZm8gKm5ld2luZm8sIHVpbnQzMl90ICpjb29raWUsCisJCQl1aW50MTZfdCB1ZGV2X2ZsYWdzLCBpbnQgYWxyZWFkeV9zdXNwZW5kZWQpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlpbnQgciA9IDA7CisKKwlsb2dfdmVyYm9zZSgiUmVzdW1pbmcgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSIsIG5hbWUsIG1ham9yLCBtaW5vcik7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfUkVTVU1FKSkpIHsKKwkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlN1c3BlbmQgZG1fdGFzayBjcmVhdGlvbiBmYWlsZWQgZm9yICVzLiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGSVhNRSBLZXJuZWwgc2hvdWxkIGZpbGwgaW4gbmFtZSBvbiByZXR1cm4gaW5zdGVhZCAqLworCWlmICghZG1fdGFza19zZXRfbmFtZShkbXQsIG5hbWUpKSB7CisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJGYWlsZWQgdG8gc2V0IGRldmljZSBuYW1lIGZvciAlcyByZXN1bXB0aW9uLiIsIG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21ham9yKGRtdCwgbWFqb3IpIHx8ICFkbV90YXNrX3NldF9taW5vcihkbXQsIG1pbm9yKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZXQgZGV2aWNlIG51bWJlciBmb3IgJXMgcmVzdW1wdGlvbi4iLCBuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGlzYWJsZSBvcGVuX2NvdW50Iik7CisKKwlpZiAoIWRtX3Rhc2tfc2V0X3JlYWRfYWhlYWQoZG10LCByZWFkX2FoZWFkLCByZWFkX2FoZWFkX2ZsYWdzKSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0IHJlYWQgYWhlYWQiKTsKKworCWlmICghZG1fdGFza19zZXRfY29va2llKGRtdCwgY29va2llLCB1ZGV2X2ZsYWdzKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShyID0gZG1fdGFza19ydW4oZG10KSkpCisJCWdvdG9fb3V0OworCisJaWYgKGFscmVhZHlfc3VzcGVuZGVkKQorCQlkZWNfc3VzcGVuZGVkKCk7CisKKwlpZiAoIShyID0gZG1fdGFza19nZXRfaW5mbyhkbXQsIG5ld2luZm8pKSkKKwkJc3RhY2s7CisKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zdXNwZW5kX25vZGUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yLAorCQkJIGludCBza2lwX2xvY2tmcywgaW50IG5vX2ZsdXNoLCBzdHJ1Y3QgZG1faW5mbyAqbmV3aW5mbykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByOworCisJbG9nX3ZlcmJvc2UoIlN1c3BlbmRpbmcgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKSVzJXMiLAorCQkgICAgbmFtZSwgbWFqb3IsIG1pbm9yLAorCQkgICAgc2tpcF9sb2NrZnMgPyAiIiA6ICIgd2l0aCBmaWxlc3lzdGVtIHN5bmMiLAorCQkgICAgbm9fZmx1c2ggPyAiIiA6ICIgd2l0aCBkZXZpY2UgZmx1c2giKTsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9TVVNQRU5EKSkpIHsKKwkJbG9nX2Vycm9yKCJTdXNwZW5kIGRtX3Rhc2sgY3JlYXRpb24gZmFpbGVkIGZvciAlcyIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21ham9yKGRtdCwgbWFqb3IpIHx8ICFkbV90YXNrX3NldF9taW5vcihkbXQsIG1pbm9yKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZXQgZGV2aWNlIG51bWJlciBmb3IgJXMgc3VzcGVuc2lvbi4iLCBuYW1lKTsKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZG1fdGFza19ub19vcGVuX2NvdW50KGRtdCkpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRpc2FibGUgb3Blbl9jb3VudCIpOworCisJaWYgKHNraXBfbG9ja2ZzICYmICFkbV90YXNrX3NraXBfbG9ja2ZzKGRtdCkpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBza2lwX2xvY2tmcyBmbGFnLiIpOworCisJaWYgKG5vX2ZsdXNoICYmICFkbV90YXNrX25vX2ZsdXNoKGRtdCkpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBub19mbHVzaCBmbGFnLiIpOworCisJaWYgKChyID0gZG1fdGFza19ydW4oZG10KSkpIHsKKwkJaW5jX3N1c3BlbmRlZCgpOworCQlyID0gZG1fdGFza19nZXRfaW5mbyhkbXQsIG5ld2luZm8pOworCX0KKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3RoaW5fcG9vbF9nZXRfc3RhdHVzKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJCSBzdHJ1Y3QgZG1fc3RhdHVzX3RoaW5fcG9vbCAqcykKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByID0gMDsKKwl1aW50NjRfdCBzdGFydCwgbGVuZ3RoOworCWNoYXIgKnR5cGUgPSBOVUxMOworCWNoYXIgKnBhcmFtcyA9IE5VTEw7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfU1RBVFVTKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3NldF9tYWpvcihkbXQsIGRub2RlLT5pbmZvLm1ham9yKSB8fAorCSAgICAhZG1fdGFza19zZXRfbWlub3IoZG10LCBkbm9kZS0+aW5mby5taW5vcikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0IG1ham9yIG1pbm9yLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfbm9fZmx1c2goZG10KSkKKwkJbG9nX3dhcm4oIkNhbid0IHNldCBub19mbHVzaCBmbGFnLiIpOyAvKiBOb24gZmF0YWwgKi8KKworCWlmICghZG1fdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlkbV9nZXRfbmV4dF90YXJnZXQoZG10LCBOVUxMLCAmc3RhcnQsICZsZW5ndGgsICZ0eXBlLCAmcGFyYW1zKTsKKworCWlmICh0eXBlICYmIChzdHJjbXAodHlwZSwgInRoaW4tcG9vbCIpICE9IDApKSB7CisJCWxvZ19lcnJvcigiRXhwZWN0ZWQgdGhpbi1wb29sIHRhcmdldCBmb3IgJWQ6JWQgYW5kIGdvdCAlcy4iLAorCQkJICBkbm9kZS0+aW5mby5tYWpvciwgZG5vZGUtPmluZm8ubWlub3IsIHR5cGUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXBhcnNlX3RoaW5fcG9vbF9zdGF0dXMocGFyYW1zLCBzKSkKKwkJZ290b19vdXQ7CisKKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiRm91bmQgdHJhbnNhY3Rpb24gaWQgJSIgUFJJdTY0ICIgZm9yIHRoaW4gcG9vbCAlcyAiCisJCQkgICAgICJ3aXRoIHN0YXR1cyBsaW5lOiAlcy4iLAorCQkJICAgICBzLT50cmFuc2FjdGlvbl9pZCwgX25vZGVfbmFtZShkbm9kZSksIHBhcmFtcyk7CisKKwlyID0gMTsKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF90aGluX3Bvb2xfbm9kZV9tZXNzYWdlKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLCBzdHJ1Y3QgdGhpbl9tZXNzYWdlICp0bSkKK3sKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV90aGluX21lc3NhZ2UgKm0gPSAmdG0tPm1lc3NhZ2U7CisJY2hhciBidWZbNjRdOworCWludCByOworCisJc3dpdGNoIChtLT50eXBlKSB7CisJY2FzZSBETV9USElOX01FU1NBR0VfQ1JFQVRFX1NOQVA6CisJCXIgPSBkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiY3JlYXRlX3NuYXAgJXUgJXUiLAorCQkJCW0tPnUubV9jcmVhdGVfc25hcC5kZXZpY2VfaWQsCisJCQkJbS0+dS5tX2NyZWF0ZV9zbmFwLm9yaWdpbl9pZCk7CisJCWJyZWFrOworCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOOgorCQlyID0gZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImNyZWF0ZV90aGluICV1IiwKKwkJCQltLT51Lm1fY3JlYXRlX3RoaW4uZGV2aWNlX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBETV9USElOX01FU1NBR0VfREVMRVRFOgorCQlyID0gZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImRlbGV0ZSAldSIsCisJCQkJbS0+dS5tX2RlbGV0ZS5kZXZpY2VfaWQpOworCQlicmVhazsKKwljYXNlIERNX1RISU5fTUVTU0FHRV9TRVRfVFJBTlNBQ1RJT05fSUQ6CisJCXIgPSBkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSJzZXRfdHJhbnNhY3Rpb25faWQgJSIgUFJJdTY0ICIgJSIgUFJJdTY0LAorCQkJCW0tPnUubV9zZXRfdHJhbnNhY3Rpb25faWQuY3VycmVudF9pZCwKKwkJCQltLT51Lm1fc2V0X3RyYW5zYWN0aW9uX2lkLm5ld19pZCk7CisJCWJyZWFrOworCWNhc2UgRE1fVEhJTl9NRVNTQUdFX1JFU0VSVkVfTUVUQURBVEFfU05BUDogLyogdGFyZ2V0IHZzbiAxLjEgKi8KKwkJciA9IGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJyZXNlcnZlX21ldGFkYXRhX3NuYXAiKTsKKwkJYnJlYWs7CisJY2FzZSBETV9USElOX01FU1NBR0VfUkVMRUFTRV9NRVRBREFUQV9TTkFQOiAvKiB0YXJnZXQgdnNuIDEuMSAqLworCQlyID0gZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInJlbGVhc2VfbWV0YWRhdGFfc25hcCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLTE7CisJfQorCisJaWYgKHIgPCAwKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHByZXBhcmUgbWVzc2FnZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJciA9IDA7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfVEFSR0VUX01TRykpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fdGFza19zZXRfbWFqb3IoZG10LCBkbm9kZS0+aW5mby5tYWpvcikgfHwKKwkgICAgIWRtX3Rhc2tfc2V0X21pbm9yKGRtdCwgZG5vZGUtPmluZm8ubWlub3IpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBtZXNzYWdlIG1ham9yIG1pbm9yLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21lc3NhZ2UoZG10LCBidWYpKQorCQlnb3RvX291dDsKKworCS8qIEludGVybmFsIGZ1bmN0aW9uYWxpdHkgb2YgZG1fdGFzayAqLworCWRtdC0+ZXhwZWN0ZWRfZXJybm8gPSB0bS0+ZXhwZWN0ZWRfZXJybm87CisKKwlpZiAoIWRtX3Rhc2tfcnVuKGRtdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcHJvY2VzcyB0aGluIHBvb2wgbWVzc2FnZSBcIiVzXCIuIiwgYnVmKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworLyogRm9yIHByZWxvYWQgcGFzcyBvbmx5IHZhbGlkYXRlIHBvb2wncyB0cmFuc2FjdGlvbl9pZCAqLworc3RhdGljIGludCBfbm9kZV9zZW5kX21lc3NhZ2VzKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICAgIHNpemVfdCB1dWlkX3ByZWZpeF9sZW4sCisJCQkgICAgICAgaW50IHNlbmQpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCXN0cnVjdCB0aGluX21lc3NhZ2UgKnRtc2c7CisJc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgc3RwID0geyAwIH07CisJY29uc3QgY2hhciAqdXVpZDsKKwlpbnQgaGF2ZV9tZXNzYWdlczsKKworCWlmICghZG5vZGUtPmluZm8uZXhpc3RzIHx8IChkbV9saXN0X3NpemUoJmRub2RlLT5wcm9wcy5zZWdzKSAhPSAxKSkKKwkJcmV0dXJuIDE7CisKKwlzZWcgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9sYXN0KCZkbm9kZS0+cHJvcHMuc2VncyksIHN0cnVjdCBsb2FkX3NlZ21lbnQpOworCWlmIChzZWctPnR5cGUgIT0gU0VHX1RISU5fUE9PTCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoISh1dWlkID0gZG1fdHJlZV9ub2RlX2dldF91dWlkKGRub2RlKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfdXVpZF9wcmVmaXhfbWF0Y2hlcyh1dWlkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuKSkgeworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiVVVJRCBcIiVzXCIgZG9lcyBub3QgbWF0Y2guIiwgdXVpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmICghX3RoaW5fcG9vbF9nZXRfc3RhdHVzKGRub2RlLCAmc3RwKSkKKwkJcmV0dXJuXzA7CisKKwloYXZlX21lc3NhZ2VzID0gIWRtX2xpc3RfZW1wdHkoJnNlZy0+dGhpbl9tZXNzYWdlcykgPyAxIDogMDsKKwlpZiAoc3RwLnRyYW5zYWN0aW9uX2lkID09IHNlZy0+dHJhbnNhY3Rpb25faWQpIHsKKwkJZG5vZGUtPnByb3BzLnNlbmRfbWVzc2FnZXMgPSAwOyAvKiBtZXNzYWdlcyBhbHJlYWR5IGNvbW1pdHRlZCAqLworCQlpZiAoaGF2ZV9tZXNzYWdlcykKKwkJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJUaGluIHBvb2wgJXMgdHJhbnNhY3Rpb25faWQgbWF0Y2hlcyAlIgorCQkJCQkgICAgIFBSSXU2NCAiLCBza2lwcGluZyBtZXNzYWdlcy4iLAorCQkJCQkgICAgIF9ub2RlX25hbWUoZG5vZGUpLCBzdHAudHJhbnNhY3Rpb25faWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBFcnJvciBpZiB0aGVyZSBhcmUgbm8gc3RhY2tlZCBtZXNzYWdlcyBvciBpZCBtaXNtYXRjaGVzICovCisJaWYgKChzdHAudHJhbnNhY3Rpb25faWQgKyAxKSAhPSBzZWctPnRyYW5zYWN0aW9uX2lkKSB7CisJCWxvZ19lcnJvcigiVGhpbiBwb29sICVzIHRyYW5zYWN0aW9uX2lkIGlzICUiIFBSSXU2NCAiLCB3aGlsZSBleHBlY3RlZCAlIiBQUkl1NjQgIi4iLAorCQkJICBfbm9kZV9uYW1lKGRub2RlKSwgc3RwLnRyYW5zYWN0aW9uX2lkLCBzZWctPnRyYW5zYWN0aW9uX2lkIC0gaGF2ZV9tZXNzYWdlcyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaGF2ZV9tZXNzYWdlcyB8fCAhc2VuZCkKKwkJcmV0dXJuIDE7IC8qIHRyYW5zYWN0aW9uX2lkIGlzIG1hdGNoaW5nICovCisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModG1zZywgJnNlZy0+dGhpbl9tZXNzYWdlcykgeworCQlpZiAoIShfdGhpbl9wb29sX25vZGVfbWVzc2FnZShkbm9kZSwgdG1zZykpKQorCQkJcmV0dXJuXzA7CisJCWlmICh0bXNnLT5tZXNzYWdlLnR5cGUgPT0gRE1fVEhJTl9NRVNTQUdFX1NFVF9UUkFOU0FDVElPTl9JRCkgeworCQkJaWYgKCFfdGhpbl9wb29sX2dldF9zdGF0dXMoZG5vZGUsICZzdHApKQorCQkJCXJldHVybl8wOworCQkJaWYgKHN0cC50cmFuc2FjdGlvbl9pZCAhPSB0bXNnLT5tZXNzYWdlLnUubV9zZXRfdHJhbnNhY3Rpb25faWQubmV3X2lkKSB7CisJCQkJbG9nX2Vycm9yKCJUaGluIHBvb2wgJXMgdHJhbnNhY3Rpb25faWQgaXMgJSIgUFJJdTY0CisJCQkJCSAgIiBhbmQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgICUiIFBSSXU2NCAiLiIsCisJCQkJCSAgX25vZGVfbmFtZShkbm9kZSksIHN0cC50cmFuc2FjdGlvbl9pZCwKKwkJCQkJICB0bXNnLT5tZXNzYWdlLnUubV9zZXRfdHJhbnNhY3Rpb25faWQubmV3X2lkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCWRub2RlLT5wcm9wcy5zZW5kX21lc3NhZ2VzID0gMDsgLyogbWVzc2FnZXMgcG9zdGVkICovCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZJWE1FIERvbid0IGF0dGVtcHQgdG8gZGVhY3RpdmF0ZSBrbm93biBpbnRlcm5hbCBkZXBlbmRlbmNpZXMuCisgKi8KK3N0YXRpYyBpbnQgX2RtX3RyZWVfZGVhY3RpdmF0ZV9jaGlsZHJlbihzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkJY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsCisJCQkJCXNpemVfdCB1dWlkX3ByZWZpeF9sZW4sCisJCQkJCXVuc2lnbmVkIGxldmVsKQoreworCWludCByID0gMTsKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkID0gZG5vZGU7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqZGluZm87CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp1dWlkOworCisJd2hpbGUgKChjaGlsZCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCBkbm9kZSwgMCkpKSB7CisJCWlmICghKGRpbmZvID0gZG1fdHJlZV9ub2RlX2dldF9pbmZvKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShuYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISh1dWlkID0gZG1fdHJlZV9ub2RlX2dldF91dWlkKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBWRyAqLworCQlpZiAoIV91dWlkX3ByZWZpeF9tYXRjaGVzKHV1aWQsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJY29udGludWU7CisKKwkJLyogUmVmcmVzaCBvcGVuX2NvdW50ICovCisJCWlmICghX2luZm9fYnlfZGV2KGRpbmZvLT5tYWpvciwgZGluZm8tPm1pbm9yLCAxLCAmaW5mbywgTlVMTCwgTlVMTCwgTlVMTCkgfHwKKwkJICAgICFpbmZvLmV4aXN0cykKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbmZvLm9wZW5fY291bnQpIHsKKwkJCS8qIFNraXAgaW50ZXJuYWwgbm9uLXRvcGxldmVsIG9wZW5lZCBub2RlcyAqLworCQkJaWYgKGxldmVsKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBXaGVuIHJldHJ5IGlzIG5vdCBhbGxvd2VkLCBlcnJvciAqLworCQkJaWYgKCFjaGlsZC0+ZHRyZWUtPnJldHJ5X3JlbW92ZSkgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgb3BlbiAlcyAoJSIgUFJJdTMyCisJCQkJCSAgIjolIiBQUkl1MzIgIikiLCBuYW1lLCBpbmZvLm1ham9yLCBpbmZvLm1pbm9yKTsKKwkJCQlyID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQ2hlY2sgdG9wbGV2ZWwgbm9kZSBmb3IgaG9sZGVycy9tb3VudGVkIGZzICovCisJCQlpZiAoIV9jaGVja19kZXZpY2Vfbm90X2luX3VzZShuYW1lLCAmaW5mbykpIHsKKwkJCQlzdGFjazsKKwkJCQlyID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIEdvIG9uIHdpdGggcmV0cnkgKi8KKwkJfQorCisJCS8qIEFsc28gY2hlY2tpbmcgb3Blbl9jb3VudCBpbiBwYXJlbnQgbm9kZXMgb2YgcHJlc3VzcGVuZF9ub2RlICovCisJCWlmICgoY2hpbGQtPnByZXN1c3BlbmRfbm9kZSAmJgorCQkgICAgICFfbm9kZV9oYXNfY2xvc2VkX3BhcmVudHMoY2hpbGQtPnByZXN1c3BlbmRfbm9kZSwKKwkJCQkJICAgICAgIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKSkgeworCQkJLyogT25seSByZXBvcnQgZXJyb3IgZnJvbSAobGlrZWx5IG5vbi1pbnRlcm5hbCkgZGVwZW5kZW5jeSBhdCB0b3AgbGV2ZWwgKi8KKwkJCWlmICghbGV2ZWwpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZWFjdGl2YXRlIG9wZW4gJXMgKCUiIFBSSXUzMgorCQkJCQkgICI6JSIgUFJJdTMyICIpIiwgbmFtZSwgaW5mby5tYWpvciwKKwkJCQkgIAlpbmZvLm1pbm9yKTsKKwkJCQlyID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogU3VzcGVuZCBjaGlsZCBub2RlIGZpcnN0IGlmIHJlcXVlc3RlZCAqLworCQlpZiAoY2hpbGQtPnByZXN1c3BlbmRfbm9kZSAmJgorCQkgICAgIWRtX3RyZWVfc3VzcGVuZF9jaGlsZHJlbihjaGlsZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQlpZiAoIV9kZWFjdGl2YXRlX25vZGUobmFtZSwgaW5mby5tYWpvciwgaW5mby5taW5vciwKKwkJCQkgICAgICAmY2hpbGQtPmR0cmVlLT5jb29raWUsIGNoaWxkLT51ZGV2X2ZsYWdzLAorCQkJCSAgICAgIChsZXZlbCA9PSAwKSA/IGNoaWxkLT5kdHJlZS0+cmV0cnlfcmVtb3ZlIDogMCkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgJXMgKCUiIFBSSXUzMgorCQkJCSAgIjolIiBQUkl1MzIgIikiLCBuYW1lLCBpbmZvLm1ham9yLAorCQkJCSAgaW5mby5taW5vcik7CisJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGluZm8uc3VzcGVuZGVkICYmIGluZm8ubGl2ZV90YWJsZSkKKwkJCWRlY19zdXNwZW5kZWQoKTsKKworCQlpZiAoY2hpbGQtPmNhbGxiYWNrICYmCisJCSAgICAhY2hpbGQtPmNhbGxiYWNrKGNoaWxkLCBETV9OT0RFX0NBTExCQUNLX0RFQUNUSVZBVEVELAorCQkJCSAgICAgY2hpbGQtPmNhbGxiYWNrX2RhdGEpKQorCQkJc3RhY2s7CisJCQkvLyBGSVhNRTogV2UgbmVlZCB0byBsZXQgbHZyZW1vdmUgcGFzcywKKwkJCS8vIHNvIGZvciBub3cgZGVhY3RpdmF0aW9uIGlnbm9yZXMgY2hlY2sgcmVzdWx0CisJCQkvL3IgPSAwOyAvLyBGSVhNRTogX25vZGVfY2xlYXJfdGFibGUoKSB3aXRob3V0IGNhbGxiYWNrID8KKworCQlpZiAoZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgMCkgJiYKKwkJICAgICFfZG1fdHJlZV9kZWFjdGl2YXRlX2NoaWxkcmVuKGNoaWxkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuLCBsZXZlbCArIDEpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV90cmVlX2RlYWN0aXZhdGVfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkJY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsCisJCQkJc2l6ZV90IHV1aWRfcHJlZml4X2xlbikKK3sKKwlyZXR1cm4gX2RtX3RyZWVfZGVhY3RpdmF0ZV9jaGlsZHJlbihkbm9kZSwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbiwgMCk7Cit9CisKK2ludCBkbV90cmVlX3N1c3BlbmRfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKQoreworCWludCByID0gMTsKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkID0gZG5vZGU7CisJc3RydWN0IGRtX2luZm8gaW5mbywgbmV3aW5mbzsKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqZGluZm87CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp1dWlkOworCisJLyogU3VzcGVuZCBub2RlcyBhdCB0aGlzIGxldmVsIG9mIHRoZSB0cmVlICovCisJd2hpbGUgKChjaGlsZCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCBkbm9kZSwgMCkpKSB7CisJCWlmICghKGRpbmZvID0gZG1fdHJlZV9ub2RlX2dldF9pbmZvKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShuYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISh1dWlkID0gZG1fdHJlZV9ub2RlX2dldF91dWlkKGNoaWxkKSkpIHsKKwkJCXN0YWNrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBWRyAqLworCQlpZiAoIV91dWlkX3ByZWZpeF9tYXRjaGVzKHV1aWQsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJY29udGludWU7CisKKwkJLyogRW5zdXJlIGltbWVkaWF0ZSBwYXJlbnRzIGFyZSBhbHJlYWR5IHN1c3BlbmRlZCAqLworCQlpZiAoIV9jaGlsZHJlbl9zdXNwZW5kZWQoY2hpbGQsIDEsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKCFfaW5mb19ieV9kZXYoZGluZm8tPm1ham9yLCBkaW5mby0+bWlub3IsIDAsICZpbmZvLCBOVUxMLCBOVUxMLCBOVUxMKSB8fAorCQkgICAgIWluZm8uZXhpc3RzIHx8IGluZm8uc3VzcGVuZGVkKQorCQkJY29udGludWU7CisKKwkJLyogSWYgY2hpbGQgaGFzIHNvbWUgcmVhbCBtZXNzYWdlcyBzZW5kIHRoZW0gKi8KKwkJaWYgKChjaGlsZC0+cHJvcHMuc2VuZF9tZXNzYWdlcyA+IDEpICYmIHIpIHsKKwkJCWlmICghKHIgPSBfbm9kZV9zZW5kX21lc3NhZ2VzKGNoaWxkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuLCAxKSkpCisJCQkJc3RhY2s7CisJCQllbHNlIHsKKwkJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiU2VudCBtZXNzYWdlcyB0byB0aGluLXBvb2wgJXMuIgorCQkJCQkJICAgICAic2tpcHBpbmcgc3VzcGVuZCBvZiBpdHMgY2hpbGRyZW4uIiwKKwkJCQkJCSAgICAgX25vZGVfbmFtZShjaGlsZCkpOworCQkJCWNoaWxkLT5wcm9wcy5za2lwX3N1c3BlbmQrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFfc3VzcGVuZF9ub2RlKG5hbWUsIGluZm8ubWFqb3IsIGluZm8ubWlub3IsCisJCQkJICAgY2hpbGQtPmR0cmVlLT5za2lwX2xvY2tmcywKKwkJCQkgICBjaGlsZC0+ZHRyZWUtPm5vX2ZsdXNoLCAmbmV3aW5mbykpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHN1c3BlbmQgJXMgKCUiIFBSSXUzMgorCQkJCSAgIjolIiBQUkl1MzIgIikiLCBuYW1lLCBpbmZvLm1ham9yLAorCQkJCSAgaW5mby5taW5vcik7CisJCQlyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVXBkYXRlIGNhY2hlZCBpbmZvICovCisJCWNoaWxkLT5pbmZvID0gbmV3aW5mbzsKKwl9CisKKwkvKiBUaGVuIHN1c3BlbmQgYW55IGNoaWxkIG5vZGVzICovCisJaGFuZGxlID0gTlVMTDsKKworCXdoaWxlICgoY2hpbGQgPSBkbV90cmVlX25leHRfY2hpbGQoJmhhbmRsZSwgZG5vZGUsIDApKSkgeworCQlpZiAoY2hpbGQtPnByb3BzLnNraXBfc3VzcGVuZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoY2hpbGQpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIFZHICovCisJCWlmICghX3V1aWRfcHJlZml4X21hdGNoZXModXVpZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQlpZiAoZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgMCkpCisJCQlpZiAoIWRtX3RyZWVfc3VzcGVuZF9jaGlsZHJlbihjaGlsZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBfcmVuYW1lX2NvbmZsaWN0X2V4aXN0cworICogQGRub2RlCisgKiBAbm9kZQorICogQHJlc29sdmFibGUKKyAqCisgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJlbmFtZSBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHBlZXJzIGluCisgKiB0aGlzIHRyZWUuICAncmVzb2x2YWJsZScgaXMgc2V0IGlmIHRoZSBjb25mbGljdGluZyBub2RlIHdpbGwKKyAqIGFsc28gYmUgdW5kZXJnb2luZyBhIHJlbmFtZS4gIChBbGxvd2luZyB0aGF0IG5vZGUgdG8gcmVuYW1lCisgKiBmaXJzdCB3b3VsZCBjbGVhciB0aGUgY29uZmxpY3QuKQorICoKKyAqIFJldHVybnM6IDEgaWYgY29uZmxpY3QsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgX3JlbmFtZV9jb25mbGljdF9leGlzdHMoc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50LAorCQkJCSBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSBpbnQgKnJlc29sdmFibGUpCit7CisJdm9pZCAqaGFuZGxlID0gTlVMTDsKKwljb25zdCBjaGFyICpuYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKG5vZGUpOworCWNvbnN0IGNoYXIgKnNpYmxpbmdfbmFtZTsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpzaWJsaW5nOworCisJKnJlc29sdmFibGUgPSAwOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm5fMDsKKworCXdoaWxlICgoc2libGluZyA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCBwYXJlbnQsIDApKSkgeworCQlpZiAoc2libGluZyA9PSBub2RlKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoc2libGluZ19uYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKHNpYmxpbmcpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKG5vZGUtPnByb3BzLm5ld19uYW1lLCBzaWJsaW5nX25hbWUpKSB7CisJCQlpZiAoc2libGluZy0+cHJvcHMubmV3X25hbWUpCisJCQkJKnJlc29sdmFibGUgPSAxOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3RyZWVfYWN0aXZhdGVfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJCSBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKQoreworCWludCByID0gMTsKKwlpbnQgcmVzb2x2YWJsZV9uYW1lX2NvbmZsaWN0LCBhd2FpdGluZ19wZWVyX3JlbmFtZSA9IDA7CisJdm9pZCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpjaGlsZCA9IGRub2RlOworCXN0cnVjdCBkbV9pbmZvIG5ld2luZm87CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp1dWlkOworCWludCBwcmlvcml0eTsKKworCS8qIEFjdGl2YXRlIGNoaWxkcmVuIGZpcnN0ICovCisJd2hpbGUgKChjaGlsZCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCBkbm9kZSwgMCkpKSB7CisJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoY2hpbGQpKSkgeworCQkJc3RhY2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghX3V1aWRfcHJlZml4X21hdGNoZXModXVpZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbikpCisJCQljb250aW51ZTsKKworCQlpZiAoZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgMCkpCisJCQlpZiAoIWRtX3RyZWVfYWN0aXZhdGVfY2hpbGRyZW4oY2hpbGQsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJCXJldHVybl8wOworCX0KKworCWhhbmRsZSA9IE5VTEw7CisKKwlmb3IgKHByaW9yaXR5ID0gMDsgcHJpb3JpdHkgPCAzOyBwcmlvcml0eSsrKSB7CisJCWF3YWl0aW5nX3BlZXJfcmVuYW1lID0gMDsKKwkJd2hpbGUgKChjaGlsZCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmaGFuZGxlLCBkbm9kZSwgMCkpKSB7CisJCQlpZiAocHJpb3JpdHkgIT0gY2hpbGQtPmFjdGl2YXRpb25fcHJpb3JpdHkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghKHV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQoY2hpbGQpKSkgeworCQkJCXN0YWNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIV91dWlkX3ByZWZpeF9tYXRjaGVzKHV1aWQsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIShuYW1lID0gZG1fdHJlZV9ub2RlX2dldF9uYW1lKGNoaWxkKSkpIHsKKwkJCQlzdGFjazsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUmVuYW1lPyAqLworCQkJaWYgKGNoaWxkLT5wcm9wcy5uZXdfbmFtZSkgeworCQkJCWlmIChfcmVuYW1lX2NvbmZsaWN0X2V4aXN0cyhkbm9kZSwgY2hpbGQsICZyZXNvbHZhYmxlX25hbWVfY29uZmxpY3QpICYmCisJCQkJICAgIHJlc29sdmFibGVfbmFtZV9jb25mbGljdCkgeworCQkJCQlhd2FpdGluZ19wZWVyX3JlbmFtZSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFfcmVuYW1lX25vZGUobmFtZSwgY2hpbGQtPnByb3BzLm5ld19uYW1lLCBjaGlsZC0+aW5mby5tYWpvciwKKwkJCQkJCSAgY2hpbGQtPmluZm8ubWlub3IsICZjaGlsZC0+ZHRyZWUtPmNvb2tpZSwKKwkJCQkJCSAgY2hpbGQtPnVkZXZfZmxhZ3MpKSB7CisJCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbmFtZSAlcyAoJSIgUFJJdTMyCisJCQkJCQkgICI6JSIgUFJJdTMyICIpIHRvICVzIiwgbmFtZSwgY2hpbGQtPmluZm8ubWFqb3IsCisJCQkJCQkgIGNoaWxkLT5pbmZvLm1pbm9yLCBjaGlsZC0+cHJvcHMubmV3X25hbWUpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJY2hpbGQtPm5hbWUgPSBjaGlsZC0+cHJvcHMubmV3X25hbWU7CisJCQkJY2hpbGQtPnByb3BzLm5ld19uYW1lID0gTlVMTDsKKwkJCX0KKworCQkJaWYgKCFjaGlsZC0+aW5mby5pbmFjdGl2ZV90YWJsZSAmJiAhY2hpbGQtPmluZm8uc3VzcGVuZGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIV9yZXN1bWVfbm9kZShjaGlsZC0+bmFtZSwgY2hpbGQtPmluZm8ubWFqb3IsIGNoaWxkLT5pbmZvLm1pbm9yLAorCQkJCQkgIGNoaWxkLT5wcm9wcy5yZWFkX2FoZWFkLCBjaGlsZC0+cHJvcHMucmVhZF9haGVhZF9mbGFncywKKwkJCQkJICAmbmV3aW5mbywgJmNoaWxkLT5kdHJlZS0+Y29va2llLCBjaGlsZC0+dWRldl9mbGFncywgY2hpbGQtPmluZm8uc3VzcGVuZGVkKSkgeworCQkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlc3VtZSAlcyAoJSIgUFJJdTMyCisJCQkJCSAgIjolIiBQUkl1MzIgIikiLCBjaGlsZC0+bmFtZSwgY2hpbGQtPmluZm8ubWFqb3IsCisJCQkJCSAgY2hpbGQtPmluZm8ubWlub3IpOworCQkJCXIgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBVcGRhdGUgY2FjaGVkIGluZm8gKi8KKwkJCWNoaWxkLT5pbmZvID0gbmV3aW5mbzsKKwkJfQorCQlpZiAoYXdhaXRpbmdfcGVlcl9yZW5hbWUpCisJCQlwcmlvcml0eS0tOyAvKiByZWRvIHByaW9yaXR5IGxldmVsICovCisJfQorCisJLyoKKwkgKiBGSVhNRTogSW1wbGVtZW50IGRlbGF5ZWQgZXJyb3IgcmVwb3J0aW5nCisJICogYWN0aXZhdGlvbiBzaG91bGQgYmUgc3RvcHBlZCBvbmx5IGluIHRoZSBjYXNlLAorCSAqIHRoZSBzdWJtaXNzaW9uIG9mIHRyYW5zYXRpb25faWQgbWVzc2FnZSBmYWlscywKKwkgKiByZXN1bWUgc2hvdWxkIGNvbnRpbnVlIGZ1cnRoZXIsIGp1c3Qgd2hvbGUgY29tbWFuZAorCSAqIGhhcyB0byByZXBvcnQgZmFpbHVyZS4KKwkgKi8KKwlpZiAociAmJiBkbm9kZS0+cHJvcHMuc2VuZF9tZXNzYWdlcyAmJgorCSAgICAhKHIgPSBfbm9kZV9zZW5kX21lc3NhZ2VzKGRub2RlLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuLCAxKSkpCisJCXN0YWNrOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9ub2RlKHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCisJbG9nX3ZlcmJvc2UoIkNyZWF0aW5nICVzIiwgZG5vZGUtPm5hbWUpOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0NSRUFURSkpKSB7CisJCWxvZ19lcnJvcigiQ3JlYXRlIGRtX3Rhc2sgY3JlYXRpb24gZmFpbGVkIGZvciAlcyIsIGRub2RlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV90YXNrX3NldF9uYW1lKGRtdCwgZG5vZGUtPm5hbWUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBkZXZpY2UgbmFtZSBmb3IgJXMiLCBkbm9kZS0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1fdGFza19zZXRfdXVpZChkbXQsIGRub2RlLT51dWlkKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZXQgdXVpZCBmb3IgJXMiLCBkbm9kZS0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkbm9kZS0+cHJvcHMubWFqb3IgJiYKKwkgICAgKCFkbV90YXNrX3NldF9tYWpvcihkbXQsIGRub2RlLT5wcm9wcy5tYWpvcikgfHwKKwkgICAgICFkbV90YXNrX3NldF9taW5vcihkbXQsIGRub2RlLT5wcm9wcy5taW5vcikpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBkZXZpY2UgbnVtYmVyIGZvciAlcyBjcmVhdGlvbi4iLCBkbm9kZS0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkbm9kZS0+cHJvcHMucmVhZF9vbmx5ICYmICFkbV90YXNrX3NldF9ybyhkbXQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCByZWFkIG9ubHkgZmxhZyBmb3IgJXMiLCBkbm9kZS0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1fdGFza19ub19vcGVuX2NvdW50KGRtdCkpCisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRpc2FibGUgb3Blbl9jb3VudCIpOworCisJaWYgKChyID0gZG1fdGFza19ydW4oZG10KSkpIHsKKwkJaWYgKCEociA9IGRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmZG5vZGUtPmluZm8pKSkKKwkJCS8qCisJCQkgKiBUaGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gb2NjdXIuICBIb3dldmVyLAorCQkJICogd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbnl3YXkgZm9yIHRoZSBtb3JlCisJCQkgKiBhYnN1cmQgY2FzZXMgKGUuZy4gbWVtb3J5IGNvcnJ1cHRpb24pIHNvIHRoZXJlCisJCQkgKiBpcyBuZXZlciBhbnkgcXVlc3Rpb24gYXMgdG8gd2hpY2ggb25lIGZhaWxlZC4KKwkJCSAqLworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkJICAiVW5hYmxlIHRvIGdldCBETSB0YXNrIGluZm8gZm9yICVzLiIsCisJCQkJICBkbm9kZS0+bmFtZSk7CisJfQorb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBfcmVtb3ZlX25vZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byByZW1vdmUgYSBETSBkZXZpY2UgdGhhdCBoYXMgZmFpbGVkCisgKiB0byBsb2FkIGFueSB0YWJsZS4KKyAqLworc3RhdGljIGludCBfcmVtb3ZlX25vZGUoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpCit7CisJaWYgKCFkbm9kZS0+aW5mby5leGlzdHMpCisJCXJldHVybiAxOworCisJaWYgKGRub2RlLT5pbmZvLmxpdmVfdGFibGUgfHwgZG5vZGUtPmluZm8uaW5hY3RpdmVfdGFibGUpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SCisJCQkgICJfcmVtb3ZlX25vZGUgY2FsbGVkIG9uIGRldmljZSB3aXRoIGxvYWRlZCB0YWJsZShzKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfZGVhY3RpdmF0ZV9ub2RlKGRub2RlLT5uYW1lLCBkbm9kZS0+aW5mby5tYWpvciwgZG5vZGUtPmluZm8ubWlub3IsCisJCQkgICAgICAmZG5vZGUtPmR0cmVlLT5jb29raWUsIGRub2RlLT51ZGV2X2ZsYWdzLCAwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbGVhbi11cCBkZXZpY2Ugd2l0aCBubyB0YWJsZTogJXMgJXU6JXUiLAorCQkJICBkbm9kZS0+bmFtZSA/IGRub2RlLT5uYW1lIDogIiIsCisJCQkgIGRub2RlLT5pbmZvLm1ham9yLCBkbm9kZS0+aW5mby5taW5vcik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYnVpbGRfZGV2X3N0cmluZyhjaGFyICpkZXZidWYsIHNpemVfdCBidWZzaXplLCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlKQoreworCWlmICghZG1fZm9ybWF0X2RldihkZXZidWYsIGJ1ZnNpemUsIG5vZGUtPmluZm8ubWFqb3IsIG5vZGUtPmluZm8ubWlub3IpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZvcm1hdCAlcyBkZXZpY2UgbnVtYmVyIGZvciAlcyBhcyBkbSAiCisJCQkgICJ0YXJnZXQgKCV1LCV1KSIsCisJCQkgIG5vZGUtPm5hbWUsIG5vZGUtPnV1aWQsIG5vZGUtPmluZm8ubWFqb3IsIG5vZGUtPmluZm8ubWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogc2ltcGxpZnkgc3RyaW5nIGVtaXRpbmcgY29kZSAqLworI2RlZmluZSBFTUlUX1BBUkFNUyhwLCBzdHIuLi4pXAorZG8ge1wKKwlpbnQgdztcCisJaWYgKCh3ID0gZG1fc25wcmludGYocGFyYW1zICsgcCwgcGFyYW1zaXplIC0gKHNpemVfdCkgcCwgc3RyKSkgPCAwKSB7XAorCQlzdGFjazsgLyogT3V0IG9mIHNwYWNlICovXAorCQlyZXR1cm4gLTE7XAorCX1cCisJcCArPSB3O1wKK30gd2hpbGUgKDApCisKKy8qCisgKiBfZW1pdF9hcmVhc19saW5lCisgKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfZW1pdF9hcmVhc19saW5lKHN0cnVjdCBkbV90YXNrICpkbXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnLCBjaGFyICpwYXJhbXMsCisJCQkgICAgc2l6ZV90IHBhcmFtc2l6ZSwgaW50ICpwb3MpCit7CisJc3RydWN0IHNlZ19hcmVhICphcmVhOworCWNoYXIgZGV2YnVmW0RNX0ZPUk1BVF9ERVZfQlVGU0laRV07CisJdW5zaWduZWQgZmlyc3RfdGltZSA9IDE7CisJY29uc3QgY2hhciAqbG9ndHlwZSwgKnN5bmN0eXBlOworCXVuc2lnbmVkIGxvZ19wYXJtX2NvdW50OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGFyZWEsICZzZWctPmFyZWFzKSB7CisJCXN3aXRjaCAoc2VnLT50eXBlKSB7CisJCWNhc2UgU0VHX1JFUExJQ0FUT1JfREVWOgorCQkJaWYgKCFfYnVpbGRfZGV2X3N0cmluZyhkZXZidWYsIHNpemVvZihkZXZidWYpLCBhcmVhLT5kZXZfbm9kZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCUVNSVRfUEFSQU1TKCpwb3MsICIgJWQgMSAlcyIsIGFyZWEtPnJzaXRlX2luZGV4LCBkZXZidWYpOworCQkJaWYgKGZpcnN0X3RpbWUpCisJCQkJRU1JVF9QQVJBTVMoKnBvcywgIiBub2xvZyAwIik7CisJCQllbHNlIHsKKwkJCQkvKiBSZW1vdGUgZGV2aWNlcyAqLworCQkJCWxvZ19wYXJtX2NvdW50ID0gKGFyZWEtPmZsYWdzICYKKwkJCQkJCSAgKERNX05PU1lOQyB8IERNX0ZPUkNFU1lOQykpID8gMiA6IDE7CisKKwkJCQlpZiAoIWFyZWEtPnNsb2cpIHsKKwkJCQkJZGV2YnVmWzBdID0gMDsJCS8qIE9ubHkgY29yZSBsb2cgcGFyYW1ldGVycyAqLworCQkJCQlsb2d0eXBlID0gImNvcmUiOworCQkJCX0gZWxzZSB7CisJCQkJCWRldmJ1ZlswXSA9ICcgJzsJLyogRXh0cmEgc3BhY2UgYmVmb3JlIGRldmljZSBuYW1lICovCisJCQkJCWlmICghX2J1aWxkX2Rldl9zdHJpbmcoZGV2YnVmICsgMSwKKwkJCQkJCQkgICAgICAgc2l6ZW9mKGRldmJ1ZikgLSAxLAorCQkJCQkJCSAgICAgICBhcmVhLT5zbG9nKSkKKwkJCQkJCXJldHVybl8wOworCQkJCQlsb2d0eXBlID0gImRpc2siOworCQkJCQlsb2dfcGFybV9jb3VudCsrOwkvKiBFeHRyYSBzeW5jIGxvZyBkZXZpY2UgbmFtZSBwYXJhbWV0ZXIgKi8KKwkJCQl9CisKKwkJCQlFTUlUX1BBUkFNUygqcG9zLCAiICVzICV1JXMgJSIgUFJJdTY0LCBsb2d0eXBlLAorCQkJCQkgICAgbG9nX3Bhcm1fY291bnQsIGRldmJ1ZiwgYXJlYS0+cmVnaW9uX3NpemUpOworCisJCQkJc3luY3R5cGUgPSAoYXJlYS0+ZmxhZ3MgJiBETV9OT1NZTkMpID8KKwkJCQkJCSIgbm9zeW5jIiA6IChhcmVhLT5mbGFncyAmIERNX0ZPUkNFU1lOQykgPworCQkJCQkJCQkiIHN5bmMiIDogTlVMTDsKKworCQkJCWlmIChzeW5jdHlwZSkKKwkJCQkJRU1JVF9QQVJBTVMoKnBvcywgIiVzIiwgc3luY3R5cGUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0VHX1JBSUQwOgorCQljYXNlIFNFR19SQUlEMF9NRVRBOgorCQljYXNlIFNFR19SQUlEMToKKwkJY2FzZSBTRUdfUkFJRDEwOgorCQljYXNlIFNFR19SQUlENDoKKwkJY2FzZSBTRUdfUkFJRDVfTEE6CisJCWNhc2UgU0VHX1JBSUQ1X1JBOgorCQljYXNlIFNFR19SQUlENV9MUzoKKwkJY2FzZSBTRUdfUkFJRDVfUlM6CisJCWNhc2UgU0VHX1JBSUQ2X1pSOgorCQljYXNlIFNFR19SQUlENl9OUjoKKwkJY2FzZSBTRUdfUkFJRDZfTkM6CisJCQlpZiAoIWFyZWEtPmRldl9ub2RlKSB7CisJCQkJRU1JVF9QQVJBTVMoKnBvcywgIiAtIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIV9idWlsZF9kZXZfc3RyaW5nKGRldmJ1Ziwgc2l6ZW9mKGRldmJ1ZiksIGFyZWEtPmRldl9ub2RlKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJRU1JVF9QQVJBTVMoKnBvcywgIiAlcyIsIGRldmJ1Zik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghX2J1aWxkX2Rldl9zdHJpbmcoZGV2YnVmLCBzaXplb2YoZGV2YnVmKSwgYXJlYS0+ZGV2X25vZGUpKQorCQkJCXJldHVybl8wOworCisJCQlFTUlUX1BBUkFNUygqcG9zLCAiJXMlcyAlIiBQUkl1NjQsIGZpcnN0X3RpbWUgPyAiIiA6ICIgIiwKKwkJCQkgICAgZGV2YnVmLCBhcmVhLT5vZmZzZXQpOworCQl9CisKKwkJZmlyc3RfdGltZSA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcGxpY2F0b3JfZW1pdF9zZWdtZW50X2xpbmUoY29uc3Qgc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnLCBjaGFyICpwYXJhbXMsCisJCQkJCSBzaXplX3QgcGFyYW1zaXplLCBpbnQgKnBvcykKK3sKKwljb25zdCBzdHJ1Y3QgbG9hZF9zZWdtZW50ICpybG9nX3NlZzsKKwlzdHJ1Y3QgcmVwbGljYXRvcl9zaXRlICpyc2l0ZTsKKwljaGFyIHJsb2didWZbRE1fRk9STUFUX0RFVl9CVUZTSVpFXTsKKwl1bnNpZ25lZCBwYXJtX2NvdW50OworCisJaWYgKCFzZWctPmxvZyB8fCAhX2J1aWxkX2Rldl9zdHJpbmcocmxvZ2J1Ziwgc2l6ZW9mKHJsb2didWYpLCBzZWctPmxvZykpCisJCXJldHVybl8wOworCisJcmxvZ19zZWcgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9sYXN0KCZzZWctPmxvZy0+cHJvcHMuc2VncyksCisJCQkJc3RydWN0IGxvYWRfc2VnbWVudCk7CisKKwlFTUlUX1BBUkFNUygqcG9zLCAiJXMgNCAlcyAwIGF1dG8gJSIgUFJJdTY0LAorCQkgICAgc2VnLT5ybG9nX3R5cGUsIHJsb2didWYsIHJsb2dfc2VnLT5zaXplKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyc2l0ZSwgJnNlZy0+cnNpdGVzKSB7CisJCXBhcm1fY291bnQgPSAocnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEKKwkJCSAgICAgIHx8IHJzaXRlLT5mYWxsX2JlaGluZF9pb3MKKwkJCSAgICAgIHx8IHJzaXRlLT5hc3luY190aW1lb3V0KSA/IDQgOiAyOworCisJCUVNSVRfUEFSQU1TKCpwb3MsICIgYmxvY2tkZXYgJXUgJXUgJXMiLCBwYXJtX2NvdW50LCByc2l0ZS0+cnNpdGVfaW5kZXgsCisJCQkgICAgKHJzaXRlLT5tb2RlID09IERNX1JFUExJQ0FUT1JfU1lOQykgPyAic3luY2hyb25vdXMiIDogImFzeW5jaHJvbm91cyIpOworCisJCWlmIChyc2l0ZS0+ZmFsbF9iZWhpbmRfZGF0YSkKKwkJCUVNSVRfUEFSQU1TKCpwb3MsICIgZGF0YSAlIiBQUkl1NjQsIHJzaXRlLT5mYWxsX2JlaGluZF9kYXRhKTsKKwkJZWxzZSBpZiAocnNpdGUtPmZhbGxfYmVoaW5kX2lvcykKKwkJCUVNSVRfUEFSQU1TKCpwb3MsICIgaW9zICUiIFBSSXUzMiwgcnNpdGUtPmZhbGxfYmVoaW5kX2lvcyk7CisJCWVsc2UgaWYgKHJzaXRlLT5hc3luY190aW1lb3V0KQorCQkJRU1JVF9QQVJBTVMoKnBvcywgIiB0aW1lb3V0ICUiIFBSSXUzMiwgcnNpdGUtPmFzeW5jX3RpbWVvdXQpOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBfbWlycm9yX2VtaXRfc2VnbWVudF9saW5lKHN0cnVjdCBkbV90YXNrICpkbXQsIHN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZywKKwkJCQkgICAgIGNoYXIgKnBhcmFtcywgc2l6ZV90IHBhcmFtc2l6ZSkKK3sKKwlpbnQgYmxvY2tfb25fZXJyb3IgPSAwOworCWludCBoYW5kbGVfZXJyb3JzID0gMDsKKwlpbnQgZG1fbG9nX3VzZXJzcGFjZSA9IDA7CisJc3RydWN0IHV0c25hbWUgdXRzOworCXVuc2lnbmVkIGxvZ19wYXJtX2NvdW50OworCWludCBwb3MgPSAwLCBwYXJ0czsKKwljaGFyIGxvZ2J1ZltETV9GT1JNQVRfREVWX0JVRlNJWkVdOworCWNvbnN0IGNoYXIgKmxvZ3R5cGU7CisJdW5zaWduZWQga21haiA9IDAsIGttaW4gPSAwLCBrcmVsID0gMDsKKworCWlmICh1bmFtZSgmdXRzKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCByZWFkIGtlcm5lbCByZWxlYXNlIHZlcnNpb24uIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEtlcm5lbHMgd2l0aCBhIG1ham9yIG51bWJlciBvZiAyIGFsd2F5cyBoYWQgMyBwYXJ0cy4gKi8KKwlwYXJ0cyA9IHNzY2FuZih1dHMucmVsZWFzZSwgIiV1LiV1LiV1IiwgJmttYWosICZrbWluLCAma3JlbCk7CisJaWYgKHBhcnRzIDwgMSB8fCAoa21haiA8IDMgJiYgcGFydHMgPCAzKSkgeworCQlsb2dfZXJyb3IoIldyb25nIGtlcm5lbCByZWxlYXNlIHZlcnNpb24gJXMuIiwgdXRzLnJlbGVhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHNlZy0+ZmxhZ3MgJiBETV9CTE9DS19PTl9FUlJPUikpIHsKKwkJLyoKKwkJICogT3JpZ2luYWxseSwgYmxvY2tfb25fZXJyb3Igd2FzIGFuIGFyZ3VtZW50IHRvIHRoZSBsb2cKKwkJICogcG9ydGlvbiBvZiB0aGUgbWlycm9yIENUUiB0YWJsZS4gIEl0IHdhcyByZW5hbWVkIHRvCisJCSAqICJoYW5kbGVfZXJyb3JzIiBhbmQgbm93IHJlc2lkZXMgaW4gdGhlICdmZWF0dXJlcycKKwkJICogc2VjdGlvbiBvZiB0aGUgbWlycm9yIENUUiB0YWJsZSAoaS5lLiBhdCB0aGUgZW5kKS4KKwkJICoKKwkJICogV2UgY2FuIGlkZW50aWZ5IHdoZXRoZXIgdG8gdXNlICJibG9ja19vbl9lcnJvciIgb3IKKwkJICogImhhbmRsZV9lcnJvcnMiIGJ5IHRoZSBkbS1taXJyb3IgbW9kdWxlJ3MgdmVyc2lvbgorCQkgKiBudW1iZXIgKD49IDEuMTIpIG9yIGJ5IHRoZSBrZXJuZWwgdmVyc2lvbiAoPj0gMi42LjIyKS4KKwkJICovCisJCWlmIChLRVJORUxfVkVSU0lPTihrbWFqLCBrbWluLCBrcmVsKSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAyMikpCisJCQloYW5kbGVfZXJyb3JzID0gMTsKKwkJZWxzZQorCQkJYmxvY2tfb25fZXJyb3IgPSAxOworCX0KKworCWlmIChzZWctPmNsdXN0ZXJlZCkgeworCQkvKiBDbHVzdGVyIG1pcnJvcnMgcmVxdWlyZSBhIFVVSUQgKi8KKwkJaWYgKCFzZWctPnV1aWQpCisJCQlyZXR1cm5fMDsKKworCQkvKgorCQkgKiBDbHVzdGVyIG1pcnJvcnMgdXNlZCB0byBoYXZlIHRoZWlyIG93biBsb2cKKwkJICogdHlwZXMuICBOb3cgdGhleSBhcmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUKKwkJICogdXNlcnNwYWNlIGxvZyB0eXBlLgorCQkgKgorCQkgKiBUaGUgZG0tbG9nLXVzZXJzcGFjZSBtb2R1bGUgd2FzIGFkZGVkIHRvIHRoZQorCQkgKiAyLjYuMzEga2VybmVsLgorCQkgKi8KKwkJaWYgKEtFUk5FTF9WRVJTSU9OKGttYWosIGttaW4sIGtyZWwpID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDMxKSkKKwkJCWRtX2xvZ191c2Vyc3BhY2UgPSAxOworCX0KKworCS8qIFJlZ2lvbiBzaXplICovCisJbG9nX3Bhcm1fY291bnQgPSAxOworCisJLyogW25vXXN5bmMsIGJsb2NrX29uX2Vycm9yIGV0Yy4gKi8KKwlsb2dfcGFybV9jb3VudCArPSBod2VpZ2h0MzIoc2VnLT5mbGFncyk7CisKKwkvKiAiaGFuZGxlX2Vycm9ycyIgaXMgYSBmZWF0dXJlIGFyZyBub3cgKi8KKwlpZiAoaGFuZGxlX2Vycm9ycykKKwkJbG9nX3Bhcm1fY291bnQtLTsKKworCS8qIERNX0NPUkVMT0cgZG9lcyBub3QgY291bnQgaW4gdGhlIHBhcmFtIGxpc3QgKi8KKwlpZiAoc2VnLT5mbGFncyAmIERNX0NPUkVMT0cpCisJCWxvZ19wYXJtX2NvdW50LS07CisKKwlpZiAoc2VnLT5jbHVzdGVyZWQpIHsKKwkJbG9nX3Bhcm1fY291bnQrKzsgLyogRm9yIFVVSUQgKi8KKworCQlpZiAoIWRtX2xvZ191c2Vyc3BhY2UpCisJCQlFTUlUX1BBUkFNUyhwb3MsICJjbHVzdGVyZWQtIik7CisJCWVsc2UKKwkJCS8qIEZvciBjbHVzdGVyZWQtKiB0eXBlIGZpZWxkIGluc2VydGVkIGxhdGVyICovCisJCQlsb2dfcGFybV9jb3VudCsrOworCX0KKworCWlmICghc2VnLT5sb2cpCisJCWxvZ3R5cGUgPSAiY29yZSI7CisJZWxzZSB7CisJCWxvZ3R5cGUgPSAiZGlzayI7CisJCWxvZ19wYXJtX2NvdW50Kys7CisJCWlmICghX2J1aWxkX2Rldl9zdHJpbmcobG9nYnVmLCBzaXplb2YobG9nYnVmKSwgc2VnLT5sb2cpKQorCQkJcmV0dXJuXzA7CisJfQorCisJaWYgKGRtX2xvZ191c2Vyc3BhY2UpCisJCUVNSVRfUEFSQU1TKHBvcywgInVzZXJzcGFjZSAldSAlcyBjbHVzdGVyZWQtJXMiLAorCQkJICAgIGxvZ19wYXJtX2NvdW50LCBzZWctPnV1aWQsIGxvZ3R5cGUpOworCWVsc2UKKwkJRU1JVF9QQVJBTVMocG9zLCAiJXMgJXUiLCBsb2d0eXBlLCBsb2dfcGFybV9jb3VudCk7CisKKwlpZiAoc2VnLT5sb2cpCisJCUVNSVRfUEFSQU1TKHBvcywgIiAlcyIsIGxvZ2J1Zik7CisKKwlFTUlUX1BBUkFNUyhwb3MsICIgJXUiLCBzZWctPnJlZ2lvbl9zaXplKTsKKworCWlmIChzZWctPmNsdXN0ZXJlZCAmJiAhZG1fbG9nX3VzZXJzcGFjZSkKKwkJRU1JVF9QQVJBTVMocG9zLCAiICVzIiwgc2VnLT51dWlkKTsKKworCWlmICgoc2VnLT5mbGFncyAmIERNX05PU1lOQykpCisJCUVNSVRfUEFSQU1TKHBvcywgIiBub3N5bmMiKTsKKwllbHNlIGlmICgoc2VnLT5mbGFncyAmIERNX0ZPUkNFU1lOQykpCisJCUVNSVRfUEFSQU1TKHBvcywgIiBzeW5jIik7CisKKwlpZiAoYmxvY2tfb25fZXJyb3IpCisJCUVNSVRfUEFSQU1TKHBvcywgIiBibG9ja19vbl9lcnJvciIpOworCisJRU1JVF9QQVJBTVMocG9zLCAiICV1ICIsIHNlZy0+bWlycm9yX2FyZWFfY291bnQpOworCisJaWYgKF9lbWl0X2FyZWFzX2xpbmUoZG10LCBzZWcsIHBhcmFtcywgcGFyYW1zaXplLCAmcG9zKSA8PSAwKQorCQlyZXR1cm5fMDsKKworCWlmIChoYW5kbGVfZXJyb3JzKQorCQlFTUlUX1BBUkFNUyhwb3MsICIgMSBoYW5kbGVfZXJyb3JzIik7CisKKwlyZXR1cm4gMTsKK30KKworLyogSXMgcGFyYW1ldGVyIG5vbi16ZXJvPyAqLworI2RlZmluZSBQQVJBTV9JU19TRVQocCkgKChwKSA/IDEgOiAwKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgYXNzdW1pbmcgNCAqIDY0IGJpdCBzaXplICovCitzdGF0aWMgaW50IF9nZXRfcGFyYW1zX2NvdW50KHVpbnQ2NF90IGJpdHMpCit7CisJaW50IHIgPSAwOworCisJciArPSAyICogaHdlaWdodDMyKGJpdHMgJiAweEZGRkZGRkZGKTsKKwlyICs9IDIgKiBod2VpZ2h0MzIoYml0cyA+PiAzMik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcmFpZF9lbWl0X3NlZ21lbnRfbGluZShzdHJ1Y3QgZG1fdGFzayAqZG10LCB1aW50MzJfdCBtYWpvciwKKwkJCQkgICB1aW50MzJfdCBtaW5vciwgc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnLAorCQkJCSAgIHVpbnQ2NF90ICpzZWdfc3RhcnQsIGNoYXIgKnBhcmFtcywKKwkJCQkgICBzaXplX3QgcGFyYW1zaXplKQoreworCXVpbnQzMl90IGk7CisJaW50IHBhcmFtX2NvdW50ID0gMTsgLyogbWFuZGF0b3J5ICdjaHVuayBzaXplJy8nc3RyaXBlIHNpemUnIGFyZyAqLworCWludCBwb3MgPSAwOworCXVuc2lnbmVkIHR5cGUgPSBzZWctPnR5cGU7CisKKwlpZiAoKHNlZy0+ZmxhZ3MgJiBETV9OT1NZTkMpIHx8IChzZWctPmZsYWdzICYgRE1fRk9SQ0VTWU5DKSkKKwkJcGFyYW1fY291bnQrKzsKKworCXBhcmFtX2NvdW50ICs9IDIgKiAoUEFSQU1fSVNfU0VUKHNlZy0+cmVnaW9uX3NpemUpICsKKwkJCSAgICBQQVJBTV9JU19TRVQoc2VnLT53cml0ZWJlaGluZCkgKworCQkJICAgIFBBUkFNX0lTX1NFVChzZWctPm1pbl9yZWNvdmVyeV9yYXRlKSArCisJCQkgICAgUEFSQU1fSVNfU0VUKHNlZy0+bWF4X3JlY292ZXJ5X3JhdGUpKTsKKworCS8qIHJlYnVpbGRzIGFuZCB3cml0ZW1vc3RseSBhcmUgNjQgYml0cyAqLworCXBhcmFtX2NvdW50ICs9IF9nZXRfcGFyYW1zX2NvdW50KHNlZy0+cmVidWlsZHMpOworCXBhcmFtX2NvdW50ICs9IF9nZXRfcGFyYW1zX2NvdW50KHNlZy0+d3JpdGVtb3N0bHkpOworCisJaWYgKCh0eXBlID09IFNFR19SQUlEMSkgJiYgc2VnLT5zdHJpcGVfc2l6ZSkKKwkJbG9nX2Vycm9yKCJXQVJOSU5HOiBJZ25vcmluZyBSQUlEMSBzdHJpcGUgc2l6ZSIpOworCisJLyogS2VybmVsIG9ubHkgZXhwZWN0cyAicmFpZDAiLCBub3QgInJhaWQwX21ldGEiICovCisJaWYgKHR5cGUgPT0gU0VHX1JBSUQwX01FVEEpCisJCXR5cGUgPSBTRUdfUkFJRDA7CisKKwlFTUlUX1BBUkFNUyhwb3MsICIlcyAlZCAldSIsIF9kbV9zZWd0eXBlc1t0eXBlXS50YXJnZXQsCisJCSAgICBwYXJhbV9jb3VudCwgc2VnLT5zdHJpcGVfc2l6ZSk7CisKKwlpZiAoc2VnLT5mbGFncyAmIERNX05PU1lOQykKKwkJRU1JVF9QQVJBTVMocG9zLCAiIG5vc3luYyIpOworCWVsc2UgaWYgKHNlZy0+ZmxhZ3MgJiBETV9GT1JDRVNZTkMpCisJCUVNSVRfUEFSQU1TKHBvcywgIiBzeW5jIik7CisKKwlpZiAoc2VnLT5yZWdpb25fc2l6ZSkKKwkJRU1JVF9QQVJBTVMocG9zLCAiIHJlZ2lvbl9zaXplICV1Iiwgc2VnLT5yZWdpb25fc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNlZy0+YXJlYV9jb3VudCAvIDIpOyBpKyspCisJCWlmIChzZWctPnJlYnVpbGRzICYgKDFVTEwgPDwgaSkpCisJCQlFTUlUX1BBUkFNUyhwb3MsICIgcmVidWlsZCAldSIsIGkpOworCisJaWYgKHNlZy0+bWluX3JlY292ZXJ5X3JhdGUpCisJCUVNSVRfUEFSQU1TKHBvcywgIiBtaW5fcmVjb3ZlcnlfcmF0ZSAldSIsCisJCQkgICAgc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZSk7CisKKwlpZiAoc2VnLT5tYXhfcmVjb3ZlcnlfcmF0ZSkKKwkJRU1JVF9QQVJBTVMocG9zLCAiIG1heF9yZWNvdmVyeV9yYXRlICV1IiwKKwkJCSAgICBzZWctPm1heF9yZWNvdmVyeV9yYXRlKTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2VnLT5hcmVhX2NvdW50IC8gMik7IGkrKykKKwkJaWYgKHNlZy0+d3JpdGVtb3N0bHkgJiAoMVVMTCA8PCBpKSkKKwkJCUVNSVRfUEFSQU1TKHBvcywgIiB3cml0ZV9tb3N0bHkgJXUiLCBpKTsKKworCWlmIChzZWctPndyaXRlYmVoaW5kKQorCQlFTUlUX1BBUkFNUyhwb3MsICIgbWF4X3dyaXRlX2JlaGluZCAldSIsIHNlZy0+d3JpdGViZWhpbmQpOworCisJLyogUHJpbnQgbnVtYmVyIG9mIG1ldGFkYXRhL2RhdGEgZGV2aWNlIHBhaXJzICovCisJRU1JVF9QQVJBTVMocG9zLCAiICV1Iiwgc2VnLT5hcmVhX2NvdW50LzIpOworCisJaWYgKF9lbWl0X2FyZWFzX2xpbmUoZG10LCBzZWcsIHBhcmFtcywgcGFyYW1zaXplLCAmcG9zKSA8PSAwKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jYWNoZV9lbWl0X3NlZ21lbnRfbGluZShzdHJ1Y3QgZG1fdGFzayAqZG10LAorCQkJCSAgICBzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWcsCisJCQkJICAgIGNoYXIgKnBhcmFtcywgc2l6ZV90IHBhcmFtc2l6ZSkKK3sKKwlpbnQgcG9zID0gMDsKKwkvKiB1bnNpZ25lZCBmZWF0dXJlX2NvdW50OyAqLworCWNoYXIgZGF0YVtETV9GT1JNQVRfREVWX0JVRlNJWkVdOworCWNoYXIgbWV0YWRhdGFbRE1fRk9STUFUX0RFVl9CVUZTSVpFXTsKKwljaGFyIG9yaWdpbltETV9GT1JNQVRfREVWX0JVRlNJWkVdOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKworCS8qIENhY2hlIERldiAqLworCWlmICghX2J1aWxkX2Rldl9zdHJpbmcoZGF0YSwgc2l6ZW9mKGRhdGEpLCBzZWctPnBvb2wpKQorCQlyZXR1cm5fMDsKKworCS8qIE1ldGFkYXRhIERldiAqLworCWlmICghX2J1aWxkX2Rldl9zdHJpbmcobWV0YWRhdGEsIHNpemVvZihtZXRhZGF0YSksIHNlZy0+bWV0YWRhdGEpKQorCQlyZXR1cm5fMDsKKworCS8qIE9yaWdpbiBEZXYgKi8KKwlpZiAoIV9idWlsZF9kZXZfc3RyaW5nKG9yaWdpbiwgc2l6ZW9mKG9yaWdpbiksIHNlZy0+b3JpZ2luKSkKKwkJcmV0dXJuXzA7CisKKwlFTUlUX1BBUkFNUyhwb3MsICIlcyAlcyAlcyIsIG1ldGFkYXRhLCBkYXRhLCBvcmlnaW4pOworCisJLyogRGF0YSBibG9jayBzaXplICovCisJRU1JVF9QQVJBTVMocG9zLCAiICV1Iiwgc2VnLT5kYXRhX2Jsb2NrX3NpemUpOworCisJLyogRmVhdHVyZXMgKi8KKwkvKiBmZWF0dXJlX2NvdW50ID0gaHdlaWdodDMyKHNlZy0+ZmxhZ3MpOyAqLworCS8qIEVNSVRfUEFSQU1TKHBvcywgIiAldSIsIGZlYXR1cmVfY291bnQpOyAqLworCWlmIChzZWctPmZsYWdzICYgRE1fQ0FDSEVfRkVBVFVSRV9QQVNTVEhST1VHSCkKKwkJRU1JVF9QQVJBTVMocG9zLCAiIDEgcGFzc3Rocm91Z2giKTsKKwllbHNlIGlmIChzZWctPmZsYWdzICYgRE1fQ0FDSEVfRkVBVFVSRV9XUklURVRIUk9VR0gpCisJCUVNSVRfUEFSQU1TKHBvcywgIiAxIHdyaXRldGhyb3VnaCIpOworCWVsc2UgaWYgKHNlZy0+ZmxhZ3MgJiBETV9DQUNIRV9GRUFUVVJFX1dSSVRFQkFDSykKKwkJRU1JVF9QQVJBTVMocG9zLCAiIDEgd3JpdGViYWNrIik7CisKKwkvKiBDYWNoZSBQb2xpY3kgKi8KKwluYW1lID0gc2VnLT5wb2xpY3lfbmFtZSA/IDogImRlZmF1bHQiOworCisJRU1JVF9QQVJBTVMocG9zLCAiICVzIiwgbmFtZSk7CisKKwlFTUlUX1BBUkFNUyhwb3MsICIgJXUiLCBzZWctPnBvbGljeV9hcmdjICogMik7CisJaWYgKHNlZy0+cG9saWN5X3NldHRpbmdzKQorCQlmb3IgKGNuID0gc2VnLT5wb2xpY3lfc2V0dGluZ3MtPmNoaWxkOyBjbjsgY24gPSBjbi0+c2liKQorCQkJRU1JVF9QQVJBTVMocG9zLCAiICVzICUiIFBSSXU2NCwgY24tPmtleSwgY24tPnYtPnYuaSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9wb29sX2VtaXRfc2VnbWVudF9saW5lKHN0cnVjdCBkbV90YXNrICpkbXQsCisJCQkJCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZywKKwkJCQkJY2hhciAqcGFyYW1zLCBzaXplX3QgcGFyYW1zaXplKQoreworCWludCBwb3MgPSAwOworCWNoYXIgcG9vbFtETV9GT1JNQVRfREVWX0JVRlNJWkVdLCBtZXRhZGF0YVtETV9GT1JNQVRfREVWX0JVRlNJWkVdOworCWludCBmZWF0dXJlcyA9IChzZWctPmVycm9yX2lmX25vX3NwYWNlID8gMSA6IDApICsKKwkJIChzZWctPnJlYWRfb25seSA/IDEgOiAwKSArCisJCSAoc2VnLT5pZ25vcmVfZGlzY2FyZCA/IDEgOiAwKSArCisJCSAoc2VnLT5ub19kaXNjYXJkX3Bhc3Nkb3duID8gMSA6IDApICsKKwkJIChzZWctPnNraXBfYmxvY2tfemVyb2luZyA/IDEgOiAwKTsKKworCWlmICghX2J1aWxkX2Rldl9zdHJpbmcobWV0YWRhdGEsIHNpemVvZihtZXRhZGF0YSksIHNlZy0+bWV0YWRhdGEpKQorCQlyZXR1cm5fMDsKKworCWlmICghX2J1aWxkX2Rldl9zdHJpbmcocG9vbCwgc2l6ZW9mKHBvb2wpLCBzZWctPnBvb2wpKQorCQlyZXR1cm5fMDsKKworCUVNSVRfUEFSQU1TKHBvcywgIiVzICVzICVkICUiIFBSSXU2NCAiICVkJXMlcyVzJXMlcyIsIG1ldGFkYXRhLCBwb29sLAorCQkgICAgc2VnLT5kYXRhX2Jsb2NrX3NpemUsIHNlZy0+bG93X3dhdGVyX21hcmssIGZlYXR1cmVzLAorCQkgICAgc2VnLT5za2lwX2Jsb2NrX3plcm9pbmcgPyAiIHNraXBfYmxvY2tfemVyb2luZyIgOiAiIiwKKwkJICAgIHNlZy0+aWdub3JlX2Rpc2NhcmQgPyAiIGlnbm9yZV9kaXNjYXJkIiA6ICIiLAorCQkgICAgc2VnLT5ub19kaXNjYXJkX3Bhc3Nkb3duID8gIiBub19kaXNjYXJkX3Bhc3Nkb3duIiA6ICIiLAorCQkgICAgc2VnLT5lcnJvcl9pZl9ub19zcGFjZSA/ICIgZXJyb3JfaWZfbm9fc3BhY2UiIDogIiIsCisJCSAgICBzZWctPnJlYWRfb25seSA/ICIgcmVhZF9vbmx5IiA6ICIiCisJCSAgICk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdGhpbl9lbWl0X3NlZ21lbnRfbGluZShzdHJ1Y3QgZG1fdGFzayAqZG10LAorCQkJCSAgIHN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZywKKwkJCQkgICBjaGFyICpwYXJhbXMsIHNpemVfdCBwYXJhbXNpemUpCit7CisJaW50IHBvcyA9IDA7CisJY2hhciBwb29sW0RNX0ZPUk1BVF9ERVZfQlVGU0laRV07CisJY2hhciBleHRlcm5hbFtETV9GT1JNQVRfREVWX0JVRlNJWkUgKyAxXTsKKworCWlmICghX2J1aWxkX2Rldl9zdHJpbmcocG9vbCwgc2l6ZW9mKHBvb2wpLCBzZWctPnBvb2wpKQorCQlyZXR1cm5fMDsKKworCWlmICghc2VnLT5leHRlcm5hbCkKKwkJKmV4dGVybmFsID0gMDsKKwllbHNlIHsKKwkJKmV4dGVybmFsID0gJyAnOworCQlpZiAoIV9idWlsZF9kZXZfc3RyaW5nKGV4dGVybmFsICsgMSwgc2l6ZW9mKGV4dGVybmFsKSAtIDEsCisJCQkJICAgICAgIHNlZy0+ZXh0ZXJuYWwpKQorCQkJcmV0dXJuXzA7CisJfQorCisJRU1JVF9QQVJBTVMocG9zLCAiJXMgJWQlcyIsIHBvb2wsIHNlZy0+ZGV2aWNlX2lkLCBleHRlcm5hbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZW1pdF9zZWdtZW50X2xpbmUoc3RydWN0IGRtX3Rhc2sgKmRtdCwgdWludDMyX3QgbWFqb3IsCisJCQkgICAgICB1aW50MzJfdCBtaW5vciwgc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnLAorCQkJICAgICAgdWludDY0X3QgKnNlZ19zdGFydCwgY2hhciAqcGFyYW1zLAorCQkJICAgICAgc2l6ZV90IHBhcmFtc2l6ZSkKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgcjsKKwlpbnQgdGFyZ2V0X3R5cGVfaXNfcmFpZCA9IDA7CisJY2hhciBvcmlnaW5idWZbRE1fRk9STUFUX0RFVl9CVUZTSVpFXSwgY293YnVmW0RNX0ZPUk1BVF9ERVZfQlVGU0laRV07CisKKwlzd2l0Y2goc2VnLT50eXBlKSB7CisJY2FzZSBTRUdfRVJST1I6CisJY2FzZSBTRUdfWkVSTzoKKwljYXNlIFNFR19MSU5FQVI6CisJCWJyZWFrOworCWNhc2UgU0VHX01JUlJPUkVEOgorCQkvKiBNaXJyb3JzIGFyZSBwcmV0dHkgY29tcGxpY2F0ZWQgLSBub3cgaW4gc2VwYXJhdGUgZnVuY3Rpb24gKi8KKwkJciA9IF9taXJyb3JfZW1pdF9zZWdtZW50X2xpbmUoZG10LCBzZWcsIHBhcmFtcywgcGFyYW1zaXplKTsKKwkJaWYgKCFyKQorCQkJcmV0dXJuXzA7CisJCWJyZWFrOworCWNhc2UgU0VHX1JFUExJQ0FUT1I6CisJCWlmICgociA9IF9yZXBsaWNhdG9yX2VtaXRfc2VnbWVudF9saW5lKHNlZywgcGFyYW1zLCBwYXJhbXNpemUsCisJCQkJCQkgICAgICAgJnBvcykpIDw9IDApIHsKKwkJCXN0YWNrOworCQkJcmV0dXJuIHI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRUdfUkVQTElDQVRPUl9ERVY6CisJCWlmICghc2VnLT5yZXBsaWNhdG9yIHx8ICFfYnVpbGRfZGV2X3N0cmluZyhvcmlnaW5idWYsCisJCQkJCQkJICAgc2l6ZW9mKG9yaWdpbmJ1ZiksCisJCQkJCQkJICAgc2VnLT5yZXBsaWNhdG9yKSkKKwkJCXJldHVybl8wOworCisJCUVNSVRfUEFSQU1TKHBvcywgIiVzICUiIFBSSXU2NCwgb3JpZ2luYnVmLCBzZWctPnJkZXZpY2VfaW5kZXgpOworCQlicmVhazsKKwljYXNlIFNFR19TTkFQU0hPVDoKKwljYXNlIFNFR19TTkFQU0hPVF9NRVJHRToKKwkJaWYgKCFfYnVpbGRfZGV2X3N0cmluZyhvcmlnaW5idWYsIHNpemVvZihvcmlnaW5idWYpLCBzZWctPm9yaWdpbikpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFfYnVpbGRfZGV2X3N0cmluZyhjb3didWYsIHNpemVvZihjb3didWYpLCBzZWctPmNvdykpCisJCQlyZXR1cm5fMDsKKwkJRU1JVF9QQVJBTVMocG9zLCAiJXMgJXMgJWMgJWQiLCBvcmlnaW5idWYsIGNvd2J1ZiwKKwkJCSAgICBzZWctPnBlcnNpc3RlbnQgPyAnUCcgOiAnTicsIHNlZy0+Y2h1bmtfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgU0VHX1NOQVBTSE9UX09SSUdJTjoKKwkJaWYgKCFfYnVpbGRfZGV2X3N0cmluZyhvcmlnaW5idWYsIHNpemVvZihvcmlnaW5idWYpLCBzZWctPm9yaWdpbikpCisJCQlyZXR1cm5fMDsKKwkJRU1JVF9QQVJBTVMocG9zLCAiJXMiLCBvcmlnaW5idWYpOworCQlicmVhazsKKwljYXNlIFNFR19TVFJJUEVEOgorCQlFTUlUX1BBUkFNUyhwb3MsICIldSAldSAiLCBzZWctPmFyZWFfY291bnQsIHNlZy0+c3RyaXBlX3NpemUpOworCQlicmVhazsKKwljYXNlIFNFR19DUllQVDoKKwkJRU1JVF9QQVJBTVMocG9zLCAiJXMlcyVzJXMlcyAlcyAlIiBQUkl1NjQgIiAiLCBzZWctPmNpcGhlciwKKwkJCSAgICBzZWctPmNoYWlubW9kZSA/ICItIiA6ICIiLCBzZWctPmNoYWlubW9kZSA/OiAiIiwKKwkJCSAgICBzZWctPml2ID8gIi0iIDogIiIsIHNlZy0+aXYgPzogIiIsIHNlZy0+a2V5LAorCQkJICAgIHNlZy0+aXZfb2Zmc2V0ICE9IERNX0NSWVBUX0lWX0RFRkFVTFQgPworCQkJICAgIHNlZy0+aXZfb2Zmc2V0IDogKnNlZ19zdGFydCk7CisJCWJyZWFrOworCWNhc2UgU0VHX1JBSUQwOgorCWNhc2UgU0VHX1JBSUQwX01FVEE6CisJY2FzZSBTRUdfUkFJRDE6CisJY2FzZSBTRUdfUkFJRDEwOgorCWNhc2UgU0VHX1JBSUQ0OgorCWNhc2UgU0VHX1JBSUQ1X0xBOgorCWNhc2UgU0VHX1JBSUQ1X1JBOgorCWNhc2UgU0VHX1JBSUQ1X0xTOgorCWNhc2UgU0VHX1JBSUQ1X1JTOgorCWNhc2UgU0VHX1JBSUQ2X1pSOgorCWNhc2UgU0VHX1JBSUQ2X05SOgorCWNhc2UgU0VHX1JBSUQ2X05DOgorCQl0YXJnZXRfdHlwZV9pc19yYWlkID0gMTsKKwkJciA9IF9yYWlkX2VtaXRfc2VnbWVudF9saW5lKGRtdCwgbWFqb3IsIG1pbm9yLCBzZWcsIHNlZ19zdGFydCwKKwkJCQkJICAgIHBhcmFtcywgcGFyYW1zaXplKTsKKwkJaWYgKCFyKQorCQkJcmV0dXJuXzA7CisKKwkJYnJlYWs7CisJY2FzZSBTRUdfVEhJTl9QT09MOgorCQlpZiAoIV90aGluX3Bvb2xfZW1pdF9zZWdtZW50X2xpbmUoZG10LCBzZWcsIHBhcmFtcywgcGFyYW1zaXplKSkKKwkJCXJldHVybl8wOworCQlicmVhazsKKwljYXNlIFNFR19USElOOgorCQlpZiAoIV90aGluX2VtaXRfc2VnbWVudF9saW5lKGRtdCwgc2VnLCBwYXJhbXMsIHBhcmFtc2l6ZSkpCisJCQlyZXR1cm5fMDsKKwkJYnJlYWs7CisJY2FzZSBTRUdfQ0FDSEU6CisJCWlmICghX2NhY2hlX2VtaXRfc2VnbWVudF9saW5lKGRtdCwgc2VnLCBwYXJhbXMsIHBhcmFtc2l6ZSkpCisJCQlyZXR1cm5fMDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoKHNlZy0+dHlwZSkgeworCWNhc2UgU0VHX0VSUk9SOgorCWNhc2UgU0VHX1JFUExJQ0FUT1I6CisJY2FzZSBTRUdfU05BUFNIT1Q6CisJY2FzZSBTRUdfU05BUFNIT1RfT1JJR0lOOgorCWNhc2UgU0VHX1NOQVBTSE9UX01FUkdFOgorCWNhc2UgU0VHX1pFUk86CisJY2FzZSBTRUdfVEhJTl9QT09MOgorCWNhc2UgU0VHX1RISU46CisJY2FzZSBTRUdfQ0FDSEU6CisJCWJyZWFrOworCWNhc2UgU0VHX0NSWVBUOgorCWNhc2UgU0VHX0xJTkVBUjoKKwljYXNlIFNFR19SRVBMSUNBVE9SX0RFVjoKKwljYXNlIFNFR19TVFJJUEVEOgorCQlpZiAoKHIgPSBfZW1pdF9hcmVhc19saW5lKGRtdCwgc2VnLCBwYXJhbXMsIHBhcmFtc2l6ZSwgJnBvcykpIDw9IDApIHsKKwkJCXN0YWNrOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaWYgKCFwYXJhbXNbMF0pIHsKKwkJCWxvZ19lcnJvcigiTm8gcGFyYW1ldGVycyBzdXBwbGllZCBmb3IgJXMgdGFyZ2V0ICIKKwkJCQkgICIldToldS4iLCBfZG1fc2VndHlwZXNbc2VnLT50eXBlXS50YXJnZXQsCisJCQkJICBtYWpvciwgbWlub3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkFkZGluZyB0YXJnZXQgdG8gKCUiIFBSSXUzMiAiOiUiIFBSSXUzMiAiKTogJSIgUFJJdTY0CisJCQkgICAgICIgJSIgUFJJdTY0ICIgJXMgJXMiLCBtYWpvciwgbWlub3IsCisJCQkgICAgICpzZWdfc3RhcnQsIHNlZy0+c2l6ZSwgdGFyZ2V0X3R5cGVfaXNfcmFpZCA/ICJyYWlkIiA6CisJCQkgICAgIF9kbV9zZWd0eXBlc1tzZWctPnR5cGVdLnRhcmdldCwgcGFyYW1zKTsKKworCWlmICghZG1fdGFza19hZGRfdGFyZ2V0KGRtdCwgKnNlZ19zdGFydCwgc2VnLT5zaXplLAorCQkJCXRhcmdldF90eXBlX2lzX3JhaWQgPyAicmFpZCIgOgorCQkJCV9kbV9zZWd0eXBlc1tzZWctPnR5cGVdLnRhcmdldCwgcGFyYW1zKSkKKwkJcmV0dXJuXzA7CisKKwkqc2VnX3N0YXJ0ICs9IHNlZy0+c2l6ZTsKKworCXJldHVybiAxOworfQorCisjdW5kZWYgRU1JVF9QQVJBTVMKKworc3RhdGljIGludCBfZW1pdF9zZWdtZW50KHN0cnVjdCBkbV90YXNrICpkbXQsIHVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vciwKKwkJCSBzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWcsIHVpbnQ2NF90ICpzZWdfc3RhcnQpCit7CisJY2hhciAqcGFyYW1zOworCXNpemVfdCBwYXJhbXNpemUgPSA0MDk2OworCWludCByZXQ7CisKKwlkbyB7CisJCWlmICghKHBhcmFtcyA9IGRtX21hbGxvYyhwYXJhbXNpemUpKSkgeworCQkJbG9nX2Vycm9yKCJJbnN1ZmZpY2llbnQgc3BhY2UgZm9yIHRhcmdldCBwYXJhbWV0ZXJzLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwYXJhbXNbMF0gPSAnXDAnOworCQlyZXQgPSBfZW1pdF9zZWdtZW50X2xpbmUoZG10LCBtYWpvciwgbWlub3IsIHNlZywgc2VnX3N0YXJ0LAorCQkJCQkgcGFyYW1zLCBwYXJhbXNpemUpOworCQlkbV9mcmVlKHBhcmFtcyk7CisKKwkJaWYgKCFyZXQpCisJCQlzdGFjazsKKworCQlpZiAocmV0ID49IDApCisJCQlyZXR1cm4gcmV0OworCisJCWxvZ19kZWJ1Z19hY3RpdmF0aW9uKCJJbnN1ZmZpY2llbnQgc3BhY2UgaW4gcGFyYW1zWyUiIFBSSXNpemVfdAorCQkJCSAgICAgIl0gZm9yIHRhcmdldCBwYXJhbWV0ZXJzLiIsIHBhcmFtc2l6ZSk7CisKKwkJcGFyYW1zaXplICo9IDI7CisJfSB3aGlsZSAocGFyYW1zaXplIDwgTUFYX1RBUkdFVF9QQVJBTVNJWkUpOworCisJbG9nX2Vycm9yKCJUYXJnZXQgcGFyYW1ldGVyIHNpemUgdG9vIGJpZy4gQWJvcnRpbmcuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2xvYWRfbm9kZShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSkKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWc7CisJdWludDY0X3Qgc2VnX3N0YXJ0ID0gMCwgZXhpc3RpbmdfdGFibGVfc2l6ZTsKKworCWxvZ192ZXJib3NlKCJMb2FkaW5nICVzIHRhYmxlICglIiBQUkl1MzIgIjolIiBQUkl1MzIgIikiLCBkbm9kZS0+bmFtZSwKKwkJICAgIGRub2RlLT5pbmZvLm1ham9yLCBkbm9kZS0+aW5mby5taW5vcik7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfUkVMT0FEKSkpIHsKKwkJbG9nX2Vycm9yKCJSZWxvYWQgZG1fdGFzayBjcmVhdGlvbiBmYWlsZWQgZm9yICVzIiwgZG5vZGUtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X21ham9yKGRtdCwgZG5vZGUtPmluZm8ubWFqb3IpIHx8CisJICAgICFkbV90YXNrX3NldF9taW5vcihkbXQsIGRub2RlLT5pbmZvLm1pbm9yKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzZXQgZGV2aWNlIG51bWJlciBmb3IgJXMgcmVsb2FkLiIsIGRub2RlLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRub2RlLT5wcm9wcy5yZWFkX29ubHkgJiYgIWRtX3Rhc2tfc2V0X3JvKGRtdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0IHJlYWQgb25seSBmbGFnIGZvciAlcyIsIGRub2RlLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZGlzYWJsZSBvcGVuX2NvdW50Iik7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmZG5vZGUtPnByb3BzLnNlZ3MpCisJCWlmICghX2VtaXRfc2VnbWVudChkbXQsIGRub2RlLT5pbmZvLm1ham9yLCBkbm9kZS0+aW5mby5taW5vciwKKwkJCQkgICBzZWcsICZzZWdfc3RhcnQpKQorCQkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfc3VwcHJlc3NfaWRlbnRpY2FsX3JlbG9hZChkbXQpKQorCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdXBwcmVzcyByZWxvYWQgb2YgaWRlbnRpY2FsIHRhYmxlcy4iKTsKKworCWlmICgociA9IGRtX3Rhc2tfcnVuKGRtdCkpKSB7CisJCXIgPSBkbV90YXNrX2dldF9pbmZvKGRtdCwgJmRub2RlLT5pbmZvKTsKKwkJaWYgKHIgJiYgIWRub2RlLT5pbmZvLmluYWN0aXZlX3RhYmxlKQorCQkJbG9nX3ZlcmJvc2UoIlN1cHByZXNzZWQgJXMgKCUiIFBSSXUzMiAiOiUiIFBSSXUzMgorCQkJCSAgICAiKSBpZGVudGljYWwgdGFibGUgcmVsb2FkLiIsCisJCQkJICAgIGRub2RlLT5uYW1lLAorCQkJCSAgICBkbm9kZS0+aW5mby5tYWpvciwgZG5vZGUtPmluZm8ubWlub3IpOworCisJCWV4aXN0aW5nX3RhYmxlX3NpemUgPSBkbV90YXNrX2dldF9leGlzdGluZ190YWJsZV9zaXplKGRtdCk7CisJCWlmICgoZG5vZGUtPnByb3BzLnNpemVfY2hhbmdlZCA9CisJCSAgICAgKGV4aXN0aW5nX3RhYmxlX3NpemUgPT0gc2VnX3N0YXJ0KSA/IDAgOgorCQkgICAgIChleGlzdGluZ190YWJsZV9zaXplID4gc2VnX3N0YXJ0KSA/IC0xIDogMSkpIHsKKwkJCS8qCisJCQkgKiBLZXJuZWwgdXN1YWxseSBza2lwcyBzaXplIHZhbGlkYXRpb24gb24gemVyby1sZW5ndGggZGV2aWNlcworCQkJICogbm93IHNvIG5vIG5lZWQgdG8gcHJlbG9hZCB0aGVtLgorCQkJICovCisJCQkvKiBGSVhNRSBJbiB3aGljaCBrZXJuZWwgdmVyc2lvbiBkaWQgdGhpcyBiZWdpbj8gKi8KKwkJCWlmICghZXhpc3RpbmdfdGFibGVfc2l6ZSAmJiBkbm9kZS0+cHJvcHMuZGVsYXlfcmVzdW1lX2lmX25ldykKKwkJCQlkbm9kZS0+cHJvcHMuc2l6ZV9jaGFuZ2VkID0gMDsKKworCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlRhYmxlIHNpemUgY2hhbmdlZCBmcm9tICUiIFBSSXU2NCAiIHRvICUiCisJCQkJCSAgICAgUFJJdTY0ICIgZm9yICVzICglIiBQUkl1MzIgIjolIiBQUkl1MzIgIikuJXMiLAorCQkJCQkgICAgIGV4aXN0aW5nX3RhYmxlX3NpemUsIHNlZ19zdGFydCwgZG5vZGUtPm5hbWUsCisJCQkJCSAgICAgZG5vZGUtPmluZm8ubWFqb3IsIGRub2RlLT5pbmZvLm1pbm9yLAorCQkJCQkgICAgIGRub2RlLT5wcm9wcy5zaXplX2NoYW5nZWQgPyAiIiA6ICIgKElnbm9yaW5nLikiKTsKKwkJfQorCX0KKworCWRub2RlLT5wcm9wcy5zZWdtZW50X2NvdW50ID0gMDsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDdXJyZW50bHkgdHJ5IHRvIGRlYWN0aXZhdGUgb25seSBub2RlcyBjcmVhdGVkIGR1cmluZyBwcmVsb2FkLgorICogTmV3IG5vZGUgaXMgYWx3YXlzIGF0dGFjaGVkIHRvIHRoZSBmcm9udCBvZiBhY3RpdmF0ZWRfbGlzdAorICovCitzdGF0aWMgaW50IF9kbV90cmVlX3JldmVydF9hY3RpdmF0ZWQoc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50KQoreworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX2dlbihjaGlsZCwgJnBhcmVudC0+YWN0aXZhdGVkLCBhY3RpdmF0ZWRfbGlzdCkgeworCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUmV2ZXJ0aW5nICVzLiIsIGNoaWxkLT5uYW1lKTsKKwkJaWYgKCFfZGVhY3RpdmF0ZV9ub2RlKGNoaWxkLT5uYW1lLCBjaGlsZC0+aW5mby5tYWpvciwgY2hpbGQtPmluZm8ubWlub3IsCisJCQkJICAgICAgJmNoaWxkLT5kdHJlZS0+Y29va2llLCBjaGlsZC0+dWRldl9mbGFncywgMCkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgJXMgKCUiIFBSSXUzMgorCQkJCSAgIjolIiBQUkl1MzIgIikiLCBjaGlsZC0+bmFtZSwgY2hpbGQtPmluZm8ubWFqb3IsCisJCQkJICBjaGlsZC0+aW5mby5taW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIV9kbV90cmVlX3JldmVydF9hY3RpdmF0ZWQoY2hpbGQpKQorCQkJcmV0dXJuXzA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90cmVlX3ByZWxvYWRfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnV1aWRfcHJlZml4LAorCQkJICAgICBzaXplX3QgdXVpZF9wcmVmaXhfbGVuKQoreworCWludCByID0gMSwgbm9kZV9jcmVhdGVkID0gMDsKKwl2b2lkICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBkbV90cmVlX25vZGUgKmNoaWxkOworCXN0cnVjdCBkbV9pbmZvIG5ld2luZm87CisJaW50IHVwZGF0ZV9kZXZzX2ZsYWcgPSAwOworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZzsKKworCS8qIFByZWxvYWQgY2hpbGRyZW4gZmlyc3QgKi8KKwl3aGlsZSAoKGNoaWxkID0gZG1fdHJlZV9uZXh0X2NoaWxkKCZoYW5kbGUsIGRub2RlLCAwKSkpIHsKKwkJLyogU2tpcCBleGlzdGluZyBub24tZGV2aWNlLW1hcHBlciBkZXZpY2VzICovCisJCWlmICghY2hpbGQtPmluZm8uZXhpc3RzICYmIGNoaWxkLT5pbmZvLm1ham9yKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIGlmIGl0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgVkcgKi8KKwkJaWYgKGNoaWxkLT5pbmZvLmV4aXN0cyAmJgorCQkgICAgIV91dWlkX3ByZWZpeF9tYXRjaGVzKGNoaWxkLT51dWlkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkbV90cmVlX25vZGVfbnVtX2NoaWxkcmVuKGNoaWxkLCAwKSkKKwkJCWlmICghZG1fdHJlZV9wcmVsb2FkX2NoaWxkcmVuKGNoaWxkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuKSkKKwkJCQlyZXR1cm5fMDsKKworCQkvKiBGSVhNRSBDb3BlIGlmIG5hbWUgZXhpc3RzIHdpdGggbm8gdXVpZD8gKi8KKwkJaWYgKCFjaGlsZC0+aW5mby5leGlzdHMgJiYgIShub2RlX2NyZWF0ZWQgPSBfY3JlYXRlX25vZGUoY2hpbGQpKSkKKwkJCXJldHVybl8wOworCisJCWlmICghY2hpbGQtPmluZm8uaW5hY3RpdmVfdGFibGUgJiYKKwkJICAgIGNoaWxkLT5wcm9wcy5zZWdtZW50X2NvdW50ICYmCisJCSAgICAhX2xvYWRfbm9kZShjaGlsZCkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgdGFibGUgbG9hZCBkb2VzIG5vdCBzdWNjZWVkLCB3ZSByZW1vdmUgdGhlCisJCQkgKiBkZXZpY2UgaW4gdGhlIGtlcm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBoYXZlIGFuCisJCQkgKiBlbXB0eSB0YWJsZS4gIFRoaXMgbWFrZXMgdGhlIGNyZWF0ZSArIGxvYWQgb2YgdGhlCisJCQkgKiBkZXZpY2UgYXRvbWljLiAgSG93ZXZlciwgaWYgb3RoZXIgZGVwZW5kZW5jaWVzIGhhdmUKKwkJCSAqIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFuZCBsb2FkZWQ7IHRoaXMgY29kZSBpcworCQkJICogaW5zdWZmaWNpZW50IHRvIHJlbW92ZSB0aG9zZSAtIG9ubHkgdGhlIG5vZGUKKwkJCSAqIGVuY291bnRlcmluZyB0aGUgdGFibGUgbG9hZCBmYWlsdXJlIGlzIHJlbW92ZWQuCisJCQkgKi8KKwkJCWlmIChub2RlX2NyZWF0ZWQgJiYgIV9yZW1vdmVfbm9kZShjaGlsZCkpCisJCQkJcmV0dXJuXzA7CisJCQlyZXR1cm5fMDsKKwkJfQorCisJCS8qIFByb3BhZ2F0ZSBkZXZpY2Ugc2l6ZSBjaGFuZ2UgY2hhbmdlICovCisJCWlmIChjaGlsZC0+cHJvcHMuc2l6ZV9jaGFuZ2VkID4gMCAmJiAhZG5vZGUtPnByb3BzLnNpemVfY2hhbmdlZCkKKwkJCWRub2RlLT5wcm9wcy5zaXplX2NoYW5nZWQgPSAxOworCQllbHNlIGlmIChjaGlsZC0+cHJvcHMuc2l6ZV9jaGFuZ2VkIDwgMCkKKwkJCWRub2RlLT5wcm9wcy5zaXplX2NoYW5nZWQgPSAtMTsKKworCQkvKiBSZXN1bWUgZGV2aWNlIGltbWVkaWF0ZWx5IGlmIGl0IGhhcyBwYXJlbnRzIGFuZCBpdHMgc2l6ZSBjaGFuZ2VkICovCisJCWlmICghZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgMSkgfHwgIWNoaWxkLT5wcm9wcy5zaXplX2NoYW5nZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIW5vZGVfY3JlYXRlZCAmJiAoZG1fbGlzdF9zaXplKCZjaGlsZC0+cHJvcHMuc2VncykgPT0gMSkpIHsKKwkJCS8qIElmIHRoaW4tcG9vbCBjaGlsZCBub2RlcyB3ZXJlIHByZWxvYWRlZCBXSVRIIGNoYW5nZWQgc2l6ZQorCQkJICogc2tpcCBkZXZpY2UgcmVzdW1lLCBhcyB0aGlzIGlzIGxpa2VseSByZXNpemUgb2YgZGF0YSBvcgorCQkJICogbWV0YWRhdGEgZGV2aWNlIGFuZCBzbyB0aGluIHBvb2wgbmVlZHMgc3VzcGVuZCBiZWZvcmUKKwkJCSAqIHJlc3VtZSBvcGVyYXRpb24uCisJCQkgKiBOb3RlOiBjaGlsZC0+cHJvcHMuc2VnbWVudF9jb3VudCBpcyBhbHJlYWR5IDAgaGVyZQorCQkJICovCisJCQlzZWcgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9sYXN0KCZjaGlsZC0+cHJvcHMuc2VncyksCisJCQkJCSAgIHN0cnVjdCBsb2FkX3NlZ21lbnQpOworCQkJaWYgKHNlZy0+dHlwZSA9PSBTRUdfVEhJTl9QT09MKSB7CisJCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIlNraXBwaW5nIHJlc3VtZSBvZiB0aGluLXBvb2wgJXMuIiwKKwkJCQkJCSAgICAgY2hpbGQtPm5hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKCFjaGlsZC0+aW5mby5pbmFjdGl2ZV90YWJsZSAmJiAhY2hpbGQtPmluZm8uc3VzcGVuZGVkKQorCQkJY29udGludWU7CisKKwkJaWYgKCFfcmVzdW1lX25vZGUoY2hpbGQtPm5hbWUsIGNoaWxkLT5pbmZvLm1ham9yLCBjaGlsZC0+aW5mby5taW5vciwKKwkJCQkgIGNoaWxkLT5wcm9wcy5yZWFkX2FoZWFkLCBjaGlsZC0+cHJvcHMucmVhZF9haGVhZF9mbGFncywKKwkJCQkgICZuZXdpbmZvLCAmY2hpbGQtPmR0cmVlLT5jb29raWUsIGNoaWxkLT51ZGV2X2ZsYWdzLAorCQkJCSAgY2hpbGQtPmluZm8uc3VzcGVuZGVkKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVzdW1lICVzICglIiBQUkl1MzIKKwkJCQkgICI6JSIgUFJJdTMyICIpIiwgY2hpbGQtPm5hbWUsIGNoaWxkLT5pbmZvLm1ham9yLAorCQkJCSAgY2hpbGQtPmluZm8ubWlub3IpOworCQkJLyogSWYgdGhlIGRldmljZSB3YXMgbm90IHByZXZpb3VzbHkgYWN0aXZlLCB3ZSBtaWdodCBhcyB3ZWxsIHJlbW92ZSB0aGlzIG5vZGUuICovCisJCQlpZiAoIWNoaWxkLT5pbmZvLmxpdmVfdGFibGUgJiYKKwkJCSAgICAhX2RlYWN0aXZhdGVfbm9kZShjaGlsZC0+bmFtZSwgY2hpbGQtPmluZm8ubWFqb3IsIGNoaWxkLT5pbmZvLm1pbm9yLAorCQkJCQkgICAgICAmY2hpbGQtPmR0cmVlLT5jb29raWUsIGNoaWxkLT51ZGV2X2ZsYWdzLCAwKSkKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZWFjdGl2YXRlICVzICglIiBQUkl1MzIKKwkJCQkJICAiOiUiIFBSSXUzMiAiKSIsIGNoaWxkLT5uYW1lLCBjaGlsZC0+aW5mby5tYWpvciwKKwkJCQkJICBjaGlsZC0+aW5mby5taW5vcik7CisJCQlyID0gMDsKKwkJCS8qIEVhY2ggY2hpbGQgaXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghY2hpbGQtPmluZm8ubGl2ZV90YWJsZSkgeworCQkJLyogQ29sbGVjdCBuZXdseSBpbnRyb2R1Y2VkIGRldmljZXMgZm9yIHJldmVydCAqLworCQkJZG1fbGlzdF9hZGRfaCgmZG5vZGUtPmFjdGl2YXRlZCwgJmNoaWxkLT5hY3RpdmF0ZWRfbGlzdCk7CisKKwkJCS8qIFdoZW4gY3JlYXRpbmcgbmV3IG5vZGUgYWxzbyBjaGVjayB0cmFuc2FjdGlvbl9pZC4gKi8KKwkJCWlmIChjaGlsZC0+cHJvcHMuc2VuZF9tZXNzYWdlcyAmJgorCQkJICAgICFfbm9kZV9zZW5kX21lc3NhZ2VzKGNoaWxkLCB1dWlkX3ByZWZpeCwgdXVpZF9wcmVmaXhfbGVuLCAwKSkgeworCQkJCXN0YWNrOworCQkJCWlmICghZG1fdWRldl93YWl0KGRtX3RyZWVfZ2V0X2Nvb2tpZShkbm9kZSkpKQorCQkJCQlzdGFjazsKKwkJCQlkbV90cmVlX3NldF9jb29raWUoZG5vZGUsIDApOworCQkJCSh2b2lkKSBfZG1fdHJlZV9yZXZlcnRfYWN0aXZhdGVkKGRub2RlKTsKKwkJCQlyID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIFVwZGF0ZSBjYWNoZWQgaW5mbyAqLworCQljaGlsZC0+aW5mbyA9IG5ld2luZm87CisJCS8qCisJCSAqIFByZXBhcmUgZm9yIGltbWVkaWF0ZSBzeW5jaHJvbml6YXRpb24gd2l0aCB1ZGV2IGFuZCBmbHVzaCBhbGwgc3RhY2tlZAorCQkgKiBkZXYgbm9kZSBvcGVyYXRpb25zIGlmIHJlcXVlc3RlZCBieSBpbW1lZGlhdGVfZGV2X25vZGUgcHJvcGVydHkuIEJ1dAorCQkgKiBmaW5pc2ggcHJvY2Vzc2luZyBjdXJyZW50IGxldmVsIGluIHRoZSB0cmVlIGZpcnN0LgorCQkgKi8KKwkJaWYgKGNoaWxkLT5wcm9wcy5pbW1lZGlhdGVfZGV2X25vZGUpCisJCQl1cGRhdGVfZGV2c19mbGFnID0gMTsKKwl9CisKKwlpZiAodXBkYXRlX2RldnNfZmxhZyB8fAorCSAgICAociAmJiAhZG5vZGUtPmluZm8uZXhpc3RzICYmIGRub2RlLT5jYWxsYmFjaykpIHsKKwkJaWYgKCFkbV91ZGV2X3dhaXQoZG1fdHJlZV9nZXRfY29va2llKGRub2RlKSkpCisJCQlzdGFjazsKKwkJZG1fdHJlZV9zZXRfY29va2llKGRub2RlLCAwKTsKKworCQlpZiAociAmJiAhZG5vZGUtPmluZm8uZXhpc3RzICYmIGRub2RlLT5jYWxsYmFjayAmJgorCQkgICAgIWRub2RlLT5jYWxsYmFjayhkbm9kZSwgRE1fTk9ERV9DQUxMQkFDS19QUkVMT0FERUQsCisJCQkJICAgICBkbm9kZS0+Y2FsbGJhY2tfZGF0YSkpCisJCXsKKwkJCS8qIFRyeSB0byBkZWFjdGl2YXRlIHdoYXQgaGFzIGJlZW4gYWN0aXZhdGVkIGluIHByZWxvYWQgcGhhc2UgKi8KKwkJCSh2b2lkKSBfZG1fdHJlZV9yZXZlcnRfYWN0aXZhdGVkKGRub2RlKTsKKwkJCXJldHVybl8wOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdW5zdXJlLgorICovCitpbnQgZG1fdHJlZV9jaGlsZHJlbl91c2VfdXVpZChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsCisJCQkJIHNpemVfdCB1dWlkX3ByZWZpeF9sZW4pCit7CisJdm9pZCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpjaGlsZCA9IGRub2RlOworCWNvbnN0IGNoYXIgKnV1aWQ7CisKKwl3aGlsZSAoKGNoaWxkID0gZG1fdHJlZV9uZXh0X2NoaWxkKCZoYW5kbGUsIGRub2RlLCAwKSkpIHsKKwkJaWYgKCEodXVpZCA9IGRtX3RyZWVfbm9kZV9nZXRfdXVpZChjaGlsZCkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgdXVpZCBmb3IgZHRyZWUgbm9kZS4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKF91dWlkX3ByZWZpeF9tYXRjaGVzKHV1aWQsIHV1aWRfcHJlZml4LCB1dWlkX3ByZWZpeF9sZW4pKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGRtX3RyZWVfbm9kZV9udW1fY2hpbGRyZW4oY2hpbGQsIDApKQorCQkJZG1fdHJlZV9jaGlsZHJlbl91c2VfdXVpZChjaGlsZCwgdXVpZF9wcmVmaXgsIHV1aWRfcHJlZml4X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUYXJnZXQgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9hZF9zZWdtZW50ICpfYWRkX3NlZ21lbnQoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsIHVuc2lnbmVkIHR5cGUsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJaWYgKCEoc2VnID0gZG1fcG9vbF96YWxsb2MoZG5vZGUtPmR0cmVlLT5tZW0sIHNpemVvZigqc2VnKSkpKSB7CisJCWxvZ19lcnJvcigiZHRyZWUgbm9kZSBzZWdtZW50IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlZy0+dHlwZSA9IHR5cGU7CisJc2VnLT5zaXplID0gc2l6ZTsKKwlkbV9saXN0X2luaXQoJnNlZy0+YXJlYXMpOworCWRtX2xpc3RfYWRkKCZkbm9kZS0+cHJvcHMuc2VncywgJnNlZy0+bGlzdCk7CisJZG5vZGUtPnByb3BzLnNlZ21lbnRfY291bnQrKzsKKworCXJldHVybiBzZWc7Cit9CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3NuYXBzaG90X29yaWdpbl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUsCisJCQkJCSAgICB1aW50NjRfdCBzaXplLAorCQkJCQkgICAgY29uc3QgY2hhciAqb3JpZ2luX3V1aWQpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCXN0cnVjdCBkbV90cmVlX25vZGUgKm9yaWdpbl9ub2RlOworCisJaWYgKCEoc2VnID0gX2FkZF9zZWdtZW50KGRub2RlLCBTRUdfU05BUFNIT1RfT1JJR0lOLCBzaXplKSkpCisJCXJldHVybl8wOworCisJaWYgKCEob3JpZ2luX25vZGUgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKGRub2RlLT5kdHJlZSwgb3JpZ2luX3V1aWQpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgc25hcHNob3Qgb3JpZ2luIHV1aWQgJXMuIiwgb3JpZ2luX3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWctPm9yaWdpbiA9IG9yaWdpbl9ub2RlOworCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhkbm9kZSwgb3JpZ2luX25vZGUpKQorCQlyZXR1cm5fMDsKKworCS8qIFJlc3VtZSBzbmFwc2hvdCBvcmlnaW5zIGFmdGVyIG5ldyBzbmFwc2hvdHMgKi8KKwlkbm9kZS0+YWN0aXZhdGlvbl9wcmlvcml0eSA9IDE7CisKKwkvKgorCSAqIERvbid0IHJlc3VtZSB0aGUgb3JpZ2luIGltbWVkaWF0ZWx5IGluIGNhc2UgaXQgaXMgYSBub24tdHJpdmlhbCAKKwkgKiB0YXJnZXQgdGhhdCBtdXN0IG5vdCBiZSBhY3RpdmUgbW9yZSB0aGFuIG9uY2UgY29uY3VycmVudGx5IQorCSAqLworCW9yaWdpbl9ub2RlLT5wcm9wcy5kZWxheV9yZXN1bWVfaWZfbmV3ID0gMTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfc25hcHNob3RfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJdWludDY0X3Qgc2l6ZSwKKwkJCQljb25zdCBjaGFyICpvcmlnaW5fdXVpZCwKKwkJCQljb25zdCBjaGFyICpjb3dfdXVpZCwKKwkJCQljb25zdCBjaGFyICptZXJnZV91dWlkLAorCQkJCWludCBwZXJzaXN0ZW50LAorCQkJCXVpbnQzMl90IGNodW5rX3NpemUpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCXN0cnVjdCBkbV90cmVlX25vZGUgKm9yaWdpbl9ub2RlLCAqY293X25vZGUsICptZXJnZV9ub2RlOworCXVuc2lnbmVkIHNlZ190eXBlOworCisJc2VnX3R5cGUgPSAhbWVyZ2VfdXVpZCA/IFNFR19TTkFQU0hPVCA6IFNFR19TTkFQU0hPVF9NRVJHRTsKKworCWlmICghKHNlZyA9IF9hZGRfc2VnbWVudChub2RlLCBzZWdfdHlwZSwgc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKG9yaWdpbl9ub2RlID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgb3JpZ2luX3V1aWQpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgc25hcHNob3Qgb3JpZ2luIHV1aWQgJXMuIiwgb3JpZ2luX3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWctPm9yaWdpbiA9IG9yaWdpbl9ub2RlOworCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBvcmlnaW5fbm9kZSkpCisJCXJldHVybl8wOworCisJaWYgKCEoY293X25vZGUgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKG5vZGUtPmR0cmVlLCBjb3dfdXVpZCkpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBzbmFwc2hvdCBDT1cgZGV2aWNlIHV1aWQgJXMuIiwgY293X3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZWctPmNvdyA9IGNvd19ub2RlOworCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBjb3dfbm9kZSkpCisJCXJldHVybl8wOworCisJc2VnLT5wZXJzaXN0ZW50ID0gcGVyc2lzdGVudCA/IDEgOiAwOworCXNlZy0+Y2h1bmtfc2l6ZSA9IGNodW5rX3NpemU7CisKKwlpZiAobWVyZ2VfdXVpZCkgeworCQlpZiAoIShtZXJnZV9ub2RlID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgbWVyZ2VfdXVpZCkpKSB7CisJCQkvKiBub3QgYSBwdXJlIGVycm9yLCBtZXJnaW5nIHNuYXBzaG90IG1heSBoYXZlIGJlZW4gZGVhY3RpdmF0ZWQgKi8KKwkJCWxvZ192ZXJib3NlKCJDb3VsZG4ndCBmaW5kIG1lcmdpbmcgc25hcHNob3QgdXVpZCAlcy4iLCBtZXJnZV91dWlkKTsKKwkJfSBlbHNlIHsKKwkJCXNlZy0+bWVyZ2UgPSBtZXJnZV9ub2RlOworCQkJLyogbXVzdCBub3QgbGluayBtZXJnaW5nIHNuYXBzaG90LCB3b3VsZCB1bmRlcm1pbmUgYWN0aXZhdGlvbl9wcmlvcml0eSBiZWxvdyAqLworCQl9CisKKwkJLyogUmVzdW1lIHNuYXBzaG90LW1lcmdlIChhY3Rpbmcgb3JpZ2luKSBhZnRlciBvdGhlciBzbmFwc2hvdHMgKi8KKwkJbm9kZS0+YWN0aXZhdGlvbl9wcmlvcml0eSA9IDE7CisJCWlmIChzZWctPm1lcmdlKSB7CisJCQkvKiBSZXN1bWUgbWVyZ2luZyBzbmFwc2hvdCBhZnRlciBzbmFwc2hvdC1tZXJnZSAqLworCQkJc2VnLT5tZXJnZS0+YWN0aXZhdGlvbl9wcmlvcml0eSA9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9zbmFwc2hvdF90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgICAgIHVpbnQ2NF90IHNpemUsCisJCQkJICAgICBjb25zdCBjaGFyICpvcmlnaW5fdXVpZCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNvd191dWlkLAorCQkJCSAgICAgaW50IHBlcnNpc3RlbnQsCisJCQkJICAgICB1aW50MzJfdCBjaHVua19zaXplKQoreworCXJldHVybiBfYWRkX3NuYXBzaG90X3RhcmdldChub2RlLCBzaXplLCBvcmlnaW5fdXVpZCwgY293X3V1aWQsCisJCQkJICAgIE5VTEwsIHBlcnNpc3RlbnQsIGNodW5rX3NpemUpOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9zbmFwc2hvdF9tZXJnZV90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJICAgdWludDY0X3Qgc2l6ZSwKKwkJCQkJICAgY29uc3QgY2hhciAqb3JpZ2luX3V1aWQsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmNvd191dWlkLAorCQkJCQkgICBjb25zdCBjaGFyICptZXJnZV91dWlkLAorCQkJCQkgICB1aW50MzJfdCBjaHVua19zaXplKQoreworCXJldHVybiBfYWRkX3NuYXBzaG90X3RhcmdldChub2RlLCBzaXplLCBvcmlnaW5fdXVpZCwgY293X3V1aWQsCisJCQkJICAgIG1lcmdlX3V1aWQsIDEsIGNodW5rX3NpemUpOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9lcnJvcl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgIHVpbnQ2NF90IHNpemUpCit7CisJaWYgKCFfYWRkX3NlZ21lbnQobm9kZSwgU0VHX0VSUk9SLCBzaXplKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfemVyb190YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgdWludDY0X3Qgc2l6ZSkKK3sKKwlpZiAoIV9hZGRfc2VnbWVudChub2RlLCBTRUdfWkVSTywgc2l6ZSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90cmVlX25vZGVfYWRkX2xpbmVhcl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkgICB1aW50NjRfdCBzaXplKQoreworCWlmICghX2FkZF9zZWdtZW50KG5vZGUsIFNFR19MSU5FQVIsIHNpemUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9zdHJpcGVkX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICB1aW50NjRfdCBzaXplLAorCQkJCSAgICB1aW50MzJfdCBzdHJpcGVfc2l6ZSkKK3sKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWc7CisKKwlpZiAoIShzZWcgPSBfYWRkX3NlZ21lbnQobm9kZSwgU0VHX1NUUklQRUQsIHNpemUpKSkKKwkJcmV0dXJuXzA7CisKKwlzZWctPnN0cmlwZV9zaXplID0gc3RyaXBlX3NpemU7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfY3J5cHRfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICB1aW50NjRfdCBzaXplLAorCQkJCSAgY29uc3QgY2hhciAqY2lwaGVyLAorCQkJCSAgY29uc3QgY2hhciAqY2hhaW5tb2RlLAorCQkJCSAgY29uc3QgY2hhciAqaXYsCisJCQkJICB1aW50NjRfdCBpdl9vZmZzZXQsCisJCQkJICBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJaWYgKCEoc2VnID0gX2FkZF9zZWdtZW50KG5vZGUsIFNFR19DUllQVCwgc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCXNlZy0+Y2lwaGVyID0gY2lwaGVyOworCXNlZy0+Y2hhaW5tb2RlID0gY2hhaW5tb2RlOworCXNlZy0+aXYgPSBpdjsKKwlzZWctPml2X29mZnNldCA9IGl2X29mZnNldDsKKwlzZWctPmtleSA9IGtleTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9taXJyb3JfdGFyZ2V0X2xvZyhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgICB1aW50MzJfdCByZWdpb25fc2l6ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgY2x1c3RlcmVkLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpsb2dfdXVpZCwKKwkJCQkgICAgICAgdW5zaWduZWQgYXJlYV9jb3VudCwKKwkJCQkgICAgICAgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqbG9nX25vZGUgPSBOVUxMOworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZzsKKworCWlmICghbm9kZS0+cHJvcHMuc2VnbWVudF9jb3VudCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkF0dGVtcHQgdG8gYWRkIHRhcmdldCBhcmVhIHRvIG1pc3Npbmcgc2VnbWVudC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VnID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfbGFzdCgmbm9kZS0+cHJvcHMuc2VncyksIHN0cnVjdCBsb2FkX3NlZ21lbnQpOworCisJaWYgKGxvZ191dWlkKSB7CisJCWlmICghKHNlZy0+dXVpZCA9IGRtX3Bvb2xfc3RyZHVwKG5vZGUtPmR0cmVlLT5tZW0sIGxvZ191dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigibG9nIHV1aWQgcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKGZsYWdzICYgRE1fQ09SRUxPRykpCisJCQkvKiBGb3IgcHZtb3ZlOiBpbW1lZGlhdGUgcmVzdW1lIChmb3Igc2l6ZSB2YWxpZGF0aW9uKSBpc24ndCBuZWVkZWQuICovCisJCQlub2RlLT5wcm9wcy5kZWxheV9yZXN1bWVfaWZfbmV3ID0gMTsKKwkJZWxzZSB7CisJCQlpZiAoIShsb2dfbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQobm9kZS0+ZHRyZWUsIGxvZ191dWlkKSkpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgbWlycm9yIGxvZyB1dWlkICVzLiIsIGxvZ191dWlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKGNsdXN0ZXJlZCkKKwkJCQlsb2dfbm9kZS0+cHJvcHMuaW1tZWRpYXRlX2Rldl9ub2RlID0gMTsKKworCQkJLyogVGhlIGtlcm5lbCB2YWxpZGF0ZXMgdGhlIHNpemUgb2YgZGlzayBsb2dzLiAqLworCQkJLyogRklYTUUgUHJvcGFnYXRlIHRvIGFueSBkZXZpY2VzIGJlbG93ICovCisJCQlsb2dfbm9kZS0+cHJvcHMuZGVsYXlfcmVzdW1lX2lmX25ldyA9IDA7CisKKwkJCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBsb2dfbm9kZSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9CisKKwlzZWctPmxvZyA9IGxvZ19ub2RlOworCXNlZy0+cmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZTsKKwlzZWctPmNsdXN0ZXJlZCA9IGNsdXN0ZXJlZDsKKwlzZWctPm1pcnJvcl9hcmVhX2NvdW50ID0gYXJlYV9jb3VudDsKKwlzZWctPmZsYWdzID0gZmxhZ3M7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfbWlycm9yX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgIHVpbnQ2NF90IHNpemUpCit7CisJaWYgKCFfYWRkX3NlZ21lbnQobm9kZSwgU0VHX01JUlJPUkVELCBzaXplKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfcmFpZF90YXJnZXRfd2l0aF9wYXJhbXMoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJICAgICB1aW50NjRfdCBzaXplLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGVfcmFpZF9wYXJhbXMgKnApCit7CisJdW5zaWduZWQgaTsKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWcgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX2RtX3NlZ3R5cGVzKSAmJiAhc2VnOyArK2kpCisJCWlmICghc3RyY21wKHAtPnJhaWRfdHlwZSwgX2RtX3NlZ3R5cGVzW2ldLnRhcmdldCkpCisJCQlpZiAoIShzZWcgPSBfYWRkX3NlZ21lbnQobm9kZSwKKwkJCQkJCSBfZG1fc2VndHlwZXNbaV0udHlwZSwgc2l6ZSkpKQorCQkJCXJldHVybl8wOworCWlmICghc2VnKSB7CisJCWxvZ19lcnJvcigiVW5zdXBwb3J0ZWQgcmFpZCB0eXBlICVzLiIsIHAtPnJhaWRfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCXNlZy0+cmVnaW9uX3NpemUgPSBwLT5yZWdpb25fc2l6ZTsKKwlzZWctPnN0cmlwZV9zaXplID0gcC0+c3RyaXBlX3NpemU7CisJc2VnLT5hcmVhX2NvdW50ID0gMDsKKwlzZWctPnJlYnVpbGRzID0gcC0+cmVidWlsZHM7CisJc2VnLT53cml0ZW1vc3RseSA9IHAtPndyaXRlbW9zdGx5OworCXNlZy0+d3JpdGViZWhpbmQgPSBwLT53cml0ZWJlaGluZDsKKwlzZWctPm1pbl9yZWNvdmVyeV9yYXRlID0gcC0+bWluX3JlY292ZXJ5X3JhdGU7CisJc2VnLT5tYXhfcmVjb3ZlcnlfcmF0ZSA9IHAtPm1heF9yZWNvdmVyeV9yYXRlOworCXNlZy0+ZmxhZ3MgPSBwLT5mbGFnczsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9yYWlkX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSB1aW50NjRfdCBzaXplLAorCQkJCSBjb25zdCBjaGFyICpyYWlkX3R5cGUsCisJCQkJIHVpbnQzMl90IHJlZ2lvbl9zaXplLAorCQkJCSB1aW50MzJfdCBzdHJpcGVfc2l6ZSwKKwkJCQkgdWludDY0X3QgcmVidWlsZHMsCisJCQkJIHVpbnQ2NF90IGZsYWdzKQoreworCXN0cnVjdCBkbV90cmVlX25vZGVfcmFpZF9wYXJhbXMgcGFyYW1zID0geworCQkucmFpZF90eXBlID0gcmFpZF90eXBlLAorCQkucmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZSwKKwkJLnN0cmlwZV9zaXplID0gc3RyaXBlX3NpemUsCisJCS5yZWJ1aWxkcyA9IHJlYnVpbGRzLAorCQkuZmxhZ3MgPSBmbGFncworCX07CisKKwlyZXR1cm4gZG1fdHJlZV9ub2RlX2FkZF9yYWlkX3RhcmdldF93aXRoX3BhcmFtcyhub2RlLCBzaXplLCAmcGFyYW1zKTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfY2FjaGVfdGFyZ2V0KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICB1aW50NjRfdCBzaXplLAorCQkJCSAgdWludDY0X3QgZmVhdHVyZV9mbGFncywgLyogRE1fQ0FDSEVfRkVBVFVSRV8qICovCisJCQkJICBjb25zdCBjaGFyICptZXRhZGF0YV91dWlkLAorCQkJCSAgY29uc3QgY2hhciAqZGF0YV91dWlkLAorCQkJCSAgY29uc3QgY2hhciAqb3JpZ2luX3V1aWQsCisJCQkJICBjb25zdCBjaGFyICpwb2xpY3lfbmFtZSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBkbV9jb25maWdfbm9kZSAqcG9saWN5X3NldHRpbmdzLAorCQkJCSAgdWludDMyX3QgZGF0YV9ibG9ja19zaXplKQoreworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqY247CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJc3dpdGNoIChmZWF0dXJlX2ZsYWdzICYKKwkJKERNX0NBQ0hFX0ZFQVRVUkVfUEFTU1RIUk9VR0ggfAorCQkgRE1fQ0FDSEVfRkVBVFVSRV9XUklURVRIUk9VR0ggfAorCQkgRE1fQ0FDSEVfRkVBVFVSRV9XUklURUJBQ0spKSB7CisJCSBjYXNlIERNX0NBQ0hFX0ZFQVRVUkVfUEFTU1RIUk9VR0g6CisJCSBjYXNlIERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVUSFJPVUdIOgorCQkgY2FzZSBETV9DQUNIRV9GRUFUVVJFX1dSSVRFQkFDSzoKKwkJCSBicmVhazsKKwkJIGRlZmF1bHQ6CisJCQkgbG9nX2Vycm9yKCJJbnZhbGlkIGNhY2hlJ3MgZmVhdHVyZSBmbGFnICIgRk1UdTY0ICIuIiwKKwkJCQkgICBmZWF0dXJlX2ZsYWdzKTsKKwkJCSByZXR1cm4gMDsKKwl9CisKKwlpZiAoZGF0YV9ibG9ja19zaXplIDwgRE1fQ0FDSEVfTUlOX0RBVEFfQkxPQ0tfU0laRSkgeworCQlsb2dfZXJyb3IoIkRhdGEgYmxvY2sgc2l6ZSAldSBpcyBsb3dlciB0aGVuICV1IHNlY3RvcnMuIiwKKwkJCSAgZGF0YV9ibG9ja19zaXplLCBETV9DQUNIRV9NSU5fREFUQV9CTE9DS19TSVpFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRhdGFfYmxvY2tfc2l6ZSA+IERNX0NBQ0hFX01BWF9EQVRBX0JMT0NLX1NJWkUpIHsKKwkJbG9nX2Vycm9yKCJEYXRhIGJsb2NrIHNpemUgJXUgaXMgaGlnaGVyIHRoZW4gJXUgc2VjdG9ycy4iLAorCQkJICBkYXRhX2Jsb2NrX3NpemUsIERNX0NBQ0hFX01BWF9EQVRBX0JMT0NLX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzZWcgPSBfYWRkX3NlZ21lbnQobm9kZSwgU0VHX0NBQ0hFLCBzaXplKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc2VnLT5wb29sID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwKKwkJCQkJCSAgICBkYXRhX3V1aWQpKSkgeworCQlsb2dfZXJyb3IoIk1pc3NpbmcgY2FjaGUncyBkYXRhIHV1aWQgJXMuIiwKKwkJCSAgZGF0YV91dWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBzZWctPnBvb2wpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZy0+bWV0YWRhdGEgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKG5vZGUtPmR0cmVlLAorCQkJCQkJCW1ldGFkYXRhX3V1aWQpKSkgeworCQlsb2dfZXJyb3IoIk1pc3NpbmcgY2FjaGUncyBtZXRhZGF0YSB1dWlkICVzLiIsCisJCQkgIG1ldGFkYXRhX3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFfbGlua190cmVlX25vZGVzKG5vZGUsIHNlZy0+bWV0YWRhdGEpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZy0+b3JpZ2luID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwKKwkJCQkJCSAgICAgIG9yaWdpbl91dWlkKSkpIHsKKwkJbG9nX2Vycm9yKCJNaXNzaW5nIGNhY2hlJ3Mgb3JpZ2luIHV1aWQgJXMuIiwKKwkJCSAgbWV0YWRhdGFfdXVpZCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIV9saW5rX3RyZWVfbm9kZXMobm9kZSwgc2VnLT5vcmlnaW4pKQorCQlyZXR1cm5fMDsKKworCXNlZy0+ZGF0YV9ibG9ja19zaXplID0gZGF0YV9ibG9ja19zaXplOworCS8qIEVuZm9yY2UgV3JpdGVUaG91Z2ggbW9kZSBmb3IgY2xlYW5lciBwb2xpY3kgKi8KKwlzZWctPmZsYWdzID0gKHN0cmNtcChwb2xpY3lfbmFtZSwgImNsZWFuZXIiKSA9PSAwKSA/IERNX0NBQ0hFX0ZFQVRVUkVfV1JJVEVUSFJPVUdIIDogZmVhdHVyZV9mbGFnczsKKwlzZWctPnBvbGljeV9uYW1lID0gcG9saWN5X25hbWU7CisKKwkvKiBGSVhNRTogYmV0dGVyIHZhbGlkYXRpb24gbWlzc2luZyAqLworCWlmIChwb2xpY3lfc2V0dGluZ3MpIHsKKwkJaWYgKCEoc2VnLT5wb2xpY3lfc2V0dGluZ3MgPSBkbV9jb25maWdfY2xvbmVfbm9kZV93aXRoX21lbShub2RlLT5kdHJlZS0+bWVtLCBwb2xpY3lfc2V0dGluZ3MsIDApKSkKKwkJCXJldHVybl8wOworCisJCWZvciAoY24gPSBzZWctPnBvbGljeV9zZXR0aW5ncy0+Y2hpbGQ7IGNuOyBjbiA9IGNuLT5zaWIpIHsKKwkJCWlmICghY24tPnYgfHwgKGNuLT52LT50eXBlICE9IERNX0NGR19JTlQpKSB7CisJCQkJLyogRm9yIG5vdyBvbmx5ICA8a2V5PiA9IDxpbnQ+ICBwYWlycyBhcmUgc3VwcG9ydGVkICovCisJCQkJbG9nX2Vycm9yKCJDYWNoZSBwb2xpY3kgcGFyYW1ldGVyICVzIGlzIHdpdGhvdXQgaW50ZWdlciB2YWx1ZS4iLCBjbi0+a2V5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNlZy0+cG9saWN5X2FyZ2MrKzsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9yZXBsaWNhdG9yX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgICB1aW50NjRfdCBzaXplLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpybG9nX3V1aWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnJsb2dfdHlwZSwKKwkJCQkgICAgICAgdW5zaWduZWQgcnNpdGVfaW5kZXgsCisJCQkJICAgICAgIGRtX3JlcGxpY2F0b3JfbW9kZV90IG1vZGUsCisJCQkJICAgICAgIHVpbnQzMl90IGFzeW5jX3RpbWVvdXQsCisJCQkJICAgICAgIHVpbnQ2NF90IGZhbGxfYmVoaW5kX2RhdGEsCisJCQkJICAgICAgIHVpbnQzMl90IGZhbGxfYmVoaW5kX2lvcykKK3sKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpyc2VnOworCXN0cnVjdCByZXBsaWNhdG9yX3NpdGUgKnJzaXRlOworCisJLyogTG9jYWwgc2l0ZTAgLSBhZGRzIHJlcGxpY2F0b3Igc2VnbWVudCBhbmQgbGlua3MgcmxvZyBkZXZpY2UgKi8KKwlpZiAocnNpdGVfaW5kZXggPT0gUkVQTElDQVRPUl9MT0NBTF9TSVRFKSB7CisJCWlmIChub2RlLT5wcm9wcy5zZWdtZW50X2NvdW50KSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkF0dGVtcHQgdG8gYWRkIHJlcGxpY2F0b3Igc2VnbWVudCB0byBhbHJlYWR5IHVzZWQgbm9kZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCEocnNlZyA9IF9hZGRfc2VnbWVudChub2RlLCBTRUdfUkVQTElDQVRPUiwgc2l6ZSkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCEocnNlZy0+bG9nID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgcmxvZ191dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigiTWlzc2luZyByZXBsaWNhdG9yIGxvZyB1dWlkICVzLiIsIHJsb2dfdXVpZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCByc2VnLT5sb2cpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKHN0cmNtcChybG9nX3R5cGUsICJyaW5nYnVmZmVyIikgIT0gMCkgeworCQkJbG9nX2Vycm9yKCJVbnN1cHBvcnRlZCByZXBsaWNhdG9yIGxvZyB0eXBlICVzLiIsIHJsb2dfdHlwZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghKHJzZWctPnJsb2dfdHlwZSA9IGRtX3Bvb2xfc3RyZHVwKG5vZGUtPmR0cmVlLT5tZW0sIHJsb2dfdHlwZSkpKQorCQkJcmV0dXJuXzA7CisKKwkJZG1fbGlzdF9pbml0KCZyc2VnLT5yc2l0ZXMpOworCQlyc2VnLT5yZGV2aWNlX2NvdW50ID0gMDsKKwkJbm9kZS0+YWN0aXZhdGlvbl9wcmlvcml0eSA9IDE7CisJfQorCisJLyogQWRkIHNpdGUgdG8gc2VnbWVudCAqLworCWlmIChtb2RlID09IERNX1JFUExJQ0FUT1JfU1lOQworCSAgICAmJiAoYXN5bmNfdGltZW91dCB8fCBmYWxsX2JlaGluZF9pb3MgfHwgZmFsbF9iZWhpbmRfZGF0YSkpIHsKKwkJbG9nX2Vycm9yKCJBc3luYyBwYXJhbWV0ZXJzIHBhc3NlZCBmb3Igc3luY2hyb25ub3VzIHJlcGxpY2F0b3IuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChub2RlLT5wcm9wcy5zZWdtZW50X2NvdW50ICE9IDEpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJBdHRlbXB0IHRvIGFkZCByZW1vdGUgc2l0ZSBhcmVhIGJlZm9yZSBzZXR0aW5nIHJlcGxpY2F0b3IgbG9nLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyc2VnID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfbGFzdCgmbm9kZS0+cHJvcHMuc2VncyksIHN0cnVjdCBsb2FkX3NlZ21lbnQpOworCWlmIChyc2VnLT50eXBlICE9IFNFR19SRVBMSUNBVE9SKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byB1c2Ugbm9uIHJlcGxpY2F0b3Igc2VnbWVudCAlcy4iLAorCQkJICBfZG1fc2VndHlwZXNbcnNlZy0+dHlwZV0udGFyZ2V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEocnNpdGUgPSBkbV9wb29sX3phbGxvYyhub2RlLT5kdHJlZS0+bWVtLCBzaXplb2YoKnJzaXRlKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHJlbW90ZSBzaXRlIHNlZ21lbnQuIik7CisJCXJldHVybiAwOworCX0KKworCWRtX2xpc3RfYWRkKCZyc2VnLT5yc2l0ZXMsICZyc2l0ZS0+bGlzdCk7CisJcnNlZy0+cnNpdGVfY291bnQrKzsKKworCXJzaXRlLT5tb2RlID0gbW9kZTsKKwlyc2l0ZS0+YXN5bmNfdGltZW91dCA9IGFzeW5jX3RpbWVvdXQ7CisJcnNpdGUtPmZhbGxfYmVoaW5kX2RhdGEgPSBmYWxsX2JlaGluZF9kYXRhOworCXJzaXRlLT5mYWxsX2JlaGluZF9pb3MgPSBmYWxsX2JlaGluZF9pb3M7CisJcnNpdGUtPnJzaXRlX2luZGV4ID0gcnNpdGVfaW5kZXg7CisKKwlyZXR1cm4gMTsKK30KKworLyogQXBwZW5kcyBkZXZpY2Ugbm9kZSB0byBSZXBsaWNhdG9yICovCitpbnQgZG1fdHJlZV9ub2RlX2FkZF9yZXBsaWNhdG9yX2Rldl90YXJnZXQoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJICAgdWludDY0X3Qgc2l6ZSwKKwkJCQkJICAgY29uc3QgY2hhciAqcmVwbGljYXRvcl91dWlkLAorCQkJCQkgICB1aW50NjRfdCByZGV2aWNlX2luZGV4LAorCQkJCQkgICBjb25zdCBjaGFyICpyZGV2X3V1aWQsCisJCQkJCSAgIHVuc2lnbmVkIHJzaXRlX2luZGV4LAorCQkJCQkgICBjb25zdCBjaGFyICpzbG9nX3V1aWQsCisJCQkJCSAgIHVpbnQzMl90IHNsb2dfZmxhZ3MsCisJCQkJCSAgIHVpbnQzMl90IHNsb2dfcmVnaW9uX3NpemUpCit7CisJc3RydWN0IHNlZ19hcmVhICphcmVhOworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnJzZWc7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqcmVwX3NlZzsKKworCWlmIChyc2l0ZV9pbmRleCA9PSBSRVBMSUNBVE9SX0xPQ0FMX1NJVEUpIHsKKwkJLyogU2l0ZSBpbmRleCBmb3IgbG9jYWwgdGFyZ2V0ICovCisJCWlmICghKHJzZWcgPSBfYWRkX3NlZ21lbnQobm9kZSwgU0VHX1JFUExJQ0FUT1JfREVWLCBzaXplKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIShyc2VnLT5yZXBsaWNhdG9yID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgcmVwbGljYXRvcl91dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigiTWlzc2luZyByZXBsaWNhdG9yIHV1aWQgJXMuIiwgcmVwbGljYXRvcl91dWlkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTG9jYWwgc2xpbmswIGZvciByZXBsaWNhdG9yIG11c3QgYmUgYWx3YXlzIGluaXRpYWxpemVkIGZpcnN0ICovCisJCWlmIChyc2VnLT5yZXBsaWNhdG9yLT5wcm9wcy5zZWdtZW50X2NvdW50ICE9IDEpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byB1c2Ugbm9uIHJlcGxpY2F0b3Igc2VnbWVudC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmVwX3NlZyA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2xhc3QoJnJzZWctPnJlcGxpY2F0b3ItPnByb3BzLnNlZ3MpLCBzdHJ1Y3QgbG9hZF9zZWdtZW50KTsKKwkJaWYgKHJlcF9zZWctPnR5cGUgIT0gU0VHX1JFUExJQ0FUT1IpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byB1c2Ugbm9uIHJlcGxpY2F0b3Igc2VnbWVudCAlcy4iLAorCQkJCSAgX2RtX3NlZ3R5cGVzW3JlcF9zZWctPnR5cGVdLnRhcmdldCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXBfc2VnLT5yZGV2aWNlX2NvdW50Kys7CisKKwkJaWYgKCFfbGlua190cmVlX25vZGVzKG5vZGUsIHJzZWctPnJlcGxpY2F0b3IpKQorCQkJcmV0dXJuXzA7CisKKwkJcnNlZy0+cmRldmljZV9pbmRleCA9IHJkZXZpY2VfaW5kZXg7CisJfSBlbHNlIHsKKwkJLyogTG9jYWwgc2xpbmswIGZvciByZXBsaWNhdG9yIG11c3QgYmUgYWx3YXlzIGluaXRpYWxpemVkIGZpcnN0ICovCisJCWlmIChub2RlLT5wcm9wcy5zZWdtZW50X2NvdW50ICE9IDEpIHsKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQXR0ZW1wdCB0byB1c2Ugbm9uIHJlcGxpY2F0b3ItZGV2IHNlZ21lbnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJzZWcgPSBkbV9saXN0X2l0ZW0oZG1fbGlzdF9sYXN0KCZub2RlLT5wcm9wcy5zZWdzKSwgc3RydWN0IGxvYWRfc2VnbWVudCk7CisJCWlmIChyc2VnLT50eXBlICE9IFNFR19SRVBMSUNBVE9SX0RFVikgeworCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJBdHRlbXB0IHRvIHVzZSBub24gcmVwbGljYXRvci1kZXYgc2VnbWVudCAlcy4iLAorCQkJCSAgX2RtX3NlZ3R5cGVzW3JzZWctPnR5cGVdLnRhcmdldCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghKHNsb2dfZmxhZ3MgJiBETV9DT1JFTE9HKSAmJiAhc2xvZ191dWlkKSB7CisJCWxvZ19lcnJvcigiVW5zcGVjaWZpZWQgc3luYyBsb2cgdXVpZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhKG5vZGUsIE5VTEwsIHJkZXZfdXVpZCwgMCkpCisJCXJldHVybl8wOworCisJYXJlYSA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2xhc3QoJnJzZWctPmFyZWFzKSwgc3RydWN0IHNlZ19hcmVhKTsKKworCWlmICghKHNsb2dfZmxhZ3MgJiBETV9DT1JFTE9HKSkgeworCQlpZiAoIShhcmVhLT5zbG9nID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgc2xvZ191dWlkKSkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBzeW5jIGxvZyB1dWlkICVzLiIsIHNsb2dfdXVpZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBhcmVhLT5zbG9nKSkKKwkJCXJldHVybl8wOworCX0KKworCWFyZWEtPmZsYWdzID0gc2xvZ19mbGFnczsKKwlhcmVhLT5yZWdpb25fc2l6ZSA9IHNsb2dfcmVnaW9uX3NpemU7CisJYXJlYS0+cnNpdGVfaW5kZXggPSByc2l0ZV9pbmRleDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGxvYWRfc2VnbWVudCAqX2dldF9zaW5nbGVfbG9hZF9zZWdtZW50KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCQkgICAgIHVuc2lnbmVkIHR5cGUpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJaWYgKG5vZGUtPnByb3BzLnNlZ21lbnRfY291bnQgIT0gMSkgeworCQlsb2dfZXJyb3IoIk5vZGUgJXMgbXVzdCBoYXZlIG9ubHkgb25lIHNlZ21lbnQuIiwKKwkJCSAgX2RtX3NlZ3R5cGVzW3R5cGVdLnRhcmdldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlZyA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2xhc3QoJm5vZGUtPnByb3BzLnNlZ3MpLCBzdHJ1Y3QgbG9hZF9zZWdtZW50KTsKKwlpZiAoc2VnLT50eXBlICE9IHR5cGUpIHsKKwkJbG9nX2Vycm9yKCJOb2RlICVzIGhhcyBzZWdtZW50IHR5cGUgJXMuIiwKKwkJCSAgX2RtX3NlZ3R5cGVzW3R5cGVdLnRhcmdldCwKKwkJCSAgX2RtX3NlZ3R5cGVzW3NlZy0+dHlwZV0udGFyZ2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHNlZzsKK30KKworc3RhdGljIGludCBfdGhpbl92YWxpZGF0ZV9kZXZpY2VfaWQodWludDMyX3QgZGV2aWNlX2lkKQoreworCWlmIChkZXZpY2VfaWQgPiBETV9USElOX01BWF9ERVZJQ0VfSUQpIHsKKwkJbG9nX2Vycm9yKCJEZXZpY2UgaWQgJXUgaXMgaGlnaGVyIHRoZW4gJXUuIiwKKwkJCSAgZGV2aWNlX2lkLCBETV9USElOX01BWF9ERVZJQ0VfSUQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3RyZWVfbm9kZV9hZGRfdGhpbl9wb29sX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgIHVpbnQ2NF90IHNpemUsCisJCQkJICAgICAgdWludDY0X3QgdHJhbnNhY3Rpb25faWQsCisJCQkJICAgICAgY29uc3QgY2hhciAqbWV0YWRhdGFfdXVpZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpwb29sX3V1aWQsCisJCQkJICAgICAgdWludDMyX3QgZGF0YV9ibG9ja19zaXplLAorCQkJCSAgICAgIHVpbnQ2NF90IGxvd193YXRlcl9tYXJrLAorCQkJCSAgICAgIHVuc2lnbmVkIHNraXBfYmxvY2tfemVyb2luZykKK3sKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWcsICptc2VnOworCXVpbnQ2NF90IGRldnNpemUgPSAwOworCisJaWYgKGRhdGFfYmxvY2tfc2l6ZSA8IERNX1RISU5fTUlOX0RBVEFfQkxPQ0tfU0laRSkgeworCQlsb2dfZXJyb3IoIkRhdGEgYmxvY2sgc2l6ZSAldSBpcyBsb3dlciB0aGVuICV1IHNlY3RvcnMuIiwKKwkJCSAgZGF0YV9ibG9ja19zaXplLCBETV9USElOX01JTl9EQVRBX0JMT0NLX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGF0YV9ibG9ja19zaXplID4gRE1fVEhJTl9NQVhfREFUQV9CTE9DS19TSVpFKSB7CisJCWxvZ19lcnJvcigiRGF0YSBibG9jayBzaXplICV1IGlzIGhpZ2hlciB0aGVuICV1IHNlY3RvcnMuIiwKKwkJCSAgZGF0YV9ibG9ja19zaXplLCBETV9USElOX01BWF9EQVRBX0JMT0NLX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzZWcgPSBfYWRkX3NlZ21lbnQobm9kZSwgU0VHX1RISU5fUE9PTCwgc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNlZy0+bWV0YWRhdGEgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKG5vZGUtPmR0cmVlLCBtZXRhZGF0YV91dWlkKSkpIHsKKwkJbG9nX2Vycm9yKCJNaXNzaW5nIG1ldGFkYXRhIHV1aWQgJXMuIiwgbWV0YWRhdGFfdXVpZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX2xpbmtfdHJlZV9ub2Rlcyhub2RlLCBzZWctPm1ldGFkYXRhKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRTogbW9yZSBjb21wbGV4IHRhcmdldCBtYXkgbmVlZCBtb3JlIHR3ZWFrcyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhtc2VnLCAmc2VnLT5tZXRhZGF0YS0+cHJvcHMuc2VncykgeworCQlkZXZzaXplICs9IG1zZWctPnNpemU7CisJCWlmIChkZXZzaXplID4gRE1fVEhJTl9NQVhfTUVUQURBVEFfU0laRSkgeworCQkJbG9nX2RlYnVnX2FjdGl2YXRpb24oIklnbm9yaW5nICUiIFBSSXU2NCAiIG9mIGRldmljZS4iLAorCQkJCQkgICAgIGRldnNpemUgLSBETV9USElOX01BWF9NRVRBREFUQV9TSVpFKTsKKwkJCW1zZWctPnNpemUgLT0gKGRldnNpemUgLSBETV9USElOX01BWF9NRVRBREFUQV9TSVpFKTsKKwkJCWRldnNpemUgPSBETV9USElOX01BWF9NRVRBREFUQV9TSVpFOworCQkJLyogRklYTUU6IGRyb3AgcmVtYWluaW5nIHNlZ3MgKi8KKwkJfQorCX0KKworCWlmICghKHNlZy0+cG9vbCA9IGRtX3RyZWVfZmluZF9ub2RlX2J5X3V1aWQobm9kZS0+ZHRyZWUsIHBvb2xfdXVpZCkpKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBwb29sIHV1aWQgJXMuIiwgcG9vbF91dWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfbGlua190cmVlX25vZGVzKG5vZGUsIHNlZy0+cG9vbCkpCisJCXJldHVybl8wOworCisJLyogQ2xlYW4gZmxhZyBkZWxheV9yZXN1bWVfaWZfbmV3IC0gc28gY29yZWxvZyBnZXRzIHJlc3VtZWQgKi8KKwlzZWctPm1ldGFkYXRhLT5wcm9wcy5kZWxheV9yZXN1bWVfaWZfbmV3ID0gMDsKKwlzZWctPnBvb2wtPnByb3BzLmRlbGF5X3Jlc3VtZV9pZl9uZXcgPSAwOworCisJLyogVmFsaWRhdGUgb25seSB0cmFuc2FjdGlvbl9pZCA+IDAgd2hlbiBhY3RpdmF0aW5nIHRoaW4tcG9vbCAqLworCW5vZGUtPnByb3BzLnNlbmRfbWVzc2FnZXMgPSB0cmFuc2FjdGlvbl9pZCA/IDEgOiAwOworCXNlZy0+dHJhbnNhY3Rpb25faWQgPSB0cmFuc2FjdGlvbl9pZDsKKwlzZWctPmxvd193YXRlcl9tYXJrID0gbG93X3dhdGVyX21hcms7CisJc2VnLT5kYXRhX2Jsb2NrX3NpemUgPSBkYXRhX2Jsb2NrX3NpemU7CisJc2VnLT5za2lwX2Jsb2NrX3plcm9pbmcgPSBza2lwX2Jsb2NrX3plcm9pbmc7CisJZG1fbGlzdF9pbml0KCZzZWctPnRoaW5fbWVzc2FnZXMpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3RoaW5fcG9vbF9tZXNzYWdlKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJICAgICAgIGRtX3RoaW5fbWVzc2FnZV90IHR5cGUsCisJCQkJICAgICAgIHVpbnQ2NF90IGlkMSwgdWludDY0X3QgaWQyKQoreworCXN0cnVjdCB0aGluX21lc3NhZ2UgKnRtOworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZzsKKworCWlmICghKHNlZyA9IF9nZXRfc2luZ2xlX2xvYWRfc2VnbWVudChub2RlLCBTRUdfVEhJTl9QT09MKSkpCisJCXJldHVybl8wOworCisJaWYgKCEodG0gPSBkbV9wb29sX3phbGxvYyhub2RlLT5kdHJlZS0+bWVtLCBzaXplb2YgKCp0bSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGluIG1lc3NhZ2UuIik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9TTkFQOgorCQkvKiBJZiB0aGUgdGhpbiBvcmlnaW4gaXMgYWN0aXZlLCBpdCBtdXN0IGJlIHN1c3BlbmQgZmlyc3QhICovCisJCWlmIChpZDEgPT0gaWQyKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCB1c2Ugc2FtZSBkZXZpY2UgaWQgZm9yIG9yaWdpbiBhbmQgaXRzIHNuYXBzaG90LiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFfdGhpbl92YWxpZGF0ZV9kZXZpY2VfaWQoaWQxKSB8fAorCQkgICAgIV90aGluX3ZhbGlkYXRlX2RldmljZV9pZChpZDIpKQorCQkJcmV0dXJuXzA7CisJCXRtLT5tZXNzYWdlLnUubV9jcmVhdGVfc25hcC5kZXZpY2VfaWQgPSBpZDE7CisJCXRtLT5tZXNzYWdlLnUubV9jcmVhdGVfc25hcC5vcmlnaW5faWQgPSBpZDI7CisJCWJyZWFrOworCWNhc2UgRE1fVEhJTl9NRVNTQUdFX0NSRUFURV9USElOOgorCQlpZiAoIV90aGluX3ZhbGlkYXRlX2RldmljZV9pZChpZDEpKQorCQkJcmV0dXJuXzA7CisJCXRtLT5tZXNzYWdlLnUubV9jcmVhdGVfdGhpbi5kZXZpY2VfaWQgPSBpZDE7CisJCXRtLT5leHBlY3RlZF9lcnJubyA9IEVFWElTVDsKKwkJYnJlYWs7CisJY2FzZSBETV9USElOX01FU1NBR0VfREVMRVRFOgorCQlpZiAoIV90aGluX3ZhbGlkYXRlX2RldmljZV9pZChpZDEpKQorCQkJcmV0dXJuXzA7CisJCXRtLT5tZXNzYWdlLnUubV9kZWxldGUuZGV2aWNlX2lkID0gaWQxOworCQl0bS0+ZXhwZWN0ZWRfZXJybm8gPSBFTk9EQVRBOworCQlicmVhazsKKwljYXNlIERNX1RISU5fTUVTU0FHRV9TRVRfVFJBTlNBQ1RJT05fSUQ6CisJCWlmICgoaWQxICsgMSkgIT0gaWQyKSB7CisJCQlsb2dfZXJyb3IoIk5ldyB0cmFuc2FjdGlvbiBpZCBtdXN0IGJlIHNlcXVlbnRpYWwuIik7CisJCQlyZXR1cm4gMDsgLyogRklYTUU6IE1heWJlIHRvbyBzdHJpY3QgaGVyZT8gKi8KKwkJfQorCQlpZiAoaWQyICE9IHNlZy0+dHJhbnNhY3Rpb25faWQpIHsKKwkJCWxvZ19lcnJvcigiQ3VycmVudCB0cmFuc2FjdGlvbiBpZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGluIHBvb2wuIik7CisJCQlyZXR1cm4gMDsgLyogRklYTUU6IE1heWJlIHRvbyBzdHJpY3QgaGVyZT8gKi8KKwkJfQorCQl0bS0+bWVzc2FnZS51Lm1fc2V0X3RyYW5zYWN0aW9uX2lkLmN1cnJlbnRfaWQgPSBpZDE7CisJCXRtLT5tZXNzYWdlLnUubV9zZXRfdHJhbnNhY3Rpb25faWQubmV3X2lkID0gaWQyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoIlVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAlZC4iLCAoaW50KSB0eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdG0tPm1lc3NhZ2UudHlwZSA9IHR5cGU7CisJZG1fbGlzdF9hZGQoJnNlZy0+dGhpbl9tZXNzYWdlcywgJnRtLT5saXN0KTsKKwkvKiBIaWdoZXIgdmFsdWUgPjEgaWRlbnRpZmllcyB0aGVyZSBhcmUgcmVhbGx5IHNvbWUgbWVzc2FnZXMgKi8KKwlub2RlLT5wcm9wcy5zZW5kX21lc3NhZ2VzID0gMjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfZGlzY2FyZChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpZ25vcmUsCisJCQkJICAgICAgIHVuc2lnbmVkIG5vX3Bhc3Nkb3duKQoreworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZzsKKworCWlmICghKHNlZyA9IF9nZXRfc2luZ2xlX2xvYWRfc2VnbWVudChub2RlLCBTRUdfVEhJTl9QT09MKSkpCisJCXJldHVybl8wOworCisJc2VnLT5pZ25vcmVfZGlzY2FyZCA9IGlnbm9yZTsKKwlzZWctPm5vX2Rpc2NhcmRfcGFzc2Rvd24gPSBub19wYXNzZG93bjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfZXJyb3JfaWZfbm9fc3BhY2Uoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJCSB1bnNpZ25lZCBlcnJvcl9pZl9ub19zcGFjZSkKK3sKKwlzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWc7CisKKwlpZiAoIShzZWcgPSBfZ2V0X3NpbmdsZV9sb2FkX3NlZ21lbnQobm9kZSwgU0VHX1RISU5fUE9PTCkpKQorCQlyZXR1cm5fMDsKKworCXNlZy0+ZXJyb3JfaWZfbm9fc3BhY2UgPSBlcnJvcl9pZl9ub19zcGFjZTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX3Bvb2xfcmVhZF9vbmx5KHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJCSB1bnNpZ25lZCByZWFkX29ubHkpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJaWYgKCEoc2VnID0gX2dldF9zaW5nbGVfbG9hZF9zZWdtZW50KG5vZGUsIFNFR19USElOX1BPT0wpKSkKKwkJcmV0dXJuXzA7CisKKwlzZWctPnJlYWRfb25seSA9IHJlYWRfb25seTsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX2FkZF90aGluX3RhcmdldChzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCSB1aW50NjRfdCBzaXplLAorCQkJCSBjb25zdCBjaGFyICpwb29sX3V1aWQsCisJCQkJIHVpbnQzMl90IGRldmljZV9pZCkKK3sKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpwb29sOworCXN0cnVjdCBsb2FkX3NlZ21lbnQgKnNlZzsKKworCWlmICghKHBvb2wgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKG5vZGUtPmR0cmVlLCBwb29sX3V1aWQpKSkgeworCQlsb2dfZXJyb3IoIk1pc3NpbmcgdGhpbiBwb29sIHV1aWQgJXMuIiwgcG9vbF91dWlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfbGlua190cmVlX25vZGVzKG5vZGUsIHBvb2wpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3RoaW5fdmFsaWRhdGVfZGV2aWNlX2lkKGRldmljZV9pZCkpCisJCXJldHVybl8wOworCisJaWYgKCEoc2VnID0gX2FkZF9zZWdtZW50KG5vZGUsIFNFR19USElOLCBzaXplKSkpCisJCXJldHVybl8wOworCisJc2VnLT5wb29sID0gcG9vbDsKKwlzZWctPmRldmljZV9pZCA9IGRldmljZV9pZDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fdHJlZV9ub2RlX3NldF90aGluX2V4dGVybmFsX29yaWdpbihzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLAorCQkJCQkgIGNvbnN0IGNoYXIgKmV4dGVybmFsX3V1aWQpCit7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqZXh0ZXJuYWw7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJaWYgKCEoc2VnID0gX2dldF9zaW5nbGVfbG9hZF9zZWdtZW50KG5vZGUsIFNFR19USElOKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoZXh0ZXJuYWwgPSBkbV90cmVlX2ZpbmRfbm9kZV9ieV91dWlkKG5vZGUtPmR0cmVlLAorCQkJCQkJICAgZXh0ZXJuYWxfdXVpZCkpKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyB0aGluIGV4dGVybmFsIG9yaWdpbiB1dWlkICVzLiIsCisJCQkgIGV4dGVybmFsX3V1aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9saW5rX3RyZWVfbm9kZXMobm9kZSwgZXh0ZXJuYWwpKQorCQlyZXR1cm5fMDsKKworCXNlZy0+ZXh0ZXJuYWwgPSBleHRlcm5hbDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hZGRfYXJlYShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCBzdHJ1Y3QgbG9hZF9zZWdtZW50ICpzZWcsIHN0cnVjdCBkbV90cmVlX25vZGUgKmRldl9ub2RlLCB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IHNlZ19hcmVhICphcmVhOworCisJaWYgKCEoYXJlYSA9IGRtX3Bvb2xfemFsbG9jKG5vZGUtPmR0cmVlLT5tZW0sIHNpemVvZiAoKmFyZWEpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGFyZ2V0IHNlZ21lbnQgYXJlYS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXJlYS0+ZGV2X25vZGUgPSBkZXZfbm9kZTsKKwlhcmVhLT5vZmZzZXQgPSBvZmZzZXQ7CisKKwlkbV9saXN0X2FkZCgmc2VnLT5hcmVhcywgJmFyZWEtPmxpc3QpOworCXNlZy0+YXJlYV9jb3VudCsrOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90cmVlX25vZGVfYWRkX3RhcmdldF9hcmVhKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSBjb25zdCBjaGFyICp1dWlkLAorCQkJCSB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCXN0cnVjdCBzdGF0IGluZm87CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqZGV2X25vZGU7CisKKwlpZiAoKCFkZXZfbmFtZSB8fCAhKmRldl9uYW1lKSAmJiAoIXV1aWQgfHwgISp1dWlkKSkgeworCQlsb2dfZXJyb3IoImRtX3RyZWVfbm9kZV9hZGRfdGFyZ2V0X2FyZWEgY2FsbGVkIHdpdGhvdXQgZGV2aWNlIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh1dWlkKSB7CisJCWlmICghKGRldl9ub2RlID0gZG1fdHJlZV9maW5kX25vZGVfYnlfdXVpZChub2RlLT5kdHJlZSwgdXVpZCkpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgYXJlYSB1dWlkICVzLiIsIHV1aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFfbGlua190cmVlX25vZGVzKG5vZGUsIGRldl9ub2RlKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCWlmIChzdGF0KGRldl9uYW1lLCAmaW5mbykgPCAwKSB7CisJCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQuIiwgZGV2X25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIVNfSVNCTEsoaW5mby5zdF9tb2RlKSkgeworCQkJbG9nX2Vycm9yKCJEZXZpY2UgJXMgaXMgbm90IGEgYmxvY2sgZGV2aWNlLiIsIGRldl9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRklYTUUgQ2hlY2sgY29ycmVjdCBtYWNybyB1c2UgKi8KKwkJaWYgKCEoZGV2X25vZGUgPSBfYWRkX2Rldihub2RlLT5kdHJlZSwgbm9kZSwgTUFKT1IoaW5mby5zdF9yZGV2KSwKKwkJCQkJICBNSU5PUihpbmZvLnN0X3JkZXYpLCAwLCAwKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIW5vZGUtPnByb3BzLnNlZ21lbnRfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJBdHRlbXB0IHRvIGFkZCB0YXJnZXQgYXJlYSB0byBtaXNzaW5nIHNlZ21lbnQuIik7CisJCXJldHVybiAwOworCX0KKworCXNlZyA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2xhc3QoJm5vZGUtPnByb3BzLnNlZ3MpLCBzdHJ1Y3QgbG9hZF9zZWdtZW50KTsKKworCWlmICghX2FkZF9hcmVhKG5vZGUsIHNlZywgZGV2X25vZGUsIG9mZnNldCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV90cmVlX25vZGVfYWRkX251bGxfYXJlYShzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IGxvYWRfc2VnbWVudCAqc2VnOworCisJc2VnID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfbGFzdCgmbm9kZS0+cHJvcHMuc2VncyksIHN0cnVjdCBsb2FkX3NlZ21lbnQpOworCisJc3dpdGNoIChzZWctPnR5cGUpIHsKKwljYXNlIFNFR19SQUlEMDoKKwljYXNlIFNFR19SQUlEMF9NRVRBOgorCWNhc2UgU0VHX1JBSUQxOgorCWNhc2UgU0VHX1JBSUQ0OgorCWNhc2UgU0VHX1JBSUQ1X0xBOgorCWNhc2UgU0VHX1JBSUQ1X1JBOgorCWNhc2UgU0VHX1JBSUQ1X0xTOgorCWNhc2UgU0VHX1JBSUQ1X1JTOgorCWNhc2UgU0VHX1JBSUQ2X1pSOgorCWNhc2UgU0VHX1JBSUQ2X05SOgorCWNhc2UgU0VHX1JBSUQ2X05DOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlsb2dfZXJyb3IoImRtX3RyZWVfbm9kZV9hZGRfbnVsbF9hcmVhKCkgY2FsbGVkIG9uIGFuIHVuc3VwcG9ydGVkIHNlZ21lbnQgdHlwZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9hZGRfYXJlYShub2RlLCBzZWcsIE5VTEwsIG9mZnNldCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZG1fdHJlZV9ub2RlX3NldF9jYWxsYmFjayhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpkbm9kZSwKKwkJCSAgICAgICBkbV9ub2RlX2NhbGxiYWNrX2ZuIGNiLCB2b2lkICpkYXRhKQoreworCWRub2RlLT5jYWxsYmFjayA9IGNiOworCWRub2RlLT5jYWxsYmFja19kYXRhID0gZGF0YTsKK30KKworLyoKKyAqIEJhY2t3YXJkIGNvbXBhdGlibGUgZG1fdHJlZV9ub2RlX3NpemVfY2hhbmdlZCgpIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBLZWVwIHRoZXNlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG8gYXZvaWQgYWRkaW5nIGNsdXR0ZXIgYXJvdW5kIHRoZQorICogY3VycmVudCBkbV90cmVlX25vZGVfc2l6ZV9jaGFuZ2VkKCkgdmVyc2lvbi4KKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pCitpbnQgZG1fdHJlZV9ub2RlX3NpemVfY2hhbmdlZF9iYXNlKGNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKmRub2RlKTsKK0RNX0VYUE9SVF9TWU1CT0xfQkFTRShkbV90cmVlX25vZGVfc2l6ZV9jaGFuZ2VkKTsKK2ludCBkbV90cmVlX25vZGVfc2l6ZV9jaGFuZ2VkX2Jhc2UoY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqZG5vZGUpCit7CisJLyogQmFzZSBkb2VzIG5vdCBtYWtlIGRpZmZlcmVuY2UgYmV0d2VlbiBzbWFsbGVyIGFuZCBiaWdnZXIgKi8KKwlyZXR1cm4gZG1fdHJlZV9ub2RlX3NpemVfY2hhbmdlZChkbm9kZSkgPyAxIDogMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZG0vbGliZG0tZmlsZS5jIGIvbGliZG0vbGliZG0tZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzEzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9saWJkbS1maWxlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRtbGliLmgiCisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKK3N0YXRpYyBpbnQgX2lzX2Rpcihjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApIHsKKwkJbG9nX3N5c19lcnJvcigic3RhdCIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJbG9nX2Vycm9yKCJFeGlzdGluZyBwYXRoICVzIGlzIG5vdCAiCisJCQkgICJhIGRpcmVjdG9yeS4iLCBwYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9kaXJfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKmRpcikKK3sKKwljaGFyICpvcmlnLCAqczsKKwlpbnQgcmMsIHIgPSAwOworCisJbG9nX3ZlcmJvc2UoIkNyZWF0aW5nIGRpcmVjdG9yeSBcIiVzXCIiLCBkaXIpOworCS8qIENyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KKwlvcmlnID0gcyA9IGRtX3N0cmR1cChkaXIpOworCWlmICghcykgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgZGlyZWN0b3J5IG5hbWUuIik7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgocyA9IHN0cmNocihzLCAnLycpKSAhPSBOVUxMKSB7CisJCSpzID0gJ1wwJzsKKwkJaWYgKCpvcmlnKSB7CisJCQlyYyA9IG1rZGlyKG9yaWcsIDA3NzcpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFRVhJU1QpIHsKKwkJCQkJaWYgKCFfaXNfZGlyKG9yaWcpKQorCQkJCQkJZ290b19vdXQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGVycm5vICE9IEVST0ZTKQorCQkJCQkJbG9nX3N5c19lcnJvcigibWtkaXIiLCBvcmlnKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJCSpzKysgPSAnLyc7CisJfQorCisJLyogQ3JlYXRlIGZpbmFsIGRpcmVjdG9yeSAqLworCXJjID0gbWtkaXIoZGlyLCAwNzc3KTsKKwlpZiAocmMgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFRVhJU1QpIHsKKwkJCWlmICghX2lzX2RpcihkaXIpKQorCQkJCWdvdG9fb3V0OworCQl9IGVsc2UgeworCQkJaWYgKGVycm5vICE9IEVST0ZTKQorCQkJCWxvZ19zeXNfZXJyb3IoIm1rZGlyIiwgb3JpZyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXIgPSAxOworb3V0OgorCWRtX2ZyZWUob3JpZyk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlzdHJ1Y3Qgc3RhdCBpbmZvOworCisJaWYgKCEqZGlyKQorCQlyZXR1cm4gMTsKKworCWlmIChzdGF0KGRpciwgJmluZm8pID09IDAgJiYgU19JU0RJUihpbmZvLnN0X21vZGUpKQorCQlyZXR1cm4gMTsKKworCWlmICghX2NyZWF0ZV9kaXJfcmVjdXJzaXZlKGRpcikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9pc19lbXB0eV9kaXIoY29uc3QgY2hhciAqZGlyKQoreworCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwlESVIgKmQ7CisKKwlpZiAoIShkID0gb3BlbmRpcihkaXIpKSkgeworCQlsb2dfc3lzX2Vycm9yKCJvcGVuZGlyIiwgZGlyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChkaXJlbnQgPSByZWFkZGlyKGQpKSkKKwkJaWYgKHN0cmNtcChkaXJlbnQtPmRfbmFtZSwgIi4iKSAmJiBzdHJjbXAoZGlyZW50LT5kX25hbWUsICIuLiIpKQorCQkJYnJlYWs7CisKKwlpZiAoY2xvc2VkaXIoZCkpCisJCWxvZ19zeXNfZXJyb3IoImNsb3NlZGlyIiwgZGlyKTsKKworCXJldHVybiBkaXJlbnQgPyAwIDogMTsKK30KKworaW50IGRtX2ZjbG9zZShGSUxFICpzdHJlYW0pCit7CisJaW50IHByZXZfZmFpbCA9IGZlcnJvcihzdHJlYW0pOworCWludCBmY2xvc2VfZmFpbCA9IGZjbG9zZShzdHJlYW0pOworCisJLyogSWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgZmFpbHVyZSwgYnV0IGZjbG9zZSBzdWNjZWVkZWQsCisJICAgY2xlYXIgZXJybm8sIHNpbmNlIGZlcnJvciBkb2VzIG5vdCBzZXQgaXQsIGFuZCBpdHMgdmFsdWUKKwkgICBtYXkgYmUgdW5yZWxhdGVkIHRvIHRoZSBmZXJyb3ItcmVwb3J0ZWQgZmFpbHVyZS4gICovCisJaWYgKHByZXZfZmFpbCAmJiAhZmNsb3NlX2ZhaWwpCisJCWVycm5vID0gMDsKKworCXJldHVybiBwcmV2X2ZhaWwgfHwgZmNsb3NlX2ZhaWwgPyBFT0YgOiAwOworfQorCitpbnQgZG1fY3JlYXRlX2xvY2tmaWxlKGNvbnN0IGNoYXIgKmxvY2tmaWxlKQoreworCWludCBmZCwgdmFsdWU7CisJc2l6ZV90IGJ1ZmZlcmxlbjsKKwlzc2l6ZV90IHdyaXRlX291dDsKKwlzdHJ1Y3QgZmxvY2sgbG9jazsKKwljaGFyIGJ1ZmZlcls1MF07CisJaW50IHJldHJpZXMgPSAwOworCisJaWYgKChmZCA9IG9wZW4obG9ja2ZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSwKKwkJICAgICAgIChTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKSkpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBvcGVuIGxvY2tmaWxlIFslc10sIGVycm9yIHdhcyBbJXNdIiwKKwkJCSAgbG9ja2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCWxvY2subF90eXBlID0gRl9XUkxDSzsKKwlsb2NrLmxfc3RhcnQgPSAwOworCWxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKwlsb2NrLmxfbGVuID0gMDsKK3JldHJ5X2ZjbnRsOgorCWlmIChmY250bChmZCwgRl9TRVRMSywgJmxvY2spIDwgMCkgeworCQlzd2l0Y2ggKGVycm5vKSB7CisJCWNhc2UgRUlOVFI6CisJCQlnb3RvIHJldHJ5X2ZjbnRsOworCQljYXNlIEVBQ0NFUzoKKwkJY2FzZSBFQUdBSU46CisJCQlpZiAocmV0cmllcyA9PSAyMCkgeworCQkJCWxvZ19lcnJvcigiQ2Fubm90IGxvY2sgbG9ja2ZpbGUgWyVzXSwgZXJyb3Igd2FzIFslc10iLAorCQkJCQkgIGxvY2tmaWxlLCBzdHJlcnJvcihlcnJubykpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkrKyByZXRyaWVzOworCQkJCXVzbGVlcCgxMDAwKTsKKwkJCQlnb3RvIHJldHJ5X2ZjbnRsOworCQkJfQorCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKCJwcm9jZXNzIGlzIGFscmVhZHkgcnVubmluZyIpOworCQl9CisKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCWlmIChmdHJ1bmNhdGUoZmQsIDApIDwgMCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCB0cnVuY2F0ZSBwaWRmaWxlIFslc10sIGVycm9yIHdhcyBbJXNdIiwKKwkJCSAgbG9ja2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJZ290byBmYWlsX2Nsb3NlX3VubGluazsKKwl9CisKKwltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xLCAiJXVcbiIsIGdldHBpZCgpKTsKKworCWJ1ZmZlcmxlbiA9IHN0cmxlbihidWZmZXIpOworCXdyaXRlX291dCA9IHdyaXRlKGZkLCBidWZmZXIsIGJ1ZmZlcmxlbik7CisKKwlpZiAoKHdyaXRlX291dCA8IDApIHx8ICh3cml0ZV9vdXQgPT0gMCAmJiBlcnJubykpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3Qgd3JpdGUgcGlkIHRvIHBpZGZpbGUgWyVzXSwgZXJyb3Igd2FzIFslc10iLAorCQkJICBsb2NrZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCQlnb3RvIGZhaWxfY2xvc2VfdW5saW5rOworCX0KKworCWlmICgod3JpdGVfb3V0ID09IDApIHx8ICgoc2l6ZV90KXdyaXRlX291dCA8IGJ1ZmZlcmxlbikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3Qgd3JpdGUgcGlkIHRvIHBpZGZpbGUgWyVzXSwgc2hvcnR3cml0ZSBvZiIKKwkJCSAgIlslIiBQUklzaXplX3QgIl0gYnl0ZXMsIGV4cGVjdGVkIFslIiBQUklzaXplX3QgIl1cbiIsCisJCQkgIGxvY2tmaWxlLCB3cml0ZV9vdXQsIGJ1ZmZlcmxlbik7CisKKwkJZ290byBmYWlsX2Nsb3NlX3VubGluazsKKwl9CisKKwlpZiAoKHZhbHVlID0gZmNudGwoZmQsIEZfR0VURkQsIDApKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgZ2V0IGNsb3NlLW9uLWV4ZWMgZmxhZyBmcm9tIHBpZGZpbGUgWyVzXSwgIgorCQkJICAiZXJyb3Igd2FzIFslc10iLCBsb2NrZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCQlnb3RvIGZhaWxfY2xvc2VfdW5saW5rOworCX0KKwl2YWx1ZSB8PSBGRF9DTE9FWEVDOworCWlmIChmY250bChmZCwgRl9TRVRGRCwgdmFsdWUpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBzZXQgY2xvc2Utb24tZXhlYyBmbGFnIGZyb20gcGlkZmlsZSBbJXNdLCAiCisJCQkgICJlcnJvciB3YXMgWyVzXSIsIGxvY2tmaWxlLCBzdHJlcnJvcihlcnJubykpOworCisJCWdvdG8gZmFpbF9jbG9zZV91bmxpbms7CisJfQorCisJcmV0dXJuIDE7CisKK2ZhaWxfY2xvc2VfdW5saW5rOgorCWlmICh1bmxpbmsobG9ja2ZpbGUpKQorCQlsb2dfc3lzX2RlYnVnKCJ1bmxpbmsiLCBsb2NrZmlsZSk7CitmYWlsX2Nsb3NlOgorCWlmIChjbG9zZShmZCkpCisJCWxvZ19zeXNfZGVidWcoImNsb3NlIiwgbG9ja2ZpbGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9kYWVtb25faXNfcnVubmluZyhjb25zdCBjaGFyKiBsb2NrZmlsZSkKK3sKKyAgICAgICBpbnQgZmQ7CisgICAgICAgc3RydWN0IGZsb2NrIGxvY2s7CisKKyAgICAgICBpZigoZmQgPSBvcGVuKGxvY2tmaWxlLCBPX1JET05MWSkpIDwgMCkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgbG9jay5sX3R5cGUgPSBGX1dSTENLOworICAgICAgIGxvY2subF9zdGFydCA9IDA7CisgICAgICAgbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworICAgICAgIGxvY2subF9sZW4gPSAwOworICAgICAgIGlmIChmY250bChmZCwgRl9HRVRMSywgJmxvY2spIDwgMCkgeworICAgICAgICAgICAgICAgbG9nX2Vycm9yKCJDYW5ub3QgY2hlY2sgbG9jayBzdGF0dXMgb2YgbG9ja2ZpbGUgWyVzXSwgZXJyb3Igd2FzIFslc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tmaWxlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgaWYgKGNsb3NlKGZkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBpZiAoY2xvc2UoZmQpKQorICAgICAgICAgICAgICAgc3RhY2s7CisKKyAgICAgICByZXR1cm4gKGxvY2subF90eXBlID09IEZfVU5MQ0spID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9saWJkbS1yZXBvcnQuYyBiL2xpYmRtL2xpYmRtLXJlcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmVhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9saWJkbS1yZXBvcnQuYwpAQCAtMCwwICsxLDUxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+ICAvKiBmYWJzKCkgKi8KKyNpbmNsdWRlIDxmbG9hdC5oPiAvKiBEQkxfRVBTSUxPTiAqLworI2luY2x1ZGUgPHRpbWUuaD4KKworLyoKKyAqIEludGVybmFsIGZsYWdzCisgKi8KKyNkZWZpbmUgUkhfU09SVF9SRVFVSVJFRAkweDAwMDAwMTAwCisjZGVmaW5lIFJIX0hFQURJTkdTX1BSSU5URUQJMHgwMDAwMDIwMAorI2RlZmluZSBSSF9GSUVMRF9DQUxDX05FRURFRAkweDAwMDAwNDAwCisjZGVmaW5lIFJIX0FMUkVBRFlfUkVQT1JURUQJMHgwMDAwMDgwMAorCitzdHJ1Y3Qgc2VsZWN0aW9uIHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqc2VsZWN0aW9uX3Jvb3Q7CisJaW50IGFkZF9uZXdfZmllbGRzOworfTsKKworc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtOworCitzdHJ1Y3QgZG1fcmVwb3J0IHsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCisJLyoqCisJICogQ2FjaGUgdGhlIGZpcnN0IHJvdyBhbGxvY2F0ZWQgc28gdGhhdCBhbGwgcm93cyBhbmQgZmllbGRzCisJICogY2FuIGJlIGRpc3Bvc2VkIG9mIGluIGEgc2luZ2xlIGRtX3Bvb2xfZnJlZSgpIGNhbGwuCisJICovCisJc3RydWN0IHJvdyAqZmlyc3Rfcm93OworCisJLyogVG8gcmVwb3J0IGFsbCBhdmFpbGFibGUgdHlwZXMgKi8KKyNkZWZpbmUgUkVQT1JUX1RZUEVTX0FMTAlVSU5UMzJfTUFYCisJdWludDMyX3QgcmVwb3J0X3R5cGVzOworCWNvbnN0IGNoYXIgKm91dHB1dF9maWVsZF9uYW1lX3ByZWZpeDsKKwljb25zdCBjaGFyICpmaWVsZF9wcmVmaXg7CisJdWludDMyX3QgZmxhZ3M7CisJY29uc3QgY2hhciAqc2VwYXJhdG9yOworCisJdWludDMyX3Qga2V5c19jb3VudDsKKworCS8qIE9yZGVyZWQgbGlzdCBvZiBmaWVsZHMgbmVlZGVkIGZvciB0aGlzIHJlcG9ydCAqLworCXN0cnVjdCBkbV9saXN0IGZpZWxkX3Byb3BzOworCisJLyogUm93cyBvZiByZXBvcnQgZGF0YSAqLworCXN0cnVjdCBkbV9saXN0IHJvd3M7CisKKwkvKiBBcnJheSBvZiBmaWVsZCBkZWZpbml0aW9ucyAqLworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzOworCWNvbnN0IGNoYXIgKipjYW5vbmljYWxfZmllbGRfaWRzOworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKnR5cGVzOworCisJLyogVG8gc3RvcmUgY2FsbGVyIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKnByaXZhdGU7CisKKwkvKiBTZWxlY3Rpb24gaGFuZGxlICovCisJc3RydWN0IHNlbGVjdGlvbiAqc2VsZWN0aW9uOworCisJLyogTnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIHJlc2VydmVkIHZhbHVlcyAqLworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfcmVzZXJ2ZWRfdmFsdWUgKnJlc2VydmVkX3ZhbHVlczsKKwlzdHJ1Y3QgZG1faGFzaF90YWJsZSAqdmFsdWVfY2FjaGU7CisKKwlzdHJ1Y3QgcmVwb3J0X2dyb3VwX2l0ZW0gKmdyb3VwX2l0ZW07Cit9OworCitzdHJ1Y3QgZG1fcmVwb3J0X2dyb3VwIHsKKwlkbV9yZXBvcnRfZ3JvdXBfdHlwZV90IHR5cGU7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZG1fbGlzdCBpdGVtczsKKwlpbnQgaW5kZW50OworfTsKKworc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwOworCXN0cnVjdCBkbV9yZXBvcnQgKnJlcG9ydDsKKwl1bmlvbiB7CisJCXVpbnQzMl90IG9yaWdfcmVwb3J0X2ZsYWdzOworCQl1aW50MzJfdCBmaW5pc2hlZF9jb3VudDsKKwl9IHN0b3JlOworCXN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqcGFyZW50OworCWludCBvdXRwdXRfZG9uZToxOworCWludCBuZWVkc19jbG9zaW5nOjE7CisJdm9pZCAqZGF0YTsKK307CisKKy8qCisgKiBJbnRlcm5hbCBwZXItZmllbGQgZmxhZ3MKKyAqLworI2RlZmluZSBGTERfSElEREVOCTB4MDAwMDEwMDAKKyNkZWZpbmUgRkxEX1NPUlRfS0VZCTB4MDAwMDIwMDAKKyNkZWZpbmUgRkxEX0FTQ0VORElORwkweDAwMDA0MDAwCisjZGVmaW5lIEZMRF9ERVNDRU5ESU5HCTB4MDAwMDgwMDAKKyNkZWZpbmUgRkxEX0NPTVBBQ1RFRAkweDAwMDEwMDAwCisjZGVmaW5lIEZMRF9DT01QQUNUX09ORSAweDAwMDIwMDAwCisKK3N0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXVpbnQzMl90IGZpZWxkX251bTsKKwl1aW50MzJfdCBzb3J0X3Bvc247CisJaW50MzJfdCBpbml0aWFsX3dpZHRoOworCWludDMyX3Qgd2lkdGg7IC8qIGN1cnJlbnQgd2lkdGg6IGFkanVzdGVkIGJ5IGRtX3JlcG9ydF9vYmplY3QoKSAqLworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKnR5cGU7CisJdWludDMyX3QgZmxhZ3M7CisJaW50IGltcGxpY2l0OworfTsKKworLyoKKyAqIFJlcG9ydCBzZWxlY3Rpb24KKyAqLworc3RydWN0IG9wX2RlZiB7CisJY29uc3QgY2hhciAqc3RyaW5nOworCXVpbnQzMl90IGZsYWdzOworCWNvbnN0IGNoYXIgKmRlc2M7Cit9OworCisjZGVmaW5lIEZMRF9DTVBfTUFTSwkJMHgwRkYwMDAwMAorI2RlZmluZSBGTERfQ01QX1VOQ09NUEFSQUJMRQkweDAwMTAwMDAwCisjZGVmaW5lIEZMRF9DTVBfRVFVQUwJCTB4MDAyMDAwMDAKKyNkZWZpbmUgRkxEX0NNUF9OT1QJCTB4MDA0MDAwMDAKKyNkZWZpbmUgRkxEX0NNUF9HVAkJMHgwMDgwMDAwMAorI2RlZmluZSBGTERfQ01QX0xUCQkweDAxMDAwMDAwCisjZGVmaW5lIEZMRF9DTVBfUkVHRVgJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRkxEX0NNUF9OVU1CRVIJCTB4MDQwMDAwMDAKKyNkZWZpbmUgRkxEX0NNUF9USU1FCQkweDA4MDAwMDAwCisvKgorICogI2RlZmluZSBGTERfQ01QX1NUUklORyAweDEwMDAwMDAwCisgKiBXZSBjb3VsZCBkZWZpbmUgRkxEX0NNUF9TVFJJTkcgaGVyZSBmb3IgY29tcGxldGVuZXNzIGhlcmUsCisgKiBidXQgaXQncyBub3QgbmVlZGVkIC0gd2UgY2FuIGNoZWNrIG9wZXJhdG9yIGNvbXBhdGliaWxpdHkgd2l0aAorICogZmllbGQgdHlwZSBieSB1c2luZyBGTERfQ01QX1JFR0VYLCBGTERfQ01QX05VTUJFUiBhbmQKKyAqIEZMRF9DTVBfVElNRSBmbGFncyBvbmx5LgorICovCisKKy8qCisgKiBXaGVuIGRlZmluaW5nIG9wZXJhdG9ycywgYWx3YXlzIGRlZmluZSBsb25nZXIgb25lIGJlZm9yZQorICogc2hvcnRlciBvbmUgaWYgb25lIGlzIGEgcHJlZml4IG9mIGFub3RoZXIhCisgKiAoZS5nLiA9fiBjb21lcyBiZWZvcmUgPSkKKyovCitzdGF0aWMgc3RydWN0IG9wX2RlZiBfb3BfY21wW10gPSB7CisJeyAiPX4iLCBGTERfQ01QX1JFR0VYLCAiTWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uLiBbcmVnZXhdIiB9LAorCXsgIiF+IiwgRkxEX0NNUF9SRUdFWHxGTERfQ01QX05PVCwgIk5vdCBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb24uIFtyZWdleF0iIH0sCisJeyAiPSIsIEZMRF9DTVBfRVFVQUwsICJFcXVhbCB0by4gW251bWJlciwgc2l6ZSwgcGVyY2VudCwgc3RyaW5nLCBzdHJpbmcgbGlzdCwgdGltZV0iIH0sCisJeyAiIT0iLCBGTERfQ01QX05PVHxGTERfQ01QX0VRVUFMLCAiTm90IGVxdWFsIHRvLiBbbnVtYmVyLCBzaXplLCBwZXJjZW50LCBzdHJpbmcsIHN0cmluZ19saXN0LCB0aW1lXSIgfSwKKwl7ICI+PSIsIEZMRF9DTVBfTlVNQkVSfEZMRF9DTVBfVElNRXxGTERfQ01QX0dUfEZMRF9DTVBfRVFVQUwsICJHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uIFtudW1iZXIsIHNpemUsIHBlcmNlbnQsIHRpbWVdIiB9LAorCXsgIj4iLCBGTERfQ01QX05VTUJFUnxGTERfQ01QX1RJTUV8RkxEX0NNUF9HVCwgIkdyZWF0ZXIgdGhhbi4gW251bWJlciwgc2l6ZSwgcGVyY2VudCwgdGltZV0iIH0sCisJeyAiPD0iLCBGTERfQ01QX05VTUJFUnxGTERfQ01QX1RJTUV8RkxEX0NNUF9MVHxGTERfQ01QX0VRVUFMLCAiTGVzcyB0aGFuIG9yIGVxdWFsIHRvLiBbbnVtYmVyLCBzaXplLCBwZXJjZW50LCB0aW1lXSIgfSwKKwl7ICI8IiwgRkxEX0NNUF9OVU1CRVJ8RkxEX0NNUF9USU1FfEZMRF9DTVBfTFQsICJMZXNzIHRoYW4uIFtudW1iZXIsIHNpemUsIHBlcmNlbnQsIHRpbWVdIiB9LAorCXsgInNpbmNlIiwgRkxEX0NNUF9USU1FfEZMRF9DTVBfR1R8RkxEX0NNUF9FUVVBTCwgIlNpbmNlIHNwZWNpZmllZCB0aW1lIChzYW1lIGFzICc+PScpLiBbdGltZV0iIH0sCisJeyAiYWZ0ZXIiLCBGTERfQ01QX1RJTUV8RkxEX0NNUF9HVCwgIkFmdGVyIHNwZWNpZmllZCB0aW1lIChzYW1lIGFzICc+JykuIFt0aW1lXSJ9LAorCXsgInVudGlsIiwgRkxEX0NNUF9USU1FfEZMRF9DTVBfTFR8RkxEX0NNUF9FUVVBTCwgIlVudGlsIHNwZWNpZmllZCB0aW1lIChzYW1lIGFzICc8PScpLiBbdGltZV0ifSwKKwl7ICJiZWZvcmUiLCBGTERfQ01QX1RJTUV8RkxEX0NNUF9MVCwgIkJlZm9yZSBzcGVjaWZpZWQgdGltZSAoc2FtZSBhcyAnPCcpLiBbdGltZV0ifSwKKwl7IE5VTEwsIDAsIE5VTEwgfQorfTsKKworI2RlZmluZSBTRUxfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBTRUxfSVRFTQkJMHgwMDAwMDAwMQorI2RlZmluZSBTRUxfQU5EIAkJMHgwMDAwMDAwMgorI2RlZmluZSBTRUxfT1IJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgU0VMX01PRElGSUVSX01BU0sJMHgwMDAwMEYwMAorI2RlZmluZSBTRUxfTU9ESUZJRVJfTk9UCTB4MDAwMDAxMDAKKworI2RlZmluZSBTRUxfUFJFQ0VERU5DRV9NQVNLCTB4MDAwMEYwMDAKKyNkZWZpbmUgU0VMX1BSRUNFREVOQ0VfUFMJMHgwMDAwMTAwMAorI2RlZmluZSBTRUxfUFJFQ0VERU5DRV9QRQkweDAwMDAyMDAwCisKKyNkZWZpbmUgU0VMX0xJU1RfTUFTSwkJMHgwMDBGMDAwMAorI2RlZmluZSBTRUxfTElTVF9MUwkJMHgwMDAxMDAwMAorI2RlZmluZSBTRUxfTElTVF9MRQkJMHgwMDAyMDAwMAorI2RlZmluZSBTRUxfTElTVF9TVUJTRVRfTFMJMHgwMDA0MDAwMAorI2RlZmluZSBTRUxfTElTVF9TVUJTRVRfTEUJMHgwMDA4MDAwMAorCitzdGF0aWMgc3RydWN0IG9wX2RlZiBfb3BfbG9nW10gPSB7CisJeyAiJiYiLCBTRUxfQU5ELCAiQWxsIGZpZWxkcyBtdXN0IG1hdGNoIiB9LAorCXsgIiwiLCBTRUxfQU5ELCAiQWxsIGZpZWxkcyBtdXN0IG1hdGNoIiB9LAorCXsgInx8IiwgU0VMX09SLCAiQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgbWF0Y2giIH0sCisJeyAiIyIsIFNFTF9PUiwgIkF0IGxlYXN0IG9uZSBmaWVsZCBtdXN0IG1hdGNoIiB9LAorCXsgIiEiLCBTRUxfTU9ESUZJRVJfTk9ULCAiTG9naWNhbCBuZWdhdGlvbiIgfSwKKwl7ICIoIiwgU0VMX1BSRUNFREVOQ0VfUFMsICJMZWZ0IHBhcmVudGhlc2lzIiB9LAorCXsgIikiLCBTRUxfUFJFQ0VERU5DRV9QRSwgIlJpZ2h0IHBhcmVudGhlc2lzIiB9LAorCXsgIlsiLCBTRUxfTElTVF9MUywgIkxpc3Qgc3RhcnQiIH0sCisJeyAiXSIsIFNFTF9MSVNUX0xFLCAiTGlzdCBlbmQifSwKKwl7ICJ7IiwgU0VMX0xJU1RfU1VCU0VUX0xTLCAiTGlzdCBzdWJzZXQgc3RhcnQifSwKKwl7ICJ9IiwgU0VMX0xJU1RfU1VCU0VUX0xFLCAiTGlzdCBzdWJzZXQgZW5kIn0sCisJeyBOVUxMLCAgMCwgTlVMTH0sCit9OworCitzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0IHsKKwlzdHJ1Y3QgZG1fc3RyX2xpc3Qgc3RyX2xpc3Q7CisJdW5zaWduZWQgdHlwZTsJCQkvKiBlaXRoZXIgU0VMX0FORCBvciBTRUxfT1IgKi8KK307CisKK3N0cnVjdCBmaWVsZF9zZWxlY3Rpb25fdmFsdWUgeworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqczsKKwkJdWludDY0X3QgaTsKKwkJdGltZV90IHQ7CisJCWRvdWJsZSBkOworCQlzdHJ1Y3QgZG1fcmVnZXggKnI7CisJCXN0cnVjdCBzZWxlY3Rpb25fc3RyX2xpc3QgKmw7CisJfSB2OworCXN0cnVjdCBmaWVsZF9zZWxlY3Rpb25fdmFsdWUgKm5leHQ7Cit9OworCitzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uIHsKKwlzdHJ1Y3QgZmllbGRfcHJvcGVydGllcyAqZnA7CisJdWludDMyX3QgZmxhZ3M7CisJc3RydWN0IGZpZWxkX3NlbGVjdGlvbl92YWx1ZSAqdmFsdWU7Cit9OworCitzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJdWludDMyX3QgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKml0ZW07CisJCXN0cnVjdCBkbV9saXN0IHNldDsKKwl9IHNlbGVjdGlvbjsKK307CisKK3N0cnVjdCByZXNlcnZlZF92YWx1ZV93cmFwcGVyIHsKKwljb25zdCBjaGFyICptYXRjaGVkX25hbWU7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSAqcmVzZXJ2ZWQ7CisJY29uc3Qgdm9pZCAqdmFsdWU7Cit9OworCisvKgorICogUmVwb3J0IGRhdGEgZmllbGQKKyAqLworc3RydWN0IGRtX3JlcG9ydF9maWVsZCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgZmllbGRfcHJvcGVydGllcyAqcHJvcHM7CisKKwljb25zdCBjaGFyICpyZXBvcnRfc3RyaW5nOwkvKiBGb3JtYXR0ZWQgcmVhZHkgZm9yIGRpc3BsYXkgKi8KKwljb25zdCB2b2lkICpzb3J0X3ZhbHVlOwkJLyogUmF3IHZhbHVlIGZvciBzb3J0aW5nICovCit9OworCitzdHJ1Y3Qgcm93IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkbV9yZXBvcnQgKnJoOworCXN0cnVjdCBkbV9saXN0IGZpZWxkczsJCQkgIC8qIEZpZWxkcyBpbiBkaXNwbGF5IG9yZGVyICovCisJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqKCpzb3J0X2ZpZWxkcylbXTsgLyogRmllbGRzIGluIHNvcnQgb3JkZXIgKi8KKwlpbnQgc2VsZWN0ZWQ7CisJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGRfc2VsX3N0YXR1czsKK307CisKKy8qCisgKiBJbXBsaWNpdCByZXBvcnQgdHlwZXMgYW5kIGZpZWxkcy4KKyAqLworI2RlZmluZSBTUEVDSUFMX1JFUE9SVF9UWVBFIDB4ODAwMDAwMDAKKyNkZWZpbmUgU1BFQ0lBTF9GSUVMRF9TRUxFQ1RFRF9JRCAic2VsZWN0ZWQiCisjZGVmaW5lIFNQRUNJQUxfRklFTERfSEVMUF9JRCAiaGVscCIKKyNkZWZpbmUgU1BFQ0lBTF9GSUVMRF9IRUxQX0FMVF9JRCAiPyIKKworc3RhdGljIHZvaWQgKl9udWxsX3JldHVybmluZ19mbih2b2lkICpvYmogX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX25vX3JlcG9ydF9mbihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIGNvbnN0IHZvaWQgKmRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc2VsZWN0ZWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IHJvdyAqcm93ID0gKGNvbnN0IHN0cnVjdCByb3cgKilkYXRhOworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50KHJoLCBmaWVsZCwgJnJvdy0+c2VsZWN0ZWQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSBfaW1wbGljaXRfc3BlY2lhbF9yZXBvcnRfdHlwZXNbXSA9IHsKKwl7IFNQRUNJQUxfUkVQT1JUX1RZUEUsICJTcGVjaWFsIiwgInNwZWNpYWxfIiwgX251bGxfcmV0dXJuaW5nX2ZuIH0sCisJeyAwLCAiIiwgIiIsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSBfaW1wbGljaXRfc3BlY2lhbF9yZXBvcnRfZmllbGRzW10gPSB7CisJeyBTUEVDSUFMX1JFUE9SVF9UWVBFLCBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIgfCBGTERfQ01QX1VOQ09NUEFSQUJMRSAsIDAsIDgsIFNQRUNJQUxfRklFTERfSEVMUF9JRCwgIkhlbHAiLCBfbm9fcmVwb3J0X2ZuLCAiU2hvdyBoZWxwLiIgfSwKKwl7IFNQRUNJQUxfUkVQT1JUX1RZUEUsIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUiB8IEZMRF9DTVBfVU5DT01QQVJBQkxFICwgMCwgOCwgU1BFQ0lBTF9GSUVMRF9IRUxQX0FMVF9JRCwgIkhlbHAiLCBfbm9fcmVwb3J0X2ZuLCAiU2hvdyBoZWxwLiIgfSwKKwl7IDAsIDAsIDAsIDAsICIiLCAiIiwgMCwgMH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgX2ltcGxpY2l0X3NwZWNpYWxfcmVwb3J0X2ZpZWxkc193aXRoX3NlbGVjdGlvbltdID0geworCXsgU1BFQ0lBTF9SRVBPUlRfVFlQRSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSLCAwLCA4LCBTUEVDSUFMX0ZJRUxEX1NFTEVDVEVEX0lELCAiU2VsZWN0ZWQiLCBfc2VsZWN0ZWRfZGlzcCwgIlNldCBpZiBpdGVtIHBhc3NlcyBzZWxlY3Rpb24gY3JpdGVyaWEuIiB9LAorCXsgU1BFQ0lBTF9SRVBPUlRfVFlQRSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSIHwgRkxEX0NNUF9VTkNPTVBBUkFCTEUgLCAwLCA4LCBTUEVDSUFMX0ZJRUxEX0hFTFBfSUQsICJIZWxwIiwgX25vX3JlcG9ydF9mbiwgIlNob3cgaGVscC4iIH0sCisJeyBTUEVDSUFMX1JFUE9SVF9UWVBFLCBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIgfCBGTERfQ01QX1VOQ09NUEFSQUJMRSAsIDAsIDgsIFNQRUNJQUxfRklFTERfSEVMUF9BTFRfSUQsICJIZWxwIiwgX25vX3JlcG9ydF9mbiwgIlNob3cgaGVscC4iIH0sCisJeyAwLCAwLCAwLCAwLCAiIiwgIiIsIDAsIDB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSAqX2ltcGxpY2l0X3JlcG9ydF90eXBlcyA9IF9pbXBsaWNpdF9zcGVjaWFsX3JlcG9ydF90eXBlczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgKl9pbXBsaWNpdF9yZXBvcnRfZmllbGRzID0gX2ltcGxpY2l0X3NwZWNpYWxfcmVwb3J0X2ZpZWxkczsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKl9maW5kX3R5cGUoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCQkgICAgICB1aW50MzJfdCByZXBvcnRfdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0OworCisJZm9yICh0ID0gX2ltcGxpY2l0X3JlcG9ydF90eXBlczsgdC0+ZGF0YV9mbjsgdCsrKQorCQlpZiAodC0+aWQgPT0gcmVwb3J0X3R5cGUpCisJCQlyZXR1cm4gdDsKKworCWZvciAodCA9IHJoLT50eXBlczsgdC0+ZGF0YV9mbjsgdCsrKQorCQlpZiAodC0+aWQgPT0gcmVwb3J0X3R5cGUpCisJCQlyZXR1cm4gdDsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogRGF0YS1tdW5naW5nIGZ1bmN0aW9ucyB0byBwcmVwYXJlIGVhY2ggZGF0YSB0eXBlIGZvciBkaXNwbGF5IGFuZCBzb3J0aW5nCisgKi8KKworaW50IGRtX3JlcG9ydF9maWVsZF9zdHJpbmcoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3QgY2hhciAqY29uc3QgKmRhdGEpCit7CisJY2hhciAqcmVwc3RyOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF9zdHJkdXAocmgtPm1lbSwgKmRhdGEpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF9zdHJpbmc6IGRtX3Bvb2xfc3RyZHVwIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmaWVsZC0+cmVwb3J0X3N0cmluZyA9IHJlcHN0cjsKKwlmaWVsZC0+c29ydF92YWx1ZSA9IChjb25zdCB2b2lkICopIGZpZWxkLT5yZXBvcnRfc3RyaW5nOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9yZXBvcnRfZmllbGRfcGVyY2VudChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSAgICBjb25zdCBkbV9wZXJjZW50X3QgKmRhdGEpCit7CisJY2hhciAqcmVwc3RyOworCXVpbnQ2NF90ICpzb3J0dmFsOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MocmgtPm1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQ6IGRtX3Bvb2xfYWxsb2MgZmFpbGVkIGZvciBzb3J0X3ZhbHVlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc29ydHZhbCA9ICh1aW50NjRfdCkoKmRhdGEpOworCisJaWYgKCpkYXRhID09IERNX1BFUkNFTlRfSU5WQUxJRCkgeworCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiIiwgc29ydHZhbCk7CisJCXJldHVybiAxOworCX0KKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfYWxsb2MocmgtPm1lbSwgOCkpKSB7CisJCWRtX3Bvb2xfZnJlZShyaC0+bWVtLCBzb3J0dmFsKTsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfcGVyY2VudDogZG1fcG9vbF9hbGxvYyBmYWlsZWQgZm9yIHBlcmNlbnQgcmVwb3J0IHN0cmluZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRtX3NucHJpbnRmKHJlcHN0ciwgNywgIiUuMmYiLCBkbV9wZXJjZW50X3RvX2Zsb2F0KCpkYXRhKSkgPCAwKSB7CisJCWRtX3Bvb2xfZnJlZShyaC0+bWVtLCBzb3J0dmFsKTsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfcGVyY2VudDogcGVyY2VudGFnZSB0b28gbGFyZ2UuIik7CisJCXJldHVybiAwOworCX0KKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlX2l0ZW0geworCXVuc2lnbmVkIHBvczsKKwlzaXplX3QgbGVuOworfTsKKworc3RydWN0IHN0cl9saXN0X3NvcnRfdmFsdWUgeworCWNvbnN0IGNoYXIgKnZhbHVlOworCXN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlX2l0ZW0gKml0ZW1zOworfTsKKworc3RydWN0IHN0cl9saXN0X3NvcnRfaXRlbSB7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlX2l0ZW0gaXRlbTsKK307CisKK3N0YXRpYyBpbnQgX3N0cl9saXN0X3NvcnRfaXRlbV9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3Qgc3RyX2xpc3Rfc29ydF9pdGVtICpzbHNpX2EgPSAoY29uc3Qgc3RydWN0IHN0cl9saXN0X3NvcnRfaXRlbSAqKSBhOworCWNvbnN0IHN0cnVjdCBzdHJfbGlzdF9zb3J0X2l0ZW0gKnNsc2lfYiA9IChjb25zdCBzdHJ1Y3Qgc3RyX2xpc3Rfc29ydF9pdGVtICopIGI7CisKKwlyZXR1cm4gc3RyY21wKHNsc2lfYS0+c3RyLCBzbHNpX2ItPnN0cik7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmRhdGEsCisJCQkJICAgICBjb25zdCBjaGFyICpkZWxpbWl0ZXIsCisJCQkJICAgICBpbnQgc29ydCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBfc3RyaW5nX2xpc3RfZ3Jvd19vYmplY3RfZmFpbGVkX21zZ1tdID0gImRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdDogZG1fcG9vbF9ncm93X29iamVjdF9mYWlsZWQiOworCXN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlICpzb3J0X3ZhbHVlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbGlzdF9zaXplLCBwb3MsIGk7CisJc3RydWN0IHN0cl9saXN0X3NvcnRfaXRlbSAqYXJyID0gTlVMTDsKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCXNpemVfdCBkZWxpbWl0ZXJfbGVuLCBsZW47CisJdm9pZCAqb2JqZWN0OworCWludCByID0gMDsKKworCWlmICghKHNvcnRfdmFsdWUgPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCBzaXplb2Yoc3RydWN0IHN0cl9saXN0X3NvcnRfdmFsdWUpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfc3RyaW5nX2xpc3Q6IGRtX3Bvb2xfemFsbG9jIGZhaWxlZCBmb3Igc29ydF92YWx1ZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsaXN0X3NpemUgPSBkbV9saXN0X3NpemUoZGF0YSk7CisKKwkvKgorCSAqIFNvcnQgdmFsdWUgc3RvcmVzIHRoZSBwb2ludGVyIHRvIHRoZSByZXBvcnRfc3RyaW5nIGFuZCB0aGVuCisJICogcG9zaXRpb24gYW5kIGxlbmd0aCBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2l0aGluZyB0aGUgcmVwb3J0X3N0cmluZy4KKwkgKiBUaGUgZmlyc3QgZWxlbWVudCBzdG9yZXMgbnVtYmVyIG9mIGVsZW1lbnRzIGluICdsZW4nICh0aGVyZWZvcmUKKwkgKiBsaXN0X3NpemUgKyAxIGlzIHVzZWQgYmVsb3cgZm9yIHRoZSBleHRyYSBlbGVtZW50KS4KKwkgKiBGb3IgZXhhbXBsZSwgd2l0aCB0aGlzIGlucHV0OgorCSAqICAgc29ydCA9IDA7ICAod2UgZG9uJ3Qgd2FudCB0byByZXBvcnQgc29ydGVkKQorCSAqICAgcmVwb3J0X3N0cmluZyA9ICJhYmMseHksZGVmZ2giOyAgKHRoaXMgaXMgcmVwb3J0ZWQpCisJICoKKwkgKiAuLi53ZSBlbmQgdXAgd2l0aDoKKwkgKiAgIHNvcnRfdmFsdWUtPnZhbHVlID0gcmVwb3J0X3N0cmluZzsgKHdlJ2xsIHVzZSB0aGUgb3JpZ2luYWwgcmVwb3J0X3N0cmluZyBmb3IgaW5kaWNlcykKKwkgKiAgIHNvcnRfdmFsdWUtPml0ZW1zWzBdID0gezAsM307ICAod2UgaGF2ZSAzIGl0ZW1zKQorCSAqICAgc29ydF92YWx1ZS0+aXRlbXNbMV0gPSB7MCwzfTsgICgiYWJjIikKKwkgKiAgIHNvcnRfdmFsdWUtPml0ZW1zWzJdID0gezcsNX07ICAoImRlZmdoIikKKwkgKiAgIHNvcnRfdmFsdWUtPml0ZW1zWzNdID0gezQsMn07ICAoInh5IikKKwkgKgorCSAqICAgVGhlIGl0ZW1zIGFsb25lIGFyZSBhbHdheXMgc29ydGVkIHdoaWxlIGluIHJlcG9ydF9zdHJpbmcgdGhleSBjYW4gYmUKKwkgKiAgIHNvcnRlZCBvciBub3QgKGJhc2VkIG9uICJzb3J0IiBhcmcpIC0gaXQgZGVwZW5kcyBvbiBob3cgd2UgcHJlZmVyIHRvCisJICogICBkaXNwbGF5IHRoZSBsaXN0LiBIYXZpbmcgaXRlbXMgc29ydGVkIGludGVybmFsbHkgaGVscHMgd2l0aCBzZWFyY2hpbmcKKwkgKiAgIHRocm91Z2ggdGhlbS4KKwkgKi8KKwlpZiAoIShzb3J0X3ZhbHVlLT5pdGVtcyA9IGRtX3Bvb2xfemFsbG9jKHJoLT5tZW0sIChsaXN0X3NpemUgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc3RyX2xpc3Rfc29ydF92YWx1ZV9pdGVtKSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X2ZpZWxfc3RyaW5nX2xpc3Q6IGRtX3Bvb2xfemFsbG9jIGZhaWxlZCBmb3Igc29ydCB2YWx1ZSBpdGVtcyIpOworCQlnb3RvIG91dDsKKwl9CisJc29ydF92YWx1ZS0+aXRlbXNbMF0ubGVuID0gbGlzdF9zaXplOworCisJLyogemVybyBpdGVtcyAqLworCWlmICghbGlzdF9zaXplKSB7CisJCXNvcnRfdmFsdWUtPnZhbHVlID0gZmllbGQtPnJlcG9ydF9zdHJpbmcgPSAiIjsKKwkJZmllbGQtPnNvcnRfdmFsdWUgPSBzb3J0X3ZhbHVlOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBvbmUgaXRlbSAqLworCWlmIChsaXN0X3NpemUgPT0gMSkgeworCQlzbCA9IChzdHJ1Y3QgZG1fc3RyX2xpc3QgKikgZG1fbGlzdF9maXJzdChkYXRhKTsKKwkJaWYgKCFzbCB8fAorCQkgICAgIShzb3J0X3ZhbHVlLT52YWx1ZSA9IGZpZWxkLT5yZXBvcnRfc3RyaW5nID0gZG1fcG9vbF9zdHJkdXAocmgtPm1lbSwgc2wtPnN0cikpKSB7CisJCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdDogZG1fcG9vbF9zdHJkdXAgZmFpbGVkIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzb3J0X3ZhbHVlLT5pdGVtc1sxXS5wb3MgPSAwOworCQlzb3J0X3ZhbHVlLT5pdGVtc1sxXS5sZW4gPSBzdHJsZW4oc2wtPnN0cik7CisJCWZpZWxkLT5zb3J0X3ZhbHVlID0gc29ydF92YWx1ZTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogbW9yZSB0aGFuIG9uZSBpdGVtIC0gc29ydCB0aGUgbGlzdCAqLworCWlmICghKGFyciA9IGRtX21hbGxvYyhzaXplb2Yoc3RydWN0IHN0cl9saXN0X3NvcnRfaXRlbSkgKiBsaXN0X3NpemUpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdDogZG1fbWFsbG9jIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShkbV9wb29sX2JlZ2luX29iamVjdChyaC0+bWVtLCAyNTYpKSkgeworCQlsb2dfZXJyb3IoX3N0cmluZ19saXN0X2dyb3dfb2JqZWN0X2ZhaWxlZF9tc2cpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRlbGltaXRlcikKKwkJZGVsaW1pdGVyID0gIiwiOworCWRlbGltaXRlcl9sZW4gPSBzdHJsZW4oZGVsaW1pdGVyKTsKKworCWkgPSBwb3MgPSBsZW4gPSAwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgZGF0YSkgeworCQlhcnJbaV0uc3RyID0gc2wtPnN0cjsKKwkJaWYgKCFzb3J0KSB7CisJCQkvKiBzb3J0ZWQgb3V0cHVkIG5vdCByZXF1aXJlZCAtIHJlcG9ydCB0aGUgbGlzdCBhcyBpdCBpcyAqLworCQkJbGVuID0gc3RybGVuKHNsLT5zdHIpOworCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIGFycltpXS5zdHIsIGxlbikgfHwKKwkJCSAgICAoaSsxICE9IGxpc3Rfc2l6ZSAmJiAhZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBkZWxpbWl0ZXIsIGRlbGltaXRlcl9sZW4pKSkgeworCQkJCWxvZ19lcnJvcihfc3RyaW5nX2xpc3RfZ3Jvd19vYmplY3RfZmFpbGVkX21zZyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlhcnJbaV0uaXRlbS5wb3MgPSBwb3M7CisJCQlhcnJbaV0uaXRlbS5sZW4gPSBsZW47CisJCQlwb3MgPSBpKzEgPT0gbGlzdF9zaXplID8gcG9zK2xlbiA6IHBvcytsZW4rZGVsaW1pdGVyX2xlbjsKKwkJfQorCQlpKys7CisJfQorCisJcXNvcnQoYXJyLCBpLCBzaXplb2Yoc3RydWN0IHN0cl9saXN0X3NvcnRfaXRlbSksIF9zdHJfbGlzdF9zb3J0X2l0ZW1fY21wKTsKKworCWZvciAoaSA9IDAsIHBvcyA9IDA7IGkgPCBsaXN0X3NpemU7IGkrKykgeworCQlpZiAoc29ydCkgeworCQkJLyogc29ydGVkIG91dHB1dCByZXF1aXJlZCAtIHJlcG9ydCB0aGUgbGlzdCBhcyBzb3J0ZWQgKi8KKwkJCWxlbiA9IHN0cmxlbihhcnJbaV0uc3RyKTsKKwkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBhcnJbaV0uc3RyLCBsZW4pIHx8CisJCQkgICAgKGkrMSAhPSBsaXN0X3NpemUgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgZGVsaW1pdGVyLCBkZWxpbWl0ZXJfbGVuKSkpIHsKKwkJCQlsb2dfZXJyb3IoX3N0cmluZ19saXN0X2dyb3dfb2JqZWN0X2ZhaWxlZF9tc2cpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJLyoKKwkJCSAqIFNhdmUgcG9zaXRpb24gYW5kIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisJCQkgKiBlbGVtZW50IGluIHJlcG9ydF9zdHJpbmcgZm9yIHNvcnRfdmFsdWUuCisJCQkgKiBVc2UgaSsxIGhlcmUgc2luY2UgaXRlbXNbMF0gc3RvcmVzIGxpc3Qgc2l6ZSEhIQorCQkJICovCisJCQlzb3J0X3ZhbHVlLT5pdGVtc1tpKzFdLnBvcyA9IHBvczsKKwkJCXNvcnRfdmFsdWUtPml0ZW1zW2krMV0ubGVuID0gbGVuOworCQkJcG9zID0gaSsxID09IGxpc3Rfc2l6ZSA/IHBvcytsZW4gOiBwb3MrbGVuK2RlbGltaXRlcl9sZW47CisJCX0gZWxzZSB7CisJCQlzb3J0X3ZhbHVlLT5pdGVtc1tpKzFdLnBvcyA9IGFycltpXS5pdGVtLnBvczsKKwkJCXNvcnRfdmFsdWUtPml0ZW1zW2krMV0ubGVuID0gYXJyW2ldLml0ZW0ubGVuOworCQl9CisJfQorCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sICJcMCIsIDEpKSB7CisJCWxvZ19lcnJvcihfc3RyaW5nX2xpc3RfZ3Jvd19vYmplY3RfZmFpbGVkX21zZyk7CisJCWdvdG8gb3V0OworCX0KKworCW9iamVjdCA9IGRtX3Bvb2xfZW5kX29iamVjdChyaC0+bWVtKTsKKwlzb3J0X3ZhbHVlLT52YWx1ZSA9IG9iamVjdDsKKwlmaWVsZC0+c29ydF92YWx1ZSA9IHNvcnRfdmFsdWU7CisJZmllbGQtPnJlcG9ydF9zdHJpbmcgPSBvYmplY3Q7CisJciA9IDE7CitvdXQ6CisJaWYgKCFyICYmIHNvcnRfdmFsdWUpCisJCWRtX3Bvb2xfZnJlZShyaC0+bWVtLCBzb3J0X3ZhbHVlKTsKKwlpZiAoYXJyKQorCQlkbV9mcmVlKGFycik7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9yZXBvcnRfZmllbGRfc3RyaW5nX2xpc3Qoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJY29uc3Qgc3RydWN0IGRtX2xpc3QgKmRhdGEsCisJCQkJY29uc3QgY2hhciAqZGVsaW1pdGVyKQoreworCXJldHVybiBfcmVwb3J0X2ZpZWxkX3N0cmluZ19saXN0KHJoLCBmaWVsZCwgZGF0YSwgZGVsaW1pdGVyLCAxKTsKK30KKworaW50IGRtX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdF91bnNvcnRlZChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCQkgY29uc3Qgc3RydWN0IGRtX2xpc3QgKmRhdGEsCisJCQkJCSBjb25zdCBjaGFyICpkZWxpbWl0ZXIpCit7CisJLyoKKwkgKiBUaGUgcmF3IHZhbHVlIGlzIGFsd2F5cyBzb3J0ZWQsIGp1c3QgdGhlIHN0cmluZyByZXBvcnRlZCBpcyB1bnNvcnRlZC4KKwkgKiBIYXZpbmcgdGhlIHJhdyB2YWx1ZSBhbHdheXMgc29ydGVkIGhlbHBzIHdoZW4gbWF0Y2hpbmcgc2VsZWN0aW9uIGxpc3QKKwkgKiB3aXRoIHNlbGVjdGlvbiBjcml0ZXJpYS4KKwkgKi8KKwlyZXR1cm4gX3JlcG9ydF9maWVsZF9zdHJpbmdfbGlzdChyaCwgZmllbGQsIGRhdGEsIGRlbGltaXRlciwgMCk7Cit9CisKK2ludCBkbV9yZXBvcnRfZmllbGRfaW50KHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IGludCAqZGF0YSkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSAqZGF0YTsKKwl1aW50NjRfdCAqc29ydHZhbDsKKwljaGFyICpyZXBzdHI7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCAxMykpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X2ZpZWxkX2ludDogZG1fcG9vbF9hbGxvYyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MocmgtPm1lbSwgc2l6ZW9mKGludDY0X3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfaW50OiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYocmVwc3RyLCAxMiwgIiVkIiwgdmFsdWUpIDwgMCkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF9pbnQ6IGludCB0b28gYmlnOiAlZCIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSAodWludDY0X3QpIHZhbHVlOworCWZpZWxkLT5zb3J0X3ZhbHVlID0gc29ydHZhbDsKKwlmaWVsZC0+cmVwb3J0X3N0cmluZyA9IHJlcHN0cjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fcmVwb3J0X2ZpZWxkX3VpbnQzMihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB1aW50MzJfdCAqZGF0YSkKK3sKKwljb25zdCB1aW50MzJfdCB2YWx1ZSA9ICpkYXRhOworCXVpbnQ2NF90ICpzb3J0dmFsOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfemFsbG9jKHJoLT5tZW0sIDEyKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfdWludDMyOiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhyaC0+bWVtLCBzaXplb2YodWludDY0X3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfdWludDMyOiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYocmVwc3RyLCAxMSwgIiV1IiwgdmFsdWUpIDwgMCkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF91aW50MzI6IHVpbnQzMiB0b28gYmlnOiAldSIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSAodWludDY0X3QpIHZhbHVlOworCWZpZWxkLT5zb3J0X3ZhbHVlID0gc29ydHZhbDsKKwlmaWVsZC0+cmVwb3J0X3N0cmluZyA9IHJlcHN0cjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fcmVwb3J0X2ZpZWxkX2ludDMyKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3QgaW50MzJfdCAqZGF0YSkKK3sKKwljb25zdCBpbnQzMl90IHZhbHVlID0gKmRhdGE7CisJdWludDY0X3QgKnNvcnR2YWw7CisJY2hhciAqcmVwc3RyOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF96YWxsb2MocmgtPm1lbSwgMTMpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF9pbnQzMjogZG1fcG9vbF9hbGxvYyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MocmgtPm1lbSwgc2l6ZW9mKGludDY0X3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfaW50MzI6IGRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihyZXBzdHIsIDEyLCAiJWQiLCB2YWx1ZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X2ZpZWxkX2ludDMyOiBpbnQzMiB0b28gYmlnOiAlZCIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSAodWludDY0X3QpIHZhbHVlOworCWZpZWxkLT5zb3J0X3ZhbHVlID0gc29ydHZhbDsKKwlmaWVsZC0+cmVwb3J0X3N0cmluZyA9IHJlcHN0cjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fcmVwb3J0X2ZpZWxkX3VpbnQ2NChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB1aW50NjRfdCAqZGF0YSkKK3sKKwljb25zdCB1aW50NjRfdCB2YWx1ZSA9ICpkYXRhOworCXVpbnQ2NF90ICpzb3J0dmFsOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfemFsbG9jKHJoLT5tZW0sIDIyKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfdWludDY0OiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhyaC0+bWVtLCBzaXplb2YodWludDY0X3QpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnRfZmllbGRfdWludDY0OiBkbV9wb29sX2FsbG9jIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYocmVwc3RyLCAyMSwgRk1UdTY0ICwgdmFsdWUpIDwgMCkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9maWVsZF91aW50NjQ6IHVpbnQ2NCB0b28gYmlnOiAlIiBQUkl1NjQsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKnNvcnR2YWwgPSB2YWx1ZTsKKwlmaWVsZC0+c29ydF92YWx1ZSA9IHNvcnR2YWw7CisJZmllbGQtPnJlcG9ydF9zdHJpbmcgPSByZXBzdHI7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIGN1c3RvbSByZXBvcnQgZnVuY3Rpb25zCisgKi8KK3ZvaWQgZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqdmFsdWUsIGNvbnN0IHZvaWQgKnNvcnR2YWx1ZSkKK3sKKwlmaWVsZC0+cmVwb3J0X3N0cmluZyA9IChjb25zdCBjaGFyICopIHZhbHVlOworCWZpZWxkLT5zb3J0X3ZhbHVlID0gc29ydHZhbHVlID8gOiB2YWx1ZTsKKworCWlmICgoZmllbGQtPnNvcnRfdmFsdWUgPT0gdmFsdWUpICYmCisJICAgIChmaWVsZC0+cHJvcHMtPmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSKSkKKwkJbG9nX3dhcm4oSU5URVJOQUxfRVJST1IgIlVzaW5nIHN0cmluZyBhcyBzb3J0IHZhbHVlIGZvciBudW1lcmljYWwgZmllbGQuIik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0X2ZpZWxkX3R5cGVfbmFtZSh1bnNpZ25lZCBmaWVsZF90eXBlKQoreworCXN3aXRjaCAoZmllbGRfdHlwZSkgeworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORzogcmV0dXJuICJzdHJpbmciOworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUjogcmV0dXJuICJudW1iZXIiOworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkU6IHJldHVybiAic2l6ZSI7CisJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfUEVSQ0VOVDogcmV0dXJuICJwZXJjZW50IjsKKwkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FOiByZXR1cm4gInRpbWUiOworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklOR19MSVNUOiByZXR1cm4gInN0cmluZyBsaXN0IjsKKwkJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKy8qCisgKiBzaG93IGhlbHAgbWVzc2FnZQorICovCitzdGF0aWMgc2l6ZV90IF9nZXRfbG9uZ2VzdF9maWVsZF9pZF9sZW4oY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHMpCit7CisJdWludDMyX3QgZjsKKwlzaXplX3QgaWRfbGVuID0gMDsKKworCWZvciAoZiA9IDA7IGZpZWxkc1tmXS5yZXBvcnRfZm47IGYrKykKKwkJaWYgKHN0cmxlbihmaWVsZHNbZl0uaWQpID4gaWRfbGVuKQorCQkJaWRfbGVuID0gc3RybGVuKGZpZWxkc1tmXS5pZCk7CisKKwlyZXR1cm4gaWRfbGVuOworfQorCitzdGF0aWMgdm9pZCBfZGlzcGxheV9maWVsZHNfbW9yZShzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHMsCisJCQkJIHNpemVfdCBpZF9sZW4sIGludCBkaXNwbGF5X2FsbF9maWVsZHNfaXRlbSwKKwkJCQkgaW50IGRpc3BsYXlfZmllbGRfdHlwZXMpCit7CisJdWludDMyX3QgZjsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0eXBlOworCWNvbnN0IGNoYXIgKmRlc2MsICpsYXN0X2Rlc2MgPSAiIjsKKworCWZvciAoZiA9IDA7IGZpZWxkc1tmXS5yZXBvcnRfZm47IGYrKykKKwkJaWYgKHN0cmxlbihmaWVsZHNbZl0uaWQpID4gaWRfbGVuKQorCQkJaWRfbGVuID0gc3RybGVuKGZpZWxkc1tmXS5pZCk7CisKKwlmb3IgKHR5cGUgPSByaC0+dHlwZXM7IHR5cGUtPmRhdGFfZm47IHR5cGUrKykKKwkJaWYgKHN0cmxlbih0eXBlLT5wcmVmaXgpICsgMyA+IGlkX2xlbikKKwkJCWlkX2xlbiA9IHN0cmxlbih0eXBlLT5wcmVmaXgpICsgMzsKKworCWZvciAoZiA9IDA7IGZpZWxkc1tmXS5yZXBvcnRfZm47IGYrKykgeworCQlpZiAoKHR5cGUgPSBfZmluZF90eXBlKHJoLCBmaWVsZHNbZl0udHlwZSkpICYmIHR5cGUtPmRlc2MpCisJCQlkZXNjID0gdHlwZS0+ZGVzYzsKKwkJZWxzZQorCQkJZGVzYyA9ICIgIjsKKwkJaWYgKGRlc2MgIT0gbGFzdF9kZXNjKSB7CisJCQlpZiAoKmxhc3RfZGVzYykKKwkJCQlsb2dfd2FybigiICIpOworCQkJbG9nX3dhcm4oIiVzIEZpZWxkcyIsIGRlc2MpOworCQkJbG9nX3dhcm4oIiUqLipzIiwgKGludCkgc3RybGVuKGRlc2MpICsgNywKKwkJCQkgKGludCkgc3RybGVuKGRlc2MpICsgNywKKwkJCQkgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJCWlmIChkaXNwbGF5X2FsbF9maWVsZHNfaXRlbSAmJiB0eXBlLT5pZCAhPSBTUEVDSUFMX1JFUE9SVF9UWVBFKQorCQkJCWxvZ193YXJuKCIgICVzYWxsJS0qcyAtICVzIiwgdHlwZS0+cHJlZml4LAorCQkJCQkgKGludCkgKGlkX2xlbiAtIDMgLSBzdHJsZW4odHlwZS0+cHJlZml4KSksICIiLAorCQkJCQkgIkFsbCBmaWVsZHMgaW4gdGhpcyBzZWN0aW9uLiIpOworCQl9CisJCS8qIEZJWE1FIEFkZCBsaW5lLXdyYXBwaW5nIGF0IHRlcm1pbmFsIHdpZHRoIChvciA4MCBjb2xzKSAqLworCQlsb2dfd2FybigiICAlLSpzIC0gJXMlcyVzJXMlcyIsIChpbnQpIGlkX2xlbiwgZmllbGRzW2ZdLmlkLCBmaWVsZHNbZl0uZGVzYywKKwkJCQkJICAgICAgZGlzcGxheV9maWVsZF90eXBlcyA/ICIgWyIgOiAiIiwKKwkJCQkJICAgICAgZGlzcGxheV9maWVsZF90eXBlcyA/IGZpZWxkc1tmXS5mbGFncyAmIEZMRF9DTVBfVU5DT01QQVJBQkxFID8gInVuc2VsZWN0YWJsZSAiIDogIiIgOiAiIiwKKwkJCQkJICAgICAgZGlzcGxheV9maWVsZF90eXBlcyA/IF9nZXRfZmllbGRfdHlwZV9uYW1lKGZpZWxkc1tmXS5mbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spIDogIiIsCisJCQkJCSAgICAgIGRpc3BsYXlfZmllbGRfdHlwZXMgPyAiXSIgOiAiIik7CisJCWxhc3RfZGVzYyA9IGRlc2M7CisJfQorfQorCisvKgorICogc2hvdyBoZWxwIG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQgX2Rpc3BsYXlfZmllbGRzKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBpbnQgZGlzcGxheV9hbGxfZmllbGRzX2l0ZW0sCisJCQkgICAgaW50IGRpc3BsYXlfZmllbGRfdHlwZXMpCit7CisJc2l6ZV90IHRtcCwgaWRfbGVuID0gMDsKKworCWlmICgodG1wID0gX2dldF9sb25nZXN0X2ZpZWxkX2lkX2xlbihfaW1wbGljaXRfcmVwb3J0X2ZpZWxkcykpID4gaWRfbGVuKQorCQlpZF9sZW4gPSB0bXA7CisJaWYgKCh0bXAgPSBfZ2V0X2xvbmdlc3RfZmllbGRfaWRfbGVuKHJoLT5maWVsZHMpKSA+IGlkX2xlbikKKwkJaWRfbGVuID0gdG1wOworCisJX2Rpc3BsYXlfZmllbGRzX21vcmUocmgsIHJoLT5maWVsZHMsIGlkX2xlbiwgZGlzcGxheV9hbGxfZmllbGRzX2l0ZW0sCisJCQkgICAgIGRpc3BsYXlfZmllbGRfdHlwZXMpOworCWxvZ193YXJuKCIgIik7CisJX2Rpc3BsYXlfZmllbGRzX21vcmUocmgsIF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzLCBpZF9sZW4sCisJCQkgICAgIGRpc3BsYXlfYWxsX2ZpZWxkc19pdGVtLCBkaXNwbGF5X2ZpZWxkX3R5cGVzKTsKKworfQorCisvKgorICogSW5pdGlhbGlzZSByZXBvcnQgaGFuZGxlCisgKi8KK3N0YXRpYyBpbnQgX2NvcHlfZmllbGQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpkZXN0LAorCQkgICAgICAgdWludDMyX3QgZmllbGRfbnVtLCBpbnQgaW1wbGljaXQpCit7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHMgPSBpbXBsaWNpdCA/IF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzCisJCQkJCQkJICAgICA6IHJoLT5maWVsZHM7CisKKwlkZXN0LT5maWVsZF9udW0gPSBmaWVsZF9udW07CisJZGVzdC0+aW5pdGlhbF93aWR0aCA9IGZpZWxkc1tmaWVsZF9udW1dLndpZHRoOworCWRlc3QtPndpZHRoID0gZmllbGRzW2ZpZWxkX251bV0ud2lkdGg7IC8qIGFkanVzdGVkIGluIF9kb19yZXBvcnRfb2JqZWN0KCkgKi8KKwlkZXN0LT5mbGFncyA9IGZpZWxkc1tmaWVsZF9udW1dLmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX01BU0s7CisJZGVzdC0+aW1wbGljaXQgPSBpbXBsaWNpdDsKKworCS8qIHNldCBvYmplY3QgdHlwZSBtZXRob2QgKi8KKwlkZXN0LT50eXBlID0gX2ZpbmRfdHlwZShyaCwgZmllbGRzW2ZpZWxkX251bV0udHlwZSk7CisJaWYgKCFkZXN0LT50eXBlKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBmaWVsZCBub3QgbWF0Y2g6ICVzIiwKKwkJCSAgZmllbGRzW2ZpZWxkX251bV0uaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICogX2FkZF9maWVsZChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkJICAgIHVpbnQzMl90IGZpZWxkX251bSwgaW50IGltcGxpY2l0LAorCQkJCQkgICAgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGZpZWxkX3Byb3BlcnRpZXMgKmZwOworCisJaWYgKCEoZnAgPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCBzaXplb2YoKmZwKSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBzdHJ1Y3QgZmllbGRfcHJvcGVydGllcyBhbGxvY2F0aW9uICIKKwkJCSAgImZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIV9jb3B5X2ZpZWxkKHJoLCBmcCwgZmllbGRfbnVtLCBpbXBsaWNpdCkpIHsKKwkJc3RhY2s7CisJCWRtX3Bvb2xfZnJlZShyaC0+bWVtLCBmcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZwLT5mbGFncyB8PSBmbGFnczsKKworCS8qCisJICogUGxhY2UgaGlkZGVuIGZpZWxkcyBhdCB0aGUgZnJvbnQgc28gZG1fbGlzdF9lbmQoKSB3aWxsCisJICogdGVsbCB1cyB3aGVuIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3QgdmlzaWJsZSBmaWVsZC4KKwkgKi8KKwlpZiAoZnAtPmZsYWdzICYgRkxEX0hJRERFTikKKwkJZG1fbGlzdF9hZGRfaCgmcmgtPmZpZWxkX3Byb3BzLCAmZnAtPmxpc3QpOworCWVsc2UKKwkJZG1fbGlzdF9hZGQoJnJoLT5maWVsZF9wcm9wcywgJmZwLT5saXN0KTsKKworCXJldHVybiBmcDsKK30KKworc3RhdGljIGludCBfZ2V0X2Nhbm9uaWNhbF9maWVsZF9uYW1lKGNvbnN0IGNoYXIgKmZpZWxkLAorCQkJCSAgICAgc2l6ZV90IGZsZW4sCisJCQkJICAgICBjaGFyICpjYW5vbmljYWxfZmllbGQsCisJCQkJICAgICBzaXplX3QgZmNhbm9uaWNhbF9sZW4sCisJCQkJICAgICBpbnQgKmRpZmZlcnMpCit7CisJc2l6ZV90IGk7CisJaW50IGRpZmYgPSAwOworCisJZm9yIChpID0gMDsgKmZpZWxkICYmIGZsZW47IGZpZWxkKyssIGZsZW4tLSkgeworCQlpZiAoKmZpZWxkID09ICdfJykgeworCQkJZGlmZiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKGkgKyAxKSA+PSBmY2Fub25pY2FsX2xlbikgeworCQkJY2Fub25pY2FsX2ZpZWxkWzBdID0gJ1wwJzsKKwkJCWxvZ19lcnJvcigiJXM6IGZpZWxkIG5hbWUgdG9vIGxvbmcuIiwgZmllbGQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2Fub25pY2FsX2ZpZWxkW2krK10gPSAqZmllbGQ7CisJfQorCisJY2Fub25pY2FsX2ZpZWxkW2ldID0gJ1wwJzsKKwlpZiAoZGlmZmVycykKKwkJKmRpZmZlcnMgPSBkaWZmOworCXJldHVybiAxOworfQorCisvKgorICogQ29tcGFyZSBjYW5vbmljYWxfbmFtZTEgYWdhaW5zdCBjYW5vbmljYWxfbmFtZTIgb3IgcHJlZml4CisgKiBwbHVzIGNhbm9uaWNhbF9uYW1lMi4gQ2Fub25pY2FsIG5hbWUgaXMgYSBuYW1lIHdoZXJlIGFsbAorICogc3VwZXJmbHVvdXMgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCAodW5kZXJzY29yZXMgZm9yIG5vdykuCisgKiBCb3RoIG5hbWVzIGFyZSBhbHdheXMgbnVsbC10ZXJtaW5hdGVkLgorICovCitzdGF0aWMgaW50IF9pc19zYW1lX2ZpZWxkKGNvbnN0IGNoYXIgKmNhbm9uaWNhbF9uYW1lMSwgY29uc3QgY2hhciAqY2Fub25pY2FsX25hbWUyLAorCQkJICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc2l6ZV90IHByZWZpeF9sZW47CisKKwkvKiBFeGFjdCBtYXRjaD8gKi8KKwlpZiAoIXN0cmNhc2VjbXAoY2Fub25pY2FsX25hbWUxLCBjYW5vbmljYWxfbmFtZTIpKQorCQlyZXR1cm4gMTsKKworCS8qIE1hdGNoIGluY2x1ZGluZyBwcmVmaXg/ICovCisJcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpIC0gMTsKKwlpZiAoIXN0cm5jYXNlY21wKHByZWZpeCwgY2Fub25pY2FsX25hbWUxLCBwcmVmaXhfbGVuKSAmJgorCSAgICAhc3RyY2FzZWNtcChjYW5vbmljYWxfbmFtZTEgKyBwcmVmaXhfbGVuLCBjYW5vbmljYWxfbmFtZTIpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgcmVwb3J0IHR5cGUgcHJlZml4ICsgImFsbCIgbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lkIF9hbGxfbWF0Y2hfY29tYmluZShjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0eXBlcywKKwkJCSAgICAgICB1bnNpZ25lZCB1bnByZWZpeGVkX2FsbF9tYXRjaGVkLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkLCBzaXplX3QgZmxlbiwKKwkJCSAgICAgICB1aW50MzJfdCAqcmVwb3J0X3R5cGVzKQoreworCWNoYXIgZmllbGRfY2Fub25bRE1fUkVQT1JUX0ZJRUxEX1RZUEVfSURfTEVOXTsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0OworCXNpemVfdCBwcmVmaXhfbGVuOworCisJaWYgKCFfZ2V0X2Nhbm9uaWNhbF9maWVsZF9uYW1lKGZpZWxkLCBmbGVuLCBmaWVsZF9jYW5vbiwgc2l6ZW9mKGZpZWxkX2Nhbm9uKSwgTlVMTCkpCisJCXJldHVybjsKKwlmbGVuID0gc3RybGVuKGZpZWxkX2Nhbm9uKTsKKworCWZvciAodCA9IHR5cGVzOyB0LT5kYXRhX2ZuOyB0KyspIHsKKwkJcHJlZml4X2xlbiA9IHN0cmxlbih0LT5wcmVmaXgpIC0gMTsKKworCQlpZiAoIXN0cm5jYXNlY21wKHQtPnByZWZpeCwgZmllbGRfY2Fub24sIHByZWZpeF9sZW4pICYmCisJCSAgICAoKHVucHJlZml4ZWRfYWxsX21hdGNoZWQgJiYgKGZsZW4gPT0gcHJlZml4X2xlbikpIHx8CisJCSAgICAgKCFzdHJuY2FzZWNtcChmaWVsZF9jYW5vbiArIHByZWZpeF9sZW4sICJhbGwiLCAzKSAmJgorCQkgICAgICAoZmxlbiA9PSBwcmVmaXhfbGVuICsgMykpKSkKKwkJCSpyZXBvcnRfdHlwZXMgfD0gdC0+aWQ7CisJfQorfQorCitzdGF0aWMgdWludDMyX3QgX2FsbF9tYXRjaChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqZmllbGQsIHNpemVfdCBmbGVuKQoreworCXVpbnQzMl90IHJlcG9ydF90eXBlcyA9IDA7CisJdW5zaWduZWQgdW5wcmVmaXhlZF9hbGxfbWF0Y2hlZCA9IDA7CisKKwlpZiAoIXN0cm5jYXNlY21wKGZpZWxkLCAiYWxsIiwgMykgJiYgZmxlbiA9PSAzKSB7CisJCS8qIElmIHRoZXJlJ3Mgbm8gcmVwb3J0IHByZWZpeCwgbWF0Y2ggYWxsIHJlcG9ydCB0eXBlcyAqLworCQlpZiAoIShmbGVuID0gc3RybGVuKHJoLT5maWVsZF9wcmVmaXgpKSkKKwkJCXJldHVybiByaC0+cmVwb3J0X3R5cGVzID8gOiBSRVBPUlRfVFlQRVNfQUxMOworCisJCS8qIG90aGVyd2lzZSBpbmNsdWRlIGFsbCBmaWVsZHMgYmVnaW5uaW5nIHdpdGggdGhlIHJlcG9ydCBwcmVmaXguICovCisJCXVucHJlZml4ZWRfYWxsX21hdGNoZWQgPSAxOworCQlmaWVsZCA9IHJoLT5maWVsZF9wcmVmaXg7CisJCXJlcG9ydF90eXBlcyA9IHJoLT5yZXBvcnRfdHlwZXM7CisJfQorCisJLyogQ29tYmluZSBhbGwgcmVwb3J0IHR5cGVzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByZWZpeC4gKi8KKwlfYWxsX21hdGNoX2NvbWJpbmUocmgtPnR5cGVzLCB1bnByZWZpeGVkX2FsbF9tYXRjaGVkLCBmaWVsZCwgZmxlbiwgJnJlcG9ydF90eXBlcyk7CisKKwlyZXR1cm4gcmVwb3J0X3R5cGVzOworfQorCisvKgorICogQWRkIGFsbCBmaWVsZHMgd2l0aCBhIG1hdGNoaW5nIHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9hbGxfZmllbGRzKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCB1aW50MzJfdCB0eXBlKQoreworCXVpbnQzMl90IGY7CisKKwlmb3IgKGYgPSAwOyByaC0+ZmllbGRzW2ZdLnJlcG9ydF9mbjsgZisrKQorCQlpZiAoKHJoLT5maWVsZHNbZl0udHlwZSAmIHR5cGUpICYmICFfYWRkX2ZpZWxkKHJoLCBmLCAwLCAwKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9maWVsZChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqZmllbGQsIHNpemVfdCBmbGVuLAorCQkgICAgICB1aW50MzJfdCAqZl9yZXQsIGludCAqaW1wbGljaXQpCit7CisJY2hhciBmaWVsZF9jYW5vbltETV9SRVBPUlRfRklFTERfVFlQRV9JRF9MRU5dOworCXVpbnQzMl90IGY7CisKKwlpZiAoIWZsZW4pCisJCXJldHVybiAwOworCisJaWYgKCFfZ2V0X2Nhbm9uaWNhbF9maWVsZF9uYW1lKGZpZWxkLCBmbGVuLCBmaWVsZF9jYW5vbiwgc2l6ZW9mKGZpZWxkX2Nhbm9uKSwgTlVMTCkpCisJCXJldHVybl8wOworCisJZm9yIChmID0gMDsgX2ltcGxpY2l0X3JlcG9ydF9maWVsZHNbZl0ucmVwb3J0X2ZuOyBmKyspIHsKKwkJaWYgKF9pc19zYW1lX2ZpZWxkKF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW2ZdLmlkLCBmaWVsZF9jYW5vbiwgcmgtPmZpZWxkX3ByZWZpeCkpIHsKKwkJCSpmX3JldCA9IGY7CisJCQkqaW1wbGljaXQgPSAxOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlmb3IgKGYgPSAwOyByaC0+ZmllbGRzW2ZdLnJlcG9ydF9mbjsgZisrKSB7CisJCWlmIChfaXNfc2FtZV9maWVsZChyaC0+Y2Fub25pY2FsX2ZpZWxkX2lkc1tmXSwgZmllbGRfY2Fub24sIHJoLT5maWVsZF9wcmVmaXgpKSB7CisJCQkqZl9yZXQgPSBmOworCQkJKmltcGxpY2l0ID0gMDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2ZpZWxkX21hdGNoKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBjb25zdCBjaGFyICpmaWVsZCwgc2l6ZV90IGZsZW4sCisJCQl1bnNpZ25lZCByZXBvcnRfdHlwZV9vbmx5KQoreworCXVpbnQzMl90IGYsIHR5cGU7CisJaW50IGltcGxpY2l0OworCisJaWYgKCFmbGVuKQorCQlyZXR1cm4gMDsKKworCWlmICgoX2dldF9maWVsZChyaCwgZmllbGQsIGZsZW4sICZmLCAmaW1wbGljaXQpKSkgeworCQlpZiAocmVwb3J0X3R5cGVfb25seSkgeworCQkJcmgtPnJlcG9ydF90eXBlcyB8PSBpbXBsaWNpdCA/IF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW2ZdLnR5cGUKKwkJCQkJCSAgICAgOiByaC0+ZmllbGRzW2ZdLnR5cGU7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gX2FkZF9maWVsZChyaCwgZiwgaW1wbGljaXQsIDApID8gMSA6IDA7CisJfQorCisJaWYgKCh0eXBlID0gX2FsbF9tYXRjaChyaCwgZmllbGQsIGZsZW4pKSkgeworCQlpZiAocmVwb3J0X3R5cGVfb25seSkgeworCQkJcmgtPnJlcG9ydF90eXBlcyB8PSB0eXBlOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJcmV0dXJuICBfYWRkX2FsbF9maWVsZHMocmgsIHR5cGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9hZGRfc29ydF9rZXkoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHVpbnQzMl90IGZpZWxkX251bSwgaW50IGltcGxpY2l0LAorCQkJIHVpbnQzMl90IGZsYWdzLCB1bnNpZ25lZCByZXBvcnRfdHlwZV9vbmx5KQoreworCXN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpmcCwgKmZvdW5kID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgKmZpZWxkcyA9IGltcGxpY2l0ID8gX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMKKwkJCQkJCQkgICAgIDogcmgtPmZpZWxkczsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmcCwgJnJoLT5maWVsZF9wcm9wcykgeworCQlpZiAoKGZwLT5pbXBsaWNpdCA9PSBpbXBsaWNpdCkgJiYgKGZwLT5maWVsZF9udW0gPT0gZmllbGRfbnVtKSkgeworCQkJZm91bmQgPSBmcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlpZiAocmVwb3J0X3R5cGVfb25seSkKKwkJCXJoLT5yZXBvcnRfdHlwZXMgfD0gZmllbGRzW2ZpZWxkX251bV0udHlwZTsKKwkJZWxzZSBpZiAoIShmb3VuZCA9IF9hZGRfZmllbGQocmgsIGZpZWxkX251bSwgaW1wbGljaXQsIEZMRF9ISURERU4pKSkKKwkJCXJldHVybl8wOworCX0KKworCWlmIChyZXBvcnRfdHlwZV9vbmx5KQorCQlyZXR1cm4gMTsKKworCWlmIChmb3VuZC0+ZmxhZ3MgJiBGTERfU09SVF9LRVkpIHsKKwkJbG9nX3dhcm4oImRtX3JlcG9ydDogSWdub3JpbmcgZHVwbGljYXRlIHNvcnQgZmllbGQ6ICVzLiIsCisJCQkgZmllbGRzW2ZpZWxkX251bV0uaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3VuZC0+ZmxhZ3MgfD0gRkxEX1NPUlRfS0VZOworCWZvdW5kLT5zb3J0X3Bvc24gPSByaC0+a2V5c19jb3VudCsrOworCWZvdW5kLT5mbGFncyB8PSBmbGFnczsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9rZXlfbWF0Y2goc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwKKwkJICAgICAgdW5zaWduZWQgcmVwb3J0X3R5cGVfb25seSkKK3sKKwljaGFyIGtleV9jYW5vbltETV9SRVBPUlRfRklFTERfVFlQRV9JRF9MRU5dOworCXVpbnQzMl90IGY7CisJdWludDMyX3QgZmxhZ3M7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoKmtleSA9PSAnKycpIHsKKwkJa2V5Kys7CisJCWxlbi0tOworCQlmbGFncyA9IEZMRF9BU0NFTkRJTkc7CisJfSBlbHNlIGlmICgqa2V5ID09ICctJykgeworCQlrZXkrKzsKKwkJbGVuLS07CisJCWZsYWdzID0gRkxEX0RFU0NFTkRJTkc7CisJfSBlbHNlCisJCWZsYWdzID0gRkxEX0FTQ0VORElORzsKKworCWlmICghbGVuKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBNaXNzaW5nIHNvcnQgZmllbGQgbmFtZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9nZXRfY2Fub25pY2FsX2ZpZWxkX25hbWUoa2V5LCBsZW4sIGtleV9jYW5vbiwgc2l6ZW9mKGtleV9jYW5vbiksIE5VTEwpKQorCQlyZXR1cm5fMDsKKworCWZvciAoZiA9IDA7IF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW2ZdLnJlcG9ydF9mbjsgZisrKQorCQlpZiAoX2lzX3NhbWVfZmllbGQoX2ltcGxpY2l0X3JlcG9ydF9maWVsZHNbZl0uaWQsIGtleV9jYW5vbiwgcmgtPmZpZWxkX3ByZWZpeCkpCisJCQlyZXR1cm4gX2FkZF9zb3J0X2tleShyaCwgZiwgMSwgZmxhZ3MsIHJlcG9ydF90eXBlX29ubHkpOworCisJZm9yIChmID0gMDsgcmgtPmZpZWxkc1tmXS5yZXBvcnRfZm47IGYrKykKKwkJaWYgKF9pc19zYW1lX2ZpZWxkKHJoLT5jYW5vbmljYWxfZmllbGRfaWRzW2ZdLCBrZXlfY2Fub24sIHJoLT5maWVsZF9wcmVmaXgpKQorCQkJcmV0dXJuIF9hZGRfc29ydF9rZXkocmgsIGYsIDAsIGZsYWdzLCByZXBvcnRfdHlwZV9vbmx5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9wYXJzZV9maWVsZHMoc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKmZvcm1hdCwKKwkJCSB1bnNpZ25lZCByZXBvcnRfdHlwZV9vbmx5KQoreworCWNvbnN0IGNoYXIgKndzOwkJLyogV29yZCBzdGFydCAqLworCWNvbnN0IGNoYXIgKndlID0gZm9ybWF0OwkvKiBXb3JkIGVuZCAqLworCisJd2hpbGUgKCp3ZSkgeworCQkvKiBBbGxvdyBjb25zZWN1dGl2ZSBjb21tYXMgKi8KKwkJd2hpbGUgKCp3ZSAmJiAqd2UgPT0gJywnKQorCQkJd2UrKzsKKworCQkvKiBzdGFydCBvZiB0aGUgZmllbGQgbmFtZSAqLworCQl3cyA9IHdlOworCQl3aGlsZSAoKndlICYmICp3ZSAhPSAnLCcpCisJCQl3ZSsrOworCisJCWlmICghX2ZpZWxkX21hdGNoKHJoLCB3cywgKHNpemVfdCkgKHdlIC0gd3MpLCByZXBvcnRfdHlwZV9vbmx5KSkgeworCQkJX2Rpc3BsYXlfZmllbGRzKHJoLCAxLCAwKTsKKwkJCWxvZ193YXJuKCIgIik7CisJCQlsb2dfZXJyb3IoIlVucmVjb2duaXNlZCBmaWVsZDogJS4qcyIsIChpbnQpICh3ZSAtIHdzKSwgd3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcGFyc2Vfa2V5cyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqa2V5cywKKwkJICAgICAgIHVuc2lnbmVkIHJlcG9ydF90eXBlX29ubHkpCit7CisJY29uc3QgY2hhciAqd3M7CQkvKiBXb3JkIHN0YXJ0ICovCisJY29uc3QgY2hhciAqd2UgPSBrZXlzOwkvKiBXb3JkIGVuZCAqLworCisJaWYgKCFrZXlzKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgqd2UpIHsKKwkJLyogQWxsb3cgY29uc2VjdXRpdmUgY29tbWFzICovCisJCXdoaWxlICgqd2UgJiYgKndlID09ICcsJykKKwkJCXdlKys7CisJCXdzID0gd2U7CisJCXdoaWxlICgqd2UgJiYgKndlICE9ICcsJykKKwkJCXdlKys7CisJCWlmICghX2tleV9tYXRjaChyaCwgd3MsIChzaXplX3QpICh3ZSAtIHdzKSwgcmVwb3J0X3R5cGVfb25seSkpIHsKKwkJCV9kaXNwbGF5X2ZpZWxkcyhyaCwgMSwgMCk7CisJCQlsb2dfd2FybigiICIpOworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IFVucmVjb2duaXNlZCBmaWVsZDogJS4qcyIsIChpbnQpICh3ZSAtIHdzKSwgd3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY29udGFpbnNfcmVzZXJ2ZWRfcmVwb3J0X3R5cGUoY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSAqdHlwZXMpCit7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9vYmplY3RfdHlwZSAqdHlwZSwgKmltcGxpY2l0X3R5cGU7CisKKwlmb3IgKGltcGxpY2l0X3R5cGUgPSBfaW1wbGljaXRfcmVwb3J0X3R5cGVzOyBpbXBsaWNpdF90eXBlLT5kYXRhX2ZuOyBpbXBsaWNpdF90eXBlKyspIHsKKwkJZm9yICh0eXBlID0gdHlwZXM7IHR5cGUtPmRhdGFfZm47IHR5cGUrKykgeworCQkJaWYgKGltcGxpY2l0X3R5cGUtPmlkICYgdHlwZS0+aWQpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImRtX3JlcG9ydF9pbml0OiBkZWZpbml0aW9uIG9mIHJlcG9ydCAiCisJCQkJCSAgInR5cGVzIGdpdmVuIGNvbnRhaW5zIHJlc2VydmVkIGlkZW50aWZpZXIiKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfZG1fcmVwb3J0X2luaXRfdXBkYXRlX3R5cGVzKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCB1aW50MzJfdCAqcmVwb3J0X3R5cGVzKQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKnR5cGU7CisKKwlpZiAoIXJlcG9ydF90eXBlcykKKwkJcmV0dXJuOworCisJKnJlcG9ydF90eXBlcyA9IHJoLT5yZXBvcnRfdHlwZXM7CisJLyoKKwkgKiBEbyBub3QgaW5jbHVkZSBpbXBsaWNpdCB0eXBlcyBhcyB0aGVzZSBhcmUgbm90IHVuZGVyc3Rvb2QgYnkKKwkgKiBkbV9yZXBvcnRfaW5pdCBjYWxsZXIgLSB0aGUgY2FsbGVyIGRvZXNuJ3Qga25vdyBob3cgdG8gY2hlY2sKKwkgKiB0aGVzZSB0eXBlcyBhbnl3YXkuCisJICovCisJZm9yICh0eXBlID0gX2ltcGxpY2l0X3JlcG9ydF90eXBlczsgdHlwZS0+ZGF0YV9mbjsgdHlwZSsrKQorCQkqcmVwb3J0X3R5cGVzICY9IH50eXBlLT5pZDsKK30KKworc3RhdGljIGludCBfaGVscF9yZXF1ZXN0ZWQoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJc3RydWN0IGZpZWxkX3Byb3BlcnRpZXMgKmZwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGZwLCAmcmgtPmZpZWxkX3Byb3BzKSB7CisJCWlmIChmcC0+aW1wbGljaXQgJiYKKwkJICAgICghc3RyY21wKF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW2ZwLT5maWVsZF9udW1dLmlkLCBTUEVDSUFMX0ZJRUxEX0hFTFBfSUQpIHx8CisJCSAgICAgIXN0cmNtcChfaW1wbGljaXRfcmVwb3J0X2ZpZWxkc1tmcC0+ZmllbGRfbnVtXS5pZCwgU1BFQ0lBTF9GSUVMRF9IRUxQX0FMVF9JRCkpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2Nhbm9uaWNhbGl6ZV9maWVsZF9pZHMoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJc2l6ZV90IHJlZ2lzdGVyZWRfZmllbGRfY291bnQgPSAwLCBpOworCWNoYXIgY2Fub25pY2FsX2ZpZWxkW0RNX1JFUE9SVF9GSUVMRF9UWVBFX0lEX0xFTl07CisJY2hhciAqY2Fub25pY2FsX2ZpZWxkX2R1cDsKKwlpbnQgZGlmZmVyczsKKworCXdoaWxlICgqcmgtPmZpZWxkc1tyZWdpc3RlcmVkX2ZpZWxkX2NvdW50XS5pZCkKKwkJcmVnaXN0ZXJlZF9maWVsZF9jb3VudCsrOworCisJaWYgKCEocmgtPmNhbm9uaWNhbF9maWVsZF9pZHMgPSBkbV9wb29sX2FsbG9jKHJoLT5tZW0sIHJlZ2lzdGVyZWRfZmllbGRfY291bnQgKiBzaXplb2YoY29uc3QgY2hhciAqKSkpKSB7CisJCWxvZ19lcnJvcigiX2Nhbm9uaWNhbGl6ZV9maWVsZF9pZHM6IGRtX3Bvb2xfYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZWdpc3RlcmVkX2ZpZWxkX2NvdW50OyBpKyspIHsKKwkJaWYgKCFfZ2V0X2Nhbm9uaWNhbF9maWVsZF9uYW1lKHJoLT5maWVsZHNbaV0uaWQsIHN0cmxlbihyaC0+ZmllbGRzW2ldLmlkKSwKKwkJCQkJICAgICAgIGNhbm9uaWNhbF9maWVsZCwgc2l6ZW9mKGNhbm9uaWNhbF9maWVsZCksICZkaWZmZXJzKSkKKwkJCXJldHVybl8wOworCisJCWlmIChkaWZmZXJzKSB7CisJCQljYW5vbmljYWxfZmllbGRfZHVwID0gZG1fcG9vbF9zdHJkdXAocmgtPm1lbSwgY2Fub25pY2FsX2ZpZWxkKTsKKwkJCXJoLT5jYW5vbmljYWxfZmllbGRfaWRzW2ldID0gY2Fub25pY2FsX2ZpZWxkX2R1cDsKKwkJfSBlbHNlCisJCQlyaC0+Y2Fub25pY2FsX2ZpZWxkX2lkc1tpXSA9IHJoLT5maWVsZHNbaV0uaWQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbV9yZXBvcnQgKmRtX3JlcG9ydF9pbml0KHVpbnQzMl90ICpyZXBvcnRfdHlwZXMsCisJCQkJIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfb2JqZWN0X3R5cGUgKnR5cGVzLAorCQkJCSBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgKmZpZWxkcywKKwkJCQkgY29uc3QgY2hhciAqb3V0cHV0X2ZpZWxkcywKKwkJCQkgY29uc3QgY2hhciAqb3V0cHV0X3NlcGFyYXRvciwKKwkJCQkgdWludDMyX3Qgb3V0cHV0X2ZsYWdzLAorCQkJCSBjb25zdCBjaGFyICpzb3J0X2tleXMsCisJCQkJIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgZG1fcmVwb3J0ICpyaDsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0eXBlOworCisJaWYgKF9jb250YWluc19yZXNlcnZlZF9yZXBvcnRfdHlwZSh0eXBlcykpCisJCXJldHVybl9OVUxMOworCisJaWYgKCEocmggPSBkbV96YWxsb2Moc2l6ZW9mKCpyaCkpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9pbml0OiBkbV9tYWxsb2MgZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogcmgtPnJlcG9ydF90eXBlcyBpcyB1cGRhdGVkIGluIF9wYXJzZV9maWVsZHMoKSBhbmQgX3BhcnNlX2tleXMoKQorCSAqIHRvIGNvbnRhaW4gYWxsIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkcyBzcGVjaWZpZWQgYnkKKwkgKiBmaWVsZHMgb3Iga2V5cy4KKwkgKi8KKwlpZiAocmVwb3J0X3R5cGVzKQorCQlyaC0+cmVwb3J0X3R5cGVzID0gKnJlcG9ydF90eXBlczsKKworCXJoLT5zZXBhcmF0b3IgPSBvdXRwdXRfc2VwYXJhdG9yOworCXJoLT5maWVsZHMgPSBmaWVsZHM7CisJcmgtPnR5cGVzID0gdHlwZXM7CisJcmgtPnByaXZhdGUgPSBwcml2YXRlX2RhdGE7CisKKwlyaC0+ZmxhZ3MgfD0gb3V0cHV0X2ZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9NQVNLOworCisJLyogV2l0aCBjb2x1bW5zX2FzX3Jvd3Mgd2UgbXVzdCBidWZmZXIgYW5kIG5vdCBhbGlnbi4gKi8KKwlpZiAob3V0cHV0X2ZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9DT0xVTU5TX0FTX1JPV1MpIHsKKwkJaWYgKCEob3V0cHV0X2ZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9CVUZGRVJFRCkpCisJCQlyaC0+ZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9CVUZGRVJFRDsKKwkJaWYgKG91dHB1dF9mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfQUxJR05FRCkKKwkJCXJoLT5mbGFncyAmPSB+RE1fUkVQT1JUX09VVFBVVF9BTElHTkVEOworCX0KKworCWlmIChvdXRwdXRfZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0JVRkZFUkVEKQorCQlyaC0+ZmxhZ3MgfD0gUkhfU09SVF9SRVFVSVJFRDsKKworCXJoLT5mbGFncyB8PSBSSF9GSUVMRF9DQUxDX05FRURFRDsKKworCWRtX2xpc3RfaW5pdCgmcmgtPmZpZWxkX3Byb3BzKTsKKwlkbV9saXN0X2luaXQoJnJoLT5yb3dzKTsKKworCWlmICgodHlwZSA9IF9maW5kX3R5cGUocmgsIHJoLT5yZXBvcnRfdHlwZXMpKSAmJiB0eXBlLT5wcmVmaXgpCisJCXJoLT5maWVsZF9wcmVmaXggPSB0eXBlLT5wcmVmaXg7CisJZWxzZQorCQlyaC0+ZmllbGRfcHJlZml4ID0gIiI7CisKKwlpZiAoIShyaC0+bWVtID0gZG1fcG9vbF9jcmVhdGUoInJlcG9ydCIsIDEwICogMTAyNCkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X2luaXQ6IGFsbG9jYXRpb24gb2YgbWVtb3J5IHBvb2wgZmFpbGVkIik7CisJCWRtX2ZyZWUocmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIV9jYW5vbmljYWxpemVfZmllbGRfaWRzKHJoKSkgeworCQlkbV9yZXBvcnRfZnJlZShyaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogVG8ga2VlcCB0aGUgY29kZSBuZWVkZWQgdG8gYWRkIHRoZSAiYWxsIiBmaWVsZCB0byBhIG1pbmltdW0sIHdlIHBhcnNlCisJICogdGhlIGZpZWxkIGxpc3RzIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUgd2Ugb25seSB1cGRhdGUgdGhlIHJlcG9ydCB0eXBlLgorCSAqIEZJWE1FIFVzZSBvbmUgcGFzcyBpbnN0ZWFkIGFuZCBleHBhbmQgdGhlICJhbGwiIGZpZWxkIGFmdGVyd2FyZHMuCisJICovCisJaWYgKCFfcGFyc2VfZmllbGRzKHJoLCBvdXRwdXRfZmllbGRzLCAxKSB8fAorCSAgICAhX3BhcnNlX2tleXMocmgsIHNvcnRfa2V5cywgMSkpIHsKKwkJZG1fcmVwb3J0X2ZyZWUocmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZW5lcmF0ZSBsaXN0IG9mIGZpZWxkcyBmb3Igb3V0cHV0IGJhc2VkIG9uIGZvcm1hdCBzdHJpbmcgJiBmbGFncyAqLworCWlmICghX3BhcnNlX2ZpZWxkcyhyaCwgb3V0cHV0X2ZpZWxkcywgMCkgfHwKKwkgICAgIV9wYXJzZV9rZXlzKHJoLCBzb3J0X2tleXMsIDApKSB7CisJCWRtX3JlcG9ydF9mcmVlKHJoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gdXBkYXRlZCB0eXBlcyB2YWx1ZSBmb3IgZnVydGhlciBjb21wYXRpbGl0eSBjaGVjayBieSBjYWxsZXIuCisJICovCisJX2RtX3JlcG9ydF9pbml0X3VwZGF0ZV90eXBlcyhyaCwgcmVwb3J0X3R5cGVzKTsKKworCWlmIChfaGVscF9yZXF1ZXN0ZWQocmgpKSB7CisJCV9kaXNwbGF5X2ZpZWxkcyhyaCwgMSwgMCk7CisJCWxvZ193YXJuKCIgIik7CisJCXJoLT5mbGFncyB8PSBSSF9BTFJFQURZX1JFUE9SVEVEOworCX0KKworCXJldHVybiByaDsKK30KKwordm9pZCBkbV9yZXBvcnRfZnJlZShzdHJ1Y3QgZG1fcmVwb3J0ICpyaCkKK3sKKwlpZiAocmgtPnNlbGVjdGlvbikKKwkJZG1fcG9vbF9kZXN0cm95KHJoLT5zZWxlY3Rpb24tPm1lbSk7CisJaWYgKHJoLT52YWx1ZV9jYWNoZSkKKwkJZG1faGFzaF9kZXN0cm95KHJoLT52YWx1ZV9jYWNoZSk7CisJZG1fcG9vbF9kZXN0cm95KHJoLT5tZW0pOworCWRtX2ZyZWUocmgpOworfQorCitzdGF0aWMgY2hhciAqX3RvdXBwZXJzdHIoY2hhciAqc3RyKQoreworCWNoYXIgKnUgPSBzdHI7CisKKwlkbworCQkqdSA9IHRvdXBwZXIoKnUpOworCXdoaWxlICgqdSsrKTsKKworCXJldHVybiBzdHI7Cit9CisKK2ludCBkbV9yZXBvcnRfc2V0X291dHB1dF9maWVsZF9uYW1lX3ByZWZpeChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqb3V0cHV0X2ZpZWxkX25hbWVfcHJlZml4KQoreworCWNoYXIgKnByZWZpeDsKKworCWlmICghKHByZWZpeCA9IGRtX3Bvb2xfc3RyZHVwKHJoLT5tZW0sIG91dHB1dF9maWVsZF9uYW1lX3ByZWZpeCkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0X3NldF9vdXRwdXRfZmllbGRfbmFtZV9wcmVmaXg6IGRtX3Bvb2xfc3RyZHVwIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyaC0+b3V0cHV0X2ZpZWxkX25hbWVfcHJlZml4ID0gX3RvdXBwZXJzdHIocHJlZml4KTsKKwkKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENyZWF0ZSBhIHJvdyBvZiBkYXRhIGZvciBhbiBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgKl9yZXBvcnRfZ2V0X2ZpZWxkX2RhdGEoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgIHN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpmcCwgdm9pZCAqb2JqZWN0KQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzID0gZnAtPmltcGxpY2l0ID8gX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMKKwkJCQkJCQkJIDogcmgtPmZpZWxkczsKKworCWNoYXIgKnJldCA9IGZwLT50eXBlLT5kYXRhX2ZuKG9iamVjdCk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gKHZvaWQgKikocmV0ICsgZmllbGRzW2ZwLT5maWVsZF9udW1dLm9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkICpfcmVwb3J0X2dldF9pbXBsaWNpdF9maWVsZF9kYXRhKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgICAgIHN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpmcCwgc3RydWN0IHJvdyAqcm93KQoreworCWlmICghc3RyY21wKF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW2ZwLT5maWVsZF9udW1dLmlkLCBTUEVDSUFMX0ZJRUxEX1NFTEVDVEVEX0lEKSkKKwkJcmV0dXJuIHJvdzsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9kYmxfZXF1YWwoZG91YmxlIGQxLCBkb3VibGUgZDIpCit7CisJcmV0dXJuIGZhYnMoZDEgLSBkMikgPCBEQkxfRVBTSUxPTjsKK30KKworc3RhdGljIGludCBfZGJsX2dyZWF0ZXIoZG91YmxlIGQxLCBkb3VibGUgZDIpCit7CisJcmV0dXJuIChkMSA+IGQyKSAmJiAhX2RibF9lcXVhbChkMSwgZDIpOworfQorCitzdGF0aWMgaW50IF9kYmxfbGVzcyhkb3VibGUgZDEsIGRvdWJsZSBkMikKK3sKKwlyZXR1cm4gKGQxIDwgZDIpICYmICFfZGJsX2VxdWFsKGQxLCBkMik7Cit9CisKK3N0YXRpYyBpbnQgX2RibF9ncmVhdGVyX29yX2VxdWFsKGRvdWJsZSBkMSwgZG91YmxlIGQyKQoreworCXJldHVybiBfZGJsX2dyZWF0ZXIoZDEsIGQyKSB8fCBfZGJsX2VxdWFsKGQxLCBkMik7Cit9CisKK3N0YXRpYyBpbnQgX2RibF9sZXNzX29yX2VxdWFsKGRvdWJsZSBkMSwgZG91YmxlIGQyKQoreworCXJldHVybiBfZGJsX2xlc3MoZDEsIGQyKSB8fCBfZGJsX2VxdWFsKGQxLCBkMik7Cit9CisKKyNkZWZpbmUgX3VpbnQ2NCAqKGNvbnN0IHVpbnQ2NF90ICopCisjZGVmaW5lIF91aW50NjRhcnIodmFyLGluZGV4KSAoKGNvbnN0IHVpbnQ2NF90ICopdmFyKVtpbmRleF0KKyNkZWZpbmUgX3N0ciAoY29uc3QgY2hhciAqKQorI2RlZmluZSBfZGJsICooY29uc3QgZG91YmxlICopCisjZGVmaW5lIF9kYmxhcnIodmFyLGluZGV4KSAoKGNvbnN0IGRvdWJsZSAqKXZhcilbaW5kZXhdCisKK3N0YXRpYyBpbnQgX2RvX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHVuc2lnbmVkIHR5cGUsIGNvbnN0IHZvaWQgKnJlc192YWwsIGludCByZXNfcmFuZ2UsCisJCQkJCQljb25zdCB2b2lkICp2YWwsIHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzKQoreworCWludCBzZWxfcmFuZ2UgPSBmcyA/IGZzLT52YWx1ZS0+bmV4dCAhPSBOVUxMIDogMDsKKworCXN3aXRjaCAodHlwZSAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spIHsKKwkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVI6CisJCQlpZiAocmVzX3JhbmdlICYmIHNlbF9yYW5nZSkgeworCQkJCS8qIGJvdGggcmVzZXJ2ZWQgdmFsdWUgYW5kIHNlbGVjdGlvbiB2YWx1ZSBhcmUgcmFuZ2VzICovCisJCQkJaWYgKCgoX3VpbnQ2NCB2YWwgPj0gX3VpbnQ2NGFycihyZXNfdmFsLDApKSAmJiAoX3VpbnQ2NCB2YWwgPD0gX3VpbnQ2NGFycihyZXNfdmFsLDEpKSkgfHwKKwkJCQkgICAgKGZzICYmICgoZnMtPnZhbHVlLT52LmkgPT0gX3VpbnQ2NGFycihyZXNfdmFsLDApKSAmJiAoZnMtPnZhbHVlLT5uZXh0LT52LmkgPT0gX3VpbnQ2NGFycihyZXNfdmFsLDEpKSkpKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAocmVzX3JhbmdlKSB7CisJCQkJLyogb25seSByZXNlcnZlZCB2YWx1ZSBpcyBhIHJhbmdlICovCisJCQkJaWYgKCgoX3VpbnQ2NCB2YWwgPj0gX3VpbnQ2NGFycihyZXNfdmFsLDApKSAmJiAoX3VpbnQ2NCB2YWwgPD0gX3VpbnQ2NGFycihyZXNfdmFsLDEpKSkgfHwKKwkJCQkgICAgKGZzICYmICgoZnMtPnZhbHVlLT52LmkgPj0gX3VpbnQ2NGFycihyZXNfdmFsLDApKSAmJiAoZnMtPnZhbHVlLT52LmkgPD0gX3VpbnQ2NGFycihyZXNfdmFsLDEpKSkpKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoc2VsX3JhbmdlKSB7CisJCQkJLyogb25seSBzZWxlY3Rpb24gdmFsdWUgaXMgYSByYW5nZSAqLworCQkJCWlmICgoKF91aW50NjQgdmFsID49IF91aW50NjQgcmVzX3ZhbCkgJiYgKF91aW50NjQgdmFsIDw9IF91aW50NjQgcmVzX3ZhbCkpIHx8CisJCQkJICAgIChmcyAmJiAoKGZzLT52YWx1ZS0+di5pID49IF91aW50NjQgcmVzX3ZhbCkgJiYgKGZzLT52YWx1ZS0+bmV4dC0+di5pIDw9IF91aW50NjQgcmVzX3ZhbCkpKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgeworCQkJCS8qIG5laXRoZXIgc2VsZWN0aW9uIHZhbHVlIG5vciByZXNlcnZlZCB2YWx1ZSBpcyBhIHJhbmdlICovCisJCQkJaWYgKChfdWludDY0IHZhbCA9PSBfdWludDY0IHJlc192YWwpIHx8CisJCQkJICAgIChmcyAmJiAoZnMtPnZhbHVlLT52LmkgPT0gX3VpbnQ2NCByZXNfdmFsKSkpCisJCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkc6CisJCQkvKiB0aGVyZSBhcmUgbm8gcmFuZ2VzIGZvciBzdHJpbmcgdHlwZSB5ZXQgKi8KKwkJCWlmICgoIXN0cmNtcChfc3RyIHZhbCwgX3N0ciByZXNfdmFsKSkgfHwKKwkJCSAgICAoZnMgJiYgKCFzdHJjbXAoZnMtPnZhbHVlLT52LnMsIF9zdHIgcmVzX3ZhbCkpKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRToKKwkJCWlmIChyZXNfcmFuZ2UgJiYgc2VsX3JhbmdlKSB7CisJCQkJLyogYm90aCByZXNlcnZlZCB2YWx1ZSBhbmQgc2VsZWN0aW9uIHZhbHVlIGFyZSByYW5nZXMgKi8KKwkJCQlpZiAoKF9kYmxfZ3JlYXRlcl9vcl9lcXVhbChfZGJsIHZhbCwgX2RibGFycihyZXNfdmFsLDApKSAmJiBfZGJsX2xlc3Nfb3JfZXF1YWwoX2RibCB2YWwsIF9kYmxhcnIocmVzX3ZhbCwxKSkpIHx8CisJCQkJICAgIChmcyAmJiAoX2RibF9lcXVhbChmcy0+dmFsdWUtPnYuZCwgX2RibGFycihyZXNfdmFsLDApKSAmJiAoX2RibF9lcXVhbChmcy0+dmFsdWUtPm5leHQtPnYuZCwgX2RibGFycihyZXNfdmFsLDEpKSkpKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKHJlc19yYW5nZSkgeworCQkJCS8qIG9ubHkgcmVzZXJ2ZWQgdmFsdWUgaXMgYSByYW5nZSAqLworCQkJCWlmICgoX2RibF9ncmVhdGVyX29yX2VxdWFsKF9kYmwgdmFsLCBfZGJsYXJyKHJlc192YWwsMCkpICYmIF9kYmxfbGVzc19vcl9lcXVhbChfZGJsIHZhbCwgX2RibGFycihyZXNfdmFsLDEpKSkgfHwKKwkJCQkgICAgKGZzICYmIChfZGJsX2dyZWF0ZXJfb3JfZXF1YWwoZnMtPnZhbHVlLT52LmQsIF9kYmxhcnIocmVzX3ZhbCwwKSkgJiYgX2RibF9sZXNzX29yX2VxdWFsKGZzLT52YWx1ZS0+di5kLCBfZGJsYXJyKHJlc192YWwsMSkpKSkpCisJCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmIChzZWxfcmFuZ2UpIHsKKwkJCQkvKiBvbmx5IHNlbGVjdGlvbiB2YWx1ZSBpcyBhIHJhbmdlICovCisJCQkJaWYgKChfZGJsX2dyZWF0ZXJfb3JfZXF1YWwoX2RibCB2YWwsIF9kYmwgcmVzX3ZhbCkgJiYgKF9kYmxfbGVzc19vcl9lcXVhbChfZGJsIHZhbCwgX2RibCByZXNfdmFsKSkpIHx8CisJCQkJICAgIChmcyAmJiAoX2RibF9ncmVhdGVyX29yX2VxdWFsKGZzLT52YWx1ZS0+di5kLCBfZGJsIHJlc192YWwpICYmIF9kYmxfbGVzc19vcl9lcXVhbChmcy0+dmFsdWUtPm5leHQtPnYuZCwgX2RibCByZXNfdmFsKSkpKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbmVpdGhlciBzZWxlY3Rpb24gdmFsdWUgbm9yIHJlc2VydmVkIHZhbHVlIGlzIGEgcmFuZ2UgKi8KKwkJCQlpZiAoKF9kYmxfZXF1YWwoX2RibCB2YWwsIF9kYmwgcmVzX3ZhbCkpIHx8CisJCQkJICAgIChmcyAmJiAoX2RibF9lcXVhbChmcy0+dmFsdWUtPnYuZCwgX2RibCByZXNfdmFsKSkpKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1Q6CisJCQkvKiBGSVhNRSBBZGQgY29tcGFyaXNvbiBmb3Igc3RyaW5nIGxpc3QgKi8KKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1RJTUU6CisJCQkvKiBGSVhNRSBBZGQgY29tcGFyaXNvbiBmb3IgdGltZSAqLworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSB2YWx1ZSBvZiBjZXJ0YWluIHR5cGUgdXNlZCBpbiBzZWxlY3Rpb24gaXMgcmVzZXJ2ZWQuCisgKi8KK3N0YXRpYyBpbnQgX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCB1aW50MzJfdCBmaWVsZF9udW0sIHVuc2lnbmVkIHR5cGUsCisJCQkJCSAgICAgY29uc3Qgdm9pZCAqdmFsLCBzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uICpmcykKK3sKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X3Jlc2VydmVkX3ZhbHVlICppdGVyID0gcmgtPnJlc2VydmVkX3ZhbHVlczsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3Jlc2VydmVkX3ZhbHVlICpmcnY7CisJaW50IHJlc19yYW5nZTsKKworCWlmICghaXRlcikKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoaXRlci0+dmFsdWUpIHsKKwkJLyogT25seSBjaGVjayBzdHJpY3QgcmVzZXJ2ZWQgdmFsdWVzLCBub3QgdGhlIHdlYWtlciBmb3JtICgibmFtZWQiIHJlc2VydmVkIHZhbHVlKS4gKi8KKwkJaWYgKCEoaXRlci0+dHlwZSAmIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9OQU1FRCkpIHsKKwkJCXJlc19yYW5nZSA9IGl0ZXItPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0U7CisJCQlpZiAoKGl0ZXItPnR5cGUgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLKSA9PSBETV9SRVBPUlRfRklFTERfVFlQRV9OT05FKSB7CisJCQkJZnJ2ID0gKGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfcmVzZXJ2ZWRfdmFsdWUgKikgaXRlci0+dmFsdWU7CisJCQkJaWYgKGZydi0+ZmllbGRfbnVtID09IGZpZWxkX251bSAmJiBfZG9fY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQodHlwZSwgZnJ2LT52YWx1ZSwgcmVzX3JhbmdlLCB2YWwsIGZzKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKGl0ZXItPnR5cGUgJiB0eXBlICYmIF9kb19jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZCh0eXBlLCBpdGVyLT52YWx1ZSwgcmVzX3JhbmdlLCB2YWwsIGZzKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlpdGVyKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NtcF9maWVsZF9pbnQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHVpbnQzMl90IGZpZWxkX251bSwgY29uc3QgY2hhciAqZmllbGRfaWQsCisJCQkgIHVpbnQ2NF90IHZhbCwgc3RydWN0IGZpZWxkX3NlbGVjdGlvbiAqZnMpCit7CisJaW50IHJhbmdlID0gZnMtPnZhbHVlLT5uZXh0ICE9IE5VTEw7CisJY29uc3QgdWludDY0X3Qgc2VsMSA9IGZzLT52YWx1ZS0+di5pOworCWNvbnN0IHVpbnQ2NF90IHNlbDIgPSByYW5nZSA/IGZzLT52YWx1ZS0+bmV4dC0+di5pIDogMDsKKworCXN3aXRjaChmcy0+ZmxhZ3MgJiBGTERfQ01QX01BU0spIHsKKwkJY2FzZSBGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuIHJhbmdlID8gKCh2YWwgPj0gc2VsMSkgJiYgKHZhbCA8PSBzZWwyKSkgOiB2YWwgPT0gc2VsMTsKKworCQljYXNlIEZMRF9DTVBfTk9UfEZMRF9DTVBfRVFVQUw6CisJCQlyZXR1cm4gcmFuZ2UgPyAhKCh2YWwgPj0gc2VsMSkgJiYgKHZhbCA8PSBzZWwyKSkgOiB2YWwgIT0gc2VsMTsKKworCQljYXNlIEZMRF9DTVBfTlVNQkVSfEZMRF9DTVBfR1Q6CisJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUiwgJnZhbCwgZnMpKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHJhbmdlID8gdmFsID4gc2VsMiA6IHZhbCA+IHNlbDE7CisKKwkJY2FzZSBGTERfQ01QX05VTUJFUnxGTERfQ01QX0dUfEZMRF9DTVBfRVFVQUw6CisJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUiwgJnZhbCwgZnMpKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHZhbCA+PSBzZWwxOworCisJCWNhc2UgRkxEX0NNUF9OVU1CRVJ8RkxEX0NNUF9MVDoKKwkJCWlmIChfY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQocmgsIGZpZWxkX251bSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gdmFsIDwgc2VsMTsKKworCQljYXNlIEZMRF9DTVBfTlVNQkVSfEZMRF9DTVBfTFR8RkxEX0NNUF9FUVVBTDoKKwkJCWlmIChfY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQocmgsIGZpZWxkX251bSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gcmFuZ2UgPyB2YWwgPD0gc2VsMiA6IHZhbCA8PSBzZWwxOworCisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jbXBfZmllbGRfaW50OiB1bnN1cHBvcnRlZCBudW1iZXIgIgorCQkJCSAgImNvbXBhcmlzb24gdHlwZSBmb3IgZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NtcF9maWVsZF9kb3VibGUoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHVpbnQzMl90IGZpZWxkX251bSwgY29uc3QgY2hhciAqZmllbGRfaWQsCisJCQkgICAgIGRvdWJsZSB2YWwsIHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzKQoreworCWludCByYW5nZSA9IGZzLT52YWx1ZS0+bmV4dCAhPSBOVUxMOworCWRvdWJsZSBzZWwxID0gZnMtPnZhbHVlLT52LmQ7CisJZG91YmxlIHNlbDIgPSByYW5nZSA/IGZzLT52YWx1ZS0+bmV4dC0+di5kIDogMDsKKworCXN3aXRjaChmcy0+ZmxhZ3MgJiBGTERfQ01QX01BU0spIHsKKwkJY2FzZSBGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuIHJhbmdlID8gKF9kYmxfZ3JlYXRlcl9vcl9lcXVhbCh2YWwsIHNlbDEpICYmIF9kYmxfbGVzc19vcl9lcXVhbCh2YWwsIHNlbDIpKQorCQkJCSAgICAgOiBfZGJsX2VxdWFsKHZhbCwgc2VsMSk7CisKKwkJY2FzZSBGTERfQ01QX05PVHxGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuIHJhbmdlID8gIShfZGJsX2dyZWF0ZXJfb3JfZXF1YWwodmFsLCBzZWwxKSAmJiBfZGJsX2xlc3Nfb3JfZXF1YWwodmFsLCBzZWwyKSkKKwkJCQkgICAgIDogIV9kYmxfZXF1YWwodmFsLCBzZWwxKTsKKworCQljYXNlIEZMRF9DTVBfTlVNQkVSfEZMRF9DTVBfR1Q6CisJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUsICZ2YWwsIGZzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiByYW5nZSA/IF9kYmxfZ3JlYXRlcih2YWwsIHNlbDIpCisJCQkJICAgICA6IF9kYmxfZ3JlYXRlcih2YWwsIHNlbDEpOworCisJCWNhc2UgRkxEX0NNUF9OVU1CRVJ8RkxEX0NNUF9HVHxGTERfQ01QX0VRVUFMOgorCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9TSVpFLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gX2RibF9ncmVhdGVyX29yX2VxdWFsKHZhbCwgc2VsMSk7CisKKwkJY2FzZSBGTERfQ01QX05VTUJFUnxGTERfQ01QX0xUOgorCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9TSVpFLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gX2RibF9sZXNzKHZhbCwgc2VsMSk7CisKKwkJY2FzZSBGTERfQ01QX05VTUJFUnxGTERfQ01QX0xUfEZMRF9DTVBfRVFVQUw6CisJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUsICZ2YWwsIGZzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiByYW5nZSA/IF9kYmxfbGVzc19vcl9lcXVhbCh2YWwsIHNlbDIpIDogX2RibF9sZXNzX29yX2VxdWFsKHZhbCwgc2VsMSk7IAorCisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jbXBfZmllbGRfZG91YmxlOiB1bnN1cHBvcnRlZCBudW1iZXIgIgorCQkJCSAgImNvbXBhcmlzb24gdHlwZSBmb3Igc2VsZWN0aW9uIGZpZWxkICVzIiwgZmllbGRfaWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jbXBfZmllbGRfc3RyaW5nKHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICB1aW50MzJfdCBmaWVsZF9udW0sIGNvbnN0IGNoYXIgKmZpZWxkX2lkLAorCQkJICAgICBjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzKQoreworCWNvbnN0IGNoYXIgKnNlbCA9IGZzLT52YWx1ZS0+di5zOworCisJc3dpdGNoIChmcy0+ZmxhZ3MgJiBGTERfQ01QX01BU0spIHsKKwkJY2FzZSBGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuICFzdHJjbXAodmFsLCBzZWwpOworCQljYXNlIEZMRF9DTVBfTk9UfEZMRF9DTVBfRVFVQUw6CisJCQlyZXR1cm4gc3RyY21wKHZhbCwgc2VsKTsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2NtcF9maWVsZF9zdHJpbmc6IHVuc3VwcG9ydGVkIHN0cmluZyAiCisJCQkJICAiY29tcGFyaXNvbiB0eXBlIGZvciBzZWxlY3Rpb24gZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NtcF9maWVsZF90aW1lKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgdWludDMyX3QgZmllbGRfbnVtLCBjb25zdCBjaGFyICpmaWVsZF9pZCwKKwkJCSAgIHRpbWVfdCB2YWwsIHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzKQoreworCWludCByYW5nZSA9IGZzLT52YWx1ZS0+bmV4dCAhPSBOVUxMOworCXRpbWVfdCBzZWwxID0gZnMtPnZhbHVlLT52LnQ7CisJdGltZV90IHNlbDIgPSByYW5nZSA/IGZzLT52YWx1ZS0+bmV4dC0+di50IDogMDsKKworCXN3aXRjaChmcy0+ZmxhZ3MgJiBGTERfQ01QX01BU0spIHsKKwkJY2FzZSBGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuIHJhbmdlID8gKCh2YWwgPj0gc2VsMSkgJiYgKHZhbCA8PSBzZWwyKSkgOiB2YWwgPT0gc2VsMTsKKwkJY2FzZSBGTERfQ01QX05PVHxGTERfQ01QX0VRVUFMOgorCQkJcmV0dXJuIHJhbmdlID8gKCh2YWwgPj0gc2VsMSkgJiYgKHZhbCA8PSBzZWwyKSkgOiB2YWwgIT0gc2VsMTsKKwkJY2FzZSBGTERfQ01QX1RJTUV8RkxEX0NNUF9HVDoKKwkJCWlmIChfY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQocmgsIGZpZWxkX251bSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRSwgJnZhbCwgZnMpKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHJhbmdlID8gdmFsID4gc2VsMiA6IHZhbCA+IHNlbDE7CisJCWNhc2UgRkxEX0NNUF9USU1FfEZMRF9DTVBfR1R8RkxEX0NNUF9FUVVBTDoKKwkJCWlmIChfY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQocmgsIGZpZWxkX251bSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRSwgJnZhbCwgZnMpKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHZhbCA+PSBzZWwxOworCQljYXNlIEZMRF9DTVBfVElNRXxGTERfQ01QX0xUOgorCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gdmFsIDwgc2VsMTsKKwkJY2FzZSBGTERfQ01QX1RJTUV8RkxEX0NNUF9MVHxGTERfQ01QX0VRVUFMOgorCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FLCAmdmFsLCBmcykpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gcmFuZ2UgPyB2YWwgPD0gc2VsMiA6IHZhbCA8PSBzZWwxOworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfY21wX2ZpZWxkX3RpbWU6IHVuc3VwcG9ydGVkIHRpbWUgIgorCQkJCSAgImNvbXBhcmlzb24gdHlwZSBmb3IgZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE1hdGNoZXMgaWYgYWxsIGl0ZW1zIGZyb20gc2VsZWN0aW9uIHN0cmluZyBsaXN0IG1hdGNoIGxpc3QgdmFsdWUgc3RyaWN0bHkgMToxLiAqLworc3RhdGljIGludCBfY21wX2ZpZWxkX3N0cmluZ19saXN0X3N0cmljdF9hbGwoY29uc3Qgc3RydWN0IHN0cl9saXN0X3NvcnRfdmFsdWUgKnZhbCwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICpzZWwpCit7CisJdW5zaWduZWQgaW50IHNlbF9saXN0X3NpemUgPSBkbV9saXN0X3NpemUoJnNlbC0+c3RyX2xpc3QubGlzdCk7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzZWxfaXRlbTsKKwl1bnNpZ25lZCBpbnQgaSA9IDE7CisKKwlpZiAoIXZhbC0+aXRlbXNbMF0ubGVuKSB7CisJCWlmIChzZWxfbGlzdF9zaXplID09IDEpIHsKKwkJCS8qIG1hdGNoIGJsYW5rIHN0cmluZyBsaXN0IHdpdGggc2VsZWN0aW9uIGRlZmluZWQgYXMgYmxhbmsgc3RyaW5nIG9ubHkgKi8KKwkJCXNlbF9pdGVtID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfZmlyc3QoJnNlbC0+c3RyX2xpc3QubGlzdCksIHN0cnVjdCBkbV9zdHJfbGlzdCk7CisJCQlyZXR1cm4gIXN0cmNtcChzZWxfaXRlbS0+c3RyLCAiIik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogaWYgaXRlbSBjb3VudCBkaWZmZXJzLCBpdCdzIGNsZWFyIHRoZSBsaXN0cyBkbyBub3QgbWF0Y2ggKi8KKwlpZiAodmFsLT5pdGVtc1swXS5sZW4gIT0gc2VsX2xpc3Rfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBib3RoIGxpc3RzIGFyZSBzb3J0ZWQgc28gdGhleSBlaXRoZXIgbWF0Y2ggMToxIG9yIG5vdCAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzZWxfaXRlbSwgJnNlbC0+c3RyX2xpc3QubGlzdCkgeworCQlpZiAoKHN0cmxlbihzZWxfaXRlbS0+c3RyKSAhPSB2YWwtPml0ZW1zW2ldLmxlbikgfHwKKwkJICAgIHN0cm5jbXAoc2VsX2l0ZW0tPnN0ciwgdmFsLT52YWx1ZSArIHZhbC0+aXRlbXNbaV0ucG9zLCB2YWwtPml0ZW1zW2ldLmxlbikpCisJCQlyZXR1cm4gMDsKKwkJaSsrOworCX0KKworCXJldHVybiAxOworfQorCisvKiBNYXRjaGVzIGlmIGFsbCBpdGVtcyBmcm9tIHNlbGVjdGlvbiBzdHJpbmcgbGlzdCBtYXRjaCBhIHN1YnNldCBvZiBsaXN0IHZhbHVlLiAqLworc3RhdGljIGludCBfY21wX2ZpZWxkX3N0cmluZ19saXN0X3N1YnNldF9hbGwoY29uc3Qgc3RydWN0IHN0cl9saXN0X3NvcnRfdmFsdWUgKnZhbCwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICpzZWwpCit7CisJdW5zaWduZWQgaW50IHNlbF9saXN0X3NpemUgPSBkbV9saXN0X3NpemUoJnNlbC0+c3RyX2xpc3QubGlzdCk7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzZWxfaXRlbTsKKwl1bnNpZ25lZCBpbnQgaSwgbGFzdF9mb3VuZCA9IDE7CisJaW50IHIgPSAwOworCisJaWYgKCF2YWwtPml0ZW1zWzBdLmxlbikgeworCQlpZiAoc2VsX2xpc3Rfc2l6ZSA9PSAxKSB7CisJCQkvKiBtYXRjaCBibGFuayBzdHJpbmcgbGlzdCB3aXRoIHNlbGVjdGlvbiBkZWZpbmVkIGFzIGJsYW5rIHN0cmluZyBvbmx5ICovCisJCQlzZWxfaXRlbSA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2ZpcnN0KCZzZWwtPnN0cl9saXN0Lmxpc3QpLCBzdHJ1Y3QgZG1fc3RyX2xpc3QpOworCQkJcmV0dXJuICFzdHJjbXAoc2VsX2l0ZW0tPnN0ciwgIiIpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIHNlbGVjdGlvbiBpcyBhIHN1YnNldCBvZiB0aGUgdmFsdWUgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VsX2l0ZW0sICZzZWwtPnN0cl9saXN0Lmxpc3QpIHsKKwkJciA9IDA7CisJCWZvciAoaSA9IGxhc3RfZm91bmQ7IGkgPD0gdmFsLT5pdGVtc1swXS5sZW47IGkrKykgeworCQkJaWYgKChzdHJsZW4oc2VsX2l0ZW0tPnN0cikgPT0gdmFsLT5pdGVtc1tpXS5sZW4pICYmCisJCQkgICAgIXN0cm5jbXAoc2VsX2l0ZW0tPnN0ciwgdmFsLT52YWx1ZSArIHZhbC0+aXRlbXNbaV0ucG9zLCB2YWwtPml0ZW1zW2ldLmxlbikpIHsKKwkJCQlsYXN0X2ZvdW5kID0gaTsKKwkJCQlyID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIXIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyogTWF0Y2hlcyBpZiBhbnkgaXRlbSBmcm9tIHNlbGVjdGlvbiBzdHJpbmcgbGlzdCBtYXRjaGVzIGxpc3QgdmFsdWUuICovCitzdGF0aWMgaW50IF9jbXBfZmllbGRfc3RyaW5nX2xpc3RfYW55KGNvbnN0IHN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlICp2YWwsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNlbGVjdGlvbl9zdHJfbGlzdCAqc2VsKQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2VsX2l0ZW07CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBtYXRjaCBibGFuayBzdHJpbmcgbGlzdCB3aXRoIHNlbGVjdGlvbiB0aGF0IGNvbnRhaW5zIGJsYW5rIHN0cmluZyAqLworCWlmICghdmFsLT5pdGVtc1swXS5sZW4pIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlbF9pdGVtLCAmc2VsLT5zdHJfbGlzdC5saXN0KSB7CisJCQlpZiAoIXN0cmNtcChzZWxfaXRlbS0+c3RyLCAiIikpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlbF9pdGVtLCAmc2VsLT5zdHJfbGlzdC5saXN0KSB7CisJCS8qCisJCSAqIFRPRE86IE9wdGltaXplIHRoaXMgc28gd2UgZG9uJ3QgbmVlZCB0byBjb21wYXJlIHRoZSB3aG9sZSBsaXN0cycgY29udGVudC4KKwkJICogICAgICAgTWFrZSB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgbGlzdHMgYXJlIHNvcnRlZCEKKwkJICovCisJCWZvciAoaSA9IDE7IGkgPD0gdmFsLT5pdGVtc1swXS5sZW47IGkrKykgeworCQkJaWYgKChzdHJsZW4oc2VsX2l0ZW0tPnN0cikgPT0gdmFsLT5pdGVtc1tpXS5sZW4pICYmCisJCQkgICAgIXN0cm5jbXAoc2VsX2l0ZW0tPnN0ciwgdmFsLT52YWx1ZSArIHZhbC0+aXRlbXNbaV0ucG9zLCB2YWwtPml0ZW1zW2ldLmxlbikpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfY21wX2ZpZWxkX3N0cmluZ19saXN0KHN0cnVjdCBkbV9yZXBvcnQgKnJoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgdWludDMyX3QgZmllbGRfbnVtLCBjb25zdCBjaGFyICpmaWVsZF9pZCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlICp2YWwsCisJCQkJICBzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uICpmcykKK3sKKwljb25zdCBzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICpzZWwgPSBmcy0+dmFsdWUtPnYubDsKKwlpbnQgc3Vic2V0LCByOworCisJc3dpdGNoIChzZWwtPnR5cGUgJiBTRUxfTElTVF9NQVNLKSB7CisJCWNhc2UgU0VMX0xJU1RfTFM6CisJCQlzdWJzZXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgU0VMX0xJU1RfU1VCU0VUX0xTOgorCQkJc3Vic2V0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfY21wX2ZpZWxkX3N0cmluZ19saXN0OiB1bmtub3duIGxpc3QgdHlwZSIpOworCQkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzZWwtPnR5cGUgJiBTRUxfTUFTSykgeworCQljYXNlIFNFTF9BTkQ6CisJCQlyID0gc3Vic2V0ID8gX2NtcF9maWVsZF9zdHJpbmdfbGlzdF9zdWJzZXRfYWxsKHZhbCwgc2VsKQorCQkJCSAgIDogX2NtcF9maWVsZF9zdHJpbmdfbGlzdF9zdHJpY3RfYWxsKHZhbCwgc2VsKTsKKwkJCWJyZWFrOworCQljYXNlIFNFTF9PUjoKKwkJCXIgPSBfY21wX2ZpZWxkX3N0cmluZ19saXN0X2FueSh2YWwsIHNlbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2NtcF9maWVsZF9zdHJpbmdfbGlzdDogdW5zdXBwb3J0ZWQgc3RyaW5nICIKKwkJCQkgICJsaXN0IHR5cGUgZm91bmQsIGV4cGVjdGluZyBlaXRoZXIgQU5EIG9yIE9SIGxpc3QgZm9yICIKKwkJCQkgICJzZWxlY3Rpb24gZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZnMtPmZsYWdzICYgRkxEX0NNUF9OT1QgPyAhciA6IHI7Cit9CisKK3N0YXRpYyBpbnQgX2NtcF9maWVsZF9yZWdleChjb25zdCBjaGFyICpzLCBzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uICpmcykKK3sKKwlpbnQgbWF0Y2ggPSBkbV9yZWdleF9tYXRjaChmcy0+dmFsdWUtPnYuciwgcykgPj0gMDsKKwlyZXR1cm4gZnMtPmZsYWdzICYgRkxEX0NNUF9OT1QgPyAhbWF0Y2ggOiBtYXRjaDsKK30KKworc3RhdGljIGludCBfY29tcGFyZV9zZWxlY3Rpb25fZmllbGQoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmYsCisJCQkJICAgIHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzKQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzID0gZi0+cHJvcHMtPmltcGxpY2l0ID8gX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMKKwkJCQkJCQkJICAgICAgIDogcmgtPmZpZWxkczsKKwljb25zdCBjaGFyICpmaWVsZF9pZCA9IGZpZWxkc1tmLT5wcm9wcy0+ZmllbGRfbnVtXS5pZDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIWYtPnNvcnRfdmFsdWUpIHsKKwkJbG9nX2Vycm9yKCJfY29tcGFyZV9zZWxlY3Rpb25fZmllbGQ6IGZpZWxkIHdpdGhvdXQgdmFsdWUgOiVkIiwKKwkJCSAgZi0+cHJvcHMtPmZpZWxkX251bSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmcy0+ZmxhZ3MgJiBGTERfQ01QX1JFR0VYKQorCQlyID0gX2NtcF9maWVsZF9yZWdleCgoY29uc3QgY2hhciAqKSBmLT5zb3J0X3ZhbHVlLCBmcyk7CisJZWxzZSB7CisJCXN3aXRjaChmLT5wcm9wcy0+ZmxhZ3MgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLKSB7CisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1BFUkNFTlQ6CisJCQkJLyoKKwkJCQkgKiBDaGVjayBhZ2FpbnN0IHJlYWwgcGVyY2VudCB2YWx1ZXMgb25seS4KKwkJCQkgKiBUaGF0IG1lYW5zIERNX1BFUkNFTlRfMCA8PSBwZXJjZW50IDw9IERNX1BFUkNFTlRfMTAwLgorCQkJCSAqLworCQkJCWlmICgqKGNvbnN0IHVpbnQ2NF90ICopIGYtPnNvcnRfdmFsdWUgPiBETV9QRVJDRU5UXzEwMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUjoKKwkJCQlyID0gX2NtcF9maWVsZF9pbnQocmgsIGYtPnByb3BzLT5maWVsZF9udW0sIGZpZWxkX2lkLCAqKGNvbnN0IHVpbnQ2NF90ICopIGYtPnNvcnRfdmFsdWUsIGZzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRToKKwkJCQlyID0gX2NtcF9maWVsZF9kb3VibGUocmgsIGYtPnByb3BzLT5maWVsZF9udW0sIGZpZWxkX2lkLCAqKGNvbnN0IGRvdWJsZSAqKSBmLT5zb3J0X3ZhbHVlLCBmcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORzoKKwkJCQlyID0gX2NtcF9maWVsZF9zdHJpbmcocmgsIGYtPnByb3BzLT5maWVsZF9udW0sIGZpZWxkX2lkLCAoY29uc3QgY2hhciAqKSBmLT5zb3J0X3ZhbHVlLCBmcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklOR19MSVNUOgorCQkJCXIgPSBfY21wX2ZpZWxkX3N0cmluZ19saXN0KHJoLCBmLT5wcm9wcy0+ZmllbGRfbnVtLCBmaWVsZF9pZCwgKGNvbnN0IHN0cnVjdCBzdHJfbGlzdF9zb3J0X3ZhbHVlICopIGYtPnNvcnRfdmFsdWUsIGZzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRToKKwkJCQlyID0gX2NtcF9maWVsZF90aW1lKHJoLCBmLT5wcm9wcy0+ZmllbGRfbnVtLCBmaWVsZF9pZCwgKihjb25zdCB0aW1lX3QgKikgZi0+c29ydF92YWx1ZSwgZnMpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jb21wYXJlX3NlbGVjdGlvbl9maWVsZDogdW5rbm93biBmaWVsZCB0eXBlIGZvciBmaWVsZCAlcyIsIGZpZWxkX2lkKTsKKwkJfQorCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9jaGVja19zZWxlY3Rpb24oc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqc24sCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmZpZWxkcykKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKml0ZXJfbjsKKwlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmOworCisJc3dpdGNoIChzbi0+dHlwZSAmIFNFTF9NQVNLKSB7CisJCWNhc2UgU0VMX0lURU06CisJCQlyID0gMTsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmLCBmaWVsZHMpIHsKKwkJCQlpZiAoc24tPnNlbGVjdGlvbi5pdGVtLT5mcCAhPSBmLT5wcm9wcykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFfY29tcGFyZV9zZWxlY3Rpb25fZmllbGQocmgsIGYsIHNuLT5zZWxlY3Rpb24uaXRlbSkpCisJCQkJCXIgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0VMX09SOgorCQkJciA9IDA7CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoaXRlcl9uLCAmc24tPnNlbGVjdGlvbi5zZXQpCisJCQkJaWYgKChyIHw9IF9jaGVja19zZWxlY3Rpb24ocmgsIGl0ZXJfbiwgZmllbGRzKSkpCisJCQkJCWJyZWFrOworCQkJYnJlYWs7CisJCWNhc2UgU0VMX0FORDoKKwkJCXIgPSAxOworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGl0ZXJfbiwgJnNuLT5zZWxlY3Rpb24uc2V0KQorCQkJCWlmICghKHIgJj0gX2NoZWNrX3NlbGVjdGlvbihyaCwgaXRlcl9uLCBmaWVsZHMpKSkKKwkJCQkJYnJlYWs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcigiVW5zdXBwb3J0ZWQgc2VsZWN0aW9uIHR5cGUiKTsKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAoc24tPnR5cGUgJiBTRUxfTU9ESUZJRVJfTk9UKSA/ICFyIDogcjsKK30KKworc3RhdGljIGludCBfY2hlY2tfcmVwb3J0X3NlbGVjdGlvbihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX2xpc3QgKmZpZWxkcykKK3sKKwlpZiAoIXJoLT5zZWxlY3Rpb24gfHwgIXJoLT5zZWxlY3Rpb24tPnNlbGVjdGlvbl9yb290KQorCQlyZXR1cm4gMTsKKworCXJldHVybiBfY2hlY2tfc2VsZWN0aW9uKHJoLCByaC0+c2VsZWN0aW9uLT5zZWxlY3Rpb25fcm9vdCwgZmllbGRzKTsKK30KKworc3RhdGljIGludCBfZG9fcmVwb3J0X29iamVjdChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgdm9pZCAqb2JqZWN0LCBpbnQgZG9fb3V0cHV0LCBpbnQgKnNlbGVjdGVkKQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzOworCXN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpmcDsKKwlzdHJ1Y3Qgcm93ICpyb3cgPSBOVUxMOworCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkOworCXZvaWQgKmRhdGEgPSBOVUxMOworCWludCByID0gMDsKKworCWlmICghcmgpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfZG9fcmVwb3J0X29iamVjdDogZG1fcmVwb3J0IGhhbmRsZXIgaXMgTlVMTC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkb19vdXRwdXQgJiYgIXNlbGVjdGVkKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2RvX3JlcG9ydF9vYmplY3Q6IG91dHB1dCBub3QgcmVxdWVzdGVkIGFuZCAiCisJCQkJCSAic2VsZWN0ZWQgb3V0cHV0IHZhcmlhYmxlIGlzIE5VTEwgdG9vLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmgtPmZsYWdzICYgUkhfQUxSRUFEWV9SRVBPUlRFRCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShyb3cgPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCBzaXplb2YoKnJvdykpKSkgeworCQlsb2dfZXJyb3IoIl9kb19yZXBvcnRfb2JqZWN0OiBzdHJ1Y3Qgcm93IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmgtPmZpcnN0X3JvdykKKwkJcmgtPmZpcnN0X3JvdyA9IHJvdzsKKworCXJvdy0+cmggPSByaDsKKworCWlmICgocmgtPmZsYWdzICYgUkhfU09SVF9SRVFVSVJFRCkgJiYKKwkgICAgIShyb3ctPnNvcnRfZmllbGRzID0KKwkJZG1fcG9vbF96YWxsb2MocmgtPm1lbSwgc2l6ZW9mKHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKikgKgorCQkJICAgICAgIHJoLT5rZXlzX2NvdW50KSkpIHsKKwkJbG9nX2Vycm9yKCJfZG9fcmVwb3J0X29iamVjdDogIgorCQkJICAicm93IHNvcnQgdmFsdWUgc3RydWN0dXJlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWRtX2xpc3RfaW5pdCgmcm93LT5maWVsZHMpOworCXJvdy0+c2VsZWN0ZWQgPSAxOworCisJLyogRm9yIGVhY2ggZmllbGQgdG8gYmUgZGlzcGxheWVkLCBjYWxsIGl0cyByZXBvcnRfZm4gKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZnAsICZyaC0+ZmllbGRfcHJvcHMpIHsKKwkJaWYgKCEoZmllbGQgPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCBzaXplb2YoKmZpZWxkKSkpKSB7CisJCQlsb2dfZXJyb3IoIl9kb19yZXBvcnRfb2JqZWN0OiAiCisJCQkJICAic3RydWN0IGRtX3JlcG9ydF9maWVsZCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZnAtPmltcGxpY2l0KSB7CisJCQlmaWVsZHMgPSBfaW1wbGljaXRfcmVwb3J0X2ZpZWxkczsKKwkJCWlmICghc3RyY21wKGZpZWxkc1tmcC0+ZmllbGRfbnVtXS5pZCwgU1BFQ0lBTF9GSUVMRF9TRUxFQ1RFRF9JRCkpCisJCQkJcm93LT5maWVsZF9zZWxfc3RhdHVzID0gZmllbGQ7CisJCX0gZWxzZQorCQkJZmllbGRzID0gcmgtPmZpZWxkczsKKworCQlmaWVsZC0+cHJvcHMgPSBmcDsKKworCQlkYXRhID0gZnAtPmltcGxpY2l0ID8gX3JlcG9ydF9nZXRfaW1wbGljaXRfZmllbGRfZGF0YShyaCwgZnAsIHJvdykKKwkJCQkgICAgOiBfcmVwb3J0X2dldF9maWVsZF9kYXRhKHJoLCBmcCwgb2JqZWN0KTsKKwkJaWYgKCFkYXRhKSB7CisJCQlsb2dfZXJyb3IoIl9kb19yZXBvcnRfb2JqZWN0OiAiCisJCQkJICAibm8gZGF0YSBhc3NpZ25lZCB0byBmaWVsZCAlcyIsCisJCQkJICBmaWVsZHNbZnAtPmZpZWxkX251bV0uaWQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIWZpZWxkc1tmcC0+ZmllbGRfbnVtXS5yZXBvcnRfZm4ocmgsIHJoLT5tZW0sCisJCQkJCQkJIGZpZWxkLCBkYXRhLAorCQkJCQkJCSByaC0+cHJpdmF0ZSkpIHsKKwkJCWxvZ19lcnJvcigiX2RvX3JlcG9ydF9vYmplY3Q6ICIKKwkJCQkgICJyZXBvcnQgZnVuY3Rpb24gZmFpbGVkIGZvciBmaWVsZCAlcyIsCisJCQkJICBmaWVsZHNbZnAtPmZpZWxkX251bV0uaWQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkbV9saXN0X2FkZCgmcm93LT5maWVsZHMsICZmaWVsZC0+bGlzdCk7CisJfQorCisJciA9IDE7CisKKwlpZiAoIV9jaGVja19yZXBvcnRfc2VsZWN0aW9uKHJoLCAmcm93LT5maWVsZHMpKSB7CisJCXJvdy0+c2VsZWN0ZWQgPSAwOworCisJCS8qCisJCSAqIElmIHRoZSByb3cgaXMgbm90IHNlbGVjdGVkLCB3ZSBzdGlsbCBrZWVwIGl0IGZvciBvdXRwdXQgaWYgZWl0aGVyOgorCQkgKiAgIC0gd2UncmUgZGlzcGxheWluZyBzcGVjaWFsICJzZWxlY3RlZCIgZmllbGQgaW4gdGhlIHJvdywKKwkJICogICAtIG9yIHRoZSByZXBvcnQgaXMgc3VwcG9zZWQgdG8gYmUgb24gb3V0cHV0IG11bHRpcGxlIHRpbWVzCisJCSAqICAgICB3aGVyZSBlYWNoIG91dHB1dCBjYW4gaGF2ZSBhIG5ldyBzZWxlY3Rpb24gZGVmaW5lZC4KKwkJICovCisJCWlmICghcm93LT5maWVsZF9zZWxfc3RhdHVzICYmICEocmgtPmZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9NVUxUSVBMRV9USU1FUykpCisJCQlnb3RvIG91dDsKKworCQlpZiAocm93LT5maWVsZF9zZWxfc3RhdHVzKSB7CisJCQkvKgorCQkJICogSWYgZmllbGQgd2l0aCBpZCAic2VsZWN0ZWQiIGlzIHJlcG9ydGVkLAorCQkJICogcmVwb3J0IHRoZSByb3cgYWx0aG91Z2ggaXQgZG9lcyBub3QgcGFzcworCQkJICogdGhlIHNlbGVjdGlvbiBjcml0ZXJpYS4KKwkJCSAqIFRoZSAic2VsZWN0ZWQiIGZpZWxkIHJlcG9ydHMgdGhlIHJlc3VsdAorCQkJICogb2YgdGhlIHNlbGVjdGlvbi4KKwkJCSAqLworCQkJX2ltcGxpY2l0X3JlcG9ydF9maWVsZHNbcm93LT5maWVsZF9zZWxfc3RhdHVzLT5wcm9wcy0+ZmllbGRfbnVtXS5yZXBvcnRfZm4ocmgsCisJCQkJCQkJcmgtPm1lbSwgcm93LT5maWVsZF9zZWxfc3RhdHVzLCByb3csIHJoLT5wcml2YXRlKTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgInNlbGVjdGVkIiBmaWVsZCBpcyBub3QgZGlzcGxheWVkLCBlLmcuCisJCQkgKiBiZWNhdXNlIGl0IGlzIHBhcnQgb2YgdGhlIHNvcnQgZmllbGQgbGlzdCwKKwkJCSAqIHNraXAgdGhlIGRpc3BsYXkgb2YgdGhlIHJvdyBhcyB1c3VhbCB1bmxlc3MKKwkJCSAqIHdlIHBsYW4gdG8gZG8gdGhlIG91dHB1dCBtdWx0aXBsZSB0aW1lcy4KKwkJCSAqLworCQkJaWYgKChyb3ctPmZpZWxkX3NlbF9zdGF0dXMtPnByb3BzLT5mbGFncyAmIEZMRF9ISURERU4pICYmCisJCQkgICAgIShyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX01VTFRJUExFX1RJTUVTKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghZG9fb3V0cHV0KQorCQlnb3RvIG91dDsKKworCWRtX2xpc3RfYWRkKCZyaC0+cm93cywgJnJvdy0+bGlzdCk7CisKKwlpZiAoIShyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0JVRkZFUkVEKSkKKwkJcmV0dXJuIGRtX3JlcG9ydF9vdXRwdXQocmgpOworb3V0OgorCWlmIChzZWxlY3RlZCkKKwkJKnNlbGVjdGVkID0gcm93LT5zZWxlY3RlZDsKKwlpZiAoIWRvX291dHB1dCB8fCAhcikKKwkJZG1fcG9vbF9mcmVlKHJoLT5tZW0sIHJvdyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3JlcG9ydF9jb21wYWN0X2ZpZWxkcyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgaW50IGdsb2JhbCkKK3sKKwlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZDsKKwlzdHJ1Y3QgZmllbGRfcHJvcGVydGllcyAqZnA7CisJc3RydWN0IHJvdyAqcm93OworCisJaWYgKCFyaCkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydF9lbmFibGVfY29tcGFjdF9vdXRwdXQ6IGRtIHJlcG9ydCBoYW5kbGVyIGlzIE5VTEwuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHJoLT5mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfQlVGRkVSRUQpIHx8CisJICAgICAgZG1fbGlzdF9lbXB0eSgmcmgtPnJvd3MpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQXQgZmlyc3QsIG1hcmsgYWxsIGZpZWxkcyB3aXRoIEZMRF9ISURERU4gZmxhZy4KKwkgKiBBbHNvLCBtYXJrIGZpZWxkIHdpdGggRkxEX0NPTVBBQ1RFRCBmbGFnLCBidXQgb25seQorCSAqIHRoZSBvbmVzIHRoYXQgZGlkbid0IGhhdmUgRkxEX0hJRERFTiBzZXQgYmVmb3JlLgorCSAqIFRoaXMgcHJldmVudHMgbG9zaW5nIHRoZSBvcmlnaW5hbCBGTERfSElEREVOIGZsYWcKKwkgKiBpbiBuZXh0IHN0ZXAuLi4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZnAsICZyaC0+ZmllbGRfcHJvcHMpIHsKKwkJaWYgKGZwLT5mbGFncyAmIEZMRF9ISURERU4pCisJCQljb250aW51ZTsKKwkJaWYgKGdsb2JhbCB8fCAoZnAtPmZsYWdzICYgRkxEX0NPTVBBQ1RfT05FKSkKKwkJCWZwLT5mbGFncyB8PSAoRkxEX0NPTVBBQ1RFRCB8IEZMRF9ISURERU4pOworCX0KKworCS8qCisJICogLi4uY2hlY2sgZWFjaCBmaWVsZCBpbiBhIHJvdyBhbmQgaWYgaXRzIHJlcG9ydCB2YWx1ZQorCSAqIGlzIG5vdCBlbXB0eSwgZHJvcCB0aGUgRkxEX0NPTVBBQ1RFRCBhbmQgRkxEX0hJRERFTgorCSAqIGZsYWcgaWYgRkxEX0NPTVBBQ1RFRCBmbGFnIGlzIHNldC4gSXQncyBpbXBvcnRhbnQKKwkgKiB0byBrZWVwIEZMRF9ISURERU4gZmxhZyBmb3IgdGhlIGZpZWxkcyB0aGF0IHdlcmUKKwkgKiBhbHJlYWR5IG1hcmtlZCB3aXRoIEZMRF9ISURERU4gYmVmb3JlIC0gdGhlc2UgZG9uJ3QKKwkgKiBoYXZlIEZMRF9DT01QQUNURUQgc2V0IC0gY2hlY2sgdGhpcyBjb25kaXRpb24hCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJvdywgJnJoLT5yb3dzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmaWVsZCwgJnJvdy0+ZmllbGRzKSB7CisJCQlpZiAoKGZpZWxkLT5yZXBvcnRfc3RyaW5nICYmICpmaWVsZC0+cmVwb3J0X3N0cmluZykgJiYKKwkJCSAgICAgZmllbGQtPnByb3BzLT5mbGFncyAmIEZMRF9DT01QQUNURUQpCisJCQkJCWZpZWxkLT5wcm9wcy0+ZmxhZ3MgJj0gfihGTERfQ09NUEFDVEVEIHwgRkxEX0hJRERFTik7CisJCQl9CisJfQorCisJLyoKKwkgKiBUaGUgZmllbGRzIGxlZnQgd2l0aCBGTERfQ09NUEFDVEVEIGFuZCBGTERfSElEREVOIGZsYWcgYXJlCisJICogdGhlIG9uZXMgd2hpY2ggaGF2ZSBibGFuayB2YWx1ZSBpbiBhbGwgcm93cy4gVGhlIEZMRF9ISURERU4KKwkgKiB3aWxsIGNhdXNlIHN1Y2ggZmllbGQgdG8gbm90IGJlIHJlcG9ydGVkIG9uIG91dHB1dCBhdCBhbGwuCisJICovCisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3JlcG9ydF9jb21wYWN0X2ZpZWxkcyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCkKK3sKKwlyZXR1cm4gX2RvX3JlcG9ydF9jb21wYWN0X2ZpZWxkcyhyaCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX2ZpZWxkX3RvX2NvbXBhY3RfbWF0Y2goc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKmZpZWxkLCBzaXplX3QgZmxlbikKK3sKKwlzdHJ1Y3QgZmllbGRfcHJvcGVydGllcyAqZnA7CisJdWludDMyX3QgZjsKKwlpbnQgaW1wbGljaXQ7CisKKwlpZiAoKF9nZXRfZmllbGQocmgsIGZpZWxkLCBmbGVuLCAmZiwgJmltcGxpY2l0KSkpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGZwLCAmcmgtPmZpZWxkX3Byb3BzKSB7CisJCQlpZiAoKGZwLT5pbXBsaWNpdCA9PSBpbXBsaWNpdCkgJiYgKGZwLT5maWVsZF9udW0gPT0gZikpIHsKKwkJCQlmcC0+ZmxhZ3MgfD0gRkxEX0NPTVBBQ1RfT05FOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9wYXJzZV9maWVsZHNfdG9fY29tcGFjdChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqZmllbGRzKQoreworCWNvbnN0IGNoYXIgKndzOwkJICAvKiBXb3JkIHN0YXJ0ICovCisJY29uc3QgY2hhciAqd2UgPSBmaWVsZHM7ICAvKiBXb3JkIGVuZCAqLworCisJaWYgKCFmaWVsZHMpCisJCXJldHVybiAxOworCisJd2hpbGUgKCp3ZSkgeworCQl3aGlsZSAoKndlICYmICp3ZSA9PSAnLCcpCisJCQl3ZSsrOworCQl3cyA9IHdlOworCQl3aGlsZSAoKndlICYmICp3ZSAhPSAnLCcpCisJCQl3ZSsrOworCQlpZiAoIV9maWVsZF90b19jb21wYWN0X21hdGNoKHJoLCB3cywgKHNpemVfdCkgKHdlIC0gd3MpKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IFVucmVjb2duaXplZCBmaWVsZDogJS4qcyIsIChpbnQpICh3ZSAtIHdzKSwgd3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3JlcG9ydF9jb21wYWN0X2dpdmVuX2ZpZWxkcyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgY29uc3QgY2hhciAqZmllbGRzKQoreworCWlmICghX3BhcnNlX2ZpZWxkc190b19jb21wYWN0KHJoLCBmaWVsZHMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBfZG9fcmVwb3J0X2NvbXBhY3RfZmllbGRzKHJoLCAwKTsKK30KKworaW50IGRtX3JlcG9ydF9vYmplY3Qoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHZvaWQgKm9iamVjdCkKK3sKKwlyZXR1cm4gX2RvX3JlcG9ydF9vYmplY3QocmgsIG9iamVjdCwgMSwgTlVMTCk7Cit9CisKK2ludCBkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCB2b2lkICpvYmplY3QsIGludCBkb19vdXRwdXQsIGludCAqc2VsZWN0ZWQpCit7CisJcmV0dXJuIF9kb19yZXBvcnRfb2JqZWN0KHJoLCBvYmplY3QsIGRvX291dHB1dCwgc2VsZWN0ZWQpOworfQorCisvKgorICogU2VsZWN0aW9uIHBhcnNpbmcKKyAqLworCisvKgorICogT3RoZXIgdG9rZW5zIChGSUVMRCwgVkFMVUUsIFNUUklORywgTlVNQkVSLCBSRUdFWCkKKyAqICAgICBGSUVMRCA6PSA8c3RyaW5ncyBvZiBhbHBoYWJldCwgbnVtYmVyIGFuZCAnXyc+CisgKiAgICAgVkFMVUUgOj0gTlVNQkVSIHwgU1RSSU5HCisgKiAgICAgUkVHRVggOj0gPHN0cmluZ3MgcXVvdGVkIGJ5ICciJywgJ1wnJywgJygnLCAneycsICdbJyBvciB1bnF1b3RlZD4KKyAqICAgICBOVU1CRVIgOj0gPHN0cmluZ3Mgb2YgWzAtOV0+IChiZWNhdXNlIHNvcnRfdmFsdWUgaXMgdW5zaWduZWQpCisgKiAgICAgU1RSSU5HIDo9IDxzdHJpbmdzIHF1b3RlZCBieSAnIicsICdcJycgb3IgdW5xdW90ZWQ+CisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBfc2tpcF9zcGFjZShjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcyAmJiBpc3NwYWNlKCpzKSkKKwkJcysrOworCXJldHVybiBzOworfQorCitzdGF0aWMgaW50IF90b2tfb3Aoc3RydWN0IG9wX2RlZiAqdCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVuZCwKKwkJICAgdWludDMyX3QgZXhwZWN0KQoreworCXNpemVfdCBsZW47CisKKwlzID0gX3NraXBfc3BhY2Uocyk7CisKKwlmb3IgKDsgdC0+c3RyaW5nOyB0KyspIHsKKwkJaWYgKGV4cGVjdCAmJiAhKHQtPmZsYWdzICYgZXhwZWN0KSkKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IHN0cmxlbih0LT5zdHJpbmcpOworCQlpZiAoIXN0cm5jbXAocywgdC0+c3RyaW5nLCBsZW4pKSB7CisJCQlpZiAoZW5kKQorCQkJCSplbmQgPSBzICsgbGVuOworCQkJcmV0dXJuIHQtPmZsYWdzOworCQl9CisJfQorCisJaWYgKGVuZCkKKwkJKmVuZCA9IHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3Rva19vcF9sb2coY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVuZCwgdWludDMyX3QgZXhwZWN0KQoreworCXJldHVybiBfdG9rX29wKF9vcF9sb2csIHMsIGVuZCwgZXhwZWN0KTsKK30KKworc3RhdGljIGludCBfdG9rX29wX2NtcChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqZW5kKQoreworCXJldHVybiBfdG9rX29wKF9vcF9jbXAsIHMsIGVuZCwgMCk7Cit9CisKK3N0YXRpYyBjaGFyIF9nZXRfYW5kX3NraXBfcXVvdGVfY2hhcihjaGFyIGNvbnN0ICoqcykKK3sKKwljaGFyIGMgPSAwOworCisJaWYgKCoqcyA9PSAnIicgfHwgKipzID09ICdcJycpIHsKKwkJYyA9ICoqczsKKwkJKCpzKSsrOworCX0KKworCXJldHVybiBjOworfQorCisgLyoKKyAgKgorICAqIElucHV0OgorICAqICAgcyAgICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIHN0cmluZworICAqIE91dHB1dDoKKyAgKiAgIGJlZ2luICAgICAgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdG9rZW4KKyAgKiAgIGVuZCAgICAgICAgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgdG9rZW4gKyAxCisgICogICAgICAgICAgICAgICAgICAgb3IgdW5kZWZpbmVkIGlmIHJldHVybiB2YWx1ZSBpcyBOVUxMCisgICogICByZXR1cm4gdmFsdWUgIC0gYSBzdGFydGluZyBwb2ludCBvZiB0aGUgbmV4dCBwYXJzaW5nIG9yCisgICogICAgICAgICAgICAgICAgICAgTlVMTCBpZiAncycgZG9lc24ndCBtYXRjaCB3aXRoIHRva2VuIHR5cGUKKyAgKiAgICAgICAgICAgICAgICAgICAodGhlIHBhcnNpbmcgc2hvdWxkIGJlIHRlcm1pbmF0ZWQpCisgICovCitzdGF0aWMgY29uc3QgY2hhciAqX3Rva192YWx1ZV9udW1iZXIoY29uc3QgY2hhciAqcywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKipiZWdpbiwgY29uc3QgY2hhciAqKmVuZCkKKworeworCWludCBpc19mbG9hdCA9IDA7CisKKwkqYmVnaW4gPSBzOworCXdoaWxlICgoIWlzX2Zsb2F0ICYmICgqcyA9PSAnLicpICYmICsraXNfZmxvYXQpIHx8IGlzZGlnaXQoKnMpKQorCQlzKys7CisJKmVuZCA9IHM7CisKKwlpZiAoKmJlZ2luID09ICplbmQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBJbnB1dDoKKyAqICAgcyAgICAgICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgc3RyaW5nCisgKiAgIGVuZGNoYXIgICAgICAgICAtIHRlcm1pbmF0aW5nIGNoYXJhY3RlcgorICogICBlbmRfb3BfZmxhZ3MgICAgLSB0ZXJtaW5hdGluZyBvcGVyYXRvciBmbGFncyAoc2VlIF9vcF9sb2cpCisgKiAgICAgICAgICAgICAgICAgICAgIChpZiBlbmRjaGFyIGlzIG5vbi16ZXJvIHRoZW4gZW5kZmxhZ3MgaXMgaWdub3JlZCkKKyAqIE91dHB1dDoKKyAqICAgYmVnaW4gICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRva2VuCisgKiAgIGVuZCAgICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSB0b2tlbiArIDEKKyAqICAgZW5kX29wX2ZsYWdfaGl0IC0gdGhlIGZsYWcgZnJvbSBlbmRmbGFncyBoaXQgZHVyaW5nIHBhcnNpbmcKKyAqICAgcmV0dXJuIHZhbHVlICAgIC0gYSBzdGFydGluZyBwb2ludCBvZiB0aGUgbmV4dCBwYXJzaW5nCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfdG9rX3ZhbHVlX3N0cmluZyhjb25zdCBjaGFyICpzLAorCQkJCSAgICAgY29uc3QgY2hhciAqKmJlZ2luLCBjb25zdCBjaGFyICoqZW5kLAorCQkJCSAgICAgY29uc3QgY2hhciBlbmRjaGFyLCB1aW50MzJfdCBlbmRfb3BfZmxhZ3MsCisJCQkJICAgICB1aW50MzJfdCAqZW5kX29wX2ZsYWdfaGl0KQoreworCXVpbnQzMl90IGZsYWdfaGl0ID0gMDsKKworCSpiZWdpbiA9IHM7CisKKwkvKgorCSAqIElmIGVuZGNoYXIgaXMgZGVmaW5lZCwgc2NhbiB0aGUgc3RyaW5nIHRpbGwKKwkgKiB0aGUgZW5kY2hhciBvciB0aGUgZW5kIG9mIHN0cmluZyBpcyBoaXQuCisJICogVGhpcyBpcyBpbiBjYXNlIHRoZSBzdHJpbmcgaXMgcXVvdGVkIGFuZCB3ZQorCSAqIGtub3cgZXhhY3QgY2hhcmFjdGVyIHRoYXQgaXMgdGhlIHN0b3BwZXIuCisJICovCisJaWYgKGVuZGNoYXIpIHsKKwkJd2hpbGUgKCpzICYmICpzICE9IGVuZGNoYXIpCisJCQlzKys7CisJCWlmICgqcyAhPSBlbmRjaGFyKSB7CisJCQlsb2dfZXJyb3IoIk1pc3NpbmcgZW5kIHF1b3RlLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKmVuZCA9IHM7CisJCXMrKzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiBlbmRjaGFyIGlzIG5vdCBkZWZpbmVkIHRoZW4gZW5kY2hhciBpcy9hcmUgdGhlCisJCSAqIG9wZXJhdG9yL3MgYXMgZGVmaW5lZCBieSAnZW5kZmxhZ3MnIGFyZyBvciBzcGFjZSBjaGFyLgorCQkgKiBUaGlzIGlzIGluIGNhc2UgdGhlIHN0cmluZyBpcyBub3QgcXVvdGVkIGFuZAorCQkgKiB3ZSBkb24ndCBrbm93IHdoaWNoIGNoYXJhY3RlciBpcyB0aGUgZXhhY3Qgc3RvcHBlci4KKwkJICovCisJCXdoaWxlICgqcykgeworCQkJaWYgKChmbGFnX2hpdCA9IF90b2tfb3AoX29wX2xvZywgcywgTlVMTCwgZW5kX29wX2ZsYWdzKSkgfHwgKnMgPT0gJyAnKQorCQkJCWJyZWFrOworCQkJcysrOworCQl9CisJCSplbmQgPSBzOworCQkvKgorCQkgKiBJZiB3ZSBoaXQgb25lIG9mIHRoZSBzdHJpbmdzIGFzIGRlZmluZWQgYnkgJ2VuZGZsYWdzJworCQkgKiBhbmQgaWYgJ2VuZGZsYWdfaGl0JyBhcmcgaXMgcHJvdmlkZWQsIHNhdmUgdGhlIGV4YWN0CisJCSAqIHN0cmluZyBmbGFnIHRoYXQgd2FzIGhpdC4KKwkJICovCisJCWlmIChlbmRfb3BfZmxhZ19oaXQpCisJCQkqZW5kX29wX2ZsYWdfaGl0ID0gZmxhZ19oaXQ7CisJfQorCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfcmVzZXJ2ZWRfbmFtZShzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfcmVzZXJ2ZWRfdmFsdWUgKnJlc2VydmVkLAorCQkJCSAgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF9yZXNlcnZlZF92YWx1ZSAqZnJ2LAorCQkJCSAgdWludDMyX3QgZmllbGRfbnVtLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQoreworCWRtX3JlcG9ydF9yZXNlcnZlZF9oYW5kbGVyIGhhbmRsZXI7CisJY29uc3QgY2hhciAqY2Fub25pY2FsX25hbWU7CisJY29uc3QgY2hhciAqKm5hbWU7CisJY2hhciAqdG1wX3M7CisJY2hhciBjOworCWludCByOworCisJbmFtZSA9IHJlc2VydmVkLT5uYW1lczsKKwl3aGlsZSAoKm5hbWUpIHsKKwkJaWYgKChzdHJsZW4oKm5hbWUpID09IGxlbikgJiYgIXN0cm5jbXAoKm5hbWUsIHMsIGxlbikpCisJCQlyZXR1cm4gKm5hbWU7CisJCW5hbWUrKzsKKwl9CisKKwlpZiAocmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfRlVaWllfTkFNRVMpIHsKKwkJaGFuZGxlciA9IChkbV9yZXBvcnRfcmVzZXJ2ZWRfaGFuZGxlcikgKGZydiA/IGZydi0+dmFsdWUgOiByZXNlcnZlZC0+dmFsdWUpOworCQljID0gc1tsZW5dOworCQl0bXBfcyA9IChjaGFyICopIHM7CisJCXRtcF9zW2xlbl0gPSAnXDAnOworCQlpZiAoKHIgPSBoYW5kbGVyKHJoLCByaC0+c2VsZWN0aW9uLT5tZW0sIGZpZWxkX251bSwKKwkJCQkgRE1fUkVQT1JUX1JFU0VSVkVEX1BBUlNFX0ZVWlpZX05BTUUsCisJCQkJIHRtcF9zLCAoY29uc3Qgdm9pZCAqKikgJmNhbm9uaWNhbF9uYW1lKSkgPD0gMCkgeworCQkJaWYgKHIgPT0gLTEpCisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICIlcyByZXNlcnZlZCB2YWx1ZSBoYW5kbGVyIGZvciBmaWVsZCAlcyBoYXMgbWlzc2luZyAiCisJCQkJCSAgImltcGxlbWVudGF0aW9uIG9mIERNX1JFUE9SVF9SRVNFUlZFRF9QQVJTRV9GVVpaWV9OQU1FIGFjdGlvbiIsCisJCQkJCSAgKHJlc2VydmVkLT50eXBlICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTUFTSykgPyAidHlwZS1zcGVjaWZpYyIgOiAiZmllbGQtc3BlY2lmaWMiLAorCQkJCQkgICByaC0+ZmllbGRzW2ZpZWxkX251bV0uaWQpOworCQkJZWxzZQorCQkJCWxvZ19lcnJvcigiRXJyb3Igb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nICVzIHJlc2VydmVkIHZhbHVlIGhhbmRsZXIgZm9yIGZpZWxkICVzIiwKKwkJCQkJICAocmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLKSA/ICJ0eXBlLXNwZWNpZmljIiA6ICJmaWVsZC1zcGVjaWZpYyIsCisJCQkJCSAgIHJoLT5maWVsZHNbZmllbGRfbnVtXS5pZCk7CisJCX0KKwkJdG1wX3NbbGVuXSA9IGM7CisJCWlmIChyICYmIGNhbm9uaWNhbF9uYW1lKQorCQkJcmV0dXJuIGNhbm9uaWNhbF9uYW1lOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogVXNlZCB0byByZXBsYWNlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXNlcnZlZCB2YWx1ZQorICogZm91bmQgaW4gc2VsZWN0aW9uIHdpdGggdGhlIGV4YWN0IHJlc2VydmVkIHZhbHVlIG9mIGNlcnRhaW4gdHlwZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRfcmVzZXJ2ZWQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHVuc2lnbmVkIHR5cGUsCisJCQkJIHVpbnQzMl90IGZpZWxkX251bSwgaW50IGltcGxpY2l0LAorCQkJCSBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqYmVnaW4sIGNvbnN0IGNoYXIgKiplbmQsCisJCQkJIHN0cnVjdCByZXNlcnZlZF92YWx1ZV93cmFwcGVyICpydncpCit7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSAqaXRlciA9IGltcGxpY2l0ID8gTlVMTCA6IHJoLT5yZXNlcnZlZF92YWx1ZXM7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF9yZXNlcnZlZF92YWx1ZSAqZnJ2OworCWNvbnN0IGNoYXIgKnRtcF9iZWdpbiwgKnRtcF9lbmQsICp0bXBfcyA9IHM7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJY2hhciBjOworCisJcnZ3LT5yZXNlcnZlZCA9IE5VTEw7CisKKwlpZiAoIWl0ZXIpCisJCXJldHVybiBzOworCisJYyA9IF9nZXRfYW5kX3NraXBfcXVvdGVfY2hhcigmdG1wX3MpOworCWlmICghKHRtcF9zID0gX3Rva192YWx1ZV9zdHJpbmcodG1wX3MsICZ0bXBfYmVnaW4sICZ0bXBfZW5kLCBjLCBTRUxfQU5EIHwgU0VMX09SIHwgU0VMX1BSRUNFREVOQ0VfUEUsIE5VTEwpKSkKKwkJcmV0dXJuIHM7CisKKwl3aGlsZSAoaXRlci0+dmFsdWUpIHsKKwkJaWYgKCEoaXRlci0+dHlwZSAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spKSB7CisJCQkvKiBETV9SRVBPUlRfRklFTERfVFlQRV9OT05FIC0gcGVyLWZpZWxkIHJlc2VydmVkIHZhbHVlICovCisJCQlmcnYgPSAoY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF9yZXNlcnZlZF92YWx1ZSAqKSBpdGVyLT52YWx1ZTsKKwkJCWlmICgoZnJ2LT5maWVsZF9udW0gPT0gZmllbGRfbnVtKSAmJiAobmFtZSA9IF9yZXNlcnZlZF9uYW1lKHJoLCBpdGVyLCBmcnYsIGZpZWxkX251bSwKKwkJCQkJCQkJCQkgICAgdG1wX2JlZ2luLCB0bXBfZW5kIC0gdG1wX2JlZ2luKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoaXRlci0+dHlwZSAmIHR5cGUpIHsKKwkJCS8qIERNX1JFUE9SVF9GSUVMRF9UWVBFXyogLSBwZXItdHlwZSByZXNlcnZlZCB2YWx1ZSAqLworCQkJaWYgKChuYW1lID0gX3Jlc2VydmVkX25hbWUocmgsIGl0ZXIsIE5VTEwsIGZpZWxkX251bSwKKwkJCQkJCSAgIHRtcF9iZWdpbiwgdG1wX2VuZCAtIHRtcF9iZWdpbikpKQorCQkJCWJyZWFrOworCQl9CisJCWl0ZXIrKzsKKwl9CisKKwlpZiAobmFtZSkgeworCQkvKiBmb3VuZCEgKi8KKwkJKmJlZ2luID0gdG1wX2JlZ2luOworCQkqZW5kID0gdG1wX2VuZDsKKwkJcyA9IHRtcF9zOworCQlydnctPnJlc2VydmVkID0gaXRlcjsKKwkJcnZ3LT5tYXRjaGVkX25hbWUgPSBuYW1lOworCX0KKworCXJldHVybiBzOworfQorCitmbG9hdCBkbV9wZXJjZW50X3RvX2Zsb2F0KGRtX3BlcmNlbnRfdCBwZXJjZW50KQoreworCS8qIEFkZCAwLmYgdG8gcHJldmVudCByZXR1cm5pbmcgLTAuMDAgKi8KKwlyZXR1cm4gKGZsb2F0KSBwZXJjZW50IC8gRE1fUEVSQ0VOVF8xICsgMC5mOworfQorCitkbV9wZXJjZW50X3QgZG1fbWFrZV9wZXJjZW50KHVpbnQ2NF90IG51bWVyYXRvciwgdWludDY0X3QgZGVub21pbmF0b3IpCit7CisJZG1fcGVyY2VudF90IHBlcmNlbnQ7CisKKwlpZiAoIWRlbm9taW5hdG9yKQorCQlyZXR1cm4gRE1fUEVSQ0VOVF8xMDA7IC8qIEZJWE1FPyAqLworCWlmICghbnVtZXJhdG9yKQorCQlyZXR1cm4gRE1fUEVSQ0VOVF8wOworCWlmIChudW1lcmF0b3IgPT0gZGVub21pbmF0b3IpCisJCXJldHVybiBETV9QRVJDRU5UXzEwMDsKKwlzd2l0Y2ggKHBlcmNlbnQgPSBETV9QRVJDRU5UXzEwMCAqICgoZG91YmxlKSBudW1lcmF0b3IgLyAoZG91YmxlKSBkZW5vbWluYXRvcikpIHsKKwkJY2FzZSBETV9QRVJDRU5UXzEwMDoKKwkJCXJldHVybiBETV9QRVJDRU5UXzEwMCAtIDE7CisJCWNhc2UgRE1fUEVSQ0VOVF8wOgorCQkJcmV0dXJuIERNX1BFUkNFTlRfMCArIDE7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gcGVyY2VudDsKKwl9Cit9CisKK2ludCBkbV9yZXBvcnRfdmFsdWVfY2FjaGVfc2V0KHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpkYXRhKQoreworCWlmICghcmgtPnZhbHVlX2NhY2hlICYmICghKHJoLT52YWx1ZV9jYWNoZSA9IGRtX2hhc2hfY3JlYXRlKDY0KSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjYWNoZSBmb3IgdmFsdWVzIHVzZWQgZHVyaW5nIHJlcG9ydGluZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGRtX2hhc2hfaW5zZXJ0KHJoLT52YWx1ZV9jYWNoZSwgbmFtZSwgKHZvaWQgKikgZGF0YSk7Cit9CisKK2NvbnN0IHZvaWQgKmRtX3JlcG9ydF92YWx1ZV9jYWNoZV9nZXQoc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChyaC0+dmFsdWVfY2FjaGUpID8gZG1faGFzaF9sb29rdXAocmgtPnZhbHVlX2NhY2hlLCBuYW1lKSA6IE5VTEw7Cit9CisKKy8qCisgKiBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHJlc2VydmVkX3ZhbHVlcyBkZWZpbml0aW9uIHBhc3NlZCB0bworICogZG1fcmVwb3J0X2luaXRfd2l0aF9zZWxlY3Rpb24gY29udGFpbnMgb25seSBzdXBwb3J0ZWQgcmVzZXJ2ZWQgdmFsdWUgdHlwZXMuCisgKi8KK3N0YXRpYyBpbnQgX2NoZWNrX3Jlc2VydmVkX3ZhbHVlc19zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlIGZpZWxkc1tdLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSByZXNlcnZlZF92YWx1ZXNbXSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X3Jlc2VydmVkX3ZhbHVlICppdGVyOworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfcmVzZXJ2ZWRfdmFsdWUgKmZpZWxkX3JlczsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgKmZpZWxkOworCXN0YXRpYyB1aW50MzJfdCBzdXBwb3J0ZWRfcmVzZXJ2ZWRfdHlwZXMgPSBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIgfAorCQkJCQkJICAgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRSB8CisJCQkJCQkgICBETV9SRVBPUlRfRklFTERfVFlQRV9QRVJDRU5UIHwKKwkJCQkJCSAgIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORyB8CisJCQkJCQkgICBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FOworCXN0YXRpYyB1aW50MzJfdCBzdXBwb3J0ZWRfcmVzZXJ2ZWRfdHlwZXNfd2l0aF9yYW5nZSA9IERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9SQU5HRSB8CisJCQkJCQkJICAgICAgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSIHwKKwkJCQkJCQkgICAgICBETV9SRVBPUlRfRklFTERfVFlQRV9TSVpFIHwKKwkJCQkJCQkgICAgICBETV9SRVBPUlRfRklFTERfVFlQRV9QRVJDRU5UIHwKKwkJCQkJCQkgICAgICBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FOworCisKKwlpZiAoIXJlc2VydmVkX3ZhbHVlcykKKwkJcmV0dXJuIDE7CisKKwlpdGVyID0gcmVzZXJ2ZWRfdmFsdWVzOworCisJd2hpbGUgKGl0ZXItPnZhbHVlKSB7CisJCWlmIChpdGVyLT50eXBlICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTUFTSykgeworCQkJaWYgKCEoaXRlci0+dHlwZSAmIHN1cHBvcnRlZF9yZXNlcnZlZF90eXBlcykgfHwKKwkJCSAgICAoKGl0ZXItPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UpICYmCisJCQkgICAgICEoaXRlci0+dHlwZSAmIHN1cHBvcnRlZF9yZXNlcnZlZF90eXBlc193aXRoX3JhbmdlKSkpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jaGVja19yZXNlcnZlZF92YWx1ZXNfc3VwcG9ydGVkOiAiCisJCQkJCSAgImdsb2JhbCByZXNlcnZlZCB2YWx1ZSBmb3IgdHlwZSAweCV4IG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkgICBpdGVyLT50eXBlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZpZWxkX3JlcyA9IChjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3Jlc2VydmVkX3ZhbHVlICopIGl0ZXItPnZhbHVlOworCQkJZmllbGQgPSAmZmllbGRzW2ZpZWxkX3Jlcy0+ZmllbGRfbnVtXTsKKwkJCWlmICghKGZpZWxkLT5mbGFncyAmIHN1cHBvcnRlZF9yZXNlcnZlZF90eXBlcykgfHwKKwkJCSAgICAoKGl0ZXItPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UpICYmCisJCQkgICAgICEoaXRlci0+dHlwZSAmIHN1cHBvcnRlZF9yZXNlcnZlZF90eXBlc193aXRoX3JhbmdlKSkpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jaGVja19yZXNlcnZlZF92YWx1ZXNfc3VwcG9ydGVkOiAiCisJCQkJCSAgImZpZWxkLXNwZWNpZmljIHJlc2VydmVkIHZhbHVlIG9mIHR5cGUgMHgleCBmb3IgIgorCQkJCQkgICJmaWVsZCAlcyBub3Qgc3VwcG9ydGVkIiwKKwkJCQkJICAgZmllbGQtPmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTUFTSywgZmllbGQtPmlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpdGVyKys7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJbnB1dDoKKyAqICAgZnQgICAgICAgICAgICAgIC0gZmllbGQgdHlwZSBmb3Igd2hpY2ggdGhlIHZhbHVlIGlzIHBhcnNlZAorICogICBzICAgICAgICAgICAgICAgLSBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCBzdHJpbmcKKyAqIE91dHB1dDoKKyAqICAgYmVnaW4gICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRva2VuCisgKiAgIGVuZCAgICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSB0b2tlbiArIDEKKyAqICAgZmxhZ3MgICAgICAgICAgIC0gcGFyc2luZyBmbGFncworICovCitzdGF0aWMgY29uc3QgY2hhciAqX3Rva192YWx1ZV9yZWdleChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmdCwKKwkJCQkgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmJlZ2luLAorCQkJCSAgICBjb25zdCBjaGFyICoqZW5kLCB1aW50MzJfdCAqZmxhZ3MsCisJCQkJICAgIHN0cnVjdCByZXNlcnZlZF92YWx1ZV93cmFwcGVyICpydncpCit7CisJY2hhciBjOworCXJ2dy0+cmVzZXJ2ZWQgPSBOVUxMOworCisJcyA9IF9za2lwX3NwYWNlKHMpOworCisJaWYgKCEqcykgeworCQlsb2dfZXJyb3IoIlJlZ3VsYXIgZXhwcmVzc2lvbiBleHBlY3RlZCBmb3Igc2VsZWN0aW9uIGZpZWxkICVzIiwgZnQtPmlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoICgqcykgeworCQljYXNlICcoJzogYyA9ICcpJzsgYnJlYWs7CisJCWNhc2UgJ3snOiBjID0gJ30nOyBicmVhazsKKwkJY2FzZSAnWyc6IGMgPSAnXSc7IGJyZWFrOworCQljYXNlICciJzogLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ1wnJzogYyA9ICpzOyBicmVhazsKKwkJZGVmYXVsdDogIGMgPSAwOworCX0KKworCWlmICghKHMgPSBfdG9rX3ZhbHVlX3N0cmluZyhjID8gcyArIDEgOiBzLCBiZWdpbiwgZW5kLCBjLCBTRUxfQU5EIHwgU0VMX09SIHwgU0VMX1BSRUNFREVOQ0VfUEUsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBwYXJzZSByZWdleCB2YWx1ZSBmb3Igc2VsZWN0aW9uIGZpZWxkICVzLiIsIGZ0LT5pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpmbGFncyB8PSBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkc7CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgX3N0cl9saXN0X2l0ZW1fY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0cl9saXN0ICogY29uc3QgKml0ZW1fYSA9IChjb25zdCBzdHJ1Y3QgZG1fc3RyX2xpc3QgKiBjb25zdCAqKSBhOworCWNvbnN0IHN0cnVjdCBkbV9zdHJfbGlzdCAqIGNvbnN0ICppdGVtX2IgPSAoY29uc3Qgc3RydWN0IGRtX3N0cl9saXN0ICogY29uc3QgKikgYjsKKworCXJldHVybiBzdHJjbXAoKCppdGVtX2EpLT5zdHIsICgqaXRlbV9iKS0+c3RyKTsKK30KKworc3RhdGljIGludCBfYWRkX2l0ZW1fdG9fc3RyaW5nX2xpc3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqYmVnaW4sCisJCQkJICAgIGNvbnN0IGNoYXIgKmVuZCwgc3RydWN0IGRtX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGRtX3N0cl9saXN0ICppdGVtOworCisJaWYgKCEoaXRlbSA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCppdGVtKSkpIHx8CisJICAgICEoaXRlbS0+c3RyID0gYmVnaW4gPT0gZW5kID8gIiIgOiBkbV9wb29sX3N0cm5kdXAobWVtLCBiZWdpbiwgZW5kIC0gYmVnaW4pKSkgeworCQlsb2dfZXJyb3IoIl9hZGRfaXRlbV90b19zdHJpbmdfbGlzdDogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBzdHJpbmcgbGlzdCBpdGVtIik7CisJCXJldHVybiAwOworCX0KKwlkbV9saXN0X2FkZChsaXN0LCAmaXRlbS0+bGlzdCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIElucHV0OgorICogICBmdCAgICAgICAgICAgICAgLSBmaWVsZCB0eXBlIGZvciB3aGljaCB0aGUgdmFsdWUgaXMgcGFyc2VkCisgKiAgIG1lbSAgICAgICAgICAgICAtIG1lbW9yeSBwb29sIHRvIGFsbG9jYXRlIGZyb20KKyAqICAgcyAgICAgICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgc3RyaW5nCisgKiBPdXRwdXQ6CisgKiAgIGJlZ2luICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b2tlbiAod2hvbGUgbGlzdCkKKyAqICAgZW5kICAgICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHRva2VuICsgMSAod2hvbGUgbGlzdCkKKyAqICAgc2VsX3N0cl9saXN0ICAgIC0gdGhlIGxpc3Qgb2Ygc3RyaW5ncyBwYXJzZWQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKl90b2tfdmFsdWVfc3RyaW5nX2xpc3QoY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmdCwKKwkJCQkJICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpzLAorCQkJCQkgIGNvbnN0IGNoYXIgKipiZWdpbiwgY29uc3QgY2hhciAqKmVuZCwKKwkJCQkJICBzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICoqc2VsX3N0cl9saXN0KQoreworCXN0YXRpYyBjb25zdCBjaGFyIF9zdHJfbGlzdF9pdGVtX3BhcnNpbmdfZmFpbGVkW10gPSAiRmFpbGVkIHRvIHBhcnNlIHN0cmluZyBsaXN0IHZhbHVlICIKKwkJCQkJCQkgICAgImZvciBzZWxlY3Rpb24gZmllbGQgJXMuIjsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICpzc2wgPSBOVUxMOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqaXRlbTsKKwljb25zdCBjaGFyICpiZWdpbl9pdGVtLCAqZW5kX2l0ZW0sICp0bXA7CisJdWludDMyX3Qgb3BfZmxhZ3MsIGVuZF9vcF9mbGFnX2V4cGVjdGVkLCBlbmRfb3BfZmxhZ19oaXQgPSAwOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqKmFycjsKKwlzaXplX3QgbGlzdF9zaXplOworCXVuc2lnbmVkIGludCBpOworCWludCBsaXN0X2VuZCA9IDA7CisJY2hhciBjOworCisJaWYgKCEoc3NsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqc3NsKSkpKSB7CisJCWxvZ19lcnJvcigiX3Rva192YWx1ZV9zdHJpbmdfbGlzdDogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBzZWxlY3Rpb24gbGlzdCIpOworCQlnb3RvIGJhZDsKKwl9CisJZG1fbGlzdF9pbml0KCZzc2wtPnN0cl9saXN0Lmxpc3QpOworCXNzbC0+dHlwZSA9IDA7CisJKmJlZ2luID0gczsKKworCWlmICghKG9wX2ZsYWdzID0gX3Rva19vcF9sb2cocywgJnRtcCwgU0VMX0xJU1RfTFMgfCBTRUxfTElTVF9TVUJTRVRfTFMpKSkgeworCQkvKiBPbmx5IG9uZSBpdGVtIC0gU0VMX0xJU1Rfe1NVQlNFVF99TFMgYW5kIFNFTF9MSVNUX3tTVUJTRVRffUxFIG5vdCB1c2VkICovCisJCWMgPSBfZ2V0X2FuZF9za2lwX3F1b3RlX2NoYXIoJnMpOworCQlpZiAoIShzID0gX3Rva192YWx1ZV9zdHJpbmcocywgJmJlZ2luX2l0ZW0sICZlbmRfaXRlbSwgYywgU0VMX0FORCB8IFNFTF9PUiB8IFNFTF9QUkVDRURFTkNFX1BFLCBOVUxMKSkpIHsKKwkJCWxvZ19lcnJvcihfc3RyX2xpc3RfaXRlbV9wYXJzaW5nX2ZhaWxlZCwgZnQtPmlkKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmICghX2FkZF9pdGVtX3RvX3N0cmluZ19saXN0KG1lbSwgYmVnaW5faXRlbSwgZW5kX2l0ZW0sICZzc2wtPnN0cl9saXN0Lmxpc3QpKQorCQkJZ290b19iYWQ7CisJCXNzbC0+dHlwZSA9IFNFTF9PUiB8IFNFTF9MSVNUX0xTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBNb3JlIHRoYW4gb25lIGl0ZW0gLSBpdGVtcyBlbmNsb3NlZCBpbiBTRUxfTElTVF9MUyBhbmQgU0VMX0xJU1RfTEUKKwkgKiBvciBTRUxfTElTVF9TVUJTRVRfTFMgYW5kIFNFTF9MSVNUX1NVQlNFVF9MRS4KKwkgKiBFYWNoIGVsZW1lbnQgaXMgdGVybWluYXRlZCBieSBBTkQgb3IgT1Igb3BlcmF0b3Igb3IgJ2xpc3QgZW5kJy4KKwkgKiBUaGUgZmlyc3Qgb3BlcmF0b3IgaGl0IGlzIHRoZW4gdGhlIG9uZSBhbGxvd2VkIGZvciB0aGUgd2hvbGUgbGlzdCwKKwkgKiBubyBtaXhpbmcgYWxsb3dlZCEKKwkgKi8KKworCS8qIEFyZSB3ZSB1c2luZyBbXSBvciB7fSBmb3IgdGhlIGxpc3Q/ICovCisJZW5kX29wX2ZsYWdfZXhwZWN0ZWQgPSAob3BfZmxhZ3MgPT0gU0VMX0xJU1RfTFMpID8gU0VMX0xJU1RfTEUgOiBTRUxfTElTVF9TVUJTRVRfTEU7CisKKwlvcF9mbGFncyA9IFNFTF9MSVNUX0xFIHwgU0VMX0xJU1RfU1VCU0VUX0xFIHwgU0VMX0FORCB8IFNFTF9PUjsKKwlzKys7CisJd2hpbGUgKCpzKSB7CisJCXMgPSBfc2tpcF9zcGFjZShzKTsKKwkJYyA9IF9nZXRfYW5kX3NraXBfcXVvdGVfY2hhcigmcyk7CisJCWlmICghKHMgPSBfdG9rX3ZhbHVlX3N0cmluZyhzLCAmYmVnaW5faXRlbSwgJmVuZF9pdGVtLCBjLCBvcF9mbGFncywgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoX3N0cl9saXN0X2l0ZW1fcGFyc2luZ19mYWlsZWQsIGZ0LT5pZCk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlzID0gX3NraXBfc3BhY2Uocyk7CisKKwkJaWYgKCEoZW5kX29wX2ZsYWdfaGl0ID0gX3Rva19vcF9sb2cocywgJnRtcCwgb3BfZmxhZ3MpKSkgeworCQkJbG9nX2Vycm9yKCJJbnZhbGlkIG9wZXJhdG9yIGluIHNlbGVjdGlvbiBsaXN0LiIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoZW5kX29wX2ZsYWdfaGl0ICYgKFNFTF9MSVNUX0xFIHwgU0VMX0xJU1RfU1VCU0VUX0xFKSkgeworCQkJbGlzdF9lbmQgPSAxOworCQkJaWYgKGVuZF9vcF9mbGFnX2hpdCAhPSBlbmRfb3BfZmxhZ19leHBlY3RlZCkgeworCQkJCWZvciAoaSA9IDA7IF9vcF9sb2dbaV0uc3RyaW5nOyBpKyspCisJCQkJCWlmIChfb3BfbG9nW2ldLmZsYWdzID09IGVuZF9vcF9mbGFnX2V4cGVjdGVkKQorCQkJCQkJYnJlYWs7CisJCQkJbG9nX2Vycm9yKCJMaXN0IGVuZGVkIHdpdGggaW5jb3JyZWN0IGNoYXJhY3RlciwgIgorCQkJCQkgICJleHBlY3RpbmcgXCclc1wnLiIsIF9vcF9sb2dbaV0uc3RyaW5nKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCisJCWlmIChzc2wtPnR5cGUpIHsKKwkJCWlmICghbGlzdF9lbmQgJiYgIShzc2wtPnR5cGUgJiBlbmRfb3BfZmxhZ19oaXQpKSB7CisJCQkJbG9nX2Vycm9yKCJPbmx5IG9uZSB0eXBlIG9mIGxvZ2ljYWwgb3BlcmF0b3IgYWxsb3dlZCAiCisJCQkJCSAgImluIHNlbGVjdGlvbiBsaXN0IGF0IGEgdGltZS4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChsaXN0X2VuZCkKKwkJCQlzc2wtPnR5cGUgPSBlbmRfb3BfZmxhZ19leHBlY3RlZCA9PSBTRUxfTElTVF9MRSA/IFNFTF9BTkQgOiBTRUxfT1I7CisJCQllbHNlCisJCQkJc3NsLT50eXBlID0gZW5kX29wX2ZsYWdfaGl0OworCQl9CisKKwkJaWYgKCFfYWRkX2l0ZW1fdG9fc3RyaW5nX2xpc3QobWVtLCBiZWdpbl9pdGVtLCBlbmRfaXRlbSwgJnNzbC0+c3RyX2xpc3QubGlzdCkpCisJCQlnb3RvX2JhZDsKKworCQlzID0gdG1wOworCisJCWlmIChsaXN0X2VuZCkKKwkJCWJyZWFrOworCX0KKworCWlmICghKGVuZF9vcF9mbGFnX2hpdCAmIChTRUxfTElTVF9MRSB8IFNFTF9MSVNUX1NVQlNFVF9MRSkpKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBsaXN0IGVuZCBmb3Igc2VsZWN0aW9uIGZpZWxkICVzIiwgZnQtPmlkKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogU3RvcmUgaW5mb3JtYXRpb24gd2hldGhlciBbXSBvciB7fSB3YXMgdXNlZC4gKi8KKwlpZiAoZW5kX29wX2ZsYWdfZXhwZWN0ZWQgPT0gU0VMX0xJU1RfTEUpCisJCXNzbC0+dHlwZSB8PSBTRUxfTElTVF9MUzsKKwllbHNlCisJCXNzbC0+dHlwZSB8PSBTRUxfTElTVF9TVUJTRVRfTFM7CisKKwkvKiBTb3J0IHRoZSBsaXN0LiAqLworCWlmICghKGxpc3Rfc2l6ZSA9IGRtX2xpc3Rfc2l6ZSgmc3NsLT5zdHJfbGlzdC5saXN0KSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfdG9rX3ZhbHVlX3N0cmluZ19saXN0OiBsaXN0IGhhcyBubyBpdGVtcyIpOworCQlnb3RvIGJhZDsKKwl9IGVsc2UgaWYgKGxpc3Rfc2l6ZSA9PSAxKQorCQlnb3RvIG91dDsKKwlpZiAoIShhcnIgPSBkbV9tYWxsb2Moc2l6ZW9mKGl0ZW0pICogbGlzdF9zaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJfdG9rX3ZhbHVlX3N0cmluZ19saXN0OiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHNvcnQgYXJyYXkiKTsKKwkJZ290byBiYWQ7CisJfQorCisJaSA9IDA7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGl0ZW0sICZzc2wtPnN0cl9saXN0Lmxpc3QpCisJCWFycltpKytdID0gaXRlbTsKKwlxc29ydChhcnIsIGxpc3Rfc2l6ZSwgc2l6ZW9mKGl0ZW0pLCBfc3RyX2xpc3RfaXRlbV9jbXApOworCWRtX2xpc3RfaW5pdCgmc3NsLT5zdHJfbGlzdC5saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspCisJCWRtX2xpc3RfYWRkKCZzc2wtPnN0cl9saXN0Lmxpc3QsICZhcnJbaV0tPmxpc3QpOworCisJZG1fZnJlZShhcnIpOworb3V0OgorCSplbmQgPSBzOworICAgICAgICBpZiAoc2VsX3N0cl9saXN0KQorCQkqc2VsX3N0cl9saXN0ID0gc3NsOworCisJcmV0dXJuIHM7CitiYWQ6CisJKmVuZCA9IHM7CisJaWYgKHNzbCkKKwkJZG1fcG9vbF9mcmVlKG1lbSwgc3NsKTsKKyAgICAgICAgaWYgKHNlbF9zdHJfbGlzdCkKKwkJKnNlbF9zdHJfbGlzdCA9IE5VTEw7CisJcmV0dXJuIHM7Cit9CisKK3N0cnVjdCB0aW1lX3ZhbHVlIHsKKwlpbnQgcmFuZ2U7CisJdGltZV90IHQxOworCXRpbWVfdCB0MjsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpfb3V0X29mX3JhbmdlX21zZyA9ICJGaWVsZCBzZWxlY3Rpb24gdmFsdWUgJXMgb3V0IG9mIHN1cHBvcnRlZCByYW5nZSBmb3IgZmllbGQgJXMuIjsKKworLyoKKyAqIFN0YW5kYXJkIGZvcm1hdHRlZCBkYXRlIGFuZCB0aW1lIC0gSVNPODYwMS4KKyAqCisgKiBkYXRlIHRpbWUgdGltZXpvbmUKKyAqCisgKiBkYXRlOgorICogWVlZWS1NTS1ERCAob3Igc2hvcnRseSBZWVlZTU1ERCkKKyAqIFlZWVktTU0gKHNob3J0bHkgWVlZWU1NKSwgYXV0byBERD0xCisgKiBZWVlZLCBhdXRvIE1NPTAxIGFuZCBERD0wMQorICoKKyAqIHRpbWU6CisgKiBoaDptbTpzcyAob3Igc2hvcnRseSBoaG1tc3MpCisgKiBoaDptbSAob3Igc2hvcnRseSBoaG1tKSwgYXV0byBzcz0wCisgKiBoaCAob3Igc2hvcnRseSBoaCksIGF1dG8gbW09MCwgYXV0byBzcz0wCisgKgorICogdGltZXpvbmU6CisgKiAraGg6bW0gb3IgLWhoOm1tIChvciBzaG9ydGx5ICtoaG1tIG9yIC1oaG1tKQorICogK2hoIG9yIC1oaAorKi8KKworI2RlZmluZSBERUxJTV9EQVRFICctJworI2RlZmluZSBERUxJTV9USU1FICc6JworCitzdGF0aWMgaW50IF9kYXlzX2luX21vbnRoWzEyXSA9IHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworc3RhdGljIGludCBfaXNfbGVhcF95ZWFyKGxvbmcgeWVhcikKK3sKKwlyZXR1cm4gKCgoeWVhciAlIDQ9PTApICYmICh5ZWFyICUgMTAwICE9IDApKSB8fCAoeWVhciAlIDQwMCA9PSAwKSk7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9kYXlzX2luX21vbnRoKGxvbmcgbW9udGgsIGxvbmcgeWVhcikKK3sKKwlyZXR1cm4gKG1vbnRoID09IDIgJiYgX2lzX2xlYXBfeWVhcih5ZWFyKSkgPyBfZGF5c19pbl9tb250aFttb250aC0xXSArIDEKKwkJCQkJCSAgIDogX2RheXNfaW5fbW9udGhbbW9udGgtMV07Cit9CisKK3R5cGVkZWYgZW51bSB7CisJUkFOR0VfTk9ORSwKKwlSQU5HRV9TRUNPTkQsCisJUkFOR0VfTUlOVVRFLAorCVJBTkdFX0hPVVIsCisJUkFOR0VfREFZLAorCVJBTkdFX01PTlRILAorCVJBTkdFX1lFQVIKK30gdGltZV9yYW5nZV90OworCitzdGF0aWMgY2hhciAqX2dldF9kYXRlKGNoYXIgKnN0ciwgc3RydWN0IHRtICp0bSwgdGltZV9yYW5nZV90ICpyYW5nZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBpbmNvcnJlY3RfZGF0ZV9mb3JtYXRfbXNnW10gPSAiSW5jb3JyZWN0IGRhdGUgZm9ybWF0LiI7CisJdGltZV9yYW5nZV90IHRtcF9yYW5nZSA9IFJBTkdFX05PTkU7CisJbG9uZyBuMSwgbjIgPSAtMSwgbjMgPSAtMTsKKwljaGFyICpzID0gc3RyLCAqZW5kOworCXNpemVfdCBsZW4gPSAwOworCisJaWYgKCFpc2RpZ2l0KCpzKSkKKwkJLyogd2UgbmVlZCBhIHllYXIgYXQgbGVhc3QgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwluMSA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CisJaWYgKCplbmQgPT0gREVMSU1fREFURSkgeworCQlsZW4gKz0gKDQgLSAoZW5kIC0gcykpOyAvKiBkaWZmIGluIGxlbmd0aCBmcm9tIHN0YW5kYXJkIFlZWVkgKi8KKwkJcyA9IGVuZCArIDE7CisJCWlmIChpc2RpZ2l0KCpzKSkgeworCQkJbjIgPSBzdHJ0b2wocywgJmVuZCwgMTApOworCQkJbGVuICs9ICgyIC0gKGVuZCAtIHMpKTsgLyogZGlmZiBpbiBsZW5ndGggZnJvbSBzdGFuZGFyZCBNTSAqLworCQkJaWYgKCplbmQgPT0gREVMSU1fREFURSkgeworCQkJCXMgPSBlbmQgKyAxOworCQkJCW4zID0gc3RydG9sKHMsICZlbmQsIDEwKTsKKwkJCQlsZW4gKz0gKDIgLSAoZW5kIC0gcykpOyAvKiBkaWZmIGluIGxlbmd0aCBmcm9tIHN0YW5kYXJkIEREICovCisJCQl9CisJCX0KKwl9CisKKwlsZW4gPSBsZW4gKyBlbmQgLSBzdHI7CisKKwkvKiB2YXJpYXRpb25zIGZyb20gc3RhbmRhcmQgWVlZWS1NTS1ERCAqLworCWlmIChuMyA9PSAtMSkgeworCQlpZiAobjIgPT0gLTEpIHsKKwkJCWlmIChsZW4gPT0gNCkgeworCQkJCS8qIFlZWVkgKi8KKwkJCQl0bXBfcmFuZ2UgPSBSQU5HRV9ZRUFSOworCQkJCW4zID0gbjIgPSAxOworCQkJfSBlbHNlIGlmIChsZW4gPT0gNikgeworCQkJCS8qIFlZWVlNTSAqLworCQkJCXRtcF9yYW5nZSA9IFJBTkdFX01PTlRIOworCQkJCW4zID0gMTsKKwkJCQluMiA9IG4xICUgMTAwOworCQkJCW4xID0gbjEgLyAxMDA7CisJCQl9IGVsc2UgaWYgKGxlbiA9PSA4KSB7CisJCQkJdG1wX3JhbmdlID0gUkFOR0VfREFZOworCQkJCS8qIFlZWVlNTUREICovCisJCQkJbjMgPSBuMSAlIDEwMDsKKwkJCQluMiA9IChuMSAvIDEwMCkgJSAxMDA7CisJCQkJbjEgPSBuMSAvIDEwMDAwOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoaW5jb3JyZWN0X2RhdGVfZm9ybWF0X21zZyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID09IDcpIHsKKwkJCQl0bXBfcmFuZ2UgPSBSQU5HRV9NT05USDsKKwkJCQkvKiBZWVlZLU1NICovCisJCQkJbjMgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoaW5jb3JyZWN0X2RhdGVfZm9ybWF0X21zZyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobjIgPCAxIHx8IG4yID4gMTIpIHsKKwkJbG9nX2Vycm9yKCJTcGVjaWZpZWQgbW9udGggb3V0IG9mIHJhbmdlLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobjMgPCAxIHx8IG4zID4gX2dldF9kYXlzX2luX21vbnRoKG4yLCBuMSkpIHsKKwkJbG9nX2Vycm9yKCJTcGVjaWZpZWQgZGF5IG91dCBvZiByYW5nZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHRtcF9yYW5nZSA9PSBSQU5HRV9OT05FKQorCQl0bXBfcmFuZ2UgPSBSQU5HRV9EQVk7CisKKwl0bS0+dG1feWVhciA9IG4xIC0gMTkwMDsKKwl0bS0+dG1fbW9uID0gbjIgLSAxOworCXRtLT50bV9tZGF5ID0gbjM7CisJKnJhbmdlID0gdG1wX3JhbmdlOworCisJcmV0dXJuIChjaGFyICopIF9za2lwX3NwYWNlKGVuZCk7Cit9CisKK3N0YXRpYyBjaGFyICpfZ2V0X3RpbWUoY2hhciAqc3RyLCBzdHJ1Y3QgdG0gKnRtLCB0aW1lX3JhbmdlX3QgKnJhbmdlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGluY29ycmVjdF90aW1lX2Zvcm1hdF9tc2dbXSA9ICJJbmNvcnJlY3QgdGltZSBmb3JtYXQuIjsKKwl0aW1lX3JhbmdlX3QgdG1wX3JhbmdlID0gUkFOR0VfTk9ORTsKKwlsb25nIG4xLCBuMiA9IC0xLCBuMyA9IC0xOworCWNoYXIgKnMgPSBzdHIsICplbmQ7CisJc2l6ZV90IGxlbiA9IDA7CisKKwlpZiAoIWlzZGlnaXQoKnMpKSB7CisJCS8qIHRpbWUgaXMgbm90IGNvbXB1bHNvcnkgKi8KKwkJdG0tPnRtX2hvdXIgPSB0bS0+dG1fbWluID0gdG0tPnRtX3NlYyA9IDA7CisJCXJldHVybiAoY2hhciAqKSBfc2tpcF9zcGFjZShzKTsKKwl9CisKKwluMSA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CisJaWYgKCplbmQgPT0gREVMSU1fVElNRSkgeworCQlsZW4gKz0gKDIgLSAoZW5kIC0gcykpOyAvKiBkaWZmIGluIGxlbmd0aCBmcm9tIHN0YW5kYXJkIEhIICovCisJCXMgPSBlbmQgKyAxOworCQlpZiAoaXNkaWdpdCgqcykpIHsKKwkJCW4yID0gc3RydG9sKHMsICZlbmQsIDEwKTsKKwkJCWxlbiArPSAoMiAtIChlbmQgLSBzKSk7IC8qIGRpZmYgaW4gbGVuZ3RoIGZyb20gc3RhbmRhcmQgTU0gKi8KKwkJCWlmICgqZW5kID09IERFTElNX1RJTUUpIHsKKwkJCQlzID0gZW5kICsgMTsKKwkJCQluMyA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CisJCQkJbGVuICs9ICgyIC0gKGVuZCAtIHMpKTsgLyogZGlmZiBpbiBsZW5ndGggZnJvbSBzdGFuZGFyZCBTUyAqLworCQkJfQorCQl9CisJfQorCisJbGVuID0gbGVuICsgZW5kIC0gc3RyOworCisJLyogdmFyaWF0aW9ucyBmcm9tIHN0YW5kYXJkIEhIOk1NOlNTICovCisJaWYgKG4zID09IC0xKSB7CisJCWlmIChuMiA9PSAtMSkgeworCQkJaWYgKGxlbiA9PSAyKSB7CisJCQkJLyogSEggKi8KKwkJCQl0bXBfcmFuZ2UgPSBSQU5HRV9IT1VSOworCQkJCW4zID0gbjIgPSAwOworCQkJfSBlbHNlIGlmIChsZW4gPT0gNCkgeworCQkJCS8qIEhITU0gKi8KKwkJCQl0bXBfcmFuZ2UgPSBSQU5HRV9NSU5VVEU7CisJCQkJbjMgPSAwOworCQkJCW4yID0gbjEgJSAxMDA7CisJCQkJbjEgPSBuMSAvIDEwMDsKKwkJCX0gZWxzZSBpZiAobGVuID09IDYpIHsKKwkJCQkvKiBISE1NU1MgKi8KKwkJCQl0bXBfcmFuZ2UgPSBSQU5HRV9TRUNPTkQ7CisJCQkJbjMgPSBuMSAlIDEwMDsKKwkJCQluMiA9IChuMSAvIDEwMCkgJSAxMDA7CisJCQkJbjEgPSBuMSAvIDEwMDAwOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoaW5jb3JyZWN0X3RpbWVfZm9ybWF0X21zZyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID09IDUpIHsKKwkJCQkvKiBISDpNTSAqLworCQkJCXRtcF9yYW5nZSA9IFJBTkdFX01JTlVURTsKKwkJCQluMyA9IDA7CisJCQl9IGVsc2UgeworCQkJCWxvZ19lcnJvcihpbmNvcnJlY3RfdGltZV9mb3JtYXRfbXNnKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChuMSA8IDAgfHwgbjEgPiAyMykgeworCQlsb2dfZXJyb3IoIlNwZWNpZmllZCBob3VycyBvdXQgb2YgcmFuZ2UuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChuMiA8IDAgfHwgbjIgPiA2MCkgeworCQlsb2dfZXJyb3IoIlNwZWNpZmllZCBtaW51dGVzIG91dCBvZiByYW5nZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG4zIDwgMCB8fCBuMyA+IDYwKSB7CisJCWxvZ19lcnJvcigiU3BlY2lmaWVkIHNlY29uZHMgb3V0IG9mIHJhbmdlLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBKdXN0IHRpbWUgd2l0aG91dCBleGFjdCBkYXRlIGlzIGluY29tcGxldGUhICovCisJaWYgKCpyYW5nZSAhPSBSQU5HRV9EQVkpIHsKKwkJbG9nX2Vycm9yKCJGdWxsIGRhdGUgc3BlY2lmaWNhdGlvbiBuZWVkZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXRtLT50bV9ob3VyID0gbjE7CisJdG0tPnRtX21pbiA9IG4yOworCXRtLT50bV9zZWMgPSBuMzsKKwkqcmFuZ2UgPSB0bXBfcmFuZ2U7CisKKwlyZXR1cm4gKGNoYXIgKikgX3NraXBfc3BhY2UoZW5kKTsKK30KKworLyogVGhlIG9mZnNldCBpcyBhbHdheXMgYW4gYWJzb2x1dGUgb2Zmc2V0IGFnYWluc3QgR01UISAqLworc3RhdGljIGNoYXIgKl9nZXRfdHooY2hhciAqc3RyLCBpbnQgKnR6X3N1cHBsaWVkLCBpbnQgKm9mZnNldCkKK3sKKwlsb25nIG4xLCBuMiA9IC0xOworCWNoYXIgKnMgPSBzdHIsICplbmQ7CisJaW50IHNpZ24gPSAxOyAvKiArSEg6TU0gYnkgZGVmYXVsdCAqLworCXNpemVfdCBsZW4gPSAwOworCisJKnR6X3N1cHBsaWVkID0gMDsKKwkqb2Zmc2V0ID0gMDsKKworCWlmICghaXNkaWdpdCgqcykpIHsKKwkJaWYgKCpzID09ICcrJykgIHsKKwkJCXNpZ24gPSAxOworCQkJcyA9IHMgKyAxOworCQl9IGVsc2UgaWYgKCpzID09ICctJykgeworCQkJc2lnbiA9IC0xOworCQkJcyA9IHMgKyAxOworCQl9IGVsc2UKKwkJCXJldHVybiAoY2hhciAqKSBfc2tpcF9zcGFjZShzKTsKKwl9CisKKwluMSA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CisJaWYgKCplbmQgPT0gREVMSU1fVElNRSkgeworCQlsZW4gPSAoMiAtIChlbmQgLSBzKSk7IC8qIGRpZmYgaW4gbGVuZ3RoIGZyb20gc3RhbmRhcmQgSEggKi8KKwkJcyA9IGVuZCArIDE7CisJCWlmIChpc2RpZ2l0KCpzKSkgeworCQkJbjIgPSBzdHJ0b2wocywgJmVuZCwgMTApOworCQkJbGVuID0gKDIgLSAoZW5kIC0gcykpOyAvKiBkaWZmIGluIGxlbmd0aCBmcm9tIHN0YW5kYXJkIE1NICovCisJCX0KKwl9CisKKwlsZW4gPSBsZW4gKyBlbmQgLSBzOworCisJLyogdmFyaWF0aW9ucyBmcm9tIHN0YW5kYXJkIEhIOk1NICovCisJaWYgKG4yID09IC0xKSB7CisJCWlmIChsZW4gPT0gMikgeworCQkJLyogSEggKi8KKwkJCW4yID0gMDsKKwkJfSBlbHNlIGlmIChsZW4gPT0gNCkgeworCQkJLyogSEhNTSAqLworCQkJbjIgPSBuMSAlIDEwMDsKKwkJCW4xID0gbjEgLyAxMDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG4yIDwgMCB8fCBuMiA+IDYwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuMSA8IDAgfHwgbjEgPiAxNCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiB0aW1lem9uZSBvZmZzZXQgaW4gc2Vjb25kcyAqLworCSpvZmZzZXQgPSBzaWduICogKChuMSAqIDM2MDApICsgKG4yICogNjApKTsKKwkqdHpfc3VwcGxpZWQgPSAxOworCXJldHVybiAoY2hhciAqKSBfc2tpcF9zcGFjZShlbmQpOworfQorCitzdGF0aWMgaW50IF9sb2NhbF90el9vZmZzZXQodGltZV90IHRfbG9jYWwpCit7CisJc3RydWN0IHRtIHRtX2dtdDsKKwl0aW1lX3QgdF9nbXQ7CisKKwlnbXRpbWVfcigmdF9sb2NhbCwgJnRtX2dtdCk7CisJdF9nbXQgPSBta3RpbWUoJnRtX2dtdCk7CisKKwkvKgorCSAqIGdtdGltZSByZXR1cm5zIHRpbWUgdGhhdCBpcyBhZGp1c3RlZAorCSAqIGZvciBEU1QuU3VidHJhY3QgdGhpcyBhZGp1c3RtZW50IGJhY2sKKwkgKiB0byBnaXZlIHVzIHByb3BlciAqYWJzb2x1dGUqIG9mZnNldAorCSAqIGZvciBvdXIgbG9jYWwgdGltZXpvbmUuCisJICovCisJaWYgKHRtX2dtdC50bV9pc2RzdCkKKwkJdF9nbXQgLT0gMzYwMDsKKworCXJldHVybiB0X2xvY2FsIC0gdF9nbXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9nZXRfZmluYWxfdGltZSh0aW1lX3JhbmdlX3QgcmFuZ2UsIHN0cnVjdCB0bSAqdG0sCisJCQkgICAgaW50IHR6X3N1cHBsaWVkLCBpbnQgb2Zmc2V0LAorCQkJICAgIHN0cnVjdCB0aW1lX3ZhbHVlICp0dmFsKQoreworCisJc3RydWN0IHRtIHRtX3VwID0gKnRtOworCisJc3dpdGNoIChyYW5nZSkgeworCQljYXNlIFJBTkdFX1NFQ09ORDoKKwkJCWlmICh0bV91cC50bV9zZWMgPCA1OSkgeworCQkJCXRtX3VwLnRtX3NlYyArPSAxOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFJBTkdFX01JTlVURToKKwkJCWlmICh0bV91cC50bV9taW4gPCA1OSkgeworCQkJCXRtX3VwLnRtX21pbiArPSAxOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFJBTkdFX0hPVVI6CisJCQlpZiAodG1fdXAudG1faG91ciA8IDIzKSB7CisJCQkJdG1fdXAudG1faG91ciArPSAxOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFJBTkdFX0RBWToKKwkJCWlmICh0bV91cC50bV9tZGF5IDwgX2dldF9kYXlzX2luX21vbnRoKHRtX3VwLnRtX21vbiwgdG1fdXAudG1feWVhcikpIHsKKwkJCQl0bV91cC50bV9tZGF5ICs9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgUkFOR0VfTU9OVEg6CisJCQlpZiAodG1fdXAudG1fbW9uIDwgMTEpIHsKKwkJCQl0bV91cC50bV9tb24gKz0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBSQU5HRV9ZRUFSOgorCQkJdG1fdXAudG1feWVhciArPSAxOworCQkJYnJlYWs7CisJCWNhc2UgUkFOR0VfTk9ORToKKwkJCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCQkJYnJlYWs7CisJfQorCisJdHZhbC0+cmFuZ2UgPSAocmFuZ2UgIT0gUkFOR0VfTk9ORSk7CisJdHZhbC0+dDEgPSBta3RpbWUodG0pOworCXR2YWwtPnQyID0gbWt0aW1lKCZ0bV91cCkgLSAxOworCisJaWYgKHR6X3N1cHBsaWVkKSB7CisJCS8qCisJCSAqIFRoZSAnb2Zmc2V0JyBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIEdNVC4KKwkJICogQ2FsY3VsYXRlIHdoYXQgdGhlIG9mZnNldCBpcyB3aXRoIHJlc3BlY3QKKwkJICogdG8gb3VyIGxvY2FsIHRpbWV6b25lIGFuZCBhZGp1c3QgdGltZXMKKwkJICogc28gdGhleSByZXByZXNlbnQgdGltZSBpbiBvdXIgbG9jYWwgdGltZXpvbmUuCisJCSAqLworCQlvZmZzZXQgLT0gX2xvY2FsX3R6X29mZnNldCh0dmFsLT50MSk7CisJCXR2YWwtPnQxIC09IG9mZnNldDsKKwkJdHZhbC0+dDIgLT0gb2Zmc2V0OworCX0KK30KKworc3RhdGljIGludCBfcGFyc2VfZm9ybWF0dGVkX2RhdGVfdGltZShjaGFyICpzdHIsIHN0cnVjdCB0aW1lX3ZhbHVlICp0dmFsKQoreworCXRpbWVfcmFuZ2VfdCByYW5nZSA9IFJBTkdFX05PTkU7CisJc3RydWN0IHRtIHRtID0gezB9OworCWludCBnbXRfb2Zmc2V0OworCWludCB0el9zdXBwbGllZDsKKworCXRtLnRtX3llYXIgPSB0bS50bV9tZGF5ID0gdG0udG1fbW9uID0gLTE7CisJdG0udG1faG91ciA9IHRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IC0xOworCXRtLnRtX2lzZHN0ID0gdG0udG1fd2RheSA9IHRtLnRtX3lkYXkgPSAtMTsKKworCWlmICghKHN0ciA9IF9nZXRfZGF0ZShzdHIsICZ0bSwgJnJhbmdlKSkpCisJCXJldHVybiAwOworCisJaWYgKCEoc3RyID0gX2dldF90aW1lKHN0ciwgJnRtLCAmcmFuZ2UpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShzdHIgPSBfZ2V0X3R6KHN0ciwgJnR6X3N1cHBsaWVkLCAmZ210X29mZnNldCkpKQorCQlyZXR1cm4gMDsKKworCWlmICgqc3RyKQorCQlyZXR1cm4gMDsKKworCV9nZXRfZmluYWxfdGltZShyYW5nZSwgJnRtLCB0el9zdXBwbGllZCwgZ210X29mZnNldCwgdHZhbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl90b2tfdmFsdWVfdGltZShjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgKmZ0LAorCQkJCSAgIHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnMsCisJCQkJICAgY29uc3QgY2hhciAqKmJlZ2luLCBjb25zdCBjaGFyICoqZW5kLAorCQkJCSAgIHN0cnVjdCB0aW1lX3ZhbHVlICp0dmFsKQoreworCWNoYXIgKnRpbWVfc3RyID0gTlVMTDsKKwljb25zdCBjaGFyICpyID0gTlVMTDsKKwl1aW50NjRfdCB0OworCWNoYXIgYzsKKworCXMgPSBfc2tpcF9zcGFjZShzKTsKKworCWlmICgqcyA9PSAnQCcpIHsKKwkJLyogQWJzb2x1dGUgdGltZSB2YWx1ZSBpbiBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBlcG9jaC4gKi8KKwkJaWYgKCEocyA9IF90b2tfdmFsdWVfbnVtYmVyKHMrMSwgYmVnaW4sIGVuZCkpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKCEodGltZV9zdHIgPSBkbV9wb29sX3N0cm5kdXAobWVtLCAqYmVnaW4sICplbmQgLSAqYmVnaW4pKSkgeworCQkJbG9nX2Vycm9yKCJfdG9rX3ZhbHVlX3RpbWU6IGRtX3Bvb2xfc3RybmR1cCBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCgodCA9IHN0cnRvdWxsKHRpbWVfc3RyLCBOVUxMLCAxMCkpID09IFVMTE9OR19NQVgpICYmIGVycm5vID09IEVSQU5HRSkgeworCQkJbG9nX2Vycm9yKF9vdXRfb2ZfcmFuZ2VfbXNnLCB0aW1lX3N0ciwgZnQtPmlkKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdHZhbC0+cmFuZ2UgPSAwOworCQl0dmFsLT50MSA9ICh0aW1lX3QpIHQ7CisJCXR2YWwtPnQyID0gMDsKKwkJciA9IHM7CisJfSBlbHNlIHsKKwkJYyA9IF9nZXRfYW5kX3NraXBfcXVvdGVfY2hhcigmcyk7CisJCWlmICghKHMgPSBfdG9rX3ZhbHVlX3N0cmluZyhzLCBiZWdpbiwgZW5kLCBjLCBTRUxfQU5EIHwgU0VMX09SIHwgU0VMX1BSRUNFREVOQ0VfUEUsIE5VTEwpKSkKKwkJCWdvdG9fb3V0OworCisJCWlmICghKHRpbWVfc3RyID0gZG1fcG9vbF9zdHJuZHVwKG1lbSwgKmJlZ2luLCAqZW5kIC0gKmJlZ2luKSkpIHsKKwkJCWxvZ19lcnJvcigidG9rX3ZhbHVlX3RpbWU6IGRtX3Bvb2xfc3RybmR1cCBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFfcGFyc2VfZm9ybWF0dGVkX2RhdGVfdGltZSh0aW1lX3N0ciwgdHZhbCkpCisJCQlnb3RvX291dDsKKwkJciA9IHM7CisJfQorb3V0OgorCWlmICh0aW1lX3N0cikKKwkJZG1fcG9vbF9mcmVlKG1lbSwgdGltZV9zdHIpOworCXJldHVybiByOworfQorCisvKgorICogSW5wdXQ6CisgKiAgIGZ0ICAgICAgICAgICAgICAtIGZpZWxkIHR5cGUgZm9yIHdoaWNoIHRoZSB2YWx1ZSBpcyBwYXJzZWQKKyAqICAgcyAgICAgICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgc3RyaW5nCisgKiAgIG1lbSAgICAgICAgICAgICAtIG1lbW9yeSBwb29sIHRvIGFsbG9jYXRlIGZyb20KKyAqIE91dHB1dDoKKyAqICAgYmVnaW4gICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRva2VuCisgKiAgIGVuZCAgICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSB0b2tlbiArIDEKKyAqICAgZmxhZ3MgICAgICAgICAgIC0gcGFyc2luZyBmbGFncworICogICBjdXN0b20gICAgICAgICAgLSBjdXN0b20gZGF0YSBzcGVjaWZpYyB0byB0b2tlbiB0eXBlCisgKiAgICAgICAgICAgICAgICAgICAgIChlLmcuIHNpemUgdW5pdCBmYWN0b3IpCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfdG9rX3ZhbHVlKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmdCwKKwkJCSAgICAgIHVpbnQzMl90IGZpZWxkX251bSwgaW50IGltcGxpY2l0LAorCQkJICAgICAgY29uc3QgY2hhciAqcywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKipiZWdpbiwgY29uc3QgY2hhciAqKmVuZCwKKwkJCSAgICAgIHVpbnQzMl90ICpmbGFncywKKwkJCSAgICAgIHN0cnVjdCByZXNlcnZlZF92YWx1ZV93cmFwcGVyICpydncsCisJCQkgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB2b2lkICpjdXN0b20pCit7CisJaW50IGV4cGVjdGVkX3R5cGUgPSBmdC0+ZmxhZ3MgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLOworCXN0cnVjdCBzZWxlY3Rpb25fc3RyX2xpc3QgKipzdHJfbGlzdDsKKwlzdHJ1Y3QgdGltZV92YWx1ZSAqdHZhbDsKKwl1aW50NjRfdCAqZmFjdG9yOworCWNvbnN0IGNoYXIgKnRtcDsKKwljaGFyIGM7CisKKwlzID0gX3NraXBfc3BhY2Uocyk7CisKKwlzID0gX2dldF9yZXNlcnZlZChyaCwgZXhwZWN0ZWRfdHlwZSwgZmllbGRfbnVtLCBpbXBsaWNpdCwgcywgYmVnaW4sIGVuZCwgcnZ3KTsKKwlpZiAocnZ3LT5yZXNlcnZlZCkgeworCQkvKgorCQkgKiBGTERfQ01QX05VTUJFUiBzaGFyZXMgb3BlcmF0b3JzIHdpdGggRkxEX0NNUF9USU1FLAorCQkgKiBzbyBhZGp1c3QgZmxhZ3MgaGVyZSBiYXNlZCBvbiBleHBlY3RlZCB0eXBlLgorCQkgKi8KKwkJaWYgKGV4cGVjdGVkX3R5cGUgPT0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRSkKKwkJCSpmbGFncyAmPSB+RkxEX0NNUF9OVU1CRVI7CisJCWVsc2UgaWYgKGV4cGVjdGVkX3R5cGUgPT0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSKQorCQkJKmZsYWdzICY9IH5GTERfQ01QX1RJTUU7CisJCSpmbGFncyB8PSBleHBlY3RlZF90eXBlOworCQlyZXR1cm4gczsKKwl9CisKKwlzd2l0Y2ggKGV4cGVjdGVkX3R5cGUpIHsKKworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORzoKKwkJCWMgPSBfZ2V0X2FuZF9za2lwX3F1b3RlX2NoYXIoJnMpOworCQkJaWYgKCEocyA9IF90b2tfdmFsdWVfc3RyaW5nKHMsIGJlZ2luLCBlbmQsIGMsIFNFTF9BTkQgfCBTRUxfT1IgfCBTRUxfUFJFQ0VERU5DRV9QRSwgTlVMTCkpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2Ugc3RyaW5nIHZhbHVlICIKKwkJCQkJICAiZm9yIHNlbGVjdGlvbiBmaWVsZCAlcy4iLCBmdC0+aWQpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJKmZsYWdzIHw9IERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORzsKKwkJCWJyZWFrOworCisJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1Q6CisJCQlpZiAoIShzdHJfbGlzdCA9IChzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICoqKSBjdXN0b20pKQorCQkJCWdvdG9fYmFkOworCisJCQlzID0gX3Rva192YWx1ZV9zdHJpbmdfbGlzdChmdCwgbWVtLCBzLCBiZWdpbiwgZW5kLCBzdHJfbGlzdCk7CisJCQlpZiAoISgqc3RyX2xpc3QpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2Ugc3RyaW5nIGxpc3QgdmFsdWUgIgorCQkJCQkgICJmb3Igc2VsZWN0aW9uIGZpZWxkICVzLiIsIGZ0LT5pZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkqZmxhZ3MgfD0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1Q7CisJCQlicmVhazsKKworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUjoKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkU6CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9QRVJDRU5UOgorCQkJaWYgKCEocyA9IF90b2tfdmFsdWVfbnVtYmVyKHMsIGJlZ2luLCBlbmQpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIG51bWVyaWMgdmFsdWUgIgorCQkJCQkgICJmb3Igc2VsZWN0aW9uIGZpZWxkICVzLiIsIGZ0LT5pZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWlmICgqcyA9PSBETV9QRVJDRU5UX0NIQVIpIHsKKwkJCQlzKys7CisJCQkJYyA9IERNX1BFUkNFTlRfQ0hBUjsKKwkJCQlpZiAoZXhwZWN0ZWRfdHlwZSAhPSBETV9SRVBPUlRfRklFTERfVFlQRV9QRVJDRU5UKSB7CisJCQkJCWxvZ19lcnJvcigiRm91bmQgcGVyY2VudCB2YWx1ZSBidXQgJXMgdmFsdWUgIgorCQkJCQkJICAiZXhwZWN0ZWQgZm9yIHNlbGVjdGlvbiBmaWVsZCAlcy4iLAorCQkJCQkJICBleHBlY3RlZF90eXBlID09IERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUiA/CisJCQkJCQkJIm51bWVyaWMiIDogInNpemUiLCBmdC0+aWQpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghKGZhY3RvciA9ICh1aW50NjRfdCAqKSBjdXN0b20pKQorCQkJCQlnb3RvX2JhZDsKKworCQkJCWlmICgoKmZhY3RvciA9IGRtX3VuaXRzX3RvX2ZhY3RvcihzLCAmYywgMCwgJnRtcCkpKSB7CisJCQkJCXMgPSB0bXA7CisJCQkJCWlmIChleHBlY3RlZF90eXBlICE9IERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUpIHsKKwkJCQkJCWxvZ19lcnJvcigiRm91bmQgc2l6ZSB1bml0IHNwZWNpZmllciAiCisJCQkJCQkJICAiYnV0ICVzIHZhbHVlIGV4cGVjdGVkIGZvciAiCisJCQkJCQkJICAic2VsZWN0aW9uIGZpZWxkICVzLiIsCisJCQkJCQkJICBleHBlY3RlZF90eXBlID09IERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUiA/CisJCQkJCQkJICAibnVtZXJpYyIgOiAicGVyY2VudCIsIGZ0LT5pZCk7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZXhwZWN0ZWRfdHlwZSA9PSBETV9SRVBPUlRfRklFTERfVFlQRV9TSVpFKSB7CisJCQkJCS8qCisJCQkJCSAqIElmIHNpemUgdW5pdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2VsZWN0aW9uCisJCQkJCSAqIGFuZCB0aGUgdHlwZSBleHBlY3RlZCBpcyBzaXplLCB1c2UgdXNlICdtJworCQkJCQkgKiAoMSBNaUIpIGZvciB0aGUgdW5pdCBieSBkZWZhdWx0LiBUaGlzIGlzIHRoZQorCQkJCQkgKiBzYW1lIGJlaGF2aW91ciBhcyBzZWVuIGluIGx2Y3JlYXRlIC1MIDxzaXplPi4KKwkJCQkJICovCisJCQkJCSpmYWN0b3IgPSAxMDI0KjEwMjQ7CisJCQkJfQorCQkJfQorCisJCQkqZmxhZ3MgfD0gZXhwZWN0ZWRfdHlwZTsKKwkJCS8qCisJCQkgKiBGTERfQ01QX05VTUJFUiBzaGFyZXMgb3BlcmF0b3JzIHdpdGggRkxEX0NNUF9USU1FLAorCQkJICogYnV0IHdlIGhhdmUgTlVNQkVSIGhlcmUsIHNvIHJlbW92ZSBGTERfQ01QX1RJTUUuCisJCQkgKi8KKwkJCSpmbGFncyAmPSB+RkxEX0NNUF9USU1FOworCQkJYnJlYWs7CisKKwkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FOgorCQkJaWYgKCEodHZhbCA9IChzdHJ1Y3QgdGltZV92YWx1ZSAqKSBjdXN0b20pKQorCQkJCWdvdG9fYmFkOworCisJCQlpZiAoIShzID0gX3Rva192YWx1ZV90aW1lKGZ0LCBtZW0sIHMsIGJlZ2luLCBlbmQsIHR2YWwpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIHRpbWUgdmFsdWUgIgorCQkJCQkgICJmb3Igc2VsZWN0aW9uIGZpZWxkICVzLiIsIGZ0LT5pZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCSpmbGFncyB8PSBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FOworCQkJLyoKKwkJCSAqIEZMRF9DTVBfVElNRSBzaGFyZXMgb3BlcmF0b3JzIHdpdGggRkxEX0NNUF9OVU1CRVIsCisJCQkgKiBidXQgd2UgaGF2ZSBUSU1FIGhlcmUsIHNvIHJlbW92ZSBGTERfQ01QX05VTUJFUi4KKwkJCSAqLworCQkJKmZsYWdzICY9IH5GTERfQ01QX05VTUJFUjsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzOworYmFkOgorCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiRm9yYmlkZGVuIE5VTEwgY3VzdG9tIGRldGVjdGVkLiIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBJbnB1dDoKKyAqICAgcyAgICAgICAgICAgICAgIC0gYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgc3RyaW5nCisgKiBPdXRwdXQ6CisgKiAgIGJlZ2luICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0b2tlbgorICogICBlbmQgICAgICAgICAgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgdG9rZW4gKyAxCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfdG9rX2ZpZWxkX25hbWUoY29uc3QgY2hhciAqcywKKwkJCQkgICAgY29uc3QgY2hhciAqKmJlZ2luLCBjb25zdCBjaGFyICoqZW5kKQoreworCWNoYXIgYzsKKwlzID0gX3NraXBfc3BhY2Uocyk7CisKKwkqYmVnaW4gPSBzOworCXdoaWxlICgoYyA9ICpzKSAmJgorCSAgICAgICAoaXNhbG51bShjKSB8fCBjID09ICdfJyB8fCBjID09ICctJykpCisJCXMrKzsKKwkqZW5kID0gczsKKworCWlmICgqYmVnaW4gPT0gKmVuZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGludCBfZ2V0X3Jlc2VydmVkX3ZhbHVlKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCB1aW50MzJfdCBmaWVsZF9udW0sCisJCQkgICAgICAgc3RydWN0IHJlc2VydmVkX3ZhbHVlX3dyYXBwZXIgKnJ2dykKK3sKKwljb25zdCB2b2lkICp0bXBfdmFsdWU7CisJZG1fcmVwb3J0X3Jlc2VydmVkX2hhbmRsZXIgaGFuZGxlcjsKKwlpbnQgcjsKKworCWlmICghcnZ3LT5yZXNlcnZlZCkgeworCQlydnctPnZhbHVlID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJ2dy0+cmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLKQorCQkvKiB0eXBlIHJlc2VydmVkIHZhbHVlICovCisJCXRtcF92YWx1ZSA9IHJ2dy0+cmVzZXJ2ZWQtPnZhbHVlOworCWVsc2UKKwkJLyogcGVyLWZpZWxkIHJlc2VydmVkIHZhbHVlICovCisJCXRtcF92YWx1ZSA9ICgoY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF9yZXNlcnZlZF92YWx1ZSAqKSBydnctPnJlc2VydmVkLT52YWx1ZSktPnZhbHVlOworCisJaWYgKHJ2dy0+cmVzZXJ2ZWQtPnR5cGUgJiAoRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX0RZTkFNSUNfVkFMVUUgfCBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfRlVaWllfTkFNRVMpKSB7CisJCWhhbmRsZXIgPSAoZG1fcmVwb3J0X3Jlc2VydmVkX2hhbmRsZXIpIHRtcF92YWx1ZTsKKwkJaWYgKChyID0gaGFuZGxlcihyaCwgcmgtPnNlbGVjdGlvbi0+bWVtLCBmaWVsZF9udW0sCisJCQkJIERNX1JFUE9SVF9SRVNFUlZFRF9HRVRfRFlOQU1JQ19WQUxVRSwKKwkJCQkgcnZ3LT5tYXRjaGVkX25hbWUsICZ0bXBfdmFsdWUpIDw9IDApKSB7CisJCQlpZiAociA9PSAtMSkKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIHJlc2VydmVkIHZhbHVlIGhhbmRsZXIgZm9yIGZpZWxkICVzIGhhcyBtaXNzaW5nIgorCQkJCQkgICJpbXBsZW1lbnRhdGlvbiBvZiBETV9SRVBPUlRfUkVTRVJWRURfR0VUX0RZTkFNSUNfVkFMVUUgYWN0aW9uIiwKKwkJCQkJICAocnZ3LT5yZXNlcnZlZC0+dHlwZSkgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLID8gInR5cGUtc3BlY2lmaWMiIDogImZpZWxkLXNwZWNpZmljIiwKKwkJCQkJICByaC0+ZmllbGRzW2ZpZWxkX251bV0uaWQpOworCQkJZWxzZQorCQkJCWxvZ19lcnJvcigiRXJyb3Igb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nICVzIHJlc2VydmVkIHZhbHVlIGhhbmRsZXIgZm9yIGZpZWxkICVzIiwKKwkJCQkJICAocnZ3LT5yZXNlcnZlZC0+dHlwZSkgJiBETV9SRVBPUlRfRklFTERfVFlQRV9NQVNLID8gInR5cGUtc3BlY2lmaWMiIDogImZpZWxkLXNwZWNpZmljIiwKKwkJCQkJICByaC0+ZmllbGRzW2ZpZWxkX251bV0uaWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlydnctPnZhbHVlID0gdG1wX3ZhbHVlOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGZpZWxkX3NlbGVjdGlvbiAqX2NyZWF0ZV9maWVsZF9zZWxlY3Rpb24oc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCQkgICAgICAgdWludDMyX3QgZmllbGRfbnVtLAorCQkJCQkJICAgICAgIGludCBpbXBsaWNpdCwKKwkJCQkJCSAgICAgICBjb25zdCBjaGFyICp2LAorCQkJCQkJICAgICAgIHNpemVfdCBsZW4sCisJCQkJCQkgICAgICAgdWludDMyX3QgZmxhZ3MsCisJCQkJCQkgICAgICAgc3RydWN0IHJlc2VydmVkX3ZhbHVlX3dyYXBwZXIgKnJ2dywKKwkJCQkJCSAgICAgICB2b2lkICpjdXN0b20pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKl9maWVsZF9zZWxlY3Rpb25fdmFsdWVfYWxsb2NfZmFpbGVkX21zZyA9ICJkbV9yZXBvcnQ6IHN0cnVjdCBmaWVsZF9zZWxlY3Rpb25fdmFsdWUgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHNlbGVjdGlvbiBmaWVsZCAlcyI7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHMgPSBpbXBsaWNpdCA/IF9pbXBsaWNpdF9yZXBvcnRfZmllbGRzCisJCQkJCQkJICAgICA6IHJoLT5maWVsZHM7CisJc3RydWN0IGZpZWxkX3Byb3BlcnRpZXMgKmZwLCAqZm91bmQgPSBOVUxMOworCXN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gKmZzOworCWNvbnN0IGNoYXIgKmZpZWxkX2lkOworCXN0cnVjdCB0aW1lX3ZhbHVlICp0dmFsOworCXVpbnQ2NF90IGZhY3RvcjsKKwljaGFyICpzOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGZwLCAmcmgtPmZpZWxkX3Byb3BzKSB7CisJCWlmICgoZnAtPmltcGxpY2l0ID09IGltcGxpY2l0KSAmJiAoZnAtPmZpZWxkX251bSA9PSBmaWVsZF9udW0pKSB7CisJCQlmb3VuZCA9IGZwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBUaGUgZmllbGQgaXMgbmVpdGhlciB1c2VkIGluIGRpc3BsYXkgb3B0aW9ucyBub3Igc29ydCBrZXlzLiAqLworCWlmICghZm91bmQpIHsKKwkJaWYgKHJoLT5zZWxlY3Rpb24tPmFkZF9uZXdfZmllbGRzKSB7CisJCQlpZiAoIShmb3VuZCA9IF9hZGRfZmllbGQocmgsIGZpZWxkX251bSwgaW1wbGljaXQsIEZMRF9ISURERU4pKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXJoLT5yZXBvcnRfdHlwZXMgfD0gZmllbGRzW2ZpZWxkX251bV0udHlwZTsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBzZWxlY3Rpb24gd2l0aCBmaWVsZCBcJyVzXCcgIgorCQkJCSAgIndoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiBjdXJyZW50IHJlcG9ydC4iLAorCQkJCSAgaW1wbGljaXQgPyBfaW1wbGljaXRfcmVwb3J0X2ZpZWxkc1tmaWVsZF9udW1dLmlkCisJCQkJCSAgIDogcmgtPmZpZWxkc1tmaWVsZF9udW1dLmlkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJZmllbGRfaWQgPSBmaWVsZHNbZm91bmQtPmZpZWxkX251bV0uaWQ7CisKKwlpZiAoIShmb3VuZC0+ZmxhZ3MgJiBmbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBpbmNvbXBhdGlibGUgY29tcGFyaXNvbiAiCisJCQkgICJ0eXBlIGZvciBzZWxlY3Rpb24gZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHNldCB1cCBzZWxlY3Rpb24gKi8KKwlpZiAoIShmcyA9IGRtX3Bvb2xfemFsbG9jKHJoLT5zZWxlY3Rpb24tPm1lbSwgc2l6ZW9mKHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24pKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IHN0cnVjdCBmaWVsZF9zZWxlY3Rpb24gIgorCQkJICAiYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHNlbGVjdGlvbiBmaWVsZCAlcyIsIGZpZWxkX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoZnMtPnZhbHVlID0gZG1fcG9vbF96YWxsb2MocmgtPnNlbGVjdGlvbi0+bWVtLCBzaXplb2Yoc3RydWN0IGZpZWxkX3NlbGVjdGlvbl92YWx1ZSkpKSkgeworCQlsb2dfZXJyb3IoX2ZpZWxkX3NlbGVjdGlvbl92YWx1ZV9hbGxvY19mYWlsZWRfbXNnLCBmaWVsZF9pZCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKCgocnZ3LT5yZXNlcnZlZCAmJiAocnZ3LT5yZXNlcnZlZC0+dHlwZSAmIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9SQU5HRSkpIHx8CisJICAgICAoKChmbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spID09IERNX1JFUE9SVF9GSUVMRF9UWVBFX1RJTUUpICYmCisJICAgICAgY3VzdG9tICYmICgoc3RydWN0IHRpbWVfdmFsdWUgKikgY3VzdG9tKS0+cmFuZ2UpKQorCQkgJiYKKwkgICAgIShmcy0+dmFsdWUtPm5leHQgPSBkbV9wb29sX3phbGxvYyhyaC0+c2VsZWN0aW9uLT5tZW0sIHNpemVvZihzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uX3ZhbHVlKSkpKSB7CisJCWxvZ19lcnJvcihfZmllbGRfc2VsZWN0aW9uX3ZhbHVlX2FsbG9jX2ZhaWxlZF9tc2csIGZpZWxkX2lkKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmcy0+ZnAgPSBmb3VuZDsKKwlmcy0+ZmxhZ3MgPSBmbGFnczsKKworCWlmICghX2dldF9yZXNlcnZlZF92YWx1ZShyaCwgZmllbGRfbnVtLCBydncpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBjb3VsZCBub3QgZ2V0IHJlc2VydmVkIHZhbHVlICIKKwkJCSAgIndoaWxlIHByb2Nlc3Npbmcgc2VsZWN0aW9uIGZpZWxkICVzIiwgZmllbGRfaWQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHN0b3JlIGNvbXBhcmlzb24gb3BlcmFuZCAqLworCWlmIChmbGFncyAmIEZMRF9DTVBfUkVHRVgpIHsKKwkJLyogUkVHRVggKi8KKwkJaWYgKCEocyA9IGRtX21hbGxvYyhsZW4gKyAxKSkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBkbV9tYWxsb2MgZmFpbGVkIHRvIHN0b3JlICIKKwkJCQkgICJyZWdleCB2YWx1ZSBmb3Igc2VsZWN0aW9uIGZpZWxkICVzIiwgZmllbGRfaWQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQltZW1jcHkocywgdiwgbGVuKTsKKwkJc1tsZW5dID0gJ1wwJzsKKworCQlmcy0+dmFsdWUtPnYuciA9IGRtX3JlZ2V4X2NyZWF0ZShyaC0+c2VsZWN0aW9uLT5tZW0sIChjb25zdCBjaGFyICogY29uc3QgKikgJnMsIDEpOworCQlkbV9mcmVlKHMpOworCQlpZiAoIWZzLT52YWx1ZS0+di5yKSB7CisJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogZmFpbGVkIHRvIGNyZWF0ZSByZWdleCAiCisJCQkJICAibWF0Y2hlciBmb3Igc2VsZWN0aW9uIGZpZWxkICVzIiwgZmllbGRfaWQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNUUklORywgTlVNQkVSLCBTSVpFLCBQRVJDRU5ULCBTVFJJTkdfTElTVCwgVElNRSAqLworCQlpZiAoIShzID0gZG1fcG9vbF9zdHJuZHVwKHJoLT5zZWxlY3Rpb24tPm1lbSwgdiwgbGVuKSkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBkbV9wb29sX3N0cm5kdXAgZm9yIHZhbHVlICIKKwkJCQkgICJvZiBzZWxlY3Rpb24gZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJc3dpdGNoIChmbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX01BU0spIHsKKwkJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HOgorCQkJCWlmIChydnctPnZhbHVlKSB7CisJCQkJCWZzLT52YWx1ZS0+di5zID0gKGNvbnN0IGNoYXIgKikgcnZ3LT52YWx1ZTsKKwkJCQkJaWYgKHJ2dy0+cmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UpCisJCQkJCQlmcy0+dmFsdWUtPm5leHQtPnYucyA9ICgoKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBydnctPnZhbHVlKVsxXSk7CisJCQkJCWRtX3Bvb2xfZnJlZShyaC0+c2VsZWN0aW9uLT5tZW0sIHMpOworCQkJCX0gZWxzZSB7CisJCQkJCWZzLT52YWx1ZS0+di5zID0gczsKKwkJCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkcsIGZzLT52YWx1ZS0+di5zLCBOVUxMKSkgeworCQkJCQkJbG9nX2Vycm9yKCJTdHJpbmcgdmFsdWUgJXMgZm91bmQgaW4gc2VsZWN0aW9uIGlzIHJlc2VydmVkLiIsIGZzLT52YWx1ZS0+di5zKTsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUjoKKwkJCQlpZiAocnZ3LT52YWx1ZSkgeworCQkJCQlmcy0+dmFsdWUtPnYuaSA9ICooY29uc3QgdWludDY0X3QgKikgcnZ3LT52YWx1ZTsKKwkJCQkJaWYgKHJ2dy0+cmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UpCisJCQkJCQlmcy0+dmFsdWUtPm5leHQtPnYuaSA9ICgoKGNvbnN0IHVpbnQ2NF90ICopIHJ2dy0+dmFsdWUpWzFdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKChmcy0+dmFsdWUtPnYuaSA9IHN0cnRvdWxsKHMsIE5VTEwsIDEwKSkgPT0gVUxMT05HX01BWCkgJiYKKwkJCQkJCSAoZXJybm8gPT0gRVJBTkdFKSkgeworCQkJCQkJbG9nX2Vycm9yKF9vdXRfb2ZfcmFuZ2VfbXNnLCBzLCBmaWVsZF9pZCk7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJCWlmIChfY2hlY2tfdmFsdWVfaXNfc3RyaWN0bHlfcmVzZXJ2ZWQocmgsIGZpZWxkX251bSwgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSLCAmZnMtPnZhbHVlLT52LmksIE5VTEwpKSB7CisJCQkJCQlsb2dfZXJyb3IoIk51bWVyaWMgdmFsdWUgJSIgUFJJdTY0ICIgZm91bmQgaW4gc2VsZWN0aW9uIGlzIHJlc2VydmVkLiIsIGZzLT52YWx1ZS0+di5pKTsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKwkJCQl9CisJCQkJZG1fcG9vbF9mcmVlKHJoLT5zZWxlY3Rpb24tPm1lbSwgcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkU6CisJCQkJaWYgKHJ2dy0+dmFsdWUpIHsKKwkJCQkJZnMtPnZhbHVlLT52LmQgPSAqKGNvbnN0IGRvdWJsZSAqKSBydnctPnZhbHVlOworCQkJCQlpZiAocnZ3LT5yZXNlcnZlZC0+dHlwZSAmIERNX1JFUE9SVF9GSUVMRF9SRVNFUlZFRF9WQUxVRV9SQU5HRSkKKwkJCQkJCWZzLT52YWx1ZS0+bmV4dC0+di5kID0gKCgoY29uc3QgZG91YmxlICopIHJ2dy0+dmFsdWUpWzFdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmcy0+dmFsdWUtPnYuZCA9IHN0cnRvZChzLCBOVUxMKTsKKwkJCQkJaWYgKGVycm5vID09IEVSQU5HRSkgeworCQkJCQkJbG9nX2Vycm9yKF9vdXRfb2ZfcmFuZ2VfbXNnLCBzLCBmaWVsZF9pZCk7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJCWlmIChjdXN0b20gJiYgKGZhY3RvciA9ICooKGNvbnN0IHVpbnQ2NF90ICopY3VzdG9tKSkpCisJCQkJCQlmcy0+dmFsdWUtPnYuZCAqPSBmYWN0b3I7CisJCQkJCWZzLT52YWx1ZS0+di5kIC89IDUxMjsgLyogc3RvcmUgc2l6ZSBpbiBzZWN0b3JzISAqLworCQkJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUsICZmcy0+dmFsdWUtPnYuZCwgTlVMTCkpIHsKKwkJCQkJCWxvZ19lcnJvcigiU2l6ZSB2YWx1ZSAlZiBmb3VuZCBpbiBzZWxlY3Rpb24gaXMgcmVzZXJ2ZWQuIiwgZnMtPnZhbHVlLT52LmQpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCX0KKwkJCQlkbV9wb29sX2ZyZWUocmgtPnNlbGVjdGlvbi0+bWVtLCBzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfUEVSQ0VOVDoKKwkJCQlpZiAocnZ3LT52YWx1ZSkgeworCQkJCQlmcy0+dmFsdWUtPnYuaSA9ICooY29uc3QgdWludDY0X3QgKikgcnZ3LT52YWx1ZTsKKwkJCQkJaWYgKHJ2dy0+cmVzZXJ2ZWQtPnR5cGUgJiBETV9SRVBPUlRfRklFTERfUkVTRVJWRURfVkFMVUVfUkFOR0UpCisJCQkJCQlmcy0+dmFsdWUtPm5leHQtPnYuaSA9ICgoKGNvbnN0IHVpbnQ2NF90ICopIHJ2dy0+dmFsdWUpWzFdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmcy0+dmFsdWUtPnYuZCA9IHN0cnRvZChzLCBOVUxMKTsKKwkJCQkJaWYgKChlcnJubyA9PSBFUkFOR0UpIHx8IChmcy0+dmFsdWUtPnYuZCA8IDApIHx8IChmcy0+dmFsdWUtPnYuZCA+IDEwMCkpIHsKKwkJCQkJCWxvZ19lcnJvcihfb3V0X29mX3JhbmdlX21zZywgcywgZmllbGRfaWQpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCisJCQkJCWZzLT52YWx1ZS0+di5pID0gKGRtX3BlcmNlbnRfdCkgKERNX1BFUkNFTlRfMSAqIGZzLT52YWx1ZS0+di5kKTsKKworCQkJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX1BFUkNFTlQsICZmcy0+dmFsdWUtPnYuaSwgTlVMTCkpIHsKKwkJCQkJCWxvZ19lcnJvcigiUGVyY2VudCB2YWx1ZSAlcyBmb3VuZCBpbiBzZWxlY3Rpb24gaXMgcmVzZXJ2ZWQuIiwgcyk7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkdfTElTVDoKKwkJCQlpZiAoIWN1c3RvbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvX2JhZDsKKwkJCQlmcy0+dmFsdWUtPnYubCA9ICooc3RydWN0IHNlbGVjdGlvbl9zdHJfbGlzdCAqKiljdXN0b207CisJCQkJaWYgKF9jaGVja192YWx1ZV9pc19zdHJpY3RseV9yZXNlcnZlZChyaCwgZmllbGRfbnVtLCBETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkdfTElTVCwgZnMtPnZhbHVlLT52LmwsIE5VTEwpKSB7CisJCQkJCWxvZ19lcnJvcigiU3RyaW5nIGxpc3QgdmFsdWUgZm91bmQgaW4gc2VsZWN0aW9uIGlzIHJlc2VydmVkLiIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRToKKwkJCQlpZiAocnZ3LT52YWx1ZSkgeworCQkJCQlmcy0+dmFsdWUtPnYudCA9ICooY29uc3QgdGltZV90ICopIHJ2dy0+dmFsdWU7CisJCQkJCWlmIChydnctPnJlc2VydmVkLT50eXBlICYgRE1fUkVQT1JUX0ZJRUxEX1JFU0VSVkVEX1ZBTFVFX1JBTkdFKQorCQkJCQkJZnMtPnZhbHVlLT5uZXh0LT52LnQgPSAoKChjb25zdCB0aW1lX3QgKikgcnZ3LT52YWx1ZSlbMV0pOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghKHR2YWwgPSAoc3RydWN0IHRpbWVfdmFsdWUgKikgY3VzdG9tKSkKKwkJCQkJCWdvdG9fYmFkOworCQkJCQlmcy0+dmFsdWUtPnYudCA9IHR2YWwtPnQxOworCQkJCQlpZiAodHZhbC0+cmFuZ2UpCisJCQkJCQlmcy0+dmFsdWUtPm5leHQtPnYudCA9IHR2YWwtPnQyOworCQkJCQlpZiAoX2NoZWNrX3ZhbHVlX2lzX3N0cmljdGx5X3Jlc2VydmVkKHJoLCBmaWVsZF9udW0sIERNX1JFUE9SVF9GSUVMRF9UWVBFX1RJTUUsICZmcy0+dmFsdWUtPnYudCwgTlVMTCkpIHsKKwkJCQkJCWxvZ19lcnJvcigiVGltZSB2YWx1ZSBmb3VuZCBpbiBzZWxlY3Rpb24gaXMgcmVzZXJ2ZWQuIik7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9jcmVhdGVfZmllbGRfc2VsZWN0aW9uOiAiCisJCQkJCSAgInVua25vd24gdHlwZSBvZiBzZWxlY3Rpb24gZmllbGQgJXMiLCBmaWVsZF9pZCk7CisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJldHVybiBmczsKK2JhZDoKKwlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkZvcmJpZGVuIE5VTEwgY3VzdG9tIGRldGVjdGVkLiIpOworZXJyb3I6CisJZG1fcG9vbF9mcmVlKHJoLT5zZWxlY3Rpb24tPm1lbSwgZnMpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKl9hbGxvY19zZWxlY3Rpb25fbm9kZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB1aW50MzJfdCB0eXBlKQoreworCXN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqc247CisKKwlpZiAoIShzbiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKHN0cnVjdCBzZWxlY3Rpb25fbm9kZSkpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogc3RydWN0IHNlbGVjdGlvbl9ub2RlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdCgmc24tPmxpc3QpOworCXNuLT50eXBlID0gdHlwZTsKKwlpZiAoISh0eXBlICYgU0VMX0lURU0pKQorCQlkbV9saXN0X2luaXQoJnNuLT5zZWxlY3Rpb24uc2V0KTsKKworCXJldHVybiBzbjsKK30KKworc3RhdGljIHZvaWQgX2Rpc3BsYXlfc2VsZWN0aW9uX2hlbHAoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX2dyb3dfb2JqZWN0X2ZhaWxlZF9tc2dbXSA9ICJfZGlzcGxheV9zZWxlY3Rpb25faGVscDogZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQiOworCXN0cnVjdCBvcF9kZWYgKnQ7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9yZXNlcnZlZF92YWx1ZSAqcnY7CisJc2l6ZV90IGxlbl9hbGwsIGxlbl9maW5hbCA9IDA7CisJY29uc3QgY2hhciAqKnJ2czsKKwljaGFyICpydnNfYWxsOworCisJbG9nX3dhcm4oIlNlbGVjdGlvbiBvcGVyYW5kcyIpOworCWxvZ193YXJuKCItLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlsb2dfd2FybigiICBmaWVsZCAgICAgICAgICAgICAgIC0gUmVwb3J0aW5nIGZpZWxkLiIpOworCWxvZ193YXJuKCIgIG51bWJlciAgICAgICAgICAgICAgLSBOb24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZS4iKTsKKwlsb2dfd2FybigiICBzaXplICAgICAgICAgICAgICAgIC0gRmxvYXRpbmcgcG9pbnQgdmFsdWUgd2l0aCB1bml0cywgJ20nIHVuaXQgdXNlZCBieSBkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQuIik7CisJbG9nX3dhcm4oIiAgcGVyY2VudCAgICAgICAgICAgICAtIE5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHdpdGggb3Igd2l0aG91dCAlJSBzdWZmaXguIik7CisJbG9nX3dhcm4oIiAgc3RyaW5nICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgcXVvdGVkIGJ5IFwnIG9yIFwiIG9yIHVucXVvdGVkLiIpOworCWxvZ193YXJuKCIgIHN0cmluZyBsaXN0ICAgICAgICAgLSBTdHJpbmdzIGVuY2xvc2VkIGJ5IFsgXSBvciB7IH0gYW5kIGVsZW1lbnRzIGRlbGltaXRlZCBieSBlaXRoZXIiKTsKKwlsb2dfd2FybigiICAgICAgICAgICAgICAgICAgICAgICAgXCJhbGwgaXRlbXMgbXVzdCBtYXRjaFwiIG9yIFwiYXQgbGVhc3Qgb25lIGl0ZW0gbXVzdCBtYXRjaFwiIG9wZXJhdG9yLiIpOworCWxvZ193YXJuKCIgIHJlZ3VsYXIgZXhwcmVzc2lvbiAgLSBDaGFyYWN0ZXJzIHF1b3RlZCBieSBcJyBvciBcIiBvciB1bnF1b3RlZC4iKTsKKwlsb2dfd2FybigiICIpOworCWlmIChyaC0+cmVzZXJ2ZWRfdmFsdWVzKSB7CisJCWxvZ193YXJuKCJSZXNlcnZlZCB2YWx1ZXMiKTsKKwkJbG9nX3dhcm4oIi0tLS0tLS0tLS0tLS0tLSIpOworCisJCWZvciAocnYgPSByaC0+cmVzZXJ2ZWRfdmFsdWVzOyBydi0+dHlwZTsgcnYrKykgeworCQkJZm9yIChsZW5fYWxsID0gMCwgcnZzID0gcnYtPm5hbWVzOyAqcnZzOyBydnMrKykKKwkJCQlsZW5fYWxsICs9IHN0cmxlbigqcnZzKSArIDI7CisJCQlpZiAobGVuX2FsbCA+IGxlbl9maW5hbCkKKwkJCQlsZW5fZmluYWwgPSBsZW5fYWxsOworCQl9CisKKwkJZm9yIChydiA9IHJoLT5yZXNlcnZlZF92YWx1ZXM7IHJ2LT50eXBlOyBydisrKSB7CisJCQlpZiAoIWRtX3Bvb2xfYmVnaW5fb2JqZWN0KHJoLT5tZW0sIDI1NikpIHsKKwkJCQlsb2dfZXJyb3IoIl9kaXNwbGF5X3NlbGVjdGlvbl9oZWxwOiBkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAocnZzID0gcnYtPm5hbWVzOyAqcnZzOyBydnMrKykgeworCQkJCWlmICgoKHJ2cyAhPSBydi0+bmFtZXMpICYmICFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sICIsICIsIDIpKSB8fAorCQkJCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCAqcnZzLCBzdHJsZW4oKnJ2cykpKSB7CisJCQkJCWxvZ19lcnJvcihfZ3Jvd19vYmplY3RfZmFpbGVkX21zZyk7CisJCQkJCWdvdG8gb3V0X3Jlc2VydmVkX3ZhbHVlczsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgIlwwIiwgMSkpIHsKKwkJCQlsb2dfZXJyb3IoX2dyb3dfb2JqZWN0X2ZhaWxlZF9tc2cpOworCQkJCWdvdG8gb3V0X3Jlc2VydmVkX3ZhbHVlczsKKwkJCX0KKwkJCXJ2c19hbGwgPSBkbV9wb29sX2VuZF9vYmplY3QocmgtPm1lbSk7CisKKwkJCWxvZ193YXJuKCIgICUtKnMgLSAlcyBbJXNdIiwgKGludCkgbGVuX2ZpbmFsLCBydnNfYWxsLCBydi0+ZGVzY3JpcHRpb24sCisJCQkJCQkgICAgIF9nZXRfZmllbGRfdHlwZV9uYW1lKHJ2LT50eXBlKSk7CisJCQlkbV9wb29sX2ZyZWUocmgtPm1lbSwgcnZzX2FsbCk7CisJCX0KKwkJbG9nX3dhcm4oIiAiKTsKKwl9CitvdXRfcmVzZXJ2ZWRfdmFsdWVzOgorCWxvZ193YXJuKCJTZWxlY3Rpb24gb3BlcmF0b3JzIik7CisJbG9nX3dhcm4oIi0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlsb2dfd2FybigiICBDb21wYXJpc29uIG9wZXJhdG9yczoiKTsKKwl0ID0gX29wX2NtcDsKKwlmb3IgKDsgdC0+c3RyaW5nOyB0KyspCisJCWxvZ193YXJuKCIgICAgJTZzICAtICVzIiwgdC0+c3RyaW5nLCB0LT5kZXNjKTsKKwlsb2dfd2FybigiICIpOworCWxvZ193YXJuKCIgIExvZ2ljYWwgYW5kIGdyb3VwaW5nIG9wZXJhdG9yczoiKTsKKwl0ID0gX29wX2xvZzsKKwlmb3IgKDsgdC0+c3RyaW5nOyB0KyspCisJCWxvZ193YXJuKCIgICAgJTRzICAtICVzIiwgdC0+c3RyaW5nLCB0LT5kZXNjKTsKKwlsb2dfd2FybigiICIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBfc2VsX3N5bnRheF9lcnJvcl9hdF9tc2dbXSA9ICJTZWxlY3Rpb24gc3ludGF4IGVycm9yIGF0ICclcycuIjsKK3N0YXRpYyBjb25zdCBjaGFyIF9zZWxfaGVscF9yZWZfbXNnW10gPSAiVXNlIFwnaGVscFwnIGZvciBzZWxlY3Rpb24gdG8gZ2V0IG1vcmUgaGVscC4iOworCisvKgorICogU2VsZWN0aW9uIHBhcnNlcgorICoKKyAqIF9wYXJzZV8qIGZ1bmN0aW9ucworICoKKyAqICAgSW5wdXQ6CisgKiAgICAgcyAgICAgICAgICAgICAtIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIHN0cmluZworICogICBPdXRwdXQ6CisgKiAgICAgbmV4dCAgICAgICAgICAtIGEgcG9pbnRlciB1c2VkIGZvciBuZXh0IF9wYXJzZV8qJ3MgaW5wdXQsCisgKiAgICAgICAgICAgICAgICAgICAgIG5leHQgPT0gcyBpZiByZXR1cm4gdmFsdWUgaXMgTlVMTAorICogICAgIHJldHVybiB2YWx1ZSAgLSBhIGZpbHRlciBub2RlIHBvaW50ZXIsCisgKiAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgcyBkb2Vzbid0IG1hdGNoCisgKi8KKworLyoKKyAqIFNFTEVDVElPTiA6PSBGSUVMRF9OQU1FIE9QX0NNUCBTVFJJTkcgfAorICogICAgICAgICAgICAgIEZJRUxEX05BTUUgT1BfQ01QIE5VTUJFUiAgfAorICogICAgICAgICAgICAgIEZJRUxEX05BTUUgT1BfUkVHRVggUkVHRVgKKyAqLworc3RhdGljIHN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqX3BhcnNlX3NlbGVjdGlvbihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKnMsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICoqbmV4dCkKK3sKKwlzdHJ1Y3QgZmllbGRfc2VsZWN0aW9uICpmczsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKnNuOworCWNvbnN0IGNoYXIgKndzLCAqd2U7IC8qIGZpZWxkIG5hbWUgKi8KKwljb25zdCBjaGFyICp2cywgKnZlOyAvKiB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKmxhc3Q7CisJdWludDMyX3QgZmxhZ3MsIGZpZWxkX251bTsKKwlpbnQgaW1wbGljaXQ7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmdDsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX3N0cl9saXN0ICpzdHJfbGlzdDsKKwlzdHJ1Y3QgcmVzZXJ2ZWRfdmFsdWVfd3JhcHBlciBydncgPSB7MH07CisJc3RydWN0IHRpbWVfdmFsdWUgdHZhbDsKKwl1aW50NjRfdCBmYWN0b3I7CisJdm9pZCAqY3VzdG9tID0gTlVMTDsKKwljaGFyICp0bXA7CisJY2hhciBjOworCisJLyogZmllbGQgbmFtZSAqLworCWlmICghKGxhc3QgPSBfdG9rX2ZpZWxkX25hbWUocywgJndzLCAmd2UpKSkgeworCQlsb2dfZXJyb3IoIkV4cGVjdGluZyBmaWVsZCBuYW1lIik7CisJCWdvdG8gYmFkOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBmaWVsZCB3aXRoIGdpdmVuIG5hbWUgZXhpc3RzICovCisJaWYgKCFfZ2V0X2ZpZWxkKHJoLCB3cywgKHNpemVfdCkgKHdlIC0gd3MpLCAmZmllbGRfbnVtLCAmaW1wbGljaXQpKSB7CisJCWMgPSB3ZVswXTsKKwkJdG1wID0gKGNoYXIgKikgd2U7CisJCXRtcFswXSA9ICdcMCc7CisJCV9kaXNwbGF5X2ZpZWxkcyhyaCwgMCwgMSk7CisJCWxvZ193YXJuKCIgIik7CisJCWxvZ19lcnJvcigiVW5yZWNvZ25pc2VkIHNlbGVjdGlvbiBmaWVsZDogJXMiLCB3cyk7CisJCXRtcFswXSA9IGM7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChpbXBsaWNpdCkgeworCQlmdCA9ICZfaW1wbGljaXRfcmVwb3J0X2ZpZWxkc1tmaWVsZF9udW1dOworCQlpZiAoZnQtPmZsYWdzICYgRkxEX0NNUF9VTkNPTVBBUkFCTEUpIHsKKwkJCWMgPSB3ZVswXTsKKwkJCXRtcCA9IChjaGFyICopIHdlOworCQkJdG1wWzBdID0gJ1wwJzsKKwkJCV9kaXNwbGF5X2ZpZWxkcyhyaCwgMCwgMSk7CisJCQlsb2dfd2FybigiICIpOworCQkJbG9nX2Vycm9yKCJTZWxlY3Rpb24gZmllbGQgaXMgdW5jb21wYXJhYmxlOiAlcy4iLCB3cyk7CisJCQl0bXBbMF0gPSBjOworCQkJZ290byBiYWQ7CisJCX0KKwl9IGVsc2UKKwkJZnQgPSAmcmgtPmZpZWxkc1tmaWVsZF9udW1dOworCisJLyogY29tcGFyaXNvbiBvcGVyYXRvciAqLworCWlmICghKGZsYWdzID0gX3Rva19vcF9jbXAod2UsICZsYXN0KSkpIHsKKwkJX2Rpc3BsYXlfc2VsZWN0aW9uX2hlbHAocmgpOworCQlsb2dfZXJyb3IoIlVucmVjb2duaXNlZCBjb21wYXJpc29uIG9wZXJhdG9yOiAlcyIsIHdlKTsKKwkJZ290byBiYWQ7CisJfQorCWlmICghbGFzdCkgeworCQlfZGlzcGxheV9zZWxlY3Rpb25faGVscChyaCk7CisJCWxvZ19lcnJvcigiTWlzc2luZyB2YWx1ZSBhZnRlciBvcGVyYXRvciIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBjb21wYXJpc29uIHZhbHVlICovCisJaWYgKGZsYWdzICYgRkxEX0NNUF9SRUdFWCkgeworCQkvKgorCQkgKiBSRUdFWCB2YWx1ZQorCQkgKi8KKwkJaWYgKCEobGFzdCA9IF90b2tfdmFsdWVfcmVnZXgocmgsIGZ0LCBsYXN0LCAmdnMsICZ2ZSwgJmZsYWdzLCAmcnZ3KSkpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTVFJJTkcsIE5VTUJFUiwgU0laRSwgUEVSQ0VOVCwgU1RSSU5HX0xJU1QsIFRJTUUgdmFsdWUKKwkJICovCisJCWlmIChmbGFncyAmIEZMRF9DTVBfTlVNQkVSKSB7CisJCQlpZiAoIShmdC0+ZmxhZ3MgJiAoRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSIHwKKwkJCQkJICAgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRSB8CisJCQkJCSAgIERNX1JFUE9SVF9GSUVMRF9UWVBFX1BFUkNFTlQgfAorCQkJCQkgICBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FKSkpIHsKKwkJCQlfZGlzcGxheV9zZWxlY3Rpb25faGVscChyaCk7CisJCQkJbG9nX2Vycm9yKCJPcGVyYXRvciBjYW4gYmUgdXNlZCBvbmx5IHdpdGggbnVtYmVyLCBzaXplLCB0aW1lIG9yIHBlcmNlbnQgZmllbGRzOiAlcyIsIHdzKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIGlmIChmbGFncyAmIEZMRF9DTVBfVElNRSkgeworCQkJaWYgKCEoZnQtPmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRSkpIHsKKwkJCQlfZGlzcGxheV9zZWxlY3Rpb25faGVscChyaCk7CisJCQkJbG9nX2Vycm9yKCJPcGVyYXRvciBjYW4gYmUgdXNlZCBvbmx5IHdpdGggdGltZSBmaWVsZHM6ICVzIiwgd3MpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisKKwkJaWYgKGZ0LT5mbGFncyA9PSBETV9SRVBPUlRfRklFTERfVFlQRV9TSVpFIHx8CisJCSAgICBmdC0+ZmxhZ3MgPT0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSIHx8CisJCSAgICBmdC0+ZmxhZ3MgPT0gRE1fUkVQT1JUX0ZJRUxEX1RZUEVfUEVSQ0VOVCkKKwkJCWN1c3RvbSA9ICZmYWN0b3I7CisJCWVsc2UgaWYgKGZ0LT5mbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX1RJTUUpCisJCQljdXN0b20gPSAmdHZhbDsKKwkJZWxzZSBpZiAoZnQtPmZsYWdzID09IERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklOR19MSVNUKQorCQkJY3VzdG9tID0gJnN0cl9saXN0OworCQllbHNlCisJCQljdXN0b20gPSBOVUxMOworCQlpZiAoIShsYXN0ID0gX3Rva192YWx1ZShyaCwgZnQsIGZpZWxkX251bSwgaW1wbGljaXQsCisJCQkJCWxhc3QsICZ2cywgJnZlLCAmZmxhZ3MsCisJCQkJCSZydncsIHJoLT5zZWxlY3Rpb24tPm1lbSwgY3VzdG9tKSkpCisJCQlnb3RvX2JhZDsKKwl9CisKKwkqbmV4dCA9IF9za2lwX3NwYWNlKGxhc3QpOworCisJLyogY3JlYXRlIHNlbGVjdGlvbiAqLworCWlmICghKGZzID0gX2NyZWF0ZV9maWVsZF9zZWxlY3Rpb24ocmgsIGZpZWxkX251bSwgaW1wbGljaXQsIHZzLCAoc2l6ZV90KSAodmUgLSB2cyksIGZsYWdzLCAmcnZ3LCBjdXN0b20pKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBjcmVhdGUgc2VsZWN0aW9uIG5vZGUgKi8KKwlpZiAoIShzbiA9IF9hbGxvY19zZWxlY3Rpb25fbm9kZShyaC0+c2VsZWN0aW9uLT5tZW0sIFNFTF9JVEVNKSkpCisJCXJldHVybl9OVUxMOworCisJLyogYWRkIHNlbGVjdGlvbiB0byBzZWxlY3Rpb24gbm9kZSAqLworCXNuLT5zZWxlY3Rpb24uaXRlbSA9IGZzOworCisJcmV0dXJuIHNuOworYmFkOgorCWxvZ19lcnJvcihfc2VsX3N5bnRheF9lcnJvcl9hdF9tc2csIHMpOworCWxvZ19lcnJvcihfc2VsX2hlbHBfcmVmX21zZyk7CisJKm5leHQgPSBzOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHNlbGVjdGlvbl9ub2RlICpfcGFyc2Vfb3JfZXgoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKipuZXh0LAorCQkJCQkgICBzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKm9yX3NuKTsKKworc3RhdGljIHN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqX3BhcnNlX2V4KHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQljb25zdCBjaGFyICpzLAorCQkJCQljb25zdCBjaGFyICoqbmV4dCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBfcHNfZXhwZWN0ZWRfbXNnW10gPSAiU3ludGF4IGVycm9yOiBsZWZ0IHBhcmVudGhlc2lzIGV4cGVjdGVkIGF0IFwnJXNcJyI7CisJc3RhdGljIGNvbnN0IGNoYXIgX3BlX2V4cGVjdGVkX21zZ1tdID0gIlN5bnRheCBlcnJvcjogcmlnaHQgcGFyZW50aGVzaXMgZXhwZWN0ZWQgYXQgXCclc1wnIjsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKnNuID0gTlVMTDsKKwl1aW50MzJfdCB0OworCWNvbnN0IGNoYXIgKnRtcDsKKworCXQgPSBfdG9rX29wX2xvZyhzLCBuZXh0LCBTRUxfTU9ESUZJRVJfTk9UIHwgU0VMX1BSRUNFREVOQ0VfUFMpOworCWlmICh0ID09IFNFTF9NT0RJRklFUl9OT1QpIHsKKwkJLyogJyEnICcoJyBFWFBSRVNTSU9OICcpJyAqLworCQlpZiAoIV90b2tfb3BfbG9nKCpuZXh0LCAmdG1wLCBTRUxfUFJFQ0VERU5DRV9QUykpIHsKKwkJCWxvZ19lcnJvcihfcHNfZXhwZWN0ZWRfbXNnLCAqbmV4dCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmICghKHNuID0gX3BhcnNlX29yX2V4KHJoLCB0bXAsIG5leHQsIE5VTEwpKSkKKwkJCWdvdG8gZXJyb3I7CisJCXNuLT50eXBlIHw9IFNFTF9NT0RJRklFUl9OT1Q7CisJCWlmICghX3Rva19vcF9sb2coKm5leHQsICZ0bXAsIFNFTF9QUkVDRURFTkNFX1BFKSkgeworCQkJbG9nX2Vycm9yKF9wZV9leHBlY3RlZF9tc2csICpuZXh0KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJKm5leHQgPSB0bXA7CisJfSBlbHNlIGlmICh0ID09IFNFTF9QUkVDRURFTkNFX1BTKSB7CisJCS8qICcoJyBFWFBSRVNTSU9OICcpJyAqLworCQlpZiAoIShzbiA9IF9wYXJzZV9vcl9leChyaCwgKm5leHQsICZ0bXAsIE5VTEwpKSkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICghX3Rva19vcF9sb2codG1wLCBuZXh0LCBTRUxfUFJFQ0VERU5DRV9QRSkpIHsKKwkJCWxvZ19lcnJvcihfcGVfZXhwZWN0ZWRfbXNnLCAqbmV4dCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIGlmICgocyA9IF9za2lwX3NwYWNlKHMpKSkgeworCQkvKiBTRUxFQ1RJT04gKi8KKwkJc24gPSBfcGFyc2Vfc2VsZWN0aW9uKHJoLCBzLCBuZXh0KTsKKwl9IGVsc2UgeworCQlzbiA9IE5VTEw7CisJCSpuZXh0ID0gczsKKwl9CisKKwlyZXR1cm4gc247CitlcnJvcjoKKwkqbmV4dCA9IHM7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFORF9FWFBSRVNTSU9OIDo9IEVYIChBTkRfT1AgQU5EX0VYUFJTU0lPTikgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKl9wYXJzZV9hbmRfZXgoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCSAgICBjb25zdCBjaGFyICpzLAorCQkJCQkgICAgY29uc3QgY2hhciAqKm5leHQsCisJCQkJCSAgICBzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKmFuZF9zbikKK3sKKwlzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKm47CisJY29uc3QgY2hhciAqdG1wOworCisJbiA9IF9wYXJzZV9leChyaCwgcywgbmV4dCk7CisJaWYgKCFuKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFfdG9rX29wX2xvZygqbmV4dCwgJnRtcCwgU0VMX0FORCkpIHsKKwkJaWYgKCFhbmRfc24pCisJCQlyZXR1cm4gbjsKKwkJZG1fbGlzdF9hZGQoJmFuZF9zbi0+c2VsZWN0aW9uLnNldCwgJm4tPmxpc3QpOworCQlyZXR1cm4gYW5kX3NuOworCX0KKworCWlmICghYW5kX3NuKSB7CisJCWlmICghKGFuZF9zbiA9IF9hbGxvY19zZWxlY3Rpb25fbm9kZShyaC0+c2VsZWN0aW9uLT5tZW0sIFNFTF9BTkQpKSkKKwkJCWdvdG8gZXJyb3I7CisJfQorCWRtX2xpc3RfYWRkKCZhbmRfc24tPnNlbGVjdGlvbi5zZXQsICZuLT5saXN0KTsKKworCXJldHVybiBfcGFyc2VfYW5kX2V4KHJoLCB0bXAsIG5leHQsIGFuZF9zbik7CitlcnJvcjoKKwkqbmV4dCA9IHM7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIE9SX0VYUFJFU1NJT04gOj0gQU5EX0VYUFJFU1NJT04gKE9SX09QIE9SX0VYUFJFU1NJT04pICovCitzdGF0aWMgc3RydWN0IHNlbGVjdGlvbl9ub2RlICpfcGFyc2Vfb3JfZXgoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCSAgIGNvbnN0IGNoYXIgKnMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKipuZXh0LAorCQkJCQkgICBzdHJ1Y3Qgc2VsZWN0aW9uX25vZGUgKm9yX3NuKQoreworCXN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqbjsKKwljb25zdCBjaGFyICp0bXA7CisKKwluID0gX3BhcnNlX2FuZF9leChyaCwgcywgbmV4dCwgTlVMTCk7CisJaWYgKCFuKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFfdG9rX29wX2xvZygqbmV4dCwgJnRtcCwgU0VMX09SKSkgeworCQlpZiAoIW9yX3NuKQorCQkJcmV0dXJuIG47CisJCWRtX2xpc3RfYWRkKCZvcl9zbi0+c2VsZWN0aW9uLnNldCwgJm4tPmxpc3QpOworCQlyZXR1cm4gb3Jfc247CisJfQorCisJaWYgKCFvcl9zbikgeworCQlpZiAoIShvcl9zbiA9IF9hbGxvY19zZWxlY3Rpb25fbm9kZShyaC0+c2VsZWN0aW9uLT5tZW0sIFNFTF9PUikpKQorCQkJZ290byBlcnJvcjsKKwl9CisJZG1fbGlzdF9hZGQoJm9yX3NuLT5zZWxlY3Rpb24uc2V0LCAmbi0+bGlzdCk7CisKKwlyZXR1cm4gX3BhcnNlX29yX2V4KHJoLCB0bXAsIG5leHQsIG9yX3NuKTsKK2Vycm9yOgorCSpuZXh0ID0gczsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfYWxsb2Nfcmhfc2VsZWN0aW9uKHN0cnVjdCBkbV9yZXBvcnQgKnJoKQoreworCWlmICghKHJoLT5zZWxlY3Rpb24gPSBkbV9wb29sX3phbGxvYyhyaC0+bWVtLCBzaXplb2Yoc3RydWN0IHNlbGVjdGlvbikpKSB8fAorCSAgICAhKHJoLT5zZWxlY3Rpb24tPm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJyZXBvcnQgc2VsZWN0aW9uIiwgMTAgKiAxMDI0KSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVwb3J0IHNlbGVjdGlvbiBzdHJ1Y3R1cmUuIik7CisJCWlmIChyaC0+c2VsZWN0aW9uKQorCQkJZG1fcG9vbF9mcmVlKHJoLT5tZW0sIHJoLT5zZWxlY3Rpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBTUEVDSUFMX1NFTEVDVElPTl9BTEwgImFsbCIKKworc3RhdGljIGludCBfcmVwb3J0X3NldF9zZWxlY3Rpb24oc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKnNlbGVjdGlvbiwgaW50IGFkZF9uZXdfZmllbGRzKQoreworCXN0cnVjdCBzZWxlY3Rpb25fbm9kZSAqcm9vdCA9IE5VTEw7CisJY29uc3QgY2hhciAqZmluLCAqbmV4dDsKKworCWlmIChyaC0+c2VsZWN0aW9uKSB7CisJCWlmIChyaC0+c2VsZWN0aW9uLT5zZWxlY3Rpb25fcm9vdCkKKwkJCS8qIFRyYXNoIGFueSBwcmV2aW91cyBzZWxlY3Rpb24uICovCisJCQlkbV9wb29sX2ZyZWUocmgtPnNlbGVjdGlvbi0+bWVtLCByaC0+c2VsZWN0aW9uLT5zZWxlY3Rpb25fcm9vdCk7CisJCXJoLT5zZWxlY3Rpb24tPnNlbGVjdGlvbl9yb290ID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAoIV9hbGxvY19yaF9zZWxlY3Rpb24ocmgpKQorCQkJZ290b19iYWQ7CisJfQorCisJaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvblswXSB8fCAhc3RyY2FzZWNtcChzZWxlY3Rpb24sIFNQRUNJQUxfU0VMRUNUSU9OX0FMTCkpCisJCXJldHVybiAxOworCisJcmgtPnNlbGVjdGlvbi0+YWRkX25ld19maWVsZHMgPSBhZGRfbmV3X2ZpZWxkczsKKworCWlmICghKHJvb3QgPSBfYWxsb2Nfc2VsZWN0aW9uX25vZGUocmgtPnNlbGVjdGlvbi0+bWVtLCBTRUxfT1IpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV9wYXJzZV9vcl9leChyaCwgc2VsZWN0aW9uLCAmZmluLCByb290KSkKKwkJZ290b19iYWQ7CisKKwluZXh0ID0gX3NraXBfc3BhY2UoZmluKTsKKwlpZiAoKm5leHQpIHsKKwkJbG9nX2Vycm9yKCJFeHBlY3RpbmcgbG9naWNhbCBvcGVyYXRvciIpOworCQlsb2dfZXJyb3IoX3NlbF9zeW50YXhfZXJyb3JfYXRfbXNnLCBuZXh0KTsKKwkJbG9nX2Vycm9yKF9zZWxfaGVscF9yZWZfbXNnKTsKKwkJZ290byBiYWQ7CisJfQorCisJcmgtPnNlbGVjdGlvbi0+c2VsZWN0aW9uX3Jvb3QgPSByb290OworCXJldHVybiAxOworYmFkOgorCWRtX3Bvb2xfZnJlZShyaC0+c2VsZWN0aW9uLT5tZW0sIHJvb3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfcmVzZXRfZmllbGRfcHJvcHMoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJc3RydWN0IGZpZWxkX3Byb3BlcnRpZXMgKmZwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmcCwgJnJoLT5maWVsZF9wcm9wcykKKwkJZnAtPndpZHRoID0gZnAtPmluaXRpYWxfd2lkdGg7CisJcmgtPmZsYWdzIHw9IFJIX0ZJRUxEX0NBTENfTkVFREVEOworfQorCitpbnQgZG1fcmVwb3J0X3NldF9zZWxlY3Rpb24oc3RydWN0IGRtX3JlcG9ydCAqcmgsIGNvbnN0IGNoYXIgKnNlbGVjdGlvbikKK3sKKwlzdHJ1Y3Qgcm93ICpyb3c7CisKKwlpZiAoIV9yZXBvcnRfc2V0X3NlbGVjdGlvbihyaCwgc2VsZWN0aW9uLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlfcmVzZXRfZmllbGRfcHJvcHMocmgpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJvdywgJnJoLT5yb3dzKSB7CisJCXJvdy0+c2VsZWN0ZWQgPSBfY2hlY2tfcmVwb3J0X3NlbGVjdGlvbihyaCwgJnJvdy0+ZmllbGRzKTsKKwkJaWYgKHJvdy0+ZmllbGRfc2VsX3N0YXR1cykKKwkJCV9pbXBsaWNpdF9yZXBvcnRfZmllbGRzW3Jvdy0+ZmllbGRfc2VsX3N0YXR1cy0+cHJvcHMtPmZpZWxkX251bV0ucmVwb3J0X2ZuKHJoLAorCQkJCQkJCXJoLT5tZW0sIHJvdy0+ZmllbGRfc2VsX3N0YXR1cywgcm93LCByaC0+cHJpdmF0ZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbV9yZXBvcnQgKmRtX3JlcG9ydF9pbml0X3dpdGhfc2VsZWN0aW9uKHVpbnQzMl90ICpyZXBvcnRfdHlwZXMsCisJCQkJCQljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlICp0eXBlcywKKwkJCQkJCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzLAorCQkJCQkJY29uc3QgY2hhciAqb3V0cHV0X2ZpZWxkcywKKwkJCQkJCWNvbnN0IGNoYXIgKm91dHB1dF9zZXBhcmF0b3IsCisJCQkJCQl1aW50MzJfdCBvdXRwdXRfZmxhZ3MsCisJCQkJCQljb25zdCBjaGFyICpzb3J0X2tleXMsCisJCQkJCQljb25zdCBjaGFyICpzZWxlY3Rpb24sCisJCQkJCQljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X3Jlc2VydmVkX3ZhbHVlIHJlc2VydmVkX3ZhbHVlc1tdLAorCQkJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCBkbV9yZXBvcnQgKnJoOworCisJX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMgPSBfaW1wbGljaXRfc3BlY2lhbF9yZXBvcnRfZmllbGRzX3dpdGhfc2VsZWN0aW9uOworCisJaWYgKCEocmggPSBkbV9yZXBvcnRfaW5pdChyZXBvcnRfdHlwZXMsIHR5cGVzLCBmaWVsZHMsIG91dHB1dF9maWVsZHMsCisJCQlvdXRwdXRfc2VwYXJhdG9yLCBvdXRwdXRfZmxhZ3MsIHNvcnRfa2V5cywgcHJpdmF0ZV9kYXRhKSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvblswXSkgeworCQlyaC0+c2VsZWN0aW9uID0gTlVMTDsKKwkJcmV0dXJuIHJoOworCX0KKworCWlmICghX2NoZWNrX3Jlc2VydmVkX3ZhbHVlc19zdXBwb3J0ZWQoZmllbGRzLCByZXNlcnZlZF92YWx1ZXMpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiZG1fcmVwb3J0X2luaXRfd2l0aF9zZWxlY3Rpb246ICIKKwkJCSAgInRyeWluZyB0byByZWdpc3RlciB1bnN1cHBvcnRlZCByZXNlcnZlZCB2YWx1ZSB0eXBlLCAiCisJCQkgICJza2lwcGluZyByZXBvcnQgc2VsZWN0aW9uIik7CisJCXJldHVybiByaDsKKwl9CisJcmgtPnJlc2VydmVkX3ZhbHVlcyA9IHJlc2VydmVkX3ZhbHVlczsKKworCWlmICghc3RyY2FzZWNtcChzZWxlY3Rpb24sIFNQRUNJQUxfRklFTERfSEVMUF9JRCkgfHwKKwkgICAgIXN0cmNtcChzZWxlY3Rpb24sIFNQRUNJQUxfRklFTERfSEVMUF9BTFRfSUQpKSB7CisJCV9kaXNwbGF5X2ZpZWxkcyhyaCwgMCwgMSk7CisJCWxvZ193YXJuKCIgIik7CisJCV9kaXNwbGF5X3NlbGVjdGlvbl9oZWxwKHJoKTsKKwkJcmgtPmZsYWdzIHw9IFJIX0FMUkVBRFlfUkVQT1JURUQ7CisJCXJldHVybiByaDsKKwl9CisKKwlpZiAoIV9yZXBvcnRfc2V0X3NlbGVjdGlvbihyaCwgc2VsZWN0aW9uLCAxKSkKKwkJZ290b19iYWQ7CisKKwlfZG1fcmVwb3J0X2luaXRfdXBkYXRlX3R5cGVzKHJoLCByZXBvcnRfdHlwZXMpOworCisJcmV0dXJuIHJoOworYmFkOgorCWRtX3JlcG9ydF9mcmVlKHJoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFByaW50IHJvdyBvZiBoZWFkaW5ncworICovCitzdGF0aWMgaW50IF9yZXBvcnRfaGVhZGluZ3Moc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHM7CisJc3RydWN0IGZpZWxkX3Byb3BlcnRpZXMgKmZwOworCWNvbnN0IGNoYXIgKmhlYWRpbmc7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgYnVmX3NpemUgPSAwOworCisJcmgtPmZsYWdzIHw9IFJIX0hFQURJTkdTX1BSSU5URUQ7CisKKwlpZiAoIShyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0hFQURJTkdTKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWRtX3Bvb2xfYmVnaW5fb2JqZWN0KHJoLT5tZW0sIDEyOCkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6ICIKKwkJCSAgImRtX3Bvb2xfYmVnaW5fb2JqZWN0IGZhaWxlZCBmb3IgaGVhZGluZ3MiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGZwLCAmcmgtPmZpZWxkX3Byb3BzKSB7CisJCWlmICgoaW50KSBidWZfc2l6ZSA8IGZwLT53aWR0aCkKKwkJCWJ1Zl9zaXplID0gKHNpemVfdCkgZnAtPndpZHRoOworCX0KKwkvKiBJbmNsdWRpbmcgdHJhaWxpbmcgJ1wwJyEgKi8KKwlidWZfc2l6ZSsrOworCisJaWYgKCEoYnVmID0gZG1fbWFsbG9jKGJ1Zl9zaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhlYWRpbmcgYnVmZmVyLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBGaXJzdCBoZWFkaW5nIGxpbmUgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZnAsICZyaC0+ZmllbGRfcHJvcHMpIHsKKwkJaWYgKGZwLT5mbGFncyAmIEZMRF9ISURERU4pCisJCQljb250aW51ZTsKKworCQlmaWVsZHMgPSBmcC0+aW1wbGljaXQgPyBfaW1wbGljaXRfcmVwb3J0X2ZpZWxkcyA6IHJoLT5maWVsZHM7CisKKwkJaGVhZGluZyA9IGZpZWxkc1tmcC0+ZmllbGRfbnVtXS5oZWFkaW5nOworCQlpZiAocmgtPmZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9BTElHTkVEKSB7CisJCQlpZiAoZG1fc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiUtKi4qcyIsCisJCQkJCSBmcC0+d2lkdGgsIGZwLT53aWR0aCwgaGVhZGluZykgPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IHNucHJpbnRmIGhlYWRpbmcgZmFpbGVkIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgYnVmLCBmcC0+d2lkdGgpKSB7CisJCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IEZhaWxlZCB0byBnZW5lcmF0ZSByZXBvcnQgaGVhZGluZ3MgZm9yIHByaW50aW5nIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgaGVhZGluZywgMCkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBGYWlsZWQgdG8gZ2VuZXJhdGUgcmVwb3J0IGhlYWRpbmdzIGZvciBwcmludGluZyIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoIWRtX2xpc3RfZW5kKCZyaC0+ZmllbGRfcHJvcHMsICZmcC0+bGlzdCkpCisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgcmgtPnNlcGFyYXRvciwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogRmFpbGVkIHRvIGdlbmVyYXRlIHJlcG9ydCBoZWFkaW5ncyBmb3IgcHJpbnRpbmciKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwl9CisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sICJcMCIsIDEpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBGYWlsZWQgdG8gZ2VuZXJhdGUgcmVwb3J0IGhlYWRpbmdzIGZvciBwcmludGluZyIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBwcmludCBhbGwgaGVhZGluZ3MgKi8KKwloZWFkaW5nID0gKGNoYXIgKikgZG1fcG9vbF9lbmRfb2JqZWN0KHJoLT5tZW0pOworCWxvZ19wcmludCgiJXMiLCBoZWFkaW5nKTsKKworCWRtX3Bvb2xfZnJlZShyaC0+bWVtLCAodm9pZCAqKWhlYWRpbmcpOworCWRtX2ZyZWUoYnVmKTsKKworCXJldHVybiAxOworCisgICAgICBiYWQ6CisJZG1fZnJlZShidWYpOworCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QocmgtPm1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3VsZF9kaXNwbGF5X3JvdyhzdHJ1Y3Qgcm93ICpyb3cpCit7CisJcmV0dXJuIHJvdy0+ZmllbGRfc2VsX3N0YXR1cyB8fCByb3ctPnNlbGVjdGVkOworfQorCitzdGF0aWMgdm9pZCBfcmVjYWxjdWxhdGVfZmllbGRzKHN0cnVjdCBkbV9yZXBvcnQgKnJoKQoreworCXN0cnVjdCByb3cgKnJvdzsKKwlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZDsKKwlzaXplX3QgbGVuOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJvdywgJnJoLT5yb3dzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhmaWVsZCwgJnJvdy0+ZmllbGRzKSB7CisJCQlpZiAoKHJoLT5mbGFncyAmIFJIX1NPUlRfUkVRVUlSRUQpICYmCisJCQkgICAgKGZpZWxkLT5wcm9wcy0+ZmxhZ3MgJiBGTERfU09SVF9LRVkpKSB7CisJCQkJKCpyb3ctPnNvcnRfZmllbGRzKVtmaWVsZC0+cHJvcHMtPnNvcnRfcG9zbl0gPSBmaWVsZDsKKwkJCX0KKworCQkJaWYgKF9zaG91bGRfZGlzcGxheV9yb3cocm93KSkgeworCQkJCWxlbiA9IChpbnQpIHN0cmxlbihmaWVsZC0+cmVwb3J0X3N0cmluZyk7CisJCQkJaWYgKChsZW4gPiBmaWVsZC0+cHJvcHMtPndpZHRoKSkKKwkJCQkJZmllbGQtPnByb3BzLT53aWR0aCA9IGxlbjsKKworCQkJfQorCQl9CisJfQorCisJcmgtPmZsYWdzICY9IH5SSF9GSUVMRF9DQUxDX05FRURFRDsKK30KKworaW50IGRtX3JlcG9ydF9jb2x1bW5faGVhZGluZ3Moc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJLyogQ29sdW1ucy1hcy1yb3dzIGRvZXMgbm90IHVzZSBfcmVwb3J0X2hlYWRpbmdzLiAqLworCWlmIChyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0NPTFVNTlNfQVNfUk9XUykKKwkJcmV0dXJuIDE7CisKKwlpZiAocmgtPmZsYWdzICYgUkhfRklFTERfQ0FMQ19ORUVERUQpCisJCV9yZWNhbGN1bGF0ZV9maWVsZHMocmgpOworCisJcmV0dXJuIF9yZXBvcnRfaGVhZGluZ3MocmgpOworfQorCisvKgorICogU29ydCByb3dzIG9mIGRhdGEKKyAqLworc3RhdGljIGludCBfcm93X2NvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3Qgcm93ICpyb3dhID0gKihjb25zdCBzdHJ1Y3Qgcm93ICogY29uc3QgKikgYTsKKwljb25zdCBzdHJ1Y3Qgcm93ICpyb3diID0gKihjb25zdCBzdHJ1Y3Qgcm93ICogY29uc3QgKikgYjsKKwljb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpzZmEsICpzZmI7CisJdWludDMyX3QgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCByb3dhLT5yaC0+a2V5c19jb3VudDsgY250KyspIHsKKwkJc2ZhID0gKCpyb3dhLT5zb3J0X2ZpZWxkcylbY250XTsKKwkJc2ZiID0gKCpyb3diLT5zb3J0X2ZpZWxkcylbY250XTsKKwkJaWYgKChzZmEtPnByb3BzLT5mbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX05VTUJFUikgfHwKKwkJICAgIChzZmEtPnByb3BzLT5mbGFncyAmIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUpIHx8CisJCSAgICAoc2ZhLT5wcm9wcy0+ZmxhZ3MgJiBETV9SRVBPUlRfRklFTERfVFlQRV9USU1FKSkgeworCQkJY29uc3QgdWludDY0X3QgbnVtYSA9CisJCQkgICAgKihjb25zdCB1aW50NjRfdCAqKSBzZmEtPnNvcnRfdmFsdWU7CisJCQljb25zdCB1aW50NjRfdCBudW1iID0KKwkJCSAgICAqKGNvbnN0IHVpbnQ2NF90ICopIHNmYi0+c29ydF92YWx1ZTsKKworCQkJaWYgKG51bWEgPT0gbnVtYikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNmYS0+cHJvcHMtPmZsYWdzICYgRkxEX0FTQ0VORElORykgeworCQkJCXJldHVybiAobnVtYSA+IG51bWIpID8gMSA6IC0xOworCQkJfSBlbHNlIHsJLyogRkxEX0RFU0NFTkRJTkcgKi8KKwkJCQlyZXR1cm4gKG51bWEgPCBudW1iKSA/IDEgOiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERNX1JFUE9SVF9GSUVMRF9UWVBFX1NUUklORworCQkJICogRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU1RSSU5HX0xJU1QgKi8KKwkJCWNvbnN0IGNoYXIgKnN0cmEgPSAoY29uc3QgY2hhciAqKSBzZmEtPnNvcnRfdmFsdWU7CisJCQljb25zdCBjaGFyICpzdHJiID0gKGNvbnN0IGNoYXIgKikgc2ZiLT5zb3J0X3ZhbHVlOworCQkJaW50IGNtcCA9IHN0cmNtcChzdHJhLCBzdHJiKTsKKworCQkJaWYgKCFjbXApCisJCQkJY29udGludWU7CisKKwkJCWlmIChzZmEtPnByb3BzLT5mbGFncyAmIEZMRF9BU0NFTkRJTkcpIHsKKwkJCQlyZXR1cm4gKGNtcCA+IDApID8gMSA6IC0xOworCQkJfSBlbHNlIHsJLyogRkxEX0RFU0NFTkRJTkcgKi8KKwkJCQlyZXR1cm4gKGNtcCA8IDApID8gMSA6IC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7CQkvKiBJZGVudGljYWwgKi8KK30KKworc3RhdGljIGludCBfc29ydF9yb3dzKHN0cnVjdCBkbV9yZXBvcnQgKnJoKQoreworCXN0cnVjdCByb3cgKigqcm93cylbXTsKKwl1aW50MzJfdCBjb3VudCA9IDA7CisJc3RydWN0IHJvdyAqcm93OworCisJaWYgKCEocm93cyA9IGRtX3Bvb2xfYWxsb2MocmgtPm1lbSwgc2l6ZW9mKCoqcm93cykgKgorCQkJCWRtX2xpc3Rfc2l6ZSgmcmgtPnJvd3MpKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IHNvcnQgYXJyYXkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHJvdywgJnJoLT5yb3dzKQorCQkoKnJvd3MpW2NvdW50KytdID0gcm93OworCisJcXNvcnQocm93cywgY291bnQsIHNpemVvZigqKnJvd3MpLCBfcm93X2NvbXBhcmUpOworCisJZG1fbGlzdF9pbml0KCZyaC0+cm93cyk7CisJd2hpbGUgKGNvdW50LS0pCisJCWRtX2xpc3RfYWRkX2goJnJoLT5yb3dzLCAmKCpyb3dzKVtjb3VudF0tPmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgU1RBTkRBUkRfUVVPVEUJCSJcJyIKKyNkZWZpbmUgU1RBTkRBUkRfUEFJUgkJIj0iCisKKyNkZWZpbmUgSlNPTl9JTkRFTlRfVU5JVCAgICAgICA0CisjZGVmaW5lIEpTT05fU1BBQ0UgICAgICAgICAgICAgIiAiCisjZGVmaW5lIEpTT05fUVVPVEUgICAgICAgICAgICAgIlwiIgorI2RlZmluZSBKU09OX1BBSVIgICAgICAgICAgICAgICI6IgorI2RlZmluZSBKU09OX1NFUEFSQVRPUiAgICAgICAgICIsIgorI2RlZmluZSBKU09OX09CSkVDVF9TVEFSVCAgICAgICJ7IgorI2RlZmluZSBKU09OX09CSkVDVF9FTkQgICAgICAgICJ9IgorI2RlZmluZSBKU09OX0FSUkFZX1NUQVJUICAgICAgICJbIgorI2RlZmluZSBKU09OX0FSUkFZX0VORCAgICAgICAgICJdIgorI2RlZmluZSBKU09OX0VTQ0FQRV9DSEFSICAgICAgICJcXCIKKworI2RlZmluZSBVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyAiZG1fcmVwb3J0OiBVbmFibGUgdG8gZXh0ZW5kIG91dHB1dCBsaW5lIgorCitzdGF0aWMgaW50IF9pc19iYXNpY19yZXBvcnQoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJcmV0dXJuIHJoLT5ncm91cF9pdGVtICYmCisJICAgICAgIChyaC0+Z3JvdXBfaXRlbS0+Z3JvdXAtPnR5cGUgPT0gRE1fUkVQT1JUX0dST1VQX0JBU0lDKTsKK30KKworc3RhdGljIGludCBfaXNfanNvbl9yZXBvcnQoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJcmV0dXJuIHJoLT5ncm91cF9pdGVtICYmCisJICAgICAgIChyaC0+Z3JvdXBfaXRlbS0+Z3JvdXAtPnR5cGUgPT0gRE1fUkVQT1JUX0dST1VQX0pTT04pOworfQorCisvKgorICogUHJvZHVjZSByZXBvcnQgb3V0cHV0CisgKi8KK3N0YXRpYyBpbnQgX291dHB1dF9maWVsZChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQpCit7CisJY29uc3Qgc3RydWN0IGRtX3JlcG9ydF9maWVsZF90eXBlICpmaWVsZHMgPSBmaWVsZC0+cHJvcHMtPmltcGxpY2l0ID8gX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMKKwkJCQkJCQkJCSAgIDogcmgtPmZpZWxkczsKKwljaGFyICpmaWVsZF9pZDsKKwlpbnQzMl90IHdpZHRoOworCXVpbnQzMl90IGFsaWduOworCWNvbnN0IGNoYXIgKnJlcHN0cjsKKwljb25zdCBjaGFyICpwMV9yZXBzdHIsICpwMl9yZXBzdHI7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgYnVmX3NpemUgPSAwOworCisJaWYgKF9pc19qc29uX3JlcG9ydChyaCkpIHsKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIEpTT05fUVVPVEUsIDEpIHx8CisJCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBmaWVsZHNbZmllbGQtPnByb3BzLT5maWVsZF9udW1dLmlkLCAwKSB8fAorCQkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgSlNPTl9RVU9URSwgMSkgfHwKKwkJICAgICFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIEpTT05fUEFJUiwgMSkgfHwKKwkJICAgICFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIEpTT05fUVVPVEUsIDEpKSB7CisJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogVW5hYmxlIHRvIGV4dGVuZCBvdXRwdXQgbGluZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKHJoLT5mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfRklFTERfTkFNRV9QUkVGSVgpIHsKKwkJaWYgKCEoZmllbGRfaWQgPSBkbV9zdHJkdXAoZmllbGRzW2ZpZWxkLT5wcm9wcy0+ZmllbGRfbnVtXS5pZCkpKSB7CisJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogRmFpbGVkIHRvIGNvcHkgZmllbGQgbmFtZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgcmgtPm91dHB1dF9maWVsZF9uYW1lX3ByZWZpeCwgMCkpIHsKKwkJCWxvZ19lcnJvcihVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyk7CisJCQlkbV9mcmVlKGZpZWxkX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIF90b3VwcGVyc3RyKGZpZWxkX2lkKSwgMCkpIHsKKwkJCWxvZ19lcnJvcihVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyk7CisJCQlkbV9mcmVlKGZpZWxkX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZG1fZnJlZShmaWVsZF9pZCk7CisKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIFNUQU5EQVJEX1BBSVIsIDEpKSB7CisJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIShyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0ZJRUxEX1VOUVVPVEVEKSAmJgorCQkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgU1RBTkRBUkRfUVVPVEUsIDEpKSB7CisJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXBzdHIgPSBmaWVsZC0+cmVwb3J0X3N0cmluZzsKKwl3aWR0aCA9IGZpZWxkLT5wcm9wcy0+d2lkdGg7CisJaWYgKCEocmgtPmZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9BTElHTkVEKSkgeworCQlpZiAoX2lzX2pzb25fcmVwb3J0KHJoKSkgeworCQkJLyogRXNjYXBlIGFueSBKU09OX1FVT1RFIHRoYXQgbWF5IGFwcGVhciBpbiByZXBvcnRlZCBzdHJpbmcuICovCisJCQlwMV9yZXBzdHIgPSByZXBzdHI7CisJCQl3aGlsZSAoKHAyX3JlcHN0ciA9IHN0cnN0cihwMV9yZXBzdHIsIEpTT05fUVVPVEUpKSkgeworCQkJCWlmIChwMl9yZXBzdHIgPiBwMV9yZXBzdHIpIHsKKwkJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIHAxX3JlcHN0ciwgcDJfcmVwc3RyIC0gcDFfcmVwc3RyKSkgeworCQkJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBKU09OX0VTQ0FQRV9DSEFSLCAxKSB8fAorCQkJCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBKU09OX1FVT1RFLCAxKSkgeworCQkJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJcDFfcmVwc3RyID0gcDJfcmVwc3RyICsgMTsKKwkJCX0KKworCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIHAxX3JlcHN0ciwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIHJlcHN0ciwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCEoYWxpZ24gPSBmaWVsZC0+cHJvcHMtPmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX01BU0spKQorCQkJYWxpZ24gPSAoKGZpZWxkLT5wcm9wcy0+ZmxhZ3MgJiBETV9SRVBPUlRfRklFTERfVFlQRV9OVU1CRVIpIHx8CisJCQkJIChmaWVsZC0+cHJvcHMtPmZsYWdzICYgRE1fUkVQT1JUX0ZJRUxEX1RZUEVfU0laRSkpID8gCisJCQkJRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX1JJR0hUIDogRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX0xFRlQ7CisKKwkJLyogSW5jbHVkaW5nIHRyYWlsaW5nICdcMCchICovCisJCWJ1Zl9zaXplID0gd2lkdGggKyAxOworCQlpZiAoIShidWYgPSBkbV9tYWxsb2MoYnVmX3NpemUpKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91dHB1dCBsaW5lIGJ1ZmZlci4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGFsaWduICYgRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX0xFRlQpIHsKKwkJCWlmIChkbV9zbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJS0qLipzIiwKKwkJCQkJIHdpZHRoLCB3aWR0aCwgcmVwc3RyKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogbGVmdC1hbGlnbmVkIHNucHJpbnRmKCkgZmFpbGVkIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgYnVmLCB3aWR0aCkpIHsKKwkJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9IGVsc2UgaWYgKGFsaWduICYgRE1fUkVQT1JUX0ZJRUxEX0FMSUdOX1JJR0hUKSB7CisJCQlpZiAoZG1fc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiUqLipzIiwKKwkJCQkJIHdpZHRoLCB3aWR0aCwgcmVwc3RyKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogcmlnaHQtYWxpZ25lZCBzbnByaW50ZigpIGZhaWxlZCIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIGJ1Ziwgd2lkdGgpKSB7CisJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0ZJRUxEX05BTUVfUFJFRklYKSB7CisJCWlmICghKHJoLT5mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfRklFTERfVU5RVU9URUQpKSB7CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgU1RBTkRBUkRfUVVPVEUsIDEpKSB7CisJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoX2lzX2pzb25fcmVwb3J0KHJoKSkgeworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgSlNPTl9RVU9URSwgMSkpIHsKKwkJCWxvZ19lcnJvcihVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyk7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCWRtX2ZyZWUoYnVmKTsKKwlyZXR1cm4gMTsKKworYmFkOgorCWRtX2ZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2Rlc3Ryb3lfcm93cyhzdHJ1Y3QgZG1fcmVwb3J0ICpyaCkKK3sKKwkvKgorCSAqIGZyZWUgdGhlIGZpcnN0IHJvdyBhbGxvY2F0ZWQgdG8gdGhpcyByZXBvcnQ6IHNpbmNlIHRoaXMgaXMgYQorCSAqIHBvb2wgYWxsb2NhdGlvbiB0aGlzIHdpbGwgYWxzbyBmcmVlIGFsbCBzdWJzZXF1ZW50bHkgYWxsb2NhdGVkCisJICogcm93cyBmcm9tIHRoZSByZXBvcnQgYW5kIGFueSBhc3NvY2lhdGVkIHN0cmluZyBkYXRhLgorCSAqLworCWlmIChyaC0+Zmlyc3Rfcm93KQorCQlkbV9wb29sX2ZyZWUocmgtPm1lbSwgcmgtPmZpcnN0X3Jvdyk7CisJcmgtPmZpcnN0X3JvdyA9IE5VTEw7CisJZG1fbGlzdF9pbml0KCZyaC0+cm93cyk7CisKKwkvKiBSZXNldCBmaWVsZCB3aWR0aHMgdG8gb3JpZ2luYWwgdmFsdWVzLiAqLworCV9yZXNldF9maWVsZF9wcm9wcyhyaCk7Cit9CisKK3N0YXRpYyBpbnQgX291dHB1dF9hc19yb3dzKHN0cnVjdCBkbV9yZXBvcnQgKnJoKQoreworCWNvbnN0IHN0cnVjdCBkbV9yZXBvcnRfZmllbGRfdHlwZSAqZmllbGRzOworCXN0cnVjdCBmaWVsZF9wcm9wZXJ0aWVzICpmcDsKKwlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZDsKKwlzdHJ1Y3Qgcm93ICpyb3c7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZnAsICZyaC0+ZmllbGRfcHJvcHMpIHsKKwkJaWYgKGZwLT5mbGFncyAmIEZMRF9ISURERU4pIHsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyb3csICZyaC0+cm93cykgeworCQkJCWZpZWxkID0gZG1fbGlzdF9pdGVtKGRtX2xpc3RfZmlyc3QoJnJvdy0+ZmllbGRzKSwgc3RydWN0IGRtX3JlcG9ydF9maWVsZCk7CisJCQkJZG1fbGlzdF9kZWwoJmZpZWxkLT5saXN0KTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmllbGRzID0gZnAtPmltcGxpY2l0ID8gX2ltcGxpY2l0X3JlcG9ydF9maWVsZHMgOiByaC0+ZmllbGRzOworCisJCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QocmgtPm1lbSwgNTEyKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXQgbGluZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoKHJoLT5mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfSEVBRElOR1MpKSB7CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgZmllbGRzW2ZwLT5maWVsZF9udW1dLmhlYWRpbmcsIDApKSB7CisJCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IEZhaWxlZCB0byBleHRlbmQgcm93IGZvciBmaWVsZCBuYW1lIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgcmgtPnNlcGFyYXRvciwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogRmFpbGVkIHRvIGV4dGVuZCByb3cgd2l0aCBzZXBhcmF0b3IiKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhyb3csICZyaC0+cm93cykgeworCQkJaWYgKChmaWVsZCA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2ZpcnN0KCZyb3ctPmZpZWxkcyksIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQpKSkgeworCQkJCWlmICghX291dHB1dF9maWVsZChyaCwgZmllbGQpKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlkbV9saXN0X2RlbCgmZmllbGQtPmxpc3QpOworCQkJfQorCisJCQlpZiAoIWRtX2xpc3RfZW5kKCZyaC0+cm93cywgJnJvdy0+bGlzdCkpCisJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIHJoLT5zZXBhcmF0b3IsIDApKSB7CisJCQkJCWxvZ19lcnJvcihVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyk7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJfQorCisJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCAiXDAiLCAxKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IEZhaWxlZCB0byB0ZXJtaW5hdGUgcm93Iik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlsb2dfcHJpbnQoIiVzIiwgKGNoYXIgKikgZG1fcG9vbF9lbmRfb2JqZWN0KHJoLT5tZW0pKTsKKwl9CisKKwlfZGVzdHJveV9yb3dzKHJoKTsKKworCXJldHVybiAxOworCisgICAgICBiYWQ6CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChyaC0+bWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfb3V0cHV0X2FzX2NvbHVtbnMoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJc3RydWN0IGRtX2xpc3QgKmZoLCAqcm93aCwgKmZ0bXAsICpydG1wOworCXN0cnVjdCByb3cgKnJvdyA9IE5VTEw7CisJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQ7CisJc3RydWN0IGRtX2xpc3QgKmxhc3Rfcm93OworCWludCBkb19maWVsZF9kZWxpbTsKKwljaGFyICpsaW5lOworCisJLyogSWYgaGVhZGluZ3Mgbm90IHByaW50ZWQgeWV0LCBjYWxjdWxhdGUgZmllbGQgd2lkdGhzIGFuZCBwcmludCB0aGVtICovCisJaWYgKCEocmgtPmZsYWdzICYgUkhfSEVBRElOR1NfUFJJTlRFRCkpCisJCV9yZXBvcnRfaGVhZGluZ3MocmgpOworCisJLyogUHJpbnQgYW5kIGNsZWFyIGJ1ZmZlciAqLworCWxhc3Rfcm93ID0gZG1fbGlzdF9sYXN0KCZyaC0+cm93cyk7CisJZG1fbGlzdF9pdGVyYXRlX3NhZmUocm93aCwgcnRtcCwgJnJoLT5yb3dzKSB7CisJCXJvdyA9IGRtX2xpc3RfaXRlbShyb3doLCBzdHJ1Y3Qgcm93KTsKKworCQlpZiAoIV9zaG91bGRfZGlzcGxheV9yb3cocm93KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QocmgtPm1lbSwgNTEyKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXQgbGluZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoX2lzX2pzb25fcmVwb3J0KHJoKSkgeworCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIEpTT05fT0JKRUNUX1NUQVJULCAwKSkgeworCQkJCWxvZ19lcnJvcihVTkFCTEVfVE9fRVhURU5EX09VVFBVVF9MSU5FX01TRyk7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKworCQlkb19maWVsZF9kZWxpbSA9IDA7CisKKwkJZG1fbGlzdF9pdGVyYXRlX3NhZmUoZmgsIGZ0bXAsICZyb3ctPmZpZWxkcykgeworCQkJZmllbGQgPSBkbV9saXN0X2l0ZW0oZmgsIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQpOworCQkJaWYgKGZpZWxkLT5wcm9wcy0+ZmxhZ3MgJiBGTERfSElEREVOKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZG9fZmllbGRfZGVsaW0pIHsKKwkJCQlpZiAoX2lzX2pzb25fcmVwb3J0KHJoKSkgeworCQkJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgSlNPTl9TRVBBUkFUT1IsIDApIHx8CisJCQkJCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBKU09OX1NQQUNFLCAwKSkgeworCQkJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQkJCWdvdG8gYmFkOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KHJoLT5tZW0sIHJoLT5zZXBhcmF0b3IsIDApKSB7CisJCQkJCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlkb19maWVsZF9kZWxpbSA9IDE7CisKKwkJCWlmICghX291dHB1dF9maWVsZChyaCwgZmllbGQpKQorCQkJCWdvdG8gYmFkOworCisJCQlpZiAoIShyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX01VTFRJUExFX1RJTUVTKSkKKwkJCQlkbV9saXN0X2RlbCgmZmllbGQtPmxpc3QpOworCQl9CisKKwkJaWYgKF9pc19qc29uX3JlcG9ydChyaCkpIHsKKwkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCBKU09OX09CSkVDVF9FTkQsIDApKSB7CisJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChyb3doICE9IGxhc3Rfcm93ICYmCisJCQkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QocmgtPm1lbSwgSlNPTl9TRVBBUkFUT1IsIDApKSB7CisJCQkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCisJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChyaC0+bWVtLCAiXDAiLCAxKSkgeworCQkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IFVuYWJsZSB0byB0ZXJtaW5hdGUgb3V0cHV0IGxpbmUiKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJbGluZSA9IChjaGFyICopIGRtX3Bvb2xfZW5kX29iamVjdChyaC0+bWVtKTsKKwkJbG9nX3ByaW50KCIlKnMiLCByaC0+Z3JvdXBfaXRlbSA/IHJoLT5ncm91cF9pdGVtLT5ncm91cC0+aW5kZW50ICsgKGludCkgc3RybGVuKGxpbmUpIDogMCwgbGluZSk7CisJCWlmICghKHJoLT5mbGFncyAmIERNX1JFUE9SVF9PVVRQVVRfTVVMVElQTEVfVElNRVMpKQorCQkJZG1fbGlzdF9kZWwoJnJvdy0+bGlzdCk7CisJfQorCisJaWYgKCEocmgtPmZsYWdzICYgRE1fUkVQT1JUX09VVFBVVF9NVUxUSVBMRV9USU1FUykpCisJCV9kZXN0cm95X3Jvd3MocmgpOworCisJcmV0dXJuIDE7CisKKyAgICAgIGJhZDoKKwlkbV9wb29sX2FiYW5kb25fb2JqZWN0KHJoLT5tZW0pOworCXJldHVybiAwOworfQorCitpbnQgZG1fcmVwb3J0X2lzX2VtcHR5KHN0cnVjdCBkbV9yZXBvcnQgKnJoKQoreworCXJldHVybiBkbV9saXN0X2VtcHR5KCZyaC0+cm93cykgPyAxIDogMDsKK30KKworc3RhdGljIHN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqX2dldF90b3Btb3N0X3JlcG9ydF9ncm91cF9pdGVtKHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbTsKKworCWlmIChncm91cCAmJiAhZG1fbGlzdF9lbXB0eSgmZ3JvdXAtPml0ZW1zKSkKKwkJaXRlbSA9IGRtX2xpc3RfaXRlbShkbV9saXN0X2ZpcnN0KCZncm91cC0+aXRlbXMpLCBzdHJ1Y3QgcmVwb3J0X2dyb3VwX2l0ZW0pOworCWVsc2UKKwkJaXRlbSA9IE5VTEw7CisKKwlyZXR1cm4gaXRlbTsKK30KKworc3RhdGljIGludCBfanNvbl9vdXRwdXRfYXJyYXlfc3RhcnQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtICppdGVtKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSAoY29uc3QgY2hhciAqKSBpdGVtLT5kYXRhOworCWNoYXIgKm91dHB1dDsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAzMikpIHsKKwkJbG9nX2Vycm9yKFVOQUJMRV9UT19FWFRFTkRfT1VUUFVUX0xJTkVfTVNHKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgSlNPTl9RVU9URSwgMSkgfHwKKwkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBuYW1lLCAwKSB8fAorCSAgICAhZG1fcG9vbF9ncm93X29iamVjdChtZW0sIEpTT05fUVVPVEUgSlNPTl9QQUlSIEpTT05fU1BBQ0UgSlNPTl9BUlJBWV9TVEFSVCwgMCkgfHwKKwkgICAgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSB8fAorCSAgICAhKG91dHB1dCA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pKSkgeworCQlsb2dfZXJyb3IoVU5BQkxFX1RPX0VYVEVORF9PVVRQVVRfTElORV9NU0cpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoaXRlbS0+cGFyZW50LT5zdG9yZS5maW5pc2hlZF9jb3VudCA+IDApCisJCWxvZ19wcmludCgiJSpzIiwgaXRlbS0+Z3JvdXAtPmluZGVudCArIChpbnQpIHNpemVvZihKU09OX1NFUEFSQVRPUikgLSAxLCBKU09OX1NFUEFSQVRPUik7CisKKwlpZiAoaXRlbS0+cGFyZW50LT5wYXJlbnQgJiYgaXRlbS0+cGFyZW50LT5kYXRhKSB7CisJCWxvZ19wcmludCgiJSpzIiwgaXRlbS0+Z3JvdXAtPmluZGVudCArIChpbnQpIHNpemVvZihKU09OX09CSkVDVF9TVEFSVCkgLSAxLCBKU09OX09CSkVDVF9TVEFSVCk7CisJCWl0ZW0tPmdyb3VwLT5pbmRlbnQgKz0gSlNPTl9JTkRFTlRfVU5JVDsKKwl9CisKKwlsb2dfcHJpbnQoIiUqcyIsIGl0ZW0tPmdyb3VwLT5pbmRlbnQgKyAoaW50KSBzdHJsZW4ob3V0cHV0KSwgb3V0cHV0KTsKKwlpdGVtLT5ncm91cC0+aW5kZW50ICs9IEpTT05fSU5ERU5UX1VOSVQ7CisKKwlkbV9wb29sX2ZyZWUobWVtLCBvdXRwdXQpOworCXJldHVybiAxOworYmFkOgorCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcHJlcGFyZV9qc29uX3JlcG9ydF9vdXRwdXQoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJaWYgKHJoLT5ncm91cF9pdGVtLT5vdXRwdXRfZG9uZSAmJiBkbV9saXN0X2VtcHR5KCZyaC0+cm93cykpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiB0aGlzIHJlcG9ydCBpcyBpbiBKU09OIGdyb3VwLCBpdCBtdXN0IGJlIGF0IHRoZQorCSAqIHRvcCBvZiB0aGUgc3RhY2sgb2YgcmVwb3J0cyBzbyB0aGUgb3V0cHV0IGZyb20KKwkgKiBkaWZmZXJlbnQgcmVwb3J0cyBkbyBub3QgaW50ZXJsZWF2ZSB3aXRoIGVhY2ggb3RoZXIuCisJICovCisJaWYgKF9nZXRfdG9wbW9zdF9yZXBvcnRfZ3JvdXBfaXRlbShyaC0+Z3JvdXBfaXRlbS0+Z3JvdXApICE9IHJoLT5ncm91cF9pdGVtKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBkbV9yZXBvcnRfb3V0cHV0OiBpbnRlcmxlYXZlZCByZXBvcnRzIGRldGVjdGVkIGZvciBKU09OIG91dHB1dCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmgtPmdyb3VwX2l0ZW0tPm5lZWRzX2Nsb3NpbmcpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IGRtX3JlcG9ydF9vdXRwdXQ6IHVuZmluaXNoZWQgSlNPTiBvdXRwdXQgZGV0ZWN0ZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfanNvbl9vdXRwdXRfYXJyYXlfc3RhcnQocmgtPm1lbSwgcmgtPmdyb3VwX2l0ZW0pKQorCQlyZXR1cm5fMDsKKworCXJoLT5ncm91cF9pdGVtLT5uZWVkc19jbG9zaW5nID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcHJpbnRfYmFzaWNfcmVwb3J0X2hlYWRlcihzdHJ1Y3QgZG1fcmVwb3J0ICpyaCkKK3sKKwljb25zdCBjaGFyICpyZXBvcnRfbmFtZSA9IChjb25zdCBjaGFyICopIHJoLT5ncm91cF9pdGVtLT5kYXRhOworCXNpemVfdCBsZW4gPSBzdHJsZW4ocmVwb3J0X25hbWUpOworCWNoYXIgKnVuZGVybGluZTsKKworCWlmICghKHVuZGVybGluZSA9IGRtX3Bvb2xfemFsbG9jKHJoLT5tZW0sIGxlbiArIDEpKSkKKwkJcmV0dXJuXzA7CisKKwltZW1zZXQodW5kZXJsaW5lLCAnPScsIGxlbik7CisKKwlpZiAocmgtPmdyb3VwX2l0ZW0tPnBhcmVudC0+c3RvcmUuZmluaXNoZWRfY291bnQgPiAwKQorCQlsb2dfcHJpbnQoIiVzIiwgIiIpOworCWxvZ19wcmludCgiJXMiLCByZXBvcnRfbmFtZSk7CisJbG9nX3ByaW50KCIlcyIsIHVuZGVybGluZSk7CisKKwlkbV9wb29sX2ZyZWUocmgtPm1lbSwgdW5kZXJsaW5lKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3JlcG9ydF9vdXRwdXQoc3RydWN0IGRtX3JlcG9ydCAqcmgpCit7CisJaW50IHIgPSAwOworCisJaWYgKF9pc19qc29uX3JlcG9ydChyaCkgJiYKKwkgICAgIV9wcmVwYXJlX2pzb25fcmVwb3J0X291dHB1dChyaCkpCisJCXJldHVybl8wOworCisJaWYgKGRtX2xpc3RfZW1wdHkoJnJoLT5yb3dzKSkgeworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJoLT5mbGFncyAmIFJIX0ZJRUxEX0NBTENfTkVFREVEKQorCQlfcmVjYWxjdWxhdGVfZmllbGRzKHJoKTsKKworCWlmICgocmgtPmZsYWdzICYgUkhfU09SVF9SRVFVSVJFRCkpCisJCV9zb3J0X3Jvd3MocmgpOworCisJaWYgKF9pc19iYXNpY19yZXBvcnQocmgpICYmICFfcHJpbnRfYmFzaWNfcmVwb3J0X2hlYWRlcihyaCkpCisJCWdvdG9fb3V0OworCisJaWYgKChyaC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0NPTFVNTlNfQVNfUk9XUykpCisJCXIgPSBfb3V0cHV0X2FzX3Jvd3MocmgpOworCWVsc2UKKwkJciA9IF9vdXRwdXRfYXNfY29sdW1ucyhyaCk7CitvdXQ6CisJaWYgKHIgJiYgcmgtPmdyb3VwX2l0ZW0pCisJCXJoLT5ncm91cF9pdGVtLT5vdXRwdXRfZG9uZSA9IDE7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9ncm91cF9jcmVhdGVfc2luZ2xlKHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZXBvcnRfZ3JvdXBfY3JlYXRlX2Jhc2ljKHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZXBvcnRfZ3JvdXBfY3JlYXRlX2pzb24oc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqZ3JvdXApCit7CisJbG9nX3ByaW50KEpTT05fT0JKRUNUX1NUQVJUKTsKKwlncm91cC0+aW5kZW50ICs9IEpTT05fSU5ERU5UX1VOSVQ7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmRtX3JlcG9ydF9ncm91cF9jcmVhdGUoZG1fcmVwb3J0X2dyb3VwX3R5cGVfdCB0eXBlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwOworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtICppdGVtOworCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoInJlcG9ydF9ncm91cCIsIDEwMjQpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogZG1fcmVwb3J0X2luaXRfZ3JvdXA6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gcG9vbCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShncm91cCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpncm91cCkpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogZmFpbGVkIHRvIGFsbG9jYXRlIHJlcG9ydCBncm91cCBzdHJ1Y3R1cmUiKTsKKwkJZ290byBiYWQ7CisJfQorCisJZ3JvdXAtPm1lbSA9IG1lbTsKKwlncm91cC0+dHlwZSA9IHR5cGU7CisJZG1fbGlzdF9pbml0KCZncm91cC0+aXRlbXMpOworCisJaWYgKCEoaXRlbSA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCppdGVtKSkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBmYWlsZSB0byBhbGxvY2F0ZSByb290IHJlcG9ydCBncm91cCBpdGVtIik7CisJCWdvdG8gYmFkOworCX0KKworCWRtX2xpc3RfYWRkX2goJmdyb3VwLT5pdGVtcywgJml0ZW0tPmxpc3QpOworCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRE1fUkVQT1JUX0dST1VQX1NJTkdMRToKKwkJCWlmICghX3JlcG9ydF9ncm91cF9jcmVhdGVfc2luZ2xlKGdyb3VwKSkKKwkJCQlnb3RvX2JhZDsKKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9CQVNJQzoKKwkJCWlmICghX3JlcG9ydF9ncm91cF9jcmVhdGVfYmFzaWMoZ3JvdXApKQorCQkJCWdvdG9fYmFkOworCQkJYnJlYWs7CisJCWNhc2UgRE1fUkVQT1JUX0dST1VQX0pTT046CisJCQlpZiAoIV9yZXBvcnRfZ3JvdXBfY3JlYXRlX2pzb24oZ3JvdXApKQorCQkJCWdvdG9fYmFkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvX2JhZDsKKwl9CisKKwlyZXR1cm4gZ3JvdXA7CitiYWQ6CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9ncm91cF9wdXNoX3NpbmdsZShzdHJ1Y3QgcmVwb3J0X2dyb3VwX2l0ZW0gKml0ZW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtICppdGVtX2l0ZXI7CisJdW5zaWduZWQgY291bnQgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGl0ZW1faXRlciwgJml0ZW0tPmdyb3VwLT5pdGVtcykgeworCQlpZiAoaXRlbV9pdGVyLT5yZXBvcnQpCisJCQljb3VudCsrOworCX0KKworCWlmIChjb3VudCA+IDEpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IHVuYWJsZSB0byBhZGQgbW9yZSB0aGFuIG9uZSByZXBvcnQgIgorCQkJICAidG8gY3VycmVudCByZXBvcnQgZ3JvdXAiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9ncm91cF9wdXNoX2Jhc2ljKHN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoaXRlbS0+cmVwb3J0KSB7CisJCWlmICghKGl0ZW0tPnJlcG9ydC0+ZmxhZ3MgJiBETV9SRVBPUlRfT1VUUFVUX0JVRkZFUkVEKSkKKwkJCWl0ZW0tPnJlcG9ydC0+ZmxhZ3MgJj0gfihETV9SRVBPUlRfT1VUUFVUX01VTFRJUExFX1RJTUVTKTsKKwl9IGVsc2UgeworCQlpZiAoIW5hbWUgJiYgaXRlbS0+cGFyZW50LT5zdG9yZS5maW5pc2hlZF9jb3VudCA+IDApCisJCQlsb2dfcHJpbnQoIiVzIiwgIiIpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZXBvcnRfZ3JvdXBfcHVzaF9qc29uKHN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAobmFtZSAmJiAhKGl0ZW0tPmRhdGEgPSBkbV9wb29sX3N0cmR1cChpdGVtLT5ncm91cC0+bWVtLCBuYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9yZXBvcnQ6IGZhaWxlZCB0byBkdXBsaWNhdGUganNvbiBpdGVtIG5hbWUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGl0ZW0tPnJlcG9ydCkgeworCQlpdGVtLT5yZXBvcnQtPmZsYWdzICY9IH4oRE1fUkVQT1JUX09VVFBVVF9BTElHTkVEIHwKKwkJCQkJIERNX1JFUE9SVF9PVVRQVVRfSEVBRElOR1MgfAorCQkJCQkgRE1fUkVQT1JUX09VVFBVVF9DT0xVTU5TX0FTX1JPV1MpOworCQlpdGVtLT5yZXBvcnQtPmZsYWdzIHw9IERNX1JFUE9SVF9PVVRQVVRfQlVGRkVSRUQ7CisJfSBlbHNlIHsKKwkJaWYgKG5hbWUpIHsKKwkJCWlmICghX2pzb25fb3V0cHV0X2FycmF5X3N0YXJ0KGl0ZW0tPmdyb3VwLT5tZW0sIGl0ZW0pKQorCQkJCXJldHVybl8wOworCQl9IGVsc2UgeworCQkJaWYgKCFpdGVtLT5wYXJlbnQtPnBhcmVudCkgeworCQkJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBjYW4ndCB1c2UgdW5uYW1lZCBvYmplY3QgYXQgdG9wIGxldmVsIG9mIEpTT04gb3V0cHV0Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoaXRlbS0+cGFyZW50LT5zdG9yZS5maW5pc2hlZF9jb3VudCA+IDApCisJCQkJbG9nX3ByaW50KCIlKnMiLCBpdGVtLT5ncm91cC0+aW5kZW50ICsgKGludCkgc2l6ZW9mKEpTT05fU0VQQVJBVE9SKSAtIDEsIEpTT05fU0VQQVJBVE9SKTsKKwkJCWxvZ19wcmludCgiJSpzIiwgaXRlbS0+Z3JvdXAtPmluZGVudCArIChpbnQpIHNpemVvZihKU09OX09CSkVDVF9TVEFSVCkgLSAxLCBKU09OX09CSkVDVF9TVEFSVCk7CisJCQlpdGVtLT5ncm91cC0+aW5kZW50ICs9IEpTT05fSU5ERU5UX1VOSVQ7CisJCX0KKworCQlpdGVtLT5vdXRwdXRfZG9uZSA9IDE7CisJCWl0ZW0tPm5lZWRzX2Nsb3NpbmcgPSAxOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgZG1fcmVwb3J0X2dyb3VwX3B1c2goc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqZ3JvdXAsIHN0cnVjdCBkbV9yZXBvcnQgKnJlcG9ydCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmVwb3J0X2dyb3VwX2l0ZW0gKml0ZW0sICp0bXBfaXRlbTsKKworCWlmICghZ3JvdXApCisJCXJldHVybiAxOworCisJaWYgKCEoaXRlbSA9IGRtX3Bvb2xfemFsbG9jKGdyb3VwLT5tZW0sIHNpemVvZigqaXRlbSkpKSkgeworCQlsb2dfZXJyb3IoImRtX3JlcG9ydDogZG1fcmVwb3J0X2dyb3VwX3B1c2g6IGdyb3VwIGl0ZW0gYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpdGVtLT5yZXBvcnQgPSByZXBvcnQpKSB7CisJCWl0ZW0tPnN0b3JlLm9yaWdfcmVwb3J0X2ZsYWdzID0gcmVwb3J0LT5mbGFnczsKKwkJcmVwb3J0LT5ncm91cF9pdGVtID0gaXRlbTsKKwl9CisKKwlpdGVtLT5ncm91cCA9IGdyb3VwOworCWl0ZW0tPmRhdGEgPSBkYXRhOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHRtcF9pdGVtLCAmZ3JvdXAtPml0ZW1zKSB7CisJCWlmICghdG1wX2l0ZW0tPnJlcG9ydCkgeworCQkJaXRlbS0+cGFyZW50ID0gdG1wX2l0ZW07CisJCQlicmVhazsKKwkJfQorCX0KKworCWRtX2xpc3RfYWRkX2goJmdyb3VwLT5pdGVtcywgJml0ZW0tPmxpc3QpOworCisJc3dpdGNoIChncm91cC0+dHlwZSkgeworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9TSU5HTEU6CisJCQlpZiAoIV9yZXBvcnRfZ3JvdXBfcHVzaF9zaW5nbGUoaXRlbSwgZGF0YSkpCisJCQkJZ290b19iYWQ7CisJCQlicmVhazsKKwkJY2FzZSBETV9SRVBPUlRfR1JPVVBfQkFTSUM6CisJCQlpZiAoIV9yZXBvcnRfZ3JvdXBfcHVzaF9iYXNpYyhpdGVtLCBkYXRhKSkKKwkJCQlnb3RvX2JhZDsKKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9KU09OOgorCQkJaWYgKCFfcmVwb3J0X2dyb3VwX3B1c2hfanNvbihpdGVtLCBkYXRhKSkKKwkJCQlnb3RvX2JhZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290b19iYWQ7CisJfQorCisJcmV0dXJuIDE7CitiYWQ6CisJZG1fbGlzdF9kZWwoJml0ZW0tPmxpc3QpOworCWRtX3Bvb2xfZnJlZShncm91cC0+bWVtLCBpdGVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcmVwb3J0X2dyb3VwX3BvcF9zaW5nbGUoc3RydWN0IHJlcG9ydF9ncm91cF9pdGVtICppdGVtKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZXBvcnRfZ3JvdXBfcG9wX2Jhc2ljKHN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVwb3J0X2dyb3VwX3BvcF9qc29uKHN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbSkKK3sKKwlpZiAoaXRlbS0+b3V0cHV0X2RvbmUgJiYgaXRlbS0+bmVlZHNfY2xvc2luZykgeworCQlpZiAoaXRlbS0+ZGF0YSkgeworCQkJaXRlbS0+Z3JvdXAtPmluZGVudCAtPSBKU09OX0lOREVOVF9VTklUOworCQkJbG9nX3ByaW50KCIlKnMiLCBpdGVtLT5ncm91cC0+aW5kZW50ICsgKGludCkgc2l6ZW9mKEpTT05fQVJSQVlfRU5EKSAtIDEsIEpTT05fQVJSQVlfRU5EKTsKKwkJfQorCQlpZiAoaXRlbS0+cGFyZW50LT5kYXRhICYmIGl0ZW0tPnBhcmVudC0+cGFyZW50KSB7CisJCQlpdGVtLT5ncm91cC0+aW5kZW50IC09IEpTT05fSU5ERU5UX1VOSVQ7CisJCQlsb2dfcHJpbnQoIiUqcyIsIGl0ZW0tPmdyb3VwLT5pbmRlbnQgKyAoaW50KSBzaXplb2YoSlNPTl9PQkpFQ1RfRU5EKSAtIDEsIEpTT05fT0JKRUNUX0VORCk7CisJCX0KKwkJaXRlbS0+bmVlZHNfY2xvc2luZyA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9yZXBvcnRfZ3JvdXBfcG9wKHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbTsKKworCWlmICghZ3JvdXApCisJCXJldHVybiAxOworCisJaWYgKCEoaXRlbSA9IF9nZXRfdG9wbW9zdF9yZXBvcnRfZ3JvdXBfaXRlbShncm91cCkpKSB7CisJCWxvZ19lcnJvcigiZG1fcmVwb3J0OiBkbV9yZXBvcnRfZ3JvdXBfcG9wOiBncm91cCBoYXMgbm8gaXRlbXMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChncm91cC0+dHlwZSkgeworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9TSU5HTEU6CisJCQlpZiAoIV9yZXBvcnRfZ3JvdXBfcG9wX3NpbmdsZShpdGVtKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9CQVNJQzoKKwkJCWlmICghX3JlcG9ydF9ncm91cF9wb3BfYmFzaWMoaXRlbSkpCisJCQkJcmV0dXJuXzA7CisJCQlicmVhazsKKwkJY2FzZSBETV9SRVBPUlRfR1JPVVBfSlNPTjoKKwkJCWlmICghX3JlcG9ydF9ncm91cF9wb3BfanNvbihpdGVtKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisgICAgICAgIH0KKworCWRtX2xpc3RfZGVsKCZpdGVtLT5saXN0KTsKKworCWlmIChpdGVtLT5yZXBvcnQpIHsKKwkJaXRlbS0+cmVwb3J0LT5mbGFncyA9IGl0ZW0tPnN0b3JlLm9yaWdfcmVwb3J0X2ZsYWdzOworCQlpdGVtLT5yZXBvcnQtPmdyb3VwX2l0ZW0gPSBOVUxMOworCX0KKworCWlmIChpdGVtLT5wYXJlbnQpCisJCWl0ZW0tPnBhcmVudC0+c3RvcmUuZmluaXNoZWRfY291bnQrKzsKKworCWRtX3Bvb2xfZnJlZShncm91cC0+bWVtLCBpdGVtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVwb3J0X2dyb3VwX2Rlc3Ryb3lfc2luZ2xlKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9ncm91cF9kZXN0cm95X2Jhc2ljKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9ncm91cF9kZXN0cm95X2pzb24odm9pZCkKK3sKKwlsb2dfcHJpbnQoSlNPTl9PQkpFQ1RfRU5EKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3JlcG9ydF9ncm91cF9kZXN0cm95KHN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCByZXBvcnRfZ3JvdXBfaXRlbSAqaXRlbSwgKnRtcF9pdGVtOworCWludCByID0gMDsKKworCWlmICghZ3JvdXApCisJCXJldHVybiAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoaXRlbSwgdG1wX2l0ZW0sICZncm91cC0+aXRlbXMpIHsKKwkJaWYgKGl0ZW0tPnJlcG9ydCAmJiAhZG1fcmVwb3J0X291dHB1dChpdGVtLT5yZXBvcnQpKQorCQkJZ290b19vdXQ7CisJCWlmICghZG1fcmVwb3J0X2dyb3VwX3BvcChncm91cCkpCisJCQlnb3RvX291dDsKKwl9CisKKwlzd2l0Y2ggKGdyb3VwLT50eXBlKSB7CisJCWNhc2UgRE1fUkVQT1JUX0dST1VQX1NJTkdMRToKKwkJCWlmICghX3JlcG9ydF9ncm91cF9kZXN0cm95X3NpbmdsZSgpKQorCQkJCWdvdG9fb3V0OworCQkJYnJlYWs7CisJCWNhc2UgRE1fUkVQT1JUX0dST1VQX0JBU0lDOgorCQkJaWYgKCFfcmVwb3J0X2dyb3VwX2Rlc3Ryb3lfYmFzaWMoKSkKKwkJCQlnb3RvX291dDsKKwkJCWJyZWFrOworCQljYXNlIERNX1JFUE9SVF9HUk9VUF9KU09OOgorCQkJaWYgKCFfcmVwb3J0X2dyb3VwX2Rlc3Ryb3lfanNvbigpKQorCQkJCWdvdG9fb3V0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvX291dDsKKyAgICAgICAgfQorCisJciA9IDE7CitvdXQ6CisJZG1fcG9vbF9kZXN0cm95KGdyb3VwLT5tZW0pOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGliZG0vbGliZG0tc3RhdHMuYyBiL2xpYmRtL2xpYmRtLXN0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyZTE5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2xpYmRtLXN0YXRzLmMKQEAgLTAsMCArMSw0NDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBfc3RhdHNfZ2V0X2V4dGVudHNfZm9yX2ZpbGUoKSBiYXNlZCBpbiBwYXJ0IG9uIGZpbGVmcmFnX2ZpZW1hcCgpIGZyb20KKyAqIGUyZnNwcm9ncy9taXNjL2ZpbGVmcmFnLmMuIENvcHlyaWdodCAyMDAzIGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorCisjaW5jbHVkZSAibWF0aC5oIiAvKiBsb2cxMCgpICovCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+IC8qIGZzdGF0ZnMgKi8KKworI2lmZGVmIF9fbGludXhfXworICAjaW5jbHVkZSA8bGludXgvZnMuaD4gLyogRlNfSU9DX0ZJRU1BUCAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJTlVYX0ZJRU1BUF9ICisgICNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4gLyogZmllbWFwICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElOVVhfTUFHSUNfSAorICAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4gLyogQlRSRlNfU1VQRVJfTUFHSUMgKi8KKyNlbmRpZgorCisjZGVmaW5lIERNX1NUQVRTX1JFR0lPTl9OT1RfUFJFU0VOVCBVSU5UNjRfTUFYCisjZGVmaW5lIERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UIERNX1NUQVRTX0dST1VQX05PTkUKKworI2RlZmluZSBOU0VDX1BFUl9VU0VDICAgMTAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfTVNFQyAgIDEwMDAwMDBMCisjZGVmaW5lIE5TRUNfUEVSX1NFQyAgICAxMDAwMDAwMDAwTAorCisjZGVmaW5lIFBSRUNJU0VfQVJHICJwcmVjaXNlX3RpbWVzdGFtcHMiCisjZGVmaW5lIEhJU1RPR1JBTV9BUkcgImhpc3RvZ3JhbToiCisKKyNkZWZpbmUgU1RBVFNfUk9XX0JVRl9MRU4gNDA5NgorI2RlZmluZSBTVEFUU19NU0dfQlVGX0xFTiAxMDI0CisjZGVmaW5lIFNUQVRTX0ZJRV9CVUZfTEVOIDIwNDgKKworI2RlZmluZSBTRUNUT1JfU0hJRlQgOUwKKworLyogSGlzdG9ncmFtIGJpbiAqLworc3RydWN0IGRtX2hpc3RvZ3JhbV9iaW4geworCXVpbnQ2NF90IHVwcGVyOyAvKiBVcHBlciBib3VuZCBvbiB0aGlzIGJpbi4gKi8KKwl1aW50NjRfdCBjb3VudDsgLyogQ291bnQgdmFsdWUgZm9yIHRoaXMgYmluLiAqLworfTsKKworc3RydWN0IGRtX2hpc3RvZ3JhbSB7CisJLyogVGhlIHN0YXRzIGhhbmRsZSB0aGlzIGhpc3RvZ3JhbSBiZWxvbmdzIHRvLiAqLworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zOworCS8qIFRoZSByZWdpb24gdGhpcyBoaXN0b2dyYW0gYmVsb25ncyB0by4gKi8KKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHNfcmVnaW9uICpyZWdpb247CisJdWludDY0X3Qgc3VtOyAvKiBTdW0gb2YgaGlzdG9ncmFtIGJpbiBjb3VudHMuICovCisJaW50IG5yX2JpbnM7IC8qIE51bWJlciBvZiBoaXN0b2dyYW0gYmlucyBhc3NpZ25lZC4gKi8KKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiBiaW5zWzBdOworfTsKKworLyoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvc3RhdGlzdGljcy50eHQgZm9yIGZ1bGwgZGVzY3JpcHRpb25zCisgKiBvZiB0aGUgZGV2aWNlLW1hcHBlciBzdGF0aXN0aWNzIGNvdW50ZXIgZmllbGRzLgorICovCitzdHJ1Y3QgZG1fc3RhdHNfY291bnRlcnMgeworCXVpbnQ2NF90IHJlYWRzOwkJICAgIC8qIE51bSByZWFkcyBjb21wbGV0ZWQgKi8KKwl1aW50NjRfdCByZWFkc19tZXJnZWQ7CSAgICAvKiBOdW0gcmVhZHMgbWVyZ2VkICovCisJdWludDY0X3QgcmVhZF9zZWN0b3JzOwkgICAgLyogTnVtIHNlY3RvcnMgcmVhZCAqLworCXVpbnQ2NF90IHJlYWRfbnNlY3M7CSAgICAvKiBOdW0gbWlsbGlzZWNvbmRzIHNwZW50IHJlYWRpbmcgKi8KKwl1aW50NjRfdCB3cml0ZXM7CSAgICAvKiBOdW0gd3JpdGVzIGNvbXBsZXRlZCAqLworCXVpbnQ2NF90IHdyaXRlc19tZXJnZWQ7CSAgICAvKiBOdW0gd3JpdGVzIG1lcmdlZCAqLworCXVpbnQ2NF90IHdyaXRlX3NlY3RvcnM7CSAgICAvKiBOdW0gc2VjdG9ycyB3cml0dGVuICovCisJdWludDY0X3Qgd3JpdGVfbnNlY3M7CSAgICAvKiBOdW0gbWlsbGlzZWNvbmRzIHNwZW50IHdyaXRpbmcgKi8KKwl1aW50NjRfdCBpb19pbl9wcm9ncmVzczsgICAgLyogTnVtIEkvT3MgY3VycmVudGx5IGluIHByb2dyZXNzICovCisJdWludDY0X3QgaW9fbnNlY3M7CSAgICAvKiBOdW0gbWlsbGlzZWNvbmRzIHNwZW50IGRvaW5nIEkvT3MgKi8KKwl1aW50NjRfdCB3ZWlnaHRlZF9pb19uc2VjczsgLyogV2VpZ2h0ZWQgbnVtIG1pbGxpc2Vjb25kcyBkb2luZyBJL09zICovCisJdWludDY0X3QgdG90YWxfcmVhZF9uc2VjczsgIC8qIFRvdGFsIHRpbWUgc3BlbnQgcmVhZGluZyBpbiBtaWxsaXNlY29uZHMgKi8KKwl1aW50NjRfdCB0b3RhbF93cml0ZV9uc2VjczsgLyogVG90YWwgdGltZSBzcGVudCB3cml0aW5nIGluIG1pbGxpc2Vjb25kcyAqLworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmhpc3RvZ3JhbTsgLyogSGlzdG9ncmFtLiAqLworfTsKKworc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiB7CisJdWludDY0X3QgcmVnaW9uX2lkOyAvKiBhcyByZXR1cm5lZCBieSBAc3RhdHNfbGlzdCAqLworCXVpbnQ2NF90IGdyb3VwX2lkOworCXVpbnQ2NF90IHN0YXJ0OworCXVpbnQ2NF90IGxlbjsKKwl1aW50NjRfdCBzdGVwOworCWNoYXIgKnByb2dyYW1faWQ7CisJY2hhciAqYXV4X2RhdGE7CisJdWludDY0X3QgdGltZXNjYWxlOyAvKiBwcmVjaXNlX3RpbWVzdGFtcHMgaXMgcGVyLXJlZ2lvbiAqLworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kczsgLyogaGlzdG9ncmFtIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgZG1faGlzdG9ncmFtICpoaXN0b2dyYW07IC8qIGFnZ3JlZ2F0ZSBjYWNoZSAqLworCXN0cnVjdCBkbV9zdGF0c19jb3VudGVycyAqY291bnRlcnM7Cit9OworCitzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXAgeworCXVpbnQ2NF90IGdyb3VwX2lkOworCWNvbnN0IGNoYXIgKmFsaWFzOworCWRtX2JpdHNldF90IHJlZ2lvbnM7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSAqaGlzdG9ncmFtOworfTsKKworc3RydWN0IGRtX3N0YXRzIHsKKwkvKiBkZXZpY2UgYmluZGluZyAqLworCWludCBiaW5kX21ham9yOyAgLyogZGV2aWNlIG1ham9yIHRoYXQgdGhpcyBkbV9zdGF0cyBvYmplY3QgaXMgYm91bmQgdG8gKi8KKwlpbnQgYmluZF9taW5vcjsgIC8qIGRldmljZSBtaW5vciB0aGF0IHRoaXMgZG1fc3RhdHMgb2JqZWN0IGlzIGJvdW5kIHRvICovCisJY2hhciAqYmluZF9uYW1lOyAvKiBkZXZpY2UtbWFwcGVyIGRldmljZSBuYW1lICovCisJY2hhciAqYmluZF91dWlkOyAvKiBkZXZpY2UtbWFwcGVyIFVVSUQgKi8KKwljaGFyICpwcm9ncmFtX2lkOyAvKiBkZWZhdWx0IHByb2dyYW1faWQgZm9yIHRoaXMgaGFuZGxlICovCisJY29uc3QgY2hhciAqbmFtZTsgLyogY2FjaGVkIGRldmljZV9uYW1lIHVzZWQgZm9yIHJlcG9ydGluZyAqLworCXN0cnVjdCBkbV9wb29sICptZW07IC8qIG1lbW9yeSBwb29sIGZvciByZWdpb24gYW5kIGNvdW50ZXIgdGFibGVzICovCisJc3RydWN0IGRtX3Bvb2wgKmhpc3RfbWVtOyAvKiBzZXBhcmF0ZSBwb29sIGZvciBoaXN0b2dyYW0gdGFibGVzICovCisJc3RydWN0IGRtX3Bvb2wgKmdyb3VwX21lbTsgLyogc2VwYXJhdGUgcG9vbCBmb3IgZ3JvdXAgdGFibGVzICovCisJdWludDY0X3QgbnJfcmVnaW9uczsgLyogdG90YWwgbnVtYmVyIG9mIHByZXNlbnQgcmVnaW9ucyAqLworCXVpbnQ2NF90IG1heF9yZWdpb247IC8qIHNpemUgb2YgdGhlIHJlZ2lvbnMgdGFibGUgKi8KKwl1aW50NjRfdCBpbnRlcnZhbF9uczsgIC8qIHNhbXBsaW5nIGludGVydmFsIGluIG5hbm9zZWNvbmRzICovCisJdWludDY0X3QgdGltZXNjYWxlOyAvKiBkZWZhdWx0IHNhbXBsZSB2YWx1ZSBtdWx0aXBsaWVyICovCisJaW50IHByZWNpc2U7IC8qIHVzZSBwcmVjaXNlX3RpbWVzdGFtcHMgd2hlbiBjcmVhdGluZyByZWdpb25zICovCisJc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqcmVnaW9uczsKKwlzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXAgKmdyb3VwczsKKwkvKiBzdGF0aXN0aWNzIGN1cnNvciAqLworCXVpbnQ2NF90IHdhbGtfZmxhZ3M7IC8qIHdhbGsgY29udHJvbCBmbGFncyAqLworCXVpbnQ2NF90IGN1cl9mbGFnczsKKwl1aW50NjRfdCBjdXJfZ3JvdXA7CisJdWludDY0X3QgY3VyX3JlZ2lvbjsKKwl1aW50NjRfdCBjdXJfYXJlYTsKK307CisKKyNkZWZpbmUgUFJPQ19TRUxGX0NPTU0gIi9wcm9jL3NlbGYvY29tbSIKK3N0YXRpYyBjaGFyICpfcHJvZ3JhbV9pZF9mcm9tX3Byb2Modm9pZCkKK3sKKwlGSUxFICpjb21tID0gTlVMTDsKKwljaGFyIGJ1ZltTVEFUU19ST1dfQlVGX0xFTl07CisKKwlpZiAoIShjb21tID0gZm9wZW4oUFJPQ19TRUxGX0NPTU0sICJyIikpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmICghZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgY29tbSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcmVhZCBmcm9tICVzIiwgUFJPQ19TRUxGX0NPTU0pOworCQlpZiAoZmNsb3NlKGNvbW0pKQorCQkJc3RhY2s7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChmY2xvc2UoY29tbSkpCisJCXN0YWNrOworCisJcmV0dXJuIGRtX3N0cmR1cChidWYpOworfQorCitzdGF0aWMgdWludDY0X3QgX25yX2FyZWFzKHVpbnQ2NF90IGxlbiwgdWludDY0X3Qgc3RlcCkKK3sKKwkvKiBEZWZhdWx0IGlzIG9uZSBhcmVhLiAqLworCWlmICghbGVuIHx8ICFzdGVwKQorCQlyZXR1cm4gMTsKKwkvKgorCSAqIGRyaXZlcnMvbWQvZG0tc3RhdHMuYzo6bWVzc2FnZV9zdGF0c19jcmVhdGUoKQorCSAqIEEgcmVnaW9uIG1heSBiZSBzdWItZGl2aWRlZCBpbnRvIGFyZWFzIHdpdGggdGhlaXIgb3duIGNvdW50ZXJzLgorCSAqIEFueSBwYXJ0aWFsIGFyZWEgYXQgdGhlIGVuZCBvZiB0aGUgcmVnaW9uIGlzIHRyZWF0ZWQgYXMgYW4KKwkgKiBhZGRpdGlvbmFsIGNvbXBsZXRlIGFyZWEuCisJICovCisJcmV0dXJuIChsZW4gKyBzdGVwIC0gMSkgLyBzdGVwOworfQorCitzdGF0aWMgdWludDY0X3QgX25yX2FyZWFzX3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHNfcmVnaW9uICpyZWdpb24pCit7CisJcmV0dXJuIF9ucl9hcmVhcyhyZWdpb24tPmxlbiwgcmVnaW9uLT5zdGVwKTsKK30KKworc3RydWN0IGRtX3N0YXRzICpkbV9zdGF0c19jcmVhdGUoY29uc3QgY2hhciAqcHJvZ3JhbV9pZCkKK3sKKwlzaXplX3QgaGlzdF9oaW50ID0gc2l6ZW9mKHN0cnVjdCBkbV9oaXN0b2dyYW1fYmluKTsKKwlzaXplX3QgZ3JvdXBfaGludCA9IHNpemVvZihzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXApOworCXN0cnVjdCBkbV9zdGF0cyAqZG1zID0gTlVMTDsKKworCWlmICghKGRtcyA9IGRtX3phbGxvYyhzaXplb2YoKmRtcykpKSkKKwkJcmV0dXJuX05VTEw7CisKKwkvKiBGSVhNRTogYmV0dGVyIGhpbnQuICovCisJaWYgKCEoZG1zLT5tZW0gPSBkbV9wb29sX2NyZWF0ZSgic3RhdHNfcG9vbCIsIDQwOTYpKSkgeworCQlkbV9mcmVlKGRtcyk7CisJCXJldHVybl9OVUxMOworCX0KKworCWlmICghKGRtcy0+aGlzdF9tZW0gPSBkbV9wb29sX2NyZWF0ZSgiaGlzdG9ncmFtX3Bvb2wiLCBoaXN0X2hpbnQpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShkbXMtPmdyb3VwX21lbSA9IGRtX3Bvb2xfY3JlYXRlKCJncm91cF9wb29sIiwgZ3JvdXBfaGludCkpKQorCQlnb3RvX2JhZDsKKworCWlmICghcHJvZ3JhbV9pZCB8fCAhc3RybGVuKHByb2dyYW1faWQpKQorCQlkbXMtPnByb2dyYW1faWQgPSBfcHJvZ3JhbV9pZF9mcm9tX3Byb2MoKTsKKwllbHNlCisJCWRtcy0+cHJvZ3JhbV9pZCA9IGRtX3N0cmR1cChwcm9ncmFtX2lkKTsKKworCWlmICghZG1zLT5wcm9ncmFtX2lkKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcHJvZ3JhbV9pZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlkbXMtPmJpbmRfbWFqb3IgPSAtMTsKKwlkbXMtPmJpbmRfbWlub3IgPSAtMTsKKwlkbXMtPmJpbmRfbmFtZSA9IE5VTEw7CisJZG1zLT5iaW5kX3V1aWQgPSBOVUxMOworCisJZG1zLT5uYW1lID0gTlVMTDsKKworCS8qIGJ5IGRlZmF1bHQgYWxsIHJlZ2lvbnMgdXNlIG1zZWMgcHJlY2lzaW9uICovCisJZG1zLT50aW1lc2NhbGUgPSBOU0VDX1BFUl9NU0VDOworCWRtcy0+cHJlY2lzZSA9IDA7CisKKwlkbXMtPm5yX3JlZ2lvbnMgPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7CisJZG1zLT5tYXhfcmVnaW9uID0gRE1fU1RBVFNfUkVHSU9OX05PVF9QUkVTRU5UOworCWRtcy0+cmVnaW9ucyA9IE5VTEw7CisKKwkvKiBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB3YWxrIHZlcnNpb24gKi8KKwlkbXMtPndhbGtfZmxhZ3MgPSBkbXMtPmN1cl9mbGFncyA9IERNX1NUQVRTX1dBTEtfREVGQVVMVDsKKworCXJldHVybiBkbXM7CisKK2JhZDoKKwlkbV9wb29sX2Rlc3Ryb3koZG1zLT5tZW0pOworCWlmIChkbXMtPmhpc3RfbWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koZG1zLT5oaXN0X21lbSk7CisJaWYgKGRtcy0+Z3JvdXBfbWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koZG1zLT5ncm91cF9tZW0pOworCWRtX2ZyZWUoZG1zKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFRlc3Qgd2hldGhlciB0aGUgc3RhdHMgcmVnaW9uIHBvaW50ZWQgdG8gYnkgcmVnaW9uIGlzIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgX3N0YXRzX3JlZ2lvbl9wcmVzZW50KGNvbnN0IHN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbikKK3sKKwlyZXR1cm4gIShyZWdpb24tPnJlZ2lvbl9pZCA9PSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQpOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSBzdGF0cyBncm91cCBwb2ludGVkIHRvIGJ5IGdyb3VwIGlzIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgX3N0YXRzX2dyb3VwX3ByZXNlbnQoY29uc3Qgc3RydWN0IGRtX3N0YXRzX2dyb3VwICpncm91cCkKK3sKKwlyZXR1cm4gIShncm91cC0+Z3JvdXBfaWQgPT0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQpOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIGEgc3RhdHMgZ3JvdXAgaWQgaXMgcHJlc2VudC4KKyAqLworc3RhdGljIGludCBfc3RhdHNfZ3JvdXBfaWRfcHJlc2VudChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgaWQpCit7CisJc3RydWN0IGRtX3N0YXRzX2dyb3VwICpncm91cCA9IE5VTEw7CisKKwlpZiAoIWRtcyB8fCAhZG1zLT5yZWdpb25zKQorCQlyZXR1cm5fMDsKKworCWlmIChpZCA+IGRtcy0+bWF4X3JlZ2lvbikKKwkJcmV0dXJuIDA7CisKKwlncm91cCA9ICZkbXMtPmdyb3Vwc1tpZF07CisKKwlyZXR1cm4gX3N0YXRzX2dyb3VwX3ByZXNlbnQoZ3JvdXApOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiByZWdpb25faWQgaXMgYSBtZW1iZXIgb2YgYW55IGdyb3VwLgorICovCitzdGF0aWMgdWludDY0X3QgX3N0YXRzX3JlZ2lvbl9pc19ncm91cGVkKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyogZG1zLAorCQkJCQkgdWludDY0X3QgcmVnaW9uX2lkKQoreworCXVpbnQ2NF90IGdyb3VwX2lkOworCisJaWYgKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19HUk9VUF9OT1RfUFJFU0VOVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV9zdGF0c19yZWdpb25fcHJlc2VudCgmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0pKQorCQlyZXR1cm4gMDsKKworCWdyb3VwX2lkID0gZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0uZ3JvdXBfaWQ7CisKKwlyZXR1cm4gZ3JvdXBfaWQgIT0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19oaXN0b2dyYW1zX2Rlc3Ryb3koc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fc3RhdHNfcmVnaW9uICpyZWdpb24pCit7CisJLyogVW5wb3B1bGF0ZWQgaGFuZGxlLiAqLworCWlmICghcmVnaW9uLT5jb3VudGVycykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGcmVlIGV2ZXJ5dGhpbmcgaW4gdGhlIHBvb2wgYmFjayB0byB0aGUgZmlyc3QgaGlzdG9ncmFtLgorCSAqLworCWlmIChyZWdpb24tPmNvdW50ZXJzWzBdLmhpc3RvZ3JhbSkKKwkJZG1fcG9vbF9mcmVlKG1lbSwgcmVnaW9uLT5jb3VudGVyc1swXS5oaXN0b2dyYW0pOworfQorCitzdGF0aWMgdm9pZCBfc3RhdHNfcmVnaW9uX2Rlc3Ryb3koc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqcmVnaW9uKQoreworCWlmICghX3N0YXRzX3JlZ2lvbl9wcmVzZW50KHJlZ2lvbikpCisJCXJldHVybjsKKworCXJlZ2lvbi0+c3RhcnQgPSByZWdpb24tPmxlbiA9IHJlZ2lvbi0+c3RlcCA9IDA7CisJcmVnaW9uLT50aW1lc2NhbGUgPSAwOworCisJLyoKKwkgKiBEb24ndCBmcmVlIGNvdW50ZXJzIGFuZCBoaXN0b2dyYW0gYm91bmRzIGhlcmU6IHRoZXkgYXJlCisJICogZHJvcHBlZCBmcm9tIHRoZSBwb29sIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiByZWdpb25zIHRhYmxlLgorCSAqCisJICogVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSBhbGwgYWxsb2NhdGVkIHdpdGggZG1fbWFsbG9jLgorCSAqLworCisJcmVnaW9uLT5jb3VudGVycyA9IE5VTEw7CisJcmVnaW9uLT5ib3VuZHMgPSBOVUxMOworCisJaWYgKHJlZ2lvbi0+cHJvZ3JhbV9pZCkKKwkJZG1fZnJlZShyZWdpb24tPnByb2dyYW1faWQpOworCXJlZ2lvbi0+cHJvZ3JhbV9pZCA9IE5VTEw7CisJaWYgKHJlZ2lvbi0+YXV4X2RhdGEpCisJCWRtX2ZyZWUocmVnaW9uLT5hdXhfZGF0YSk7CisJcmVnaW9uLT5hdXhfZGF0YSA9IE5VTEw7CisJcmVnaW9uLT5yZWdpb25faWQgPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19yZWdpb25zX2Rlc3Ryb3koc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGRtcy0+bWVtOworCXVpbnQ2NF90IGk7CisKKwlpZiAoIWRtcy0+cmVnaW9ucykKKwkJcmV0dXJuOworCisJLyogd2FsayBiYWNrd2FyZHMgdG8gb2JleSBwb29sIG9yZGVyICovCisJZm9yIChpID0gZG1zLT5tYXhfcmVnaW9uOyAoaSAhPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQpOyBpLS0pIHsKKwkJX3N0YXRzX2hpc3RvZ3JhbXNfZGVzdHJveShkbXMtPmhpc3RfbWVtLCAmZG1zLT5yZWdpb25zW2ldKTsKKwkJX3N0YXRzX3JlZ2lvbl9kZXN0cm95KCZkbXMtPnJlZ2lvbnNbaV0pOworCX0KKworCWRtX3Bvb2xfZnJlZShtZW0sIGRtcy0+cmVnaW9ucyk7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19ncm91cF9kZXN0cm95KHN0cnVjdCBkbV9zdGF0c19ncm91cCAqZ3JvdXApCit7CisJaWYgKCFfc3RhdHNfZ3JvdXBfcHJlc2VudChncm91cCkpCisJCXJldHVybjsKKworCWdyb3VwLT5oaXN0b2dyYW0gPSBOVUxMOworCisJaWYgKGdyb3VwLT5hbGlhcykgeworCQlkbV9mcmVlKChjaGFyICopIGdyb3VwLT5hbGlhcyk7CisJCWdyb3VwLT5hbGlhcyA9IE5VTEw7CisJfQorCWlmIChncm91cC0+cmVnaW9ucykgeworCQlkbV9iaXRzZXRfZGVzdHJveShncm91cC0+cmVnaW9ucyk7CisJCWdyb3VwLT5yZWdpb25zID0gTlVMTDsKKwl9CisJZ3JvdXAtPmdyb3VwX2lkID0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19ncm91cHNfZGVzdHJveShzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwl1aW50NjRfdCBpOworCisJaWYgKCFkbXMtPmdyb3VwcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gZG1zLT5tYXhfcmVnaW9uOyAoaSAhPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQpOyBpLS0pCisJCV9zdGF0c19ncm91cF9kZXN0cm95KCZkbXMtPmdyb3Vwc1tpXSk7CisJZG1fcG9vbF9mcmVlKGRtcy0+Z3JvdXBfbWVtLCBkbXMtPmdyb3Vwcyk7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9zdGF0c19kZXZpY2Uoc3RydWN0IGRtX3N0YXRzICpkbXMsIHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJaWYgKGRtcy0+YmluZF9uYW1lKQorCQlyZXR1cm4gZG1fdGFza19zZXRfbmFtZShkbXQsIGRtcy0+YmluZF9uYW1lKTsKKwlpZiAoZG1zLT5iaW5kX3V1aWQpCisJCXJldHVybiBkbV90YXNrX3NldF91dWlkKGRtdCwgZG1zLT5iaW5kX3V1aWQpOworCWlmIChkbXMtPmJpbmRfbWFqb3IgPiAwKQorCQlyZXR1cm4gZG1fdGFza19zZXRfbWFqb3IoZG10LCBkbXMtPmJpbmRfbWFqb3IpCisJCQkmJiBkbV90YXNrX3NldF9taW5vcihkbXQsIGRtcy0+YmluZF9taW5vcik7CisJcmV0dXJuXzA7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX2JvdW5kKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCWlmIChkbXMtPmJpbmRfbWFqb3IgPiAwIHx8IGRtcy0+YmluZF9uYW1lIHx8IGRtcy0+YmluZF91dWlkKQorCQlyZXR1cm4gMTsKKwkvKiAlcCBmb3JtYXQgc3BlY2lmaWVyIGV4cGVjdHMgYSB2b2lkIHBvaW50ZXIuICovCisJbG9nX2RlYnVnKCJTdGF0cyBoYW5kbGUgYXQgJXAgaXMgbm90IGJvdW5kLiIsICh2b2lkICopIGRtcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19jbGVhcl9iaW5kaW5nKHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCWlmIChkbXMtPmJpbmRfbmFtZSkKKwkJZG1fcG9vbF9mcmVlKGRtcy0+bWVtLCBkbXMtPmJpbmRfbmFtZSk7CisJaWYgKGRtcy0+YmluZF91dWlkKQorCQlkbV9wb29sX2ZyZWUoZG1zLT5tZW0sIGRtcy0+YmluZF91dWlkKTsKKwlpZiAoZG1zLT5uYW1lKQorCQlkbV9mcmVlKChjaGFyICopIGRtcy0+bmFtZSk7CisKKwlkbXMtPmJpbmRfbmFtZSA9IGRtcy0+YmluZF91dWlkID0gTlVMTDsKKwlkbXMtPmJpbmRfbWFqb3IgPSBkbXMtPmJpbmRfbWlub3IgPSAtMTsKKwlkbXMtPm5hbWUgPSBOVUxMOworfQorCitpbnQgZG1fc3RhdHNfYmluZF9kZXZubyhzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgaW50IG1ham9yLCBpbnQgbWlub3IpCit7CisJX3N0YXRzX2NsZWFyX2JpbmRpbmcoZG1zKTsKKwlfc3RhdHNfcmVnaW9uc19kZXN0cm95KGRtcyk7CisJX3N0YXRzX2dyb3Vwc19kZXN0cm95KGRtcyk7CisKKwlkbXMtPmJpbmRfbWFqb3IgPSBtYWpvcjsKKwlkbXMtPmJpbmRfbWlub3IgPSBtaW5vcjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfYmluZF9uYW1lKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICpuYW1lKQoreworCV9zdGF0c19jbGVhcl9iaW5kaW5nKGRtcyk7CisJX3N0YXRzX3JlZ2lvbnNfZGVzdHJveShkbXMpOworCV9zdGF0c19ncm91cHNfZGVzdHJveShkbXMpOworCisJaWYgKCEoZG1zLT5iaW5kX25hbWUgPSBkbV9wb29sX3N0cmR1cChkbXMtPm1lbSwgbmFtZSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfYmluZF91dWlkKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICp1dWlkKQoreworCV9zdGF0c19jbGVhcl9iaW5kaW5nKGRtcyk7CisJX3N0YXRzX3JlZ2lvbnNfZGVzdHJveShkbXMpOworCV9zdGF0c19ncm91cHNfZGVzdHJveShkbXMpOworCisJaWYgKCEoZG1zLT5iaW5kX3V1aWQgPSBkbV9wb29sX3N0cmR1cChkbXMtPm1lbSwgdXVpZCkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGF0c19jaGVja19wcmVjaXNlX3RpbWVzdGFtcHMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJLyogQWxyZWFkeSBjaGVja2VkPyAqLworCWlmIChkbXMgJiYgZG1zLT5wcmVjaXNlKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBkbV9tZXNzYWdlX3N1cHBvcnRzX3ByZWNpc2VfdGltZXN0YW1wcygpOworfQorCitpbnQgZG1fc3RhdHNfZHJpdmVyX3N1cHBvcnRzX3ByZWNpc2Uodm9pZCkKK3sKKwlyZXR1cm4gX3N0YXRzX2NoZWNrX3ByZWNpc2VfdGltZXN0YW1wcyhOVUxMKTsKK30KKworaW50IGRtX3N0YXRzX2RyaXZlcl9zdXBwb3J0c19oaXN0b2dyYW0odm9pZCkKK3sKKwlyZXR1cm4gX3N0YXRzX2NoZWNrX3ByZWNpc2VfdGltZXN0YW1wcyhOVUxMKTsKK30KKworc3RhdGljIGludCBfZmlsbF9oaXN0X2FyZyhjaGFyICpoaXN0X2FyZywgc2l6ZV90IGhpc3RfbGVuLCB1aW50NjRfdCBzY2FsZSwKKwkJCSAgc3RydWN0IGRtX2hpc3RvZ3JhbSAqYm91bmRzKQoreworCWludCBpLCBsLCBsZW4gPSAwLCBucl9iaW5zOworCWNoYXIgKmFyZyA9IGhpc3RfYXJnOworCXVpbnQ2NF90IHZhbHVlOworCisJbnJfYmlucyA9IGJvdW5kcy0+bnJfYmluczsKKworCWZvciAoaSA9IDA7IGkgPCBucl9iaW5zOyBpKyspIHsKKwkJdmFsdWUgPSBib3VuZHMtPmJpbnNbaV0udXBwZXIgLyBzY2FsZTsKKwkJaWYgKChsID0gZG1fc25wcmludGYoYXJnLCBoaXN0X2xlbiAtIGxlbiwgRk1UdTY0IiVzIiwgdmFsdWUsCisJCQkJICAgICAoaSA9PSAobnJfYmlucyAtIDEpKSA/ICIiIDogIiwiKSkgPCAwKQorCQkJcmV0dXJuXzA7CisJCWxlbiArPSBsOworCQlhcmcgKz0gbDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkICpfZ2V0X2hpc3RfYXJnKHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywgdWludDY0X3Qgc2NhbGUsCisJCQkgICBzaXplX3QgKmxlbikKK3sKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiAqZW50cnksICpiaW5zOworCXNpemVfdCBoaXN0X2xlbiA9IDE7IC8qIHRlcm1pbmF0aW5nICdcMCcgKi8KKwlkb3VibGUgdmFsdWU7CisKKwllbnRyeSA9IGJpbnMgPSBib3VuZHMtPmJpbnM7CisKKwllbnRyeSArPSBib3VuZHMtPm5yX2JpbnMgLSAxOworCXdoaWxlKGVudHJ5ID49IGJpbnMpIHsKKwkJdmFsdWUgPSAoZG91YmxlKSAoZW50cnktLSktPnVwcGVyOworCQkvKiBVc2UgbHJvdW5kIHRvIGF2b2lkIHNpemVfdCAtPiBkb3VibGUgY2FzdCB3YXJuaW5nLiAqLworCQloaXN0X2xlbiArPSAxICsgKHNpemVfdCkgbHJvdW5kKGxvZzEwKHZhbHVlIC8gc2NhbGUpKTsKKwkJaWYgKGVudHJ5ICE9IGJpbnMpCisJCQloaXN0X2xlbisrOyAvKiAnLCcgKi8KKwl9CisKKwkqbGVuID0gaGlzdF9sZW47CisKKwlyZXR1cm4gZG1femFsbG9jKGhpc3RfbGVuKTsKK30KKworc3RhdGljIGNoYXIgKl9idWlsZF9oaXN0b2dyYW1fYXJnKHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywgaW50ICpwcmVjaXNlKQoreworCXN0cnVjdCBkbV9oaXN0b2dyYW1fYmluICplbnRyeSwgKmJpbnM7CisJc2l6ZV90IGhpc3RfbGVuOworCWNoYXIgKmhpc3RfYXJnOworCXVpbnQ2NF90IHNjYWxlOworCisJZW50cnkgPSBiaW5zID0gYm91bmRzLT5iaW5zOworCisJLyogRW1wdHkgaGlzdG9ncmFtIGlzIGludmFsaWQuICovCisJaWYgKCFib3VuZHMtPm5yX2JpbnMpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgZm9ybWF0IGVtcHR5IGhpc3RvZ3JhbSBkZXNjcmlwdGlvbi4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogVmFsaWRhdGUgZW50cmllcyBhbmQgc2V0ICpwcmVjaXNlIGlmIHByZWNpc2lvbiA8IDFtcy4gKi8KKwllbnRyeSArPSBib3VuZHMtPm5yX2JpbnMgLSAxOworCXdoaWxlIChlbnRyeSA+PSBiaW5zKSB7CisJCWlmIChlbnRyeSAhPSBiaW5zKSB7CisJCQlpZiAoZW50cnktPnVwcGVyIDwgKGVudHJ5IC0gMSktPnVwcGVyKSB7CisJCQkJbG9nX2Vycm9yKCJIaXN0b2dyYW0gYm91bmRhcmllcyBtdXN0IGJlIGluICIKKwkJCQkJICAib3JkZXIgb2YgaW5jcmVhc2luZyBtYWduaXR1ZGUuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBPbmx5IGVuYWJsZSBwcmVjaXNlX3RpbWVzdGFtcHMgYXV0b21hdGljYWxseSBpZiBhbnkKKwkJICogdmFsdWUgaW4gdGhlIGhpc3RvZ3JhbSBib3VuZHMgdXNlcyBwcmVjaXNpb24gPCAxbXMuCisJCSAqLworCQlpZiAoKChlbnRyeS0tKS0+dXBwZXIgJSBOU0VDX1BFUl9NU0VDKSAmJiAhKnByZWNpc2UpCisJCQkqcHJlY2lzZSA9IDE7CisJfQorCisJc2NhbGUgPSAoKnByZWNpc2UpID8gMSA6IE5TRUNfUEVSX01TRUM7CisKKwkvKiBDYWxjdWxhdGUgaGlzdF9sZW4gYW5kIGFsbG9jYXRlIGEgY2hhcmFjdGVyIGJ1ZmZlci4gKi8KKwlpZiAoIShoaXN0X2FyZyA9IF9nZXRfaGlzdF9hcmcoYm91bmRzLCBzY2FsZSwgJmhpc3RfbGVuKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBoaXN0b2dyYW0gYXJndW1lbnQuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbGwgaGlzdF9hcmcgd2l0aCBib3VuZGFyeSBzdHJpbmdzLiAqLworCWlmICghX2ZpbGxfaGlzdF9hcmcoaGlzdF9hcmcsIGhpc3RfbGVuLCBzY2FsZSwgYm91bmRzKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gaGlzdF9hcmc7CisKK2JhZDoKKwlsb2dfZXJyb3IoIkNvdWxkIG5vdCBidWlsZCBoaXN0b2dyYW0gYXJndW1lbnRzLiIpOworCWRtX2ZyZWUoaGlzdF9hcmcpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fdGFzayAqX3N0YXRzX3NlbmRfbWVzc2FnZShzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY2hhciAqbXNnKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfVEFSR0VUX01TRykpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3NldF9zdGF0c19kZXZpY2UoZG1zLCBkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmICghZG1fdGFza19zZXRfbWVzc2FnZShkbXQsIG1zZykpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX2JhZDsKKworCXJldHVybiBkbXQ7CisKK2JhZDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENhY2hlIHRoZSBkbSBkZXZpY2VfbmFtZSBmb3IgdGhlIGRldmljZSBib3VuZCB0byBkbXMuCisgKi8KK3N0YXRpYyBpbnQgX3N0YXRzX3NldF9uYW1lX2NhY2hlKHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisKKwlpZiAoZG1zLT5uYW1lKQorCQlyZXR1cm4gMTsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9JTkZPKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfc2V0X3N0YXRzX2RldmljZShkbXMsIGRtdCkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbV90YXNrX3J1bihkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmICghKGRtcy0+bmFtZSA9IGRtX3N0cmR1cChkbV90YXNrX2dldF9uYW1lKGRtdCkpKSkKKwkJZ290b19iYWQ7CisKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiAxOworCitiYWQ6CisJbG9nX2Vycm9yKCJDb3VsZCBub3QgcmV0cmlldmUgZGV2aWNlLW1hcHBlciBuYW1lIGZvciBkZXZpY2UuIik7CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1cGRhdGUgcmVnaW9uIGdyb3VwX2lkIHZhbHVlcworICovCitzdGF0aWMgdm9pZCBfc3RhdHNfdXBkYXRlX2dyb3VwcyhzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXAgKmdyb3VwOworCXVpbnQ2NF90IGdyb3VwX2lkLCBpOworCisJZm9yIChncm91cF9pZCA9IDA7IGdyb3VwX2lkIDwgZG1zLT5tYXhfcmVnaW9uICsgMTsgZ3JvdXBfaWQrKykgeworCQlpZiAoIV9zdGF0c19ncm91cF9pZF9wcmVzZW50KGRtcywgZ3JvdXBfaWQpKQorCQkJY29udGludWU7CisKKwkJZ3JvdXAgPSAmZG1zLT5ncm91cHNbZ3JvdXBfaWRdOworCisJCWZvciAoaSA9IGRtX2JpdF9nZXRfZmlyc3QoZ3JvdXAtPnJlZ2lvbnMpOworCQkgICAgIGkgIT0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CisJCSAgICAgaSA9IGRtX2JpdF9nZXRfbmV4dChncm91cC0+cmVnaW9ucywgaSkpCisJCQlkbXMtPnJlZ2lvbnNbaV0uZ3JvdXBfaWQgPSBncm91cF9pZDsKKwl9Cit9CisKKy8qCisgKiBQYXJzZSBhIERNU19HUk9VUCBncm91cCBkZXNjcmlwdG9yIGVtYmVkZGVkIGluIGEgcmVnaW9uJ3MgYXV4X2RhdGEuCisgKgorICogRE1TX0dST1VQPSJBTElBUzpNRU1CRVJTIgorICoKKyAqIEFMSUFTOiBncm91cCBhbGlhcworICogTUVNQkVSUzogbGlzdCBvZiBncm91cCBtZW1iZXIgcmVnaW9uIGlkcy4KKyAqCisgKi8KKyNkZWZpbmUgRE1TX0dST1VQX1RBRyAiRE1TX0dST1VQPSIKKyNkZWZpbmUgRE1TX0dST1VQX1RBR19MRU4gKHNpemVvZihETVNfR1JPVVBfVEFHKSAtIDEpCisjZGVmaW5lIERNU19HUk9VUF9TRVAgJzonCisjZGVmaW5lIERNU19BVVhfU0VQICIjIgorc3RhdGljIGludCBfcGFyc2VfYXV4X2RhdGFfZ3JvdXAoc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJIHN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbiwKKwkJCQkgc3RydWN0IGRtX3N0YXRzX2dyb3VwICpncm91cCkKK3sKKwljaGFyICphbGlhcywgKmMsICplbmQ7CisJZG1fYml0c2V0X3QgcmVnaW9uczsKKworCW1lbXNldChncm91cCwgMCwgc2l6ZW9mKCpncm91cCkpOworCWdyb3VwLT5ncm91cF9pZCA9IERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UOworCisJLyogZmluZCBzdGFydCBvZiBncm91cCB0YWcgKi8KKwljID0gc3Ryc3RyKHJlZ2lvbi0+YXV4X2RhdGEsIERNU19HUk9VUF9UQUcpOworCWlmICghYykKKwkJcmV0dXJuIDE7IC8qIG5vIGdyb3VwIGlzIG5vdCBhbiBlcnJvciAqLworCisJYWxpYXMgPSBjICsgc3RybGVuKERNU19HUk9VUF9UQUcpOworCisJYyA9IHN0cmNocihjLCBETVNfR1JPVVBfU0VQKTsKKworCWlmICghYykgeworCQlsb2dfZXJyb3IoIkZvdW5kIG1hbGZvcm1lZCBncm91cCB0YWcgd2hpbGUgcmVhZGluZyBhdXhfZGF0YSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0ZXJtaW5hdGUgYWxpYXMgYW5kIGFkdmFuY2UgdG8gbWVtYmVycyAqLworCSooYysrKSA9ICdcMCc7CisKKwlsb2dfZGVidWcoIlJlYWQgYWxpYXMgJyVzJyBmcm9tIGF1eF9kYXRhIiwgYWxpYXMpOworCisJaWYgKCFjKSB7CisJCWxvZ19lcnJvcigiRm91bmQgbWFsZm9ybWVkIGdyb3VwIGRlc2NyaXB0b3Igd2hpbGUgIgorCQkJICAicmVhZGluZyBhdXhfZGF0YSwgZXhwZWN0ZWQgJyVjJyIsIERNU19HUk9VUF9TRVApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBpZiB1c2VyIGF1eF9kYXRhIGZvbGxvd3MgbWFrZSBzdXJlIHdlIGhhdmUgYSB0ZXJtaW5hdGVkCisJICogc3RyaW5nIHRvIHBhc3MgdG8gZG1fYml0c2V0X3BhcnNlX2xpc3QoKS4KKwkgKi8KKwllbmQgPSBzdHJzdHIoYywgRE1TX0FVWF9TRVApOworCWlmICghZW5kKQorCQllbmQgPSBjICsgc3RybGVuKGMpOworCSooZW5kKyspID0gJ1wwJzsKKworCWlmICghKHJlZ2lvbnMgPSBkbV9iaXRzZXRfcGFyc2VfbGlzdChjLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgbWVtYmVyIGxpc3Qgd2hpbGUgIgorCQkJICAicmVhZGluZyBncm91cCBhdXhfZGF0YSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlncm91cC0+Z3JvdXBfaWQgPSBkbV9iaXRfZ2V0X2ZpcnN0KHJlZ2lvbnMpOworCWdyb3VwLT5yZWdpb25zID0gcmVnaW9uczsKKworCWdyb3VwLT5hbGlhcyA9IE5VTEw7CisJaWYgKHN0cmxlbihhbGlhcykpIHsKKwkJZ3JvdXAtPmFsaWFzID0gZG1fc3RyZHVwKGFsaWFzKTsKKwkJaWYgKCFncm91cC0+YWxpYXMpIHsKKwkJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ3JvdXAgYWxpYXMiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJLyogc2VwYXJhdGUgZ3JvdXAgdGFnIGZyb20gdXNlciBhdXhfZGF0YSAqLworCWlmICgoc3RybGVuKGVuZCkgPiAxKSB8fCBzdHJuY21wKGVuZCwgIi0iLCAxKSkKKwkJYyA9IGRtX3N0cmR1cChlbmQpOworCWVsc2UKKwkJYyA9IGRtX3N0cmR1cCgiIik7CisKKwlpZiAoIWMpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB1c2VyIGF1eF9kYXRhIik7CisJCWdvdG8gYmFkX2FsaWFzOworCX0KKworCWRtX2ZyZWUocmVnaW9uLT5hdXhfZGF0YSk7CisJcmVnaW9uLT5hdXhfZGF0YSA9IGM7CisKKwlsb2dfZGVidWcoIkZvdW5kIGdyb3VwX2lkICIgRk1UdTY0ICI6IGFsaWFzPVwiJXNcIiIsIGdyb3VwLT5ncm91cF9pZCwKKwkJICAoZ3JvdXAtPmFsaWFzKSA/IGdyb3VwLT5hbGlhcyA6ICIiKTsKKworCXJldHVybiAxOworCitiYWRfYWxpYXM6CisJZG1fZnJlZSgoY2hhciAqKSBncm91cC0+YWxpYXMpOworYmFkOgorCWRtX2JpdHNldF9kZXN0cm95KHJlZ2lvbnMpOworCXJldHVybiAwOworfQorCisvKgorICogUGFyc2UgYSBoaXN0b2dyYW0gc3BlY2lmaWNhdGlvbiByZXR1cm5lZCBieSB0aGUga2VybmVsIGluIGEKKyAqIEBzdGF0c19saXN0IHJlc3BvbnNlLgorICovCitzdGF0aWMgaW50IF9zdGF0c19wYXJzZV9oaXN0b2dyYW1fc3BlYyhzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgICAgc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqcmVnaW9uLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpoaXN0b2dyYW0pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX3ZhbGlkX2NoYXJzW10gPSAiMDEyMzQ1Njc4OSwiOworCXVpbnQ2NF90IHNjYWxlID0gcmVnaW9uLT50aW1lc2NhbGUsIHRoaXNfdmFsID0gMDsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1zLT5oaXN0X21lbTsKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiBjdXI7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSBoaXN0OworCWludCBucl9iaW5zID0gMTsKKwljb25zdCBjaGFyICpjLCAqdiwgKnZhbF9zdGFydDsKKwljaGFyICpwLCAqZW5kcHRyID0gTlVMTDsKKworCS8qIEFkdmFuY2UgcGFzdCAiaGlzdG9ncmFtOiIuICovCisJaGlzdG9ncmFtID0gc3RyY2hyKGhpc3RvZ3JhbSwgJzonKTsKKwlpZiAoIWhpc3RvZ3JhbSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBoaXN0b2dyYW0gZGVzY3JpcHRpb24uIik7CisJCXJldHVybiAwOworCX0KKwloaXN0b2dyYW0rKzsKKworCS8qIEBzdGF0c19saXN0IHJvd3MgYXJlIG5ld2xpbmUgdGVybWluYXRlZC4gKi8KKwlpZiAoKHAgPSBzdHJjaHIoaGlzdG9ncmFtLCAnXG4nKSkpCisJCSpwID0gJ1wwJzsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCBzaXplb2YoY3VyKSkpCisJCXJldHVybl8wOworCisJbWVtc2V0KCZoaXN0LCAwLCBzaXplb2YoaGlzdCkpOworCisJaGlzdC5ucl9iaW5zID0gMDsgLyogZml4IGxhdGVyICovCisJaGlzdC5yZWdpb24gPSByZWdpb247CisJaGlzdC5kbXMgPSBkbXM7CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAmaGlzdCwgc2l6ZW9mKGhpc3QpKSkKKwkJZ290b19iYWQ7CisKKwljID0gaGlzdG9ncmFtOworCWRvIHsKKwkJZm9yICh2ID0gX3ZhbGlkX2NoYXJzOyAqdjsgdisrKQorCQkJaWYgKCpjID09ICp2KQorCQkJCWJyZWFrOworCQlpZiAoISp2KSB7CisJCQlzdGFjazsKKwkJCWdvdG8gYmFkY2hhcjsKKwkJfQorCisJCWlmICgqYyA9PSAnLCcpIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCBoaXN0b2dyYW0gZGVzY3JpcHRpb246ICVzIiwKKwkJCQkgIGhpc3RvZ3JhbSk7CisJCQlnb3RvIGJhZDsKKwkJfSBlbHNlIHsKKwkJCXZhbF9zdGFydCA9IGM7CisJCQllbmRwdHIgPSBOVUxMOworCisJCQl0aGlzX3ZhbCA9IHN0cnRvdWxsKHZhbF9zdGFydCwgJmVuZHB0ciwgMTApOworCQkJaWYgKCFlbmRwdHIpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBoaXN0b2dyYW0gYm91bmRhcnkuIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCWMgPSBlbmRwdHI7IC8qIEFkdmFuY2UgdG8gdW5pdHMsIGNvbW1hLCBvciBlbmQuICovCisKKwkJCWlmICgqYyA9PSAnLCcpCisJCQkJYysrOworCQkJZWxzZSBpZiAoKmMgfHwgKCpjID09ICcgJykpIHsgLyogRXhwZWN0ZWQgJywnIG9yIE5VTEwuICovCisJCQkJc3RhY2s7CisJCQkJZ290byBiYWRjaGFyOworCQkJfQorCisJCQlpZiAoKmMgPT0gJywnKQorCQkJCWMrKzsKKworCQkJY3VyLnVwcGVyID0gc2NhbGUgKiB0aGlzX3ZhbDsKKwkJCWN1ci5jb3VudCA9IDA7CisKKwkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICZjdXIsIHNpemVvZihjdXIpKSkKKwkJCQlnb3RvX2JhZDsKKworCQkJbnJfYmlucysrOworCQl9CisJfSB3aGlsZSAoKmMgJiYgKCpjICE9ICcgJykpOworCisJLyogZmluYWwgdXBwZXIgYm91bmQuICovCisJY3VyLnVwcGVyID0gVUlOVDY0X01BWDsKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAmY3VyLCBzaXplb2YoY3VyKSkpCisJCWdvdG9fYmFkOworCisJcmVnaW9uLT5ib3VuZHMgPSBkbV9wb29sX2VuZF9vYmplY3QobWVtKTsKKworCWlmICghcmVnaW9uLT5ib3VuZHMpCisJCXJldHVybl8wOworCisJcmVnaW9uLT5ib3VuZHMtPm5yX2JpbnMgPSBucl9iaW5zOworCisJbG9nX2RlYnVnKCJBZGRlZCByZWdpb24gaGlzdG9ncmFtIHNwZWMgd2l0aCAlZCBlbnRyaWVzLiIsIG5yX2JpbnMpOworCXJldHVybiAxOworCitiYWRjaGFyOgorCWxvZ19lcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGlzdG9ncmFtOiAnJWMnICgweCV4KSIsICpjLCAqYyk7CitiYWQ6CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zdGF0c19wYXJzZV9saXN0X3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqcmVnaW9uLCBjaGFyICpsaW5lKQoreworCWNoYXIgKnAgPSBOVUxMLCBzdHJpbmdfZGF0YVtTVEFUU19ST1dfQlVGX0xFTl07CisJY2hhciAqcHJvZ3JhbV9pZCwgKmF1eF9kYXRhLCAqc3RhdHNfYXJnczsKKwljaGFyICplbXB0eV9zdHJpbmcgPSAoY2hhciAqKSAiIjsKKwlpbnQgcjsKKworCW1lbXNldChzdHJpbmdfZGF0YSwgMCwgc2l6ZW9mKHN0cmluZ19kYXRhKSk7CisKKwkvKgorCSAqIFBhcnNlIGZpeGVkIGZpZWxkcywgbGluZSBmb3JtYXQ6CisJICoKKwkgKiA8cmVnaW9uX2lkPjogPHN0YXJ0X3NlY3Rvcj4rPGxlbmd0aD4gPHN0ZXA+IDxzdHJpbmcgZGF0YT4KKwkgKgorCSAqIE1heGltdW0gc3RyaW5nIGRhdGEgc2l6ZSBpcyA0MDk2IC0gMSBieXRlcy4KKwkgKi8KKwlyID0gc3NjYW5mKGxpbmUsIEZNVHU2NCAiOiAiIEZNVHU2NCAiKyIgRk1UdTY0ICIgIiBGTVR1NjQgIiAlNDA5NWMiLAorCQkgICAmcmVnaW9uLT5yZWdpb25faWQsICZyZWdpb24tPnN0YXJ0LCAmcmVnaW9uLT5sZW4sCisJCSAgICZyZWdpb24tPnN0ZXAsIHN0cmluZ19kYXRhKTsKKworCWlmIChyICE9IDUpCisJCXJldHVybl8wOworCisJLyogcHJvZ3JhbV9pZCBpcyBndWFyYW50ZWVkIHRvIGJlIGZpcnN0LiAqLworCXByb2dyYW1faWQgPSBzdHJpbmdfZGF0YTsKKworCS8qCisJICogRklYTUU6IHN1cHBvcnQgZW1iZWRkZWQgJ1wgJyBpbiBzdHJpbmcgZGF0YToKKwkgKiAgIHMvc3RyY2hyL19maW5kX3VuZXNjYXBlZF9zcGFjZSgpLworCSAqLworCWlmICgocCA9IHN0cmNocihzdHJpbmdfZGF0YSwgJyAnKSkpIHsKKwkJLyogdGVybWluYXRlIHByb2dyYW1faWQgc3RyaW5nLiAqLworCQkqcCA9ICdcMCc7CisJCWlmICghc3RybmNtcChwcm9ncmFtX2lkLCAiLSIsIDEpKQorCQkJcHJvZ3JhbV9pZCA9IGVtcHR5X3N0cmluZzsKKwkJYXV4X2RhdGEgPSBwICsgMTsKKwkJaWYgKChwID0gc3RyY2hyKGF1eF9kYXRhLCAnICcpKSkgeworCQkJLyogdGVybWluYXRlIGF1eF9kYXRhIHN0cmluZy4gKi8KKwkJCSpwID0gJ1wwJzsKKwkJCXN0YXRzX2FyZ3MgPSBwICsgMTsKKwkJfSBlbHNlCisJCQlzdGF0c19hcmdzID0gZW1wdHlfc3RyaW5nOworCisJCS8qIG5vIGF1eF9kYXRhPyAqLworCQlpZiAoIXN0cm5jbXAoYXV4X2RhdGEsICItIiwgMSkpCisJCQlhdXhfZGF0YSA9IGVtcHR5X3N0cmluZzsKKwkJZWxzZQorCQkJLyogcmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgKi8KKwkJCWF1eF9kYXRhW3N0cmxlbihhdXhfZGF0YSkgLSAxXSA9ICdcMCc7CisJfSBlbHNlCisJCWF1eF9kYXRhID0gc3RhdHNfYXJncyA9IGVtcHR5X3N0cmluZzsKKworCWlmIChzdHJzdHIoc3RhdHNfYXJncywgUFJFQ0lTRV9BUkcpKQorCQlyZWdpb24tPnRpbWVzY2FsZSA9IDE7CisJZWxzZQorCQlyZWdpb24tPnRpbWVzY2FsZSA9IE5TRUNfUEVSX01TRUM7CisKKwlpZiAoKHAgPSBzdHJzdHIoc3RhdHNfYXJncywgSElTVE9HUkFNX0FSRykpKSB7CisJCWlmICghX3N0YXRzX3BhcnNlX2hpc3RvZ3JhbV9zcGVjKGRtcywgcmVnaW9uLCBwKSkKKwkJCXJldHVybl8wOworCX0gZWxzZQorCQlyZWdpb24tPmJvdW5kcyA9IE5VTEw7CisKKwkvKiBjbGVhciBhZ2dyZWdhdGUgY2FjaGUgKi8KKwlyZWdpb24tPmhpc3RvZ3JhbSA9IE5VTEw7CisKKwlyZWdpb24tPmdyb3VwX2lkID0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CisKKwlpZiAoIShyZWdpb24tPnByb2dyYW1faWQgPSBkbV9zdHJkdXAocHJvZ3JhbV9pZCkpKQorCQlyZXR1cm5fMDsKKwlpZiAoIShyZWdpb24tPmF1eF9kYXRhID0gZG1fc3RyZHVwKGF1eF9kYXRhKSkpIHsKKwkJZG1fZnJlZShyZWdpb24tPnByb2dyYW1faWQpOworCQlyZXR1cm5fMDsKKwl9CisKKwlyZWdpb24tPmNvdW50ZXJzID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc3RhdHNfcGFyc2VfbGlzdChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqcmVzcCkKK3sKKwl1aW50NjRfdCBtYXhfcmVnaW9uID0gMCwgbnJfcmVnaW9ucyA9IDA7CisJc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiBjdXIsIGZpbGw7CisJc3RydWN0IGRtX3N0YXRzX2dyb3VwIGN1cl9ncm91cDsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1zLT5tZW0sICpncm91cF9tZW0gPSBkbXMtPmdyb3VwX21lbTsKKwljaGFyIGxpbmVbU1RBVFNfUk9XX0JVRl9MRU5dOworCUZJTEUgKmxpc3Rfcm93czsKKworCWlmICghcmVzcCkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBOVUxMIEBzdGF0c19saXN0IHJlc3BvbnNlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlfc3RhdHNfcmVnaW9uc19kZXN0cm95KGRtcyk7CisJX3N0YXRzX2dyb3Vwc19kZXN0cm95KGRtcyk7CisKKwkvKiBubyByZWdpb25zICovCisJaWYgKCFzdHJsZW4ocmVzcCkpIHsKKwkJZG1zLT5ucl9yZWdpb25zID0gZG1zLT5tYXhfcmVnaW9uID0gMDsKKwkJZG1zLT5yZWdpb25zID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBkbV90YXNrX2dldF9tZXNzYWdlX3Jlc3BvbnNlKCkgcmV0dXJucyBhICdjb25zdCBjaGFyIConIGJ1dAorCSAqIHNpbmNlIGZtZW1vcGVuIGFsc28gcGVybWl0cyAidyIgaXQgZXhwZWN0cyBhICdjaGFyIConLgorCSAqLworCWlmICghKGxpc3Rfcm93cyA9IGZtZW1vcGVuKChjaGFyICopcmVzcCwgc3RybGVuKHJlc3ApLCAiciIpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBiZWdpbiByZWdpb24gdGFibGUgKi8KKwlpZiAoIWRtX3Bvb2xfYmVnaW5fb2JqZWN0KG1lbSwgMTAyNCkpCisJCWdvdG9fYmFkOworCisJLyogYmVnaW4gZ3JvdXAgdGFibGUgKi8KKwlpZiAoIWRtX3Bvb2xfYmVnaW5fb2JqZWN0KGdyb3VwX21lbSwgMzIpKQorCQlnb3RvX2JhZDsKKworCXdoaWxlKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgbGlzdF9yb3dzKSkgeworCisJCWN1cl9ncm91cC5ncm91cF9pZCA9IERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UOworCQljdXJfZ3JvdXAucmVnaW9ucyA9IE5VTEw7CisJCWN1cl9ncm91cC5hbGlhcyA9IE5VTEw7CisKKwkJaWYgKCFfc3RhdHNfcGFyc2VfbGlzdF9yZWdpb24oZG1zLCAmY3VyLCBsaW5lKSkKKwkJCWdvdG9fYmFkOworCisJCS8qIGhhbmRsZSBob2xlcyBpbiB0aGUgbGlzdCBvZiByZWdpb25faWRzICovCisJCWlmIChjdXIucmVnaW9uX2lkID4gbWF4X3JlZ2lvbikgeworCQkJbWVtc2V0KCZmaWxsLCAwLCBzaXplb2YoZmlsbCkpOworCQkJbWVtc2V0KCZjdXJfZ3JvdXAsIDAsIHNpemVvZihjdXJfZ3JvdXApKTsKKwkJCWZpbGwucmVnaW9uX2lkID0gRE1fU1RBVFNfUkVHSU9OX05PVF9QUkVTRU5UOworCQkJY3VyX2dyb3VwLmdyb3VwX2lkID0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CisJCQlkbyB7CisJCQkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgJmZpbGwsIHNpemVvZihmaWxsKSkpCisJCQkJCWdvdG9fYmFkOworCQkJCWlmICghZG1fcG9vbF9ncm93X29iamVjdChncm91cF9tZW0sICZjdXJfZ3JvdXAsCisJCQkJCQkJIHNpemVvZihjdXJfZ3JvdXApKSkKKwkJCQkJZ290b19iYWQ7CisJCQl9IHdoaWxlIChtYXhfcmVnaW9uKysgPCAoY3VyLnJlZ2lvbl9pZCAtIDEpKTsKKwkJfQorCisJCWlmIChjdXIuYXV4X2RhdGEpCisJCQlpZiAoIV9wYXJzZV9hdXhfZGF0YV9ncm91cChkbXMsICZjdXIsICZjdXJfZ3JvdXApKQorCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGdyb3VwIGRlc2NyaXB0b3IgIgorCQkJCQkgICJmcm9tIHJlZ2lvbl9pZCAiIEZNVHU2NCAiIGF1eF9kYXRhOiIKKwkJCQkJICAiJyVzJyIsIGN1ci5yZWdpb25faWQsIGN1ci5hdXhfZGF0YSk7CisJCQkJLyogY29udGludWUgKi8KKworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAmY3VyLCBzaXplb2YoY3VyKSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QoZ3JvdXBfbWVtLCAmY3VyX2dyb3VwLAorCQkJCQkgc2l6ZW9mKGN1cl9ncm91cCkpKQorCQkJZ290b19iYWQ7CisKKwkJbWF4X3JlZ2lvbisrOworCQlucl9yZWdpb25zKys7CisJfQorCisJaWYgKCFucl9yZWdpb25zKQorCQkvKiBubyByZWdpb24gZGF0YSByZWFkIGZyb20gQHN0YXRzX2xpc3QgKi8KKwkJZ290byBiYWQ7CisKKwlkbXMtPm5yX3JlZ2lvbnMgPSBucl9yZWdpb25zOworCWRtcy0+bWF4X3JlZ2lvbiA9IG1heF9yZWdpb24gLSAxOworCWRtcy0+cmVnaW9ucyA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCWRtcy0+Z3JvdXBzID0gZG1fcG9vbF9lbmRfb2JqZWN0KGdyb3VwX21lbSk7CisKKwlfc3RhdHNfdXBkYXRlX2dyb3VwcyhkbXMpOworCisJaWYgKGZjbG9zZShsaXN0X3Jvd3MpKQorCQlzdGFjazsKKworCXJldHVybiAxOworCitiYWQ6CisJaWYgKGZjbG9zZShsaXN0X3Jvd3MpKQorCQlzdGFjazsKKwlkbV9wb29sX2FiYW5kb25fb2JqZWN0KG1lbSk7CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChncm91cF9tZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9zdGF0c19saXN0KHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICpwcm9ncmFtX2lkKQoreworCWNoYXIgbXNnW1NUQVRTX01TR19CVUZfTEVOXTsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWludCByOworCisJaWYgKCFfc3RhdHNfYm91bmQoZG1zKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBhbGxvdyB6ZXJvLWxlbmd0aCBwcm9ncmFtX2lkIGZvciBsaXN0ICovCisJaWYgKCFwcm9ncmFtX2lkKQorCQlwcm9ncmFtX2lkID0gZG1zLT5wcm9ncmFtX2lkOworCisJaWYgKCFfc3RhdHNfc2V0X25hbWVfY2FjaGUoZG1zKSkKKwkJcmV0dXJuXzA7CisKKwlyID0gZG1fc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkBzdGF0c19saXN0ICVzIiwgcHJvZ3JhbV9pZCk7CisKKwlpZiAociA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcHJlcGFyZSBzdGF0cyBtZXNzYWdlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShkbXQgPSBfc3RhdHNfc2VuZF9tZXNzYWdlKGRtcywgbXNnKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfc3RhdHNfcGFyc2VfbGlzdChkbXMsIGRtX3Rhc2tfZ2V0X21lc3NhZ2VfcmVzcG9uc2UoZG10KSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgQHN0YXRzX2xpc3QgcmVzcG9uc2UuIik7CisJCWdvdG8gYmFkOworCX0KKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiAxOworCitiYWQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBoaXN0b2dyYW0gZGF0YSByZXR1cm5lZCBmcm9tIGEgQHN0YXRzX3ByaW50IG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludCBfc3RhdHNfcGFyc2VfaGlzdG9ncmFtKHN0cnVjdCBkbV9wb29sICptZW0sIGNoYXIgKmhpc3Rfc3RyLAorCQkJCSAgc3RydWN0IGRtX2hpc3RvZ3JhbSAqKmhpc3RvZ3JhbSwKKwkJCQkgIHN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBfdmFsaWRfY2hhcnNbXSA9ICIwMTIzNDU2Nzg5OiI7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSAqYm91bmRzID0gcmVnaW9uLT5ib3VuZHM7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSBoaXN0ID0geworCQkubnJfYmlucyA9IHJlZ2lvbi0+Ym91bmRzLT5ucl9iaW5zCisJfTsKKwljb25zdCBjaGFyICpjLCAqdiwgKnZhbF9zdGFydDsKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiBjdXI7CisJdWludDY0X3Qgc3VtID0gMCwgdGhpc192YWw7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKwlpbnQgYmluID0gMDsKKworCWMgPSBoaXN0X3N0cjsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCBzaXplb2YoY3VyKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgJmhpc3QsIHNpemVvZihoaXN0KSkpCisJCWdvdG9fYmFkOworCisJZG8geworCQltZW1zZXQoJmN1ciwgMCwgc2l6ZW9mKGN1cikpOworCQlmb3IgKHYgPSBfdmFsaWRfY2hhcnM7ICp2OyB2KyspCisJCQlpZiAoKmMgPT0gKnYpCisJCQkJYnJlYWs7CisJCWlmICghKnYpCisJCQlnb3RvIGJhZGNoYXI7CisKKwkJaWYgKCpjID09ICcsJykKKwkJCWdvdG8gYmFkY2hhcjsKKwkJZWxzZSB7CisJCQl2YWxfc3RhcnQgPSBjOworCQkJZW5kcHRyID0gTlVMTDsKKworCQkJdGhpc192YWwgPSBzdHJ0b3VsbCh2YWxfc3RhcnQsICZlbmRwdHIsIDEwKTsKKwkJCWlmICghZW5kcHRyKSB7CisJCQkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgaGlzdG9ncmFtIHZhbHVlLiIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJYyA9IGVuZHB0cjsgLyogQWR2YW5jZSB0byBjb2xvbiwgb3IgZW5kLiAqLworCisJCQlpZiAoKmMgPT0gJzonKQorCQkJCWMrKzsKKwkJCWVsc2UgaWYgKCpjICYgKCpjICE9ICdcbicpKQorCQkJCS8qIEV4cGVjdGVkICc6JywgJ1xuJywgb3IgTlVMTC4gKi8KKwkJCQlnb3RvIGJhZGNoYXI7CisKKwkJCWlmICgqYyA9PSAnOicpCisJCQkJYysrOworCisJCQljdXIudXBwZXIgPSBib3VuZHMtPmJpbnNbYmluXS51cHBlcjsKKwkJCWN1ci5jb3VudCA9IHRoaXNfdmFsOworCQkJc3VtICs9IHRoaXNfdmFsOworCisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAmY3VyLCBzaXplb2YoY3VyKSkpCisJCQkJZ290b19iYWQ7CisKKwkJCWJpbisrOworCQl9CisJfSB3aGlsZSAoKmMgJiYgKCpjICE9ICdcbicpKTsKKworCWxvZ19kZWJ1ZygiQWRkZWQgcmVnaW9uIGhpc3RvZ3JhbSBkYXRhIHdpdGggJWQgZW50cmllcy4iLCBoaXN0Lm5yX2JpbnMpOworCisJKmhpc3RvZ3JhbSA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCSgqaGlzdG9ncmFtKS0+c3VtID0gc3VtOworCisJcmV0dXJuIDE7CisKK2JhZGNoYXI6CisJbG9nX2Vycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoaXN0b2dyYW0gZGF0YTogJyVjJyAoMHgleCkiLCAqYywgKmMpOworYmFkOgorCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc3RhdHNfcGFyc2VfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICpyZXNwLAorCQkJICAgICAgIHN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbiwKKwkJCSAgICAgICB1aW50NjRfdCB0aW1lc2NhbGUpCit7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSAqaGlzdCA9IE5VTEw7CisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGRtcy0+bWVtOworCXN0cnVjdCBkbV9zdGF0c19jb3VudGVycyBjdXI7CisJRklMRSAqc3RhdHNfcm93cyA9IE5VTEw7CisJdWludDY0X3Qgc3RhcnQgPSAwLCBsZW4gPSAwOworCWNoYXIgcm93W1NUQVRTX1JPV19CVUZfTEVOXTsKKwlpbnQgcjsKKworCWlmICghcmVzcCkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBlbXB0eSBAc3RhdHNfcHJpbnQgcmVzcG9uc2UuIik7CisJCXJldHVybiAwOworCX0KKworCXJlZ2lvbi0+c3RhcnQgPSBVSU5UNjRfTUFYOworCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDUxMikpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBkbV90YXNrX2dldF9tZXNzYWdlX3Jlc3BvbnNlKCkgcmV0dXJucyBhICdjb25zdCBjaGFyIConIGJ1dAorCSAqIHNpbmNlIGZtZW1vcGVuIGFsc28gcGVybWl0cyAidyIgaXQgZXhwZWN0cyBhICdjaGFyIConLgorCSAqLworCXN0YXRzX3Jvd3MgPSBmbWVtb3BlbigoY2hhciAqKXJlc3AsIHN0cmxlbihyZXNwKSwgInIiKTsKKwlpZiAoIXN0YXRzX3Jvd3MpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBPdXRwdXQgZm9ybWF0IGZvciBlYWNoIHN0ZXAtc2l6ZWQgYXJlYSBvZiBhIHJlZ2lvbjoKKwkgKgorCSAqIDxzdGFydF9zZWN0b3I+KzxsZW5ndGg+IGNvdW50ZXJzCisJICoKKwkgKiBUaGUgZmlyc3QgMTEgY291bnRlcnMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzCisJICogL3N5cy9ibG9jay8gKiAvc3RhdCBvciAvcHJvYy9kaXNrc3RhdHMuCisJICoKKwkgKiBQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dCBmb3IgZGV0YWlscy4KKwkgKgorCSAqIDEuIHRoZSBudW1iZXIgb2YgcmVhZHMgY29tcGxldGVkCisJICogMi4gdGhlIG51bWJlciBvZiByZWFkcyBtZXJnZWQKKwkgKiAzLiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgcmVhZAorCSAqIDQuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IHJlYWRpbmcKKwkgKiA1LiB0aGUgbnVtYmVyIG9mIHdyaXRlcyBjb21wbGV0ZWQKKwkgKiA2LiB0aGUgbnVtYmVyIG9mIHdyaXRlcyBtZXJnZWQKKwkgKiA3LiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgd3JpdHRlbgorCSAqIDguIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IHdyaXRpbmcKKwkgKiA5LiB0aGUgbnVtYmVyIG9mIEkvT3MgY3VycmVudGx5IGluIHByb2dyZXNzCisJICogMTAuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGRvaW5nIEkvT3MKKwkgKiAxMS4gdGhlIHdlaWdodGVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgZG9pbmcgSS9PcworCSAqCisJICogQWRkaXRpb25hbCBjb3VudGVyczoKKwkgKiAxMi4gdGhlIHRvdGFsIHRpbWUgc3BlbnQgcmVhZGluZyBpbiBtaWxsaXNlY29uZHMKKwkgKiAxMy4gdGhlIHRvdGFsIHRpbWUgc3BlbnQgd3JpdGluZyBpbiBtaWxsaXNlY29uZHMKKwkgKgorCSovCisJd2hpbGUgKGZnZXRzKHJvdywgc2l6ZW9mKHJvdyksIHN0YXRzX3Jvd3MpKSB7CisJCXIgPSBzc2NhbmYocm93LCBGTVR1NjQgIisiIEZNVHU2NCAvKiBzdGFydCtsZW4gKi8KKwkJCSAgIC8qIHJlYWRzICovCisJCQkgICBGTVR1NjQgIiAiIEZNVHU2NCAiICIgRk1UdTY0ICIgIiBGTVR1NjQgIiAiCisJCQkgICAvKiB3cml0ZXMgKi8KKwkJCSAgIEZNVHU2NCAiICIgRk1UdTY0ICIgIiBGTVR1NjQgIiAiIEZNVHU2NCAiICIKKwkJCSAgIC8qIGluIGZsaWdodCAmIGlvIG5zZWNzICovCisJCQkgICBGTVR1NjQgIiAiIEZNVHU2NCAiICIgRk1UdTY0ICIgIgorCQkJICAgLyogdG90IHJlYWQvd3JpdGUgbnNlY3MgKi8KKwkJCSAgIEZNVHU2NCAiICIgRk1UdTY0LCAmc3RhcnQsICZsZW4sCisJCQkgICAmY3VyLnJlYWRzLCAmY3VyLnJlYWRzX21lcmdlZCwgJmN1ci5yZWFkX3NlY3RvcnMsCisJCQkgICAmY3VyLnJlYWRfbnNlY3MsCisJCQkgICAmY3VyLndyaXRlcywgJmN1ci53cml0ZXNfbWVyZ2VkLCAmY3VyLndyaXRlX3NlY3RvcnMsCisJCQkgICAmY3VyLndyaXRlX25zZWNzLAorCQkJICAgJmN1ci5pb19pbl9wcm9ncmVzcywKKwkJCSAgICZjdXIuaW9fbnNlY3MsICZjdXIud2VpZ2h0ZWRfaW9fbnNlY3MsCisJCQkgICAmY3VyLnRvdGFsX3JlYWRfbnNlY3MsICZjdXIudG90YWxfd3JpdGVfbnNlY3MpOworCQlpZiAociAhPSAxNSkgeworCQkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgQHN0YXRzX3ByaW50IHJvdy4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJLyogc2NhbGUgdGltZSB2YWx1ZXMgdXAgaWYgbmVlZGVkICovCisJCWlmICh0aW1lc2NhbGUgIT0gMSkgeworCQkJY3VyLnJlYWRfbnNlY3MgKj0gdGltZXNjYWxlOworCQkJY3VyLndyaXRlX25zZWNzICo9IHRpbWVzY2FsZTsKKwkJCWN1ci5pb19uc2VjcyAqPSB0aW1lc2NhbGU7CisJCQljdXIud2VpZ2h0ZWRfaW9fbnNlY3MgKj0gdGltZXNjYWxlOworCQkJY3VyLnRvdGFsX3JlYWRfbnNlY3MgKj0gdGltZXNjYWxlOworCQkJY3VyLnRvdGFsX3dyaXRlX25zZWNzICo9IHRpbWVzY2FsZTsKKwkJfQorCisJCWlmIChyZWdpb24tPmJvdW5kcykgeworCQkJLyogRmluZCBmaXJzdCBoaXN0b2dyYW0gc2VwYXJhdG9yLiAqLworCQkJY2hhciAqaGlzdF9zdHIgPSBzdHJjaHIocm93LCAnOicpOworCQkJaWYgKCFoaXN0X3N0cikgeworCQkJCWxvZ19lcnJvcigiQ291bGQgbm90IHBhcnNlIGhpc3RvZ3JhbSB2YWx1ZS4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCS8qIEZpbmQgc3BhY2UgcHJlY2VkaW5nIGhpc3RvZ3JhbS4gKi8KKwkJCXdoaWxlIChoaXN0X3N0ciAmJiAqKGhpc3Rfc3RyIC0gMSkgIT0gJyAnKQorCQkJCWhpc3Rfc3RyLS07CisKKwkJCS8qIFVzZSBhIHNlcGFyYXRlIHBvb2wgZm9yIGhpc3RvZ3JhbSBvYmplY3RzIHNpbmNlIHdlCisJCQkgKiBhcmUgZ3Jvd2luZyB0aGUgYXJlYSB0YWJsZSBhbmQgZWFjaCBhcmVhJ3MgaGlzdG9ncmFtCisJCQkgKiB0YWJsZSBzaW11bHRhbmVvdXNseS4KKwkJCSAqLworCQkJaWYgKCFfc3RhdHNfcGFyc2VfaGlzdG9ncmFtKGRtcy0+aGlzdF9tZW0sIGhpc3Rfc3RyLAorCQkJCQkJICAgICZoaXN0LCByZWdpb24pKQorCQkJCWdvdG9fYmFkOworCQkJaGlzdC0+ZG1zID0gZG1zOworCQkJaGlzdC0+cmVnaW9uID0gcmVnaW9uOworCQl9CisKKwkJY3VyLmhpc3RvZ3JhbSA9IGhpc3Q7CisKKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgJmN1ciwgc2l6ZW9mKGN1cikpKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKHJlZ2lvbi0+c3RhcnQgPT0gVUlOVDY0X01BWCkgeworCQkJcmVnaW9uLT5zdGFydCA9IHN0YXJ0OworCQkJcmVnaW9uLT5zdGVwID0gbGVuOyAvKiBhcmVhIHNpemUgaXMgYWx3YXlzIHVuaWZvcm0uICovCisJCX0KKwl9CisKKwlpZiAocmVnaW9uLT5zdGFydCA9PSBVSU5UNjRfTUFYKQorCQkvKiBubyBhcmVhIGRhdGEgcmVhZCBmcm9tIEBzdGF0c19wcmludCAqLworCQlnb3RvIGJhZDsKKworCXJlZ2lvbi0+bGVuID0gKHN0YXJ0ICsgbGVuKSAtIHJlZ2lvbi0+c3RhcnQ7CisJcmVnaW9uLT50aW1lc2NhbGUgPSB0aW1lc2NhbGU7CisJcmVnaW9uLT5jb3VudGVycyA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCisJaWYgKGZjbG9zZShzdGF0c19yb3dzKSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gMTsKKworYmFkOgorCWlmIChzdGF0c19yb3dzKQorCQlpZiAoZmNsb3NlKHN0YXRzX3Jvd3MpKQorCQkJc3RhY2s7CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c193YWxrX25leHRfcHJlc2VudChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgIHVpbnQ2NF90ICpmbGFncywKKwkJCQkgICAgIHVpbnQ2NF90ICpjdXJfciwgdWludDY0X3QgKmN1cl9hLAorCQkJCSAgICAgdWludDY0X3QgKmN1cl9nKQoreworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKmN1ciA9IE5VTEw7CisKKwkvKiBzdGFydCBvZiB3YWxrOiByZWdpb24gbG9vcCBhZHZhbmNlcyAqY3VyX3IgdG8gMC4gKi8KKwlpZiAoKmN1cl9yICE9IERNX1NUQVRTX1JFR0lPTl9OT1RfUFJFU0VOVCkKKwkJY3VyID0gJmRtcy0+cmVnaW9uc1sqY3VyX3JdOworCisJLyogd2l0aGluIGN1cnJlbnQgcmVnaW9uPyAqLworCWlmIChjdXIgJiYgKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfQVJFQSkpIHsKKwkJaWYgKCsrKCpjdXJfYSkgPCBfbnJfYXJlYXNfcmVnaW9uKGN1cikpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCSpjdXJfYSA9IDA7CisJfQorCisJLyogYWR2YW5jZSB0byBuZXh0IHByZXNlbnQsIG5vbi1za2lwcGVkIHJlZ2lvbiBvciBlbmQgKi8KKwl3aGlsZSAoKysoKmN1cl9yKSA8PSBkbXMtPm1heF9yZWdpb24pIHsKKwkJY3VyID0gJmRtcy0+cmVnaW9uc1sqY3VyX3JdOworCQlpZiAoIV9zdGF0c19yZWdpb25fcHJlc2VudChjdXIpKQorCQkJY29udGludWU7CisJCWlmICgoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19TS0lQX1NJTkdMRV9BUkVBKSkKKwkJCWlmICghKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfQVJFQSkpCisJCQkJaWYgKF9ucl9hcmVhc19yZWdpb24oY3VyKSA8IDIpCisJCQkJCWNvbnRpbnVlOworCQkvKiBtYXRjaGluZyByZWdpb24gZm91bmQgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgX3N0YXRzX3dhbGtfbmV4dChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKmZsYWdzLAorCQkJICAgICB1aW50NjRfdCAqY3VyX3IsIHVpbnQ2NF90ICpjdXJfYSwgdWludDY0X3QgKmN1cl9nKQoreworCWlmICghZG1zIHx8ICFkbXMtPnJlZ2lvbnMpCisJCXJldHVybjsKKworCWlmICgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX0FSRUEpIHsKKwkJLyogYWR2YW5jZSB0byBuZXh0IGFyZWEsIHJlZ2lvbiwgb3IgZW5kICovCisJCV9zdGF0c193YWxrX25leHRfcHJlc2VudChkbXMsIGZsYWdzLCBjdXJfciwgY3VyX2EsIGN1cl9nKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX1JFR0lPTikgeworCQkvKiBlbmFibGUgcmVnaW9uIGFnZ3JlZ2F0aW9uICovCisJCSpjdXJfYSA9IERNX1NUQVRTX1dBTEtfUkVHSU9OOworCQlfc3RhdHNfd2Fsa19uZXh0X3ByZXNlbnQoZG1zLCBmbGFncywgY3VyX3IsIGN1cl9hLCBjdXJfZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQkvKiBlbmFibGUgZ3JvdXAgYWdncmVnYXRpb24gKi8KKwkJKmN1cl9yID0gKmN1cl9hID0gRE1fU1RBVFNfV0FMS19HUk9VUDsKKwkJd2hpbGUgKCFfc3RhdHNfZ3JvdXBfaWRfcHJlc2VudChkbXMsICsrKCpjdXJfZykpCisJCSAgICAgICAmJiAoKmN1cl9nKSA8IGRtcy0+bWF4X3JlZ2lvbiArIDEpCisJCQk7IC8qIGFkdmFuY2UgdG8gbmV4dCBwcmVzZW50IGdyb3VwIG9yIGVuZCAqLworCQlyZXR1cm47CisJfQorCisJbG9nX2Vycm9yKCJzdGF0c193YWxrX25leHQgY2FsbGVkIHdpdGggZW1wdHkgd2FsayBmbGFncyIpOworfQorCitzdGF0aWMgdm9pZCBfZ3JvdXBfd2Fsa19zdGFydChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKmZsYWdzLAorCQkJICAgICAgdWludDY0X3QgKmN1cl9yLCB1aW50NjRfdCAqY3VyX2EsIHVpbnQ2NF90ICpjdXJfZykKK3sKKwlpZiAoISgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX0dST1VQKSkKKwkJcmV0dXJuOworCisJKmN1cl9hID0gKmN1cl9yID0gRE1fU1RBVFNfV0FMS19HUk9VUDsKKwkqY3VyX2cgPSAwOworCisJLyogYWR2YW5jZSB0byBuZXh0IHByZXNlbnQgZ3JvdXAgb3IgZW5kICovCisJd2hpbGUgKCgqY3VyX2cpIDw9IGRtcy0+bWF4X3JlZ2lvbikgeworCSAgICAgICAgaWYgKF9zdGF0c19yZWdpb25faXNfZ3JvdXBlZChkbXMsICpjdXJfZykpCisJCQlicmVhazsKKwkJKCpjdXJfZykrKzsKKwl9CisKKwlpZiAoKmN1cl9nID4gZG1zLT5tYXhfcmVnaW9uKQorCQkvKiBubyBncm91cHMgdG8gd2FsayAqLworCQkqZmxhZ3MgJj0gfkRNX1NUQVRTX1dBTEtfR1JPVVA7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c193YWxrX3N0YXJ0KGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqZmxhZ3MsCisJCQkgICAgICB1aW50NjRfdCAqY3VyX3IsIHVpbnQ2NF90ICpjdXJfYSwKKwkJCSAgICAgIHVpbnQ2NF90ICpjdXJfZykKK3sKKwlsb2dfZGVidWcoInN0YXJ0aW5nIHN0YXRzIHdhbGsgd2l0aCAlcyAlcyAlcyAlcyIsCisJCSAgKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfQVJFQSkgPyAiQVJFQSIgOiAiIiwKKwkJICAoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19SRUdJT04pID8gIlJFR0lPTiIgOiAiIiwKKwkJICAoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgPyAiR1JPVVAiIDogIiIsCisJCSAgKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfU0tJUF9TSU5HTEVfQVJFQSkgPyAiU0tJUCIgOiAiIik7CisKKwlpZiAoIWRtcy0+cmVnaW9ucykKKwkJcmV0dXJuOworCisJaWYgKCEoKmZsYWdzICYgKERNX1NUQVRTX1dBTEtfQVJFQSB8IERNX1NUQVRTX1dBTEtfUkVHSU9OKSkpCisJCXJldHVybiBfZ3JvdXBfd2Fsa19zdGFydChkbXMsIGZsYWdzLCBjdXJfciwgY3VyX2EsIGN1cl9nKTsKKworCS8qIGluaXRpYWxpc2UgY3Vyc29yIHN0YXRlICovCisJKmN1cl9hID0gMDsKKwkqY3VyX3IgPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7CisJKmN1cl9nID0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CisKKwlpZiAoISgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX0FSRUEpKQorCQkqY3VyX2EgPSBETV9TVEFUU19XQUxLX1JFR0lPTjsKKworCS8qIGFkdmFuY2UgdG8gZmlyc3QgcHJlc2VudCwgbm9uLXNraXBwZWQgcmVnaW9uICovCisJX3N0YXRzX3dhbGtfbmV4dF9wcmVzZW50KGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSwgY3VyX2cpOworfQorCisjZGVmaW5lIERNX1NUQVRTX1dBTEtfTUFTSyAoRE1fU1RBVFNfV0FMS19BUkVBCQkJXAorCQkJICAgIHwgRE1fU1RBVFNfV0FMS19SRUdJT04JCVwKKwkJCSAgICB8IERNX1NUQVRTX1dBTEtfR1JPVVAJCVwKKwkJCSAgICB8IERNX1NUQVRTX1dBTEtfU0tJUF9TSU5HTEVfQVJFQSkKKworaW50IGRtX3N0YXRzX3dhbGtfaW5pdChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgZmxhZ3MpCit7CisJaWYgKCFkbXMpCisJCXJldHVybl8wOworCisJaWYgKGZsYWdzICYgfkRNX1NUQVRTX1dBTEtfTUFTSykgeworCQlsb2dfZXJyb3IoIlVua25vd24gdmFsdWUgaW4gd2FsayBmbGFnczogMHgiIEZNVHg2NCwKKwkJCSAgKHVpbnQ2NF90KSAoZmxhZ3MgJiB+RE1fU1RBVFNfV0FMS19NQVNLKSk7CisJCXJldHVybiAwOworCX0KKwlkbXMtPndhbGtfZmxhZ3MgPSBmbGFnczsKKwlsb2dfZGVidWcoImRtX3N0YXRzX3dhbGtfaW5pdDogaW5pdGlhbGlzZWQgZmxhZ3MgdG8gIiBGTVR4NjQsIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkbV9zdGF0c193YWxrX3N0YXJ0KHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCWlmICghZG1zIHx8ICFkbXMtPnJlZ2lvbnMpCisJCXJldHVybjsKKworCWRtcy0+Y3VyX2ZsYWdzID0gZG1zLT53YWxrX2ZsYWdzOworCisJX3N0YXRzX3dhbGtfc3RhcnQoZG1zLCAmZG1zLT5jdXJfZmxhZ3MsCisJCQkgICZkbXMtPmN1cl9yZWdpb24sICZkbXMtPmN1cl9hcmVhLAorCQkJICAmZG1zLT5jdXJfZ3JvdXApOworfQorCit2b2lkIGRtX3N0YXRzX3dhbGtfbmV4dChzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlfc3RhdHNfd2Fsa19uZXh0KGRtcywgJmRtcy0+Y3VyX2ZsYWdzLAorCQkJICZkbXMtPmN1cl9yZWdpb24sICZkbXMtPmN1cl9hcmVhLAorCQkJICZkbXMtPmN1cl9ncm91cCk7Cit9CisKK3ZvaWQgZG1fc3RhdHNfd2Fsa19uZXh0X3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlkbXMtPmN1cl9mbGFncyAmPSB+RE1fU1RBVFNfV0FMS19BUkVBOworCV9zdGF0c193YWxrX25leHQoZG1zLCAmZG1zLT5jdXJfZmxhZ3MsCisJCQkgJmRtcy0+Y3VyX3JlZ2lvbiwgJmRtcy0+Y3VyX2FyZWEsCisJCQkgJmRtcy0+Y3VyX2dyb3VwKTsKK30KKworLyoKKyAqIFJldHVybiAxIGlmIGFueSByZWdpb25zIHJlbWFpbiB0aGF0IGFyZSBwcmVzZW50IGFuZCBub3Qgc2tpcHBlZAorICogYnkgdGhlIGN1cnJlbnQgd2FsayBmbGFncyBvciAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHVpbnQ2NF90IF9zdGF0c193YWxrX2FueV91bnNraXBwZWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgdWludDY0X3QgKmZsYWdzLAorCQkJCQkgIHVpbnQ2NF90ICpjdXJfciwgdWludDY0X3QgKmN1cl9hKQoreworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbjsKKwl1aW50NjRfdCBpOworCisJaWYgKCpjdXJfciA+IGRtcy0+bWF4X3JlZ2lvbikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAqY3VyX3I7IGkgPD0gZG1zLT5tYXhfcmVnaW9uOyBpKyspIHsKKwkJcmVnaW9uID0gJmRtcy0+cmVnaW9uc1tpXTsKKwkJaWYgKCFfc3RhdHNfcmVnaW9uX3ByZXNlbnQocmVnaW9uKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfU0tJUF9TSU5HTEVfQVJFQSkKKwkJICAgICYmICEoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19BUkVBKSkKKwkJCWlmIChfbnJfYXJlYXNfcmVnaW9uKHJlZ2lvbikgPCAyKQorCQkJCWNvbnRpbnVlOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c193YWxrX2VuZF9hcmVhcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKmZsYWdzLAorCQkJCSAgdWludDY0X3QgKmN1cl9yLCB1aW50NjRfdCAqY3VyX2EsCisJCQkJICB1aW50NjRfdCAqY3VyX2cpCit7CisJaW50IGVuZCA9ICFfc3RhdHNfd2Fsa19hbnlfdW5za2lwcGVkKGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSk7CisKKwlpZiAoISgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX0FSRUEpKQorCQlyZXR1cm47CisKKwlpZiAoIWVuZCkKKwkJcmV0dXJuOworCisJKmZsYWdzICY9IH5ETV9TVEFUU19XQUxLX0FSRUE7CisJaWYgKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfUkVHSU9OKSB7CisJCS8qIHN0YXJ0IHJlZ2lvbiB3YWxrICovCisJCSpjdXJfYSA9IERNX1NUQVRTX1dBTEtfUkVHSU9OOworCQkqY3VyX3IgPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7CisJCV9zdGF0c193YWxrX25leHRfcHJlc2VudChkbXMsIGZsYWdzLCBjdXJfciwgY3VyX2EsIGN1cl9nKTsKKwkJaWYgKCFfc3RhdHNfd2Fsa19hbnlfdW5za2lwcGVkKGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSkpIHsKKwkJCS8qIG5vIG1vcmUgcmVnaW9ucyAqLworCQkJKmZsYWdzICY9IH5ETV9TVEFUU19XQUxLX1JFR0lPTjsKKwkJCWlmICghKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfR1JPVVApKQorCQkJCSpjdXJfciA9IGRtcy0+bWF4X3JlZ2lvbjsKKwkJfQorCX0KKworCWlmICgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX1JFR0lPTikKKwkJcmV0dXJuOworCisJaWYgKCpmbGFncyAmIERNX1NUQVRTX1dBTEtfR1JPVVApCisJCV9ncm91cF93YWxrX3N0YXJ0KGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSwgY3VyX2cpOworfQorCitzdGF0aWMgaW50IF9zdGF0c193YWxrX2VuZChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKmZsYWdzLAorCQkJICAgdWludDY0X3QgKmN1cl9yLCB1aW50NjRfdCAqY3VyX2EsIHVpbnQ2NF90ICpjdXJfZykKK3sKKwlpZiAoIWRtcyB8fCAhZG1zLT5yZWdpb25zKQorCQlyZXR1cm4gMTsKKworCWlmICgqZmxhZ3MgJiBETV9TVEFUU19XQUxLX0FSRUEpIHsKKwkJX3N0YXRzX3dhbGtfZW5kX2FyZWFzKGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSwgY3VyX2cpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19SRUdJT04pIHsKKwkJaWYgKCFfc3RhdHNfd2Fsa19hbnlfdW5za2lwcGVkKGRtcywgZmxhZ3MsIGN1cl9yLCBjdXJfYSkpIHsKKwkJCSpmbGFncyAmPSB+RE1fU1RBVFNfV0FMS19SRUdJT047CisJCQlfZ3JvdXBfd2Fsa19zdGFydChkbXMsIGZsYWdzLCBjdXJfciwgY3VyX2EsIGN1cl9nKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKmZsYWdzICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQlpZiAoKmN1cl9nIDwgZG1zLT5tYXhfcmVnaW9uKQorCQkJZ290byBvdXQ7CisJCSpmbGFncyAmPSB+RE1fU1RBVFNfV0FMS19HUk9VUDsKKwl9CitvdXQ6CisJcmV0dXJuICEoKmZsYWdzICYgfkRNX1NUQVRTX1dBTEtfU0tJUF9TSU5HTEVfQVJFQSk7Cit9CisKK2ludCBkbV9zdGF0c193YWxrX2VuZChzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlpZiAoX3N0YXRzX3dhbGtfZW5kKGRtcywgJmRtcy0+Y3VyX2ZsYWdzLAorCQkJICAgICZkbXMtPmN1cl9yZWdpb24sICZkbXMtPmN1cl9hcmVhLAorCQkJICAgICZkbXMtPmN1cl9ncm91cCkpIHsKKwkJZG1zLT5jdXJfZmxhZ3MgPSBkbXMtPndhbGtfZmxhZ3M7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworZG1fc3RhdHNfb2JqX3R5cGVfdCBkbV9zdGF0c19vYmplY3RfdHlwZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkJIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCQkJIHVpbnQ2NF90IGFyZWFfaWQpCit7CisJdWludDY0X3QgZ3JvdXBfaWQ7CisKKwlyZWdpb25faWQgPSAocmVnaW9uX2lkID09IERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UKQorCQkgICAgID8gZG1zLT5jdXJfcmVnaW9uIDogcmVnaW9uX2lkIDsKKwlhcmVhX2lkID0gKGFyZWFfaWQgPT0gRE1fU1RBVFNfQVJFQV9DVVJSRU5UKQorCQkgICA/IGRtcy0+Y3VyX2FyZWEgOiBhcmVhX2lkIDsKKworCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfUkVHSU9OX05PVF9QUkVTRU5UKQorCQkvKiBubyByZWdpb24gKi8KKwkJcmV0dXJuIERNX1NUQVRTX09CSkVDVF9UWVBFX05PTkU7CisKKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQlpZiAocmVnaW9uX2lkID09IERNX1NUQVRTX1dBTEtfR1JPVVApCisJCQkvKiBpbmRpcmVjdCBncm91cF9pZCBmcm9tIGN1cnNvciAqLworCQkJZ3JvdXBfaWQgPSBkbXMtPmN1cl9ncm91cDsKKwkJZWxzZQorCQkJLyogaW1tZWRpYXRlIGdyb3VwX2lkIGVuY29kZWQgaW4gcmVnaW9uX2lkICovCisJCQlncm91cF9pZCA9IHJlZ2lvbl9pZCAmIH5ETV9TVEFUU19XQUxLX0dST1VQOworCQlpZiAoIV9zdGF0c19ncm91cF9pZF9wcmVzZW50KGRtcywgZ3JvdXBfaWQpKQorCQkJcmV0dXJuIERNX1NUQVRTX09CSkVDVF9UWVBFX05PTkU7CisJCXJldHVybiBETV9TVEFUU19PQkpFQ1RfVFlQRV9HUk9VUDsKKwl9CisKKwlpZiAocmVnaW9uX2lkID4gZG1zLT5tYXhfcmVnaW9uKQorCQkvKiBlbmQgb2YgdGFibGUgKi8KKwkJcmV0dXJuIERNX1NUQVRTX09CSkVDVF9UWVBFX05PTkU7CisKKwlpZiAoYXJlYV9pZCAmIERNX1NUQVRTX1dBTEtfUkVHSU9OKQorCQkvKiBhZ2dyZWdhdGUgcmVnaW9uICovCisJCXJldHVybiBETV9TVEFUU19PQkpFQ1RfVFlQRV9SRUdJT047CisKKwkvKiBwbGFpbiByZWdpb25faWQgYW5kIGFyZWFfaWQgKi8KKwlyZXR1cm4gRE1fU1RBVFNfT0JKRUNUX1RZUEVfQVJFQTsKK30KKworZG1fc3RhdHNfb2JqX3R5cGVfdCBkbV9zdGF0c19jdXJyZW50X29iamVjdF90eXBlKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCS8qIGRtX3N0YXRzX29iamVjdF90eXBlIHdpbGwgZGVjb2RlIHJlZ2lvbi9hcmVhICovCisJcmV0dXJuIGRtX3N0YXRzX29iamVjdF90eXBlKGRtcywKKwkJCQkgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJICAgIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCk7Cit9CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9yZWdpb25fbnJfYXJlYXMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkKQoreworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbiA9IE5VTEw7CisKKwkvKiBncm91cHMgb3IgYWdncmVnYXRlIHJlZ2lvbnMgY2Fubm90IGJlIHN1YmRpdmlkZWQgKi8KKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJcmV0dXJuIDE7CisKKwlyZWdpb24gPSAmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF07CisJcmV0dXJuIF9ucl9hcmVhc19yZWdpb24ocmVnaW9uKTsKK30KKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfbnJfYXJlYXMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJLyogZ3JvdXBzIG9yIGFnZ3JlZ2F0ZSByZWdpb25zIGNhbm5vdCBiZSBzdWJkaXZpZGVkICovCisJaWYgKGRtcy0+Y3VyX3JlZ2lvbiAmIERNX1NUQVRTX1dBTEtfR1JPVVApCisJCXJldHVybiAxOworCisJcmV0dXJuIGRtX3N0YXRzX2dldF9yZWdpb25fbnJfYXJlYXMoZG1zLCBkbXMtPmN1cl9yZWdpb24pOworfQorCit1aW50NjRfdCBkbV9zdGF0c19nZXRfbnJfYXJlYXMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJdWludDY0X3QgbnJfYXJlYXMgPSAwLCBmbGFncyA9IERNX1NUQVRTX1dBTEtfQVJFQTsKKwkvKiB1c2UgYSBzZXBhcmF0ZSBjdXJzb3IgKi8KKwl1aW50NjRfdCBjdXJfcmVnaW9uID0gMCwgY3VyX2FyZWEgPSAwLCBjdXJfZ3JvdXAgPSAwOworCisJLyogbm8gcmVnaW9ucyB0byB2aXNpdD8gKi8KKwlpZiAoIWRtcy0+cmVnaW9ucykKKwkJcmV0dXJuIDA7CisKKwlmbGFncyA9IERNX1NUQVRTX1dBTEtfQVJFQTsKKwlfc3RhdHNfd2Fsa19zdGFydChkbXMsICZmbGFncywgJmN1cl9yZWdpb24sICZjdXJfYXJlYSwgJmN1cl9ncm91cCk7CisJZG8geworCQlucl9hcmVhcyArPSBkbV9zdGF0c19nZXRfY3VycmVudF9ucl9hcmVhcyhkbXMpOworCQlfc3RhdHNfd2Fsa19uZXh0KGRtcywgJmZsYWdzLAorCQkJCSAmY3VyX3JlZ2lvbiwgJmN1cl9hcmVhLAorCQkJCSAmY3VyX2dyb3VwKTsKKwl9IHdoaWxlICghX3N0YXRzX3dhbGtfZW5kKGRtcywgJmZsYWdzLAorCQkJCSAgJmN1cl9yZWdpb24sICZjdXJfYXJlYSwKKwkJCQkgICZjdXJfZ3JvdXApKTsKKwlyZXR1cm4gbnJfYXJlYXM7Cit9CisKK2ludCBkbV9zdGF0c19ncm91cF9wcmVzZW50KGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCkKK3sKKwlyZXR1cm4gX3N0YXRzX2dyb3VwX2lkX3ByZXNlbnQoZG1zLCBncm91cF9pZCk7Cit9CisKK2ludCBkbV9zdGF0c19nZXRfcmVnaW9uX25yX2hpc3RvZ3JhbV9iaW5zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQkgIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwlyZWdpb25faWQgPSAocmVnaW9uX2lkID09IERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UKQorCQkgICAgID8gZG1zLT5jdXJfcmVnaW9uIDogcmVnaW9uX2lkIDsKKworCS8qIEZJWE1FOiBzdXBwb3J0IGdyb3VwIGhpc3RvZ3JhbXMgaWYgYWxsIHJlZ2lvbiBib3VuZHMgbWF0Y2ggKi8KKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmJvdW5kcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0uYm91bmRzLT5ucl9iaW5zOworfQorCisvKgorICogRmlsbCBidWYgd2l0aCBhIGxpc3Qgb2Ygc2V0IHJlZ2lvbnMgaW4gdGhlIHJlZ2lvbnMgYml0bWFwLiBDb25zZWN1dGl2ZQorICogcmFuZ2VzIG9mIHNldCByZWdpb24gSURzIGFyZSBvdXRwdXQgdXNpbmcgIk0tTiIgcmFuZ2Ugbm90YXRpb24uCisgKgorICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyByZXR1cm5lZCBvciB6ZXJvIG9uIGVycm9yLgorICovCitzdGF0aWMgc2l6ZV90IF9zdGF0c19ncm91cF90YWdfZmlsbChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgZG1fYml0c2V0X3QgcmVnaW9ucywKKwkJCQkgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWludCBpLCBqLCByLCBuZXh0LCBsYXN0ID0gMDsKKwlzaXplX3QgdXNlZCA9IDA7CisKKwlpID0gZG1fYml0X2dldF9maXJzdChyZWdpb25zKTsKKwlmb3IgKDsgaSA+PSAwOyBpID0gZG1fYml0X2dldF9uZXh0KHJlZ2lvbnMsIGkpKQorCQlsYXN0ID0gaTsKKworCWkgPSBkbV9iaXRfZ2V0X2ZpcnN0KHJlZ2lvbnMpOworCWZvcig7IGkgPj0gMDsgaSA9IGRtX2JpdF9nZXRfbmV4dChyZWdpb25zLCBpKSkgeworCQkvKiBmaW5kIHJhbmdlIGVuZCAqLworCQlqID0gaTsKKwkJZG8KKwkJCW5leHQgPSBqICsgMTsKKwkJd2hpbGUgKChqID0gZG1fYml0X2dldF9uZXh0KHJlZ2lvbnMsIGopKSA9PSBuZXh0KTsKKworCQkvKiBzZXQgdG8gbGFzdCBzZXQgYml0ICovCisJCWogPSBuZXh0IC0gMTsKKworCQkvKiBoYW5kbGUgcmFuZ2UgdnMuIHNpbmdsZSByZWdpb24gKi8KKwkJaWYgKGkgIT0gaikKKwkJCXIgPSBkbV9zbnByaW50ZihidWYsIGJ1ZmxlbiwgRk1UdTY0ICItIiBGTVR1NjQgIiVzIiwKKwkJCQkJKHVpbnQ2NF90KSBpLCAodWludDY0X3QpIGosCisJCQkJCShqID09IGxhc3QpID8gIiIgOiAiLCIpOworCQllbHNlCisJCQlyID0gZG1fc25wcmludGYoYnVmLCBidWZsZW4sIEZNVHU2NCAiJXMiLCAodWludDY0X3QpIGksCisJCQkJCShpID09IGxhc3QpID8gIiIgOiAiLCIpOworCQlpZiAociA8IDApCisJCQlnb3RvX2JhZDsKKworCQlpID0gbmV4dDsgLyogc2tpcCBoYW5kbGVkIGJpdHMgaWYgaW4gcmFuZ2UgKi8KKworCQlidWYgKz0gcjsKKwkJdXNlZCArPSByOworCX0KKworCXJldHVybiB1c2VkOworYmFkOgorCWxvZ19lcnJvcigiQ291bGQgbm90IGZvcm1hdCBncm91cCBsaXN0LiIpOworCXJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBzcGFjZSByZXF1aXJlZCB0byBob2xkIGEgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cAorICogZGVzY3JpYmVkIGJ5IHRoZSByZWdpb25zIGJpdHNldCB1c2luZyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiByYW5nZQorICogbm90YXRpb24gKCJBLEIsQyxNLU4iKS4KKyAqLworc3RhdGljIHNpemVfdCBfc3RhdHNfZ3JvdXBfdGFnX2xlbihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICBkbV9iaXRzZXRfdCByZWdpb25zKQoreworCWludCBpLCBqLCBuZXh0LCBucl9yZWdpb25zID0gMDsKKwlzaXplX3QgYnVmbGVuID0gMCwgaWRfbGVuID0gMDsKKworCS8qIGNoZWNrIHJlZ2lvbiBpZHMgYW5kIGZpbmQgbGFzdCBzZXQgYml0ICovCisJaSA9IGRtX2JpdF9nZXRfZmlyc3QocmVnaW9ucyk7CisJZm9yICg7IGkgPj0gMDsgaSA9IGRtX2JpdF9nZXRfbmV4dChyZWdpb25zLCBpKSkgeworCQlpZiAoIWRtX3N0YXRzX3JlZ2lvbl9wcmVzZW50KGRtcywgaSkpIHsKKwkJCWxvZ19lcnJvcigiUmVnaW9uIGlkZW50aWZpZXIgJWQgbm90IGZvdW5kIiwgaSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIGxlbmd0aCBvZiByZWdpb25faWQgb3IgcmFuZ2Ugc3RhcnQgaW4gY2hhcmFjdGVycyAqLworCQlpZF9sZW4gPSAoaSkgPyAxICsgKHNpemVfdCkgbG9nMTAoaSkgOiAxOworCQlidWZsZW4gKz0gaWRfbGVuOworCQlqID0gaTsKKwkJZG8KKwkJCW5leHQgPSBqICsgMTsKKwkJd2hpbGUgKChqID0gZG1fYml0X2dldF9uZXh0KHJlZ2lvbnMsIGopKSA9PSBuZXh0KTsKKworCQkvKiBzZXQgdG8gbGFzdCBzZXQgYml0ICovCisJCWogPSBuZXh0IC0gMTsKKworCQlucl9yZWdpb25zICs9IGogLSBpICsgMTsKKworCQkvKiBoYW5kbGUgcmFuZ2UgKi8KKwkJaWYgKGkgIT0gaikgeworCQkJLyogaiBpcyBhbHdheXMgPiBpLCB3aGljaCBpcyBhbHdheXMgPj0gMCAqLworCQkJaWRfbGVuID0gMSArIChzaXplX3QpIGxvZzEwKGopOworCQkJYnVmbGVuICs9IGlkX2xlbiArIDE7IC8qIHJhbmdlIGVuZCBwbHVzICItIiAqLworCQl9CisJCWJ1ZmxlbisrOworCQlpID0gbmV4dDsgLyogc2tpcCBiaXRzIGlmIGhhbmRsaW5nIHJhbmdlICovCisJfQorCXJldHVybiBidWZsZW47Cit9CisKKy8qCisgKiBCdWlsZCBhIERNU19HUk9VUD0iLi4uIiB0YWcgZm9yIHRoZSBncm91cCBzcGVjaWZpZWQgYnkgZ3JvdXBfaWQsCisgKiB0byBiZSBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaW9uJ3MgYXV4X2RhdGEgZmllbGQuCisgKi8KK3N0YXRpYyBjaGFyICpfYnVpbGRfZ3JvdXBfdGFnKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCkKK3sKKwljaGFyICphdXhfc3RyaW5nLCAqYnVmOworCWRtX2JpdHNldF90IHJlZ2lvbnM7CisJY29uc3QgY2hhciAqYWxpYXM7CisJc2l6ZV90IGJ1ZmxlbiA9IDA7CisJaW50IHI7CisKKwlyZWdpb25zID0gZG1zLT5ncm91cHNbZ3JvdXBfaWRdLnJlZ2lvbnM7CisJYWxpYXMgPSBkbXMtPmdyb3Vwc1tncm91cF9pZF0uYWxpYXM7CisKKwlidWZsZW4gPSBfc3RhdHNfZ3JvdXBfdGFnX2xlbihkbXMsIHJlZ2lvbnMpOworCisJaWYgKCFidWZsZW4pCisJCXJldHVybl8wOworCisJYnVmbGVuICs9IERNU19HUk9VUF9UQUdfTEVOOworCWJ1ZmxlbiArPSAxICsgKGFsaWFzID8gc3RybGVuKGFsaWFzKSA6IDApOyAvKiAnYWxpYXM6JyAqLworCisJYnVmID0gYXV4X3N0cmluZyA9IGRtX21hbGxvYyhidWZsZW4pOworCWlmICghYnVmKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXV4X2RhdGEgc3RyaW5nLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWRtX3N0cm5jcHkoYnVmLCBETVNfR1JPVVBfVEFHLCBETVNfR1JPVVBfVEFHX0xFTiArIDEpKQorCQlnb3RvX2JhZDsKKworCWJ1ZiArPSBETVNfR1JPVVBfVEFHX0xFTjsKKwlidWZsZW4gLT0gRE1TX0dST1VQX1RBR19MRU47CisKKwlyID0gZG1fc25wcmludGYoYnVmLCBidWZsZW4sICIlcyVjIiwgYWxpYXMgPyBhbGlhcyA6ICIiLCBETVNfR1JPVVBfU0VQKTsKKwlpZiAociA8IDApCisJCWdvdG9fYmFkOworCisJYnVmICs9IHI7CisJYnVmbGVuIC09IHI7CisKKwlyID0gX3N0YXRzX2dyb3VwX3RhZ19maWxsKGRtcywgcmVnaW9ucywgYnVmLCBidWZsZW4pOworCWlmICghcikKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gYXV4X3N0cmluZzsKK2JhZDoKKwlsb2dfZXJyb3IoIkNvdWxkIG5vdCBmb3JtYXQgZ3JvdXAgYXV4X2RhdGEuIik7CisJZG1fZnJlZShhdXhfc3RyaW5nKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFN0b3JlIHVwZGF0ZWQgYXV4X2RhdGEgZm9yIGEgcmVnaW9uLiBUaGUgYXV4X2RhdGEgaXMgcGFzc2VkIHRvIHRoZQorICoga2VybmVsIHVzaW5nIHRoZSBAc3RhdHNfc2V0X2F1eCBtZXNzYWdlLiBBbnkgcmVxdWlyZWQgZ3JvdXAgdGFnIGlzCisgKiBnZW5lcmF0ZWQgZnJvbSB0aGUgY3VycmVudCBncm91cCB0YWJsZSBhbmQgaW5jbHVkZWQgaW4gdGhlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQgX3N0YXRzX3NldF9hdXgoc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgY29uc3QgY2hhciAqYXV4X2RhdGEpCit7CisJY29uc3QgY2hhciAqZ3JvdXBfdGFnID0gTlVMTDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10ID0gTlVMTDsKKwljaGFyIG1zZ1tTVEFUU19NU0dfQlVGX0xFTl07CisKKwkvKiBncm91cCBkYXRhIHJlcXVpcmVkPyAqLworCWlmIChfc3RhdHNfZ3JvdXBfaWRfcHJlc2VudChkbXMsIHJlZ2lvbl9pZCkpIHsKKwkJZ3JvdXBfdGFnID0gX2J1aWxkX2dyb3VwX3RhZyhkbXMsIHJlZ2lvbl9pZCk7CisJCWlmICghZ3JvdXBfdGFnKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBidWlsZCBncm91cCBkZXNjcmlwdG9yIGZvciAiCisJCQkJICAicmVnaW9uIElEICIgRk1UdTY0LCByZWdpb25faWQpOworCQkJZ290b19iYWQ7CisJCX0KKwl9CisKKwlpZiAoIWRtX3NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICJAc3RhdHNfc2V0X2F1eCAiIEZNVHU2NCAiICVzJXMlcyAiLAorCQkJIHJlZ2lvbl9pZCwgKGdyb3VwX3RhZykgPyBncm91cF90YWcgOiAiIiwKKwkJCSAoZ3JvdXBfdGFnKSA/IERNU19BVVhfU0VQIDogIiIsCisJCQkgKHN0cmxlbihhdXhfZGF0YSkpID8gYXV4X2RhdGEgOiAiLSIpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHByZXBhcmUgQHN0YXRzX3NldF9hdXggbWVzc2FnZSIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIShkbXQgPSBfc3RhdHNfc2VuZF9tZXNzYWdlKGRtcywgbXNnKSkpCisJCWdvdG9fYmFkOworCisJZG1fZnJlZSgoY2hhciAqKSBncm91cF90YWcpOworCisJLyogbm8gcmVzcG9uc2UgdG8gYSBAc3RhdHNfc2V0X2F1eCBtZXNzYWdlICovCisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gMTsKK2JhZDoKKwlkbV9mcmVlKChjaGFyICopIGdyb3VwX3RhZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYXhpbXVtIGxlbmd0aCBvZiBhICJzdGFydCtlbmQiIHJhbmdlIHN0cmluZzoKKyAqIFR3byAyMCBkaWdpdCB1aW50NjRfdCwgJysnLCBhbmQgTlVMTC4KKyAqLworI2RlZmluZSBSQU5HRV9MRU4gNDIKK3N0YXRpYyBpbnQgX3N0YXRzX2NyZWF0ZV9yZWdpb24oc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90ICpyZWdpb25faWQsCisJCQkJdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbiwgaW50NjRfdCBzdGVwLAorCQkJCWludCBwcmVjaXNlLCBjb25zdCBjaGFyICpoaXN0X2FyZywKKwkJCQljb25zdCBjaGFyICpwcm9ncmFtX2lkLAljb25zdCBjaGFyICphdXhfZGF0YSkKK3sKKwljaGFyIG1zZ1tTVEFUU19NU0dfQlVGX0xFTl0sIHJhbmdlW1JBTkdFX0xFTl0sICplbmRwdHIgPSBOVUxMOworCWNvbnN0IGNoYXIgKmVycl9mbXQgPSAiQ291bGQgbm90IHByZXBhcmUgQHN0YXRzX2NyZWF0ZSAlcy4iOworCWNvbnN0IGNoYXIgKnByZWNpc2Vfc3RyID0gUFJFQ0lTRV9BUkc7CisJY29uc3QgY2hhciAqcmVzcCwgKm9wdF9hcmdzID0gTlVMTDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10ID0gTlVMTDsKKwlpbnQgciA9IDAsIG5yX29wdCA9IDA7CisKKwlpZiAoIV9zdGF0c19ib3VuZChkbXMpKQorCQlyZXR1cm5fMDsKKworCWlmICghcHJvZ3JhbV9pZCB8fCAhc3RybGVuKHByb2dyYW1faWQpKQorCQlwcm9ncmFtX2lkID0gZG1zLT5wcm9ncmFtX2lkOworCisJaWYgKHN0YXJ0IHx8IGxlbikgeworCQlpZiAoIWRtX3NucHJpbnRmKHJhbmdlLCBzaXplb2YocmFuZ2UpLCBGTVR1NjQgIisiIEZNVHU2NCwKKwkJCQkgc3RhcnQsIGxlbikpIHsKKwkJCWxvZ19lcnJvcihlcnJfZm10LCAicmFuZ2UiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHByZWNpc2UgPCAwKQorCQlwcmVjaXNlID0gZG1zLT5wcmVjaXNlOworCisJaWYgKHByZWNpc2UpCisJCW5yX29wdCsrOworCWVsc2UKKwkJcHJlY2lzZV9zdHIgPSAiIjsKKworCWlmIChoaXN0X2FyZykKKwkJbnJfb3B0Kys7CisJZWxzZQorCQloaXN0X2FyZyA9ICIiOworCisJaWYgKG5yX29wdCkgeworCQlpZiAoKGRtX2FzcHJpbnRmKChjaGFyICoqKSZvcHRfYXJncywgIiVkICVzICVzJXMiLCBucl9vcHQsCisJCQkJIHByZWNpc2Vfc3RyLAorCQkJCSAoc3RybGVuKGhpc3RfYXJnKSkgPyBISVNUT0dSQU1fQVJHIDogIiIsCisJCQkJIGhpc3RfYXJnKSkgPCAwKSB7CisJCQlsb2dfZXJyb3IoZXJyX2ZtdCwgUFJFQ0lTRV9BUkcgIiBvcHRpb24uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlvcHRfYXJncyA9IGRtX3N0cmR1cCgiIik7CisKKwlpZiAoIWRtX3NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICJAc3RhdHNfY3JlYXRlICVzICVzIiBGTVR1NjQKKwkJCSAiICVzICVzICVzIiwgKHN0YXJ0IHx8IGxlbikgPyByYW5nZSA6ICItIiwKKwkJCSAoc3RlcCA8IDApID8gIi8iIDogIiIsCisJCQkgKHVpbnQ2NF90KWxsYWJzKHN0ZXApLAorCQkJIG9wdF9hcmdzLCBwcm9ncmFtX2lkLCBhdXhfZGF0YSkpIHsKKwkJbG9nX2Vycm9yKGVycl9mbXQsICJtZXNzYWdlIik7CisJCWRtX2ZyZWUoKHZvaWQgKikgb3B0X2FyZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShkbXQgPSBfc3RhdHNfc2VuZF9tZXNzYWdlKGRtcywgbXNnKSkpCisJCWdvdG9fb3V0OworCisJcmVzcCA9IGRtX3Rhc2tfZ2V0X21lc3NhZ2VfcmVzcG9uc2UoZG10KTsKKwlpZiAoIXJlc3ApIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgZW1wdHkgQHN0YXRzX2NyZWF0ZSByZXNwb25zZS4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlZ2lvbl9pZCkgeworCQkqcmVnaW9uX2lkID0gc3RydG91bGwocmVzcCwgJmVuZHB0ciwgMTApOworCQlpZiAocmVzcCA9PSBlbmRwdHIpCisJCQlnb3RvX291dDsKKwl9CisKKwlyID0gMTsKKworb3V0OgorCWlmIChkbXQpCisJCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCWRtX2ZyZWUoKHZvaWQgKikgb3B0X2FyZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqcmVnaW9uX2lkLAorCQkJICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbiwgaW50NjRfdCBzdGVwLAorCQkJICAgaW50IHByZWNpc2UsIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCSAgIGNvbnN0IGNoYXIgKnByb2dyYW1faWQsIGNvbnN0IGNoYXIgKnVzZXJfZGF0YSkKK3sKKwljaGFyICpoaXN0X2FyZyA9IE5VTEw7CisJaW50IHIgPSAwOworCisJLyogTmFub3NlY29uZCBjb3VudGVycyBhbmQgaGlzdG9ncmFtcyBib3RoIG5lZWQgcHJlY2lzZV90aW1lc3RhbXBzLiAqLworCWlmICgocHJlY2lzZSB8fCBib3VuZHMpICYmICFfc3RhdHNfY2hlY2tfcHJlY2lzZV90aW1lc3RhbXBzKGRtcykpCisJCXJldHVybl8wOworCisJaWYgKGJvdW5kcykgeworCQkvKiBfYnVpbGRfaGlzdG9ncmFtX2FyZyBlbmFibGVzIHByZWNpc2UgaWYgdmFscyA8IDFtcy4gKi8KKwkJaWYgKCEoaGlzdF9hcmcgPSBfYnVpbGRfaGlzdG9ncmFtX2FyZyhib3VuZHMsICZwcmVjaXNlKSkpCisJCQlnb3RvX291dDsKKwl9CisKKwlyID0gX3N0YXRzX2NyZWF0ZV9yZWdpb24oZG1zLCByZWdpb25faWQsIHN0YXJ0LCBsZW4sIHN0ZXAsCisJCQkJIHByZWNpc2UsIGhpc3RfYXJnLCBwcm9ncmFtX2lkLCB1c2VyX2RhdGEpOworCWRtX2ZyZWUoaGlzdF9hcmcpOworCitvdXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19jbGVhcl9ncm91cF9yZWdpb25zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCkKK3sKKwlzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXAgKmdyb3VwOworCXVpbnQ2NF90IGk7CisKKwlncm91cCA9ICZkbXMtPmdyb3Vwc1tncm91cF9pZF07CisJZm9yIChpID0gZG1fYml0X2dldF9maXJzdChncm91cC0+cmVnaW9ucyk7CisJICAgICBpICE9IERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UOworCSAgICAgaSA9IGRtX2JpdF9nZXRfbmV4dChncm91cC0+cmVnaW9ucywgaSkpCisJCWRtcy0+cmVnaW9uc1tpXS5ncm91cF9pZCA9IERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UOworfQorCitzdGF0aWMgaW50IF9zdGF0c19yZW1vdmVfcmVnaW9uX2lkX2Zyb21fZ3JvdXAoc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwlzdHJ1Y3QgZG1fc3RhdHNfcmVnaW9uICpyZWdpb24gPSAmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF07CisJdWludDY0X3QgZ3JvdXBfaWQgPSByZWdpb24tPmdyb3VwX2lkOworCWRtX2JpdHNldF90IHJlZ2lvbnMgPSBkbXMtPmdyb3Vwc1tncm91cF9pZF0ucmVnaW9uczsKKworCWlmICghX3N0YXRzX3JlZ2lvbl9pc19ncm91cGVkKGRtcywgcmVnaW9uX2lkKSkKKwkJcmV0dXJuXzA7CisKKwlkbV9iaXRfY2xlYXIocmVnaW9ucywgcmVnaW9uX2lkKTsKKworCS8qIHJlbW92aW5nIGdyb3VwIGxlYWRlcj8gKi8KKwlpZiAocmVnaW9uX2lkID09IGdyb3VwX2lkKSB7CisJCV9zdGF0c19jbGVhcl9ncm91cF9yZWdpb25zKGRtcywgZ3JvdXBfaWQpOworCQlfc3RhdHNfZ3JvdXBfZGVzdHJveSgmZG1zLT5ncm91cHNbZ3JvdXBfaWRdKTsKKwl9CisKKwlyZXR1cm4gX3N0YXRzX3NldF9hdXgoZG1zLCBncm91cF9pZCwgZG1zLT5yZWdpb25zW2dyb3VwX2lkXS5hdXhfZGF0YSk7Cit9CisKK2ludCBkbV9zdGF0c19kZWxldGVfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCByZWdpb25faWQpCit7CisJY2hhciBtc2dbU1RBVFNfTVNHX0JVRl9MRU5dOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisKKwlpZiAoIV9zdGF0c19ib3VuZChkbXMpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1zLT5yZWdpb25zICYmICFkbV9zdGF0c19saXN0KGRtcywgZG1zLT5wcm9ncmFtX2lkKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBvYnRhaW4gcmVnaW9uIGxpc3Qgd2hpbGUgZGVsZXRpbmcgIgorCQkJICAicmVnaW9uIElEICIgRk1UdTY0LCByZWdpb25faWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX3N0YXRzX2dldF9ucl9hcmVhcyhkbXMpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGRlbGV0ZSByZWdpb24gSUQgIiBGTVR1NjQgIjogIgorCQkJICAibm8gcmVnaW9ucyBmb3VuZCIsIHJlZ2lvbl9pZCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGluY2x1ZGVzIGludmFsaWQgYW5kIHNwZWNpYWwgcmVnaW9uX2lkIHZhbHVlcyAqLworCWlmICghZG1fc3RhdHNfcmVnaW9uX3ByZXNlbnQoZG1zLCByZWdpb25faWQpKSB7CisJCWxvZ19lcnJvcigiUmVnaW9uIElEICIgRk1UdTY0ICIgZG9lcyBub3QgZXhpc3QiLCByZWdpb25faWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZihfc3RhdHNfcmVnaW9uX2lzX2dyb3VwZWQoZG1zLCByZWdpb25faWQpKQorCQlpZiAoIV9zdGF0c19yZW1vdmVfcmVnaW9uX2lkX2Zyb21fZ3JvdXAoZG1zLCByZWdpb25faWQpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCByZW1vdmUgcmVnaW9uIElEICIgRk1UdTY0ICIgZnJvbSAiCisJCQkJICAiZ3JvdXAgSUQgIiBGTVR1NjQsCisJCQkJICByZWdpb25faWQsIGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmdyb3VwX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoIWRtX3NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICJAc3RhdHNfZGVsZXRlICIgRk1UdTY0LCByZWdpb25faWQpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHByZXBhcmUgQHN0YXRzX2RlbGV0ZSBtZXNzYWdlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbXQgPSBfc3RhdHNfc2VuZF9tZXNzYWdlKGRtcywgbXNnKTsKKwlpZiAoIWRtdCkKKwkJcmV0dXJuXzA7CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwkvKiB3aXBlIHJlZ2lvbiBhbmQgbWFyayBhcyBub3QgcHJlc2VudCAqLworCV9zdGF0c19yZWdpb25fZGVzdHJveSgmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0pOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9zdGF0c19jbGVhcl9yZWdpb24oc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwljaGFyIG1zZ1tTVEFUU19NU0dfQlVGX0xFTl07CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKworCWlmICghX3N0YXRzX2JvdW5kKGRtcykpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9zbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiQHN0YXRzX2NsZWFyICIgRk1UdTY0LCByZWdpb25faWQpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHByZXBhcmUgQHN0YXRzX2NsZWFyIG1lc3NhZ2UuIik7CisJCXJldHVybiAwOworCX0KKworCWRtdCA9IF9zdGF0c19zZW5kX21lc3NhZ2UoZG1zLCBtc2cpOworCisJaWYgKCFkbXQpCisJCXJldHVybl8wOworCisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkbV90YXNrICpfc3RhdHNfcHJpbnRfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICB1aW50NjRfdCByZWdpb25faWQsIHVuc2lnbmVkIHN0YXJ0X2xpbmUsCisJCQkJICAgIHVuc2lnbmVkIG51bV9saW5lcywgdW5zaWduZWQgY2xlYXIpCit7CisJLyogQHN0YXRzX3ByaW50W19jbGVhcl0gPHJlZ2lvbl9pZD4gWzxzdGFydF9saW5lPiA8bnVtX2xpbmVzPl0gKi8KKwljb25zdCBjaGFyICplcnJfZm10ID0gIkNvdWxkIG5vdCBwcmVwYXJlIEBzdGF0c19wcmludCAlcy4iOworCWNoYXIgbXNnW1NUQVRTX01TR19CVUZfTEVOXSwgbGluZXNbUkFOR0VfTEVOXTsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10ID0gTlVMTDsKKworCWlmIChzdGFydF9saW5lIHx8IG51bV9saW5lcykKKwkJaWYgKCFkbV9zbnByaW50ZihsaW5lcywgc2l6ZW9mKGxpbmVzKSwKKwkJCQkgIiV1ICV1Iiwgc3RhcnRfbGluZSwgbnVtX2xpbmVzKSkgeworCQkJbG9nX2Vycm9yKGVycl9mbXQsICJyb3cgc3BlY2lmaWNhdGlvbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCWlmICghZG1fc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkBzdGF0c19wcmludCVzICIgRk1UdTY0ICIgJXMiLAorCQkJIChjbGVhcikgPyAiX2NsZWFyIiA6ICIiLAorCQkJIHJlZ2lvbl9pZCwgKHN0YXJ0X2xpbmUgfHwgbnVtX2xpbmVzKSA/IGxpbmVzIDogIiIpKSB7CisJCWxvZ19lcnJvcihlcnJfZm10LCAibWVzc2FnZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShkbXQgPSBfc3RhdHNfc2VuZF9tZXNzYWdlKGRtcywgbXNnKSkpCisJCXJldHVybl9OVUxMOworCisJcmV0dXJuIGRtdDsKK30KKworY2hhciAqZG1fc3RhdHNfcHJpbnRfcmVnaW9uKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCByZWdpb25faWQsCisJCQkgICAgdW5zaWduZWQgc3RhcnRfbGluZSwgdW5zaWduZWQgbnVtX2xpbmVzLAorCQkJICAgIHVuc2lnbmVkIGNsZWFyKQoreworCWNoYXIgKnJlc3AgPSBOVUxMOworCXN0cnVjdCBkbV90YXNrICpkbXQgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlc3BvbnNlOworCisJaWYgKCFfc3RhdHNfYm91bmQoZG1zKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIEZJWE1FOiAncHJpbnQnIGNhbiBiZSBlbXVsYXRlZCBmb3IgZ3JvdXBzIG9yIGFnZ3JlZ2F0ZSByZWdpb25zCisJICogYnkgcG9wdWxhdGluZyB0aGUgaGFuZGxlIGFuZCBlbWl0dGluZyBhZ2dyZWdhdGUgY291bnRlciBkYXRhCisJICogaW4gdGhlIGtlcm5lbCBwcmludCBmb3JtYXQuCisJICovCisJaWYgKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19XQUxLX0dST1VQKQorCQlyZXR1cm5fMDsKKworCWRtdCA9IF9zdGF0c19wcmludF9yZWdpb24oZG1zLCByZWdpb25faWQsCisJCQkJICBzdGFydF9saW5lLCBudW1fbGluZXMsIGNsZWFyKTsKKworCWlmICghZG10KQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlc3BvbnNlID0gZG1fdGFza19nZXRfbWVzc2FnZV9yZXNwb25zZShkbXQpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShyZXNwID0gZG1fcG9vbF9zdHJkdXAoZG1zLT5tZW0sIHJlc3BvbnNlKSkpCisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgYnVmZmVyLiIpOworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHJlc3A7Cit9CisKK3ZvaWQgZG1fc3RhdHNfYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGRtX3N0YXRzICpkbXMsIGNoYXIgKmJ1ZmZlcikKK3sKKwlkbV9wb29sX2ZyZWUoZG1zLT5tZW0sIGJ1ZmZlcik7Cit9CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9ucl9yZWdpb25zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCWlmICghZG1zKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1zLT5yZWdpb25zKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkbXMtPm5yX3JlZ2lvbnM7Cit9CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9ucl9ncm91cHMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJdWludDY0X3QgZ3JvdXBfaWQsIG5yX2dyb3VwcyA9IDA7CisKKwlpZiAoIWRtcykKKwkJcmV0dXJuXzA7CisKKwkvKiBubyByZWdpb25zIG9yIGdyb3Vwcz8gKi8KKwlpZiAoIWRtcy0+cmVnaW9ucyB8fCAhZG1zLT5ncm91cHMpCisJCXJldHVybiAwOworCisJZm9yIChncm91cF9pZCA9IDA7IGdyb3VwX2lkIDw9IGRtcy0+bWF4X3JlZ2lvbjsgZ3JvdXBfaWQrKykKKwkJaWYgKGRtcy0+Z3JvdXBzW2dyb3VwX2lkXS5ncm91cF9pZAorCQkgICAgIT0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQpCisJCQlucl9ncm91cHMrKzsKKworCXJldHVybiBucl9ncm91cHM7Cit9CisKKy8qKgorICogVGVzdCB3aGV0aGVyIHJlZ2lvbl9pZCBpcyBwcmVzZW50IGluIHRoaXMgc2V0IG9mIHN0YXRzIGRhdGEuCisgKi8KK2ludCBkbV9zdGF0c19yZWdpb25fcHJlc2VudChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKQoreworCWlmICghZG1zLT5yZWdpb25zKQorCQlyZXR1cm5fMDsKKworCWlmIChyZWdpb25faWQgPiBkbXMtPm1heF9yZWdpb24pCisJCXJldHVybiAwOworCisJcmV0dXJuIF9zdGF0c19yZWdpb25fcHJlc2VudCgmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0pOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19wb3B1bGF0ZV9yZWdpb24oc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnJlc3ApCit7CisJc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqcmVnaW9uID0gJmRtcy0+cmVnaW9uc1tyZWdpb25faWRdOworCisJaWYgKCFfc3RhdHNfYm91bmQoZG1zKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXJlZ2lvbiB8fCAhX3N0YXRzX3BhcnNlX3JlZ2lvbihkbXMsIHJlc3AsIHJlZ2lvbiwgcmVnaW9uLT50aW1lc2NhbGUpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHBhcnNlIEBzdGF0c19wcmludCBtZXNzYWdlIHJlc3BvbnNlLiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmVnaW9uLT5yZWdpb25faWQgPSByZWdpb25faWQ7CisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9zdGF0c19wb3B1bGF0ZShzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqcHJvZ3JhbV9pZCwKKwkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkKQoreworCWludCBhbGxfcmVnaW9ucyA9IChyZWdpb25faWQgPT0gRE1fU1RBVFNfUkVHSU9OU19BTEwpOworCXN0cnVjdCBkbV90YXNrICpkbXQgPSBOVUxMOyAvKiBAc3RhdHNfcHJpbnQgdGFzayAqLworCXVpbnQ2NF90IHNhdmVkX2ZsYWdzOyAvKiBzYXZlZCB3YWxrIGZsYWdzICovCisJY29uc3QgY2hhciAqcmVzcDsKKworCS8qCisJICogV2UgYXJlIGFib3V0IGRvIGRlc3Ryb3kgYW5kIHJlLWNyZWF0ZSB0aGUgcmVnaW9uIHRhYmxlLCBzbyBpdAorCSAqIGlzIHNhZmUgdG8gdXNlIHRoZSBjdXJzb3IgZW1iZWRkZWQgaW4gdGhlIHN0YXRzIGhhbmRsZToganVzdAorCSAqIHNhdmUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHdhbGtfZmxhZ3MgdG8gcmVzdG9yZSBsYXRlci4KKwkgKi8KKwlzYXZlZF9mbGFncyA9IGRtcy0+d2Fsa19mbGFnczsKKworCWlmICghX3N0YXRzX2JvdW5kKGRtcykpCisJCXJldHVybl8wOworCisJaWYgKCghYWxsX3JlZ2lvbnMpICYmIChyZWdpb25faWQgJiBETV9TVEFUU19XQUxLX0dST1VQKSkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgcmVnaW9uX2lkIGZvciBkbV9zdGF0c19wb3B1bGF0ZTogIgorCQkJICAiRE1fU1RBVFNfV0FMS19HUk9VUCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhbGxvdyB6ZXJvLWxlbmd0aCBwcm9ncmFtX2lkIGZvciBwb3B1bGF0ZSAqLworCWlmICghcHJvZ3JhbV9pZCkKKwkJcHJvZ3JhbV9pZCA9IGRtcy0+cHJvZ3JhbV9pZDsKKworCWlmIChhbGxfcmVnaW9ucyAmJiAhZG1fc3RhdHNfbGlzdChkbXMsIHByb2dyYW1faWQpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHBhcnNlIEBzdGF0c19saXN0IHJlc3BvbnNlLiIpOworCQlnb3RvIGJhZDsKKwl9IGVsc2UgaWYgKCFfc3RhdHNfc2V0X25hbWVfY2FjaGUoZG1zKSkgeworCQlnb3RvX2JhZDsKKwl9CisKKwkvKiBzdWNjZXNzZnVsIGxpc3QgYnV0IG5vIHJlZ2lvbnMgcmVnaXN0ZXJlZCAqLworCWlmICghZG1zLT5ucl9yZWdpb25zKQorCQlyZXR1cm4gMDsKKworCWRtcy0+d2Fsa19mbGFncyA9IERNX1NUQVRTX1dBTEtfUkVHSU9OOworCWRtX3N0YXRzX3dhbGtfc3RhcnQoZG1zKTsKKwlkbyB7CisJCXJlZ2lvbl9pZCA9IChhbGxfcmVnaW9ucykKKwkJCSAgICAgPyBkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb24oZG1zKSA6IHJlZ2lvbl9pZDsKKworCQkvKiBvYnRhaW4gYWxsIGxpbmVzIGFuZCBjbGVhciBjb3VudGVyIHZhbHVlcyAqLworCQlpZiAoIShkbXQgPSBfc3RhdHNfcHJpbnRfcmVnaW9uKGRtcywgcmVnaW9uX2lkLCAwLCAwLCAxKSkpCisJCQlnb3RvX2JhZDsKKworCQlyZXNwID0gZG1fdGFza19nZXRfbWVzc2FnZV9yZXNwb25zZShkbXQpOworCQlpZiAoIV9kbV9zdGF0c19wb3B1bGF0ZV9yZWdpb24oZG1zLCByZWdpb25faWQsIHJlc3ApKSB7CisJCQlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwkJCWdvdG9fYmFkOworCQl9CisKKwkJZG1fdGFza19kZXN0cm95KGRtdCk7CisJCWRtX3N0YXRzX3dhbGtfbmV4dChkbXMpOworCisJfSB3aGlsZSAoYWxsX3JlZ2lvbnMgJiYgIWRtX3N0YXRzX3dhbGtfZW5kKGRtcykpOworCisJZG1zLT53YWxrX2ZsYWdzID0gc2F2ZWRfZmxhZ3M7CisJcmV0dXJuIDE7CisKK2JhZDoKKwlkbXMtPndhbGtfZmxhZ3MgPSBzYXZlZF9mbGFnczsKKwlfc3RhdHNfcmVnaW9uc19kZXN0cm95KGRtcyk7CisJZG1zLT5yZWdpb25zID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkZXN0cm95IGEgZG1fc3RhdHMgb2JqZWN0IGFuZCBhbGwgYXNzb2NpYXRlZCByZWdpb25zIGFuZCBjb3VudGVyIHNldHMuCisgKi8KK3ZvaWQgZG1fc3RhdHNfZGVzdHJveShzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlfc3RhdHNfcmVnaW9uc19kZXN0cm95KGRtcyk7CisJX3N0YXRzX2dyb3Vwc19kZXN0cm95KGRtcyk7CisJX3N0YXRzX2NsZWFyX2JpbmRpbmcoZG1zKTsKKwlkbV9wb29sX2Rlc3Ryb3koZG1zLT5tZW0pOworCWRtX3Bvb2xfZGVzdHJveShkbXMtPmhpc3RfbWVtKTsKKwlkbV9wb29sX2Rlc3Ryb3koZG1zLT5ncm91cF9tZW0pOworCWRtX2ZyZWUoZG1zLT5wcm9ncmFtX2lkKTsKKwlkbV9mcmVlKChjaGFyICopIGRtcy0+bmFtZSk7CisJZG1fZnJlZShkbXMpOworfQorCisvKgorICogV2FsayBlYWNoIGFyZWEgdGhhdCBpcyBhIG1lbWJlciBvZiByZWdpb25faWQgcmlkLgorICogaSBpcyBhIHZhcmlhYmxlIG9mIHR5cGUgaW50IHRoYXQgaG9sZHMgdGhlIGN1cnJlbnQgYXJlYV9pZC4KKyAqLworI2RlZmluZSBfZm9yZWFjaF9yZWdpb25fYXJlYShkbXMsIHJpZCwgaSkJCQkJXAorZm9yICgoaSkgPSAwOyAoaSkgPCBfbnJfYXJlYXNfcmVnaW9uKCZkbXMtPnJlZ2lvbnNbKHJpZCldKTsgKGkpKyspCVwKKworLyoKKyAqIFdhbGsgZWFjaCByZWdpb24gdGhhdCBpcyBhIG1lbWJlciBvZiBncm91cF9pZCBnaWQuCisgKiBpIGlzIGEgdmFyaWFibGUgb2YgdHlwZSBpbnQgdGhhdCBob2xkcyB0aGUgY3VycmVudCByZWdpb25faWQuCisgKi8KKyNkZWZpbmUgX2ZvcmVhY2hfZ3JvdXBfcmVnaW9uKGRtcywgZ2lkLCBpKQkJCVwKK2ZvciAoKGkpID0gZG1fYml0X2dldF9maXJzdCgoZG1zKS0+Z3JvdXBzWyhnaWQpXS5yZWdpb25zKTsJXAorICAgICAoaSkgIT0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CQkJCVwKKyAgICAgKGkpID0gZG1fYml0X2dldF9uZXh0KChkbXMpLT5ncm91cHNbKGdpZCldLnJlZ2lvbnMsIChpKSkpCVwKKworLyoKKyAqIFdhbGsgZWFjaCByZWdpb24gdGhhdCBpcyBhIG1lbWJlciBvZiBncm91cF9pZCBnaWQgdmlzaXRpbmcgZWFjaAorICogYXJlYSB3aXRoaW4gdGhlIHJlZ2lvbi4KKyAqIGkgaXMgYSB2YXJpYWJsZSBvZiB0eXBlIGludCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHJlZ2lvbl9pZC4KKyAqIGogaXMgYSB2YXJpYWJsZSBvZiB0eXBlIGludCB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IGFyZWFfaWQuCisgKi8KKyNkZWZpbmUgX2ZvcmVhY2hfZ3JvdXBfYXJlYShkbXMsIGdpZCwgaSwgaikJCQlcCitfZm9yZWFjaF9ncm91cF9yZWdpb24oZG1zLCBnaWQsIGkpCQkJCVwKKwlfZm9yZWFjaF9yZWdpb25fYXJlYShkbXMsIGksIGopCisKK3N0YXRpYyB1aW50NjRfdCBfc3RhdHNfZ2V0X2NvdW50ZXIoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICAgY29uc3Qgc3RydWN0IGRtX3N0YXRzX2NvdW50ZXJzICphcmVhLAorCQkJCSAgIGRtX3N0YXRzX2NvdW50ZXJfdCBjb3VudGVyKQoreworCXN3aXRjaChjb3VudGVyKSB7CisJY2FzZSBETV9TVEFUU19SRUFEU19DT1VOVDoKKwkJcmV0dXJuIGFyZWEtPnJlYWRzOworCWNhc2UgRE1fU1RBVFNfUkVBRFNfTUVSR0VEX0NPVU5UOgorCQlyZXR1cm4gYXJlYS0+cmVhZHNfbWVyZ2VkOworCWNhc2UgRE1fU1RBVFNfUkVBRF9TRUNUT1JTX0NPVU5UOgorCQlyZXR1cm4gYXJlYS0+cmVhZF9zZWN0b3JzOworCWNhc2UgRE1fU1RBVFNfUkVBRF9OU0VDUzoKKwkJcmV0dXJuIGFyZWEtPnJlYWRfbnNlY3M7CisJY2FzZSBETV9TVEFUU19XUklURVNfQ09VTlQ6CisJCXJldHVybiBhcmVhLT53cml0ZXM7CisJY2FzZSBETV9TVEFUU19XUklURVNfTUVSR0VEX0NPVU5UOgorCQlyZXR1cm4gYXJlYS0+d3JpdGVzX21lcmdlZDsKKwljYXNlIERNX1NUQVRTX1dSSVRFX1NFQ1RPUlNfQ09VTlQ6CisJCXJldHVybiBhcmVhLT53cml0ZV9zZWN0b3JzOworCWNhc2UgRE1fU1RBVFNfV1JJVEVfTlNFQ1M6CisJCXJldHVybiBhcmVhLT53cml0ZV9uc2VjczsKKwljYXNlIERNX1NUQVRTX0lPX0lOX1BST0dSRVNTX0NPVU5UOgorCQlyZXR1cm4gYXJlYS0+aW9faW5fcHJvZ3Jlc3M7CisJY2FzZSBETV9TVEFUU19JT19OU0VDUzoKKwkJcmV0dXJuIGFyZWEtPmlvX25zZWNzOworCWNhc2UgRE1fU1RBVFNfV0VJR0hURURfSU9fTlNFQ1M6CisJCXJldHVybiBhcmVhLT53ZWlnaHRlZF9pb19uc2VjczsKKwljYXNlIERNX1NUQVRTX1RPVEFMX1JFQURfTlNFQ1M6CisJCXJldHVybiBhcmVhLT50b3RhbF9yZWFkX25zZWNzOworCWNhc2UgRE1fU1RBVFNfVE9UQUxfV1JJVEVfTlNFQ1M6CisJCXJldHVybiBhcmVhLT50b3RhbF93cml0ZV9uc2VjczsKKwljYXNlIERNX1NUQVRTX05SX0NPVU5URVJTOgorCWRlZmF1bHQ6CisJCWxvZ19lcnJvcigiQXR0ZW1wdCB0byByZWFkIGludmFsaWQgY291bnRlcjogJWQiLCBjb3VudGVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9jb3VudGVyKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJICAgICAgZG1fc3RhdHNfY291bnRlcl90IGNvdW50ZXIsCisJCQkgICAgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCit7CisJdWludDY0X3QgaSwgaiwgc3VtID0gMDsgLyogYWdncmVnYXRpb24gKi8KKwlpbnQgc3VtX3JlZ2lvbnMgPSAwOworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZG1fc3RhdHNfY291bnRlcnMgKmFyZWE7CisKKwlyZWdpb25faWQgPSAocmVnaW9uX2lkID09IERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UKQorCQkgICAgID8gZG1zLT5jdXJfcmVnaW9uIDogcmVnaW9uX2lkIDsKKwlhcmVhX2lkID0gKGFyZWFfaWQgPT0gRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpCisJCSAgID8gZG1zLT5jdXJfYXJlYSA6IGFyZWFfaWQgOworCisJc3VtX3JlZ2lvbnMgPSAhIShyZWdpb25faWQgJiBETV9TVEFUU19XQUxLX0dST1VQKTsKKworCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJLyogZ3JvdXAgd2FsayB1c2luZyB0aGUgY3Vyc29yICovCisJCXJlZ2lvbl9pZCA9IGRtcy0+Y3VyX2dyb3VwOworCWVsc2UgaWYgKHJlZ2lvbl9pZCAmIERNX1NUQVRTX1dBTEtfR1JPVVApCisJCS8qIGdyb3VwIHdhbGsgdXNpbmcgaW1tZWRpYXRlIGdyb3VwX2lkICovCisJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19HUk9VUDsKKwlyZWdpb24gPSAmZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF07CisKKwkvKgorCSAqIEFsbCBzdGF0aXN0aWNzIGFnZ3JlZ2F0aW9uIHRha2VzIHBsYWNlIGhlcmU6IGFnZ3JlZ2F0ZSBtZXRyaWNzCisJICogYXJlIGNhbGN1bGF0ZWQgYXMgbm9ybWFsIHVzaW5nIHRoZSBhZ2dyZWdhdGVkIGNvdW50ZXIgdmFsdWVzCisJICogcmV0dXJuZWQgZm9yIHRoZSByZWdpb24gb3IgZ3JvdXAgc3BlY2lmaWVkLgorCSAqLworCisJaWYgKF9zdGF0c19yZWdpb25faXNfZ3JvdXBlZChkbXMsIHJlZ2lvbl9pZCkgJiYgKHN1bV9yZWdpb25zKSkgeworCQkvKiBncm91cCAqLworCQlpZiAoYXJlYV9pZCAmIERNX1NUQVRTX1dBTEtfR1JPVVApCisJCQlfZm9yZWFjaF9ncm91cF9hcmVhKGRtcywgcmVnaW9uLT5ncm91cF9pZCwgaSwgaikgeworCQkJCWFyZWEgPSAmZG1zLT5yZWdpb25zW2ldLmNvdW50ZXJzW2pdOworCQkJCXN1bSArPSBfc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBhcmVhLCBjb3VudGVyKTsKKwkJCX0KKwkJZWxzZQorCQkJX2ZvcmVhY2hfZ3JvdXBfcmVnaW9uKGRtcywgcmVnaW9uLT5ncm91cF9pZCwgaSkgeworCQkJCWFyZWEgPSAmZG1zLT5yZWdpb25zW2ldLmNvdW50ZXJzW2FyZWFfaWRdOworCQkJCXN1bSArPSBfc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBhcmVhLCBjb3VudGVyKTsKKwkJCX0KKwl9IGVsc2UgaWYgKGFyZWFfaWQgPT0gRE1fU1RBVFNfV0FMS19SRUdJT04pIHsKKwkJLyogYWdncmVnYXRlIHJlZ2lvbiAqLworCQlfZm9yZWFjaF9yZWdpb25fYXJlYShkbXMsIHJlZ2lvbl9pZCwgaikgeworCQkJYXJlYSA9ICZkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5jb3VudGVyc1tqXTsKKwkJCXN1bSArPSBfc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBhcmVhLCBjb3VudGVyKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHBsYWluIHJlZ2lvbiAvIGFyZWEgKi8KKwkJYXJlYSA9ICZyZWdpb24tPmNvdW50ZXJzW2FyZWFfaWRdOworCQlzdW0gPSBfc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBhcmVhLCBjb3VudGVyKTsKKwl9CisKKwlyZXR1cm4gc3VtOworfQorCisvKgorICogTWV0aG9kcyBmb3IgYWNjZXNzaW5nIG5hbWVkIGNvdW50ZXIgZmllbGRzLiBBbGwgbWV0aG9kcyBzaGFyZSB0aGUKKyAqIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lIGFuZCBwcm90b3R5cGU6CisgKgorICogdWludDY0X3QgZG1fc3RhdHNfZ2V0X0NPVU5URVIoY29uc3Qgc3RydWN0IGRtX3N0YXRzICosIHVpbnQ2NF90LCB1aW50NjRfdCkKKyAqCisgKiBXaGVyZSB0aGUgdHdvIGludGVnZXIgYXJndW1lbnRzIGFyZSB0aGUgcmVnaW9uX2lkIGFuZCBhcmVhX2lkCisgKiByZXNwZWN0aXZlbHkuCisgKgorICogbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgY291bnRlciAobG93ZXIgY2FzZSkKKyAqIGNvdW50ZXIgaXMgdGhlIHBhcnQgb2YgdGhlIGVudW0gbmFtZSBmb2xsb3dpbmcgRE1fU1RBVFNfICh1cHBlciBjYXNlKQorICovCisjZGVmaW5lIE1LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKG5hbWUsIGNvdW50ZXIpCQkJCVwKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF8gIyMgbmFtZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywJCVwKKwkJCSAgICAgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfICMjIGNvdW50ZXIsCQlcCisJCQkJICAgIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CQlcCit9CisKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKHJlYWRzLCBSRUFEU19DT1VOVCkKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKHJlYWRzX21lcmdlZCwgUkVBRFNfTUVSR0VEX0NPVU5UKQorTUtfU1RBVFNfR0VUX0NPVU5URVJfRk4ocmVhZF9zZWN0b3JzLCBSRUFEX1NFQ1RPUlNfQ09VTlQpCitNS19TVEFUU19HRVRfQ09VTlRFUl9GTihyZWFkX25zZWNzLCBSRUFEX05TRUNTKQorTUtfU1RBVFNfR0VUX0NPVU5URVJfRk4od3JpdGVzLCBXUklURVNfQ09VTlQpCitNS19TVEFUU19HRVRfQ09VTlRFUl9GTih3cml0ZXNfbWVyZ2VkLCBXUklURVNfTUVSR0VEX0NPVU5UKQorTUtfU1RBVFNfR0VUX0NPVU5URVJfRk4od3JpdGVfc2VjdG9ycywgV1JJVEVfU0VDVE9SU19DT1VOVCkKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKHdyaXRlX25zZWNzLCBXUklURV9OU0VDUykKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKGlvX2luX3Byb2dyZXNzLCBJT19JTl9QUk9HUkVTU19DT1VOVCkKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKGlvX25zZWNzLCBJT19OU0VDUykKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKHdlaWdodGVkX2lvX25zZWNzLCBXRUlHSFRFRF9JT19OU0VDUykKK01LX1NUQVRTX0dFVF9DT1VOVEVSX0ZOKHRvdGFsX3JlYWRfbnNlY3MsIFRPVEFMX1JFQURfTlNFQ1MpCitNS19TVEFUU19HRVRfQ09VTlRFUl9GTih0b3RhbF93cml0ZV9uc2VjcywgVE9UQUxfV1JJVEVfTlNFQ1MpCisjdW5kZWYgTUtfU1RBVFNfR0VUX0NPVU5URVJfRk4KKworLyoKKyAqIEZsb2F0aW5nIHBvaW50IHN0YXRzIG1ldHJpYyBmdW5jdGlvbnMKKyAqCisgKiBDYWxsZWQgZnJvbSBkbV9zdGF0c19nZXRfbWV0cmljKCkgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZgorICogdGhlIHJlcXVlc3RlZCBtZXRyaWMuCisgKgorICogaW50IF9tZXRyaWNfbmFtZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKyAqIAkJICAgIHN0cnVjdCBkbV9zdGF0c19jb3VudGVycyAqYywKKyAqIAkJICAgIGRvdWJsZSAqdmFsdWUpOworICoKKyAqIENhbGN1bGF0ZSBhIG1ldHJpYyB2YWx1ZSBmcm9tIHRoZSBjb3VudGVyIGRhdGEgZm9yIHRoZSBnaXZlbgorICogaWRlbnRpZmllcnMgYW5kIHN0b3JlIGl0IGluIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB2YWx1ZSwKKyAqIGFwcGx5aW5nIGdyb3VwIG9yIHJlZ2lvbiBhZ2dyZWdhdGlvbiBpZiBlbmFibGVkLgorICoKKyAqIFJldHVybiBvbmUgb24gc3VjY2VzcyBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKgorICogVG8gYWRkIGEgbmV3IG1ldHJpYzoKKyAqCisgKiBvIEFkZCBhIG5ldyBuYW1lIHRvIHRoZSBkbV9zdGF0c19tZXRyaWNfdCBlbnVtLgorICogbyBDcmVhdGUgYSBfbWV0cmljX2ZuKCkgdG8gY2FsY3VsYXRlIHRoZSBuZXcgbWV0cmljLgorICogbyBBZGQgX21ldHJpY19mbiB0byB0aGUgX21ldHJpY3MgZnVuY3Rpb24gdGFibGUKKyAqICAgKGVudHJpZXMgaW4gZW51bSBvcmRlcikuCisgKiBvIERvIG5vdCBhZGQgYSBuZXcgbmFtZWQgcHVibGljIGZ1bmN0aW9uIGZvciB0aGUgbWV0cmljIC0KKyAqICAgdXNlcnMgb2YgbmV3IG1ldHJpY3MgYXJlIGVuY291cmFnZWQgdG8gY29udmVydCB0byB0aGUgZW51bQorICogICBiYXNlZCBtZXRyaWMgaW50ZXJmYWNlLgorICoKKyAqLworCitzdGF0aWMgaW50IF9yZF9tZXJnZXNfcGVyX3NlYyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICpycnFtLAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCWRvdWJsZSBtcmdzOworCW1yZ3MgPSAoZG91YmxlKSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURTX01FUkdFRF9DT1VOVCwKKwkJCQkJICAgICByZWdpb25faWQsIGFyZWFfaWQpOworCisJKnJycW0gPSBtcmdzIC8gKGRvdWJsZSkgZG1zLT5pbnRlcnZhbF9uczsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF93cl9tZXJnZXNfcGVyX3NlYyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICp3cnFtLAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCWRvdWJsZSBtcmdzOworCW1yZ3MgPSAoZG91YmxlKSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1dSSVRFU19NRVJHRURfQ09VTlQsCisJCQkJCSAgICAgcmVnaW9uX2lkLCBhcmVhX2lkKTsKKworCSp3cnFtID0gbXJncyAvIChkb3VibGUpIGRtcy0+aW50ZXJ2YWxfbnM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVhZHNfcGVyX3NlYyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICpyZF9zLAorCQkJICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCit7CisJZG91YmxlIHJlYWRzOworCXJlYWRzID0gKGRvdWJsZSkgZG1fc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBETV9TVEFUU19SRUFEU19DT1VOVCwKKwkJCQkJICAgICAgcmVnaW9uX2lkLCBhcmVhX2lkKTsKKworCSpyZF9zID0gKHJlYWRzICogTlNFQ19QRVJfU0VDKSAvIChkb3VibGUpIGRtcy0+aW50ZXJ2YWxfbnM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd3JpdGVzX3Blcl9zZWMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqd3JfcywKKwkJCSAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwlkb3VibGUgd3JpdGVzOworCXdyaXRlcyA9IChkb3VibGUpIGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV1JJVEVTX0NPVU5ULAorCQkJCQkgICAgICAgcmVnaW9uX2lkLCBhcmVhX2lkKTsKKworCSp3cl9zID0gKHdyaXRlcyAqIE5TRUNfUEVSX1NFQykgLyAoZG91YmxlKSBkbXMtPmludGVydmFsX25zOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfc2VjdG9yc19wZXJfc2VjKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnJzZWNfcywKKwkJCQkgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCWRvdWJsZSBzZWN0OworCXNlY3QgPSAoZG91YmxlKSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURfU0VDVE9SU19DT1VOVCwKKwkJCQkJICAgICByZWdpb25faWQsIGFyZWFfaWQpOworCisJKnJzZWNfcyA9IChzZWN0ICogKGRvdWJsZSkgTlNFQ19QRVJfU0VDKSAvIChkb3VibGUpIGRtcy0+aW50ZXJ2YWxfbnM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfd3JpdGVfc2VjdG9yc19wZXJfc2VjKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKndzZWNfcywKKwkJCQkgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwlkb3VibGUgc2VjdDsKKwlzZWN0ID0gKGRvdWJsZSkgZG1fc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBETV9TVEFUU19XUklURV9TRUNUT1JTX0NPVU5ULAorCQkJCQkgICAgIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisKKwkqd3NlY19zID0gKHNlY3QgKiAoZG91YmxlKSBOU0VDX1BFUl9TRUMpIC8gKGRvdWJsZSkgZG1zLT5pbnRlcnZhbF9uczsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hdmVyYWdlX3JlcXVlc3Rfc2l6ZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICphcnFzeiwKKwkJCQkgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCWRvdWJsZSBpb3MsIHNlY3RvcnM7CisKKwlpb3MgPSAoZG91YmxlKSAoZG1fc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBETV9TVEFUU19SRUFEU19DT1VOVCwKKwkJCQkJICAgICByZWdpb25faWQsIGFyZWFfaWQpCisJCQkrIGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV1JJVEVTX0NPVU5ULAorCQkJCQkgICAgICAgcmVnaW9uX2lkLCBhcmVhX2lkKSk7CisJc2VjdG9ycyA9IChkb3VibGUpIChkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURfU0VDVE9SU19DT1VOVCwKKwkJCQkJCSByZWdpb25faWQsIGFyZWFfaWQpCisJCQkgICAgKyBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1dSSVRFX1NFQ1RPUlNfQ09VTlQsCisJCQkJCQkgICByZWdpb25faWQsIGFyZWFfaWQpKTsKKworCWlmIChpb3MgPiAwLjApCisJCSphcnFzeiA9IHNlY3RvcnMgLyBpb3M7CisJZWxzZQorCQkqYXJxc3ogPSAwLjA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYXZlcmFnZV9xdWV1ZV9zaXplKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnF1c3osCisJCQkgICAgICAgdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCWRvdWJsZSBpb190aWNrczsKKwlpb190aWNrcyA9IChkb3VibGUpIGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV0VJR0hURURfSU9fTlNFQ1MsCisJCQkJCQkgcmVnaW9uX2lkLCBhcmVhX2lkKTsKKworCWlmIChpb190aWNrcyA+IDAuMCkKKwkJKnF1c3ogPSBpb190aWNrcyAvIChkb3VibGUpIGRtcy0+aW50ZXJ2YWxfbnM7CisJZWxzZQorCQkqcXVzeiA9IDAuMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9hdmVyYWdlX3dhaXRfdGltZShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICphd2FpdCwKKwkJCSAgICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwl1aW50NjRfdCBpb190aWNrcywgbnJfaW9zOworCisJaW9fdGlja3MgPSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURfTlNFQ1MsCisJCQkJCXJlZ2lvbl9pZCwgYXJlYV9pZCk7CisJaW9fdGlja3MgKz0gZG1fc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBETV9TVEFUU19XUklURV9OU0VDUywKKwkJCQkJIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisKKwlucl9pb3MgPSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURTX0NPVU5ULAorCQkJCSAgICAgIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisJbnJfaW9zICs9IGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV1JJVEVTX0NPVU5ULAorCQkJCSAgICAgICByZWdpb25faWQsIGFyZWFfaWQpOworCisJaWYgKG5yX2lvcyA+IDApCisJCSphd2FpdCA9IChkb3VibGUpIGlvX3RpY2tzIC8gKGRvdWJsZSkgbnJfaW9zOworCWVsc2UKKwkJKmF3YWl0ID0gMC4wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2F2ZXJhZ2VfcmRfd2FpdF90aW1lKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKmF3YWl0LAorCQkJCSB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCit7CisJdWludDY0X3QgcmRfaW9fdGlja3MsIG5yX3JkX2lvczsKKworCXJkX2lvX3RpY2tzID0gZG1fc3RhdHNfZ2V0X2NvdW50ZXIoZG1zLCBETV9TVEFUU19SRUFEX05TRUNTLAorCQkJCQkgICByZWdpb25faWQsIGFyZWFfaWQpOworCW5yX3JkX2lvcyA9IGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfUkVBRFNfQ09VTlQsCisJCQkJCSByZWdpb25faWQsIGFyZWFfaWQpOworCisJLyoKKwkgKiBJZiByZF9pb190aWNrcyBpcyA+IDAgdGhpcyBzaG91bGQgaW1wbHkgdGhhdCBucl9yZF9pb3MgaXMKKwkgKiBhbHNvID4gMCAodW5sZXNzIGEga2VybmVsIGJ1ZyBleGlzdHMpLiBUZXN0IGZvciBib3RoIGhlcmUKKwkgKiBiZWZvcmUgdXNpbmcgdGhlIElPIGNvdW50IGFzIGEgZGl2aXNvciAoQ292ZXJpdHkpLgorCSAqLworCWlmIChyZF9pb190aWNrcyA+IDAgJiYgbnJfcmRfaW9zID4gMCkKKwkJKmF3YWl0ID0gKGRvdWJsZSkgcmRfaW9fdGlja3MgLyAoZG91YmxlKSBucl9yZF9pb3M7CisJZWxzZQorCQkqYXdhaXQgPSAwLjA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfYXZlcmFnZV93cl93YWl0X3RpbWUoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqYXdhaXQsCisJCQkJIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwl1aW50NjRfdCB3cl9pb190aWNrcywgbnJfd3JfaW9zOworCisJd3JfaW9fdGlja3MgPSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1dSSVRFX05TRUNTLAorCQkJCQkgICByZWdpb25faWQsIGFyZWFfaWQpOworCW5yX3dyX2lvcyA9IGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV1JJVEVTX0NPVU5ULAorCQkJCQkgcmVnaW9uX2lkLCBhcmVhX2lkKTsKKworCS8qCisJICogSWYgd3JfaW9fdGlja3MgaXMgPiAwIHRoaXMgc2hvdWxkIGltcGx5IHRoYXQgbnJfd3JfaW9zIGlzCisJICogYWxzbyA+IDAgKHVubGVzcyBhIGtlcm5lbCBidWcgZXhpc3RzKS4gVGVzdCBmb3IgYm90aCBoZXJlCisJICogYmVmb3JlIHVzaW5nIHRoZSBJTyBjb3VudCBhcyBhIGRpdmlzb3IgKENvdmVyaXR5KS4KKwkgKi8KKwlpZiAod3JfaW9fdGlja3MgPiAwICYmIG5yX3dyX2lvcyA+IDApCisJCSphd2FpdCA9IChkb3VibGUpIHdyX2lvX3RpY2tzIC8gKGRvdWJsZSkgbnJfd3JfaW9zOworCWVsc2UKKwkJKmF3YWl0ID0gMC4wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3Rocm91Z2hwdXQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqdHB1dCwKKwkJICAgICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwl1aW50NjRfdCBucl9pb3M7CisKKwlucl9pb3MgPSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX1JFQURTX0NPVU5ULAorCQkJCSAgICAgIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisJbnJfaW9zICs9IGRtX3N0YXRzX2dldF9jb3VudGVyKGRtcywgRE1fU1RBVFNfV1JJVEVTX0NPVU5ULAorCQkJCSAgICAgICByZWdpb25faWQsIGFyZWFfaWQpOworCisJKnRwdXQgPSAoKGRvdWJsZSkgTlNFQ19QRVJfU0VDICogKGRvdWJsZSkgbnJfaW9zKQorCQkvIChkb3VibGUpIChkbXMtPmludGVydmFsX25zKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF91dGlsaXphdGlvbihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgZG91YmxlICp1dGlsLAorCQkJdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCXVpbnQ2NF90IGlvX25zZWNzLCBpbnRlcnZhbF9ucyA9IGRtcy0+aW50ZXJ2YWxfbnM7CisKKwkvKioKKwkgKiBJZiBpb19uc2VjID4gaW50ZXJ2YWxfbnMgdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGNsb2NrCisJICogZm9yIHRoZSBsYXN0IGludGVydmFsOyBkbyBub3QgYWxsb3cgYSB2YWx1ZSA+IDEwMCUgdXRpbGl6YXRpb24KKwkgKiB0byBiZSBwYXNzZWQgdG8gYSBkbV9tYWtlX3BlcmNlbnQoKSBjYWxsLiBXZSBleHBlY3QgdG8gc2VlIHRoZXNlCisJICogYXQgc3RhcnR1cCBpZiBjb3VudGVycyBoYXZlIG5vdCBiZWVuIGNsZWFyZWQgYmVmb3JlIHRoZSBmaXJzdCByZWFkLgorCSAqCisJICogQSB6ZXJvIGludGVydmFsX25zIGlzIGFsc28gYW4gZXJyb3Igc2luY2UgbWV0cmljcyBjYW5ub3QgYmUKKwkgKiBjYWxjdWxhdGVkIHdpdGhvdXQgYSBkZWZpbmVkIGludGVydmFsIC0gcmV0dXJuIHplcm8gYW5kIGVtaXQgYQorCSAqIGJhY2t0cmFjZSBpbiB0aGlzIGNhc2UuCisJICovCisJaW9fbnNlY3MgPSBkbV9zdGF0c19nZXRfY291bnRlcihkbXMsIERNX1NUQVRTX0lPX05TRUNTLAorCQkJCQlyZWdpb25faWQsIGFyZWFfaWQpOworCisJaWYgKCFpbnRlcnZhbF9ucykgeworCQkqdXRpbCA9IDAuMDsKKwkJcmV0dXJuXzA7CisJfQorCisJaW9fbnNlY3MgPSAoKGlvX25zZWNzIDwgaW50ZXJ2YWxfbnMpID8gaW9fbnNlY3MgOiBpbnRlcnZhbF9ucyk7CisKKwkqdXRpbCA9IChkb3VibGUpIGlvX25zZWNzIC8gKGRvdWJsZSkgaW50ZXJ2YWxfbnM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc2VydmljZV90aW1lKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkb3VibGUgKnN2Y3RtLAorCQkJIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwlkb3VibGUgdHB1dCwgdXRpbDsKKworCWlmICghX3Rocm91Z2hwdXQoZG1zLCAmdHB1dCwgcmVnaW9uX2lkLCBhcmVhX2lkKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIV91dGlsaXphdGlvbihkbXMsICZ1dGlsLCByZWdpb25faWQsIGFyZWFfaWQpKQorCQlyZXR1cm4gMDsKKworCXV0aWwgKj0gMTAwOworCisJLyogYXZvaWQgTkFOIHdpdGggemVybyBjb3VudGVyIHZhbHVlcyAqLworCWlmICggKHVpbnQ2NF90KSB0cHV0ID09IDAgfHwgKHVpbnQ2NF90KSB1dGlsID09IDApIHsKKwkJKnN2Y3RtID0gMC4wOworCQlyZXR1cm4gMTsKKwl9CisKKwkqc3ZjdG0gPSAoKGRvdWJsZSkgTlNFQ19QRVJfU0VDICogZG1fcGVyY2VudF90b19mbG9hdCh1dGlsKSkKKwkJICAvICgxMDAuMCAqIHRwdXQpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUYWJsZSBpbiBlbnVtIG9yZGVyOgorICogICAgICBETV9TVEFUU19SRF9NRVJHRVNfUEVSX1NFQywKKyAqICAgICAgRE1fU1RBVFNfV1JfTUVSR0VTX1BFUl9TRUMsCisgKiAgICAgIERNX1NUQVRTX1JFQURTX1BFUl9TRUMsCisgKiAgICAgIERNX1NUQVRTX1dSSVRFU19QRVJfU0VDLAorICogICAgICBETV9TVEFUU19SRUFEX1NFQ1RPUlNfUEVSX1NFQywKKyAqICAgICAgRE1fU1RBVFNfV1JJVEVfU0VDVE9SU19QRVJfU0VDLAorICogICAgICBETV9TVEFUU19BVkVSQUdFX1JFUVVFU1RfU0laRSwKKyAqICAgICAgRE1fU1RBVFNfQVZFUkFHRV9RVUVVRV9TSVpFLAorICogICAgICBETV9TVEFUU19BVkVSQUdFX1dBSVRfVElNRSwKKyAqICAgICAgRE1fU1RBVFNfQVZFUkFHRV9SRF9XQUlUX1RJTUUsCisgKiAgICAgIERNX1NUQVRTX0FWRVJBR0VfV1JfV0FJVF9USU1FCisgKiAgICAgIERNX1NUQVRTX1NFUlZJQ0VfVElNRSwKKyAqICAgICAgRE1fU1RBVFNfVEhST1VHSFBVVCwKKyAqICAgICAgRE1fU1RBVFNfVVRJTElaQVRJT04KKyAqCisqLworCit0eXBlZGVmIGludCAoKl9tZXRyaWNfZm5fdCkoY29uc3Qgc3RydWN0IGRtX3N0YXRzICosIGRvdWJsZSAqLAorCQkJICAgIHVpbnQ2NF90LCB1aW50NjRfdCk7CisKK19tZXRyaWNfZm5fdCBfbWV0cmljc1tETV9TVEFUU19OUl9NRVRSSUNTXSA9IHsKKwlfcmRfbWVyZ2VzX3Blcl9zZWMsCisJX3dyX21lcmdlc19wZXJfc2VjLAorCV9yZWFkc19wZXJfc2VjLAorCV93cml0ZXNfcGVyX3NlYywKKwlfcmVhZF9zZWN0b3JzX3Blcl9zZWMsCisJX3dyaXRlX3NlY3RvcnNfcGVyX3NlYywKKwlfYXZlcmFnZV9yZXF1ZXN0X3NpemUsCisJX2F2ZXJhZ2VfcXVldWVfc2l6ZSwKKwlfYXZlcmFnZV93YWl0X3RpbWUsCisJX2F2ZXJhZ2VfcmRfd2FpdF90aW1lLAorCV9hdmVyYWdlX3dyX3dhaXRfdGltZSwKKwlfc2VydmljZV90aW1lLAorCV90aHJvdWdocHV0LAorCV91dGlsaXphdGlvbgorfTsKKworaW50IGRtX3N0YXRzX2dldF9tZXRyaWMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBtZXRyaWMsCisJCQl1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQsIGRvdWJsZSAqdmFsdWUpCit7CisJaWYgKCFkbXMtPmludGVydmFsX25zKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogRGVjb2RlIERNX1NUQVRTX3tSRUdJT04sQVJFQX1fQ1VSUkVOVCBoZXJlOyBjb3VudGVycyB3aWxsIHRoZW4KKwkgKiBiZSByZXR1cm5lZCBmb3IgdGhlIGFjdHVhbCBjdXJyZW50IHJlZ2lvbiBhbmQgYXJlYS4KKwkgKgorCSAqIERNX1NUQVRTX1dBTEtfR1JPVVAgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvdW50ZXIgbWV0aG9kcyAtCisJICogYWdncmVnYXRlcyBmb3IgdGhlIGdyb3VwIGFyZSByZXR1cm5lZCBhbmQgdXNlZCB0byBjYWxjdWxhdGUKKwkgKiB0aGUgbWV0cmljIGZvciB0aGUgZ3JvdXAgdG90YWxzLgorCSAqLworCXJlZ2lvbl9pZCA9IChyZWdpb25faWQgPT0gRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpCisJCSAgICAgPyBkbXMtPmN1cl9yZWdpb24gOiByZWdpb25faWQgOworCWFyZWFfaWQgPSAoYXJlYV9pZCA9PSBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCkKKwkJICAgPyBkbXMtPmN1cl9hcmVhIDogYXJlYV9pZCA7CisKKwlpZiAobWV0cmljIDwgMCB8fCBtZXRyaWMgPj0gRE1fU1RBVFNfTlJfTUVUUklDUykgeworCQlsb2dfZXJyb3IoIkF0dGVtcHQgdG8gcmVhZCBpbnZhbGlkIG1ldHJpYzogJWQiLCBtZXRyaWMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX21ldHJpY3NbbWV0cmljXShkbXMsIHZhbHVlLCByZWdpb25faWQsIGFyZWFfaWQpOworfQorCisvKioKKyAqIE1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzdGF0cyBtZXRyaWNzLiBBbGwgbWV0aG9kcyBzaGFyZSB0aGUKKyAqIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lIGFuZCBwcm90b3R5cGU6CisgKgorICogdWludDY0X3QgZG1fc3RhdHNfZ2V0X21ldHJpYyhzdHJ1Y3QgZG1fc3RhdHMgKiwKKyAqIAkJCQlpbnQsIGludCwKKyAqIAkJCQl1aW50NjRfdCwgdWludDY0X3QsCisgKiAJCQkJZG91YmxlICp2KQorICoKKyAqIFdoZXJlIHRoZSB0d28gaW50ZWdlciBhcmd1bWVudHMgYXJlIHRoZSByZWdpb25faWQgYW5kIGFyZWFfaWQKKyAqIHJlc3BlY3RpdmVseS4KKyAqCisgKiBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRyaWMgKGxvd2VyIGNhc2UpCisgKiBtZXRyaWMgaXMgdGhlIHBhcnQgb2YgdGhlIGVudW0gbmFtZSBmb2xsb3dpbmcgRE1fU1RBVFNfICh1cHBlciBjYXNlKQorICovCisjZGVmaW5lIE1LX1NUQVRTX0dFVF9NRVRSSUNfRk4obmFtZSwgbWV0cmljLCBtZXRhKQkJCVwKK2ludCBkbV9zdGF0c19nZXRfICMjIG5hbWUoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIGRvdWJsZSAqbWV0YSwJXAorCQkJICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBkbV9zdGF0c19nZXRfbWV0cmljKGRtcywgRE1fU1RBVFNfICMjIG1ldHJpYywgCQlcCisJCQkJICAgcmVnaW9uX2lkLCBhcmVhX2lkLCBtZXRhKTsJCVwKK30KKworTUtfU1RBVFNfR0VUX01FVFJJQ19GTihyZF9tZXJnZXNfcGVyX3NlYywgUkRfTUVSR0VTX1BFUl9TRUMsIHJycW0pCitNS19TVEFUU19HRVRfTUVUUklDX0ZOKHdyX21lcmdlc19wZXJfc2VjLCBXUl9NRVJHRVNfUEVSX1NFQywgd3JxbSkKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4ocmVhZHNfcGVyX3NlYywgUkVBRFNfUEVSX1NFQywgcmRfcykKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4od3JpdGVzX3Blcl9zZWMsIFdSSVRFU19QRVJfU0VDLCB3cl9zKQorTUtfU1RBVFNfR0VUX01FVFJJQ19GTihyZWFkX3NlY3RvcnNfcGVyX3NlYywgUkVBRF9TRUNUT1JTX1BFUl9TRUMsIHJzZWNfcykKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4od3JpdGVfc2VjdG9yc19wZXJfc2VjLCBXUklURV9TRUNUT1JTX1BFUl9TRUMsIHdzZWNfcykKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4oYXZlcmFnZV9yZXF1ZXN0X3NpemUsIEFWRVJBR0VfUkVRVUVTVF9TSVpFLCBhcnFzeikKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4oYXZlcmFnZV9xdWV1ZV9zaXplLCBBVkVSQUdFX1FVRVVFX1NJWkUsIHF1c3opCitNS19TVEFUU19HRVRfTUVUUklDX0ZOKGF2ZXJhZ2Vfd2FpdF90aW1lLCBBVkVSQUdFX1dBSVRfVElNRSwgYXdhaXQpCitNS19TVEFUU19HRVRfTUVUUklDX0ZOKGF2ZXJhZ2VfcmRfd2FpdF90aW1lLCBBVkVSQUdFX1JEX1dBSVRfVElNRSwgYXdhaXQpCitNS19TVEFUU19HRVRfTUVUUklDX0ZOKGF2ZXJhZ2Vfd3Jfd2FpdF90aW1lLCBBVkVSQUdFX1dSX1dBSVRfVElNRSwgYXdhaXQpCitNS19TVEFUU19HRVRfTUVUUklDX0ZOKHNlcnZpY2VfdGltZSwgU0VSVklDRV9USU1FLCBzdmN0bSkKK01LX1NUQVRTX0dFVF9NRVRSSUNfRk4odGhyb3VnaHB1dCwgVEhST1VHSFBVVCwgdHB1dCkKKworLyoKKyAqIFV0aWxpemF0aW9uIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZSBpdCB1c2VkIHRoZSBkbV9wZXJjZW50X3QgdHlwZSBpbiB0aGUKKyAqIG9yaWdpbmFsIG5hbWVkIGZ1bmN0aW9uIGJhc2VkIGludGVyZmFjZTogcHJlc2VydmUgdGhpcyBiZWhhdmlvdXIgZm9yCisgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHVzZXJzLgorICoKKyAqIFRoZSBzYW1lIG1ldHJpYyBtYXkgYmUgYWNjZXNzZWQgYXMgYSBkb3VibGUgdmlhIHRoZSBlbnVtIGJhc2VkIG1ldHJpYworICogaW50ZXJmYWNlLgorICovCitpbnQgZG1fc3RhdHNfZ2V0X3V0aWxpemF0aW9uKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBkbV9wZXJjZW50X3QgKnV0aWwsCisJCQkgICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwlkb3VibGUgX3V0aWw7CisKKwlpZiAoIWRtX3N0YXRzX2dldF9tZXRyaWMoZG1zLCBETV9TVEFUU19VVElMSVpBVElPTiwKKwkJCQkgcmVnaW9uX2lkLCBhcmVhX2lkLCAmX3V0aWwpKQorCQlyZXR1cm5fMDsKKwkvKiBzY2FsZSB1cCB1dGlsaXphdGlvbiB2YWx1ZSBpbiB0aGUgcmFuZ2UgWzAuMDAuLjEuMDBdICovCisJKnV0aWwgPSBkbV9tYWtlX3BlcmNlbnQoRE1fUEVSQ0VOVF8xICogX3V0aWwsIERNX1BFUkNFTlRfMSk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgZG1fc3RhdHNfc2V0X3NhbXBsaW5nX2ludGVydmFsX21zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBpbnRlcnZhbF9tcykKK3sKKwkvKiBBbGwgdGltZXMgdXNlIG5zZWNzIGludGVybmFsbHkuICovCisJZG1zLT5pbnRlcnZhbF9ucyA9IGludGVydmFsX21zICogTlNFQ19QRVJfTVNFQzsKK30KKwordm9pZCBkbV9zdGF0c19zZXRfc2FtcGxpbmdfaW50ZXJ2YWxfbnMoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IGludGVydmFsX25zKQoreworCWRtcy0+aW50ZXJ2YWxfbnMgPSBpbnRlcnZhbF9uczsKK30KKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3NhbXBsaW5nX2ludGVydmFsX21zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCS8qIEFsbCB0aW1lcyB1c2UgbnNlY3MgaW50ZXJuYWxseS4gKi8KKwlyZXR1cm4gKGRtcy0+aW50ZXJ2YWxfbnMgLyBOU0VDX1BFUl9NU0VDKTsKK30KKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X3NhbXBsaW5nX2ludGVydmFsX25zKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCS8qIEFsbCB0aW1lcyB1c2UgbnNlY3MgaW50ZXJuYWxseS4gKi8KKwlyZXR1cm4gKGRtcy0+aW50ZXJ2YWxfbnMpOworfQorCitpbnQgZG1fc3RhdHNfc2V0X3Byb2dyYW1faWQoc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBhbGxvd19lbXB0eSwKKwkJCSAgICBjb25zdCBjaGFyICpwcm9ncmFtX2lkKQoreworCWlmICghYWxsb3dfZW1wdHkgJiYgKCFwcm9ncmFtX2lkIHx8ICFzdHJsZW4ocHJvZ3JhbV9pZCkpKSB7CisJCWxvZ19lcnJvcigiRW1wdHkgcHJvZ3JhbV9pZCBub3QgcGVybWl0dGVkIHdpdGhvdXQgIgorCQkJICAiYWxsb3dfZW1wdHk9MSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXByb2dyYW1faWQpCisJCXByb2dyYW1faWQgPSAiIjsKKworCWlmIChkbXMtPnByb2dyYW1faWQpCisJCWRtX2ZyZWUoZG1zLT5wcm9ncmFtX2lkKTsKKworCWlmICghKGRtcy0+cHJvZ3JhbV9pZCA9IGRtX3N0cmR1cChwcm9ncmFtX2lkKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3VpbnQ2NF90IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlyZXR1cm4gZG1zLT5jdXJfcmVnaW9uOworfQorCit1aW50NjRfdCBkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zKQoreworCXJldHVybiBkbXMtPmN1cl9hcmVhICYgfkRNX1NUQVRTX1dBTEtfQUxMOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X3JlZ2lvbl9zdGFydChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKnN0YXJ0LAorCQkJICAgICAgdWludDY0X3QgcmVnaW9uX2lkKQoreworCWlmICghZG1zIHx8ICFkbXMtPnJlZ2lvbnMpCisJCXJldHVybl8wOworCisJLyogc3RhcnQgaXMgdW5jaGFuZ2VkIHdoZW4gYWdncmVnYXRpbmcgYXJlYXMgKi8KKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19SRUdJT04pCisJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19SRUdJT047CisKKwkvKiB1c2Ugc3RhcnQgb2YgZmlyc3QgcmVnaW9uIGFzIGdyb3VwIHN0YXJ0ICovCisJaWYgKHJlZ2lvbl9pZCAmIERNX1NUQVRTX1dBTEtfR1JPVVApIHsKKwkJaWYgKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19XQUxLX0dST1VQKQorCQkJcmVnaW9uX2lkID0gZG1zLT5jdXJfZ3JvdXA7CisJCWVsc2UKKwkJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19HUk9VUDsKKwl9CisKKwkqc3RhcnQgPSBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5zdGFydDsKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3N0YXRzX2dldF9yZWdpb25fbGVuKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqbGVuLAorCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwl1aW50NjRfdCBpOworCWlmICghZG1zIHx8ICFkbXMtPnJlZ2lvbnMpCisJCXJldHVybl8wOworCisJKmxlbiA9IDA7CisKKwkvKiBsZW5ndGggaXMgdW5jaGFuZ2VkIHdoZW4gYWdncmVnYXRpbmcgYXJlYXMgKi8KKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19SRUdJT04pCisJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19SRUdJT047CisKKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQkvKiBkZWNvZGUgcmVnaW9uIC8gZ3JvdXAgSUQgKi8KKwkJaWYgKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19XQUxLX0dST1VQKQorCQkJcmVnaW9uX2lkID0gZG1zLT5jdXJfZ3JvdXA7CisJCWVsc2UKKwkJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19HUk9VUDsKKworCQkvKiB1c2Ugc3VtIG9mIHJlZ2lvbiBzaXplcyBhcyBncm91cCBzaXplICovCisJCWlmIChfc3RhdHNfcmVnaW9uX2lzX2dyb3VwZWQoZG1zLCByZWdpb25faWQpKQorCQkJX2ZvcmVhY2hfZ3JvdXBfcmVnaW9uKGRtcywgZG1zLT5jdXJfZ3JvdXAsIGkpCisJCQkJKmxlbiArPSBkbXMtPnJlZ2lvbnNbaV0ubGVuOworCQllbHNlIHsKKwkJCWxvZ19lcnJvcigiR3JvdXAgSUQgIiBGTVR1NjQgIiBkb2VzIG5vdCBleGlzdCIsCisJCQkJICByZWdpb25faWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UKKwkJKmxlbiA9IGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmxlbjsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X3JlZ2lvbl9hcmVhX2xlbihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKmxlbiwKKwkJCQkgdWludDY0X3QgcmVnaW9uX2lkKQoreworCWlmICghZG1zIHx8ICFkbXMtPnJlZ2lvbnMpCisJCXJldHVybl8wOworCisJLyogZ3JvdXBzIGFyZSBub3Qgc3ViZGl2aWRlZCAtIGFyZWEgc2l6ZSBlcXVhbHMgZ3JvdXAgc2l6ZSAqLworCWlmIChyZWdpb25faWQgJiAoRE1fU1RBVFNfV0FMS19HUk9VUCB8IERNX1NUQVRTX1dBTEtfUkVHSU9OKSkKKwkJLyogZ2V0X3JlZ2lvbl9sZW4gd2lsbCBkZWNvZGUgcmVnaW9uX2lkICovCisJCXJldHVybiBkbV9zdGF0c19nZXRfcmVnaW9uX2xlbihkbXMsIGxlbiwgcmVnaW9uX2lkKTsKKworCSpsZW4gPSBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5zdGVwOworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX3N0YXJ0KGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICAgIHVpbnQ2NF90ICpzdGFydCkKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9zdGFydChkbXMsIHN0YXJ0LCBkbXMtPmN1cl9yZWdpb24pOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX2xlbihjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgdWludDY0X3QgKmxlbikKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9sZW4oZG1zLCBsZW4sIGRtcy0+Y3VyX3JlZ2lvbik7Cit9CisKK2ludCBkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fYXJlYV9sZW4oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSB1aW50NjRfdCAqc3RlcCkKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9hcmVhX2xlbihkbXMsIHN0ZXAsIGRtcy0+Y3VyX3JlZ2lvbik7Cit9CisKK2ludCBkbV9zdGF0c19nZXRfYXJlYV9zdGFydChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgKnN0YXJ0LAorCQkJICAgIHVpbnQ2NF90IHJlZ2lvbl9pZCwgdWludDY0X3QgYXJlYV9pZCkKK3sKKwlzdHJ1Y3QgZG1fc3RhdHNfcmVnaW9uICpyZWdpb247CisJaWYgKCFkbXMgfHwgIWRtcy0+cmVnaW9ucykKKwkJcmV0dXJuXzA7CisKKwkvKiBncm91cCBvciByZWdpb24gYXJlYSBzdGFydCBlcXVhbHMgcmVnaW9uIHN0YXJ0ICovCisJaWYgKHJlZ2lvbl9pZCAmIChETV9TVEFUU19XQUxLX0dST1VQIHwgRE1fU1RBVFNfV0FMS19SRUdJT04pKQorCQlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9zdGFydChkbXMsIHN0YXJ0LCByZWdpb25faWQpOworCisJcmVnaW9uID0gJmRtcy0+cmVnaW9uc1tyZWdpb25faWRdOworCSpzdGFydCA9IHJlZ2lvbi0+c3RhcnQgKyByZWdpb24tPnN0ZXAgKiBhcmVhX2lkOworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2FyZWFfb2Zmc2V0KGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqb2Zmc2V0LAorCQkJICAgICB1aW50NjRfdCByZWdpb25faWQsIHVpbnQ2NF90IGFyZWFfaWQpCit7CisJaWYgKCFkbXMgfHwgIWRtcy0+cmVnaW9ucykKKwkJcmV0dXJuXzA7CisKKwkvKiBubyBhcmVhcyBmb3IgZ3JvdXBzIG9yIGFnZ3JlZ2F0ZSByZWdpb25zICovCisJaWYgKHJlZ2lvbl9pZCAmIChETV9TVEFUU19XQUxLX0dST1VQIHwgRE1fU1RBVFNfV0FMS19SRUdJT04pKQorCQkqb2Zmc2V0ID0gMDsKKwllbHNlCisJCSpvZmZzZXQgPSBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5zdGVwICogYXJlYV9pZDsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9zdGFydChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkgICAgdWludDY0X3QgKnN0YXJ0KQoreworCXJldHVybiBkbV9zdGF0c19nZXRfYXJlYV9zdGFydChkbXMsIHN0YXJ0LAorCQkJCSAgICAgICBkbXMtPmN1cl9yZWdpb24sIGRtcy0+Y3VyX2FyZWEpOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9vZmZzZXQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgdWludDY0X3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X2FyZWFfb2Zmc2V0KGRtcywgb2Zmc2V0LAorCQkJCSAgICAgICBkbXMtPmN1cl9yZWdpb24sIGRtcy0+Y3VyX2FyZWEpOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9sZW4oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJICB1aW50NjRfdCAqbGVuKQoreworCXJldHVybiBkbV9zdGF0c19nZXRfcmVnaW9uX2FyZWFfbGVuKGRtcywgbGVuLCBkbXMtPmN1cl9yZWdpb24pOworfQorCitjb25zdCBjaGFyICpkbV9zdGF0c19nZXRfcmVnaW9uX3Byb2dyYW1faWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwljb25zdCBjaGFyICpwcm9ncmFtX2lkID0gTlVMTDsKKworCWlmIChyZWdpb25faWQgJiBETV9TVEFUU19XQUxLX0dST1VQKQorCQlyZXR1cm4gZG1zLT5wcm9ncmFtX2lkOworCisJaWYgKHJlZ2lvbl9pZCAmIERNX1NUQVRTX1dBTEtfUkVHSU9OKQorCQlyZWdpb25faWQgJj0gfkRNX1NUQVRTX1dBTEtfUkVHSU9OOworCisJcHJvZ3JhbV9pZCA9IGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLnByb2dyYW1faWQ7CisJcmV0dXJuIChwcm9ncmFtX2lkKSA/IHByb2dyYW1faWQgOiAiIjsKK30KKworY29uc3QgY2hhciAqZG1fc3RhdHNfZ2V0X3JlZ2lvbl9hdXhfZGF0YShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkJIHVpbnQ2NF90IHJlZ2lvbl9pZCkKK3sKKwljb25zdCBjaGFyICphdXhfZGF0YSA9IE5VTEw7CisKKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJcmV0dXJuICIiOworCisJaWYgKHJlZ2lvbl9pZCAmIERNX1NUQVRTX1dBTEtfUkVHSU9OKQorCQlyZWdpb25faWQgJj0gfkRNX1NUQVRTX1dBTEtfUkVHSU9OOworCisJYXV4X2RhdGEgPSBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5hdXhfZGF0YTsKKwlyZXR1cm4gKGF1eF9kYXRhKSA/IGF1eF9kYXRhIDogIiIgOworfQorCitpbnQgZG1fc3RhdHNfc2V0X2FsaWFzKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCBncm91cF9pZCwgY29uc3QgY2hhciAqYWxpYXMpCit7CisJc3RydWN0IGRtX3N0YXRzX2dyb3VwICpncm91cCA9IE5VTEw7CisJY29uc3QgY2hhciAqb2xkX2FsaWFzID0gTlVMTDsKKworCWlmICghZG1zLT5yZWdpb25zIHx8ICFkbXMtPmdyb3VwcyB8fCAhYWxpYXMpCisJCXJldHVybl8wOworCisJaWYgKCFfc3RhdHNfcmVnaW9uX2lzX2dyb3VwZWQoZG1zLCBncm91cF9pZCkpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3Qgc2V0IGFsaWFzIGZvciB1bmdyb3VwZWQgcmVnaW9uIElEICIKKwkJCSAgRk1UdTY0LCBncm91cF9pZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChncm91cF9pZCAmIERNX1NUQVRTX1dBTEtfR1JPVVApIHsKKwkJaWYgKGdyb3VwX2lkID09IERNX1NUQVRTX1dBTEtfR1JPVVApCisJCQlncm91cF9pZCA9IGRtcy0+Y3VyX2dyb3VwOworCQllbHNlCisJCQlncm91cF9pZCAmPSB+RE1fU1RBVFNfV0FMS19HUk9VUDsKKwl9CisKKwlpZiAoZ3JvdXBfaWQgIT0gZG1zLT5yZWdpb25zW2dyb3VwX2lkXS5ncm91cF9pZCkgeworCQkvKiBkbV9zdGF0c19zZXRfYWxpYXMoKSBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgZ3JvdXAgSUQuICovCisJCWxvZ19lcnJvcigiQ2Fubm90IHNldCBhbGlhcyBmb3IgZ3JvdXAgbWVtYmVyICIgRk1UdTY0ICIuIiwKKwkJCSAgZ3JvdXBfaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlncm91cCA9ICZkbXMtPmdyb3Vwc1tncm91cF9pZF07CisJb2xkX2FsaWFzID0gZ3JvdXAtPmFsaWFzOworCisJZ3JvdXAtPmFsaWFzID0gZG1fc3RyZHVwKGFsaWFzKTsKKwlpZiAoIWdyb3VwLT5hbGlhcykgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsaWFzLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIV9zdGF0c19zZXRfYXV4KGRtcywgZ3JvdXBfaWQsIGRtcy0+cmVnaW9uc1tncm91cF9pZF0uYXV4X2RhdGEpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHNldCBuZXcgYXV4X2RhdGEiKTsKKwkJZ290byBiYWQ7CisJfQorCisJZG1fZnJlZSgoY2hhciAqKSBvbGRfYWxpYXMpOworCisJcmV0dXJuIDE7CisKK2JhZDoKKwlkbV9mcmVlKChjaGFyICopIGdyb3VwLT5hbGlhcyk7CisJZ3JvdXAtPmFsaWFzID0gb2xkX2FsaWFzOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpkbV9zdGF0c19nZXRfYWxpYXMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IGlkKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbjsKKworCWlkID0gKGlkID09IERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UKSA/IGRtcy0+Y3VyX3JlZ2lvbiA6IGlkOworCisJaWYgKGlkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQlpZiAoaWQgPT0gRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJCWlkID0gZG1zLT5jdXJfZ3JvdXA7CisJCWVsc2UKKwkJCWlkICY9IH5ETV9TVEFUU19XQUxLX0dST1VQOworCX0KKworCXJlZ2lvbiA9ICZkbXMtPnJlZ2lvbnNbaWRdOworCWlmICghX3N0YXRzX3JlZ2lvbl9pc19ncm91cGVkKGRtcywgaWQpCisJICAgIHx8ICFkbXMtPmdyb3Vwc1tyZWdpb24tPmdyb3VwX2lkXS5hbGlhcykKKwkJcmV0dXJuIGRtcy0+bmFtZTsKKworCXJldHVybiBkbXMtPmdyb3Vwc1tyZWdpb24tPmdyb3VwX2lkXS5hbGlhczsKK30KKworY29uc3QgY2hhciAqZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX3Byb2dyYW1faWQoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMpCit7CisJcmV0dXJuIGRtX3N0YXRzX2dldF9yZWdpb25fcHJvZ3JhbV9pZChkbXMsIGRtcy0+Y3VyX3JlZ2lvbik7Cit9CisKK2NvbnN0IGNoYXIgKmRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9hdXhfZGF0YShjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9hdXhfZGF0YShkbXMsIGRtcy0+Y3VyX3JlZ2lvbik7Cit9CisKK2ludCBkbV9zdGF0c19nZXRfcmVnaW9uX3ByZWNpc2VfdGltZXN0YW1wcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcywKKwkJCQkJICAgdWludDY0X3QgcmVnaW9uX2lkKQoreworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbjsKKworCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpCisJCXJlZ2lvbl9pZCA9IGRtcy0+Y3VyX3JlZ2lvbjsKKworCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJcmVnaW9uX2lkID0gZG1zLT5jdXJfZ3JvdXA7CisJZWxzZSBpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJcmVnaW9uX2lkICY9IH5ETV9TVEFUU19XQUxLX0dST1VQOworCisJcmVnaW9uID0gJmRtcy0+cmVnaW9uc1tyZWdpb25faWRdOworCXJldHVybiByZWdpb24tPnRpbWVzY2FsZSA9PSAxOworfQorCitpbnQgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX3ByZWNpc2VfdGltZXN0YW1wcyhjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcykKK3sKKwlyZXR1cm4gZG1fc3RhdHNfZ2V0X3JlZ2lvbl9wcmVjaXNlX3RpbWVzdGFtcHMoZG1zLAorCQkJCQkJICAgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpOworfQorCisvKgorICogSGlzdG9ncmFtIGFjY2VzcyBtZXRob2RzLgorICovCisKK3N0YXRpYyB2b2lkIF9zdW1faGlzdG9ncmFtX2JpbnMoY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oX2FnZ3IsCisJCQkJdWludDY0X3QgcmVnaW9uX2lkLCB1aW50NjRfdCBhcmVhX2lkKQoreworCXN0cnVjdCBkbV9zdGF0c19yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiAqYmluczsKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbWhfY3VyOworCXVpbnQ2NF90IGJpbjsKKworCXJlZ2lvbiA9ICZkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXTsKKwlkbWhfY3VyID0gcmVnaW9uLT5jb3VudGVyc1thcmVhX2lkXS5oaXN0b2dyYW07CisJYmlucyA9IGRtaF9hZ2dyLT5iaW5zOworCisJZm9yIChiaW4gPSAwOyBiaW4gPCBkbWhfYWdnci0+bnJfYmluczsgYmluKyspCisJCWJpbnNbYmluXS5jb3VudCArPSBkbWhfY3VyLT5iaW5zW2Jpbl0uY291bnQ7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gYWdncmVnYXRlIGhpc3RvZ3JhbSBmb3IgYSBzdWItZGl2aWRlZCByZWdpb24gb3IgYSBncm91cC4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9oaXN0b2dyYW0gKl9hZ2dyZWdhdGVfaGlzdG9ncmFtKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCQkJIHVpbnQ2NF90IHJlZ2lvbl9pZCwKKwkJCQkJCSB1aW50NjRfdCBhcmVhX2lkKQoreworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaF9hZ2dyLCAqZG1oX2N1ciwgKipkbWhfY2FjaGVwOworCWludCBiaW4sIG5yX2JpbnMsIGdyb3VwID0gMTsKKwl1aW50NjRfdCBncm91cF9pZDsKKwlzaXplX3QgaGlzdF9zaXplOworCisJaWYgKGFyZWFfaWQgPT0gRE1fU1RBVFNfV0FMS19SRUdJT04pIHsKKwkJLyogcmVnaW9uIGFnZ3JlZ2F0aW9uICovCisJCWdyb3VwID0gMDsKKwkJaWYgKCFfc3RhdHNfcmVnaW9uX3ByZXNlbnQoJmRtcy0+cmVnaW9uc1tyZWdpb25faWRdKSkKKwkJCXJldHVybl9OVUxMOworCisJCWlmICghZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0uYm91bmRzKQorCQkJcmV0dXJuX05VTEw7CisKKwkJaWYgKCFkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5jb3VudGVycykKKwkJCXJldHVybiBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5ib3VuZHM7CisKKwkJaWYgKGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmhpc3RvZ3JhbSkKKwkJCXJldHVybiBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5oaXN0b2dyYW07CisKKwkJZG1oX2N1ciA9IGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmNvdW50ZXJzWzBdLmhpc3RvZ3JhbTsKKwkJZG1oX2NhY2hlcCA9ICZkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5oaXN0b2dyYW07CisJCW5yX2JpbnMgPSBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5ib3VuZHMtPm5yX2JpbnM7CisJfSBlbHNlIHsKKwkJLyogZ3JvdXAgYWdncmVnYXRpb24gKi8KKwkJZ3JvdXBfaWQgPSByZWdpb25faWQ7CisJCWFyZWFfaWQgPSBETV9TVEFUU19XQUxLX0dST1VQOworCQlpZiAoIV9zdGF0c19ncm91cF9pZF9wcmVzZW50KGRtcywgZ3JvdXBfaWQpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJaWYgKCFkbXMtPnJlZ2lvbnNbZ3JvdXBfaWRdLmJvdW5kcykKKwkJCXJldHVybl9OVUxMOworCisJCWlmICghZG1zLT5yZWdpb25zW2dyb3VwX2lkXS5jb3VudGVycykKKwkJCXJldHVybiBkbXMtPnJlZ2lvbnNbZ3JvdXBfaWRdLmJvdW5kczsKKworCQlpZiAoZG1zLT5ncm91cHNbZ3JvdXBfaWRdLmhpc3RvZ3JhbSkKKwkJCXJldHVybiBkbXMtPmdyb3Vwc1tncm91cF9pZF0uaGlzdG9ncmFtOworCisJCWRtaF9jdXIgPSBkbXMtPnJlZ2lvbnNbZ3JvdXBfaWRdLmNvdW50ZXJzWzBdLmhpc3RvZ3JhbTsKKwkJZG1oX2NhY2hlcCA9ICZkbXMtPmdyb3Vwc1tncm91cF9pZF0uaGlzdG9ncmFtOworCQlucl9iaW5zID0gZG1zLT5yZWdpb25zW2dyb3VwX2lkXS5ib3VuZHMtPm5yX2JpbnM7CisJfQorCisJaGlzdF9zaXplID0gc2l6ZW9mKCpkbWhfYWdncikKKwkJICAgICArIG5yX2JpbnMgKiBzaXplb2Yoc3RydWN0IGRtX2hpc3RvZ3JhbV9iaW4pOworCisJaWYgKCEoZG1oX2FnZ3IgPSBkbV9wb29sX3phbGxvYyhkbXMtPmhpc3RfbWVtLCBoaXN0X3NpemUpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBncm91cCBoaXN0b2dyYW0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1oX2FnZ3ItPm5yX2JpbnMgPSBkbWhfY3VyLT5ucl9iaW5zOworCWRtaF9hZ2dyLT5kbXMgPSBkbXM7CisKKwlpZiAoIWdyb3VwKQorCQlfZm9yZWFjaF9yZWdpb25fYXJlYShkbXMsIHJlZ2lvbl9pZCwgYXJlYV9pZCkgeworCQkJX3N1bV9oaXN0b2dyYW1fYmlucyhkbXMsIGRtaF9hZ2dyLCByZWdpb25faWQsIGFyZWFfaWQpOworCQl9CisJZWxzZSB7CisJCV9mb3JlYWNoX2dyb3VwX2FyZWEoZG1zLCBncm91cF9pZCwgcmVnaW9uX2lkLCBhcmVhX2lkKSB7CisJCQlfc3VtX2hpc3RvZ3JhbV9iaW5zKGRtcywgZG1oX2FnZ3IsIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisJCX0KKwl9CisKKwlmb3IgKGJpbiA9IDA7IGJpbiA8IG5yX2JpbnM7IGJpbisrKSB7CisJCWRtaF9hZ2dyLT5zdW0gKz0gZG1oX2FnZ3ItPmJpbnNbYmluXS5jb3VudDsKKwkJZG1oX2FnZ3ItPmJpbnNbYmluXS51cHBlciA9IGRtaF9jdXItPmJpbnNbYmluXS51cHBlcjsKKwl9CisKKwkvKiBjYWNoZSBhZ2dyZWdhdGUgaGlzdG9ncmFtIGZvciBzdWJzZXF1ZW50IGFjY2VzcyAqLworCSpkbWhfY2FjaGVwID0gZG1oX2FnZ3I7CisKKwlyZXR1cm4gZG1oX2FnZ3I7Cit9CisKK3N0cnVjdCBkbV9oaXN0b2dyYW0gKmRtX3N0YXRzX2dldF9oaXN0b2dyYW0oY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMsCisJCQkJCSAgICB1aW50NjRfdCByZWdpb25faWQsCisJCQkJCSAgICB1aW50NjRfdCBhcmVhX2lkKQoreworCWludCBhZ2dyID0gMDsKKworCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpIHsKKwkJcmVnaW9uX2lkID0gZG1zLT5jdXJfcmVnaW9uOworCQlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQkJcmVnaW9uX2lkID0gZG1zLT5jdXJfZ3JvdXA7CisJCQlhZ2dyID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19HUk9VUCkgeworCQlyZWdpb25faWQgJj0gfkRNX1NUQVRTX1dBTEtfR1JPVVA7CisJCWFnZ3IgPSAxOworCX0KKworCWFyZWFfaWQgPSAoYXJlYV9pZCA9PSBETV9TVEFUU19BUkVBX0NVUlJFTlQpCisJCSAgID8gZG1zLT5jdXJfYXJlYSA6IGFyZWFfaWQgOworCisJaWYgKGFyZWFfaWQgPT0gRE1fU1RBVFNfV0FMS19SRUdJT04pCisJCWFnZ3IgPSAxOworCisJaWYgKGFnZ3IpCisJCXJldHVybiBfYWdncmVnYXRlX2hpc3RvZ3JhbShkbXMsIHJlZ2lvbl9pZCwgYXJlYV9pZCk7CisKKwlpZiAocmVnaW9uX2lkICYgRE1fU1RBVFNfV0FMS19SRUdJT04pCisJCXJlZ2lvbl9pZCAmPSB+RE1fU1RBVFNfV0FMS19SRUdJT047CisKKwlpZiAoIWRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmNvdW50ZXJzKQorCQlyZXR1cm4gZG1zLT5yZWdpb25zW3JlZ2lvbl9pZF0uYm91bmRzOworCisJcmV0dXJuIGRtcy0+cmVnaW9uc1tyZWdpb25faWRdLmNvdW50ZXJzW2FyZWFfaWRdLmhpc3RvZ3JhbTsKK30KKworaW50IGRtX2hpc3RvZ3JhbV9nZXRfbnJfYmlucyhjb25zdCBzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbWgpCit7CisJcmV0dXJuIGRtaC0+bnJfYmluczsKK30KKwordWludDY0X3QgZG1faGlzdG9ncmFtX2dldF9iaW5fbG93ZXIoY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oLCBpbnQgYmluKQoreworCXJldHVybiAoIWJpbikgPyAwIDogZG1oLT5iaW5zW2JpbiAtIDFdLnVwcGVyOworfQorCit1aW50NjRfdCBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl91cHBlcihjb25zdCBzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbWgsIGludCBiaW4pCit7CisJcmV0dXJuIGRtaC0+Ymluc1tiaW5dLnVwcGVyOworfQorCit1aW50NjRfdCBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl93aWR0aChjb25zdCBzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbWgsIGludCBiaW4pCit7CisJdWludDY0X3QgdXBwZXIsIGxvd2VyOworCXVwcGVyID0gZG1faGlzdG9ncmFtX2dldF9iaW5fdXBwZXIoZG1oLCBiaW4pOworCWxvd2VyID0gZG1faGlzdG9ncmFtX2dldF9iaW5fbG93ZXIoZG1oLCBiaW4pOworCXJldHVybiAodXBwZXIgLSBsb3dlcik7Cit9CisKK3VpbnQ2NF90IGRtX2hpc3RvZ3JhbV9nZXRfYmluX2NvdW50KGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCwgaW50IGJpbikKK3sKKwlyZXR1cm4gZG1oLT5iaW5zW2Jpbl0uY291bnQ7Cit9CisKK3VpbnQ2NF90IGRtX2hpc3RvZ3JhbV9nZXRfc3VtKGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCkKK3sKKwlyZXR1cm4gZG1oLT5zdW07Cit9CisKK2RtX3BlcmNlbnRfdCBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl9wZXJjZW50KGNvbnN0IHN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaCwKKwkJCQkJICBpbnQgYmluKQoreworCXVpbnQ2NF90IHZhbHVlID0gZG1faGlzdG9ncmFtX2dldF9iaW5fY291bnQoZG1oLCBiaW4pOworCXVpbnQ2NF90IHdpZHRoID0gZG1faGlzdG9ncmFtX2dldF9iaW5fd2lkdGgoZG1oLCBiaW4pOworCXVpbnQ2NF90IHRvdGFsID0gZG1faGlzdG9ncmFtX2dldF9zdW0oZG1oKTsKKworCWRvdWJsZSB2YWwgPSAoZG91YmxlKSB2YWx1ZTsKKworCWlmICghdG90YWwgfHwgIXZhbHVlIHx8ICF3aWR0aCkKKwkJcmV0dXJuIERNX1BFUkNFTlRfMDsKKworCXJldHVybiBkbV9tYWtlX3BlcmNlbnQoKHVpbnQ2NF90KSB2YWwsIHRvdGFsKTsKK30KKworLyoKKyAqIEhpc3RvZ3JhbSBzdHJpbmcgaGVscGVyIGZ1bmN0aW9uczogdXNlZCB0byBjb25zdHJ1Y3QgaGlzdG9ncmFtIGFuZAorICogYmluIGJvdW5kYXJ5IHN0cmluZ3MgZnJvbSBudW1lcmljIGRhdGEuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGFuIHVuYm91bmQgaGlzdG9ncmFtIG9iamVjdCB3aXRoIG5yX2JpbnMgYmlucy4gT25seSB1c2VkCisgKiBmb3IgaGlzdG9ncmFtcyB1c2VkIHRvIGhvbGQgYm91bmRzIHZhbHVlcyBhcyBhcmd1bWVudHMgZm9yIGNhbGxzIHRvCisgKiBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1faGlzdG9ncmFtICpfYWxsb2NfZG1faGlzdG9ncmFtKGludCBucl9iaW5zKQoreworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBkbV9oaXN0b2dyYW0gKyBucl9lbnRyaWVzLiAqLworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBkbV9oaXN0b2dyYW0pICsKKwkJKHVuc2lnbmVkKSBucl9iaW5zICogc2l6ZW9mKHN0cnVjdCBkbV9oaXN0b2dyYW1fYmluKTsKKwlyZXR1cm4gZG1femFsbG9jKHNpemUpOworfQorCisvKgorICogUGFyc2UgYSBoaXN0b2dyYW0gYm91bmRzIHN0cmluZyBzdXBwbGllZCBieSB0aGUgdXNlci4gVGhlIHN0cmluZworICogY29uc2lzdHMgb2YgYSBsaXN0IG9mIG51bWJlcnMsICJuMSxuMixuMywuLi4iIHdpdGggb3B0aW9uYWwgJ25zJywKKyAqICd1cycsICdtcycsIG9yICdzJyB1bml0IHN1ZmZpeGVzLgorICoKKyAqIFRoZSBzY2FsZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0aW1lc2NhbGUgdXNlZCBmb3IgdGhpcyByZWdpb246IG9uZQorICogZm9yIG5hbm9zY2FsZSByZXNvbHV0aW9uIGFuZCBOU0VDX1BFUl9NU0VDIGZvciBtaWxpc2Vjb25kcy4KKyAqCisgKiBPbiByZXR1cm4gYm91bmRzIGNvbnRhaW5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB1aW50NjRfdAorICogaGlzdG9ncmFtIGJvdW5kcyB2YWx1ZXMgZXhwcmVzc2VkIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzLgorICovCitzdHJ1Y3QgZG1faGlzdG9ncmFtICpkbV9oaXN0b2dyYW1fYm91bmRzX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKmJvdW5kc19zdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgX3ZhbGlkX2NoYXJzW10gPSAiMDEyMzQ1Njc4OSxtdW5zIjsKKwl1aW50NjRfdCB0aGlzX3ZhbCA9IDAsIG11bHQgPSAxOworCWNvbnN0IGNoYXIgKmMsICp2LCAqdmFsX3N0YXJ0OworCXN0cnVjdCBkbV9oaXN0b2dyYW1fYmluICpjdXI7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oOworCWludCBucl9lbnRyaWVzID0gMTsKKwljaGFyICplbmRwdHI7CisKKwljID0gYm91bmRzX3N0cjsKKworCS8qIENvdW50IG51bWJlciBvZiBib3VuZHMgZW50cmllcy4gKi8KKwl3aGlsZSgqYykKKwkJaWYgKCooYysrKSA9PSAnLCcpCisJCQlucl9lbnRyaWVzKys7CisKKwljID0gYm91bmRzX3N0cjsKKworCWlmICghKGRtaCA9IF9hbGxvY19kbV9oaXN0b2dyYW0obnJfZW50cmllcykpKQorCQlyZXR1cm5fMDsKKworCWRtaC0+bnJfYmlucyA9IG5yX2VudHJpZXM7CisKKwljdXIgPSBkbWgtPmJpbnM7CisKKwlkbyB7CisJCWZvciAodiA9IF92YWxpZF9jaGFyczsgKnY7IHYrKykKKwkJCWlmICgqYyA9PSAqdikKKwkJCQlicmVhazsKKworCQlpZiAoISp2KSB7CisJCQlzdGFjazsKKwkJCWdvdG8gYmFkY2hhcjsKKwkJfQorCisJCWlmICgqYyA9PSAnLCcpIHsKKwkJCWxvZ19lcnJvcigiRW1wdHkgaGlzdG9ncmFtIGJpbiBub3QgYWxsb3dlZDogJXMiLAorCQkJCSAgYm91bmRzX3N0cik7CisJCQlnb3RvIGJhZDsKKwkJfSBlbHNlIHsKKwkJCXZhbF9zdGFydCA9IGM7CisJCQllbmRwdHIgPSBOVUxMOworCisJCQl0aGlzX3ZhbCA9IHN0cnRvdWxsKHZhbF9zdGFydCwgJmVuZHB0ciwgMTApOworCQkJaWYgKCFlbmRwdHIpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBoaXN0b2dyYW0gYm91bmQuIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQljID0gZW5kcHRyOyAvKiBBZHZhbmNlIHRvIHVuaXRzLCBjb21tYSwgb3IgZW5kLiAqLworCisJCQlpZiAoKmMgPT0gJ3MnKSB7CisJCQkJbXVsdCA9IE5TRUNfUEVSX1NFQzsKKwkJCQljKys7IC8qIEFkdmFuY2Ugb3ZlciAncycuICovCisJCQl9IGVsc2UgaWYgKCooYyArIDEpID09ICdzJykgeworCQkJCWlmICgqYyA9PSAnbScpCisJCQkJCW11bHQgPSBOU0VDX1BFUl9NU0VDOworCQkJCWVsc2UgaWYgKCpjID09ICd1JykKKwkJCQkJbXVsdCA9IE5TRUNfUEVSX1VTRUM7CisJCQkJZWxzZSBpZiAoKmMgPT0gJ24nKQorCQkJCQltdWx0ID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJc3RhY2s7CisJCQkJCWdvdG8gYmFkY2hhcjsKKwkJCQl9CisJCQkJYyArPSAyOyAvKiBBZHZhbmNlIG92ZXIgJ21zJywgJ3VzJywgb3IgJ25zJy4gKi8KKwkJCX0gZWxzZSBpZiAoKmMgPT0gJywnKQorCQkJCWMrKzsKKwkJCWVsc2UgaWYgKCpjKSB7IC8qIEV4cGVjdGVkICcsJyBvciBOVUxMLiAqLworCQkJCXN0YWNrOworCQkJCWdvdG8gYmFkY2hhcjsKKwkJCX0KKworCQkJaWYgKCpjID09ICcsJykKKwkJCQljKys7CisJCQl0aGlzX3ZhbCAqPSBtdWx0OworCQkJKGN1cisrKS0+dXBwZXIgPSB0aGlzX3ZhbDsKKwkJfQorCX0gd2hpbGUgKCpjKTsKKworCS8qIEJvdW5kcyBoaXN0b2dyYW1zIGhhdmUgbm8gb3duZXIuICovCisJZG1oLT5kbXMgPSBOVUxMOworCWRtaC0+cmVnaW9uID0gTlVMTDsKKworCXJldHVybiBkbWg7CisKK2JhZGNoYXI6CisJbG9nX2Vycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoaXN0b2dyYW06ICVjIiwgKmMpOworYmFkOgorCWRtX2ZyZWUoZG1oKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1faGlzdG9ncmFtX2JvdW5kc19mcm9tX3VpbnQ2NChjb25zdCB1aW50NjRfdCAqYm91bmRzKQoreworCWNvbnN0IHVpbnQ2NF90ICplbnRyeSA9IGJvdW5kczsKKwlzdHJ1Y3QgZG1faGlzdG9ncmFtX2JpbiAqY3VyOworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmRtaDsKKwlpbnQgbnJfZW50cmllcyA9IDE7CisKKwlpZiAoIWJvdW5kcyB8fCAhYm91bmRzWzBdKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHBhcnNlIGVtcHR5IGhpc3RvZ3JhbSBib3VuZHMgYXJyYXkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ291bnQgbnVtYmVyIG9mIGJvdW5kcyBlbnRyaWVzLiAqLworCXdoaWxlKCplbnRyeSkKKwkJaWYgKCooKytlbnRyeSkpCisJCQlucl9lbnRyaWVzKys7CisKKwllbnRyeSA9IGJvdW5kczsKKworCWlmICghKGRtaCA9IF9hbGxvY19kbV9oaXN0b2dyYW0obnJfZW50cmllcykpKQorCQlyZXR1cm5fMDsKKworCWRtaC0+bnJfYmlucyA9IG5yX2VudHJpZXM7CisKKwljdXIgPSBkbWgtPmJpbnM7CisKKwl3aGlsZSAoKmVudHJ5KQorCQkoY3VyKyspLT51cHBlciA9ICooZW50cnkrKyk7CisKKwkvKiBCb3VuZHMgaGlzdG9ncmFtcyBoYXZlIG5vIG93bmVyLiAqLworCWRtaC0+ZG1zID0gTlVMTDsKKwlkbWgtPnJlZ2lvbiA9IE5VTEw7CisKKwlyZXR1cm4gZG1oOworfQorCit2b2lkIGRtX2hpc3RvZ3JhbV9ib3VuZHNfZGVzdHJveShzdHJ1Y3QgZG1faGlzdG9ncmFtICpib3VuZHMpCit7CisJaWYgKCFib3VuZHMpCisJCXJldHVybjsKKworCS8qIEJvdW5kcyBoaXN0b2dyYW1zIGFyZSBub3QgYm91bmQgdG8gYW55IGhhbmRsZSBvciByZWdpb24uICovCisJaWYgKGJvdW5kcy0+ZG1zIHx8IGJvdW5kcy0+cmVnaW9uKSB7CisJCWxvZ19lcnJvcigiRnJlZWluZyBpbnZhbGlkIGhpc3RvZ3JhbSBib3VuZHMgcG9pbnRlciAlcC4iLAorCQkJICAodm9pZCAqKSBib3VuZHMpOworCQlzdGFjazsKKwl9CisJLyogZG1fZnJlZSgpIGV4cGVjdHMgYSAodm9pZCAqKS4gKi8KKwlkbV9mcmVlKCh2b2lkICopIGJvdW5kcyk7Cit9CisKKy8qCisgKiBTY2FsZSBhIGJvdW5kcyB2YWx1ZSBkb3duIGZyb20gbmFub3NlY29uZHMgdG8gdGhlIGxhcmdlc3QgcG9zc2libGUKKyAqIHdob2xlIHVuaXQgc3VmZml4LgorICovCitzdGF0aWMgdm9pZCBfc2NhbGVfYm91bmRfdmFsdWVfdG9fc3VmZml4KHVpbnQ2NF90ICpib3VuZCwgY29uc3QgY2hhciAqKnN1ZmZpeCkKK3sKKwkqc3VmZml4ID0gIm5zIjsKKwlpZiAoISgqYm91bmQgJSBOU0VDX1BFUl9TRUMpKSB7CisJCSpib3VuZCAvPSBOU0VDX1BFUl9TRUM7CisJCSpzdWZmaXggPSAicyI7CisJfSBlbHNlIGlmICghKCpib3VuZCAlIE5TRUNfUEVSX01TRUMpKSB7CisJCSpib3VuZCAvPSBOU0VDX1BFUl9NU0VDOworCQkqc3VmZml4ID0gIm1zIjsKKwl9IGVsc2UgaWYgKCEoKmJvdW5kICUgTlNFQ19QRVJfVVNFQykpIHsKKwkJKmJvdW5kIC89IE5TRUNfUEVSX1VTRUM7CisJCSpzdWZmaXggPSAidXMiOworCX0KK30KKworI2RlZmluZSBETV9ISVNUT0dSQU1fQk9VTkRTX01BU0sgMHgzMAorI2RlZmluZSBCT1VORFNfTEVOIDY0CisKK3N0YXRpYyBpbnQgX21ha2VfYm91bmRzX3N0cmluZyhjaGFyICpidWYsIHNpemVfdCBzaXplLCB1aW50NjRfdCBsb3dlciwKKwkJCSAgICAgICB1aW50NjRfdCB1cHBlciwgaW50IGZsYWdzLCBpbnQgd2lkdGgpCit7CisJY2hhciBib3VuZF9idWZbQk9VTkRTX0xFTl07CisJY29uc3QgY2hhciAqbF9zdWZmID0gTlVMTDsKKwljb25zdCBjaGFyICp1X3N1ZmYgPSBOVUxMOworCWNvbnN0IGNoYXIgKnNlcCA9ICIiOworCWludCBib3VuZHMgPSBmbGFncyAmIERNX0hJU1RPR1JBTV9CT1VORFNfTUFTSzsKKworCWlmICghYm91bmRzKQorCQlyZXR1cm5fMDsKKworCSpidWYgPSAnXDAnOworCisJaWYgKGZsYWdzICYgRE1fSElTVE9HUkFNX1NVRkZJWCkgeworCQlfc2NhbGVfYm91bmRfdmFsdWVfdG9fc3VmZml4KCZsb3dlciwgJmxfc3VmZik7CisJCV9zY2FsZV9ib3VuZF92YWx1ZV90b19zdWZmaXgoJnVwcGVyLCAmdV9zdWZmKTsKKwl9IGVsc2UKKwkJbF9zdWZmID0gdV9zdWZmID0gIiI7CisKKwlpZiAoZmxhZ3MgJiBETV9ISVNUT0dSQU1fVkFMVUVTKQorCQlzZXAgPSAiOiI7CisKKwlpZiAoYm91bmRzID4gRE1fSElTVE9HUkFNX0JPVU5EU19MT1dFUikgeworCQkvKiBIYW5kbGUgaW5maW5pdGUgdXBwZXJtb3N0IGJvdW5kLiAqLworCQlpZiAodXBwZXIgPT0gVUlOVDY0X01BWCkgeworCQkJaWYgKGRtX3NucHJpbnRmKGJvdW5kX2J1Ziwgc2l6ZW9mKGJvdW5kX2J1ZiksCisJCQkJCSAiPiIgRk1UdTY0ICIlcyIsIGxvd2VyLCBsX3N1ZmYpIDwgMCkKKwkJCQlnb3RvX291dDsKKwkJCS8qIE9ubHkgZGlzcGxheSBhbiAndXBwZXInIHN0cmluZyBmb3IgZmluYWwgYmluLiAqLworCQkJYm91bmRzID0gRE1fSElTVE9HUkFNX0JPVU5EU19VUFBFUjsKKwkJfSBlbHNlIHsKKwkJCWlmIChkbV9zbnByaW50Zihib3VuZF9idWYsIHNpemVvZihib3VuZF9idWYpLAorCQkJCQkgRk1UdTY0ICIlcyIsIHVwcGVyLCB1X3N1ZmYpIDwgMCkKKwkJCQlnb3RvX291dDsKKwkJfQorCX0gZWxzZSBpZiAoYm91bmRzID09IERNX0hJU1RPR1JBTV9CT1VORFNfTE9XRVIpIHsKKwkJaWYgKChkbV9zbnByaW50Zihib3VuZF9idWYsIHNpemVvZihib3VuZF9idWYpLCBGTVR1NjQgIiVzIiwKKwkJCQkgbG93ZXIsIGxfc3VmZikpIDwgMCkKKwkJCWdvdG9fb3V0OworCX0KKworCXN3aXRjaCAoYm91bmRzKSB7CisJY2FzZSBETV9ISVNUT0dSQU1fQk9VTkRTX0xPV0VSOgorCWNhc2UgRE1fSElTVE9HUkFNX0JPVU5EU19VUFBFUjoKKwkJcmV0dXJuIGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZSwgIiUqcyVzIiwgd2lkdGgsIGJvdW5kX2J1Ziwgc2VwKTsKKwljYXNlIERNX0hJU1RPR1JBTV9CT1VORFNfUkFOR0U6CisJCXJldHVybiBkbV9zbnByaW50ZihidWYsIHNpemUsICBGTVR1NjQgIiVzLSVzJXMiLAorCQkJCSAgIGxvd2VyLCBsX3N1ZmYsIGJvdW5kX2J1Ziwgc2VwKTsKKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQk9VTkRfV0lEVEhfTk9TVUZGSVggMTAgLyogOTk5OTk5OTk5IG5zZWNzICovCisjZGVmaW5lIEJPVU5EX1dJRFRIIDYgLyogYm91bmRzIHN0cmluZyB1cCB0byA5OTk5eHMgKi8KKyNkZWZpbmUgQ09VTlRfV0lEVEggNiAvKiBjb3VudCBzdHJpbmc6IHVwIHRvIDk5OTkgKi8KKyNkZWZpbmUgUEVSQ0VOVF9XSURUSCA2IC8qIHBlcmNlbnQgc3RyaW5nIDogMC4wMC0xMDAuMDAlICovCisjZGVmaW5lIERNX0hJU1RPR1JBTV9WQUxVRVNfTUFTSyAweDA2CisKK2NvbnN0IGNoYXIgKmRtX2hpc3RvZ3JhbV90b19zdHJpbmcoY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oLCBpbnQgYmluLAorCQkJCSAgIGludCB3aWR0aCwgaW50IGZsYWdzKQoreworCWNoYXIgYnVmW0JPVU5EU19MRU5dLCBib3VuZHNfYnVmW0JPVU5EU19MRU5dOworCWludCBtaW53aWR0aCwgYm91bmRzLCB2YWx1ZXMsIHN0YXJ0LCBsYXN0OworCXVpbnQ2NF90IGxvd2VyLCB1cHBlciwgdmFsX3U2NDsgLyogYm91bmRzIG9mIHRoZSBjdXJyZW50IGJpbi4gKi8KKwkvKiBVc2UgdGhlIGhpc3RvZ3JhbSBwb29sIGZvciBzdHJpbmcgYnVpbGRpbmcuICovCisJc3RydWN0IGRtX3Bvb2wgKm1lbSA9IGRtaC0+ZG1zLT5oaXN0X21lbTsKKwljb25zdCBjaGFyICpzZXAgPSAiIjsKKwlpbnQgYm91bmRzX3dpZHRoOworCXNzaXplX3QgbGVuID0gMDsKKwlmbG9hdCB2YWxfZmx0OworCisJYm91bmRzID0gZmxhZ3MgJiBETV9ISVNUT0dSQU1fQk9VTkRTX01BU0s7CisJdmFsdWVzID0gZmxhZ3MgJiBETV9ISVNUT0dSQU1fVkFMVUVTOworCisJaWYgKGJpbiA8IDApIHsKKwkJc3RhcnQgPSAwOworCQlsYXN0ID0gZG1oLT5ucl9iaW5zIC0gMTsKKwl9IGVsc2UKKwkJc3RhcnQgPSBsYXN0ID0gYmluOworCisJbWlud2lkdGggPSB3aWR0aDsKKworCWlmICh3aWR0aCA8IDAgfHwgIXZhbHVlcykKKwkJd2lkdGggPSBtaW53aWR0aCA9IDA7IC8qIG5vIHBhZGRpbmcgKi8KKwllbHNlIGlmIChmbGFncyAmIERNX0hJU1RPR1JBTV9QRVJDRU5UKQorCQl3aWR0aCA9IG1pbndpZHRoID0gKHdpZHRoKSA/IDogUEVSQ0VOVF9XSURUSDsKKwllbHNlIGlmIChmbGFncyAmIERNX0hJU1RPR1JBTV9WQUxVRVMpCisJCXdpZHRoID0gbWlud2lkdGggPSAod2lkdGgpID8gOiBDT1VOVF9XSURUSDsKKworCWlmICh2YWx1ZXMgJiYgIXdpZHRoKQorCQlzZXAgPSAiOiI7CisKKwkvKiBTZXQgYm91bmRzIHN0cmluZyB0byB0aGUgZW1wdHkgc3RyaW5nLiAqLworCWJvdW5kc19idWZbMF0gPSAnXDAnOworCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDY0KSkKKwkJcmV0dXJuXzA7CisKKwlmb3IgKGJpbiA9IHN0YXJ0OyBiaW4gPD0gbGFzdDsgYmluKyspIHsKKwkJaWYgKGJvdW5kcykgeworCQkJLyogRGVmYXVsdCBib3VuZHMgd2lkdGggZGVwZW5kcyBvbiB0aW1lIHN1ZmZpeGVzLiAqLworCQkJYm91bmRzX3dpZHRoID0gKCEoZmxhZ3MgJiBETV9ISVNUT0dSQU1fU1VGRklYKSkKKwkJCQkJPyBCT1VORF9XSURUSF9OT1NVRkZJWAorCQkJCQk6IEJPVU5EX1dJRFRIIDsKKworCQkJYm91bmRzX3dpZHRoID0gKCF3aWR0aCkgPyB3aWR0aCA6IGJvdW5kc193aWR0aDsKKworCQkJbG93ZXIgPSBkbV9oaXN0b2dyYW1fZ2V0X2Jpbl9sb3dlcihkbWgsIGJpbik7CisJCQl1cHBlciA9IGRtX2hpc3RvZ3JhbV9nZXRfYmluX3VwcGVyKGRtaCwgYmluKTsKKworCQkJbGVuID0gc2l6ZW9mKGJvdW5kc19idWYpOworCQkJbGVuID0gX21ha2VfYm91bmRzX3N0cmluZyhib3VuZHNfYnVmLCBsZW4sCisJCQkJCQkgIGxvd2VyLCB1cHBlciwgZmxhZ3MsCisJCQkJCQkgIGJvdW5kc193aWR0aCk7CisJCQkvKgorCQkJICogQ29tbWEgc2VwYXJhdGVzICJib3VuZHM6IHZhbHVlIiBwYWlycyB1bmxlc3MKKwkJCSAqIC0tbm9oZWFkaW5ncyBpcyB1c2VkLgorCQkJICovCisJCQlzZXAgPSAod2lkdGggfHwgIXZhbHVlcykgPyAiLCIgOiAiOiI7CisKKwkJCS8qIEFkanVzdCB3aWR0aCBieSByZWFsIGJvdW5kcyBsZW5ndGggaWYgc2V0LiAqLworCQkJd2lkdGggLT0gKHdpZHRoKSA/IChsZW4gLSAoYm91bmRzX3dpZHRoICsgMSkpIDogMDsKKworCQkJLyogLXZlIHdpZHRoIGluZGljYXRlcyBzcGVjaWZpZWQgd2lkdGggd2FzIG92ZXJydW4uICovCisJCQl3aWR0aCA9ICh3aWR0aCA+IDApID8gd2lkdGggOiAwOworCQl9CisKKwkJaWYgKGJpbiA9PSBsYXN0KQorCQkJc2VwID0gIiI7CisKKwkJaWYgKGZsYWdzICYgRE1fSElTVE9HUkFNX1BFUkNFTlQpIHsKKwkJCWRtX3BlcmNlbnRfdCBwcjsKKwkJCXByID0gZG1faGlzdG9ncmFtX2dldF9iaW5fcGVyY2VudChkbWgsIGJpbik7CisJCQl2YWxfZmx0ID0gZG1fcGVyY2VudF90b19mbG9hdChwcik7CisJCQlsZW4gPSBkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlKi4yZiUlJXMiLAorCQkJCQkgIGJvdW5kc19idWYsIHdpZHRoLCB2YWxfZmx0LCBzZXApOworCQl9IGVsc2UgaWYgKHZhbHVlcykgeworCQkJdmFsX3U2NCA9IGRtaC0+Ymluc1tiaW5dLmNvdW50OworCQkJbGVuID0gZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzJSoiUFJJdTY0IiVzIiwKKwkJCQkJICBib3VuZHNfYnVmLCB3aWR0aCwgdmFsX3U2NCwgc2VwKTsKKwkJfSBlbHNlIGlmIChib3VuZHMpCisJCQlsZW4gPSBkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlcyIsIGJvdW5kc19idWYsCisJCQkJCSAgc2VwKTsKKwkJZWxzZSB7CisJCQkqYnVmID0gJ1wwJzsKKwkJCWxlbiA9IDA7CisJCX0KKworCQlpZiAobGVuIDwgMCkKKwkJCWdvdG9fYmFkOworCisJCXdpZHRoID0gbWlud2lkdGg7IC8qIHJlLXNldCBoaXN0b2dyYW0gY29sdW1uIHdpZHRoLiAqLworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBidWYsIChzaXplX3QpIGxlbikpCisJCQlnb3RvX2JhZDsKKwl9CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKikgZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7CisKK2JhZDoKKwlkbV9wb29sX2FiYW5kb25fb2JqZWN0KG1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBIGxpZ2h0d2VpZ2h0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4dGVudCAocmVnaW9uLCBhcmVhLCBmaWxlCisgKiBzeXN0ZW0gYmxvY2sgb3IgZXh0ZW50IGV0Yy4pLiBBIHRhYmxlIG9mIGV4dGVudHMgY2FuIGJlIHVzZWQKKyAqIHRvIHNvcnQgYW5kIHRvIGVmZmljaWVudGx5IGZpbmQgaG9sZXMgb3Igb3ZlcmxhcHMgYW1vbmcgYSBzZXQKKyAqIG9mIHR1cGxlcyBvZiB0aGUgZm9ybSAoaWQsIHN0YXJ0LCBsZW4pLgorICovCitzdHJ1Y3QgX2V4dGVudCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwl1aW50NjRfdCBpZDsKKwl1aW50NjRfdCBzdGFydDsKKwl1aW50NjRfdCBsZW47Cit9OworCisvKiBsYXN0IGFkZHJlc3MgaW4gYW4gZXh0ZW50ICovCisjZGVmaW5lIF9leHRlbnRfZW5kKGEpICgoYSktPnN0YXJ0ICsgKGEpLT5sZW4gLSAxKQorCisvKiBhIGFuZCBiIG11c3QgYmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgc3RhcnQgc2VjdG9yICovCisjZGVmaW5lIF9leHRlbnRzX292ZXJsYXAoYSwgYikgKF9leHRlbnRfZW5kKGEpID4gKGIpLT5zdGFydCkKKworLyoKKyAqIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBleHRlbnRzIGluIGFzY2VuZGluZyBzdGFydCBvcmRlci4KKyAqLworc3RhdGljIGludCBfZXh0ZW50X3N0YXJ0X2NvbXBhcmUoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworCXN0cnVjdCBfZXh0ZW50ICpyMSwgKnIyOworCXIxID0gKHN0cnVjdCBfZXh0ZW50ICopIHAxOworCXIyID0gKHN0cnVjdCBfZXh0ZW50ICopIHAyOworCisJaWYgKHIxLT5zdGFydCA8IHIyLT5zdGFydCkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHIxLT5zdGFydCA9PSByMi0+c3RhcnQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGF0c19jcmVhdGVfZ3JvdXAoc3RydWN0IGRtX3N0YXRzICpkbXMsIGRtX2JpdHNldF90IHJlZ2lvbnMsCisJCQkgICAgICAgY29uc3QgY2hhciAqYWxpYXMsIHVpbnQ2NF90ICpncm91cF9pZCkKK3sKKwlzdHJ1Y3QgZG1fc3RhdHNfZ3JvdXAgKmdyb3VwOworCSpncm91cF9pZCA9IGRtX2JpdF9nZXRfZmlyc3QocmVnaW9ucyk7CisKKwkvKiBncm91cCBoYXMgbm8gcmVnaW9ucz8gKi8KKwlpZiAoKmdyb3VwX2lkID09IERNX1NUQVRTX0dST1VQX05PVF9QUkVTRU5UKQorCQlyZXR1cm5fMDsKKworCWdyb3VwID0gJmRtcy0+Z3JvdXBzWypncm91cF9pZF07CisKKwlpZiAoZ3JvdXAtPnJlZ2lvbnMpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmV4cGVjdGVkIGdyb3VwIHN0YXRlIHdoaWxlIgorCQkJICAiY3JlYXRpbmcgZ3JvdXAgSUQgYml0bWFwIiBGTVR1NjQsICpncm91cF9pZCk7CisJCXJldHVybiAwOworCX0KKworCWdyb3VwLT5ncm91cF9pZCA9ICpncm91cF9pZDsKKwlncm91cC0+cmVnaW9ucyA9IHJlZ2lvbnM7CisKKwlpZiAoYWxpYXMpCisJCWdyb3VwLT5hbGlhcyA9IGRtX3N0cmR1cChhbGlhcyk7CisJZWxzZQorCQlncm91cC0+YWxpYXMgPSBOVUxMOworCisJLyogZm9yY2UgYW4gdXBkYXRlIG9mIHRoZSBncm91cCB0YWcgc3RvcmVkIGluIGF1eF9kYXRhICovCisJaWYgKCFfc3RhdHNfc2V0X2F1eChkbXMsICpncm91cF9pZCwgZG1zLT5yZWdpb25zWypncm91cF9pZF0uYXV4X2RhdGEpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGF0c19ncm91cF9jaGVja19vdmVybGFwKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICAgIGRtX2JpdHNldF90IHJlZ2lvbnMsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCBleHRfbGlzdCA9IERNX0xJU1RfSEVBRF9JTklUKGV4dF9saXN0KTsKKwlzdHJ1Y3QgX2V4dGVudCAqZXh0LCAqdG1wLCAqbmV4dCwgKm1hcCA9IE5VTEw7CisJc2l6ZV90IG1hcF9zaXplID0gKGRtcy0+bWF4X3JlZ2lvbiArIDEpICogc2l6ZW9mKCptYXApOworCWludCBpID0gMCwgaWQsIG92ZXJsYXAsIG1lcmdlZDsKKworCW1hcCA9IGRtX3Bvb2xfYWxsb2MoZG1zLT5tZW0sIG1hcF9zaXplKTsKKwlpZiAoIW1hcCkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ2lvbiBtYXAiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYnVpbGQgYSB0YWJsZSBvZiBleHRlbnRzIGluIG9yZGVyIG9mIHJlZ2lvbl9pZCAqLworCWZvciAoaWQgPSBkbV9iaXRfZ2V0X2ZpcnN0KHJlZ2lvbnMpOyBpZCA+PSAwOworCSAgICAgaWQgPSBkbV9iaXRfZ2V0X25leHQocmVnaW9ucywgaWQpKSB7CisJCWRtX2xpc3RfaW5pdCgmbWFwW2ldLmxpc3QpOworCQltYXBbaV0uaWQgPSBpZDsKKwkJbWFwW2ldLnN0YXJ0ID0gZG1zLT5yZWdpb25zW2lkXS5zdGFydDsKKwkJbWFwW2ldLmxlbiA9IGRtcy0+cmVnaW9uc1tpZF0ubGVuOworCQlpKys7CisJfQorCisJLyogc29ydCBieSBleHRlbnQuc3RhcnQgKi8KKwlxc29ydChtYXAsIGNvdW50LCBzaXplb2YoKm1hcCksIF9leHRlbnRfc3RhcnRfY29tcGFyZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJZG1fbGlzdF9hZGQoJmV4dF9saXN0LCAmbWFwW2ldLmxpc3QpOworCisJb3ZlcmxhcCA9IDA7CittZXJnZToKKwltZXJnZWQgPSAwOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKGV4dCwgdG1wLCAmZXh0X2xpc3QpIHsKKwkJbmV4dCA9IGRtX2xpc3RfaXRlbShkbV9saXN0X25leHQoJmV4dF9saXN0LCAmZXh0LT5saXN0KSwKKwkJCQkgICAgc3RydWN0IF9leHRlbnQpOworCQlpZiAoIW5leHQpCisJCQljb250aW51ZTsKKworCQlpZiAoX2V4dGVudHNfb3ZlcmxhcChleHQsIG5leHQpKSB7CisJCQlsb2dfd2FybigiV2FybmluZzogcmVnaW9uIElEcyAiIEZNVHU2NCAiIGFuZCAiCisJCQkJIEZNVHU2NCAiIG92ZXJsYXAuIFNvbWUgZXZlbnRzIHdpbGwgYmUgIgorCQkJCSAiY291bnRlZCB0d2ljZS4iLCBleHQtPmlkLCBuZXh0LT5pZCk7CisJCQkvKiBtZXJnZSBsYXJnZXIgZXh0ZW50IGludG8gc21hbGxlciAqLworCQkJaWYgKF9leHRlbnRfZW5kKGV4dCkgPiBfZXh0ZW50X2VuZChuZXh0KSkgeworCQkJCW5leHQtPmlkID0gZXh0LT5pZDsKKwkJCQluZXh0LT5sZW4gPSBleHQtPmxlbjsKKwkJCX0KKwkJCWlmIChleHQtPnN0YXJ0IDwgbmV4dC0+c3RhcnQpCisJCQkJbmV4dC0+c3RhcnQgPSBleHQtPnN0YXJ0OworCQkJZG1fbGlzdF9kZWwoJmV4dC0+bGlzdCk7CisJCQlvdmVybGFwID0gbWVyZ2VkID0gMTsKKwkJfQorCX0KKwkvKiBjb250aW51ZSB1bnRpbCBubyBtZXJnZSBjYW5kaWRhdGVzIHJlbWFpbiAqLworCWlmIChtZXJnZWQpCisJCWdvdG8gbWVyZ2U7CisKKwlkbV9wb29sX2ZyZWUoZG1zLT5tZW0sIG1hcCk7CisJcmV0dXJuIG92ZXJsYXA7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGF0c19jb3B5X2hpc3RvZ3JhbV9ib3VuZHMoc3RydWN0IGRtX2hpc3RvZ3JhbSAqdG8sCisJCQkJCSBzdHJ1Y3QgZG1faGlzdG9ncmFtICpmcm9tKQoreworCXVpbnQ2NF90IGk7CisKKwl0by0+bnJfYmlucyA9IGZyb20tPm5yX2JpbnM7CisKKwlmb3IgKGkgPSAwOyBpIDwgdG8tPm5yX2JpbnM7IGkrKykKKwkJdG8tPmJpbnNbaV0udXBwZXIgPSBmcm9tLT5iaW5zW2ldLnVwcGVyOworfQorCisvKgorICogQ29tcGFyZSBoaXN0b2dyYW0gYm91bmRzIGgxIGFuZCBoMiwgYW5kIHJldHVybiAxIGlmIHRoZXkgbWF0Y2ggKGkuZS4KKyAqIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpbnMgYW5kIGlkZW50aWNhbCBiaW4gYm91bmRhcnkgdmFsdWVzKSwgb3IgMAorICogb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IF9zdGF0c19jaGVja19oaXN0b2dyYW1fYm91bmRzKHN0cnVjdCBkbV9oaXN0b2dyYW0gKmgxLAorCQkJCQkgc3RydWN0IGRtX2hpc3RvZ3JhbSAqaDIpCit7CisJdWludDY0X3QgaTsKKworCWlmICghaDEgfHwgIWgyKQorCQlyZXR1cm4gMDsKKworCWlmIChoMS0+bnJfYmlucyAhPSBoMi0+bnJfYmlucykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaDEtPm5yX2JpbnM7IGkrKykKKwkJaWYgKGgxLT5iaW5zW2ldLnVwcGVyICE9IGgyLT5iaW5zW2ldLnVwcGVyKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgZ3JvdXAgaW4gc3RhdHMgaGFuZGxlIGRtcyBmcm9tIHRoZSBncm91cCBkZXNjcmlwdGlvbgorICogcGFzc2VkIGluIGdyb3VwLgorICovCitpbnQgZG1fc3RhdHNfY3JlYXRlX2dyb3VwKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBjb25zdCBjaGFyICptZW1iZXJzLAorCQkJICBjb25zdCBjaGFyICphbGlhcywgdWludDY0X3QgKmdyb3VwX2lkKQoreworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmNoZWNrID0gTlVMTCwgKmJvdW5kczsKKwlpbnQgaSwgY291bnQgPSAwLCBwcmVjaXNlID0gMDsKKwlkbV9iaXRzZXRfdCByZWdpb25zOworCisJaWYgKCFkbXMtPnJlZ2lvbnMgfHwgIWRtcy0+Z3JvdXBzKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGNyZWF0ZSBncm91cDogbm8gcmVnaW9ucyBmb3VuZC4iKTsKKwkJcmV0dXJuIDA7CisJfTsKKworCWlmICghKHJlZ2lvbnMgPSBkbV9iaXRzZXRfcGFyc2VfbGlzdChtZW1iZXJzLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcGFyc2UgbGlzdDogJyVzJyIsIG1lbWJlcnMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShjaGVjayA9IGRtX3Bvb2xfemFsbG9jKGRtcy0+aGlzdF9tZW0sIHNpemVvZigqY2hlY2spKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBib3VuZHMgY2hlY2siKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogdG9vIG1hbnkgYml0cz8gKi8KKwlpZiAoKCpyZWdpb25zIC0gMSkgPiBkbXMtPm1heF9yZWdpb24pIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIHJlZ2lvbiBJRDogJWQiLCAqcmVnaW9ucyAtIDEpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgZWFjaCByZWdpb25faWQgaW4gdGhlIGJpdG1hcCBtZWV0cyB0aGUgZ3JvdXAKKwkgKiBjb25zdHJhaW50czogcHJlc2VudCwgbm90IGFscmVhZHkgZ3JvdXBlZCwgYW5kIGlmIGFueQorCSAqIGhpc3RvZ3JhbSBpcyBwcmVzZW50IHRoYXQgdGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBib3VuZHMuCisJICovCisJZm9yIChpID0gZG1fYml0X2dldF9maXJzdChyZWdpb25zKTsgaSA+PSAwOworCSAgICAgaSA9IGRtX2JpdF9nZXRfbmV4dChyZWdpb25zLCBpKSkgeworCQlpZiAoIWRtX3N0YXRzX3JlZ2lvbl9wcmVzZW50KGRtcywgaSkpIHsKKwkJCWxvZ19lcnJvcigiUmVnaW9uIElEICVkIGRvZXMgbm90IGV4aXN0IiwgaSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoX3N0YXRzX3JlZ2lvbl9pc19ncm91cGVkKGRtcywgaSkpIHsKKwkJCWxvZ19lcnJvcigiUmVnaW9uIElEICVkIGFscmVhZHkgYSBtZW1iZXIgb2YgZ3JvdXAgSUQgIgorCQkJCSAgRk1UdTY0LCBpLCBkbXMtPnJlZ2lvbnNbaV0uZ3JvdXBfaWQpOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKGRtcy0+cmVnaW9uc1tpXS50aW1lc2NhbGUgPT0gMSkKKwkJCXByZWNpc2UrKzsKKworCQkvKiBjaGVjayBmb3IgbWF0Y2hpbmcgaGlzdG9ncmFtIGJvdW5kcyAqLworCQlib3VuZHMgPSBkbXMtPnJlZ2lvbnNbaV0uYm91bmRzOworCQlpZiAoYm91bmRzICYmICFjaGVjay0+bnJfYmlucykKKwkJCV9zdGF0c19jb3B5X2hpc3RvZ3JhbV9ib3VuZHMoY2hlY2ssIGJvdW5kcyk7CisJCWVsc2UgaWYgKGJvdW5kcykgeworCQkJaWYgKCFfc3RhdHNfY2hlY2tfaGlzdG9ncmFtX2JvdW5kcyhjaGVjaywgYm91bmRzKSkgeworCQkJCWxvZ19lcnJvcigiQWxsIHJlZ2lvbiBoaXN0b2dyYW0gYm91bmRzICIKKwkJCQkJICAibXVzdCBtYXRjaCBleGFjdGx5Iik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKwkJY291bnQrKzsKKwl9CisKKwlpZiAocHJlY2lzZSAmJiAocHJlY2lzZSAhPSBjb3VudCkpCisJCWxvZ193YXJuKCJHcm91cGluZyByZWdpb25zIHdpdGggZGlmZmVyZW50IGNsb2NrIHJlc29sdXRpb246ICIKKwkJCSAicHJlY2lzaW9uIG1heSBiZSBsb3N0Iik7CisKKwlpZiAoIV9zdGF0c19ncm91cF9jaGVja19vdmVybGFwKGRtcywgcmVnaW9ucywgY291bnQpKQorCQlsb2dfaW5mbygiQ3JlYXRpbmcgZ3JvdXAgd2l0aCBvdmVybGFwcGluZyByZWdpb25zIik7CisKKwlpZiAoIV9zdGF0c19jcmVhdGVfZ3JvdXAoZG1zLCByZWdpb25zLCBhbGlhcywgZ3JvdXBfaWQpKQorCQlnb3RvIGJhZDsKKworCWRtX3Bvb2xfZnJlZShkbXMtPmhpc3RfbWVtLCBjaGVjayk7CisJcmV0dXJuIDE7CisKK2JhZDoKKwlkbV9wb29sX2ZyZWUoZG1zLT5oaXN0X21lbSwgY2hlY2spOworCWRtX2JpdHNldF9kZXN0cm95KHJlZ2lvbnMpOworCXJldHVybiAwOworfQorCisvKgorICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZ3JvdXBfaWQuCisgKi8KK2ludCBkbV9zdGF0c19kZWxldGVfZ3JvdXAoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90IGdyb3VwX2lkLAorCQkJICBpbnQgcmVtb3ZlX3JlZ2lvbnMpCit7CisJc3RydWN0IGRtX3N0YXRzX3JlZ2lvbiAqbGVhZGVyOworCWRtX2JpdHNldF90IHJlZ2lvbnM7CisJdWludDY0X3QgaTsKKworCWlmIChncm91cF9pZCA+IGRtcy0+bWF4X3JlZ2lvbikgeworCQlsb2dfZXJyb3IoIkludmFsaWQgZ3JvdXAgSUQ6ICIgRk1UdTY0LCBncm91cF9pZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3N0YXRzX2dyb3VwX2lkX3ByZXNlbnQoZG1zLCBncm91cF9pZCkpIHsKKwkJbG9nX2Vycm9yKCJHcm91cCBJRCAiIEZNVHU2NCAiIGRvZXMgbm90IGV4aXN0IiwgZ3JvdXBfaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWdpb25zID0gZG1zLT5ncm91cHNbZ3JvdXBfaWRdLnJlZ2lvbnM7CisJbGVhZGVyID0gJmRtcy0+cmVnaW9uc1tncm91cF9pZF07CisKKwkvKiBkZWxldGUgYWxsIGJ1dCB0aGUgZ3JvdXAgbGVhZGVyICovCisJZm9yIChpID0gKCpyZWdpb25zIC0gMSk7IGkgPiBsZWFkZXItPnJlZ2lvbl9pZDsgaS0tKSB7CisJCWlmIChkbV9iaXQocmVnaW9ucywgaSkpIHsKKwkJCWRtX2JpdF9jbGVhcihyZWdpb25zLCBpKTsKKwkJCWlmIChyZW1vdmVfcmVnaW9ucyAmJiAhZG1fc3RhdHNfZGVsZXRlX3JlZ2lvbihkbXMsIGkpKQorCQkJCWxvZ193YXJuKCJGYWlsZWQgdG8gZGVsZXRlIHJlZ2lvbiAiCisJCQkJCSBGTVR1NjQgIiBvbiAlcy4iLCBpLCBkbXMtPm5hbWUpOworCQl9CisJfQorCisJLyogY2xlYXIgZ3JvdXAgYW5kIG1hcmsgYXMgbm90IHByZXNlbnQgKi8KKwlfc3RhdHNfY2xlYXJfZ3JvdXBfcmVnaW9ucyhkbXMsIGdyb3VwX2lkKTsKKwlfc3RhdHNfZ3JvdXBfZGVzdHJveSgmZG1zLT5ncm91cHNbZ3JvdXBfaWRdKTsKKworCS8qIGRlbGV0ZSBsZWFkZXIgb3IgY2xlYXIgYXV4X2RhdGEgKi8KKwlpZiAocmVtb3ZlX3JlZ2lvbnMpCisJCXJldHVybiBkbV9zdGF0c19kZWxldGVfcmVnaW9uKGRtcywgZ3JvdXBfaWQpOworCWVsc2UgaWYgKCFfc3RhdHNfc2V0X2F1eChkbXMsIGdyb3VwX2lkLCBsZWFkZXItPmF1eF9kYXRhKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordWludDY0X3QgZG1fc3RhdHNfZ2V0X2dyb3VwX2lkKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCByZWdpb25faWQpCit7CisJcmVnaW9uX2lkID0gKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCkKKwkJICAgICA/IGRtcy0+Y3VyX3JlZ2lvbiA6IHJlZ2lvbl9pZDsKKworCWlmIChyZWdpb25faWQgJiBETV9TVEFUU19XQUxLX0dST1VQKSB7CisJCWlmIChyZWdpb25faWQgPT0gRE1fU1RBVFNfV0FMS19HUk9VUCkKKwkJCXJldHVybiBkbXMtPmN1cl9ncm91cDsKKwkJZWxzZQorCQkJcmV0dXJuIHJlZ2lvbl9pZCAmIH5ETV9TVEFUU19XQUxLX0dST1VQOworCX0KKworCWlmIChyZWdpb25faWQgJiBETV9TVEFUU19XQUxLX1JFR0lPTikKKwkJcmVnaW9uX2lkICY9IH5ETV9TVEFUU19XQUxLX1JFR0lPTjsKKworCXJldHVybiBkbXMtPnJlZ2lvbnNbcmVnaW9uX2lkXS5ncm91cF9pZDsKK30KKworaW50IGRtX3N0YXRzX2dldF9ncm91cF9kZXNjcmlwdG9yKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgdWludDY0X3QgZ3JvdXBfaWQsIGNoYXIgKipidWYpCit7CisJZG1fYml0c2V0X3QgcmVnaW9ucyA9IGRtcy0+Z3JvdXBzW2dyb3VwX2lkXS5yZWdpb25zOworCXNpemVfdCBidWZsZW47CisKKwlidWZsZW4gPSBfc3RhdHNfZ3JvdXBfdGFnX2xlbihkbXMsIHJlZ2lvbnMpOworCisJKmJ1ZiA9IGRtX3Bvb2xfYWxsb2MoZG1zLT5tZW0sIGJ1Zmxlbik7CisJaWYgKCEqYnVmKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVnaW9ucyBzdHJpbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfc3RhdHNfZ3JvdXBfdGFnX2ZpbGwoZG1zLCByZWdpb25zLCAqYnVmLCBidWZsZW4pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisjaWZkZWYgSEFWRV9MSU5VWF9GSUVNQVBfSAorLyoKKyAqIEdyb3VwIGEgdGFibGUgb2YgcmVnaW9uX2lkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlbnRzIG9mIGEgZmlsZS4KKyAqLworc3RhdGljIGludCBfc3RhdHNfZ3JvdXBfZmlsZV9yZWdpb25zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqcmVnaW9uX2lkcywKKwkJCQkgICAgIHVpbnQ2NF90IGNvdW50LCBjb25zdCBjaGFyICphbGlhcykKK3sKKwlkbV9iaXRzZXRfdCByZWdpb25zID0gZG1fYml0c2V0X2NyZWF0ZShOVUxMLCBkbXMtPm5yX3JlZ2lvbnMpOworCXVpbnQ2NF90IGksIGdyb3VwX2lkID0gRE1fU1RBVFNfR1JPVVBfTk9UX1BSRVNFTlQ7CisJY2hhciAqbWVtYmVycyA9IE5VTEw7CisJaW50IGJ1ZmxlbjsKKworCWlmICghcmVnaW9ucykgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBtYXAgZmlsZTogZmFpbGVkIHRvIGFsbG9jYXRlIGdyb3VwIGJpdG1hcC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWRtX2JpdF9zZXQocmVnaW9ucywgcmVnaW9uX2lkc1tpXSk7CisKKwlidWZsZW4gPSBfc3RhdHNfZ3JvdXBfdGFnX2xlbihkbXMsIHJlZ2lvbnMpOworCW1lbWJlcnMgPSBkbV9tYWxsb2MoYnVmbGVuKTsKKworCWlmICghbWVtYmVycykgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBtYXAgZmlsZTogZmFpbGVkIHRvIGFsbG9jYXRlIGdyb3VwICIKKwkJCSAgImRlc2NyaXB0b3IuIik7CisJCWRtX2JpdHNldF9kZXN0cm95KHJlZ2lvbnMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9zdGF0c19ncm91cF90YWdfZmlsbChkbXMsIHJlZ2lvbnMsIG1lbWJlcnMsIGJ1ZmxlbikpCisJCWdvdG8gYmFkOworCisJLyoKKwkgKiBvdmVybGFwcyBzaG91bGQgbm90IGJlIHBvc3NpYmxlOiBvdmVybGFwcGluZyBmaWxlIGV4dGVudHMKKwkgKiByZXR1cm5lZCBieSBGSUVNQVAgaW1wbHkgYSBrZXJuZWwgYnVnIG9yIGEgY29ycnVwdCBmcy4KKwkgKi8KKwlpZiAoIV9zdGF0c19ncm91cF9jaGVja19vdmVybGFwKGRtcywgcmVnaW9ucywgY291bnQpKQorCQlsb2dfaW5mbygiQ3JlYXRpbmcgZ3JvdXAgd2l0aCBvdmVybGFwcGluZyByZWdpb25zLiIpOworCisJaWYgKCFfc3RhdHNfY3JlYXRlX2dyb3VwKGRtcywgcmVnaW9ucywgYWxpYXMsICZncm91cF9pZCkpCisJCWdvdG8gYmFkOworCisJZG1fZnJlZShtZW1iZXJzKTsKKwlyZXR1cm4gMTsKK2JhZDoKKwlkbV9iaXRzZXRfZGVzdHJveShyZWdpb25zKTsKKwlkbV9mcmVlKG1lbWJlcnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zdGF0c19hZGRfZXh0ZW50KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCBmaWVtYXBfZXh0ZW50ICpmbV9leHQsCisJCQkgICAgIHVpbnQ2NF90IGlkKQoreworCXN0cnVjdCBfZXh0ZW50IGV4dGVudDsKKworCS8qIGZpbmFsIGFkZHJlc3Mgb2YgbGlzdCBpcyB1bmtub3duICovCisJbWVtc2V0KCZleHRlbnQubGlzdCwgMCwgc2l6ZW9mKGV4dGVudC5saXN0KSk7CisKKwkvKiBjb252ZXJ0IGJ5dGVzIHRvIGRtICg1MTJiKSBzZWN0b3JzICovCisJZXh0ZW50LnN0YXJ0ID0gZm1fZXh0LT5mZV9waHlzaWNhbCA+PiBTRUNUT1JfU0hJRlQ7CisJZXh0ZW50LmxlbiA9IGZtX2V4dC0+ZmVfbGVuZ3RoID4+IFNFQ1RPUl9TSElGVDsKKworCWV4dGVudC5pZCA9IGlkOworCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgJmV4dGVudCwKKwkJCQkgc2l6ZW9mKGV4dGVudCkpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IG1hcCBmaWxlOiBmYWlsZWQgdG8gZ3JvdyBleHRlbnQgbWFwLiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CisKK30KKworLyogdGVzdCBmb3IgdGhlIGJvdW5kYXJ5IG9mIGFuIGV4dGVudCAqLworI2RlZmluZSBleHRfYm91bmRhcnkoZXh0LCBleHAsIGV4cF9kZW5zZSkJXAorKCgoZXh0KS5mZV9sb2dpY2FsICE9IDApICYmCQkJXAorKChleHQpLmZlX3BoeXNpY2FsICE9IChleHApKSAmJgkJCVwKKygoZXh0KS5mZV9waHlzaWNhbCAhPSAoZXhwX2RlbnNlKSkpCisKKy8qCisgKiBSZWFkIHRoZSBleHRlbnRzIG9mIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGludG8gYSB0YWJsZSBvZiBzdHJ1Y3QgX2V4dGVudC4KKyAqCisgKiBCYXNlZCBvbiBlMmZzcHJvZ3MvbWlzYy9maWxlZnJhZy5jOjpmaWxlZnJhZ19maWVtYXAoKS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqLworc3RhdGljIHN0cnVjdCBfZXh0ZW50ICpfc3RhdHNfZ2V0X2V4dGVudHNfZm9yX2ZpbGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgaW50IGZkLAorCQkJCQkJICAgdWludDY0X3QgKmNvdW50KQoreworCXVpbnQ2NF90IGJ1ZltTVEFUU19GSUVfQlVGX0xFTl07CisJc3RydWN0IGZpZW1hcCAqZmllbWFwID0gKHN0cnVjdCBmaWVtYXAgKilidWY7CisJc3RydWN0IGZpZW1hcF9leHRlbnQgKmZtX2V4dCA9ICZmaWVtYXAtPmZtX2V4dGVudHNbMF07CisJc3RydWN0IGZpZW1hcF9leHRlbnQgZm1fbGFzdCA9IHswfTsKKwlzdHJ1Y3QgX2V4dGVudCAqZXh0ZW50czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXhwZWN0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBleHBlY3RlZF9kZW5zZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdW5zaWduZWQgaW50IGksIG51bSA9IDA7CisJaW50IHRvdF9leHRlbnRzID0gMCwgbiA9IDA7CisJaW50IGxhc3QgPSAwOworCWludCByYzsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCS8qIHNwYWNlIGF2YWlsYWJsZSBwZXIgaW9jdGwgKi8KKwkqY291bnQgPSAoc2l6ZW9mKGJ1ZikgLSBzaXplb2YoKmZpZW1hcCkpCisJCSAgLyBzaXplb2Yoc3RydWN0IGZpZW1hcF9leHRlbnQpOworCisJLyogZ3JvdyB0ZW1wb3JhcnkgZXh0ZW50IHRhYmxlIGluIHRoZSBwb29sICovCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIHNpemVvZigqZXh0ZW50cykpKQorCQlyZXR1cm4gTlVMTDsKKworCWZsYWdzIHw9IEZJRU1BUF9GTEFHX1NZTkM7CisKKwlkbyB7CisJCS8qIHN0YXJ0IG9mIGlvY3RsIGxvb3AgLSB6ZXJvIHNpemUgYW5kIHNldCBjb3VudCB0byBidWZzaXplICovCisJCWZpZW1hcC0+Zm1fbGVuZ3RoID0gfjBVTEw7CisJCWZpZW1hcC0+Zm1fZmxhZ3MgPSBmbGFnczsKKwkJZmllbWFwLT5mbV9leHRlbnRfY291bnQgPSAqY291bnQ7CisKKwkJLyogZ2V0IGNvdW50LXNpemVkIGNodW5rIG9mIGV4dGVudHMgKi8KKwkJcmMgPSBpb2N0bChmZCwgRlNfSU9DX0ZJRU1BUCwgKHVuc2lnbmVkIGxvbmcpIGZpZW1hcCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXJjID0gLWVycm5vOworCQkJaWYgKHJjID09IC1FQkFEUikKKwkJCQlsb2dfZXJyX29uY2UoIkZJRU1BUCBmYWlsZWQgd2l0aCB1bmtub3duICIKKwkJCQkJICAgICAiZmxhZ3MgJXguIiwgZmllbWFwLT5mbV9mbGFncyk7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCS8qIElmIDAgZXh0ZW50cyBhcmUgcmV0dXJuZWQsIHRoZW4gbW9yZSBpb2N0bHMgYXJlIG5vdCBuZWVkZWQgKi8KKwkJaWYgKGZpZW1hcC0+Zm1fbWFwcGVkX2V4dGVudHMgPT0gMCkKKwkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBmaWVtYXAtPmZtX21hcHBlZF9leHRlbnRzOyBpKyspIHsKKwkJCWV4cGVjdGVkX2RlbnNlID0gZm1fbGFzdC5mZV9waHlzaWNhbCArCisJCQkJCSBmbV9sYXN0LmZlX2xlbmd0aDsKKwkJCWV4cGVjdGVkID0gZm1fbGFzdC5mZV9waHlzaWNhbCArCisJCQkJICAgZm1fZXh0W2ldLmZlX2xvZ2ljYWwgLSBmbV9sYXN0LmZlX2xvZ2ljYWw7CisJCQlpZiAoZXh0X2JvdW5kYXJ5KGZtX2V4dFtpXSwgZXhwZWN0ZWQsIGV4cGVjdGVkX2RlbnNlKSkgeworCQkJCXRvdF9leHRlbnRzKys7CisJCQkJaWYgKCFfc3RhdHNfYWRkX2V4dGVudChtZW0sIGZtX2V4dCArIGksCisJCQkJCQkgICAgICAgdG90X2V4dGVudHMgLSAxKSkKKwkJCQkJZ290b19iYWQ7CisJCQl9IGVsc2UgeworCQkJCWV4cGVjdGVkID0gMDsKKwkJCQlpZiAoIXRvdF9leHRlbnRzKQorCQkJCQl0b3RfZXh0ZW50cyA9IDE7CisJCQkJaWYgKGZtX2V4dFtpXS5mZV9sb2dpY2FsID09IDApCisJCQkJCWlmICghX3N0YXRzX2FkZF9leHRlbnQobWVtLCBmbV9leHQgKyBpLAorCQkJCQkJCSAgICAgICB0b3RfZXh0ZW50cyAtIDEpKQorCQkJCQkJZ290b19iYWQ7CisJCQl9CisJCQludW0gKz0gdG90X2V4dGVudHM7CisJCQlpZiAoZm1fZXh0W2ldLmZlX2ZsYWdzICYgRklFTUFQX0VYVEVOVF9MQVNUKQorCQkJCWxhc3QgPSAxOworCQkJZm1fbGFzdCA9IGZtX2V4dFtpXTsKKwkJCW4rKzsKKwkJfQorCisJCWZpZW1hcC0+Zm1fc3RhcnQgPSAoZm1fZXh0W2kgLSAxXS5mZV9sb2dpY2FsICsKKwkJCQkgICAgZm1fZXh0W2kgLSAxXS5mZV9sZW5ndGgpOworCX0gd2hpbGUgKGxhc3QgPT0gMCk7CisKKwlpZiAoIXRvdF9leHRlbnRzKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IG1hcCBmaWxlOiBubyBhbGxvY2F0ZWQgZXh0ZW50cy4iKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogcmV0dXJuIHRvdGFsIG51bWJlciBvZiBleHRlbnRzICovCisJKmNvdW50ID0gdG90X2V4dGVudHM7CisJcmV0dXJuIGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworYmFkOgorCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENyZWF0ZSBhIHNldCBvZiByZWdpb25zIHJlcHJlc2VudGluZyB0aGUgZXh0ZW50cyBvZiBhIGZpbGUgYW5kCisgKiByZXR1cm4gYSB0YWJsZSBvZiB1aW50NjRfdCByZWdpb25faWQgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIHJlZ2lvbnMKKyAqIGNyZWF0ZWQgaXMgcmV0dXJuZWQgaW4gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNvdW50ICh3aGljaCBtdXN0IGJlCisgKiBub24tTlVMTCkuCisgKi8KK3N0YXRpYyB1aW50NjRfdCAqX3N0YXRzX2NyZWF0ZV9maWxlX3JlZ2lvbnMoc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBmZCwKKwkJCQkJICAgIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCQkJICAgIGludCBwcmVjaXNlLCB1aW50NjRfdCAqY291bnQpCit7CisJc3RydWN0IF9leHRlbnQgKmV4dGVudHMgPSBOVUxMOworCXVpbnQ2NF90ICpyZWdpb25zID0gTlVMTCwgaTsKKwljaGFyICpoaXN0X2FyZyA9IE5VTEw7CisJc3RydWN0IHN0YXRmcyBmc2J1ZjsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisKKyNpZmRlZiBCVFJGU19TVVBFUl9NQUdJQworCWlmIChmc3RhdGZzKGZkLCAmZnNidWYpKSB7CisJCWxvZ19lcnJvcigiZnN0YXRmcyBmYWlsZWQgZm9yIGZkICVkIiwgZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZnNidWYuZl90eXBlID09IEJUUkZTX1NVUEVSX01BR0lDKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IG1hcCBmaWxlOiBidHJmcyBkb2VzIG5vdCBwcm92aWRlICIKKwkJCSAgInBoeXNpY2FsIEZJRU1BUCBleHRlbnQgZGF0YS4iKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoZnN0YXQoZmQsICZidWYpKSB7CisJCWxvZ19lcnJvcigiZnN0YXQgZmFpbGVkIGZvciBmZCAlZCIsIGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoYnVmLnN0X21vZGUgJiBTX0lGUkVHKSkgeworCQlsb2dfZXJyb3IoIk5vdCBhIHJlZ3VsYXIgZmlsZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX2lzX2RtX21ham9yKG1ham9yKGJ1Zi5zdF9kZXYpKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBtYXAgZmlsZTogbm90IGEgZGV2aWNlLW1hcHBlciBkZXZpY2UuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGV4dGVudHMgPSBfc3RhdHNfZ2V0X2V4dGVudHNfZm9yX2ZpbGUoZG1zLT5tZW0sIGZkLCBjb3VudCkpKQorCQlyZXR1cm5fMDsKKworICAgICAgICBpZiAoYm91bmRzKSB7CisgICAgICAgICAgICAgICAgLyogX2J1aWxkX2hpc3RvZ3JhbV9hcmcgZW5hYmxlcyBwcmVjaXNlIGlmIHZhbHMgPCAxbXMuICovCisgICAgICAgICAgICAgICAgaWYgKCEoaGlzdF9hcmcgPSBfYnVpbGRfaGlzdG9ncmFtX2FyZyhib3VuZHMsICZwcmVjaXNlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvX291dDsKKyAgICAgICAgfQorCisJLyogbWFrZSBzcGFjZSBmb3IgZW5kLW9mLXRhYmxlIG1hcmtlciAqLworCWlmICghKHJlZ2lvbnMgPSBkbV9tYWxsb2MoKDEgKyAqY291bnQpICogc2l6ZW9mKCpyZWdpb25zKSkpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVnaW9uIElEcy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCWlmICghX3N0YXRzX2NyZWF0ZV9yZWdpb24oZG1zLCByZWdpb25zICsgaSwgZXh0ZW50c1tpXS5zdGFydCwKKwkJCQkJICBleHRlbnRzW2ldLmxlbiwgLTEsIHByZWNpc2UsIGhpc3RfYXJnLAorCQkJCQkgIGRtcy0+cHJvZ3JhbV9pZCwgIiIpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgcmVnaW9uICIgRk1UdTY0ICIgb2YgIgorCQkJCSAgRk1UdTY0ICIgYXQgIiBGTVR1NjQgIi4iLCBpLCAqY291bnQsCisJCQkJICBleHRlbnRzW2ldLnN0YXJ0KTsKKwkJCWdvdG8gb3V0X3JlbW92ZTsKKwkJfQorCX0KKwlyZWdpb25zWypjb3VudF0gPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7CisKKwlpZiAoYm91bmRzKQorCQlkbV9mcmVlKGhpc3RfYXJnKTsKKwlkbV9wb29sX2ZyZWUoZG1zLT5tZW0sIGV4dGVudHMpOworCXJldHVybiByZWdpb25zOworCitvdXRfcmVtb3ZlOgorCS8qIGNsZWFuIHVwIHJlZ2lvbnMgYWZ0ZXIgY3JlYXRlIGZhaWx1cmUgKi8KKwlmb3IgKC0taTsgaSAhPSBETV9TVEFUU19SRUdJT05fTk9UX1BSRVNFTlQ7IGktLSkgeworCQlpZiAoIWRtX3N0YXRzX2RlbGV0ZV9yZWdpb24oZG1zLCBpKSkKKwkJCWxvZ19lcnJvcigiQ291bGQgbm90IGRlbGV0ZSByZWdpb24gIiBGTVR1NjQgIi4iLCBpKTsKKwl9CisKK291dDoKKwlkbV9wb29sX2ZyZWUoZG1zLT5tZW0sIGV4dGVudHMpOworCWRtX2ZyZWUoaGlzdF9hcmcpOworCWRtX2ZyZWUocmVnaW9ucyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKwordWludDY0X3QgKmRtX3N0YXRzX2NyZWF0ZV9yZWdpb25zX2Zyb21fZmQoc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBmZCwKKwkJCQkJICBpbnQgZ3JvdXAsIGludCBwcmVjaXNlLAorCQkJCQkgIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCQkJICBjb25zdCBjaGFyICphbGlhcykKK3sKKwl1aW50NjRfdCAqcmVnaW9ucywgY291bnQgPSAwOworCisJaWYgKGFsaWFzICYmICFncm91cCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBzZXQgYWxpYXMgd2l0aG91dCBncm91cGluZyByZWdpb25zLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZWdpb25zID0gX3N0YXRzX2NyZWF0ZV9maWxlX3JlZ2lvbnMoZG1zLCBmZCwgYm91bmRzLCBwcmVjaXNlLCAmY291bnQpOworCWlmICghcmVnaW9ucykKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWdyb3VwKQorCQlyZXR1cm4gcmVnaW9uczsKKworCS8qIHJlZnJlc2ggaGFuZGxlICovCisJaWYgKCFkbV9zdGF0c19saXN0KGRtcywgTlVMTCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfc3RhdHNfZ3JvdXBfZmlsZV9yZWdpb25zKGRtcywgcmVnaW9ucywgY291bnQsIGFsaWFzKSkKKwkJZ290b19vdXQ7CisKKwlyZXR1cm4gcmVnaW9uczsKK291dDoKKwlkbV9mcmVlKHJlZ2lvbnMpOworCXJldHVybiBOVUxMOworfQorCisjZWxzZSAvKiBIQVZFX0xJTlVYX0ZJRU1BUCAqLwordWludDY0X3QgKmRtX3N0YXRzX2NyZWF0ZV9yZWdpb25zX2Zyb21fZmQoc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBmZCwKKwkJCQkJICBpbnQgZ3JvdXAsIGludCBwcmVjaXNlLAorCQkJCQkgIHN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcywKKwkJCQkJICBjb25zdCBjaGFyICphbGlhcykKK3sKKwlsb2dfZXJyb3IoIkZpbGUgbWFwcGluZyByZXF1aXJlcyBGSUVNQVAgaW9jdGwgc3VwcG9ydC4iKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBIQVZFX0xJTlVYX0ZJRU1BUCAqLworCisvKgorICogQmFja3dhcmQgY29tcGF0aWJsZSBkbV9zdGF0c19jcmVhdGVfcmVnaW9uKCkgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEtlZXAgdGhlc2UgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBhdm9pZCBhZGRpbmcgY2x1dHRlciBhcm91bmQgdGhlCisgKiBjdXJyZW50IGRtX3N0YXRzX2NyZWF0ZV9yZWdpb24oKSB2ZXJzaW9uLgorICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQoraW50IGRtX3N0YXRzX2NyZWF0ZV9yZWdpb25fdjFfMDJfMTA2KHN0cnVjdCBkbV9zdGF0cyAqZG1zLCB1aW50NjRfdCAqcmVnaW9uX2lkLAorCQkJCSAgICAgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbiwgaW50NjRfdCBzdGVwLAorCQkJCSAgICAgaW50IHByZWNpc2UsIGNvbnN0IGNoYXIgKnByb2dyYW1faWQsCisJCQkJICAgICBjb25zdCBjaGFyICphdXhfZGF0YSk7CitpbnQgZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbl92MV8wMl8xMDYoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90ICpyZWdpb25faWQsCisJCQkJICAgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBpbnQ2NF90IHN0ZXAsCisJCQkJICAgICBpbnQgcHJlY2lzZSwgY29uc3QgY2hhciAqcHJvZ3JhbV9pZCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmF1eF9kYXRhKQoreworCS8qIDEuMDIuMTA2IGxhY2tzIGhpc3RvZ3JhbSBhcmd1bWVudC4gKi8KKwlyZXR1cm4gX3N0YXRzX2NyZWF0ZV9yZWdpb24oZG1zLCByZWdpb25faWQsIHN0YXJ0LCBsZW4sIHN0ZXAsIHByZWNpc2UsCisJCQkJICAgIE5VTEwsIHByb2dyYW1faWQsIGF1eF9kYXRhKTsKK30KK0RNX0VYUE9SVF9TWU1CT0woZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbiwgMV8wMl8xMDYpOworCitpbnQgZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbl92MV8wMl8xMDQoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90ICpyZWdpb25faWQsCisJCQkJICAgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBpbnQ2NF90IHN0ZXAsCisJCQkJICAgICBjb25zdCBjaGFyICpwcm9ncmFtX2lkLCBjb25zdCBjaGFyICphdXhfZGF0YSk7CitpbnQgZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbl92MV8wMl8xMDQoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90ICpyZWdpb25faWQsCisJCQkJICAgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBpbnQ2NF90IHN0ZXAsCisJCQkJICAgICBjb25zdCBjaGFyICpwcm9ncmFtX2lkLCBjb25zdCBjaGFyICphdXhfZGF0YSkKK3sKKwkvKiAxLjAyLjEwNCBsYWNrcyBoaXN0b2dyYW0gYW5kIHByZWNpc2UgYXJndW1lbnRzLiAqLworCXJldHVybiBfc3RhdHNfY3JlYXRlX3JlZ2lvbihkbXMsIHJlZ2lvbl9pZCwgc3RhcnQsIGxlbiwgc3RlcCwgMCwgTlVMTCwKKwkJCQkgICAgcHJvZ3JhbV9pZCwgYXV4X2RhdGEpOworfQorRE1fRVhQT1JUX1NZTUJPTChkbV9zdGF0c19jcmVhdGVfcmVnaW9uLCAxXzAyXzEwNCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmRtL2xpYmRtLXN0cmluZy5jIGIvbGliZG0vbGliZG0tc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2xpYmRtLXN0cmluZy5jCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8bWF0aC5oPiAgLyogZmFicygpICovCisjaW5jbHVkZSA8ZmxvYXQuaD4gLyogREJMX0VQU0lMT04gKi8KKworLyoKKyAqIGNvbnN1bWUgY2hhcmFjdGVycyB3aGlsZSB0aGV5IG1hdGNoIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBjaGFyICpfY29uc3VtZShjaGFyICpidWZmZXIsIGludCAoKmZuKSAoaW50KSkKK3sKKwl3aGlsZSAoKmJ1ZmZlciAmJiBmbigqYnVmZmVyKSkKKwkJYnVmZmVyKys7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50IF9pc3dvcmQoaW50IGMpCit7CisJcmV0dXJuICFpc3NwYWNlKGMpOworfQorCisvKgorICogU3BsaXQgYnVmZmVyIGludG8gTlVMTC1zZXBhcmF0ZWQgd29yZHMgaW4gYXJndi4KKyAqIFJldHVybnMgbnVtYmVyIG9mIHdvcmRzLgorICovCitpbnQgZG1fc3BsaXRfd29yZHMoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBtYXgsCisJCSAgIHVuc2lnbmVkIGlnbm9yZV9jb21tZW50cyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgYXJnOworCisJZm9yIChhcmcgPSAwOyBhcmcgPCBtYXg7IGFyZysrKSB7CisJCWJ1ZmZlciA9IF9jb25zdW1lKGJ1ZmZlciwgaXNzcGFjZSk7CisJCWlmICghKmJ1ZmZlcikKKwkJCWJyZWFrOworCisJCWFyZ3ZbYXJnXSA9IGJ1ZmZlcjsKKwkJYnVmZmVyID0gX2NvbnN1bWUoYnVmZmVyLCBfaXN3b3JkKTsKKworCQlpZiAoKmJ1ZmZlcikgeworCQkJKmJ1ZmZlciA9ICdcMCc7CisJCQlidWZmZXIrKzsKKwkJfQorCX0KKworCXJldHVybiBhcmc7Cit9CisKKy8qCisgKiBSZW1vdmUgaHlwaGVuIHF1b3RpbmcgZnJvbSBhIGNvbXBvbmVudCBvZiBhIG5hbWUuCisgKiBOVUxMLXRlcm1pbmF0ZXMgdGhlIGNvbXBvbmVudCBhbmQgcmV0dXJucyBzdGFydCBvZiBuZXh0IGNvbXBvbmVudC4KKyAqLworc3RhdGljIGNoYXIgKl91bnF1b3RlKGNoYXIgKmNvbXBvbmVudCkKK3sKKwljaGFyICpjID0gY29tcG9uZW50OworCWNoYXIgKm8gPSBjOworCWNoYXIgKnI7CisKKwl3aGlsZSAoKmMpIHsKKwkJaWYgKCooYyArIDEpKSB7CisJCQlpZiAoKmMgPT0gJy0nKSB7CisJCQkJaWYgKCooYyArIDEpID09ICctJykKKwkJCQkJYysrOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJKm8gPSAqYzsKKwkJbysrOworCQljKys7CisJfQorCisJciA9ICgqYykgPyBjICsgMSA6IGM7CisJKm8gPSAnXDAnOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9zcGxpdF9sdm1fbmFtZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpkbW5hbWUsCisJCSAgICAgIGNoYXIgKip2Z25hbWUsIGNoYXIgKipsdm5hbWUsIGNoYXIgKipsYXllcikKK3sKKwlpZiAoIXZnbmFtZSB8fCAhbHZuYW1lIHx8ICFsYXllcikgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImRtX3NwbGl0X2x2bV9uYW1lOiBGb3JiaWRkZW4gTlVMTCBwYXJhbWV0ZXIgZGV0ZWN0ZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChtZW0gJiYgKCFkbW5hbWUgfHwgISgqdmduYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBkbW5hbWUpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZHVwbGljYXRlIGx2bSBuYW1lLiIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCEqdmduYW1lKSB7CisJCWxvZ19lcnJvcigiTWlzc2luZyBsdm0gbmFtZSBmb3Igc3BsaXQuIik7CisJCXJldHVybiAwOworCX0KKworCV91bnF1b3RlKCpsYXllciA9IF91bnF1b3RlKCpsdm5hbWUgPSBfdW5xdW90ZSgqdmduYW1lKSkpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBPbiBlcnJvciwgdXAgdG8gZ2xpYmMgMi4wLjYsIHNucHJpbnRmIHJldHVybmVkIC0xIGlmIGJ1ZmZlciB3YXMgdG9vIHNtYWxsOworICogRnJvbSBnbGliYyAyLjEgaXQgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgKGV4Y2wuIHRyYWlsaW5nIG51bGwpIHRoYXQgd291bGQgCisgKiBoYXZlIGJlZW4gd3JpdHRlbiBoYWQgdGhlcmUgYmVlbiByb29tLgorICoKKyAqIGRtX3NucHJpbnRmIHJldmVydHMgdG8gdGhlIG9sZCBiZWhhdmlvdXIuCisgKi8KK2ludCBkbV9zbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlpbnQgbjsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJbiA9IHZzbnByaW50ZihidWYsIGJ1ZnNpemUsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlpZiAobiA8IDAgfHwgKCh1bnNpZ25lZCkgbiA+PSBidWZzaXplKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG47Cit9CisKK2NvbnN0IGNoYXIgKmRtX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY29uc3QgY2hhciAqcCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKworCXJldHVybiBwID8gcCArIDEgOiBwYXRoOworfQorCitpbnQgZG1fdmFzcHJpbnRmKGNoYXIgKipyZXN1bHQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcSkKK3sKKwlpbnQgaSwgbiwgc2l6ZSA9IDE2OworCXZhX2xpc3QgYXA7CisJY2hhciAqYnVmID0gZG1fbWFsbG9jKHNpemUpOworCisJKnJlc3VsdCA9IDA7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDs7IGkrKykgeworCQl2YV9jb3B5KGFwLCBhcSk7CisJCW4gPSB2c25wcmludGYoYnVmLCBzaXplLCBmb3JtYXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKworCQlpZiAoMCA8PSBuICYmIG4gPCBzaXplKQorCQkJYnJlYWs7CisKKwkJZG1fZnJlZShidWYpOworCQkvKiBVcCB0byBnbGliYyAyLjAuNiByZXR1cm5zIC0xICovCisJCXNpemUgPSAobiA8IDApID8gc2l6ZSAqIDIgOiBuICsgMTsKKwkJaWYgKCEoYnVmID0gZG1fbWFsbG9jKHNpemUpKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaSA+IDEpIHsKKwkJLyogUmVhbGxvY2F0aW5nIG1vcmUgdGhlbiBvbmNlPyAqLworCQlpZiAoISgqcmVzdWx0ID0gZG1fc3RyZHVwKGJ1ZikpKSB7CisJCQlkbV9mcmVlKGJ1Zik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZG1fZnJlZShidWYpOworCX0gZWxzZQorCQkqcmVzdWx0ID0gYnVmOworCisJcmV0dXJuIG4gKyAxOworfQorCitpbnQgZG1fYXNwcmludGYoY2hhciAqKnJlc3VsdCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJaW50IHI7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlyID0gZG1fdmFzcHJpbnRmKHJlc3VsdCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENvdW50IG9jY3VyZW5jZXMgb2YgJ2MnIGluICdzdHInIHVudGlsIHdlIHJlYWNoIGEgbnVsbCBjaGFyLgorICoKKyAqIFJldHVybnM6CisgKiAgbGVuIC0gaW5jcmVtZW50ZWQgZm9yIGVhY2ggY2hhciB3ZSBlbmNvdW50ZXIuCisgKiAgY291bnQgLSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgJ2MnIGFuZCAnYzInLgorICovCitzdGF0aWMgdm9pZCBfY291bnRfY2hhcnMoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgKmxlbiwgaW50ICpjb3VudCwKKwkJCSBjb25zdCBpbnQgYzEsIGNvbnN0IGludCBjMikKK3sKKwljb25zdCBjaGFyICpwdHI7CisKKwlmb3IgKHB0ciA9IHN0cjsgKnB0cjsgcHRyKyssICgqbGVuKSsrKQorCQlpZiAoKnB0ciA9PSBjMSB8fCAqcHRyID09IGMyKQorCQkJKCpjb3VudCkrKzsKK30KKworLyoKKyAqIENvdW50IG9jY3VycmVuY2VzIG9mICdjJyBpbiAnc3RyJyBvZiBsZW5ndGggJ3NpemUnLgorICoKKyAqIFJldHVybnM6CisgKiAgIE51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAnYycKKyAqLwordW5zaWduZWQgZG1fY291bnRfY2hhcnMoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBjb25zdCBpbnQgYykKK3sKKwlzaXplX3QgaTsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmIChzdHJbaV0gPT0gYykKKwkJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBMZW5ndGggb2Ygc3RyaW5nIGFmdGVyIGVzY2FwaW5nIGRvdWJsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLgorICovCitzaXplX3QgZG1fZXNjYXBlZF9sZW4oY29uc3QgY2hhciAqc3RyKQoreworCXNpemVfdCBsZW4gPSAxOworCWludCBjb3VudCA9IDA7CisKKwlfY291bnRfY2hhcnMoc3RyLCAmbGVuLCAmY291bnQsICdcIicsICdcXCcpOworCisJcmV0dXJuIGNvdW50ICsgbGVuOworfQorCisvKgorICogQ29waWVzIGEgc3RyaW5nLCBxdW90aW5nIG9yaWdfY2hhciB3aXRoIHF1b3RlX2NoYXIuCisgKiBPcHRpb25hbGx5IGFsc28gcXVvdGUgcXVvdGVfY2hhci4KKyAqLworc3RhdGljIHZvaWQgX3F1b3RlX2NoYXJhY3RlcnMoY2hhciAqKm91dCwgY29uc3QgY2hhciAqc3JjLAorCQkJICAgICAgY29uc3QgaW50IG9yaWdfY2hhciwgY29uc3QgaW50IHF1b3RlX2NoYXIsCisJCQkgICAgICBpbnQgcXVvdGVfcXVvdGVfY2hhcikKK3sKKwl3aGlsZSAoKnNyYykgeworCQlpZiAoKnNyYyA9PSBvcmlnX2NoYXIgfHwKKwkJICAgICgqc3JjID09IHF1b3RlX2NoYXIgJiYgcXVvdGVfcXVvdGVfY2hhcikpCisJCQkqKCpvdXQpKysgPSBxdW90ZV9jaGFyOworCisJCSooKm91dCkrKyA9ICpzcmMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF91bnF1b3RlX29uZV9jaGFyYWN0ZXIoY2hhciAqc3JjLCBjb25zdCBjaGFyIG9yaWdfY2hhciwKKwkJCQkgICBjb25zdCBjaGFyIHF1b3RlX2NoYXIpCit7CisJY2hhciAqb3V0OworCWNoYXIgcywgbjsKKworCS8qIE9wdGltaXNlIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgbm8gY2hhbmdlcyBhcmUgbmVlZGVkLiAqLworCXdoaWxlICgocyA9ICpzcmMrKykpIHsKKwkJaWYgKHMgPT0gcXVvdGVfY2hhciAmJgorCQkgICAgKChuID0gKnNyYykgPT0gb3JpZ19jaGFyIHx8IG4gPT0gcXVvdGVfY2hhcikpIHsKKwkJCW91dCA9IHNyYysrOworCQkJKihvdXQgLSAxKSA9IG47CisKKwkJCXdoaWxlICgocyA9ICpzcmMrKykpIHsKKwkJCQlpZiAocyA9PSBxdW90ZV9jaGFyICYmCisJCQkJICAgICgobiA9ICpzcmMpID09IG9yaWdfY2hhciB8fCBuID09IHF1b3RlX2NoYXIpKSB7CisJCQkJCXMgPSBuOworCQkJCQlzcmMrKzsKKwkJCQl9CisJCQkJKm91dCA9IHM7CisJCQkJb3V0Kys7CisJCQl9CisKKwkJCSpvdXQgPSAnXDAnOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKgorICogVW5xdW90ZSBlYWNoIGNoYXJhY3RlciBnaXZlbiBpbiBvcmlnX2NoYXIgYXJyYXkgYW5kIHVucXVvdGUgcXVvdGVfY2hhcgorICogYXMgd2VsbC4gQWxzbyBzYXZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggY2hhcmFjdGVyIGZyb20gb3JpZ19jaGFyCisgKiB0aGF0IHdhcyBmb3VuZCB1bnF1b3RlZCBpbiBhcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkIGFycmF5LiBUaGlzIHdheSB3ZSBjYW4KKyAqIHByb2Nlc3Mgc2V2ZXJhbCBjaGFyYWN0ZXJzIGluIG9uZSBnby4KKyAqLworc3RhdGljIHZvaWQgX3VucXVvdGVfY2hhcmFjdGVycyhjaGFyICpzcmMsIGNvbnN0IGNoYXIgKm9yaWdfY2hhcnMsCisJCQkJc2l6ZV90IG51bV9vcmlnX2NoYXJzLAorCQkJCWNvbnN0IGNoYXIgcXVvdGVfY2hhciwKKwkJCQljaGFyICphcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkW10pCit7CisJY2hhciAqb3V0ID0gc3JjOworCWNoYXIgYywgcywgbjsKKwl1bnNpZ25lZCBpOworCisJd2hpbGUgKChzID0gKnNyYysrKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yaWdfY2hhcnM7IGkrKykgeworCQkJYyA9IG9yaWdfY2hhcnNbaV07CisJCQlpZiAocyA9PSBxdW90ZV9jaGFyICYmCisJCQkgICAgKChuID0gKnNyYykgPT0gYyB8fCBuID09IHF1b3RlX2NoYXIpKSB7CisJCQkJcyA9IG47CisJCQkJc3JjKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYXJyX3N1YnN0cl9maXJzdF91bnF1b3RlZCAmJiAocyA9PSBjKSAmJgorCQkJICAgICFhcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkW2ldKQorCQkJCWFycl9zdWJzdHJfZmlyc3RfdW5xdW90ZWRbaV0gPSBvdXQ7CisJCX07CisJCSpvdXQrKyA9IHM7CisJfQorCisJKm91dCA9ICdcMCc7Cit9CisKKy8qCisgKiBDb3BpZXMgYSBzdHJpbmcsIHF1b3RpbmcgaHlwaGVucyB3aXRoIGh5cGhlbnMuCisgKi8KK3N0YXRpYyB2b2lkIF9xdW90ZV9oeXBoZW5zKGNoYXIgKipvdXQsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlfcXVvdGVfY2hhcmFjdGVycyhvdXQsIHNyYywgJy0nLCAnLScsIDApOworfQorCisvKgorICogPHZnPi08bHY+LTxsYXllcj4gb3IgaWYgIWxheWVyIGp1c3QgPHZnPi08bHY+LgorICovCitjaGFyICpkbV9idWlsZF9kbV9uYW1lKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnZnbmFtZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmx2bmFtZSwgY29uc3QgY2hhciAqbGF5ZXIpCit7CisJc2l6ZV90IGxlbiA9IDE7CisJaW50IGh5cGhlbnMgPSAxOworCWNoYXIgKnIsICpvdXQ7CisKKwlfY291bnRfY2hhcnModmduYW1lLCAmbGVuLCAmaHlwaGVucywgJy0nLCAwKTsKKwlfY291bnRfY2hhcnMobHZuYW1lLCAmbGVuLCAmaHlwaGVucywgJy0nLCAwKTsKKworCWlmIChsYXllciAmJiAqbGF5ZXIpIHsKKwkJX2NvdW50X2NoYXJzKGxheWVyLCAmbGVuLCAmaHlwaGVucywgJy0nLCAwKTsKKwkJaHlwaGVucysrOworCX0KKworCWxlbiArPSBoeXBoZW5zOworCisJaWYgKCEociA9IGRtX3Bvb2xfYWxsb2MobWVtLCBsZW4pKSkgeworCQlsb2dfZXJyb3IoImJ1aWxkX2RtX25hbWU6IEFsbG9jYXRpb24gZmFpbGVkIGZvciAlIiBQUklzaXplX3QKKwkJCSAgIiBmb3IgJXMgJXMgJXMuIiwgbGVuLCB2Z25hbWUsIGx2bmFtZSwgbGF5ZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvdXQgPSByOworCV9xdW90ZV9oeXBoZW5zKCZvdXQsIHZnbmFtZSk7CisJKm91dCsrID0gJy0nOworCV9xdW90ZV9oeXBoZW5zKCZvdXQsIGx2bmFtZSk7CisKKwlpZiAobGF5ZXIgJiYgKmxheWVyKSB7CisJCS8qIE5vIGh5cGhlbiBpZiB0aGUgbGF5ZXIgYmVnaW5zIHdpdGggXyBlLmcuIF9tbG9nICovCisJCWlmICgqbGF5ZXIgIT0gJ18nKQorCQkJKm91dCsrID0gJy0nOworCQlfcXVvdGVfaHlwaGVucygmb3V0LCBsYXllcik7CisJfQorCSpvdXQgPSAnXDAnOworCisJcmV0dXJuIHI7Cit9CisKK2NoYXIgKmRtX2J1aWxkX2RtX3V1aWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqdXVpZF9wcmVmaXgsIGNvbnN0IGNoYXIgKmx2aWQsIGNvbnN0IGNoYXIgKmxheWVyKQoreworCWNoYXIgKmRtdXVpZDsKKwlzaXplX3QgbGVuOworCisJaWYgKCFsYXllcikKKwkJbGF5ZXIgPSAiIjsKKworCWxlbiA9IHN0cmxlbih1dWlkX3ByZWZpeCkgKyBzdHJsZW4obHZpZCkgKyBzdHJsZW4obGF5ZXIpICsgMjsKKworCWlmICghKGRtdXVpZCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBsZW4pKSkgeworCQlsb2dfZXJyb3IoImJ1aWxkX2RtX25hbWU6IEFsbG9jYXRpb24gZmFpbGVkIGZvciAlIiBQUklzaXplX3QKKwkJCSAgIiAlcyAlcy4iLCBsZW4sIGx2aWQsIGxheWVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3ByaW50ZihkbXV1aWQsICIlcyVzJXMlcyIsIHV1aWRfcHJlZml4LCBsdmlkLCAoKmxheWVyKSA/ICItIiA6ICIiLCBsYXllcik7CisKKwlyZXR1cm4gZG11dWlkOworfQorCisvKgorICogQ29waWVzIGEgc3RyaW5nLCBxdW90aW5nIGRvdWJsZSBxdW90ZXMgd2l0aCBiYWNrc2xhc2hlcy4KKyAqLworY2hhciAqZG1fZXNjYXBlX2RvdWJsZV9xdW90ZXMoY2hhciAqb3V0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqYnVmID0gb3V0OworCisJX3F1b3RlX2NoYXJhY3RlcnMoJmJ1Ziwgc3JjLCAnXCInLCAnXFwnLCAxKTsKKwkqYnVmID0gJ1wwJzsKKworCXJldHVybiBvdXQ7Cit9CisKKy8qCisgKiBVbmRvIHF1b3RpbmcgaW4gc2l0dS4KKyAqLwordm9pZCBkbV91bmVzY2FwZV9kb3VibGVfcXVvdGVzKGNoYXIgKnNyYykKK3sKKwlfdW5xdW90ZV9vbmVfY2hhcmFjdGVyKHNyYywgJ1wiJywgJ1xcJyk7Cit9CisKKy8qCisgKiBVbmVzY2FwZSBjb2xvbnMgYW5kICJhdCIgc2lnbnMgaW4gc2l0dSBhbmQgc2F2ZSB0aGUgc3Vic3RyaW5ncworICogc3RhcnRpbmcgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCB1bmVzY2FwZWQgY29sb24gYW5kIHRoZQorICogZmlyc3QgdW5lc2NhcGVkICJhdCIgc2lnbi4gVGhpcyBpcyBub3JtYWxseSB1c2VkIHRvIHVuZXNjYXBlCisgKiBkZXZpY2UgbmFtZXMgdXNlZCBhcyBQVnMuCisgKi8KK3ZvaWQgZG1fdW5lc2NhcGVfY29sb25zX2FuZF9hdF9zaWducyhjaGFyICpzcmMsCisJCQkJICAgICBjaGFyICoqc3Vic3RyX2ZpcnN0X3VucXVvdGVkX2NvbG9uLAorCQkJCSAgICAgY2hhciAqKnN1YnN0cl9maXJzdF91bnF1b3RlZF9hdF9zaWduKQoreworCWNvbnN0IGNoYXIgKm9yaWdfY2hhcnMgPSAiOkAiOworCWNoYXIgKmFycl9zdWJzdHJfZmlyc3RfdW5xdW90ZWRbXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKKworCV91bnF1b3RlX2NoYXJhY3RlcnMoc3JjLCBvcmlnX2NoYXJzLCAyLCAnXFwnLCBhcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkKTsKKworCWlmIChzdWJzdHJfZmlyc3RfdW5xdW90ZWRfY29sb24pCisJCSpzdWJzdHJfZmlyc3RfdW5xdW90ZWRfY29sb24gPSBhcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkWzBdOworCisJaWYgKHN1YnN0cl9maXJzdF91bnF1b3RlZF9hdF9zaWduKQorCQkqc3Vic3RyX2ZpcnN0X3VucXVvdGVkX2F0X3NpZ24gPSBhcnJfc3Vic3RyX2ZpcnN0X3VucXVvdGVkWzFdOworfQorCitpbnQgZG1fc3RybmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworCWlmIChtZW1jY3B5KGRlc3QsIHNyYywgMCwgbikpCisJCXJldHVybiAxOworCisJaWYgKG4gPiAwKQorCQlkZXN0W24gLSAxXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGVzdCBpZiB0aGUgZG91YmxlcyBhcmUgY2xvc2UgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwgKi8KK3N0YXRpYyBpbnQgX2Nsb3NlX2Vub3VnaChkb3VibGUgZDEsIGRvdWJsZSBkMikKK3sKKwlyZXR1cm4gZmFicyhkMSAtIGQyKSA8IERCTF9FUFNJTE9OOworfQorCisjZGVmaW5lIEJBU0VfVU5LTk9XTiAwCisjZGVmaW5lIEJBU0VfU0hBUkVEIDEKKyNkZWZpbmUgQkFTRV8xMDI0IDgKKyNkZWZpbmUgQkFTRV8xMDAwIDE1CisjZGVmaW5lIEJBU0VfU1BFQ0lBTCAyMQorI2RlZmluZSBOVU1fVU5JVF9QUkVGSVhFUyA2CisjZGVmaW5lIE5VTV9TUEVDSUFMIDMKKworI2RlZmluZSBTSVpFX0JVRiAxMjgKKworY29uc3QgY2hhciAqZG1fc2l6ZV90b19zdHJpbmcoc3RydWN0IGRtX3Bvb2wgKm1lbSwgdWludDY0X3Qgc2l6ZSwKKwkJCSAgICAgIGNoYXIgdW5pdF90eXBlLCBpbnQgdXNlX3NpX3VuaXRzLCAKKwkJCSAgICAgIHVpbnQ2NF90IHVuaXRfZmFjdG9yLCBpbnQgaW5jbHVkZV9zdWZmaXgsIAorCQkJICAgICAgZG1fc2l6ZV9zdWZmaXhfdCBzdWZmaXhfdHlwZSkKK3sKKwl1bnNpZ25lZCBiYXNlID0gQkFTRV9VTktOT1dOOworCXVuc2lnbmVkIHM7CisJaW50IHByZWNpc2lvbjsKKwl1aW50NjRfdCBieXRlID0gVUlOVDY0X0MoMCk7CisJdWludDY0X3QgdW5pdHMgPSBVSU5UNjRfQygxMDI0KTsKKwljaGFyICpzaXplX2J1ZiA9IE5VTEw7CisJY2hhciBuZXdfdW5pdF90eXBlID0gJ1wwJywgdW5pdF90eXBlX2J1ZlsyXTsKKwljb25zdCBjaGFyICogY29uc3Qgc2l6ZV9zdHJbXVszXSA9IHsKKwkJLyogQkFTRV9VTktOT1dOICovCisJCXsiICAgICAgICAgIiwgIiAgICIsICIgIn0sCS8qIFswXSAqLworCisJCS8qIEJBU0VfU0hBUkVEIC0gVXNlZCBpZiB1c2Vfc2lfdW5pdHMgPSAwICovCisJCXsiIEV4YWJ5dGUiLCAiIEVCIiwgIkUifSwJLyogWzFdICovCisJCXsiIFBldGFieXRlIiwgIiBQQiIsICJQIn0sCS8qIFsyXSAqLworCQl7IiBUZXJhYnl0ZSIsICIgVEIiLCAiVCJ9LAkvKiBbM10gKi8KKwkJeyIgR2lnYWJ5dGUiLCAiIEdCIiwgIkcifSwJLyogWzRdICovCisJCXsiIE1lZ2FieXRlIiwgIiBNQiIsICJNIn0sCS8qIFs1XSAqLworCQl7IiBLaWxvYnl0ZSIsICIgS0IiLCAiSyJ9LAkvKiBbNl0gKi8KKwkJeyIgQnl0ZSAgICAiLCAiIEIiLCAiQiJ9LAkvKiBbN10gKi8KKworCQkvKiBCQVNFXzEwMjQgLSBVc2VkIGlmIHVzZV9zaV91bml0cyA9IDEgKi8KKwkJeyIgRXhiaWJ5dGUiLCAiIEVpQiIsICJlIn0sCS8qIFs4XSAqLworCQl7IiBQZWJpYnl0ZSIsICIgUGlCIiwgInAifSwJLyogWzldICovCisJCXsiIFRlYmlieXRlIiwgIiBUaUIiLCAidCJ9LAkvKiBbMTBdICovCisJCXsiIEdpYmlieXRlIiwgIiBHaUIiLCAiZyJ9LAkvKiBbMTFdICovCisJCXsiIE1lYmlieXRlIiwgIiBNaUIiLCAibSJ9LAkvKiBbMTJdICovCisJCXsiIEtpYmlieXRlIiwgIiBLaUIiLCAiayJ9LAkvKiBbMTNdICovCisJCXsiIEJ5dGUgICAgIiwgIiBCIiwgImIifSwJLyogWzE0XSAqLworCisJCS8qIEJBU0VfMTAwMCAtIFVzZWQgaWYgdXNlX3NpX3VuaXRzID0gMSAqLworCQl7IiBFeGFieXRlIiwgICIgRUIiLCAiRSJ9LAkvKiBbMTVdICovCisJCXsiIFBldGFieXRlIiwgIiBQQiIsICJQIn0sCS8qIFsxNl0gKi8KKwkJeyIgVGVyYWJ5dGUiLCAiIFRCIiwgIlQifSwJLyogWzE3XSAqLworCQl7IiBHaWdhYnl0ZSIsICIgR0IiLCAiRyJ9LAkvKiBbMThdICovCisJCXsiIE1lZ2FieXRlIiwgIiBNQiIsICJNIn0sCS8qIFsxOV0gKi8KKwkJeyIgS2lsb2J5dGUiLCAiIGtCIiwgIksifSwJLyogWzIwXSAqLworCisJCS8qIEJBU0VfU1BFQ0lBTCAqLworCQl7IiBCeXRlICAgICIsICIgQiAiLCAiQiJ9LAkvKiBbMjFdIChzaGFyZWQgd2l0aCBCQVNFXzEwMDApICovCisJCXsiIFVuaXRzICAgIiwgIiBVbiIsICJVIn0sCS8qIFsyMl0gKi8KKwkJeyIgU2VjdG9ycyAiLCAiIFNlIiwgIlMifSwJLyogWzIzXSAqLworCX07CisKKwlpZiAoIShzaXplX2J1ZiA9IGRtX3Bvb2xfYWxsb2MobWVtLCBTSVpFX0JVRikpKSB7CisJCWxvZ19lcnJvcigibm8gbWVtb3J5IGZvciBzaXplIGRpc3BsYXkgYnVmZmVyIik7CisJCXJldHVybiAiIjsKKwl9CisKKwlpZiAoIXVzZV9zaV91bml0cykgeworCQkvKiBDYXNlLWluZGVwZW5kZW50IG1hdGNoICovCisJCWZvciAocyA9IDA7IHMgPCBOVU1fVU5JVF9QUkVGSVhFUzsgcysrKQorCQkJaWYgKHRvdXBwZXIoKGludCkgdW5pdF90eXBlKSA9PQorCQkJICAgICpzaXplX3N0cltCQVNFX1NIQVJFRCArIHNdWzJdKSB7CisJCQkJYmFzZSA9IEJBU0VfU0hBUkVEOworCQkJCWJyZWFrOworCQkJfQorCX0gZWxzZSB7CisJCS8qIENhc2UtZGVwZW5kZW50IG1hdGNoIGZvciBwb3dlcnMgb2YgMTAwMCAqLworCQlmb3IgKHMgPSAwOyBzIDwgTlVNX1VOSVRfUFJFRklYRVM7IHMrKykKKwkJCWlmICh1bml0X3R5cGUgPT0gKnNpemVfc3RyW0JBU0VfMTAwMCArIHNdWzJdKSB7CisJCQkJYmFzZSA9IEJBU0VfMTAwMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkvKiBDYXNlLWRlcGVuZGVudCBtYXRjaCBmb3IgcG93ZXJzIG9mIDEwMjQgKi8KKwkJaWYgKGJhc2UgPT0gQkFTRV9VTktOT1dOKQorCQkJZm9yIChzID0gMDsgcyA8IE5VTV9VTklUX1BSRUZJWEVTOyBzKyspCisJCQlpZiAodW5pdF90eXBlID09ICpzaXplX3N0cltCQVNFXzEwMjQgKyBzXVsyXSkgeworCQkJCWJhc2UgPSBCQVNFXzEwMjQ7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJaWYgKGJhc2UgPT0gQkFTRV9VTktOT1dOKQorCQkvKiBDaGVjayBmb3Igc3BlY2lhbCB1bml0cyAtIHMsIGIgb3IgdSAqLworCQlmb3IgKHMgPSAwOyBzIDwgTlVNX1NQRUNJQUw7IHMrKykKKwkJCWlmICh0b3VwcGVyKChpbnQpIHVuaXRfdHlwZSkgPT0KKwkJCSAgICAqc2l6ZV9zdHJbQkFTRV9TUEVDSUFMICsgc11bMl0pIHsKKwkJCQliYXNlID0gQkFTRV9TUEVDSUFMOworCQkJCWJyZWFrOworCQkJfQorCisJaWYgKHNpemUgPT0gVUlOVDY0X0MoMCkpIHsKKwkJaWYgKGJhc2UgPT0gQkFTRV9VTktOT1dOKQorCQkJcyA9IDA7CisJCXNwcmludGYoc2l6ZV9idWYsICIwJXMiLCBpbmNsdWRlX3N1ZmZpeCA/IHNpemVfc3RyW2Jhc2UgKyBzXVtzdWZmaXhfdHlwZV0gOiAiIik7CisJCXJldHVybiBzaXplX2J1ZjsKKwl9CisKKwlzaXplICo9IFVJTlQ2NF9DKDUxMik7CisKKwlpZiAoYmFzZSAhPSBCQVNFX1VOS05PV04pIHsKKwkJaWYgKCF1bml0X2ZhY3RvcikgeworCQkJdW5pdF90eXBlX2J1ZlswXSA9IHVuaXRfdHlwZTsKKwkJCXVuaXRfdHlwZV9idWZbMV0gPSAnXDAnOworCQkJaWYgKCEodW5pdF9mYWN0b3IgPSBkbV91bml0c190b19mYWN0b3IoJnVuaXRfdHlwZV9idWZbMF0sICZuZXdfdW5pdF90eXBlLCAxLCBOVUxMKSkgfHwKKwkJCSAgICB1bml0X3R5cGUgIT0gbmV3X3VuaXRfdHlwZSkgeworCQkJCS8qIFRoZSB0d28gZnVuY3Rpb25zIHNob3VsZCBtYXRjaCAoYW5kIHVucmVjb2duaXNlZCB1bml0cyBnZXQgdHJlYXRlZCBsaWtlICdoJykuICovCisJCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbmNvbnNpc3RlbnQgdW5pdHM6ICVjIGFuZCAlYy4iLCB1bml0X3R5cGUsIG5ld191bml0X3R5cGUpOworCQkJCXJldHVybiAiIjsKKwkJCX0KKwkJfQorCQlieXRlID0gdW5pdF9mYWN0b3I7CisJfSBlbHNlIHsKKwkJLyogSHVtYW4tcmVhZGFibGUgc3R5bGUgKi8KKwkJaWYgKHVuaXRfdHlwZSA9PSAnSCcpIHsKKwkJCXVuaXRzID0gVUlOVDY0X0MoMTAwMCk7CisJCQliYXNlID0gQkFTRV8xMDAwOworCQl9IGVsc2UgeworCQkJdW5pdHMgPSBVSU5UNjRfQygxMDI0KTsKKwkJCWJhc2UgPSBCQVNFXzEwMjQ7CisJCX0KKworCQlpZiAoIXVzZV9zaV91bml0cykKKwkJCWJhc2UgPSBCQVNFX1NIQVJFRDsKKworCQlieXRlID0gdW5pdHMgKiB1bml0cyAqIHVuaXRzICogdW5pdHMgKiB1bml0cyAqIHVuaXRzOworCisJCWZvciAocyA9IDA7IHMgPCBOVU1fVU5JVF9QUkVGSVhFUyAmJiBzaXplIDwgYnl0ZTsgcysrKQorCQkJYnl0ZSAvPSB1bml0czsKKworCQlpbmNsdWRlX3N1ZmZpeCA9IDE7CisJfQorCisJLyogRklYTUUgTWFrZSBwcmVjaXNpb24gY29uZmlndXJhYmxlICovCisJc3dpdGNoICh0b3VwcGVyKCpzaXplX3N0cltiYXNlICsgc11bRE1fU0laRV9VTklUXSkpIHsKKwljYXNlICdCJzoKKwljYXNlICdTJzoKKwkJcHJlY2lzaW9uID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJlY2lzaW9uID0gMjsKKwl9CisKKwlzbnByaW50ZihzaXplX2J1ZiwgU0laRV9CVUYgLSAxLCAiJS4qZiVzIiwgcHJlY2lzaW9uLAorCQkgKGRvdWJsZSkgc2l6ZSAvIGJ5dGUsIGluY2x1ZGVfc3VmZml4ID8gc2l6ZV9zdHJbYmFzZSArIHNdW3N1ZmZpeF90eXBlXSA6ICIiKTsKKworCXJldHVybiBzaXplX2J1ZjsKK30KKwordWludDY0X3QgZG1fdW5pdHNfdG9fZmFjdG9yKGNvbnN0IGNoYXIgKnVuaXRzLCBjaGFyICp1bml0X3R5cGUsCisJCQkgICAgaW50IHN0cmljdCwgY29uc3QgY2hhciAqKmVuZHB0cikKK3sKKwljaGFyICpwdHIgPSBOVUxMOworCXVpbnQ2NF90IHY7CisJZG91YmxlIGN1c3RvbV92YWx1ZSA9IDA7CisJdWludDY0X3QgbXVsdGlwbGllcjsKKworCWlmIChlbmRwdHIpCisJCSplbmRwdHIgPSAoY2hhciAqKSB1bml0czsKKworCWlmIChpc2RpZ2l0KCp1bml0cykpIHsKKwkJY3VzdG9tX3ZhbHVlID0gc3RydG9kKHVuaXRzLCAmcHRyKTsKKwkJaWYgKHB0ciA9PSB1bml0cykKKwkJCXJldHVybiAwOworCQl2ID0gKHVpbnQ2NF90KSBzdHJ0b3VsbCh1bml0cywgTlVMTCwgMTApOworCQlpZiAoX2Nsb3NlX2Vub3VnaCgoZG91YmxlKSB2LCBjdXN0b21fdmFsdWUpKQorCQkJY3VzdG9tX3ZhbHVlID0gMDsJLyogVXNlIGludGVnZXIgYXJpdGhtZXRpYyAqLworCQl1bml0cyA9IHB0cjsKKwl9IGVsc2UKKwkJdiA9IDE7CisKKwkvKiBPbmx5IG9uZSB1bml0cyBjaGFyIHBlcm1pdHRlZCBpbiBzdHJpY3QgbW9kZS4gKi8KKwlpZiAoc3RyaWN0ICYmIHVuaXRzWzBdICYmIHVuaXRzWzFdKQorCQlyZXR1cm4gMDsKKworCWlmICh2ID09IDEpCisJCSp1bml0X3R5cGUgPSAqdW5pdHM7CisJZWxzZQorCQkqdW5pdF90eXBlID0gJ1UnOworCisJc3dpdGNoICgqdW5pdHMpIHsKKwljYXNlICdoJzoKKwljYXNlICdIJzoKKwkJbXVsdGlwbGllciA9IHYgPSBVSU5UNjRfQygxKTsKKwkJKnVuaXRfdHlwZSA9ICp1bml0czsKKwkJYnJlYWs7CisJY2FzZSAnYic6CisJY2FzZSAnQic6CisJCW11bHRpcGxpZXIgPSBVSU5UNjRfQygxKTsKKwkJYnJlYWs7CisjZGVmaW5lIEtJTE8gVUlOVDY0X0MoMTAyNCkKKwljYXNlICdzJzoKKwljYXNlICdTJzoKKwkJbXVsdGlwbGllciA9IChLSUxPLzIpOworCQlicmVhazsKKwljYXNlICdrJzoKKwkJbXVsdGlwbGllciA9IEtJTE87CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ2cnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJbXVsdGlwbGllciA9IEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ3AnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ2UnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE8gKiBLSUxPOworCQlicmVhazsKKyN1bmRlZiBLSUxPCisjZGVmaW5lIEtJTE8gVUlOVDY0X0MoMTAwMCkKKwljYXNlICdLJzoKKwkJbXVsdGlwbGllciA9IEtJTE87CisJCWJyZWFrOworCWNhc2UgJ00nOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ0cnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPOworCQlicmVhazsKKwljYXNlICdUJzoKKwkJbXVsdGlwbGllciA9IEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ1AnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE87CisJCWJyZWFrOworCWNhc2UgJ0UnOgorCQltdWx0aXBsaWVyID0gS0lMTyAqIEtJTE8gKiBLSUxPICogS0lMTyAqIEtJTE8gKiBLSUxPOworCQlicmVhazsKKyN1bmRlZiBLSUxPCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVuZHB0cikKKwkJKmVuZHB0ciA9IChjaGFyICopIHVuaXRzICsgMTsKKworCWlmIChfY2xvc2VfZW5vdWdoKGN1c3RvbV92YWx1ZSwgMC4pKQorCQlyZXR1cm4gdiAqIG11bHRpcGxpZXI7IC8qIFVzZSBpbnRlZ2VyIGFyaXRobWV0aWMgKi8KKwllbHNlCisJCXJldHVybiAodWludDY0X3QpIChjdXN0b21fdmFsdWUgKiBtdWx0aXBsaWVyKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL2xpYmRtLXRhcmdldHMuYyBiL2xpYmRtL2xpYmRtLXRhcmdldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTRlMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbGliZG0tdGFyZ2V0cy5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKyNpbmNsdWRlICJsaWJkbS1jb21tb24uaCIKKworaW50IGRtX2dldF9zdGF0dXNfc25hcHNob3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcGFyYW1zLAorCQkJICAgc3RydWN0IGRtX3N0YXR1c19zbmFwc2hvdCAqKnN0YXR1cykKK3sKKwlzdHJ1Y3QgZG1fc3RhdHVzX3NuYXBzaG90ICpzOworCWludCByOworCisJaWYgKCFwYXJhbXMpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2UgaW52YWxpZCBzbmFwc2hvdCBwYXJhbXMuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHMgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZigqcykpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzbmFwc2hvdCBzdGF0dXMgc3RydWN0dXJlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyID0gc3NjYW5mKHBhcmFtcywgRk1UdTY0ICIvIiBGTVR1NjQgIiAiIEZNVHU2NCwKKwkJICAgJnMtPnVzZWRfc2VjdG9ycywgJnMtPnRvdGFsX3NlY3RvcnMsCisJCSAgICZzLT5tZXRhZGF0YV9zZWN0b3JzKTsKKworCWlmIChyID09IDMgfHwgciA9PSAyKQorCQlzLT5oYXNfbWV0YWRhdGFfc2VjdG9ycyA9IChyID09IDMpOworCWVsc2UgaWYgKCFzdHJjbXAocGFyYW1zLCAiSW52YWxpZCIpKQorCQlzLT5pbnZhbGlkID0gMTsKKwllbHNlIGlmICghc3RyY21wKHBhcmFtcywgIk1lcmdlIGZhaWxlZCIpKQorCQlzLT5tZXJnZV9mYWlsZWQgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAocGFyYW1zLCAiT3ZlcmZsb3ciKSkKKwkJcy0+b3ZlcmZsb3cgPSAxOworCWVsc2UgeworCQlkbV9wb29sX2ZyZWUobWVtLCBzKTsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcGFyc2Ugc25hcHNob3QgcGFyYW1zOiAlcy4iLCBwYXJhbXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhdHVzID0gczsKKworCXJldHVybiAxOworfQorCisvKgorICogU2tpcCBuciBmaWVsZHMgZWFjaCBkZWxpbWl0ZWQgYnkgYSBzaW5nbGUgc3BhY2UuCisgKiBGSVhNRSBEb24ndCBhc3N1bWUgc2luZ2xlIHNwYWNlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqX3NraXBfZmllbGRzKGNvbnN0IGNoYXIgKnAsIHVuc2lnbmVkIG5yKQoreworCXdoaWxlIChwICYmIG5yLS0gJiYgKHAgPSBzdHJjaHIocCwgJyAnKSkpCisJCXArKzsKKworCXJldHVybiBwOworfQorCisvKgorICogQ291bnQgbnVtYmVyIG9mIHNpbmdsZS1zcGFjZSBkZWxpbWl0ZWQgZmllbGRzLgorICogTnVtYmVyIG9mIGZpZWxkcyBpcyBudW1iZXIgb2Ygc3BhY2VzIHBsdXMgb25lLgorICovCitzdGF0aWMgdW5zaWduZWQgX2NvdW50X2ZpZWxkcyhjb25zdCBjaGFyICpwKQoreworCXVuc2lnbmVkIG5yID0gMTsKKworCWlmICghcCB8fCAhKnApCisJCXJldHVybiAwOworCisJd2hpbGUgKChwID0gX3NraXBfZmllbGRzKHAsIDEpKSkKKwkJbnIrKzsKKworCXJldHVybiBucjsKK30KKworLyoKKyAqIFZhcmlvdXMgUkFJRCBzdGF0dXMgdmVyc2lvbnMgaW5jbHVkZToKKyAqIFZlcnNpb25zIDwgMS41LjAgKDQgZmllbGRzKToKKyAqICAgPHJhaWRfdHlwZT4gPCNkZXZzPiA8aGVhbHRoX3N0cj4gPHN5bmNfcmF0aW8+CisgKiBWZXJzaW9ucyAxLjUuMCsgICg2IGZpZWxkcyk6CisgKiAgIDxyYWlkX3R5cGU+IDwjZGV2cz4gPGhlYWx0aF9zdHI+IDxzeW5jX3JhdGlvPiA8c3luY19hY3Rpb24+IDxtaXNtYXRjaF9jbnQ+CisgKi8KK2ludCBkbV9nZXRfc3RhdHVzX3JhaWQoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcGFyYW1zLAorCQkgICAgICAgc3RydWN0IGRtX3N0YXR1c19yYWlkICoqc3RhdHVzKQoreworCWludCBpOworCXVuc2lnbmVkIG51bV9maWVsZHM7CisJY29uc3QgY2hhciAqcCwgKnBwLCAqbXNnX2ZpZWxkcyA9ICIiOworCXN0cnVjdCBkbV9zdGF0dXNfcmFpZCAqcyA9IE5VTEw7CisKKwlpZiAoKG51bV9maWVsZHMgPSBfY291bnRfZmllbGRzKHBhcmFtcykpIDwgNCkKKwkJZ290b19iYWQ7CisKKwkvKiBTZWNvbmQgZmllbGQgaG9sZHMgdGhlIGRldmljZSBjb3VudCAqLworCW1zZ19maWVsZHMgPSAiPCNkZXZzPiAiOworCWlmICghKHAgPSBfc2tpcF9maWVsZHMocGFyYW1zLCAxKSkgfHwgKHNzY2FuZihwLCAiJWQiLCAmaSkgIT0gMSkpCisJCWdvdG9fYmFkOworCisJbXNnX2ZpZWxkcyA9ICIiOworCWlmICghKHMgPSBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgZG1fc3RhdHVzX3JhaWQpKSkpCisJCWdvdG9fYmFkOworCisJaWYgKCEocy0+cmFpZF90eXBlID0gZG1fcG9vbF96YWxsb2MobWVtLCBwIC0gcGFyYW1zKSkpCisJCWdvdG9fYmFkOyAvKiBtZW1vcnkgaXMgZnJlZWQgd2hlbiBwb29sIGlzIGRlc3Ryb3llZCAqLworCisJaWYgKCEocy0+ZGV2X2hlYWx0aCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgaSArIDEpKSkgLyogU3BhY2UgZm9yIGhlYWx0aCBjaGFycyAqLworCQlnb3RvX2JhZDsKKworCW1zZ19maWVsZHMgPSAiPHJhaWRfdHlwZT4gPCNkZXZpY2VzPiA8aGVhbHRoX2NoYXJzPiBhbmQgPHN5bmNfcmF0aW8+ICI7CisJaWYgKHNzY2FuZihwYXJhbXMsICIlcyAldSAlcyAlIiBQUkl1NjQgIi8lIiBQUkl1NjQsCisJCSAgIHMtPnJhaWRfdHlwZSwKKwkJICAgJnMtPmRldl9jb3VudCwKKwkJICAgcy0+ZGV2X2hlYWx0aCwKKwkJICAgJnMtPmluc3luY19yZWdpb25zLAorCQkgICAmcy0+dG90YWxfcmVnaW9ucykgIT0gNSkKKwkJZ290b19iYWQ7CisKKwkvKgorCSAqIEFsbCBwcmUtMS41LjAgdmVyc2lvbiBwYXJhbWV0ZXJzIGFyZSByZWFkLiAgTm93IHdlIGNoZWNrCisJICogZm9yIGFkZGl0aW9uYWwgMS41LjArIHBhcmFtZXRlcnMgKGkuZS4gbnVtX2ZpZWxkcyBhdCBsZWFzdCA2KS4KKwkgKgorCSAqIE5vdGUgdGhhdCAnc3luY19hY3Rpb24nIHdpbGwgYmUgTlVMTCAoYW5kIG1pc21hdGNoX2NvdW50CisJICogd2lsbCBiZSAwKSBpZiB0aGUga2VybmVsIHJldHVybnMgYSBwcmUtMS41LjAgc3RhdHVzLgorCSAqLworCWlmIChudW1fZmllbGRzIDwgNikKKwkJZ290byBvdXQ7CisKKwltc2dfZmllbGRzID0gIjxzeW5jX2FjdGlvbj4gYW5kIDxtaXNtYXRjaF9jbnQ+ICI7CisKKwkvKiBTa2lwIHByZS0xLjUuMCBwYXJhbXMgKi8KKwlpZiAoIShwID0gX3NraXBfZmllbGRzKHBhcmFtcywgNCkpIHx8ICEocHAgPSBfc2tpcF9maWVsZHMocCwgMSkpKQorCQlnb3RvX2JhZDsKKworCWlmICghKHMtPnN5bmNfYWN0aW9uID0gZG1fcG9vbF96YWxsb2MobWVtLCBwcCAtIHApKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoc3NjYW5mKHAsICIlcyAlIiBQUkl1NjQsIHMtPnN5bmNfYWN0aW9uLCAmcy0+bWlzbWF0Y2hfY291bnQpICE9IDIpCisJCWdvdG9fYmFkOworCitvdXQ6CisJKnN0YXR1cyA9IHM7CisKKwlyZXR1cm4gMTsKKworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlICVzcmFpZCBwYXJhbXM6ICVzIiwgbXNnX2ZpZWxkcywgcGFyYW1zKTsKKworCWlmIChzKQorCQlkbV9wb29sX2ZyZWUobWVtLCBzKTsKKworCSpzdGF0dXMgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiA8bWV0YWRhdGEgYmxvY2sgc2l6ZT4gPCN1c2VkIG1ldGFkYXRhIGJsb2Nrcz4vPCN0b3RhbCBtZXRhZGF0YSBibG9ja3M+CisgKiA8Y2FjaGUgYmxvY2sgc2l6ZT4gPCN1c2VkIGNhY2hlIGJsb2Nrcz4vPCN0b3RhbCBjYWNoZSBibG9ja3M+CisgKiA8I3JlYWQgaGl0cz4gPCNyZWFkIG1pc3Nlcz4gPCN3cml0ZSBoaXRzPiA8I3dyaXRlIG1pc3Nlcz4KKyAqIDwjZGVtb3Rpb25zPiA8I3Byb21vdGlvbnM+IDwjZGlydHk+IDwjZmVhdHVyZXM+IDxmZWF0dXJlcz4qCisgKiA8I2NvcmUgYXJncz4gPGNvcmUgYXJncz4qIDxwb2xpY3kgbmFtZT4gPCNwb2xpY3kgYXJncz4gPHBvbGljeSBhcmdzPioKKyAqCisgKiBtZXRhZGF0YSBibG9jayBzaXplICAgICAgOiBGaXhlZCBibG9jayBzaXplIGZvciBlYWNoIG1ldGFkYXRhIGJsb2NrIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0b3JzCisgKiAjdXNlZCBtZXRhZGF0YSBibG9ja3MgICAgOiBOdW1iZXIgb2YgbWV0YWRhdGEgYmxvY2tzIHVzZWQKKyAqICN0b3RhbCBtZXRhZGF0YSBibG9ja3MgICA6IFRvdGFsIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MKKyAqIGNhY2hlIGJsb2NrIHNpemUgICAgICAgICA6IENvbmZpZ3VyYWJsZSBibG9jayBzaXplIGZvciB0aGUgY2FjaGUgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWN0b3JzCisgKiAjdXNlZCBjYWNoZSBibG9ja3MgICAgICAgOiBOdW1iZXIgb2YgYmxvY2tzIHJlc2lkZW50IGluIHRoZSBjYWNoZQorICogI3RvdGFsIGNhY2hlIGJsb2NrcyAgICAgIDogVG90YWwgbnVtYmVyIG9mIGNhY2hlIGJsb2NrcworICogI3JlYWQgaGl0cyAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgUkVBRCBiaW8gaGFzIGJlZW4gbWFwcGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY2FjaGUKKyAqICNyZWFkIG1pc3NlcyAgICAgICAgICAgICA6IE51bWJlciBvZiB0aW1lcyBhIFJFQUQgYmlvIGhhcyBiZWVuIG1hcHBlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9yaWdpbgorICogI3dyaXRlIGhpdHMgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgV1JJVEUgYmlvIGhhcyBiZWVuIG1hcHBlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNhY2hlCisgKiAjd3JpdGUgbWlzc2VzICAgICAgICAgICAgOiBOdW1iZXIgb2YgdGltZXMgYSBXUklURSBiaW8gaGFzIGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byB0aGUgb3JpZ2luCisgKiAjZGVtb3Rpb25zICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgdGltZXMgYSBibG9jayBoYXMgYmVlbiByZW1vdmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBjYWNoZQorICogI3Byb21vdGlvbnMgICAgICAgICAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgYmxvY2sgaGFzIGJlZW4gbW92ZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWNoZQorICogI2RpcnR5ICAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgY2FjaGUgdGhhdCBkaWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG9yaWdpbgorICogI2ZlYXR1cmUgYXJncyAgICAgICAgICAgIDogTnVtYmVyIG9mIGZlYXR1cmUgYXJncyB0byBmb2xsb3cKKyAqIGZlYXR1cmUgYXJncyAgICAgICAgICAgICA6ICd3cml0ZXRocm91Z2gnIChvcHRpb25hbCkKKyAqICNjb3JlIGFyZ3MgICAgICAgICAgICAgICA6IE51bWJlciBvZiBjb3JlIGFyZ3VtZW50cyAobXVzdCBiZSBldmVuKQorICogY29yZSBhcmdzICAgICAgICAgICAgICAgIDogS2V5L3ZhbHVlIHBhaXJzIGZvciB0dW5pbmcgdGhlIGNvcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gbWlncmF0aW9uX3RocmVzaG9sZAorICoJCQkgICAgICpwb2xpY3kgbmFtZSAgICAgICAgICAgICAgOiBOYW1lIG9mIHRoZSBwb2xpY3kKKyAqICNwb2xpY3kgYXJncyAgICAgICAgICAgICA6IE51bWJlciBvZiBwb2xpY3kgYXJndW1lbnRzIHRvIGZvbGxvdyAobXVzdCBiZSBldmVuKQorICogcG9saWN5IGFyZ3MgICAgICAgICAgICAgIDogS2V5L3ZhbHVlIHBhaXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIHNlcXVlbnRpYWxfdGhyZXNob2xkCisgKi8KK2ludCBkbV9nZXRfc3RhdHVzX2NhY2hlKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnBhcmFtcywKKwkJCXN0cnVjdCBkbV9zdGF0dXNfY2FjaGUgKipzdGF0dXMpCit7CisJaW50IGksIGZlYXR1cmVfYXJnYzsKKwljaGFyICpzdHI7CisJY29uc3QgY2hhciAqcCwgKnBwOworCXN0cnVjdCBkbV9zdGF0dXNfY2FjaGUgKnM7CisKKwlpZiAoIShzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGRtX3N0YXR1c19jYWNoZSkpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoc3Ryc3RyKHBhcmFtcywgIkVycm9yIikpIHsKKwkJcy0+ZXJyb3IgPSAxOworCQlzLT5mYWlsID0gMTsgLyogIFRoaXMgaXMgYWxzbyBJL08gZmFpbCBzdGF0ZSAqLworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3Ryc3RyKHBhcmFtcywgIkZhaWwiKSkgeworCQlzLT5mYWlsID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUmVhZCBpbiBhcmdzIHRoYXQgaGF2ZSBkZWZpbml0aXZlIHBsYWNlbWVudCAqLworCWlmIChzc2NhbmYocGFyYW1zLAorCQkgICAiICUiIFBSSXUzMgorCQkgICAiICUiIFBSSXU2NCAiLyUiIFBSSXU2NAorCQkgICAiICUiIFBSSXUzMgorCQkgICAiICUiIFBSSXU2NCAiLyUiIFBSSXU2NAorCQkgICAiICUiIFBSSXU2NCAiICUiIFBSSXU2NAorCQkgICAiICUiIFBSSXU2NCAiICUiIFBSSXU2NAorCQkgICAiICUiIFBSSXU2NCAiICUiIFBSSXU2NAorCQkgICAiICUiIFBSSXU2NAorCQkgICAiICVkIiwKKwkJICAgJnMtPm1ldGFkYXRhX2Jsb2NrX3NpemUsCisJCSAgICZzLT5tZXRhZGF0YV91c2VkX2Jsb2NrcywgJnMtPm1ldGFkYXRhX3RvdGFsX2Jsb2NrcywKKwkJICAgJnMtPmJsb2NrX3NpemUsIC8qIEFLQSwgY2h1bmtfc2l6ZSAqLworCQkgICAmcy0+dXNlZF9ibG9ja3MsICZzLT50b3RhbF9ibG9ja3MsCisJCSAgICZzLT5yZWFkX2hpdHMsICZzLT5yZWFkX21pc3NlcywKKwkJICAgJnMtPndyaXRlX2hpdHMsICZzLT53cml0ZV9taXNzZXMsCisJCSAgICZzLT5kZW1vdGlvbnMsICZzLT5wcm9tb3Rpb25zLAorCQkgICAmcy0+ZGlydHlfYmxvY2tzLAorCQkgICAmZmVhdHVyZV9hcmdjKSAhPSAxNCkKKwkJZ290byBiYWQ7CisKKwkvKiBOb3cganVtcCB0byAiZmVhdHVyZXMiIHNlY3Rpb24gKi8KKwlpZiAoIShwID0gX3NraXBfZmllbGRzKHBhcmFtcywgMTIpKSkKKwkJZ290byBiYWQ7CisKKwkvKiBSZWFkIGluIGZlYXR1cmVzICovCisJZm9yIChpID0gMDsgaSA8IGZlYXR1cmVfYXJnYzsgaSsrKSB7CisJCWlmICghc3RybmNtcChwLCAid3JpdGV0aHJvdWdoICIsIDEzKSkKKwkJCXMtPmZlYXR1cmVfZmxhZ3MgfD0gRE1fQ0FDSEVfRkVBVFVSRV9XUklURVRIUk9VR0g7CisJCWVsc2UgaWYgKCFzdHJuY21wKHAsICJ3cml0ZWJhY2sgIiwgMTApKQorCQkJcy0+ZmVhdHVyZV9mbGFncyB8PSBETV9DQUNIRV9GRUFUVVJFX1dSSVRFQkFDSzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgInBhc3N0aHJvdWdoICIsIDExKSkKKwkJCXMtPmZlYXR1cmVfZmxhZ3MgfD0gRE1fQ0FDSEVfRkVBVFVSRV9QQVNTVEhST1VHSDsKKwkJZWxzZQorCQkJbG9nX2Vycm9yKCJVbmtub3duIGZlYXR1cmUgaW4gc3RhdHVzOiAlcyIsIHBhcmFtcyk7CisKKwkJaWYgKCEocCA9IF9za2lwX2ZpZWxkcyhwLCAxKSkpCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBSZWFkIGluIGNvcmVfYXJncy4gKi8KKwlpZiAoc3NjYW5mKHAsICIlZCAiLCAmcy0+Y29yZV9hcmdjKSAhPSAxKQorCQlnb3RvIGJhZDsKKwlpZiAoKHMtPmNvcmVfYXJnYyA+IDApICYmCisJICAgICghKHMtPmNvcmVfYXJndiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKGNoYXIgKikgKiBzLT5jb3JlX2FyZ2MpKSB8fAorCSAgICAgIShwID0gX3NraXBfZmllbGRzKHAsIDEpKSB8fAorCSAgICAgIShzdHIgPSBkbV9wb29sX3N0cmR1cChtZW0sIHApKSB8fAorCSAgICAgIShwID0gX3NraXBfZmllbGRzKHAsICh1bnNpZ25lZCkgcy0+Y29yZV9hcmdjKSkgfHwKKwkgICAgIChkbV9zcGxpdF93b3JkcyhzdHIsIHMtPmNvcmVfYXJnYywgMCwgcy0+Y29yZV9hcmd2KSAhPSBzLT5jb3JlX2FyZ2MpKSkKKwkJZ290byBiYWQ7CisKKwkvKiBSZWFkIGluIHBvbGljeSBhcmdzICovCisJcHAgPSBwOworCWlmICghKHAgPSBfc2tpcF9maWVsZHMocCwgMSkpIHx8CisJICAgICEocy0+cG9saWN5X25hbWUgPSBkbV9wb29sX3phbGxvYyhtZW0sIChwIC0gcHApKSkpCisJCWdvdG8gYmFkOworCWlmIChzc2NhbmYocHAsICIlcyAlZCIsIHMtPnBvbGljeV9uYW1lLCAmcy0+cG9saWN5X2FyZ2MpICE9IDIpCisJCWdvdG8gYmFkOworCWlmIChzLT5wb2xpY3lfYXJnYyAmJgorCSAgICAoIShzLT5wb2xpY3lfYXJndiA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKGNoYXIgKikgKiBzLT5wb2xpY3lfYXJnYykpIHx8CisJICAgICAhKHAgPSBfc2tpcF9maWVsZHMocCwgMSkpIHx8CisJICAgICAhKHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgcCkpIHx8CisJICAgICAoZG1fc3BsaXRfd29yZHMoc3RyLCBzLT5wb2xpY3lfYXJnYywgMCwgcy0+cG9saWN5X2FyZ3YpICE9IHMtPnBvbGljeV9hcmdjKSkpCisJCWdvdG8gYmFkOworCisJLyogVE9ETzogaW1wcm92ZSB0aGlzIHBhcnNlciAqLworCWlmIChzdHJzdHIocCwgIiBybyIpKQorCQlzLT5yZWFkX29ubHkgPSAxOworCisJaWYgKHN0cnN0cihwLCAiIG5lZWRzX2NoZWNrIikpCisJCXMtPm5lZWRzX2NoZWNrID0gMTsKK291dDoKKwkqc3RhdHVzID0gczsKKwlyZXR1cm4gMTsKKworYmFkOgorCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGNhY2hlIHBhcmFtczogJXMiLCBwYXJhbXMpOworCWRtX3Bvb2xfZnJlZShtZW0sIHMpOworCSpzdGF0dXMgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZV90aGluX3Bvb2xfc3RhdHVzKGNvbnN0IGNoYXIgKnBhcmFtcywgc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKnMpCit7CisJaW50IHBvczsKKworCWlmICghcGFyYW1zKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGludmFsaWQgdGhpbiBwYXJhbXMuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJzdHIocGFyYW1zLCAiRXJyb3IiKSkgeworCQlzLT5lcnJvciA9IDE7CisJCXMtPmZhaWwgPSAxOyAvKiAgVGhpcyBpcyBhbHNvIEkvTyBmYWlsIHN0YXRlICovCisJCXJldHVybiAxOworCX0KKworCWlmIChzdHJzdHIocGFyYW1zLCAiRmFpbCIpKSB7CisJCXMtPmZhaWwgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIGhlbGQgbWV0YWRhdGEgcm9vdCAqLworCWlmIChzc2NhbmYocGFyYW1zLCBGTVR1NjQgIiAiIEZNVHU2NCAiLyIgRk1UdTY0ICIgIiBGTVR1NjQgIi8iIEZNVHU2NCAiJW4iLAorCQkgICAmcy0+dHJhbnNhY3Rpb25faWQsCisJCSAgICZzLT51c2VkX21ldGFkYXRhX2Jsb2NrcywKKwkJICAgJnMtPnRvdGFsX21ldGFkYXRhX2Jsb2NrcywKKwkJICAgJnMtPnVzZWRfZGF0YV9ibG9ja3MsCisJCSAgICZzLT50b3RhbF9kYXRhX2Jsb2NrcywgJnBvcykgPCA1KSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIHRoaW4gcG9vbCBwYXJhbXM6ICVzLiIsIHBhcmFtcyk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5ldyBzdGF0dXMgZmxhZ3MgKi8KKwlpZiAoc3Ryc3RyKHBhcmFtcyArIHBvcywgIm5vX2Rpc2NhcmRfcGFzc2Rvd24iKSkKKwkJcy0+ZGlzY2FyZHMgPSBETV9USElOX0RJU0NBUkRTX05PX1BBU1NET1dOOworCWVsc2UgaWYgKHN0cnN0cihwYXJhbXMgKyBwb3MsICJpZ25vcmVfZGlzY2FyZCIpKQorCQlzLT5kaXNjYXJkcyA9IERNX1RISU5fRElTQ0FSRFNfSUdOT1JFOworCWVsc2UgLyogZGVmYXVsdCBkaXNjYXJkX3Bhc3Nkb3duICovCisJCXMtPmRpc2NhcmRzID0gRE1fVEhJTl9ESVNDQVJEU19QQVNTRE9XTjsKKworCS8qIERlZmF1bHQgaXMgJ3dyaXRhYmxlJyAocncpIGRhdGEgKi8KKwlpZiAoc3Ryc3RyKHBhcmFtcyArIHBvcywgIm91dF9vZl9kYXRhX3NwYWNlIikpCisJCXMtPm91dF9vZl9kYXRhX3NwYWNlID0gMTsKKwllbHNlIGlmIChzdHJzdHIocGFyYW1zICsgcG9zLCAicm8gIikpCisJCXMtPnJlYWRfb25seSA9IDE7CisKKwkvKiBEZWZhdWx0IGlzICdxdWV1ZV9pZl9ub19zcGFjZScgKi8KKwlpZiAoc3Ryc3RyKHBhcmFtcyArIHBvcywgImVycm9yX2lmX25vX3NwYWNlIikpCisJCXMtPmVycm9yX2lmX25vX3NwYWNlID0gMTsKKworCWlmIChzdHJzdHIocGFyYW1zICsgcG9zLCAibmVlZHNfY2hlY2siKSkKKwkJcy0+bmVlZHNfY2hlY2sgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9nZXRfc3RhdHVzX3RoaW5fcG9vbChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwYXJhbXMsCisJCQkgICAgc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKipzdGF0dXMpCit7CisJc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wgKnM7CisKKwlpZiAoIShzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGRtX3N0YXR1c190aGluX3Bvb2wpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGhpbl9wb29sIHN0YXR1cyBzdHJ1Y3R1cmUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcGFyc2VfdGhpbl9wb29sX3N0YXR1cyhwYXJhbXMsIHMpKSB7CisJCWRtX3Bvb2xfZnJlZShtZW0sIHMpOworCQlyZXR1cm5fMDsKKwl9CisKKwkqc3RhdHVzID0gczsKKworCXJldHVybiAxOworfQorCitpbnQgZG1fZ2V0X3N0YXR1c190aGluKHN0cnVjdCBkbV9wb29sICptZW0sIGNvbnN0IGNoYXIgKnBhcmFtcywKKwkJICAgICAgIHN0cnVjdCBkbV9zdGF0dXNfdGhpbiAqKnN0YXR1cykKK3sKKwlzdHJ1Y3QgZG1fc3RhdHVzX3RoaW4gKnM7CisKKwlpZiAoIShzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IGRtX3N0YXR1c190aGluKSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHRoaW4gc3RhdHVzIHN0cnVjdHVyZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNocihwYXJhbXMsICctJykpIHsKKwkJLyogbm90aGluZyB0byBwYXJzZSAqLworCX0gZWxzZSBpZiAoc3Ryc3RyKHBhcmFtcywgIkZhaWwiKSkgeworCQlzLT5mYWlsID0gMTsKKwl9IGVsc2UgaWYgKHNzY2FuZihwYXJhbXMsIEZNVHU2NCAiICIgRk1UdTY0LAorCQkgICAmcy0+bWFwcGVkX3NlY3RvcnMsCisJCSAgICZzLT5oaWdoZXN0X21hcHBlZF9zZWN0b3IpICE9IDIpIHsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgcyk7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHBhcnNlIHRoaW4gcGFyYW1zOiAlcy4iLCBwYXJhbXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhdHVzID0gczsKKworCXJldHVybiAxOworfQorCisvKgorICogZG0gY29yZSBwYXJtczoJICAgICAwIDQwOTYwMCBtaXJyb3IKKyAqIE1pcnJvciBjb3JlIHBhcm1zOgkgICAgIDIgMjUzOjQgMjUzOjUgNDAwLzQwMAorICogTmV3LXN0eWxlIGZhaWx1cmUgcGFyYW1zOiAxIEFBCisgKiBOZXctc3R5bGUgbG9nIHBhcmFtczogICAgIDMgY2x1c3RlciAyNTM6MyBBCisgKgkJCSBvciAgMyBkaXNrIDI1MzozIEEKKyAqCQkJIG9yICAxIGNvcmUKKyAqLworI2RlZmluZSBETV9NSVJST1JfTUFYX0lNQUdFUyA4IC8qIGxpbWl0ZWQgYnkga2VybmVsIERNX0tDT1BZRF9NQVhfUkVHSU9OUyAqLworCitpbnQgZG1fZ2V0X3N0YXR1c19taXJyb3Ioc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqcGFyYW1zLAorCQkJIHN0cnVjdCBkbV9zdGF0dXNfbWlycm9yICoqc3RhdHVzKQoreworCXN0cnVjdCBkbV9zdGF0dXNfbWlycm9yICpzOworCWNvbnN0IGNoYXIgKnAsICpwb3MgPSBwYXJhbXM7CisJdW5zaWduZWQgbnVtX2RldnMsIGFyZ2MsIGk7CisJaW50IHVzZWQ7CisKKwlpZiAoIShzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnMpKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2MgbWVtIHBvb2wgdG8gcGFyc2UgbWlycm9yIHN0YXR1cy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNzY2FuZihwb3MsICIldSAlbiIsICZudW1fZGV2cywgJnVzZWQpICE9IDEpCisJCWdvdG9fb3V0OworCXBvcyArPSB1c2VkOworCisJaWYgKG51bV9kZXZzID4gRE1fTUlSUk9SX01BWF9JTUFHRVMpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNb3JlIHRoZW4gIiBETV9UT19TVFJJTkcoRE1fTUlSUk9SX01BWF9JTUFHRVMpCisJCQkgICIgcmVwb3J0ZWQgaW4gbWlycm9yIHN0YXR1cy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEocy0+ZGV2cyA9IGRtX3Bvb2xfYWxsb2MobWVtLCBudW1fZGV2cyAqIHNpemVvZigqKHMtPmRldnMpKSkpKSB7CisJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBkZXZzIGZhaWxlZC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZzOyArK2ksIHBvcyArPSB1c2VkKQorCQlpZiAoc3NjYW5mKHBvcywgIiV1OiV1ICVuIiwKKwkJCSAgICYocy0+ZGV2c1tpXS5tYWpvciksICYocy0+ZGV2c1tpXS5taW5vciksICZ1c2VkKSAhPSAyKQorCQkJZ290b19vdXQ7CisKKwlpZiAoc3NjYW5mKHBvcywgRk1UdTY0ICIvIiBGTVR1NjQgIiVuIiwKKwkJICAgJnMtPmluc3luY19yZWdpb25zLCAmcy0+dG90YWxfcmVnaW9ucywgJnVzZWQpICE9IDIpCisJCWdvdG9fb3V0OworCXBvcyArPSB1c2VkOworCisJaWYgKHNzY2FuZihwb3MsICIldSAlbiIsICZhcmdjLCAmdXNlZCkgIT0gMSkKKwkJZ290b19vdXQ7CisJcG9zICs9IHVzZWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldnMgOyArK2kpCisJCXMtPmRldnNbaV0uaGVhbHRoID0gcG9zW2ldOworCisJaWYgKCEocG9zID0gX3NraXBfZmllbGRzKHBvcywgYXJnYykpKQorCQlnb3RvX291dDsKKworCWlmIChzc2NhbmYocG9zLCAiJXUgJW4iLCAmYXJnYywgJnVzZWQpICE9IDEpCisJCWdvdG9fb3V0OworCXBvcyArPSB1c2VkOworCisJaWYgKGFyZ2MgPT0gMSkgeworCQkvKiBjb3JlLCBjbHVzdGVyLWNvcmUgKi8KKwkJaWYgKCEocy0+bG9nX3R5cGUgPSBkbV9wb29sX3N0cmR1cChtZW0sIHBvcykpKSB7CisJCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgbG9nIHR5cGUgc3RyaW5nIGZhaWxlZC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCEocCA9IF9za2lwX2ZpZWxkcyhwb3MsIDEpKSkKKwkJCWdvdG9fb3V0OworCisJCS8qIGRpc2ssIGNsdXN0ZXItZGlzayAqLworCQlpZiAoIShzLT5sb2dfdHlwZSA9IGRtX3Bvb2xfc3RybmR1cChtZW0sIHBvcywgcCAtIHBvcyAtIDEpKSkgeworCQkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIGxvZyB0eXBlIHN0cmluZyBmYWlsZWQuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwb3MgPSBwOworCisJCWlmICgoYXJnYyA+IDIpICYmICFzdHJjbXAocy0+bG9nX3R5cGUsICJkaXNrIikpIHsKKwkJCXMtPmxvZ19jb3VudCA9IGFyZ2MgLSAyOworCisJCQlpZiAoIShzLT5sb2dzID0gZG1fcG9vbF9hbGxvYyhtZW0sIHMtPmxvZ19jb3VudCAqIHNpemVvZigqKHMtPmxvZ3MpKSkpKSB7CisJCQkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIGxvZ3MgZmFpbGVkLiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgcy0+bG9nX2NvdW50OyArK2ksIHBvcyArPSB1c2VkKQorCQkJCWlmIChzc2NhbmYocG9zLCAiJXU6JXUgJW4iLAorCQkJCQkgICAmcy0+bG9nc1tpXS5tYWpvciwgJnMtPmxvZ3NbaV0ubWlub3IsICZ1c2VkKSAhPSAyKQorCQkJCQlnb3RvX291dDsKKworCQkJZm9yIChpID0gMDsgaSA8IHMtPmxvZ19jb3VudDsgKytpKQorCQkJCXMtPmxvZ3NbaV0uaGVhbHRoID0gcG9zW2ldOworCQl9CisJfQorCisJcy0+ZGV2X2NvdW50ID0gbnVtX2RldnM7CisJKnN0YXR1cyA9IHM7CisKKwlyZXR1cm4gMTsKK291dDoKKwlsb2dfZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBtaXJyb3Igc3RhdHVzICVzLiIsIHBhcmFtcyk7CisJZG1fcG9vbF9mcmVlKG1lbSwgcyk7CisJKnN0YXR1cyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL2xpYmRtLXRpbWVzdGFtcC5jIGIvbGliZG0vbGliZG0tdGltZXN0YW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2NDg4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL2xpYmRtLXRpbWVzdGFtcC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhY2thYmxlIFN5c3RlbXMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBBYnN0cmFjdCBvdXQgdGhlIHRpbWUgbWV0aG9kcyB1c2VkIHNvIHRoZXkgY2FuIGJlIGFkanVzdGVkIGxhdGVyIC0KKyAqIHRoZSByZXN1bHRzIG9mIHRoZXNlIHJvdXRpbmVzIHNob3VsZCBzdGF5IGluLWNvcmUuICAKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIE5TRUNfUEVSX1VTRUMJVUlOVDY0X0MoMTAwMCkKKyNkZWZpbmUgTlNFQ19QRVJfTVNFQwlVSU5UNjRfQygxMDAwMDAwKQorI2RlZmluZSBOU0VDX1BFUl9TRUMJVUlOVDY0X0MoMTAwMDAwMDAwMCkKKworLyoKKyAqIFRoZSByZWFsdGltZSBzZWN0aW9uIHVzZXMgY2xvY2tfZ2V0dGltZSB3aXRoIHRoZSBDTE9DS19NT05PVE9OSUMKKyAqIHBhcmFtZXRlciB0byBwcmV2ZW50IGlzc3VlcyB3aXRoIHRpbWUgd2FycHMKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgbGlicnQuCisgKi8KKyNpZmRlZiBIQVZFX1JFQUxUSU1FCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCBkbV90aW1lc3RhbXAgeworCXN0cnVjdCB0aW1lc3BlYyB0OworfTsKKworc3RhdGljIHVpbnQ2NF90IF90aW1lc3RhbXBfdG9fdWludDY0KHN0cnVjdCBkbV90aW1lc3RhbXAgKnRzKQoreworCXVpbnQ2NF90IHN0YW1wID0gMDsKKworCXN0YW1wICs9ICh1aW50NjRfdCkgdHMtPnQudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXN0YW1wICs9ICh1aW50NjRfdCkgdHMtPnQudHZfbnNlYzsKKworCXJldHVybiBzdGFtcDsKK30KKworc3RydWN0IGRtX3RpbWVzdGFtcCAqZG1fdGltZXN0YW1wX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMgPSBOVUxMOworCisJaWYgKCEodHMgPSBkbV96YWxsb2Moc2l6ZW9mKCp0cykpKSkKKwkJc3RhY2s7CisKKwlyZXR1cm4gdHM7Cit9CisKK2ludCBkbV90aW1lc3RhbXBfZ2V0KHN0cnVjdCBkbV90aW1lc3RhbXAgKnRzKQoreworCWlmICghdHMpCisJCXJldHVybiAwOworCisJaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMtPnQpKSB7CisJCWxvZ19zeXNfZXJyb3IoImNsb2NrX2dldHRpbWUiLCAiZ2V0X3RpbWVzdGFtcCIpOworCQl0cy0+dC50dl9zZWMgPSAwOworCQl0cy0+dC50dl9uc2VjID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNlbHNlIC8qICEgSEFWRV9SRUFMVElNRSAqLworCisvKgorICogVGhlICFyZWFsdGltZSBzZWN0aW9uIGp1c3QgdXNlcyBnZXR0aW1lb2ZkYXkgYW5kIGlzIHRoZXJlZm9yZSBzdWJqZWN0CisgKiB0byBudHAtdHlwZSB0aW1lIHdhcnBzIC0gbm90IHN1cmUgaWYgc2hvdWxkIGFsbG93IHRoYXQuCisgKi8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK3N0cnVjdCBkbV90aW1lc3RhbXAgeworCXN0cnVjdCB0aW1ldmFsIHQ7Cit9OworCitzdGF0aWMgdWludDY0X3QgX3RpbWVzdGFtcF90b191aW50NjQoc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMpCit7CisJdWludDY0X3Qgc3RhbXAgPSAwOworCisJc3RhbXAgKz0gdHMtPnQudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXN0YW1wICs9IHRzLT50LnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCisJcmV0dXJuIHN0YW1wOworfQorCitzdHJ1Y3QgZG1fdGltZXN0YW1wICpkbV90aW1lc3RhbXBfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZG1fdGltZXN0YW1wICp0czsKKworCWlmICghKHRzID0gZG1fbWFsbG9jKHNpemVvZigqdHMpKSkpCisJCXN0YWNrOworCisJcmV0dXJuIHRzOworfQorCitpbnQgZG1fdGltZXN0YW1wX2dldChzdHJ1Y3QgZG1fdGltZXN0YW1wICp0cykKK3sKKwlpZiAoIXRzKQorCQlyZXR1cm4gMDsKKworCWlmIChnZXR0aW1lb2ZkYXkoJnRzLT50LCBOVUxMKSkgeworCQlsb2dfc3lzX2Vycm9yKCJnZXR0aW1lb2ZkYXkiLCAiZ2V0X3RpbWVzdGFtcCIpOworCQl0cy0+dC50dl9zZWMgPSAwOworCQl0cy0+dC50dl91c2VjID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1JFQUxUSU1FICovCisKKy8qCisgKiBDb21wYXJlIHR3byB0aW1lc3RhbXBzLgorICoKKyAqIFJldHVybjogLTEgaWYgdHMxIGlzIGxlc3MgdGhhbiB0czIKKyAqICAgICAgICAgIDAgaWYgdHMxIGlzIGVxdWFsIHRvIHRzMgorICogICAgICAgICAgMSBpZiB0czEgaXMgZ3JlYXRlciB0aGFuIHRzMgorICovCitpbnQgZG1fdGltZXN0YW1wX2NvbXBhcmUoc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMxLCBzdHJ1Y3QgZG1fdGltZXN0YW1wICp0czIpCit7CisJdWludDY0X3QgdDEsIHQyOworCisJdDEgPSBfdGltZXN0YW1wX3RvX3VpbnQ2NCh0czEpOworCXQyID0gX3RpbWVzdGFtcF90b191aW50NjQodHMyKTsKKworCWlmICh0MiA8IHQxKQorCQlyZXR1cm4gMTsKKworCWlmICh0MSA8IHQyKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBpbiBuYW5vc2Vjb25kcyBiZXR3ZWVuCisgKiB0aGUgZG1fdGltZXN0YW1wIG9iamVjdHMgdHMxIGFuZCB0czIuCisgKgorICogQ2FsbGVycyB0aGF0IG5lZWQgdG8ga25vdyB3aGV0aGVyIHRzMSBpcyBiZWZvcmUsIGVxdWFsIHRvLCBvciBhZnRlciB0czIKKyAqIGluIGFkZGl0aW9uIHRvIHRoZSBtYWduaXR1ZGUgc2hvdWxkIHVzZSBkbV90aW1lc3RhbXBfY29tcGFyZS4KKyAqLwordWludDY0X3QgZG1fdGltZXN0YW1wX2RlbHRhKHN0cnVjdCBkbV90aW1lc3RhbXAgKnRzMSwgc3RydWN0IGRtX3RpbWVzdGFtcCAqdHMyKQoreworCXVpbnQ2NF90IHQxLCB0MjsKKworCXQxID0gX3RpbWVzdGFtcF90b191aW50NjQodHMxKTsKKwl0MiA9IF90aW1lc3RhbXBfdG9fdWludDY0KHRzMik7CisKKwlpZiAodDEgPiB0MikKKwkJcmV0dXJuIHQxIC0gdDI7CisKKwlyZXR1cm4gdDIgLSB0MTsKK30KKwordm9pZCBkbV90aW1lc3RhbXBfY29weShzdHJ1Y3QgZG1fdGltZXN0YW1wICp0c19uZXcsIHN0cnVjdCBkbV90aW1lc3RhbXAgKnRzX29sZCkKK3sKKwkqdHNfbmV3ID0gKnRzX29sZDsKK30KKwordm9pZCBkbV90aW1lc3RhbXBfZGVzdHJveShzdHJ1Y3QgZG1fdGltZXN0YW1wICp0cykKK3sKKwlkbV9mcmVlKHRzKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL21pc2MvZG0taW9jdGwuaCBiL2xpYmRtL21pc2MvZG0taW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIwYzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbWlzYy9kbS1pb2N0bC5oCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwMyBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisjZGVmaW5lIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisKKyNpZmRlZiBfX2xpbnV4X18KKyMgIGluY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKworI2RlZmluZSBETV9ESVIgIm1hcHBlciIJCS8qIFNsYXNoZXMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBETV9DT05UUk9MX05PREUgImNvbnRyb2wiCisjZGVmaW5lIERNX01BWF9UWVBFX05BTUUgMTYKKyNkZWZpbmUgRE1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIERNX1VVSURfTEVOIDEyOQorCisvKgorICogQSB0cmFkaXRpb25hbCBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBkZXZpY2UgbWFwcGVyLgorICoKKyAqIEVhY2ggZGV2aWNlIGNhbiBoYXZlIHR3byB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBhbgorICogJ2FjdGl2ZScgdGFibGUgd2hpY2ggaXMgdGhlIG9uZSBjdXJyZW50bHkgdXNlZCBieSBpbyBwYXNzaW5nCisgKiB0aHJvdWdoIHRoZSBkZXZpY2UsIGFuZCBhbiAnaW5hY3RpdmUnIG9uZSB3aGljaCBpcyBhIHRhYmxlCisgKiB0aGF0IGlzIGJlaW5nIHByZXBhcmVkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSAnYWN0aXZlJyBvbmUuCisgKgorICogRE1fVkVSU0lPTjoKKyAqIEp1c3QgZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW9jdGwgaW50ZXJmYWNlLgorICoKKyAqIERNX1JFTU9WRV9BTEw6CisgKiBSZW1vdmUgYWxsIGRtIGRldmljZXMsIGRlc3Ryb3kgYWxsIHRhYmxlcy4gIE9ubHkgcmVhbGx5IHVzZWQKKyAqIGZvciBkZWJ1Zy4KKyAqCisgKiBETV9MSVNUX0RFVklDRVM6CisgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZG0gZGV2aWNlIG5hbWVzLgorICoKKyAqIERNX0RFVl9DUkVBVEU6CisgKiBDcmVhdGUgYSBuZXcgZGV2aWNlLCBuZWl0aGVyIHRoZSAnYWN0aXZlJyBvciAnaW5hY3RpdmUnIHRhYmxlCisgKiBzbG90cyB3aWxsIGJlIGZpbGxlZC4gIFRoZSBkZXZpY2Ugd2lsbCBiZSBpbiBzdXNwZW5kZWQgc3RhdGUKKyAqIGFmdGVyIGNyZWF0aW9uLCBob3dldmVyIGFueSBpbyB0byB0aGUgZGV2aWNlIHdpbGwgZ2V0IGVycm9yZWQKKyAqIHNpbmNlIGl0IHdpbGwgYmUgb3V0LW9mLWJvdW5kcy4KKyAqCisgKiBETV9ERVZfUkVNT1ZFOgorICogUmVtb3ZlIGEgZGV2aWNlLCBkZXN0cm95IGFueSB0YWJsZXMuCisgKgorICogRE1fREVWX1JFTkFNRToKKyAqIFJlbmFtZSBhIGRldmljZSBvciBzZXQgaXRzIHV1aWQgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBzdXBwbGllZC4KKyAqCisgKiBETV9TVVNQRU5EOgorICogVGhpcyBwZXJmb3JtcyBib3RoIHN1c3BlbmQgYW5kIHJlc3VtZSwgZGVwZW5kaW5nIHdoaWNoIGZsYWcgaXMKKyAqIHBhc3NlZCBpbi4KKyAqIFN1c3BlbmQ6IFRoaXMgY29tbWFuZCB3aWxsIG5vdCByZXR1cm4gdW50aWwgYWxsIHBlbmRpbmcgaW8gdG8KKyAqIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZC4gIEZ1cnRoZXIgaW8gd2lsbCBiZSBkZWZlcnJlZCB1bnRpbAorICogdGhlIGRldmljZSBpcyByZXN1bWVkLgorICogUmVzdW1lOiBJdCBpcyBubyBsb25nZXIgYW4gZXJyb3IgdG8gaXNzdWUgdGhpcyBjb21tYW5kIG9uIGFuCisgKiB1bnN1c3BlbmRlZCBkZXZpY2UuICBJZiBhIHRhYmxlIGlzIHByZXNlbnQgaW4gdGhlICdpbmFjdGl2ZScKKyAqIHNsb3QsIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGFjdGl2ZSBzbG90LCB0aGVuIHRoZSBvbGQgdGFibGUKKyAqIGZyb20gdGhlIGFjdGl2ZSBzbG90IHdpbGwgYmUgX2Rlc3Ryb3llZF8uICBGaW5hbGx5IHRoZSBkZXZpY2UKKyAqIGlzIHJlc3VtZWQuCisgKgorICogRE1fREVWX1NUQVRVUzoKKyAqIFJldHJpZXZlcyB0aGUgc3RhdHVzIGZvciB0aGUgdGFibGUgaW4gdGhlICdhY3RpdmUnIHNsb3QuCisgKgorICogRE1fREVWX1dBSVQ6CisgKiBXYWl0IGZvciBhIHNpZ25pZmljYW50IGV2ZW50IHRvIG9jY3VyIHRvIHRoZSBkZXZpY2UuICBUaGlzCisgKiBjb3VsZCBlaXRoZXIgYmUgY2F1c2VkIGJ5IGFuIGV2ZW50IHRyaWdnZXJlZCBieSBvbmUgb2YgdGhlCisgKiB0YXJnZXRzIG9mIHRoZSB0YWJsZSBpbiB0aGUgJ2FjdGl2ZScgc2xvdCwgb3IgYSB0YWJsZSBjaGFuZ2UuCisgKgorICogRE1fVEFCTEVfTE9BRDoKKyAqIExvYWQgYSB0YWJsZSBpbnRvIHRoZSAnaW5hY3RpdmUnIHNsb3QgZm9yIHRoZSBkZXZpY2UuICBUaGUKKyAqIGRldmljZSBkb2VzIF9ub3RfIG5lZWQgdG8gYmUgc3VzcGVuZGVkIHByaW9yIHRvIHRoaXMgY29tbWFuZC4KKyAqCisgKiBETV9UQUJMRV9DTEVBUjoKKyAqIERlc3Ryb3kgYW55IHRhYmxlIGluIHRoZSAnaW5hY3RpdmUnIHNsb3QgKGllLiBhYm9ydCkuCisgKgorICogRE1fVEFCTEVfREVQUzoKKyAqIFJldHVybiBhIHNldCBvZiBkZXZpY2UgZGVwZW5kZW5jaWVzIGZvciB0aGUgJ2FjdGl2ZScgdGFibGUuCisgKgorICogRE1fVEFCTEVfU1RBVFVTOgorICogUmV0dXJuIHRoZSB0YXJnZXRzIHN0YXR1cyBmb3IgdGhlICdhY3RpdmUnIHRhYmxlLgorICoKKyAqIERNX1RBUkdFVF9NU0c6CisgKiBQYXNzIGEgbWVzc2FnZSBzdHJpbmcgdG8gdGhlIHRhcmdldCBhdCBhIHNwZWNpZmljIG9mZnNldCBvZiBhIGRldmljZS4KKyAqCisgKiBETV9ERVZfU0VUX0dFT01FVFJZOgorICogU2V0IHRoZSBnZW9tZXRyeSBvZiBhIGRldmljZSBieSBwYXNzaW5nIGluIGEgc3RyaW5nIGluIHRoaXMgZm9ybWF0OgorICoKKyAqICJjeWxpbmRlcnMgaGVhZHMgc2VjdG9yc19wZXJfdHJhY2sgc3RhcnRfc2VjdG9yIgorICoKKyAqIEJld2FyZSB0aGF0IENIUyBnZW9tZXRyeSBpcyBuZWFybHkgb2Jzb2xldGUgYW5kIG9ubHkgcHJvdmlkZWQKKyAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZG0gZGV2aWNlcyB0aGF0IGNhbiBiZSBib290ZWQgYnkgYSBQQworICogQklPUy4gIFNlZSBzdHJ1Y3QgaGRfZ2VvbWV0cnkgZm9yIHJhbmdlIGxpbWl0cy4gIEFsc28gbm90ZSB0aGF0CisgKiB0aGUgZ2VvbWV0cnkgaXMgZXJhc2VkIGlmIHRoZSBkZXZpY2Ugc2l6ZSBjaGFuZ2VzLgorICovCisKKy8qCisgKiBBbGwgaW9jdGwgYXJndW1lbnRzIGNvbnNpc3Qgb2YgYSBzaW5nbGUgY2h1bmsgb2YgbWVtb3J5LCB3aXRoCisgKiB0aGlzIHN0cnVjdHVyZSBhdCB0aGUgc3RhcnQuICBJZiBhIHV1aWQgaXMgc3BlY2lmaWVkIGFueQorICogbG9va3VwIChlZy4gZm9yIGEgRE1fSU5GTykgd2lsbCBiZSBkb25lIG9uIHRoYXQsICpub3QqIHRoZQorICogbmFtZS4KKyAqLworc3RydWN0IGRtX2lvY3RsIHsKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBtYWRlIHVwIG9mIHRocmVlIHBhcnRzOgorCSAqIG1ham9yIC0gbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LAorCSAqIG1pbm9yIC0gb25seSBiYWNrd2FyZHMgY29tcGF0aWJsZSwKKwkgKiBwYXRjaCAtIGJvdGggYmFja3dhcmRzIGFuZCBmb3J3YXJkcyBjb21wYXRpYmxlLgorCSAqCisJICogQWxsIGNsaWVudHMgb2YgdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgZmlsbCBpbiB0aGUKKwkgKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhleSB3ZXJlCisJICogY29tcGlsZWQgd2l0aC4KKwkgKgorCSAqIEFsbCByZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIChpZS4gdGhvc2UgdGhhdCBkb24ndAorCSAqIHJldHVybiAtRU5PVFRZKSBmaWxsIG91dCB0aGlzIGZpZWxkLCBldmVuIGlmIHRoZQorCSAqIGNvbW1hbmQgZmFpbGVkLgorCSAqLworCXVpbnQzMl90IHZlcnNpb25bM107CS8qIGluL291dCAqLworCXVpbnQzMl90IGRhdGFfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBkYXRhIHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3QgZGF0YV9zdGFydDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGRhdGEKKwkJCQkgKiByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3QgdGFyZ2V0X2NvdW50OwkvKiBpbi9vdXQgKi8KKwlpbnQzMl90IG9wZW5fY291bnQ7CS8qIG91dCAqLworCXVpbnQzMl90IGZsYWdzOwkJLyogaW4vb3V0ICovCisKKwkvKgorCSAqIGV2ZW50X25yIGhvbGRzIGVpdGhlciB0aGUgZXZlbnQgbnVtYmVyIChpbnB1dCBhbmQgb3V0cHV0KSBvciB0aGUKKwkgKiB1ZGV2IGNvb2tpZSB2YWx1ZSAoaW5wdXQgb25seSkuCisJICogVGhlIERNX0RFVl9XQUlUIGlvY3RsIHRha2VzIGFuIGV2ZW50IG51bWJlciBhcyBpbnB1dC4KKwkgKiBUaGUgRE1fU1VTUEVORCwgRE1fREVWX1JFTU9WRSBhbmQgRE1fREVWX1JFTkFNRSBpb2N0bHMKKwkgKiB1c2UgdGhlIGZpZWxkIGFzIGEgY29va2llIHRvIHJldHVybiBpbiB0aGUgRE1fQ09PS0lFCisJICogdmFyaWFibGUgd2l0aCB0aGUgdWV2ZW50cyB0aGV5IGlzc3VlLgorCSAqIEZvciBvdXRwdXQsIHRoZSBpb2N0bHMgcmV0dXJuIHRoZSBldmVudCBudW1iZXIsIG5vdCB0aGUgY29va2llLgorCSAqLworCXVpbnQzMl90IGV2ZW50X25yOyAgICAgIAkvKiBpbi9vdXQgKi8KKwl1aW50MzJfdCBwYWRkaW5nOworCisJdWludDY0X3QgZGV2OwkJLyogaW4vb3V0ICovCisKKwljaGFyIG5hbWVbRE1fTkFNRV9MRU5dOwkvKiBkZXZpY2UgbmFtZSAqLworCWNoYXIgdXVpZFtETV9VVUlEX0xFTl07CS8qIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgorCQkJCSAqIHRoZSBibG9jayBkZXZpY2UgKi8KKwljaGFyIGRhdGFbN107CQkvKiBwYWRkaW5nIG9yIGRhdGEgKi8KK307CisKKy8qCisgKiBVc2VkIHRvIHNwZWNpZnkgdGFibGVzLiAgVGhlc2Ugc3RydWN0dXJlcyBhcHBlYXIgYWZ0ZXIgdGhlCisgKiBkbV9pb2N0bC4KKyAqLworc3RydWN0IGRtX3RhcmdldF9zcGVjIHsKKwl1aW50NjRfdCBzZWN0b3Jfc3RhcnQ7CisJdWludDY0X3QgbGVuZ3RoOworCWludDMyX3Qgc3RhdHVzOwkJLyogdXNlZCB3aGVuIHJlYWRpbmcgZnJvbSBrZXJuZWwgb25seSAqLworCisJLyoKKwkgKiBMb2NhdGlvbiBvZiB0aGUgbmV4dCBkbV90YXJnZXRfc3BlYy4KKwkgKiAtIFdoZW4gc3BlY2lmeWluZyB0YXJnZXRzIG9uIGEgRE1fVEFCTEVfTE9BRCBjb21tYW5kLCB0aGlzIHZhbHVlIGlzCisJICogICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAiY3VycmVudCIgZG1fdGFyZ2V0X3NwZWMKKwkgKiAgIHRvIHRoZSBzdGFydCBvZiB0aGUgIm5leHQiIGRtX3RhcmdldF9zcGVjLgorCSAqIC0gV2hlbiByZXRyaWV2aW5nIHRhcmdldHMgb24gYSBETV9UQUJMRV9TVEFUVVMgY29tbWFuZCwgdGhpcyB2YWx1ZQorCSAqICAgaXMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgZG1fdGFyZ2V0X3NwZWMKKwkgKiAgICh0aGF0IGZvbGxvd3MgdGhlIGRtX2lvY3RsIHN0cnVjdCkgdG8gdGhlIHN0YXJ0IG9mIHRoZSAibmV4dCIKKwkgKiAgIGRtX3RhcmdldF9zcGVjLgorCSAqLworCXVpbnQzMl90IG5leHQ7CisKKwljaGFyIHRhcmdldF90eXBlW0RNX01BWF9UWVBFX05BTUVdOworCisJLyoKKwkgKiBQYXJhbWV0ZXIgc3RyaW5nIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG9iamVjdC4KKwkgKiBCZSBjYXJlZnVsIHRvIGFkZCBwYWRkaW5nIGFmdGVyIHN0cmluZyB0byBlbnN1cmUgY29ycmVjdAorCSAqIGFsaWdubWVudCBvZiBzdWJzZXF1ZW50IGRtX3RhcmdldF9zcGVjLgorCSAqLworfTsKKworLyoKKyAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHRhcmdldCBkZXBlbmRlbmNpZXMuCisgKi8KK3N0cnVjdCBkbV90YXJnZXRfZGVwcyB7CisJdWludDMyX3QgY291bnQ7CS8qIEFycmF5IHNpemUgKi8KKwl1aW50MzJfdCBwYWRkaW5nOwkvKiB1bnVzZWQgKi8KKwl1aW50NjRfdCBkZXZbMF07CS8qIG91dCAqLworfTsKKworLyoKKyAqIFVzZWQgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgZG0gZGV2aWNlcy4KKyAqLworc3RydWN0IGRtX25hbWVfbGlzdCB7CisJdWludDY0X3QgZGV2OworCXVpbnQzMl90IG5leHQ7CQkvKiBvZmZzZXQgdG8gdGhlIG5leHQgcmVjb3JkIGZyb20KKwkJCQkgICB0aGUgX3N0YXJ0XyBvZiB0aGlzICovCisJY2hhciBuYW1lWzBdOworfTsKKworLyoKKyAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHRhcmdldCB2ZXJzaW9ucworICovCitzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zIHsKKyAgICAgICAgdWludDMyX3QgbmV4dDsKKyAgICAgICAgdWludDMyX3QgdmVyc2lvblszXTsKKworICAgICAgICBjaGFyIG5hbWVbMF07Cit9OworCisvKgorICogVXNlZCB0byBwYXNzIG1lc3NhZ2UgdG8gYSB0YXJnZXQKKyAqLworc3RydWN0IGRtX3RhcmdldF9tc2cgeworCXVpbnQ2NF90IHNlY3RvcjsJLyogRGV2aWNlIHNlY3RvciAqLworCisJY2hhciBtZXNzYWdlWzBdOworfTsKKworLyoKKyAqIElmIHlvdSBjaGFuZ2UgdGhpcyBtYWtlIHN1cmUgeW91IG1ha2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlCisgKiB0byBkbS1pb2N0bC5jOmxvb2t1cF9pb2N0bCgpCisgKi8KK2VudW0geworCS8qIFRvcCBsZXZlbCBjbWRzICovCisJRE1fVkVSU0lPTl9DTUQgPSAwLAorCURNX1JFTU9WRV9BTExfQ01ELAorCURNX0xJU1RfREVWSUNFU19DTUQsCisKKwkvKiBkZXZpY2UgbGV2ZWwgY21kcyAqLworCURNX0RFVl9DUkVBVEVfQ01ELAorCURNX0RFVl9SRU1PVkVfQ01ELAorCURNX0RFVl9SRU5BTUVfQ01ELAorCURNX0RFVl9TVVNQRU5EX0NNRCwKKwlETV9ERVZfU1RBVFVTX0NNRCwKKwlETV9ERVZfV0FJVF9DTUQsCisKKwkvKiBUYWJsZSBsZXZlbCBjbWRzICovCisJRE1fVEFCTEVfTE9BRF9DTUQsCisJRE1fVEFCTEVfQ0xFQVJfQ01ELAorCURNX1RBQkxFX0RFUFNfQ01ELAorCURNX1RBQkxFX1NUQVRVU19DTUQsCisKKwkvKiBBZGRlZCBsYXRlciAqLworCURNX0xJU1RfVkVSU0lPTlNfQ01ELAorCURNX1RBUkdFVF9NU0dfQ01ELAorCURNX0RFVl9TRVRfR0VPTUVUUllfQ01ECit9OworCisjZGVmaW5lIERNX0lPQ1RMIDB4ZmQKKworI2RlZmluZSBETV9WRVJTSU9OICAgICAgIF9JT1dSKERNX0lPQ1RMLCBETV9WRVJTSU9OX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9SRU1PVkVfQUxMICAgIF9JT1dSKERNX0lPQ1RMLCBETV9SRU1PVkVfQUxMX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9MSVNUX0RFVklDRVMgIF9JT1dSKERNX0lPQ1RMLCBETV9MSVNUX0RFVklDRVNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fREVWX0NSRUFURSAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX0NSRUFURV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1JFTU9WRSAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1JFTU9WRV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1JFTkFNRSAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1JFTkFNRV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1NVU1BFTkQgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1NVU1BFTkRfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TVEFUVVMgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVEFUVVNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9XQUlUICAgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9XQUlUX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX1RBQkxFX0xPQUQgICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX0xPQURfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX1RBQkxFX0NMRUFSICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX0NMRUFSX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9UQUJMRV9ERVBTICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9ERVBTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9UQUJMRV9TVEFUVVMgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9TVEFUVVNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fTElTVF9WRVJTSU9OUyBfSU9XUihETV9JT0NUTCwgRE1fTElTVF9WRVJTSU9OU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9UQVJHRVRfTVNHCSBfSU9XUihETV9JT0NUTCwgRE1fVEFSR0VUX01TR19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1NFVF9HRU9NRVRSWQlfSU9XUihETV9JT0NUTCwgRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9WRVJTSU9OX01BSk9SCTQKKyNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkzMQorI2RlZmluZSBETV9WRVJTSU9OX1BBVENITEVWRUwJMAorI2RlZmluZSBETV9WRVJTSU9OX0VYVFJBCSItaW9jdGwgKDIwMTUtMDMtMTIpIgorCisvKiBTdGF0dXMgYml0cyAqLworI2RlZmluZSBETV9SRUFET05MWV9GTEFHCSgxIDw8IDApIC8qIEluL091dCAqLworI2RlZmluZSBETV9TVVNQRU5EX0ZMQUcJCSgxIDw8IDEpIC8qIEluL091dCAqLworI2RlZmluZSBETV9QRVJTSVNURU5UX0RFVl9GTEFHCSgxIDw8IDMpIC8qIEluICovCisKKy8qCisgKiBGbGFnIHBhc3NlZCBpbnRvIGlvY3RsIFNUQVRVUyBjb21tYW5kIHRvIGdldCB0YWJsZSBpbmZvcm1hdGlvbgorICogcmF0aGVyIHRoYW4gY3VycmVudCBzdGF0dXMuCisgKi8KKyNkZWZpbmUgRE1fU1RBVFVTX1RBQkxFX0ZMQUcJKDEgPDwgNCkgLyogSW4gKi8KKworLyoKKyAqIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBhIHRhYmxlIGlzIHByZXNlbnQgaW4gZWl0aGVyIG9mCisgKiB0aGUgdHdvIHRhYmxlIHNsb3RzIHRoYXQgYSBkZXZpY2UgaGFzLgorICovCisjZGVmaW5lIERNX0FDVElWRV9QUkVTRU5UX0ZMQUcgICAoMSA8PCA1KSAvKiBPdXQgKi8KKyNkZWZpbmUgRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHICgxIDw8IDYpIC8qIE91dCAqLworCisvKgorICogSW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBwYXNzZWQgaW4gd2Fzbid0IGJpZyBlbm91Z2ggZm9yIHRoZQorICogcmVzdWx0cy4KKyAqLworI2RlZmluZSBETV9CVUZGRVJfRlVMTF9GTEFHCSgxIDw8IDgpIC8qIE91dCAqLworCisvKgorICogVGhpcyBmbGFnIGlzIG5vdyBpZ25vcmVkLgorICovCisjZGVmaW5lIERNX1NLSVBfQkRHRVRfRkxBRwkoMSA8PCA5KSAvKiBJbiAqLworCisvKgorICogU2V0IHRoaXMgdG8gYXZvaWQgYXR0ZW1wdGluZyB0byBmcmVlemUgYW55IGZpbGVzeXN0ZW0gd2hlbiBzdXNwZW5kaW5nLgorICovCisjZGVmaW5lIERNX1NLSVBfTE9DS0ZTX0ZMQUcJKDEgPDwgMTApIC8qIEluICovCisKKy8qCisgKiBTZXQgdGhpcyB0byBzdXNwZW5kIHdpdGhvdXQgZmx1c2hpbmcgcXVldWVkIGlvcy4KKyAqIEFsc28gZGlzYWJsZXMgZmx1c2hpbmcgdW5jb21taXR0ZWQgY2hhbmdlcyBpbiB0aGUgdGhpbiB0YXJnZXQgYmVmb3JlCisgKiBnZW5lcmF0aW5nIHN0YXRpc3RpY3MgZm9yIERNX1RBQkxFX1NUQVRVUyBhbmQgRE1fREVWX1dBSVQuCisgKi8KKyNkZWZpbmUgRE1fTk9GTFVTSF9GTEFHCQkoMSA8PCAxMSkgLyogSW4gKi8KKworLyoKKyAqIElmIHNldCwgYW55IHRhYmxlIGluZm9ybWF0aW9uIHJldHVybmVkIHdpbGwgcmVsYXRlIHRvIHRoZSBpbmFjdGl2ZQorICogdGFibGUgaW5zdGVhZCBvZiB0aGUgbGl2ZSBvbmUuICBBbHdheXMgY2hlY2sgRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHCisgKiBpcyBzZXQgYmVmb3JlIHVzaW5nIHRoZSBkYXRhIHJldHVybmVkLgorICovCisjZGVmaW5lIERNX1FVRVJZX0lOQUNUSVZFX1RBQkxFX0ZMQUcJKDEgPDwgMTIpIC8qIEluICovCisKKy8qCisgKiBJZiBzZXQsIGEgdWV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIHdoaWNoIHRoZSBjYWxsZXIgbWF5IG5lZWQgdG8gd2FpdC4KKyAqLworI2RlZmluZSBETV9VRVZFTlRfR0VORVJBVEVEX0ZMQUcJKDEgPDwgMTMpIC8qIE91dCAqLworCisvKgorICogSWYgc2V0LCByZW5hbWUgY2hhbmdlcyB0aGUgdXVpZCBub3QgdGhlIG5hbWUuICBPbmx5IHBlcm1pdHRlZAorICogaWYgbm8gdXVpZCB3YXMgcHJldmlvdXNseSBzdXBwbGllZDogYW4gZXhpc3RpbmcgdXVpZCBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBETV9VVUlEX0ZMQUcJCQkoMSA8PCAxNCkgLyogSW4gKi8KKworLyoKKyAqIElmIHNldCwgYWxsIGJ1ZmZlcnMgYXJlIHdpcGVkIGFmdGVyIHVzZS4gVXNlIHdoZW4gc2VuZGluZworICogb3IgcmVxdWVzdGluZyBzZW5zaXRpdmUgZGF0YSBzdWNoIGFzIGFuIGVuY3J5cHRpb24ga2V5LgorICovCisjZGVmaW5lIERNX1NFQ1VSRV9EQVRBX0ZMQUcJCSgxIDw8IDE1KSAvKiBJbiAqLworCisvKgorICogSWYgc2V0LCBhIG1lc3NhZ2UgZ2VuZXJhdGVkIG91dHB1dCBkYXRhLgorICovCisjZGVmaW5lIERNX0RBVEFfT1VUX0ZMQUcJCSgxIDw8IDE2KSAvKiBPdXQgKi8KKworLyoKKyAqIElmIHNldCB3aXRoIERNX0RFVl9SRU1PVkUgb3IgRE1fUkVNT1ZFX0FMTCB0aGlzIGluZGljYXRlcyB0aGF0IGlmCisgKiB0aGUgZGV2aWNlIGNhbm5vdCBiZSByZW1vdmVkIGltbWVkaWF0ZWx5IGJlY2F1c2UgaXQgaXMgc3RpbGwgaW4gdXNlCisgKiBpdCBzaG91bGQgaW5zdGVhZCBiZSBzY2hlZHVsZWQgZm9yIHJlbW92YWwgd2hlbiBpdCBnZXRzIGNsb3NlZC4KKyAqCisgKiBPbiByZXR1cm4gZnJvbSBETV9ERVZfUkVNT1ZFLCBETV9ERVZfU1RBVFVTIG9yIG90aGVyIGlvY3RscywgdGhpcworICogZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIHdoZW4gaXQKKyAqIGdldHMgY2xvc2VkLgorICovCisjZGVmaW5lIERNX0RFRkVSUkVEX1JFTU9WRQkJKDEgPDwgMTcpIC8qIEluL091dCAqLworCisvKgorICogSWYgc2V0LCB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZCBpbnRlcm5hbGx5LgorICovCisjZGVmaW5lIERNX0lOVEVSTkFMX1NVU1BFTkRfRkxBRwkoMSA8PCAxOCkgLyogT3V0ICovCisKKyNlbmRpZgkJCQkvKiBfTElOVVhfRE1fSU9DVExfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZG0vbWlzYy9kbS1sb2ctdXNlcnNwYWNlLmggYi9saWJkbS9taXNjL2RtLWxvZy11c2Vyc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE4MzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbWlzYy9kbS1sb2ctdXNlcnNwYWNlLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgorICovCisKKyNpZm5kZWYgX19ETV9MT0dfVVNFUlNQQUNFX0hfXworI2RlZmluZSBfX0RNX0xPR19VU0VSU1BBQ0VfSF9fCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiZG0taW9jdGwuaCIgLyogRm9yIERNX1VVSURfTEVOICovCisKKy8qCisgKiBUaGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgbG9nIG1vZHVsZSBjb25zaXN0cyBvZiBhIGtlcm5lbCBjb21wb25lbnQgYW5kCisgKiBhIHVzZXItc3BhY2UgY29tcG9uZW50LiAgVGhlIGtlcm5lbCBjb21wb25lbnQgaW1wbGVtZW50cyB0aGUgQVBJIGRlZmluZWQKKyAqIGluIGRtLWRpcnR5LWxvZy5oLiAgSXRzIHB1cnBvc2UgaXMgc2ltcGx5IHRvIHBhc3MgdGhlIHBhcmFtZXRlcnMgYW5kCisgKiByZXR1cm4gdmFsdWVzIG9mIHRob3NlIEFQSSBmdW5jdGlvbnMgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXItc3BhY2UuCisgKgorICogQmVsb3cgYXJlIGRlZmluZWQgdGhlICdyZXF1ZXN0X3R5cGVzJyAtIERNX1VMT0dfQ1RSLCBETV9VTE9HX0RUUiwgZXRjLgorICogVGhlc2UgcmVxdWVzdCB0eXBlcyByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMgaW4gdGhlIGRldmljZS1tYXBwZXIKKyAqIGRpcnR5IGxvZyBBUEkuICBFYWNoIG9mIHRoZXNlIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKyAqCisgKiBUaGUgdXNlci1zcGFjZSBwcm9ncmFtIG11c3QgbGlzdGVuIGZvciByZXF1ZXN0cyBmcm9tIHRoZSBrZXJuZWwgKHJlcHJlc2VudGluZworICogdGhlIHZhcmlvdXMgQVBJIGZ1bmN0aW9ucykgYW5kIHByb2Nlc3MgdGhlbS4KKyAqCisgKiBVc2VyLXNwYWNlIGJlZ2lucyBieSBzZXR0aW5nIHVwIHRoZSBjb21tdW5pY2F0aW9uIGxpbmsgKGVycm9yIGNoZWNraW5nCisgKiByZW1vdmVkIGZvciBjbGFyaXR5KToKKyAqCWZkID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfQ09OTkVDVE9SKTsKKyAqCWFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKyAqCWFkZHIubmxfZ3JvdXBzID0gQ05fSURYX0RNOworICoJYWRkci5ubF9waWQgPSAwOworICoJciA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgKglvcHQgPSBhZGRyLm5sX2dyb3VwczsKKyAqCXNldHNvY2tvcHQoZmQsIFNPTF9ORVRMSU5LLCBORVRMSU5LX0FERF9NRU1CRVJTSElQLCAmb3B0LCBzaXplb2Yob3B0KSk7CisgKgorICogVXNlci1zcGFjZSB3aWxsIHRoZW4gd2FpdCB0byByZWNlaXZlIHJlcXVlc3RzIGZvcm0gdGhlIGtlcm5lbCwgd2hpY2ggaXQKKyAqIHdpbGwgcHJvY2VzcyBhcyBkZXNjcmliZWQgYmVsb3cuICBUaGUgcmVxdWVzdHMgYXJlIHJlY2VpdmVkIGluIHRoZSBmb3JtLAorICogKChzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0KSArIChhZGRpdGlvbmFsIGRhdGEpKS4gIERlcGVuZGluZyBvbiB0aGUgcmVxdWVzdAorICogdHlwZSwgdGhlcmUgbWF5IG9yIG1heSBub3QgYmUgJ2FkZGl0aW9uYWwgZGF0YScuICBJbiB0aGUgZGVzY3JpcHRpb25zIGJlbG93LAorICogeW91IHdpbGwgc2VlICdQYXlsb2FkLXRvLXVzZXJzcGFjZScgYW5kICdQYXlsb2FkLXRvLWtlcm5lbCcuICBUaGUKKyAqICdQYXlsb2FkLXRvLXVzZXJzcGFjZScgaXMgd2hhdCB0aGUga2VybmVsIHNlbmRzIGluICdhZGRpdGlvbmFsIGRhdGEnIGFzCisgKiBuZWNlc3NhcnkgcGFyYW1ldGVycyB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gIFRoZSAnUGF5bG9hZC10by1rZXJuZWwnIGlzCisgKiB0aGUgJ2FkZGl0aW9uYWwgZGF0YScgcmV0dXJuZWQgdG8gdGhlIGtlcm5lbCB0aGF0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkKKyAqIHJlc3VsdHMgb2YgdGhlIHJlcXVlc3QuICBUaGUgJ2RhdGFfc2l6ZScgZmllbGQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdAorICogc3RydWN0dXJlIGRlbm90ZXMgdGhlIGF2YWlsYWJpbGl0eSBhbmQgYW1vdW50IG9mIHBheWxvYWQgZGF0YS4KKyAqLworCisvKgorICogRE1fVUxPR19DVFIgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmN0cikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKyAqCSAgICAgIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2KTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCUEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgYXJndiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICcgJ3MKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJVGhlIG5hbWUgb2YgdGhlIGRldmljZSB0aGF0IGlzIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBsb2cKKyAqICAgICAgZGF0YS4gICdkbV9nZXRfZGV2aWNlJyB3aWxsIGJlIGNhbGxlZCBvbiB0aGlzIGRldmljZS4gICgnZG1fcHV0X2RldmljZScKKyAqICAgICAgd2lsbCBiZSBjYWxsZWQgb24gdGhpcyBkZXZpY2UgYXV0b21hdGljYWxseSBhZnRlciBjYWxsaW5nIERNX1VMT0dfRFRSLikKKyAqICAgICAgSWYgdGhlcmUgaXMgbm8gZGV2aWNlIG5lZWRlZCBmb3IgbG9nIGRhdGEsICdkYXRhX3NpemUnIGluIHRoZQorICogICAgICBkbV91bG9nX3JlcXVlc3Qgc3RydWN0IHNob3VsZCBiZSAwLgorICoKKyAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyB0aGUgcmVmZXJlbmNlIHRoYXQKKyAqIHdpbGwgYmUgdXNlZCBieSBhbGwgcmVxdWVzdCB0eXBlcyB0byBhIHNwZWNpZmljIGxvZy4gIFRoZSBjb25zdHJ1Y3RvciBtdXN0CisgKiByZWNvcmQgdGhpcyBhc3NvdGlhdGlvbiB3aXRoIHRoZSBpbnN0YW5jZSBjcmVhdGVkLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkLCBmaWxsaW5nIHRoZQorICogZGF0YSBmaWVsZCB3aXRoIHRoZSBsb2cgZGV2aWNlIGlmIG5lY2Vzc2FyeSwgYW5kIHNldHRpbmcgJ2RhdGFfc2l6ZScKKyAqIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19DVFIgICAgICAgICAgICAgICAgICAgIDEKKworLyoKKyAqIERNX1VMT0dfRFRSIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiB2b2lkICgqZHRyKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJQSBzaW5nbGUgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBhcmd2IGFyZ3VtZW50cyBzZXBhcmF0ZWQgYnkgJyAncworICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLiAgKCdkYXRhX3NpemUnIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0IHNob3VsZCBiZSAwLikKKyAqCisgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYWxsIHRoYXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgbG9nIGluc3RhbmNlIGJlaW5nIGRlc3Ryb3llZC4gIFRoZXJlIGlzIG5vCisgKiBwYXlsb2FkIGRhdGEuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kIGNsZWFyaW5nCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfRFRSICAgICAgICAgICAgICAgICAgICAyCisKKy8qCisgKiBETV9VTE9HX1BSRVNVU1BFTkQgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKnByZXN1c3BlbmQpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyBhbGwgdGhhdCBpcworICogbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBsb2cgaW5zdGFuY2UgYmVpbmcgcHJlc3VzcGVuZGVkLiAgVGhlcmUgaXMgbm8KKyAqIHBheWxvYWQgZGF0YS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19QUkVTVVNQRU5EICAgICAgICAgICAgIDMKKworLyoKKyAqIERNX1VMT0dfUE9TVFNVU1BFTkQgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKnBvc3RzdXNwZW5kKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYWxsIHRoYXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgbG9nIGluc3RhbmNlIGJlaW5nIHBvc3RzdXNwZW5kZWQuICBUaGVyZSBpcyBubworICogcGF5bG9hZCBkYXRhLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1BPU1RTVVNQRU5EICAgICAgICAgICAgNAorCisvKgorICogRE1fVUxPR19SRVNVTUUgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKnJlc3VtZSkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogVGhlIFVVSUQgY29udGFpbmVkIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIGlzIGFsbCB0aGF0IGlzCisgKiBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlIGxvZyBpbnN0YW5jZSBiZWluZyByZXN1bWVkLiAgVGhlcmUgaXMgbm8KKyAqIHBheWxvYWQgZGF0YS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19SRVNVTUUgICAgICAgICAgICAgICAgIDUKKworLyoKKyAqIERNX1VMT0dfR0VUX1JFR0lPTl9TSVpFIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiB1aW50MzJfdCAoKmdldF9yZWdpb25fc2l6ZSkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCXVpbnQ2NF90IC0gY29udGFpbnMgdGhlIHJlZ2lvbiBzaXplCisgKgorICogVGhlIHJlZ2lvbiBzaXplIGlzIHNvbWV0aGluZyB0aGF0IHdhcyBkZXRlcm1pbmVkIGF0IGNvbnN0cnVjdG9yIHRpbWUuCisgKiBJdCBpcyByZXR1cm5lZCBpbiB0aGUgcGF5bG9hZCBhcmVhIGFuZCAnZGF0YV9zaXplJyBpcyBzZXQgdG8KKyAqIHJlZmxlY3QgdGhpcy4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfR0VUX1JFR0lPTl9TSVpFICAgICAgICA2CisKKy8qCisgKiBETV9VTE9HX0lTX0NMRUFOIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCppc19jbGVhbikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJdWludDY0X3QgLSB0aGUgcmVnaW9uIHRvIGdldCBjbGVhbiBzdGF0dXMgb24KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJaW50NjRfdCAgLSAxIGlmIGNsZWFuLCAwIG90aGVyd2lzZQorICoKKyAqIFBheWxvYWQgaXMgc2l6ZW9mKHVpbnQ2NF90KSBhbmQgY29udGFpbnMgdGhlIHJlZ2lvbiBmb3Igd2hpY2ggdGhlIGNsZWFuCisgKiBzdGF0dXMgaXMgYmVpbmcgbWFkZS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gZmlsbGluZyB0aGUgcGF5bG9hZCB3aXRoIDAgKG5vdCBjbGVhbikgb3IKKyAqIDEgKGNsZWFuKSwgc2V0dGluZyAnZGF0YV9zaXplJyBhbmQgJ2Vycm9yJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfSVNfQ0xFQU4gICAgICAgICAgICAgICA3CisKKy8qCisgKiBETV9VTE9HX0lOX1NZTkMgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmluX3N5bmMpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uLAorICoJCSAgaW50IGNhbl9ibG9jayk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl1aW50NjRfdCAtIHRoZSByZWdpb24gdG8gZ2V0IHN5bmMgc3RhdHVzIG9uCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCWludDY0X3QgLSAxIGlmIGluLXN5bmMsIDAgb3RoZXJ3aXNlCisgKgorICogRXhhY3RseSB0aGUgc2FtZSBhcyAnaXNfY2xlYW4nIGFib3ZlLCBleGNlcHQgdGhpcyB0aW1lIGFza2luZyAiaGFzIHRoZQorICogcmVnaW9uIGJlZW4gcmVjb3ZlcmVkPyIgdnMuICJpcyB0aGUgcmVnaW9uIG5vdCBiZWluZyBtb2RpZmllZD8iCisgKi8KKyNkZWZpbmUgRE1fVUxPR19JTl9TWU5DICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIERNX1VMT0dfRkxVU0ggY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmZsdXNoKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBObyBpbmNvbWluZyBvciBvdXRnb2luZyBwYXlsb2FkLiAgU2ltcGx5IGZsdXNoIGxvZyBzdGF0ZSB0byBkaXNrLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZCBjbGVhcmluZworICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0ZMVVNIICAgICAgICAgICAgICAgICAgOQorCisvKgorICogRE1fVUxPR19NQVJLX1JFR0lPTiBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogdm9pZCAoKm1hcmtfcmVnaW9uKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl1aW50NjRfdCBbXSAtIHJlZ2lvbihzKSB0byBtYXJrCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogSW5jb21pbmcgcGF5bG9hZCBjb250YWlucyB0aGUgb25lIG9yIG1vcmUgcmVnaW9ucyB0byBtYXJrIGRpcnR5LgorICogVGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBpbiB0aGUgcGF5bG9hZCBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tCisgKiAnZGF0YV9zaXplL3NpemVvZih1aW50NjRfdCknLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZCBjbGVhcmluZworICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX01BUktfUkVHSU9OICAgICAgICAgICAxMAorCisvKgorICogRE1fVUxPR19DTEVBUl9SRUdJT04gY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHZvaWQgKCpjbGVhcl9yZWdpb24pKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXVpbnQ2NF90IFtdIC0gcmVnaW9uKHMpIHRvIGNsZWFyCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogSW5jb21pbmcgcGF5bG9hZCBjb250YWlucyB0aGUgb25lIG9yIG1vcmUgcmVnaW9ucyB0byBtYXJrIGNsZWFuLgorICogVGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBpbiB0aGUgcGF5bG9hZCBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tCisgKiAnZGF0YV9zaXplL3NpemVvZih1aW50NjRfdCknLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZCBjbGVhcmluZworICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0NMRUFSX1JFR0lPTiAgICAgICAgICAxMQorCisvKgorICogRE1fVUxPR19HRVRfUkVTWU5DX1dPUksgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmdldF9yZXN5bmNfd29yaykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCAqcmVnaW9uKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCXsKKyAqCQlpbnQ2NF90IGk7IC0tIDEgaWYgcmVjb3ZlcnkgbmVjZXNzYXJ5LCAwIG90aGVyd2lzZQorICoJCXVpbnQ2NF90IHI7IC0tIFRoZSByZWdpb24gdG8gcmVjb3ZlciBpZiBpPTEKKyAqCX0KKyAqICdkYXRhX3NpemUnIHNob3VsZCBiZSBzZXQgYXBwcm9wcmlhdGVseS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfR0VUX1JFU1lOQ19XT1JLICAgICAgIDEyCisKKy8qCisgKiBETV9VTE9HX1NFVF9SRUdJT05fU1lOQyBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogdm9pZCAoKnNldF9yZWdpb25fc3luYykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLAorICoJCQkgICByZWdpb25fdCByZWdpb24sIGludCBpbl9zeW5jKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXsKKyAqCQl1aW50NjRfdCAtIHJlZ2lvbiB0byBzZXQgc3luYyBzdGF0ZSBvbgorICoJCWludDY0X3QgIC0gMCBpZiBub3QtaW4tc3luYywgMSBpZiBpbi1zeW5jCisgKgl9CisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kIGNsZWFyaW5nCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfU0VUX1JFR0lPTl9TWU5DICAgICAgIDEzCisKKy8qCisgKiBETV9VTE9HX0dFVF9TWU5DX0NPVU5UIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiByZWdpb25fdCAoKmdldF9zeW5jX2NvdW50KShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJdWludDY0X3QgLSB0aGUgbnVtYmVyIG9mIGluLXN5bmMgcmVnaW9ucworICoKKyAqIE5vIGluY29taW5nIHBheWxvYWQuICBLZXJuZWwtYm91bmQgcGF5bG9hZCBjb250YWlucyB0aGUgbnVtYmVyIG9mCisgKiByZWdpb25zIHRoYXQgYXJlIGluLXN5bmMgKGluIGEgc2l6ZV90KS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19HRVRfU1lOQ19DT1VOVCAgICAgICAgMTQKKworLyoKKyAqIERNX1VMT0dfU1RBVFVTX0lORk8gY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKnN0YXR1cykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBTVEFUVVNUWVBFX0lORk8sCisgKgkJIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgbWF4bGVuKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCUNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyBTVEFUVVNUWVBFX0lORk8KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19TVEFUVVNfSU5GTyAgICAgICAgICAgMTUKKworLyoKKyAqIERNX1VMT0dfU1RBVFVTX1RBQkxFIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpzdGF0dXMpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgU1RBVFVTVFlQRV9UQUJMRSwKKyAqCQkgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBtYXhsZW4pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJQ2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIFNUQVRVU1RZUEVfVEFCTEUKKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19TVEFUVVNfVEFCTEUgICAgICAgICAgMTYKKworLyoKKyAqIERNX1VMT0dfSVNfUkVNT1RFX1JFQ09WRVJJTkcgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmlzX3JlbW90ZV9yZWNvdmVyaW5nKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl1aW50NjRfdCAtIHJlZ2lvbiB0byBkZXRlcm1pbmUgcmVjb3Zlcnkgc3RhdHVzIG9uCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCXsKKyAqCQlpbnQ2NF90IGlzX3JlY292ZXJpbmc7ICAtLSAwIGlmIG5vLCAxIGlmIHllcworICoJCXVpbnQ2NF90IGluX3N5bmNfaGludDsgIC0tIGxvd2VzdCByZWdpb24gc3RpbGwgbmVlZGluZyByZXN5bmMKKyAqCX0KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19JU19SRU1PVEVfUkVDT1ZFUklORyAgMTcKKworLyoKKyAqIChETV9VTE9HX1JFUVVFU1RfTUFTSyAmIHJlcXVlc3RfdHlwZSkgdG8gZ2V0IHRoZSByZXF1ZXN0IHR5cGUKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCUEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgYXJndiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICcgJ3MKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4gICgnZGF0YV9zaXplJyBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCBzaG91bGQgYmUgMC4pCisgKgorICogV2UgYXJlIHJlc2VydmluZyA4IGJpdHMgb2YgdGhlIDMyLWJpdCAncmVxdWVzdF90eXBlJyBmaWVsZCBmb3IgdGhlCisgKiB2YXJpb3VzIHJlcXVlc3QgdHlwZXMgYWJvdmUuICBUaGUgcmVtYWluaW5nIDI0LWJpdHMgYXJlIGN1cnJlbnRseQorICogc2V0IHRvIHplcm8gYW5kIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY29tcGF0aWJpbGl0eSBjb25jZXJucy4KKyAqCisgKiBVc2VyLXNwYWNlIHNob3VsZCBhbHdheXMgdXNlIERNX1VMT0dfUkVRVUVTVF9UWVBFIHRvIGFjcXVpcmUgdGhlCisgKiByZXF1ZXN0IHR5cGUgZnJvbSB0aGUgJ3JlcXVlc3RfdHlwZScgZmllbGQgdG8gbWFpbnRhaW4gZm9yd2FyZCBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIERNX1VMT0dfUkVRVUVTVF9NQVNLIDB4RkYKKyNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX1RZUEUocmVxdWVzdF90eXBlKSBcCisJKERNX1VMT0dfUkVRVUVTVF9NQVNLICYgKHJlcXVlc3RfdHlwZSkpCisKKy8qCisgKiBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiBpcyBpbmNyZW1lbnRlZCB3aGVuIHRoZXJlIGlzIGEKKyAqIGNoYW5nZSB0byB0aGUgd2F5IGluZm9ybWF0aW9uIGlzIHBhc3NlZCBiZXR3ZWVuIGtlcm5lbAorICogYW5kIHVzZXJzcGFjZS4gIFRoaXMgY291bGQgYmUgYSBzdHJ1Y3R1cmUgY2hhbmdlIG9mCisgKiBkbV91bG9nX3JlcXVlc3Qgb3IgYSBjaGFuZ2UgaW4gdGhlIHdheSByZXF1ZXN0cyBhcmUKKyAqIGlzc3VlZC9oYW5kbGVkLiAgQ2hhbmdlcyBhcmUgb3V0bGluZWQgaGVyZToKKyAqCXZlcnNpb24gMTogIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCXZlcnNpb24gMjogIERNX1VMT0dfQ1RSIGFsbG93ZWQgdG8gcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQorICoJICAgICAgICAgICAgZGV2aWNlIG5hbWUgdGhhdCBpcyB0byBiZSByZWdpc3RlcmVkIHdpdGggRE0gdmlhCisgKgkgICAgICAgICAgICAnZG1fZ2V0X2RldmljZScuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gMgorCitzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0IHsKKwkvKgorCSAqIFRoZSBsb2NhbCB1bmlxdWUgaWRlbnRpZmllciAobHVpZCkgYW5kIHRoZSB1bml2ZXJzYWxseSB1bmlxdWUKKwkgKiBpZGVudGlmaWVyICh1dWlkKSBhcmUgdXNlZCB0byB0aWUgYSByZXF1ZXN0IHRvIGEgc3BlY2lmaWMKKwkgKiBtaXJyb3IgbG9nLiAgQSBzaW5nbGUgbWFjaGluZSBsb2cgY291bGQgcHJvYmFibHkgbWFrZSBkdWUgd2l0aAorCSAqIGp1c3QgdGhlICdsdWlkJywgYnV0IGEgY2x1c3Rlci1hd2FyZSBsb2cgbXVzdCB1c2UgdGhlICd1dWlkJyBhbmQKKwkgKiB0aGUgJ2x1aWQnLiAgVGhlIHV1aWQgaXMgd2hhdCBpcyByZXF1aXJlZCBmb3Igbm9kZSB0byBub2RlCisJICogY29tbXVuaWNhdGlvbiBjb25jZXJuaW5nIGEgcGFydGljdWxhciBsb2csIGJ1dCB0aGUgJ2x1aWQnIGhlbHBzCisJICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxvZ3MgdGhhdCBhcmUgYmVpbmcgc3dhcHBlZCBhbmQgaGF2ZSB0aGUKKwkgKiBzYW1lICd1dWlkJy4gIChUaGluayAibGl2ZSIgYW5kICJpbmFjdGl2ZSIgZGV2aWNlLW1hcHBlciB0YWJsZXMuKQorCSAqLworCXVpbnQ2NF90IGx1aWQ7CisJY2hhciB1dWlkW0RNX1VVSURfTEVOXTsKKwljaGFyIHBhZGRpbmdbM107ICAgICAgICAvKiBQYWRkaW5nIGJlY2F1c2UgRE1fVVVJRF9MRU4gPSAxMjkgKi8KKworCXVpbnQzMl90IHZlcnNpb247ICAgICAgIC8qIFNlZSBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiAqLworCWludDMyX3QgZXJyb3I7ICAgICAgICAgIC8qIFVzZWQgdG8gcmVwb3J0IGJhY2sgcHJvY2Vzc2luZyBlcnJvcnMgKi8KKworCXVpbnQzMl90IHNlcTsgICAgICAgICAgIC8qIFNlcXVlbmNlIG51bWJlciBmb3IgcmVxdWVzdCAqLworCXVpbnQzMl90IHJlcXVlc3RfdHlwZTsgIC8qIERNX1VMT0dfKiBkZWZpbmVkIGFib3ZlICovCisJdWludDMyX3QgZGF0YV9zaXplOyAgICAgLyogSG93IG11Y2ggZGF0YSAobm90IGluY2x1ZGluZyB0aGlzIHN0cnVjdCkgKi8KKworCWNoYXIgZGF0YVtdOworfTsKKworI2VuZGlmIC8qIF9fRE1fTE9HX1VTRVJTUEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYmRtL21pc2MvZG0tbG9nZ2luZy5oIGIvbGliZG0vbWlzYy9kbS1sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4OGJmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL21pc2MvZG0tbG9nZ2luZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9ETV9MT0dHSU5HX0gKKyNkZWZpbmUgX0RNX0xPR0dJTkdfSAorCisjaW5jbHVkZSAibGliZGV2bWFwcGVyLmgiCisKK2V4dGVybiBkbV9sb2dfZm4gZG1fbG9nOworZXh0ZXJuIGRtX2xvZ193aXRoX2Vycm5vX2ZuIGRtX2xvZ193aXRoX2Vycm5vOworCisjZGVmaW5lIExPR19NRVNHKGwsIGYsIGxuLCBlLCB4Li4uKSBcCisJZG8geyBcCisJCWlmIChkbV9sb2dfaXNfbm9uX2RlZmF1bHQoKSkgXAorCQkJZG1fbG9nKGwsIGYsIGxuLCAjIyB4KTsgXAorCQllbHNlIFwKKwkJCWRtX2xvZ193aXRoX2Vycm5vKGwsIGYsIGxuLCBlLCAjIyB4KTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX0xJTkUobCwgeC4uLikgTE9HX01FU0cobCwgX19GSUxFX18sIF9fTElORV9fLCAwLCAjIyB4KQorI2RlZmluZSBMT0dfTElORV9XSVRIX0VSUk5PKGwsIGUsIHguLi4pIExPR19NRVNHKGwsIF9fRklMRV9fLCBfX0xJTkVfXywgZSwgIyMgeCkKKworLyogRGVidWcgbWVzc2FnZXMgbWF5IGhhdmUgYSB0eXBlIGluc3RlYWQgb2YgYW4gZXJybm8gKi8KKyNkZWZpbmUgTE9HX0xJTkVfV0lUSF9DTEFTUyhsLCBjLCB4Li4uKSBMT0dfTUVTRyhsLCBfX0ZJTEVfXywgX19MSU5FX18sIGMsICMjIHgpCisKKyNpbmNsdWRlICJsb2cuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJkbS9taXNjL2RtbGliLmggYi9saWJkbS9taXNjL2RtbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3MzY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL21pc2MvZG1saWIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgZmlyc3QgYnkgZXZlcnkgZGV2aWNlLW1hcHBlciBsaWJyYXJ5IHNvdXJjZSBmaWxlLgorICovCisjaWZuZGVmIF9ETV9MSUJfSAorI2RlZmluZSBfRE1fTElCX0gKKworI2RlZmluZSBETQorCisjaW5jbHVkZSAibGliLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZG0vbWlzYy9rZGV2X3QuaCBiL2xpYmRtL21pc2Mva2Rldl90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4YmIwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL21pc2Mva2Rldl90LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xJQkRNX0tERVZfSAorI2RlZmluZSBfTElCRE1fS0RFVl9ICisKKyNkZWZpbmUgTUFKT1IoZGV2KSAgICAgICgoZGV2ICYgMHhmZmYwMCkgPj4gOCkKKyNkZWZpbmUgTUlOT1IoZGV2KSAgICAgICgoZGV2ICYgMHhmZikgfCAoKGRldiA+PiAxMikgJiAweGZmZjAwKSkKKyNkZWZpbmUgTUtERVYobWEsbWkpICAgICgobWkgJiAweGZmKSB8IChtYSA8PCA4KSB8ICgobWkgJiB+MHhmZikgPDwgMTIpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmRtL21tL2RiZ19tYWxsb2MuYyBiL2xpYmRtL21tL2RiZ19tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY3YmYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbW0vZGJnX21hbGxvYy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorCisjaWZkZWYgVkFMR1JJTkRfUE9PTAorI2luY2x1ZGUgIm1lbWNoZWNrLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCit2b2lkICpkbV9tYWxsb2NfYXV4KHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpIF9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgKmRtX21hbGxvY19hdXhfZGVidWcoc2l6ZV90IHMsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSkgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOwordm9pZCAqZG1femFsbG9jX2F1eChzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisgICAgICAgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKSBfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSk7Cit2b2lkICpkbV96YWxsb2NfYXV4X2RlYnVnKHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICAgICAgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpIF9fYXR0cmlidXRlX18oKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKTsKK3ZvaWQgKmRtX3JlYWxsb2NfYXV4KHZvaWQgKnAsIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICAgICAgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOwordm9pZCBkbV9mcmVlX2F1eCh2b2lkICpwKTsKK2NoYXIgKmRtX3N0cmR1cF9hdXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICAgICAgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpOworaW50IGRtX2R1bXBfbWVtb3J5X2RlYnVnKHZvaWQpOwordm9pZCBkbV9ib3VuZHNfY2hlY2tfZGVidWcodm9pZCk7CisKK2NoYXIgKmRtX3N0cmR1cF9hdXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwljaGFyICpyZXQ7CisKKwlpZiAoIXN0cikgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgImRtX3N0cmR1cCBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChyZXQgPSBkbV9tYWxsb2NfYXV4X2RlYnVnKHN0cmxlbihzdHIpICsgMSwgZmlsZSwgbGluZSkpKQorCQlzdHJjcHkocmV0LCBzdHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG1lbWJsb2NrIHsKKwlzdHJ1Y3QgbWVtYmxvY2sgKnByZXYsICpuZXh0OwkvKiBBbGwgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbGlua2VkICovCisJc2l6ZV90IGxlbmd0aDsJCS8qIFNpemUgb2YgdGhlIHJlcXVlc3RlZCBibG9jayAqLworCWludCBpZDsJCQkvKiBJbmRleCBvZiB0aGUgYmxvY2sgKi8KKwljb25zdCBjaGFyICpmaWxlOwkvKiBGaWxlIHRoYXQgYWxsb2NhdGVkICovCisJaW50IGxpbmU7CQkvKiBMaW5lIHRoYXQgYWxsb2NhdGVkICovCisJdm9pZCAqbWFnaWM7CQkvKiBBZGRyZXNzIG9mIHRoaXMgYmxvY2sgKi8KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBibG9ja19zZXJpYWxubzsvKiBOb24tZGVjcmVhc2luZyBzZXJpYWxubyBvZiBibG9jayAqLworCXVuc2lnbmVkIGJsb2Nrc19hbGxvY2F0ZWQ7IC8qIEN1cnJlbnQgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBibG9ja3NfbWF4OwkvKiBNYXggbm8gb2YgY29uY3VycmVudGx5LWFsbG9jYXRlZCBibG9ja3MgKi8KKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIG1ieXRlczsKKworfSBfbWVtX3N0YXRzID0geworMCwgMCwgMCwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgbWVtYmxvY2sgKl9oZWFkID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbWVtYmxvY2sgKl90YWlsID0gMDsKKwordm9pZCAqZG1fbWFsbG9jX2F1eF9kZWJ1ZyhzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJc3RydWN0IG1lbWJsb2NrICpuYjsKKwlzaXplX3QgdHNpemUgPSBzICsgc2l6ZW9mKCpuYikgKyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisKKwlpZiAocyA+IDUwMDAwMDAwKSB7CisJCWxvZ19lcnJvcigiSHVnZSBtZW1vcnkgYWxsb2NhdGlvbiAoc2l6ZSAlIiBQUklzaXplX3QKKwkJCSAgIikgcmVqZWN0ZWQgLSBtZXRhZGF0YSBjb3JydXB0aW9uPyIsIHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShuYiA9IG1hbGxvYyh0c2l6ZSkpKSB7CisJCWxvZ19lcnJvcigiY291bGRuJ3QgYWxsb2NhdGUgYW55IG1lbW9yeSwgc2l6ZSA9ICUiIFBSSXNpemVfdCwKKwkJCSAgcyk7CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCB1cCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvICovCisJbmItPmZpbGUgPSBmaWxlOworCW5iLT5saW5lID0gbGluZTsKKworCWRtX2JvdW5kc19jaGVjaygpOworCisJLyogc2V0dXAgZmllbGRzICovCisJbmItPm1hZ2ljID0gbmIgKyAxOworCW5iLT5sZW5ndGggPSBzOworCW5iLT5pZCA9ICsrX21lbV9zdGF0cy5ibG9ja19zZXJpYWxubzsKKwluYi0+bmV4dCA9IDA7CisKKwkvKiBzdG9tcCBhIHByZXR0eSBwYXR0ZXJuIGFjcm9zcyB0aGUgbmV3IG1lbW9yeQorCSAgIGFuZCBmaWxsIGluIHRoZSBib3VuZGFyeSBieXRlcyAqLworCXsKKwkJY2hhciAqcHRyID0gKGNoYXIgKikgKG5iICsgMSk7CisJCXNpemVfdCBpOworCQlmb3IgKGkgPSAwOyBpIDwgczsgaSsrKQorCQkJKnB0cisrID0gaSAmIDB4MSA/IChjaGFyKSAweGJhIDogKGNoYXIpIDB4YmU7CisKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1bnNpZ25lZCBsb25nKTsgaSsrKQorCQkJKnB0cisrID0gKGNoYXIpIG5iLT5pZDsKKwl9CisKKwluYi0+cHJldiA9IF90YWlsOworCisJLyogbGluayB0byB0YWlsIG9mIHRoZSBsaXN0ICovCisJaWYgKCFfaGVhZCkKKwkJX2hlYWQgPSBfdGFpbCA9IG5iOworCWVsc2UgeworCQlfdGFpbC0+bmV4dCA9IG5iOworCQlfdGFpbCA9IG5iOworCX0KKworCV9tZW1fc3RhdHMuYmxvY2tzX2FsbG9jYXRlZCsrOworCWlmIChfbWVtX3N0YXRzLmJsb2Nrc19hbGxvY2F0ZWQgPiBfbWVtX3N0YXRzLmJsb2Nrc19tYXgpCisJCV9tZW1fc3RhdHMuYmxvY2tzX21heCA9IF9tZW1fc3RhdHMuYmxvY2tzX2FsbG9jYXRlZDsKKworCV9tZW1fc3RhdHMuYnl0ZXMgKz0gczsKKwlpZiAoX21lbV9zdGF0cy5ieXRlcyA+IF9tZW1fc3RhdHMubWJ5dGVzKQorCQlfbWVtX3N0YXRzLm1ieXRlcyA9IF9tZW1fc3RhdHMuYnl0ZXM7CisKKwkvKiBsb2dfZGVidWdfbWVtKCJBbGxvY2F0ZWQ6ICV1ICV1ICV1IiwgbmItPmlkLCBfbWVtX3N0YXRzLmJsb2Nrc19hbGxvY2F0ZWQsCisJCSAgX21lbV9zdGF0cy5ieXRlcyk7ICovCisjaWZkZWYgVkFMR1JJTkRfUE9PTAorCVZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRChuYiArIDEsIHMpOworI2VuZGlmCisJcmV0dXJuIG5iICsgMTsKK30KKwordm9pZCAqZG1femFsbG9jX2F1eF9kZWJ1ZyhzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJdm9pZCAqcHRyID0gZG1fbWFsbG9jX2F1eF9kZWJ1ZyhzLCBmaWxlLCBsaW5lKTsKKworCWlmIChwdHIpCisJCW1lbXNldChwdHIsIDAsIHMpOworCisJcmV0dXJuIHB0cjsKK30KKwordm9pZCBkbV9mcmVlX2F1eCh2b2lkICpwKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgbWVtYmxvY2sgKm1iID0gKChzdHJ1Y3QgbWVtYmxvY2sgKikgcCkgLSAxOworCWlmICghcCkKKwkJcmV0dXJuOworCisJZG1fYm91bmRzX2NoZWNrKCk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlhc3NlcnQobWItPm1hZ2ljID09IHApOworI2lmZGVmIFZBTEdSSU5EX1BPT0wKKwlWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKHAsIG1iLT5sZW5ndGgpOworI2VuZGlmCisJLyogY2hlY2sgZGF0YSBhdCB0aGUgZmFyIGJvdW5kYXJ5ICovCisJcHRyID0gKGNoYXIgKikgcCArIG1iLT5sZW5ndGg7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih1bnNpZ25lZCBsb25nKTsgaSsrKQorCQlpZiAocHRyW2ldICE9IChjaGFyKSBtYi0+aWQpCisJCQlhc3NlcnQoISJEYW1hZ2UgYXQgZmFyIGVuZCBvZiBibG9jayIpOworCisJLyogaGF2ZSB3ZSBmcmVlZCB0aGlzIGJlZm9yZSA/ICovCisJYXNzZXJ0KG1iLT5pZCAhPSAwKTsKKworCS8qIHVubGluayAqLworCWlmIChtYi0+cHJldikKKwkJbWItPnByZXYtPm5leHQgPSBtYi0+bmV4dDsKKwllbHNlCisJCV9oZWFkID0gbWItPm5leHQ7CisKKwlpZiAobWItPm5leHQpCisJCW1iLT5uZXh0LT5wcmV2ID0gbWItPnByZXY7CisJZWxzZQorCQlfdGFpbCA9IG1iLT5wcmV2OworCisJbWItPmlkID0gMDsKKworCS8qIHN0b21wIGEgZGlmZmVyZW50IHBhdHRlcm4gYWNyb3NzIHRoZSBtZW1vcnkgKi8KKwlwdHIgPSBwOworCWZvciAoaSA9IDA7IGkgPCBtYi0+bGVuZ3RoOyBpKyspCisJCXB0cltpXSA9IGkgJiAxID8gKGNoYXIpIDB4ZGUgOiAoY2hhcikgMHhhZDsKKworCWFzc2VydChfbWVtX3N0YXRzLmJsb2Nrc19hbGxvY2F0ZWQpOworCV9tZW1fc3RhdHMuYmxvY2tzX2FsbG9jYXRlZC0tOworCV9tZW1fc3RhdHMuYnl0ZXMgLT0gbWItPmxlbmd0aDsKKworCS8qIGZyZWUgdGhlIG1lbW9yeSAqLworCWZyZWUobWIpOworfQorCit2b2lkICpkbV9yZWFsbG9jX2F1eCh2b2lkICpwLCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJdm9pZCAqcjsKKwlzdHJ1Y3QgbWVtYmxvY2sgKm1iID0gKChzdHJ1Y3QgbWVtYmxvY2sgKikgcCkgLSAxOworCisJciA9IGRtX21hbGxvY19hdXhfZGVidWcocywgZmlsZSwgbGluZSk7CisKKwlpZiAociAmJiBwKSB7CisJCW1lbWNweShyLCBwLCBtYi0+bGVuZ3RoKTsKKwkJZG1fZnJlZV9hdXgocCk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9kdW1wX21lbW9yeV9kZWJ1Zyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG90ID0gMDsKKwlzdHJ1Y3QgbWVtYmxvY2sgKm1iOworCWNoYXIgc3RyWzMyXTsKKworCWlmIChfaGVhZCkKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiWW91IGhhdmUgYSBtZW1vcnkgbGVhazoiKTsKKworCWZvciAobWIgPSBfaGVhZDsgbWI7IG1iID0gbWItPm5leHQpIHsKKyNpZmRlZiBWQUxHUklORF9QT09MCisJCS8qCisJCSAqIFdlIGNhbid0IGxvb2sgYXQgdGhlIG1lbW9yeSBpbiBjYXNlIGl0IGhhcyBoYWQKKwkJICogVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MgY2FsbGVkIG9uIGl0LgorCQkgKi8KKwkJc3RyWzBdID0gJ1wwJzsKKyNlbHNlCisJCXNpemVfdCBjOworCisJCWZvciAoYyA9IDA7IGMgPCBzaXplb2Yoc3RyKSAtIDE7IGMrKykgeworCQkJaWYgKGMgPj0gbWItPmxlbmd0aCkKKwkJCQlzdHJbY10gPSAnICc7CisJCQllbHNlIGlmICgoKGNoYXIgKiltYi0+bWFnaWMpW2NdID09ICdcMCcpCisJCQkJc3RyW2NdID0gJ1wwJzsKKwkJCWVsc2UgaWYgKCgoY2hhciAqKW1iLT5tYWdpYylbY10gPCAnICcpCisJCQkJc3RyW2NdID0gJz8nOworCQkJZWxzZQorCQkJCXN0cltjXSA9ICgoY2hhciAqKW1iLT5tYWdpYylbY107CisJCX0KKwkJc3RyW3NpemVvZihzdHIpIC0gMV0gPSAnXDAnOworI2VuZGlmCisKKwkJTE9HX01FU0coX0xPR19JTkZPLCBtYi0+ZmlsZSwgbWItPmxpbmUsIDAsCisJCQkgImJsb2NrICVkIGF0ICVwLCBzaXplICUiIFBSSXNpemVfdCAiXHQgWyVzXSIsCisJCQkgbWItPmlkLCBtYi0+bWFnaWMsIG1iLT5sZW5ndGgsIHN0cik7CisJCXRvdCArPSBtYi0+bGVuZ3RoOworCX0KKworCWlmIChfaGVhZCkKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiJWxkIGJ5dGVzIGxlYWtlZCBpbiB0b3RhbCIsIHRvdCk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkbV9ib3VuZHNfY2hlY2tfZGVidWcodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtYmxvY2sgKm1iID0gX2hlYWQ7CisJd2hpbGUgKG1iKSB7CisJCXNpemVfdCBpOworCQljaGFyICpwdHIgPSAoKGNoYXIgKikgKG1iICsgMSkpICsgbWItPmxlbmd0aDsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1bnNpZ25lZCBsb25nKTsgaSsrKQorCQkJaWYgKCpwdHIrKyAhPSAoY2hhcikgbWItPmlkKQorCQkJCWFzc2VydCghIk1lbW9yeSBzbWFzaCIpOworCisJCW1iID0gbWItPm5leHQ7CisJfQorfQorCit2b2lkICpkbV9tYWxsb2NfYXV4KHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgaW50IGxpbmUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJaWYgKHMgPiA1MDAwMDAwMCkgeworCQlsb2dfZXJyb3IoIkh1Z2UgbWVtb3J5IGFsbG9jYXRpb24gKHNpemUgJSIgUFJJc2l6ZV90CisJCQkgICIpIHJlamVjdGVkIC0gbWV0YWRhdGEgY29ycnVwdGlvbj8iLCBzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIG1hbGxvYyhzKTsKK30KKwordm9pZCAqZG1femFsbG9jX2F1eChzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJdm9pZCAqcHRyID0gZG1fbWFsbG9jX2F1eChzLCBmaWxlLCBsaW5lKTsKKworCWlmIChwdHIpCisJCW1lbXNldChwdHIsIDAsIHMpOworCisJcmV0dXJuIHB0cjsKK30KKworI2lmZGVmIERFQlVHX01FTQorCit2b2lkICpkbV9tYWxsb2Nfd3JhcHBlcihzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJcmV0dXJuIGRtX21hbGxvY19hdXhfZGVidWcocywgZmlsZSwgbGluZSk7Cit9CisKK3ZvaWQgKmRtX3phbGxvY193cmFwcGVyKHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlyZXR1cm4gZG1femFsbG9jX2F1eF9kZWJ1ZyhzLCBmaWxlLCBsaW5lKTsKK30KKworY2hhciAqZG1fc3RyZHVwX3dyYXBwZXIoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlyZXR1cm4gZG1fc3RyZHVwX2F1eChzdHIsIGZpbGUsIGxpbmUpOworfQorCit2b2lkIGRtX2ZyZWVfd3JhcHBlcih2b2lkICpwdHIpCit7CisJZG1fZnJlZV9hdXgocHRyKTsKK30KKwordm9pZCAqZG1fcmVhbGxvY193cmFwcGVyKHZvaWQgKnAsIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlyZXR1cm4gZG1fcmVhbGxvY19hdXgocCwgcywgZmlsZSwgbGluZSk7Cit9CisKK2ludCBkbV9kdW1wX21lbW9yeV93cmFwcGVyKHZvaWQpCit7CisJcmV0dXJuIGRtX2R1bXBfbWVtb3J5X2RlYnVnKCk7Cit9CisKK3ZvaWQgZG1fYm91bmRzX2NoZWNrX3dyYXBwZXIodm9pZCkKK3sKKwlkbV9ib3VuZHNfY2hlY2tfZGVidWcoKTsKK30KKworI2Vsc2UgLyogIURFQlVHX01FTSAqLworCit2b2lkICpkbV9tYWxsb2Nfd3JhcHBlcihzaXplX3QgcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJcmV0dXJuIGRtX21hbGxvY19hdXgocywgZmlsZSwgbGluZSk7Cit9CisKK3ZvaWQgKmRtX3phbGxvY193cmFwcGVyKHNpemVfdCBzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlyZXR1cm4gZG1femFsbG9jX2F1eChzLCBmaWxlLCBsaW5lKTsKK30KKworY2hhciAqZG1fc3RyZHVwX3dyYXBwZXIoY29uc3QgY2hhciAqc3RyLAorCQkJY29uc3QgY2hhciAqZmlsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCWludCBsaW5lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBzdHJkdXAoc3RyKTsKK30KKwordm9pZCBkbV9mcmVlX3dyYXBwZXIodm9pZCAqcHRyKQoreworCWZyZWUocHRyKTsKK30KKwordm9pZCAqZG1fcmVhbGxvY193cmFwcGVyKHZvaWQgKnAsIHVuc2lnbmVkIGludCBzLCAKKwkJCSBjb25zdCBjaGFyICpmaWxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIGludCBsaW5lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiByZWFsbG9jKHAsIHMpOworfQorCitpbnQgZG1fZHVtcF9tZW1vcnlfd3JhcHBlcih2b2lkKQoreworCXJldHVybiAxOworfQorCit2b2lkIGRtX2JvdW5kc19jaGVja193cmFwcGVyKHZvaWQpCit7Cit9CisKKyNlbmRpZiAvKiBERUJVR19NRU0gKi8KZGlmZiAtLWdpdCBhL2xpYmRtL21tL3Bvb2wtZGVidWcuYyBiL2xpYmRtL21tL3Bvb2wtZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIzMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vbW0vcG9vbC1kZWJ1Zy5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCitzdHJ1Y3QgYmxvY2sgeworCXN0cnVjdCBibG9jayAqbmV4dDsKKwlzaXplX3Qgc2l6ZTsKKwl2b2lkICpkYXRhOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGJsb2NrX3NlcmlhbG5vOwkvKiBOb24tZGVjcmVhc2luZyBzZXJpYWxubyBvZiBibG9jayAqLworCXVuc2lnbmVkIGJsb2Nrc19hbGxvY2F0ZWQ7CS8qIEN1cnJlbnQgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBibG9ja3NfbWF4OwkvKiBNYXggbm8gb2YgY29uY3VycmVudGx5LWFsbG9jYXRlZCBibG9ja3MgKi8KKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIG1heGJ5dGVzOworfSBwb29sX3N0YXRzOworCitzdHJ1Y3QgZG1fcG9vbCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKm9yaWdfcG9vbDsJLyogdG8gcGFpciBpdCB3aXRoIGZpcnN0IGFsbG9jYXRpb24gY2FsbCAqLworCXVuc2lnbmVkIGxvY2tlZDsKKwlsb25nIGNyYzsKKworCWludCBiZWd1bjsKKwlzdHJ1Y3QgYmxvY2sgKm9iamVjdDsKKworCXN0cnVjdCBibG9jayAqYmxvY2tzOworCXN0cnVjdCBibG9jayAqdGFpbDsKKworCXBvb2xfc3RhdHMgc3RhdHM7Cit9OworCisvKiBieSBkZWZhdWx0IHRoaW5ncyBjb21lIG91dCBhbGlnbmVkIGZvciBkb3VibGVzICovCisjZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UIF9fYWxpZ25vZl9fIChkb3VibGUpCisKK3N0cnVjdCBkbV9wb29sICpkbV9wb29sX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgY2h1bmtfaGludCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1femFsbG9jKHNpemVvZigqbWVtKSk7CisKKwlpZiAoIW1lbSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBtZW1vcnkgcG9vbCAlcyAoc2l6ZSAlIgorCQkJICBQUklzaXplX3QgIikiLCBuYW1lLCBzaXplb2YoKm1lbSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW0tPm5hbWUgPSBuYW1lOworCW1lbS0+b3JpZ19wb29sID0gbWVtOworCisjaWZkZWYgREVCVUdfUE9PTAorCWxvZ19kZWJ1Z19tZW0oIkNyZWF0ZWQgbWVtcG9vbCAlcyBhdCAlcCIsIG5hbWUsIG1lbSk7CisjZW5kaWYKKworCWRtX2xpc3RfYWRkKCZfZG1fcG9vbHMsICZtZW0tPmxpc3QpOworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkIF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgZG1fcG9vbCAqcCwgc3RydWN0IGJsb2NrICpiKQoreworCXN0cnVjdCBibG9jayAqbjsKKworCWlmIChwLT5sb2NrZWQpCisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX2ZyZWVfYmxvY2tzIGZyb20gbG9ja2VkIHBvb2wgJXMiLAorCQkJICBwLT5uYW1lKTsKKworCXdoaWxlIChiKSB7CisJCXAtPnN0YXRzLmJ5dGVzIC09IGItPnNpemU7CisJCXAtPnN0YXRzLmJsb2Nrc19hbGxvY2F0ZWQtLTsKKworCQluID0gYi0+bmV4dDsKKwkJZG1fZnJlZShiLT5kYXRhKTsKKwkJZG1fZnJlZShiKTsKKwkJYiA9IG47CisJfQorfQorCitzdGF0aWMgdm9pZCBfcG9vbF9zdGF0cyhzdHJ1Y3QgZG1fcG9vbCAqcCwgY29uc3QgY2hhciAqYWN0aW9uKQoreworI2lmZGVmIERFQlVHX1BPT0wKKwlsb2dfZGVidWdfbWVtKCIlcyBtZW1wb29sICVzIGF0ICVwOiAldS8ldSBieXRlcywgJXUvJXUgYmxvY2tzLCAiCisJCSAgICAgICIldSBhbGxvY2F0aW9ucykiLCBhY3Rpb24sIHAtPm5hbWUsIHAsIHAtPnN0YXRzLmJ5dGVzLAorCQkgICAgICBwLT5zdGF0cy5tYXhieXRlcywgcC0+c3RhdHMuYmxvY2tzX2FsbG9jYXRlZCwKKwkJICAgICAgcC0+c3RhdHMuYmxvY2tzX21heCwgcC0+c3RhdHMuYmxvY2tfc2VyaWFsbm8pOworI2Vsc2UKKwk7CisjZW5kaWYKK30KKwordm9pZCBkbV9wb29sX2Rlc3Ryb3koc3RydWN0IGRtX3Bvb2wgKnApCit7CisJX3Bvb2xfc3RhdHMocCwgIkRlc3Ryb3lpbmciKTsKKwlfZnJlZV9ibG9ja3MocCwgcC0+YmxvY2tzKTsKKwlkbV9saXN0X2RlbCgmcC0+bGlzdCk7CisJZG1fZnJlZShwKTsKK30KKwordm9pZCAqZG1fcG9vbF9hbGxvYyhzdHJ1Y3QgZG1fcG9vbCAqcCwgc2l6ZV90IHMpCit7CisJcmV0dXJuIGRtX3Bvb2xfYWxsb2NfYWxpZ25lZChwLCBzLCBERUZBVUxUX0FMSUdOTUVOVCk7Cit9CisKK3N0YXRpYyB2b2lkIF9hcHBlbmRfYmxvY2soc3RydWN0IGRtX3Bvb2wgKnAsIHN0cnVjdCBibG9jayAqYikKK3sKKwlpZiAocC0+bG9ja2VkKQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9hcHBlbmRfYmxvY2tzIHRvIGxvY2tlZCBwb29sICVzIiwKKwkJCSAgcC0+bmFtZSk7CisKKwlpZiAocC0+dGFpbCkgeworCQlwLT50YWlsLT5uZXh0ID0gYjsKKwkJcC0+dGFpbCA9IGI7CisJfSBlbHNlCisJCXAtPmJsb2NrcyA9IHAtPnRhaWwgPSBiOworCisJcC0+c3RhdHMuYmxvY2tfc2VyaWFsbm8rKzsKKwlwLT5zdGF0cy5ibG9ja3NfYWxsb2NhdGVkKys7CisJaWYgKHAtPnN0YXRzLmJsb2Nrc19hbGxvY2F0ZWQgPiBwLT5zdGF0cy5ibG9ja3NfbWF4KQorCQlwLT5zdGF0cy5ibG9ja3NfbWF4ID0gcC0+c3RhdHMuYmxvY2tzX2FsbG9jYXRlZDsKKworCXAtPnN0YXRzLmJ5dGVzICs9IGItPnNpemU7CisJaWYgKHAtPnN0YXRzLmJ5dGVzID4gcC0+c3RhdHMubWF4Ynl0ZXMpCisJCXAtPnN0YXRzLm1heGJ5dGVzID0gcC0+c3RhdHMuYnl0ZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKl9uZXdfYmxvY2soc2l6ZV90IHMsIHVuc2lnbmVkIGFsaWdubWVudCkKK3sKKwkvKiBGSVhNRTogSSdtIGN1cnJlbnRseSBpZ25vcmluZyB0aGUgYWxpZ25tZW50IGFyZy4gKi8KKwlzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBibG9jaykgKyBzOworCXN0cnVjdCBibG9jayAqYiA9IGRtX21hbGxvYyhsZW4pOworCisJLyoKKwkgKiBUb28gbGF6eSB0byBpbXBsZW1lbnQgYWxpZ25tZW50IGZvciBkZWJ1ZyB2ZXJzaW9uLCBhbmQKKwkgKiBJIGRvbid0IHRoaW5rIExWTSB3aWxsIHVzZSBhbnl0aGluZyBidXQgZGVmYXVsdAorCSAqIGFsaWduLgorCSAqLworCWFzc2VydChhbGlnbm1lbnQgPD0gREVGQVVMVF9BTElHTk1FTlQpOworCisJaWYgKCFiKSB7CisJCWxvZ19lcnJvcigiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShiLT5kYXRhID0gZG1fbWFsbG9jKHMpKSkgeworCQlsb2dfZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKwkJZG1fZnJlZShiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYi0+bmV4dCA9IE5VTEw7CisJYi0+c2l6ZSA9IHM7CisKKwlyZXR1cm4gYjsKK30KKwordm9pZCAqZG1fcG9vbF9hbGxvY19hbGlnbmVkKHN0cnVjdCBkbV9wb29sICpwLCBzaXplX3QgcywgdW5zaWduZWQgYWxpZ25tZW50KQoreworCXN0cnVjdCBibG9jayAqYiA9IF9uZXdfYmxvY2socywgYWxpZ25tZW50KTsKKworCWlmICghYikKKwkJcmV0dXJuX05VTEw7CisKKwlfYXBwZW5kX2Jsb2NrKHAsIGIpOworCisJcmV0dXJuIGItPmRhdGE7Cit9CisKK3ZvaWQgZG1fcG9vbF9lbXB0eShzdHJ1Y3QgZG1fcG9vbCAqcCkKK3sKKwlfcG9vbF9zdGF0cyhwLCAiRW1wdHlpbmciKTsKKwlfZnJlZV9ibG9ja3MocCwgcC0+YmxvY2tzKTsKKwlwLT5ibG9ja3MgPSBwLT50YWlsID0gTlVMTDsKK30KKwordm9pZCBkbV9wb29sX2ZyZWUoc3RydWN0IGRtX3Bvb2wgKnAsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIsICpwcmV2ID0gTlVMTDsKKworCV9wb29sX3N0YXRzKHAsICJGcmVlaW5nIChiZWZvcmUpIik7CisKKwlmb3IgKGIgPSBwLT5ibG9ja3M7IGI7IGIgPSBiLT5uZXh0KSB7CisJCWlmIChiLT5kYXRhID09IHB0cikKKwkJCWJyZWFrOworCQlwcmV2ID0gYjsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgZmlyZXMgdGhlbiB5b3UgdHJpZWQgdG8gZnJlZSBhCisJICogcG9pbnRlciB0aGF0IGVpdGhlciB3YXNuJ3QgZnJvbSB0aGlzCisJICogcG9vbCwgb3IgaXNuJ3QgdGhlIHN0YXJ0IG9mIGEgYmxvY2suCisJICovCisJYXNzZXJ0KGIpOworCisJX2ZyZWVfYmxvY2tzKHAsIGIpOworCisJaWYgKHByZXYpIHsKKwkJcC0+dGFpbCA9IHByZXY7CisJCXByZXYtPm5leHQgPSBOVUxMOworCX0gZWxzZQorCQlwLT5ibG9ja3MgPSBwLT50YWlsID0gTlVMTDsKKworCV9wb29sX3N0YXRzKHAsICJGcmVlaW5nIChhZnRlcikiKTsKK30KKworaW50IGRtX3Bvb2xfYmVnaW5fb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwLCBzaXplX3QgaW5pdF9zaXplKQoreworCWFzc2VydCghcC0+YmVndW4pOworCXAtPmJlZ3VuID0gMTsKKwlyZXR1cm4gMTsKK30KKworaW50IGRtX3Bvb2xfZ3Jvd19vYmplY3Qoc3RydWN0IGRtX3Bvb2wgKnAsIGNvbnN0IHZvaWQgKmV4dHJhLCBzaXplX3QgZGVsdGEpCit7CisJc3RydWN0IGJsb2NrICpuZXc7CisJc2l6ZV90IG5ld19zaXplOworCisJaWYgKHAtPmxvY2tlZCkKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJHcm93IG9iamVjdHMgaW4gbG9ja2VkIHBvb2wgJXMiLAorCQkJICBwLT5uYW1lKTsKKworCWlmICghZGVsdGEpCisJCWRlbHRhID0gc3RybGVuKGV4dHJhKTsKKworCWFzc2VydChwLT5iZWd1bik7CisKKwlpZiAocC0+b2JqZWN0KQorCQluZXdfc2l6ZSA9IGRlbHRhICsgcC0+b2JqZWN0LT5zaXplOworCWVsc2UKKwkJbmV3X3NpemUgPSBkZWx0YTsKKworCWlmICghKG5ldyA9IF9uZXdfYmxvY2sobmV3X3NpemUsIERFRkFVTFRfQUxJR05NRU5UKSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBleHRlbmQgb2JqZWN0LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocC0+b2JqZWN0KSB7CisJCW1lbWNweShuZXctPmRhdGEsIHAtPm9iamVjdC0+ZGF0YSwgcC0+b2JqZWN0LT5zaXplKTsKKwkJZG1fZnJlZShwLT5vYmplY3QtPmRhdGEpOworCQlkbV9mcmVlKHAtPm9iamVjdCk7CisJfQorCXAtPm9iamVjdCA9IG5ldzsKKworCW1lbWNweSgoY2hhciopbmV3LT5kYXRhICsgbmV3X3NpemUgLSBkZWx0YSwgZXh0cmEsIGRlbHRhKTsKKworCXJldHVybiAxOworfQorCit2b2lkICpkbV9wb29sX2VuZF9vYmplY3Qoc3RydWN0IGRtX3Bvb2wgKnApCit7CisJYXNzZXJ0KHAtPmJlZ3VuKTsKKwlfYXBwZW5kX2Jsb2NrKHAsIHAtPm9iamVjdCk7CisKKwlwLT5iZWd1biA9IDA7CisJcC0+b2JqZWN0ID0gTlVMTDsKKwlyZXR1cm4gcC0+dGFpbC0+ZGF0YTsKK30KKwordm9pZCBkbV9wb29sX2FiYW5kb25fb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwKQoreworCWFzc2VydChwLT5iZWd1bik7CisJZG1fZnJlZShwLT5vYmplY3QpOworCXAtPmJlZ3VuID0gMDsKKwlwLT5vYmplY3QgPSBOVUxMOworfQorCitzdGF0aWMgbG9uZyBfcG9vbF9jcmMoY29uc3Qgc3RydWN0IGRtX3Bvb2wgKnApCit7CisjaWZuZGVmIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HCisjd2FybmluZyBwb29sIGNyYyBub3QgaW1wbGVtZW50ZWQgd2l0aCBwb29sIGRlYnVnCisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcG9vbF9wcm90ZWN0KHN0cnVjdCBkbV9wb29sICpwLCBpbnQgcHJvdCkKK3sKKyNpZmRlZiBERUJVR19FTkZPUkNFX1BPT0xfTE9DS0lORworI3dhcm5pbmcgcG9vbCBtcHJvdGVjdCBub3QgaW1wbGVtZW50ZWQgd2l0aCBwb29sIGRlYnVnCisjZW5kaWYKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL21tL3Bvb2wtZmFzdC5jIGIvbGliZG0vbW0vcG9vbC1mYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjYTg1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL21tL3Bvb2wtZmFzdC5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZkZWYgVkFMR1JJTkRfUE9PTAorI2luY2x1ZGUgIm1lbWNoZWNrLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImRtbGliLmgiCisjaW5jbHVkZSA8c3RkZGVmLmg+CS8qIEZvciBtdXNsIGxpYmMgKi8KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworc3RydWN0IGNodW5rIHsKKwljaGFyICpiZWdpbiwgKmVuZDsKKwlzdHJ1Y3QgY2h1bmsgKnByZXY7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworc3RydWN0IGRtX3Bvb2wgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IGNodW5rICpjaHVuaywgKnNwYXJlX2NodW5rOwkvKiBzcGFyZV9jaHVuayBpcyBhIG9uZSBlbnRyeSBmcmVlCisJCQkJCQkgICBsaXN0IHRvIHN0b3AgJ2JvYmJsaW5nJyAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IGNodW5rX3NpemU7CisJc2l6ZV90IG9iamVjdF9sZW47CisJdW5zaWduZWQgb2JqZWN0X2FsaWdubWVudDsKKwlpbnQgbG9ja2VkOworCWxvbmcgY3JjOworfTsKKworc3RhdGljIHZvaWQgX2FsaWduX2NodW5rKHN0cnVjdCBjaHVuayAqYywgdW5zaWduZWQgYWxpZ25tZW50KTsKK3N0YXRpYyBzdHJ1Y3QgY2h1bmsgKl9uZXdfY2h1bmsoc3RydWN0IGRtX3Bvb2wgKnAsIHNpemVfdCBzKTsKK3N0YXRpYyB2b2lkIF9mcmVlX2NodW5rKHN0cnVjdCBjaHVuayAqYyk7CisKKy8qIGJ5IGRlZmF1bHQgdGhpbmdzIGNvbWUgb3V0IGFsaWduZWQgZm9yIGRvdWJsZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgX19hbGlnbm9mX18gKGRvdWJsZSkKKworc3RydWN0IGRtX3Bvb2wgKmRtX3Bvb2xfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBjaHVua19oaW50KQoreworCXNpemVfdCBuZXdfc2l6ZSA9IDEwMjQ7CisJc3RydWN0IGRtX3Bvb2wgKnAgPSBkbV96YWxsb2Moc2l6ZW9mKCpwKSk7CisKKwlpZiAoIXApIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgbWVtb3J5IHBvb2wgJXMgKHNpemUgJSIKKwkJCSAgUFJJc2l6ZV90ICIpIiwgbmFtZSwgc2l6ZW9mKCpwKSk7CisJCXJldHVybiAwOworCX0KKworCXAtPm5hbWUgPSBuYW1lOworCS8qIHJvdW5kIGNodW5rX2hpbnQgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMiAqLworCXAtPmNodW5rX3NpemUgPSBjaHVua19oaW50ICsgc2l6ZW9mKHN0cnVjdCBjaHVuayk7CisJd2hpbGUgKG5ld19zaXplIDwgcC0+Y2h1bmtfc2l6ZSkKKwkJbmV3X3NpemUgPDw9IDE7CisJcC0+Y2h1bmtfc2l6ZSA9IG5ld19zaXplOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX2RtX3Bvb2xzX211dGV4KTsKKwlkbV9saXN0X2FkZCgmX2RtX3Bvb2xzLCAmcC0+bGlzdCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJl9kbV9wb29sc19tdXRleCk7CisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgZG1fcG9vbF9kZXN0cm95KHN0cnVjdCBkbV9wb29sICpwKQoreworCXN0cnVjdCBjaHVuayAqYywgKnByOworCV9mcmVlX2NodW5rKHAtPnNwYXJlX2NodW5rKTsKKwljID0gcC0+Y2h1bms7CisJd2hpbGUgKGMpIHsKKwkJcHIgPSBjLT5wcmV2OworCQlfZnJlZV9jaHVuayhjKTsKKwkJYyA9IHByOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX2RtX3Bvb2xzX211dGV4KTsKKwlkbV9saXN0X2RlbCgmcC0+bGlzdCk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJl9kbV9wb29sc19tdXRleCk7CisJZG1fZnJlZShwKTsKK30KKwordm9pZCAqZG1fcG9vbF9hbGxvYyhzdHJ1Y3QgZG1fcG9vbCAqcCwgc2l6ZV90IHMpCit7CisJcmV0dXJuIGRtX3Bvb2xfYWxsb2NfYWxpZ25lZChwLCBzLCBERUZBVUxUX0FMSUdOTUVOVCk7Cit9CisKK3ZvaWQgKmRtX3Bvb2xfYWxsb2NfYWxpZ25lZChzdHJ1Y3QgZG1fcG9vbCAqcCwgc2l6ZV90IHMsIHVuc2lnbmVkIGFsaWdubWVudCkKK3sKKwlzdHJ1Y3QgY2h1bmsgKmMgPSBwLT5jaHVuazsKKwl2b2lkICpyOworCisJLyogcmVhbGlnbiBiZWdpbiAqLworCWlmIChjKQorCQlfYWxpZ25fY2h1bmsoYywgYWxpZ25tZW50KTsKKworCS8qIGhhdmUgd2UgZ290IHJvb20gPyAqLworCWlmICghYyB8fCAoYy0+YmVnaW4gPiBjLT5lbmQpIHx8ICgoYy0+ZW5kIC0gYy0+YmVnaW4pIDwgKGludCkgcykpIHsKKwkJLyogYWxsb2NhdGUgbmV3IGNodW5rICovCisJCXNpemVfdCBuZWVkZWQgPSBzICsgYWxpZ25tZW50ICsgc2l6ZW9mKHN0cnVjdCBjaHVuayk7CisJCWMgPSBfbmV3X2NodW5rKHAsIChuZWVkZWQgPiBwLT5jaHVua19zaXplKSA/CisJCQkgICAgICAgbmVlZGVkIDogcC0+Y2h1bmtfc2l6ZSk7CisKKwkJaWYgKCFjKQorCQkJcmV0dXJuX05VTEw7CisKKwkJX2FsaWduX2NodW5rKGMsIGFsaWdubWVudCk7CisJfQorCisJciA9IGMtPmJlZ2luOworCWMtPmJlZ2luICs9IHM7CisKKyNpZmRlZiBWQUxHUklORF9QT09MCisJVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEKHIsIHMpOworI2VuZGlmCisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkbV9wb29sX2VtcHR5KHN0cnVjdCBkbV9wb29sICpwKQoreworCXN0cnVjdCBjaHVuayAqYzsKKworCWZvciAoYyA9IHAtPmNodW5rOyBjICYmIGMtPnByZXY7IGMgPSBjLT5wcmV2KQorCQk7CisKKwlpZiAoYykKKwkJZG1fcG9vbF9mcmVlKHAsIChjaGFyICopIChjICsgMSkpOworfQorCit2b2lkIGRtX3Bvb2xfZnJlZShzdHJ1Y3QgZG1fcG9vbCAqcCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBjaHVuayAqYyA9IHAtPmNodW5rOworCisJd2hpbGUgKGMpIHsKKwkJaWYgKCgoY2hhciAqKSBjIDwgKGNoYXIgKikgcHRyKSAmJgorCQkgICAgKChjaGFyICopIGMtPmVuZCA+IChjaGFyICopIHB0cikpIHsKKwkJCWMtPmJlZ2luID0gcHRyOworI2lmZGVmIFZBTEdSSU5EX1BPT0wKKwkJCVZBTEdSSU5EX01BS0VfTUVNX05PQUNDRVNTKGMtPmJlZ2luLCBjLT5lbmQgLSBjLT5iZWdpbik7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHAtPnNwYXJlX2NodW5rKQorCQkJX2ZyZWVfY2h1bmsocC0+c3BhcmVfY2h1bmspOworCisJCWMtPmJlZ2luID0gKGNoYXIgKikgKGMgKyAxKTsKKyNpZmRlZiBWQUxHUklORF9QT09MCisgICAgICAgICAgICAgICAgVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYy0+YmVnaW4sIGMtPmVuZCAtIGMtPmJlZ2luKTsKKyNlbmRpZgorCisJCXAtPnNwYXJlX2NodW5rID0gYzsKKwkJYyA9IGMtPnByZXY7CisJfQorCisJaWYgKCFjKQorCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInBvb2xfZnJlZSBhc2tlZCB0byBmcmVlIHBvaW50ZXIgIgorCQkJICAibm90IGluIHBvb2wiKTsKKwllbHNlCisJCXAtPmNodW5rID0gYzsKK30KKworaW50IGRtX3Bvb2xfYmVnaW5fb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwLCBzaXplX3QgaGludCkKK3sKKwlzdHJ1Y3QgY2h1bmsgKmMgPSBwLT5jaHVuazsKKwljb25zdCBzaXplX3QgYWxpZ24gPSBERUZBVUxUX0FMSUdOTUVOVDsKKworCXAtPm9iamVjdF9sZW4gPSAwOworCXAtPm9iamVjdF9hbGlnbm1lbnQgPSBhbGlnbjsKKworCWlmIChjKQorCQlfYWxpZ25fY2h1bmsoYywgYWxpZ24pOworCisJaWYgKCFjIHx8IChjLT5iZWdpbiA+IGMtPmVuZCkgfHwgKChjLT5lbmQgLSBjLT5iZWdpbikgPCAoaW50KSBoaW50KSkgeworCQkvKiBhbGxvY2F0ZSBhIG5ldyBjaHVuayAqLworCQljID0gX25ld19jaHVuayhwLAorCQkJICAgICAgIGhpbnQgPiAocC0+Y2h1bmtfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgY2h1bmspKSA/CisJCQkgICAgICAgaGludCArIHNpemVvZihzdHJ1Y3QgY2h1bmspICsgYWxpZ24gOgorCQkJICAgICAgIHAtPmNodW5rX3NpemUpOworCisJCWlmICghYykKKwkJCXJldHVybiAwOworCisJCV9hbGlnbl9jaHVuayhjLCBhbGlnbik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBkbV9wb29sX2dyb3dfb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwLCBjb25zdCB2b2lkICpleHRyYSwgc2l6ZV90IGRlbHRhKQoreworCXN0cnVjdCBjaHVuayAqYyA9IHAtPmNodW5rLCAqbmM7CisKKwlpZiAoIWRlbHRhKQorCQlkZWx0YSA9IHN0cmxlbihleHRyYSk7CisKKwlpZiAoKGMtPmVuZCAtIChjLT5iZWdpbiArIHAtPm9iamVjdF9sZW4pKSA8IChpbnQpIGRlbHRhKSB7CisJCS8qIG1vdmUgaW50byBhIG5ldyBjaHVuayAqLworCQlpZiAocC0+b2JqZWN0X2xlbiArIGRlbHRhID4gKHAtPmNodW5rX3NpemUgLyAyKSkKKwkJCW5jID0gX25ld19jaHVuayhwLCAocC0+b2JqZWN0X2xlbiArIGRlbHRhKSAqIDIpOworCQllbHNlCisJCQluYyA9IF9uZXdfY2h1bmsocCwgcC0+Y2h1bmtfc2l6ZSk7CisKKwkJaWYgKCFuYykKKwkJCXJldHVybiAwOworCisJCV9hbGlnbl9jaHVuayhwLT5jaHVuaywgcC0+b2JqZWN0X2FsaWdubWVudCk7CisKKyNpZmRlZiBWQUxHUklORF9QT09MCisJCVZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRChwLT5jaHVuay0+YmVnaW4sIHAtPm9iamVjdF9sZW4pOworI2VuZGlmCisKKwkJbWVtY3B5KHAtPmNodW5rLT5iZWdpbiwgYy0+YmVnaW4sIHAtPm9iamVjdF9sZW4pOworCisjaWZkZWYgVkFMR1JJTkRfUE9PTAorCQlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyhjLT5iZWdpbiwgcC0+b2JqZWN0X2xlbik7CisjZW5kaWYKKworCQljID0gcC0+Y2h1bms7CisJfQorCisjaWZkZWYgVkFMR1JJTkRfUE9PTAorCVZBTEdSSU5EX01BS0VfTUVNX1VOREVGSU5FRChwLT5jaHVuay0+YmVnaW4gKyBwLT5vYmplY3RfbGVuLCBkZWx0YSk7CisjZW5kaWYKKworCW1lbWNweShjLT5iZWdpbiArIHAtPm9iamVjdF9sZW4sIGV4dHJhLCBkZWx0YSk7CisJcC0+b2JqZWN0X2xlbiArPSBkZWx0YTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCAqZG1fcG9vbF9lbmRfb2JqZWN0KHN0cnVjdCBkbV9wb29sICpwKQoreworCXN0cnVjdCBjaHVuayAqYyA9IHAtPmNodW5rOworCXZvaWQgKnIgPSBjLT5iZWdpbjsKKwljLT5iZWdpbiArPSBwLT5vYmplY3RfbGVuOworCXAtPm9iamVjdF9sZW4gPSAwdTsKKwlwLT5vYmplY3RfYWxpZ25tZW50ID0gREVGQVVMVF9BTElHTk1FTlQ7CisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZG1fcG9vbF9hYmFuZG9uX29iamVjdChzdHJ1Y3QgZG1fcG9vbCAqcCkKK3sKKyNpZmRlZiBWQUxHUklORF9QT09MCisJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MocC0+Y2h1bmssIHAtPm9iamVjdF9sZW4pOworI2VuZGlmCisJcC0+b2JqZWN0X2xlbiA9IDA7CisJcC0+b2JqZWN0X2FsaWdubWVudCA9IERFRkFVTFRfQUxJR05NRU5UOworfQorCitzdGF0aWMgdm9pZCBfYWxpZ25fY2h1bmsoc3RydWN0IGNodW5rICpjLCB1bnNpZ25lZCBhbGlnbm1lbnQpCit7CisJYy0+YmVnaW4gKz0gYWxpZ25tZW50IC0gKCh1bnNpZ25lZCBsb25nKSBjLT5iZWdpbiAmIChhbGlnbm1lbnQgLSAxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2h1bmsgKl9uZXdfY2h1bmsoc3RydWN0IGRtX3Bvb2wgKnAsIHNpemVfdCBzKQoreworCXN0cnVjdCBjaHVuayAqYzsKKworCWlmIChwLT5zcGFyZV9jaHVuayAmJgorCSAgICAoKHAtPnNwYXJlX2NodW5rLT5lbmQgLSBwLT5zcGFyZV9jaHVuay0+YmVnaW4pID49IChwdHJkaWZmX3QpcykpIHsKKwkJLyogcmV1c2Ugb2xkIGNodW5rICovCisJCWMgPSBwLT5zcGFyZV9jaHVuazsKKwkJcC0+c3BhcmVfY2h1bmsgPSAwOworCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfRU5GT1JDRV9QT09MX0xPQ0tJTkcKKwkJaWYgKCFwYWdlc2l6ZSkgeworCQkJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOyAvKiBsdm1fcGFnZXNpemUoKTsgKi8KKwkJCXBhZ2VzaXplX21hc2sgPSBwYWdlc2l6ZSAtIDE7CisJCX0KKwkJLyoKKwkJICogQWxsb2NhdGUgcGFnZSBhbGlnbmVkIHNpemUgc28gbWFsbG9jIGNvdWxkIHdvcmsuCisJCSAqIE90aGVyd2lzZSBwYWdlIGZhdWx0IHdvdWxkIGhhcHBlbiBmcm9tIHBvb2wgdW5yZWxhdGVkCisJCSAqIG1lbW9yeSB3cml0ZXMgb2YgaW50ZXJuYWwgbWFsbG9jIHBvaW50ZXJzLgorCQkgKi8KKyMgIGRlZmluZSBhbGlnbmVkX21hbGxvYyhzKQkocG9zaXhfbWVtYWxpZ24oKHZvaWQqKikmYywgcGFnZXNpemUsIFwKKwkJCQkJCUFMSUdOX09OX1BBR0UocykpID09IDApCisjZWxzZQorIyAgZGVmaW5lIGFsaWduZWRfbWFsbG9jKHMpCShjID0gZG1fbWFsbG9jKHMpKQorI2VuZGlmIC8qIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HICovCisJCWlmICghYWxpZ25lZF9tYWxsb2MocykpIHsKKyN1bmRlZiBhbGlnbmVkX21hbGxvYworCQkJbG9nX2Vycm9yKCJPdXQgb2YgbWVtb3J5LiAgUmVxdWVzdGVkICUiIFBSSXNpemVfdAorCQkJCSAgIiBieXRlcy4iLCBzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJYy0+YmVnaW4gPSAoY2hhciAqKSAoYyArIDEpOworCQljLT5lbmQgPSAoY2hhciAqKSBjICsgczsKKworI2lmZGVmIFZBTEdSSU5EX1BPT0wKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYy0+YmVnaW4sIGMtPmVuZCAtIGMtPmJlZ2luKTsKKyNlbmRpZgorCX0KKworCWMtPnByZXYgPSBwLT5jaHVuazsKKwlwLT5jaHVuayA9IGM7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyB2b2lkIF9mcmVlX2NodW5rKHN0cnVjdCBjaHVuayAqYykKK3sKKyNpZmRlZiBWQUxHUklORF9QT09MCisjICBpZmRlZiBERUJVR19NRU0KKwlpZiAoYykKKwkJVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEKGMgKyAxLCBjLT5lbmQgLSAoY2hhciAqKSAoYyArIDEpKTsKKyMgIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBERUJVR19FTkZPUkNFX1BPT0xfTE9DS0lORworCS8qIHNpbmNlIERFQlVHX01FTSBpcyB1c2luZyBvd24gbWVtb3J5IGxpc3QgKi8KKwlmcmVlKGMpOyAvKiBmb3IgcG9zaXhfbWVtYWxpZ24oKSAqLworI2Vsc2UKKwlkbV9mcmVlKGMpOworI2VuZGlmCit9CisKKworLyoqCisgKiBDYWxjIGNyYy9oYXNoIGZyb20gcG9vbCdzIG1lbW9yeSBjaHVua3Mgd2l0aCBpbnRlcm5hbCBwb2ludGVycworICovCitzdGF0aWMgbG9uZyBfcG9vbF9jcmMoY29uc3Qgc3RydWN0IGRtX3Bvb2wgKnApCit7CisJbG9uZyBjcmNfaGFzaCA9IDA7CisjaWZuZGVmIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HCisJY29uc3Qgc3RydWN0IGNodW5rICpjOworCWNvbnN0IGxvbmcgKnB0ciwgKmVuZDsKKworCWZvciAoYyA9IHAtPmNodW5rOyBjOyBjID0gYy0+cHJldikgeworCQllbmQgPSAoY29uc3QgbG9uZyAqKSAoYy0+YmVnaW4gPCBjLT5lbmQgPyAobG9uZykgYy0+YmVnaW4gJiB+NzogKGxvbmcpIGMtPmVuZCk7CisJCXB0ciA9IChjb25zdCBsb25nICopIGM7CisjaWZkZWYgVkFMR1JJTkRfUE9PTAorCQlWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKHB0ciwgKGVuZCAtIHB0cikgKiBzaXplb2YoKmVuZCkpOworI2VuZGlmCisJCXdoaWxlIChwdHIgPCBlbmQpIHsKKwkJCWNyY19oYXNoICs9ICpwdHIrKzsKKwkJCWNyY19oYXNoICs9IChjcmNfaGFzaCA8PCAxMCk7CisJCQljcmNfaGFzaCBePSAoY3JjX2hhc2ggPj4gNik7CisJCX0KKwl9CisjZW5kaWYgLyogREVCVUdfRU5GT1JDRV9QT09MX0xPQ0tJTkcgKi8KKworCXJldHVybiBjcmNfaGFzaDsKK30KKworc3RhdGljIGludCBfcG9vbF9wcm90ZWN0KHN0cnVjdCBkbV9wb29sICpwLCBpbnQgcHJvdCkKK3sKKyNpZmRlZiBERUJVR19FTkZPUkNFX1BPT0xfTE9DS0lORworCXN0cnVjdCBjaHVuayAqYzsKKworCWZvciAoYyA9IHAtPmNodW5rOyBjOyBjID0gYy0+cHJldikgeworCQlpZiAobXByb3RlY3QoYywgKHNpemVfdCkgKChjLT5lbmQgLSAoY2hhciAqKSBjKSAtIDEpLCBwcm90KSAhPSAwKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJtcHJvdGVjdCIsICIiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9tbS9wb29sLmMgYi9saWJkbS9tbS9wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYjYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmRtL21tL3Bvb2wuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworc3RhdGljIERNX0xJU1RfSU5JVChfZG1fcG9vbHMpOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBfZG1fcG9vbHNfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwordm9pZCBkbV9wb29sc19jaGVja19sZWFrcyh2b2lkKTsKKworI2lmZGVmIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HCisjaWZkZWYgREVCVUdfUE9PTAorI2Vycm9yIERvIG5vdCB1c2UgREVCVUdfUE9PTCB3aXRoIERFQlVHX0VORk9SQ0VfUE9PTF9MT0NLSU5HCisjZW5kaWYKKworLyoKKyAqIFVzZSBtcHJvdGVjdCBzeXN0ZW0gY2FsbCB0byBlbnN1cmUgYWxsIGxvY2tlZCBwYWdlcyBhcmUgbm90IHdyaXRhYmxlLgorICogR2VuZXJhdGVzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aXRoIHdyaXRlIGFjY2VzcyB0byB0aGUgbG9ja2VkIHBvb2wuCisgKgorICogLSBJbXBsZW1lbnRhdGlvbiBpcyB1c2luZyBwb3NpeF9tZW1hbGlnbigpIHRvIGdldCBwYWdlIGFsaWduZWQKKyAqICAgbWVtb3J5IGJsb2NrcyAoY291bGQgYmUgaW1wbGVtZW50ZWQgYWxzbyB0aHJvdWdoIG1hbGxvYykuCisgKiAtIE9ubHkgcG9vbC1mYXN0IGlzIHByb3Blcmx5IGhhbmRsZWQgZm9yIG5vdy4KKyAqIC0gQ2hlY2tzdW0gaXMgc2xvd2VyIGNvbXBhcmVkIHRvIG1wcm90ZWN0LgorICovCitzdGF0aWMgc2l6ZV90IHBhZ2VzaXplID0gMDsKK3N0YXRpYyBzaXplX3QgcGFnZXNpemVfbWFzayA9IDA7CisjZGVmaW5lIEFMSUdOX09OX1BBR0Uoc2l6ZSkgKCgoc2l6ZSkgKyAocGFnZXNpemVfbWFzaykpICYgfihwYWdlc2l6ZV9tYXNrKSkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUE9PTAorI2luY2x1ZGUgInBvb2wtZGVidWcuYyIKKyNlbHNlCisjaW5jbHVkZSAicG9vbC1mYXN0LmMiCisjZW5kaWYKKworY2hhciAqZG1fcG9vbF9zdHJkdXAoc3RydWN0IGRtX3Bvb2wgKnAsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHN0cikgKyAxOworCWNoYXIgKnJldCA9IGRtX3Bvb2xfYWxsb2MocCwgbGVuKTsKKworCWlmIChyZXQpCisJCW1lbWNweShyZXQsIHN0ciwgbGVuKTsKKworCXJldHVybiByZXQ7Cit9CisKK2NoYXIgKmRtX3Bvb2xfc3RybmR1cChzdHJ1Y3QgZG1fcG9vbCAqcCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbikKK3sKKwljaGFyICpyZXQgPSBkbV9wb29sX2FsbG9jKHAsIG4gKyAxKTsKKworCWlmIChyZXQpIHsKKwkJc3RybmNweShyZXQsIHN0ciwgbik7CisJCXJldFtuXSA9ICdcMCc7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqZG1fcG9vbF96YWxsb2Moc3RydWN0IGRtX3Bvb2wgKnAsIHNpemVfdCBzKQoreworCXZvaWQgKnB0ciA9IGRtX3Bvb2xfYWxsb2MocCwgcyk7CisKKwlpZiAocHRyKQorCQltZW1zZXQocHRyLCAwLCBzKTsKKworCXJldHVybiBwdHI7Cit9CisKK3ZvaWQgZG1fcG9vbHNfY2hlY2tfbGVha3Modm9pZCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqcDsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmX2RtX3Bvb2xzX211dGV4KTsKKwlpZiAoZG1fbGlzdF9lbXB0eSgmX2RtX3Bvb2xzKSkgeworCQlwdGhyZWFkX211dGV4X3VubG9jaygmX2RtX3Bvb2xzX211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWxvZ19lcnJvcigiWW91IGhhdmUgYSBtZW1vcnkgbGVhayAobm90IHJlbGVhc2VkIG1lbW9yeSBwb29sKToiKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocCwgJl9kbV9wb29scykgeworI2lmZGVmIERFQlVHX1BPT0wKKwkJbG9nX2Vycm9yKCIgWyVwXSAlcyAoJXUgYnl0ZXMpIiwKKwkJCSAgcC0+b3JpZ19wb29sLAorCQkJICBwLT5uYW1lLCBwLT5zdGF0cy5ieXRlcyk7CisjZWxzZQorCQlsb2dfZXJyb3IoIiBbJXBdICVzIiwgcCwgcC0+bmFtZSk7CisjZW5kaWYKKwl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJl9kbV9wb29sc19tdXRleCk7CisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbnJlbGVhc2VkIG1lbW9yeSBwb29sKHMpIGZvdW5kLiIpOworfQorCisvKioKKyAqIFN0YXR1cyBvZiBsb2NrZWQgcG9vbC4KKyAqCisgKiBccGFyYW0gcAorICogUG9vbCB0byBiZSB0ZXN0ZWQgZm9yIGxvY2sgc3RhdHVzLgorICoKKyAqIFxyZXR1cm4KKyAqIDEgd2hlbiB0aGUgcG9vbCBpcyBsb2NrZWQsIDAgb3RoZXJ3aXNlLgorICovCitpbnQgZG1fcG9vbF9sb2NrZWQoc3RydWN0IGRtX3Bvb2wgKnApCit7CisJcmV0dXJuIHAtPmxvY2tlZDsKK30KKworLyoqCisgKiBMb2NrIG1lbW9yeSBwb29sLgorICoKKyAqIFxwYXJhbSBwCisgKiBQb29sIHRvIGJlIGxvY2tlZC4KKyAqCisgKiBccGFyYW0gY3JjCisgKiBCb29sIHNwZWNpZmllcyB3aGV0aGVyIHRvIHN0b3JlIHRoZSBwb29sIGNyYy9oYXNoIGNoZWNrc3VtLgorICoKKyAqIFxyZXR1cm4KKyAqIDEgKHN1Y2Nlc3MpIHdoZW4gdGhlIHBvb2wgd2FzIHByZXBlcmx5IGxvY2tlZCwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBkbV9wb29sX2xvY2soc3RydWN0IGRtX3Bvb2wgKnAsIGludCBjcmMpCit7CisJaWYgKHAtPmxvY2tlZCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlBvb2wgJXMgaXMgYWxyZWFkeSBsb2NrZWQuIiwKKwkJCSAgcC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjcmMpCisJCXAtPmNyYyA9IF9wb29sX2NyYyhwKTsgIC8qIEdldCBjcmMgZm9yIHBvb2wgKi8KKworCWlmICghX3Bvb2xfcHJvdGVjdChwLCBQUk9UX1JFQUQpKSB7CisJCV9wb29sX3Byb3RlY3QocCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJCXJldHVybl8wOworCX0KKworCXAtPmxvY2tlZCA9IDE7CisKKwlsb2dfZGVidWdfbWVtKCJQb29sICVzIGlzIGxvY2tlZC4iLCBwLT5uYW1lKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIFVubG9jayBtZW1vcnkgcG9vbC4KKyAqCisgKiBccGFyYW0gcAorICogUG9vbCB0byBiZSB1bmxvY2tlZC4KKyAqCisgKiBccGFyYW0gY3JjCisgKiBCb29sIGVuYWJsZXMgY29tcGFyZSBvZiB0aGUgcG9vbCBjcmMvaGFzaCB3aXRoIHRoZSBzdG9yZWQgdmFsdWUKKyAqIGF0IHBvb2wgbG9jay4gVGhlIHBvb2wgaXMgbm90IHByb3Blcmx5IHVubG9ja2VkIGlmIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisgKgorICogXHJldHVybgorICogMSAoc3VjY2Vzcykgd2hlbiB0aGUgcG9vbCB3YXMgcHJvcGVybHkgdW5sb2NrZWQsIDAgb3RoZXJ3aXNlLgorICovCitpbnQgZG1fcG9vbF91bmxvY2soc3RydWN0IGRtX3Bvb2wgKnAsIGludCBjcmMpCit7CisJaWYgKCFwLT5sb2NrZWQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJQb29sICVzIGlzIGFscmVhZHkgdW5sb2NrZWQuIiwKKwkJCSAgcC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXAtPmxvY2tlZCA9IDA7CisKKwlpZiAoIV9wb29sX3Byb3RlY3QocCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSkpCisJCXJldHVybl8wOworCisJbG9nX2RlYnVnX21lbSgiUG9vbCAlcyBpcyB1bmxvY2tlZC4iLCBwLT5uYW1lKTsKKworCWlmIChjcmMgJiYgKHAtPmNyYyAhPSBfcG9vbF9jcmMocCkpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiUG9vbCAlcyBjcmMgbWlzbWF0Y2guIiwgcC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliZG0vcmVnZXgvbWF0Y2hlci5jIGIvbGliZG0vcmVnZXgvbWF0Y2hlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzcxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9yZWdleC9tYXRjaGVyLmMKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkbWxpYi5oIgorI2luY2x1ZGUgInBhcnNlX3J4LmgiCisjaW5jbHVkZSAidHRyZWUuaCIKKyNpbmNsdWRlICJhc3NlcnQuaCIKKworc3RydWN0IGRmYV9zdGF0ZSB7CisJc3RydWN0IGRmYV9zdGF0ZSAqbmV4dDsKKwlpbnQgZmluYWw7CisJZG1fYml0c2V0X3QgYml0czsKKwlzdHJ1Y3QgZGZhX3N0YXRlICpsb29rdXBbMjU2XTsKK307CisKK3N0cnVjdCBkbV9yZWdleCB7CQkvKiBJbnN0YW5jZSB2YXJpYWJsZXMgZm9yIHRoZSBsZXhlciAqLworCXN0cnVjdCBkZmFfc3RhdGUgKnN0YXJ0OworCXVuc2lnbmVkIG51bV9ub2RlczsKKyAgICAgICAgdW5zaWduZWQgbnVtX2NoYXJzZXRzOworCWludCBub2Rlc19lbnRlcmVkOworCXN0cnVjdCByeF9ub2RlICoqbm9kZXM7CisgICAgICAgIGludCBjaGFyc2V0c19lbnRlcmVkOworICAgICAgICBzdHJ1Y3Qgcnhfbm9kZSAqKmNoYXJzZXRzOworCXN0cnVjdCBkbV9wb29sICpzY3JhdGNoLCAqbWVtOworCisgICAgICAgIC8qIHN0dWZmIGZvciBvbiB0aGUgZmx5IGRmYSBjYWxjdWxhdGlvbiAqLworICAgICAgICBkbV9iaXRzZXRfdCBjaGFybWFwWzI1Nl07CisgICAgICAgIGRtX2JpdHNldF90IGRmYV9jb3B5OworICAgICAgICBzdHJ1Y3QgdHRyZWUgKnR0OworICAgICAgICBkbV9iaXRzZXRfdCBiczsKKyAgICAgICAgc3RydWN0IGRmYV9zdGF0ZSAqaCwgKnQ7Cit9OworCitzdGF0aWMgaW50IF9jb3VudF9ub2RlcyhzdHJ1Y3Qgcnhfbm9kZSAqcngpCit7CisJaW50IHIgPSAxOworCisJaWYgKHJ4LT5sZWZ0KQorCQlyICs9IF9jb3VudF9ub2RlcyhyeC0+bGVmdCk7CisKKwlpZiAocngtPnJpZ2h0KQorCQlyICs9IF9jb3VudF9ub2RlcyhyeC0+cmlnaHQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBfY291bnRfY2hhcnNldHMoc3RydWN0IHJ4X25vZGUgKnJ4KQoreworICAgICAgICBpZiAocngtPnR5cGUgPT0gQ0hBUlNFVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICByZXR1cm4gKHJ4LT5sZWZ0ID8gX2NvdW50X2NoYXJzZXRzKHJ4LT5sZWZ0KSA6IDApICsKKyAgICAgICAgICAgICAgICAocngtPnJpZ2h0ID8gX2NvdW50X2NoYXJzZXRzKHJ4LT5yaWdodCkgOiAwKTsKK30KKworc3RhdGljIHZvaWQgX2VudW1lcmF0ZV9jaGFyc2V0c19pbnRlcm5hbChzdHJ1Y3Qgcnhfbm9kZSAqcngsIHVuc2lnbmVkICppKQoreworICAgICAgICBpZiAocngtPnR5cGUgPT0gQ0hBUlNFVCkKKyAgICAgICAgICAgICAgICByeC0+Y2hhcnNldF9pbmRleCA9ICgqaSkrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJ4LT5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgX2VudW1lcmF0ZV9jaGFyc2V0c19pbnRlcm5hbChyeC0+bGVmdCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHJ4LT5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9lbnVtZXJhdGVfY2hhcnNldHNfaW50ZXJuYWwocngtPnJpZ2h0LCBpKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZW51bWVyYXRlX2NoYXJzZXRzKHN0cnVjdCByeF9ub2RlICpyeCkKK3sKKyAgICAgICAgdW5zaWduZWQgaSA9IDA7CisgICAgICAgIF9lbnVtZXJhdGVfY2hhcnNldHNfaW50ZXJuYWwocngsICZpKTsKK30KKworc3RhdGljIHZvaWQgX2ZpbGxfdGFibGUoc3RydWN0IGRtX3JlZ2V4ICptLCBzdHJ1Y3Qgcnhfbm9kZSAqcngpCit7CisJYXNzZXJ0KChyeC0+dHlwZSAhPSBPUikgfHwgKHJ4LT5sZWZ0ICYmIHJ4LT5yaWdodCkpOworCisJaWYgKHJ4LT5sZWZ0KQorCQlfZmlsbF90YWJsZShtLCByeC0+bGVmdCk7CisKKwlpZiAocngtPnJpZ2h0KQorCQlfZmlsbF90YWJsZShtLCByeC0+cmlnaHQpOworCisJbS0+bm9kZXNbbS0+bm9kZXNfZW50ZXJlZCsrXSA9IHJ4OworICAgICAgICBpZiAocngtPnR5cGUgPT0gQ0hBUlNFVCkKKyAgICAgICAgICAgICAgICBtLT5jaGFyc2V0c1ttLT5jaGFyc2V0c19lbnRlcmVkKytdID0gcng7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9iaXRzZXRzKHN0cnVjdCBkbV9yZWdleCAqbSkKK3sKKwl1bnNpZ25lZCBpOworCXN0cnVjdCByeF9ub2RlICpuOworCisJZm9yIChpID0gMDsgaSA8IG0tPm51bV9ub2RlczsgaSsrKSB7CisJCW4gPSBtLT5ub2Rlc1tpXTsKKwkJaWYgKCEobi0+Zmlyc3Rwb3MgPSBkbV9iaXRzZXRfY3JlYXRlKG0tPnNjcmF0Y2gsIG0tPm51bV9jaGFyc2V0cykpKQorCQkJcmV0dXJuXzA7CisJCWlmICghKG4tPmxhc3Rwb3MgPSBkbV9iaXRzZXRfY3JlYXRlKG0tPnNjcmF0Y2gsIG0tPm51bV9jaGFyc2V0cykpKQorCQkJcmV0dXJuXzA7CisJCWlmICghKG4tPmZvbGxvd3BvcyA9IGRtX2JpdHNldF9jcmVhdGUobS0+c2NyYXRjaCwgbS0+bnVtX2NoYXJzZXRzKSkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2NhbGNfZnVuY3Rpb25zKHN0cnVjdCBkbV9yZWdleCAqbSkKK3sKKwl1bnNpZ25lZCBpLCBqLCBmaW5hbCA9IDE7CisJc3RydWN0IHJ4X25vZGUgKnJ4LCAqYzEsICpjMjsKKworCWZvciAoaSA9IDA7IGkgPCBtLT5udW1fbm9kZXM7IGkrKykgeworCQlyeCA9IG0tPm5vZGVzW2ldOworCQljMSA9IHJ4LT5sZWZ0OworCQljMiA9IHJ4LT5yaWdodDsKKworCQlpZiAocngtPnR5cGUgPT0gQ0hBUlNFVCAmJiBkbV9iaXQocngtPmNoYXJzZXQsIFRBUkdFVF9UUkFOUykpCisJCQlyeC0+ZmluYWwgPSBmaW5hbCsrOworCisJCXN3aXRjaCAocngtPnR5cGUpIHsKKwkJY2FzZSBDQVQ6CisJCQlpZiAoYzEtPm51bGxhYmxlKQorCQkJCWRtX2JpdF91bmlvbihyeC0+Zmlyc3Rwb3MsCisJCQkJCSAgYzEtPmZpcnN0cG9zLCBjMi0+Zmlyc3Rwb3MpOworCQkJZWxzZQorCQkJCWRtX2JpdF9jb3B5KHJ4LT5maXJzdHBvcywgYzEtPmZpcnN0cG9zKTsKKworCQkJaWYgKGMyLT5udWxsYWJsZSkKKwkJCQlkbV9iaXRfdW5pb24ocngtPmxhc3Rwb3MsCisJCQkJCSAgYzEtPmxhc3Rwb3MsIGMyLT5sYXN0cG9zKTsKKwkJCWVsc2UKKwkJCQlkbV9iaXRfY29weShyeC0+bGFzdHBvcywgYzItPmxhc3Rwb3MpOworCisJCQlyeC0+bnVsbGFibGUgPSBjMS0+bnVsbGFibGUgJiYgYzItPm51bGxhYmxlOworCQkJYnJlYWs7CisKKwkJY2FzZSBQTFVTOgorCQkJZG1fYml0X2NvcHkocngtPmZpcnN0cG9zLCBjMS0+Zmlyc3Rwb3MpOworCQkJZG1fYml0X2NvcHkocngtPmxhc3Rwb3MsIGMxLT5sYXN0cG9zKTsKKwkJCXJ4LT5udWxsYWJsZSA9IGMxLT5udWxsYWJsZTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1I6CisJCQlkbV9iaXRfdW5pb24ocngtPmZpcnN0cG9zLCBjMS0+Zmlyc3Rwb3MsIGMyLT5maXJzdHBvcyk7CisJCQlkbV9iaXRfdW5pb24ocngtPmxhc3Rwb3MsIGMxLT5sYXN0cG9zLCBjMi0+bGFzdHBvcyk7CisJCQlyeC0+bnVsbGFibGUgPSBjMS0+bnVsbGFibGUgfHwgYzItPm51bGxhYmxlOworCQkJYnJlYWs7CisKKwkJY2FzZSBRVUVTVDoKKwkJY2FzZSBTVEFSOgorCQkJZG1fYml0X2NvcHkocngtPmZpcnN0cG9zLCBjMS0+Zmlyc3Rwb3MpOworCQkJZG1fYml0X2NvcHkocngtPmxhc3Rwb3MsIGMxLT5sYXN0cG9zKTsKKwkJCXJ4LT5udWxsYWJsZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIENIQVJTRVQ6CisJCQlkbV9iaXRfc2V0KHJ4LT5maXJzdHBvcywgcngtPmNoYXJzZXRfaW5kZXgpOworCQkJZG1fYml0X3NldChyeC0+bGFzdHBvcywgcngtPmNoYXJzZXRfaW5kZXgpOworCQkJcngtPm51bGxhYmxlID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVua25vd24gY2FsYyBub2RlIHR5cGUiKTsKKwkJfQorCisJCS8qCisJCSAqIGZvbGxvd3BvcyBoYXMgaXQncyBvd24gc3dpdGNoCisJCSAqIGJlY2F1c2UgUExVUyBhbmQgU1RBUiBkbyB0aGUKKwkJICogc2FtZSB0aGluZy4KKwkJICovCisJCXN3aXRjaCAocngtPnR5cGUpIHsKKwkJY2FzZSBDQVQ6CisJCQlmb3IgKGogPSAwOyBqIDwgbS0+bnVtX2NoYXJzZXRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJ4X25vZGUgKm4gPSBtLT5jaGFyc2V0c1tqXTsKKwkJCQlpZiAoZG1fYml0KGMxLT5sYXN0cG9zLCBqKSkKKwkJCQkJZG1fYml0X3VuaW9uKG4tPmZvbGxvd3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+Zm9sbG93cG9zLCBjMi0+Zmlyc3Rwb3MpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQTFVTOgorCQljYXNlIFNUQVI6CisJCQlmb3IgKGogPSAwOyBqIDwgbS0+bnVtX2NoYXJzZXRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJ4X25vZGUgKm4gPSBtLT5jaGFyc2V0c1tqXTsKKwkJCQlpZiAoZG1fYml0KHJ4LT5sYXN0cG9zLCBqKSkKKwkJCQkJZG1fYml0X3VuaW9uKG4tPmZvbGxvd3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+Zm9sbG93cG9zLCByeC0+Zmlyc3Rwb3MpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGZhX3N0YXRlICpfY3JlYXRlX2RmYV9zdGF0ZShzdHJ1Y3QgZG1fcG9vbCAqbWVtKQoreworCXJldHVybiBkbV9wb29sX3phbGxvYyhtZW0sIHNpemVvZihzdHJ1Y3QgZGZhX3N0YXRlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGZhX3N0YXRlICpfY3JlYXRlX3N0YXRlX3F1ZXVlKHN0cnVjdCBkbV9wb29sICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGZhX3N0YXRlICpkZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbV9iaXRzZXRfdCBiaXRzKQoreworCWlmICghKGRmYS0+Yml0cyA9IGRtX2JpdHNldF9jcmVhdGUobWVtLCBiaXRzWzBdKSkpICAvKiBmaXJzdCBlbGVtZW50IGlzIHRoZSBzaXplICovCisJCXJldHVybl9OVUxMOworCisJZG1fYml0X2NvcHkoZGZhLT5iaXRzLCBiaXRzKTsKKwlkZmEtPm5leHQgPSAwOworCWRmYS0+ZmluYWwgPSAtMTsKKworCXJldHVybiBkZmE7Cit9CisKK3N0YXRpYyBpbnQgX2NhbGNfc3RhdGUoc3RydWN0IGRtX3JlZ2V4ICptLCBzdHJ1Y3QgZGZhX3N0YXRlICpkZmEsIGludCBhKQoreworICAgICAgICBpbnQgc2V0X2JpdHMgPSAwLCBpOworICAgICAgICBkbV9iaXRzZXRfdCBkZmFfYml0cyA9IGRmYS0+Yml0czsKKyAgICAgICAgZG1fYml0X2FuZChtLT5kZmFfY29weSwgbS0+Y2hhcm1hcFthXSwgZGZhX2JpdHMpOworCisgICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHN0YXRlcyBpbiBmaXJzdHBvcyAqLworICAgICAgICBmb3IgKGkgPSBkbV9iaXRfZ2V0X2ZpcnN0KG0tPmRmYV9jb3B5KTsgaSA+PSAwOyBpID0gZG1fYml0X2dldF9uZXh0KG0tPmRmYV9jb3B5LCBpKSkgeworICAgICAgICAgICAgICAgIGlmIChhID09IFRBUkdFVF9UUkFOUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmYS0+ZmluYWwgPSBtLT5jaGFyc2V0c1tpXS0+ZmluYWw7CisKKyAgICAgICAgICAgICAgICBkbV9iaXRfdW5pb24obS0+YnMsIG0tPmJzLCBtLT5jaGFyc2V0c1tpXS0+Zm9sbG93cG9zKTsKKyAgICAgICAgICAgICAgICBzZXRfYml0cyA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V0X2JpdHMpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGZhX3N0YXRlICp0bXA7CisgICAgICAgICAgICAgICAgc3RydWN0IGRmYV9zdGF0ZSAqbGRmYSA9IHR0cmVlX2xvb2t1cChtLT50dCwgbS0+YnMgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxkZmEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggKi8KKwkJCWlmICghKGxkZmEgPSBfY3JlYXRlX2RmYV9zdGF0ZShtLT5tZW0pKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJdHRyZWVfaW5zZXJ0KG0tPnR0LCBtLT5icyArIDEsIGxkZmEpOworCQkJaWYgKCEodG1wID0gX2NyZWF0ZV9zdGF0ZV9xdWV1ZShtLT5zY3JhdGNoLCBsZGZhLCBtLT5icykpKQorCQkJCXJldHVybl8wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtLT5oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5oID0gbS0+dCA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT50LT5uZXh0ID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT50ID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRmYS0+bG9va3VwW2FdID0gbGRmYTsKKyAgICAgICAgICAgICAgICBkbV9iaXRfY2xlYXJfYWxsKG0tPmJzKTsKKyAgICAgICAgfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NhbGNfc3RhdGVzKHN0cnVjdCBkbV9yZWdleCAqbSwgc3RydWN0IHJ4X25vZGUgKnJ4KQoreworCXVuc2lnbmVkIGl3aWR0aCA9IChtLT5udW1fY2hhcnNldHMgLyBETV9CSVRTX1BFUl9JTlQpICsgMTsKKwlzdHJ1Y3QgZGZhX3N0YXRlICpkZmE7CisJc3RydWN0IHJ4X25vZGUgKm47CisJdW5zaWduZWQgaTsKKwlpbnQgYTsKKworCWlmICghKG0tPnR0ID0gdHRyZWVfY3JlYXRlKG0tPnNjcmF0Y2gsIGl3aWR0aCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKG0tPmJzID0gZG1fYml0c2V0X2NyZWF0ZShtLT5zY3JhdGNoLCBtLT5udW1fY2hhcnNldHMpKSkKKwkJcmV0dXJuXzA7CisKKyAgICAgICAgLyogYnVpbGQgc29tZSBjaGFyIG1hcHMgKi8KKyAgICAgICAgZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQorCQlpZiAoIShtLT5jaGFybWFwW2FdID0gZG1fYml0c2V0X2NyZWF0ZShtLT5zY3JhdGNoLCBtLT5udW1fY2hhcnNldHMpKSkKKwkJCXJldHVybl8wOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtLT5udW1fbm9kZXM7IGkrKykgeworCQluID0gbS0+bm9kZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi0+dHlwZSA9PSBDSEFSU0VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSBkbV9iaXRfZ2V0X2ZpcnN0KG4tPmNoYXJzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID49IDA7IGEgPSBkbV9iaXRfZ2V0X25leHQobi0+Y2hhcnNldCwgYSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtX2JpdF9zZXQobS0+Y2hhcm1hcFthXSwgbi0+Y2hhcnNldF9pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvKiBjcmVhdGUgZmlyc3Qgc3RhdGUgKi8KKwlpZiAoIShkZmEgPSBfY3JlYXRlX2RmYV9zdGF0ZShtLT5tZW0pKSkKKwkJcmV0dXJuXzA7CisKKwltLT5zdGFydCA9IGRmYTsKKwl0dHJlZV9pbnNlcnQobS0+dHQsIHJ4LT5maXJzdHBvcyArIDEsIGRmYSk7CisKKwkvKiBwcmltZSB0aGUgcXVldWUgKi8KKwlpZiAoIShtLT5oID0gbS0+dCA9IF9jcmVhdGVfc3RhdGVfcXVldWUobS0+c2NyYXRjaCwgZGZhLCByeC0+Zmlyc3Rwb3MpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShtLT5kZmFfY29weSA9IGRtX2JpdHNldF9jcmVhdGUobS0+c2NyYXRjaCwgbS0+bnVtX2NoYXJzZXRzKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGb3JjZXMgYWxsIHRoZSBkZmEgc3RhdGVzIHRvIGJlIGNhbGN1bGF0ZWQgdXAgZnJvbnQsIGllLiB3aGF0CisgKiBfY2FsY19zdGF0ZXMoKSB1c2VkIHRvIGRvIGJlZm9yZSB3ZSBzd2l0Y2hlZCB0byBjYWxjdWxhdGluZyBvbiBkZW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgX2ZvcmNlX3N0YXRlcyhzdHJ1Y3QgZG1fcmVnZXggKm0pCit7CisgICAgICAgIGludCBhOworCisgICAgICAgIC8qIGtlZXAgcHJvY2Vzc2luZyB1bnRpbCB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHF1ZXVlICovCisgICAgICAgIHN0cnVjdCBkZmFfc3RhdGUgKnM7CisgICAgICAgIHdoaWxlICgocyA9IG0tPmgpKSB7CisgICAgICAgICAgICAgICAgLyogcG9wIHN0YXRlIG9mZiBmcm9udCBvZiB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgICAgICBtLT5oID0gbS0+aC0+bmV4dDsKKworICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGlucHV0cyBmb3IgdGhpcyBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGRtX2JpdF9jbGVhcl9hbGwobS0+YnMpOworICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAyNTY7IGErKykKKwkJCWlmICghX2NhbGNfc3RhdGUobSwgcywgYSkpCisJCQkJcmV0dXJuXzA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKworc3RydWN0IGRtX3JlZ2V4ICpkbV9yZWdleF9jcmVhdGUoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqIGNvbnN0ICpwYXR0ZXJucywKKwkJCQkgdW5zaWduZWQgbnVtX3BhdHRlcm5zKQoreworCWNoYXIgKmFsbCwgKnB0cjsKKwl1bnNpZ25lZCBpOworCXNpemVfdCBsZW4gPSAwOworCXN0cnVjdCByeF9ub2RlICpyeDsKKwlzdHJ1Y3QgZG1fcmVnZXggKm07CisJc3RydWN0IGRtX3Bvb2wgKnNjcmF0Y2ggPSBtZW07CisKKwlpZiAoIShtID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKm0pKSkpCisJCXJldHVybl9OVUxMOworCisJLyogam9pbiB0aGUgcmVnZXhwcyB0b2dldGhlciwgZGVsaW1pdGluZyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdHRlcm5zOyBpKyspCisJCWxlbiArPSBzdHJsZW4ocGF0dGVybnNbaV0pICsgODsKKworCXB0ciA9IGFsbCA9IGRtX3Bvb2xfYWxsb2Moc2NyYXRjaCwgbGVuICsgMSk7CisKKwlpZiAoIWFsbCkKKwkJZ290b19iYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdHRlcm5zOyBpKyspIHsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiKC4qKCVzKSVjKSIsIHBhdHRlcm5zW2ldLCBUQVJHRVRfVFJBTlMpOworCQlpZiAoaSA8IChudW1fcGF0dGVybnMgLSAxKSkKKwkJCSpwdHIrKyA9ICd8JzsKKwl9CisKKwkvKiBwYXJzZSB0aGlzIGV4cHJlc3Npb24gKi8KKwlpZiAoIShyeCA9IHJ4X3BhcnNlX3RvayhzY3JhdGNoLCBhbGwsIHB0cikpKSB7CisJCWxvZ19lcnJvcigiQ291bGRuJ3QgcGFyc2UgcmVnZXgiKTsKKwkJZ290byBiYWQ7CisJfQorCisJbS0+bWVtID0gbWVtOworCW0tPnNjcmF0Y2ggPSBzY3JhdGNoOworCW0tPm51bV9ub2RlcyA9IF9jb3VudF9ub2RlcyhyeCk7CisJbS0+bnVtX2NoYXJzZXRzID0gX2NvdW50X2NoYXJzZXRzKHJ4KTsKKwlfZW51bWVyYXRlX2NoYXJzZXRzKHJ4KTsKKwlpZiAoIShtLT5ub2RlcyA9IGRtX3Bvb2xfYWxsb2Moc2NyYXRjaCwgc2l6ZW9mKCptLT5ub2RlcykgKiBtLT5udW1fbm9kZXMpKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIShtLT5jaGFyc2V0cyA9IGRtX3Bvb2xfYWxsb2Moc2NyYXRjaCwgc2l6ZW9mKCptLT5jaGFyc2V0cykgKiBtLT5udW1fY2hhcnNldHMpKSkKKwkJZ290b19iYWQ7CisKKwlfZmlsbF90YWJsZShtLCByeCk7CisKKwlpZiAoIV9jcmVhdGVfYml0c2V0cyhtKSkKKwkJZ290b19iYWQ7CisKKwlfY2FsY19mdW5jdGlvbnMobSk7CisKKwlpZiAoIV9jYWxjX3N0YXRlcyhtLCByeCkpCisJCWdvdG9fYmFkOworCisJcmV0dXJuIG07CisKKyAgICAgIGJhZDoKKwlkbV9wb29sX2ZyZWUobWVtLCBtKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRmYV9zdGF0ZSAqX3N0ZXBfbWF0Y2hlcihzdHJ1Y3QgZG1fcmVnZXggKm0sIGludCBjLCBzdHJ1Y3QgZGZhX3N0YXRlICpjcywgaW50ICpyKQoreworICAgICAgICBzdHJ1Y3QgZGZhX3N0YXRlICpuczsKKworCWlmICghKG5zID0gY3MtPmxvb2t1cFsodW5zaWduZWQgY2hhcikgY10pKSB7CisJCWlmICghX2NhbGNfc3RhdGUobSwgY3MsICh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9OVUxMOworCisJCWlmICghKG5zID0gY3MtPmxvb2t1cFsodW5zaWduZWQgY2hhcikgY10pKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAgIC8vIHl1Y2ssIHdlIGhhdmUgdG8gc3BlY2lhbCBjYXNlIHRoZSB0YXJnZXQgdHJhbnMKKwlpZiAoKG5zLT5maW5hbCA9PSAtMSkgJiYKKwkgICAgIV9jYWxjX3N0YXRlKG0sIG5zLCBUQVJHRVRfVFJBTlMpKQorICAgICAgICAgICAgICAgIHJldHVybl9OVUxMOworCisJaWYgKG5zLT5maW5hbCAmJiAobnMtPmZpbmFsID4gKnIpKQorCQkqciA9IG5zLT5maW5hbDsKKworCXJldHVybiBuczsKK30KKworaW50IGRtX3JlZ2V4X21hdGNoKHN0cnVjdCBkbV9yZWdleCAqcmVnZXgsIGNvbnN0IGNoYXIgKnMpCit7CisJc3RydWN0IGRmYV9zdGF0ZSAqY3MgPSByZWdleC0+c3RhcnQ7CisJaW50IHIgPSAwOworCisgICAgICAgIGRtX2JpdF9jbGVhcl9hbGwocmVnZXgtPmJzKTsKKwlpZiAoIShjcyA9IF9zdGVwX21hdGNoZXIocmVnZXgsIEhBVF9DSEFSLCBjcywgJnIpKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKDsgKnM7IHMrKykKKwkJaWYgKCEoY3MgPSBfc3RlcF9tYXRjaGVyKHJlZ2V4LCAqcywgY3MsICZyKSkpCisJCQlnb3RvIG91dDsKKworCV9zdGVwX21hdGNoZXIocmVnZXgsIERPTExBUl9DSEFSLCBjcywgJnIpOworCisgICAgICBvdXQ6CisJLyogc3VidHJhY3QgMSB0byBnZXQgYmFjayB0byB6ZXJvIGluZGV4ICovCisJcmV0dXJuIHIgLSAxOworfQorCisvKgorICogVGhlIG5leHQgYmxvY2sgb2YgY29kZSBjb25jZXJucyBjYWxjdWxhdGluZyBhIGZpbmdlcnByaW50IGZvciB0aGUgZGZhLgorICoKKyAqIFdlJ3JlIG5vdCBjYWxjdWxhdGluZyBhIG1pbmltYWwgZGZhIGluIF9jYWxjdWxhdGVfc3RhdGUgKG1heWJlIGEgZnV0dXJlCisgKiBpbXByb3ZlbWVudCkuICBBcyBzdWNoIGl0J3MgcG9zc2libGUgdGhhdCB0d28gbm9uLWlzb21vcnBoaWMgZGZhcworICogcmVjb2duaXNlIHRoZSBzYW1lIGxhbmd1YWdlLiAgVGhpcyBjYW4gb25seSByZWFsbHkgaGFwcGVuIGlmIHlvdSBzdGFydAorICogd2l0aCBlcXVpdmFsZW50LCBidXQgZGlmZmVyZW50IHJlZ2V4ZXMgKGZvciBleGFtcGxlIHRoZSBzaW1wbGlmaWVyIGluCisgKiBwYXJzZV9yeC5jIG1heSBoYXZlIGNoYW5nZWQpLgorICoKKyAqIFRoZSBjb2RlIGlzIGluZWZmaWNpZW50OyByZXBlYXRlZGx5IHNlYXJjaGluZyBhIHNpbmdseSBsaW5rZWQgbGlzdCBmb3IKKyAqIHByZXZpb3VzbHkgc2VlbiBub2Rlcy4gIE5vdCB3b3JyaWVkIHNpbmNlIHRoaXMgaXMgdGVzdCBjb2RlLgorICovCitzdHJ1Y3Qgbm9kZV9saXN0IHsKKyAgICAgICAgdW5zaWduZWQgbm9kZV9pZDsKKyAgICAgICAgc3RydWN0IGRmYV9zdGF0ZSAqbm9kZTsKKyAgICAgICAgc3RydWN0IG5vZGVfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBwcmludGVyIHsKKyAgICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbTsKKyAgICAgICAgc3RydWN0IG5vZGVfbGlzdCAqcGVuZGluZzsKKyAgICAgICAgc3RydWN0IG5vZGVfbGlzdCAqcHJvY2Vzc2VkOworICAgICAgICB1bnNpZ25lZCBuZXh0X2luZGV4OworfTsKKworc3RhdGljIHVpbnQzMl90IF9yYW5kb21pc2UodWludDMyX3QgbikKK3sKKyAgICAgICAgLyogMl4zMiAtIDUgKi8KKyAgICAgICAgdWludDMyX3QgY29uc3QgcHJpbWUgPSAofjApIC0gNDsKKyAgICAgICAgcmV0dXJuIG4gKiBwcmltZTsKK30KKworc3RhdGljIGludCBfc2VlbihzdHJ1Y3Qgbm9kZV9saXN0ICpuLCBzdHJ1Y3QgZGZhX3N0YXRlICpub2RlLCB1aW50MzJfdCAqaSkKK3sKKyAgICAgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgICAgICAgICBpZiAobi0+bm9kZSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaSA9IG4tPm5vZGVfaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbiA9IG4tPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFB1c2ggbm9kZSBpZiBpdCdzIG5vdCBiZWVuIHNlZW4gYmVmb3JlLCByZXR1cm5pbmcgYSB1bmlxdWUgaW5kZXguCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfcHVzaF9ub2RlKHN0cnVjdCBwcmludGVyICpwLCBzdHJ1Y3QgZGZhX3N0YXRlICpub2RlKQoreworICAgICAgICB1aW50MzJfdCBpOworCXN0cnVjdCBub2RlX2xpc3QgKm47CisKKyAgICAgICAgaWYgKF9zZWVuKHAtPnBlbmRpbmcsIG5vZGUsICZpKSB8fAorICAgICAgICAgICAgX3NlZW4ocC0+cHJvY2Vzc2VkLCBub2RlLCAmaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisKKwlpZiAoIShuID0gZG1fcG9vbF9hbGxvYyhwLT5tZW0sIHNpemVvZigqbikpKSkKKwkJcmV0dXJuXzA7CisKKwluLT5ub2RlX2lkID0gKytwLT5uZXh0X2luZGV4OyAvKiBzdGFydCBmcm9tIDEsIGtlZXAgMCBhcyBlcnJvciBjb2RlICovCisJbi0+bm9kZSA9IG5vZGU7CisJbi0+bmV4dCA9IHAtPnBlbmRpbmc7CisJcC0+cGVuZGluZyA9IG47CisKKwlyZXR1cm4gbi0+bm9kZV9pZDsKK30KKworLyoKKyAqIFBvcCB0aGUgZnJvbnQgbm9kZSwgYW5kIGZpbGwgb3V0IGl0J3MgcHJldmlvdXNseSBhc3NpZ25lZCBpbmRleC4KKyAqLworc3RhdGljIHN0cnVjdCBkZmFfc3RhdGUgKl9wb3Bfbm9kZShzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgICAgICAgc3RydWN0IGRmYV9zdGF0ZSAqbm9kZSA9IE5VTEw7CisJc3RydWN0IG5vZGVfbGlzdCAqbjsKKworCWlmIChwLT5wZW5kaW5nKSB7CisJCW4gPSBwLT5wZW5kaW5nOworICAgICAgICAgICAgICAgIHAtPnBlbmRpbmcgPSBuLT5uZXh0OworICAgICAgICAgICAgICAgIG4tPm5leHQgPSBwLT5wcm9jZXNzZWQ7CisgICAgICAgICAgICAgICAgcC0+cHJvY2Vzc2VkID0gbjsKKworICAgICAgICAgICAgICAgIG5vZGUgPSBuLT5ub2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfY29tYmluZSh1aW50MzJfdCBuMSwgdWludDMyX3QgbjIpCit7CisgICAgICAgIHJldHVybiAoKG4xIDw8IDgpIHwgKG4xID4+IDI0KSkgXiBfcmFuZG9taXNlKG4yKTsKK30KKworc3RhdGljIHVpbnQzMl90IF9maW5nZXJwcmludChzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgICAgICAgaW50IGM7CisgICAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgICAgIHN0cnVjdCBkZmFfc3RhdGUgKm5vZGU7CisKKyAgICAgICAgd2hpbGUgKChub2RlID0gX3BvcF9ub2RlKHApKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jb21iaW5lKHJlc3VsdCwgKG5vZGUtPmZpbmFsIDwgMCkgPyAwIDogbm9kZS0+ZmluYWwpOworICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jb21iaW5lKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wdXNoX25vZGUocCwgbm9kZS0+bG9va3VwW2NdKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBkbV9yZWdleF9maW5nZXJwcmludChzdHJ1Y3QgZG1fcmVnZXggKnJlZ2V4KQoreworICAgICAgICBzdHJ1Y3QgcHJpbnRlciBwOworICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1fcG9vbF9jcmVhdGUoInJlZ2V4IGZpbmdlcnByaW50IiwgMTAyNCk7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9mb3JjZV9zdGF0ZXMocmVnZXgpKQorCQlnb3RvX291dDsKKworICAgICAgICBwLm1lbSA9IG1lbTsKKyAgICAgICAgcC5wZW5kaW5nID0gTlVMTDsKKyAgICAgICAgcC5wcm9jZXNzZWQgPSBOVUxMOworICAgICAgICBwLm5leHRfaW5kZXggPSAwOworCisJaWYgKCFfcHVzaF9ub2RlKCZwLCByZWdleC0+c3RhcnQpKQorCQlnb3RvX291dDsKKworCXJlc3VsdCA9IF9maW5nZXJwcmludCgmcCk7CitvdXQ6CisgICAgICAgIGRtX3Bvb2xfZGVzdHJveShtZW0pOworCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9yZWdleC9wYXJzZV9yeC5jIGIvbGliZG0vcmVnZXgvcGFyc2VfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJhNjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vcmVnZXgvcGFyc2VfcnguYwpAQCAtMCwwICsxLDY2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKyNpbmNsdWRlICJwYXJzZV9yeC5oIgorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdGF0aWMgdm9pZCBfcmVnZXhfcHJpbnQoc3RydWN0IHJ4X25vZGUgKnJ4LCBpbnQgZGVwdGgsIHVuc2lnbmVkIHNob3dfbm9kZXMpCit7CisJaW50IGksIG51bWNoYXJzOworCisJaWYgKHJ4LT5sZWZ0KSB7CisJCWlmIChyeC0+bGVmdC0+dHlwZSAhPSBDSEFSU0VUICYmIChzaG93X25vZGVzIHx8ICghKChyeC0+dHlwZSA9PSBDQVQgfHwgcngtPnR5cGUgPT0gT1IpICYmIHJ4LT5sZWZ0LT50eXBlID09IENBVCkpKSkKKwkJCXByaW50ZigiKCIpOworCisJCV9yZWdleF9wcmludChyeC0+bGVmdCwgZGVwdGggKyAxLCBzaG93X25vZGVzKTsKKworCQlpZiAocngtPmxlZnQtPnR5cGUgIT0gQ0hBUlNFVCAmJiAoc2hvd19ub2RlcyB8fCAoISgocngtPnR5cGUgPT0gQ0FUIHx8IHJ4LT50eXBlID09IE9SKSAmJiByeC0+bGVmdC0+dHlwZSA9PSBDQVQpKSkpCisJCQlwcmludGYoIikiKTsKKwl9CisKKwkvKiBkaXNwbGF5IGluZm8gYWJvdXQgdGhlIG5vZGUgKi8KKwlzd2l0Y2ggKHJ4LT50eXBlKSB7CisJY2FzZSBDQVQ6CisJCWJyZWFrOworCisJY2FzZSBPUjoKKwkJcHJpbnRmKCJ8Iik7CisJCWJyZWFrOworCisJY2FzZSBTVEFSOgorCQlwcmludGYoIioiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBMVVM6CisJCXByaW50ZigiKyIpOworCQlicmVhazsKKworCWNhc2UgUVVFU1Q6CisJCXByaW50ZigiPyIpOworCQlicmVhazsKKworCWNhc2UgQ0hBUlNFVDoKKwkJbnVtY2hhcnMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlpZiAoZG1fYml0KHJ4LT5jaGFyc2V0LCBpKSAmJiAoaXNwcmludChpKSB8fCBpID09IEhBVF9DSEFSIHx8IGkgPT0gRE9MTEFSX0NIQVIpKQorCQkJCW51bWNoYXJzKys7CisJCWlmIChudW1jaGFycyA9PSA5NykgeworCQkJcHJpbnRmKCIuIik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobnVtY2hhcnMgPiAxKQorCQkJcHJpbnRmKCJbIik7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCWlmIChkbV9iaXQocngtPmNoYXJzZXQsIGkpKSB7CisJCQkJaWYgKGlzcHJpbnQoaSkpCisJCQkJCXByaW50ZigiJWMiLCAoY2hhcikgaSk7CisJCQkJZWxzZSBpZiAoaSA9PSBIQVRfQ0hBUikKKwkJCQkJcHJpbnRmKCJeIik7CisJCQkJZWxzZSBpZiAoaSA9PSBET0xMQVJfQ0hBUikKKwkJCQkJcHJpbnRmKCIkIik7CisJCQl9CisJCWlmIChudW1jaGFycyA+IDEpCisJCQlwcmludGYoIl0iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdHlwZSIpOworCX0KKworCWlmIChyeC0+cmlnaHQpIHsKKwkJaWYgKHJ4LT5yaWdodC0+dHlwZSAhPSBDSEFSU0VUICYmIChzaG93X25vZGVzIHx8ICghKHJ4LT50eXBlID09IENBVCAmJiByeC0+cmlnaHQtPnR5cGUgPT0gQ0FUKSAmJiByeC0+cmlnaHQtPnJpZ2h0KSkpCisJCQlwcmludGYoIigiKTsKKwkJX3JlZ2V4X3ByaW50KHJ4LT5yaWdodCwgZGVwdGggKyAxLCBzaG93X25vZGVzKTsKKwkJaWYgKHJ4LT5yaWdodC0+dHlwZSAhPSBDSEFSU0VUICYmIChzaG93X25vZGVzIHx8ICghKHJ4LT50eXBlID09IENBVCAmJiByeC0+cmlnaHQtPnR5cGUgPT0gQ0FUKSAmJiByeC0+cmlnaHQtPnJpZ2h0KSkpCisJCQlwcmludGYoIikiKTsKKwl9CisKKwlpZiAoIWRlcHRoKQorCQlwcmludGYoIlxuIik7Cit9CisjZW5kaWYgLyogREVCVUcgKi8KKworc3RydWN0IHBhcnNlX3NwIHsJCS8qIHNjcmF0Y2ggcGFkIGZvciB0aGUgcGFyc2luZyBwcm9jZXNzICovCisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlpbnQgdHlwZTsJCS8qIHRva2VuIHR5cGUsIDAgaW5kaWNhdGVzIGEgY2hhcnNldCAqLworCWRtX2JpdHNldF90IGNoYXJzZXQ7CS8qIFRoZSBjdXJyZW50IGNoYXJzZXQgKi8KKwljb25zdCBjaGFyICpjdXJzb3I7CS8qIHdoZXJlIHdlIGFyZSBpbiB0aGUgcmVnZXggKi8KKwljb25zdCBjaGFyICpyeF9lbmQ7CS8qIDFwdGUgZm9yIHRoZSBleHByZXNzaW9uIGJlaW5nIHBhcnNlZCAqLworfTsKKworc3RhdGljIHN0cnVjdCByeF9ub2RlICpfb3JfdGVybShzdHJ1Y3QgcGFyc2Vfc3AgKnBzKTsKKworc3RhdGljIHZvaWQgX3NpbmdsZV9jaGFyKHN0cnVjdCBwYXJzZV9zcCAqcHMsIHVuc2lnbmVkIGludCBjLCBjb25zdCBjaGFyICpwdHIpCit7CisJcHMtPnR5cGUgPSAwOworCXBzLT5jdXJzb3IgPSBwdHIgKyAxOworCWRtX2JpdF9jbGVhcl9hbGwocHMtPmNoYXJzZXQpOworCWRtX2JpdF9zZXQocHMtPmNoYXJzZXQsIGMpOworfQorCisvKgorICogR2V0IHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAqIFJldHVybnM6IDEgc3VjY2VzcywgMCBlbmQgb2YgaW5wdXQsIC0xIGVycm9yLgorICovCitzdGF0aWMgaW50IF9yeF9nZXRfdG9rZW4oc3RydWN0IHBhcnNlX3NwICpwcykKK3sKKwlpbnQgbmVnID0gMCwgcmFuZ2UgPSAwOworCWNoYXIgYywgbGMgPSAwOworCWNvbnN0IGNoYXIgKnB0ciA9IHBzLT5jdXJzb3I7CisJaWYgKHB0ciA9PSBwcy0+cnhfZW5kKSB7CS8qIGVuZCBvZiBpbnB1dCA/ICovCisJCXBzLT50eXBlID0gLTE7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoKnB0cikgeworCQkvKiBjaGFyc2V0cyBhbmQgbmNoYXJzZXRzICovCisJY2FzZSAnWyc6CisJCXB0cisrOworCQlpZiAoKnB0ciA9PSAnXicpIHsKKwkJCWRtX2JpdF9zZXRfYWxsKHBzLT5jaGFyc2V0KTsKKworCQkJLyogbmV2ZXIgdHJhbnNpdGlvbiBvbiB6ZXJvICovCisJCQlkbV9iaXRfY2xlYXIocHMtPmNoYXJzZXQsIDApOworCQkJbmVnID0gMTsKKwkJCXB0cisrOworCisJCX0gZWxzZQorCQkJZG1fYml0X2NsZWFyX2FsbChwcy0+Y2hhcnNldCk7CisKKwkJd2hpbGUgKChwdHIgPCBwcy0+cnhfZW5kKSAmJiAoKnB0ciAhPSAnXScpKSB7CisJCQlpZiAoKnB0ciA9PSAnXFwnKSB7CisJCQkJLyogYW4gZXNjYXBlZCBjaGFyYWN0ZXIgKi8KKwkJCQlwdHIrKzsKKwkJCQlzd2l0Y2ggKCpwdHIpIHsKKwkJCQljYXNlICduJzoKKwkJCQkJYyA9ICdcbic7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3InOgorCQkJCQljID0gJ1xyJzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAndCc6CisJCQkJCWMgPSAnXHQnOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljID0gKnB0cjsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCpwdHIgPT0gJy0nICYmIGxjKSB7CisJCQkJLyogd2UndmUgZ290IGEgcmFuZ2Ugb24gb3VyIGhhbmRzICovCisJCQkJcmFuZ2UgPSAxOworCQkJCXB0cisrOworCQkJCWlmIChwdHIgPT0gcHMtPnJ4X2VuZCkgeworCQkJCQlsb2dfZXJyb3IoIkluY29tcGxldGUgcmFuZ2UiCisJCQkJCQkgICJzcGVjaWZpY2F0aW9uIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJYyA9ICpwdHI7CisJCQl9IGVsc2UKKwkJCQljID0gKnB0cjsKKworCQkJaWYgKHJhbmdlKSB7CisJCQkJLyogYWRkIGxjIC0gYyBpbnRvIHRoZSBiaXRzZXQgKi8KKwkJCQlpZiAobGMgPiBjKSB7CisJCQkJCWNoYXIgdG1wID0gYzsKKwkJCQkJYyA9IGxjOworCQkJCQlsYyA9IHRtcDsKKwkJCQl9CisKKwkJCQlmb3IgKDsgbGMgPD0gYzsgbGMrKykgeworCQkJCQlpZiAobmVnKQorCQkJCQkJZG1fYml0X2NsZWFyKHBzLT5jaGFyc2V0LCBsYyk7CisJCQkJCWVsc2UKKwkJCQkJCWRtX2JpdF9zZXQocHMtPmNoYXJzZXQsIGxjKTsKKwkJCQl9CisJCQkJcmFuZ2UgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBhZGQgYyBpbnRvIHRoZSBiaXRzZXQgKi8KKwkJCQlpZiAobmVnKQorCQkJCQlkbV9iaXRfY2xlYXIocHMtPmNoYXJzZXQsIGMpOworCQkJCWVsc2UKKwkJCQkJZG1fYml0X3NldChwcy0+Y2hhcnNldCwgYyk7CisJCQl9CisJCQlwdHIrKzsKKwkJCWxjID0gYzsKKwkJfQorCisJCWlmIChwdHIgPj0gcHMtPnJ4X2VuZCkgeworCQkJcHMtPnR5cGUgPSAtMTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBzLT50eXBlID0gMDsKKwkJcHMtPmN1cnNvciA9IHB0ciArIDE7CisJCWJyZWFrOworCisJCS8qIFRoZXNlIGNoYXJhY3RlcnMgYXJlIHNwZWNpYWwsIHdlIGp1c3QgcmV0dXJuIHRoZWlyIEFTQ0lJCisJCSAgIGNvZGVzIGFzIHRoZSB0eXBlLiAgU29ydGVkIGludG8gYXNjZW5kaW5nIG9yZGVyIHRvIGhlbHAgdGhlCisJCSAgIGNvbXBpbGVyICovCisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJY2FzZSAnKic6CisJY2FzZSAnKyc6CisJY2FzZSAnPyc6CisJY2FzZSAnfCc6CisJCXBzLT50eXBlID0gKGludCkgKnB0cjsKKwkJcHMtPmN1cnNvciA9IHB0ciArIDE7CisJCWJyZWFrOworCisJY2FzZSAnXic6CisJCV9zaW5nbGVfY2hhcihwcywgSEFUX0NIQVIsIHB0cik7CisJCWJyZWFrOworCisJY2FzZSAnJCc6CisJCV9zaW5nbGVfY2hhcihwcywgRE9MTEFSX0NIQVIsIHB0cik7CisJCWJyZWFrOworCisJY2FzZSAnLic6CisJCS8qIFRoZSAnYWxsIGJ1dCBuZXdsaW5lJyBjaGFyYWN0ZXIgc2V0ICovCisJCXBzLT50eXBlID0gMDsKKwkJcHMtPmN1cnNvciA9IHB0ciArIDE7CisJCWRtX2JpdF9zZXRfYWxsKHBzLT5jaGFyc2V0KTsKKwkJZG1fYml0X2NsZWFyKHBzLT5jaGFyc2V0LCAoaW50KSAnXG4nKTsKKwkJZG1fYml0X2NsZWFyKHBzLT5jaGFyc2V0LCAoaW50KSAnXHInKTsKKwkJZG1fYml0X2NsZWFyKHBzLT5jaGFyc2V0LCAwKTsKKwkJYnJlYWs7CisKKwljYXNlICdcXCc6CisJCS8qIGVzY2FwZWQgY2hhcmFjdGVyICovCisJCXB0cisrOworCQlpZiAocHRyID49IHBzLT5yeF9lbmQpIHsKKwkJCWxvZ19lcnJvcigiQmFkbHkgcXVvdGVkIGNoYXJhY3RlciBhdCBlbmQgIgorCQkJCSAgIm9mIGV4cHJlc3Npb24iKTsKKwkJCXBzLT50eXBlID0gLTE7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlwcy0+dHlwZSA9IDA7CisJCXBzLT5jdXJzb3IgPSBwdHIgKyAxOworCQlkbV9iaXRfY2xlYXJfYWxsKHBzLT5jaGFyc2V0KTsKKwkJc3dpdGNoICgqcHRyKSB7CisJCWNhc2UgJ24nOgorCQkJZG1fYml0X3NldChwcy0+Y2hhcnNldCwgKGludCkgJ1xuJyk7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlkbV9iaXRfc2V0KHBzLT5jaGFyc2V0LCAoaW50KSAnXHInKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWRtX2JpdF9zZXQocHMtPmNoYXJzZXQsIChpbnQpICdcdCcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkbV9iaXRfc2V0KHBzLT5jaGFyc2V0LCAoaW50KSAqcHRyKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIGFkZCBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gdGhlIGJpdHNldCAqLworCQlwcy0+dHlwZSA9IDA7CisJCXBzLT5jdXJzb3IgPSBwdHIgKyAxOworCQlkbV9iaXRfY2xlYXJfYWxsKHBzLT5jaGFyc2V0KTsKKwkJZG1fYml0X3NldChwcy0+Y2hhcnNldCwgKGludCkgKHVuc2lnbmVkIGNoYXIpICpwdHIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCByeF9ub2RlICpfbm9kZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBpbnQgdHlwZSwKKwkJCSAgICAgc3RydWN0IHJ4X25vZGUgKmwsIHN0cnVjdCByeF9ub2RlICpyKQoreworCXN0cnVjdCByeF9ub2RlICpuID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKm4pKTsKKworCWlmIChuKSB7CisJCWlmICh0eXBlID09IENIQVJTRVQgJiYgIShuLT5jaGFyc2V0ID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIDI1NikpKSB7CisJCQlkbV9wb29sX2ZyZWUobWVtLCBuKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbi0+dHlwZSA9IHR5cGU7CisJCW4tPmxlZnQgPSBsOworCQluLT5yaWdodCA9IHI7CisJfQorCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgcnhfbm9kZSAqX3Rlcm0oc3RydWN0IHBhcnNlX3NwICpwcykKK3sKKwlzdHJ1Y3Qgcnhfbm9kZSAqbjsKKworCXN3aXRjaCAocHMtPnR5cGUpIHsKKwljYXNlIDA6CisJCWlmICghKG4gPSBfbm9kZShwcy0+bWVtLCBDSEFSU0VULCBOVUxMLCBOVUxMKSkpCisJCQlyZXR1cm5fTlVMTDsKKworCQlkbV9iaXRfY29weShuLT5jaGFyc2V0LCBwcy0+Y2hhcnNldCk7CisJCV9yeF9nZXRfdG9rZW4ocHMpOwkvKiBtYXRjaCBjaGFyc2V0ICovCisJCWJyZWFrOworCisJY2FzZSAnKCc6CisJCV9yeF9nZXRfdG9rZW4ocHMpOwkvKiBtYXRjaCAnKCcgKi8KKwkJbiA9IF9vcl90ZXJtKHBzKTsKKwkJaWYgKHBzLT50eXBlICE9ICcpJykgeworCQkJbG9nX2Vycm9yKCJtaXNzaW5nICcpJyBpbiByZWd1bGFyIGV4cHJlc3Npb24iKTsKKwkJCXJldHVybiAwOworCQl9CisJCV9yeF9nZXRfdG9rZW4ocHMpOwkvKiBtYXRjaCAnKScgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQluID0gMDsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCByeF9ub2RlICpfY2xvc3VyZV90ZXJtKHN0cnVjdCBwYXJzZV9zcCAqcHMpCit7CisJc3RydWN0IHJ4X25vZGUgKmwsICpuOworCisJaWYgKCEobCA9IF90ZXJtKHBzKSkpCisJCXJldHVybiBOVUxMOworCisJZm9yICg7OykgeworCQlzd2l0Y2ggKHBzLT50eXBlKSB7CisJCWNhc2UgJyonOgorCQkJbiA9IF9ub2RlKHBzLT5tZW0sIFNUQVIsIGwsIE5VTEwpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnKyc6CisJCQluID0gX25vZGUocHMtPm1lbSwgUExVUywgbCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJCW4gPSBfbm9kZShwcy0+bWVtLCBRVUVTVCwgbCwgTlVMTCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGw7CisJCX0KKworCQlpZiAoIW4pCisJCQlyZXR1cm5fTlVMTDsKKworCQlfcnhfZ2V0X3Rva2VuKHBzKTsKKwkJbCA9IG47CisJfQorCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgcnhfbm9kZSAqX2NhdF90ZXJtKHN0cnVjdCBwYXJzZV9zcCAqcHMpCit7CisJc3RydWN0IHJ4X25vZGUgKmwsICpyLCAqbjsKKworCWlmICghKGwgPSBfY2xvc3VyZV90ZXJtKHBzKSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBzLT50eXBlID09ICd8JykKKwkJcmV0dXJuIGw7CisKKwlpZiAoIShyID0gX2NhdF90ZXJtKHBzKSkpCisJCXJldHVybiBsOworCisJaWYgKCEobiA9IF9ub2RlKHBzLT5tZW0sIENBVCwgbCwgcikpKQorCQlzdGFjazsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IHJ4X25vZGUgKl9vcl90ZXJtKHN0cnVjdCBwYXJzZV9zcCAqcHMpCit7CisJc3RydWN0IHJ4X25vZGUgKmwsICpyLCAqbjsKKworCWlmICghKGwgPSBfY2F0X3Rlcm0ocHMpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocHMtPnR5cGUgIT0gJ3wnKQorCQlyZXR1cm4gbDsKKworCV9yeF9nZXRfdG9rZW4ocHMpOwkJLyogbWF0Y2ggJ3wnICovCisKKwlpZiAoIShyID0gX29yX3Rlcm0ocHMpKSkgeworCQlsb2dfZXJyb3IoIkJhZGx5IGZvcm1lZCAnb3InIGV4cHJlc3Npb24iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEobiA9IF9ub2RlKHBzLT5tZW0sIE9SLCBsLCByKSkpCisJCXN0YWNrOworCisJcmV0dXJuIG47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1hY3JvcyBmb3IgbGVmdCBhbmQgcmlnaHQgbm9kZXMuICBJbnZlcnRlZCBpZiAnbGVmdG1vc3QnIGlzIHNldC4gKi8KKyNkZWZpbmUgTEVGVChhKSAobGVmdG1vc3QgPyAoYSktPmxlZnQgOiAoYSktPnJpZ2h0KQorI2RlZmluZSBSSUdIVChhKSAobGVmdG1vc3QgPyAoYSktPnJpZ2h0IDogKGEpLT5sZWZ0KQorCisvKgorICogVGhlIG9wdGltaXNlciBzcG90cyBjb21tb24gcHJlZml4ZXMgb24gZWl0aGVyIHNpZGUgb2YgYW4gJ29yJyBub2RlLCBhbmQKKyAqIGxpZnRzIHRoZW0gb3V0c2lkZSB0aGUgJ29yJyB3aXRoIGEgJ2NhdCcuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfZGVwdGgoc3RydWN0IHJ4X25vZGUgKnIsIHVuc2lnbmVkIGxlZnRtb3N0KQoreworCWludCBjb3VudCA9IDE7CisKKwl3aGlsZSAoci0+dHlwZSAhPSBDSEFSU0VUICYmIExFRlQocikgJiYgKGxlZnRtb3N0IHx8IHItPnR5cGUgIT0gT1IpKSB7CisJCWNvdW50Kys7CisJCXIgPSBMRUZUKHIpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIEZJWE1FOiBhIHVuaXF1ZSBrZXkgY291bGQgYmUgYnVpbHQgdXAgYXMgcGFydCBvZiB0aGUgcGFyc2UsIHRvIG1ha2UgdGhlCisgKiBjb21wYXJpc29uIHF1aWNrLiAgQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCB1c2UgY29ucy1oYXNoaW5nLCBhbmQgdGhlbgorICogdGhpcyB3b3VsZCBzaW1wbHkgYmUgYSBwb2ludGVyIGNvbXBhcmlzb24uCisgKi8KK3N0YXRpYyBpbnQgX25vZGVzX2VxdWFsKHN0cnVjdCByeF9ub2RlICpsLCBzdHJ1Y3Qgcnhfbm9kZSAqcikKK3sKKwlpZiAobC0+dHlwZSAhPSByLT50eXBlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobC0+dHlwZSkgeworCWNhc2UgQ0FUOgorCWNhc2UgT1I6CisJCXJldHVybiBfbm9kZXNfZXF1YWwobC0+bGVmdCwgci0+bGVmdCkgJiYKKwkJCV9ub2Rlc19lcXVhbChsLT5yaWdodCwgci0+cmlnaHQpOworCisJY2FzZSBTVEFSOgorCWNhc2UgUExVUzoKKwljYXNlIFFVRVNUOgorCQlyZXR1cm4gX25vZGVzX2VxdWFsKGwtPmxlZnQsIHItPmxlZnQpOworCisJY2FzZSBDSEFSU0VUOgorCQkvKgorCQkgKiBOZXZlciBjaGFuZ2UgYW55dGhpbmcgY29udGFpbmluZyBUQVJHRVRfVFJBTlMKKwkJICogdXNlZCBieSBtYXRjaGVyIGFzIGJvdW5kYXJ5IG1hcmtlciBiZXR3ZWVuIGNvbmNhdGVuYXRlZAorCQkgKiBleHByZXNzaW9ucy4KKwkJICovCisJCXJldHVybiAoIWRtX2JpdChsLT5jaGFyc2V0LCBUQVJHRVRfVFJBTlMpICYmIGRtX2JpdHNldF9lcXVhbChsLT5jaGFyc2V0LCByLT5jaGFyc2V0KSk7CisJfQorCisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybl8wOworfQorCitzdGF0aWMgaW50IF9maW5kX2xlZnRtb3N0X2NvbW1vbihzdHJ1Y3Qgcnhfbm9kZSAqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgcnhfbm9kZSAqKmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgcnhfbm9kZSAqKnIsCisJCQkJIHVuc2lnbmVkIGxlZnRtb3N0KQoreworCXN0cnVjdCByeF9ub2RlICpsZWZ0ID0gb3ItPmxlZnQsICpyaWdodCA9IG9yLT5yaWdodDsKKwl1bnNpZ25lZCBsZWZ0X2RlcHRoID0gX2RlcHRoKGxlZnQsIGxlZnRtb3N0KTsKKwl1bnNpZ25lZCByaWdodF9kZXB0aCA9IF9kZXB0aChyaWdodCwgbGVmdG1vc3QpOworCisJd2hpbGUgKGxlZnRfZGVwdGggPiByaWdodF9kZXB0aCAmJiBsZWZ0LT50eXBlICE9IE9SKSB7CisJCWxlZnQgPSBMRUZUKGxlZnQpOworCQlsZWZ0X2RlcHRoLS07CisJfQorCisJd2hpbGUgKHJpZ2h0X2RlcHRoID4gbGVmdF9kZXB0aCAmJiByaWdodC0+dHlwZSAhPSBPUikgeworCQlyaWdodCA9IExFRlQocmlnaHQpOworCQlyaWdodF9kZXB0aC0tOworCX0KKworCWlmIChsZWZ0X2RlcHRoICE9IHJpZ2h0X2RlcHRoKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChsZWZ0X2RlcHRoKSB7CisJCWlmIChsZWZ0LT50eXBlID09IENBVCAmJiByaWdodC0+dHlwZSA9PSBDQVQpIHsKKwkJCWlmIChfbm9kZXNfZXF1YWwoTEVGVChsZWZ0KSwgTEVGVChyaWdodCkpKSB7CisJCQkJKmwgPSBsZWZ0OworCQkJCSpyID0gcmlnaHQ7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJaWYgKGxlZnQtPnR5cGUgPT0gT1IgfHwgcmlnaHQtPnR5cGUgPT0gT1IpCisJCQlicmVhazsKKwkJbGVmdCA9IExFRlQobGVmdCk7CisJCXJpZ2h0ID0gTEVGVChyaWdodCk7CisJCWxlZnRfZGVwdGgtLTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgdG9wIG5vZGUgaXMgT1IsIHJvdGF0ZSAobGVmdG1vc3QgZXhhbXBsZSkgZnJvbSAoKGFiKXwoKGFjKXxkKSkgdG8gKCgoYWIpfChhYykpfGQpICovCitzdGF0aWMgaW50IF9yb3RhdGVfb3JzKHN0cnVjdCByeF9ub2RlICpyLCB1bnNpZ25lZCBsZWZ0bW9zdCkKK3sKKwlzdHJ1Y3Qgcnhfbm9kZSAqb2xkX25vZGU7CisKKwlpZiAoci0+dHlwZSAhPSBPUiB8fCBSSUdIVChyKS0+dHlwZSAhPSBPUikKKwkJcmV0dXJuIDA7CisKKwlvbGRfbm9kZSA9IFJJR0hUKHIpOworCisJaWYgKGxlZnRtb3N0KSB7CisJCXItPnJpZ2h0ID0gUklHSFQob2xkX25vZGUpOworCQlvbGRfbm9kZS0+cmlnaHQgPSBMRUZUKG9sZF9ub2RlKTsKKwkJb2xkX25vZGUtPmxlZnQgPSBMRUZUKHIpOworCQlyLT5sZWZ0ID0gb2xkX25vZGU7CisJfSBlbHNlIHsKKwkJci0+bGVmdCA9IFJJR0hUKG9sZF9ub2RlKTsKKwkJb2xkX25vZGUtPmxlZnQgPSBMRUZUKG9sZF9ub2RlKTsKKwkJb2xkX25vZGUtPnJpZ2h0ID0gTEVGVChyKTsKKwkJci0+cmlnaHQgPSBvbGRfbm9kZTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCByeF9ub2RlICpfZXhjaGFuZ2Vfbm9kZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IHJ4X25vZGUgKnIsCisJCQkJICAgICAgIHN0cnVjdCByeF9ub2RlICpsZWZ0X2NhdCwgc3RydWN0IHJ4X25vZGUgKnJpZ2h0X2NhdCwKKwkJCQkgICAgICAgdW5zaWduZWQgbGVmdG1vc3QpCit7CisJc3RydWN0IHJ4X25vZGUgKm5ld19yOworCisJaWYgKGxlZnRtb3N0KQorCQluZXdfciA9IF9ub2RlKG1lbSwgQ0FULCBMRUZUKGxlZnRfY2F0KSwgcik7CisJZWxzZQorCQluZXdfciA9IF9ub2RlKG1lbSwgQ0FULCByLCBMRUZUKHJpZ2h0X2NhdCkpOworCisJaWYgKCFuZXdfcikKKwkJcmV0dXJuX05VTEw7CisKKwltZW1jcHkobGVmdF9jYXQsIFJJR0hUKGxlZnRfY2F0KSwgc2l6ZW9mKCpsZWZ0X2NhdCkpOworCW1lbWNweShyaWdodF9jYXQsIFJJR0hUKHJpZ2h0X2NhdCksIHNpemVvZigqcmlnaHRfY2F0KSk7CisKKwlyZXR1cm4gbmV3X3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgcnhfbm9kZSAqX3Bhc3Moc3RydWN0IGRtX3Bvb2wgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJ4X25vZGUgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY2hhbmdlZCkKK3sKKwlzdHJ1Y3Qgcnhfbm9kZSAqbGVmdCwgKnJpZ2h0OworCisJLyoKKwkgKiB3YWxrIHRoZSB0cmVlLCBvcHRpbWlzaW5nIGV2ZXJ5ICdvcicgbm9kZS4KKwkgKi8KKwlzd2l0Y2ggKHItPnR5cGUpIHsKKwljYXNlIENBVDoKKwkJaWYgKCEoci0+bGVmdCA9IF9wYXNzKG1lbSwgci0+bGVmdCwgY2hhbmdlZCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJaWYgKCEoci0+cmlnaHQgPSBfcGFzcyhtZW0sIHItPnJpZ2h0LCBjaGFuZ2VkKSkpCisJCQlyZXR1cm5fTlVMTDsKKworCQlicmVhazsKKworCWNhc2UgU1RBUjoKKwljYXNlIFBMVVM6CisJY2FzZSBRVUVTVDoKKwkJaWYgKCEoci0+bGVmdCA9IF9wYXNzKG1lbSwgci0+bGVmdCwgY2hhbmdlZCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJYnJlYWs7CisJY2FzZSBPUjoKKwkJLyogSXQncyBpbXBvcnRhbnQgd2Ugb3B0aW1pc2Ugc3ViIG5vZGVzIGZpcnN0ICovCisJCWlmICghKHItPmxlZnQgPSBfcGFzcyhtZW0sIHItPmxlZnQsIGNoYW5nZWQpKSkKKwkJCXJldHVybl9OVUxMOworCisJCWlmICghKHItPnJpZ2h0ID0gX3Bhc3MobWVtLCByLT5yaWdodCwgY2hhbmdlZCkpKQorCQkJcmV0dXJuX05VTEw7CisJCS8qCisJCSAqIElmIHJvdGF0ZV9vcnMgY2hhbmdlcyB0aGUgdHJlZSwgbGVmdCBhbmQgcmlnaHQgYXJlIHN0YWxlLAorCQkgKiBzbyBqdXN0IHNldCAnY2hhbmdlZCcgdG8gcmVwZWF0IHRoZSBzZWFyY2guCisJCSAqCisJCSAqIEZJWE1FIENoZWNrIHdlIGNhbid0ICdib3VuY2UnIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgcm90YXRpb25zIGhlcmUuCisJCSAqLworCQlpZiAoX2ZpbmRfbGVmdG1vc3RfY29tbW9uKHIsICZsZWZ0LCAmcmlnaHQsIDEpKSB7CisJCQlpZiAoIV9yb3RhdGVfb3JzKHIsIDEpKQorCQkJCXIgPSBfZXhjaGFuZ2Vfbm9kZXMobWVtLCByLCBsZWZ0LCByaWdodCwgMSk7CisJCQkqY2hhbmdlZCA9IDE7CisJCX0gZWxzZSBpZiAoX2ZpbmRfbGVmdG1vc3RfY29tbW9uKHIsICZsZWZ0LCAmcmlnaHQsIDApKSB7CisJCQlpZiAoIV9yb3RhdGVfb3JzKHIsIDApKQorCQkJCXIgPSBfZXhjaGFuZ2Vfbm9kZXMobWVtLCByLCBsZWZ0LCByaWdodCwgMCk7CisJCQkqY2hhbmdlZCA9IDE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENIQVJTRVQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IHJ4X25vZGUgKl9vcHRpbWlzZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3Qgcnhfbm9kZSAqcikKK3sKKwkvKgorCSAqIFdlJ3JlIGxvb2tpbmcgZm9yIChvciAoLi4uIChjYXQgPGZvbz4gYSkpICguLi4gKGNhdCA8Zm9vPiBiKSkpCisJICogYW5kIHdhbnQgdG8gdHVybiBpdCBpbnRvIChjYXQgPGZvbz4gKG9yICguLi4gYSkgKC4uLiBiKSkpCisJICoKKwkgKiAoZmEpfChmYikgYmVjb21lcyBmKGF8YikKKwkgKi8KKworCS8qCisJICogSW5pdGlhbGx5IGRvbmUgYXMgYW4gaW5lZmZpY2llbnQgbXVsdGlwYXNzIGFsZ29yaXRobS4KKwkgKi8KKwlpbnQgY2hhbmdlZDsKKworCWRvIHsKKwkJY2hhbmdlZCA9IDA7CisJCXIgPSBfcGFzcyhtZW0sIHIsICZjaGFuZ2VkKTsKKwl9IHdoaWxlIChyICYmIGNoYW5nZWQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCByeF9ub2RlICpyeF9wYXJzZV90b2soc3RydWN0IGRtX3Bvb2wgKm1lbSwKKwkJCSAgICAgY29uc3QgY2hhciAqYmVnaW4sIGNvbnN0IGNoYXIgKmVuZCkKK3sKKwlzdHJ1Y3Qgcnhfbm9kZSAqcjsKKwlzdHJ1Y3QgcGFyc2Vfc3AgKnBzID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKnBzKSk7CisKKwlpZiAoIXBzKQorCQlyZXR1cm5fTlVMTDsKKworCXBzLT5tZW0gPSBtZW07CisJaWYgKCEocHMtPmNoYXJzZXQgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgMjU2KSkpIHsKKwkJbG9nX2Vycm9yKCJSZWdleCBjaGFyc2V0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWRtX3Bvb2xfZnJlZShtZW0sIHBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXBzLT5jdXJzb3IgPSBiZWdpbjsKKwlwcy0+cnhfZW5kID0gZW5kOworCV9yeF9nZXRfdG9rZW4ocHMpOwkJLyogbG9hZCB0aGUgZmlyc3QgdG9rZW4gKi8KKworCWlmICghKHIgPSBfb3JfdGVybShwcykpKSB7CisJCWxvZ19lcnJvcigiUGFyc2UgZXJyb3IgaW4gcmVnZXgiKTsKKwkJZG1fcG9vbF9mcmVlKG1lbSwgcHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShyID0gX29wdGltaXNlKG1lbSwgcikpKSB7CisJCWxvZ19lcnJvcigiUmVnZXggb3B0aW1pc2F0aW9uIGVycm9yIik7CisJCWRtX3Bvb2xfZnJlZShtZW0sIHBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0cnVjdCByeF9ub2RlICpyeF9wYXJzZV9zdHIoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiByeF9wYXJzZV90b2sobWVtLCBzdHIsIHN0ciArIHN0cmxlbihzdHIpKTsKK30KZGlmZiAtLWdpdCBhL2xpYmRtL3JlZ2V4L3BhcnNlX3J4LmggYi9saWJkbS9yZWdleC9wYXJzZV9yeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTcwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkbS9yZWdleC9wYXJzZV9yeC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfRE1fUEFSU0VfUkVHRVhfSAorI2RlZmluZSBfRE1fUEFSU0VfUkVHRVhfSAorCitlbnVtIHsKKwlDQVQsCisJU1RBUiwKKwlQTFVTLAorCU9SLAorCVFVRVNULAorCUNIQVJTRVQKK307CisKKy8qCisgKiBXZSdyZSBuZXZlciBnb2luZyB0byBiZSBydW5uaW5nIHRoZSByZWdleCBvbiBub24tcHJpbnRhYmxlCisgKiBjaGFycywgc28gd2UgY2FuIHVzZSBhIGNvdXBsZSBvZiB0aGVzZSBjaGFycyB0byByZXByZXNlbnQgdGhlCisgKiBzdGFydCBhbmQgZW5kIG9mIGEgc3RyaW5nLgorICovCisjZGVmaW5lIEhBVF9DSEFSIDB4MgorI2RlZmluZSBET0xMQVJfQ0hBUiAweDMKKworI2RlZmluZSBUQVJHRVRfVFJBTlMgJ1wwJworCitzdHJ1Y3Qgcnhfbm9kZSB7CisJaW50IHR5cGU7CisJZG1fYml0c2V0X3QgY2hhcnNldDsKKwlzdHJ1Y3Qgcnhfbm9kZSAqbGVmdCwgKnJpZ2h0OworCisJLyogdXNlZCB0byBidWlsZCB0aGUgZGZhIGZvciB0aGUgdG9rZXIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhcnNldF9pbmRleDsKKwlpbnQgbnVsbGFibGUsIGZpbmFsOworCWRtX2JpdHNldF90IGZpcnN0cG9zOworCWRtX2JpdHNldF90IGxhc3Rwb3M7CisJZG1fYml0c2V0X3QgZm9sbG93cG9zOworfTsKKworc3RydWN0IHJ4X25vZGUgKnJ4X3BhcnNlX3N0cihzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpzdHIpOworc3RydWN0IHJ4X25vZGUgKnJ4X3BhcnNlX3RvayhzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICAgICBjb25zdCBjaGFyICpiZWdpbiwgY29uc3QgY2hhciAqZW5kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJkbS9yZWdleC90dHJlZS5jIGIvbGliZG0vcmVnZXgvdHRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU0ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vcmVnZXgvdHRyZWUuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkZXZpY2UtbWFwcGVyIHVzZXJzcGFjZSB0b29scy4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZG1saWIuaCIKKyNpbmNsdWRlICJ0dHJlZS5oIgorCitzdHJ1Y3Qgbm9kZSB7CisJdW5zaWduZWQgazsKKwlzdHJ1Y3Qgbm9kZSAqbCwgKm0sICpyOworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgdHRyZWUgeworCWludCBrbGVuOworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IG5vZGUgKnJvb3Q7Cit9OworCitfX2F0dHJpYnV0ZV9fKChub25udWxsKDEpKSkKK3N0YXRpYyBzdHJ1Y3Qgbm9kZSAqKl9sb29rdXBfc2luZ2xlKHN0cnVjdCBub2RlICoqYywgdW5zaWduZWQgaW50IGspCit7CisJd2hpbGUgKCpjKSB7CisJCWlmIChrIDwgKCpjKS0+aykKKwkJCWMgPSAmKCgqYyktPmwpOworCisJCWVsc2UgaWYgKGsgPiAoKmMpLT5rKQorCQkJYyA9ICYoKCpjKS0+cik7CisKKwkJZWxzZSB7CisJCQljID0gJigoKmMpLT5tKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGM7Cit9CisKK3ZvaWQgKnR0cmVlX2xvb2t1cChzdHJ1Y3QgdHRyZWUgKnR0LCB1bnNpZ25lZCAqa2V5KQoreworCXN0cnVjdCBub2RlICoqYyA9ICZ0dC0+cm9vdDsKKwlpbnQgY291bnQgPSB0dC0+a2xlbjsKKworCXdoaWxlICgqYyAmJiBjb3VudCkgeworCQljID0gX2xvb2t1cF9zaW5nbGUoYywgKmtleSsrKTsKKwkJY291bnQtLTsKKwl9CisKKwlyZXR1cm4gKmMgPyAoKmMpLT5kYXRhIDogTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBub2RlICpfdHJlZV9ub2RlKHN0cnVjdCBkbV9wb29sICptZW0sIHVuc2lnbmVkIGludCBrKQoreworCXN0cnVjdCBub2RlICpuID0gZG1fcG9vbF96YWxsb2MobWVtLCBzaXplb2YoKm4pKTsKKworCWlmIChuKQorCQluLT5rID0gazsKKworCXJldHVybiBuOworfQorCitpbnQgdHRyZWVfaW5zZXJ0KHN0cnVjdCB0dHJlZSAqdHQsIHVuc2lnbmVkIGludCAqa2V5LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBub2RlICoqYyA9ICZ0dC0+cm9vdDsKKwlpbnQgY291bnQgPSB0dC0+a2xlbjsKKwl1bnNpZ25lZCBpbnQgazsKKworCWRvIHsKKwkJayA9ICprZXkrKzsKKwkJYyA9IF9sb29rdXBfc2luZ2xlKGMsIGspOworCQljb3VudC0tOworCisJfSB3aGlsZSAoKmMgJiYgY291bnQpOworCisJaWYgKCEqYykgeworCQljb3VudCsrOworCisJCXdoaWxlIChjb3VudC0tKSB7CisJCQlpZiAoISgqYyA9IF90cmVlX25vZGUodHQtPm1lbSwgaykpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoY291bnQpIHsKKwkJCQlrID0gKmtleSsrOworCQkJCWMgPSAmKCgqYyktPm0pOworCQkJfQorCQl9CisJfQorCSgqYyktPmRhdGEgPSBkYXRhOworCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCB0dHJlZSAqdHRyZWVfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0sIHVuc2lnbmVkIGludCBrbGVuKQoreworCXN0cnVjdCB0dHJlZSAqdHQ7CisKKwlpZiAoISh0dCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCp0dCkpKSkKKwkJcmV0dXJuX05VTEw7CisKKwl0dC0+a2xlbiA9IGtsZW47CisJdHQtPm1lbSA9IG1lbTsKKwlyZXR1cm4gdHQ7Cit9CmRpZmYgLS1naXQgYS9saWJkbS9yZWdleC90dHJlZS5oIGIvbGliZG0vcmVnZXgvdHRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYyMTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZG0vcmVnZXgvdHRyZWUuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0RNX1RUUkVFX0gKKyNkZWZpbmUgX0RNX1RUUkVFX0gKKworc3RydWN0IHR0cmVlOworCitzdHJ1Y3QgdHRyZWUgKnR0cmVlX2NyZWF0ZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCB1bnNpZ25lZCBpbnQga2xlbik7CisKK3ZvaWQgKnR0cmVlX2xvb2t1cChzdHJ1Y3QgdHRyZWUgKnR0LCB1bnNpZ25lZCAqa2V5KTsKK2ludCB0dHJlZV9pbnNlcnQoc3RydWN0IHR0cmVlICp0dCwgdW5zaWduZWQgKmtleSwgdm9pZCAqZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibHZtLy5leHBvcnRlZF9zeW1ib2xzIGIvbGlibHZtLy5leHBvcnRlZF9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJsdm0vLmV4cG9ydGVkX3N5bWJvbHMKZGlmZiAtLWdpdCBhL2xpYmx2bS9Eb3h5ZmlsZSBiL2xpYmx2bS9Eb3h5ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJlOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibHZtL0RveHlmaWxlCkBAIC0wLDAgKzEsMjU0IEBACisjIERveHlmaWxlIDEuNS43LjEKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPQorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9CitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG94eWdlbi1vdXRwdXQKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK0FMSUFTRVMgICAgICAgICAgICAgICAgPQorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCitTSE9XX0RJUkVDVE9SSUVTICAgICAgID0gTk8KK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBZRVMKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQorTEFZT1VUX0ZJTEUgICAgICAgICAgICA9CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTlBVVCAgICAgICAgICAgICAgICAgID0gLi8KK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gTk8KK0VYQ0xVREUgICAgICAgICAgICAgICAgPQorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCitFWENMVURFX1BBVFRFUk5TICAgICAgID0KK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQorRVhBTVBMRV9QQVRIICAgICAgICAgICA9IC4uL3Rlc3QvYXBpCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0KK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworSU1BR0VfUEFUSCAgICAgICAgICAgICA9CitJTlBVVF9GSUxURVIgICAgICAgICAgID0KK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPQorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBOTworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorSFRNTF9IRUFERVIgICAgICAgICAgICA9CitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0KK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPQorSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KK0NITV9GSUxFICAgICAgICAgICAgICAgPQorSEhDX0xPQ0FUSU9OICAgICAgICAgICA9CitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQorQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworUUNIX0ZJTEUgICAgICAgICAgICAgICA9CitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk9ORQorVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPQorTEFURVhfSEVBREVSICAgICAgICAgICA9CitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9CitSVEZfRVhURU5TSU9OU19GSUxFICAgID0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IFlFUworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorWE1MX1NDSEVNQSAgICAgICAgICAgICA9CitYTUxfRFREICAgICAgICAgICAgICAgID0KK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBOTworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IE5PCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCitJTkNMVURFX1BBVEggICAgICAgICAgID0gLi4vbGliZG0KK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPQorUFJFREVGSU5FRCAgICAgICAgICAgICA9CitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0KK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFHRklMRVMgICAgICAgICAgICAgICA9CitHRU5FUkFURV9UQUdGSUxFICAgICAgID0KK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0KK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEZyZWVTYW5zCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPQorQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBZRVMKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworRE9UX1BBVEggICAgICAgICAgICAgICA9CitET1RGSUxFX0RJUlMgICAgICAgICAgID0KK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIHRoZSBzZWFyY2ggZW5naW5lCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KZGlmZiAtLWdpdCBhL2xpYmx2bS9NYWtlZmlsZS5pbiBiL2xpYmx2bS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTIyMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibHZtL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsODQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitTT1VSQ0VTID1cCisJbHZtX21pc2MuYyBcCisJbHZtX3Byb3AuYyBcCisJbHZtX2Jhc2UuYyBcCisJbHZtX2x2LmMgXAorCWx2bV9wdi5jIFwKKwlsdm1fdmcuYworCitMSUJfTkFNRSA9IGxpYmx2bTJhcHAKK0xJQl9WRVJTSU9OID0gJChMSUJfVkVSU0lPTl9BUFApCisKK2lmZXEgKCJAU1RBVElDX0xJTktAIiwgInllcyIpCisgIExJQl9TVEFUSUMgPSAkKExJQl9OQU1FKS5hCitlbmRpZgorCitMSUJfU0hBUkVEID0gJChMSUJfTkFNRSkuJChMSUJfU1VGRklYKQorCitDTEVBTl9UQVJHRVRTICs9IGxpYmx2bS5jZmxvdyAkKExJQl9OQU1FKS5hCisKK0VYUE9SVEVEX0hFQURFUiA9ICQoc3JjZGlyKS9sdm0yYXBwLmgKK0VYUE9SVEVEX0ZOX1BSRUZJWCA9IGx2bQorCitMRERFUFMgKz0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJsdm0taW50ZXJuYWwuYQorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworTElCUyArPSAkKExWTUlOVEVSTkFMX0xJQlMpIC1sZGV2bWFwcGVyCisKK2lmZXEgKCJARE1FVkVOVERAIiwgInllcyIpCisgIExJQlMgKz0gLWxkZXZtYXBwZXItZXZlbnQKK2VuZGlmCisKKy5QSE9OWTogaW5zdGFsbF9keW5hbWljIGluc3RhbGxfc3RhdGljIGluc3RhbGxfaW5jbHVkZSBpbnN0YWxsX3BrZ2NvbmZpZworCitJTlNUQUxMX1RZUEUgPSBpbnN0YWxsX2R5bmFtaWMKKworaWZlcSAoIkBTVEFUSUNfTElOS0AiLCAieWVzIikKKyAgSU5TVEFMTF9UWVBFICs9IGluc3RhbGxfc3RhdGljCitlbmRpZgorCitpZmVxICgiQFBLR0NPTkZJR0AiLCAieWVzIikKKyAgSU5TVEFMTF9UWVBFICs9IGluc3RhbGxfcGtnY29uZmlnCitlbmRpZgorCitpbnN0YWxsOiAkKElOU1RBTExfVFlQRSkgaW5zdGFsbF9pbmNsdWRlCisKK2luc3RhbGxfaW5jbHVkZTogJChzcmNkaXIpL2x2bTJhcHAuaAorCSQoSU5TVEFMTF9EQVRBKSAtRCAkPCAkKGluY2x1ZGVkaXIpLyQoPEYpCisKK2luc3RhbGxfZHluYW1pYzogaW5zdGFsbF9saWJfc2hhcmVkCisKK2luc3RhbGxfc3RhdGljOiAkKExJQl9TVEFUSUMpCisJJChJTlNUQUxMX0RBVEEpIC1EICQ8ICQodXNybGliZGlyKS8kKDxGKQorCitpbnN0YWxsX3BrZ2NvbmZpZzogJChMSUJfTkFNRSkucGMKKwkkKElOU1RBTExfREFUQSkgLUQgJDwgJChwa2djb25maWdkaXIpL2x2bTJhcHAucGMKKworbGlibHZtLmNmbG93OiAkKFNPVVJDRVMpCisJc2V0IC1lOyAoZWNobyAtbiAiU09VUkNFUyArPSAiOyBcCisJCSBlY2hvICQoU09VUkNFUykgfCBcCisJCSBzZWQgInMvXi8gLztzLyAvICQodG9wX3NyY2RpcilcL2xpYmx2bVwvL2c7cy8kJC8vIjsgXAorCQkgKSA+ICRACisKK2NmbG93OiBsaWJsdm0uY2Zsb3cKKworRElTVENMRUFOX1RBUkdFVFMgKz0gJChMSUJfTkFNRSkucGMKZGlmZiAtLWdpdCBhL2xpYmx2bS9saWJsdm0yYXBwLnBjLmluIGIvbGlibHZtL2xpYmx2bTJhcHAucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3ZmQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9saWJsdm0yYXBwLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsdm0yYXBwCitEZXNjcmlwdGlvbjogbHZtMiBhcHBsaWNhdGlvbiBsaWJyYXJ5CitWZXJzaW9uOiBATFZNX01BSk9SQC5ATFZNX0xJQkFQSUAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IAorTGliczogLUwke2xpYmRpcn0gLWxsdm0yYXBwCitSZXF1aXJlcy5wcml2YXRlOiBkZXZtYXBwZXIgQEJMS0lEX1BDQApkaWZmIC0tZ2l0IGEvbGlibHZtL2x2bTJhcHAuaCBiL2xpYmx2bS9sdm0yYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1M2IyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm0yYXBwLmgKQEAgLTAsMCArMSwxOTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX0xJQl9MVk0yQVBQX0gKKyNkZWZpbmUgX0xJQl9MVk0yQVBQX0gKKworI2luY2x1ZGUgPGxpYmRldm1hcHBlci5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFdBUk5JTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOT1RFOiBUaGlzIEFQSSBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc3ViamVjdCB0byBjaGFuZ2UgYXQgYW55IHRpbWUuCisgKgorICogUGxlYXNlIHNlbmQgZmVlZGJhY2sgdG8gbHZtLWRldmVsQHJlZGhhdC5jb20KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogV0FSTklORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXNpZ24gT3ZlcnZpZXcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogXG1haW5wYWdlIExWTSBsaWJyYXJ5IEFQSQorICoKKyAqIFRoZSBBUEkgaXMgZGVzaWduZWQgYXJvdW5kIHRoZSBmb2xsb3dpbmcgYmFzaWMgTFZNIG9iamVjdHM6CisgKiAxKSBQaHlzaWNhbCBWb2x1bWUgKHB2X3QpIDIpIFZvbHVtZSBHcm91cCAodmdfdCkgMykgTG9naWNhbCBWb2x1bWUgKGx2X3QpLgorICoKKyAqIFRoZSBsaWJyYXJ5IHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBsaXN0IHRoZSBvYmplY3RzIGluIGEgc3lzdGVtLAorICogZ2V0IGFuZCBzZXQgb2JqZWN0IHByb3BlcnRpZXMgKHN1Y2ggYXMgbmFtZXMsIFVVSURzLCBhbmQgc2l6ZXMpLCBhcyB3ZWxsCisgKiBhcyBjcmVhdGUvcmVtb3ZlIG9iamVjdHMgYW5kIHBlcmZvcm0gbW9yZSBjb21wbGV4IG9wZXJhdGlvbnMgYW5kCisgKiB0cmFuc2Zvcm1hdGlvbnMuIEVhY2ggb2JqZWN0IGluc3RhbmNlIGlzIHJlcHJlc2VudGVkIGJ5IGEgaGFuZGxlLCBhbmQKKyAqIGhhbmRsZXMgYXJlIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgZnVuY3Rpb25zIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbnMuCisgKgorICogQSBjZW50cmFsIG9iamVjdCBpbiB0aGUgbGlicmFyeSBpcyB0aGUgVm9sdW1lIEdyb3VwLCByZXByZXNlbnRlZCBieSB0aGUKKyAqIFZHIGhhbmRsZSwgdmdfdC4gUGVyZm9ybWluZyBhbiBvcGVyYXRpb24gb24gYSBQViBvciBMViBvYmplY3QgZmlyc3QKKyAqIHJlcXVpcmVzIG9idGFpbmluZyBhIFZHIGhhbmRsZS4gT25jZSB0aGUgdmdfdCBoYXMgYmVlbiBvYnRhaW5lZCwgaXQgY2FuCisgKiBiZSB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgcHZfdCBhbmQgbHZfdCBvYmplY3RzIHdpdGhpbiB0aGF0IHZnX3QuIEF0dHJpYnV0ZXMKKyAqIG9mIHRoZXNlIG9iamVjdHMgY2FuIHRoZW4gYmUgcXVlcmllZCBvciBjaGFuZ2VkLgorICoKKyAqIEEgdm9sdW1lIGdyb3VwIGhhbmRsZSBtYXkgYmUgb2J0YWluZWQgd2l0aCByZWFkIG9yIHdyaXRlIHBlcm1pc3Npb24uCisgKiBBbnkgYXR0ZW1wdCB0byBjaGFuZ2UgYSBwcm9wZXJ0eSBvZiBhIHB2X3QsIHZnX3QsIG9yIGx2X3Qgd2l0aG91dAorICogb2J0YWluaW5nIHdyaXRlIHBlcm1pc3Npb24gb24gdGhlIHZnX3Qgd2lsbCBmYWlsIHdpdGggRVBFUk0uCisgKgorICogQW4gYXBwbGljYXRpb24gZmlyc3Qgb3BlbmluZyBhIFZHIHJlYWQtb25seSwgdGhlbiBsYXRlciB3YW50aW5nIHRvIGNoYW5nZQorICogYSBwcm9wZXJ0eSBvZiBhbiBvYmplY3QgbXVzdCBmaXJzdCBjbG9zZSB0aGUgVkcgYW5kIHJlLW9wZW4gd2l0aCB3cml0ZQorICogcGVybWlzc2lvbi4gQ3VycmVudGx5IGxpYmx2bSBwcm92aWRlcyBubyBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAqIHRoZSBWRyBoYXMgY2hhbmdlZCBvbi1kaXNrIGluIGJldHdlZW4gdGhlc2Ugb3BlcmF0aW9ucyAtIHRoaXMgaXMgdGhlCisgKiBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmxpdHkuIE9uZSB3YXkgdGhlIGFwcGxpY2F0aW9uIGNhbiBlbnN1cmUgdGhlIFZHCisgKiBoYXMgbm90IGNoYW5nZWQgaXMgdG8gc2F2ZSB0aGUgInZnX3NlcW5vIiBmaWVsZCBhZnRlciBvcGVuaW5nIHRoZSBWRyB3aXRoCisgKiBSRUFEIHBlcm1pc3Npb24uIElmIHRoZSBhcHBsaWNhdGlvbiBsYXRlciBuZWVkcyB0byBtb2RpZnkgdGhlIFZHLCBpdCBjYW4KKyAqIGNsb3NlIHRoZSBWRyBhbmQgcmUtb3BlbiB3aXRoIFdSSVRFIHBlcm1pc3Npb24uIEl0IHNob3VsZCB0aGVuIGNoZWNrCisgKiB3aGV0aGVyIHRoZSBvcmlnaW5hbCAidmdfc2Vxbm8iIG9idGFpbmVkIHdpdGggUkVBRCBwZXJtaXNzaW9uIG1hdGNoZXMKKyAqIHRoZSBuZXcgb25lIG9idGFpbmVkIHdpdGggV1JJVEUgcGVybWlzc2lvbi4KKyAqLworCisvKioKKyAqIFJldHJpZXZlIHRoZSBsaWJyYXJ5IHZlcnNpb24uCisgKgorICogVGhlIGxpYnJhcnkgdmVyc2lvbiBpcyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIGZ1bGwgTFZNIHZlcnNpb24uCisgKiBUaGUgZm9ybWF0IGlzIGFzIGZvbGxvd3M6CisgKiAgICBMVk1fTUFKT1IuTFZNX01JTk9SLkxWTV9QQVRDSExFVkVMKExWTV9MSUJBUEkpWy1MVk1fUkVMRUFTRV0KKyAqIEFuIGFwcGxpY2F0aW9uIHdpc2hpbmcgdG8gZGV0ZXJtaW5lIGNvbXBhdGliaWxpdHkgd2l0aCBhIHBhcnRpY3VsYXIgdmVyc2lvbgorICogb2YgdGhlIGxpYnJhcnkgc2hvdWxkIGNoZWNrIGF0IGxlYXN0IHRoZSBMVk1fTUFKT1IsIExWTV9NSU5PUiwgYW5kCisgKiBMVk1fTElCQVBJIG51bWJlcnMuICBGb3IgZXhhbXBsZSwgYXNzdW1lIHRoZSBmdWxsIExWTSB2ZXJzaW9uIGlzCisgKiAyLjAyLjUwKDEpLTEuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHZlcmlmeSB0aGUgIjIuMDIiIGFuZCB0aGUgIigxKSIuCisgKgorICogXHJldHVybiAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbGlicmFyeSB2ZXJzaW9uLgorICovCitjb25zdCBjaGFyICpsdm1fbGlicmFyeV9nZXRfdmVyc2lvbih2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogT3BhcXVlIEMgcG9pbnRlcnMgLSBJbnRlcm5hbCBzdHJ1Y3R1cmVzIG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UgYmV0d2VlbgorICogcmVsZWFzZXMsIHdoZXJlYXMgdGhpcyBBUEkgd2lsbCBiZSBjaGFuZ2VkIG11Y2ggbGVzcyBmcmVxdWVudGx5LiAgQmFja3dhcmRzCisgKiBjb21wYXRpYmlsaXR5IHdpbGwgbm9ybWFsbHkgYmUgcHJlc2VydmVkIGluIGZ1dHVyZSByZWxlYXNlcy4gIE9uIGFueSBvY2Nhc2lvbgorICogd2hlbiB0aGUgZGV2ZWxvcGVycyBkbyBkZWNpZGUgdG8gYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gYW55CisgKiBzaWduaWZpY2FudCB3YXksIHRoZSBMVk1fTElCQVBJIG51bWJlciAoaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkncyBzb25hbWUpCisgKiB3aWxsIGJlIGluY3JlbWVudGVkLgorICovCisKKy8qKgorICogXGNsYXNzIGx2bV90CisgKgorICogVGhpcyBpcyB0aGUgYmFzZSBoYW5kbGUgdGhhdCBpcyBuZWVkZWQgdG8gb3BlbiBhbmQgY3JlYXRlIG9iamVjdHMgc3VjaCBhcworICogdm9sdW1lIGdyb3VwcyBhbmQgbG9naWNhbCB2b2x1bWVzLiAgSW4gYWRkaXRpb24sIHRoaXMgaGFuZGxlIHByb3ZpZGVzIGEKKyAqIGNvbnRleHQgZm9yIGVycm9yIGhhbmRsaW5nIGluZm9ybWF0aW9uLCBzYXZpbmcgYW55IGVycm9yIG51bWJlciAoc2VlCisgKiBsdm1fZXJybm8oKSkgYW5kIGVycm9yIG1lc3NhZ2UgKHNlZSBsdm1fZXJybXNnKCkpIHRoYXQgYW55IGZ1bmN0aW9uIG1heQorICogZ2VuZXJhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2bSAqbHZtX3Q7CisKKy8qKgorICogXGNsYXNzIHZnX3QKKyAqCisgKiBUaGUgdm9sdW1lIGdyb3VwIG9iamVjdCBpcyBhIGNlbnRyYWwgb2JqZWN0IGluIHRoZSBsaWJyYXJ5LCBhbmQgY2FuIGJlCisgKiBlaXRoZXIgYSByZWFkLW9ubHkgb2JqZWN0IG9yIGEgcmVhZC13cml0ZSBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSBmdW5jdGlvbgorICogdXNlZCB0byBvYnRhaW4gdGhlIG9iamVjdCBoYW5kbGUuIEZvciBleGFtcGxlLCBsdm1fdmdfY3JlYXRlKCkgYWx3YXlzCisgKiByZXR1cm5zIGEgcmVhZC93cml0ZSBoYW5kbGUsIHdoaWxlIGx2bV92Z19vcGVuKCkgaGFzIGEgIm1vZGUiIGFyZ3VtZW50CisgKiB0byBkZWZpbmUgdGhlIHJlYWQvd3JpdGUgbW9kZSBvZiB0aGUgaGFuZGxlLgorICovCit0eXBlZGVmIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3Q7CisKKy8qKgorICogXGNsYXNzIGx2X3QKKyAqCisgKiBUaGlzIGxvZ2ljYWwgdm9sdW1lIG9iamVjdCBpcyBib3VuZCB0byBhIHZnX3QgYW5kIGhhcyB0aGUgc2FtZQorICogcmVhZC93cml0ZSBtb2RlIGFzIHRoZSB2Z190LiAgQ2hhbmdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzaworICogd2hlbiB0aGUgdmdfdCBnZXRzIGNvbW1pdHRlZCB0byBkaXNrIGJ5IGNhbGxpbmcgbHZtX3ZnX3dyaXRlKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl90OworCisvKioKKyAqIFxjbGFzcyBwdl90CisgKgorICogVGhpcyBwaHlzaWNhbCB2b2x1bWUgb2JqZWN0IGlzIGJvdW5kIHRvIGEgdmdfdCBhbmQgaGFzIHRoZSBzYW1lCisgKiByZWFkL3dyaXRlIG1vZGUgYXMgdGhlIHZnX3QuICBDaGFuZ2VzIHdpbGwgYmUgd3JpdHRlbiB0byBkaXNrCisgKiB3aGVuIHRoZSB2Z190IGdldHMgY29tbWl0dGVkIHRvIGRpc2sgYnkgY2FsbGluZyBsdm1fdmdfd3JpdGUoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdl90OworCisvKioKKyAqIFxjbGFzcyBsdnNlZ190CisgKgorICogVGhpcyBsdiBzZWdtZW50IG9iamVjdCBpcyBib3VuZCB0byBhIGx2X3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2X3NlZ21lbnQgKmx2c2VnX3Q7CisKKy8qKgorICogXGNsYXNzIHB2c2VnX3QKKyAqCisgKiBUaGlzIHB2IHNlZ21lbnQgb2JqZWN0IGlzIGJvdW5kIHRvIGEgcHZfdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWdfdDsKKworLyoqCisgKiBcY2xhc3MgbHZfY3JlYXRlX3BhcmFtcworICoKKyAqIFRoaXMgbHZfY3JlYXRlX3BhcmFtcyByZXByZXNlbnRzIHRoZSBwbGV0aG9yYSBvZiBhdmFpbGFibGUgb3B0aW9ucyB3aGVuCisgKiBjcmVhdGluZyBhIGxvZ2ljYWwgdm9sdW1lCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2bV9sdl9jcmVhdGVfcGFyYW1zICpsdl9jcmVhdGVfcGFyYW1zX3Q7CisKKy8qKgorICogXGNsYXNzIHB2X2NyZWF0ZV9wYXJhbXMKKyAqCisgKiBUaGlzIHB2X2NyZWF0ZV9wYXJhbXMgcmVwcmVzZW50cyB0aGUgcGxldGhvcmEgb2YgYXZhaWxhYmxlIG9wdGlvbnMgd2hlbgorICogY3JlYXRpbmcgYSBwaHlzaWNhbCB2b2x1bWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbHZtX3B2X2NyZWF0ZV9wYXJhbXMgKnB2X2NyZWF0ZV9wYXJhbXNfdDsKKworLyoqCisgKiBMb2dpY2FsIFZvbHVtZSBvYmplY3QgbGlzdC4KKyAqCisgKiBMaXN0cyBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSByZXR1cm5lZCBieSBsdm1fdmdfbGlzdF9sdnMoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbHZtX2x2X2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJbHZfdCBsdjsKK30gbHZfbGlzdF90OworCisvKioKKyAqIExvZ2ljYWwgVm9sdW1lIFNlZ21lbnQgb2JqZWN0IGxpc3QuCisgKgorICogTGlzdHMgb2YgdGhlc2Ugc3RydWN0dXJlcyBhcmUgcmV0dXJuZWQgYnkgbHZtX2x2X2xpc3RfbHZzZWdzKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2bV9sdnNlZ19saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWx2c2VnX3QgbHZzZWc7Cit9IGx2c2VnX2xpc3RfdDsKKworLyoqCisgKiBQaHlzaWNhbCB2b2x1bWUgb2JqZWN0IGxpc3QuCisgKgorICogTGlzdHMgb2YgdGhlc2Ugc3RydWN0dXJlcyBhcmUgcmV0dXJuZWQgYnkgbHZtX3ZnX2xpc3RfcHZzKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2bV9wdl9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXB2X3QgcHY7Cit9IHB2X2xpc3RfdDsKKworLyoqCisgKiBQaHlzaWNhbCBWb2x1bWUgU2VnbWVudCBvYmplY3QgbGlzdC4KKyAqCisgKiBMaXN0cyBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSByZXR1cm5lZCBieSBsdm1fcHZfbGlzdF9wdnNlZ3MoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbHZtX3B2c2VnX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJcHZzZWdfdCBwdnNlZzsKK30gcHZzZWdfbGlzdF90OworCisvKioKKyAqIFN0cmluZyBsaXN0LgorICoKKyAqIFRoaXMgc3RyaW5nIGxpc3QgY29udGFpbnMgcmVhZC1vbmx5IHN0cmluZ3MuCisgKiBMaXN0cyBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSByZXR1cm5lZCBieSBmdW5jdGlvbnMgc3VjaCBhcworICogbHZtX2xpc3RfdmdfbmFtZXMoKSBhbmQgbHZtX2xpc3RfdmdfdXVpZHMoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbHZtX3N0cl9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNvbnN0IGNoYXIgKnN0cjsKK30gbHZtX3N0cl9saXN0X3Q7CisKKy8qKgorICogUHJvcGVydHkgVmFsdWUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgc2luZ2xlIExWTSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYW4gTFZNIG9iamVjdC4KKyAqIFRoZSBzdHJ1Y3R1cmVzIGFyZSByZXR1cm5lZCBieSBmdW5jdGlvbnMgc3VjaCBhcworICogbHZtX3ZnX2dldF9wcm9wZXJ0eSgpLgorICoKKyAqIGlzX3NldHRhYmxlOiBpbmRpY2F0ZXMgd2hldGhlciBhICdzZXQnIGZ1bmN0aW9uIGV4aXN0cyBmb3IgdGhpcyBwcm9wZXJ0eQorICogaXNfc3RyaW5nOiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGEgc3RyaW5nICgxKSBvciBub3QgKDApCisgKiBpc19pbnRlZ2VyOiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGFuIGludGVnZXIgKDEpIG9yIG5vdCAoMCkKKyAqIGlzX3ZhbGlkOiBpbmRpY2F0ZXMgd2hldGhlciAndmFsdWUnIGlzIHZhbGlkICgxKSBvciBub3QgKDApCisgKi8KK3R5cGVkZWYgc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSB7CisJdWludDMyX3QgaXNfc2V0dGFibGU6MTsKKwl1aW50MzJfdCBpc19zdHJpbmc6MTsKKwl1aW50MzJfdCBpc19pbnRlZ2VyOjE7CisJdWludDMyX3QgaXNfdmFsaWQ6MTsKKwl1aW50MzJfdCBpc19zaWduZWQ6MTsKKwl1aW50MzJfdCBwYWRkaW5nOjI3OworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqc3RyaW5nOworCQl1aW50NjRfdCBpbnRlZ2VyOworCQlpbnQ2NF90IHNpZ25lZF9pbnRlZ2VyOworCX0gdmFsdWU7Cit9IGx2bV9wcm9wZXJ0eV92YWx1ZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIGdlbmVyaWMgbHZtIGhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQ3JlYXRlIGEgTFZNIGhhbmRsZS4KKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBPbmNlIGFsbCBMVk0gb3BlcmF0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLCB1c2UgbHZtX3F1aXQoKSB0byByZWxlYXNlCisgKiB0aGUgaGFuZGxlIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogXHBhcmFtIHN5c3RlbV9kaXIKKyAqIFNldCBhbiBhbHRlcm5hdGl2ZSBMVk0gc3lzdGVtIGRpcmVjdG9yeS4gVXNlIE5VTEwgdG8gdXNlIHRoZQorICogZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExWTV9TWVNURU1fRElSIGlzIHNldCwKKyAqIGl0IHdpbGwgb3ZlcnJpZGUgYW55IHN5c3RlbV9kaXIgc2V0dGluZy4KKyAqCisgKiBccmV0dXJuCisgKiBBIHZhbGlkIExWTSBoYW5kbGUgaXMgcmV0dXJuZWQgb3IgTlVMTCBpZiB0aGVyZSBoYXMgYmVlbiBhCisgKiBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtLiBZb3UgaGF2ZSB0byBjaGVjayBpZiBhbiBlcnJvciBvY2N1cmVkCisgKiB3aXRoIHRoZSBsdm1fZXJyb3IoKSBmdW5jdGlvbi4KKyAqLworbHZtX3QgbHZtX2luaXQoY29uc3QgY2hhciAqc3lzdGVtX2Rpcik7CisKKy8qKgorICogRGVzdHJveSBhIExWTSBoYW5kbGUgYWxsb2NhdGVkIHdpdGggbHZtX2luaXQoKS4KKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGFmdGVyIGFsbCBMVk0gb3BlcmF0aW9ucyBhcmUgY29tcGxldGUgb3IgYWZ0ZXIKKyAqIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuICBEZXN0cm95aW5nIHRoZSBMVk0gaGFuZGxlIGZyZWVzIHRoZSBtZW1vcnkgYW5kCisgKiBvdGhlciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuICBPbmNlIGRlc3Ryb3llZCwgdGhlIGhhbmRsZQorICogY2Fubm90IGJlIHVzZWQgc3Vic2VxdWVudGx5LgorICoKKyAqIFxwYXJhbSAgIGxpYmgKKyAqIEhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV9pbml0KCkuCisgKi8KK3ZvaWQgbHZtX3F1aXQobHZtX3QgbGliaCk7CisKKy8qKgorICogUmVsb2FkIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uIGZyb20gdGhlIHN5c3RlbSBkaXJlY3RvcnkuCisgKgorICogXG1lbWJlcm9mIGx2bV90CisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuIGFueSBMVk0gY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHRoZSBMVk0KKyAqIHN5c3RlbV9kaXIgb3IgYnkgYW5vdGhlciBsdm1fY29uZmlnKiBmdW5jdGlvbiwgYW5kIHRoZSBjaGFuZ2UgaXMgbmVlZGVkIGJ5CisgKiB0aGUgYXBwbGljYXRpb24uCisgKgorICogXHBhcmFtICAgbGliaAorICogSGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX2luaXQoKS4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fY29uZmlnX3JlbG9hZChsdm1fdCBsaWJoKTsKKworLyoqCisgKiBPdmVycmlkZSB0aGUgTFZNIGNvbmZpZ3VyYXRpb24gd2l0aCBhIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgorICoKKyAqIFxtZW1iZXJvZiBsdm1fdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgLS1jb25maWcgb3B0aW9uIG9uIGx2bSBjb21tYW5kcy4KKyAqIE9uY2UgdGhpcyBBUEkgaGFzIGJlZW4gdXNlZCB0byBvdmVyLXJpZGUgdGhlIGNvbmZpZ3VyYXRpb24sCisgKiB1c2UgbHZtX2NvbmZpZ19yZWxvYWQoKSB0byBhcHBseSB0aGUgbmV3IHNldHRpbmdzLgorICoKKyAqIFxwYXJhbSAgIGxpYmgKKyAqIEhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV9pbml0KCkuCisgKgorICogXHBhcmFtICAgY29uZmlnX3N0cmluZworICogTFZNIGNvbmZpZ3VyYXRpb24gc3RyaW5nIHRvIGFwcGx5LiAgU2VlIHRoZSBsdm0uY29uZiBmaWxlIG1hbiBwYWdlCisgKiBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgY29uZmlnIHN0cmluZy4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fY29uZmlnX292ZXJyaWRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKmNvbmZpZ19zdHJpbmcpOworCisvKioKKyAqIEZpbmQgYSBib29sZWFuIHZhbHVlIGluIHRoZSBMVk0gY29uZmlndXJhdGlvbi4KKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgYm9vbGVhbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXRoCisgKiBpbiBjdXJyZW50IExWTSBjb25maWd1cmF0aW9uLgorICoKKyAqIFxwYXJhbSAgIGxpYmgKKyAqIEhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV9pbml0KCkuCisgKgorICogXHBhcmFtICAgY29uZmlnX3BhdGgKKyAqIEEgcGF0aCBpbiBMVk0gY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbSAgIGZhaWwKKyAqIFZhbHVlIHRvIHJldHVybiBpZiB0aGUgcGF0aCBpcyBub3QgZm91bmQuCisgKgorICogXHJldHVybgorICogYm9vbGVhbiB2YWx1ZSBmb3IgJ2NvbmZpZ19wYXRoJyAoc3VjY2Vzcykgb3IgdGhlIHZhbHVlIG9mICdmYWlsJyAoZXJyb3IpCisgKi8KK2ludCBsdm1fY29uZmlnX2ZpbmRfYm9vbChsdm1fdCBsaWJoLCBjb25zdCBjaGFyICpjb25maWdfcGF0aCwgaW50IGZhaWwpOworCisvKioKKyAqIFJldHVybiBzdG9yZWQgZXJyb3Igbm8gZGVzY3JpYmluZyBsYXN0IExWTSBBUEkgZXJyb3IuCisgKgorICogXG1lbWJlcm9mIGx2bV90CisgKgorICogVXNlcnMgb2YgbGlibHZtIHNob3VsZCB1c2UgbHZtX2Vycm5vIHRvIGRldGVybWluZSB0aGUgZGV0YWlscyBvZiBhIGFueQorICogZmFpbHVyZSBvZiB0aGUgbGFzdCBjYWxsLiAgQSBiYXNpYyBzdWNjZXNzIG9yIGZhaWwgaXMgYWx3YXlzIHJldHVybmVkIGJ5CisgKiBldmVyeSBmdW5jdGlvbiwgZWl0aGVyIGJ5IHJldHVybmluZyBhIDAgb3IgLTEsIG9yIGEgbm9uLU5VTEwgLyBOVUxMLgorICogSWYgYSBmdW5jdGlvbiBoYXMgZmFpbGVkLCBsdm1fZXJybm8gbWF5IGJlIHVzZWQgdG8gZ2V0IGEgbW9yZSBzcGVjaWZpYworICogZXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSBmYWlsdXJlLiAgSW4gdGhpcyB3YXksIGx2bV9lcnJubyBtYXkgYmUgdXNlZAorICogYWZ0ZXIgZXZlcnkgZnVuY3Rpb24gY2FsbCwgZXZlbiBhZnRlciBhICdnZXQnIGZ1bmN0aW9uIGNhbGwgdGhhdCBzaW1wbHkKKyAqIHJldHVybnMgYSB2YWx1ZS4KKyAqCisgKiBccGFyYW0gICBsaWJoCisgKiBIYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1faW5pdCgpLgorICoKKyAqIFxyZXR1cm4KKyAqIEFuIGVycm5vIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGxhc3QgTFZNIGVycm9yLgorICovCitpbnQgbHZtX2Vycm5vKGx2bV90IGxpYmgpOworCisvKioKKyAqIFJldHVybiBzdG9yZWQgZXJyb3IgbWVzc2FnZSBkZXNjcmliaW5nIGxhc3QgTFZNIGVycm9yLgorICoKKyAqIFxtZW1iZXJvZiBsdm1fdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBsdm1fZXJybm8oKSB0byBvYnRhaW4gbW9yZQorICogc3BlY2lmaWMgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gdGhhdCBpcyBrbm93biB0byBoYXZlIGZhaWxlZC4KKyAqCisgKiBccGFyYW0gICBsaWJoCisgKiBIYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1faW5pdCgpLgorICoKKyAqIFxyZXR1cm4KKyAqIEFuIGVycm9yIHN0cmluZyBkZXNjcmliaW5nIHRoZSBsYXN0IExWTSBlcnJvci4KKyAqLworY29uc3QgY2hhciAqbHZtX2Vycm1zZyhsdm1fdCBsaWJoKTsKKworLyoqCisgKiBTY2FuIGFsbCBkZXZpY2VzIG9uIHRoZSBzeXN0ZW0gZm9yIFZHcyBhbmQgTFZNIG1ldGFkYXRhLgorICoKKyAqIFxtZW1iZXJvZiBsdm1fdAorICoKKyAqIFxyZXR1cm4KKyAqIDAgKHN1Y2Nlc3MpIG9yIC0xIChmYWlsdXJlKS4KKyAqLworaW50IGx2bV9zY2FuKGx2bV90IGxpYmgpOworCisvKioKKyAqIFJldHVybiB0aGUgbGlzdCBvZiB2b2x1bWUgZ3JvdXAgbmFtZXMuCisgKgorICogXG1lbWJlcm9mIGx2bV90CisgKgorICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBsaXN0IGlzIHRpZWQgdG8gdGhlIGx2bV90IGhhbmRsZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgd2hlbiBsdm1fcXVpdCgpIGlzIGNhbGxlZC4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IGRvZXMgbm90IHNjYW4gZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGZvciBMVk0KKyAqIG1ldGFkYXRhLiAgVG8gc2NhbiB0aGUgc3lzdGVtLCB1c2UgbHZtX3NjYW4oKS4KKyAqCisgKiBUbyBwcm9jZXNzIHRoZSBsaXN0LCB1c2UgdGhlIGRtX2xpc3QgaXRlcmF0b3IgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CisgKiAgICAgIHZnX3Qgdmc7CisgKiAgICAgIHN0cnVjdCBkbV9saXN0ICp2Z25hbWVzOworICogICAgICBzdHJ1Y3QgbHZtX3N0cl9saXN0ICpzdHJsOworICoKKyAqICAgICAgdmduYW1lcyA9IGx2bV9saXN0X3ZnX25hbWVzKGxpYmgpOworICoJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHN0cmwsIHZnbmFtZXMpIHsKKyAqCQl2Z25hbWUgPSBzdHJsLT5zdHI7CisgKiAgICAgICAgICAgICAgdmcgPSBsdm1fdmdfb3BlbihsaWJoLCB2Z25hbWUsICJyIik7CisgKiAgICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdmcKKyAqICAgICAgICAgICAgICBsdm1fdmdfY2xvc2UodmcpOworICogICAgICB9CisgKgorICoKKyAqIFxyZXR1cm4KKyAqIEEgbGlzdCB3aXRoIGVudHJpZXMgb2YgdHlwZSBzdHJ1Y3QgbHZtX3N0cl9saXN0LCBjb250YWluaW5nIHRoZQorICogVkcgbmFtZSBzdHJpbmdzIG9mIHRoZSBWb2x1bWUgR3JvdXBzIGtub3duIHRvIHRoZSBzeXN0ZW0uCisgKiBOVUxMIGlzIHJldHVybmVkIGlmIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKiBBbiBlbXB0eSBsaXN0ICh2ZXJpZnkgd2l0aCBkbV9saXN0X2VtcHR5KSBpcyByZXR1cm5lZCBpZiBubyBWR3MKKyAqIGV4aXN0IG9uIHRoZSBzeXN0ZW0uCisgKi8KK3N0cnVjdCBkbV9saXN0ICpsdm1fbGlzdF92Z19uYW1lcyhsdm1fdCBsaWJoKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygdm9sdW1lIGdyb3VwIHV1aWRzLgorICoKKyAqIFxtZW1iZXJvZiBsdm1fdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgbGlzdCBpcyB0aWVkIHRvIHRoZSBsdm1fdCBoYW5kbGUgYW5kIHdpbGwgYmUKKyAqIHJlbGVhc2VkIHdoZW4gbHZtX3F1aXQoKSBpcyBjYWxsZWQuCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBub3JtYWxseSBkb2VzIG5vdCBzY2FuIGRldmljZXMgaW4gdGhlIHN5c3RlbSBmb3IgTFZNCisgKiBtZXRhZGF0YS4gIFRvIHNjYW4gdGhlIHN5c3RlbSwgdXNlIGx2bV9zY2FuKCkuCisgKgorICogXHBhcmFtICAgbGliaAorICogSGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX2luaXQoKS4KKyAqCisgKiBccmV0dXJuCisgKiBBIGxpc3Qgd2l0aCBlbnRyaWVzIG9mIHR5cGUgc3RydWN0IGx2bV9zdHJfbGlzdCwgY29udGFpbmluZyB0aGUKKyAqIFZHIFVVSUQgc3RyaW5ncyBvZiB0aGUgVm9sdW1lIEdyb3VwcyBrbm93biB0byB0aGUgc3lzdGVtLgorICogTlVMTCBpcyByZXR1cm5lZCBpZiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LgorICogQW4gZW1wdHkgbGlzdCAodmVyaWZ5IHdpdGggZG1fbGlzdF9lbXB0eSkgaXMgcmV0dXJuZWQgaWYgbm8gVkdzCisgKiBleGlzdCBvbiB0aGUgc3lzdGVtLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX2xpc3RfdmdfdXVpZHMobHZtX3QgbGliaCk7CisKKy8qKgorICogUmV0dXJuIHRoZSB2b2x1bWUgZ3JvdXAgbmFtZSBnaXZlbiBhIFBWIFVVSUQKKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG5hbWUgaXMgdGllZCB0byB0aGUgbHZtX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV9xdWl0KCkgaXMgY2FsbGVkLgorICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gbWF5IHNjYW4gZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGZvciBMVk0gbWV0YWRhdGEuCisgKgorICogXHBhcmFtICAgbGliaAorICogSGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX2luaXQoKS4KKyAqCisgKiBccmV0dXJuCisgKiBUaGUgdm9sdW1lIGdyb3VwIG5hbWUgZm9yIHRoZSBnaXZlbiBQViBVVUlELgorICogTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgUFYgVVVJRCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgdm9sdW1lIGdyb3VwLgorICovCitjb25zdCBjaGFyICpsdm1fdmduYW1lX2Zyb21fcHZpZChsdm1fdCBsaWJoLCBjb25zdCBjaGFyICpwdmlkKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHZvbHVtZSBncm91cCBuYW1lIGdpdmVuIGEgZGV2aWNlIG5hbWUKKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG5hbWUgaXMgdGllZCB0byB0aGUgbHZtX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV9xdWl0KCkgaXMgY2FsbGVkLgorICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gbWF5IHNjYW4gZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGZvciBMVk0gbWV0YWRhdGEuCisgKgorICogXHBhcmFtICAgbGliaAorICogSGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX2luaXQoKS4KKyAqCisgKiBccmV0dXJuCisgKiBUaGUgdm9sdW1lIGdyb3VwIG5hbWUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgbmFtZS4KKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBpcyBub3QgYW4gTFZNIGRldmljZS4KKyAqCisgKi8KK2NvbnN0IGNoYXIgKmx2bV92Z25hbWVfZnJvbV9kZXZpY2UobHZtX3QgbGliaCwgY29uc3QgY2hhciAqZGV2aWNlKTsKKworLyoqCisgKiBPcGVuIGFuIGV4aXN0aW5nIFZHLgorICoKKyAqIE9wZW4gYSBWRyBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorICoKKyAqIFxtZW1iZXJvZiBsdm1fdAorICoKKyAqIFxwYXJhbSAgIGxpYmgKKyAqIEhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV9pbml0KCkuCisgKgorICogXHBhcmFtICAgdmduYW1lCisgKiBOYW1lIG9mIHRoZSBWRyB0byBvcGVuLgorICoKKyAqIFxwYXJhbSAgIG1vZGUKKyAqIE9wZW4gbW9kZSAtIGVpdGhlciAiciIgKHJlYWQpIG9yICJ3IiAocmVhZC93cml0ZSkuCisgKiBBbnkgb3RoZXIgY2hhcmFjdGVyIHJlc3VsdHMgaW4gYW4gZXJyb3Igd2l0aCBFSU5WQUwgc2V0LgorICoKKyAqIFxwYXJhbSAgIGZsYWdzCisgKiBPcGVuIGZsYWdzIC0gY3VycmVudGx5IGlnbm9yZWQuCisgKgorICogXHJldHVybiAgbm9uLU5VTEwgVkcgaGFuZGxlIChzdWNjZXNzKSBvciBOVUxMIChmYWlsdXJlKS4KKyAqLwordmdfdCBsdm1fdmdfb3Blbihsdm1fdCBsaWJoLCBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKm1vZGUsCisJCSAgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFZhbGlkYXRlIGEgbmFtZSB0byBiZSB1c2VkIGZvciBuZXcgVkcgY29uc3RydWN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhlIG5hbWUgaGFzIG5vIGludmFsaWQgY2hhcmFjdGVycywKKyAqIHRoZSBsZW5ndGggZG9lc24ndCBleGNlZWQgbWF4aW11bSBhbmQgdGhhdCB0aGUgVkcgbmFtZSBpc24ndCBhbHJlYWR5IGluIHVzZQorICogYW5kIHRoYXQgdGhlIG5hbWUgYWRoZXJlcyB0byBhbnkgb3RoZXIgbGltaXRhdGlvbnMuCisgKgorICogXHBhcmFtIGxpYmgKKyAqIFZhbGlkIGxpYnJhcnkgaGFuZGxlCisgKgorICogXHBhcmFtIG5hbWUKKyAqIE5hbWUgdG8gdmFsaWRhdGUgZm9yIG5ldyBWRyBjcmVhdGUuCisgKi8KK2ludCBsdm1fdmdfbmFtZV92YWxpZGF0ZShsdm1fdCBsaWJoLCBjb25zdCBjaGFyICp2Z19uYW1lKTsKKworLyoqCisgKiBDcmVhdGUgYSBWRyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KKyAqCisgKiBcbWVtYmVyb2YgbHZtX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBWb2x1bWUgR3JvdXAgb2JqZWN0IGluIG1lbW9yeS4KKyAqIFVwb24gc3VjY2Vzcywgb3RoZXIgQVBJcyBtYXkgYmUgdXNlZCB0byBzZXQgbm9uLWRlZmF1bHQgcGFyYW1ldGVycy4KKyAqIEZvciBleGFtcGxlLCB0byBzZXQgYSBub24tZGVmYXVsdCBleHRlbnQgc2l6ZSwgdXNlIGx2bV92Z19zZXRfZXh0ZW50X3NpemUoKS4KKyAqIE5leHQsIHRvIGFkZCBwaHlzaWNhbCBzdG9yYWdlIGRldmljZXMgdG8gdGhlIHZvbHVtZSBncm91cCwgdXNlCisgKiBsdm1fdmdfZXh0ZW5kKCkgZm9yIGVhY2ggZGV2aWNlLgorICogT25jZSBhbGwgcGFyYW1ldGVycyBhcmUgc2V0IGFwcHJvcHJpYXRlbHkgYW5kIGFsbCBkZXZpY2VzIGFyZSBhZGRlZCB0byB0aGUKKyAqIFZHLCB1c2UgbHZtX3ZnX3dyaXRlKCkgdG8gY29tbWl0IHRoZSBuZXcgVkcgdG8gZGlzaywgYW5kIGx2bV92Z19jbG9zZSgpIHRvCisgKiByZWxlYXNlIHRoZSBWRyBoYW5kbGUuCisgKgorICogXHBhcmFtICAgbGliaAorICogSGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX2luaXQoKS4KKyAqCisgKiBccGFyYW0gICB2Z19uYW1lCisgKiBOYW1lIG9mIHRoZSBWRyB0byBvcGVuLgorICoKKyAqIFxyZXR1cm4KKyAqIG5vbi1OVUxMIHZnIGhhbmRsZSAoc3VjY2Vzcykgb3IgTlVMTCAoZmFpbHVyZSkKKyAqLwordmdfdCBsdm1fdmdfY3JlYXRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKnZnX25hbWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIHZvbHVtZSBncm91cCBoYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBSZXR1cm4gYSBsaXN0IG9mIExWIGhhbmRsZXMgZm9yIGEgZ2l2ZW4gVkcgaGFuZGxlLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIEEgbGlzdCBvZiBsdm1fbHZfbGlzdCBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgbHYgaGFuZGxlcyBmb3IgdGhpcyB2Zy4KKyAqIElmIG5vIExWcyBleGlzdCBvbiB0aGUgZ2l2ZW4gVkcsIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBkbV9saXN0ICpsdm1fdmdfbGlzdF9sdnModmdfdCB2Zyk7CisKKy8qKgorICogUmV0dXJuIGEgbGlzdCBvZiBQViBoYW5kbGVzIGZvciBhbGwuCisgKgorICogXG1lbWJlcm9mIGx2bV90CisgKgorICogXHBhcmFtICAgbGliaAorICogTGlicmFyeSBoYW5kbGUgcmV0cmlldmVkIGZyb20gbHZtX2luaXQKKyAqCisgKiBccmV0dXJuCisgKiBBIGxpc3Qgb2YgbHZtX3B2X2xpc3Qgc3RydWN0dXJlcyBjb250YWluaW5nIHB2IGhhbmRsZXMgZm9yIGFsbCBwaHlzaWNhbAorICogdm9sdW1lcy4gSWYgbm8gUFZzIGV4aXN0IG9yIGEgZ2xvYmFsIGxvY2sgd2FzIHVuYWJsZSB0byBiZSBvYnRhaW5lZCBhCisgKiBOVUxMIGlzIHJldHVybmVkLiAgRG8gbm90IGF0dGVtcHQgdG8gcmVtb3ZlIG9uZSBvZiB0aGUgUFZzIHVudGlsIGFmdGVyIHRoZQorICogY2FsbCB0byBsdm1fbGlzdF9wdnNfZnJlZSBoYXMgYmVlbiBtYWRlLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX2xpc3RfcHZzKGx2bV90IGxpYmgpOworCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGFjcXVpcmluZyB0aGUgcHZsaXN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzCisgKiBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHByb2Nlc3NpbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwdiBsaXN0IGFzCisgKiBhIGdsb2JhbCBsb2NrIGlzIGhlbGQuCisgKgorICogXHBhcmFtCXB2bGlzdAorICogUFYgbGlzdCB0byBiZSBmcmVlZAorICoKKyAqIFxyZXR1cm4KKyAqIDAgb24gc3VjY2VzcywgZWxzZSAtMSB3aXRoIGxpYnJhcnkgZXJybm8gYW5kIHRleHQgc2V0LgorICovCitpbnQgbHZtX2xpc3RfcHZzX2ZyZWUoc3RydWN0IGRtX2xpc3QgKnB2bGlzdCk7CisKKy8qKgorICogIENyZWF0ZSBhIHBoeXNpY2FsIHZvbHVtZS4KKyAqICBccGFyYW0JbGliaAlMaWJyYXJ5IGhhbmRsZQorICogIFxwYXJhbQlwdl9uYW1lCVRoZSBwaHlzaWNhbCB2b2x1bWUgbmFtZQorICogIFxwYXJhbQlzaXplCVNpemUgb2YgcGh5c2ljYWwgdm9sdW1lLCAwID0gdXNlIGFsbCBhdmFpbGFibGUuCisgKiAgXHJldHVybgorICogIDAgb24gc3VjY2VzcywgZWxzZSAtMSB3aXRoIGxpYnJhcnkgZXJybm8gYW5kIHRleHQgc2V0LgorICovCitpbnQgbHZtX3B2X2NyZWF0ZShsdm1fdCBsaWJoLCBjb25zdCBjaGFyICpwdl9uYW1lLCB1aW50NjRfdCBzaXplKTsKKworLyoqCisgKiBDcmVhdGUgYSBwaHlzaWNhbCB2b2x1bWUgcGFyYW1ldGVyIG9iamVjdCBmb3IgUFYgY3JlYXRpb24uCisgKgorICogXHBhcmFtCWxpYmgJTGlicmFyeSBoYW5kbGUKKyAqIFxwYXJhbQlwdl9uYW1lCURldmljZSBuYW1lCisgKgorICogXHJldHVybgorICogTlVMTCBvbiBlcnJvciwgZWxzZSB2YWxpZCBwYXJhbWV0ZXIgb2JqZWN0IHRvIHVzZS4KKyAqLworcHZfY3JlYXRlX3BhcmFtc190IGx2bV9wdl9wYXJhbXNfY3JlYXRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKnB2X25hbWUpOworCisvKioKKyAqIENyZWF0ZSBhIHBhcmFtZXRlciBvYmplY3QgdG8gdXNlIGluIGZ1bmN0aW9uIGx2bV9wdl9jcmVhdGVfYWR2CisgKgorICogCVxwYXJhbSAJcGFyYW1zCVRoZSBwYXJhbXMgb2JqZWN0IHRvIGdldCBwcm9wZXJ0eSB2YWx1ZSBmcm9tCisgKiAJXHBhcmFtCW5hbWUJVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCisgKgorICogCUF2YWlsYWJsZSBwcm9wZXJ0aWVzOgorICoKKyAqIAlzaXplCQkJCQl6ZXJvIGluZGljYXRlcyB1c2UgZGV0ZWN0ZWQgc2l6ZSBvZiBkZXZpY2UKKyAqIAkJCQkJCQkocmVjb21tZW5kZWQgYW5kIGRlZmF1bHQpCisgKglwdm1ldGFkYXRhY29waWVzCQlOdW1iZXIgb2YgbWV0YWRhdGEgY29waWVzICgwLDEsMikKKyAqCXB2bWV0YWRhdGFzaXplCQkJVGhlIGFwcHJveC4gc2l6ZSB0byBiZSB0byBiZSBzZXQgYXNpZGUgZm9yIG1ldGFkYXRhCisgKglkYXRhX2FsaWdubWVudAkJCUFsaWduIHRoZSBzdGFydCBvZiB0aGUgZGF0YSB0byBhIG11bHRpcGxlIG9mCisgKgkJCQkJCQl0aGlzIG51bWJlcgorICoJZGF0YV9hbGlnbm1lbnRfb2Zmc2V0CVNoaWZ0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBhcmVhIGJ5IHRoaXMgYWRkbC4KKyAqCQkJCQkJCW9mZnNldAorICoJemVybwkJCQkJU2V0IHRvIDEgdG8gemVybyBvdXQgZmlyc3QgMjA0OCBieXRlcyBvZgorICoJCQkJCQkJZGV2aWNlLCAwIHRvIG5vdCAoZGVmYXVsdCBpcyAxKQorICoKKyAqIAlccmV0dXJuCisgKiAJbHZtX3Byb3BlcnR5X3ZhbHVlCisgKi8KK3N0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgbHZtX3B2X3BhcmFtc19nZXRfcHJvcGVydHkoCisJCQkJCQljb25zdCBwdl9jcmVhdGVfcGFyYW1zX3QgcGFyYW1zLAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogU2V0cyBhIHByb3BlcnR5IG9mIGEgUFYgcGFyYW1ldGVyIGNyZWF0ZSBvYmplY3QuCisgKgorICogXHBhcmFtCXBhcmFtcwkJVGhlIHBhcmFtZXRlciBvYmplY3QKKyAqIFxwYXJhbQluYW1lCQlUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IChzZWUgZ2V0IHByb3AgbGlzdCkKKyAqIFxwYXJhbQlwcm9wCQlUaGUgcHJvcGVydHkgdG8gc2V0IHRoZSB2YWx1ZSBvbi4KKyAqLworaW50IGx2bV9wdl9wYXJhbXNfc2V0X3Byb3BlcnR5KHB2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkJCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgKnByb3ApOworLyoqCisgKiBDcmVhdGVzIGEgcGh5c2ljYWwgdm9sdW1lIHVzaW5nIHRoZSBzdXBwbGllZCBwYXJhbXMgb2JqZWN0LgorICoKKyAqIFxwYXJhbQlwYXJhbXMJCVRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgcGh5c2ljYWwgdm9sdW1lIGNyZWF0aW9uCisgKgorICogXHJldHVybgorICogLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IGx2bV9wdl9jcmVhdGVfYWR2KHB2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMpOworCisvKioKKyAqICBSZW1vdmUgYSBwaHlzaWNhbCB2b2x1bWUuCisgKiAgTm90ZTogWW91IGNhbm5vdCByZW1vdmUgYSBQViB3aGlsZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgbGlzdCBvZiBQVnMgYXMKKyAqICBsb2NrcyBhcmUgaGVsZCBmb3IgdGhlIFBWIGxpc3QuCisgKiAgXHBhcmFtCWxpYmgJTGlicmFyeSBoYW5kbGUKKyAqICBccGFyYW0JcHZfbmFtZQlUaGUgcGh5c2ljYWwgdm9sdW1lIG5hbWUKKyAqICBccmV0dXJuCisgKiAgMCBvbiBzdWNjZXNzLCBlbHNlIC0xIHdpdGggbGlicmFyeSBlcnJubyBhbmQgdGV4dCBzZXQuCisgKi8KK2ludCBsdm1fcHZfcmVtb3ZlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKnB2X25hbWUpOworCisvKioKKyAqIFJldHVybiBhIGxpc3Qgb2YgUFYgaGFuZGxlcyBmb3IgYSBnaXZlbiBWRyBoYW5kbGUuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogQSBsaXN0IG9mIGx2bV9wdl9saXN0IHN0cnVjdHVyZXMgY29udGFpbmluZyBwdiBoYW5kbGVzIGZvciB0aGlzIHZnLgorICogSWYgbm8gUFZzIGV4aXN0IG9uIHRoZSBnaXZlbiBWRywgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IGRtX2xpc3QgKmx2bV92Z19saXN0X3B2cyh2Z190IHZnKTsKKworLyoqCisgKiBXcml0ZSBhIFZHIHRvIGRpc2suCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbW1pdHMgdGhlIFZvbHVtZSBHcm91cCBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGUgVkcgaGFuZGxlCisgKiB0byBkaXNrLiBVcG9uIGZhaWx1cmUsIHJldHJ5IHRoZSBvcGVyYXRpb24gYW5kL29yIHJlbGVhc2UgdGhlIFZHIGhhbmRsZQorICogd2l0aCBsdm1fdmdfY2xvc2UoKS4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX3dyaXRlKHZnX3QgdmcpOworCisvKioKKyAqIFJlbW92ZSBhIFZHIGZyb20gdGhlIHN5c3RlbS4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIFZvbHVtZSBHcm91cCBvYmplY3QgaW4gbWVtb3J5LCBhbmQgcmVxdWlyZXMKKyAqIGNhbGxpbmcgbHZtX3ZnX3dyaXRlKCkgdG8gY29tbWl0IHRoZSByZW1vdmFsIHRvIGRpc2suCisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIDAgKHN1Y2Nlc3MpIG9yIC0xIChmYWlsdXJlKS4KKyAqLworaW50IGx2bV92Z19yZW1vdmUodmdfdCB2Zyk7CisKKy8qKgorICogQ2xvc2UgYSBWRyBvcGVuZWQgd2l0aCBsdm1fdmdfY3JlYXRlIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGEgVkcgaGFuZGxlIGFuZCBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX2Nsb3NlKHZnX3QgdmcpOworCisvKioKKyAqIEV4dGVuZCBhIFZHIGJ5IGFkZGluZyBhIGRldmljZS4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgY2FsbGluZyBsdm1fdmdfd3JpdGUoKSB0byBjb21taXQgdGhlIGNoYW5nZSB0byBkaXNrLgorICogQWZ0ZXIgc3VjY2Vzc2Z1bGx5IGFkZGluZyBhIGRldmljZSwgdXNlIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUgbmV3IFZHCisgKiB0byBkaXNrLiAgVXBvbiBmYWlsdXJlLCByZXRyeSB0aGUgb3BlcmF0aW9uIG9yIHJlbGVhc2UgdGhlIFZHIGhhbmRsZSB3aXRoCisgKiBsdm1fdmdfY2xvc2UoKS4KKyAqIElmIHRoZSBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkIGZvciBMVk0gdXNlLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkCisgKiBiZWZvcmUgYWRkaW5nIHRvIHRoZSBWRy4gIEFsdGhvdWdoIHNvbWUgaW50ZXJuYWwgY2hlY2tzIGFyZSBkb25lLAorICogdGhlIGNhbGxlciBzaG91bGQgYmUgc3VyZSB0aGUgZGV2aWNlIGlzIG5vdCBpbiB1c2UgYnkgb3RoZXIgc3Vic3lzdGVtcworICogYmVmb3JlIGNhbGxpbmcgbHZtX3ZnX2V4dGVuZCgpLgorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccGFyYW0gICBkZXZpY2UKKyAqIEFic29sdXRlIHBhdGhuYW1lIG9mIGRldmljZSB0byBhZGQgdG8gVkcuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX2V4dGVuZCh2Z190IHZnLCBjb25zdCBjaGFyICpkZXZpY2UpOworCisvKioKKyAqIFJlZHVjZSBhIFZHIGJ5IHJlbW92aW5nIGFuIHVudXNlZCBkZXZpY2UuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGNhbGxpbmcgbHZtX3ZnX3dyaXRlKCkgdG8gY29tbWl0IHRoZSBjaGFuZ2UgdG8gZGlzay4KKyAqIEFmdGVyIHN1Y2Nlc3NmdWxseSByZW1vdmluZyBhIGRldmljZSwgdXNlIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUgbmV3IFZHCisgKiB0byBkaXNrLiAgVXBvbiBmYWlsdXJlLCByZXRyeSB0aGUgb3BlcmF0aW9uIG9yIHJlbGVhc2UgdGhlIFZHIGhhbmRsZSB3aXRoCisgKiBsdm1fdmdfY2xvc2UoKS4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHBhcmFtICAgZGV2aWNlCisgKiBOYW1lIG9mIGRldmljZSB0byByZW1vdmUgZnJvbSBWRy4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fdmdfcmVkdWNlKHZnX3QgdmcsIGNvbnN0IGNoYXIgKmRldmljZSk7CisKKy8qKgorICogQWRkIGEgdGFnIHRvIGEgVkcuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGNhbGxpbmcgbHZtX3ZnX3dyaXRlKCkgdG8gY29tbWl0IHRoZSBjaGFuZ2UgdG8gZGlzay4KKyAqIEFmdGVyIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYSB0YWcsIHVzZSBsdm1fdmdfd3JpdGUoKSB0byBjb21taXQgdGhlCisgKiBuZXcgVkcgdG8gZGlzay4gIFVwb24gZmFpbHVyZSwgcmV0cnkgdGhlIG9wZXJhdGlvbiBvciByZWxlYXNlIHRoZSBWRyBoYW5kbGUKKyAqIHdpdGggbHZtX3ZnX2Nsb3NlKCkuCisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxwYXJhbSAgIHRhZworICogVGFnIHRvIGFkZCB0byB0aGUgVkcuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX2FkZF90YWcodmdfdCB2ZywgY29uc3QgY2hhciAqdGFnKTsKKworLyoqCisgKiBSZW1vdmUgYSB0YWcgZnJvbSBhIFZHLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBjYWxsaW5nIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUgY2hhbmdlIHRvIGRpc2suCisgKiBBZnRlciBzdWNjZXNzZnVsbHkgcmVtb3ZpbmcgYSB0YWcsIHVzZSBsdm1fdmdfd3JpdGUoKSB0byBjb21taXQgdGhlCisgKiBuZXcgVkcgdG8gZGlzay4gIFVwb24gZmFpbHVyZSwgcmV0cnkgdGhlIG9wZXJhdGlvbiBvciByZWxlYXNlIHRoZSBWRyBoYW5kbGUKKyAqIHdpdGggbHZtX3ZnX2Nsb3NlKCkuCisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxwYXJhbSAgIHRhZworICogVGFnIHRvIHJlbW92ZSBmcm9tIFZHLgorICoKKyAqIFxyZXR1cm4KKyAqIDAgKHN1Y2Nlc3MpIG9yIC0xIChmYWlsdXJlKS4KKyAqLworaW50IGx2bV92Z19yZW1vdmVfdGFnKHZnX3QgdmcsIGNvbnN0IGNoYXIgKnRhZyk7CisKKy8qKgorICogU2V0IHRoZSBleHRlbnQgc2l6ZSBvZiBhIFZHLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBjYWxsaW5nIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUgY2hhbmdlIHRvIGRpc2suCisgKiBBZnRlciBzdWNjZXNzZnVsbHkgc2V0dGluZyBhIG5ldyBleHRlbnQgc2l6ZSwgdXNlIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdAorICogdGhlIG5ldyBWRyB0byBkaXNrLiAgVXBvbiBmYWlsdXJlLCByZXRyeSB0aGUgb3BlcmF0aW9uIG9yIHJlbGVhc2UgdGhlIFZHCisgKiBoYW5kbGUgd2l0aCBsdm1fdmdfY2xvc2UoKS4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHBhcmFtICAgbmV3X3NpemUKKyAqIE5ldyBleHRlbnQgc2l6ZSBpbiBieXRlcy4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fdmdfc2V0X2V4dGVudF9zaXplKHZnX3QgdmcsIHVpbnQzMl90IG5ld19zaXplKTsKKworLyoqCisgKiBHZXQgd2hldGhlciBvciBub3QgYSB2b2x1bWUgZ3JvdXAgaXMgY2x1c3RlcmVkLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIDEgaWYgdGhlIFZHIGlzIGNsdXN0ZXJlZCwgMCBpZiBub3QKKyAqLwordWludDY0X3QgbHZtX3ZnX2lzX2NsdXN0ZXJlZCh2Z190IHZnKTsKKworLyoqCisgKiBHZXQgd2hldGhlciBvciBub3QgYSB2b2x1bWUgZ3JvdXAgaXMgZXhwb3J0ZWQuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogMSBpZiB0aGUgVkcgaXMgZXhwb3J0ZWQsIDAgaWYgbm90CisgKi8KK3VpbnQ2NF90IGx2bV92Z19pc19leHBvcnRlZCh2Z190IHZnKTsKKworLyoqCisgKiBHZXQgd2hldGhlciBvciBub3QgYSB2b2x1bWUgZ3JvdXAgaXMgYSBwYXJ0aWFsIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFdoZW4gb25lIG9yIG1vcmUgcGh5c2ljYWwgdm9sdW1lcyBiZWxvbmdpbmcgdG8gdGhlIHZvbHVtZSBncm91cAorICogYXJlIG1pc3NpbmcgZnJvbSB0aGUgc3lzdGVtIHRoZSB2b2x1bWUgZ3JvdXAgaXMgYSBwYXJ0aWFsIHZvbHVtZQorICogZ3JvdXAuCisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIDEgaWYgdGhlIFZHIGlzIFBWcywgMCBpZiBub3QKKyAqLwordWludDY0X3QgbHZtX3ZnX2lzX3BhcnRpYWwodmdfdCB2Zyk7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIHNlcXVlbmNlIG51bWJlciBvZiBhIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFRoZSBtZXRhZGF0YSBzZXF1ZW5jZSBudW1iZXIgaXMgaW5jcmVudGVkIGZvciBlYWNoIG1ldGFkYXRhIGNoYW5nZS4KKyAqIEFwcGxpY2F0aW9ucyBtYXkgdXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gZGV0ZXJtaW5lIGlmIGFueSBMVk0gb2JqZWN0cworICogaGF2ZSBjaGFuZ2VkIGZyb20gYSBwcmlvciBxdWVyeS4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogTWV0YWRhdGEgc2VxdWVuY2UgbnVtYmVyLgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X3NlcW5vKGNvbnN0IHZnX3QgdmcpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB1dWlkIG9mIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSB1dWlkIGlzIHRpZWQgdG8gdGhlIHZnX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV92Z19jbG9zZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogQ29weSBvZiB0aGUgdXVpZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmx2bV92Z19nZXRfdXVpZChjb25zdCB2Z190IHZnKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgbmFtZSBvZiBhIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBpcyB0aWVkIHRvIHRoZSB2Z190IGhhbmRsZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIENvcHkgb2YgdGhlIG5hbWUuCisgKi8KK2NvbnN0IGNoYXIgKmx2bV92Z19nZXRfbmFtZShjb25zdCB2Z190IHZnKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBieXRlcyBvZiBhIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccmV0dXJuCisgKiBTaXplIGluIGJ5dGVzLgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X3NpemUoY29uc3QgdmdfdCB2Zyk7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHVuYWxsb2NhdGVkIHNwYWNlIGluIGJ5dGVzIG9mIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIEZyZWUgc2l6ZSBpbiBieXRlcy4KKyAqLwordWludDY0X3QgbHZtX3ZnX2dldF9mcmVlX3NpemUoY29uc3QgdmdfdCB2Zyk7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IGV4dGVudCBzaXplIGluIGJ5dGVzIG9mIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIEV4dGVudCBzaXplIGluIGJ5dGVzLgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X2V4dGVudF9zaXplKGNvbnN0IHZnX3QgdmcpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgdG90YWwgZXh0ZW50cyBvZiBhIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccmV0dXJuCisgKiBFeHRlbnQgY291bnQuCisgKi8KK3VpbnQ2NF90IGx2bV92Z19nZXRfZXh0ZW50X2NvdW50KGNvbnN0IHZnX3QgdmcpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgZnJlZSBleHRlbnRzIG9mIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIEZyZWUgZXh0ZW50IGNvdW50LgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X2ZyZWVfZXh0ZW50X2NvdW50KGNvbnN0IHZnX3QgdmcpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcyBvZiBhIHZvbHVtZSBncm91cC4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccmV0dXJuCisgKiBQaHlzaWNhbCB2b2x1bWUgY291bnQuCisgKi8KK3VpbnQ2NF90IGx2bV92Z19nZXRfcHZfY291bnQoY29uc3QgdmdfdCB2Zyk7CisKKy8qKgorICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwaHlzaWNhbCB2b2x1bWVzIGFsbG93ZWQgaW4gYSB2b2x1bWUgZ3JvdXAuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHJldHVybgorICogTWF4aW11bSBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcyBhbGxvd2VkIGluIGEgdm9sdW1lIGdyb3VwLgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X21heF9wdihjb25zdCB2Z190IHZnKTsKKworLyoqCisgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBhbGxvd2VkIGluIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxyZXR1cm4KKyAqIE1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBhbGxvd2VkIGluIGEgdm9sdW1lIGdyb3VwLgorICovCit1aW50NjRfdCBsdm1fdmdfZ2V0X21heF9sdihjb25zdCB2Z190IHZnKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygdm9sdW1lIGdyb3VwIHRhZ3MuCisgKgorICogXG1lbWJlcm9mIHZnX3QKKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGxpc3QgaXMgdGllZCB0byB0aGUgdmdfdCBoYW5kbGUgYW5kIHdpbGwgYmUKKyAqIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLgorICoKKyAqIFRvIHByb2Nlc3MgdGhlIGxpc3QsIHVzZSB0aGUgZG1fbGlzdCBpdGVyYXRvciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKKyAqICAgICAgdmdfdCB2ZzsKKyAqICAgICAgc3RydWN0IGRtX2xpc3QgKnRhZ3M7CisgKiAgICAgIHN0cnVjdCBsdm1fc3RyX2xpc3QgKnN0cmw7CisgKgorICogICAgICB0YWdzID0gbHZtX3ZnX2dldF90YWdzKHZnKTsKKyAqCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzdHJsLCB0YWdzKSB7CisgKgkJdGFnID0gc3RybC0+c3RyOworICogICAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRhZworICogICAgICB9CisgKgorICoKKyAqIFxyZXR1cm4KKyAqIEEgbGlzdCB3aXRoIGVudHJpZXMgb2YgdHlwZSBzdHJ1Y3QgbHZtX3N0cl9saXN0LCBjb250YWluaW5nIHRoZQorICogdGFnIHN0cmluZ3MgYXR0YWNoZWQgdG8gdm9sdW1lIGdyb3VwLgorICogSWYgbm8gdGFncyBhcmUgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIFZHLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkCisgKiAoY2hlY2sgd2l0aCBkbV9saXN0X2VtcHR5KCkpLgorICogSWYgdGhlcmUgaXMgYSBwcm9ibGVtIG9idGFpbmluZyB0aGUgbGlzdCBvZiB0YWdzLCBOVUxMIGlzIHJldHVybmVkLgorICovCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX3ZnX2dldF90YWdzKGNvbnN0IHZnX3QgdmcpOworCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgYSBWRyBwcm9wZXJ0eQorICoKKyAqIFxtZW1iZXJvZiB2Z190CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxwYXJhbSAgIG5hbWUKKyAqIE5hbWUgb2YgcHJvcGVydHkgdG8gcXVlcnkuICBTZWUgdmdzIG1hbiBwYWdlIGZvciBmdWxsIGxpc3Qgb2YgcHJvcGVydGllcworICogdGhhdCBtYXkgYmUgcXVlcmllZC4KKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgaXMgdGllZCB0byB0aGUgdmdfdAorICogaGFuZGxlIGFuZCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICAgIGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworICogICAgICBjaGFyICpwcm9wX25hbWUgPSAidmdfbWRhX2NvdW50IjsKKyAqCisgKiAgICAgIHYgPSBsdm1fdmdfZ2V0X3Byb3BlcnR5KHZnLCBwcm9wX25hbWUpOworICogICAgICBpZiAoIXYuaXNfdmFsaWQpIHsKKyAqICAgICAgICAgICBwcmludGYoIkludmFsaWQgcHJvcGVydHkgbmFtZSBvciB1bmFibGUgdG8gcXVlcnkiCisgKiAgICAgICAgICAgICAgICAgICInJXMnLCBlcnJubyA9ICVkLlxuIiwgcHJvcF9uYW1lLCBsdm1fZXJybm8obGliaCkpOworICogICAgICAgICAgIHJldHVybjsKKyAqICAgICAgfQorICogICAgICBpZiAodi5pc19zdHJpbmcpCisgKiAgICAgICAgICAgcHJpbnRmKCIsIHZhbHVlID0gJXNcbiIsIHYudmFsdWUuc3RyaW5nKTsKKyAqCWlmICh2LmlzX2ludGVnZXIpCisgKiAgICAgICAgICAgcHJpbnRmKCIsIHZhbHVlID0gJSJQUkl1NjQiXG4iLCB2LnZhbHVlLmludGVnZXIpOworICoKKyAqCisgKiBccmV0dXJuCisgKiBsdm1fcHJvcGVydHlfdmFsdWUgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjdXJyZW50CisgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBDYWxsZXIgc2hvdWxkIGNoZWNrICdpc192YWxpZCcgZmxhZyBiZWZvcmUgdXNpbmcKKyAqIHRoZSB2YWx1ZS4gIElmICdpc192YWxpZCcgaXMgbm90IHNldCwgY2FsbGVyIHNob3VsZCBjaGVjayBsdm1fZXJybm8oKQorICogZm9yIHNwZWNpZmljIGVycm9yLgorICovCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV92Z19nZXRfcHJvcGVydHkoY29uc3QgdmdfdCB2ZywgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIFZHIHByb3BlcnR5LiAgTm90ZSB0aGF0IHRoZSBwcm9wZXJ0eSBtdXN0IGJlCisgKiBhICdzZXR0YWJsZScgcHJvcGVydHksIGFzIGV2aWRlbmNlZCBieSB0aGUgJ2lzX3NldHRhYmxlJyBmbGFnCisgKiB3aGVuIHF1ZXJ5aW5nIHRoZSBwcm9wZXJ0eS4KKyAqCisgKiBcbWVtYmVyb2YgdmdfdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhIHN0cmluZyBwcm9wZXJ0eSB2YWx1ZSBpcyB0aWVkIHRvIHRoZSB2Z190CisgKiBoYW5kbGUgYW5kIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogRXhhbXBsZSAoaW50ZWdlcik6CisgKiAgICAgIGx2bV9wcm9wZXJ0eV92YWx1ZSBjb3BpZXM7CisgKgorICogICAgICBpZiAobHZtX3ZnX2dldF9wcm9wZXJ0eSh2ZywgInZnX21kYV9jb3BpZXMiLCAmY29waWVzKSA8IDApIHsKKyAqICAgICAgICAgICAgICAvLyBFcnJvciAtIHVuYWJsZSB0byBxdWVyeSBwcm9wZXJ0eQorICogICAgICB9CisgKiAgICAgIGlmICghY29waWVzLmlzX3NldHRhYmxlKSB7CisgKiAgICAgICAgICAgICAgLy8gRXJyb3IgLSBwcm9wZXJ0eSBub3Qgc2V0dGFibGUKKyAqICAgICAgfQorICogICAgICBjb3BpZXMudmFsdWUuaW50ZWdlciA9IDI7CisgKiAgICAgIGlmIChsdm1fdmdfc2V0X3Byb3BlcnR5KHZnLCAidmdfbWRhX2NvcGllcyIsICZjb3BpZXMpIDwgMCkgeworICogICAgICAgICAgICAgIC8vIGhhbmRsZSBlcnJvcgorICogICAgICB9CisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX3NldF9wcm9wZXJ0eShjb25zdCB2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogbG9naWNhbCB2b2x1bWUgaGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDcmVhdGUgYSBsaW5lYXIgbG9naWNhbCB2b2x1bWUuCisgKiBUaGlzIGZ1bmN0aW9uIGNvbW1pdHMgdGhlIGNoYW5nZSB0byBkaXNrIGFuZCBkb2VzIF9ub3RfIHJlcXVpcmUgY2FsbGluZworICogbHZtX3ZnX3dyaXRlKCkuCisgKiBOT1RFOiBUaGUgY29tbWl0IGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UKKyAqIGFzIHRoZSBBUEkgaXMgZGV2ZWxvcGVkLgorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccGFyYW0gICBuYW1lCisgKiBOYW1lIG9mIGxvZ2ljYWwgdm9sdW1lIHRvIGNyZWF0ZS4KKyAqCisgKiBccGFyYW0gICBzaXplCisgKiBTaXplIG9mIGxvZ2ljYWwgdm9sdW1lIGluIGV4dGVudHMuCisgKgorICogXHJldHVybgorICogbm9uLU5VTEwgaGFuZGxlIHRvIGFuIExWIG9iamVjdCBjcmVhdGVkLCBvciBOVUxMIGlmIGNyZWF0aW9uIGZhaWxzLgorICoKKyAqLworbHZfdCBsdm1fdmdfY3JlYXRlX2x2X2xpbmVhcih2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBzaXplKTsKKworLyoqCisgKiBSZXR1cm4gYSBsaXN0IG9mIGx2c2VnIGhhbmRsZXMgZm9yIGEgZ2l2ZW4gTFYgaGFuZGxlLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiBBIGxpc3Qgb2YgbHZtX2x2c2VnX2xpc3Qgc3RydWN0dXJlcyBjb250YWluaW5nIGx2c2VnIGhhbmRsZXMgZm9yIHRoaXMgbHYuCisgKi8KK3N0cnVjdCBkbV9saXN0ICpsdm1fbHZfbGlzdF9sdnNlZ3MobHZfdCBsdik7CisKKy8qKgorICogTG9va3VwIGFuIExWIGhhbmRsZSBpbiBhIFZHIGJ5IHRoZSBMViBuYW1lLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxwYXJhbSAgIG5hbWUKKyAqIE5hbWUgb2YgTFYgdG8gbG9va3VwLgorICoKKyAqIFxyZXR1cm4KKyAqIG5vbi1OVUxMIGhhbmRsZSB0byB0aGUgTFYgJ25hbWUnIGF0dGFjaGVkIHRvIHRoZSBWRy4KKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIExWIG5hbWUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgVkcgaGFuZGxlLgorICovCitsdl90IGx2bV9sdl9mcm9tX25hbWUodmdfdCB2ZywgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogTG9va3VwIGFuIExWIGhhbmRsZSBpbiBhIFZHIGJ5IHRoZSBMViB1dWlkLgorICogVGhlIGZvcm0gb2YgdGhlIHV1aWQgbWF5IGJlIGVpdGhlciB0aGUgZm9ybWF0dGVkLCBodW1hbi1yZWFkYWJsZSBmb3JtLAorICogb3IgdGhlIG5vbi1mb3JtYXR0ZWQgZm9ybS4KKyAqCisgKiBcbWVtYmVyb2YgbHZfdAorICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWRyBoYW5kbGUgb2J0YWluZWQgZnJvbSBsdm1fdmdfY3JlYXRlKCkgb3IgbHZtX3ZnX29wZW4oKS4KKyAqCisgKiBccGFyYW0gICB1dWlkCisgKiBVVUlEIG9mIExWIHRvIGxvb2t1cC4KKyAqCisgKiBccmV0dXJuCisgKiBub24tTlVMTCBoYW5kbGUgdG8gdGhlIExWIHdpdGggJ3V1aWQnIGF0dGFjaGVkIHRvIHRoZSBWRy4KKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIExWIHV1aWQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgVkcgaGFuZGxlLgorICovCitsdl90IGx2bV9sdl9mcm9tX3V1aWQodmdfdCB2ZywgY29uc3QgY2hhciAqdXVpZCk7CisKKy8qKgorICogQWN0aXZhdGUgYSBsb2dpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgbHZfdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGx2bSBjb21tYW5kICJsdmNoYW5nZSAtYXkiLgorICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gY2Fubm90IGN1cnJlbnRseSBoYW5kbGUgTFZzIHdpdGggYW4gaW4tcHJvZ3Jlc3MgcHZtb3ZlIG9yCisgKiBsdmNvbnZlcnQuCisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fbHZfYWN0aXZhdGUobHZfdCBsdik7CisKKy8qKgorICogRGVhY3RpdmF0ZSBhIGxvZ2ljYWwgdm9sdW1lLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgbHZtIGNvbW1hbmQgImx2Y2hhbmdlIC1hbiIuCisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fbHZfZGVhY3RpdmF0ZShsdl90IGx2KTsKKworLyoqCisgKiBSZW1vdmUgYSBsb2dpY2FsIHZvbHVtZSBmcm9tIGEgdm9sdW1lIGdyb3VwLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhpcyBmdW5jdGlvbiBjb21taXRzIHRoZSBjaGFuZ2UgdG8gZGlzayBhbmQgZG9lcyBfbm90XyByZXF1aXJlIGNhbGxpbmcKKyAqIGx2bV92Z193cml0ZSgpLgorICogTk9URTogVGhlIGNvbW1pdCBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlCisgKiBhcyB0aGUgQVBJIGlzIGRldmVsb3BlZC4KKyAqIEN1cnJlbnRseSBvbmx5IHJlbW92aW5nIGxpbmVhciBMVnMgYXJlIHBvc3NpYmxlLgorICoKKyAqIFxwYXJhbSAgIGx2CisgKiBMb2dpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICovCitpbnQgbHZtX3ZnX3JlbW92ZV9sdihsdl90IGx2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgbmFtZSBvZiBhIGxvZ2ljYWwgdm9sdW1lLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSB1dWlkIGlzIHRpZWQgdG8gdGhlIHZnX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV92Z19jbG9zZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIENvcHkgb2YgdGhlIHV1aWQgc3RyaW5nLgorICovCitjb25zdCBjaGFyICpsdm1fbHZfZ2V0X3V1aWQoY29uc3QgbHZfdCBsdik7CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50IHV1aWQgb2YgYSBsb2dpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgbHZfdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBpcyB0aWVkIHRvIHRoZSB2Z190IGhhbmRsZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiBDb3B5IG9mIHRoZSBuYW1lLgorICovCitjb25zdCBjaGFyICpsdm1fbHZfZ2V0X25hbWUoY29uc3QgbHZfdCBsdik7CisKKy8qKgorICogR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGEgbG9naWNhbCB2b2x1bWUuCisgKgorICogXG1lbWJlcm9mIGx2X3QKKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG5hbWUgaXMgdGllZCB0byB0aGUgdmdfdCBoYW5kbGUgYW5kIHdpbGwgYmUKKyAqIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLgorICoKKyAqIFxwYXJhbSAgIGx2CisgKiBMb2dpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHJldHVybgorICogQ29weSBvZiB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGxvZ2ljYWwgdm9sdW1lCisgKi8KK2NvbnN0IGNoYXIgKmx2bV9sdl9nZXRfYXR0cihjb25zdCBsdl90IGx2KTsKKworLyoqCisgKiBHZXQgdGhlIG9yaWdpbiBvZiBhIHNuYXBzaG90LgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBuYW1lIGlzIHRpZWQgdG8gdGhlIHZnX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV92Z19jbG9zZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIE51bGwgaWYgdGhlIGxvZ2ljYWwgdm9sdW1lIGlzIG5vdCBhIHNuYXBzaG90LCBlbHNlIG9yaWdpbiBuYW1lLgorICovCitjb25zdCBjaGFyICpsdm1fbHZfZ2V0X29yaWdpbihjb25zdCBsdl90IGx2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBieXRlcyBvZiBhIGxvZ2ljYWwgdm9sdW1lLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiBTaXplIGluIGJ5dGVzLgorICovCit1aW50NjRfdCBsdm1fbHZfZ2V0X3NpemUoY29uc3QgbHZfdCBsdik7CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiBhIExWIHByb3BlcnR5CisgKgorICogXG1lbWJlcm9mIGx2X3QKKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIG5hbWUKKyAqIE5hbWUgb2YgcHJvcGVydHkgdG8gcXVlcnkuICBTZWUgbHZzIG1hbiBwYWdlIGZvciBmdWxsIGxpc3Qgb2YgcHJvcGVydGllcworICogdGhhdCBtYXkgYmUgcXVlcmllZC4KKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgaXMgdGllZCB0byB0aGUgdmdfdAorICogaGFuZGxlIGFuZCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICAgIGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworICogICAgICBjaGFyICpwcm9wX25hbWUgPSAic2VnX2NvdW50IjsKKyAqCisgKiAgICAgIHYgPSBsdm1fbHZfZ2V0X3Byb3BlcnR5KGx2LCBwcm9wX25hbWUpOworICogICAgICBpZiAoIXYuaXNfdmFsaWQpIHsKKyAqICAgICAgICAgICBwcmludGYoIkludmFsaWQgcHJvcGVydHkgbmFtZSBvciB1bmFibGUgdG8gcXVlcnkiCisgKiAgICAgICAgICAgICAgICAgICInJXMnLCBlcnJubyA9ICVkLlxuIiwgcHJvcF9uYW1lLCBsdm1fZXJybm8obGliaCkpOworICogICAgICAgICAgIHJldHVybjsKKyAqICAgICAgfQorICogICAgICBpZiAodi5pc19zdHJpbmcpCisgKiAgICAgICAgICAgcHJpbnRmKCIsIHZhbHVlID0gJXNcbiIsIHYudmFsdWUuc3RyaW5nKTsKKyAqCWlmICh2LmlzX2ludGVnZXIpCisgKiAgICAgICAgICAgcHJpbnRmKCIsIHZhbHVlID0gJSJQUkl1NjQiXG4iLCB2LnZhbHVlLmludGVnZXIpOworICoKKyAqIFxyZXR1cm4KKyAqIGx2bV9wcm9wZXJ0eV92YWx1ZSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGN1cnJlbnQKKyAqIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gIENhbGxlciBzaG91bGQgY2hlY2sgJ2lzX3ZhbGlkJyBmbGFnIGJlZm9yZSB1c2luZworICogdGhlIHZhbHVlLiAgSWYgJ2lzX3ZhbGlkJyBpcyBub3Qgc2V0LCBjYWxsZXIgc2hvdWxkIGNoZWNrIGx2bV9lcnJubygpCisgKiBmb3Igc3BlY2lmaWMgZXJyb3IuCisgKi8KK3N0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgbHZtX2x2X2dldF9wcm9wZXJ0eShjb25zdCBsdl90IGx2LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIGEgTFYgc2VnbWVudCBwcm9wZXJ0eQorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgbHZzZWcKKyAqIExvZ2ljYWwgdm9sdW1lIHNlZ21lbnQgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIG5hbWUKKyAqIE5hbWUgb2YgcHJvcGVydHkgdG8gcXVlcnkuICBTZWUgbHZzIG1hbiBwYWdlIGZvciBmdWxsIGxpc3Qgb2YgcHJvcGVydGllcworICogdGhhdCBtYXkgYmUgcXVlcmllZC4KKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgaXMgdGllZCB0byB0aGUgdmdfdAorICogaGFuZGxlIGFuZCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICAgIGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworICogICAgICBjaGFyICpwcm9wX25hbWUgPSAic2VnX3N0YXJ0X3BlIjsKKyAqCisgKiAgICAgIHYgPSBsdm1fbHZzZWdfZ2V0X3Byb3BlcnR5KGx2c2VnLCBwcm9wX25hbWUpOworICogICAgICBpZiAobHZtX2Vycm5vKGxpYmgpIHx8ICF2LmlzX3ZhbGlkKSB7CisgKiAgICAgICAgICAgLy8gaGFuZGxlIGVycm9yCisgKiAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIHByb3BlcnR5IG5hbWUgb3IgdW5hYmxlIHRvIHF1ZXJ5IgorICogICAgICAgICAgICAgICAgICAiJyVzJy5cbiIsIHByb3BfbmFtZSk7CisgKiAgICAgICAgICAgcmV0dXJuOworICogICAgICB9CisgKiAgICAgIGlmICh2LmlzX3N0cmluZykKKyAqICAgICAgICAgICBwcmludGYoIiwgdmFsdWUgPSAlc1xuIiwgdi52YWx1ZS5zdHJpbmcpOworICoJZWxzZQorICogICAgICAgICAgIHByaW50ZigiLCB2YWx1ZSA9ICUiUFJJdTY0IlxuIiwgdi52YWx1ZS5pbnRlZ2VyKTsKKyAqCisgKiBccmV0dXJuCisgKiBsdm1fcHJvcGVydHlfdmFsdWUgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjdXJyZW50CisgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBDYWxsZXIgc2hvdWxkIGNoZWNrIGx2bV9lcnJubygpIGFzIHdlbGwKKyAqIGFzICdpc192YWxpZCcgZmxhZyBiZWZvcmUgdXNpbmcgdGhlIHZhbHVlLgorICovCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9sdnNlZ19nZXRfcHJvcGVydHkoY29uc3QgbHZzZWdfdCBsdnNlZywKKwkJCQkJCSBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZhdGlvbiBzdGF0ZSBvZiBhIGxvZ2ljYWwgdm9sdW1lLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiAxIGlmIHRoZSBMViBpcyBhY3RpdmUgaW4gdGhlIGtlcm5lbCwgMCBpZiBub3QKKyAqLwordWludDY0X3QgbHZtX2x2X2lzX2FjdGl2ZShjb25zdCBsdl90IGx2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc3VzcGVuZGVkIHN0YXRlIG9mIGEgbG9naWNhbCB2b2x1bWUuCisgKgorICogXG1lbWJlcm9mIGx2X3QKKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIDEgaWYgdGhlIExWIGlzIHN1c3BlbmRlZCBpbiB0aGUga2VybmVsLCAwIGlmIG5vdAorICovCit1aW50NjRfdCBsdm1fbHZfaXNfc3VzcGVuZGVkKGNvbnN0IGx2X3QgbHYpOworCisvKioKKyAqIEFkZCBhIHRhZyB0byBhbiBMVi4KKyAqCisgKiBcbWVtYmVyb2YgbHZfdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgY2FsbGluZyBsdm1fdmdfd3JpdGUoKSB0byBjb21taXQgdGhlIGNoYW5nZSB0byBkaXNrLgorICogQWZ0ZXIgc3VjY2Vzc2Z1bGx5IGFkZGluZyBhIHRhZywgdXNlIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUKKyAqIG5ldyBWRyB0byBkaXNrLiAgVXBvbiBmYWlsdXJlLCByZXRyeSB0aGUgb3BlcmF0aW9uIG9yIHJlbGVhc2UgdGhlIFZHIGhhbmRsZQorICogd2l0aCBsdm1fdmdfY2xvc2UoKS4KKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIHRhZworICogVGFnIHRvIGFkZCB0byBhbiBMVi4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fbHZfYWRkX3RhZyhsdl90IGx2LCBjb25zdCBjaGFyICp0YWcpOworCisvKioKKyAqIFJlbW92ZSBhIHRhZyBmcm9tIGFuIExWLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBjYWxsaW5nIGx2bV92Z193cml0ZSgpIHRvIGNvbW1pdCB0aGUgY2hhbmdlIHRvIGRpc2suCisgKiBBZnRlciBzdWNjZXNzZnVsbHkgcmVtb3ZpbmcgYSB0YWcsIHVzZSBsdm1fdmdfd3JpdGUoKSB0byBjb21taXQgdGhlCisgKiBuZXcgVkcgdG8gZGlzay4gIFVwb24gZmFpbHVyZSwgcmV0cnkgdGhlIG9wZXJhdGlvbiBvciByZWxlYXNlIHRoZSBWRyBoYW5kbGUKKyAqIHdpdGggbHZtX3ZnX2Nsb3NlKCkuCisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gICB0YWcKKyAqIFRhZyB0byByZW1vdmUgZnJvbSBMVi4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKi8KK2ludCBsdm1fbHZfcmVtb3ZlX3RhZyhsdl90IGx2LCBjb25zdCBjaGFyICp0YWcpOworCisvKioKKyAqIFJldHVybiB0aGUgbGlzdCBvZiBsb2dpY2FsIHZvbHVtZSB0YWdzLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBsaXN0IGlzIHRpZWQgdG8gdGhlIHZnX3QgaGFuZGxlIGFuZCB3aWxsIGJlCisgKiByZWxlYXNlZCB3aGVuIGx2bV92Z19jbG9zZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBUbyBwcm9jZXNzIHRoZSBsaXN0LCB1c2UgdGhlIGRtX2xpc3QgaXRlcmF0b3IgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CisgKiAgICAgIGx2X3QgbHY7CisgKiAgICAgIHN0cnVjdCBkbV9saXN0ICp0YWdzOworICogICAgICBzdHJ1Y3QgbHZtX3N0cl9saXN0ICpzdHJsOworICoKKyAqICAgICAgdGFncyA9IGx2bV9sdl9nZXRfdGFncyhsdik7CisgKglkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3RybCwgdGFncykgeworICoJCXRhZyA9IHN0cmwtPnN0cjsKKyAqICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0YWcKKyAqICAgICAgfQorICoKKyAqCisgKiBccmV0dXJuCisgKiBBIGxpc3Qgd2l0aCBlbnRyaWVzIG9mIHR5cGUgc3RydWN0IGx2bV9zdHJfbGlzdCwgY29udGFpbmluZyB0aGUKKyAqIHRhZyBzdHJpbmdzIGF0dGFjaGVkIHRvIHZvbHVtZSBncm91cC4KKyAqIElmIG5vIHRhZ3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBMViwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZAorICogKGNoZWNrIHdpdGggZG1fbGlzdF9lbXB0eSgpKS4KKyAqIElmIHRoZXJlIGlzIGEgcHJvYmxlbSBvYnRhaW5pbmcgdGhlIGxpc3Qgb2YgdGFncywgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IGRtX2xpc3QgKmx2bV9sdl9nZXRfdGFncyhjb25zdCBsdl90IGx2KTsKKworLyoqCisgKiBSZW5hbWUgbG9naWNhbCB2b2x1bWUgdG8gbmV3X25hbWUuCisgKgorICogXG1lbWJlcm9mIGx2X3QKKyAqCisgKiBccGFyYW0gICBsdgorICogTG9naWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIG5ld19uYW1lCisgKiBOZXcgbmFtZSBvZiBsb2dpY2FsIHZvbHVtZS4KKyAqCisgKiBccmV0dXJuCisgKiAwIChzdWNjZXNzKSBvciAtMSAoZmFpbHVyZSkuCisgKgorICovCitpbnQgbHZtX2x2X3JlbmFtZShsdl90IGx2LCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CisKKy8qKgorICogUmVzaXplIGxvZ2ljYWwgdm9sdW1lIHRvIG5ld19zaXplIGJ5dGVzLgorICoKKyAqIFxtZW1iZXJvZiBsdl90CisgKgorICogXHBhcmFtICAgbHYKKyAqIExvZ2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gICBuZXdfc2l6ZQorICogTmV3IHNpemUgaW4gYnl0ZXMuCisgKgorICogXHJldHVybgorICogMCAoc3VjY2Vzcykgb3IgLTEgKGZhaWx1cmUpLgorICoKKyAqLworaW50IGx2bV9sdl9yZXNpemUoY29uc3QgbHZfdCBsdiwgdWludDY0X3QgbmV3X3NpemUpOworCisvKioKKyAqIENyZWF0ZSBhIHNuYXBzaG90IG9mIGEgbG9naWNhbCB2b2x1bWUKKyAqCisgKiBcbWVtYmVyb2YgbHZfdAorICoKKyAqIFxwYXJhbSAgIGx2CisgKiBMb2dpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHBhcmFtICAgc25hcF9uYW1lCisgKiBOYW1lIG9mIHRoZSBzbmFwc2hvdC4KKyAqCisgKiBccGFyYW0gICBtYXhfc25hcF9zaXplCisgKiBNYXggc25hcHNob3Qgc3BhY2UgdG8gdXNlLiBJZiB5b3UgcGFzcyB6ZXJvIHRoZSBzYW1lIGFtb3VudCBvZiBzcGFjZSBhcworICogdGhlIG9yaWdpbiB3aWxsIGJlIHVzZWQuCisgKgorICogXHJldHVybgorICogVmFsaWQgbHYgcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIE5VTEwgb24gZXJyb3IuCisgKgorICovCitsdl90IGx2bV9sdl9zbmFwc2hvdChjb25zdCBsdl90IGx2LCBjb25zdCBjaGFyICpzbmFwX25hbWUsIHVpbnQ2NF90IG1heF9zbmFwX3NpemUpOworCisvKioKKyAqIFZhbGlkYXRlIGEgbmFtZSB0byBiZSB1c2VkIGZvciBMViBjcmVhdGlvbi4KKyAqCisgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgbmFtZSBkb2VzIG5vdCBjb250YWluIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMsIG1heCBsZW5ndGgKKyAqIGFuZCB0aGF0IHRoZSBMViBuYW1lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBmb3IgdGhpcyBWRy4KKyAqCisgKiBOb3RlOiBZb3UgY2FuIGhhdmUgdGhlIHNhbWUgTFYgbmFtZSBpbiBkaWZmZXJlbnQgVkdzLCB0aHVzIHRoZSByZWFzb24gdGhpcworICogZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB5b3Ugc3BlY2lmeSBhIFZHIHRvIGNoZWNrIGFnYWluc3QuCisgKgorICogXHBhcmFtIGx2CisgKiBWb2x1bWUgZ3JvdXAgaGFuZGxlLgorICoKKyAqIFxwYXJhbSBuYW1lCisgKiBOYW1lIHRvIHZhbGlkYXRlCisgKi8KK2ludCBsdm1fbHZfbmFtZV92YWxpZGF0ZShjb25zdCB2Z190IHZnLCBjb25zdCBjaGFyICpsdl9uYW1lKTsKKworLyoqCisgKiBUaGluIHByb3Zpc2lvbmluZyBkaXNjYXJkIHBvbGljaWVzCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTFZNX1RISU5fRElTQ0FSRFNfSUdOT1JFLAorCUxWTV9USElOX0RJU0NBUkRTX05PX1BBU1NET1dOLAorCUxWTV9USElOX0RJU0NBUkRTX1BBU1NET1dOLAorfSBsdm1fdGhpbl9kaXNjYXJkc190OworCisvKioKKyAqIENyZWF0ZSBhIHRoaW5wb29sIHBhcmFtZXRlciBwYXNzaW5nIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBWRworICoKKyAqIFxwYXJhbSAgIHZnCisgKiBWb2x1bWUgR3JvdXAgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIHBvb2xfbmFtZQorICogTmFtZSBvZiB0aGUgcG9vbC4KKyAqCisgKiBccGFyYW0gICBzaXplCisgKiBzaXplIG9mIHRoZSBwb29sCisgKgorICogXHBhcmFtICAgY2h1bmtfc2l6ZQorICogZGF0YSBibG9jayBzaXplIG9mIHRoZSBwb29sCisgKiBEZWZhdWx0IHZhbHVlIGlzIERFRkFVTFRfVEhJTl9QT09MX0NIVU5LX1NJWkUgKiAyIHdoZW4gMCBwYXNzZWQgYXMgY2h1bmtfc2l6ZQorICogRE1fVEhJTl9NSU5fREFUQV9CTE9DS19TSVpFIDwgY2h1bmtfc2l6ZSA8IERNX1RISU5fTUFYX0RBVEFfQkxPQ0tfU0laRQorICoKKyAqIFxwYXJhbSBtZXRhX3NpemUKKyAqIFNpemUgb2YgdGhpbiBwb29sJ3MgbWV0YWRhdGEgbG9naWNhbCB2b2x1bWUuIEFsbG93ZWQgcmFuZ2UgaXMgMk1CLTE2R0IuCisgKiBEZWZhdWx0IHZhbHVlIChpZSBpZiAwKSBwb29sIHNpemUgLyBwb29sIGNodW5rIHNpemUgKiA2NAorICoKKyAqIFxwYXJhbSBkaXNjYXJkCisgKiBUaGluIGRpc2NhcmQgcG9saWN5CisgKiBOb3RlOiBUSElOX0RJU0NBUkRTX1BBU1NET1dOIGlzIHRoZSBkZWZhdWx0LgorICoKKyAqIFxyZXR1cm4KKyAqIFZhbGlkIGx2X2NyZWF0ZV9wYXJhbXMgcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIE5VTEwgb24gZXJyb3IuCisgKiBOb3RlOiBNZW1vcnkgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZywgaXQgd2lsbCBnZXQgcmVjbGFpbWVkIHdoZW4gdmcgaXMKKyAqIGNsb3NlZC4KKyAqCisgKi8KK2x2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluX3Bvb2wodmdfdCB2ZywKKwkJY29uc3QgY2hhciAqcG9vbF9uYW1lLCB1aW50NjRfdCBzaXplLCB1aW50MzJfdCBjaHVua19zaXplLAorCQl1aW50NjRfdCBtZXRhX3NpemUsIGx2bV90aGluX2Rpc2NhcmRzX3QgZGlzY2FyZCk7CisKKyNkZWZpbmUgbHZtX2x2X3BhcmFtc19jcmVhdGVfdGhpbl9wb29sX2RlZmF1bHQodmcsIHBvb2xfbmFtZSwgc2l6ZSkgXAorCQkJbHZtX2x2X3BhcmFtc19jcmVhdGVfdGhpbl9wb29sKCh2ZyksIChwb29sX25hbWUpLCAoc2l6ZSksIDAsIDAsIFwKKwkJCUxWTV9USElOX0RJU0NBUkRTX1BBU1NET1dOKQorCisvKioKKyAqIENyZWF0ZXMgdGhlIHNuYXBzaG90IHBhcmFtZXRlciBwYXNzaW5nIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBsdi4KKyAqCisgKiBccGFyYW0JbHYKKyAqIFRoZSBsb2dpY2FsIHZvbHVtZSB0byBzbmFwc2hvdAorICoKKyAqIFxwYXJhbQlzbmFwX25hbWUKKyAqIE5hbWUgb2Ygc25hcHNob3QKKyAqCisgKiBccGFyYW0JbWF4X3NuYXBfc2l6ZQorICogVXNlZCBmb3Igb2xkIHNuYXAgc2hvdHMgbWF4IHNpemUsIHNldCB0byB6ZXJvIGZvciB0aGlucAorICoKKyAqIFxyZXR1cm4KKyAqIFZhbGlkIGx2X2NyZWF0ZV9wYXJhbXMgcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIE5VTEwgb24gZXJyb3IuCisgKiBOb3RlOiBNZW1vcnkgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZywgaXQgd2lsbCBnZXQgcmVjbGFpbWVkIHdoZW4gdmcgaXMKKyAqIGNsb3NlZC4KKyAqLworbHZfY3JlYXRlX3BhcmFtc190IGx2bV9sdl9wYXJhbXNfY3JlYXRlX3NuYXBzaG90KGNvbnN0IGx2X3QgbHYsCisJCQkJCQkJCQkJCQkJY29uc3QgY2hhciAqc25hcF9uYW1lLAorCQkJCQkJCQkJCQkJCXVpbnQ2NF90IG1heF9zbmFwX3NpemUpOworLyoqCisgKiBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIG9mIGEgbHYgY3JlYXRlIHBhcmFtZXRlciBieSBuYW1lCisgKgorICogXHBhcmFtCXBhcmFtcwkJbHYgY3JlYXRlIHBhcmFtZXRlcnMKKyAqCisgKiBccGFyYW0JbmFtZQkJbmFtZSBvZiBwYXJhbWV0ZXIKKyAqCisgKiBccmV0dXJuCisgKiBsdm1fcHJvcGVydHlfdmFsdWUgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjdXJyZW50CisgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBDYWxsZXIgc2hvdWxkIGNoZWNrICdpc192YWxpZCcgZmxhZyBiZWZvcmUgdXNpbmcKKyAqIHRoZSB2YWx1ZS4gIElmICdpc192YWxpZCcgaXMgbm90IHNldCwgY2FsbGVyIHNob3VsZCBjaGVjayBsdm1fZXJybm8oKQorICogZm9yIHNwZWNpZmljIGVycm9yLgorICovCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9sdl9wYXJhbXNfZ2V0X3Byb3BlcnR5KAorCQkJCQkJCQkJCQljb25zdCBsdl9jcmVhdGVfcGFyYW1zX3QgcGFyYW1zLAorCQkJCQkJCQkJCQljb25zdCBjaGFyICpuYW1lKTsKKworCisvKioKKyAqIFNldCB0aGUgc3BlY2lmaWMgdmFsdWUgb2YgYSBsdiBjcmVhdGUgcGFyYW1ldGVyIGJ5IG5hbWUKKyAqCisgKiBOb3RlIHRoYXQgdGhlIHByb3BlcnR5IG11c3QgYmUgYSAnc2V0dGFibGUnIHByb3BlcnR5LCBhcyBldmlkZW5jZWQgJworICogYnkgdGhlICdpc19zZXR0YWJsZScgZmxhZyB3aGVuIHF1ZXJ5aW5nIHRoZSBwcm9wZXJ0eS4KKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgaXMgdGllZCB0byB0aGUgdmdfdAorICogaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbHZfY3JlYXRlX3BhcmFtc190IGFuZCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4KKyAqIGx2bV92Z19jbG9zZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBccGFyYW0JcGFyYW1zCQlsdiBjcmVhdGUgcGFyYW1ldGVycworICoKKyAqIFxwYXJhbQluYW1lCQluYW1lIG9mIHBhcmFtZXRlcgorICoKKyAqIFxwYXJhbQlwcm9wCQlQcm9wZXJ0eSB2YWx1ZSB0byB1c2UgZm9yIHNldHRpbmcKKyAqCisgKiBccmV0dXJuCisgKiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitpbnQgbHZtX2x2X3BhcmFtc19zZXRfcHJvcGVydHkobHZfY3JlYXRlX3BhcmFtc190IHBhcmFtcywKKwkJCQkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCQkJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqcHJvcCk7CisKKy8qKgorICogQ3JlYXRlIGEgdGhpbiBMViBjcmVhdGlvbiBwYXJhbWV0ZXJzIGluIGEgZ2l2ZW4gVkcgJiB0aGluIHBvb2wKKyAqCisgKiBccGFyYW0gICB2ZworICogVm9sdW1lIEdyb3VwIGhhbmRsZS4KKyAqCisgKiBccGFyYW0gICBwb29sX25hbWUKKyAqIE5hbWUgb2YgdGhlIHBvb2wuCisgKgorICogXHBhcmFtIGx2bmFtZQorICogTmFtZSBvZiB0aGUgTFYgdG8gY3JlYXRlCisgKgorICogXHBhcmFtICAgc2l6ZQorICogU2l6ZSBvZiBsb2dpY2FsIHZvbHVtZQorICoKKyAqIFxyZXR1cm4KKyAqIFZhbGlkIGx2X2NyZWF0ZV9wYXJhbXMgcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIE5VTEwgb24gZXJyb3IuCisgKiBOb3RlOiBNZW1vcnkgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZywgaXQgd2lsbCBnZXQgcmVjbGFpbWVkIHdoZW4gdmcgaXMKKyAqIGNsb3NlZC4KKyAqCisgKi8KK2x2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluKGNvbnN0IHZnX3QgdmcsIGNvbnN0IGNoYXIgKnBvb2xfbmFtZSwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKmx2bmFtZSwgdWludDY0X3Qgc2l6ZSk7CisvKioKKyAqIENyZWF0ZSB0aGUgYWN0dWFsIGxvZ2ljYWwgdm9sdW1lLgorICoKKyAqIFxwYXJhbQlwYXJhbXMJCVRoZSBwYXJhbWV0ZXJzIG9iamVjdCBmb3IgbHYgY3JlYXRpb24KKyAqCisgKiBccmV0dXJuCisgKiBWYWxpZCBsdiBwb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTCBvbiBlcnJvci4KKyAqLworbHZfdCBsdm1fbHZfY3JlYXRlKGx2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogcGh5c2ljYWwgdm9sdW1lIGhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBQaHlzaWNhbCB2b2x1bWUgaGFuZGxpbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZS4gT25seSBwaHlzaWNhbCB2b2x1bWVzCisgKiBib3VuZCB0byBhIHZnIGNvbnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uLiBUaGVyZWZvcmUgdGhlIGNyZWF0aW9uLAorICogbW9kaWZpY2F0aW9uIGFuZCB0aGUgcmVtb3ZhbCBvZiBvcnBoYW4gcGh5c2ljYWwgdm9sdW1lcyBpcyBub3Qgc3Vwb3J0ZWQuCisgKi8KKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdXVpZCBvZiBhIHBoeXNpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgdXVpZCBpcyB0aWVkIHRvIHRoZSB2Z190IGhhbmRsZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogXHBhcmFtICAgcHYKKyAqIFBoeXNpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHJldHVybgorICogQ29weSBvZiB0aGUgdXVpZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmx2bV9wdl9nZXRfdXVpZChjb25zdCBwdl90IHB2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgbmFtZSBvZiBhIHBoeXNpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBpcyB0aWVkIHRvIHRoZSB2Z190IGhhbmRsZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogXHBhcmFtICAgcHYKKyAqIFBoeXNpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHJldHVybgorICogQ29weSBvZiB0aGUgbmFtZS4KKyAqLworY29uc3QgY2hhciAqbHZtX3B2X2dldF9uYW1lKGNvbnN0IHB2X3QgcHYpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgbWV0YWRhdGEgYXJlYXMgaW4gdGhlIHBoeXNpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFxwYXJhbSAgIHB2CisgKiBQaHlzaWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIE51bWJlciBvZiBtZXRhZGF0YSBhcmVhcyBpbiB0aGUgUFYuCisgKi8KK3VpbnQ2NF90IGx2bV9wdl9nZXRfbWRhX2NvdW50KGNvbnN0IHB2X3QgcHYpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBzaXplIGluIGJ5dGVzIG9mIGEgZGV2aWNlIHVuZGVybHlpbmcgYQorICogcGh5c2ljYWwgdm9sdW1lLgorICoKKyAqIFxtZW1iZXJvZiBwdl90CisgKgorICogXHBhcmFtICAgcHYKKyAqIFBoeXNpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHJldHVybgorICogU2l6ZSBpbiBieXRlcy4KKyAqLwordWludDY0X3QgbHZtX3B2X2dldF9kZXZfc2l6ZShjb25zdCBwdl90IHB2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBieXRlcyBvZiBhIHBoeXNpY2FsIHZvbHVtZS4KKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFxwYXJhbSAgIHB2CisgKiBQaHlzaWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIFNpemUgaW4gYnl0ZXMuCisgKi8KK3VpbnQ2NF90IGx2bV9wdl9nZXRfc2l6ZShjb25zdCBwdl90IHB2KTsKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgdW5hbGxvY2F0ZWQgc3BhY2UgaW4gYnl0ZXMgb2YgYSBwaHlzaWNhbCB2b2x1bWUuCisgKgorICogXG1lbWJlcm9mIHB2X3QKKyAqCisgKiBccGFyYW0gICBwdgorICogUGh5c2ljYWwgdm9sdW1lIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiBGcmVlIHNpemUgaW4gYnl0ZXMuCisgKi8KK3VpbnQ2NF90IGx2bV9wdl9nZXRfZnJlZShjb25zdCBwdl90IHB2KTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIGEgUFYgcHJvcGVydHkKKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFxwYXJhbSAgIHB2CisgKiBQaHlzaWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxwYXJhbSAgIG5hbWUKKyAqIE5hbWUgb2YgcHJvcGVydHkgdG8gcXVlcnkuICBTZWUgcHZzIG1hbiBwYWdlIGZvciBmdWxsIGxpc3Qgb2YgcHJvcGVydGllcworICogdGhhdCBtYXkgYmUgcXVlcmllZC4KKyAqCisgKiBUaGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJpbmcgcHJvcGVydHkgdmFsdWUgaXMgdGllZCB0byB0aGUgdmdfdCBoYW5kbGUKKyAqIGFuZCB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gbHZtX3ZnX2Nsb3NlKCkgaXMgY2FsbGVkLiBGb3IgInBlcmNlbnQiIHZhbHVlcworICogKHRob3NlIG9idGFpbmVkIGZvciBjb3B5X3BlcmNlbnQgYW5kIHNuYXBfcGVyY2VudCBwcm9wZXJ0aWVzKSwgcGxlYXNlIHNlZQorICogZG1fcGVyY2VudF9yYW5nZV90IGFuZCBsdm1fcGVyY2VudF90b19mbG9hdCgpLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICAgIGx2bV9wcm9wZXJ0eV92YWx1ZSB2YWx1ZTsKKyAqICAgICAgY2hhciAqcHJvcF9uYW1lID0gInB2X21kYV9jb3VudCI7CisgKgorICogICAgICB2ID0gbHZtX3B2X2dldF9wcm9wZXJ0eShwdiwgcHJvcF9uYW1lKTsKKyAqICAgICAgaWYgKCF2LmlzX3ZhbGlkKSB7CisgKiAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIHByb3BlcnR5IG5hbWUgb3IgdW5hYmxlIHRvIHF1ZXJ5IgorICogICAgICAgICAgICAgICAgICAiJyVzJywgZXJybm8gPSAlZC5cbiIsIHByb3BfbmFtZSwgbHZtX2Vycm5vKGxpYmgpKTsKKyAqICAgICAgICAgICByZXR1cm47CisgKiAgICAgIH0KKyAqICAgICAgaWYgKHYuaXNfc3RyaW5nKQorICogICAgICAgICAgIHByaW50ZigiLCB2YWx1ZSA9ICVzXG4iLCB2LnZhbHVlLnN0cmluZyk7CisgKglpZiAodi5pc19pbnRlZ2VyKQorICogICAgICAgICAgIHByaW50ZigiLCB2YWx1ZSA9ICUiUFJJdTY0IlxuIiwgdi52YWx1ZS5pbnRlZ2VyKTsKKyAqCisgKiBccmV0dXJuCisgKiBsdm1fcHJvcGVydHlfdmFsdWUgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjdXJyZW50CisgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBDYWxsZXIgc2hvdWxkIGNoZWNrICdpc192YWxpZCcgZmxhZyBiZWZvcmUgdXNpbmcKKyAqIHRoZSB2YWx1ZS4gIElmICdpc192YWxpZCcgaXMgbm90IHNldCwgY2FsbGVyIHNob3VsZCBjaGVjayBsdm1fZXJybm8oKQorICogZm9yIHNwZWNpZmljIGVycm9yLgorICovCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9wdl9nZXRfcHJvcGVydHkoY29uc3QgcHZfdCBwdiwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogR2V0IHRoZSB2YWx1ZSBvZiBhIFBWIHNlZ21lbnQgcHJvcGVydHkKKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFxwYXJhbSAgIHB2c2VnCisgKiBQaHlzaWNhbCB2b2x1bWUgc2VnbWVudCBoYW5kbGUuCisgKgorICogXHBhcmFtICAgbmFtZQorICogTmFtZSBvZiBwcm9wZXJ0eSB0byBxdWVyeS4gIFNlZSBwdnMgbWFuIHBhZ2UgZm9yIGZ1bGwgbGlzdCBvZiBwcm9wZXJ0aWVzCisgKiB0aGF0IG1heSBiZSBxdWVyaWVkLgorICoKKyAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhIHN0cmluZyBwcm9wZXJ0eSB2YWx1ZSBpcyB0aWVkIHRvIHRoZSB2Z190CisgKiBoYW5kbGUgYW5kIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBsdm1fdmdfY2xvc2UoKSBpcyBjYWxsZWQuCisgKgorICogRXhhbXBsZToKKyAqICAgICAgbHZtX3Byb3BlcnR5X3ZhbHVlIHY7CisgKiAgICAgIGNoYXIgKnByb3BfbmFtZSA9ICJwdnNlZ19zdGFydCI7CisgKgorICogICAgICB2ID0gbHZtX3B2c2VnX2dldF9wcm9wZXJ0eShwdnNlZywgcHJvcF9uYW1lKTsKKyAqICAgICAgaWYgKGx2bV9lcnJubyhsaWJoKSB8fCAhdi5pc192YWxpZCkgeworICogICAgICAgICAgIC8vIGhhbmRsZSBlcnJvcgorICogICAgICAgICAgIHByaW50ZigiSW52YWxpZCBwcm9wZXJ0eSBuYW1lIG9yIHVuYWJsZSB0byBxdWVyeSIKKyAqICAgICAgICAgICAgICAgICAgIiclcycuXG4iLCBwcm9wX25hbWUpOworICogICAgICAgICAgIHJldHVybjsKKyAqICAgICAgfQorICogICAgICBpZiAodi5pc19zdHJpbmcpCisgKiAgICAgICAgICAgcHJpbnRmKCIsIHZhbHVlID0gJXNcbiIsIHYudmFsdWUuc3RyaW5nKTsKKyAqCWVsc2UKKyAqICAgICAgICAgICBwcmludGYoIiwgdmFsdWUgPSAlIlBSSXU2NCJcbiIsIHYudmFsdWUuaW50ZWdlcik7CisgKgorICogXHJldHVybgorICogbHZtX3Byb3BlcnR5X3ZhbHVlIHN0cnVjdHVyZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY3VycmVudAorICogdmFsdWUgb2YgdGhlIHByb3BlcnR5LiAgQ2FsbGVyIHNob3VsZCBjaGVjayBsdm1fZXJybm8oKSBhcyB3ZWxsCisgKiBhcyAnaXNfdmFsaWQnIGZsYWcgYmVmb3JlIHVzaW5nIHRoZSB2YWx1ZS4KKyAqLworc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSBsdm1fcHZzZWdfZ2V0X3Byb3BlcnR5KGNvbnN0IHB2c2VnX3QgcHZzZWcsCisJCQkJCQkgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogUmV0dXJuIGEgbGlzdCBvZiBwdnNlZyBoYW5kbGVzIGZvciBhIGdpdmVuIFBWIGhhbmRsZS4KKyAqCisgKiBcbWVtYmVyb2YgcHZfdAorICoKKyAqIFxwYXJhbSAgIHB2CisgKiBQaHlzaWNhbCB2b2x1bWUgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqIEEgbGlzdCBvZiBsdm1fcHZzZWdfbGlzdCBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcHZzZWcgaGFuZGxlcyBmb3IgdGhpcyBwdi4KKyAqLworc3RydWN0IGRtX2xpc3QgKmx2bV9wdl9saXN0X3B2c2Vncyhwdl90IHB2KTsKKworLyoqCisgKiBMb29rdXAgYW4gUFYgaGFuZGxlIGluIGEgVkcgYnkgdGhlIFBWIG5hbWUuCisgKgorICogXG1lbWJlcm9mIHB2X3QKKyAqCisgKiBccGFyYW0gICB2ZworICogVkcgaGFuZGxlIG9idGFpbmVkIGZyb20gbHZtX3ZnX2NyZWF0ZSgpIG9yIGx2bV92Z19vcGVuKCkuCisgKgorICogXHBhcmFtICAgbmFtZQorICogTmFtZSBvZiBQViB0byBsb29rdXAuCisgKgorICogXHJldHVybgorICogbm9uLU5VTEwgaGFuZGxlIHRvIHRoZSBQViAnbmFtZScgYXR0YWNoZWQgdG8gdGhlIFZHLgorICogTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgUFYgbmFtZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBWRyBoYW5kbGUuCisgKi8KK3B2X3QgbHZtX3B2X2Zyb21fbmFtZSh2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBMb29rdXAgYW4gUFYgaGFuZGxlIGluIGEgVkcgYnkgdGhlIFBWIHV1aWQuCisgKiBUaGUgZm9ybSBvZiB0aGUgdXVpZCBtYXkgYmUgZWl0aGVyIHRoZSBmb3JtYXR0ZWQsIGh1bWFuLXJlYWRhYmxlIGZvcm0sCisgKiBvciB0aGUgbm9uLWZvcm1hdHRlZCBmb3JtLgorICoKKyAqIFxtZW1iZXJvZiBwdl90CisgKgorICogXHBhcmFtICAgdmcKKyAqIFZHIGhhbmRsZSBvYnRhaW5lZCBmcm9tIGx2bV92Z19jcmVhdGUoKSBvciBsdm1fdmdfb3BlbigpLgorICoKKyAqIFxwYXJhbSAgIHV1aWQKKyAqIFVVSUQgb2YgUFYgdG8gbG9va3VwLgorICoKKyAqIFxyZXR1cm4KKyAqIG5vbi1OVUxMIGhhbmRsZSB0byB0aGUgUFYgd2l0aCAndXVpZCcgYXR0YWNoZWQgdG8gdGhlIFZHLgorICogTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgUFYgdXVpZCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBWRyBoYW5kbGUuCisgKi8KK3B2X3QgbHZtX3B2X2Zyb21fdXVpZCh2Z190IHZnLCBjb25zdCBjaGFyICp1dWlkKTsKKworLyoqCisgKiBSZXNpemUgcGh5c2ljYWwgdm9sdW1lIHRvIG5ld19zaXplIGJ5dGVzLgorICoKKyAqIFxtZW1iZXJvZiBwdl90CisgKgorICogXHBhcmFtICAgcHYKKyAqIFBoeXNpY2FsIHZvbHVtZSBoYW5kbGUuCisgKgorICogXHBhcmFtICAgbmV3X3NpemUKKyAqIE5ldyBzaXplIGluIGJ5dGVzLgorICoKKyAqIFxyZXR1cm4KKyAqIDAgKHN1Y2Nlc3MpIG9yIC0xIChmYWlsdXJlKS4KKyAqLworaW50IGx2bV9wdl9yZXNpemUoY29uc3QgcHZfdCBwdiwgdWludDY0X3QgbmV3X3NpemUpOworCisjZGVmaW5lIFBFUkNFTlRfMCBETV9QRVJDRU5UXzAKKyNkZWZpbmUgUEVSQ0VOVF8xIERNX1BFUkNFTlRfMQorI2RlZmluZSBQRVJDRU5UXzEwMCBETV9QRVJDRU5UXzEwMAorI2RlZmluZSBQRVJDRU5UX0lOVkFMSUQgRE1fUEVSQ0VOVF9JTlZBTElECisjZGVmaW5lIFBFUkNFTlRfTUVSR0VfRkFJTEVEIERNX1BFUkNFTlRfRkFJTEVECisKK3R5cGVkZWYgZG1fcGVyY2VudF90IHBlcmNlbnRfdDsKKworLyoqCisgKiBDb252ZXJ0IGEgKGZpeGVkLXBvaW50KSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBwZXJjZW50LWRlbm9taW5hdGVkCisgKiAqX2dldF9wcm9wZXJ0eSBmdW5jdGlvbnMgaW50byBhIGZsb2F0aW5nLXBvaW50IHZhbHVlLgorICovCitmbG9hdCBsdm1fcGVyY2VudF90b19mbG9hdChwZXJjZW50X3Qgdik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX0xJQl9MVk0yQVBQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmx2bS9sdm1fYmFzZS5jIGIvbGlibHZtL2x2bV9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlOTk0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm1fYmFzZS5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgImx2bS12ZXJzaW9uLmgiCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKyNpbmNsdWRlICJsdm0yYXBwLmgiCisjaW5jbHVkZSAibHZtX21pc2MuaCIKKworY29uc3QgY2hhciAqbHZtX2xpYnJhcnlfZ2V0X3ZlcnNpb24odm9pZCkKK3sKKwlyZXR1cm4gTFZNX1ZFUlNJT047Cit9CisKK3N0YXRpYyBsdm1fdCBfbHZtX2luaXQoY29uc3QgY2hhciAqc3lzdGVtX2RpcikKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZDsKKworCS8qIEZJWE1FOiBsb2dnaW5nIGJvdW5kIHRvIGhhbmRsZQorCSAqLworCisJaWYgKCF1ZGV2X2luaXRfbGlicmFyeV9jb250ZXh0KCkpCisJCXN0YWNrOworCisJLyoKKwkgKiBJdCdzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIG5hbWUgbWFuZ2xpbmcgZm9yIExWTToKKwkgKiAgIC0gdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBmb3IgVkctTFYgbmFtZXMgaXMgc3Vic2V0IG9mIHVkZXYgY2hhcmFjdGVyIHNldAorCSAqICAgLSB3aGVuIHdlIGNoZWNrIG90aGVyIGRldmljZXMgKGUuZy4gZGV2aWNlX2lzX3VzYWJsZSBmbiksIHdlIHVzZSBtYWpvcjptaW5vciwgbm90IGRtIG5hbWVzCisJICovCisJZG1fc2V0X25hbWVfbWFuZ2xpbmdfbW9kZShETV9TVFJJTkdfTUFOR0xJTkdfTk9ORSk7CisKKwkvKiBjcmVhdGUgY29udGV4dCAqLworCS8qIEZJWE1FOiBzcGxpdCBjcmVhdGVfdG9vbGNvbnRleHQgKi8KKwkvKiBGSVhNRTogbWFrZSBhbGwgZ2xvYmFscyBjb25maWd1cmFibGUgKi8KKwljbWQgPSBjcmVhdGVfdG9vbGNvbnRleHQoMCwgc3lzdGVtX2RpciwgMCwgMCwgMSwgMSk7CisJaWYgKCFjbWQpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBGSVhNRTogaWYgYW4gbm9uIG1lbW9yeSBlcnJvciBvY2N1cmVkLCByZXR1cm4gdGhlIGNtZCAobWF5YmUgc29tZQorCSAqIGNsZWFudXAgbmVlZGVkKS4KKwkgKi8KKworCS8qIGluaXRpYWxpemF0aW9uIGZyb20gbHZtX3J1bl9jb21tYW5kICovCisJaW5pdF9lcnJvcl9tZXNzYWdlX3Byb2R1Y2VkKDApOworCisJLyogRklYTUU6IGxvY2tpbmdfdHlwZSBjb25maWcgb3B0aW9uIG5lZWRlZD8gKi8KKwkvKiBpbml0aWFsaXplIGxvY2tpbmcgKi8KKwlpZiAoIWluaXRfbG9ja2luZygtMSwgY21kLCAwKSkgeworCQkvKiBGSVhNRTogdXNlIEVBR0FJTiBhcyBlcnJvciBjb2RlIGhlcmUgKi8KKwkJbHZtX3F1aXQoKGx2bV90KSBjbWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyoKKwkgKiBGSVhNRTogVXNlIGNtZC0+Y21kX2xpbmUgYXMgYXVkaXQgdHJhaWwgZm9yIGxpYmx2bSBjYWxscy4gIFVzZWQgaW4KKwkgKiBhcmNoaXZlKCkgY2FsbC4gIFBvc3NpYmxlIGV4YW1wbGU6CisJICogY21kX2xpbmUgPSAibHZtX3ZnX2NyZWF0ZTogdmcxXG5sdm1fdmdfZXh0ZW5kIHZnMSAvZGV2L3NkYTFcbiIKKwkgKi8KKwljbWQtPmNtZF9saW5lID0gImxpYmx2bSI7CisKKwkvKgorCSAqIFR1cm4gb2ZmIHdyaXRpbmcgdG8gc3Rkb3V0L3N0ZGVyci4KKwkgKiBGSVhNRSBGaXggbGliLyB0byBzdXBwb3J0IGEgbm9uLWludGVyYWN0aXZlIG1vZGUgaW5zdGVhZC4KKwkgKi8KKwlsb2dfc3VwcHJlc3MoMSk7CisKKwlyZXR1cm4gKGx2bV90KSBjbWQ7Cit9CisKKworbHZtX3QgbHZtX2luaXQoY29uc3QgY2hhciAqc3lzdGVtX2RpcikKK3sKKwlsdm1fdCBoID0gTlVMTDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2VudihOVUxMKTsKKwloID0gX2x2bV9pbml0KHN5c3RlbV9kaXIpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiBoOworfQorCit2b2lkIGx2bV9xdWl0KGx2bV90IGxpYmgpCit7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpOworCWZpbl9sb2NraW5nKCk7CisJZGVzdHJveV90b29sY29udGV4dCgoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaCk7CisJdWRldl9maW5fbGlicmFyeV9jb250ZXh0KCk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7Cit9CisKK2ludCBsdm1fY29uZmlnX3JlbG9hZChsdm1fdCBsaWJoKQoreworCWludCByYyA9IDA7CisKKwkvKiBGSVhNRTogcmUtaW5pdCBsb2NraW5nIG5lZWRlZCBoZXJlPyAqLworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKwlpZiAoIXJlZnJlc2hfdG9vbGNvbnRleHQoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpKQorCQlyYyA9IC0xOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIEZJWE1FOiBzdWJtaXQgYSBwYXRjaCB0byBkb2N1bWVudCB0aGUgLS1jb25maWcgb3B0aW9uCisgKi8KK2ludCBsdm1fY29uZmlnX292ZXJyaWRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKmNvbmZpZ19zZXR0aW5ncykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmg7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpOworCisJaWYgKCFvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3N0cmluZyhjbWQsIGNvbmZpZ19zZXR0aW5ncykpCisJCXJjID0gLTE7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogV2hlbiBmdWxsIGx2bSBjb25uZWN0aW9uIGlzIG5vdCBiZWluZyB1c2VkLCBsaWJoIGNhbiBiZSBOVUxMCisgKiBhbmQgdGhpcyBjb21tYW5kIHdpbGwgaW50ZXJuYWxseSBjcmVhdGUgYSBzaW5nbGUtdXNlLCBsaWdodC13ZWlnaHQKKyAqIGNtZCBzdHJ1Y3QgdGhhdCBvbmx5IGhhcyBjbWQtPmNmdCBwb3B1bGF0ZWQgZnJvbSBsdm0uY29uZi4KKyAqLworaW50IGx2bV9jb25maWdfZmluZF9ib29sKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKmNvbmZpZ19wYXRoLCBpbnQgZmFpbCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kOworCXN0cnVjdCBzYXZlZF9lbnYgZTsKKworCWlmIChsaWJoKSB7CisJCWNtZCA9IChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoOworCQllID0gc3RvcmVfdXNlcl9lbnYoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpOworCX0gZWxzZSB7CisJCWlmICghKGNtZCA9IGNyZWF0ZV9jb25maWdfY29udGV4dCgpKSkKKwkJCXJldHVybiAwOworCX0KKworCXJjID0gZG1fY29uZmlnX3RyZWVfZmluZF9ib29sKGNtZC0+Y2Z0LCBjb25maWdfcGF0aCwgZmFpbCk7CisKKwlpZiAobGliaCkKKwkJcmVzdG9yZV91c2VyX2VudigmZSk7CisJZWxzZQorCQlkZXN0cm95X2NvbmZpZ19jb250ZXh0KGNtZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbHZtX2Vycm5vKGx2bV90IGxpYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKwlyYyA9IHN0b3JlZF9lcnJubygpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworY29uc3QgY2hhciAqbHZtX2Vycm1zZyhsdm1fdCBsaWJoKQoreworCWNvbnN0IGNoYXIgKnJjID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKworCWNvbnN0IGNoYXIgKm1zZyA9IHN0b3JlZF9lcnJtc2dfd2l0aF9jbGVhcigpOworCWlmIChtc2cpIHsKKwkJcmMgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgbXNnKTsKKwkJZnJlZSgodm9pZCAqKW1zZyk7CisJfQorCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCBjaGFyICpsdm1fdmduYW1lX2Zyb21fcHZpZChsdm1fdCBsaWJoLCBjb25zdCBjaGFyICpwdmlkKQoreworCWNvbnN0IGNoYXIgKnJjID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoOworCXN0cnVjdCBpZCBpZDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudigoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaCk7CisKKwlpZiAoaWRfcmVhZF9mb3JtYXQoJmlkLCBwdmlkKSkgeworCQlyYyA9IGZpbmRfdmduYW1lX2Zyb21fcHZpZChjbWQsIChjaGFyICopaWQudXVpZCk7CisJfSBlbHNlIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmFibGUgdG8gY29udmVydCB1dWlkIik7CisJfQorCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCBjaGFyICpsdm1fdmduYW1lX2Zyb21fZGV2aWNlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljb25zdCBjaGFyICpyYyA9IE5VTEw7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2VudihjbWQpOworCXJjID0gZmluZF92Z25hbWVfZnJvbV9wdm5hbWUoY21kLCBkZXZpY2UpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5vIGNvbnRleHQgdG8gd29yayB3aXRoLCBzbyBubyBhYmlsaXR5IHRvIHNhdmUgb2ZmIGFuZCByZXN0b3JlIGVudiBpcyBub3QKKyAqIGF2YWlsYWJsZSBhbmQgaXMgbm90IG5lZWRlZC4KKyAqLworZmxvYXQgbHZtX3BlcmNlbnRfdG9fZmxvYXQocGVyY2VudF90IHYpCit7CisJcmV0dXJuIGRtX3BlcmNlbnRfdG9fZmxvYXQodik7Cit9CmRpZmYgLS1naXQgYS9saWJsdm0vbHZtX2x2LmMgYi9saWJsdm0vbHZtX2x2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm1fbHYuYwpAQCAtMCwwICsxLDgwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJtZXRhZGF0YS5oIgorI2luY2x1ZGUgImx2bS1zdHJpbmcuaCIKKyNpbmNsdWRlICJkZWZhdWx0cy5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAiYWN0aXZhdGUuaCIKKyNpbmNsdWRlICJsdm1fbWlzYy5oIgorI2luY2x1ZGUgImx2bTJhcHAuaCIKKworLyogRklYTUUgSW1wcm92ZSBhbGwgdGhlIGxvZyBtZXNzYWdlcyB0byBpbmNsdWRlIGNvbnRleHQuIFdoaWNoIFZHL0xWIGFzIGEgbWluaW11bT8gKi8KKworc3RydWN0IGx2bV9sdl9jcmVhdGVfcGFyYW1zCit7CisJdWludDMyX3QgbWFnaWM7CisJdmdfdCB2ZzsKKwlzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zIGx2cDsKK307CisKKyNkZWZpbmUgTFZfQ1JFQVRFX1BBUkFNU19NQUdJQyAweEZFRUQwMDAxCisKK3N0YXRpYyBpbnQgX2x2X2NoZWNrX2hhbmRsZShjb25zdCBsdl90IGx2LCBjb25zdCBpbnQgdmdfd3JpdGVhYmxlKQoreworCWlmICghbHYgfHwgIWx2LT52ZyB8fCB2Z19yZWFkX2Vycm9yKGx2LT52ZykpCisJCXJldHVybiAtMTsKKwlpZiAodmdfd3JpdGVhYmxlICYmICF2Z19jaGVja193cml0ZV9tb2RlKGx2LT52ZykpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUU6IGhhdmUgbGliL3JlcG9ydC9yZXBvcnQuYyBfZGlzcCBmdW5jdGlvbiBjYWxsIGx2X3NpemUoKT8gKi8KK3VpbnQ2NF90IGx2bV9sdl9nZXRfc2l6ZShjb25zdCBsdl90IGx2KQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IFNFQ1RPUl9TSVpFICogbHZfc2l6ZShsdik7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCBjaGFyICpsdm1fbHZfZ2V0X3V1aWQoY29uc3QgbHZfdCBsdikKK3sKKwljb25zdCBjaGFyICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisJcmMgPSBsdl91dWlkX2R1cChsdi0+dmctPnZnbWVtLCBsdik7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCBjaGFyICpsdm1fbHZfZ2V0X25hbWUoY29uc3QgbHZfdCBsdikKK3sKKwljb25zdCBjaGFyICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisJcmMgPSBkbV9wb29sX3N0cm5kdXAobHYtPnZnLT52Z21lbSwgKGNvbnN0IGNoYXIgKilsdi0+bmFtZSwKKwkJCSAgICAgICBOQU1FX0xFTisxKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IGNoYXIgKmx2bV9sdl9nZXRfYXR0cihjb25zdCBsdl90IGx2KQoreworCWNvbnN0IGNoYXIgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IGx2X2F0dHJfZHVwKGx2LT52Zy0+dmdtZW0sIGx2KTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IGNoYXIgKmx2bV9sdl9nZXRfb3JpZ2luKGNvbnN0IGx2X3QgbHYpCit7CisJY29uc3QgY2hhciAqcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYobHYtPnZnLT5jbWQpOworCXJjID0gbHZfb3JpZ2luX2R1cChsdi0+dmctPnZnbWVtLCBsdik7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9sdl9nZXRfcHJvcGVydHkoY29uc3QgbHZfdCBsdiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IGdldF9wcm9wZXJ0eShOVUxMLCBOVUxMLCBsdiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgbmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9sdnNlZ19nZXRfcHJvcGVydHkoY29uc3QgbHZzZWdfdCBsdnNlZywKKwkJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYobHZzZWctPmx2LT52Zy0+Y21kKTsKKwlyYyA9IGdldF9wcm9wZXJ0eShOVUxMLCBOVUxMLCBOVUxMLCBsdnNlZywgTlVMTCwgTlVMTCwgTlVMTCwgbmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCit1aW50NjRfdCBsdm1fbHZfaXNfYWN0aXZlKGNvbnN0IGx2X3QgbHYpCit7CisJdWludDY0X3QgcmMgPSAwOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKworCWlmIChsdl9pbmZvKGx2LT52Zy0+Y21kLCBsdiwgMCwgJmluZm8sIDAsIDApICYmCisJICAgIGluZm8uZXhpc3RzICYmIGluZm8ubGl2ZV90YWJsZSkKKwkJcmMgPSAxOworCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCit1aW50NjRfdCBsdm1fbHZfaXNfc3VzcGVuZGVkKGNvbnN0IGx2X3QgbHYpCit7CisJdWludDY0X3QgcmMgPSAwOworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisKKwlpZiAobHZfaW5mbyhsdi0+dmctPmNtZCwgbHYsIDAsICZpbmZvLCAwLCAwKSAmJgorCSAgICBpbmZvLmV4aXN0cyAmJiBpbmZvLnN1c3BlbmRlZCkKKwkJcmMgPSAxOworCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9sdm1fbHZfYWRkX3RhZyhsdl90IGx2LCBjb25zdCBjaGFyICp0YWcpCit7CisJaWYgKF9sdl9jaGVja19oYW5kbGUobHYsIDEpKQorCQlyZXR1cm4gLTE7CisJaWYgKCFsdl9jaGFuZ2VfdGFnKGx2LCB0YWcsIDEpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsdm1fbHZfYWRkX3RhZyhsdl90IGx2LCBjb25zdCBjaGFyICp0YWcpCit7CisJaW50IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IF9sdm1fbHZfYWRkX3RhZyhsdiwgdGFnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBfbHZtX2x2X3JlbW92ZV90YWcobHZfdCBsdiwgY29uc3QgY2hhciAqdGFnKQoreworCWlmIChfbHZfY2hlY2tfaGFuZGxlKGx2LCAxKSkKKwkJcmV0dXJuIC0xOworCWlmICghbHZfY2hhbmdlX3RhZyhsdiwgdGFnLCAwKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitpbnQgbHZtX2x2X3JlbW92ZV90YWcobHZfdCBsdiwgY29uc3QgY2hhciAqdGFnKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X3JlbW92ZV90YWcobHYsIHRhZyk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCisKK3N0cnVjdCBkbV9saXN0ICpsdm1fbHZfZ2V0X3RhZ3MoY29uc3QgbHZfdCBsdikKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYobHYtPnZnLT5jbWQpOworCXJjID0gdGFnX2xpc3RfY29weShsdi0+dmctPnZnbWVtLCAmbHYtPnRhZ3MpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworLyogU2V0IGRlZmF1bHRzIGZvciBub24tc2VnbWVudCBzcGVjaWZpYyBMViBwYXJhbWV0ZXJzICovCitzdGF0aWMgdm9pZCBfbHZfc2V0X2RlZmF1bHRfcGFyYW1zKHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLAorCQkJCSAgIHZnX3QgdmcsIGNvbnN0IGNoYXIgKmx2bmFtZSwKKwkJCQkgICB1aW50NjRfdCBleHRlbnRzKQoreworCWxwLT56ZXJvID0gMTsKKwlscC0+d2lwZV9zaWduYXR1cmVzID0gMDsKKwlscC0+bWFqb3IgPSAtMTsKKwlscC0+bWlub3IgPSAtMTsKKwlscC0+YWN0aXZhdGUgPSBDSEFOR0VfQVk7CisJbHAtPmx2X25hbWUgPSBsdm5hbWU7IC8qIEZJWE1FOiBjaGVjayB0aGlzIGZvciBzYWZldHkgKi8KKwlscC0+cHZoID0gJnZnLT5wdnM7CisKKwlscC0+ZXh0ZW50cyA9IGV4dGVudHM7CisJbHAtPnBlcm1pc3Npb24gPSBMVk1fUkVBRCB8IExWTV9XUklURTsKKwlscC0+cmVhZF9haGVhZCA9IERNX1JFQURfQUhFQURfTk9ORTsKKwlscC0+YWxsb2MgPSBBTExPQ19JTkhFUklUOworCWRtX2xpc3RfaW5pdCgmbHAtPnRhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNlZ21lbnRfdHlwZSAqIF9nZXRfc2VndHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkgeworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnJjID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpOworCWlmICghcmMpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJTZWd0eXBlIHN0cmlwZWQgbm90IGZvdW5kLiIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNldCBkZWZhdWx0IGZvciBsaW5lYXIgc2VnbWVudCBzcGVjaWZpYyBMViBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IF9sdl9zZXRfZGVmYXVsdF9saW5lYXJfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCWlmICghKGxwLT5zZWd0eXBlID0gX2dldF9zZWd0eXBlKGNtZCkpKSB7CisJCXJldHVybiAwOworCX0KKworCWxwLT5zdHJpcGVzID0gMTsKKworCXJldHVybiAxOworfQorCisvKgorICogRklYTUU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IG5vdCBjb21taXQgdG8gZGlzayBidXQgcmVxdWlyZSBjYWxsaW5nCisgKiBsdm1fdmdfd3JpdGUuICBIb3dldmVyLCB0aGlzIGFwcGVhcnMgdG8gYmUgbm9uLXRyaXZpYWwgY2hhbmdlIHVudGlsCisgKiBsdl9jcmVhdGVfc2luZ2xlIGlzIHJlZmFjdG9yZWQgYnkgc2VndHlwZS4KKyAqLworc3RhdGljIGx2X3QgX2x2bV92Z19jcmVhdGVfbHZfbGluZWFyKHZnX3QgdmcsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyBscCA9IHsgMCB9OworCXVpbnQ2NF90IGV4dGVudHM7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWlmICh2Z19yZWFkX2Vycm9yKHZnKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCF2Z19jaGVja193cml0ZV9tb2RlKHZnKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShleHRlbnRzID0gZXh0ZW50c19mcm9tX3NpemUodmctPmNtZCwgc2l6ZSAvIFNFQ1RPUl9TSVpFLAorCQkJCQkgIHZnLT5leHRlbnRfc2l6ZSkpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBMViB3aXRob3V0IHNpemUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCV9sdl9zZXRfZGVmYXVsdF9wYXJhbXMoJmxwLCB2ZywgbmFtZSwgZXh0ZW50cyk7CisJaWYgKCFfbHZfc2V0X2RlZmF1bHRfbGluZWFyX3BhcmFtcyh2Zy0+Y21kLCAmbHApKQorCQlyZXR1cm5fTlVMTDsKKwlpZiAoIShsdiA9IGx2X2NyZWF0ZV9zaW5nbGUodmcsICZscCkpKQorCQlyZXR1cm5fTlVMTDsKKwlyZXR1cm4gKGx2X3QpIGx2OworfQorCitsdl90IGx2bV92Z19jcmVhdGVfbHZfbGluZWFyKHZnX3QgdmcsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IHNpemUpCit7CisJbHZfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IF9sdm1fdmdfY3JlYXRlX2x2X2xpbmVhcih2ZywgbmFtZSwgc2l6ZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogRklYTUU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IG5vdCBjb21taXQgdG8gZGlzayBidXQgcmVxdWlyZSBjYWxsaW5nCisgKiBsdm1fdmdfd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgX2x2bV92Z19yZW1vdmVfbHYobHZfdCBsdikKK3sKKwlpZiAoIWx2IHx8ICFsdi0+dmcgfHwgdmdfcmVhZF9lcnJvcihsdi0+dmcpKQorCQlyZXR1cm4gLTE7CisJaWYgKCF2Z19jaGVja193cml0ZV9tb2RlKGx2LT52ZykpCisJCXJldHVybiAtMTsKKwlpZiAoIWx2X3JlbW92ZV9zaW5nbGUobHYtPnZnLT5jbWQsIGx2LCBET05UX1BST01QVCwgMCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGx2bV92Z19yZW1vdmVfbHYobHZfdCBsdikKK3sKKwlpbnQgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYobHYtPnZnLT5jbWQpOworCXJjID0gX2x2bV92Z19yZW1vdmVfbHYobHYpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfbHZtX2x2X2FjdGl2YXRlKGx2X3QgbHYpCit7CisJaWYgKCFsdiB8fCAhbHYtPnZnIHx8IHZnX3JlYWRfZXJyb3IobHYtPnZnKSB8fCAhbHYtPnZnLT5jbWQpCisJCXJldHVybiAtMTsKKworCS8qIEZJWE1FOiBoYW5kbGUgcHZtb3ZlIHN0dWZmIGxhdGVyICovCisJaWYgKGx2X2lzX2xvY2tlZChsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gYWN0aXZhdGUgbG9ja2VkIExWIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGSVhNRTogaGFuZGxlIGx2Y29udmVydCBzdHVmZiBsYXRlciAqLworCWlmIChsdl9pc19jb252ZXJ0aW5nKGx2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhY3RpdmF0ZSBMViB3aXRoIGluLXByb2dyZXNzIGx2Y29udmVydCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGx2X2lzX29yaWdpbihsdikpIHsKKwkJbG9nX3ZlcmJvc2UoIkFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiICIKKwkJCSAgICAiZXhjbHVzaXZlbHkiLCBsdi0+bmFtZSk7CisJCWlmICghYWN0aXZhdGVfbHZfZXhjbChsdi0+dmctPmNtZCwgbHYpKSB7CisJCQkvKiBGSVhNRSBJbXByb3ZlIG1zZyAqLworCQkJbG9nX2Vycm9yKCJBY3RpdmF0ZSBleGNsdXNpdmUgZmFpbGVkLiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJbG9nX3ZlcmJvc2UoIkFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiIiwKKwkJCSAgICBsdi0+bmFtZSk7CisJCWlmICghYWN0aXZhdGVfbHYobHYtPnZnLT5jbWQsIGx2KSkgeworCQkJLyogRklYTUUgSW1wcm92ZSBtc2cgKi8KKwkJCWxvZ19lcnJvcigiQWN0aXZhdGUgZmFpbGVkLiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgbHZtX2x2X2FjdGl2YXRlKGx2X3QgbHYpCit7CisJaW50IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IF9sdm1fbHZfYWN0aXZhdGUobHYpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfbHZtX2x2X2RlYWN0aXZhdGUobHZfdCBsdikKK3sKKwlpZiAoIWx2IHx8ICFsdi0+dmcgfHwgdmdfcmVhZF9lcnJvcihsdi0+dmcpIHx8ICFsdi0+dmctPmNtZCkKKwkJcmV0dXJuIC0xOworCisJbG9nX3ZlcmJvc2UoIkRlYWN0aXZhdGluZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIiLCBsdi0+bmFtZSk7CisJaWYgKCFkZWFjdGl2YXRlX2x2KGx2LT52Zy0+Y21kLCBsdikpIHsKKwkJbG9nX2Vycm9yKCJEZWFjdGl2YXRlIGZhaWxlZC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGx2bV9sdl9kZWFjdGl2YXRlKGx2X3QgbHYpCit7CisJaW50IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlyYyA9IF9sdm1fbHZfZGVhY3RpdmF0ZShsdik7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9sdm1fbHZfbGlzdF9sdnNlZ3MobHZfdCBsdikKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKwlsdnNlZ19saXN0X3QgKmx2c2VnOworCXN0cnVjdCBsdl9zZWdtZW50ICpsdmw7CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmbHYtPnNlZ21lbnRzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShsaXN0ID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT52Z21lbSwgc2l6ZW9mKCpsaXN0KSkpKSB7CisJCWxvZ19lcnJubyhFTk9NRU0sICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBkbV9saXN0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZG1fbGlzdF9pbml0KGxpc3QpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJmx2LT5zZWdtZW50cykgeworCQlpZiAoIShsdnNlZyA9IGRtX3Bvb2xfemFsbG9jKGx2LT52Zy0+dmdtZW0sIHNpemVvZigqbHZzZWcpKSkpIHsKKwkJCWxvZ19lcnJubyhFTk9NRU0sCisJCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZm9yIGx2bV9sdnNlZ19saXN0LiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbHZzZWctPmx2c2VnID0gbHZsOworCQlkbV9saXN0X2FkZChsaXN0LCAmbHZzZWctPmxpc3QpOworCX0KKwlyZXR1cm4gbGlzdDsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2bV9sdl9saXN0X2x2c2Vncyhsdl90IGx2KQoreworCXN0cnVjdCBkbV9saXN0ICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X2xpc3RfbHZzZWdzKGx2KTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2x2X3QgbHZtX2x2X2Zyb21fbmFtZSh2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lKQoreworCWx2X3QgcmMgPSBOVUxMOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlpZiAoIXN0cmNtcChuYW1lLCBsdmwtPmx2LT5uYW1lKSkgeworCQkJcmMgPSBsdmwtPmx2OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbHZfdCBfbHZtX2x2X2Zyb21fdXVpZCh2Z190IHZnLCBjb25zdCBjaGFyICp1dWlkKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGlkIGlkOworCisJaWYgKHN0cmxlbih1dWlkKSA8IElEX0xFTikgeworCQlsb2dfZXJybm8gKEVJTlZBTCwgIkludmFsaWQgVVVJRCBzdHJpbmcgbGVuZ3RoIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaWRfcmVhZF9mb3JtYXQoJmlkLCB1dWlkKSkgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiSW52YWxpZCBVVUlEIGZvcm1hdC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKGlkX2VxdWFsKCZ2Zy0+aWQsICZsdmwtPmx2LT5sdmlkLmlkWzBdKSAmJgorCQkgICAgaWRfZXF1YWwoJmlkLCAmbHZsLT5sdi0+bHZpZC5pZFsxXSkpCisJCQlyZXR1cm4gbHZsLT5sdjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2x2X3QgbHZtX2x2X2Zyb21fdXVpZCh2Z190IHZnLCBjb25zdCBjaGFyICp1dWlkKQoreworCWx2X3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X2Zyb21fdXVpZCh2ZywgdXVpZCk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbHZtX2x2X3JlbmFtZShsdl90IGx2LCBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKwlpZiAoIWx2X3JlbmFtZShsdi0+dmctPmNtZCwgbHYsIG5ld19uYW1lKSkgeworCQkvKiBGSVhNRSBJbXByb3ZlIG1zZyAqLworCQlsb2dfZXJyb3IoIkxWIHJlbmFtZSBmYWlsZWQuIik7CisJCXJjID0gLTE7CisJfQorCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworaW50IGx2bV9sdl9yZXNpemUoY29uc3QgbHZfdCBsdiwgdWludDY0X3QgbmV3X3NpemUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbHZyZXNpemVfcGFyYW1zIGxwID0geworCQkuc2lnbiA9IFNJR05fTk9ORSwKKwkJLnBlcmNlbnQgPSBQRVJDRU5UX05PTkUsCisJCS5yZXNpemUgPSBMVl9BTlksCisJCS5zaXplID0gbmV3X3NpemUgPj4gU0VDVE9SX1NISUZULAorCQkuZm9yY2UgPSAxLAkvKiBBc3N1bWUgdGhlIHVzZXIgaGFzIGEgZ29vZCBiYWNrdXA/ICovCisJfTsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisKKwlpZiAoIWx2X3Jlc2l6ZShsdiwgJmxwLCAmbHYtPnZnLT5wdnMpKSB7CisJCS8qIEZJWE1FIEltcHJvdmUgbXNnICovCisJCWxvZ19lcnJvcigiTFYgcmVzaXplIGZhaWxlZC4iKTsKKwkJLyogRklYTUUgRGVmaW5lIGNvbnNpc3RlbnQgc3ltYm9saWMgcmV0dXJuIGNvZGVzICovCisJCXJjID0gLTE7CisJfQorCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworbHZfdCBsdm1fbHZfc25hcHNob3QoY29uc3QgbHZfdCBsdiwgY29uc3QgY2hhciAqc25hcF9uYW1lLAorCQkJCQkJdWludDY0X3QgbWF4X3NuYXBfc2l6ZSkKK3sKKwlsdl90IHJjID0gTlVMTDsKKwlzdHJ1Y3QgbHZtX2x2X2NyZWF0ZV9wYXJhbXMgKmx2Y3AgPSBOVUxMOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KGx2LT52Zy0+Y21kKTsKKworCWx2Y3AgPSBsdm1fbHZfcGFyYW1zX2NyZWF0ZV9zbmFwc2hvdChsdiwgc25hcF9uYW1lLCBtYXhfc25hcF9zaXplKTsKKwlpZiAobHZjcCkgeworCQlyYyA9IGx2bV9sdl9jcmVhdGUobHZjcCk7CisJfQorCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworLyogU2V0IGRlZmF1bHRzIGZvciB0aGluIHBvb2wgc3BlY2lmaWMgTFYgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBfbHZfc2V0X3Bvb2xfcGFyYW1zKHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLAorCQkJCXZnX3QgdmcsIGNvbnN0IGNoYXIgKnBvb2xfbmFtZSwKKwkJCQl1aW50NjRfdCBleHRlbnRzLCB1aW50NjRfdCBtZXRhX3NpemUpCit7CisJdWludDY0X3QgcG9vbF9tZXRhZGF0YV9zaXplOworCisJX2x2X3NldF9kZWZhdWx0X3BhcmFtcyhscCwgdmcsIHBvb2xfbmFtZSwgZXh0ZW50cyk7CisKKwlscC0+Y3JlYXRlX3Bvb2wgPSAxOworCWxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9USElOX1BPT0wpOworCWxwLT5zdHJpcGVzID0gMTsKKworCWlmICghbWV0YV9zaXplKSB7CisJCXBvb2xfbWV0YWRhdGFfc2l6ZSA9IGV4dGVudHMgKiB2Zy0+ZXh0ZW50X3NpemUgLworCQkJKGxwLT5jaHVua19zaXplICogKFNFQ1RPUl9TSVpFIC8gNjQpKTsKKwkJd2hpbGUgKChwb29sX21ldGFkYXRhX3NpemUgPgorCQkJKDIgKiBERUZBVUxUX1RISU5fUE9PTF9PUFRJTUFMX1NJWkUgLyBTRUNUT1JfU0laRSkpICYmCisJCSAgICAgICBscC0+Y2h1bmtfc2l6ZSA8IERNX1RISU5fTUFYX0RBVEFfQkxPQ0tfU0laRSkgeworCQkJbHAtPmNodW5rX3NpemUgPDw9IDE7CisJCQlwb29sX21ldGFkYXRhX3NpemUgPj49IDE7CisJICAgICAgICAgfQorCX0gZWxzZQorCQlwb29sX21ldGFkYXRhX3NpemUgPSBtZXRhX3NpemU7CisKKwlpZiAocG9vbF9tZXRhZGF0YV9zaXplICUgdmctPmV4dGVudF9zaXplKQorCQlwb29sX21ldGFkYXRhX3NpemUgKz0KKwkJCXZnLT5leHRlbnRfc2l6ZSAtIHBvb2xfbWV0YWRhdGFfc2l6ZSAlIHZnLT5leHRlbnRfc2l6ZTsKKworCWlmICghKGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMgPQorCSAgICAgIGV4dGVudHNfZnJvbV9zaXplKHZnLT5jbWQsIHBvb2xfbWV0YWRhdGFfc2l6ZSAvIFNFQ1RPUl9TSVpFLAorCQkJCXZnLT5leHRlbnRfc2l6ZSkpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgbHZfY3JlYXRlX3BhcmFtc190IF9sdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluX3Bvb2wodmdfdCB2ZywKKwkJY29uc3QgY2hhciAqcG9vbF9uYW1lLCB1aW50NjRfdCBzaXplLCB1aW50MzJfdCBjaHVua19zaXplLAorCQl1aW50NjRfdCBtZXRhX3NpemUsIGx2bV90aGluX2Rpc2NhcmRzX3QgZGlzY2FyZCkKK3sKKwl1aW50NjRfdCBleHRlbnRzID0gMDsKKwlzdHJ1Y3QgbHZtX2x2X2NyZWF0ZV9wYXJhbXMgKmx2Y3AgPSBOVUxMOworCisJaWYgKG1ldGFfc2l6ZSA+ICgyICogREVGQVVMVF9USElOX1BPT0xfTUFYX01FVEFEQVRBX1NJWkUpKSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCBtZXRhZGF0YSBzaXplIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChtZXRhX3NpemUgJiYKKwkJbWV0YV9zaXplIDwgKDIgKiBERUZBVUxUX1RISU5fUE9PTF9NSU5fTUVUQURBVEFfU0laRSkpIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIG1ldGFkYXRhIHNpemUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHZnX3JlYWRfZXJyb3IodmcpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghdmdfY2hlY2tfd3JpdGVfbW9kZSh2ZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBvb2xfbmFtZSA9PSBOVUxMIHx8ICFzdHJsZW4ocG9vbF9uYW1lKSkgeworCQlsb2dfZXJyb3IoInBvb2xfbmFtZSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGV4dGVudHMgPSBleHRlbnRzX2Zyb21fc2l6ZSh2Zy0+Y21kLCBzaXplIC8gU0VDVE9SX1NJWkUsCisJCQkJCSAgdmctPmV4dGVudF9zaXplKSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIExWIHRoaW4gcG9vbCB3aXRob3V0IHNpemUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWx2Y3AgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZiAoc3RydWN0IGx2bV9sdl9jcmVhdGVfcGFyYW1zKSk7CisKKwlpZiAobHZjcCkgeworCQlsdmNwLT52ZyA9IHZnOworCQlsdmNwLT5sdnAuZGlzY2FyZHMgPSAodGhpbl9kaXNjYXJkc190KSBkaXNjYXJkOworCisJCWlmIChjaHVua19zaXplKQorCQkJbHZjcC0+bHZwLmNodW5rX3NpemUgPSBjaHVua19zaXplOworCQllbHNlCisJCQlsdmNwLT5sdnAuY2h1bmtfc2l6ZSA9IERFRkFVTFRfVEhJTl9QT09MX0NIVU5LX1NJWkUgKiAyOworCisJCWlmIChsdmNwLT5sdnAuY2h1bmtfc2l6ZSA8IERNX1RISU5fTUlOX0RBVEFfQkxPQ0tfU0laRSB8fAorCQkJCWx2Y3AtPmx2cC5jaHVua19zaXplID4gRE1fVEhJTl9NQVhfREFUQV9CTE9DS19TSVpFKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgY2h1bmtfc2l6ZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoIV9sdl9zZXRfcG9vbF9wYXJhbXMoJmx2Y3AtPmx2cCwgdmcsIHBvb2xfbmFtZSwgZXh0ZW50cywgbWV0YV9zaXplKSkKKwkJCXJldHVybl9OVUxMOworCisJCWx2Y3AtPm1hZ2ljID0gTFZfQ1JFQVRFX1BBUkFNU19NQUdJQzsKKwl9CisJcmV0dXJuIGx2Y3A7Cit9CisKK2x2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluX3Bvb2wodmdfdCB2ZywKKwkJY29uc3QgY2hhciAqcG9vbF9uYW1lLCB1aW50NjRfdCBzaXplLCB1aW50MzJfdCBjaHVua19zaXplLAorCQl1aW50NjRfdCBtZXRhX3NpemUsIGx2bV90aGluX2Rpc2NhcmRzX3QgZGlzY2FyZCkKK3sKKwlsdl9jcmVhdGVfcGFyYW1zX3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X3BhcmFtc19jcmVhdGVfdGhpbl9wb29sKHZnLCBwb29sX25hbWUsIHNpemUsIGNodW5rX3NpemUsCisJCQkJCQkJCQkJbWV0YV9zaXplLCBkaXNjYXJkKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNldCBkZWZhdWx0cyBmb3IgdGhpbiBMViBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IF9sdl9zZXRfdGhpbl9wYXJhbXMoc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHAsCisJCQkgICAgICAgdmdfdCB2ZywgY29uc3QgY2hhciAqcG9vbF9uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmx2bmFtZSwKKwkJCSAgICAgICB1aW50MzJfdCBleHRlbnRzKQoreworCV9sdl9zZXRfZGVmYXVsdF9wYXJhbXMobHAsIHZnLCBsdm5hbWUsIDApOworCisJbHAtPnBvb2xfbmFtZSA9IHBvb2xfbmFtZTsKKwlscC0+c2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKHZnLT5jbWQsIFNFR19UWVBFX05BTUVfVEhJTik7CisJbHAtPnZpcnR1YWxfZXh0ZW50cyA9IGV4dGVudHM7CisJbHAtPnN0cmlwZXMgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBsdl9jcmVhdGVfcGFyYW1zX3QgX2x2bV9sdl9wYXJhbXNfY3JlYXRlX3NuYXBzaG90KGNvbnN0IGx2X3QgbHYsCisJCQkJCQkJIGNvbnN0IGNoYXIgKnNuYXBfbmFtZSwKKwkJCQkJCQkgdWludDY0X3QgbWF4X3NuYXBfc2l6ZSkKK3sKKwl1aW50NjRfdCBzaXplID0gMDsKKwl1aW50NjRfdCBleHRlbnRzID0gMDsKKwlzdHJ1Y3QgbHZtX2x2X2NyZWF0ZV9wYXJhbXMgKmx2Y3AgPSBOVUxMOworCisJaWYgKHZnX3JlYWRfZXJyb3IobHYtPnZnKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIXZnX2NoZWNrX3dyaXRlX21vZGUobHYtPnZnKSkKKwkJCXJldHVybiBOVUxMOworCisJaWYgKHNuYXBfbmFtZSA9PSBOVUxMIHx8ICFzdHJsZW4oc25hcF9uYW1lKSkgeworCQlsb2dfZXJyb3IoInNuYXBfbmFtZSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChtYXhfc25hcF9zaXplKSB7CisJCXNpemUgPSBtYXhfc25hcF9zaXplID4+IFNFQ1RPUl9TSElGVDsKKwkJaWYgKCEoZXh0ZW50cyA9IGV4dGVudHNfZnJvbV9zaXplKGx2LT52Zy0+Y21kLCBzaXplLCBsdi0+dmctPmV4dGVudF9zaXplKSkpCisJCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlpZiAoIXNpemUgJiYgIWx2X2lzX3RoaW5fdm9sdW1lKGx2KSApIHsKKwkJbG9nX2Vycm9yKCJPcmlnaW4gaXMgbm90IHRoaW4sIHNwZWNpZnkgc2l6ZSBvZiBzbmFwc2hvdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsdmNwID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT52Z21lbSwgc2l6ZW9mIChzdHJ1Y3QgbHZtX2x2X2NyZWF0ZV9wYXJhbXMpKTsKKwlpZiAobHZjcCkgeworCQlsdmNwLT52ZyA9IGx2LT52ZzsKKwkJX2x2X3NldF9kZWZhdWx0X3BhcmFtcygmbHZjcC0+bHZwLCBsdi0+dmcsIHNuYXBfbmFtZSwgZXh0ZW50cyk7CisKKwkJaWYgKHNpemUpIHsKKwkJCWlmICghKGx2Y3AtPmx2cC5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcobHYtPnZnLT5jbWQsIFNFR19UWVBFX05BTUVfU05BUFNIT1QpKSkgeworCQkJCWxvZ19lcnJvcigiU2VndHlwZSBzbmFwc2hvdCBub3QgZm91bmQuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlsdmNwLT5sdnAuY2h1bmtfc2l6ZSA9IDg7CisJCQlsdmNwLT5sdnAuc25hcHNob3QgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKCEobHZjcC0+bHZwLnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhsdi0+dmctPmNtZCwgU0VHX1RZUEVfTkFNRV9USElOKSkpIHsKKwkJCQlsb2dfZXJyb3IoIlNlZ3R5cGUgdGhpbiBub3QgZm91bmQuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCWx2Y3AtPmx2cC5wb29sX25hbWUgPSBmaXJzdF9zZWcobHYpLT5wb29sX2x2LT5uYW1lOworCQl9CisKKwkJbHZjcC0+bHZwLnN0cmlwZXMgPSAxOworCQlsdmNwLT5sdnAub3JpZ2luX25hbWUgPSBsdi0+bmFtZTsKKworCQlsdmNwLT5tYWdpYyA9IExWX0NSRUFURV9QQVJBTVNfTUFHSUM7CisJfQorCisJcmV0dXJuIGx2Y3A7Cit9CisKK2x2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fbHZfcGFyYW1zX2NyZWF0ZV9zbmFwc2hvdChjb25zdCBsdl90IGx2LAorCQkJCQkJIGNvbnN0IGNoYXIgKnNuYXBfbmFtZSwKKwkJCQkJCSB1aW50NjRfdCBtYXhfc25hcF9zaXplKQoreworCWx2X2NyZWF0ZV9wYXJhbXNfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihsdi0+dmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X3BhcmFtc19jcmVhdGVfc25hcHNob3QobHYsIHNuYXBfbmFtZSwgbWF4X3NuYXBfc2l6ZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbHZfY3JlYXRlX3BhcmFtc190IF9sdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluKGNvbnN0IHZnX3QgdmcsCisJCQkJCQkJCQljb25zdCBjaGFyICpwb29sX25hbWUsCisJCQkJCQkJCQljb25zdCBjaGFyICpsdm5hbWUsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGx2bV9sdl9jcmVhdGVfcGFyYW1zICpsdmNwID0gTlVMTDsKKwl1aW50MzJfdCBleHRlbnRzID0gMDsKKworCS8qIHByZWNvbmRpdGlvbiBjaGVja3MgKi8KKwlpZiAodmdfcmVhZF9lcnJvcih2ZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKCF2Z19jaGVja193cml0ZV9tb2RlKHZnKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocG9vbF9uYW1lID09IE5VTEwgfHwgIXN0cmxlbihwb29sX25hbWUpKSB7CisJCWxvZ19lcnJvcigicG9vbF9uYW1lIGludmFsaWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGx2bmFtZSA9PSBOVUxMIHx8ICFzdHJsZW4obHZuYW1lKSkgeworCQlsb2dfZXJyb3IoImx2bmFtZSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGV4dGVudHMgPSBleHRlbnRzX2Zyb21fc2l6ZSh2Zy0+Y21kLCBzaXplIC8gU0VDVE9SX1NJWkUsCisJCQl2Zy0+ZXh0ZW50X3NpemUpKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgdGhpbiBMViB3aXRob3V0IHNpemUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWx2Y3AgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZiAoc3RydWN0IGx2bV9sdl9jcmVhdGVfcGFyYW1zKSk7CisJaWYgKGx2Y3ApIHsKKwkJbHZjcC0+dmcgPSB2ZzsKKwkJaWYgKCFfbHZfc2V0X3RoaW5fcGFyYW1zKCZsdmNwLT5sdnAsIHZnLCBwb29sX25hbWUsIGx2bmFtZSwgZXh0ZW50cykpCisJCQlyZXR1cm5fTlVMTDsKKworCQlsdmNwLT5tYWdpYyA9IExWX0NSRUFURV9QQVJBTVNfTUFHSUM7CisJfQorCisJcmV0dXJuIGx2Y3A7Cit9CisKK2x2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluKGNvbnN0IHZnX3QgdmcsIGNvbnN0IGNoYXIgKnBvb2xfbmFtZSwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKmx2bmFtZSwgdWludDY0X3Qgc2l6ZSkKK3sKKwlsdl9jcmVhdGVfcGFyYW1zX3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X3BhcmFtc19jcmVhdGVfdGhpbih2ZywgcG9vbF9uYW1lLCBsdm5hbWUsIHNpemUpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSBsdm1fbHZfcGFyYW1zX2dldF9wcm9wZXJ0eSgKKwkJCQkJCWNvbnN0IGx2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMsCisJCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgcmMgPSB7IC5pc192YWxpZCA9IDAgfTsKKworCWlmIChwYXJhbXMgJiYgcGFyYW1zLT5tYWdpYyA9PSBMVl9DUkVBVEVfUEFSQU1TX01BR0lDKSB7CisJCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHBhcmFtcy0+dmctPmNtZCk7CisJCXJjID0gZ2V0X3Byb3BlcnR5KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZwYXJhbXMtPmx2cCwgTlVMTCwgbmFtZSk7CisJCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCX0gZWxzZQorCQlsb2dfZXJyb3IoIkludmFsaWQgbHZfY3JlYXRlX3BhcmFtcyBwYXJhbWV0ZXIiKTsKKworCXJldHVybiByYzsKK30KKworaW50IGx2bV9sdl9wYXJhbXNfc2V0X3Byb3BlcnR5KGx2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkJCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgKnByb3ApCit7CisJaW50IHJjID0gLTE7CisKKwlpZiAocGFyYW1zICYmIHBhcmFtcy0+bWFnaWMgPT0gTFZfQ1JFQVRFX1BBUkFNU19NQUdJQykgeworCQlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2VudihwYXJhbXMtPnZnLT5jbWQpOworCQlyYyA9IHNldF9wcm9wZXJ0eShOVUxMLCBOVUxMLCBOVUxMLCAmcGFyYW1zLT5sdnAsIE5VTEwsIG5hbWUsIHByb3ApOworCQlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwl9IGVsc2UKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIGx2X2NyZWF0ZV9wYXJhbXMgcGFyYW1ldGVyIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsdl90IF9sdm1fbHZfY3JlYXRlKGx2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bCA9IE5VTEw7CisKKwlpZiAocGFyYW1zICYmIHBhcmFtcy0+bWFnaWMgPT0gTFZfQ1JFQVRFX1BBUkFNU19NQUdJQykgeworCQlpZiAoIXBhcmFtcy0+bHZwLnNlZ3R5cGUpIHsKKwkJCWxvZ19lcnJvcigic2VndHlwZSBwYXJhbWV0ZXIgaXMgTlVMTCIpOworCQkJcmV0dXJuX05VTEw7CisJCX0KKwkJaWYgKCFsdl9jcmVhdGVfc2luZ2xlKHBhcmFtcy0+dmcsICZwYXJhbXMtPmx2cCkpCisJCQkJcmV0dXJuX05VTEw7CisKKwkJLyoKKwkJICogSW4gc29tZSBjYXNlIHdlIGFyZSBtYWtpbmcgYSB0aGluIHBvb2wgc28gbHZfbmFtZSBpcyBub3QgdmFsaWQsIGJ1dAorCQkgKiBwb29sIGlzLgorCQkgKi8KKwkJaWYgKCEobHZsID0gZmluZF9sdl9pbl92ZyhwYXJhbXMtPnZnLAorCQkJCShwYXJhbXMtPmx2cC5sdl9uYW1lKSA/IHBhcmFtcy0+bHZwLmx2X25hbWUgOiBwYXJhbXMtPmx2cC5wb29sX25hbWUpKSkKKwkJCXJldHVybl9OVUxMOworCQlyZXR1cm4gKGx2X3QpIGx2bC0+bHY7CisJfQorCWxvZ19lcnJvcigiSW52YWxpZCBsdl9jcmVhdGVfcGFyYW1zIHBhcmFtZXRlciIpOworCXJldHVybiBOVUxMOworfQorCitsdl90IGx2bV9sdl9jcmVhdGUobHZfY3JlYXRlX3BhcmFtc190IHBhcmFtcykKK3sKKwlsdl90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHBhcmFtcy0+dmctPmNtZCk7CisJcmMgPSBfbHZtX2x2X2NyZWF0ZShwYXJhbXMpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2xpYmx2bS9sdm1fbWlzYy5jIGIvbGlibHZtL2x2bV9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczY2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm1fbWlzYy5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJsdm1fbWlzYy5oIgorI2luY2x1ZGUgImx2bTJhcHAuaCIKKyNpbmNsdWRlICJsdm1fcHJvcC5oIgorCitzdHJ1Y3QgZG1fbGlzdCAqdGFnX2xpc3RfY29weShzdHJ1Y3QgZG1fcG9vbCAqcCwgc3RydWN0IGRtX2xpc3QgKnRhZ19saXN0KQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCWx2bV9zdHJfbGlzdF90ICpsc2w7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKworCWlmICghKGxpc3QgPSBkbV9wb29sX3phbGxvYyhwLCBzaXplb2YoKmxpc3QpKSkpIHsKKwkJbG9nX2Vycm5vKEVOT01FTSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZm9yIGRtX2xpc3QuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlkbV9saXN0X2luaXQobGlzdCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIHRhZ19saXN0KSB7CisJCWlmICghKGxzbCA9IGRtX3Bvb2xfemFsbG9jKHAsIHNpemVvZigqbHNsKSkpKSB7CisJCQlsb2dfZXJybm8oRU5PTUVNLAorCQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBsdm1fbHZfbGlzdC4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICghKGxzbC0+c3RyID0gZG1fcG9vbF9zdHJkdXAocCwgc2wtPnN0cikpKSB7CisJCQlsb2dfZXJybm8oRU5PTUVNLAorCQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBsdm1fbHZfbGlzdC0+c3RyLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZG1fbGlzdF9hZGQobGlzdCwgJmxzbC0+bGlzdCk7CisJfQorCXJldHVybiBsaXN0OworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGdldF9wcm9wZXJ0eShjb25zdCBwdl90IHB2LCBjb25zdCB2Z190IHZnLAorCQkJCSAgICAgICBjb25zdCBsdl90IGx2LAorCQkJCSAgICAgICBjb25zdCBsdnNlZ190IGx2c2VnLAorCQkJCSAgICAgICBjb25zdCBwdnNlZ190IHB2c2VnLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpsdmNwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSBwcm9wOworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgdiA9IHsgMCB9OworCisJcHJvcC5pZCA9IG5hbWU7CisKKwlpZiAocHYpIHsKKwkJaWYgKCFwdl9nZXRfcHJvcGVydHkocHYsICZwcm9wKSkKKwkJCXJldHVybiB2OworCX0gZWxzZSBpZiAodmcpIHsKKwkJaWYgKCF2Z19nZXRfcHJvcGVydHkodmcsICZwcm9wKSkKKwkJCXJldHVybiB2OworCX0gZWxzZSBpZiAobHYpIHsKKwkJaWYgKCFsdl9nZXRfcHJvcGVydHkobHYsICZwcm9wKSkKKwkJCXJldHVybiB2OworCX0gZWxzZSBpZiAobHZzZWcpIHsKKwkJaWYgKCFsdnNlZ19nZXRfcHJvcGVydHkobHZzZWcsICZwcm9wKSkKKwkJCXJldHVybiB2OworCX0gZWxzZSBpZiAocHZzZWcpIHsKKwkJaWYgKCFwdnNlZ19nZXRfcHJvcGVydHkocHZzZWcsICZwcm9wKSkKKwkJCXJldHVybiB2OworCX0gZWxzZSBpZiAobHZjcCkgeworCQlpZiAoIWx2X2NyZWF0ZV9wYXJhbV9nZXRfcHJvcGVydHkobHZjcCwgJnByb3ApKQorCQkJcmV0dXJuIHY7CisJfSBlbHNlIGlmIChwdmNwKSB7CisJCWlmICghcHZfY3JlYXRlX3BhcmFtX2dldF9wcm9wZXJ0eShwdmNwLCAmcHJvcCkpCisJCQlyZXR1cm4gdjsKKwl9IGVsc2UgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiSW52YWxpZCBOVUxMIGhhbmRsZSBwYXNzZWQgdG8gbGlicmFyeSBmdW5jdGlvbi4iKTsKKwkJcmV0dXJuIHY7CisJfQorCisJdi5pc19zZXR0YWJsZSA9IHByb3AuaXNfc2V0dGFibGU7CisJdi5pc19zdHJpbmcgPSBwcm9wLmlzX3N0cmluZzsKKwl2LmlzX2ludGVnZXIgPSBwcm9wLmlzX2ludGVnZXI7CisJdi5pc19zaWduZWQgPSBwcm9wLmlzX3NpZ25lZDsKKwlpZiAodi5pc19zdHJpbmcpCisJCXYudmFsdWUuc3RyaW5nID0gcHJvcC52YWx1ZS5zdHJpbmc7CisJaWYgKHYuaXNfaW50ZWdlcikKKwkJdi52YWx1ZS5pbnRlZ2VyID0gcHJvcC52YWx1ZS5pbnRlZ2VyOworCXYuaXNfdmFsaWQgPSAxOworCXJldHVybiB2OworfQorCisKK2ludCBzZXRfcHJvcGVydHkoY29uc3QgcHZfdCBwdiwgY29uc3QgdmdfdCB2ZywgY29uc3QgbHZfdCBsdiwKKwkJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHZjcCwKKwkJc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHZjcCwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqdikKK3sKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgcHJvcDsKKworCXByb3AuaWQgPSBuYW1lOworCWlmICh2LT5pc19zdHJpbmcpCisJCXByb3AudmFsdWUuc3RyaW5nID0gdi0+dmFsdWUuc3RyaW5nOworCWVsc2UKKwkJcHJvcC52YWx1ZS5pbnRlZ2VyID0gdi0+dmFsdWUuaW50ZWdlcjsKKwlpZiAocHYpIHsKKwkJaWYgKCFwdl9zZXRfcHJvcGVydHkocHYsICZwcm9wKSkgeworCQkJdi0+aXNfdmFsaWQgPSAwOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIGlmICh2ZykgeworCQlpZiAoIXZnX3NldF9wcm9wZXJ0eSh2ZywgJnByb3ApKSB7CisJCQl2LT5pc192YWxpZCA9IDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgaWYgKGx2KSB7CisJCWlmICghbHZfc2V0X3Byb3BlcnR5KGx2LCAmcHJvcCkpIHsKKwkJCXYtPmlzX3ZhbGlkID0gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSBpZiAobHZjcCkgeworCQlpZiAoIWx2X2NyZWF0ZV9wYXJhbV9zZXRfcHJvcGVydHkobHZjcCwgJnByb3ApKSB7CisJCQl2LT5pc192YWxpZCA9IDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgaWYgKHB2Y3ApIHsKKwkJaWYgKCFwdl9jcmVhdGVfcGFyYW1fc2V0X3Byb3BlcnR5KHB2Y3AsICZwcm9wKSkgeworCQkJdi0+aXNfdmFsaWQgPSAwOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0b3JlIGFueXRoaW5nIHRoYXQgbWF5IG5lZWQgdG8gYmUgcmVzdG9yZWQgYmFjayB0byB0aGUgdXNlciBvbiBsaWJyYXJ5CisgKiBjYWxsIGV4aXQuICBDdXJyZW50bHkgdGhlIG9ubHkgdGhpbmcgd2UgYXJlIHByZXNlcnZpbmcgaXMgdGhlIHVzZXJzIHVtYXNrLgorICovCitzdHJ1Y3Qgc2F2ZWRfZW52IHN0b3JlX3VzZXJfZW52KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXN0cnVjdCBzYXZlZF9lbnYgZW52ID0gezB9OworCisJaWYgKGNtZCkgeworCQllbnYudXNlcl91bWFzayA9IHVtYXNrKGNtZC0+ZGVmYXVsdF9zZXR0aW5ncy51bWFzayk7CisJfSBlbHNlIHsKKwkJZW52LnVzZXJfdW1hc2sgPSB1bWFzaygwKTsKKwkJdW1hc2soZW52LnVzZXJfdW1hc2spOworCX0KKworCXJldHVybiBlbnY7Cit9CisKK3ZvaWQgcmVzdG9yZV91c2VyX2Vudihjb25zdCBzdHJ1Y3Qgc2F2ZWRfZW52ICplbnYpCit7CisJaWYgKGVudikgeworCQl1bWFzayhlbnYtPnVzZXJfdW1hc2spOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmx2bS9sdm1fbWlzYy5oIGIvbGlibHZtL2x2bV9taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm1fbWlzYy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2lmbmRlZiBfTFZNMkFQUF9NSVNDX0gKKyNkZWZpbmUgX0xWTTJBUFBfTUlTQ19ICisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKyNpbmNsdWRlICJsdm0yYXBwLmgiCisjaW5jbHVkZSAibWV0YWRhdGEtZXhwb3J0ZWQuaCIKKyNpbmNsdWRlICJ0b29sY29udGV4dC5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3RydWN0IHNhdmVkX2VudgoreworCW1vZGVfdCB1c2VyX3VtYXNrOworfTsKKworc3RydWN0IHNhdmVkX2VudiBzdG9yZV91c2VyX2VudihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCk7Cit2b2lkIHJlc3RvcmVfdXNlcl9lbnYoY29uc3Qgc3RydWN0IHNhdmVkX2VudiAqZW52KTsKKworc3RydWN0IGRtX2xpc3QgKnRhZ19saXN0X2NvcHkoc3RydWN0IGRtX3Bvb2wgKnAsIHN0cnVjdCBkbV9saXN0ICp0YWdfbGlzdCk7CitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGdldF9wcm9wZXJ0eShjb25zdCBwdl90IHB2LCBjb25zdCB2Z190IHZnLAorCQkJCSAgICAgICBjb25zdCBsdl90IGx2LCBjb25zdCBsdnNlZ190IGx2c2VnLAorCQkJCSAgICAgICBjb25zdCBwdnNlZ190IHB2c2VnLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpsdmNwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzZXRfcHJvcGVydHkoY29uc3QgcHZfdCBwdiwgY29uc3QgdmdfdCB2ZywgY29uc3QgbHZfdCBsdiwKKwkJCXN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmx2Y3AsCisJCQlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgKnZhbHVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJsdm0vbHZtX3Byb3AuYyBiL2xpYmx2bS9sdm1fcHJvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJsdm0vbHZtX3Byb3AuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsdm1fcHJvcC5oIgorI2luY2x1ZGUgImxpYmRldm1hcHBlci5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLmgiCisKKy8qIGx2IGNyZWF0ZSBwYXJhbWV0ZXJzICovCitHRVRfTFZDUkVBVEVQQVJBTVNfTlVNX1BST1BFUlRZX0ZOKHNraXBfemVybywgbHZjcC0+emVybykKK1NFVF9MVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oc2tpcF96ZXJvLCBsdmNwLT56ZXJvKQorCisvKiBQViBjcmVhdGUgcGFyYW1ldGVycyAqLworR0VUX1BWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTihzaXplLCBwdmNwLT5wdmEuc2l6ZSkKK1NFVF9QVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oc2l6ZSwgcHZjcC0+cHZhLnNpemUpCisKK0dFVF9QVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4ocHZtZXRhZGF0YWNvcGllcywgcHZjcC0+cHZhLnB2bWV0YWRhdGFjb3BpZXMpCitTRVRfUFZDUkVBVEVQQVJBTVNfTlVNX1BST1BFUlRZX0ZOKHB2bWV0YWRhdGFjb3BpZXMsIHB2Y3AtPnB2YS5wdm1ldGFkYXRhY29waWVzKQorCitHRVRfUFZDUkVBVEVQQVJBTVNfTlVNX1BST1BFUlRZX0ZOKHB2bWV0YWRhdGFzaXplLCBwdmNwLT5wdmEucHZtZXRhZGF0YXNpemUpCitTRVRfUFZDUkVBVEVQQVJBTVNfTlVNX1BST1BFUlRZX0ZOKHB2bWV0YWRhdGFzaXplLCBwdmNwLT5wdmEucHZtZXRhZGF0YXNpemUpCisKK0dFVF9QVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oZGF0YV9hbGlnbm1lbnQsIHB2Y3AtPnB2YS5kYXRhX2FsaWdubWVudCkKK1NFVF9QVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oZGF0YV9hbGlnbm1lbnQsIHB2Y3AtPnB2YS5kYXRhX2FsaWdubWVudCkKKworR0VUX1BWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTihkYXRhX2FsaWdubWVudF9vZmZzZXQsIHB2Y3AtPnB2YS5kYXRhX2FsaWdubWVudF9vZmZzZXQpCitTRVRfUFZDUkVBVEVQQVJBTVNfTlVNX1BST1BFUlRZX0ZOKGRhdGFfYWxpZ25tZW50X29mZnNldCwgcHZjcC0+cHZhLmRhdGFfYWxpZ25tZW50X29mZnNldCkKKworR0VUX1BWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTih6ZXJvLCBwdmNwLT56ZXJvKQorU0VUX1BWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTih6ZXJvLCBwdmNwLT56ZXJvKQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgX2xpYl9wcm9wZXJ0aWVzW10gPSB7CisjaW5jbHVkZSAibHZtX3Byb3BfZmllbGRzLmgiCisJeyAwLCAiIiwgMCwgMCwgMCwgMCwgeyAuaW50ZWdlciA9IDAgfSwgcHJvcF9ub3RfaW1wbGVtZW50ZWRfZ2V0LAorCQkJcHJvcF9ub3RfaW1wbGVtZW50ZWRfc2V0IH0sCit9OworCisjdW5kZWYgU1RSCisjdW5kZWYgTlVNCisjdW5kZWYgRklFTEQKKworaW50IGx2X2NyZWF0ZV9wYXJhbV9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHZjcCwKKwkJc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKQoreworCXJldHVybiBwcm9wX2dldF9wcm9wZXJ0eShfbGliX3Byb3BlcnRpZXMsIGx2Y3AsIHByb3AsIExWX0NSRUFURV9QQVJBTVMpOworfQorCitpbnQgbHZfY3JlYXRlX3BhcmFtX3NldF9wcm9wZXJ0eShzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpsdmNwLAorCQkgICAgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKQoreworCXJldHVybiBwcm9wX3NldF9wcm9wZXJ0eShfbGliX3Byb3BlcnRpZXMsIGx2Y3AsIHByb3AsIExWX0NSRUFURV9QQVJBTVMpOworfQorCitpbnQgcHZfY3JlYXRlX3BhcmFtX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3BfZ2V0X3Byb3BlcnR5KF9saWJfcHJvcGVydGllcywgcHZjcCwgcHJvcCwgUFZfQ1JFQVRFX1BBUkFNUyk7Cit9CisKK2ludCBwdl9jcmVhdGVfcGFyYW1fc2V0X3Byb3BlcnR5KHN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnB2Y3AsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApCit7CisJcmV0dXJuIHByb3Bfc2V0X3Byb3BlcnR5KF9saWJfcHJvcGVydGllcywgcHZjcCwgcHJvcCwgUFZfQ1JFQVRFX1BBUkFNUyk7Cit9CmRpZmYgLS1naXQgYS9saWJsdm0vbHZtX3Byb3AuaCBiL2xpYmx2bS9sdm1fcHJvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTdlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJsdm0vbHZtX3Byb3AuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAicHJvcF9jb21tb24uaCIKKworI2lmbmRlZiBfTElCX0xWTV9QUk9QX0gKKyNkZWZpbmUgX0xJQl9MVk1fUFJPUF9ICisKK3R5cGVkZWYgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyB0eXBlX2x2Y3JlYXRlX3BhcmFtczsKK3R5cGVkZWYgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyB0eXBlX3B2Y3JlYXRlX3BhcmFtczsKKworI2RlZmluZSBMVl9DUkVBVEVfUEFSQU1TIDEKKyNkZWZpbmUgUFZfQ1JFQVRFX1BBUkFNUyAyCisKKyNkZWZpbmUgR0VUX0xWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSlcCisJR0VUX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSwgbHZjcmVhdGVfcGFyYW1zLCBsdmNwKQorCisjZGVmaW5lIFNFVF9MVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlTRVRfTlVNX1BST1BFUlRZKE5BTUUsIFZBTFVFLCBsdmNyZWF0ZV9wYXJhbXMsIGx2Y3ApCisKKyNkZWZpbmUgR0VUX1BWQ1JFQVRFUEFSQU1TX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSlcCisJR0VUX05VTV9QUk9QRVJUWV9GTihOQU1FLCBWQUxVRSwgcHZjcmVhdGVfcGFyYW1zLCBwdmNwKQorCisjZGVmaW5lIFNFVF9QVkNSRUFURVBBUkFNU19OVU1fUFJPUEVSVFlfRk4oTkFNRSwgVkFMVUUpIFwKKwlTRVRfTlVNX1BST1BFUlRZKE5BTUUsIFZBTFVFLCBwdmNyZWF0ZV9wYXJhbXMsIHB2Y3ApCisKK2ludCBsdl9jcmVhdGVfcGFyYW1fZ2V0X3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmx2Y3AsCisJCXN0cnVjdCBsdm1fcHJvcGVydHlfdHlwZSAqcHJvcCk7CisKK2ludCBsdl9jcmVhdGVfcGFyYW1fc2V0X3Byb3BlcnR5KHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmx2Y3AsCisJCSAgICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworCitpbnQgcHZfY3JlYXRlX3BhcmFtX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3R5cGUgKnByb3ApOworCitpbnQgcHZfY3JlYXRlX3BhcmFtX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwdmNwLAorCQkgICAgc3RydWN0IGx2bV9wcm9wZXJ0eV90eXBlICpwcm9wKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJsdm0vbHZtX3Byb3BfZmllbGRzLmggYi9saWJsdm0vbHZtX3Byb3BfZmllbGRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmMTI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmx2bS9sdm1fcHJvcF9maWVsZHMuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK0ZJRUxEKExWX0NSRUFURV9QQVJBTVMsIGx2Y3JlYXRlX3BhcmFtcywgTlVNLCAic2tpcF96ZXJvIiwgemVybywgMiwgdWludDMyLCBza2lwX3plcm8sICJTa2lwIHplcm9pbmcgb24gbHYgY3JlYXRpb24iLCAxKQorCitGSUVMRChQVl9DUkVBVEVfUEFSQU1TLCBwdmNyZWF0ZV9wYXJhbXMsIE5VTSwgInNpemUiLCAgICAgIHNpemUsIDIsIHVpbnQ2NF90LCBzaXplLCAiUFYgc2l6ZSIsIDEpCitGSUVMRChQVl9DUkVBVEVfUEFSQU1TLCBwdmNyZWF0ZV9wYXJhbXMsIE5VTSwgInB2bWV0YWRhdGFjb3BpZXMiLCBwdm1ldGFkYXRhY29waWVzLCAyLCB1aW50NjRfdCwgcHZtZXRhZGF0YWNvcGllcywgIlBWIE1ldGFkYXRhIGNvcGllcyIsIDEpCitGSUVMRChQVl9DUkVBVEVfUEFSQU1TLCBwdmNyZWF0ZV9wYXJhbXMsIE5VTSwgInB2bWV0YWRhdGFzaXplIiwgcHZtZXRhZGF0YXNpemUsIDIsIHVpbnQ2NF90LCBwdm1ldGFkYXRhc2l6ZSwgIlBWIE1ldGFkYXRhIHNpemUiLCAxKQorRklFTEQoUFZfQ1JFQVRFX1BBUkFNUywgcHZjcmVhdGVfcGFyYW1zLCBOVU0sICJkYXRhX2FsaWdubWVudCIsIGRhdGFfYWxpZ25tZW50LCAyLCB1aW50NjRfdCwgZGF0YV9hbGlnbm1lbnQsICJTdGFydCBkYXRhIHRvIGEgbXVsdGlwbGUgb2YgdmFsdWUiLCAxKQorRklFTEQoUFZfQ1JFQVRFX1BBUkFNUywgcHZjcmVhdGVfcGFyYW1zLCBOVU0sICJkYXRhX2FsaWdubWVudF9vZmZzZXQiLCBkYXRhX2FsaWdubWVudF9vZmZzZXQsIDIsIHVpbnQ2NF90LCBkYXRhX2FsaWdubWVudF9vZmZzZXQsICJTaGlmdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSIsIDEpCitGSUVMRChQVl9DUkVBVEVfUEFSQU1TLCBwdmNyZWF0ZV9wYXJhbXMsIE5VTSwgInplcm8iLCB6ZXJvLCAyLCB1aW50NjRfdCwgemVybywgIlplcm8gZmlyc3QgMjA0OCBieXRlcyBvZiBkZXZpY2UiLCAxKQpkaWZmIC0tZ2l0IGEvbGlibHZtL2x2bV9wdi5jIGIvbGlibHZtL2x2bV9wdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDg0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJsdm0vbHZtX3B2LmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAibGliLmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsdm0tc3RyaW5nLmgiCisjaW5jbHVkZSAic3RyX2xpc3QuaCIKKyNpbmNsdWRlICJsdm1fbWlzYy5oIgorI2luY2x1ZGUgImx2bTJhcHAuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAidG9vbGNvbnRleHQuaCIKKyNpbmNsdWRlICJsdm1fbWlzYy5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKworc3RydWN0IGx2bV9wdl9jcmVhdGVfcGFyYW1zCit7CisJdWludDMyX3QgbWFnaWM7CisJbHZtX3QgbGliaDsKKwljb25zdCBjaGFyICpwdl9uYW1lOworCXN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgcHZfcDsKK307CisKKyNkZWZpbmUgUFZfQ1JFQVRFX1BBUkFNU19NQUdJQyAweEZFRUQwMDAyCisKK2NvbnN0IGNoYXIgKmx2bV9wdl9nZXRfdXVpZChjb25zdCBwdl90IHB2KQoreworCWNvbnN0IGNoYXIgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHB2LT52Zy0+Y21kKTsKKwlyYyA9IHB2X3V1aWRfZHVwKHB2LT52Zy0+dmdtZW0sIHB2KTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IGNoYXIgKmx2bV9wdl9nZXRfbmFtZShjb25zdCBwdl90IHB2KQoreworCWNvbnN0IGNoYXIgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHB2LT52Zy0+Y21kKTsKKwlyYyA9IGRtX3Bvb2xfc3RybmR1cChwdi0+dmctPnZnbWVtLCBwdl9kZXZfbmFtZShwdiksIE5BTUVfTEVOKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQ2NF90IGx2bV9wdl9nZXRfbWRhX2NvdW50KGNvbnN0IHB2X3QgcHYpCit7CisJdWludDY0X3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYocHYtPnZnLT5jbWQpOworCXJjID0gKHVpbnQ2NF90KSBwdl9tZGFfY291bnQocHYpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3B2X2dldF9kZXZfc2l6ZShjb25zdCBwdl90IHB2KQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHB2LT52Zy0+Y21kKTsKKwlyYyA9IFNFQ1RPUl9TSVpFICogcHZfZGV2X3NpemUocHYpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3B2X2dldF9zaXplKGNvbnN0IHB2X3QgcHYpCit7CisJdWludDY0X3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYocHYtPnZnLT5jbWQpOworCXJjID0gU0VDVE9SX1NJWkUgKiBwdl9zaXplX2ZpZWxkKHB2KTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQ2NF90IGx2bV9wdl9nZXRfZnJlZShjb25zdCBwdl90IHB2KQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHB2LT52Zy0+Y21kKTsKKwlyYyA9IFNFQ1RPUl9TSVpFICogcHZfZnJlZShwdik7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9wdl9nZXRfcHJvcGVydHkoY29uc3QgcHZfdCBwdiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHB2LT52Zy0+Y21kKTsKKwlyYyA9IGdldF9wcm9wZXJ0eShwdiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgbmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9wdnNlZ19nZXRfcHJvcGVydHkoY29uc3QgcHZzZWdfdCBwdnNlZywKKwkJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYocHZzZWctPnB2LT52Zy0+Y21kKTsKKwlyYyA9IGdldF9wcm9wZXJ0eShOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBwdnNlZywgTlVMTCwgTlVMTCwgbmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX2xpc3Rfd3JhcHBlcgoreworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CisJc3RydWN0IGRtX2xpc3QgcHZzbGlzdDsKKwlzdHJ1Y3QgZG1fbGlzdCB2Z3NsaXN0OworfTsKKworaW50IGx2bV9wdl9yZW1vdmUobHZtX3QgbGliaCwgY29uc3QgY2hhciAqcHZfbmFtZSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmg7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYoY21kKTsKKwlzdHJ1Y3QgZG1fbGlzdCBwdl9uYW1lczsKKworCWRtX2xpc3RfaW5pdCgmcHZfbmFtZXMpOworCisJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sICZwdl9uYW1lcywgcHZfbmFtZSkpCisJCXJjID0gLTE7CisKKwlpZiAocmMgPj0gMCAmJiAhcHZyZW1vdmVfbWFueShjbWQsICZwdl9uYW1lcywgMCwgMCkpCisJCXJjID0gLTE7CisKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgUFZfTElTVF9NQUdJQyA0MDI2OTA3MTUzVQorCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9sdm1fbGlzdF9wdnMobHZtX3QgbGliaCkKK3sKKwlzdHJ1Y3QgbHZtX2xpc3Rfd3JhcHBlciAqcmMgPSBOVUxMOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmg7CisKKwkvKgorCSAqIFRoaXMgbWVtb3J5IHdpbGwgZ2V0IGNsZWFyZWQgd2hlbiB0aGUgbGlicmFyeSBoYW5kbGUKKwkgKiBnZXRzIGNsb3NlZCwgZG9uJ3QgdHJ5IHRvIGZyZWUgaXMgYXMgaXQgZG9lc24ndCB3b3JrCisJICogbGlrZSBtYWxsb2MvZnJlZSBkby4KKwkgKi8KKwlpZiAoIShyYyA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnJjKSkpKSB7CisJCWxvZ19lcnJubyhFTk9NRU0sICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBwdiBsaXN0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWxvY2tfdm9sKGNtZCwgVkdfR0xPQkFMLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJubyhFTk9MQ0ssICJVbmFibGUgdG8gb2J0YWluIGdsb2JhbCBsb2NrLiIpOworCX0gZWxzZSB7CisJCWRtX2xpc3RfaW5pdCgmcmMtPnB2c2xpc3QpOworCQlkbV9saXN0X2luaXQoJnJjLT52Z3NsaXN0KTsKKwkJaWYgKCFnZXRfcHZzX3BlcnNlcnZlX3ZnKGNtZCwgJnJjLT5wdnNsaXN0LCAmcmMtPnZnc2xpc3QpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBubyBQVnMgd2Ugc3RpbGwgbmVlZCB0byBoYXZlIGFjY2VzcyB0byBjbWQKKwkJICogcG9pbnRlciBpbiB0aGUgZnJlZSBjYWxsLgorCQkgKi8KKwkJcmMtPmNtZCA9IGNtZDsKKwkJcmMtPm1hZ2ljID0gUFZfTElTVF9NQUdJQzsKKwl9CisKKwlyZXR1cm4gJnJjLT5wdnNsaXN0OworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX2xpc3RfcHZzKGx2bV90IGxpYmgpCit7CisJc3RydWN0IGRtX2xpc3QgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKwlyYyA9IF9sdm1fbGlzdF9wdnMobGliaCk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbHZtX2xpc3RfcHZzX2ZyZWUoc3RydWN0IGRtX2xpc3QgKnB2bGlzdCkKK3sKKwlzdHJ1Y3QgbHZtX2xpc3Rfd3JhcHBlciAqdG9fZGVsZXRlOworCXN0cnVjdCB2Z19saXN0ICp2Z2w7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGU7CisKKwlpZiAocHZsaXN0KSB7CisJCXRvX2RlbGV0ZSA9IGRtX2xpc3Rfc3RydWN0X2Jhc2UocHZsaXN0LCBzdHJ1Y3QgbHZtX2xpc3Rfd3JhcHBlciwgcHZzbGlzdCk7CisJCWlmICh0b19kZWxldGUtPm1hZ2ljICE9IFBWX0xJU1RfTUFHSUMpIHsKKwkJCWxvZ19lcnJubyhFSU5WQUwsICJOb3QgYSBjb3JyZWN0IHB2bGlzdCBzdHJ1Y3R1cmUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qCisJCSAqIE5lZWQgdG8gZW5zdXJlIHRoYXQgcG9pbnRlciBpcyB2YWxpZCBiZWZvcmUgd2UgY2FuIHVzZSByZWZlcmVuY2UgdG8KKwkJICogY21kLgorCQkgKi8KKwkJZSA9IHN0b3JlX3VzZXJfZW52KHRvX2RlbGV0ZS0+Y21kKTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXModmdsLCAmdG9fZGVsZXRlLT52Z3NsaXN0KSB7CisJCQlyZWxlYXNlX3ZnKHZnbC0+dmcpOworCQl9CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnRvX2RlbGV0ZS0+cHZzbGlzdCkKKwkJCWZyZWVfcHZfZmlkKHB2bC0+cHYpOworCisJCXVubG9ja192Zyh0b19kZWxldGUtPmNtZCwgTlVMTCwgVkdfR0xPQkFMKTsKKwkJdG9fZGVsZXRlLT5tYWdpYyA9IDB4QTVBNUE1QTU7CisKKwkJcmVzdG9yZV91c2VyX2VudigmZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fbGlzdCAqX2x2bV9wdl9saXN0X3B2c2Vncyhwdl90IHB2KQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCXB2c2VnX2xpc3RfdCAqcHZzZWc7CisJc3RydWN0IHB2X3NlZ21lbnQgKnB2bDsKKworCWlmIChkbV9saXN0X2VtcHR5KCZwdi0+c2VnbWVudHMpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGxpc3QgPSBkbV9wb29sX3phbGxvYyhwdi0+dmctPnZnbWVtLCBzaXplb2YoKmxpc3QpKSkpIHsKKwkJbG9nX2Vycm5vKEVOT01FTSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZm9yIGRtX2xpc3QuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdChsaXN0KTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZwdi0+c2VnbWVudHMpIHsKKwkJaWYgKCEocHZzZWcgPSBkbV9wb29sX3phbGxvYyhwdi0+dmctPnZnbWVtLCBzaXplb2YoKnB2c2VnKSkpKSB7CisJCQlsb2dfZXJybm8oRU5PTUVNLAorCQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBsdm1fcHZzZWdfbGlzdC4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXB2c2VnLT5wdnNlZyA9IHB2bDsKKwkJZG1fbGlzdF9hZGQobGlzdCwgJnB2c2VnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2bV9wdl9saXN0X3B2c2Vncyhwdl90IHB2KQoreworCXN0cnVjdCBkbV9saXN0ICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihwdi0+dmctPmNtZCk7CisJcmMgPSBfbHZtX3B2X2xpc3RfcHZzZWdzKHB2KTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3B2X3QgbHZtX3B2X2Zyb21fbmFtZSh2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lKQoreworCXB2X3QgcmMgPSBOVUxMOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykKKwkJaWYgKCFzdHJjbXAobmFtZSwgcHZfZGV2X25hbWUocHZsLT5wdikpKSB7CisJCQlyYyA9IHB2bC0+cHY7CisJCQlicmVhazsKKwkJfQorCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgcHZfdCBfbHZtX3B2X2Zyb21fdXVpZCh2Z190IHZnLCBjb25zdCBjaGFyICp1dWlkKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IGlkIGlkOworCisJaWYgKHN0cmxlbih1dWlkKSA8IElEX0xFTikgeworCQlsb2dfZXJybm8gKEVJTlZBTCwgIkludmFsaWQgVVVJRCBzdHJpbmcgbGVuZ3RoIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaWRfcmVhZF9mb3JtYXQoJmlkLCB1dWlkKSkgeworCQlsb2dfZXJybm8oRUlOVkFMLCAiSW52YWxpZCBVVUlEIGZvcm1hdC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpCisJCWlmIChpZF9lcXVhbCgmaWQsICZwdmwtPnB2LT5pZCkpCisJCQlyZXR1cm4gcHZsLT5wdjsKKworCXJldHVybiBOVUxMOworfQorCitwdl90IGx2bV9wdl9mcm9tX3V1aWQodmdfdCB2ZywgY29uc3QgY2hhciAqdXVpZCkKK3sKKwlwdl90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gX2x2bV9wdl9mcm9tX3V1aWQodmcsIHV1aWQpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfbHZtX3B2X3Jlc2l6ZShjb25zdCBwdl90IHB2LCB1aW50NjRfdCBuZXdfc2l6ZSkKK3sKKwl1aW50NjRfdCBzaXplID0gbmV3X3NpemUgPj4gU0VDVE9SX1NISUZUOworCisJaWYgKG5ld19zaXplICUgU0VDVE9SX1NJWkUpIHsKKwkJbG9nX2Vycm5vKEVJTlZBTCwgIlNpemUgbm90IGEgbXVsdGlwbGUgb2YgNTEyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXZnX2NoZWNrX3dyaXRlX21vZGUocHYtPnZnKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFwdl9yZXNpemVfc2luZ2xlKHB2LT52Zy0+Y21kLCBwdi0+dmcsIHB2LCBzaXplKSkgeworCQlsb2dfZXJyb3IoIlBWIHJlLXNpemUgZmFpbGVkISIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBsdm1fcHZfcmVzaXplKGNvbnN0IHB2X3QgcHYsIHVpbnQ2NF90IG5ld19zaXplKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudihwdi0+dmctPmNtZCk7CisJcmMgPSBfbHZtX3B2X3Jlc2l6ZShwdiwgbmV3X3NpemUpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIENvbW1vbiBpbnRlcm5hbCBjb2RlIHRvIGNyZWF0ZSBhIHBhcmFtZXRlciBwYXNzaW5nIG9iamVjdAorICovCitzdGF0aWMgc3RydWN0IGx2bV9wdl9jcmVhdGVfcGFyYW1zICpfbHZtX3B2X3BhcmFtc19jcmVhdGUoCisJCWx2bV90IGxpYmgsCisJCWNvbnN0IGNoYXIgKnB2X25hbWUsCisJCXN0cnVjdCBsdm1fcHZfY3JlYXRlX3BhcmFtcyAqcHZjcF9pbikKK3sKKwlzdHJ1Y3QgbHZtX3B2X2NyZWF0ZV9wYXJhbXMgKnB2Y3AgPSBOVUxMOworCWNvbnN0IGNoYXIgKmRldiA9IE5VTEw7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaDsKKworCWlmICghcHZfbmFtZSB8fCBzdHJsZW4ocHZfbmFtZSkgPT0gMCkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgcHZfbmFtZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIXB2Y3BfaW4pIHsKKwkJcHZjcCA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bGlibWVtLCBzaXplb2Yoc3RydWN0IGx2bV9wdl9jcmVhdGVfcGFyYW1zKSk7CisJfSBlbHNlIHsKKwkJcHZjcCA9IHB2Y3BfaW47CisJfQorCisJaWYgKCFwdmNwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWRldiA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bGlibWVtLCBwdl9uYW1lKTsKKwlpZiAoIWRldikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwdmNyZWF0ZV9wYXJhbXNfc2V0X2RlZmF1bHRzKCZwdmNwLT5wdl9wKTsKKwlwdmNwLT5wdl9wLnllcyA9IDE7CisJcHZjcC0+cHZfcC5mb3JjZSA9IERPTlRfUFJPTVBUOworCXB2Y3AtPnB2X25hbWUgPSBkZXY7CisJcHZjcC0+bGliaCA9IGxpYmg7CisJcHZjcC0+bWFnaWMgPSBQVl9DUkVBVEVfUEFSQU1TX01BR0lDOworCisJcmV0dXJuIHB2Y3A7Cit9CisKK3B2X2NyZWF0ZV9wYXJhbXNfdCBsdm1fcHZfcGFyYW1zX2NyZWF0ZShsdm1fdCBsaWJoLCBjb25zdCBjaGFyICpwdl9uYW1lKQoreworCXB2X2NyZWF0ZV9wYXJhbXNfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudigoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaCk7CisJcmMgPSBfbHZtX3B2X3BhcmFtc19jcmVhdGUobGliaCwgcHZfbmFtZSwgTlVMTCk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9wdl9wYXJhbXNfZ2V0X3Byb3BlcnR5KAorCQkJCQkJY29uc3QgcHZfY3JlYXRlX3BhcmFtc190IHBhcmFtcywKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSByYyA9IHsKKwkJLmlzX3ZhbGlkID0gMAorCX07CisJc3RydWN0IHNhdmVkX2VudiBlOworCisJaWYgKHBhcmFtcyAmJiBwYXJhbXMtPm1hZ2ljID09IFBWX0NSRUFURV9QQVJBTVNfTUFHSUMpIHsKKwkJZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKikocGFyYW1zLT5saWJoKSk7CisJCXJjID0gZ2V0X3Byb3BlcnR5KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZwYXJhbXMtPnB2X3AsCisJCQkJCQkJbmFtZSk7CisJCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCBwdl9jcmVhdGVfcGFyYW1zIHBhcmFtZXRlciIpOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGx2bV9wdl9wYXJhbXNfc2V0X3Byb3BlcnR5KHB2X2NyZWF0ZV9wYXJhbXNfdCBwYXJhbXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkJCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgKnByb3ApCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IHNhdmVkX2VudiBlOworCisJaWYgKHBhcmFtcyAmJiBwYXJhbXMtPm1hZ2ljID09IFBWX0NSRUFURV9QQVJBTVNfTUFHSUMpIHsKKwkJZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKikocGFyYW1zLT5saWJoKSk7CisJCXJjID0gc2V0X3Byb3BlcnR5KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZwYXJhbXMtPnB2X3AsIG5hbWUsIHByb3ApOworCQlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoIkludmFsaWQgcHZfY3JlYXRlX3BhcmFtcyBwYXJhbWV0ZXIiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9wdl9jcmVhdGUocHZfY3JlYXRlX3BhcmFtc190IHBhcmFtcykKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IChzdHJ1Y3QgY21kX2NvbnRleHQgKilwYXJhbXMtPmxpYmg7CisJaW50IHJjID0gMDsKKworCWlmIChwYXJhbXMtPnB2X3AucHZhLnNpemUpIHsKKwkJaWYgKHBhcmFtcy0+cHZfcC5wdmEuc2l6ZSAlIFNFQ1RPUl9TSVpFKSB7CisJCQlsb2dfZXJybm8oRUlOVkFMLCAiU2l6ZSBub3QgYSBtdWx0aXBsZSBvZiA1MTIiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwYXJhbXMtPnB2X3AucHZhLnNpemUgPSBwYXJhbXMtPnB2X3AucHZhLnNpemUgPj4gU0VDVE9SX1NISUZUOworCX0KKworCWlmICghbG9ja192b2woY21kLCBWR19PUlBIQU5TLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJubyhFSU5WQUwsICJDYW4ndCBnZXQgbG9jayBmb3Igb3JwaGFuIFBWcyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCEocHZjcmVhdGVfdm9sKGNtZCwgcGFyYW1zLT5wdl9uYW1lLCAmcGFyYW1zLT5wdl9wLCAxKSkpCisJCXJjID0gLTE7CisKKwl1bmxvY2tfdmcoY21kLCBOVUxMLCBWR19PUlBIQU5TKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsdm1fcHZfY3JlYXRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKnB2X25hbWUsIHVpbnQ2NF90IHNpemUpCit7CisJc3RydWN0IGx2bV9wdl9jcmVhdGVfcGFyYW1zIHBwOworCWludCByYyA9IC0xOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKworCWlmIChfbHZtX3B2X3BhcmFtc19jcmVhdGUobGliaCwgcHZfbmFtZSwgJnBwKSkgeworCQlwcC5wdl9wLnB2YS5zaXplID0gc2l6ZTsKKwkJcmMgPSBfcHZfY3JlYXRlKCZwcCk7CisJfQorCisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbHZtX3B2X2NyZWF0ZV9hZHYocHZfY3JlYXRlX3BhcmFtc190IHBhcmFtcykKK3sKKwlpbnQgcmMgPSAtMTsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGU7CisKKwlpZiAocGFyYW1zICYmIHBhcmFtcy0+bWFnaWMgPT0gUFZfQ1JFQVRFX1BBUkFNU19NQUdJQykgeworCQllID0gc3RvcmVfdXNlcl9lbnYoKHN0cnVjdCBjbWRfY29udGV4dCAqKShwYXJhbXMtPmxpYmgpKTsKKwkJcmMgPSBfcHZfY3JlYXRlKHBhcmFtcyk7CisJCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCBwdl9jcmVhdGVfcGFyYW1zIHBhcmFtZXRlciIpOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2xpYmx2bS9sdm1fdmcuYyBiL2xpYmx2bS9sdm1fdmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjgzMjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibHZtL2x2bV92Zy5jCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYi5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKyNpbmNsdWRlICJhcmNoaXZlci5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJsdm1jYWNoZS5oIgorI2luY2x1ZGUgImx2bWV0YWQuaCIKKyNpbmNsdWRlICJsdm1fbWlzYy5oIgorI2luY2x1ZGUgImx2bTJhcHAuaCIKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisjaW5jbHVkZSAibHZtZXRhZC5oIgorCitpbnQgbHZtX3ZnX2FkZF90YWcodmdfdCB2ZywgY29uc3QgY2hhciAqdGFnKQoreworCWludCByYyA9IC0xOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCisJaWYgKCF2Z19yZWFkX2Vycm9yKHZnKSAmJiB2Z19jaGVja193cml0ZV9tb2RlKHZnKSAmJgorCQl2Z19jaGFuZ2VfdGFnKHZnLCB0YWcsIDEpKQorCQlyYyA9IDA7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCisKK2ludCBsdm1fdmdfcmVtb3ZlX3RhZyh2Z190IHZnLCBjb25zdCBjaGFyICp0YWcpCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisKKwlpZiAoIXZnX3JlYWRfZXJyb3IodmcpICYmIHZnX2NoZWNrX3dyaXRlX21vZGUodmcpICYmCisJCXZnX2NoYW5nZV90YWcodmcsIHRhZywgMCkpCisJCXJjID0gMDsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKwordmdfdCBsdm1fdmdfY3JlYXRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKnZnX25hbWUpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBOVUxMOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKworCXZnID0gdmdfbG9ja19hbmRfY3JlYXRlKChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoLCB2Z19uYW1lKTsKKwkvKiBGSVhNRTogZXJyb3IgaGFuZGxpbmcgaXMgc3RpbGwgVEJEICovCisJaWYgKHZnX3JlYWRfZXJyb3IodmcpKSB7CisJCXJlbGVhc2VfdmcodmcpOworCQl2ZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJdmctPm9wZW5fbW9kZSA9ICd3JzsKKwl9CisKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gKHZnX3QpIHZnOworfQorCitzdGF0aWMgaW50IF9sdm1fdmdfZXh0ZW5kKHZnX3QgdmcsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zIHBwOworCisJaWYgKHZnX3JlYWRfZXJyb3IodmcpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXZnX2NoZWNrX3dyaXRlX21vZGUodmcpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWxvY2tfdm9sKHZnLT5jbWQsIFZHX09SUEhBTlMsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3Igb3JwaGFuIFBWcyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHZjcmVhdGVfcGFyYW1zX3NldF9kZWZhdWx0cygmcHApOworCWlmICghdmdfZXh0ZW5kKHZnLCAxLCAmZGV2aWNlLCAmcHApKSB7CisJCXVubG9ja192Zyh2Zy0+Y21kLCBOVUxMLCBWR19PUlBIQU5TKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKgorCSAqIEZJWE1FOiBFaXRoZXIgY29tbWl0IHRvIGRpc2ssIG9yIGtlZXAgaG9sZGluZyBWR19PUlBIQU5TIGFuZAorCSAqIHJlbGVhc2UgaW4gbHZtX3ZnX2Nsb3NlKCkuCisJICovCisJdW5sb2NrX3ZnKHZnLT5jbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCXJldHVybiAwOworfQorCitpbnQgbHZtX3ZnX2V4dGVuZCh2Z190IHZnLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IF9sdm1fdmdfZXh0ZW5kKHZnLCBkZXZpY2UpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworaW50IGx2bV92Z19yZWR1Y2UodmdfdCB2ZywgY29uc3QgY2hhciAqZGV2aWNlKQoreworCWludCByYyA9IC0xOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCisJaWYgKCF2Z19yZWFkX2Vycm9yKHZnKSAmJiB2Z19jaGVja193cml0ZV9tb2RlKHZnKSAmJiB2Z19yZWR1Y2UodmcsIGRldmljZSkpCisJCXJjID0gMDsKKworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworaW50IGx2bV92Z19zZXRfZXh0ZW50X3NpemUodmdfdCB2ZywgdWludDMyX3QgbmV3X3NpemUpCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisKKwlpZiAoIXZnX3JlYWRfZXJyb3IodmcpICYmIHZnX2NoZWNrX3dyaXRlX21vZGUodmcpICYmCisJCXZnX3NldF9leHRlbnRfc2l6ZSh2ZywgbmV3X3NpemUgLyBTRUNUT1JfU0laRSkpCisJCXJjID0gMDsKKworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfbHZtX3ZnX3dyaXRlKHZnX3QgdmcpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWlmICh2Z19yZWFkX2Vycm9yKHZnKSkKKwkJcmV0dXJuIC0xOworCWlmICghdmdfY2hlY2tfd3JpdGVfbW9kZSh2ZykpCisJCXJldHVybiAtMTsKKworCWlmIChkbV9saXN0X2VtcHR5KCZ2Zy0+cHZzKSkgeworCQlpZiAoIXZnX3JlbW92ZSh2ZykpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmICghIGRtX2xpc3RfZW1wdHkoJnZnLT5yZW1vdmVkX3B2cykpIHsKKwkJaWYgKCFsb2NrX3ZvbCh2Zy0+Y21kLCBWR19PUlBIQU5TLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCQlsb2dfZXJyb3IoIkNhbid0IGdldCBsb2NrIGZvciBvcnBoYW4gUFZzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghYXJjaGl2ZSh2ZykpCisJCXJldHVybiAtMTsKKworCS8qIFN0b3JlIFZHIG9uIGRpc2socykgKi8KKwlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCEgZG1fbGlzdF9lbXB0eSgmdmctPnJlbW92ZWRfcHZzKSkgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnJlbW92ZWRfcHZzKSB7CisJCQlwdl93cml0ZV9vcnBoYW4odmctPmNtZCwgcHZsLT5wdik7CisJCQlwdl9zZXRfZmlkKHB2bC0+cHYsIE5VTEwpOworCQkJLyogRklYTUU6IGRvIHB2cmVtb3ZlIC8gbGFiZWxfcmVtb3ZlKCk/ICovCisJCX0KKwkJZG1fbGlzdF9pbml0KCZ2Zy0+cmVtb3ZlZF9wdnMpOworCQl1bmxvY2tfdmcodmctPmNtZCwgTlVMTCwgVkdfT1JQSEFOUyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBsdm1fdmdfd3JpdGUodmdfdCB2ZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBfbHZtX3ZnX3dyaXRlKHZnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsdm1fdmdfY2xvc2UodmdfdCB2ZykKK3sKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlpZiAodmdfcmVhZF9lcnJvcih2ZykgPT0gRkFJTEVEX0xPQ0tJTkcpCisJCXJlbGVhc2VfdmcodmcpOworCWVsc2UKKwkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKHZnLT5jbWQsIHZnLCB2Zy0+bmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsdm1fdmdfcmVtb3ZlKHZnX3QgdmcpCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisKKwlpZiAoIXZnX3JlYWRfZXJyb3IodmcpICYmIHZnX2NoZWNrX3dyaXRlX21vZGUodmcpICYmIHZnX3JlbW92ZV9jaGVjayh2ZykpIHsKKwkJdmdfcmVtb3ZlX3B2cyh2Zyk7CisJCXJjID0gMDsKKwl9CisKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2Z190IF9sdm1fdmdfb3Blbihsdm1fdCBsaWJoLCBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKm1vZGUsCisJCSAgdWludDMyX3QgZmxhZ3MpCit7CisJdWludDMyX3QgaW50ZXJuYWxfZmxhZ3MgPSAwOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCisJaWYgKCFzdHJuY21wKG1vZGUsICJ3IiwgMSkpCisJCWludGVybmFsX2ZsYWdzIHw9IFJFQURfRk9SX1VQREFURTsKKwllbHNlIGlmIChzdHJuY21wKG1vZGUsICJyIiwgMSkpIHsKKwkJbG9nX2Vycm5vKEVJTlZBTCwgIkludmFsaWQgVkcgb3BlbiBtb2RlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXZnID0gdmdfcmVhZCgoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaCwgdmduYW1lLCBOVUxMLCBpbnRlcm5hbF9mbGFncywgMCk7CisJaWYgKHZnX3JlYWRfZXJyb3IodmcpKSB7CisJCS8qIEZJWE1FOiB1c2UgbG9nX2Vycm5vIGVpdGhlciBoZXJlIGluIGluc2lkZSB2Z19yZWFkICovCisJCXJlbGVhc2VfdmcodmcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogRklYTUU6IGNvbWJpbmUgdGhpcyB3aXRoIGxvY2tpbmcgPyAqLworCXZnLT5vcGVuX21vZGUgPSBtb2RlWzBdOworCisJcmV0dXJuICh2Z190KSB2ZzsKK30KKwordmdfdCBsdm1fdmdfb3Blbihsdm1fdCBsaWJoLCBjb25zdCBjaGFyICp2Z25hbWUsIGNvbnN0IGNoYXIgKm1vZGUsCisJCSAgdWludDMyX3QgZmxhZ3MpCit7CisJdmdfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudigoc3RydWN0IGNtZF9jb250ZXh0KilsaWJoKTsKKwlyYyA9IF9sdm1fdmdfb3BlbihsaWJoLCB2Z25hbWUsIG1vZGUsIGZsYWdzKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fbGlzdCAqX2x2bV92Z19saXN0X3B2cyh2Z190IHZnKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCXB2X2xpc3RfdCAqcHZzOworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmdmctPnB2cykpCisJCXJldHVybiBOVUxMOworCisJaWYgKCEobGlzdCA9IGRtX3Bvb2xfemFsbG9jKHZnLT52Z21lbSwgc2l6ZW9mKCpsaXN0KSkpKSB7CisJCWxvZ19lcnJubyhFTk9NRU0sICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsIGZvciBkbV9saXN0LiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZG1fbGlzdF9pbml0KGxpc3QpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKCEocHZzID0gZG1fcG9vbF96YWxsb2ModmctPnZnbWVtLCBzaXplb2YoKnB2cykpKSkgeworCQkJbG9nX2Vycm5vKEVOT01FTSwKKwkJCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbCBmb3IgbHZtX3B2X2xpc3QuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwdnMtPnB2ID0gcHZsLT5wdjsKKwkJZG1fbGlzdF9hZGQobGlzdCwgJnB2cy0+bGlzdCk7CisJfQorCXJldHVybiBsaXN0OworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX3ZnX2xpc3RfcHZzKHZnX3QgdmcpCit7CisJc3RydWN0IGRtX2xpc3QgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gX2x2bV92Z19saXN0X3B2cyh2Zyk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9sdm1fdmdfbGlzdF9sdnModmdfdCB2ZykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbGlzdDsKKwlsdl9saXN0X3QgKmx2czsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJaWYgKGRtX2xpc3RfZW1wdHkoJnZnLT5sdnMpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGxpc3QgPSBkbV9wb29sX3phbGxvYyh2Zy0+dmdtZW0sIHNpemVvZigqbGlzdCkpKSkgeworCQlsb2dfZXJybm8oRU5PTUVNLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbCBmb3IgZG1fbGlzdC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRtX2xpc3RfaW5pdChsaXN0KTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWlmICghKGx2cyA9IGRtX3Bvb2xfemFsbG9jKHZnLT52Z21lbSwgc2l6ZW9mKCpsdnMpKSkpIHsKKwkJCWxvZ19lcnJubyhFTk9NRU0sCisJCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZm9yIGx2bV9sdl9saXN0LiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbHZzLT5sdiA9IGx2bC0+bHY7CisJCWRtX2xpc3RfYWRkKGxpc3QsICZsdnMtPmxpc3QpOworCX0KKwlyZXR1cm4gbGlzdDsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2bV92Z19saXN0X2x2cyh2Z190IHZnKQoreworCXN0cnVjdCBkbV9saXN0ICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IF9sdm1fdmdfbGlzdF9sdnModmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2bV92Z19nZXRfdGFncyhjb25zdCB2Z190IHZnKQoreworCXN0cnVjdCBkbV9saXN0ICpyYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IHRhZ19saXN0X2NvcHkodmctPnZnbWVtLCAmdmctPnRhZ3MpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2dldF9zZXFubyhjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfc2Vxbm8odmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2lzX2NsdXN0ZXJlZChjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfaXNfY2x1c3RlcmVkKHZnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQ2NF90IGx2bV92Z19pc19leHBvcnRlZChjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfaXNfZXhwb3J0ZWQodmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2lzX3BhcnRpYWwoY29uc3QgdmdfdCB2ZykKK3sKKwl1aW50NjRfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9ICh2Z19taXNzaW5nX3B2X2NvdW50KHZnKSAhPSAwKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEZJWE1FOiBpbnZhbGlkIGhhbmRsZT8gcmV0dXJuIElOVE1BWD8gKi8KK3VpbnQ2NF90IGx2bV92Z19nZXRfc2l6ZShjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gU0VDVE9SX1NJWkUgKiB2Z19zaXplKHZnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQ2NF90IGx2bV92Z19nZXRfZnJlZV9zaXplKGNvbnN0IHZnX3QgdmcpCit7CisJdWludDY0X3QgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBTRUNUT1JfU0laRSAqIHZnX2ZyZWUodmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2dldF9leHRlbnRfc2l6ZShjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gU0VDVE9SX1NJWkUgKiB2Z19leHRlbnRfc2l6ZSh2Zyk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCit1aW50NjRfdCBsdm1fdmdfZ2V0X2V4dGVudF9jb3VudChjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfZXh0ZW50X2NvdW50KHZnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQ2NF90IGx2bV92Z19nZXRfZnJlZV9leHRlbnRfY291bnQoY29uc3QgdmdfdCB2ZykKK3sKKwl1aW50NjRfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IHZnX2ZyZWVfY291bnQodmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2dldF9wdl9jb3VudChjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfcHZfY291bnQodmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKwordWludDY0X3QgbHZtX3ZnX2dldF9tYXhfcHYoY29uc3QgdmdfdCB2ZykKK3sKKwl1aW50NjRfdCByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IHZnX21heF9wdih2Zyk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCit1aW50NjRfdCBsdm1fdmdfZ2V0X21heF9sdihjb25zdCB2Z190IHZnKQoreworCXVpbnQ2NF90IHJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfbWF4X2x2KHZnKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IGNoYXIgKmx2bV92Z19nZXRfdXVpZChjb25zdCB2Z190IHZnKQoreworCWNvbnN0IGNoYXIgKnJjOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KHZnLT5jbWQpOworCXJjID0gdmdfdXVpZF9kdXAodmcpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworY29uc3QgY2hhciAqbHZtX3ZnX2dldF9uYW1lKGNvbnN0IHZnX3QgdmcpCit7CisJY29uc3QgY2hhciAqcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisJcmMgPSBkbV9wb29sX3N0cm5kdXAodmctPnZnbWVtLCAoY29uc3QgY2hhciAqKXZnLT5uYW1lLCBOQU1FX0xFTisxKTsKKwlyZXN0b3JlX3VzZXJfZW52KCZlKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSBsdm1fdmdfZ2V0X3Byb3BlcnR5KGNvbnN0IHZnX3QgdmcsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSByYzsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKwlyYyA9IGdldF9wcm9wZXJ0eShOVUxMLCB2ZywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgbmFtZSk7CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbHZtX3ZnX3NldF9wcm9wZXJ0eShjb25zdCB2Z190IHZnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqdmFsdWUpCit7CisJLyogQXQgdGhpcyBwb2ludCBpdCBpcyB1bmtub3duIGlmIGFsbCBwcm9wZXJ0eSBzZXQgcGF0aHMgbWFrZSB0aGUKKwkgKiBhcHByb3ByaWF0ZSBjb3B5IG9mIHRoZSBzdHJpbmcuICBXZSB3aWxsIGFsbG9jYXRlIGEgY29weSBvbiB0aGUgdmcgc28KKwkgKiB0aGF0IHdvcnN0IGNhc2Ugd2UgaGF2ZSB0d28gY29waWVzIHdoaWNoIHdpbGwgZ2V0IGZyZWVkIHdoZW4gdGhlIHZnIGdldHMKKwkgKiByZWxlYXNlZC4KKwkgKi8KKwlpbnQgcmM7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYodmctPmNtZCk7CisKKwlpZiAodmFsdWUtPmlzX3ZhbGlkICYmIHZhbHVlLT5pc19zdHJpbmcgJiYgdmFsdWUtPnZhbHVlLnN0cmluZykgeworCQl2YWx1ZS0+dmFsdWUuc3RyaW5nID0gZG1fcG9vbF9zdHJuZHVwKHZnLT52Z21lbSwgdmFsdWUtPnZhbHVlLnN0cmluZywKKwkJCQlzdHJsZW4odmFsdWUtPnZhbHVlLnN0cmluZykgKyAxKTsKKwl9CisKKwlyYyA9IHNldF9wcm9wZXJ0eShOVUxMLCB2ZywgTlVMTCwgTlVMTCwgTlVMTCwgbmFtZSwgdmFsdWUpOworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworc3RydWN0IGRtX2xpc3QgKmx2bV9saXN0X3ZnX25hbWVzKGx2bV90IGxpYmgpCit7CisJc3RydWN0IGRtX2xpc3QgKnJjID0gTlVMTDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudigoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaCk7CisKKwlpZiAobHZtZXRhZF92Z19saXN0X3RvX2x2bWNhY2hlKChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKSkgeworCQlyYyA9IGdldF92Z25hbWVzKChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoLCAwKTsKKwl9CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgZG1fbGlzdCAqbHZtX2xpc3RfdmdfdXVpZHMobHZtX3QgbGliaCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcmMgPSBOVUxMOworCXN0cnVjdCBzYXZlZF9lbnYgZSA9IHN0b3JlX3VzZXJfZW52KChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKTsKKworCWlmIChsdm1ldGFkX3ZnX2xpc3RfdG9fbHZtY2FjaGUoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpKSB7CisJCXJjID0gZ2V0X3ZnaWRzKChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoLCAwKTsKKwl9CisJcmVzdG9yZV91c2VyX2VudigmZSk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogRklYTUU6IEVsYWJvcmF0ZSBvbiB3aGVuIHRvIHVzZSwgc2lkZS1lZmZlY3RzLCAuY2FjaGUgZmlsZSwgZXRjCisgKi8KK2ludCBsdm1fc2Nhbihsdm1fdCBsaWJoKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNhdmVkX2VudiBlID0gc3RvcmVfdXNlcl9lbnYoKHN0cnVjdCBjbWRfY29udGV4dCAqKWxpYmgpOworCisJbHZtY2FjaGVfZm9yY2VfbmV4dF9sYWJlbF9zY2FuKCk7CisJaWYgKCFsdm1jYWNoZV9sYWJlbF9zY2FuKChzdHJ1Y3QgY21kX2NvbnRleHQgKilsaWJoKSkKKwkJcmMgPSAtMTsKKworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworaW50IGx2bV9sdl9uYW1lX3ZhbGlkYXRlKGNvbnN0IHZnX3QgdmcsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJjID0gLTE7CisJbmFtZV9lcnJvcl90IG5hbWVfZXJyb3I7CisJaW50IGhpc3RvcmljYWw7CisKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2Vudih2Zy0+Y21kKTsKKworCW5hbWVfZXJyb3IgPSB2YWxpZGF0ZV9uYW1lX2RldGFpbGVkKG5hbWUpOworCisJaWYgKE5BTUVfVkFMSUQgPT0gbmFtZV9lcnJvcikgeworCQlpZiAoYXBwbHlfbHZuYW1lX3Jlc3RyaWN0aW9ucyhuYW1lKSkgeworCQkJaWYgKCFsdl9uYW1lX2lzX3VzZWRfaW5fdmcodmcsIG5hbWUsICZoaXN0b3JpY2FsKSkgeworCQkJCXJjID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJbG9nX2Vycm5vKEVJTlZBTCwgIiVzTFYgbmFtZSBleGlzdHMgaW4gVkciLAorCQkJCQkgIGhpc3RvcmljYWwgPyAiaGlzdG9yaWNhbCAiIDogIiIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZGlzcGxheV9uYW1lX2Vycm9yKG5hbWVfZXJyb3IpOworCX0KKworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KKworaW50IGx2bV92Z19uYW1lX3ZhbGlkYXRlKGx2bV90IGxpYmgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopbGliaDsKKwlzdHJ1Y3Qgc2F2ZWRfZW52IGUgPSBzdG9yZV91c2VyX2VudihjbWQpOworCisJaWYgKHZhbGlkYXRlX25ld192Z19uYW1lKGNtZCwgbmFtZSkpCisJCXJjID0gMDsKKworCXJlc3RvcmVfdXNlcl9lbnYoJmUpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL21ha2UudG1wbC5pbiBiL21ha2UudG1wbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE4Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZS50bXBsLmluCkBAIC0wLDAgKzEsNTM2IEBACisjIEBjb25maWd1cmVfaW5wdXRACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTSEVMTCA9IC9iaW4vc2gKKworQFNFVF9NQUtFQAorCisjIEFsbG93IGVudmlyb25tZW50IHRvIG92ZXJyaWRlIGFueSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlIGZvciBDQy4KKyMgSWYgdGhlcmUgaXMgYSBidWlsdC1pbiBkZWZhdWx0LCBDQyBpcyBOT1Qgc2V0IHRvIEBDQ0AgaGVyZS4KK0NDID89IEBDQ0AKKworIyBJZiAkKENDKSBob2xkcyB0aGUgdXN1YWwgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZSBvZiAnY2MnIHRoZW4gcmVwbGFjZSBpdCB3aXRoCisjIHRoZSBjb25maWd1cmVkIHZhbHVlLgorIyAoVG8gYXZvaWQgdGhpcyBhbmQgZm9yY2UgdGhlIHVzZSBvZiAnY2MnIGZyb20gdGhlIGVudmlyb25tZW50LCBzdXBwbHkgaXRzCisjIGZ1bGwgcGF0aC4pCitpZmVxICgkKENDKSwgY2MpCisgIENDID0gQENDQAorZW5kaWYKKworUkFOTElCID0gQFJBTkxJQkAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK01LRElSX1AgPSBATUtESVJfUEAKK01TR0ZNVCA9IEBNU0dGTVRACitMQ09WID0gQExDT1ZACitHRU5IVE1MID0gQEdFTkhUTUxACitMTl9TID0gQExOX1NACitTRUQgPSBAU0VEQAorQ0ZMT1dfQ01EID0gQENGTE9XX0NNREAKK0FXSyA9IEBBV0tACitDSE1PRCA9IEBDSE1PREAKK1BZVEhPTjIgPSBAUFlUSE9OMkAKK1BZVEhPTjMgPSBAUFlUSE9OM0AKK1BZQ09NUElMRSA9ICQodG9wX3NyY2RpcikvYXV0b2NvbmYvcHktY29tcGlsZQorCitMSUJTID0gQExJQlNACisjIEV4dHJhIGxpYnJhcmllcyBhbHdheXMgbGlua2VkIHdpdGggc3RhdGljIGJpbmFyaWVzCitTVEFUSUNfTElCUyA9ICQoU0VMSU5VWF9MSUJTKSAkKFVERVZfTElCUykgJChCTEtJRF9MSUJTKQorREVGUyArPSBAREVGU0AKKyMgRklYTUUgc2V0IHRoaXMgb25seSB3aGVyZSBpdCdzIG5lZWRlZCwgbm90IGdsb2JhbGx5PworQ0ZMQUdTID89IEBDT1BUSU1JU0VfRkxBR0AgQENGTEFHU0AKK0xERkxBR1MgPz0gQENPUFRJTUlTRV9GTEFHQCBATERGTEFHU0AKK0NMREZMQUdTICs9IEBDTERGTEFHU0AKK0VMREZMQUdTICs9IEBFTERGTEFHU0AKK0xEREVQUyArPSBATERERVBTQAorTElCX1NVRkZJWCA9IEBMSUJfU1VGRklYQAorTFZNSU5URVJOQUxfTElCUyA9IC1sbHZtLWludGVybmFsICQoREFFTU9OX0xJQlMpICQoVURFVl9MSUJTKSAkKERMX0xJQlMpICQoQkxLSURfTElCUykKK0RMX0xJQlMgPSBARExfTElCU0AKK01fTElCUyA9IEBNX0xJQlNACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkVBRExJTkVfTElCUyA9IEBSRUFETElORV9MSUJTQAorU0VMSU5VWF9MSUJTID0gQFNFTElOVVhfTElCU0AKK1VERVZfQ0ZMQUdTID0gQFVERVZfQ0ZMQUdTQAorVURFVl9MSUJTID0gQFVERVZfTElCU0AKK0JMS0lEX0NGTEFHUyA9IEBCTEtJRF9DRkxBR1NACitCTEtJRF9MSUJTID0gQEJMS0lEX0xJQlNACitWQUxHUklORF9DRkxBR1MgPSBAVkFMR1JJTkRfQ0ZMQUdTQAorVEVTVElORyA9IEBURVNUSU5HQAorCisjIFNldHVwIGRpcmVjdG9yeSB2YXJpYWJsZXMKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK3VkZXZfcHJlZml4ID0gQHVkZXZfcHJlZml4QAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorcm9vdGRpciA9ICQoREVTVERJUikvCitiaW5kaXIgPSAkKERFU1RESVIpQGJpbmRpckAKK2NvbmZkaXIgPSAkKERFU1RESVIpQENPTkZESVJAL2x2bQoraW5jbHVkZWRpciA9ICQoREVTVERJUilAaW5jbHVkZWRpckAKK2xpYmRpciA9ICQoREVTVERJUilAbGliZGlyQAorbGliZXhlY2RpciA9ICQoREVTVERJUilAbGliZXhlY2RpckAKK3VzcmxpYmRpciA9ICQoREVTVERJUilAdXNybGliZGlyQAorc2JpbmRpciA9ICQoREVTVERJUilAc2JpbmRpckAKK3VzcnNiaW5kaXIgPSAkKERFU1RESVIpQHVzcnNiaW5kaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RhdGFkaXIgPSAkKERFU1RESVIpQGRhdGFkaXJACitpbmZvZGlyID0gJChERVNURElSKUBpbmZvZGlyQAorbWFuZGlyID0gJChERVNURElSKUBtYW5kaXJACitsb2NhbGVkaXIgPSAkKERFU1RESVIpQGxvY2FsZWRpckAKK3N0YXRpY2RpciA9ICQoREVTVERJUilAU1RBVElDRElSQAordWRldmRpciA9ICQoREVTVERJUilAdWRldmRpckAKK3BrZ2NvbmZpZ2RpciA9ICQodXNybGliZGlyKS9wa2djb25maWcKK2luaXRkaXIgPSAkKERFU1RESVIpJChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorZGJ1c2NvbmZkaXIgPSAkKERFU1RESVIpJChzeXNjb25mZGlyKS9kYnVzLTEvc3lzdGVtLmQKK2RidXNzZXJ2aWNlZGlyID0gJChkYXRhZGlyKS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitzeXN0ZW1kX3VuaXRfZGlyID0gJChERVNURElSKUBzeXN0ZW1kc3lzdGVtdW5pdGRpckAKK3N5c3RlbWRfZ2VuZXJhdG9yX2RpciA9ICQoREVTVERJUikkKFNZU1RFTURfR0VORVJBVE9SX0RJUikKK3N5c3RlbWRfZGlyID0gJChERVNURElSKUBzeXN0ZW1kdXRpbGRpckAKK3RtcGZpbGVzX2RpciA9ICQoREVTVERJUilAdG1wZmlsZXNkaXJACitvY2Zfc2NyaXB0ZGlyID0gJChERVNURElSKUBPQ0ZESVJACitweXRob25wcmVmaXggPSAkKERFU1RESVIpJChwcmVmaXgpCisKKyMgTi5CLiBObyAkKERFU1RESVIpIHByZWZpeCBoZXJlLgorcHl0aG9uMmRpciA9IEBQWVRIT04yRElSQAorcHl0aG9uM2RpciA9IEBQWVRIT04zRElSQAorCitVU1JMSUJfUkVMUEFUSCA9ICQoc2hlbGwgZWNobyAkKGFic3BhdGggJCh1c3JsaWJkaXIpICQobGliZGlyKSkgfCBcCisgICQoQVdLKSAtZiAkKHRvcF9zcmNkaXIpL3NjcmlwdHMvcmVscGF0aC5hd2spCisKK1NZU1RFTURfR0VORVJBVE9SX0RJUiA9IEBzeXN0ZW1kdXRpbGRpckAvc3lzdGVtLWdlbmVyYXRvcnMKK0RFRkFVTFRfU1lTX0RJUiA9IEBERUZBVUxUX1NZU19ESVJACitERUZBVUxUX0FSQ0hJVkVfRElSID0gJChERUZBVUxUX1NZU19ESVIpL0BERUZBVUxUX0FSQ0hJVkVfU1VCRElSQAorREVGQVVMVF9CQUNLVVBfRElSID0gJChERUZBVUxUX1NZU19ESVIpL0BERUZBVUxUX0JBQ0tVUF9TVUJESVJACitERUZBVUxUX0NBQ0hFX0RJUiA9ICQoREVGQVVMVF9TWVNfRElSKS9AREVGQVVMVF9DQUNIRV9TVUJESVJACitERUZBVUxUX1BST0ZJTEVfRElSID0gJChERUZBVUxUX1NZU19ESVIpL0BERUZBVUxUX1BST0ZJTEVfU1VCRElSQAorREVGQVVMVF9MT0NLX0RJUiA9IEBERUZBVUxUX0xPQ0tfRElSQAorREVGQVVMVF9SVU5fRElSID0gQERFRkFVTFRfUlVOX0RJUkAKK0RFRkFVTFRfTUFOR0xJTkcgPSBATUFOR0xJTkdACisKKyMgU2V0dXAgdnBhdGggc2VhcmNoIHBhdGhzIGZvciBzb21lIHN1ZmZpeGVzCit2cGF0aCAlLmMgJChzcmNkaXIpCit2cGF0aCAlLmNwcCAkKHNyY2RpcikKK3ZwYXRoICUuaW4gJChzcmNkaXIpCit2cGF0aCAlLnBvICQoc3JjZGlyKQordnBhdGggJS5leHBvcnRlZF9zeW1ib2xzICQoc3JjZGlyKQorCitpbnRlcmZhY2UgPSBAaW50ZXJmYWNlQAoraW50ZXJmYWNlYnVpbGRkaXIgPSAkKHRvcF9idWlsZGRpcikvbGliZG0vJChpbnRlcmZhY2UpCitycG1idWlsZGRpciA9ICQoYWJzX3RvcF9idWlsZGRpcikvYnVpbGQKKworIyBUaGUgbnVtYmVyIG9mIGpvYnMgdG8gcnVuLCBpZiBibGFuaywgZGVmYXVsdHMgdG8gdGhlIG1ha2Ugc3RhbmRhcmQKK2lmbmRlZiBNQUtFRkxBR1MKK01BS0VGTEFHUyA9IEBKT0JTQAorZW5kaWYKKworIyBIYW5kbGUgaW5zdGFsbGF0aW9uIG9mIGZpbGVzCitpZmVxICgiQFdSSVRFX0lOU1RBTExAIiwgInllcyIpCisjIGxlYXZpbmcgZGVmYXVsdHMKK01fSU5TVEFMTF9TQ1JJUFQgPQorTV9JTlNUQUxMX0RBVEEgPSAtbSA2NDQKK2Vsc2UKK01fSU5TVEFMTF9QUk9HUkFNID0gLW0gNTU1CitNX0lOU1RBTExfREFUQSA9IC1tIDQ0NAorZW5kaWYKK0lOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgJChNX0lOU1RBTExfUFJPR1JBTSkgJChTVFJJUCkKK0lOU1RBTExfREFUQSA9ICQoSU5TVEFMTCkgLXAgJChNX0lOU1RBTExfREFUQSkKK0lOU1RBTExfV0RBVEEgPSAkKElOU1RBTEwpIC1wIC1tIDY0NAorCitJTlNUQUxMX0RJUiA9ICQoSU5TVEFMTCkgLW0gNzU1IC1kCitJTlNUQUxMX1JPT1RfRElSID0gJChJTlNUQUxMKSAtbSA3MDAgLWQKK0lOU1RBTExfUk9PVF9EQVRBID0gJChJTlNUQUxMKSAtbSA2MDAKK0lOU1RBTExfU0NSSVBUID0gJChJTlNUQUxMKSAtcCAkKE1fSU5TVEFMTF9QUk9HUkFNKQorCisuU1VGRklYRVM6IC5jIC5jcHAgLmQgLm8gLnNvIC5hIC5wbyAucG90IC5tbyAuZHlsaWIKKworV0ZMQUdTICs9XAorIC1XYWxsXAorIC1XY2FzdC1hbGlnblwKKyAtV2Zsb2F0LWVxdWFsXAorIC1XZm9ybWF0LXNlY3VyaXR5XAorIC1XaW5saW5lXAorIC1XbWlzc2luZy1mb3JtYXQtYXR0cmlidXRlXAorIC1XbWlzc2luZy1pbmNsdWRlLWRpcnNcCisgLVdtaXNzaW5nLW5vcmV0dXJuXAorIC1XcG9pbnRlci1hcml0aFwKKyAtV3JlZHVuZGFudC1kZWNsc1wKKyAtV3NoYWRvd1wKKyAtV3VuZGVmXAorIC1Xd3JpdGUtc3RyaW5ncworCitXQ0ZMQUdTICs9XAorIC1XbWlzc2luZy1kZWNsYXJhdGlvbnNcCisgLVdtaXNzaW5nLXByb3RvdHlwZXNcCisgLVduZXN0ZWQtZXh0ZXJuc1wKKyAtV29sZC1zdHlsZS1kZWZpbml0aW9uXAorIC1Xc3RyaWN0LXByb3RvdHlwZXNcCisgLVd1bmluaXRpYWxpemVkCisKK2lmZXEgKCJASEFWRV9XSlVNUEAiLCAieWVzIikKK1dDRkxBR1MgKz0gLVdqdW1wLW1pc3Nlcy1pbml0CitlbmRpZgorCitpZmVxICgiQEhBVkVfV0NMT0JCRVJFREAiLCAieWVzIikKK1dGTEFHUyArPVwKKyAtV2Nsb2JiZXJlZFwKKyAtV2VtcHR5LWJvZHlcCisgLVdpZ25vcmVkLXF1YWxpZmllcnNcCisgLVdsb2dpY2FsLW9wXAorIC1XdHlwZS1saW1pdHMKKworV0NGTEFHUyArPVwKKyAtV21pc3NpbmctcGFyYW1ldGVyLXR5cGVcCisgLVdvbGQtc3R5bGUtZGVjbGFyYXRpb25cCisgLVdvdmVycmlkZS1pbml0CitlbmRpZgorCitpZmVxICgiQEhBVkVfV1NZTkNOQU5EQCIsICJ5ZXMiKQorV0ZMQUdTICs9IC1Xc3luYy1uYW5kCitlbmRpZgorCitpZm5lcSAoIkBTVEFUSUNfTElOS0AiLCAieWVzIikKK2lmZXEgKCJASEFWRV9QSUVAIiwgInllcyIpCitpZmVxICgiQEhBVkVfRlVMTF9SRUxST0AiLCAieWVzIikKKyAgRVhUUkFfRVhFQ19DRkxBR1MgKz0gLWZQSUUKKyAgRVhUUkFfRVhFQ19MREZMQUdTICs9IC1XbCwteixyZWxybywteixub3cgLXBpZSAtZlBJRQorICBDTERGTEFHUyArPSAtV2wsLXoscmVscm8KK2VuZGlmCitlbmRpZgorZW5kaWYKKworI1dGTEFHUyArPSAtVyAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycworI1dGTEFHUyArPSAtV3NpZ24tY29tcGFyZSAtV3VudXNlZC1wYXJhbWV0ZXIgLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycworI1dGTEFHUyArPSAtV2NvbnZlcnNpb24gLVdiYWQtZnVuY3Rpb24tY2FzdCAtV2Nhc3QtcXVhbCAtV2FnZ3JlZ2F0ZS1yZXR1cm4gLVdwYWNrZWQKKyNXRkxBR1MgKz0gLXBlZGFudGljIC1zdGQ9Z251OTkKKyNERUZTICs9IC1EREVCVUdfQ1JDMzIKKworIworIyBBdm9pZCByZWN1cnNpdmUgZXh0ZW5zaW9uIG9mIENGTEFHUworIyBieSBjaGVja2luZyB3aGV0aGVyIENGTEFHUyBhbHJlYWR5IGhhcyBmUElDIHN0cmluZworIworaWZlcSAoLCQoZmluZHN0cmluZyBmUElDLCQoQ0ZMQUdTKSkpCisKK0NGTEFHUyArPSAtZlBJQworCitpZmVxICgiQERFQlVHQCIsICJ5ZXMiKQorICBDRkxBR1MgKz0gLWcgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyAgREVGUyArPSAtRERFQlVHCisgICMgbWVtb3J5IGRlYnVnZ2luZyBpcyBub3QgdGhyZWFkLXNhZmUgeWV0CisgIGlmbmVxICgiQERNRVZFTlREQCIsICJ5ZXMiKQorICAgIERFRlMgKz0gLURERUJVR19NRU0KKyAgZW5kaWYKK2VuZGlmCisKKyMgZW5kIG9mIGZQSUMgcHJvdGVjdGlvbgorZW5kaWYKKworTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9saWJkbSAtTCQodG9wX2J1aWxkZGlyKS9saWIKK0NMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmRtIC1MJCh0b3BfYnVpbGRkaXIpL2xpYgorCitEQUVNT05fTElCUyA9IC1sZGFlbW9uY2xpZW50CitMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9jbGllbnQKK0NMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9jbGllbnQKKworaWZlcSAoIkBETUVWRU5UREAiLCAieWVzIikKKyAgTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9kYWVtb25zL2RtZXZlbnRkCisgIENMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQKK2VuZGlmCisKKyMgQ29tYmluYXRpb24gb2YgREVCVUdfUE9PTCBhbmQgREVCVUdfRU5GT1JDRV9QT09MX0xPQ0tJTkcgaXMgbm90IHN1cHBvcmVkLgorI0RFRlMgKz0gLURERUJVR19QT09MCisjIERlZmF1bHQgcG9vbCBsb2NraW5nIGlzIHVzaW5nIHRoZSBjcmMgY2hlY2tzdW0uIFdpdGggbXByb3RlY3QgbWVtb3J5CisjIGVuZm9yY2luZyBjb21waWxhdGlvbiBmYXVsdHkgbWVtb3J5IHdyaXRlIGNvdWxkIGJlIGVhc2lseSBmb3VuZC4KKyNERUZTICs9IC1EREVCVUdfRU5GT1JDRV9QT09MX0xPQ0tJTkcKKyNERUZTICs9IC1EQk9VTkRTX0NIRUNLCisKKyMgTFZNIGlzIG5vdCBzdXBwb3NlZCB0byB1c2UgbW1hcCB3aGlsZSBkZXZpY2VzIGFyZSBzdXNwZW5kZWQuCisjIFRoaXMgY29kZSBjYXVzZXMgYSBjb3JlIGR1bXAgaWYgZ2V0cyBjYWxsZWQuCisjREVGUyArPSAtRERFQlVHX01FTUxPQ0sKKworI0NGTEFHUyArPSAtcGcKKyNMREZMQUdTICs9IC1wZworCitTVFJJUD0KKyNTVFJJUCA9IC1zCisKK0xWTV9WRVJTSU9OIDo9ICQoc2hlbGwgY2F0ICQodG9wX3NyY2RpcikvVkVSU0lPTikKKworTElCX1ZFUlNJT05fTFZNIDo9ICQoc2hlbGwgJChBV0spIC1GICcuJyAne3ByaW50ZiAiJXMuJXMiLCQkMSwkJDJ9JyAkKHRvcF9zcmNkaXIpL1ZFUlNJT04pCisKK0xJQl9WRVJTSU9OX0RNIDo9ICQoc2hlbGwgJChBV0spIC1GICcuJyAne3ByaW50ZiAiJXMuJXMiLCQkMSwkJDJ9JyAkKHRvcF9zcmNkaXIpL1ZFUlNJT05fRE0pCisKK0xJQl9WRVJTSU9OX0FQUCA6PSAkKHNoZWxsICQoQVdLKSAtRiAnWygpLiBdJyAne3ByaW50ZiAiJXMuJXMiLCQkMSwkJDR9JyAkKHRvcF9zcmNkaXIpL1ZFUlNJT04pCisKK0lOQ0xVREVTICs9IC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUKKworSU5DX0xOUyA9ICQodG9wX2J1aWxkZGlyKS9pbmNsdWRlLy5zeW1saW5rc19jcmVhdGVkCisKK0RFUFMgPSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsICQodG9wX3NyY2RpcikvVkVSU0lPTiBcCisgICAgICAgJCh0b3BfYnVpbGRkaXIpL01ha2VmaWxlICQoSU5DX0xOUykKKworT0JKRUNUUyA9ICQoU09VUkNFUzolLmM9JS5vKSAkKENYWFNPVVJDRVM6JS5jcHA9JS5vKQorUE9URklMRVMgPSAkKFNPVVJDRVM6JS5jPSUucG90KQorCisuUEhPTlk6IGFsbCBwb2ZpbGUgZGlzdGNsZWFuIGNsZWFuIGNsZWFuZGlyIGNmbG93IGRldmljZS1tYXBwZXIKKy5QSE9OWTogaW5zdGFsbCBpbnN0YWxsX2NsdXN0ZXIgaW5zdGFsbF9kZXZpY2UtbWFwcGVyIGluc3RhbGxfbHZtMgorLlBIT05ZOiBpbnN0YWxsX2RidXNfc2VydmljZQorLlBIT05ZOiBpbnN0YWxsX2xpYl9zaGFyZWQgaW5zdGFsbF9kbV9wbHVnaW4gaW5zdGFsbF9sdm0yX3BsdWdpbgorLlBIT05ZOiBpbnN0YWxsX29jZiBpbnN0YWxsX3N5c3RlbWRfZ2VuZXJhdG9ycyBpbnN0YWxsX2FsbF9tYW4gYWxsX21hbiBtYW4gaGVscAorLlBIT05ZOiBweXRob25fYmluZGluZ3MgaW5zdGFsbF9weXRob25fYmluZGluZ3MKKy5QSE9OWTogJChTVUJESVJTKSAkKFNVQkRJUlMuaW5zdGFsbCkgJChTVUJESVJTLmNsZWFuKSAkKFNVQkRJUlMuZGlzdGNsZWFuKQorLlBIT05ZOiAkKFNVQkRJUlMucG9maWxlKSAkKFNVQkRJUlMuaW5zdGFsbF9jbHVzdGVyKSAkKFNVQkRJUlMuY2Zsb3cpCisuUEhPTlk6ICQoU1VCRElSUy5kZXZpY2UtbWFwcGVyKSAkKFNVQkRJUlMuaW5zdGFsbC1kZXZpY2UtbWFwcGVyKQorLlBIT05ZOiAkKFNVQkRJUlMuZ2VuZXJhdGUpIGdlbmVyYXRlCisKK1NVQkRJUlMuZGV2aWNlLW1hcHBlciA6PSAkKFNVQkRJUlM6PS5kZXZpY2UtbWFwcGVyKQorU1VCRElSUy5pbnN0YWxsIDo9ICQoU1VCRElSUzo9Lmluc3RhbGwpCitTVUJESVJTLmluc3RhbGxfY2x1c3RlciA6PSAkKFNVQkRJUlM6PS5pbnN0YWxsX2NsdXN0ZXIpCitTVUJESVJTLmluc3RhbGxfZGV2aWNlLW1hcHBlciA6PSAkKFNVQkRJUlM6PS5pbnN0YWxsX2RldmljZS1tYXBwZXIpCitTVUJESVJTLmluc3RhbGxfbHZtMiA6PSAkKFNVQkRJUlM6PS5pbnN0YWxsX2x2bTIpCitTVUJESVJTLmluc3RhbGxfb2NmIDo9ICQoU1VCRElSUzo9Lmluc3RhbGxfb2NmKQorU1VCRElSUy5wb2ZpbGUgOj0gJChTVUJESVJTOj0ucG9maWxlKQorU1VCRElSUy5jZmxvdyA6PSAkKFNVQkRJUlM6PS5jZmxvdykKK1NVQkRJUlMuY2xlYW4gOj0gJChTVUJESVJTOj0uY2xlYW4pCitTVUJESVJTLmRpc3RjbGVhbiA6PSAkKFNVQkRJUlM6PS5kaXN0Y2xlYW4pCisKK1RBUkdFVFMgKz0gJChMSUJfU0hBUkVEKSAkKExJQl9TVEFUSUMpCisKK2FsbDogJChTVUJESVJTKSAkKFRBUkdFVFMpCisKK2luc3RhbGw6IGFsbCAkKFNVQkRJUlMuaW5zdGFsbCkKK2luc3RhbGxfY2x1c3RlcjogYWxsICQoU1VCRElSUy5pbnN0YWxsX2NsdXN0ZXIpCitpbnN0YWxsX2RldmljZS1tYXBwZXI6ICQoU1VCRElSUy5pbnN0YWxsX2RldmljZS1tYXBwZXIpCitpbnN0YWxsX2x2bTI6ICQoU1VCRElSUy5pbnN0YWxsX2x2bTIpCitpbnN0YWxsX29jZjogJChTVUJESVJTLmluc3RhbGxfb2NmKQorY2Zsb3c6ICQoU1VCRElSUy5jZmxvdykKKworJChTVUJESVJTKTogJChTVUJESVJTLmRldmljZS1tYXBwZXIpCisJJChNQUtFKSAtQyAkQAorCiskKFNVQkRJUlMuZGV2aWNlLW1hcHBlcik6CisJJChNQUtFKSAtQyAkKEA6LmRldmljZS1tYXBwZXI9KSBkZXZpY2UtbWFwcGVyCisKKyQoU1VCRElSUy5pbnN0YWxsKTogJChTVUJESVJTKQorCSQoTUFLRSkgLUMgJChAOi5pbnN0YWxsPSkgaW5zdGFsbAorCiskKFNVQkRJUlMuaW5zdGFsbF9jbHVzdGVyKTogJChTVUJESVJTKQorCSQoTUFLRSkgLUMgJChAOi5pbnN0YWxsX2NsdXN0ZXI9KSBpbnN0YWxsX2NsdXN0ZXIKKworJChTVUJESVJTLmluc3RhbGxfZGV2aWNlLW1hcHBlcik6IGRldmljZS1tYXBwZXIKKwkkKE1BS0UpIC1DICQoQDouaW5zdGFsbF9kZXZpY2UtbWFwcGVyPSkgaW5zdGFsbF9kZXZpY2UtbWFwcGVyCisKKyQoU1VCRElSUy5pbnN0YWxsX2x2bTIpOiAkKFNVQkRJUlMpCisJJChNQUtFKSAtQyAkKEA6Lmluc3RhbGxfbHZtMj0pIGluc3RhbGxfbHZtMgorCiskKFNVQkRJUlMuaW5zdGFsbF9vY2YpOgorCSQoTUFLRSkgLUMgJChAOi5pbnN0YWxsX29jZj0pIGluc3RhbGxfb2NmCisKKyQoU1VCRElSUy5jbGVhbik6CisJLSQoTUFLRSkgLUMgJChAOi5jbGVhbj0pIGNsZWFuCisKKyQoU1VCRElSUy5kaXN0Y2xlYW4pOgorCS0kKE1BS0UpIC1DICQoQDouZGlzdGNsZWFuPSkgZGlzdGNsZWFuCisKKyQoU1VCRElSUy5jZmxvdyk6CisJJChNQUtFKSAtQyAkKEA6LmNmbG93PSkgY2Zsb3cKKworaWZlcSAoIkBJTlRMQCIsICJ5ZXMiKQorcG9maWxlOiAkKFNVQkRJUlMucG9maWxlKSAkKFBPVEZJTEVTKQorCiskKFNVQkRJUlMucG9maWxlKToKKwkkKE1BS0UpIC1DICQoQDoucG9maWxlPSkgcG9maWxlCitlbmRpZgorCiskKFNVQkRJUlMuZ2VuZXJhdGUpOgorCSQoTUFLRSkgLUMgJChAOi5nZW5lcmF0ZT0pIGdlbmVyYXRlCisKK2lmbmVxICgiJChDRkxPV19MSVNUX1RBUkdFVCkiLCAiIikKK0NMRUFOX0NGTE9XICs9ICQoQ0ZMT1dfTElTVF9UQVJHRVQpCiskKENGTE9XX0xJU1RfVEFSR0VUKTogJChDRkxPV19MSVNUKQorCWVjaG8gIkNGTE9XX1NPVVJDRVMgKz0gJChhZGRwcmVmaXggXAorCQlcJCQodG9wX3NyY2RpcikkKHN1YnN0ICQodG9wX3NyY2RpciksLCQoc3JjZGlyKSkvLCAkKENGTE9XX0xJU1QpKSIgPiAkQAorY2Zsb3c6ICQoQ0ZMT1dfTElTVF9UQVJHRVQpCitlbmRpZgorCitpZm5lcSAoIiQoQ0ZMT1dfVEFSR0VUKSIsICIiKQorQ0xFQU5fQ0ZMT1cgKz0gXAorCSQoQ0ZMT1dfVEFSR0VUKS5jZmxvdyBcCisJJChDRkxPV19UQVJHRVQpLnhyZWYgXAorCSQoQ0ZMT1dfVEFSR0VUKS50cmVlIFwKKwkkKENGTE9XX1RBUkdFVCkucnRyZWUgXAorCSQoQ0ZMT1dfVEFSR0VUKS5yeHJlZgorCitpZm5lcSAoIiQoQ0ZMT1dfQ01EKSIsICIiKQorQ0ZMT1dfRkxBR1MgKz1cCisgLS1jcHA9IiQoQ0MpIC1FIiBcCisgLS1zeW1ib2wgX0lTYml0OndyYXBwZXIgXAorIC0tc3ltYm9sIF9fYXR0cmlidXRlX186d3JhcHBlciBcCisgLS1zeW1ib2wgX19jb25zdF9fOndyYXBwZXIgXAorIC0tc3ltYm9sIF9fY29uc3Q6dHlwZSBcCisgLS1zeW1ib2wgX19yZXN0cmljdDp0eXBlIFwKKyAtLXN5bWJvbCBfX2V4dGVuc2lvbl9fOndyYXBwZXIgXAorIC0tc3ltYm9sIF9fbm9ubnVsbDp3cmFwcGVyIFwKKyAtLXN5bWJvbCBfX25vdGhyb3dfXzp3cmFwcGVyIFwKKyAtLXN5bWJvbCBfX3B1cmVfXzp3cmFwcGVyIFwKKyAtLXN5bWJvbCBfX1JFRElSRUNUOndyYXBwZXIgXAorIC0tc3ltYm9sIF9fUkVESVJFQ1RfTlRIOndyYXBwZXIgXAorIC0tc3ltYm9sIF9fd3VyOndyYXBwZXIgXAorIC1JJCh0b3Bfc3JjZGlyKS9saWJkbSBcCisgLUkkKHRvcF9zcmNkaXIpL2xpYmRtL2lvY3RsIFwKKyAtSSQodG9wX3NyY2RpcikvZGFlbW9ucy9kbWV2ZW50ZC9wbHVnaW5zL2x2bTIvIFwKKyAkKElOQ0xVREVTKSAkKERFRlMpCisKKyQoQ0ZMT1dfVEFSR0VUKS5jZmxvdzogJChDRkxPV19TT1VSQ0VTKQorCSQoQ0ZMT1dfQ01EKSAtbyRAICQoQ0ZMT1dfRkxBR1MpICQoQ0ZMT1dfU09VUkNFUykKKyQoQ0ZMT1dfVEFSR0VUKS5yeHJlZjogJChDRkxPV19TT1VSQ0VTKQorCSQoQ0ZMT1dfQ01EKSAtbyRAICQoQ0ZMT1dfRkxBR1MpIC1yIC0tb21pdC1hcmd1bWVudHMgJChDRkxPV19TT1VSQ0VTKQorJChDRkxPV19UQVJHRVQpLnRyZWU6ICQoQ0ZMT1dfU09VUkNFUykKKwkkKENGTE9XX0NNRCkgLW8kQCAkKENGTE9XX0ZMQUdTKSAtLW9taXQtYXJndW1lbnRzIC1UIC1iICQoQ0ZMT1dfU09VUkNFUykKKyQoQ0ZMT1dfVEFSR0VUKS54cmVmOiAkKENGTE9XX1NPVVJDRVMpCisJJChDRkxPV19DTUQpIC1vJEAgJChDRkxPV19GTEFHUykgLS1vbWl0LWFyZ3VtZW50cyAteCAkKENGTE9XX1NPVVJDRVMpCisjJChDRkxPV19UQVJHRVQpLnJ0cmVlOiAgJChDRkxPV19TT1VSQ0VTKQorIwkkKENGTE9XX0NNRCkgLW8kQCAkKENGTE9XX0ZMQUdTKSAtciAtLW9taXQtYXJndW1lbnRzIC1UIC1iICQoQ0ZMT1dfU09VUkNFUykKK2NmbG93OiAkKENGTE9XX1RBUkdFVCkuY2Zsb3cgJChDRkxPV19UQVJHRVQpLnRyZWUgJChDRkxPV19UQVJHRVQpLnJ4cmVmICQoQ0ZMT1dfVEFSR0VUKS54cmVmCisjJChDRkxPV19UQVJHRVQpLnJ0cmVlCitlbmRpZgorZW5kaWYKKworJS5vOiAlLmMKKwkkKENDKSAtYyAkKElOQ0xVREVTKSAkKERFRlMpICQoV0ZMQUdTKSAkKFdDRkxBR1MpICQoQ0ZMQUdTKSAkKENGTEFHU18kQCkgJDwgLW8gJEAKKworJS5vOiAlLmNwcAorCSQoQ1hYKSAtYyAkKElOQ0xVREVTKSAkKERFRlMpICQoV0ZMQUdTKSAkKENYWEZMQUdTKSAkKENYWEZMQUdTXyRAKSAkPCAtbyAkQAorCislLnBvdDogJS5jIE1ha2VmaWxlCisJJChDQykgLUUgJChJTkNMVURFUykgJChCTEtJRF9DRkxBR1MpICQoVkFMR1JJTkRfQ0ZMQUdTKSAkKFVERVZfQ0ZMQUdTKSAtaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaW5jbHVkZS9wb2dlbi5oIFwKKwkJJChERUZTKSAkKFdGTEFHUykgJChDRkxBR1MpICQ8ID4gJEAKKworJS5zbzogJS5vCisJJChDQykgLWMgJChDRkxBR1MpICQoQ0xERkxBR1MpICQ8ICQoTElCUykgLW8gJEAKKworaWZuZXEgKCwkKExJQl9TSEFSRUQpKQorCitUQVJHRVRTICs9ICQoTElCX1NIQVJFRCkuJChMSUJfVkVSU0lPTikKKyQoTElCX1NIQVJFRCkuJChMSUJfVkVSU0lPTik6ICQoT0JKRUNUUykgJChMRERFUFMpCitpZmVxICgiQExJQl9TVUZGSVhAIiwic28iKQorCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChub3RkaXIgJEApIFwKKwkJJChDRkxBR1MpICQoQ0xERkxBR1MpICQoT0JKRUNUUykgJChMSUJTKSAtbyAkQAorZW5kaWYKK2lmZXEgKCJATElCX1NVRkZJWEAiLCJkeWxpYiIpCisJJChDQykgLWR5bmFtaWNsaWIgLWR5bGliX2N1cnJlbnRfdmVyc2lvbiwkKExJQl9WRVJTSU9OKSBcCisJCSQoQ0ZMQUdTKSAkKENMREZMQUdTKSAkKE9CSkVDVFMpICQoTElCUykgLW8gJEAKK2VuZGlmCisKKyQoTElCX1NIQVJFRCk6ICQoTElCX1NIQVJFRCkuJChMSUJfVkVSU0lPTikKKwkkKExOX1MpIC1mICQoPEYpICRACisKK0NMRUFOX1RBUkdFVFMgKz0gJChMRERFUFMpIC5leHBvcnRlZF9zeW1ib2xzX2dlbmVyYXRlZAorCitpbnN0YWxsX2xpYl9zaGFyZWQ6ICQoTElCX1NIQVJFRCkKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChsaWJkaXIpLyQoPEYpLiQoTElCX1ZFUlNJT04pCisJJChJTlNUQUxMX0RJUikgJCh1c3JsaWJkaXIpCisJJChMTl9TKSAtZiAkKFVTUkxJQl9SRUxQQVRIKSQoPEYpLiQoTElCX1ZFUlNJT04pICQodXNybGliZGlyKS8kKDxGKQorCisjIEZJWE1FOiBwbHVnaW5zIGFyZSBpbnN0YWxsZWQgdG8gc3ViZGlycworIyAgICAgICAgYW5kIGZvciBjb21wYXRpYmlsaXR5IGxpbmtzIGluIGxpYmRpciBhcmUgY3JlYXRlZAorIyAgICAgICAgd2hlbiB0aGUgY29kZSBpcyBmaXhlZCBsaW5rcyBjb3VsZCBiZSByZW1vdmVkLgoraW5zdGFsbF9kbV9wbHVnaW46ICQoTElCX1NIQVJFRCkKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChsaWJkaXIpL2RldmljZS1tYXBwZXIvJCg8RikKKwkkKExOX1MpIC1mIGRldmljZS1tYXBwZXIvJCg8RikgJChsaWJkaXIpLyQoPEYpCisKK2luc3RhbGxfbHZtMl9wbHVnaW46ICQoTElCX1NIQVJFRCkKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChsaWJkaXIpL2x2bTIvJCg8RikKKwkkKExOX1MpIC1mIGx2bTIvJCg8RikgJChsaWJkaXIpLyQoPEYpCisJJChMTl9TKSAtZiAkKDxGKSAkKGxpYmRpcikvJCg8RikuJChMSUJfVkVSU0lPTikKK2VuZGlmCisKKyQoTElCX1NUQVRJQyk6ICQoT0JKRUNUUykKKwkkKFJNKSAkQAorCSQoQVIpIHJzICRAICQoT0JKRUNUUykKKworJS5kOiAlLmMgJChJTkNfTE5TKQorCSQoTUtESVJfUCkgJChkaXIgJEApOyBcCisJc2V0IC1lOyBcCisJRklMRT1gZWNobyAkQCB8IHNlZCAncy9cXC8vXFxcXFxcLy9nO3MvXFwuZC8vZydgOyBcCisJREVQUz1gZWNobyAkKERFUFMpIHwgc2VkIC1lICdzL1xcLy9cXFxcXFwvL2cnYDsgXAorCSQoQ0MpIC1NTSAkKElOQ0xVREVTKSAkKEJMS0lEX0NGTEFHUykgJChWQUxHUklORF9DRkxBR1MpICQoVURFVl9DRkxBR1MpICQoREVGUykgLW8gJEAgJDw7IFwKKwlzZWQgLWkgInMvXCguKlwpXC5vWyA6XSovJCRGSUxFLm8gJCRGSUxFLmQgJCRGSUxFLnBvdDogJCRERVBTIC9nIiAkQDsgXAorCURFUExJU1Q9YHNlZCAncy8gXFxcXC8vO3MvLio6Ly87JyA8ICRAYDsgXAorCWVjaG8gJCRERVBMSVNUIHwgZm10IC0xIHwgc2VkICdzLyAvL2c7cy9cKC4qXCkvXDE6LycgPj4gJEA7IFwKKwlbIC1zICRAIF0gfHwgJChSTSkgJEAKKworJS5tbzogJS5wbworCSQoTVNHRk1UKSAtbyAkQCAkPAorCitDTEVBTl9UQVJHRVRTICs9IFwKKwkkKFNPVVJDRVM6JS5jPSUuZCkgJChTT1VSQ0VTOiUuYz0lLmdjbm8pICQoU09VUkNFUzolLmM9JS5nY2RhKSBcCisJJChTT1VSQ0VTMjolLmM9JS5vKSAkKFNPVVJDRVMyOiUuYz0lLmQpICQoU09VUkNFUzI6JS5jPSUuZ2NubykgJChTT1VSQ0VTMjolLmM9JS5nY2RhKSBcCisJJChQT1RGSUxFUykgJChDTEVBTl9DRkxPVykKKworY2xlYW5kaXI6CitpZm5lcSAoLCQoZmlyc3R3b3JkICQoQ0xFQU5fRElSUykpKQorCSQoUk0pIC1yICQoQ0xFQU5fRElSUykKK2VuZGlmCisJJChSTSkgJChPQkpFQ1RTKSAkKFRBUkdFVFMpICQoQ0xFQU5fVEFSR0VUUykgY29yZQorCitjbGVhbjogJChTVUJESVJTLmNsZWFuKSBjbGVhbmRpcgorCitkaXN0Y2xlYW46IGNsZWFuZGlyICQoU1VCRElSUy5kaXN0Y2xlYW4pCitpZm5lcSAoLCQoZmlyc3R3b3JkICQoRElTVENMRUFOX0RJUlMpKSkKKwkkKFJNKSAtciAkKERJU1RDTEVBTl9ESVJTKQorZW5kaWYKKwkkKFJNKSAkKERJU1RDTEVBTl9UQVJHRVRTKSBNYWtlZmlsZQorCisuZXhwb3J0ZWRfc3ltYm9sc19nZW5lcmF0ZWQ6ICQoRVhQT1JURURfSEVBREVSKSAuZXhwb3J0ZWRfc3ltYm9scyAkKERFUFMpCisJc2V0IC1lOyBcCisJKCBjYXQgJChzcmNkaXIpLy5leHBvcnRlZF9zeW1ib2xzOyBcCisJICBpZiB0ZXN0IC1uICIkKEVYUE9SVEVEX0hFQURFUikiOyB0aGVuIFwKKwkJJChDQykgLUUgLVAgJChJTkNMVURFUykgJChERUZTKSAkKEVYUE9SVEVEX0hFQURFUikgfCBcCisJCSQoU0VEKSAtbmUgIi9edHlwZWRlZnx9LyFzLy4qWyAqXVwoJChFWFBPUlRFRF9GTl9QUkVGSVgpX1thLXowLTlfXSpcKSguKi9cMS9wIjsgXAorCSAgZmkgXAorCSkgPiAkQAorCitFWFBPUlRFRF9VQyA6PSAkKHNoZWxsIGVjaG8gJChFWFBPUlRFRF9GTl9QUkVGSVgpIHwgdHIgJ1thLXpdJyAnW0EtWl0nKQorRVhQT1JURURfU1lNQk9MUyA6PSAkKHdpbGRjYXJkICQoc3JjZGlyKS8uZXhwb3J0ZWRfc3ltYm9scy5CYXNlICQoc3JjZGlyKS8uZXhwb3J0ZWRfc3ltYm9scy4kKEVYUE9SVEVEX1VDKV9bMC05X10qWzAtOV0pCisKKy5leHBvcnQuc3ltOiAuZXhwb3J0ZWRfc3ltYm9sc19nZW5lcmF0ZWQgJChFWFBPUlRFRF9TWU1CT0xTKQoraWZlcSAoLCQoZmlyc3R3b3JkICQoRVhQT1JURURfU1lNQk9MUykpKQorCXNldCAtZTsgKGVjaG8gIkJhc2UgeyI7IGVjaG8gIglnbG9iYWw6IjtcCisJCSAkKFNFRCkgInMvXi8JCS87cy8kJC87LyIgJDw7XAorCQkgZWNobyAifTsiO1wKKwkJIGVjaG8gIkxvY2FsIHsiOyBlY2hvICIJbG9jYWw6IjsgZWNobyAiCQkqOyI7IGVjaG8gIn07IjtcCisJCSApID4gJEAKK2Vsc2UKKwlzZXQgLWU7XAorCVI9JCQoc29ydCAkXiB8IHVuaXEgLXUpO1wKKwl0ZXN0IC16ICIkJFIiIHx8IHsgZWNobyAiTWlzbWF0Y2ggYmV0d2VlbiBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJ5IGFuZCBsaXN0cyBpbiAuZXhwb3J0ZWRfc3ltYm9scy4qIGZpbGVzOiAkJFIiOyBmYWxzZTsgfSA7XAorCSggZm9yIGkgaW4gJCQoZWNobyAkKEVYUE9SVEVEX1NZTUJPTFMpIHwgdHIgJyAnICdcbicgfCBzb3J0IC1ybnRfIC1rNSApOyBkb1wKKwkJZWNobyAiJCR7aSMjKi59IHsiOyBlY2hvICIJZ2xvYmFsOiI7XAorCQkkKFNFRCkgInMvXi8JCS87cy8kJC87LyIgJCRpO1wKKwkJZWNobyAifTsiO1wKKwkgIGRvbmU7XAorCSAgZWNobyAiTG9jYWwgeyI7IGVjaG8gIglsb2NhbDoiOyBlY2hvICIJCSo7IjsgZWNobyAifTsiO1wKKwkpID4gJEAKK2VuZGlmCisKK2lmZXEgKCJAVVNFX1RSQUNLSU5HQCIsInllcyIpCitpZmVxICgsJChmaW5kc3RyaW5nICQoTUFLRUNNREdPQUxTKSxjc2NvcGUub3V0IGNmbG93IGNsZWFuIGRpc3RjbGVhbiBsY292IFwKKyBoZWxwIGNoZWNrIGNoZWNrX2xvY2FsIGNoZWNrX2NsdXN0ZXIgY2hlY2tfbHZtZXRhZCBjaGVja19sdm1wb2xsZCkpCisgICAgaWZkZWYgU09VUkNFUworICAgICAgIC1pbmNsdWRlICQoU09VUkNFUzouYz0uZCkgJChDWFhTT1VSQ0VTOi5jcHA9LmQpCisgICAgZW5kaWYKKyAgICBpZmRlZiBTT1VSQ0VTMgorICAgICAgIC1pbmNsdWRlICQoU09VUkNFUzI6LmM9LmQpCisgICAgZW5kaWYKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWFuL01ha2VmaWxlLmluIGIvbWFuL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGZkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNjggQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitGU0FETU1BTiA9IGZzYWRtLjgKK0JMS0RFQUNUSVZBVEVNQU4gPSBibGtkZWFjdGl2YXRlLjgKK0RNRVZFTlRETUFOID0gZG1ldmVudGQuOAorTFZNRVRBRE1BTiA9IGx2bWV0YWQuOAorTFZNUE9MTERNQU4gPSBsdm1wb2xsZC44CitMVk1MT0NLRE1BTiA9IGx2bWxvY2tkLjggbHZtbG9ja2N0bC44CitDTFZNRE1BTiA9IGNsdm1kLjgKK0NNSVJST1JETUFOID0gY21pcnJvcmQuOAorTFZNQ0FDSEVNQU4gPSBsdm1jYWNoZS43CitMVk1USElOTUFOID0gbHZtdGhpbi43CitMVk1EQlVTRE1BTiA9IGx2bWRidXNkLjgKKworTUFONT1sdm0uY29uZi41CitNQU43PWx2bXN5c3RlbWlkLjcKK01BTjg9bHZtLWNvbmZpZy44IGx2bS1kdW1wY29uZmlnLjggbHZtLWx2cG9sbC44IFwKKwlsdmNoYW5nZS44IGx2bWNvbmZpZy44IGx2Y29udmVydC44IGx2Y3JlYXRlLjggbHZkaXNwbGF5LjggbHZleHRlbmQuOCBcCisJbHZtLjggbHZtY2hhbmdlLjggbHZtY29uZi44IGx2bWRpc2tzY2FuLjggbHZtZHVtcC44IGx2bXNhZGMuOCBsdm1zYXIuOCBcCisJbHZyZWR1Y2UuOCBsdnJlbW92ZS44IGx2cmVuYW1lLjggbHZyZXNpemUuOCBsdnMuOCBcCisJbHZzY2FuLjggcHZjaGFuZ2UuOCBwdmNrLjggcHZjcmVhdGUuOCBwdmRpc3BsYXkuOCBwdm1vdmUuOCBwdnJlbW92ZS44IFwKKwlwdnJlc2l6ZS44IHB2cy44IHB2c2Nhbi44IHZnY2ZnYmFja3VwLjggdmdjZmdyZXN0b3JlLjggdmdjaGFuZ2UuOCBcCisJdmdjay44IHZnY3JlYXRlLjggdmdjb252ZXJ0LjggdmdkaXNwbGF5LjggdmdleHBvcnQuOCB2Z2V4dGVuZC44IFwKKwl2Z2ltcG9ydC44IHZnaW1wb3J0Y2xvbmUuOCB2Z21lcmdlLjggdmdta25vZGVzLjggdmdyZWR1Y2UuOCB2Z3JlbW92ZS44IFwKKwl2Z3JlbmFtZS44IHZncy44IHZnc2Nhbi44IHZnc3BsaXQuOAorTUFOOERNPWRtc2V0dXAuOCBkbXN0YXRzLjgKK01BTjhDTFVTVEVSPQorTUFOOFNZU1RFTURfR0VORVJBVE9SUz1sdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLjgKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLGFsbF9tYW4pCisgIE1BTl9BTEw9InllcyIKK2VuZGlmCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxpbnN0YWxsX2FsbF9tYW4pCisgIE1BTl9BTEw9InllcyIKK2VuZGlmCisKK2lmZXEgKCQoTUFOX0FMTCksInllcyIpCisgIE1BTjgrPSQoRlNBRE1NQU4pICQoTFZNRVRBRE1BTikgJChMVk1QT0xMRE1BTikgJChMVk1MT0NLRE1BTikgJChMVk1EQlVTRE1BTikKKyAgTUFOOERNKz0kKEJMS0RFQUNUSVZBVEVNQU4pICQoRE1FVkVOVERNQU4pCisgIE1BTjhDTFVTVEVSKz0kKENMVk1ETUFOKSAkKENNSVJST1JETUFOKQorICBNQU43Kz0kKExWTUNBQ0hFTUFOKSAkKExWTVRISU5NQU4pCitlbHNlCisgIGlmZXEgKCJARlNBRE1AIiwgInllcyIpCisgICAgTUFOOCs9JChGU0FETU1BTikKKyAgZW5kaWYKKworICBpZmVxICgiQEJVSUxEX0xWTURCVVNEQCIsICJ5ZXMiKQorICAgIE1BTjgrPSQoTFZNREJVU0RNQU4pCisgIGVuZGlmCisKKyAgaWZlcSAoIkBCVUlMRF9MVk1FVEFEQCIsICJ5ZXMiKQorICAgIE1BTjgrPSQoTFZNRVRBRE1BTikKKyAgZW5kaWYKKworICBpZmVxICgiQEJVSUxEX0xWTVBPTExEQCIsICJ5ZXMiKQorICAgIE1BTjgrPSQoTFZNUE9MTERNQU4pCisgIGVuZGlmCisKKyAgaWZlcSAoIkBCVUlMRF9MVk1MT0NLREAiLCAieWVzIikKKyAgICBNQU44Kz0kKExWTUxPQ0tETUFOKQorICBlbmRpZgorCisgIGlmZXEgKCJAQkxLREVBQ1RJVkFURUAiLCAieWVzIikKKyAgICBNQU44RE0rPSQoQkxLREVBQ1RJVkFURU1BTikKKyAgZW5kaWYKKworICBpZmVxICgiQERNRVZFTlREQCIsICJ5ZXMiKQorICAgIE1BTjhETSs9JChETUVWRU5URE1BTikKKyAgZW5kaWYKKworICBpZm5lcSAoIkBDTFZNREAiLCAibm9uZSIpCisgICAgTUFOOENMVVNURVIrPSQoQ0xWTURNQU4pCisgIGVuZGlmCisKKyAgaWZlcSAoIkBCVUlMRF9DTUlSUk9SREAiLCAieWVzIikKKyAgICBNQU44Q0xVU1RFUis9JChDTUlSUk9SRE1BTikKKyAgZW5kaWYKKworICBpZm5lcSAoIkBDQUNIRUAiLCAibm9uZSIpCisgICAgTUFONys9JChMVk1DQUNIRU1BTikKKyAgZW5kaWYKKworICBpZm5lcSAoIkBUSElOQCIsICJub25lIikKKyAgICBNQU43Kz0kKExWTVRISU5NQU4pCisgIGVuZGlmCitlbmRpZgorCitNQU41RElSPSQobWFuZGlyKS9tYW41CitNQU43RElSPSQobWFuZGlyKS9tYW43CitNQU44RElSPSQobWFuZGlyKS9tYW44CisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitDTEVBTl9UQVJHRVRTKz0kKE1BTjUpICQoTUFONykgJChNQU44KSAkKE1BTjhDTFVTVEVSKSBcCisJJChNQU44U1lTVEVNRF9HRU5FUkFUT1JTKSAkKE1BTjhETSkKK0RJU1RDTEVBTl9UQVJHRVRTKz0kKEZTQURNTUFOKSAkKEJMS0RFQUNUSVZBVEVNQU4pICQoRE1FVkVOVERNQU4pIFwKKwkkKExWTUVUQURNQU4pICQoTFZNUE9MTERNQU4pICQoTFZNTE9DS0RNQU4pICQoQ0xWTURNQU4pICQoQ01JUlJPUkRNQU4pIFwKKwkkKExWTUNBQ0hFTUFOKSAkKExWTVRISU5NQU4pICQoTFZNREJVU0RNQU4pCisKK2FsbDogbWFuIGRldmljZS1tYXBwZXIKKworLlBIT05ZOiBtYW4gaW5zdGFsbF9tYW41IGluc3RhbGxfbWFuNyBpbnN0YWxsX21hbjgKKworZGV2aWNlLW1hcHBlcjogJChNQU44RE0pCisKK21hbjogJChNQU41KSAkKE1BTjcpICQoTUFOOCkgJChNQU44Q0xVU1RFUikgJChNQU44U1lTVEVNRF9HRU5FUkFUT1JTKQorCithbGxfbWFuOiBtYW4KKworJChNQU41KSAkKE1BTjcpICQoTUFOOCkgJChNQU44RE0pICQoTUFOOENMVVNURVIpOglNYWtlZmlsZQorCitNYWtlZmlsZTogTWFrZWZpbGUuaW4KKwlAOgorCislOiAlLmluCisJQGNhc2UgIiRAIiBpbiBcCisJICAqLyopIDs7IFwKKwkgICopIGVjaG8gIkNyZWF0aW5nICRAIiA7ICQoU0VEKSAtZSAicysjVkVSU0lPTiMrJChMVk1fVkVSU0lPTikrO3MrI0RFRkFVTFRfU1lTX0RJUiMrJChERUZBVUxUX1NZU19ESVIpKztzKyNERUZBVUxUX0FSQ0hJVkVfRElSIyskKERFRkFVTFRfQVJDSElWRV9ESVIpKztzKyNERUZBVUxUX0JBQ0tVUF9ESVIjKyQoREVGQVVMVF9CQUNLVVBfRElSKSs7cysjREVGQVVMVF9QUk9GSUxFX0RJUiMrJChERUZBVUxUX1BST0ZJTEVfRElSKSs7cysjREVGQVVMVF9DQUNIRV9ESVIjKyQoREVGQVVMVF9DQUNIRV9ESVIpKztzKyNERUZBVUxUX0xPQ0tfRElSIyskKERFRkFVTFRfTE9DS19ESVIpKztzKyNDTFZNRF9QQVRIIytAQ0xWTURfUEFUSEArO3MrI0xWTV9QQVRIIytATFZNX1BBVEhAKztzKyNERUZBVUxUX1JVTl9ESVIjK0BERUZBVUxUX1JVTl9ESVJAKztzKyNERUZBVUxUX1BJRF9ESVIjK0BERUZBVUxUX1BJRF9ESVJAKztzKyNTWVNURU1EX0dFTkVSQVRPUl9ESVIjKyQoU1lTVEVNRF9HRU5FUkFUT1JfRElSKSs7cysjREVGQVVMVF9NQU5HTElORyMrJChERUZBVUxUX01BTkdMSU5HKSs7IiAkPCA+ICRAIDs7IFwKKwllc2FjCisKK2luc3RhbGxfbWFuNTogJChNQU41KQorCSQoSU5TVEFMTCkgLWQgJChNQU41RElSKQorCSQoSU5TVEFMTF9EQVRBKSAkKE1BTjUpICQoTUFONURJUikvCisKK2luc3RhbGxfbWFuNzogJChNQU43KQorCSQoSU5TVEFMTCkgLWQgJChNQU43RElSKQorCSQoSU5TVEFMTF9EQVRBKSAkKE1BTjcpICQoTUFON0RJUikvCisKK2luc3RhbGxfbWFuODogJChNQU44KQorCSQoSU5TVEFMTCkgLWQgJChNQU44RElSKQorCSQoSU5TVEFMTF9EQVRBKSAkKE1BTjgpICQoTUFOOERJUikvCisKK2luc3RhbGxfbHZtMjogaW5zdGFsbF9tYW41IGluc3RhbGxfbWFuNyBpbnN0YWxsX21hbjgKKworaW5zdGFsbF9jbHVzdGVyOiAkKE1BTjhDTFVTVEVSKQoraWZkZWYgTUFOOENMVVNURVIKKwkkKElOU1RBTEwpIC1kICQoTUFOOERJUikKKwkkKElOU1RBTExfREFUQSkgJChNQU44Q0xVU1RFUikgJChNQU44RElSKS8KK2VuZGlmCisKK2luc3RhbGxfZGV2aWNlLW1hcHBlcjogJChNQU44RE0pCisJJChJTlNUQUxMKSAtZCAkKE1BTjhESVIpCisJJChJTlNUQUxMX0RBVEEpICQoTUFOOERNKSAkKE1BTjhESVIpLworCitpbnN0YWxsX3N5c3RlbWRfZ2VuZXJhdG9yczogJChNQU44U1lTVEVNRF9HRU5FUkFUT1JTKQorCSQoSU5TVEFMTCkgLWQgJChNQU44RElSKQorCSQoSU5TVEFMTF9EQVRBKSAkKE1BTjhTWVNURU1EX0dFTkVSQVRPUlMpICQoTUFOOERJUikvCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMiBpbnN0YWxsX2RldmljZS1tYXBwZXIgaW5zdGFsbF9jbHVzdGVyCisKK2luc3RhbGxfYWxsX21hbjogaW5zdGFsbCBpbnN0YWxsX3N5c3RlbWRfZ2VuZXJhdG9ycwpkaWZmIC0tZ2l0IGEvbWFuL2Jsa2RlYWN0aXZhdGUuOC5pbiBiL21hbi9ibGtkZWFjdGl2YXRlLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMTBiNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9ibGtkZWFjdGl2YXRlLjguaW4KQEAgLTAsMCArMSwxMDUgQEAKKy5USCAiQkxLREVBQ1RJVkFURSIgIjgiICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCwgSW5jIiAiXCIiCisuU0ggIk5BTUUiCitibGtkZWFjdGl2YXRlIFwoZW0gdXRpbGl0eSB0byBkZWFjdGl2YXRlIGJsb2NrIGRldmljZXMKKy5TSCBTWU5PUFNJUworLkIgYmxrZGVhY3RpdmF0ZQorLlJCIFsgXC1kIFwgIFxmSWRtX29wdGlvbnNcZlAgXQorLlJCIFsgXC1lIF0KKy5SQiBbIFwtaCBdCisuUkIgWyBcLWwgXCAgXGZJbHZtX29wdGlvbnNcZlAgXQorLlJCIFsgXC1tIFwgIFxmSW1wYXRoX29wdGlvbnNcZlAgXQorLlJCIFsgXC11IF0KKy5SQiBbIFwtdiBdCisuUkkgWyBkZXZpY2UgXQorLlNIIERFU0NSSVBUSU9OCitibGtkZWFjdGl2YXRlIHV0aWxpdHkgZGVhY3RpdmF0ZXMgYmxvY2sgZGV2aWNlcy4gSWYgYSBkZXZpY2UKK2lzIG1vdW50ZWQsIHRoZSB1dGlsaXR5IGNhbiB1bm1vdW50IGl0IGF1dG9tYXRpY2FsbHkgYmVmb3JlCit0cnlpbmcgdG8gZGVhY3RpdmF0ZS4gVGhlIHV0aWxpdHkgY3VycmVudGx5IHN1cHBvcnRzCitkZXZpY2UtbWFwcGVyIGRldmljZXMgKERNKSwgaW5jbHVkaW5nIExWTSB2b2x1bWVzIGFuZAorc29mdHdhcmUgUkFJRCBNRCBkZXZpY2VzLiBMVk0gdm9sdW1lcyBhcmUgaGFuZGxlZCBkaXJlY3RseQordXNpbmcgdGhlIFxmQmx2bVxmUCg4KSBjb21tYW5kLCB0aGUgcmVzdCBvZiBkZXZpY2UtbWFwcGVyCitiYXNlZCBkZXZpY2VzIGFyZSBoYW5kbGVkIHVzaW5nIHRoZSBcZkJkbXNldHVwXGZQKDgpIGNvbW1hbmQuCitNRCBkZXZpY2VzIGFyZSBoYW5kbGVkIHVzaW5nIHRoZSBcZkJtZGFkbVxmUCg4KSBjb21tYW5kLgorLlNIIE9QVElPTlMKKy5UUAorLkJSIFwtZCAiLCAiIFwtXC1kbW9wdGlvbiBcIFxmSWRtX29wdGlvbnNcZlAKK0NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZS1tYXBwZXIgc3BlY2lmaWMgb3B0aW9ucy4KK0FjY2VwdGVkIFxmQmRtc2V0dXBcZlAoOCkgb3B0aW9ucyBhcmU6CisuUlMKKy5JUCBcZklyZXRyeVxmUAorUmV0cnkgcmVtb3ZhbCBzZXZlcmFsIHRpbWVzIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy5JUCBcZklmb3JjZVxmUAorRm9yY2UgZGV2aWNlIHJlbW92YWwuCisuUkUKKy5UUAorLkJSIFwtZSAiLCAiIFwtXC1lcnJvcnMKK1Nob3cgZXJyb3JzIHJlcG9ydGVkIGZyb20gdG9vbHMgY2FsbGVkIGJ5IFxmQmJsa2RlYWN0aXZhdGVcZlAuIFdpdGhvdXQgdGhpcworb3B0aW9uLCBhbnkgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGVzZSBleHRlcm5hbCB0b29scyBhcmUgc3VwcHJlc3NlZCBhbmQgdGhlCitcZkJibGtkZWFjdGl2YXRlXGZQIGl0c2VsZiBwcm92aWRlcyBvbmx5IGEgc3VtbWFyeSBtZXNzYWdlIGFib3V0IGRldmljZSBiZWluZworc2tpcHBlZCBvciBub3QuCisuVFAKKy5CUiBcLWggIiwgIiBcLVwtaGVscAorRGlzcGxheSB0aGUgaGVscCB0ZXh0LgorLlRQCisuQlIgXC1sICIsICIgXC1cLWx2bW9wdGlvbiBcIFxmSWx2bV9vcHRpb25zXGZQCitDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBMVk0gc3BlY2lmaWMgb3B0aW9uczoKKy5SUworLklQIFxmSXJldHJ5XGZQCitSZXRyeSByZW1vdmFsIHNldmVyYWwgdGltZXMgaW4gY2FzZSBvZiBmYWlsdXJlLgorLklQIFxmSXdob2xldmdcZlAKK0RlYWN0aXZhdGUgdGhlIHdob2xlIExWTSBWb2x1bWUgR3JvdXAgd2hlbiBwcm9jZXNzaW5nIGEgTG9naWNhbCBWb2x1bWUuCitEZWFjdGl2YXRpbmcgVm9sdW1lIEdyb3VwIGFzIGEgd2hvbGUgdGFrZXMgbGVzcyB0aW1lIHRoYW4gZGVhY3RpdmF0aW5nIGVhY2gKK0xvZ2ljYWwgVm9sdW1lIHNlcGFyYXRlbHkuCisuUkUKKy5UUAorLkJSIFwtbSAiLCAiIFwtXC1tcGF0aG9wdGlvbiBcIFxmSW1wYXRoX29wdGlvbnNcZlAKK0NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRldmljZS1tYXBwZXIgbXVsdGlwYXRoIHNwZWNpZmljIG9wdGlvbnM6CisuUlMKKy5JUCBcZklkaXNhYmxlcXVldWVpbmdcZlAKK0Rpc2FibGUgcXVldWVpbmcgb24gYWxsIG11bHRpcGF0aCBkZXZpY2VzIGZpcnN0IGJlZm9yZSBkZWFjdGl2YXRpb24uCitUaGlzIGF2b2lkcyBhIHNpdHVhdGlvbiB3aGVyZSBibGtkZWFjdGl2YXRlIG1heSBlbmQgdXAgd2FpdGluZyBpZgorYWxsIHBhdGhzIGFyZSB1bmF2YWlsYWJsZSBmb3IgYW55IHVuZGVybHlpbmcgZGV2aWNlLW1hcHBlciBtdWx0aXBhdGgKK2RldmljZS4KKy5SRQorLlRQCisuQlIgXC11ICIsICIgXC1cLXVtb3VudAorVW5tb3VudCBhIG1vdW50ZWQgZGV2aWNlIGJlZm9yZSB0cnlpbmcgdG8gZGVhY3RpdmF0ZSBpdC4KK1dpdGhvdXQgdGhpcyBvcHRpb24gdXNlZCwgYSBkZXZpY2UgdGhhdCBpcyBtb3VudGVkIGlzIG5vdCBkZWFjdGl2YXRlZC4KKy5UUAorLkJSIFwtdiAiLCAiIFwtXC12ZXJib3NlCitSdW4gaW4gdmVyYm9zZSBtb2RlLiBVc2UgXC1cLXZ2IGZvciBldmVuIG1vcmUgdmVyYm9zZSBtb2RlLgorLlNIIEVYQU1QTEVTCisuc3AKK0RlYWN0aXZhdGUgYWxsIHN1cHBvcnRlZCBibG9jayBkZXZpY2VzIGZvdW5kIGluIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlCitpcyBtb3VudGVkLCBza2lwIGl0cyBkZWFjdGl2YXRpb24uCisuc3AKKy5CIGJsa2RlYWN0aXZhdGUKKworRGVhY3RpdmF0ZSBhbGwgc3VwcG9ydGVkIGJsb2NrIGRldmljZXMgZm91bmQgaW4gdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UKK2lzIG1vdW50ZWQsIHVubW91bnQgaXQgZmlyc3QgaWYgcG9zc2libGUuCisuc3AKKy5CIGJsa2RlYWN0aXZhdGUgXC11CisKK0RlYWN0aXZhdGUgc3VwcGxpZWQgZGV2aWNlIHRvZ2V0aGVyIHdpdGggYWxsIGl0cyBob2xkZXJzLiBJZiBhbnkgb2YgdGhlCitkZXZpY2VzIHByb2Nlc3NlZCBpcyBtb3VudGVkLCB1bm1vdW50IGl0IGZpcnN0IGlmIHBvc3NpYmxlLgorLnNwCisuQiBibGtkZWFjdGl2YXRlIFwtdSAvZGV2L3ZnL2x2b2wwCisKK0RlYWN0aXZhdGUgYWxsIHN1cHBvcnRlZCBibG9jayBkZXZpY2VzIGZvdW5kIGluIHRoZSBzeXN0ZW0uIFJldHJ5IGRlYWN0aXZhdGlvbgorb2YgZGV2aWNlLW1hcHBlciBkZXZpY2VzIGluIGNhc2UgdGhlIGRlYWN0aXZhdGlvbiBmYWlscy4gRGVhY3RpdmF0ZSB0aGUgd2hvbGUKK1ZvbHVtZSBHcm91cCBhdCBvbmNlIHdoZW4gcHJvY2Vzc2luZyBhbiBMVk0gTG9naWNhbCBWb2x1bWUuCisuc3AKKy5CIGJsa2RlYWN0aXZhdGUgXC11IFwtZCByZXRyeSBcLWwgd2hvbGV2ZworCitEZWFjdGl2YXRlIGFsbCBzdXBwb3J0ZWQgYmxvY2sgZGV2aWNlcyBmb3VuZCBpbiB0aGUgc3lzdGVtLiBSZXRyeSBkZWFjdGl2YXRpb24KK29mIGRldmljZS1tYXBwZXIgZGV2aWNlcyBpbiBjYXNlIHRoZSBkZWFjdGl2YXRpb24gZmFpbHMgYW5kIGZvcmNlIHJlbW92YWwuCisuc3AKKy5CIGJsa2RlYWN0aXZhdGUgXC1kIGZvcmNlLHJldHJ5CisKKy5TSCBTRUUgQUxTTworLkJSIGRtc2V0dXAgKDgpLAorLkJSIGxzYmxrICg4KSwKKy5CUiBsdm0gKDgpLAorLkJSIG1kYWRtICg4KSwKKy5CUiBtdWx0aXBhdGhkICg4KSwKKy5CUiB1bW91bnQgKDgpCmRpZmYgLS1naXQgYS9tYW4vY2x2bWQuOC5pbiBiL21hbi9jbHZtZC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTMxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vY2x2bWQuOC5pbgpAQCAtMCwwICsxLDE3MyBAQAorLlRIIENMVk1EIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJSZWQgSGF0IEluYyIgXCIgLSotIG5yb2ZmIC0qLQorLgorLlNIIE5BTUUKKy4KK2Nsdm1kIFwoZW0gY2x1c3RlciBMVk0gZGFlbW9uCisuCisuU0ggU1lOT1BTSVMKKy4KKy5hZCBsCisuQiBjbHZtZAorLlJCIFsgXC1DIF0KKy5SQiBbIFwtZAorLlJJIFsgdmFsdWUgXV0KKy5SQiBbIFwtRQorLklSIGxvY2tfdXVpZCBdCisuUkIgWyBcLWYgXQorLlJCIFsgXC1oIF0KKy5SQiBbIFwtSQorLklSIGNsdXN0ZXJfbWFuYWdlciBdCisuUkIgWyBcLVIgXQorLlJCIFsgXC1TIF0KKy5SQiBbIFwtdAorLklSIHRpbWVvdXQgXQorLlJCIFsgXC1UCisuSVIgc3RhcnRfdGltZW91dCBdCisuUkIgWyBcLVYgXQorLmFkIGIKKy4KKy5TSCBERVNDUklQVElPTgorLgorY2x2bWQgaXMgdGhlIGRhZW1vbiB0aGF0IGRpc3RyaWJ1dGVzIExWTSBtZXRhZGF0YSB1cGRhdGVzIGFyb3VuZCBhIGNsdXN0ZXIuCitJdCBtdXN0IGJlIHJ1bm5pbmcgb24gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyIGFuZCB3aWxsIGdpdmUgYW4gZXJyb3IKK2lmIGEgbm9kZSBpbiB0aGUgY2x1c3RlciBkb2VzIG5vdCBoYXZlIHRoaXMgZGFlbW9uIHJ1bm5pbmcuCisuCisuU0ggT1BUSU9OUworLgorLkhQCisuQlIgXC1DCisuYnIKK09ubHkgdmFsaWQgaWYgXGZCXC1kXGZQIGlzIGFsc28gc3BlY2lmaWVkLgorVGVsbHMgYWxsIGNsdm1kcyBpbiBhIGNsdXN0ZXIgdG8gZW5hYmxlL2Rpc2FibGUgZGVidWcgbG9nZ2luZy4KK1dpdGhvdXQgdGhpcyBzd2l0Y2gsIG9ubHkgdGhlIGxvY2FsIGNsdm1kIHdpbGwgY2hhbmdlIGl0cyBkZWJ1ZyBsZXZlbCB0byB0aGF0CitnaXZlbiB3aXRoIFxmQlwtZFxmUC4KKy5icgorVGhpcyBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpZiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSB0aGF0IHN0YXJ0cyBjbHZtZC4KK0lmIHlvdSB3YW50IHRvIHN0YXJ0IGNsdm1kIFxmQmFuZFxmUAorZW5hYmxlIGNsdXN0ZXItd2lkZSBsb2dnaW5nIHRoZW4gdGhlIGNvbW1hbmQgbmVlZHMgdG8gYmUgaXNzdWVkIHR3aWNlLCBlZzoKKy5icgorLkJSIGNsdm1kCisuYnIKKy5CUiBjbHZtZFwgXC1kMgorLgorLkhQCisuQlIgXC1kCisuUkkgWyB2YWx1ZSBdCisuYnIKK1NldCBkZWJ1ZyBsb2dnaW5nIGxldmVsLgorSWYgXGZCXC1kXGZQIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgXGZJdmFsdWVcZlAKK3RoZW4gMSBpcyBhc3N1bWVkLiBcZklWYWx1ZVxmUCBjYW4gYmU6CisuUEQgMAorLklQCisuQlIgMAorXChlbSBEaXNhYmxlZAorLklQCisuQlIgMQorXChlbSBTZW5kcyBkZWJ1ZyBsb2dzIHRvIHN0ZGVyciAoaW1wbGllcyBcZkJcLWZcZlApCisuSVAKKy5CUiAyCitcKGVtIFNlbmRzIGRlYnVnIGxvZ3MgdG8gXGZCc3lzbG9nXGZQKDMpCisuUEQKKy4KKy5IUAorLkJSIFwtRQorLklSIGxvY2tfdXVpZAorLmJyCitQYXNzIGxvY2sgdXVpZCB0byBiZSByZWFjcXVpcmVkIGV4Y2x1c2l2ZWx5IHdoZW4gY2x2bWQgaXMgcmVzdGFydGVkLgorLgorLkhQCisuQlIgXC1mCisuYnIKK0Rvbid0IGZvcmssIHJ1biBpbiB0aGUgZm9yZWdyb3VuZC4KKy4KKy5IUAorLkJSIFwtaAorLmJyCitTaG93IGhlbHAgaW5mb3JtYXRpb24uCisuCisuSFAKKy5CUiBcLUkKKy5JUiBjbHVzdGVyX21hbmFnZXIKKy5icgorU2VsZWN0cyB0aGUgY2x1c3RlciBtYW5hZ2VyIHRvIHVzZSBmb3IgbG9ja2luZyBhbmQgaW50ZXJuYWwKK2NvbW11bmljYXRpb25zLiBBcyBpdCBpcyBxdWl0ZSBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIG1hbmFnZXJzIGF2YWlsYWJsZSBvbgordGhlIHNhbWUgc3lzdGVtIHlvdSBtaWdodCBoYXZlIHRvIG1hbnVhbGx5IHNwZWNpZnkgdGhpcyBvcHRpb24gdG8gb3ZlcnJpZGUgdGhlCitzZWFyY2guCisKK0J5IGRlZmF1bHQsIG9taXQgXGZCLUlcZlAgaXMgZXF1aXZhbGVudCB0byBcZkJcLUlhdXRvXGZQLgorQ2x2bWQgd2lsbCB1c2UgdGhlIGZpcnN0IGNsdXN0ZXIgbWFuYWdlciB0aGF0IHN1Y2NlZWRzLAorYW5kIGl0IGNoZWNrcyB0aGVtIGluIGEgcHJlZGVmaW5lZCBvcmRlcgorLkJSIGNtYW4gLAorLkJSIGNvcm9zeW5jICwKKy5CUiBvcGVuYWlzIC4KK1RoZSBhdmFpbGFibGUgbWFuYWdlcnMgd2lsbCBiZSBsaXN0ZWQgYnkgb3JkZXIgYXMgcGFydCBvZiB0aGUKK1xmQmNsdm1kIFwtaFxmUCBvdXRwdXQuCisuCisuSFAKKy5CUiBcLVIKKy5icgorVGVsbHMgYWxsIHRoZSBydW5uaW5nIGluc3RhbmNlIG9mIFxmQmNsdm1kXGZQIGluIHRoZSBjbHVzdGVyIHRvIHJlbG9hZCB0aGVpciBkZXZpY2UgY2FjaGUgYW5kCityZS1yZWFkIHRoZSBsdm0gY29uZmlndXJhdGlvbiBmaWxlIFxmQmx2bS5jb25mXGZQKDUpLiBUaGlzIGNvbW1hbmQgc2hvdWxkIGJlIHJ1biB3aGVuZXZlciB0aGUKK2RldmljZXMgb24gYSBjbHVzdGVyIHN5c3RlbSBhcmUgY2hhbmdlZC4KKy4KKy5IUAorLkJSIFwtUworLmJyCitUZWxscyB0aGUgcnVubmluZyBcZkJjbHZtZFxmUCB0byBleGl0IGFuZCByZWV4ZWN1dGUgaXRzZWxmLCBmb3IgZXhhbXBsZSBhdCB0aGUKK2VuZCBvZiBhIHBhY2thZ2UgdXBncmFkZS4gVGhlIG5ldyBpbnN0YW5jZSBpcyBpbnN0cnVjdGVkIHRvIHJlYWNxdWlyZQorYW55IGxvY2tzIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZXkgd2VyZSBwcmV2aW91c2x5IGhlbGQuIChBbHRlcm5hdGl2ZQorbWV0aG9kcyBvZiByZXN0YXJ0aW5nIHRoZSBkYWVtb24gaGF2ZSB0aGUgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcKK2V4Y2x1c2l2ZSBMViBsb2NrcyBpbnRvIHNoYXJlZCBsb2Nrcy4pCisuCisuSFAKKy5CUiBcLXQKKy5JUiB0aW1lb3V0CisuYnIKK1NwZWNpZmllcyB0aGUgXGZJdGltZW91dFxmUCBmb3IgY29tbWFuZHMgdG8gcnVuIGFyb3VuZCB0aGUgY2x1c3Rlci4gVGhpcyBzaG91bGQgbm90CitiZSBzbyBzbWFsbCB0aGF0IGNvbW1hbmRzIHdpdGggbWFueSBkaXNrIHVwZGF0ZXMgdG8gZG8gd2lsbCBmYWlsLCBzbyB5b3UKK21heSBuZWVkIHRvIGluY3JlYXNlIHRoaXMgb24gc3lzdGVtcyB3aXRoIHZlcnkgbGFyZ2UgZGlzayBmYXJtcy4KK1RoZSBkZWZhdWx0IGlzIDYwIHNlY29uZHMuCisuCisuSFAKKy5CUiBcLVQKKy5JUiBzdGFydF90aW1lb3V0CisuYnIKK1NwZWNpZmllcyB0aGUgc3RhcnQgdGltZW91dCBmb3IgXGZCY2x2bWRcZlAgZGFlbW9uIHN0YXJ0dXAuIElmIHRoZQorZGFlbW9uIGRvZXMgbm90IHJlcG9ydCB0aGF0IGl0IGhhcyBzdGFydGVkIHVwIHdpdGhpbiB0aGlzIHRpbWUgdGhlbiB0aGUgcGFyZW50Citjb21tYW5kIHdpbGwgZXhpdCB3aXRoIHN0YXR1cyBvZiA1LiBUaGlzIGRvZXMgTk9UIG1lYW4gdGhhdCBcZkJjbHZtZFxmUCBoYXMKK25vdCBzdGFydGVkISBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHN0YXJ0dXAgaGFzIGJlZW4gZGVsYXllZCBmb3Igc29tZQorcmVhc29uOyB0aGUgbW9zdCBsaWtlbHkgY2F1c2Ugb2YgdGhpcyBpcyBhbiBpbnF1b3JhdGUgY2x1c3RlciB0aG91Z2ggaXQKK2NvdWxkIGJlIGR1ZSB0byBsb2NraW5nIGxhdGVuY2llcyBvbiBhIGNsdXN0ZXIgd2l0aCBsYXJnZSBudW1iZXJzIG9mIGxvZ2ljYWwKK3ZvbHVtZXMuIElmIHlvdSBnZXQgdGhlIHJldHVybiBjb2RlIG9mIDUgaXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvCityZXN0YXJ0IFxmQmNsdm1kXGZQIGl0IHdpbGwgc3RhcnQgYXMgc29vbiBhcyB0aGF0IGJsb2NrYWdlIGhhcyBjbGVhcmVkLgorVGhpcyBmbGFnIGlzIHRvIGFsbG93IHN0YXJ0dXAgc2NyaXB0cyB0byBleGl0IGluIGEgdGltZWx5IGZhc2hpb24gZXZlbiBpZiB0aGUKK2NsdXN0ZXIgaXMgc3RhbGxlZCBmb3Igc29tZSByZWFzb24uCisKK1RoZSBkZWZhdWx0IGlzIFxmQjBcZlAgKG5vIHRpbWVvdXQpIGFuZCB0aGUgdmFsdWUgaXMgaW4gc2Vjb25kcy4gRG9uJ3Qgc2V0IHRoaXMgdG9vCitzbWFsbCBvciB5b3Ugd2lsbCBleHBlcmllbmNlIHNwdXJpb3VzIGVycm9ycy4gMTAgb3IgMjAgc2Vjb25kcyBtaWdodCBiZQorc2Vuc2libGUuCisKK1RoaXMgdGltZW91dCB3aWxsIGJlIGlnbm9yZWQgaWYgeW91IHN0YXJ0IFxmQmNsdm1kXGZQIHdpdGggdGhlIFxmQlwtZFxmUC4KKy4KKy5IUAorLkJSIFwtVgorLmJyCitEaXNwbGF5IHRoZSB2ZXJzaW9uIG9mIHRoZSBjbHVzdGVyIExWTSBkYWVtb24uCisuCisuU0ggRU5WSVJPTk1FTlQgVkFSSUFCTEVTCisuVFAKKy5CIExWTV9DTFZNRF9CSU5BUlkKK1RoZSBDTFZNRCBiaW5hcnkgdG8gdXNlIHdoZW4gXGZCY2x2bWRcZlAgcmVzdGFydCBpcyByZXF1ZXN0ZWQuCitEZWZhdWx0cyB0byBcZkkjQ0xWTURfUEFUSCNcZlAuCisuVFAKKy5CIExWTV9CSU5BUlkKK1RoZSBMVk0yIGJpbmFyeSB0byB1c2UuCitEZWZhdWx0cyB0byBcZkkjTFZNX1BBVEgjXGZQLgorLlNIIEZJTEVTCisuSSAjQ0xWTURfUEFUSCMKKy5icgorLkkgI0xWTV9QQVRIIworLlNIIFNFRSBBTFNPCisuQlIgc3lzbG9nICgzKSwKKy5CUiBsdm0uY29uZiAoNSksCisuQlIgbHZtICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2NtaXJyb3JkLjguaW4gYi9tYW4vY21pcnJvcmQuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYwNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2NtaXJyb3JkLjguaW4KQEAgLTAsMCArMSwzOSBAQAorLlRIIENNSVJST1JEIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJSZWQgSGF0IEluYyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK2NtaXJyb3JkIFwoZW0gY2x1c3RlciBtaXJyb3IgbG9nIGRhZW1vbgorCisuU0ggU1lOT1BTSVMKK1xmQmNtaXJyb3JkXGZSIFtcZkJcLWZcZlJdIFtcZkJcLWhcZlJdCisKKy5TSCBERVNDUklQVElPTgorXGZCY21pcnJvcmRcZlAgaXMgdGhlIGRhZW1vbiB0aGF0IHRyYWNrcyBtaXJyb3IgbG9nIGluZm9ybWF0aW9uIGluIGEgY2x1c3Rlci4KK0l0IGlzIHNwZWNpZmljIHRvIGRldmljZS1tYXBwZXIgYmFzZWQgbWlycm9ycyAoYW5kIGJ5IGV4dGVuc2lvbiwgTFZNCitjbHVzdGVyIG1pcnJvcnMpLiAgQ2x1c3RlciBtaXJyb3JzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCB0aGlzIGRhZW1vbgorcnVubmluZy4KKworVGhpcyBkYWVtb24gcmVsaWVzIG9uIHRoZSBjbHVzdGVyIGluZnJhc3RydWN0dXJlIHByb3ZpZGVkIGJ5IHRoZQorQ2x1c3RlciBNQU5hZ2VyIChDTUFOKSwgd2hpY2ggbXVzdCBiZSBzZXQgdXAgYW5kIHJ1bm5pbmcgaW4gb3JkZXIgZm9yCitjbWlycm9yZCB0byBmdW5jdGlvbi4gIChUaGUgY2x1c3RlciBpbmZyYXN0cnVjdHVyZSBpcyBhbHNvIHJlcXVpcmVkIGZvcgorXGZCY2x2bWRcZlAoOCkuKQorCitPdXRwdXQgaXMgbG9nZ2VkIHZpYSBcZkJzeXNsb2dcZlAoMykuIFRoZSBcZkJTSUdVU1IxIHNpZ25hbFxmUCg3KSBjYW4gYmUKK2lzc3VlZCB0byBcZkJjbWlycm9yZFxmUCB0byBnYXRoZXIgY3VycmVudCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZworcHVycG9zZXMuCisKK09uY2Ugc3RhcnRlZCwgXGZCY21pcnJvcmRcZlAgd2lsbCBydW4gdW50aWwgaXQgaXMgc2h1dGRvd24gdmlhIFxmQlNJR0lOVFxmUAorc2lnbmFsLiBJZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIGNsdXN0ZXIgbWlycm9ycywgaG93ZXZlciwgdGhlIHNpZ25hbCB3aWxsIGJlCitpZ25vcmVkLiBBY3RpdmUgY2x1c3RlciBtaXJyb3JzIHNob3VsZCBiZSBzaHV0ZG93biBiZWZvcmUgc3RvcHBpbmcgdGhlIGNsdXN0ZXIKK21pcnJvciBsb2cgZGFlbW9uLgorCisuU0ggT1BUSU9OUworLklQICJcZkJcLWZcZlIsIFxmQlwtXC1mb3JlZ3JvdW5kXGZSIiA0CitEbyBub3QgZm9yayBhbmQgbG9nIHRvIHRoZSB0ZXJtaW5hbC4KKy5JUCAiXGZCXC1oXGZSLCBcZkJcLVwtaGVscFxmUiIgNAorUHJpbnQgdXNhZ2UuCisKKy5TSCBTRUUgQUxTTworLkJSIHN5c2xvZyAoMyksCisuQlIgY2x1c3Rlci5jb25mICg1KSwKKy5CUiBzaWduYWwgKDcpLAorLkJSIGNsdm1kICg4KSwKKy5CUiBsdm0gKDgpCmRpZmYgLS1naXQgYS9tYW4vZG1ldmVudGQuOC5pbiBiL21hbi9kbWV2ZW50ZC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjI0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vZG1ldmVudGQuOC5pbgpAQCAtMCwwICsxLDExMCBAQAorLlRIIERNRVZFTlREIDggIkRNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQgSW5jIiBcIiAtKi0gbnJvZmYgLSotCisuCisuU0ggTkFNRQorLgorZG1ldmVudGQgXChlbSBEZXZpY2UtbWFwcGVyIGV2ZW50IGRhZW1vbgorLgorLlNIIFNZTk9QU0lTCisuCisuQiBkbWV2ZW50ZAorLlJCIFsgXC1kCisuUkIgWyBcLWQKKy5SQiBbIFwtZCBdXV0KKy5SQiBbIFwtZiBdCisuUkIgWyBcLWggXQorLlJCIFsgXC1sIF0KKy5SQiBbIFwtUiBdCisuUkIgWyBcLVYgXQorLlJCIFsgXC0/IF0KKy4KKy5TSCBERVNDUklQVElPTgorLgorZG1ldmVudGQgaXMgdGhlIGV2ZW50IG1vbml0b3JpbmcgZGFlbW9uIGZvciBkZXZpY2UtbWFwcGVyIGRldmljZXMuCitMaWJyYXJ5IHBsdWdpbnMgY2FuIHJlZ2lzdGVyIGFuZCBjYXJyeSBvdXQgYWN0aW9ucyB0cmlnZ2VyZWQgd2hlbgorcGFydGljdWxhciBldmVudHMgb2NjdXIuCisuCisuU0ggTFZNIFBMVUdJTlMKKy4KKy5IUAorLklSIE1pcnJvcgorLmJyCitBdHRlbXB0cyB0byBoYW5kbGUgZGV2aWNlIGZhaWx1cmUgYXV0b21hdGljYWxseS4gU2VlCisuQlIgbHZtLmNvbmYgKDUpLgorLgorLkhQCisuSVIgUmFpZAorLmJyCitBdHRlbXB0cyB0byBoYW5kbGUgZGV2aWNlIGZhaWx1cmUgYXV0b21hdGljYWxseS4gU2VlCisuQlIgbHZtLmNvbmYgKDUpLgorLgorLkhQCisuSVIgU25hcHNob3QKKy5icgorTW9uaXRvcnMgaG93IGZ1bGwgYSBzbmFwc2hvdCBpcyBiZWNvbWluZyBhbmQgZW1pdHMgYSB3YXJuaW5nIHRvCitzeXNsb2cgd2hlbiBpdCBleGNlZWRzIDgwJSBmdWxsLgorVGhlIHdhcm5pbmcgaXMgcmVwZWF0ZWQgd2hlbiA4NSUsIDkwJSBhbmQgOTUlIG9mIHRoZSBzbmFwc2hvdCBpcyBmaWxsZWQuCitTZWUKKy5CUiBsdm0uY29uZiAoNSkuCitTbmFwc2hvdCB3aGljaCBydW5zIG91dCBvZiBzcGFjZSBnZXRzIGludmFsaWQgYW5kIHdoZW4gaXQgaXMgbW91bnRlZCwKK2l0IGdldHMgdW1vdW50ZWQgaWYgcG9zc2libGUuCisuCisuSFAKKy5JUiBUaGluCisuYnIKK01vbml0b3JzIGhvdyBmdWxsIGEgdGhpbiBwb29sIGRhdGEgYW5kIG1ldGFkYXRhIGlzIGJlY29taW5nIGFuZCBlbWl0cworYSB3YXJuaW5nIHRvIHN5c2xvZyB3aGVuIGl0IGV4Y2VlZHMgODAlIGZ1bGwuCitUaGUgd2FybmluZyBpcyByZXBlYXRlZCB3aGVuIDg1JSwgOTAlIGFuZCA5NSUgb2YgdGhlIHRoaW4gcG9vbCBpcyBmaWxsZWQuCitTZWUKKy5CUiBsdm0uY29uZiAoNSkuCitJZiB0aGUgdGhpbi1wb29sIHJ1bnMgb3V0IG9mIHNwYWNlLCB0aGluIHZvbHVtZXMgYXJlIHVtb3VudGVkIGlmIHBvc3NpYmxlLgorLgorLlNIIE9QVElPTlMKKy4KKy5IUAorLkJSIFwtZAorLmJyCitSZXBlYXQgZnJvbSAxIHRvIDMgdGltZXMgKAorLkJSIFwtZCAsCisuQlIgXC1kZCAsCisuQlIgXC1kZGQKKykgdG8gaW5jcmVhc2UgdGhlIGRldGFpbCBvZgorZGVidWcgbWVzc2FnZXMgc2VudCB0byBzeXNsb2cuCitFYWNoIGV4dHJhIGQgYWRkcyBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKy4KKy5IUAorLkJSIFwtZgorLmJyCitEb24ndCBmb3JrLCBydW4gaW4gdGhlIGZvcmVncm91bmQuCisuCisuSFAKKy5CUiBcLWgKKy5icgorU2hvdyBoZWxwIGluZm9ybWF0aW9uLgorLgorLkhQCisuQlIgXC1sCisuYnIKK0xvZyB0aHJvdWdoIHN0ZG91dCBhbmQgc3RkZXJyIGluc3RlYWQgb2Ygc3lzbG9nLgorVGhpcyBvcHRpb24gd29ya3Mgb25seSB3aXRoIG9wdGlvbiBcLWYsIG90aGVyd2lzZSBpdCBpcyBpZ25vcmVkLgorLgorLkhQCisuQlIgXC0/CisuYnIKK1Nob3cgaGVscCBpbmZvcm1hdGlvbiBvbiBzdGRlcnIuCisuCisuSFAKKy5CUiBcLVIKKy5icgorUmVwbGFjZSBhIHJ1bm5pbmcgZG1ldmVudGQgaW5zdGFuY2UuIFRoZSBydW5uaW5nIGRtZXZlbnRkIG11c3QgYmUgdmVyc2lvbgorMi4wMi43NyBvciBuZXdlci4gVGhlIG5ldyBkbWV2ZW50ZCBpbnN0YW5jZSB3aWxsIG9idGFpbiBhIGxpc3Qgb2YgZGV2aWNlcyBhbmQKK2V2ZW50cyB0byBtb25pdG9yIGZyb20gdGhlIGN1cnJlbnRseSBydW5uaW5nIGRhZW1vbi4KKy4KKy5IUAorLkJSIFwtVgorLmJyCitTaG93IHZlcnNpb24gb2YgZG1ldmVudGQuCisuCisuU0ggU0VFIEFMU08KKy4KKy5CUiBsdm0gKDgpLAorLkJSIGx2bS5jb25mICg1KQpkaWZmIC0tZ2l0IGEvbWFuL2Rtc2V0dXAuOC5pbiBiL21hbi9kbXNldHVwLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZGJlNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9kbXNldHVwLjguaW4KQEAgLTAsMCArMSwxMDI0IEBACisuVEggRE1TRVRVUCA4ICJBcHIgMDYgMjAwNiIgIkxpbnV4IiAiTUFJTlRFTkFOQ0UgQ09NTUFORFMiCisuCisuU0ggTkFNRQorLgorZG1zZXR1cCBcKGVtIGxvdyBsZXZlbCBsb2dpY2FsIHZvbHVtZSBtYW5hZ2VtZW50CisuCisuU0ggU1lOT1BTSVMKKy4KKy5cIi5uaAorLmFkIGwKKy5QRCAwCisuSFAgOQorLkIgZG1zZXR1cAorLmRlIENNRF9DTEVBUgorLiAgQlIgY2xlYXIKKy4gIElSIGRldmljZV9uYW1lCisuLgorLkNNRF9DTEVBUgorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX0NSRUFURQorLiAgYWQgbAorLiAgQlIgY3JlYXRlCisuICBJUiBkZXZpY2VfbmFtZQorLiAgUkIgWyAtdSB8IFwtXC11dWlkCisuICBJUiB1dWlkIF0KKy4gIFJCIFwlWyBcLVwtYWRkbm9kZW9uY3JlYXRlIHwgXC1cLWFkZG5vZGVvbnJlc3VtZSBdCisuICBSQiBcJVsgXC1uIHwgXC1cLW5vdGFibGUgfCBcLVwtdGFibGUKKy4gIFJJIFwleyB0YWJsZSB8IHRhYmxlX2ZpbGUgfV0KKy4gIFJCIFsgXC1cLXJlYWRhaGVhZAorLiAgUkIgXCV7WyArIF0gXGZJc2VjdG9ycyB8IGF1dG8gfCBub25lIH1dCisuICBhZCBiCisuLgorLkNNRF9DUkVBVEUKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9ERVBTCisuICBhZCBsCisuICBCUiBkZXBzCisuICBSQiBbIFwtbworLiAgSVIgb3B0aW9ucyBdCisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4gIGFkIGIKKy4uCisuQ01EX0RFUFMKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9IRUxQCisuICBCUiBoZWxwCisuICBSQiBbIFwtYyB8IFwtQyB8IFwtXC1jb2x1bW5zIF0KKy4uCisuQ01EX0hFTFAKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9JTkZPCisuICBCUiBpbmZvCisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4uCisuQ01EX0lORk8KKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9JTkZPTE9ORworLiAgYWQgbAorLiAgQlIgaW5mbworLiAgQlIgXC1jIHwgXC1DIHwgXC1cLWNvbHVtbnMKKy4gIFJCIFsgXC1cLWNvdW50CisuICBJUiBjb3VudCBdCisuICBSQiBbIFwtXC1pbnRlcnZhbAorLiAgSVIgc2Vjb25kcyBdCisuICBSQiBcJVsgXC1cLW5hbWVwcmVmaXhlcyBdCisuICBSQiBcJVsgXC1cLW5vaGVhZGluZ3MgXQorLiAgUkIgWyBcLW8KKy4gIElSIGZpZWxkcyBdCisuICBSQiBbIFwtTyB8IFwtXC1zb3J0CisuICBJUiBzb3J0X2ZpZWxkcyBdCisuICBSQiBbIFwtXC1zZXBhcmF0b3IKKy4gIElSIHNlcGFyYXRvciBdCisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4gIGFkIGIKKy4uCisuQ01EX0lORk9MT05HCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfTE9BRAorLiAgYWQgbAorLiAgQlIgbG9hZAorLiAgSVIgZGV2aWNlX25hbWUKKy4gIFJCIFsgXC1cLXRhYmxlCisuICBSSSB7IHRhYmxlIHwgdGFibGVfZmlsZSB9XQorLiAgYWQgYgorLi4KKy5DTURfTE9BRAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX0xTCisuICBhZCBsCisuICBCUiBscworLiAgUkIgWyBcLVwtdGFyZ2V0CisuICBJUiB0YXJnZXRfdHlwZSBdCisuICBSQiBbIFwtXC1leGVjCisuICBJUiBjb21tYW5kIF0KKy4gIFJCIFsgXC1cLXRyZWUgXQorLiAgUkIgWyBcLW8KKy4gIElSIG9wdGlvbnMgXQorLiAgYWQgYgorLi4KKy5DTURfTFMKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9NQU5HTEUKKy4gIEJSIG1hbmdsZQorLiAgUkkgWyBkZXZpY2VfbmFtZSBdCisuLgorLkNNRF9NQU5HTEUKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9NRVNTQUdFCisuICBCUiBtZXNzYWdlCisuICBJUiBkZXZpY2VfbmFtZQorLiAgSVIgc2VjdG9yCisuICBJUiBtZXNzYWdlCisuLgorLkNNRF9NRVNTQUdFCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfTUtOT0RFUworLiAgQlIgbWtub2RlcworLiAgUkkgWyBkZXZpY2VfbmFtZSBdCisuLgorLkNNRF9NS05PREVTCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfUkVMT0FECisuICBhZCBsCisuICBCUiByZWxvYWQKKy4gIElSIGRldmljZV9uYW1lCisuICBSQiBbIFwtXC10YWJsZQorLiAgUkkgeyB0YWJsZSB8IHRhYmxlX2ZpbGUgfV0KKy4gIGFkIGIKKy4uCisuQ01EX1JFTE9BRAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1JFTU9WRQorLiAgYWQgbAorLiAgQlIgcmVtb3ZlCisuICBSQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuICBSQiBbIFwtXC1yZXRyeSBdCisuICBSQiBbIFwtXC1kZWZlcnJlZCBdCisuICBJUiBkZXZpY2VfbmFtZQorLiAgYWQgYgorLi4KKy5DTURfUkVNT1ZFCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfUkVNT1ZFX0FMTAorLiAgQlIgcmVtb3ZlX2FsbAorLiAgUkIgWyBcLWYgfCBcLVwtZm9yY2UgXQorLiAgUkIgWyBcLVwtZGVmZXJyZWQgXQorLi4KKy5DTURfUkVNT1ZFX0FMTAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1JFTkFNRQorLiAgQlIgcmVuYW1lCisuICBJUiBkZXZpY2VfbmFtZQorLiAgSVIgbmV3X25hbWUKKy4uCisuQ01EX1JFTkFNRQorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1JFTkFNRV9VVUlECisuICBCUiByZW5hbWUKKy4gIElSIGRldmljZV9uYW1lCisuICBCUiBcLVwtc2V0dXVpZAorLiAgSVIgdXVpZAorLi4KKy5DTURfUkVOQU1FX1VVSUQKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9SRVNVTUUKKy4gIGFkIGwKKy4gIEJSIHJlc3VtZQorLiAgSVIgZGV2aWNlX25hbWUKKy4gIFJCIFsgXC1cLWFkZG5vZGVvbmNyZWF0ZSB8IFwtXC1hZGRub2Rlb25yZXN1bWUgXQorLiAgUkIgWyBcLVwtbm9mbHVzaCBdCisuICBSQiBbIFwtXC1ub2xvY2tmcyBdCisuICBSQiBcJVsgXC1cLXJlYWRhaGVhZAorLiAgUkIgXCV7WyArIF0gXGZJc2VjdG9ycyB8IGF1dG8gfCBub25lIH1dCisuICBhZCBiCisuLgorLkNNRF9SRVNVTUUKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9TRVRHRU9NRVRSWQorLiAgYWQgbAorLiAgQlIgc2V0Z2VvbWV0cnkKKy4gIElSIGRldmljZV9uYW1lCisuICBJUiBjeWwKKy4gIElSIGhlYWQKKy4gIElSIHNlY3QKKy4gIElSIHN0YXJ0CisuICBhZCBiCisuLgorLkNNRF9TRVRHRU9NRVRSWQorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1NQTElUTkFNRQorLiAgQlIgc3BsaXRuYW1lCisuICBJUiBkZXZpY2VfbmFtZQorLiAgUkkgWyBzdWJzeXN0ZW0gXQorLi4KKy5DTURfU1BMSVROQU1FCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfU1RBVFMKKy4gIEJSIHN0YXRzCisuICBJUiBjb21tYW5kCisuICBSSSBbIG9wdGlvbnMgXQorLi4KKy5DTURfU1RBVFMKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9TVEFUVVMKKy4gIGFkIGwKKy4gIEJSIHN0YXR1cworLiAgUkIgWyBcLVwtdGFyZ2V0CisuICBJUiB0YXJnZXRfdHlwZSBdCisuICBSQiBbIFwtXC1ub2ZsdXNoIF0KKy4gIFJJIFsgZGV2aWNlX25hbWUgXQorLiAgYWQgYgorLi4KKy5DTURfU1RBVFVTCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfU1VTUEVORAorLiAgYWQgbAorLiAgQlIgc3VzcGVuZAorLiAgUkIgWyBcLVwtbm9sb2NrZnMgXQorLiAgUkIgWyBcLVwtbm9mbHVzaCBdCisuICBJUiBkZXZpY2VfbmFtZQorLiAgYWQgYgorLi4KKy5DTURfU1VTUEVORAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1RBQkxFCisuICBhZCBsCisuICBCUiB0YWJsZQorLiAgUkIgWyBcLVwtdGFyZ2V0CisuICBJUiB0YXJnZXRfdHlwZSBdCisuICBSQiBbIFwtXC1zaG93a2V5cyBdCisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4gIGFkIGIKKy4uCisuQ01EX1RBQkxFCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfVEFSR0VUUworLiAgQlIgdGFyZ2V0cworLi4KKy5DTURfVEFSR0VUUworLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1VERVZDT01QTEVURQorLiAgQlIgdWRldmNvbXBsZXRlCisuICBJUiBjb29raWUKKy4uCisuQ01EX1VERVZDT01QTEVURQorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1VERVZDT01QTEVURV9BTEwKKy4gIEJSIHVkZXZjb21wbGV0ZV9hbGwKKy4gIFJJIFsgYWdlX2luX21pbnV0ZXMgXQorLi4KKy5DTURfVURFVkNPTVBMRVRFX0FMTAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1VERVZDT09LSUVTCisuICBCUiB1ZGV2Y29va2llCisuLgorLkNNRF9VREVWQ09PS0lFUworLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1VERVZDUkVBVEVDT09LSUUKKy4gIEJSIHVkZXZjcmVhdGVjb29raWUKKy4uCisuQ01EX1VERVZDUkVBVEVDT09LSUUKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9VREVWRkxBR1MKKy4gIEJSIHVkZXZmbGFncworLiAgSVIgY29va2llCisuLgorLkNNRF9VREVWRkxBR1MKKy4KKy5IUAorLkIgZG1zZXR1cAorLmRlIENNRF9VREVWUkVMRUFTRUNPT0tJRQorLiAgQlIgdWRldnJlbGVhc2Vjb29raWUKKy4gIFJJIFsgY29va2llIF0KKy4uCisuQ01EX1VERVZSRUxFQVNFQ09PS0lFCisuCisuSFAKKy5CIGRtc2V0dXAKKy5kZSBDTURfVkVSU0lPTgorLiAgQlIgdmVyc2lvbgorLi4KKy5DTURfVkVSU0lPTgorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1dBSVQKKy4gIGFkIGwKKy4gIEJSIHdhaXQKKy4gIFJCIFsgXC1cLW5vZmx1c2ggXQorLiAgSVIgZGV2aWNlX25hbWUKKy4gIFJJIFsgZXZlbnRfbnIgXQorLiAgYWQgYgorLi4KKy5DTURfV0FJVAorLgorLkhQCisuQiBkbXNldHVwCisuZGUgQ01EX1dJUEVfVEFCTEUKKy4gIGFkIGwKKy4gIEJSIHdpcGVfdGFibGUKKy4gIElSIGRldmljZV9uYW1lCisuICBSQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuICBSQiBbIFwtXC1ub2ZsdXNoIF0KKy4gIFJCIFsgXC1cLW5vbG9ja2ZzIF0KKy4gIGFkIGIKKy4uCisuQ01EX1dJUEVfVEFCTEUKKy5QRAorLlAKKy5IUAorLlBEIDAKKy5CIGRldm1hcF9uYW1lIFxmSW1ham9yIG1pbm9yCisuSFAKKy5CIGRldm1hcF9uYW1lIFxmSW1ham9yOm1pbm9yCisuUEQKKy5hZCBiCisuCisuU0ggREVTQ1JJUFRJT04KKy4KK2Rtc2V0dXAgbWFuYWdlcyBsb2dpY2FsIGRldmljZXMgdGhhdCB1c2UgdGhlIGRldmljZS1tYXBwZXIgZHJpdmVyLgorRGV2aWNlcyBhcmUgY3JlYXRlZCBieSBsb2FkaW5nIGEgdGFibGUgdGhhdCBzcGVjaWZpZXMgYSB0YXJnZXQgZm9yCitlYWNoIHNlY3RvciAoNTEyIGJ5dGVzKSBpbiB0aGUgbG9naWNhbCBkZXZpY2UuCisKK1RoZSBmaXJzdCBhcmd1bWVudCB0byBkbXNldHVwIGlzIGEgY29tbWFuZC4KK1RoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGxvZ2ljYWwgZGV2aWNlIG5hbWUgb3IgdXVpZC4KKworSW52b2tpbmcgdGhlIGRtc2V0dXAgdG9vbCBhcyBcZkJkZXZtYXBfbmFtZVxmUAorKHdoaWNoIGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgaXMgc3VwcG9ydGVkCitvbmx5IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMpIGlzIGVxdWl2YWxlbnQgdG8KKy5CSSBcJWRtc2V0dXBcIGluZm9cIFwtY1wgXC1cLW5vaGVhZGluZ3NcIFwtaiBcIG1ham9yXCAgXC1tIFwgbWlub3IgXGMKK1xmUi4KKy5cIiBkb3QgYWJvdmUgaGVyZSBmaXhlcyAtVGh0bWwgcmVuZGVyaW5nIGZvciBuZXh0IEhQIG9wdGlvbgorLgorLlNIIE9QVElPTlMKKy4KKy5IUAorLkJSIFwtXC1hZGRub2Rlb25jcmVhdGUKKy5icgorRW5zdXJlIFxmSS9kZXYvbWFwcGVyXGZQIG5vZGUgZXhpc3RzIGFmdGVyIFxmQmRtc2V0dXAgY3JlYXRlXGZQLgorLgorLkhQCisuQlIgXC1cLWFkZG5vZGVvbnJlc3VtZQorLmJyCitFbnN1cmUgXGZJL2Rldi9tYXBwZXJcZlAgbm9kZSBleGlzdHMgYWZ0ZXIgXGZCZG1zZXR1cCByZXN1bWVcZlAgKGRlZmF1bHQgd2l0aCB1ZGV2KS4KKy4KKy5IUAorLkJSIFwtXC1jaGVja3MKKy5icgorUGVyZm9ybSBhZGRpdGlvbmFsIGNoZWNrcyBvbiB0aGUgb3BlcmF0aW9ucyByZXF1ZXN0ZWQgYW5kIHJlcG9ydAorcG90ZW50aWFsIHByb2JsZW1zLiAgVXNlZnVsIHdoZW4gZGVidWdnaW5nIHNjcmlwdHMuCitJbiBzb21lIGNhc2VzIHRoZXNlIGNoZWNrcyBtYXkgc2xvdyBkb3duIG9wZXJhdGlvbnMgbm90aWNlYWJseS4KKy4KKy5IUAorLkJSIFwtYyB8IFwtQyB8IFwtXC1jb2x1bW5zCisuYnIKK0Rpc3BsYXkgb3V0cHV0IGluIGNvbHVtbnMgcmF0aGVyIHRoYW4gYXMgRmllbGQ6IFZhbHVlIGxpbmVzLgorLgorLkhQCisuQlIgXC1cLWNvdW50CisuSVIgY291bnQKKy5icgorU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBhIHJlcG9ydC4gU2V0IHRoaXMgdG8gemVybworY29udGludWUgdW50aWwgaW50ZXJydXB0ZWQuICBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyBvbmUgc2Vjb25kLgorLgorLkhQCisuQlIgXC1mIHwgXC1cLWZvcmNlCisuYnIKK1RyeSBoYXJkZXIgdG8gY29tcGxldGUgb3BlcmF0aW9uLgorLgorLkhQCisuQlIgXC1oIHwgXC1cLWhlbHAKKy5icgorT3V0cHV0cyBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSwgb3B0aW9uYWxseSBpbmNsdWRpbmcKK3RoZSBsaXN0IG9mIHJlcG9ydCBmaWVsZHMgKHN5bm9ueW0gd2l0aCBcZkJoZWxwXGZQIGNvbW1hbmQpLgorLgorLkhQCisuQlIgXC1cLWluYWN0aXZlCisuYnIKK1doZW4gcmV0dXJuaW5nIGFueSB0YWJsZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBrZXJuZWwgcmVwb3J0IG9uIHRoZQoraW5hY3RpdmUgdGFibGUgaW5zdGVhZCBvZiB0aGUgbGl2ZSB0YWJsZS4KK1JlcXVpcmVzIGtlcm5lbCBkcml2ZXIgdmVyc2lvbiA0LjE2LjAgb3IgYWJvdmUuCisuCisuSFAKKy5CUiBcLVwtaW50ZXJ2YWwKKy5JUiBzZWNvbmRzCisuYnIKK1NwZWNpZnkgdGhlIGludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGl0ZXJhdGlvbnMgZm9yCityZXBlYXRpbmcgcmVwb3J0cy4gSWYgXGZCXC1cLWludGVydmFsXGZQIGlzIHNwZWNpZmllZCBidXQgXGZCXC1cLWNvdW50XGZQCitpcyBub3QsIHJlcG9ydHMgd2lsbCBjb250aW51ZSB0byByZXBlYXQgdW50aWwgaW50ZXJydXB0ZWQuCitUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyBvbmUgc2Vjb25kLgorLgorLkhQCisuQlIgXC1cLW1hbmdsZW5hbWUKKy5SQiB7IGF1dG8gfCBoZXggfCBub25lIH0KKy5icgorTWFuZ2xlIGFueSBjaGFyYWN0ZXIgbm90IG9uIGEgd2hpdGVsaXN0IHVzaW5nIG1hbmdsaW5nX21vZGUgd2hlbgorcHJvY2Vzc2luZyBkZXZpY2UtbWFwcGVyIGRldmljZSBuYW1lcyBhbmQgVVVJRHMuIFRoZSBuYW1lcyBhbmQgVVVJRHMKK2FyZSBtYW5nbGVkIG9uIGlucHV0IGFuZCB1bm1hbmdsZWQgb24gb3V0cHV0IHdoZXJlIHRoZSBtYW5nbGluZyBtb2RlCitpcyBvbmUgb2Y6CitcZkJhdXRvXGZQIChvbmx5IGRvIHRoZSBtYW5nbGluZyBpZiBub3QgbWFuZ2xlZCB5ZXQsIGRvIG5vdGhpbmcKK2lmIGFscmVhZHkgbWFuZ2xlZCwgZXJyb3Igb24gbWl4ZWQpLAorXGZCaGV4XGZQIChhbHdheXMgZG8gdGhlIG1hbmdsaW5nKSBhbmQKK1xmQm5vbmVcZlAgKG5vIG1hbmdsaW5nKS4KK0RlZmF1bHQgbW9kZSBpcyBcZkIjREVGQVVMVF9NQU5HTElORyNcZlAuCitDaGFyYWN0ZXIgd2hpdGVsaXN0OiAwLTksIEEtWiwgYS16LCAjKy0uOj1AXy4gVGhpcyB3aGl0ZWxpc3QgaXMKK2Fsc28gc3VwcG9ydGVkIGJ5IHVkZXYuIEFueSBjaGFyYWN0ZXIgbm90IG9uIGEgd2hpdGVsaXN0IGlzIHJlcGxhY2VkCit3aXRoIGl0cyBoZXggdmFsdWUgKHR3byBkaWdpdHMpIHByZWZpeGVkIGJ5IFxceC4KK01hbmdsaW5nIG1vZGUgY291bGQgYmUgYWxzbyBzZXQgdGhyb3VnaAorXGZCRE1fREVGQVVMVF9OQU1FX01BTkdMSU5HX01PREVcZlAKK2Vudmlyb25tZW50IHZhcmlhYmxlLgorLgorLkhQCisuQlIgXC1qIHwgXC1cLW1ham9yCisuSVIgbWFqb3IKKy5icgorU3BlY2lmeSB0aGUgbWFqb3IgbnVtYmVyLgorLgorLkhQCisuQlIgXC1tIHwgXC1cLW1pbm9yCisuSVIgbWlub3IKKy5icgorU3BlY2lmeSB0aGUgbWlub3IgbnVtYmVyLgorLgorLkhQCisuQlIgXC1uIHwgXC1cLW5vdGFibGUKKy5icgorV2hlbiBjcmVhdGluZyBhIGRldmljZSwgZG9uJ3QgbG9hZCBhbnkgdGFibGUuCisuCisuSFAKKy5CUiBcLVwtbmFtZXByZWZpeGVzCisuYnIKK0FkZCBhICJETV8iIHByZWZpeCBwbHVzIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBvdXRwdXQuICBVc2VmdWwgd2l0aAorXGZCXC1cLW5vaGVhZGluZ3NcZlAgdG8gcHJvZHVjZSBhIGxpc3Qgb2YKK2ZpZWxkPXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcworKGZvciBleGFtcGxlLCBpbgorLkJSIHVkZXYgKDcpCitydWxlcykuCisuCisuSFAKKy5CUiBcLVwtbm9oZWFkaW5ncworU3VwcHJlc3MgdGhlIGhlYWRpbmdzIGxpbmUgd2hlbiB1c2luZyBjb2x1bW5hciBvdXRwdXQuCisuCisuSFAKKy5CUiBcLVwtbm9mbHVzaAorRG8gbm90IGZsdXNoIG91dHN0YWRpbmcgSS9PIHdoZW4gc3VzcGVuZGluZyBhIGRldmljZSwgb3IgZG8gbm90Citjb21taXQgdGhpbi1wb29sIG1ldGFkYXRhIHdoZW4gb2J0YWluaW5nIHRoaW4tcG9vbCBzdGF0dXMuCisuCisuSFAKKy5CUiBcLVwtbm9sb2NrZnMKKy5icgorRG8gbm90IGF0dGVtcHQgdG8gc3luY2hyb25pemUgZmlsZXN5c3RlbSBlZywgd2hlbiBzdXNwZW5kaW5nIGEgZGV2aWNlLgorLgorLkhQCisuQlIgXC1cLW5vb3BlbmNvdW50CisuYnIKK1RlbGwgdGhlIGtlcm5lbCBub3QgdG8gc3VwcGx5IHRoZSBvcGVuIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGRldmljZS4KKy4KKy5IUAorLkJSIFwtXC1ub3VkZXZydWxlcworLmJyCitEbyBub3QgYWxsb3cgdWRldiB0byBtYW5hZ2Ugbm9kZXMgZm9yIGRldmljZXMgaW4gZGV2aWNlLW1hcHBlciBkaXJlY3RvcnkuCisuCisuSFAKKy5CUiBcLVwtbm91ZGV2c3luYworLmJyCitEbyBub3Qgc3luY2hyb25pc2Ugd2l0aCB1ZGV2IHdoZW4gY3JlYXRpbmcsIHJlbmFtaW5nIG9yIHJlbW92aW5nIGRldmljZXMuCisuCisuSFAKKy5CUiBcLW8gfCBcLVwtb3B0aW9ucworLklSIG9wdGlvbnMKKy5icgorU3BlY2lmeSB3aGljaCBmaWVsZHMgdG8gZGlzcGxheS4KKy4KKy5IUAorLkJSIFwtXC1yZWFkYWhlYWQKKy5SQiB7WyArIF0gXGZJc2VjdG9ycyB8IGF1dG8gfCBub25lIH0KKy5icgorU3BlY2lmeSByZWFkIGFoZWFkIHNpemUgaW4gdW5pdHMgb2Ygc2VjdG9ycy4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIFxmQmF1dG9cZlAgd2hpY2ggYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hvb3NlCithIHN1aXRhYmxlIHZhbHVlIGF1dG9tYXRpY2FsbHkuICBUaGUgXGZCK1xmUCBwcmVmaXggbGV0cyB5b3UKK3NwZWNpZnkgYSBtaW5pbXVtIHZhbHVlIHdoaWNoIHdpbGwgbm90IGJlIHVzZWQgaWYgaXQgaXMKK3NtYWxsZXIgdGhhbiB0aGUgdmFsdWUgY2hvc2VuIGJ5IHRoZSBrZXJuZWwuCitUaGUgdmFsdWUgXGZCbm9uZVxmUCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgemVyby4KKy4KKy5IUAorLkJSIFwtciB8IFwtXC1yZWFkb25seQorLmJyCitTZXQgdGhlIHRhYmxlIGJlaW5nIGxvYWRlZCByZWFkLW9ubHkuCisuCisuSFAKKy5CUiBcLVMgfCBcLVwtc2VsZWN0CisuSVIgc2VsZWN0aW9uCisuYnIKK0Rpc3BsYXkgb25seSByb3dzIHRoYXQgbWF0Y2ggXGZJc2VsZWN0aW9uXGZQIGNyaXRlcmlhLiBBbGwgcm93cyBhcmUgZGlzcGxheWVkCit3aXRoIHRoZSBhZGRpdGlvbmFsICJzZWxlY3RlZCIgY29sdW1uIChcZkItbyBzZWxlY3RlZFxmUCkgc2hvd2luZyAxIGlmIHRoZSByb3cKK21hdGNoZXMgdGhlIFxmSXNlbGVjdGlvblxmUCBhbmQgMCBvdGhlcndpc2UuIFRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlIGRlZmluZWQKK2J5IHNwZWNpZnlpbmcgY29sdW1uIG5hbWVzIGFuZCB0aGVpciB2YWxpZCB2YWx1ZXMgd2hpbGUgbWFraW5nIHVzZSBvZgorc3VwcG9ydGVkIGNvbXBhcmlzb24gb3BlcmF0b3JzLiBBcyBhIHF1aWNrIGhlbHAgYW5kIHRvIHNlZSBmdWxsIGxpc3Qgb2YKK2NvbHVtbiBuYW1lcyB0aGF0IGNhbiBiZSB1c2VkIGluIHNlbGVjdGlvbiBhbmQgdGhlIHNldCBvZiBzdXBwb3J0ZWQKK3NlbGVjdGlvbiBvcGVyYXRvcnMsIGNoZWNrIHRoZSBvdXRwdXQgb2YgXGZCZG1zZXR1cFwgaW5mb1wgLWNcIC1TXCBoZWxwXGZQCitjb21tYW5kLgorLgorLkhQCisuQlIgXC1cLXRhYmxlCisuSVIgdGFibGUKKy5icgorU3BlY2lmeSBhIG9uZS1saW5lIHRhYmxlIGRpcmVjdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuCitTZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHRhYmxlIGZvcm1hdC4KKy4KKy5IUAorLkJSIFwtXC11ZGV2Y29va2llCisuSVIgY29va2llCisuYnIKK1VzZSBjb29raWUgZm9yIHVkZXYgc3luY2hyb25pc2F0aW9uLgorTm90ZTogU2FtZSBjb29raWUgc2hvdWxkIGJlIHVzZWQgZm9yIHNhbWUgdHlwZSBvZiBvcGVyYXRpb25zIGkuZS4gY3JlYXRpb24gb2YKK211bHRpcGxlIGRpZmZlcmVudCBkZXZpY2VzLiBJdCdzIG5vdCBhZHZpY2VkIHRvIGNvbWJpbmUgZGlmZmVyZW50CitvcGVyYXRpb25zIG9uIHRoZSBzaW5nbGUgZGV2aWNlLgorLgorLkhQCisuQlIgXC11IHwgXC1cLXV1aWQKKy5icgorU3BlY2lmeSB0aGUgXGZJdXVpZFxmUC4KKy4KKy5IUAorLkJSIFwteSB8IFwtXC15ZXMKKy5icgorQW5zd2VyIHllcyB0byBhbGwgcHJvbXB0cyBhdXRvbWF0aWNhbGx5LgorLgorLkhQCisuQlIgXC12IHwgXC1cLXZlcmJvc2UKKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5icgorUHJvZHVjZSBhZGRpdGlvbmFsIG91dHB1dC4KKy4KKy5IUAorLkJSIFwtXC12ZXJpZnl1ZGV2CisuYnIKK0lmIHVkZXYgc3luY2hyb25pc2F0aW9uIGlzIGVuYWJsZWQsIHZlcmlmeSB0aGF0IHVkZXYgb3BlcmF0aW9ucyBnZXQgcGVyZm9ybWVkCitjb3JyZWN0bHkgYW5kIHRyeSB0byBmaXggdXAgdGhlIGRldmljZSBub2RlcyBhZnRlcndhcmRzIGlmIG5vdC4KKy4KKy5IUAorLkJSIFwtXC12ZXJzaW9uCisuYnIKK0Rpc3BsYXkgdGhlIGxpYnJhcnkgYW5kIGtlcm5lbCBkcml2ZXIgdmVyc2lvbi4KKy5icgorLgorLlNIIENPTU1BTkRTCisuCisuSFAKKy5DTURfQ0xFQVIKKy5icgorRGVzdHJveXMgdGhlIHRhYmxlIGluIHRoZSBpbmFjdGl2ZSB0YWJsZSBzbG90IGZvciBkZXZpY2VfbmFtZS4KKy4KKy5IUAorLkNNRF9DUkVBVEUKKy5icgorQ3JlYXRlcyBhIGRldmljZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorSWYgXGZJdGFibGVcZlAgb3IgXGZJdGFibGVfZmlsZVxmUCBpcyBzdXBwbGllZCwgdGhlIHRhYmxlIGlzIGxvYWRlZCBhbmQgbWFkZSBsaXZlLgorT3RoZXJ3aXNlIGEgdGFibGUgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0IHVubGVzcyBcZkJcLVwtbm90YWJsZVxmUCBpcyB1c2VkLgorVGhlIG9wdGlvbmFsIFxmSXV1aWRcZlAgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YKK2RldmljZV9uYW1lIGluIHN1YnNlcXVlbnQgZG1zZXR1cCBjb21tYW5kcy4KK0lmIHN1Y2Nlc3NmdWwgdGhlIGRldmljZSB3aWxsIGFwcGVhciBpbiB0YWJsZSBhbmQgZm9yIGxpdmUKK2RldmljZSB0aGUgbm9kZSBcZkkvZGV2L21hcHBlci9kZXZpY2VfbmFtZVxmUCBpcyBjcmVhdGVkLgorU2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSB0YWJsZSBmb3JtYXQuCisuCisuSFAKKy5DTURfREVQUworLmJyCitPdXRwdXRzIGEgbGlzdCBvZiBkZXZpY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGxpdmUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQKK2RldmljZS4gRGV2aWNlIG5hbWVzIG9uIG91dHB1dCBjYW4gYmUgY3VzdG9taXNlZCBieSBmb2xsb3dpbmcgXGZJb3B0aW9uc1xmUDoKK1xmQmRldm5vXGZQIChtYWpvciBhbmQgbWlub3IgcGFpciwgdXNlZCBieSBkZWZhdWx0KSwKK1xmQmJsa2Rldm5hbWVcZlAgKGJsb2NrIGRldmljZSBuYW1lKSwKK1xmQmRldm5hbWVcZlAgKG1hcCBuYW1lIGZvciBkZXZpY2UtbWFwcGVyIGRldmljZXMsIGVxdWFsIHRvIGJsa2Rldm5hbWUgb3RoZXJ3aXNlKS4KKy4KKy5IUAorLkNNRF9IRUxQCisuYnIKK091dHB1dHMgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kcyBhdmFpbGFibGUsIG9wdGlvbmFsbHkgaW5jbHVkaW5nCit0aGUgbGlzdCBvZiByZXBvcnQgZmllbGRzLgorLgorLkhQCisuQ01EX0lORk8KKy5icgorT3V0cHV0cyBzb21lIGJyaWVmIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgaW4gdGhlIGZvcm06CisuUlMKKy5SUworIFN0YXRlOiBTVVNQRU5ERUR8QUNUSVZFLCBSRUFELU9OTFkKKyBUYWJsZXMgcHJlc2VudDogTElWRSBhbmQvb3IgSU5BQ1RJVkUKKyBPcGVuIHJlZmVyZW5jZSBjb3VudAorIExhc3QgZXZlbnQgc2VxdWVuY2UgbnVtYmVyICh1c2VkIGJ5IFxmQndhaXRcZlApCisgTWFqb3IgYW5kIG1pbm9yIGRldmljZSBudW1iZXIKKyBOdW1iZXIgb2YgdGFyZ2V0cyBpbiB0aGUgbGl2ZSB0YWJsZQorIFVVSUQKKy5SRQorLlJFCisuSFAKKy5DTURfSU5GT0xPTkcKKy5icgorT3V0cHV0IHlvdSBjYW4gY3VzdG9taXNlLgorRmllbGRzIGFyZSBjb21tYS1zZXBhcmF0ZWQgYW5kIGNob3NlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKKy5CUiBuYW1lICwKKy5CUiBtYWpvciAsCisuQlIgbWlub3IgLAorLkJSIGF0dHIgLAorLkJSIG9wZW4gLAorLkJSIHNlZ21lbnRzICwKKy5CUiBldmVudHMgLAorLkJSIHV1aWQgLgorQXR0cmlidXRlcyBhcmU6CisuUkkgKCBMIClpdmUsCisuUkkgKCBJICluYWN0aXZlLAorLlJJICggcyApdXNwZW5kZWQsCisuUkkgKCByICllYWQtb25seSwKKy5SSSByZWFkLSggdyApcml0ZS4KK1ByZWNlZGUgdGhlIGxpc3Qgd2l0aCAnXGZCK1xmUCcgdG8gYXBwZW5kCit0byB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgY29sdW1ucyBpbnN0ZWFkIG9mIHJlcGxhY2luZyBpdC4KK1ByZWNlZGUgYW55IHNvcnQgZmllbGQgd2l0aCAnXGZCLVxmUCcgZm9yIGEgcmV2ZXJzZSBzb3J0IG9uIHRoYXQgY29sdW1uLgorLgorLkhQCisuQ01EX0xTCisuYnIKK0xpc3QgZGV2aWNlIG5hbWVzLiAgT3B0aW9uYWxseSBvbmx5IGxpc3QgZGV2aWNlcyB0aGF0IGhhdmUgYXQgbGVhc3QKK29uZSB0YXJnZXQgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiAgT3B0aW9uYWxseSBleGVjdXRlIGEgY29tbWFuZCBmb3IKK2VhY2ggZGV2aWNlLiAgVGhlIGRldmljZSBuYW1lIGlzIGFwcGVuZGVkIHRvIHRoZSBzdXBwbGllZCBjb21tYW5kLgorRGV2aWNlIG5hbWVzIG9uIG91dHB1dCBjYW4gYmUgY3VzdG9taXNlZCBieSBmb2xsb3dpbmcgb3B0aW9uczoKK1xmQmRldm5vXGZQIChtYWpvciBhbmQgbWlub3IgcGFpciwgdXNlZCBieSBkZWZhdWx0KSwKK1xmQmJsa2Rldm5hbWVcZlAgKGJsb2NrIGRldmljZSBuYW1lKSwKK1xmQmRldm5hbWVcZlAgKG1hcCBuYW1lIGZvciBkZXZpY2UtbWFwcGVyIGRldmljZXMsIGVxdWFsIHRvIGJsa2Rldm5hbWUgb3RoZXJ3aXNlKS4KK1xmQlwtXC10cmVlXGZQIGRpc3BsYXlzIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGRldmljZXMgYXMgYSB0cmVlLgorSXQgYWNjZXB0cyBhIGNvbW1hLXNlcGFyYXRlIGxpc3Qgb2YgXGZJb3B0aW9uc1xmUC4KK1NvbWUgc3BlY2lmeSB0aGUgaW5mb3JtYXRpb24gZGlzcGxheWVkIGFnYWluc3QgZWFjaCBub2RlOgorLkJSIGRldmljZSAvIG5vZGV2aWNlIDsKKy5CUiBibGtkZXZuYW1lIDsKKy5CUiBhY3RpdmUgIiwgIiBvcGVuICIsICIgcncgIiwgIiB1dWlkIC4KK090aGVycyBzcGVjaWZ5IGhvdyB0aGUgdHJlZSBpcyBkaXNwbGF5ZWQ6CisuQlIgYXNjaWkgIiwgIiB1dGYgIiwgIiB2dDEwMCA7CisuQlIgY29tcGFjdCAiLCAiIGludmVydGVkICIsICIgbm90cnVuYyAuCisuCisuSFAKKy5CUiBsb2FkIHwgXGMKKy5DTURfUkVMT0FECisuYnIKK0xvYWRzIFxmSXRhYmxlXGZQIG9yIFxmSXRhYmxlX2ZpbGVcZlAgaW50byB0aGUgaW5hY3RpdmUgdGFibGUgc2xvdCBmb3IgZGV2aWNlX25hbWUuCitJZiBuZWl0aGVyIGlzIHN1cHBsaWVkLCByZWFkcyBhIHRhYmxlIGZyb20gc3RhbmRhcmQgaW5wdXQuCisuCisuSFAKKy5DTURfTUFOR0xFCisuYnIKK0Vuc3VyZSBleGlzdGluZyBkZXZpY2UtbWFwcGVyIFxmSWRldmljZV9uYW1lXGZQIGFuZCBVVUlEIGlzIGluIHRoZSBjb3JyZWN0IG1hbmdsZWQKK2Zvcm0gY29udGFpbmluZyBvbmx5IHdoaXRlbGlzdGVkIGNoYXJhY3RlcnMgKHN1cHBvcnRlZCBieSB1ZGV2KSBhbmQgZG8KK2EgcmVuYW1lIGlmIG5lY2Vzc2FyeS4gQW55IGNoYXJhY3RlciBub3Qgb24gdGhlIHdoaXRlbGlzdCB3aWxsIGJlIG1hbmdsZWQKK2Jhc2VkIG9uIHRoZSBcZkJcLVwtbWFuZ2xlbmFtZVxmUCBzZXR0aW5nLiBBdXRvbWF0aWMgcmVuYW1lIHdvcmtzIG9ubHkgZm9yIGRldmljZQorbmFtZXMgYW5kIG5vdCBmb3IgZGV2aWNlIFVVSURzIGJlY2F1c2UgdGhlIGtlcm5lbCBkb2VzIG5vdCBhbGxvdyBjaGFuZ2luZwordGhlIFVVSUQgb2YgYWN0aXZlIGRldmljZXMuIEFueSBpbmNvcnJlY3QgVVVJRHMgYXJlIHJlcG9ydGVkIG9ubHkgYW5kIHRoZXkKK211c3QgYmUgbWFudWFsbHkgY29ycmVjdGVkIGJ5IGRlYWN0aXZhdGluZyB0aGUgZGV2aWNlIGZpcnN0IGFuZCB0aGVuCityZWFjdGl2YXRpbmcgaXQgd2l0aCBwcm9wZXIgbWFuZ2xpbmcgbW9kZSB1c2VkIChzZWUgYWxzbyBcZkJcLVwtbWFuZ2xlbmFtZVxmUCkuCisuCisuSFAKKy5DTURfTUVTU0FHRQorLmJyCitTZW5kIG1lc3NhZ2UgdG8gdGFyZ2V0LiBJZiBzZWN0b3Igbm90IG5lZWRlZCB1c2UgMC4KKy4KKy5IUAorLkNNRF9NS05PREVTCisuYnIKK0Vuc3VyZSB0aGF0IHRoZSBub2RlIGluIFxmSS9kZXYvbWFwcGVyXGZQIGZvciBcZklkZXZpY2VfbmFtZVxmUCBpcyBjb3JyZWN0LgorSWYgbm8gZGV2aWNlX25hbWUgaXMgc3VwcGxpZWQsIGVuc3VyZSB0aGF0IGFsbCBub2RlcyBpbiBcZkkvZGV2L21hcHBlclxmUAorY29ycmVzcG9uZCB0byBtYXBwZWQgZGV2aWNlcyBjdXJyZW50bHkgbG9hZGVkIGJ5IHRoZSBkZXZpY2UtbWFwcGVyIGtlcm5lbAorZHJpdmVyLCBhZGRpbmcsIGNoYW5naW5nIG9yIHJlbW92aW5nIG5vZGVzIGFzIG5lY2Vzc2FyeS4KKy4KKy5IUAorLkNNRF9SRU1PVkUKKy5icgorUmVtb3ZlcyBhIGRldmljZS4gIEl0IHdpbGwgbm8gbG9uZ2VyIGJlIHZpc2libGUgdG8gZG1zZXR1cC4gIE9wZW4gZGV2aWNlcworY2Fubm90IGJlIHJlbW92ZWQsIGJ1dCBhZGRpbmcgXGZCXC1cLWZvcmNlXGZQIHdpbGwgcmVwbGFjZSB0aGUgdGFibGUgd2l0aCBvbmUKK3RoYXQgZmFpbHMgYWxsIEkvTy4gIFxmQlwtXC1kZWZlcnJlZFxmUCB3aWxsIGVuYWJsZSBkZWZlcnJlZCByZW1vdmFsIG9mIG9wZW4KK2RldmljZXMgLSB0aGUgZGV2aWNlIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBsYXN0IHVzZXIgY2xvc2VzIGl0LiBUaGUgZGVmZXJyZWQKK3JlbW92YWwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgc2luY2UgdmVyc2lvbiA0LjI3LjAgb2YgdGhlIGRldmljZS1tYXBwZXIKK2RyaXZlciBhdmFpbGFibGUgaW4gdXBzdHJlYW0ga2VybmVsIHZlcnNpb24gMy4xMy4gIChVc2UgXGZCZG1zZXR1cCB2ZXJzaW9uXGZQCit0byBjaGVjayB0aGlzLikgIElmIGFuIGF0dGVtcHQgdG8gcmVtb3ZlIGEgZGV2aWNlIGZhaWxzLCBwZXJoYXBzIGJlY2F1c2UgYSBwcm9jZXNzIHJ1bgorZnJvbSBhIHF1aWNrIHVkZXYgcnVsZSB0ZW1wb3JhcmlseSBvcGVuZWQgdGhlIGRldmljZSwgdGhlIFxmQlwtXC1yZXRyeVxmUAorb3B0aW9uIHdpbGwgY2F1c2UgdGhlIG9wZXJhdGlvbiB0byBiZSByZXRyaWVkIGZvciBhIGZldyBzZWNvbmRzIGJlZm9yZSBmYWlsaW5nLgorRG8gTk9UIGNvbWJpbmUKK1xmQlwtXC1mb3JjZVxmUCBhbmQgXGZCXC1cLXVkZXZjb29raWVcZlAsIGFzIHVkZXYgbWF5IHN0YXJ0IHRvIHByb2Nlc3MgdWRldgorcnVsZXMgaW4gdGhlIG1pZGRsZSBvZiBlcnJvciB0YXJnZXQgcmVwbGFjZW1lbnQgYW5kIHJlc3VsdCBpbiBub25kZXRlcm1pbmlzdGljCityZXN1bHQuCisuCisuSFAKKy5DTURfUkVNT1ZFX0FMTAorLmJyCitBdHRlbXB0cyB0byByZW1vdmUgYWxsIGRldmljZSBkZWZpbml0aW9ucyBpLmUuIHJlc2V0IHRoZSBkcml2ZXIuICBUaGlzIGFsc28gcnVucworXGZCbWtub2Rlc1xmUCBhZnRlcndhcmRzLiAgVXNlIHdpdGggY2FyZSEgIE9wZW4gZGV2aWNlcyBjYW5ub3QgYmUgcmVtb3ZlZCwgYnV0CithZGRpbmcgXGZCXC1cLWZvcmNlXGZQIHdpbGwgcmVwbGFjZSB0aGUgdGFibGUgd2l0aCBvbmUgdGhhdCBmYWlscyBhbGwgSS9PLgorXGZCXC1cLWRlZmVycmVkXGZQIHdpbGwgZW5hYmxlIGRlZmVycmVkIHJlbW92YWwgb2Ygb3BlbiBkZXZpY2VzIC0gdGhlIGRldmljZQord2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxhc3QgdXNlciBjbG9zZXMgaXQuICBUaGUgZGVmZXJyZWQgcmVtb3ZhbCBmZWF0dXJlIGlzCitzdXBwb3J0ZWQgc2luY2UgdmVyc2lvbiA0LjI3LjAgb2YgdGhlIGRldmljZS1tYXBwZXIgZHJpdmVyIGF2YWlsYWJsZSBpbgordXBzdHJlYW0ga2VybmVsIHZlcnNpb24gMy4xMy4KKy4KKy5IUAorLkNNRF9SRU5BTUUKKy5icgorUmVuYW1lcyBhIGRldmljZS4KKy4KKy5IUAorLkNNRF9SRU5BTUVfVVVJRAorLmJyCitTZXRzIHRoZSB1dWlkIG9mIGEgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aG91dCBhIHV1aWQuCitBZnRlciBhIHV1aWQgaGFzIGJlZW4gc2V0IGl0IGNhbm5vdCBiZSBjaGFuZ2VkLgorLgorLkhQCisuQ01EX1JFU1VNRQorLmJyCitVbi1zdXNwZW5kcyBhIGRldmljZS4KK0lmIGFuIGluYWN0aXZlIHRhYmxlIGhhcyBiZWVuIGxvYWRlZCwgaXQgYmVjb21lcyBsaXZlLgorUG9zdHBvbmVkIEkvTyB0aGVuIGdldHMgcmUtcXVldWVkIGZvciBwcm9jZXNzaW5nLgorLgorLkhQCisuQ01EX1NFVEdFT01FVFJZCisuYnIKK1NldHMgdGhlIGRldmljZSBnZW9tZXRyeSB0byBDL0gvUy4KKy4KKy5IUAorLkNNRF9TUExJVE5BTUUKKy5icgorU3BsaXRzIGdpdmVuIFxmSWRldmljZSBuYW1lXGZQIGludG8gXGZJc3Vic3lzdGVtXGZQIGNvbnN0aXR1ZW50cy4KK1RoZSBkZWZhdWx0IHN1YnN5c3RlbSBpcyBMVk0uCitMVk0gY3VycmVudGx5IGdlbmVyYXRlcyBkZXZpY2UgbmFtZXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmFtZXMgb2YgdGhlIFZvbHVtZQorR3JvdXAsIExvZ2ljYWwgVm9sdW1lIGFuZCBhbnkgaW50ZXJuYWwgTGF5ZXIgd2l0aCBhIGh5cGhlbiBhcyBzZXBhcmF0b3IuCitBbnkgaHlwaGVucyB3aXRoaW4gdGhlIG5hbWVzIGFyZSBkb3VibGVkIHRvIGVzY2FwZSB0aGVtLgorVGhlIHByZWNpc2UgZW5jb2RpbmcgbWlnaHQgY2hhbmdlIHdpdGhvdXQgbm90aWNlIGluIGFueSBmdXR1cmUKK3JlbGVhc2UsIHNvIHdlIHJlY29tbWVuZCB5b3UgYWx3YXlzIGRlY29kZSB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCit0aGlzIGNvbW1hbmQuCisuSFAKKy5CUiBzdGF0cyAiICIgXGZJY29tbWFuZCAiIFsiIFxmSW9wdGlvbnMgXQorLmJyCitNYW5hZ2VzIElPIHN0YXRpc3RpY3MgcmVnaW9ucyBmb3IgZGV2aWNlcy4KK1NlZQorLkJSIGRtc3RhdHMgKDgpCitmb3IgbW9yZSBkZXRhaWxzLgorLkhQCisuQ01EX1NUQVRTCisuYnIKK091dHB1dHMgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBlYWNoIG9mIHRoZSBkZXZpY2UncyB0YXJnZXRzLgorV2l0aCBcZkJcLVwtdGFyZ2V0XGZQLCBvbmx5IGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHR5cGUKK2FueSBpcyBkaXNwbGF5ZWQuICBXaXRoIFxmQlwtXC1ub2ZsdXNoXGZQLCB0aGUgdGhpbiB0YXJnZXQgKGZyb20gdmVyc2lvbiAxLjMuMCkKK2RvZXNuJ3QgY29tbWl0IGFueSBvdXRzdGFuZGluZyBjaGFuZ2VzIHRvIGRpc2sgYmVmb3JlIHJlcG9ydGluZyBpdHMgc3RhdGlzdGljcy4KKworLkhQCisuQ01EX1NVU1BFTkQKKy5icgorU3VzcGVuZHMgYSBkZXZpY2UuICBBbnkgSS9PIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBtYXBwZWQgYnkgdGhlIGRldmljZQorYnV0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCB3aWxsIGJlIGZsdXNoZWQuICBBbnkgZnVydGhlciBJL08gdG8gdGhhdAorZGV2aWNlIHdpbGwgYmUgcG9zdHBvbmVkIGZvciBhcyBsb25nIGFzIHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkLgorSWYgdGhlcmUncyBhIGZpbGVzeXN0ZW0gb24gdGhlIGRldmljZSB3aGljaCBzdXBwb3J0cyB0aGUgb3BlcmF0aW9uLAorYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gc3luYyBpdCBmaXJzdCB1bmxlc3MgXGZCXC1cLW5vbG9ja2ZzXGZQIGlzIHNwZWNpZmllZC4KK1NvbWUgdGFyZ2V0cyBzdWNoIGFzIHJlY2VudCAoT2N0b2JlciAyMDA2KSB2ZXJzaW9ucyBvZiBtdWx0aXBhdGggbWF5IHN1cHBvcnQKK3RoZSBcZkJcLVwtbm9mbHVzaFxmUCBvcHRpb24uICBUaGlzIGxldHMgb3V0c3RhbmRpbmcgSS9PIHRoYXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUKK2RldmljZSB0byByZW1haW4gdW5mbHVzaGVkLgorLgorLkhQCisuQ01EX1RBQkxFCisuYnIKK091dHB1dHMgdGhlIGN1cnJlbnQgdGFibGUgZm9yIHRoZSBkZXZpY2UgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgZmVkCitiYWNrIGluIHVzaW5nIHRoZSBjcmVhdGUgb3IgbG9hZCBjb21tYW5kcy4KK1dpdGggXGZCXC1cLXRhcmdldFxmUCwgb25seSBpbmZvcm1hdGlvbiByZWxhdGluZyB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCB0eXBlCitpcyBkaXNwbGF5ZWQuCitFbmNyeXB0aW9uIGtleXMgYXJlIHN1cHByZXNzZWQgaW4gdGhlIHRhYmxlIG91dHB1dCBmb3IgdGhlIGNyeXB0Cit0YXJnZXQgdW5sZXNzIHRoZSBcZkJcLVwtc2hvd2tleXNcZlAgcGFyYW1ldGVyIGlzIHN1cHBsaWVkLgorLgorLkhQCisuQ01EX1RBUkdFVFMKKy5icgorRGlzcGxheXMgdGhlIG5hbWVzIGFuZCB2ZXJzaW9ucyBvZiB0aGUgY3VycmVudGx5LWxvYWRlZCB0YXJnZXRzLgorLgorLkhQCisuQ01EX1VERVZDT01QTEVURQorLmJyCitXYWtlIGFueSBwcm9jZXNzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgdWRldiB0byBjb21wbGV0ZSBwcm9jZXNzaW5nIHRoZSBzcGVjaWZpZWQgY29va2llLgorLgorLkhQCisuQ01EX1VERVZDT01QTEVURV9BTEwKKy5icgorUmVtb3ZlIGFsbCBjb29raWVzIG9sZGVyIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWludXRlcy4KK0FueSBwcm9jZXNzIHdhaXRpbmcgb24gYSBjb29raWUgd2lsbCBiZSByZXN1bWVkIGltbWVkaWF0ZWx5LgorLgorLkhQCisuQ01EX1VERVZDT09LSUVTCisuYnIKK0xpc3QgYWxsIGV4aXN0aW5nIGNvb2tpZXMuIENvb2tpZXMgYXJlIHN5c3RlbS13aWRlIHNlbWFwaG9yZXMgd2l0aCBrZXlzCitwcmVmaXhlZCBieSB0d28gcHJlZGVmaW5lZCBieXRlcyAoMHgwRDREKS4KKy4KKy5IUAorLkNNRF9VREVWQ1JFQVRFQ09PS0lFCisuYnIKK0NyZWF0ZXMgYSBuZXcgY29va2llIHRvIHN5bmNocm9uaXplIGFjdGlvbnMgd2l0aCB1ZGV2IHByb2Nlc3NpbmcuCitUaGUgb3V0cHV0IGlzIGEgY29va2llIHZhbHVlLiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBjb29raWVzIHNpbmNlCitkbXNldHVwIGNyZWF0ZXMgYW5kIGRlc3Ryb3lzIHRoZW0gZm9yIGVhY2ggYWN0aW9uIGF1dG9tYXRpY2FsbHkuIEhvd2V2ZXIsIHdlIGNhbgorZ2VuZXJhdGUgb25lIGV4cGxpY2l0bHkgdG8gZ3JvdXAgc2V2ZXJhbCBhY3Rpb25zIHRvZ2V0aGVyIGFuZCB1c2Ugb25seSBvbmUKK2Nvb2tpZSBpbnN0ZWFkLiBXZSBjYW4gZGVmaW5lIGEgY29va2llIHRvIHVzZSBmb3IgZWFjaCByZWxldmFudCBjb21tYW5kIGJ5IHVzaW5nCitcZkJcLVwtdWRldmNvb2tpZVxmUCBvcHRpb24uIEFsdGVybmF0aXZlbHksIHdlIGNhbiBleHBvcnQgdGhpcyB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudAorb2YgdGhlIGRtc2V0dXAgcHJvY2VzcyBhcyBcZkJETV9VREVWX0NPT0tJRVxmUCB2YXJpYWJsZSBhbmQgaXQgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkKK3dpdGggYWxsIHN1YnNlcXVlbnQgY29tbWFuZHMgdW50aWwgaXQgaXMgdW5zZXQuCitJbnZva2luZyB0aGlzIGNvbW1hbmQgd2lsbCBjcmVhdGUgc3lzdGVtLXdpZGUgc2VtYXBob3JlIHRoYXQgbmVlZHMgdG8gYmUgY2xlYW5lZAordXAgZXhwbGljaXRseSBieSBjYWxsaW5nIHVkZXZyZWxlYXNlY29va2llIGNvbW1hbmQuCisuCisuSFAKKy5DTURfVURFVkZMQUdTCisuYnIKK1BhcnNlcyBnaXZlbiBcZkljb29raWVcZlAgdmFsdWUgYW5kIGV4dHJhY3RzIGFueSB1ZGV2IGNvbnRyb2wgZmxhZ3MgZW5jb2RlZC4KK1RoZSBvdXRwdXQgaXMgaW4gZW52aXJvbm1lbnQga2V5IGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gdWRldgorcnVsZXMuIElmIHRoZSBmbGFnIGhhcyBpdHMgc3ltYm9saWMgbmFtZSBhc3NpZ25lZCB0aGVuIHRoZSBvdXRwdXQgaXMKK0RNX1VERVZfRkxBR188ZmxhZ19uYW1lPiA9ICcxJywgRE1fVURFVl9GTEFHPGZsYWdfcG9zaXRpb24+ID0gJzEnIG90aGVyd2lzZS4KK1N1YnN5c3RlbSB1ZGV2IGZsYWdzIGRvbid0IGhhdmUgc3ltYm9saWMgbmFtZXMgYXNzaWduZWQgYW5kIHRoZXNlIG9uZXMgYXJlCithbHdheXMgcmVwb3J0ZWQgYXMgRE1fU1VCU1lTVEVNX1VERVZfRkxBRzxmbGFnX3Bvc2l0aW9uPiA9ICcxJy4gVGhlcmUgYXJlCisxNiB1ZGV2IGZsYWdzIGFsdG9nZXRoZXIuCisuCisuSFAKKy5DTURfVURFVlJFTEVBU0VDT09LSUUKKy5icgorV2FpdHMgZm9yIGFsbCBwZW5kaW5nIHVkZXYgcHJvY2Vzc2luZyBib3VuZCB0byBnaXZlbiBjb29raWUgdmFsdWUgYW5kIGNsZWFuIHVwCit0aGUgY29va2llIHdpdGggdW5kZXJseWluZyBzZW1hcGhvcmUuIElmIHRoZSBjb29raWUgaXMgbm90IGdpdmVuIGRpcmVjdGx5LAordGhlIGNvbW1hbmQgd2lsbCB0cnkgdG8gdXNlIGEgdmFsdWUgZGVmaW5lZCBieSBcZkJETV9VREVWX0NPT0tJRVxmUCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy4KKy5IUAorLkNNRF9WRVJTSU9OCisuYnIKK091dHB1dHMgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKy4KKy5IUAorLkNNRF9XQUlUCisuYnIKK1NsZWVwcyB1bnRpbCB0aGUgZXZlbnQgY291bnRlciBmb3IgZGV2aWNlX25hbWUgZXhjZWVkcyBldmVudF9uci4KK1VzZSBcZkJcLXZcZlAgdG8gc2VlIHRoZSBldmVudCBudW1iZXIgcmV0dXJuZWQuCitUbyB3YWl0IHVudGlsIHRoZSBuZXh0IGV2ZW50IGlzIHRyaWdnZXJlZCwgdXNlIFxmQmluZm9cZlAgdG8gZmluZAordGhlIGxhc3QgZXZlbnQgbnVtYmVyLgorV2l0aCBcZkJcLVwtbm9mbHVzaFxmUCwgdGhlIHRoaW4gdGFyZ2V0IChmcm9tIHZlcnNpb24gMS4zLjApIGRvZXNuJ3QgY29tbWl0Cithbnkgb3V0c3RhbmRpbmcgY2hhbmdlcyB0byBkaXNrIGJlZm9yZSByZXBvcnRpbmcgaXRzIHN0YXRpc3RpY3MuCisuCisuSFAKKy5DTURfV0lQRV9UQUJMRQorLmJyCitXYWl0IGZvciBhbnkgSS9PIGluLWZsaWdodCB0aHJvdWdoIHRoZSBkZXZpY2UgdG8gY29tcGxldGUsIHRoZW4KK3JlcGxhY2UgdGhlIHRhYmxlIHdpdGggYSBuZXcgdGFibGUgdGhhdCBmYWlscyBhbnkgbmV3IEkvTworc2VudCB0byB0aGUgZGV2aWNlLiAgSWYgc3VjY2Vzc2Z1bCwgdGhpcyBzaG91bGQgcmVsZWFzZSBhbnkgZGV2aWNlcworaGVsZCBvcGVuIGJ5IHRoZSBkZXZpY2UncyB0YWJsZShzKS4KKy4KKy5TSCBUQUJMRSBGT1JNQVQKKy4KK0VhY2ggbGluZSBvZiB0aGUgdGFibGUgc3BlY2lmaWVzIGEgc2luZ2xlIHRhcmdldCBhbmQgaXMgb2YgdGhlIGZvcm06Cisuc3AKKy5JIGxvZ2ljYWxfc3RhcnRfc2VjdG9yIG51bV9zZWN0b3JzCisuQiB0YXJnZXRfdHlwZQorLkkgdGFyZ2V0X2FyZ3MKKy5zcAorU2ltcGxlIHRhcmdldCB0eXBlcyBhbmQgdGFyZ2V0IGFyZ3MgaW5jbHVkZToKKy4KKy5UUAorLkIgbGluZWFyIFxmSWRlc3RpbmF0aW9uX2RldmljZSBzdGFydF9zZWN0b3IKK1RoZSB0cmFkaXRpb25hbCBsaW5lYXIgbWFwcGluZy4KKy5UUAorLkIgc3RyaXBlZCBcZkludW1fc3RyaXBlcyBjaHVua19zaXplIFxmUltcZklkZXN0aW5hdGlvbiBzdGFydF9zZWN0b3JcZlJdLi4uCitDcmVhdGVzIGEgc3RyaXBlZCBhcmVhLgorLmJyCitlLmcuIHN0cmlwZWQgMiAzMiAvZGV2L2hkYTEgMCAvZGV2L2hkYjEgMAord2lsbCBtYXAgdGhlIGZpcnN0IGNodW5rICgxNmspIGFzIGZvbGxvd3M6CisuUlMKKy5SUworIExWIGNodW5rIDEgLT4gaGRhMSwgY2h1bmsgMQorIExWIGNodW5rIDIgLT4gaGRiMSwgY2h1bmsgMQorIExWIGNodW5rIDMgLT4gaGRhMSwgY2h1bmsgMgorIExWIGNodW5rIDQgLT4gaGRiMSwgY2h1bmsgMgorIGV0Yy4KKy5SRQorLlJFCisuVFAKKy5CIGVycm9yCitFcnJvcnMgYW55IEkvTyB0aGF0IGdvZXMgdG8gdGhpcyBhcmVhLiAgVXNlZnVsIGZvciB0ZXN0aW5nIG9yCitmb3IgY3JlYXRpbmcgZGV2aWNlcyB3aXRoIGhvbGVzIGluIHRoZW0uCisuVFAKKy5CIHplcm8KK1JldHVybnMgYmxvY2tzIG9mIHplcm9lcyBvbiByZWFkcy4gIEFueSBkYXRhIHdyaXR0ZW4gaXMgZGlzY2FyZGVkIHNpbGVudGx5LgorVGhpcyBpcyBhIGJsb2NrLWRldmljZSBlcXVpdmFsZW50IG9mIHRoZSBcZkkvZGV2L3plcm9cZlAKK2NoYXJhY3Rlci1kZXZpY2UgZGF0YSBzaW5rIGRlc2NyaWJlZCBpbiBcZkJudWxsXGZQKDQpLgorLlAKK01vcmUgY29tcGxleCB0YXJnZXRzIGluY2x1ZGU6CisuVFAKKy5CIGNhY2hlCitJbXByb3ZlcyBwZXJmb3JtYW5jZSBvZiBhIGJsb2NrIGRldmljZSAoZWcsIGEgc3BpbmRsZSkgYnkgZHluYW1pY2FsbHkKK21pZ3JhdGluZyBzb21lIG9mIGl0cyBkYXRhIHRvIGEgZmFzdGVyIHNtYWxsZXIgZGV2aWNlIChlZywgYW4gU1NEKS4KKy5UUAorLkIgY3J5cHQKK1RyYW5zcGFyZW50IGVuY3J5cHRpb24gb2YgYmxvY2sgZGV2aWNlcyB1c2luZyB0aGUga2VybmVsIGNyeXB0byBBUEkuCisuVFAKKy5CIGRlbGF5CitEZWxheXMgcmVhZHMgYW5kL29yIHdyaXRlcyB0byBkaWZmZXJlbnQgZGV2aWNlcy4gIFVzZWZ1bCBmb3IgdGVzdGluZy4KKy5UUAorLkIgZmxha2V5CitDcmVhdGVzIGEgc2ltaWxhciBtYXBwaW5nIHRvIHRoZSBsaW5lYXIgdGFyZ2V0IGJ1dAorZXhoaWJpdHMgdW5yZWxpYWJsZSBiZWhhdmlvdXIgcGVyaW9kaWNhbGx5LgorVXNlZnVsIGZvciBzaW11bGF0aW5nIGZhaWxpbmcgZGV2aWNlcyB3aGVuIHRlc3RpbmcuCisuVFAKKy5CIG1pcnJvcgorTWlycm9ycyBkYXRhIGFjcm9zcyB0d28gb3IgbW9yZSBkZXZpY2VzLgorLlRQCisuQiBtdWx0aXBhdGgKK01lZGlhdGVzIGFjY2VzcyB0aHJvdWdoIG11bHRpcGxlIHBhdGhzIHRvIHRoZSBzYW1lIGRldmljZS4KKy5UUAorLkIgcmFpZAorT2ZmZXJzIGFuIGludGVyZmFjZSB0byB0aGUga2VybmVsJ3Mgc29mdHdhcmUgcmFpZCBkcml2ZXIsIG1kLgorLlRQCisuQiBzbmFwc2hvdAorU3VwcG9ydHMgc25hcHNob3RzIG9mIGRldmljZXMuCisuVFAKKy5CUiB0aGluICIsICIgdGhpbi1wb29sCitTdXBwb3J0cyB0aGluIHByb3Zpc2lvbmluZyBvZiBkZXZpY2VzIGFuZCBhbHNvIHByb3ZpZGVzIGEgYmV0dGVyIHNuYXBzaG90IHN1cHBvcnQuCisuUAorVG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgdmFyaW91cyB0YXJnZXRzIGFuZCB0aGVpciB0YWJsZSBmb3JtYXRzIGFuZCBzdGF0dXMKK2xpbmVzLCBwbGVhc2UgcmVhZCB0aGUgZmlsZXMgaW4gdGhlIERvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlciBkaXJlY3RvcnkgaW4KK3RoZSBrZXJuZWwgc291cmNlIHRyZWUuCisoWW91ciBkaXN0cmlidXRpb24gbWlnaHQgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUKK2RvY3VtZW50YXRpb24gZGlyZWN0b3J5IGZvciB0aGUgZGV2aWNlLW1hcHBlciBwYWNrYWdlLikKKy4KKy5TSCBFWEFNUExFUworLgorIyBBIHRhYmxlIHRvIGpvaW4gdHdvIGRpc2tzIHRvZ2V0aGVyCisuYnIKKzAgMTAyODE2MCBsaW5lYXIgL2Rldi9oZGEgMAorLmJyCisxMDI4MTYwIDM5MDM3NjIgbGluZWFyIC9kZXYvaGRiIDAKKy5icgorIyBBIHRhYmxlIHRvIHN0cmlwZSBhY3Jvc3MgdGhlIHR3byBkaXNrcywKKy5icgorIyBhbmQgYWRkIHRoZSBzcGFyZSBzcGFjZSBmcm9tCisuYnIKKyMgaGRiIHRvIHRoZSBiYWNrIG9mIHRoZSB2b2x1bWUKKy5icgorMCAyMDU2MzIwIHN0cmlwZWQgMiAzMiAvZGV2L2hkYSAwIC9kZXYvaGRiIDAKKy5icgorMjA1NjMyMCAyODc1NjAyIGxpbmVhciAvZGV2L2hkYiAxMDI4MTYwCisuCisuU0ggRU5WSVJPTk1FTlQgVkFSSUFCTEVTCisuCisuVFAKKy5CIERNX0RFVl9ESVIKK1RoZSBkZXZpY2UgZGlyZWN0b3J5IG5hbWUuCitEZWZhdWx0cyB0byAiXGZJL2RldlxmUCIgYW5kIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC4KKy5UUAorLkIgRE1fVURFVl9DT09LSUUKK0EgY29va2llIHRvIHVzZSBmb3IgYWxsIHJlbGV2YW50IGNvbW1hbmRzIHRvIHN5bmNocm9uaXplIHdpdGggdWRldiBwcm9jZXNzaW5nLgorSXQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgXGZCXC1cLXVkZXZjb29raWVcZlAgb3B0aW9uLgorLlRQCisuQiBETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERQorQSBkZWZhdWx0IG1hbmdsaW5nIG1vZGUuIERlZmF1bHRzIHRvICJcZkIjREVGQVVMVF9NQU5HTElORyNcZlAiCithbmQgaXQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgXGZCXC1cLW1hbmdsZW5hbWVcZlAgb3B0aW9uLgorLgorLlNIIEFVVEhPUlMKKy4KK09yaWdpbmFsIHZlcnNpb246IEpvZSBUaG9ybmJlciA8dGhvcm5iZXJAcmVkaGF0LmNvbT4KKy4KKy5TSCBTRUUgQUxTTworLgorLkJSIGRtc3RhdHMgKDgpLAorLkJSIHVkZXYgKDcpLAorLkJSIHVkZXZhZG0gKDgpCisuUAorTFZNMiByZXNvdXJjZSBwYWdlOiBodHRwczovL3d3dy5zb3VyY2V3YXJlLm9yZy9sdm0yLworLmJyCitEZXZpY2UtbWFwcGVyIHJlc291cmNlIHBhZ2U6IGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vZG0vCmRpZmYgLS1naXQgYS9tYW4vZG1zdGF0cy44LmluIGIvbWFuL2Rtc3RhdHMuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFhZThjCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2Rtc3RhdHMuOC5pbgpAQCAtMCwwICsxLDEwODYgQEAKKy5USCBETVNUQVRTIDggIkp1biAyMyAyMDE2IiAiTGludXgiICJNQUlOVEVOQU5DRSBDT01NQU5EUyIKKworLmRlIE9QVF9QUk9HUkFNUworLiAgUkIgXCVbIFwtXC1hbGxwcm9ncmFtcyB8IFwtXC1wcm9ncmFtaWQKKy4gIElSIGlkIF0KKy4uCisuCisuZGUgT1BUX1JFR0lPTlMKKy4gIFJCIFwlWyBcLVwtYWxscmVnaW9ucyB8IFwtXC1yZWdpb25pZAorLiAgSVIgaWQgXQorLi4KKy5kZSBPUFRfT0JKRUNUUworLiAgUkIgWyBcLVwtYXJlYSBdCisuICBSQiBbIFwtXC1yZWdpb24gXQorLiAgUkIgWyBcLVwtZ3JvdXAgXQorLi4KKy4KKy5cIiBQcmludCB1bml0cyBzdWZmaXgsIHVzZSB3aXRoIGFyZyB0byBwcmludCBodW1hbgorLlwiIG1hbjJodG1sIGNhbid0IGhhbmRsZSB0b28gbWFueSBjaGFuZ2VzIHBlciBjb21tYW5kCisuZGUgVU5JVFMKKy4gIEJSIGIgfCBCIHwgcyB8IFMgfCBrIHwgSyB8IG0gfCBNIHwgXGMKKy4gIEJSIGcgfCBHIHwgdCB8IFQgfCBwIHwgUCB8IGUgfCBFIF0KKy4uCisuCisuXCIgUHJpbnQgaGVscCB0ZXh0IGZvciB1bml0cywgdXNlIHdpdGggYXJnIHRvIHByaW50IGh1bWFuCisuZGUgSEVMUF9VTklUUworLiAgUkIgKCBiICl5dGVzLAorLiAgUkIgKCBzICllY3RvcnMsCisuICBSQiAoIGsgKWlsb2J5dGVzLAorLiAgUkIgKCBtICllZ2FieXRlcywKKy4gIFJCICggZyApaWdhYnl0ZXMsCisuICBSQiAoIHQgKWVyYWJ5dGVzLAorLiAgUkIgKCBwIClldGFieXRlcywKKy4gIFJCICggZSApeGFieXRlcy4KKy4gIG5vcCBDYXBpdGFsaXNlIHRvIHVzZSBtdWx0aXBsZXMgb2YgMTAwMCAoUy5JLikgaW5zdGVhZCBvZiAxMDI0LgorLi4KKy4KKy5TSCBOQU1FCisuCitkbXN0YXRzIFwoZW0gZGV2aWNlLW1hcHBlciBzdGF0aXN0aWNzIG1hbmFnZW1lbnQKKy4KKy5TSCBTWU5PUFNJUworLgorLkIgZG1zZXR1cAorLkIgc3RhdHMKKy5JIGNvbW1hbmQKKy5SQiBbIG9wdGlvbnMgXQorLnNwCisuCisuUEQgMAorLkhQCisuQiBkbXN0YXRzCisuZGUgQ01EX0NPTU1BTkQKKy4gIGFkIGwKKy4gIElSIGNvbW1hbmQKKy4gIFJJIFsgZGV2aWNlX25hbWUKKy4gIFJCIHwgXC1cLXV1aWQKKy4gIElSIHV1aWQgfCBcZkJcLVwtbWFqb3IKKy4gIElSIG1ham9yCisuICBCUiBcLVwtbWlub3IKKy4gIElSIG1pbm9yIF0KKy4gIGFkIGIKKy4uCisuQ01EX0NPTU1BTkQKKy4KKy5IUAorLkIgZG1zdGF0cworLmRlIENNRF9DTEVBUgorLiAgYWQgbAorLiAgQlIgY2xlYXIKKy4gIElSIGRldmljZV9uYW1lCisuICBPUFRfUFJPR1JBTVMKKy4gIE9QVF9SRUdJT05TCisuICBhZCBiCisuLgorLkNNRF9DTEVBUgorLgorLkhQCisuQiBkbXN0YXRzCisuZGUgQ01EX0NSRUFURQorLiAgYWQgbAorLiAgQlIgY3JlYXRlCisuICBSQiBbIGRldmljZV9uYW1lLi4uCisuICBSQiB8IGZpbGVfcGF0aC4uLiBdCisuICBSQiBbIFwtXC1hbGxkZXZpY2VzIF0KKy4gIFJCIFsgXC1cLWFyZWFzCisuICBJUiBucl9hcmVhcyB8IFxmQlwtXC1hcmVhc2l6ZQorLiAgSVIgYXJlYV9zaXplIF0KKy4gIFJCIFsgXC1cLWJvdW5kcworLiAgSVIgXCVoaXN0b2dyYW1fYm91bmRhcmllcyBdCisuICBSQiBbIFwtXC1maWxlbWFwIF0KKy4gIFJCIFsgXC1cLW5vZ3JvdXAgXQorLiAgUkIgWyBcLVwtcHJlY2lzZSBdCisuICBSQiBbIFwtXC1zdGFydAorLiAgSVIgc3RhcnRfc2VjdG9yCisuICBCUiBcLVwtbGVuZ3RoCisuICBJUiBsZW5ndGggfCBcZkJcLVwtc2VnbWVudHMgXQorLiAgUkIgXCVbIFwtXC11c2VyZGF0YQorLiAgSVIgdXNlcl9kYXRhIF0KKy4gIFJCIFsgXC1cLXByb2dyYW1pZAorLiAgSVIgaWQgXQorLiAgYWQgYgorLi4KKy5DTURfQ1JFQVRFCisuCisuSFAKKy5CIGRtc3RhdHMKKy5kZSBDTURfREVMRVRFCisuICBhZCBsCisuICBCUiBkZWxldGUKKy4gIFJJIFsgZGV2aWNlX25hbWUgXQorLiAgUkIgWyBcLVwtYWxsZGV2aWNlcyBdCisuICBPUFRfUFJPR1JBTVMKKy4gIE9QVF9SRUdJT05TCisuICBhZCBiCisuLgorLkNNRF9ERUxFVEUKKy4KKy5IUAorLkIgZG1zdGF0cworLmRlIENNRF9HUk9VUAorLiAgYWQgbAorLiAgQlIgZ3JvdXAKKy4gIFJJIFsgZGV2aWNlX25hbWUgXQorLiAgUkIgWyBcLVwtYWxpYXMKKy4gIElSIG5hbWUgXQorLiAgUkIgWyBcLVwtYWxsZGV2aWNlcyBdCisuICBSQiBbIFwtXC1yZWdpb25zCisuICBJUiByZWdpb25zIF0KKy4gIGFkIGIKKy4uCisuQ01EX0dST1VQCisuSFAKKy5CIGRtc3RhdHMKKy5kZSBDTURfSEVMUAorLiAgYWQgbAorLiAgQlIgaGVscAorLiAgUkIgWyBcLWMgfCBcLUMgfCBcLVwtY29sdW1ucyBdCisuICBhZCBiCisuLgorLkNNRF9IRUxQCisuCisuSFAKKy5CIGRtc3RhdHMKKy5kZSBDTURfTElTVAorLiAgYWQgbAorLiAgQlIgbGlzdAorLiAgUkkgWyBkZXZpY2VfbmFtZSBdCisuICBSQiBbIFwtXC1oaXN0b2dyYW0gXQorLiAgT1BUX1BST0dSQU1TCisuICBSQiBbIFwtXC11bml0cworLiAgSVIgdW5pdHMgXQorLiAgT1BUX09CSkVDVFMKKy4gIFJCIFwlWyBcLVwtbm9zdWZmaXggXQorLiAgUkIgWyBcLVwtbm90aW1lc3VmZml4IF0KKy4gIFJCIFwlWyBcLXYgfCBcLVwtdmVyYm9zZSBbIFwtdiB8IFwtXC12ZXJib3NlIF1dCisuICBhZCBiCisuLgorLkNNRF9MSVNUCisuCisuSFAKKy5CIGRtc3RhdHMKKy5kZSBDTURfUFJJTlQKKy4gIGFkIGwKKy4gIEJSIHByaW50CisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4gIFJCIFsgXC1cLWNsZWFyIF0KKy4gIE9QVF9QUk9HUkFNUworLiAgT1BUX1JFR0lPTlMKKy4gIGFkIGIKKy4uCisuQ01EX1BSSU5UCisuCisuSFAKKy5CIGRtc3RhdHMKKy5kZSBDTURfUkVQT1JUCisuICBhZCBsCisuICBCUiByZXBvcnQKKy4gIFJJIFsgZGV2aWNlX25hbWUgXQorLiAgUkIgWyBcLVwtaW50ZXJ2YWwKKy4gIElSIHNlY29uZHMgXQorLiAgUkIgWyBcLVwtY291bnQKKy4gIElSIGNvdW50IF0KKy4gIFJCIFsgXC1cLXVuaXRzCisuICBJUiB1bml0cyBdCisuICBSQiBbIFwtXC1oaXN0b2dyYW0gXQorLiAgT1BUX1BST0dSQU1TCisuICBPUFRfUkVHSU9OUworLiAgT1BUX09CSkVDVFMKKy4gIFJCIFsgXC1PIHwgXC1cLXNvcnQKKy4gIElSIHNvcnRfZmllbGRzIF0KKy4gIFJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLiAgSVIgc2VsZWN0aW9uIF0KKy4gIFJCIFsgXC1cLXVuaXRzCisuICBJUiB1bml0cyBdCisuICBSQiBbIFwtXC1ub3N1ZmZpeCBdCisuICBSQiBcJVsgXC1cLW5vdGltZXN1ZmZpeCBdCisuICBhZCBiCisuLgorLkNNRF9SRVBPUlQKKy5IUAorLkIgZG1zdGF0cworLmRlIENNRF9VTkdST1VQCisuICBhZCBsCisuICBCUiB1bmdyb3VwCisuICBSSSBbIGRldmljZV9uYW1lIF0KKy4gIFJCIFsgXC1cLWFsbGRldmljZXMgXQorLiAgUkIgWyBcLVwtZ3JvdXBpZAorLiAgSVIgaWQgXQorLiAgYWQgYgorLi4KKy5DTURfVU5HUk9VUAorLgorLlBECisuYWQgYgorLgorLlNIIERFU0NSSVBUSU9OCisuCitUaGUgZG1zdGF0cyBwcm9ncmFtIG1hbmFnZXMgSU8gc3RhdGlzdGljcyByZWdpb25zIGZvciBkZXZpY2VzIHRoYXQgdXNlCit0aGUgZGV2aWNlLW1hcHBlciBkcml2ZXIuIFN0YXRpc3RpY3MgcmVnaW9ucyBtYXkgYmUgY3JlYXRlZCwgZGVsZXRlZCwKK2xpc3RlZCBhbmQgcmVwb3J0ZWQgb24gdXNpbmcgdGhlIHRvb2wuCisKK1RoZSBmaXJzdCBhcmd1bWVudCB0byBkbXN0YXRzIGlzIGEgXGZJY29tbWFuZFxmUC4KKworVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgXGZJZGV2aWNlIG5hbWVcZlAsCitcZkl1dWlkXGZQIG9yIFxmSW1ham9yXGZQIGFuZCBcZkltaW5vclxmUCBudW1iZXJzLgorCitGdXJ0aGVyIG9wdGlvbnMgcGVybWl0IHRoZSBzZWxlY3Rpb24gb2YgcmVnaW9ucywgb3V0cHV0IGZvcm1hdAorY29udHJvbCwgYW5kIHJlcG9ydGluZyBiZWhhdmlvdXIuCisKK1doZW4gbm8gZGV2aWNlIGFyZ3VtZW50IGlzIGdpdmVuIGRtc3RhdHMgd2lsbCBieSBkZWZhdWx0IG9wZXJhdGUgb24gYWxsCitkZXZpY2UtbWFwcGVyIGRldmljZXMgcHJlc2VudC4gVGhlIFxmQmNyZWF0ZVxmUCBhbmQgXGZCZGVsZXRlXGZQCitjb21tYW5kcyByZXF1aXJlIHRoZSB1c2Ugb2YgXGZCXC1cLWFsbGRldmljZXNcZlAgd2hlbiB1c2VkIGluIHRoaXMgd2F5LgorLgorLlNIIE9QVElPTlMKKy4KKy5IUAorLkJSIFwtXC1hbGlhcworLklSIG5hbWUKKy5icgorU3BlY2lmeSBhbiBhbGlhcyBuYW1lIGZvciBhIGdyb3VwLgorLgorLkhQCisuQlIgXC1cLWFsbGRldmljZXMKKy5icgorSWYgbm8gZGV2aWNlIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gYWxsb3cgb3BlcmF0aW9uIG9uIGFsbCBkZXZpY2VzIHdoZW4KK2NyZWF0aW5nIG9yIGRlbGV0aW5nIHJlZ2lvbnMuCisuCisuSFAKKy5CUiBcLVwtYWxscHJvZ3JhbXMKKy5icgorSW5jbHVkZSByZWdpb25zIGZyb20gYWxsIHByb2dyYW0gSURzIGZvciBsaXN0IGFuZCByZXBvcnQgb3BlcmF0aW9ucy4KKy5icgorLkhQCisuQlIgXC1cLWFsbHJlZ2lvbnMKKy5icgorSW5jbHVkZSBhbGwgcHJlc2VudCByZWdpb25zIGZvciBjb21tYW5kcyB0aGF0IG5vcm1hbGx5IGFjY2VwdCBhIHNpbmdsZQorcmVnaW9uIGlkZW50aWZpZXIuCisuCisuSFAKKy5CUiBcLVwtYXJlYQorLmJyCitXaGVuIHBlZm9ybWluZyBhIGxpc3Qgb3IgcmVwb3J0LCBpbmNsdWRlIG9iamVjdHMgb2YgdHlwZSBhcmVhIGluIHRoZQorcmVzdWx0cy4KKy4KKy5IUAorLkJSIFwtXC1hcmVhcworLklSIG5yX2FyZWFzCisuYnIKK1NwZWNpZnkgdGhlIG51bWJlciBvZiBzdGF0aXN0aWNzIGFyZWFzIHRvIGNyZWF0ZSB3aXRoaW4gYSBuZXcgcmVnaW9uLgorLgorLkhQCisuQlIgXC1cLWFyZWFzaXplCisuSVIgYXJlYV9zaXplIFxjCisuUkIgWyBcYworLlVOSVRTCisuYnIKK1NwZWNpZnkgdGhlIHNpemUgb2YgYXJlYXMgaW50byB3aGljaCBhIG5ldyByZWdpb24gc2hvdWxkIGJlIGRpdmlkZWQuIEFuCitvcHRpb25hbCBzdWZmaXggc2VsZWN0cyB1bml0cyBvZjoKKy5IRUxQX1VOSVRTCisuCisuSFAKKy5CUiBcLVwtY2xlYXIKKy5icgorV2hlbiBwcmludGluZyBzdGF0aXN0aWNzIGNvdW50ZXJzLCBhbHNvIGF0b21pY2FsbHkgcmVzZXQgdGhlbSB0byB6ZXJvLgorLgorLkhQCisuQlIgXC1cLWNvdW50CisuSVIgY291bnQKKy5icgorU3BlY2lmeSB0aGUgaXRlcmF0aW9uIGNvdW50IGZvciByZXBlYXRpbmcgcmVwb3J0cy4gSWYgdGhlIGNvdW50Cithcmd1bWVudCBpcyB6ZXJvIHJlcG9ydHMgd2lsbCBjb250aW51ZSB0byByZXBlYXQgdW50aWwgaW50ZXJydXB0ZWQuCisuCisuSFAKKy5CUiBcLVwtZ3JvdXAKKy5icgorV2hlbiBwZWZvcm1pbmcgYSBsaXN0IG9yIHJlcG9ydCwgaW5jbHVkZSBvYmplY3RzIG9mIHR5cGUgZ3JvdXAgaW4gdGhlCityZXN1bHRzLgorLgorLkhQCisuQlIgXC1cLWZpbGVtYXAKKy5icgorSW5zdGVhZCBvZiBjcmVhdGluZyByZWdpb25zIG9uIGEgZGV2aWNlIGFzIHNwZWNpZmllZCBieSBjb21tYW5kIGxpbmUKK29wdGlvbnMsIG9wZW4gdGhlIGZpbGUgZm91bmQgYXQgZWFjaCBcZkJmaWxlX3BhdGhcZlAgYXJndW1lbnQsIGFuZAorY3JlYXRlIHJlZ2lvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb25zIG9mIHRoZSBvbi1kaXNrIGV4dGVudHMKK2FsbG9jYXRlZCB0byB0aGUgZmlsZShzKS4KKy4KKy5IUAorLkJSIFwtXC1ncm91cGlkCisuSVIgaWQKKy5icgorU3BlY2lmeSB0aGUgZ3JvdXAgdG8gb3BlcmF0ZSBvbi4KKy4KKy5IUAorLkJSIFwtXC1ib3VuZHMKKy5JUiBoaXN0b2dyYW1fYm91bmRhcmllcyBcYworLlJCIFsgbnMgfCB1cyB8IG1zIHwgcyBdCisuYnIKK1NwZWNpZnkgdGhlIGJvdW5kYXJpZXMgb2YgYSBsYXRlbmN5IGhpc3RvZ3JhbSB0byBiZSB0cmFja2VkIGZvciB0aGUKK3JlZ2lvbiBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxhdGVuY3kgdmFsdWVzLiBMYXRlbmN5IHZhbHVlcyBhcmUKK2dpdmVuIGluIG5hbm9zZWNvbmRzLiBBbiBvcHRpb25hbCB1bml0IHN1ZmZpeCBvZgorLkJSIG5zICwKKy5CUiB1cyAsCisuQlIgbXMgLAorb3IgXGZCc1xmUCBtYXkgYmUgZ2l2ZW4gYWZ0ZXIgZWFjaCB2YWx1ZSB0byBzcGVjaWZ5IHVuaXRzIG9mCituYW5vc2Vjb25kcywgbWljcm9zZWNvbmRzLCBtaWxpc2Vjb25kcyBvciBzZWNvbmRzIHJlc3BlY3RpdmVseS4KKy4KKy5IUAorLkJSIFwtXC1oaXN0b2dyYW0KKy5icgorV2hlbiB1c2VkIHdpdGggdGhlIFxmQnJlcG9ydFxmUCBhbmQgXGZCbGlzdFxmUCBjb21tYW5kcyBzZWxlY3QgZGVmYXVsdAorZmllbGRzIHRoYXQgZW1waGFzaXplIGxhdGVuY3kgaGlzdG9ncmFtIGRhdGEuCisuCisuSFAKKy5CUiBcLVwtaW50ZXJ2YWwKKy5JUiBzZWNvbmRzCisuYnIKK1NwZWNpZnkgdGhlIGludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGl0ZXJhdGlvbnMgZm9yCityZXBlYXRpbmcgcmVwb3J0cy4gSWYgXGZCXC1cLWludGVydmFsXGZQIGlzIHNwZWNpZmllZCBidXQKK1xmQlwtXC1jb3VudFxmUCBpcyBub3QsCityZXBvcnRzIHdpbGwgY29udGludWUgdG8gcmVwZWF0IHVudGlsIGludGVycnVwdGVkLgorLgorLkhQCisuQlIgXC1cLWxlbmd0aAorLklSIGxlbmd0aCBcYworLlJCIFsgXGMKKy5VTklUUworLmJyCitTcGVjaWZ5IHRoZSBsZW5ndGggb2YgYSBuZXcgc3RhdGlzdGljcyByZWdpb24gaW4gc2VjdG9ycy4gQW4gb3B0aW9uYWwKK3N1ZmZpeCBzZWxlY3RzIHVuaXRzIG9mOgorLkhFTFBfVU5JVFMKKy4KKy5IUAorLkJSIFwtaiB8IFwtXC1tYWpvcgorLklSIG1ham9yCisuYnIKK1NwZWNpZnkgdGhlIG1ham9yIG51bWJlci4KKy4KKy5IUAorLkJSIFwtbSB8IFwtXC1taW5vcgorLklSIG1pbm9yCisuYnIKK1NwZWNpZnkgdGhlIG1pbm9yIG51bWJlci4KKy4KKy5IUAorLkJSIFwtXC1ub2dyb3VwCisuYnIKK1doZW4gY3JlYXRpbmcgcmVnaW9ucyBtYXBwaW5nIHRoZSBleHRlbnRzIG9mIGEgZmlsZSBpbiB0aGUgZmlsZQorc3lzdGVtLCBkbyBub3QgY3JlYXRlIGEgZ3JvdXAgb3Igc2V0IGFuIGFsaWFzLgorLgorLkhQCisuQlIgXC1cLW5vc3VmZml4CisuYnIKK1N1cHByZXNzIHRoZSBzdWZmaXggb24gb3V0cHV0IHNpemVzLiAgVXNlIHdpdGggXGZCXC1cLXVuaXRzXGZQCisoZXhjZXB0IGggYW5kIEgpIGlmIHByb2Nlc3NpbmcgdGhlIG91dHB1dC4KKy4KKy5IUAorLkJSIFwtXC1ub3RpbWVzdWZmaXgKKy5icgorU3VwcHJlc3MgdGhlIHN1ZmZpeCBvbiBvdXRwdXQgdGltZSB2YWx1ZXMuIEhpc3RvZ3JhbSBib3VuZGFyeSB2YWx1ZXMKK3dpbGwgYmUgcmVwb3J0ZWQgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMuCisuCisuSFAKKy5CUiBcLW8gfCBcLVwtb3B0aW9ucworLmJyCitTcGVjaWZ5IHdoaWNoIHJlcG9ydCBmaWVsZHMgdG8gZGlzcGxheS4KKy4KKy5IUAorLkJSIFwtTyB8IFwtXC1zb3J0CisuSVIgc29ydF9maWVsZHMKKy5icgorU29ydCBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyBnaXZlbi4gUHJlY2VkZSBhbnkKK3NvcnQgZmllbGQgd2l0aCAnXGZCLVxmUCcgZm9yIGEgcmV2ZXJzZSBzb3J0IG9uIHRoYXQgY29sdW1uLgorLgorLkhQCisuQlIgXC1cLXByZWNpc2UKKy5icgorQXR0ZW1wdCB0byB1c2UgbmFub3NlY29uZCBwcmVjaXNpb24gY291bnRlcnMgd2hlbiBjcmVhdGluZyBuZXcKK3N0YXRpc3RpY3MgcmVnaW9ucy4KKy4KKy5IUAorLkJSIFwtXC1wcm9ncmFtaWQKKy5JUiBpZAorLmJyCitTcGVjaWZ5IGEgcHJvZ3JhbSBJRCBzdHJpbmcuIFdoZW4gY3JlYXRpbmcgbmV3IHN0YXRpc3RpY3MgcmVnaW9ucyB0aGlzCitzdHJpbmcgaXMgc3RvcmVkIHdpdGggdGhlIHJlZ2lvbi4gU3Vic2VxdWVudCBvcGVyYXRpb25zIG1heSBzdXBwbHkgYQorcHJvZ3JhbSBJRCBpbiBvcmRlciB0byBzZWxlY3Qgb25seSByZWdpb25zIHdpdGggYSBtYXRjaGluZyB2YWx1ZS4gVGhlCitkZWZhdWx0IHByb2dyYW0gSUQgZm9yIGRtc3RhdHMtbWFuYWdlZCByZWdpb25zIGlzICJkbXN0YXRzIi4KKy4KKy5IUAorLkJSIFwtXC1yZWdpb24KKy5icgorV2hlbiBwZWZvcm1pbmcgYSBsaXN0IG9yIHJlcG9ydCwgaW5jbHVkZSBvYmplY3RzIG9mIHR5cGUgcmVnaW9uIGluIHRoZQorcmVzdWx0cy4KKy4KKy5IUAorLkJSIFwtXC1yZWdpb25pZAorLklSIGlkCisuYnIKK1NwZWNpZnkgdGhlIHJlZ2lvbiB0byBvcGVyYXRlIG9uLgorLgorLkhQCisuQlIgXC1cLXJlZ2lvbnMKKy5JUiByZWdpb25fbGlzdAorLmJyCitTcGVjaWZ5IGEgbGlzdCBvZiByZWdpb25zIHRvIGdyb3VwLiBUaGUgZ3JvdXAgbGlzdCBpcyBhIGNvbW1hLXNlcGFyYXRlZAorbGlzdCBvZiByZWdpb24gaWRlbnRpZmllcnMuIENvbnRpbnVvdXMgc2VxdWVuY2VzIG9mIGlkZW50aWZpZXJzIG1heSBiZQorZXhwcmVzc2VkIGFzIGEgaHlwaGVuIHNlcGFyYXRlZCByYW5nZSwgZm9yIGV4YW1wbGU6ICcxLTEwJy4KKy4KKy5IUAorLkJSIFwtXC1yZWxhdGl2ZQorLmJyCitJZiBkaXNwbGF5aW5nIHRoZSBoaXN0b2dyYW0gcmVwb3J0IHNob3cgcmVsYXRpdmUgKHBlcmNlbnRhZ2UpIHZhbHVlcworaW5zdGVhZCBvZiBhYnNvbHV0ZSBjb3VudHMuCisuCisuSFAKKy5CUiBcLVMgfCBcLVwtc2VsZWN0CisuSVIgc2VsZWN0aW9uCisuYnIKK0Rpc3BsYXkgb25seSByb3dzIHRoYXQgbWF0Y2ggXGZJc2VsZWN0aW9uXGZQIGNyaXRlcmlhLiBBbGwgcm93cyB3aXRoIHRoZQorYWRkaXRpb25hbCAic2VsZWN0ZWQiIGNvbHVtbiAoXGZCXC1vIHNlbGVjdGVkXGZQKSBzaG93aW5nIDEgaWYgdGhlIHJvdyBtYXRjaGVzCit0aGUgXGZJc2VsZWN0aW9uXGZQIGFuZCAwIG90aGVyd2lzZS4gVGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgZGVmaW5lZCBieQorc3BlY2lmeWluZyBjb2x1bW4gbmFtZXMgYW5kIHRoZWlyIHZhbGlkIHZhbHVlcyB3aGlsZSBtYWtpbmcgdXNlIG9mCitzdXBwb3J0ZWQgY29tcGFyaXNvbiBvcGVyYXRvcnMuCisuCisuSFAKKy5CUiBcLVwtc3RhcnQKKy5JUiBzdGFydCBcYworLlJCIFsgXGMKKy5VTklUUworLmJyCitTcGVjaWZ5IHRoZSBzdGFydCBvZmZzZXQgb2YgYSBuZXcgc3RhdGlzdGljcyByZWdpb24gaW4gc2VjdG9ycy4gQW4KK29wdGlvbmFsIHN1ZmZpeCBzZWxlY3RzIHVuaXRzIG9mOgorLkhFTFBfVU5JVFMKKy4KKy5IUAorLkJSIFwtXC1zZWdtZW50cworLmJyCitXaGVuIHVzZWQgd2l0aCBcZkJjcmVhdGVcZlAsIGNyZWF0ZSBhIG5ldyBzdGF0aXN0aWNzIHJlZ2lvbiBmb3IgZWFjaAordGFyZ2V0IGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gZGV2aWNlKHMpLiBUaGlzIGNhdXNlcyBhIHNlcGFyYXRlIHJlZ2lvbgordG8gYmUgYWxsb2NhdGVkIGZvciBlYWNoIHNlZ21lbnQgb2YgdGhlIGRldmljZS4KKworVGhlIG5ld2x5IGNyZWF0ZWQgcmVnaW9ucyBhcmUgYXV0b21hdGljYWxseSBwbGFjZWQgaW50byBhIGdyb3VwIHVubGVzcwordGhlIFxmQlwtXC1ub2dyb3VwXGZQIG9wdGlvbiBpcyBnaXZlbi4gV2hlbiBncm91cGluZyBpcyBlbmFibGVkIGEgZ3JvdXAKK2FsaWFzIG1heSBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIFxmQlwtXC1hbGlhc1xmUCBvcHRpb24uCisuCisuSFAKKy5CUiBcLVwtdW5pdHMKKy5SSSBbIHVuaXRzIF0gXGMKKy5SQiBbIGggfCBIIHwgXGMKKy5VTklUUworLmJyCitTZXQgdGhlIGRpc3BsYXkgdW5pdHMgZm9yIHJlcG9ydCBvdXRwdXQuCitBbGwgc2l6ZXMgYXJlIG91dHB1dCBpbiB0aGVzZSB1bml0czoKKy5SQiAoIGggKXVtYW4tcmVhZGFibGUsCisuSEVMUF9VTklUUworQ2FuIGFsc28gc3BlY2lmeSBjdXN0b20gdW5pdHMgZS5nLiBcZkJcLVwtdW5pdHNcIDNNXGZQLgorLgorLkhQCisuQlIgXC1cLXVzZXJkYXRhCisuSVIgdXNlcl9kYXRhCisuYnIKK1NwZWNpZnkgdXNlciBkYXRhIChhIHdvcmQpIHRvIGJlIHN0b3JlZCB3aXRoIGEgbmV3IHJlZ2lvbi4gVGhlIHZhbHVlCitpcyBhZGRlZCB0byBhbnkgaW50ZXJuYWwgYXV4aWxsaWFyeSBkYXRhIChmb3IgZXhhbXBsZSwgZ3JvdXAKK2luZm9ybWF0aW9uKSwgYW5kIHN0b3JlZCB3aXRoIHRoZSByZWdpb24gaW4gdGhlIGF1eF9kYXRhIGZpZWxkIHByb3ZpZGVkCitieSB0aGUga2VybmVsLiBXaGl0ZXNwYWNlIGlzIG5vdCBwZXJtaXR0ZWQuCisuCisuSFAKKy5CUiBcLXUgfCBcLVwtdXVpZAorLmJyCitTcGVjaWZ5IHRoZSB1dWlkLgorLgorLkhQCisuQlIgXC12IHwgXC1cLXZlcmJvc2UgIiBbIiBcLXYgfCBcLVwtdmVyYm9zZSBdCisuYnIKK1Byb2R1Y2UgYWRkaXRpb25hbCBvdXRwdXQuCisuCisuU0ggQ09NTUFORFMKKy4KKy5IUAorLkNNRF9DTEVBUgorLmJyCitJbnN0cnVjdHMgdGhlIGtlcm5lbCB0byBjbGVhciBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciB0aGUgc3BlZmljaWVkCityZWdpb25zICh3aXRoIHRoZSBleGNlcHRpb24gb2YgaW4tZmxpZ2h0IElPIGNvdW50ZXJzKS4KKy4KKy5IUAorLkNNRF9DUkVBVEUKKy5icgorQ3JlYXRlcyBvbmUgb3IgbW9yZSBuZXcgc3RhdGlzdGljcyByZWdpb25zIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlKHMpLgorCitUaGUgcmVnaW9uIHdpbGwgc3BhbiB0aGUgZW50aXJlIGRldmljZSB1bmxlc3MgXGZCXC1cLXN0YXJ0XGZQIGFuZAorXGZCXC1cLWxlbmd0aFxmUCBvciBcZkJcLVwtdGFyZ2V0XGZQIGFyZSBnaXZlbi4gVGhlIFxmQlwtXC1zdGFydFxmUCBhbmQKK1xmQlwtXC1sZW5ndGhcZlAgb3B0aW9ucyBhbGxvdyBhIHJlZ2lvbiBvZiBhcmJpdHJhcnkgbGVuZ3RoIHRvIGJlIHBsYWNlZAorYXQgYW4gYXJiaXRyYXJ5IG9mZnNldCBpbnRvIHRoZSBkZXZpY2UuIFRoZSBcZkJcLVwtc2VnbWVudHNcZlAgb3B0aW9uCitjYXVzZXMgYSBuZXcgcmVnaW9uIHRvIGJlIGNyZWF0ZWQgZm9yIGVhY2ggdGFyZ2V0IGluIHRoZSBjb3JyZXNwb25kaW5nCitkZXZpY2UtbWFwcGVyIGRldmljZSdzIHRhYmxlLgorCitJZiB0aGUgXGZCXC1cLXByZWNpc2VcZlAgb3B0aW9uIGlzIHVzZWQgdGhlIGNvbW1hbmQgd2lsbCBhdHRlbXB0IHRvCitjcmVhdGUgYSByZWdpb24gdXNpbmcgbmFub3NlY29uZCBwcmVjaXNpb24gY291bnRlcnMuCisKK0lmIFxmQlwtXC1ib3VuZHNcZlAgaXMgZ2l2ZW4gYSBsYXRlbmN5IGhpc3RvZ3JhbSB3aWxsIGJlIHRyYWNrZWQgZm9yCit0aGUgbmV3IHJlZ2lvbi4gVGhlIGJvdW5kYXJpZXMgb2YgdGhlIGhpc3RvZ3JhbSBiaW5zIGFyZSBnaXZlbiBhcyBhCitjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsYXRlbmN5IHZhbHVlcy4gVGhlcmUgaXMgYW4gaW1wbGljaXQgbG93ZXIgYm91bmQKK29mIHplcm8gb24gdGhlIGZpcnN0IGJpbiBhbmQgYW4gaW1wbGljaXQgdXBwZXIgYm91bmQgb2YgaW5maW5pdHkgKG9yIHRoZQorY29uZmlndXJlZCBpbnRlcnZhbCBkdXJhdGlvbikgb24gdGhlIGZpbmFsIGJpbi4KKworTGF0ZW5jaWVzIGFyZSBnaXZlbiBpbiBuYW5vc2Vjb25kcy4gQW4gb3B0aW9uYWwgdW5pdCBzdWZmaXggb2YgbnMsIHVzLAorbXMsIG9yIHMgbWF5IGJlIGdpdmVuIGFmdGVyIGVhY2ggdmFsdWUgdG8gc3BlY2lmeSB1bml0cyBvZiBuYW5vc2Vjb25kcywKK21pY3Jvc2Vjb25kcywgbWlsaXNlY29uZHMgb3Igc2Vjb25kcyByZXNwZWN0aXZlbHksIHNvIGZvciBleGFtcGxlLCAxMG1zCitpcyBlcXVpdmFsZW50IHRvIDEwMDAwMDAwLiBMYXRlbmN5IHZhbHVlcyB3aXRoIGEgcHJlY2lzaW9uIG9mIGxlc3MgdGhhbgorb25lIG1pbGlzZWNvbmQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHByZWNpc2UgdGltZXN0YW1wcyBhcmUgZW5hYmxlZDogaWYKK1xmQlwtXC1wcmVjaXNlXGZQIGlzIG5vdCBnaXZlbiBhbmQgdmFsdWVzIGxlc3MgdGhhbiBvbmUgbWlsaXNlY29uZCBhcmUKK3VzZWQgaXQgd2lsbCBiZSBlbmFibGVkIGF1dG9tYXRpY2FsbHkuCisKK0FuIG9wdGlvbmFsIFxmQnByb2dyYW1faWRcZlAgb3IgXGZCdXNlcl9kYXRhXGZQIHN0cmluZyBtYXkgYmUgYXNzb2NpYXRlZAord2l0aCB0aGUgcmVnaW9uLiBBIFxmQnByb2dyYW1faWRcZlAgbWF5IHRoZW4gYmUgdXNlZCB0byBzZWxlY3QgcmVnaW9ucworZm9yIHN1YnNlcXVlbnQgbGlzdCwgcHJpbnQsIGFuZCByZXBvcnQgb3BlcmF0aW9ucy4gVGhlIFxmQnVzZXJfZGF0YVxmUAorc3RvcmVzIGFuIGFyYml0cmFyeSBzdHJpbmcgYW5kIGlzIG5vdCB1c2VkIGJ5IGRtc3RhdHMgb3IgdGhlCitkZXZpY2UtbWFwcGVyIGtlcm5lbCBzdGF0aXN0aWNzIHN1YnN5c3RlbS4KKworQnkgZGVmYXVsdCBkbXN0YXRzIGNyZWF0ZXMgcmVnaW9ucyB3aXRoIGEgXGZCcHJvZ3JhbV9pZFxmUCBvZgorImRtc3RhdHMiLgorCitPbiBzdWNjZXNzIHRoZSBcZkJyZWdpb25faWRcZlAgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgcmVnaW9uIGlzIHByaW50ZWQKK3RvIHN0ZG91dC4KKworSWYgdGhlIFxmQlwtXC1maWxlbWFwXGZQIG9wdGlvbiBpcyBnaXZlbiB3aXRoIGEgcmVndWxhciBmaWxlLCBvciBsaXN0CitvZiBmaWxlcywgYXMgdGhlIFxmQmZpbGVfcGF0aFxmUCBhcmd1bWVudCwgaW5zdGVhZCBvZiBjcmVhdGluZyByZWdpb25zCit3aXRoIHBhcmFtZXRlcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIFxmQmRtc3RhdHNcZlAgd2lsbCBvcGVuCit0aGUgZmlsZXMgbG9jYXRlZCBhdCBcZkJmaWxlX3BhdGhcZlAgYW5kIGNyZWF0ZSByZWdpb25zIGNvcnJlc3BvbmRpbmcgdG8KK3RoZSBwaHlzaWNhbCBleHRlbnRzIGFsbG9jYXRlZCB0byB0aGUgZmlsZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBtb25pdG9yCitzdGF0aXN0aWNzIGZvciBpbmRpdmlkdWFsIGZpbGVzIGluIHRoZSBmaWxlIHN5c3RlbSwgZm9yIGV4YW1wbGUsIHZpcnR1YWwKK21hY2hpbmUgaW1hZ2VzLCBzd2FwIGFyZWFzLCBvciBsYXJnZSBkYXRhYmFzZSBmaWxlcy4KKworVG8gd29yayB3aXRoIHRoZSBcZkJcLVwtZmlsZW1hcFxmUCBvcHRpb24sIGZpbGVzIG11c3QgYmUgbG9jYXRlZCBvbiBhCitsb2NhbCBmaWxlIHN5c3RlbSwgYmFja2VkIGJ5IGEgZGV2aWNlLW1hcHBlciBkZXZpY2UsIHRoYXQgc3VwcG9ydHMKK3BoeXNpY2FsIGV4dGVudCBkYXRhIHVzaW5nIHRoZSBGSUVNQVAgaW9jdGwgKEV4dDQgYW5kIFhGUyBmb3IgZS5nLikuCisKK0J5IGRlZmF1bHQgcmVnaW9ucyB0aGF0IG1hcCBhIGZpbGUgYXJlIHBsYWNlZCBpbnRvIGEgZ3JvdXAgYW5kIHRoZQorZ3JvdXAgYWxpYXMgaXMgc2V0IHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZmlsZS4gVGhpcyBiZWhhdmlvdXIgY2FuIGJlCitvdmVycmlkZGVuIHdpdGggdGhlIFxmQlwtXC1hbGlhc1xmUCBhbmQgXGZCXC1cLW5vZ3JvdXBcZlAgb3B0aW9ucy4KKworVXNlIHRoZSBcZkJcLVwtZ3JvdXBcZlAgb3B0aW9uIHRvIG9ubHkgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3IgZ3JvdXBzCit3aGVuIGxpc3RpbmcgYW5kIHJlcG9ydGluZy4KKy4KKy5IUAorLkNNRF9ERUxFVEUKKy5icgorRGVsZXRlIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljcyByZWdpb24uIEFsbCBjb3VudGVycyBhbmQgcmVzb3VyY2VzIHVzZWQKK2J5IHRoZSByZWdpb24gYXJlIHJlbGVhc2VkIGFuZCB0aGUgcmVnaW9uIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0CitvZiBzdWJzZXF1ZW50IGxpc3QsIHByaW50LCBvciByZXBvcnQgb3BlcmF0aW9ucy4KKworQWxsIHJlZ2lvbnMgcmVnaXN0ZXJlZCBvbiBhIGRldmljZSBtYXkgYmUgcmVtb3ZlZCB1c2luZworXGZCXC1cLWFsbHJlZ2lvbnNcZlAuCisKK1RvIHJlbW92ZSBhbGwgcmVnaW9ucyBvbiBhbGwgZGV2aWNlcyBib3RoIFxmQlwtXC1hbGxyZWdpb25zXGZQIGFuZAorXGZCXC1cLWFsbGRldmljZXNcZlAgbXVzdCBiZSB1c2VkLgorCitJZiBhIFxmQlwtXC1ncm91cGlkXGZQIGlzIGdpdmVuIGluc3RlYWQgb2YgYSBcZkJcLVwtcmVnaW9uaWRcZlAgdGhlCitjb21tYW5kIHdpbGwgYXR0ZW1wdCB0byBkZWxldGUgdGhlIGdyb3VwIGFuZCBhbGwgcmVnaW9ucyB0aGF0IGl0Citjb250YWlucy4KKworSWYgYSBkZWxldGVkIHJlZ2lvbiBpcyB0aGUgZmlyc3QgbWVtYmVyIG9mIGEgZ3JvdXAgb2YgcmVnaW9ucyB0aGUgZ3JvdXAKK3dpbGwgYWxzbyBiZSByZW1vdmVkLgorLgorLkhQCisuQ01EX0dST1VQCisuYnIKK0NvbWJpbmUgb25lIG9yIG1vcmUgc3RhdGlzdGljcyByZWdpb25zIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGludG8gYQorZ3JvdXAuCisKK1RoZSBsaXN0IG9mIHJlZ2lvbnMgdG8gYmUgZ3JvdXBlZCBpcyBzcGVjaWZpZWQgd2l0aCBcZkJcLVwtcmVnaW9uc1xmUAorYW5kIGFuIG9wdGlvbmFsIGFsaWFzIG1heSBiZSBhc3NpZ25lZCB3aXRoIFxmQlwtXC1hbGlhc1xmUC4gVGhlIHNldCBvZgorcmVnaW9ucyBpcyBnaXZlbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlZ2lvbiBpZGVudGlmaWVycy4gQQorY29udGludW91cyByYW5nZSBvZiBpZGVudGlmZXJzIHNwYW5uaW5nIGZyb20gXGZCUjFcZlAgdG8gXGZCUjJcZlAgbWF5CitiZSBleHByZXNzZWQgYXMgJ1xmQlIxXGZQLVxmQlIyXGZQJy4KKworUmVnaW9ucyB0aGF0IGhhdmUgYSBoaXN0b2dyYW0gY29uZmlndXJlZCBjYW4gYmUgZ3JvdXBlZDogaW4gdGhpcyBjYXNlCit0aGUgbnVtYmVyIG9mIGhpc3RvZ3JhbSBiaW5zIGFuZCB0aGVpciBib3VuZHMgbXVzdCBtYXRjaCBleGFjdGx5LgorCitPbiBzdWNjZXNzIHRoZSBncm91cCBsaXN0IGFuZCBuZXdseSBjcmVhdGVkIFxmQmdyb3VwX2lkXGZQIGFyZQorcHJpbnRlZCB0byBzdGRvdXQuCisuCisuSFAKKy5DTURfSEVMUAorLmJyCitPdXRwdXRzIGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZHMgYXZhaWxhYmxlLCBvcHRpb25hbGx5IGluY2x1ZGluZwordGhlIGxpc3Qgb2YgcmVwb3J0IGZpZWxkcy4KKy4KKy5IUAorLkNNRF9MSVNUCisuYnIKK0xpc3QgdGhlIHN0YXRpc3RpY3MgcmVnaW9ucywgYXJlYXMsIG9yIGdyb3VwcyByZWdpc3RlcmVkIG9uIHRoZSBkZXZpY2UuCitJZiB0aGUgXGZCXC1cLWFsbHByb2dyYW1zXGZQIHN3aXRjaCBpcyBnaXZlbiBhbGwgcmVnaW9ucyB3aWxsIGJlIGxpc3RlZAorcmVnYXJkbGVzcyBvZiByZWdpb24gcHJvZ3JhbSBJRCB2YWx1ZXMuCisKK0J5IGRlZmF1bHQgb25seSByZWdpb25zIGFuZCBncm91cHMgYXJlIGluY2x1ZGVkIGluIGxpc3Qgb3V0cHV0LiBJZgorXGZCXC12XGZQIG9yIFxmQlwtXC12ZXJib3NlXGZQIGlzIGdpdmVuIHRoZSByZXBvcnQgd2lsbCBhbHNvIGluY2x1ZGUgYQorcm93IG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIGNvbmZpZ3VyZWQgZ3JvdXAgYW5kIGZvciBlYWNoIGFyZWEgY29udGFpbmVkCitpbiBlYWNoIHJlZ2lvbiBkaXNwbGF5ZWQuCisKK1JlZ2lvbnMgdGhhdCBjb250YWluIGEgc2luZ2xlIGFyZWEgYXJlIGJ5IGRlZmF1bHQgb21pdHRlZCBmcm9tIHRoZQordmVyYm9zZSBsaXN0IHNpbmNlIHRoZWlyIHByb3BlcnRpZXMgYXJlIGlkZW50aWNhbCB0byB0aGUgYXJlYSB0aGF0IHRoZXkKK2NvbnRhaW4gLSB0byB2aWV3IGFsbCByZWdpb25zIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBhcmVhcyBwcmVzZW50Cit1c2UgXGZCXC1cLXJlZ2lvblxmUCkuIFRvIGFsc28gdmlldyB0aGUgYXJlYXMgY29udGFpbmVkIHdpdGhpbiByZWdpb25zCit1c2UgXGZCXC1cLWFyZWFcZlAuCisKK0lmIFxmQlwtXC1oaXN0b2dyYW1cZlAgaXMgZ2l2ZW4gdGhlIHJlcG9ydCB3aWxsIGluY2x1ZGUgdGhlIGJpbiBjb3VudAorYW5kIGxhdGVuY3kgYm91bmRhcnkgdmFsdWVzIGZvciBhbnkgY29uZmlndXJlZCBoaXN0b2dyYW1zLgorLkhQCisuQ01EX1BSSU5UCisuYnIKK1ByaW50IHJhdyBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvciBmb3IgYWxsCitwcmVzZW50IHJlZ2lvbnMuCisuCisuSFAKKy5DTURfUkVQT1JUCisuYnIKK1N0YXJ0IGEgcmVwb3J0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBvciBmb3IgYWxsIHByZXNlbnQgb2JqZWN0cy4gSWYKK3RoZSBjb3VudCBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoZSByZXBvcnQgd2lsbCByZXBlYXQgYXQgYSBmaXhlZAoraW50ZXJ2YWwgc2V0IGJ5IHRoZSBcZkJcLVwtaW50ZXJ2YWxcZlAgb3B0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcworb25lIHNlY29uZC4KKworSWYgdGhlIFxmQlwtXC1hbGxwcm9ncmFtc1xmUCBzd2l0Y2ggaXMgZ2l2ZW4sIGFsbCByZWdpb25zIHdpbGwgYmUKK2xpc3RlZCwgcmVnYXJkbGVzcyBvZiByZWdpb24gcHJvZ3JhbSBJRCB2YWx1ZXMuCisKK0lmIHRoZSBcZkJcLVwtaGlzdG9ncmFtXGZQIGlzIGdpdmVuIHRoZSByZXBvcnQgd2lsbCBpbmNsdWRlIHRoZSBoaXN0b2dyYW0KK3ZhbHVlcyBhbmQgbGF0ZW5jeSBib3VuZGFyaWVzLgorCitJZiB0aGUgXGZCXC1cLXJlbGF0aXZlXGZQIGlzIHVzZWQgdGhlIGRlZmF1bHQgaGlzdG9ncmFtIGZpZWxkIGRpc3BsYXlzCitiaW4gdmFsdWVzIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIEkvT3MuCisKK09iamVjdCB0eXBlcyAoYXJlYXMsIHJlZ2lvbnMgYW5kIGdyb3VwcykgdG8gaW5jbHVkZSBpbiB0aGUgcmVwb3J0IGFyZQorc2VsZWN0ZWQgdXNpbmcgdGhlIFxmQlwtXC1hcmVhXGZQLCBcZkJcLVwtcmVnaW9uXGZQLCBhbmQgXGZCXC1cLWdyb3VwXGZQCitvcHRpb25zLgorLgorLkhQCisuQ01EX1VOR1JPVVAKKy5icgorUmVtb3ZlIGFuIGV4aXN0aW5nIGdyb3VwIGFuZCByZXR1cm4gYWxsIHRoZSBncm91cCdzIHJlZ2lvbnMgdG8gdGhlaXIKK29yaWdpbmFsIHN0YXRlLgorCitUaGUgZ3JvdXAgdG8gYmUgcmVtb3ZlZCBpcyBzcGVjaWZpZWQgdXNpbmcgXGZCXC1cLWdyb3VwaWRcZlAuCisuCisuU0ggUkVHSU9OUywgQVJFQVMsIEFORCBHUk9VUFMKKy4KK1RoZSBkZXZpY2UtbWFwcGVyIHN0YXRpc3RpY3MgZmFjaWxpdHkgYWxsb3dzIHNlcGFyYXRlIHBlcmZvcm1hbmNlCitjb3VudGVycyB0byBiZSBtYWludGFpbmVkIGZvciBhcmJpdHJhcnkgcmVnaW9ucyBvZiBkZXZpY2VzLiBBIHJlZ2lvbiBtYXkKK3NwYW4gYW55IHJhbmdlOiBmcm9tIGEgc2luZ2xlIHNlY3RvciB0byB0aGUgd2hvbGUgZGV2aWNlLiBBIHJlZ2lvbiBtYXkKK2JlIGZ1cnRoZXIgc3ViLWRpdmlkZWQgaW50byBhIG51bWJlciBvZiBkaXN0aW5jdCBhcmVhcyAob25lIG9yIG1vcmUpLAorZWFjaCB3aXRoIGl0cyBvd24gY291bnRlciBzZXQuIEluIHRoaXMgY2FzZSBhIHN1bW1hcnkgdmFsdWUgZm9yIHRoZQorZW50aXJlIHJlZ2lvbiBpcyBhbHNvIGF2YWlsYWJsZSBmb3IgdXNlIGluIHJlcG9ydHMuCisKK0luIGFkZGl0aW9uLCBvbmUgb3IgbW9yZSByZWdpb25zIG9uIG9uZSBkZXZpY2UgY2FuIGJlIGNvbWJpbmVkIGludG8KK2Egc3RhdGlzdGljcyBncm91cCBhbGxvd2luZyByZXBvcnRpbmcgb2YgYWdncmVnYXRlIHZhbHVlcyBmb3IgYWxsCityZWdpb25zIGFuZCBhcmVhcyBtYWtpbmcgdXAgdGhlIGdyb3VwLgorCitCeSBkZWZhdWx0IG5ldyByZWdpb25zIHNwYW4gdGhlIGVudGlyZSBkZXZpY2UuIFRoZSBcZkJcLVwtc3RhcnRcZlAgYW5kCitcZkJcLVwtbGVuZ3RoXGZQIG9wdGlvbnMgYWxsb3dzIGEgcmVnaW9uIG9mIGFueSBzaXplIHRvIGJlIHBsYWNlZCBhdCBhbnkKK2xvY2F0aW9uIG9uIHRoZSBkZXZpY2UuCisKK1VzaW5nIG9mZnNldHMgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIHJlZ2lvbnMgdGhhdCBtYXAgaW5kaXZpZHVhbAorb2JqZWN0cyB3aXRoaW4gYSBibG9jayBkZXZpY2UgKGZvciBleGFtcGxlOiBwYXJ0aXRpb25zLCBmaWxlcyBpbiBhIGZpbGUKK3N5c3RlbSwgb3Igc3RyaXBlcyBvciBvdGhlciBzdHJ1Y3R1cmVzIGluIGEgUkFJRCB2b2x1bWUpLiBHcm91cHMgYWxsb3cKK3NldmVyYWwgbm9uLWNvbnRpZ3VvdXMgcmVnaW9ucyB0byBiZSBhc3NlbWJsZWQgdG9nZXRoZXIgZm9yIHJlcG9ydGluZworYW5kIGRhdGEgYWdncmVnYXRpb24uCisKK0EgcmVnaW9uIG1heSBiZSBlaXRoZXIgZGl2aWRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVxdWFsLXNpemVkCithcmVhcywgb3IgaW50byBhcmVhcyBvZiB0aGUgZ2l2ZW4gc2l6ZSBieSBzcGVjaWZ5aW5nIG9uZSBvZgorXGZCXC1cLWFyZWFzXGZQIG9yIFxmQlwtXC1hcmVhc2l6ZVxmUCB3aGVuIGNyZWF0aW5nIGEgcmVnaW9uIHdpdGggdGhlCitcZkJjcmVhdGVcZlAgY29tbWFuZC4gRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBhcmVhcyBhbmQgdGhlIGRldmljZQorcmVnaW9uIHRoZSBmaW5hbCBhcmVhIHdpdGhpbiB0aGUgcmVnaW9uIG1heSBiZSBzbWFsbGVyIHRoYW4gcmVxdWVzdGVkLgorLlAKKy5CIFJlZ2lvbiBpZGVudGlmaWVycworLlAKK0VhY2ggcmVnaW9uIGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgd2hlbiBpdCBpcyBjcmVhdGVkIHRoYXQgaXMgdXNlZCB0bworcmVmZXJlbmNlIHRoZSByZWdpb24gaW4gc3Vic2VxdWVudCBvcGVyYXRpb25zLiBSZWdpb24gaWRlbnRpZmllcnMgYXJlCit1bmlxdWUgd2l0aGluIGEgZ2l2ZW4gZGV2aWNlIChpbmNsdWRpbmcgYWNyb3NzIGRpZmZlcmVudCBcZkJwcm9ncmFtX2lkXGZQCit2YWx1ZXMpLgorCitEZXBlbmRpbmcgb24gdGhlIHNlcXVlbmNlIG9mIGNyZWF0ZSBhbmQgZGVsZXRlIG9wZXJhdGlvbnMsIGdhcHMgbWF5CitleGlzdCBpbiB0aGUgc2VxdWVuY2Ugb2YgXGZCcmVnaW9uX2lkXGZQIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyIGRldmljZS4KKworVGhlIFxmQnJlZ2lvbl9pZFxmUCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBvcGFxdWUgaWRlbnRpZmllciB1c2VkIHRvCityZWZlcmVuY2UgdGhlIHJlZ2lvbi4KKy4KKy5QCisuQiBHcm91cCBpZGVudGlmaWVycworLlAKK0dyb3VwcyBhcmUgYWxzbyBhc3NpZ25lZCBhbiBpbnRlZ2VyIGlkZW50aWZpZXIgYXQgY3JlYXRpb24gdGltZTsKK2xpa2UgcmVnaW9uIGlkZW50aWZpZXJzLCBncm91cCBpZGVudGlmaWVycyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUKK2NvbnRhaW5pbmcgZGV2aWNlLgorCitUaGUgXGZCZ3JvdXBfaWRcZlAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gb3BhcXVlIGlkZW50aWZpZXIgdXNlZCB0bworcmVmZXJlbmNlIHRoZSBncm91cC4KKy4KKy5TSCBSRVBPUlQgRklFTERTCisuCitUaGUgZG1zdGF0cyByZXBvcnQgcHJvdmlkZXMgc2V2ZXJhbCB0eXBlcyBvZiBmaWVsZCB0aGF0IG1heSBiZSBhZGRlZCB0bwordGhlIGRlZmF1bHQgZmllbGQgc2V0LCBvciB1c2VkIHRvIGNyZWF0ZSBjdXN0b20gcmVwb3J0cy4KKworQWxsIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGFuZCBtZXRyaWNzIGFyZSBjYWxjdWxhdGVkIHBlci1hcmVhLgorLgorLlNTIERlcml2ZWQgbWV0cmljcworLgorQSBudW1iZXIgb2YgbWV0cmljcyBmaWVsZHMgYXJlIGluY2x1ZGVkIHRoYXQgcHJvdmlkZSBoaWdoIGxldmVsCitwZXJmb3JtYW5jZSBpbmRpY2F0b3JzLiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIGZpZWxkcyBwcm92aWRlZCBieSB0aGUKK2NvbnZlbnRpb25hbCBMaW51eCBpb3N0YXQgcHJvZ3JhbSBhbmQgYXJlIGRlcml2ZWQgZnJvbSB0aGUgYmFzaWMgY291bnRlcgordmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwgZm9yIGVhY2ggYXJlYS4KKy5UUAorLkIgcmVhZHNfbWVyZ2VkX3Blcl9zZWMKK1JlYWRzIG1lcmdlZCBwZXIgc2Vjb25kLgorLlRQCisuQiB3cml0ZXNfbWVyZ2VkX3Blcl9zZWMKK1dyaXRlcyBtZXJnZWQgcGVyIHNlY29uZC4KKy5UUAorLkIgcmVhZHNfcGVyX3NlYworUmVhZHMgY29tcGxldGVkIHBlciBzZWNvbmQuCisuVFAKKy5CIHdyaXRlc19wZXJfc2VjCitXcml0ZXMgY29tcGxldGVkIHBlciBzZWNvbmQuCisuVFAKKy5CIHJlYWRfc2l6ZV9wZXJfc2VjCitTaXplIG9mIGRhdGEgcmVhZCBwZXIgc2Vjb25kLgorLlRQCisuQiB3cml0ZV9zaXplX3Blcl9zZWMKK1NpemUgb2YgZGF0YSB3cml0dGVuIHBlciBzZWNvbmQuCisuVFAKKy5CIGF2Z19yZXF1ZXN0X3NpemUKK0F2ZXJhZ2UgcmVxdWVzdCBzaXplLgorLlRQCisuQiBxdWV1ZV9zaXplCitBdmVyYWdlIHF1ZXVlIHNpemUuCisuVFAKKy5CIGF3YWl0CitUaGUgYXZlcmFnZSB3YWl0IHRpbWUgZm9yIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuCisuVFAKKy5CIHJfYXdhaXQKK1RoZSBhdmVyYWdlIHdhaXQgdGltZSBmb3IgcmVhZCBvcGVyYXRpb25zLgorLlRQCisuQiB3X2F3YWl0CitUaGUgYXZlcmFnZSB3YWl0IHRpbWUgZm9yIHdyaXRlIG9wZXJhdGlvbnMuCisuVFAKKy5CIHRocm91Z2hwdXQKK1RoZSBkZXZpY2UgdGhyb3VnaHB1dCBpbiBvcGVyYXRpb25zIHBlciBzZWNvbmQuCisuVFAKKy5CIHNlcnZpY2VfdGltZQorVGhlIGF2ZXJhZ2Ugc2VydmljZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGZvciBvcGVyYXRpb25zIGlzc3VlZAordG8gdGhlIGRldmljZS4KKy5UUAorLkIgdXRpbAorUGVyY2VudGFnZSBvZiBDUFUgdGltZSBkdXJpbmcgd2hpY2ggSS9PIHJlcXVlc3RzIHdlcmUgaXNzdWVkIHRvIHRoZQorZGV2aWNlIChiYW5kd2lkdGggdXRpbGl6YXRpb24gZm9yIHRoZSBkZXZpY2UpLiBEZXZpY2Ugc2F0dXJhdGlvbiBvY2N1cnMKK3doZW4gdGhpcyB2YWx1ZSBpcyBjbG9zZSB0byAxMDAlLgorLgorLlNTIEdyb3VwLCByZWdpb24gYW5kIGFyZWEgbWV0YSBmaWVsZHMKKy4KK01ldGEgZmllbGRzIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyb3VwcywgcmVnaW9ucywgb3IgYXJlYXMgdGhhdAordGhlIHN0YXRpc3RpY3MgdmFsdWVzIHJlbGF0ZSB0by4gVGhpcyBpbmNsdWRlcyB0aGUgcmVnaW9uIGFuZCBhcmVhCitpZGVudGlmaWVyLCBzdGFydCwgbGVuZ3RoLCBhbmQgY291bnRzLCBhcyB3ZWxsIGFzIHRoZSBwcm9ncmFtIElEIGFuZAordXNlciBkYXRhIHZhbHVlcy4KKy5UUAorLkIgcmVnaW9uX2lkCitSZWdpb24gaWRlbnRpZmllci4gVGhpcyBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwKK3doZW4gYSBzdGF0aXN0aWNzIHJlZ2lvbiBpcyBjcmVhdGVkLgorLlRQCisuQiByZWdpb25fc3RhcnQKK1RoZSByZWdpb24gc3RhcnQgbG9jYXRpb24uIERpc3BsYXkgdW5pdHMgYXJlIHNlbGVjdGVkIGJ5IHRoZQorXGZCXC1cLXVuaXRzXGZQIG9wdGlvbi4KKy5UUAorLkIgcmVnaW9uX2xlbgorVGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLiBEaXNwbGF5IHVuaXRzIGFyZSBzZWxlY3RlZCBieSB0aGUKK1xmQlwtXC11bml0c1xmUCBvcHRpb24uCisuVFAKKy5CIGFyZWFfaWQKK0FyZWEgaWRlbnRpZmllci4gQXJlYSBpZGVudGlmaWVycyBhcmUgYXNzaWduZWQgYnkgdGhlIGRldmljZS1tYXBwZXIKK3N0YXRpc3RpY3MgbGlicmFyeSBhbmQgdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBhcmVhIHdpdGhpbiBhIHJlZ2lvbi4gRWFjaAorSUQgY29ycmVzcG9uZHMgdG8gYSBkaXN0aW5jdCBzZXQgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMgZm9yIHRoYXQgYXJlYQorb2YgdGhlIHN0YXRpc3RpY3MgcmVnaW9uLiBBcmVhIGlkZW50aWZpZXJzIGFyZSBhbHdheXMgbW9ub3RvbmljYWxseQoraW5jcmVhc2luZyB3aXRoaW4gYSByZWdpb24gc28gdGhhdCBoaWdoZXIgSUQgdmFsdWVzIGNvcnJlc3BvbmQgdG8KK2dyZWF0ZXIgc2VjdG9yIGFkZHJlc3NlcyB3aXRoaW4gdGhlIGFyZWEgYW5kIG5vIGdhcHMgaW4gdGhlIHNlcXVlbmNlIG9mCitpZGVudGlmaWVycyBleGlzdC4KKy5UUAorLkIgYXJlYV9zdGFydAorVGhlIGFyZWEgc3RhcnQgbG9jYXRpb24uIERpc3BsYXkgdW5pdHMgYXJlIHNlbGVjdGVkIGJ5IHRoZQorXGZCXC1cLXVuaXRzXGZQIG9wdGlvbi4KKy5UUAorLkIgYXJlYV9sZW4KK1RoZSBsZW5ndGggb2YgdGhlIGFyZWEuIERpc3BsYXkgdW5pdHMgYXJlIHNlbGVjdGVkIGJ5IHRoZQorXGZCXC1cLXVuaXRzXGZQIG9wdGlvbi4KKy5UUAorLkIgYXJlYV9jb3VudAorVGhlIG51bWJlciBvZiBhcmVhcyBpbiB0aGlzIHJlZ2lvbi4KKy5UUAorLkIgcHJvZ3JhbV9pZAorVGhlIHByb2dyYW0gSUQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uLgorLlRQCisuQiB1c2VyX2RhdGEKK1RoZSB1c2VyIGRhdGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uLgorLlRQCisuQiBncm91cF9pZAorR3JvdXAgaWRlbnRpZmllci4gVGhpcyBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHJldHVybmVkIGJ5IHRoZSBkbXN0YXRzCitcZkJncm91cFxmUCBjb21tYW5kIHdoZW4gYSBzdGF0aXN0aWNzIGdyb3VwIGlzIGNyZWF0ZWQuCisuVFAKKy5CIGludGVydmFsX25zCitUaGUgZXN0aW1hdGVkIGludGVydmFsIG92ZXIgd2hpY2ggdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZXMgaGF2ZQorYWNjdW11bGF0ZWQuIFRoZSB2YWx1ZSBpcyByZXBvcnRlZCBhcyBhbiBpbnRlcmdlciBleHByZXNzZWQgaW4gdW5pdHMKK29mIG5hbm9zZWNvbmRzLgorLlRQCisuQiBpbnRlcnZhbAorVGhlIGVzdGltYXRlZCBpbnRlcnZhbCBvdmVyIHdoaWNoIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWVzIGhhdmUKK2FjY3VtdWxhdGVkLiBUaGUgdmFsdWUgaXMgcmVwb3J0ZWQgYXMgYSByZWFsIG51bWJlciBpbiB1bml0cyBvZgorc2Vjb25kcy4KKy4KKy5TUyBCYXNpYyBjb3VudGVycworLgorQmFzaWMgY291bnRlcnMgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHJhdyBjb3VudGVyIGRhdGEgZnJvbSB0aGUga2VybmVsLAorYWxsb3dpbmcgZnVydGhlciBwcm9jZXNzaW5nIHRvIGJlIGNhcnJpZWQgb3V0IGJ5IGFub3RoZXIgcHJvZ3JhbS4KKy5QCitUaGUga2VybmVsIHByb3ZpZGVzIHRoaXJ0ZWVuIHNlcGFyYXRlIGNvdW50ZXJzIGZvciBlYWNoIHN0YXRpc3RpY3MKK2FyZWEuIFRoZSBmaXJzdCBlbGV2ZW4gb2YgdGhlc2UgbWF0Y2ggdGhlIGNvdW50ZXJzIHByb3ZpZGVkIGluCisvcHJvYy9kaXNrc3RhdHMgb3IgL3N5cy9ibG9jay8qLyovc3RhdC4gVGhlIGZpbmFsIHBhaXIgcHJvdmlkZSBzZXBhcmF0ZQorY291bnRlcnMgZm9yIHJlYWQgYW5kIHdyaXRlIHRpbWUuCisuVFAKKy5CIHJlYWRfY291bnQKK0NvdW50IG9mIHJlYWRzIGNvbXBsZXRlZCB0aGlzIGludGVydmFsLgorLlRQCisuQiByZWFkc19tZXJnZWRfY291bnQKK0NvdW50IG9mIHJlYWRzIG1lcmdlZCB0aGlzIGludGVydmFsLgorLlRQCisuQiByZWFkX3NlY3Rvcl9jb3VudAorQ291bnQgb2YgNTEyIGJ5dGUgc2VjdG9ycyByZWFkIHRoaXMgaW50ZXJ2YWwuCisuVFAKKy5CIHJlYWRfdGltZQorQWNjdW11bGF0ZWQgZHVyYXRpb24gb2YgYWxsIHJlYWQgcmVxdWVzdHMgKG5zKS4KKy5UUAorLkIgd3JpdGVfY291bnQKK0NvdW50IG9mIHdyaXRlcyBjb21wbGV0ZWQgdGhpcyBpbnRlcnZhbC4KKy5UUAorLkIgd3JpdGVzX21lcmdlZF9jb3VudAorQ291bnQgb2Ygd3JpdGVzIG1lcmdlZCB0aGlzIGludGVydmFsLgorLlRQCisuQiB3cml0ZV9zZWN0b3JfY291bnQKK0NvdW50IG9mIDUxMiBieXRlIHNlY3RvcnMgd3JpdHRlbiB0aGlzIGludGVydmFsLgorLlRQCisuQiB3cml0ZV9uc2VjcworQWNjdW11bGF0ZWQgZHVyYXRpb24gb2YgYWxsIHdyaXRlIHJlcXVlc3RzIChucykuCisuVFAKKy5CIGluX3Byb2dyZXNzX2NvdW50CitDb3VudCBvZiByZXF1ZXN0cyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuCisuVFAKKy5CIGlvX3RpY2tzCitOYW5vc2Vjb25kcyBzcGVudCBzZXJ2aWNpbmcgcmVxdWVzdHMuCisuVFAKKy5CIHF1ZXVlX3RpY2tzCitUaGlzIGZpZWxkIGlzIGluY3JlbWVudGVkIGF0IGVhY2ggSS9PIHN0YXJ0LCBJL08gY29tcGxldGlvbiwgSS9PIG1lcmdlLAorb3IgcmVhZCBvZiB0aGVzZSBzdGF0cyBieSB0aGUgbnVtYmVyIG9mIEkvT3MgaW4gcHJvZ3Jlc3MgbXVsdGlwbGllZCBieQordGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgZG9pbmcgSS9PIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSBvZiB0aGlzCitmaWVsZC4gIFRoaXMgY2FuIHByb3ZpZGUgYW4gZWFzeSBtZWFzdXJlIG9mIGJvdGggSS9PIGNvbXBsZXRpb24gdGltZSBhbmQKK3RoZSBiYWNrbG9nIHRoYXQgbWF5IGJlIGFjY3VtdWxhdGluZy4KKy5UUAorLkIgcmVhZF90aWNrcworTmFub3NlY29uZHMgc3BlbnQgc2VydmljaW5nIHJlYWRzLgorLlRQCisuQiB3cml0ZV90aWNrcworTmFub3NlY29uZHMgc3BlbnQgc2VydmljaW5nIHdyaXRlcy4KKy4KKy5TUyBIaXN0b2dyYW0gZmllbGRzCisuCitIaXN0b2dyYW1zIG1lYXN1cmUgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgdXNlciBzcGVjaWZpZWQgSS9PCitsYXRlbmN5IGludGVydmFscy4gSGlzdG9ncmFtIGJpbiBib3VuZGFyaWVzIGFyZSBzcGVjaWZpZWQgd2hlbiBhIHJlZ2lvbgoraXMgY3JlYXRlZC4KKy5QCitBIGJyaWVmIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoaXN0b2dyYW0gdmFsdWVzIGFuZCBsYXRlbmN5IGludGVydmFscyBjYW4KK2JlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQgdXNpbmcgdGhlc2UgZmllbGRzLgorLlRQCisuQiBoaXN0X2NvdW50CitBIGxpc3Qgb2YgdGhlIGhpc3RvZ3JhbSBjb3VudHMgZm9yIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgYXJlYSBpbiBvcmRlcgorb2YgYXNjZW5kaW5nIGxhdGVuY3kgdmFsdWUuIEVhY2ggdmFsdWUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIEkvT3MKK3dpdGggbGF0ZW5jeSB0aW1lcyBmYWxsaW5nIGludG8gdGhhdCBiaW4ncyB0aW1lIHJhbmdlIGR1cmluZyB0aGUgc2FtcGxlCitwZXJpb2QuCisuVFAKKy5CIGhpc3RfY291bnRfYm91bmRzCitBIGxpc3Qgb2YgdGhlIGhpc3RvZ3JhbSBjb3VudHMgZm9yIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgYXJlYSBpbiBvcmRlcgorb2YgYXNjZW5kaW5nIGxhdGVuY3kgdmFsdWUgaW5jbHVkaW5nIGJpbiBib3VuZGFyaWVzOiBlYWNoIGNvdW50IGlzCitwcmVmaXhlZCBieSB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaGlzdG9ncmFtIGJpbi4KKy5UUAorLkIgaGlzdF9jb3VudF9yYW5nZXMKK0EgbGlzdCBvZiB0aGUgaGlzdG9ncmFtIGNvdW50cyBmb3IgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBhcmVhIGluIG9yZGVyCitvZiBhc2NlbmRpbmcgbGF0ZW5jeSB2YWx1ZSBpbmNsdWRpbmcgYmluIGJvdW5kYXJpZXM6IGVhY2ggY291bnQgaXMKK3ByZWZpeGVkIGJ5IGJvdGggdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcKK2hpc3RvZ3JhbSBiaW4uCisuVFAKKy5CIGhpc3RfcGVyY2VudAorQSBsaXN0IG9mIHRoZSByZWxhdGl2ZSBoaXN0b2dyYW0gdmFsdWVzIGZvciB0aGUgY3VycmVudCBzdGF0aXN0aWNzIGFyZWEKK2luIG9yZGVyIG9mIGFzY2VuZGluZyBsYXRlbmN5IHZhbHVlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLiBFYWNoCit2YWx1ZSByZXByZXNlbnRzIHRoZSBwcm9wb3J0aW9uIG9mIEkvT3Mgd2l0aCBsYXRlbmN5IHRpbWVzIGZhbGxpbmcgaW50bwordGhhdCBiaW4ncyB0aW1lIHJhbmdlIGR1cmluZyB0aGUgc2FtcGxlIHBlcmlvZC4KKy5UUAorLkIgaGlzdF9wZXJjZW50X2JvdW5kcworQSBsaXN0IG9mIHRoZSByZWxhdGl2ZSBoaXN0b2dyYW0gdmFsdWVzIGZvciB0aGUgY3VycmVudCBzdGF0aXN0aWNzIGFyZWEKK2luIG9yZGVyIG9mIGFzY2VuZGluZyBsYXRlbmN5IHZhbHVlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIGFuZAoraW5jbHVkaW5nIGJpbiBib3VuZGFyaWVzLiBFYWNoIHZhbHVlIHJlcHJlc2VudHMgdGhlIHByb3BvcnRpb24gb2YgSS9Pcword2l0aCBsYXRlbmN5IHRpbWVzIGZhbGxpbmcgaW50byB0aGF0IGJpbidzIHRpbWUgcmFuZ2UgZHVyaW5nIHRoZSBzYW1wbGUKK3BlcmlvZCBhbmQgaXMgcHJlZml4ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBiaW4ncyBsb3dlciBib3VuZC4KKy5UUAorLkIgaGlzdF9wZXJjZW50X3JhbmdlcworQSBsaXN0IG9mIHRoZSByZWxhdGl2ZSBoaXN0b2dyYW0gdmFsdWVzIGZvciB0aGUgY3VycmVudCBzdGF0aXN0aWNzIGFyZWEKK2luIG9yZGVyIG9mIGFzY2VuZGluZyBsYXRlbmN5IHZhbHVlLCBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIGFuZAoraW5jbHVkaW5nIGJpbiBib3VuZGFyaWVzLiBFYWNoIHZhbHVlIHJlcHJlc2VudHMgdGhlIHByb3BvcnRpb24gb2YgSS9Pcword2l0aCBsYXRlbmN5IHRpbWVzIGZhbGxpbmcgaW50byB0aGF0IGJpbidzIHRpbWUgcmFuZ2UgZHVyaW5nIHRoZSBzYW1wbGUKK3BlcmlvZCBhbmQgaXMgcHJlZml4ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBiaW4ncyBsb3dlciBhbmQgdXBwZXIKK2JvdW5kcy4KKy5UUAorLkIgaGlzdF9ib3VuZHMKK0EgbGlzdCBvZiB0aGUgaGlzdG9ncmFtIGJvdW5kYXJ5IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBhcmVhCitpbiBvcmRlciBvZiBhc2NlbmRpbmcgbGF0ZW5jeSB2YWx1ZS4gIFRoZSB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiB3aG9sZQordW5pdHMgb2Ygc2Vjb25kcywgbWlsaXNlY29uZHMsIG1pY3Jvc2Vjb25kcyBvciBuYW5vc2Vjb25kcyB3aXRoIGEgc3VmZml4CitpbmRpY2F0aW5nIHRoZSB1bml0LgorLlRQCisuQiBoaXN0X3JhbmdlcworQSBsaXN0IG9mIHRoZSBoaXN0b2dyYW0gYmluIHJhbmdlcyBmb3IgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBhcmVhIGluCitvcmRlciBvZiBhc2NlbmRpbmcgbGF0ZW5jeSB2YWx1ZS4gIFRoZSB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBhcworIkxPV0VSLVVQUEVSIiBpbiB3aG9sZSB1bml0cyBvZiBzZWNvbmRzLCBtaWxpc2Vjb25kcywgbWljcm9zZWNvbmRzIG9yCituYW5vc2Vjb25kcyB3aXRoIGEgc3VmZml4IGluZGljYXRpbmcgdGhlIHVuaXQuCisuVFAKKy5CIGhpc3RfYmlucworVGhlIG51bWJlciBvZiBsYXRlbmN5IGhpc3RvZ3JhbSBiaW5zIGNvbmZpZ3VyZWQgZm9yIHRoZSBhcmVhLgorLgorLlNIIEVYQU1QTEVTCisuCitDcmVhdGUgYSB3aG9sZS1kZXZpY2UgcmVnaW9uIHdpdGggb25lIGFyZWEgb24gdmcwMC9sdm9sMQorLmJyCisjCisuQiBkbXN0YXRzIGNyZWF0ZSB2ZzAwL2x2b2wxCisuYnIKK3ZnMDAvbHZvbDE6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoIDEgYXJlYShzKSBhcyByZWdpb24gSUQgMAorLlAKK0NyZWF0ZSBhIDMyTSByZWdpb24gMUcgaW50byBkZXZpY2UgZDAKKy5icgorIworLkIgZG1zdGF0cyBjcmVhdGUgXC1cLXN0YXJ0IDFHIFwtXC1sZW5ndGggMzJNIGQwCisuYnIKK2QwOiBDcmVhdGVkIG5ldyByZWdpb24gd2l0aCAxIGFyZWEocykgYXMgcmVnaW9uIElEIDAKKy5QCitDcmVhdGUgYSB3aG9sZS1kZXZpY2UgcmVnaW9uIHdpdGggOCBhcmVhcyBvbiBldmVyeSBkZXZpY2UKKy5icgorLmJyCisjCisuQiBkbXN0YXRzIGNyZWF0ZSBcLVwtYXJlYXMgOAorLmJyCit2ZzAwLWx2b2wxOiBDcmVhdGVkIG5ldyByZWdpb24gd2l0aCA4IGFyZWEocykgYXMgcmVnaW9uIElEIDAKKy5icgordmcwMC1sdm9sMjogQ3JlYXRlZCBuZXcgcmVnaW9uIHdpdGggOCBhcmVhKHMpIGFzIHJlZ2lvbiBJRCAwCisuYnIKK3ZnMDAtbHZvbDM6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoIDggYXJlYShzKSBhcyByZWdpb24gSUQgMAorLmJyCit2ZzAxLWx2b2wwOiBDcmVhdGVkIG5ldyByZWdpb24gd2l0aCA4IGFyZWEocykgYXMgcmVnaW9uIElEIDIKKy5icgordmcwMS1sdm9sMTogQ3JlYXRlZCBuZXcgcmVnaW9uIHdpdGggOCBhcmVhKHMpIGFzIHJlZ2lvbiBJRCAwCisuYnIKK3ZnMDAtbHZvbDI6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoIDggYXJlYShzKSBhcyByZWdpb24gSUQgMQorLlAKK0RlbGV0ZSBhbGwgcmVnaW9ucyBvbiBhbGwgZGV2aWNlcworLmJyCisuYnIKKyMKKy5CIGRtc3RhdHMgZGVsZXRlIFwtXC1hbGxkZXZpY2VzIFwtXC1hbGxyZWdpb25zCisuUAorQ3JlYXRlIGEgd2hvbGUtZGV2aWNlIHJlZ2lvbiB3aXRoIGFyZWFzIDEwR2lCIGluIHNpemUgb24gdmcwMC9sdm9sMQordXNpbmcgZG1zZXR1cAorLmJyCisuYnIKKyMKKy5CIGRtc2V0dXAgc3RhdHMgY3JlYXRlIFwtXC1hcmVhc2l6ZSAxMEcgdmcwMC9sdm9sMQorLmJyCit2ZzAwLWx2b2wxOiBDcmVhdGVkIG5ldyByZWdpb24gd2l0aCA1IGFyZWEocykgYXMgcmVnaW9uIElEIDEKKy5QCitDcmVhdGUgYSAxR2lCIHJlZ2lvbiB3aXRoIDE2IGFyZWFzIGF0IHRoZSBzdGFydCBvZiB2ZzAwL2x2b2wxCisuYnIKKyMKKy5CIGRtc3RhdHMgY3JlYXRlIFwtXC1zdGFydCAwIFwtXC1sZW4gMUcgXC1cLWFyZWFzPTE2IHZnMDAvbHZvbDEKKy5icgordmcwMC1sdm9sMTogQ3JlYXRlZCBuZXcgcmVnaW9uIHdpdGggMTYgYXJlYShzKSBhcyByZWdpb24gSUQgMAorLlAKK0xpc3QgdGhlIHN0YXRpc3RpY3MgcmVnaW9ucyByZWdpc3RlcmVkIG9uIHZnMDAvbHZvbDEKKy5icgorIworLkIgZG1zdGF0cyBsaXN0IHZnMDAvbHZvbDEKKy5icgorTmFtZSAgICAgICAgICAgICBSZ0lEICBSU3RhcnQgUlNpemUgICNBcmVhcyBBU2l6ZSAgUHJvZ0lECisuYnIKK3ZnMDAtbHZvbDEgICAgICAgICAgIDAgICAgICAwIDYxLjAwZyAgICAgIDEgNjEuMDBnIGRtc3RhdHMKKy5icgordmcwMC1sdm9sMSAgICAgICAgICAgMSA2MS4wMGcgMTkuMjBnICAgICAgMSAxOS4yMGcgZG1zdGF0cworLmJyCit2ZzAwLWx2b2wxICAgICAgICAgICAyIDgwLjIwZyAgMi4xNGcgICAgICAxICAyLjE0ZyBkbXN0YXRzCisuUAorRGlzcGxheSBmaXZlIHN0YXRpc3RpY3MgcmVwb3J0cyBmb3IgdmcwMC9sdm9sMSBhdCBhbiBpbnRlcnZhbCBvZiBvbmUgc2Vjb25kCisuYnIKKy5icgorIworLkIgZG1zdGF0cyByZXBvcnQgXC1cLWludGVydmFsIDEgXC1cLWNvdW50IDUgdmcwMC9sdm9sMQorLmJyCisjCisuQiBkbXN0YXRzIHJlcG9ydAorLmJyCitOYW1lICAgICAgICAgICAgIFJnSUQgIEFySUQgIEFTdGFydCBBU2l6ZSAgUlJxTS9zICAgV1JxTS9zICAgUi9zICAgVy9zICAgIFJTei9zIFdTei9zICAgQXZScVN6ICBRU2l6ZSBVdGlsJSAgICAgIEFXYWl0IFJkQVdhIFdyQVdhCisuYnIKK3ZnX2hleC1sdl9ob21lICAgICAgIDAgICAgIDAgICAgICAwIDYxLjAwZyAgICAgMC4wMCAgICAgMC4wMCAgMC4wMCAyMTguMDAgICAgIDAgICAxLjA0bSAgIDQuNTBrICAyLjk3ICAgICAgODEuNzAgMTMuNjIgIDAuMDAgMTMuNjIKKy5icgordmdfaGV4LWx2X2hvbWUgICAgICAgMSAgICAgMCA2MS4wMGcgMTkuMjBnICAgICAwLjAwICAgICAwLjAwICAwLjAwICAgNS4wMCAgICAgMCA1NDguMDBrIDEwOS41MGsgIDAuMTQgICAgICAxMS4wMCAyNy40MCAgMC4wMCAyNy40MAorLmJyCit2Z19oZXgtbHZfaG9tZSAgICAgICAyICAgICAwIDgwLjIwZyAgMi4xNGcgICAgIDAuMDAgICAgIDAuMDAgIDAuMDAgIDE0LjAwICAgICAwICAgMS4xNW0gIDg0LjAwayAgMC4zOSAgICAgIDE4LjcwIDI3LjcxICAwLjAwIDI3LjcxCisuUAorQ3JlYXRlIG9uZSByZWdpb24gZm9yIHJlYWNoIHRhcmdldCBjb250YWluZWQgaW4gZGV2aWNlIHZnMDAvbHZvbDEKKy5icgorLmJyCisjCisuQiBkbXN0YXRzIGNyZWF0ZSBcLVwtc2VnbWVudHMgdmcwMC9sdm9sMQorLmJyCit2ZzAwLWx2b2wxOiBDcmVhdGVkIG5ldyByZWdpb24gd2l0aCAxIGFyZWEocykgYXMgcmVnaW9uIElEIDAKKy5icgordmcwMC1sdm9sMTogQ3JlYXRlZCBuZXcgcmVnaW9uIHdpdGggMSBhcmVhKHMpIGFzIHJlZ2lvbiBJRCAxCisuYnIKK3ZnMDAtbHZvbDE6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoIDEgYXJlYShzKSBhcyByZWdpb24gSUQgMgorLlAKK0NyZWF0ZSByZWdpb25zIG1hcHBpbmcgZWFjaCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgaW1hZ2VzLyBhbmQgcGxhY2UKK3RoZW0gaW50byBzZXBhcmF0ZSBncm91cHMsIGVhY2ggbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZQorLmJyCisjCisuQiBkbXN0YXRzIGNyZWF0ZSAtLWZpbGVtYXAgaW1hZ2VzLyoKKy5icgoraW1hZ2VzL3ZtMS5xY293MjogQ3JlYXRlZCBuZXcgZ3JvdXAgd2l0aCA4NyByZWdpb24ocykgYXMgZ3JvdXAgSUQgMC4KKy5icgoraW1hZ2VzL3ZtMS0xLnFjb3cyOiBDcmVhdGVkIG5ldyBncm91cCB3aXRoIDggcmVnaW9uKHMpIGFzIGdyb3VwIElEIDg3LgorLmJyCitpbWFnZXMvdm0yLnFjb3cyOiBDcmVhdGVkIG5ldyBncm91cCB3aXRoIDExIHJlZ2lvbihzKSBhcyBncm91cCBJRCA5NS4KKy5icgoraW1hZ2VzL3ZtMi0xLnFjb3cyOiBDcmVhdGVkIG5ldyBncm91cCB3aXRoIDE0NTQgcmVnaW9uKHMpIGFzIGdyb3VwIElEIDEwNi4KKy5icgoraW1hZ2VzL3ZtMy5pbWc6IENyZWF0ZWQgbmV3IGdyb3VwIHdpdGggMiByZWdpb24ocykgYXMgZ3JvdXAgSUQgMTU2MC4KKy5QCitQcmludCByYXcgY291bnRlcnMgZm9yIHJlZ2lvbiA0IG9uIGRldmljZSBkMAorLmJyCisjCisuQiBkbXN0YXRzIHByaW50IFwtXC1yZWdpb25pZCA0IGQwCisuYnIKKzIwOTcxNTIrNjU1MzYgMCAwIDAgMCAyOSAwIDI2NCA3MDEgMCA0MSA3MDEgMCA0MQorLgorLlNIIEFVVEhPUlMKKy4KK0JyeW4gTS4gUmVldmVzIDxibXJAcmVkaGF0LmNvbT4KKy4KKy5TSCBTRUUgQUxTTworLgorLkJSIGRtc2V0dXAgKDgpCisKK0xWTTIgcmVzb3VyY2UgcGFnZTogaHR0cHM6Ly93d3cuc291cmNld2FyZS5vcmcvbHZtMi8KKy5icgorRGV2aWNlLW1hcHBlciByZXNvdXJjZSBwYWdlOiBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2RtLworLmJyCisKK0RldmljZS1tYXBwZXIgc3RhdGlzdGljcyBrZXJuZWwgZG9jdW1lbnRhdGlvbgorLmJyCisuSSBEb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvc3RhdGlzdGljcy50eHQKZGlmZiAtLWdpdCBhL21hbi9mc2FkbS44LmluIGIvbWFuL2ZzYWRtLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MzFjNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9mc2FkbS44LmluCkBAIC0wLDAgKzEsMTE0IEBACisuVEggIkZTQURNIiAiOCIgIkxWTSBUT09MUyAjVkVSU0lPTiMiICJSZWQgSGF0LCBJbmMiICJcIiIKKy5TSCAiTkFNRSIKK2ZzYWRtIFwoZW0gdXRpbGl0eSB0byByZXNpemUgb3IgY2hlY2sgZmlsZXN5c3RlbSBvbiBhIGRldmljZQorLlNIIFNZTk9QU0lTCisuCisuUEQgMAorLmFkIGwKKy5IUCA1CisuQiBmc2FkbQorLlJJIFsgb3B0aW9ucyBdCisuQlIgY2hlY2sKKy5JUiBkZXZpY2UKKy4KKy5IUAorLkIgZnNhZG0KKy5SSSBbIG9wdGlvbnMgXQorLkJSIHJlc2l6ZQorLklSIGRldmljZQorLlJJIFsgbmV3X3NpemUgXQorLlBECisuYWQgYgorLgorLlNIIERFU0NSSVBUSU9OCisuCitmc2FkbSB1dGlsaXR5IGNoZWNrcyBvciByZXNpemVzIHRoZSBmaWxlc3lzdGVtIG9uIGEgZGV2aWNlLgorSXQgdHJpZXMgdG8gdXNlIHRoZSBzYW1lIEFQSSBmb3IKKy5CUiBleHQyICwKKy5CUiBleHQzICwKKy5CUiBleHQ0ICwKKy5CUiBSZWlzZXJGUworLlJCIGFuZAorLkJSIFhGUworZmlsZXN5c3RlbS4KKy4KKy5TSCBPUFRJT05TCisuCisuSFAKKy5CUiBcLWUgfCBcLVwtZXh0XC1vZmZsaW5lCisuYnIKK1VubW91bnQgZXh0Mi9leHQzL2V4dDQgZmlsZXN5c3RlbSBiZWZvcmUgZG9pbmcgcmVzaXplLgorLgorLkhQCisuQlIgXC1mIHwgXC1cLWZvcmNlCisuYnIKK0J5cGFzcyBzb21lIHNhbml0eSBjaGVja3MuCisuCisuSFAKKy5CUiBcLWggfCBcLVwtaGVscAorLmJyCitEaXNwbGF5IHRoZSBoZWxwIHRleHQuCisuCisuSFAKKy5CUiBcLW4gfCBcLVwtZHJ5XC1ydW4KKy5icgorUHJpbnQgY29tbWFuZHMgd2l0aG91dCBydW5uaW5nIHRoZW0uCisuCisuSFAKKy5CUiBcLXYgfCBcLVwtdmVyYm9zZQorLmJyCitCZSBtb3JlIHZlcmJvc2UuCisuCisuSFAKKy5CUiBcLXkgfCBcLVwteWVzCisuYnIKK0Fuc3dlciAieWVzIiBhdCBhbnkgcHJvbXB0cy4KKy4KKy5IUAorLkJSIFxmSW5ld19zaXplIFsgQiB8IEsgfCBNIHwgRyB8IFQgfCBQIHwgRSBdCisuYnIKK0Fic29sdXRlIG51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyB0byBiZSBpbiB0aGUgZmlsZXN5c3RlbSwKK29yIGFuIGFic29sdXRlIHNpemUgdXNpbmcgYSBzdWZmaXggKGluIHBvd2VycyBvZiAxMDI0KS4KK0lmIG5ld19zaXplIGlzIG5vdCBzdXBwbGllZCwgdGhlIHdob2xlIGRldmljZSBpcyB1c2VkLgorLgorLlNIIERJQUdOT1NUSUNTCisuCitPbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIHRoZSBzdGF0dXMgY29kZSBpcyAwLgorQSBzdGF0dXMgY29kZSBvZiAyIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSB0aGUgdXNlci4KK0Egc3RhdHVzIGNvZGUgb2YgMyBpbmRpY2F0ZXMgdGhlIHJlcXVlc3RlZCBjaGVjayBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZAorYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFuIG9ubGluZQorLkJSIGZzY2sgKDgpLgorQSBzdGF0dXMgY29kZSBvZiAxIGlzIHVzZWQgZm9yIG90aGVyIGZhaWx1cmVzLgorLgorLlNIIEVYQU1QTEVTCisuCitSZXNpemUgdGhlIGZpbGVzeXN0ZW0gb24gbG9naWNhbCB2b2x1bWUgXGZJL2Rldi92Zy90ZXN0XGZQIHRvIDEwMDAgbWVnYWJ5dGVzLgorSWYgXGZJL2Rldi92Zy90ZXN0XGZQIGNvbnRhaW5zIGV4dDIvZXh0My9leHQ0CitmaWxlc3lzdGVtIGl0IHdpbGwgYmUgdW5tb3VudGVkIHByaW9yIHRoZSByZXNpemUuCitBbGwgW3kvbl0gcXVlc3Rpb25zIHdpbGwgYmUgYW5zd2VyZWQgJ3knLgorLnNwCisuQiBmc2FkbSBcLWUgXC15IHJlc2l6ZSAvZGV2L3ZnL3Rlc3QgMTAwME0KKy4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy4KKy5UUAorLkIgIlRNUERJUiAgICIKK1RoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG5hbWUgZm9yIG1vdW50IHBvaW50cy4gRGVmYXVsdHMgdG8gIlxmSS90bXBcZlAiLgorLlRQCisuQiBETV9ERVZfRElSCitUaGUgZGV2aWNlIGRpcmVjdG9yeSBuYW1lLgorRGVmYXVsdHMgdG8gIlxmSS9kZXZcZlAiIGFuZCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGguCisKKy5TSCBTRUUgQUxTTworLm5oCisuQlIgbHZtICg4KSwKKy5CUiBsdnJlc2l6ZSAoOCksCisuQlIgbHZtLmNvbmYgKDUpLAorLkJSIGZzY2sgKDgpLAorLkJSIHR1bmUyZnMgKDgpLAorLkJSIHJlc2l6ZTJmcyAoOCksCisuQlIgcmVpc2VyZnN0dW5lICg4KSwKKy5CUiByZXNpemVfcmVpc2VyZnMgKDgpLAorLkJSIHhmc19pbmZvICg4KSwKKy5CUiB4ZnNfZ3Jvd2ZzICg4KSwKKy5CUiB4ZnNfY2hlY2sgKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZjaGFuZ2UuOC5pbiBiL21hbi9sdmNoYW5nZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDAzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZjaGFuZ2UuOC5pbgpAQCAtMCwwICsxLDQ2NCBAQAorLlRIIExWQ0hBTkdFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisKKy5kZSBVTklUUworLi4KKworLgorLlNIIE5BTUUKKy4KK2x2Y2hhbmdlIFwoZW0gY2hhbmdlIGF0dHJpYnV0ZXMgb2YgYSBsb2dpY2FsIHZvbHVtZQorLgorLlNIIFNZTk9QU0lTCisuCisuYWQgbAorLkIgbHZjaGFuZ2UKKy5SQiBbIFwtYSB8IFwtXC1hY3RpdmF0ZQorLlJCIFsgYSBdWyBlIHwgcyB8IGwgXXsgeSB8IG4gfV0KKy5SQiBbIFwtXC1hY3RpdmF0aW9ubW9kZQorLlJCIHsgY29tcGxldGUgfCBkZWdyYWRlZCB8IHBhcnRpYWwgfV0KKy5SQiBbIFwtXC1hZGR0YWcKKy5JUiBUYWcgXQorLlJCIFsgXC1LIHwgXC1cLWlnbm9yZWFjdGl2YXRpb25za2lwIF0KKy5SQiBbIFwtayB8IFwtXC1zZXRhY3RpdmF0aW9uc2tpcAorLlJCIHsgeSB8IG4gfV0KKy5SQiBbIFwtXC1hbGxvYworLklSIEFsbG9jYXRpb25Qb2xpY3kgXQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SQiB7IHkgfCBuIH1dCisuUkIgWyBcLVwtY2FjaGVtb2RlCisuUkIgeyBwYXNzdGhyb3VnaCB8IHdyaXRlYmFjayB8IHdyaXRldGhyb3VnaCB9XQorLlJCIFsgXC1cLWNhY2hlcG9saWN5CisuSVIgUG9saWN5IF0KKy5SQiBbIFwtXC1jYWNoZXNldHRpbmdzCisuSVIgS2V5IFxmQj0gVmFsdWUgXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1DIHwgXC1cLWNvbnRpZ3VvdXMKKy5SQiB7IHkgfCBuIH1dCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1cLWRlbHRhZworLklSIFRhZyBdCisuUkIgWyBcLVwtZGV0YWNocHJvZmlsZSBdCisuUkIgWyBcLVwtZGlzY2FyZHMKKy5SQiB7IGlnbm9yZSB8IG5vcGFzc2Rvd24gfCBwYXNzZG93biB9XQorLlJCIFsgXC1cLWVycm9yd2hlbmZ1bGwKKy5SQiB7IHkgfCBuIH1dCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgXCVbIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZSBdCisuUkIgXCVbIFwtXC1pZ25vcmVtb25pdG9yaW5nIF0KKy5SQiBcJVsgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyIF0KKy5SQiBcJVsgXC1cLW1ldGFkYXRhcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtXC1tb25pdG9yCisuUkIgeyB5IHwgbiB9XQorLlJCIFsgXC1cLW5vdWRldnN5bmMgXQorLlJCIFsgXC1QIHwgXC1cLXBhcnRpYWwgXQorLlJCIFsgXC1wIHwgXC1cLXBlcm1pc3Npb24KKy5SQiB7IHIgfCBydyB9XQorLlJCIFsgXC1NIHwgXC1cLXBlcnNpc3RlbnQKKy5SQiB7IHkgfCBuIH0KKy5SQiBbIFwtXC1tYWpvcgorLklSIE1ham9yIF0KKy5SQiBbIFwtXC1taW5vcgorLklSIE1pbm9yIF1dCisuUkIgWyBcLVwtcG9sbAorLlJCIHsgeSB8IG4gfV0KKy5SQiBbIFwtXC0gWyByYWlkIF0gbWF4cmVjb3ZlcnlyYXRlCisuSVIgUmF0ZSBdCisuUkIgWyBcLVwtIFsgcmFpZCBdIG1pbnJlY292ZXJ5cmF0ZQorLklSIFJhdGUgXQorLlJCIFsgXC1cLSBbIHJhaWQgXSBzeW5jYWN0aW9uCisuUkIgeyBjaGVjayB8IHJlcGFpciB9XQorLlJCIFsgXC1cLSBbIHJhaWQgXSB3cml0ZWJlaGluZAorLklSIElPQ291bnQgXQorLlJCIFsgXC1cLSBbIHJhaWQgXSB3cml0ZW1vc3RseQorLkJSIFxmSVBoeXNpY2FsVm9sdW1lIFsgOiB7IHkgfCBuIHwgdCB9XV0KKy5SQiBbIFwtciB8IFwtXC1yZWFkYWhlYWQKKy5SQiB7IFxmSVJlYWRBaGVhZFNlY3RvcnMgfCBhdXRvIHwgbm9uZSB9XQorLlJCIFsgXC1cLXJlZnJlc2ggXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLVwtcmVzeW5jIF0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIFsgXC1cLXN5c2luaXQgXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1aIHwgXC1cLXplcm8KKy5SQiB7IHkgfCBuIH1dCisuUkkgWyBMb2dpY2FsVm9sdW1lUGF0aCAuLi5dCisuYWQgYgorLgorLlNIIERFU0NSSVBUSU9OCisuCitsdmNoYW5nZSBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiBhIGxvZ2ljYWwgdm9sdW1lCitpbmNsdWRpbmcgbWFraW5nIHRoZW0ga25vd24gdG8gdGhlIGtlcm5lbCByZWFkeSBmb3IgdXNlLgorLgorLlNIIE9QVElPTlMKKy4KK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLgorLkhQCisuQlIgXC1hIHwgXC1cLWFjdGl2YXRlCisuUkIgWyBhIF1bIGUgfCBzIHwgbCBdeyB5IHwgbiB9CisuYnIKK0NvbnRyb2xzIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lcyBmb3IgdXNlLgorQ29tbXVuaWNhdGVzIHdpdGggdGhlIGtlcm5lbCBkZXZpY2UtbWFwcGVyIGRyaXZlciB2aWEKK2xpYmRldm1hcHBlciB0byBhY3RpdmF0ZSAoXGZCXC1heVxmUCkgb3IgZGVhY3RpdmF0ZSAoXGZCXC1hblxmUCkgdGhlCitsb2dpY2FsIHZvbHVtZXMuCisuYnIKK0FjdGl2YXRpb24gb2YgYSBsb2dpY2FsIHZvbHVtZSBjcmVhdGVzIGEgc3ltYm9saWMgbGluaworXGZJL2Rldi9Wb2x1bWVHcm91cE5hbWUvTG9naWNhbFZvbHVtZU5hbWVcZlAgcG9pbnRpbmcgdG8gdGhlIGRldmljZSBub2RlLgorVGhpcyBsaW5rIGlzIHJlbW92ZWQgb24gZGVhY3RpdmF0aW9uLgorQWxsIHNvZnR3YXJlIGFuZCBzY3JpcHRzIHNob3VsZCBhY2Nlc3MgdGhlIGRldmljZSB0aHJvdWdoCit0aGlzIHN5bWJvbGljIGxpbmsgYW5kIHByZXNlbnQgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlLgorVGhlIGxvY2F0aW9uIGFuZCBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBub2RlIG1heSBkZXBlbmQgb24KK3RoZSBkaXN0cmlidXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gKGUuZy4gdWRldikgYW5kIG1pZ2h0IGNoYW5nZQorZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCisuYnIKK0lmIGF1dG9hY3RpdmF0aW9uIG9wdGlvbiBpcyB1c2VkIChcZkJcLWFheVxmUCksCit0aGUgbG9naWNhbCB2b2x1bWUgaXMgYWN0aXZhdGVkIG9ubHkgaWYgaXQgbWF0Y2hlcyBhbiBpdGVtIGluCit0aGUgXGZCYWN0aXZhdGlvbi9hdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3RcZlAKK3NldCBpbiBcZkJsdm0uY29uZlxmUCg1KS4KK0lmIHRoaXMgbGlzdCBpcyBub3Qgc2V0LCB0aGVuIGFsbCB2b2x1bWVzIGFyZSBjb25zaWRlcmVkIGZvcgorYWN0aXZhdGlvbi4gVGhlIFxmQlwtYWF5XGZQIG9wdGlvbiBzaG91bGQgYmUgYWxzbyB1c2VkIGR1cmluZyBzeXN0ZW0KK2Jvb3Qgc28gaXQncyBwb3NzaWJsZSB0byBzZWxlY3Qgd2hpY2ggdm9sdW1lcyB0byBhY3RpdmF0ZSB1c2luZwordGhlIFxmQmFjdGl2YXRpb24vYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0XGZQIHNldHRpbmcuCisuYnIKK0luIGEgY2x1c3RlcmVkIFZHLCBjbHZtZCBpcyB1c2VkIGZvciBhY3RpdmF0aW9uLCBhbmQgdGhlCitmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcG9zc2libGU6CisKK1dpdGggXGZCXC1hZXlcZlAsIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gZXhjbHVzaXZlIG1vZGUKKyh3aXRoIGFuIGV4Y2x1c2l2ZSBsb2NrKSwgYWxsb3dpbmcgYSBzaW5nbGUgbm9kZSB0byBhY3RpdmF0ZSB0aGUgTFYuCisKK1dpdGggXGZCXC1hc3lcZlAsIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gc2hhcmVkIG1vZGUKKyh3aXRoIGEgc2hhcmVkIGxvY2spLCBhbGxvd2luZyBtdWx0aXBsZSBub2RlcyB0byBhY3RpdmF0ZSB0aGUgTFYgY29uY3VycmVudGx5LgorSWYgdGhlIExWIHR5cGUgcHJvaGliaXRzIHNoYXJlZCBhY2Nlc3MsIHN1Y2ggYXMgYW4gTFYgd2l0aCBhIHNuYXBzaG90LAordGhlICdcZkJzXGZQJyBvcHRpb24gaXMgaWdub3JlZCBhbmQgYW4gZXhjbHVzaXZlIGxvY2sgaXMgdXNlZC4KKworV2l0aCBcZkJcLWF5XGZQIChubyBtb2RlIHNwZWNpZmllZCksIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gc2hhcmVkIG1vZGUKK2lmIHRoZSBMViB0eXBlIGFsbG93cyBjb25jdXJyZW50IGFjY2Vzcywgc3VjaCBhcyBhIGxpbmVhciBMVi4KK090aGVyd2lzZSwgY2x2bWQgYWN0aXZhdGVzIHRoZSBMViBpbiBleGNsdXNpdmUgbW9kZS4KKworV2l0aCBcZkJcLWFleVxmUCwgXGZCXC1hc3lcZlAsIGFuZCBcZkJcLWF5XGZQLCBjbHZtZCBhdHRlbXB0cyB0byBhY3RpdmF0ZSB0aGUgTFYKK29uIGFsbCBub2Rlcy4gIElmIGV4Y2x1c2l2ZSBtb2RlIGlzIHVzZWQsIHRoZW4gb25seSBvbmUgb2YgdGhlCitub2RlcyB3aWxsIGJlIHN1Y2Nlc3NmdWwuCisKK1dpdGggXGZCXC1hblxmUCwgY2x2bWQgYXR0ZW1wdHMgdG8gZGVhY3RpdmF0ZSB0aGUgTFYgb24gYWxsIG5vZGVzLgorCitXaXRoIFxmQlwtYWx5XGZQLCBjbHZtZCBhY3RpdmF0ZXMgdGhlIExWIG9ubHkgb24gdGhlIGxvY2FsIG5vZGUsIGFuZCBcZkJcLWFsblxmUAorZGVhY3RpdmF0ZXMgb25seSBvbiB0aGUgbG9jYWwgbm9kZS4gIElmIHRoZSBMViB0eXBlIGFsbG93cyBjb25jdXJyZW50CithY2Nlc3MsIHRoZW4gc2hhcmVkIG1vZGUgaXMgdXNlZCwgb3RoZXJ3aXNlIGV4Y2x1c2l2ZS4KKworTFZzIHdpdGggc25hcHNob3RzIGFyZSBhbHdheXMgYWN0aXZhdGVkIGV4Y2x1c2l2ZWx5IGJlY2F1c2UgdGhleSBjYW4gb25seQorYmUgdXNlZCBvbiBvbmUgbm9kZSBhdCBvbmNlLgorCitGb3IgbG9jYWwgVkdzIFxmQlwtYXlcZlAsIFxmQlwtYWV5XGZQLCBhbmQgXGZCXC1hc3lcZlAgYXJlIGFsbCBlcXVpdmFsZW50LgorLgorLkhQCisuQlIgXC1cLWFjdGl2YXRpb25tb2RlCisuUkIgeyBjb21wbGV0ZSB8IGRlZ3JhZGVkIHwgcGFydGlhbCB9CisuYnIKK1RoZSBhY3RpdmF0aW9uIG1vZGUgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvZ2ljYWwgdm9sdW1lcyBhcmUgYWxsb3dlZCB0bworYWN0aXZhdGUgd2hlbiB0aGVyZSBhcmUgcGh5c2ljYWwgdm9sdW1lcyBtaXNzaW5nIChlLmcuIGR1ZSB0byBhIGRldmljZQorZmFpbHVyZSkuICBcZkJjb21wbGV0ZVxmUCBpcyB0aGUgbW9zdCByZXN0cmljdGl2ZTsgYWxsb3dpbmcgb25seSB0aG9zZQorbG9naWNhbCB2b2x1bWVzIHRvIGJlIGFjdGl2YXRlZCB0aGF0IGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhlIG1pc3NpbmcKK1BWcy4gIFxmQmRlZ3JhZGVkXGZQIGFsbG93cyBSQUlEIGxvZ2ljYWwgdm9sdW1lcyB0byBiZSBhY3RpdmF0ZWQgZXZlbiBpZgordGhleSBoYXZlIFBWcyBtaXNzaW5nLiAgKE5vdGUgdGhhdCB0aGUgIlxmSW1pcnJvclxmUCIgc2VnbWVudCB0eXBlIGlzIG5vdAorY29uc2lkZXJlZCBhIFJBSUQgbG9naWNhbCB2b2x1bWUuICBUaGUgIlxmSXJhaWQxXGZQIiBzZWdtZW50IHR5cGUgc2hvdWxkCitiZSB1c2VkIGluc3RlYWQuKSAgRmluYWxseSwgXGZCcGFydGlhbFxmUCBhbGxvd3MgYW55IGxvZ2ljYWwgdm9sdW1lIHRvCitiZSBhY3RpdmF0ZWQgZXZlbiBpZiBwb3J0aW9ucyBhcmUgbWlzc2luZyBkdWUgdG8gYSBtaXNzaW5nIG9yIGZhaWxlZAorUFYuICBUaGlzIGxhc3Qgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIHJlY292ZXJ5IG9yCityZXBhaXIgb3BlcmF0aW9ucy4gIFxmQmRlZ3JhZGVkXGZQIGlzIHRoZSBkZWZhdWx0IG1vZGUuICBUbyBjaGFuZ2UgaXQsCittb2RpZnkgXGZCYWN0aXZhdGlvbl9tb2RlXGZQIGluIFxmQmx2bS5jb25mXGZQKDUpLgorLgorLkhQCisuQlIgXC1LIHwgXC1cLWlnbm9yZWFjdGl2YXRpb25za2lwCisuYnIKK0lnbm9yZSB0aGUgZmxhZyB0byBza2lwIExvZ2ljYWwgVm9sdW1lcyBkdXJpbmcgYWN0aXZhdGlvbi4KKy4KKy5IUAorLkJSIFwtayB8IFwtXC1zZXRhY3RpdmF0aW9uc2tpcAorLlJCIHsgeSB8IG4gfQorLmJyCitDb250cm9scyAgd2hldGhlciBMb2dpY2FsIFZvbHVtZXMgYXJlIHBlcnNpc3RlbnRseSBmbGFnZ2VkIHRvIGJlCitza2lwcGVkIGR1cmluZyBhY3RpdmF0aW9uLiBCeSBkZWZhdWx0LCB0aGluIHNuYXBzaG90IHZvbHVtZXMgYXJlCitmbGFnZ2VkIGZvciBhY3RpdmF0aW9uIHNraXAuICBUbyBhY3RpdmF0ZSBzdWNoIHZvbHVtZXMsCithbiBleHRyYSBcZkJcLVwtaWdub3JlYWN0aXZhdGlvbnNraXBcZlAgb3B0aW9uIG11c3QgYmUgdXNlZC4KK1RoZSBmbGFnIGlzIG5vdCBhcHBsaWVkIGR1cmluZyBkZWFjdGl2YXRpb24uIFRvIHNlZSB3aGV0aGVyCit0aGUgZmxhZyBpcyBhdHRhY2hlZCwgdXNlIFxmQmx2c1xmUCg4KSBjb21tYW5kIHdoZXJlIHRoZSBzdGF0ZQorb2YgdGhlIGZsYWcgaXMgcmVwb3J0ZWQgd2l0aGluIFxmQmx2X2F0dHJcZlAgYml0cy4KKy4KKy5IUAorLkJSIFwtXC1jYWNoZW1vZGUKKy5SQiB7IHBhc3N0aHJvdWdoIHwgd3JpdGViYWNrIHwgd3JpdGV0aHJvdWdoIH0KKy5icgorU3BlY2lmeWluZyBhIGNhY2hlIG1vZGUgZGV0ZXJtaW5lcyB3aGVuIHRoZSB3cml0ZXMgdG8gYSBjYWNoZSBMVgorYXJlIGNvbnNpZGVyZWQgY29tcGxldGUuICBXaGVuIFxmQndyaXRlYmFja1xmUCBpcyBzcGVjaWZpZWQsIGEgd3JpdGUgaXMKK2NvbnNpZGVyZWQgY29tcGxldGUgYXMgc29vbiBhcyBpdCBpcyBzdG9yZWQgaW4gdGhlIGNhY2hlIHBvb2wgTFYuCitJZiBcZkJ3cml0ZXRob3VnaFxmUCBpcyBzcGVjaWZpZWQsIGEgd3JpdGUgaXMgY29uc2lkZXJlZCBjb21wbGV0ZSBvbmx5Cit3aGVuIGl0IGhhcyBiZWVuIHN0b3JlZCBpbiB0aGUgY2FjaGUgcG9vbCBMViBhbmQgb24gdGhlIG9yaWdpbiBMVi4KK1doaWxlIFxmQndyaXRldGhyb3VnaFxmUCBtYXkgYmUgc2xvd2VyIGZvciB3cml0ZXMsIGl0IGlzIG1vcmUKK3Jlc2lsaWVudCBpZiBzb21ldGhpbmcgc2hvdWxkIGhhcHBlbiB0byBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlCitjYWNoZSBwb29sIExWLiBXaXRoIFxmQnBhc3N0aHJvdWdoXGZQIG1vZGUsIGFsbCByZWFkcyBhcmUgc2VydmVkCitmcm9tIG9yaWdpbiBMViAoYWxsIHJlYWRzIG1pc3MgdGhlIGNhY2hlKSBhbmQgYWxsIHdyaXRlcyBhcmUKK2ZvcndhcmRlZCB0byB0aGUgb3JpZ2luIExWOyBhZGRpdGlvbmFsbHksIHdyaXRlIGhpdHMgY2F1c2UgY2FjaGUKK2Jsb2NrIGludmFsaWRhdGVzLiBTZWUgXGZCbHZtY2FjaGUoNylcZlAgZm9yIG1vcmUgZGV0YWlscy4KKy4KKy5IUAorLkJSICBcLVwtY2FjaGVwb2xpY3kKKy5JUiBQb2xpY3kgLAorLkJSIFwtXC1jYWNoZXNldHRpbmdzCisuSVIgS2V5IFxmQj0gVmFsdWUKKy5icgorT25seSBhcHBsaWNhYmxlIHRvIGNhY2hlZCBMVnM7IHNlZSBhbHNvIFxmQmx2bWNhY2hlKDcpXGZQLiBTZXRzCit0aGUgY2FjaGUgcG9saWN5IGFuZCBpdHMgYXNzb2NpYXRlZCB0dW5hYmxlIHNldHRpbmdzLiBJbiBtb3N0IHVzZS1jYXNlcywKK2RlZmF1bHQgdmFsdWVzIHNob3VsZCBiZSBhZGVxdWF0ZS4KKy4KKy5IUAorLkJSIFwtQyB8IFwtXC1jb250aWd1b3VzCisuUkIgeyB5IHwgbiB9CisuYnIKK1RyaWVzIHRvIHNldCBvciByZXNldCB0aGUgY29udGlndW91cyBhbGxvY2F0aW9uIHBvbGljeSBmb3IKK2xvZ2ljYWwgdm9sdW1lcy4gSXQncyBvbmx5IHBvc3NpYmxlIHRvIGNoYW5nZSBhIG5vbi1jb250aWd1b3VzCitsb2dpY2FsIHZvbHVtZSdzIGFsbG9jYXRpb24gcG9saWN5IHRvIGNvbnRpZ3VvdXMsIGlmIGFsbCBvZiB0aGUKK2FsbG9jYXRlZCBwaHlzaWNhbCBleHRlbnRzIGFyZSBhbHJlYWR5IGNvbnRpZ3VvdXMuCisuCisuSFAKKy5CUiBcLVwtZGV0YWNocHJvZmlsZQorLmJyCitEZXRhY2ggYW55IG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gcHJvZmlsZXMgYXR0YWNoZWQgdG8gZ2l2ZW4KK0xvZ2ljYWwgVm9sdW1lcy4gU2VlIFxmQmx2bS5jb25mXGZQKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uCithYm91dCBtZXRhZGF0YSBwcm9maWxlcy4KKy4KKy5IUAorLkJSIFwtXC1kaXNjYXJkcworLlJCIHsgaWdub3JlIHwgbm9wYXNzZG93biB8IHBhc3Nkb3duIH0KKy5icgorU2V0IHRoaXMgdG8gXGZCaWdub3JlXGZQIHRvIGlnbm9yZSBhbnkgZGlzY2FyZHMgcmVjZWl2ZWQgYnkgYQordGhpbiBwb29sIExvZ2ljYWwgVm9sdW1lLiAgU2V0IHRvIFxmQm5vcGFzc2Rvd25cZlAgdG8gcHJvY2VzcyBzdWNoCitkaXNjYXJkcyB3aXRoaW4gdGhlIHRoaW4gcG9vbCBpdHNlbGYgYW5kIGFsbG93IHRoZSBuby1sb25nZXItbmVlZGVkCitleHRlbnRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IG5ldyBkYXRhLiAgU2V0IHRvIFxmQnBhc3Nkb3duXGZQICh0aGUKK2RlZmF1bHQpIHRvIHByb2Nlc3MgdGhlbSBib3RoIHdpdGhpbiB0aGUgdGhpbiBwb29sIGl0c2VsZiBhbmQgdG8KK3Bhc3MgdGhlbSBkb3duIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKy4KKy5IUAorLkJSIFwtXC1lcnJvcndoZW5mdWxsCisuUkIgeyB5IHwgbiB9CisuYnIKK1NldHMgdGhpbiBwb29sIGJlaGF2aW9yIHdoZW4gZGF0YSBzcGFjZSBpcyBleGhhdXNlZC4gU2VlCisuQlIgbHZjcmVhdGUgKDgpCitmb3IgaW5mb3JtYXRpb24uCisuCisuSFAKKy5CUiBcLVwtaWdub3JlbW9uaXRvcmluZworLmJyCitNYWtlIG5vIGF0dGVtcHQgdG8gaW50ZXJhY3Qgd2l0aCBkbWV2ZW50ZCB1bmxlc3MgXGZCXC1cLW1vbml0b3JcZlAKK2lzIHNwZWNpZmllZC4KK0RvIG5vdCB1c2UgdGhpcyBpZiBkbWV2ZW50ZCBpcyBhbHJlYWR5IG1vbml0b3JpbmcgYSBkZXZpY2UuCisuCisuSFAKKy5CUiBcLVwtbWFqb3IKKy5JUiBNYWpvcgorLmJyCitTZXRzIHRoZSBtYWpvciBudW1iZXIuIFRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IG9uIG9sZGVyIHN5c3RlbXMKKyhrZXJuZWwgdmVyc2lvbiAyLjQpIGFuZCBpcyBpZ25vcmVkIG9uIG1vZGVybiBMaW51eCBzeXN0ZW1zIHdoZXJlIG1ham9yCitudW1iZXJzIGFyZSBkeW5hbWljYWxseSBhc3NpZ25lZC4KKy4KKy5IUAorLkJSIFwtXC1taW5vcgorLklSIE1pbm9yCisuYnIKK1NldCB0aGUgbWlub3IgbnVtYmVyLgorLgorLkhQCisuQlIgXC1cLW1ldGFkYXRhcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lCisuYnIKK1VzZXMgYW5kIGF0dGFjaGVzIFxmSVByb2ZpbGVOYW1lXGZQIGNvbmZpZ3VyYXRpb24gcHJvZmlsZSB0byB0aGUgbG9naWNhbAordm9sdW1lIG1ldGFkYXRhLiBXaGVuZXZlciB0aGUgbG9naWNhbCB2b2x1bWUgaXMgcHJvY2Vzc2VkIG5leHQgdGltZSwKK3RoZSBwcm9maWxlIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZC4gSWYgdGhlIHZvbHVtZSBncm91cCBoYXMgYW5vdGhlcgorcHJvZmlsZSBhdHRhY2hlZCwgdGhlIGxvZ2ljYWwgdm9sdW1lIHByb2ZpbGUgaXMgcHJlZmVycmVkLgorU2VlIFxmQmx2bS5jb25mXGZQKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG1ldGFkYXRhIHByb2ZpbGVzLgorLgorLkhQCisuQlIgXC1cLW1vbml0b3IKKy5SQiB7IHkgfCBuIH0KKy5icgorU3RhcnQgb3Igc3RvcCBtb25pdG9yaW5nIGEgbWlycm9yZWQgb3Igc25hcHNob3QgbG9naWNhbCB2b2x1bWUgd2l0aAorZG1ldmVudGQsIGlmIGl0IGlzIGluc3RhbGxlZC4KK0lmIGEgZGV2aWNlIHVzZWQgYnkgYSBtb25pdG9yZWQgbWlycm9yIHJlcG9ydHMgYW4gSS9PIGVycm9yLAordGhlIGZhaWx1cmUgaXMgaGFuZGxlZCBhY2NvcmRpbmcgdG8KK1wlXGZCbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeVxmUCBhbmQgXGZCbWlycm9yX2xvZ19mYXVsdF9wb2xpY3lcZlAKK3NldCBpbiBcZkJsdm0uY29uZlxmUCg1KS4KKy4KKy5IUAorLkJSIFwtXC1ub3VkZXZzeW5jCisuYnIKK0Rpc2FibGUgdWRldiBzeW5jaHJvbmlzYXRpb24uIFRoZQorcHJvY2VzcyB3aWxsIG5vdCB3YWl0IGZvciBub3RpZmljYXRpb24gZnJvbSB1ZGV2LgorSXQgd2lsbCBjb250aW51ZSBpcnJlc3BlY3RpdmUgb2YgYW55IHBvc3NpYmxlIHVkZXYgcHJvY2Vzc2luZworaW4gdGhlIGJhY2tncm91bmQuICBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgaWYgdWRldiBpcyBub3QgcnVubmluZworb3IgaGFzIHJ1bGVzIHRoYXQgaWdub3JlIHRoZSBkZXZpY2VzIExWTTIgY3JlYXRlcy4KKy4KKy5IUAorLkJSIFwtcCB8IFwtXC1wZXJtaXNzaW9uCisuUkIgeyByIHwgcncgfQorLmJyCitDaGFuZ2UgYWNjZXNzIHBlcm1pc3Npb24gdG8gcmVhZC1vbmx5IG9yIHJlYWQvd3JpdGUuCisuCisuSFAKKy5CUiBcLU0gfCBcLVwtcGVyc2lzdGVudAorLlJCIHsgeSB8IG4gfQorLmJyCitTZXQgdG8gXGZCeVxmUCB0byBtYWtlIHRoZSBtaW5vciBudW1iZXIgc3BlY2lmaWVkIHBlcnNpc3RlbnQuCitDaGFuZ2Ugb2YgcGVyc2lzdGVudCBudW1iZXJzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHBvb2wgdm9sdW1lcy4KKy4KKy5IUAorLkJSIFwtXC1wb2xsCisuUkIgeyB5IHwgbiB9CisuYnIKK1dpdGhvdXQgcG9sbGluZyBhIGxvZ2ljYWwgdm9sdW1lJ3MgYmFja2dyb3VuZGVkIHRyYW5zZm9ybWF0aW9uIHByb2Nlc3MKK3dpbGwgbmV2ZXIgY29tcGxldGUuICBJZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIHB2bW92ZSBvciBsdmNvbnZlcnQgKGZvcgorZXhhbXBsZSwgb24gcmVib290aW5nIGFmdGVyIGEgY3Jhc2gpLCB1c2UgXGZCXC1cLXBvbGwgeVxmUCB0byByZXN0YXJ0IHRoZQorcHJvY2VzcyBmcm9tIGl0cyBsYXN0IGNoZWNrcG9pbnQuICBIb3dldmVyLCBpdCBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIHRvCitpbW1lZGlhdGVseSBwb2xsIGEgbG9naWNhbCB2b2x1bWUgd2hlbiBpdCBpcyBhY3RpdmF0ZWQsIHVzZQorXGZCXC1cLXBvbGwgblxmUCB0byBkZWZlciBhbmQgdGhlbiBcZkJcLVwtcG9sbCB5XGZQIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3MuCisuCisuSFAKKy5CUiBcLVwtIFsgcmFpZCBdIG1heHJlY292ZXJ5cmF0ZQorLkJSIFxmSVJhdGUgWyBiIHwgQiB8IHMgfCBTIHwgayB8IEsgfCBtIHwgTSB8IGcgfCBHIF0KKy5icgorU2V0cyB0aGUgbWF4aW11bSByZWNvdmVyeSByYXRlIGZvciBhIFJBSUQgbG9naWNhbCB2b2x1bWUuICBcZklSYXRlXGZQCitpcyBzcGVjaWZpZWQgYXMgYW4gYW1vdW50IHBlciBzZWNvbmQgZm9yIGVhY2ggZGV2aWNlIGluIHRoZSBhcnJheS4KK0lmIG5vIHN1ZmZpeCBpcyBnaXZlbiwgdGhlbiBLaUIvc2VjL2RldmljZSBpcyBhc3N1bWVkLiAgU2V0dGluZyB0aGUKK3JlY292ZXJ5IHJhdGUgdG8gXGZCMFxmUCBtZWFucyBpdCB3aWxsIGJlIHVuYm91bmRlZC4KKy4KKy5IUAorLkJSIFwtXC0gWyByYWlkIF0gbWlucmVjb3ZlcnlyYXRlCisuQlIgXGZJUmF0ZSBbIGIgfCBCIHwgcyB8IFMgfCBrIHwgSyB8IG0gfCBNIHwgZyB8IEcgXQorLmJyCitTZXRzIHRoZSBtaW5pbXVtIHJlY292ZXJ5IHJhdGUgZm9yIGEgUkFJRCBsb2dpY2FsIHZvbHVtZS4gIFxmSVJhdGVcZlAKK2lzIHNwZWNpZmllZCBhcyBhbiBhbW91bnQgcGVyIHNlY29uZCBmb3IgZWFjaCBkZXZpY2UgaW4gdGhlIGFycmF5LgorSWYgbm8gc3VmZml4IGlzIGdpdmVuLCB0aGVuIEtpQi9zZWMvZGV2aWNlIGlzIGFzc3VtZWQuICBTZXR0aW5nIHRoZQorcmVjb3ZlcnkgcmF0ZSB0byBcZkIwXGZQIG1lYW5zIGl0IHdpbGwgYmUgdW5ib3VuZGVkLgorLgorLkhQCisuQlIgXC1cLSBbIHJhaWQgXSBzeW5jYWN0aW9uCisuUkIgeyBjaGVjayB8IHJlcGFpciB9CisuYnIKK1RoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBpbml0aWF0ZSB2YXJpb3VzIFJBSUQgc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMuCitUaGUgXGZCY2hlY2tcZlAgYW5kIFxmQnJlcGFpclxmUCBvcHRpb25zIHByb3ZpZGUgYSB3YXkgdG8gY2hlY2sgdGhlCitpbnRlZ3JpdHkgb2YgYSBSQUlEIGxvZ2ljYWwgdm9sdW1lIChvZnRlbiByZWZlcnJlZCB0byBhcyAic2NydWJiaW5nIikuCitUaGVzZSBvcHRpb25zIGNhdXNlIHRoZSBSQUlEIGxvZ2ljYWwgdm9sdW1lIHRvCityZWFkIGFsbCBvZiB0aGUgZGF0YSBhbmQgcGFyaXR5IGJsb2NrcyBpbiB0aGUgYXJyYXkgYW5kIGNoZWNrIGZvciBhbnkKK2Rpc2NyZXBhbmNpZXMgKGUuZy4gbWlzbWF0Y2hlcyBiZXR3ZWVuIG1pcnJvcnMgb3IgaW5jb3JyZWN0IHBhcml0eSB2YWx1ZXMpLgorSWYgXGZCY2hlY2tcZlAgaXMgdXNlZCwgdGhlIGRpc2NyZXBhbmNpZXMgd2lsbCBiZSBjb3VudGVkIGJ1dCBub3QgcmVwYWlyZWQuCitJZiBcZkJyZXBhaXJcZlAgaXMgdXNlZCwgdGhlIGRpc2NyZXBhbmNpZXMgd2lsbCBiZSBjb3JyZWN0ZWQgYXMgdGhleSBhcmUKK2VuY291bnRlcmVkLiAgVGhlIFxmQmx2c1xmUCg4KSBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHNob3cgdGhlIG51bWJlciBvZgorZGlzY3JlcGFuY2llcyBmb3VuZCBvciByZXBhaXJlZC4KKy4KKy5IUAorLkJSIFwtXC0gWyByYWlkIF0gd3JpdGViZWhpbmQKKy5JUiBJT0NvdW50CisuYnIKK1NwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIHdyaXRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvCitkZXZpY2VzIGluIGEgUkFJRDEgbG9naWNhbCB2b2x1bWUgdGhhdCBhcmUgbWFya2VkIGFzIHdyaXRlLW1vc3RseS4KK09uY2UgdGhpcyB2YWx1ZSBpcyBleGNlZWRlZCwgd3JpdGVzIGJlY29tZSBzeW5jaHJvbm91cyAoaS5lLiBhbGwgd3JpdGVzCit0byB0aGUgY29uc3RpdHVlbnQgZGV2aWNlcyBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgYXJyYXkgc2lnbmFscyB0aGUKK3dyaXRlIGhhcyBjb21wbGV0ZWQpLiAgU2V0dGluZyB0aGUgdmFsdWUgdG8gemVybyBjbGVhcnMgdGhlIHByZWZlcmVuY2UKK2FuZCBhbGxvd3MgdGhlIHN5c3RlbSB0byBjaG9vc2UgdGhlIHZhbHVlIGFyYml0cmFyaWx5LgorLgorLkhQCisuQlIgXC1cLSBbIHJhaWQgXSB3cml0ZW1vc3RseQorLkJSIFxmSVBoeXNpY2FsVm9sdW1lIFsgOiB7IHkgfCBuIHwgdCB9XQorLmJyCitNYXJrIGEgZGV2aWNlIGluIGEgUkFJRDEgbG9naWNhbCB2b2x1bWUgYXMgd3JpdGUtbW9zdGx5LiAgQWxsIHJlYWRzCit0byB0aGVzZSBkcml2ZXMgd2lsbCBiZSBhdm9pZGVkIHVubGVzcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gIFRoaXMga2VlcHMKK3RoZSBudW1iZXIgb2YgSS9PcyB0byB0aGUgZHJpdmUgdG8gYSBtaW5pbXVtLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KK3NldCB0aGUgd3JpdGUtbW9zdGx5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCB2b2x1bWUgaW4gdGhlCitsb2dpY2FsIHZvbHVtZS4gIEl0IGlzIHBvc3NpYmxlIHRvIGFsc28gcmVtb3ZlIHRoZSB3cml0ZS1tb3N0bHkgZmxhZyBieQorYXBwZW5kaW5nIGEgIlxmQjpuXGZQIiB0byB0aGUgcGh5c2ljYWwgdm9sdW1lIG9yIHRvIHRvZ2dsZSB0aGUgdmFsdWUgYnkgc3BlY2lmeWluZworIlxmQjp0XGZQIi4gIFRoZSBcZkJcLVwtd3JpdGVtb3N0bHlcZlAgYXJndW1lbnQgY2FuIGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25lIHRpbWUKK2luIGEgc2luZ2xlIGNvbW1hbmQ7IG1ha2luZyBpdCBwb3NzaWJsZSB0byB0b2dnbGUgdGhlIHdyaXRlLW1vc3RseSBhdHRyaWJ1dGVzCitmb3IgYWxsIHRoZSBwaHlzaWNhbCB2b2x1bWVzIGluIGEgbG9naWNhbCB2b2x1bWUgYXQgb25jZS4KKy4KKy5IUAorLkJSIFwtciB8IFwtXC1yZWFkYWhlYWQKKy5SQiB7IFxmSVJlYWRBaGVhZFNlY3RvcnMgfCBhdXRvIHwgbm9uZSB9CisuYnIKK1NldCByZWFkIGFoZWFkIHNlY3RvciBjb3VudCBvZiB0aGlzIGxvZ2ljYWwgdm9sdW1lLgorRm9yIHZvbHVtZSBncm91cHMgd2l0aCBtZXRhZGF0YSBpbiBsdm0xIGZvcm1hdCwgdGhpcyBtdXN0CitiZSBhIHZhbHVlIGJldHdlZW4gMiBhbmQgMTIwIHNlY3RvcnMuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiXGZCYXV0b1xmUCIgd2hpY2ggYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hvb3NlCithIHN1aXRhYmxlIHZhbHVlIGF1dG9tYXRpY2FsbHkuCisiXGZCbm9uZVxmUCIgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHplcm8uCisuCisuSFAKKy5CUiBcLVwtcmVmcmVzaAorLmJyCitJZiB0aGUgbG9naWNhbCB2b2x1bWUgaXMgYWN0aXZlLCByZWxvYWQgaXRzIG1ldGFkYXRhLgorVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluIG5vcm1hbCBvcGVyYXRpb24sIGJ1dCBtYXkgYmUgdXNlZnVsCitpZiBzb21ldGhpbmcgaGFzIGdvbmUgd3Jvbmcgb3IgaWYgeW91J3JlIGRvaW5nIGNsdXN0ZXJpbmcKK21hbnVhbGx5IHdpdGhvdXQgYSBjbHVzdGVyZWQgbG9jayBtYW5hZ2VyLgorLgorLkhQCisuQlIgXC1cLXJlc3luYworLmJyCitGb3JjZXMgdGhlIGNvbXBsZXRlIHJlc3luY2hyb25pemF0aW9uIG9mIGEgbWlycm9yLiAgSW4gbm9ybWFsCitjaXJjdW1zdGFuY2VzIHlvdSBzaG91bGQgbm90IG5lZWQgdGhpcyBvcHRpb24gYmVjYXVzZSBzeW5jaHJvbml6YXRpb24KK2hhcHBlbnMgYXV0b21hdGljYWxseS4gIERhdGEgaXMgcmVhZCBmcm9tIHRoZSBwcmltYXJ5IG1pcnJvciBkZXZpY2UKK2FuZCBjb3BpZWQgdG8gdGhlIG90aGVycywgc28gdGhpcyBjYW4gdGFrZSBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YKK3RpbWUgLSBhbmQgZHVyaW5nIHRoaXMgdGltZSB5b3UgYXJlIHdpdGhvdXQgYSBjb21wbGV0ZSByZWR1bmRhbnQgY29weQorb2YgeW91ciBkYXRhLgorLgorLkhQCisuQlIgXC1cLXN5c2luaXQKKy5icgorSW5kaWNhdGVzIHRoYXQgXGZCbHZjaGFuZ2VcZlAoOCkgaXMgYmVpbmcgaW52b2tlZCBmcm9tIGVhcmx5IHN5c3RlbQoraW5pdGlhbGlzYXRpb24gc2NyaXB0cyAoZS5nLiByYy5zeXNpbml0IG9yIGFuIGluaXRyZCksCitiZWZvcmUgd3JpdGVhYmxlIGZpbGVzeXN0ZW1zIGFyZSBhdmFpbGFibGUuIEFzIHN1Y2gsCitzb21lIGZ1bmN0aW9uYWxpdHkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgYW5kIHRoaXMgb3B0aW9uCithY3RzIGFzIGEgc2hvcnRjdXQgd2hpY2ggc2VsZWN0cyBhbiBhcHByb3ByaWF0ZSBzZXQgb2Ygb3B0aW9ucy4gQ3VycmVudGx5Cit0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgIFxmQlwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZVxmUCwKK1xmQlwtXC1pZ25vcmVtb25pdG9yaW5nXGZQLCBcZkJcLVwtcG9sbCBuXGZQIGFuZCBzZXR0aW5nCitcZkJMVk1fU1VQUFJFU1NfTE9DS0lOR19GQUlMVVJFX01FU1NBR0VTXGZQCitlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworSWYgXGZCXC1cLXN5c2luaXRcZlAgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCitcZkJsdm1ldGFkXGZQKDgpIGVuYWJsZWQgYW5kIHJ1bm5pbmcsCithdXRvYWN0aXZhdGlvbiBpcyBwcmVmZXJyZWQgb3ZlciBtYW51YWwgYWN0aXZhdGlvbiB2aWEgZGlyZWN0IGx2Y2hhbmdlIGNhbGwuCitMb2dpY2FsIHZvbHVtZXMgYXJlIGF1dG9hY3RpdmF0ZWQgYWNjb3JkaW5nIHRvCitcZkJhdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3RcZlAgc2V0IGluIFxmQmx2bS5jb25mXGZQKDUpLgorLgorLkhQCisuQlIgXC1aIHwgXC1cLXplcm8KKy5SQiB7IHkgfCBuIH0KKy5icgorU2V0IHplcm9pbmcgbW9kZSBmb3IgdGhpbiBwb29sLiBOb3RlOiBhbHJlYWR5IHByb3Zpc2lvbmVkIGJsb2NrcyBmcm9tIHBvb2wKK2luIG5vbi16ZXJvIG1vZGUgYXJlIG5vdCBjbGVhcmVkIGluIHVud3JpdHRlbiBwYXJ0cyB3aGVuIHNldHRpbmcgemVybyB0bworXGZCeVxmUC4KKy4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy4KKy5UUAorLkIgTFZNX1NVUFBSRVNTX0xPQ0tJTkdfRkFJTFVSRV9NRVNTQUdFUworU3VwcHJlc3MgbG9ja2luZyBmYWlsdXJlIG1lc3NhZ2VzLgorLgorLlNIIEV4YW1wbGVzCisuCitDaGFuZ2VzIHRoZSBwZXJtaXNzaW9uIG9uIHZvbHVtZSBsdm9sMSBpbiB2b2x1bWUgZ3JvdXAgdmcwMCB0byBiZSByZWFkLW9ubHk6Cisuc3AKKy5CIGx2Y2hhbmdlIFwtcHIgdmcwMC9sdm9sMQorLgorLlNIIFNFRSBBTFNPCisuCisubmgKKy5CUiBsdm0gKDgpLAorLkJSIGx2bWV0YWQgKDgpLAorLkJSIGx2cyAoOCksCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIHZnY2hhbmdlICg4KSwKKy5CUiBsdm1jYWNoZSAoNyksCisuQlIgbHZtdGhpbiAoNyksCisuQlIgbHZtLmNvbmYgKDUpCmRpZmYgLS1naXQgYS9tYW4vbHZjb252ZXJ0LjguaW4gYi9tYW4vbHZjb252ZXJ0LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkZWEzZAotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdmNvbnZlcnQuOC5pbgpAQCAtMCwwICsxLDExODIgQEAKKy5USCBMVkNPTlZFUlQgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK2x2Y29udmVydCBcKGVtIGNoYW5nZSBMViB0eXBlIGFuZCBvdGhlciB1dGlsaXRpZXMKKy4KKy5TSCBTWU5PUFNJUworCisuQiBsdmNvbnZlcnQKKy5SSSBbIE9QVElPTiBdLi4uCisuSVIgVm9sdW1lR3JvdXAgLyBMb2dpY2FsVm9sdW1lCisKK09QVElPTlM6CisuYnIKKy5CUiBcLWIgLAorLkJSIFwtXC1iYWNrZ3JvdW5kCisuYnIKKy5CUiBcLVwtY2FjaGVwb2xpY3kKKy5JUiBQb2xpY3kKKy5icgorLkJSIFwtXC1jYWNoZXBvb2wKKy5JUiBDYWNoZVBvb2xMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLmJyCisuQlIgXC1cLWNhY2hlc2V0dGluZ3MKKy5JQiBLZXkgPSBWYWx1ZQorLmJyCisuQlIgXC1jICwKKy5CUiBcLVwtY2h1bmtzaXplCisuQlIgXGZJQ2h1bmtTaXplIFsgYiB8IEIgfCBzIHwgUyB8IGsgfCBLIHwgbSB8IE0gfCBnIHwgRyBdCisuYnIKKy5CUiBcLVwtY29yZWxvZworLmJyCisuQlIgXC1cLWRpc2NhcmRzCisuUkIgeyBpZ25vcmUgfCBub3Bhc3Nkb3duIHwgcGFzc2Rvd24gfQorLmJyCisuQlIgXC1pICwKKy5CUiBcLVwtaW50ZXJ2YWwKKy5JUiBTZWNvbmRzCisuYnIKKy5CUiBcLVwtbWVyZ2UKKy5icgorLkJSIFwtXC1taXJyb3Jsb2cKKy5SQiB7IGRpc2sgfCBjb3JlIHwgbWlycm9yZWQgfQorLmJyCisuQlIgXC1tICwKKy5CUiBcLVwtbWlycm9ycworLklSIE51bWJlcgorLmJyCisuQlIgXC1uICwKKy5CUiBcLVwtbmFtZQorLklSIE5hbWUKKy5icgorLkJSIFwtXC1ub3VkZXZzeW5jCisuYnIKKy5CUiBcLVwtb3JpZ2lubmFtZQorLklSIE5ld0V4dGVybmFsT3JpZ2luVm9sdW1lTmFtZQorLmJyCisuQlIgXC1cLXBvb2xtZXRhZGF0YQorLklSIFBvb2xNZXRhZGF0YUxvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9CisuYnIKKy5CUiBcLVwtcG9vbG1ldGFkYXRhc2l6ZQorLkJSIFxmSVBvb2xNZXRhZGF0YVNpemUgWyBiIHwgQiB8IHMgfCBTIHwgayB8IEsgfCBtIHwgTSB8IGcgfCBHIF0KKy5icgorLkJSIFwtXC1wb29sbWV0YWRhdGFzcGFyZQorLlJCIHsgeSB8IG4gfQorLmJyCisuQlIgXC1yICwKKy5CUiBcLVwtcmVhZGFoZWFkCisuUkIgeyBcZklSZWFkQWhlYWRTZWN0b3JzIHwgYXV0byB8IG5vbmUgfQorLmJyCisuQlIgXC1SICwKKy5CUiBcLVwtcmVnaW9uc2l6ZQorLklSIE1pcnJvckxvZ1JlZ2lvblNpemUKKy5icgorLkJSIFwtXC1yZXBhaXIKKy5icgorLkJSIFwtXC1yZXBsYWNlCisuSVIgUGh5c2ljYWxWb2x1bWUKKy5icgorLkJSIFwtXC1zcGxpdGNhY2hlCisuYnIKKy5CUiBcLVwtc3BsaXRtaXJyb3JzCisuSVIgTnVtYmVyCisuYnIKKy5CUiBcLVwtc3BsaXRzbmFwc2hvdAorLmJyCisuQlIgXC1cLXN0cmlwZXMKKy5JUiBOdW1iZXIKKy5icgorLkJSIFwtSSAsCisuQlIgXC1cLXN0cmlwZXNpemUKKy5JUiBTdHJpcGVTaXplCisuYnIKKy5CIFwtXC10eXBlIHN0cmlwZWQKKy5icgorLkIgXC1cLXR5cGUgc25hcHNob3QKK3wKKy5CIFwtXC1zbmFwc2hvdAorfAorLkIgXC1zCisuYnIKKy5CIFwtXC10eXBlIG1pcnJvcgorLmJyCisuQiBcLVwtdHlwZSByYWlkKgorLmJyCisuQiBcLVwtdHlwZSB0aGluCit8CisuQiBcLVwtdGhpbgorfAorLkIgXC1UCisuYnIKKy5CIFwtXC10eXBlIGNhY2hlCit8CisuQiBcLVwtY2FjaGUKK3wKKy5CIFwtSAorLmJyCisuQiBcLVwtdHlwZSB0aGluXC1wb29sCisuYnIKKy5CIFwtXC10eXBlIGNhY2hlXC1wb29sCisuYnIKKy5CUiBcLVwtdGhpbnBvb2wKKy5JUiBUaGluUG9vbExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9CisuYnIKKy5CUiBcLVwtdHJhY2tjaGFuZ2VzCisuYnIKKy5CUiBcLVwtdW5jYWNoZQorLmJyCisuQlIgXC1aICwKKy5CUiBcLVwtemVybworLlJCIHsgeSB8IG4gfQorLmJyCisKK0NvbW1vbiBvcHRpb25zOgorLmJyCisuQlIgXC1BICwKKy5CUiBcLVwtYWxsb2MKKy5JUiBBbGxvY2F0aW9uUG9saWN5CisuYnIKKy5CUiBcLWYgLAorLkJSIFwtXC1mb3JjZQorLmJyCisuQlIgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUKKy5icgorLkJSIFwtaCAsCisuQlIgXC0/ICwKKy5CUiBcLVwtaGVscAorLmJyCisuQlIgXC12ICwKKy5CUiBcLVwtdmVyYm9zZQorLmJyCisuQlIgXC15ICwKKy5CUiBcLVwteWVzCisuYnIKKy5CUiBcLVwtdmVyc2lvbgorCisKKworCisuU0ggREVTQ1JJUFRJT04KKworbHZjb252ZXJ0IGNoYW5nZXMgdGhlIExWIHR5cGUgYW5kIGluY2x1ZGVzIHZhcmlvdXMgTFYgdXRpbGl0aWVzLgorCitUbyBkaXNwbGF5IHRoZSBjdXJyZW50IExWIHR5cGUsIHJ1biB0aGUgY29tbWFuZDoKKworLkIgbHZzIFwtbyBuYW1lLHNlZ3R5cGUKKy5JUiBWRyAvIExWCisKK1RvIGNoYW5nZSB0aGUgTFYgdHlwZSwgcnVuIHRoZSBjb21tYW5kOgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUKKy5JIE5ld1R5cGUKKy5JUiBWRyAvIExWCisKKy5TUyBMViB0eXBlcworCitUaGUgTFYgdHlwZSBpcyBhbHNvIGNhbGxlZCB0aGUgInNlZ21lbnQgdHlwZSIgb3IgInNlZ3R5cGUiLgorCitMVnMgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVzIGNhbiBiZSBtb2RpZmllZCBieSBsdmNvbnZlcnQ6CisuQiBzdHJpcGVkLAorLkIgc25hcHNob3QsCisuQiBtaXJyb3IsCisuQiByYWlkKiwKKy5CIHRoaW4sCisuQiBjYWNoZSwKKy5CIHRoaW5cLXBvb2wsCisuQiBjYWNoZVwtcG9vbC4KKworVGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgYXZhaWxhYmxlIG9uIGVhY2ggTFYgdHlwZSBhcmUgbGlzdGVkIGJlbG93LgorCitUaGUKKy5CIGxpbmVhcgordHlwZSBpcyBlcXVpdmFsZW50IHRvIHRoZQorLkIgc3RyaXBlZAordHlwZSB3aGVuIG9uZSBzdHJpcGUgZXhpc3RzLgorSW4gdGhhdCBjYXNlLCB0aGUgdHlwZXMgY2FuIHNvbWV0aW1lcyBiZSB1c2VkIGludGVyY2hhbmdhYmx5LgorCitJbiBtb3N0IGNhc2VzLCB0aGUKKy5CIG1pcnJvcgordHlwZSBpcyBkZXByZWNhdGVkIGFuZCB0aGUKKy5CIHJhaWQxCit0eXBlIHNob3VsZCBiZSB1c2VkLiAgVGhleSBhcmUgYm90aCBpbXBsZW1lbnRhdGlvbnMgb2YgbWlycm9yaW5nLgorCitUaGUKKy5CIHJhaWQqCit0eXBlIHJlZmVycyB0byBvbmUgb2YgbWFueSByYWlkIGxldmVscywgZS5nLgorLkIgcmFpZDEsCisuQiByYWlkNS4KKworLlNTIExWIGxheWVycworCitJbiBzb21lIGNhc2VzLCBhbiBMViBpcyBhIHNpbmdsZSBkZXZpY2UgbWFwcGVyIChkbSkgbGF5ZXIgYWJvdmUgcGh5c2ljYWwKK2RldmljZXMuICBJbiBvdGhlciBjYXNlcywgaGlkZGVuIExWcyAoZG0gZGV2aWNlcykgYXJlIGxheWVyZWQgYmV0d2VlbiB0aGUKK3Zpc2libGUgTFYgYW5kIHBoeXNpY2FsIGRldmljZXMuICBMVnMgaW4gdGhlIG1pZGRsZSBsYXllcnMgYXJlIHNvbWV0aW1lcworY2FsbGVkIHN1YiBMVnMuCisKK0NoYW5naW5nIHRoZSBMViB0eXBlIHdpbGwgb2Z0ZW4gY2hhbmdlIHRoZSBjb21wb3NpdGlvbiBvZiBzdWIgTFZzLgorCitTdWIgTFZzIGNhbiBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgY29tbWFuZAorLkIgbHZzIC1hLgorCitBIGNvbW1hbmQgcnVuIG9uIGEgdmlzaWJsZSBMViBzb21ldGltZXMgb3BlcmF0ZXMgb24gYSBzdWIgTFYgcmF0aGVyIHRoYW4KK3RoZSBzcGVjaWZpZWQgTFYuICBUaGVzZSBjYXNlcyBhcmUgbm90ZWQgYmVsb3cuCisKK1NvbWV0aW1lcyBhIHN1YiBMViBtdXN0IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgY29tbWFuZCBsaW5lLCBidXQKK3RoaXMgaXMgYSBub24tc3RhbmRhcmQgZm9ybS4gIFRoZXNlIGNhc2VzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0bworYXZvaWQgdGhlIGRpcmVjdCB1c2Ugb2YgaGlkZGVuIExWcy4KKworLlNIIENPTU1BTkRTCisKKy5TUyBPcGVyYXRpb25zIG9uIGEgU3RyaXBlZExWIHdpdGggdHlwZSBzdHJpcGVkIG9yIGxpbmVhcjoKKworXCYKKworLkIgbHZjb252ZXJ0IFwtXC1tZXJnZQorVkcvU3RyaXBlZExWCisuLyIgRklYTUU6IHVzZSAtLW1lcmdlLW1pcnJvcgorLmJyCitcW2J1XQorTWVyZ2UgU3RyaXBlZExWIGludG8gYW4gTFYgd2hlbiBpdCBpcyBhIHByZXZpb3VzbHkgc3BsaXQgbWlycm9yLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtYmFja2dyb3VuZCwgXC1cLWludGVydmFsLgorLmJyCitcW2J1XQorU2VlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIC0tc3BsaXRtaXJyb3JzLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgc25hcHNob3QKK1ZHL1N0cmlwZWRMViBWRy9TbmFwc2hvdExWCisuYnIKK1xbYnVdCitSZWNvbWJpbmUgU3RyaXBlZExWIHdpdGggU25hcHNob3RMViB3aGljaCB3YXMgcHJldmlvdXNseSBzcGxpdC4KKy5icgorXFtidV0KK09wdGlvbnMgXC1cLWNodW5rc2l6ZSwgXC1cLXplcm8uCisuYnIKK1xbYnVdCitTZWUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gLS1zcGxpdHNuYXBzaG90LgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbgorVkcvU3RyaXBlZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFN0cmlwZWRMViB0byB0eXBlIHRoaW4gd2l0aCBhbiBleHRlcm5hbCBvcmlnaW4uCisuYnIKK1xbYnVdCitTdHJpcGVkTFYgYmVjb21lcyBhIHJlYWRcLW9ubHkgZXh0ZXJuYWwgb3JpZ2luIExWIHdpdGggYSBuZXcgbmFtZS4KKy5icgorXFtidV0KK1JlcXVpcmVzIFwtXC10aGlucG9vbCB0byBzcGVjaWZ5IHRoZSB0aGluIHBvb2wgdG8gdXNlLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtb3JpZ2lubmFtZS4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlCitWRy9TdHJpcGVkTFYKKy5icgorXFtidV0KK0NvbnZlcnQgU3RyaXBlZExWIHRvIHR5cGUgY2FjaGUuCisuYnIKK1xbYnVdCitSZXF1aXJlcyBcLVwtY2FjaGVwb29sIHRvIHNwZWNpZnkgdGhlIGNhY2hlIHBvb2wgdG8gdXNlLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2FjaGVwb2xpY3ksIFwtXC1jYWNoZXNldHRpbmdzLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbAorVkcvU3RyaXBlZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFN0cmlwZWRMViB0byB0eXBlIHRoaW5cLXBvb2wuCisuYnIKK1xbYnVdCitUaGUgU3RyaXBlZExWIGlzIHVzZWQgZm9yIHRoaW4gcG9vbCBkYXRhLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2h1bmtzaXplLCBcLVwtZGlzY2FyZHMsIFwtXC1wb29sbWV0YWRhdGF7c2l6ZSxzcGFyZX0sCisuYnIKKyAgXC1cLXJlYWRhaGVhZCwgXC1cLXplcm8uCisKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZVwtcG9vbAorVkcvU3RyaXBlZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFN0cmlwZWRMViB0byB0eXBlIGNhY2hlXC1wb29sLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2h1bmtzaXplLCBcLVwtcG9vbG1ldGFkYXRhe3NpemUsc3BhcmV9LgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgbWlycm9yCitWRy9TdHJpcGVkTFYKKy5icgorXFtidV0KK0NvbnZlcnQgU3RyaXBlZExWIHRvIHR5cGUgbWlycm9yLgorLmJyCitcW2J1XQorUmVxdWlyZXMgXC1cLW1pcnJvcnMgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIG1pcnJvcnMgdG8gdXNlLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtbWlycm9ybG9nLCBcLVwtcmVnaW9uc2l6ZS4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIHJhaWQqCitWRy9TdHJpcGVkTFYKKy5icgorXFtidV0KK0NvbnZlcnQgU3RyaXBlZExWIHRvIHR5cGUgcmFpZCouCisuYnIKK1xbYnVdCitSZXF1aXJlZCBvcHRpb25zIGRlcGVuZCBvbiB0aGUgcmFpZCBsZXZlbC4KKworLlNTIE9wZXJhdGlvbnMgb24gUmFpZExWIHdpdGggdHlwZSByYWlkKjoKKworXCYKKworLkIgbHZjb252ZXJ0IFwtXC1taXJyb3JzCitOdW1iZXIKK1ZHL1JhaWRMVgorLmJyCitcW2J1XQorQ2hhbmdlIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGluIHJhaWQxIFJhaWRMVi4KKworLkIgbHZjb252ZXJ0IFwtXC1zcGxpdG1pcnJvcnMKK051bWJlcgorVkcvUmFpZExWCisuYnIKK1xbYnVdCitTcGxpdCBpbWFnZXMgZnJvbSByYWlkMSBSYWlkTFYgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIG5ldyBMVi4KKy5icgorXFtidV0KK1JlcXVpcmVzIFwtXC1uYW1lIGZvciB0aGUgbmV3IExWLCBvciB0aGUgdXNlIG9mIFwtXC10cmFja2NoYW5nZXMuCisKKy5CIGx2Y29udmVydCBcLVwtbWVyZ2UKK1ZHL1JhaWRMVgorLi8iIEZJWE1FOiB1c2UgLS1tZXJnZS1taXJyb3IKKy5icgorXFtidV0KK01lcmdlIFJhaWRMViBpbnRvIGFuIExWIHdoZW4gaXQgaXMgYSBwcmV2aW91c2x5IHNwbGl0IG1pcnJvci4KKy5icgorXFtidV0KK09wdGlvbnMgXC1cLWJhY2tncm91bmQsIFwtXC1pbnRlcnZhbC4KKy5icgorXFtidV0KK1NlZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiAtLXNwbGl0bWlycm9ycy4KKworLkIgbHZjb252ZXJ0IFwtXC1yZXBhaXIKK1ZHL1JhaWRMVgorLmJyCitcW2J1XQorUmVwbGFjZSBmYWlsZWQgUFZzIGluIFJhaWRMVi4KKworLkIgbHZjb252ZXJ0IFwtXC1yZXBsYWNlCitQVgorVkcvUmFpZExWCisuYnIKK1xbYnVdCitSZXBsYWNlIHNwZWNpZmljIFBWKHMpIGluIGEgcmFpZCogTFYgd2l0aCBhbm90aGVyIFBWLgorLmJyCitcW2J1XQorVGhlIG5ldyBQVihzKSB0byB1c2UgY2FuIGJlIG9wdGlvbmFsbHkgc3BlY2lmaWVkIGFmdGVyIHRoZSBMVi4KKy5icgorXFtidV0KK1JlcGVhdCB0byByZXBsYWNlIG11bHRpcGxlOiBcLVwtcmVwbGFjZSBQVjEgXC1cLXJlcGxhY2UgUFYyIC4uLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgc25hcHNob3QKK1ZHL1JhaWRMVgorVkcvU25hcHNob3RMVgorLmJyCitcW2J1XQorQ29tYmluZSBSYWlkTFYgd2l0aCBTbmFwc2hvdExWIHRoYXQgd2FzIHByZXZpb3VzbHkgc3BsaXQuCisuYnIKK1xbYnVdCitPcHRpb25zIFwtXC1jaHVua3NpemUsIFwtXC16ZXJvLgorLmJyCitcW2J1XQorU2VlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIFwtXC1zcGxpdHNuYXBzaG90LgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbgorVkcvUmFpZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFJhaWRMViB0byB0eXBlIHRoaW4gd2l0aCBhbiBleHRlcm5hbCBvcmlnaW4uCisuYnIKK1xbYnVdCitSYWlkTFYgYmVjb21lcyBhIHJlYWRcLW9ubHkgZXh0ZXJuYWwgb3JpZ2luIExWIHdpdGggYSBuZXcgbmFtZS4KKy5icgorXFtidV0KK1JlcXVpcmVzIFwtXC10aGlucG9vbCB0byBzcGVjaWZ5IHRoZSB0aGluIHBvb2wgdG8gdXNlLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtb3JpZ2lubmFtZS4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlCitWRy9SYWlkTFYKKy5icgorXFtidV0KK0NvbnZlcnQgUmFpZExWIHRvIHR5cGUgY2FjaGUuCisuYnIKK1xbYnVdCitSZXF1aXJlcyBcLVwtY2FjaGVwb29sIHRvIHNwZWNpZnkgdGhlIGNhY2hlIHBvb2wgdG8gdXNlLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2FjaGVwb2xpY3ksIFwtXC1jYWNoZXNldHRpbmdzLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbAorVkcvUmFpZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFJhaWRMViB0byB0eXBlIHRoaW5cLXBvb2wuCisuYnIKK1xbYnVdCitUaGUgUmFpZExWIGlzIHVzZWQgZm9yIHRoaW4gcG9vbCBkYXRhLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2h1bmtzaXplLCBcLVwtZGlzY2FyZHMsIFwtXC1wb29sbWV0YWRhdGF7c2l6ZSxzcGFyZX0sCisuYnIKKyAgXC1cLXJlYWRhaGVhZCwgXC1cLXplcm8uCisKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZVwtcG9vbAorVkcvUmFpZExWCisuYnIKK1xbYnVdCitDb252ZXJ0IFJhaWRMViB0byB0eXBlIGNhY2hlXC1wb29sLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2h1bmtzaXplLCBcLVwtcG9vbG1ldGFkYXRhe3NpemUsc3BhcmV9LgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgcmFpZCoKK1ZHL1JhaWRMVgorLmJyCitcW2J1XQorQ29udmVydCBSYWlkTFYgdG8gdXNlIGEgZGlmZmVyZW50IHJhaWQgbGV2ZWwuCisuYnIKK1xbYnVdCitSZXF1aXJlZCBvcHRpb25zIGRlcGVuZCBvbiB0aGUgcmFpZCBsZXZlbC4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIHN0cmlwZWQKK1ZHL1JhaWRMVgorLmJyCitcW2J1XQorQ29udmVydCBSYWlkTFYgdG8gdHlwZSBzdHJpcGVkLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgbGluZWFyCitWRy9SYWlkTFYKKy5icgorXFtidV0KK0NvbnZlcnQgUmFpZExWIHRvIHR5cGUgbGluZWFyLgorCisuU1MgT3BlcmF0aW9ucyBvbiBNaXJyb3JMViB3aXRoIHR5cGUgbWlycm9yOgorCitcJgorCisuQiBsdmNvbnZlcnQgXC1cLW1pcnJvcnMKK051bWJlcgorVkcvTWlycm9yTFYKKy5icgorXFtidV0KK0NoYW5nZSB0aGUgbnVtYmVyIG9mIGltYWdlcyBpbiBNaXJyb3JMVi4KKworLkIgbHZjb252ZXJ0IFwtXC1zcGxpdG1pcnJvcnMKK051bWJlcgorVkcvTWlycm9yTFYKKy5icgorXFtidV0KK1NwbGl0IGltYWdlcyBmcm9tIE1pcnJvckxWIGFuZCB1c2UgdGhlbSB0byBjcmVhdGUgYSBuZXcgTFYuCisuYnIKK1xbYnVdCitSZXF1aXJlcyBcLVwtbmFtZSBmb3IgdGhlIG5ldyBMVi4KKworLkIgbHZjb252ZXJ0IFwtXC1taXJyb3Jsb2cKK0xvZ1R5cGUKK1ZHL01pcnJvckxWCisuYnIKK1xbYnVdCitDaGFuZ2UgdGhlIHR5cGUgb2YgbG9nIHVzZWQgYnkgTWlycm9yTFYuCisKKy5CIGx2Y29udmVydCBcLVwtcmVwYWlyCitWRy9NaXJyb3JMVgorLmJyCitcW2J1XQorUmVwbGFjZSBmYWlsZWQgUFZzIGluIE1pcnJvckxWLgorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgbGluZWFyCitWRy9NaXJyb3JMVgorLmJyCitcW2J1XQorQ29udmVydCBNaXJyb3JMViB0byB0eXBlIGxpbmVhci4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIHJhaWQqCitWRy9NaXJyb3JMVgorLmJyCitcW2J1XQorQ29udmVydCBNaXJyb3JMViB0byB0eXBlIHJhaWQqLgorLmJyCitcW2J1XQorUmVxdWlyZWQgb3B0aW9ucyBkZXBlbmQgb24gdGhlIHJhaWQgbGV2ZWwuCisKKy5TUyBPcGVyYXRpb25zIG9uIENhY2hlUG9vbExWIHdpdGggdHlwZSBjYWNoZVwtcG9vbDoKKworXCYKKworLkIgbHZjb252ZXJ0IFwtXC1zcGxpdGNhY2hlCitWRy9DYWNoZVBvb2xMVgorLmJyCitcW2J1XQorU3BsaXQgdGhlIGNhY2hlIExWIGZyb20gQ2FjaGVQb29sTFYuCisuYnIKK1xbYnVdCitFcXVpdmFsZW50IHRvIC0tc3BsaXRjYWNoZSBvbiBDYWNoZUxWLgorCisuU1MgT3BlcmF0aW9ucyBvbiBDYWNoZUxWIHdpdGggdHlwZSBjYWNoZToKKworXCYKKworLkIgbHZjb252ZXJ0IFwtXC1zcGxpdGNhY2hlCitWRy9DYWNoZUxWCisuYnIKK1xbYnVdCitTcGxpdCBhbmQga2VlcCB0aGUgY2FjaGUgcG9vbCBmcm9tIENhY2hlTFYuCisKKy5CIGx2Y29udmVydCBcLVwtdW5jYWNoZQorVkcvQ2FjaGVMVgorLmJyCitcW2J1XQorU3BsaXQgYW5kIHJlbW92ZSB0aGUgY2FjaGUgcG9vbCBmcm9tIENhY2hlTFYuCisKKy5CIGx2Y29udmVydCBcLVwtc3BsaXRtaXJyb3JzCitOdW1iZXIKK1ZHL0NhY2hlTFYKKy5icgorXFtidV0KK1NwbGl0IGltYWdlcyBmcm9tIHRoZSBtaXJyb3JlZCBvcmlnaW4gb2YgQ2FjaGVMViB0byBjcmVhdGUgYSBuZXcgTFYuCisuYnIKK1xbYnVdCitPcGVyYXRlcyBvbiBtaXJyb3Igb3IgcmFpZDEgc3ViIExWLgorLmJyCitcW2J1XQorUmVxdWlyZXMgXC1cLW5hbWUgZm9yIHRoZSBuZXcgTFYsIG9yIHRoZSB1c2Ugb2YgXC1cLXRyYWNrY2hhbmdlcy4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIHRoaW5cLXBvb2wKK1ZHL0NhY2hlTFYKKy5icgorXFtidV0KK0NvbnZlcnQgQ2FjaGVMViB0byB0eXBlIHRoaW4tcG9vbC4KKy5icgorXFtidV0KK1RoZSBDYWNoZUxWIGlzIHVzZWQgZm9yIHRoaW4gcG9vbCBkYXRhLgorLmJyCitcW2J1XQorT3B0aW9ucyBcLVwtY2h1bmtzaXplLCBcLVwtZGlzY2FyZHMsIFwtXC1wb29sbWV0YWRhdGF7c2l6ZSxzcGFyZX0sCisuYnIKKyAgXC1cLXJlYWRhaGVhZCwgXC1cLXplcm8uCisKKworLlNTIE9wZXJhdGlvbnMgb24gVGhpblBvb2xMViB3aXRoIHR5cGUgdGhpblwtcG9vbDoKKworXCYKKworLkIgbHZjb252ZXJ0IFwtXC1zcGxpdGNhY2hlCitWRy9UaGluUG9vbExWCisuYnIKK1xbYnVdCitTcGxpdCBhbmQga2VlcCB0aGUgY2FjaGUgcG9vbCBmcm9tIHRoZSBkYXRhIHBvcnRpb24gb2YgVGhpblBvb2xMVi4KKy5icgorXFtidV0KK09wZXJhdGVzIG9uIHRoZSBkYXRhIHN1YiBMViBvZiB0aGUgdGhpbiBwb29sIExWLgorLmJyCitcW2J1XQorVGhlIGRhdGEgc3ViIExWIG9mIHRoZSB0aGluIHBvb2wgbXVzdCBiZSBhIGNhY2hlIExWLgorCisuQiBsdmNvbnZlcnQgXC1cLXVuY2FjaGUKK1ZHL1RoaW5Qb29sTFYKKy5icgorXFtidV0KK1NwbGl0IGFuZCByZW1vdmUgdGhlIGNhY2hlIHBvb2wgZnJvbSB0aGUgZGF0YSBwb3J0aW9uIG9mIFRoaW5Qb29sTFYuCisuYnIKK1xbYnVdCitPcGVyYXRlcyBvbiB0aGUgZGF0YSBzdWIgTFYgb2YgdGhlIHRoaW4gcG9vbCBMVi4KKy5icgorXFtidV0KK1RoZSBkYXRhIHN1YiBMViBvZiB0aGUgdGhpbiBwb29sIG11c3QgYmUgYSBjYWNoZSBMVi4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlCitWRy9UaGluUG9vbExWCisuYnIKK1xbYnVdCitDb252ZXJ0IHRoZSBkYXRhIHBvcnRpb24gb2YgVGhpblBvb2xMViB0byB0eXBlIGNhY2hlLgorLmJyCitcW2J1XQorT3BlcmF0ZXMgb24gdGhlIGRhdGEgc3ViIExWIG9mIHRoZSB0aGluIHBvb2wgTFYuCisuYnIKK1xbYnVdCitPcHRpb25zIFwtXC1jYWNoZXBvbGljeSwgXC1cLWNhY2hlc2V0dGluZ3MuCisKKy5CIGx2Y29udmVydCBcLVwtcmVwYWlyCitWRy9UaGluUG9vbExWCisuYnIKK1xbYnVdCitSZXBhaXIgVGhpblBvb2xMVi4KKworLlNTIE9wZXJhdGlvbnMgb24gVGhpbkxWIHdpdGggdHlwZSB0aGluOgorCitcJgorCisuQiBsdmNvbnZlcnQgXC1cLW1lcmdlCitWRy9UaGluTFYKKy4vIiBGSVhNRTogdXNlIC0tbWVyZ2Utc25hcHNob3QKKy5icgorXFtidV0KK01lcmdlIFRoaW5MViBpbnRvIGl0cyBvcmlnaW4gTFYuCisuYnIKK1xbYnVdCitUaGluTFYgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBhcyBhIHNuYXBzaG90IG9mIGFub3RoZXIgdGhpbiBMVi4KKy5icgorXFtidV0KK09wdGlvbnMgXC1cLWJhY2tncm91bmQsIFwtXC1pbnRlcnZhbC4KKworLlNTIE9wZXJhdGlvbnMgb24gU25hcHNob3RMViB3aXRoIHR5cGUgc25hcHNob3Q6CisKK1wmCisKKy5CIGx2Y29udmVydCBcLVwtc3BsaXRzbmFwc2hvdAorVkcvU25hcHNob3RMVgorLmJyCitcW2J1XQorU2VwYXJhdGUgQ09XIHNuYXBzaG90IFNuYXBzaG90TFYgZnJvbSBpdHMgb3JpZ2luIExWLgorCisuQiBsdmNvbnZlcnQgXC1cLW1lcmdlCitWRy9TbmFwc2hvdExWCisuLyIgRklYTUU6IHVzZSAtLW1lcmdlLXNuYXBzaG90CisuYnIKK1xbYnVdCitNZXJnZSBDT1cgc25hcHNob3QgU25hcHNob3RMViBpbnRvIGl0cyBvcmlnaW4uCisuYnIKK1xbYnVdCitPcHRpb25zIFwtXC1iYWNrZ3JvdW5kLCBcLVwtaW50ZXJ2YWwuCisKKy5TSCBPUFRJT05TCisuCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5icgorLgorLkhQCisuQlIgXC1iICwKKy5CUiBcLVwtYmFja2dyb3VuZAorLmJyCitJZiB0aGUgb3BlcmF0aW9uIHJlcXVpcmVzIHBvbGxpbmcsIHRoaXMgb3B0aW9uIGNhdXNlcyB0aGUgY29tbWFuZCB0bworcmV0dXJuIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCBhbmQgcG9sbGluZyBpcyBkb25lIGluIHRoZQorYmFja2dyb3VuZC4KKy4KKy5IUAorLkJSIFwtXC1jYWNoZXBvbGljeQorLklSIFBvbGljeQorLmJyCitTcGVjaWZpZXMgdGhlIGNhY2hlIHBvbGljeSBmb3IgYSBjYWNoZSBMVi4gIEFsc28gc2VlCisuQlIgbHZtY2FjaGUgKDcpLgorLgorLkhQCisuQlIgXC1cLWNhY2hlcG9vbAorLklSIENhY2hlUG9vbExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9CisuYnIKK1NwZWNpZmllcyB0aGUgY2FjaGUgcG9vbCB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIGFuIExWIHRvIGEgY2FjaGUgTFYuICBJZgorQ2FjaGVQb29sTG9naWNhbFZvbHVtZSBpcyBub3QgeWV0IGEgY2FjaGUgcG9vbCwgdGhlIGNvbW1hbmQgd2lsbCBhdHRlbXB0Cit0byBjb252ZXJ0IGl0IGludG8gYSBjYWNoZSBwb29sIHByaW9yIHRvIHRoZSBjYWNoZSBMViBjb252ZXJzaW9uLgorQWxzbyBzZWUKKy5CUiBsdm1jYWNoZSAoNykuCisuCisuSFAKKy5CUiBcLVwtY2FjaGVzZXR0aW5ncworLklCIEtleSA9IFZhbHVlCisuYnIKK1NwZWNpZmllcyB0dW5hYmxlIHZhbHVlcyBmb3IgYSBjYWNoZSBMVi4gIChUaGUgZGVmYXVsdCB2YWx1ZXMgc2hvdWxkCit1c3VhbGx5IGJlIGFkZXF1YXRlLikgIFRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZSBcZkJkZWZhdWx0XGZQIHN3aXRjaGVzCitzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQga2VybmVsIHZhbHVlcyBhbmQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlCitsaXN0IG9mIHNldHRpbmdzIHN0b3JlZCBpbiBMVk0gbWV0YWRhdGEuCitBbHNvIHNlZQorLkJSIGx2bWNhY2hlICg3KS4KKy4KKy5IUAorLkJSIFwtYyAsCisuQlIgXC1cLWNodW5rc2l6ZQorLkJSIFxmSUNodW5rU2l6ZSBbIGIgfCBCIHwgcyB8IFMgfCBrIHwgSyB8IG0gfCBNIHwgZyB8IEcgXQorLmJyCitTZXRzIHRoZSBjaHVuayBzaXplIGZvciBhIHNuYXBzaG90LCBjYWNoZSBwb29sIG9yIHRoaW4gcG9vbC4KK1RoZSBkZWZhdWx0IHVuaXQgaXMgaW4ga2lsb2J5dGVzLgorLnNwCitGb3Igc25hcHNob3RzLCB0aGUgdmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgYmV0d2VlbiA0S2lCIGFuZCA1MTJLaUIKK2FuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA0LgorLnNwCitGb3IgYSBjYWNoZSBwb29sIHRoZSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMzJLaUIgYW5kIDFHaUIgYW5kCit0aGUgZGVmYXVsdCB2YWx1ZSBpcyA2NC4KKy5zcAorRm9yIGEgdGhpbiBwb29sIHRoZSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gNjRLaUIgYW5kCisxR2lCIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBzdGFydHMgd2l0aCA2NCBhbmQgc2NhbGVzCit1cCB0byBmaXQgdGhlIHBvb2wgbWV0YWRhdGEgc2l6ZSB3aXRoaW4gMTI4TWlCLAoraWYgdGhlIHBvb2wgbWV0YWRhdGEgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkLgorVGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NEtpQi4KKyhFYXJseSBrZXJuZWwgc3VwcG9ydCB1bnRpbCB0aGluIHRhcmdldCB2ZXJzaW9uIDEuNCByZXF1aXJlZCB0aGUgdmFsdWUKK3RvIGJlIGEgcG93ZXIgb2YgMi4gIERpc2NhcmRzIHdlcmUgbm90IHN1cHBvcnRlZCBmb3Igbm9uLXBvd2VyIG9mIDIgdmFsdWVzCit1bnRpbCB0aGluIHRhcmdldCB2ZXJzaW9uIDEuNS4pCisuCisuSFAKKy5CUiBcLVwtY29yZWxvZworLmJyCitTcGVjaWZpZXMgb3IgY2hhbmdlcyB0aGUgbG9nIHR5cGUgZm9yIGEgbWlycm9yIExWLgorSXQgaXMgYW4gYWxpYXMgZm9yIFxmQlwtXC1taXJyb3Jsb2cgY29yZVxmUC4KKyhUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgXGZCcmFpZDFcZlAgTFYgdHlwZS4pCisuCisuSFAKKy5CUiBcLVwtZGlzY2FyZHMKKy5SQiB7IGlnbm9yZSB8IG5vcGFzc2Rvd24gfCBwYXNzZG93biB9CisuYnIKK1NwZWNpZmllcyBpZiBkaXNjYXJkcyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgdGhpbiBsYXllciBpbiB0aGUKK2tlcm5lbCBhbmQgcGFzc2VkIGRvd24gdG8gdGhlIFBoeXNpY2FsIFZvbHVtZS4gIFRoaXMgYXBwbGllcyBvbmx5Cit0byB0aGluIHBvb2xzLiAgVGhlIGRlZmF1bHQgaXMgXGZCcGFzc2Rvd25cZlAuCitBbHNvIHNlZQorLkJSIGx2bXRoaW4gKDcpLgorLgorLkhQCisuQlIgXC1IICwKKy5CUiBcLVwtY2FjaGUKKy5icgorQWxpYXMgZm9yCisuQiBcLVwtdHlwZSBjYWNoZS4KK1NlZSBDT01NQU5EUyBkZXNjcmlwdGlvbiBmb3IKKy5icgorLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlLgorLgorLkhQCisuQlIgXC1pICwKKy5CUiBcLVwtaW50ZXJ2YWwKKy5JUiBTZWNvbmRzCisuYnIKK1JlcG9ydCBwcm9ncmVzcyBhcyBhIHBlcmNlbnRhZ2UgYXQgcmVndWxhciBpbnRlcnZhbHMuCisuCisuSFAKKy5CUiBcLVwtbWVyZ2UKKy5icgorTWVyZ2VzIGEgc25hcHNob3QgdGhhdCB3YXMgc3BsaXQgZnJvbSBhbiBvcmlnaW4gTFYgdXNpbmcKK1xmQlwtXC1zcGxpdHNuYXBzaG90XGZQLCBiYWNrIGludG8gdGhlIG9yaWdpbiBMVi4KKworTWVyZ2VzIGEgcmFpZDEgaW1hZ2UgdGhhdCB3YXMgc3BsaXQgZnJvbSBhIHJhaWQxIExWIHVzaW5nCitcZkJcLVwtc3BsaXRzbmFwc2hvdFxmUCBhbmQgXGZCXC1cLXRyYWNrY2hhbmdlc1xmUCwgYmFjayBpbnRvCit0aGUgb3JpZ2luYWwgcmFpZDEgTFYuCisKK1RvIGNoZWNrIGlmIHRoZSBrZXJuZWwgc3VwcG9ydHMgdGhlIHNuYXBzaG90IG1lcmdlIGZlYXR1cmUsIGxvb2sgZm9yCisic25hcHNob3RcLW1lcmdlIiBpbiB0aGUgb3V0cHV0IG9mIFxmQmRtc2V0dXAgdGFyZ2V0c1xmUC4KKworV2hlbiBtZXJnaW5nIGEgc25hcHNob3QsIGlmIGJvdGggdGhlIG9yaWdpbiBhbmQgc25hcHNob3QgTFZzIGFyZSBub3Qgb3BlbiwKK3RoZSBtZXJnZSB3aWxsIHN0YXJ0IGltbWVkaWF0ZWx5LiAgT3RoZXJ3aXNlLCB0aGUgbWVyZ2Ugd2lsbCBzdGFydCB0aGUKK2ZpcnN0IHRpbWUgZWl0aGVyIHRoZSBvcmlnaW4gb3Igc25hcHNob3QgTFYgYXJlIGFjdGl2YXRlZCBhbmQgYm90aCBhcmUKK2Nsb3NlZC4gIE1lcmdpbmcgYSBzbmFwc2hvdCBpbnRvIGFuIG9yaWdpbiB0aGF0IGNhbm5vdCBiZSBjbG9zZWQsIGZvcgorZXhhbXBsZSBhIHJvb3QgZmlsZXN5c3RlbSwgaXMgZGVmZXJyZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgb3JpZ2luCit2b2x1bWUgaXMgYWN0aXZhdGVkLiAgV2hlbiBtZXJnaW5nIHN0YXJ0cywgdGhlIHJlc3VsdGluZyBMViB3aWxsIGhhdmUgdGhlCitvcmlnaW4ncyBuYW1lLCBtaW5vciBudW1iZXIgYW5kIFVVSUQuICBXaGlsZSB0aGUgbWVyZ2UgaXMgaW4gcHJvZ3Jlc3MsCityZWFkcyBvciB3cml0ZXMgdG8gdGhlIG9yaWdpbiBhcHBlYXIgYXMgYmVpbmcgZGlyZWN0ZWQgdG8gdGhlIHNuYXBzaG90CitiZWluZyBtZXJnZWQuICBXaGVuIHRoZSBtZXJnZSBmaW5pc2hlcywgdGhlIG1lcmdlZCBzbmFwc2hvdCBpcyByZW1vdmVkLgorTXVsdGlwbGUgc25hcHNob3RzIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBhIEB0YWcgbWF5IGJlCit1c2VkIHRvIHNwZWNpZnkgbXVsdGlwbGUgc25hcHNob3RzIGJlIG1lcmdlZCB0byB0aGVpciByZXNwZWN0aXZlIG9yaWdpbi4KKy4KKy5IUAorLkJSIFwtXC1taXJyb3Jsb2cKKy5SQiB7IGRpc2sgfCBjb3JlIHwgbWlycm9yZWQgfQorLmJyCitTcGVjaWZpZXMgb3IgY2hhbmdlcyB0aGUgbG9nIHR5cGUgZm9yIGEgbWlycm9yIExWLgorVGhlIGRlZmF1bHQgaXMgXGZCZGlza1xmUCwgd2hpY2ggaXMgcGVyc2lzdGVudCBhbmQgcmVxdWlyZXMKK2Egc21hbGwgYW1vdW50IG9mIHN0b3JhZ2Ugc3BhY2UsIHVzdWFsbHkgb24gYSBzZXBhcmF0ZSBkZXZpY2UKK2Zyb20gdGhlIGRhdGEgYmVpbmcgbWlycm9yZWQuCitcZkJDb3JlXGZQIG1heSBiZSB1c2VmdWwgZm9yIHNob3J0LWxpdmVkIG1pcnJvcnMuICBJdCBtZWFucyB0aGUgbWlycm9yIGlzCityZWdlbmVyYXRlZCBieSBjb3B5aW5nIHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IGRldmljZSBhZ2FpbiBldmVyeQordGltZSB0aGUgZGV2aWNlIGlzIGFjdGl2YXRlZCAtIGUuZy4gcG9zc2libHkgYWZ0ZXIgZXZlcnkgcmVib290LgorVXNpbmcgXGZCbWlycm9yZWRcZlAgd2lsbCBjcmVhdGUgYSBwZXJzaXN0ZW50IGxvZyB0aGF0IGlzIGl0c2VsZiBtaXJyb3JlZC4KKyhUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgXGZCcmFpZDFcZlAgTFYgdHlwZS4pCisuCisuSFAKKy5CUiBcLW0gLAorLkJSIFwtXC1taXJyb3JzCisuSVIgTnVtYmVyCisuYnIKK1NwZWNpZmllcyB0aGUgbnVtYmVyIG1pcnJvciBpbWFnZXMgaW4gYWRkaXRpb24gdG8gdGhlIG9yaWdpbmFsIExWIGltYWdlLAorZS5nLiBcZkJcLVwtbWlycm9ycyAxXGZQIG1lYW5zIHR3byBjb3BpZXMgb2YgdGhlIGRhdGEsIHRoZSBvcmlnaW5hbCBhbmQKK29uZSBtaXJyb3IgaW1hZ2UuCisKK1RoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gY29udmVydGluZyBhbiBMViB0byBhIFxmQnJhaWQxXGZQIG9yCitcZkJtaXJyb3JcZlAgTFYuCisKK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIGFsb25lIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIG1pcnJvciBpbWFnZXMgaW4gYW4KK2V4aXN0aW5nIFxmQnJhaWQxXGZQIG9yIFxmQm1pcnJvclxmUCBMVi4KKworVGhlIHNwZWNpYWwgY2FzZSBcZkJcLVwtbWlycm9ycyAwXGZQIGhhcyBiZWVuIHVzZWQgaGlzdG9yaWNhbGx5IHRvCitpbmRpY2F0ZSBhIGxpbmVhciBMViB3aXRoIG5vIG1pcnJvciBpbWFnZXMuCisuCisuSFAKKy5CUiBcLW4gLAorLkJSIFwtXC1uYW1lCisuSVIgTmFtZQorLmJyCitTcGVjaWZpZXMgdGhlIG5hbWUgdG8gdXNlIHdoZW4gdGhlIGNvbW1hbmQgaXMgY3JlYXRpbmcgYSBuZXcgTFYsIGUuZy4KKy5CIFwtXC1zcGxpdG1pcnJvcnMuCisuCisuSFAKKy5CUiBcLVwtbm91ZGV2c3luYworLmJyCitEaXNhYmxlcyB1ZGV2IHN5bmNocm9uaXNhdGlvbi4gVGhlIHByb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9uCitmcm9tIHVkZXYuICBJdCB3aWxsIGNvbnRpbnVlIGlycmVzcGVjdGl2ZSBvZiBhbnkgcG9zc2libGUgdWRldiBwcm9jZXNzaW5nCitpbiB0aGUgYmFja2dyb3VuZC4gIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyBpZiB1ZGV2IGlzIG5vdCBydW5uaW5nIG9yIGhhcworcnVsZXMgdGhhdCBpZ25vcmUgdGhlIGRldmljZXMgTFZNIGNyZWF0ZXMuCisuCisuSFAKKy5CUiBcLVwtb3JpZ2lubmFtZQorLklSIE5ld0V4dGVybmFsT3JpZ2luVm9sdW1lTmFtZQorLmJyCitTcGVjaWZpZXMgdGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgZXh0ZXJuYWwgb3JpZ2luIExWIHdoZW4gY29udmVydGluZyBhbiBMVgordG8gYSB0aGluIExWLiAgVGhlIExWIGJlaW5nIGNvbnZlcnRlZCBiZWNvbWVzIGEgcmVhZFwtb25seSBleHRlcm5hbCBvcmlnaW4KK3dpdGggdGhpcyBuYW1lLgorLmJyCitXaXRob3V0IHRoaXMgb3B0aW9uLCB0aGUgZGVmYXVsdCBuYW1lIG9mICJsdm9sPG4+IiB3aWxsIGJlIGdlbmVyYXRlZCB3aGVyZQorPG4+IGlzIHRoZSBMVk0gaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSBMVi4KKy5icgorLgorLlwiIC5IUAorLlwiIC5CUiBcLVwtcG9vbGRhdGFzaXplCisuXCIgLklSIFBvb2xEYXRhVm9sdW1lU2l6ZSBbIFxmQmJCc1NrS21NZ0d0VHBQZUUgXQorLlwiIC5icgorLlwiIFNldHMgdGhlIHNpemUgb2YgcG9vbCdzIGRhdGEgbG9naWNhbCB2b2x1bWUuCisuXCIgVGhlIG9wdGlvbiBcZkJcLVwtc2l6ZVxmUCBjb3VsZCBiZSBzdGlsbCB1c2VkIHdpdGggdGhpbiBwb29scy4KKy4KKy5IUAorLkJSIFwtXC1wb29sbWV0YWRhdGEKKy5JUiBQb29sTWV0YWRhdGFMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLmJyCitTcGVjaWZpZXMgdGhlIExWIHRvIHVzZSBmb3IgdGhpbiBwb29sIG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBhbiBMViB0byBhCit0aGluIHBvb2wgTFYuCisuYnIKK1NwZWNpZmllcyB0aGUgTFYgdG8gdXNlIGZvciBjYWNoZSBwb29sIG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBhbiBMViB0byBhCitjYWNoZSBwb29sIExWLgorLmJyCitUaGUgc2l6ZSBzaG91bGQgYmUgYmV0d2VlbiAyTWlCIGFuZCAxNkdpQi4KKy5icgorKFRoaXMgb3B0aW9uIGNhbiBhbHNvIGJlIHVzZWQgd2hlbiBhIHRoaW4gcG9vbCBvciBjYWNoZSBwb29sIGFyZSBjcmVhdGVkCithcyBhbiBhdXhpbGlhcnkgb3BlcmF0aW9uIHdpdGhpbiBhIGRpZmZlcmVudCBjb21tYW5kLikKK0Fsc28gc2VlCisuQlIgbHZtdGhpbiAoNyksCithbmQKKy5CUiBsdm1jYWNoZSAoNykuCisuCisuSFAKKy5CUiBcLVwtcG9vbG1ldGFkYXRhc2l6ZQorLkJSIFxmSVBvb2xNZXRhZGF0YVNpemUgWyBiIHwgQiB8IHMgfCBTIHwgayB8IEsgfCBtIHwgTSB8IGcgfCBHIF0KKy5icgorU3BlY2lmaWVzIHRoZSBzaXplIG9mIGEgY2FjaGUgcG9vbCBtZXRhZGF0YSBMViBvciBhIHRoaW4gcG9vbCBtZXRhZGF0YSBMVi4KK1RoaXMgaXMgdXNlZCBpZiBhIGNvbW1hbmQgY3JlYXRlcyBhIHBvb2wgbWV0YWRhdGEgTFYgYXV0b21hdGljYWxseSBhcyBwYXJ0CitvZiB0aGUgb3BlcmF0aW9uLiAgVGhpcyBvcHRpb24gaXMgbm90IHVzZWQgd2hlbiBhbiBleGlzdGluZyBMViBpcworc3BlY2lmaWVkIGFzIHRoZSBwb29sIG1ldGFkYXRhIExWLCBpLmUuIFxmQlwtXC1wb29sbWV0YWRhdGFcZlAuCitUaGUgZGVmYXVsdCB1bml0IGlzIG1lZ2FieXRlcy4KK0Fsc28gc2VlCisuQlIgbHZtdGhpbiAoNyksCithbmQKKy5CUiBsdm1jYWNoZSAoNykuCisuCisuSFAKKy5CUiBcLVwtcG9vbG1ldGFkYXRhc3BhcmUKKy5SQiB7IHkgfCBuIH0KKy5icgorU3BlY2lmaWVzIGlmIGEgc3BhcmUgcG9vbCBtZXRhZGF0YSBMViBzaG91bGQgYmUgY3JlYXRlZC4KK0Egc3BhcmUgcG9vbCBtZXRhZGF0YSBMViB3aWxsIGJlIHVzZWQgZm9yIHBvb2wgcmVwYWlyLgorT25seSBvbmUgc3BhcmUgcG9vbCBtZXRhZGF0YSBMViBpcyBtYWludGFpbmVkIHdpdGhpbiBhIFZHLCB3aXRoIHRoZSBzaXplCitvZiB0aGUgbGFyZ2VzdCBleGlzdGluZyBwb29sIG1ldGFkYXRhIExWLgorVGhlIGRlZmF1bHQgaXMgXGZCeVxmUGVzLgorLgorLkhQCisuQlIgXC1yICwKKy5CUiBcLVwtcmVhZGFoZWFkCisuUkIgeyBcZklSZWFkQWhlYWRTZWN0b3JzIHwgYXV0byB8IG5vbmUgfQorLmJyCitTcGVjaWZpZXMgdGhlIHJlYWQgYWhlYWQgc2VjdG9yIGNvdW50IG9mIGEgdGhpbiBwb29sIG1ldGFkYXRhIExWLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgXGZCYXV0b1xmUCB3aGljaCBhbGxvd3MgdGhlIGtlcm5lbCB0byBjaG9vc2UKK2Egc3VpdGFibGUgdmFsdWUgYXV0b21hdGljYWxseS4KK1xmQk5vbmVcZlAgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHplcm8uCisuCisuSFAKKy5CUiBcLVIgLAorLkJSIFwtXC1yZWdpb25zaXplCisuSVIgTWlycm9yTG9nUmVnaW9uU2l6ZQorLmJyCitBIG1pcnJvciBMViBpcyBkaXZpZGVkIGludG8gcmVnaW9ucyBvZiB0aGlzIHNpemUgKGluIE1CKSwgYW5kIHRoZSBtaXJyb3IKK2xvZyB1c2VzIHRoaXMgZ3JhbnVsYXJpdHkgdG8gdHJhY2sgd2hpY2ggcmVnaW9ucyBhcmUgaW4gc3luYy4KKyhUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgXGZCcmFpZDFcZlAgTFYgdHlwZS4pCisuCisuSFAKKy5CUiBcLVwtcmVwYWlyCisuYnIKK1JlcGxhY2VzIGZhaWxlZCBQVnMgaW4gYSByYWlkMSBvciBtaXJyb3IgTFYgd2l0aCBvdGhlciBQVnMgYXZhaWxhYmxlIGluCit0aGUgVkcuICBCeSBkZWZhdWx0LCB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIG1pcnJvciBpbWFnZXMgd2lsbCBiZSByZXN0b3JlZAoraWYgcG9zc2libGUuICBTcGVjaWZ5IFxmQlwteVxmUCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIHNraXAgdGhlIHByb21wdHMuCitVc2UgXGZCXC1mXGZQIGlmIHlvdSBkbyBub3Qgd2FudCBhbnkgcmVwbGFjZW1lbnQuICBZb3UgbWF5IHVzZQorXGZCXC1cLXVzZVwtcG9saWNpZXNcZlAgdG8gdXNlIHRoZSBkZXZpY2UgcmVwbGFjZW1lbnQgcG9saWN5IHNwZWNpZmllZCBpbgorXGZCbHZtLmNvbmZcZlAoNSksIHNlZSBcZkJhY3RpdmF0aW9uL21pcnJvcl9sb2dfZmF1bHRfcG9saWN5XGZQIG9yCitcZkJhY3RpdmF0aW9uL21pcnJvcl9kZXZpY2VfZmF1bHRfcG9saWN5XGZQLgorCitXaGVuIHVzZWQgd2l0aCBhIHRoaW4gcG9vbCBMViwgdGhpcyBvcHRpb24gYXV0b21hdGVzIHRoZSB1c2Ugb2YgdGhlCitcZkJ0aGluX3JlcGFpclxmUCg4KSB0b29sIG9uIHRoZSB0aGluIHBvb2wuICBUaGlzIHJlcGFpcnMgYSB2ZXJ5IGxpbWl0dGVkCitudW1iZXIgb2YgcHJvYmxlbXMuICBPbmx5IGluYWN0aXZlIHRoaW4gcG9vbHMgY2FuIGJlIHJlcGFpcmVkLiAgVGhlcmUgaXMKK25vIHZhbGlkYXRpb24gb2YgbWV0YWRhdGEgYmV0d2VlbiBrZXJuZWwgYW5kIExWTS4gIFRoaXMgcmVxdWlyZXMgZnVydGhlcgorbWFudWFsIHdvcmsuICBBZnRlciBzdWNjZXNzZnVsbCByZXBhaXIgdGhlIG9sZCB1bm1vZGlmaWVkIG1ldGFkYXRhIGFyZQorc3RpbGwgYXZhaWxhYmxlIGluICI8cG9vbD5fbWV0YTxuPiIgTFYuCitBbHNvIHNlZQorLkJSIGx2bXRoaW4gKDcpLgorLgorLkhQCisuQlIgXC1cLXJlcGxhY2UKKy5JUiBQaHlzaWNhbFZvbHVtZQorLmJyCitSZW1vdmUgdGhlIHNwZWNpZmllZCBkZXZpY2UgXGZJUGh5c2ljYWxWb2x1bWVcZlAgYW5kIHJlcGxhY2UgaXQgd2l0aCBvbmUKK3RoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSBWRywgb3IgZnJvbSBhIHNwZWNpZmljIGxpc3Qgb2YgUFZzIHNwZWNpZmllZCBvbgordGhlIGNvbW1hbmQgbGluZSBmb2xsb3dpbmcgdGhlIExWIG5hbWUuIFRoaXMgb3B0aW9uIG1heSBiZSByZXBlYXRlZCBtdWx0aXBsZQordGltZXMgZGVwZW5kaW5nIG9uIHRoZSBSYWlkTFYgdHlwZS4KKy4KKy5IUAorLkJSIFwtcyAsCisuQlIgXC1cLXNuYXBzaG90CisuYnIKK0FsaWFzIGZvcgorLkIgXC1cLXR5cGUgc25hcHNob3QuCitTZWUgQ09NTUFORFMgZGVzY3JpcHRpb24gZm9yCisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBzbmFwc2hvdC4KKy5IUAorLkJSIFwtXC1zcGxpdAorLmJyCitTZXBhcmF0ZXMgXGZJU3BsaXRhYmxlTG9naWNhbFZvbHVtZVxmUC4KK1RoaXMgb3B0aW9uIHRyaWVzIHRvIGRldGVjdCB0aGUgbmVjZXNzYXJ5IHNwbGl0IG9wZXJhdGlvbiBmcm9tIGl0cyBhcmd1bWVudHMuCitBdm9pZCB1c2luZyB0aGlzIG9wdGlvbiBhbmQgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQ6CisuQiBcLVwtc3BsaXRjYWNoZSwgXC1cLXNwbGl0bWlycm9ycywgXC1cLXNwbGl0c25hcHNob3QuCisuCisuSFAKKy5CUiBcLVwtc3BsaXRjYWNoZQorLmJyCitTZXBhcmF0ZXMgYSBjYWNoZSBwb29sIGZyb20gYSBjYWNoZSBMViwgYW5kIGtlZXBzIHRoZSB1bnVzZWQgY2FjaGUgcG9vbAorTFYuICBCZWZvcmUgdGhlIHNlcGFyYXRpb24sIHRoZSBjYWNoZSBpcyBmbHVzaGVkLiAgU2VlIHNpbWlsYXIgb3B0aW9uCisuQiBcLVwtdW5jYWNoZS4KK0Fsc28gc2VlCisuQlIgbHZtY2FjaGUgKDcpLgorLgorLkhQCisuQlIgXC1cLXNwbGl0bWlycm9ycworLklSIE51bWJlcgorLmJyCitTcGxpdHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaW1hZ2VzIGZyb20gYSBcZkJyYWlkMVxmUCBvciBcZkJtaXJyb3JcZlAKK0xWIGFuZCB1c2VzIHRoZW0gdG8gY3JlYXRlIGEgbmV3IExWLgorCitJZiBcZkJcLVwtdHJhY2tjaGFuZ2VzXGZQIGlzIGFsc28gc3BlY2lmaWVkLCBjaGFuZ2VzIHRvIHRoZSByYWlkMSBMViBhcmUKK3RyYWNrZWQgd2hpbGUgdGhlIHNwbGl0IExWIHJlbWFpbnMgZGV0YWNoZWQuCisuQiBsdmNvbnZlcnQgXC1cLW1lcmdlCitjYW4gYmUgdXNlZCB0byByZWNvbWJpbmUgdGhlIHNwbGl0IGltYWdlcyB3aXRoIHRoZSBvcmlnaW5hbCByYWlkMSBMVi4KKworQSBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgZm9yIHRoZSBuZXcgTFYgd2l0aCBcZkJcLVwtbmFtZVxmUCAoYSBuYW1lIGlzCityZXF1aXJlZCB3aXRob3V0IFxmQlwtXC10cmFja2NoYW5nZXNcZlApLgorLgorLkhQCisuQlIgXC1cLXNwbGl0c25hcHNob3QKKy5icgorU2VwYXJhdGVzIGEgQ09XIHNuYXBzaG90IGZyb20gaXRzIG9yaWdpbiBMVi4gIFRoZSBMViB0aGF0IGlzIHNwbGl0IG9mZgorY29udGFpbnMgdGhlIGNodW5rcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBvcmlnaW4gTFYgYWxvbmcgd2l0aCBtZXRhZGF0YQorZGVzY3JpYmluZyB0aGVtLiAgVGhpcyBMViBjYW4gYmUgd2lwZWQgYW5kIHRoZW4gZGVzdHJveWVkIHdpdGggbHZyZW1vdmUuCitTZWUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24KKy5CIGx2Y29udmVydCBcLVwtdHlwZSBzbmFwc2hvdC4KKy4KKy5IUAorLkJSIFwtXC1zdHJpcGVzCisuSVIgTnVtYmVyCisuYnIKK1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0cmlwZXMgaW4gYSBzdHJpcGVkIExWLiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mCitwaHlzaWNhbCB2b2x1bWVzIChkZXZpY2VzKSB0aGF0IGEgc3RyaXBlZCBMViBpcyBzcHJlYWQgYWNyb3NzLiAgRGF0YSB0aGF0CithcHBlYXJzIHNlcXVlbnRpYWwgaW4gdGhlIExWIGlzIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgZGV2aWNlcyBpbiB1bml0cyBvZgordGhlIHN0cmlwZSBzaXplIChzZWUgXGZCXC1cLXN0cmlwZXNpemVcZlApLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0bworZXhpc3RpbmcgYWxsb2NhdGVkIHNwYWNlLCBvbmx5IG5ld2x5IGFsbG9jYXRlZCBzcGFjZSBjYW4gYmUgc3RyaXBlZC4KKy4KKy5IUAorLkJSIFwtSSAsCisuQlIgXC1cLXN0cmlwZXNpemUKKy5JUiBTdHJpcGVTaXplCisuYnIKK1NwZWNpZmllcyB0aGUgc3RyaXBlIHNpemUgaW4ga2lsb2J5dGVzIGZvciBhIHN0cmlwZWQgTFYuICBUaGUgc3RyaXBlIHNpemUKK2lzIHRoZSBudW1iZXIgb2Yga2lsb2J5dGVzIHdyaXR0ZW4gdG8gZWFjaCBzdHJpcGUsIGkuZS4gdG8gb25lIGRldmljZSwKK2JlZm9yZSB3cml0aW5nIHRvIHRoZSBuZXh0IHN0cmlwZS9kZXZpY2UuICBTdHJpcGVTaXplIG11c3QgYmUgYSBwb3dlciBvZiAyCithbmQgY2Fubm90IGV4Y2VlZCB0aGUgVkcgcGh5c2ljYWwgZXh0ZW50IChQRSkgc2l6ZS4KKy4KKy5IUAorLkJSIFwtXC10eXBlCisuSVIgU2VnbWVudFR5cGUKKy5icgorQ29udmVydHMgYW4gTFYgZnJvbSBvbmUgc2VnbWVudCB0eXBlIHRvIGFub3RoZXIuCitTZWUgQ09NTUFORFMgc2VjdGlvbiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBjb252ZXJ0aW5nIGJldHdlZW4gZWFjaCB0eXBlLgorLgorLkhQCisuQlIgXC1cLXRoaW5wb29sCisuSVIgVGhpblBvb2xMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLmJyCitTcGVjaWZpZXMgdGhlIHRoaW4gcG9vbCB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIGFuIExWIHRvIGEgdGhpbiBMVi4gIElmCitUaGluUG9vbExvZ2ljYWxWb2x1bWUgaXMgbm90IHlldCBhIHRoaW4gcG9vbCwgdGhlIGNvbW1hbmQgd2lsbCBhdHRlbXB0IHRvCitjb252ZXJ0IGl0IHRvIGEgdGhpbiBwb29sIHByaW9yIHRvIHRoZSB0aGluIExWIGNvbnZlcnNpb24uCitBbHNvIHNlZQorLkJSIGx2bXRoaW4gKDcpLgorLgorLkhQCisuQlIgXC1cLXRyYWNrY2hhbmdlcworLmJyCitDYW4gYmUgdXNlZCB3aXRoIFxmQlwtXC1zcGxpdG1pcnJvcnNcZlAgb24gYSByYWlkMSBMVi4gIFRoaXMgY2F1c2VzCitjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCByYWlkMSBMViB0byBiZSB0cmFja2VkIHdoaWxlIHRoZSBzcGxpdCBpbWFnZXMKK3JlbWFpbiBkZXRhY2hlZC4gIFRoaXMgYWxsb3dzIHRoZSByZWFkXC1vbmx5IGRldGFjaGVkIGltYWdlKHMpIHRvIGJlCittZXJnZWQgZWZmaWNpZW50bHkgYmFjayBpbnRvIHRoZSByYWlkMSBMViBsYXRlci4gIE9ubHkgdGhlIHJlZ2lvbnMgd2l0aAorY2hhbmdlZCBkYXRhIGFyZSByZXN5bmNocm9uaXplZCBkdXJpbmcgbWVyZ2UuICAoVGhpcyBvcHRpb24gb25seSBhcHBsaWVzCit0byB0aGUgXGZCcmFpZDFcZlAgTFYgdHlwZS4pCisuCisuSFAKKy5CUiBcLVQgLAorLkJSIFwtXC10aGluCisuYnIKK0FsaWFzIGZvcgorLkIgXC1cLXR5cGUgdGhpbi4KK1NlZSBDT01NQU5EUyBkZXNjcmlwdGlvbiBmb3IKKy5icgorLkIgbHZjb252ZXJ0IFwtXC10eXBlIHRoaW4uCisuCisuSFAKKy5CUiBcLVwtdW5jYWNoZQorLmJyCitTZXBhcmF0ZXMgYSBjYWNoZSBwb29sIGZyb20gYSBjYWNoZSBMViwgYW5kIHJlbW92ZXMgdGhlIHVudXNlZCBjYWNoZSBwb29sCitMVi4gIEJlZm9yZSB0aGUgc2VwYXJhdGlvbiwgdGhlIGNhY2hlIGlzIGZsdXNoZWQuICBTZWUgc2ltaWxhciBvcHRpb24KKy5CIFwtXC1zcGxpdGNhY2hlLgorQWxzbyBzZWUKKy5CUiBsdm1jYWNoZSAoNykuCisuCisuSFAKKy5CUiBcLVogLAorLkJSIFwtXC16ZXJvCisuUkIgeyB5IHwgbiB9CisuYnIKK0ZvciBzbmFwc2hvdHMsIHRoaXMgY29udHJvbHMgemVyb2luZyBvZiB0aGUgZmlyc3QgNEtpQiBvZiBkYXRhIGluIHRoZQorc25hcHNob3QuICBJZiB0aGUgTFYgaXMgcmVhZFwtb25seSwgdGhlIHNuYXBzaG90IHdpbGwgbm90IGJlIHplcm9lZC4KKworRm9yIHRoaW4gcG9vbHMsIHRoaXMgY29udHJvbHMgemVyb2luZyBvZiBwcm92aXNpb25lZCBibG9ja3MuCitQcm92aXNpb25pbmcgb2YgbGFyZ2UgemVyb2VkIGNodW5rcyBuZWdhdGl2ZWx5IGltcGFjdHMgcGVyZm9ybWFuY2UuCitBbHNvIHNlZQorLkJSIGx2bXRoaW4gKDcpLgorLgorCisuU0ggRXhhbXBsZXMKKy4KK0NvbnZlcnQgYSBsaW5lYXIgTFYgdG8gYSB0d28td2F5IG1pcnJvciBMVjoKKy5icgorLkIgbHZjb252ZXJ0IFwtXC10eXBlIG1pcnJvciBcLVwtbWlycm9ycyAxIHZnL2x2b2wxCisKK0NvbnZlcnQgYSBsaW5lYXIgTFYgdG8gYSB0d28td2F5IFJBSUQxIExWOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgcmFpZDEgXC1cLW1pcnJvcnMgMSB2Zy9sdm9sMQorCitDb252ZXJ0IGEgbWlycm9yIExWIHRvIHVzZSBhbiBpblwtbWVtb3J5IGxvZzoKKy5icgorLkIgbHZjb252ZXJ0IFwtXC1taXJyb3Jsb2cgY29yZSB2Zy9sdm9sMQorCitDb252ZXJ0IGEgbWlycm9yIExWIHRvIHVzZSBhIGRpc2sgbG9nOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLW1pcnJvcmxvZyBkaXNrIHZnL2x2b2wxCisKK0NvbnZlcnQgYSBtaXJyb3Igb3IgcmFpZDEgTFYgdG8gYSBsaW5lYXIgTFY6CisuYnIKKy5CIGx2Y29udmVydCAtLXR5cGUgbGluZWFyIHZnL2x2b2wxCisKK0NvbnZlcnQgYSBtaXJyb3IgTFYgdG8gYSByYWlkMSBMViB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpbWFnZXM6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSByYWlkMSB2Zy9sdm9sMQorCisuLyIgU3BsaXQgYW5kIG1lcmdlIGEgQ09XIHNuYXBzaG90OgorLi8iIFRPRE8KK0NvbnZlcnQgYSBsaW5lYXIgTFYgdG8gYSB0d28td2F5IG1pcnJvciBMViwgYWxsb2NhdGluZyBuZXcgZXh0ZW50cyBmcm9tIHNwZWNpZmljCitQViByYW5nZXM6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtbWlycm9ycyAxIHZnL2x2b2wxIC9kZXYvc2RhOjBcLTE1IC9kZXYvc2RiOjBcLTE1CisKK0NvbnZlcnQgYSBtaXJyb3IgTFYgdG8gYSBsaW5lYXIgTFYsIGZyZWVpbmcgcGh5c2ljYWwgZXh0ZW50cyBmcm9tIGEgc3BlY2lmaWMgUFY6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBsaW5lYXIgdmcvbHZvbDEgL2Rldi9zZGEKKworU3BsaXQgb25lIGltYWdlIGZyb20gYSBtaXJyb3Igb3IgcmFpZDEgTFYsIG1ha2luZyBpdCBhIG5ldyBMVjoKKy5icgorLkIgbHZjb252ZXJ0IFwtXC1zcGxpdG1pcnJvcnMgMSBcLVwtbmFtZSBsdl9zcGxpdCB2Zy9sdm9sMQorCitTcGxpdCBvbmUgaW1hZ2UgZnJvbSBhIHJhaWQxIExWLCBhbmQgdHJhY2sgY2hhbmdlcyBtYWRlIHRvIHRoZSByYWlkMSBMVgord2hpbGUgdGhlIHNwbGl0IGltYWdlIHJlbWFpbnMgZGV0YWNoZWQ6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtc3BsaXRtaXJyb3JzIDEgXC1cLXRyYWNrY2hhbmdlcyB2Zy9sdm9sMQorCitNZXJnZSBhbiBpbWFnZSAodGhhdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIHdpdGggXC1cLXNwbGl0bWlycm9ycyBhbmQKK1wtXC10cmFja2NoYW5nZXMpIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgcmFpZDEgTFY6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtbWVyZ2UgdmcvbHZvbDFfcmltYWdlXzEKKy4vIiBGSVhNRTogdXNlIG1lcmdlLW1pcnJvcgorCitSZXBsYWNlIFBWIC9kZXYvc2RiMSB3aXRoIFBWIC9kZXYvc2RmMSBpbiBhIHJhaWQxLzQvNS82LzEwIExWOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXJlcGxhY2UgL2Rldi9zZGIxIHZnL2x2b2wxIC9kZXYvc2RmMQorCitSZXBsYWNlIDMgUFZzIC9kZXYvc2RbYi1kXTEgd2l0aCBQVnMgL2Rldi9zZFtmLWhdMSBpbiBhIHJhaWQxIExWOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXJlcGxhY2UgL2Rldi9zZGIxIFwtXC1yZXBsYWNlIC9kZXYvc2RjMSBcLVwtcmVwbGFjZSAvZGV2L3NkZDEKKy5SUworLkIgdmcvbHZvbDEgL2Rldi9zZFtmZ2hdMQorLlJFCisKK1JlcGxhY2UgdGhlIG1heGltdW0gb2YgMiBQVnMgL2Rldi9zZFtiY10xIHdpdGggUFZzIC9kZXYvc2RbZ2hdMSBpbiBhIHJhaWQ2IExWOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXJlcGxhY2UgL2Rldi9zZGIxIFwtXC1yZXBsYWNlIC9kZXYvc2RjMSB2Zy9sdm9sMSAvZGV2L3NkW2doXTEKKworQ29udmVydCBhbiBMViBpbnRvIGEgdGhpbiBMViBpbiB0aGUgc3BlY2lmaWVkIHRoaW4gcG9vbC4gIFRoZSBleGlzdGluZyBMVgoraXMgdXNlZCBhcyBhbiBleHRlcm5hbCByZWFkXC1vbmx5IG9yaWdpbiBmb3IgdGhlIG5ldyB0aGluIExWLgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbiBcLVwtdGhpbnBvb2wgdmcvdHBvb2wxIHZnL2x2b2wxCisKK0NvbnZlcnQgYW4gTFYgaW50byBhIHRoaW4gTFYgaW4gdGhlIHNwZWNpZmllZCB0aGluIHBvb2wuICBUaGUgZXhpc3RpbmcgTFYKK2lzIHVzZWQgYXMgYW4gZXh0ZXJuYWwgcmVhZFwtb25seSBvcmlnaW4gZm9yIHRoZSBuZXcgdGhpbiBMViwgYW5kIGlzCityZW5hbWVkICJleHRlcm5hbCI6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSB0aGluIFwtXC10aGlucG9vbCB2Zy90cG9vbDEKKy5SUworLkIgXC1cLW9yaWdpbm5hbWUgZXh0ZXJuYWwgdmcvbHZvbDEKKy5SRQorCitDb252ZXJ0IGFuIExWIHRvIGEgY2FjaGUgcG9vbCBMViB1c2luZyBhbm90aGVyIHNwZWNpZmllZCBMViBmb3IgY2FjaGUgcG9vbAorbWV0YWRhdGE6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZS1wb29sIFwtXC1wb29sbWV0YWRhdGEgdmcvcG9vbG1ldGExIHZnL2x2b2wxCisKK0NvbnZlcnQgYW4gTFYgdG8gYSBjYWNoZSBMViB1c2luZyB0aGUgc3BlY2lmaWVkIGNhY2hlIHBvb2wgYW5kIGNodW5rIHNpemU6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZSBcLVwtY2FjaGVwb29sIHZnL2Nwb29sMSBcLWMgMTI4IHZnL2x2b2wxCisKK0RldGFjaCBhbmQga2VlcCB0aGUgY2FjaGUgcG9vbCBmcm9tIGEgY2FjaGUgTFY6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtc3BsaXRjYWNoZSB2Zy9sdm9sMQorCitEZXRhY2ggYW5kIHJlbW92ZSB0aGUgY2FjaGUgcG9vbCBmcm9tIGEgY2FjaGUgTFY6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtdW5jYWNoZSB2Zy9sdm9sMQorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIGx2bS5jb25mICg1KSwKKy5CUiBsdm1jYWNoZSAoNyksCisuQlIgbHZtdGhpbiAoNyksCisuQlIgbHZkaXNwbGF5ICg4KSwKKy5CUiBsdmV4dGVuZCAoOCksCisuQlIgbHZyZWR1Y2UgKDgpLAorLkJSIGx2cmVtb3ZlICg4KSwKKy5CUiBsdnJlbmFtZSAoOCksCisuQlIgbHZzY2FuICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCksCisuQlIgY2FjaGVfZHVtcCAoOCksCisuQlIgY2FjaGVfcmVwYWlyICg4KSwKKy5CUiBjYWNoZV9yZXN0b3JlICg4KSwKKy5CUiB0aGluX2R1bXAgKDgpLAorLkJSIHRoaW5fcmVwYWlyICg4KSwKKy5CUiB0aGluX3Jlc3RvcmUgKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZjcmVhdGUuOC5pbiBiL21hbi9sdmNyZWF0ZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZjcmVhdGUuOC5pbgpAQCAtMCwwICsxLDg4NyBAQAorLlRIIExWQ1JFQVRFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuCisuXCIgVXNlIDFzdC4gcGFyYW1ldGVyIHdpdGggXCUgdG8gZml4ICdtYW4yaHRtbCcgcmVuZGVpbmcgb24gc2FtZSBsaW5lIQorLmRlIFNJWkVfRworLiAgSVIgXFwkMSBcYworLiAgUkIgWyBiIHwgQiB8IHMgfCBTIHwgayB8IEsgfCBtIHwgTSB8IGcgfCBHIF0KKy4uCisuZGUgU0laRV9FCisuICBJUiBcXCQxIFxjCisuICBSQiBbIGIgfCBCIHwgcyB8IFMgfCBrIHwgSyB8IG0gfCBNIHwgXGMKKy4gIEJSIGcgfCBHIHwgdCB8IFQgfCBwIHwgUCB8IGUgfCBFIF0KKy4uCisuCisuU0ggTkFNRQorLgorbHZjcmVhdGUgXC0gY3JlYXRlIGEgbG9naWNhbCB2b2x1bWUgaW4gYW4gZXhpc3Rpbmcgdm9sdW1lIGdyb3VwCisuCisuU0ggU1lOT1BTSVMKKy4KKy5hZCBsCisuQiBsdmNyZWF0ZQorLlJCIFsgXC1hIHwgXC1cLWFjdGl2YXRlCisuUkIgWyBhIF1bIGUgfCBsIHwgcyBdeyB5IHwgbiB9XQorLlJCIFsgXC1cLWFkZHRhZworLklSIFRhZyBdCisuUkIgWyBcLVwtYWxsb2MKKy5JUiBBbGxvY2F0aW9uXCVQb2xpY3kgXQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SQiB7IHkgfCBuIH1dCisuUkIgWyBcLUggfCBcLVwtY2FjaGUgXQorLlJCIFsgXC1cLWNhY2hlbW9kZQorLlJCIHsgcGFzc3Rocm91Z2ggfCB3cml0ZWJhY2sgfCB3cml0ZXRocm91Z2ggfV0KKy5SQiBbIFwtXC1jYWNoZXBvbGljeQorLklSIFBvbGljeSBdCisuUkIgXCVbIFwtXC1jYWNoZXBvb2wKKy5JUiBDYWNoZVBvb2xMb2dpY2FsVm9sdW1lIF0KKy5SQiBbIFwtXC1jYWNoZXNldHRpbmdzCisuSVIgS2V5IFxmQj0gVmFsdWUgXQorLlJCIFsgXC1jIHwgXC1cLWNodW5rc2l6ZQorLklSIENodW5rU2l6ZSBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgXCVbIFwtQyB8IFwtXC1jb250aWd1b3VzCisuUkIgeyB5IHwgbiB9XQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtXC1kaXNjYXJkcworLlJCIFwleyBpZ25vcmUgfCBub3Bhc3Nkb3duIHwgcGFzc2Rvd24gfV0KKy5SQiBbIFwtXC1lcnJvcndoZW5mdWxsCisuUkIgeyB5IHwgbiB9XQorLlJCIFt7IFwtbCB8IFwtXC1leHRlbnRzCisuQlIgXGZJTG9naWNhbEV4dGVudHNcJU51bWJlciBbICUgeyBGUkVFIHwgUFZTIHwgVkcgfV0KKy5SQiB8CisuQlIgXC1MIHwgXC1cLXNpemUKKy5CUiBcZklMb2dpY2FsVm9sdW1lU2l6ZSB9CisuUkIgWyBcLWkgfCBcLVwtc3RyaXBlcworLklSIFN0cmlwZXMKKy5SQiBbIFwtSSB8IFwtXC1zdHJpcGVzaXplCisuSVIgU3RyaXBlU2l6ZSBdXV0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtSyB8IFwtXC1pZ25vcmVhY3RpdmF0aW9uc2tpcCBdCisuUkIgWyBcLVwtaWdub3JlbW9uaXRvcmluZyBdCisuUkIgWyBcLVwtbWlub3IKKy5JUiBNaW5vcgorLlJCIFsgXC1qIHwgXC1cLW1ham9yCisuSVIgTWFqb3IgXV0KKy5SQiBbIFwtXC1tZXRhZGF0YXByb2ZpbGUKKy5JUiBQcm9maWxlXCVOYW1lIF0KKy5SQiBbIFwtbSB8IFwtXC1taXJyb3JzCisuSVIgTWlycm9ycworLlJCIFsgXC1cLWNvcmVsb2cgfCBcLVwtbWlycm9ybG9nCisuUkIgeyBkaXNrIHwgY29yZSB8IG1pcnJvcmVkIH1dCisuUkIgWyBcLVwtbm9zeW5jIF0KKy5SQiBbIFwtUiB8IFwtXC1yZWdpb25zaXplCisuQlIgXGZJTWlycm9yTG9nUmVnaW9uU2l6ZSBdXQorLlJCIFsgXC1cLW1vbml0b3IKKy5SQiB7IHkgfCBuIH1dCisuUkIgWyBcLW4gfCBcLVwtbmFtZQorLklSIExvZ2ljYWxcJVZvbHVtZSBdCisuUkIgWyBcLVwtbm91ZGV2c3luYyBdCisuUkIgWyBcLXAgfCBcLVwtcGVybWlzc2lvbgorLlJCIHsgciB8IHJ3IH1dCisuUkIgWyBcLU0gfCBcLVwtcGVyc2lzdGVudAorLlJCIHsgeSB8IG4gfV0KKy5cIiAuUkIgWyBcLVwtcG9vbGRhdGFzaXplCisuXCIgLkkgRGF0YVZvbHVtZVNpemUKKy5SQiBcJVsgXC1cLXBvb2xtZXRhZGF0YXNpemUKKy5JUiBNZXRhZGF0YVZvbHVtZVNpemUgXQorLlJCIFsgXC1cLXBvb2xtZXRhZGF0YXNwYXJlCisuUkIgeyB5IHwgbiB9XQorLlJCIFsgXC1cLSBbIHJhaWQgXSBtYXhyZWNvdmVyeXJhdGUKKy5JUiBSYXRlIF0KKy5SQiBbIFwtXC0gWyByYWlkIF0gbWlucmVjb3ZlcnlyYXRlCisuSVIgUmF0ZSBdCisuUkIgWyBcLXIgfCBcLVwtcmVhZGFoZWFkCisuUkIgeyBcZklSZWFkQWhlYWRTZWN0b3JzIHwgYXV0byB8IG5vbmUgfV0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7YmFzaWMgfCBqc29ufV0KKy5SQiBcJVsgXC1rIHwgXC1cLXNldGFjdGl2YXRpb25za2lwCisuUkIgeyB5IHwgbiB9XQorLlJCIFsgXC1zIHwgXC1cLXNuYXBzaG90IF0KKy5SQiBbIFwtViB8IFwtXC12aXJ0dWFsc2l6ZQorLklSIFZpcnR1YWxTaXplIF0KKy5SQiBbIFwtdCB8IFwtXC10ZXN0IF0KKy5SQiBbIFwtVCB8IFwtXC10aGluIF0KKy5SQiBbIFwtXC10aGlucG9vbAorLklSIFRoaW5Qb29sTG9naWNhbFZvbHVtZSBdCisuUkIgWyBcLVwtdHlwZQorLklSIFNlZ21lbnRUeXBlIF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtVyB8IFwtXC13aXBlc2lnbmF0dXJlcworLlJCIHsgeSB8IG4gfV0KKy5SQiBbIFwtWiB8IFwtXC16ZXJvCisuUkIgeyB5IHwgbiB9XQorLlJJIFsgVm9sdW1lR3JvdXAKKy5SSSB8CisuUkkgXCV7IEV4dGVybmFsT3JpZ2luIHwgT3JpZ2luIHwgUG9vbCB9IExvZ2ljYWxWb2x1bWUKKy5SSSBcJVsgUGh5c2ljYWxWb2x1bWVQYXRoIFsgXGZCOiBcZklQRSBcZlJbIFxmQlwtIFBFIF1dLi4uXV0KKy5MUAorLkIgbHZjcmVhdGUKKy5SQiBbIFwtbCB8IFwtXC1leHRlbnRzCisuQlIgXGZJTG9naWNhbEV4dGVudHNOdW1iZXIgWyAlIHsgRlJFRSB8IE9SSUdJTiB8IFBWUyB8IFZHIH1dCit8CisuQlIgXC1MIHwgXC1cLXNpemUKKy5cIiB8IFwtXC1wb29sZGF0YXNpemUKKy5JUiBMb2dpY2FsVm9sdW1lU2l6ZSBdCisuUkIgWyBcLWMgfCBcLVwtY2h1bmtzaXplCisuSVIgQ2h1bmtTaXplIF0KKy5SQiBcJVsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZVwlTmFtZSBdCisuUkIgWyBcLVwtbm91ZGV2c3luYyBdCisuUkIgWyBcLVwtaWdub3JlbW9uaXRvcmluZyBdCisuUkIgWyBcLVwtbWV0YWRhdGFwcm9maWxlCisuSVIgUHJvZmlsZVwlTmFtZSBdCisuUkIgXCVbIFwtXC1tb25pdG9yCisuUkIgeyB5IHwgbiB9XQorLlJCIFsgXC1uIHwgXC1cLW5hbWUKKy5JUiBTbmFwc2hvdExvZ2ljYWxWb2x1bWVOYW1lIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7YmFzaWMgfCBqc29ufV0KKy5CUiBcLXMgfCBcLVwtc25hcHNob3QgfCBcLUggfCBcLVwtY2FjaGUKKy5SSSBcJXtbIFZvbHVtZUdyb3VwIFxmQi9cZlBdIE9yaWdpbmFsTG9naWNhbFZvbHVtZQorLlJCIFwlWyBcLVYgfCBcLVwtdmlydHVhbHNpemUKKy5JUiBWaXJ0dWFsU2l6ZSBdfQorLmFkIGIKKy4KKy5TSCBERVNDUklQVElPTgorLgorbHZjcmVhdGUgY3JlYXRlcyBhIG5ldyBsb2dpY2FsIHZvbHVtZSBpbiBhIHZvbHVtZSBncm91cCAoc2VlCisuQlIgdmdjcmVhdGUgIig4KSwgIiB2Z2NoYW5nZSAoOCkpCitieSBhbGxvY2F0aW5nIGxvZ2ljYWwgZXh0ZW50cyBmcm9tIHRoZSBmcmVlIHBoeXNpY2FsIGV4dGVudCBwb29sCitvZiB0aGF0IHZvbHVtZSBncm91cC4gIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGZyZWUgcGh5c2ljYWwgZXh0ZW50cyB0aGVuCit0aGUgdm9sdW1lIGdyb3VwIGNhbiBiZSBleHRlbmRlZCAoc2VlCisuQlIgdmdleHRlbmQgKDgpKQord2l0aCBvdGhlciBwaHlzaWNhbCB2b2x1bWVzIG9yIGJ5IHJlZHVjaW5nIGV4aXN0aW5nIGxvZ2ljYWwgdm9sdW1lcworb2YgdGhpcyB2b2x1bWUgZ3JvdXAgaW4gc2l6ZSAoc2VlCisuQlIgbHZyZWR1Y2UgKDgpKS4KK0lmIHlvdSBzcGVjaWZ5IG9uZSBvciBtb3JlIFBoeXNpY2FsVm9sdW1lcywgYWxsb2NhdGlvbiBvZiBwaHlzaWNhbAorZXh0ZW50cyB3aWxsIGJlIHJlc3RyaWN0ZWQgdG8gdGhlc2Ugdm9sdW1lcy4KKy5icgorLmJyCitUaGUgc2Vjb25kIGZvcm0gc3VwcG9ydHMgdGhlIGNyZWF0aW9uIG9mIHNuYXBzaG90IGxvZ2ljYWwgdm9sdW1lcyB3aGljaAora2VlcCB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIGxvZ2ljYWwgdm9sdW1lIGZvciBiYWNrdXAgcHVycG9zZXMuCisuCisuU0ggT1BUSU9OUworLgorU2VlCisuQlIgbHZtICg4KQorZm9yIGNvbW1vbiBvcHRpb25zLgorLgorLkhQCisuQlIgXC1hIHwgXC1cLWFjdGl2YXRlCisuUkIgWyBhIF1bIGwgfCBlIHwgcyBdeyB5IHwgbiB9CisuYnIKK0NvbnRyb2xzIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIExvZ2ljYWwgVm9sdW1lcyBmb3IgaW1tZWRpYXRlIHVzZSBhZnRlcgordGhlIGNvbW1hbmQgZmluaXNoZXMgcnVubmluZy4KK0J5IGRlZmF1bHQsIG5ldyBMb2dpY2FsIFZvbHVtZXMgYXJlIGFjdGl2YXRlZCAoXGZCXC1heVxmUCkuCitJZiBpdCBpcyBwb3NzaWJsZSB0ZWNobmljYWxseSwgXGZCXC1hblxmUCB3aWxsIGxlYXZlIHRoZSBuZXcgTG9naWNhbAorVm9sdW1lIGluYWN0aXZlLiBCdXQgZm9yIGV4YW1wbGUsIHNuYXBzaG90cyBvZiBhY3RpdmUgb3JpZ2luIGNhbiBvbmx5IGJlCitjcmVhdGVkIGluIHRoZSBhY3RpdmUgc3RhdGUgc28gXGZCXC1hblxmUCBjYW5ub3QgYmUgdXNlZCB3aXRoCitcZkItXC10eXBlIHNuYXBzaG90XGZQLiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIHRoaW4gdm9sdW1lIHNuYXBzaG90cywKK3doaWNoIGFyZSBieSBkZWZhdWx0IGNyZWF0ZWQgd2l0aCBmbGFnIHRvIHNraXAgdGhlaXIgYWN0aXZhdGlvbgorKFxmQi1reVxmUCkuCitOb3JtYWxseSB0aGUgXGZCXC1cLXplcm8gblxmUCBhcmd1bWVudCBoYXMgdG8gYmUgc3VwcGxpZWQgdG9vIGJlY2F1c2UKK3plcm9pbmcgKHRoZSBkZWZhdWx0IGJlaGF2aW91cikgYWxzbyByZXF1aXJlcyBhY3RpdmF0aW9uLgorSWYgYXV0b2FjdGl2YXRpb24gb3B0aW9uIGlzIHVzZWQgKFxmQlwtYWF5XGZQKSwgdGhlIGxvZ2ljYWwgdm9sdW1lIGlzCithY3RpdmF0ZWQgb25seSBpZiBpdCBtYXRjaGVzIGFuIGl0ZW0gaW4gdGhlCitcZkJhY3RpdmF0aW9uL2F1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdFxmUAorc2V0IGluIFxmQmx2bS5jb25mXGZQKDUpLgorRm9yIGF1dG9hY3RpdmF0ZWQgbG9naWNhbCB2b2x1bWVzLCBcZkJcLVwtemVybyBuXGZQIGFuZAorXGZCXC1cLXdpcGVzaWduYXR1cmVzIG5cZlAgaXMgYWx3YXlzIGFzc3VtZWQgYW5kIGl0IGNhbid0CitiZSBvdmVycmlkZGVuLiBJZiB0aGUgY2x1c3RlcmVkIGxvY2tpbmcgaXMgZW5hYmxlZCwKK1xmQlwtYWV5XGZQIHdpbGwgYWN0aXZhdGUgZXhjbHVzaXZlbHkgb24gb25lIG5vZGUgYW5kCisuQlIgXC1hIHsgYSB8IGwgfSB5Cit3aWxsIGFjdGl2YXRlIG9ubHkgb24gdGhlIGxvY2FsIG5vZGUuCisuCisuSFAKKy5CUiBcLUggfCBcLVwtY2FjaGUKKy5icgorQ3JlYXRlcyBjYWNoZSBvciBjYWNoZSBwb29sIGxvZ2ljYWwgdm9sdW1lLgorLlwiIG9yIGJvdGguCitTcGVjaWZ5aW5nIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcZkJcLVwtZXh0ZW50c1xmUCBvciBcZkJcLVwtc2l6ZVxmUAord2lsbCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgdGhlIGNhY2hlIGxvZ2ljYWwgdm9sdW1lLgorLlwiIFNwZWNpZnlpbmcgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IFxmQlwtXC1wb29sZGF0YXNpemVcZlAgd2lsbCBjYXVzZQorLlwiIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2FjaGUgcG9vbCBsb2dpY2FsIHZvbHVtZS4KKy5cIiBTcGVjaWZ5aW5nIGJvdGggYXJndW1lbnRzIHdpbGwgY2F1c2UgdGhlIGNyZWF0aW9uIG9mIGNhY2hlIHdpdGggaXRzCisuXCIgY2FjaGUgcG9vbCB2b2x1bWUuCitXaGVuIHRoZSBWb2x1bWUgZ3JvdXAgbmFtZSBpcyBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBleGlzdGluZyBsb2dpY2FsIHZvbHVtZQorbmFtZSB3aGljaCBpcyBOT1QgYSBjYWNoZSBwb29sIG5hbWUsIHN1Y2ggdm9sdW1lIGlzIHRyZWF0ZWQKK2FzIGNhY2hlIG9yaWdpbiB2b2x1bWUgYW5kIGNhY2hlIHBvb2wgaXMgY3JlYXRlZC4gSW4gdGhpcyBjYXNlIHRoZQorXGZCXC1cLWV4dGVudHNcZlAgb3IgXGZCXC1cLXNpemVcZlAgaXMgdXNlZCB0byBzcGVjaWZ5IHNpemUgb2YgY2FjaGUgcG9vbCB2b2x1bWUuCitTZWUgXGZCbHZtY2FjaGVcZlAoNykgZm9yIG1vcmUgaW5mbyBhYm91dCBjYWNoaW5nIHN1cHBvcnQuCitOb3RlIHRoYXQgdGhlIGNhY2hlIHNlZ21lbnQgdHlwZSByZXF1aXJlcyBhIGRtLWNhY2hlIGtlcm5lbCBtb2R1bGUgdmVyc2lvbgorMS4zLjAgb3IgZ3JlYXRlci4KKy4KKy5IUAorLkJSIFwtXC1jYWNoZW1vZGUKKy5SQiB7IHBhc3N0aHJvdWdoIHwgd3JpdGViYWNrIHwgd3JpdGV0aHJvdWdoIH0KKy5icgorU3BlY2lmeWluZyBhIGNhY2hlIG1vZGUgZGV0ZXJtaW5lcyB3aGVuIHRoZSB3cml0ZXMgdG8gYSBjYWNoZSBMVgorYXJlIGNvbnNpZGVyZWQgY29tcGxldGUuICBXaGVuIFxmQndyaXRlYmFja1xmUCBpcyBzcGVjaWZpZWQsIGEgd3JpdGUgaXMKK2NvbnNpZGVyZWQgY29tcGxldGUgYXMgc29vbiBhcyBpdCBpcyBzdG9yZWQgaW4gdGhlIGNhY2hlIHBvb2wgTFYuCitJZiBcZkJ3cml0ZXRob3VnaFxmUCBpcyBzcGVjaWZpZWQsIGEgd3JpdGUgaXMgY29uc2lkZXJlZCBjb21wbGV0ZSBvbmx5Cit3aGVuIGl0IGhhcyBiZWVuIHN0b3JlZCBpbiB0aGUgY2FjaGUgcG9vbCBMViBhbmQgb24gdGhlIG9yaWdpbiBMVi4KK1doaWxlIFxmQndyaXRldGhyb3VnaFxmUCBtYXkgYmUgc2xvd2VyIGZvciB3cml0ZXMsIGl0IGlzIG1vcmUKK3Jlc2lsaWVudCBpZiBzb21ldGhpbmcgc2hvdWxkIGhhcHBlbiB0byBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlCitjYWNoZSBwb29sIExWLiBXaXRoIFxmQnBhc3N0aHJvdWdoXGZQIG1vZGUsIGFsbCByZWFkcyBhcmUgc2VydmVkCitmcm9tIG9yaWdpbiBMViAoYWxsIHJlYWRzIG1pc3MgdGhlIGNhY2hlKSBhbmQgYWxsIHdyaXRlcyBhcmUKK2ZvcndhcmRlZCB0byB0aGUgb3JpZ2luIExWOyBhZGRpdGlvbmFsbHksIHdyaXRlIGhpdHMgY2F1c2UgY2FjaGUKK2Jsb2NrIGludmFsaWRhdGVzLiBTZWUgXGZCbHZtY2FjaGUoNylcZlAgZm9yIG1vcmUgZGV0YWlscy4KKy4KKy5IUAorLkJSIFwtXC1jYWNoZXBvbGljeQorLklSIFBvbGljeQorLmJyCitPbmx5IGFwcGxpY2FibGUgdG8gY2FjaGVkIExWczsgc2VlIGFsc28gXGZCbHZtY2FjaGUoNylcZlAuIFNldHMKK3RoZSBjYWNoZSBwb2xpY3kuIFxmQm1xXGZQIGlzIHRoZSBiYXNpYyBwb2xpY3kgbmFtZS4gXGZCc21xXGZQIGlzIG1vcmUgYWR2YW5jZWQKK3ZlcnNpb24gYXZhaWxhYmxlIGluIG5ld2VyIGtlcm5lbHMuCisuCisuSFAKKy5CUiBcLVwtY2FjaGVwb29sCisuSVIgQ2FjaGVQb29sTG9naWNhbFZvbHVtZSB7IE5hbWUgfCBQYXRoIH0KKy5icgorU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGNhY2hlIHBvb2wgdm9sdW1lIG5hbWUuIFRoZSBvdGhlciB3YXkgdG8gc3BlY2lmeSBwb29sIG5hbWUKK2lzIHRvIGFwcGVuZCBuYW1lIHRvIFZvbHVtZSBncm91cCBuYW1lIGFyZ3VtZW50LgorLgorLkhQCisuQlIgXC1cLWNhY2hlc2V0dGluZ3MKKy5JQiBLZXkgPSBWYWx1ZQorLmJyCitPbmx5IGFwcGxpY2FibGUgdG8gY2FjaGVkIExWczsgc2VlIGFsc28gXGZCbHZtY2FjaGUoNylcZlAuIFNldHMKK3RoZSBjYWNoZSB0dW5hYmxlIHNldHRpbmdzLiBJbiBtb3N0IHVzZS1jYXNlcywgZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIGJlIGFkZXF1YXRlLgorU3BlY2lhbCBzdHJpbmcgdmFsdWUgXGZCZGVmYXVsdFxmUCBzd2l0Y2hlcyBzZXR0aW5nIGJhY2sgdG8gaXRzIGRlZmF1bHQga2VybmVsIHZhbHVlCithbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBsaXN0IG9mIHNldHRpbmdzIHN0b3JlZCBpbiBsdm0yIG1ldGFkYXRhLgorLgorLkhQCisuQlIgXC1jIHwgXC1cLWNodW5rc2l6ZQorLlNJWkVfRyBcJUNodW5rU2l6ZQorLmJyCitHaXZlcyB0aGUgc2l6ZSBvZiBjaHVuayBmb3Igc25hcHNob3QsIGNhY2hlIHBvb2wgYW5kIHRoaW4gcG9vbCBsb2dpY2FsIHZvbHVtZXMuCitEZWZhdWx0IHVuaXQgaXMgaW4ga2lsb2J5dGVzLgorLmJyCitGb3Igc25hcHNob3RzIHRoZSB2YWx1ZSBtdXN0IGJlIHBvd2VyIG9mIDIgYmV0d2VlbiA0S2lCIGFuZCA1MTJLaUIKK2FuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA0S2lCLgorLmJyCitGb3IgY2FjaGUgcG9vbHMgdGhlIHZhbHVlIG11c3QgYSBtdWx0aXBsZSBvZiAzMktpQgorYmV0d2VlbiAzMktpQiBhbmQgMUdpQi4gVGhlIGRlZmF1bHQgaXMgNjRLaUIuCitXaGVuIHRoZSBzaXplIGlzIHNwZWNpZmllZCB3aXRoIHZvbHVtZSBjYWNoaW5nLCBpdCBtYXkgbm90IGJlIHNtYWxsZXIKK3RoYW4gY2FjaGUgcG9vbCBjcmVhdGlvbiBjaHVuayBzaXplIHdhcy4KKy5icgorRm9yIHRoaW4gcG9vbHMgdGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NEtpQgorYmV0d2VlbiA2NEtpQiBhbmQgMUdpQi4KK0RlZmF1bHQgdmFsdWUgc3RhcnRzIHdpdGggNjRLaUIgYW5kIGdyb3dzIHVwIHRvCitmaXQgdGhlIHBvb2wgbWV0YWRhdGEgc2l6ZSB3aXRoaW4gMTI4TWlCLAoraWYgdGhlIHBvb2wgbWV0YWRhdGEgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkLgorU2VlCisuQlIgbHZtLmNvbmYgKDUpCitzZXR0aW5nIFxmQmFsbG9jYXRpb24vdGhpbl9wb29sX2NodW5rX3NpemVfcG9saWN5XGZQCit0byBzZWxlY3QgZGlmZmVyZW50IGNhbGN1bGF0aW9uIHBvbGljeS4KK1RoaW4gcG9vbCB0YXJnZXQgdmVyc2lvbiA8MS40IHJlcXVpcmVzIHRoaXMgdmFsdWUgdG8gYmUgYSBwb3dlciBvZiAyLgorRm9yIHRhcmdldCB2ZXJzaW9uIDwxLjUgZGlzY2FyZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub24gcG93ZXIgb2YgMiB2YWx1ZXMuCisuCisuSFAKKy5CUiBcLUMgfCBcLVwtY29udGlndW91cworLlJCIHsgeSB8IG4gfQorLmJyCitTZXRzIG9yIHJlc2V0cyB0aGUgY29udGlndW91cyBhbGxvY2F0aW9uIHBvbGljeSBmb3IKK2xvZ2ljYWwgdm9sdW1lcy4gRGVmYXVsdCBpcyBubyBjb250aWd1b3VzIGFsbG9jYXRpb24gYmFzZWQKK29uIGEgbmV4dCBmcmVlIHByaW5jaXBsZS4KKy4KKy5IUAorLkJSIFwtXC1jb3JlbG9nCisuYnIKK1RoaXMgaXMgc2hvcnRjdXQgZm9yIG9wdGlvbiBcZkJcLVwtbWlycm9ybG9nIGNvcmVcZlAuCisuCisuSFAKKy5CUiBcLVwtZGlzY2FyZHMKKy5SQiB7IGlnbm9yZSB8IG5vcGFzc2Rvd24gfCBwYXNzZG93biB9CisuYnIKK1NldHMgZGlzY2FyZHMgYmVoYXZpb3IgZm9yIHRoaW4gcG9vbC4KK0RlZmF1bHQgaXMgXGZCcGFzc2Rvd25cZlAuCisuCisuSFAKKy5CUiBcLVwtZXJyb3J3aGVuZnVsbAorLlJCIHsgeSB8IG4gfQorLmJyCitDb25maWd1cmVzIHRoaW4gcG9vbCBiZWhhdmlvdXIgd2hlbiBkYXRhIHNwYWNlIGlzIGV4aGF1c3RlZC4KK0RlZmF1bHQgaXMgXGZCblxmUG8uCitEZXZpY2Ugd2lsbCBxdWV1ZSBJL08gb3BlcmF0aW9ucyB1bnRpbCB0YXJnZXQgdGltZW91dAorKHNlZSBkbS10aGluLXBvb2wga2VybmVsIG1vZHVsZSBvcHRpb24gXGZQbm9fc3BhY2VfdGltZW91dFxmUCkKK2V4cGlyZXMuIFRodXMgY29uZmlndXJlZCBzeXN0ZW0gaGFzIGEgdGltZSB0byBpLmUuIGV4dGVuZAordGhlIHNpemUgb2YgdGhpbiBwb29sIGRhdGEgZGV2aWNlLgorV2hlbiBzZXQgdG8gXGZCeVxmUGVzLCB0aGUgSS9PIG9wZXJhdGlvbiBpcyBpbW1lZGl0ZWxseSBlcnJvcmVkLgorLgorLkhQCisuQlIgXC1LIHwgXC1cLWlnbm9yZWFjdGl2YXRpb25za2lwCisuYnIKK0lnbm9yZSB0aGUgZmxhZyB0byBza2lwIExvZ2ljYWwgVm9sdW1lcyBkdXJpbmcgYWN0aXZhdGlvbi4KK1VzZSBcZkJcLVwtc2V0YWN0aXZhdGlvbnNraXBcZlAgb3B0aW9uIHRvIHNldCBvciByZXNldAorYWN0aXZhdGlvbiBza2lwcGluZyBmbGFnIHBlcnNpc3RlbnRseSBmb3IgbG9naWNhbCB2b2x1bWUuCisuCisuSFAKKy5CUiBcLVwtaWdub3JlbW9uaXRvcmluZworLmJyCitNYWtlIG5vIGF0dGVtcHQgdG8gaW50ZXJhY3Qgd2l0aCBkbWV2ZW50ZCB1bmxlc3MgXGZCXC1cLW1vbml0b3JcZlAKK2lzIHNwZWNpZmllZC4KKy4KKy5IUAorLkJSIC1sIHwgXC1cLWV4dGVudHMKKy5JUiBMb2dpY2FsRXh0ZW50c051bWJlciBcYworLlJCIFsgJSB7IFZHIHwgUFZTIHwgRlJFRSB8IE9SSUdJTiB9XQorLmJyCitTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIG5ldyBMViBpbiBsb2dpY2FsIGV4dGVudHMuICBUaGUgbnVtYmVyIG9mCitwaHlzaWNhbCBleHRlbnRzIGFsbG9jYXRlZCBtYXkgYmUgZGlmZmVyZW50LCBhbmQgZGVwZW5kcyBvbiB0aGUgTFYgdHlwZS4KK0NlcnRhaW4gTFYgdHlwZXMgcmVxdWlyZSBtb3JlIHBoeXNpY2FsIGV4dGVudHMgZm9yIGRhdGEgcmVkdW5kYW5jeSBvcgorbWV0YWRhdGEuICBBbiBhbHRlcm5hdGUgc3ludGF4IGFsbG93cyB0aGUgc2l6ZSB0byBiZSBkZXRlcm1pbmVkIGluZGlyZWN0bHkKK2FzIGEgcGVyY2VudGFnZSBvZiB0aGUgc2l6ZSBvZiBhIHJlbGF0ZWQgVkcsIExWLCBvciBzZXQgb2YgUFZzLiAgVGhlCitzdWZmaXggXGZCJVZHXGZQIGRlbm90ZXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFZHLCB0aGUgc3VmZml4IFxmQiVGUkVFXGZQCit0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgaW4gdGhlIFZHLCBhbmQgdGhlIHN1ZmZpeCBcZkIlUFZTXGZQIHRoZSBmcmVlCitzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIFBoeXNpY2FsIFZvbHVtZXMuICBGb3IgYSBzbmFwc2hvdCwgdGhlIHNpemUKK2NhbiBiZSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBPcmlnaW4gTG9naWNhbAorVm9sdW1lIHdpdGggdGhlIHN1ZmZpeCBcZkIlT1JJR0lOXGZQIChcZkIxMDAlT1JJR0lOXGZQIHByb3ZpZGVzIHNwYWNlIGZvcgordGhlIHdob2xlIG9yaWdpbikuCitXaGVuIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UsIHRoZSBzaXplIGRlZmluZXMgYW4gdXBwZXIgbGltaXQgZm9yIHRoZQorbnVtYmVyIG9mIGxvZ2ljYWwgZXh0ZW50cyBpbiB0aGUgbmV3IExWLiBUaGUgcHJlY2lzZSBudW1iZXIgb2YgbG9naWNhbAorZXh0ZW50cyBpbiB0aGUgbmV3IExWIGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisuCisuSFAKKy5CUiBcLWogfCBcLVwtbWFqb3IKKy5JUiBNYWpvcgorLmJyCitTZXRzIHRoZSBtYWpvciBudW1iZXIuCitNYWpvciBudW1iZXJzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggcG9vbCB2b2x1bWVzLgorVGhpcyBvcHRpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gb2xkZXIgc3lzdGVtcworKGtlcm5lbCB2ZXJzaW9uIDIuNCkgYW5kIGlzIGlnbm9yZWQgb24gbW9kZXJuIExpbnV4IHN5c3RlbXMgd2hlcmUgbWFqb3IKK251bWJlcnMgYXJlIGR5bmFtaWNhbGx5IGFzc2lnbmVkLgorLgorLkhQCisuQlIgXC1cLW1ldGFkYXRhcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lCisuYnIKK1VzZXMgYW5kIGF0dGFjaGVzIHRoZSBcZklQcm9maWxlTmFtZVxmUCBjb25maWd1cmF0aW9uIHByb2ZpbGUgdG8gdGhlIGxvZ2ljYWwKK3ZvbHVtZSBtZXRhZGF0YS4gV2hlbmV2ZXIgdGhlIGxvZ2ljYWwgdm9sdW1lIGlzIHByb2Nlc3NlZCBuZXh0IHRpbWUsCit0aGUgcHJvZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGFwcGxpZWQuIElmIHRoZSB2b2x1bWUgZ3JvdXAgaGFzIGFub3RoZXIKK3Byb2ZpbGUgYXR0YWNoZWQsIHRoZSBsb2dpY2FsIHZvbHVtZSBwcm9maWxlIGlzIHByZWZlcnJlZC4KK1NlZSBcZkJsdm0uY29uZlxmUCg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBcZkJtZXRhZGF0YSBwcm9maWxlc1xmUC4KKy4KKy5IUAorLkJSIFwtXC1taW5vcgorLklSIE1pbm9yCisuYnIKK1NldHMgdGhlIG1pbm9yIG51bWJlci4KK01pbm9yIG51bWJlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBwb29sIHZvbHVtZXMuCisuCisuSFAKKy5CUiBcLW0gfCBcLVwtbWlycm9ycworLklSIG1pcnJvcnMKKy5icgorQ3JlYXRlcyBhIG1pcnJvcmVkIGxvZ2ljYWwgdm9sdW1lIHdpdGggXGZJbWlycm9yc1xmUCBjb3BpZXMuCitGb3IgZXhhbXBsZSwgc3BlY2lmeWluZyBcZkJcLW0gMVxmUAord291bGQgcmVzdWx0IGluIGEgbWlycm9yIHdpdGggdHdvLXNpZGVzOyB0aGF0IGlzLAorYSBsaW5lYXIgdm9sdW1lIHBsdXMgb25lIGNvcHkuCisKK1NwZWNpZnlpbmcgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IFxmQlwtXC1ub3N5bmNcZlAgd2lsbCBjYXVzZSB0aGUgY3JlYXRpb24KK29mIHRoZSBtaXJyb3IgdG8gc2tpcCB0aGUgaW5pdGlhbCByZXN5bmNocm9uaXphdGlvbi4gIEFueSBkYXRhIHdyaXR0ZW4KK2FmdGVyd2FyZHMgd2lsbCBiZSBtaXJyb3JlZCwgYnV0IHRoZSBvcmlnaW5hbCBjb250ZW50cyB3aWxsIG5vdCBiZQorY29waWVkLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHNraXBwaW5nIGEgcG90ZW50aWFsbHkgbG9uZyBhbmQgcmVzb3VyY2UKK2ludGVuc2l2ZSBpbml0aWFsIHN5bmMgb2YgYW4gZW1wdHkgZGV2aWNlLgorCitUaGVyZSBhcmUgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBtaXJyb3Jpbmcgd2hpY2ggY2FuIGJlIHVzZWQgYW5kIGNvcnJlc3BvbmQKK3RvIHRoZSAiXGZJcmFpZDFcZlAiIGFuZCAiXGZJbWlycm9yXGZQIiBzZWdtZW50IHR5cGVzLgorVGhlIGRlZmF1bHQgaXMgIlxmSXJhaWQxXGZQIi4gIFNlZSB0aGUKK1xmQlwtXC10eXBlXGZQIG9wdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlCitsZWdhY3kgIlxmSW1pcnJvclxmUCIgc2VnbWVudCB0eXBlLiAgU2VlCisuQlIgbHZtLmNvbmYgKDUpCitzZXR0aW5ncyBcZkIgZ2xvYmFsL21pcnJvcl9zZWd0eXBlX2RlZmF1bHRcZlAKK2FuZCBcZkJnbG9iYWwvcmFpZDEwX3NlZ3R5cGVfZGVmYXVsdFxmUAordG8gY29uZmlndXJlIGRlZmF1bHQgbWlycm9yIHNlZ21lbnQgdHlwZS4KK1RoZSBvcHRpb25zCitcZkJcLVwtbWlycm9ybG9nXGZQIGFuZCBcZkJcLVwtY29yZWxvZ1xmUCBhcHBseQordG8gdGhlIGxlZ2FjeSAiXGZJbWlycm9yXGZQIiBzZWdtZW50IHR5cGUgb25seS4KKy4KKy5IUAorLkJSIFwtXC1taXJyb3Jsb2cKKy5SQiB7IGRpc2sgfCBjb3JlIHwgbWlycm9yZWQgfQorLmJyCitTcGVjaWZpZXMgdGhlIHR5cGUgb2YgbG9nIHRvIGJlIHVzZWQgZm9yIGxvZ2ljYWwgdm9sdW1lcyB1dGlsaXppbmcKK3RoZSBsZWdhY3kgIlxmSW1pcnJvclxmUCIgc2VnbWVudCB0eXBlLgorLmJyCitUaGUgZGVmYXVsdCBpcyBcZkJkaXNrXGZQLCB3aGljaCBpcyBwZXJzaXN0ZW50IGFuZCByZXF1aXJlcworYSBzbWFsbCBhbW91bnQgb2Ygc3RvcmFnZSBzcGFjZSwgdXN1YWxseSBvbiBhIHNlcGFyYXRlIGRldmljZSBmcm9tIHRoZQorZGF0YSBiZWluZyBtaXJyb3JlZC4KKy5icgorVXNpbmcgXGZCY29yZVxmUCBtZWFucyB0aGUgbWlycm9yIGlzIHJlZ2VuZXJhdGVkIGJ5IGNvcHlpbmcgdGhlIGRhdGEKK2Zyb20gdGhlIGZpcnN0IGRldmljZSBlYWNoIHRpbWUgdGhlIGxvZ2ljYWwgdm9sdW1lIGlzIGFjdGl2YXRlZCwKK2xpa2UgYWZ0ZXIgZXZlcnkgcmVib290LgorLmJyCitVc2luZyBcZkJtaXJyb3JlZFxmUCB3aWxsIGNyZWF0ZSBhIHBlcnNpc3RlbnQgbG9nIHRoYXQgaXMgaXRzZWxmIG1pcnJvcmVkLgorLgorLkhQCisuQlIgXC1cLW1vbml0b3IKKy5SQiB7IHkgfCBuIH0KKy5icgorU3RhcnRzIG9yIGF2b2lkcyBtb25pdG9yaW5nIGEgbWlycm9yZWQsIHNuYXBzaG90IG9yIHRoaW4gcG9vbCBsb2dpY2FsIHZvbHVtZSB3aXRoCitkbWV2ZW50ZCwgaWYgaXQgaXMgaW5zdGFsbGVkLgorSWYgYSBkZXZpY2UgdXNlZCBieSBhIG1vbml0b3JlZCBtaXJyb3IgcmVwb3J0cyBhbiBJL08gZXJyb3IsCit0aGUgZmFpbHVyZSBpcyBoYW5kbGVkIGFjY29yZGluZyB0bworXGZCYWN0aXZhdGlvbi9taXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5XGZQCithbmQgXGZCYWN0aXZhdGlvbi9taXJyb3JfbG9nX2ZhdWx0X3BvbGljeVxmUAorc2V0IGluIFxmQmx2bS5jb25mXGZQKDUpLgorLgorLkhQCisuQlIgXC1uIHwgXC1cLW5hbWUKKy5JUiBMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLmJyCitTZXRzIHRoZSBuYW1lIGZvciB0aGUgbmV3IGxvZ2ljYWwgdm9sdW1lLgorLmJyCitXaXRob3V0IHRoaXMgb3B0aW9uIGEgZGVmYXVsdCBuYW1lIG9mICJsdm9sIyIgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlcmUKKyMgaXMgdGhlIExWTSBpbnRlcm5hbCBudW1iZXIgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lLgorLgorLkhQCisuQlIgXC1cLW5vc3luYworLmJyCitDYXVzZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBtaXJyb3IgdG8gc2tpcCB0aGUgaW5pdGlhbCByZXN5bmNocm9uaXphdGlvbi4KKy4KKy5IUAorLkJSIFwtXC1ub3VkZXZzeW5jCisuYnIKK0Rpc2FibGVzIHVkZXYgc3luY2hyb25pc2F0aW9uLiBUaGUKK3Byb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9uIGZyb20gdWRldi4KK0l0IHdpbGwgY29udGludWUgaXJyZXNwZWN0aXZlIG9mIGFueSBwb3NzaWJsZSB1ZGV2IHByb2Nlc3NpbmcKK2luIHRoZSBiYWNrZ3JvdW5kLiAgWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcKK29yIGhhcyBydWxlcyB0aGF0IGlnbm9yZSB0aGUgZGV2aWNlcyBMVk0yIGNyZWF0ZXMuCisuCisuSFAKKy5CUiBcLXAgfCBcLVwtcGVybWlzc2lvbgorLlJCIHsgciB8IHJ3IH0KKy5icgorU2V0cyBhY2Nlc3MgcGVybWlzc2lvbnMgdG8gcmVhZCBvbmx5IChcZkJyXGZQKSBvciByZWFkIGFuZCB3cml0ZSAoXGZCcndcZlApLgorLmJyCitEZWZhdWx0IGlzIHJlYWQgYW5kIHdyaXRlLgorLgorLkhQCisuQlIgXC1NIHwgXC1cLXBlcnNpc3RlbnQKKy5SQiB7IHkgfCBuIH0KKy5icgorU2V0IHRvIFxmQnlcZlAgdG8gbWFrZSB0aGUgbWlub3IgbnVtYmVyIHNwZWNpZmllZCBwZXJzaXN0ZW50LgorUG9vbCB2b2x1bWVzIGNhbm5vdCBoYXZlIHBlcnNpc3RlbnQgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMuCitEZWZhdWx0cyB0byBcZkJ5XGZQZXMgb25seSB3aGVuIG1ham9yIG9yIG1pbm9yIG51bWJlciBpcyBzcGVjaWZpZWQuCitPdGhlcndpc2UgaXQgaXMgXGZCblxmUG8uCisuXCIgLkhQCisuXCIgLklSIFxmQlwtXC1wb29sZGF0YXNpemUgIiAiIFBvb2xEYXRhVm9sdW1lU2l6ZSBbIGJCc1NrS21NZ0d0VHBQZUUgXQorLlwiIFNldHMgdGhlIHNpemUgb2YgcG9vbCdzIGRhdGEgbG9naWNhbCB2b2x1bWUuCisuXCIgRm9yIHRoaW4gcG9vbHMgeW91IG1heSBhbHNvIHNwZWNpZnkgdGhlIHNpemUKKy5cIiB3aXRoIHRoZSBvcHRpb24gXGZCXC1cLXNpemVcZlAuCisuXCIKKy4KKy5IUAorLkJSIFwtXC1wb29sbWV0YWRhdGFzaXplCisuU0laRV9HIFwlTWV0YWRhdGFWb2x1bWVTaXplCisuYnIKK1NldHMgdGhlIHNpemUgb2YgcG9vbCdzIG1ldGFkYXRhIGxvZ2ljYWwgdm9sdW1lLgorU3VwcG9ydGVkIHZhbHVlcyBhcmUgaW4gcmFuZ2UgYmV0d2VlbiAyTWlCIGFuZCAxNkdpQiBmb3IgdGhpbiBwb29sLAorYW5kIHVwdG8gMTZHaUIgZm9yIGNhY2hlIHBvb2wuIFRoZSBtaW5pbXVtIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gcG9vbCdzCitkYXRhIHNpemUuCitEZWZhdWx0IHZhbHVlIGZvciB0aGluIHBvb2wgaXMgKFBvb2xfTFZfc2l6ZSAvIFBvb2xfTFZfY2h1bmtfc2l6ZSAqIDY0YikuCitEZWZhdWx0IHVuaXQgaXMgbWVnYWJ5dGVzLgorLgorLkhQCisuQlIgXC1cLXBvb2xtZXRhZGF0YXNwYXJlCisuUkIgeyB5IHwgbiB9CisuYnIKK0NvbnRyb2xzIGNyZWF0aW9uIGFuZCBtYWludGFuZW5jZSBvZiBwb29sIG1ldGFkYXRhIHNwYXJlIGxvZ2ljYWwgdm9sdW1lCit0aGF0IHdpbGwgYmUgdXNlZCBmb3IgYXV0b21hdGVkIHBvb2wgcmVjb3ZlcnkuCitPbmx5IG9uZSBzdWNoIHZvbHVtZSBpcyBtYWludGFpbmVkIHdpdGhpbiBhIHZvbHVtZSBncm91cAord2l0aCB0aGUgc2l6ZSBvZiB0aGUgYmlnZ2VzdCBwb29sIG1ldGFkYXRhIHZvbHVtZS4KK0RlZmF1bHQgaXMgXGZCeVxmUGVzLgorLgorLkhQCisuQlIgXC1cLSBbIHJhaWQgXSBtYXhyZWNvdmVyeXJhdGUKKy5TSVpFX0cgXCVSYXRlCisuYnIKK1NldHMgdGhlIG1heGltdW0gcmVjb3ZlcnkgcmF0ZSBmb3IgYSBSQUlEIGxvZ2ljYWwgdm9sdW1lLiAgXGZJUmF0ZVxmUAoraXMgc3BlY2lmaWVkIGFzIGFuIGFtb3VudCBwZXIgc2Vjb25kIGZvciBlYWNoIGRldmljZSBpbiB0aGUgYXJyYXkuCitJZiBubyBzdWZmaXggaXMgZ2l2ZW4sIHRoZW4gS2lCL3NlYy9kZXZpY2UgaXMgYXNzdW1lZC4gIFNldHRpbmcgdGhlCityZWNvdmVyeSByYXRlIHRvIDAgbWVhbnMgaXQgd2lsbCBiZSB1bmJvdW5kZWQuCisuCisuSFAKKy5CUiBcLVwtIFsgcmFpZCBdIG1pbnJlY292ZXJ5cmF0ZQorLlNJWkVfRyBcJVJhdGUKKy5icgorU2V0cyB0aGUgbWluaW11bSByZWNvdmVyeSByYXRlIGZvciBhIFJBSUQgbG9naWNhbCB2b2x1bWUuICBcZklSYXRlXGZQCitpcyBzcGVjaWZpZWQgYXMgYW4gYW1vdW50IHBlciBzZWNvbmQgZm9yIGVhY2ggZGV2aWNlIGluIHRoZSBhcnJheS4KK0lmIG5vIHN1ZmZpeCBpcyBnaXZlbiwgdGhlbiBLaUIvc2VjL2RldmljZSBpcyBhc3N1bWVkLiAgU2V0dGluZyB0aGUKK3JlY292ZXJ5IHJhdGUgdG8gMCBtZWFucyBpdCB3aWxsIGJlIHVuYm91bmRlZC4KKy4KKy5IUAorLkJSIFwtciB8IFwtXC1yZWFkYWhlYWQKKy5SQiB7IFxmSVJlYWRBaGVhZFNlY3RvcnMgfCBhdXRvIHwgbm9uZSB9CisuYnIKK1NldHMgcmVhZCBhaGVhZCBzZWN0b3IgY291bnQgb2YgdGhpcyBsb2dpY2FsIHZvbHVtZS4KK0ZvciB2b2x1bWUgZ3JvdXBzIHdpdGggbWV0YWRhdGEgaW4gbHZtMSBmb3JtYXQsIHRoaXMgbXVzdAorYmUgYSB2YWx1ZSBiZXR3ZWVuIDIgYW5kIDEyMC4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIFxmQmF1dG9cZlAgd2hpY2ggYWxsb3dzIHRoZSBrZXJuZWwgdG8gY2hvb3NlCithIHN1aXRhYmxlIHZhbHVlIGF1dG9tYXRpY2FsbHkuCitcZkJub25lXGZQIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB6ZXJvLgorLgorLkhQCisuQlIgXC1SIHwgXC1cLXJlZ2lvbnNpemUKKy5TSVpFX0cgXCVNaXJyb3JMb2dSZWdpb25TaXplCisuYnIKK0EgbWlycm9yIGlzIGRpdmlkZWQgaW50byByZWdpb25zIG9mIHRoaXMgc2l6ZSAoaW4gTWlCKSwgYW5kIHRoZSBtaXJyb3IgbG9nCit1c2VzIHRoaXMgZ3JhbnVsYXJpdHkgdG8gdHJhY2sgd2hpY2ggcmVnaW9ucyBhcmUgaW4gc3luYy4KKy4KKy5IUAorLkJSIFwtayB8IFwtXC1zZXRhY3RpdmF0aW9uc2tpcAorLlJCIHsgeSB8IG4gfQorLmJyCitDb250cm9scyB3aGV0aGVyIExvZ2ljYWwgVm9sdW1lcyBhcmUgcGVyc2lzdGVudGx5IGZsYWdnZWQgdG8gYmUgc2tpcHBlZCBkdXJpbmcKK2FjdGl2YXRpb24uIEJ5IGRlZmF1bHQsIHRoaW4gc25hcHNob3Qgdm9sdW1lcyBhcmUgZmxhZ2dlZCBmb3IgYWN0aXZhdGlvbiBza2lwLgorU2VlCisuQlIgbHZtLmNvbmYgKDUpCitcZkJhY3RpdmF0aW9uL2F1dG9fc2V0X2FjdGl2YXRpb25fc2tpcFxmUAoraG93IHRvIGNoYW5nZSBpdHMgZGVmYXVsdCBiZWhhdmlvdXIuCitUbyBhY3RpdmF0ZSBzdWNoIHZvbHVtZXMsIGFuIGV4dHJhIFxmQlwtXC1pZ25vcmVhY3RpdmF0aW9uc2tpcFxmUAorb3B0aW9uIG11c3QgYmUgdXNlZC4gVGhlIGZsYWcgaXMgbm90IGFwcGxpZWQgZHVyaW5nIGRlYWN0aXZhdGlvbi4gVXNlCitcZkJsdmNoYW5nZSBcLVwtc2V0YWN0aXZhdGlvbnNraXBcZlAKK2NvbW1hbmQgdG8gY2hhbmdlIHRoZSBza2lwIGZsYWcgZm9yIGV4aXN0aW5nIHZvbHVtZXMuCitUbyBzZWUgd2hldGhlciB0aGUgZmxhZyBpcyBhdHRhY2hlZCwgdXNlIFxmQmx2c1xmUCBjb21tYW5kCit3aGVyZSB0aGUgc3RhdGUgb2YgdGhlIGZsYWcgaXMgcmVwb3J0ZWQgd2l0aGluIFxmQmx2X2F0dHJcZlAgYml0cy4KKy4KKy5IUAorLkJSIFwtTCB8IFwtXC1zaXplCisuU0laRV9FIFwlTG9naWNhbFZvbHVtZVNpemUKKy5icgorR2l2ZXMgdGhlIHNpemUgdG8gYWxsb2NhdGUgZm9yIHRoZSBuZXcgbG9naWNhbCB2b2x1bWUuCitBIHNpemUgc3VmZml4IG9mIFxmQkJcZlAgZm9yIGJ5dGVzLCBcZkJTXGZQIGZvciBzZWN0b3JzIGFzIDUxMiBieXRlcywKK1xmQktcZlAgZm9yIGtpbG9ieXRlcywgXGZCTVxmUCBmb3IgbWVnYWJ5dGVzLAorXGZCR1xmUCBmb3IgZ2lnYWJ5dGVzLCBcZkJUXGZQIGZvciB0ZXJhYnl0ZXMsIFxmQlBcZlAgZm9yIHBldGFieXRlcworb3IgXGZCRVxmUCBmb3IgZXhhYnl0ZXMgaXMgb3B0aW9uYWwuCisuYnIKK0RlZmF1bHQgdW5pdCBpcyBtZWdhYnl0ZXMuCisuCisuSFAKKy5CUiBcLXMgfCBcZkJcLVwtc25hcHNob3QKKy5JUiBPcmlnaW5hbExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9CisuYnIKK0NyZWF0ZXMgYSBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZSAob3Igc25hcHNob3QpIGZvciBhbiBleGlzdGluZywgc28gY2FsbGVkCitvcmlnaW5hbCBsb2dpY2FsIHZvbHVtZSAob3Igb3JpZ2luKS4KK1NuYXBzaG90cyBwcm92aWRlIGEgJ2Zyb3plbiBpbWFnZScgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW4KK3doaWxlIHRoZSBvcmlnaW4gY2FuIHN0aWxsIGJlIHVwZGF0ZWQuIFRoZXkgZW5hYmxlIGNvbnNpc3RlbnQKK2JhY2t1cHMgYW5kIG9ubGluZSByZWNvdmVyeSBvZiByZW1vdmVkL292ZXJ3cml0dGVuIGRhdGEvZmlsZXMuCisuYnIKK1RoaW4gc25hcHNob3QgaXMgY3JlYXRlZCB3aGVuIHRoZSBvcmlnaW4gaXMgYSB0aGluIHZvbHVtZSBhbmQKK3RoZSBzaXplIElTIE5PVCBzcGVjaWZpZWQuIFRoaW4gc25hcHNob3Qgc2hhcmVzIHNhbWUgYmxvY2tzIHdpdGhpbgordGhlIHRoaW4gcG9vbCB2b2x1bWUuCitUaGUgbm9uIHRoaW4gdm9sdW1lIHNuYXBzaG90IHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGRvZXMgbm90IG5lZWQKK3RoZSBzYW1lIGFtb3VudCBvZiBzdG9yYWdlIHRoZSBvcmlnaW4gaGFzLiBJbiBhIHR5cGljYWwgc2NlbmFyaW8sCisxNS0yMCUgbWlnaHQgYmUgZW5vdWdoLiBJbiBjYXNlIHRoZSBzbmFwc2hvdCBydW5zIG91dCBvZiBzdG9yYWdlLCB1c2UKKy5CUiBsdmV4dGVuZCAoOCkKK3RvIGdyb3cgaXQuIFNocmlua2luZyBhIHNuYXBzaG90IGlzIHN1cHBvcnRlZCBieQorLkJSIGx2cmVkdWNlICg4KQorYXMgd2VsbC4gUnVuCisuQlIgbHZzICg4KQorb24gdGhlIHNuYXBzaG90IGluIG9yZGVyIHRvIGNoZWNrIGhvdyBtdWNoIGRhdGEgaXMgYWxsb2NhdGVkIHRvIGl0LgorTm90ZTogYSBzbWFsbCBhbW91bnQgb2YgdGhlIHNwYWNlIHlvdSBhbGxvY2F0ZSB0byB0aGUgc25hcHNob3QgaXMKK3VzZWQgdG8gdHJhY2sgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY2h1bmtzIG9mIGRhdGEsIHNvIHlvdSBzaG91bGQKK2FsbG9jYXRlIHNsaWdodGx5IG1vcmUgc3BhY2UgdGhhbiB5b3UgYWN0dWFsbHkgbmVlZCBhbmQgbW9uaXRvcgorKFxmQlwtXC1tb25pdG9yXGZQKSB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgc25hcHNob3QgZGF0YSBpcyBncm93aW5nCitzbyB5b3UgY2FuIFxmQmF2b2lkXGZQIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLgorSWYgXGZCXC1cLXRoaW5wb29sXGZQIGlzIHNwZWNpZmllZCwgdGhpbiB2b2x1bWUgaXMgY3JlYXRlZCB0aGF0IHdpbGwKK3VzZSBnaXZlbiBvcmlnaW5hbCBsb2dpY2FsIHZvbHVtZSBhcyBhbiBleHRlcm5hbCBvcmlnaW4gdGhhdAorc2VydmVzIHVucHJvdmlzaW9uZWQgYmxvY2tzLgorT25seSByZWFkLW9ubHkgdm9sdW1lcyBjYW4gYmUgdXNlZCBhcyBleHRlcm5hbCBvcmlnaW5zLgorVG8gbWFrZSB0aGUgdm9sdW1lIGV4dGVybmFsIG9yaWdpbiwgbHZtIGV4cGVjdHMgdGhlIHZvbHVtZSB0byBiZSBpbmFjdGl2ZS4KK0V4dGVybmFsIG9yaWdpbiB2b2x1bWUgY2FuIGJlIHVzZWQvc2hhcmVkIGZvciBtYW55IHRoaW4gdm9sdW1lcworZXZlbiBmcm9tIGRpZmZlcmVudCB0aGluIHBvb2xzLiBTZWUKKy5CUiBsdmNvbnZlcnQgKDgpCitmb3Igb25saW5lIGNvbnZlcnNpb24gdG8gdGhpbiB2b2x1bWVzIHdpdGggZXh0ZXJuYWwgb3JpZ2luLgorLgorLkhQCisuQlIgXC1pIHwgXC1cLXN0cmlwZXMKKy5JUiBTdHJpcGVzCisuYnIKK0dpdmVzIHRoZSBudW1iZXIgb2Ygc3RyaXBlcy4KK1RoaXMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwaHlzaWNhbCB2b2x1bWVzIHRvIHNjYXR0ZXIKK3RoZSBsb2dpY2FsIHZvbHVtZSBkYXRhLiAgV2hlbiBjcmVhdGluZyBhIFJBSUQgNC81LzYgbG9naWNhbCB2b2x1bWUsCit0aGUgZXh0cmEgZGV2aWNlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciBwYXJpdHkgYXJlCitpbnRlcm5hbGx5IGFjY291bnRlZCBmb3IuICBTcGVjaWZ5aW5nIFxmQlwtaSAzXGZQCit3b3VsZCBjYXVzZSAzIGRldmljZXMgZm9yIHN0cmlwZWQgYW5kIFJBSUQgMCBsb2dpY2FsIHZvbHVtZXMsCis0IGRldmljZXMgZm9yIFJBSUQgNC81LCA1IGRldmljZXMgZm9yIFJBSUQgNiBhbmQgNiBkZXZpY2VzIGZvciBSQUlEIDEwLgorQWx0ZXJuYXRpdmVseSwgUkFJRCAwIHdpbGwgc3RyaXBlIGFjcm9zcyAyIGRldmljZXMsCitSQUlEIDQvNSBhY3Jvc3MgMyBQVnMsIFJBSUQgNiBhY3Jvc3MgNSBQVnMgYW5kIFJBSUQgMTAgYWNyb3NzCis0IFBWcyBpbiB0aGUgdm9sdW1lIGdyb3VwIGlmIHRoZSBcZkJcLWlcZlAgYXJndW1lbnQgaXMgb21pdHRlZC4KK0luIG9yZGVyIHRvIHN0cmlwZSBhY3Jvc3MgYWxsIFBWcyBvZiB0aGUgVkcgaWYgdGhlIFxmQlwtaVxmUCBhcmd1bWVudCBpcworb21pdHRlZCwgc2V0IHJhaWRfc3RyaXBlX2FsbF9kZXZpY2VzPTEgaW4gdGhlIGFsbG9jYXRpb24KK3NlY3Rpb24gb2YgXGZCbHZtLmNvbmYgKDUpXGZQIG9yIGFkZAorLmJyCitcZkJcLVwtY29uZmlnIGFsbG9jYXRpb24vcmFpZF9zdHJpcGVfYWxsX2RldmljZXM9MVxmUAorLmJyCit0byB0aGUgY29tbWFuZC4KKy5icgorTm90ZSB0aGUgY3VycmVudCBsaW1pdGF0aW9uIG9mIDggc3RyaXBlcyB0b3RhbCBpbiBhbnkgUmFpZExWIGluY2x1ZGluZyBwYXJpdHkgZGV2aWNlcy4KKworVHdvIGltcGxlbWVudGF0aW9ucyBvZiBiYXNpYyBzdHJpcGluZyBhcmUgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwuCitUaGUgb3JpZ2luYWwgZGV2aWNlLW1hcHBlciBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgZGVmYXVsdCBhbmQgc2hvdWxkCitub3JtYWxseSBiZSB1c2VkLiAgVGhlIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIHVzaW5nIE1ELCBhdmFpbGFibGUKK3NpbmNlIHZlcnNpb24gMS43IG9mIHRoZSBSQUlEIGRldmljZS1tYXBwZXIga2VybmVsIHRhcmdldCAoa2VybmVsCit2ZXJzaW9uIDQuMikgaXMgcHJvdmlkZWQgdG8gZmFjaWxpdGF0ZSB0aGUgZGV2ZWxvcG1lbnQgb2YgbmV3IFJBSUQKK2ZlYXR1cmVzLiAgSXQgbWF5IGJlIGFjY2Vzc2VkIHdpdGggXGZCLS10eXBlIHJhaWQwXGZQLCBidXQgaXMgYmVzdAorYXZvaWRlZCBhdCBwcmVzZW50IGJlY2F1c2Ugb2YgYXNzb3J0ZWQgcmVzdHJpY3Rpb25zIG9uIHJlc2l6aW5nIGFuZCBjb252ZXJ0aW5nCitzdWNoIGRldmljZXMuCisuSFAKKy5CUiBcLUkgfCBcLVwtc3RyaXBlc2l6ZQorLklSIFN0cmlwZVNpemUKKy5icgorR2l2ZXMgdGhlIG51bWJlciBvZiBraWxvYnl0ZXMgZm9yIHRoZSBncmFudWxhcml0eSBvZiB0aGUgc3RyaXBlcy4KKy5icgorU3RyaXBlU2l6ZSBtdXN0IGJlIDJebiAobiA9IDIgdG8gOSkgZm9yIG1ldGFkYXRhIGluIExWTTEgZm9ybWF0LgorRm9yIG1ldGFkYXRhIGluIExWTTIgZm9ybWF0LCB0aGUgc3RyaXBlIHNpemUgbWF5IGJlIGEgbGFyZ2VyCitwb3dlciBvZiAyIGJ1dCBtdXN0IG5vdCBleGNlZWQgdGhlIHBoeXNpY2FsIGV4dGVudCBzaXplLgorLgorLkhQCisuQlIgXC1UIHwgXC1cLXRoaW4KKy5icgorQ3JlYXRlcyB0aGluIHBvb2wgb3IgdGhpbiBsb2dpY2FsIHZvbHVtZSBvciBib3RoLgorU3BlY2lmeWluZyB0aGUgb3B0aW9uYWwgYXJndW1lbnQgXGZCXC1cLXNpemVcZlAgb3IgXGZCXC1cLWV4dGVudHNcZlAKK3dpbGwgY2F1c2UgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aGluIHBvb2wgbG9naWNhbCB2b2x1bWUuCitTcGVjaWZ5aW5nIHRoZSBvcHRpb25hbCBhcmd1bWVudCBcZkJcLVwtdmlydHVhbHNpemVcZlAgd2lsbCBjYXVzZQordGhlIGNyZWF0aW9uIG9mIHRoZSB0aGluIGxvZ2ljYWwgdm9sdW1lIGZyb20gZ2l2ZW4gdGhpbiBwb29sIHZvbHVtZS4KK1NwZWNpZnlpbmcgYm90aCBhcmd1bWVudHMgd2lsbCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgYm90aAordGhpbiBwb29sIGFuZCB0aGluIHZvbHVtZSB1c2luZyB0aGlzIHBvb2wuCitTZWUgXGZCbHZtdGhpblxmUCg3KSBmb3IgbW9yZSBpbmZvIGFib3V0IHRoaW4gcHJvdmlzaW9uaW5nIHN1cHBvcnQuCitUaGluIHByb3Zpc2lvbmluZyByZXF1aXJlcyBkZXZpY2UgbWFwcGVyIGtlcm5lbCBkcml2ZXIKK2Zyb20ga2VybmVsIDMuMiBvciBncmVhdGVyLgorLgorLkhQCisuQlIgXC1cLXRoaW5wb29sCisuSVIgVGhpblBvb2xMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLmJyCitTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhpbiBwb29sIHZvbHVtZSBuYW1lLiBUaGUgb3RoZXIgd2F5IHRvIHNwZWNpZnkgcG9vbCBuYW1lCitpcyB0byBhcHBlbmQgbmFtZSB0byBWb2x1bWUgZ3JvdXAgbmFtZSBhcmd1bWVudC4KKy4KKy5IUAorLkJSIFwtXC10eXBlCisuSVIgU2VnbWVudFR5cGUKKy5icgorQ3JlYXRlcyBhIGxvZ2ljYWwgdm9sdW1lIHdpdGggdGhlIHNwZWNpZmllZCBzZWdtZW50IHR5cGUuCitTdXBwb3J0ZWQgdHlwZXMgYXJlOgorLkJSIGNhY2hlICwKKy5CUiBjYWNoZS1wb29sICwKKy5CUiBlcnJvciAsCisuQlIgbGluZWFyICwKKy5CUiBtaXJyb3IsCisuQlIgcmFpZDAgLAorLkJSIHJhaWQxICwKKy5CUiByYWlkNCAsCisuQlIgcmFpZDVfbGEgLAorLkJSIHJhaWQ1X2xzCisuUkIgKD0KKy5CUiByYWlkNSApLAorLkJSIHJhaWQ1X3JhICwKKy5CUiByYWlkNV9ycyAsCisuQlIgcmFpZDZfbmMgLAorLkJSIHJhaWQ2X25yICwKKy5CUiByYWlkNl96cgorLlJCICg9CisuQlIgcmFpZDYgKSwKKy5CUiByYWlkMTAgLAorLkJSIHNuYXBzaG90ICwKKy5CUiBzdHJpcGVkLAorLkJSIHRoaW4gLAorLkJSIHRoaW4tcG9vbAorb3IKKy5CUiB6ZXJvIC4KK1NlZ21lbnQgdHlwZSBtYXkgaGF2ZSBhIGNvbW1hbmRsaW5lIHN3aXRjaCBhbGlhcyB0aGF0IHdpbGwKK2VuYWJsZSBpdHMgdXNlLgorV2hlbiB0aGUgdHlwZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgYW4gaW1wbGljaXQgdHlwZQoraXMgc2VsZWN0ZWQgZnJvbSBjb21iaW5hdGlvbiBvZiBvcHRpb25zOgorLkJSIFwtSCB8IFwtXC1jYWNoZSB8IFwtXC1jYWNoZXBvb2wKKyhjYWNoZSBvciBjYWNoZXBvb2wpLAorLkJSIFwtVCB8IFwtXC10aGluIHwgXC1cLXRoaW5wb29sCisodGhpbiBvciB0aGlucG9vbCksCisuQlIgXC1tIHwgXC1cLW1pcnJvcnMKKyhyYWlkMSBvciBtaXJyb3IpLAorLkJSIFwtcyB8IFwtXC1zbmFwc2hvdCB8IFwtViB8IFwtXC12aXJ0dWFsc2l6ZQorKHNuYXBzaG90IG9yIHRoaW4pLAorLkJSIFwtaSB8IFwtXC1zdHJpcGVzCisoc3RyaXBlZCkuCitUaGUgZGVmYXVsdCBzZWdtZW50IHR5cGUgaXMgXGZCbGluZWFyXGZQLgorLgorLkhQCisuQlIgXC1WIHwgXC1cLXZpcnR1YWxzaXplCisuU0laRV9FIFwlVmlydHVhbFNpemUKKy5icgorQ3JlYXRlcyBhIHRoaW5seSBwcm92aXNpb25lZCBkZXZpY2Ugb3IgYSBzcGFyc2UgZGV2aWNlIG9mIHRoZSBnaXZlbiBzaXplIChpbiBNaUIgYnkgZGVmYXVsdCkuCitTZWUKKy5CUiBsdm0uY29uZiAoNSkKK3NldHRpbmdzIFxmQmdsb2JhbC9zcGFyc2Vfc2VndHlwZV9kZWZhdWx0XGZQCit0byBjb25maWd1cmUgZGVmYXVsdCBzcGFyc2Ugc2VnbWVudCB0eXBlLgorU2VlIFxmQmx2bXRoaW5cZlAoNykgZm9yIG1vcmUgaW5mbyBhYm91dCB0aGluIHByb3Zpc2lvbmluZyBzdXBwb3J0LgorQW55dGhpbmcgd3JpdHRlbiB0byBhIHNwYXJzZSBzbmFwc2hvdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gcmVhZGluZyBmcm9tIGl0LgorUmVhZGluZyBmcm9tIG90aGVyIGFyZWFzIG9mIHRoZSBkZXZpY2Ugd2lsbCByZXR1cm4gYmxvY2tzIG9mIHplcm9zLgorVmlydHVhbCBzbmFwc2hvdCAoc3BhcnNlIHNuYXBzaG90KSBpcyBpbXBsZW1lbnRlZCBieSBjcmVhdGluZworYSBoaWRkZW4gdmlydHVhbCBkZXZpY2Ugb2YgdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHRoZSB6ZXJvIHRhcmdldC4KK0Egc3VmZml4IG9mIF92b3JpZ2luIGlzIHVzZWQgZm9yIHRoaXMgZGV2aWNlLgorTm90ZTogdXNpbmcgc3BhcnNlIHNuYXBzaG90cyBpcyBub3QgZWZmaWNpZW50IGZvciBsYXJnZXIKK2RldmljZSBzaXplcyAoR2lCKSwgdGhpbiBwcm92aXNpb25pbmcgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgY2FzZS4KKy4KKy5IUAorLkJSIFwtVyB8IFwtXC13aXBlc2lnbmF0dXJlcworLlJCIHsgeSB8IG4gfQorLmJyCitDb250cm9scyBkZXRlY3Rpb24gYW5kIHN1YnNlcXVlbnQgd2lwaW5nIG9mIHNpZ25hdHVyZXMgb24gbmV3bHkgY3JlYXRlZAorTG9naWNhbCBWb2x1bWUuIFRoZXJlJ3MgYSBwcm9tcHQgZm9yIGVhY2ggc2lnbmF0dXJlIGRldGVjdGVkIHRvIGNvbmZpcm0KK2l0cyB3aXBpbmcgKHVubGVzcyBcZkItLXllc1xmUCBpcyB1c2VkIHdoZXJlIExWTSBhc3N1bWVzICd5ZXMnIGFuc3dlcgorZm9yIGVhY2ggcHJvbXB0IGF1dG9tYXRpY2FsbHkpLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGJ5CitkZWZhdWx0IFxmQi1XXGZQIHwgXGZCLS13aXBlc2lnbmF0dXJlcyB5XGZQIGlzIGFzc3VtZWQgZWFjaCB0aW1lIHRoZQoremVyb2luZyBpcyBkb25lIChcZkJcLVpcZlAgfCBcZkJcLVwtemVybyB5XGZQKS4gVGhpcyBkZWZhdWx0IGJlaGF2aW91cgorY2FuIGJlIGNvbnRyb2xsZWQgYnkgXGZCXCVhbGxvY2F0aW9uL3dpcGVfc2lnbmF0dXJlc193aGVuX3plcm9pbmdfbmV3X2x2c1xmUAorc2V0dGluZyBmb3VuZCBpbgorLkJSIGx2bS5jb25mICg1KS4KKy5icgorSWYgYmxraWQgd2lwaW5nIGlzIHVzZWQgKFxmQmFsbG9jYXRpb24vdXNlX2Jsa2lkX3dpcGluZ1xmUCBzZXR0aW5nIGluCisuQlIgbHZtLmNvbmYgKDUpKQorYW5kIExWTTIgaXMgY29tcGlsZWQgd2l0aCBibGtpZCB3aXBpbmcgc3VwcG9ydCwgdGhlbiBcZkJibGtpZFxmUCg4KSBsaWJyYXJ5IGlzIHVzZWQKK3RvIGRldGVjdCB0aGUgc2lnbmF0dXJlcyAodXNlIFxmQmJsa2lkIFwta1xmUCBjb21tYW5kIHRvIGxpc3QgdGhlIHNpZ25hdHVyZXMgdGhhdCBhcmUgcmVjb2duaXplZCkuCitPdGhlcndpc2UsIG5hdGl2ZSBMVk0yIGNvZGUgaXMgdXNlZCB0byBkZXRlY3Qgc2lnbmF0dXJlcyAoTUQgUkFJRCwgc3dhcCBhbmQgTFVLUworc2lnbmF0dXJlcyBhcmUgZGV0ZWN0ZWQgb25seSBpbiB0aGlzIGNhc2UpLgorLmJyCitMb2dpY2FsIHZvbHVtZSBpcyBub3Qgd2lwZWQgaWYgdGhlIHJlYWQgb25seSBmbGFnIGlzIHNldC4KKy4KKy5IUAorLkJSIFwtWiB8IFwtXC16ZXJvCisuUkIgeyB5IHwgbiB9CisuYnIKK0NvbnRyb2xzIHplcm9pbmcgb2YgdGhlIGZpcnN0IDRLaUIgb2YgZGF0YSBpbiB0aGUgbmV3IGxvZ2ljYWwgdm9sdW1lLgorRGVmYXVsdCBpcyBcZkJ5XGZQZXMuCitTbmFwc2hvdCBDT1cgdm9sdW1lcyBhcmUgYWx3YXlzIHplcm9lZC4KK0xvZ2ljYWwgdm9sdW1lIGlzIG5vdCB6ZXJvZWQgaWYgdGhlIHJlYWQgb25seSBmbGFnIGlzIHNldC4KKy5icgorV2FybmluZzogdHJ5aW5nIHRvIG1vdW50IGFuIHVuemVyb2VkIGxvZ2ljYWwgdm9sdW1lIGNhbiBjYXVzZSB0aGUgc3lzdGVtIHRvCitoYW5nLgorLgorLlNIIEV4YW1wbGVzCisuCitDcmVhdGVzIGEgc3RyaXBlZCBsb2dpY2FsIHZvbHVtZSB3aXRoIDMgc3RyaXBlcywgYSBzdHJpcGUgc2l6ZSBvZiA4S2lCCithbmQgYSBzaXplIG9mIDEwME1pQiBpbiB0aGUgdm9sdW1lIGdyb3VwIG5hbWVkIHZnMDAuCitUaGUgbG9naWNhbCB2b2x1bWUgbmFtZSB3aWxsIGJlIGNob3NlbiBieSBsdmNyZWF0ZToKKy5zcAorLkIgbHZjcmVhdGUgXC1pIDMgXC1JIDggXC1MIDEwME0gdmcwMAorCitDcmVhdGVzIGEgbWlycm9yIGxvZ2ljYWwgdm9sdW1lIHdpdGggMiBzaWRlcyB3aXRoIGEgdXNlYWJsZSBzaXplIG9mIDUwMCBNaUIuCitUaGlzIG9wZXJhdGlvbiB3b3VsZCByZXF1aXJlIDMgZGV2aWNlcyAob3Igb3B0aW9uCitcZkJcLVwtYWxsb2MgXCVhbnl3aGVyZVxmUCkgLSB0d28gZm9yIHRoZSBtaXJyb3IKK2RldmljZXMgYW5kIG9uZSBmb3IgdGhlIGRpc2sgbG9nOgorLnNwCisuQiBsdmNyZWF0ZSBcLW0xIFwtTCA1MDBNIHZnMDAKKworQ3JlYXRlcyBhIG1pcnJvciBsb2dpY2FsIHZvbHVtZSB3aXRoIDIgc2lkZXMgd2l0aCBhIHVzZWFibGUgc2l6ZSBvZiA1MDAgTWlCLgorVGhpcyBvcGVyYXRpb24gd291bGQgcmVxdWlyZSAyIGRldmljZXMgLSB0aGUgbG9nIGlzICJpbi1tZW1vcnkiOgorLnNwCisuQiBsdmNyZWF0ZSBcLW0xIFwtXC1taXJyb3Jsb2cgY29yZSBcLUwgNTAwTSB2ZzAwCisKK0NyZWF0ZXMgYSBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZSBuYW1lZCAidmcwMC9zbmFwIiB3aGljaCBoYXMgYWNjZXNzIHRvIHRoZQorY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIGxvZ2ljYWwgdm9sdW1lIG5hbWVkICJ2ZzAwL2x2b2wxIgorYXQgc25hcHNob3QgbG9naWNhbCB2b2x1bWUgY3JlYXRpb24gdGltZS4gSWYgdGhlIG9yaWdpbmFsIGxvZ2ljYWwgdm9sdW1lCitjb250YWlucyBhIGZpbGUgc3lzdGVtLCB5b3UgY2FuIG1vdW50IHRoZSBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZSBvbiBhbgorYXJiaXRyYXJ5IGRpcmVjdG9yeSBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlc3lzdGVtIHRvIHJ1bgorYSBiYWNrdXAgd2hpbGUgdGhlIG9yaWdpbmFsIGZpbGVzeXN0ZW0gY29udGludWVzIHRvIGdldCB1cGRhdGVkOgorLnNwCisuQiBsdmNyZWF0ZSBcLVwtc2l6ZSAxMDBtIFwtXC1zbmFwc2hvdCBcLVwtbmFtZSBzbmFwIC9kZXYvdmcwMC9sdm9sMQorCitDcmVhdGVzIGEgc25hcHNob3QgbG9naWNhbCB2b2x1bWUgbmFtZWQgInZnMDAvc25hcCIgd2l0aCBzaXplCitmb3Igb3ZlcndyaXRpbmcgMjAlIG9mIHRoZSBvcmlnaW5hbCBsb2dpY2FsIHZvbHVtZSBuYW1lZCAidmcwMC9sdm9sMSIuOgorLnNwCisuQiBsdmNyZWF0ZSBcLXMgXC1sIDIwJU9SSUdJTiBcLVwtbmFtZSBzbmFwIHZnMDAvbHZvbDEKKworQ3JlYXRlcyBhIHNwYXJzZSBkZXZpY2UgbmFtZWQgL2Rldi92ZzEvc3BhcnNlIG9mIHNpemUgMVRpQiB3aXRoIHNwYWNlIGZvciBqdXN0Cit1bmRlciAxMDBNaUIgb2YgYWN0dWFsIGRhdGEgb24gaXQ6Cisuc3AKKy5CIGx2Y3JlYXRlIFwtXC12aXJ0dWFsc2l6ZSAxVCBcLVwtc2l6ZSAxMDBNIFwtXC1zbmFwc2hvdCBcLVwtbmFtZSBzcGFyc2UgdmcxCisKK0NyZWF0ZXMgYSBsaW5lYXIgbG9naWNhbCB2b2x1bWUgInZnMDAvbHZvbDEiIHVzaW5nIHBoeXNpY2FsIGV4dGVudHMKKy9kZXYvc2RhOjBcLTcgYW5kIC9kZXYvc2RiOjBcLTcgZm9yIGFsbG9jYXRpb24gb2YgZXh0ZW50czoKKy5zcAorLkIgbHZjcmVhdGUgXC1MIDY0TSBcLW4gbHZvbDEgdmcwMCAvZGV2L3NkYTowXC03IC9kZXYvc2RiOjBcLTcKKworQ3JlYXRlcyBhIDVHaUIgUkFJRDUgbG9naWNhbCB2b2x1bWUgInZnMDAvbXlfbHYiLCB3aXRoIDMgc3RyaXBlcyAocGx1cworYSBwYXJpdHkgZHJpdmUgZm9yIGEgdG90YWwgb2YgNCBkZXZpY2VzKSBhbmQgYSBzdHJpcGVzaXplIG9mIDY0S2lCOgorLnNwCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSByYWlkNSBcLUwgNUcgXC1pIDMgXC1JIDY0IFwtbiBteV9sdiB2ZzAwCisKK0NyZWF0ZXMgYSBSQUlENSBsb2dpY2FsIHZvbHVtZSAidmcwMC9teV9sdiIsIHVzaW5nIGFsbCBvZiB0aGUgZnJlZQorc3BhY2UgaW4gdGhlIFZHIGFuZCBzcGFubmluZyBhbGwgdGhlIFBWcyBpbiB0aGUgVkcgKG5vdGUgdGhhdCB0aGUgY29tbWFuZAord2lsbCBmYWlsIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIDggUFZzIGluIHRoZSBWRyBpbiB3aGljaCBjYXNlIFxmQlwtaSA3XGZQCitoYXMgdG8gYmUgdXNlZCB0byBnZXQgdG8gdGhlIGN1cnJlbnRseSBwb3NzaWJsZSBtYXhpbXVtIG9mCis4IGRldmljZXMgaW5jbHVkaW5nIHBhcml0eSBmb3IgUmFpZExWcyk6Cisuc3AKKy5CIGx2Y3JlYXRlIFwtXC1jb25maWcgYWxsb2NhdGlvbi9yYWlkX3N0cmlwZV9hbGxfZGV2aWNlcz0xIFwtXC10eXBlIHJhaWQ1IFwtbCAxMDAlRlJFRSBcLW4gbXlfbHYgdmcwMAorCitDcmVhdGVzIGEgNUdpQiBSQUlEMTAgbG9naWNhbCB2b2x1bWUgInZnMDAvbXlfbHYiLCB3aXRoIDIgc3RyaXBlcyBvbgorMiAyLXdheSBtaXJyb3JzLiAgTm90ZSB0aGF0IHRoZSBcZkItaVxmUCBhbmQgXGZCLW1cZlAgYXJndW1lbnRzIGJlaGF2ZQorZGlmZmVyZW50bHkuCitUaGUgXGZCLWlcZlAgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RyaXBlcy4KK1RoZSBcZkItbVxmUCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorLkIgYWRkaXRpb25hbAorY29waWVzOgorLnNwCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSByYWlkMTAgXC1MIDVHIFwtaSAyIFwtbSAxIFwtbiBteV9sdiB2ZzAwCisKK0NyZWF0ZXMgMTAwTWlCIHBvb2wgbG9naWNhbCB2b2x1bWUgZm9yIHRoaW4gcHJvdmlzaW9uaW5nCitidWlsZCB3aXRoIDIgc3RyaXBlcyA2NEtpQiBhbmQgY2h1bmsgc2l6ZSAyNTZLaUIgdG9nZXRoZXIgd2l0aAorMVRpQiB0aGluIHByb3Zpc2lvbmVkIGxvZ2ljYWwgdm9sdW1lICJ2ZzAwL3RoaW5fbHYiOgorLnNwCisuQiBsdmNyZWF0ZSBcLWkgMiBcLUkgNjQgXC1jIDI1NiBcLUwxMDBNIFwtVCB2ZzAwL3Bvb2wgXC1WIDFUIFwtXC1uYW1lIHRoaW5fbHYKKworQ3JlYXRlcyBhIHRoaW4gc25hcHNob3Qgdm9sdW1lICJ0aGluc25hcCIgb2YgdGhpbiB2b2x1bWUgInRoaW52b2wiIHRoYXQKK3dpbGwgc2hhcmUgdGhlIHNhbWUgYmxvY2tzIHdpdGhpbiB0aGUgdGhpbiBwb29sLgorTm90ZTogdGhlIHNpemUgTVVTVCBOT1QgYmUgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG5vbi10aGluIHNuYXBzaG90CitpcyBjcmVhdGVkIGluc3RlYWQ6Cisuc3AKKy5CIGx2Y3JlYXRlIFwtcyB2ZzAwL3RoaW52b2wgXC1cLW5hbWUgdGhpbnNuYXAKKworQ3JlYXRlcyBhIHRoaW4gc25hcHNob3Qgdm9sdW1lIG9mIHJlYWQtb25seSBpbmFjdGl2ZSB2b2x1bWUgIm9yaWdpbiIKK3doaWNoIHRoZW4gYmVjb21lcyB0aGUgdGhpbiBleHRlcm5hbCBvcmlnaW4gZm9yIHRoZSB0aGluIHNuYXBzaG90IHZvbHVtZQoraW4gdmcwMCB0aGF0IHdpbGwgdXNlIGFuIGV4aXN0aW5nIHRoaW4gcG9vbCAidmcwMC9wb29sIjoKKy5zcAorLkIgbHZjcmVhdGUgXC1zIFwtXC10aGlucG9vbCB2ZzAwL3Bvb2wgIG9yaWdpbgorCitDcmVhdGUgYSBjYWNoZSBwb29sIExWIHRoYXQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gY2FjaGUgb25lCitsb2dpY2FsIHZvbHVtZS4KKy5zcAorLkIgbHZjcmVhdGUgXC1cLXR5cGUgY2FjaGUtcG9vbCBcLUwgMUcgXC1uIG15X2x2X2NhY2hlcG9vbCB2ZyAvZGV2L2Zhc3QxCisKK0lmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGNhY2hlIHBvb2wgTFYsIGNyZWF0ZSB0aGUgbGFyZ2Ugc2xvdworZGV2aWNlIChpLmUuIHRoZSBvcmlnaW4gTFYpIGFuZCBsaW5rIGl0IHRvIHRoZSBzdXBwbGllZCBjYWNoZSBwb29sIExWLAorY3JlYXRpbmcgYSBjYWNoZSBMVi4KKy5zcAorLkIgbHZjcmVhdGUgXC1cLWNhY2hlIFwtTCAxMDBHIFwtbiBteV9sdiB2Zy9teV9sdl9jYWNoZXBvb2wgL2Rldi9zbG93MQorCitJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBsb2dpY2FsIHZvbHVtZSwgY3JlYXRlIHRoZSBzbWFsbCBhbmQgZmFzdAorY2FjaGUgcG9vbCBMViBhbmQgbGluayBpdCB0byB0aGUgc3VwcGxpZWQgZXhpc3RpbmcgbG9naWNhbAordm9sdW1lIChpLmUuIHRoZSBvcmlnaW4gTFYpLCBjcmVhdGluZyBhIGNhY2hlIExWLgorLnNwCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSBjYWNoZSBcLUwgMUcgXC1uIG15X2x2X2NhY2hlcG9vbCB2Zy9teV9sdiAvZGV2L2Zhc3QxCisKKy5cIiBDcmVhdGUgYSAxRyBjYWNoZWQgTFYgImx2b2wxIiB3aXRoICAxME0gY2FjaGUgcG9vbCAidmcwMC9wb29sIi4KKy5cIiAuc3AKKy5cIiAuQiBsdmNyZWF0ZSBcLVwtY2FjaGUgXC1MIDFHIFwtbiBsdiBcLVwtcG9vbGRhdGFzaXplIDEwTSB2ZzAwL3Bvb2wKKy4KKy5TSCBTRUUgQUxTTworLgorLm5oCisuQlIgbHZtICg4KSwKKy5CUiBsdm0uY29uZiAoNSksCisuQlIgbHZtY2FjaGUgKDcpLAorLkJSIGx2bXRoaW4gKDcpLAorLkJSIGx2Y29udmVydCAoOCksCisuQlIgbHZjaGFuZ2UgKDgpLAorLkJSIGx2ZXh0ZW5kICg4KSwKKy5CUiBsdnJlZHVjZSAoOCksCisuQlIgbHZyZW1vdmUgKDgpLAorLkJSIGx2cmVuYW1lICg4KQorLkJSIGx2cyAoOCksCisuQlIgbHZzY2FuICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCksCisuQlIgYmxraWQgKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZkaXNwbGF5LjguaW4gYi9tYW4vbHZkaXNwbGF5LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNzgwOQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdmRpc3BsYXkuOC5pbgpAQCAtMCwwICsxLDEzNCBAQAorLlRIIExWRElTUExBWSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK2x2ZGlzcGxheSBcKGVtIGRpc3BsYXkgYXR0cmlidXRlcyBvZiBhIGxvZ2ljYWwgdm9sdW1lCisuU0ggU1lOT1BTSVMKKy5CIGx2ZGlzcGxheQorLlJCIFsgXC1hIHwgXC1cLWFsbCBdCisuUkIgWyBcLWMgfCBcLVwtY29sb24gXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZSBdCisuUkIgWyBcLVwtaWdub3Jlc2tpcHBlZGNsdXN0ZXIgXQorLlJCIFsgXC1cLW1hcHMgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLklSIFNlbGVjdGlvbiBdCisuUkIgWyBcLVwtdW5pdHMKKy5JUiBoSGJCc1NrS21NZ0d0VHBQZUUgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb24gXQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIHwgTG9naWNhbFZvbHVtZSB7IE5hbWUgfCBQYXRoIH1cIC4uLl0KKy5icgorCisuQiBsdmRpc3BsYXkKKy5CUiBcLUMgfCBcLVwtY29sdW1ucworLlJCIFsgXC1cLWFsaWduZWQgXQorLlJCIFsgXC1cLWJpbmFyeSBdCisuUkIgWyBcLWEgfCBcLVwtYWxsIF0KKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbWyBcLVwtY29uZmlncmVwb3J0CisuSVIgUmVwb3J0TmFtZSBdCisuUkIgWyBcLW8gfCBcLVwtb3B0aW9ucworLlJJIFsgKyB8IFwtIHwgIyBdIEZpZWxkMSBbLCBGaWVsZDIgLi4uXQorLlJCIFsgXC1PIHwgXC1cLXNvcnQKKy5SSSBbICsgfCBcLSBdIEtleTEgWywgS2V5MiAuLi5dXQorLlJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLklSIFNlbGVjdGlvbiBdCisuUkIgLi4uXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZSBdCisuUkIgWyBcLVwtaWdub3Jlc2tpcHBlZGNsdXN0ZXIgXQorLlJCIFsgXC1cLWxvZ29ubHkgXQorLlJCIFsgXC1cLW5vaGVhZGluZ3MgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXNlZ21lbnRzIF0KKy5SQiBbIFwtXC1zZXBhcmF0b3IKKy5JUiBTZXBhcmF0b3IgXQorLlJCIFsgXC1cLXVuYnVmZmVyZWQgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SSSBbIFZvbHVtZUdyb3VwTmFtZSB8IExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9XCAuLi5dCisuU0ggREVTQ1JJUFRJT04KK2x2ZGlzcGxheSBhbGxvd3MgeW91IHRvIHNlZSB0aGUgYXR0cmlidXRlcyBvZiBhIGxvZ2ljYWwgdm9sdW1lCitsaWtlIHNpemUsIHJlYWQvd3JpdGUgc3RhdHVzLCBzbmFwc2hvdCBpbmZvcm1hdGlvbiBldGMuCisuUAorXGZCbHZzXGZQKDgpIGlzIGFuIGFsdGVybmF0aXZlIHRoYXQgcHJvdmlkZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24KK2luIHRoZSBzdHlsZSBvZiBcZkJwc1xmUCgxKS4KK1xmQmx2c1xmUCg4KSBpcyByZWNvbW1lbmRlZCBvdmVyIFxmQmx2ZGlzcGxheVxmUC4KKworLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zIGFuZCBcZkJsdnNcZlAgZm9yIG9wdGlvbnMgZ2l2ZW4gd2l0aAorXGZCXC1cLWNvbHVtbnNcZlAuCisuVFAKKy5CIFwtXC1hbGwKK0luY2x1ZGUgaW5mb3JtYXRpb24gaW4gdGhlIG91dHB1dCBhYm91dCBpbnRlcm5hbCBMb2dpY2FsIFZvbHVtZXMgdGhhdAorYXJlIGNvbXBvbmVudHMgb2Ygbm9ybWFsbHktYWNjZXNzaWJsZSBMb2dpY2FsIFZvbHVtZXMsIHN1Y2ggYXMgbWlycm9ycywKK2J1dCB3aGljaCBhcmUgbm90IGluZGVwZW5kZW50bHkgYWNjZXNzaWJsZSAoZS5nLiBub3QgbW91bnRhYmxlKS4KK0ZvciBleGFtcGxlLCBhZnRlciBjcmVhdGluZyBhIG1pcnJvciB1c2luZworXGZCbHZjcmVhdGUgXC1tMSBcLVwtbWlycm9ybG9nIGRpc2tcZlAsCit0aGlzIG9wdGlvbiB3aWxsIHJldmVhbCB0aHJlZSBpbnRlcm5hbCBMb2dpY2FsIFZvbHVtZXMsIHdpdGggc3VmZml4ZXMKK21pbWFnZV8wLCBtaW1hZ2VfMSwgYW5kIG1sb2cuCisuVFAKKy5CUiBcLUMgIiwgIiBcLVwtY29sdW1ucworRGlzcGxheSBvdXRwdXQgaW4gY29sdW1ucywgdGhlIGVxdWl2YWxlbnQgb2YgXGZCbHZzXGZQKDgpLgorT3B0aW9ucyBsaXN0ZWQgYXJlIHRoZSBzYW1lIGFzIG9wdGlvbnMgZ2l2ZW4gaW4gXGZCbHZzXGZQKDgpLgorLlRQCisuQlIgXC1jICIsICIgXC1cLWNvbG9uCitHZW5lcmF0ZSBjb2xvbiBzZXBhcmF0ZWQgb3V0cHV0IGZvciBlYXNpZXIgcGFyc2luZyBpbiBzY3JpcHRzIG9yIHByb2dyYW1zLgorTi5CLiBcZkJsdnNcZlAoOCkgcHJvdmlkZXMgY29uc2lkZXJhYmx5IG1vcmUgY29udHJvbCBvdmVyIHRoZSBvdXRwdXQuCisubmYKKworVGhlIHZhbHVlcyBhcmU6CisKK1woYnUgbG9naWNhbCB2b2x1bWUgbmFtZQorXChidSB2b2x1bWUgZ3JvdXAgbmFtZQorXChidSBsb2dpY2FsIHZvbHVtZSBhY2Nlc3MKK1woYnUgbG9naWNhbCB2b2x1bWUgc3RhdHVzCitcKGJ1IGludGVybmFsIGxvZ2ljYWwgdm9sdW1lIG51bWJlcgorXChidSBvcGVuIGNvdW50IG9mIGxvZ2ljYWwgdm9sdW1lCitcKGJ1IGxvZ2ljYWwgdm9sdW1lIHNpemUgaW4gc2VjdG9ycworXChidSBjdXJyZW50IGxvZ2ljYWwgZXh0ZW50cyBhc3NvY2lhdGVkIHRvIGxvZ2ljYWwgdm9sdW1lCitcKGJ1IGFsbG9jYXRlZCBsb2dpY2FsIGV4dGVudHMgb2YgbG9naWNhbCB2b2x1bWUKK1woYnUgYWxsb2NhdGlvbiBwb2xpY3kgb2YgbG9naWNhbCB2b2x1bWUKK1woYnUgcmVhZCBhaGVhZCBzZWN0b3JzIG9mIGxvZ2ljYWwgdm9sdW1lCitcKGJ1IG1ham9yIGRldmljZSBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWUKK1woYnUgbWlub3IgZGV2aWNlIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZQorCisuZmkKKy5UUAorLkJSIFwtbSAiLCAiIFwtXC1tYXBzCitEaXNwbGF5IHRoZSBtYXBwaW5nIG9mIGxvZ2ljYWwgZXh0ZW50cyB0byBwaHlzaWNhbCB2b2x1bWVzIGFuZAorcGh5c2ljYWwgZXh0ZW50cy4gIFRvIG1hcCBwaHlzaWNhbCBleHRlbnRzCit0byBsb2dpY2FsIGV4dGVudHMgdXNlOgorLkIgcHZzIFwtXC1zZWdtZW50cyBcLW8rbHZfbmFtZSxzZWdfc3RhcnRfcGUsc2VndHlwZQorLlNIIEV4YW1wbGVzCitTaG93cyBhdHRyaWJ1dGVzIG9mIHRoYXQgbG9naWNhbCB2b2x1bWUuIElmIHNuYXBzaG90Citsb2dpY2FsIHZvbHVtZXMgaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgb3JpZ2luYWwgbG9naWNhbCB2b2x1bWUsCit0aGlzIGNvbW1hbmQgc2hvd3MgYSBsaXN0IG9mIGFsbCBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZXMgYW5kIHRoZWlyCitzdGF0dXMgKGFjdGl2ZSBvciBpbmFjdGl2ZSkgYXMgd2VsbDoKKy5zcAorLkIgbHZkaXNwbGF5IFwtdiB2ZzAwL2x2b2wyCisKK1Nob3dzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgc25hcHNob3QgbG9naWNhbCB2b2x1bWUgYW5kIGFsc28gd2hpY2gKK29yaWdpbmFsIGxvZ2ljYWwgdm9sdW1lIGl0IGlzIGFzc29jaWF0ZWQgd2l0aDoKKy5zcAorLkIgbHZkaXNwbGF5IHZnMDAvc25hcHNob3QKKworLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiBsdmNyZWF0ZSAoOCksCisuQlIgbHZzICg4KSwKKy5CUiBsdnNjYW4gKDgpLAorLkJSIHB2cyAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdmV4dGVuZC44LmluIGIvbWFuL2x2ZXh0ZW5kLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmYmY3OQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdmV4dGVuZC44LmluCkBAIC0wLDAgKzEsMTM0IEBACisuVEggTFZFWFRFTkQgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitsdmV4dGVuZCBcKGVtIGV4dGVuZCB0aGUgc2l6ZSBvZiBhIGxvZ2ljYWwgdm9sdW1lCisuU0ggU1lOT1BTSVMKKy5CIGx2ZXh0ZW5kCisuUkIgWyBcLVwtYWxsb2MKKy5JUiBBbGxvY2F0aW9uUG9saWN5IF0KKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLWkgfCBcLVwtc3RyaXBlcworLkkgU3RyaXBlcworLlJCIFsgXC1JIHwgXC1cLXN0cmlwZXNpemUKKy5JUiBTdHJpcGVTaXplIF1dCisuUkIgeyBcLWwgfCBcLVwtZXh0ZW50cworLlJJIFsgKyBdIExvZ2ljYWxFeHRlbnRzTnVtYmVyIFsgJSB7IFZHIHwgTFYgfCBQVlMgfCBGUkVFIHwgT1JJR0lOIH1dCit8CisuQlIgXC1MIHwgXC1cLXNpemUKKy5SSSBbICsgXSBMb2dpY2FsVm9sdW1lU2l6ZSBbIGJCc1NrS21NZ0d0VHBQZUUgXX0KKy5SQiBbIFwtbiB8IFwtXC1ub2ZzY2sgXQorLlJCIFsgXC1cLW5vdWRldnN5bmNdCisuUkIgWyBcLXIgfCBcLVwtcmVzaXplZnMgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLVwtdXNlXC1wb2xpY2llcyBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuSSBMb2dpY2FsVm9sdW1lUGF0aAorLlJJIFsgUGh5c2ljYWxWb2x1bWVQYXRoIFsgOlBFIFsgXC1QRSBdXS4uLl0KKy5TSCBERVNDUklQVElPTgorbHZleHRlbmQgYWxsb3dzIHlvdSB0byBleHRlbmQgdGhlIHNpemUgb2YgYSBsb2dpY2FsIHZvbHVtZS4KK0V4dGVuc2lvbiBvZiBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZXMgKHNlZQorLkJSIGx2Y3JlYXRlICg4KQorZm9yIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBzbmFwc2hvdHMpIGlzIHN1cHBvcnRlZCBhcyB3ZWxsLgorQnV0IHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNvcGllcyBpbiBhIG1pcnJvcmVkIGxvZ2ljYWwKK3ZvbHVtZSB1c2UKKy5CUiBsdmNvbnZlcnQgKDgpLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1mICIsICIgXC1cLWZvcmNlCitQcm9jZWVkIHdpdGggc2l6ZSBleHRlbnNpb24gd2l0aG91dCBwcm9tcHRpbmcuCisuVFAKKy5JUiBcZkJcLWwgIiwgIiBcZkJcLVwtZXh0ZW50cyAiIFsiICsgXSBMb2dpY2FsRXh0ZW50c051bWJlciBbICUgeyBWRyB8IExWIHwgUFZTIHwgRlJFRSB8IE9SSUdJTiB9XQorRXh0ZW5kIG9yIHNldCB0aGUgbG9naWNhbCB2b2x1bWUgc2l6ZSBpbiB1bml0cyBvZiBsb2dpY2FsIGV4dGVudHMuCitXaXRoIHRoZSAnXGZJK1xmUCcgc2lnbiB0aGUgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIGFjdHVhbCBzaXplCitvZiB0aGUgbG9naWNhbCB2b2x1bWUgYW5kIHdpdGhvdXQgaXQsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyBhbiBhYnNvbHV0ZSBvbmUuCitUaGUgdG90YWwgbnVtYmVyIG9mIHBoeXNpY2FsIGV4dGVudHMgYWxsb2NhdGVkIHdpbGwgYmUKK2dyZWF0ZXIgdGhhbiB0aGlzLCBmb3IgZXhhbXBsZSwgaWYgdGhlIHZvbHVtZSBpcyBtaXJyb3JlZC4KK1RoZSBudW1iZXIgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgc3BhY2UKK2luIHRoZSBWb2x1bWUgR3JvdXAgd2l0aCB0aGUgc3VmZml4IFxmSSVWR1xmUCwgcmVsYXRpdmUgdG8gdGhlIGV4aXN0aW5nCitzaXplIG9mIHRoZSBMb2dpY2FsIFZvbHVtZSB3aXRoIHRoZSBzdWZmaXggXGZJJUxWXGZQLCBvZiB0aGUgcmVtYWluaW5nCitmcmVlIHNwYWNlIGZvciB0aGUgc3BlY2lmaWVkIFBoeXNpY2FsVm9sdW1lKHMpIHdpdGggdGhlIHN1ZmZpeCBcZkklUFZTXGZQLAorYXMgYSBwZXJjZW50YWdlIG9mIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSBpbiB0aGUgVm9sdW1lIEdyb3VwCit3aXRoIHRoZSBzdWZmaXggXGZJJUZSRUVcZlAsIG9yIChmb3IgYSBzbmFwc2hvdCkgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbAorc3BhY2UgaW4gdGhlIE9yaWdpbiBMb2dpY2FsIFZvbHVtZSB3aXRoIHRoZSBzdWZmaXggXGZJJU9SSUdJTlxmUC4KK1RoZSByZXN1bHRpbmcgdmFsdWUgaXMgcm91bmRlZCB1cHdhcmQuCitOLkIuIEluIGEgZnV0dXJlIHJlbGVhc2UsIHdoZW4gZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSB3aXRoIFBWUywgVkcgb3IgRlJFRSwKK3RoZSBudW1iZXIgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFwcHJveGltYXRlIHVwcGVyIGxpbWl0IGZvciB0aGUgdG90YWwgbnVtYmVyCitvZiBwaHlzaWNhbCBleHRlbnRzIHRvIGJlIGFsbG9jYXRlZCAoaW5jbHVkaW5nIGV4dGVudHMgdXNlZCBieSBhbnkgbWlycm9ycywgZm9yCitleGFtcGxlKS4gIFRoZSBjb2RlIG1heSBjdXJyZW50bHkgYWxsb2NhdGUgbW9yZSBzcGFjZSB0aGFuIHlvdSBtaWdodCBvdGhlcndpc2UKK2V4cGVjdC4KKy5UUAorLklSIFxmQlwtTCAiLCAiIFxmQlwtXC1zaXplICIgWyIgKyBdIExvZ2ljYWxWb2x1bWVTaXplIFsgYkJzU2tLbU1nR3RUcFBlRSBdCitFeHRlbmQgb3Igc2V0IHRoZSBsb2dpY2FsIHZvbHVtZSBzaXplIGluIHVuaXRzIG9mIG1lZ2FieXRlcy4KK0Egc2l6ZSBzdWZmaXggb2YgTSBmb3IgbWVnYWJ5dGVzLAorRyBmb3IgZ2lnYWJ5dGVzLCBUIGZvciB0ZXJhYnl0ZXMsIFAgZm9yIHBldGFieXRlcworb3IgRSBmb3IgZXhhYnl0ZXMgaXMgb3B0aW9uYWwuCitXaXRoIHRoZSArIHNpZ24gdGhlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBhY3R1YWwgc2l6ZQorb2YgdGhlIGxvZ2ljYWwgdm9sdW1lIGFuZCB3aXRob3V0IGl0LCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgYW4gYWJzb2x1dGUgb25lLgorLlRQCisuQlIgXC1pICIsICIgXC1cLXN0cmlwZXMgIiAiIFxmSVN0cmlwZXMKK0dpdmVzIHRoZSBudW1iZXIgb2Ygc3RyaXBlcyBmb3IgdGhlIGV4dGVuc2lvbi4KK05vdCBhcHBsaWNhYmxlIHRvIExWcyB1c2luZyB0aGUgb3JpZ2luYWwgbWV0YWRhdGEgTFZNIGZvcm1hdCwgd2hpY2ggbXVzdAordXNlIGEgc2luZ2xlIHZhbHVlIHRocm91Z2hvdXQuCisuVFAKKy5CUiBcLUkgIiwgIiBcLVwtc3RyaXBlc2l6ZSAiICIgXGZJU3RyaXBlU2l6ZQorR2l2ZXMgdGhlIG51bWJlciBvZiBraWxvYnl0ZXMgZm9yIHRoZSBncmFudWxhcml0eSBvZiB0aGUgc3RyaXBlcy4KK05vdCBhcHBsaWNhYmxlIHRvIExWcyB1c2luZyB0aGUgb3JpZ2luYWwgbWV0YWRhdGEgTFZNIGZvcm1hdCwgd2hpY2ggbXVzdAordXNlIGEgc2luZ2xlIHZhbHVlIHRocm91Z2hvdXQuCisuYnIKK1N0cmlwZVNpemUgbXVzdCBiZSAyXm4gKG4gPSAyIHRvIDkpCisuVFAKKy5CUiBcLW4gIiwgIiBcLVwtbm9mc2NrCitEbyBub3QgcGVyZm9ybSBmc2NrIGJlZm9yZSBleHRlbmRpbmcgZmlsZXN5c3RlbSB3aGVuIGZpbGVzeXN0ZW0KK3JlcXVpcmVzIGl0LiBZb3UgbWF5IG5lZWQgdG8gdXNlIFxmQlwtXC1mb3JjZVxmUiB0byBwcm9jZWVkIHdpdGgKK3RoaXMgb3B0aW9uLgorLlRQCisuQiBcLVwtbm91ZGV2c3luYworRGlzYWJsZSB1ZGV2IHN5bmNocm9uaXNhdGlvbi4gVGhlCitwcm9jZXNzIHdpbGwgbm90IHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBmcm9tIHVkZXYuCitJdCB3aWxsIGNvbnRpbnVlIGlycmVzcGVjdGl2ZSBvZiBhbnkgcG9zc2libGUgdWRldiBwcm9jZXNzaW5nCitpbiB0aGUgYmFja2dyb3VuZC4gIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyBpZiB1ZGV2IGlzIG5vdCBydW5uaW5nCitvciBoYXMgcnVsZXMgdGhhdCBpZ25vcmUgdGhlIGRldmljZXMgTFZNMiBjcmVhdGVzLgorLlRQCisuQlIgXC1yICIsICIgXC1cLXJlc2l6ZWZzCitSZXNpemUgdW5kZXJseWluZyBmaWxlc3lzdGVtIHRvZ2V0aGVyIHdpdGggdGhlIGxvZ2ljYWwgdm9sdW1lIHVzaW5nCitcZkJmc2FkbVxmUig4KS4KKy5UUAorLkIgXC1cLXVzZVwtcG9saWNpZXMKK1Jlc2l6ZXMgdGhlIGxvZ2ljYWwgdm9sdW1lIGFjY29yZGluZyB0byBjb25maWd1cmVkIHBvbGljeS4gU2VlCitcZkJsdm0uY29uZlxmUig1KSBmb3Igc29tZSBkZXRhaWxzLgorCisuU0ggRXhhbXBsZXMKK0V4dGVuZHMgdGhlIHNpemUgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lICJ2ZzAxL2x2b2wxMCIgYnkgNTRNaUIgb24gcGh5c2ljYWwKK3ZvbHVtZSAvZGV2L3NkazMuIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiAvZGV2L3NkazMgaXMgYSBtZW1iZXIgb2YKK3ZvbHVtZSBncm91cCB2ZzAxIGFuZCB0aGVyZSBhcmUgZW5vdWdoIGZyZWUgcGh5c2ljYWwgZXh0ZW50cyBpbiBpdDoKKy5zcAorLkIgbHZleHRlbmQgXC1MICs1NCAvZGV2L3ZnMDEvbHZvbDEwIC9kZXYvc2RrMworCitFeHRlbmRzIHRoZSBzaXplIG9mIGxvZ2ljYWwgdm9sdW1lICJ2ZzAxL2x2b2wwMSIgYnkgdGhlIGFtb3VudCBvZiBmcmVlCitzcGFjZSBvbiBwaHlzaWNhbCB2b2x1bWUgL2Rldi9zZGszLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZworIlwtbCArMTAwJVBWUyIgb24gdGhlIGNvbW1hbmQgbGluZToKKy5zcAorLkIgbHZleHRlbmQgL2Rldi92ZzAxL2x2b2wwMSAvZGV2L3NkazMKKworRXh0ZW5kcyBhIGxvZ2ljYWwgdm9sdW1lICJ2ZzAxL2x2b2wwMSIgYnkgMTZNaUIgdXNpbmcgcGh5c2ljYWwgZXh0ZW50cworL2Rldi9zZGE6OFwtOSBhbmQgL2Rldi9zZGI6OFwtOSBmb3IgYWxsb2NhdGlvbiBvZiBleHRlbnRzOgorLnNwCisuQiBsdmV4dGVuZCAtTCsxNk0gdmcwMS9sdm9sMDEgL2Rldi9zZGE6OFwtOSAvZGV2L3NkYjo4XC05CisKKy5TSCBTRUUgQUxTTworLkJSIGZzYWRtICg4KSwKKy5CUiBsdm0gKDgpLAorLkJSIGx2bS5jb25mICg1KSwKKy5CUiBsdmNyZWF0ZSAoOCksCisuQlIgbHZjb252ZXJ0ICg4KSwKKy5CUiBsdnJlZHVjZSAoOCksCisuQlIgbHZyZXNpemUgKDgpLAorLkJSIGx2Y2hhbmdlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2bS1jb25maWcuOC5pbiBiL21hbi9sdm0tY29uZmlnLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm0tY29uZmlnLjguaW4KQEAgLTAsMCArMSBAQAorLnNvIG1hbjgvbHZtY29uZmlnLjgKZGlmZiAtLWdpdCBhL21hbi9sdm0tZHVtcGNvbmZpZy44LmluIGIvbWFuL2x2bS1kdW1wY29uZmlnLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm0tZHVtcGNvbmZpZy44LmluCkBAIC0wLDAgKzEgQEAKKy5zbyBtYW44L2x2bWNvbmZpZy44CmRpZmYgLS1naXQgYS9tYW4vbHZtLWx2cG9sbC44LmluIGIvbWFuL2x2bS1sdnBvbGwuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZiZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bS1sdnBvbGwuOC5pbgpAQCAtMCwwICsxLDg5IEBACisuVEggIkxWUE9MTCIgIjgiICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCwgSW5jIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZwb2xsIFwoZW0gSW50ZXJuYWwgY29tbWFuZCB1c2VkIGJ5IGx2bXBvbGxkIHRvIGNvbXBsZXRlIHNvbWUgTG9naWNhbCBWb2x1bWUgb3BlcmF0aW9ucy4KKworLlNIIFNZTk9QU0lTCisuQiBsdm0gbHZwb2xsCisuQlIgXC1cLXBvbGxvcGVyYXRpb24KKy5SSSB7IHB2bW92ZSB8IGNvbnZlcnQgfCBtZXJnZSB8IG1lcmdlX3RoaW4gfQorLlJCIFsgXC1cLWFib3J0IF0KKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1oYW5kbGVtaXNzaW5ncHZzIF0KKy5SQiBbIFwtaSB8IFwtXC1pbnRlcnZhbAorLklSIFNlY29uZHMgXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb24gXQorLklSIExvZ2ljYWxWb2x1bWUgWyBQYXRoIF0KKy5TSCBERVNDUklQVElPTgorXGZCbHZwb2xsXGZQIGlzIGFuIGludGVybmFsIGNvbW1hbmQgdXNlZCBieSBcZkJsdm1wb2xsZFxmUCg4KSB0byBtb25pdG9yIGFuZAorY29tcGxldGUgXGZCbHZjb252ZXJ0XGZQKDgpIGFuZCBcZkJwdm1vdmVcZlAoOCkgb3BlcmF0aW9ucy4KK1xmQmx2cG9sbFxmUCBpdHNlbGYgZG9lcyBub3QgaW5pdGlhdGUgdGhlc2Ugb3BlcmF0aW9ucyBhbmQKK3lvdSBzaG91bGQgbmV2ZXIgbm9ybWFsbHkgbmVlZCB0byBpbnZva2UgaXQgZGlyZWN0bHkuCisKKy5JIExvZ2ljYWxWb2x1bWUKK1RoZSBMb2dpY2FsIFZvbHVtZSB1bmRlcmdvaW5nIGNvbnZlcnNpb24gb3IsIGluIHRoZSBjYXNlIG9mIHB2bW92ZSwgdGhlIG5hbWUgb2YKK3RoZSBpbnRlcm5hbCBwdm1vdmUgTG9naWNhbCBWb2x1bWUgKHNlZSBcZkJFWEFNUExFU1xmUCkuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLVwtcG9sbG9wZXJhdGlvbiAiIHsiIFxmSWNvbnZlcnQgfCBcZkltZXJnZSB8IFxmSW1lcmdlX3RoaW4gfCBcZklwdm1vdmUgfQorTWFuZGF0b3J5IG9wdGlvbi4KK1xmSXB2bW92ZVxmUCByZWZlcnMgdG8gYSBwdm1vdmUgb3BlcmF0aW9uIHRoYXQgaXMgbW92aW5nIGRhdGEuCitcZkljb252ZXJ0XGZQIHJlZmVycyB0byBhbiBvcGVyYXRpb24gdGhhdCBpcyBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgcmVkdW5kYW50IGNvcGllcyBvZiBkYXRhIG1haW50YWluZWQgYnkgYSBtaXJyb3IuCitcZkltZXJnZVxmUCBpbmRpY2F0ZXMgYSBtZXJnZSBvcGVyYXRpb24gdGhhdCBkb2Vzbid0IGludm9sdmUgdGhpbiB2b2x1bWVzLgorXGZJbWVyZ2VfdGhpblxmUCBpbmRpY2F0ZXMgYSBtZXJnZSBvcGVyYXRpb24gaW52b2x2aW5nIHRoaW4gc25hcHNob3RzLgorXGZCcHZtb3ZlXGZQKDgpIGFuZCBcZkJsdmNvbnZlcnRcZlAoOCkgZGVzY3JpYmUgaG93IHRvIGluaXRpYXRlIHRoZXNlIG9wZXJhdGlvbnMuCisuVFAKKy5CIFwtXC1hYm9ydAorQWJvcnQgcHZtb3ZlIGluIHByb2dyZXNzLiAgU2VlIFxmQnB2bW92ZVxmUCg4KS4KKy5UUAorLkIgXC1cLWhhbmRsZW1pc3NpbmdwdnMKK1VzZWQgd2hlbiB0aGUgcG9sbGluZyBvcGVyYXRpb24gbmVlZHMgdG8gaGFuZGxlIG1pc3NpbmcgUFZzIHRvIGJlIGFibGUgdG8KK2NvbnRpbnVlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBcZkJsdmNvbnZlcnRcZlAoOCkgaXMgcmVwYWlyaW5nIGEgbWlycm9yCit3aXRoIG9uZSBvciBtb3JlIGZhdWx0eSBkZXZpY2VzLgorLlRQCisuQlIgXC1pICIsICIgXC1cLWludGVydmFsICIgIlxmSVNlY29uZHMKK1JlcG9ydCBwcm9ncmVzcyBhdCByZWd1bGFyIGludGVydmFscworCisuU0ggRVhBTVBMRVMKK1Jlc3VtZSBwb2xsaW5nIG9mIGEgcHZtb3ZlIG9wZXJhdGlvbiBpZGVudGlmaWVkIGJ5IHRoZSBMb2dpY2FsIFZvbHVtZSB2ZzAwL3B2bW92ZTA6Cisuc3AKKy5CIGx2bSBsdnBvbGwgLS1wb2xsb3BlcmF0aW9uIHB2bW92ZSB2ZzAwL3B2bW92ZTAKKy5QCitBYm9ydCB0aGUgc2FtZSBwdm1vdmUgb3BlcmF0aW9uOgorLnNwCisuQiBsdm0gbHZwb2xsIC0tcG9sbG9wZXJhdGlvbiBwdm1vdmUgLS1hYm9ydCB2ZzAwL3B2bW92ZTAKKy5QCitUbyBmaW5kIG91dCB0aGUgbmFtZSBvZiB0aGUgcHZtb3ZlIExvZ2ljYWwgVm9sdW1lIHJlc3VsdGluZyBmcm9tIGFuIG9yaWdpbmFsCitcZkJwdm1vdmUgL2Rldi9zZGExXGZQIGNvbW1hbmQgeW91IG1heSB1c2UgdGhlIGZvbGxvd2luZyBcZkJsdnNcZlAgY29tbWFuZC4KKyhSZW1vdmUgdGhlIHBhcmVudGhlc2VzIGZyb20gdGhlIExWIG5hbWUuKQorLnNwCisuQiBsdnMgLWEgLVMgbW92ZV9wdj0vZGV2L3NkYTEKKy5QCitSZXN1bWUgcG9sbGluZyBvZiBtaXJyb3IgY29udmVyc2lvbiB2ZzAwL2x2bWlycm9yOgorLnNwCisuQiBsdm0gbHZwb2xsIC0tcG9sbG9wZXJhdGlvbiBjb252ZXJ0IHZnMDAvbHZtaXJyb3IKKy5QCitDb21wbGV0ZSBtaXJyb3IgcmVwYWlyOgorLnNwCisuQiBsdm0gbHZwb2xsIC0tcG9sbG9wZXJhdGlvbiBjb252ZXJ0IHZnL2RhbWFnZWRfbWlycm9yIC0taGFuZGxlbWlzc2luZ3B2cworLlAKK1Byb2Nlc3Mgc25hcHNob3QgbWVyZ2U6Cisuc3AKKy5CIGx2bSBsdnBvbGwgLS1wb2xsb3BlcmF0aW9uIG1lcmdlIHZnL3NuYXBzaG90X29sZAorLlAKK0ZpbmlzaCB0aGluIHNuYXBzaG90IG1lcmdlOgorLnNwCisuQiBsdm0gbHZwb2xsIC0tcG9sbG9wZXJhdGlvbiBtZXJnZV90aGluIHZnL3RoaW5fc25hcHNob3QKKy5TSCBTRUUgQUxTTworLkJSIGx2Y29udmVydCAoOCksCisuQlIgbHZtICg4KSwKKy5CUiBsdm1wb2xsZCAoOCksCisuQlIgbHZzICg4KSwKKy5CUiBwdm1vdmUgKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZtLjguaW4gYi9tYW4vbHZtLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxNTc4MwotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm0uOC5pbgpAQCAtMCwwICsxLDg2MSBAQAorLlRIIExWTSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLgorLlNIIE5BTUUKKy4KK2x2bSBcKGVtIExWTTIgdG9vbHMKKy4KKy5TSCBTWU5PUFNJUworLgorLkIgbHZtCisuUkkgWyBjb21tYW5kIHwgZmlsZSBdCisuCisuU0ggREVTQ1JJUFRJT04KKy4KK2x2bSBwcm92aWRlcyB0aGUgY29tbWFuZC1saW5lIHRvb2xzIGZvciBMVk0yLiAgQSBzZXBhcmF0ZQorbWFudWFsIHBhZ2UgZGVzY3JpYmVzIGVhY2ggY29tbWFuZCBpbiBkZXRhaWwuCisuUAorSWYgXGZCbHZtXGZQIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHMgaXQgcHJlc2VudHMgYSByZWFkbGluZSBwcm9tcHQKKyhhc3N1bWluZyBpdCB3YXMgY29tcGlsZWQgd2l0aCByZWFkbGluZSBzdXBwb3J0KS4KK0xWTSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBpbnRlcmFjdGl2ZWx5IGF0IHRoaXMgcHJvbXB0IHdpdGgKK3JlYWRsaW5lIGZhY2lsaXRpZXMgaW5jbHVkaW5nIGhpc3RvcnkgYW5kIGNvbW1hbmQgbmFtZSBhbmQgb3B0aW9uCitjb21wbGV0aW9uLiAgUmVmZXIgdG8gXGZCcmVhZGxpbmVcZlAoMykgZm9yIGRldGFpbHMuCisuUAorSWYgXGZCbHZtXGZQIGlzIGludm9rZWQgd2l0aCBhcmd2WzBdIHNldCB0byB0aGUgbmFtZSBvZiBhIHNwZWNpZmljCitMVk0gY29tbWFuZCAoZm9yIGV4YW1wbGUgYnkgdXNpbmcgYSBoYXJkIG9yIHNvZnQgbGluaykgaXQgYWN0cyBhcwordGhhdCBjb21tYW5kLgorLlAKK09uIGludm9jYXRpb24sIFxmQmx2bVxmUCByZXF1aXJlcyB0aGF0IG9ubHkgdGhlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMKK3N0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgYXZhaWxhYmxlLiAgSWYgb3RoZXJzIGFyZSBmb3VuZCwgdGhleQorZ2V0IGNsb3NlZCBhbmQgbWVzc2FnZXMgYXJlIGlzc3VlZCB3YXJuaW5nIGFib3V0IHRoZSBsZWFrLgorVGhpcyB3YXJuaW5nIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisuQiBMVk1fU1VQUFJFU1NfRkRfV0FSTklOR1NcZlAuCisuUAorV2hlcmUgY29tbWFuZHMgdGFrZSBWRyBvciBMViBuYW1lcyBhcyBhcmd1bWVudHMsIHRoZSBmdWxsIHBhdGggbmFtZSBpcworb3B0aW9uYWwuICBBbiBMViBjYWxsZWQgImx2b2wwIiBpbiBhIFZHIGNhbGxlZCAidmcwIiBjYW4gYmUgc3BlY2lmaWVkCithcyAidmcwL2x2b2wwIi4gIFdoZXJlIGEgbGlzdCBvZiBWR3MgaXMgcmVxdWlyZWQgYnV0IGlzIGxlZnQgZW1wdHksCithIGxpc3Qgb2YgYWxsIFZHcyB3aWxsIGJlIHN1YnN0aXR1dGVkLiAgV2hlcmUgYSBsaXN0IG9mIExWcyBpcyByZXF1aXJlZAorYnV0IGEgVkcgaXMgZ2l2ZW4sIGEgbGlzdCBvZiBhbGwgdGhlIExWcyBpbiB0aGF0IFZHIHdpbGwgYmUgc3Vic3RpdHV0ZWQuCitTbyBcZkJsdmRpc3BsYXkgdmcwXGZQIHdpbGwgZGlzcGxheSBhbGwgdGhlIExWcyBpbiAidmcwIi4KK1RhZ3MgY2FuIGFsc28gYmUgdXNlZCAtIHNlZSBcZkJcLVwtYWRkdGFnXGZQIGJlbG93LgorLlAKK09uZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgdGhlIGJ1aWx0LWluIHNoZWxsIGlzIHRoYXQgY29uZmlndXJhdGlvbgoraW5mb3JtYXRpb24gZ2V0cyBjYWNoZWQgaW50ZXJuYWxseSBiZXR3ZWVuIGNvbW1hbmRzLgorLlAKK0EgZmlsZSBjb250YWluaW5nIGEgc2ltcGxlIHNjcmlwdCB3aXRoIG9uZSBjb21tYW5kIHBlciBsaW5lCitjYW4gYWxzbyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhlIHNjcmlwdCBjYW4gYWxzbyBiZQorZXhlY3V0ZWQgZGlyZWN0bHkgaWYgdGhlIGZpcnN0IGxpbmUgaXMgIyEgZm9sbG93ZWQgYnkgdGhlIGFic29sdXRlCitwYXRoIG9mIFxmQmx2bVxmUC4KKy4KKy5TSCBCVUlMVC1JTiBDT01NQU5EUworLgorVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYnVpbHQgaW50byBsdm0gd2l0aG91dCBsaW5rcworbm9ybWFsbHkgYmVpbmcgY3JlYXRlZCBpbiB0aGUgZmlsZXN5c3RlbSBmb3IgdGhlbS4KKy5zcAorLlBEIDAKKy5UUCAxNAorLkIgY29uZmlnCitUaGUgc2FtZSBhcyBcZkJsdm1jb25maWdcZlAoOCkgYmVsb3cuCisuVFAKKy5CIGRldnR5cGVzCitEaXNwbGF5IHRoZSByZWNvZ25pc2VkIGJ1aWx0LWluIGJsb2NrIGRldmljZSB0eXBlcy4KKy5UUAorLkIgZHVtcGNvbmZpZworVGhlIHNhbWUgYXMgXGZCbHZtY29uZmlnXGZQKDgpIGJlbG93LgorLlRQCisuQiBmb3JtYXRzCitEaXNwbGF5IHJlY29nbmlzZWQgbWV0YWRhdGEgZm9ybWF0cy4KKy5UUAorLkIgaGVscAorRGlzcGxheSB0aGUgaGVscCB0ZXh0LgorLlRQCisuQiBsYXN0bG9nCitEaXNwbGF5IGxvZyByZXBvcnQgb2YgbGFzdCBjb21tYW5kIHJ1biBpbiBMVk0gc2hlbGwKK2lmIGNvbW1hbmQgbG9nIHJlcG9ydGluZyBpcyBlbmFibGVkLgorLlRQCisuQiBsdnBvbGwKK0NvbXBsZXRlIGx2bXBvbGxkIG9wZXJhdGlvbnMgKEludGVybmFsIGNvbW1hbmQpLgorLlRQCisuQiBwdmRhdGEKK05vdCBpbXBsZW1lbnRlZCBpbiBMVk0yLgorLlRQCisuQiBzZWd0eXBlcworRGlzcGxheSByZWNvZ25pc2VkIExvZ2ljYWwgVm9sdW1lIHNlZ21lbnQgdHlwZXMuCisuVFAKKy5CIHN5c3RlbWlkCitEaXNwbGF5IGFueSBzeXN0ZW0gSUQgY3VycmVudGx5IHNldCBvbiB0aGlzIGhvc3QuCisuVFAKKy5CIHRhZ3MKK0Rpc3BsYXkgYW55IHRhZ3MgZGVmaW5lZCBvbiB0aGlzIGhvc3QuCisuVFAKKy5CIHZlcnNpb24KK0Rpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKy5QRAorLgorLlNIIENPTU1BTkRTCisuCitUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGltcGxlbWVudCB0aGUgY29yZSBMVk0gZnVuY3Rpb25hbGl0eS4KKy5zcAorLlBEIDAKKy5UUCAxNAorLkIgcHZjaGFuZ2UKK0NoYW5nZSBhdHRyaWJ1dGVzIG9mIGEgUGh5c2ljYWwgVm9sdW1lLgorLlRQCisuQiBwdmNrCitDaGVjayBQaHlzaWNhbCBWb2x1bWUgbWV0YWRhdGEuCisuVFAKKy5CIHB2Y3JlYXRlCitJbml0aWFsaXplIGEgZGlzayBvciBwYXJ0aXRpb24gZm9yIHVzZSBieSBMVk0uCisuVFAKKy5CIHB2ZGlzcGxheQorRGlzcGxheSBhdHRyaWJ1dGVzIG9mIGEgUGh5c2ljYWwgVm9sdW1lLgorLlRQCisuQiBwdm1vdmUKK01vdmUgUGh5c2ljYWwgRXh0ZW50cy4KKy5UUAorLkIgcHZyZW1vdmUKK1JlbW92ZSBhIFBoeXNpY2FsIFZvbHVtZS4KKy5UUAorLkIgcHZyZXNpemUKK1Jlc2l6ZSBhIGRpc2sgb3IgcGFydGl0aW9uIGluIHVzZSBieSBMVk0yLgorLlRQCisuQiBwdnMKK1JlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBQaHlzaWNhbCBWb2x1bWVzLgorLlRQCisuQiBwdnNjYW4KK1NjYW4gYWxsIGRpc2tzIGZvciBQaHlzaWNhbCBWb2x1bWVzLgorLlRQCisuQiB2Z2NmZ2JhY2t1cAorQmFja3VwIFZvbHVtZSBHcm91cCBkZXNjcmlwdG9yIGFyZWEuCisuVFAKKy5CIHZnY2ZncmVzdG9yZQorUmVzdG9yZSBWb2x1bWUgR3JvdXAgZGVzY3JpcHRvciBhcmVhLgorLlRQCisuQiB2Z2NoYW5nZQorQ2hhbmdlIGF0dHJpYnV0ZXMgb2YgYSBWb2x1bWUgR3JvdXAuCisuVFAKKy5CIHZnY2sKK0NoZWNrIFZvbHVtZSBHcm91cCBtZXRhZGF0YS4KKy5UUAorLkIgdmdjb252ZXJ0CitDb252ZXJ0IFZvbHVtZSBHcm91cCBtZXRhZGF0YSBmb3JtYXQuCisuVFAKKy5CIHZnY3JlYXRlCitDcmVhdGUgYSBWb2x1bWUgR3JvdXAuCisuVFAKKy5CIHZnZGlzcGxheQorRGlzcGxheSBhdHRyaWJ1dGVzIG9mIFZvbHVtZSBHcm91cHMuCisuVFAKKy5CIHZnZXhwb3J0CitNYWtlIHZvbHVtZSBHcm91cHMgdW5rbm93biB0byB0aGUgc3lzdGVtLgorLlRQCisuQiB2Z2V4dGVuZAorQWRkIFBoeXNpY2FsIFZvbHVtZXMgdG8gYSBWb2x1bWUgR3JvdXAuCisuVFAKKy5CIHZnaW1wb3J0CitNYWtlIGV4cG9ydGVkIFZvbHVtZSBHcm91cHMga25vd24gdG8gdGhlIHN5c3RlbS4KKy5UUAorLkIgdmdpbXBvcnRjbG9uZQorSW1wb3J0IGFuZCByZW5hbWUgZHVwbGljYXRlZCBWb2x1bWUgR3JvdXAgKGUuZy4gYSBoYXJkd2FyZSBzbmFwc2hvdCkuCisuVFAKKy5CIHZnbWVyZ2UKK01lcmdlIHR3byBWb2x1bWUgR3JvdXBzLgorLlRQCisuQiB2Z21rbm9kZXMKK1JlY3JlYXRlIFZvbHVtZSBHcm91cCBkaXJlY3RvcnkgYW5kIExvZ2ljYWwgVm9sdW1lIHNwZWNpYWwgZmlsZXMKKy5UUAorLkIgdmdyZWR1Y2UKK1JlZHVjZSBhIFZvbHVtZSBHcm91cCBieSByZW1vdmluZyBvbmUgb3IgbW9yZSBQaHlzaWNhbCBWb2x1bWVzLgorLlRQCisuQiB2Z3JlbW92ZQorUmVtb3ZlIGEgVm9sdW1lIEdyb3VwLgorLlRQCisuQiB2Z3JlbmFtZQorUmVuYW1lIGEgVm9sdW1lIEdyb3VwLgorLlRQCisuQiB2Z3MKK1JlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBWb2x1bWUgR3JvdXBzLgorLlRQCisuQiB2Z3NjYW4KK1NjYW4gYWxsIGRpc2tzIGZvciBWb2x1bWUgR3JvdXBzIGFuZCByZWJ1aWxkIGNhY2hlcy4KKy5UUAorLkIgdmdzcGxpdAorU3BsaXQgYSBWb2x1bWUgR3JvdXAgaW50byB0d28sIG1vdmluZyBhbnkgbG9naWNhbAordm9sdW1lcyBmcm9tIG9uZSBWb2x1bWUgR3JvdXAgdG8gYW5vdGhlciBieSBtb3ZpbmcgZW50aXJlIFBoeXNpY2FsCitWb2x1bWVzLgorLlRQCisuQiBsdmNoYW5nZQorQ2hhbmdlIGF0dHJpYnV0ZXMgb2YgYSBMb2dpY2FsIFZvbHVtZS4KKy5UUAorLkIgbHZjb252ZXJ0CitDb252ZXJ0IGEgTG9naWNhbCBWb2x1bWUgZnJvbSBsaW5lYXIgdG8gbWlycm9yIG9yIHNuYXBzaG90LgorLlRQCisuQiBsdmNyZWF0ZQorQ3JlYXRlIGEgTG9naWNhbCBWb2x1bWUgaW4gYW4gZXhpc3RpbmcgVm9sdW1lIEdyb3VwLgorLlRQCisuQiBsdmRpc3BsYXkKK0Rpc3BsYXkgYXR0cmlidXRlcyBvZiBhIExvZ2ljYWwgVm9sdW1lLgorLlRQCisuQiBsdmV4dGVuZAorRXh0ZW5kIHRoZSBzaXplIG9mIGEgTG9naWNhbCBWb2x1bWUuCisuVFAKKy5CIGx2bWNoYW5nZQorQ2hhbmdlIGF0dHJpYnV0ZXMgb2YgdGhlIExvZ2ljYWwgVm9sdW1lIE1hbmFnZXIuCisuVFAKKy5CIGx2bWNvbmZpZworRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhZnRlcgorbG9hZGluZyBcZkJsdm0uY29uZlxmUCg1KSBhbmQgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisuVFAKKy5CIGx2bWRpc2tzY2FuCitTY2FuIGZvciBhbGwgZGV2aWNlcyB2aXNpYmxlIHRvIExWTTIuCisuVFAKKy5CIGx2bWR1bXAKK0NyZWF0ZSBsdm0yIGluZm9ybWF0aW9uIGR1bXBzIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorLlRQCisuQiBsdnJlZHVjZQorUmVkdWNlIHRoZSBzaXplIG9mIGEgTG9naWNhbCBWb2x1bWUuCisuVFAKKy5CIGx2cmVtb3ZlCitSZW1vdmUgYSBMb2dpY2FsIFZvbHVtZS4KKy5UUAorLkIgbHZyZW5hbWUKK1JlbmFtZSBhIExvZ2ljYWwgVm9sdW1lLgorLlRQCisuQiBsdnJlc2l6ZQorUmVzaXplIGEgTG9naWNhbCBWb2x1bWUuCisuVFAKKy5CIGx2cworUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IExvZ2ljYWwgVm9sdW1lcy4KKy5UUAorLkIgbHZzY2FuCitTY2FuIChhbGwgZGlza3MpIGZvciBMb2dpY2FsIFZvbHVtZXMuCisuUEQKKy5QCitUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBub3QgaW1wbGVtZW50ZWQgaW4gTFZNMiBidXQgbWlnaHQgYmUKK2luIHRoZSBmdXR1cmU6CisuQlIgbHZtc2FkYyAiLCAiIGx2bXNhciAiLCAiIHB2ZGF0YSAuCisuCisuU0ggT1BUSU9OUworLgorVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIG1hbnkgb2YgdGhlIGNvbW1hbmRzLgorVGhleSBhcmUgaW1wbGVtZW50ZWQgZ2VuZXJpY2FsbHkgYW5kIGRvY3VtZW50ZWQgaGVyZSByYXRoZXIKK3RoYW4gcmVwZWF0ZWQgb24gaW5kaXZpZHVhbCBtYW51YWwgcGFnZXMuCisuUAorQWRkaXRpb25hbCBoeXBoZW5zIHdpdGhpbiBvcHRpb24gbmFtZXMgYXJlIGlnbm9yZWQuICBGb3IgZXhhbXBsZSwKK1xmQlwtXC1yZWFkb25seVxmUCBhbmQgXGZCXC1cLXJlYWRcLW9ubHlcZlAgYXJlIGJvdGggYWNjZXB0ZWQuCisuCisuSFAKKy5CUiBcLWggfCBcLT8gfCBcLVwtaGVscAorLmJyCitEaXNwbGF5IHRoZSBoZWxwIHRleHQuCisuCisuSFAKKy5CUiBcLVwtdmVyc2lvbgorLmJyCitEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24uCisuCisuSFAKKy5CUiBcLXYgfCBcLVwtdmVyYm9zZQorLmJyCitTZXQgdmVyYm9zZSBsZXZlbC4gUmVwZWF0IGZyb20gMSB0byAzIHRpbWVzIHRvIGluY3JlYXNlIHRoZSBkZXRhaWwKK29mIG1lc3NhZ2VzIHNlbnQgdG8gc3Rkb3V0IGFuZCBzdGRlcnIuICBPdmVycmlkZXMgY29uZmlnIGZpbGUgc2V0dGluZy4KKy4KKy5IUAorLkJSIFwtZCB8IFwtXC1kZWJ1ZworLmJyCitTZXQgZGVidWcgbGV2ZWwuIFJlcGVhdCBmcm9tIDEgdG8gNiB0aW1lcyB0byBpbmNyZWFzZSB0aGUgZGV0YWlsIG9mCittZXNzYWdlcyBzZW50IHRvIHRoZSBsb2cgZmlsZSBhbmQvb3Igc3lzbG9nIChpZiBjb25maWd1cmVkKS4KK092ZXJyaWRlcyBjb25maWcgZmlsZSBzZXR0aW5nLgorLgorLkhQCisuQlIgXC1xIHwgXC1cLXF1aWV0CisuYnIKK1N1cHByZXNzIG91dHB1dCBhbmQgbG9nIG1lc3NhZ2VzLgorT3ZlcnJpZGVzIFxmQlwtZFxmUCBhbmQgXGZCXC12XGZQLgorUmVwZWF0IG9uY2UgdG8gYWxzbyBzdXBwcmVzcyBhbnkgcHJvbXB0cyB3aXRoIGFuc3dlciAnbm8nLgorLgorLkhQCisuQlIgXC1cLXllcworLmJyCitEb24ndCBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbiBpbnRlcmFjdGl2ZWx5IGJ1dCBpbnN0ZWFkIGFsd2F5cyBhc3N1bWUgdGhlCithbnN3ZXIgaXMgJ3llcycuICBUYWtlIGdyZWF0IGNhcmUgaWYgeW91IHVzZSB0aGlzIQorLgorLkhQCisuQlIgXC10IHwgXC1cLXRlc3QKKy5icgorUnVuIGluIHRlc3QgbW9kZS4gQ29tbWFuZHMgd2lsbCBub3QgdXBkYXRlIG1ldGFkYXRhLgorVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBkaXNhYmxpbmcgYWxsIG1ldGFkYXRhIHdyaXRpbmcgYnV0IG5ldmVydGhlbGVzcworcmV0dXJuaW5nIHN1Y2Nlc3MgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24uICBUaGlzIG1heSBsZWFkIHRvIHVudXN1YWwKK2Vycm9yIG1lc3NhZ2VzIGluIG11bHRpLXN0YWdlIG9wZXJhdGlvbnMgaWYgYSB0b29sIHJlbGllcyBvbiByZWFkaW5nCitiYWNrIG1ldGFkYXRhIGl0IGJlbGlldmVzIGhhcyBjaGFuZ2VkIGJ1dCBoYXNuJ3QuCisuCisuSFAKKy5CUiBcLVwtZHJpdmVybG9hZGVkCisuUkIgeyB5IHwgbiB9CisuYnIKK1doZXRoZXIgb3Igbm90IHRoZSBkZXZpY2UtbWFwcGVyIGtlcm5lbCBkcml2ZXIgaXMgbG9hZGVkLgorSWYgeW91IHNldCB0aGlzIHRvIFxmQm5cZlAsIG5vIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGNvbnRhY3QgdGhlIGRyaXZlci4KKy4KKy5IUAorLkJSIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkIgeyB5IHwgbiB9CisuYnIKK1doZXRoZXIgb3Igbm90IHRvIG1ldGFkYXRhIHNob3VsZCBiZSBiYWNrZWQgdXAgYXV0b21hdGljYWxseSBhZnRlciBhIGNoYW5nZS4KK1lvdSBhcmUgc3Ryb25nbHkgYWR2aXNlZCBub3QgdG8gZGlzYWJsZSB0aGlzIQorU2VlIFxmQnZnY2ZnYmFja3VwXGZQKDgpLgorLgorLkhQCisuQlIgXC1QIHwgXC1cLXBhcnRpYWwKKy5icgorV2hlbiBzZXQsIHRoZSB0b29scyB3aWxsIGRvIHRoZWlyIGJlc3QgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gVm9sdW1lIEdyb3VwcwordGhhdCBhcmUgb25seSBwYXJ0aWFsbHkgYXZhaWxhYmxlIChvbmUgb3IgbW9yZSBQaHlzaWNhbCBWb2x1bWVzIGJlbG9uZ2luZwordG8gdGhlIFZvbHVtZSBHcm91cCBhcmUgbWlzc2luZyBmcm9tIHRoZSBzeXN0ZW0pLiAgV2hlcmUgcGFydCBvZiBhIGxvZ2ljYWwKK3ZvbHVtZSBpcyBtaXNzaW5nLCBcZklcJS9kZXYvaW9lcnJvclxmUCB3aWxsIGJlIHN1YnN0aXR1dGVkLCBhbmQgeW91IGNvdWxkIHVzZQorXGZCZG1zZXR1cFxmUCg4KSB0byBzZXQgdGhpcyB1cCB0byByZXR1cm4gSS9PIGVycm9ycyB3aGVuIGFjY2Vzc2VkLAorb3IgY3JlYXRlIGl0IGFzIGEgbGFyZ2UgYmxvY2sgZGV2aWNlIG9mIG51bGxzLiAgTWV0YWRhdGEgbWF5IG5vdCBiZQorY2hhbmdlZCB3aXRoIHRoaXMgb3B0aW9uLiBUbyBpbnNlcnQgYSByZXBsYWNlbWVudCBQaHlzaWNhbCBWb2x1bWUKK29mIHRoZSBzYW1lIG9yIGxhcmdlIHNpemUgdXNlIFxmQnB2Y3JlYXRlIFwtdVxmUCB0byBzZXQgdGhlIHV1aWQgdG8KK21hdGNoIHRoZSBvcmlnaW5hbCBmb2xsb3dlZCBieSBcZkJ2Z2NmZ3Jlc3RvcmVcZlAoOCkuCisuCisuSFAKKy5CUiBcLVMgfCBcLVwtc2VsZWN0CisuSVIgU2VsZWN0aW9uCisuYnIKK0ZvciByZXBvcnRpbmcgY29tbWFuZHMsIGRpc3BsYXkgb25seSByb3dzIHRoYXQgbWF0Y2ggXGZJU2VsZWN0aW9uXGZQIGNyaXRlcmlhLgorQWxsIHJvd3MgYXJlIGRpc3BsYXllZCB3aXRoIHRoZSBhZGRpdGlvbmFsICJzZWxlY3RlZCIgY29sdW1uIChcZkItbyBzZWxlY3RlZFxmUCkKK3Nob3dpbmcgMSBpZiB0aGUgcm93IG1hdGNoZXMgdGhlIFxmSVNlbGVjdGlvblxmUCBhbmQgMCBvdGhlcndpc2UuIEZvciBub24tcmVwb3J0aW5nCitjb21tYW5kcyB3aGljaCBwcm9jZXNzIExWTSBlbnRpdGllcywgdGhlIHNlbGVjdGlvbiBjYW4gYmUgdXNlZCB0byBtYXRjaCBpdGVtcwordG8gcHJvY2Vzcy4gU2VlIFxmQlNFTEVDVElPTiBDUklURVJJQVxmUCBzZWN0aW9uIG9mIHRoaXMgbWFuIHBhZ2UgZm9yIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSB3YXkgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgY29uc3RydWN0ZWQuCisuCisuSFAKKy5CUiBcLU0gfCBcLVwtbWV0YWRhdGF0eXBlCisuSVIgVHlwZQorLmJyCitTcGVjaWZpZXMgd2hpY2ggXGZJdHlwZVxmUCBvZiBvbi1kaXNrIG1ldGFkYXRhIHRvIHVzZSwgc3VjaCBhcyBcZkJsdm0xXGZQCitvciBcZkJsdm0yXGZQLCB3aGljaCBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gXGZCMVxmUCBvciBcZkIyXGZQIHJlc3BlY3RpdmVseS4KK1RoZSBkZWZhdWx0IChcZkJsdm0yXGZQKSBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIFxmQmZvcm1hdFxmUAoraW4gdGhlIFxmQmdsb2JhbFxmUCBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBcZkJsdm0uY29uZlxmUCg1KS4KKy4KKy5IUAorLkJSIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZQorLmJyCitUaGlzIGxldHMgeW91IHByb2NlZWQgd2l0aCByZWFkLW9ubHkgbWV0YWRhdGEgb3BlcmF0aW9ucyBzdWNoIGFzCitcZkJsdmNoYW5nZSBcLWF5XGZQIGFuZCBcZkJ2Z2NoYW5nZSBcLWF5XGZQIGV2ZW4gaWYgdGhlIGxvY2tpbmcgbW9kdWxlIGZhaWxzLgorT25lIHVzZSBmb3IgdGhpcyBpcyBpbiBhIHN5c3RlbSBpbml0IHNjcmlwdCBpZiB0aGUgbG9jayBkaXJlY3RvcnkKK2lzIG1vdW50ZWQgcmVhZC1vbmx5IHdoZW4gdGhlIHNjcmlwdCBydW5zLgorLgorLkhQCisuQlIgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyCisuYnIKK1VzZSB0byBhdm9pZCBleGl0aW5nIHdpdGggYW4gbm9uLXplcm8gc3RhdHVzIGNvZGUgaWYgdGhlIGNvbW1hbmQgaXMgcnVuCit3aXRob3V0IGNsdXN0ZXJlZCBsb2NraW5nIGFuZCBzb21lIGNsdXN0ZXJlZCBWb2x1bWUgR3JvdXBzIGhhdmUgdG8gYmUKK3NraXBwZWQgb3Zlci4KKy4KKy5IUAorLkJSIFwtXC1yZWFkb25seQorLmJyCitSdW4gdGhlIGNvbW1hbmQgaW4gYSBzcGVjaWFsIHJlYWQtb25seSBtb2RlIHdoaWNoIHdpbGwgcmVhZCBvbi1kaXNrCittZXRhZGF0YSB3aXRob3V0IG5lZWRpbmcgdG8gdGFrZSBhbnkgbG9ja3MuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHBlZWsKK2luc2lkZSBtZXRhZGF0YSB1c2VkIGJ5IGEgdmlydHVhbCBtYWNoaW5lIGltYWdlIHdoaWxlIHRoZSB2aXJ0dWFsCittYWNoaW5lIGlzIHJ1bm5pbmcuCitJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHBlZWsgaW5zaWRlIHRoZSBtZXRhZGF0YSBvZiBjbHVzdGVyZWQgVm9sdW1lCitHcm91cHMgd2hlbiBjbHVzdGVyZWQgbG9ja2luZyBpcyBub3QgY29uZmlndXJlZCBvciBydW5uaW5nLiAgTm8gYXR0ZW1wdAord2lsbCBiZSBtYWRlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmljZS1tYXBwZXIga2VybmVsIGRyaXZlciwgc28KK3RoaXMgb3B0aW9uIGlzIHVuYWJsZSB0byByZXBvcnQgd2hldGhlciBvciBub3QgTG9naWNhbCBWb2x1bWVzIGFyZQorYWN0dWFsbHkgaW4gdXNlLgorLgorLkhQCisuQlIgXC1cLWZvcmVpZ24KKy5icgorQ2F1c2UgdGhlIGNvbW1hbmQgdG8gYWNjZXNzIGZvcmVpZ24gVkdzLCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBza2lwcGVkLgorSXQgY2FuIGJlIHVzZWQgdG8gcmVwb3J0IG9yIGRpc3BsYXkgYSBWRyB0aGF0IGlzIG93bmVkIGJ5IGFub3RoZXIgaG9zdC4KK1RoaXMgb3B0aW9uIGNhbiBjYXVzZSBhIGNvbW1hbmQgdG8gcGVyZm9ybSBwb29ybHkgYmVjYXVzZSBsdm1ldGFkIGNhY2hpbmcKK2lzIG5vdCB1c2VkIGFuZCBtZXRhZGF0YSBpcyByZWFkIGZyb20gZGlza3MuCisuCisuSFAKKy5CUiBcLVwtc2hhcmVkCisuYnIKK0NhdXNlIHRoZSBjb21tYW5kIHRvIGFjY2VzcyBzaGFyZWQgVkdzLCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBza2lwcGVkCit3aGVuIGx2bWxvY2tkIGlzIG5vdCBiZWluZyB1c2VkLiAgSXQgY2FuIGJlIHVzZWQgdG8gcmVwb3J0IG9yIGRpc3BsYXkgYQorbG9ja2QgVkcgd2l0aG91dCBsb2NraW5nLiBBcHBsaWNhYmxlIG9ubHkgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2QKK3N1cHBvcnQuCisuCisuSFAKKy5CUiBcLVwtYWRkdGFnCisuSVIgVGFnCisuYnIKK0FkZCB0aGUgdGFnIFxmSVRhZ1xmUCB0byBhIFBWLCBWRyBvciBMVi4KK1N1cHBseSB0aGlzIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzIHRvIGFkZCBtb3JlIHRoYW4gb25lIHRhZyBhdCBvbmNlLgorQSB0YWcgaXMgYSB3b3JkIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ3JvdXAgTFZNMiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUKK3RvZ2V0aGVyLgorVGFncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBpbiBwbGFjZSBvZiBQViwgVkcgb3IgTFYKK2FyZ3VtZW50cy4gIFRhZ3Mgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggQCB0byBhdm9pZCBhbWJpZ3VpdHkuCitFYWNoIHRhZyBpcyBleHBhbmRlZCBieSByZXBsYWNpbmcgaXQgd2l0aCBhbGwgb2JqZWN0cyBwb3NzZXNzaW5nCit0aGF0IHRhZyB3aGljaCBhcmUgb2YgdGhlIHR5cGUgZXhwZWN0ZWQgYnkgaXRzIHBvc2l0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuCitQVnMgY2FuIG9ubHkgcG9zc2VzcyB0YWdzIHdoaWxlIHRoZXkgYXJlIHBhcnQgb2YgYSBWb2x1bWUgR3JvdXA6CitQViB0YWdzIGFyZSBkaXNjYXJkZWQgaWYgdGhlIFBWIGlzIHJlbW92ZWQgZnJvbSB0aGUgVkcuCitBcyBhbiBleGFtcGxlLCB5b3UgY291bGQgdGFnIHNvbWUgTFZzIGFzIFxmQmRhdGFiYXNlXGZQIGFuZCBvdGhlcnMKK2FzIFxmQnVzZXJkYXRhXGZQIGFuZCB0aGVuIGFjdGl2YXRlIHRoZSBkYXRhYmFzZSBvbmVzCit3aXRoIFxmQmx2Y2hhbmdlIFwtYXkgQGRhdGFiYXNlXGZQLgorT2JqZWN0cyBjYW4gcG9zc2VzcyBtdWx0aXBsZSB0YWdzIHNpbXVsdGFuZW91c2x5LgorT25seSB0aGUgbmV3IExWTTIgbWV0YWRhdGEgZm9ybWF0IHN1cHBvcnRzIHRhZ2dpbmc6IG9iamVjdHMgdXNpbmcgdGhlCitMVk0xIG1ldGFkYXRhIGZvcm1hdCBjYW5ub3QgYmUgdGFnZ2VkIGJlY2F1c2UgdGhlIG9uLWRpc2sgZm9ybWF0IGRvZXMgbm90CitzdXBwb3J0IGl0LgorQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRhZ3MgYXJlOgorLkJSIEEgLSBaCisuQlIgYSAtIHoKKy5CUiAwIC0gOQorLkJSICJfICsgLiAtIgorYW5kIGFzIG9mIHZlcnNpb24gMi4wMi43OCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsc28gYWNjZXB0ZWQ6CisuQlIgIi8gPSAhIDogIyAmIiAuCisuCisuSFAKKy5CUiBcLVwtZGVsdGFnCisuSVIgVGFnCisuYnIKK0RlbGV0ZSB0aGUgdGFnIFxmSVRhZ1xmUCBmcm9tIGEgUFYsIFZHIG9yIExWLCBpZiBpdCdzIHByZXNlbnQuCitTdXBwbHkgdGhpcyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcyB0byByZW1vdmUgbW9yZSB0aGFuIG9uZSB0YWcgYXQgb25jZS4KKy4KKy5IUAorLkJSIFwtXC1hbGxvYworLlJCIHsgYW55d2hlcmUgfCBjb250aWd1b3VzIHwgY2xpbmcgfCBpbmhlcml0IHwgbm9ybWFsIH0KKy5icgorU2VsZWN0cyB0aGUgYWxsb2NhdGlvbiBwb2xpY3kgd2hlbiBhIGNvbW1hbmQgbmVlZHMgdG8gYWxsb2NhdGUKK1BoeXNpY2FsIEV4dGVudHMgZnJvbSB0aGUgVm9sdW1lIEdyb3VwLgorRWFjaCBWb2x1bWUgR3JvdXAgYW5kIExvZ2ljYWwgVm9sdW1lIGhhcyBhbiBhbGxvY2F0aW9uIHBvbGljeSBkZWZpbmVkLgorVGhlIGRlZmF1bHQgZm9yIGEgVm9sdW1lIEdyb3VwIGlzIFxmQm5vcm1hbFxmUCB3aGljaCBhcHBsaWVzCitjb21tb24tc2Vuc2UgcnVsZXMgc3VjaCBhcyBub3QgcGxhY2luZyBwYXJhbGxlbCBzdHJpcGVzIG9uIHRoZSBzYW1lCitQaHlzaWNhbCBWb2x1bWUuICBUaGUgZGVmYXVsdCBmb3IgYSBMb2dpY2FsIFZvbHVtZSBpcyBcZkJpbmhlcml0XGZQCit3aGljaCBhcHBsaWVzIHRoZSBzYW1lIHBvbGljeSBhcyBmb3IgdGhlIFZvbHVtZSBHcm91cC4gIFRoZXNlIHBvbGljaWVzIGNhbgorYmUgY2hhbmdlZCB1c2luZyBcZkJsdmNoYW5nZVxmUCg4KSBhbmQgXGZCdmdjaGFuZ2VcZlAoOCkgb3Igb3ZlcnJpZGRlbgorb24gdGhlIGNvbW1hbmQgbGluZSBvZiBhbnkgY29tbWFuZCB0aGF0IHBlcmZvcm1zIGFsbG9jYXRpb24uCitUaGUgXGZCY29udGlndW91c1xmUCBwb2xpY3kgcmVxdWlyZXMgdGhhdCBuZXcgUGh5c2ljYWwgRXh0ZW50cyBiZSBwbGFjZWQgYWRqYWNlbnQKK3RvIGV4aXN0aW5nIFBoeXNpY2FsIEV4dGVudHMuCitUaGUgXGZCY2xpbmdcZlAgcG9saWN5IHBsYWNlcyBuZXcgUGh5c2ljYWwgRXh0ZW50cyBvbiB0aGUgc2FtZSBQaHlzaWNhbAorVm9sdW1lIGFzIGV4aXN0aW5nIFBoeXNpY2FsIEV4dGVudHMgaW4gdGhlIHNhbWUgc3RyaXBlIG9mIHRoZSBMb2dpY2FsIFZvbHVtZS4KK0lmIHRoZXJlIGFyZSBzdWZmaWNpZW50IGZyZWUgUGh5c2ljYWwgRXh0ZW50cyB0byBzYXRpc2Z5CithbiBhbGxvY2F0aW9uIHJlcXVlc3QgYnV0IFxmQm5vcm1hbFxmUCBkb2Vzbid0IHVzZSB0aGVtLAorXGZCYW55d2hlcmVcZlAgd2lsbCAtIGV2ZW4gaWYgdGhhdCByZWR1Y2VzIHBlcmZvcm1hbmNlIGJ5CitwbGFjaW5nIHR3byBzdHJpcGVzIG9uIHRoZSBzYW1lIFBoeXNpY2FsIFZvbHVtZS4KKy4KKy5IUAorLkJSIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lCisuYnIKK1NlbGVjdHMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBwcm9maWxlIHRvIHVzZSB3aGVuIHByb2Nlc3NpbmcgYW4gTFZNIGNvbW1hbmQuCitTZWUgYWxzbyBcZkJsdm0uY29uZlxmUCg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBcZkJjb21tYW5kIHByb2ZpbGUgY29uZmlnXGZQIGFuZAordGhlIHdheSBpdCBmaXRzIHdpdGggb3RoZXIgTFZNIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy4gVXNpbmcgXGZCXC1cLWNvbW1hbmRwcm9maWxlXGZQCitvcHRpb24gb3ZlcnJpZGVzIGFueSBjb21tYW5kIHByb2ZpbGUgc3BlY2lmaWVkIHZpYSBcZkJMVk1fQ09NTUFORF9QUk9GSUxFXGZQCitlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy4KKy5IUAorLkJSIFwtXC1tZXRhZGF0YXByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZQorLmJyCitTZWxlY3RzIHRoZSBtZXRhZGF0YSBjb25maWd1cmF0aW9uIHByb2ZpbGUgdG8gdXNlIHdoZW4gcHJvY2Vzc2luZyBhbiBMVk0gY29tbWFuZC4KK1doZW4gdXNpbmcgbWV0YWRhdGEgcHJvZmlsZSBkdXJpbmcgVm9sdW1lIEdyb3VwIG9yIExvZ2ljYWwgVm9sdW1lIGNyZWF0aW9uLAordGhlIG1ldGFkYXRhIHByb2ZpbGUgbmFtZSBpcyBzYXZlZCBpbiBtZXRhZGF0YS4gV2hlbiBzdWNoIFZvbHVtZSBHcm91cCBvciBMb2dpY2FsCitWb2x1bWUgaXMgcHJvY2Vzc2VkIG5leHQgdGltZSwgdGhlIG1ldGFkYXRhIHByb2ZpbGUgaXMgYXV0b21hdGljYWxseSBhcHBsaWVkCithbmQgdGhlIHVzZSBvZiBcZkJcLVwtbWV0YWRhdGFwcm9maWxlXGZQIG9wdGlvbiBpcyBub3QgbmVjZXNzYXJ5LiBTZWUgYWxzbworXGZCbHZtLmNvbmZcZlAoNSkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgXGZCbWV0YWRhdGEgcHJvZmlsZSBjb25maWdcZlAgYW5kIHRoZQord2F5IGl0IGZpdHMgd2l0aCBvdGhlciBMVk0gY29uZmlndXJhdGlvbiBtZXRob2RzLgorLgorLkhQCisuQlIgXC1cLXByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZQorLmJyCitBIHNob3J0IGZvcm0gb2YgXGZCXC1cLW1ldGFkYXRhcHJvZmlsZVxmUCBmb3IgXGZCdmdjcmVhdGVcZlAsIFxmQmx2Y3JlYXRlXGZQLAorXGZCdmdjaGFuZ2VcZlAgYW5kIFxmQmx2Y2hhbmdlXGZQIGNvbW1hbmQgYW5kIGEgc2hvcnQgZm9ybSBvZiBcZkJcLVwtY29tbWFuZHByb2ZpbGVcZlAKK2ZvciBhbnkgb3RoZXIgY29tbWFuZCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIFxmQmx2bWNvbmZpZ1xmUCBjb21tYW5kIHdoZXJlIHRoZQorXGZCXC1cLXByb2ZpbGVcZlAgaGFzIHNwZWNpYWwgbWVhbmluZywgc2VlIFxmQmx2bWNvbmZpZ1xmUCg4KSBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisuCisuSFAKKy5CUiBcLVwtcmVwb3J0Zm9ybWF0CisuSVIge2Jhc2ljfGpzb259CisuYnIKK092ZXJyaWRlcyBjdXJyZW50IG91dHB1dCBmb3JtYXQgZm9yIHJlcG9ydHMgd2hpY2ggaXMgZGVmaW5lZCBnbG9iYWxseSBieQorXGZCcmVwb3J0L291dHB1dF9mb3JtYXRcZlAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGluIFxmQmx2bS5jb25mXGZQKDUpLgorVGhlIFxmQmJhc2ljXGZQIGZvcm1hdCBpcyB0aGUgb3JpZ2luYWwgZm9ybWF0IHdpdGggY29sdW1ucyBhbmQgcm93cyBhbmQKK2lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcmVwb3J0IHBlciBjb21tYW5kLCBlYWNoIHJlcG9ydCBpcyBwcmVmaXhlZAord2l0aCByZXBvcnQncyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbi4gVGhlIFxmQmpzb25cZlAgc3RhbmRzIGZvciByZXBvcnQKK291dHB1dCBpbiBKU09OIGZvcm1hdC4KKy5IUAorLkJSIFwtXC1jb25maWcKKy5JUiBDb25maWd1cmF0aW9uU3RyaW5nCisuYnIKK1VzZXMgdGhlIENvbmZpZ3VyYXRpb25TdHJpbmcgYXMgZGlyZWN0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbgordG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uIFRoZSBDb25maWd1cmF0aW9uU3RyaW5nIGlzIG9mIGV4YWN0bHkKK3RoZSBzYW1lIGZvcm1hdCBhcyB1c2VkIGluIGFueSBMVk0gY29uZmlndXJhdGlvbiBmaWxlLiBTZWUgXGZCbHZtLmNvbmZcZlAoNSkKK2ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFxmQmRpcmVjdCBjb25maWcgb3ZlcnJpZGUgb24gY29tbWFuZCBsaW5lXGZQIGFuZCB0aGUKK3dheSBpdCBmaXRzIHdpdGggb3RoZXIgTFZNIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy4KKy4KKy5TSCBWQUxJRCBOQU1FUworLgorVGhlIHZhbGlkIGNoYXJhY3RlcnMgZm9yIFZHIGFuZCBMViBuYW1lcyBhcmU6CisuQlIgYSAtIHoKKy5CUiBBIC0gWgorLkJSIDAgLSA5CisuQlIgIisgXyAuIC0iCisuUAorVkcgbmFtZXMgY2Fubm90IGJlZ2luIHdpdGggYSBoeXBoZW4uCitUaGUgbmFtZSBvZiBhIG5ldyBMViBhbHNvIGNhbm5vdCBiZWdpbiB3aXRoIGEgaHlwaGVuLiAgSG93ZXZlciwgaWYgdGhlCitjb25maWd1cmF0aW9uIHNldHRpbmcgXGZCbWV0YWRhdGEvcmVjb3JkX2x2c19oaXN0b3J5XGZQIGlzIGVuYWJsZWQgdGhlbiBhbiBMVgorbmFtZSB3aXRoIGEgaHlwaGVuIGFzIGEgcHJlZml4IGluZGljYXRlcyB0aGF0LCBhbHRob3VnaCB0aGUgTFYgd2FzCityZW1vdmVkLCBpdCBpcyBzdGlsbCBiZWluZyB0cmFja2VkIGJlY2F1c2UgaXQgZm9ybXMgcGFydCBvZiB0aGUgaGlzdG9yeSBvZiBhdAorbGVhc3Qgb25lIExWIHRoYXQgaXMgc3RpbGwgcHJlc2VudC4gIFRoaXMgaGVscHMgdG8gcmVjb3JkIHRoZSBhbmNlc3RyeSBvZgordGhpbiBzbmFwc2hvdHMgZXZlbiBhZnRlciBzb21lIGxpbmtzIGluIHRoZSBjaGFpbiBoYXZlIGJlZW4gcmVtb3ZlZC4KK0EgcmVmZXJlbmNlIHRvIHRoZSBoaXN0b3JpY2FsIExWICdsdm9sMScgaW4gVkcgJ3ZnMDAnIHdvdWxkIGJlICd2ZzAwLy1sdm9sMScKK29yIGp1c3QgJy1sdm9sMScgaWYgdGhlIFZHIGlzIGFscmVhZHkgc2V0LiAgKFRoZSBsYXR0ZXIgZm9ybSBtdXN0IGJlIHByZWNlZGVkCitieSAnLS0nIHRvIHRlcm1pbmF0ZSBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgYmVmb3JlIHJlYWNoaW5nIHRoaXMKK2FyZ3VtZW50LikKKy5QCitUaGVyZSBhcmUgYWxzbyB2YXJpb3VzIHJlc2VydmVkIG5hbWVzIHRoYXQgYXJlIHVzZWQgaW50ZXJuYWxseSBieSBsdm0gdGhhdCBjYW4KK25vdCBiZSB1c2VkIGFzIExWIG9yIFZHIG5hbWVzLiBBIFZHIGNhbm5vdCBiZSBjYWxsZWQgYW55dGhpbmcgdGhhdCBleGlzdHMgaW4KK1xmSS9kZXYvXGZQIGF0IHRoZSB0aW1lIG9mIGNyZWF0aW9uLCBub3IgY2FuIGl0IGJlIGNhbGxlZCAnLicgb3IgJy4uJy4KK0FuIExWIGNhbm5vdCBiZSBjYWxsZWQgJy4nLCAnLi4nLCAnc25hcHNob3QnIG9yICdwdm1vdmUnLgorVGhlIExWIG5hbWUgbWF5IGFsc28gbm90IGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKK1xmUidfY2RhdGEnLCAnX2NtZXRhJywgJ19jb3JpZycsICdfbWxvZycsICdfbWltYWdlJywgJ19wbXNwYXJlJywKK1xmUidfcmltYWdlJywgJ19ybWV0YScsICdfdGRhdGEnLCAnX3RtZXRhJyBvciAnX3ZvcmlnaW4nLgorQSBkaXJlY3RvcnkgYmVhcmluZyB0aGUgbmFtZSBvZiBlYWNoIFZvbHVtZSBHcm91cCBpcyBjcmVhdGVkIHVuZGVyCitcZkkvZGV2XGZQIHdoZW4gYW55IG9mIGl0cyBMb2dpY2FsIFZvbHVtZXMgYXJlIGFjdGl2YXRlZC4KK0VhY2ggYWN0aXZlIExvZ2ljYWwgVm9sdW1lIGlzIGFjY2Vzc2libGUgZnJvbSB0aGlzIGRpcmVjdG9yeSBhcyBhIHN5bWJvbGljCitsaW5rIGxlYWRpbmcgdG8gYSBkZXZpY2Ugbm9kZS4KK0xpbmtzIG9yIG5vZGVzIGluIFxmSS9kZXYvbWFwcGVyXGZQIGFyZSBpbnRlbmRlZCBvbmx5IGZvciBpbnRlcm5hbCB1c2UgYW5kCit0aGUgcHJlY2lzZSBmb3JtYXQgYW5kIGVzY2FwaW5nIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIGFuZCBkaXN0cmlidXRpb25zLgorT3RoZXIgc29mdHdhcmUgYW5kIHNjcmlwdHMgc2hvdWxkIHVzZSB0aGUKK1xmSS9kZXYvVm9sdW1lR3JvdXBOYW1lL0xvZ2ljYWxWb2x1bWVOYW1lXGZQIGZvcm1hdCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBuZWVkaW5nCithbWVuZG1lbnQgd2hlbiB0aGUgc29mdHdhcmUgaXMgdXBkYXRlZC4gIFNob3VsZCB5b3UgbmVlZCB0byBwcm9jZXNzIHRoZSBub2RlCituYW1lcyBpbiAvZGV2L21hcHBlciwgeW91IG1heSB1c2UgXGZCZG1zZXR1cCBzcGxpdG5hbWVcZlAgdG8gc2VwYXJhdGUgb3V0IHRoZQorb3JpZ2luYWwgVkcsIExWIGFuZCBpbnRlcm5hbCBsYXllciBuYW1lcy4KKy5QCisuCisuU0ggVU5JUVVFIE5BTUVTCisuCisKK1ZHIG5hbWVzIHNob3VsZCBiZSB1bmlxdWUuICB2Z2NyZWF0ZSB3aWxsIHByb2R1Y2UgYW4gZXJyb3IgaWYgdGhlCitzcGVjaWZpZWQgVkcgbmFtZSBtYXRjaGVzIGFuIGV4aXN0aW5nIFZHIG5hbWUuICBIb3dldmVyLCB0aGVyZSBhcmUgY2FzZXMKK3doZXJlIGRpZmZlcmVudCBWR3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGNhbiBhcHBlYXIgdG8gTFZNLCBlLmcuIGFmdGVyCittb3ZpbmcgZGlza3Mgb3IgY2hhbmdpbmcgZmlsdGVycy4KKworV2hlbiBWR3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0LCBjb21tYW5kcyBvcGVyYXRpbmcgb24gYWxsIFZHcyB3aWxsCitpbmNsdWRlIGFsbCBvZiB0aGUgVkdzIHdpdGggdGhlIHNhbWUgbmFtZS4gIElmIHRoZSBhbWJpZ3VvdXMgVkcgbmFtZSBpcworc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBjb21tYW5kIHdpbGwgcHJvZHVjZSBhbiBlcnJvci4gIFRoZQorZXJyb3Igc3RhdGVzIHRoYXQgbXVsdGlwbGUgVkdzIGV4aXN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAgVG8gcHJvY2Vzcworb25lIG9mIHRoZSBWR3Mgc3BlY2lmaWNhbGx5LCB0aGUgLS1zZWxlY3Qgb3B0aW9uIHNob3VsZCBiZSB1c2VkIHdpdGggdGhlCitVVUlEIG9mIHRoZSBpbnRlbmRlZCBWRzogJy0tc2VsZWN0IHZnX3V1aWQ9PHV1aWQ+Jy4KKworQW4gZXhjZXB0aW9uIGlzIGlmIGFsbCBidXQgb25lIG9mIHRoZSBWR3Mgd2l0aCB0aGUgc2hhcmVkIG5hbWUgaXMgZm9yZWlnbgorKHNlZQorLkJSIGx2bXN5c3RlbWlkICg3KS4pCitJbiB0aGlzIGNhc2UsIHRoZSBvbmUgVkcgdGhhdCBpcyBub3QgZm9yZWlnbiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBpbnRlbmRlZAorVkcgYW5kIGlzIHByb2Nlc3NlZC4KKy5QCitMViBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiBhIFZHLiAgVGhlIG5hbWUgb2YgYW4gaGlzdG9yaWNhbCBMViBjYW5ub3QgYmUKK3JldXNlZCB1bnRpbCB0aGUgaGlzdG9yaWNhbCBMViBoYXMgaXRzZWxmIGJlZW4gcmVtb3ZlZCBvciByZW5hbWVkLgorCisuCisuU0ggQUxMT0NBVElPTgorLgorV2hlbiBhbiBvcGVyYXRpb24gbmVlZHMgdG8gYWxsb2NhdGUgUGh5c2ljYWwgRXh0ZW50cyBmb3Igb25lIG9yIG1vcmUKK0xvZ2ljYWwgVm9sdW1lcywgdGhlIHRvb2xzIHByb2NlZWQgYXMgZm9sbG93czoKKworRmlyc3Qgb2YgYWxsLCB0aGV5IGdlbmVyYXRlIHRoZSBjb21wbGV0ZSBzZXQgb2YgdW5hbGxvY2F0ZWQgUGh5c2ljYWwgRXh0ZW50cworaW4gdGhlIFZvbHVtZSBHcm91cC4gIElmIGFueSByYW5nZXMgb2YgUGh5c2ljYWwgRXh0ZW50cyBhcmUgc3VwcGxpZWQgYXQKK3RoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgb25seSB1bmFsbG9jYXRlZCBQaHlzaWNhbCBFeHRlbnRzIHdpdGhpbgordGhvc2UgcmFuZ2VzIG9uIHRoZSBzcGVjaWZpZWQgUGh5c2ljYWwgVm9sdW1lcyBhcmUgY29uc2lkZXJlZC4KKworVGhlbiB0aGV5IHRyeSBlYWNoIGFsbG9jYXRpb24gcG9saWN5IGluIHR1cm4sIHN0YXJ0aW5nIHdpdGggdGhlIHN0cmljdGVzdAorcG9saWN5IChcZkJjb250aWd1b3VzXGZQKSBhbmQgZW5kaW5nIHdpdGggdGhlIGFsbG9jYXRpb24gcG9saWN5IHNwZWNpZmllZAordXNpbmcgXGZCXC1cLWFsbG9jXGZQIG9yIHNldCBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHBhcnRpY3VsYXIgTG9naWNhbAorVm9sdW1lIG9yIFZvbHVtZSBHcm91cCBjb25jZXJuZWQuICBGb3IgZWFjaCBwb2xpY3ksIHdvcmtpbmcgZnJvbSB0aGUKK2xvd2VzdC1udW1iZXJlZCBMb2dpY2FsIEV4dGVudCBvZiB0aGUgZW1wdHkgTG9naWNhbCBWb2x1bWUgc3BhY2UgdGhhdAorbmVlZHMgdG8gYmUgZmlsbGVkLCB0aGV5IGFsbG9jYXRlIGFzIG11Y2ggc3BhY2UgYXMgcG9zc2libGUgYWNjb3JkaW5nIHRvCit0aGUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgdGhlIHBvbGljeS4gIElmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLAordGhleSBtb3ZlIG9uIHRvIHRoZSBuZXh0IHBvbGljeS4KKworVGhlIHJlc3RyaWN0aW9ucyBhcmUgYXMgZm9sbG93czoKKworXGZCQ29udGlndW91c1xmUCByZXF1aXJlcyB0aGF0IHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiBhbnkgTG9naWNhbAorRXh0ZW50IHRoYXQgaXMgbm90IHRoZSBmaXJzdCBMb2dpY2FsIEV4dGVudCBvZiBhIExvZ2ljYWwgVm9sdW1lIGlzCithZGphY2VudCB0byB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIExvZ2ljYWwgRXh0ZW50IGltbWVkaWF0ZWx5CitwcmVjZWRpbmcgaXQuCisKK1xmQkNsaW5nXGZQIHJlcXVpcmVzIHRoYXQgdGhlIFBoeXNpY2FsIFZvbHVtZSB1c2VkIGZvciBhbnkgTG9naWNhbAorRXh0ZW50IHRvIGJlIGFkZGVkIHRvIGFuIGV4aXN0aW5nIExvZ2ljYWwgVm9sdW1lIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGF0CitsZWFzdCBvbmUgTG9naWNhbCBFeHRlbnQgZWFybGllciBpbiB0aGF0IExvZ2ljYWwgVm9sdW1lLiAgSWYgdGhlCitjb25maWd1cmF0aW9uIHBhcmFtZXRlciBcZkJhbGxvY2F0aW9uL2NsaW5nX3RhZ19saXN0XGZQIGlzIGRlZmluZWQsIHRoZW4gdHdvCitQaHlzaWNhbCBWb2x1bWVzIGFyZSBjb25zaWRlcmVkIHRvIG1hdGNoIGlmIGFueSBvZiB0aGUgbGlzdGVkIHRhZ3MgaXMKK3ByZXNlbnQgb24gYm90aCBQaHlzaWNhbCBWb2x1bWVzLiAgVGhpcyBhbGxvd3MgZ3JvdXBzIG9mIFBoeXNpY2FsCitWb2x1bWVzIHdpdGggc2ltaWxhciBwcm9wZXJ0aWVzIChzdWNoIGFzIHRoZWlyIHBoeXNpY2FsIGxvY2F0aW9uKSB0byBiZQordGFnZ2VkIGFuZCB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgZm9yIGFsbG9jYXRpb24gcHVycG9zZXMuCisKK1doZW4gYSBMb2dpY2FsIFZvbHVtZSBpcyBzdHJpcGVkIG9yIG1pcnJvcmVkLCB0aGUgYWJvdmUgcmVzdHJpY3Rpb25zIGFyZQorYXBwbGllZCBpbmRlcGVuZGVudGx5IHRvIGVhY2ggc3RyaXBlIG9yIG1pcnJvciBpbWFnZSAobGVnKSB0aGF0IG5lZWRzCitzcGFjZS4KKworXGZCTm9ybWFsXGZQIHdpbGwgbm90IGNob29zZSBhIFBoeXNpY2FsIEV4dGVudCB0aGF0IHNoYXJlcyB0aGUgc2FtZSBQaHlzaWNhbAorVm9sdW1lIGFzIGEgTG9naWNhbCBFeHRlbnQgYWxyZWFkeSBhbGxvY2F0ZWQgdG8gYSBwYXJhbGxlbCBMb2dpY2FsCitWb2x1bWUgKGkuZS4gYSBkaWZmZXJlbnQgc3RyaXBlIG9yIG1pcnJvciBpbWFnZS9sZWcpIGF0IHRoZSBzYW1lIG9mZnNldAord2l0aGluIHRoYXQgcGFyYWxsZWwgTG9naWNhbCBWb2x1bWUuCisKK1doZW4gYWxsb2NhdGluZyBhIG1pcnJvciBsb2cgYXQgdGhlIHNhbWUgdGltZSBhcyBMb2dpY2FsIFZvbHVtZXMgdG8gaG9sZAordGhlIG1pcnJvciBkYXRhLCBOb3JtYWwgd2lsbCBmaXJzdCB0cnkgdG8gc2VsZWN0IGRpZmZlcmVudCBQaHlzaWNhbAorVm9sdW1lcyBmb3IgdGhlIGxvZyBhbmQgdGhlIGRhdGEuICBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlIGFuZCB0aGUKKy5CIGFsbG9jYXRpb24vbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMKK2NvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIHNldCB0byAwLCBpdCB3aWxsIHRoZW4gYWxsb3cgdGhlIGxvZwordG8gc2hhcmUgUGh5c2ljYWwgVm9sdW1lKHMpIHdpdGggcGFydCBvZiB0aGUgZGF0YS4KKworV2hlbiBhbGxvY2F0aW5nIHRoaW4gcG9vbCBtZXRhZGF0YSwgc2ltaWxhciBjb25zaWRlcmF0aW9ucyB0byB0aG9zZSBvZiBhCittaXJyb3IgbG9nIGluIHRoZSBsYXN0IHBhcmFncmFwaCBhcHBseSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlCisuQiBhbGxvY2F0aW9uL3RoaW5fcG9vbF9tZXRhZGF0YV9yZXF1aXJlX3NlcGFyYXRlX3B2cworY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCisKK0lmIHlvdSByZWx5IHVwb24gYW55IGxheW91dCBiZWhhdmlvdXIgYmV5b25kIHRoYXQgZG9jdW1lbnRlZCBoZXJlLCBiZQorYXdhcmUgdGhhdCBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBjb2RlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IHN1cHBseSBvbiB0aGUgY29tbWFuZCBsaW5lIHR3byBlbXB0eSBQaHlzaWNhbAorVm9sdW1lcyB0aGF0IGhhdmUgYW4gaWRlbnRpY2FsIG51bWJlciBvZiBmcmVlIFBoeXNpY2FsIEV4dGVudHMgYXZhaWxhYmxlIGZvcgorYWxsb2NhdGlvbiwgdGhlIGN1cnJlbnQgY29kZSBjb25zaWRlcnMgdXNpbmcgZWFjaCBvZiB0aGVtIGluIHRoZSBvcmRlcgordGhleSBhcmUgbGlzdGVkLCBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgZnV0dXJlIHJlbGVhc2VzIHdpbGwKK21haW50YWluIHRoYXQgcHJvcGVydHkuICBJZiBpdCBpcyBpbXBvcnRhbnQgdG8gb2J0YWluIGEgc3BlY2lmaWMgbGF5b3V0Citmb3IgYSBwYXJ0aWN1bGFyIExvZ2ljYWwgVm9sdW1lLCB0aGVuIHlvdSBzaG91bGQgYnVpbGQgaXQgdXAgdGhyb3VnaCBhCitzZXF1ZW5jZSBvZiBcZkJsdmNyZWF0ZVxmUCg4KSBhbmQgXGZCbHZjb252ZXJ0XGZQKDgpIHN0ZXBzIHN1Y2ggdGhhdCB0aGUKK3Jlc3RyaWN0aW9ucyBkZXNjcmliZWQgYWJvdmUgYXBwbGllZCB0byBlYWNoIHN0ZXAgbGVhdmUgdGhlIHRvb2xzIG5vCitkaXNjcmV0aW9uIG92ZXIgdGhlIGxheW91dC4KKworVG8gdmlldyB0aGUgd2F5IHRoZSBhbGxvY2F0aW9uIHByb2Nlc3MgY3VycmVudGx5IHdvcmtzIGluIGFueSBzcGVjaWZpYworY2FzZSwgcmVhZCB0aGUgZGVidWcgbG9nZ2luZyBvdXRwdXQsIGZvciBleGFtcGxlIGJ5IGFkZGluZyBcZkJcLXZ2dnZcZlAgdG8KK2EgY29tbWFuZC4KKy4KKy5TSCBMT0dJQ0FMIFZPTFVNRSBUWVBFUworLgorU29tZSBsb2dpY2FsIHZvbHVtZSB0eXBlcyBhcmUgc2ltcGxlIHRvIGNyZWF0ZSBhbmQgY2FuIGJlIGRvbmUgd2l0aCBhCitzaW5nbGUgXGZCbHZjcmVhdGVcZlAoOCkgY29tbWFuZC4gIFRoZSBsaW5lYXIgYW5kIHN0cmlwZWQgbG9naWNhbAordm9sdW1lIHR5cGVzIGFyZSBhbiBleGFtcGxlIG9mIHRoaXMuICBPdGhlciBsb2dpY2FsIHZvbHVtZSB0eXBlcyBtYXkKK3JlcXVpcmUgbW9yZSB0aGFuIG9uZSBjb21tYW5kIHRvIGNyZWF0ZS4gIFRoZSBjYWNoZSAoXGZCbHZtY2FjaGVcZlAoNykpCithbmQgdGhpbiBwcm92aXNpb25pbmcgKFxmQmx2bXRoaW5cZlAoNykpIHR5cGVzIGFyZSBleGFtcGxlcyBvZiB0aGlzLgorLgorLlNIIFNFTEVDVElPTiBDUklURVJJQQorLgorVGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgYSBzZXQgb2YgXGZCc3RhdGVtZW50c1xmUCBjb21iaW5lZCBieSBcZkJsb2dpY2FsCithbmQgZ3JvdXBpbmcgb3BlcmF0b3JzXGZQLiBUaGUgXGZCc3RhdGVtZW50XGZQIGNvbnNpc3RzIG9mIFxmQmNvbHVtblxmUAorbmFtZSBmb3Igd2hpY2ggYSBzZXQgb2YgdmFsaWQgXGZCdmFsdWVzXGZQIGlzIGRlZmluZWQgdXNpbmcKK1xmQmNvbXBhcmlzb24gb3BlcmF0b3JzXGZQLiBGb3IgY29tcGxldGUgbGlzdCBvZiBjb2x1bW4gbmFtZXMgKGZpZWxkcykKK3RoYXQgY2FuIGJlIHVzZWQgaW4gc2VsZWN0aW9uLCBzZWUgdGhlIG91dHB1dCBvZiBcZkI8bHZtIHJlcG9ydGluZyBjb21tYW5kPiAtUyBoZWxwXGZQLgorLlAKKy5TUyBDb21wYXJpc29uIG9wZXJhdG9ycyBcZlIoY21wX29wKQorLnNwCisuUEQgMAorLlRQCisuQiA9fgorTWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uLgorLlRQCisuQiAhfgorTm90IG1hdGNoaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKy5UUAorLkIgPQorRXF1YWwgdG8uCisuVFAKKy5CICE9CitOb3QgZXF1YWwgdG8uCisuVFAKKy5CID49CitHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uCisuVFAKKy5CID4KK0dyZWF0ZXIgdGhhbgorLlRQCisuQiA8PQorTGVzcyB0aGFuIG9yIGVxdWFsIHRvLgorLlRQCisuQiA8CitMZXNzIHRoYW4uCisuUEQKKy5QCisuU1MgQmluYXJ5IGxvZ2ljYWwgb3BlcmF0b3JzIFxmUihjbXBfbG9nKQorLnNwCisuUEQgMAorLlRQCisuQiAmJgorQWxsIGZpZWxkcyBtdXN0IG1hdGNoCisuVFAKKy5CICwKK0FsbCBmaWVsZHMgbXVzdCBtYXRjaAorLlRQCisuQiB8fAorQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgbWF0Y2gKKy5UUAorLkIgIworQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgbWF0Y2gKKy5QRAorLlAKKy5TUyBVbmFyeSBsb2dpY2FsIG9wZXJhdG9ycworLlRQCisuQiAhCitMb2dpY2FsIG5lZ2F0aW9uCisuUAorLlNTIEdyb3VwaW5nIG9wZXJhdG9ycworLnNwCisuUEQgMAorLlRQCisuQiAoCitMZWZ0IHBhcmVudGhlc2lzCisuVFAKKy5CICkKK1JpZ2h0IHBhcmVudGhlc2lzCisuVFAKKy5CIFsKK0xpc3Qgc3RhcnQKKy5UUAorLkIgXQorTGlzdCBlbmQKKy5UUAorLkIgeworTGlzdCBzdWJzZXQgc3RhcnQKKy5UUAorLkIgfQorTGlzdCBzdWJzZXQgZW5kCisuUEQKKy5TUyBJbmZvcm1hbCBncmFtbWFyIHNwZWNpZmljYXRpb24KKy5IUAorLkJSIFNUQVRFTUVOVCAiID0gIiBjb2x1bW4gIiBjbXBfb3AgIiBWQUxVRSAiIHwgIiBcJVNUQVRFTUVOVCAiIGxvZ19vcCAiIFNUQVRFTUVOVCAiIHwgIiBcJShTVEFURU1FTlQpICIgfCAiIFwlIShTVEFURU1FTlQpCisuYnIKKy5IUAorLkJSIFZBTFVFICIgPSAiIFtWQUxVRSAiIGxvZ19vcCAiIFZBTFVFXQorLmJyCitGb3IgbGlzdC1iYXNlZCB0eXBlczogc3RyaW5nIGxpc3QuIE1hdGNoZXMgc3RyaWN0bHkuCitUaGUgbG9nX29wIG11c3QgYWx3YXlzIGJlIG9mIG9uZSB0eXBlIHdpdGhpbiB0aGUgd2hvbGUgbGlzdCB2YWx1ZS4KKy5IUAorLkJSIFZBTFVFICIgPSAiIHtWQUxVRSAiIGxvZ19vcCAiIFZBTFVFfQorLmJyCitGb3IgbGlzdC1iYXNlZCB0eXBlczogc3RyaW5nIGxpc3QuIE1hdGNoZXMgYSBzdWJzZXQuCitUaGUgbG9nX29wIG11c3QgYWx3YXlzIGJlIG9mIG9uZSB0eXBlIHdpdGhpbiB0aGUgd2hvbGUgbGlzdCB2YWx1ZS4KKy5IUAorLkJSIFZBTFVFICIgPSAiIHZhbHVlCisuYnIKK0ZvciBzY2FsYXIgdHlwZXM6IG51bWJlciAoaW50ZWdlciksIHNpemUgKGZsb2F0aW5nIHBvaW50IG51bWJlcgord2l0aCBzaXplIHVuaXQgc3VmZml4KSwgcGVyY2VudCAoZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3IKK3dpdGhvdXQgJSBzdWZmaXgpLCBzdHJpbmcuCisuCisuU0ggRElBR05PU1RJQ1MKKy4KK0FsbCB0b29scyByZXR1cm4gYSBzdGF0dXMgY29kZSBvZiB6ZXJvIG9uIHN1Y2Nlc3Mgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4KKy4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy4KKy5UUAorLkIgSE9NRQorRGlyZWN0b3J5IGNvbnRhaW5pbmcgXGZJLmx2bV9oaXN0b3J5XGZQIGlmIHRoZSBpbnRlcm5hbCByZWFkbGluZQorc2hlbGwgaXMgaW52b2tlZC4KKy5UUAorLkIgTFZNX0NPTU1BTkRfUFJPRklMRQorTmFtZSBvZiBkZWZhdWx0IGNvbW1hbmQgcHJvZmlsZSB0byB1c2UgZm9yIExWTSBjb21tYW5kcy4gVGhpcyBwcm9maWxlCitpcyBvdmVycmlkZW4gYnkgZGlyZWN0IHVzZSBvZiBcZkJcLVwtY29tbWFuZHByb2ZpbGVcZlAgY29tbWFuZCBsaW5lIG9wdGlvbi4KKy5UUAorLkIgTFZNX1NZU1RFTV9ESVIKK0RpcmVjdG9yeSBjb250YWluaW5nIFxmQmx2bS5jb25mXGZQKDUpIGFuZCBvdGhlciBMVk0gc3lzdGVtIGZpbGVzLgorRGVmYXVsdHMgdG8gIlxmSSNERUZBVUxUX1NZU19ESVIjXGZQIi4KKy5UUAorLkIgTFZNX1NVUFBSRVNTX0ZEX1dBUk5JTkdTCitTdXBwcmVzcyB3YXJuaW5ncyBhYm91dCB1bmV4cGVjdGVkIGZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGludG8gTFZNLgorLlRQCisuQiBMVk1fVkdfTkFNRQorVGhlIFZvbHVtZSBHcm91cCBuYW1lIHRoYXQgaXMgYXNzdW1lZCBmb3IKK2FueSByZWZlcmVuY2UgdG8gYSBMb2dpY2FsIFZvbHVtZSB0aGF0IGRvZXNuJ3Qgc3BlY2lmeSBhIHBhdGguCitOb3Qgc2V0IGJ5IGRlZmF1bHQuCisuVFAKKy5CIExWTV9MVk1FVEFEX1BJREZJTEUKK1BhdGggdG8gdGhlIGZpbGUgdGhhdCBzdG9yZXMgdGhlIGx2bWV0YWQgcHJvY2VzcyBJRC4KKy5UUAorLkIgTFZNX0xWTUVUQURfU09DS0VUCitQYXRoIHRvIHRoZSBzb2NrZXQgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGx2bWV0YWQuCisuVFAKKy5CIExWTV9MVk1QT0xMRF9QSURGSUxFCitQYXRoIHRvIHRoZSBmaWxlIHRoYXQgc3RvcmVzIHRoZSBsdm1wb2xsZCBwcm9jZXNzIElELgorLlRQCisuQiBMVk1fTFZNUE9MTERfU09DS0VUCitQYXRoIHRvIHRoZSBzb2NrZXQgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGx2bXBvbGxkLi4KKy5UUAorLkIgTFZNX0xPR19GSUxFX0VQT0NICitBIHN0cmluZyBvZiB1cCB0byAzMiBsZXR0ZXJzIGFwcGVuZGVkIHRvIHRoZSBsb2cgZmlsZW5hbWUgYW5kCitmb2xsb3dlZCBieSB0aGUgcHJvY2VzcyBJRCBhbmQgYSBzdGFydHVwIHRpbWVzdGFtcCB1c2luZwordGhpcyBmb3JtYXQgc3RyaW5nICJfJXNfJWRfJWxsdSIuICBXaGVuIHNldCwgZWFjaCBwcm9jZXNzIGxvZ3MgdG8gYQorc2VwYXJhdGUgZmlsZS4KKy5UUAorLkIgTFZNX0xPR19GSUxFX01BWF9MSU5FUworSWYgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIGxpbmVzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSwgdGhlIGNvbW1hbmQgZ2V0cworYWJvcnRlZC4gIEF1dG9tYXRlZCB0ZXN0cyB1c2UgdGhpcyB0byB0ZXJtaW5hdGUgbG9vcGluZyBjb21tYW5kcy4KKy5UUAorLkIgTFZNX0VYUEVDVEVEX0VYSVRfU1RBVFVTCitUaGUgc3RhdHVzIGFudGljaXBhdGVkIHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMuICBVc2UgIj5OIiB0byBtYXRjaCBhbnkKK3N0YXR1cyBncmVhdGVyIHRoYW4gTi4gIElmIHRoZSBhY3R1YWwgZXhpdCBzdGF0dXMgbWF0Y2hlcyBhbmQgYSBsb2cKK2ZpbGUgZ290IHByb2R1Y2VkLCBpdCBpcyBkZWxldGVkLgorLkIgTFZNX0xPR19GSUxFX0VQT0NICithbmQKKy5CIExWTV9FWFBFQ1RFRF9FWElUX1NUQVRVUwordG9nZXRoZXIgYWxsb3cgYXV0b21hdGVkIHRlc3Qgc2NyaXB0cyB0byBkaXNjYXJkIHVuaW50ZXJlc3RpbmcgbG9nIGRhdGEuCisuVFAKKy5CIExWTV9TVVBQUkVTU19MT0NLSU5HX0ZBSUxVUkVfTUVTU0FHRVMKK1VzZWQgdG8gc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcyB3aGVuIHRoZSBjb25maWd1cmVkIGxvY2tpbmcgaXMga25vd24KK3RvIGJlIHVuYXZhaWxhYmxlLgorLlRQCisuQiBETV9BQk9SVF9PTl9JTlRFUk5BTF9FUlJPUlMKK0Fib3J0IHByb2Nlc3NpbmcgaWYgdGhlIGNvZGUgZGV0ZWN0cyBhIG5vbi1mYXRhbCBpbnRlcm5hbCBlcnJvci4KKy5UUAorLkIgRE1fRElTQUJMRV9VREVWCitBdm9pZCBpbnRlcmFjdGlvbiB3aXRoIHVkZXYuICBMVk0gd2lsbCBtYW5hZ2UgdGhlIHJlbGV2YW50IG5vZGVzIGluIC9kZXYKK2RpcmVjdGx5LgorLgorLlNIIEZJTEVTCisuCisuSSAjREVGQVVMVF9TWVNfRElSIy9sdm0uY29uZgorLmJyCisuSSAkSE9NRS8ubHZtX2hpc3RvcnkKKy4KKy5TSCBTRUUgQUxTTworLgorLm5oCisuQlIgbHZtLmNvbmYgKDUpLAorLkJSIGx2bWNhY2hlICg3KSwKKy5CUiBsdm10aGluICg3KSwKKy5CUiBjbHZtZCAoOCksCisuQlIgZG1zZXR1cCAoOCksCisuQlIgbHZjaGFuZ2UgKDgpLAorLkJSIGx2Y3JlYXRlICg4KSwKKy5CUiBsdmRpc3BsYXkgKDgpLAorLkJSIGx2ZXh0ZW5kICg4KSwKKy5CUiBsdm1jaGFuZ2UgKDgpLAorLkJSIGx2bWNvbmZpZyAoOCksCisuQlIgbHZtZGlza3NjYW4gKDgpLAorLkJSIGx2cmVkdWNlICg4KSwKKy5CUiBsdnJlbW92ZSAoOCksCisuQlIgbHZyZW5hbWUgKDgpLAorLkJSIGx2cmVzaXplICg4KSwKKy5CUiBsdnMgKDgpLAorLkJSIGx2c2NhbiAoOCksCisuQlIgcHZjaGFuZ2UgKDgpLAorLkJSIHB2Y2sgKDgpLAorLkJSIHB2Y3JlYXRlICg4KSwKKy5CUiBwdmRpc3BsYXkgKDgpLAorLkJSIHB2bW92ZSAoOCksCisuQlIgcHZyZW1vdmUgKDgpLAorLkJSIHB2cyAoOCksCisuQlIgcHZzY2FuICg4KSwKKy5CUiB2Z2NmZ2JhY2t1cCAoOCksCisuQlIgdmdjaGFuZ2UgICg4KSwKKy5CUiB2Z2NrICg4KSwKKy5CUiB2Z2NvbnZlcnQgKDgpLAorLkJSIHZnY3JlYXRlICg4KSwKKy5CUiB2Z2Rpc3BsYXkgKDgpLAorLkJSIHZnZXh0ZW5kICg4KSwKKy5CUiB2Z2ltcG9ydCAoOCksCisuQlIgdmdpbXBvcnRjbG9uZSAoOCksCisuQlIgdmdtZXJnZSAoOCksCisuQlIgdmdta25vZGVzICg4KSwKKy5CUiB2Z3JlZHVjZSAoOCksCisuQlIgdmdyZW1vdmUgKDgpLAorLkJSIHZncmVuYW1lICg4KSwKKy5CUiB2Z3MgKDgpLAorLkJSIHZnc2NhbiAoOCksCisuQlIgdmdzcGxpdCAoOCksCisuQlIgcmVhZGxpbmUgKDMpCmRpZmYgLS1naXQgYS9tYW4vbHZtLmNvbmYuNS5pbiBiL21hbi9sdm0uY29uZi41LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODg0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtLmNvbmYuNS5pbgpAQCAtMCwwICsxLDIxMyBAQAorLlRIIExWTS5DT05GIDUgIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZtLmNvbmYgXChlbSBDb25maWd1cmF0aW9uIGZpbGUgZm9yIExWTTIKKy5TSCBTWU5PUFNJUworLkIgI0RFRkFVTFRfU1lTX0RJUiMvbHZtLmNvbmYKKy5TSCBERVNDUklQVElPTgorXGZCbHZtLmNvbmZcZlAgaXMgbG9hZGVkIGR1cmluZyB0aGUgaW5pdGlhbGlzYXRpb24gcGhhc2Ugb2YKK1xmQmx2bVxmUCg4KS4gIFRoaXMgZmlsZSBjYW4gaW4gdHVybiBsZWFkIHRvIG90aGVyIGZpbGVzCitiZWluZyBsb2FkZWQgLSBzZXR0aW5ncyByZWFkIGluIGxhdGVyIG92ZXJyaWRlIGVhcmxpZXIKK3NldHRpbmdzLiAgRmlsZSB0aW1lc3RhbXBzIGFyZSBjaGVja2VkIGJldHdlZW4gY29tbWFuZHMgYW5kIGlmCithbnkgaGF2ZSBjaGFuZ2VkLCBhbGwgdGhlIGZpbGVzIGFyZSByZWxvYWRlZC4KKworVGhlIHNldHRpbmdzIGRlZmluZWQgaW4gbHZtLmNvbmYgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYW55CitvZiB0aGVzZSBleHRlbmRlZCBjb25maWd1cmF0aW9uIG1ldGhvZHM6CisuVFAKKy5CIGRpcmVjdCBjb25maWcgb3ZlcnJpZGUgb24gY29tbWFuZCBsaW5lCitUaGUgXGZCXC1cLWNvbmZpZyBDb25maWd1cmF0aW9uU3RyaW5nXGZQIGNvbW1hbmQgbGluZSBvcHRpb24gdGFrZXMgdGhlCitDb25maWd1cmF0aW9uU3RyaW5nIGFzIGRpcmVjdCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24KK3RvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLiBUaGUgQ29uZmlndXJhdGlvblN0cmluZyBpcyBvZgorZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQgYXMgdXNlZCBpbiBhbnkgTFZNIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworLlRQCisuQiBwcm9maWxlIGNvbmZpZworLmJyCitBIHByb2ZpbGUgaXMgYSBzZXQgb2Ygc2VsZWN0ZWQgY3VzdG9taXphYmxlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKK3RoYXQgYXJlIGFpbWVkIHRvIGFjaGlldmUgYSBjZXJ0YWluIGNoYXJhY3RlcmlzdGljcyBpbiB2YXJpb3VzCitlbnZpcm9ubWVudHMgb3IgdXNlcy4gSXQncyB1c2VkIHRvIG92ZXJyaWRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCitOb3JtYWxseSwgdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgc2hvdWxkIHJlZmxlY3QgdGhhdCBlbnZpcm9ubWVudCBvciB1c2UuCisKK1RoZXJlIGFyZSB0d28gZ3JvdXBzIG9mIHByb2ZpbGVzIHJlY29nbmlzZWQ6IFxmQmNvbW1hbmQgcHJvZmlsZXNcZlAgYW5kCitcZkJtZXRhZGF0YSBwcm9maWxlc1xmUC4KKworVGhlIFxmQmNvbW1hbmQgcHJvZmlsZVxmUCBpcyB1c2VkIHRvIG92ZXJyaWRlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KK3NldHRpbmdzIGF0IGdsb2JhbCBMVk0gY29tbWFuZCBsZXZlbCAtIGl0IGlzIGFwcGxpZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCitvZiBMVk0gY29tbWFuZCBleGVjdXRpb24gYW5kIGl0IGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgd2hvbGUgdGltZSBvZiBMVk0KK2NvbW1hbmQgZXhlY3V0aW9uLiBUaGUgY29tbWFuZCBwcm9maWxlIGlzIGFwcGxpZWQgYnkgdXNpbmcgdGhlCitcZkJcLVwtY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVcZlAgY29tbWFuZCBsaW5lIG9wdGlvbiB0aGF0IGlzIHJlY29nbmlzZWQgYnkKK2FsbCBMVk0yIGNvbW1hbmRzLgorCitUaGUgXGZCbWV0YWRhdGEgcHJvZmlsZVxmUCBpcyB1c2VkIHRvIG92ZXJyaWRlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KK3NldHRpbmdzIGF0IFZvbHVtZSBHcm91cC9Mb2dpY2FsIFZvbHVtZSBsZXZlbCAtIGl0IGlzIGFwcGxpZWQgaW5kZXBlbmRlbnRseQorZm9yIGVhY2ggVm9sdW1lIEdyb3VwL0xvZ2ljYWwgVm9sdW1lIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkLiBBcyBzdWNoLAorZWFjaCBWb2x1bWUgR3JvdXAvTG9naWNhbCBWb2x1bWUgY2FuIHN0b3JlIHRoZSBwcm9maWxlIG5hbWUgdXNlZAoraW4gaXRzIG1ldGFkYXRhIHNvIG5leHQgdGltZSB0aGUgVm9sdW1lIEdyb3VwL0xvZ2ljYWwgVm9sdW1lIGlzCitwcm9jZXNzZWQsIHRoZSBwcm9maWxlIGlzIGFwcGxpZWQgYXV0b21hdGljYWxseS4gSWYgVm9sdW1lIEdyb3VwIGFuZAorYW55IG9mIGl0cyBMb2dpY2FsIFZvbHVtZXMgaGF2ZSBkaWZmZXJlbnQgcHJvZmlsZXMgZGVmaW5lZCwgdGhlIHByb2ZpbGUKK2RlZmluZWQgZm9yIHRoZSBMb2dpY2FsIFZvbHVtZSBpcyBwcmVmZXJyZWQuIFRoZSBtZXRhZGF0YSBwcm9maWxlIGNhbiBiZQorYXR0YWNoZWQvZGV0YWNoZWQgYnkgdXNpbmcgdGhlIFxmQmx2Y2hhbmdlXGZQIGFuZCBcZkJ2Z2NoYW5nZVxmUCBjb21tYW5kcworYW5kIHRoZWlyIFxmQlwtXC1tZXRhZGF0YXByb2ZpbGUgUHJvZmlsZU5hbWVcZlAgYW5kCitcZkJcLVwtZGV0YWNocHJvZmlsZVxmUCBvcHRpb25zIG9yIHRoZSBcZkJcLVwtbWV0YWRhdGFwcm9maWxlXGZQCitvcHRpb24gZHVyaW5nIGNyZWF0aW9uIHdoZW4gdXNpbmcgXGZCdmdjcmVhdGVcZlAgb3IgXGZCbHZjcmVhdGVcZlAgY29tbWFuZC4KK1RoZSBcZkJ2Z3NcZlAgYW5kIFxmQmx2c1xmUCByZXBvcnRpbmcgY29tbWFuZHMgcHJvdmlkZSBcZkItbyB2Z19wcm9maWxlXGZQCithbmQgXGZCLW8gbHZfcHJvZmlsZVxmUCBvdXRwdXQgb3B0aW9ucyB0byBzaG93IHRoZSBtZXRhZGF0YSBwcm9maWxlCitjdXJyZW50bHkgYXR0YWNoZWQgdG8gYSBWb2x1bWUgR3JvdXAgb3IgYSBMb2dpY2FsIFZvbHVtZS4KKworVGhlIHNldCBvZiBvcHRpb25zIGFsbG93ZWQgZm9yIGNvbW1hbmQgcHJvZmlsZXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCit3aGVuIGNvbXBhcmVkIHRvIHRoZSBzZXQgb2Ygb3B0aW9ucyBhbGxvd2VkIGZvciBtZXRhZGF0YSBwcm9maWxlcy4gVGhlCitzZXR0aW5ncyB0aGF0IGJlbG9uZyB0byBlaXRoZXIgb2YgdGhlc2UgdHdvIHNldHMgY2FuJ3QgYmUgbWl4ZWQgdG9nZXRoZXIKK2FuZCBMVk0gdG9vbHMgd2lsbCByZWplY3Qgc3VjaCBwcm9maWxlcy4KKworTFZNIGl0c2VsZiBwcm92aWRlcyBhIGZldyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb24gcHJvZmlsZXMuCitVc2VycyBhcmUgYWxsb3dlZCB0byBhZGQgbW9yZSBwcm9maWxlcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgaWYgbmVlZGVkLgorRm9yIHRoaXMgcHVycG9zZSwgdGhlcmUncyB0aGUgXGZCY29tbWFuZF9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGVcZlAKKyhmb3IgY29tbWFuZCBwcm9maWxlcykgYW5kIFxmQm1ldGFkYXRhX3Byb2ZpbGVfdGVtcGxhdGUucHJvZmlsZVxmUAorKGZvciBtZXRhZGF0YSBwcm9maWxlcykgd2hpY2ggY29udGFpbiBhbGwgc2V0dGluZ3MgdGhhdCBhcmUgY3VzdG9taXphYmxlCitieSBwcm9maWxlcyBvZiBjZXJ0YWluIHR5cGUuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNvcHkgdGhlc2UgdGVtcGxhdGUKK3Byb2ZpbGVzIGFuZCBlZGl0IHRoZW0gYXMgbmVlZGVkLiBBbHRlcm5hdGl2ZWx5LCB0aGUKK1xmQmx2bWNvbmZpZyBcLVwtZmlsZSA8UHJvZmlsZU5hbWUucHJvZmlsZT4gXC1cLXR5cGUgcHJvZmlsYWJsZS1jb21tYW5kIDxzZWN0aW9uPlxmUAorb3IgXGZCbHZtY29uZmlnIFwtXC1maWxlIDxQcm9maWxlTmFtZS5wcm9maWxlPiBcLVwtdHlwZSBwcm9maWxhYmxlLW1ldGFkYXRhIDxzZWN0aW9uPlxmUAorY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBjb25maWd1cmF0aW9uIHdpdGggcHJvZmlsYWJsZSBzZXR0aW5ncyBpbiBlaXRoZXIKK29mIHRoZSB0eXBlIGZvciBnaXZlbiBzZWN0aW9uIGFuZCBzYXZlIGl0IHRvIG5ldyBQcm9maWxlTmFtZS5wcm9maWxlCisoaWYgdGhlIHNlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwgYWxsIHByb2ZpbGFibGUgc2V0dGluZ3MgYXJlIHJlcG9ydGVkKS4KKworVGhlIHByb2ZpbGVzIGFyZSBzdG9yZWQgaW4gI0RFRkFVTFRfUFJPRklMRV9ESVIjIGRpcmVjdG9yeSBieSBkZWZhdWx0LgorVGhpcyBsb2NhdGlvbiBjYW4gYmUgY2hhbmdlZCBieSB1c2luZyB0aGUgXGZCY29uZmlnL3Byb2ZpbGVfZGlyXGZQIHNldHRpbmcuCitFYWNoIHByb2ZpbGUgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4gXGZCUHJvZmlsZU5hbWUucHJvZmlsZVxmUCBmaWxlCitpbiB0aGUgcHJvZmlsZSBkaXJlY3RvcnkuIFdoZW4gcmVmZXJlbmNpbmcgdGhlIHByb2ZpbGUsIHRoZSBcZkIucHJvZmlsZVxmUAorc3VmZml4IGlzIGxlZnQgb3V0LgorCisuVFAKKy5CIHRhZyBjb25maWcKKy5icgorU2VlIFxmQnRhZ3NcZlAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGRlc2NyaXB0aW9uIGJlbG93LgorCisuTFAKK1doZW4gc2V2ZXJhbCBjb25maWd1cmF0aW9uIG1ldGhvZHMgYXJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZQorYW5kIHdoZW4gTFZNIGxvb2tzIGZvciB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHNldHRpbmcsIGl0IHRyYXZlcnNlcwordGhpcyBcZkJjb25maWcgY2FzY2FkZVxmUCBmcm9tIGxlZnQgdG8gcmlnaHQ6CisKK1xmQmRpcmVjdCBjb25maWcgb3ZlcnJpZGUgb24gY29tbWFuZCBsaW5lXGZQIC0+IFxmQmNvbW1hbmQgcHJvZmlsZSBjb25maWdcZlAgLT4gXGZCbWV0YWRhdGEgcHJvZmlsZSBjb25maWdcZlAgLT4gXGZCdGFnIGNvbmZpZ1xmUCAtPiBcZkJsdm1sb2NhbC5jb25mXGZCIC0+IFxmQmx2bS5jb25mXGZQCisKK05vIHBhcnQgb2YgdGhpcyBjYXNjYWRlIGlzIGNvbXB1bHNvcnkuIElmIHRoZXJlJ3Mgbm8gc2V0dGluZyB2YWx1ZSBmb3VuZCBhdAordGhlIGVuZCBvZiB0aGUgY2FzY2FkZSwgYSBkZWZhdWx0IHZhbHVlIGlzIHVzZWQgZm9yIHRoYXQgc2V0dGluZy4KK1VzZSBcZkJsdm1jb25maWdcZlAgdG8gY2hlY2sgd2hhdCBzZXR0aW5ncyBhcmUgaW4gdXNlIGFuZCB3aGF0Cit0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlLgorLlNIIFNZTlRBWAorLkxQCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc3ludGF4LgorLkxQCitXaGl0ZXNwYWNlIGlzIG5vdCBzaWduaWZpY2FudCB1bmxlc3MgaXQgaXMgd2l0aGluIHF1b3Rlcy4KK1RoaXMgcHJvdmlkZXMgYSB3aWRlIGNob2ljZSBvZiBhY2NlcHRhYmxlIGluZGVudGF0aW9uIHN0eWxlcy4KK0NvbW1lbnRzIGJlZ2luIHdpdGggIyBhbmQgY29udGludWUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KK1RoZXkgYXJlIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZS4KKy5MUAorSGVyZSBpcyBhbiBpbmZvcm1hbCBncmFtbWFyOgorLlRQCisuQlIgZmlsZSAiID0gIiB2YWx1ZSAqCisuYnIKK0EgY29uZmlndXJhdGlvbiBmaWxlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIHZhbHVlcy4KKy5UUAorLkJSIHZhbHVlICIgPSAiIHNlY3Rpb24gIiB8ICIgYXNzaWdubWVudAorLmJyCitBIHZhbHVlIGNhbiBlaXRoZXIgYmUgYSBuZXcgc2VjdGlvbiwgb3IgYW4gYXNzaWdubWVudC4KKy5UUAorLkJSIHNlY3Rpb24gIiA9ICIgaWRlbnRpZmllciAiICciIHsgIicgIiB2YWx1ZSAiKiAnIiB9ICcKKy5icgorQSBzZWN0aW9uIGdyb3VwcyBhc3NvY2lhdGVkIHZhbHVlcyB0b2dldGhlci4gSWYgdGhlIHNhbWUgc2VjdGlvbiBpcworZW5jb3VudGVyZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBjb250ZW50cyBvZiBhbGwgaW5zdGFuY2VzIGFyZSBjb25jYXRlbmF0ZWQKK3RvZ2V0aGVyIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlLgorLmJyCitJdCBpcyBkZW5vdGVkIGJ5IGEgbmFtZSBhbmQgZGVsaW1pdGVkIGJ5IGN1cmx5IGJyYWNrZXRzLgorLmJyCitlLmcuCWJhY2t1cCB7CisuYnIKKwkJLi4uCisuYnIKKwl9CisuVFAKKy5CUiBhc3NpZ25tZW50ICIgPSAiIGlkZW50aWZpZXIgIiAnIiA9ICInICggIiBhcnJheSAiIHwgIiB0eXBlICIgKSIKKy5icgorQW4gYXNzaWdubWVudCBhc3NvY2lhdGVzIGEgdHlwZSB3aXRoIGFuIGlkZW50aWZpZXIuIElmIHRoZSBpZGVudGlmaWVyIGNvbnRhaW5zCitmb3J3YXJkIHNsYXNoZXMsIHRob3NlIGFyZSBpbnRlcnByZXRlZCBhcyBwYXRoIGRlbGltaXRlcnMuIFRoZSBzdGF0ZW1lbnQKK1xmQnNlY3Rpb24va2V5ID0gdmFsdWVcZlAgaXMgZXF1aXZhbGVudCB0byBcZkJzZWN0aW9uIHsga2V5ID0gdmFsdWUgfVxmUC4gSWYKK211bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBrZXkgYXJlIGVuY291bnRlcmVkLCBvbmx5IHRoZSBsYXN0IHZhbHVlIGlzIHVzZWQKKyhhbmQgYSB3YXJuaW5nIGlzIGlzc3VlZCkuCisuYnIKK2UuZy4JXGZCbGV2ZWwgPSA3XGZQCisuYnIKKy5UUAorLkJSIGFycmF5ICIgPSAgJyIgWyAiJyAoICIgdHlwZSAiICciICwgIicpKiAiIHR5cGUgIiAnIiBdICInIHwgJyIgWyAiJyAnIiBdICcKKy5icgorSW5ob21vZ2VuZW91cyBhcnJheXMgYXJlIHN1cHBvcnRlZC4KKy5icgorRWxlbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorLmJyCitBbiBlbXB0eSBhcnJheSBpcyBhY2NlcHRhYmxlLgorLlRQCisuQlIgdHlwZSAiID0gIiBpbnRlZ2VyICIgfCAiIGZsb2F0ICIgfCAiIHN0cmluZworLkJSIGludGVnZXIgIiA9IFswLTldKiIKKy5icgorLkJSIGZsb2F0ICIgPSBbMC05XSonIiAuICdbMC05XSoKKy5icgorLkIgc3RyaW5nIFxmUj0gJ1xmQiJcZlInLionXGZCIlxmUicKKy5JUAorU3RyaW5ncyB3aXRoIHNwYWNlcyBtdXN0IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMsIHNpbmdsZSB3b3JkcyB0aGF0IHN0YXJ0Cit3aXRoIGEgbGV0dGVyIGNhbiBiZSBsZWZ0IHVucXVvdGVkLgorCisuU0ggU0VUVElOR1MKKworVGhlCisuQiBsdm1jb25maWcKK2NvbW1hbmQgcHJpbnRzIHRoZSBMVk0gY29uZmlndXJhdGlvbiBzZXR0aW5ncyBpbiB2YXJpb3VzIHdheXMuCitTZWUgdGhlIG1hbiBwYWdlCisuQlIgbHZtY29uZmlnICg4KS4KKworQ29tbWFuZCB0byBwcmludCBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGNvbmZpZyBzZXR0aW5ncywgd2l0aCB0aGVpcgorZGVmYXVsdCB2YWx1ZXM6CisuYnIKKy5CIGx2bWNvbmZpZyBcLVwtdHlwZSBkZWZhdWx0CisKK0NvbW1hbmQgdG8gcHJpbnQgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjb25maWcgc2V0dGluZ3MsIHdpdGggdGhlaXIKK2RlZmF1bHQgdmFsdWVzLCBhbmQgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIGVhY2ggYXMgYSBjb21tZW50OgorLmJyCisuQiBsdm1jb25maWcgXC1cLXR5cGUgZGVmYXVsdCAtLXdpdGhjb21tZW50cworCitDb21tYW5kIHRvIHByaW50IGEgbGlzdCBvZiBhbGwgcG9zc2libGUgY29uZmlnIHNldHRpbmdzLCB3aXRoIHRoZWlyCitjdXJyZW50IHZhbHVlcyAoY29uZmlndXJlZCwgbm9uLWRlZmF1bHQgdmFsdWVzIGFyZSBzaG93bik6CisuYnIKKy5CIGx2bWNvbmZpZyBcLVwtdHlwZSBjdXJyZW50CisKK0NvbW1hbmQgdG8gcHJpbnQgYWxsIGNvbmZpZyBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkIHdpdGggYQorZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIGRlZmF1bHQgKGNvbmZpZ3VyZWQsIG5vbi1kZWZhdWx0IHZhbHVlcyBhcmUKK3Nob3duKToKKy5icgorLkIgbHZtY29uZmlnIFwtXC10eXBlIGRpZmYKKworQ29tbWFuZCB0byBwcmludCBhIHNpbmdsZSBjb25maWcgc2V0dGluZywgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZSwKK2FuZCBhIGZ1bGwgZGVzY3JpcHRpb24sIHdoZXJlICJTZWN0aW9uIiByZWZlcnMgdG8gdGhlIGNvbmZpZyBzZWN0aW9uLAorZS5nLiBnbG9iYWwsIGFuZCAiU2V0dGluZyIgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpYyBzZXR0aW5nLAorZS5nLiB1bWFzazoKKy5icgorLkIgbHZtY29uZmlnIFwtXC10eXBlIGRlZmF1bHQgLS13aXRoY29tbWVudHMgU2VjdGlvbi9TZXR0aW5nCisKKworLlNIIEZJTEVTCisuSSAjREVGQVVMVF9TWVNfRElSIy9sdm0uY29uZgorLmJyCisuSSAjREVGQVVMVF9TWVNfRElSIy9sdm1sb2NhbC5jb25mCisuYnIKKy5JICNERUZBVUxUX0FSQ0hJVkVfRElSIworLmJyCisuSSAjREVGQVVMVF9CQUNLVVBfRElSIworLmJyCisuSSAjREVGQVVMVF9DQUNIRV9ESVIjLy5jYWNoZQorLmJyCisuSSAjREVGQVVMVF9MT0NLX0RJUiMKKy5icgorLkkgI0RFRkFVTFRfUFJPRklMRV9ESVIjCisKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCkKKy5CUiBsdm1jb25maWcgKDgpCisKZGlmZiAtLWdpdCBhL21hbi9sdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLjguaW4gYi9tYW4vbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvci44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmU1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvci44LmluCkBAIC0wLDAgKzEsNTUgQEAKKy5USCAiTFZNMi1BQ1RJVkFUSU9OLUdFTkVSQVRPUiIgIjgiICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCwgSW5jIiAiXCIiCisuU0ggIk5BTUUiCitsdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yIFwtIGdlbmVyYXRvciBmb3Igc3lzdGVtZCB1bml0cyB0byBhY3RpdmF0ZSBMVk0yIHZvbHVtZXMgb24gYm9vdAorLlNIIFNZTk9QU0lTCisuQiAjU1lTVEVNRF9HRU5FUkFUT1JfRElSIy9sdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yCisuc3AKKy5TSCBERVNDUklQVElPTgorVGhlIGx2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3IgaXMgY2FsbGVkIGJ5IFxmQnN5c3RlbWRcZlAoMSkgb24gYm9vdAordG8gZ2VuZXJhdGUgc3lzdGVtZCB1bml0cyBhdCBydW50aW1lIHRvIGFjdGl2YXRlIExWTTIgdm9sdW1lcyBpZgorXGZCbHZtZXRhZFxmUCg4KSBpcyBkaXNhYmxlZCAoZ2xvYmFsL3VzZV9sdm1ldGFkPTAgXGZCbHZtLmNvbmZcZlAoNSkKK29wdGlvbiBpcyB1c2VkKS4gT3RoZXJ3aXNlLCBpZiBcZkJsdm1ldGFkXGZQKDgpIGlzIGVuYWJsZWQsCit0aGUgbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvciBleGl0cyBpbW1lZGlhdGVseSB3aXRob3V0IGdlbmVyYXRpbmcKK2FueSBzeXN0ZW1kIHVuaXRzIGFuZCBMVk0yIGZ1bGx5IHJlbGllcyBvbiBldmVudC1iYXNlZCBhY3RpdmF0aW9uCit0byBhY3RpdmF0ZSB0aGUgTFZNMiB2b2x1bWVzIGluc3RlYWQgdXNpbmcgdGhlIFxmQnB2c2NhblxmUCg4KQorKHB2c2NhbiBcLVwtY2FjaGUgLWFheSkgY2FsbCB0aGF0IGlzIGEgcGFydCBvZiBcZkJ1ZGV2XGZQKDgpIHJ1bGVzLgorCitUaGVzZSBzeXN0ZW1kIHVuaXRzIGFyZSBnZW5lcmF0ZWQgYnkgbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvcjoKKy5zcAorXGZJbHZtMi1hY3RpdmF0aW9uLWVhcmx5LnNlcnZpY2VcZlAKK3VzZWQgZm9yIGFjdGl2YXRpb24gb2YgTFZNMiB2b2x1bWVzIHRoYXQgaXMgb3JkZXJlZCBiZWZvcmUgc3lzdGVtZCdzCitzcGVjaWFsIFxmQmNyeXB0c2V0dXAudGFyZ2V0XGZQIHRvIHN1cHBvcnQgTFZNMiB2b2x1bWVzIHdoaWNoIGFyZSBub3QKK2xheWVyZWQgb24gdG9wIG9mIGVuY3J5cHRlZCBkZXZpY2VzLgorCitcZklsdm0yLWFjdGl2YXRpb24uc2VydmljZVxmUAordXNlZCBmb3IgYWN0aXZhdGlvbiBvZiBMVk0yIHZvbHVtZXMgdGhhdCBpcyBvcmRlcmVkIGFmdGVyIHN5c3RlbWQncworc3BlY2lhbCBcZkJjcnlwdHNldHVwLnRhcmdldFxmUCB0byBzdXBwb3J0IExWTTIgdm9sdW1lcyB3aGljaCBhcmUKK2xheWVyZWQgb24gdG9wIG9mIGVuY3J5cHRlZCBkZXZpY2VzLgorCitcZklsdm0yLWFjdGl2YXRpb24tbmV0LnNlcnZpY2VcZlAKK3VzZWQgZm9yIGFjdGl2YXRpb24gb2YgTFZNMiB2b2x1bWVzIHRoYXQgaXMgb3JkZXJlZCBhZnRlciBzeXN0ZW1kJ3MKK3NwZWNpYWwgXGZCcmVtb3RlLWZzLXByZS50YXJnZXRcZlAgdG8gc3VwcG9ydCBMVk0yIHZvbHVtZXMgd2hpY2ggYXJlCitsYXllcmVkIG9uIGF0dGFjaGVkIHJlbW90ZSBkZXZpY2VzLgorCitOb3RlIHRoYXQgYWxsIHRoZSB1bmRlcmx5aW5nIGRldmljZXMgKFBoeXNpY2FsIFZvbHVtZXMpIG5lZWQgdG8gYmUgcHJlc2VudAord2hlbiB0aGUgc2VydmljZSBpcyBydW4uIElmIHRoZSB0aGVyZSBhcmUgYW55IGRldmljZXMgcHJlc2VudGVkIGluIHRoZSBzeXN0ZW0KK2FueXRpbWUgbGF0ZXIsIGFueSBMVk0yIHZvbHVtZXMgb24gdG9wIG9mIHN1Y2ggZGV2aWNlcyBuZWVkIHRvIGJlIGFjdGl2YXRlZAorZGlyZWN0bHkgYnkgXGZCbHZjaGFuZ2VcZlAoOCkgb3IgXGZCdmdjaGFuZ2VcZlAoOCkuIFRoaXMgbGltaXRhdGlvbiBkb2VzCitub3QgZXhpc3Qgd2hlbiB1c2luZyBcZkJsdm1ldGFkXGZQKDgpIGFuZCBhY2NvbXBhbnlpbmcgZXZlbnQtYmFzZWQgYWN0aXZhdGlvbgorc2luY2Ugc3VjaCBMVk0gdm9sdW1lcyBhcmUgYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYXMgc29vbiBhcyB0aGUgVm9sdW1lIEdyb3VwCitpcyByZWFkeSAoYWxsIHRoZSBQaHlzaWNhbCBWb2x1bWVzIG1ha2luZyB1cCB0aGUgVm9sdW1lIEdyb3VwIGFyZSBwcmVzZW50CitpbiB0aGUgc3lzdGVtKS4KKworVGhlIGx2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3IgaW1wbGVtZW50cyB0aGUgXGZCR2VuZXJhdG9ycyBTcGVjaWZpY2F0aW9uXGZQCithcyByZWZlcmVuY2VkIGluIFxmQnN5c3RlbWRcZlAoMSkuCisuc3AKKy5TSCBTRUUgQUxTTworLkJSIGx2bS5jb25mICg1KQorLkJSIHZnY2hhbmdlICg4KQorLkJSIGx2Y2hhbmdlICg4KQorLkJSIGx2bWV0YWQgKDgpCisuQlIgcHZzY2FuICg4KQorLkJSIHVkZXYgKDcpCisuQlIgc3lzdGVtZCAoMSkKKy5CUiBzeXN0ZW1kLnRhcmdldCAoNSkKKy5CUiBzeXN0ZW1kLnNwZWNpYWwgKDcpCmRpZmYgLS1naXQgYS9tYW4vbHZtY2FjaGUuNy5pbiBiL21hbi9sdm1jYWNoZS43LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmI1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtY2FjaGUuNy5pbgpAQCAtMCwwICsxLDQxOSBAQAorLlRIICJMVk1DQUNIRSIgIjciICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCwgSW5jIiAiXCIiCisuU0ggTkFNRQorbHZtY2FjaGUgXChlbSBMVk0gY2FjaGluZworCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFxmQmNhY2hlXGZQIGxvZ2ljYWwgdm9sdW1lIHR5cGUgdXNlcyBhIHNtYWxsIGFuZCBmYXN0IExWIHRvIGltcHJvdmUKK3RoZSBwZXJmb3JtYW5jZSBvZiBhIGxhcmdlIGFuZCBzbG93IExWLiAgSXQgZG9lcyB0aGlzIGJ5IHN0b3JpbmcgdGhlCitmcmVxdWVudGx5IHVzZWQgYmxvY2tzIG9uIHRoZSBmYXN0ZXIgTFYuCitMVk0gcmVmZXJzIHRvIHRoZSBzbWFsbCBmYXN0IExWIGFzIGEgXGZCY2FjaGUgcG9vbCBMVlxmUC4gIFRoZSBsYXJnZQorc2xvdyBMViBpcyBjYWxsZWQgdGhlIFxmQm9yaWdpbiBMVlxmUC4gIER1ZSB0byByZXF1aXJlbWVudHMgZnJvbSBkbS1jYWNoZQorKHRoZSBrZXJuZWwgZHJpdmVyKSwgTFZNIGZ1cnRoZXIgc3BsaXRzIHRoZSBjYWNoZSBwb29sIExWIGludG8gdHdvCitkZXZpY2VzIC0gdGhlIFxmQmNhY2hlIGRhdGEgTFZcZlAgYW5kIFxmQmNhY2hlIG1ldGFkYXRhIExWXGZQLiAgVGhlIGNhY2hlCitkYXRhIExWIGlzIHdoZXJlIGNvcGllcyBvZiBkYXRhIGJsb2NrcyBhcmUga2VwdCBmcm9tIHRoZQorb3JpZ2luIExWIHRvIGluY3JlYXNlIHNwZWVkLiAgVGhlIGNhY2hlIG1ldGFkYXRhIExWIGhvbGRzIHRoZQorYWNjb3VudGluZyBpbmZvcm1hdGlvbiB0aGF0IHNwZWNpZmllcyB3aGVyZSBkYXRhIGJsb2NrcyBhcmUgc3RvcmVkIChlLmcuCitvbiB0aGUgb3JpZ2luIExWIG9yIG9uIHRoZSBjYWNoZSBkYXRhIExWKS4gIFVzZXJzIHNob3VsZCBiZSBmYW1pbGlhciB3aXRoCit0aGVzZSBMVnMgaWYgdGhleSB3aXNoIHRvIGNyZWF0ZSB0aGUgYmVzdCBhbmQgbW9zdCByb2J1c3QgY2FjaGVkCitsb2dpY2FsIHZvbHVtZXMuICBBbGwgb2YgdGhlc2UgYXNzb2NpYXRlZCBMVnMgbXVzdCBiZSBpbiB0aGUgc2FtZSBWRy4KKworLlNIIENhY2hlIFRlcm1zCisubmYKK29yaWdpbiBMViAgICAgICAgICAgT3JpZ2luTFYgICAgICBsYXJnZSBzbG93IExWCitjYWNoZSBkYXRhIExWICAgICAgIENhY2hlRGF0YUxWICAgc21hbGwgZmFzdCBMViBmb3IgY2FjaGUgcG9vbCBkYXRhCitjYWNoZSBtZXRhZGF0YSBMViAgIENhY2hlTWV0YUxWICAgc21hbGwgZmFzdCBMViBmb3IgY2FjaGUgcG9vbCBtZXRhZGF0YQorY2FjaGUgcG9vbCBMViAgICAgICBDYWNoZVBvb2xMViAgIENhY2hlRGF0YUxWICsgQ2FjaGVNZXRhTFYKK2NhY2hlIExWICAgICAgICAgICAgQ2FjaGVMViAgICAgICBPcmlnaW5MViArIENhY2hlUG9vbExWCisuZmkKKworLlNIIENhY2hlIFVzYWdlCisKK1RoZSBwcmltYXJ5IG1ldGhvZCBmb3IgdXNpbmcgYSBjYWNoZSB0eXBlIGxvZ2ljYWwgdm9sdW1lOgorCisKKy5TUyAwLiBjcmVhdGUgT3JpZ2luTFYKKworQ3JlYXRlIGFuIExWIG9yIGlkZW50aWZ5IGFuIGV4aXN0aW5nIExWIHRvIGJlIHRoZSBvcmlnaW4gTFYuCisKKy5CIGx2Y3JlYXRlIFwtbiBPcmlnaW5MViBcLUwgTGFyZ2VTaXplIFZHIFNsb3dQVnMKKworLkkgRXhhbXBsZQorLmJyCisjIGx2Y3JlYXRlIFwtbiBsdm9sMCBcLUwgMTAwRyB2ZworCisKKy5TUyAxLiBjcmVhdGUgQ2FjaGVEYXRhTFYKKworQ3JlYXRlIHRoZSBjYWNoZSBkYXRhIExWLiAgVGhpcyBMViB3aWxsIGhvbGQgZGF0YSBibG9ja3MgZnJvbSB0aGUKK09yaWdpbkxWLiAgVGhlIHNpemUgb2YgdGhpcyBMViBpcyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgYW5kIHdpbGwgYmUKK3JlcG9ydGVkIGFzIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBwb29sIExWLiAgCisKKy5CIGx2Y3JlYXRlIFwtbiBDYWNoZURhdGFMViBcLUwgQ2FjaGVTaXplIFZHIEZhc3RQVnMKKworLkkgRXhhbXBsZQorLmJyCisjIGx2Y3JlYXRlIFwtbiBjYWNoZTAgXC1MIDEwRyB2ZyAvZGV2L2Zhc3QKKworCisuU1MgMi4gY3JlYXRlIENhY2hlTWV0YUxWCisKK0NyZWF0ZSB0aGUgY2FjaGUgbWV0YWRhdGEgTFYuICBUaGlzIExWIHdpbGwgaG9sZCBjYWNoZSBwb29sIG1ldGFkYXRhLiAgVGhlCitzaXplIG9mIHRoaXMgTFYgc2hvdWxkIGJlIDEwMDAgdGltZXMgc21hbGxlciB0aGFuIHRoZSBjYWNoZSBkYXRhIExWLCB3aXRoCithIG1pbmltdW0gc2l6ZSBvZiA4TWlCLgorCisuQiBsdmNyZWF0ZSBcLW4gQ2FjaGVNZXRhTFYgXC1MIE1ldGFTaXplIFZHIEZhc3RQVnMKKworLkkgRXhhbXBsZQorLmJyCisjIGx2Y3JlYXRlIFwtbiBjYWNoZTBtZXRhIFwtTCAxMk0gdmcgL2Rldi9mYXN0CisKKy5uZgorIyBsdnMgLWEgdmcKKyAgTFYgICAgICAgICBWRyAgIEF0dHIgICAgICAgTFNpemUgICBQb29sIE9yaWdpbgorICBjYWNoZTAgICAgIHZnICAgLXdpLWEtLS0tLSAgMTAuMDBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBjYWNoZTBtZXRhIHZnICAgLXdpLWEtLS0tLSAgMTIuMDBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBsdm9sMCAgICAgIHZnICAgLXdpLWEtLS0tLSAxMDAuMDBnCisuZmkKKworCisuU1MgMy4gY3JlYXRlIENhY2hlUG9vbExWCisKK0NvbWJpbmUgdGhlIGRhdGEgYW5kIG1ldGFkYXRhIExWcyBpbnRvIGEgY2FjaGUgcG9vbCBMVi4KK1RoZSBiZWhhdmlvciBvZiB0aGUgY2FjaGUgcG9vbCBMViBjYW4gYmUgc2V0IGluIHRoaXMgc3RlcC4KKy5icgorQ2FjaGVQb29sTFYgdGFrZXMgdGhlIG5hbWUgb2YgQ2FjaGVEYXRhTFYuCisuYnIKK0NhY2hlRGF0YUxWIGlzIHJlbmFtZWQgQ2FjaGVQb29sTFZfY2RhdGEgYW5kIGJlY29tZXMgaGlkZGVuLgorLmJyCitDYWNoZU1ldGFMViBpcyByZW5hbWVkIENhY2hlUG9vbExWX2NtZXRhIGFuZCBiZWNvbWVzIGhpZGRlbi4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSBWRy9DYWNoZU1ldGFMVgorLlJTCisuQiBWRy9DYWNoZURhdGFMVgorLlJFCisKKy5JIEV4YW1wbGUKKy5icgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgY2FjaGVcLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSB2Zy9jYWNoZTBtZXRhIHZnL2NhY2hlMAorCisubmYKKyMgbHZzIC1hIHZnCisgIExWICAgICAgICAgICAgICBWRyAgIEF0dHIgICAgICAgTFNpemUgICBQb29sIE9yaWdpbgorICBjYWNoZTAgICAgICAgICAgdmcgICBDd2ktLS1DLS0tICAxMC4wMGcKKyAgW2NhY2hlMF9jZGF0YV0gIHZnICAgQ3dpLS0tLS0tLSAgMTAuMDBnCisgIFtjYWNoZTBfY21ldGFdICB2ZyAgIGV3aS0tLS0tLS0gIDEyLjAwbQorICBsdm9sMCAgICAgICAgICAgdmcgICAtd2ktYS0tLS0tIDEwMC4wMGcKKy5maQorCisKKy5TUyA0LiBjcmVhdGUgQ2FjaGVMVgorCitDcmVhdGUgYSBjYWNoZSBMViBieSBsaW5raW5nIHRoZSBjYWNoZSBwb29sIExWIHRvIHRoZSBvcmlnaW4gTFYuCitUaGUgdXNlciBhY2Nlc3NpYmxlIGNhY2hlIExWIHRha2VzIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gTFYsCit3aGlsZSB0aGUgb3JpZ2luIExWIGJlY29tZXMgYSBoaWRkZW4gTFYgd2l0aCB0aGUgbmFtZQorT3JpZ2luTFZfY29yaWcuICBUaGlzIGNhbiBiZSBkb25lIHdoaWxlIHRoZSBvcmlnaW4gTFYgaXMgaW4gdXNlLgorLmJyCitDYWNoZUxWIHRha2VzIHRoZSBuYW1lIG9mIE9yaWdpbkxWLgorLmJyCitPcmlnaW5MViBpcyByZW5hbWVkIE9yaWdpbkxWX2NvcmlnIGFuZCBiZWNvbWVzIGhpZGRlbi4KKworLkIgbHZjb252ZXJ0IFwtXC10eXBlIGNhY2hlIFwtXC1jYWNoZXBvb2wgVkcvQ2FjaGVQb29sTFYgVkcvT3JpZ2luTFYKKworLkkgRXhhbXBsZQorLmJyCisjIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZSBcLVwtY2FjaGVwb29sIHZnL2NhY2hlMCB2Zy9sdm9sMAorCisubmYKKyMgbHZzIC1hIHZnCisgIExWICAgICAgICAgICAgICBWRyAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICAgT3JpZ2luCisgIGNhY2hlMCAgICAgICAgICB2ZyAgIEN3aS0tLUMtLS0gIDEwLjAwZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgW2NhY2hlMF9jZGF0YV0gIHZnICAgQ3dpLWFvLS0tLSAgMTAuMDBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBbY2FjaGUwX2NtZXRhXSAgdmcgICBld2ktYW8tLS0tICAxMi4wMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGx2b2wwICAgICAgICAgICB2ZyAgIEN3aS1hLUMtLS0gMTAwLjAwZyBjYWNoZTAgW2x2b2wwX2NvcmlnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgW2x2b2wwX2NvcmlnXSAgIHZnICAgLXdpLWFvLS0tLSAxMDAuMDBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLmZpCisKKworLlNIIENhY2hlIFJlbW92YWwKKworLlNTIFNwbGl0IGEgY2FjaGUgcG9vbCBMViBvZmYgb2YgYSBjYWNoZSBMVgorCitcJgorCitBIGNhY2hlIHBvb2wgTFYgY2FuIGJlIGRpc2Nvbm5lY3RlZCBmcm9tIGEgY2FjaGUgTFYsIGxlYXZpbmcgYW4KK3VudXNlZCBjYWNoZSBwb29sIExWLCBhbmQgYW4gdW5jYWNoZWQgb3JpZ2luIExWLiAgVGhpcyBjb21tYW5kCit3cml0ZXMgYmFjayBkYXRhIGZyb20gdGhlIGNhY2hlIHBvb2wgdG8gdGhlIG9yaWdpbiBMViB3aGVuIG5lY2Vzc2FyeS4KKworLkIgbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSBWRy9DYWNoZUxWCisKKy5TUyBSZW1vdmluZyBhIGNhY2hlIHBvb2wgTFYgd2l0aG91dCByZW1vdmluZyBpdHMgbGlua2VkIG9yaWdpbiBMVgorCitcJgorCitUaGlzIHdyaXRlcyBiYWNrIGRhdGEgZnJvbSB0aGUgY2FjaGUgcG9vbCB0byB0aGUgb3JpZ2luIExWIHdoZW4gbmVjZXNzYXJ5LAordGhlbiByZW1vdmVzIHRoZSBjYWNoZSBwb29sIExWLCBsZWF2aW5nIHRoZSB1bmNhY2hlZCBvcmlnaW4gTFYuCisKKy5CIGx2cmVtb3ZlIFZHL0NhY2hlUG9vbExWCisKK0FuIGFsdGVybmF0aXZlIGNvbW1hbmQgdGhhdCBhbHNvIGRpc2Nvbm5lY3RzIHRoZSBjYWNoZSBwb29sIGZyb20gdGhlIGNhY2hlCitMViwgYW5kIGRlbGV0ZXMgdGhlIGNhY2hlIHBvb2w6CisKKy5CIGx2Y29udmVydCAtLXVuY2FjaGUgVkcvQ2FjaGVMVgorCisuSSBFeGFtcGxlCisubmYKKyMgbHZzIHZnCisgIExWICAgICBWRyAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICAgT3JpZ2luCisgIGNhY2hlMCB2ZyAgIEN3aS0tLUMtLS0gIDEwLjAwZworICBsdm9sMCAgdmcgICBDd2ktYS1DLS0tIDEwMC4wMGcgY2FjaGUwIFtsdm9sMF9jb3JpZ10KKworIyBsdnJlbW92ZSB2Zy9jYWNoZTAKKworIyBsdnMgdmcKKyAgTFYgICAgVkcgICBBdHRyICAgICAgIExTaXplICAgUG9vbCBPcmlnaW4KKyAgbHZvbDAgdmcgICAtd2ktYS0tLS0tIDEwMC4wMGcKKy5maQorCisuU1MgUmVtb3ZpbmcgYSBjYWNoZSBMVjogYm90aCBvcmlnaW4gTFYgYW5kIHRoZSBjYWNoZSBwb29sIExWCisKK1wmCisKK1JlbW92aW5nIGEgY2FjaGUgTFYgcmVtb3ZlcyBib3RoIHRoZSBvcmlnaW4gTFYgYW5kIHRoZSBsaW5rZWQgY2FjaGUgcG9vbAorTFYuCisKKy5CIGx2cmVtb3ZlIFZHL0NhY2hlTFYKKworCisuU0ggQ2FjaGUgVG9waWNzCisKKy5TUyBUb2xlcmF0ZSBkZXZpY2UgZmFpbHVyZXMgaW4gYSBjYWNoZSBwb29sIExWCisKK1wmCisKK1VzZXJzIHdobyBhcmUgY29uY2VybmVkIGFib3V0IHRoZSBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlcyBpbiB0aGVpciBmYXN0CitkZXZpY2VzIHRoYXQgY291bGQgbGVhZCB0byBkYXRhIGxvc3MgbWlnaHQgY29uc2lkZXIgbWFraW5nIHRoZWlyIGNhY2hlCitwb29sIHN1Yi1MVnMgcmVkdW5kYW50LgorCisuSSBFeGFtcGxlCisubmYKKzAuIENyZWF0ZSBhbiBvcmlnaW4gTFYgd2Ugd2lzaCB0byBjYWNoZQorIyBsdmNyZWF0ZSBcLUwgMTBHIFwtbiBsdjEgdmcgL2Rldi9zbG93X2RldnMKKworMS4gQ3JlYXRlIGEgMi13YXkgUkFJRDEgY2FjaGUgZGF0YSBMVgorIyBsdmNyZWF0ZSBcLVwtdHlwZSByYWlkMSBcLW0gMSBcLUwgMUcgLW4gY2FjaGUxIHZnIFxcCisJL2Rldi9mYXN0MSAvZGV2L2Zhc3QyCisKKzIuIENyZWF0ZSBhIDItd2F5IFJBSUQxIGNhY2hlIG1ldGFkYXRhIExWCisjIGx2Y3JlYXRlIFwtXC10eXBlIHJhaWQxIFwtbSAxIFwtTCA4TSAtbiBjYWNoZTFtZXRhIHZnIFxcCisJL2Rldi9mYXN0MSAvZGV2L2Zhc3QyCisKKzMuIENyZWF0ZSBhIGNhY2hlIHBvb2wgTFYgY29tYmluaW5nIGNhY2hlIGRhdGEgTFYgYW5kIGNhY2hlIG1ldGFkYXRhIExWCisjIGx2Y29udmVydCBcLVwtdHlwZSBjYWNoZVwtcG9vbCBcLVwtcG9vbG1ldGFkYXRhIHZnL2NhY2hlMW1ldGEgdmcvY2FjaGUxCisKKzQuIENyZWF0ZSBhIGNhY2hlZCBMViBieSBjb21iaW5pbmcgdGhlIGNhY2hlIHBvb2wgTFYgYW5kIG9yaWdpbiBMVgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgY2FjaGUgXC1cLWNhY2hlcG9vbCB2Zy9jYWNoZTEgdmcvbHYxCisuZmkKKworLlNTIENhY2hlIG1vZGUKKworXCYKKworVGhlIGRlZmF1bHQgY2FjaGUgbW9kZSBpcyAid3JpdGV0aHJvdWdoIi4gIFdyaXRldGhyb3VnaCBlbnN1cmVzIHRoYXQgYW55CitkYXRhIHdyaXR0ZW4gd2lsbCBiZSBzdG9yZWQgYm90aCBpbiB0aGUgY2FjaGUgcG9vbCBMViBhbmQgb24gdGhlIG9yaWdpbgorTFYuICBUaGUgbG9zcyBvZiBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhY2hlIHBvb2wgTFYgaW4gdGhpcyBjYXNlCit3b3VsZCBub3QgbWVhbiB0aGUgbG9zcyBvZiBhbnkgZGF0YS4KKworQSBzZWNvbmQgY2FjaGUgbW9kZSBpcyAid3JpdGViYWNrIi4gIFdyaXRlYmFjayBkZWxheXMgd3JpdGluZyBkYXRhIGJsb2NrcworZnJvbSB0aGUgY2FjaGUgcG9vbCBiYWNrIHRvIHRoZSBvcmlnaW4gTFYuICBUaGlzIG1vZGUgd2lsbCBpbmNyZWFzZQorcGVyZm9ybWFuY2UsIGJ1dCB0aGUgbG9zcyBvZiBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhY2hlIHBvb2wgTFYKK2NhbiByZXN1bHQgaW4gbG9zdCBkYXRhLgorCitXaXRoIHRoZSBcLVwtY2FjaGVtb2RlIG9wdGlvbiwgdGhlIGNhY2hlIG1vZGUgY2FuIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEKK2NhY2hlIExWLCBvciBjaGFuZ2VkIG9uIGFuIGV4aXN0aW5nIGNhY2hlIExWLiAgVGhlIGN1cnJlbnQgY2FjaGUgbW9kZSBvZiBhCitjYWNoZSBMViBjYW4gYmUgZGlzcGxheWVkIHdpdGggdGhlIGNhY2hlX21vZGUgcmVwb3J0aW5nIG9wdGlvbjoKKworLkIgbHZzIFwtbytjYWNoZV9tb2RlIFZHL0NhY2hlTFYKKworLkJSIGx2bS5jb25mICg1KQorLkIgYWxsb2NhdGlvbi9jYWNoZV9tb2RlCisuYnIKK2RlZmluZXMgdGhlIGRlZmF1bHQgY2FjaGUgbW9kZS4KKworLkkgRXhhbXBsZQorLm5mCiswLiBDcmVhdGUgYW4gb3JpZ2luIExWIHdlIHdpc2ggdG8gY2FjaGUgKHlvdXJzIG1heSBhbHJlYWR5IGV4aXN0KQorIyBsdmNyZWF0ZSBcLUwgMTBHIFwtbiBsdjEgdmcgL2Rldi9zbG93CisKKzEuIENyZWF0ZSBhIGNhY2hlIGRhdGEgTFYKKyMgbHZjcmVhdGUgXC1MIDFHIFwtbiBjYWNoZTEgdmcgL2Rldi9mYXN0CisKKzIuIENyZWF0ZSBhIGNhY2hlIG1ldGFkYXRhIExWCisjIGx2Y3JlYXRlIFwtTCA4TSBcLW4gY2FjaGUxbWV0YSB2ZyAvZGV2L2Zhc3QKKworMy4gQ3JlYXRlIGEgY2FjaGUgcG9vbCBMVgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgY2FjaGVcLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSB2Zy9jYWNoZTFtZXRhIHZnL2NhY2hlMQorCis0LiBDcmVhdGUgYSBjYWNoZSBMViBieSBjb21iaW5pbmcgdGhlIGNhY2hlIHBvb2wgTFYgYW5kIG9yaWdpbiBMViwKKyAgIGFuZCB1c2UgdGhlIHdyaXRldGhyb3VnaCBjYWNoZSBtb2RlLgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgY2FjaGUgXC1cLWNhY2hlcG9vbCB2Zy9jYWNoZTEgXFwKKwlcLVwtY2FjaGVtb2RlIHdyaXRldGhyb3VnaCB2Zy9sdjEKKy5maQorCisKKy5TUyBDYWNoZSBwb2xpY3kKKworXCYKKworVGhlIGNhY2hlIHN1YnN5c3RlbSBoYXMgYWRkaXRpb25hbCBwZXItTFYgcGFyYW1ldGVyczogdGhlIGNhY2hlIHBvbGljeSB0bwordXNlLCBhbmQgcG9zc2libHkgdHVuYWJsZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2FjaGUgcG9saWN5LiAgVGhyZWUgcG9saWNpZXMKK2FyZSBjdXJyZW50bHkgYXZhaWxhYmxlOiAic21xIiBpcyB0aGUgZGVmYXVsdCBwb2xpY3ksICJtcSIgaXMgYW4gb2xkZXIKK2ltcGxlbWVudGF0aW9uLCBhbmQgImNsZWFuZXIiIGlzIHVzZWQgdG8gZm9yY2UgdGhlIGNhY2hlIHRvIHdyaXRlIGJhY2sKKyhmbHVzaCkgYWxsIGNhY2hlZCB3cml0ZXMgdG8gdGhlIG9yaWdpbiBMVi4KKworVGhlICJtcSIgcG9saWN5IGhhcyBhIG51bWJlciBvZiB0dW5hYmxlIHBhcmFtZXRlcnMuIFRoZSBkZWZhdWx0cyBhcmUKK2Nob3NlbiB0byBiZSBzdWl0YWJsZSBmb3IgdGhlIG1ham9yaXR5IG9mIHN5c3RlbXMsIGJ1dCBpbiBzcGVjaWFsCitjaXJjdW1zdGFuY2VzLCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2UuCisKK1dpdGggdGhlIFwtXC1jYWNoZXBvbGljeSBhbmQgXC1cLWNhY2hlc2V0dGluZ3Mgb3B0aW9ucywgdGhlIGNhY2hlIHBvbGljeQorYW5kIHNldHRpbmdzIGNhbiBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIGNhY2hlIExWLCBvciBjaGFuZ2VkIG9uIGFuCitleGlzdGluZyBjYWNoZSBMViAoYm90aCBvcHRpb25zIGNhbiBiZSB1c2VkIHRvZ2V0aGVyKS4gIFRoZSBjdXJyZW50IGNhY2hlCitwb2xpY3kgYW5kIHNldHRpbmdzIG9mIGEgY2FjaGUgTFYgY2FuIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBjYWNoZV9wb2xpY3kKK2FuZCBjYWNoZV9zZXR0aW5ncyByZXBvcnRpbmcgb3B0aW9uczoKKworLkIgbHZzIFwtbytjYWNoZV9wb2xpY3ksY2FjaGVfc2V0dGluZ3MgVkcvQ2FjaGVMVgorCisuSSBFeGFtcGxlCisubmYKK0NoYW5nZSB0aGUgY2FjaGUgcG9saWN5IGFuZCBzZXR0aW5ncyBvZiBhbiBleGlzdGluZyBjYWNoZSBMVi4KKyMgbHZjaGFuZ2UgXC1cLWNhY2hlcG9saWN5IG1xIFwtXC1jYWNoZXNldHRpbmdzIFxcCisJXChhcW1pZ3JhdGlvbl90aHJlc2hvbGQ9MjA0OCByYW5kb21fdGhyZXNob2xkPTRcKGFxIHZnL2x2MQorLmZpCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIGFsbG9jYXRpb24vY2FjaGVfcG9saWN5CisuYnIKK2RlZmluZXMgdGhlIGRlZmF1bHQgY2FjaGUgcG9saWN5LgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiBhbGxvY2F0aW9uL2NhY2hlX3NldHRpbmdzCisuYnIKK2RlZmluZXMgdGhlIGRlZmF1bHQgY2FjaGUgc2V0dGluZ3MuCisKKworLlNTIENodW5rIHNpemUKKworXCYKKworVGhlIHNpemUgb2YgZGF0YSBibG9ja3MgbWFuYWdlZCBieSBhIGNhY2hlIHBvb2wgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZQorXC1cLWNodW5rc2l6ZSBvcHRpb24gd2hlbiB0aGUgY2FjaGUgTFYgaXMgY3JlYXRlZC4gIFRoZSBkZWZhdWx0IHVuaXQKK2lzIEtpQi4gVGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMktpQiBiZXR3ZWVuIDMyS2lCIGFuZCAxR2lCLgorCitVc2luZyBhIGNodW5rIHNpemUgdGhhdCBpcyB0b28gbGFyZ2UgY2FuIHJlc3VsdCBpbiB3YXN0ZWZ1bCB1c2Ugb2YgdGhlCitjYWNoZSwgd2hlcmUgc21hbGwgcmVhZHMgYW5kIHdyaXRlcyBjYW4gY2F1c2UgbGFyZ2Ugc2VjdGlvbnMgb2YgYW4gTFYgdG8KK2JlIG1hcHBlZCBpbnRvIHRoZSBjYWNoZS4gIEhvd2V2ZXIsIGNob29zaW5nIGEgY2h1bmsgc2l6ZSB0aGF0IGlzIHRvbworc21hbGwgY2FuIHJlc3VsdCBpbiBtb3JlIG92ZXJoZWFkIHRyeWluZyB0byBtYW5hZ2UgdGhlIG51bWVyb3VzIGNodW5rcwordGhhdCBiZWNvbWUgbWFwcGVkIGludG8gdGhlIGNhY2hlLiAgT3ZlcmhlYWQgY2FuIGluY2x1ZGUgYm90aCBleGNlc3NpdmUKK0NQVSB0aW1lIHNlYXJjaGluZyBmb3IgY2h1bmtzLCBhbmQgZXhjZXNzaXZlIG1lbW9yeSB0cmFja2luZyBjaHVua3MuCisKK0NvbW1hbmQgdG8gZGlzcGxheSB0aGUgY2FjaGUgcG9vbCBMViBjaHVuayBzaXplOgorLmJyCisuQiBsdnMgXC1vK2NodW5rc2l6ZSBWRy9DYWNoZUxWCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIGNhY2hlX3Bvb2xfY2h1bmtfc2l6ZQorLmJyCitjb250cm9scyB0aGUgZGVmYXVsdCBjaHVuayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBhIGNhY2hlIExWLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBzaG93biBieToKKy5icgorLkIgbHZtY29uZmlnIFwtXC10eXBlIGRlZmF1bHQgYWxsb2NhdGlvbi9jYWNoZV9wb29sX2NodW5rX3NpemUKKworCisuU1MgU3BhcmUgbWV0YWRhdGEgTFYKKworXCYKKworU2VlCisuQlIgbHZtdGhpbiAoNykKK2ZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAicG9vbCBtZXRhZGF0YSBzcGFyZSIgTFYuCitUaGUgc2FtZSBjb25jZXB0IGlzIHVzZWQgZm9yIGNhY2hlIHBvb2xzLgorCisuU1MgQXV0b21hdGljIHBvb2wgbWV0YWRhdGEgTFYKKworXCYKKworQSBjYWNoZSBkYXRhIExWIGNhbiBiZSBjb252ZXJ0ZWQgdG8gY2FjaGUgcG9vbCBMViB3aXRob3V0IHNwZWNpZnlpbmcgYQorY2FjaGUgcG9vbCBtZXRhZGF0YSBMVi4gIExWTSB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbWV0YWRhdGEgTFYgZnJvbQordGhlIHNhbWUgVkcuCisKKy5CIGx2Y3JlYXRlIC1uIENhY2hlRGF0YUxWIC1MIENhY2hlU2l6ZSBWRworLmJyCisuQiBsdmNvbnZlcnQgLS10eXBlIGNhY2hlXC1wb29sIFZHL0NhY2hlRGF0YUxWCisKKworLlNTIENyZWF0ZSBhIG5ldyBjYWNoZSBMViB3aXRob3V0IGFuIGV4aXN0aW5nIG9yaWdpbiBMVgorCitcJgorCitBIGNhY2hlIExWIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGFuIGV4aXN0aW5nIGNhY2hlIHBvb2wgd2l0aG91dCBhbiBleGlzdGluZworb3JpZ2luIExWLiAgQSBuZXcgb3JpZ2luIExWIGlzIGNyZWF0ZWQgYW5kIGxpbmtlZCB0byB0aGUgY2FjaGUgcG9vbCBpbiBhCitzaW5nbGUgc3RlcC4KKworLkIgbHZjcmVhdGUgXC1cLXR5cGUgY2FjaGUgXC1MIExhcmdlU2l6ZSBcLW4gQ2FjaGVMVgorLlJTCisuQiBcLVwtY2FjaGVwb29sIFZHL0NhY2hlUG9vbExWIFZHIFNsb3dQVnMKKy5SRQorCisKKy5TUyBTaW5nbGUgc3RlcCBjYWNoZSBwb29sIExWIGNyZWF0aW9uCisKK1wmCisKK0EgY2FjaGUgcG9vbCBMViBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc2luZ2xlIGx2Y3JlYXRlIGNvbW1hbmQsIHJhdGhlciB0aGFuCit1c2luZyBsdmNvbnZlcnQgb24gZXhpc3RpbmcgTFZzLiAgVGhpcyBvbmUgY29tbWFuZCBjcmVhdGVzIGEgY2FjaGUgZGF0YQorTFYsIGEgY2FjaGUgbWV0YWRhdGEgTFYsIGFuZCBjb21iaW5lcyB0aGUgdHdvIGludG8gYSBjYWNoZSBwb29sIExWLgorCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSBjYWNoZVwtcG9vbCBcLUwgQ2FjaGVTaXplIFwtbiBDYWNoZVBvb2xMViBWRyBGYXN0UFZzCisKKworLlNTIENvbnZlcnQgZXhpc3RpbmcgTFZzIHRvIGNhY2hlIHR5cGVzCisKK1wmCisKK1doZW4gYW4gZXhpc3Rpbmcgb3JpZ2luIExWIGlzIGNvbnZlcnRlZCB0byBhIGNhY2hlIExWLCB0aGUgc3BlY2lmaWVkIGNhY2hlCitwb29sIG1heSBiZSBhIG5vcm1hbCBMViwgcmF0aGVyIHRoYW4gYSBjYWNoZSBwb29sIExWLiAgSW4gdGhpcyBjYXNlLCBsdm0KK3dpbGwgZmlyc3QgY29udmVydCB0aGUgbm9ybWFsIExWIHRvIGEgY2FjaGUgcG9vbCBMVi4gIEEgcG9vbCBtZXRhZGF0YSBMVgorbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLgorCisuQiBsdmNyZWF0ZSAtbiBPcmlnaW5MViAtTCBMYXJnZVNpemUgVkcKKy5icgorLkIgbHZjcmVhdGUgLW4gQ2FjaGVEYXRhTFYgLUwgQ2FjaGVTaXplIFZHCisuYnIKKy5CIGx2Y29udmVydCAtLXR5cGUgY2FjaGUgLS1jYWNoZXBvb2wgVkcvQ2F0YURhdGFMViBWRy9PcmlnaW5MVgorCitUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisKKy5CIGx2Y3JlYXRlIC1uIE9yaWdpbkxWIC1MIExhcmdlU2l6ZSBWRworLmJyCisuQiBsdmNyZWF0ZSAtbiBDYWNoZURhdGFMViAtTCBDYWNoZVNpemUgVkcKKy5icgorLkIgbHZjb252ZXJ0IC0tdHlwZSBjYWNoZS1wb29sIFZHL0NhY2hlRGF0YUxWCisuYnIKKy5CIGx2Y29udmVydCAtLXR5cGUgY2FjaGUgLS1jYWNoZXBvb2wgVkcvQ2FjaGVQb29sTFYgVkcvT3JpZ2luTFYKKworCisuU0ggU0VFIEFMU08KKy5CUiBsdm0uY29uZiAoNSksCisuQlIgbHZjaGFuZ2UgKDgpLAorLkJSIGx2Y3JlYXRlICg4KSwKKy5CUiBsdmRpc3BsYXkgKDgpLAorLkJSIGx2ZXh0ZW5kICg4KSwKKy5CUiBsdnJlbW92ZSAoOCksCisuQlIgbHZyZW5hbWUgKDgpLAorLkJSIGx2cmVzaXplICg4KSwKKy5CUiBsdnMgKDgpLAorLkJSIHZnY2hhbmdlICg4KSwKKy5CUiB2Z21lcmdlICg4KSwKKy5CUiB2Z3JlZHVjZSAoOCksCisuQlIgdmdzcGxpdCAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdm1jaGFuZ2UuOC5pbiBiL21hbi9sdm1jaGFuZ2UuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzZiM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bWNoYW5nZS44LmluCkBAIC0wLDAgKzEsMTAgQEAKKy5USCBMVk1DSEFOR0UgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitsdm1jaGFuZ2UgXChlbSBjaGFuZ2UgYXR0cmlidXRlcyBvZiB0aGUgbG9naWNhbCB2b2x1bWUgbWFuYWdlcgorLlNIIFNZTk9QU0lTCisuQiBsdm1jaGFuZ2UKKy5TSCBERVNDUklQVElPTgorbHZtY2hhbmdlIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHVuZGVyIExWTTIsIGFsdGhvdWdoCitcZkJkbXNldHVwXGZQKDgpIGhhcyBhIFxmQnJlbW92ZV9hbGxcZlAgY29tbWFuZC4KKy5TSCBTRUUgQUxTTworLkJSIGRtc2V0dXAgKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZtY29uZi44LmluIGIvbWFuL2x2bWNvbmYuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNiNTJiCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bWNvbmYuOC5pbgpAQCAtMCwwICsxLDcwIEBACisuVEggIkxWTUNPTkYiICI4IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorCisuU0ggIk5BTUUiCitsdm1jb25mIFwoZW0gTFZNIGNvbmZpZ3VyYXRpb24gbW9kaWZpZXIKKy5TSCAiU1lOT1BTSVMiCisuQiBsdm1jb25mCisuUkIgWyBcLVwtZGlzYWJsZS1jbHVzdGVyIF0KKy5SQiBbIFwtXC1lbmFibGUtY2x1c3RlciBdCisuUkIgWyBcLVwtZW5hYmxlLWhhbHZtIF0KKy5SQiBbIFwtXC1kaXNhYmxlLWhhbHZtIF0KKy5SQiBbIFwtXC1maWxlCisuUkkgPCBjb25maWdmaWxlID5dCisuUkIgWyBcLVwtbG9ja2luZ2xpYgorLlJJIDwgbGliID5dCisuUkIgWyBcLVwtbG9ja2luZ2xpYmRpcgorLlJJIDwgZGlyID5dCisuUkIgWyBcLVwtc2VydmljZXMgXQorLlJCIFsgXC1cLW1pcnJvcnNlcnZpY2UgXQorLlJCIFsgXC1cLXN0YXJ0c3RvcHNlcnZpY2VzIF0KKworLlNIICJERVNDUklQVElPTiIKK2x2bWNvbmYgaXMgYSBzY3JpcHQgdGhhdCBtb2RpZmllcyB0aGUgbG9ja2luZyBjb25maWd1cmF0aW9uIGluCithbiBsdm0gY29uZmlndXJhdGlvbiBmaWxlLiBTZWUgXGZCbHZtLmNvbmZcZlAoNSkuIEluIGFkZGl0aW9uCit0byB0aGF0LCBpdCBjYW4gYWxzbyBzZXQgU3lzdGVtZCBvciBTeXNWIHNlcnZpY2VzIGFjY29yZGluZyB0bworY2hhbmdlcyBpbiB0aGUgbHZtIGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkLgorCisuU0ggIk9QVElPTlMiCisuVFAKKy5CUiBcLVwtZGlzYWJsZS1jbHVzdGVyCitTZXQgXGZCbG9ja2luZ190eXBlXGZSIHRvIHRoZSBkZWZhdWx0IG5vbi1jbHVzdGVyZWQgdHlwZS4gQWxzbyByZXNldAorbHZtZXRhZCB1c2UgdG8gaXRzIGRlZmF1bHQuCisuVFAKKy5CUiBcLVwtZW5hYmxlLWNsdXN0ZXIKK1NldCBcZkJsb2NraW5nX3R5cGVcZlIgdG8gdGhlIGRlZmF1bHQgY2x1c3RlcmVkIHR5cGUgb24gdGhpcyBzeXN0ZW0uCitBbHNvIGRpc2FibGUgbHZtZXRhZCB1c2UgYXMgaXQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gY2x1c3RlcmVkIGVudmlyb25tZW50LgorLlRQCisuQlIgXC1cLWRpc2FibGUtaGFsdm0KK1NldCBcZkJsb2NraW5nX3R5cGVcZlIgdG8gdGhlIGRlZmF1bHQgbm9uLWNsdXN0ZXJlZCB0eXBlLiBBbHNvIHJlc2V0Citsdm1ldGFkIHVzZSB0byBpdHMgZGVmYXVsdC4KKy5UUAorLkJSIFwtXC1lbmFibGUtaGFsdm0KK1NldCBcZkJsb2NraW5nX3R5cGVcZlIgc3VpdGFibGUgZm9yIEhBIExWTSB1c2UuCitBbHNvIGRpc2FibGUgbHZtZXRhZCB1c2UgYXMgaXQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gSEEgTFZNIGVudmlyb25tZW50LgorLlRQCisuQlIgXC1cLWZpbGUgIiA8IiBcZkljb25maWdmaWxlID4KK0FwcGx5IHRoZSBjaGFuZ2VzIHRvIFxmSWNvbmZpZ2ZpbGVcZlAgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdAorXGZJI0RFRkFVTFRfU1lTX0RJUiMvbHZtLmNvbmZcZlAuCisuVFAKKy5CUiBcLVwtbG9ja2luZ2xpYiAiIDwiIFxmSWxpYiA+CitTZXQgZXh0ZXJuYWwgXGZCbG9ja2luZ19saWJyYXJ5XGZSIGxvY2tpbmcgbGlicmFyeSB0byBsb2FkIGlmIGFuIGV4dGVybmFsIGxvY2tpbmcgdHlwZSBpcyB1c2VkLgorLlRQCisuQlIgXC1cLWxvY2tpbmdsaWJkaXIgIiA8IiBcZklkaXIgPgorLlRQCisuQlIgXC1cLXNlcnZpY2VzCitJbiBhZGRpdGlvbiB0byBzZXR0aW5nIHRoZSBsdm0gY29uZmlndXJhdGlvbiwgYWxzbyBlbmFibGUgb3IgZGlzYWJsZSByZWxhdGVkIFN5c3RlbWQgb3IgU3lzVgorY2x2bWQgYW5kIGx2bWV0YWQgc2VydmljZXMuIFRoaXMgc2NyaXB0IGRvZXMgbm90IGNvbmZpZ3VyZSBzZXJ2aWNlcyBwcm92aWRlZCBieSBjbHVzdGVyIHJlc291cmNlCithZ2VudHMuCisuVFAKKy5CUiBcLVwtbWlycm9yc2VydmljZQorQWxzbyBlbmFibGUgb3IgZGlzYWJsZSBvcHRpb25hbCBjbWlycm9yZCBzZXJ2aWNlIHdoZW4gaGFuZGxpbmcgc2VydmljZXMgKGFwcGxpY2FibGUgb25seSB3aXRoIFwtXC1zZXJ2aWNlcykuCisuVFAKKy5CUiBcLVwtc3RhcnRzdG9wc2VydmljZXMKK0luIGFkZGl0aW9uIHRvIGVuYWJsaW5nIG9yIGRpc2FibGluZyByZWxhdGVkIHNlcnZpY2VzLCBzdGFydCBvciBzdG9wIHRoZW0gaW1tZWRpYXRlbHkKKyhhcHBsaWNhYmxlIG9ubHkgd2l0aCBcLVwtc2VydmljZXMpLgorLlNIIEZJTEVTCisuSSAjREVGQVVMVF9TWVNfRElSIy9sdm0uY29uZgorCisuU0ggIlNFRSBBTFNPIgorLkJSIGx2bSAoOCksCisuQlIgbHZtLmNvbmYgKDUpCmRpZmYgLS1naXQgYS9tYW4vbHZtY29uZmlnLjguaW4gYi9tYW4vbHZtY29uZmlnLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNmFiZAotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm1jb25maWcuOC5pbgpAQCAtMCwwICsxLDIyNSBAQAorLlRIICJMVk1DT05GSUciICI4IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorLlNIICJOQU1FIgorbHZtY29uZmlnLCBsdm0gZHVtcGNvbmZpZywgbHZtIGNvbmZpZyBcKGVtIERpc3BsYXkgTFZNIGNvbmZpZ3VyYXRpb24gCisuU0ggU1lOT1BTSVMKKy4KKy5hZCBsCisuQiBsdm1jb25maWcKKy5SQiBbIFwtZiB8IFwtXC1maWxlCisuSVIgRmlsZW5hbWUgXQorLlJCIFsgXC1cLXR5cGUKKy5SQiB7IGN1cnJlbnQgfCBkZWZhdWx0IHwgZGlmZiB8IGZ1bGwgfFw6IGxpc3QgfCBtaXNzaW5nIHwgbmV3IFxjCisuUkIgfCBwcm9maWxhYmxlIHwgcHJvZmlsYWJsZS1jb21tYW5kIHwgcHJvZmlsYWJsZS1tZXRhZGF0YSB9XQorLlJCIFsgXC1cLWF0dmVyc2lvbgorLklSIFZlcnNpb24gXQorLlJCIFsgXC1cLXNpbmNldmVyc2lvbgorLklSIFZlcnNpb24gXQorLlJCIFsgXC1cLWlnbm9yZWFkdmFuY2VkIF0KKy5SQiBbIFwtXC1pZ25vcmV1bnN1cHBvcnRlZCBdCisuUkIgWyBcLVwtaWdub3JlbG9jYWwgXQorLlJCIFsgXC1sIHwgXC1cLWxpc3QgXQorLlJCIFsgXC1cLWNvbmZpZworLklSIENvbmZpZ3VyYXRpb25TdHJpbmcgXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1cLXByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLVwtbWV0YWRhdGFwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1cLW1lcmdlZGNvbmZpZyBdCisuUkIgWyBcLVwtc2hvd2RlcHJlY2F0ZWQgXQorLlJCIFsgXC1cLXNob3d1bnN1cHBvcnRlZCBdCisuUkIgWyBcLVwtdmFsaWRhdGUgXQorLlJCIFsgXC1cLXdpdGhzdW1tYXJ5IF0KKy5SQiBbIFwtXC13aXRoY29tbWVudHMgXQorLlJCIFsgXC1cLXdpdGhzcGFjZXMgXQorLlJCIFsgXC1cLXdpdGh2ZXJzaW9ucyBdCisuUkIgWyBDb25maWd1cmF0aW9uTm9kZS4uLiBdCisuYWQgYgorLgorLlNIIERFU0NSSVBUSU9OCitsdm1jb25maWcgcHJvZHVjZXMgZm9ybWF0dGVkIG91dHB1dCBmcm9tIHRoZSBMVk0gY29uZmlndXJhdGlvbiB0cmVlLgorVGhlIGNvbW1hbmQgd2FzIGFkZGVkIGluIHJlbGVhc2UgMi4wMi4xMTkgYW5kIGhhcyBhbiBpZGVudGljYWwgbG9uZ2VyIGZvcm0gCitcZkJsdm0gZHVtcGNvbmZpZ1xmUC4KKworLlNIIE9QVElPTlMKKy5UUAorLkJSIFwtZiAiLCAiIFwtXC1maWxlICIgXGZJRmlsZW5hbWUiCitTZW5kIG91dHB1dCB0byBhIGZpbGUgbmFtZWQgJ2ZpbGVuYW1lJy4KKworLlRQCisuQlIgXC1sICIsICIgXC1cLWxpc3QKK0xpc3QgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB3aXRoIHN1bW1hcml6aW5nIGNvbW1lbnQuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdXNpbmcKK1xmQmx2bWNvbmZpZyAtLXR5cGUgbGlzdCAtLXdpdGhzdW1tYXJ5XGZQLgorCisuVFAKKy5CUiBcLVwtdHlwZSAiIHsiIGN1cnJlbnQgfCBkZWZhdWx0IHwgZGlmZiB8IGZ1bGwgfCBtaXNzaW5nIHwgbmV3IHwgcHJvZmlsYWJsZSB8XDogcHJvZmlsYWJsZS1jb21tYW5kIHwgcHJvZmlsYWJsZS1tZXRhZGF0YSB9CitTZWxlY3QgdGhlIHR5cGUgb2YgY29uZmlndXJhdGlvbiB0byBkaXNwbGF5LiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncworZGlzcGxheWVkIGhhdmUgZWl0aGVyIGRlZmF1bHQgdmFsdWVzIG9yIGN1cnJlbnRseS11c2VkIHZhbHVlcyBhc3NpZ25lZCBiYXNlZCBvbgordGhlIHR5cGUgc2VsZWN0ZWQuIElmIG5vIHR5cGUgaXMgc2VsZWN0ZWQsIFxmQlwtXC10eXBlIGN1cnJlbnRcZlAgaXMgdXNlZAorYnkgZGVmYXVsdC4gV2hlbmV2ZXIgYSBjb25maWd1cmF0aW9uIHNldHRpbmcgd2l0aCBhIGRlZmF1bHQgdmFsdWUgaXMKK2NvbW1lbnRlZCBvdXQsIGl0IG1lYW5zIHRoZSBzZXR0aW5nIGRvZXMgbm90IGhhdmUgYW55IGNvbmNyZXRlIGRlZmF1bHQKK3ZhbHVlIGRlZmluZWQuIE91dHB1dCBjYW4gYmUgc2F2ZWQgYW5kIHVzZWQgYXMgYSBwcm9wZXIgXGZCbHZtLmNvbmZcZlAoNSkKK2ZpbGUuCisuUlMKKy5JUCBcZkJjdXJyZW50XGZQIDMKK0Rpc3BsYXkgdGhlIGN1cnJlbnQgXGZCbHZtLmNvbmZcZlAgY29uZmlndXJhdGlvbiBtZXJnZWQgd2l0aCBhbnkgXGZCdGFnCitjb25maWdcZlAgaWYgdXNlZC4gU2VlIGFsc28gXGZCbHZtLmNvbmZcZlAoNSkgZm9yIG1vcmUgaW5mbyBhYm91dCBMVk0KK2NvbmZpZ3VyYXRpb24gbWV0aG9kcy4KKy5JUCBcZkJkZWZhdWx0XGZQIDMKK0Rpc3BsYXkgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgd2l0aCBkZWZhdWx0IHZhbHVlcyBhc3NpZ25lZC4KKy5JUCBcZkJkaWZmXGZQIDMKK0Rpc3BsYXkgYWxsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHdoaWNoIHRoZSB2YWx1ZXMgdXNlZCBkaWZmZXIgZnJvbSBkZWZhdWx0cy4KK1RoZSB2YWx1ZSBhc3NpZ25lZCBmb3IgZWFjaCBjb25maWd1cmF0aW9uIHNldHRpbmcgaXMgdGhlIHZhbHVlIGN1cnJlbnRseSB1c2VkLgorVXNpbmcgdGhpcyB0eXBlIGFsc28gaW1wbGllcyB0aGUgdXNlIG9mIFxmQlwtXC1tZXJnZWRjb25maWdcZlAgb3B0aW9uLgorVGhpcyBpcyBhY3R1YWxseSBtaW5pbWFsIExWTSBjb25maWd1cmF0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGhvdXQKK2EgY2hhbmdlIHRvIGN1cnJlbnQgY29uZmlndXJlZCBiZWhhdmlvdXIuCisuSVAgXGZCZnVsbFxmUCAzCitEaXNwbGF5IGZ1bGwgY29uZmlndXJhdGlvbiB0cmVlIC0gYSBjb21iaW5hdGlvbiBvZiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdHJlZQorKFxmQlwtXC10eXBlIGN1cnJlbnRcZlApIGFuZCB0cmVlIG9mIHNldHRpbmdzIGZvciB3aGljaCBkZWZhdWx0IHZhbHVlcyBhcmUKK3VzZWQgKFxmQlwtXC10eXBlIG1pc3NpbmdcZlApLiBUaGlzIGlzIGV4YWN0bHkgdGhlIGNvbmZpZ3VyYXRpb24gdHJlZSB0aGF0CitMVk0yIHVzZXMgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uLiBVc2luZyB0aGlzIHR5cGUgYWxzbyBpbXBsaWVzCit0aGUgdXNlIG9mIFxmQlwtXC1tZXJnZWRjb25maWdcZlAgb3B0aW9uLiBJZiBjb21tZW50cyBhcmUgZGlzcGxheWVkCisoc2VlIFxmQlwtXC13aXRoY29tbWVudHNcZlAgYW5kIFxmQlwtXC13aXRoc3VtbWFyeVxmUCBvcHRpb25zKSwgdGhlbgorZm9yIGVhY2ggc2V0dGluZyBmb3VuZCBpbiBleGlzdGluZyBjb25maWd1cmF0aW9uIGFuZCBmb3Igd2hpY2ggZGVmYXVsdHMKK2FyZSBub3QgdXNlZCwgdGhlcmUncyBhbiBleHRyYSBjb21tZW50IGxpbmUgcHJpbnRlZCB0byBkZW5vdGUgdGhpcy4KKy5JUCBcZkJsaXN0XGZQIDMKK0Rpc3BsYXkgcGxhaW4gbGlzdCBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorLklQIFxmQm1pc3NpbmdcZlAgMworRGlzcGxheSBhbGwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFzc2lnbmVkIHdoaWNoIGFyZQorbWlzc2luZyBpbiB0aGUgY29uZmlndXJhdGlvbiBjdXJyZW50bHkgdXNlZCBhbmQgZm9yIHdoaWNoIExWTSBhdXRvbWF0aWNhbGx5CitmYWxsYmFja3MgdG8gdXNpbmcgdGhlc2UgZGVmYXVsdCB2YWx1ZXMuCisuSVAgXGZCbmV3XGZQIDMKK0Rpc3BsYXkgYWxsIG5ldyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGludHJvZHVjZWQgaW4gY3VycmVudCBMVk0gdmVyc2lvbgorb3Igc3BlY2lmaWMgdmVyc2lvbiBhcyBkZWZpbmVkIGJ5IFxmQlwtXC1hdHZlcnNpb25cZlAgb3B0aW9uLgorLklQIFxmQnByb2ZpbGFibGVcZlAgMworRGlzcGxheSBhbGwgcHJvZmlsYWJsZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYXNzaWduZWQuCitTZWUgXGZCbHZtLmNvbmZcZlAoNSkgZm9yIG1vcmUgaW5mbyBhYm91dCBcZkJwcm9maWxlIGNvbmZpZ1xmUCBtZXRob2QuCisuSVAgXGZCcHJvZmlsYWJsZS1jb21tYW5kXGZQIDMKK0Rpc3BsYXkgYWxsIHByb2ZpbGFibGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFzc2lnbmVkCit0aGF0IGNhbiBiZSB1c2VkIGluIGNvbW1hbmQgcHJvZmlsZS4gVGhpcyBpcyBhIHN1YnNldCBvZiBzZXR0aW5ncyBkaXNwbGF5ZWQKK2J5IFxmQlwtXC10eXBlIHByb2ZpbGFibGVcZlAuCisuSVAgXGZCcHJvZmlsYWJsZS1tZXRhZGF0YVxmUCAzCitEaXNwbGF5IGFsbCBwcm9maWxhYmxlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgd2l0aCBkZWZhdWx0IHZhbHVlcyBhc3NpZ25lZAordGhhdCBjYW4gYmUgdXNlZCBpbiBtZXRhZGF0YSBwcm9maWxlLiBUaGlzIGlzIGEgc3Vic2V0IG9mIHNldHRpbmdzIGRpc3BsYXllZAorYnkgXGZCXC1cLXR5cGUgcHJvZmlsYWJsZVxmUC4KKy5SRQorCisuVFAKKy5CSSBcLVwtYXR2ZXJzaW9uICIgVmVyc2lvbiIKK1NwZWNpZnkgYW4gTFZNIHZlcnNpb24gaW4geC55LnogZm9ybWF0IHdoZXJlIHggaXMgdGhlIG1ham9yIHZlcnNpb24sCit0aGUgeSBpcyB0aGUgbWlub3IgdmVyc2lvbiBhbmQgeiBpcyB0aGUgcGF0Y2hsZXZlbCAoZS5nLiAyLjIuMTA2KS4KK1doZW4gY29uZmlndXJhdGlvbiBpcyBkaXNwbGF5ZWQsIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHJlY29nbml6ZWQKK2F0IHRoaXMgTFZNIHZlcnNpb24gd2lsbCBiZSBjb25zaWRlcmVkIG9ubHkuIFRoaXMgY2FuIGJlIHVzZWQKK3RvIGRpc3BsYXkgYSBjb25maWd1cmF0aW9uIHRoYXQgYSBjZXJ0YWluIExWTSB2ZXJzaW9uIHVuZGVyc3RhbmRzIGFuZAord2hpY2ggZG9lcyBub3QgY29udGFpbiBhbnkgbmV3ZXIgc2V0dGluZ3MgZm9yIHdoaWNoIExWTSB3b3VsZAoraXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBjaGVja2luZyB0aGUgY29uZmlndXJhdGlvbi4KKworLlRQCisuQkkgXC1cLXNpbmNldmVyc2lvbiAiIFZlcnNpb24iCitTcGVjaWZ5IGFuIExWTSB2ZXJzaW9uIGluIHgueS56IGZvcm1hdCB3aGVyZSB4IGlzIHRoZSBtYWpvciB2ZXJzaW9uLAordGhlIHkgaXMgdGhlIG1pbm9yIHZlcnNpb24gYW5kIHogaXMgdGhlIHBhdGNobGV2ZWwgKGUuZy4gMi4yLjEwNikuCitUaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgYXBwbGljYWJsZSBvbmx5IHdpdGggXGZCXC1cLXR5cGUgbmV3XGZQCit0byBkaXNwbGF5IGFsbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGludHJvZHVjZWQgc2luY2UgZ2l2ZW4gdmVyc2lvbi4KKworLlRQCisuQiBcLVwtaWdub3JlYWR2YW5jZWQKK0V4Y2x1ZGUgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmcm9tIHRoZSBvdXRwdXQuCisKKy5UUAorLkIgXC1cLWlnbm9yZXVuc3VwcG9ydGVkCitFeGNsdWRlIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgb3V0cHV0LiBUaGVzZSBzZXR0aW5ncyBhcmUKK2VpdGhlciB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIGRldmVsb3BtZW50IHB1cnBvc2VzIG9ubHkgb3IgdGhlaXIgc3VwcG9ydCBpcyBub3QKK3lldCBjb21wbGV0ZSBhbmQgdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgaW4gcHJvZHVjdGlvbi4gVGhlIFxmQmN1cnJlbnRcZlAKK2FuZCBcZkJkaWZmXGZQIHR5cGVzIGluY2x1ZGUgdW5zdXBwb3J0ZWQgc2V0dGluZ3MgaW4gdGhlaXIgb3V0cHV0IGJ5IGRlZmF1bHQsCithbGwgdGhlIG90aGVyIHR5cGVzIGlnbm9yZSB1bnN1cHBvcnRlZCBzZXR0aW5ncy4KKworLlRQCisuQiBcLVwtaWdub3JlbG9jYWwKK0lnbm9yZSBsb2NhbCBzZWN0aW9uLgorCisuVFAKKy5CSSBcLVwtY29uZmlnICIgQ29uZmlndXJhdGlvblN0cmluZyIKK1VzZSBcZklDb25maWd1cmF0aW9uU3RyaW5nXGZQIHRvIG92ZXJyaWRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCitUaGlzIGNvbmZpZ3VyYXRpb24gaXMgdGhlbiBhcHBsaWVkIGZvciB0aGUgbHZtY29uZmlnIGNvbW1hbmQgaXRzZWxmLgorU2VlIGFsc28gXGZCbHZtLmNvbmZcZlAoNSkgZm9yIG1vcmUgaW5mbyBhYm91dCBcZkJjb25maWcgY2FzY2FkZVxmUC4KKworLlRQCisuQkkgXC1cLWNvbW1hbmRwcm9maWxlICIgUHJvZmlsZU5hbWUiCitVc2UgXGZJUHJvZmlsZU5hbWVcZlAgdG8gb3ZlcnJpZGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbi4KK1RoaXMgY29uZmlndXJhdGlvbiBpcyB0aGVuIGFwcGxpZWQgZm9yIHRoZSBsdm1jb25maWcgY29tbWFuZCBpdHNlbGYuCitTZWUgYWxzbyBcZkJcLVwtbWVyZ2VkY29uZmlnXGZQIG9wdGlvbiBhbmQgXGZCbHZtLmNvbmZcZlAoNSkgZm9yCittb3JlIGluZm8gYWJvdXQgXGZCY29uZmlnIGNhc2NhZGVcZlAuCisKKy5UUAorLkJJIFwtXC1wcm9maWxlICIgUHJvZmlsZU5hbWUiCitUaGUgc2FtZSBhcyB1c2luZyBcZkJcLVwtY29tbWFuZHByb2ZpbGVcZlAgYnV0IHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdAorYXBwbGllZCBmb3IgdGhlIGx2bWNvbmZpZyBjb21tYW5kIGl0c2VsZi4KKworLlRQCisuQkkgXC1cLW1ldGFkYXRhcHJvZmlsZSAiIFByb2ZpbGVOYW1lIgorVXNlIFxmSVByb2ZpbGVOYW1lXGZQIHRvIG92ZXJyaWRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCitUaGUgY29uZmlndXJhdGlvbiBkZWZpbmVkIGluIG1ldGFkYXRhIHByb2ZpbGUgaGFzIG5vIGVmZmVjdCBmb3IKK3RoZSBsdm1jb25maWcgY29tbWFuZCBpdHNlbGYuIGx2bWNvbmZpZyBkaXNwbGF5cyB0aGUgY29uZmlndXJhdGlvbiBvbmx5LgorU2VlIGFsc28gXGZCXC1cLW1lcmdlZGNvbmZpZ1xmUCBvcHRpb24gYW5kIFxmQmx2bS5jb25mXGZQKDUpIGZvciBtb3JlCitpbmZvIGFib3V0IFxmQmNvbmZpZyBjYXNjYWRlXGZQLgorCisuVFAKKy5CIFwtXC1tZXJnZWRjb25maWcKK1doZW4gdGhlIGx2bWNvbmZpZyBjb21tYW5kIGlzIHJ1biB3aXRoIHRoZSBcZkJcLVwtY29uZmlnXGZQIG9wdGlvbgorYW5kL29yIFxmQlwtXC1jb21tYW5kcHJvZmlsZVxmUCAob3IgdXNpbmcgXGZCTFZNX0NPTU1BTkRfUFJPRklMRVxmUAorZW52aXJvbm1lbnQgdmFyaWFibGUpLCBcZkJcLVwtcHJvZmlsZVxmUCwgXGZCXC1cLW1ldGFkYXRhcHJvZmlsZVxmUAorb3B0aW9uLCBtZXJnZSBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBcZkJjb25maWcgY2FzY2FkZVxmUCBiZWZvcmUgZGlzcGxheWluZyBpdC4KK1dpdGhvdXQgdGhlIFxmQlwtXC1tZXJnZWNvbmZpZ1xmUCBvcHRpb24gdXNlZCwgb25seSB0aGUgY29uZmlndXJhdGlvbiBhdAordGhlIGZyb250IG9mIHRoZSBjYXNjYWRlIGlzIGRpc3BsYXllZC4gU2VlIGFsc28gXGZCbHZtLmNvbmZcZlAoNSkgZm9yIG1vcmUKK2luZm8gYWJvdXQgXGZCY29uZmlnIGNhc2NhZGVcZlAuCisKKy5UUAorLkIgXC1cLXNob3dkZXByZWNhdGVkCitJbmNsdWRlIGRlcHJlY2F0ZWQgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBpbiB0aGUgb3V0cHV0LiBUaGVzZSBzZXR0aW5ncworYXJlIGFsd2F5cyBkZXByZWNhdGVkIHNpbmNlIGNlcnRhaW4gdmVyc2lvbi4gSWYgY29uY3JldGUgdmVyc2lvbiBpcyBzcGVjaWZpZWQKK3dpdGggXGZCLS1hdHZlcnNpb25cZlAgb3B0aW9uLCBkZXByZWNhdGVkIHNldHRpbmdzIGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkCitpZiBzcGVjaWZpZWQgdmVyc2lvbiBpcyBsb3dlciB0aGF0IHRoZSB2ZXJzaW9uIGluIHdoaWNoIHRoZSBzZXR0aW5ncyB3ZXJlCitkZXByZWNhdGVkLiBUaGUgXGZCY3VycmVudFxmUCBhbmQgXGZCZGlmZlxmUCB0eXBlcyBpbmNsdWRlIGRlcHJlY2F0ZWQgc2V0dGluZ3MKK2ludCB0aGVpciBvdXRwdXQgYnkgZGVmYXVsdCwgYWxsIHRoZSBvdGhlciB0eXBlcyBpZ25vcmUgZGVwcmVjYXRlZCBzZXR0aW5ncy4KKworLlRQCisuQiBcLVwtc2hvd3Vuc3VwcG9ydGVkCitJbmNsdWRlIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gdGhlIG91dHB1dC4gVGhlc2Ugc2V0dGluZ3MKK2FyZSBlaXRoZXIgdXNlZCBmb3IgZGVidWdnaW5nIG9yIGRldmVsb3BtZW50IHB1cnBvc2VzIG9ubHkgb3IgdGhlaXIgc3VwcG9ydAoraXMgbm90IHlldCBjb21wbGV0ZSBhbmQgdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgaW4gcHJvZHVjdGlvbi4gVGhlCitcZkJjdXJyZW50XGZQIGFuZCBcZkJkaWZmXGZQIHR5cGVzIGluY2x1ZGUgdW5zdXBwb3J0ZWQgc2V0dGluZ3MgaW4gdGhlaXIKK291dHB1dCBieSBkZWZhdWx0LCBhbGwgdGhlIG90aGVyIHR5cGVzIGlnbm9yZSB1bnN1cHBvcnRlZCBzZXR0aW5ncy4KKworLlRQCisuQiBcLVwtdmFsaWRhdGUKK1ZhbGlkYXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB1c2VkIGFuZCBleGl0IHdpdGggYXBwcm9wcmlhdGUKK3JldHVybiBjb2RlLiBUaGUgdmFsaWRhdGlvbiBpcyBkb25lIG9ubHkgZm9yIHRoZSBjb25maWd1cmF0aW9uCithdCB0aGUgZnJvbnQgb2YgdGhlIFxmQmNvbmZpZyBjYXNjYWRlXGZQLiBUbyB2YWxpZGF0ZSB0aGUgd2hvbGUKK21lcmdlZCBjb25maWd1cmF0aW9uIHRyZWUsIHVzZSBhbHNvIHRoZSBcZkJcLVwtbWVyZ2VkY29uZmlnXGZQIG9wdGlvbi4KK1RoZSB2YWxpZGF0aW9uIGlzIGRvbmUgZXZlbiBpZiBcZkJjb25maWcvY2hlY2tzXGZQIFxmQmx2bS5jb25mXGZQKDUpCitvcHRpb24gaXMgZGlzYWJsZWQuCisKKy5UUAorLkIgXC1cLXdpdGhzdW1tYXJ5CitEaXNwbGF5IGEgb25lIGxpbmUgY29tbWVudCBmb3IgZWFjaCBjb25maWd1cmF0aW9uIG5vZGUuCisKKy5UUAorLkIgXC1cLXdpdGhjb21tZW50cworRGlzcGxheSBhIGZ1bGwgY29tbWVudCBmb3IgZWFjaCBjb25maWd1cmF0aW9uIG5vZGUuIEZvciBkZXByZWNhdGVkCitzZXR0aW5ncywgYWxzbyBkaXNwbGF5IGNvbW1lbnRzIGFib3V0IGRlcHJlY2F0aW9uIGluIGFkZGl0aW9uLgorCisuVFAKKy5CIFwtXC13aXRoc3BhY2VzCitXaGVyZSBhcHByb3ByaWF0ZSwgYWRkIG1vcmUgc3BhY2VzIGluIG91dHB1dCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgorCisuVFAKKy5CIFwtXC13aXRodmVyc2lvbnMKK0Fsc28gZGlzcGxheSBhIGNvbW1lbnQgY29udGFpbmluZyB0aGUgdmVyc2lvbiBvZiBpbnRyb2R1Y3Rpb24gZm9yCitlYWNoIGNvbmZpZ3VyYXRpb24gbm9kZS4gSWYgdGhlIHNldHRpbmcgaXMgZGVwcmVjYXRlZCwgYWxzbyBkaXNwbGF5Cit0aGUgdmVyc2lvbiBzaW5jZSB3aGljaCBpdCBpcyBkZXByZWNhdGVkLgorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpCisuQlIgbHZtY29uZiAoOCkKKy5CUiBsdm0uY29uZiAoNSkKZGlmZiAtLWdpdCBhL21hbi9sdm1kYnVzZC44LmluIGIvbWFuL2x2bWRidXNkLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMzVmNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm1kYnVzZC44LmluCkBAIC0wLDAgKzEsMzggQEAKKy5USCBMVk1EQlVTRCA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCBJbmMiIFwiIC0qLSBucm9mZiAtKi0KKy4KKy5TSCBOQU1FCisuCitsdm1kYnVzZCBcKGVtIExWTSBELUJ1cyBkYWVtb24KKy4KKy5TSCBTWU5PUFNJUworLgorLmFkIGwKKy5CIGx2bWRidXNkCisuUkIgWyBcLVwtZGVidWcgXF0KKy5SQiBbIFwtXC11ZGV2IFxdCisuYWQgYgorLgorLlNIIERFU0NSSVBUSU9OCisuCitsdm1kYnVzZCBpcyBhIHNlcnZpY2Ugd2hpY2ggcHJvdmlkZXMgYSBELUJ1cyBBUEkgdG8gdGhlIGxvZ2ljYWwgdm9sdW1lIG1hbmFnZXIgKExWTSkuCitSdW4gCisuQlIgbHZtZGJ1c2QgKDgpCithcyByb290LgorLgorLlNIIE9QVElPTlMKKy4KKy5IUAorLkJSIFwtXC1kZWJ1ZyAKKy5icgorRW5hYmxlIGRlYnVnIHN0YXRlbWVudHMgCisuCisuSFAKKy5CUiBcLVwtdWRldgorLmJyCitVc2UgdWRldiBldmVudHMgdG8gdHJpZ2dlciB1cGRhdGVzCisuCisuU0ggU0VFIEFMU08KKy4KKy5uaAorLkJSIGRidXMtc2VuZCAoMSksCisuQlIgbHZtICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2bWRpc2tzY2FuLjguaW4gYi9tYW4vbHZtZGlza3NjYW4uOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUzNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bWRpc2tzY2FuLjguaW4KQEAgLTAsMCArMSwyNyBAQAorLlRIIExWTURJU0tTQ0FOIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZtZGlza3NjYW4gXChlbSBzY2FuIGZvciBhbGwgZGV2aWNlcyB2aXNpYmxlIHRvIExWTTIKKy5TSCBTWU5PUFNJUworLkIgbHZtZGlza3NjYW4KKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLWwgfCBcLVwtbHZtcGFydGl0aW9uIF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5TSCBERVNDUklQVElPTgorbHZtZGlza3NjYW4gc2NhbnMgYWxsIFNDU0ksIChFKUlERSBkaXNrcywgbXVsdGlwbGUgZGV2aWNlcyBhbmQgYSBidW5jaAorb2Ygb3RoZXIgYmxvY2sgZGV2aWNlcyBpbiB0aGUgc3lzdGVtIGxvb2tpbmcgZm9yIExWTSBwaHlzaWNhbCB2b2x1bWVzLgorVGhlIHNpemUgcmVwb3J0ZWQgaXMgdGhlIHJlYWwgZGV2aWNlIHNpemUuCitEZWZpbmUgYSBmaWx0ZXIgaW4gXGZCbHZtLmNvbmZcZlAoNSkgdG8gcmVzdHJpY3QKK3RoZSBzY2FuIHRvIGF2b2lkIGEgQ0QgUk9NLCBmb3IgZXhhbXBsZS4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtbCAiLCAiIFwtXC1sdm1wYXJ0aXRpb24KK09ubHkgcmVwb3J0cyBQaHlzaWNhbCBWb2x1bWVzLgorLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiBsdm0uY29uZiAoNSksCisuQlIgcHZzY2FuICg4KSwKKy5CUiB2Z3NjYW4gKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZtZHVtcC44LmluIGIvbWFuL2x2bWR1bXAuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUxMDJlCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bWR1bXAuOC5pbgpAQCAtMCwwICsxLDExMiBAQAorLlRIIExWTURVTVAgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYy4iCisuU0ggTkFNRQorbHZtZHVtcCBcKGVtIGNyZWF0ZSBsdm0yIGluZm9ybWF0aW9uIGR1bXBzIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzCisuU0ggU1lOT1BTSVMKKy5CIGx2bWR1bXAKKy5SQiBbIFwtYSBdCisuUkIgWyBcLWMgXQorLlJCIFsgXC1kCisuSVIgZGlyZWN0b3J5IF0KKy5SQiBbIFwtaCBdCisuUkIgWyBcLWwgXQorLlJCIFsgXC1tIF0KKy5SQiBbIFwtcCBdCisuUkIgWyBcLXMgXQorLlJCIFsgXC11IF0KKy5TSCBERVNDUklQVElPTgorbHZtZHVtcCBpcyBhIHRvb2wgdG8gZHVtcCB2YXJpb3VzIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgTFZNMi4KK0J5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSB0YXJiYWxsIHN1aXRhYmxlIGZvciBzdWJtaXNzaW9uIGFsb25nCit3aXRoIGEgcHJvYmxlbSByZXBvcnQuCisuUFAKK1RoZSBjb250ZW50IG9mIHRoZSB0YXJiYWxsIGlzIGFzIGZvbGxvd3M6CisuYnIKKy0gZG1zZXR1cCBpbmZvCisuYnIKKy0gdGFibGUgb2YgY3VycmVudGx5IHJ1bm5pbmcgcHJvY2Vzc2VzCisuYnIKKy0gcmVjZW50IGVudHJpZXMgZnJvbSAvdmFyL2xvZy9tZXNzYWdlcyAoY29udGFpbmluZyBzeXN0ZW0gbWVzc2FnZXMpCisuYnIKKy0gY29tcGxldGUgbHZtIGNvbmZpZ3VyYXRpb24gYW5kIGNhY2hlIChjb250ZW50IG9mIC9ldGMvbHZtKQorLmJyCistIGxpc3Qgb2YgZGV2aWNlIG5vZGVzIHByZXNlbnQgdW5kZXIgL2RldgorLmJyCistIGxpc3Qgb2YgZmlsZXMgcHJlc2VudCAvc3lzL2Jsb2NrCisuYnIKKy0gbGlzdCBvZiBmaWxlcyBwcmVzZW50IC9zeXMvZGV2aWNlcy92aXJ0dWFsL2Jsb2NrCisuYnIKKy0gaWYgZW5hYmxlZCB3aXRoIFwtbSwgbWV0YWRhdGEgZHVtcCB3aWxsIGJlIGFsc28gaW5jbHVkZWQKKy5icgorLSBpZiBlbmFibGVkIHdpdGggXC1hLCBkZWJ1ZyBvdXRwdXQgb2YgdmdzY2FuLCBwdnNjYW4gYW5kIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSB2b2x1bWUgZ3JvdXBzLCBwaHlzaWNhbCB2b2x1bWVzIGFuZCBsb2dpY2FsIHZvbHVtZXMgd2lsbCBiZSBpbmNsdWRlZAorLmJyCistIGlmIGVuYWJsZWQgd2l0aCBcLWMsIGNsdXN0ZXIgc3RhdHVzIGluZm8KKy5icgorLSBpZiBlbmFibGVkIHdpdGggXC1sLCBsdm1ldGFkIHN0YXRlIGlmIHJ1bm5pbmcKKy5icgorLSBpZiBlbmFibGVkIHdpdGggXC1wLCBsdm1wb2xsZCBzdGF0ZSBpZiBydW5uaW5nCisuYnIKKy0gaWYgZW5hYmxlZCB3aXRoIFwtcywgc3lzdGVtIGluZm8gYW5kIGNvbnRleHQKKy5icgorLSBpZiBlbmFibGVkIHdpdGggXC11LCB1ZGV2IGluZm8gYW5kIGNvbnRleHQKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtYQorQWR2YW5jZWQgY29sbGVjdGlvbi4KK1xmQldBUk5JTkdcZlI6IGlmIGx2bSBpcyBhbHJlYWR5IGh1bmcsIHRoZW4gdGhpcyBzY3JpcHQgbWF5IGhhbmcgYXMgd2VsbAoraWYgXGZCXC1hXGZSIGlzIHVzZWQuCisuVFAKKy5CIFwtYworSWYgY2x2bWQgaXMgcnVubmluZywgZ2F0aGVyIGNsdXN0ZXIgZGF0YSBhcyB3ZWxsLgorLlRQCisuQiBcLWQgIFxmSWRpcmVjdG9yeQorRHVtcCBpbnRvIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGFyYmFsbAorQnkgZGVmYXVsdCwgbHZtZHVtcCB3aWxsIHByb2R1Y2UgYSBzaW5nbGUgY29tcHJlc3NlZCB0YXJiYWxsIGNvbnRhaW5pbmcKK2FsbCB0aGUgaW5mb3JtYXRpb24uIFVzaW5nIHRoaXMgb3B0aW9uLCBpdCBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBvbmx5Citwcm9kdWNlIHRoZSByYXcgZHVtcCB0cmVlLCByb290ZWQgaW4gXGZJZGlyZWN0b3J5XGZQLgorLlRQCisuQiBcLWgKK1ByaW50IGhlbHAgbWVzc2FnZQorLlRQCisuQiBcLWwKK0luY2x1ZGUgXGZCbHZtZXRhZFxmUCg4KSBkYWVtb24gZHVtcCBpZiBpdCBpcyBydW5uaW5nLiBUaGUgZHVtcCBjb250YWlucworY2FjaGVkIGluZm9ybWF0aW9uIHRoYXQgaXMgY3VycmVudGx5IHN0b3JlZCBpbiBsdm1ldGFkOiBWRyBtZXRhZGF0YSwKK1BWIG1ldGFkYXRhIGFuZCB2YXJpb3VzIG1hcHBpbmdzIGluIGJldHdlZW4gdGhlc2UgbWV0YWRhdGEgZm9yIHF1aWNrCithY2Nlc3MuCisuVFAKKy5CIFwtbQorR2F0aGVyIExWTSBtZXRhZGF0YSBmcm9tIHRoZSBQVnMKK1RoaXMgb3B0aW9uIGdlbmVyYXRlcyBhIDE6MSBkdW1wIG9mIHRoZSBtZXRhZGF0YSBhcmVhIGZyb20gYWxsIFBWcyB2aXNpYmxlCit0byB0aGUgc3lzdGVtLCB3aGljaCBjYW4gY2F1c2UgdGhlIGR1bXAgdG8gaW5jcmVhc2UgaW4gc2l6ZSBjb25zaWRlcmFibHkuCitIb3dldmVyLCB0aGUgbWV0YWRhdGEgZHVtcCBtYXkgcmVwcmVzZW50IGEgdmFsdWFibGUgZGlhZ25vc3RpYyByZXNvdXJjZS4KKy5UUAorLkIgXC1wCitJbmNsdWRlIFxmQmx2bXBvbGxkXGZQKDgpIGRhZW1vbiBkdW1wIGlmIGl0IGlzIHJ1bm5pbmcuIFRoZSBkdW1wIGNvbnRhaW5zCithbGwgaW4tcHJvZ3Jlc3Mgb3BlcmF0aW9uIGN1cnJlbnRseSBtb25pdG9yZWQgYnkgdGhlIGRhZW1vbiBhbmQgcGFydGlhbAoraGlzdG9yeSBmb3IgYWxsIHlldCB1bmNvbGxlY3RlZCByZXN1bHRzIG9mIHBvbGxpbmcgb3BlcmF0aW9ucyBhbHJlYWR5IGZpbmlzaGVkCitpbmNsdWRpbmcgcmVhc29uLgorLlRQCisuQiBcLXMKK0dhdGhlciBzeXN0ZW0gaW5mbyBhbmQgY29udGV4dC4gQ3VycmVudGx5LCB0aGlzIGVuY29tcGFzc2VzIGluZm8gZ2F0aGVyZWQKK2J5IGNhbGxpbmcgbHNibGsgY29tbWFuZCBhbmQgdmFyaW91cyBzeXN0ZW1kIGluZm8gYW5kIGNvbnRleHQ6IG92ZXJhbGwgc3RhdGUKK29mIHN5c3RlbWQgdW5pdHMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBtb3JlIGRldGFpbGVkIHN0YXR1cyBvZiB1bml0cworY29udHJvbGxpbmcgTFZNIGZ1bmN0aW9uYWxpdHkgYW5kIHRoZSBjb250ZW50IG9mIHN5c3RlbWQgam91cm5hbCBmb3IKK2N1cnJlbnQgYm9vdC4KKy5UUAorLkIgXC11CitHYXRoZXIgdWRldiBpbmZvIGFuZCBjb250ZXh0OiAvZXRjL3VkZXYvdWRldi5jb25mIGZpbGUsIHVkZXYgZGFlbW9uIHZlcnNpb24KKyhvdXRwdXQgb2YgJ3VkZXZhZG0gaW5mbyBcLVwtdmVyc2lvbicgY29tbWFuZCksIHVkZXYgcnVsZXMgY3VycmVudGx5IHVzZWQgaW4gdGhlIHN5c3RlbQorKGNvbnRlbnQgb2YgL2xpYi91ZGV2L3J1bGVzLmQgYW5kIC9ldGMvdWRldi9ydWxlcy5kIGRpcmVjdG9yeSksCitsaXN0IG9mIGZpbGVzIGluIC9saWIvdWRldiBkaXJlY3RvcnkgYW5kIGR1bXAgb2YgY3VycmVudCB1ZGV2CitkYXRhYmFzZSBjb250ZW50ICh0aGUgb3V0cHV0IG9mICd1ZGV2YWRtIGluZm8gXC1cLWV4cG9ydFwtZGInIGNvbW1hbmQpLgorLlNIIEVOVklST05NRU5UIFZBUklBQkxFUworLlRQCitcZkJMVk1fQklOQVJZXGZQCitUaGUgTFZNMiBiaW5hcnkgdG8gdXNlLgorRGVmYXVsdHMgdG8gImx2bSIuCitTb21ldGltZXMgeW91IG1pZ2h0IG5lZWQgdG8gc2V0IHRoaXMgdG8gIi9zYmluL2x2bS5zdGF0aWMiLCBmb3IgZXhhbXBsZS4KKy5UUAorXGZCRE1TRVRVUF9CSU5BUllcZlAKK1RoZSBkbXNldHVwIGJpbmFyeSB0byB1c2UuCitEZWZhdWx0cyB0byAiZG1zZXR1cCIuCisuUFAKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdm1ldGFkLjguaW4gYi9tYW4vbHZtZXRhZC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODk1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtZXRhZC44LmluCkBAIC0wLDAgKzEsMTE2IEBACisuVEggTFZNRVRBRCA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCBJbmMiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitsdm1ldGFkIFwoZW0gTFZNIG1ldGFkYXRhIGNhY2hlIGRhZW1vbgorCisuU0ggU1lOT1BTSVMKKy5CIGx2bWV0YWQKKy5SQiBbIFwtbAorLklSIGxldmVsIFssbGV2ZWwuLi5dXQorLlJCIFsgXC1wCisuSVIgcGlkZmlsZV9wYXRoIF0KKy5SQiBbIFwtcworLklSIHNvY2tldF9wYXRoIF0KKy5SQiBbIFwtdAorLklSIHRpbWVvdXRfdmFsdWUgXQorLlJCIFsgXC1mIF0KKy5SQiBbIFwtaCBdCisuUkIgWyBcLVYgXQorLlJCIFsgXC0/IF0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBsdm1ldGFkIGRhZW1vbiBjYWNoZXMgTFZNIG1ldGFkYXRhLCBzbyB0aGF0IExWTSBjb21tYW5kcyBjYW4gcmVhZAorbWV0YWRhdGEgd2l0aG91dCBzY2FubmluZyBkaXNrcy4KKworTWV0YWRhdGEgY2FjaGluZyBjYW4gYmUgYW4gYWR2YW50YWdlIGJlY2F1c2Ugc2Nhbm5pbmcgZGlza3MgaXMgdGltZQorY29uc3VtaW5nIGFuZCBtYXkgaW50ZXJmZXJlIHdpdGggdGhlIG5vcm1hbCB3b3JrIG9mIHRoZSBzeXN0ZW0gYW5kIGRpc2tzLgorCitsdm1ldGFkIGRvZXMgbm90IHJlYWQgbWV0YWRhdGEgZnJvbSBkaXNrcyBpdHNlbGYuICBUaGUgJ3B2c2NhbiBcLVwtY2FjaGUnCitjb21tYW5kIHNjYW5zIGRpc2tzLCByZWFkcyB0aGUgTFZNIG1ldGFkYXRhIGFuZCBzZW5kcyBpdCB0byBsdm1ldGFkLgorCitOZXcgTFZNIGRpc2tzIHRoYXQgYXBwZWFyIG9uIHRoZSBzeXN0ZW0gbXVzdCBiZSBzY2FubmVkIGJ5IHB2c2NhbiBiZWZvcmUKK2x2bWV0YWQga25vd3MgYWJvdXQgdGhlbS4gIElmIGx2bWV0YWQgZG9lcyBub3Qga25vdyBhYm91dCBhIGRpc2ssIHRoZW4gTFZNCitjb21tYW5kcyB1c2luZyBsdm1ldGFkIHdpbGwgYWxzbyBub3Qga25vdyBhYm91dCBpdC4gIFdoZW4gZGlza3MgYXJlIGFkZGVkCitvciByZW1vdmVkIGZyb20gdGhlIHN5c3RlbSwgbHZtZXRhZCBtdXN0IGJlIHVwZGF0ZWQuCisKK2x2bWV0YWQgaXMgdXN1YWxseSBjb21iaW5lZCB3aXRoIGV2ZW50LWJhc2VkIHN5c3RlbSBzZXJ2aWNlcyB0aGF0CithdXRvbWF0aWNhbGx5IHJ1biBwdnNjYW4gXC1cLWNhY2hlIG9uIG5ldyBkaXNrcy4gIFRoaXMgd2F5LCB0aGUgbHZtZXRhZAorY2FjaGUgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkIHdpdGggbWV0YWRhdGEgZnJvbSBuZXcgZGlza3Mgd2hlbiB0aGV5CithcHBlYXIuICBMVk0gdWRldiBydWxlcyBhbmQgc3lzdGVtZCBzZXJ2aWNlcyBpbXBsZW1lbnQgdGhpcyBhdXRvbWF0aW9uLgorQXV0b21hdGljIHNjYW5uaW5nIGlzIHVzdWFsbHkgY29tYmluZWQgd2l0aCBhdXRvbWF0aWMgYWN0aXZhdGlvbi4gIEZvcgorbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisuQlIgcHZzY2FuICg4KS4KKworSWYgbHZtZXRhZCBpcyBzdGFydGVkIG9yIHJlc3RhcnRlZCBhZnRlciBkaXNrcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlCitzeXN0ZW0sIG9yIGlmIHRoZSBnbG9iYWxfZmlsdGVyIGhhcyBjaGFuZ2VkLCB0aGUgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGJ5CitydW5uaW5nICdwdnNjYW4gXC1cLWNhY2hlJy4KKworV2hlbiBsdm1ldGFkIGlzIG5vdCB1c2VkLCBMVk0gY29tbWFuZHMgcmV2ZXJ0IHRvIHNjYW5uaW5nIGRpc2tzIGZvciBMVk0KK21ldGFkYXRhLgorCitVc2Ugb2YgbHZtZXRhZCBpcyBlbmFibGVkL2Rpc2FibGVkIGJ5OgorLmJyCisuQlIgbHZtLmNvbmYgKDUpCisuQiBnbG9iYWwvdXNlX2x2bWV0YWQKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBzZXR0aW5nLCBzZWU6CisuYnIKKy5CIGx2bWNvbmZpZyBcLVwtd2l0aGNvbW1lbnRzIGdsb2JhbC91c2VfbHZtZXRhZAorCitUbyBpZ25vcmUgZGlza3MgZnJvbSBMVk0gYXQgdGhlIHN5c3RlbSBsZXZlbCwgZS5nLiBsdm1ldGFkLCBwdnNjYW4gdXNlOgorLmJyCisuQlIgbHZtLmNvbmYgKDUpCisuQiBkZXZpY2VzL2dsb2JhbF9maWx0ZXIKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBzZXR0aW5nLCBzZWUKKy5icgorLkIgbHZtY29uZmlnIFwtXC13aXRoY29tbWVudHMgZGV2aWNlcy9nbG9iYWxfZmlsdGVyCisKKy5TSCBPUFRJT05TCisKK1RvIHJ1biB0aGUgZGFlbW9uIGluIGEgdGVzdCBlbnZpcm9ubWVudCBib3RoIHRoZSBwaWRmaWxlX3BhdGggYW5kIHRoZQorc29ja2V0X3BhdGggc2hvdWxkIGJlIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdHMuCisuVFAKKy5CIFwtZgorRG9uJ3QgZm9yaywgYnV0IHJ1biBpbiB0aGUgZm9yZWdyb3VuZC4KKy5UUAorLkJSIFwtaCAiLCAiIFwtPworU2hvdyBoZWxwIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLWwgXGZJbGV2ZWxzCitTcGVjaWZ5IHRoZSBsZXZlbHMgb2YgbG9nIG1lc3NhZ2VzIHRvIGdlbmVyYXRlIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuCitNZXNzYWdlcyBhcmUgbG9nZ2VkIGJ5IHN5c2xvZy4KK0FkZGl0aW9uYWxseSwgd2hlbiBcLWYgaXMgZ2l2ZW4gdGhleSBhcmUgYWxzbyBzZW50IHRvIHN0YW5kYXJkIGVycm9yLgorUG9zc2libGUgbGV2ZWxzIGFyZTogYWxsLCBmYXRhbCwgZXJyb3IsIHdhcm4sIGluZm8sIHdpcmUsIGRlYnVnLgorLlRQCisuQiBcLXAgXGZJcGlkZmlsZV9wYXRoCitQYXRoIHRvIHRoZSBwaWRmaWxlLiBUaGlzIG92ZXJyaWRlcyBib3RoIHRoZSBidWlsdC1pbiBkZWZhdWx0CisoI0RFRkFVTFRfUElEX0RJUiMvbHZtZXRhZC5waWQpIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK1xmQkxWTV9MVk1FVEFEX1BJREZJTEVcZlAuICBUaGlzIGZpbGUgaXMgdXNlZCB0byBwcmV2ZW50IG1vcmUKK3RoYW4gb25lIGluc3RhbmNlIG9mIHRoZSBkYWVtb24gcnVubmluZyBzaW11bHRhbmVvdXNseS4KKy5UUAorLkIgXC1zIFxmSXNvY2tldF9wYXRoCitQYXRoIHRvIHRoZSBzb2NrZXQgZmlsZS4gVGhpcyBvdmVycmlkZXMgYm90aCB0aGUgYnVpbHQtaW4gZGVmYXVsdAorKCNERUZBVUxUX1JVTl9ESVIjL2x2bWV0YWQuc29ja2V0KSBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitcZkJMVk1fTFZNRVRBRF9TT0NLRVRcZlAuICBUbyBjb21tdW5pY2F0ZSBzdWNjZXNzZnVsbHkgd2l0aCBsdm1ldGFkLAorYWxsIExWTTIgcHJvY2Vzc2VzIHNob3VsZCB1c2UgdGhlIHNhbWUgc29ja2V0IHBhdGguCisuVFAKKy5CIFwtdCBcZkl0aW1lb3V0X3ZhbHVlCitUaGUgZGFlbW9uIG1heSBzaHV0ZG93biBhZnRlciBiZWluZyBpZGxlIGZvciB0aGUgZ2l2ZW4gdGltZSAoaW4gc2Vjb25kcykuIFdoZW4gdGhlCitvcHRpb24gaXMgb21pdHRlZCBvciB0aGUgdmFsdWUgZ2l2ZW4gaXMgemVybyB0aGUgZGFlbW9uIG5ldmVyIHNodXRkb3ducyBvbiBpZGxlLgorLlRQCisuQiBcLVYKK0Rpc3BsYXkgdGhlIHZlcnNpb24gb2YgbHZtZXRhZCBkYWVtb24uCisuU0ggRU5WSVJPTk1FTlQgVkFSSUFCTEVTCisuVFAKKy5CIExWTV9MVk1FVEFEX1BJREZJTEUKK1BhdGggZm9yIHRoZSBwaWQgZmlsZS4KKy5UUAorLkIgTFZNX0xWTUVUQURfU09DS0VUIAorUGF0aCBmb3IgdGhlIHNvY2tldCBmaWxlLgorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIGx2bWNvbmZpZyAoOCksCisuQlIgbHZtLmNvbmYgKDUpLAorLkJSIHB2c2NhbiAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdm1sb2NrY3RsLjguaW4gYi9tYW4vbHZtbG9ja2N0bC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjU2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtbG9ja2N0bC44LmluCkBAIC0wLDAgKzEsMTAyIEBACisuVEggIkxWTUxPQ0tDVEwiICI4IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorCisuU0ggTkFNRQorbHZtbG9ja2N0bCBcKGVtIENvbnRyb2wgZm9yIGx2bWxvY2tkIAorCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgY29tbWFuZCBpbnRlcmFjdHMgd2l0aAorLkJSIGx2bWxvY2tkICg4KS4KKworLlNIIE9QVElPTlMKKworbHZtbG9ja2N0bCBbb3B0aW9uc10KKworLkIgIFwtXC1oZWxwIHwgXC1oCisgICAgICAgIFNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uLgorCisuQiAgXC1cLXF1aXQgfCBcLXEKKyAgICAgICAgVGVsbCBsdm1sb2NrZCB0byBxdWl0LgorCisuQiAgXC1cLWluZm8gfCBcLWkKKyAgICAgICAgUHJpbnQgbG9jayBzdGF0ZSBpbmZvcm1hdGlvbiBmcm9tIGx2bWxvY2tkLgorCisuQiAgXC1cLWR1bXAgfCBcLWQKKyAgICAgICAgUHJpbnQgbG9nIGJ1ZmZlciBmcm9tIGx2bWxvY2tkLgorCisuQiAgXC1cLXdhaXQgfCBcLXcgMHwxCisgICAgICAgIFdhaXQgb3B0aW9uIGZvciBvdGhlciBjb21tYW5kcy4KKworLkIgIFwtXC1mb3JjZSB8IFwtZiAwfDEKKyAgICAgICAgRm9yY2Ugb3B0aW9uIGZvciBvdGhlciBjb21tYW5kcy4KKworLkIgIFwtXC1raWxsIHwgXC1rCisuSSB2Z25hbWUKKyAgICAgICAgS2lsbCBhY2Nlc3MgdG8gdGhlIFZHIHdoZW4gc2FubG9jayBjYW5ub3QgcmVuZXcgbGVhc2UuCisKKy5CICBcLVwtZHJvcCB8IFwtcgorLkkgdmduYW1lCisgICAgICAgIENsZWFyIGxvY2tzIGZvciB0aGUgVkcgd2hlbiBpdCBpcyB1bnVzZWQgYWZ0ZXIga2lsbCAoLWspLgorCisuQiAgXC1cLWdsXC1lbmFibGUgfCBcLUUKKy5JIHZnbmFtZQorICAgICAgICBUZWxsIGx2bWxvY2tkIHRvIGVuYWJsZSB0aGUgZ2xvYmFsIGxvY2sgaW4gYSBzYW5sb2NrIFZHLgorCisuQiAgXC1cLWdsXC1kaXNhYmxlIHwgXC1ECisuSSB2Z25hbWUKKyAgICAgICAgVGVsbCBsdm1sb2NrZCB0byBkaXNhYmxlIHRoZSBnbG9iYWwgbG9jayBpbiBhIHNhbmxvY2sgVkcuCisKKy5CICBcLVwtc3RvcFwtbG9ja3NwYWNlcyB8IFwtUworICAgICAgICBTdG9wIGFsbCBsb2Nrc3BhY2VzLgorCisKKy5TSCBVU0FHRQorCisuU1MgaW5mbworCitUaGlzIGNvbGxlY3RzIGFuZCBkaXNwbGF5cyBsb2NrIHN0YXRlIGZyb20gbHZtbG9ja2QuICBUaGUgZGlzcGxheSBpcworcHJpbWl0aXZlLCBpbmNvbXBsZXRlIGFuZCB3aWxsIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbi4gIFRvIHByaW50IHRoZSByYXcKK2xvY2sgc3RhdGUgZnJvbSBsdm1sb2NrZCwgY29tYmluZSB0aGlzIG9wdGlvbiB3aXRoIC0tZHVtcHwtZC4KKworLlNTIGR1bXAKKworVGhpcyBjb2xsZWN0cyB0aGUgY2lyY3VsYXIgbG9nIGJ1ZmZlciBvZiBkZWJ1ZyBzdGF0ZW1lbnRzIGZyb20gbHZtbG9ja2QKK2FuZCBwcmludHMgaXQuCisKKy5TUyBraWxsCisKK1RoaXMgaXMgcnVuIGJ5IHNhbmxvY2sgd2hlbiBpdCBsb3NlcyBhY2Nlc3MgdG8gdGhlIHN0b3JhZ2UgaG9sZGluZyBsZWFzZXMKK2ZvciBhIFZHLiAgSXQgY3VycmVudGx5IGVtaXRzIGEgc3lzbG9nIG1lc3NhZ2Ugc3RhdGluZyB0aGF0IHRoZSBWRyBtdXN0CitiZSBpbW1lZGlhdGVseSBkZWFjdGl2YXRlZC4gIEluIHRoZSBmdXR1cmUgaXQgbWF5IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0bworZm9yY2libHkgZGVhY3RpdmF0ZSB0aGUgVkcuICBGb3IgbW9yZSwgc2VlCisuQlIgbHZtbG9ja2QgKDgpLgorCisuU1MgZHJvcAorCitUaGlzIHNob3VsZCBvbmx5IGJlIHJ1biBhZnRlciBhIFZHIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWFjdGl2YXRlZAorZm9sbG93aW5nIGFuIGx2bWxvY2tjdGwgXC1cLWtpbGwgY29tbWFuZC4gIEl0IGNsZWFycyB0aGUgc3RhbGUgbG9ja3NwYWNlCitmcm9tIGx2bWxvY2tkLiAgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYXkgYmVjb21lIGF1dG9tYXRpYyBhbG9uZyB3aXRoIGFuCithdXRvbWF0aWMgaGFuZGxpbmcgb2YgXC1cLWtpbGwuICBGb3IgbW9yZSwgc2VlCisuQlIgbHZtbG9ja2QgKDgpLgorCisuU1MgZ2xcLWVuYWJsZQorCitUaGlzIGVuYWJsZXMgdGhlIGdsb2JhbCBsb2NrIGluIGEgc2FubG9jayBWRy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHRoZSBWRwordGhhdCBwcmV2aW91c2x5IGhlbGQgdGhlIGdsb2JhbCBsb2NrIGlzIHJlbW92ZWQuICBGb3IgbW9yZSwgc2VlCisuQlIgbHZtbG9ja2QgKDgpLgorCisuU1MgZ2xcLWRpc2FibGUKKworVGhpcyBkaXNhYmxlcyB0aGUgZ2xvYmFsIGxvY2sgaW4gYSBzYW5sb2NrIFZHLiAgVGhpcyBpcyBuZWNlc3NhcnkgaWYgdGhlCitnbG9iYWwgbG9jayBoYXMgbWlzdGFrZW5seSBiZWVuIGVuYWJsZWQgaW4gbW9yZSB0aGFuIG9uZSBWRy4gIFRoZSBnbG9iYWwKK2xvY2sgc2hvdWxkIGJlIGRpc2FibGVkIGluIGFsbCBidXQgb25lIHNhbmxvY2sgVkcuICBGb3IgbW9yZSwgc2VlCisuQlIgbHZtbG9ja2QgKDgpLgorCisuU1Mgc3RvcFwtbG9ja3NwYWNlcworCitUaGlzIHRlbGxzIGx2bWxvY2tkIHRvIHN0b3AgYWxsIGxvY2tzcGFjZXMuICBJdCBjYW4gYmUgdXNlZnVsIHRvIHN0b3AKK2xvY2tzcGFjZXMgZm9yIFZHcyB0aGF0IHRoZSB2Z2NoYW5nZSBcLVwtbG9ja1wtc3RvcCBjb21hbmQgY2FuIG5vIGxvbmdlcgorc2VlLCBvciB0byBzdG9wIHRoZSBkbG0gZ2xvYmFsIGxvY2tzcGFjZSB3aGljaCBpcyBub3QgZGlyZWN0bHkgc3RvcHBlZCBieQordGhlIHZnY2hhbmdlIGNvbW1hbmQuICBUaGUgd2FpdCBhbmQgZm9yY2Ugb3B0aW9ucyBjYW4gYmUgdXNlZCB3aXRoIHRoaXMKK2NvbW1hbmQuCisKKwpkaWZmIC0tZ2l0IGEvbWFuL2x2bWxvY2tkLjguaW4gYi9tYW4vbHZtbG9ja2QuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFjNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bWxvY2tkLjguaW4KQEAgLTAsMCArMSw4NzcgQEAKKy5USCAiTFZNTE9DS0QiICI4IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorCisuU0ggTkFNRQorbHZtbG9ja2QgXChlbSBMVk0gbG9ja2luZyBkYWVtb24KKworLlNIIERFU0NSSVBUSU9OCitMVk0gY29tbWFuZHMgdXNlIGx2bWxvY2tkIHRvIGNvb3JkaW5hdGUgYWNjZXNzIHRvIHNoYXJlZCBzdG9yYWdlLgorLmJyCitXaGVuIExWTSBpcyB1c2VkIG9uIGRldmljZXMgc2hhcmVkIGJ5IG11bHRpcGxlIGhvc3RzLCBsb2NrcyB3aWxsOgorCitcW2J1XQorY29vcmRpbmF0ZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIExWTSBtZXRhZGF0YQorLmJyCitcW2J1XQordmFsaWRhdGUgY2FjaGluZyBvZiBMVk0gbWV0YWRhdGEKKy5icgorXFtidV0KK3ByZXZlbnQgY29uY3VycmVudCBhY3RpdmF0aW9uIG9mIGxvZ2ljYWwgdm9sdW1lcworLmJyCisKK2x2bWxvY2tkIHVzZXMgYW4gZXh0ZXJuYWwgbG9jayBtYW5hZ2VyIHRvIHBlcmZvcm0gYmFzaWMgbG9ja2luZy4KKy5icgorTG9jayBtYW5hZ2VyIChsb2NrIHR5cGUpIG9wdGlvbnMgYXJlOgorCitcW2J1XQorc2FubG9jazogcGxhY2VzIGxvY2tzIG9uIGRpc2sgd2l0aGluIExWTSBzdG9yYWdlLgorLmJyCitcW2J1XQorZGxtOiB1c2VzIG5ldHdvcmsgY29tbXVuaWNhdGlvbiBhbmQgYSBjbHVzdGVyIG1hbmFnZXIuCisuYnIKKworLlNIIE9QVElPTlMKKworbHZtbG9ja2QgW29wdGlvbnNdCisKK0ZvciBkZWZhdWx0IHNldHRpbmdzLCBzZWUgbHZtbG9ja2QgXC1oLgorCisuQiAgXC1cLWhlbHAgfCBcLWgKKyAgICAgICAgU2hvdyB0aGlzIGhlbHAgaW5mb3JtYXRpb24uCisKKy5CICBcLVwtdmVyc2lvbiB8IFwtVgorICAgICAgICBTaG93IHZlcnNpb24gb2YgbHZtbG9ja2QuCisKKy5CICBcLVwtdGVzdCB8IFwtVAorICAgICAgICBUZXN0IG1vZGUsIGRvIG5vdCBjYWxsIGxvY2sgbWFuYWdlci4KKworLkIgIFwtXC1mb3JlZ3JvdW5kIHwgXC1mCisgICAgICAgIERvbid0IGZvcmsuCisKKy5CICBcLVwtZGFlbW9uXC1kZWJ1ZyB8IFwtRAorICAgICAgICBEb24ndCBmb3JrIGFuZCBwcmludCBkZWJ1Z2dpbmcgdG8gc3Rkb3V0LgorCisuQiAgXC1cLXBpZFwtZmlsZSB8IFwtcAorLkkgcGF0aAorICAgICAgICBTZXQgcGF0aCB0byB0aGUgcGlkIGZpbGUuCisKKy5CICBcLVwtc29ja2V0XC1wYXRoIHwgXC1zCisuSSBwYXRoCisgICAgICAgIFNldCBwYXRoIHRvIHRoZSBzb2NrZXQgdG8gbGlzdGVuIG9uLgorCisuQiAgXC1cLXN5c2xvZ1wtcHJpb3JpdHkgfCBcLVMgZXJyfHdhcm5pbmd8ZGVidWcKKyAgICAgICAgV3JpdGUgbG9nIG1lc3NhZ2VzIGZyb20gdGhpcyBsZXZlbCB1cCB0byBzeXNsb2cuCisKKy5CICBcLVwtZ2xcLXR5cGUgfCBcLWcgc2FubG9ja3xkbG0KKyAgICAgICAgU2V0IGdsb2JhbCBsb2NrIHR5cGUgdG8gYmUgc2FubG9jayBvciBkbG0uCisKKy5CICBcLVwtaG9zdFwtaWQgfCBcLWkKKy5JIG51bQorICAgICAgICBTZXQgdGhlIGxvY2FsIHNhbmxvY2sgaG9zdCBpZC4KKworLkIgIFwtXC1ob3N0XC1pZFwtZmlsZSB8IFwtRgorLkkgcGF0aAorICAgICAgICBBIGZpbGUgY29udGFpbmluZyB0aGUgbG9jYWwgc2FubG9jayBob3N0X2lkLgorCisuQiAgXC1cLXNhbmxvY2tcLXRpbWVvdXQgfCBcLW8KKy5JIHNlY29uZHMKKyAgICAgICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2FubG9jayBJL08gdGltZW91dC4KKworLkIgIFwtXC1hZG9wdCB8IFwtQSAwfDEKKyAgICAgICAgQWRvcHQgbG9ja3MgZnJvbSBhIHByZXZpb3VzIGluc3RhbmNlIG9mIGx2bWxvY2tkLgorCisKKy5TSCBVU0FHRQorCisuU1MgSW5pdGlhbCBzZXQgdXAKKworVXNpbmcgTFZNIHdpdGggbHZtbG9ja2QgZm9yIHRoZSBmaXJzdCB0aW1lIGluY2x1ZGVzIHNvbWUgb25lXC10aW1lIHNldCB1cAorc3RlcHM6CisKKy5TUyAxLiBjaG9vc2UgYSBsb2NrIG1hbmFnZXIKKworLkkgZGxtCisuYnIKK0lmIGRsbSAob3IgY29yb3N5bmMpIGFyZSBhbHJlYWR5IGJlaW5nIHVzZWQgYnkgb3RoZXIgY2x1c3Rlcgorc29mdHdhcmUsIHRoZW4gc2VsZWN0IGRsbS4gIGRsbSB1c2VzIGNvcm9zeW5jIHdoaWNoIHJlcXVpcmVzIGFkZGl0aW9uYWwKK2NvbmZpZ3VyYXRpb24gYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LiAgU2VlIGNvcm9zeW5jIGFuZCBkbG0KK2RvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucyBvbiBjb25maWd1cmF0aW9uLCBzZXR1cCBhbmQgdXNhZ2UuCisKKy5JIHNhbmxvY2sKKy5icgorQ2hvb3NlIHNhbmxvY2sgaWYgZGxtL2Nvcm9zeW5jIGFyZSBub3Qgb3RoZXJ3aXNlIHJlcXVpcmVkLgorc2FubG9jayBkb2VzIG5vdCBkZXBlbmQgb24gYW55IGNsdXN0ZXJpbmcgc29mdHdhcmUgb3IgY29uZmlndXJhdGlvbi4KKworLlNTIDIuIGNvbmZpZ3VyZSBob3N0cyB0byB1c2UgbHZtbG9ja2QKKworT24gYWxsIGhvc3RzIHJ1bm5pbmcgbHZtbG9ja2QsIGNvbmZpZ3VyZSBsdm0uY29uZjoKKy5uZgorbG9ja2luZ190eXBlID0gMQordXNlX2x2bWxvY2tkID0gMQorLmZpCisKKy5JIHNhbmxvY2sKKy5icgorQXNzaWduIGVhY2ggaG9zdCBhIHVuaXF1ZSBob3N0X2lkIGluIHRoZSByYW5nZSAxXC0yMDAwIGJ5IHNldHRpbmcKKy5icgorL2V0Yy9sdm0vbHZtbG9jYWwuY29uZiBsb2NhbC9ob3N0X2lkCisKKy5TUyAzLiBzdGFydCBsdm1sb2NrZAorCitVc2UgYSBzZXJ2aWNlL2luaXQgZmlsZSBpZiBhdmFpbGFibGUsIG9yIGp1c3QgcnVuICJsdm1sb2NrZCIuCisKKy5TUyA0LiBzdGFydCBsb2NrIG1hbmFnZXIKKworLkkgc2FubG9jaworLmJyCitzeXN0ZW1jdGwgc3RhcnQgd2RtZCBzYW5sb2NrCisKKy5JIGRsbQorLmJyCitGb2xsb3cgZXh0ZXJuYWwgY2x1c3RlcmluZyBkb2N1bWVudGF0aW9uIHdoZW4gYXBwbGljYWJsZSwgb3RoZXJ3aXNlOgorLmJyCitzeXN0ZW1jdGwgc3RhcnQgY29yb3N5bmMgZGxtCisKKy5TUyA1LiBjcmVhdGUgVkcgb24gc2hhcmVkIGRldmljZXMKKwordmdjcmVhdGUgXC1cLXNoYXJlZCA8dmduYW1lPiA8ZGV2aWNlcz4KKworVGhlIHNoYXJlZCBvcHRpb24gc2V0cyB0aGUgVkcgbG9jayB0eXBlIHRvIHNhbmxvY2sgb3IgZGxtIGRlcGVuZGluZyBvbgord2hpY2ggbG9jayBtYW5hZ2VyIGlzIHJ1bm5pbmcuICBMVk0gY29tbWFuZHMgd2lsbCBwZXJmb3JtIGxvY2tpbmcgZm9yIHRoZQorVkcgdXNpbmcgbHZtbG9ja2QuICBsdm1sb2NrZCB3aWxsIHVzZSB0aGUgY2hvc2VuIGxvY2sgbWFuYWdlci4KKworLlNTIDYuIHN0YXJ0IFZHIG9uIGFsbCBob3N0cworCit2Z2NoYW5nZSBcLVwtbG9ja1wtc3RhcnQKKworbHZtbG9ja2QgcmVxdWlyZXMgc2hhcmVkIFZHcyB0byBiZSBzdGFydGVkIGJlZm9yZSB0aGV5IGFyZSB1c2VkLiAgVGhpcyBpcworYSBsb2NrIG1hbmFnZXIgb3BlcmF0aW9uIHRvIHN0YXJ0IChqb2luKSB0aGUgVkcgbG9ja3NwYWNlLCBhbmQgaXQgbWF5IHRha2UKK3NvbWUgdGltZS4gIFVudGlsIHRoZSBzdGFydCBjb21wbGV0ZXMsIGxvY2tzIGZvciB0aGUgVkcgYXJlIG5vdCBhdmFpbGFibGUuCitMVk0gY29tbWFuZHMgYXJlIGFsbG93ZWQgdG8gcmVhZCB0aGUgVkcgd2hpbGUgc3RhcnQgaXMgaW4gcHJvZ3Jlc3MuICAoQW4KK2luaXQvdW5pdCBmaWxlIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3RhcnQgVkdzLikKKworLlNTIDcuIGNyZWF0ZSBhbmQgYWN0aXZhdGUgTFZzCisKK1N0YW5kYXJkIGx2Y3JlYXRlIGFuZCBsdmNoYW5nZSBjb21tYW5kcyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIGFjdGl2YXRlCitMVnMgaW4gYSBzaGFyZWQgVkcuCisKK0FuIExWIGFjdGl2YXRlZCBleGNsdXNpdmVseSBvbiBvbmUgaG9zdCBjYW5ub3QgYmUgYWN0aXZhdGVkIG9uIGFub3RoZXIuCitXaGVuIG11bHRpcGxlIGhvc3RzIG5lZWQgdG8gdXNlIHRoZSBzYW1lIExWIGNvbmN1cnJlbnRseSwgdGhlIExWIGNhbiBiZQorYWN0aXZhdGVkIHdpdGggYSBzaGFyZWQgbG9jayAoc2VlIGx2Y2hhbmdlIG9wdGlvbnMgXC1hZXkgdnMgXC1hc3kuKQorKFNoYXJlZCBsb2NrcyBhcmUgZGlzYWxsb3dlZCBmb3IgY2VydGFpbiBMViB0eXBlcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGZyb20KK211bHRpcGxlIGhvc3RzLikKKworCisuU1MgTm9ybWFsIHN0YXJ0IHVwIGFuZCBzaHV0IGRvd24KKworQWZ0ZXIgaW5pdGlhbCBzZXQgdXAsIHN0YXJ0IHVwIGFuZCBzaHV0IGRvd24gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGdlbmVyYWwKK3N0ZXBzLiAgVGhleSBjYW4gYmUgcGVyZm9ybWVkIG1hbnVhbGx5IG9yIHVzaW5nIHRoZSBzeXN0ZW0gc2VydmljZQorbWFuYWdlci4KKworXFtidV0KK3N0YXJ0IGx2bWV0YWQKKy5icgorXFtidV0KK3N0YXJ0IGx2bWxvY2tkCisuYnIKK1xbYnVdCitzdGFydCBsb2NrIG1hbmFnZXIKKy5icgorXFtidV0KK3ZnY2hhbmdlIFwtXC1sb2NrXC1zdGFydAorLmJyCitcW2J1XQorYWN0aXZhdGUgTFZzIGluIHNoYXJlZCBWR3MKKy5icgorCitUaGUgc2h1dCBkb3duIHNlcXVlbmNlIGlzIHRoZSByZXZlcnNlOgorCitcW2J1XQorZGVhY3RpdmF0ZSBMVnMgaW4gc2hhcmVkIFZHcworLmJyCitcW2J1XQordmdjaGFuZ2UgXC1cLWxvY2tcLXN0b3AKKy5icgorXFtidV0KK3N0b3AgbG9jayBtYW5hZ2VyCisuYnIKK1xbYnVdCitzdG9wIGx2bWxvY2tkCisuYnIKK1xbYnVdCitzdG9wIGx2bWV0YWQKKy5icgorCisuUAorCisuU0ggVE9QSUNTCisKKy5TUyBWRyBhY2Nlc3MgY29udHJvbAorCitUaGUgZm9sbG93aW5nIHRlcm1zIGFyZSB1c2VkIHRvIGRlc2NyaWJlIGRpZmZlcmVudCBmb3JtcyBvZiBWRyBhY2Nlc3MKK2NvbnRyb2wuCisKKy5JICJsb2NrZCBWRyIKKworQSAibG9ja2QgVkciIGlzIGEgc2hhcmVkIFZHIHRoYXQgaGFzIGEgImxvY2sgdHlwZSIgb2YgZGxtIG9yIHNhbmxvY2suCitVc2luZyBpdCByZXF1aXJlcyBsdm1sb2NrZC4gIFRoZXNlIFZHcyBleGlzdCBvbiBzaGFyZWQgc3RvcmFnZSB0aGF0IGlzCit2aXNpYmxlIHRvIG11bHRpcGxlIGhvc3RzLiAgTFZNIGNvbW1hbmRzIHVzZSBsdm1sb2NrZCB0byBwZXJmb3JtIGxvY2tpbmcKK2ZvciB0aGVzZSBWR3Mgd2hlbiB0aGV5IGFyZSB1c2VkLgorCitJZiB0aGUgbG9jayBtYW5hZ2VyIGZvciB0aGUgbG9jayB0eXBlIGlzIG5vdCBhdmFpbGFibGUgKGUuZy4gbm90IHN0YXJ0ZWQKK29yIGZhaWxlZCksIGx2bWxvY2tkIGlzIHVuYWJsZSB0byBhY3F1aXJlIGxvY2tzIGZvciBMVk0gY29tbWFuZHMuICBMVk0KK2NvbW1hbmRzIHRoYXQgb25seSByZWFkIHRoZSBWRyB3aWxsIGdlbmVyYWxseSBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlCit3aXRob3V0IGxvY2tzIGluIHRoaXMgY2FzZSAod2l0aCBhIHdhcm5pbmcpLiAgQ29tbWFuZHMgdG8gbW9kaWZ5IG9yCithY3RpdmF0ZSB0aGUgVkcgd2lsbCBmYWlsIHdpdGhvdXQgdGhlIG5lY2Vzc2FyeSBsb2Nrcy4KKworLkkgImxvY2FsIFZHIgorCitBICJsb2NhbCBWRyIgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSBhIHNpbmdsZSBob3N0LiAgSXQgaGFzIG5vIGxvY2sgdHlwZSBvcgorbG9jayB0eXBlICJub25lIi4gIExWTSBjb21tYW5kcyBhbmQgbHZtbG9ja2QgZG8gbm90IHBlcmZvcm0gbG9ja2luZyBmb3IKK3RoZXNlIFZHcy4gIEEgbG9jYWwgVkcgdHlwaWNhbGx5IGV4aXN0cyBvbiBsb2NhbCAobm9uXC1zaGFyZWQpIGRldmljZXMgYW5kCitjYW5ub3QgYmUgdXNlZCBjb25jdXJyZW50bHkgZnJvbSBkaWZmZXJlbnQgaG9zdHMuCisKK0lmIGEgbG9jYWwgVkcgZG9lcyBleGlzdCBvbiBzaGFyZWQgZGV2aWNlcywgaXQgc2hvdWxkIGJlIG93bmVkIGJ5IGEgc2luZ2xlCitob3N0IGJ5IGhhdmluZyBpdHMgc3lzdGVtIElEIHNldCwgc2VlCisuQlIgbHZtc3lzdGVtaWQgKDcpLgorT25seSB0aGUgaG9zdCB3aXRoIGEgbWF0Y2hpbmcgc3lzdGVtIElEIGNhbiB1c2UgdGhlIGxvY2FsIFZHLiAgQSBWRword2l0aCBubyBsb2NrIHR5cGUgYW5kIG5vIHN5c3RlbSBJRCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBhbGwgYnV0IG9uZQoraG9zdCB1c2luZyBsdm0uY29uZiBmaWx0ZXJzLiAgV2l0aG91dCBhbnkgb2YgdGhlc2UgcHJvdGVjdGlvbnMsIGEgbG9jYWwgVkcKK29uIHNoYXJlZCBkZXZpY2VzIGNhbiBiZSBlYXNpbHkgZGFtYWdlZCBvciBkZXN0cm95ZWQuCisKKy5JICJjbHZtIFZHIgorCitBICJjbHZtIFZHIiBpcyBhIFZHIG9uIHNoYXJlZCBzdG9yYWdlIChsaWtlIGEgbG9ja2QgVkcpIHRoYXQgcmVxdWlyZXMKK2Nsdm1kIGZvciBjbHVzdGVyaW5nLiAgU2VlIGJlbG93IGZvciBjb252ZXJ0aW5nIGEgY2x2bSBWRyB0byBhIGxvY2tkIFZHLgorCisKKy5TUyBsb2NrZCBWR3MgZnJvbSBob3N0cyBub3QgdXNpbmcgbHZtbG9ja2QKKworT25seSBob3N0cyB0aGF0IHVzZSBsb2NrZCBWR3Mgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIGx2bWxvY2tkLgorSG93ZXZlciwgc2hhcmVkIGRldmljZXMgdXNlZCBieSBsb2NrZCBWR3MgbWF5IGJlIHZpc2libGUgZnJvbSBob3N0cyBub3QKK3VzaW5nIGx2bWxvY2tkLiAgRnJvbSBhIGhvc3Qgbm90IHVzaW5nIGx2bWxvY2tkLCB2aXNpYmxlIGxvY2tkIFZHcyBhcmUKK2lnbm9yZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGZvcmVpZ24gVkdzIChzZWUKKy5CUiBsdm1zeXN0ZW1pZCAoNykuKQorCitUaGUgXC1cLXNoYXJlZCBvcHRpb24gZm9yIHJlcG9ydGluZyBhbmQgZGlzcGxheSBjb21tYW5kcyBjYXVzZXMgbG9ja2QgVkdzCit0byBiZSBkaXNwbGF5ZWQgb24gYSBob3N0IG5vdCB1c2luZyBsdm1sb2NrZCwgbGlrZSB0aGUgXC1cLWZvcmVpZ24gb3B0aW9uCitkb2VzIGZvciBmb3JlaWduIFZHcy4KKworCisuU1MgdmdjcmVhdGUgY29tcGFyaXNvbgorCitUaGUgdHlwZSBvZiBWRyBhY2Nlc3MgY29udHJvbCBpcyBzcGVjaWZpZWQgaW4gdGhlIHZnY3JlYXRlIGNvbW1hbmQuCitTZWUKKy5CUiB2Z2NyZWF0ZSAoOCkKK2ZvciBhbGwgdmdjcmVhdGUgb3B0aW9ucy4KKworLkIgdmdjcmVhdGUgPHZnbmFtZT4gPGRldmljZXM+CisKKy5JUCBcW2J1XSAyCitDcmVhdGVzIGEgbG9jYWwgVkcgd2l0aCB0aGUgbG9jYWwgc3lzdGVtIElEIHdoZW4gbmVpdGhlciBsdm1sb2NrZCBub3IgY2x2bSBhcmUgY29uZmlndXJlZC4KKy5JUCBcW2J1XSAyCitDcmVhdGVzIGEgbG9jYWwgVkcgd2l0aCB0aGUgbG9jYWwgc3lzdGVtIElEIHdoZW4gbHZtbG9ja2QgaXMgY29uZmlndXJlZC4KKy5JUCBcW2J1XSAyCitDcmVhdGVzIGEgY2x2bSBWRyB3aGVuIGNsdm0gaXMgY29uZmlndXJlZC4KKworLlAKKworLkIgdmdjcmVhdGUgXC1cLXNoYXJlZCA8dmduYW1lPiA8ZGV2aWNlcz4KKy5JUCBcW2J1XSAyCitSZXF1aXJlcyBsdm1sb2NrZCB0byBiZSBjb25maWd1cmVkIGFuZCBydW5uaW5nLgorLklQIFxbYnVdIDIKK0NyZWF0ZXMgYSBsb2NrZCBWRyB3aXRoIGxvY2sgdHlwZSBzYW5sb2NrfGRsbSBkZXBlbmRpbmcgb24gd2hpY2ggbG9jaworbWFuYWdlciBpcyBydW5uaW5nLgorLklQIFxbYnVdIDIKK0xWTSBjb21tYW5kcyByZXF1ZXN0IGxvY2tzIGZyb20gbHZtbG9ja2QgdG8gdXNlIHRoZSBWRy4KKy5JUCBcW2J1XSAyCitsdm1sb2NrZCBvYnRhaW5zIGxvY2tzIGZyb20gdGhlIHNlbGVjdGVkIGxvY2sgbWFuYWdlci4KKworLlAKKworLkIgdmdjcmVhdGUgXC1jfFwtXC1jbHVzdGVyZWQgeSA8dmduYW1lPiA8ZGV2aWNlcz4KKy5JUCBcW2J1XSAyCitSZXF1aXJlcyBjbHZtIHRvIGJlIGNvbmZpZ3VyZWQgYW5kIHJ1bm5pbmcuCisuSVAgXFtidV0gMgorQ3JlYXRlcyBhIGNsdm0gVkcgd2l0aCB0aGUgImNsdXN0ZXJlZCIgZmxhZy4KKy5JUCBcW2J1XSAyCitMVk0gY29tbWFuZHMgcmVxdWVzdCBsb2NrcyBmcm9tIGNsdm1kIHRvIHVzZSB0aGUgVkcuCisKKy5QCisKKy5TUyBjcmVhdGluZyB0aGUgZmlyc3Qgc2FubG9jayBWRworCitDcmVhdGluZyB0aGUgZmlyc3Qgc2FubG9jayBWRyBpcyBub3QgcHJvdGVjdGVkIGJ5IGxvY2tpbmcgYW5kIHJlcXVpcmVzCitzcGVjaWFsIGF0dGVudGlvbi4gIFRoaXMgaXMgYmVjYXVzZSBzYW5sb2NrIGxvY2tzIGV4aXN0IHdpdGhpbiB0aGUgVkcsIHNvCit0aGV5IGFyZSBub3QgYXZhaWxhYmxlIHVudGlsIHRoZSBWRyBleGlzdHMuICBUaGUgZmlyc3Qgc2FubG9jayBWRyB3aWxsCitjb250YWluIHRoZSAiZ2xvYmFsIGxvY2siLgorCisuSVAgXFtidV0gMgorVGhlIGZpcnN0IHZnY3JlYXRlIGNvbW1hbmQgbmVlZHMgdG8gYmUgZ2l2ZW4gdGhlIHBhdGggdG8gYSBkZXZpY2UgdGhhdCBoYXMKK25vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCB3aXRoIHB2Y3JlYXRlLiAgVGhlIHB2Y3JlYXRlIGluaXRpYWxpemF0aW9uIHdpbGwKK2JlIGRvbmUgYnkgdmdjcmVhdGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHB2Y3JlYXRlIGNvbW1hbmQgcmVxdWlyZXMgdGhlCitnbG9iYWwgbG9jaywgd2hpY2ggd2lsbCBub3QgYmUgYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBmaXJzdCBzYW5sb2NrIFZHCitpcyBjcmVhdGVkLgorCisuSVAgXFtidV0gMgorV2hpbGUgcnVubmluZyB2Z2NyZWF0ZSBmb3IgdGhlIGZpcnN0IHNhbmxvY2sgVkcsIGVuc3VyZSB0aGF0IHRoZSBkZXZpY2UKK2JlaW5nIHVzZWQgaXMgbm90IHVzZWQgYnkgYW5vdGhlciBMVk0gY29tbWFuZC4gIEFsbG9jYXRpb24gb2Ygc2hhcmVkCitkZXZpY2VzIGlzIHVzdWFsbHkgcHJvdGVjdGVkIGJ5IHRoZSBnbG9iYWwgbG9jaywgYnV0IHRoaXMgY2Fubm90IGJlIGRvbmUKK2ZvciB0aGUgZmlyc3Qgc2FubG9jayBWRyB3aGljaCB3aWxsIGhvbGQgdGhlIGdsb2JhbCBsb2NrLgorCisuSVAgXFtidV0gMgorV2hpbGUgcnVubmluZyB2Z2NyZWF0ZSBmb3IgdGhlIGZpcnN0IHNhbmxvY2sgVkcsIGVuc3VyZSB0aGF0IHRoZSBWRyBuYW1lCitiZWluZyB1c2VkIGlzIG5vdCB1c2VkIGJ5IGFub3RoZXIgTFZNIGNvbW1hbmQuICBVbmlxdWVuZXNzIG9mIFZHIG5hbWVzIGlzCit1c3VhbGx5IGVuc3VyZWQgYnkgdGhlIGdsb2JhbCBsb2NrLgorCisuSVAgXFtidV0gMgorQmVjYXVzZSB0aGUgZmlyc3Qgc2FubG9jayBWRyB3aWxsIGNvbnRhaW4gdGhlIGdsb2JhbCBsb2NrLCB0aGlzIFZHIG5lZWRzCit0byBiZSBhY2Nlc3NpYmxlIHRvIGFsbCBob3N0cyB0aGF0IHdpbGwgdXNlIHNhbmxvY2sgc2hhcmVkIFZHcy4gIEFsbCBob3N0cword2lsbCBuZWVkIHRvIHVzZSB0aGUgZ2xvYmFsIGxvY2sgZnJvbSB0aGUgZmlyc3Qgc2FubG9jayBWRy4KKworU2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG1hbmFnaW5nIHRoZSBzYW5sb2NrIGdsb2JhbCBsb2NrLgorCisKKy5TUyB1c2luZyBsb2NrZCBWR3MKKworVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBjb25zaWRlcmF0aW9ucyB3aGVuIHVzaW5nIGxvY2tkIFZHcy4KKworV2hlbiB1c2VfbHZtbG9ja2QgaXMgZmlyc3QgZW5hYmxlZCBpbiBsdm0uY29uZiwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgbG9ja2QKK1ZHIGlzIGNyZWF0ZWQsIG5vIGdsb2JhbCBsb2NrIHdpbGwgZXhpc3QuICBJbiB0aGlzIGluaXRpYWwgc3RhdGUsIExWTQorY29tbWFuZHMgdHJ5IGFuZCBmYWlsIHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrLCBwcm9kdWNpbmcgYSB3YXJuaW5nLCBhbmQKK3NvbWUgY29tbWFuZHMgYXJlIGRpc2FsbG93ZWQuICBPbmNlIHRoZSBmaXJzdCBsb2NrZCBWRyBpcyBjcmVhdGVkLCB0aGUKK2dsb2JhbCBsb2NrIHdpbGwgYmUgYXZhaWxhYmxlLCBhbmQgTFZNIHdpbGwgYmUgZnVsbHkgb3BlcmF0aW9uYWwuCisKK1doZW4gYSBuZXcgbG9ja2QgVkcgaXMgY3JlYXRlZCwgaXRzIGxvY2tzcGFjZSBpcyBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgb24KK3RoZSBob3N0IHRoYXQgY3JlYXRlcyBpdC4gIE90aGVyIGhvc3RzIG5lZWQgdG8gcnVuICd2Z2NoYW5nZQorXC1cLWxvY2tcLXN0YXJ0JyB0byBzdGFydCB0aGUgbmV3IFZHIGJlZm9yZSB0aGV5IGNhbiB1c2UgaXQuCisKK0Zyb20gdGhlICd2Z3MnIGNvbW1hbmQsIGxvY2tkIFZHcyBhcmUgaW5kaWNhdGVkIGJ5ICJzIiAoZm9yIHNoYXJlZCkgaW4gdGhlCitzaXh0aCBhdHRyIGZpZWxkLiAgVGhlIHNwZWNpZmljIGxvY2sgdHlwZSBhbmQgbG9jayBhcmdzIGZvciBhIGxvY2tkIFZHIGNhbgorYmUgZGlzcGxheWVkIHdpdGggJ3ZncyBcLW8rbG9ja3R5cGUsbG9ja2FyZ3MnLgorCitsb2NrZCBWR3MgbmVlZCB0byBiZSAic3RhcnRlZCIgYW5kICJzdG9wcGVkIiwgdW5saWtlIG90aGVyIHR5cGVzIG9mIFZHcy4KK1NlZSB0aGUgZm9sbG93aW5nIHNlY3Rpb24gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBzdGFydGluZyBhbmQgc3RvcHBpbmcuCisKK3ZncmVtb3ZlIG9mIGEgbG9ja2QgVkcgd2lsbCBmYWlsIGlmIG90aGVyIGhvc3RzIGhhdmUgdGhlIFZHIHN0YXJ0ZWQuCitSdW4gdmdjaGFuZ2UgXC1cLWxvY2stc3RvcCA8dmduYW1lPiBvbiBhbGwgb3RoZXIgaG9zdHMgYmVmb3JlIHZncmVtb3ZlLgorKEl0IG1heSB0YWtlIHNldmVyYWwgc2Vjb25kcyBiZWZvcmUgdmdyZW1vdmUgcmVjb2duaXplcyB0aGF0IGFsbCBob3N0cworaGF2ZSBzdG9wcGVkIGEgc2FubG9jayBWRy4pCisKKy5TUyBzdGFydGluZyBhbmQgc3RvcHBpbmcgVkdzCisKK1N0YXJ0aW5nIGEgbG9ja2QgVkcgKHZnY2hhbmdlIFwtXC1sb2NrXC1zdGFydCkgY2F1c2VzIHRoZSBsb2NrIG1hbmFnZXIgdG8KK3N0YXJ0IChqb2luKSB0aGUgbG9ja3NwYWNlIGZvciB0aGUgVkcgb24gdGhlIGhvc3Qgd2hlcmUgaXQgaXMgcnVuLiAgVGhpcworbWFrZXMgbG9ja3MgZm9yIHRoZSBWRyBhdmFpbGFibGUgdG8gTFZNIGNvbW1hbmRzIG9uIHRoZSBob3N0LiAgQmVmb3JlIGEgVkcKK2lzIHN0YXJ0ZWQsIG9ubHkgTFZNIGNvbW1hbmRzIHRoYXQgcmVhZC9kaXNwbGF5IHRoZSBWRyBhcmUgYWxsb3dlZCB0bworY29udGludWUgd2l0aG91dCBsb2NrcyAoYW5kIHdpdGggYSB3YXJuaW5nKS4KKworU3RvcHBpbmcgYSBsb2NrZCBWRyAodmdjaGFuZ2UgXC1cLWxvY2tcLXN0b3ApIGNhdXNlcyB0aGUgbG9jayBtYW5hZ2VyIHRvCitzdG9wIChsZWF2ZSkgdGhlIGxvY2tzcGFjZSBmb3IgdGhlIFZHIG9uIHRoZSBob3N0IHdoZXJlIGl0IGlzIHJ1bi4gIFRoaXMKK21ha2VzIGxvY2tzIGZvciB0aGUgVkcgaW5hY2Nlc3NpYmxlIHRvIHRoZSBob3N0LiAgQSBWRyBjYW5ub3QgYmUgc3RvcHBlZAord2hpbGUgaXQgaGFzIGFjdGl2ZSBMVnMuCisKK1doZW4gdXNpbmcgdGhlIGxvY2sgdHlwZSBzYW5sb2NrLCBzdGFydGluZyBhIFZHIGNhbiB0YWtlIGEgbG9uZyB0aW1lCisocG90ZW50aWFsbHkgbWludXRlcyBpZiB0aGUgaG9zdCB3YXMgcHJldmlvdXNseSBzaHV0IGRvd24gd2l0aG91dCBjbGVhbmx5CitzdG9wcGluZyB0aGUgVkcuKQorCitBIGxvY2tkIFZHIGNhbiBiZSBzdGFydGVkIGFmdGVyIGFsbCB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOgorLmJyCitcW2J1XQorbHZtbG9ja2QgaXMgcnVubmluZworLmJyCitcW2J1XQordGhlIGxvY2sgbWFuYWdlciBpcyBydW5uaW5nCisuYnIKK1xbYnVdCit0aGUgVkcgaXMgdmlzaWJsZSB0byB0aGUgc3lzdGVtCisuYnIKKworQSBsb2NrZCBWRyBjYW4gYmUgc3RvcHBlZCBpZiBhbGwgTFZzIGFyZSBkZWFjdGl2YXRlZC4KKworQWxsIGxvY2tkIFZHcyBjYW4gYmUgc3RhcnRlZC9zdG9wcGVkIHVzaW5nOgorLmJyCit2Z2NoYW5nZSBcLVwtbG9jay1zdGFydAorLmJyCit2Z2NoYW5nZSBcLVwtbG9jay1zdG9wCisKKworSW5kaXZpZHVhbCBWR3MgY2FuIGJlIHN0YXJ0ZWQvc3RvcHBlZCB1c2luZzoKKy5icgordmdjaGFuZ2UgXC1cLWxvY2tcLXN0YXJ0IDx2Z25hbWU+IC4uLgorLmJyCit2Z2NoYW5nZSBcLVwtbG9ja1wtc3RvcCA8dmduYW1lPiAuLi4KKworVG8gbWFrZSB2Z2NoYW5nZSBub3Qgd2FpdCBmb3Igc3RhcnQgdG8gY29tcGxldGU6CisuYnIKK3ZnY2hhbmdlIFwtXC1sb2NrXC1zdGFydCBcLVwtbG9ja1wtb3B0IG5vd2FpdCAuLi4KKworbHZtbG9ja2QgY2FuIGJlIGFza2VkIGRpcmVjdGx5IHRvIHN0b3AgYWxsIGxvY2tzcGFjZXM6CisuYnIKK2x2bWxvY2tjdGwgXC1cLXN0b3BcLWxvY2tzcGFjZXMKKworVG8gc3RhcnQgb25seSBzZWxlY3RlZCBsb2NrZCBWR3MsIHVzZSB0aGUgbHZtLmNvbmYKK2FjdGl2YXRpb24vbG9ja19zdGFydF9saXN0LiAgV2hlbiBkZWZpbmVkLCBvbmx5IFZHIG5hbWVzIGluIHRoaXMgbGlzdCBhcmUKK3N0YXJ0ZWQgYnkgdmdjaGFuZ2UuICBJZiB0aGUgbGlzdCBpcyBub3QgZGVmaW5lZCAodGhlIGRlZmF1bHQpLCBhbGwKK3Zpc2libGUgbG9ja2QgVkdzIGFyZSBzdGFydGVkLiAgVG8gc3RhcnQgb25seSAidmcxIiwgdXNlIHRoZSBmb2xsb3dpbmcKK2x2bS5jb25mIGNvbmZpZ3VyYXRpb246CisKKy5uZgorYWN0aXZhdGlvbiB7CisgICAgbG9ja19zdGFydF9saXN0ID0gWyAidmcxIiBdCisgICAgLi4uCit9CisuZmkKKworCisuU1MgYXV0b21hdGljIHN0YXJ0aW5nIGFuZCBhdXRvbWF0aWMgYWN0aXZhdGlvbgorCitTY3JpcHRzIG9yIHByb2dyYW1zIG9uIGEgaG9zdCB0aGF0IGF1dG9tYXRpY2FsbHkgc3RhcnQgVkdzIHdpbGwgdXNlIHRoZQorImF1dG8iIG9wdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIGlzIGJlaW5nIHJ1biBhdXRvbWF0aWNhbGx5IGJ5Cit0aGUgc3lzdGVtOgorCit2Z2NoYW5nZSBcLVwtbG9ja1wtc3RhcnQgXC1cLWxvY2tcLW9wdCBhdXRvIFs8dmduYW1lPiAuLi5dCisKK1dpdGhvdXQgYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIHRoZSAiYXV0byIgb3B0aW9uIGhhcyBubworZWZmZWN0OyBhbGwgVkdzIGFyZSBzdGFydGVkIHVubGVzcyByZXN0cmljdGVkIGJ5IGxvY2tfc3RhcnRfbGlzdC4KKworSG93ZXZlciwgd2hlbiB0aGUgbHZtLmNvbmYgYWN0aXZhdGlvbi9hdXRvX2xvY2tfc3RhcnRfbGlzdCBpcyBkZWZpbmVkLCB0aGUKK2F1dG8gc3RhcnQgY29tbWFuZCBwZXJmb3JtcyBhbiBhZGRpdGlvbmFsIGZpbHRlcmluZyBwaGFzZSB0byBhbGwgVkdzIGJlaW5nCitzdGFydGVkLCB0ZXN0aW5nIGVhY2ggVkcgbmFtZSBhZ2FpbnN0IHRoZSBhdXRvX2xvY2tfc3RhcnRfbGlzdC4gIFRoZQorYXV0b19sb2NrX3N0YXJ0X2xpc3QgZGVmaW5lcyBsb2NrZCBWR3MgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgYnkgdGhlIGF1dG8KK3N0YXJ0IGNvbW1hbmQuICBWaXNpYmxlIGxvY2tkIFZHcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QgYXJlIGlnbm9yZWQgYnkKK3RoZSBhdXRvIHN0YXJ0IGNvbW1hbmQuICBJZiB0aGUgbGlzdCBpcyB1bmRlZmluZWQsIGFsbCBWRyBuYW1lcyBwYXNzIHRoaXMKK2ZpbHRlci4gIChUaGUgbG9ja19zdGFydF9saXN0IGlzIGFsc28gc3RpbGwgdXNlZCB0byBmaWx0ZXIgYWxsIFZHcy4pCisKK1RoZSBhdXRvX2xvY2tfc3RhcnRfbGlzdCBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBjZXJ0YWluIGxvY2tkIFZHcyB0aGF0CitzaG91bGQgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIGJ5IHRoZSBzeXN0ZW0gKG9yIGluZGlyZWN0bHksIHRob3NlIHRoYXQKK3Nob3VsZCBub3QpLgorCitUbyB1c2UgYXV0byBhY3RpdmF0aW9uIG9mIGxvY2tkIExWcyAoc2VlIGF1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdCksCithdXRvIHN0YXJ0aW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2tkIFZHcyBpcyBuZWNlc3NhcnkuCisKKworLlNTIGludGVybmFsIGNvbW1hbmQgbG9ja2luZworCitUbyBvcHRpbWl6ZSB0aGUgdXNlIG9mIExWTSB3aXRoIGx2bWxvY2tkLCBiZSBhd2FyZSBvZiB0aGUgdGhyZWUga2luZHMgb2YKK2xvY2tzIGFuZCB3aGVuIHRoZXkgYXJlIHVzZWQ6CisKKy5JIEdMIGxvY2sKKworVGhlIGdsb2JhbCBsb2NrIChHTCBsb2NrKSBpcyBhc3NvY2lhdGVkIHdpdGggZ2xvYmFsIGluZm9ybWF0aW9uLCB3aGljaCBpcworaW5mb3JtYXRpb24gbm90IGlzb2xhdGVkIHRvIGEgc2luZ2xlIFZHLiAgVGhpcyBpbmNsdWRlczoKKworXFtidV0KK1RoZSBnbG9iYWwgVkcgbmFtZXNwYWNlLgorLmJyCitcW2J1XQorVGhlIHNldCBvZiBvcnBoYW4gUFZzIGFuZCB1bnVzZWQgZGV2aWNlcy4KKy5icgorXFtidV0KK1RoZSBwcm9wZXJ0aWVzIG9mIG9ycGhhbiBQVnMsIGUuZy4gUFYgc2l6ZS4KKy5icgorCitUaGUgZ2xvYmFsIGxvY2sgaXMgdXNlZCBpbiBzaGFyZWQgbW9kZSBieSBjb21tYW5kcyB0aGF0IHJlYWQgdGhpcworaW5mb3JtYXRpb24sIG9yIGluIGV4Y2x1c2l2ZSBtb2RlIGJ5IGNvbW1hbmRzIHRoYXQgY2hhbmdlIGl0LgorCitUaGUgY29tbWFuZCAndmdzJyBhY3F1aXJlcyB0aGUgZ2xvYmFsIGxvY2sgaW4gc2hhcmVkIG1vZGUgYmVjYXVzZSBpdAorcmVwb3J0cyB0aGUgbGlzdCBvZiBhbGwgVkcgbmFtZXMuCisKK1RoZSB2Z2NyZWF0ZSBjb21tYW5kIGFjcXVpcmVzIHRoZSBnbG9iYWwgbG9jayBpbiBleGNsdXNpdmUgbW9kZSBiZWNhdXNlIGl0CitjcmVhdGVzIGEgbmV3IFZHIG5hbWUsIGFuZCBpdCB0YWtlcyBhIFBWIGZyb20gdGhlIGxpc3Qgb2YgdW51c2VkIFBWcy4KKworV2hlbiBhbiBMVk0gY29tbWFuZCBpcyBnaXZlbiBhIHRhZyBhcmd1bWVudCwgb3IgdXNlcyBzZWxlY3QsIGl0IG11c3QgcmVhZAorYWxsIFZHcyB0byBtYXRjaCB0aGUgdGFnIG9yIHNlbGVjdGlvbiwgd2hpY2ggY2F1c2VzIHRoZSBnbG9iYWwgbG9jayB0byBiZQorYWNxdWlyZWQuCisKKy5JIFZHIGxvY2sKKworQSBWRyBsb2NrIGlzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIFZHLiAgVGhlIFZHIGxvY2sgaXMgYWNxdWlyZWQgaW4gc2hhcmVkCittb2RlIHRvIHJlYWQgdGhlIFZHIGFuZCBpbiBleGNsdXNpdmUgbW9kZSB0byBjaGFuZ2UgdGhlIFZHIChtb2RpZnkgdGhlIFZHCittZXRhZGF0YSBvciBhY3RpdmF0ZSBMVnMpLiAgVGhpcyBsb2NrIHNlcmlhbGl6ZXMgYWNjZXNzIHRvIGEgVkcgd2l0aCBhbGwKK290aGVyIExWTSBjb21tYW5kcyBhY2Nlc3NpbmcgdGhlIFZHIGZyb20gYWxsIGhvc3RzLgorCitUaGUgY29tbWFuZCAndmdzJyB3aWxsIG5vdCBvbmx5IGFjcXVpcmUgdGhlIEdMIGxvY2sgdG8gcmVhZCB0aGUgbGlzdCBvZgorYWxsIFZHIG5hbWVzLCBidXQgd2lsbCBhY3F1aXJlIHRoZSBWRyBsb2NrIGZvciBlYWNoIFZHIHByaW9yIHRvIHJlYWRpbmcKK2l0LgorCitUaGUgY29tbWFuZCAndmdzIDx2Z25hbWU+JyBkb2VzIG5vdCBhY3F1aXJlIHRoZSBHTCBsb2NrIChpdCBkb2VzIG5vdCBuZWVkCit0aGUgbGlzdCBvZiBhbGwgVkcgbmFtZXMpLCBidXQgd2lsbCBhY3F1aXJlIHRoZSBWRyBsb2NrIG9uIGVhY2ggVkcgbmFtZQorYXJndW1lbnQuCisKKy5JIExWIGxvY2sKKworQW4gTFYgbG9jayBpcyBhY3F1aXJlZCBiZWZvcmUgdGhlIExWIGlzIGFjdGl2YXRlZCwgYW5kIGlzIHJlbGVhc2VkIGFmdGVyCit0aGUgTFYgaXMgZGVhY3RpdmF0ZWQuICBJZiB0aGUgTFYgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQsIHRoZSBMViBpcyBub3QKK2FjdGl2YXRlZC4gIExWIGxvY2tzIGFyZSBwZXJzaXN0ZW50IGFuZCByZW1haW4gaW4gcGxhY2UgYWZ0ZXIgdGhlCithY3RpdmF0aW9uIGNvbW1hbmQgaXMgZG9uZS4gIEdMIGFuZCBWRyBsb2NrcyBhcmUgdHJhbnNpZW50LCBhbmQgYXJlIGhlbGQKK29ubHkgd2hpbGUgYW4gTFZNIGNvbW1hbmQgaXMgcnVubmluZy4KKworLkkgbG9jayByZXRyaWVzCisKK0lmIGEgcmVxdWVzdCBmb3IgYSBHTCBvciBWRyBsb2NrIGZhaWxzIGR1ZSB0byBhIGxvY2sgY29uZmxpY3Qgd2l0aCBhbm90aGVyCitob3N0LCBsdm1sb2NrZCBhdXRvbWF0aWNhbGx5IHJldHJpZXMgZm9yIGEgc2hvcnQgdGltZSBiZWZvcmUgcmV0dXJuaW5nIGEKK2ZhaWx1cmUgdG8gdGhlIExWTSBjb21tYW5kLiAgSWYgdGhvc2UgcmV0cmllcyBhcmUgaW5zdWZmaWNpZW50LCB0aGUgTFZNCitjb21tYW5kIHdpbGwgcmV0cnkgdGhlIGVudGlyZSBsb2NrIHJlcXVlc3QgYSBudW1iZXIgb2YgdGltZXMgc3BlY2lmaWVkIGJ5CitnbG9iYWwvbHZtbG9ja2RfbG9ja19yZXRyaWVzIGJlZm9yZSBmYWlsaW5nLiAgSWYgYSByZXF1ZXN0IGZvciBhbiBMViBsb2NrCitmYWlscyBkdWUgdG8gYSBsb2NrIGNvbmZsaWN0LCB0aGUgY29tbWFuZCBmYWlscyBpbW1lZGlhdGVseS4KKworCisuU1MgbWFuYWdpbmcgdGhlIGdsb2JhbCBsb2NrIGluIHNhbmxvY2sgVkdzCisKK1RoZSBnbG9iYWwgbG9jayBleGlzdHMgaW4gb25lIG9mIHRoZSBzYW5sb2NrIFZHcy4gIFRoZSBmaXJzdCBzYW5sb2NrIFZHCitjcmVhdGVkIHdpbGwgY29udGFpbiB0aGUgZ2xvYmFsIGxvY2suICBTdWJzZXF1ZW50IHNhbmxvY2sgVkdzIHdpbGwgZWFjaAorY29udGFpbiBkaXNhYmxlZCBnbG9iYWwgbG9ja3MgdGhhdCBjYW4gYmUgZW5hYmxlZCBsYXRlciBpZiBuZWNlc3NhcnkuCisKK1RoZSBWRyBjb250YWluaW5nIHRoZSBnbG9iYWwgbG9jayBtdXN0IGJlIHZpc2libGUgdG8gYWxsIGhvc3RzIHVzaW5nCitzYW5sb2NrIFZHcy4gIFRoaXMgY2FuIGJlIGEgcmVhc29uIHRvIGNyZWF0ZSBhIHNtYWxsIHNhbmxvY2sgVkcsIHZpc2libGUKK3RvIGFsbCBob3N0cywgYW5kIGRlZGljYXRlZCB0byBqdXN0IGhvbGRpbmcgdGhlIGdsb2JhbCBsb2NrLiAgV2hpbGUgbm90CityZXF1aXJlZCwgdGhpcyBzdHJhdGVneSBjYW4gaGVscCB0byBhdm9pZCBkaWZmaWN1bHR5IGluIHRoZSBmdXR1cmUgaWYgVkdzCithcmUgbW92ZWQgb3IgcmVtb3ZlZC4KKworVGhlIHZnY3JlYXRlIGNvbW1hbmQgdHlwaWNhbGx5IGFjcXVpcmVzIHRoZSBnbG9iYWwgbG9jaywgYnV0IGluIHRoZSBjYXNlCitvZiB0aGUgZmlyc3Qgc2FubG9jayBWRywgdGhlcmUgd2lsbCBiZSBubyBnbG9iYWwgbG9jayB0byBhY3F1aXJlIHVudGlsIHRoZQorZmlyc3QgdmdjcmVhdGUgaXMgY29tcGxldGUuICBTbywgY3JlYXRpbmcgdGhlIGZpcnN0IHNhbmxvY2sgVkcgaXMgYQorc3BlY2lhbCBjYXNlIHRoYXQgc2tpcHMgdGhlIGdsb2JhbCBsb2NrLgorCit2Z2NyZWF0ZSBmb3IgYSBzYW5sb2NrIFZHIGRldGVybWluZXMgaXQgaXMgdGhlIGZpcnN0IG9uZSB0byBleGlzdCBpZiBubworb3RoZXIgc2FubG9jayBWR3MgYXJlIHZpc2libGUuICBJdCBpcyBwb3NzaWJsZSB0aGF0IG90aGVyIHNhbmxvY2sgVkdzIGRvCitleGlzdCBidXQgYXJlIG5vdCB2aXNpYmxlIG9uIHRoZSBob3N0IHJ1bm5pbmcgdmdjcmVhdGUuICBJbiB0aGlzIGNhc2UsCit2Z2NyZWF0ZSB3b3VsZCBjcmVhdGUgYSBuZXcgc2FubG9jayBWRyB3aXRoIHRoZSBnbG9iYWwgbG9jayBlbmFibGVkLiAgV2hlbgordGhlIG90aGVyIFZHIGNvbnRhaW5pbmcgYSBnbG9iYWwgbG9jayBhcHBlYXJzLCBsdm1sb2NrZCB3aWxsIHNlZSBtb3JlIHRoYW4KK29uZSBWRyB3aXRoIGEgZ2xvYmFsIGxvY2sgZW5hYmxlZCwgYW5kIExWTSBjb21tYW5kcyB3aWxsIHJlcG9ydCB0aGF0IHRoZXJlCithcmUgZHVwbGljYXRlIGdsb2JhbCBsb2Nrcy4KKworSWYgdGhlIHNpdHVhdGlvbiBhcmlzZXMgd2hlcmUgbW9yZSB0aGFuIG9uZSBzYW5sb2NrIFZHIGNvbnRhaW5zIGEgZ2xvYmFsCitsb2NrLCB0aGUgZ2xvYmFsIGxvY2sgc2hvdWxkIGJlIG1hbnVhbGx5IGRpc2FibGVkIGluIGFsbCBidXQgb25lIG9mIHRoZW0KK3dpdGggdGhlIGNvbW1hbmQ6CisKK2x2bWxvY2tjdGwgXC1cLWdsXC1kaXNhYmxlIDx2Z25hbWU+CisKKyhUaGUgb25lIFZHIHdpdGggdGhlIGdsb2JhbCBsb2NrIGVuYWJsZWQgbXVzdCBiZSB2aXNpYmxlIHRvIGFsbCBob3N0cy4pCisKK0FuIG9wcG9zaXRlIHByb2JsZW0gY2FuIG9jY3VyIGlmIHRoZSBWRyBob2xkaW5nIHRoZSBnbG9iYWwgbG9jayBpcworcmVtb3ZlZC4gIEluIHRoaXMgY2FzZSwgbm8gZ2xvYmFsIGxvY2sgd2lsbCBleGlzdCBmb2xsb3dpbmcgdGhlIHZncmVtb3ZlLAorYW5kIHN1YnNlcXVlbnQgTFZNIGNvbW1hbmRzIHdpbGwgZmFpbCB0byBhY3F1aXJlIGl0LiAgSW4gdGhpcyBjYXNlLCB0aGUKK2dsb2JhbCBsb2NrIG5lZWRzIHRvIGJlIG1hbnVhbGx5IGVuYWJsZWQgaW4gb25lIG9mIHRoZSByZW1haW5pbmcgc2FubG9jaworVkdzIHdpdGggdGhlIGNvbW1hbmQ6CisKK2x2bWxvY2tjdGwgXC1cLWdsXC1lbmFibGUgPHZnbmFtZT4KKworQSBzbWFsbCBzYW5sb2NrIFZHIGRlZGljYXRlZCB0byBob2xkaW5nIHRoZSBnbG9iYWwgbG9jayBjYW4gYXZvaWQgdGhlIGNhc2UKK3doZXJlIHRoZSBHTCBsb2NrIG11c3QgYmUgbWFudWFsbHkgZW5hYmxlZCBhZnRlciBhIHZncmVtb3ZlLgorCisKKy5TUyBpbnRlcm5hbCBsdm1sb2NrIExWCisKK0Egc2FubG9jayBWRyBjb250YWlucyBhIGhpZGRlbiBMViBjYWxsZWQgImx2bWxvY2siIHRoYXQgaG9sZHMgdGhlIHNhbmxvY2sKK2xvY2tzLiAgdmdyZWR1Y2UgY2Fubm90IHlldCByZW1vdmUgdGhlIFBWIGhvbGRpbmcgdGhlIGx2bWxvY2sgTFYuICBUbworcmVtb3ZlIHRoaXMgUFYsIGNoYW5nZSB0aGUgVkcgbG9jayB0eXBlIHRvICJub25lIiwgcnVuIHZncmVkdWNlLCB0aGVuCitjaGFuZ2UgdGhlIFZHIGxvY2sgdHlwZSBiYWNrIHRvICJzYW5sb2NrIi4gIFNpbWlsYXJseSwgcHZtb3ZlIGNhbm5vdCBiZQordXNlZCBvbiBhIFBWIHVzZWQgYnkgdGhlIGx2bWxvY2sgTFYuCisKK1RvIHBsYWNlIHRoZSBsdm1sb2NrIExWIG9uIGEgc3BlY2lmaWMgZGV2aWNlLCBjcmVhdGUgdGhlIFZHIHdpdGggb25seSB0aGF0CitkZXZpY2UsIHRoZW4gdXNlIHZnZXh0ZW5kIHRvIGFkZCBvdGhlciBkZXZpY2VzLgorCisKKy5TUyBzaGFyZWQgTFZzCisKK1doZW4gYW4gTFYgaXMgdXNlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZSBob3N0cyAoZS5nLiBieSBhCittdWx0aVwtaG9zdC9jbHVzdGVyIGFwcGxpY2F0aW9uIG9yIGZpbGUgc3lzdGVtKSwgdGhlIExWIGNhbiBiZSBhY3RpdmF0ZWQKK29uIG11bHRpcGxlIGhvc3RzIGNvbmN1cnJlbnRseSB1c2luZyBhIHNoYXJlZCBsb2NrLgorCitUbyBhY3RpdmF0ZSB0aGUgTFYgd2l0aCBhIHNoYXJlZCBsb2NrOiAgbHZjaGFuZ2UgXC1hc3kgdmcvbHYuCisKK1dpdGggbHZtbG9ja2QsIGFuIHVuc3BlY2lmaWVkIGFjdGl2YXRpb24gbW9kZSBpcyBhbHdheXMgZXhjbHVzaXZlLCBpLmUuCitcLWF5IGRlZmF1bHRzIHRvIFwtYWV5LgorCitJZiB0aGUgTFYgdHlwZSBkb2VzIG5vdCBhbGxvdyB0aGUgTFYgdG8gYmUgdXNlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZQoraG9zdHMsIHRoZW4gYSBzaGFyZWQgYWN0aXZhdGlvbiBsb2NrIGlzIG5vdCBhbGxvd2VkIGFuZCB0aGUgbHZjaGFuZ2UKK2NvbW1hbmQgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBMViB0eXBlcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGNvbmN1cnJlbnRseQorZnJvbSBtdWx0aXBsZSBob3N0cyBpbmNsdWRlIHRoaW4sIGNhY2hlLCByYWlkLCBtaXJyb3IsIGFuZCBzbmFwc2hvdC4KKworbHZleHRlbmQgb24gTFYgd2l0aCBzaGFyZWQgbG9ja3MgaXMgbm90IHlldCBhbGxvd2VkLiAgVGhlIExWIG11c3QgYmUKK2RlYWN0aXZhdGVkLCBvciBhY3RpdmF0ZWQgZXhjbHVzaXZlbHkgdG8gcnVuIGx2ZXh0ZW5kLgorCisKKy5TUyByZWNvdmVyIGZyb20gbG9zdCBQViBob2xkaW5nIHNhbmxvY2sgbG9ja3MKKworVGhlIGdlbmVyYWwgYXBwcm9hY2ggaXMgdG8gY2hhbmdlIHRoZSBWRyBsb2NrIHR5cGUgdG8gIm5vbmUiLCBhbmQgdGhlbgorY2hhbmdlIHRoZSBsb2NrIHR5cGUgYmFjayB0byAic2FubG9jayIuICBUaGlzIHJlY3JlYXRlcyB0aGUgaW50ZXJuYWwKK2x2bWxvY2sgTFYgYW5kIHRoZSBuZWNlc3NhcnkgbG9ja3Mgb24gaXQuICBBZGRpdGlvbmFsIHN0ZXBzIG1heSBiZQorcmVxdWlyZWQgdG8gZGVhbCB3aXRoIHRoZSBtaXNzaW5nIFBWLgorCisKKy5TUyBsb2NraW5nIHN5c3RlbSBmYWlsdXJlcworCisuQiBsdm1sb2NrZCBmYWlsdXJlCisKK0lmIGx2bWxvY2tkIGZhaWxzIG9yIGlzIGtpbGxlZCB3aGlsZSBob2xkaW5nIGxvY2tzLCB0aGUgbG9ja3MgYXJlIG9ycGhhbmVkCitpbiB0aGUgbG9jayBtYW5hZ2VyLiAgbHZtbG9ja2QgY2FuIGJlIHJlc3RhcnRlZCB3aXRoIGFuIG9wdGlvbiB0byBhZG9wdAorbG9ja3MgaW4gdGhlIGxvY2sgbWFuYWdlciB0aGF0IGhhZCBiZWVuIGhlbGQgYnkgdGhlIHByZXZpb3VzIGluc3RhbmNlLgorCisuQiBkbG0vY29yb3N5bmMgZmFpbHVyZQorCitJZiBkbG0gb3IgY29yb3N5bmMgZmFpbCwgdGhlIGNsdXN0ZXJpbmcgc3lzdGVtIHdpbGwgZmVuY2UgdGhlIGhvc3QgdXNpbmcgYQorbWV0aG9kIGNvbmZpZ3VyZWQgd2l0aGluIHRoZSBkbG0vY29yb3N5bmMgY2x1c3RlcmluZyBlbnZpcm9ubWVudC4KKworTFZNIGNvbW1hbmRzIG9uIG90aGVyIGhvc3RzIHdpbGwgYmUgYmxvY2tlZCBmcm9tIGFjcXVpcmluZyBhbnkgbG9ja3MgdW50aWwKK3RoZSBkbG0vY29yb3N5bmMgcmVjb3ZlcnkgcHJvY2VzcyBpcyBjb21wbGV0ZS4KKworLkIgc2FubG9jayBsZWFzZSBzdG9yYWdlIGZhaWx1cmUKKworSWYgdGhlIFBWIHVuZGVyIGEgc2FubG9jayBWRydzIGx2bWxvY2sgTFYgaXMgZGlzY29ubmVjdGVkLCB1bnJlc3BvbnNpdmUgb3IKK3RvbyBzbG93LCBzYW5sb2NrIGNhbm5vdCByZW5ldyB0aGUgbGVhc2UgZm9yIHRoZSBWRydzIGxvY2tzLiAgQWZ0ZXIgc29tZQordGltZSwgdGhlIGxlYXNlIHdpbGwgZXhwaXJlLCBhbmQgbG9ja3MgdGhhdCB0aGUgaG9zdCBvd25zIGluIHRoZSBWRyBjYW4gYmUKK2FjcXVpcmVkIGJ5IG90aGVyIGhvc3RzLiAgVGhlIFZHIG11c3QgYmUgZm9yY2libHkgZGVhY3RpdmF0ZWQgb24gdGhlIGhvc3QKK3dpdGggdGhlIGV4cGlyaW5nIGxlYXNlIGJlZm9yZSBvdGhlciBob3N0cyBjYW4gYWNxdWlyZSBpdHMgbG9ja3MuCisKK1doZW4gdGhlIHNhbmxvY2sgZGFlbW9uIGRldGVjdHMgdGhhdCB0aGUgbGVhc2Ugc3RvcmFnZSBpcyBsb3N0LCBpdCBydW5zCit0aGUgY29tbWFuZCBsdm1sb2NrY3RsIFwtXC1raWxsIDx2Z25hbWU+LiAgVGhpcyBjb21tYW5kIGVtaXRzIGEgc3lzbG9nCittZXNzYWdlIHN0YXRpbmcgdGhhdCBsZWFzZSBzdG9yYWdlIGlzIGxvc3QgZm9yIHRoZSBWRyBhbmQgTFZzIG11c3QgYmUKK2ltbWVkaWF0ZWx5IGRlYWN0aXZhdGVkLgorCitJZiBubyBMVnMgYXJlIGFjdGl2ZSBpbiB0aGUgVkcsIHRoZW4gdGhlIGxvY2tzcGFjZSB3aXRoIGFuIGV4cGlyaW5nIGxlYXNlCit3aWxsIGJlIHJlbW92ZWQsIGFuZCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCB3aGVuIHRyeWluZyB0byB1c2UgdGhlIFZHLgorVXNlIHRoZSBsdm1sb2NrY3RsIFwtXC1kcm9wIGNvbW1hbmQgdG8gY2xlYXIgdGhlIHN0YWxlIGxvY2tzcGFjZSBmcm9tCitsdm1sb2NrZC4KKworSWYgdGhlIFZHIGhhcyBhY3RpdmUgTFZzIHdoZW4gdGhlIGxvY2sgc3RvcmFnZSBpcyBsb3N0LCB0aGUgTFZzIG11c3QgYmUKK3F1aWNrbHkgZGVhY3RpdmF0ZWQgYmVmb3JlIHRoZSBsb2Nrc3BhY2UgbGVhc2UgZXhwaXJlcy4gIEFmdGVyIGFsbCBMVnMgYXJlCitkZWFjdGl2YXRlZCwgcnVuIGx2bWxvY2tjdGwgXC1cLWRyb3AgPHZnbmFtZT4gdG8gY2xlYXIgdGhlIGV4cGlyaW5nCitsb2Nrc3BhY2UgZnJvbSBsdm1sb2NrZC4gIElmIGFsbCBMVnMgaW4gdGhlIFZHIGFyZSBub3QgZGVhY3RpdmF0ZWQgd2l0aGluCithYm91dCA0MCBzZWNvbmRzLCBzYW5sb2NrIHdpbGwgcmVzZXQgdGhlIGhvc3QgdXNpbmcgdGhlIGxvY2FsIHdhdGNoZG9nLgorVGhlIG1hY2hpbmUgcmVzZXQgaXMgZWZmZWN0aXZlbHkgYSBzZXZlcmUgZm9ybSBvZiAiZGVhY3RpdmF0aW5nIiBMVnMKK2JlZm9yZSB0aGV5IGNhbiBiZSBhY3RpdmF0ZWQgb24gb3RoZXIgaG9zdHMuICBUaGUgcmVzZXQgaXMgY29uc2lkZXJlZCBhCitiZXR0ZXIgYWx0ZXJuYXRpdmUgdGhhbiBoYXZpbmcgTFZzIHVzZWQgYnkgbXVsdGlwbGUgaG9zdHMgYXQgb25jZSwgd2hpY2gKK2NvdWxkIGVhc2lseSBkYW1hZ2Ugb3IgZGVzdHJveSB0aGVpciBjb250ZW50LgorCitJbiB0aGUgZnV0dXJlLCB0aGUgbHZtbG9ja2N0bCBraWxsIGNvbW1hbmQgbWF5IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0bworZm9yY2libHkgZGVhY3RpdmF0ZSBMVnMgYmVmb3JlIHRoZSBzYW5sb2NrIGxlYXNlIGV4cGlyZXMuICBVbnRpbCB0aGVuLCB0aGUKK3VzZXIgbXVzdCBub3RpY2UgdGhlIHN5c2xvZyBtZXNzYWdlIGFuZCBtYW51YWxseSBkZWFjdGl2YXRlIHRoZSBWRyBiZWZvcmUKK3NhbmxvY2sgcmVzZXRzIHRoZSBtYWNoaW5lLgorCisuQiBzYW5sb2NrIGRhZW1vbiBmYWlsdXJlCisKK0lmIHRoZSBzYW5sb2NrIGRhZW1vbiBmYWlscyBvciBleGl0cyB3aGlsZSBhIGxvY2tzcGFjZSBpcyBzdGFydGVkLCB0aGUKK2xvY2FsIHdhdGNoZG9nIHdpbGwgcmVzZXQgdGhlIGhvc3QuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcm90ZWN0IGFueQorYXBwbGljYXRpb24gcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHNhbmxvY2sgbGVhc2VzIHdoaWNoIHdpbGwgYmUgbG9zdAord2l0aG91dCBzYW5sb2NrIHJ1bm5pbmcuCisKKworLlNTIGNoYW5naW5nIGRsbSBjbHVzdGVyIG5hbWUKKworV2hlbiBhIGRsbSBWRyBpcyBjcmVhdGVkLCB0aGUgY2x1c3RlciBuYW1lIGlzIHNhdmVkIGluIHRoZSBWRyBtZXRhZGF0YS4KK1RvIHVzZSB0aGUgVkcsIGEgaG9zdCBtdXN0IGJlIGluIHRoZSBuYW1lZCBkbG0gY2x1c3Rlci4gIElmIHRoZSBkbG0KK2NsdXN0ZXIgbmFtZSBjaGFuZ2VzLCBvciB0aGUgVkcgaXMgbW92ZWQgdG8gYSBuZXcgY2x1c3RlciwgdGhlIGRsbSBjbHVzdGVyCituYW1lIHNhdmVkIGluIHRoZSBWRyBtdXN0IGFsc28gYmUgY2hhbmdlZC4KKworVG8gc2VlIHRoZSBkbG0gY2x1c3RlciBuYW1lIHNhdmVkIGluIHRoZSBWRywgdXNlIHRoZSBjb21tYW5kOgorLmJyCit2Z3MgLW8rbG9ja3R5cGUsbG9ja2FyZ3MgPHZnbmFtZT4KKworVG8gY2hhbmdlIHRoZSBkbG0gY2x1c3RlciBuYW1lIGluIHRoZSBWRyB3aGVuIHRoZSBWRyBpcyBzdGlsbCB1c2VkIGJ5IHRoZQorb3JpZ2luYWwgY2x1c3RlcjoKKworLklQIFxbYnVdIDIKK1N0b3AgdGhlIFZHIG9uIGFsbCBob3N0czoKKy5icgordmdjaGFuZ2UgLS1sb2NrLXN0b3AgPHZnbmFtZT4KKworLklQIFxbYnVdIDIKK0NoYW5nZSB0aGUgVkcgbG9jayB0eXBlIHRvIG5vbmU6CisuYnIKK3ZnY2hhbmdlIFwtXC1sb2NrXC10eXBlIG5vbmUgPHZnbmFtZT4KKworLklQIFxbYnVdIDIKK0NoYW5nZSB0aGUgZGxtIGNsdXN0ZXIgbmFtZSBvbiB0aGUgaG9zdCBvciBtb3ZlIHRoZSBWRyB0byB0aGUgbmV3IGNsdXN0ZXIuCitUaGUgbmV3IGRsbSBjbHVzdGVyIG11c3Qgbm93IGJlIGFjdGl2ZSBvbiB0aGUgaG9zdC4gIFZlcmlmeSB0aGUgbmV3IG5hbWUKK2J5OgorLmJyCitjYXQgL3N5cy9rZXJuZWwvY29uZmlnL2RsbS9jbHVzdGVyL2NsdXN0ZXJfbmFtZQorCisuSVAgXFtidV0gMgorQ2hhbmdlIHRoZSBWRyBsb2NrIHR5cGUgYmFjayB0byBkbG0gd2hpY2ggc2V0cyB0aGUgbmV3IGNsdXN0ZXIgbmFtZToKKy5icgordmdjaGFuZ2UgXC1cLWxvY2tcLXR5cGUgZGxtIDx2Z25hbWU+CisKKy5JUCBcW2J1XSAyCitTdGFydCB0aGUgVkcgb24gaG9zdHMgdG8gdXNlIGl0OgorLmJyCit2Z2NoYW5nZSAtLWxvY2stc3RhcnQgPHZnbmFtZT4KKworLlAKKworVG8gY2hhbmdlIHRoZSBkbG0gY2x1c3RlciBuYW1lIGluIHRoZSBWRyB3aGVuIHRoZSBkbG0gY2x1c3RlciBuYW1lIGhhcworYWxyZWFkeSBjaGFuZ2VkLCBvciB0aGUgVkcgaGFzIGFscmVhZHkgbW92ZWQgdG8gYSBkaWZmZXJlbnQgY2x1c3RlcjoKKworLklQIFxbYnVdIDIKK0Vuc3VyZSB0aGUgVkcgaXMgbm90IGJlaW5nIHVzZWQgYnkgYW55IGhvc3RzLgorCisuSVAgXFtidV0gMgorVGhlIG5ldyBkbG0gY2x1c3RlciBtdXN0IGJlIGFjdGl2ZSBvbiB0aGUgaG9zdCBtYWtpbmcgdGhlIGNoYW5nZS4KK1RoZSBjdXJyZW50IGRsbSBjbHVzdGVyIG5hbWUgY2FuIGJlIHNlZW4gYnk6CisuYnIKK2NhdCAvc3lzL2tlcm5lbC9jb25maWcvZGxtL2NsdXN0ZXIvY2x1c3Rlcl9uYW1lCisKKy5JUCBcW2J1XSAyCitDaGFuZ2UgdGhlIFZHIGxvY2sgdHlwZSB0byBub25lOgorLmJyCit2Z2NoYW5nZSBcLVwtbG9ja1wtdHlwZSBub25lIFwtXC1mb3JjZSA8dmduYW1lPgorCisuSVAgXFtidV0gMgorQ2hhbmdlIHRoZSBWRyBsb2NrIHR5cGUgYmFjayB0byBkbG0gd2hpY2ggc2V0cyB0aGUgbmV3IGNsdXN0ZXIgbmFtZToKKy5icgordmdjaGFuZ2UgXC1cLWxvY2tcLXR5cGUgZGxtIDx2Z25hbWU+CisKKy5JUCBcW2J1XSAyCitTdGFydCB0aGUgVkcgb24gaG9zdHMgdG8gdXNlIGl0OgorLmJyCit2Z2NoYW5nZSAtLWxvY2stc3RhcnQgPHZnbmFtZT4KKworCisuU1MgY2hhbmdpbmcgYSBsb2NhbCBWRyB0byBhIGxvY2tkIFZHCisKK0FsbCBMVnMgbXVzdCBiZSBpbmFjdGl2ZSB0byBjaGFuZ2UgdGhlIGxvY2sgdHlwZS4KKworbHZtbG9ja2QgbXVzdCBiZSBjb25maWd1cmVkIGFuZCBydW5uaW5nIGFzIGRlc2NyaWJlZCBpbiBVU0FHRS4KKworQ2hhbmdlIGEgbG9jYWwgVkcgdG8gYSBsb2NrZCBWRyB3aXRoIHRoZSBjb21tYW5kOgorLmJyCit2Z2NoYW5nZSBcLVwtbG9ja1wtdHlwZSBzYW5sb2NrfGRsbSA8dmduYW1lPgorCitTdGFydCB0aGUgVkcgb24gaG9zdHMgdG8gdXNlIGl0OgorLmJyCit2Z2NoYW5nZSBcLVwtbG9ja1wtc3RhcnQgPHZnbmFtZT4KKworCisuU1MgY2hhbmdpbmcgYSBsb2NrZCBWRyB0byBhIGxvY2FsIFZHCisKK1N0b3AgdGhlIGxvY2tkIFZHIG9uIGFsbCBob3N0cywgdGhlbiBydW46CisuYnIKK3ZnY2hhbmdlIFwtXC1sb2NrXC10eXBlIG5vbmUgPHZnbmFtZT4KKworVG8gY2hhbmdlIGEgVkcgZnJvbSBvbmUgbG9ja2QgdHlwZSB0byBhbm90aGVyIChpLmUuIGJldHdlZW4gc2FubG9jayBhbmQKK2RsbSksIGZpcnN0IGNoYW5nZSBpdCB0byBhIGxvY2FsIFZHLCB0aGVuIHRvIHRoZSBuZXcgdHlwZS4KKworCisuU1MgY2hhbmdpbmcgYSBjbHZtIFZHIHRvIGEgbG9ja2QgVkcKKworQWxsIExWcyBtdXN0IGJlIGluYWN0aXZlIHRvIGNoYW5nZSB0aGUgbG9jayB0eXBlLgorCitGaXJzdCBjaGFuZ2UgdGhlIGNsdm0gVkcgdG8gYSBsb2NhbCBWRy4gIFdpdGhpbiBhIHJ1bm5pbmcgY2x2bSBjbHVzdGVyLAorY2hhbmdlIGEgY2x2bSBWRyB0byBhIGxvY2FsIFZHIHdpdGggdGhlIGNvbW1hbmQ6CisKK3ZnY2hhbmdlIFwtY24gPHZnbmFtZT4KKworSWYgdGhlIGNsdm0gY2x1c3RlciBpcyBubyBsb25nZXIgcnVubmluZyBvbiBhbnkgbm9kZXMsIHRoZW4gZXh0cmEgb3B0aW9ucworY2FuIGJlIHVzZWQgdG8gZm9yY2libHkgbWFrZSB0aGUgVkcgbG9jYWwuICBDYXV0aW9uOiB0aGlzIGlzIG9ubHkgc2FmZSBpZgorYWxsIG5vZGVzIGhhdmUgc3RvcHBlZCB1c2luZyB0aGUgVkc6CisKK3ZnY2hhbmdlIFwtXC1jb25maWcgJ2dsb2JhbC9sb2NraW5nX3R5cGU9MCBnbG9iYWwvdXNlX2x2bWxvY2tkPTAnCisuUlMKK1wtY24gPHZnbmFtZT4KKy5SRQorCitBZnRlciB0aGUgVkcgaXMgbG9jYWwsIGZvbGxvdyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJjaGFuZ2luZyBhIGxvY2FsIFZHCit0byBhIGxvY2tkIFZHIi4KKworCisuU1MgbGltaXRhdGlvbnMgb2YgbG9ja2QgVkdzCisKK1RoaW5ncyB0aGF0IGRvIG5vdCB5ZXQgd29yayBpbiBsb2NrZCBWR3M6CisuYnIKK1xbYnVdCitjcmVhdGluZyBhIG5ldyB0aGluIHBvb2wgYW5kIGEgbmV3IHRoaW4gTFYgaW4gYSBzaW5nbGUgY29tbWFuZAorLmJyCitcW2J1XQordXNpbmcgbHZjcmVhdGUgdG8gY3JlYXRlIGNhY2hlIHBvb2xzIG9yIGNhY2hlIExWcyAodXNlIGx2Y29udmVydCkKKy5icgorXFtidV0KK3VzaW5nIGV4dGVybmFsIG9yaWdpbnMgZm9yIHRoaW4gTFZzCisuYnIKK1xbYnVdCitzcGxpdHRpbmcgbWlycm9ycyBhbmQgc25hcHNob3RzIGZyb20gTFZzCisuYnIKK1xbYnVdCit2Z3NwbGl0CisuYnIKK1xbYnVdCit2Z21lcmdlCisuYnIKK1xbYnVdCityZXNpemluZyBhbiBMViB0aGF0IGlzIGFjdGl2ZSBpbiB0aGUgc2hhcmVkIG1vZGUgb24gbXVsdGlwbGUgaG9zdHMKKworCisuU1MgbHZtbG9ja2QgY2hhbmdlcyBmcm9tIGNsdm1kCisKKyhTZWUgYWJvdmUgZm9yIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgY2x2bSBWRyB0byBhIGxvY2tkIFZHLikKKworV2hpbGUgbHZtbG9ja2QgYW5kIGNsdm1kIGFyZSBlbnRpcmVseSBkaWZmZXJlbnQgc3lzdGVtcywgTFZNIGNvbW1hbmQgdXNhZ2UKK3JlbWFpbnMgc2ltaWxhci4gIERpZmZlcmVuY2VzIGFyZSBtb3JlIG5vdGFibGUgd2hlbiB1c2luZyBsdm1sb2NrZCdzCitzYW5sb2NrIG9wdGlvbi4KKworVmlzaWJsZSB1c2FnZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGxvY2tkIFZHcyB3aXRoIGx2bWxvY2tkIGFuZCBjbHZtIFZHcword2l0aCBjbHZtZDoKKworLklQIFxbYnVdIDIKK2x2bS5jb25mIG11c3QgYmUgY29uZmlndXJlZCB0byB1c2UgZWl0aGVyIGx2bWxvY2tkICh1c2VfbHZtbG9ja2Q9MSkgb3IKK2Nsdm1kIChsb2NraW5nX3R5cGU9MyksIGJ1dCBub3QgYm90aC4KKworLklQIFxbYnVdIDIKK3ZnY3JlYXRlIFwtXC1zaGFyZWQgY3JlYXRlcyBhIGxvY2tkIFZHLCBhbmQgdmdjcmVhdGUgXC1cLWNsdXN0ZXJlZCB5CitjcmVhdGVzIGEgY2x2bSBWRy4KKworLklQIFxbYnVdIDIKK2x2bWxvY2tkIGFkZHMgdGhlIG9wdGlvbiBvZiB1c2luZyBzYW5sb2NrIGZvciBsb2NraW5nLCBhdm9pZGluZyB0aGUKK25lZWQgZm9yIG5ldHdvcmsgY2x1c3RlcmluZy4KKworLklQIFxbYnVdIDIKK2x2bWxvY2tkIGRlZmF1bHRzIHRvIHRoZSBleGNsdXNpdmUgYWN0aXZhdGlvbiBtb2RlIHdoZW5ldmVyIHRoZSBhY3RpdmF0aW9uCittb2RlIGlzIHVuc3BlY2lmaWVkLCBpLmUuIFwtYXkgbWVhbnMgXC1hZXksIG5vdCBcLWFzeS4KKworLklQIFxbYnVdIDIKK2x2bWxvY2tkIGNvbW1hbmRzIGFsd2F5cyBhcHBseSB0byB0aGUgbG9jYWwgaG9zdCwgYW5kIG5ldmVyIGhhdmUgYW4gZWZmZWN0CitvbiBhIHJlbW90ZSBob3N0LiAgKFRoZSBhY3RpdmF0aW9uIG9wdGlvbiAnbCcgaXMgbm90IHVzZWQuKQorCisuSVAgXFtidV0gMgorbHZtbG9ja2Qgd29ya3Mgd2l0aCB0aGluIGFuZCBjYWNoZSBwb29scyBhbmQgTFZzLgorCisuSVAgXFtidV0gMgorbHZtbG9ja2Qgd29ya3Mgd2l0aCBsdm1ldGFkLgorCisuSVAgXFtidV0gMgorbHZtbG9ja2Qgc2F2ZXMgdGhlIGNsdXN0ZXIgbmFtZSBmb3IgYSBsb2NrZCBWRyB1c2luZyBkbG0uICBPbmx5IGhvc3RzIGluCit0aGUgbWF0Y2hpbmcgY2x1c3RlciBjYW4gdXNlIHRoZSBWRy4KKworLklQIFxbYnVdIDIKK2x2bWxvY2tkIHJlcXVpcmVzIHN0YXJ0aW5nL3N0b3BwaW5nIGxvY2tkIFZHcyB3aXRoIHZnY2hhbmdlIFwtXC1sb2NrLXN0YXJ0CithbmQgXC1cLWxvY2stc3RvcC4KKworLklQIFxbYnVdIDIKK3ZncmVtb3ZlIG9mIGEgc2FubG9jayBWRyBtYXkgZmFpbCBpbmRpY2F0aW5nIHRoYXQgYWxsIGhvc3RzIGhhdmUgbm90CitzdG9wcGVkIHRoZSBWRyBsb2Nrc3BhY2UuICBTdG9wIHRoZSBWRyBvbiBhbGwgaG9zdHMgdXNpbmcgdmdjaGFuZ2UKK1wtXC1sb2NrLXN0b3AuCisKKy5JUCBcW2J1XSAyCit2Z3JlZHVjZSBvciBwdm1vdmUgb2YgYSBQViBpbiBhIHNhbmxvY2sgVkcgd2lsbCBmYWlsIGlmIGl0IGhvbGRzIHRoZQoraW50ZXJuYWwgImx2bWxvY2siIExWIHRoYXQgaG9sZHMgdGhlIHNhbmxvY2sgbG9ja3MuCisKKy5JUCBcW2J1XSAyCitsdm1sb2NrZCB1c2VzIGxvY2sgcmV0cmllcyBpbnN0ZWFkIG9mIGxvY2sgcXVldWVpbmcsIHNvIGhpZ2ggbG9jaworY29udGVudGlvbiBtYXkgcmVxdWlyZSBpbmNyZWFzaW5nIGdsb2JhbC9sdm1sb2NrZF9sb2NrX3JldHJpZXMgdG8KK2F2b2lkIHRyYW5zaWVudCBsb2NrIGZhaWx1cmVzLgorCisuSVAgXFtidV0gMgorbHZtbG9ja2QgaW5jbHVkZXMgVkcgcmVwb3J0aW5nIG9wdGlvbnMgbG9ja190eXBlIGFuZCBsb2NrX2FyZ3MsIGFuZCBMVgorcmVwb3J0aW5nIG9wdGlvbiBsb2NrX2FyZ3MgdG8gdmlldyB0aGUgY29ycmVzcG9uZGluZyBtZXRhZGF0YSBmaWVsZHMuCisKKy5JUCBcW2J1XSAyCitJbiB0aGUgJ3ZncycgY29tbWFuZCdzIHNpeHRoIFZHIGF0dHIgZmllbGQsICJzIiBmb3IgInNoYXJlZCIgaXMgZGlzcGxheWVkCitmb3IgbG9ja2QgVkdzLgorCisuSVAgXFtidV0gMgorSWYgbHZtbG9ja2QgZmFpbHMgb3IgaXMga2lsbGVkIHdoaWxlIGluIHVzZSwgbG9ja3MgaXQgaGVsZCByZW1haW4gYnV0IGFyZQorb3JwaGFuZWQgaW4gdGhlIGxvY2sgbWFuYWdlci4gIGx2bWxvY2tkIGNhbiBiZSByZXN0YXJ0ZWQgd2l0aCBhbiBvcHRpb24gdG8KK2Fkb3B0IHRoZSBvcnBoYW4gbG9ja3MgZnJvbSB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgbHZtbG9ja2QuCisKKy5QCmRpZmYgLS1naXQgYS9tYW4vbHZtcG9sbGQuOC5pbiBiL21hbi9sdm1wb2xsZC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWUxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vbHZtcG9sbGQuOC5pbgpAQCAtMCwwICsxLDkwIEBACisuVEggTFZNUE9MTEQgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQgSW5jIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZtcG9sbGQgXChlbSBMVk0gcG9sbCBkYWVtb24KKy5TSCBTWU5PUFNJUworLkIgbHZtcG9sbGQKKy5SQiBbIFwtbCB8IFwtXC1sb2cKKy5SSSB7IGFsbCB8IHdpcmUgfCBkZWJ1ZyB9XQorLlJCIFsgXC1wIHwgXC1cLXBpZGZpbGUKKy5JUiBwaWRmaWxlX3BhdGggXQorLlJCIFsgXC1zIHwgXC1cLXNvY2tldAorLklSIHNvY2tldF9wYXRoIF0KKy5SQiBbIFwtQiB8IFwtXC1iaW5hcnkKKy5JUiBsdm1fYmluYXJ5X3BhdGggXQorLlJCIFsgXC10IHwgXC1cLXRpbWVvdXQKKy5JUiB0aW1lb3V0X3ZhbHVlIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JlZ3JvdW5kIF0KKy5SQiBbIFwtaCB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtViB8IFwtXC12ZXJzaW9uIF0KKworLkIgbHZtcG9sbGQKKy5SQiBbIFwtXC1kdW1wIF0KKy5TSCBERVNDUklQVElPTgorbHZtcG9sbGQgaXMgcG9sbGluZyBkYWVtb24gZm9yIExWTS4gVGhlIGRhZW1vbiByZWNlaXZlcyByZXF1ZXN0cyBmb3IgcG9sbGluZworb2YgYWxyZWFkeSBpbml0aWFsaXNlZCBvcGVyYXRpb25zIG9yaWdpbmF0aW5nIGluIExWTTIgY29tbWFuZCBsaW5lIHRvb2wuCitUaGUgcmVxdWVzdHMgZm9yIHBvbGxpbmcgb3JpZ2luYXRlIGluIHRoZSBcZkJsdmNvbnZlcnRcZlAsIFxmQnB2bW92ZVxmUCwKK1xmQmx2Y2hhbmdlXGZQIG9yIFxmQnZnY2hhbmdlXGZQIExWTTIgY29tbWFuZHMuCisKK1RoZSBwdXJwb3NlIG9mIGx2bXBvbGxkIGlzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNwYXduZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMKK3BlciBvdGhlcndpc2UgdW5pcXVlIHBvbGxpbmcgb3BlcmF0aW9uLiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUuIEl0IGFsc28KK2VsaW1pbmF0ZXMgdGhlIHBvc3NpYmlsaXR5IG9mIHVuc29saWNpdGVkIHRlcm1pbmF0aW9uIG9mIGJhY2tncm91bmQgcHJvY2VzcyBieQorZXh0ZXJuYWwgZmFjdG9ycy4KKworbHZtcG9sbGQgaXMgdXNlZCBieSBMVk0gb25seSBpZiBpdCBpcyBlbmFibGVkIGluIFxmQmx2bS5jb25mXGZQKDUpIGJ5CitzcGVjaWZ5aW5nIHRoZSBcZkJnbG9iYWwvdXNlX2x2bXBvbGxkXGZQIHNldHRpbmcuIElmIHRoaXMgaXMgbm90IGRlZmluZWQgaW4gdGhlCitMVk0gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IHRoZW4gZGVmYXVsdCBzZXR0aW5nIGlzIHVzZWQgaW5zdGVhZCAoc2VlIHRoZQorb3V0cHV0IG9mIFxmQmx2bWNvbmZpZyBcLVwtdHlwZSBkZWZhdWx0IGdsb2JhbC91c2VfbHZtcG9sbGRcZlAgY29tbWFuZCkuCisuU0ggT1BUSU9OUworCitUbyBydW4gdGhlIGRhZW1vbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgYm90aCB0aGUgcGlkZmlsZV9wYXRoIGFuZCB0aGUKK3NvY2tldF9wYXRoIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHRzLgorLlRQCisuQlIgXC1mICIsICIgXC1cLWZvcmVncm91bmQKK0Rvbid0IGZvcmssIGJ1dCBydW4gaW4gdGhlIGZvcmVncm91bmQuCisuVFAKKy5CUiBcLWggIiwgIiBcLVwtaGVscAorU2hvdyBoZWxwIGluZm9ybWF0aW9uLgorLlRQCisuSVIgXGZCXC1sXGZQICIsICIgXGZCXC1cLWxvZ1xmUCAiIHsiIGFsbCB8IHdpcmUgfCBkZWJ1ZyB9CitTZWxlY3QgdGhlIHR5cGUgb2YgbG9nIG1lc3NhZ2VzIHRvIGdlbmVyYXRlLgorTWVzc2FnZXMgYXJlIGxvZ2dlZCBieSBzeXNsb2cuCitBZGRpdGlvbmFsbHksIHdoZW4gXC1mIGlzIGdpdmVuIHRoZXkgYXJlIGFsc28gc2VudCB0byBzdGFuZGFyZCBlcnJvci4KK1RoZXJlIGFyZSB0d28gY2xhc3NlcyBvZiBtZXNzYWdlczogd2lyZSBhbmQgZGVidWcuIFNlbGVjdGluZyAnYWxsJyBzdXBwbGllcyBib3RoCithbmQgaXMgZXF1aXZhbGVudCB0byBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IFwtbCB3aXJlLGRlYnVnLgorLlRQCisuQlIgXC1wICIsICIgXC1cLXBpZGZpbGUgIiAiIFxmSXBpZGZpbGVfcGF0aAorUGF0aCB0byB0aGUgcGlkZmlsZS4gVGhpcyBvdmVycmlkZXMgYm90aCB0aGUgYnVpbHQtaW4gZGVmYXVsdAorKCNERUZBVUxUX1BJRF9ESVIjL2x2bXBvbGxkLnBpZCkgYW5kIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCTFZNX0xWTVBPTExEX1BJREZJTEVcZlAuICBUaGlzIGZpbGUgaXMgdXNlZCB0byBwcmV2ZW50IG1vcmUKK3RoYW4gb25lIGluc3RhbmNlIG9mIHRoZSBkYWVtb24gcnVubmluZyBzaW11bHRhbmVvdXNseS4KKy5UUAorLkJSIFwtcyAiLCAiIFwtXC1zb2NrZXQgIiAiIFxmSXNvY2tldF9wYXRoCitQYXRoIHRvIHRoZSBzb2NrZXQgZmlsZS4gVGhpcyBvdmVycmlkZXMgYm90aCB0aGUgYnVpbHQtaW4gZGVmYXVsdAorKCNERUZBVUxUX1JVTl9ESVIjL2x2bXBvbGxkLnNvY2tldCkgYW5kIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCTFZNX0xWTVBPTExEX1NPQ0tFVFxmUC4KKy5UUAorLkJSIFwtdCAiLCAiIFwtXC10aW1lb3V0ICIgIiBcZkl0aW1lb3V0X3ZhbHVlCitUaGUgZGFlbW9uIG1heSBzaHV0ZG93biBhZnRlciBiZWluZyBpZGxlIGZvciB0aGUgZ2l2ZW4gdGltZSAoaW4gc2Vjb25kcykuIFdoZW4gdGhlCitvcHRpb24gaXMgb21pdHRlZCBvciB0aGUgdmFsdWUgZ2l2ZW4gaXMgemVybyB0aGUgZGFlbW9uIG5ldmVyIHNodXRkb3ducyBvbiBpZGxlLgorLlRQCisuQlIgXC1CICIsICIgXC1cLWJpbmFyeSAiICIgXGZJbHZtX2JpbmFyeV9wYXRoCitPcHRpb25hbCBwYXRoIHRvIGFsdGVybmF0aXZlIExWTSBiaW5hcnkgKGRlZmF1bHQ6ICNMVk1fUEFUSCMpLiBVc2UgZm9yCit0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuCisuVFAKKy5CUiBcLVYgIiwgIiBcLVwtdmVyc2lvbgorRGlzcGxheSB0aGUgdmVyc2lvbiBvZiBsdm1wb2xsZCBkYWVtb24uCisuVFAKKy5CIFwtXC1kdW1wCitDb250YWN0IHRoZSBydW5uaW5nIGx2bXBvbGxkIGRhZW1vbiB0byBvYnRhaW4gdGhlIGNvbXBsZXRlIHN0YXRlIGFuZCBwcmludCBpdAorb3V0IGluIGEgcmF3IGZvcm1hdC4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy5UUAorLkIgTFZNX0xWTVBPTExEX1BJREZJTEUKK1BhdGggZm9yIHRoZSBwaWQgZmlsZS4KKy5UUAorLkIgTFZNX0xWTVBPTExEX1NPQ0tFVAorUGF0aCBmb3IgdGhlIHNvY2tldCBmaWxlLgorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIGx2bS5jb25mICg1KQpkaWZmIC0tZ2l0IGEvbWFuL2x2bXNhZGMuOC5pbiBiL21hbi9sdm1zYWRjLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1NmRlMgotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm1zYWRjLjguaW4KQEAgLTAsMCArMSwxMyBAQAorLlRIICJMVk1TQURDIiAiOCIgIkxWTSBUT09MUyAjVkVSU0lPTiMiICJSZWQgSGF0LCBJbmMiICJcIiIKKworLlNIICJOQU1FIgorbHZtc2FkYyBcKGVtIExWTSBzeXN0ZW0gYWN0aXZpdHkgZGF0YSBjb2xsZWN0b3IKKworLlNIICJTWU5PUFNJUyIKKy5CIGx2bXNhZGMKKworLlNIICJERVNDUklQVElPTiIKK2x2bXNhZGMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgdW5kZXIgTFZNMi4KKworLlNIICJTRUUgQUxTTyIKKy5CUiBsdm0gKDgpCmRpZmYgLS1naXQgYS9tYW4vbHZtc2FyLjguaW4gYi9tYW4vbHZtc2FyLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhNjEzMgotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm1zYXIuOC5pbgpAQCAtMCwwICsxLDEzIEBACisuVEggIkxWTVNBUiIgIjgiICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiUmVkIEhhdCwgSW5jIiAiXCIiCisKKy5TSCAiTkFNRSIKK2x2bXNhciBcKGVtIExWTSBzeXN0ZW0gYWN0aXZpdHkgcmVwb3J0ZXIKKworLlNIICJTWU5PUFNJUyIKKy5CIGx2bXNhcgorCisuU0ggIkRFU0NSSVBUSU9OIgorbHZtc2FyIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHVuZGVyIExWTTIuCisKKy5TSCAiU0VFIEFMU08iCisuQlIgbHZtICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2bXN5c3RlbWlkLjcuaW4gYi9tYW4vbHZtc3lzdGVtaWQuNy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVhOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2bXN5c3RlbWlkLjcuaW4KQEAgLTAsMCArMSwzNTQgQEAKKy5USCAiTFZNU1lTVEVNSUQiICI3IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorCisuU0ggTkFNRQorbHZtc3lzdGVtaWQgXChlbSBMVk0gc3lzdGVtIElECisKKy5TSCBERVNDUklQVElPTgorCitMb2NhbCBWR3MgbWF5IGV4aXN0IG9uIHNoYXJlZCBzdG9yYWdlIHdoZXJlIHRoZXkgYXJlIHZpc2libGUgdG8gbXVsdGlwbGUKK2hvc3RzLiAgVGhlc2UgVkdzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG9ubHkgYSBzaW5nbGUgbWFjaGluZSwgZXZlbgordGhvdWdoIHRoZXkgYXJlIHZpc2libGUgdG8gbWFueS4gIEEgc3lzdGVtX2lkIGlkZW50aWZ5aW5nIGEgc2luZ2xlIGhvc3QKK2NhbiBiZSBhc3NpZ25lZCB0byBhIFZHIHRvIGluZGljYXRlIHRoZSBWR3Mgb3duZXIuICBUaGUgVkcgb3duZXIgY2FuIHVzZQordGhlIFZHIGFzIHVzdWFsLCBhbmQgYWxsIG90aGVyIGhvc3RzIHdpbGwgaWdub3JlIGl0LiAgVGhpcyBwcm90ZWN0cyB0aGUgVkcKK2Zyb20gYWNjaWRlbnRhbCB1c2UgYnkgb3RoZXIgaG9zdHMuCisKK1RoZSBzeXN0ZW1faWQgaXMgbm90IGEgZHluYW1pYyBwcm9wZXJ0eSwgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQgaW4gdmVyeQorbGltaXRlZCBjaXJjdW1zdGFuY2VzIChzZWUgdmdleHBvcnQgYW5kIHZnaW1wb3J0KS4gIEV2ZW4gbGltaXRlZCBjaGFuZ2VzCit0byB0aGUgVkcgc3lzdGVtX2lkIGFyZSBub3QgcGVyZmVjdGx5IHJlZmxlY3RlZCBhY3Jvc3MgaG9zdHMuICBBIG1vcmUKK2NvaGVyZW50IHZpZXcgb2Ygc2hhcmVkIHN0b3JhZ2UgcmVxdWlyZXMgdXNpbmcgYW4gaW50ZXItaG9zdCBsb2NraW5nCitzeXN0ZW0gdG8gY29vcmRpbmF0ZSBhY2Nlc3MgYW5kIHVwZGF0ZSBjYWNoZXMuCisKK1RoZSBzeXN0ZW1faWQgaXMgYSBzdHJpbmcgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYSBob3N0LiAgSXQgY2FuIGJlIG1hbnVhbGx5CitzZXQgdG8gYSBjdXN0b20gdmFsdWUgb3IgaXQgY2FuIGJlIGFzc2lnbmVkIGF1dG9tYXRpY2FsbHkgYnkgbHZtIHVzaW5nIGEKK3VuaXF1ZSBpZGVudGlmaWVyIGFscmVhZHkgYXZhaWxhYmxlIG9uIHRoZSBob3N0LCBlLmcuIG1hY2hpbmUtaWQgb3IgdW5hbWUuCisKK0luIHZnY3JlYXRlLCB0aGUgbG9jYWwgc3lzdGVtX2lkIGlzIHNhdmVkIGluIHRoZSBuZXcgVkcgbWV0YWRhdGEuICBUaGUKK2xvY2FsIGhvc3Qgb3ducyB0aGUgbmV3IFZHLCBhbmQgb3RoZXIgaG9zdHMgY2Fubm90IHVzZSBpdC4KKworQSBWRyB3aXRob3V0IGEgc3lzdGVtX2lkIGNhbiBiZSB1c2VkIGJ5IGFueSBob3N0LCBhbmQgYSBWRyB3aXRoIGEKK3N5c3RlbV9pZCBjYW4gb25seSBiZSB1c2VkIGJ5IGEgaG9zdCB3aXRoIGEgbWF0Y2hpbmcgc3lzdGVtX2lkLiAgQQorLkIgZm9yZWlnbiBWRworaXMgYSBWRyB3aXRoIGEgc3lzdGVtX2lkIGFzIHZpZXdlZCBieSBhIGhvc3Qgd2l0aCBhIHN5c3RlbV9pZAordGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgVkdzIHN5c3RlbV9pZC4gIChPciBmcm9tIGEgaG9zdCB3aXRob3V0IGEKK3N5c3RlbV9pZC4pCisKK1ZhbGlkIHN5c3RlbV9pZCBjaGFyYWN0ZXJzIGFyZSB0aGUgc2FtZSBhcyB2YWxpZCBWRyBuYW1lIGNoYXJhY3RlcnMuICBJZiBhCitzeXN0ZW1faWQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLCB0aG9zZSBjaGFyYWN0ZXJzIGFyZSBvbWl0dGVkIGFuZAorcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIHVzZWQuICBJZiBhIHN5c3RlbV9pZCBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bQorbmFtZSBsZW5ndGgsIHRoZSBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBtYXhpbXVtIGxlbmd0aCBhcmUgdXNlZC4gIFRoZQorbWF4aW11bSBsZW5ndGggb2YgYSBzeXN0ZW1faWQgaXMgMTI4IGNoYXJhY3RlcnMuCisKKy5TUyBMaW1pdGF0aW9ucyBhbmQgd2FybmluZ3MKKworVG8gYmVuZWZpdCBmdWxseSBmcm9tIHN5c3RlbV9pZCwgYWxsIGhvc3RzIG11c3QgaGF2ZSBzeXN0ZW1faWQgc2V0LCBhbmQKK1ZHcyBtdXN0IGhhdmUgc3lzdGVtX2lkIHNldC4gIEEgVkcgb24gc2hhcmVkIHN0b3JhZ2UgY2FuIGJlIGRhbWFnZWQgb3IKK2Rlc3Ryb3llZCBpbiBzb21lIGNhc2VzIHdoaWNoIHRoZSB1c2VyIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZC4KKworLklQIFxbYnVdIDIKK0EgVkcgd2l0aG91dCBhIHN5c3RlbV9pZCBjYW4gYmUgdXNlZCB3aXRob3V0IHJlc3RyaWN0aW9uIGZyb20gYW55IGhvc3QsCitldmVuIGZyb20gaG9zdHMgdGhhdCBoYXZlIGEgc3lzdGVtX2lkLiAgTWFueSBWR3Mgd2lsbCBub3QgaGF2ZSBhIHN5c3RlbV9pZAorYW5kIGFyZSB1bnByb3RlY3RlZC4gIFZlcmlmeSB0aGF0IGEgVkcgaGFzIGEgc3lzdGVtX2lkIGJ5IHJ1bm5pbmcgdGhlCitjb21tYW5kICd2Z3MgLW8rc3lzdGVtaWQnCisKK0EgVkcgd2lsbCBub3QgaGF2ZSBhIHN5c3RlbV9pZCBpZiBpdCB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyBmZWF0dXJlIHdhcworYWRkZWQgdG8gbHZtLCBvciBpZiBpdCB3YXMgY3JlYXRlZCBieSBhIGhvc3QgdGhhdCBkaWQgbm90IGhhdmUgYSBzeXN0ZW1faWQKK2RlZmluZWQuICBBIHN5c3RlbV9pZCBjYW4gYmUgYXNzaWduZWQgdG8gdGhlc2UgVkdzIGJ5IHVzaW5nIHZnY2hhbmdlCistLXN5c3RlbWlkIChzZWUgYmVsb3cpLgorCisuSVAgXFtidV0gMgorVHdvIGhvc3RzIHNob3VsZCBub3QgYmUgYXNzaWduZWQgdGhlIHNhbWUgc3lzdGVtX2lkLiAgRG9pbmcgc28gZGVmZWF0cwordGhlIHB1cnBvc2Ugb2YgdGhlIHN5c3RlbV9pZCB3aGljaCBpcyB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaG9zdHMuCisKKy5JUCBcW2J1XSAyCitPcnBoYW4gUFZzIChvciB1bnVzZWQgZGV2aWNlcykgb24gc2hhcmVkIHN0b3JhZ2UgYXJlIGNvbXBsZXRlbHkKK3VucHJvdGVjdGVkIGJ5IHRoZSBzeXN0ZW1faWQgZmVhdHVyZS4gIENvbW1hbmRzIHRoYXQgdXNlIHRoZXNlIFBWcywgc3VjaAorYXMgdmdjcmVhdGUgb3IgdmdleHRlbmQsIGFyZSBub3QgcHJldmVudGVkIGZyb20gcGVyZm9ybWluZyBjb25mbGljdGluZworb3BlcmF0aW9ucyBhbmQgY29ycnVwdGluZyB0aGUgUFZzLiAgU2VlIHRoZQorLkIgb3JwaGFucworc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLklQIFxbYnVdIDIKK0EgaG9zdCB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBsdm0gd2l0aG91dCB0aGUgc3lzdGVtX2lkIGZlYXR1cmUgd2lsbCBub3QKK3JlY29nbml6ZSBhIG5ldyBzeXN0ZW1faWQgaW4gVkdzIGZyb20gb3RoZXIgaG9zdHMuICBFdmVuIHRob3VnaCB0aGUgb2xkCit2ZXJzaW9uIG9mIGx2bSBpcyBub3QgYmxvY2tlZCBmcm9tIHJlYWRpbmcgYSBWRyB3aXRoIGEgc3lzdGVtX2lkLCBpdCBpcworYmxvY2tlZCBmcm9tIHdyaXRpbmcgdG8gdGhlIFZHIChvciBpdHMgTFZzKS4gIFRoZSBuZXcgc3lzdGVtX2lkIGNoYW5nZXMKK3RoZSB3cml0ZSBtb2RlIG9mIGEgVkcsIG1ha2luZyBpdCBhcHBlYXIgcmVhZC1vbmx5IHRvIHByZXZpb3VzIGx2bQordmVyc2lvbnMuCisKK1RoaXMgYWxzbyBtZWFucyB0aGF0IGlmIGEgaG9zdCBkb3duZ3JhZGVzIGl0cyB2ZXJzaW9uIG9mIGx2bSwgaXQgd291bGQKK2xvc2UgYWNjZXNzIHRvIGFueSBWR3MgaXQgaGFkIGNyZWF0ZWQgd2l0aCBhIHN5c3RlbV9pZC4gIFRvIGF2b2lkIHRoaXMsCit0aGUgc3lzdGVtX2lkIHNob3VsZCBiZSByZW1vdmVkIGZyb20gVkdzIGJlZm9yZSBkb3duZ3JhZGluZyB0byBhbiBsdm0KK3ZlcnNpb24gd2l0aG91dCB0aGUgc3lzdGVtX2lkIGZlYXR1cmUuCisKKy5QCisKKy5TUyBUeXBlcyBvZiBWRyBhY2Nlc3MKKworQSBsb2NhbCBWRyBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IGEgc2luZ2xlIGhvc3QuCisuYnIKK0Egc2hhcmVkIG9yIGNsdXN0ZXJlZCBWRyBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IG11bHRpcGxlIGhvc3RzLgorLmJyCitUaGVzZSBjYW4gYmUgZnVydGhlciBkaXN0aW5ndWlzaGVkIGFzOgorCisuQiBVbnJlc3RyaWN0ZWQ6CitBIGxvY2FsIFZHIHRoYXQgaGFzIG5vIHN5c3RlbV9pZC4gIFRoaXMgVkcgdHlwZSBpcyB1bnByb3RlY3RlZCBhbmQKK2FjY2Vzc2libGUgdG8gYW55IGhvc3QuCisKKy5CIE93bmVkOgorQSBsb2NhbCBWRyB0aGF0IGhhcyBhIHN5c3RlbV9pZCBzZXQsIGFzIHZpZXdlZCBmcm9tIHRoZSBvbmUgaG9zdCB3aXRoIGEKK21hdGNoaW5nIHN5c3RlbV9pZCAodGhlIG93bmVyKS4gIFRoaXMgVkcgdHlwZSBpcyBieSBkZWZpbml0aW9uIGFjZXNzaWJsZS4KKworLkIgRm9yZWlnbjoKK0EgbG9jYWwgVkcgdGhhdCBoYXMgYSBzeXN0ZW1faWQgc2V0LCBhcyB2aWV3ZWQgZnJvbSBhbnkgaG9zdCB3aXRoIGFuCit1bm1hdGNoaW5nIHN5c3RlbV9pZCAob3Igbm8gc3lzdGVtX2lkKS4gIEl0IGlzIG93bmVkIGJ5IGFub3RoZXIgaG9zdC4KK1RoaXMgVkcgdHlwZSBpcyBieSBkZWZpbml0aW9uIG5vdCBhY2Nlc3NpYmxlLgorCisuQiBFeHBvcnRlZDoKK0EgbG9jYWwgVkcgdGhhdCBoYXMgYmVlbiBleHBvcnRlZCB3aXRoIHZnZXhwb3J0IGFuZCBoYXMgbm8gc3lzdGVtX2lkLgorVGhpcyBWRyB0eXBlIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHZnaW1wb3J0IHdoaWNoIHdpbGwgY2hhbmdlIGl0IHRvCitvd25lZC4KKworLkIgU2hhcmVkOgorQSBzaGFyZWQgb3IgImxvY2tkIiBWRyBoYXMgbG9ja190eXBlIHNldCBhbmQgbm8gc3lzdGVtX2lkLgorQSBzaGFyZWQgVkcgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbiBzaGFyZWQgc3RvcmFnZSBmcm9tIG11bHRpcGxlIGhvc3RzLAorYW5kIGlzIG9ubHkgYWNjZXNzaWJsZSB0byBob3N0cyB1c2luZyBsdm1sb2NrZC4gQXBwbGljYWJsZSBvbmx5IGlmIExWTQoraXMgY29tcGlsZWQgd2l0aCBsb2NrZCBzdXBwb3J0LgorCisuQiBDbHVzdGVyZWQ6CitBIGNsdXN0ZXJlZCBvciAiY2x2bSIgVkcgaGFzIHRoZSBjbHVzdGVyZWQgZmxhZyBzZXQgYW5kIG5vIHN5c3RlbV9pZC4KK0EgY2x1c3RlcmVkIFZHIGlzIG1lYW50IHRvIGJlIHVzZWQgb24gc2hhcmVkIHN0b3JhZ2UgZnJvbSBtdWx0aXBsZSBob3N0cywKK2FuZCBpcyBvbmx5IGFjY2Vzc2libGUgdG8gaG9zdHMgdXNpbmcgY2x2bWQuCisKKy5TUyBzeXN0ZW1faWRfc291cmNlCisKK0EgaG9zdCdzIG93biBzeXN0ZW1faWQgY2FuIGJlIGRlZmluZWQgaW4gYSBudW1iZXIgb2Ygd2F5cy4gIGx2bS5jb25mCitnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSBkZWZpbmVzIHRoZSBtZXRob2QgbHZtIHdpbGwgdXNlIHRvIGZpbmQgdGhlIGxvY2FsCitzeXN0ZW1faWQ6CisKKy5UUAorLkIgbm9uZQorLmJyCisKK2x2bSB3aWxsIG5vdCB1c2UgYSBzeXN0ZW1faWQuICBsdm0gaXMgYWxsb3dlZCB0byBhY2Nlc3MgVkdzIHdpdGhvdXQgYQorc3lzdGVtX2lkLCBhbmQgd2lsbCBjcmVhdGUgbmV3IFZHcyB3aXRob3V0IGEgc3lzdGVtX2lkLiAgQW4gdW5kZWZpbmVkCitzeXN0ZW1faWRfc291cmNlIGlzIGVxdWl2YWxlbnQgdG8gbm9uZS4KKworLkkgbHZtLmNvbmYKKy5uZgorZ2xvYmFsIHsKKyAgICBzeXN0ZW1faWRfc291cmNlID0gIm5vbmUiCit9CisuZmkKKworLlRQCisuQiBtYWNoaW5laWQKKy5icgorCitUaGUgY29udGVudCBvZiAvZXRjL21hY2hpbmUtaWQgaXMgdXNlZCBhcyB0aGUgc3lzdGVtX2lkIGlmIGF2YWlsYWJsZS4KK1NlZQorLkJSIG1hY2hpbmUtaWQgKDUpCithbmQKKy5CUiBzeXN0ZW1kLW1hY2hpbmUtaWQtc2V0dXAgKDEpCit0byBjaGVjayBpZiBtYWNoaW5lLWlkIGlzIGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KKworLkkgbHZtLmNvbmYKKy5uZgorZ2xvYmFsIHsKKyAgICBzeXN0ZW1faWRfc291cmNlID0gIm1hY2hpbmVpZCIKK30KKy5maQorCisuVFAKKy5CIHVuYW1lCisuYnIKKworVGhlIHN0cmluZyB1dHNuYW1lLm5vZGVuYW1lIGZyb20KKy5CUiB1bmFtZSAoMikKK2lzIHVzZWQgYXMgdGhlIHN5c3RlbV9pZC4gIEEgdW5hbWUgYmVnaW5uaW5nIHdpdGggImxvY2FsaG9zdCIKK2lzIGlnbm9yZWQgYW5kIGVxdWl2YWxlbnQgdG8gbm9uZS4KKworLkkgbHZtLmNvbmYKKy5uZgorZ2xvYmFsIHsKKyAgICBzeXN0ZW1faWRfc291cmNlID0gInVuYW1lIgorfQorLmZpCisKKy5UUAorLkIgbHZtbG9jYWwKKy5icgorCitUaGUgc3lzdGVtX2lkIGlzIGRlZmluZWQgaW4gbHZtbG9jYWwuY29uZiBsb2NhbC9zeXN0ZW1faWQuCisKKy5JIGx2bS5jb25mCisubmYKK2dsb2JhbCB7CisgICAgc3lzdGVtX2lkX3NvdXJjZSA9ICJsdm1sb2NhbCIKK30KKy5maQorCisuSSBsdm1sb2NhbC5jb25mCisubmYKK2xvY2FsIHsKKyAgICBzeXN0ZW1faWQgPSAiZXhhbXBsZV9uYW1lIgorfQorLmZpCisKKy5UUAorLkIgZmlsZQorLmJyCisKK1RoZSBzeXN0ZW1faWQgaXMgZGVmaW5lZCBpbiBhIGZpbGUgc3BlY2lmaWVkIGJ5IGx2bS5jb25mCitnbG9iYWwvc3lzdGVtX2lkX2ZpbGUuCisKKy5JIGx2bS5jb25mCisubmYKK2dsb2JhbCB7CisgICAgc3lzdGVtX2lkX3NvdXJjZSA9ICJmaWxlIgorICAgIHN5c3RlbV9pZF9maWxlID0gIi9wYXRoL3RvL2ZpbGUiCit9CisuZmkKKworLkxQCisKK0NoYW5naW5nIHN5c3RlbV9pZF9zb3VyY2Ugd2lsbCBvZnRlbiBjYXVzZSB0aGUgc3lzdGVtX2lkIHRvIGNoYW5nZSwgd2hpY2gKK21heSBwcmV2ZW50IHRoZSBob3N0IGZyb20gdXNpbmcgVkdzIHRoYXQgaXQgcHJldmlvdXNseSB1c2VkIChzZWUKK2V4dHJhX3N5c3RlbV9pZHMgYmVsb3cgdG8gaGFuZGxlIHRoaXMuKQorCitJZiBhIHN5c3RlbV9pZF9zb3VyY2Ugb3RoZXIgdGhhbiBub25lIGZhaWxzIHRvIHJlc29sdmUgYSBzeXN0ZW1faWQsIHRoZQoraG9zdCB3aWxsIGJlIGFsbG93ZWQgdG8gYWNjZXNzIFZHcyB3aXRoIG5vIHN5c3RlbV9pZCwgYnV0IHdpbGwgbm90IGJlCithbGxvd2VkIHRvIGFjY2VzcyBWR3Mgd2l0aCBhIGRlZmluZWQgc3lzdGVtX2lkLgorCisuU1MgZXh0cmFfc3lzdGVtX2lkcworCitJbiBzb21lIGNhc2VzLCBpdCBtYXkgYmUgdXNlZnVsIGZvciBhIGhvc3QgdG8gYWNjZXNzIFZHcyB3aXRoIGRpZmZlcmVudAorc3lzdGVtX2lkJ3MsIGUuZy4gaWYgYSBob3N0J3Mgc3lzdGVtX2lkIGNoYW5nZXMsIGFuZCBpdCB3YW50cyB0byB1c2UgVkdzCit0aGF0IGl0IGNyZWF0ZWQgd2l0aCBpdHMgb2xkIHN5c3RlbV9pZC4gIFRvIGFsbG93IGEgaG9zdCB0byBhY2Nlc3MgVkdzCit3aXRoIG90aGVyIHN5c3RlbV9pZCdzLCB0aG9zZSBvdGhlciBzeXN0ZW1faWQncyBjYW4gYmUgbGlzdGVkIGluCitsdm1sb2NhbC5jb25mIGxvY2FsL2V4dHJhX3N5c3RlbV9pZHMuCisKKy5JIGx2bWxvY2FsLmNvbmYKKy5uZgorbG9jYWwgeworICAgIGV4dHJhX3N5c3RlbV9pZHMgPSBbICJteV9vdGhlcl9uYW1lIiBdCit9CisuZmkKKworLlNTIHZnY3JlYXRlCisKK0luIHZnY3JlYXRlLCB0aGUgaG9zdCBydW5uaW5nIHRoZSBjb21tYW5kIGFzc2lnbnMgaXRzIG93biBzeXN0ZW1faWQgdG8gdGhlCituZXcgVkcuICBUbyBvdmVycmlkZSB0aGlzIGFuZCBzZXQgYW5vdGhlciBzeXN0ZW1faWQ6CisKKy5CIHZnY3JlYXRlIC0tc3lzdGVtaWQKKy5JIFN5c3RlbUlEIFZHIERldmljZXMKKworT3ZlcnJpZGluZyB0aGUgc3lzdGVtX2lkIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBhIGhvc3QgdG8gY3JlYXRlIGEgVkcgdGhhdAoraXQgbWF5IG5vdCBiZSBhYmxlIHRvIHVzZS4gIEFub3RoZXIgaG9zdCB3aXRoIGEgc3lzdGVtX2lkIG1hdGNoaW5nIHRoZSBvbmUKK3NwZWNpZmllZCBtYXkgbm90IHJlY29nbml6ZSB0aGUgbmV3IFZHIHdpdGhvdXQgbWFudWFsbHkgcmVzY2FubmluZworZGV2aWNlcy4KKworSWYgdGhlIC0tc3lzdGVtaWQgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nICgiIiksIHRoZSBWRyBpcyBjcmVhdGVkIHdpdGgKK25vIHN5c3RlbV9pZCwgbWFraW5nIGl0IGFjY2Vzc2libGUgdG8gb3RoZXIgaG9zdHMgKHNlZSB3YXJuaW5ncyBhYm92ZS4pCisKKy5TUyByZXBvcnQvZGlzcGxheQorCitUaGUgc3lzdGVtX2lkIG9mIGEgVkcgaXMgZGlzcGxheWVkIHdpdGggdGhlICJzeXN0ZW1pZCIgcmVwb3J0aW5nIG9wdGlvbi4KKworUmVwb3J0L2Rpc3BsYXkgY29tbWFuZHMgaWdub3JlIGZvcmVpZ24gVkdzIGJ5IGRlZmF1bHQuICBUbyByZXBvcnQgZm9yZWlnbgorVkdzLCB0aGUgLS1mb3JlaWduIG9wdGlvbiBjYW4gYmUgdXNlZC4gIFRoaXMgY2F1c2VzIHRoZSBWR3MgdG8gYmUgcmVhZAorZnJvbSBkaXNrLiAgQmVjYXVzZSBsdm1ldGFkIGNhY2hpbmcgaXMgbm90IHVzZWQsIHRoaXMgb3B0aW9uIGNhbiBjYXVzZQorcG9vciBwZXJmb3JtYW5jZS4KKworLkIgdmdzIC0tZm9yZWlnbiAtbytzeXN0ZW1pZAorCitXaGVuIGEgaG9zdCB3aXRoIG5vIHN5c3RlbV9pZCBzZWVzIGZvcmVpZ24gVkdzLCBpdCB3YXJucyBhYm91dCB0aGVtIGFzCit0aGV5IGFyZSBza2lwcGVkLiAgVGhlIGhvc3Qgc2hvdWxkIGJlIGFzc2lnbmVkIGEgc3lzdGVtX2lkLCBhZnRlciB3aGljaAorc3RhbmRhcmQgcmVwb3J0aW5nIGNvbW1hbmRzIHdpbGwgc2lsZW50bHkgaWdub3JlIGZvcmVpZ24gVkdzLgorCisuU1MgdmdleHBvcnQvdmdpbXBvcnQKKwordmdleHBvcnQgY2xlYXJzIHRoZSBzeXN0ZW1faWQuCisKK090aGVyIGhvc3RzIHdpbGwgY29udGludWUgdG8gc2VlIGEgbmV3bHkgZXhwb3J0ZWQgVkcgYXMgZm9yZWlnbiBiZWNhdXNlIG9mCitsb2NhbCBjYWNoaW5nICh3aGVuIGx2bWV0YWQgaXMgdXNlZCkuICBNYW51YWxseSB1cGRhdGluZyB0aGUgbG9jYWwgbHZtZXRhZAorY2FjaGUgd2l0aCBwdnNjYW4gLS1jYWNoZSB3aWxsIGFsbG93IGEgaG9zdCB0byByZWNvZ25pemUgdGhlIG5ld2x5CitleHBvcnRlZCBWRy4KKwordmdpbXBvcnQgc2V0cyB0aGUgVkcgc3lzdGVtX2lkIHRvIHRoZSBsb2NhbCBzeXN0ZW1faWQgYXMgZGV0ZXJtaW5lZCBieQorbHZtLmNvbmYgc3lzdGVtX2lkX3NvdXJjZS4gIHZnaW1wb3J0IGF1dG9tYXRpY2FsbHkgc2NhbnMgc3RvcmFnZSBmb3IKK25ld2x5IGV4cG9ydGVkIFZHcy4KKworQWZ0ZXIgdmdpbXBvcnQsIHRoZSBleHBvcnRpbmcgaG9zdCB3aWxsIGNvbnRpbnVlIHRvIHNlZSB0aGUgVkcgYXMKK2V4cG9ydGVkLCBhbmQgbm90IG93bmVkIGJ5IHRoZSBuZXcgaG9zdC4gIE1hbnVhbGx5IHVwZGF0aW5nIHRoZSBsb2NhbAorY2FjaGUgd2l0aCBwdnNjYW4gLS1jYWNoZSB3aWxsIGFsbG93IGEgaG9zdCB0byByZWNvZ25pemUgdGhlIG5ld2x5CitpbXBvcnRlZCBWRyBhcyBmb3JlaWduLgorCisuU1MgdmdjaGFuZ2UKKworQSBob3N0IGNhbiBjaGFuZ2UgdGhlIHN5c3RlbV9pZCBvZiBpdHMgb3duIFZHcywgYnV0IHRoZSBjb21tYW5kIHJlcXVpcmVzCitjb25maXJtYXRpb24gYmVjYXVzZSB0aGUgaG9zdCBtYXkgbG9zZSBhY2Nlc3MgdG8gdGhlIFZHIGJlaW5nIGNoYW5nZWQ6CisKKy5CIHZnY2hhbmdlIC0tc3lzdGVtaWQKKy5JIFN5c3RlbUlEIFZHCisKK1RoZSBzeXN0ZW1faWQgY2FuIGJlIHJlbW92ZWQgZnJvbSBhIFZHIGJ5IHNwZWNpZnlpbmcgYW4gZW1wdHkgc3RyaW5nICgiIikKK2FzIHRoZSBuZXcgc3lzdGVtX2lkLiAgVGhpcyBtYWtlcyB0aGUgVkcgYWNjZXNzaWJsZSB0byBvdGhlciBob3N0cyAoc2VlCit3YXJuaW5ncyBhYm92ZS4pCisKK0EgaG9zdCBjYW5ub3QgZGlyZWN0bHkgY2hhbmdlIHRoZSBzeXN0ZW1faWQgb2YgYSBmb3JlaWduIFZHLgorCitUbyBtb3ZlIGEgVkcgZnJvbSBvbmUgaG9zdCB0byBhbm90aGVyLCB2Z2V4cG9ydCBhbmQgdmdpbXBvcnQgc2hvdWxkIGJlCit1c2VkLgorCitUbyBmb3JjaWJseSBnYWluIG93bmVyc2hpcCBvZiBhIGZvcmVpZ24gVkcsIGEgaG9zdCBjYW4gYWRkIHRoZSBmb3JlaWduCitzeXN0ZW1faWQgdG8gaXRzIGV4dHJhX3N5c3RlbV9pZHMgbGlzdCwgY2hhbmdlIHRoZSBzeXN0ZW1faWQgb2YgdGhlCitmb3JlaWduIFZHIHRvIGl0cyBvd24sIGFuZCByZW1vdmUgdGhlIGZvcmVpZ24gc3lzdGVtX2lkIGZyb20gaXRzCitleHRyYV9zeXN0ZW1faWRzIGxpc3QuCisKKy5TUyBzaGFyZWQgVkdzCisKK0Egc2hhcmVkL2xvY2tkIFZHIGhhcyBubyBzeXN0ZW1faWQgc2V0LCBhbGxvd2luZyBtdWx0aXBsZSBob3N0cyB0bwordXNlIGl0IHZpYSBsdm1sb2NrZC4gIENoYW5naW5nIGEgVkcgdG8gYSBsb2NrZCB0eXBlIHdpbGwgY2xlYXIgdGhlCitleGlzdGluZyBzeXN0ZW1faWQuIEFwcGxpY2FibGUgb25seSBpZiBMVk0gaXMgY29tcGlsZWQgd2l0aCBsb2NrZAorc3VwcG9ydC4KKworLlNTIGNsdXN0ZXJlZCBWR3MKKworQSBjbHVzdGVyZWQvY2x2bSBWRyBoYXMgbm8gc3lzdGVtX2lkIHNldCwgYWxsb3dpbmcgbXVsdGlwbGUgaG9zdHMgdG8KK3VzZSBpdCB2aWEgY2x2bWQuICBDaGFuZ2luZyBhIFZHIHRvIGNsdXN0ZXJlZCB3aWxsIGNsZWFyIHRoZSBleGlzdGluZworc3lzdGVtX2lkLiAgQ2hhbmdpbmcgYSBWRyB0byBub3QgY2x1c3RlcmVkIHdpbGwgc2V0IHRoZSBzeXN0ZW1faWQgdG8gdGhlCitob3N0IHJ1bm5pbmcgdGhlIHZnY2hhbmdlIGNvbW1hbmQuCisKKy5TUyBjcmVhdGlvbl9ob3N0CisKK0luIHZnY3JlYXRlLCB0aGUgVkcgbWV0YWRhdGEgZmllbGQgY3JlYXRpb25faG9zdCBpcyBzZXQgYnkgZGVmYXVsdCB0byB0aGUKK2hvc3QncyB1bmFtZS4gIFRoZSBjcmVhdGlvbl9ob3N0IGNhbm5vdCBiZSBjaGFuZ2VkLCBhbmQgaXMgbm90IHVzZWQgdG8KK2NvbnRyb2wgYWNjZXNzLiAgV2hlbiBzeXN0ZW1faWRfc291cmNlIGlzICJ1bmFtZSIsIHRoZSBzeXN0ZW1faWQgYW5kCitjcmVhdGlvbl9ob3N0IHdpbGwgYmUgdGhlIHNhbWUuCisKKy5TUyBvcnBoYW5zCisKK09ycGhhbiBQVnMgYXJlIHVudXNlZCBkZXZpY2VzOyB0aGV5IGFyZSBub3QgY3VycmVudGx5IHVzZWQgaW4gYW55IFZHLgorQmVjYXVzZSBvZiB0aGlzLCB0aGV5IGFyZSBub3QgcHJvdGVjdGVkIGJ5IGEgc3lzdGVtX2lkLCBhbmQgYW55IGhvc3QgY2FuCit1c2UgdGhlbS4gIENvb3JkaW5hdGlvbiBvZiBjaGFuZ2VzIHRvIG9ycGhhbiBQVnMgaXMgYmV5b25kIHRoZSBzY29wZSBvZgorc3lzdGVtX2lkLiAgVGhlIHNhbWUgaXMgdHJ1ZSBvZiBhbnkgYmxvY2sgZGV2aWNlIHRoYXQgaXMgbm90IGEgUFYuCisKK1RoZSBlZmZlY3RzIG9mIHRoaXMgYXJlIGVzcGVjaWFsbHkgZXZpZGVudCB3aGVuIGx2bSB1c2VzIGx2bWV0YWQgY2FjaGluZy4KK0ZvciBleGFtcGxlLCBpZiBtdWx0aXBsZSBob3N0cyBzZWUgYW4gb3JwaGFuIFBWLCBhbmQgb25lIGhvc3QgY3JlYXRlcyBhIFZHCit1c2luZyB0aGUgb3JwaGFuLCB0aGUgb3RoZXIgaG9zdHMgd2lsbCBjb250aW51ZSB0byByZXBvcnQgdGhlIFBWIGFzIGFuCitvcnBoYW4uICBOb3RoaW5nIHdvdWxkIGF1dG9tYXRpY2FsbHkgcHJldmVudCB0aGUgb3RoZXIgaG9zdHMgZnJvbSB1c2luZwordGhlIG5ld2x5IGFsbG9jYXRlZCBQViBhbmQgY29ycnVwdGluZyBpdC4gIElmIHRoZSBvdGhlciBob3N0cyBydW4gYQorY29tbWFuZCB0byByZXNjYW4gZGV2aWNlcywgYW5kIHVwZGF0ZSBsdm1ldGFkLCB0aGV5IHdvdWxkIHRoZW4gcmVjb2duaXplCit0aGF0IHRoZSBQViBoYXMgYmVlbiB1c2VkIGJ5IGFub3RoZXIgaG9zdC4gIEEgY29tbWFuZCB0aGF0IHJlc2NhbnMgZGV2aWNlcworY291bGQgYmUgcHZzY2FuIC0tY2FjaGUsIG9yIHZncyAtLWZvcmVpZ24uCisKKy5TSCBTRUUgQUxTTworLkJSIHZnY3JlYXRlICg4KSwKKy5CUiB2Z2NoYW5nZSAoOCksCisuQlIgdmdpbXBvcnQgKDgpLAorLkJSIHZnZXhwb3J0ICg4KSwKKy5CUiBsdm0uY29uZiAoNSksCisuQlIgbWFjaGluZS1pZCAoNSksCisuQlIgdW5hbWUgKDIpLAorLkJSIHZncyAoOCkKKwpkaWZmIC0tZ2l0IGEvbWFuL2x2bXRoaW4uNy5pbiBiL21hbi9sdm10aGluLjcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4Njk3NAotLS0gL2Rldi9udWxsCisrKyBiL21hbi9sdm10aGluLjcuaW4KQEAgLTAsMCArMSwxMzc4IEBACisuVEggIkxWTVRISU4iICI3IiAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlJlZCBIYXQsIEluYyIgIlwiIgorCisuU0ggTkFNRQorbHZtdGhpbiBcKGVtIExWTSB0aGluIHByb3Zpc2lvbmluZworCisuU0ggREVTQ1JJUFRJT04KKworQmxvY2tzIGluIGEgc3RhbmRhcmQgbG9naWNhbCB2b2x1bWUgYXJlIGFsbG9jYXRlZCB3aGVuIHRoZSBMViBpcyBjcmVhdGVkLAorYnV0IGJsb2NrcyBpbiBhIHRoaW4gcHJvdmlzaW9uZWQgbG9naWNhbCB2b2x1bWUgYXJlIGFsbG9jYXRlZCBhcyB0aGV5IGFyZQord3JpdHRlbi4gIEJlY2F1c2Ugb2YgdGhpcywgYSB0aGluIHByb3Zpc2lvbmVkIExWIGlzIGdpdmVuIGEgdmlydHVhbCBzaXplLAorYW5kIGNhbiB0aGVuIGJlIG11Y2ggbGFyZ2VyIHRoYW4gcGh5c2ljYWxseSBhdmFpbGFibGUgc3RvcmFnZS4gIFRoZSBhbW91bnQKK29mIHBoeXNpY2FsIHN0b3JhZ2UgcHJvdmlkZWQgZm9yIHRoaW4gcHJvdmlzaW9uZWQgTFZzIGNhbiBiZSBpbmNyZWFzZWQKK2xhdGVyIGFzIHRoZSBuZWVkIGFyaXNlcy4KKworQmxvY2tzIGluIGEgc3RhbmRhcmQgTFYgYXJlIGFsbG9jYXRlZCAoZHVyaW5nIGNyZWF0aW9uKSBmcm9tIHRoZSBWRywgYnV0CitibG9ja3MgaW4gYSB0aGluIExWIGFyZSBhbGxvY2F0ZWQgKGR1cmluZyB1c2UpIGZyb20gYSBzcGVjaWFsICJ0aGluIHBvb2wKK0xWIi4gIFRoZSB0aGluIHBvb2wgTFYgY29udGFpbnMgYmxvY2tzIG9mIHBoeXNpY2FsIHN0b3JhZ2UsIGFuZCBibG9ja3MgaW4KK3RoaW4gTFZzIGp1c3QgcmVmZXJlbmNlIGJsb2NrcyBpbiB0aGUgdGhpbiBwb29sIExWLgorCitBIHRoaW4gcG9vbCBMViBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaW4gTFZzIGNhbiBiZSBjcmVhdGVkIHdpdGhpbiBpdC4KK0EgdGhpbiBwb29sIExWIGlzIGNyZWF0ZWQgYnkgY29tYmluaW5nIHR3byBzdGFuZGFyZCBMVnM6IGEgbGFyZ2UgZGF0YSBMVgordGhhdCB3aWxsIGhvbGQgYmxvY2tzIGZvciB0aGluIExWcywgYW5kIGEgbWV0YWRhdGEgTFYgdGhhdCB3aWxsIGhvbGQKK21ldGFkYXRhLiAgVGhlIG1ldGFkYXRhIHRyYWNrcyB3aGljaCBkYXRhIGJsb2NrcyBiZWxvbmcgdG8gZWFjaCB0aGluIExWLgorCitTbmFwc2hvdHMgb2YgdGhpbiBMVnMgYXJlIGVmZmljaWVudCBiZWNhdXNlIHRoZSBkYXRhIGJsb2NrcyBjb21tb24gdG8gYQordGhpbiBMViBhbmQgYW55IG9mIGl0cyBzbmFwc2hvdHMgYXJlIHNoYXJlZC4gIFNuYXBzaG90cyBtYXkgYmUgdGFrZW4gb2YKK3RoaW4gTFZzIG9yIG9mIG90aGVyIHRoaW4gc25hcHNob3RzLiAgQmxvY2tzIGNvbW1vbiB0byByZWN1cnNpdmUgc25hcHNob3RzCithcmUgYWxzbyBzaGFyZWQgaW4gdGhlIHRoaW4gcG9vbC4gIFRoZXJlIGlzIG5vIGxpbWl0IHRvIG9yIGRlZ3JhZGF0aW9uCitmcm9tIHNlcXVlbmNlcyBvZiBzbmFwc2hvdHMuCisKK0FzIHRoaW4gTFZzIG9yIHNuYXBzaG90IExWcyBhcmUgd3JpdHRlbiB0bywgdGhleSBjb25zdW1lIGRhdGEgYmxvY2tzIGluCit0aGUgdGhpbiBwb29sLiAgQXMgZnJlZSBkYXRhIGJsb2NrcyBpbiB0aGUgcG9vbCBkZWNyZWFzZSwgbW9yZSBmcmVlIGJsb2NrcworbWF5IG5lZWQgdG8gYmUgc3VwcGxpZWQuICBUaGlzIGlzIGRvbmUgYnkgZXh0ZW5kaW5nIHRoZSB0aGluIHBvb2wgZGF0YSBMVgord2l0aCBhZGRpdGlvbmFsIHBoeXNpY2FsIHNwYWNlIGZyb20gdGhlIFZHLiAgUmVtb3ZpbmcgdGhpbiBMVnMgb3IKK3NuYXBzaG90cyBmcm9tIHRoZSB0aGluIHBvb2wgY2FuIGFsc28gZnJlZSBibG9ja3MgaW4gdGhlIHRoaW4gcG9vbC4KK0hvd2V2ZXIsIHJlbW92aW5nIExWcyBpcyBub3QgYWx3YXlzIGFuIGVmZmVjdGl2ZSB3YXkgb2YgZnJlZWluZyBzcGFjZSBpbiBhCit0aGluIHBvb2wgYmVjYXVzZSB0aGUgYW1vdW50IGlzIGxpbWl0ZWQgdG8gdGhlIG51bWJlciBvZiBibG9ja3Mgbm90IHNoYXJlZAord2l0aCBvdGhlciBMVnMgaW4gdGhlIHBvb2wuCisKK0luY3JlbWVudGFsIGJsb2NrIGFsbG9jYXRpb24gZnJvbSB0aGluIHBvb2xzIGNhbiBjYXVzZSB0aGluIExWcyB0byBiZWNvbWUKK2ZyYWdtZW50ZWQuICBTdGFuZGFyZCBMVnMgZ2VuZXJhbGx5IGF2b2lkIHRoaXMgcHJvYmxlbSBieSBhbGxvY2F0aW5nIGFsbAordGhlIGJsb2NrcyBhdCBvbmNlIGR1cmluZyBjcmVhdGlvbi4KKworCisuU0ggVGhpbiBUZXJtcworCisuVFAKK1RoaW5EYXRhTFYKKy5icgordGhpbiBkYXRhIExWCisuYnIKK2xhcmdlIExWIGNyZWF0ZWQgaW4gYSBWRworLmJyCit1c2VkIGJ5IHRoaW4gcG9vbCB0byBzdG9yZSBUaGluTFYgYmxvY2tzCisKKy5UUAorVGhpbk1ldGFMVgorLmJyCit0aGluIG1ldGFkYXRhIExWCisuYnIKK3NtYWxsIExWIGNyZWF0ZWQgaW4gYSBWRworLmJyCit1c2VkIGJ5IHRoaW4gcG9vbCB0byB0cmFjayBkYXRhIGJsb2NrIHVzYWdlCisKKy5UUAorVGhpblBvb2xMVgorLmJyCit0aGluIHBvb2wgTFYKKy5icgorY29tYmluYXRpb24gb2YgVGhpbkRhdGFMViBhbmQgVGhpbk1ldGFMVgorLmJyCitjb250YWlucyBUaGluTFZzIGFuZCBTbmFwTFZzCisKKy5UUAorVGhpbkxWCisuYnIKK3RoaW4gTFYKKy5icgorY3JlYXRlZCBmcm9tIFRoaW5Qb29sTFYKKy5icgorYXBwZWFycyBibGFuayBhZnRlciBjcmVhdGlvbgorCisuVFAKK1NuYXBMVgorLmJyCitzbmFwc2hvdCBMVgorLmJyCitjcmVhdGVkIGZyb20gVGhpblBvb2xMVgorLmJyCithcHBlYXJzIGFzIGEgc25hcHNob3Qgb2YgYW5vdGhlciBMViBhZnRlciBjcmVhdGlvbgorCisKKworLlNIIFRoaW4gVXNhZ2UKKworVGhlIHByaW1hcnkgbWV0aG9kIGZvciB1c2luZyBsdm0gdGhpbiBwcm92aXNpb25pbmc6CisKKy5TUyAxLiBjcmVhdGUgVGhpbkRhdGFMVgorCitDcmVhdGUgYW4gTFYgdGhhdCB3aWxsIGhvbGQgdGhpbiBwb29sIGRhdGEuCisKKy5CIGx2Y3JlYXRlIFwtbiBUaGluRGF0YUxWIFwtTCBMYXJnZVNpemUgVkcKKworLkkgRXhhbXBsZQorLmJyCisjIGx2Y3JlYXRlIFwtbiBwb29sMCBcLUwgMTBHIHZnCisKKy5TUyAyLiBjcmVhdGUgVGhpbk1ldGFMVgorCitDcmVhdGUgYW4gTFYgdGhhdCB3aWxsIGhvbGQgdGhpbiBwb29sIG1ldGFkYXRhLgorCisuQiBsdmNyZWF0ZSBcLW4gVGhpbk1ldGFMViBcLUwgU21hbGxTaXplIFZHCisKKy5JIEV4YW1wbGUKKy5icgorIyBsdmNyZWF0ZSBcLW4gcG9vbDBtZXRhIFwtTCAxRyB2ZworCisjIGx2cworICBMViAgICAgICAgVkcgQXR0ciAgICAgICBMU2l6ZQorICBwb29sMCAgICAgdmcgLXdpLWEtLS0tLSAxMC4wMGcKKyAgcG9vbDBtZXRhIHZnIC13aS1hLS0tLS0gMS4wMGcKKworLlNTIDMuIGNyZWF0ZSBUaGluUG9vbExWCisKKy5uZgorQ29tYmluZSB0aGUgZGF0YSBhbmQgbWV0YWRhdGEgTFZzIGludG8gYSB0aGluIHBvb2wgTFYuCitUaGluRGF0YUxWIGlzIHJlbmFtZWQgdG8gaGlkZGVuIFRoaW5Qb29sTFZfdGRhdGEuCitUaGluTWV0YUxWIGlzIHJlbmFtZWQgdG8gaGlkZGVuIFRoaW5Qb29sTFZfdG1ldGEuCitUaGUgbmV3IFRoaW5Qb29sTFYgdGFrZXMgdGhlIHByZXZpb3VzIG5hbWUgb2YgVGhpbkRhdGFMVi4KKy5maQorCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbi1wb29sIFwtXC1wb29sbWV0YWRhdGEgVkcvVGhpbk1ldGFMViBWRy9UaGluRGF0YUxWCisKKy5JIEV4YW1wbGUKKy5icgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbi1wb29sIFwtXC1wb29sbWV0YWRhdGEgdmcvcG9vbDBtZXRhIHZnL3Bvb2wwCisKKyMgbHZzIHZnL3Bvb2wwCisgIExWICAgIFZHIEF0dHIgICAgICAgTFNpemUgIFBvb2wgT3JpZ2luIERhdGElIE1ldGElCisgIHBvb2wwIHZnIHR3aS1hLXR6LS0gMTAuMDBnICAgICAgMC4wMCAgIDAuMDAKKworIyBsdnMgXC1hCisgIExWICAgICAgICAgICAgVkcgQXR0ciAgICAgICBMU2l6ZQorICBwb29sMCAgICAgICAgIHZnIHR3aS1hLXR6LS0gMTAuMDBnCisgIFtwb29sMF90ZGF0YV0gdmcgVHdpLWFvLS0tLSAxMC4wMGcKKyAgW3Bvb2wwX3RtZXRhXSB2ZyBld2ktYW8tLS0tIDEuMDBnCisKKy5TUyA0LiBjcmVhdGUgVGhpbkxWCisKKy5uZgorQ3JlYXRlIGEgbmV3IHRoaW4gTFYgZnJvbSB0aGUgdGhpbiBwb29sIExWLgorVGhlIHRoaW4gTFYgaXMgY3JlYXRlZCB3aXRoIGEgdmlydHVhbCBzaXplLgorTXVsdGlwbGUgbmV3IHRoaW4gTFZzIG1heSBiZSBjcmVhdGVkIGluIHRoZSB0aGluIHBvb2wuCitUaGluIExWIG5hbWVzIG11c3QgYmUgdW5pcXVlIGluIHRoZSBWRy4KK1RoZSAnLS10eXBlIHRoaW4nIG9wdGlvbiBpcyBpbmZlcnJlZCBmcm9tIHRoZSB2aXJ0dWFsIHNpemUgb3B0aW9uLgorVGhlIC0tdGhpbnBvb2wgYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIHRoaW4gcG9vbCB3aWxsCitjb250YWluIHRoZSBUaGluTFYuCisuZmkKKworLkIgbHZjcmVhdGUgXC1uIFRoaW5MViBcLVYgVmlydHVhbFNpemUgXC1cLXRoaW5wb29sIFZHL1RoaW5Qb29sTFYKKworLkkgRXhhbXBsZQorLmJyCitDcmVhdGUgYSB0aGluIExWIGluIGEgdGhpbiBwb29sOgorLmJyCisjIGx2Y3JlYXRlIFwtbiB0aGluMSBcLVYgMVQgXC1cLXRoaW5wb29sIHZnL3Bvb2wwCisKK0NyZWF0ZSBhbm90aGVyIHRoaW4gTFYgaW4gdGhlIHNhbWUgdGhpbiBwb29sOgorLmJyCisjIGx2Y3JlYXRlIFwtbiB0aGluMiBcLVYgMVQgXC1cLXRoaW5wb29sIHZnL3Bvb2wwCisKKyMgbHZzIHZnL3RoaW4xIHZnL3RoaW4yCisgIExWICAgIFZHIEF0dHIgICAgICAgTFNpemUgUG9vbCAgT3JpZ2luIERhdGElCisgIHRoaW4xIHZnIFZ3aS1hLXR6LS0gMS4wMHQgcG9vbDAgICAgICAgIDAuMDAKKyAgdGhpbjIgdmcgVndpLWEtdHotLSAxLjAwdCBwb29sMCAgICAgICAgMC4wMAorCisuU1MgNS4gY3JlYXRlIFNuYXBMVgorCitDcmVhdGUgc25hcHNob3RzIG9mIGFuIGV4aXN0aW5nIFRoaW5MViBvciBTbmFwTFYuCisuYnIKK0RvIG5vdCBzcGVjaWZ5CisuQlIgXC1MICIsICIgXC1cLXNpemUKK3doZW4gY3JlYXRpbmcgYSB0aGluIHNuYXBzaG90LgorLmJyCitBIHNpemUgYXJndW1lbnQgd2lsbCBjYXVzZSBhbiBvbGQgQ09XIHNuYXBzaG90IHRvIGJlIGNyZWF0ZWQuCisKKy5CIGx2Y3JlYXRlIFwtbiBTbmFwTFYgXC1zIFZHL1RoaW5MVgorLmJyCisuQiBsdmNyZWF0ZSBcLW4gU25hcExWIFwtcyBWRy9QcmV2U25hcExWCisKKy5JIEV4YW1wbGUKKy5icgorQ3JlYXRlIGZpcnN0IHNuYXBzaG90IG9mIGFuIGV4aXN0aW5nIFRoaW5MVjoKKy5icgorIyBsdmNyZWF0ZSBcLW4gdGhpbjFzMSBcLXMgdmcvdGhpbjEKKworQ3JlYXRlIHNlY29uZCBzbmFwc2hvdCBvZiB0aGUgc2FtZSBUaGluTFY6CisuYnIKKyMgbHZjcmVhdGUgXC1uIHRoaW4xczIgXC1zIHZnL3RoaW4xCisKK0NyZWF0ZSBhIHNuYXBzaG90IG9mIHRoZSBmaXJzdCBzbmFwc2hvdDoKKy5icgorIyBsdmNyZWF0ZSBcLW4gdGhpbjFzMXMxIFwtcyB2Zy90aGluMXMxCisKKyMgbHZzIHZnL3RoaW4xczEgdmcvdGhpbjFzMiB2Zy90aGluMXMxczEKKyAgTFYgICAgICAgIFZHIEF0dHIgICAgICAgTFNpemUgUG9vbCAgT3JpZ2luCisgIHRoaW4xczEgICB2ZyBWd2ktLS10ei1rIDEuMDB0IHBvb2wwIHRoaW4xCisgIHRoaW4xczIgICB2ZyBWd2ktLS10ei1rIDEuMDB0IHBvb2wwIHRoaW4xCisgIHRoaW4xczFzMSB2ZyBWd2ktLS10ei1rIDEuMDB0IHBvb2wwIHRoaW4xczEKKworLlNTIDYuIGFjdGl2YXRlIFNuYXBMVgorCitUaGluIHNuYXBzaG90cyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBwZXJzaXN0ZW50ICJhY3RpdmF0aW9uIHNraXAiCitmbGFnLCBpbmRpY2F0ZWQgYnkgdGhlICJrIiBhdHRyaWJ1dGUuICBVc2UgXC1LIHdpdGggbHZjaGFuZ2UKK29yIHZnY2hhbmdlIHRvIGFjdGl2YXRlIHRoaW4gc25hcHNob3RzIHdpdGggdGhlICJrIiBhdHRyaWJ1dGUuCisKKy5CIGx2Y2hhbmdlIFwtYXkgXC1LIFZHL1NuYXBMVgorCisuSSBFeGFtcGxlCisuYnIKKyMgbHZjaGFuZ2UgXC1heSBcLUsgdmcvdGhpbjFzMQorCisjIGx2cyB2Zy90aGluMXMxCisgIExWICAgICAgVkcgQXR0ciAgICAgICBMU2l6ZSBQb29sICBPcmlnaW4KKyAgdGhpbjFzMSB2ZyBWd2ktYS10ei1rIDEuMDB0IHBvb2wwIHRoaW4xCisKKy5TSCBUaGluIFRvcGljcworCisuQiBBbHRlcm5hdGUgc3ludGF4IGZvciBzcGVjaWZ5aW5nIHR5cGUgdGhpblwtcG9vbAorLmJyCisuQiBBdXRvbWF0aWMgcG9vbCBtZXRhZGF0YSBMVgorLmJyCisuQiBTcGVjaWZ5IGRldmljZXMgZm9yIGRhdGEgYW5kIG1ldGFkYXRhIExWcworLmJyCisuQiBUb2xlcmF0ZSBkZXZpY2UgZmFpbHVyZXMgdXNpbmcgcmFpZAorLmJyCisuQiBTcGFyZSBtZXRhZGF0YSBMVgorLmJyCisuQiBNZXRhZGF0YSBjaGVjayBhbmQgcmVwYWlyCisuYnIKKy5CIEFjdGl2YXRpb24gb2YgdGhpbiBzbmFwc2hvdHMKKy5icgorLkIgUmVtb3ZpbmcgdGhpbiBwb29sIExWcywgdGhpbiBMVnMgYW5kIHNuYXBzaG90cworLmJyCisuQiBNYW51YWxseSBtYW5hZ2UgZnJlZSBkYXRhIHNwYWNlIG9mIHRoaW4gcG9vbCBMVgorLmJyCisuQiBNYW51YWxseSBtYW5hZ2UgZnJlZSBtZXRhZGF0YSBzcGFjZSBvZiBhIHRoaW4gcG9vbCBMVgorLmJyCisuQiBVc2luZyBmc3RyaW0gdG8gaW5jcmVhc2UgZnJlZSBzcGFjZSBpbiBhIHRoaW4gcG9vbCBMVgorLmJyCisuQiBBdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGluIHBvb2wgTFYKKy5icgorLkIgRGF0YSBzcGFjZSBleGhhdXN0aW9uCisuYnIKKy5CIE1ldGFkYXRhIHNwYWNlIGV4aGF1c3Rpb24KKy5icgorLkIgQXV0b21hdGljIGV4dGVuZCBzZXR0aW5ncworLmJyCisuQiBaZXJvaW5nCisuYnIKKy5CIERpc2NhcmQKKy5icgorLkIgQ2h1bmsgc2l6ZQorLmJyCisuQiBTaXplIG9mIHBvb2wgbWV0YWRhdGEgTFYKKy5icgorLkIgQ3JlYXRlIGEgdGhpbiBzbmFwc2hvdCBvZiBhbiBleHRlcm5hbCwgcmVhZCBvbmx5IExWCisuYnIKKy5CIENvbnZlcnQgYSBzdGFuZGFyZCBMViB0byBhIHRoaW4gTFYgd2l0aCBhbiBleHRlcm5hbCBvcmlnaW4KKy5icgorLkIgU2luZ2xlIHN0ZXAgdGhpbiBwb29sIExWIGNyZWF0aW9uCisuYnIKKy5CIFNpbmdsZSBzdGVwIHRoaW4gcG9vbCBMViBhbmQgdGhpbiBMViBjcmVhdGlvbgorLmJyCisuQiBNZXJnZSB0aGluIHNuYXBzaG90cworLmJyCisuQiBYRlMgb24gc25hcHNob3RzCisKK1wmCisKKy5TUyBBbHRlcm5hdGUgc3ludGF4IGZvciBzcGVjaWZ5aW5nIHR5cGUgdGhpblwtcG9vbAorCitcJgorCitUaGUgZnVsbHkgc3BlY2lmaWVkIHN5bnRheCBmb3IgY3JlYXRpbmcgYSB0aGluIHBvb2wgTFYgc2hvd24gYWJvdmUgaXM6CisKKy5CIGx2Y29udmVydCBcLVwtdHlwZSB0aGluLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSBWRy9UaGluTWV0YUxWIFZHL1RoaW5EYXRhTFYKKworQW4gZXhpc3RpbmcgTFYgaXMgY29udmVydGVkIHRvIGEgdGhpbiBwb29sIGJ5IGNoYW5naW5nIGl0cyB0eXBlIHRvCit0aGluLXBvb2wuICBBbiBhbHRlcm5hdGUgc3ludGF4IG1heSBiZSB1c2VkIGZvciB0aGUgc2FtZSBvcGVyYXRpb246CisKKy5CIGx2Y29udmVydCBcLVwtdGhpbnBvb2wgVkcvVGhpbkRhdGFMViBcLVwtcG9vbG1ldGFkYXRhIFZHL1RoaW5NZXRhTFYKKworVGhlIHRoaW4tcG9vbCB0eXBlIGlzIGluZmVycmVkIGJ5IGx2bTsgdGhlIC0tdGhpbnBvb2wgb3B0aW9uIGlzIG5vdCBhbgorYWxpYXMgZm9yIC0tdHlwZSB0aGluLXBvb2wuICBUaGUgdXNlIG9mIHRoZSAtLXRoaW5wb29sIG9wdGlvbiBoZXJlIGlzCitkaWZmZXJlbnQgZnJvbSB0aGUgdXNlIG9mIHRoZSAtLXRoaW5wb29sIG9wdGlvbiB3aGVuIGNyZWF0aW5nIGEgdGhpbiBMViwKK3doZXJlIGl0IHNwZWNpZmllcyB0aGUgcG9vbCBpbiB3aGljaCB0aGUgdGhpbiBMViBpcyBjcmVhdGVkLgorCisKKy5TUyBBdXRvbWF0aWMgcG9vbCBtZXRhZGF0YSBMVgorCitcJgorCitBIHRoaW4gZGF0YSBMViBjYW4gYmUgY29udmVydGVkIHRvIGEgdGhpbiBwb29sIExWIHdpdGhvdXQgc3BlY2lmeWluZyBhCit0aGluIHBvb2wgbWV0YWRhdGEgTFYuICBMVk0gYXV0b21hdGljYWxseSBjcmVhdGVzIGEgbWV0YWRhdGEgTFYgZnJvbSB0aGUKK3NhbWUgVkcuCisKKy5CIGx2Y3JlYXRlIFwtbiBUaGluRGF0YUxWIFwtTCBMYXJnZVNpemUgVkcKKy5icgorLkIgbHZjb252ZXJ0IFwtXC10eXBlIHRoaW5cLXBvb2wgVkcvVGhpbkRhdGFMVgorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorIyBsdmNyZWF0ZSBcLW4gcG9vbDAgXC1MIDEwRyB2ZworIyBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbCB2Zy9wb29sMAorCisjIGx2cyBcLWEKKyAgcG9vbDAgICAgICAgICAgIHZnICAgICAgICAgIHR3aS1hLXR6LS0gIDEwLjAwZworICBbcG9vbDBfdGRhdGFdICAgdmcgICAgICAgICAgVHdpLWFvLS0tLSAgMTAuMDBnCisgIFtwb29sMF90bWV0YV0gICB2ZyAgICAgICAgICBld2ktYW8tLS0tICAxNi4wMG0KKy5maQorCisKKy5TUyBTcGVjaWZ5IGRldmljZXMgZm9yIGRhdGEgYW5kIG1ldGFkYXRhIExWcworCitcJgorCitUaGUgZGF0YSBhbmQgbWV0YWRhdGEgTFZzIGluIGEgdGhpbiBwb29sIGFyZSBiZXN0IGNyZWF0ZWQgb24KK3NlcGFyYXRlIHBoeXNpY2FsIGRldmljZXMuICBUbyBkbyB0aGF0LCBzcGVjaWZ5IHRoZSBkZXZpY2UgbmFtZShzKQorYXQgdGhlIGVuZCBvZiB0aGUgbHZjcmVhdGUgbGluZS4gIEl0IGNhbiBiZSBlc3BlY2lhbGx5IGhlbHBmdWwKK3RvIHVzZSBmYXN0IGRldmljZXMgZm9yIHRoZSBtZXRhZGF0YSBMVi4KKworLkIgbHZjcmVhdGUgXC1uIFRoaW5EYXRhTFYgXC1MIExhcmdlU2l6ZSBWRyBMYXJnZVBWCisuYnIKKy5CIGx2Y3JlYXRlIFwtbiBUaGluTWV0YUxWIFwtTCBTbWFsbFNpemUgVkcgU21hbGxQVgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbCBcLVwtcG9vbG1ldGFkYXRhIFZHL1RoaW5NZXRhTFYgVkcvVGhpbkRhdGFMVgorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorIyBsdmNyZWF0ZSBcLW4gcG9vbDAgXC1MIDEwRyB2ZyAvZGV2L3NkQQorIyBsdmNyZWF0ZSBcLW4gcG9vbDBtZXRhIFwtTCAxRyB2ZyAvZGV2L3NkQgorIyBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbCBcLVwtcG9vbG1ldGFkYXRhIHZnL3Bvb2wwbWV0YSB2Zy9wb29sMAorLmZpCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fcG9vbF9tZXRhZGF0YV9yZXF1aXJlX3NlcGFyYXRlX3B2cworLmJyCitjb250cm9scyB0aGUgZGVmYXVsdCBQViB1c2FnZSBmb3IgdGhpbiBwb29sIGNyZWF0aW9uLgorCitcJgorCisuU1MgVG9sZXJhdGUgZGV2aWNlIGZhaWx1cmVzIHVzaW5nIHJhaWQKKworXCYKKworVG8gdG9sZXJhdGUgZGV2aWNlIGZhaWx1cmVzLCB1c2UgcmFpZCBmb3IgdGhlIHBvb2wgZGF0YSBMViBhbmQKK3Bvb2wgbWV0YWRhdGEgTFYuICBUaGlzIGlzIGVzcGVjaWFsbHkgcmVjb21tZW5kZWQgZm9yIHBvb2wgbWV0YWRhdGEgTFZzLgorCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSByYWlkMSBcLW0gMSBcLW4gVGhpbk1ldGFMViBcLUwgU21hbGxTaXplIFZHIFBWQSBQVkIKKy5icgorLkIgbHZjcmVhdGUgXC1cLXR5cGUgcmFpZDEgXC1tIDEgXC1uIFRoaW5EYXRhTFYgXC1MIExhcmdlU2l6ZSBWRyBQVkMgUFZECisuYnIKKy5CIGx2Y29udmVydCBcLVwtdHlwZSB0aGluXC1wb29sIFwtXC1wb29sbWV0YWRhdGEgVkcvVGhpbk1ldGFMViBWRy9UaGluRGF0YUxWCisKKy5JIEV4YW1wbGUKKy5icgorLm5mCisjIGx2Y3JlYXRlIFwtXC10eXBlIHJhaWQxIFwtbSAxIFwtbiBwb29sMCBcLUwgMTBHIHZnIC9kZXYvc2RBIC9kZXYvc2RCCisjIGx2Y3JlYXRlIFwtXC10eXBlIHJhaWQxIFwtbSAxIFwtbiBwb29sMG1ldGEgXC1MIDFHIHZnIC9kZXYvc2RDIC9kZXYvc2RECisjIGx2Y29udmVydCBcLVwtdHlwZSB0aGluXC1wb29sIFwtXC1wb29sbWV0YWRhdGEgdmcvcG9vbDBtZXRhIHZnL3Bvb2wwCisuZmkKKworCisuU1MgU3BhcmUgbWV0YWRhdGEgTFYKKworXCYKKworVGhlIGZpcnN0IHRpbWUgYSB0aGluIHBvb2wgTFYgaXMgY3JlYXRlZCwgbHZtIHdpbGwgY3JlYXRlIGEgc3BhcmUKK21ldGFkYXRhIExWIGluIHRoZSBWRy4gIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUKK29wdGlvbiBcLVwtcG9vbG1ldGFkYXRhc3BhcmUgeXxuLiAgKEZ1dHVyZSB0aGluIHBvb2wgY3JlYXRpb25zIHdpbGwKK2Fsc28gYXR0ZW1wdCB0byBjcmVhdGUgdGhlIHBtc3BhcmUgTFYgaWYgbm9uZSBleGlzdHMuKQorCitUbyBjcmVhdGUgdGhlIHBtc3BhcmUgKCJwb29sIG1ldGFkYXRhIHNwYXJlIikgTFYsIGx2bSBmaXJzdCBjcmVhdGVzCithbiBMViB3aXRoIGEgZGVmYXVsdCBuYW1lLCBlLmcuIGx2b2wwLCBhbmQgdGhlbiBjb252ZXJ0cyB0aGlzIExWIHRvCithIGhpZGRlbiBMViB3aXRoIHRoZSBfcG1zcGFyZSBzdWZmaXgsIGUuZy4gbHZvbDBfcG1zcGFyZS4KKworT25lIHBtc3BhcmUgTFYgaXMga2VwdCBpbiBhIFZHIHRvIGJlIHVzZWQgZm9yIGFueSB0aGluIHBvb2wuCisKK1RoZSBwbXNwYXJlIExWIGNhbm5vdCBiZSBjcmVhdGVkIGV4cGxpY2l0bHksIGJ1dCBtYXkgYmUgcmVtb3ZlZAorZXhwbGljaXRseS4KKworLkkgRXhhbXBsZQorLmJyCisubmYKKyMgbHZjcmVhdGUgXC1uIHBvb2wwIFwtTCAxMEcgdmcKKyMgbHZjcmVhdGUgXC1uIHBvb2wwbWV0YSBcLUwgMUcgdmcKKyMgbHZjb252ZXJ0IFwtXC10eXBlIHRoaW5cLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSB2Zy9wb29sMG1ldGEgdmcvcG9vbDAKKworIyBsdnMgXC1hCisgIFtsdm9sMF9wbXNwYXJlXSB2ZyAgICAgICAgICBld2ktLS0tLS0tCisgIHBvb2wwICAgICAgICAgICB2ZyAgICAgICAgICB0d2ktLS10ei0tCisgIFtwb29sMF90ZGF0YV0gICB2ZyAgICAgICAgICBUd2ktLS0tLS0tCisgIFtwb29sMF90bWV0YV0gICB2ZyAgICAgICAgICBld2ktLS0tLS0tCisuZmkKKworVGhlICJNZXRhZGF0YSBjaGVjayBhbmQgcmVwYWlyIiBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdXNlIG9mCit0aGUgcG1zcGFyZSBMVi4KKworCisuU1MgTWV0YWRhdGEgY2hlY2sgYW5kIHJlcGFpcgorCitcJgorCitJZiB0aGluIHBvb2wgbWV0YWRhdGEgaXMgZGFtYWdlZCwgaXQgbWF5IGJlIHJlcGFpcmFibGUuCitDaGVja2luZyBhbmQgcmVwYWlyaW5nIHRoaW4gcG9vbCBtZXRhZGF0YSBpcyBhbmFsYWdvdXMgdG8KK3J1bm5pbmcgZnNjayBvbiBhIGZpbGUgc3lzdGVtLgorCitXaGVuIGEgdGhpbiBwb29sIExWIGlzIGFjdGl2YXRlZCwgbHZtIHJ1bnMgdGhlIHRoaW5fY2hlY2sgY29tbWFuZAordG8gY2hlY2sgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBtZXRhZGF0YSBvbiB0aGUgcG9vbCBtZXRhZGF0YSBMVi4KKworLkJSIGx2bS5jb25mICg1KQorLkIgdGhpbl9jaGVja19leGVjdXRhYmxlCisuYnIKK2NhbiBiZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nICgiIikgdG8gZGlzYWJsZSB0aGUgdGhpbl9jaGVjayBzdGVwLgorVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fY2hlY2tfb3B0aW9ucworLmJyCitjb250cm9scyB0aGUgY29tbWFuZCBvcHRpb25zIHVzZWQgZm9yIHRoZSB0aGluX2NoZWNrIGNvbW1hbmQuCisKK0lmIHRoZSB0aGluX2NoZWNrIGNvbW1hbmQgZmluZHMgYSBwcm9ibGVtIHdpdGggdGhlIG1ldGFkYXRhLAordGhlIHRoaW4gcG9vbCBMViBpcyBub3QgYWN0aXZhdGVkLCBhbmQgdGhlIHRoaW4gcG9vbCBtZXRhZGF0YSBuZWVkcwordG8gYmUgcmVwYWlyZWQuCisKK1NpbXBsZSByZXBhaXIgY29tbWFuZHMgYXJlIG5vdCBhbHdheXMgc3VjY2Vzc2Z1bC4gIEFkdmFuY2VkIHJlcGFpciBtYXkKK3JlcXVpcmUgZWRpdGluZyB0aGluIHBvb2wgbWV0YWRhdGEgYW5kIGx2bSBtZXRhZGF0YS4gIE5ld2VyIHZlcnNpb25zIG9mCit0aGUga2VybmVsIGFuZCBsdm0gdG9vbHMgbWF5IGJlIG1vcmUgc3VjY2Vzc2Z1bCBhdCByZXBhaXIuICBSZXBvcnQgdGhlCitkZXRhaWxzIG9mIGRhbWFnZWQgdGhpbiBtZXRhZGF0YSB0byBnZXQgdGhlIGJlc3QgYWR2aWNlIG9uIHJlY292ZXJ5LgorCitDb21tYW5kIHRvIHJlcGFpciBhIHRoaW4gcG9vbDoKKy5icgorLkIgbHZjb252ZXJ0IFwtXC1yZXBhaXIgVkcvVGhpblBvb2xMVgorCitSZXBhaXIgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKworMS4gQ3JlYXRlcyBhIG5ldywgcmVwYWlyZWQgY29weSBvZiB0aGUgbWV0YWRhdGEuCisuYnIKK2x2Y29udmVydCBydW5zIHRoZSB0aGluX3JlcGFpciBjb21tYW5kIHRvIHJlYWQgZGFtYWdlZCBtZXRhZGF0YQorZnJvbSB0aGUgZXhpc3RpbmcgcG9vbCBtZXRhZGF0YSBMViwgYW5kIHdyaXRlcyBhIG5ldyByZXBhaXJlZAorY29weSB0byB0aGUgVkcncyBwbXNwYXJlIExWLgorCisyLiBSZXBsYWNlcyB0aGUgdGhpbiBwb29sIG1ldGFkYXRhIExWLgorLmJyCitJZiBzdGVwIDEgaXMgc3VjY2Vzc2Z1bCwgdGhlIHRoaW4gcG9vbCBtZXRhZGF0YSBMViBpcyByZXBsYWNlZAord2l0aCB0aGUgcG1zcGFyZSBMViBjb250YWluaW5nIHRoZSBjb3JyZWN0ZWQgbWV0YWRhdGEuCitUaGUgcHJldmlvdXMgdGhpbiBwb29sIG1ldGFkYXRhIExWLCBjb250YWluaW5nIHRoZSBkYW1hZ2VkIG1ldGFkYXRhLAorYmVjb21lcyB2aXNpYmxlIHdpdGggdGhlIG5ldyBuYW1lIFRoaW5Qb29sTFZfdG1ldGFOICh3aGVyZSBOIGlzIDAsMSwuLi4pLgorCitJZiB0aGUgcmVwYWlyIHdvcmtzLCB0aGUgdGhpbiBwb29sIExWIGFuZCBpdHMgdGhpbiBMVnMgY2FuIGJlIGFjdGl2YXRlZCwKK2FuZCB0aGUgTFYgY29udGFpbmluZyB0aGUgZGFtYWdlZCB0aGluIHBvb2wgbWV0YWRhdGEgY2FuIGJlIHJlbW92ZWQuCitJdCBtYXkgYmUgdXNlZnVsIHRvIG1vdmUgdGhlIG5ldyBtZXRhZGF0YSBMViAocHJldmlvdXNseSBwbXNwYXJlKSB0byBhCitiZXR0ZXIgUFYuCisKK0lmIHRoZSByZXBhaXIgZG9lcyBub3Qgd29yaywgdGhlIHRoaW4gcG9vbCBMViBhbmQgaXRzIHRoaW4gTFZzIGFyZSBsb3N0LgorCitJZiBtZXRhZGF0YSBpcyBtYW51YWxseSByZXN0b3JlZCB3aXRoIHRoaW5fcmVwYWlyIGRpcmVjdGx5LAordGhlIHBvb2wgbWV0YWRhdGEgTFYgY2FuIGJlIG1hbnVhbGx5IHN3YXBwZWQgd2l0aCBhbm90aGVyIExWCitjb250YWluaW5nIG5ldyBtZXRhZGF0YToKKworLkIgbHZjb252ZXJ0IFwtXC10aGlucG9vbCBWRy9UaGluUG9vbExWIFwtXC1wb29sbWV0YWRhdGEgVkcvTmV3VGhpbk1ldGFMVgorCisKKy5TUyBBY3RpdmF0aW9uIG9mIHRoaW4gc25hcHNob3RzCisKK1wmCisKK1doZW4gYSB0aGluIHNuYXBzaG90IExWIGlzIGNyZWF0ZWQsIGl0IGlzIGJ5IGRlZmF1bHQgZ2l2ZW4gdGhlCisiYWN0aXZhdGlvbiBza2lwIiBmbGFnLiAgVGhpcyBmbGFnIGlzIGluZGljYXRlZCBieSB0aGUgImsiIGF0dHJpYnV0ZQorZGlzcGxheWVkIGJ5IGx2czoKKworLm5mCisjIGx2cyB2Zy90aGluMXMxCisgIExWICAgICAgICAgVkcgIEF0dHIgICAgICAgTFNpemUgUG9vbCAgT3JpZ2luCisgIHRoaW4xczEgICAgdmcgIFZ3aS0tLXR6LWsgMS4wMHQgcG9vbDAgdGhpbjEKKy5maQorCitUaGlzIGZsYWcgY2F1c2VzIHRoZSBzbmFwc2hvdCBMViB0byBiZSBza2lwcGVkLCBpLmUuIG5vdCBhY3RpdmF0ZWQsCitieSBub3JtYWwgYWN0aXZhdGlvbiBjb21tYW5kcy4gIFRoZSBza2lwcGluZyBiZWhhdmlvciBkb2VzIG5vdAorYXBwbHkgdG8gZGVhY3RpdmF0aW9uIGNvbW1hbmRzLgorCitBIHNuYXBzaG90IExWIHdpdGggdGhlICJrIiBhdHRyaWJ1dGUgY2FuIGJlIGFjdGl2YXRlZCB1c2luZwordGhlIFwtSyAob3IgXC1cLWlnbm9yZWFjdGl2YXRpb25za2lwKSBvcHRpb24gaW4gYWRkaXRpb24gdG8gdGhlCitzdGFuZGFyZCBcLWF5IChvciBcLVwtYWN0aXZhdGUgeSkgb3B0aW9uLgorCitDb21tYW5kIHRvIGFjdGl2YXRlIGEgdGhpbiBzbmFwc2hvdCBMVjoKKy5icgorLkIgbHZjaGFuZ2UgXC1heSBcLUsgVkcvU25hcExWCisKK1RoZSBwZXJzaXN0ZW50ICJhY3RpdmF0aW9uIHNraXAiIGZsYWcgY2FuIGJlIHR1cm5lZCBvZmYgZHVyaW5nCitsdmNyZWF0ZSwgb3IgbGF0ZXIgd2l0aCBsdmNoYW5nZSB1c2luZyB0aGUgXC1rbgorKG9yIFwtXC1zZXRhY3RpdmF0aW9uc2tpcCBuKSBvcHRpb24uCitJdCBjYW4gYmUgdHVybmVkIG9uIGFnYWluIHdpdGggXC1reSAob3IgXC1cLXNldGFjdGl2YXRpb25za2lwIHkpLgorCitXaGVuIHRoZSAiYWN0aXZhdGlvbiBza2lwIiBmbGFnIGlzIHJlbW92ZWQsIG5vcm1hbCBhY3RpdmF0aW9uCitjb21tYW5kcyB3aWxsIGFjdGl2YXRlIHRoZSBMViwgYW5kIHRoZSBcLUsgYWN0aXZhdGlvbiBvcHRpb24gaXMKK25vdCBuZWVkZWQuCisKK0NvbW1hbmQgdG8gY3JlYXRlIHNuYXBzaG90IExWIHdpdGhvdXQgdGhlIGFjdGl2YXRpb24gc2tpcCBmbGFnOgorLmJyCisuQiBsdmNyZWF0ZSBcLWtuIFwtbiBTbmFwTFYgXC1zIFZHL1RoaW5MVgorCitDb21tYW5kIHRvIHJlbW92ZSB0aGUgYWN0aXZhdGlvbiBza2lwIGZsYWcgZnJvbSBhIHNuYXBzaG90IExWOgorLmJyCisuQiBsdmNoYW5nZSBcLWtuIFZHL1NuYXBMVgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiBhdXRvX3NldF9hY3RpdmF0aW9uX3NraXAKKy5icgorY29udHJvbHMgdGhlIGRlZmF1bHQgYWN0aXZhdGlvbiBza2lwIHNldHRpbmcgdXNlZCBieSBsdmNyZWF0ZS4KKworCisuU1MgUmVtb3ZpbmcgdGhpbiBwb29sIExWcywgdGhpbiBMVnMgYW5kIHNuYXBzaG90cworCitcJgorCitSZW1vdmluZyBhIHRoaW4gTFYgYW5kIGl0cyByZWxhdGVkIHNuYXBzaG90cyByZXR1cm5zIHRoZSBibG9ja3MgaXQKK3VzZWQgdG8gdGhlIHRoaW4gcG9vbCBMVi4gIFRoZXNlIGJsb2NrcyB3aWxsIGJlIHJldXNlZCBmb3Igb3RoZXIKK3RoaW4gTFZzIGFuZCBzbmFwc2hvdHMuCisKK1JlbW92aW5nIGEgdGhpbiBwb29sIExWIHJlbW92ZXMgYm90aCB0aGUgZGF0YSBMViBhbmQgbWV0YWRhdGEgTFYKK2FuZCByZXR1cm5zIHRoZSBzcGFjZSB0byB0aGUgVkcuCisKK2x2cmVtb3ZlIG9mIHRoaW4gcG9vbCBMVnMsIHRoaW4gTFZzIGFuZCBzbmFwc2hvdHMgY2Fubm90IGJlCityZXZlcnNlZCB3aXRoIHZnY2ZncmVzdG9yZS4KKwordmdjZmdiYWNrdXAgZG9lcyBub3QgYmFjayB1cCB0aGluIHBvb2wgbWV0YWRhdGEuCisKKworLlNTIE1hbnVhbGx5IG1hbmFnZSBmcmVlIGRhdGEgc3BhY2Ugb2YgdGhpbiBwb29sIExWCisKK1wmCisKK1RoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSBpbiBhIHRoaW4gcG9vbCBMViBjYW4gYmUgZGlzcGxheWVkCit3aXRoIHRoZSBsdnMgY29tbWFuZC4gIEZyZWUgc3BhY2UgY2FuIGJlIGFkZGVkIGJ5IGV4dGVuZGluZwordGhlIHRoaW4gcG9vbCBMVi4KKworQ29tbWFuZCB0byBleHRlbmQgdGhpbiBwb29sIGRhdGEgc3BhY2U6CisuYnIKKy5CIGx2ZXh0ZW5kIFwtTCBTaXplIFZHL1RoaW5Qb29sTFYKKworLkkgRXhhbXBsZQorLmJyCisubmYKKzEuIEEgdGhpbiBwb29sIExWIGlzIHVzaW5nIDI2Ljk2JSBvZiBpdHMgZGF0YSBibG9ja3MuCisjIGx2cworICBMViAgICBWRyAgICAgICAgICAgQXR0ciAgICAgICBMU2l6ZSAgIFBvb2wgIE9yaWdpbiBEYXRhJQorICBwb29sMCB2ZyAgICAgICAgICAgdHdpLWEtdHotLSAgMTAuMDBnICAgICAgICAgICAgICAgMjYuOTYKKworMi4gRG91YmxlIHRoZSBhbW91bnQgb2YgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIHRoaW4gcG9vbCBMVi4KKyMgbHZleHRlbmQgXC1MKzEwRyB2Zy9wb29sMAorCiszLiBUaGUgcGVyY2VudGFnZSBvZiB1c2VkIGRhdGEgYmxvY2tzIGlzIGhhbGYgdGhlIHByZXZpb3VzIHZhbHVlLgorIyBsdnMKKyAgTFYgICAgVkcgICAgICAgICAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4gRGF0YSUKKyAgcG9vbDAgdmcgICAgICAgICAgIHR3aS1hLXR6LS0gIDIwLjAwZyAgICAgICAgICAgICAgIDEzLjQ4CisuZmkKKworT3RoZXIgbWV0aG9kcyBvZiBpbmNyZWFzaW5nIGZyZWUgZGF0YSBzcGFjZSBpbiBhIHRoaW4gcG9vbCBMVgoraW5jbHVkZSByZW1vdmluZyBhIHRoaW4gTFYgYW5kIGl0cyByZWxhdGVkIHNuYXBzb3RzLCBvciBydW5uaW5nCitmc3RyaW0gb24gdGhlIGZpbGUgc3lzdGVtIHVzaW5nIGEgdGhpbiBMVi4KKworCisuU1MgTWFudWFsbHkgbWFuYWdlIGZyZWUgbWV0YWRhdGEgc3BhY2Ugb2YgYSB0aGluIHBvb2wgTFYKKworXCYKKworVGhlIGF2YWlsYWJsZSBtZXRhZGF0YSBzcGFjZSBpbiBhIHRoaW4gcG9vbCBMViBjYW4gYmUgZGlzcGxheWVkCit3aXRoIHRoZSBsdnMgXC1vK21ldGFkYXRhX3BlcmNlbnQgY29tbWFuZC4KKworQ29tbWFuZCB0byBleHRlbmQgdGhpbiBwb29sIG1ldGFkYXRhIHNwYWNlOgorLmJyCisuQiBsdmV4dGVuZCBcLVwtcG9vbG1ldGFkYXRhc2l6ZSBTaXplIFZHL1RoaW5Qb29sTFYKKworLkkgRXhhbXBsZQorLmJyCisxLiBBIHRoaW4gcG9vbCBMViBpcyB1c2luZyAxMi40MCUgb2YgaXRzIG1ldGFkYXRhIGJsb2Nrcy4KKy5uZgorIyBsdnMgXC1vbmFtZSxzaXplLGRhdGFfcGVyY2VudCxtZXRhZGF0YV9wZXJjZW50IHZnL3Bvb2wwCisgIExWICAgIExTaXplICAgRGF0YSUgIE1ldGElCisgIHBvb2wwICAyMC4wMGcgIDEzLjQ4ICAxMi40MAorLmZpCisKKzIuIERpc3BsYXkgYSB0aGluIHBvb2wgTFYgd2l0aCBpdHMgY29tcG9uZW50IHRoaW4gZGF0YSBMViBhbmQgdGhpbiBtZXRhZGF0YSBMVi4KKy5uZgorIyBsdnMgXC1hIFwtb25hbWUsYXR0cixzaXplIHZnCisgIExWICAgICAgICAgICAgICBBdHRyICAgICAgIExTaXplCisgIHBvb2wwICAgICAgICAgICB0d2ktYS10ei0tICAyMC4wMGcKKyAgW3Bvb2wwX3RkYXRhXSAgIFR3aS1hby0tLS0gIDIwLjAwZworICBbcG9vbDBfdG1ldGFdICAgZXdpLWFvLS0tLSAgMTIuMDBtCisuZmkKKworMy4gRG91YmxlIHRoZSBhbW91bnQgb2YgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIHRoaW4gbWV0YWRhdGEgTFYuCisubmYKKyMgbHZleHRlbmQgXC1cLXBvb2xtZXRhZGF0YXNpemUgKzEyTSB2Zy9wb29sMAorLmZpCisKKzQuIFRoZSBwZXJjZW50YWdlIG9mIHVzZWQgbWV0YWRhdGEgYmxvY2tzIGlzIGhhbGYgdGhlIHByZXZpb3VzIHZhbHVlLgorLm5mCisjIGx2cyBcLWEgXC1vbmFtZSxzaXplLGRhdGFfcGVyY2VudCxtZXRhZGF0YV9wZXJjZW50IHZnCisgIExWICAgICAgICAgICAgICBMU2l6ZSAgIERhdGElICBNZXRhJQorICBwb29sMCAgICAgICAgICAgIDIwLjAwZyAgMTMuNDggICA2LjIwCisgIFtwb29sMF90ZGF0YV0gICAgMjAuMDBnCisgIFtwb29sMF90bWV0YV0gICAgMjQuMDBtCisuZmkKKworCisuU1MgVXNpbmcgZnN0cmltIHRvIGluY3JlYXNlIGZyZWUgc3BhY2UgaW4gYSB0aGluIHBvb2wgTFYKKworXCYKKworUmVtb3ZpbmcgZmlsZXMgaW4gYSBmaWxlIHN5c3RlbSBvbiB0b3Agb2YgYSB0aGluIExWIGRvZXMgbm90CitnZW5lcmFsbHkgYWRkIGZyZWUgc3BhY2UgYmFjayB0byB0aGUgdGhpbiBwb29sLiAgTWFudWFsbHkgcnVubmluZwordGhlIGZzdHJpbSBjb21tYW5kIGNhbiByZXR1cm4gc3BhY2UgYmFjayB0byB0aGUgdGhpbiBwb29sIHRoYXQgaGFkCitiZWVuIHVzZWQgYnkgcmVtb3ZlZCBmaWxlcy4gIGZzdHJpbSB1c2VzIGRpc2NhcmRzIGFuZCB3aWxsIG5vdCB3b3JrCitpZiB0aGUgdGhpbiBwb29sIExWIGhhcyBkaXNjYXJkcyBtb2RlIHNldCB0byBpZ25vcmUuCisKKy5JIEV4YW1wbGUKKy5icgorQSB0aGluIHBvb2wgaGFzIDEwRyBvZiBwaHlzaWNhbCBkYXRhIHNwYWNlLCBhbmQgYSB0aGluIExWIGhhcyBhIHZpcnR1YWwKK3NpemUgb2YgMTAwRy4gIFdyaXRpbmcgYSAxRyBmaWxlIHRvIHRoZSBmaWxlIHN5c3RlbSByZWR1Y2VzIHRoZQorZnJlZSBzcGFjZSBpbiB0aGUgdGhpbiBwb29sIGJ5IDEwJSBhbmQgaW5jcmVhc2VzIHRoZSB2aXJ0dWFsIHVzYWdlCitvZiB0aGUgZmlsZSBzeXN0ZW0gYnkgMSUuICBSZW1vdmluZyB0aGUgMUcgZmlsZSByZXN0b3JlcyB0aGUgdmlydHVhbAorMSUgdG8gdGhlIGZpbGUgc3lzdGVtLCBidXQgZG9lcyBub3QgcmVzdG9yZSB0aGUgcGh5c2ljYWwgMTAlIHRvIHRoZQordGhpbiBwb29sLiAgVGhlIGZzdHJpbSBjb21tYW5kIHJlc3RvcmVzIHRoZSBwaHlzaWNhbCBzcGFjZSB0byB0aGUgdGhpbiBwb29sLgorCisubmYKKyMgbHZzIFwtYSBcLW9uYW1lLGF0dHIsc2l6ZSxwb29sX2x2LG9yaWdpbixkYXRhX3BlcmNlbnQsbWV0YWRhdGFfcGVyY2VudCB2ZworTFYgICAgICAgICAgICAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4gRGF0YSUgIE1ldGElCitwb29sMCAgICAgICAgICAgdHdpLWEtdHotLSAgMTAuMDBnICAgICAgICAgICAgICAgNDcuMDEgIDIxLjAzCit0aGluMSAgICAgICAgICAgVndpLWFvdHotLSAxMDAuMDBnIHBvb2wwICAgICAgICAgIDIuNzAKKworIyBkZiBcLWggL21udC9YCitGaWxlc3lzdGVtICAgICAgICAgICAgU2l6ZSAgVXNlZCBBdmFpbCBVc2UlIE1vdW50ZWQgb24KKy9kZXYvbWFwcGVyL3ZnLXRoaW4xICAgOTlHICAxLjFHICAgOTNHICAgMiUgL21udC9YCisKKyMgZGQgaWY9L2Rldi96ZXJvIG9mPS9tbnQvWC8xR2ZpbGUgYnM9NDA5NiBjb3VudD0yNjIxNDQ7IHN5bmMKKworIyBsdnMKK3Bvb2wwICAgICAgICAgICB2ZyAgIHR3aS1hLXR6LS0gIDEwLjAwZyAgICAgICAgICAgICAgIDU3LjAxICAyNS4yNgordGhpbjEgICAgICAgICAgIHZnICAgVndpLWFvdHotLSAxMDAuMDBnIHBvb2wwICAgICAgICAgIDMuNzAKKworIyBkZiBcLWggL21udC9YCisvZGV2L21hcHBlci92Zy10aGluMSAgIDk5RyAgMi4xRyAgIDkyRyAgIDMlIC9tbnQvWAorCisjIHJtIC9tbnQvWC8xR2ZpbGUKKworIyBsdnMKK3Bvb2wwICAgICAgICAgICB2ZyAgIHR3aS1hLXR6LS0gIDEwLjAwZyAgICAgICAgICAgICAgIDU3LjAxICAyNS4yNgordGhpbjEgICAgICAgICAgIHZnICAgVndpLWFvdHotLSAxMDAuMDBnIHBvb2wwICAgICAgICAgIDMuNzAKKworIyBkZiBcLWggL21udC9YCisvZGV2L21hcHBlci92Zy10aGluMSAgIDk5RyAgMS4xRyAgIDkzRyAgIDIlIC9tbnQvWAorCisjIGZzdHJpbSBcLXYgL21udC9YCisKKyMgbHZzCitwb29sMCAgICAgICAgICAgdmcgICB0d2ktYS10ei0tICAxMC4wMGcgICAgICAgICAgICAgICA0Ny4wMSAgMjEuMDMKK3RoaW4xICAgICAgICAgICB2ZyAgIFZ3aS1hb3R6LS0gMTAwLjAwZyBwb29sMCAgICAgICAgICAyLjcwCisuZmkKKworVGhlICJEaXNjYXJkIiBzZWN0aW9uIGNvdmVycyBhbiBvcHRpb24gZm9yIGF1dG9tYXRpY2FsbHkgZnJlZWluZyBkYXRhCitzcGFjZSBpbiBhIHRoaW4gcG9vbC4KKworCisuU1MgQXV0b21hdGljYWxseSBleHRlbmQgdGhpbiBwb29sIExWCisKK1wmCisKK1RoZSBsdm0gZGFlbW9uIGRtZXZlbnRkIChsdm0yLW1vbml0b3IpIG1vbml0b3JzIHRoZSBkYXRhIHVzYWdlIG9mIHRoaW4KK3Bvb2wgTFZzIGFuZCBleHRlbmRzIHRoZW0gd2hlbiB0aGUgdXNhZ2UgcmVhY2hlcyBhIGNlcnRhaW4gbGV2ZWwuICBUaGUKK25lY2Vzc2FyeSBmcmVlIHNwYWNlIG11c3QgZXhpc3QgaW4gdGhlIFZHIHRvIGV4dGVuZCB0aGluIHBvb2wgTFZzLgorTW9uaXRvcmluZyBhbmQgZXh0ZW5zaW9uIG9mIHRoaW4gcG9vbCBMVnMgYXJlIGNvbnRyb2xsZWQgaW5kZXBlbmRlbnRseS4KKworLkkgbW9uaXRvcmluZworCitXaGVuIGEgdGhpbiBwb29sIExWIGlzIGFjdGl2YXRlZCwgZG1ldmVudGQgd2lsbCBiZWdpbiBtb25pdG9yaW5nIGl0IGJ5CitkZWZhdWx0LgorCitDb21tYW5kIHRvIHN0YXJ0IG9yIHN0b3AgZG1ldmVudGQgbW9uaXRvcmluZyBhIHRoaW4gcG9vbCBMVjoKKy5icgorLkIgbHZjaGFuZ2UgXC1cLW1vbml0b3Ige3l8bn0gVkcvVGhpblBvb2xMVgorCitUaGUgY3VycmVudCBkbWV2ZW50ZCBtb25pdG9yaW5nIHN0YXR1cyBvZiBhIHRoaW4gcG9vbCBMViBjYW4gYmUgZGlzcGxheWVkCit3aXRoIHRoZSBjb21tYW5kIGx2cyAtbytzZWdfbW9uaXRvci4KKworLkkgYXV0b2V4dGVuZAorCitkbWV2ZW50ZCBzaG91bGQgYmUgY29uZmlndXJlZCB0byBleHRlbmQgdGhpbiBwb29sIExWcyBiZWZvcmUgYWxsIGRhdGEKK3NwYWNlIGlzIHVzZWQuICBXYXJuaW5ncyBhcmUgZW1pdHRlZCB0aHJvdWdoIHN5c2xvZyB3aGVuIHRoZSB1c2Ugb2YgYSB0aGluCitwb29sIHJlYWNoZXMgODAlLCA4NSUsIDkwJSBhbmQgOTUlLiAgKFNlZSB0aGUgc2VjdGlvbiAiRGF0YSBzcGFjZQorZXhoYXVzdGlvbiIgZm9yIHRoZSBlZmZlY3RzIG9mIG5vdCBleHRlbmRpbmcgYSB0aGluIHBvb2wgTFYuKSAgVGhlIHBvaW50CithdCB3aGljaCBkbWV2ZW50ZCBleHRlbmRzIHRoaW4gcG9vbCBMVnMsIGFuZCB0aGUgYW1vdW50IGFyZSBjb250cm9sbGVkCit3aXRoIHR3byBjb25maWd1cmF0aW9uIHNldHRpbmdzOgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiB0aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQKKy5icgoraXMgYSBwZXJjZW50YWdlIGZ1bGwgdmFsdWUgdGhhdCBkZWZpbmVzIHdoZW4gdGhlIHRoaW4gcG9vbCBMViBzaG91bGQgYmUKK2V4dGVuZGVkLiAgU2V0dGluZyB0aGlzIHRvIDEwMCBkaXNhYmxlcyBhdXRvbWF0aWMgZXh0ZW50aW9uLiAgVGhlIG1pbmltdW0KK3ZhbHVlIGlzIDUwLgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiB0aGluX3Bvb2xfYXV0b2V4dGVuZF9wZXJjZW50CisuYnIKK2RlZmluZXMgaG93IG11Y2ggZXh0cmEgZGF0YSBzcGFjZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHRoaW4gcG9vbCBMViBmcm9tCit0aGUgVkcsIGluIHBlcmNlbnQgb2YgaXRzIGN1cnJlbnQgc2l6ZS4KKworLkkgZGlzYWJsaW5nCisKK1RoZXJlIGFyZSBtdWx0aXBsZSB3YXlzIHRoYXQgZXh0ZW5zaW9uIG9mIHRoaW4gcG9vbHMgY291bGQgYmUgcHJldmVudGVkOgorCisuSVAgXFtidV0gMgorSWYgdGhlIGRtZXZlbnRkIGRhZW1vbiBpcyBub3QgcnVubmluZywgbm8gbW9uaXRvcmluZyBvciBhdXRvbWF0aWMKK2V4dGVuc2lvbiB3aWxsIG9jY3VyLgorCisuSVAgXFtidV0KK0V2ZW4gd2hlbiBkbWV2ZW50ZCBpcyBydW5uaW5nLCBhbGwgbW9uaXRvcmluZyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUKK2x2bS5jb25mIG1vbml0b3Jpbmcgc2V0dGluZy4KKworLklQIFxbYnVdCitUbyBhY3RpdmF0ZSBvciBjcmVhdGUgYSB0aGluIHBvb2wgTFYgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIGRtZXZlbnRkLAordGhlIC0taWdub3JlbW9uaXRvcmluZyBvcHRpb24gY2FuIGJlIHVzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCB0aGUgY29tbWFuZAord2lsbCBub3QgYXNrIGRtZXZlbnRkIHRvIG1vbml0b3IgdGhlIHRoaW4gcG9vbCBMVi4KKworLklQIFxbYnVdCitTZXR0aW5nIHRoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG91bGQgdG8gMTAwIGRpc2FibGVzIGF1dG9tYXRpYworZXh0ZW5zaW9uIG9mIHRoaW4gcG9vbCBMVnMsIGV2ZW4gaWYgdGhleSBhcmUgYmVpbmcgbW9uaXRvcmVkIGJ5IGRtZXZlbnRkLgorCisuUAorCisuSSBFeGFtcGxlCisuYnIKK0lmIHRoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG9sZCBpcyA3MCBhbmQgdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCBpcyAyMCwKK3doZW5ldmVyIGEgcG9vbCBleGNlZWRzIDcwJSB1c2FnZSwgaXQgd2lsbCBiZSBleHRlbmRlZCBieSBhbm90aGVyIDIwJS4KK0ZvciBhIDFHIHBvb2wsIHVzaW5nIDcwME0gd2lsbCB0cmlnZ2VyIGEgcmVzaXplIHRvIDEuMkcuIFdoZW4gdGhlIHVzYWdlIGV4Y2VlZHMKKzg0ME0sIHRoZSBwb29sIHdpbGwgYmUgZXh0ZW5kZWQgdG8gMS40NEcsIGFuZCBzbyBvbi4KKworCisuU1MgRGF0YSBzcGFjZSBleGhhdXN0aW9uCisKK1wmCisKK1doZW4gcHJvcGVybHkgbWFuYWdlZCwgdGhpbiBwb29sIGRhdGEgc3BhY2Ugc2hvdWxkIGJlIGV4dGVuZGVkIGJlZm9yZSBpdAoraXMgYWxsIHVzZWQgKHNlZSB0aGUgc2VjdGlvbiAiQXV0b21hdGljYWxseSBleHRlbmQgdGhpbiBwb29sIExWIikuICBJZgordGhpbiBwb29sIGRhdGEgc3BhY2UgaXMgYWxyZWFkeSBleGhhdXN0ZWQsIGl0IGNhbiBzdGlsbCBiZSBleHRlbmRlZCAoc2VlCit0aGUgc2VjdGlvbiAiTWFudWFsbHkgbWFuYWdlIGZyZWUgZGF0YSBzcGFjZSBvZiB0aGluIHBvb2wgTFYiLikKKworVGhlIGJlaGF2aW9yIG9mIGEgZnVsbCB0aGluIHBvb2wgaXMgY29uZmlndXJhYmxlIHdpdGggdGhlIC0tZXJyb3J3aGVuZnVsbAoreXxuIG9wdGlvbiB0byBsdmNyZWF0ZSBvciBsdmNoYW5nZS4gIFRoZSBlcnJvcndoZW5mdWxsIHNldHRpbmcgYXBwbGllcworb25seSB0byB3cml0ZXM7IHJlYWRpbmcgdGhpbiBMVnMgY2FuIGNvbnRpbnVlIGV2ZW4gd2hlbiBkYXRhIHNwYWNlIGlzCitleGhhdXN0ZWQuCisKK0NvbW1hbmQgdG8gY2hhbmdlIHRoZSBoYW5kbGluZyBvZiBhIGZ1bGwgdGhpbiBwb29sOgorLmJyCisuQiBsdmNoYW5nZSAtLWVycm9yd2hlbmZ1bGwge3l8bn0gVkcvVGhpblBvb2xMVgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiBlcnJvcl93aGVuX2Z1bGwKKy5icgorY29udHJvbHMgdGhlIGRlZmF1bHQgZXJyb3Igd2hlbiBmdWxsIGJlaGF2aW9yLgorCitUaGUgY3VycmVudCBzZXR0aW5nIG9mIGEgdGhpbiBwb29sIExWIGNhbiBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgY29tbWFuZDoKK2x2cyAtbytsdl93aGVuX2Z1bGwuCisKK1RoZSBlcnJvcndoZW5mdWxsIHNldHRpbmcgZG9lcyBub3QgZWZmZWN0IHRoZSBtb25pdG9yaW5nIGFuZCBhdXRvZXh0ZW5kCitzZXR0aW5ncywgYW5kIHRoZSBtb25pdG9yaW5nL2F1dG9leHRlbmQgc2V0dGluZ3MgZG8gbm90IGVmZmVjdCB0aGUKK2Vycm9yd2hlbmZ1bGwgc2V0dGluZy4gIEl0IGlzIG9ubHkgd2hlbiBtb25pdG9yaW5nL2F1dG9leHRlbmQgYXJlIG5vdAorZWZmZWN0aXZlIHRoYXQgdGhlIHRoaW4gcG9vbCBiZWNvbWVzIGZ1bGwgYW5kIHRoZSBlcnJvcndoZW5mdWxsIHNldHRpbmcgaXMKK2FwcGxpZWQuCisKKy5JIGVycm9yd2hlbmZ1bGwgbgorCitUaGlzIGlzIHRoZSBkZWZhdWx0LiAgV3JpdGVzIHRvIHRoaW4gTFZzIGFyZSBhY2NlcHRlZCBhbmQgcXVldWVkLCB3aXRoIHRoZQorZXhwZWN0YXRpb24gdGhhdCBwb29sIGRhdGEgc3BhY2Ugd2lsbCBiZSBleHRlbmRlZCBzb29uLiAgT25jZSBkYXRhIHNwYWNlCitpcyBleHRlbmRlZCwgdGhlIHF1ZXVlZCB3cml0ZXMgd2lsbCBiZSBwcm9jZXNzZWQsIGFuZCB0aGUgdGhpbiBwb29sIHdpbGwKK3JldHVybiB0byBub3JtYWwgb3BlcmF0aW9uLgorCitXaGlsZSB3YWl0aW5nIHRvIGJlIGV4dGVuZGVkLCB0aGUgdGhpbiBwb29sIHdpbGwgcXVldWUgd3JpdGVzIGZvciB1cCB0byA2MAorc2Vjb25kcyAodGhlIGRlZmF1bHQpLiAgSWYgZGF0YSBzcGFjZSBoYXMgbm90IGJlZW4gZXh0ZW5kZWQgYWZ0ZXIgdGhpcwordGltZSwgdGhlIHF1ZXVlZCB3cml0ZXMgd2lsbCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGNhbGxlciwgZS5nLiB0aGUgZmlsZQorc3lzdGVtLiAgVGhpcyBjYW4gcmVzdWx0IGluIGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24gZm9yIG5vbi1qb3VybmFsZWQgZmlsZQorc3lzdGVtcyB0aGF0IG1heSByZXF1aXJlIGZzY2suICBXaGVuIGEgdGhpbiBwb29sIHJldHVybnMgZXJyb3JzIGZvciB3cml0ZXMKK3RvIGEgdGhpbiBMViwgYW55IGZpbGUgc3lzdGVtIGlzIHN1YmplY3QgdG8gbG9zaW5nIHVuc3luY2VkIHVzZXIgZGF0YS4KKworVGhlIDYwIHNlY29uZCB0aW1lb3V0IGNhbiBiZSBjaGFuZ2VkIG9yIGRpc2FibGVkIHdpdGggdGhlIGRtXC10aGluXC1wb29sCitrZXJuZWwgbW9kdWxlIG9wdGlvbgorLkIgbm9fc3BhY2VfdGltZW91dC4KK1RoaXMgb3B0aW9uIHNldHMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhpbiBwb29scyB3aWxsIHF1ZXVlIHdyaXRlcy4KK0lmIHNldCB0byAwLCB3cml0ZXMgd2lsbCBub3QgdGltZSBvdXQuICBEaXNhYmxpbmcgdGltZW91dHMgY2FuIHJlc3VsdCBpbgordGhlIHN5c3RlbSBydW5uaW5nIG91dCBvZiByZXNvdXJjZXMsIG1lbW9yeSBleGhhdXN0aW9uLCBodW5nIHRhc2tzLCBhbmQKK2RlYWRsb2Nrcy4gIChUaGUgdGltZW91dCBhcHBsaWVzIHRvIGFsbCB0aGluIHBvb2xzIG9uIHRoZSBzeXN0ZW0uKQorCisuSSBlcnJvcndoZW5mdWxsIHkKKworV3JpdGVzIHRvIHRoaW4gTFZzIGltbWVkaWF0ZWx5IHJldHVybiBhbiBlcnJvciwgYW5kIG5vIHdyaXRlcyBhcmUgcXVldWVkLgorSW4gdGhlIGNhc2Ugb2YgYSBmaWxlIHN5c3RlbSwgdGhpcyBjYW4gcmVzdWx0IGluIGNvcnJ1cHRpb24gdGhhdCBtYXkKK3JlcXVpcmUgZnNjayAodGhlIHNwZWNpZmljIGNvbnNlcXVlbmNlcyBkZXBlbmQgb24gdGhlIHRoaW4gTFYgdXNlci4pCisKKy5JIGRhdGEgcGVyY2VudAorCitXaGVuIGRhdGEgc3BhY2UgaXMgZXhoYXVzdGVkLCB0aGUgbHZzIGNvbW1hbmQgZGlzcGxheXMgMTAwIHVuZGVyIERhdGElIGZvcgordGhlIHRoaW4gcG9vbCBMVjoKKworLm5mCisjIGx2cyB2Zy9wb29sMAorICBMViAgICAgVkcgICAgICAgICAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4gRGF0YSUKKyAgcG9vbDAgIHZnICAgICAgICAgICB0d2ktYS10ei0tIDUxMi4wMG0gICAgICAgICAgICAgIDEwMC4wMAorLmZpCisKKy5JIGNhdXNlcworCitBIHRoaW4gcG9vbCBtYXkgcnVuIG91dCBvZiBkYXRhIHNwYWNlIGZvciBhbnkgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOgorCisuSVAgXFtidV0gMgorQXV0b21hdGljIGV4dGVuc2lvbiBvZiB0aGUgdGhpbiBwb29sIGlzIGRpc2FibGVkLCBhbmQgdGhlIHRoaW4gcG9vbCBpcyBub3QKK21hbnVhbGx5IGV4dGVuZGVkLiAgKERpc2FibGluZyBhdXRvbWF0aWMgZXh0ZW5zaW9uIGlzIG5vdCByZWNvbW1lbmRlZC4pCisKKy5JUCBcW2J1XQorVGhlIGRtZXZlbnRkIGRhZW1vbiBpcyBub3QgcnVubmluZyBhbmQgdGhlIHRoaW4gcG9vbCBpcyBub3QgbWFudWFsbHkKK2V4dGVuZGVkLiAgKERpc2FibGluZyBkbWV2ZW50ZCBpcyBub3QgcmVjb21tZW5kZWQuKQorCisuSVAgXFtidV0KK0F1dG9tYXRpYyBleHRlbnNpb24gb2YgdGhlIHRoaW4gcG9vbCBpcyB0b28gc2xvdyBnaXZlbiB0aGUgcmF0ZSBvZiB3cml0ZXMKK3RvIHRoaW4gTFZzIGluIHRoZSBwb29sLiAgKFRoaXMgY2FuIGJlIGFkZHJlc3NlZCBieSB0dW5pbmcgdGhlCit0aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQgYW5kIHRoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQuCitTZWUgIkF1dG9tYXRpYyBleHRlbmQgc2V0dGluZ3MiLikKKworLklQIFxbYnVdCitUaGUgVkcgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnJlZSBibG9ja3MgdG8gZXh0ZW5kIHRoZSB0aGluIHBvb2wuCisKKy5QCisKKy5TUyBNZXRhZGF0YSBzcGFjZSBleGhhdXN0aW9uCisKK1wmCisKK0lmIHRoaW4gcG9vbCBtZXRhZGF0YSBzcGFjZSBpcyBleGhhdXN0ZWQgKG9yIGEgdGhpbiBwb29sIG1ldGFkYXRhCitvcGVyYXRpb24gZmFpbHMpLCBlcnJvcnMgd2lsbCBiZSByZXR1cm5lZCBmb3IgSU8gb3BlcmF0aW9ucyBvbiB0aGluIExWcy4KKworV2hlbiBtZXRhZGF0YSBzcGFjZSBpcyBleGhhdXN0ZWQsIHRoZSBsdnMgY29tbWFuZCBkaXNwbGF5cyAxMDAgdW5kZXIgTWV0YSUKK2ZvciB0aGUgdGhpbiBwb29sIExWOgorCisubmYKKyMgbHZzIFwtbyBsdl9uYW1lLHNpemUsZGF0YV9wZXJjZW50LG1ldGFkYXRhX3BlcmNlbnQgdmcvcG9vbDAKKyAgTFYgICAgTFNpemUgRGF0YSUgIE1ldGElCisgIHBvb2wwICAgICAgICAgICAgICAxMDAuMDAKKy5maQorCitUaGUgc2FtZSByZWFzb25zIGZvciB0aGluIHBvb2wgZGF0YSBzcGFjZSBleGhhdXN0aW9uIGFwcGx5IHRvIHRoaW4gcG9vbAorbWV0YWRhdGEgc3BhY2UuCisKK01ldGFkYXRhIHNwYWNlIGV4aGF1c3Rpb24gY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW50IHRoaW4gcG9vbCBtZXRhZGF0YSBhbmQKK2luY29uc2lzdGVudCBmaWxlIHN5c3RlbXMsIHNvIHRoZSByZXNwb25zZSByZXF1aXJlcyBvZmZsaW5lIGNoZWNraW5nIGFuZAorcmVwYWlyLgorCisxLiBEZWFjdGl2YXRlIHRoZSB0aGluIHBvb2wgTFYsIG9yIHJlYm9vdCB0aGUgc3lzdGVtIGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlLgorCisyLiBSZXBhaXIgdGhpbiBwb29sIHdpdGggbHZjb252ZXJ0IFwtXC1yZXBhaXIuCisuYnIKKyAgIFNlZSAiTWV0YWRhdGEgY2hlY2sgYW5kIHJlcGFpciIuCisKKzMuIEV4dGVuZCBwb29sIG1ldGFkYXRhIHNwYWNlIHdpdGggbHZleHRlbmQgXC1cLXBvb2xtZXRhZGF0YXNpemUuCisuYnIKKyAgIFNlZSAiTWFudWFsbHkgbWFuYWdlIGZyZWUgbWV0YWRhdGEgc3BhY2Ugb2YgYSB0aGluIHBvb2wgTFYiLgorCis0LiBDaGVjayBhbmQgcmVwYWlyIGZpbGUgc3lzdGVtIHdpdGggZnNjay4KKworCisuU1MgQXV0b21hdGljIGV4dGVuZCBzZXR0aW5ncworCitcJgorCitUaGluIHBvb2wgTFZzIGNhbiBiZSBleHRlbmRlZCBhY2NvcmRpbmcgdG8gcHJlc2V0IHZhbHVlcy4gIFRoZSBwcmVzZXRzCitkZXRlcm1pbmUgaWYgdGhlIExWIHNob3VsZCBiZSBleHRlbmRlZCBiYXNlZCBvbiBob3cgZnVsbCBpdCBpcywgYW5kIGlmIHNvCitieSBob3cgbXVjaC4gIFdoZW4gZG1ldmVudGQgbW9uaXRvcnMgdGhpbiBwb29sIExWcywgaXQgdXNlcyBsdmV4dGVuZCB3aXRoCit0aGVzZSBwcmVzZXRzLiAgKFNlZSAiQXV0b21hdGljYWxseSBleHRlbmQgdGhpbiBwb29sIExWIi4pCisKK0NvbW1hbmQgdG8gZXh0ZW5kIGEgdGhpbiBwb29sIGRhdGEgTFYgdXNpbmcgcHJlc2V0czoKKy5icgorLkIgbHZleHRlbmQgXC1cLXVzZVwtcG9saWNpZXMgVkcvVGhpblBvb2xMVgorCitUaGUgY29tbWFuZCB1c2VzIHRoZXNlIHNldHRpbmdzOgorCisuQlIgbHZtLmNvbmYgKDUpCisuQiB0aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQKKy5icgorYXV0b2V4dGVuZCB0aGUgTFYgd2hlbiBpdHMgdXNhZ2UgZXhjZWVkcyB0aGlzIHBlcmNlbnQuCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQKKy5icgorYXV0b2V4dGVuZCB0aGUgTFYgYnkgdGhpcyBtdWNoIGFkZGl0aW9uYWwgc3BhY2UuCisKK1RvIHNlZSB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlc2Ugc2V0dGluZ3MsIHJ1bjoKKworLkIgbHZtY29uZmlnIFwtXC10eXBlIGRlZmF1bHQgXC1cLXdpdGhjb21tZW50CisuUlMKKy5CIGFjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkCisuUkUKKworLkIgbHZtY29uZmlnIFwtXC10eXBlIGRlZmF1bHQgXC1cLXdpdGhjb21tZW50CisuUlMKKy5CIGFjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudAorLlJFCisKK1RvIGNoYW5nZSB0aGVzZSB2YWx1ZXMgZ2xvYmFsbHksIGVkaXQKKy5CUiBsdm0uY29uZiAoNSkuCisKK1RvIGNoYW5nZSB0aGVzZSB2YWx1ZXMgb24gYSBwZXItVkcgb3IgcGVyLUxWIGJhc2lzLCBhdHRhY2ggYSAicHJvZmlsZSIgdG8KK3RoZSBWRyBvciBMVi4gIEEgcHJvZmlsZSBpcyBhIGNvbGxlY3Rpb24gb2YgY29uZmlnIHNldHRpbmdzLCBzYXZlZCBpbiBhCitsb2NhbCB0ZXh0IGZpbGUgKHVzaW5nIHRoZSBsdm0uY29uZiBmb3JtYXQpLiAgbHZtIGxvb2tzIGZvciBwcm9maWxlcyBpbgordGhlIHByb2ZpbGVfZGlyIGRpcmVjdG9yeSwgZS5nLiAvZXRjL2x2bS9wcm9maWxlLy4gIE9uY2UgYXR0YWNoZWQgdG8gYSBWRworb3IgTFYsIGx2bSB3aWxsIHByb2Nlc3MgdGhlIFZHIG9yIExWIHVzaW5nIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBhdHRhY2hlZAorcHJvZmlsZS4gIEEgcHJvZmlsZSBpcyBuYW1lZCBhbmQgcmVmZXJlbmNlZCBieSBpdHMgZmlsZSBuYW1lLgorCitUbyB1c2UgYSBwcm9maWxlIHRvIGN1c3RvbWl6ZSB0aGUgbHZleHRlbmQgc2V0dGluZ3MgZm9yIGFuIExWOgorCisuSVAgXFtidV0gMgorQ3JlYXRlIGEgZmlsZSBjb250YWluaW5nIHNldHRpbmdzLCBzYXZlZCBpbiBwcm9maWxlX2Rpci4KK0ZvciB0aGUgcHJvZmlsZV9kaXIgbG9jYXRpb24sIHJ1bjoKKy5icgorLkIgbHZtY29uZmlnIGNvbmZpZy9wcm9maWxlX2RpcgorCisuSVAgXFtidV0gMgorQXR0YWNoIHRoZSBwcm9maWxlIHRvIGFuIExWLCB1c2luZyB0aGUgY29tbWFuZDoKKy5icgorLkIgbHZjaGFuZ2UgXC1cLW1ldGFkYXRhcHJvZmlsZSBQcm9maWxlTmFtZSBWRy9UaGluUG9vbExWCisKKy5JUCBcW2J1XSAyCitFeHRlbmQgdGhlIExWIHVzaW5nIHRoZSBwcm9maWxlIHNldHRpbmdzOgorLmJyCisuQiBsdmV4dGVuZCBcLVwtdXNlXC1wb2xpY2llcyBWRy9UaGluUG9vbExWCisKKy5QCisKKy5JIEV4YW1wbGUKKy5icgorLm5mCisjIGx2bWNvbmZpZyBjb25maWcvcHJvZmlsZV9kaXIKK3Byb2ZpbGVfZGlyPSIvZXRjL2x2bS9wcm9maWxlIgorCisjIGNhdCAvZXRjL2x2bS9wcm9maWxlL3Bvb2wwZXh0ZW5kLnByb2ZpbGUKK2FjdGl2YXRpb24geworICAgICAgICB0aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQ9NTAKKyAgICAgICAgdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudD0xMAorfQorCisjIGx2Y2hhbmdlIC0tbWV0YWRhdGFwcm9maWxlIHBvb2wwZXh0ZW5kIHZnL3Bvb2wwCisKKyMgbHZleHRlbmQgLS11c2UtcG9saWNpZXMgdmcvcG9vbDAKKy5maQorCisuSSBOb3RlcworLklQIFxbYnVdIDIKK0EgcHJvZmlsZSBpcyBhdHRhY2hlZCB0byBhIFZHIG9yIExWIGJ5IG5hbWUsIHdoZXJlIHRoZSBuYW1lIHJlZmVyZW5jZXMgYQorbG9jYWwgZmlsZSBpbiBwcm9maWxlX2Rpci4gIElmIHRoZSBWRyBpcyBtb3ZlZCB0byBhbm90aGVyIG1hY2hpbmUsIHRoZQorZmlsZSB3aXRoIHRoZSBwcm9maWxlIGFsc28gbmVlZHMgdG8gYmUgbW92ZWQuCisKKy5JUCBcW2J1XSAyCitPbmx5IGNlcnRhaW4gc2V0dGluZ3MgY2FuIGJlIHVzZWQgaW4gYSBWRyBvciBMViBwcm9maWxlLCBzZWU6CisuYnIKKy5CIGx2bWNvbmZpZyBcLVwtdHlwZSBwcm9maWxhYmxlLW1ldGFkYXRhLgorCisuSVAgXFtidV0gMgorQW4gTFYgd2l0aG91dCBhIHByb2ZpbGUgb2YgaXRzIG93biB3aWxsIGluaGVyaXQgdGhlIFZHIHByb2ZpbGUuCisKKy5JUCBcW2J1XSAyCitSZW1vdmUgYSBwcm9maWxlIGZyb20gYW4gTFYgdXNpbmcgdGhlIGNvbW1hbmQ6CisuYnIKKy5CIGx2Y2hhbmdlIC0tZGV0YWNocHJvZmlsZSBWRy9UaGluUG9vbExWLgorCisuSVAgXFtidV0gMgorQ29tbWFuZHMgY2FuIGFsc28gaGF2ZSBwcm9maWxlcyBhcHBsaWVkIHRvIHRoZW0uICBUaGUgc2V0dGluZ3MgdGhhdCBjYW4gYmUKK2FwcGxpZWQgdG8gYSBjb21tYW5kIGFyZSBkaWZmZXJlbnQgdGhhbiB0aGUgc2V0dGluZ3MgdGhhdCBjYW4gYmUgYXBwbGllZAordG8gYSBWRyBvciBMVi4gIFNlZSBsdm1jb25maWcgXC1cLXR5cGUgcHJvZmlsYWJsZVwtY29tbWFuZC4gIFRvIGFwcGx5IGEKK3Byb2ZpbGUgdG8gYSBjb21tYW5kLCB3cml0ZSBhIHByb2ZpbGUsIHNhdmUgaXQgaW4gdGhlIHByb2ZpbGUgZGlyZWN0b3J5LAorYW5kIHJ1biB0aGUgY29tbWFuZCB1c2luZyB0aGUgb3B0aW9uOiBcLVwtY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWUuCisKKworLlNTIFplcm9pbmcKKworXCYKKworV2hlbiBhIHRoaW4gcG9vbCBwcm92aXNpb25zIGEgbmV3IGRhdGEgYmxvY2sgZm9yIGEgdGhpbiBMViwgdGhlCituZXcgYmxvY2sgaXMgZmlyc3Qgb3ZlcndyaXR0ZW4gd2l0aCB6ZXJvcy4gIFRoZSB6ZXJvaW5nIG1vZGUgaXMKK2luZGljYXRlZCBieSB0aGUgInoiIGF0dHJpYnV0ZSBkaXNwbGF5ZWQgYnkgbHZzLiAgVGhlIG9wdGlvbiBcLVoKKyhvciBcLVwtemVybykgY2FuIGJlIGFkZGVkIHRvIGNvbW1hbmRzIHRvIHNwZWNpZnkgdGhlIHplcm9pbmcgbW9kZS4KKworQ29tbWFuZCB0byBzZXQgdGhlIHplcm9pbmcgbW9kZSB3aGVuIGNyZWF0aW5nIGEgdGhpbiBwb29sIExWOgorLmJyCisuQiBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpblwtcG9vbCBcLVp7eXxufQorLmJyCisuUlMKKy5CIFwtXC1wb29sbWV0YWRhdGEgVkcvVGhpbk1ldGFMViBWRy9UaGluRGF0YUxWCisuUkUKKworQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHplcm9pbmcgbW9kZSBvZiBhbiBleGlzdGluZyB0aGluIHBvb2wgTFY6CisuYnIKKy5CIGx2Y2hhbmdlIFwtWnt5fG59IFZHL1RoaW5Qb29sTFYKKworSWYgemVyb2luZyBtb2RlIGlzIGNoYW5nZWQgZnJvbSAibiIgdG8gInkiLCBwcmV2aW91c2x5IHByb3Zpc2lvbmVkCitibG9ja3MgYXJlIG5vdCB6ZXJvZWQuCisKK1Byb3Zpc2lvbmluZyBvZiBsYXJnZSB6ZXJvZWQgY2h1bmtzIGltcGFjdHMgcGVyZm9ybWFuY2UuCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fcG9vbF96ZXJvCisuYnIKK2NvbnRyb2xzIHRoZSBkZWZhdWx0IHplcm9pbmcgbW9kZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0aGluIHBvb2wuCisKKworLlNTIERpc2NhcmQKKworXCYKKworVGhlIGRpc2NhcmQgYmVoYXZpb3Igb2YgYSB0aGluIHBvb2wgTFYgZGV0ZXJtaW5lcyBob3cgZGlzY2FyZCByZXF1ZXN0cyBhcmUKK2hhbmRsZWQuICBFbmFibGluZyBkaXNjYXJkIHVuZGVyIGEgZmlsZSBzeXN0ZW0gbWF5IGFkdmVyc2VseSBhZmZlY3QgdGhlCitmaWxlIHN5c3RlbSBwZXJmb3JtYW5jZSAoc2VlIHRoZSBzZWN0aW9uIG9uIGZzdHJpbSBmb3IgYW4gYWx0ZXJuYXRpdmUuKQorUG9zc2libGUgZGlzY2FyZCBiZWhhdmlvcnM6CisKK2lnbm9yZTogSWdub3JlIGFueSBkaXNjYXJkcyB0aGF0IGFyZSByZWNlaXZlZC4KKworbm9wYXNzZG93bjogUHJvY2VzcyBhbnkgZGlzY2FyZHMgaW4gdGhlIHRoaW4gcG9vbCBpdHNlbGYgYW5kIGFsbG93Cit0aGUgbm8gbG9uZ2VyIG5lZWRlZCBleHRlbmRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IG5ldyBkYXRhLgorCitwYXNzZG93bjogUHJvY2VzcyBkaXNjYXJkcyBpbiB0aGUgdGhpbiBwb29sIChhcyB3aXRoIG5vcGFzc2Rvd24pLCBhbmQKK3Bhc3MgdGhlIGRpc2NhcmRzIGRvd24gdGhlIHRoZSB1bmRlcmx5aW5nIGRldmljZS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKK21vZGUuCisKK0NvbW1hbmQgdG8gZGlzcGxheSB0aGUgY3VycmVudCBkaXNjYXJkIG1vZGUgb2YgYSB0aGluIHBvb2wgTFY6CisuYnIKKy5CIGx2cyBcLW8rZGlzY2FyZHMgVkcvVGhpblBvb2xMVgorCitDb21tYW5kIHRvIHNldCB0aGUgZGlzY2FyZCBtb2RlIHdoZW4gY3JlYXRpbmcgYSB0aGluIHBvb2wgTFY6CisuYnIKKy5CIGx2Y29udmVydCBcLVwtZGlzY2FyZHMge2lnbm9yZXxub3Bhc3Nkb3dufHBhc3Nkb3dufQorLmJyCisuUlMKKy5CIFwtXC10eXBlIHRoaW5cLXBvb2wgXC1cLXBvb2xtZXRhZGF0YSBWRy9UaGluTWV0YUxWIFZHL1RoaW5EYXRhTFYKKy5SRQorCitDb21tYW5kIHRvIGNoYW5nZSB0aGUgZGlzY2FyZCBtb2RlIG9mIGFuIGV4aXN0aW5nIHRoaW4gcG9vbCBMVjoKKy5icgorLkIgbHZjaGFuZ2UgXC1cLWRpc2NhcmRzIHtpZ25vcmV8bm9wYXNzZG93bnxwYXNzZG93bn0gVkcvVGhpblBvb2xMVgorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorIyBsdnMgXC1vIG5hbWUsZGlzY2FyZHMgdmcvcG9vbDAKK3Bvb2wwIHBhc3Nkb3duCisKKyMgbHZjaGFuZ2UgXC1cLWRpc2NhcmRzIGlnbm9yZSB2Zy9wb29sMAorLmZpCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fcG9vbF9kaXNjYXJkcworLmJyCitjb250cm9scyB0aGUgZGVmYXVsdCBkaXNjYXJkcyBtb2RlIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRoaW4gcG9vbC4KKworCisuU1MgQ2h1bmsgc2l6ZQorCitcJgorCitUaGUgc2l6ZSBvZiBkYXRhIGJsb2NrcyBtYW5hZ2VkIGJ5IGEgdGhpbiBwb29sIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUKK1wtXC1jaHVua3NpemUgb3B0aW9uIHdoZW4gdGhlIHRoaW4gcG9vbCBMViBpcyBjcmVhdGVkLiAgVGhlIGRlZmF1bHQgdW5pdAoraXMgS2lCLiBUaGUgdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0S2lCIGJldHdlZW4gNjRLaUIgYW5kIDFHaUIuCisKK1doZW4gYSB0aGluIHBvb2wgaXMgdXNlZCBwcmltYXJpbHkgZm9yIHRoZSB0aGluIHByb3Zpc2lvbmluZyBmZWF0dXJlLCBhCitsYXJnZXIgdmFsdWUgaXMgb3B0aW1hbC4gIFRvIG9wdGltaXplIGZvciBtYW55IHNuYXBzaG90cywgYSBzbWFsbGVyIHZhbHVlCityZWR1Y2VzIGNvcHlpbmcgdGltZSBhbmQgY29uc3VtZXMgbGVzcyBzcGFjZS4KKworQ29tbWFuZCB0byBkaXNwbGF5IHRoZSB0aGluIHBvb2wgTFYgY2h1bmsgc2l6ZToKKy5icgorLkIgbHZzIFwtbytjaHVua3NpemUgVkcvVGhpblBvb2xMVgorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorIyBsdnMgXC1vIG5hbWUsY2h1bmtzaXplCisgIHBvb2wwIDY0LjAwaworLmZpCisKKy5CUiBsdm0uY29uZiAoNSkKKy5CIHRoaW5fcG9vbF9jaHVua19zaXplCisuYnIKK2NvbnRyb2xzIHRoZSBkZWZhdWx0IGNodW5rIHNpemUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGhpbiBwb29sLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBzaG93biBieToKKy5icgorLkIgbHZtY29uZmlnIFwtXC10eXBlIGRlZmF1bHQgYWxsb2NhdGlvbi90aGluX3Bvb2xfY2h1bmtfc2l6ZQorCisKKy5TUyBTaXplIG9mIHBvb2wgbWV0YWRhdGEgTFYKKworXCYKKworVGhlIGFtb3VudCBvZiB0aGluIG1ldGFkYXRhIGRlcGVuZHMgb24gaG93IG1hbnkgYmxvY2tzIGFyZSBzaGFyZWQgYmV0d2VlbgordGhpbiBMVnMgKGkuZS4gdGhyb3VnaCBzbmFwc2hvdHMpLiAgQSB0aGluIHBvb2wgd2l0aCBtYW55IHNuYXBzaG90cyBtYXkKK25lZWQgYSBsYXJnZXIgbWV0YWRhdGEgTFYuICBUaGluIHBvb2wgbWV0YWRhdGEgTFYgc2l6ZXMgY2FuIGJlIGZyb20gMk1pQgordG8gMTZHaUIuCisKK1doZW4gdXNpbmcgbHZjcmVhdGUgdG8gY3JlYXRlIHdoYXQgd2lsbCBiZWNvbWUgYSB0aGluIG1ldGFkYXRhIExWLCB0aGUKK3NpemUgaXMgc3BlY2lmaWVkIHdpdGggdGhlIFwtTHxcLVwtc2l6ZSBvcHRpb24uCisKK1doZW4gYW4gTFZNIGNvbW1hbmQgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgdGhpbiBtZXRhZGF0YSBMViwgdGhlIHNpemUgaXMKK3NwZWNpZmllZCB3aXRoIHRoZSBcLVwtcG9vbG1ldGFkYXRhc2l6ZSBvcHRpb24uICBXaGVuIHRoaXMgb3B0aW9uIGlzIG5vdAorZ2l2ZW4sIExWTSBhdXRvbWF0aWNhbGx5IGNob29zZXMgYSBzaXplIGJhc2VkIG9uIHRoZSBkYXRhIHNpemUgYW5kIGNodW5rCitzaXplLgorCitJdCBjYW4gYmUgaGFyZCB0byBwcmVkaWN0IHRoZSBhbW91bnQgb2YgbWV0YWRhdGEgc3BhY2UgdGhhdCB3aWxsIGJlCituZWVkZWQsIHNvIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYSBzaXplIG9mIDFHaUIgd2hpY2ggc2hvdWxkIGJlCitlbm91Z2ggZm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMuICBBIHRoaW4gcG9vbCBtZXRhZGF0YSBMViBjYW4gbGF0ZXIgYmUKK21hbnVhbGx5IG9yIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgaWYgbmVlZGVkLgorCisKKy5TUyBDcmVhdGUgYSB0aGluIHNuYXBzaG90IG9mIGFuIGV4dGVybmFsLCByZWFkIG9ubHkgTFYKKworXCYKKworVGhpbiBzbmFwc2hvdHMgYXJlIHR5cGljYWxseSB0YWtlbiBvZiBvdGhlciB0aGluIExWcyBvciBvdGhlcgordGhpbiBzbmFwc2hvdCBMVnMgd2l0aGluIHRoZSBzYW1lIHRoaW4gcG9vbC4gIEl0IGlzIGFsc28gcG9zc2libGUKK3RvIHRha2UgdGhpbiBzbmFwc2hvdHMgb2YgZXh0ZXJuYWwsIHJlYWQgb25seSBMVnMuICBXcml0ZXMgdG8gdGhlCitzbmFwc2hvdCBhcmUgc3RvcmVkIGluIHRoZSB0aGluIHBvb2wsIGFuZCB0aGUgZXh0ZXJuYWwgTFYgaXMgdXNlZAordG8gcmVhZCB1bndyaXR0ZW4gcGFydHMgb2YgdGhlIHRoaW4gc25hcHNob3QuCisKKy5CIGx2Y3JlYXRlIFwtbiBTbmFwTFYgXC1zIFZHL0V4dGVybmFsT3JpZ2luTFYgXC1cLXRoaW5wb29sIFZHL1RoaW5Qb29sTFYKKworLkkgRXhhbXBsZQorLmJyCisubmYKKyMgbHZjaGFuZ2UgXC1hbiB2Zy9sdmUKKyMgbHZjaGFuZ2UgXC1cLXBlcm1pc3Npb24gciB2Zy9sdmUKKyMgbHZjcmVhdGUgXC1uIHNuYXBsdmUgXC1zIHZnL2x2ZSBcLVwtdGhpbnBvb2wgdmcvcG9vbDAKKworIyBsdnMgdmcvbHZlIHZnL3NuYXBsdmUKKyAgTFYgICAgICBWRyAgQXR0ciAgICAgICBMU2l6ZSAgUG9vbCAgT3JpZ2luIERhdGElCisgIGx2ZSAgICAgdmcgIG9yaS0tLS0tLS0gMTAuMDBnCisgIHNuYXBsdmUgdmcgIFZ3aS1hLXR6LS0gMTAuMDBnIHBvb2wwIGx2ZSAgICAgIDAuMDAKKy5maQorCisKKy5TUyBDb252ZXJ0IGEgc3RhbmRhcmQgTFYgdG8gYSB0aGluIExWIHdpdGggYW4gZXh0ZXJuYWwgb3JpZ2luCisKK1wmCisKK0EgbmV3IHRoaW4gTFYgY2FuIGJlIGNyZWF0ZWQgYW5kIGdpdmVuIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCitzdGFuZGFyZCBMVi4gIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSBleGlzdGluZyBMViBpcyBjb252ZXJ0ZWQgdG8gYQorcmVhZCBvbmx5IGV4dGVybmFsIExWIHdpdGggYSBuZXcgbmFtZS4gIFVud3JpdHRlbiBwb3J0aW9ucyBvZiB0aGUKK3RoaW4gTFYgYXJlIHJlYWQgZnJvbSB0aGUgZXh0ZXJuYWwgTFYuCitUaGUgbmV3IG5hbWUgZ2l2ZW4gdG8gdGhlIGV4aXN0aW5nIExWIGNhbiBiZSBzcGVjaWZpZWQgd2l0aAorXC1cLW9yaWdpbm5hbWUsIG90aGVyd2lzZSB0aGUgZXhpc3RpbmcgTFYgd2lsbCBiZSBnaXZlbiBhIGRlZmF1bHQKK25hbWUsIGUuZy4gbHZvbCMuCisKK0NvbnZlcnQgRXhhbXBsZUxWIGludG8gYSByZWFkIG9ubHkgZXh0ZXJuYWwgTFYgd2l0aCB0aGUgbmV3IG5hbWUKK05ld0V4dGVybmFsT3JpZ2luTFYsIGFuZCBjcmVhdGUgYSBuZXcgdGhpbiBMViB0aGF0IGlzIGdpdmVuIHRoZSBwcmV2aW91cworbmFtZSBvZiBFeGFtcGxlTFYuCisKKy5CIGx2Y29udmVydCBcLVwtdHlwZSB0aGluIFwtXC10aGlucG9vbCBWRy9UaGluUG9vbExWCisuYnIKKy5SUworLkIgXC1cLW9yaWdpbm5hbWUgTmV3RXh0ZXJuYWxPcmlnaW5MViBWRy9FeGFtcGxlTFYKKy5SRQorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorIyBsdmNyZWF0ZSBcLW4gbHZfZXhhbXBsZSBcLUwgMTBHIHZnCisKKyMgbHZzCisgIGx2X2V4YW1wbGUgICAgICB2ZyAgICAgICAgICAtd2ktYS0tLS0tICAxMC4wMGcKKworIyBsdmNvbnZlcnQgXC1cLXR5cGUgdGhpbiBcLVwtdGhpbnBvb2wgdmcvcG9vbDAKKyAgICAgICAgICBcLVwtb3JpZ2lubmFtZSBsdl9leHRlcm5hbCBcLVwtdGhpbiB2Zy9sdl9leGFtcGxlCisKKyMgbHZzCisgIExWICAgICAgICAgICAgICBWRyAgICAgICAgICBBdHRyICAgICAgIExTaXplICAgUG9vbCAgT3JpZ2luCisgIGx2X2V4YW1wbGUgICAgICB2ZyAgICAgICAgICBWd2ktYS10ei0tICAxMC4wMGcgcG9vbDAgbHZfZXh0ZXJuYWwKKyAgbHZfZXh0ZXJuYWwgICAgIHZnICAgICAgICAgIG9yaS0tLS0tLS0gIDEwLjAwZworLmZpCisKKworLlNTIFNpbmdsZSBzdGVwIHRoaW4gcG9vbCBMViBjcmVhdGlvbgorCitcJgorCitBIHRoaW4gcG9vbCBMViBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc2luZ2xlIGx2Y3JlYXRlIGNvbW1hbmQsCityYXRoZXIgdGhhbiB1c2luZyBsdmNvbnZlcnQgb24gZXhpc3RpbmcgTFZzLgorVGhpcyBvbmUgY29tbWFuZCBjcmVhdGVzIGEgdGhpbiBkYXRhIExWLCBhIHRoaW4gbWV0YWRhdGEgTFYsCithbmQgY29tYmluZXMgdGhlIHR3byBpbnRvIGEgdGhpbiBwb29sIExWLgorCisuQiBsdmNyZWF0ZSBcLVwtdHlwZSB0aGluXC1wb29sIFwtTCBMYXJnZVNpemUgXC1uIFRoaW5Qb29sTFYgVkcKKworLkkgRXhhbXBsZQorLmJyCisubmYKKyMgbHZjcmVhdGUgXC1cLXR5cGUgdGhpblwtcG9vbCBcLUw4TSAtbiBwb29sMCB2ZworCisjIGx2cyB2Zy9wb29sMAorICBMViAgICBWRyAgQXR0ciAgICAgICBMU2l6ZSBQb29sIE9yaWdpbiBEYXRhJQorICBwb29sMCB2ZyAgdHdpLWEtdHotLSA4LjAwbSAgICAgICAgICAgICAgIDAuMDAKKworIyBsdnMgXC1hCisgIHBvb2wwICAgICAgICAgICB2ZyAgICAgICAgICB0d2ktYS10ei0tICAgOC4wMG0KKyAgW3Bvb2wwX3RkYXRhXSAgIHZnICAgICAgICAgIFR3aS1hby0tLS0gICA4LjAwbQorICBbcG9vbDBfdG1ldGFdICAgdmcgICAgICAgICAgZXdpLWFvLS0tLSAgIDguMDBtCisuZmkKKworCisuU1MgU2luZ2xlIHN0ZXAgdGhpbiBwb29sIExWIGFuZCB0aGluIExWIGNyZWF0aW9uCisKK1wmCisKK0EgdGhpbiBwb29sIExWIGFuZCBhIHRoaW4gTFYgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhIHNpbmdsZQorbHZjcmVhdGUgY29tbWFuZC4gIFRoaXMgb25lIGNvbW1hbmQgY3JlYXRlcyBhIHRoaW4gZGF0YSBMViwKK2EgdGhpbiBtZXRhZGF0YSBMViwgY29tYmluZXMgdGhlIHR3byBpbnRvIGEgdGhpbiBwb29sIExWLAorYW5kIGNyZWF0ZXMgYSB0aGluIExWIGluIHRoZSBuZXcgcG9vbC4KKy5icgorXC1MIExhcmdlU2l6ZSBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIHRoaW4gcG9vbCBMVi4KKy5icgorXC1WIFZpcnR1YWxTaXplIHNwZWNpZmllcyB0aGUgdmlydHVhbCBzaXplIG9mIHRoZSB0aGluIExWLgorCisuQiBsdmNyZWF0ZSBcLVYgVmlydHVhbFNpemUgXC1MIExhcmdlU2l6ZQorLlJTCisuQiBcLW4gVGhpbkxWIFwtXC10aGlucG9vbCBWRy9UaGluUG9vbExWCisuUkUKKworRXF1aXZhbGVudCB0bzoKKy5icgorLkIgbHZjcmVhdGUgXC1cLXR5cGUgdGhpblwtcG9vbCBcLUwgTGFyZ2VTaXplIFZHL1RoaW5Qb29sTFYKKy5icgorLkIgbHZjcmVhdGUgXC1uIFRoaW5MViBcLVYgVmlydHVhbFNpemUgXC1cLXRoaW5wb29sIFZHL1RoaW5Qb29sTFYKKworLkkgRXhhbXBsZQorLmJyCisubmYKKyMgbHZjcmVhdGUgXC1MOE0gXC1WMkcgXC1uIHRoaW4xIFwtXC10aGlucG9vbCB2Zy9wb29sMAorCisjIGx2cyBcLWEKKyAgcG9vbDAgICAgICAgICAgIHZnICAgICAgICAgIHR3aS1hLXR6LS0gICA4LjAwbQorICBbcG9vbDBfdGRhdGFdICAgdmcgICAgICAgICAgVHdpLWFvLS0tLSAgIDguMDBtCisgIFtwb29sMF90bWV0YV0gICB2ZyAgICAgICAgICBld2ktYW8tLS0tICAgOC4wMG0KKyAgdGhpbjEgICAgICAgICAgIHZnICAgICAgICAgIFZ3aS1hLXR6LS0gICAyLjAwZyBwb29sMAorLmZpCisKKworLlNTIE1lcmdlIHRoaW4gc25hcHNob3RzCisKK1wmCisKK0EgdGhpbiBzbmFwc2hvdCBjYW4gYmUgbWVyZ2VkIGludG8gaXRzIG9yaWdpbiB0aGluIExWIHVzaW5nIHRoZSBsdmNvbnZlcnQKK1wtXC1tZXJnZSBjb21tYW5kLiAgVGhlIHJlc3VsdCBvZiBhIHNuYXBzaG90IG1lcmdlIGlzIHRoYXQgdGhlIG9yaWdpbiB0aGluCitMViB0YWtlcyB0aGUgY29udGVudCBvZiB0aGUgc25hcHNob3QgTFYsIGFuZCB0aGUgc25hcHNob3QgTFYgaXMgcmVtb3ZlZC4KK0FueSBjb250ZW50IHRoYXQgd2FzIHVuaXF1ZSB0byB0aGUgb3JpZ2luIHRoaW4gTFYgaXMgbG9zdCBhZnRlciB0aGUgbWVyZ2UuCisKK0JlY2F1c2UgYSBtZXJnZSBjaGFuZ2VzIHRoZSBjb250ZW50IG9mIGFuIExWLCBpdCBjYW5ub3QgYmUgZG9uZSB3aGlsZSB0aGUKK0xWcyBhcmUgb3BlbiwgZS5nLiBtb3VudGVkLiAgSWYgYSBtZXJnZSBpcyBpbml0aWF0ZWQgd2hpbGUgdGhlIExWcyBhcmUgb3BlbiwKK3RoZSBlZmZlY3Qgb2YgdGhlIG1lcmdlIGlzIGRlbGF5ZWQgdW50aWwgdGhlIG9yaWdpbiB0aGluIExWIGlzIG5leHQKK2FjdGl2YXRlZC4KKworLkIgbHZjb252ZXJ0IFwtXC1tZXJnZSBWRy9TbmFwTFYKKworLkkgRXhhbXBsZQorLmJyCisubmYKKyMgbHZzIHZnCisgIExWICAgICAgVkcgQXR0ciAgICAgICBMU2l6ZSAgIFBvb2wgIE9yaWdpbgorICBwb29sMCAgIHZnIHR3aS1hLXR6LS0gIDEwLjAwZworICB0aGluMSAgIHZnIFZ3aS1hLXR6LS0gMTAwLjAwZyBwb29sMAorICB0aGluMXMxIHZnIFZ3aS1hLXR6LWsgMTAwLjAwZyBwb29sMCB0aGluMQorCisjIGx2Y29udmVydCBcLVwtbWVyZ2UgdmcvdGhpbjFzMQorCisjIGx2cyB2ZworICBMViAgICAgIFZHIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4KKyAgcG9vbDAgICB2ZyB0d2ktYS10ei0tICAxMC4wMGcKKyAgdGhpbjEgICB2ZyBWd2ktYS10ei0tIDEwMC4wMGcgcG9vbDAKKy5maQorCisuSSBFeGFtcGxlCisuYnIKKy5uZgorRGVsYXllZCBtZXJnaW5nIG9mIG9wZW4gTFZzLgorCisjIGx2cyB2ZworICBMViAgICAgIFZHIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4KKyAgcG9vbDAgICB2ZyB0d2ktYS10ei0tICAxMC4wMGcKKyAgdGhpbjEgICB2ZyBWd2ktYW90ei0tIDEwMC4wMGcgcG9vbDAKKyAgdGhpbjFzMSB2ZyBWd2ktYW90ei1rIDEwMC4wMGcgcG9vbDAgdGhpbjEKKworIyBkZgorL2Rldi9tYXBwZXIvdmctdGhpbjEgICAgICAgICAgICAxMDBHICAgMzNNICAxMDBHICAgMSUgL21udC9YCisvZGV2L21hcHBlci92Zy10aGluMXMxICAgICAgICAgIDEwMEcgICAzM00gIDEwMEcgICAxJSAvbW50L1hzCisKKyMgbHMgL21udC9YCitmaWxlMSBmaWxlMiBmaWxlMworIyBscyAvbW50L1hzCitmaWxlMyBmaWxlNCBmaWxlNQorCisjIGx2Y29udmVydCBcLVwtbWVyZ2UgdmcvdGhpbjFzMQorTG9naWNhbCB2b2x1bWUgdmcvdGhpbjFzMSBjb250YWlucyBhIGZpbGVzeXN0ZW0gaW4gdXNlLgorRGVsYXlpbmcgbWVyZ2Ugc2luY2Ugc25hcHNob3QgaXMgb3Blbi4KK01lcmdpbmcgb2YgdGhpbiBzbmFwc2hvdCB0aGluMXMxIHdpbGwgb2NjdXIgb24gbmV4dCBhY3RpdmF0aW9uLgorCisjIHVtb3VudCAvbW50L1gKKyMgdW1vdW50IC9tbnQvWHMKKworIyBsdnMgXC1hIHZnCisgIExWICAgICAgICAgICAgICBWRyAgIEF0dHIgICAgICAgTFNpemUgICBQb29sICBPcmlnaW4KKyAgcG9vbDAgICAgICAgICAgIHZnICAgdHdpLWEtdHotLSAgMTAuMDBnCisgIFtwb29sMF90ZGF0YV0gICB2ZyAgIFR3aS1hby0tLS0gIDEwLjAwZworICBbcG9vbDBfdG1ldGFdICAgdmcgICBld2ktYW8tLS0tICAgMS4wMGcKKyAgdGhpbjEgICAgICAgICAgIHZnICAgT3dpLWEtdHotLSAxMDAuMDBnIHBvb2wwCisgIFt0aGluMXMxXSAgICAgICB2ZyAgIFN3aS1hLXR6LWsgMTAwLjAwZyBwb29sMCB0aGluMQorCisjIGx2Y2hhbmdlIFwtYW4gdmcvdGhpbjEKKyMgbHZjaGFuZ2UgXC1heSB2Zy90aGluMQorCisjIG1vdW50IC9kZXYvdmcvdGhpbjEgL21udC9YCisKKyMgbHMgL21udC9YCitmaWxlMyBmaWxlNCBmaWxlNQorLmZpCisKKworLlNTIFhGUyBvbiBzbmFwc2hvdHMKKworXCYKKworTW91bnRpbmcgYW4gWEZTIGZpbGUgc3lzdGVtIG9uIGEgbmV3IHNuYXBzaG90IExWIHJlcXVpcmVzIGF0dGVudGlvbiB0byB0aGUKK2ZpbGUgc3lzdGVtJ3MgbG9nIHN0YXRlIGFuZCB1dWlkLiAgT24gdGhlIHNuYXBzaG90IExWLCB0aGUgeGZzIGxvZyB3aWxsCitjb250YWluIGEgZHVtbXkgdHJhbnNhY3Rpb24sIGFuZCB0aGUgeGZzIHV1aWQgd2lsbCBtYXRjaCB0aGUgdXVpZCBmcm9tIHRoZQorZmlsZSBzeXN0ZW0gb24gdGhlIG9yaWdpbiBMVi4KKworSWYgdGhlIHNuYXBzaG90IExWIGlzIHdyaXRhYmxlLCBtb3VudGluZyB3aWxsIHJlY292ZXIgdGhlIGxvZyB0byBjbGVhciB0aGUKK2R1bW15IHRyYW5zYWN0aW9uLCBidXQgd2lsbCByZXF1aXJlIHNraXBwaW5nIHRoZSB1dWlkIGNoZWNrOgorCittb3VudCAvZGV2L1ZHL1NuYXBMViAvbW50IFwtbyBub3V1aWQKKworT3IsIHRoZSB1dWlkIGNhbiBiZSBjaGFuZ2VkIG9uIGRpc2sgYmVmb3JlIG1vdW50aW5nOgorCit4ZnNfYWRtaW4gXC1VIGdlbmVyYXRlIC9kZXYvVkcvU25hcExWCisuYnIKK21vdW50IC9kZXYvVkcvU25hcExWIC9tbnQKKworSWYgdGhlIHNuYXBzaG90IExWIGlzIHJlYWRvbmx5LCB0aGUgbG9nIHJlY292ZXJ5IGFuZCB1dWlkIGNoZWNrIG5lZWQgdG8gYmUKK3NraXBwZWQgd2hpbGUgbW91bnRpbmcgcmVhZG9ubHk6CisKK21vdW50IC9kZXYvVkcvU25hcExWIC9tbnQgXC1vIHJvLG5vdXVpZCxub3JlY292ZXJ5CisKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgbHZtLmNvbmYgKDUpLAorLkJSIGx2bWNvbmZpZyAoOCksCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIGx2Y29udmVydCAoOCksCisuQlIgbHZjaGFuZ2UgKDgpLAorLkJSIGx2ZXh0ZW5kICg4KSwKKy5CUiBsdnJlbW92ZSAoOCksCisuQlIgbHZzICg4KSwKKy5CUiB0aGluX2R1bXAgKDgpLAorLkJSIHRoaW5fcmVwYWlyICg4KQorLkJSIHRoaW5fcmVzdG9yZSAoOCkKKwpkaWZmIC0tZ2l0IGEvbWFuL2x2cmVkdWNlLjguaW4gYi9tYW4vbHZyZWR1Y2UuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYwYzkyCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2cmVkdWNlLjguaW4KQEAgLTAsMCArMSwxMTAgQEAKKy5USCBMVlJFRFVDRSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK2x2cmVkdWNlIFwoZW0gcmVkdWNlIHRoZSBzaXplIG9mIGEgbG9naWNhbCB2b2x1bWUKKy5TSCBTWU5PUFNJUworLkIgbHZyZWR1Y2UKKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtdCB8IFwtXC10ZXN0IF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLVwtbm91ZGV2c3luYyBdCisuUkIgeyBcLWwgfCBcLVwtZXh0ZW50cworLlJJIFsgXC0gXSBMb2dpY2FsRXh0ZW50c051bWJlciBbICUgeyBWRyB8IExWIHwgRlJFRSB8IE9SSUdJTiB9XQorLlJCIHwKKy5CUiBcLUwgfCBcLVwtc2l6ZQorLlJJIFsgXC0gXSBMb2dpY2FsVm9sdW1lU2l6ZSBbIGJCc1NrS21NZ0d0VHBQZUUgXX0KKy5SQiBbIFwtbiB8IFwtXC1ub2ZzY2sgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXIgfCBcLVwtcmVzaXplZnMgXQorLklSIExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9CisuU0ggREVTQ1JJUFRJT04KK2x2cmVkdWNlIGFsbG93cyB5b3UgdG8gcmVkdWNlIHRoZSBzaXplIG9mIGEgbG9naWNhbCB2b2x1bWUuCitCZSBjYXJlZnVsIHdoZW4gcmVkdWNpbmcgYSBsb2dpY2FsIHZvbHVtZSdzIHNpemUsIGJlY2F1c2UgZGF0YSBpbiB0aGUKK3JlZHVjZWQgcGFydCBpcyBsb3N0ISEhCisuYnIKK1lvdSBzaG91bGQgdGhlcmVmb3JlIGVuc3VyZSB0aGF0IGFueSBmaWxlc3lzdGVtIG9uIHRoZSB2b2x1bWUgaXMKK3Jlc2l6ZWQKKy5JIGJlZm9yZQorcnVubmluZyBsdnJlZHVjZSBzbyB0aGF0IHRoZSBleHRlbnRzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgYXJlIG5vdCBpbiB1c2UuCisuYnIKK1Nocmlua2luZyBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZXMgKHNlZQorLkJSIGx2Y3JlYXRlICg4KQorZm9yIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBzbmFwc2hvdHMpIGlzIHN1cHBvcnRlZCBhcyB3ZWxsLgorQnV0IHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNvcGllcyBpbiBhIG1pcnJvcmVkIGxvZ2ljYWwKK3ZvbHVtZSB1c2UKKy5CUiBsdmNvbnZlcnQgKDgpLgorLmJyCitTaXplcyB3aWxsIGJlIHJvdW5kZWQgaWYgbmVjZXNzYXJ5IC0gZm9yIGV4YW1wbGUsIHRoZSB2b2x1bWUgc2l6ZSBtdXN0CitiZSBhbiBleGFjdCBudW1iZXIgb2YgZXh0ZW50cyBhbmQgdGhlIHNpemUgb2YgYSBzdHJpcGVkIHNlZ21lbnQgbXVzdAorYmUgYSBtdWx0aXBsZSBvZiB0aGUgbnVtYmVyIG9mIHN0cmlwZXMuCisuYnIKKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtZiAiLCAiIFwtXC1mb3JjZQorRm9yY2Ugc2l6ZSByZWR1Y3Rpb24gd2l0aG91dCBwcm9tcHRpbmcgZXZlbiB3aGVuIGl0IG1heSBjYXVzZSBkYXRhIGxvc3MuCisuVFAKKy5JUiBcZkJcLWwgIiwgIiBcZkJcLVwtZXh0ZW50cyAiIFsiIFwtIF0gTG9naWNhbEV4dGVudHNOdW1iZXIgWyAlIHsgVkcgfCBMViB8IEZSRUUgfCBPUklHSU4gfV0KK1JlZHVjZSBvciBzZXQgdGhlIGxvZ2ljYWwgdm9sdW1lIHNpemUgaW4gdW5pdHMgb2YgbG9naWNhbCBleHRlbnRzLgorV2l0aCB0aGUgXGZJLVxmUCBzaWduIHRoZSB2YWx1ZSB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbQordGhlIGxvZ2ljYWwgdm9sdW1lJ3MgYWN0dWFsIHNpemUgYW5kIHdpdGhvdXQgaXQgdGhlIHZhbHVlIHdpbGwgYmUgdGFrZW4KK2FzIGFuIGFic29sdXRlIHNpemUuCitUaGUgdG90YWwgbnVtYmVyIG9mIHBoeXNpY2FsIGV4dGVudHMgZnJlZWQgd2lsbCBiZSBncmVhdGVyIHRoYW4gdGhpcyBsb2dpY2FsCit2YWx1ZSBpZiwgZm9yIGV4YW1wbGUsIHRoZSB2b2x1bWUgaXMgbWlycm9yZWQuCitUaGUgbnVtYmVyIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHNwYWNlCitpbiB0aGUgVm9sdW1lIEdyb3VwIHdpdGggdGhlIHN1ZmZpeCBcZkklVkdcZlAsIHJlbGF0aXZlIHRvIHRoZSBleGlzdGluZworc2l6ZSBvZiB0aGUgTG9naWNhbCBWb2x1bWUgd2l0aCB0aGUgc3VmZml4IFxmSSVMVlxmUCwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZQorcmVtYWluaW5nIGZyZWUgc3BhY2UgaW4gdGhlIFZvbHVtZSBHcm91cCB3aXRoIHRoZSBzdWZmaXggXGZJJUZSRUVcZlAsIG9yIChmb3IKK2Egc25hcHNob3QpIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgc3BhY2UgaW4gdGhlIE9yaWdpbiBMb2dpY2FsCitWb2x1bWUgd2l0aCB0aGUgc3VmZml4IFxmSSVPUklHSU5cZlAuCitUaGUgcmVzdWx0aW5nIHZhbHVlIGZvciB0aGUgc3VidHJhY3Rpb24gaXMgcm91bmRlZCBkb3dud2FyZCwgZm9yIHRoZSBhYnNvbHV0ZQorc2l6ZSBpdCBpcyByb3VuZGVkIHVwd2FyZC4KK04uQi4gSW4gYSBmdXR1cmUgcmVsZWFzZSwgd2hlbiBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIHdpdGggVkcgb3IgRlJFRSwgdGhlCitudW1iZXIgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFwcHJveGltYXRlIHRvdGFsIG51bWJlciBvZiBwaHlzaWNhbCBleHRlbnRzIHRvIGJlCitmcmVlZCAoaW5jbHVkaW5nIGV4dGVudHMgdXNlZCBieSBhbnkgbWlycm9ycywgZm9yIGV4YW1wbGUpLiAgVGhlIGNvZGUgbWF5CitjdXJyZW50bHkgcmVsZWFzZSBtb3JlIHNwYWNlIHRoYW4geW91IG1pZ2h0IG90aGVyd2lzZSBleHBlY3QuCisuVFAKKy5JUiBcZkJcLUwgIiwgIiBcZkJcLVwtc2l6ZSAiIFsiIFwtIF0gTG9naWNhbFZvbHVtZVNpemUgWyBiQnNTa0ttTWdHdFRwUGVFIF0KK1JlZHVjZSBvciBzZXQgdGhlIGxvZ2ljYWwgdm9sdW1lIHNpemUgaW4gdW5pdHMgb2YgbWVnYWJ5dGVzLgorQSBzaXplIHN1ZmZpeCBvZiBcZklrXGZQIGZvciBraWxvYnl0ZSwgXGZJbVxmUCBmb3IgbWVnYWJ5dGUsCitcZklnXGZQIGZvciBnaWdhYnl0ZXMsIFxmSXRcZlAgZm9yIHRlcmFieXRlcywgXGZJcFxmUCBmb3IgcGV0YWJ5dGVzCitvciBcZkllXGZQIGZvciBleGFieXRlcyBpcyBvcHRpb25hbC4KK1dpdGggdGhlIFxmSVwtXGZQIHNpZ24gdGhlIHZhbHVlIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tCit0aGUgbG9naWNhbCB2b2x1bWUncyBhY3R1YWwgc2l6ZSBhbmQgd2l0aG91dCBpdCBpdCB3aWxsIGJlIHRha2VuIGFzCithbiBhYnNvbHV0ZSBzaXplLgorLlRQCisuQlIgXC1uICIsICIgXC1cLW5vZnNjaworRG8gbm90IHBlcmZvcm0gZnNjayBiZWZvcmUgcmVzaXppbmcgZmlsZXN5c3RlbSB3aGVuIGZpbGVzeXN0ZW0KK3JlcXVpcmVzIGl0LiBZb3UgbWF5IG5lZWQgdG8gdXNlIFxmQlwtXC1mb3JjZVxmUiB0byBwcm9jZWVkIHdpdGgKK3RoaXMgb3B0aW9uLgorLlRQCisuQlIgXC1cLW5vdWRldnN5bmMKK0Rpc2FibGUgdWRldiBzeW5jaHJvbmlzYXRpb24uIFRoZQorcHJvY2VzcyB3aWxsIG5vdCB3YWl0IGZvciBub3RpZmljYXRpb24gZnJvbSB1ZGV2LgorSXQgd2lsbCBjb250aW51ZSBpcnJlc3BlY3RpdmUgb2YgYW55IHBvc3NpYmxlIHVkZXYgcHJvY2Vzc2luZworaW4gdGhlIGJhY2tncm91bmQuICBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgaWYgdWRldiBpcyBub3QgcnVubmluZworb3IgaGFzIHJ1bGVzIHRoYXQgaWdub3JlIHRoZSBkZXZpY2VzIExWTTIgY3JlYXRlcy4KKy5UUAorLkJSIFwtciAiLCAiIFwtXC1yZXNpemVmcworUmVzaXplIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0b2dldGhlciB3aXRoIHRoZSBsb2dpY2FsIHZvbHVtZSB1c2luZworLkJSIGZzYWRtICg4KS4KKy5TSCBFeGFtcGxlcworUmVkdWNlIHRoZSBzaXplIG9mIGxvZ2ljYWwgdm9sdW1lIGx2b2wxIGluIHZvbHVtZSBncm91cCB2ZzAwIGJ5IDMgbG9naWNhbCBleHRlbnRzOgorLnNwCisuQiBsdnJlZHVjZSBcLWwgXC0zIHZnMDAvbHZvbDEKKy5TSCBTRUUgQUxTTworLkJSIGZzYWRtICg4KSwKKy5CUiBsdmNoYW5nZSAoOCksCisuQlIgbHZjb252ZXJ0ICg4KSwKKy5CUiBsdmNyZWF0ZSAoOCksCisuQlIgbHZleHRlbmQgKDgpLAorLkJSIGx2bSAoOCksCisuQlIgbHZyZXNpemUgKDgpLAorLkJSIHZncmVkdWNlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2cmVtb3ZlLjguaW4gYi9tYW4vbHZyZW1vdmUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkzNzVjCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2cmVtb3ZlLjguaW4KQEAgLTAsMCArMSw4MCBAQAorLlRIIExWUkVNT1ZFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZyZW1vdmUgXChlbSByZW1vdmUgYSBsb2dpY2FsIHZvbHVtZQorLlNIIFNZTk9QU0lTCisuQiBsdnJlbW92ZQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLW5vaGlzdG9yeSBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb24gXQorLlJCIFsgXC1mIHwgXC1cLWZvcmNlIF0KKy5SQiBbIFwtXC1ub3VkZXZzeW5jIF0KKy5SSSBbIExvZ2ljYWxWb2x1bWUgeyBOYW1lIHwgUGF0aCB9Li4uXQorLlNIIERFU0NSSVBUSU9OCitsdnJlbW92ZSByZW1vdmVzIG9uZSBvciBtb3JlIGxvZ2ljYWwgdm9sdW1lcy4KK0NvbmZpcm1hdGlvbiB3aWxsIGJlIHJlcXVlc3RlZCBiZWZvcmUgZGVhY3RpdmF0aW5nIGFueSBhY3RpdmUgbG9naWNhbAordm9sdW1lIHByaW9yIHRvIHJlbW92YWwuICBMb2dpY2FsIHZvbHVtZXMgY2Fubm90IGJlIGRlYWN0aXZhdGVkCitvciByZW1vdmVkIHdoaWxlIHRoZXkgYXJlIG9wZW4gKGUuZy4gaWYgdGhleSBjb250YWluIGEgbW91bnRlZCBmaWxlc3lzdGVtKS4KK1JlbW92aW5nIGFuIG9yaWdpbiBsb2dpY2FsIHZvbHVtZSB3aWxsIGFsc28gcmVtb3ZlIGFsbCBkZXBlbmRlbnQgc25hcHNob3RzLgorLnNwCitJZiB0aGUgbG9naWNhbCB2b2x1bWUgaXMgY2x1c3RlcmVkIHRoZW4gaXQgbXVzdCBiZSBkZWFjdGl2YXRlZCBvbiBhbGwKK25vZGVzIGluIHRoZSBjbHVzdGVyIGJlZm9yZSBpdCBjYW4gYmUgcmVtb3ZlZC4gQSBzaW5nbGUgbHZjaGFuZ2UgY29tbWFuZAoraXNzdWVkIGZyb20gb25lIG5vZGUgY2FuIGRvIHRoaXMuCisuc3AKK0lmIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmcgXGZCbWV0YWRhdGEvcmVjb3JkX2x2c19oaXN0b3J5XGZQIGlzIGVuYWJsZWQgCithbmQgdGhlIGxvZ2ljYWwgdm9sdW1lIGJlaW5nIHJlbW92ZWQgZm9ybXMgcGFydCBvZiB0aGUgaGlzdG9yeSBvZiBhdCBsZWFzdAorb25lIGxvZ2ljYWwgdm9sdW1lIHRoYXQgaXMgc3RpbGwgcHJlc2VudCB0aGVuIGEgc2ltcGxpZmllZCByZXByZXNlbnRhdGlvbiBvZgordGhlIGxvZ2ljYWwgdm9sdW1lIHdpbGwgYmUgcmV0YWluZWQuICBUaGlzIGluY2x1ZGVzIHRoZSB0aW1lIG9mIHJlbW92YWwKKyhcZkJsdl90aW1lX3JlbW92ZWRcZlAgcmVwb3J0aW5nIGZpZWxkKSwgY3JlYXRpb24gdGltZSAoXGZCbHZfdGltZVxmUCksIG5hbWUKKyhcZkJsdl9uYW1lXGZQKSwgTFYgdXVpZCAoXGZCbHZfdXVpZFxmUCkgYW5kIFZHIG5hbWUgKFxmQnZnX25hbWVcZlApIGFuZAorYWxsb3dzIHlvdSB0byBzZWUgdGhlIGFuY2VzdHJ5IGNoYWluIG9mIHRoaW4gc25hcHNob3Qgdm9sdW1lcyBldmVuIGFmdGVyCitzb21lIGludGVybWVkaWF0ZSBsb2dpY2FsIHZvbHVtZXMgaGF2ZSBiZWVuIHJlbW92ZWQuCitUaGUgbmFtZXMgb2Ygc3VjaCBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lcyBhY3F1aXJlIGEgaHlwaGVuIGFzIGEgcHJlZml4CisoZS5nLiAnLWx2b2wxJykgYW5kIGNhbm5vdCBiZSByZWFjdGl2YXRlZC4gIFVzZSBsdnJlbW92ZSBhIHNlY29uZCB0aW1lLAord2l0aCB0aGUgaHlwaGVuLCB0byByZW1vdmUgdGhlIHJlY29yZCBvZiB0aGUgZm9ybWVyIGxvZ2ljYWwgdm9sdW1lIGNvbXBsZXRlbHkuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZm9yY2UKK1JlbW92ZSBhY3RpdmUgbG9naWNhbCB2b2x1bWVzIHdpdGhvdXQgY29uZmlybWF0aW9uLgorVG9vbCB3aWxsIHRyeSB0byBkZWFjdGl2YXRlIFxmSXVudXNlZFxmUCB2b2x1bWUuCitUbyBwcm9jZWVkIHdpdGggZGFtYWdlZCBwb29scyB1c2UgXC1mZgorLlRQCisuQiBcLVwtbm9oaXN0b3J5CitEaXNhYmxlIHRoZSByZWNvcmRpbmcgb2YgaGlzdG9yeSBvZiBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggYXJlIGJlaW5nIHJlbW92ZWQuCisoVGhpcyBoYXMgbm8gZWZmZWN0IHVubGVzcyB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5nCitcZkJtZXRhZGF0YS9yZWNvcmRfbHZzX2hpc3RvcnlcZlAgaXMgZW5hYmxlZC4pCisuVFAKKy5CIFwtXC1ub3VkZXZzeW5jCitEaXNhYmxlIHVkZXYgc3luY2hyb25pc2F0aW9uLiBUaGUKK3Byb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9uIGZyb20gdWRldi4KK0l0IHdpbGwgY29udGludWUgaXJyZXNwZWN0aXZlIG9mIGFueSBwb3NzaWJsZSB1ZGV2IHByb2Nlc3NpbmcKK2luIHRoZSBiYWNrZ3JvdW5kLiAgWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcKK29yIGhhcyBydWxlcyB0aGF0IGlnbm9yZSB0aGUgZGV2aWNlcyBMVk0yIGNyZWF0ZXMuCisuU0ggRXhhbXBsZXMKK1JlbW92ZSB0aGUgYWN0aXZlIGxvZ2ljYWwgdm9sdW1lIGx2b2wxIGluIHZvbHVtZSBncm91cCB2ZzAwCit3aXRob3V0IGFza2luZyBmb3IgY29uZmlybWF0aW9uOgorLnNwCisuQiBsdnJlbW92ZSBcLWYgdmcwMC9sdm9sMQorLnNwCitSZW1vdmUgYWxsIGxvZ2ljYWwgdm9sdW1lcyBpbiB2b2x1bWUgZ3JvdXAgdmcwMDoKKy5zcAorLkIgbHZyZW1vdmUgdmcwMAorLlNIIFNFRSBBTFNPCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIGx2ZGlzcGxheSAoOCksCisuQlIgbHZjaGFuZ2UgKDgpLAorLkJSIGx2bSAoOCksCisuQlIgbHZzICg4KSwKKy5CUiBsdnNjYW4gKDgpLAorLkJSIHZncmVtb3ZlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2cmVuYW1lLjguaW4gYi9tYW4vbHZyZW5hbWUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTZlNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2cmVuYW1lLjguaW4KQEAgLTAsMCArMSw1MSBAQAorLlRIIExWUkVOQU1FIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZyZW5hbWUgXChlbSByZW5hbWUgYSBsb2dpY2FsIHZvbHVtZQorLlNIIFNZTk9QU0lTCisuQiBsdnJlbmFtZQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb24gXQorLlJCIFsgXC1mIHwgXC1cLWZvcmNlIF0KKy5SQiBbIFwtXC1ub3VkZXZzeW5jIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJJIHsgT2xkTG9naWNhbFZvbHVtZSB7IE5hbWUgfCBQYXRoIH0KKy5JUiBOZXdMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorfAorLkkgVm9sdW1lR3JvdXBOYW1lIE9sZExvZ2ljYWxWb2x1bWVOYW1lIE5ld0xvZ2ljYWxWb2x1bWVOYW1lXGZSfQorLlNIIERFU0NSSVBUSU9OCitsdnJlbmFtZSByZW5hbWVzIGFuIGV4aXN0aW5nIGxvZ2ljYWwgdm9sdW1lIG9yIGFuIGV4aXN0aW5nCitoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lIGZyb20KKy5JUiBPbGRMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQordG8KKy5JUiBOZXdMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfS4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtXC1ub3VkZXZzeW5jCitEaXNhYmxlIHVkZXYgc3luY2hyb25pc2F0aW9uLiBUaGUKK3Byb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9uIGZyb20gdWRldi4KK0l0IHdpbGwgY29udGludWUgaXJyZXNwZWN0aXZlIG9mIGFueSBwb3NzaWJsZSB1ZGV2IHByb2Nlc3NpbmcKK2luIHRoZSBiYWNrZ3JvdW5kLiAgWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcKK29yIGhhcyBydWxlcyB0aGF0IGlnbm9yZSB0aGUgZGV2aWNlcyBMVk0yIGNyZWF0ZXMuCisuU0ggRVhBTVBMRQorVG8gcmVuYW1lIGx2b2xkIGluIHZvbHVtZSBncm91cCB2ZzAyIHRvIGx2bmV3OgorLnNwCisuQiBsdnJlbmFtZSAvZGV2L3ZnMDIvbHZvbGQgdmcwMi9sdm5ldworLnNwCitBbiBhbHRlcm5hdGUgc3ludGF4IHRvIHJlbmFtZSB0aGlzIGxvZ2ljYWwgdm9sdW1lIGlzOgorLnNwCisuQiBsdnJlbmFtZSB2ZzAyIGx2b2xkIGx2bmV3Cisuc3AKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksIAorLkJSIGx2Y2hhbmdlICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCksIAorLkJSIHZncmVuYW1lICg4KQpkaWZmIC0tZ2l0IGEvbWFuL2x2cmVzaXplLjguaW4gYi9tYW4vbHZyZXNpemUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RiNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2cmVzaXplLjguaW4KQEAgLTAsMCArMSwxMjQgQEAKKy5USCBMVlJFU0laRSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK2x2cmVzaXplIFwoZW0gcmVzaXplIGEgbG9naWNhbCB2b2x1bWUKKy5TSCBTWU5PUFNJUworLkIgbHZyZXNpemUKKy5SQiBbIFwtXC1hbGxvYyAiICIgXGZJQWxsb2NhdGlvblBvbGljeSBdCisuUkIgWyBcLVwtbm91ZGV2c3luYyBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWkgfCBcLVwtc3RyaXBlcyAiICIgXGZJU3RyaXBlcworLlJCIFsgXC1JIHwgXC1cLXN0cmlwZXNpemUgIiAiIFxmSVN0cmlwZVNpemUgXV0KKy5SQiB7IFwtbCB8IFwtXC1leHRlbnRzCisuUkkgWyArIHwgXC0gXSBMb2dpY2FsRXh0ZW50c051bWJlciBbICUgeyBWRyB8IExWIHwgUFZTIHwgRlJFRSB8IE9SSUdJTiAifV0gfCIKKy5CUiBcLUwgfCBcLVwtc2l6ZQorLlJJIFsgKyB8IFwtIF0gTG9naWNhbFZvbHVtZVNpemUgWyBiQnNTa0ttTWdHdFRwUGVFIF19CisuUkIgWyBcLVwtcG9vbG1ldGFkYXRhc2l6ZQorLlJJIFsgKyBdIE1ldGFkYXRhVm9sdW1lU2l6ZSBbIGJCc1NrS21NZ0cgXV0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLW4gfCBcLVwtbm9mc2NrIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1yIHwgXC1cLXJlc2l6ZWZzIF0KKy5JUiBMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLlJJIFsgUGh5c2ljYWxWb2x1bWVQYXRoIFsgOlBFIFsgXC1QRSBdXS4uLl0KKy5TSCBERVNDUklQVElPTgorbHZyZXNpemUgYWxsb3dzIHlvdSB0byByZXNpemUgYSBsb2dpY2FsIHZvbHVtZS4KK0JlIGNhcmVmdWwgd2hlbiByZWR1Y2luZyBhIGxvZ2ljYWwgdm9sdW1lJ3Mgc2l6ZSwgYmVjYXVzZSBkYXRhIGluIHRoZSByZWR1Y2VkCitwYXJ0IGlzIGxvc3QhISEKK1lvdSBzaG91bGQgdGhlcmVmb3JlIGVuc3VyZSB0aGF0IGFueSBmaWxlc3lzdGVtIG9uIHRoZSB2b2x1bWUgaXMKK3NocnVuayBmaXJzdCBzbyB0aGF0IHRoZSBleHRlbnRzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgYXJlIG5vdCBpbiB1c2UuCitSZXNpemluZyBzbmFwc2hvdCBsb2dpY2FsIHZvbHVtZXMgKHNlZQorLkJSIGx2Y3JlYXRlICg4KQorZm9yIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIHNuYXBzaG90cykgaXMgc3VwcG9ydGVkIGFzIHdlbGwuCitCdXQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgY29waWVzIGluIGEgbWlycm9yZWQgbG9naWNhbAordm9sdW1lIHVzZQorLkJSIGx2Y29udmVydCAoOCkuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZm9yY2UKK0ZvcmNlIHJlc2l6ZSB3aXRob3V0IHByb21wdGluZyBldmVuIHdoZW4gaXQgbWF5IGNhdXNlIGRhdGEgbG9zcy4KKy5UUAorLkJSIFwtbiAiLCAiIFwtXC1ub2ZzY2sKK0RvIG5vdCBwZXJmb3JtIGZzY2sgYmVmb3JlIHJlc2l6aW5nIGZpbGVzeXN0ZW0gd2hlbiBmaWxlc3lzdGVtCityZXF1aXJlcyBpdC4gWW91IG1heSBuZWVkIHRvIHVzZSBcZkJcLVwtZm9yY2VcZlIgdG8gcHJvY2VlZCB3aXRoCit0aGlzIG9wdGlvbi4KKy5UUAorLkJSIFwtciAiLCAiIFwtXC1yZXNpemVmcworUmVzaXplIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0b2dldGhlciB3aXRoIHRoZSBsb2dpY2FsIHZvbHVtZSB1c2luZworXGZCZnNhZG1cZlIoOCkuCisuVFAKKy5JUiBcZkJcLWwgIiwgIiBcZkJcLVwtZXh0ZW50cyAiIFsiICsgfCBcLSBdIExvZ2ljYWxFeHRlbnRzTnVtYmVyIFsgJSB7IFZHIHwgTFYgfCBQVlMgfCBGUkVFIHwgT1JJR0lOIH1dCitDaGFuZ2Ugb3Igc2V0IHRoZSBsb2dpY2FsIHZvbHVtZSBzaXplIGluIHVuaXRzIG9mIGxvZ2ljYWwgZXh0ZW50cy4KK1dpdGggdGhlIFxmSStcZlAgb3IgXGZJXC1cZlAgc2lnbiB0aGUgdmFsdWUgaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBhY3R1YWwgc2l6ZQorb2YgdGhlIGxvZ2ljYWwgdm9sdW1lIGFuZCB3aXRob3V0IGl0LCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgYW4gYWJzb2x1dGUgb25lLgorVGhlIHRvdGFsIG51bWJlciBvZiBwaHlzaWNhbCBleHRlbnRzIGFmZmVjdGVkIHdpbGwgYmUKK2dyZWF0ZXIgdGhhbiB0aGlzIGlmLCBmb3IgZXhhbXBsZSwgdGhlIHZvbHVtZSBpcyBtaXJyb3JlZC4KK1RoZSBudW1iZXIgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgc3BhY2UKK2luIHRoZSBWb2x1bWUgR3JvdXAgd2l0aCB0aGUgc3VmZml4IFxmSSVWR1xmUCwgcmVsYXRpdmUgdG8gdGhlIGV4aXN0aW5nCitzaXplIG9mIHRoZSBMb2dpY2FsIFZvbHVtZSB3aXRoIHRoZSBzdWZmaXggXGZJJUxWXGZQLCBhcyBhIHBlcmNlbnRhZ2Ugb2YKK3RoZSByZW1haW5pbmcgZnJlZSBzcGFjZSBvZiB0aGUgUGh5c2ljYWxWb2x1bWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUKK3N1ZmZpeCBcZkklUFZTXGZQLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlIGluIHRoZQorVm9sdW1lIEdyb3VwIHdpdGggdGhlIHN1ZmZpeCBcZkklRlJFRVxmUCwgb3IgKGZvciBhIHNuYXBzaG90KSBhcyBhIHBlcmNlbnRhZ2UKK29mIHRoZSB0b3RhbCBzcGFjZSBpbiB0aGUgT3JpZ2luIExvZ2ljYWwgVm9sdW1lIHdpdGggdGhlIHN1ZmZpeCBcZkklT1JJR0lOXGZQLgorVGhlIHJlc3VsdGluZyB2YWx1ZSBpcyByb3VuZGVkIGRvd253YXJkIGZvciB0aGUgc3VidHJhY3Rpb24gb3RoZXJ3aXNlCitpdCBpcyByb3VuZGVkIHVwd2FyZC4KK04uQi4gSW4gYSBmdXR1cmUgcmVsZWFzZSwgd2hlbiBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlIHdpdGggUFZTLCBWRyBvciBGUkVFLAordGhlIG51bWJlciB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gYXBwcm94aW1hdGUgdG90YWwgbnVtYmVyIG9mIHBoeXNpY2FsIGV4dGVudHMKK3RvIGJlIGFsbG9jYXRlZCBvciBmcmVlZCAoaW5jbHVkaW5nIGV4dGVudHMgdXNlZCBieSBhbnkgbWlycm9ycywgZm9yIGV4YW1wbGUpLgorVGhlIGNvZGUgbWF5IGN1cnJlbnRseSBhbGxvY2F0ZSBvciByZW1vdmUgbW9yZSBzcGFjZSB0aGFuIHlvdSBtaWdodCBvdGhlcndpc2UKK2V4cGVjdC4KKy5UUAorLklSIFxmQlwtTCAiLCAiIFxmQlwtXC1zaXplICIgWyIgKyB8IFwtIF0gTG9naWNhbFZvbHVtZVNpemUgWyBiQnNTa0ttTWdHdFRwUGVFIF0KK0NoYW5nZSBvciBzZXQgdGhlIGxvZ2ljYWwgdm9sdW1lIHNpemUgaW4gdW5pdHMgb2YgbWVnYWJ5dGVzLgorQSBzaXplIHN1ZmZpeCBvZiBcZklNXGZQIGZvciBtZWdhYnl0ZXMsCitcZklHXGZQIGZvciBnaWdhYnl0ZXMsIFxmSVRcZlAgZm9yIHRlcmFieXRlcywgXGZJUFxmUCBmb3IgcGV0YWJ5dGVzCitvciBcZklFXGZQIGZvciBleGFieXRlcyBpcyBvcHRpb25hbC4KK1dpdGggdGhlIFxmSStcZlAgb3IgXGZJXC1cZlAgc2lnbiB0aGUgdmFsdWUgaXMgYWRkZWQgb3Igc3VidHJhY3RlZAorZnJvbSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lIGFuZCByb3VuZGVkCit0byB0aGUgZnVsbCBleHRlbnQgc2l6ZSBhbmQgd2l0aG91dCBpdCwKK3RoZSB2YWx1ZSBpcyB0YWtlbiBhcyBhbiBhYnNvbHV0ZSBvbmUuCisuVFAKKy5CUiBcLWkgIiwgIiBcLVwtc3RyaXBlcyAiICIgXGZJU3RyaXBlcworR2l2ZXMgdGhlIG51bWJlciBvZiBzdHJpcGVzIHRvIHVzZSB3aGVuIGV4dGVuZGluZyBhIExvZ2ljYWwgVm9sdW1lLgorRGVmYXVsdHMgdG8gd2hhdGV2ZXIgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgTG9naWNhbCBWb2x1bWUgdXNlcy4KK05vdCBhcHBsaWNhYmxlIHRvIExWcyB1c2luZyB0aGUgb3JpZ2luYWwgbWV0YWRhdGEgTFZNIGZvcm1hdCwgd2hpY2ggbXVzdAordXNlIGEgc2luZ2xlIHZhbHVlIHRocm91Z2hvdXQuCisuVFAKKy5JUiBcZkJcLVwtcG9vbG1ldGFkYXRhc2l6ZSAiIFsiICsgXSBNZXRhZGF0YVZvbHVtZVNpemUgWyBiQnNTa0ttTWdHIF0KK0NoYW5nZSBvciBzZXQgdGhlIHRoaW4gcG9vbCBtZXRhZGF0YSBsb2dpY2FsIHZvbHVtZSBzaXplLgorV2l0aCB0aGUgXGZJK1xmUCBzaWduIHRoZSB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgYWN0dWFsIHNpemUKK29mIHRoZSBtZXRhZGF0YSB2b2x1bWUgYW5kIHJvdW5kZWQgdG8gdGhlIGZ1bGwgZXh0ZW50IHNpemUKK2FuZCB3aXRob3V0IGl0LCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgYW4gYWJzb2x1dGUgb25lLgorTWF4aW1hbCBzaXplIGlzIDE2R2lCLiBEZWZhdWx0IHVuaXQgaXMgbWVnYWJ5dGVzLgorLlRQCisuQlIgXC1JICIsICIgXC1cLXN0cmlwZXNpemUgIiAiIFxmSVN0cmlwZVNpemUKK0dpdmVzIHRoZSBudW1iZXIgb2Yga2lsb2J5dGVzIGZvciB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHN0cmlwZXMuCitEZWZhdWx0cyB0byB3aGF0ZXZlciB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBMb2dpY2FsIFZvbHVtZSB1c2VzLgorTm90IGFwcGxpY2FibGUgdG8gTFZzIHVzaW5nIHRoZSBvcmlnaW5hbCBtZXRhZGF0YSBMVk0gZm9ybWF0LCB3aGljaAorbXVzdCB1c2UgYSBzaW5nbGUgdmFsdWUgdGhyb3VnaG91dC4KKy5icgorU3RyaXBlU2l6ZSBtdXN0IGJlIDJebiAobiA9IDIgdG8gOSkgZm9yIG1ldGFkYXRhIGluIExWTTEgZm9ybWF0LgorRm9yIG1ldGFkYXRhIGluIExWTTIgZm9ybWF0LCB0aGUgc3RyaXBlIHNpemUgbWF5IGJlIGEgbGFyZ2VyCitwb3dlciBvZiAyIGJ1dCBtdXN0IG5vdCBleGNlZWQgdGhlIHBoeXNpY2FsIGV4dGVudCBzaXplLgorLlRQCisuQiBcLVwtbm91ZGV2c3luYworRGlzYWJsZSB1ZGV2IHN5bmNocm9uaXNhdGlvbi4gVGhlCitwcm9jZXNzIHdpbGwgbm90IHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBmcm9tIHVkZXYuCitJdCB3aWxsIGNvbnRpbnVlIGlycmVzcGVjdGl2ZSBvZiBhbnkgcG9zc2libGUgdWRldiBwcm9jZXNzaW5nCitpbiB0aGUgYmFja2dyb3VuZC4gIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyBpZiB1ZGV2IGlzIG5vdCBydW5uaW5nCitvciBoYXMgcnVsZXMgdGhhdCBpZ25vcmUgdGhlIGRldmljZXMgTFZNMiBjcmVhdGVzLgorLlNIIEVYQU1QTEVTCisuYnIKK0V4dGVuZCBhIGxvZ2ljYWwgdm9sdW1lIHZnMS9sdjEgYnkgMTZNQiB1c2luZyBwaHlzaWNhbCBleHRlbnRzCisvZGV2L3NkYTowXC0xIGFuZCAvZGV2L3NkYjowXC0xIGZvciBhbGxvY2F0aW9uIG9mIGV4dGVudHM6Cisuc3AKKy5CIGx2cmVzaXplIFwtTCsxNk0gdmcxL2x2MSAvZGV2L3NkYTowXC0xIC9kZXYvc2RiOjBcLTEKKy5TSCBTRUUgQUxTTworLkJSIGZzYWRtICg4KSwKKy5CUiBsdm0gKDgpLAorLkJSIGx2Y29udmVydCAoOCksCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIGx2cmVkdWNlICg4KSwKKy5CUiBsdmNoYW5nZSAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdnMuOC5pbiBiL21hbi9sdnMuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2IyZDJiCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2cy44LmluCkBAIC0wLDAgKzEsMjkwIEBACisuVEggTFZTIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorbHZzIFwoZW0gcmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGxvZ2ljYWwgdm9sdW1lcworLlNIIFNZTk9QU0lTCisuQiBsdnMKKy5SQiBbIFwtXC1hbGlnbmVkIF0KKy5SQiBbIFwtXC1iaW5hcnkgXQorLlJCIFsgXC1hIHwgXC1cLWFsbCBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgW1sgXC1cLWNvbmZpZ3JlcG9ydAorLklSIFJlcG9ydE5hbWUgXQorLlJCIFsgXC1vIHwgXC1cLW9wdGlvbnMKKy5SSSBbICsgfCBcLSB8ICMgXSBGaWVsZDEgWywgRmllbGQyIC4uLl0KKy5SQiBbIFwtTyB8IFwtXC1zb3J0CisuUkkgWyArIHwgXC0gXSBLZXkxIFssIEtleTIgLi4uXV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIC4uLl0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLUggfCBcLVwtaGlzdG9yeSBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyIF0KKy5SQiBbIFwtXC1sb2dvbmx5IF0KKy5SQiBbIFwtXC1uYW1lcHJlZml4ZXMgXQorLlJCIFsgXC1cLW5vaGVhZGluZ3MgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SSSBbICsgfCBcLSBdIEtleTEgWyxbICsgfCBcLSBdIEtleTIgWywuLi5dXV0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXJvd3MgXQorLlJCIFsgXC1cLXNlcGFyYXRvcgorLklSIFNlcGFyYXRvciBdCisuUkIgWyBcLVwtc2VnbWVudHMgXQorLlJCIFsgXC1cLXVuYnVmZmVyZWQgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtXC11bnF1b3RlZCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkkgWyBWb2x1bWVHcm91cE5hbWUgfCBMb2dpY2FsVm9sdW1lIHsgTmFtZSB8IFBhdGggfQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIHwgTG9naWNhbFZvbHVtZSB7IE5hbWUgfCBQYXRoIH1cIC4uLl1dCisKKy5TSCBERVNDUklQVElPTgorbHZzIHByb2R1Y2VzIGZvcm1hdHRlZCBvdXRwdXQgYWJvdXQgbG9naWNhbCB2b2x1bWVzLgorLlNIIE9QVElPTlMKK1NlZQorLkJSIGx2bSAoOCkKK2ZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkIgXC1cLWFsaWduZWQKK1VzZSB3aXRoIFxmQlwtXC1zZXBhcmF0b3JcZlAgdG8gYWxpZ24gdGhlIG91dHB1dCBjb2x1bW5zLgorLlRQCisuQiBcLVwtYWxsCitJbmNsdWRlIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgYWJvdXQgaW50ZXJuYWwgTG9naWNhbCBWb2x1bWVzIHRoYXQKK2FyZSBjb21wb25lbnRzIG9mIG5vcm1hbGx5LWFjY2Vzc2libGUgTG9naWNhbCBWb2x1bWVzLCBzdWNoIGFzIG1pcnJvcnMsCitidXQgd2hpY2ggYXJlIG5vdCBpbmRlcGVuZGVudGx5IGFjY2Vzc2libGUgKGUuZy4gbm90IG1vdW50YWJsZSkuCitUaGUgbmFtZXMgb2Ygc3VjaCBMb2dpY2FsIFZvbHVtZXMgYXJlIGVuY2xvc2VkIHdpdGhpbiBzcXVhcmUgYnJhY2tldHMKK2luIHRoZSBvdXRwdXQuICBGb3IgZXhhbXBsZSwgYWZ0ZXIgY3JlYXRpbmcgYSBtaXJyb3IgdXNpbmcKKy5CIGx2Y3JlYXRlIC1tMSBcLVwtbWlycm9ybG9nIGRpc2sKKywgdGhpcyBvcHRpb24gd2lsbCByZXZlYWwgdGhyZWUgaW50ZXJuYWwgTG9naWNhbAorVm9sdW1lcywgd2l0aCBzdWZmaXhlcyBtaW1hZ2VfMCwgbWltYWdlXzEsIGFuZCBtbG9nLgorLlRQCisuQiBcLVwtYmluYXJ5CitVc2UgYmluYXJ5IHZhbHVlcyAiMCIgb3IgIjEiIGluc3RlYWQgb2YgZGVzY3JpcHRpdmUgbGl0ZXJhbCB2YWx1ZXMKK2ZvciBjb2x1bW5zIHRoYXQgaGF2ZSBleGFjdGx5IHR3byB2YWxpZCB2YWx1ZXMgdG8gcmVwb3J0IChub3QgY291bnRpbmcKK3RoZSAidW5rbm93biIgdmFsdWUgd2hpY2ggZGVub3RlcyB0aGF0IHRoZSB2YWx1ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCkuCisuVFAKKy5CIFwtXC1jb25maWdyZXBvcnQgIFxmSSBSZXBvcnROYW1lCitNYWtlIGFueSBzdWJzZXF1ZW50IFxmQlwtbywgXC1cLW9wdGlvbnNcZlAsIFxmQlwtTywgXC1cLXNvcnRcZlAgb3IKK1xmQlwtUywgXC1cLXNlbGVjdFxmUCB0byBhcHBseSBmb3IgXGZJUmVwb3J0TmFtZVxmUCB3aGVyZSBcZklSZXBvcnROYW1lXGZQCitpcyBlaXRoZXIgJ2x2cycgZm9yIGNvbW1hbmQncyBtYWluIHJlcG9ydCBvciAnbG9nJyBmb3IgbG9nIHJlcG9ydC4KK0lmIFxmQlwtXC1jb25maWdyZXBvcnRcZlAgb3B0aW9uIGlzIG5vdCB1c2VkIHRvIGlkZW50aWZ5IGEgcmVwb3J0LCB0aGVuCitjb21tYW5kJ3MgbWFpbiByZXBvcnQgaXMgYXNzdW1lZC4gVGhlIGxvZyByZXBvcnQgaXMgYXZhaWxhYmxlIG9ubHkgaWYKK2VuYWJsZWQgYnkgXGZCbG9nL3JlcG9ydF9jb21tYW5kX2xvZ1xmUCBcZkJsdm0uY29uZlxmUCg1KSBzZXR0aW5nIG9yCitpZiBcZkJcLVwtbG9nb25seVxmUCBvcHRpb24gaXMgdXNlZC4KKy5UUAorLkIgXC1IICIsICIgXC1cLWhpc3RvcnkKK0luY2x1ZGUgaGlzdG9yaWNhbCBsb2dpY2FsIHZvbHVtZXMgaW4gdGhlIG91dHB1dC4KKyhUaGlzIGhhcyBubyBlZmZlY3QgdW5sZXNzIGxvZ2ljYWwgdm9sdW1lcyB3ZXJlIHJlbW92ZWQgd2hpbGUgdGhlIGNvbmZpZ3VyYXRpb24KK3NldHRpbmcgXGZCbWV0YWRhdGEvcmVjb3JkX2x2c19oaXN0b3J5XGZQIHdhcyBlbmFibGVkLikKKy5UUAorLkIgXC1cLWxvZ29ubHkKK1N1cHByZXNzIHRoZSBsdnMgcmVwb3J0IGl0c2VsZiBhbmQgZGlzcGxheSBvbmx5IGxvZyByZXBvcnQgb24gb3V0cHV0LgorLlRQCisuQiBcLVwtbmFtZXByZWZpeGVzCitBZGQgYW4gIkxWTTJfIiBwcmVmaXggcGx1cyB0aGUgZmllbGQgbmFtZSB0byB0aGUgb3V0cHV0LiAgVXNlZnVsCit3aXRoIFxmQlwtXC1ub2hlYWRpbmdzXGZQIHRvIHByb2R1Y2UgYSBsaXN0IG9mIGZpZWxkPXZhbHVlIHBhaXJzIHRoYXQgY2FuCitiZSB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZvciBleGFtcGxlLCBpbgorLkJSIHVkZXYgKDcpCitydWxlcykuCisuVFAKKy5CIFwtXC1ub2hlYWRpbmdzCitTdXBwcmVzcyB0aGUgaGVhZGluZ3MgbGluZSB0aGF0IGlzIG5vcm1hbGx5IHRoZSBmaXJzdCBsaW5lIG9mIG91dHB1dC4KK1VzZWZ1bCBpZiBncmVwcGluZyB0aGUgb3V0cHV0LgorLlRQCisuQiBcLVwtbm9zdWZmaXgKK1N1cHByZXNzIHRoZSBzdWZmaXggb24gb3V0cHV0IHNpemVzLiAgVXNlIHdpdGggXGZCXC1cLXVuaXRzXGZQCisoZXhjZXB0IGggYW5kIEgpIGlmIHByb2Nlc3NpbmcgdGhlIG91dHB1dC4KKy5UUAorLkJSIFwtbyAiLCAiIFwtXC1vcHRpb25zCitDb21tYS1zZXBhcmF0ZWQgb3JkZXJlZCBsaXN0IG9mIGNvbHVtbnMuCisuSVAKK1ByZWNlZGUgdGhlIGxpc3Qgd2l0aCAnXGZJK1xmUCcgdG8gYXBwZW5kIHRvIHRoZSBjdXJyZW50IGxpc3QKK29mIGNvbHVtbnMsICdcZkktXGZQJyB0byByZW1vdmUgZnJvbSB0aGUgY3VycmVudCBsaXN0IG9mIGNvbHVtbnMKK29yICdcZkkjXGZQJyB0byBjb21wYWN0IGdpdmVuIGNvbHVtbnMuIFRoZSBcZklcLW9cZlAgb3B0aW9uIGNhbgorYmUgcmVwZWF0ZWQsIHByb3ZpZGluZyBzZXZlcmFsIGxpc3RzLiBUaGVzZSBsaXN0cyBhcmUgZXZhbHVhdGVkCitmcm9tIGxlZnQgdG8gcmlnaHQuCisuSVAKK1VzZSBcZkJcLW8gbHZfYWxsXGZQIHRvIHNlbGVjdCBhbGwgbG9naWNhbCB2b2x1bWUgY29sdW1ucywKK2FuZCBcZkJcLW8gc2VnX2FsbFxmUAordG8gc2VsZWN0IGFsbCBsb2dpY2FsIHZvbHVtZSBzZWdtZW50IGNvbHVtbnMuCisuSVAKK1VzZSBcZkJcLW8gaGVscFxmUCB0byB2aWV3IHRoZSBmdWxsIGxpc3Qgb2YgY29sdW1ucyBhdmFpbGFibGUuCisuSVAKK0NvbHVtbiBuYW1lcyBpbmNsdWRlOgorY2h1bmtfc2l6ZSwKK2NvbnZlcnRfbHYsCitjb3B5X3BlcmNlbnQsCitkYXRhX2x2LAorZGV2aWNlcywKK2Rpc2NhcmRzLAorbHZfYXR0ciwKK2x2X2hvc3QsCitsdl9rZXJuZWxfbWFqb3IsCitsdl9rZXJuZWxfbWlub3IsCitsdl9rZXJuZWxfcmVhZF9haGVhZCwKK2x2X21ham9yLAorbHZfbWlub3IsCitsdl9uYW1lLAorbHZfcGF0aCwKK2x2X3Byb2ZpbGUsCitsdl9yZWFkX2FoZWFkLAorbHZfc2l6ZSwKK2x2X3RhZ3MsCitsdl90aW1lLAorbHZfdXVpZCwKK21ldGFkYXRhX2x2LAorbWlycm9yX2xvZywKK21vZHVsZXMsCittb3ZlX3B2LAorb3JpZ2luLAorb3JpZ2luX3NpemUsCitwb29sX2x2LAorcmFpZF9tYXhfcmVjb3ZlcnlfcmF0ZSwKK3JhaWRfbWluX3JlY292ZXJ5X3JhdGUsCityYWlkX21pc21hdGNoX2NvdW50LAorcmFpZF9zeW5jX2FjdGlvbiwKK3JhaWRfd3JpdGVfYmVoaW5kLAorcmVnaW9uX3NpemUsCitzZWd0eXBlLAorc2VnX2NvdW50LAorc2VnX3BlX3JhbmdlcywKK3NlZ19zaXplLAorc2VnX3NpemVfcGUsCitzZWdfc3RhcnQsCitzZWdfc3RhcnRfcGUsCitzZWdfdGFncywKK3NuYXBfcGVyY2VudCwKK3N0cmlwZXMsCitzdHJpcGVfc2l6ZSwKK3N5bmNfcGVyY2VudCwKK3RoaW5fY291bnQsCit0cmFuc2FjdGlvbl9pZCwKK3plcm8uCisuSVAKK1dpdGggXGZCXC1cLXNlZ21lbnRzXGZQLCBhbnkgInNlZ18iIHByZWZpeGVzIGFyZSBvcHRpb25hbDsKK290aGVyd2lzZSBhbnkgImx2XyIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsLiBDb2x1bW5zIG1lbnRpb25lZCBpbgorLkJSIHZncyAoOCkKK2NhbiBhbHNvIGJlIGNob3Nlbi4KKy5JUAorVGhlIGx2X2F0dHIgYml0cyBhcmU6CisuUlMKKy5JUCAxIDMKK1ZvbHVtZSB0eXBlOiAoQylhY2hlLCAobSlpcnJvcmVkLCAoTSlpcnJvcmVkIHdpdGhvdXQgaW5pdGlhbCBzeW5jLCAobylyaWdpbiwKKyhPKXJpZ2luIHdpdGggbWVyZ2luZyBzbmFwc2hvdCwgKHIpYWlkLCAoUilhaWQgd2l0aG91dCBpbml0aWFsIHN5bmMsCisocyluYXBzaG90LCBtZXJnaW5nIChTKW5hcHNob3QsIChwKXZtb3ZlLCAodilpcnR1YWwsCittaXJyb3Igb3IgcmFpZCAoaSltYWdlLCBtaXJyb3Igb3IgcmFpZCAoSSltYWdlIG91dC1vZi1zeW5jLCBtaXJyb3IgKGwpb2cgZGV2aWNlLAordW5kZXIgKGMpb252ZXJzaW9uLCB0aGluIChWKW9sdW1lLCAodCloaW4gcG9vbCwgKFQpaGluIHBvb2wgZGF0YSwgcmFpZCBvcgorcG9vbCBtKGUpdGFkYXRhIG9yIHBvb2wgbWV0YWRhdGEgc3BhcmUuCisuSVAgMiAzCitQZXJtaXNzaW9uczogKHcpcml0ZWFibGUsIChyKWVhZC1vbmx5LCAoUillYWQtb25seSBhY3RpdmF0aW9uIG9mIG5vbi1yZWFkLW9ubHkKK3ZvbHVtZQorLklQIDMgMworQWxsb2NhdGlvbiBwb2xpY3k6ICAoYSlueXdoZXJlLCAoYylvbnRpZ3VvdXMsIChpKW5oZXJpdGVkLCBjKGwpaW5nLCAobilvcm1hbAorVGhpcyBpcyBjYXBpdGFsaXNlZCBpZiB0aGUgdm9sdW1lIGlzIGN1cnJlbnRseSBsb2NrZWQgYWdhaW5zdCBhbGxvY2F0aW9uCitjaGFuZ2VzLCBmb3IgZXhhbXBsZSBkdXJpbmcKKy5CUiBwdm1vdmUgKDgpLgorLklQIDQgMworZml4ZWQgKG0paW5vcgorLklQIDUgMworU3RhdGU6IChhKWN0aXZlLCAoaClpc3RvcmljYWwsIChzKXVzcGVuZGVkLCAoSSludmFsaWQgc25hcHNob3QsCitpbnZhbGlkIChTKXVzcGVuZGVkIHNuYXBzaG90LCBzbmFwc2hvdCAobSllcmdlIGZhaWxlZCwKK3N1c3BlbmRlZCBzbmFwc2hvdCAoTSllcmdlIGZhaWxlZCwgbWFwcGVkIChkKWV2aWNlIHByZXNlbnQgd2l0aG91dCB0YWJsZXMsCittYXBwZWQgZGV2aWNlIHByZXNlbnQgd2l0aCAoaSluYWN0aXZlIHRhYmxlLCB0aGluLXBvb2wgKGMpaGVjayBuZWVkZWQsCitzdXNwZW5kZWQgdGhpbi1wb29sIChDKWhlY2sgbmVlZGVkLCAoWCkgdW5rbm93bgorLklQIDYgMworZGV2aWNlIChvKXBlbiwgKFgpIHVua25vd24KKy5JUCA3IDMKK1RhcmdldCB0eXBlOiAoQylhY2hlLCAobSlpcnJvciwgKHIpYWlkLCAocyluYXBzaG90LCAodCloaW4sICh1KW5rbm93biwgKHYpaXJ0dWFsLgorVGhpcyBncm91cHMgbG9naWNhbCB2b2x1bWVzIHJlbGF0ZWQgdG8gdGhlIHNhbWUga2VybmVsIHRhcmdldCB0b2dldGhlci4gIFNvLAorZm9yIGV4YW1wbGUsIG1pcnJvciBpbWFnZXMsIG1pcnJvciBsb2dzIGFzIHdlbGwgYXMgbWlycm9ycyB0aGVtc2VsdmVzIGFwcGVhciBhcworKG0pIGlmIHRoZXkgdXNlIHRoZSBvcmlnaW5hbCBkZXZpY2UtbWFwcGVyIG1pcnJvciBrZXJuZWwgZHJpdmVyOyB3aGVyZWFzIHRoZSByYWlkCitlcXVpdmFsZW50cyB1c2luZyB0aGUgbWQgcmFpZCBrZXJuZWwgZHJpdmVyIGFsbCBhcHBlYXIgYXMgKHIpLgorU25hcHNob3RzIHVzaW5nIHRoZSBvcmlnaW5hbCBkZXZpY2UtbWFwcGVyIGRyaXZlciBhcHBlYXIgYXMgKHMpOyB3aGVyZWFzCitzbmFwc2hvdHMgb2YgdGhpbiB2b2x1bWVzIHVzaW5nIHRoZSBuZXcgdGhpbiBwcm92aXNpb25pbmcgZHJpdmVyIGFwcGVhciBhcyAodCkuCisuSVAgOCAzCitOZXdseS1hbGxvY2F0ZWQgZGF0YSBibG9ja3MgYXJlIG92ZXJ3cml0dGVuIHdpdGggYmxvY2tzIG9mICh6KWVyb2VzIGJlZm9yZSB1c2UuCisuSVAgOSAzCitWb2x1bWUgSGVhbHRoLCB3aGVyZSB0aGVyZSBhcmUgY3VycmVudGx5IHRocmVlIGdyb3VwcyBvZiBhdHRyaWJ1dGVzIGlkZW50aWZpZWQ6CisuSVAKK0NvbW1vbiBvbmVzIGZvciBhbGwgTG9naWNhbCBWb2x1bWVzOiAocClhcnRpYWwsIChYKSB1bmtub3duLgorLmJyCisocClhcnRpYWwgc2lnbmlmaWVzIHRoYXQgb25lIG9yIG1vcmUgb2YgdGhlIFBoeXNpY2FsIFZvbHVtZXMgdGhpcyBMb2dpY2FsCitWb2x1bWUgdXNlcyBpcyBtaXNzaW5nIGZyb20gdGhlIHN5c3RlbS4gKFgpIHVua25vd24gc2lnbmlmaWVzIHRoZSBzdGF0dXMKK2lzIHVua25vd24uCisuSVAKK1JlbGF0ZWQgdG8gUkFJRCBMb2dpY2FsIFZvbHVtZXM6IChyKWVmcmVzaCBuZWVkZWQsIChtKWlzbWF0Y2hlcyBleGlzdCwgKHcpcml0ZW1vc3RseS4KKy5icgorKHIpZWZyZXNoIHNpZ25pZmllcyB0aGF0IG9uZSBvciBtb3JlIG9mIHRoZSBQaHlzaWNhbCBWb2x1bWVzIHRoaXMgUkFJRCBMb2dpY2FsCitWb2x1bWUgdXNlcyBoYWQgc3VmZmVyZWQgYSB3cml0ZSBlcnJvci4gVGhlIHdyaXRlIGVycm9yIGNvdWxkIGJlIGR1ZSB0byBhCit0ZW1wb3JhcnkgZmFpbHVyZSBvZiB0aGF0IFBoeXNpY2FsIFZvbHVtZSBvciBhbiBpbmRpY2F0aW9uIHRoYXQgaXQgaXMgZmFpbGluZy4KK1RoZSBkZXZpY2Ugc2hvdWxkIGJlIHJlZnJlc2hlZCBvciByZXBsYWNlZC4gKG0paXNtYXRjaGVzIHNpZ25pZmllcyB0aGF0IHRoZQorUkFJRCBsb2dpY2FsIHZvbHVtZSBoYXMgcG9ydGlvbnMgb2YgdGhlIGFycmF5IHRoYXQgYXJlIG5vdCBjb2hlcmVudC4KK0luY29uc2lzdGVuY2llcyBhcmUgZGV0ZWN0ZWQgYnkgaW5pdGlhdGluZyBhICJjaGVjayIgb24gYSBSQUlEIGxvZ2ljYWwgdm9sdW1lLgorKFRoZSBzY3J1YmJpbmcgb3BlcmF0aW9ucywgImNoZWNrIiBhbmQgInJlcGFpciIsIGNhbiBiZSBwZXJmb3JtZWQgb24gYSBSQUlECitsb2dpY2FsIHZvbHVtZSB2aWEgdGhlICdsdmNoYW5nZScgY29tbWFuZC4pICAodylyaXRlbW9zdGx5IHNpZ25pZmllcyB0aGUKK2RldmljZXMgaW4gYSBSQUlEIDEgbG9naWNhbCB2b2x1bWUgdGhhdCBoYXZlIGJlZW4gbWFya2VkIHdyaXRlLW1vc3RseS4KKy5JUAorUmVsYXRlZCB0byBUaGluIHBvb2wgTG9naWNhbCBWb2x1bWVzOiAoRilhaWxlZCwgb3V0IG9mIChEKWF0YSBzcGFjZSwKKyhNKWV0YWRhdGEgcmVhZCBvbmx5LgorLmJyCisoRilhaWxlZCBpcyBzZXQgaWYgdGhpbiBwb29sIGVuY291bnRlcnMgc2VyaW91cyBmYWlsdXJlcyBhbmQgaGVuY2Ugbm8gZnVydGhlciBJL08KK2lzIHBlcm1pdHRlZCBhdCBhbGwuIFRoZSBvdXQgb2YgKEQpYXRhIHNwYWNlIGlzIHNldCBpZiB0aGluIHBvb2wgaGFzIHJ1biBvdXQgb2YKK2RhdGEgc3BhY2UuIChNKWV0YWRhdGEgcmVhZCBvbmx5IHNpZ25pZmllcyB0aGF0IHRoaW4gcG9vbCBlbmNvdW50ZXJzIGNlcnRhaW4KK3R5cGVzIG9mIGZhaWx1cmVzIGJ1dCBpdCdzIHN0aWxsIHBvc3NpYmxlIHRvIGRvIHJlYWRzIGF0IGxlYXN0LAorYnV0IG5vIG1ldGFkYXRhIGNoYW5nZXMgYXJlIGFsbG93ZWQuCisuSVAKK1JlbGF0ZWQgdG8gVGhpbiBMb2dpY2FsIFZvbHVtZXM6IChGKWFpbGVkLgorLmJyCisoRilhaWxlZCBpcyBzZXQgd2hlbiByZWxhdGVkIHRoaW4gcG9vbCBlbnRlcnMgRmFpbGVkIHN0YXRlIGFuZCBubyBmdXJ0aGVyIEkvTworaXMgcGVybWl0dGVkIGF0IGFsbC4KKy5JUCAxMCAzCitzKGspaXAgYWN0aXZhdGlvbjogdGhpcyB2b2x1bWUgaXMgZmxhZ2dlZCB0byBiZSBza2lwcGVkIGR1cmluZyBhY3RpdmF0aW9uLgorLlJFCisuVFAKKy5CUiBcLU8gIiwgIiBcLVwtc29ydAorQ29tbWEtc2VwYXJhdGVkIG9yZGVyZWQgbGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkuICBSZXBsYWNlcyB0aGUgZGVmYXVsdAorc2VsZWN0aW9uLiBQcmVjZWRlIGFueSBjb2x1bW4gd2l0aCAnXGZJXC1cZlAnIGZvciBhIHJldmVyc2Ugc29ydCBvbiB0aGF0IGNvbHVtbi4KKy5UUAorLkIgXC1cLXJvd3MKK091dHB1dCBjb2x1bW5zIGFzIHJvd3MuCisuVFAKKy5CUiAgXC1TICIsICIgXC1cLXNlbGVjdCAiICIgXGZJU2VsZWN0aW9uCitEaXNwbGF5IG9ubHkgcm93cyB0aGF0IG1hdGNoIFNlbGVjdGlvbiBjcml0ZXJpYS4gQWxsIHJvd3MgYXJlIGRpc3BsYXllZCB3aXRoCit0aGUgYWRkaXRpb25hbCAic2VsZWN0ZWQiIGNvbHVtbiAoXGZCLW8gc2VsZWN0ZWRcZlApIHNob3dpbmcgMSBpZiB0aGUgcm93CittYXRjaGVzIHRoZSBTZWxlY3Rpb24gYW5kIDAgb3RoZXJ3aXNlLiBUaGUgU2VsZWN0aW9uIGNyaXRlcmlhIGFyZSBkZWZpbmVkCitieSBzcGVjaWZ5aW5nIGNvbHVtbiBuYW1lcyBhbmQgdGhlaXIgdmFsaWQgdmFsdWVzICh0aGF0IGNhbiBpbmNsdWRlIHJlc2VydmVkCit2YWx1ZXMpIHdoaWxlIG1ha2luZyB1c2Ugb2Ygc3VwcG9ydGVkIGNvbXBhcmlzb24gb3BlcmF0b3JzLiBTZWUgXGZCbHZtXGZQKDgpCithbmQgXGZCXC1TXGZQLCBcZkJcLVwtc2VsZWN0XGZQIGRlc2NyaXB0aW9uIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uCithYm91dCBjb25zdHJ1Y3RpbmcgdGhlIFNlbGVjdGlvbiBjcml0ZXJpYS4gQXMgYSBxdWljayBoZWxwIGFuZCB0byBzZWUgZnVsbAorbGlzdCBvZiBjb2x1bW4gbmFtZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBTZWxlY3Rpb24gaW5jbHVkaW5nIHRoZSBsaXN0IG9mCityZXNlcnZlZCB2YWx1ZXMgYW5kIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHNlbGVjdGlvbiBvcGVyYXRvcnMsIGNoZWNrIHRoZQorb3V0cHV0IG9mIFxmQmx2cyAtUyBoZWxwXGZQIGNvbW1hbmQuCisuVFAKKy5CIFwtXC1zZWdtZW50cworVXNlIGRlZmF1bHQgY29sdW1ucyB0aGF0IGVtcGhhc2l6ZSBzZWdtZW50IGluZm9ybWF0aW9uLgorLlRQCisuQiBcLVwtc2VwYXJhdG9yIFxmSVNlcGFyYXRvcgorU3RyaW5nIHRvIHVzZSB0byBzZXBhcmF0ZSBlYWNoIGNvbHVtbi4gIFVzZWZ1bCBpZiBncmVwcGluZyB0aGUgb3V0cHV0LgorLlRQCisuQiBcLVwtdW5idWZmZXJlZAorUHJvZHVjZSBvdXRwdXQgaW1tZWRpYXRlbHkgd2l0aG91dCBzb3J0aW5nIG9yIGFsaWduaW5nIHRoZSBjb2x1bW5zIHByb3Blcmx5LgorLlRQCisuQiBcLVwtdW5pdHMgXGZJaEhiQnNTa0ttTWdHdFRwUGVFCitBbGwgc2l6ZXMgYXJlIG91dHB1dCBpbiB0aGVzZSB1bml0czogKGgpdW1hbi1yZWFkYWJsZSwgKGIpeXRlcywgKHMpZWN0b3JzLAorKGspaWxvYnl0ZXMsIChtKWVnYWJ5dGVzLCAoZylpZ2FieXRlcywgKHQpZXJhYnl0ZXMsIChwKWV0YWJ5dGVzLCAoZSl4YWJ5dGVzLgorQ2FwaXRhbGlzZSB0byB1c2UgbXVsdGlwbGVzIG9mIDEwMDAgKFMuSS4pIGluc3RlYWQgb2YgMTAyNC4gIENhbiBhbHNvIHNwZWNpZnkKK2N1c3RvbSB1bml0cyBlLmcuIFxmQlwtXC11bml0cyAzTVxmUAorLlRQCisuQiBcLVwtdW5xdW90ZWQKK1doZW4gdXNlZCB3aXRoIFxmQlwtXC1uYW1lcHJlZml4ZXNcZlAsIG91dHB1dCB2YWx1ZXMgaW4gdGhlIGZpZWxkPXZhbHVlCitwYWlycyBhcmUgbm90IHF1b3RlZC4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgbHZkaXNwbGF5ICg4KSwKKy5CUiBwdnMgKDgpLAorLkJSIHZncyAoOCkKZGlmZiAtLWdpdCBhL21hbi9sdnNjYW4uOC5pbiBiL21hbi9sdnNjYW4uOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzEwZTNjCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL2x2c2Nhbi44LmluCkBAIC0wLDAgKzEsNTIgQEAKKy5USCBMVlNDQU4gOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitsdnNjYW4gXChlbSBzY2FuIChhbGwgZGlza3MpIGZvciBMb2dpY2FsIFZvbHVtZXMKKy5TSCBTWU5PUFNJUworLkIgbHZzY2FuCisuUkIgWyBcLWEgfCBcLVwtYWxsXQorLlJCIFsgXC1iIHwgXC1cLWJsb2NrZGV2aWNlIF0KKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1QIHwgXC1cLXBhcnRpYWwgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuU0ggREVTQ1JJUFRJT04KK2x2c2NhbiBzY2FucyBhbGwga25vd24gdm9sdW1lIGdyb3VwcyBvciBhbGwgc3VwcG9ydGVkIExWTSBibG9jayBkZXZpY2VzCitpbiB0aGUgc3lzdGVtIGZvciBkZWZpbmVkIExvZ2ljYWwgVm9sdW1lcy4gIFRoZSBvdXRwdXQgY29uc2lzdHMKK29mIG9uZSBsaW5lIGZvciBlYWNoIExvZ2ljYWwgVm9sdW1lIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaXQgaXMgYWN0aXZlLAorYSBzbmFwc2hvdCBvciBvcmlnaW4sIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UgYW5kIGl0cyBhbGxvY2F0aW9uIHBvbGljeS4KK1VzZSBcZkJsdnNcZlAoOCkgb3IgXGZCbHZkaXNwbGF5XGZQKDgpIHRvIG9idGFpbiBtb3JlLWNvbXByZWhlbnNpdmUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBMb2dpY2FsIFZvbHVtZXMuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLVwtYWxsCitJbmNsdWRlIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgYWJvdXQgaW50ZXJuYWwgTG9naWNhbCBWb2x1bWVzIHRoYXQKK2FyZSBjb21wb25lbnRzIG9mIG5vcm1hbGx5LWFjY2Vzc2libGUgTG9naWNhbCBWb2x1bWVzLCBzdWNoIGFzIG1pcnJvcnMsCitidXQgd2hpY2ggYXJlIG5vdCBpbmRlcGVuZGVudGx5IGFjY2Vzc2libGUgKGUuZy4gbm90IG1vdW50YWJsZSkuCitGb3IgZXhhbXBsZSwgYWZ0ZXIgY3JlYXRpbmcgYSBtaXJyb3IgdXNpbmcKKy5CIGx2Y3JlYXRlIFwtbTEgXC1cLW1pcnJvcmxvZyBkaXNrXGZSLAordGhpcyBvcHRpb24gd2lsbCByZXZlYWwgdGhyZWUgaW50ZXJuYWwgTG9naWNhbCBWb2x1bWVzLCB3aXRoIHN1ZmZpeGVzCittaW1hZ2VfMCwgbWltYWdlXzEsIGFuZCBtbG9nLgorLlRQCisuQlIgXC1iICIsICIgXC1cLWJsb2NrZGV2aWNlCitUaGlzIG9wdGlvbiBpcyBub3cgaWdub3JlZC4gIEluc3RlYWQsIHVzZSBcZkJsdnNcZlAoOCkgb3IKK1xmQmx2ZGlzcGxheVxmUCg4KSB0byBvYnRhaW4gdGhlIGRldmljZSBudW1iZXIuCisuVFAKKy5JUiBcZkJcLVwtY2FjaGUgIiAiIExvZ2ljYWxWb2x1bWUKK0FwcGxpY2FibGUgb25seSB3aGVuIFxmQmx2bWV0YWRcZlAoOCkgaXMgaW4gdXNlIChzZWUgYWxzbyBcZkJsdm0uY29uZlxmUCg1KSwKK2dsb2JhbC91c2VfbHZtZXRhZCkuIFRoaXMgY29tbWFuZCBpc3N1ZXMgYSByZXNjYW4gb2YgcGh5c2ljYWwgdm9sdW1lIGxhYmVscyBhbmQKK21ldGFkYXRhIGFyZWFzIG9mIGFsbCBQVnMgdGhhdCB0aGUgbG9naWNhbCB2b2x1bWUgdXNlcy4gSW4gcGFydGljdWxhciwgdGhpcyBjYW4KK2JlIHVzZWQgd2hlbiBhIFJBSUQgbG9naWNhbCB2b2x1bWUgYmVjb21lcyBkZWdyYWRlZCwgdG8gdXBkYXRlIGluZm9ybWF0aW9uCithYm91dCBwaHlzaWNhbCB2b2x1bWUgYXZhaWxhYmlsaXR5LiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHRoZSBsb2dpY2FsCit2b2x1bWUgaXMgXGZCbm90XGZQIGJlaW5nIG1vbml0b3JlZCBieSBkbWV2ZW50ZCAoc2VlIFxmQmx2Y2hhbmdlXGZQKDgpLCBvcHRpb24KK1xmQlwtXC1tb25pdG9yXGZQKS4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIGx2ZGlzcGxheSAoOCkKKy5CUiBsdnMgKDgpCmRpZmYgLS1naXQgYS9tYW4vcHZjaGFuZ2UuOC5pbiBiL21hbi9wdmNoYW5nZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGRjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vcHZjaGFuZ2UuOC5pbgpAQCAtMCwwICsxLDU5IEBACisuVEggUFZDSEFOR0UgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitwdmNoYW5nZSBcKGVtIGNoYW5nZSBhdHRyaWJ1dGVzIG9mIGEgcGh5c2ljYWwgdm9sdW1lCisuU0ggU1lOT1BTSVMKKy5CIHB2Y2hhbmdlCisuUkIgWyBcLVwtYWRkdGFnCisuSVIgVGFnIF0KKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLVwtZGVsdGFnCisuSVIgVGFnIF0KKy5SQiBbIFwtXC1tZXRhZGF0YWlnbm9yZQorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLklSIFNlbGVjdGlvbiBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLWEgfCBcLVwtYWxsIF0KKy5SQiBbIFwteCB8IFwtXC1hbGxvY2F0YWJsZQorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtdSB8IFwtXC11dWlkIF0KKy5SSSBbIFBoeXNpY2FsVm9sdW1lUGF0aCAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3B2Y2hhbmdlIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBhbGxvY2F0aW9uIHBlcm1pc3Npb25zIG9mIG9uZSBvcgorbW9yZSBwaHlzaWNhbCB2b2x1bWVzLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1hICIsICIgXC1cLWFsbAorSWYgUGh5c2ljYWxWb2x1bWVQYXRoIGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhbGwKK3BoeXNpY2FsIHZvbHVtZXMgYXJlIHNlYXJjaGVkIGZvciBhbmQgdXNlZC4KKy5UUAorLkJSIFwtXC1tZXRhZGF0YWlnbm9yZSAiIHsiIFxmSXkgfCBcZkluIH0KK0lnbm9yZSBvciB1bi1pZ25vcmUgbWV0YWRhdGEgYXJlYXMgb24gdGhpcyBwaHlzaWNhbCB2b2x1bWUuCitJZiBtZXRhZGF0YSBhcmVhcyBvbiBhIHBoeXNpY2FsIHZvbHVtZSBhcmUgaWdub3JlZCwgTFZNIHdpbGwKK25vdCBub3Qgc3RvcmUgbWV0YWRhdGEgaW4gdGhlIG1ldGFkYXRhIGFyZWFzIHByZXNlbnQgb24gdGhpcyBQaHlzaWNhbAorVm9sdW1lLgorLlRQCisuQlIgXC11ICIsICIgXC1cLXV1aWQKK0dlbmVyYXRlIG5ldyByYW5kb20gVVVJRCBmb3Igc3BlY2lmaWVkIHBoeXNpY2FsIHZvbHVtZXMuCisuVFAKKy5CUiBcLXggIiwgIiBcLVwtYWxsb2NhdGFibGUgIiB7IiBcZkl5IHwgXGZJbiB9CitFbmFibGUgb3IgZGlzYWJsZSBhbGxvY2F0aW9uIG9mIHBoeXNpY2FsIGV4dGVudHMgb24gdGhpcyBwaHlzaWNhbCB2b2x1bWUuCisuU0ggRXhhbXBsZQorRGlzYWxsb3dzIHRoZSBhbGxvY2F0aW9uIG9mIHBoeXNpY2FsIGV4dGVudHMgb24gdGhpcyBwaHlzaWNhbCB2b2x1bWUKKyhwb3NzaWJseSBiZWNhdXNlIG9mIGRpc2sgZXJyb3JzLCBvciBiZWNhdXNlIGl0IHdpbGwgYmUgcmVtb3ZlZCBhZnRlcgorZnJlZWluZyBpdDoKKy5zcAorLkIgcHZjaGFuZ2UgXC14IG4gL2Rldi9zZGsxCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHB2Y3JlYXRlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3B2Y2suOC5pbiBiL21hbi9wdmNrLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZGMwNgotLS0gL2Rldi9udWxsCisrKyBiL21hbi9wdmNrLjguaW4KQEAgLTAsMCArMSwzNyBAQAorLlRIIFBWQ0sgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitwdmNrIFwoZW0gY2hlY2sgcGh5c2ljYWwgdm9sdW1lIG1ldGFkYXRhCisuU0ggU1lOT1BTSVMKKy5CIHB2Y2sKKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtbGFiZWxzZWN0b3IKKy5JUiBzZWN0b3IgXQorLkkgUGh5c2ljYWxWb2x1bWUKKy5SSSBbIFBoeXNpY2FsVm9sdW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgorcHZjayBjaGVja3MgcGh5c2ljYWwgdm9sdW1lIExWTSBtZXRhZGF0YSBmb3IgY29uc2lzdGVuY3kuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CIFwtXC1sYWJlbHNlY3RvciBcZklzZWN0b3IKK0J5IGRlZmF1bHQsIDQgc2VjdG9ycyBvZiBcZkJQaHlzaWNhbFZvbHVtZVxmUCBhcmUgc2Nhbm5lZCBmb3IgYW4gTFZNIGxhYmVsLAorc3RhcnRpbmcgYXQgc2VjdG9yIDAuICBUaGlzIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQKK3N0YXJ0aW5nIHNlY3RvciBmb3IgdGhlIHNjYW4gYW5kIGlzIHVzZWZ1bCBmb3IgcmVjb3Zlcnkgc2l0dWF0aW9ucy4gIEZvcgorZXhhbXBsZSwgc3VwcG9zZSB0aGUgcGFydGl0aW9uIHRhYmxlIGlzIGNvcnJ1cHRlZCBvciBsb3N0IG9uIC9kZXYvc2RhLAorYnV0IHlvdSBzdXNwZWN0IHRoZXJlIHdhcyBhbiBMVk0gcGFydGl0aW9uIGF0IGFwcHJveGltYXRlbHkgMTAwIE1pQi4gIFRoaXMKK2FyZWEgb2YgdGhlIGRpc2sgbWF5IGJlIHNjYW5uZWQgYnkgdXNpbmcgdGhlIFxmQlwtXC1sYWJlbHNlY3RvclxmUCBwYXJhbWV0ZXIKK3dpdGggYSB2YWx1ZSBvZiAyMDQ4MDAgKDEwMCAqIDEwMjQgKiAxMDI0IC8gNTEyID0gMjA0ODAwKToKKy5zcAorLkIgcHZjayBcLVwtbGFiZWxzZWN0b3IgMjA0ODAwIC9kZXYvc2RhCisuc3AKK05vdGUgdGhhdCBhIHNjcmlwdCBjYW4gYmUgdXNlZCB3aXRoIFxmQlwtXC1sYWJlbHNlY3RvclxmUCB0byBhdXRvbWF0ZSB0aGUKK3Byb2Nlc3Mgb2YgZmluZGluZyBMVk0gbGFiZWxzLgorLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiBwdmNyZWF0ZSAoOCksCisuQlIgcHZzY2FuICg4KQorLkJSIHZnY2sgKDgpCmRpZmYgLS1naXQgYS9tYW4vcHZjcmVhdGUuOC5pbiBiL21hbi9wdmNyZWF0ZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTk5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vcHZjcmVhdGUuOC5pbgpAQCAtMCwwICsxLDIxMCBAQAorLlRIIFBWQ1JFQVRFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorcHZjcmVhdGUgXChlbSBpbml0aWFsaXplIGEgZGlzayBvciBwYXJ0aXRpb24gZm9yIHVzZSBieSBMVk0KKy5TSCBTWU5PUFNJUworLkIgcHZjcmVhdGUKKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkIgWyBcLWYgWyBmIF18IFwtXC1mb3JjZQorLlJCIFsgXC1cLWZvcmNlIF1dCisuUkIgWyBcLXkgfCBcLVwteWVzIF0KKy5SQiBbIFwtXC1sYWJlbHNlY3RvciBdCisuUkIgWyBcLVwtYm9vdGxvYWRlcmFyZWFzaXplCisuSVIgc2l6ZSBdCisuUkIgWyBcLU0gfCBcLVwtbWV0YWRhdGF0eXBlCisuSVIgdHlwZSBdCisuUkIgWyBcLVwtIFsgcHYgXSBtZXRhZGF0YWNvcGllcworLklSIE51bWJlck9mQ29waWVzIF0KKy5SQiBbIFwtXC1tZXRhZGF0YXNpemUKKy5JUiBzaXplIF0KKy5SQiBbIFwtXC1tZXRhZGF0YWlnbm9yZQorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtXC1kYXRhYWxpZ25tZW50CisuSVIgYWxpZ25tZW50IF0KKy5SQiBbIFwtXC1kYXRhYWxpZ25tZW50b2Zmc2V0CisuSVIgYWxpZ25tZW50X29mZnNldCBdCisuUkIgWyBcLVwtcmVzdG9yZWZpbGUKKy5JUiBmaWxlIF0KKy5SQiBbIFwtXC1ub3Jlc3RvcmVmaWxlIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZQorLklSIHNpemUgXQorLlJCIFsgXC11IHwgXC1cLXV1aWQKKy5JUiB1dWlkIF0KKy5SQiBbIFwtWiB8IFwtXC16ZXJvCisuUkkgeyB5IHwgbiB9XQorLkkgUGh5c2ljYWxWb2x1bWUKKy5SSSBbIFBoeXNpY2FsVm9sdW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgorcHZjcmVhdGUgaW5pdGlhbGl6ZXMKKy5JIFBoeXNpY2FsVm9sdW1lCitmb3IgbGF0ZXIgdXNlIGJ5IHRoZSBMb2dpY2FsIFZvbHVtZSBNYW5hZ2VyIChMVk0pLiAgRWFjaAorLkkgUGh5c2ljYWxWb2x1bWUKK2NhbiBiZSBhIGRpc2sgcGFydGl0aW9uLCB3aG9sZSBkaXNrLCBtZXRhIGRldmljZSwgb3IgbG9vcGJhY2sgZmlsZS4KK0ZvciBET1MgZGlzayBwYXJ0aXRpb25zLCB0aGUgcGFydGl0aW9uIGlkIHNob3VsZCBiZSBzZXQgdG8gMHg4ZSB1c2luZworLkJSIGZkaXNrICg4KSwKKy5CUiBjZmRpc2sgKDgpLAorb3IgYSBlcXVpdmFsZW50LiBGb3IgR1VJRCBQYXJ0aXRpb24gVGFibGUgKEdQVCksIHRoZSBpZCBpcworRTZENkQzNzktRjUwNy00NEMyLUEyM0MtMjM4RjJBM0RGOTI4LiBGb3IKKy5CIHdob2xlIGRpc2sgZGV2aWNlcyBvbmx5Cit0aGUgcGFydGl0aW9uIHRhYmxlIG11c3QgYmUgZXJhc2VkLCB3aGljaCB3aWxsIGVmZmVjdGl2ZWx5IGRlc3Ryb3kgYWxsCitkYXRhIG9uIHRoYXQgZGlzay4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgemVyb2luZyB0aGUgZmlyc3Qgc2VjdG9yIHdpdGg6Cisuc3AKKy5CSSAiZGQgaWY9L2Rldi96ZXJvIG9mPSIgUGh5c2ljYWxWb2x1bWUgIiBicz01MTIgY291bnQ9MSIKKy5zcAorQ29udGludWUgd2l0aAorLkJSIHZnY3JlYXRlICg4KQordG8gY3JlYXRlIGEgbmV3IHZvbHVtZSBncm91cCBvbgorLklSIFBoeXNpY2FsVm9sdW1lICwKK29yCisuQlIgdmdleHRlbmQgKDgpCit0byBhZGQKKy5JIFBoeXNpY2FsVm9sdW1lCit0byBhbiBleGlzdGluZyB2b2x1bWUgZ3JvdXAuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZm9yY2UKK0ZvcmNlIHRoZSBjcmVhdGlvbiB3aXRob3V0IGFueSBjb25maXJtYXRpb24uICBZb3UgY2FuIG5vdCByZWNyZWF0ZQorKHJlaW5pdGlhbGl6ZSkgYSBwaHlzaWNhbCB2b2x1bWUgYmVsb25naW5nIHRvIGFuIGV4aXN0aW5nIHZvbHVtZSBncm91cC4KK0luIGFuIGVtZXJnZW5jeSB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3VyIHdpdGggXGZCLWZmXGZQLgorLlRQCisuQlIgXC11ICIsICIgXC1cLXV1aWQgIiAiIFxmSXV1aWQKK1NwZWNpZnkgdGhlIHV1aWQgZm9yIHRoZSBkZXZpY2UuCitXaXRob3V0IHRoaXMgb3B0aW9uLCBcZkJwdmNyZWF0ZVxmUCg4KSBnZW5lcmF0ZXMgYSByYW5kb20gdXVpZC4KK0FsbCBvZiB5b3VyIHBoeXNpY2FsIHZvbHVtZXMgbXVzdCBoYXZlIHVuaXF1ZSB1dWlkcy4KK1lvdSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbiBiZWZvcmUgcmVzdG9yaW5nIGEgYmFja3VwIG9mIExWTSBtZXRhZGF0YQorb250byBhIHJlcGxhY2VtZW50IGRldmljZSAtIHNlZSBcZkJ2Z2NmZ3Jlc3RvcmVcZlAoOCkuICBBcyBzdWNoLCB1c2Ugb2YKK1xmQlwtXC1yZXN0b3JlZmlsZVxmUCBpcyBjb21wdWxzb3J5IHVubGVzcyB0aGUgXGZCXC1cLW5vcmVzdG9yZWZpbGVcZlAgaXMKK3VzZWQuCisuVFAKKy5CUiBcLXkgIiwgIiBcLVwteWVzCitBbnN3ZXIgeWVzIHRvIGFsbCBxdWVzdGlvbnMuCisuVFAKKy5CUiBcLVogIiwgIiBcLVwtemVybyAiIHsiIFxmSXkgfCBcZkluIH0KK1doZXRoZXIgb3Igbm90IHRoZSBmaXJzdCA0IHNlY3RvcnMgKDIwNDggYnl0ZXMpIG9mIHRoZSBkZXZpY2Ugc2hvdWxkIGJlCit3aXBlZC4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBnaXZlbiwgdGhlCitkZWZhdWx0IGlzIHRvIHdpcGUgdGhlc2Ugc2VjdG9ycyB1bmxlc3MgZWl0aGVyIG9yIGJvdGggb2YgdGhlCitcZkJcLVwtcmVzdG9yZWZpbGVcZlAgb3IgXGZCXC1cLXV1aWRcZlAgb3B0aW9ucyB3ZXJlIHNwZWNpZmllZC4KKy5TSCBORVcgTUVUQURBVEEgT1BUSU9OUworTFZNMiBpbnRyb2R1Y2VzIGEgbmV3IGZvcm1hdCBmb3Igc3RvcmluZyBtZXRhZGF0YSBvbiBkaXNrLgorVGhpcyBuZXcgZm9ybWF0IGlzIG1vcmUgZWZmaWNpZW50IGFuZCByZXNpbGllbnQgdGhhbiB0aGUgZm9ybWF0IHRoZQorb3JpZ2luYWwgdmVyc2lvbiBvZiBMVk0gdXNlZCBhbmQgb2ZmZXJzIHRoZSBhZHZhbmNlZCB1c2VyIGdyZWF0ZXIKK2ZsZXhpYmlsaXR5IGFuZCBjb250cm9sLgorLlAKK1RoZSBuZXcgZm9ybWF0IG1heSBiZSBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggXGZCXC1NMlxmUCBvciBieQorc2V0dGluZyBcZkJmb3JtYXQgPSAibHZtMiJcZlAgaW4gdGhlIFxmQmdsb2JhbFxmUCBzZWN0aW9uIG9mIFxmQmx2bS5jb25mXGZQKDUpLgorRWFjaCBwaHlzaWNhbCB2b2x1bWUgaW4gdGhlIHNhbWUgdm9sdW1lIGdyb3VwIG11c3QgdXNlIHRoZSBzYW1lIGZvcm1hdCwgYnV0CitkaWZmZXJlbnQgdm9sdW1lIGdyb3VwcyBvbiBhIG1hY2hpbmUgbWF5IHVzZSBkaWZmZXJlbnQgZm9ybWF0cworc2ltdWx0YW5lb3VzbHk6IHRoZSB0b29scyBjYW4gaGFuZGxlIGJvdGggZm9ybWF0cy4KK0FkZGl0aW9uYWwgZm9ybWF0cyBjYW4gYmUgYWRkZWQgYXMgc2hhcmVkIGxpYnJhcmllcy4KKy5QCitBZGRpdGlvbmFsIHRvb2xzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGxvY2F0aW9ucyBhbmQgc2l6ZXMgb2YgbWV0YWRhdGEgYXJlYXMKK3dpbGwgYmUgd3JpdHRlbiBpbiBkdWUgY291cnNlLiAgVXNlIHRoZSB2ZXJib3NlL2RlYnVnIG9wdGlvbnMgb24gdGhlIHRvb2xzCit0byBzZWUgd2hlcmUgdGhlIG1ldGFkYXRhIGFyZWFzIGFyZSBwbGFjZWQuCisuVFAKKy5CIFwtXC1tZXRhZGF0YXNpemUgXGZJc2l6ZQorVGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiBzcGFjZSB0byBiZSBzZXQgYXNpZGUgZm9yIGVhY2ggbWV0YWRhdGEgYXJlYS4KKyhUaGUgc2l6ZSB5b3Ugc3BlY2lmeSBtYXkgZ2V0IHJvdW5kZWQuKQorLlRQCisuQiBcLVwtZGF0YWFsaWdubWVudCBcZklhbGlnbm1lbnQKK0FsaWduIHRoZSBzdGFydCBvZiB0aGUgZGF0YSB0byBhIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLgorWW91IHNob3VsZCBhbHNvIHNwZWNpZnkgYW4gYXBwcm9wcmlhdGUgXGZJUGh5c2ljYWxFeHRlbnRTaXplXGZQIHdoZW4gY3JlYXRpbmcKK3RoZSBWb2x1bWUgR3JvdXAgd2l0aCBcZkJ2Z2NyZWF0ZVxmUC4KKy5zcAorVG8gc2VlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgUGh5c2ljYWwgRXh0ZW50IG9mIGFuIGV4aXN0aW5nIFBoeXNpY2FsIFZvbHVtZQordXNlIFxmQnB2cyBcLW8gK3BlX3N0YXJ0XGZQIC4gIEl0IHdpbGwgYmUgYSBtdWx0aXBsZSBvZiB0aGUgcmVxdWVzdGVkCithbGlnbm1lbnQuICBJbiBhZGRpdGlvbiBpdCBtYXkgYmUgc2hpZnRlZCBieSBcZklhbGlnbm1lbnRfb2Zmc2V0XGZQIGZyb20KK1xmSWRhdGFfYWxpZ25tZW50X29mZnNldF9kZXRlY3Rpb25cZlAgKGlmIGVuYWJsZWQgaW4gXGZCbHZtLmNvbmZcZlAoNSkpIG9yCitcZkJcLVwtZGF0YWFsaWdubWVudG9mZnNldFxmUC4KKy5UUAorLkIgXC1cLWRhdGFhbGlnbm1lbnRvZmZzZXQgXGZJYWxpZ25tZW50X29mZnNldAorU2hpZnQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIGFyZWEgYnkgdGhpcyBhZGRpdGlvbmFsIFxmSWFsaWdubWVudF9vZmZzZXRcZlAuCisuVFAKKy5CUiBcLVwtIFsgcHYgXSBtZXRhZGF0YWNvcGllcyAiICIgXGZJTnVtYmVyT2ZDb3BpZXMKK1RoZSBudW1iZXIgb2YgbWV0YWRhdGEgYXJlYXMgdG8gc2V0IGFzaWRlIG9uIGVhY2ggUFYuICBDdXJyZW50bHkKK3RoaXMgY2FuIGJlIDAsIDEgb3IgMi4KK0lmIHNldCB0byAyLCB0d28gY29waWVzIG9mIHRoZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEKK2FyZSBoZWxkIG9uIHRoZSBQViwgb25lIGF0IHRoZSBmcm9udCBvZiB0aGUgUFYgYW5kIG9uZSBhdCB0aGUgZW5kLgorSWYgc2V0IHRvIDEgKHRoZSBkZWZhdWx0KSwgb25lIGNvcHkgaXMga2VwdCBhdCB0aGUgZnJvbnQgb2YgdGhlIFBWCisoc3RhcnRpbmcgaW4gdGhlIDV0aCBzZWN0b3IpLgorSWYgc2V0IHRvIDAsIG5vIGNvcGllcyBhcmUga2VwdCBvbiB0aGlzIFBWIC0geW91IG1pZ2h0IHdpc2ggdG8gdXNlIHRoaXMKK3dpdGggVkdzIGNvbnRhaW5pbmcgbGFyZ2UgbnVtYmVycyBvZiBQVnMuICBCdXQgaWYgeW91IGRvIHRoaXMgYW5kCit0aGVuIGxhdGVyIHVzZSBcZkJ2Z3NwbGl0XGZQKDgpIHlvdSBtdXN0IGVuc3VyZSB0aGF0IGVhY2ggVkcgaXMgc3RpbGwgZ29pbmcKK3RvIGhhdmUgYSBzdWl0YWJsZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBtZXRhZGF0YSBhZnRlciB0aGUgc3BsaXQhCisuVFAKKy5CUiBcLVwtbWV0YWRhdGFpZ25vcmUgIiB7IiBcZkl5IHwgXGZJbiB9CitJZ25vcmUgb3IgdW4taWdub3JlIG1ldGFkYXRhIGFyZWFzIG9uIHRoaXMgcGh5c2ljYWwgdm9sdW1lLgorVGhlIGRlZmF1bHQgaXMgIm4iLiAgVGhpcyBzZXR0aW5nIGNhbiBiZSBjaGFuZ2VkIHdpdGggXGZCcHZjaGFuZ2VcZlAuCitJZiBtZXRhZGF0YSBhcmVhcyBvbiBhIHBoeXNpY2FsIHZvbHVtZSBhcmUgaWdub3JlZCwgTFZNIHdpbGwKK25vdCBzdG9yZSBtZXRhZGF0YSBpbiB0aGUgbWV0YWRhdGEgYXJlYXMgcHJlc2VudCBvbiB0aGlzIFBoeXNpY2FsCitWb2x1bWUuICBNZXRhZGF0YSBhcmVhcyBjYW5ub3QgYmUgY3JlYXRlZCBvciBleHRlbmRlZCBhZnRlciBMb2dpY2FsCitWb2x1bWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgb24gdGhlIGRldmljZS4gSWYgeW91IGRvIG5vdCB3YW50IHRvIHN0b3JlCittZXRhZGF0YSBvbiB0aGlzIGRldmljZSwgaXQgaXMgc3RpbGwgd2lzZSBhbHdheXMgdG8gYWxsb2NhdGUgYSBtZXRhZGF0YQorYXJlYSBpbiBjYXNlIHlvdSBuZWVkIGl0IGluIHRoZSBmdXR1cmUgYW5kIHRvIHVzZSB0aGlzIG9wdGlvbiB0byBpbnN0cnVjdAorTFZNMiB0byBpZ25vcmUgaXQuCisuVFAKKy5CIFwtXC1yZXN0b3JlZmlsZSBcZklmaWxlCitJbiBjb25qdW5jdGlvbiB3aXRoIFxmQlwtXC11dWlkXGZQLCB0aGlzIGV4dHJhY3RzIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZQorb2YgdGhlIGRhdGEgb24gdGhlIFBWIGZyb20gdGhlIGZpbGUgKHByb2R1Y2VkIGJ5IFxmQnZnY2ZnYmFja3VwXGZQKQorYW5kIGVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgdGhhdCB0aGUgcHJvZ3JhbSBwcm9kdWNlcyBpcyBjb25zaXN0ZW50Cit3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpLmUuIHRoZSBwaHlzaWNhbCBleHRlbnRzIHdpbGwgYmUgaW4KK3RoZSBzYW1lIHBsYWNlIGFuZCBub3QgZ2V0IG92ZXJ3cml0dGVuIGJ5IG5ldyBtZXRhZGF0YS4gIFRoaXMgcHJvdmlkZXMKK2EgbWVjaGFuaXNtIHRvIHVwZ3JhZGUgdGhlIG1ldGFkYXRhIGZvcm1hdCBvciB0byBhZGQvcmVtb3ZlIG1ldGFkYXRhCithcmVhcy4gVXNlIHdpdGggY2FyZS4gU2VlIGFsc28gXGZCdmdjb252ZXJ0XGZQKDgpLgorLlRQCisuQiBcLVwtbm9yZXN0b3JlZmlsZQorSW4gY29uanVuY3Rpb24gd2l0aCBcZkJcLVwtdXVpZFxmUCwgdGhpcyBhbGxvd3MgYSBcZkl1dWlkXGZQIHRvIGJlIHNwZWNpZmllZAord2l0aG91dCBhbHNvIHJlcXVpcmluZyB0aGF0IGEgYmFja3VwIG9mIHRoZSBtZXRhZGF0YSBiZSBwcm92aWRlZC4KKy5UUAorLkIgXC1cLWxhYmVsc2VjdG9yIFxmSXNlY3RvcgorQnkgZGVmYXVsdCB0aGUgUFYgaXMgbGFiZWxsZWQgd2l0aCBhbiBMVk0yIGlkZW50aWZpZXIgaW4gaXRzIHNlY29uZAorc2VjdG9yIChzZWN0b3IgMSkuICBUaGlzIGxldHMgeW91IHVzZSBhIGRpZmZlcmVudCBzZWN0b3IgbmVhciB0aGUKK3N0YXJ0IG9mIHRoZSBkaXNrIChiZXR3ZWVuIDAgYW5kIDMgaW5jbHVzaXZlIC0gc2VlIExBQkVMX1NDQU5fU0VDVE9SUworaW4gdGhlIHNvdXJjZSkuICBVc2Ugd2l0aCBjYXJlLgorLlRQCisuQiBcLVwtYm9vdGxvYWRlcmFyZWFzaXplIFxmSXNpemUKK0NyZWF0ZSBhIHNlcGFyYXRlIGJvb3Rsb2FkZXIgYXJlYSBvZiBzcGVjaWZpZWQgc2l6ZSBiZXNpZGVzIFBWJ3MgZGF0YQorYXJlYS4gVGhlIGJvb3Rsb2FkZXIgYXJlYSBpcyBhbiBhcmVhIG9mIHJlc2VydmVkIHNwYWNlIG9uIHRoZSBQViBmcm9tCit3aGljaCBMVk0yIHdpbGwgbm90IGFsbG9jYXRlIGFueSBleHRlbnRzIGFuZCBpdCdzIGtlcHQgdW50b3VjaGVkLiBUaGlzIGlzCitwcmltYXJpbHkgYWltZWQgZm9yIHVzZSB3aXRoIGJvb3Rsb2FkZXJzIHRvIGVtYmVkIHRoZWlyIG93biBkYXRhIG9yIG1ldGFkYXRhLgorVGhlIHN0YXJ0IG9mIHRoZSBib290bG9hZGVyIGFyZWEgaXMgYWx3YXlzIGFsaWduZWQsIHNlZSBhbHNvIFxmQlwtXC1kYXRhYWxpZ25tZW50XGZQCithbmQgXGZCXC1cLWRhdGFhbGlnbm1lbnRvZmZzZXRcZlAuIFRoZSBib290bG9hZGVyIGFyZWEgc2l6ZSBtYXkgZXZlbnR1YWxseQorZW5kIHVwIGluY3JlYXNlZCBkdWUgdG8gdGhlIGFsaWdubWVudCwgYnV0IGl0J3MgbmV2ZXIgbGVzcyB0aGFuIHRoZQorc2l6ZSB0aGF0IGlzIHJlcXVlc3RlZC4gVG8gc2VlIHRoZSBib290bG9hZGVyIGFyZWEgc3RhcnQgYW5kIHNpemUgb2YKK2FuIGV4aXN0aW5nIFBoeXNpY2FsIFZvbHVtZSB1c2UgXGZCcHZzIFwtbyArcHZfYmFfc3RhcnQscHZfYmFfc2l6ZVxmUC4KKy5UUAorLkIgXC1cLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSBcZklzaXplCitPdmVycmlkZXMgdGhlIGF1dG9tYXRpY2FsbHktZGV0ZWN0ZWQgc2l6ZSBvZiB0aGUgUFYuICBVc2Ugd2l0aCBjYXJlLgorLlNIIEV4YW1wbGVzCitJbml0aWFsaXplIHBhcnRpdGlvbiAjNCBvbiB0aGUgdGhpcmQgU0NTSSBkaXNrIGFuZCB0aGUgZW50aXJlIGZpZnRoCitTQ1NJIGRpc2sgZm9yIGxhdGVyIHVzZSBieSBMVk06Cisuc3AKKy5CIHB2Y3JlYXRlIC9kZXYvc2RjNCAvZGV2L3NkZQorCitJZiB0aGUgMm5kIFNDU0kgZGlzayBpcyBhIDRLaUIgc2VjdG9yIGRyaXZlIHRoYXQgY29tcGVuc2F0ZXMgZm9yIHdpbmRvd3MKK3BhcnRpdGlvbmluZyAoc2VjdG9yIDcgaXMgdGhlIGxvd2VzdCBhbGlnbmVkIGxvZ2ljYWwgYmxvY2ssIHRoZSA0S2lCCitzZWN0b3JzIHN0YXJ0IGF0IExCQSAtMSwgYW5kIGNvbnNlcXVlbnRseSBzZWN0b3IgNjMgaXMgYWxpZ25lZCBvbiBhIDRLaUIKK2JvdW5kYXJ5KSBtYW51YWxseSBhY2NvdW50IGZvciB0aGlzIHdoZW4gaW5pdGlhbGl6aW5nIGZvciB1c2UgYnkgTFZNOgorLnNwCisuQiBwdmNyZWF0ZSBcLVwtZGF0YWFsaWdubWVudG9mZnNldCA3cyAvZGV2L3NkYgorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0uY29uZiAoNSksCisuQlIgbHZtICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCksCisuQlIgdmdleHRlbmQgKDgpLAorLkJSIGx2Y3JlYXRlICg4KSwKKy5CUiBjZmRpc2sgKDgpLAorLkJSIGZkaXNrICg4KSwKKy5CUiBsb3NldHVwICg4KSwKKy5CUiBtZGFkbSAoOCksCisuQlIgdmdjZmdyZXN0b3JlICg4KSwKKy5CUiB2Z2NvbnZlcnQgKDgpCmRpZmYgLS1naXQgYS9tYW4vcHZkaXNwbGF5LjguaW4gYi9tYW4vcHZkaXNwbGF5LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjYTcyMAotLS0gL2Rldi9udWxsCisrKyBiL21hbi9wdmRpc3BsYXkuOC5pbgpAQCAtMCwwICsxLDEwOSBAQAorLlRIIFBWRElTUExBWSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3B2ZGlzcGxheSBcLSBkaXNwbGF5IGF0dHJpYnV0ZXMgb2YgYSBwaHlzaWNhbCB2b2x1bWUKKy5TSCBTWU5PUFNJUworLkIgcHZkaXNwbGF5CisuUkIgWyBcLWMgfCBcLVwtY29sb24gXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZSBdCisuUkIgWyBcLVwtaWdub3Jlc2tpcHBlZGNsdXN0ZXIgXQorLlJCIFsgXC1cLW1hcHMgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1zIHwgXC1cLXNob3J0IF0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaHNia21ndEhLTUdUIF0KKy5SQiBbIFwtdiBbIHYgXXwgXC1cLXZlcmJvc2UKKy5SQiBbIFwtXC12ZXJib3NlIF1dCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkkgWyBQaHlzaWNhbFZvbHVtZVBhdGggLi4uXQorLmJyCisKKy5icgorLkIgcHZkaXNwbGF5CisuQlIgXC1DIHwgXC1cLWNvbHVtbnMKKy5SQiBbIFwtXC1hbGlnbmVkIF0KKy5SQiBbIFwtXC1iaW5hcnkgXQorLlJCIFsgXC1hIHwgXC1cLWFsbCBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5SQiBbWyBcLVwtY29uZmlncmVwb3J0CisuSVIgUmVwb3J0TmFtZSBdCisuUkIgWyBcLW8gfCBcLVwtb3B0aW9ucworLlJJIFsgKyB8IFwtIHwgIyBdIEZpZWxkMSBbLCBGaWVsZDIgLi4uXQorLlJCIFsgXC1PIHwgXC1cLXNvcnQKKy5SSSBbICsgfCBcLSBdIEtleTEgWywgS2V5MiAuLi5dXQorLlJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLklSIFNlbGVjdGlvbiBdCisuUkIgLi4uXQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1cLWxvZ29ubHkgXQorLlJCIFsgXC1cLW5vaGVhZGluZ3MgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXNlcGFyYXRvcgorLklSIFNlcGFyYXRvciBdCisuUkIgWyBcLVwtdW5idWZmZXJlZCBdCisuUkIgWyBcLVwtdW5pdHMKKy5JUiBoSGJCc1NrS21NZ0d0VHBQZUUgXQorLlJCIFsgXC12IFsgdiBdfCBcLVwtdmVyYm9zZQorLlJCIFsgXC1cLXZlcmJvc2UgXV0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SSSBbIFBoeXNpY2FsVm9sdW1lUGF0aCAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3B2ZGlzcGxheSBhbGxvd3MgeW91IHRvIHNlZSB0aGUgYXR0cmlidXRlcyBvZiBvbmUgb3IgbW9yZSBwaHlzaWNhbCB2b2x1bWVzCitsaWtlIHNpemUsIHBoeXNpY2FsIGV4dGVudCBzaXplLCBzcGFjZSB1c2VkIGZvciB0aGUgdm9sdW1lIGdyb3VwIGRlc2NyaXB0b3IKK2FyZWEgYW5kIHNvIG9uLgorLlAKK1xmQnB2c1xmUCg4KSBpcyBhbiBhbHRlcm5hdGl2ZSB0aGF0IHByb3ZpZGVzIHRoZSBzYW1lIGluZm9ybWF0aW9uIAoraW4gdGhlIHN0eWxlIG9mIFxmQnBzXGZQKDEpLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1DICIsICIgXC1cLWNvbHVtbnMKK0Rpc3BsYXkgb3V0cHV0IGluIGNvbHVtbnMsIHRoZSBlcXVpdmFsZW50IG9mIFxmQnB2c1xmUCg4KS4gIFNlZQorXGZCcHZzXGZQKDgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIG90aGVyIG9wdGlvbnMgd2l0aCB0aGlzIGZvcm0gb2YKK1xmQnB2ZGlzcGxheVxmUC4KKy5UUAorLkJSIFwtYyAiLCAiIFwtXC1jb2xvbgorR2VuZXJhdGUgY29sb24gc2VwYXJhdGVkIG91dHB1dCBmb3IgZWFzaWVyIHBhcnNpbmcgaW4gc2NyaXB0cyBvciBwcm9ncmFtcy4KK04uQi4gXGZCcHZzXGZQKDgpIHByb3ZpZGVzIGNvbnNpZGVyYWJseSBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgb3V0cHV0LgorLm5mCisKK1RoZSB2YWx1ZXMgYXJlOgorCitcKGJ1IHBoeXNpY2FsIHZvbHVtZSBkZXZpY2UgbmFtZQorXChidSB2b2x1bWUgZ3JvdXAgbmFtZQorXChidSBwaHlzaWNhbCB2b2x1bWUgc2l6ZSBpbiBzZWN0b3JzCitcKGJ1IGludGVybmFsIHBoeXNpY2FsIHZvbHVtZSBudW1iZXIgKG9ic29sZXRlKQorXChidSBwaHlzaWNhbCB2b2x1bWUgc3RhdHVzCitcKGJ1IHBoeXNpY2FsIHZvbHVtZSAobm90KSBhbGxvY2F0YWJsZQorXChidSBjdXJyZW50IG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgb24gdGhpcyBwaHlzaWNhbCB2b2x1bWUKK1woYnUgcGh5c2ljYWwgZXh0ZW50IHNpemUgaW4ga2lsb2J5dGVzCitcKGJ1IHRvdGFsIG51bWJlciBvZiBwaHlzaWNhbCBleHRlbnRzCitcKGJ1IGZyZWUgbnVtYmVyIG9mIHBoeXNpY2FsIGV4dGVudHMKK1woYnUgYWxsb2NhdGVkIG51bWJlciBvZiBwaHlzaWNhbCBleHRlbnRzCisKKy5maQorLlRQCisuQlIgXC1zICIsICIgXC1cLXNob3J0CitPbmx5IGRpc3BsYXkgdGhlIHNpemUgb2YgdGhlIGdpdmVuIHBoeXNpY2FsIHZvbHVtZXMuCisuVFAKKy5CUiBcLW0gIiwgIiBcLVwtbWFwcworRGlzcGxheSB0aGUgbWFwcGluZyBvZiBwaHlzaWNhbCBleHRlbnRzIHRvIGxvZ2ljYWwgdm9sdW1lcyBhbmQKK2xvZ2ljYWwgZXh0ZW50cy4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgcHZzICg4KSwKKy5CUiBwdmNyZWF0ZSAoOCksCisuQlIgbHZjcmVhdGUgKDgpLAorLkJSIHZnY3JlYXRlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3B2bW92ZS44LmluIGIvbWFuL3B2bW92ZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vcHZtb3ZlLjguaW4KQEAgLTAsMCArMSwxODcgQEAKKy5USCBQVk1PVkUgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitwdm1vdmUgXChlbSBtb3ZlIHBoeXNpY2FsIGV4dGVudHMKKy5TSCBTWU5PUFNJUworLkIgcHZtb3ZlCisuUkIgWyBcLVwtYWJvcnQgXQorLlJCIFsgXC1cLWFsbG9jCisuSVIgQWxsb2NhdGlvblBvbGljeSBdCisuUkIgWyBcLVwtYXRvbWljIF0KKy5SQiBbIFwtYiB8IFwtXC1iYWNrZ3JvdW5kIF0KKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLWkgfCBcLVwtaW50ZXJ2YWwKKy5JUiBTZWNvbmRzIF0KKy5SQiBbIFwtXC1ub3VkZXZzeW5jIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1uIHwgXC1cLW5hbWUKKy5JUiBMb2dpY2FsVm9sdW1lIF0KKy5SSSBbIFNvdXJjZVBoeXNpY2FsVm9sdW1lIFsgOlBFIFsgXC1QRSBdLi4uXQorLlJJIFsgRGVzdGluYXRpb25QaHlzaWNhbFZvbHVtZSBbIDpQRSBbIFwtUEUgXS4uLl0uLi5dXQorLlNIIERFU0NSSVBUSU9OCitwdm1vdmUgYWxsb3dzIHlvdSB0byBtb3ZlIHRoZSBhbGxvY2F0ZWQgcGh5c2ljYWwgZXh0ZW50cyAoUEVzKSBvbgorLkkgU291cmNlUGh5c2ljYWxWb2x1bWUKK3RvIG9uZSBvciBtb3JlIG90aGVyIHBoeXNpY2FsIHZvbHVtZXMgKFBWcykuCitZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIHNvdXJjZQorLkkgTG9naWNhbFZvbHVtZQoraW4gd2hpY2ggY2FzZSBvbmx5IGV4dGVudHMgdXNlZCBieSB0aGF0IExWIHdpbGwgYmUgbW92ZWQgdG8gCitmcmVlIChvciBzcGVjaWZpZWQpIGV4dGVudHMgb24KKy5JUiBEZXN0aW5hdGlvblBoeXNpY2FsVm9sdW1lIChzKS4KK0lmIG5vCisuSSBEZXN0aW5hdGlvblBoeXNpY2FsVm9sdW1lCitpcyBzcGVjaWZpZWQsIHRoZSBub3JtYWwgYWxsb2NhdGlvbiBydWxlcyBmb3IgdGhlIFZvbHVtZSBHcm91cCBhcmUgdXNlZC4KKworSWYgcHZtb3ZlIGdldHMgaW50ZXJydXB0ZWQgZm9yIGFueSByZWFzb24gKGUuZy4gdGhlIG1hY2hpbmUgY3Jhc2hlcykKK3RoZW4gcnVuIHB2bW92ZSBhZ2FpbiB3aXRob3V0IGFueSBQaHlzaWNhbFZvbHVtZSBhcmd1bWVudHMgdG8KK3Jlc3RhcnQgYW55IG1vdmVzIHRoYXQgd2VyZSBpbiBwcm9ncmVzcyBmcm9tIHRoZSBsYXN0IGNoZWNrcG9pbnQuCitBbHRlcm5hdGl2ZWx5IHVzZSBcZkJwdm1vdmUgXC1cLWFib3J0XGZQIGF0IGFueSB0aW1lIHRvIGFib3J0LiAgVGhlCityZXN1bHRpbmcgbG9jYXRpb24gb2YgbG9naWNhbCB2b2x1bWVzIGFmdGVyIGFuIGFib3J0IGlzIGlzc3VlZCBkZXBlbmRzCitvbiB3aGV0aGVyIHRoZQorLkIgXC1cLWF0b21pYworb3B0aW9uIHdhcyB1c2VkIHdoZW4gc3RhcnRpbmcgdGhlIHB2bW92ZSBwcm9jZXNzLgorCitZb3UgY2FuIHJ1biBtb3JlIHRoYW4gb25lIHB2bW92ZSBhdCBvbmNlIHByb3ZpZGVkIHRoZXkgYXJlIG1vdmluZyBkYXRhCitvZmYgZGlmZmVyZW50IFNvdXJjZVBoeXNpY2FsVm9sdW1lcywgYnV0IGFkZGl0aW9uYWwgcHZtb3ZlcyB3aWxsIGlnbm9yZQorYW55IExvZ2ljYWwgVm9sdW1lcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNoYW5nZWQsIHNvIHNvbWUKK2RhdGEgbWlnaHQgbm90IGdldCBtb3ZlZC4KKworXGZCcHZtb3ZlXGZQIHdvcmtzIGFzIGZvbGxvd3M6CisKKzEuIEEgdGVtcG9yYXJ5ICdwdm1vdmUnIExvZ2ljYWwgVm9sdW1lIGlzIGNyZWF0ZWQgdG8gc3RvcmUKK2RldGFpbHMgb2YgYWxsIHRoZSBkYXRhIG1vdmVtZW50cyByZXF1aXJlZC4KKworMi4gRXZlcnkgTG9naWNhbCBWb2x1bWUgaW4gdGhlIFZvbHVtZSBHcm91cCBpcyBzZWFyY2hlZAorZm9yIGNvbnRpZ3VvdXMgZGF0YSB0aGF0IG5lZWQgbW92aW5nCithY2NvcmRpbmcgdG8gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCitGb3IgZWFjaCBwaWVjZSBvZiBkYXRhIGZvdW5kLCBhIG5ldyBzZWdtZW50IGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCitwdm1vdmUgTFYuCitUaGlzIHNlZ21lbnQgdGFrZXMgdGhlIGZvcm0gb2YgYSB0ZW1wb3JhcnkgbWlycm9yIHRvIGNvcHkgdGhlIGRhdGEgCitmcm9tIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiB0byBhIG5ld2x5LWFsbG9jYXRlZCBsb2NhdGlvbi4gCitUaGUgb3JpZ2luYWwgTFYgaXMgdXBkYXRlZCB0byB1c2UgdGhlIG5ldyB0ZW1wb3JhcnkgbWlycm9yIHNlZ21lbnQKK2luIHRoZSBwdm1vdmUgTFYgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgdGhlIGRhdGEgZGlyZWN0bHkuCisKKzMuIFRoZSBWb2x1bWUgR3JvdXAgbWV0YWRhdGEgaXMgdXBkYXRlZCBvbiBkaXNrLgorCis0LiBUaGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcHZtb3ZlIExvZ2ljYWwgVm9sdW1lIGlzIGFjdGl2YXRlZCBhbmQgc3RhcnRzCit0byBtaXJyb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRhdGEuICBPbmx5IG9uZSBzZWdtZW50IGlzIG1pcnJvcmVkIGF0IG9uY2UKK2FzIHRoaXMgaXMgdXN1YWxseSBtb3JlIGVmZmljaWVudC4KKworNS4gQSBkYWVtb24gcmVwZWF0ZWRseSBjaGVja3MgcHJvZ3Jlc3MgYXQgdGhlIHNwZWNpZmllZCB0aW1lIGludGVydmFsLgorV2hlbiBpdCBkZXRlY3RzIHRoYXQgdGhlIGZpcnN0IHRlbXBvcmFyeSBtaXJyb3IgaXMgaW4tc3luYywKK2l0IGJyZWFrcyB0aGF0IG1pcnJvciBzbyB0aGF0IG9ubHkgdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhhdCBkYXRhIGdldHMgdXNlZCAKK2FuZCB3cml0ZXMgYSBjaGVja3BvaW50IGludG8gdGhlIFZvbHVtZSBHcm91cCBtZXRhZGF0YSBvbiBkaXNrLgorVGhlbiBpdCBhY3RpdmF0ZXMgdGhlIG1pcnJvciBmb3IgdGhlIG5leHQgc2VnbWVudCBvZiB0aGUgcHZtb3ZlIExWLgorCis2LiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIHNlZ21lbnRzIGxlZnQgdG8gYmUgbWlycm9yZWQsIAordGhlIHRlbXBvcmFyeSBMb2dpY2FsIFZvbHVtZSBpcyByZW1vdmVkIGFuZCB0aGUgVm9sdW1lIEdyb3VwIG1ldGFkYXRhIAoraXMgdXBkYXRlZCBzbyB0aGF0IHRoZSBMb2dpY2FsIFZvbHVtZXMgcmVmbGVjdCB0aGUgbmV3IGRhdGEgbG9jYXRpb25zLgorCitOb3RlIHRoYXQgdGhpcyBuZXcgcHJvY2VzcyBjYW5ub3Qgc3VwcG9ydCB0aGUgb3JpZ2luYWwgTFZNMQordHlwZSBvZiBvbi1kaXNrIG1ldGFkYXRhLiAgTWV0YWRhdGEgY2FuIGJlIGNvbnZlcnRlZCB1c2luZyBcZkJ2Z2NvbnZlcnRcZlAoOCkuCisKK0lmIHRoZQorLkIgXC1cLWF0b21pYworb3B0aW9uIGlzIHVzZWQsIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGFwcHJvYWNoIGlzIHVzZWQgZm9yIHRoZSBtb3ZlLiAgQWdhaW4sCithIHRlbXBvcmFyeSAncHZtb3ZlJyBsb2dpY2FsIHZvbHVtZSBpcyBjcmVhdGVkIHRvIHN0b3JlIHRoZSBkZXRhaWxzIG9mIGFsbAordGhlIGRhdGEgbW92ZW1lbnRzIHJlcXVpcmVkLiAgVGhpcyB0ZW1wb3JhcnkgTFYgY29udGFpbnMgYWxsIHRoZSBzZWdtZW50cyBvZgordGhlIHZhcmlvdXMgTFZzIHRoYXQgbmVlZCB0byBiZSBtb3ZlZC4gIEhvd2V2ZXIgdGhpcyB0aW1lLCBhbiBpZGVudGljYWwKK2xvZ2ljYWwgdm9sdW1lIGlzIGFsbG9jYXRlZCB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBzZWdtZW50cyBhbmQKK2EgbWlycm9yIGlzIGNyZWF0ZWQgdG8gY29weSB0aGUgY29udGVudHMgZnJvbSB0aGUgZmlyc3QgdGVtcG9yYXJ5IExWIHRvIHRoZQorc2Vjb25kLiAgV2hlbiBhIGNvbXBsZXRlIGNvcHkgaXMgYWNjb21wbGlzaGVkLCB0aGUgdGVtcG9yYXJ5IGxvZ2ljYWwgdm9sdW1lcworYXJlIHJlbW92ZWQsIGxlYXZpbmcgYmVoaW5kIHRoZSBzZWdtZW50cyBvbiB0aGUgZGVzdGluYXRpb24gcGh5c2ljYWwgdm9sdW1lLgorSWYgYW4gYWJvcnQgaXMgaXNzdWVkIGR1cmluZyB0aGUgbW92ZSwgYWxsIGxvZ2ljYWwgdm9sdW1lcyBiZWluZyBtb3ZlZCB3aWxsCityZW1haW4gb24gdGhlIHNvdXJjZSBwaHlzaWNhbCB2b2x1bWUuCisKKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkIgXC1cLWFib3J0CitBYm9ydCBhbnkgbW92ZXMgaW4gcHJvZ3Jlc3MuICBJZiB0aGUKKy5CIFwtXC1hdG9taWMKK29wdGlvbiB3YXMgdXNlZCB0byBzdGFydCB0aGUgcHZtb3ZlLCBhbGwgbG9naWNhbCB2b2x1bWVzIHdpbGwgcmVtYWluIG9uCit0aGUgc291cmNlIHBoeXNpY2FsIHZvbHVtZS4gIE90aGVyd2lzZSwgdGhvc2Ugc2VnbWVudHMgdGhhdCBoYXZlIGNvbXBsZXRlZAordGhlIG1vdmUgd2lsbCBzdGF5IG9uIHRoZSBkZXN0aW5hdGlvbiBwaHlzaWNhbCB2b2x1bWUsIHdoaWxlIHRob3NlIHRoYXQKK2hhdmUgbm90IHdpbGwgcmVtYWluIG9uIHRoZSBzb3VyY2UgcGh5c2ljYWwgdm9sdW1lLgorLlRQCisuQiBcLVwtYXRvbWljCitNYWtlIHRoZSBlbnRpcmUgb3BlcmF0aW9uIGF0b21pYy4gIFRoYXQgaXMsIGVuc3VyZSB0aGF0IGFsbCBhZmZlY3RlZCBsb2dpY2FsCit2b2x1bWVzIGFyZSBtb3ZlZCB0byB0aGUgZGVzdGluYXRpb24gcGh5c2ljYWwgdm9sdW1lIHRvZ2V0aGVyOyB1bmxlc3MgdGhlIG1vdmUKK2hhcyBiZWVuIGFib3J0ZWQuICBJZiB0aGUgbW92ZSBoYXMgYmVlbiBhYm9ydGVkLCBhbGwgbG9naWNhbCB2b2x1bWVzIHdpbGwKK3JlbWFpbiBvbiB0aGUgc291cmNlIHBoeXNpY2FsIHZvbHVtZS4KKy5UUAorLkIgXC1cLW5vdWRldnN5bmMKK0Rpc2FibGUgdWRldiBzeW5jaHJvbmlzYXRpb24uIFRoZQorcHJvY2VzcyB3aWxsIG5vdCB3YWl0IGZvciBub3RpZmljYXRpb24gZnJvbSB1ZGV2LgorSXQgd2lsbCBjb250aW51ZSBpcnJlc3BlY3RpdmUgb2YgYW55IHBvc3NpYmxlIHVkZXYgcHJvY2Vzc2luZworaW4gdGhlIGJhY2tncm91bmQuICBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgaWYgdWRldiBpcyBub3QgcnVubmluZworb3IgaGFzIHJ1bGVzIHRoYXQgaWdub3JlIHRoZSBkZXZpY2VzIExWTTIgY3JlYXRlcy4KKy5UUAorLkJSIFwtYiAiLCAiIFwtXC1iYWNrZ3JvdW5kCitSdW4gdGhlIGRhZW1vbiBpbiB0aGUgYmFja2dyb3VuZC4KKy5UUAorLkJSIFwtaSAiLCAiIFwtXC1pbnRlcnZhbCAiICIgXGZJU2Vjb25kcworUmVwb3J0IHByb2dyZXNzIGFzIGEgcGVyY2VudGFnZSBhdCByZWd1bGFyIGludGVydmFscy4KKy5UUAorLkJSIFwtbiAiLCAiIFwtXC1uYW1lICIgIiBcZklMb2dpY2FsVm9sdW1lCitNb3ZlIG9ubHkgdGhlIGV4dGVudHMgYmVsb25naW5nIHRvCisuSSBMb2dpY2FsVm9sdW1lCitmcm9tCisuSSBTb3VyY2VQaHlzaWNhbFZvbHVtZQoraW5zdGVhZCBvZiBhbGwgYWxsb2NhdGVkIGV4dGVudHMgdG8gdGhlIGRlc3RpbmF0aW9uIHBoeXNpY2FsIHZvbHVtZShzKS4KKworLlNIIEV4YW1wbGVzCitUbyBtb3ZlIGFsbCBQaHlzaWNhbCBFeHRlbnRzIHRoYXQgYXJlIHVzZWQgYnkgc2ltcGxlIExvZ2ljYWwgVm9sdW1lcyBvbgorL2Rldi9zZGIxIHRvIGZyZWUgUGh5c2ljYWwgRXh0ZW50cyBlbHNld2hlcmUgaW4gdGhlIFZvbHVtZSBHcm91cCB1c2U6Cisuc3AKKy5CIHB2bW92ZSAvZGV2L3NkYjEKKy5QCitBZGRpdGlvbmFsbHksIGEgc3BlY2lmaWMgZGVzdGluYXRpb24gZGV2aWNlIC9kZXYvc2RjMQorY2FuIGJlIHNwZWNpZmllZCBsaWtlIHRoaXM6Cisuc3AKKy5CIHB2bW92ZSAvZGV2L3NkYjEgL2Rldi9zZGMxCisuUAorVG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9ubHkgb24gZXh0ZW50cyBiZWxvbmdpbmcgdG8gdGhlIHNpbmdsZSBMb2dpY2FsIFZvbHVtZSAKK2x2b2wxIGRvIHRoaXM6Cisuc3AKKy5CIHB2bW92ZSBcLW4gbHZvbDEgL2Rldi9zZGIxIC9kZXYvc2RjMQorLlAKK1JhdGhlciB0aGFuIG1vdmluZyB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBkZXZpY2UsIGl0IGlzIHBvc3NpYmxlIHRvCittb3ZlIGEgcmFuZ2Ugb2YgUGh5c2ljYWwgRXh0ZW50cyAtIGZvciBleGFtcGxlIG51bWJlcnMgMTAwMCB0byAxOTk5CitpbmNsdXNpdmUgb24gL2Rldi9zZGIxIC0gbGlrZSB0aGlzOgorLnNwCisuQiBwdm1vdmUgL2Rldi9zZGIxOjEwMDBcLTE5OTkKKy5QCitBIHJhbmdlIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBzdGFydCtsZW5ndGgsIHNvCisuc3AKKy5CIHB2bW92ZSAvZGV2L3NkYjE6MTAwMCsxMDAwCisuUAorYWxzbyByZWZlcnMgdG8gMTAwMCBQaHlzaWNhbCBFeHRlbnRzIHN0YXJ0aW5nIGZyb20gUGh5c2ljYWwgRXh0ZW50IG51bWJlciAxMDAwLgorKENvdW50aW5nIHN0YXJ0cyBmcm9tIDAsIHNvIHRoaXMgcmVmZXJzIHRvIHRoZSAxMDAxc3QgdG8gdGhlIDIwMDB0aCBpbmNsdXNpdmUuKQorLlAKK1RvIG1vdmUgYSByYW5nZSBvZiBQaHlzaWNhbCBFeHRlbnRzIHRvIGEgc3BlY2lmaWMgbG9jYXRpb24gKHdoaWNoIG11c3QgaGF2ZQorc3VmZmljaWVudCBmcmVlIGV4dGVudHMpIHVzZSB0aGUgZm9ybToKKy5zcAorLkIgcHZtb3ZlIC9kZXYvc2RiMToxMDAwXC0xOTk5IC9kZXYvc2RjMQorLnNwCitvcgorLnNwCisuQiBwdm1vdmUgL2Rldi9zZGIxOjEwMDBcLTE5OTkgL2Rldi9zZGMxOjBcLTk5OQorLlAKK0lmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBvbiB0aGUgc2FtZSBkaXNrLCB0aGUgCisuQiBhbnl3aGVyZQorYWxsb2NhdGlvbiBwb2xpY3kgd291bGQgYmUgbmVlZGVkLCBsaWtlIHRoaXM6Cisuc3AKKy5CIHB2bW92ZSBcLVwtYWxsb2MgYW55d2hlcmUgL2Rldi9zZGIxOjEwMDBcLTE5OTkgL2Rldi9zZGIxOjBcLTk5OQorLlAKK1RoZSBwYXJ0IG9mIGEgc3BlY2lmaWMgTG9naWNhbCBWb2x1bWUgcHJlc2VudCB3aXRoaW4gaW4gYSByYW5nZSBvZiBQaHlzaWNhbAorRXh0ZW50cyBjYW4gYWxzbyBiZSBwaWNrZWQgb3V0IGFuZCBtb3ZlZCwgbGlrZSB0aGlzOgorLnNwCisuQiBwdm1vdmUgXC1uIGx2b2wxIC9kZXYvc2RiMToxMDAwXC0xOTk5IC9kZXYvc2RjMQorLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiB2Z2NvbnZlcnQgKDgpCisuQlIgcHZzICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3B2cmVtb3ZlLjguaW4gYi9tYW4vcHZyZW1vdmUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQ0ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL3B2cmVtb3ZlLjguaW4KQEAgLTAsMCArMSwzNyBAQAorLlRIIFBWUkVNT1ZFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorcHZyZW1vdmUgXChlbSByZW1vdmUgYSBwaHlzaWNhbCB2b2x1bWUKKy5TSCBTWU5PUFNJUworLkIgcHZyZW1vdmUKKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkIgWyBcLWYgWyBmIF18IFwtXC1mb3JjZSAKKy5SQiBbIFwtXC1mb3JjZSBdXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXkgfCBcLVwteWVzIF0KKy5JIFBoeXNpY2FsVm9sdW1lCisuUkkgWyBQaHlzaWNhbFZvbHVtZSAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3B2cmVtb3ZlIHdpcGVzIHRoZSBsYWJlbCBvbiBhIGRldmljZSBzbyB0aGF0IExWTSB3aWxsIG5vIGxvbmdlcgorcmVjb2duaXNlIGl0IGFzIGEgcGh5c2ljYWwgdm9sdW1lLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1mZiAiLCAiIFwtXC1mb3JjZSAiICIgXC1cLWZvcmNlCitGb3JjZSB0aGUgcmVtb3ZhbCBvZiBhIHBoeXNpY2FsIHZvbHVtZSBiZWxvbmdpbmcgdG8gYW4gZXhpc3Rpbmcgdm9sdW1lIGdyb3VwLgorTm9ybWFsbHkgXGZCdmdyZWR1Y2VcZlAoOCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIGNvbW1hbmQuCitZb3UgY2Fubm90IHJlbW92ZSBhIHBoeXNpY2FsIHZvbHVtZSB3aGljaCBpbiB1c2UgYnkgc29tZSBhY3RpdmUgbG9naWNhbCB2b2x1bWUuCisuVFAKKy5CUiBcLXkgIiwgIiBcLVwteWVzCitBbnN3ZXIgeWVzIHRvIGFsbCBxdWVzdGlvbnMuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHB2Y3JlYXRlICg4KSwKKy5CUiBwdmRpc3BsYXkgKDgpLAorLkJSIHZncmVkdWNlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3B2cmVzaXplLjguaW4gYi9tYW4vcHZyZXNpemUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q4ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3B2cmVzaXplLjguaW4KQEAgLTAsMCArMSw1NiBAQAorLlRIIFBWUkVTSVpFIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQorcHZyZXNpemUgXChlbSByZXNpemUgYSBkaXNrIG9yIHBhcnRpdGlvbiBpbiB1c2UgYnkgTFZNMgorLlNIIFNZTk9QU0lTCisuQiBwdnJlc2l6ZQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtdCB8IFwtXC10ZXN0IF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZQorLklSIHNpemUgXQorLkkgUGh5c2ljYWxWb2x1bWUgCisuUkkgWyBQaHlzaWNhbFZvbHVtZSAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3B2cmVzaXplIHJlc2l6ZXMKKy5JIFBoeXNpY2FsVm9sdW1lCit3aGljaCBtYXkgYWxyZWFkeSBiZSBpbiBhIHZvbHVtZSBncm91cCBhbmQgaGF2ZSBhY3RpdmUgbG9naWNhbCB2b2x1bWVzCithbGxvY2F0ZWQgb24gaXQuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CSSBcLVwtc2V0cGh5c2ljYWx2b2x1bWVzaXplICIgc2l6ZSIKK092ZXJyaWRlcyB0aGUgYXV0b21hdGljYWxseS1kZXRlY3RlZCBzaXplIG9mIHRoZSBQVi4gIFVzZSB3aXRoIGNhcmUsIG9yCitwcmlvciB0byByZWR1Y2luZyB0aGUgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgZGV2aWNlLgorLlNIIEVYQU1QTEVTCitFeHBhbmQgdGhlIFBWIG9uIC9kZXYvc2RhMSBhZnRlciBlbmxhcmdpbmcgdGhlIHBhcnRpdGlvbiB3aXRoIGZkaXNrOgorLnNwCisuQiBwdnJlc2l6ZSAvZGV2L3NkYTEKKy5zcAorU2hyaW5rIHRoZSBQViBvbiAvZGV2L3NkYTEgcHJpb3IgdG8gc2hyaW5raW5nIHRoZSBwYXJ0aXRpb24gd2l0aCBmZGlzaworKGVuc3VyZSB0aGF0IHRoZSBQViBzaXplIGlzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGludGVuZGVkIG5ldyBwYXJ0aXRpb24KK3NpemUpOgorLnNwCisuQiBwdnJlc2l6ZSBcLVwtc2V0cGh5c2ljYWx2b2x1bWVzaXplIDQwRyAvZGV2L3NkYTEKKy5zcAorLlNIIFJFU1RSSUNUSU9OUworcHZyZXNpemUgd2lsbCByZWZ1c2UgdG8gc2hyaW5rCisuSSBQaHlzaWNhbFZvbHVtZQoraWYgaXQgaGFzIGFsbG9jYXRlZCBleHRlbnRzIGFmdGVyIHdoZXJlIGl0cyBuZXcgZW5kIHdvdWxkIGJlLiBJbiB0aGUgZnV0dXJlLAoraXQgc2hvdWxkIHJlbG9jYXRlIHRoZXNlIGVsc2V3aGVyZSBpbiB0aGUgdm9sdW1lIGdyb3VwIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKK2ZyZWUgc3BhY2UsIGxpa2UKKy5CIHB2bW92ZQorZG9lcy4KKy5zcAorLkIgcHZyZXNpemUKK3dvbid0IGN1cnJlbnRseSB3b3JrIGNvcnJlY3RseSBvbiBMVk0xIHZvbHVtZXMuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHB2bW92ZSAoOCksCisuQlIgbHZyZXNpemUgKDgpLAorLkJSIGZkaXNrICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3B2cy44LmluIGIvbWFuL3B2cy44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjBiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vcHZzLjguaW4KQEAgLTAsMCArMSwxNTMgQEAKKy5USCBQVlMgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCitwdnMgXChlbSByZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgcGh5c2ljYWwgdm9sdW1lcworLlNIIFNZTk9QU0lTCisuQiBwdnMKKy5SQiBbIFwtYSB8IFwtXC1hbGwgXQorLlJCIFsgXC1cLWFsaWduZWQgXQorLlJCIFsgXC1cLWJpbmFyeSBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgW1sgXC1cLWNvbmZpZ3JlcG9ydAorLklSIFJlcG9ydE5hbWUgXQorLlJCIFsgXC1vIHwgXC1cLW9wdGlvbnMKKy5SSSBbICsgfCBcLSB8ICMgXSBGaWVsZDEgWywgRmllbGQyIC4uLl0KKy5SQiBbIFwtTyB8IFwtXC1zb3J0CisuUkkgWyArIHwgXC0gXSBLZXkxIFssIEtleTIgLi4uXV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIC4uLl0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyIF0KKy5SQiBbIFwtXC1sb2dvbmx5IF0KKy5SQiBbIFwtXC1uYW1lcHJlZml4ZXMgXQorLlJCIFsgXC1cLW5vaGVhZGluZ3MgXQorLlJCIFsgXC1cLW5vc3VmZml4IF0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXJvd3MgXQorLlJCIFsgXC1cLXNlZ21lbnRzIF0KKy5SQiBbIFwtXC1zZXBhcmF0b3IKKy5JUiBTZXBhcmF0b3IgXQorLlJCIFsgXC1cLXVuYnVmZmVyZWQgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtXC11bnF1b3RlZCBdCisuUkIgWyBcLXZ8XC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb25dCisuUkkgWyBQaHlzaWNhbFZvbHVtZQorLlJJIFsgUGh5c2ljYWxWb2x1bWUgLi4uXV0KKy5TSCBERVNDUklQVElPTgorcHZzIHByb2R1Y2VzIGZvcm1hdHRlZCBvdXRwdXQgYWJvdXQgcGh5c2ljYWwgdm9sdW1lcy4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkIgXC1cLWFsbAorSW5jbHVkZSBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0IGFib3V0IGRldmljZXMgdGhhdCBoYXZlIG5vdCBiZWVuCitpbml0aWFsaXplZCB3aXRoIFxmQnB2Y3JlYXRlXGZQKDgpLgorLlRQCisuQiBcLVwtYWxpZ25lZAorVXNlIHdpdGggXGZCXC1cLXNlcGFyYXRvclxmUCB0byBhbGlnbiB0aGUgb3V0cHV0IGNvbHVtbnMuCisuVFAKKy5CIFwtXC1iaW5hcnkKK1VzZSBiaW5hcnkgdmFsdWVzICIwIiBvciAiMSIgaW5zdGVhZCBvZiBkZXNjcmlwdGl2ZSBsaXRlcmFsIHZhbHVlcworZm9yIGNvbHVtbnMgdGhhdCBoYXZlIGV4YWN0bHkgdHdvIHZhbGlkIHZhbHVlcyB0byByZXBvcnQgKG5vdCBjb3VudGluZwordGhlICJ1bmtub3duIiB2YWx1ZSB3aGljaCBkZW5vdGVzIHRoYXQgdGhlIHZhbHVlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkKS4KKy5UUAorLkIgXC1cLWNvbmZpZ3JlcG9ydCAgXGZJIFJlcG9ydE5hbWUKK01ha2UgYW55IHN1YnNlcXVlbnQgXGZCXC1vLCBcLVwtb3B0aW9uc1xmUCwgXGZCXC1PLCBcLVwtc29ydFxmUCBvcgorXGZCXC1TLCBcLVwtc2VsZWN0XGZQIHRvIGFwcGx5IGZvciBcZklSZXBvcnROYW1lXGZQIHdoZXJlIFxmSVJlcG9ydE5hbWVcZlAKK2lzIGVpdGhlciAncHZzJyBmb3IgY29tbWFuZCdzIG1haW4gcmVwb3J0IG9yICdsb2cnIGZvciBsb2cgcmVwb3J0LgorSWYgXGZCXC1cLWNvbmZpZ3JlcG9ydFxmUCBvcHRpb24gaXMgbm90IHVzZWQgdG8gaWRlbnRpZnkgYSByZXBvcnQsIHRoZW4KK2NvbW1hbmQncyBtYWluIHJlcG9ydCBpcyBhc3N1bWVkLiBUaGUgbG9nIHJlcG9ydCBpcyBhdmFpbGFibGUgb25seSBpZgorZW5hYmxlZCBieSBcZkJsb2cvcmVwb3J0X2NvbW1hbmRfbG9nXGZQIFxmQmx2bS5jb25mXGZQKDUpIHNldHRpbmcgb3IKK2lmIFxmQlwtXC1sb2dvbmx5XGZQIG9wdGlvbiBpcyB1c2VkLgorLlRQCisuQiBcLVwtbG9nb25seQorU3VwcHJlc3MgdGhlIHB2cyByZXBvcnQgaXRzZWxmIGFuZCBkaXNwbGF5IG9ubHkgbG9nIHJlcG9ydCBvbiBvdXRwdXQuCisuVFAKKy5CIFwtXC1uYW1lcHJlZml4ZXMKK0FkZCBhbiAiTFZNMl8iIHByZWZpeCBwbHVzIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBvdXRwdXQuICBVc2VmdWwKK3dpdGggXGZCXC1cLW5vaGVhZGluZ3NcZlAgdG8gcHJvZHVjZSBhIGxpc3Qgb2YgZmllbGQ9dmFsdWUgcGFpcnMgdGhhdCBjYW4KK2JlIHVzZWQgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoZm9yIGV4YW1wbGUsIGluIFxmQnVkZXZcZlAoNykgcnVsZXMpLgorLlRQCisuQiBcLVwtbm9oZWFkaW5ncworU3VwcHJlc3MgdGhlIGhlYWRpbmdzIGxpbmUgdGhhdCBpcyBub3JtYWxseSB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQuCitVc2VmdWwgaWYgZ3JlcHBpbmcgdGhlIG91dHB1dC4KKy5UUAorLkIgXC1cLW5vc3VmZml4CitTdXBwcmVzcyB0aGUgc3VmZml4IG9uIG91dHB1dCBzaXplcy4gIFVzZSB3aXRoIFxmQlwtXC11bml0c1xmUAorKGV4Y2VwdCBoIGFuZCBIKSBpZiBwcm9jZXNzaW5nIHRoZSBvdXRwdXQuCisuVFAKKy5CUiBcLW8gIiwgIiBcLVwtb3B0aW9ucworQ29tbWEtc2VwYXJhdGVkIG9yZGVyZWQgbGlzdCBvZiBjb2x1bW5zLgorLklQCitQcmVjZWRlIHRoZSBsaXN0IHdpdGggJ1xmSStcZlAnIHRvIGFwcGVuZCB0byB0aGUgY3VycmVudCBsaXN0CitvZiBjb2x1bW5zLCAnXGZJLVxmUCcgdG8gcmVtb3ZlIGZyb20gdGhlIGN1cnJlbnQgbGlzdCBvZiBjb2x1bW5zCitvciAnXGZJI1xmUCcgdG8gY29tcGFjdCBnaXZlbiBjb2x1bW5zLiBUaGUgXGZJXC1vXGZQIG9wdGlvbiBjYW4KK2JlIHJlcGVhdGVkLCBwcm92aWRpbmcgc2V2ZXJhbCBsaXN0cy4gVGhlc2UgbGlzdHMgYXJlIGV2YWx1YXRlZAorZnJvbSBsZWZ0IHRvIHJpZ2h0LgorLklQCitVc2UgXGZCLW8gcHZfYWxsXGZQIHRvIHNlbGVjdCBhbGwgcGh5c2ljYWwgdm9sdW1lIGNvbHVtbnMsCithbmQgXGZCLW8gcHZzZWdfYWxsXGZQIHRvIHNlbGVjdCBhbGwgUGh5c2ljYWwgVm9sdW1lIHNlZ21lbnQgY29sdW1ucy4KKy5JUAorVXNlIFxmQi1vIGhlbHBcZlAgdG8gdmlldyB0aGUgZnVsbCBsaXN0IG9mIGNvbHVtbnMgYXZhaWxhYmxlLgorLklQCitDb2x1bW4gbmFtZXMgaW5jbHVkZTogcHZfZm10LCBwdl91dWlkLCBkZXZfc2l6ZSwgcHZfbmFtZSwgcHZfbWRhX2ZyZWUsCitwdl9tZGFfc2l6ZSwgcHZfYmFfc3RhcnQsIHB2X2JhX3NpemUsIHBlX3N0YXJ0LCBwdl9zaXplLCBwdl9mcmVlLCBwdl91c2VkLAorcHZfYXR0ciwgcHZfcGVfY291bnQsIHB2X3BlX2FsbG9jX2NvdW50LCBwdl90YWdzLCBwdl9tZGFfY291bnQsCitwdl9tZGFfdXNlZF9jb3VudCwgcHZzZWdfc3RhcnQsIGFuZCBwdnNlZ19zaXplCisuSVAKK1dpdGggXGZCXC1cLXNlZ21lbnRzXGZQLCBhbnkgInB2c2VnXyIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsOyBvdGhlcndpc2UgYW55CisicHZfIiBwcmVmaXhlcyBhcmUgb3B0aW9uYWwuICBDb2x1bW5zIG1lbnRpb25lZCBpbiBcZkJ2Z3NcZlAoOCkgY2FuIGFsc28KK2JlIGNob3Nlbi4gVGhlIHB2X2F0dHIgYml0cyBhcmU6IChhKWxsb2NhdGFibGUsIGUoeClwb3J0ZWQsIChtKWlzc2luZywKKyh1KXNlZCAoYnV0IG5vdCBhbGxvY2F0YWJsZSksIChkKXVwbGljYXRlLgorLlRQCisuQiBcLVwtc2VnbWVudHMKK1Byb2R1Y2VzIG9uZSBsaW5lIG9mIG91dHB1dCBmb3IgZWFjaCBjb250aWd1b3VzIGFsbG9jYXRpb24gb2Ygc3BhY2Ugb24gZWFjaAorUGh5c2ljYWwgVm9sdW1lLCBzaG93aW5nIHRoZSBzdGFydCAocHZzZWdfc3RhcnQpIGFuZCBsZW5ndGggKHB2c2VnX3NpemUpIGluCit1bml0cyBvZiBwaHlzaWNhbCBleHRlbnRzLgorLlRQCisuQlIgIFwtUyAiLCAiIFwtXC1zZWxlY3QgIiAiIFxmSVNlbGVjdGlvbgorRGlzcGxheSBvbmx5IHJvd3MgdGhhdCBtYXRjaCBTZWxlY3Rpb24gY3JpdGVyaWEuIEFsbCByb3dzIGFyZSBkaXNwbGF5ZWQgd2l0aAordGhlIGFkZGl0aW9uYWwgInNlbGVjdGVkIiBjb2x1bW4gKFxmQi1vIHNlbGVjdGVkXGZQKSBzaG93aW5nIDEgaWYgdGhlIHJvdworbWF0Y2hlcyB0aGUgU2VsZWN0aW9uIGFuZCAwIG90aGVyd2lzZS4gVGhlIFNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgZGVmaW5lZAorYnkgc3BlY2lmeWluZyBjb2x1bW4gbmFtZXMgYW5kIHRoZWlyIHZhbGlkIHZhbHVlcyAodGhhdCBjYW4gaW5jbHVkZSByZXNlcnZlZAordmFsdWVzKSB3aGlsZSBtYWtpbmcgdXNlIG9mIHN1cHBvcnRlZCBjb21wYXJpc29uIG9wZXJhdG9ycy4gU2VlIFxmQmx2bVxmUCg4KQorYW5kIFxmQlwtU1xmUCwgXGZCXC1cLXNlbGVjdFxmUCBkZXNjcmlwdGlvbiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbgorYWJvdXQgY29uc3RydWN0aW5nIHRoZSBTZWxlY3Rpb24gY3JpdGVyaWEuIEFzIGEgcXVpY2sgaGVscCBhbmQgdG8gc2VlIGZ1bGwKK2xpc3Qgb2YgY29sdW1uIG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gU2VsZWN0aW9uIGluY2x1ZGluZyB0aGUgbGlzdCBvZgorcmVzZXJ2ZWQgdmFsdWVzIGFuZCB0aGUgc2V0IG9mIHN1cHBvcnRlZCBzZWxlY3Rpb24gb3BlcmF0b3JzLCBjaGVjayB0aGUKK291dHB1dCBvZiBcZkJwdnMgLVMgaGVscFxmUCBjb21tYW5kLgorLlRQCisuQlIgXC1PICIsICIgXC1cLXNvcnQKK0NvbW1hLXNlcGFyYXRlZCBvcmRlcmVkIGxpc3Qgb2YgY29sdW1ucyB0byBzb3J0IGJ5LiAgUmVwbGFjZXMgdGhlIGRlZmF1bHQKK3NlbGVjdGlvbi4gUHJlY2VkZSBhbnkgY29sdW1uIHdpdGggJ1xmSVwtXGZQJyBmb3IgYSByZXZlcnNlIHNvcnQgb24gdGhhdAorY29sdW1uLgorLlRQCisuQiBcLVwtcm93cworT3V0cHV0IGNvbHVtbnMgYXMgcm93cy4KKy5UUAorLkIgXC1cLXNlcGFyYXRvciBcZklTZXBhcmF0b3IKK1N0cmluZyB0byB1c2UgdG8gc2VwYXJhdGUgZWFjaCBjb2x1bW4uICBVc2VmdWwgaWYgZ3JlcHBpbmcgdGhlIG91dHB1dC4KKy5UUAorLkIgXC1cLXVuYnVmZmVyZWQKK1Byb2R1Y2Ugb3V0cHV0IGltbWVkaWF0ZWx5IHdpdGhvdXQgc29ydGluZyBvciBhbGlnbmluZyB0aGUgY29sdW1ucyBwcm9wZXJseS4KKy5UUAorLkIgXC1cLXVuaXRzIFxmSWhIYkJzU2tLbU1nR3RUcFBlRQorQWxsIHNpemVzIGFyZSBvdXRwdXQgaW4gdGhlc2UgdW5pdHM6IChoKXVtYW4tcmVhZGFibGUsIChiKXl0ZXMsIChzKWVjdG9ycywKKyhrKWlsb2J5dGVzLCAobSllZ2FieXRlcywgKGcpaWdhYnl0ZXMsICh0KWVyYWJ5dGVzLCAocClldGFieXRlcywgKGUpeGFieXRlcy4KK0NhcGl0YWxpc2UgdG8gdXNlIG11bHRpcGxlcyBvZiAxMDAwIChTLkkuKSBpbnN0ZWFkIG9mIDEwMjQuICBDYW4gYWxzbyBzcGVjaWZ5CitjdXN0b20gdW5pdHMgZS5nLiBcLVwtdW5pdHMgM00KKy5UUAorLkIgXC1cLXVucXVvdGVkCitXaGVuIHVzZWQgd2l0aCBcZkJcLVwtbmFtZXByZWZpeGVzXGZQLCBvdXRwdXQgdmFsdWVzIGluIHRoZSBmaWVsZD12YWx1ZQorcGFpcnMgYXJlIG5vdCBxdW90ZWQuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHB2ZGlzcGxheSAoOCksCisuQlIgbHZzICg4KSwKKy5CUiB2Z3MgKDgpCmRpZmYgLS1naXQgYS9tYW4vcHZzY2FuLjguaW4gYi9tYW4vcHZzY2FuLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNDI0ZgotLS0gL2Rldi9udWxsCisrKyBiL21hbi9wdnNjYW4uOC5pbgpAQCAtMCwwICsxLDE3OCBAQAorLlRIIFBWU0NBTiA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3B2c2NhbiBcKGVtIHNjYW4gYWxsIGRpc2tzIGZvciBwaHlzaWNhbCB2b2x1bWVzCisKKy5TSCBTWU5PUFNJUworLkIgcHZzY2FuCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJCIFsgXC1cLXZlcnNpb24gXQorLlJCIFsgXC1cLWlnbm9yZWxvY2tpbmdmYWlsdXJlIF0KKy5SQiBbIFwtZSB8IFwtXC1leHBvcnRlZCBdCisuUkIgWyBcLW4gfCBcLVwtbm92b2x1bWVncm91cCBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtcyB8IFwtXC1zaG9ydCBdCisuUkIgWyBcLXUgfCBcLVwtdXVpZCBdCisuQlIKKworLkIgcHZzY2FuCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLkIgXC1cLWNhY2hlCisuUkIgWyBcLWEgfCBcLVwtYWN0aXZhdGUgIiAiIFxmSWF5IF0KKy5SQiBbIFwtYiB8IFwtXC1iYWNrZ3JvdW5kIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLW1ham9yCisuSSBtYWpvcgorLkIgXC1cLW1pbm9yCisuSSBtaW5vcgorfAorLklSIERldmljZVBhdGgKK3wKKy5JUiBtYWpvcjptaW5vciBdLi4uCisKKy5TSCBERVNDUklQVElPTgorcHZzY2FuIHNjYW5zIGFsbCBzdXBwb3J0ZWQgTFZNIGJsb2NrIGRldmljZXMgaW4gdGhlIHN5c3RlbSBmb3IgcGh5c2ljYWwKK3ZvbHVtZXMuCisKKy5TUyBTY2FubmluZyB3aXRoIGx2bWV0YWQKKworcHZzY2FuIG9wZXJhdGVzIGRpZmZlcmVudGx5IHdoZW4gdXNlZCB3aXRoIHRoZQorLkJSIGx2bWV0YWQgKDgpCitkYWVtb24uCisKK1NjYW5uaW5nIGRpc2tzIGlzIHJlcXVpcmVkIHRvIHJlYWQgTFZNIG1ldGFkYXRhIGFuZCBpZGVudGlmeSBMVk0gUFZzLgorT25jZSByZWFkLCBsdm1ldGFkIGNhY2hlcyB0aGUgbWV0YWRhdGEgc28gdGhhdCBMVk0gY29tbWFuZHMgY2FuIHJlYWQgaXQKK3dpdGhvdXQgcmVwZWF0ZWRseSBzY2FubmluZyBkaXNrcy4gIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIHNjYW5uaW5nIGRpc2tzCitpcyB0aW1lIGNvbnN1bWluZywgYW5kIGZyZXF1ZW50IHNjYW5uaW5nIG1heSBpbnRlcmZlcmUgd2l0aCB0aGUgbm9ybWFsCit3b3JrIG9mIHRoZSBzeXN0ZW0gYW5kIGRpc2tzLgorCitXaGVuIGx2bWV0YWQgaXMgbm90IHVzZWQsIExWTSBjb21tYW5kcyByZXZlcnQgdG8gc2Nhbm5pbmcgZGlza3MgdG8gcmVhZAorbWV0YWRhdGEuICBBbnkgTFZNIGNvbW1hbmQgdGhhdCBuZWVkcyBtZXRhZGF0YSB3aWxsIHNjYW4gZGlza3MgZm9yIGl0OworcnVubmluZyB0aGUgcHZzY2FuIGNvbW1hbmQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIHNha2Ugb2Ygb3RoZXIgTFZNCitjb21tYW5kcy4KKworV2hlbiBsdm1ldGFkIGlzIHVzZWQsIExWTSBjb21tYW5kcyBhdm9pZCBzY2FubmluZyBkaXNrcyBieSByZWFkaW5nCittZXRhZGF0YSBmcm9tIGx2bWV0YWQuICBXaGVuIG5ldyBkaXNrcyBhcHBlYXIsIHRoZXkgbXVzdCBiZSBzY2FubmVkIHNvCit0aGVpciBtZXRhZGF0YSBjYW4gYmUgY2FjaGVkIGluIGx2bWV0YWQuICBUaGlzIGlzIGRvbmUgYnkgdGhlIGNvbW1hbmQKK3B2c2NhbiBcLVwtY2FjaGUsIHdoaWNoIHNjYW5zIGRpc2tzIGFuZCBwYXNzZXMgdGhlIG1ldGFkYXRhIHRvIGx2bWV0YWQuCisKK1RoZSBwdnNjYW4gXC1cLWNhY2hlIGNvbW1hbmQgaXMgdHlwaWNhbGx5IHJ1biBhdXRvbWF0aWNhbGx5IGJ5IHN5c3RlbQorc2VydmljZXMgd2hlbiBhIG5ldyBkZXZpY2UgYXBwZWFycy4gIFVzZXJzIGRvIG5vdCBnZW5lcmFsbHkgbmVlZCB0byBydW4KK3RoaXMgY29tbWFuZCBpZiB0aGUgc3lzdGVtIGFuZCBsdm1ldGFkIGFyZSBydW5uaW5nIHByb3Blcmx5LgorCitNYW55IHNjcmlwdHMgY29udGFpbiB1bm5lY2Vzc2FyeSBwdnNjYW4gKG9yIHZnc2NhbikgY29tbWFuZHMgZm9yCitoaXN0b3JpY2FsIHJlYXNvbnMuICBUbyBhdm9pZCBkaXNydXB0aW5nIHRoZSBzeXN0ZW0gd2l0aCBleHRyYW5lb3VzIGRpc2sKK3NjYW5uaW5nLCBhbiBvcmRpbmFyeSBwdnNjYW4gKHdpdGhvdXQgXC1cLWNhY2hlKSB3aWxsIHNpbXBseSByZWFkIG1ldGFkYXRhCitmcm9tIGx2bWV0YWQgbGlrZSBvdGhlciBMVk0gY29tbWFuZHMuICBJdCBkb2VzIG5vdCBkbyBhbnl0aGluZyBiZXlvbmQKK2Rpc3BsYXlpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNhY2hlLgorCisuSSBOb3RlcworCisuSVAgXFtidV0gMgorV2hlbiBnaXZlbiBzcGVjaWZpYyBkZXZpY2UgbmFtZSBhcmd1bWVudHMsIHB2c2NhbiBcLVwtY2FjaGUgd2lsbCBvbmx5CityZWFkIHRoZSBuYW1lZCBkZXZpY2VzLgorCisuSVAgXFtidV0gMgorTFZNIHVkZXYgcnVsZXMgYW5kIHN5c3RlbWQgc2VydmljZXMgYXJlIHVzZWQgdG8gaW50aWF0ZSBhdXRvbWF0aWMgZGV2aWNlCitzY2FubmluZy4KKworLklQIFxbYnVdIDIKK1RvIHByZXZlbnQgZGV2aWNlcyBmcm9tIGJlaW5nIHNjYW5uZWQgYnkgcHZzY2FuIC0tY2FjaGUsIGFkZCB0aGVtCit0bworLkJSIGx2bS5jb25mICg1KQorLkIgZGV2aWNlcy9nbG9iYWxfZmlsdGVyLgorVGhlIGRldmljZXMvZmlsdGVyIHNldHRpbmcgZG9lcyBub3QKK2FwcGx5IHRvIHN5c3RlbSBsZXZlbCBzY2FubmluZy4KK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6CisuYnIKKy5CIGx2bWNvbmZpZyAtLXdpdGhjb21tZW50cyBkZXZpY2VzL2dsb2JhbF9maWx0ZXIKKworLklQIFxbYnVdIDIKK0lmIGx2bWV0YWQgaXMgc3RhcnRlZCBvciByZXN0YXJ0ZWQgYWZ0ZXIgZGV2aWNlcyBhcmUgdmlzaWJsZSwgb3IKK2lmIHRoZSBnbG9iYWxfZmlsdGVyIGhhcyBjaGFuZ2VkLCB0aGVuIGFsbCBkZXZpY2VzIG11c3QgYmUgcmVzY2FubmVkCitmb3IgbWV0YWRhdGEgd2l0aCB0aGUgY29tbWFuZCBwdnNjYW4gXC1cLWNhY2hlLgorCisuSVAgXFtidV0gMgorbHZtZXRhZCBpZ25vcmVzIG9sZGVyIG1ldGFkYXRhIGZvcm1hdHMsIGUuZy4gbHZtMSwgYW5kIHNob3VsZCBub3QgYmUKK3VzZWQgaWYgdGhleSBleGlzdC4KKworLklQIFxbYnVdIDIKK1RvIG5vdGlmeSBsdm1ldGFkIGFib3V0IGEgZGV2aWNlIHRoYXQgaXMgbm8gbG9uZ2VyIHByZXNlbnQsIHRoZSBtYWpvciBhbmQKK21pbm9yIG51bWJlcnMgbXVzdCBiZSBnaXZlbiwgbm90IHRoZSBwYXRoLgorCisuU1MgQXV0b21hdGljIGFjdGl2YXRpb24KKworV2hlbiBldmVudC1kcml2ZW4gc3lzdGVtIHNlcnZpY2VzIGRldGVjdCBhIG5ldyBMVk0gZGV2aWNlLCB0aGUgZmlyc3Qgc3RlcAoraXMgdG8gYXV0b21hdGljYWxseSBzY2FuIGFuZCBjYWNoZSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgZGV2aWNlLiAgVGhpcyBpcworZG9uZSBieSBwdnNjYW4gXC1cLWNhY2hlLiAgQSBzZWNvbmQgc3RlcCBpcyB0byBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlIExWcwordGhhdCBhcmUgcHJlc2VudCBvbiB0aGUgbmV3IGRldmljZS4gIFRoaXMgYXV0by1hY3RpdmF0aW9uIGlzIGRvbmUgYnkgdGhlCitzYW1lIHB2c2NhbiBcLVwtY2FjaGUgY29tbWFuZCB3aGVuIHRoZSBvcHRpb24gJ1wtYXxcLVwtYWN0aXZhdGUgYXknIGlzCitpbmNsdWRlZC4KKworQXV0by1hY3RpdmF0aW9uIG9mIFZHcyBvciBMVnMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgdXNpbmc6CisuYnIKKy5CUiBsdm0uY29uZiAoNSkKKy5CIGFjdGl2YXRpb24vYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0CisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6CisuYnIKKy5CIGx2bWNvbmZpZyAtLXdpdGhjb21tZW50cyBhY3RpdmF0aW9uL2F1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdAorCitXaGVuIHRoaXMgc2V0dGluZyBpcyB1bmRlZmluZWQsIGFsbCBMVnMgYXJlIGF1dG8tYWN0aXZhdGVkICh3aGVuIGx2bSBpcworZnVsbHkgaW50ZWdyYXRlZCB3aXRoIHRoZSBldmVudC1kcml2ZW4gc3lzdGVtIHNlcnZpY2VzLikKKworV2hlbiBhIFZHIG9yIExWIGlzIG5vdCBhdXRvLWFjdGl2YXRlZCwgdHJhZGl0aW9uYWwgYWN0aXZhdGlvbiB1c2luZwordmdjaGFuZ2Ugb3IgbHZjaGFuZ2UgLWF8LS1hY3RpdmF0ZSBpcyBuZWVkZWQuCisKKy5JIE5vdGVzCisKKy5JUCBcW2J1XSAyCitwdnNjYW4gYXV0by1hY3RpdmF0aW9uIGNhbiBiZSBvbmx5IGRvbmUgaW4gY29tYmluYXRpb24gd2l0aCBcLVwtY2FjaGUuCisKKy5JUCBcW2J1XSAyCitBdXRvLWFjdGl2YXRpb24gaXMgZGVzaWduYXRlZCBieSB0aGUgImEiIGFyZ3VtZW50IGluICctYXwtLWFjdGl2YXRlIGF5Jy4KK1RoaXMgaXMgbWVhbnQgdG8gZGlzdGluZ3Vpc2ggc3lzdGVtIGdlbmVyYXRlZCBjb21tYW5kcyBmcm9tIGV4cGxpY2l0IHVzZXIKK2NvbW1hbmRzLCBhbHRob3VnaCBpdCBjYW4gYmUgdXNlZCBpbiBhbnkgYWN0aXZhdGlvbiBjb21tYW5kLiAgV2hlbmV2ZXIgaXQKK2lzIHVzZWQsIHRoZSBhdXRvX2FjdGl2YXRpb25fdm9sdW1lX2xpc3QgaXMgYXBwbGllZC4KKworLklQIFxbYnVdIDIKK0F1dG8tYWN0aXZhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTFZzIHRoYXQgYXJlIHBhcnQgb2YgcGFydGlhbCBvcgorY2x1c3RlcmVkIHZvbHVtZSBncm91cHMuCisKKy5QCisKKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtZSAiLCAiIFwtXC1leHBvcnRlZAorT25seSBzaG93IHBoeXNpY2FsIHZvbHVtZXMgYmVsb25naW5nIHRvIGV4cG9ydGVkIHZvbHVtZSBncm91cHMuCisuVFAKKy5CUiBcLW4gIiwgIiBcLVwtbm92b2x1bWVncm91cAorT25seSBzaG93IHBoeXNpY2FsIHZvbHVtZXMgbm90IGJlbG9uZ2luZyB0byBhbnkgdm9sdW1lIGdyb3VwLgorLlRQCisuQlIgXC1zICIsICIgXC1cLXNob3J0CitTaG9ydCBsaXN0aW5nIGZvcm1hdC4KKy5UUAorLkJSIFwtdSAiLCAiIFwtXC11dWlkCitTaG93IFVVSURzIGluIGFkZGl0aW9uIHRvIGRldmljZSBuYW1lcy4KKy5UUAorLkJSIFwtYSAiLCAiIFwtXC1hY3RpdmF0ZSAiICIgXGZJYXkKK0F1dG9tYXRpY2FsbHkgYWN0aXZhdGUgYW55IGxvZ2ljYWwgdm9sdW1lcyB0aGF0IGFyZSBwb3NzaWJsZSB0byBhY3RpdmF0ZQord2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIG5ldyBkZXZpY2VzLgorLlRQCisuQlIgXC1iICIsICIgXC1cLWJhY2tncm91bmQKK1J1biB0aGUgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZC4KKy5UUAorLkJSIFwtXC1jYWNoZSAiIFsiIFwtXC1tYWpvciAiICIgXGZJbWFqb3IgIiAiIFwtXC1taW5vciAiICIgXGZJbWlub3IgIiB8ICIgXGZJRGV2aWNlUGF0aCAiIHwgIiBcZkltYWpvcjptaW5vciAiIF0uLi4iCitTY2FuIG9uZSBvciBtb3JlIGRldmljZXMgYW5kIHNlbmQgdGhlIG1ldGFkYXRhIHRvIGx2bWV0YWQuCisKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgbHZtY29uZmlnICg4KSwKKy5CUiBsdm1ldGFkICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3ZnY2ZnYmFja3VwLjguaW4gYi9tYW4vdmdjZmdiYWNrdXAuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYyMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL3ZnY2ZnYmFja3VwLjguaW4KQEAgLTAsMCArMSwzNiBAQAorLlRIIFZHQ0ZHQkFDS1VQIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdjZmdiYWNrdXAgXChlbSBiYWNrdXAgdm9sdW1lIGdyb3VwIGRlc2NyaXB0b3IgYXJlYQorLlNIIFNZTk9QU0lTCisuQiB2Z2NmZ2JhY2t1cAorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtZiB8IFwtXC1maWxlCisuSVIgRmlsZW5hbWUgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLWlnbm9yZWxvY2tpbmdmYWlsdXJlIF0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdjZmdiYWNrdXAgYWxsb3dzIHlvdSB0byBiYWNrdXAgdGhlIG1ldGFkYXRhIG9mIHlvdXIgdm9sdW1lIGdyb3Vwcy4KK0lmIHlvdSBkb24ndCBuYW1lIGFueSB2b2x1bWUgZ3JvdXBzIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFsbCBvZiB0aGVtCit3aWxsIGJlIGJhY2tlZCB1cC4KKy5zcAorSW4gYSBkZWZhdWx0IGluc3RhbGxhdGlvbiwgZWFjaCB2b2x1bWUgZ3JvdXAgZ2V0cyBiYWNrZWQgdXAgaW50byBhIHNlcGFyYXRlCitmaWxlIGJlYXJpbmcgdGhlIG5hbWUgb2YgdGhlIHZvbHVtZSBncm91cCBpbiB0aGUgZGlyZWN0b3J5CitcZkkjREVGQVVMVF9CQUNLVVBfRElSI1xmUC4KK1lvdSBjYW4gd3JpdGUgdGhlIGJhY2t1cCB0byBhbiBhbHRlcm5hdGl2ZSBmaWxlIHVzaW5nIFxmQlwtZlxmUC4gIEluIHRoaXMgY2FzZQoraWYgeW91IGFyZSBiYWNraW5nIHVwIG1vcmUgdGhhbiBvbmUgdm9sdW1lIGdyb3VwIHRoZSBmaWxlbmFtZSBpcwordHJlYXRlZCBhcyBhIHRlbXBsYXRlLCBhbmQgJXMgZ2V0cyByZXBsYWNlZCBieSB0aGUgdm9sdW1lIGdyb3VwIG5hbWUuCisuc3AKK05CLiBUaGlzIERPRVNOJ1QgYmFja3VwIHVzZXIvc3lzdGVtIGRhdGEgaW4gbG9naWNhbAordm9sdW1lKHMpISAgQmFja3VwIFxmSSNERUZBVUxUX1NZU19ESVIjXGZQIHJlZ3VsYXJseSB0b28uCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZnY2ZncmVzdG9yZSAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z2NmZ3Jlc3RvcmUuOC5pbiBiL21hbi92Z2NmZ3Jlc3RvcmUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIwYTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3ZnY2ZncmVzdG9yZS44LmluCkBAIC0wLDAgKzEsNTggQEAKKy5USCBWR0NGR1JFU1RPUkUgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z2NmZ3Jlc3RvcmUgXChlbSByZXN0b3JlIHZvbHVtZSBncm91cCBkZXNjcmlwdG9yIGFyZWEKKy5TSCBTWU5PUFNJUworLkIgdmdjZmdyZXN0b3JlCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1mIHwgXC1cLWZpbGUKKy5SSSA8IGZpbGVuYW1lID5dCisuUkIgWyBcLVwtZm9yY2UgXQorLlJCIFsgXC1sIFsgbCBdfCBcLVwtbGlzdCBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLU0gfCBcLVwtbWV0YWRhdGF0eXBlCisuSVIgMSB8IDIgXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJJIFxmSVZvbHVtZUdyb3VwTmFtZVxmUAorLlNIIERFU0NSSVBUSU9OCit2Z2NmZ3Jlc3RvcmUgYWxsb3dzIHlvdSB0byByZXN0b3JlIHRoZSBtZXRhZGF0YSBvZiBcZklWb2x1bWVHcm91cE5hbWVcZlAKK2Zyb20gYSB0ZXh0IGJhY2t1cCBmaWxlIHByb2R1Y2VkIGJ5IFxmQnZnY2ZnYmFja3VwXGZQLgorWW91IGNhbiBzcGVjaWZ5IGEgYmFja3VwIGZpbGUgd2l0aCBcZkJcLVwtZmlsZVxmUC4KK0lmIG5vIGJhY2t1cCBmaWxlIGlzIHNwZWNpZmllZCwgdGhlIG1vc3QgcmVjZW50CitvbmUgaXMgdXNlZC4gIFVzZSBcZkJcLVwtbGlzdFxmUCBmb3IgYSBsaXN0IG9mIHRoZSBhdmFpbGFibGUKK2JhY2t1cCBhbmQgYXJjaGl2ZSBmaWxlcyBvZiBcZklWb2x1bWVHcm91cE5hbWVcZlAuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWwgIiwgIiBcLVwtbGlzdFxmUAorTGlzdCBmaWxlcyBwZXJ0YWluaW5nIHRvIFxmSVZvbHVtZUdyb3VwTmFtZVxmUAorTGlzdCBtZXRhZGF0YSBiYWNrdXAgYW5kIGFyY2hpdmUgZmlsZXMgcGVydGFpbmluZyB0byBcZklWb2x1bWVHcm91cE5hbWVcZlAuCitNYXkgYmUgdXNlZCB3aXRoIHRoZSBcZkJcLWZcZlAgb3B0aW9uLiAgRG9lcyBub3QgcmVzdG9yZSBcZklWb2x1bWVHcm91cE5hbWVcZlAuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZmlsZSAiICIgXGZJZmlsZW5hbWUKK05hbWUgb2YgTFZNIG1ldGFkYXRhIGJhY2t1cCBmaWxlCitTcGVjaWZpZXMgYSBtZXRhZGF0YSBiYWNrdXAgb3IgYXJjaGl2ZSBmaWxlIHRvIGJlIHVzZWQgZm9yIHJlc3RvcmluZyAKK1ZvbHVtZUdyb3VwTmFtZS4gIE9mdGVuIHRoaXMgZmlsZSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggXGZCdmdjZmdiYWNrdXBcZlAuCisuVFAKKy5CIFwtXC1mb3JjZQorTmVjZXNzYXJ5IHRvIHJlc3RvcmUgbWV0YWRhdGEgd2l0aCB0aGluIHBvb2wgdm9sdW1lcy4KKy5icgorXGZCV0FSTklORzogVXNlIHdpdGggZXh0cmVtZSBjYXV0aW9uLgorTW9zdCBjaGFuZ2VzIHRvIHRoaW4gbWV0YWRhdGEgY2Fubm90IGJlIHJldmVydGVkLgorWW91IG1heSBsb3NlIGRhdGEgaWYgeW91IHJlc3RvcmUgbWV0YWRhdGEgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgdGhpbiBwb29sCitrZXJuZWwgbWV0YWRhdGEgcHJlY2lzZWx5LlxmUAorLlNIIFJFUExBQ0lORyBQSFlTSUNBTCBWT0xVTUVTCitcZkJ2Z2Rpc3BsYXkgXC1cLXBhcnRpYWwgXC1cLXZlcmJvc2VcZlAgd2lsbCBzaG93IHlvdSB0aGUgVVVJRHMgYW5kIHNpemVzIG9mCithbnkgUFZzIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50LgorSWYgYSBQViBpbiB0aGUgVkcgaXMgbG9zdCBhbmQgeW91IHdpc2ggdG8gc3Vic3RpdHV0ZSAKK2Fub3RoZXIgb2YgdGhlIHNhbWUgc2l6ZSwgdXNlIAorXGZCcHZjcmVhdGUgXC1cLXJlc3RvcmVmaWxlIGZpbGVuYW1lIFwtXC11dWlkIHV1aWRcZlAgKHBsdXMgYWRkaXRpb25hbCAKK2FyZ3VtZW50cyBhcyBhcHByb3ByaWF0ZSkgdG8gaW5pdGlhbGlzZSBpdCB3aXRoIHRoZSBzYW1lIFVVSUQgYXMgCit0aGUgbWlzc2luZyBQVi4gIFJlcGVhdCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgUFZzIGluIHRoZSBWRy4gCitUaGVuIHVzZSBcZkJ2Z2NmZ3Jlc3RvcmUgXC1cLWZpbGUgZmlsZW5hbWVcZlAgdG8gcmVzdG9yZSB0aGUgdm9sdW1lCitncm91cCdzIG1ldGFkYXRhLgorLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z2NoYW5nZS44LmluIGIvbWFuL3ZnY2hhbmdlLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZmMzZQotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z2NoYW5nZS44LmluCkBAIC0wLDAgKzEsMzQ2IEBACisuVEggVkdDSEFOR0UgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z2NoYW5nZSBcKGVtIGNoYW5nZSBhdHRyaWJ1dGVzIG9mIGEgdm9sdW1lIGdyb3VwCisuU0ggU1lOT1BTSVMKKy5CIHZnY2hhbmdlCisuUkIgWyBcLVwtYWRkdGFnCisuSVIgVGFnIF0KKy5SQiBbIFwtXC1hbGxvYworLklSIEFsbG9jYXRpb25Qb2xpY3kgXQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLWEgfCBcLVwtYWN0aXZhdGUKKy5SSSBbIGEgfCBlIHwgcyB8IGwgXQorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtXC1hY3RpdmF0aW9ubW9kZQorLklCIHsgY29tcGxldGUgfCBkZWdyYWRlZCB8IHBhcnRpYWwgfSBdCisuUkIgWyBcLUsgfCBcLVwtaWdub3JlYWN0aXZhdGlvbnNraXAgXQorLlJCIFsgXC1cLW1vbml0b3IKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLVwtcG9sbAorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtYyB8IFwtXC1jbHVzdGVyZWQKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLXUgfCBcLVwtdXVpZCBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1cLWRlbHRhZworLklSIFRhZyBdCisuUkIgWyBcLVwtZGV0YWNocHJvZmlsZSBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1cLWlnbm9yZW1vbml0b3JpbmcgXQorLlJCIFsgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyIF0KKy5SQiBbIFwtXC1zeXNpbml0IF0KKy5SQiBbIFwtXC1ub3VkZXZzeW5jIF0KKy5SQiBbIFwtXC1sb2NrXC1zdGFydCBdCisuUkIgWyBcLVwtbG9ja1wtc3RvcCBdCisuUkIgWyBcLVwtbG9ja1wtdHlwZQorLklSIExvY2tUeXBlIF0KKy5SQiBbIFwtbCB8IFwtXC1sb2dpY2Fsdm9sdW1lCisuSVIgTWF4TG9naWNhbFZvbHVtZXMgXQorLlJCIFsgXC1wIHwgXC1cLW1heHBoeXNpY2Fsdm9sdW1lcworLklSIE1heFBoeXNpY2FsVm9sdW1lcyBdCisuUkIgWyBcLVwtbWV0YWRhdGFwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1cLSBbIHZnIF0gbWV0YWRhdGFjb3BpZXMKKy5JUiBOdW1iZXJPZkNvcGllcyB8IHVubWFuYWdlZCB8IGFsbCBdCisuUkIgWyBcLVAgfCBcLVwtcGFydGlhbCBdCisuUkIgWyBcLXMgfCBcLVwtcGh5c2ljYWxleHRlbnRzaXplCisuSVIgUGh5c2ljYWxFeHRlbnRTaXplIFsgYkJzU2tLbU1nR3RUcFBlRSBdXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLVMgfCBcLVwtc2VsZWN0CisuSVIgU2VsZWN0aW9uIF0KKy5SQiBbIFwtXC1zeXN0ZW1pZAorLklSIFN5c3RlbUlEIF0KKy5SQiBbIFwtXC1yZWZyZXNoIF0KKy5SQiBbIFwtdCB8IFwtXC10ZXN0IF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SQiBbIFwteCB8IFwtXC1yZXNpemVhYmxlCisuUkkgeyB5IHwgbiB9XQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdjaGFuZ2UgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lIG9yIG1vcmUKK3ZvbHVtZSBncm91cHMuIEl0cyBtYWluIHB1cnBvc2UgaXMgdG8gYWN0aXZhdGUgYW5kIGRlYWN0aXZhdGUKKy5JUiBWb2x1bWVHcm91cE5hbWUgLAorb3IgYWxsIHZvbHVtZSBncm91cHMgaWYgbm9uZSBpcyBzcGVjaWZpZWQuICBPbmx5IGFjdGl2ZSB2b2x1bWUgZ3JvdXBzCithcmUgc3ViamVjdCB0byBjaGFuZ2VzIGFuZCBhbGxvdyBhY2Nlc3MgdG8gdGhlaXIgbG9naWNhbCB2b2x1bWVzLgorW05vdCB5ZXQgaW1wbGVtZW50ZWQ6IER1cmluZyB2b2x1bWUgZ3JvdXAgYWN0aXZhdGlvbiwgaWYKKy5CIHZnY2hhbmdlCityZWNvZ25pemVzIHNuYXBzaG90IGxvZ2ljYWwgdm9sdW1lcyB3aGljaCB3ZXJlIGRyb3BwZWQgYmVjYXVzZSB0aGV5IHJhbgorb3V0IG9mIHNwYWNlLCBpdCBkaXNwbGF5cyBhIG1lc3NhZ2UgaW5mb3JtaW5nIHRoZSBhZG1pbmlzdHJhdG9yIHRoYXQgc3VjaAorc25hcHNob3RzIHNob3VsZCBiZSByZW1vdmVkIChzZWUKKy5CUiBsdnJlbW92ZSAoOCkpLgorXQorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1BICIsICIgXC1cLWF1dG9iYWNrdXAgIiB7IiBcZkl5IHwgXGZJbiB9CitDb250cm9scyBhdXRvbWF0aWMgYmFja3VwIG9mIG1ldGFkYXRhIGFmdGVyIHRoZSBjaGFuZ2UuICBTZWUKKy5CUiB2Z2NmZ2JhY2t1cCAoOCkuCitEZWZhdWx0IGlzIHllcy4KKy5UUAorLkJSIFwtYSAiLCAiIFwtXC1hY3RpdmF0ZSAiIFsiIFxmSWEgfCBcZkllIHwgXGZJcyB8IFxmSWwgXXsgXGZJeSB8IFxmSW4gfQorQ29udHJvbHMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgbG9naWNhbCB2b2x1bWVzIGluIHRoZSB2b2x1bWUKK2dyb3VwIGZvciBpbnB1dC9vdXRwdXQuCitJbiBvdGhlciB3b3JkcywgbWFrZXMgdGhlIGxvZ2ljYWwgdm9sdW1lcyBrbm93bi91bmtub3duIHRvIHRoZSBrZXJuZWwuCitJZiBhdXRvYWN0aXZhdGlvbiBvcHRpb24gaXMgdXNlZCAoXC1hYXkpLCBlYWNoIGxvZ2ljYWwgdm9sdW1lIGluCit0aGUgdm9sdW1lIGdyb3VwIGlzIGFjdGl2YXRlZCBvbmx5IGlmIGl0IG1hdGNoZXMgYW4gaXRlbSBpbiB0aGUKK2FjdGl2YXRpb24vYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0IHNldCBpbiBsdm0uY29uZi4gSWYgdGhpcworbGlzdCBpcyBub3Qgc2V0LCB0aGVuIGFsbCB2b2x1bWVzIGFyZSBjb25zaWRlcmVkIGZvciBhY3RpdmF0aW9uLgorVGhlIFwtYWF5IG9wdGlvbiBzaG91bGQgYmUgYWxzbyB1c2VkIGR1cmluZyBzeXN0ZW0gYm9vdCBzbyBpdCdzCitwb3NzaWJsZSB0byBzZWxlY3Qgd2hpY2ggdm9sdW1lcyB0byBhY3RpdmF0ZSB1c2luZyB0aGUKK2FjdGl2YXRpb24vYXV0b19hY3RpdmF0aW9uX3ZvbHVtZV9saXN0IHNldHR0aW5nLgorLklQCitBY3RpdmF0aW9uIG9mIGEgbG9naWNhbCB2b2x1bWUgY3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgCisvZGV2L1ZvbHVtZUdyb3VwTmFtZS9Mb2dpY2FsVm9sdW1lTmFtZSBwb2ludGluZyB0byB0aGUgZGV2aWNlIG5vZGUuCitUaGlzIGxpbmsgaXMgcmVtb3ZlZCBvbiBkZWFjdGl2YXRpb24uCitBbGwgc29mdHdhcmUgYW5kIHNjcmlwdHMgc2hvdWxkIGFjY2VzcyB0aGUgZGV2aWNlIHRocm91Z2gKK3RoaXMgc3ltYm9saWMgbGluayBhbmQgcHJlc2VudCB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuCitUaGUgbG9jYXRpb24gYW5kIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlIG5vZGUgbWF5IGRlcGVuZCBvbiAgIAordGhlIGRpc3RyaWJ1dGlvbiBhbmQgY29uZmlndXJhdGlvbiAoZS5nLiB1ZGV2KSBhbmQgbWlnaHQgY2hhbmdlIAorZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCisuSVAKK0luIGEgY2x1c3RlcmVkIFZHLCBjbHZtZCBpcyB1c2VkIGZvciBhY3RpdmF0aW9uLCBhbmQgdGhlCitmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcG9zc2libGU6CisKK1dpdGggXC1hZXksIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gZXhjbHVzaXZlIG1vZGUKKyh3aXRoIGFuIGV4Y2x1c2l2ZSBsb2NrKSwgYWxsb3dpbmcgYSBzaW5nbGUgbm9kZSB0byBhY3RpdmF0ZSB0aGUgTFYuCisKK1dpdGggXC1hc3ksIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gc2hhcmVkIG1vZGUKKyh3aXRoIGEgc2hhcmVkIGxvY2spLCBhbGxvd2luZyBtdWx0aXBsZSBub2RlcyB0byBhY3RpdmF0ZSB0aGUgTFYgY29uY3VycmVudGx5LgorSWYgdGhlIExWIHR5cGUgcHJvaGliaXRzIHNoYXJlZCBhY2Nlc3MsIHN1Y2ggYXMgYW4gTFYgd2l0aCBhIHNuYXBzaG90LAordGhlICdzJyBvcHRpb24gaXMgaWdub3JlZCBhbmQgYW4gZXhjbHVzaXZlIGxvY2sgaXMgdXNlZC4KKworV2l0aCBcLWF5IChubyBtb2RlIHNwZWNpZmllZCksIGNsdm1kIGFjdGl2YXRlcyB0aGUgTFYgaW4gc2hhcmVkIG1vZGUKK2lmIHRoZSBMViB0eXBlIGFsbG93cyBjb25jdXJyZW50IGFjY2Vzcywgc3VjaCBhcyBhIGxpbmVhciBMVi4KK090aGVyd2lzZSwgY2x2bWQgYWN0aXZhdGVzIHRoZSBMViBpbiBleGNsdXNpdmUgbW9kZS4KKworV2l0aCBcLWFleSwgXC1hc3ksIGFuZCBcLWF5LCBjbHZtZCBhdHRlbXB0cyB0byBhY3RpdmF0ZSB0aGUgTFYKK29uIGFsbCBub2Rlcy4gIElmIGV4Y2x1c2l2ZSBtb2RlIGlzIHVzZWQsIHRoZW4gb25seSBvbmUgb2YgdGhlCitub2RlcyB3aWxsIGJlIHN1Y2Nlc3NmdWwuCisKK1dpdGggXC1hbiwgY2x2bWQgYXR0ZW1wdHMgdG8gZGVhY3RpdmF0ZSB0aGUgTFYgb24gYWxsIG5vZGVzLgorCitXaXRoIFwtYWx5LCBjbHZtZCBhY3RpdmF0ZXMgdGhlIExWIG9ubHkgb24gdGhlIGxvY2FsIG5vZGUsIGFuZCBcLWFsbgorZGVhY3RpdmF0ZXMgb25seSBvbiB0aGUgbG9jYWwgbm9kZS4gIElmIHRoZSBMViB0eXBlIGFsbG93cyBjb25jdXJyZW50CithY2Nlc3MsIHRoZW4gc2hhcmVkIG1vZGUgaXMgdXNlZCwgb3RoZXJ3aXNlIGV4Y2x1c2l2ZS4KKworTFZzIHdpdGggc25hcHNob3RzIGFyZSBhbHdheXMgYWN0aXZhdGVkIGV4Y2x1c2l2ZWx5IGJlY2F1c2UgdGhleSBjYW4gb25seQorYmUgdXNlZCBvbiBvbmUgbm9kZSBhdCBvbmNlLgorCitGb3IgbG9jYWwgVkdzLCBcLWF5LCBcLWFleSwgYW5kIFwtYXN5IGFyZSBhbGwgZXF1aXZhbGVudC4KKy5JUAorSW4gYSBzaGFyZWQgVkcsIGx2bWxvY2tkIGlzIHVzZWQgZm9yIGxvY2tpbmcgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2QKK3N1cHBvcnQsIGFuZCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHBvc3NpYmxlOgorCitXaXRoIFwtYWV5LCB0aGUgY29tbWFuZCBhY3RpdmF0ZXMgdGhlIExWIGluIGV4Y2x1c2l2ZSBtb2RlLCBhbGxvd2luZyBhCitzaW5nbGUgaG9zdCB0byBhY3RpdmF0ZSB0aGUgTFYgKHRoZSBob3N0IHJ1bm5pbmcgdGhlIGNvbW1hbmQpLiAgQmVmb3JlCithY3RpdmF0aW5nIHRoZSBMViwgdGhlIGNvbW1hbmQgdXNlcyBsdm1sb2NrZCB0byBhY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrCitvbiB0aGUgTFYuICBJZiB0aGUgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQsIHRoZSBMViBpcyBub3QgYWN0aXZhdGVkIGFuZCBhbgorZXJyb3IgaXMgcmVwb3J0ZWQuICBUaGlzIHdvdWxkIGhhcHBlbiBpZiB0aGUgTFYgaXMgYWN0aXZlIG9uIGFub3RoZXIgaG9zdC4KKworV2l0aCBcLWFzeSwgdGhlIGNvbW1hbmQgYWN0aXZhdGVzIHRoZSBMViBpbiBzaGFyZWQgbW9kZSwgYWxsb3dpbmcgbXVsdGlwbGUKK2hvc3RzIHRvIGFjdGl2YXRlIHRoZSBMViBjb25jdXJyZW50bHkuICBCZWZvcmUgYWN0aXZhdGluZyB0aGUgTFYsIHRoZQorY29tbWFuZCB1c2VzIGx2bWxvY2tkIHRvIGFjcXVpcmUgYSBzaGFyZWQgbG9jayBvbiB0aGUgTFYuICBJZiB0aGUgbG9jaworY2Fubm90IGJlIGFjcXVpcmVkLCB0aGUgTFYgaXMgbm90IGFjdGl2YXRlZCBhbmQgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuCitUaGlzIHdvdWxkIGhhcHBlbiBpZiB0aGUgTFYgaXMgYWN0aXZlIGV4Y2x1c2l2ZWx5IG9uIGFub3RoZXIgaG9zdC4gIElmIHRoZQorTFYgdHlwZSBwcm9oaWJpdHMgc2hhcmVkIGFjY2Vzcywgc3VjaCBhcyBhIHNuYXBzaG90LCB0aGUgY29tbWFuZCB3aWxsCityZXBvcnQgYW4gZXJyb3IgYW5kIGZhaWwuCisKK1dpdGggXC1hbiwgdGhlIGNvbW1hbmQgZGVhY3RpdmF0ZXMgdGhlIExWIG9uIHRoZSBob3N0IHJ1bm5pbmcgdGhlIGNvbW1hbmQuCitBZnRlciBkZWFjdGl2YXRpbmcgdGhlIExWLCB0aGUgY29tbWFuZCB1c2VzIGx2bWxvY2tkIHRvIHJlbGVhc2UgdGhlCitjdXJyZW50IGxvY2sgb24gdGhlIExWLgorCitXaXRoIGx2bWxvY2tkLCBhbiB1bnNwZWNpZmllZCBtb2RlIGlzIGFsd2F5cyBleGNsdXNpdmUsIFwtYXkgZGVmYXVsdHMgdG8KK1wtYWV5LgorCisuVFAKKy5CUiBcLVwtYWN0aXZhdGlvbm1vZGUgIiB7IiBcZkljb21wbGV0ZSB8IFxmSWRlZ3JhZGVkIHwgXGZJcGFydGlhbCB9CitUaGUgYWN0aXZhdGlvbiBtb2RlIGRldGVybWluZXMgd2hldGhlciBsb2dpY2FsIHZvbHVtZXMgYXJlIGFsbG93ZWQgdG8KK2FjdGl2YXRlIHdoZW4gdGhlcmUgYXJlIHBoeXNpY2FsIHZvbHVtZXMgbWlzc2luZyAoZS5nLiBkdWUgdG8gYSBkZXZpY2UKK2ZhaWx1cmUpLiAgXGZJY29tcGxldGVcZlAgaXMgdGhlIG1vc3QgcmVzdHJpY3RpdmU7IGFsbG93aW5nIG9ubHkgdGhvc2UKK2xvZ2ljYWwgdm9sdW1lcyB0byBiZSBhY3RpdmF0ZWQgdGhhdCBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoZSBtaXNzaW5nCitQVnMuICBcZklkZWdyYWRlZFxmUCBhbGxvd3MgUkFJRCBsb2dpY2FsIHZvbHVtZXMgdG8gYmUgYWN0aXZhdGVkIGV2ZW4gaWYKK3RoZXkgaGF2ZSBQVnMgbWlzc2luZy4gIChOb3RlIHRoYXQgdGhlICJtaXJyb3IiIHNlZ21lbnQgdHlwZSBpcyBub3QKK2NvbnNpZGVyZWQgYSBSQUlEIGxvZ2ljYWwgdm9sdW1lLiAgVGhlICJyYWlkMSIgc2VnbWVudCB0eXBlIHNob3VsZAorYmUgdXNlZCBpbnN0ZWFkLikgIEZpbmFsbHksIFxmSXBhcnRpYWxcZlAgYWxsb3dzIGFueSBsb2dpY2FsIHZvbHVtZSB0bworYmUgYWN0aXZhdGVkIGV2ZW4gaWYgcG9ydGlvbnMgYXJlIG1pc3NpbmcgZHVlIHRvIGEgbWlzc2luZyBvciBmYWlsZWQKK1BWLiAgVGhpcyBsYXN0IG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcGVyZm9ybWluZyByZWNvdmVyeSBvcgorcmVwYWlyIG9wZXJhdGlvbnMuICBcZklkZWdyYWRlZFxmUCBpcyB0aGUgZGVmYXVsdCBtb2RlLiAgVG8gY2hhbmdlIGl0LCBtb2RpZnkKKy5CIGFjdGl2YXRpb25fbW9kZQoraW4KKy5CUiBsdm0uY29uZiAoNSkuCisuVFAKKy5CUiBcLUsgIiwgIiBcLVwtaWdub3JlYWN0aXZhdGlvbnNraXAKK0lnbm9yZSB0aGUgZmxhZyB0byBza2lwIExvZ2ljYWwgVm9sdW1lcyBkdXJpbmcgYWN0aXZhdGlvbi4KKy5UUAorLkJSIFwtYyAiLCAiIFwtXC1jbHVzdGVyZWQgIiB7IiBcZkl5IHwgXGZJbiB9CitJZiBjbHVzdGVyZWQgbG9ja2luZyBpcyBlbmFibGVkLCB0aGlzIGluZGljYXRlcyB3aGV0aGVyIHRoaXMKK1ZvbHVtZSBHcm91cCBpcyBzaGFyZWQgd2l0aCBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlciBvciB3aGV0aGVyCitpdCBjb250YWlucyBvbmx5IGxvY2FsIGRpc2tzIHRoYXQgYXJlIG5vdCB2aXNpYmxlIG9uIHRoZSBvdGhlciBub2Rlcy4KK0lmIHRoZSBjbHVzdGVyIGluZnJhc3RydWN0dXJlIGlzIHVuYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciBub2RlIGF0IGEKK3BhcnRpY3VsYXIgdGltZSwgeW91IG1heSBzdGlsbCBiZSBhYmxlIHRvIHVzZSBWb2x1bWUgR3JvdXBzIHRoYXQKK2FyZSBub3QgbWFya2VkIGFzIGNsdXN0ZXJlZC4KKy5UUAorLkJSIFwtXC1kZXRhY2hwcm9maWxlCitEZXRhY2ggYW55IG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gcHJvZmlsZXMgYXR0YWNoZWQgdG8gZ2l2ZW4KK1ZvbHVtZSBHcm91cHMuIFNlZSBcZkJsdm0uY29uZlxmUCg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgXGZCbWV0YWRhdGEgcHJvZmlsZXNcZlAuCisuVFAKKy5CUiBcLXUgIiwgIiBcLVwtdXVpZAorR2VuZXJhdGUgbmV3IHJhbmRvbSBVVUlEIGZvciBzcGVjaWZpZWQgVm9sdW1lIEdyb3Vwcy4KKy5UUAorLkJSIFwtXC1tb25pdG9yICIgeyIgXGZJeSB8IFxmSW4gfQorU3RhcnQgb3Igc3RvcCBtb25pdG9yaW5nIGEgbWlycm9yZWQgb3Igc25hcHNob3QgbG9naWNhbCB2b2x1bWUgd2l0aAorZG1ldmVudGQsIGlmIGl0IGlzIGluc3RhbGxlZC4KK0lmIGEgZGV2aWNlIHVzZWQgYnkgYSBtb25pdG9yZWQgbWlycm9yIHJlcG9ydHMgYW4gSS9PIGVycm9yLAordGhlIGZhaWx1cmUgaXMgaGFuZGxlZCBhY2NvcmRpbmcgdG8KKy5CIG1pcnJvcl9pbWFnZV9mYXVsdF9wb2xpY3kKK2FuZAorLkIgbWlycm9yX2xvZ19mYXVsdF9wb2xpY3kKK3NldCBpbgorLkJSIGx2bS5jb25mICg1KS4KKy5UUAorLkJSIFwtXC1wb2xsICIgeyIgXGZJeSB8IFxmSW4gfQorV2l0aG91dCBwb2xsaW5nIGEgbG9naWNhbCB2b2x1bWUncyBiYWNrZ3JvdW5kZWQgdHJhbnNmb3JtYXRpb24gcHJvY2Vzcword2lsbCBuZXZlciBjb21wbGV0ZS4gIElmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgcHZtb3ZlIG9yIGx2Y29udmVydCAoZm9yCitleGFtcGxlLCBvbiByZWJvb3RpbmcgYWZ0ZXIgYSBjcmFzaCksIHVzZSBcZkJcLVwtcG9sbCB5XGZQIHRvIHJlc3RhcnQgdGhlCitwcm9jZXNzIGZyb20gaXRzIGxhc3QgY2hlY2twb2ludC4gIEhvd2V2ZXIsIGl0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgdG8KK2ltbWVkaWF0ZWx5IHBvbGwgYSBsb2dpY2FsIHZvbHVtZSB3aGVuIGl0IGlzIGFjdGl2YXRlZCwgdXNlIAorXGZCXC1cLXBvbGwgblxmUCB0byBkZWZlciBhbmQgdGhlbiBcZkJcLVwtcG9sbCB5XGZQIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3MuCisuVFAKKy5CUiBcLVwtc3lzaW5pdAorSW5kaWNhdGVzIHRoYXQgdmdjaGFuZ2UoOCkgaXMgYmVpbmcgaW52b2tlZCBmcm9tIGVhcmx5IHN5c3RlbSBpbml0aWFsaXNhdGlvbgorc2NyaXB0cyAoZS5nLiByYy5zeXNpbml0IG9yIGFuIGluaXRyZCksIGJlZm9yZSB3cml0ZWFibGUgZmlsZXN5c3RlbXMgYXJlCithdmFpbGFibGUuIEFzIHN1Y2gsIHNvbWUgZnVuY3Rpb25hbGl0eSBuZWVkcyB0byBiZSBkaXNhYmxlZCBhbmQgdGhpcyBvcHRpb24KK2FjdHMgYXMgYSBzaG9ydGN1dCB3aGljaCBzZWxlY3RzIGFuIGFwcHJvcHJpYXRlIHNldCBvZiBvcHRpb25zLiBDdXJyZW50bHkKK3RoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZworLkJSIFwtXC1pZ25vcmVsb2NraW5nZmFpbHVyZSAsCisuQlIgXC1cLWlnbm9yZW1vbml0b3JpbmcgLAorLkIgXC1cLXBvbGwgbgorYW5kIHNldHRpbmcgXGZCTFZNX1NVUFBSRVNTX0xPQ0tJTkdfRkFJTFVSRV9NRVNTQUdFU1xmUAorZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK0lmIFxmQlwtXC1zeXNpbml0XGZQIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBsdm1ldGFkKDgpIGVuYWJsZWQgYW5kIHJ1bm5pbmcsCithdXRvYWN0aXZhdGlvbiBpcyBwcmVmZXJyZWQgb3ZlciBtYW51YWwgYWN0aXZhdGlvbiB2aWEgZGlyZWN0IHZnY2hhbmdlIGNhbGwuCitMb2dpY2FsIHZvbHVtZXMgYXJlIGF1dG9hY3RpdmF0ZWQgYWNjb3JkaW5nIHRvIGF1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdAorc2V0IGluIGx2bS5jb25mKDUpLgorLlRQCisuQlIgXC1cLW5vdWRldnN5bmMKK0Rpc2FibGUgdWRldiBzeW5jaHJvbmlzYXRpb24uIFRoZQorcHJvY2VzcyB3aWxsIG5vdCB3YWl0IGZvciBub3RpZmljYXRpb24gZnJvbSB1ZGV2LgorSXQgd2lsbCBjb250aW51ZSBpcnJlc3BlY3RpdmUgb2YgYW55IHBvc3NpYmxlIHVkZXYgcHJvY2Vzc2luZworaW4gdGhlIGJhY2tncm91bmQuICBZb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgaWYgdWRldiBpcyBub3QgcnVubmluZworb3IgaGFzIHJ1bGVzIHRoYXQgaWdub3JlIHRoZSBkZXZpY2VzIExWTTIgY3JlYXRlcy4KKy5UUAorLkJSIFwtXC1pZ25vcmVtb25pdG9yaW5nCitNYWtlIG5vIGF0dGVtcHQgdG8gaW50ZXJhY3Qgd2l0aCBkbWV2ZW50ZCB1bmxlc3MKKy5CUiBcLVwtbW9uaXRvcgoraXMgc3BlY2lmaWVkLgorRG8gbm90IHVzZSB0aGlzIGlmIGRtZXZlbnRkIGlzIGFscmVhZHkgbW9uaXRvcmluZyBhIGRldmljZS4KKy5UUAorLkJSIFwtXC1sb2NrXC1zdGFydAorU3RhcnQgdGhlIGxvY2tzcGFjZSBvZiBhIHNoYXJlZCBWRyBpbiBsdm1sb2NrZC4gIGx2bWxvY2tkIGxvY2tzIGJlY29tZXMKK2F2YWlsYWJsZSBmb3IgdGhlIFZHLCBhbGxvd2luZyBMVk0gdG8gdXNlIHRoZSBWRy4gIFNlZQorLkJSIGx2bWxvY2tkICg4KS4KKy5UUAorLkJSIFwtXC1sb2NrXC1zdG9wCitTdG9wIHRoZSBsb2Nrc3BhY2Ugb2YgYSBzaGFyZWQgVkcgaW4gbHZtbG9ja2QuICBsdm1sb2NrZCBsb2NrcyBiZWNvbWUKK3VuYXZhaWxhYmxlIGZvciB0aGUgVkcsIHByZXZlbnRpbmcgTFZNIGZyb20gdXNpbmcgdGhlIFZHLiAgU2VlCisuQlIgbHZtbG9ja2QgKDgpLgorLlRQCisuQlIgXC1cLWxvY2tcLXR5cGUgIiAiIFxmSUxvY2tUeXBlCitDaGFuZ2UgdGhlIFZHIGxvY2sgdHlwZSB0byBvciBmcm9tIGEgc2hhcmVkIGxvY2sgdHlwZSB1c2VkIHdpdGggbHZtbG9ja2QuICBTZWUKKy5CUiBsdm1sb2NrZCAoOCkuCisuVFAKKy5CUiBcLWwgIiwgIiBcLVwtbG9naWNhbHZvbHVtZSAiICIgXGZJTWF4TG9naWNhbFZvbHVtZXMKK0NoYW5nZXMgdGhlIG1heGltdW0gbG9naWNhbCB2b2x1bWUgbnVtYmVyIG9mIGFuIGV4aXN0aW5nIGluYWN0aXZlCit2b2x1bWUgZ3JvdXAuCisuVFAKKy5CUiBcLXAgIiwgIiBcLVwtbWF4cGh5c2ljYWx2b2x1bWVzICIgIiBcZklNYXhQaHlzaWNhbFZvbHVtZXMKK0NoYW5nZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgdGhhdCBjYW4gYmVsb25nCit0byB0aGlzIHZvbHVtZSBncm91cC4KK0ZvciB2b2x1bWUgZ3JvdXBzIHdpdGggbWV0YWRhdGEgaW4gbHZtMSBmb3JtYXQsIHRoZSBsaW1pdCBpcyAyNTUuCitJZiB0aGUgbWV0YWRhdGEgdXNlcyBsdm0yIGZvcm1hdCwgdGhlIHZhbHVlIDAgcmVtb3ZlcyB0aGlzIHJlc3RyaWN0aW9uOgordGhlcmUgaXMgdGhlbiBubyBsaW1pdC4gIElmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgaW4KK2Egdm9sdW1lIGdyb3VwIHdpdGggbWV0YWRhdGEgaW4gbHZtMiBmb3JtYXQsIGZvciB0b29sIHBlcmZvcm1hbmNlIHJlYXNvbnMsCit5b3Ugc2hvdWxkIGNvbnNpZGVyIHNvbWUgdXNlIG9mIFxmQlwtXC1wdm1ldGFkYXRhY29waWVzIDBcZlAgYXMgZGVzY3JpYmVkIGluCitcZkJwdmNyZWF0ZSg4KVxmUCwgYW5kL29yIHVzZSBcZkJcLVwtdmdtZXRhZGF0YWNvcGllc1xmUC4KKy5UUAorLkJSIFwtXC1tZXRhZGF0YXByb2ZpbGUgIiAiIFxmSVByb2ZpbGVOYW1lCitVc2VzIGFuZCBhdHRhY2hlcyBQcm9maWxlTmFtZSBjb25maWd1cmF0aW9uIHByb2ZpbGUgdG8gdGhlIHZvbHVtZSBncm91cAorbWV0YWRhdGEuIFdoZW5ldmVyIHRoZSB2b2x1bWUgZ3JvdXAgaXMgcHJvY2Vzc2VkIG5leHQgdGltZSwgdGhlIHByb2ZpbGUKK2lzIGF1dG9tYXRpY2FsbHkgYXBwbGllZC4gVGhlIHByb2ZpbGUgaXMgaW5oZXJpdGVkIGJ5IGFsbCBsb2dpY2FsIHZvbHVtZXMKK2luIHRoZSB2b2x1bWUgZ3JvdXAgdW5sZXNzIHRoZSBsb2dpY2FsIHZvbHVtZSBpdHNlbGYgaGFzIGl0cyBvd24gcHJvZmlsZQorYXR0YWNoZWQuIFNlZSBcZkJsdm0uY29uZlxmUCg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBcZkJtZXRhZGF0YSBwcm9maWxlc1xmUC4KKy5UUAorLkJSIFwtXC0gWyB2ZyBdIG1ldGFkYXRhY29waWVzICIgIiBcZklOdW1iZXJPZkNvcGllcyB8IFxmSXVubWFuYWdlZCB8IFxmSWFsbAorU2V0cyB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbWV0YWRhdGEgY29waWVzIGluIHRoZSB2b2x1bWUgZ3JvdXAuICBJZiBzZXQgdG8KK2Egbm9uLXplcm8gdmFsdWUsIExWTSB3aWxsIGF1dG9tYXRpY2FsbHkgbWFuYWdlIHRoZSAnbWV0YWRhdGFpZ25vcmUnCitmbGFncyBvbiB0aGUgcGh5c2ljYWwgdm9sdW1lcyAoc2VlIFxmQnB2Y2hhbmdlXGZQIG9yIFxmQnB2Y3JlYXRlIFwtXC1tZXRhZGF0YWlnbm9yZVxmUCkgaW4gb3JkZXIKK3RvIGFjaGlldmUgXGZJTnVtYmVyT2ZDb3BpZXNcZlAgY29waWVzIG9mIG1ldGFkYXRhLiAgSWYgc2V0IHRvIFxmSXVubWFuYWdlZFxmUCwKK0xWTSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IG1hbmFnZSB0aGUgJ21ldGFkYXRhaWdub3JlJyBmbGFncy4gIElmIHNldCB0bworXGZJYWxsXGZQLCBMVk0gd2lsbCBmaXJzdCBjbGVhciBhbGwgb2YgdGhlICdtZXRhZGF0YWlnbm9yZScgZmxhZ3Mgb24gYWxsCittZXRhZGF0YSBhcmVhcyBpbiB0aGUgdm9sdW1lIGdyb3VwLCB0aGVuIHNldCB0aGUgdmFsdWUgdG8gXGZJdW5tYW5hZ2VkXGZQLgorVGhlIFxmQnZnbWV0YWRhdGFjb3BpZXNcZlAgb3B0aW9uIGlzIHVzZWZ1bCBmb3Igdm9sdW1lIGdyb3VwcyBjb250YWluaW5nCitsYXJnZSBudW1iZXJzIG9mIHBoeXNpY2FsIHZvbHVtZXMgd2l0aCBtZXRhZGF0YSBhcyBpdCBtYXkgYmUgdXNlZCB0bworbWluaW1pemUgbWV0YWRhdGEgcmVhZCBhbmQgd3JpdGUgb3ZlcmhlYWQuCisuVFAKKy5CUiBcLXMgIiwgIiBcLVwtcGh5c2ljYWxleHRlbnRzaXplICIgIiBcZklQaHlzaWNhbEV4dGVudFNpemUgWyBcZklCYkJzU2tLbU1nR3RUcFBlRSBdCitDaGFuZ2VzIHRoZSBwaHlzaWNhbCBleHRlbnQgc2l6ZSBvbiBwaHlzaWNhbCB2b2x1bWVzIG9mIHRoaXMgdm9sdW1lIGdyb3VwLgorQSBzaXplIHN1ZmZpeCAoayBmb3Iga2lsb2J5dGVzIHVwIHRvIHQgZm9yIHRlcmFieXRlcykgaXMgb3B0aW9uYWwsIG1lZ2FieXRlcworaXMgdGhlIGRlZmF1bHQgaWYgbm8gc3VmZml4IGlzIHByZXNlbnQuICBGb3IgTFZNMiBmb3JtYXQsIHRoZSB2YWx1ZSBtdXN0IGJlIGEKK3Bvd2VyIG9mIDIgb2YgYXQgbGVhc3QgMSBzZWN0b3IgKHdoZXJlIHRoZSBzZWN0b3Igc2l6ZSBpcyB0aGUgbGFyZ2VzdCBzZWN0b3IKK3NpemUgb2YgdGhlIFBWcyBjdXJyZW50bHkgdXNlZCBpbiB0aGUgVkcpIG9yLCBpZiBub3QgYSBwb3dlciBvZiAyLCBhdCBsZWFzdAorMTI4S2lCLiAgRm9yIHRoZSBvbGRlciBMVk0xIGZvcm1hdCwgaXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgb2YgYXQgbGVhc3QgOEtpQi4KK1RoZSBkZWZhdWx0IGlzIDQgTWlCLgorCitCZWZvcmUgaW5jcmVhc2luZyB0aGUgcGh5c2ljYWwgZXh0ZW50IHNpemUsIHlvdSBtaWdodCBuZWVkIHRvIHVzZSBsdnJlc2l6ZSwKK3B2cmVzaXplIGFuZC9vciBwdm1vdmUgc28gdGhhdCBldmVyeXRoaW5nIGZpdHMuICBGb3IgZXhhbXBsZSwgZXZlcnkKK2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXh0ZW50cyB1c2VkIGluIGEgbG9naWNhbCB2b2x1bWUgbXVzdCBzdGFydCBhbmQKK2VuZCBvbiBhbiBleHRlbnQgYm91bmRhcnkuCisKK0lmIHRoZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgdXNlcyBsdm0xIGZvcm1hdCwgZXh0ZW50cyBjYW4gdmFyeSBpbiBzaXplIGZyb20KKzhLaUIgdG8gMTZHaUIgYW5kIHRoZXJlIGlzIGEgbGltaXQgb2YgNjU1MzQgZXh0ZW50cyBpbiBlYWNoIGxvZ2ljYWwgdm9sdW1lLgorVGhlIGRlZmF1bHQgb2YgNCBNaUIgbGVhZHMgdG8gYSBtYXhpbXVtIGxvZ2ljYWwgdm9sdW1lIHNpemUgb2YgYXJvdW5kIDI1NkdpQi4KKworSWYgdGhlIHZvbHVtZSBncm91cCBtZXRhZGF0YSB1c2VzIGx2bTIgZm9ybWF0IHRob3NlIHJlc3RyaWN0aW9ucyBkbyBub3QgYXBwbHksCitidXQgaGF2aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIGV4dGVudHMgd2lsbCBzbG93IGRvd24gdGhlIHRvb2xzIGJ1dCBoYXZlIG5vCitpbXBhY3Qgb24gSS9PIHBlcmZvcm1hbmNlIHRvIHRoZSBsb2dpY2FsIHZvbHVtZS4gIFRoZSBzbWFsbGVzdCBQRSBpcyAxS2lCLgorCitUaGUgMi40IGtlcm5lbCBoYXMgYSBsaW1pdGF0aW9uIG9mIDJUaUIgcGVyIGJsb2NrIGRldmljZS4KKy5UUAorLkJSIFwtXC1zeXN0ZW1pZCAiICIgXGZJU3lzdGVtSUQKK0NoYW5nZXMgdGhlIHN5c3RlbSBJRCBvZiB0aGUgVkcuICBVc2luZyB0aGlzIG9wdGlvbiByZXF1aXJlcyBjYXV0aW9uCitiZWNhdXNlIHRoZSBWRyBtYXkgYmVjb21lIGZvcmVpZ24gdG8gdGhlIGhvc3QgcnVubmluZyB0aGUgY29tbWFuZCwKK2xlYXZpbmcgdGhlIGhvc3QgdW5hYmxlIHRvIGFjY2VzcyBpdC4gIFNlZQorLkJSIGx2bXN5c3RlbWlkICg3KS4KKy5UUAorLkJSIFwtXC1yZWZyZXNoCitJZiBhbnkgbG9naWNhbCB2b2x1bWUgaW4gdGhlIHZvbHVtZSBncm91cCBpcyBhY3RpdmUsIHJlbG9hZCBpdHMgbWV0YWRhdGEuCitUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaW4gbm9ybWFsIG9wZXJhdGlvbiwgYnV0IG1heSBiZSB1c2VmdWwKK2lmIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZyBvciBpZiB5b3UncmUgZG9pbmcgY2x1c3RlcmluZworbWFudWFsbHkgd2l0aG91dCBhIGNsdXN0ZXJlZCBsb2NrIG1hbmFnZXIuCisuVFAKKy5CUiBcLXggIiwgIiBcLVwtcmVzaXplYWJsZSAiIHsiIFxmSXkgfCBcZkluIH0KK0VuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGV4dGVuc2lvbi9yZWR1Y3Rpb24gb2YgdGhpcyB2b2x1bWUgZ3JvdXAKK3dpdGgvYnkgcGh5c2ljYWwgdm9sdW1lcy4KKy5TSCBFeGFtcGxlcworVG8gYWN0aXZhdGUgYWxsIGtub3duIHZvbHVtZSBncm91cHMgaW4gdGhlIHN5c3RlbToKKy5zcAorLkIgdmdjaGFuZ2UgXC1hIHkKKworVG8gY2hhbmdlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgb2YgaW5hY3RpdmUgdm9sdW1lIGdyb3VwCit2ZzAwIHRvIDEyOC4KKy5zcAorLkIgdmdjaGFuZ2UgXC1sIDEyOCAvZGV2L3ZnMDAKKworCisuU0ggU0VFIEFMU08KKy5CUiBsdmNoYW5nZSAoOCksCisuQlIgbHZtICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z2NrLjguaW4gYi9tYW4vdmdjay44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGY1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vdmdjay44LmluCkBAIC0wLDAgKzEsMjIgQEAKKy5USCBWR0NLIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdjayBcKGVtIGNoZWNrIHZvbHVtZSBncm91cCBtZXRhZGF0YQorLlNIIFNZTk9QU0lTCisuQiB2Z2NrCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC0/IHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkkgWyBWb2x1bWVHcm91cE5hbWUgLi4uXQorLlNIIERFU0NSSVBUSU9OCit2Z2NrIGNoZWNrcyBMVk0gbWV0YWRhdGEgZm9yIGVhY2ggbmFtZWQgdm9sdW1lIGdyb3VwIGZvciBjb25zaXN0ZW5jeS4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdjcmVhdGUgKDgpLAorLkJSIHZnY2hhbmdlICg4KSwKKy5CUiB2Z3NjYW4gKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdjb252ZXJ0LjguaW4gYi9tYW4vdmdjb252ZXJ0LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2NDQ4MwotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z2NvbnZlcnQuOC5pbgpAQCAtMCwwICsxLDQ4IEBACisuVEggVkdDT05WRVJUIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdjb252ZXJ0IFwtIGNvbnZlcnQgdm9sdW1lIGdyb3VwIG1ldGFkYXRhIGZvcm1hdAorLlNIIFNZTk9QU0lTCisuQiB2Z2NvbnZlcnQKKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtbGFiZWxzZWN0b3IgXQorLlJCIFsgXC1cLWJvb3Rsb2FkZXJhcmVhc2l6ZQorLklSIHNpemUgXQorLlJCIFsgXC1NIHwgXC1cLW1ldGFkYXRhdHlwZQorLklSIHR5cGUgXQorLlJCIFsgXC1cLXB2bWV0YWRhdGFjb3BpZXMKKy5JUiBOdW1iZXJPZkNvcGllcyBdCisuUkIgWyBcLVwtbWV0YWRhdGFzaXplCisuSVIgc2l6ZSBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5JIFZvbHVtZUdyb3VwTmFtZQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdjb252ZXJ0IGNvbnZlcnRzCisuSSBWb2x1bWVHcm91cE5hbWUKK21ldGFkYXRhIGZyb20gb25lIGZvcm1hdCB0byBhbm90aGVyIHByb3ZpZGVkIHRoYXQgdGhlIG1ldGFkYXRhCitmaXRzIGludG8gdGhlIHNhbWUgc3BhY2UuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBhbmQgXGZCcHZjcmVhdGVcZlAoOCkgZm9yIG9wdGlvbnMuCisuU0ggRXhhbXBsZXMKK0NvbnZlcnQgdm9sdW1lIGdyb3VwIHZnMSBmcm9tIExWTTEgbWV0YWRhdGEgZm9ybWF0IHRvIHRoZSBuZXcgTFZNMgorbWV0YWRhdGEgZm9ybWF0LgorLnNwCisuQiB2Z2NvbnZlcnQgXC1NMiB2ZzEKKy5TSCBSRUNPVkVSWQorVXNlIFxmQnB2c2NhblxmUCg4KSB0byBzZWUgd2hpY2ggUFZzIGxvc3QgdGhlaXIgbWV0YWRhdGEuCitSdW4gXGZCcHZjcmVhdGVcZlAoOCkgd2l0aCB0aGUgXGZCXC1cLXV1aWRcZlAgYW5kIFxmQlwtXC1yZXN0b3JlZmlsZVxmUAorb3B0aW9ucyBvbiBlYWNoIHN1Y2ggUFYgdG8gcmVmb3JtYXQgaXQgYXMgaXQgd2FzLCB1c2luZyB0aGUgYXJjaGl2ZQorZmlsZSB0aGF0IFxmQnZnY29udmVydFxmUCg4KSBjcmVhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvY2VkdXJlLgorRmluYWxseSBydW4gXGZCdmdjZmdyZXN0b3JlXGZQKDgpIHdpdGggdGhhdCBhcmNoaXZlIGZpbGUgdG8gcmVzdG9yZQordGhlIG9yaWdpbmFsIG1ldGFkYXRhLgorLlNIIFNFRSBBTFNPCisuQlIgbHZtICg4KSwKKy5CUiBwdmNyZWF0ZSAoOCksCisuQlIgdmdjZmdyZXN0b3JlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3ZnY3JlYXRlLjguaW4gYi9tYW4vdmdjcmVhdGUuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY3NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3ZnY3JlYXRlLjguaW4KQEAgLTAsMCArMSwxODcgQEAKKy5USCBWR0NSRUFURSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3ZnY3JlYXRlIFwoZW0gY3JlYXRlIGEgdm9sdW1lIGdyb3VwCisuU0ggU1lOT1BTSVMKKy5CIHZnY3JlYXRlCisuUkIgWyBcLVwtYWRkdGFnCisuSVIgVGFnIF0KKy5SQiBbIFwtXC1hbGxvYworLklSIEFsbG9jYXRpb25Qb2xpY3kgXQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLWMgfCBcLVwtY2x1c3RlcmVkCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtbCB8IFwtXC1tYXhsb2dpY2Fsdm9sdW1lcworLklSIE1heExvZ2ljYWxWb2x1bWVzIF0KKy5SQiBbIFwtTSB8IFwtXC1tZXRhZGF0YXR5cGUKKy5JUiB0eXBlIF0KKy5SQiBbIFwtXC1tZXRhZGF0YXByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLXAgfCBcLVwtbWF4cGh5c2ljYWx2b2x1bWVzCisuSVIgTWF4UGh5c2ljYWxWb2x1bWVzIF0KKy5SQiBbIFwtXC0gWyB2ZyBdIG1ldGFkYXRhY29waWVzCisuSVIgTnVtYmVyT2ZDb3BpZXMgfCB1bm1hbmFnZWQgfCBhbGwgXQorLlJCIFsgXC1zIHwgXC1cLXBoeXNpY2FsZXh0ZW50c2l6ZQorLklSIFBoeXNpY2FsRXh0ZW50U2l6ZSBbIGJCc1NrS21NZ0d0VHBQZUUgXV0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXNoYXJlZCBdCisuUkIgWyBcLVwtc3lzdGVtaWQKKy5JUiBTeXN0ZW1JRCBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkIgWyAiUEhZU0lDQUwgREVWSUNFIE9QVElPTlMiIF0KKy5JIFZvbHVtZUdyb3VwTmFtZSBQaHlzaWNhbERldmljZVBhdGgKKy5SSSBbIFBoeXNpY2FsRGV2aWNlUGF0aCAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3ZnY3JlYXRlIGNyZWF0ZXMgYSBuZXcgdm9sdW1lIGdyb3VwIGNhbGxlZAorLkkgVm9sdW1lR3JvdXBOYW1lCit1c2luZyB0aGUgYmxvY2sgc3BlY2lhbCBkZXZpY2UgXGZJUGh5c2ljYWxEZXZpY2VQYXRoXGZQLgorLnNwCitJZiBcZklQaHlzaWNhbERldmljZVBhdGhcZlAgd2FzIG5vdCBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgZm9yIExWTSB3aXRoCitcZkJwdmNyZWF0ZVxmUCg4KSwgdGhlIGRldmljZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUKK2RlZmF1bHQgdmFsdWVzIHVzZWQgd2l0aCBcZkJwdmNyZWF0ZVxmUCg4KS4gIElmIG5vbi1kZWZhdWx0CitcZlBwdmNyZWF0ZVxmUCB2YWx1ZXMgYXJlIGRlc2lyZWQsIHRoZXkgbWF5IGJlIGdpdmVuIG9uIHRoZQorY29tbWFuZGxpbmUgd2l0aCB0aGUgc2FtZSBvcHRpb25zIGFzIFxmQnB2Y3JlYXRlXGZQKDgpLiAgU2VlCisuQiBQSFlTSUNBTCBERVZJQ0UgT1BUSU9OUworZm9yIGF2YWlsYWJsZSBvcHRpb25zLiAgTm90ZSB0aGF0IHRoZSByZXN0b3JlLXJlbGF0ZWQgb3B0aW9ucyBzdWNoIGFzCisuQlIgXC1cLXJlc3RvcmVmaWxlICIsICIgXC1cLXV1aWQgIiBhbmQgIiBcLVwtcGh5c2ljYWx2b2x1bWVzaXplCithcmUgbm90IGF2YWlsYWJsZS4gIElmIGEgcmVzdG9yZSBvcGVyYXRpb24gaXMgbmVlZGVkLCB1c2UgCitcZkJwdmNyZWF0ZVxmUCg4KSBhbmQgXGZCdmdjZmdyZXN0b3JlXGZQKDgpLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQlIgXC1jICIsICIgXC1cLWNsdXN0ZXJlZCAiIHsiIFxmSXkgfCBcZkluIH0KK0lmIGNsdXN0ZXJlZCBsb2NraW5nIGlzIGVuYWJsZWQsIHRoaXMgZGVmYXVsdHMgdG8gXGZCeVxmUCBpbmRpY2F0aW5nIHRoYXQKK3RoaXMgVm9sdW1lIEdyb3VwIGlzIHNoYXJlZCB3aXRoIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorCitJZiB0aGUgbmV3IFZvbHVtZSBHcm91cCBjb250YWlucyBvbmx5IGxvY2FsIGRpc2tzIHRoYXQgYXJlIG5vdCB2aXNpYmxlCitvbiB0aGUgb3RoZXIgbm9kZXMsIHlvdSBtdXN0IHNwZWNpZnkgXGZCXC1cLWNsdXN0ZXJlZFwgblxmUC4KK0lmIHRoZSBjbHVzdGVyIGluZnJhc3RydWN0dXJlIGlzIHVuYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciBub2RlIGF0IGEKK3BhcnRpY3VsYXIgdGltZSwgeW91IG1heSBzdGlsbCBiZSBhYmxlIHRvIHVzZSBzdWNoIFZvbHVtZSBHcm91cHMuCisuVFAKKy5CUiBcLWwgIiwgIiBcLVwtbWF4bG9naWNhbHZvbHVtZXMgIiAiIFxmSU1heExvZ2ljYWxWb2x1bWVzCitTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgYWxsb3dlZCBpbiB0aGlzCit2b2x1bWUgZ3JvdXAuCitUaGUgc2V0dGluZyBjYW4gYmUgY2hhbmdlZCB3aXRoIFxmQnZnY2hhbmdlXGZQKDgpLgorRm9yIHZvbHVtZSBncm91cHMgd2l0aCBtZXRhZGF0YSBpbiBsdm0xIGZvcm1hdCwgdGhlIGxpbWl0CithbmQgZGVmYXVsdCB2YWx1ZSBpcyAyNTUuCitJZiB0aGUgbWV0YWRhdGEgdXNlcyBsdm0yIGZvcm1hdCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMAord2hpY2ggcmVtb3ZlcyB0aGlzIHJlc3RyaWN0aW9uOiB0aGVyZSBpcyB0aGVuIG5vIGxpbWl0LgorLlRQCisuQlIgXC1wICIsICIgXC1cLW1heHBoeXNpY2Fsdm9sdW1lcyAiICIgXGZJTWF4UGh5c2ljYWxWb2x1bWVzCitTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwaHlzaWNhbCB2b2x1bWVzIHRoYXQgY2FuIGJlbG9uZwordG8gdGhpcyB2b2x1bWUgZ3JvdXAuCitUaGUgc2V0dGluZyBjYW4gYmUgY2hhbmdlZCB3aXRoIFxmQnZnY2hhbmdlXGZQLgorRm9yIHZvbHVtZSBncm91cHMgd2l0aCBtZXRhZGF0YSBpbiBsdm0xIGZvcm1hdCwgdGhlIGxpbWl0CithbmQgZGVmYXVsdCB2YWx1ZSBpcyAyNTUuCitJZiB0aGUgbWV0YWRhdGEgdXNlcyBsdm0yIGZvcm1hdCwgdGhlIHZhbHVlIDAgcmVtb3ZlcyB0aGlzIHJlc3RyaWN0aW9uOgordGhlcmUgaXMgdGhlbiBubyBsaW1pdC4gIElmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgaW4KK2Egdm9sdW1lIGdyb3VwIHdpdGggbWV0YWRhdGEgaW4gbHZtMiBmb3JtYXQsIGZvciB0b29sIHBlcmZvcm1hbmNlIHJlYXNvbnMsCit5b3Ugc2hvdWxkIGNvbnNpZGVyIHNvbWUgdXNlIG9mIFxmQlwtXC1wdm1ldGFkYXRhY29waWVzIDBcZlAgYXMgZGVzY3JpYmVkIGluCitcZkJwdmNyZWF0ZVxmUCg4KSwgYW5kL29yIHVzZSBcZkJcLVwtdmdtZXRhZGF0YWNvcGllc1xmUC4KKy5UUAorLkJSIFwtXC0gWyB2ZyBdIG1ldGFkYXRhY29waWVzICIgIiBcZklOdW1iZXJPZkNvcGllcyB8IFxmSXVubWFuYWdlZCB8IFxmSWFsbAorU2V0cyB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbWV0YWRhdGEgY29waWVzIGluIHRoZSB2b2x1bWUgZ3JvdXAuICBJZiBzZXQgdG8KK2Egbm9uLXplcm8gdmFsdWUsIExWTSB3aWxsIGF1dG9tYXRpY2FsbHkgbWFuYWdlIHRoZSAnbWV0YWRhdGFpZ25vcmUnCitmbGFncyBvbiB0aGUgcGh5c2ljYWwgdm9sdW1lcyAoc2VlIFxmQnB2Y3JlYXRlXGZQKDgpIG9yCitcZkJwdmNoYW5nZSBcLVwtbWV0YWRhdGFpZ25vcmVcZlApIGluIG9yZGVyCit0byBhY2hpZXZlIFxmSU51bWJlck9mQ29waWVzXGZQIGNvcGllcyBvZiBtZXRhZGF0YS4gIElmIHNldCB0byBcZkl1bm1hbmFnZWRcZlAsCitMVk0gd2lsbCBub3QgYXV0b21hdGljYWxseSBtYW5hZ2UgdGhlICdtZXRhZGF0YWlnbm9yZScgZmxhZ3MuICBJZiBzZXQgdG8KK1xmSWFsbFxmUCwgTFZNIHdpbGwgZmlyc3QgY2xlYXIgYWxsIG9mIHRoZSAnbWV0YWRhdGFpZ25vcmUnIGZsYWdzIG9uIGFsbAorbWV0YWRhdGEgYXJlYXMgaW4gdGhlIHZvbHVtZSBncm91cCwgdGhlbiBzZXQgdGhlIHZhbHVlIHRvIFxmSXVubWFuYWdlZFxmUC4KK1RoZSBcZkJ2Z21ldGFkYXRhY29waWVzXGZQIG9wdGlvbiBpcyB1c2VmdWwgZm9yIHZvbHVtZSBncm91cHMgY29udGFpbmluZworbGFyZ2UgbnVtYmVycyBvZiBwaHlzaWNhbCB2b2x1bWVzIHdpdGggbWV0YWRhdGEgYXMgaXQgbWF5IGJlIHVzZWQgdG8KK21pbmltaXplIG1ldGFkYXRhIHJlYWQgYW5kIHdyaXRlIG92ZXJoZWFkLgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgXGZJdW5tYW5hZ2VkXGZQLgorLlRQCisuQlIgXC1cLW1ldGFkYXRhcHJvZmlsZSAiICIgXGZJUHJvZmlsZU5hbWUKK1VzZXMgYW5kIGF0dGFjaGVzIHRoZSBQcm9maWxlTmFtZSBjb25maWd1cmF0aW9uIHByb2ZpbGUgdG8gdGhlIHZvbHVtZSBncm91cAorbWV0YWRhdGEuIFdoZW5ldmVyIHRoZSB2b2x1bWUgZ3JvdXAgaXMgcHJvY2Vzc2VkIG5leHQgdGltZSwgdGhlIHByb2ZpbGUgaXMKK2F1dG9tYXRpY2FsbHkgYXBwbGllZC4gVGhlIHByb2ZpbGUgaXMgaW5oZXJpdGVkIGJ5IGFsbCBsb2dpY2FsIHZvbHVtZXMgaW4KK3RoZSB2b2x1bWUgZ3JvdXAgdW5sZXNzIHRoZSBsb2dpY2FsIHZvbHVtZSBpdHNlbGYgaGFzIGl0cyBvd24gcHJvZmlsZSBhdHRhY2hlZC4KK1NlZSBcZkJsdm0uY29uZlxmUCg1KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBcZkJtZXRhZGF0YSBwcm9maWxlc1xmUC4KKy5UUAorLkJSIFwtcyAiLCAiIFwtXC1waHlzaWNhbGV4dGVudHNpemUgIiAiIFxmSVBoeXNpY2FsRXh0ZW50U2l6ZSBbIFxmSWJCc1NrS21NZ0d0VHBQZUUgXQorU2V0cyB0aGUgcGh5c2ljYWwgZXh0ZW50IHNpemUgb24gcGh5c2ljYWwgdm9sdW1lcyBvZiB0aGlzIHZvbHVtZSBncm91cC4KK0Egc2l6ZSBzdWZmaXggKGsgZm9yIGtpbG9ieXRlcyB1cCB0byB0IGZvciB0ZXJhYnl0ZXMpIGlzIG9wdGlvbmFsLCBtZWdhYnl0ZXMKK2lzIHRoZSBkZWZhdWx0IGlmIG5vIHN1ZmZpeCBpcyBwcmVzZW50LiBGb3IgTFZNMiBmb3JtYXQsIHRoZSB2YWx1ZSBtdXN0IGJlIGEKK3Bvd2VyIG9mIDIgb2YgYXQgbGVhc3QgMSBzZWN0b3IgKHdoZXJlIHRoZSBzZWN0b3Igc2l6ZSBpcyB0aGUgbGFyZ2VzdCBzZWN0b3IKK3NpemUgb2YgdGhlIFBWcyBjdXJyZW50bHkgdXNlZCBpbiB0aGUgVkcpIG9yLCBpZiBub3QgYSBwb3dlciBvZiAyLCBhdCBsZWFzdAorMTI4S2lCLiAgRm9yIHRoZSBvbGRlciBMVk0xIGZvcm1hdCwgaXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgb2YgYXQgbGVhc3QgOEtpQi4KK1RoZSBkZWZhdWx0IGlzIDQgTWlCLgorT25jZSB0aGlzIHZhbHVlIGhhcyBiZWVuIHNldCwgaXQgaXMgZGlmZmljdWx0IHRvIGNoYW5nZSBpdCB3aXRob3V0IHJlY3JlYXRpbmcKK3RoZSB2b2x1bWUgZ3JvdXAgd2hpY2ggd291bGQgaW52b2x2ZSBiYWNraW5nIHVwIGFuZCByZXN0b3JpbmcgZGF0YSBvbiBhbnkKK2xvZ2ljYWwgdm9sdW1lcy4gIEhvd2V2ZXIsIGlmIG5vIGV4dGVudHMgbmVlZCBtb3ZpbmcgZm9yIHRoZSBuZXcKK3ZhbHVlIHRvIGFwcGx5LCBpdCBjYW4gYmUgYWx0ZXJlZCB1c2luZyBcZkJ2Z2NoYW5nZSBcLXNcZlAuCisKK0lmIHRoZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgdXNlcyBsdm0xIGZvcm1hdCwgZXh0ZW50cyBjYW4gdmFyeSBpbiBzaXplIGZyb20KKzhLaUIgdG8gMTZHaUIgYW5kIHRoZXJlIGlzIGEgbGltaXQgb2YgNjU1MzQgZXh0ZW50cyBpbiBlYWNoIGxvZ2ljYWwgdm9sdW1lLiAgVGhlCitkZWZhdWx0IG9mIDQgTWlCIGxlYWRzIHRvIGEgbWF4aW11bSBsb2dpY2FsIHZvbHVtZSBzaXplIG9mIGFyb3VuZCAyNTZHaUIuCisKK0lmIHRoZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgdXNlcyBsdm0yIGZvcm1hdCB0aG9zZSByZXN0cmljdGlvbnMgZG8gbm90IGFwcGx5LAorYnV0IGhhdmluZyBhIGxhcmdlIG51bWJlciBvZiBleHRlbnRzIHdpbGwgc2xvdyBkb3duIHRoZSB0b29scyBidXQgaGF2ZSBubworaW1wYWN0IG9uIEkvTyBwZXJmb3JtYW5jZSB0byB0aGUgbG9naWNhbCB2b2x1bWUuICBUaGUgc21hbGxlc3QgUEUgaXMgMUtpQgorCitUaGUgMi40IGtlcm5lbCBoYXMgYSBsaW1pdGF0aW9uIG9mIDJUaUIgcGVyIGJsb2NrIGRldmljZS4KKworLlRQCisuQiBcLVwtc2hhcmVkCitDcmVhdGUgYSBzaGFyZWQgVkcgdXNpbmcgbHZtbG9ja2QgaWYgTFZNIGlzIGNvbXBpbGVkIHdpdGggbG9ja2Qgc3VwcG9ydC4KKyBsdm1sb2NrZCB3aWxsIHNlbGVjdCBsb2NrIHR5cGUgc2FubG9jayBvciBkbG0gZGVwZW5kaW5nIG9uIHdoaWNoIGxvY2sKK21hbmFnZXIgaXMgcnVubmluZy4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIGhvc3RzIHRvIHNoYXJlIGEgVkcgb24gc2hhcmVkCitkZXZpY2VzLiAgbHZtbG9ja2QgYW5kIGEgbG9jayBtYW5hZ2VyIG11c3QgYmUgY29uZmlndXJlZCBhbmQgcnVubmluZy4gIFNlZQorLkJSIGx2bWxvY2tkICg4KS4KKworLlRQCisuQlIgXC1cLXN5c3RlbWlkICIgIiBcZklTeXN0ZW1JRAorU3BlY2lmaWVzIHRoZSBzeXN0ZW0gSUQgdGhhdCB3aWxsIGJlIGdpdmVuIHRvIHRoZSBuZXcgVkcsIG92ZXJyaWRpbmcgdGhlCitzeXN0ZW0gSUQgb2YgdGhlIGhvc3QgcnVubmluZyB0aGUgY29tbWFuZC4gIEEgVkcgaXMgbm9ybWFsbHkgY3JlYXRlZAord2l0aG91dCB0aGlzIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgbmV3IFZHIGlzIGdpdmVuIHRoZSBzeXN0ZW0gSUQgb2YKK3RoZSBob3N0IGNyZWF0aW5nIGl0LiAgVXNpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMgY2F1dGlvbiBiZWNhdXNlIHRoZQorc3lzdGVtIElEIG9mIHRoZSBuZXcgVkcgbWF5IG5vdCBtYXRjaCB0aGUgc3lzdGVtIElEIG9mIHRoZSBob3N0IHJ1bm5pbmcKK3RoZSBjb21tYW5kLCBsZWF2aW5nIHRoZSBWRyBpbmFjY2Vzc2libGUgdG8gdGhlIGhvc3QuICBTZWUKKy5CUiBsdm1zeXN0ZW1pZCAoNykuCisKKy5TSCBQSFlTSUNBTCBERVZJQ0UgT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGluaXRpYWxpemluZyBwaHlzaWNhbCBkZXZpY2VzIGluIHRoZQordm9sdW1lIGdyb3VwLiAgVGhlc2Ugb3B0aW9ucyBhcmUgZnVydGhlciBkZXNjcmliZWQgaW4gdGhlIFxmQnB2Y3JlYXRlXGZQKDgpCittYW4gcGFnZS4KKy5UUAorLkJSIFwtZiAiLCAiIFwtXC1mb3JjZQorLlRQCisuQlIgXC15ICIsICIgXC1cLXllcworLlRQCisuQlIgXC1aICIsICIgXC1cLXplcm8gIiB7IiBcZkl5IHwgXGZJbiB9CisuVFAKKy5CIFwtXC1sYWJlbHNlY3RvciBcZklzZWN0b3IKKy5UUAorLkIgXC1cLW1ldGFkYXRhc2l6ZSBcZklzaXplCisuVFAKKy5CIFwtXC1wdm1ldGFkYXRhY29waWVzIFxmSWNvcGllcworLlRQCisuQiBcLVwtZGF0YWFsaWdubWVudCBcZklhbGlnbm1lbnQKKy5UUAorLkIgXC1cLWRhdGFhbGlnbm1lbnRvZmZzZXQgXGZJYWxpZ25tZW50X29mZnNldAorLlNIIEV4YW1wbGVzCitDcmVhdGVzIGEgdm9sdW1lIGdyb3VwIG5hbWVkICJ0ZXN0X3ZnIiB1c2luZyBwaHlzaWNhbCB2b2x1bWVzICIvZGV2L3NkazEiCithbmQgIi9kZXYvc2RsMSIgd2l0aCBkZWZhdWx0IHBoeXNpY2FsIGV4dGVudCBzaXplIG9mIDRNaUI6Cisuc3AKKy5CIHZnY3JlYXRlIHRlc3RfdmcgL2Rldi9zZGsxIC9kZXYvc2RsMQorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHB2ZGlzcGxheSAoOCksCisuQlIgcHZjcmVhdGUgKDgpLAorLkJSIHZnZGlzcGxheSAoOCksCisuQlIgdmdleHRlbmQgKDgpLAorLkJSIHZncmVkdWNlICg4KSwKKy5CUiBsdmNyZWF0ZSAoOCksCisuQlIgbHZkaXNwbGF5ICg4KSwKKy5CUiBsdmV4dGVuZCAoOCksCisuQlIgbHZyZWR1Y2UgKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdkaXNwbGF5LjguaW4gYi9tYW4vdmdkaXNwbGF5LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1YTZhZQotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z2Rpc3BsYXkuOC5pbgpAQCAtMCwwICsxLDEyMyBAQAorLlRIIFZHRElTUExBWSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3ZnZGlzcGxheSBcKGVtIGRpc3BsYXkgYXR0cmlidXRlcyBvZiB2b2x1bWUgZ3JvdXBzCisuU0ggU1lOT1BTSVMKKy5CIHZnZGlzcGxheQorLlJCIFsgXC1BIHwgXC1cLWFjdGl2ZXZvbHVtZWdyb3VwcyBdCisuUkIgWyBcLWMgfCBcLVwtY29sb24gXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXMgfCBcLVwtc2hvcnQgXQorLlJCIFsgXC1TIHwgXC1cLXNlbGVjdAorLklSIFNlbGVjdGlvbiBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLWlnbm9yZWxvY2tpbmdmYWlsdXJlIF0KKy5SQiBbIFwtXC1pZ25vcmVza2lwcGVkY2x1c3RlciBdCisuUkIgWyBcLVwtbm9zdWZmaXggXQorLlJCIFsgXC1QIHwgXC1cLXBhcnRpYWwgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SSSBbIFZvbHVtZUdyb3VwTmFtZSAuLi5dCisuYnIKKworLmJyCisuQiB2Z2Rpc3BsYXkKKy5CUiBcLUMgfCBcLVwtY29sdW1ucworLlJCIFsgXC1cLWFsaWduZWQgXQorLlJCIFsgXC1cLWJpbmFyeSBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgW1sgXC1cLWNvbmZpZ3JlcG9ydAorLklSIFJlcG9ydE5hbWUgXQorLlJCIFsgXC1vIHwgXC1cLW9wdGlvbnMKKy5SSSBbICsgfCBcLSB8ICMgXSBGaWVsZDEgWywgRmllbGQyIC4uLl0KKy5SQiBbIFwtTyB8IFwtXC1zb3J0CisuUkkgWyArIHwgXC0gXSBLZXkxIFssIEtleTIgLi4uXV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIC4uLl0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtaWdub3JlbG9ja2luZ2ZhaWx1cmUgXQorLlJCIFsgXC1cLWlnbm9yZXNraXBwZWRjbHVzdGVyIF0KKy5SQiBbIFwtXC1sb2dvbmx5IF0KKy5SQiBbIFwtXC1ub2hlYWRpbmdzIF0KKy5SQiBbIFwtXC1ub3N1ZmZpeCBdCisuUkIgWyBcLVAgfCBcLVwtcGFydGlhbCBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtXC1zZXBhcmF0b3IKKy5JUiBTZXBhcmF0b3IgXQorLlJCIFsgXC1cLXVuYnVmZmVyZWQgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SQiBbIFwtXC12ZXJzaW9uIF0KKy5SSSBbIFZvbHVtZUdyb3VwTmFtZSAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3ZnZGlzcGxheSBhbGxvd3MgeW91IHRvIHNlZSB0aGUgYXR0cmlidXRlcyBvZgorLkkgVm9sdW1lR3JvdXBOYW1lCisob3IgYWxsIHZvbHVtZSBncm91cHMgaWYgbm9uZSBpcyBnaXZlbikgd2l0aCBpdCdzIHBoeXNpY2FsIGFuZCBsb2dpY2FsCit2b2x1bWVzIGFuZCB0aGVpciBzaXplcyBldGMuCisuUAorXGZCdmdzXGZQKDgpIGlzIGFuIGFsdGVybmF0aXZlIHRoYXQgcHJvdmlkZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24KK2luIHRoZSBzdHlsZSBvZiBcZkJwc1xmUCgxKS4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtQSAiLCAiIFwtXC1hY3RpdmV2b2x1bWVncm91cHMKK09ubHkgc2VsZWN0IHRoZSBhY3RpdmUgdm9sdW1lIGdyb3Vwcy4gVGhlIHZvbHVtZSBncm91cCBpcyBjb25zaWRlcmVkIGFjdGl2ZQoraWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBsb2dpY2FsIHZvbHVtZXMgaXMgYWN0aXZlLgorLlRQCisuQlIgXC1DICIsICIgXC1cLWNvbHVtbnMKK0Rpc3BsYXkgb3V0cHV0IGluIGNvbHVtbnMsIHRoZSBlcXVpdmFsZW50IG9mIFxmQnZnc1xmUCg4KS4gCitPcHRpb25zIGxpc3RlZCBhcmUgdGhlIHNhbWUgYXMgb3B0aW9ucyBnaXZlbiBpbiBcZlB2Z3NcZlAoOCkuCisuVFAKKy5CUiBcLWMgIiwgIiBcLVwtY29sb24KK0dlbmVyYXRlIGNvbG9uIHNlcGFyYXRlZCBvdXRwdXQgZm9yIGVhc2llciBwYXJzaW5nIGluIHNjcmlwdHMgb3IgcHJvZ3JhbXMuCitOLkIuIFxmQnZnc1xmUCg4KSBwcm92aWRlcyBjb25zaWRlcmFibHkgbW9yZSBjb250cm9sIG92ZXIgdGhlIG91dHB1dC4KKy5uZgorCitUaGUgdmFsdWVzIGFyZToKKworMSAgdm9sdW1lIGdyb3VwIG5hbWUKKzIgIHZvbHVtZSBncm91cCBhY2Nlc3MKKzMgIHZvbHVtZSBncm91cCBzdGF0dXMKKzQgIGludGVybmFsIHZvbHVtZSBncm91cCBudW1iZXIKKzUgIG1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcworNiAgY3VycmVudCBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzCis3ICBvcGVuIGNvdW50IG9mIGFsbCBsb2dpY2FsIHZvbHVtZXMgaW4gdGhpcyB2b2x1bWUgZ3JvdXAKKzggIG1heGltdW0gbG9naWNhbCB2b2x1bWUgc2l6ZQorOSAgbWF4aW11bSBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcworMTAgY3VycmVudCBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcworMTEgYWN0dWFsIG51bWJlciBvZiBwaHlzaWNhbCB2b2x1bWVzCisxMiBzaXplIG9mIHZvbHVtZSBncm91cCBpbiBraWxvYnl0ZXMKKzEzIHBoeXNpY2FsIGV4dGVudCBzaXplCisxNCB0b3RhbCBudW1iZXIgb2YgcGh5c2ljYWwgZXh0ZW50cyBmb3IgdGhpcyB2b2x1bWUgZ3JvdXAKKzE1IGFsbG9jYXRlZCBudW1iZXIgb2YgcGh5c2ljYWwgZXh0ZW50cyBmb3IgdGhpcyB2b2x1bWUgZ3JvdXAKKzE2IGZyZWUgbnVtYmVyIG9mIHBoeXNpY2FsIGV4dGVudHMgZm9yIHRoaXMgdm9sdW1lIGdyb3VwCisxNyB1dWlkIG9mIHZvbHVtZSBncm91cAorCisuZmkKKy5UUAorLkJSIFwtcyAiLCAiIFwtXC1zaG9ydAorR2l2ZSBhIHNob3J0IGxpc3Rpbmcgc2hvd2luZyB0aGUgZXhpc3RlbmNlIG9mIHZvbHVtZSBncm91cHMuCisuVFAKKy5CUiBcLXYgIiwgIiBcLVwtdmVyYm9zZQorRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uIGNvbnRhaW5pbmcgbG9uZyBsaXN0aW5ncyBvZiBwaHlzaWNhbAorYW5kIGxvZ2ljYWwgdm9sdW1lcy4gIElmIGdpdmVuIHR3aWNlLCBhbHNvIGRpc3BsYXkgdmVyYm9zZSBydW50aW1lCitpbmZvcm1hdGlvbiBvZiB2Z2Rpc3BsYXkncyBhY3Rpdml0aWVzLgorLlRQCisuQiBcLVwtdmVyc2lvbgorRGlzcGxheSB2ZXJzaW9uIGFuZCBleGl0IHN1Y2Nlc3NmdWxseS4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdzICg4KSwKKy5CUiBwdmNyZWF0ZSAoOCksCisuQlIgdmdjcmVhdGUgKDgpLAorLkJSIGx2Y3JlYXRlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3ZnZXhwb3J0LjguaW4gYi9tYW4vdmdleHBvcnQuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJlY2JmCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3ZnZXhwb3J0LjguaW4KQEAgLTAsMCArMSwzNyBAQAorLlRIIFZHRVhQT1JUIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdleHBvcnQgXC0gbWFrZSB2b2x1bWUgZ3JvdXBzIHVua25vd24gdG8gdGhlIHN5c3RlbQorLlNIIFNZTk9QU0lTCisuQiB2Z2V4cG9ydAorLlJCIFsgXC1hIHwgXC1cLWFsbCBdCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC0/IHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLVMgfCBcLVwtc2VsZWN0CisuSVIgU2VsZWN0aW9uIF0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SSSBbIFZvbHVtZUdyb3VwTmFtZSAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3ZnZXhwb3J0IGFsbG93cyB5b3UgdG8gbWFrZSB0aGUgaW5hY3RpdmUKKy5JUiBWb2x1bWVHcm91cE5hbWUgKHMpCit1bmtub3duIHRvIHRoZSBzeXN0ZW0uCitZb3UgY2FuIHRoZW4gbW92ZSBhbGwgdGhlIFBoeXNpY2FsIFZvbHVtZXMgaW4gdGhhdCBWb2x1bWUgR3JvdXAgdG8KK2EgZGlmZmVyZW50IHN5c3RlbSBmb3IgbGF0ZXIKKy5CUiB2Z2ltcG9ydCAoOCkuCitNb3N0IExWTTIgdG9vbHMgaWdub3JlIGV4cG9ydGVkIFZvbHVtZSBHcm91cHMuCit2Z2V4cG9ydCBjbGVhcnMgdGhlIFZHIHN5c3RlbSBJRCwgYW5kIHZnaW1wb3J0IHNldHMgdGhlIFZHIHN5c3RlbSBJRAordG8gbWF0Y2ggdGhlIGhvc3QgcnVubmluZyB2Z2ltcG9ydCAoaWYgdGhlIGhvc3QgaGFzIGEgc3lzdGVtIElEKS4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtYSAiLCAiIFwtXC1hbGwKK0V4cG9ydCBhbGwgaW5hY3RpdmUgVm9sdW1lIEdyb3Vwcy4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgcHZzY2FuICg4KSwKKy5CUiB2Z2ltcG9ydCAoOCksCisuQlIgdmdzY2FuICg4KSwKKy5CUiBsdm1zeXN0ZW1pZCAoNykKZGlmZiAtLWdpdCBhL21hbi92Z2V4dGVuZC44LmluIGIvbWFuL3ZnZXh0ZW5kLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiZDYxNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z2V4dGVuZC44LmluCkBAIC0wLDAgKzEsNzEgQEAKKy5USCBWR0VYVEVORCA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3ZnZXh0ZW5kIFwoZW0gYWRkIHBoeXNpY2FsIHZvbHVtZXMgdG8gYSB2b2x1bWUgZ3JvdXAKKy5TSCBTWU5PUFNJUworLkIgdmdleHRlbmQKKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC1cLXJlc3RvcmVtaXNzaW5nIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyAiUEhZU0lDQUwgREVWSUNFIE9QVElPTlMiIF0KKy5JIFZvbHVtZUdyb3VwTmFtZSBQaHlzaWNhbERldmljZVBhdGgKKy5SSSBbIFBoeXNpY2FsRGV2aWNlUGF0aCAuLi5dCisuU0ggREVTQ1JJUFRJT04KK3ZnZXh0ZW5kIGFsbG93cyB5b3UgdG8gYWRkIG9uZSBvciBtb3JlIGluaXRpYWxpemVkIHBoeXNpY2FsIHZvbHVtZXMKKyhzZWUgXGZCcHZjcmVhdGVcZlAoOCkpIHRvIGFuIGV4aXN0aW5nIHZvbHVtZSBncm91cCB0byBleHRlbmQgaXQgaW4gc2l6ZS4gTW9yZW92ZXIsIGl0IGFsbG93cyB5b3UgdG8KK3JlLWFkZCBhIHBoeXNpY2FsIHZvbHVtZSB0aGF0IGhhcyBnb25lIG1pc3NpbmcgcHJldmlvdXNseSwgZHVlIHRvIGEgdHJhbnNpZW50CitkZXZpY2UgZmFpbHVyZSwgd2l0aG91dCByZS1pbml0aWFsaXNpbmcgaXQuIFVzZQorXGZCdmdleHRlbmQgXC1cLXJlc3RvcmVtaXNzaW5nXGZQIHRvIHRoYXQgZWZmZWN0LgorLnNwCitJZiBcZklQaHlzaWNhbERldmljZVBhdGhcZlAgd2FzIG5vdCBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgZm9yIExWTSB3aXRoCitcZkJwdmNyZWF0ZVxmUCg4KSwgdGhlIGRldmljZSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUKK2RlZmF1bHQgdmFsdWVzIHVzZWQgd2l0aCBcZkJwdmNyZWF0ZVxmUCg4KS4gIElmIG5vbi1kZWZhdWx0CitcZlBwdmNyZWF0ZVxmUCg4KSB2YWx1ZXMgYXJlIGRlc2lyZWQsIHRoZXkgbWF5IGJlIGdpdmVuIG9uIHRoZQorY29tbWFuZGxpbmUgd2l0aCB0aGUgc2FtZSBvcHRpb25zIGFzIFxmUHB2Y3JlYXRlXGZQKDgpLiAgU2VlCisuQiBQSFlTSUNBTCBERVZJQ0UgT1BUSU9OUworZm9yIGF2YWlsYWJsZSBvcHRpb25zLiAgTm90ZSB0aGF0IHRoZSByZXN0b3JlLXJlbGF0ZWQgb3B0aW9ucyBzdWNoIGFzCisuQlIgXC1cLXJlc3RvcmVmaWxlICIsICIgXC1cLXV1aWQgIiBhbmQgIiBcLVwtcGh5c2ljYWx2b2x1bWVzaXplCithcmUgbm90IGF2YWlsYWJsZS4gIElmIGEgcmVzdG9yZSBvcGVyYXRpb24KK2lzIG5lZWRlZCwgdXNlIFxmQnB2Y3JlYXRlXGZQKDgpIGFuZCBcZkJ2Z2NmZ3Jlc3RvcmVcZlAoOCkuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuU0ggUEhZU0lDQUwgREVWSUNFIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBpbml0aWFsaXppbmcgcGh5c2ljYWwgZGV2aWNlcyBpbiB0aGUKK3ZvbHVtZSBncm91cC4gIFRoZXNlIG9wdGlvbnMgYXJlIGZ1cnRoZXIgZGVzY3JpYmVkIGluIHRoZQorXGZCcHZjcmVhdGVcZlAoOCkgbWFuIHBhZ2UuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZm9yY2UKKy5UUAorLkJSIFwteSAiLCAiIFwtXC15ZXMKKy5UUAorLkJSIFwtWiAiLCAiIFwtXC16ZXJvICIgeyIgXGZJeSB8IFxmSW4gfQorLlRQCisuQiBcLVwtbGFiZWxzZWN0b3IgXGZJc2VjdG9yCisuVFAKKy5CIFwtXC1tZXRhZGF0YXNpemUgXGZJc2l6ZQorLlRQCisuQlIgXC1cLW1ldGFkYXRhaWdub3JlICIgeyIgXGZJeSB8IFxmSW4gfQorLlRQCisuQiBcLVwtcHZtZXRhZGF0YWNvcGllcyBcZkljb3BpZXMKKy5UUAorLkIgXC1cLWRhdGFhbGlnbm1lbnQgXGZJYWxpZ25tZW50CisuVFAKKy5CIFwtXC1kYXRhYWxpZ25tZW50b2Zmc2V0IFxmSWFsaWdubWVudF9vZmZzZXQKKy5TSCBFeGFtcGxlcworRXh0ZW5kcyB0aGUgZXhpc3Rpbmcgdm9sdW1lIGdyb3VwICJ2ZzAwIiBieSB0aGUgbmV3IHBoeXNpY2FsIHZvbHVtZXMKKyhzZWUgXGZCcHZjcmVhdGVcZlAoOCkpICIvZGV2L3NkYTQiIGFuZCAiL2Rldi9zZG4xIi4KKy5zcAorLkIgdmdleHRlbmQgdmcwMCAvZGV2L3NkYTQgL2Rldi9zZG4xCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZnY3JlYXRlICg4KSwKKy5CUiB2Z3JlZHVjZSAoOCksCisuQlIgcHZjcmVhdGUgKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdpbXBvcnQuOC5pbiBiL21hbi92Z2ltcG9ydC44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGZkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vdmdpbXBvcnQuOC5pbgpAQCAtMCwwICsxLDM4IEBACisuVEggVkdJTVBPUlQgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z2ltcG9ydCBcKGVtIG1ha2UgZXhwb3J0ZWQgdm9sdW1lIGdyb3VwcyBrbm93biB0byB0aGUgc3lzdGVtCisuU0ggU1lOT1BTSVMKKy5CIHZnaW1wb3J0CisuUkIgWyBcLWEgfCBcLVwtYWxsIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdpbXBvcnQgYWxsb3dzIHlvdSB0byBtYWtlIGEgVm9sdW1lIEdyb3VwIHRoYXQgd2FzIHByZXZpb3VzbHkKK2V4cG9ydGVkIHVzaW5nCisuQlIgdmdleHBvcnQgKDgpCitrbm93biB0byB0aGUgc3lzdGVtIGFnYWluLCBwZXJoYXBzIGFmdGVyIG1vdmluZyBpdHMgUGh5c2ljYWwgVm9sdW1lcworZnJvbSBhIGRpZmZlcmVudCBtYWNoaW5lLgordmdleHBvcnQgY2xlYXJzIHRoZSBWRyBzeXN0ZW0gSUQsIGFuZCB2Z2ltcG9ydCBzZXRzIHRoZSBWRyBzeXN0ZW0gSUQKK3RvIG1hdGNoIHRoZSBob3N0IHJ1bm5pbmcgdmdpbXBvcnQgKGlmIHRoZSBob3N0IGhhcyBhIHN5c3RlbSBJRCkuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWEgIiwgIiBcLVwtYWxsCitJbXBvcnQgYWxsIGV4cG9ydGVkIFZvbHVtZSBHcm91cHMuCisuVFAKKy5CUiBcLVwtZm9yY2UKK0ltcG9ydCBleHBvcnRlZCBWb2x1bWUgR3JvdXBzIGV2ZW4gaWYgdGhlcmUgYXJlIG1pc3NpbmcgUGh5c2ljYWwgVm9sdW1lcy4KK1RoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlIG1pc3NpbmcgZGV2aWNlcyBhcmUga25vd24gdG8gaGF2ZQorZmFpbGVkIGFuZCB0aGV5IGNhbm5vdCBiZSByZXN0b3JlZC4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgcHZzY2FuICg4KSwKKy5CUiB2Z2V4cG9ydCAoOCksCisuQlIgdmdzY2FuICg4KSwKKy5CUiBsdm1zeXN0ZW1pZCAoNykKZGlmZiAtLWdpdCBhL21hbi92Z2ltcG9ydGNsb25lLjguaW4gYi9tYW4vdmdpbXBvcnRjbG9uZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjVlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vdmdpbXBvcnRjbG9uZS44LmluCkBAIC0wLDAgKzEsNDYgQEAKKy5USCBWR0lNUE9SVENMT05FIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJSZWQgSGF0LCBJbmMuIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdpbXBvcnRjbG9uZSBcKGVtIGltcG9ydCBhbmQgcmVuYW1lIGR1cGxpY2F0ZWQgdm9sdW1lIGdyb3VwIChlLmcuIGEgaGFyZHdhcmUgc25hcHNob3QpCisuU0ggU1lOT1BTSVMKKy5CIHZnaW1wb3J0Y2xvbmUKKy5SQiBbIFwtbiB8IFwtXC1iYXNldmduYW1lCisuSVIgVm9sdW1lR3JvdXBOYW1lIF0KKy5SQiBbIFwtaSB8IFwtXC1pbXBvcnQgXQorLkkgUGh5c2ljYWxWb2x1bWUKKy5SSSBbIFBoeXNpY2FsVm9sdW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdpbXBvcnRjbG9uZSBpcyB1c2VkIHRvIGltcG9ydCBhIGR1cGxpY2F0ZWQgVkcgKGUuZy4gaGFyZHdhcmUgc25hcHNob3QpLgorRHVwbGljYXRlIFZHKHMpIGFuZCBQVihzKSBhcmUgbm90IGFibGUgdG8gYmUgdXNlZCB1bnRpbCB0aGV5IGFyZSBtYWRlCit0byBjb2V4aXN0IHdpdGggdGhlIG9yaWdpbiBWRyhzKSBhbmQgUFYocykuCit2Z2ltcG9ydGNsb25lIHJlbmFtZXMgdGhlIFZHIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFBWKHMpIGFuZAorY2hhbmdlcyB0aGUgYXNzb2NpYXRlZCBWRyBhbmQgUFYgVVVJRHMuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLW4gIiwgIiBcLVwtYmFzZXZnbmFtZSAiICIgXGZJVm9sdW1lR3JvdXBOYW1lCitCeSBkZWZhdWx0IHRoZSBzbmFwc2hvdCBWRyB3aWxsIGJlIHJlbmFtZWQgdG8gdGhlIG9yaWdpbmFsIG5hbWUgcGx1cyBhCitudW1lcmljIHN1ZmZpeCB0byBhdm9pZCBkdXBsaWNhdGUgbmFtaW5nIChlLmcuICd0ZXN0X3ZnJyB3b3VsZCBiZSByZW5hbWVkCit0byAndGVzdF92ZzEnKS4gIFRoaXMgb3B0aW9uIHdpbGwgb3ZlcnJpZGUgdGhlIGJhc2UgVkcgbmFtZSB0aGF0IGlzCit1c2VkIGZvciBhbGwgVkcgcmVuYW1lcy4gIElmIGEgVkcgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKK2EgbnVtZXJpYyBzdWZmaXggd2lsbCBiZSBhZGRlZCAobGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSkgdG8gbWFrZSBpdCB1bmlxdWUuCisuVFAKKy5CUiBcLWkgIiwgIiBcLVwtaW1wb3J0CitJbXBvcnQgZXhwb3J0ZWQgVm9sdW1lIEdyb3Vwcy4gIE90aGVyd2lzZSBWR3MgdGhhdCBoYXZlIGJlZW4gZXhwb3J0ZWQKK3dpbGwgbm90IGJlIGNoYW5nZWQgKG5vciB3aWxsIHRoZWlyIGFzc29jaWF0ZWQgUFZzKS4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy5UUAorLkIgTFZNX0JJTkFSWQorVGhlIExWTTIgYmluYXJ5IHRvIHVzZS4gRGVmYXVsdHMgdG8gImx2bSIuCisuU0ggRXhhbXBsZXMKK1RoZSBvcmlnaW4gVkcgInZnMDAiIGhhcyBvcmlnaW4gUFZzICIvZGV2L3NkYSIgYW5kICIvZGV2L3NkYiIKK2FuZCB0aGUgcmVzcGVjdGl2ZSBzbmFwc2hvdCBQVnMgYXJlICIvZGV2L3NkYyIgYW5kICIvZGV2L3NkZCIuCitUbyByZW5hbWUgdGhlIFZHIGFzc29jaWF0ZWQgd2l0aCAiL2Rldi9zZGMiIGFuZCAiL2Rldi9zZGQiCitmcm9tICJ2ZzAwIiB0byAidmcwMF9zbmFwIgorKGFuZCB0byBjaGFuZ2UgYXNzb2NpYXRlZCBWRyBhbmQgUFYgVVVJRHMpIGRvOgorLnNwCisuQiB2Z2ltcG9ydGNsb25lIFwtXC1iYXNldmduYW1lIHZnMDBfc25hcCAvZGV2L3NkYyAvZGV2L3NkZAorCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZncmVuYW1lICg4KQorCmRpZmYgLS1naXQgYS9tYW4vdmdtZXJnZS44LmluIGIvbWFuL3ZnbWVyZ2UuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM4YzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL3ZnbWVyZ2UuOC5pbgpAQCAtMCwwICsxLDQxIEBACisuVEggVkdNRVJHRSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3ZnbWVyZ2UgXChlbSBtZXJnZSB0d28gdm9sdW1lIGdyb3VwcworLlNIIFNZTk9QU0lTCisuQiB2Z21lcmdlCisuUkIgWyBcLUEgfCBcLVwtYXV0b2JhY2t1cAorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLWwgfCBcLVwtbGlzdCBdCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuSSBEZXN0aW5hdGlvblZvbHVtZUdyb3VwTmFtZQorLkkgU291cmNlVm9sdW1lR3JvdXBOYW1lCisuU0ggREVTQ1JJUFRJT04KK3ZnbWVyZ2UgbWVyZ2VzIHR3byBleGlzdGluZyB2b2x1bWUgZ3JvdXBzLiBUaGUgaW5hY3RpdmUKK1xmSVNvdXJjZVZvbHVtZUdyb3VwTmFtZVxmUCB3aWxsIGJlIG1lcmdlZCBpbnRvIAordGhlIFxmSURlc3RpbmF0aW9uVm9sdW1lR3JvdXBOYW1lXGZQIGlmIHBoeXNpY2FsIGV4dGVudCBzaXplcworYXJlIGVxdWFsIGFuZCBwaHlzaWNhbCBhbmQgbG9naWNhbCB2b2x1bWUgc3VtbWFyaWVzIG9mIGJvdGggdm9sdW1lIGdyb3VwcworZml0IGludG8gXGZJRGVzdGluYXRpb25Wb2x1bWVHcm91cE5hbWVcZlAncyBsaW1pdHMuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWwgIiwgIiBcLVwtbGlzdAorRGlzcGxheSBtZXJnZWQgXGZJRGVzdGluYXRpb25Wb2x1bWVHcm91cE5hbWVcZlAgbGlrZSBcZkJ2Z2Rpc3BsYXkgXC12XGZQLgorLlRQIAorLkJSIFwtdCAiLCAiIFwtXC10ZXN0CitEbyBhIHRlc3QgcnVuIFdJVEhPVVQgbWFraW5nIGFueSByZWFsIGNoYW5nZXMuCisuU0ggRXhhbXBsZXMKK01lcmdlIHRoZSBpbmFjdGl2ZSB2b2x1bWUgZ3JvdXAgbmFtZWQgIm15X3ZnIgoraW50byB0aGUgYWN0aXZlIG9yIGluYWN0aXZlIHZvbHVtZSBncm91cCBuYW1lZCAiZGF0YWJhc2VzIiBnaXZpbmcgdmVyYm9zZQorcnVudGltZSBpbmZvcm1hdGlvbjoKKy5zcAorLkIgdmdtZXJnZSBcLXYgZGF0YWJhc2VzIG15X3ZnCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZnY3JlYXRlICg4KSwKKy5CUiB2Z2V4dGVuZCAoOCksCisuQlIgdmdyZWR1Y2UgKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdta25vZGVzLjguaW4gYi9tYW4vdmdta25vZGVzLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYjVkNAotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z21rbm9kZXMuOC5pbgpAQCAtMCwwICsxLDMwIEBACisuVEggVkdNS05PREVTIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdta25vZGVzIFwoZW0gcmVjcmVhdGUgdm9sdW1lIGdyb3VwIGRpcmVjdG9yeSBhbmQgbG9naWNhbCB2b2x1bWUgc3BlY2lhbCBmaWxlcworLlNIIFNZTk9QU0lTCisuQiB2Z21rbm9kZXMKKy5SQiBbIFwtXC1jb21tYW5kcHJvZmlsZQorLklSIFByb2ZpbGVOYW1lIF0KKy5SQiBbIFwtZCB8IFwtXC1kZWJ1ZyBdCisuUkIgWyBcLWggfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtcmVmcmVzaCBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtdiB8IFwtXC12ZXJib3NlIF0KKy5SSSBbWyBWb2x1bWVHcm91cE5hbWUgfCBMb2dpY2FsVm9sdW1lUGF0aCBdLi4uXQorLlNIIERFU0NSSVBUSU9OCitDaGVja3MgdGhlIExWTTIgc3BlY2lhbCBmaWxlcyBpbiAvZGV2IHRoYXQgYXJlIG5lZWRlZCBmb3IgYWN0aXZlIAorbG9naWNhbCB2b2x1bWVzIGFuZCBjcmVhdGVzIGFueSBtaXNzaW5nIG9uZXMgYW5kIHJlbW92ZXMgdW51c2VkIG9uZXMuCisuU0ggT1BUSU9OUworLlRQCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtXC1yZWZyZXNoCitJZiBhbnkgbG9naWNhbCB2b2x1bWUgaW4gdGhlIHZvbHVtZSBncm91cCBpcyBhY3RpdmUsIHJlbG9hZCBpdHMgbWV0YWRhdGEuCitUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaW4gbm9ybWFsIG9wZXJhdGlvbiwgYnV0IG1heSBiZSB1c2VmdWwKK2lmIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZyBvciBpZiB5b3UncmUgZG9pbmcgY2x1c3RlcmluZworbWFudWFsbHkgd2l0aG91dCBhIGNsdXN0ZXJlZCBsb2NrIG1hbmFnZXIuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZnc2NhbiAoOCksCisuQlIgZG1zZXR1cCAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z3JlZHVjZS44LmluIGIvbWFuL3ZncmVkdWNlLjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMzFlOAotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z3JlZHVjZS44LmluCkBAIC0wLDAgKzEsNDkgQEAKKy5USCBWR1JFRFVDRSA4ICJMVk0gVE9PTFMgI1ZFUlNJT04jIiAiU2lzdGluYSBTb2Z0d2FyZSBVSyIgXCIgLSotIG5yb2ZmIC0qLQorLlNIIE5BTUUKK3ZncmVkdWNlIFwoZW0gcmVkdWNlIGEgdm9sdW1lIGdyb3VwCisuU0ggU1lOT1BTSVMKKy5CIHZncmVkdWNlCisuUkIgWyBcLWEgfCBcLVwtYWxsIF0KKy5SQiBbIFwtQSB8IFwtXC1hdXRvYmFja3VwCisuUkkgeyB5IHwgbiB9XQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtaCB8IFwtPyB8IFwtXC1oZWxwIF0KKy5SQiBbIFwtXC1yZW1vdmVtaXNzaW5nIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLkkgVm9sdW1lR3JvdXBOYW1lCisuUkkgWyBQaHlzaWNhbFZvbHVtZVBhdGggLi4uXQorLlNIIERFU0NSSVBUSU9OCit2Z3JlZHVjZSBhbGxvd3MgeW91IHRvIHJlbW92ZSBvbmUgb3IgbW9yZSB1bnVzZWQgcGh5c2ljYWwgdm9sdW1lcworZnJvbSBhIHZvbHVtZSBncm91cC4KKy5TSCBPUFRJT05TCitTZWUgXGZCbHZtXGZQKDgpIGZvciBjb21tb24gb3B0aW9ucy4KKy5UUAorLkJSIFwtYSAiLCAiIFwtXC1hbGwKK1JlbW92ZXMgYWxsIGVtcHR5IHBoeXNpY2FsIHZvbHVtZXMgaWYgbm9uZSBhcmUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lLgorLlRQCisuQiBcLVwtcmVtb3ZlbWlzc2luZworUmVtb3ZlcyBhbGwgbWlzc2luZyBwaHlzaWNhbCB2b2x1bWVzIGZyb20gdGhlIHZvbHVtZSBncm91cCwgaWYgdGhlcmUgYXJlIG5vCitsb2dpY2FsIHZvbHVtZXMgYWxsb2NhdGVkIG9uIHRob3NlLiBUaGlzIHJlc3VtZXMgbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUgdm9sdW1lCitncm91cCAobmV3IGxvZ2ljYWwgdm9sdW1lcyBtYXkgYWdhaW4gYmUgY3JlYXRlZCwgY2hhbmdlZCBhbmQgc28gb24pLgorCitJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSAodGhlcmUgYXJlIGxvZ2ljYWwgdm9sdW1lcyByZWZlcmVuY2luZyB0aGUgbWlzc2luZworcGh5c2ljYWwgdm9sdW1lcykgYW5kIHlvdSBjYW5ub3Qgb3IgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIHRoZW0gbWFudWFsbHksIHlvdQorY2FuIHJ1biB0aGlzIG9wdGlvbiB3aXRoIFxmQlwtXC1mb3JjZVxmUCB0byBoYXZlIFxmQnZncmVkdWNlXGZQCityZW1vdmUgYW55IHBhcnRpYWwgTFZzLgorCitBbnkgbG9naWNhbCB2b2x1bWVzIGFuZCBkZXBlbmRlbnQgc25hcHNob3RzIHRoYXQgd2VyZSBwYXJ0bHkgb24gdGhlIAorbWlzc2luZyBkaXNrcyBnZXQgcmVtb3ZlZCBjb21wbGV0ZWx5LiBUaGlzIGluY2x1ZGVzIHRob3NlIHBhcnRzIAordGhhdCBsaWUgb24gZGlza3MgdGhhdCBhcmUgc3RpbGwgcHJlc2VudC4KKworSWYgeW91ciBsb2dpY2FsIHZvbHVtZXMgc3Bhbm5lZCBzZXZlcmFsIGRpc2tzIGluY2x1ZGluZyB0aGUgb25lcyB0aGF0IGFyZQorbG9zdCwgeW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHRvIHNhbHZhZ2UgZGF0YSBmaXJzdCBieSBhY3RpdmF0aW5nIHlvdXIKK2xvZ2ljYWwgdm9sdW1lcyB3aXRoIFxmQlwtXC1wYXJ0aWFsXGZQIGFzIGRlc2NyaWJlZCBpbiBcZkJsdm1cZlAoOCkuCisKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdleHRlbmQgKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdyZW1vdmUuOC5pbiBiL21hbi92Z3JlbW92ZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjAwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vdmdyZW1vdmUuOC5pbgpAQCAtMCwwICsxLDQ2IEBACisuVEggVkdSRU1PVkUgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z3JlbW92ZSBcKGVtIHJlbW92ZSBhIHZvbHVtZSBncm91cAorLlNIIFNZTk9QU0lTCisuQiB2Z3JlbW92ZQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFsgXC1kIHwgXC1cLWRlYnVnIF0KKy5SQiBbIFwtZiB8IFwtXC1mb3JjZSBdCisuUkIgWyBcLWggfCBcLT8gfCBcLVwtaGVscCBdCisuUkIgWyBcLVwtbm91ZGV2c3luYyBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtUyB8IFwtXC1zZWxlY3QKKy5JUiBTZWxlY3Rpb24gXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlJJIFsgVm9sdW1lR3JvdXBOYW1lIC4uLl0KKy5TSCBERVNDUklQVElPTgordmdyZW1vdmUgYWxsb3dzIHlvdSB0byByZW1vdmUgb25lIG9yIG1vcmUgdm9sdW1lIGdyb3Vwcy4KK0lmIG9uZSBvciBtb3JlIHBoeXNpY2FsIHZvbHVtZXMgaW4gdGhlIHZvbHVtZSBncm91cCBhcmUgbG9zdCwKK2NvbnNpZGVyIFxmQnZncmVkdWNlIFwtXC1yZW1vdmVtaXNzaW5nXGZQIHRvIG1ha2UgdGhlIHZvbHVtZSBncm91cAorbWV0YWRhdGEgY29uc2lzdGVudCBhZ2Fpbi4KKy5zcAorSWYgdGhlcmUgYXJlIGxvZ2ljYWwgdm9sdW1lcyB0aGF0IGV4aXN0IGluIHRoZSB2b2x1bWUgZ3JvdXAsCithIHByb21wdCB3aWxsIGJlIGdpdmVuIHRvIGNvbmZpcm0gcmVtb3ZhbC4gIFlvdSBjYW4gb3ZlcnJpZGUKK3RoZSBwcm9tcHQgd2l0aCBcZkJcLWZcZlAuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CUiBcLWYgIiwgIiBcLVwtZm9yY2UKK0ZvcmNlIHRoZSByZW1vdmFsIG9mIGFueSBsb2dpY2FsIHZvbHVtZXMgb24gdGhlIHZvbHVtZSBncm91cAord2l0aG91dCBjb25maXJtYXRpb24uCitUbyByZW1vdmUgYWxzbyBkYW1hZ2VkIHBvb2wgdm9sdW1lcyB1c2UgXC1mZi4KKy5UUAorLkJSIFwtXC1ub3VkZXZzeW5jCitEaXNhYmxlIHVkZXYgc3luY2hyb25pc2F0aW9uLiBUaGUKK3Byb2Nlc3Mgd2lsbCBub3Qgd2FpdCBmb3Igbm90aWZpY2F0aW9uIGZyb20gdWRldi4KK0l0IHdpbGwgY29udGludWUgaXJyZXNwZWN0aXZlIG9mIGFueSBwb3NzaWJsZSB1ZGV2IHByb2Nlc3NpbmcKK2luIHRoZSBiYWNrZ3JvdW5kLiAgWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIGlmIHVkZXYgaXMgbm90IHJ1bm5pbmcKK29yIGhhcyBydWxlcyB0aGF0IGlnbm9yZSB0aGUgZGV2aWNlcyBMVk0yIGNyZWF0ZXMuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIGx2cmVtb3ZlICg4KSwKKy5CUiB2Z2NyZWF0ZSAoOCksCisuQlIgdmdyZWR1Y2UgKDgpCmRpZmYgLS1naXQgYS9tYW4vdmdyZW5hbWUuOC5pbiBiL21hbi92Z3JlbmFtZS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmQ3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9tYW4vdmdyZW5hbWUuOC5pbgpAQCAtMCwwICsxLDU4IEBACisuVEggVkdSRU5BTUUgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z3JlbmFtZSBcKGVtIHJlbmFtZSBhIHZvbHVtZSBncm91cAorLlNIIFNZTk9QU0lTCisuQiB2Z3JlbmFtZQorLlJCIFsgXC1BIHwgXC1cLWF1dG9iYWNrdXAKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC0/IHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLXJlcG9ydGZvcm1hdAorLlJCIHsgYmFzaWMgfCBqc29uIH1dCisuUkIgWyBcLXQgfCBcLVwtdGVzdCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuSVIgT2xkVm9sdW1lR3JvdXAgeyBQYXRoIHwgTmFtZSB8IFVVSUQgfQorLklSIE5ld1ZvbHVtZUdyb3VwIHsgUGF0aCB8IE5hbWUgfQorLlNIIERFU0NSSVBUSU9OCit2Z3JlbmFtZSByZW5hbWVzIGFuIGV4aXN0aW5nIChzZWUKKy5CUiB2Z2NyZWF0ZSAoOCkpCit2b2x1bWUgZ3JvdXAgZnJvbQorLklSIE9sZFZvbHVtZUdyb3VwIHsgTmFtZSB8IFBhdGggfCBVVUlEIH0KK3RvCisuSVIgTmV3Vm9sdW1lR3JvdXAgeyBOYW1lIHwgUGF0aCB9LgorCitBbGwgdGhlIFZvbHVtZSBHcm91cHMgdmlzaWJsZSB0byBhIHN5c3RlbSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50CituYW1lcy4gIE90aGVyd2lzZSBtYW55IExWTTIgY29tbWFuZHMgd2lsbCByZWZ1c2UgdG8gcnVuIG9yIGdpdmUKK3dhcm5pbmcgbWVzc2FnZXMuCisKK1RoaXMgc2l0dWF0aW9uIGNvdWxkIGFyaXNlIHdoZW4gZGlza3MgYXJlIG1vdmVkIGJldHdlZW4gbWFjaGluZXMuICBJZgorYSBkaXNrIGlzIGNvbm5lY3RlZCBhbmQgaXQgY29udGFpbnMgYSBWb2x1bWUgR3JvdXAgd2l0aCB0aGUgc2FtZSBuYW1lCithcyB0aGUgVm9sdW1lIEdyb3VwIGNvbnRhaW5pbmcgeW91ciByb290IGZpbGVzeXN0ZW0gdGhlIG1hY2hpbmUgbWlnaHQKK25vdCBldmVuIGJvb3QgY29ycmVjdGx5LiAgSG93ZXZlciwgdGhlIHR3byBWb2x1bWUgR3JvdXBzIHNob3VsZCBoYXZlCitkaWZmZXJlbnQgVVVJRHMgKHVubGVzcyB0aGUgZGlzayB3YXMgY2xvbmVkKSBzbyB5b3UgY2FuIHJlbmFtZQorb25lIG9mIHRoZSBjb25mbGljdGluZyBWb2x1bWUgR3JvdXBzIHdpdGgKK1xmQnZncmVuYW1lXGZQLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlNIIEV4YW1wbGVzCitSZW5hbWVzIGV4aXN0aW5nIHZvbHVtZSBncm91cCB2ZzAyIHRvIG15X3ZvbHVtZV9ncm91cDoKKy5zcAorLkIgdmdyZW5hbWUgL2Rldi92ZzAyIC9kZXYvbXlfdm9sdW1lX2dyb3VwCisKK29yCisuc3AKKy5CIHZncmVuYW1lIHZnMDIgbXlfdm9sdW1lX2dyb3VwCisKK0NoYW5nZXMgdGhlIG5hbWUgb2YgdGhlIFZvbHVtZSBHcm91cCB3aXRoIFVVSUQKKy5icgorWnZsaWZpLUVwM3QtZTBOZy1VNDJoLW8weWUtS0h1MS1ubDdOczQgdG8gVm9sR3JvdXAwMF90bXA6Cisuc3AKKy5CIHZncmVuYW1lIFp2bGlmaVwtRXAzdFwtZTBOZ1wtVTQyaFwtbzB5ZVwtS0h1MVwtbmw3TnM0IFZvbEdyb3VwMDBfdG1wCisKKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdjaGFuZ2UgKDgpLAorLkJSIHZnY3JlYXRlICg4KSwKKy5CUiBsdnJlbmFtZSAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z3MuOC5pbiBiL21hbi92Z3MuOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjlkOWFjCi0tLSAvZGV2L251bGwKKysrIGIvbWFuL3Zncy44LmluCkBAIC0wLDAgKzEsMTYxIEBACisuVEggVkdTIDggIkxWTSBUT09MUyAjVkVSU0lPTiMiICJTaXN0aW5hIFNvZnR3YXJlIFVLIiBcIiAtKi0gbnJvZmYgLSotCisuU0ggTkFNRQordmdzIFwoZW0gcmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IHZvbHVtZSBncm91cHMKKy5TSCBTWU5PUFNJUworLkIgdmdzCisuUkIgWyBcLWEgfCBcLVwtYWxsIF0KKy5SQiBbIFwtXC1hbGlnbmVkIF0KKy5SQiBbIFwtXC1iaW5hcnkgXQorLlJCIFsgXC1cLWNvbW1hbmRwcm9maWxlCisuSVIgUHJvZmlsZU5hbWUgXQorLlJCIFtbIFwtXC1jb25maWdyZXBvcnQKKy5JUiBSZXBvcnROYW1lIF0KKy5SQiBbIFwtbyB8IFwtXC1vcHRpb25zCisuUkkgWyArIHwgXC0gfCAjIF0gRmllbGQxIFssIEZpZWxkMiAuLi5dCisuUkIgWyBcLU8gfCBcLVwtc29ydAorLlJJIFsgKyB8IFwtIF0gS2V5MSBbLCBLZXkyIC4uLl1dCisuUkIgWyBcLVMgfCBcLVwtc2VsZWN0CisuSVIgU2VsZWN0aW9uIF0KKy5SQiAuLi5dCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC0/IHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLWlnbm9yZWxvY2tpbmdmYWlsdXJlIF0KKy5SQiBbIFwtXC1pZ25vcmVza2lwcGVkY2x1c3RlciBdCisuUkIgWyBcLVwtbG9nb25seSBdCisuUkIgWyBcLVwtbmFtZXByZWZpeGVzIF0KKy5SQiBbIFwtXC1ub2hlYWRpbmdzIF0KKy5SQiBbIFwtXC1ub3N1ZmZpeCBdCisuUkIgWyBcLVAgfCBcLVwtcGFydGlhbCBdCisuUkIgWyBcLVwtcmVwb3J0Zm9ybWF0CisuUkIgeyBiYXNpYyB8IGpzb24gfV0KKy5SQiBbIFwtXC1yb3dzIF0KKy5SQiBbIFwtXC1zZXBhcmF0b3IKKy5JUiBTZXBhcmF0b3IgXQorLlJCIFsgXC1cLXVuYnVmZmVyZWQgXQorLlJCIFsgXC1cLXVuaXRzCisuSVIgaEhiQnNTa0ttTWdHdFRwUGVFIF0KKy5SQiBbIFwtXC11bnF1b3RlZCBdCisuUkIgWyBcLXYgfCBcLVwtdmVyYm9zZSBdCisuUkIgWyBcLVwtdmVyc2lvbiBdCisuUkkgWyBWb2x1bWVHcm91cE5hbWUKKy5SSSBbIFZvbHVtZUdyb3VwTmFtZSAuLi5dXQorLlNIIERFU0NSSVBUSU9OCit2Z3MgcHJvZHVjZXMgZm9ybWF0dGVkIG91dHB1dCBhYm91dCB2b2x1bWUgZ3JvdXBzLgorLlNIIE9QVElPTlMKK1NlZSBcZkJsdm1cZlAoOCkgZm9yIGNvbW1vbiBvcHRpb25zLgorLlRQCisuQiBcLVwtYWxsCitMaXN0IGFsbCB2b2x1bWUgZ3JvdXBzLiAgRXF1aXZhbGVudCB0byBub3Qgc3BlY2lmeWluZyBhbnkgdm9sdW1lIGdyb3Vwcy4KKy5UUAorLkIgXC1cLWFsaWduZWQKK1VzZSB3aXRoIFxmQlwtXC1zZXBhcmF0b3JcZlAgdG8gYWxpZ24gdGhlIG91dHB1dCBjb2x1bW5zLgorLlRQCisuQiBcLVwtYmluYXJ5CitVc2UgYmluYXJ5IHZhbHVlcyAiMCIgb3IgIjEiIGluc3RlYWQgb2YgZGVzY3JpcHRpdmUgbGl0ZXJhbCB2YWx1ZXMKK2ZvciBjb2x1bW5zIHRoYXQgaGF2ZSBleGFjdGx5IHR3byB2YWxpZCB2YWx1ZXMgdG8gcmVwb3J0IChub3QgY291bnRpbmcKK3RoZSAidW5rbm93biIgdmFsdWUgd2hpY2ggZGVub3RlcyB0aGF0IHRoZSB2YWx1ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCkuCisuVFAKKy5CIFwtXC1jb25maWdyZXBvcnQgIFxmSSBSZXBvcnROYW1lCitNYWtlIGFueSBzdWJzZXF1ZW50IFxmQlwtbywgXC1cLW9wdGlvbnNcZlAsIFxmQlwtTywgXC1cLXNvcnRcZlAgb3IKK1xmQlwtUywgXC1cLXNlbGVjdFxmUCB0byBhcHBseSBmb3IgXGZJUmVwb3J0TmFtZVxmUCB3aGVyZSBcZklSZXBvcnROYW1lXGZQCitpcyBlaXRoZXIgJ3ZncycgZm9yIGNvbW1hbmQncyBtYWluIHJlcG9ydCBvciAnbG9nJyBmb3IgbG9nIHJlcG9ydC4KK0lmIFxmQlwtXC1jb25maWdyZXBvcnRcZlAgb3B0aW9uIGlzIG5vdCB1c2VkIHRvIGlkZW50aWZ5IGEgcmVwb3J0LCB0aGVuCitjb21tYW5kJ3MgbWFpbiByZXBvcnQgaXMgYXNzdW1lZC4gVGhlIGxvZyByZXBvcnQgaXMgYXZhaWxhYmxlIG9ubHkgaWYKK2VuYWJsZWQgYnkgXGZCbG9nL3JlcG9ydF9jb21tYW5kX2xvZ1xmUCBcZkJsdm0uY29uZlxmUCg1KSBzZXR0aW5nIG9yCitpZiBcZkJcLVwtbG9nb25seVxmUCBvcHRpb24gaXMgdXNlZC4KKy5UUAorLkIgXC1cLWxvZ29ubHkKK1N1cHByZXNzIHRoZSB2Z3MgcmVwb3J0IGl0c2VsZiBhbmQgZGlzcGxheSBvbmx5IGxvZyByZXBvcnQgb24gb3V0cHV0LgorLlRQCisuQiBcLVwtbmFtZXByZWZpeGVzCitBZGQgYW4gIkxWTTJfIiBwcmVmaXggcGx1cyB0aGUgZmllbGQgbmFtZSB0byB0aGUgb3V0cHV0LiAgVXNlZnVsCit3aXRoIFxmQlwtXC1ub2hlYWRpbmdzXGZQIHRvIHByb2R1Y2UgYSBsaXN0IG9mIGZpZWxkPXZhbHVlIHBhaXJzIHRoYXQgY2FuCitiZSB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZvciBleGFtcGxlLCBpbiBcZkJ1ZGV2XGZQKDcpIHJ1bGVzKS4KKy5UUAorLkIgXC1cLW5vaGVhZGluZ3MKK1N1cHByZXNzIHRoZSBoZWFkaW5ncyBsaW5lIHRoYXQgaXMgbm9ybWFsbHkgdGhlIGZpcnN0IGxpbmUgb2Ygb3V0cHV0LgorVXNlZnVsIGlmIGdyZXBwaW5nIHRoZSBvdXRwdXQuCisuVFAKKy5CIFwtXC1ub3N1ZmZpeAorU3VwcHJlc3MgdGhlIHN1ZmZpeCBvbiBvdXRwdXQgc2l6ZXMuICBVc2Ugd2l0aCBcZkJcLVwtdW5pdHNcZlAKKyhleGNlcHQgaCBhbmQgSCkgaWYgcHJvY2Vzc2luZyB0aGUgb3V0cHV0LgorLlRQCisuQlIgXC1vICIsICIgXC1cLW9wdGlvbnMKK0NvbW1hLXNlcGFyYXRlZCBvcmRlcmVkIGxpc3Qgb2YgY29sdW1ucy4KKy5JUAorUHJlY2VkZSB0aGUgbGlzdCB3aXRoICdcZkkrXGZQJyB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgbGlzdAorb2YgY29sdW1ucywgJ1xmSS1cZlAnIHRvIHJlbW92ZSBmcm9tIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29sdW1ucworb3IgJ1xmSSNcZlAnIHRvIGNvbXBhY3QgZ2l2ZW4gY29sdW1ucy4gVGhlIFxmSVwtb1xmUCBvcHRpb24gY2FuCitiZSByZXBlYXRlZCwgcHJvdmlkaW5nIHNldmVyYWwgbGlzdHMuIFRoZXNlIGxpc3RzIGFyZSBldmFsdWF0ZWQKK2Zyb20gbGVmdCB0byByaWdodC4KKy5JUAorVXNlIFxmQlwtbyB2Z19hbGxcZlAgdG8gc2VsZWN0IGFsbCB2b2x1bWUgZ3JvdXAgY29sdW1ucy4KKy5JUAorVXNlIFxmQlwtbyBoZWxwXGZQIHRvIHZpZXcgdGhlIGZ1bGwgbGlzdCBvZiBjb2x1bW5zIGF2YWlsYWJsZS4KKy5JUAorQ29sdW1uIG5hbWVzIGluY2x1ZGU6IHZnX2ZtdCwgdmdfdXVpZCwgdmdfbmFtZSwgdmdfYXR0ciwgdmdfc2l6ZSwgdmdfZnJlZSwKK3ZnX3N5c2lkLCB2Z19leHRlbnRfc2l6ZSwgdmdfZXh0ZW50X2NvdW50LCB2Z19mcmVlX2NvdW50LCB2Z19wcm9maWxlLCBtYXhfbHYsCittYXhfcHYsIHB2X2NvdW50LCBsdl9jb3VudCwgc25hcF9jb3VudCwgdmdfc2Vxbm8sIHZnX3RhZ3MsIHZnX21kYV9jb3VudCwKK3ZnX21kYV9mcmVlLCBhbmQgdmdfbWRhX3NpemUsIHZnX21kYV91c2VkX2NvdW50LgorLklQCitBbnkgInZnXyIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsLiAgQ29sdW1ucyBtZW50aW9uZWQgaW4gZWl0aGVyIFxmQnB2c1xmUCg4KQorb3IgXGZCbHZzXGZQKDgpIGNhbiBhbHNvIGJlIGNob3NlbiwgYnV0IGNvbHVtbnMgY2Fubm90IGJlIHRha2VuIGZyb20gYm90aAorYXQgdGhlIHNhbWUgdGltZS4gIAorLklQCitUaGUgdmdfYXR0ciBiaXRzIGFyZToKKy5SUworLklQIDEgMworUGVybWlzc2lvbnM6ICh3KXJpdGVhYmxlLCAocillYWQtb25seQorLklQIDIgMworUmVzaSh6KWVhYmxlCisuSVAgMyAzCitFKHgpcG9ydGVkCisuSVAgNCAzCisocClhcnRpYWw6IG9uZSBvciBtb3JlIHBoeXNpY2FsIHZvbHVtZXMgYmVsb25naW5nIHRvIHRoZSB2b2x1bWUgZ3JvdXAKK2FyZSBtaXNzaW5nIGZyb20gdGhlIHN5c3RlbQorLklQIDUgMworQWxsb2NhdGlvbiBwb2xpY3k6IChjKW9udGlndW91cywgYyhsKWluZywgKG4pb3JtYWwsIChhKW55d2hlcmUKKy5JUCA2IDMKKyhjKWx1c3RlcmVkLCAocyloYXJlZAorLlJFCisuVFAKKy5CUiBcLU8gIiwgIiBcLVwtc29ydAorQ29tbWEtc2VwYXJhdGVkIG9yZGVyZWQgbGlzdCBvZiBjb2x1bW5zIHRvIHNvcnQgYnkuICBSZXBsYWNlcyB0aGUgZGVmYXVsdAorc2VsZWN0aW9uLiBQcmVjZWRlIGFueSBjb2x1bW4gd2l0aCAnXGZJXC1cZlAnIGZvciBhIHJldmVyc2Ugc29ydCBvbiB0aGF0Citjb2x1bW4uCisuVFAKKy5CIFwtXC1yb3dzCitPdXRwdXQgY29sdW1ucyBhcyByb3dzLgorLlRQCisuQlIgIFwtUyAiLCAiIFwtXC1zZWxlY3QgIiAiIFxmSVNlbGVjdGlvbgorRGlzcGxheSBvbmx5IHJvd3MgdGhhdCBtYXRjaCBTZWxlY3Rpb24gY3JpdGVyaWEuIEFsbCByb3dzIGFyZSBkaXNwbGF5ZWQgd2l0aAordGhlIGFkZGl0aW9uYWwgInNlbGVjdGVkIiBjb2x1bW4gKFxmQi1vIHNlbGVjdGVkXGZQKSBzaG93aW5nIDEgaWYgdGhlIHJvdworbWF0Y2hlcyB0aGUgU2VsZWN0aW9uIGFuZCAwIG90aGVyd2lzZS4gVGhlIFNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgZGVmaW5lZAorYnkgc3BlY2lmeWluZyBjb2x1bW4gbmFtZXMgYW5kIHRoZWlyIHZhbGlkIHZhbHVlcyAodGhhdCBjYW4gaW5jbHVkZSByZXNlcnZlZAordmFsdWVzKSB3aGlsZSBtYWtpbmcgdXNlIG9mIHN1cHBvcnRlZCBjb21wYXJpc29uIG9wZXJhdG9ycy4gU2VlIFxmQmx2bVxmUCg4KQorYW5kIFxmQlwtU1xmUCwgXGZCXC1cLXNlbGVjdFxmUCBkZXNjcmlwdGlvbiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbgorYWJvdXQgY29uc3RydWN0aW5nIHRoZSBTZWxlY3Rpb24gY3JpdGVyaWEuIEFzIGEgcXVpY2sgaGVscCBhbmQgdG8gc2VlIGZ1bGwKK2xpc3Qgb2YgY29sdW1uIG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gU2VsZWN0aW9uIGluY2x1ZGluZyB0aGUgbGlzdCBvZgorcmVzZXJ2ZWQgdmFsdWVzIGFuZCB0aGUgc2V0IG9mIHN1cHBvcnRlZCBzZWxlY3Rpb24gb3BlcmF0b3JzLCBjaGVjayB0aGUKK291dHB1dCBvZiBcZkJ2Z3MgLVMgaGVscFxmUCBjb21tYW5kLgorLlRQCisuQiBcLVwtc2VwYXJhdG9yIFxmSVNlcGFyYXRvcgorU3RyaW5nIHRvIHVzZSB0byBzZXBhcmF0ZSBlYWNoIGNvbHVtbi4gIFVzZWZ1bCBpZiBncmVwcGluZyB0aGUgb3V0cHV0LgorLlRQCisuQiBcLVwtdW5idWZmZXJlZAorUHJvZHVjZSBvdXRwdXQgaW1tZWRpYXRlbHkgd2l0aG91dCBzb3J0aW5nIG9yIGFsaWduaW5nIHRoZSBjb2x1bW5zIHByb3Blcmx5LgorLlRQCisuQiBcLVwtdW5pdHMgXGZJaEhiQnNTa0ttTWdHdFRwUGVFCitBbGwgc2l6ZXMgYXJlIG91dHB1dCBpbiB0aGVzZSB1bml0czogKGgpdW1hbi1yZWFkYWJsZSwgKGIpeXRlcywgKHMpZWN0b3JzLAorKGspaWxvYnl0ZXMsIChtKWVnYWJ5dGVzLCAoZylpZ2FieXRlcywgKHQpZXJhYnl0ZXMsIChwKWV0YWJ5dGVzLCAoZSl4YWJ5dGVzLiAgCitDYXBpdGFsaXNlIHRvIHVzZSBtdWx0aXBsZXMgb2YgMTAwMCAoUy5JLikgaW5zdGVhZCBvZiAxMDI0LiAgQ2FuIGFsc28gc3BlY2lmeSAKK2N1c3RvbSB1bml0cyBlLmcuIFwtXC11bml0cyAzTQorLlRQCisuQiBcLVwtdW5xdW90ZWQKK1doZW4gdXNlZCB3aXRoIFxmQlwtXC1uYW1lcHJlZml4ZXNcZlAsIG91dHB1dCB2YWx1ZXMgaW4gdGhlIGZpZWxkPXZhbHVlCitwYWlycyBhcmUgbm90IHF1b3RlZC4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdkaXNwbGF5ICg4KSwKKy5CUiBwdnMgKDgpLAorLkJSIGx2cyAoOCkKZGlmZiAtLWdpdCBhL21hbi92Z3NjYW4uOC5pbiBiL21hbi92Z3NjYW4uOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVkODE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFuL3Znc2Nhbi44LmluCkBAIC0wLDAgKzEsNDMgQEAKKy5USCBWR1NDQU4gOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z3NjYW4gXChlbSBzY2FuIGFsbCBkaXNrcyBmb3Igdm9sdW1lIGdyb3VwcyBhbmQgcmVidWlsZCBjYWNoZXMKKy5TSCBTWU5PUFNJUworLkIgdmdzY2FuCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC0/IHwgXC1cLWhlbHAgXQorLlJCIFsgXC1cLWlnbm9yZWxvY2tpbmdmYWlsdXJlIF0KKy5SQiBbIFwtXC1ta25vZGVzIF0KKy5SQiBbIFwtXC1ub3RpZnlkYnVzIF0KKy5SQiBbIFwtUCB8IFwtXC1wYXJ0aWFsIF0KKy5SQiBbIFwtXC1yZXBvcnRmb3JtYXQKKy5SQiB7IGJhc2ljIHwganNvbiB9XQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLlNIIERFU0NSSVBUSU9OCit2Z3NjYW4gc2NhbnMgYWxsIFNDU0ksIChFKUlERSBkaXNrcywgbXVsdGlwbGUgZGV2aWNlcyBhbmQgYSBidW5jaAorb2Ygb3RoZXIgZGlzayBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gbG9va2luZyBmb3IgTFZNIHBoeXNpY2FsIHZvbHVtZXMKK2FuZCB2b2x1bWUgZ3JvdXBzLiAgRGVmaW5lIGEgZmlsdGVyIGluIFxmQmx2bS5jb25mXGZQKDUpIHRvIHJlc3RyaWN0IAordGhlIHNjYW4gdG8gYXZvaWQgYSBDRCBST00sIGZvciBleGFtcGxlLgorLkxQCitJbiBMVk0yLCB2Z3NjYW5zIHRha2UgcGxhY2UgYXV0b21hdGljYWxseTsgYnV0IHlvdSBtaWdodCBzdGlsbCBuZWVkIHRvCitydW4gb25lIGV4cGxpY2l0bHkgYWZ0ZXIgY2hhbmdpbmcgaGFyZHdhcmUuCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuVFAKKy5CIFwtXC1ta25vZGVzCitBbHNvIGNoZWNrcyB0aGUgTFZNIHNwZWNpYWwgZmlsZXMgaW4gL2RldiB0aGF0IGFyZSBuZWVkZWQgZm9yIGFjdGl2ZSAKK2xvZ2ljYWwgdm9sdW1lcyBhbmQgY3JlYXRlcyBhbnkgbWlzc2luZyBvbmVzIGFuZCByZW1vdmVzIHVudXNlZCBvbmVzLgorLlRQCisuQiBcLVwtbm90aWZ5ZGJ1cworU2VuZCBhIG5vdGlmaWNhdGlvbiB0byBELUJ1cy4gVGhlIGNvbW1hbmQgd2lsbCBleGl0IHdpdGggYW4gZXJyb3IKK2lmIExWTSBpcyBub3QgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciBELUJ1cyBub3RpZmljYXRpb24sIG9yIGlmIHRoZQorbm90aWZ5X2RidXMgY29uZmlnIHNldHRpbmcgaXMgZGlzYWJsZWQuCisuVFAKKy5CIFwtXC1jYWNoZQorU2NhbiBkZXZpY2VzIGZvciBMVk0gcGh5c2ljYWwgdm9sdW1lcyBhbmQgdm9sdW1lIGdyb3VwcyBhbmQgaW5zdHJ1Y3QKK3RoZSBsdm1ldGFkIGRhZW1vbiB0byB1cGRhdGUgaXRzIGNhY2hlZCBzdGF0ZSBhY2NvcmRpbmdseS4KKy5TSCBTRUUgQUxTTworLkJSIGx2bSAoOCksCisuQlIgdmdjcmVhdGUgKDgpLAorLkJSIHZnY2hhbmdlICg4KQpkaWZmIC0tZ2l0IGEvbWFuL3Znc3BsaXQuOC5pbiBiL21hbi92Z3NwbGl0LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzOWVkNQotLS0gL2Rldi9udWxsCisrKyBiL21hbi92Z3NwbGl0LjguaW4KQEAgLTAsMCArMSw4MCBAQAorLlRIIFZHU1BMSVQgOCAiTFZNIFRPT0xTICNWRVJTSU9OIyIgIlNpc3RpbmEgU29mdHdhcmUgVUsiIFwiIC0qLSBucm9mZiAtKi0KKy5TSCBOQU1FCit2Z3NwbGl0IFwoZW0gc3BsaXQgYSB2b2x1bWUgZ3JvdXAgaW50byB0d28KKy5TSCBTWU5PUFNJUworLkIgdmdzcGxpdAorLlJCIFsgXC1cLWFsbG9jCisuSVIgQWxsb2NhdGlvblBvbGljeSBdCisuUkIgWyBcLUEgfCBcLVwtYXV0b2JhY2t1cAorLlJJIHsgeSB8IG4gfV0KKy5SQiBbIFwtYyB8IFwtXC1jbHVzdGVyZWQKKy5SSSB7IHkgfCBuIH1dCisuUkIgWyBcLVwtY29tbWFuZHByb2ZpbGUKKy5JUiBQcm9maWxlTmFtZSBdCisuUkIgWyBcLWQgfCBcLVwtZGVidWcgXQorLlJCIFsgXC1oIHwgXC1cLWhlbHAgXQorLlJCIFsgXC1sIHwgXC1cLW1heGxvZ2ljYWx2b2x1bWVzCisuSVIgTWF4TG9naWNhbFZvbHVtZXMgXQorLlJCIFsgXC1NIHwgXC1cLW1ldGFkYXRhdHlwZQorLklSIHR5cGUgXQorLlJCIFsgXC1wIHwgXC1cLW1heHBoeXNpY2Fsdm9sdW1lcworLklSIE1heFBoeXNpY2FsVm9sdW1lcyBdCisuUkIgWyBcLVwtIFsgdmcgXSBtZXRhZGF0YWNvcGllcworLklSIE51bWJlck9mQ29waWVzIHwgdW5tYW5hZ2VkIHwgYWxsIF0KKy5SQiBbIFwtbiB8IFwtXC1uYW1lCisuSVIgTG9naWNhbFZvbHVtZU5hbWUgXQorLlJCIFsgXC10IHwgXC1cLXRlc3QgXQorLlJCIFsgXC12IHwgXC1cLXZlcmJvc2UgXQorLkkgU291cmNlVm9sdW1lR3JvdXBOYW1lIERlc3RpbmF0aW9uVm9sdW1lR3JvdXBOYW1lCisuUkkgWyBQaHlzaWNhbFZvbHVtZVBhdGggLi4uXQorLlNIIERFU0NSSVBUSU9OCit2Z3NwbGl0IG1vdmVzIG9uZSBvciBtb3JlIHBoeXNpY2FsIHZvbHVtZXMgZnJvbQorXGZJU291cmNlVm9sdW1lR3JvdXBOYW1lXGZQIGludG8gXGZJRGVzdGluYXRpb25Wb2x1bWVHcm91cE5hbWVcZlAuCitUaGUgcGh5c2ljYWwgdm9sdW1lcyBtb3ZlZCBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBleHBsaWNpdGx5IHZpYQorXGZJUGh5c2ljYWxWb2x1bWVQYXRoXGZQLCBvciBpbXBsaWNpdGx5IGJ5IFxmQlwtblxmUAorXGZJTG9naWNhbFZvbHVtZU5hbWVcZlAsIGluIHdoaWNoIGNhc2Ugb25seSBwaHlzaWNhbCB2b2x1bWVzCit1bmRlcmx5aW5nIHRoZSBzcGVjaWZpZWQgbG9naWNhbCB2b2x1bWUgd2lsbCBiZSBtb3ZlZC4KKworSWYgXGZJRGVzdGluYXRpb25Wb2x1bWVHcm91cE5hbWVcZlAgZG9lcyBub3QgZXhpc3QsIGEgbmV3IHZvbHVtZQorZ3JvdXAgd2lsbCBiZSBjcmVhdGVkLiAgVGhlIGRlZmF1bHQgYXR0cmlidXRlcworZm9yIHRoZSBuZXcgdm9sdW1lIGdyb3VwIGNhbiBiZSBzcGVjaWZpZWQgd2l0aAorLkJSIFwtXC1hbGxvYyAsCisuQlIgXC1cLWNsdXN0ZXJlZCAsCisuQlIgXC1cLW1heGxvZ2ljYWx2b2x1bWVzICwKKy5CUiBcLVwtbWV0YWRhdGF0eXBlICwKKy5CIFwtXC1tYXhwaHlzaWNhbHZvbHVtZXMgXGZSYW5kCisuQlIgXC1cLSBbIHZnIF0gbWV0YWRhdGFjb3BpZXMKKyhzZWUgXGZCdmdjcmVhdGVcZlAoOCkgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlc2Ugb3B0aW9ucykuICBJZiBhbnkKK29mIHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBnaXZlbiwgZGVmYXVsdCBhdHRyaWJ1dGUocykgYXJlIHRha2VuIGZyb20KK1xmSVNvdXJjZVZvbHVtZUdyb3VwTmFtZVxmUC4gSWYgYSBub24tTFZNMiBtZXRhZGF0YSB0eXBlIChlLmcuIGx2bTEpIGlzCitiZWluZyB1c2VkLCB5b3Ugc2hvdWxkIHVzZSB0aGUgXGZCXC1NXGZQIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtZXRhZGF0YQordHlwZSBkaXJlY3RseS4KKworSWYKKy5JIERlc3RpbmF0aW9uVm9sdW1lR3JvdXBOYW1lCitkb2VzIGV4aXN0LCBpdCB3aWxsIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorLkkgU291cmNlVm9sdW1lR3JvdXBOYW1lCitiZWZvcmUgdGhlIHBoeXNpY2FsIHZvbHVtZXMgYXJlIG1vdmVkLiBTcGVjaWZ5aW5nIGFueSBvZiB0aGUgYWJvdmUgZGVmYXVsdAordm9sdW1lIGdyb3VwIGF0dHJpYnV0ZXMgd2l0aCBhbiBleGlzdGluZyBkZXN0aW5hdGlvbiB2b2x1bWUgZ3JvdXAgaXMgYW4gZXJyb3IsCithbmQgbm8gc3BsaXQgd2lsbCBvY2N1ci4KKworTG9naWNhbCB2b2x1bWVzIGNhbm5vdCBiZSBzcGxpdCBiZXR3ZWVuIHZvbHVtZSBncm91cHMuIFxmQnZnc3BsaXRcZlAoOCkgb25seQorbW92ZXMgY29tcGxldGUgcGh5c2ljYWwgdm9sdW1lczogVG8gbW92ZSBwYXJ0IG9mIGEgcGh5c2ljYWwgdm9sdW1lLCB1c2UKK1xmQnB2bW92ZVxmUCg4KS4gIEVhY2ggZXhpc3RpbmcgbG9naWNhbCB2b2x1bWUgbXVzdCBiZSBlbnRpcmVseSBvbiB0aGUgcGh5c2ljYWwKK3ZvbHVtZXMgZm9ybWluZyBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgZGVzdGluYXRpb24gdm9sdW1lIGdyb3VwLiAgRm9yIHRoaXMKK3JlYXNvbiwgXGZCdmdzcGxpdFxmUCg4KSBtYXkgZmFpbCB3aXRoIGFuIGVycm9yIGlmIGEgc3BsaXQgd291bGQgcmVzdWx0IGluIGEKK2xvZ2ljYWwgdm9sdW1lIGJlaW5nIHNwbGl0IGFjcm9zcyB2b2x1bWUgZ3JvdXBzLgorCitBIHZnc3BsaXQgaW50byBhbiBleGlzdGluZyB2b2x1bWUgZ3JvdXAgcmV0YWlucyB0aGUgZXhpc3Rpbmcgdm9sdW1lIGdyb3VwJ3MKK3ZhbHVlIG9mIFxmUHZnbWV0YWRhdGFjb3BpZXNcZlAgKHNlZSBcZkJ2Z2NyZWF0ZVxmUCg4KSBhbmQgXGZCbHZtLmNvbmZcZlAoNSkgZm9yIGZ1cnRoZXIKK2V4cGxhbmF0aW9uIG9mIFxmUHZnbWV0YWRhdGFjb3BpZXNcZlApLiAgVG8gY2hhbmdlIHRoZSB2YWx1ZSBvZgorXGZCdmdtZXRhZGF0YWNvcGllc1xmUCwgdXNlIFxmQnZnY2hhbmdlXGZQKDgpLgorCisuU0ggT1BUSU9OUworU2VlIFxmQmx2bVxmUCg4KSBmb3IgY29tbW9uIG9wdGlvbnMuCisuU0ggU0VFIEFMU08KKy5CUiBsdm0gKDgpLAorLkJSIHZnY3JlYXRlICg4KSwKKy5CUiB2Z2V4dGVuZCAoOCksCisuQlIgdmdyZWR1Y2UgKDgpLAorLkJSIHZnbWVyZ2UgKDgpCmRpZmYgLS1naXQgYS9uaXgvUkVBRE1FIGIvbml4L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU3YTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbml4L1JFQURNRQpAQCAtMCwwICsxLDEzIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBuaXggaW50ZWdyYXRpb24gZm9yIGJ1aWxkaW5nIGFuZCB0ZXN0aW5nIExWTTIgaW4gdmFyaW91cwordmlydHVhbCBtYWNoaW5lIGNvbmZpZ3VyYXRpb25zLiBUaGUgKi5uaXggZmlsZXMgYXJlIHdyaXR0ZW4gaW4gdGhlIG5peAorZGVjbGFyYXRpdmUgbGFuZ3VhZ2UgKHNlZSBodHRwOi8vbml4b3Mub3JnL25peCkuCisKK1RoZXJlIGFyZSB0d28gYmFzaWMgdXNlLWNhc2VzIGZvciB0aGlzIGludGVncmF0aW9uLiBGaXJzdCwgYSBoeWRyYSBpbnN0YW5jZSAoc2VlCitodHRwOi8vZGl2aW5lLmZpLm11bmkuY3ovaHlkcmEvcHJvamVjdC9sdm0yIGFuZAoraHR0cDovL2RpdmluZS5maS5tdW5pLmN6L354cm9ja2FpL2x2bS10ZXN0bWF0cml4Lmh0bWwpIGJ1aWxkcyBhbmQgdGVzdHMgTFZNIGluCithbGwgdGhlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlZCBpbiBkZWZhdWx0Lm5peCBhZnRlciBldmVyeSBwdXNoIHRvIHRoZSBnaXQKK3JlcG9zaXRvcnkuIFNlY29uZCwgYW55IG5peC1lbmFibGVkIHN5c3RlbSBjYW4gdmVyeSBjbG9zZWx5IHJlcHJvZHVjZSBhbnkgb2YKK3Rob3NlIHRlc3Qgc2NlbmFyaW9zIHVzaW5nIHRoZSAiYnVpbGQuc2giIHNjcmlwdCBhbmQgYW4gYXBwcm9wcmlhdGUgY2hlY2tvdXQgb2YKKyJuaXhwa2dzIiAoY2YuIGh0dHA6Ly9uaXhvcy5vcmcvbml4cGtncykuCisKKyhUaGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGlzIFRPRE8uKQpkaWZmIC0tZ2l0IGEvbml4L2J1aWxkLnNoIGIvbml4L2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg4ZjY0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9uaXgvYnVpbGQuc2gKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL3NoCitzZXQgLWV4CitybSAtZiByZXN1bHQKK3JtIC1mIGRpdmluZS1zbmFwc2hvdC50YXIuZ3oKK3JtIC1yZiBsdm0tc25hcHNob3QKK21rZGlyIGx2bS1zbmFwc2hvdAorZ2l0IGxzLXRyZWUgLXIgSEVBRCAtLW5hbWUtb25seSB8IHhhcmdzIGNwIC0tcGFyZW50cyAtLXRhcmdldC1kaXJlY3Rvcnk9bHZtLXNuYXBzaG90Cit0YXIgY3Z6ZiBsdm0tc25hcHNob3QudGFyLmd6IGx2bS1zbmFwc2hvdAorbml4LWJ1aWxkIG5peC8gXAorICAgIC0tYXJnIGx2bTJTcmMgImBwd2RgL2x2bS1zbmFwc2hvdC50YXIuZ3oiIFwKKyAgICAtLWFyZyBsdm0yTml4IGBwd2RgIC1BICIkQCIKZGlmZiAtLWdpdCBhL25peC9kZWZhdWx0Lm5peCBiL25peC9kZWZhdWx0Lm5peApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZiY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbml4L2RlZmF1bHQubml4CkBAIC0wLDAgKzEsNDQzIEBACisjIC0qLSBtb2RlOiBuaXg7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KK3sgbml4cGtncyA/IDxuaXhwa2dzPiwgbHZtMlNyYywgcmVsZWFzZSA/IGZhbHNlLAorICByYXdoaWRlMzIgPyAiIiAsIHJhd2hpZGU2NCA/ICIiICwKKyAgZmMyMF8zMl91cGRhdGVzID8gIiIsIGZjMjBfNjRfdXBkYXRlcyA/ICIiLAorICBmYzE5XzMyX3VwZGF0ZXMgPyAiIiwgZmMxOV82NF91cGRhdGVzID8gIiIsCisgIGZjMThfMzJfdXBkYXRlcyA/ICIiLCBmYzE4XzY0X3VwZGF0ZXMgPyAiIiwKKyAgVCA/ICIiLCBFTlYgPyAiIiwgdGltZW91dCA/IDYwLAorICBvdmVycmlkZXMgPyB7IHBrZ3MgfTogeyBpbnN0YWxsX3JwbXMgPSB7fTsgZGlzdHJvcyA9IHt9OyBjb25maWdzID0ge307IH0gfToKKworbGV0CisgIHBrZ3MgPSBpbXBvcnQgbml4cGtncyB7fTsKKyAgbGliID0gcGtncy5saWI7CisgIG92ZXIgPSBvdmVycmlkZXMgeyBpbmhlcml0IHBrZ3M7IH07CisgIGluc3RhbGxfbGNvdiA9ICcnCisgICAgIHJwbSAtVXYgJHtwa2dzLmZldGNodXJsIHsKKyAgICAgICAgdXJsID0gImh0dHA6Ly9hcmNoaXZlcy5mZWRvcmFwcm9qZWN0Lm9yZy9wdWIvYXJjaGl2ZS9mZWRvcmEvbGludXgvdXBkYXRlcy8xNi9pMzg2L2xjb3YtMS45LTIuZmMxNi5ub2FyY2gucnBtIjsKKyAgICAgICAgc2hhMjU2ID0gIjB5Y2RoNW1iN3A1bGw3Nm1xazBwNmdwbmpza3Z4eGdoM2EzYmZyMWNyaDk0bnZwd2hwNHoiOyB9fQorICAnJzsKKworICBta1Rlc3QgPSBhcmdzOiBwa2dzLnN0ZGVudi5ta0Rlcml2YXRpb24gcmVjIHsKKyAgICAgbmFtZSA9ICJsdm0yLXRlc3QtJHsoYXJncy5kaXNrRnVuIHt9KS5uYW1lfSI7CisKKyAgICAgYnVpbGRlciA9IHBrZ3Mud3JpdGVTY3JpcHQgImx2bTItY29sbGVjdC1yZXN1bHRzIiAnJworICAgICAgICMhJHtwa2dzLmJhc2h9L2Jpbi9iYXNoCisgICAgICAgLiAkc3RkZW52L3NldHVwCisgICAgICAgbWtkaXIgLXAgJG91dC90ZXN0LXJlc3VsdHMKKyAgICAgICBmb3IgaSBpbiAke2xpYi5jb25jYXRTdHJpbmdzU2VwICIgIiBidWlsZElucHV0c307IGRvCisgICAgICAgICBjYXQgJGkvdGVzdC1yZXN1bHRzL2xpc3QgPj4gJG91dC90ZXN0LXJlc3VsdHMvbGlzdAorICAgICAgICAgY3AgJGkvdGVzdC1yZXN1bHRzJy8nKi50eHQgJG91dC90ZXN0LXJlc3VsdHMvIHx8IHRydWUKKyAgICAgICBkb25lCisgICAgICAgbWtkaXIgLXAgJG91dC9uaXgtc3VwcG9ydAorICAgICAgIGdyZXAgJ1w8ZmFpbGVkXD4nICRvdXQvdGVzdC1yZXN1bHRzL2xpc3QgJiYgdG91Y2ggJG91dC9uaXgtc3VwcG9ydC9mYWlsZWQgfHwgdHJ1ZQorICAgICAnJzsKKworICAgICBidWlsZElucHV0cyA9IG1hcCAoeDogcnVuVGVzdCAoYXJncyAvLyB7IGZsYXZvdXIgPSB4OyB9KSkKKyAgICAgICBbICJuZGV2LXZhbmlsbGEiICJuZGV2LWx2bWV0YWQiICJuZGV2LWNsdXN0ZXIiICJ1ZGV2LXZhbmlsbGEiICJ1ZGV2LWx2bWV0YWQiICJ1ZGV2LWNsdXN0ZXIiIF07CisgIH07CisKKyAgcnVuVGVzdCA9IHsgYnVpbGQsIGRpc2tGdW4sIGV4dHJhcyA/IFtdLCBrZXJuZWwsIHZtdG9vbHMsIGZsYXZvdXIsIC4uLiB9OiBwa2dzLnN0ZGVudi5ta0Rlcml2YXRpb24gcmVjIHsKKyAgICAgZGlza0ltYWdlID0gZGlza0Z1biB7IGV4dHJhUGFja2FnZXMgPSBleHRyYXM7IH07CisgICAgIG5hbWUgPSAibHZtMi10ZXN0LSR7ZGlza0ltYWdlLm5hbWV9LSR7Zmxhdm91cn0iOworCisgICAgICMgdGhpcyBpcyB0aGUgYnVpbGRlciB0aGF0IHJ1bnMgaW4gdGhlIGd1ZXN0CisgICAgIG9yaWdCdWlsZGVyID0gcGtncy53cml0ZVNjcmlwdCAidm0tdGVzdC1ndWVzdCIgJycKKyAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICBleHBvcnQgUEFUSD0vdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbgorCisgICAgICAgICAjIHdlIGFsd2F5cyBydW4gaW4gYSBmcmVzaCBpbWFnZSwgc28gbmVlZCB0byBpbnN0YWxsIGV2ZXJ5dGhpbmcgYWdhaW4KKyAgICAgICAgIGxzICR7YnVpbGR9L3JwbXMvKi8qLnJwbSB8IGdyZXAgLXYgc3lzdmluaXQgfCB4YXJncyBycG0gLVV2IC0tb2xkcGFja2FnZSAjICovCisgICAgICAgICAke2luc3RhbGxfbGNvdn0KKworICAgICAgICAgbWtkaXIgLXAgL3hjaGcvcmVzdWx0cworICAgICAgICAgdG91Y2ggL3hjaGcvYm9vdGVkCisKKyAgICAgICAgIGRtc2V0dXAgdGFyZ2V0cworCisgICAgICAgICBleHBvcnQgTFZNX1RFU1RfQkFDS0lOR19ERVZJQ0U9L2Rldi9zZGIKKyAgICAgICAgIHVsaW1pdCAtYyB1bmxpbWl0ZWQKKworICAgICAgICAgd2F0Y2g9CisgICAgICAgICBpZiBlY2hvICR7Zmxhdm91cn0gfCBncmVwIC1xIHVkZXY7IHRoZW4KKyAgICAgICAgICAgKC91c3IvbGliL3N5c3RlbWQvc3lzdGVtZC11ZGV2ZCB8fCAvdXNyL2xpYi91ZGV2L3VkZXZkIHx8IC9zYmluL3VkZXZkIHx8IFwKKyAgICAgICAgICAgIGZpbmQgLyAteGRldiAtbmFtZSBcKnVkZXZkKSA+PiAveGNoZy91ZGV2ZC5sb2cgMj4mMSAmCisgICAgICAgICAgIHdhdGNoPSItLXdhdGNoIC94Y2hnL3VkZXZkLmxvZyIKKyAgICAgICAgIGZpCisKKyAgICAgICAgIGV4cG9ydCAke0VOVn0KKyAgICAgICAgIGx2bTItdGVzdHN1aXRlIC0tYmF0Y2ggLS1vdXRkaXIgL3hjaGcvcmVzdWx0cyAtLWNvbnRpbnVlIFwKKyAgICAgICAgICAgICAtLXRpbWVvdXQgJHt0b1N0cmluZyB0aW1lb3V0fSAtLWZhdGFsLXRpbWVvdXRzIC0taGVhcnRiZWF0IC94Y2hnL2hlYXJ0YmVhdCBcCisgICAgICAgICAgICAgLS1mbGF2b3VycyAke2ZsYXZvdXJ9ICR3YXRjaCAtLWttc2cgJHtpZiBsaWIuZXFTdHJpbmdzIFQgIiIgdGhlbiAiIiBlbHNlICItLW9ubHkgJHtUfSJ9CisKKyAgICAgICAgICMgVE9ETzogY292ZXJhZ2UgcmVwb3J0cworICAgICAgICAgIyBtYWtlIGxjb3YgfHwgdHJ1ZQorICAgICAgICAgIyBjcCAtUiBsY292X3JlcG9ydHMgJG91dC9jb3ZlcmFnZSAmJiBcCisgICAgICAgICAjICAgICBlY2hvICJyZXBvcnQgY292ZXJhZ2UgJG91dC9jb3ZlcmFnZSIgPj4gJG91dC9uaXgtc3VwcG9ydC9oeWRyYS1idWlsZC1wcm9kdWN0cyB8fCBcCisgICAgICAgICAjICAgICB0cnVlICMgbm90IHJlYWxseSBmYXRhbCwgYWx0aG91Z2gga2luZGEgZGlzYXBwb2ludGluZworICAgICAnJzsKKworICAgICBidWlsZElucHV0cyA9IFsgcGtncy5jb3JldXRpbHMgcGtncy5iYXNoIHBrZ3MudXRpbGxpbnV4IF07CisKKyAgICAgIyBtYWtlIGEgcWNvdyBjb3B5IG9mIHRoZSBtYWluIGltYWdlCisgICAgIHByZVZNID0gJycKKyAgICAgICBkaXNrSW1hZ2U9JChwd2QpL2Rpc2staW1hZ2UucWNvdzIKKyAgICAgICBvcmlnSW1hZ2U9JHtkaXNrSW1hZ2V9CisgICAgICAgaWYgdGVzdCAtZCAiJG9yaWdJbWFnZSI7IHRoZW4gb3JpZ0ltYWdlPSIkb3JpZ0ltYWdlL2Rpc2staW1hZ2UucWNvdzIiOyBmaQorICAgICAgICR7dm10b29scy5xZW11fS9iaW4vcWVtdS1pbWcgY3JlYXRlIC1iICIkb3JpZ0ltYWdlIiAtZiBxY293MiAkZGlza0ltYWdlCisgICAgICcnOworCisgICAgIGJ1aWxkZXIgPSBwa2dzLndyaXRlU2NyaXB0ICJ2bS10ZXN0IiAnJworICAgICAgICMhJHtwa2dzLmJhc2h9L2Jpbi9iYXNoCisgICAgICAgLiAkc3RkZW52L3NldHVwCisKKyAgICAgICBleHBvcnQgUUVNVV9PUFRTPSItZHJpdmUgZmlsZT0vZGV2L3NobS90ZXN0ZGlzay5pbWcsaWY9aWRlIC1tIDI1Nk0iCisgICAgICAgZXhwb3J0IFFFTVVfRFJJVkVfT1BUUz0iLGlmPWlkZSIKKyAgICAgICBleHBvcnQgS0VSTkVMX09QVFM9ImxvZ19idWZfbGVuPTEzMTA3MiBsb2dsZXZlbD0xIgorICAgICAgIGV4cG9ydCBtb3VudERpc2s9MQorCisgICAgICAgbWtkaXIgLXAgJG91dC90ZXN0LXJlc3VsdHMgJG91dC9uaXgtc3VwcG9ydAorICAgICAgIHRvdWNoICRvdXQvbml4LXN1cHBvcnQvZmFpbGVkCisKKyAgICAgICBtb25pdG9yKCkgeworICAgICAgICAgICBzZXQgK2UKKyAgICAgICAgICAgY291bnRlcj0wCisgICAgICAgICAgIHJtIC1mIGouY3VycmVudCBqLmxhc3QgdC5jdXJyZW50IHQubGFzdAorICAgICAgICAgICB3aGlsZSB0cnVlOyBkbworICAgICAgICAgICAgICAgaWYgISB0ZXN0IC1mIHBpZDsgdGhlbgorICAgICAgICAgICAgICAgICAgIGNvdW50ZXI9MAorICAgICAgICAgICAgICAgICAgIHNsZWVwIDYwCisgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIGNhdCB4Y2hnL3Jlc3VsdHMvam91cm5hbCA+IGouY3VycmVudCAyPiAvZGV2L251bGwKKyAgICAgICAgICAgICAgIGNhdCB4Y2hnL2hlYXJ0YmVhdCA+IGhiLmN1cnJlbnQgMj4gL2Rldi9udWxsCisgICAgICAgICAgICAgICBpZiBkaWZmIGouY3VycmVudCBqLmxhc3QgPiYgL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICAgICAgICAgY291bnRlcj0kKCgkY291bnRlciArIDEpKTsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBjb3VudGVyPTAKKyAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICBpZiB0ZXN0ICRjb3VudGVyIC1lcSAxMCB8fCB0ZXN0ICQod2MgLWMgPGhiLmN1cnJlbnQpIC1lcSAkKHdjIC1jIDxoYi5sYXN0KTsgdGhlbgorICAgICAgICAgICAgICAgICAgIGVjaG8KKyAgICAgICAgICAgICAgICAgICBlY2hvICJWTSBnb3Qgc3R1Y2s7IGhlYXJ0YmVhdDogJCh3YyAtYyA8aGIuY3VycmVudCkgJCh3YyAtYyA8aGIubGFzdCksIGNvdW50ZXIgPSAkY291bnRlci4iCisgICAgICAgICAgICAgICAgICAgZWNobyAibGFzdCBqb3VybmFsIGVudHJ5OiAkKHRhaWwgLW4gMSBqLmN1cnJlbnQpLCBwcmV2aW91c2x5ICQodGFpbCAtbiAxIGoubGFzdCkiCisgICAgICAgICAgICAgICAgICAga2lsbCAtLSAtJChjYXQgcGlkKQorICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgIHNsZWVwIDYwCisgICAgICAgICAgICAgICBtdiBqLmN1cnJlbnQgai5sYXN0ID4mIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgbXYgaGIuY3VycmVudCBoYi5sYXN0ID4mIC9kZXYvbnVsbAorICAgICAgICAgICBkb25lCisgICAgICAgfQorCisgICAgICAgbW9uaXRvciAmCisKKyAgICAgICBmb3IgaSBpbiBgc2VxIDEgMjBgOyBkbyAjIHdlIGFsbG93IHVwIHRvIDIwIFZNIHJlc3RhcnRzCisgICAgICAgICAgIHJtIC1mIHhjaGcvYm9vdGVkCisgICAgICAgICAgICR7dm10b29scy5xZW11fS9iaW4vcWVtdS1pbWcgY3JlYXRlIC1mIHFjb3cyIC9kZXYvc2htL3Rlc3RkaXNrLmltZyA0RworICAgICAgICAgICBzZXRzaWQgYmFzaCAtZSAke3ZtdG9vbHMudm1SdW5Db21tYW5kICh2bXRvb2xzLnFlbXVDb21tYW5kTGludXgga2VybmVsKX0gJgorICAgICAgICAgICBwaWQ9JCEKKworICAgICAgICAgICAjIGdpdmUgdGhlIFZNIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIHJ1bm5pbmcKKyAgICAgICAgICAgc2xlcHQ9MAorICAgICAgICAgICB3aGlsZSB0ZXN0ICRzbGVwdCAtbGUgMTgwICYmIHRlc3QgISAtZSB4Y2hnL2Jvb3RlZDsgZG8KKyAgICAgICAgICAgICAgIHNsZWVwIDEwCisgICAgICAgICAgICAgICBzbGVwdD0kKCgkc2xlcHQgKyAxMCkpCisgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgZWNobyAkcGlkID4gcGlkICMgbW9uaXRvciBnbworICAgICAgICAgICB3YWl0ICRwaWQgfHwgdHJ1ZQorICAgICAgICAgICBybSAtZiBwaWQgIyBkaXNhcm0gdGhlIG1vbml0b3IgcHJvY2VzcworCisgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbnkgbmV3IHJlc3VsdHMsIHN0YXNoIHRoZW0KKyAgICAgICAgICAgbXYgeGNoZy9yZXN1bHRzJy8nKi50eHQgJG91dC90ZXN0LXJlc3VsdHMvIHx8IHRydWUKKworICAgICAgICAgICBpZiB0ZXN0IC1uICIkKGNhdCB4Y2hnL2luLXZtLWV4aXQpIjsgdGhlbiAjIHRoZSBWTSBpcyBkb25lCisgICAgICAgICAgICAgICB0ZXN0IDAgLWVxICIkKGNhdCB4Y2hnL2luLXZtLWV4aXQpIiAmJiBybSAtZiAkb3V0L25peC1zdXBwb3J0L2ZhaWxlZAorICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgZmkKKworICAgICAgICAgICBzbGVlcCAxMCAjIHdhaXQgZm9yIHRoZSBWTSB0byBjbGVhbiB1cCBiZWZvcmUgc3RhcnRpbmcgdXAgYSBuZXcgb25lCisgICAgICAgZG9uZQorCisgICAgICAgY2F0IHhjaGcvcmVzdWx0cy9saXN0ID4gJG91dC90ZXN0LXJlc3VsdHMvbGlzdCB8fCB0cnVlCisgICAgICcnOworICB9OworCisgIG1rVGFyYmFsbCA9IHByb2ZpbGluZzogcGtncy5yZWxlYXNlVG9vbHMuc291cmNlVGFyYmFsbCByZWMgeworICAgIG5hbWUgPSAibHZtMi10YXJiYWxsIjsKKyAgICB2ZXJzaW9uU3VmZml4ID0gaWYgbHZtMlNyYyA/IHJldkNvdW50CisgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gIi5wcmUke3RvU3RyaW5nIGx2bTJTcmMucmV2Q291bnR9IgorICAgICAgICAgICAgICAgICAgICAgICBlbHNlICIiOworICAgIHNyYyA9IGx2bTJTcmM7CisgICAgYXV0b2NvbmZQaGFzZSA9ICI6IjsKKyAgICBkaXN0UGhhc2UgPSAnJworICAgICAgbWFrZSBkaXN0Y2xlYW4KKworICAgICAgdmVyc2lvbj1gY2F0IFZFUlNJT04gfCBjdXQgIi1kKCIgLWYxYCR7dmVyc2lvblN1ZmZpeH0KKyAgICAgIHZlcnNpb25fZG09YGNhdCBWRVJTSU9OX0RNIHwgY3V0ICItZC0iIC1mMWAke3ZlcnNpb25TdWZmaXh9CisKKyAgICAgIGNobW9kIHUrdyAqCisKKyAgICAgICMgc2V0IHVwIHZlcnNpb25zCisgICAgICBzZWQgLWUgcywtZ2l0LCR7dmVyc2lvblN1ZmZpeH0sIC1pIFZFUlNJT04gVkVSU0lPTl9ETQorICAgICAgc2VkIC1lICJzLFwoZGV2aWNlX21hcHBlcl92ZXJzaW9uXCkgWzAtOS5dKiQsXDEgJHZlcnNpb25fZG0sIiBcCisgICAgICAgICAgLWUgInMsXlwoVmVyc2lvbjpbXjAtOSVdKlwpWzAtOS5dKiQsXDEgJHZlcnNpb24sIiBcCisgICAgICAgICAgLWUgInMsXlwoUmVsZWFzZTpbXjAtOSVdKlwpWzAtOS5dXCssXDEgMC5IWURSQSwiIFwKKyAgICAgICAgICAtaSBzcGVjL3NvdXJjZS5pbmMKKworICAgICAgIyB0d2VhayBSUE0gY29uZmlndXJhdGlvbgorICAgICAgZWNobyAgICIlZGVmaW5lIGVuYWJsZV9wcm9maWxpbmcgJHtwcm9maWxpbmd9IiA+PiBzcGVjL3NvdXJjZS5pbmMKKyAgICAgIGVjaG8gICAiJWRlZmluZSBlbmFibGVfdGVzdHN1aXRlIDEiID4+IHNwZWMvc291cmNlLmluYworICAgICAgc2VkIC1lICJzOiV3aXRoIGNsdm1kIGNvcm9zeW5jOiV3aXRoIGNsdm1kIGNvcm9zeW5jLHNpbmdsZW5vZGU6IiAtaSBzcGVjL3NvdXJjZS5pbmMKKworICAgICAgIyBzeW50aGVzaXplIGEgY2hhbmdlbG9nCisgICAgICBzZWQgLWUgJy9eJWNoYW5nZWxvZy8sJGQnIC1pIHNwZWMvbHZtMi5zcGVjCisgICAgICAoZWNobyAiJWNoYW5nZWxvZyI7CisgICAgICAgZWNobyAiKiBgZGF0ZSArIiVhICViICVkICVZImAgUGV0ciBSb2NrYWkgPHByb2NrYWlAcmVkaGF0LmNvbT4gLSAkdmVyc2lvbiI7CisgICAgICAgZWNobyAiLSBBVVRPTUFURUQgQlVJTEQgQlkgSHlkcmEiKSA+PiBzcGVjL2x2bTIuc3BlYworCisgICAgICBjcCBzcGVjLyogLiAjICovICMgUlBNIG5lZWRzIHRoZSBzcGVjIGZpbGUgaW4gdGhlIHNvdXJjZSByb290CisKKyAgICAgICMgbWFrZSBhIHRhcmJhbGwKKyAgICAgIG1rZGlyIC4uL0xWTTIuJHZlcnNpb24KKyAgICAgIG12ICogLi4vTFZNMi4kdmVyc2lvbgorICAgICAgZW5zdXJlRGlyICRvdXQvdGFyYmFsbHMKKyAgICAgIGNkIC4uCisgICAgICB0YXIgY3Z6ZiAkb3V0L3RhcmJhbGxzL0xWTTIuJHZlcnNpb24udGd6IExWTTIuJHZlcnNpb24KKyAgICAnJzsKKyAgfTsKKworICBta0J1aWxkID0geyBzcmMsIFZNLCBleHRyYXMgPyBbXSwgZGlza0Z1biwgLi4uIH06CisgICBWTSByZWMgeworICAgICBuYW1lID0gImx2bTItYnVpbGQtJHtkaXNrSW1hZ2UubmFtZX0iOworICAgICBmdWxsTmFtZSA9ICJsdm0yLWJ1aWxkLSR7ZGlza0ltYWdlLm5hbWV9IjsKKworICAgICBpbmhlcml0IHNyYzsKKyAgICAgZGlza0ltYWdlID0gZGlza0Z1biB7IGV4dHJhUGFja2FnZXMgPSBleHRyYXM7IH07CisgICAgIG1lbVNpemUgPSA1MTI7CisgICAgIGNoZWNrUGhhc2UgPSAiOiI7CisKKyAgICAgcHJlQ29uZmlndXJlID0gaW5zdGFsbF9sY292OworCisgICAgIHBvc3RJbnN0YWxsID0gJycKKyAgICAgIG1rZGlyIC1wICRvdXQvbml4LXN1cHBvcnQKKyAgICAgIGZvciBpIGluICRvdXQvcnBtcy8qLyoucnBtOyBkbyAjICovCisgICAgICAgIGlmIGVjaG8gJGkgfCBncmVwIC12cSAiXC5zcmNcLnJwbSQiOyB0aGVuCisgICAgICAgICAgZWNobyAiZmlsZSBycG0gJGkiID4+ICRvdXQvbml4LXN1cHBvcnQvaHlkcmEtYnVpbGQtcHJvZHVjdHMKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gImZpbGUgc3JwbSAkaSIgPj4gJG91dC9uaXgtc3VwcG9ydC9oeWRyYS1idWlsZC1wcm9kdWN0cworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAnJzsKKyAgIH07CisKKyAgcm9vdG1vZHMgPSBbICJ2aXJ0aW9fcGNpIiAidmlydGlvX2JsayIgInZpcnRpb19iYWxsb29uIiAiZXh0NCIgInVuaXgiCisgICAgICAgICAgICAgICAiY2lmcyIgInZpcnRpb19uZXQiICJ1bml4IiAiaG1hYyIgIm1kNCIgImVjYiIgImRlc19nZW5lcmljIiAic2hhMjU2IgorICAgICAgICAgICAgICAgImF0YV9waWl4IiAic2RfbW9kIiBdOworCisgIGNlbnRvc191cmwgPSB2ZXI6IGFyY2g6IGlmIHZlciA9PSAiNi42IiB8fCB2ZXIgPT0gIjciCisgICAgICAgdGhlbiAiaHR0cDovL2Z0cC5maS5tdW5pLmN6L3B1Yi9saW51eC9jZW50b3MvJHt2ZXJ9L29zLyR7YXJjaH0vIgorICAgICAgIGVsc2UgImh0dHA6Ly92YXVsdC5jZW50b3Mub3JnLyR7dmVyfS9vcy8ke2FyY2h9LyI7CisgIGZlZG9yYV91cmwgPSB2ZXI6IGFyY2g6IGlmIGxpYi5lcVN0cmluZ3MgdmVyICJyYXdoaWRlIiB8fCBsaWIuZXFTdHJpbmdzIHZlciAiMTkiCisgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gImZ0cDovL2Z0cC5maS5tdW5pLmN6L3B1Yi9saW51eC9mZWRvcmEvbGludXgvZGV2ZWxvcG1lbnQvJHt2ZXJ9LyR7YXJjaH0vb3MvIgorICAgICAgICAgICAgICAgICAgICAgICBlbHNlICJtaXJyb3I6Ly9mZWRvcmEvbGludXgvcmVsZWFzZXMvJHt2ZXJ9L0V2ZXJ5dGhpbmcvJHthcmNofS9vcy8iOworICBmZWRvcmFfdXBkYXRlX3VybCA9IHZlcjogYXJjaDogIm1pcnJvcjovL2ZlZG9yYS9saW51eC91cGRhdGVzLyR7dmVyfS8ke2FyY2h9IjsKKworICBkaXN0cm9zID0gd2l0aCBsaWI7IGxldAorICAgICAgY2VudG9zID0geyB2ZXJzaW9uLCBzaGEsIGFyY2ggfTogeworICAgICAgICBuYW1lID0gImNlbnRvcy0ke3ZlcnNpb259LSR7YXJjaH0iOworICAgICAgICBmdWxsTmFtZSA9ICJDZW50T1MgJHt2ZXJzaW9ufSAoJHthcmNofSkiOworICAgICAgICBwYWNrYWdlc0xpc3QgPSBwa2dzLmZldGNodXJsIHsKKyAgICAgICAgICB1cmwgPSBjZW50b3NfdXJsIHZlcnNpb24gYXJjaCArICJyZXBvZGF0YS8ke3NoYX0tcHJpbWFyeS54bWwuZ3oiOworICAgICAgICAgIHNoYTI1NiA9IHNoYTsKKyAgICAgICAgfTsKKyAgICAgICAgdXJsUHJlZml4ID0gY2VudG9zX3VybCB2ZXJzaW9uIGFyY2g7CisgICAgICAgIGFyY2hzID0gWyJub2FyY2giIGFyY2hdICsrIChpZiBlcVN0cmluZ3MgYXJjaCAiaTM4NiIgdGhlbiBbImk1ODYiICJpNjg2Il0gZWxzZSBbXSk7CisgICAgICAgIHBhY2thZ2VzID0gcGtncy52bVRvb2xzLmNvbW1vbkNlbnRPU1BhY2thZ2VzOworICAgICAgfTsKKyAgICAgIGZlZG9yYSA9IHsgdmVyc2lvbiwgc2hhLCBhcmNoIH06IHJlYyB7CisgICAgICAgIG5hbWUgPSAiZmVkb3JhLSR7dmVyc2lvbn0tJHthcmNofSI7CisgICAgICAgIGZ1bGxOYW1lID0gIkZlZG9yYSAke3ZlcnNpb259ICgke2FyY2h9KSI7CisgICAgICAgIHBhY2thZ2VzTGlzdCA9IHBrZ3MuZmV0Y2h1cmwgeworICAgICAgICAgICAgdXJsID0gZmVkb3JhX3VybCB2ZXJzaW9uIGFyY2ggKyAicmVwb2RhdGEvJHtzaGF9LXByaW1hcnkueG1sLmd6IjsKKyAgICAgICAgICAgIHNoYTI1NiA9IHNoYTsKKyAgICAgICAgfTsKKyAgICAgICAgdXJsUHJlZml4ID0gZmVkb3JhX3VybCB2ZXJzaW9uIGFyY2g7CisgICAgICAgIGFyY2hzID0gWyJub2FyY2giIGFyY2hdICsrIChpZiBlcVN0cmluZ3MgYXJjaCAiaTM4NiIgdGhlbiBbImk1ODYiICJpNjg2Il0gZWxzZSBbXSk7CisgICAgICAgIHBhY2thZ2VzID0gcGtncy52bVRvb2xzLmNvbW1vbkZlZG9yYVBhY2thZ2VzOworICAgICAgICB1bmlmaWVkU3lzdGVtRGlyID0gdHJ1ZTsKKyAgICAgIH07CisgICAgICByYXdoaWRlID0gdmVyc2lvbjogYXJjaDogcmVwb2RhdGE6IGltcG9ydCAocGtncy5ydW5Db21tYW5kICJyYXdoaWRlLSR7dmVyc2lvbn0tJHthcmNofS5uaXgiIHt9ICcnCisgICAgICAgIHNoYT0kKGdyZXAgcHJpbWFyeS54bWwgJHtyZXBvZGF0YX0gfCBzZWQgLXJlICdzOi4qIChbMC05YS1mXSspLXByaW1hcnkuKjpcMTonIHwgaGVhZCAtbiAxKQorICAgICAgICBlY2hvICd7ZmVkb3JhfTogZmVkb3JhIHsgdmVyc2lvbiA9ICIke3ZlcnNpb259Ijsgc2hhID0gIickc2hhJyI7IGFyY2ggPSAiJHthcmNofSI7IH0nID4gJG91dAorICAgICAgJycpIHsgaW5oZXJpdCBmZWRvcmE7IH07CisgICAgICB1cGRhdGUgPSB2ZXJzaW9uOiBhcmNoOiByZXBvZGF0YTogb3JpZzogb3JpZyAvLyAoaW1wb3J0IChwa2dzLnJ1bkNvbW1hbmQgInVwZGF0ZXMtZmVkb3JhLm5peCIge30gJycKKyAgICAgICAgICBzaGE9JChncmVwIHByaW1hcnkueG1sICR7cmVwb2RhdGF9IHwgc2VkIC1yZSAnczouKiAoWzAtOWEtZl0rKS1wcmltYXJ5Lio6XDE6JyB8IGhlYWQgLW4gMSkKKyAgICAgICAgICBlY2hvIGZlZG9yYSAke3ZlcnNpb259IHVwZGF0ZXMgc2hhOiAkc2hhCisgICAgICAgICAgKGVjaG8gJ2ZldGNodXJsOiBvcmlnOiB7IHBhY2thZ2VzTGlzdHMgPSBbIG9yaWcucGFja2FnZXNMaXN0ICgnCisgICAgICAgICAgIGVjaG8gImZldGNodXJsIHsgIgorICAgICAgICAgICBlY2hvICIgIHVybCA9IFwiJHtmZWRvcmFfdXBkYXRlX3VybCB2ZXJzaW9uIGFyY2h9L3JlcG9kYXRhLyRzaGEtcHJpbWFyeS54bWwuZ3pcIjsiCisgICAgICAgICAgIGVjaG8gIiAgc2hhMjU2ID0gXCIkc2hhXCI7IgorICAgICAgICAgICBlY2hvICd9ICkgXTsgdXJsUHJlZml4ZXMgPSBbIG9yaWcudXJsUHJlZml4ICIke2ZlZG9yYV91cGRhdGVfdXJsIHZlcnNpb24gYXJjaH0iIF07IH0nCisgICAgICAgICAgKSA+ICRvdXQKKyAgICAgICAgICBlY2hvIGJ1aWx0ICRvdXQgMT4mMgorICAgICAgICAnJykpIHBrZ3MuZmV0Y2h1cmwgb3JpZzsKKyAgICBpbiB7CisgICAgICByYXdoaWRleDg2XzY0ID0gcmF3aGlkZSAicmF3aGlkZSIgIng4Nl82NCIgcmF3aGlkZTY0OworICAgICAgcmF3aGlkZWkzODYgPSByYXdoaWRlICJyYXdoaWRlIiAiaTM4NiIgcmF3aGlkZTMyOworICAgICAgZmVkb3JhMjB1eDg2XzY0ID0gdXBkYXRlICIyMCIgIng4Nl82NCIgZmMyMF82NF91cGRhdGVzIHBrZ3Mudm1Ub29scy5ycG1EaXN0cm9zLmZlZG9yYTIweDg2XzY0OworICAgICAgZmVkb3JhMjB1aTM4NiA9IHVwZGF0ZSAiMjAiICJpMzg2IiBmYzIwXzMyX3VwZGF0ZXMgcGtncy52bVRvb2xzLnJwbURpc3Ryb3MuZmVkb3JhMjBpMzg2OworICAgICAgZmVkb3JhMTl1eDg2XzY0ID0gdXBkYXRlICIxOSIgIng4Nl82NCIgZmMxOV82NF91cGRhdGVzIHBrZ3Mudm1Ub29scy5ycG1EaXN0cm9zLmZlZG9yYTE5eDg2XzY0OworICAgICAgZmVkb3JhMTl1aTM4NiA9IHVwZGF0ZSAiMTkiICJpMzg2IiBmYzE5XzMyX3VwZGF0ZXMgcGtncy52bVRvb2xzLnJwbURpc3Ryb3MuZmVkb3JhMTlpMzg2OworICAgICAgZmVkb3JhMTh1eDg2XzY0ID0gdXBkYXRlICIxOCIgIng4Nl82NCIgZmMxOF82NF91cGRhdGVzIHBrZ3Mudm1Ub29scy5ycG1EaXN0cm9zLmZlZG9yYTE4eDg2XzY0OworICAgICAgZmVkb3JhMTh1aTM4NiA9IHVwZGF0ZSAiMTgiICJpMzg2IiBmYzE4XzMyX3VwZGF0ZXMgcGtncy52bVRvb2xzLnJwbURpc3Ryb3MuZmVkb3JhMThpMzg2OworCisgICAgICAjY2VudG9zNjN4ODZfNjQgPSBjZW50b3MgeworICAgICAgIyAgdmVyc2lvbj0iNi4zIjsgYXJjaD0ieDg2XzY0IjsKKyAgICAgICMgIHNoYT0iNGQzY2RkZjM4MmU4MWMyMGIxNjdhOGQxM2M3YzkyMDY3MDQwYTE5NDdkYmIzYzI5Y2ZhZmEwMWE3NGEyNmEyYiI7CisgICAgICAjfTsKKworICAgICAgI2NlbnRvczYzaTM4NiA9IGNlbnRvcyB7CisgICAgICAjICB2ZXJzaW9uPSI2LjMiOyBhcmNoPSJpMzg2IjsKKyAgICAgICMgIHNoYT0iNWNlZTBlMGM0ZDdlMmRjYjk5N2YxMjNjZTkxMDdkZWRiYzQyNGQ4MGRkN2YyYjI0NzFiM2IzNDhmM2UxNzU0YyI7CisgICAgICAjfTsKKworICAgICAgY2VudG9zNjR4ODZfNjQgPSBjZW50b3MgeworICAgICAgICB2ZXJzaW9uPSI2LjQiOyBhcmNoPSJ4ODZfNjQiOworICAgICAgICBzaGE9IjRkNDAzMGI5MmYwMTBmNDY2ZWI0ZjAwNDMxMmI5ZjUzMmI5ZTg1ZTYwYzVlNjQyMWU4YjQyOWMxODBhYzFlZmUiOworICAgICAgfTsKKworICAgICAgY2VudG9zNjRpMzg2ID0gY2VudG9zIHsKKyAgICAgICAgdmVyc2lvbj0iNi40IjsgYXJjaD0iaTM4NiI7CisgICAgICAgIHNoYT0iODdhYTRjNGUxOWY5YTNlYzkzZTNkODIwZjFlYTZiNmVjZTg4MTBjYjQ1ZjExN2ExNjM1NDQ2NWU1N2ExYjUwZCI7CisgICAgICB9OworCisgICAgICBjZW50b3M2NWkzODYgPSBjZW50b3MgeworICAgICAgICB2ZXJzaW9uPSI2LjUiOyBhcmNoPSJpMzg2IjsKKyAgICAgICAgc2hhPSJhODlmMjdjYzdkM2NlYTQzMWYzYmQ2MDVhMWU5MzA5YzMyZDVkNDA5YWJjMWI1MWE3YjVjNzFjMDVmMThhMGMyIjsKKyAgICAgIH07CisKKyAgICAgIGNlbnRvczY1eDg2XzY0ID0gY2VudG9zIHsKKyAgICAgICAgdmVyc2lvbj0iNi41IjsgYXJjaD0ieDg2XzY0IjsKKyAgICAgICAgc2hhPSIzMzUzZTM3OGY1Y2I0YmI2YzNiM2RkMmNhMjY2YzZkNjhhMWUyOWMzNmNmOTlmNzZhZWEzZDhlMTU4NjI2MDI0IjsKKyAgICAgIH07CisKKyAgICAgIGNlbnRvczY2aTM4NiA9IGNlbnRvcyB7CisgICAgICAgIHZlcnNpb249IjYuNiI7IGFyY2g9ImkzODYiOworICAgICAgICBzaGE9ImE4YjkzNWZjYWMxYzg1MTVjNmQ4ZGFiM2M0M2M1M2IzZTQ2MWY4OWViN2E5M2IxOTE0MzAzNzg0ZTI4ZmNkMTciOworICAgICAgfTsKKworICAgICAgY2VudG9zNjZ4ODZfNjQgPSBjZW50b3MgeworICAgICAgICB2ZXJzaW9uPSI2LjYiOyBhcmNoPSJ4ODZfNjQiOworICAgICAgICBzaGE9Ijc2NTFiMTZhOWEyYThhNWZiZDBhZDNmZjhiYmJlNmYyNDA5YTY0ODUwY2NmZDgzYTZhM2Y4NzRmMTNkODYyMmYiOworICAgICAgfTsKKworICAgICAgY2VudG9zNzB4ODZfNjQgPSBjZW50b3MgeworICAgICAgICB2ZXJzaW9uPSI3IjsgYXJjaD0ieDg2XzY0IjsKKyAgICAgICAgc2hhPSIxYTdkZDBkMzE1YjM5YWQ1MDRmNTRlYTg4Njc2YWI1MDJhNDgwNjRjYjJkODc1YWUzYWUyOTQzMWUxNzU4NjFjIjsKKyAgICAgIH07CisgICAgfSAvLyBvdmVyLmRpc3Ryb3M7CisKKyAgdm0gPSB7IHBrZ3MsIHhtb2RzLCBkbW1vZHMgPyBmYWxzZSB9OiB3aXRoIGxpYjsgcmVjIHsKKyAgICB0b29scyA9IGltcG9ydCAiJHtuaXhwa2dzfS9wa2dzL2J1aWxkLXN1cHBvcnQvdm0vZGVmYXVsdC5uaXgiIHsKKyAgICAgIGluaGVyaXQgcGtnczsgcm9vdE1vZHVsZXMgPSByb290bW9kcyArKyB4bW9kcyArKworICAgICAgICAoaWYgZG1tb2RzIHRoZW4gWyAibG9vcCIgImRtX21vZCIgImRtX3NuYXBzaG90IiAiZG1fbWlycm9yIiAiZG1femVybyIgImRtX3JhaWQiICJkbV90aGluX3Bvb2wiIF0KKyAgICAgICAgICAgICAgICAgICBlbHNlIFtdKTsgfTsKKyAgICByZWxlYXNlID0gaW1wb3J0ICIke25peHBrZ3N9L3BrZ3MvYnVpbGQtc3VwcG9ydC9yZWxlYXNlL2RlZmF1bHQubml4IiB7CisgICAgICBwa2dzID0gcGtncyAvLyB7IHZtVG9vbHMgPSB0b29sczsgfTsgfTsKKyAgICBpbWdzID0gdG9vbHMuZGlza0ltYWdlRnVucyAvLworICAgICAgICAgICAgbWFwQXR0cnMgKG46IGE6IGI6IHBrZ3Mudm1Ub29scy5tYWtlSW1hZ2VGcm9tUlBNRGlzdCAoYSAvLyBiKSkgZGlzdHJvczsKKyAgICBycG1kaXN0cm9zID0gdG9vbHMucnBtRGlzdHJvcyAvLyBkaXN0cm9zOworICAgIHJwbWJ1aWxkID0gdG9vbHMuYnVpbGRSUE07CisgIH07CisKKyAgaW5zdGFsbF9ycG1zID0gcmVjIHsKKyAgICAgIGNvbW1vbiA9IFsgImxpYnNlbGludXgtZGV2ZWwiICJsaWJzZXBvbC1kZXZlbCIgIm5jdXJzZXMtZGV2ZWwiICJyZWFkbGluZS1kZXZlbCIKKyAgICAgICAgICAgICAgICAgInZhbGdyaW5kIiAidmFsZ3JpbmQtZGV2ZWwiICJnZGIiICJzdHJhY2UiCisgICAgICAgICAgICAgICAgICJyZWRoYXQtcnBtLWNvbmZpZyIgIyBuZWVkZWQgZm9yIHJwbWJ1aWxkIG9mIGx2bQorICAgICAgICAgICAgICAgICAid2hpY2giICJlMmZzcHJvZ3MiICMgbmVlZGVkIGZvciBmc2FkbQorICAgICAgICAgICAgICAgICAiZTJmc3Byb2dzLWxpYnMiICJlMmZzcHJvZ3MtZGV2ZWwiCisgICAgICAgICAgICAgICAgICJwZXJsLUdEIiAjIGZvciBsY292CisgICAgICAgICAgICAgICAgICJtZGFkbSIgIyBmb3IgdGVzdHMgd2l0aCBsdm0yIGFuZCBtZGFkbQorICAgICAgICAgICAgICAgICAiZGV2aWNlLW1hcHBlci1wZXJzaXN0ZW50LWRhdGEiICMgdGhpbiBhbmQgY2FjaGUKKyAgICAgICAgICAgICAgICAgInBrZ2NvbmZpZyIgIyBiZXR0ZXIgc3VwcG9ydCBmb3IgY29uZmlnCisgICAgICAgICAgICAgICAgICJrZXJuZWwiCisgICAgICAgICAgICAgICBdOworICAgICAgY2VudG9zNjMgPSBbICJjbHVzdGVybGliLWRldmVsIiAib3BlbmFpc2xpYi1kZXZlbCIgImNtYW4iICJsaWJ1ZGV2LWRldmVsIiAicHJvY3BzIiAibmMiIF07CisgICAgICBjZW50b3M2NCA9IGNlbnRvczYzICsrIFsgImNvcm9zeW5jbGliLWRldmVsIiBdOworICAgICAgY2VudG9zNjUgPSBjZW50b3M2NDsKKyAgICAgIGNlbnRvczY2ID0gY2VudG9zNjU7CisgICAgICBjZW50b3M3MCA9IFsgImRsbS1kZXZlbCIgImRsbSIgImNvcm9zeW5jbGliLWRldmVsIiAicGVybC1EaWdlc3QtTUQ1IiAic3lzdGVtZC1kZXZlbCIKKyAgICAgICAgICAgICAgICAgICAic29jYXQiICMgdXNlZCBieSB0ZXN0IHN1aXRlIGx2bXBvbGxkCisgICAgICAgICAgICAgICAgICAgIyAic2FubG9jayIgIyB1c2VkIGJ5IGx2bWxvY2tkLiBSZXF1aXJlZCB2ZXJzaW9uIHByZXNlbnQgaW4gNy4yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAicHJvY3BzLW5nIiBdOworCisgICAgICBmZWRvcmExN18xOCA9IFsgImRsbS1kZXZlbCIgImNvcm9zeW5jbGliLWRldmVsIiAibGliYmxraWQiICJsaWJibGtpZC1kZXZlbCIKKyAgICAgICAgICAgICAgICAgICAgICAiZGxtIiAic3lzdGVtZC1kZXZlbCIgInBlcmwtRGlnZXN0LU1ENSIgImtlcm5lbC1tb2R1bGVzLWV4dHJhIiBdOworICAgICAgZmVkb3JhMTcgPSBmZWRvcmExN18xOCArKyBbICJsaWJ1ZGV2LWRldmVsIiAibmMiIF07CisKKyAgICAgIGZlZG9yYTE4ID0gZmVkb3JhMTdfMTggKysgWyAic29jYXQiIF07CisgICAgICBmZWRvcmExOHUgPSBmZWRvcmExODsKKworICAgICAgZmVkb3JhMTkgPSBjZW50b3M3MCArKyBbICJrZXJuZWwtbW9kdWxlcy1leHRyYSIgXTsKKyAgICAgIGZlZG9yYTE5dSA9IGZlZG9yYTE5OworCisgICAgICBmZWRvcmEyMCA9IGZlZG9yYTE5OworICAgICAgZmVkb3JhMjB1ID0gZmVkb3JhMjA7CisKKyAgICAgIHJhd2hpZGUgPSBmZWRvcmEyMDsKKyAgICB9IC8vIG92ZXIuaW5zdGFsbF9ycG1zOworCisgIHdyYXBwZXIgPSBmdW46IHsgYXJjaCwgaW1hZ2UsIGJ1aWxkID8ge30sIGlzdGVzdCA/IGZhbHNlLCBzcmMgPyBqb2JzLnRhcmJhbGwgfTogd2l0aCBsaWI7CisgICAgbGV0IHVzZSA9IHZtIHsgcGtncyA9IGlmIGVxU3RyaW5ncyBhcmNoICJpMzg2IiB0aGVuIHBrZ3MucGtnc2k2ODZMaW51eCBlbHNlIHBrZ3M7CisgICAgICAgICAgICAgICAgICAgeG1vZHMgPSBpZiBpc3Rlc3QgJiYgKGltYWdlID09ICJjZW50b3M2NCIgfHwgaW1hZ2UgPT0gImNlbnRvczY1IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gW10gZWxzZSBbICI5cCIgIjlwbmV0X3ZpcnRpbyIgXTsKKyAgICAgICAgICAgICAgICAgICBkbW1vZHMgPSBpc3Rlc3Q7IH07CisgICAgIGluIGZ1biB7CisgICAgICAgICAgIGluaGVyaXQgYnVpbGQgaXN0ZXN0IHNyYzsKKyAgICAgICAgICAgVk0gPSB1c2UucnBtYnVpbGQ7CisgICAgICAgICAgIGRpc2tGdW4gPSBidWlsdGlucy5nZXRBdHRyICIke2ltYWdlfSR7YXJjaH0iIHVzZS5pbWdzOworICAgICAgICAgICBleHRyYXMgPSBpbnN0YWxsX3JwbXMuY29tbW9uICsrIGJ1aWx0aW5zLmdldEF0dHIgaW1hZ2UgaW5zdGFsbF9ycG1zOworICAgICAgICAgICB2bXRvb2xzID0gdXNlLnRvb2xzOworICAgICAgICAgICBrZXJuZWwgPSB1c2UudG9vbHMubWFrZUtlcm5lbEZyb21SUE1EaXN0IChidWlsdGlucy5nZXRBdHRyICIke2ltYWdlfSR7YXJjaH0iIHVzZS5ycG1kaXN0cm9zKTsKKyAgICAgICAgfTsKKworICBjb25maWdzID0geworICAgIGZjMjBwX3g4Nl82NCA9IHsgYXJjaCA9ICJ4ODZfNjQiOyBpbWFnZSA9ICJmZWRvcmEyMCI7IHNyYyA9IGpvYnMudGFyYmFsbF9wcm9mOyB9OworICAgIGZjMjBwX2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJmZWRvcmEyMCI7IHNyYyA9IGpvYnMudGFyYmFsbF9wcm9mOyB9OworICAgIGZjMjBfeDg2XzY0ID0geyBhcmNoID0gIng4Nl82NCI7IGltYWdlID0gImZlZG9yYTIwIjsgfTsKKyAgICBmYzIwX2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJmZWRvcmEyMCI7IH07CisgICAgZmMxOV94ODZfNjQgPSB7IGFyY2ggPSAieDg2XzY0IjsgaW1hZ2UgPSAiZmVkb3JhMTkiOyB9OworICAgIGZjMTlfaTM4NiAgID0geyBhcmNoID0gImkzODYiICA7IGltYWdlID0gImZlZG9yYTE5IjsgfTsKKyAgICBmYzE4X3g4Nl82NCA9IHsgYXJjaCA9ICJ4ODZfNjQiOyBpbWFnZSA9ICJmZWRvcmExOCI7IH07CisgICAgZmMxOF9pMzg2ICAgPSB7IGFyY2ggPSAiaTM4NiIgIDsgaW1hZ2UgPSAiZmVkb3JhMTgiOyB9OworICAgIGZjMTdfeDg2XzY0ID0geyBhcmNoID0gIng4Nl82NCI7IGltYWdlID0gImZlZG9yYTE3IjsgfTsKKyAgICBmYzE3X2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJmZWRvcmExNyI7IH07CisKKyAgICBmYzE4dV94ODZfNjQgPSB7IGFyY2ggPSAieDg2XzY0IjsgaW1hZ2UgPSAiZmVkb3JhMTh1IjsgfTsKKyAgICBmYzE4dV9pMzg2ICAgPSB7IGFyY2ggPSAiaTM4NiI7IGltYWdlID0gImZlZG9yYTE4dSI7IH07CisgICAgZmMxOXVfeDg2XzY0ID0geyBhcmNoID0gIng4Nl82NCI7IGltYWdlID0gImZlZG9yYTE5dSI7IH07CisgICAgZmMxOXVfaTM4NiAgID0geyBhcmNoID0gImkzODYiOyBpbWFnZSA9ICJmZWRvcmExOXUiOyB9OworCisgICAgI2NlbnRvczYzX2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJjZW50b3M2MyI7IH07CisgICAgI2NlbnRvczYzX3g4Nl82NCA9IHsgYXJjaCA9ICJ4ODZfNjQiIDsgaW1hZ2UgPSAiY2VudG9zNjMiOyB9OworICAgIGNlbnRvczY0X2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJjZW50b3M2NCI7IH07CisgICAgY2VudG9zNjRfeDg2XzY0ID0geyBhcmNoID0gIng4Nl82NCIgOyBpbWFnZSA9ICJjZW50b3M2NCI7IH07CisgICAgY2VudG9zNjVfaTM4NiAgID0geyBhcmNoID0gImkzODYiICA7IGltYWdlID0gImNlbnRvczY1IjsgfTsKKyAgICBjZW50b3M2NV94ODZfNjQgPSB7IGFyY2ggPSAieDg2XzY0IiA7IGltYWdlID0gImNlbnRvczY1IjsgfTsKKyAgICBjZW50b3M2Nl9pMzg2ICAgPSB7IGFyY2ggPSAiaTM4NiIgIDsgaW1hZ2UgPSAiY2VudG9zNjYiOyB9OworICAgIGNlbnRvczY2X3g4Nl82NCA9IHsgYXJjaCA9ICJ4ODZfNjQiIDsgaW1hZ2UgPSAiY2VudG9zNjYiOyB9OworCisgICAgY2VudG9zNzBfeDg2XzY0ID0geyBhcmNoID0gIng4Nl82NCIgOyBpbWFnZSA9ICJjZW50b3M3MCI7IH07CisKKyAgICByYXdoaWRlX2kzODYgICA9IHsgYXJjaCA9ICJpMzg2IiAgOyBpbWFnZSA9ICJyYXdoaWRlIjsgfTsKKyAgICByYXdoaWRlX3g4Nl82NCA9IHsgYXJjaCA9ICJ4ODZfNjQiIDsgaW1hZ2UgPSAicmF3aGlkZSI7IH07CisgIH0gLy8gb3Zlci5jb25maWdzOworCisgIHJwbXMgPSBsaWIubWFwQXR0cnMgKG46IHY6IHdyYXBwZXIgbWtCdWlsZCB2KSBjb25maWdzOworICB0ZXN0cyA9IGxldCBtYWtlID0gbjogdjogd3JhcHBlciBta1Rlc3QgKHYgLy8geyBidWlsZCA9IGJ1aWx0aW5zLmdldEF0dHIgbiBycG1zOyBpc3Rlc3QgPSB0cnVlOyB9KTsKKyAgICAgICAgICAgaW4gbGliLm1hcEF0dHJzIG1ha2UgY29uZmlnczsKKworICBqb2JzID0gdGVzdHMgLy8geworICAgICB0YXJiYWxsX3Byb2YgPSBta1RhcmJhbGwgIjEiOworICAgICB0YXJiYWxsID0gbWtUYXJiYWxsICIwIjsKKyAgfTsKK2luIGpvYnMKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9jb25maWcvLmdpdGlnbm9yZSBiL29sZC10ZXN0cy9jb25maWcvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYwMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2NvbmZpZy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyFNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2NvbmZpZy9NYWtlZmlsZSBiL29sZC10ZXN0cy9jb25maWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1M2I2NAotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9jb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitjb25maWdfdDogY29uZmlnX3QuYworCWdjYyAtZyAtSS4uLy4uL2luY2x1ZGUgY29uZmlnX3QuYyAtTC4uLy4uL2xpYiAtbGx2bSAtbyBjb25maWdfdAorCitjbGVhbjoKKwlybSBjb25maWdfdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9jb25maWcvY29uZmlnX3QuYyBiL29sZC10ZXN0cy9jb25maWcvY29uZmlnX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjllNTZlCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2NvbmZpZy9jb25maWdfdC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBUZXN0IHByb2dyYW0gdGhhdCByZWFkcywgdGhlbiB3cml0ZXMgYSBjb25maWcgZmlsZS4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBjb25maWdfZmlsZSAqY2Y7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxjb25maWdfZmlsZT5cbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWNmID0gY3JlYXRlX2NvbmZpZ19maWxlKCk7CisJaWYgKGNmID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBjcmVhdGUgY29uZmlnX2ZpbGUgb2JqZWN0LlxuIik7CisJCWV4aXQoMSk7CisJfQorCisKKwlpZiAoIXJlYWRfY29uZmlnKGNmLCBhcmd2WzFdKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHJlYWQgY29uZmlnIGZpbGUgJyVzJ1xuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCF3cml0ZV9jb25maWcoY2YsICJvdXQiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHdyaXRlIGNvbmZpZyBmaWxlICdvdXQnXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkZXN0cm95X2NvbmZpZ19maWxlKGNmKTsKKwlkdW1wX21lbW9yeSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2NvbmZpZy9lbXB0eV9hcnJheS5jb25mIGIvb2xkLXRlc3RzL2NvbmZpZy9lbXB0eV9hcnJheS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzJmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvY29uZmlnL2VtcHR5X2FycmF5LmNvbmYKQEAgLTAsMCArMSBAQAorZm9vID0gW10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvY29uZmlnL3ZnMCBiL29sZC10ZXN0cy9jb25maWcvdmcwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTk1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvY29uZmlnL3ZnMApAQCAtMCwwICsxLDE2OSBAQAorIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBMVk0yIGxpYnJhcnkKKyMgR2VuZXJhdGVkOiBXZWQgSnVsIDE3IDIyOjQxOjM3IDIwMDIKKworCitkZXNjcmlwdGlvbiA9ICJDcmVhdGVkICphZnRlciogZXhlY3V0aW5nICdsdmNyZWF0ZSAtLXF1aWV0IC1zIC1uIHNuYXAgLWMgNTEyayAtTDIwME0gdmcwL29yaWdpbiAvZGV2L2hkYTgnIgorY3JlYXRpb25fdGltZSA9IDEwMjY5NDIwOTcKKwordmcwIHsKKwlpZCA9ICJRbWQ5NnktNzcxUy1Fc2JiLVpwNnUtOHhvOS1DZm10LVl2bmRIWSIKKwlzZXFubyA9IDIKKwlzdGF0dXMgPSBbIlJFU0laRUFCTEUiLCAiUkVBRCIsICJXUklURSJdCisJc3lzdGVtX2lkID0gInJldGkxMDE0ODA1MjkyIgorCWV4dGVudF9zaXplID0gODE5MgkJIyA0IE1lZ2FieXRlcworCW1heF9sdiA9IDI1NQorCW1heF9wdiA9IDI1NQorCisJcGh5c2ljYWxfdm9sdW1lcyB7CisKKwkJcHYwIHsKKwkJCWlkID0gIjhuUlF1Yi1FcXVZLVZSMUMtSXBkdi02aEVPLUZ1RlQtd25sTjVSIgorCQkJZGV2aWNlID0gIi9kZXYvZGlzY3MvZGlzYzAvcGFydDgiCSMgSGludCBvbmx5CisKKwkJCXN0YXR1cyA9IFsiQUxMT0NBVEFCTEUiXQorCQkJcGVfc3RhcnQgPSAyNTYKKwkJCXBlX2NvdW50ID0gNTAxCSMgMS45NTcwMyBHaWdhYnl0ZXMKKwkJfQorCisJCXB2MSB7CisJCQlpZCA9ICJtUlU2TWYtejFTdi1LdXF3LUN0MXYtZUM0Mi1tbnFzLVlEMVJyTCIKKwkJCWRldmljZSA9ICIvZGV2L2Rpc2NzL2Rpc2MxL3BhcnQyIgkjIEhpbnQgb25seQorCisJCQlzdGF0dXMgPSBbIkFMTE9DQVRBQkxFIl0KKwkJCXBlX3N0YXJ0ID0gMzg0CisJCQlwZV9jb3VudCA9IDcyNjkJIyAyOC4zOTQ1IEdpZ2FieXRlcworCQl9CisJfQorCisJbG9naWNhbF92b2x1bWVzIHsKKworCQltdXNpYyB7CisJCQlpZCA9ICIwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMCIKKwkJCXN0YXR1cyA9IFsiUkVBRCIsICJXUklURSIsICJBTExPQ19TSU1QTEUiXQorCQkJcmVhZF9haGVhZCA9IDAKKwkJCXNlZ21lbnRfY291bnQgPSAyCisKKwkJCXNlZ21lbnQxIHsKKwkJCQlzdGFydF9leHRlbnQgPSAwCisJCQkJZXh0ZW50X2NvdW50ID0gMTAyNAkjIDQgR2lnYWJ5dGVzCisJCQkJc3RyaXBlcyA9IDEKKworCQkJCWFyZWFzID0gWworCQkJCQkicHYxIiwgMAorCQkJCV0KKwkJCX0KKwkJCXNlZ21lbnQyIHsKKwkJCQlzdGFydF9leHRlbnQgPSAxMDI0CisJCQkJZXh0ZW50X2NvdW50ID0gMjU2MAkjIDEwIEdpZ2FieXRlcworCQkJCXN0cmlwZXMgPSAxCisKKwkJCQlhcmVhcyA9IFsKKwkJCQkJInB2MSIsIDM1ODQKKwkJCQldCisJCQl9CisJCX0KKworCQlwaG90b3MgeworCQkJaWQgPSAiMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDIiCisJCQlzdGF0dXMgPSBbIlJFQUQiLCAiV1JJVEUiLCAiQUxMT0NfU0lNUExFIl0KKwkJCXJlYWRfYWhlYWQgPSAwCisJCQlzZWdtZW50X2NvdW50ID0gMQorCisJCQlzZWdtZW50MSB7CisJCQkJc3RhcnRfZXh0ZW50ID0gMAorCQkJCWV4dGVudF9jb3VudCA9IDEwMjQJIyA0IEdpZ2FieXRlcworCQkJCXN0cmlwZXMgPSAxCisKKwkJCQlhcmVhcyA9IFsKKwkJCQkJInB2MSIsIDIwNDgKKwkJCQldCisJCQl9CisJCX0KKworCQlyZXBvc2l0b3JpZXMgeworCQkJaWQgPSAiMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDMiCisJCQlzdGF0dXMgPSBbIlJFQUQiLCAiV1JJVEUiLCAiQUxMT0NfU0lNUExFIl0KKwkJCXJlYWRfYWhlYWQgPSAwCisJCQlzZWdtZW50X2NvdW50ID0gMQorCisJCQlzZWdtZW50MSB7CisJCQkJc3RhcnRfZXh0ZW50ID0gMAorCQkJCWV4dGVudF9jb3VudCA9IDUxMgkjIDIgR2lnYWJ5dGVzCisJCQkJc3RyaXBlcyA9IDEKKworCQkJCWFyZWFzID0gWworCQkJCQkicHYxIiwgMzA3MgorCQkJCV0KKwkJCX0KKwkJfQorCisJCW9yaWdpbiB7CisJCQlpZCA9ICIwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwNCIKKwkJCXN0YXR1cyA9IFsiUkVBRCIsICJXUklURSIsICJBTExPQ19TSU1QTEUiXQorCQkJcmVhZF9haGVhZCA9IDAKKwkJCXNlZ21lbnRfY291bnQgPSAxCisKKwkJCXNlZ21lbnQxIHsKKwkJCQlzdGFydF9leHRlbnQgPSAwCisJCQkJZXh0ZW50X2NvdW50ID0gNTAJIyAyMDAgTWVnYWJ5dGVzCisJCQkJc3RyaXBlcyA9IDEKKworCQkJCWFyZWFzID0gWworCQkJCQkicHYxIiwgNjE0NAorCQkJCV0KKwkJCX0KKwkJfQorCisJCXBhY2thZ2VzIHsKKwkJCWlkID0gIjAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDA2IgorCQkJc3RhdHVzID0gWyJSRUFEIiwgIldSSVRFIiwgIkFMTE9DX1NJTVBMRSJdCisJCQlyZWFkX2FoZWFkID0gMAorCQkJc2VnbWVudF9jb3VudCA9IDIKKworCQkJc2VnbWVudDEgeworCQkJCXN0YXJ0X2V4dGVudCA9IDAKKwkJCQlleHRlbnRfY291bnQgPSA0NTEJIyAxLjc2MTcyIEdpZ2FieXRlcworCQkJCXN0cmlwZXMgPSAxCisKKwkJCQlhcmVhcyA9IFsKKwkJCQkJInB2MCIsIDUwCisJCQkJXQorCQkJfQorCQkJc2VnbWVudDIgeworCQkJCXN0YXJ0X2V4dGVudCA9IDQ1MQorCQkJCWV4dGVudF9jb3VudCA9IDU3MwkjIDIuMjM4MjggR2lnYWJ5dGVzCisJCQkJc3RyaXBlcyA9IDEKKworCQkJCWFyZWFzID0gWworCQkJCQkicHYxIiwgNjE5NAorCQkJCV0KKwkJCX0KKwkJfQorCisJCXNuYXAgeworCQkJaWQgPSAiMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDEiCisJCQlzdGF0dXMgPSBbIlJFQUQiLCAiV1JJVEUiLCAiQUxMT0NfU0lNUExFIl0KKwkJCXJlYWRfYWhlYWQgPSAwCisJCQlzZWdtZW50X2NvdW50ID0gMQorCisJCQlzZWdtZW50MSB7CisJCQkJc3RhcnRfZXh0ZW50ID0gMAorCQkJCWV4dGVudF9jb3VudCA9IDUwCSMgMjAwIE1lZ2FieXRlcworCQkJCXN0cmlwZXMgPSAxCisKKwkJCQlhcmVhcyA9IFsKKwkJCQkJInB2MCIsIDAKKwkJCQldCisJCQl9CisJCX0KKwl9CisKKwlzbmFwc2hvdHMgeworCisJCXNuYXBzaG90MCB7CisJCQljaHVua19zaXplID0gMTAyNAorCQkJb3JpZ2luID0gIm9yaWdpbiIKKwkJCWNvd19zdG9yZSA9ICJzbmFwIgorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2RhdGFzdHJ1Y3QvaGFzaF90LmMgYi9vbGQtdGVzdHMvZGF0YXN0cnVjdC9oYXNoX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzllNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2RhdGFzdHJ1Y3QvaGFzaF90LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQgX2hlbHAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByb2cpCit7CisJZnByaW50ZihmcCwgIlVzYWdlIDogJXMgPHRhYmxlIHNpemU+IDxudW1fZW50cmllcz5cbiIsIHByb2cpOworfQorCitzdHJ1Y3Qga2V5X2xpc3QgeworCXN0cnVjdCBrZXlfbGlzdCAqbmV4dDsKKwljaGFyIGtleVsxXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5X2xpc3QgKl9jcmVhdGVfd29yZChpbnQgbikKK3sKKwlzdHJ1Y3Qga2V5X2xpc3QgKmtsID0gZGJnX21hbGxvYyhzaXplb2YoKmtsKSArIDMyKTsKKwlzbnByaW50ZihrbC0+a2V5LCAzMiwgImFiYyVkZGVmJWQiLCBuLCBuKTsKKwlrbC0+bmV4dCA9IDA7CisJcmV0dXJuIGtsOworfQorCitzdGF0aWMgc3RydWN0IGtleV9saXN0ICpfY3JlYXRlX3dvcmRfZnJvbV9maWxlKGludCBuKQoreworCWNoYXIgd29yZFsxMjhdLCAqcHRyOworCXN0cnVjdCBrZXlfbGlzdCAqa2w7CisKKwlpZiAoIWZnZXRzKHdvcmQsIHNpemVvZih3b3JkKSwgc3RkaW4pKQorCQlyZXR1cm4gMDsKKworCWZvciAocHRyID0gd29yZDsgKnB0cjsgcHRyKyspIHsKKwkJaWYgKCpwdHIgPT0gJ1xuJykgeworCQkJKnB0ciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtsID0gZGJnX21hbGxvYyhzaXplb2YoKmtsKSArIDMyKTsKKwlzbnByaW50ZihrbC0+a2V5LCAzMiwgIiVzIiwgd29yZCk7CisJa2wtPm5leHQgPSAwOworCXJldHVybiBrbDsKK30KKworc3RhdGljIHZvaWQgX2RvX3Rlc3QoaW50IHRhYmxlX3NpemUsIGludCBudW1fZW50cmllcykKK3sKKwlpbnQgaTsKKwloYXNoX3RhYmxlX3QgaHQgPSBoYXNoX2NyZWF0ZSh0YWJsZV9zaXplKTsKKwlzdHJ1Y3Qga2V5X2xpc3QgKnRtcCwgKmtleSwgKmFsbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQkvKiBtYWtlIHVwIGEgd29yZCAqLworCQlpZiAoIShrZXkgPSBfY3JlYXRlX3dvcmRfZnJvbV9maWxlKGkpKSkgeworCQkJbG9nX2Vycm9yKCJSYW4gb3V0IG9mIHdvcmRzICFcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCS8qIGluc2VydCBpdCAqLworCQloYXNoX2luc2VydChodCwga2V5LT5rZXksIGtleSk7CisJCWtleS0+bmV4dCA9IGFsbDsKKwkJYWxsID0ga2V5OworCX0KKworCWZvciAoa2V5ID0gYWxsOyBrZXk7IGtleSA9IGtleS0+bmV4dCkgeworCQl0bXAgPSAoc3RydWN0IGtleV9saXN0ICopIGhhc2hfbG9va3VwKGh0LCBrZXktPmtleSk7CisJCWlmICghdG1wIHx8ICh0bXAgIT0ga2V5KSkgeworCQkJbG9nX2Vycm9yKCJsb29rdXAgZmFpbGVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlmb3IgKGtleSA9IGFsbDsga2V5OyBrZXkgPSB0bXApIHsKKwkJdG1wID0ga2V5LT5uZXh0OworCQlkYmdfZnJlZShrZXkpOworCX0KKworCWhhc2hfZGVzdHJveShodCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbml0X2xvZygpOworCisJaWYgKGFyZ2MgIT0gMykgeworCQlfaGVscChzdGRlcnIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCV9kb190ZXN0KGF0b2koYXJndlsxXSksIGF0b2koYXJndlsyXSkpOworCisJZHVtcF9tZW1vcnkoKTsKKwlmaW5fbG9nKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZGV2LW1nci9kZXZfY2FjaGVfdC5jIGIvb2xkLXRlc3RzL2Rldi1tZ3IvZGV2X2NhY2hlX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk1MzlmCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2Rldi1tZ3IvZGV2X2NhY2hlX3QuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRldi1jYWNoZS5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisKKwlpbml0X2xvZygpOworCWlmICghZGV2X2NhY2hlX2luaXQoKSkgeworCQlsb2dfZXJyb3IoImNvdWxkbid0IGluaXRpYWxpc2UgZGV2X2NhY2hlX2luaXQgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghZGV2X2NhY2hlX2FkZF9kaXIoYXJndltpXSkpIHsKKwkJCWxvZ19lcnJvcigiY291bGRuJ3QgYWRkICclcycgdG8gZGV2X2NhY2hlXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKE5VTEwpKSkgeworCQlsb2dfZXJyb3IoImNvdWxkbid0IGNyZWF0ZSBpdGVyYXRvclxuIik7CisJCWV4aXQoMSk7CisJfQorCisJd2hpbGUgKChkZXYgPSBkZXZfaXRlcl9uZXh0KGl0ZXIpKSkKKwkJcHJpbnRmKCIlc1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgZGV2X2l0ZXJfZGVzdHJveShpdGVyKToKKwlkZXZfY2FjaGVfZXhpdCgpOworCisJZHVtcF9tZW1vcnkoKTsKKwlmaW5fbG9nKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZGV2aWNlL01ha2VmaWxlLmluIGIvb2xkLXRlc3RzL2RldmljZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg5ZWIxCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2RldmljZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK1NPVVJDRVM9XAorCWRldl9jYWNoZV90LmMKKworVEFSR0VUUz1kZXZfY2FjaGVfdAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworZGV2X2NhY2hlX3Q6IGRldl9jYWNoZV90Lm8gJCh0b3Bfc3JjZGlyKS9saWIvbGlibHZtLmEKKwkkKENDKSAtbyBkZXZfY2FjaGVfdCBkZXZfY2FjaGVfdC5vIC1MJCh0b3BfYnVpbGRkaXIpL2xpYiAtbGx2bQorCmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZGV2aWNlL2Rldl9jYWNoZV90LmMgYi9vbGQtdGVzdHMvZGV2aWNlL2Rldl9jYWNoZV90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOGMyOAotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9kZXZpY2UvZGV2X2NhY2hlX3QuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRldi1jYWNoZS5oIgorI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2w7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgPGRpcj5cbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWluaXRfbG9nKHN0ZGVycik7CisJaW5pdF9kZWJ1ZyhfTE9HX0lORk8pOworCisJaWYgKCFkZXZfY2FjaGVfaW5pdCgpKSB7CisJCWxvZ19lcnIoImNvdWxkbid0IGluaXRpYWxpc2UgZGV2X2NhY2hlX2luaXQgZmFpbGVkIik7CisJCWV4aXQoMSk7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIWRldl9jYWNoZV9hZGRfZGlyKGFyZ3ZbaV0pKSB7CisJCQlsb2dfZXJyKCJjb3VsZG4ndCBhZGQgJyVzJyB0byBkZXZfY2FjaGUiLCBhcmd2W2ldKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKE5VTEwpKSkgeworCQlsb2dfZXJyKCJjb3VsZG4ndCBjcmVhdGUgaXRlcmF0b3IiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpIHsKKwkJcHJpbnRmKCIlcyIsIGRldi0+bmFtZSk7CisKKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZkZXYtPmFsaWFzZXMpIHsKKwkJCXNsID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkbV9zdHJfbGlzdCwgbGlzdCk7CisJCQlwcmludGYoIiwgJXMiLCBzbC0+c3RyKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKwlkZXZfY2FjaGVfZXhpdCgpOworCisJZHVtcF9tZW1vcnkoKTsKKwlmaW5fbG9nKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZGV2aWNlL2ZpbGxfZGV2aWNlLmMgYi9vbGQtdGVzdHMvZGV2aWNlL2ZpbGxfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0N2I2MQotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9kZXZpY2UvZmlsbF9kZXZpY2UuYwpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgInJhbmRvbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCQorfQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2RldmljZS9yYW5kb20uYyBiL29sZC10ZXN0cy9kZXZpY2UvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NzlmNQotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9kZXZpY2UvcmFuZG9tLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAicmFuZG9tLmgiCisjaW5jbHVkZSAibG9nLmgiCisKK2ludDMyX3QgX2FbNTZdOworaW50MzJfdCAqX3I7CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBfbW9kX2RpZmYoaW50MzJfdCB4LCBpbnQzMl90IHkpCit7CisJcmV0dXJuICh4IC0geSkgJiAweDdmZmZmZmZmOworfQorCitzdGF0aWMgaW50MzJfdCBfZmxpcF9jeWNsZSh2b2lkKQoreworCWludDMyX3QgKmlpLCAqamo7CisJZm9yIChpaSA9IF9hICsgMSwgamogPSBfYSArIDMyOyBqaiA8PSBfYSArIDU1OyBpaSsrLCBqaisrKQorCQkqaWkgPSBfbW9kX2RpZmYoKmlpLCAqamopOworCisJZm9yIChqaiA9IF9hICsgMTsgaWkgPD0gX2EgKyA1NTsgaWkrKywgamorKykKKwkJKmlpID0gX21vZF9kaWZmKCppaSwgKmpqKTsKKworCV9yID0gX2EgKyA1NDsKKwlyZXR1cm4gX2FbNTVdOworfQorCitzdGF0aWMgdm9pZCByYW5kX2luaXQoaW50MzJfdCBzZWVkKQoreworCWludDY0X3QgaTsKKwlpbnQ2NF90IHByZXYgPSBzZWVkLCBuZXh0ID0gMTsKKworCXNlZWQgPSBwcmV2ID0gX21vZF9kaWZmKHByZXYsIDApOyAvKiBzdHJpcCB0aGUgc2lnbiAqLworCV9hWzU1XSA9IHByZXY7CisJZm9yIChpID0gMjE7IGk7IGkgPSAoaSArIDIxKSAlIDU1KSB7CisJCV9hW2ldID0gbmV4dDsKKwkJbmV4dCA9IF9tb2RfZGlmZihwcmV2LCBuZXh0KTsKKwkJaWYoc2VlZCAmIDEpCisJCQlzZWVkID0gMHg0MDAwMDAwMEwgKyAoc2VlZCA+PiAxKTsKKwkJZWxzZQorCQkJc2VlZCA+Pj0gMTsKKworCQluZXh0ID0gX21vZF9kaWZmKG5leHQsIHNlZWQpOworCQlwcmV2ID0gX2FbaV07CisJfQorCisJX2ZsaXBfY3ljbGUoKTsKKwlfZmxpcF9jeWNsZSgpOworCV9mbGlwX2N5Y2xlKCk7CisJX2ZsaXBfY3ljbGUoKTsKKwlfZmxpcF9jeWNsZSgpOworfQorCisvKgorICogRklYTUU6IG1vdmUgdGhpcyB0byBiZSBhbiBpbmxpbmUgaW4gdGhlCisgKiBoZWFkZXIuCisgKi8KK2ludDMyX3QgcmFuZF9nZXQodm9pZCkKK3sKKwlyZXR1cm4gICgqX3IgPj0gMCkgPyAqX3ItLSA6IF9mbGlwX2N5Y2xlKCk7Cit9CisKKworLyoKKyAqIGp1c3QgdXNlZCBieSByYW5kX2NoZWNrCisgKi8KKyNkZWZpbmUgdDMxIDB4ODAwMDAwMDAKK3N0YXRpYyBpbnQzMl90IF91bmlmb3JtKGludDMyX3QgbSkKK3sKKwl1aW50MzJfdCB0ID0gIHQzMSAtICh0MzEgJSBtKTsKKwlpbnQzMl90IHI7CisKKwlkbworCQlyID0gbmV4dF9yYW5kKHNjKTsKKworCXdoaWxlICh0IDw9ICh1aW50MzJfdCkgcik7CisKKwlyZXR1cm4gciAlIG07Cit9CisKKy8qCisgKiBDaGVja3MgSSd2ZSBjb3BpZWQgdGhlIGNvZGUgY29ycmVjdGx5LgorICovCitpbnQgcmFuZF9jaGVjayh2b2lkKQoreworCWludCBqOworCisJcmFuZF9pbml0KC0zMTQxNTlMKTsKKworCWlmIChuZXh0X3JhbmQoc2MpICE9IDExOTMxODk5OCkJeworCQlsb2dfZXJyKCJSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmYWlsZWQgY2hlY2sgMSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IoaiA9IDE7IGogPD0gMTMzOyBqKyspCisJCXJhbmRfZ2V0KCk7CisKKwlpZiAoX3VuaWZvcm0oMHg1NTU1NTU1NUwpICE9IDc0ODEwMzgxMikgeworCQlsb2dfZXJyKCJSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmYWlsZWQgY2hlY2sgMiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9kZXZpY2UvcmFuZG9tLmggYi9vbGQtdGVzdHMvZGV2aWNlL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjM5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvZGV2aWNlL3JhbmRvbS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc25hcmZlZCBmcm9tIHRoZQorICogU3RhbmZvcmQgR3JhcGhiYXNlLgorICovCisKKyNpZm5kZWYgX0xWTV9SQU5ET01fSAorI2RlZmluZSBfTFZNX1JBTkRPTV9ICisKK3ZvaWQgcmFuZF9pbml0KGludDMyX3Qgc2VlZCk7CitpbnQzMl90IHJhbmRfZ2V0KHZvaWQpOworCisvKgorICogTm90ZSB0aGlzIHdpbGwgcmVzZXQgdGhlIHNlZWQuCisgKi8KK2ludCByYW5kX2NoZWNrKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9maWx0ZXJzL01ha2VmaWxlLmluIGIvb2xkLXRlc3RzL2ZpbHRlcnMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllN2NhOQotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9maWx0ZXJzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK1ZQQVRIID0gQHNyY2RpckAKKworU09VUkNFUz1cCisJcmZpbHRlcl90LmMgXAorCXBmaWx0ZXJfdC5jCisKK1RBUkdFVFM9XAorCXJmaWx0ZXJfdCBcCisJcGZpbHRlcl90CisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCityZmlsdGVyX3Q6IHJmaWx0ZXJfdC5vICQodG9wX3NyY2RpcikvbGliL2xpYmx2bS5hCisJJChDQykgLW8gcmZpbHRlcl90IHJmaWx0ZXJfdC5vIC1MJCh0b3BfYnVpbGRkaXIpL2xpYiAtbGx2bQorCitwZmlsdGVyX3Q6IHBmaWx0ZXJfdC5vICQodG9wX3NyY2RpcikvbGliL2xpYmx2bS5hCisJJChDQykgLW8gcGZpbHRlcl90IHBmaWx0ZXJfdC5vIC1MJCh0b3BfYnVpbGRkaXIpL2xpYiAtbGx2bQorCmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZmlsdGVycy9wZmlsdGVyX3QuYyBiL29sZC10ZXN0cy9maWx0ZXJzL3BmaWx0ZXJfdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2MzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvZmlsdGVycy9wZmlsdGVyX3QuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJmaWx0ZXItcGVyc2lzdGVudC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImZpbHRlci1yZWdleC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGNvbmZpZ19maWxlICpjZnQ7CisJc3RydWN0IGNvbmZpZ19ub2RlICpjbjsKKwlzdHJ1Y3QgZGV2X2ZpbHRlciAqcmZpbHRlciwgKnBmaWx0ZXI7CisJc3RydWN0IGRldl9pdGVyICppdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlIDogJXMgPHJlZ2V4IGNvbmZpZz5cbiIsCisJCQlhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpbml0X2xvZyhzdGRlcnIpOworCWluaXRfZGVidWcoX0xPR19ERUJVRyk7CisKKwlpZiAoIWRldl9jYWNoZV9pbml0KCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBpbml0aWFsaXNlIGRldl9jYWNoZV9pbml0IGZhaWxlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFkZXZfY2FjaGVfYWRkX2RpcigiL2RldiIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgYWRkICcvZGV2JyB0byBkZXZfY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghKGNmdCA9IGNyZWF0ZV9jb25maWdfZmlsZSgpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGNyZWF0ZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFyZWFkX2NvbmZpZyhjZnQsIGFyZ3ZbMV0pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgcmVhZCBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEoY24gPSBmaW5kX2NvbmZpZ19ub2RlKGNmdC0+cm9vdCwgIi9kZXZpY2VzL2ZpbHRlciIsICcvJykpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgZmluZCBmaWx0ZXIgc2VjdGlvblxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEocmZpbHRlciA9IHJlZ2V4X2ZpbHRlcl9jcmVhdGUoY24tPnYpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGJ1aWxkIGZpbHRlclxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEocGZpbHRlciA9IHBlcnNpc3RlbnRfZmlsdGVyX2NyZWF0ZShyZmlsdGVyLCAiLi9wZmlsdGVyLmNmZyIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGJ1aWxkIGZpbHRlclxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShwZmlsdGVyKSkpIHsKKwkJbG9nX2VycigiY291bGRuJ3QgY3JlYXRlIGl0ZXJhdG9yIik7CisJCWV4aXQoMSk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJmaWxsaW5nIGNhY2hlXG4iKTsKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpCisJCTsKKwlkZXZfaXRlcl9kZXN0cm95KGl0ZXIpOworCisJZnByaW50ZihzdGRlcnIsICJkdW1waW5nXG4iKTsKKwlpZiAoIXBlcnNpc3RlbnRfZmlsdGVyX2R1bXAocGZpbHRlcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBkdW1wIHBmaWx0ZXJcbiIpOworCQlleGl0KDEpOworCX0KKworCWZwcmludGYoc3RkZXJyLCAibG9hZGluZ1xuIik7CisJaWYgKCFwZXJzaXN0ZW50X2ZpbHRlcl9sb2FkKHBmaWx0ZXIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgbG9hZCBwZmlsdGVyXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKHBmaWx0ZXIpKSkgeworCQlsb2dfZXJyKCJjb3VsZG4ndCBjcmVhdGUgaXRlcmF0b3IiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpCisJCXByaW50ZigiJXNcbiIsIGRldl9uYW1lKGRldikpOworCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKwlwZmlsdGVyLT5kZXN0cm95KHBmaWx0ZXIpOworCWRldl9jYWNoZV9leGl0KCk7CisJZGVzdHJveV9jb25maWdfZmlsZShjZnQpOworCisJZHVtcF9tZW1vcnkoKTsKKwlmaW5fbG9nKCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9maWx0ZXJzL3JmaWx0ZXJfdC5jIGIvb2xkLXRlc3RzL2ZpbHRlcnMvcmZpbHRlcl90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4Mzc4ZAotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9maWx0ZXJzL3JmaWx0ZXJfdC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZmlsdGVyLXJlZ2V4LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgY29uZmlnX2ZpbGUgKmNmdDsKKwlzdHJ1Y3QgY29uZmlnX25vZGUgKmNuOworCXN0cnVjdCBkZXZfZmlsdGVyICpmaWx0ZXI7CisJc3RydWN0IGRldl9pdGVyICppdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlIDogJXMgPGNvbmZpZ19maWxlPlxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJaW5pdF9sb2coc3RkZXJyKTsKKwlpbml0X2RlYnVnKF9MT0dfREVCVUcpOworCisJaWYgKCEoY2Z0ID0gY3JlYXRlX2NvbmZpZ19maWxlKCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgY3JlYXRlIGNvbmZpZyBmaWxlXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIXJlYWRfY29uZmlnKGNmdCwgYXJndlsxXSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCByZWFkIGNvbmZpZyBmaWxlXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX25vZGUoY2Z0LT5yb290LCAiL2RldmljZXMvZmlsdGVyIiwgJy8nKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBmaW5kIGZpbHRlciBzZWN0aW9uXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWRldl9jYWNoZV9pbml0KCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBpbml0aWFsaXNlIGRldl9jYWNoZV9pbml0IGZhaWxlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFkZXZfY2FjaGVfYWRkX2RpcigiL2RldiIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgYWRkICcvZGV2JyB0byBkZXZfY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghKGZpbHRlciA9IHJlZ2V4X2ZpbHRlcl9jcmVhdGUoY24tPnYpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGJ1aWxkIGZpbHRlclxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShmaWx0ZXIpKSkgeworCQlsb2dfZXJyKCJjb3VsZG4ndCBjcmVhdGUgaXRlcmF0b3IiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpCisJCXByaW50ZigiJXNcbiIsIGRldl9uYW1lKGRldikpOworCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKKwlmaWx0ZXItPmRlc3Ryb3koZmlsdGVyKTsKKwlkZXZfY2FjaGVfZXhpdCgpOworCWRlc3Ryb3lfY29uZmlnX2ZpbGUoY2Z0KTsKKworCWR1bXBfbWVtb3J5KCk7CisJZmluX2xvZygpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZmlsdGVycy9zYW1wbGUuY2ZnIGIvb2xkLXRlc3RzL2ZpbHRlcnMvc2FtcGxlLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY5OGRlCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2ZpbHRlcnMvc2FtcGxlLmNmZwpAQCAtMCwwICsxLDIxIEBACitkZXZpY2VzIHsKKworICAgICAgICAjIGZpcnN0IG1hdGNoIGlzIGZpbmFsLCBlZy4gIC9kZXYvaWRlL2Nkcm9tCisgICAgICAgICMgZ2V0J3MgcmVqZWN0ZWQgZHVlIHRvIHRoZSBmaXJzdCBwYXR0ZXJuCisKKwlmaWx0ZXI9WyJyL2Nkcm9tLyIsICAgICAgICAgIyBkb24ndCB0b3VjaCB0aGUgbXVzaWMgIQorCQkiYS9oZFthLWRdWzAtOV0rLyIsCisJCSJhL2lkZS8iLAorCQkiYS9zZC8iLAorCQkiYS9tZC8iLAorCQkiYXxsb29wL1swLTldK3wiLCAgICMgYWNjZXB0IGRldmZzIHN0eWxlIGxvb3AgYmFjaworCQkici9sb29wLyIsICAgICAgICAgICMgYW5kIHJlamVjdCBvbGQgc3R5bGUKKwkJImEvZGFzZC8iLAorCQkiYS9kYWM5NjAvIiwKKwkJImEvbmJkLyIsCisJCSJhL2lkYS8iLAorCQkiYS9jY2lzcy8iLAorCQkiYS91YmQvIiwKKwkJInIvLiovIl0gICAgICAgICAgICAjIHJlamVjdCBhbGwgb3RoZXJzCisKK30KZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9mb3JtYXQxL01ha2VmaWxlLmluIGIvb2xkLXRlc3RzL2Zvcm1hdDEvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiNTFkMgotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9mb3JtYXQxL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK1ZQQVRIID0gQHNyY2RpckAKKworU09VUkNFUz1cCisJcmVhZF92Z190LmMgXAorCXdyaXRlX3ZnX3QuYyBcCisJcHJldHR5X3ByaW50LmMgXAorCWdldF9wdnNfdC5jIFwKKwlyZWFkX3B2X3QuYyBcCisJZ2V0X3Znc190LmMKKworVEFSR0VUUz1cCisJcmVhZF92Z190IFwKKwl3cml0ZV92Z190IFwKKwlnZXRfcHZzX3QgXAorCXJlYWRfcHZfdCBcCisJZ2V0X3Znc190CisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCityZWFkX3ZnX3Q6IHJlYWRfdmdfdC5vIHByZXR0eV9wcmludC5vICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLmEKKwkkKENDKSAtbyByZWFkX3ZnX3QgcmVhZF92Z190Lm8gcHJldHR5X3ByaW50Lm8gLUwkKHRvcF9idWlsZGRpcikvbGliIC1sbHZtCisKK3dyaXRlX3ZnX3Q6IHdyaXRlX3ZnX3QubyBwcmV0dHlfcHJpbnQubyAkKHRvcF9idWlsZGRpcikvbGliL2xpYmx2bS5hCisJJChDQykgLW8gd3JpdGVfdmdfdCB3cml0ZV92Z190Lm8gcHJldHR5X3ByaW50Lm8gXAorCS1MJCh0b3BfYnVpbGRkaXIpL2xpYiAtbGx2bQorCitnZXRfcHZzX3Q6IGdldF9wdnNfdC5vIHByZXR0eV9wcmludC5vICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLmEKKwkkKENDKSAtbyBnZXRfcHZzX3QgZ2V0X3B2c190Lm8gcHJldHR5X3ByaW50Lm8gLUwkKHRvcF9idWlsZGRpcikvbGliIC1sbHZtCisKK3JlYWRfcHZfdDogcmVhZF9wdl90Lm8gcHJldHR5X3ByaW50Lm8gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJsdm0uYQorCSQoQ0MpIC1vIHJlYWRfcHZfdCByZWFkX3B2X3QubyBwcmV0dHlfcHJpbnQubyAtTCQodG9wX2J1aWxkZGlyKS9saWIgLWxsdm0KKworZ2V0X3Znc190OiBnZXRfdmdzX3QubyBwcmV0dHlfcHJpbnQubyAkKHRvcF9idWlsZGRpcikvbGliL2xpYmx2bS5hCisJJChDQykgLW8gZ2V0X3Znc190IGdldF92Z3NfdC5vIHByZXR0eV9wcmludC5vIC1MJCh0b3BfYnVpbGRkaXIpL2xpYiAtbGx2bQorCmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZm9ybWF0MS9nZXRfcHZzX3QuYyBiL29sZC10ZXN0cy9mb3JtYXQxL2dldF9wdnNfdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2YwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvZm9ybWF0MS9nZXRfcHZzX3QuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImZvcm1hdDEuaCIKKyNpbmNsdWRlICJwcmV0dHlfcHJpbnQuaCIKKyNpbmNsdWRlICJsaXN0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlvX3NwYWNlICppb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHZzLCAqdG1wOworCXN0cnVjdCBkbV9wb29sICptZW07CisKKwlpbml0X2xvZyhzdGRlcnIpOworCWluaXRfZGVidWcoX0xPR19JTkZPKTsKKworCWlmICghZGV2X2NhY2hlX2luaXQoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImluaXQgb2YgZGV2LWNhY2hlIGZhaWxlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFkZXZfY2FjaGVfYWRkX2RpcigiL2Rldi9sb29wIikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBhZGQgL2RldiB0byBkaXItY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKDEwICogMTAyNCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgY3JlYXRlIHBvb2xcbiIpOworCQlleGl0KDEpOworCX0KKworCWlvcyA9IGNyZWF0ZV9sdm0xX2Zvcm1hdCgiL2RldiIsIG1lbSwgTlVMTCk7CisKKwlpZiAoIWlvcykgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjcmVhdGUgaW9fc3BhY2UgZm9yIGZvcm1hdDFcbiIpOworCQlleGl0KDEpOworCX0KKworCXB2cyA9IGlvcy0+Z2V0X3B2cyhpb3MpOworCisJaWYgKCFwdnMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCByZWFkIHZnICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgcHZzKSB7CisJCXN0cnVjdCBwdl9saXN0ICpwdmwgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB2X2xpc3QsIGxpc3QpOworCQlkdW1wX3B2KCZwdmwtPnB2LCBzdGRvdXQpOworCX0KKworCWlvcy0+ZGVzdHJveShpb3MpOworCisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJZGV2X2NhY2hlX2V4aXQoKTsKKwlkdW1wX21lbW9yeSgpOworCWZpbl9sb2coKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9mb3JtYXQxL2dldF92Z3NfdC5jIGIvb2xkLXRlc3RzL2Zvcm1hdDEvZ2V0X3Znc190LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxMGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9mb3JtYXQxL2dldF92Z3NfdC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiZm9ybWF0MS5oIgorI2luY2x1ZGUgInByZXR0eV9wcmludC5oIgorI2luY2x1ZGUgImxpc3QuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaW9fc3BhY2UgKmlvczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp2Z3M7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKworCWluaXRfbG9nKHN0ZGVycik7CisJaW5pdF9kZWJ1ZyhfTE9HX0lORk8pOworCisJaWYgKCFkZXZfY2FjaGVfaW5pdCgpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW5pdCBvZiBkZXYtY2FjaGUgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWRldl9jYWNoZV9hZGRfZGlyKCIvZGV2L2xvb3AiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGFkZCAvZGV2IHRvIGRpci1jYWNoZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoMTAgKiAxMDI0KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBjcmVhdGUgcG9vbFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaW9zID0gY3JlYXRlX2x2bTFfZm9ybWF0KCIvZGV2IiwgbWVtLCBOVUxMKTsKKworCWlmICghaW9zKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNyZWF0ZSBpb19zcGFjZSBmb3IgZm9ybWF0MVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJdmdzID0gaW9zLT5nZXRfdmdzKGlvcyk7CisKKwlpZiAoIXZncykgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IHJlYWQgdmcgbmFtZXNcbiIpOworCQlleGl0KDEpOworCX0KKworCWR1bXBfdmdfbmFtZXModmdzLCBzdGRvdXQpOworCWlvcy0+ZGVzdHJveShpb3MpOworCisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJZGV2X2NhY2hlX2V4aXQoKTsKKwlkdW1wX21lbW9yeSgpOworCWZpbl9sb2coKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9mb3JtYXQxL3ByZXR0eV9wcmludC5jIGIvb2xkLXRlc3RzL2Zvcm1hdDEvcHJldHR5X3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlMDg5YQotLS0gL2Rldi9udWxsCisrKyBiL29sZC10ZXN0cy9mb3JtYXQxL3ByZXR0eV9wcmludC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAicHJldHR5X3ByaW50LmgiCisKK3ZvaWQgZHVtcF9wdihzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgRklMRSAqZnApCit7CisJZnByaW50ZihmcCwgInBoeXNpY2FsX3ZvbHVtZSB7XG4iKTsKKwlmcHJpbnRmKGZwLCAiXHRuYW1lID0gJyVzJ1xuIiwgcHYtPmRldi0+bmFtZSk7CisJZnByaW50ZihmcCwgIlx0dmdfbmFtZSA9ICclcydcbiIsIHB2LT52Z19uYW1lKTsKKwlmcHJpbnRmKGZwLCAiXHRzaXplID0gJWxsdVxuIiwgcHYtPnNpemUpOworCWZwcmludGYoZnAsICJcdHBlX3NpemUgPSAlbGx1XG4iLCBwdi0+cGVfc2l6ZSk7CisJZnByaW50ZihmcCwgIlx0cGVfc3RhcnQgPSAlbGx1XG4iLCBwdi0+cGVfc3RhcnQpOworCWZwcmludGYoZnAsICJcdHBlX2NvdW50ID0gJXVcbiIsIHB2LT5wZV9jb3VudCk7CisJZnByaW50ZihmcCwgIlx0cGVfYWxsb2NhdGVkID0gJXVcbiIsIHB2LT5wZV9hbGxvY2F0ZWQpOworCWZwcmludGYoZnAsICJ9XG5cbiIpOworfQorCit2b2lkIGR1bXBfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgRklMRSAqZnApCit7CisJaW50IGk7CisKKwlmcHJpbnRmKGZwLCAibG9naWNhbF92b2x1bWUge1xuIik7CisJZnByaW50ZihmcCwgIlx0bmFtZSA9ICclcydcbiIsIGx2LT5uYW1lKTsKKwlmcHJpbnRmKGZwLCAiXHRzaXplID0gJWxsdVxuIiwgbHYtPnNpemUpOworCWZwcmludGYoZnAsICJcdGxlX2NvdW50ID0gJXVcbiIsIGx2LT5sZV9jb3VudCk7CisKKwlmcHJpbnRmKGZwLCAiXHRtYXAge1xuIik7CisJZm9yIChpID0gMDsgaSA8IGx2LT5sZV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2ID0gbHYtPm1hcFtpXS5wdjsKKworCQlmcHJpbnRmKGZwLCAiXHRcdHB2ID0gJyVzJywgIiwKKwkJCXB2ID8gcHYtPmRldi0+bmFtZSA6ICJudWxsID8/PyIpOworCQlmcHJpbnRmKGZwLCAiXHRleHRlbnQgPSAldVxuIiwgbHYtPm1hcFtpXS5wZSk7CisJfQorCWZwcmludGYoZnAsICJcdH1cbn1cblxuIik7Cit9CisKK3ZvaWQgZHVtcF92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgRklMRSAqZnApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJZnByaW50ZihmcCwgInZvbHVtZV9ncm91cCB7XG4iKTsKKwlmcHJpbnRmKGZwLCAiXHRuYW1lID0gJyVzJ1xuIiwgdmctPm5hbWUpOworCWZwcmludGYoZnAsICJcdGV4dGVudF9zaXplID0gJWxsdVxuIiwgdmctPmV4dGVudF9zaXplKTsKKwlmcHJpbnRmKGZwLCAiXHRleHRlbnRfY291bnQgPSAlZFxuIiwgdmctPmV4dGVudF9jb3VudCk7CisJZnByaW50ZihmcCwgIlx0ZnJlZV9jb3VudCA9ICVkXG4iLCB2Zy0+ZnJlZV9jb3VudCk7CisJZnByaW50ZihmcCwgIlx0bWF4X2x2ID0gJWRcbiIsIHZnLT5tYXhfbHYpOworCWZwcmludGYoZnAsICJcdG1heF9wdiA9ICVkXG4iLCB2Zy0+bWF4X3B2KTsKKwlmcHJpbnRmKGZwLCAiXHRwdl9jb3VudCA9ICVkXG4iLCB2Zy0+cHZfY291bnQpOworCWZwcmludGYoZnAsICJcdGx2X2NvdW50ID0gJWRcbiIsIHZnLT5sdl9jb3VudCk7CisJZnByaW50ZihmcCwgIn1cblxuIik7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnZnLT5wdnMpIHsKKwkJc3RydWN0IHB2X2xpc3QgKnB2bCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHZfbGlzdCwgbGlzdCk7CisJCWR1bXBfcHYoJnB2bC0+cHYsIGZwKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnZnLT5sdnMpIHsKKwkJc3RydWN0IGx2X2xpc3QgKmx2bCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgbHZfbGlzdCwgbGlzdCk7CisJCWR1bXBfbHYoJmx2bC0+bHYsIGZwKTsKKwl9Cit9CisKK3ZvaWQgZHVtcF92Z19uYW1lcyhzdHJ1Y3QgbGlzdF9oZWFkICp2Z19uYW1lcywgRklMRSAqZnApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBuYW1lX2xpc3QgKm5sOworCisJbGlzdF9mb3JfZWFjaCh0bXAsIHZnX25hbWVzKSB7CisJCW5sID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBuYW1lX2xpc3QsIGxpc3QpOworCQlmcHJpbnRmKGZwLCAiJXNcbiIsIG5sLT5uYW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vbGQtdGVzdHMvZm9ybWF0MS9wcmV0dHlfcHJpbnQuaCBiL29sZC10ZXN0cy9mb3JtYXQxL3ByZXR0eV9wcmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmQwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvZm9ybWF0MS9wcmV0dHlfcHJpbnQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX1BSRVRUWV9QUklOVAorI2RlZmluZSBfTFZNX1BSRVRUWV9QUklOVAorCisjaW5jbHVkZSAibWV0YWRhdGEuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3ZvaWQgZHVtcF9wdihzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgRklMRSAqZnApOwordm9pZCBkdW1wX2x2KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIEZJTEUgKmZwKTsKK3ZvaWQgZHVtcF92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgRklMRSAqZnApOwordm9pZCBkdW1wX3ZnX25hbWVzKHN0cnVjdCBsaXN0X2hlYWQgKnZnX25hbWVzLCBGSUxFICpmcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2Zvcm1hdDEvcmVhZF9wdl90LmMgYi9vbGQtdGVzdHMvZm9ybWF0MS9yZWFkX3B2X3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFjYzFlCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2Zvcm1hdDEvcmVhZF9wdl90LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJmb3JtYXQxLmgiCisjaW5jbHVkZSAicHJldHR5X3ByaW50LmgiCisjaW5jbHVkZSAibGlzdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpb19zcGFjZSAqaW9zOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCBkbV9wb29sICptZW07CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWFkX3B2X3QgPGRldmljZT5cbiIpOworCQlleGl0KDEpOworCX0KKworCWluaXRfbG9nKHN0ZGVycik7CisJaW5pdF9kZWJ1ZyhfTE9HX0lORk8pOworCisJaWYgKCFkZXZfY2FjaGVfaW5pdCgpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW5pdCBvZiBkZXYtY2FjaGUgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWRldl9jYWNoZV9hZGRfZGlyKCIvZGV2L2xvb3AiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGFkZCAvZGV2IHRvIGRpci1jYWNoZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoMTAgKiAxMDI0KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBjcmVhdGUgcG9vbFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaW9zID0gY3JlYXRlX2x2bTFfZm9ybWF0KCIvZGV2IiwgbWVtLCBOVUxMKTsKKworCWlmICghaW9zKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNyZWF0ZSBpb19zcGFjZSBmb3IgZm9ybWF0MVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJcHYgPSBpb3MtPnB2X3JlYWQoaW9zLCBhcmd2WzFdKTsKKworCWlmICghcHYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCByZWFkIHB2ICVzXG4iLCBkZXYtPm5hbWUpOworCQlleGl0KDEpOworCX0KKworCWR1bXBfcHYocHYsIHN0ZG91dCk7CisJaW9zLT5kZXN0cm95KGlvcyk7CisKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlkZXZfY2FjaGVfZXhpdCgpOworCWR1bXBfbWVtb3J5KCk7CisJZmluX2xvZygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL2Zvcm1hdDEvcmVhZF92Z190LmMgYi9vbGQtdGVzdHMvZm9ybWF0MS9yZWFkX3ZnX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIxNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2Zvcm1hdDEvcmVhZF92Z190LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJmb3JtYXQxLmgiCisjaW5jbHVkZSAicHJldHR5X3ByaW50LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlvX3NwYWNlICppb3M7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKworCWlmIChhcmdjICE9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVhZF92Z190IDx2Z19uYW1lPlxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaW5pdF9sb2coc3RkZXJyKTsKKwlpbml0X2RlYnVnKF9MT0dfSU5GTyk7CisKKwlpZiAoIWRldl9jYWNoZV9pbml0KCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbml0IG9mIGRldi1jYWNoZSBmYWlsZWRcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghZGV2X2NhY2hlX2FkZF9kaXIoIi9kZXYvbG9vcCIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgYWRkIC9kZXYgdG8gZGlyLWNhY2hlXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIShtZW0gPSBkbV9wb29sX2NyZWF0ZSgxMCAqIDEwMjQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGNyZWF0ZSBwb29sXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpb3MgPSBjcmVhdGVfbHZtMV9mb3JtYXQoIi9kZXYiLCBtZW0sIE5VTEwpOworCisJaWYgKCFpb3MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY3JlYXRlIGlvX3NwYWNlIGZvciBmb3JtYXQxXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl2ZyA9IGlvcy0+dmdfcmVhZChpb3MsIGFyZ3ZbMV0pOworCisJaWYgKCF2ZykgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IHJlYWQgdmcgJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDEpOworCX0KKworCWR1bXBfdmcodmcsIHN0ZG91dCk7CisKKwlpb3MtPmRlc3Ryb3koaW9zKTsKKworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCWRldl9jYWNoZV9leGl0KCk7CisJZHVtcF9tZW1vcnkoKTsKKwlmaW5fbG9nKCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9mb3JtYXQxL3dyaXRlX3ZnX3QuYyBiL29sZC10ZXN0cy9mb3JtYXQxL3dyaXRlX3ZnX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY4MmFkCi0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL2Zvcm1hdDEvd3JpdGVfdmdfdC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiZm9ybWF0MS5oIgorI2luY2x1ZGUgInByZXR0eV9wcmludC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpb19zcGFjZSAqaW9zOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBkbV9wb29sICptZW07CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHJlYWRfdmdfdCA8dmdfbmFtZT5cbiIpOworCQlleGl0KDEpOworCX0KKworCWluaXRfbG9nKHN0ZGVycik7CisJaW5pdF9kZWJ1ZyhfTE9HX0lORk8pOworCisJaWYgKCFkZXZfY2FjaGVfaW5pdCgpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW5pdCBvZiBkZXYtY2FjaGUgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWRldl9jYWNoZV9hZGRfZGlyKCIvZGV2L2xvb3AiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGFkZCAvZGV2IHRvIGRpci1jYWNoZVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoMTAgKiAxMDI0KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBjcmVhdGUgcG9vbFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJaW9zID0gY3JlYXRlX2x2bTFfZm9ybWF0KCIvZGV2IiwgbWVtLCBOVUxMKTsKKworCWlmICghaW9zKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNyZWF0ZSBpb19zcGFjZSBmb3IgZm9ybWF0MVxuIik7CisJCWV4aXQoMSk7CisJfQorCisJdmcgPSBpb3MtPnZnX3JlYWQoaW9zLCBhcmd2WzFdKTsKKworCWlmICghdmcpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCByZWFkIHZnICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWlvcy0+dmdfd3JpdGUoaW9zLCB2ZykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCB3cml0ZSB2Z1xuIik7CisJCWV4aXQoMSk7CisJfQorCisJaW9zLT5kZXN0cm95KGlvcyk7CisKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlkZXZfY2FjaGVfZXhpdCgpOworCWR1bXBfbWVtb3J5KCk7CisJZmluX2xvZygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2xkLXRlc3RzL21tL01ha2VmaWxlLmluIGIvb2xkLXRlc3RzL21tL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjBmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vbGQtdGVzdHMvbW0vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzMyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCitTT1VSQ0VTPVwKKwlkYmdfbWFsbG9jX3QuYworCitUQVJHRVRTPWRiZ19tYWxsb2NfdAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworZGJnX21hbGxvY190OiBkYmdfbWFsbG9jX3QubworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBkYmdfbWFsbG9jX3QgZGJnX21hbGxvY190Lm8gXAorCQktTCQodG9wX2J1aWxkZGlyKS9saWIgLWxsdm0KKworcG9vbF90OiBwb29sX3QubworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBwb29sX3QgcG9vbF90Lm8gLUwkKHRvcF9idWlsZGRpcikvbGliIC1sbHZtCisKZGlmZiAtLWdpdCBhL29sZC10ZXN0cy9tbS9kYmdfbWFsbG9jX3QuYyBiL29sZC10ZXN0cy9tbS9kYmdfbWFsbG9jX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM2NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvb2xkLXRlc3RzL21tL2RiZ19tYWxsb2NfdC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCitzdGF0aWMgdm9pZCBfcHJpbnRfaGVscChGSUxFICpvdXQsIGNvbnN0IGNoYXIgKnByb2cpCit7CisJZnByaW50ZihvdXQsICJ1c2FnZSA6ICVzIFstaGxidWZkXVxuXG4iLCBwcm9nKTsKKwlmcHJpbnRmKG91dCwgIiAgaCA6IHRoaXMgbWVzc2FnZVxuIik7CisJZnByaW50ZihvdXQsICIgIGwgOiBjYXVzZSBtZW1vcnkgbGVha1xuIik7CisJZnByaW50ZihvdXQsICIgIGIgOiBvdmVycnVuIG1lbW9yeSBibG9ja1xuIik7CisJZnByaW50ZihvdXQsICIgIHUgOiB1bmRlcnJ1biBtZW1vcnkgYmxvY2tcbiIpOworCWZwcmludGYob3V0LCAiICBmIDogZnJlZSByYW5kb20gcG9pbnRlclxuIik7CisJZnByaW50ZihvdXQsICIgIGQgOiBmcmVlIGJsb2NrIHR3aWNlXG4iKTsKK30KKworc3RydWN0IGJsb2NrX2xpc3QgeworCXN0cnVjdCBibG9ja19saXN0ICpuZXh0OworCWNoYXIgZHVtbXlbOV07Cit9OworCitzdGF0aWMgdm9pZCBfbGVha19tZW1vcnkodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYmxvY2tfbGlzdCAqYiwgKmhlYWQsICoqbCA9ICZoZWFkLCAqbjsKKworCS8qIGFsbG9jYXRlIGEgbGlzdCBvZiBibG9ja3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisKKwkJaWYgKCEoYiA9IGRiZ19tYWxsb2Moc2l6ZW9mKCpiKSkpKSB7CisJCQlsb2dfZmF0YWwoIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWItPm5leHQgPSAwOworCQkqbCA9IGI7CisJCWwgPSAmYi0+bmV4dDsKKwl9CisKKwkvKiBmcmVlIG9mZiBldmVyeSBvdGhlciBibG9jayAqLworCWZvciAoYiA9IGhlYWQsIGkgPSAwOyBiOyBiID0gbiwgaSsrKSB7CisJCW4gPSBiLT5uZXh0OworCQlpZihpICYgMHgxKQorCQkJZGJnX2ZyZWUoYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfYm91bmRzX292ZXJydW4odm9pZCkKK3sKKwljaGFyICpiOworCisJLyogYWxsb2NhdGUgYSBibG9jayAqLworCWIgPSBkYmdfbWFsbG9jKDUzNCk7CisKKwkvKiBvdmVycnVuICovCisJYls1MzRdID0gNTY7CisKKwkvKiBmcmVlIGl0LCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgYm91bmRzIGVycm9yICovCisJZGJnX2ZyZWUoYik7Cit9CisKK3N0YXRpYyB2b2lkIF9ib3VuZHNfdW5kZXJydW4odm9pZCkKK3sKKwljaGFyICpiOworCisJLyogYWxsb2NhdGUgYSBibG9jayAqLworCWIgPSBkYmdfbWFsbG9jKDUzNCk7CisKKwkvKiB1bmRlcnJ1biAqLworCSooYiAtIDEpID0gNTY7CisKKwkvKiBmcmVlIGl0LCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgYm91bmRzIGVycm9yICovCisJZGJnX2ZyZWUoYik7Cit9CisKK3N0YXRpYyB2b2lkIF9mcmVlX2R1ZCh2b2lkKQoreworCWNoYXIgKmI7CisKKwkvKiBhbGxvY2F0ZSBhIGJsb2NrICovCisJYiA9IGRiZ19tYWxsb2MoNTM0KTsKKworCS8qIGZyZWUgaXQsIHdoaWNoIHNob3VsZCB0cmlnZ2VyIHRoZSBib3VuZHMgZXJyb3IgKi8KKwlkYmdfZnJlZShiICsgMTAwKTsKK30KKworc3RhdGljIHZvaWQgX2ZyZWVfdHdpY2Uodm9pZCkKK3sKKwljaGFyICpiOworCisJLyogYWxsb2NhdGUgYSBibG9jayAqLworCWIgPSBkYmdfbWFsbG9jKDUzNCk7CisKKwkvKiBmcmVlIGl0LCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgYm91bmRzIGVycm9yICovCisJZGJnX2ZyZWUoYik7CisJZGJnX2ZyZWUoYik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIG9wdDsKKworCWluaXRfbG9nKHN0ZGVycik7CisJaW5pdF9kZWJ1ZyhfTE9HX0RFQlVHKTsKKwlvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImhsYnVmZCIpOworCXN3aXRjaChvcHQpIHsKKwljYXNlIEVPRjoKKwljYXNlICdoJzoKKwkJX3ByaW50X2hlbHAoc3Rkb3V0LCBhcmd2WzBdKTsKKwkJYnJlYWs7CisKKwljYXNlICdsJzoKKwkJX2xlYWtfbWVtb3J5KCk7CisJCWJyZWFrOworCisJY2FzZSAnYic6CisJCV9ib3VuZHNfb3ZlcnJ1bigpOworCQlicmVhazsKKworCWNhc2UgJ3UnOgorCQlfYm91bmRzX3VuZGVycnVuKCk7CisJCWJyZWFrOworCisJY2FzZSAnZic6CisJCV9mcmVlX2R1ZCgpOworCQlicmVhazsKKworCWNhc2UgJ2QnOgorCQlfZnJlZV90d2ljZSgpOworCQlicmVhazsKKworCWNhc2UgJz8nOgorCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIC0lY1xuIiwgb3B0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkdW1wX21lbW9yeSgpOworCWZpbl9sb2coKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BvL01ha2VmaWxlLmluIGIvcG8vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmYTMyYwotLS0gL2Rldi9udWxsCisrKyBiL3BvL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK0xBTkdTPWRlCisKKyNUQVJHRVRTPSQoTEFOR1M6JT1sdm0yXyUubW8pICQoTEFOR1M6JT1kbV8lLm1vKQorCitETV9QT1NPVVJDRVMgPSAkKHRvcF9idWlsZGRpcikvdG9vbHMvZG1zZXR1cC5wb3QgJCh0b3BfYnVpbGRkaXIpL2xpYmRtLyoucG90IFwKKwkgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYmRtLyovKi5wb3QKKworTFZNX1BPU09VUkNFUyA9ICQodG9wX2J1aWxkZGlyKS90b29scy8qLnBvdCAkKHRvcF9idWlsZGRpcikvbGliLyovKi5wb3QKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK2x2bTIucG86IE1ha2VmaWxlICQoTFZNX1BPU09VUkNFUykKKwlAZWNobyBDb21waWxpbmcgc3RyaW5nIHRhYmxlCisJQHhnZXR0ZXh0IC1DIC1GIC0ta2V5d29yZD1wcmludF9sb2cgLS1rZXl3b3JkPWxvZ19kZWJ1ZyBcCisJCS0ta2V5d29yZD1sb2dfaW5mbyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAorCQktLWtleXdvcmQ9bG9nX25vdGljZSAtLWtleXdvcmQ9bG9nX3dhcm4gLS1rZXl3b3JkPWxvZ19lcnIgXAorCQktLWtleXdvcmQ9bG9nX2ZhdGFsIC0ta2V5d29yZD1sb2dfZGVidWcgLS1rZXl3b3JkPWxvZ19lcnJvciBcCisJCS0ta2V5d29yZD1sb2dfcHJpbnQgLS1rZXl3b3JkPWxvZ192ZXJib3NlIFwKKwkJLS1rZXl3b3JkPWxvZ192ZXJ5X3ZlcmJvc2UgLWQgLSBcCisJCSQoTFZNX1BPU09VUkNFUykgPiAkQAorCitkZXZpY2UtbWFwcGVyLnBvOiBNYWtlZmlsZSAkKERNX1BPU09VUkNFUykKKwlAZWNobyBDb21waWxpbmcgc3RyaW5nIHRhYmxlCisJQHhnZXR0ZXh0IC1DIC1GIC0ta2V5d29yZD1kbV9sb2cgLS1rZXl3b3JkPWxvZ19kZWJ1ZyBcCisJCS0ta2V5d29yZD1sb2dfaW5mbyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAorCQktLWtleXdvcmQ9bG9nX25vdGljZSAtLWtleXdvcmQ9bG9nX3dhcm4gLS1rZXl3b3JkPWxvZ19lcnIgXAorCQktLWtleXdvcmQ9bG9nX2ZhdGFsIC0ta2V5d29yZD1sb2dfZGVidWcgLS1rZXl3b3JkPWxvZ19lcnJvciBcCisJCS0ta2V5d29yZD1sb2dfcHJpbnQgLS1rZXl3b3JkPWxvZ192ZXJib3NlIFwKKwkJLS1rZXl3b3JkPWxvZ192ZXJ5X3ZlcmJvc2UgLWQgLSBcCisJCSQoRE1fUE9TT1VSQ0VTKSA+ICRACisKK3BvZmlsZTogbHZtMi5wbyBkZXZpY2UtbWFwcGVyLnBvCisKKyMgRklYTUUKK2luc3RhbGw6ICQoVEFSR0VUUykKKwlAZWNobyBJbnN0YWxsaW5nIHRyYW5zbGF0aW9uIGZpbGVzIGluICQobG9jYWxlZGlyKQorCUAoIFwKKwkJZm9yIGxhbmcgaW4gJChMQU5HUyk7IGRvIFwKKwkJCSQoSU5TVEFMTF9EQVRBKSAtRCAkJGxhbmcubW8gXAorCQkJICAgICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvbHZtMi5tbztcCisJICBkb25lOyBcCisJKQorCUAoIFwKKwkJZm9yIGxhbmcgaW4gJChMQU5HUyk7IGRvIFwKKwkJCSQoSU5TVEFMTF9EQVRBKSAtRCAkJGxhbmcubW8gXAorCQkJICAgICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvZGV2aWNlLW1hcHBlci5tbztcCisJICBkb25lOyBcCisJKQpkaWZmIC0tZ2l0IGEvcG8vZGUucG8gYi9wby9kZS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJiYmJlCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZGUucG8KQEAgLTAsMCArMSwxMCBAQAorIyBEdW1teSB0ZXN0IGZpbGUKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTAyLTEzIDIwOjM1KzAwMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE5vYm9keSA8bm9ib2R5QG5vd2hlcmU+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKwpkaWZmIC0tZ2l0IGEvcG8vbHZtMi5wbyBiL3BvL2x2bTIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMzZhZQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2x2bTIucG8KQEAgLTAsMCArMSw3NjMwIEBACisjIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCisjIENvcHlyaWdodCAoQykgWUVBUiBUSEUgUEFDS0FHRSdTIENPUFlSSUdIVCBIT0xERVIKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIFBBQ0tBR0UgcGFja2FnZS4KKyMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KKyMKKyMsIGZ1enp5Cittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDctMDQtMjcgMjE6NDYrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgorIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgorIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo0NAorbXNnaWQgIkxWTTEgcHJvYyBnbG9iYWwgc25wcmludGYgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NjMKK21zZ2lkICJtb2R1bGUgc3RyaW5nIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NzQgYWN0aXZhdGUvYWN0aXZhdGUuYzo5MSBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjEwOQorIzogYWN0aXZhdGUvYWN0aXZhdGUuYzozNjQgYWN0aXZhdGUvYWN0aXZhdGUuYzo0MTcgYWN0aXZhdGUvYWN0aXZhdGUuYzo0MzgKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NDQ1IGFjdGl2YXRlL2FjdGl2YXRlLmM6NDkyIGFjdGl2YXRlL2FjdGl2YXRlLmM6NDk1CisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjUxNCBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjUyMCBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjUyMworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo1MzYgYWN0aXZhdGUvYWN0aXZhdGUuYzo1NDggYWN0aXZhdGUvYWN0aXZhdGUuYzo1NjEKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NTY0IGFjdGl2YXRlL2FjdGl2YXRlLmM6NTc2IGFjdGl2YXRlL2FjdGl2YXRlLmM6NTc5CisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjU5MSBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjU5NCBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjYwNgorIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo2MDkgYWN0aXZhdGUvYWN0aXZhdGUuYzo3NjQgYWN0aXZhdGUvYWN0aXZhdGUuYzo3NjgKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6Nzc2IGFjdGl2YXRlL2FjdGl2YXRlLmM6Nzg1IGFjdGl2YXRlL2FjdGl2YXRlLmM6NzkxCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjgzNiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjg0OCBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjg4MgorIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo4OTQgYWN0aXZhdGUvYWN0aXZhdGUuYzo5NTMgYWN0aXZhdGUvYWN0aXZhdGUuYzo5NjcKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6OTk2IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTA0CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEzMCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEzOQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzoxNDIgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzoxNjgKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTc2IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MjUwCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjI1OCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjI2MQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzozMzkgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzozNDcKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MzUwIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6Mzc5CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjQzNCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjQzOQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo0NTIgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo0ODkKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NDkyIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NTAwCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjUyMyBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjUzNQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2MTEgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2MjgKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NjMxIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NjU0CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjY1OCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjY2MQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2NjQgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2ODIKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6Njg5IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6Njk4CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjczNyBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjc1NworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo3NjAgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo3ODAKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NzgzIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6Nzg4CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjg0MiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjg1MQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo4NTQgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo4NjAKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6ODY2IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6ODY5CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjg3MSBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjg3NworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo4OTEgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo4OTQKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6OTIwIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6OTI5CisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjk5NiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwMTAKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTAxOCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwMjUKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTAzMCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwMzgKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTA0NCBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwNDgKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTA1MiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwNzUKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTEzOCBhY3RpdmF0ZS9mcy5jOjE3OSBhY3RpdmF0ZS9mcy5jOjIyOQorIzogYWN0aXZhdGUvZnMuYzoyMzYgYWN0aXZhdGUvZnMuYzoyNDMgYWN0aXZhdGUvZnMuYzoyNDYgYWN0aXZhdGUvZnMuYzozMjAKKyM6IGFyY2hpdmVyLmM6NjggYXJjaGl2ZXIuYzo3NSBhcmNoaXZlci5jOjg3IGFyY2hpdmVyLmM6MTYzIGFyY2hpdmVyLmM6MjM2CisjOiBhcmNoaXZlci5jOjI4NiBhcmNoaXZlci5jOjMwMyBhcmNoaXZlci5jOjM0NSBhcmNoaXZlci5jOjM1MAorIzogY2FjaGUvbHZtY2FjaGUuYzo0ODYgY2FjaGUvbHZtY2FjaGUuYzo0OTAgY2FjaGUvbHZtY2FjaGUuYzo3MDQKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NzI0IGNhY2hlL2x2bWNhY2hlLmM6NzUwIGNhY2hlL2x2bWNhY2hlLmM6ODEwCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjI3NiBjb21tYW5kcy90b29sY29udGV4dC5jOjI5NQorIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzozMDIgY29tbWFuZHMvdG9vbGNvbnRleHQuYzozNzkKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6Mzk0IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6NDE4CisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjQ2OSBjb21tYW5kcy90b29sY29udGV4dC5jOjY4NQorIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo3ODEgY29uZmlnL2NvbmZpZy5jOjE0OCBjb25maWcvY29uZmlnLmM6MTYxCisjOiBjb25maWcvY29uZmlnLmM6MTc2IGNvbmZpZy9jb25maWcuYzoxOTQgY29uZmlnL2NvbmZpZy5jOjIxNQorIzogY29uZmlnL2NvbmZpZy5jOjIzNSBjb25maWcvY29uZmlnLmM6MjgyIGNvbmZpZy9jb25maWcuYzoyODUKKyM6IGNvbmZpZy9jb25maWcuYzo0NjcgY29uZmlnL2NvbmZpZy5jOjQ4NSBjb25maWcvY29uZmlnLmM6NDkwCisjOiBjb25maWcvY29uZmlnLmM6NTAwIGNvbmZpZy9jb25maWcuYzo1MTQgY29uZmlnL2NvbmZpZy5jOjUzMAorIzogY29uZmlnL2NvbmZpZy5jOjU4NiBjb25maWcvY29uZmlnLmM6Nzc3IGRhdGFzdHJ1Y3QvYnRyZWUuYzo5MAorIzogZGF0YXN0cnVjdC9zdHJfbGlzdC5jOjI0IGRhdGFzdHJ1Y3Qvc3RyX2xpc3QuYzozOCBkYXRhc3RydWN0L3N0cl9saXN0LmM6NDcKKyM6IGRhdGFzdHJ1Y3Qvc3RyX2xpc3QuYzo3NyBkZXZpY2UvZGV2LWNhY2hlLmM6MjQwIGRldmljZS9kZXYtY2FjaGUuYzoyNTMKKyM6IGRldmljZS9kZXYtY2FjaGUuYzoyOTggZGV2aWNlL2Rldi1jYWNoZS5jOjMwMiBkZXZpY2UvZGV2LWNhY2hlLmM6MzczCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NDA0IGRldmljZS9kZXYtY2FjaGUuYzo0NDMgZGV2aWNlL2Rldi1jYWNoZS5jOjUxMQorIzogZGV2aWNlL2Rldi1jYWNoZS5jOjU0NyBkZXZpY2UvZGV2LWNhY2hlLmM6NTUyIGRldmljZS9kZXYtY2FjaGUuYzo1NjcKKyM6IGRldmljZS9kZXYtaW8uYzoxNzQgZGV2aWNlL2Rldi1pby5jOjIwNCBkZXZpY2UvZGV2LWlvLmM6MzU4CisjOiBkZXZpY2UvZGV2LWlvLmM6NTU2IGRldmljZS9kZXYtaW8uYzo2MDYgZGV2aWNlL2Rldi1pby5jOjYyNAorIzogZGV2aWNlL2Rldi1pby5jOjY0MyBkZXZpY2UvZGV2LWlvLmM6NjcxIGRldmljZS9kZXYtbWQuYzo0MQorIzogZGV2aWNlL2Rldi1tZC5jOjQ5IGRldmljZS9kZXYtbWQuYzo2NiBkZXZpY2UvZGV2aWNlLmM6NjEgZGV2aWNlL2RldmljZS5jOjY2CisjOiBkZXZpY2UvZGV2aWNlLmM6OTAgZGlzcGxheS9kaXNwbGF5LmM6MjQzIGRpc3BsYXkvZGlzcGxheS5jOjI3NAorIzogZGlzcGxheS9kaXNwbGF5LmM6MzMzIGRpc3BsYXkvZGlzcGxheS5jOjM3OSBkaXNwbGF5L2Rpc3BsYXkuYzo2MDUKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjY0MSBlcnJvci9lcnJzZWcuYzoxMDEgZmlsdGVycy9maWx0ZXItY29tcG9zaXRlLmM6NTQKKyM6IGZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYzo0NiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MTEwCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MTE0IGZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYzoxMTcKKyM6IGZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYzoxOTcgZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjI5OQorIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjMwNSBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MzE2CisjOiBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjc0IGZpbHRlcnMvZmlsdGVyLXJlZ2V4LmM6MTAxCisjOiBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjExOSBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjE0MgorIzogZmlsdGVycy9maWx0ZXItcmVnZXguYzoxOTYgZmlsdGVycy9maWx0ZXItcmVnZXguYzoyMDEKKyM6IGZpbHRlcnMvZmlsdGVyLXJlZ2V4LmM6MjA2IGZpbHRlcnMvZmlsdGVyLXJlZ2V4LmM6MjA5CisjOiBmaWx0ZXJzL2ZpbHRlci1zeXNmcy5jOjI4OCBmaWx0ZXJzL2ZpbHRlci5jOjI3OCBmb3JtYXQxL2Rpc2stcmVwLmM6MjIxCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6MjMzIGZvcm1hdDEvZGlzay1yZXAuYzoyMzggZm9ybWF0MS9kaXNrLXJlcC5jOjI1NworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjI2MCBmb3JtYXQxL2Rpc2stcmVwLmM6MjkxIGZvcm1hdDEvZGlzay1yZXAuYzoyOTQKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzozMTMgZm9ybWF0MS9kaXNrLXJlcC5jOjMxNiBmb3JtYXQxL2Rpc2stcmVwLmM6MzM0CisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6MzUxIGZvcm1hdDEvZGlzay1yZXAuYzozNjEgZm9ybWF0MS9kaXNrLXJlcC5jOjQyMQorIzogZm9ybWF0MS9kaXNrLXJlcC5jOjQyOCBmb3JtYXQxL2Rpc2stcmVwLmM6NTIyIGZvcm1hdDEvZGlzay1yZXAuYzo1NDcKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo1NjMgZm9ybWF0MS9kaXNrLXJlcC5jOjU5MSBmb3JtYXQxL2Rpc2stcmVwLmM6NjA5CisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjQ2IGZvcm1hdDEvZGlzay1yZXAuYzo3MTEgZm9ybWF0MS9kaXNrLXJlcC5jOjcxOAorIzogZm9ybWF0MS9kaXNrLXJlcC5jOjczNCBmb3JtYXQxL2Zvcm1hdDEuYzoxMzQgZm9ybWF0MS9mb3JtYXQxLmM6MTM3CisjOiBmb3JtYXQxL2Zvcm1hdDEuYzoxNDkgZm9ybWF0MS9mb3JtYXQxLmM6MTU0IGZvcm1hdDEvZm9ybWF0MS5jOjE1NworIzogZm9ybWF0MS9mb3JtYXQxLmM6MTYwIGZvcm1hdDEvZm9ybWF0MS5jOjE2MyBmb3JtYXQxL2Zvcm1hdDEuYzoxNjYKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjE3MSBmb3JtYXQxL2Zvcm1hdDEuYzoxODYgZm9ybWF0MS9mb3JtYXQxLmM6MTk1CisjOiBmb3JtYXQxL2Zvcm1hdDEuYzoxOTggZm9ybWF0MS9mb3JtYXQxLmM6MjEzIGZvcm1hdDEvZm9ybWF0MS5jOjIyNworIzogZm9ybWF0MS9mb3JtYXQxLmM6MjQ1IGZvcm1hdDEvZm9ybWF0MS5jOjI1NiBmb3JtYXQxL2Zvcm1hdDEuYzoyNzEKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjI5NyBmb3JtYXQxL2Zvcm1hdDEuYzozMDIgZm9ybWF0MS9mb3JtYXQxLmM6MzA3CisjOiBmb3JtYXQxL2Zvcm1hdDEuYzozMTIgZm9ybWF0MS9mb3JtYXQxLmM6MzQ4IGZvcm1hdDEvZm9ybWF0MS5jOjM5NAorIzogZm9ybWF0MS9mb3JtYXQxLmM6NDEwIGZvcm1hdDEvZm9ybWF0MS5jOjQxNSBmb3JtYXQxL2Zvcm1hdDEuYzo0MjEKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjQzMSBmb3JtYXQxL2Zvcm1hdDEuYzo0NzcgZm9ybWF0MS9mb3JtYXQxLmM6NDk4CisjOiBmb3JtYXQxL2Zvcm1hdDEuYzo1MDcgZm9ybWF0MS9mb3JtYXQxLmM6NTUxIGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjYzCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzoxMTggZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MTUxCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzoxNjggZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MTg1CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzoxOTMgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MjI4CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzoyMzMgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MjM4CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzozMTYgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NDQ4CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo0NTMgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NDc0CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo0ODEgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NTAzCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo1MjQgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NTI5CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo1MzggZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NTQ4CisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo1NTggZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NTYzCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo2NjYgZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6NzE0CisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6NjMgZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjY4CisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6NzEgZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjEyMgorIzogZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjE5MyBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MjIwCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MjM1IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzoyODQKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzozMTQgZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjMzOAorIzogZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjM1NCBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MzY5CisjOiBmb3JtYXQxL2xheW91dC5jOjEyNiBmb3JtYXQxL2x2bTEtbGFiZWwuYzo3NSBmb3JtYXQxL3ZnX251bWJlci5jOjM3CisjOiBmb3JtYXQxL3ZnX251bWJlci5jOjQyIGZvcm1hdF9wb29sL2Rpc2tfcmVwLmM6NDkgZm9ybWF0X3Bvb2wvZGlza19yZXAuYzoxMDIKKyM6IGZvcm1hdF9wb29sL2Rpc2tfcmVwLmM6MjU2IGZvcm1hdF9wb29sL2Rpc2tfcmVwLmM6MzU4CisjOiBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjM2OCBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjM3MworIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoxMzIgZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoxMzcKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MTQyIGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MTUyCisjOiBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjE2MSBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjE2NgorIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoxODYgZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoxOTUKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MjAxIGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MjMxCisjOiBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjIzNiBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjI0NgorIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoyNTEgZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjkzCisjOiBmb3JtYXRfcG9vbC9pbXBvcnRfZXhwb3J0LmM6MTgwIGZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYzoyMTgKKyM6IGZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYzoyMzIgZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjI1NgorIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjI3NiBmb3JtYXRfcG9vbC9pbXBvcnRfZXhwb3J0LmM6MzA0CisjOiBmb3JtYXRfcG9vbC9pbXBvcnRfZXhwb3J0LmM6MzA5IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoxMTcKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoxMzggZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjE2NQorIzogZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjI1OCBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6Mjc0CisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MzUwIGZvcm1hdF90ZXh0L2FyY2hpdmUuYzozNzAKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6ODIgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzo4OQorIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxMDEgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxODkKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6MjY3IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6MzE3CisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlci5jOjMzNCBmb3JtYXRfdGV4dC9hcmNoaXZlci5jOjM3NgorIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzozODEgZm9ybWF0X3RleHQvZXhwb3J0LmM6MTM4CisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzoxOTggZm9ybWF0X3RleHQvZXhwb3J0LmM6MjA2IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjI5MworIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6Mjk0IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjI5NSBmb3JtYXRfdGV4dC9leHBvcnQuYzoyOTYKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjI5OCBmb3JtYXRfdGV4dC9leHBvcnQuYzoyOTkgZm9ybWF0X3RleHQvZXhwb3J0LmM6MzAwCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzozMDMgZm9ybWF0X3RleHQvZXhwb3J0LmM6MzEzIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjMxNworIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6MzE5IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjMyMiBmb3JtYXRfdGV4dC9leHBvcnQuYzozMjUKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjMyOSBmb3JtYXRfdGV4dC9leHBvcnQuYzozMzIgZm9ybWF0X3RleHQvZXhwb3J0LmM6MzM2CisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzozNDAgZm9ybWF0X3RleHQvZXhwb3J0LmM6MzQzIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjM0NAorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6MzQ4IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjM0OSBmb3JtYXRfdGV4dC9leHBvcnQuYzozNzMKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjM4MCBmb3JtYXRfdGV4dC9leHBvcnQuYzozODQgZm9ybWF0X3RleHQvZXhwb3J0LmM6Mzg1CisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzozODkgZm9ybWF0X3RleHQvZXhwb3J0LmM6MzkzIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjM5NQorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6Mzk4IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQwMSBmb3JtYXRfdGV4dC9leHBvcnQuYzo0MDQKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQwOCBmb3JtYXRfdGV4dC9leHBvcnQuYzo0MTEgZm9ybWF0X3RleHQvZXhwb3J0LmM6NDE1CisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo0MTkgZm9ybWF0X3RleHQvZXhwb3J0LmM6NDIyIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQyNworIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NDMxIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQ0MCBmb3JtYXRfdGV4dC9leHBvcnQuYzo0NDMKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQ0NiBmb3JtYXRfdGV4dC9leHBvcnQuYzo0NTAgZm9ybWF0X3RleHQvZXhwb3J0LmM6NDUxCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo0NTUgZm9ybWF0X3RleHQvZXhwb3J0LmM6NDU4IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQ2MworIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NDY4IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQ3OSBmb3JtYXRfdGV4dC9leHBvcnQuYzo0ODEKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjQ4OCBmb3JtYXRfdGV4dC9leHBvcnQuYzo0OTIgZm9ybWF0X3RleHQvZXhwb3J0LmM6NDk3CisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo1MDggZm9ybWF0X3RleHQvZXhwb3J0LmM6NTE4IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjUxOQorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NTI0IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjUyOCBmb3JtYXRfdGV4dC9leHBvcnQuYzo1MzEKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjUzNCBmb3JtYXRfdGV4dC9leHBvcnQuYzo1MzggZm9ybWF0X3RleHQvZXhwb3J0LmM6NTQxCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo1NDUgZm9ybWF0X3RleHQvZXhwb3J0LmM6NTQ5IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjU1MQorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NTUzIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjU1NCBmb3JtYXRfdGV4dC9leHBvcnQuYzo1NTUKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjU2MCBmb3JtYXRfdGV4dC9leHBvcnQuYzo1NjYgZm9ybWF0X3RleHQvZXhwb3J0LmM6NTgxCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo1OTEgZm9ybWF0X3RleHQvZXhwb3J0LmM6NjAwIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjYwNgorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NjI0IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjYyNyBmb3JtYXRfdGV4dC9leHBvcnQuYzo2MzQKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjYzNyBmb3JtYXRfdGV4dC9leHBvcnQuYzo2NDAgZm9ybWF0X3RleHQvZXhwb3J0LmM6NjUyCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo2NTcgZm9ybWF0X3RleHQvZXhwb3J0LmM6NjYwIGZvcm1hdF90ZXh0L2V4cG9ydC5jOjY2NQorIzogZm9ybWF0X3RleHQvZXhwb3J0LmM6NjY3IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjY2OSBmb3JtYXRfdGV4dC9leHBvcnQuYzo2NzEKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjY3MyBmb3JtYXRfdGV4dC9leHBvcnQuYzo2NzcgZm9ybWF0X3RleHQvZXhwb3J0LmM6NjgwCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo3MDIgZm9ybWF0X3RleHQvZXhwb3J0LmM6NzI5IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjc0NworIzogZm9ybWF0X3RleHQvZmxhZ3MuYzo5NCBmb3JtYXRfdGV4dC9mbGFncy5jOjEzOAorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxNTggZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxNjEKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTk1IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTk5CisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjIzOCBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjI5NQorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzozNDYgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzozNzgKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NDIwIGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NDI1CisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjQzMyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjQ1MQorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo0NTYgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo0ODEKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NDk0IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NTQyCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjU0NyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjU4NworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo2MDEgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo2MTkKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NjUwIGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NzAwCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjc1NyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjc2MgorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo3ODUgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo3OTkKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTA1OSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEwNjQKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTA3MiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEwODIKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTEwMyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjExMDcKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTExMyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjExMjUKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTMwOSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEzNjUKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTM3MCBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEzODAKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTM4MiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEzOTAKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTQzMCBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE0MzYKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTYyMSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE2MjcKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTY2NiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE3MTEKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTczMCBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE3NDYKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTc1MSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE3NjUKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTc3NyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE3ODMKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTgxMyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE4MTgKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTgyMyBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE4MzIKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTkzNSBmb3JtYXRfdGV4dC9pbXBvcnQuYzo0NworIzogZm9ybWF0X3RleHQvaW1wb3J0LmM6NTIgZm9ybWF0X3RleHQvaW1wb3J0LmM6NjMgZm9ybWF0X3RleHQvaW1wb3J0LmM6OTgKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydC5jOjExNSBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjEyMworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxMzQgZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxNjcKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MjM3IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MzAzCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjMwOSBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjMyMgorIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzozODcgZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo0MjkKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NDU3IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NDY1CisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjQ4MiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjQ4OQorIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo1MTggZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo1NzYKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NjI5IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NjU0CisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjY2NCBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjY2NworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo3MzUgZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo4NDYKKyM6IGZvcm1hdF90ZXh0L3RhZ3MuYzoyOCBmb3JtYXRfdGV4dC90YWdzLmM6MzUgZm9ybWF0X3RleHQvdGFncy5jOjQyCisjOiBmb3JtYXRfdGV4dC90YWdzLmM6NDggZm9ybWF0X3RleHQvdGFncy5jOjY3IGZvcm1hdF90ZXh0L3RleHRfbGFiZWwuYzoyMTAKKyM6IGZvcm1hdF90ZXh0L3RleHRfbGFiZWwuYzoyNDYgbGFiZWwvbGFiZWwuYzo5MCBsYWJlbC9sYWJlbC5jOjIwNworIzogbGFiZWwvbGFiZWwuYzoyNTggbGFiZWwvbGFiZWwuYzoyNzQgbGFiZWwvbGFiZWwuYzoyODQgbGFiZWwvbGFiZWwuYzoyOTEKKyM6IGxhYmVsL2xhYmVsLmM6MzIxIGxhYmVsL2xhYmVsLmM6MzI5IGxhYmVsL2xhYmVsLmM6MzQxIGxhYmVsL2xhYmVsLmM6MzYwCisjOiBsYWJlbC9sYWJlbC5jOjM2NCBsYWJlbC9sYWJlbC5jOjM3MCBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjg1CisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjQyMCBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjQzMgorIzogbG9ja2luZy9jbHVzdGVyX2xvY2tpbmcuYzo0MzYgbG9ja2luZy9leHRlcm5hbF9sb2NraW5nLmM6NzcgbHZjaGFuZ2UuYzo1NworIzogbHZjaGFuZ2UuYzo5OSBsdmNoYW5nZS5jOjExNiBsdmNoYW5nZS5jOjEyMiBsdmNoYW5nZS5jOjEzNiBsdmNoYW5nZS5jOjE0MworIzogbHZjaGFuZ2UuYzoxNTAgbHZjaGFuZ2UuYzoyNjggbHZjaGFuZ2UuYzoyODIgbHZjaGFuZ2UuYzozNTMgbHZjaGFuZ2UuYzozNjEKKyM6IGx2Y2hhbmdlLmM6Mzk1IGx2Y2hhbmdlLmM6NDcyIGx2Y2hhbmdlLmM6NDc5IGx2Y2hhbmdlLmM6NTI2IGx2Y2hhbmdlLmM6NTM0CisjOiBsdmNvbnZlcnQuYzo5NiBsdmNvbnZlcnQuYzoxNDcgbHZjb252ZXJ0LmM6MjExIGx2Y29udmVydC5jOjIyMgorIzogbHZjb252ZXJ0LmM6MjczIGx2Y29udmVydC5jOjI4NSBsdmNvbnZlcnQuYzoyOTggbHZjb252ZXJ0LmM6MzMyCisjOiBsdmNvbnZlcnQuYzozNTQgbHZjb252ZXJ0LmM6MzY5IGx2Y29udmVydC5jOjM3OCBsdmNvbnZlcnQuYzozOTcKKyM6IGx2Y29udmVydC5jOjQwNCBsdmNvbnZlcnQuYzo0NzAgbHZjb252ZXJ0LmM6NDgxIGx2Y29udmVydC5jOjU0NAorIzogbHZjb252ZXJ0LmM6NTg1IGx2Y3JlYXRlLmM6MTMzIGx2Y3JlYXRlLmM6MzQ5IGx2Y3JlYXRlLmM6MzczIGx2Y3JlYXRlLmM6Mzk5CisjOiBsdmNyZWF0ZS5jOjUyOSBsdmNyZWF0ZS5jOjY2MSBsdmNyZWF0ZS5jOjY5OCBsdmNyZWF0ZS5jOjcyOCBsdmNyZWF0ZS5jOjc1NQorIzogbHZjcmVhdGUuYzo3NjMgbHZjcmVhdGUuYzo3NjkgbHZjcmVhdGUuYzo3NzYgbHZjcmVhdGUuYzo4NjgKKyM6IGx2bWNtZGxpbmUuYzo4MzAgbHZtY21kbGluZS5jOjgzNiBsdm1jbWRsaW5lLmM6ODM5IGx2bWNtZGxpbmUuYzo4NDIKKyM6IGx2bWNtZGxpbmUuYzo4NDYgbHZtY21kbGluZS5jOjg1MyBsdm1jbWRsaW5lLmM6ODg1IGx2bWNtZGxpbmUuYzo4OTYKKyM6IGx2bWNtZGxpbmUuYzo5MDYgbHZtY21kbGluZS5jOjkzNiBsdm1jbWRsaW5lLmM6MTAyMiBsdnJlbW92ZS5jOjk5CisjOiBsdnJlbmFtZS5jOjg1IGx2cmVuYW1lLmM6MTY0IGx2cmVuYW1lLmM6MTc1IGx2cmVuYW1lLmM6MTgyIGx2cmVuYW1lLmM6MTg4CisjOiBsdnJlc2l6ZS5jOjQ2NiBsdnJlc2l6ZS5jOjUyMiBsdnJlc2l6ZS5jOjUyOSBsdnJlc2l6ZS5jOjUzNiBsdnJlc2l6ZS5jOjU0NworIzogbHZyZXNpemUuYzo1NTQgbHZyZXNpemUuYzo1NjAgbHZyZXNpemUuYzo1NzkgbHZyZXNpemUuYzo1OTMgbHZyZXNpemUuYzo2MTgKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6ODUgbWV0YWRhdGEvbHZfbWFuaXAuYzo5MSBtZXRhZGF0YS9sdl9tYW5pcC5jOjE5MgorIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoyMjcgbWV0YWRhdGEvbHZfbWFuaXAuYzoyNTggbWV0YWRhdGEvbHZfbWFuaXAuYzozMTYKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MzI1IG1ldGFkYXRhL2x2X21hbmlwLmM6MzQwIG1ldGFkYXRhL2x2X21hbmlwLmM6MzQ5CisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjM3OSBtZXRhZGF0YS9sdl9tYW5pcC5jOjU4MCBtZXRhZGF0YS9sdl9tYW5pcC5jOjU4OAorIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo2MjMgbWV0YWRhdGEvbHZfbWFuaXAuYzo3MzUgbWV0YWRhdGEvbHZfbWFuaXAuYzo3MzgKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6NzQ4IG1ldGFkYXRhL2x2X21hbmlwLmM6ODQ2IG1ldGFkYXRhL2x2X21hbmlwLmM6ODc0CisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEwNDggbWV0YWRhdGEvbHZfbWFuaXAuYzoxMDk1IG1ldGFkYXRhL2x2X21hbmlwLmM6MTEwMAorIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMTMwIG1ldGFkYXRhL2x2X21hbmlwLmM6MTIyMSBtZXRhZGF0YS9sdl9tYW5pcC5jOjEyMjgKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTI2NSBtZXRhZGF0YS9sdl9tYW5pcC5jOjEyNzcgbWV0YWRhdGEvbHZfbWFuaXAuYzoxMzA2CisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzMTYgbWV0YWRhdGEvbHZfbWFuaXAuYzoxMzY0IG1ldGFkYXRhL2x2X21hbmlwLmM6MTQyOQorIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxNDM2IG1ldGFkYXRhL2x2X21hbmlwLmM6MTU0OCBtZXRhZGF0YS9sdl9tYW5pcC5jOjE2MTkKKyM6IG1ldGFkYXRhL21lcmdlLmM6MjUzIG1ldGFkYXRhL21lcmdlLmM6MjkyIG1ldGFkYXRhL21lcmdlLmM6Mjk3CisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjExOSBtZXRhZGF0YS9tZXRhZGF0YS5jOjE1NCBtZXRhZGF0YS9tZXRhZGF0YS5jOjE4MgorIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoyNTIgbWV0YWRhdGEvbWV0YWRhdGEuYzoyNzYgbWV0YWRhdGEvbWV0YWRhdGEuYzoyODQKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MzIyIG1ldGFkYXRhL21ldGFkYXRhLmM6MzcyIG1ldGFkYXRhL21ldGFkYXRhLmM6Mzc4CisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjM4NCBtZXRhZGF0YS9tZXRhZGF0YS5jOjM5NSBtZXRhZGF0YS9tZXRhZGF0YS5jOjQwMQorIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo0MTMgbWV0YWRhdGEvbWV0YWRhdGEuYzo0MTkgbWV0YWRhdGEvbWV0YWRhdGEuYzo0MzEKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NDM5IG1ldGFkYXRhL21ldGFkYXRhLmM6NDQ2IG1ldGFkYXRhL21ldGFkYXRhLmM6NDUzCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjQ2MCBtZXRhZGF0YS9tZXRhZGF0YS5jOjQ3MyBtZXRhZGF0YS9tZXRhZGF0YS5jOjQ4MQorIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo0OTAgbWV0YWRhdGEvbWV0YWRhdGEuYzo1NDkgbWV0YWRhdGEvbWV0YWRhdGEuYzo1NjQKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NzU0IG1ldGFkYXRhL21ldGFkYXRhLmM6Nzc5IG1ldGFkYXRhL21ldGFkYXRhLmM6ODE1CisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjg0NiBtZXRhZGF0YS9tZXRhZGF0YS5jOjg3NCBtZXRhZGF0YS9tZXRhZGF0YS5jOjg4MAorIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo4ODcgbWV0YWRhdGEvbWV0YWRhdGEuYzo4OTggbWV0YWRhdGEvbWV0YWRhdGEuYzo5MDMKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6OTI1IG1ldGFkYXRhL21ldGFkYXRhLmM6OTQ3IG1ldGFkYXRhL21ldGFkYXRhLmM6OTY0CisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEwNjMgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMDY4IG1ldGFkYXRhL21ldGFkYXRhLmM6MTA3OQorIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMTM3IG1ldGFkYXRhL21ldGFkYXRhLmM6MTE0MiBtZXRhZGF0YS9tZXRhZGF0YS5jOjExNjgKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTE4MyBtZXRhZGF0YS9tZXRhZGF0YS5jOjExOTEgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMjQ2CisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEyNTAgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMzk5IG1ldGFkYXRhL21ldGFkYXRhLmM6MTQzMworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNDkwIG1ldGFkYXRhL21ldGFkYXRhLmM6MTQ5NCBtZXRhZGF0YS9tZXRhZGF0YS5jOjE1MjcKKyM6IG1ldGFkYXRhL21pcnJvci5jOjEwNiBtZXRhZGF0YS9taXJyb3IuYzoxMDkgbWV0YWRhdGEvbWlycm9yLmM6MTEyCisjOiBtZXRhZGF0YS9taXJyb3IuYzoyMDUgbWV0YWRhdGEvbWlycm9yLmM6NDg0IG1ldGFkYXRhL21pcnJvci5jOjUyNgorIzogbWV0YWRhdGEvbWlycm9yLmM6NTYwIG1ldGFkYXRhL21pcnJvci5jOjU5OSBtZXRhZGF0YS9taXJyb3IuYzo2MDgKKyM6IG1ldGFkYXRhL21pcnJvci5jOjczNiBtZXRhZGF0YS9taXJyb3IuYzo3NTcgbWV0YWRhdGEvbWlycm9yLmM6NzYyCisjOiBtZXRhZGF0YS9taXJyb3IuYzo4MzYgbWV0YWRhdGEvcHZfbWFuaXAuYzo1NCBtZXRhZGF0YS9wdl9tYW5pcC5jOjczCisjOiBtZXRhZGF0YS9wdl9tYW5pcC5jOjk0IG1ldGFkYXRhL3B2X21hbmlwLmM6MTMxIG1ldGFkYXRhL3B2X21hbmlwLmM6MTU2CisjOiBtZXRhZGF0YS9wdl9tYW5pcC5jOjE5NyBtZXRhZGF0YS9wdl9tYW5pcC5jOjMzMiBtZXRhZGF0YS9wdl9tYXAuYzo0NAorIzogbWV0YWRhdGEvcHZfbWFwLmM6OTIgbWV0YWRhdGEvcHZfbWFwLmM6MTEyIG1ldGFkYXRhL3B2X21hcC5jOjEyMgorIzogbWV0YWRhdGEvcHZfbWFwLmM6MTQ5IG1ldGFkYXRhL3B2X21hcC5jOjE1OSBtZXRhZGF0YS9zbmFwc2hvdF9tYW5pcC5jOjcwCisjOiBtZXRhZGF0YS9zbmFwc2hvdF9tYW5pcC5jOjc3IG1pcnJvci9taXJyb3JlZC5jOjE0NCBtaXJyb3IvbWlycm9yZWQuYzoxNDkKKyM6IG1pcnJvci9taXJyb3JlZC5jOjE1MSBtaXJyb3IvbWlycm9yZWQuYzozMDQgbWlycm9yL21pcnJvcmVkLmM6MzI4CisjOiBtaXJyb3IvbWlycm9yZWQuYzozMzEgbWlycm9yL21pcnJvcmVkLmM6NTAxIG1pcnJvci9taXJyb3JlZC5jOjU1MgorIzogbWlzYy9sdm0tZmlsZS5jOjI5MSBtaXNjL3RpbWVzdGFtcC5jOjQ0IHB2Y2hhbmdlLmM6MTkxIHB2bW92ZS5jOjEwMgorIzogcHZtb3ZlLmM6MTA3IHB2bW92ZS5jOjE5MiBwdm1vdmUuYzoyMjAgcHZtb3ZlLmM6MjI3IHB2bW92ZS5jOjI5MgorIzogcHZtb3ZlLmM6Mjk5IHB2bW92ZS5jOjMwOCBwdm1vdmUuYzozMzcgcHZtb3ZlLmM6MzQ5IHB2bW92ZS5jOjM1NgorIzogcHZtb3ZlLmM6MzYzIHB2bW92ZS5jOjM3MSBwdm1vdmUuYzozODMgcHZtb3ZlLmM6NTI0IHB2cmVzaXplLmM6MTY1CisjOiBwdnNjYW4uYzo1NSByZXBvcnQvcmVwb3J0LmM6MTg3IHJlcG9ydC9yZXBvcnQuYzo1MTMgcmVwb3J0L3JlcG9ydC5jOjU0MworIzogcmVwb3J0L3JlcG9ydC5jOjY5OSByZXBvcnRlci5jOjI4OSBzbmFwc2hvdC9zbmFwc2hvdC5jOjc0CisjOiBzbmFwc2hvdC9zbmFwc2hvdC5jOjgzIHNuYXBzaG90L3NuYXBzaG90LmM6ODQgc25hcHNob3Qvc25hcHNob3QuYzo4NQorIzogc25hcHNob3Qvc25hcHNob3QuYzoxNjkgc3RyaXBlZC9zdHJpcGVkLmM6ODkgc3RyaXBlZC9zdHJpcGVkLmM6MTY5CisjOiBzdHJpcGVkL3N0cmlwZWQuYzoxNzIgc3RyaXBlZC9zdHJpcGVkLmM6MjE2IHRvb2xsaWIuYzo5MTIgdG9vbGxpYi5jOjk2MgorIzogdG9vbGxpYi5jOjEwMjAgdG9vbGxpYi5jOjEwNjAgdG9vbGxpYi5jOjEwODUgdG9vbGxpYi5jOjExOTQgdG9vbGxpYi5jOjEzMzIKKyM6IHRvb2xsaWIuYzoxMzM3IHRvb2xsaWIuYzoxMzUwIHRvb2xsaWIuYzoxMzU3IHV1aWQvdXVpZC5jOjkwIHV1aWQvdXVpZC5jOjk0CisjOiB2Z2NmZ2JhY2t1cC5jOjY5IHZnY2ZnYmFja3VwLmM6NzggdmdjZmdiYWNrdXAuYzo4NSB2Z2NoYW5nZS5jOjQyMAorIzogdmdtZXJnZS5jOjE5MyB2Z3JlZHVjZS5jOjI5IHZncmVkdWNlLmM6OTYgdmdyZWR1Y2UuYzoxMDIgdmdyZWR1Y2UuYzoxMjQKKyM6IHZncmVkdWNlLmM6MTMwIHZncmVkdWNlLmM6MTQ4IHZncmVkdWNlLmM6MTk2IHZncmVkdWNlLmM6MjE3IHZncmVkdWNlLmM6MjQxCisjOiB2Z3JlZHVjZS5jOjMwNyB2Z3JlZHVjZS5jOjM1MyB6ZXJvL3plcm8uYzo5OQorbXNnaWQgIjxiYWNrdHJhY2U+IgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6ODEKK21zZ2lkICJzbmFwX3NlZyBtb2R1bGUgc3RyaW5nIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6MjQ1Cittc2dpZCAiQWN0aXZhdGlvbiBlbmFibGVkLiBEZXZpY2UtbWFwcGVyIGtlcm5lbCBkcml2ZXIgd2lsbCBiZSB1c2VkLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjI0OAorbXNnaWQgIiIKKyJXQVJOSU5HOiBBY3RpdmF0aW9uIGRpc2FibGVkLiBObyBkZXZpY2UtbWFwcGVyIGludGVyYWN0aW9uIHdpbGwgYmUgYXR0ZW1wdGVkLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjI4MQorbXNnaWQgIklnbm9yaW5nIGludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlIGFjdGl2YXRpb24vdm9sdW1lX2xpc3QiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzoyODcKK21zZ2lkICJJZ25vcmluZyBlbXB0eSBzdHJpbmcgaW4gY29uZmlnIGZpbGUgYWN0aXZhdGlvbi92b2x1bWVfbGlzdCIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjI5NgorbXNnaWQgIklnbm9yaW5nIGVtcHR5IHRhZyBpbiBjb25maWcgZmlsZSBhY3RpdmF0aW9uL3ZvbHVtZV9saXN0IgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6MzI2CisjLCBjLWZvcm1hdAorbXNnaWQgImRtX3NucHJpbnRmIGVycm9yIGZyb20gJXMvJXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzozNTAKK21zZ2lkICJHZXR0aW5nIGRyaXZlciB2ZXJzaW9uIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkdldHRpbmcgdGFyZ2V0IHZlcnNpb24gZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6MzY3CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgJXMgdGFyZ2V0IHZlcnNpb24iCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo0MTEKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFyZ2V0X3ByZXNlbnQgbW9kdWxlIG5hbWUgdG9vIGxvbmc6ICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NDQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkdldHRpbmcgZGV2aWNlIGluZm8gZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6NzcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNraXBwaW5nOiBTdXNwZW5kaW5nICclcycuIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6ODMxCisjLCBjLWZvcm1hdAorbXNnaWQgIlNraXBwaW5nOiBSZXN1bWluZyAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjg3NworIywgYy1mb3JtYXQKK21zZ2lkICJTa2lwcGluZzogRGVhY3RpdmF0aW5nICclcycuIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2FjdGl2YXRlLmM6ODg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzLyVzIGluIHVzZTogbm90IGRlYWN0aXZhdGluZyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjkxNyBhY3RpdmF0ZS9hY3RpdmF0ZS5jOjk0MgorIywgYy1mb3JtYXQKK21zZ2lkICJOb3QgYWN0aXZhdGluZyAlcy8lcyBkdWUgdG8gY29uZmlnIGZpbGUgc2V0dGluZ3MiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvYWN0aXZhdGUuYzo5NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2tpcHBpbmc6IEFjdGl2YXRpbmcgJyVzJy4iCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJfYnVpbGRfZGxpZDogcG9vbCBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgJXp1ICVzICVzLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEzNiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjI1NQorIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzozNDQKK21zZ2lkICJGYWlsZWQgdG8gZGlzYWJsZSBvcGVuX2NvdW50IgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTYzCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRtX3Rhc2sgc3RydWN0IHRvIGNoZWNrIGRldiBzdGF0dXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzoxNzEKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHN0YXRlIG9mIG1hcHBlZCBkZXZpY2UiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzoyMjkgYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo1MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiZGxpZCBidWlsZCBmYWlsZWQgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MzYwIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6Mzg0CisjLCBjLWZvcm1hdAorbXNnaWQgIk51bWJlciBvZiBzZWdtZW50cyBpbiBhY3RpdmUgTFYgJXMgZG9lcyBub3QgbWF0Y2ggbWV0YWRhdGEiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzozOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgcGVyY2VudDogJWYiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiR2V0dGluZyBkZXZpY2Ugc3RhdHVzIHBlcmNlbnRhZ2UgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkdldHRpbmcgZGV2aWNlIG1pcnJvciBzdGF0dXMgcGVyY2VudGFnZSBmb3IgJXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiR2V0dGluZyBkZXZpY2UgaW5mbyBmb3IgJXMgWyVzXSIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjYzNQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGluZm8gZm9yICVzIFslc10uIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6NjQwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBhZGQgZGV2aWNlICgldToldSkgdG8gZHRyZWUiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo2NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGFydGlhbCBkdHJlZSBjcmVhdGlvbiBmYWlsZWQgZm9yICVzLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjc0MQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvcjogVW5hc3NpZ25lZCBhcmVhIGZvdW5kIGluIExWICVzLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjc3NQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBmaW5kIHNuYXBzaG90IGZvciAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjgwMAorIywgYy1mb3JtYXQKK21zZ2lkICJfZW1pdF90YXJnZXQ6IEludGVybmFsIGVycm9yOiBDYW4ndCBoYW5kbGUgc2VnbWVudCB0eXBlICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6ODI4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoZWNraW5nIGtlcm5lbCBzdXBwb3J0cyAlcyBzZWdtZW50IHR5cGUgZm9yICVzJXMlcyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjgzNAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBleHBhbmQgTFYgJXM6ICVzIHRhcmdldCBzdXBwb3J0IG1pc3NpbmcgZnJvbSBrZXJuZWw/IgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6ODQ3Cittc2dpZCAiQ2x1c3RlcmVkIHNuYXBzaG90cyBhcmUgbm90IHlldCBzdXBwb3J0ZWQiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo5MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiX2FkZF9uZXdfbHZfdG9fZHRyZWU6IHBvb2wgYWxsb2MgZmFpbGVkIGZvciAlcyAlcy4iCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzo5NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiX2NyZWF0ZV9sdl9zeW1saW5rczogQ291bGRuJ3Qgc3BsaXQgdXAgb2xkIGRldmljZSBuYW1lICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6OTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIl9jbGVhbl90cmVlOiBDb3VsZG4ndCBzcGxpdCB1cCBkZXZpY2UgbmFtZSAlcy4iCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZGV2X21hbmFnZXIuYzoxMDEzIGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTEzMworbXNnaWQgIkxvc3QgZGVwZW5kZW5jeSB0cmVlIHJvb3Qgbm9kZSIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjEwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSBzeW1saW5rcyBmb3IgJXMuIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2Rldl9tYW5hZ2VyLmM6MTA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJfdHJlZV9hY3Rpb246IEFjdGlvbiAldSBub3Qgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjExMTkKK21zZ2lkICJwYXJ0aWFsIGR0cmVlIGNyZWF0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9kZXZfbWFuYWdlci5jOjExMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGFkZCBkZXZpY2UgJXMgKCV1OiV1KSB0byBkdHJlZSIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjM1IGFjdGl2YXRlL2ZzLmM6NTgKK21zZ2lkICJDb3VsZG4ndCBjb25zdHJ1Y3QgbmFtZSBvZiB2b2x1bWUgZ3JvdXAgZGlyZWN0b3J5LiIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNyZWF0aW5nIGRpcmVjdG9yeSAlcyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjQ1IGFjdGl2YXRlL2ZzLmM6ODAgYWN0aXZhdGUvZnMuYzoxMDAgYWN0aXZhdGUvZnMuYzoxNTMKKyM6IGFjdGl2YXRlL2ZzLmM6MTY2IGFjdGl2YXRlL2ZzLmM6MTczIGFjdGl2YXRlL2ZzLmM6MjA4CisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjM0MiBjb21tYW5kcy90b29sY29udGV4dC5jOjgyMCBjb25maWcvY29uZmlnLmM6MjA5CisjOiBjb25maWcvY29uZmlnLmM6MjQ3IGNvbmZpZy9jb25maWcuYzoyNjIgY29uZmlnL2NvbmZpZy5jOjMyOAorIzogY29uZmlnL2NvbmZpZy5jOjQyOCBjb25maWcvY29uZmlnLmM6NDUyIGRldmljZS9kZXYtY2FjaGUuYzoyMDgKKyM6IGRldmljZS9kZXYtY2FjaGUuYzoyMTIgZGV2aWNlL2Rldi1jYWNoZS5jOjM5NCBkZXZpY2UvZGV2LWNhY2hlLmM6NDE3CisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NDI0IGRldmljZS9kZXYtY2FjaGUuYzo2ODEgZGV2aWNlL2Rldi1jYWNoZS5jOjY4MworIzogZGV2aWNlL2Rldi1pby5jOjEzMSBkZXZpY2UvZGV2LWlvLmM6MjMxIGRldmljZS9kZXYtaW8uYzoyNDkKKyM6IGRldmljZS9kZXYtaW8uYzoyNTQgZGV2aWNlL2Rldi1pby5jOjI1NiBkZXZpY2UvZGV2LWlvLmM6MjYyCisjOiBkZXZpY2UvZGV2LWlvLmM6Mzk2IGRldmljZS9kZXYtaW8uYzozOTggZGV2aWNlL2Rldi1pby5jOjQ4MQorIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjIwMyBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MjA3CisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MjMwIGZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYzoyNDMKKyM6IGZpbHRlcnMvZmlsdGVyLXN5c2ZzLmM6NDIgZmlsdGVycy9maWx0ZXItc3lzZnMuYzo1OAorIzogZmlsdGVycy9maWx0ZXItc3lzZnMuYzoxNTYgZmlsdGVycy9maWx0ZXItc3lzZnMuYzoxNjMKKyM6IGZpbHRlcnMvZmlsdGVyLXN5c2ZzLmM6MTgyIGZpbHRlcnMvZmlsdGVyLXN5c2ZzLmM6MjI1IGZpbHRlcnMvZmlsdGVyLmM6MTY0CisjOiBmaWx0ZXJzL2ZpbHRlci5jOjIyMSBmaWx0ZXJzL2ZpbHRlci5jOjIzMiBmaWx0ZXJzL2ZpbHRlci5jOjI0MAorIzogZmlsdGVycy9maWx0ZXIuYzoyNTMgZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjIxNCBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MjIzCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MjUzIGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoyNjAKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoyNjUgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo4NzMKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6ODc1IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6ODg0CisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjg4OSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjg5MQorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo4OTYgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo5MjEKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6OTgzIGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6OTg4CisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEwMTMgZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxMDQwCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjYxIGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6NjkKKyM6IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6NzIgbG9ja2luZy9maWxlX2xvY2tpbmcuYzoxMDUKKyM6IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6MTY3IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6MTcxCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjE4NyBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjI5NgorIzogbG9ja2luZy9maWxlX2xvY2tpbmcuYzozMDEgbG9ja2luZy9sb2NraW5nLmM6NDUgbG9ja2luZy9sb2NraW5nLmM6NTAKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjY2IGxvY2tpbmcvbG9ja2luZy5jOjIyMSBsb2cvbG9nLmM6NjkgbHZtY21kbGluZS5jOjEwOTIKKyM6IGx2bWNtZGxpbmUuYzoxMTMwIG1pc2MvbHZtLWV4ZWMuYzo0MiBtaXNjL2x2bS1maWxlLmM6NDcgbWlzYy9sdm0tZmlsZS5jOjcwCisjOiBtaXNjL2x2bS1maWxlLmM6OTcgbWlzYy9sdm0tZmlsZS5jOjEwNyBtaXNjL2x2bS1maWxlLmM6MTU3CisjOiBtaXNjL2x2bS1maWxlLmM6MTcwIG1pc2MvbHZtLWZpbGUuYzoxOTkgbWlzYy9sdm0tZmlsZS5jOjIwOAorIzogbWlzYy9sdm0tZmlsZS5jOjIzNiBtaXNjL2x2bS1maWxlLmM6MjQxIG1pc2MvbHZtLWZpbGUuYzoyNDQKKyM6IG1pc2MvbHZtLWZpbGUuYzoyODkgbWlzYy9sdm0tZmlsZS5jOjI5NyBtaXNjL3RpbWVzdGFtcC5jOjQ3IG1tL21lbWxvY2suYzo5NworIzogbW0vbWVtbG9jay5jOjEwNSBtbS9tZW1sb2NrLmM6MTE2IHV1aWQvdXVpZC5jOjgzIHV1aWQvdXVpZC5jOjg4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlcyBmYWlsZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVtb3ZpbmcgZGlyZWN0b3J5ICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHBhdGggZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6OTggYWN0aXZhdGUvZnMuYzoxNTEgYWN0aXZhdGUvZnMuYzoxNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVtb3ZpbmcgJXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZnMuYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHBhdGggZm9yIHZvbHVtZSBncm91cCBkaXIgJXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZnMuYzoxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHNvdXJjZSBwYXRobmFtZSBmb3IgbG9naWNhbCB2b2x1bWUgbGluayAlcyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgZGVzdGluYXRpb24gcGF0aG5hbWUgZm9yIGxvZ2ljYWwgdm9sdW1lIGxpbmsgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6MTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSBwYXRobmFtZSBmb3IgTFZNMSBncm91cCBmaWxlIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOb24tTFZNMSBjaGFyYWN0ZXIgZGV2aWNlIGZvdW5kIGF0ICVzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6MTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5bWJvbGljIGxpbmsgJXMgbm90IGNyZWF0ZWQ6IGZpbGUgZXhpc3RzIgorbXNnc3RyICIiCisKKyM6IGFjdGl2YXRlL2ZzLmM6MTcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkxpbmtpbmcgJXMgLT4gJXMiCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZnMuYzoxOTUKK21zZ2lkICJDb3VsZG4ndCBkZXRlcm1pbmUgbGluayBwYXRobmFtZS4iCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZnMuYzoyMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgbm90IHN5bWJvbGljIGxpbmsgLSBub3QgcmVtb3ZpbmciCittc2dzdHIgIiIKKworIzogYWN0aXZhdGUvZnMuYzoyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVtb3ZpbmcgbGluayAlcyIKK21zZ3N0ciAiIgorCisjOiBhY3RpdmF0ZS9mcy5jOjI4MgorbXNnaWQgIk5vIHNwYWNlIHRvIHN0YWNrIGZzIG9wZXJhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjQwIGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6NTMKK21zZ2lkICJDb3VsZG4ndCBjb3B5IGFyY2hpdmUgZGlyZWN0b3J5IG5hbWUuIgorbXNnc3RyICIiCisKKyM6IGFyY2hpdmVyLmM6MTAyIGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6MTE2Cittc2dpZCAiVGVzdCBtb2RlOiBTa2lwcGluZyBhcmNoaXZpbmcgb2Ygdm9sdW1lIGdyb3VwLiIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjEwOQorIywgYy1mb3JtYXQKK21zZ2lkICJBcmNoaXZpbmcgdm9sdW1lIGdyb3VwIFwiJXNcIiBtZXRhZGF0YS4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoxMTEgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBtZXRhZGF0YSBhcmNoaXZlIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoxMzggZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxNjQKK21zZ2lkICJDb3VsZG4ndCBjb3B5IGJhY2t1cCBkaXJlY3RvcnkgbmFtZS4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoxNjkgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxOTUKK21zZ2lkICJGYWlsZWQgdG8gZ2VuZXJhdGUgdm9sdW1lIGdyb3VwIG1ldGFkYXRhIGJhY2t1cCBmaWxlbmFtZS4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoxODAgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoyMDYKK21zZ2lkICJXQVJOSU5HOiBUaGlzIG1ldGFkYXRhIHVwZGF0ZSBpcyBOT1QgYmFja2VkIHVwIgorbXNnc3RyICIiCisKKyM6IGFyY2hpdmVyLmM6MTg1IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6MjExCittc2dpZCAiVGVzdCBtb2RlOiBTa2lwcGluZyB2b2x1bWUgZ3JvdXAgYmFja3VwLiIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjE5MyBmb3JtYXRfdGV4dC9hcmNoaXZlci5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICJCYWNrdXAgb2Ygdm9sdW1lIGdyb3VwICVzIG1ldGFkYXRhIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoyMDcgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoyMzgKK21zZ2lkICJGYWlsZWQgdG8gZ2VuZXJhdGUgYmFja3VwIGZpbGVuYW1lIChmb3IgcmVtb3ZhbCkuIgorbXNnc3RyICIiCisKKyM6IGFyY2hpdmVyLmM6MjMwIGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6MjYxCittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHRleHQgZm9ybWF0IG9iamVjdC4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzoyNTkgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoyOTAKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgZm9ybWF0IGluc3RhbmNlIgorbXNnc3RyICIiCisKKyM6IGFyY2hpdmVyLmM6MjY3IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6Mjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWICVzIG1pc3NpbmcgZnJvbSBjYWNoZSIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjI3MgorIywgYy1mb3JtYXQKK21zZ2lkICJQViAlcyBpcyBhIGRpZmZlcmVudCBmb3JtYXQgKCVzKSIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjI3OSBmb3JtYXRfdGV4dC9hcmNoaXZlci5jOjMxMAorIywgYy1mb3JtYXQKK21zZ2lkICJGb3JtYXQtc3BlY2lmaWMgc2V0dXAgZm9yICVzIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBhcmNoaXZlci5jOjMxNiBmb3JtYXRfdGV4dC9hcmNoaXZlci5jOjM0NworbXNnaWQgIkZhaWxlZCB0byBnZW5lcmF0ZSBiYWNrdXAgZmlsZW5hbWUgKGZvciByZXN0b3JlKS4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzozMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgdm9sdW1lIGdyb3VwIGJhY2t1cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogYXJjaGl2ZXIuYzozMzggZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzozNjkKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgYmFja3VwIG9iamVjdC4iCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo1NiBjYWNoZS9sdm1jYWNoZS5jOjIzNSBjYWNoZS9sdm1jYWNoZS5jOjc0MAorbXNnaWQgIkludGVybmFsIGNhY2hlIGluaXRpYWxpc2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhY2hlIGxvY2tpbmcgZmFpbHVyZSBmb3IgJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzoxMjcKK21zZ2lkICJkZXZpY2VfbGlzdCBlbGVtZW50IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6MjQ1IHRvb2xsaWIuYzo2MzgKK21zZ2lkICJkZXZfaXRlciBjcmVhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzoyNzgKK21zZ2lkICJ2Z2lkcyBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6Mjg1IGNhY2hlL2x2bWNhY2hlLmM6MzA4IGNhY2hlL2x2bWNhY2hlLmM6MzM0CisjOiB0b29sbGliLmM6MjcxIHRvb2xsaWIuYzozMDYgdG9vbGxpYi5jOjMxNCB0b29sbGliLmM6MzI2IHRvb2xsaWIuYzo0MDUKKyM6IHRvb2xsaWIuYzo1NDcgdG9vbGxpYi5jOjU2MSB0b29sbGliLmM6Njk4Cittc2dpZCAic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjMwMQorbXNnaWQgInZnbmFtZXMgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjMyNAorbXNnaWQgInB2aWRzIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzozOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAidmcgaGFzaCByZS1pbnNlcnRpb24gZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjQ0MAorIywgYy1mb3JtYXQKK21zZ2lkICJfbHZtY2FjaGVfdXBkYXRlOiBwdmlkIGluc2VydGlvbiBmYWlsZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NDU2CisjLCBjLWZvcm1hdAorbXNnaWQgImx2bWNhY2hlOiAlczogY2xlYXJpbmcgVkdJRCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjQ2MworIywgYy1mb3JtYXQKK21zZ2lkICJfbHZtY2FjaGVfdXBkYXRlOiB2Z2lkIGhhc2ggaW5zZXJ0aW9uIGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo0NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAibHZtY2FjaGU6ICVzOiBzZXR0aW5nICVzIFZHSUQgdG8gJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo1MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIldBUk5JTkc6IER1cGxpY2F0ZSBWRyBuYW1lICVzOiBFeGlzdGluZyAlcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwb3J0ZWQgJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogRHVwbGljYXRlIFZHIG5hbWUgJXM6ICVzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBleHBvcnRlZCAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjUxNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiV0FSTklORzogRHVwbGljYXRlIFZHIG5hbWUgJXM6IEV4aXN0aW5nICVzIChjcmVhdGVkIGhlcmUpIHRha2VzIHByZWNlZGVuY2UgIgorIm92ZXIgJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo1MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIldBUk5JTkc6IER1cGxpY2F0ZSBWRyBuYW1lICVzOiAlcyAod2l0aCBjcmVhdGlvbl9ob3N0KSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgIgorIiVzIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXQVJOSU5HOiBEdXBsaWNhdGUgVkcgbmFtZSAlczogJXMgKGNyZWF0ZWQgaGVyZSkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyICVzIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgImNhY2hlX3VwZGF0ZTogdmcgaGFzaCBpbnNlcnRpb24gZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjYxOQorbXNnaWQgImx2bWNhY2hlX3VwZGF0ZV92Z25hbWU6IGxpc3QgYWxsb2MgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NjI1CisjLCBjLWZvcm1hdAorbXNnaWQgImNhY2hlIHZnbmFtZSBhbGxvYyBmYWlsZWQgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NjUyCisjLCBjLWZvcm1hdAorbXNnaWQgImx2bWNhY2hlOiAlczogbm93ICVzJXMlcyVzJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo2NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAibHZtY2FjaGU6ICVzOiBWRyAlcyAlcyBleHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjY4NQorIywgYy1mb3JtYXQKK21zZ2lkICJjYWNoZSBjcmVhdGlvbiBob3N0IGFsbG9jIGZhaWxlZCBmb3IgJXMiCittc2dzdHIgIiIKKworIzogY2FjaGUvbHZtY2FjaGUuYzo2OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAibHZtY2FjaGU6ICVzOiBWRyAlczogU2V0IGNyZWF0aW9uIGhvc3QgdG8gJXMuIgorbXNnc3RyICIiCisKKyM6IGNhY2hlL2x2bWNhY2hlLmM6NzU0Cittc2dpZCAibHZtY2FjaGVfaW5mbyBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjc2OQorIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyBkdXBsaWNhdGUgUFYgJXMgb24gJXMgLSB1c2luZyBtZCAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjc3NgorIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyBkdXBsaWNhdGUgUFYgJXMgb24gJXMgLSB1c2luZyBkbSAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjc4MworIywgYy1mb3JtYXQKK21zZ2lkICJEdXBsaWNhdGUgUFYgJXMgb24gJXMgLSB1c2luZyBtZCAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjc4OQorIywgYy1mb3JtYXQKK21zZ2lkICJEdXBsaWNhdGUgUFYgJXMgb24gJXMgLSB1c2luZyBkbSAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjc5OAorIywgYy1mb3JtYXQKK21zZ2lkICJGb3VuZCBkdXBsaWNhdGUgUFYgJXM6IHVzaW5nICVzIG5vdCAlcyIKK21zZ3N0ciAiIgorCisjOiBjYWNoZS9sdm1jYWNoZS5jOjg3MgorbXNnaWQgIldpcGluZyBpbnRlcm5hbCBWRyBjYWNoZSIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjcwCittc2dpZCAiTFZNX1NZU1RFTV9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdG9vIGxvbmcuIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2dpbmcgaW5pdGlhbGlzZWQgYXQgJXMiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzoxNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0IHVtYXNrIHRvICUwNG8iCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzoxNzEgY29tbWFuZHMvdG9vbGNvbnRleHQuYzoxODIKK21zZ2lkICJEZXZpY2UgZGlyZWN0b3J5IGdpdmVuIGluIGNvbmZpZyBmaWxlIHRvbyBsb25nIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6MTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IHByb2MgZGlyICVzIG5vdCBmb3VuZCAtIHNvbWUgY2hlY2tzIHdpbGwgYmUgYnlwYXNzZWQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzoyMDcgbHZtY21kbGluZS5jOjcyMworbXNnaWQgIkludmFsaWQgdW5pdHMgc3BlY2lmaWNhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjIxNgorIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGhvc3QgdGFnOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjIxOQorIywgYy1mb3JtYXQKK21zZ2lkICJfc2V0X3RhZzogc3RyX2xpc3RfYWRkICVzIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjI0MworIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGhvc3RuYW1lIHN0cmluZyBmb3IgdGFnICVzIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6MjU0Cittc2dpZCAiaG9zdF9maWx0ZXIgbm90IHN1cHBvcnRlZCB5ZXQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzoyODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCB0YWcgaW4gY29uZmlnIGZpbGU6ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6MzIyCittc2dpZCAiTFZNX1NZU1RFTV9ESVIgb3IgdGFnIHdhcyB0b28gbG9uZyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjMyNworbXNnaWQgImNvbmZpZ190cmVlX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzozMzIKK21zZ2lkICJjb25maWdfdHJlZSBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGNvbmZpZyBmaWxlOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjM0OQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZSAlcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjM3MiBjb21tYW5kcy90b29sY29udGV4dC5jOjQxMAorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgY29uZmlnIHRyZWUiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo0NzMKK21zZ2lkICJGYWlsZWQgdG8gYWRkIC9kZXYgdG8gaW50ZXJuYWwgZGV2aWNlIGNhY2hlIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6NDc3Cittc2dpZCAiZGV2aWNlL3NjYW4gbm90IGluIGNvbmZpZyBmaWxlOiBEZWZhdWx0aW5nIHRvIC9kZXYiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo0ODQKK21zZ2lkICJJbnZhbGlkIHN0cmluZyBpbiBjb25maWcgZmlsZTogZGV2aWNlcy9zY2FuIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6NDkwIGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTk4MAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gYWRkICVzIHRvIGludGVybmFsIGRldmljZSBjYWNoZSIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjUwMQorbXNnaWQgIkludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlOiBkZXZpY2VzL2xvb3BmaWxlcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjUwNworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gYWRkIGxvb3BmaWxlICVzIHRvIGludGVybmFsIGRldmljZSBjYWNoZSIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjU0NgorbXNnaWQgImRldmljZXMvZmlsdGVyIG5vdCBmb3VuZCBpbiBjb25maWcgZmlsZTogbm8gcmVnZXggZmlsdGVyIGluc3RhbGxlZCIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjU1MAorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgcmVnZXggZGV2aWNlIGZpbHRlciIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjU1NworbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgbHZtIHR5cGUgZmlsdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6NjAyIGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6NjEwCittc2dpZCAiUGVyc2lzdGVudCBjYWNoZSBmaWxlbmFtZSB0b28gbG9uZy4iCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo2MTUKK21zZ2lkICJGYWlsZWQgdG8gY3JlYXRlIHBlcnNpc3RlbnQgZGV2aWNlIGZpbHRlciIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjYzNAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBkZXZpY2UgY2FjaGUgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjY3OQorbXNnaWQgIkludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlOiBnbG9iYWwvZm9ybWF0X2xpYnJhcmllcyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjY5MAorIywgYy1mb3JtYXQKK21zZ2lkICJTaGFyZWQgbGlicmFyeSAlcyBkb2VzIG5vdCBjb250YWluIGZvcm1hdCBmdW5jdGlvbnMiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo3MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiX2luaXRfZm9ybWF0czogRGVmYXVsdCBmb3JtYXQgKCVzKSBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo3NzUKK21zZ2lkICJJbnZhbGlkIHN0cmluZyBpbiBjb25maWcgZmlsZTogZ2xvYmFsL3NlZ21lbnRfbGlicmFyaWVzIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6Nzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNoYXJlZCBsaWJyYXJ5ICVzIGRvZXMgbm90IGNvbnRhaW4gc2VnbWVudCB0eXBlIGZ1bmN0aW9ucyIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjgwMQorIywgYy1mb3JtYXQKK21zZ2lkICJEdXBsaWNhdGUgc2VnbWVudCB0eXBlICVzOiB1bmxvYWRpbmcgc2hhcmVkIGxpYnJhcnkgJXMiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo4MjUKK21zZ2lkICJfaW5pdF9ob3N0bmFtZTogZG1fcG9vbF9zdHJkdXAgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6ODMwCittc2dpZCAiX2luaXRfaG9zdG5hbWU6IGRtX3Bvb2xfc3RyZHVwIGtlcm5lbF92c24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6ODQ0Cittc2dpZCAiV0FSTklORzogTWV0YWRhdGEgY2hhbmdlcyB3aWxsIE5PVCBiZSBiYWNrZWQgdXAiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo4NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIGRlZmF1bHQgYXJjaGl2ZSBwYXRoICclcy8lcycuIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6ODczIGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6ODkzCittc2dpZCAiYmFja3VwX2luaXQgZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjg4NQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgZGVmYXVsdCBiYWNrdXAgcGF0aCAnJXMvJXMnLiIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjkxMQorbXNnaWQgInNldGxvY2FsZSBmYWlsZWQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo5MjAKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgY29tbWFuZCBjb250ZXh0IgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6OTQwCittc2dpZCAiIgorIkZhaWxlZCB0byBjcmVhdGUgTFZNMiBzeXN0ZW0gZGlyIGZvciBtZXRhZGF0YSBiYWNrdXBzLCBjb25maWcgZmlsZXMgYW5kICIKKyJpbnRlcm5hbCBjYWNoZS4iCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo5NDIKK21zZ2lkICIiCisiU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIExWTV9TWVNURU1fRElSIHRvIGFsdGVybmF0aXZlIGxvY2F0aW9uIG9yIGVtcHR5ICIKKyJzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IGNvbW1hbmRzL3Rvb2xjb250ZXh0LmM6OTQ4Cittc2dpZCAiTGlicmFyeSBtZW1vcnkgcG9vbCBjcmVhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogY29tbWFuZHMvdG9vbGNvbnRleHQuYzo5NzkKK21zZ2lkICJDb21tYW5kIG1lbW9yeSBwb29sIGNyZWF0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjb21tYW5kcy90b29sY29udGV4dC5jOjEwNDIKK21zZ2lkICJSZWxvYWRpbmcgY29uZmlnIGZpbGVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzoxMTEKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgY29uZmlnIHBvb2wuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzoxMTYKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgY29uZmlnIHRyZWUuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzoxNjUKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgY29uZmlnIHRyZWUgcGFyc2VyLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6MjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBDaGVja3N1bSBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6MjY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6Mjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGlzIGVtcHR5IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzozMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29uZmlnIGZpbGUgJXMgaGFzIGRpc2FwcGVhcmVkISIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6MzI5Cittc2dpZCAiRmFpbGVkIHRvIHJlbG9hZCBjb25maWd1cmF0aW9uIGZpbGVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzozMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29uZmlndXJhdGlvbiBmaWxlICVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6MzQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIkRldGVjdGVkIGNvbmZpZyBmaWxlIGNoYW5nZSB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6MzY4CisjLCBjLWZvcm1hdAorbXNnaWQgIl93cml0ZV92YWx1ZTogVW5rbm93biB2YWx1ZSB0eXBlOiAlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6NDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkR1bXBpbmcgY29uZmlndXJhdGlvbiB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6NDM1IGNvbmZpZy9jb25maWcuYzo0NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbHVyZSB3aGlsZSB3cml0aW5nIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzo0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29uZmlndXJhdGlvbiBub2RlICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6NDk0IGNvbmZpZy9jb25maWcuYzo0OTcgY29uZmlnL2NvbmZpZy5jOjUxMAorIzogY29uZmlnL2NvbmZpZy5jOjUxMiBjb25maWcvY29uZmlnLmM6NTI3IGNvbmZpZy9jb25maWcuYzo1NDEKKyM6IGNvbmZpZy9jb25maWcuYzo1NDMgY29uZmlnL2NvbmZpZy5jOjU3MiBjb25maWcvY29uZmlnLmM6NTc4CisjOiBjb25maWcvY29uZmlnLmM6NTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIlBhcnNlIGVycm9yIGF0IGJ5dGUgJXRkIChsaW5lICVkKTogdW5leHBlY3RlZCB0b2tlbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6NTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhcnNlIGVycm9yIGF0IGJ5dGUgJXRkIChsaW5lICVkKTogZXhwZWN0ZWQgYSB2YWx1ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IElnbm9yaW5nIGR1cGxpY2F0ZSBjb25maWcgbm9kZTogJXMgKHNlZWtpbmcgJXMpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzo4NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyAlcyB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6ODYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG5vdCBmb3VuZCBpbiBjb25maWc6IGRlZmF1bHRpbmcgdG8gJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL2NvbmZpZy5jOjg4MQorIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nICVzIHRvICVsZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6ODg1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG5vdCBmb3VuZCBpbiBjb25maWc6IGRlZmF1bHRpbmcgdG8gJWxkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9jb25maWcuYzo5MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyAlcyB0byAlZiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvY29uZmlnLmM6OTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG5vdCBmb3VuZCBpbiBjb25maWc6IGRlZmF1bHRpbmcgdG8gJWYiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjY0IGRldmljZS9kZXYtY2FjaGUuYzo4MSBkZXZpY2UvZGV2LWNhY2hlLmM6MTE4Cittc2dpZCAic3RydWN0IGRldmljZSBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NjggZGV2aWNlL2Rldi1jYWNoZS5jOjg1Cittc2dpZCAic3RydWN0IHN0cl9saXN0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo3MyBkZXZpY2UvZGV2LWNhY2hlLmM6OTAgZGV2aWNlL2Rldi1jYWNoZS5jOjk1Cittc2dpZCAiZmlsZW5hbWUgc3RyZHVwIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBOZXcgcHJlZmVycmVkIG5hbWUiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjI0NworIywgYy1mb3JtYXQKK21zZ2lkICIlczogQWxyZWFkeSBpbiBkZXZpY2UgY2FjaGUiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjI2MAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogQWxpYXNlZCB0byAlcyBpbiBkZXZpY2UgY2FjaGUlcyIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6MjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBBZGRlZCB0byBkZXZpY2UgY2FjaGUiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjMwNworbXNnaWQgIkNvdWxkbid0IGluc2VydCBkZXZpY2UgaW50byBiaW5hcnkgdHJlZS4iCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjMxNAorbXNnaWQgIkNvdWxkbid0IGFkZCBhbGlhcyB0byBkZXYgY2FjaGUuIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzozMTkKK21zZ2lkICJDb3VsZG4ndCBhZGQgbmFtZSB0byBoYXNoIGluIGRldiBjYWNoZS4iCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjM5OQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogTm90IGEgcmVndWxhciBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo0MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFN5bWJvbGljIGxpbmsgdG8gZGlyZWN0b3J5IgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vdCBhIGJsb2NrIGRldmljZSIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NDk2Cittc2dpZCAiIgorImRldmljZXMvcHJlZmVycmVkX25hbWVzIG5vdCBmb3VuZCBpbiBjb25maWcgZmlsZTogdXNpbmcgYnVpbHQtaW4gcHJlZmVyZW5jZXMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjUwMworbXNnaWQgInByZWZlcnJlZF9uYW1lcyBwYXR0ZXJucyBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3RlcyIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NTE0Cittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHByZWZlcnJlZCBkZXZpY2UgbmFtZSBwYXR0ZXJuIGxpc3QuIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo1MjEKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgYSBwcmVmZXJyZWQgZGV2aWNlIG5hbWUgcGF0dGVybi4iCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjUyOQorbXNnaWQgIlByZWZlcnJlZCBkZXZpY2UgbmFtZSBwYXR0ZXJuIG1hdGNoZXIgY3JlYXRpb24gZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NTU5Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIGJpbmFyeSB0cmVlIGZvciBkZXYtY2FjaGUuIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo1NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaGFzIGJlZW4gbGVmdCBvcGVuLiIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NjE3IGRldmljZS9kZXYtY2FjaGUuYzo2NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWdub3JpbmcgJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo2MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWdub3JpbmcgJXM6IE5vdCBhIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6NjI4Cittc2dpZCAiZGlyX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjY0OQorIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyAlczogTm90IGEgcmVndWxhciBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo2NTQKK21zZ2lkICJkaXJfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWNhY2hlLmM6Njg2IGRldmljZS9kZXYtY2FjaGUuYzo2OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGF0aCAlcyBubyBsb25nZXIgdmFsaWQgZm9yIGRldmljZSglZCwlZCkiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1jYWNoZS5jOjcwNworIywgYy1mb3JtYXQKK21zZ2lkICJBYm9ydGluZyAtIHBsZWFzZSBwcm92aWRlIG5ldyBwYXRobmFtZSBmb3Igd2hhdCB1c2VkIHRvIGJlICVzIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtY2FjaGUuYzo3NDcKK21zZ2lkICJkZXZfaXRlciBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXR0ZW1wdCB0byByZWFkIGFuIHVub3BlbmVkIGRldmljZSAoJXMpLiIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZCBzaXplIHRvbyBsYXJnZTogJWx1IgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtaW8uYzo4NAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbHNlZWsgJWx1IGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlcyBmYWlsZWQgYWZ0ZXIgJWx1IG9mICVsdSBhdCAlbHU6ICVzIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtaW8uYzoxMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGJsb2NrIHNpemUgaXMgJXUgYnl0ZXMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjE5MQorbXNnaWQgIkJvdW5jZSBidWZmZXIgYWxsb2NhIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6MjM4IGRldmljZS9kZXYtaW8uYzoyNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHNpemUgaXMgJWx1IHNlY3RvcnMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjM0MworIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiAlcyBhbHJlYWR5IG9wZW5lZCByZWFkLW9ubHkiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjM1MgorIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiBkZXZfb3BlbiglcykgY2FsbGVkIHdoaWxlIHN1c3BlbmRlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6MzY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBzdGF0IGZhaWxlZDogSGFzIGRldmljZSBuYW1lIGNoYW5nZWQ/IgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtaW8uYzozOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vdCB1c2luZyBPX0RJUkVDVCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NDIyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBmc3RhdCBmYWlsZWQ6IEhhcyBkZXZpY2UgbmFtZSBjaGFuZ2VkPyIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NDM3CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5lZCAlcyAlcyVzJXMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICJDbG9zZWQgJXMiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJBdHRlbXB0IHRvIGNsb3NlIGRldmljZSAnJXMnIHdoaWNoIGlzIG5vdCBvcGVuLiIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBJbW1lZGlhdGUgY2xvc2UgYXR0ZW1wdCB3aGlsZSBzdGlsbCByZWZlcmVuY2VkIgorbXNnc3RyICIiCisKKyM6IGRldmljZS9kZXYtaW8uYzo1NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZCBmcm9tICVzIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBkZXZpY2UvZGV2LWlvLmM6NTg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNpcmN1bGFyIHJlYWQgZnJvbSAlcyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjY0OAorIywgYy1mb3JtYXQKK21zZ2lkICJXaXBpbmcgJXMgYXQgJWx1IGxlbmd0aCAlenUiCittc2dzdHIgIiIKKworIzogZGV2aWNlL2Rldi1pby5jOjY1MQorIywgYy1mb3JtYXQKK21zZ2lkICJXaXBpbmcgJXMgYXQgc2VjdG9yICVsdSBsZW5ndGggJXp1IHNlY3RvcnMiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6MTQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXNlZCBhbGxvY2F0aW9uIHBvbGljeSAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzoxNzIKK21zZ2lkICJubyBtZW1vcnkgZm9yIHNpemUgZGlzcGxheSBidWZmZXIiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6MjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiVzOiVsdTotMToldToldTotMToldToldToldToldTolcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzoyNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS0tICVzUGh5c2ljYWwgdm9sdW1lIC0tLSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzoyNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgTmFtZSAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICJWRyBOYW1lICAgICAgICAgICAgICAgJXMlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzoyOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgU2l6ZSAgICAgICAgICAgICAgICVzIC8gbm90IHVzYWJsZSAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgU2l6ZSAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICJBbGxvY2F0YWJsZSAgICAgICAgICAgeWVzICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjMwNworbXNnaWQgIkFsbG9jYXRhYmxlICAgICAgICAgICBOTyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUEUgU2l6ZSAoS0J5dGUpICAgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjMxMyBkaXNwbGF5L2Rpc3BsYXkuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVG90YWwgUEUgICAgICAgICAgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjMxNAorIywgYy1mb3JtYXQKK21zZ2lkICJGcmVlIFBFICAgICAgICAgICAgICAgJXUiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6MzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkFsbG9jYXRlZCBQRSAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozMTYgZGlzcGxheS9kaXNwbGF5LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIFVVSUQgICAgICAgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozMTcgZGlzcGxheS9kaXNwbGF5LmM6MzQ1IGRpc3BsYXkvZGlzcGxheS5jOjQ3NgorIzogZGlzcGxheS9kaXNwbGF5LmM6NTI3IGRpc3BsYXkvZGlzcGxheS5jOjYxMCBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MzE1CisjOiBsdm1jbWRsaW5lLmM6NzY5IG1pcnJvci9taXJyb3JlZC5jOjczIHN0cmlwZWQvc3RyaXBlZC5jOjQ5Cittc2dpZCAiICIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgTmFtZSAgICAgICAgICAgICAgICVzICAgICAiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6MzQwCisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIFN0YXR1cyAgICAgICAgICAgICAlc2FsbG9jYXRhYmxlIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjM0MgorIywgYy1mb3JtYXQKK21zZ2lkICJUb3RhbCBQRSAvIEZyZWUgUEUgICAgJXUgLyAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMlcy8lczolczolZDolZDotMTolZDolbHU6JWQ6LTE6JWQ6JWQ6JWQ6JWQiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6Mzg1Cittc2dpZCAiLS0tIExvZ2ljYWwgdm9sdW1lIC0tLSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzozODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgTmFtZSAgICAgICAgICAgICAgICAlcyVzLyVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjM4OQorIywgYy1mb3JtYXQKK21zZ2lkICJWRyBOYW1lICAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICJMViBVVUlEICAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjM5MworIywgYy1mb3JtYXQKK21zZ2lkICJMViBXcml0ZSBBY2Nlc3MgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjM5NworbXNnaWQgIkxWIHNuYXBzaG90IHN0YXR1cyAgICAgc291cmNlIG9mIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQwNgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICVzJXMvJXMgWyVzXSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0MTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgc25hcHNob3Qgc3RhdHVzICAgICAlcyBkZXN0aW5hdGlvbiBmb3IgJXMlcy8lcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0MjYKK21zZ2lkICJMViBTdGF0dXMgICAgICAgICAgICAgIHN1c3BlbmRlZCIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgU3RhdHVzICAgICAgICAgICAgICAlc2F2YWlsYWJsZSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBvcGVuICAgICAgICAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgU2l6ZSAgICAgICAgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VycmVudCBMRSAgICAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ09XLXRhYmxlIHNpemUgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ09XLXRhYmxlIExFICAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo0NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWxsb2NhdGVkIHRvIHNuYXBzaG90ICAlLjJmJSUgIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ1MworIywgYy1mb3JtYXQKK21zZ2lkICJTbmFwc2hvdCBjaHVuayBzaXplICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ1NworIywgYy1mb3JtYXQKK21zZ2lkICJTZWdtZW50cyAgICAgICAgICAgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ2MworIywgYy1mb3JtYXQKK21zZ2lkICJBbGxvY2F0aW9uICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ2NAorIywgYy1mb3JtYXQKK21zZ2lkICJSZWFkIGFoZWFkIHNlY3RvcnMgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ2OAorIywgYy1mb3JtYXQKK21zZ2lkICJQZXJzaXN0ZW50IG1ham9yICAgICAgICVkIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ2OQorIywgYy1mb3JtYXQKK21zZ2lkICJQZXJzaXN0ZW50IG1pbm9yICAgICAgICVkIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ3MworIywgYy1mb3JtYXQKK21zZ2lkICJCbG9jayBkZXZpY2UgICAgICAgICAgICVkOiVkIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIlc1BoeXNpY2FsIHZvbHVtZVx0JXMiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NDkyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzUGh5c2ljYWwgZXh0ZW50c1x0JWQgdG8gJWQiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NDk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzTG9naWNhbCB2b2x1bWVcdCVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjUwMgorIywgYy1mb3JtYXQKK21zZ2lkICIlc0xvZ2ljYWwgZXh0ZW50c1x0JWQgdG8gJWQiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzVW5hc3NpZ25lZCBhcmVhIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjUxNQorbXNnaWQgIi0tLSBTZWdtZW50cyAtLS0iCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgZXh0ZW50ICV1IHRvICV1OiIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBUeXBlXHRcdCVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU0NworbXNnaWQgIi0tLSBWb2x1bWUgZ3JvdXAgLS0tIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU0OAorIywgYy1mb3JtYXQKK21zZ2lkICJWRyBOYW1lICAgICAgICAgICAgICAgJXMiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSBJRCAgICAgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm9ybWF0ICAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU1MgorIywgYy1mb3JtYXQKK21zZ2lkICJNZXRhZGF0YSBBcmVhcyAgICAgICAgJWQiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTU0CisjLCBjLWZvcm1hdAorbXNnaWQgIk1ldGFkYXRhIFNlcXVlbmNlIE5vICAlZCIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVkcgQWNjZXNzICAgICAgICAgICAgICVzJXMlcyVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU2MgorIywgYy1mb3JtYXQKK21zZ2lkICJWRyBTdGF0dXMgICAgICAgICAgICAgJXMlc3Jlc2l6YWJsZSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1NjkKK21zZ2lkICJDbHVzdGVyZWQgICAgICAgICAgICAgeWVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU3MAorIywgYy1mb3JtYXQKK21zZ2lkICJTaGFyZWQgICAgICAgICAgICAgICAgJXMiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTczCisjLCBjLWZvcm1hdAorbXNnaWQgIk1BWCBMViAgICAgICAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VyIExWICAgICAgICAgICAgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU3NQorIywgYy1mb3JtYXQKK21zZ2lkICJPcGVuIExWICAgICAgICAgICAgICAgJXUiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIk1heCBQViAgICAgICAgICAgICAgICAldSIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3VyIFBWICAgICAgICAgICAgICAgICV1IgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU4MworIywgYy1mb3JtYXQKK21zZ2lkICJBY3QgUFYgICAgICAgICAgICAgICAgJXUiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZHIFNpemUgICAgICAgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo1ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUEUgU2l6ZSAgICAgICAgICAgICAgICVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjU5NAorIywgYy1mb3JtYXQKK21zZ2lkICJBbGxvYyBQRSAvIFNpemUgICAgICAgJXUgLyAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo2MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRnJlZSAgUEUgLyBTaXplICAgICAgICV1IC8gJXMiCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6NjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIlZHIFVVSUQgICAgICAgICAgICAgICAlcyIKK21zZ3N0ciAiIgorCisjOiBkaXNwbGF5L2Rpc3BsYXkuYzo2NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6JXM6JWQ6LTE6JXU6JXU6JXU6LTE6JXU6JXU6JXU6JWx1OiV1OiV1OiV1OiV1OiVzIgorbXNnc3RyICIiCisKKyM6IGRpc3BsYXkvZGlzcGxheS5jOjY2OQorIywgYy1mb3JtYXQKK21zZ2lkICJcIiVzXCIgJS05cyBbJS05cyB1c2VkIC8gJXMgZnJlZV0iCittc2dzdHIgIiIKKworIzogZGlzcGxheS9kaXNwbGF5LmM6Njg2IGRpc3BsYXkvZGlzcGxheS5jOjY5NSBwdnNjYW4uYzozNAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyIKK21zZ3N0ciAiIgorCisjOiBlcnJvci9lcnJzZWcuYzo3MworbXNnaWQgImVycm9yIG1vZHVsZSBzdHJpbmcgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBlcnJvci9lcnJzZWcuYzoxMDkgbWlycm9yL21pcnJvcmVkLmM6NTYyIHNuYXBzaG90L3NuYXBzaG90LmM6MTc5CisjOiBzdHJpcGVkL3N0cmlwZWQuYzoyMjcgemVyby96ZXJvLmM6MTA5CisjLCBjLWZvcm1hdAorbXNnaWQgIkluaXRpYWxpc2VkIHNlZ3R5cGU6ICVzIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLWNvbXBvc2l0ZS5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nICVzIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLWNvbXBvc2l0ZS5jOjU5Cittc2dpZCAiY29tcG9zaXRlIGZpbHRlcnMgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItY29tcG9zaXRlLmM6NjcKK21zZ2lkICJjb21wc29pdGUgZmlsdGVycyBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1tZC5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBTa2lwcGluZyBtZCBjb21wb25lbnQgZGV2aWNlIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLW1kLmM6MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFNraXBwaW5nOiBlcnJvciBpbiBtZCBjb21wb25lbnQgZGV0ZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLW1kLmM6NTQKK21zZ2lkICJtZCBmaWx0ZXIgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjU3Cittc2dpZCAiV2lwaW5nIGNhY2hlIG9mIExWTS1jYXBhYmxlIGRldmljZXMiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgJXMgYXJyYXkgaW4gJyVzJyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6ODQKK21zZ2lkICJEZXZpY2VzIGFycmF5IGNvbnRhaW5zIGEgdmFsdWUgd2hpY2ggaXMgbm90IGEgc3RyaW5nIC4uLiBpZ25vcmluZyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgYWRkICclcycgdG8gZmlsdGVyIC4uLiBpZ25vcmluZyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBzdGF0IGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICJMb2FkZWQgcGVyc2lzdGVudCBmaWx0ZXIgY2FjaGUgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIHBlcnNpc3RlbnQgZGV2aWNlIGNhY2hlIGVtcHR5IC0gbm90IHdyaXRpbmcgdG8gJXMiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItcGVyc2lzdGVudC5jOjE4OAorIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgY2FjaGUgaW5jb21wbGV0ZSAtIG5vdCB3cml0aW5nIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLXBlcnNpc3RlbnQuYzoxOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVtcGluZyBwZXJzaXN0ZW50IGRldmljZSBjYWNoZSB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MjQ4IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6OTAyCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjkyOCBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjk2NQorIzogbWlzYy9sdm0tZmlsZS5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiByZW5hbWUgdG8gJXMgZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6Mjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBTa2lwcGluZyAoY2FjaGVkKSIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1wZXJzaXN0ZW50LmM6MzExCittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIGhhc2ggdGFibGUgZm9yIHBlcnNpc3RlbnQgZmlsdGVyLiIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjQ0Cittc2dpZCAicGF0dGVybiBtdXN0IGJlZ2luIHdpdGggJ2EnIG9yICdyJyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjgzCittc2dpZCAiaW52YWxpZCBzZXBhcmF0b3IgYXQgZW5kIG9mIHJlZ2V4IgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLXJlZ2V4LmM6MTA4Cittc2dpZCAiZmlsdGVyIHBhdHRlcm5zIG11c3QgYmUgZW5jbG9zZWQgaW4gcXVvdGVzIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLXJlZ2V4LmM6MTMzCittc2dpZCAiaW52YWxpZCBmaWx0ZXIgcGF0dGVybiIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1yZWdleC5jOjE3NAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogU2tpcHBpbmcgKHJlZ2V4KSIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1zeXNmcy5jOjMxCittc2dpZCAiTm8gcHJvYyBmaWxlc3lzdGVtIGZvdW5kOiBza2lwcGluZyBzeXNmcyBmaWx0ZXIiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItc3lzZnMuYzozNworbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgL3Byb2MvbW91bnRzIHN0cmluZyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1zeXNmcy5jOjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJFbXB0eSBzeXNmcyBkZXZpY2UgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItc3lzZnMuYzoxNDIKK21zZ2lkICJzeXNmcyBkZXZpY2UgZmlsZSBub3QgY29ycmVjdCBmb3JtYXQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXItc3lzZnMuYzoxOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAic3lzZnMgcGF0aCBuYW1lIHRvbyBsb25nOiAlcyBpbiAlcyIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1zeXNmcy5jOjI1NQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogU2tpcHBpbmcgKHN5c2ZzKSIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci1zeXNmcy5jOjI3OAorbXNnaWQgInN5c2ZzIHBvb2wgY3JlYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLXN5c2ZzLmM6MjgzCittc2dpZCAic3lzZnMgZGV2X3NldCBjcmVhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXIuYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogU2tpcHBpbmc6IFVucmVjb2duaXNlZCBMVk0gZGV2aWNlIHR5cGUgJWx1IgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFNraXBwaW5nOiBTdXNwZW5kZWQgZG0gZGV2aWNlIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6MTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBTa2lwcGluZzogb3BlbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXIuYzoxMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFNraXBwaW5nOiBkZXZfZ2V0X3NpemUgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6MTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBTa2lwcGluZzogVG9vIHNtYWxsIHRvIGhvbGQgYSBQViIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci5jOjEyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogU2tpcHBpbmc6IFBhcnRpdGlvbiB0YWJsZSBzaWduYXR1cmUgZm91bmQiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXIuYzoxNDcKK21zZ2lkICJObyBwcm9jIGZpbGVzeXN0ZW0gZm91bmQ6IHVzaW5nIGFsbCBibG9jayBkZXZpY2UgdHlwZXMiCittc2dzdHIgIiIKKworIzogZmlsdGVycy9maWx0ZXIuYzoxNTkKK21zZ2lkICJGYWlsZWQgdG8gY3JlYXRlIC9wcm9jL2RldmljZXMgc3RyaW5nIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6MjE4Cittc2dpZCAiRXhwZWN0aW5nIHN0cmluZyBpbiBkZXZpY2VzL3R5cGVzIGluIGNvbmZpZyBmaWxlIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6MjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heCBwYXJ0aXRpb24gY291bnQgbWlzc2luZyBmb3IgJXMgaW4gZGV2aWNlcy90eXBlcyBpbiBjb25maWcgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBmaWx0ZXJzL2ZpbHRlci5jOjIzNgorIywgYy1mb3JtYXQKK21zZ2lkICJaZXJvIHBhcnRpdGlvbiBjb3VudCBpbnZhbGlkIGZvciAlcyBpbiBkZXZpY2VzL3R5cGVzIGluIGNvbmZpZyBmaWxlIgorbXNnc3RyICIiCisKKyM6IGZpbHRlcnMvZmlsdGVyLmM6MjY5Cittc2dpZCAiTFZNIHR5cGUgZmlsdGVyIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzoxOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIExWTTEgUFYgaWRlbnRpZmllciIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6MTk2CisjLCBjLWZvcm1hdAorbXNnaWQgImZvcm1hdDE6IFVua25vd24gbWV0YWRhdGEgdmVyc2lvbiAlZCBmb3VuZCBvbiAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6MjEwIGZvcm1hdF9wb29sL2Rpc2tfcmVwLmM6NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlYWQgUFYgZGF0YSBmcm9tICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzozNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBmb3JtYXQxIFZHIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzozNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlYWQgVkcgZGF0YSBmcm9tIFBWICglcykiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjM4MAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIFZHICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzozOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlYWQgUFYgdXVpZCBsaXN0IGZyb20gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjM5NQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhZCBMVidzIGZyb20gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjQwMAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhZCBleHRlbnRzIGZyb20gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjQwNAorIywgYy1mb3JtYXQKK21zZ2lkICJGb3VuZCAlcyBpbiAlc1ZHICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo0NDMgZm9ybWF0X3Bvb2wvZGlza19yZXAuYzo2NworIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyBkdXBsaWNhdGUgUFYgJXMgb24gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjQ0OCBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkR1cGxpY2F0ZSBQViAlcyAtIHVzaW5nIG1kICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo0OTQKK21zZ2lkICJyZWFkX3B2c19pbl92ZzogZGV2X2l0ZXJfY3JlYXRlIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NTE3CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgJXMgVkcgbWV0YWRhdGEgdG8gJXMgYXQgJWx1IGxlbiAlenUiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjUzNworIywgYy1mb3JtYXQKK21zZ2lkICJUb28gbWFueSB1dWlkcyB0byBmaXQgb24gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjU0MgorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nICVzIHV1aWRsaXN0IHRvICVzIGF0ICVsdSBsZW4gJWQiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjU1NworIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nICVzIExWICVzIG1ldGFkYXRhIHRvICVzIGF0ICVsdSBsZW4gJXp1IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo1NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgemVybyBsdiBhcmVhIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo1ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAibHZfbnVtYmVyICVkIHRvbyBsYXJnZSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgJXMgZXh0ZW50cyBtZXRhZGF0YSB0byAlcyBhdCAlbHUgbGVuICV6dSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjIzCittc2dpZCAiSW52YWxpZCBQViBzdHJ1Y3R1cmUgc2l6ZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjYzMgorbXNnaWQgIkNvdWxkbid0IGFsbG9jYXRlIHRlbXBvcmFyeSBQViBidWZmZXIuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo2MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyAlcyBQViBtZXRhZGF0YSB0byAlcyBhdCAlbHUgbGVuICV6dSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB3cml0ZSBQViBzdHJ1Y3R1cmUgb250byAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB3cml0ZSBWRyBkYXRhIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo2ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIFBWIHV1aWQgbGlzdCB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Rpc2stcmVwLmM6NjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB3cml0ZSBMVidzIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZGlzay1yZXAuYzo2OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIGV4dGVudHMgdG8gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9kaXNrLXJlcC5jOjczNgorIywgYy1mb3JtYXQKK21zZ2lkICJTdWNjZXNzZnVsbHkgd3JvdGUgZGF0YSB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Zvcm1hdDEuYzo3MgorIywgYy1mb3JtYXQKK21zZ2lkICJWRyBkYXRhIGRpZmZlcnMgYmV0d2VlbiBQVnMgJXMgYW5kICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjc0IGZvcm1hdDEvZm9ybWF0MS5jOjg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlZHIGRhdGEgb24gJXM6ICVzICVzICV1ICV1ICAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Zvcm1hdDEuYzoxMTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgUFYocykgZm91bmQgZm9yIFZHICVzOiBleHBlY3RlZCAlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2Zvcm1hdDEuYzoyOTQgZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoyMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZGluZyBwaHlzaWNhbCB2b2x1bWUgZGF0YSAlcyBmcm9tIGRpc2siCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9mb3JtYXQxLmM6MzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZXMgY2Fubm90IGJlIGJpZ2dlciB0aGFuICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjM1NQorbXNnaWQgIk1ldGFkYXRhIHdvdWxkIG92ZXJ3cml0ZSBwaHlzaWNhbCBleHRlbnRzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJsb2dpY2FsIHZvbHVtZXMgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuICVkIGV4dGVudHMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjM3NQorIywgYy1mb3JtYXQKK21zZ2lkICJsb2dpY2FsIHZvbHVtZXMgY2Fubm90IGJlIGxhcmdlciB0aGFuICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjQ1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFeHRlbnQgc2l6ZSBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjQ1OQorIywgYy1mb3JtYXQKK21zZ2lkICJFeHRlbnQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjQ2NiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjc5Cittc2dpZCAiRXh0ZW50IHNpemUgbXVzdCBiZSBwb3dlciBvZiAyIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjU2MworbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSBsdm0xIGxhYmVsIGhhbmRsZXIuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvZm9ybWF0MS5jOjU2OAorbXNnaWQgIkNvdWxkbid0IHJlZ2lzdGVyIGx2bTEgbGFiZWwgaGFuZGxlci4iCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9mb3JtYXQxLmM6NTcyIGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MzU0CisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE5OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW5pdGlhbGlzZWQgZm9ybWF0OiAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0gSUQgJXMgb24gJXMgZGlmZmVycyBmcm9tICVzIGZvciB2b2x1bWUgZ3JvdXAiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6OTggZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoyMjAKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NTY5IG1ldGFkYXRhL21ldGFkYXRhLmM6MTU0MiBwdnJlc2l6ZS5jOjEyMQorIzogdmdyZWR1Y2UuYzozOTUgdmdyZW1vdmUuYzo2MgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogQ291bGRuJ3QgZ2V0IHNpemUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjEwMSBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjIyMworIywgYy1mb3JtYXQKK21zZ2lkICJGaXhpbmcgdXAgbWlzc2luZyBmb3JtYXQxIHNpemUgKCVzKSBmb3IgUFYgJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MTA4IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IFBoeXNpY2FsIFZvbHVtZSAlcyBpcyB0b28gbGFyZ2UgZm9yIHVuZGVybHlpbmcgZGV2aWNlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjEzMAorbXNnaWQgIkdlbmVyYXRlZCBzeXN0ZW1faWQgdG9vIGxvbmciCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9pbXBvcnQtZXhwb3J0LmM6MTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBuYW1lICVzIHRvbyBsb25nIHRvIGV4cG9ydCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo0MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VnbWVudCB0eXBlICVzIGluIExWICVzOiB1bnN1cHBvcnRlZCBieSBmb3JtYXQxIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjQxOAorIywgYy1mb3JtYXQKK21zZ2lkICJOb24tUFYgc3RyaXBlIGZvdW5kIGluIExWICVzOiB1bnN1cHBvcnRlZCBieSBmb3JtYXQxIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjYxMAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lIG51bWJlciBvdXQgb2YgYm91bmRzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgZmluZCBsb2dpY2FsIHZvbHVtZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHBvcnQuYzo2MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgZmluZCBvcmlnaW4gbG9naWNhbCB2b2x1bWUgZm9yIHNuYXBzaG90ICclcycuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4cG9ydC5jOjY1MAorbXNnaWQgIkNvdWxkbid0IGFkZCBzbmFwc2hvdC4iCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjUzCittc2dpZCAiVW5hYmxlIHRvIGNyZWF0ZSBoYXNoIHRhYmxlIGZvciBob2xkaW5nIGV4dGVudCBtYXBzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgdm9sdW1lICglcykgY29udGFpbnMgYW4gdW5rbm93biBsb2dpY2FsIHZvbHVtZSAoJXMpLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgTFYgaW4gZXh0ZW50IG1hcCAoUFYgJXMsIFBFICV1LCBMViAldSwgTEUgJXUpIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzoxNDkKK21zZ2lkICJsb2dpY2FsIGV4dGVudCBudW1iZXIgb3V0IG9mIGJvdW5kcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MTU1CisjLCBjLWZvcm1hdAorbXNnaWQgImxvZ2ljYWwgZXh0ZW50ICgldSkgYWxyZWFkeSBtYXBwZWQuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzoxNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgKCVzKSBjb250YWlucyBhbiBpbmNvbXBsZXRlIG1hcHBpbmcgdGFibGUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzoyMjkKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgbGluZWFyIHNlZ21lbnQuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzoyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIk51bWJlciBvZiBzdHJpcGVzICgldSkgaW5jb21wYXRpYmxlIHdpdGggbG9naWNhbCBleHRlbnQgY291bnQgKCV1KSBmb3IgJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9pbXBvcnQtZXh0ZW50cy5jOjMwMworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJpcGVkIHNlZ21lbnQuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvaW1wb3J0LWV4dGVudHMuYzozNTkKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBsb2dpY2FsIHZvbHVtZSBtYXBzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6MzY0Cittc2dpZCAiQ291bGRuJ3QgZmlsbCBsb2dpY2FsIHZvbHVtZSBtYXBzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2ltcG9ydC1leHRlbnRzLmM6Mzc0Cittc2dpZCAiQ291bGRuJ3QgYnVpbGQgZXh0ZW50IHNlZ21lbnRzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXQxL2xheW91dC5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heExvZ2ljYWxWb2x1bWVzIG9mICVkIGV4Y2VlZHMgZm9ybWF0IGxpbWl0IG9mICVkIGZvciBWRyAnJXMnIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvbGF5b3V0LmM6ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWF4UGh5c2ljYWxWb2x1bWVzIG9mICVkIGV4Y2VlZHMgZm9ybWF0IGxpbWl0IG9mICVkIGZvciBWRyAnJXMnIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvbGF5b3V0LmM6MTA1Cittc2dpZCAiSW5zdWZmaWNpZW50IHNwYWNlIGZvciBtZXRhZGF0YSBhbmQgUEUncy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9sYXlvdXQuYzoxNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVG9vIGZldyBleHRlbnRzIG9uICVzLiAgVHJ5IHNtYWxsZXIgZXh0ZW50IHNpemUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvbGF5b3V0LmM6MTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIk1ldGFkYXRhIGV4dGVudCBsaW1pdCAoJXUpIGV4Y2VlZGVkIGZvciAlcyAtICV1IHJlcXVpcmVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdDEvbHZtMS1sYWJlbC5jOjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSAnJXMnIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgbHZtMSBsYWJlbGxlci4iCittc2dzdHIgIiIKKworIzogZm9ybWF0MS9sdm0xLWxhYmVsLmM6MTIwIGZvcm1hdF9wb29sL3Bvb2xfbGFiZWwuYzo5OQorIzogZm9ybWF0X3RleHQvdGV4dF9sYWJlbC5jOjI4NQorbXNnaWQgIkNvdWxkbid0IGFsbG9jYXRlIGxhYmVsbGVyIG9iamVjdC4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZGlza19yZXAuYzo5NCBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGN1bGF0ZWQgdXVpZCAlcyBmb3IgJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZGlza19yZXAuYzoyNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIDMyLWJpdCB1aW50cyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJObyBkZXZpY2VzIGZvciB2ZyAlcyBmb3VuZCBpbiBjYWNoZSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfcG9vbC9kaXNrX3JlcC5jOjM2MworbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBwb29sIGxpc3Qgc3RydWN0dXJlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIHN1YnBvb2wgc3RydWN0dXJlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBwb29sX2RldmljZSBzdHJ1Y3R1cmVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWlzc2luZyBzdWJwb29sICVkIGluIHBvb2wgJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzo5MgorIywgYy1mb3JtYXQKK21zZ2lkICJNaXNzaW5nIGRldmljZSAldSBmb3Igc3VicG9vbCAlZCBpbiBwb29sICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MTEzCittc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlIHZvbHVtZSBncm91cCBzdHJ1Y3R1cmUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoyNzkKK21zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgZm9ybWF0IGluc3RhbmNlIHN0cnVjdHVyZSBmb3IgcG9vbCBmb3JtYXQiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzoyODkKK21zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgbWV0YWRhdGEgYXJlYSBzdHJ1Y3R1cmUgZm9yIHBvb2wgZm9ybWF0IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2Zvcm1hdF9wb29sLmM6MzMyCittc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlIGZvcm1hdCB0eXBlIHN0cnVjdHVyZSBmb3IgcG9vbCBmb3JtYXQiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvZm9ybWF0X3Bvb2wuYzozNDUKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgcG9vbCBsYWJlbCBoYW5kbGVyLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfcG9vbC9mb3JtYXRfcG9vbC5jOjM1MAorbXNnaWQgIkNvdWxkbid0IHJlZ2lzdGVyIHBvb2wgbGFiZWwgaGFuZGxlci4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjY0Cittc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlIGx2IGxpc3Qgc3RydWN0dXJlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYzo2OQorbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBsb2dpY2FsIHZvbHVtZSBzdHJ1Y3R1cmUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbGN1bGF0ZWQgbHYgdXVpZCBmb3IgbHYgJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYzoxMzMKK21zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgcHYgbGlzdCBzdHJ1Y3R1cmUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjEzNworbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBwdiBzdHJ1Y3R1cmUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjE2NQorbXNnaWQgIlVuYWJsZSB0byBkdXBsaWNhdGUgdmdfbmFtZSBzdHJpbmciCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjE5NQorIywgYy1mb3JtYXQKK21zZ2lkICJGb3VuZCBzcHR5cGUgJVggYW5kIGNvbnZlcnRlZCBpdCB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfcG9vbC9pbXBvcnRfZXhwb3J0LmM6MjEwCittc2dpZCAiU3RyaXBlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3Bvb2wvaW1wb3J0X2V4cG9ydC5jOjIyNgorbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJpcGVkIGx2X3NlZ21lbnQgc3RydWN0dXJlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL2ltcG9ydF9leHBvcnQuYzoyNjcKK21zZ2lkICJVbmFibGUgdG8gYWxsb2NhdGUgbGluZWFyIGx2X3NlZ21lbnQgc3RydWN0dXJlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF9wb29sL3Bvb2xfbGFiZWwuYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgJyVzJyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIHBvb2wgbGFiZWxsZXIuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoxNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3Qgc2NhbiB0aGUgYXJjaGl2ZSBkaXJlY3RvcnkgKCVzKS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjE3MworbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSBuZXcgYXJjaGl2ZSBmaWxlLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4cGlyaW5nIGFyY2hpdmUgJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjI0NgorbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSB0ZW1wb3JhcnkgYXJjaGl2ZSBuYW1lLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MjUxCittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIEZJTEUgb2JqZWN0IGZvciBhcmNoaXZlLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6Mjg4Cittc2dpZCAiQXJjaGl2ZSBmaWxlIG5hbWUgdG9vIGxvbmcuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzoyOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXJjaGl2ZSByZW5hbWUgZmFpbGVkIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MzE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbGU6XHRcdCVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzozMjEKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgdGV4dCBpbnN0YW5jZSBvYmplY3QuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzozMzEKK21zZ2lkICJVbmFibGUgdG8gcmVhZCBhcmNoaXZlIGZpbGUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzozMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVkcgbmFtZTogICAgXHQlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9hcmNoaXZlLmM6MzM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkRlc2NyaXB0aW9uOlx0JXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZS5jOjMzOAorIywgYy1mb3JtYXQKK21zZ2lkICJCYWNrdXAgVGltZTpcdCVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmUuYzozNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gYXJjaGl2ZXMgZm91bmQgaW4gJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2FyY2hpdmVyLmM6NDMgZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxNTUKK21zZ2lkICJhcmNoaXZlX3BhcmFtcyBhbGxvYyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXJjaGl2aW5nIHZvbHVtZSBncm91cCBcIiVzXCIgbWV0YWRhdGEgKHNlcW5vICV1KS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzozMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgJXMgaXMgYSBkaWZmZXJlbnQgZm9ybWF0IChzZXFubyAlcykiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzozNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgdm9sdW1lIGdyb3VwIGJhY2t1cCBcIiVzXCIgKHNlcW5vICV1KS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvYXJjaGl2ZXIuYzo0MDIKK21zZ2lkICJGYWlsZWQgdG8gZ2VuZXJhdGUgYmFja3VwIGZpbGVuYW1lLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmFtZSBmYWlsZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjEwMQorbXNnaWQgIkludGVybmFsIGVycm9yIHRyYWNraW5nIGluZGVudGF0aW9uIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjEyMAorIywgYy1mb3JtYXQKK21zZ2lkICJEb3VibGluZyBtZXRhZGF0YSBvdXRwdXQgYnVmZmVyIHRvICV1IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2V4cG9ydC5jOjEyNAorbXNnaWQgIkJ1ZmZlciByZWFsbG9jYXRpb24gZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9leHBvcnQuYzo3MzcKK21zZ2lkICJ0ZXh0X2V4cG9ydCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZmxhZ3MuYzo3OQorbXNnaWQgIlVua25vd24gZmxhZyBzZXQgcmVxdWVzdGVkLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mbGFncy5jOjEyNQorbXNnaWQgIk1ldGFkYXRhIGluY29uc2lzdGVuY3k6IE5vdCBhbGwgZmxhZ3Mgc3VjY2Vzc2Z1bGx5IGV4cG9ydGVkLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mbGFncy5jOjE0NworbXNnaWQgIlN0YXR1cyB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ZsYWdzLmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gc3RhdHVzIGZsYWcgJyVzJy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm91bmQgdGV4dCBtZXRhZGF0YSBhcmVhLCBvZmZzZXQ9JWx1LCBzaXplPSVsdSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjIwNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm91bmQgTFZNMiBtZXRhZGF0YSByZWNvcmQgYXQgb2Zmc2V0PSVsdSwgc2l6ZT0lbHUsIG9mZnNldDI9JWx1IHNpemUyPSVsdSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjI1OQorIywgYy1mb3JtYXQKK21zZ2lkICJSYW5kb20gbHZpZCBjcmVhdGlvbiBmYWlsZWQgZm9yICVzLyVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjI5MAorbXNnaWQgInN0cnVjdCBtZGFfaGVhZGVyIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MzAyCittc2dpZCAiSW5jb3JyZWN0IG1ldGFkYXRhIGFyZWEgaGVhZGVyIGNoZWNrc3VtIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MzA5Cittc2dpZCAiV3JvbmcgbWFnaWMgbnVtYmVyIGluIG1ldGFkYXRhIGFyZWEgaGVhZGVyIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MzE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkluY29tcGF0aWJsZSBtZXRhZGF0YSBhcmVhIGhlYWRlciB2ZXJzaW9uOiAlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJJbmNvcnJlY3Qgc3RhcnQgc2VjdG9yIGluIG1ldGFkYXRhIGFyZWEgaGVhZGVyOiAlbHUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo0NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVkcgJXMgbm90IGZvdW5kIG9uICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NDY5IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlZHICVzIG1ldGFkYXRhIHRvbyBsYXJnZSBmb3IgY2lyY3VsYXIgYnVmZmVyIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlYWQgJXMgJXNtZXRhZGF0YSAoJXUpIGZyb20gJXMgYXQgJWx1IHNpemUgJWx1IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIlZHICVzIG1ldGFkYXRhIHdyaXRpbmcgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgJXMgbWV0YWRhdGEgdG8gJXMgYXQgJWx1IGxlbiAlbHUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo1OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JpdGluZyBtZXRhZGF0YSB0byAlcyBhdCAlbHUgbGVuICV1IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NjgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzQ29tbWl0dGluZyAlcyBtZXRhZGF0YSAoJXUpIHRvICVzIGhlYWRlciBhdCAlbHUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo2ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2lwaW5nIHByZS1jb21taXR0ZWQgJXMgbWV0YWRhdGEgZnJvbSAlcyBoZWFkZXIgYXQgJWx1IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6NjkxIGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6Nzc3Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIG1ldGFkYXRhIGFyZWEgaGVhZGVyIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6ODEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgZG9lcyBub3QgY29udGFpbiB2b2x1bWUgZ3JvdXAgJyVzJy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo4MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZCB2b2x1bWUgZ3JvdXAgJXMgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjg2MworbXNnaWQgIlRleHQgZm9ybWF0IGZhaWxlZCB0byBkZXRlcm1pbmUgZGlyZWN0b3J5LiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjg2OAorbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSB0ZW1wb3JhcnkgdGV4dCBmaWxlIG5hbWUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6ODc5CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgJXMgbWV0YWRhdGEgdG8gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo4ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIG1ldGFkYXRhIHRvICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjkwMSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjkyNgorIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo5NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVuYW1pbmcgJXMgdG8gJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo5MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGVzdCBtb2RlOiBTa2lwcGluZyBjb21taXR0aW5nICVzIG1ldGFkYXRhICgldSkiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzo5MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5saW5raW5nICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6OTI1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbW1pdHRpbmcgJXMgbWV0YWRhdGEgKCV1KSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjk2MgorbXNnaWQgIlRlc3QgbW9kZTogU2tpcHBpbmcgcmVuYW1lIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTAyNSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE3MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmFtZSB0b28gbG9uZyAlcy8lcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEwODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1ldGFkYXRhIHRvbyBsYXJnZSBmb3IgY2lyY3VsYXIgYnVmZmVyIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTExOAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogRm91bmQgbWV0YWRhdGEgYXQgJWx1IHNpemUgJWx1IGZvciAlcyAoJXMpIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTE4NgorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCBleHRlbnRzIGVuZCBiZXlvbmQgZW5kIG9mIGRldmljZSAlcyEiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxMjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IG1ldGFkYXRhIGFyZWEgZmlsbHMgZGlzayBsZWF2aW5nIG5vIHNwYWNlIGZvciBkYXRhIG9uICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjEyMzggZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxMjgzCittc2dpZCAiRmFpbGVkIHRvIHdpcGUgbmV3IG1ldGFkYXRhIGFyZWEiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxMzI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNyZWF0aW5nIG1ldGFkYXRhIGFyZWEgb24gJXMgYXQgc2VjdG9yICVsdSBzaXplICVsdSBzZWN0b3JzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTQxMAorbXNnaWQgIl9hZGRfcmF3IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTQ3MAorIywgYy1mb3JtYXQKK21zZ2lkICJNdXN0IGJlIGV4YWN0bHkgb25lIGRhdGEgYXJlYSAoZm91bmQgJWQpIG9uIFBWICVzIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTQ4NSBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE0ODkKK21zZ2lkICJtZXRhZGF0YV9hcmVhIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTY1MAorIywgYy1mb3JtYXQKK21zZ2lkICJQViAlcyB0b28gbGFyZ2UgZm9yIGV4dGVudCBzaXplICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE2OTMKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBmb3JtYXQgaW5zdGFuY2Ugb2JqZWN0LiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE2OTkKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSB0ZXh0X2ZpZF9jb250ZXh0LiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE4MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFZvbHVtZSBncm91cCBmaWxlbmFtZSBtYXkgbm90IGVuZCBpbiAudG1wIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTg0MQorbXNnaWQgIkNvdWxkbid0IGFsbG9jYXRlIHRleHQgZm9ybWF0IGNvbnRleHQgb2JqZWN0LiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE4NjMKK21zZ2lkICJfYWRkX2RpciBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE4NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWRkaW5nIHRleHQgZm9ybWF0IG1ldGFkYXRhIGRpcjogJXMiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxODgzCittc2dpZCAiRW1wdHkgbWV0YWRhdGEgZGlza19hcmVhIHNlY3Rpb24gb2YgY29uZmlnIGZpbGUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxODg4Cittc2dpZCAiTWlzc2luZyBzdGFydF9zZWN0b3IgaW4gbWV0YWRhdGEgZGlza19hcmVhIHNlY3Rpb24gb2YgY29uZmlnIGZpbGUiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxODk1Cittc2dpZCAiTWlzc2luZyBzaXplIGluIG1ldGFkYXRhIGRpc2tfYXJlYSBzZWN0aW9uIG9mIGNvbmZpZyBmaWxlIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2Zvcm1hdC10ZXh0LmM6MTkwMgorbXNnaWQgIk1pc3NpbmcgdXVpZCBpbiBtZXRhZGF0YSBkaXNrX2FyZWEgc2VjdGlvbiBvZiBjb25maWcgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE5MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCB1dWlkIGluIG1ldGFkYXRhIGRpc2tfYXJlYSBzZWN0aW9uIG9mIGNvbmZpZyBmaWxlOiAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE5MTcgZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxNTUKK21zZ2lkICJDb3VsZG4ndCBmaW5kIGRldmljZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxOTE5IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgZGV2aWNlIHdpdGggdXVpZCAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE5NDgKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgZGlyX2xpc3QiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxOTYwCittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHRleHQgbGFiZWwgaGFuZGxlci4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvZm9ybWF0LXRleHQuYzoxOTY2Cittc2dpZCAiQ291bGRuJ3QgcmVnaXN0ZXIgdGV4dCBsYWJlbCBoYW5kbGVyLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9mb3JtYXQtdGV4dC5jOjE5NzQKK21zZ2lkICJJbnZhbGlkIHN0cmluZyBpbiBjb25maWcgZmlsZTogbWV0YWRhdGEvZGlycyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnQuYzoxMDMKK21zZ2lkICJDb3VsZG4ndCByZWFkIHZvbHVtZSBncm91cCBtZXRhZGF0YS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo0NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBwcm9jZXNzIHRleHQgZm9ybWF0IGZpbGUgLSAlcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo5NAorbXNnaWQgIkNvdWxkbid0IGZpbmQgdXVpZC4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxMDAKK21zZ2lkICJ1dWlkIG11c3QgYmUgYSBzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MTA1Cittc2dpZCAiSW52YWxpZCB1dWlkLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjEzOQorbXNnaWQgIkVtcHR5IHB2IHNlY3Rpb24uIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MTQ0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCB1dWlkIGZvciB2b2x1bWUgZ3JvdXAuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MTc0Cittc2dpZCAiQ291bGRuJ3QgZmluZCBzdGF0dXMgZmxhZ3MgZm9yIHBoeXNpY2FsIHZvbHVtZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxNzkKK21zZ2lkICJDb3VsZG4ndCByZWFkIHN0YXR1cyBmbGFncyBmb3IgcGh5c2ljYWwgdm9sdW1lLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjE4NworbXNnaWQgIkNvdWxkbid0IHJlYWQgZXh0ZW50IHNpemUgZm9yIHZvbHVtZSBncm91cC4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoxOTIKK21zZ2lkICJDb3VsZG4ndCBmaW5kIGV4dGVudCBjb3VudCAocGVfY291bnQpIGZvciBwaHlzaWNhbCB2b2x1bWUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgdGFncyBmb3IgcGh5c2ljYWwgdm9sdW1lICVzIGluICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjI3NQorbXNnaWQgIkVtcHR5IHNlZ21lbnQgc2VjdGlvbi4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCAnc3RhcnRfZXh0ZW50JyBmb3Igc2VnbWVudCAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjI4NgorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkICdleHRlbnRfY291bnQnIGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6Mjk2Cittc2dpZCAiU2VnbWVudCB0eXBlIG11c3QgYmUgYSBzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6MzE2Cittc2dpZCAiU2VnbWVudCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjMyOQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIHRhZ3MgZm9yIGEgc2VnbWVudCBvZiAlcy8lcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzozNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiWmVybyBhcmVhcyBub3QgYWxsb3dlZCBmb3Igc2VnbWVudCAnJXMnIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6Mzk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgdm9sdW1lICclcycgZm9yIHNlZ21lbnQgJyVzJy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo0MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmVhcyBpbiBhcmVhIGFycmF5IGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NDM3Cittc2dpZCAiT25seSBvbmUgc2VnbWVudCBwZXJtaXR0ZWQgZm9yIHNuYXBzaG90IgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NDQzCittc2dpZCAiQ291bGRuJ3QgcmVhZCBzZWdtZW50IGNvdW50IGZvciBsb2dpY2FsIHZvbHVtZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo0NDgKK21zZ2lkICJzZWdtZW50X2NvdW50IGFuZCBhY3R1YWwgbnVtYmVyIG9mIHNlZ21lbnRzIGRpc2FncmVlLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjQ5NCBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjU2MgorbXNnaWQgIkVtcHR5IGxvZ2ljYWwgdm9sdW1lIHNlY3Rpb24uIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NDk5Cittc2dpZCAiQ291bGRuJ3QgZmluZCBzdGF0dXMgZmxhZ3MgZm9yIGxvZ2ljYWwgdm9sdW1lLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjUwNAorbXNnaWQgIkNvdWxkbid0IHJlYWQgc3RhdHVzIGZsYWdzIGZvciBsb2dpY2FsIHZvbHVtZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo1MTIgZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo3MjkKK21zZ2lkICJhbGxvY2F0aW9uX3BvbGljeSBtdXN0IGJlIGEgc3RyaW5nLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjUzNQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIHRhZ3MgZm9yIGxvZ2ljYWwgdm9sdW1lICVzLyVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJMb3N0IGxvZ2ljYWwgdm9sdW1lIHJlZmVyZW5jZSAlcyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjU2OAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIHV1aWQgZm9yIGxvZ2ljYWwgdm9sdW1lICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjU5NQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIG1pbm9yIG51bWJlciBmb3IgbG9naWNhbCB2b2x1bWUgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NjAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgbWFqb3IgbnVtYmVyIGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo2MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgZmluZCBzZWN0aW9uICclcycuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NjQ5IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6ODQxCittc2dpZCAiQ291bGRuJ3QgZmluZCB2b2x1bWUgZ3JvdXAgaW4gZmlsZS4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo2NzMKK21zZ2lkICJzeXN0ZW1faWQgbXVzdCBiZSBhIHN0cmluZyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjY4MCBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIHV1aWQgZm9yIHZvbHVtZSBncm91cCAlcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo2ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCAnc2Vxbm8nIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NjkxIGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6ODU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgc3RhdHVzIGZsYWdzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6Njk3IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6ODYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgc3RhdHVzIGZsYWdzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NzAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgZXh0ZW50IHNpemUgZm9yIHZvbHVtZSBncm91cCAlcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo3MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCAnbWF4X2x2JyBmb3Igdm9sdW1lIGdyb3VwICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjcyMAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkICdtYXhfcHYnIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NzQ1Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIGhhc2ggdGFibGUuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NzUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgYWxsIHBoeXNpY2FsIHZvbHVtZXMgZm9yIHZvbHVtZSBncm91cCAlcy4iCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvaW1wb3J0X3ZzbjEuYzo3NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCB0YWdzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6NzY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgYWxsIGxvZ2ljYWwgdm9sdW1lIG5hbWVzIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IGZvcm1hdF90ZXh0L2ltcG9ydF92c24xLmM6Nzc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgYWxsIGxvZ2ljYWwgdm9sdW1lcyBmb3Igdm9sdW1lIGdyb3VwICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC9pbXBvcnRfdnNuMS5jOjc4MgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZml4dXAgbWlycm9yIHBvaW50ZXJzIGFmdGVyIGltcG9ydCBmb3Igdm9sdW1lIGdyb3VwICVzLiIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC90YWdzLmM6NjIKK21zZ2lkICJGb3VuZCBhIHRhZyB0aGF0IGlzIG5vdCBhIHN0cmluZyIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC90ZXh0X2xhYmVsLmM6OTggZm9ybWF0X3RleHQvdGV4dF9sYWJlbC5jOjEwMworbXNnaWQgInN0cnVjdCBkYXRhX2FyZWFfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBmb3JtYXRfdGV4dC90ZXh0X2xhYmVsLmM6MTM4IGZvcm1hdF90ZXh0L3RleHRfbGFiZWwuYzoxNDkKK21zZ2lkICJzdHJ1Y3QgbWRhX2xpc3QgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogZm9ybWF0X3RleHQvdGV4dF9sYWJlbC5jOjE0MyBmb3JtYXRfdGV4dC90ZXh0X2xhYmVsLmM6MTU0Cittc2dpZCAic3RydWN0IG1kYV9jb250ZXh0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGxhYmVsL2xhYmVsLmM6NDkKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxhYmVsbGVyIGxpc3Qgb2JqZWN0LiIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjEyMyBsYWJlbC9sYWJlbC5jOjIxOAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogRmFpbGVkIHRvIHJlYWQgbGFiZWwgYXJlYSIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjEzNSBsYWJlbC9sYWJlbC5jOjE2NAorIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyBhZGRpdGlvbmFsIGxhYmVsIG9uICVzIGF0IHNlY3RvciAlbHUiCittc2dzdHIgIiIKKworIzogbGFiZWwvbGFiZWwuYzoxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IExhYmVsIGZvciBzZWN0b3IgJWx1IGZvdW5kIGF0IHNlY3RvciAlbHUgLSBpZ25vcmluZyIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJMYWJlbCBjaGVja3N1bSBpbmNvcnJlY3Qgb24gJXMgLSBpZ25vcmluZyIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXMgbGFiZWwgZGV0ZWN0ZWQiCittc2dzdHIgIiIKKworIzogbGFiZWwvbGFiZWwuYzoxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vIGxhYmVsIGRldGVjdGVkIgorbXNnc3RyICIiCisKKyM6IGxhYmVsL2xhYmVsLmM6MjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nIGZvciBsYWJlbHMgdG8gd2lwZSBmcm9tICVzIgorbXNnc3RyICIiCisKKyM6IGxhYmVsL2xhYmVsLmM6MjQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBXaXBpbmcgbGFiZWwgYXQgc2VjdG9yICVsdSIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjI0OAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVtb3ZlIGxhYmVsIGZyb20gJXMgYXQgc2VjdG9yICVsdSIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjMwNAorbXNnaWQgIkxhYmVsIGhhbmRsZXIgZG9lcyBub3Qgc3VwcG9ydCBsYWJlbCB3cml0ZXMiCittc2dzdHIgIiIKKworIzogbGFiZWwvbGFiZWwuYzozMDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGFiZWwgc2VjdG9yICVsdSBiZXlvbmQgcmFuZ2UgKCVsZCkiCittc2dzdHIgIiIKKworIzogbGFiZWwvbGFiZWwuYzozMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFdyaXRpbmcgbGFiZWwgdG8gc2VjdG9yICVsdSIKK21zZ3N0ciAiIgorCisjOiBsYWJlbC9sYWJlbC5jOjMzNgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gd3JpdGUgbGFiZWwgdG8gJXMiCittc2dzdHIgIiIKKworIzogbGFiZWwvbGFiZWwuYzozODYKK21zZ2lkICJsYWJlbCBhbGxvY2FjdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9jbHVzdGVyX2xvY2tpbmcuYzo2OQorIywgYy1mb3JtYXQKK21zZ2lkICJMb2NhbCBzb2NrZXQgY3JlYXRpb24gZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjgyCisjLCBjLWZvcm1hdAorbXNnaWQgImNvbm5lY3QoKSBmYWlsZWQgb24gbG9jYWwgc29ja2V0OiAlcyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjEwOQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciB3cml0aW5nIGRhdGEgdG8gY2x2bWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvY2x1c3Rlcl9sb2NraW5nLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgZGF0YSBmcm9tIGNsdm1kOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjEyMworbXNnaWQgIkVPRiByZWFkaW5nIENMVk1EIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvY2x1c3Rlcl9sb2NraW5nLmM6MTU2CisjLCBjLWZvcm1hdAorbXNnaWQgImNsdXN0ZXIgcmVxdWVzdCBmYWlsZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvY2x1c3Rlcl9sb2NraW5nLmM6MzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgImNsdm1kIG5vdCBydW5uaW5nIG9uIG5vZGUgJXMiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9jbHVzdGVyX2xvY2tpbmcuYzozNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgbG9ja2luZyBvbiBub2RlICVzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjQwMiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjI2NgorIzogbG9ja2luZy9sb2NraW5nLmM6MjY1IGxvY2tpbmcvbm9fbG9ja2luZy5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXNlZCBsb2NrIHNjb3BlOiAlZCIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2NsdXN0ZXJfbG9ja2luZy5jOjQwOAorIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nICVzIGF0IDB4JXgiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9leHRlcm5hbF9sb2NraW5nLmM6NjQKK21zZ2lkICJFeHRlcm5hbCBsb2NraW5nIGFscmVhZHkgaW5pdGlhbGlzZWQiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9leHRlcm5hbF9sb2NraW5nLmM6ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2hhcmVkIGxpYnJhcnkgJXMgZG9lcyBub3QgY29udGFpbiBsb2NraW5nIGZ1bmN0aW9ucyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2V4dGVybmFsX2xvY2tpbmcuYzo5MworIywgYy1mb3JtYXQKK21zZ2lkICJMb2FkZWQgZXh0ZXJuYWwgbG9ja2luZyBsaWJyYXJ5ICVzIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5sb2NraW5nICVzIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6MTExCittc2dpZCAiQ1RSTC1jIGRldGVjdGVkOiBnaXZpbmcgdXAgd2FpdGluZyBmb3IgbG9jayIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjE0OQorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbmlzZWQgbG9jayB0eXBlOiAlZCIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nICVzICVjJWMiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9maWxlX2xvY2tpbmcuYzoyMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5sb2NraW5nIExWICVzIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvZmlsZV9sb2NraW5nLmM6MjQyCisjLCBjLWZvcm1hdAorbXNnaWQgIkxvY2tpbmcgTFYgJXMgKE5MKSIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjI0NworIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nIExWICVzIChSKSIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjI1MgorIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nIExWICVzIChXKSIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2ZpbGVfbG9ja2luZy5jOjI1NworIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nIExWICVzIChFWCkiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9sb2NraW5nLmM6MTMzCittc2dpZCAiIgorIldBUk5JTkc6IExvY2tpbmcgZGlzYWJsZWQuIEJlIGNhcmVmdWwhIFRoaXMgY291bGQgY29ycnVwdCB5b3VyIG1ldGFkYXRhLiIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2xvY2tpbmcuYzoxMzgKK21zZ2lkICJGaWxlLWJhc2VkIGxvY2tpbmcgc2VsZWN0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjE0NgorbXNnaWQgIkV4dGVybmFsIGxvY2tpbmcgc2VsZWN0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjE1NgorbXNnaWQgIkZhbGxpbmcgYmFjayB0byBpbnRlcm5hbCBjbHVzdGVyZWQgbG9ja2luZy4iCittc2dzdHIgIiIKKworIzogbG9ja2luZy9sb2NraW5nLmM6MTYwCittc2dpZCAiQ2x1c3RlciBsb2NraW5nIHNlbGVjdGVkLiIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2xvY2tpbmcuYzoxNjcKK21zZ2lkICJVbmtub3duIGxvY2tpbmcgdHlwZSByZXF1ZXN0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjE3NAorbXNnaWQgIldBUk5JTkc6IEZhbGxpbmcgYmFjayB0byBsb2NhbCBmaWxlLWJhc2VkIGxvY2tpbmcuIgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjE3NQorbXNnaWQgIlZvbHVtZSBHcm91cHMgd2l0aCB0aGUgY2x1c3RlcmVkIGF0dHJpYnV0ZSB3aWxsIGJlIGluYWNjZXNzaWJsZS4iCittc2dzdHIgIiIKKworIzogbG9ja2luZy9sb2NraW5nLmM6MTg1Cittc2dpZCAiTG9ja2luZyBkaXNhYmxlZCAtIG9ubHkgcmVhZCBvcGVyYXRpb25zIHBlcm1pdHRlZC4iCittc2dzdHIgIiIKKworIzogbG9ja2luZy9sb2NraW5nLmM6MjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkxWTTEgcHJvYyBWRyBwYXRobmFtZSB0b28gbG9uZyBmb3IgJXMiCittc2dzdHIgIiIKKworIzogbG9ja2luZy9sb2NraW5nLmM6MjE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGV4aXN0czogSXMgdGhlIG9yaWdpbmFsIExWTSBkcml2ZXIgdXNpbmcgdGhpcyB2b2x1bWUgZ3JvdXA/IgorbXNnc3RyICIiCisKKyM6IGxvY2tpbmcvbG9ja2luZy5jOjMwMiBsdnJlc2l6ZS5jOjU3MworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc3VzcGVuZCAlcyIKK21zZ3N0ciAiIgorCisjOiBsb2NraW5nL2xvY2tpbmcuYzozMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGFjdGl2YXRlICVzIgorbXNnc3RyICIiCisKKyM6IGxvZy9sb2cuYzoxNDUKK21zZ2lkICJUZXN0IG1vZGU6IE1ldGFkYXRhIHdpbGwgTk9UIGJlIHVwZGF0ZWQuIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgXCIlc1wiIGlzIGFscmVhZHkgd3JpdGFibGUiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozMworIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSBcIiVzXCIgaXMgYWxyZWFkeSByZWFkIG9ubHkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0MAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgY2hhbmdlIHBlcm1pc3Npb25zIG9mIG1pcnJvciBcIiVzXCIgd2hpbGUgYWN0aXZlLiIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiIHJlYWQvd3JpdGUiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1MQorIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiByZWFkLW9ubHkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1NSBsdmNoYW5nZS5jOjMxNCBsdmNoYW5nZS5jOjM1MCBsdmNoYW5nZS5jOjM5MyBsdmNoYW5nZS5jOjQ3MAorIzogbHZjaGFuZ2UuYzo1MjQgbHZjb252ZXJ0LmM6NDAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBvbiBkaXNrKHMpIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NjQgbHZjaGFuZ2UuYzo0MDIgbHZjb252ZXJ0LmM6NDA5IG1ldGFkYXRhL21pcnJvci5jOjIyNworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gbG9jayAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjc0IGx2Y2hhbmdlLmM6NDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIHBlcm1pc3Npb25zIGZvciBcIiVzXCIgaW4ga2VybmVsIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NzYgbHZjaGFuZ2UuYzo0MTQgbHZjb252ZXJ0LmM6NDIyIGx2cmVzaXplLmM6NTg1CisjOiBtZXRhZGF0YS9taXJyb3IuYzoyNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJvYmxlbSByZWFjdGl2YXRpbmcgJXMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo4OQorIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSwgJXMsIGlzIG5vdCBhY3RpdmUiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzoxMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGVhY3RpdmF0aW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBsb2NhbGx5IgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkRlYWN0aXZhdGluZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9ja2luZyBmYWlsZWQ6IGlnbm9yaW5nIGNsdXN0ZXJlZCBsb2dpY2FsIHZvbHVtZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJBY3RpdmF0aW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBleGNsdXNpdmVseSIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJBY3RpdmF0aW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBsb2NhbGx5IgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFjdGl2YXRpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTU3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNwYXduaW5nIGJhY2tncm91bmQgcHZtb3ZlIHByb2Nlc3MgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlZnJlc2hpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiIChpZiBhY3RpdmUpIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byByZXN5bmMgJXMgYmVjYXVzZSBpdCBpcyBub3QgbWlycm9yZWQuIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byByZXN5bmMgcHZtb3ZlIHZvbHVtZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjE5NAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gcmVzeW5jIGxvY2tlZCB2b2x1bWUgJXMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzoyMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVzeW5jIG9wZW4gbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBub3QgcmVzeW5jZWQiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzoyMjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgZ2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gY2x1c3RlcmVkIHZvbHVtZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjIyNgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGVhY3RpdmF0ZSAlcyBmb3IgcmVzeW5jIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN0YXJ0aW5nIHJlc3luYyBvZiAlcyVzJXMgbWlycm9yIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjI0NgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhY3RpdmF0ZSAlcyB0byByZXN5bmNocm9uaXplIG1pcnJvciIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjI2MgorbXNnaWQgIkZhaWxlZCB0byB3cml0ZSBpbnRlcm1lZGlhdGUgVkcgbWV0YWRhdGEuIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6Mjc2Cittc2dpZCAiRmFpbGVkIHRvIGNvbW1pdCBpbnRlcm1lZGlhdGUgVkcgbWV0YWRhdGEuIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6Mjg4CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBhY3RpdmF0ZSAlcyBmb3IgbWlycm9yIGxvZyByZXN5bmMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2xlYXJpbmcgbG9nIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjI5NQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gcmVzZXQgc3luYyBzdGF0dXMgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6Mjk3Cittc2dpZCAiRmFpbGVkIHRvIGRlYWN0aXZhdGUgbG9nIExWIGFmdGVyIHdpcGluZyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRlYWN0aXZhdGUgbG9nIExWICVzIGFmdGVyIHdpcGluZyBmb3IgcmVzeW5jIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6MzE2Cittc2dpZCAiRmFpbGVkIHRvIHVwZGF0ZSBtZXRhZGF0YSBvbiBkaXNrLiIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjMyMQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhY3RpdmF0ZSAlcyBhZnRlciByZXN5bmMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWxsb2NhdGlvbiBwb2xpY3kgb2YgbG9naWNhbCB2b2x1bWUgXCIlc1wiIGlzIGFscmVhZHkgJXMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBjb250aWd1b3VzIGFsbG9jYXRpb24gcG9saWN5IGZvciBcIiVzXCIgdG8gJXMiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVhZCBhaGVhZCBpcyBhbHJlYWR5ICV1IGZvciBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzozOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyByZWFkIGFoZWFkIHRvICV1IGZvciBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWlub3IgbnVtYmVyIGlzIGFscmVhZHkgbm90IHBlcnNpc3RlbnQgZm9yIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjQzNgorIywgYy1mb3JtYXQKK21zZ2lkICJEaXNhYmxpbmcgcGVyc2lzdGVudCBkZXZpY2UgbnVtYmVyIGZvciBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0NDAKK21zZ2lkICJNaW5vciBudW1iZXIgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCAtTXkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0NDQKK21zZ2lkICJNYWpvciBudW1iZXIgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCAtTXkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgZGV2aWNlIG51bWJlciBub3QgY2hhbmdlZC4iCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5zdXJpbmcgJXMgaXMgaW5hY3RpdmUuIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBkZWFjdGl2YXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NDY1CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgcGVyc2lzdGVudCBkZXZpY2UgbnVtYmVyIHRvICglZCwgJWQpIGZvciBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmUtYWN0aXZhdGluZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHJlYWN0aXZhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1MDAgbHZjcmVhdGUuYzo2ODAgcHZjaGFuZ2UuYzo0OSB2Z2NoYW5nZS5jOjQ0MCB2Z2NyZWF0ZS5jOjEwNworbXNnaWQgIkZhaWxlZCB0byBnZXQgdGFnIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzLyVzIGRvZXMgbm90IHN1cHBvcnQgdGFncyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjUxMiBsdmNyZWF0ZS5jOjc0NgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gYWRkIHRhZyAlcyB0byAlcy8lcyIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjUxOAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVtb3ZlIHRhZyAlcyBmcm9tICVzLyVzIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIk9ubHkgLWEgcGVybWl0dGVkIHdpdGggcmVhZC1vbmx5IHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY2hhbmdlIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiB1bmRlciBzbmFwc2hvdCIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjU2NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBjaGFuZ2Ugc25hcHNob3QgbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjaGFuZ2UgcHZtb3ZlIExWICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NTc0Cittc2dpZCAiVXNlICdwdm1vdmUgLS1hYm9ydCcgdG8gYWJhbmRvbiBhIHB2bW92ZSIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjU3OQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY2hhbmdlIG1pcnJvciBsb2cgTFYgJXMgZGlyZWN0bHkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNoYW5nZSBtaXJyb3IgaW1hZ2UgTFYgJXMgZGlyZWN0bHkiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo1OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNoYW5nZSBpbnRlcm5hbCBMViAlcyBkaXJlY3RseSIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjY0OAorIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSBcIiVzXCIgY2hhbmdlZCIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjY4MworbXNnaWQgIiIKKyJOZWVkIDEgb3IgbW9yZSBvZiAtYSwgLUMsIC1qLCAtbSwgLU0sIC1wLCAtciwgLS1yZXN5bmMsIC0tcmVmcmVzaCwgLS1hbGxvYywgIgorIi0tYWRkdGFnLCAtLWRlbHRhZyBvciAtLW1vbml0b3IiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo2OTQKK21zZ2lkICJPbmx5IC1hIHBlcm1pdHRlZCB3aXRoIC0taWdub3JlbG9ja2luZ2ZhaWx1cmUiCittc2dzdHIgIiIKKworIzogbHZjaGFuZ2UuYzo2OTkKK21zZ2lkICJQbGVhc2UgZ2l2ZSBsb2dpY2FsIHZvbHVtZSBwYXRoKHMpIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NzA1Cittc2dpZCAiLS1tYWpvciBhbmQgLS1taW5vciByZXF1aXJlIC1NeSIKK21zZ3N0ciAiIgorCisjOiBsdmNoYW5nZS5jOjcxMAorbXNnaWQgIk9ubHkgZ2l2ZSBvbmUgbG9naWNhbCB2b2x1bWUgd2hlbiBzcGVjaWZ5aW5nIG1pbm9yIgorbXNnc3RyICIiCisKKyM6IGx2Y2hhbmdlLmM6NzE1Cittc2dpZCAiT25seSBvbmUgb2YgLS1hbGxvYyBhbmQgLS1jb250aWd1b3VzIHBlcm1pdHRlZCIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1MCBsdmNyZWF0ZS5jOjY5Cittc2dpZCAiUGxlYXNlIHNwZWNpZnkgYSBsb2dpY2FsIHZvbHVtZSB0byBhY3QgYXMgdGhlIHNuYXBzaG90IG9yaWdpbi4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NTggbHZjcmVhdGUuYzo3NworbXNnaWQgIlRoZSBvcmlnaW4gbmFtZSBzaG91bGQgaW5jbHVkZSB0aGUgdm9sdW1lIGdyb3VwLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo2OQorbXNnaWQgIlBsZWFzZSBwcm92aWRlIGxvZ2ljYWwgdm9sdW1lIHBhdGgiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NzkgbHZyZW5hbWUuYzozOAorIywgYy1mb3JtYXQKK21zZ2lkICJQbGVhc2UgdXNlIGEgc2luZ2xlIHZvbHVtZSBncm91cCBuYW1lIChcIiVzXCIgb3IgXCIlc1wiKSIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo4OCBsdnJlbmFtZS5jOjUyCittc2dpZCAiUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB2b2x1bWUgZ3JvdXAgbmFtZSIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzoxMTAKK21zZ2lkICJFeGFjdGx5IG9uZSBvZiAtLW1pcnJvcnMgb3IgLS1zbmFwc2hvdCBhcmd1bWVudHMgcmVxdWlyZWQuIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjEyOQorbXNnaWQgIi0tcmVnaW9uc2l6ZSBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIG1pcnJvcnMiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MTM0IGx2Y3JlYXRlLmM6MzM2Cittc2dpZCAiTmVnYXRpdmUgY2h1bmsgc2l6ZSBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjE0MCBsdmNyZWF0ZS5jOjM0MgorbXNnaWQgIkNodW5rIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlIHJhbmdlIDRLIHRvIDUxMksiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MTQ0IGx2Y3JlYXRlLmM6MzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgY2h1bmtzaXplIHRvICVkIHNlY3RvcnMuIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjE1NgorbXNnaWQgIi0tY2h1bmtzaXplIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggc25hcHNob3RzIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjE2MgorbXNnaWQgIi0temVybyBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIHNuYXBzaG90cyIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzoxNzQgbHZjcmVhdGUuYzoyNTMKK21zZ2lkICJOZWdhdGl2ZSByZWdpb25zaXplIGlzIGludmFsaWQiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MTg0IGx2Y3JlYXRlLmM6MjYyCittc2dpZCAiTmVnYXRpdmUgcmVnaW9uc2l6ZSBpbiBjb25maWd1cmF0aW9uIGZpbGUgaXMgaW52YWxpZCIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzoxOTIgbHZjcmVhdGUuYzoyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVnaW9uIHNpemUgKCV1KSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgbWFjaGluZSBtZW1vcnkgcGFnZSBzaXplICglZCkiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MjAwIGx2Y3JlYXRlLmM6MjcwCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlZ2lvbiBzaXplICgldSkgbXVzdCBiZSBhIHBvd2VyIG9mIDIiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MjA2IGx2Y3JlYXRlLmM6MjgzCittc2dpZCAiTm9uLXplcm8gcmVnaW9uIHNpemUgbXVzdCBiZSBzdXBwbGllZC4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MjE2IGx2Y3JlYXRlLmM6MzkwIG1ldGFkYXRhL21pcnJvci5jOjU2NgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogUmVxdWlyZWQgZGV2aWNlLW1hcHBlciB0YXJnZXQocykgbm90IGRldGVjdGVkIGluIHlvdXIga2VybmVsIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjI0OQorIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSAlcyBvbmx5IGhhcyAldSBtaXJyb3JzLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzoyNTkKK21zZ2lkICJNaXJyb3IgbG9nIHJlZ2lvbiBzaXplIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGV4aXN0aW5nIG1pcnJvci4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIGlzIGFscmVhZHkgbm90IG1pcnJvcmVkLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzoyNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgJXMgaGFzIG11bHRpcGxlIG1pcnJvciBzZWdtZW50cy4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6Mjg3IGx2Y29udmVydC5jOjMyMAorbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgbWlycm9yIHN5bmMgc3RhdHVzLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzozMTEgbHZjb252ZXJ0LmM6Mzg5IGx2Y3JlYXRlLmM6NzIxCittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSBtaXJyb3IgbG9nLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgJXMgYWxyZWFkeSBoYXMgJXUgbWlycm9yKHMpLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzozNDYKK21zZ2lkICJBZGRpbmcgbWlycm9yIGltYWdlcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6MzYzCittc2dpZCAiTWlycm9ycyBvZiBzdHJpcGVkIHZvbHVtZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo0MTkgbWV0YWRhdGEvbWlycm9yLmM6MjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIFwiJXNcIiBpbiBrZXJuZWwiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NDI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIGNvbnZlcnRlZC4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NDM4IGx2Y3JlYXRlLmM6NjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgb3JpZ2luIHZvbHVtZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo0NDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNyZWF0ZSBhIHNuYXBzaG90IG9mIGEgJXMgTFYuIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjQ1MCBsdmNyZWF0ZS5jOjc5OQorIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiBcIiVzXCIgbm90IHplcm9lZCIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo0NTIKK21zZ2lkICJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgc25hcHNob3QgZXhjZXB0aW9uIHN0b3JlLiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo0NTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgZGVhY3RpdmF0ZSBMViAlcy4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NDY0IGx2Y3JlYXRlLmM6ODEyCittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIHNuYXBzaG90LiIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo0NzUgbHZjcmVhdGUuYzo4MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHN1c3BlbmQgb3JpZ2luICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjQ4NCBsdmNyZWF0ZS5jOjgzMAorIywgYy1mb3JtYXQKK21zZ2lkICJQcm9ibGVtIHJlYWN0aXZhdGluZyBvcmlnaW4gJXMiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIGNvbnZlcnRlZCB0byBzbmFwc2hvdC4iCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBjb252ZXJ0IGxvY2tlZCBMViAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY29udmVydCBsb2dpY2FsIHZvbHVtZSBcIiVzXCIgdW5kZXIgc25hcHNob3QiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NTEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGNvbnZlcnQgc25hcHNob3QgbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjUxNgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29udmVydCBwdm1vdmUgTFYgJXMiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NTQ4IGx2cmVuYW1lLmM6MTAwIHZncmVuYW1lLmM6NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hlY2tpbmcgZm9yIGV4aXN0aW5nIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZjb252ZXJ0LmM6NTUxIGx2Y3JlYXRlLmM6ODYzIGx2cmVuYW1lLmM6MTAzIGx2cmVzaXplLmM6NjEzIHB2Y2hhbmdlLmM6NTkKKyM6IHB2bW92ZS5jOjU5IHB2cmVzaXplLmM6NjkgdmdjcmVhdGUuYzoxNDAgdmdleHRlbmQuYzo1MyB2Z21lcmdlLmM6MzQKKyM6IHZnbWVyZ2UuYzo2NSB2Z3JlZHVjZS5jOjQ3NiB2Z3JlbmFtZS5jOjk0IHZncmVuYW1lLmM6MTMzIHZnc3BsaXQuYzoyNDAKKyM6IHZnc3BsaXQuYzoyNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgZ2V0IGxvY2sgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y29udmVydC5jOjU1NiBsdmNyZWF0ZS5jOjQ5MiBsdnJlbmFtZS5jOjEwOCBwdm1vdmUuYzo2NCB2Z2Rpc3BsYXkuYzoyNAorIzogdmdtZXJnZS5jOjM5IHZnbWVyZ2UuYzo3MiB2Z3JlZHVjZS5jOjQ4MiB2Z3NwbGl0LmM6MjQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgZG9lc24ndCBleGlzdCIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1NjIgbHZjcmVhdGUuYzo0OTggbHZyZW5hbWUuYzoxMTQgbHZyZXNpemUuYzoxNDYgcHZjaGFuZ2UuYzo3MgorIzogcHZkaXNwbGF5LmM6NDEgcHZtb3ZlLmM6NzEgcHZyZXNpemUuYzo4MyByZXBvcnRlci5jOjc2IHJlcG9ydGVyLmM6MTI0CisjOiB0b29sbGliLmM6MzYzIHRvb2xsaWIuYzozODMgdG9vbGxpYi5jOjQ5MCB0b29sbGliLmM6NzQxIHZnZXh0ZW5kLmM6NjQKKyM6IHZnbWVyZ2UuYzo0NiB2Z21lcmdlLmM6NzggdmdyZWR1Y2UuYzo0ODkgdmdyZWR1Y2UuYzo1MTEgdmdyZW5hbWUuYzoxMDcKKyM6IHZnc3BsaXQuYzoyNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2tpcHBpbmcgY2x1c3RlcmVkIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1NjcgbHZjcmVhdGUuYzo1MDMgbHZyZW5hbWUuYzoxMTkgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMzc3CisjOiBwb2xsZGFlbW9uLmM6MTk1IHB2Y2hhbmdlLmM6NzggcHZtb3ZlLmM6NzYgcHZyZXNpemUuYzo4OSB0b29sbGliLmM6MTYzCisjOiB2Z2NoYW5nZS5jOjUzNCB2Z2NrLmM6MzQgdmdjb252ZXJ0LmM6NTQgdmdleHRlbmQuYzo2OSB2Z21lcmdlLmM6NTIKKyM6IHZnbWVyZ2UuYzo4MyB2Z3JlZHVjZS5jOjU0MSB2Z3JlbW92ZS5jOjM1IHZncmVuYW1lLmM6MTEzIHZnc3BsaXQuYzoyNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBleHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1NzIgbHZjcmVhdGUuYzo1MDggbHZyZW1vdmUuYzoyOCBsdnJlbmFtZS5jOjEyNCBwdmNoYW5nZS5jOjg0CisjOiBwdm1vdmUuYzo4MiBwdnJlc2l6ZS5jOjk1IHZnY2hhbmdlLmM6NTI5IHZnY29udmVydC5jOjQ5IHZnZXhwb3J0LmM6NDIKKyM6IHZnZXh0ZW5kLmM6NzQgdmdtZXJnZS5jOjU4IHZnbWVyZ2UuYzo4OCB2Z3JlZHVjZS5jOjU0NyB2Z3JlbmFtZS5jOjExNworIzogdmdzcGxpdC5jOjI3MAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIHJlYWQtb25seSIKK21zZ3N0ciAiIgorCisjOiBsdmNvbnZlcnQuYzo1NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgXCIlc1wiIG5vdCBmb3VuZCBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6OTMgbHZyZXNpemUuYzoxMDUKK21zZ2lkICJQbGVhc2UgcHJvdmlkZSBhIHZvbHVtZSBncm91cCBuYW1lIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MTAwCittc2dpZCAiVm9sdW1lIGdyb3VwIG5hbWUgZXhwZWN0ZWQgKG5vIHNsYXNoKSIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJJbmNvbnNpc3RlbnQgdm9sdW1lIGdyb3VwIG5hbWVzIGdpdmVuOiBcIiVzXCIgYW5kIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjEzOAorIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSBuYW1lIFwiJXNcIiBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MTUxIGx2cmVzaXplLmM6NjUKK21zZ2lkICJQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgc2l6ZSBvciBleHRlbnRzIChub3QgYm90aCkiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzoxNTcKK21zZ2lkICJOZWdhdGl2ZSBudW1iZXIgb2YgZXh0ZW50cyBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MTY3Cittc2dpZCAiTmVnYXRpdmUgc2l6ZSBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MTg5Cittc2dpZCAiTmVnYXRpdmUgc3RyaXBlc2l6ZSBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MTk0IGx2cmVzaXplLmM6MTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN0cmlwZSBzaXplIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjIwMgorbXNnaWQgIklnbm9yaW5nIHN0cmlwZXNpemUgYXJndW1lbnQgd2l0aCBzaW5nbGUgc3RyaXBlIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MjEwIGx2cmVzaXplLmM6MzMwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIGRlZmF1bHQgc3RyaXBlc2l6ZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjIxNQorIywgYy1mb3JtYXQKK21zZ2lkICJUb28gZmV3IHBoeXNpY2FsIHZvbHVtZXMgb24gY29tbWFuZCBsaW5lIGZvciAlZC13YXkgc3RyaXBpbmciCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzoyMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTnVtYmVyIG9mIHN0cmlwZXMgKCVkKSBtdXN0IGJlIGJldHdlZW4gJWQgYW5kICVkIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MjI5IGx2cmVzaXplLmM6NDA3CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgc3RyaXBlIHNpemUgJXMiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzoyNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVG9vIGZldyBwaHlzaWNhbCB2b2x1bWVzIG9uIGNvbW1hbmQgbGluZSBmb3IgJWQtd2F5IG1pcnJvcmluZyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjMwOQorbXNnaWQgIlJlZHVuZGFudCBzdHJpcGVzIGFyZ3VtZW50OiBkZWZhdWx0IGlzIDEiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzozMjMKK21zZ2lkICJSZWR1bmRhbnQgbWlycm9ycyBhcmd1bWVudDogZGVmYXVsdCBpcyAwIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MzI1IGx2cmVzaXplLmM6MTgwCittc2dpZCAiTWlycm9ycyBhcmd1bWVudCBtYXkgbm90IGJlIG5lZ2F0aXZlIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MzMyCittc2dpZCAiLVogaXMgaW5jb21wYXRpYmxlIHdpdGggc25hcHNob3RzIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6MzU0Cittc2dpZCAiLWMgaXMgb25seSBhdmFpbGFibGUgd2l0aCBzbmFwc2hvdHMiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzozNjEKK21zZ2lkICJtaXJyb3JzIGFuZCBzbmFwc2hvdHMgYXJlIGN1cnJlbnRseSBpbmNvbXBhdGlibGUiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzozNjcKK21zZ2lkICJtaXJyb3JzIGFuZCBzdHJpcGVzIGFyZSBjdXJyZW50bHkgaW5jb21wYXRpYmxlIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6Mzc4Cittc2dpZCAiLS1jb3JlbG9nIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggbWlycm9ycyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjM4MworbXNnaWQgIi0tbm9zeW5jIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggbWlycm9ycyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjQxOQorbXNnaWQgIkNvbmZsaWN0aW5nIGNvbnRpZ3VvdXMgYW5kIGFsbG9jIGFyZ3VtZW50cyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjQ0OAorbXNnaWQgIlBsZWFzZSBzcGVjaWZ5IG1pbm9yIG51bWJlciB3aXRoIC0tbWlub3Igd2hlbiB1c2luZyAtTXkiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo0NTMKK21zZ2lkICJQbGVhc2Ugc3BlY2lmeSBtYWpvciBudW1iZXIgd2l0aCAtLW1ham9yIHdoZW4gdXNpbmcgLU15IgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NDU5Cittc2dpZCAiLS1tYWpvciBhbmQgLS1taW5vciBpbmNvbXBhdGlibGUgd2l0aCAtTW4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo0ODkgcHZtb3ZlLmM6MzA1IHRvb2xsaWIuYzo0ODEgdmdyZWR1Y2UuYzo0NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmluZGluZyB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NTEzIGx2cmVuYW1lLmM6MTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NTE5Cittc2dpZCAiTWV0YWRhdGEgZG9lcyBub3Qgc3VwcG9ydCBtaXJyb3JpbmcuIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlZHVjaW5nIHJlcXVlc3RlZCBzdHJpcGUgc2l6ZSAlcyB0byBtYXhpbXVtLCBwaHlzaWNhbCBleHRlbnQgc2l6ZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjU0NworIywgYy1mb3JtYXQKK21zZ2lkICJTdHJpcGUgc2l6ZSBtYXkgbm90IGV4Y2VlZCAlcyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjU1OSBsdnJlc2l6ZS5jOjIzNworIywgYy1mb3JtYXQKK21zZ2lkICJSb3VuZGluZyB1cCBzaXplIHRvIGZ1bGwgcGh5c2ljYWwgZXh0ZW50ICVzIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSB0b28gbGFyZ2UgKCVzKSBmb3IgZXh0ZW50IHNpemUgJXMuIFVwcGVyIGxpbWl0IGlzICVzLiIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjU4MworIywgYy1mb3JtYXQKK21zZ2lkICJQbGVhc2UgZXhwcmVzcyBzaXplIGFzICUlVkcgb3IgJSVGUkVFLiIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjU5MAorIywgYy1mb3JtYXQKK21zZ2lkICJSb3VuZGluZyBzaXplICglZCBleHRlbnRzKSB1cCB0byBzdHJpcGUgYm91bmRhcnkgc2l6ZSAoJWQgZXh0ZW50cykiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo1OTgKK21zZ2lkICJDYW4ndCBjcmVhdGUgc25hcHNob3Qgd2l0aG91dCB1c2luZyBkZXZpY2UtbWFwcGVyIGtlcm5lbCBkcml2ZXIiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo2MDQKK21zZ2lkICJDbHVzdGVyZWQgc25hcHNob3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo2MTMKK21zZ2lkICJTbmFwc2hvdHMgb2Ygc25hcHNob3RzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo2MTgKK21zZ2lkICJTbmFwc2hvdHMgb2YgbG9ja2VkIGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NjI1Cittc2dpZCAiU25hcHNob3RzIGFuZCBtaXJyb3JzIG1heSBub3QgeWV0IGJlIG1peGVkLiIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjYzNAorbXNnaWQgIlVuYWJsZSB0byBjcmVhdGUgbmV3IGxvZ2ljYWwgdm9sdW1lIHdpdGggbm8gZXh0ZW50cyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjY0MAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnN1ZmZpY2llbnQgZnJlZSBleHRlbnRzICgldSkgaW4gdm9sdW1lIGdyb3VwICVzOiAldSByZXF1aXJlZCIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjY0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOdW1iZXIgb2Ygc3RyaXBlcyAoJXUpIG11c3Qgbm90IGV4Y2VlZCBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcyAoJWQpIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NjUzCittc2dpZCAiQ2FuJ3QgY3JlYXRlIG1pcnJvciB3aXRob3V0IHVzaW5nIGRldmljZS1tYXBwZXIga2VybmVsIGRyaXZlci4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo2NzIKK21zZ2lkICJGYWlsZWQgdG8gZ2VuZXJhdGUgTFYgbmFtZS4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo2ODUgdmdjaGFuZ2UuYzo0NDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwICVzIGRvZXMgbm90IHN1cHBvcnQgdGFncyIKK21zZ3N0ciAiIgorCisjOiBsdmNyZWF0ZS5jOjcwOQorbXNnaWQgIiIKKyJXQVJOSU5HOiBOZXcgbWlycm9yIHdvbid0IGJlIHN5bmNocm9uaXNlZC4gRG9uJ3QgcmVhZCB3aGF0IHlvdSBkaWRuJ3Qgd3JpdGUhIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NzMzCittc2dpZCAiU2V0dGluZyByZWFkIGFoZWFkIHNlY3RvcnMiCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo3NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBkZXZpY2UgbnVtYmVyIHRvICglZCwgJWQpIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6NzgyCittc2dpZCAiIgorIkFib3J0aW5nLiBGYWlsZWQgdG8gYWN0aXZhdGUgc25hcHNob3QgZXhjZXB0aW9uIHN0b3JlLiBSZW1vdmUgbmV3IExWIGFuZCAiCisicmV0cnkuIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6Nzg3Cittc2dpZCAiRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyBMVi4iCittc2dzdHIgIiIKKworIzogbHZjcmVhdGUuYzo3OTQKK21zZ2lkICIiCisiQWJvcnRpbmcuIEZhaWxlZCB0byB3aXBlIHNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZS4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IGx2Y3JlYXRlLmM6ODM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBjcmVhdGVkIgorbXNnc3RyICIiCisKKyM6IGx2ZGlzcGxheS5jOjM5IGx2ZGlzcGxheS5jOjQ4IHB2ZGlzcGxheS5jOjg5IHB2ZGlzcGxheS5jOjk5IHZnZGlzcGxheS5jOjY3CisjOiB2Z2Rpc3BsYXkuYzo3NgorbXNnaWQgIkluY29tcGF0aWJsZSBvcHRpb25zIHNlbGVjdGVkIgorbXNnc3RyICIiCisKKyM6IGx2ZGlzcGxheS5jOjUzCittc2dpZCAiT3B0aW9ucyAtdiBhbmQgLWMgYXJlIGluY29tcGF0aWJsZSIKK21zZ3N0ciAiIgorCisjOiBsdm1jaGFuZ2UuYzoyMQorbXNnaWQgIldpdGggTFZNMiBhbmQgdGhlIGRldmljZSBtYXBwZXIsIHRoaXMgcHJvZ3JhbSBpcyBvYnNvbGV0ZS4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjI4OQorbXNnaWQgIk1pbm9yIG51bWJlciBvdXRzaWRlIHJhbmdlIDAtMjU1IgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzozMDQKK21zZ2lkICJNYWpvciBudW1iZXIgb3V0c2lkZSByYW5nZSAwLTI1NSIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NDAyCittc2dpZCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NDUxCittc2dpZCAiT3V0IG9mIG1lbW9yeS4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjUwNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJXM6ICVzXG4iCisiXG4iCisiJXMiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjU5OAorbXNnaWQgIlVucmVjb2duaXNlZCBvcHRpb24uIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo2MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3B0aW9uJXMlYyVzJXMgbWF5IG5vdCBiZSByZXBlYXRlZCIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NjEzCittc2dpZCAiT3B0aW9uIHJlcXVpcmVzIGFyZ3VtZW50LiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NjIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgJXMiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjYzOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBhbmQgJXMgYXJlIHN5bm9ueW1zLiAgUGxlYXNlIG9ubHkgc3VwcGx5IG9uZS4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjY2NworIywgYy1mb3JtYXQKK21zZ2lkICJMVk0gdmVyc2lvbjogICAgICVzIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo2NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGlicmFyeSB2ZXJzaW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkRyaXZlciB2ZXJzaW9uOiAgJXMiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjcwNgorbXNnaWQgIlBhcnRpYWwgbW9kZS4gSW5jb21wbGV0ZSB2b2x1bWUgZ3JvdXBzIHdpbGwgYmUgYWN0aXZhdGVkIHJlYWQtb25seS4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjcyOQorbXNnaWQgIi0tdHJ1c3RjYWNoZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAtLWFsbCIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NzMzCittc2dpZCAiIgorIldBUk5JTkc6IENhY2hlIGZpbGUgb2YgUFZzIHdpbGwgYmUgdHJ1c3RlZC4gIE5ldyBkZXZpY2VzIGhvbGRpbmcgUFZzIG1heSBnZXQgIgorImlnbm9yZWQuIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo3NjcKK21zZ2lkICJBdmFpbGFibGUgbHZtIGNvbW1hbmRzOiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6NzY4Cittc2dpZCAiVXNlICdsdm0gaGVscCA8Y29tbWFuZD4nIGZvciBtb3JlIGluZm9ybWF0aW9uIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo3NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS0xNi4xNnMlcyIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6Nzk0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdmVycmlkZGVuIGNvbmZpZ3VyYXRpb24gZW50cmllcy4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjg1OAorbXNnaWQgIkNvdWxkbid0IGNvcHkgY29tbWFuZCBsaW5lLiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6ODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlBhcnNpbmc6ICVzIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo4NzcKK21zZ2lkICJFcnJvciBkdXJpbmcgcGFyc2luZyBvZiBjb21tYW5kIGxpbmUuIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo4OTAKK21zZ2lkICJVcGRhdGVkIGNvbmZpZyBmaWxlIGludmFsaWQuIEFib3J0aW5nLiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6ODk5CisjLCBjLWZvcm1hdAorbXNnaWQgIlByb2Nlc3Npbmc6ICVzIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzo5MDIKK21zZ2lkICJPX0RJUkVDVCB3aWxsIGJlIHVzZWQiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICJMb2NraW5nIHR5cGUgJWQgaW5pdGlhbGlzYXRpb24gZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6OTI3Cittc2dpZCAiVGVzdCBtb2RlOiBXaXBpbmcgaW50ZXJuYWwgY2FjaGUiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjk1MQorIywgYy1mb3JtYXQKK21zZ2lkICJDb21wbGV0ZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzoxMDczCisjLCBjLWZvcm1hdAorbXNnaWQgIkxpbmUgdG9vIGxvbmcgKG1heCAyNTUpIGJlZ2lubmluZzogJXMiCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjEwODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVG9vIG1hbnkgYXJndW1lbnRzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6MTEyNQorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgTFZNMSB0b29sIHBhdGhuYW1lIgorbXNnc3RyICIiCisKKyM6IGx2bWNtZGxpbmUuYzoxMTczCittc2dpZCAiRmFsbGluZyBiYWNrIHRvIExWTTEgdG9vbHMsIGJ1dCBubyBjb21tYW5kIHNwZWNpZmllZC4iCittc2dzdHIgIiIKKworIzogbHZtY21kbGluZS5jOjExODkKK21zZ2lkICJQbGVhc2Ugc3VwcGx5IGFuIExWTSBjb21tYW5kLiIKK21zZ3N0ciAiIgorCisjOiBsdm1jbWRsaW5lLmM6MTIwMworbXNnaWQgIk5vIHN1Y2ggY29tbWFuZC4gIFRyeSAnaGVscCcuIgorbXNnc3RyICIiCisKKyM6IGx2bWRpc2tzY2FuLmM6MzggbHZtZGlza3NjYW4uYzoxMDgKK21zZ2lkICJkZXZfaXRlcl9jcmVhdGUgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGx2bWRpc2tzY2FuLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJS0qcyBbJTE1c10gJXMiCittc2dzdHIgIiIKKworIzogbHZtZGlza3NjYW4uYzo4MyBsdm1kaXNrc2Nhbi5jOjExNworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBnZXQgc2l6ZSBvZiBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZtZGlza3NjYW4uYzo4OAorIywgYy1mb3JtYXQKK21zZ2lkICJkZXZfY2xvc2Ugb24gXCIlc1wiIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBsdm1kaXNrc2Nhbi5jOjEwMworbXNnaWQgIldBUk5JTkc6IG9ubHkgY29uc2lkZXJpbmcgTFZNIGRldmljZXMiCittc2dzdHIgIiIKKworIzogbHZtZGlza3NjYW4uYzoxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgZGlzayVzIgorbXNnc3RyICIiCisKKyM6IGx2bWRpc2tzY2FuLmM6MTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIHBhcnRpdGlvbiVzIgorbXNnc3RyICIiCisKKyM6IGx2bWRpc2tzY2FuLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIExWTSBwaHlzaWNhbCB2b2x1bWUgd2hvbGUgZGlzayVzIgorbXNnc3RyICIiCisKKyM6IGx2bWRpc2tzY2FuLmM6MTQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIExWTSBwaHlzaWNhbCB2b2x1bWUlcyIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjMzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlbW92ZSBsb2dpY2FsIHZvbHVtZSBcIiVzXCIgdW5kZXIgc25hcHNob3QiCittc2dzdHIgIiIKKworIzogbHZyZW1vdmUuYzozOQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZW1vdmUgbG9naWNhbCB2b2x1bWUgJXMgdXNlZCBieSBhIG1pcnJvciIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjQ1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHJlbW92ZSBsb2dpY2FsIHZvbHVtZSAlcyB1c2VkIGFzIG1pcnJvciBsb2ciCittc2dzdHIgIiIKKworIzogbHZyZW1vdmUuYzo1MQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZW1vdmUgbG9ja2VkIExWICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVtb3ZlLmM6NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVtb3ZlIG9wZW4gbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2cmVtb3ZlLmM6NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgXCIlc1wiIG5vdCByZW1vdmVkIgorbXNnc3RyICIiCisKKyM6IGx2cmVtb3ZlLmM6ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgZ2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBkZWFjdGl2YXRlIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbW92aW5nIHNuYXBzaG90ICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVtb3ZlLmM6MTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbGVhc2luZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZyZW1vdmUuYzoxMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVsZWFzaW5nIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVmcmVzaCAlcyB3aXRob3V0IHNuYXBzaG90LiIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVzdW1lICVzLiIKK21zZ3N0ciAiIgorCisjOiBsdnJlbW92ZS5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJMb2dpY2FsIHZvbHVtZSBcIiVzXCIgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQiCittc2dzdHIgIiIKKworIzogbHZyZW1vdmUuYzoxMzQKK21zZ2lkICJQbGVhc2UgZW50ZXIgb25lIG9yIG1vcmUgbG9naWNhbCB2b2x1bWUgcGF0aHMiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzo0NworbXNnaWQgIk9sZCBhbmQgbmV3IGxvZ2ljYWwgdm9sdW1lIG5hbWVzIHJlcXVpcmVkIgorbXNnc3RyICIiCisKKyM6IGx2cmVuYW1lLmM6NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgbmFtZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHZvbHVtZSBncm91cCAoXCIlc1wiIG9yIFwiJXNcIikiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgbG9naWNhbCB2b2x1bWUgcGF0aCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICV6dSEiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzo4MAorbXNnaWQgIk5ldyBsb2dpY2FsIHZvbHVtZSBuYW1lIG1heSBub3QgYmUgYmxhbmsiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgbG9naWNhbCB2b2x1bWUgbmFtZSBcIiVzXCIgaXMgaW52YWxpZCIKK21zZ3N0ciAiIgorCisjOiBsdnJlbmFtZS5jOjk2Cittc2dpZCAiT2xkIGFuZCBuZXcgbG9naWNhbCB2b2x1bWUgbmFtZXMgbXVzdCBkaWZmZXIiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzoxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhpc3RpbmcgbG9naWNhbCB2b2x1bWUgXCIlc1wiIG5vdCBmb3VuZCBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGx2cmVuYW1lLmM6MTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZW5hbWUgbG9ja2VkIExWICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVuYW1lLmM6MTUwIGx2cmVuYW1lLmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIk1pcnJvcmVkIExWLCBcIiVzXCIgY2Fubm90IGJlIHJlbmFtZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVuYW1lLmM6MTY5Cittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBuZXcgbmFtZSIKK21zZ3N0ciAiIgorCisjOiBsdnJlbmFtZS5jOjE3MyB2Z21lcmdlLmM6MjIzIHZncmVuYW1lLmM6MTY1Cittc2dpZCAiV3JpdGluZyBvdXQgdXBkYXRlZCB2b2x1bWUgZ3JvdXAiCittc2dzdHIgIiIKKworIzogbHZyZW5hbWUuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVuYW1lZCBcIiVzXCIgdG8gXCIlc1wiIGluIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzo4MworbXNnaWQgIk5lZ2F0aXZlIGFyZ3VtZW50IG5vdCBwZXJtaXR0ZWQgLSB1c2UgbHZyZWR1Y2UiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzo4OAorbXNnaWQgIlBvc2l0aXZlIHNpZ24gbm90IHBlcm1pdHRlZCAtIHVzZSBsdmV4dGVuZCIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjk2Cittc2dpZCAiUGxlYXNlIHByb3ZpZGUgdGhlIGxvZ2ljYWwgdm9sdW1lIG5hbWUiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoxNDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwICVzIGRvZXNuJ3QgZXhpc3QiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwICVzIGlzIGV4cG9ydGVkIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCAlcyBpcyByZWFkLW9ubHkiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoxNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgJXMgbm90IGZvdW5kIGluIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjE3MQorbXNnaWQgIlZhcmllZCBzdHJpcGluZyBub3Qgc3VwcG9ydGVkLiBJZ25vcmluZy4iCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoxNzgKK21zZ2lkICJNaXJyb3JzIG5vdCBzdXBwb3J0ZWQuIElnbm9yaW5nLiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjE4NworbXNnaWQgIlN0cmlwZXNpemUgbWF5IG5vdCBiZSBuZWdhdGl2ZS4iCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoxOTgKK21zZ2lkICJWYXJpZWQgc3RyaXBlc2l6ZSBub3Qgc3VwcG9ydGVkLiBJZ25vcmluZy4iCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoyMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVkdWNpbmcgc3RyaXBlIHNpemUgJXMgdG8gbWF4aW11bSwgcGh5c2ljYWwgZXh0ZW50IHNpemUgJXMiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoyMTEKK21zZ2lkICJNaXJyb3JzIGFuZCBzdHJpcGluZyBjYW5ub3QgYmUgY29tYmluZWQgeWV0LiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjIxNQorbXNnaWQgIlN0cmlwZSBzaXplIG11c3QgYmUgcG93ZXIgb2YgMiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjIyMworIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZXNpemUgbG9ja2VkIExWICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byByZWR1Y2UgJXMgYmVsb3cgMSBleHRlbnQiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoyNzIKK21zZ2lkICJOZXcgc2l6ZSBvZiAwIG5vdCBwZXJtaXR0ZWQiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoyNzcgbHZyZXNpemUuYzo0MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmV3IHNpemUgKCVkIGV4dGVudHMpIG1hdGNoZXMgZXhpc3Rpbmcgc2l6ZSAoJWQgZXh0ZW50cykiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzoyOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lVHlwZSBkb2VzIG5vdCBtYXRjaCAoJXMpIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MzA4Cittc2dpZCAiUGxlYXNlIHNwZWNpZnkgbnVtYmVyIG9mIHN0cmlwZXMgKC1pKSBhbmQgc3RyaXBlc2l6ZSAoLUkpIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MzIyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIHN0cmlwZXNpemUgb2YgbGFzdCBzZWdtZW50ICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MzQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkV4dGVuZGluZyAldSBtaXJyb3IgaW1hZ2VzLiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjM1MgorbXNnaWQgIkNhbm5vdCB2YXJ5IG51bWJlciBvZiBtaXJyb3JzIGluIExWIHlldC4iCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzozNjIKK21zZ2lkICJJZ25vcmluZyBzdHJpcGVzLCBzdHJpcGVzaXplIGFuZCBtaXJyb3JzIGFyZ3VtZW50cyB3aGVuIHJlZHVjaW5nIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6MzkxCittc2dpZCAiU3RyaXBlc2l6ZSBmb3Igc3RyaXBlZCBzZWdtZW50IHNob3VsZCBub3QgYmUgMCEiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzo0MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlJvdW5kaW5nIHNpemUgKCVkIGV4dGVudHMpIGRvd24gdG8gc3RyaXBlIGJvdW5kYXJ5IHNpemUgZm9yIHNlZ21lbnQgKCVkICIKKyJleHRlbnRzKSIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjQyMQorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgc2l6ZSBnaXZlbiAoJWQgZXh0ZW50cykgbm90IGxhcmdlciB0aGFuIGV4aXN0aW5nIHNpemUgKCVkIGV4dGVudHMpIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDMxCisjLCBjLWZvcm1hdAorbXNnaWQgIk5ldyBzaXplIGdpdmVuICglZCBleHRlbnRzKSBub3QgbGVzcyB0aGFuIGV4aXN0aW5nIHNpemUgKCVkIGV4dGVudHMpIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDQxCittc2dpZCAiTWlycm9ycyBjYW5ub3QgYmUgcmVzaXplZCB3aGlsZSBhY3RpdmUgeWV0LiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjQ0NworbXNnaWQgIlNuYXBzaG90IG9yaWdpbiB2b2x1bWVzIGNhbm5vdCBiZSByZWR1Y2VkIGluIHNpemUgeWV0LiIKK21zZ3N0ciAiIgorCisjOiBsdnJlc2l6ZS5jOjQ1NQorbXNnaWQgIiIKKyJTbmFwc2hvdCBvcmlnaW4gdm9sdW1lcyBjYW4gYmUgcmVzaXplZCBvbmx5IHdoaWxlIGluYWN0aXZlOiB0cnkgbHZjaGFuZ2UgLWFuIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDYzCittc2dpZCAiSWdub3JpbmcgUFZzIG9uIGNvbW1hbmQgbGluZSB3aGVuIHJlZHVjaW5nIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDc0Cittc2dpZCAibHZfaW5mbyBmYWlsZWQ6IGFib3J0aW5nIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIG11c3QgYmUgYWN0aXZhdGVkIGJlZm9yZSByZXNpemluZyBmaWxlc3lzdGVtIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDg1CisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IFJlZHVjaW5nIGFjdGl2ZSVzIGxvZ2ljYWwgdm9sdW1lIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NDkwCittc2dpZCAiVEhJUyBNQVkgREVTVFJPWSBZT1VSIERBVEEgKGZpbGVzeXN0ZW0gZXRjLikiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzo0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9naWNhbCB2b2x1bWUgJXMgTk9UIHJlZHVjZWQiCittc2dzdHIgIiIKKworIzogbHZyZXNpemUuYzo1MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY3JlYXRlIExWIHBhdGggZm9yICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NTE2Cittc2dpZCAiQ291bGRuJ3QgZ2VuZXJhdGUgbmV3IExWIHNpemUgc3RyaW5nIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzaW5nIGxvZ2ljYWwgdm9sdW1lICVzIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NTg5CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIHN1Y2Nlc3NmdWxseSByZXNpemVkIgorbXNnc3RyICIiCisKKyM6IGx2cmVzaXplLmM6NjExCisjLCBjLWZvcm1hdAorbXNnaWQgIkZpbmRpbmcgdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IGx2c2Nhbi5jOjY0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzJXMgJyVzJXMvJXMnIFslc10gJXMiCittc2dzdHIgIiIKKworIzogbHZzY2FuLmM6NzkKK21zZ2lkICJObyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYWxsb3dlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjk2Cittc2dpZCAiYWxsb2NfbHZfc2VnbWVudDogTWlzc2luZyBzZWd0eXBlLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzMQorbXNnaWQgIkZhaWxlZCB0byBmaW5kIHNuYXBzaG90IHNlZ3R5cGUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMzkKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgc25hcHNob3Qgc2VnbWVudC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VnbWVudCBleHRlbnQgcmVkdWN0aW9uICV1bm90IGRpdmlzaWJsZSBieSAjc3RyaXBlcyAldSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjQ0NQorbXNnaWQgIlN0cmlwZWQgbWlycm9ycyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo0NTAKK21zZ2lkICJDYW4ndCBtaXggc3RyaXBpbmcgb3IgbWlycm9yaW5nIHdpdGggY3JlYXRpb24gb2YgYSBtaXJyb3JlZCBQViB5ZXQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo0NTYKK21zZ2lkICJDYW4ndCBtaXggc3RyaXBpbmcgb3IgcHZtb3ZlIHdpdGggYSBtaXJyb3IgbG9nIHlldC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo0NzEKK21zZ2lkICJhbGxvY2F0aW9uIGhhbmRsZSBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjQ4MQorbXNnaWQgImFsbG9jYXRpb24gcG9vbCBjcmVhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo1MTYgcmVwb3J0L3JlcG9ydC5jOjkyIHJlcG9ydC9yZXBvcnQuYzoxNTIKK21zZ2lkICJkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzo1MjMgbWV0YWRhdGEvbHZfbWFuaXAuYzo1MjggbWV0YWRhdGEvbHZfbWFuaXAuYzo1MzUKKyM6IHJlcG9ydC9yZXBvcnQuYzoxMTIgcmVwb3J0L3JlcG9ydC5jOjEyMyByZXBvcnQvcmVwb3J0LmM6MTI5CisjOiByZXBvcnQvcmVwb3J0LmM6MTM1IHJlcG9ydC9yZXBvcnQuYzoxNTkgcmVwb3J0L3JlcG9ydC5jOjE2NQorbXNnaWQgImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6NTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlBhcmFsbGVsIFBWcyBhdCBMRSAldSBsZW5ndGggJXU6ICVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6NTc0Cittc2dpZCAiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IExWIHNlZ21lbnQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6NjU0Cittc2dpZCAiYWxsb2NlZF9hcmVhIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6NzA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBmaW5kIHNlZ21lbnQgZm9yICVzIGV4dGVudCAldSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjkwNworIywgYy1mb3JtYXQKK21zZ2lkICJJbnN1ZmZpY2llbnQgZnJlZSBzcGFjZTogJXUgZXh0ZW50cyBuZWVkZWQsIGJ1dCBvbmx5ICV1IGF2YWlsYWJsZSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEwODEKK21zZ2lkICJfYWxsb2NhdGUgY2FsbGVkIHdpdGggbm8gd29yayB0byBkbyEiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMTA1Cittc2dpZCAiTm90IGVub3VnaCBQVnMgd2l0aCBmcmVlIHNwYWNlIGF2YWlsYWJsZSBmb3IgcGFyYWxsZWwgYWxsb2NhdGlvbi4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMTA3Cittc2dpZCAiQ29uc2lkZXIgLS1hbGxvYyBhbnl3aGVyZSBpZiBkZXNwZXJhdGUuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTEyMAorbXNnaWQgIkNvdWxkbid0IGFsbG9jYXRlIGFyZWFzIGFycmF5LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjExMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkluc3VmZmljaWVudCBzdWl0YWJsZSAlc2FsbG9jYXRhYmxlIGV4dGVudHMgZm9yIGxvZ2ljYWwgdm9sdW1lICVzOiAldSBtb3JlICIKKyJyZXF1aXJlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjExNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW5zdWZmaWNpZW50IGV4dGVudHMgZm9yIGxvZyBhbGxvY2F0aW9uIGZvciBsb2dpY2FsIHZvbHVtZSAlcy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMTY4Cittc2dpZCAiQ291bGRuJ3QgYWxsb2NhdGUgbmV3IHplcm8gc2VnbWVudC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMjAxCittc2dpZCAiYWxsb2NhdGVfZXh0ZW50cyBkb2VzIG5vdCBoYW5kbGUgdmlydHVhbCBzZWdtZW50cyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWV0YWRhdGEgZm9ybWF0ICglcykgZG9lcyBub3Qgc3VwcG9ydCByZXF1aXJlZCBMViBzZWdtZW50IHR5cGUgKCVzKS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMjEwCittc2dpZCAiQ29uc2lkZXIgY2hhbmdpbmcgdGhlIG1ldGFkYXRhIGZvcm1hdCBieSBydW5uaW5nIHZnY29udmVydC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxMjUxCittc2dpZCAiTWlzc2luZyBzZWd0eXBlIGluIGx2X2FkZF9zZWdtZW50KCkuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTI1NgorbXNnaWQgImx2X2FkZF9zZWdtZW50IGNhbm5vdCBoYW5kbGUgdmlydHVhbCBzZWdtZW50cyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEyNzAKK21zZ2lkICJDb3VsZG4ndCBtZXJnZSBzZWdtZW50cyBhZnRlciBleHRlbmRpbmcgbG9naWNhbCB2b2x1bWUuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTI5MgorbXNnaWQgIkxvZyBzZWdtZW50cyBjYW4gb25seSBiZSBhZGRlZCB0byBhbiBlbXB0eSBMViIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzMDEKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgbWlycm9yIGxvZyBzZWdtZW50LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9nIExWICVzIGlzIGVtcHR5LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzNDkKK21zZ2lkICJDb3VsZG4ndCBhbGxvY2F0ZSBuZXcgbWlycm9yIHNlZ21lbnQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTM4NAorbXNnaWQgIk1pcnJvcmVkIExWIG11c3Qgb25seSBoYXZlIG9uZSBzZWdtZW50LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjEzOTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHdpZGVuZWQgTFYgc2VnbWVudCBmb3IgJXMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTQ0NgorIywgYy1mb3JtYXQKK21zZ2lkICJBYm9ydGluZy4gRmFpbGVkIHRvIGV4dGVuZCAlcy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxNDk5CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAoJXUpIHJlYWNoZWQgaW4gdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL2x2X21hbmlwLmM6MTUwNgorbXNnaWQgIkZhaWxlZCB0byBnZW5lcmF0ZSB1bmlxdWUgbmFtZSBmb3IgdGhlIG5ldyBsb2dpY2FsIHZvbHVtZSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjE1MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgbG9naWNhbCB2b2x1bWUgJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxNTE2Cittc2dpZCAibHZfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjE1MjYKK21zZ2lkICJsdiBuYW1lIHN0cmR1cCBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbHZfbWFuaXAuYzoxNTc0IG1ldGFkYXRhL21ldGFkYXRhLmM6OTg2Cittc2dpZCAicHZfbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjE1OTYKK21zZ2lkICJwYXJhbGxlbF9hcmVhcyBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9sdl9tYW5pcC5jOjE2MDQKK21zZ2lkICJhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXJnZS5jOjcyCisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzIGludmFsaWQ6IHNlZ21lbnQgJXUgc2hvdWxkIGJlZ2luIGF0IExFICV1IChmb3VuZCAldSkuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgJXM6IHNlZ21lbnQgJXUgaGFzIGluY29uc2lzdGVudCBhcmVhX2xlbiAldSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXJnZS5jOjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBzZWdtZW50ICV1IGhhcyBsb2cgTFYgYnV0IGlzIG5vdCBtaXJyb3JlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXJnZS5jOjk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBzZWdtZW50ICV1IGxvZyBMViAlcyBpcyBub3QgYSBtaXJyb3IgbG9nIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBzZWdtZW50ICV1IGxvZyBMViBkb2VzIG5vdCBwb2ludCBiYWNrIHRvIG1pcnJvciBzZWdtZW50IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBzZWdtZW50ICV1IG1pcnJvciBpbWFnZSBpcyBub3QgbWlycm9yZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWVyZ2UuYzoxMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgJXM6IHNlZ21lbnQgJXUgaGFzIHVuYXNzaWduZWQgYXJlYSAldS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWVyZ2UuYzoxMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiTFYgJXM6IHNlZ21lbnQgJXUgaGFzIGluY29uc2lzdGVudCBQViBhcmVhICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBzZWdtZW50ICV1IGhhcyBpbmNvbnNpc3RlbnQgTFYgYXJlYSAldSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXJnZS5jOjE1MgorIywgYy1mb3JtYXQKK21zZ2lkICJMViAlczogc2VnbWVudCAldSBtaXJyb3IgaW1hZ2UgJXUgbWlzc2luZyBtaXJyb3IgcHRyIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MTc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxWICVzOiBpbmNvbnNpc3RlbnQgTEUgY291bnQgJXUgIT0gJXUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWVyZ2UuYzoxOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHNwbGl0IHRoZSAlcyBzZWdtZW50IGF0IExFICV1IGluIExWICVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MjA4Cittc2dpZCAiQ291bGRuJ3QgYWxsb2NhdGUgY2xvbmVkIExWIHNlZ21lbnQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MjEzCittc2dpZCAiTFYgc2VnbWVudCB0YWdzIGR1cGxpY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXJnZS5jOjI0MAorIywgYy1mb3JtYXQKK21zZ2lkICJTcGxpdCAlczoldVsldV0gYXQgJXU6ICVzIExFICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21lcmdlLmM6MjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNwbGl0ICVzOiV1WyV1XSBhdCAldTogJXMgUEUgJXUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWVyZ2UuYzoyNjMgbWV0YWRhdGEvbWV0YWRhdGEuYzo0OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hc3NpZ25lZCBhcmVhICV1IGZvdW5kIGluIHNlZ21lbnQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWVyZ2UuYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2VnbWVudCB3aXRoIGV4dGVudCAldSBpbiBMViAlcyBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo0MworIywgYy1mb3JtYXQKK21zZ2lkICJBZGRpbmcgcGh5c2ljYWwgdm9sdW1lICclcycgdG8gdm9sdW1lIGdyb3VwICclcyciCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo0NyBtZXRhZGF0YS9tZXRhZGF0YS5jOjEwMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAicHZfbGlzdCBhbGxvY2F0aW9uIGZvciAnJXMnIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIG5vdCBpZGVudGlmaWVkIGFzIGFuIGV4aXN0aW5nIHBoeXNpY2FsIHZvbHVtZSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjU5CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSAnJXMnIGlzIGFscmVhZHkgaW4gdm9sdW1lIGdyb3VwICclcyciCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo2NQorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgJXMgaXMgb2YgZGlmZmVyZW50IGZvcm1hdCB0eXBlICglcykiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo3MgorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgJXMgbWlnaHQgYmUgY29uc3RydWN0ZWQgZnJvbSBzYW1lIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjc4IG1ldGFkYXRhL21ldGFkYXRhLmM6MTk5CisjLCBjLWZvcm1hdAorbXNnaWQgInZnLT5uYW1lIGFsbG9jYXRpb24gZmFpbGVkIGZvciAnJXMnIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZvcm1hdC1zcGVjaWZpYyBzZXR1cCBvZiBwaHlzaWNhbCB2b2x1bWUgJyVzJyBmYWlsZWQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTA2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSAnJXMnIGxpc3RlZCBtb3JlIHRoYW4gb25jZS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gc3BhY2UgZm9yICclcycgLSB2b2x1bWUgZ3JvdXAgJyVzJyBob2xkcyBtYXggJWQgcGh5c2ljYWwgdm9sdW1lKHMpLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gYWRkICVzIHRvICVzOiBuZXcgZXh0ZW50IGNvdW50ICglbHUpIGV4Y2VlZHMgbGltaXQgKCV1KS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNDgKK21zZ2lkICJQViB0YWdzIGR1cGxpY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJnZXRfcHZfZnJvbV92Z19ieV9pZDogdmdfcmVhZCBmYWlsZWQgdG8gcmVhZCBWRyAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjE3NgorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBWb2x1bWUgZ3JvdXAgJXMgaXMgbm90IGNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoyMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAicHYtPnZnX25hbWUgYWxsb2NhdGlvbiBmYWlsZWQgZm9yICclcyciCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoyMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGFkZCBwaHlzaWNhbCB2b2x1bWUgJyVzJyB0byB2b2x1bWUgZ3JvdXAgJyVzJy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoyNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQSB2b2x1bWUgZ3JvdXAgY2FsbGVkICclcycgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGNyZWF0ZSB1dWlkIGZvciB2b2x1bWUgZ3JvdXAgJyVzJy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzozMDkgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMDg1IG1ldGFkYXRhL21ldGFkYXRhLmM6MTE1MQorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgZm9ybWF0IGluc3RhbmNlIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvcm1hdCBzcGVjaWZpYyBzZXR1cCBvZiB2b2x1bWUgZ3JvdXAgJyVzJyBmYWlsZWQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MzM4CisjLCBjLWZvcm1hdAorbXNnaWQgIk5ldyBzaXplICVsdSBmb3IgJXMlcyBub3QgYW4gZXhhY3QgbnVtYmVyIG9mIG5ldyBleHRlbnRzLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjM0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgZXh0ZW50IGNvdW50ICVsdSBmb3IgJXMlcyBleGNlZWRzIDMyIGJpdHMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NTU2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgcmFuZG9tIHV1aWQgZm9yICVzLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjU3NSBwdnJlc2l6ZS5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiAlczogT3ZlcnJpZGluZyByZWFsIHNpemUuIFlvdSBjb3VsZCBsb3NlIGRhdGEuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBQcmV0ZW5kaW5nIHNpemUgaXMgJWx1IHNlY3RvcnMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NTgzIHB2cmVzaXplLmM6MTM2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBTaXplIG11c3QgZXhjZWVkIG1pbmltdW0gb2YgJWxkIHNlY3RvcnMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBGb3JtYXQtc3BlY2lmaWMgc2V0dXAgb2YgcGh5c2ljYWwgdm9sdW1lIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo2OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgdm9sdW1lICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjcwNAorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgJXMgbm90IGluIGEgdm9sdW1lIGdyb3VwIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6NzgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiBEdXBsaWNhdGUgUFYgaWQgJXMgZGV0ZWN0ZWQgZm9yICVzIGluICVzLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjc4OQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvcjogVkcgbmFtZSBmb3IgUFYgJXMgaXMgY29ycnVwdGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6Nzk2IG1ldGFkYXRhL21ldGFkYXRhLmM6MTI3OAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvcjogUFYgc2VnbWVudHMgY29ycnVwdGVkIGluICVzLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjgwNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvcjogRHVwbGljYXRlIExWIG5hbWUgJXMgZGV0ZWN0ZWQgaW4gJXMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6ODE2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiBEdXBsaWNhdGUgTFYgaWQgJXMgZGV0ZWN0ZWQgZm9yICVzIGFuZCAlcyBpbiAlcy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo4MjcgbWV0YWRhdGEvbWV0YWRhdGEuYzoxMjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiBMViBzZWdtZW50cyBjb3JydXB0ZWQgaW4gJXMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6ODUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBjaGFuZ2UgbWV0YWRhdGEgZm9yIHBhcnRpYWwgdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6ODU3Cittc2dpZCAiQWJvcnRpbmcgdmdfd3JpdGU6IE5vIG1ldGFkYXRhIGFyZWFzIHRvIHdyaXRlIHRvISIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjg2NgorbXNnaWQgIkZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgdm9sdW1lZ3JvdXAgbWV0YWRhdGEgYXJlYXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzo5NjkKK21zZ2lkICJ2ZyBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjk3NworbXNnaWQgInZnIG5hbWUgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMDQ5Cittc2dpZCAiSW50ZXJuYWwgZXJyb3I6IHZnX3JlYWQgcmVxdWlyZXMgdmduYW1lIHdpdGggcHJlLWNvbW1pdC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMTEzIG1ldGFkYXRhL21ldGFkYXRhLmM6MTEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJDYWNoZWQgVkcgJXMgaGFkIGluY29ycmVjdCBQViBsaXN0IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTIwMQorIywgYy1mb3JtYXQKK21zZ2lkICJJbmNvbnNpc3RlbnQgcHJlLWNvbW1pdCBtZXRhZGF0YSBjb3BpZXMgZm9yIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGNvcGllcyBmb3VuZCBmb3IgcGFydGlhbCB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMjIwCisjLCBjLWZvcm1hdAorbXNnaWQgIkluY29uc2lzdGVudCBtZXRhZGF0YSBVVUlEcyBmb3VuZCBmb3Igdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTIyNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICVzIC0gdXBkYXRpbmcgdG8gdXNlIHZlcnNpb24gJXUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMjMwCittc2dpZCAiQXV0b21hdGljIG1ldGFkYXRhIGNvcnJlY3Rpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTIzNQorbXNnaWQgIkF1dG9tYXRpYyBtZXRhZGF0YSBjb3JyZWN0aW9uIGNvbW1pdCBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbW92aW5nIFBWICVzICglcykgdGhhdCBubyBsb25nZXIgYmVsb25ncyB0byBWRyAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEyNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogSW50ZXJydXB0ZWQgcHZtb3ZlIGRldGVjdGVkIGluIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEyNTkKK21zZ2lkICJQbGVhc2UgcmVzdG9yZSB0aGUgbWV0YWRhdGEgYnkgcnVubmluZyB2Z2NmZ3Jlc3RvcmUuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTMxNiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEzNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwICVzIG1ldGFkYXRhIGlzIGluY29uc2lzdGVudCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEzMzUKK21zZ2lkICJ2Z19yZWFkX2J5X3ZnaWQ6IGdldF92Z3MgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTM2OQorIywgYy1mb3JtYXQKK21zZ2lkICJGaW5kaW5nIHZvbHVtZSBncm91cCBmb3IgdXVpZCAlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjEzNzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIGZvciB1dWlkIG5vdCBmb3VuZDogJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvdW5kIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxMzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGZpbmQgbG9naWNhbCB2b2x1bWUgaWQgJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNDA1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIHBoeXNpY2FsIHZvbHVtZSBsYWJlbCByZWFkIGZyb20gJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNDE1CisjLCBjLWZvcm1hdAorbXNnaWQgInB2IGFsbG9jYXRpb24gZm9yICclcycgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTQyNAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhZCBleGlzdGluZyBwaHlzaWNhbCB2b2x1bWUgJyVzJyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjE0NjYKK21zZ2lkICJQViBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTQ3NAorbXNnaWQgImdldF9wdnM6IGdldF92Z3MgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTQ5OAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBWb2x1bWUgR3JvdXAgJXMgaXMgbm90IGNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNTE2Cittc2dpZCAiRm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyBwaHlzaWNhbCB2b2x1bWVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTUyMQorIywgYy1mb3JtYXQKK21zZ2lkICJBc3NlcnRpb24gZmFpbGVkOiBjYW4ndCBfcHZfd3JpdGUgbm9uLW9ycGhhbiBQViAoaW4gVkcgJXMpIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTU0NyB2Z3JlZHVjZS5jOjQxMAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGNsZWFyIG1ldGFkYXRhIGZyb20gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBhZnRlciByZW1vdmFsIGZyb20gXCIlcyIKKyJcIiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9tZXRhZGF0YS5jOjE1NzAgcHZjcmVhdGUuYzo4MQorIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJXMgbm90IGZvdW5kIChvciBpZ25vcmVkIGJ5IGZpbHRlcmluZykuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21ldGFkYXRhLmM6MTU3OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZmluZCBMVk0gbGFiZWwgb24gJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWV0YWRhdGEuYzoxNTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZvdW5kIGxhYmVsIG9uICVzLCBzZWN0b3IgJWx1LCB0eXBlPSVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjUyIG1pcnJvci9taXJyb3JlZC5jOjMyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2luZyByZWR1Y2VkIG1pcnJvciByZWdpb24gc2l6ZSBvZiAldSBzZWN0b3JzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjk0Cittc2dpZCAiQWJvcnRpbmcuIFVuYWJsZSB0byB0YWcuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjEwMAorbXNnaWQgIkludGVybWVkaWF0ZSBWRyBjb21taXQgZm9yIG9ycGhhbiB2b2x1bWUgZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzoxMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVkdWNpbmcgbWlycm9yIHNldCBmcm9tICV1IHRvICV1IGltYWdlKHMpJXMuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjE4MworbXNnaWQgIk5vIG1pcnJvciBpbWFnZXMgZm91bmQgdXNpbmcgc3BlY2lmaWVkIFBWcy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MjIyCittc2dpZCAiaW50ZXJtZWRpYXRlIFZHIHdyaXRlIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6Mjc3Cittc2dpZCAiQmFkIGFjdGl2YXRpb24vbWlycm9yX2xvZ19mYXVsdF9wb2xpY3kiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6Mjc5Cittc2dpZCAiQmFkIGFjdGl2YXRpb24vbWlycm9yX2RldmljZV9mYXVsdF9wb2xpY3kiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MzE3CisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IEZhaWxlZCB0byByZXBsYWNlIG1pcnJvciBkZXZpY2UgaW4gJXMvJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MzIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXQVJOSU5HOiBVc2UgJ2x2Y29udmVydCAtbSAlZCAlcy8lcyAtLWNvcmVsb2cnIHRvIHJlcGxhY2UgZmFpbGVkIGRldmljZXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MzI0IG1ldGFkYXRhL21pcnJvci5jOjM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiBVc2UgJ2x2Y29udmVydCAtbSAlZCAlcy8lcycgdG8gcmVwbGFjZSBmYWlsZWQgZGV2aWNlcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzozMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogRmFpbGVkIHRvIHJlcGxhY2UgbWlycm9yIGxvZyBkZXZpY2UgaW4gJXMvJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IFVuYWJsZSB0byBkZXRlcm1pbmUgbWlycm9yIHN5bmMgc3RhdHVzIG9mICVzLyVzLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzozODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogQmFkIGRldmljZSByZW1vdmVkIGZyb20gbWlycm9yIHZvbHVtZSwgJXMvJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6MzkzCisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IFVuYWJsZSB0byBmaW5kIHN1YnN0aXR1dGUgZGV2aWNlIGZvciBtaXJyb3Igdm9sdW1lLCAlcy8lcyIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzozOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIldBUk5JTkc6IE1pcnJvciB2b2x1bWUsICVzLyVzIHJlc3RvcmVkIC0gc3Vic3RpdHV0ZSBmb3IgZmFpbGVkIGRldmljZSBmb3VuZC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6NDAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXQVJOSU5HOiBNaXJyb3Igdm9sdW1lLCAlcy8lcyBjb252ZXJ0ZWQgdG8gbGluZWFyIGR1ZSB0byBkZXZpY2UgZmFpbHVyZS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6NDA1CisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IE1pcnJvciB2b2x1bWUsICVzLyVzIGRpc2sgbG9nIHJlbW92ZWQgZHVlIHRvIGRldmljZSBmYWlsdXJlLiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo0MjggbWV0YWRhdGEvbWlycm9yLmM6NDM0Cittc2dpZCAiaW1nX25hbWUgYWxsb2NhdGlvbiBmYWlsZWQuIFJlbW92ZSBuZXcgTFYgYW5kIHJldHJ5LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo0NDMKK21zZ2lkICJBYm9ydGluZy4gRmFpbGVkIHRvIGNyZWF0ZSBtaXJyb3IgaW1hZ2UgTFYuIFJlbW92ZSBuZXcgTFYgYW5kIHJldHJ5LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkFib3J0aW5nLiBGYWlsZWQgdG8gYWRkIG1pcnJvciBpbWFnZSBzZWdtZW50IHRvICVzLiBSZW1vdmUgbmV3IExWIGFuZCByZXRyeS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6NDc3IG1ldGFkYXRhL21pcnJvci5jOjUxOAorbXNnaWQgImltZ19sdnMgYWxsb2NhdGlvbiBmYWlsZWQuIFJlbW92ZSBuZXcgTFYgYW5kIHJldHJ5LiIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo0OTkKK21zZ2lkICJBYm9ydGluZy4gRmFpbGVkIHRvIGFkZCBtaXJyb3Igc2VnbWVudC4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjYzMgorIywgYy1mb3JtYXQKK21zZ2lkICJNYXRjaGVkIFBFIHJhbmdlICV1LSV1IGFnYWluc3QgJXMgJXUgbGVuICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjY0MSBtZXRhZGF0YS9taXJyb3IuYzo4NzIgdmdyZWR1Y2UuYzoxMzkKK21zZ2lkICJsdl9saXN0IGFsbG9jIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo2NTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW92aW5nICVzOiV1LSV1IG9mICVzLyVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjY2NAorbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgTFYgZm9yIHB2bW92ZS4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6Njc5CisjLCBjLWZvcm1hdAorbXNnaWQgIk1vdmluZyAldSBleHRlbnRzIG9mIGxvZ2ljYWwgdm9sdW1lICVzLyVzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjcxMQorbXNnaWQgIk5vIHNlZ21lbnQgZm91bmQgd2l0aCBMRSIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9taXJyb3IuYzo3MjIKK21zZ2lkICJJbmNvbXBhdGlibGUgc2VnbWVudHMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvbWlycm9yLmM6NzQ3Cittc2dpZCAiTWlzc2luZyBlcnJvciBzZWd0eXBlIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL21pcnJvci5jOjg1MworbXNnaWQgImx2cyBsaXN0IGFsbG9jIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9wdl9tYW5pcC5jOjMwCittc2dpZCAicHZfc2VnbWVudCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9wdl9tYW5pcC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJTZWdtZW50IHdpdGggZXh0ZW50ICV1IGluIFBWICVzIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjOiBtZXRhZGF0YS9wdl9tYW5pcC5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICJNaXNzaW5nIFBWIHNlZ21lbnQgb24gJXMgYXQgJXUuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgInJlbGVhc2VfcHZfc2VnbWVudCB3aXRoIHVuYWxsb2NhdGVkIHNlZ21lbnQ6ICVzIFBFICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzICV1OiAlNnUgJTZ1OiAlcygldToldSkiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFuaXAuYzoyNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiR2FwIGluIHB2c2VnczogJXUsICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjUwCittc2dpZCAiV3JvbmcgbHZzZWcgYXJlYSB0eXBlIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjU0Cittc2dpZCAiSW5jb25zaXN0ZW50IHB2c2VnIHBvaW50ZXJzIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkluY29uc2lzdGVudCBsZW5ndGg6ICV1ICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIHNlZ21lbnQgcGVfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6Mjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIHNlZ21lbnQgcGVfYWxsb2NfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6Mjg1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIHNlZ21lbnQgVkcgcHZfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlBWIHNlZ21lbnQgVkcgZnJlZV9jb3VudCBtaXNtYXRjaDogJXUgIT0gJXUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFuaXAuYzoyOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUFYgc2VnbWVudCBWRyBleHRlbnRfY291bnQgbWlzbWF0Y2g6ICV1ICE9ICV1IgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MzExCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW5ub3QgcmVzaXplIHRvICV1IGV4dGVudHMgYXMgJXUgYXJlIGFsbG9jYXRlZC4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFuaXAuYzozMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGNhbm5vdCByZXNpemUgdG8gJXUgZXh0ZW50cyBhcyBsYXRlciBvbmVzIGFyZSBhbGxvY2F0ZWQuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6MzU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW5ub3QgcmVzaXplIHRvICV1IGV4dGVudHMgYXMgdGhlcmUgaXMgb25seSByb29tIGZvciAlbHUuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hbmlwLmM6Mzg1CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIGNoYW5nZSB0byBzaXplIG9mIHBoeXNpY2FsIHZvbHVtZSAlcy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFuaXAuYzozOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVzaXppbmcgcGh5c2ljYWwgdm9sdW1lICVzIGZyb20gJXUgdG8gJXUgZXh0ZW50cy4iCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFwLmM6NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWxsb3dpbmcgYWxsb2NhdGlvbiBvbiAlcyBzdGFydCBQRSAldSBsZW5ndGggJXUiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvcHZfbWFwLmM6MTc2Cittc2dpZCAiY3JlYXRlX3B2X21hcHMgYWxsb2MgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3B2X21hcC5jOjE4MworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgcGh5c2ljYWwgdm9sdW1lIG1hcHMgaW4gJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvc2VndHlwZS5jOjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXNlZCBzZWdtZW50IHR5cGUgJXMiCittc2dzdHIgIiIKKworIzogbWV0YWRhdGEvc25hcHNob3RfbWFuaXAuYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGlzIGFscmVhZHkgaW4gdXNlIGFzIGEgc25hcHNob3QuIgorbXNnc3RyICIiCisKKyM6IG1ldGFkYXRhL3NuYXBzaG90X21hbmlwLmM6MTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW1vdmUgaW50ZXJuYWwgc25hcHNob3QgTFYgJXMiCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBNaXJyb3JzXHRcdCV1IgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgTWlycm9yIHNpemVcdFx0JXUiCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBNaXJyb3IgbG9nIHZvbHVtZVx0JXMiCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBNaXJyb3IgcmVnaW9uIHNpemVcdCVzIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjY4Cittc2dpZCAiICBNaXJyb3Igb3JpZ2luYWw6IgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjcwCittc2dpZCAiICBNaXJyb3IgZGVzdGluYXRpb25zOiIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkICdtaXJyb3JfY291bnQnIGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IHJlYWQgJ2V4dGVudHNfbW92ZWQnIGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjEwNworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkICdyZWdpb25fc2l6ZScgZm9yIHNlZ21lbnQgJyVzJy4iCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6MTE1Cittc2dpZCAiTWlycm9yIGxvZyB0eXBlIG11c3QgYmUgYSBzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjEyMAorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbmlzZWQgbWlycm9yIGxvZyBpbiBzZWdtZW50ICVzLiIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWlzc2luZyByZWdpb24gc2l6ZSBmb3IgbWlycm9yIGxvZyBmb3Igc2VnbWVudCAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzoxMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgZmluZCBtaXJyb3JzIGFycmF5IGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjE2MworbXNnaWQgInN0cnVjdCBtaXJyX3N0YXRlIGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjE5MworIywgYy1mb3JtYXQKK21zZ2lkICJNaXJyb3Igc3RhdHVzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzoxOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbHVyZSBwYXJzaW5nIG1pcnJvciBzdGF0dXMgbWlycm9yIGNvdW50OiAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzoyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbHVyZSBwYXJzaW5nIG1pcnJvciBzdGF0dXMgZGV2aWNlczogJXMiCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWx1cmUgcGFyc2luZyBtaXJyb3Igc3RhdHVzIGZyYWN0aW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzoyNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGJ1aWxkIHV1aWQgZm9yIGxvZyBMViAlcy4iCittc2dzdHIgIiIKKworIzogbWlycm9yL21pcnJvcmVkLmM6MjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBidWlsZCB1dWlkIGZvciBtaXJyb3IgTFYgJXMuIgorbXNnc3RyICIiCisKKyM6IG1pcnJvci9taXJyb3JlZC5jOjMxMAorbXNnaWQgIk1pc3NpbmcgcmVnaW9uIHNpemUgZm9yIG1pcnJvciBzZWdtZW50LiIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzo1MDUKK21zZ2lkICJjbHVzdGVyIGxvZyBzdHJpbmcgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBtaXJyb3IvbWlycm9yZWQuYzo1MTAKK21zZ2lkICJtaXJyb3Igc3RyaW5nIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZXhlYy5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4ZWN1dGluZzogJXMgJXMgJXMgJXMiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZXhlYy5jOjM0IHBvbGxkYWVtb24uYzozOQorIywgYy1mb3JtYXQKK21zZ2lkICJmb3JrIGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZXhlYy5jOjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIndhaXQ0IGNoaWxkIHByb2Nlc3MgJXUgZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXNjL2x2bS1leGVjLmM6NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hpbGQgJXUgZXhpdGVkIGFibm9ybWFsbHkiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZXhlYy5jOjU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGZhaWxlZDogJXUiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZmlsZS5jOjU1Cittc2dpZCAiTm90IGVub3VnaCBzcGFjZSB0byBidWlsZCB0ZW1wb3JhcnkgZmlsZSBzdHJpbmcuIgorbXNnc3RyICIiCisKKyM6IG1pc2MvbHZtLWZpbGUuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHJlbmFtZSB0byAlcyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZmlsZS5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJDcmVhdGluZyBkaXJlY3RvcnkgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IG1pc2MvbHZtLWZpbGUuYzoxODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGlyZWN0b3J5IFwiJXNcIiBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZmlsZS5jOjIyMAorbXNnaWQgInN5bmNfZGlyIGZhaWxlZCBpbiBzdHJkdXAiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZmlsZS5jOjI2OQorbXNnaWQgImZjbnRsX2xvY2tfZmlsZSBmYWlsZWQgaW4gc3RyZHVwLiIKK21zZ3N0ciAiIgorCisjOiBtaXNjL2x2bS1maWxlLmM6MjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIkxvY2tpbmcgJXMgKCVzLCAlaGQpIgorbXNnc3RyICIiCisKKyM6IG1pc2MvbHZtLWZpbGUuYzozMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5sb2NraW5nIGZkICVkIgorbXNnc3RyICIiCisKKyM6IG1pc2MvbHZtLWZpbGUuYzozMTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmNudGwgdW5sb2NrIGZhaWxlZCBvbiBmZCAlZDogJXMiCittc2dzdHIgIiIKKworIzogbWlzYy9sdm0tZmlsZS5jOjMyMAorIywgYy1mb3JtYXQKK21zZ2lkICJsb2NrIGZpbGUgY2xvc2UgZmFpbGVkIG9uIGZkICVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXNjL2x2bS1zdHJpbmcuYzoxMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiYnVpbGRfZG1fbmFtZTogQWxsb2NhdGlvbiBmYWlsZWQgZm9yICV6dSBmb3IgJXMgJXMgJXMuIgorbXNnc3RyICIiCisKKyM6IG1pc2Mvc2hhcmVkbGliLmM6NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm90IGxvYWRpbmcgc2hhcmVkICVzIGxpYnJhcnkgJXMgaW4gc3RhdGljIG1vZGUuIgorbXNnc3RyICIiCisKKyM6IG1pc2Mvc2hhcmVkbGliLmM6NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3BlbmluZyBzaGFyZWQgJXMgbGlicmFyeSAlcyIKK21zZ3N0ciAiIgorCisjOiBtaXNjL3NoYXJlZGxpYi5jOjU5IG1pc2Mvc2hhcmVkbGliLmM6NjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIG9wZW4gZXh0ZXJuYWwgJXMgbGlicmFyeSAlczogJXMiCittc2dzdHIgIiIKKworIzogbW0vbWVtbG9jay5jOjk5Cittc2dpZCAiTG9ja2luZyBtZW1vcnkiCittc2dzdHIgIiIKKworIzogbW0vbWVtbG9jay5jOjEwOCBtbS9tZW1sb2NrLmM6MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgInNldHByaW9yaXR5ICV1IGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogbW0vbWVtbG9jay5jOjExOAorbXNnaWQgIlVubG9ja2luZyBtZW1vcnkiCittc2dzdHIgIiIKKworIzogbW0vbWVtbG9jay5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJtZW1sb2NrX2NvdW50IGluYyB0byAlZCIKK21zZ3N0ciAiIgorCisjOiBtbS9tZW1sb2NrLmM6MTM3CisjLCBjLWZvcm1hdAorbXNnaWQgIm1lbWxvY2tfY291bnQgZGVjIHRvICVkIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzozNAorbXNnaWQgIkZvcmtpbmcgYmFja2dyb3VuZCBwcm9jZXNzIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzo0OQorIywgYy1mb3JtYXQKK21zZ2lkICJCYWNrZ3JvdW5kIHByb2Nlc3MgZmFpbGVkIHRvIHNldHNpZDogJXMiCittc2dzdHIgIiIKKworIzogcG9sbGRhZW1vbi5jOjgwCittc2dpZCAiRmFpbGVkIHRvIGdlbmVyYXRlIGxpc3Qgb2YgY29waWVkIExWczogY2FuJ3QgYWJvcnQuIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzo5MAorbXNnaWQgIkFCT1JUSU5HOiBNaXJyb3IgcGVyY2VudGFnZSBjaGVjayBmYWlsZWQuIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzo5NiBwb2xsZGFlbW9uLmM6OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE1vdmVkOiAlLjFmJSUiCittc2dzdHIgIiIKKworIzogcG9sbGRhZW1vbi5jOjEwNworbXNnaWQgIkFCT1JUSU5HOiBGYWlsZWQgdG8gZ2VuZXJhdGUgbGlzdCBvZiBjb3BpZWQgTFZzIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzoxMTkKK21zZ2lkICJBQk9SVElORzogU2VnbWVudCBwcm9ncmVzc2lvbiBmYWlsZWQuIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzoxNDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQUJPUlRJTkc6IENhbid0IHJlcmVhZCBWRyBmb3IgJXMiCittc2dzdHIgIiIKKworIzogcG9sbGRhZW1vbi5jOjE1NgorIywgYy1mb3JtYXQKK21zZ2lkICJBQk9SVElORzogQ2FuJ3QgZmluZCBtaXJyb3IgTFYgaW4gJXMgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IHBvbGxkYWVtb24uYzoxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogcG9sbGRhZW1vbi5jOjE4OQorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgR3JvdXAgJXMgaW5jb25zaXN0ZW50IC0gc2tpcHBpbmciCittc2dzdHIgIiIKKworIzogcG9sbGRhZW1vbi5jOjI0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDaGVja2luZyBwcm9ncmVzcyBldmVyeSAldSBzZWNvbmRzIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmluZGluZyB2b2x1bWUgZ3JvdXAgb2YgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjY1IHB2cmVzaXplLmM6NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGZpbmQgdm9sdW1lIGdyb3VwIG9mIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjkwIHB2cmVzaXplLmM6MTAxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBmaW5kIFwiJXNcIiBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIGNvbnRhaW5pbmcgJXMgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBjb250YWluaW5nICVzIGhhcyBhY3RpdmUgbG9naWNhbCB2b2x1bWVzIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGNoYW5nZSB0YWcgb24gUGh5c2ljYWwgVm9sdW1lICVzIG5vdCBpbiB2b2x1bWUgZ3JvdXAiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoxMTcgcHZyZXNpemUuYzo0OAorbXNnaWQgIkNhbid0IGdldCBsb2NrIGZvciBvcnBoYW5zIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTIzIHB2cmVzaXplLmM6NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgUFYgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkFsbG9jYXRhYmlsaXR5IG5vdCBzdXBwb3J0ZWQgYnkgb3JwaGFuICVzIGZvcm1hdCBQViAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGlzIGFscmVhZHkgYWxsb2NhdGFibGUiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBpcyBhbHJlYWR5IHVuYWxsb2NhdGFibGUiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoxNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGFsbG9jYXRhYmxlIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBOT1QgYWxsb2NhdGFibGUiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGFkZCB0YWcgJXMgdG8gcGh5c2ljYWwgdm9sdW1lICVzIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW1vdmUgdGFnICVzIGZyb20gcGh5c2ljYWwgdm9sdW1lJXMiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoxODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyByYW5kb20gVVVJRCBmb3IgJXMuIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoYW5naW5nIHV1aWQgb2YgJXMgdG8gJXMuIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MjAxCisjLCBjLWZvcm1hdAorbXNnaWQgInB2X3dyaXRlIHdpdGggbmV3IHV1aWQgZmFpbGVkIGZvciAlcy4iCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoyMTAgcHZyZXNpemUuYzoxNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXBkYXRpbmcgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjIxNCBwdnJlc2l6ZS5jOjE3OAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc3RvcmUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MjIzIHB2cmVzaXplLmM6MTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzdG9yZSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MjMwIHB2cmVzaXplLmM6MTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgY2hhbmdlZCIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjI1MgorbXNnaWQgIlBsZWFzZSBnaXZlIGV4YWN0bHkgb25lIG9wdGlvbiBvZiAteCwgLXV1aWQsIC0tYWRkdGFnIG9yIC0tZGVsdGFnIgorbXNnc3RyICIiCisKKyM6IHB2Y2hhbmdlLmM6MjU4Cittc2dpZCAiUGxlYXNlIGdpdmUgYSBwaHlzaWNhbCB2b2x1bWUgcGF0aCIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjI2MworbXNnaWQgIk9wdGlvbiBhIGFuZCBQaHlzaWNhbFZvbHVtZVBhdGggYXJlIGV4Y2x1c2l2ZSIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjI2OCB0b29sbGliLmM6NjgzCittc2dpZCAiVXNpbmcgcGh5c2ljYWwgdm9sdW1lKHMpIG9uIGNvbW1hbmQgbGluZSIKK21zZ3N0ciAiIgorCisjOiBwdmNoYW5nZS5jOjI3MworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhZCBwaHlzaWNhbCB2b2x1bWUgJXMiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoyODEgdG9vbGxpYi5jOjc2NgorbXNnaWQgIlNjYW5uaW5nIGZvciBwaHlzaWNhbCB2b2x1bWUgbmFtZXMiCittc2dzdHIgIiIKKworIzogcHZjaGFuZ2UuYzoyOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJWQgcGh5c2ljYWwgdm9sdW1lJXMgY2hhbmdlZCAvICVkIHBoeXNpY2FsIHZvbHVtZSVzIG5vdCBjaGFuZ2VkIgorbXNnc3RyICIiCisKKyM6IHB2Y2suYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICJTY2FubmluZyAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjM3IHB2cmVtb3ZlLmM6MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vdCBMVk0gcGFydGl0aW9uIHR5cGU6IHVzZSAtZiB0byBvdmVycmlkZSIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJDYW4ndCBpbml0aWFsaXplIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgb2Ygdm9sdW1lIGdyb3VwIFwiJXNcIiB3aXRob3V0IC1mZiIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBwaHlzaWNhbCB2b2x1bWUgbm90IGluaXRpYWxpemVkIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6NzIgcHZjcmVhdGUuYzoxNjggcHZyZW1vdmUuYzo4MSB2Z2NyZWF0ZS5jOjEzNSB2Z2V4dGVuZC5jOjQwCisjOiB2Z3JlbW92ZS5jOjk2Cittc2dpZCAiQ2FuJ3QgZ2V0IGxvY2sgZm9yIG9ycGhhbiBQVnMiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBvcGVuICVzIGV4Y2x1c2l2ZWx5LiAgTW91bnRlZCBmaWxlc3lzdGVtPyIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIldpcGluZyBzb2Z0d2FyZSBSQUlEIG1kIHN1cGVyYmxvY2sgb24gJXMiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzoxMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdpcGUgUkFJRCBtZCBzdXBlcmJsb2NrIG9uICVzIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IEZvcmNpbmcgcGh5c2ljYWwgdm9sdW1lIGNyZWF0aW9uIG9uICVzJXMlcyVzIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgInV1aWQgJXMgYWxyZWFkeSBpbiB1c2Ugb24gXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byByZWFkIHZvbHVtZSBncm91cCBmcm9tICVzIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGZpbmQgdXVpZCAlcyBpbiBiYWNrdXAgZmlsZSAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjE3NiBwdnJlc2l6ZS5jOjIxMgorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSBzaXplIG1heSBub3QgYmUgbmVnYXRpdmUiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzoxODIgdmdjb252ZXJ0LmM6NjYKK21zZ2lkICJNZXRhZGF0YSBzaXplIG1heSBub3QgYmUgbmVnYXRpdmUiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzoxOTkgcHZyZW1vdmUuYzo4OQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogQ291bGRuJ3QgZmluZCBkZXZpY2UuICBDaGVjayB5b3VyIGZpbHRlcnM/IgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MjA4IHZnY29udmVydC5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0dXAgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjIxMiB2Z2NvbnZlcnQuYzoxMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0IHVwIHBoeXNpY2FsIHZvbHVtZSBmb3IgXCIlc1wiIHdpdGggJWx1IGF2YWlsYWJsZSBzZWN0b3JzIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MjE3IHZnY29udmVydC5jOjE0MworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gd2lwZSBleGlzdGluZyBsYWJlbCBvbiAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjIyMgorIywgYy1mb3JtYXQKK21zZ2lkICJaZXJvaW5nIHN0YXJ0IG9mIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjIyNAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBub3Qgb3BlbmVkOiBkZXZpY2Ugbm90IHplcm9lZCIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBub3Qgd2lwZWQ6IGFib3J0aW5nIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MjM2IHZnY29udmVydC5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIHBoeXNpY2FsIHZvbHVtZSBkYXRhIHRvIGRpc2sgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MjQwIHZnY29udmVydC5jOjE1NQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjI0NCB2Z2NvbnZlcnQuYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBzdWNjZXNzZnVsbHkgY3JlYXRlZCIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjI2MSBwdnJlbW92ZS5jOjEyMworbXNnaWQgIlBsZWFzZSBlbnRlciBhIHBoeXNpY2FsIHZvbHVtZSBwYXRoIgorbXNnc3RyICIiCisKKyM6IHB2Y3JlYXRlLmM6MjY2Cittc2dpZCAiLS11dWlkIGlzIHJlcXVpcmVkIHdpdGggLS1yZXN0b3JlZmlsZSIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjI3MQorbXNnaWQgIkNhbiBvbmx5IHNldCB1dWlkIG9uIG9uZSB2b2x1bWUgYXQgb25jZSIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjI3NiBwdnJlbW92ZS5jOjEyOAorbXNnaWQgIk9wdGlvbiB5IGNhbiBvbmx5IGJlIGdpdmVuIHdpdGggb3B0aW9uIGYiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzoyODEgdmdjb252ZXJ0LmM6MjA1CisjLCBjLWZvcm1hdAorbXNnaWQgImxhYmVsc2VjdG9yIG11c3QgYmUgbGVzcyB0aGFuICVsdSIKK21zZ3N0ciAiIgorCisjOiBwdmNyZWF0ZS5jOjI4OSB2Z2NvbnZlcnQuYzoyMTMKK21zZ2lkICJNZXRhZGF0YSBwYXJhbWV0ZXJzIG9ubHkgYXBwbHkgdG8gdGV4dCBmb3JtYXQiCittc2dzdHIgIiIKKworIzogcHZjcmVhdGUuYzoyOTUgdmdjb252ZXJ0LmM6MjE5Cittc2dpZCAiTWV0YWRhdGFjb3BpZXMgbWF5IG9ubHkgYmUgMCwgMSBvciAyIgorbXNnc3RyICIiCisKKyM6IHB2ZGlzcGxheS5jOjMwIHJlcG9ydGVyLmM6NjUgcmVwb3J0ZXIuYzoxMTMgdG9vbGxpYi5jOjM0NyB0b29sbGliLmM6NDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGxvY2sgJXM6IHNraXBwaW5nIgorbXNnc3RyICIiCisKKyM6IHB2ZGlzcGxheS5jOjM1IHJlcG9ydGVyLmM6NzAgcmVwb3J0ZXIuYzoxMTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgcmVhZCAlczogc2tpcHBpbmciCittc2dzdHIgIiIKKworIzogcHZkaXNwbGF5LmM6NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlIFwiJXNcIiBoYXMgYSBjYXBhY2l0eSBvZiAlcyIKK21zZ3N0ciAiIgorCisjOiBwdmRpc3BsYXkuYzo2MAorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIG9mIHZvbHVtZSBncm91cCBcIiVzXCIgaXMgZXhwb3J0ZWQiCittc2dzdHIgIiIKKworIzogcHZkaXNwbGF5LmM6NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiXCIlc1wiIGlzIGEgbmV3IHBoeXNpY2FsIHZvbHVtZSBvZiBcIiVzXCIiCittc2dzdHIgIiIKKworIzogcHZkaXNwbGF5LmM6MTA0Cittc2dpZCAiT3B0aW9uIC12IG5vdCBhbGxvd2VkIHdpdGggb3B0aW9uIC1jIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjM0Cittc2dpZCAiLS1uYW1lIHRha2VzIGEgbG9naWNhbCB2b2x1bWUgbmFtZSIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzozOQorbXNnaWQgIk5hbWVkIExWIGFuZCBvbGQgUFYgbXVzdCBiZSBpbiB0aGUgc2FtZSBWRyIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzo0NQorbXNnaWQgIkluY29tcGxldGUgTFYgbmFtZSBzdXBwbGllZCB3aXRoIC0tbmFtZSIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxMjcKK21zZ2lkICJObyBleHRlbnRzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxNTAKK21zZ2lkICJDcmVhdGlvbiBvZiB0ZW1wb3JhcnkgcHZtb3ZlIExWIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxNTcKK21zZ2lkICJsdnNfY2hhbmdlZCBsaXN0IHN0cnVjdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2tpcHBpbmcgc25hcHNob3QtcmVsYXRlZCBMViAlcyIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2tpcHBpbmcgbWlycm9yIExWICVzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjE3OAorIywgYy1mb3JtYXQKK21zZ2lkICJTa2lwcGluZyBtaXJyb3IgbG9nIExWICVzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjE4MgorIywgYy1mb3JtYXQKK21zZ2lkICJTa2lwcGluZyBtaXJyb3IgaW1hZ2UgTFYgJXMiCittc2dzdHIgIiIKKworIzogcHZtb3ZlLmM6MTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIlNraXBwaW5nIGxvY2tlZCBMViAlcyIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoxOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gZGF0YSB0byBtb3ZlIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzoyMTAKK21zZ2lkICJVcGRhdGluZyB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEiCittc2dzdHIgIiIKKworIzogcHZtb3ZlLmM6MjEyIHB2bW92ZS5jOjIzNgorbXNnaWQgIkFCT1JUSU5HOiBWb2x1bWUgZ3JvdXAgbWV0YWRhdGEgdXBkYXRlIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogcHZtb3ZlLmM6MjQ5Cittc2dpZCAiQUJPUlRJTkc6IFRlbXBvcmFyeSBtaXJyb3IgYWN0aXZhdGlvbiBmYWlsZWQuICBSdW4gcHZtb3ZlIC0tYWJvcnQuIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjI1NyBwdm1vdmUuYzo0MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIHJlYWN0aXZhdGUgbG9naWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjI2NQorbXNnaWQgIlVuYWJsZSB0byByZXN1bWUgbG9naWNhbCB2b2x1bWVzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjMxMworIywgYy1mb3JtYXQKK21zZ2lkICJEZXRlY3RlZCBwdm1vdmUgaW4gcHJvZ3Jlc3MgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjMxNQorbXNnaWQgIklnbm9yaW5nIHJlbWFpbmluZyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjMxOAorbXNnaWQgIkFCT1JUSU5HOiBGYWlsZWQgdG8gZ2VuZXJhdGUgbGlzdCBvZiBtb3ZpbmcgTFZzIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjMyNgorbXNnaWQgIkFCT1JUSU5HOiBUZW1wb3JhcnkgbWlycm9yIGFjdGl2YXRpb24gZmFpbGVkLiIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzo0MDMKK21zZ2lkICJBQk9SVElORzogUmVtb3ZhbCBvZiB0ZW1wb3JhcnkgbWlycm9yIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzo0MDkgcHZtb3ZlLmM6NDI4IHB2bW92ZS5jOjQ2MgorbXNnaWQgIkFCT1JUSU5HOiBGYWlsZWQgdG8gd3JpdGUgbmV3IGRhdGEgbG9jYXRpb25zIHRvIGRpc2suIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjQxNgorbXNnaWQgIkxvY2tpbmcgTFZzIHRvIHJlbW92ZSB0ZW1wb3JhcnkgbWlycm9yIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzo0MjIKK21zZ2lkICJTdXNwZW5zaW9uIG9mIHRlbXBvcmFyeSBtaXJyb3IgTFYgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjQ0OAorIywgYy1mb3JtYXQKK21zZ2lkICJBQk9SVElORzogVW5hYmxlIHRvIGRlYWN0aXZhdGUgdGVtcG9yYXJ5IGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBwdm1vdmUuYzo0NTMKK21zZ2lkICJSZW1vdmluZyB0ZW1wb3JhcnkgcHZtb3ZlIExWIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjQ1NQorbXNnaWQgIkFCT1JUSU5HOiBSZW1vdmFsIG9mIHRlbXBvcmFyeSBwdm1vdmUgTFYgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHB2bW92ZS5jOjQ2MAorbXNnaWQgIldyaXRpbmcgb3V0IGZpbmFsIHZvbHVtZSBncm91cCBhZnRlciBwdm1vdmUiCittc2dzdHIgIiIKKworIzogcHZtb3ZlLmM6NDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIkFCT1JUSU5HOiBDYW4ndCByZXJlYWQgUFYgJXMiCittc2dzdHIgIiIKKworIzogcHZtb3ZlLmM6NTE2IHRvb2xsaWIuYzoxMDc0Cittc2dpZCAiRmFpbGVkIHRvIGNsb25lIFBWIG5hbWUiCittc2dzdHIgIiIKKworIzogcHZyZW1vdmUuYzo0MSB2Z3NwbGl0LmM6MTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIFZvbHVtZSAlcyBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogcHZyZW1vdmUuYzo1MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiQ2FuJ3QgcHZyZW1vdmUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBvZiB2b2x1bWUgZ3JvdXAgXCIlc1wiIHdpdGhvdXQgLWZmIgorbXNnc3RyICIiCisKKyM6IHB2cmVtb3ZlLmM6NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHBoeXNpY2FsIHZvbHVtZSBsYWJlbCBub3QgcmVtb3ZlZCIKK21zZ3N0ciAiIgorCisjOiBwdnJlbW92ZS5jOjY1CisjLCBjLWZvcm1hdAorbXNnaWQgIldBUk5JTkc6IFdpcGluZyBwaHlzaWNhbCB2b2x1bWUgbGFiZWwgZnJvbSAlcyVzJXMlcyIKK21zZ3N0ciAiIgorCisjOiBwdnJlbW92ZS5jOjk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IG9wZW4gJXMgZXhjbHVzaXZlbHkgLSBub3QgcmVtb3ZpbmcuIE1vdW50ZWQgZmlsZXN5c3RlbT8iCittc2dzdHIgIiIKKworIzogcHZyZW1vdmUuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwocykgb24gJXMiCittc2dzdHIgIiIKKworIzogcHZyZW1vdmUuYzoxMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGFiZWxzIG9uIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgc3VjY2Vzc2Z1bGx5IHdpcGVkIgorbXNnc3RyICIiCisKKyM6IHB2cmVzaXplLmM6NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHRvbyBtYW55IG1ldGFkYXRhIGFyZWFzIGZvciBwdnJlc2l6ZSIKK21zZ3N0ciAiIgorCisjOiBwdnJlc2l6ZS5jOjExMworIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgJXMgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgcmVzaXppbmcuIgorbXNnc3RyICIiCisKKyM6IHB2cmVzaXplLmM6MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBQcmV0ZW5kaW5nIHNpemUgaXMgJWx1IG5vdCAlbHUgc2VjdG9ycy4iCittc2dzdHIgIiIKKworIzogcHZyZXNpemUuYzoxNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFNpemUgbXVzdCBleGNlZWQgcGh5c2ljYWwgZXh0ZW50IHN0YXJ0IG9mICVsdSBzZWN0b3JzLiIKK21zZ3N0ciAiIgorCisjOiBwdnJlc2l6ZS5jOjE1NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJXM6IFNpemUgbXVzdCBsZWF2ZSBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIHBoeXNpY2FsIGV4dGVudCBvZiAldSBzZWN0b3JzLiIKK21zZ3N0ciAiIgorCisjOiBwdnJlc2l6ZS5jOjE3MQorIywgYy1mb3JtYXQKK21zZ2lkICJSZXNpemluZyB2b2x1bWUgXCIlc1wiIHRvICVsdSBzZWN0b3JzLiIKK21zZ3N0ciAiIgorCisjOiBwdnJlc2l6ZS5jOjIwNworbXNnaWQgIlBsZWFzZSBzdXBwbHkgcGh5c2ljYWwgdm9sdW1lKHMpIgorbXNnc3RyICIiCisKKyM6IHB2cmVzaXplLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIHBoeXNpY2FsIHZvbHVtZShzKSByZXNpemVkIC8gJWQgcGh5c2ljYWwgdm9sdW1lKHMpIG5vdCByZXNpemVkIgorbXNnc3RyICIiCisKKyM6IHB2c2Nhbi5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWICUtKnMgICAgJS0qcyAlcyBbJXNdIgorbXNnc3RyICIiCisKKyM6IHB2c2Nhbi5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWICUtKnMgIGlzIGluIGV4cG9ydGVkIFZHICVzIFslcyAvICVzIGZyZWVdIgorbXNnc3RyICIiCisKKyM6IHB2c2Nhbi5jOjg5CisjLCBjLWZvcm1hdAorbXNnaWQgIlBWICUtKnMgVkcgJS0qcyAlcyBbJXMgLyAlcyBmcmVlXSIKK21zZ3N0ciAiIgorCisjOiBwdnNjYW4uYzoxMTcKK21zZ2lkICJPcHRpb25zIC1lIGFuZCAtbiBhcmUgaW5jb21wYXRpYmxlIgorbXNnc3RyICIiCisKKyM6IHB2c2Nhbi5jOjEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJXQVJOSU5HOiBvbmx5IGNvbnNpZGVyaW5nIHBoeXNpY2FsIHZvbHVtZXMgJXMiCittc2dzdHIgIiIKKworIzogcHZzY2FuLmM6MTI5Cittc2dpZCAiV2Fsa2luZyB0aHJvdWdoIGFsbCBwaHlzaWNhbCB2b2x1bWVzIgorbXNnc3RyICIiCisKKyM6IHB2c2Nhbi5jOjE4MgorbXNnaWQgIk5vIG1hdGNoaW5nIHBoeXNpY2FsIHZvbHVtZXMgZm91bmQiCittc2dzdHIgIiIKKworIzogcHZzY2FuLmM6MTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIlRvdGFsOiAlZCBbJXNdIC8gaW4gdXNlOiAlZCBbJXNdIC8gaW4gbm8gVkc6ICVkIFslc10iCittc2dzdHIgIiIKKworIzogcmVwb3J0L3JlcG9ydC5jOjExOAorbXNnaWQgIkV4dGVudCBudW1iZXIgZG1fc25wcmludGYgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHJlcG9ydC9yZXBvcnQuYzoxODIKK21zZ2lkICJtb2R1bGVzIHN0cl9saXN0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHJlcG9ydC9yZXBvcnQuYzoyNTkgcmVwb3J0L3JlcG9ydC5jOjM0MiByZXBvcnQvcmVwb3J0LmM6MzY4CisjOiByZXBvcnQvcmVwb3J0LmM6NDY2IHJlcG9ydC9yZXBvcnQuYzo1MjMgcmVwb3J0L3JlcG9ydC5jOjU1MworIzogcmVwb3J0L3JlcG9ydC5jOjY5NCByZXBvcnQvcmVwb3J0LmM6NzUwIHJlcG9ydC9yZXBvcnQuYzo3NjgKKyM6IHJlcG9ydC9yZXBvcnQuYzo3OTMgcmVwb3J0L3JlcG9ydC5jOjgwNworbXNnaWQgImRtX3Bvb2xfYWxsb2MgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHJlcG9ydC9yZXBvcnQuYzo0NzEKK21zZ2lkICJsdm5hbWUgc25wcmludGYgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHJlcG9ydC9yZXBvcnQuYzo0NzYgcmVwb3J0L3JlcG9ydC5jOjUxOCByZXBvcnQvcmVwb3J0LmM6NTQ4Cittc2dpZCAiZG1fcG9vbF9zdHJkdXAgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHJlcG9ydC9yZXBvcnQuYzo3NzMKK21zZ2lkICJzbmFwc2hvdCBwZXJjZW50YWdlIHRvbyBsYXJnZSIKK21zZ3N0ciAiIgorCisjOiByZXBvcnQvcmVwb3J0LmM6ODEyCittc2dpZCAiY29weSBwZXJjZW50YWdlIHRvbyBsYXJnZSIKK21zZ3N0ciAiIgorCisjOiByZXBvcnRlci5jOjI0IHJlcG9ydGVyLmM6MTQ2IHJlcG9ydGVyLmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCAlcyBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogcmVwb3J0ZXIuYzoyNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBvcHRpb25zIHN0cmluZzogJXMiCittc2dzdHIgIiIKKworIzogcmVwb3J0ZXIuYzoyNjAKK21zZ2lkICJvcHRpb25zIHN0cmluZyBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiByZXBvcnRlci5jOjI5NworbXNnaWQgIkNhbid0IHJlcG9ydCBMViBhbmQgUFYgZmllbGRzIGF0IHRoZSBzYW1lIHRpbWUiCittc2dzdHIgIiIKKworIzogc25hcHNob3Qvc25hcHNob3QuYzo0MAorbXNnaWQgIkNvdWxkbid0IHJlYWQgY2h1bmsgc2l6ZSBmb3Igc25hcHNob3QuIgorbXNnc3RyICIiCisKKyM6IHNuYXBzaG90L3NuYXBzaG90LmM6NDgKK21zZ2lkICJTbmFwc2hvdCBjb3cgc3RvcmFnZSBub3Qgc3BlY2lmaWVkLiIKK21zZ3N0ciAiIgorCisjOiBzbmFwc2hvdC9zbmFwc2hvdC5jOjU0Cittc2dpZCAiU25hcHNob3Qgb3JpZ2luIG5vdCBzcGVjaWZpZWQuIgorbXNnc3RyICIiCisKKyM6IHNuYXBzaG90L3NuYXBzaG90LmM6NjEKK21zZ2lkICJVbmtub3duIGxvZ2ljYWwgdm9sdW1lIHNwZWNpZmllZCBmb3Igc25hcHNob3QgY293IHN0b3JlLiIKK21zZ3N0ciAiIgorCisjOiBzbmFwc2hvdC9zbmFwc2hvdC5jOjY3Cittc2dpZCAiVW5rbm93biBsb2dpY2FsIHZvbHVtZSBzcGVjaWZpZWQgZm9yIHNuYXBzaG90IG9yaWdpbi4iCittc2dzdHIgIiIKKworIzogc25hcHNob3Qvc25hcHNob3QuYzoxMzUKK21zZ2lkICJzbmFwc2hvdCBzdHJpbmcgbGlzdCBhbGxvY2F0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBzdHJpcGVkL3N0cmlwZWQuYzo0MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIFN0cmlwZXNcdFx0JXUiCittc2dzdHIgIiIKKworIzogc3RyaXBlZC9zdHJpcGVkLmM6NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBTdHJpcGUgc2l6ZVx0XHQldSBLQiIKK21zZ3N0ciAiIgorCisjOiBzdHJpcGVkL3N0cmlwZWQuYzo0NQorIywgYy1mb3JtYXQKK21zZ2lkICIgIFN0cmlwZSAlZDoiCittc2dzdHIgIiIKKworIzogc3RyaXBlZC9zdHJpcGVkLmM6NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgcmVhZCAnc3RyaXBlX2NvdW50JyBmb3Igc2VnbWVudCAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBzdHJpcGVkL3N0cmlwZWQuYzo3MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCByZWFkIHN0cmlwZV9zaXplIGZvciBzZWdtZW50ICclcycuIgorbXNnc3RyICIiCisKKyM6IHN0cmlwZWQvc3RyaXBlZC5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGZpbmQgc3RyaXBlcyBhcnJheSBmb3Igc2VnbWVudCAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBzdHJpcGVkL3N0cmlwZWQuYzoxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZXJuYWwgZXJyb3I6IHN0cmlwZWQgYWRkX3RhcmdldF9saW5lIGNhbGxlZCB3aXRoIG5vIGFyZWFzIGZvciAlcy4iCittc2dzdHIgIiIKKworIzogc3R1Yi5oOjI0IHN0dWIuaDozMQorbXNnaWQgIkNvbW1hbmQgbm90IGltcGxlbWVudGVkIHlldC4iCittc2dzdHIgIiIKKworIzogc3R1Yi5oOjM4Cittc2dpZCAiVGhlcmUncyBubyAncHZkYXRhJyBjb21tYW5kIGluIExWTTIuIgorbXNnc3RyICIiCisKKyM6IHN0dWIuaDozOQorbXNnaWQgIiIKKyJVc2UgbHZzLCBwdnMsIHZncyBpbnN0ZWFkOyBvciB1c2UgdmdjZmdiYWNrdXAgYW5kIHJlYWQgdGhlIHRleHQgZmlsZSBiYWNrdXAuIgorbXNnc3RyICIiCisKKyM6IHN0dWIuaDo0MAorbXNnaWQgIiIKKyJNZXRhZGF0YSBpbiBMVk0xIGZvcm1hdCBjYW4gc3RpbGwgYmUgZGlzcGxheWVkIHVzaW5nIExWTTEncyBwdmRhdGEgY29tbWFuZC4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjExNQorIywgYy1mb3JtYXQKK21zZ2lkICJza2lwX2Rldl9kaXI6IENvdWxkbid0IHNwbGl0IHVwIGRldmljZSBuYW1lICVzIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMjQgdG9vbGxpYi5jOjMyMgorbXNnaWQgInZnL2x2IHN0cmluZyBhbGxvYyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjIxNQorbXNnaWQgIk9uZSBvciBtb3JlIHNwZWNpZmllZCBsb2dpY2FsIHZvbHVtZShzKSBub3QgZm91bmQuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoyNTEKK21zZ2lkICJVc2luZyBsb2dpY2FsIHZvbHVtZShzKSBvbiBjb21tYW5kIGxpbmUiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjI2NCB0b29sbGliLmM6NTQwIHRvb2xsaWIuYzo2ODkgdG9vbGxpYi5jOjEwNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2tpcHBpbmcgaW52YWxpZCB0YWcgJXMiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjI4MSB0b29sbGliLmM6ODA3IHRvb2xsaWIuYzo4MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiXCIlc1wiOiBJbnZhbGlkIHBhdGggZm9yIExvZ2ljYWwgVm9sdW1lIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzozMzUKK21zZ2lkICJGaW5kaW5nIGFsbCBsb2dpY2FsIHZvbHVtZXMiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjMzNyB0b29sbGliLmM6NTcyCittc2dpZCAiTm8gdm9sdW1lIGdyb3VwcyBmb3VuZCIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MzU3IHRvb2xsaWIuYzo0ODMgdG9vbGxpYi5jOjczMSB2Z2NmZ2JhY2t1cC5jOjU5IHZnY2suYzoyNAorIzogdmdyZWR1Y2UuYzo1MDUgdmdzY2FuLmM6MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjM2OSB2Z2NoYW5nZS5jOjUyMyB2Z2NrLmM6Mjkgdmdjb252ZXJ0LmM6NDMgdmdzY2FuLmM6MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpbmNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjUzNAorbXNnaWQgIlVzaW5nIHZvbHVtZSBncm91cChzKSBvbiBjb21tYW5kIGxpbmUiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjU1NQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHZvbHVtZSBncm91cCBuYW1lOiAlcyIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6NTcwCittc2dpZCAiRmluZGluZyBhbGwgdm9sdW1lIGdyb3VwcyIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6NzA1IHRvb2xsaWIuYzoxMDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIFZvbHVtZSBcIiVzXCIgbm90IGZvdW5kIGluIFZvbHVtZSBHcm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjcxNgorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVhZCBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzo3NTUKK21zZ2lkICJVc2luZyBhbGwgcGh5c2ljYWwgdm9sdW1lKHMpIGluIHZvbHVtZSBncm91cCIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6ODI1Cittc2dpZCAiQWxsb2NhdGlvbiBvZiB2Z19uYW1lIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6ODM1CisjLCBjLWZvcm1hdAorbXNnaWQgIlBhdGggcmVxdWlyZWQgZm9yIExvZ2ljYWwgVm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6ODU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkVudmlyb25tZW50IFZvbHVtZSBHcm91cCBpbiBMVk1fVkdfTkFNRSBpbnZhbGlkOiBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjg3NAorIywgYy1mb3JtYXQKK21zZ2lkICJBZGRpbmcgUEUgcmFuZ2U6IHN0YXJ0IFBFICV1IGxlbmd0aCAldSBvbiAlcyIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6ODgyCisjLCBjLWZvcm1hdAorbXNnaWQgIk92ZXJsYXBwaW5nIFBFIHJhbmdlcyBzcGVjaWZpZWQgKCV1LSV1LCAldS0ldSkgb24gJXMiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjg5MiB0b29sbGliLmM6MTAzOSB0b29sbGliLmM6MTEwMworbXNnaWQgIkFsbG9jYXRpb24gb2YgbGlzdCBmYWlsZWQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjk1NgorIywgYy1mb3JtYXQKK21zZ2lkICJQRSByYW5nZSBlcnJvcjogc3RhcnQgZXh0ZW50ICV1IHRvIGVuZCBleHRlbnQgJXUiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjk3MQorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCBleHRlbnQgcGFyc2luZyBlcnJvciBhdCAlcyIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6OTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSAlcyBub3QgYWxsb2NhdGFibGUiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjk5MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBmcmVlIGV4dGVudHMgb24gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTAwMiB0b29sbGliLmM6MTExMAorbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBwaHlzaWNhbCB2b2x1bWUgbGlzdC4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEwMDkKK21zZ2lkICJBbGxvY2F0aW9uIG9mIHBlX3JhbmdlcyBsaXN0IGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTA5MQorbXNnaWQgIk5vIHNwZWNpZmllZCBQVnMgaGF2ZSBzcGFjZSBhdmFpbGFibGUiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjExMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgbG9jayAlcyBmb3IgbWV0YWRhdGEgcmVjb3Zlcnk6IHNraXBwaW5nIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMTQ4Cittc2dpZCAiIgorIk5hbWVzIHN0YXJ0aW5nIFwic25hcHNob3RcIiBhcmUgcmVzZXJ2ZWQuIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgTFYgbmFtZS4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjExNTQKK21zZ2lkICIiCisiTmFtZXMgc3RhcnRpbmcgXCJwdm1vdmVcIiBhcmUgcmVzZXJ2ZWQuIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgTFYgbmFtZS4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjExNjAKK21zZ2lkICIiCisiTmFtZXMgaW5jbHVkaW5nIFwiX21sb2dcIiBhcmUgcmVzZXJ2ZWQuIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgTFYgbmFtZS4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjExNjYKK21zZ2lkICIiCisiTmFtZXMgaW5jbHVkaW5nIFwiX21pbWFnZVwiIGFyZSByZXNlcnZlZC4gUGxlYXNlIGNob29zZSBhIGRpZmZlcmVudCBMViBuYW1lLiIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTE4MworIywgYy1mb3JtYXQKK21zZ2lkICIlczogYWxyZWFkeSBleGlzdHMgaW4gZmlsZXN5c3RlbSIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTIyNworbXNnaWQgIk5hbWUgYWxsb2NhdGlvbiBmYWlsZWQgLSBkZXZpY2Ugbm90IGNsZWFyZWQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEyMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmFtZSB0b28gbG9uZyAtIGRldmljZSBub3QgY2xlYXJlZCAoJXMpIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMjM3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNsZWFyaW5nIHN0YXJ0IG9mIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTI0MAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm90IGZvdW5kOiBkZXZpY2Ugbm90IGNsZWFyZWQiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEyNzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmFtZSBhbGxvY2F0aW9uIGZhaWxlZCAtIGxvZyBoZWFkZXIgbm90IHdyaXR0ZW4gKCVzKSIKK21zZ3N0ciAiIgorCisjOiB0b29sbGliLmM6MTI4MworIywgYy1mb3JtYXQKK21zZ2lkICJOYW1lIHRvbyBsb25nIC0gbG9nIGhlYWRlciBub3Qgd3JpdHRlbiAoJXMpIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIldyaXRpbmcgbG9nIGhlYWRlciB0byBkZXZpY2UsICVzIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBub3QgZm91bmQ6IGxvZyBoZWFkZXIgbm90IHdyaXR0ZW4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEyOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIGxvZyBoZWFkZXIgdG8gJXMiCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEzMjQKK21zZ2lkICJsb2dfbmFtZSBhbGxvY2F0aW9uIGZhaWxlZC4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMzQ0Cittc2dpZCAiQWJvcnRpbmcuIFVuYWJsZSB0byB0YWcgbWlycm9yIGxvZy4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEzNjIKK21zZ2lkICIiCisiQWJvcnRpbmcuIFVuYWJsZSB0byBjcmVhdGUgaW4tc3luYyBtaXJyb3IgbG9nIHdoaWxlIGFjdGl2YXRpb24gaXMgZGlzYWJsZWQuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMzY4Cittc2dpZCAiQWJvcnRpbmcuIEZhaWxlZCB0byBhY3RpdmF0ZSBtaXJyb3IgbG9nLiBSZW1vdmUgbmV3IExWcyBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMzc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW1vdmUgdGFnICVzIGZyb20gbWlycm9yIGxvZy4iCittc2dzdHIgIiIKKworIzogdG9vbGxpYi5jOjEzODAKK21zZ2lkICJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgbWlycm9yIGxvZy4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMzg2Cittc2dpZCAiQWJvcnRpbmcuIEZhaWxlZCB0byB3cml0ZSBtaXJyb3IgbG9nIGhlYWRlci4gUmVtb3ZlIG5ldyBMViBhbmQgcmV0cnkuIgorbXNnc3RyICIiCisKKyM6IHRvb2xsaWIuYzoxMzkyCittc2dpZCAiQWJvcnRpbmcuIEZhaWxlZCB0byBkZWFjdGl2YXRlIG1pcnJvciBsb2cuIFJlbW92ZSBuZXcgTFYgYW5kIHJldHJ5LiIKK21zZ3N0ciAiIgorCisjOiB1dWlkL3V1aWQuYzoxMzIKK21zZ2lkICJVVUlEIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIgorbXNnc3RyICIiCisKKyM6IHV1aWQvdXVpZC5jOjE1NgorbXNnaWQgIkNvdWxkbid0IHdyaXRlIHV1aWQsIGJ1ZmZlciB0b28gc21hbGwuIgorbXNnc3RyICIiCisKKyM6IHV1aWQvdXVpZC5jOjE4NAorbXNnaWQgIlRvbyBtYW55IGNoYXJhY3RlcnMgdG8gYmUgdXVpZC4iCittc2dzdHIgIiIKKworIzogdXVpZC91dWlkLmM6MTkyCittc2dpZCAiQ291bGRuJ3QgcmVhZCB1dWlkLCBpbmNvcnJlY3QgbnVtYmVyIG9mIGNoYXJhY3RlcnMuIgorbXNnc3RyICIiCisKKyM6IHZnY2ZnYmFja3VwLmM6MjcKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZW5hbWUuIgorbXNnc3RyICIiCisKKyM6IHZnY2ZnYmFja3VwLmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcHJvY2Vzc2luZyBmaWxlbmFtZSB0ZW1wbGF0ZSAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NmZ2JhY2t1cC5jOjM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJWR3MgbXVzdCBiZSBiYWNrZWQgdXAgaW50byBkaWZmZXJlbnQgZmlsZXMuIFVzZSAlJXMgaW4gZmlsZW5hbWUgZm9yIFZHIG5hbWUuIgorbXNnc3RyICIiCisKKyM6IHZnY2ZnYmFja3VwLmM6NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogVm9sdW1lIGdyb3VwIFwiJXNcIiBpbmNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogdmdjZmdiYWNrdXAuYzo3NgorbXNnaWQgIk5vIGJhY2t1cCB0YWtlbjogc3BlY2lmeSBmaWxlbmFtZSB3aXRoIC1mIHRvIGJhY2t1cCBhbiBpbmNvbnNpc3RlbnQgVkciCittc2dzdHIgIiIKKworIzogdmdjZmdiYWNrdXAuYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBiYWNrZWQgdXAuIgorbXNnc3RyICIiCisKKyM6IHZnY2ZncmVzdG9yZS5jOjIzCittc2dpZCAiUGxlYXNlIHNwZWNpZnkgYSAqc2luZ2xlKiB2b2x1bWUgZ3JvdXAgdG8gcmVzdG9yZS4iCittc2dzdHIgIiIKKworIzogdmdjZmdyZXN0b3JlLmM6MzAgdmdleHRlbmQuYzo0NSB2Z3JlZHVjZS5jOjQ2OSB2Z3NwbGl0LmM6MjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBuYW1lIFwiJXNcIiBpcyBpbnZhbGlkIgorbXNnc3RyICIiCisKKyM6IHZnY2ZncmVzdG9yZS5jOjQ2Cittc2dpZCAiVW5hYmxlIHRvIGxvY2sgb3JwaGFucyIKK21zZ3N0ciAiIgorCisjOiB2Z2NmZ3Jlc3RvcmUuYzo1MQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gbG9jayB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogdmdjZmdyZXN0b3JlLmM6NjIKK21zZ2lkICJSZXN0b3JlIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogdmdjZmdyZXN0b3JlLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVzdG9yZWQgdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6OTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3Bhd25pbmcgYmFja2dyb3VuZCBwcm9jZXNzIGZvciAlcyAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjExMQorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBsb2dpY2FsIHZvbHVtZShzKSBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiICVzbW9uaXRvcmVkIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IGRlYWN0aXZhdGUgdm9sdW1lIGdyb3VwIFwiJXNcIiB3aXRoICVkIG9wZW4gbG9naWNhbCB2b2x1bWUocykiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoxMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9ja2luZyBpbmFjdGl2ZTogaWdub3JpbmcgY2x1c3RlcmVkIHZvbHVtZSBncm91cCAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICIlZCBsb2dpY2FsIHZvbHVtZShzKSBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIGFscmVhZHkgYWN0aXZlIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGV4aXN0aW5nIGxvZ2ljYWwgdm9sdW1lKHMpIGluIHZvbHVtZSBncm91cCBcIiVzXCIgJXNtb25pdG9yZWQiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoxNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQWN0aXZhdGVkIGxvZ2ljYWwgdm9sdW1lcyBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MTY0CisjLCBjLWZvcm1hdAorbXNnaWQgIkRlYWN0aXZhdGVkIGxvZ2ljYWwgdm9sdW1lcyBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVkIGxvZ2ljYWwgdm9sdW1lKHMpIGluIHZvbHVtZSBncm91cCBcIiVzXCIgbm93IGFjdGl2ZSIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjE3OSB2Z2NyZWF0ZS5jOjQ3Cittc2dpZCAiVm9sdW1lIEdyb3VwIGFsbG9jYXRpb24gcG9saWN5IGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmciCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoxODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIGFsbG9jYXRpb24gcG9saWN5IGlzIGFscmVhZHkgJXMiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyMDAgdmdjaGFuZ2UuYzoyMzUgdmdjaGFuZ2UuYzoyODIgdmdjaGFuZ2UuYzozMjQgdmdjaGFuZ2UuYzozNzEKKyM6IHZnY2hhbmdlLmM6NDI5IHZnY2hhbmdlLmM6NDcxIHZnY2hhbmdlLmM6NTA0CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGNoYW5nZWQiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IHJlc2l6ZWFibGUiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IG5vdCByZXNpemVhYmxlIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgYWxyZWFkeSBjbHVzdGVyZWQiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IG5vdCBjbHVzdGVyZWQiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwICVzIGNvbnRhaW5zIHNuYXBzaG90cyB0aGF0IGFyZSBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBtdXN0IGJlIHJlc2l6ZWFibGUgdG8gY2hhbmdlIE1heExvZ2ljYWxWb2x1bWUiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzozMDIKK21zZ2lkICJNYXhMb2dpY2FsVm9sdW1lIGxpbWl0IGlzIDI1NSIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjMwOAorIywgYy1mb3JtYXQKK21zZ2lkICJNYXhMb2dpY2FsVm9sdW1lIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBudW1iZXIgJWQgb2YgTFZzIGZvciBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzozMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBtdXN0IGJlIHJlc2l6ZWFibGUgdG8gY2hhbmdlIE1heFBoeXNpY2FsVm9sdW1lcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjM0MQorbXNnaWQgIk1heFBoeXNpY2FsVm9sdW1lcyBtYXkgbm90IGJlIG5lZ2F0aXZlIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MzQ5Cittc2dpZCAiTWF4UGh5c2ljYWxWb2x1bWUgbGltaXQgaXMgMjU1IgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MzU1CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heFBoeXNpY2FsVm9sdW1lcyBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyICVkIG9mIFBWcyBmb3IgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MzgxCisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgbXVzdCBiZSByZXNpemVhYmxlIHRvIGNoYW5nZSBQRSBzaXplIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6Mzg3IHZnY3JlYXRlLmM6NjQKK21zZ2lkICJQaHlzaWNhbCBleHRlbnQgc2l6ZSBtYXkgbm90IGJlIG5lZ2F0aXZlIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6MzkzIHZnY3JlYXRlLmM6ODMKK21zZ2lkICJQaHlzaWNhbCBleHRlbnQgc2l6ZSBtYXkgbm90IGJlIHplcm8iCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzozOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgZXh0ZW50IHNpemUgb2YgVkcgJXMgaXMgYWxyZWFkeSAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjQwNAorbXNnaWQgIlBoeXNpY2FsIGV4dGVudCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyLiIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjQxMQorbXNnaWQgIk5ldyBleHRlbnQgc2l6ZSBpcyBub3QgYSBwZXJmZWN0IGZpdCIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjQ1NCB2Z2NyZWF0ZS5jOjExNworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gYWRkIHRhZyAlcyB0byB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzo0NjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlbW92ZSB0YWcgJXMgZnJvbSB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzo0ODIKK21zZ2lkICJWb2x1bWUgZ3JvdXAgaGFzIGFjdGl2ZSBsb2dpY2FsIHZvbHVtZXMiCittc2dzdHIgIiIKKworIzogdmdjaGFuZ2UuYzo0OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyByYW5kb20gVVVJRCBmb3IgVkcgJXMuIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6NTE2IHZnY29udmVydC5jOjM2IHZnZXhwb3J0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGZpbmQgdm9sdW1lIGdyb3VwIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjU4OAorbXNnaWQgIiIKKyJPbmUgb2YgLWEsIC1jLCAtbCwgLXAsIC1zLCAteCwgLS11dWlkLCAtLWFsbG9jLCAtLWFkZHRhZyBvciAtLWRlbHRhZyByZXF1aXJlZCIKK21zZ3N0ciAiIgorCisjOiB2Z2NoYW5nZS5jOjYwMAorbXNnaWQgIiIKKyJPbmx5IG9uZSBvZiAtYSwgLWMsIC1sLCAtcCwgLXMsIC14LCAtLXV1aWQsIC0tYWxsb2MsIC0tYWRkdGFnIG9yIC0tZGVsdGFnICIKKyJhbGxvd2VkIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6NjA3Cittc2dpZCAiLS1pZ25vcmVsb2NraW5nZmFpbHVyZSBvbmx5IGF2YWlsYWJsZSB3aXRoIC1hIgorbXNnc3RyICIiCisKKyM6IHZnY2hhbmdlLmM6NjEzCittc2dpZCAiLUEgb3B0aW9uIG5vdCBuZWNlc3Nhcnkgd2l0aCAtYSBvcHRpb24iCittc2dzdHIgIiIKKworIzogdmdjb252ZXJ0LmM6NTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBhbHJlYWR5IHVzZXMgZm9ybWF0ICVzIgorbXNnc3RyICIiCisKKyM6IHZnY29udmVydC5jOjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFyY2hpdmUgb2YgXCIlc1wiIG1ldGFkYXRhIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogdmdjb252ZXJ0LmM6MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lICVzIG11c3QgYmUgZGVhY3RpdmF0ZWQgYmVmb3JlIGNvbnZlcnNpb24uIgorbXNnc3RyICIiCisKKyM6IHZnY29udmVydC5jOjEzMCB2Z2NvbnZlcnQuYzoxNDUgdmdjb252ZXJ0LmM6MTU3IHZnY29udmVydC5jOjE3MAorIzogdmdjb252ZXJ0LmM6MTg2Cittc2dpZCAiVXNlIHB2Y3JlYXRlIGFuZCB2Z2NmZ3Jlc3RvcmUgdG8gcmVwYWlyIGZyb20gYXJjaGl2ZWQgbWV0YWRhdGEuIgorbXNnc3RyICIiCisKKyM6IHZnY29udmVydC5jOjE2NgorIywgYy1mb3JtYXQKK21zZ2lkICJEZWxldGluZyBleGlzdGluZyBtZXRhZGF0YSBmb3IgVkcgJXMiCittc2dzdHIgIiIKKworIzogdmdjb252ZXJ0LmM6MTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbW92YWwgb2YgZXhpc3RpbmcgbWV0YWRhdGEgZm9yICVzIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogdmdjb252ZXJ0LmM6MTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlRlc3QgbW9kZTogU2tpcHBpbmcgbWV0YWRhdGEgd3JpdGluZyBmb3IgVkcgJXMgaW4gZm9ybWF0ICVzIgorbXNnc3RyICIiCisKKyM6IHZnY29udmVydC5jOjE4MgorIywgYy1mb3JtYXQKK21zZ2lkICJXcml0aW5nIG1ldGFkYXRhIGZvciBWRyAlcyB1c2luZyBmb3JtYXQgJXMiCittc2dzdHIgIiIKKworIzogdmdjb252ZXJ0LmM6MTg1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnNpb24gZmFpbGVkIGZvciB2b2x1bWUgZ3JvdXAgJXMuIgorbXNnc3RyICIiCisKKyM6IHZnY29udmVydC5jOjE5MAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgJXMgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCIKK21zZ3N0ciAiIgorCisjOiB2Z2NvbnZlcnQuYzoyMDAKK21zZ2lkICJQbGVhc2UgZW50ZXIgdm9sdW1lIGdyb3VwKHMpIgorbXNnc3RyICIiCisKKyM6IHZnY3JlYXRlLmM6MzEKK21zZ2lkICJQbGVhc2UgcHJvdmlkZSB2b2x1bWUgZ3JvdXAgbmFtZSBhbmQgcGh5c2ljYWwgdm9sdW1lcyIKK21zZ3N0ciAiIgorCisjOiB2Z2NyZWF0ZS5jOjM3Cittc2dpZCAiUGxlYXNlIGVudGVyIHBoeXNpY2FsIHZvbHVtZSBuYW1lKHMpIgorbXNnc3RyICIiCisKKyM6IHZnY3JlYXRlLmM6NTgKK21zZ2lkICJOdW1iZXIgb2Ygdm9sdW1lcyBtYXkgbm90IGV4Y2VlZCAyNTUiCittc2dzdHIgIiIKKworIzogdmdjcmVhdGUuYzo2OQorbXNnaWQgIk1heCBMb2dpY2FsIFZvbHVtZXMgbWF5IG5vdCBiZSBuZWdhdGl2ZSIKK21zZ3N0ciAiIgorCisjOiB2Z2NyZWF0ZS5jOjc0Cittc2dpZCAiTWF4IFBoeXNpY2FsIFZvbHVtZXMgbWF5IG5vdCBiZSBuZWdhdGl2ZSIKK21zZ3N0ciAiIgorCisjOiB2Z2NyZWF0ZS5jOjg4IHZncmVuYW1lLmM6NTIgdmdzcGxpdC5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgdm9sdW1lIGdyb3VwIG5hbWUgXCIlc1wiIGlzIGludmFsaWQiCittc2dzdHIgIiIKKworIzogdmdjcmVhdGUuYzo5OAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBTZXR0aW5nIG1heGxvZ2ljYWx2b2x1bWVzIHRvICVkICgwIG1lYW5zIHVubGltaXRlZCkiCittc2dzdHIgIiIKKworIzogdmdjcmVhdGUuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogU2V0dGluZyBtYXhwaHlzaWNhbHZvbHVtZXMgdG8gJWQgKDAgbWVhbnMgdW5saW1pdGVkKSIKK21zZ3N0ciAiIgorCisjOiB2Z2NyZWF0ZS5jOjExMgorbXNnaWQgIlZvbHVtZSBncm91cCBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIgorbXNnc3RyICIiCisKKyM6IHZnY3JlYXRlLmM6MTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQiCittc2dzdHIgIiIKKworIzogdmdkaXNwbGF5LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogVm9sdW1lIGdyb3VwIFwiJXNcIiBpbmNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogdmdkaXNwbGF5LmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiV0FSTklORzogdm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBleHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiB2Z2Rpc3BsYXkuYzo1MgorbXNnaWQgIi0tLSBQaHlzaWNhbCB2b2x1bWVzIC0tLSIKK21zZ3N0ciAiIgorCisjOiB2Z2Rpc3BsYXkuYzo4MQorbXNnaWQgIk9wdGlvbiAtYyBpcyBub3QgYWxsb3dlZCB3aXRoIG9wdGlvbiAtcyIKK21zZ3N0ciAiIgorCisjOiB2Z2Rpc3BsYXkuYzo4NgorbXNnaWQgIk9wdGlvbiAtQSBpcyBub3QgYWxsb3dlZCB3aXRoIHZvbHVtZSBncm91cCBuYW1lcyIKK21zZ3N0ciAiIgorCisjOiB2Z2V4cG9ydC5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCAlcyBpbmNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogdmdleHBvcnQuYzozNworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIGFscmVhZHkgZXhwb3J0ZWQiCittc2dzdHIgIiIKKworIzogdmdleHBvcnQuYzo0NworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGhhcyBhY3RpdmUgbG9naWNhbCB2b2x1bWVzIgorbXNnc3RyICIiCisKKyM6IHZnZXhwb3J0LmM6NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBzdWNjZXNzZnVsbHkgZXhwb3J0ZWQiCittc2dzdHIgIiIKKworIzogdmdleHBvcnQuYzo3OCB2Z2ltcG9ydC5jOjY4Cittc2dpZCAiUGxlYXNlIHN1cHBseSB2b2x1bWUgZ3JvdXBzIG9yIHVzZSAtYSBmb3IgYWxsLiIKK21zZ3N0ciAiIgorCisjOiB2Z2V4cG9ydC5jOjgzIHZnaW1wb3J0LmM6NzMKK21zZ2lkICJObyBhcmd1bWVudHMgcGVybWl0dGVkIHdoZW4gdXNpbmcgLWEgZm9yIGFsbC4iCittc2dzdHIgIiIKKworIzogdmdleHRlbmQuYzoyNQorbXNnaWQgIlBsZWFzZSBlbnRlciB2b2x1bWUgZ3JvdXAgbmFtZSBhbmQgcGh5c2ljYWwgdm9sdW1lKHMpIgorbXNnc3RyICIiCisKKyM6IHZnZXh0ZW5kLmM6MzEKK21zZ2lkICJQbGVhc2UgZW50ZXIgcGh5c2ljYWwgdm9sdW1lKHMpIgorbXNnc3RyICIiCisKKyM6IHZnZXh0ZW5kLmM6NTAgdmdtZXJnZS5jOjMyIHZnbWVyZ2UuYzo2MyB2Z3NwbGl0LmM6MjM4IHZnc3BsaXQuYzoyNzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hlY2tpbmcgZm9yIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdleHRlbmQuYzo1OAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIG5vdCBmb3VuZC4iCittc2dzdHIgIiIKKworIzogdmdleHRlbmQuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIG5vdCByZXNpemVhYmxlLiIKK21zZ3N0ciAiIgorCisjOiB2Z2V4dGVuZC5jOjk4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgd2lsbCBiZSBleHRlbmRlZCBieSAlZCBuZXcgcGh5c2ljYWwgdm9sdW1lcyIKK21zZ3N0ciAiIgorCisjOiB2Z2V4dGVuZC5jOjExMAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBleHRlbmRlZCIKK21zZ3N0ciAiIgorCisjOiB2Z2ltcG9ydC5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBmaW5kIGV4cG9ydGVkIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdpbXBvcnQuYzozMworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIG5vdCBleHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiB2Z2ltcG9ydC5jOjM4CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgcGFydGlhbGx5IG1pc3NpbmciCittc2dzdHIgIiIKKworIzogdmdpbXBvcnQuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBpbXBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MjggdmdzcGxpdC5jOjIzNAorIywgYy1mb3JtYXQKK21zZ2lkICJEdXBsaWNhdGUgdm9sdW1lIGdyb3VwIG5hbWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHZnbWVyZ2UuYzo5MyB2Z3NwbGl0LmM6Mjk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvZ2ljYWwgdm9sdW1lcyBpbiBcIiVzXCIgbXVzdCBiZSBpbmFjdGl2ZSIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MTAwCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4dGVudCBzaXplcyBkaWZmZXI6ICVkICglcykgYW5kICVkICglcykiCittc2dzdHIgIiIKKworIzogdmdtZXJnZS5jOjEwOAorIywgYy1mb3JtYXQKK21zZ2lkICJNYXhpbXVtIG51bWJlciBvZiBwaHlzaWNhbCB2b2x1bWVzICglZCkgZXhjZWVkZWQgIGZvciBcIiVzXCIgYW5kIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MTE2CisjLCBjLWZvcm1hdAorbXNnaWQgIk1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAoJWQpIGV4Y2VlZGVkICBmb3IgXCIlc1wiIGFuZCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdtZXJnZS5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJEdXBsaWNhdGUgbG9naWNhbCB2b2x1bWUgbmFtZSBcIiVzXCIgaW4gXCIlc1wiIGFuZCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdtZXJnZS5jOjE0MiB2Z21lcmdlLmM6MTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIlBoeXNpY2FsIHZvbHVtZSAlcyBtaWdodCBiZSBjb25zdHJ1Y3RlZCBmcm9tIHNhbWUgdm9sdW1lIGdyb3VwICVzLiIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MTg2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZW5lcmF0ZSBuZXcgcmFuZG9tIExWSUQgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IHZnbWVyZ2UuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2hhbmdlZCBMVklEIGZvciAlcyB0byAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MjM1CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IG1lcmdlZCBpbnRvIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z21lcmdlLmM6MjUyCittc2dpZCAiUGxlYXNlIGVudGVyIDIgb3IgbW9yZSB2b2x1bWUgZ3JvdXBzIHRvIG1lcmdlIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6MjQKK21zZ2lkICJWb2x1bWUgR3JvdXBzIG11c3QgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIFBWIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVtb3ZpbmcgUFYgd2l0aCBVVUlEICVzIGZyb20gVkcgJXMiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJMVnMgc3RpbGwgcHJlc2VudCBvbiBQViB3aXRoIFVVSUQgJXM6IENhbid0IHJlbW92ZSBmcm9tIFZHICVzIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMvJXMgaGFzIG1pc3NpbmcgZXh0ZW50czogcmVtb3ZpbmcgKGluY2x1ZGluZyBkZXBlbmRlbmNpZXMpIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGVhY3RpdmF0aW5nIChpZiBhY3RpdmUpIGxvZ2ljYWwgdm9sdW1lICVzIChvcmlnaW4gb2YgJXMpIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NzIgdmdyZWR1Y2UuYzo4OSB2Z3JlZHVjZS5jOjMzMworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZGVhY3RpdmF0ZSBMViAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjk5IHZncmVkdWNlLmM6MTQ2IHZncmVkdWNlLmM6MzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbW92aW5nIExWICVzIGZyb20gVkcgJXMiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzoxOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm9uLW1pcnJvci1pbWFnZSBMViAlcyBmb3VuZDogY2FuJ3QgcmVtb3ZlLiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjIwNworbXNnaWQgIkFib3J0aW5nIGJlY2F1c2UgLS1taXJyb3Jzb25seSB3YXMgc3BlY2lmaWVkLiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjIzMiB2Z3JlZHVjZS5jOjUyOQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gd3JpdGUgb3V0IGEgY29uc2lzdGVudCBWRyBmb3IgJXMiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzoyNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNvbW1pdCBjb25zaXN0ZW50IFZHIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjI1OAorbXNnaWQgIkZhaWxlZCB0byByZXN1bWUgTFZzIHVzaW5nIGVycm9yIHNlZ21lbnRzLiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgbG9nIGRldmljZSBmb3IgJXMvJXMgaGFzIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9nIGRldmljZSBmb3IgJXMvJXMgaGFzIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzozMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHdyaXRlIG91dCB1cGRhdGVkIFZHIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjMxOAorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY29tbWl0IHVwZGF0ZWQgVkcgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6MzI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkRlYWN0aXZhdGluZyAoaWYgYWN0aXZlKSBsb2dpY2FsIHZvbHVtZSAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjM3MQorIywgYy1mb3JtYXQKK21zZ2lkICJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIHN0aWxsIGluIHVzZSIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjM3NgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCByZW1vdmUgZmluYWwgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBmcm9tIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzozODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVtb3ZpbmcgXCIlc1wiIGZyb20gdm9sdW1lIGdyb3VwIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjQwNAorIywgYy1mb3JtYXQKK21zZ2lkICJSZW1vdmFsIG9mIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgZnJvbSBcIiVzXCIgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NDE4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbW92ZWQgXCIlc1wiIGZyb20gdm9sdW1lIGdyb3VwIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjQzMQorbXNnaWQgIlBsZWFzZSBnaXZlIHZvbHVtZSBncm91cCBuYW1lIGFuZCBwaHlzaWNhbCB2b2x1bWUgcGF0aHMiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzo0MzcKK21zZ2lkICJQbGVhc2UgZ2l2ZSB2b2x1bWUgZ3JvdXAgbmFtZSIKK21zZ3N0ciAiIgorCisjOiB2Z3JlZHVjZS5jOjQ0MworbXNnaWQgIi0tbWlycm9yc29ubHkgcmVxdWlyZXMgLS1yZW1vdmVtaXNzaW5nIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NDQ5Cittc2dpZCAiUGxlYXNlIGVudGVyIHBoeXNpY2FsIHZvbHVtZSBwYXRocyBvciBvcHRpb24gLWEiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzo0NTQKK21zZ2lkICJPcHRpb24gLWEgYW5kIHBoeXNpY2FsIHZvbHVtZSBwYXRocyBtdXR1YWxseSBleGNsdXNpdmUiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzo0NjAKK21zZ2lkICJQbGVhc2Ugb25seSBzcGVjaWZ5IHRoZSB2b2x1bWUgZ3JvdXAiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzo0OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IGNvbnNpc3RlbnQiCittc2dzdHIgIiIKKworIzogdmdyZWR1Y2UuYzo1MzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiV3JvdGUgb3V0IGNvbnNpc3RlbnQgdm9sdW1lIGdyb3VwICVzIgorbXNnc3RyICIiCisKKyM6IHZncmVkdWNlLmM6NTUzCisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgbm90IHJlZHVjaWJsZSIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbW92ZS5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIlZvbHVtZSBncm91cCBcIiVzXCIgbm90IGZvdW5kIG9yIGluY29uc2lzdGVudC4iCittc2dzdHIgIiIKKworIzogdmdyZW1vdmUuYzoyOQorbXNnaWQgIkNvbnNpZGVyIHZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyBpZiBtZXRhZGF0YSBpcyBpbmNvbnNpc3RlbnQuIgorbXNnc3RyICIiCisKKyM6IHZncmVtb3ZlLmM6NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBzdGlsbCBjb250YWlucyAlZCBsb2dpY2FsIHZvbHVtZShzKSIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbW92ZS5jOjQ5CisjLCBjLWZvcm1hdAorbXNnaWQgInZnX3JlbW92ZSAlcyBmYWlsZWQiCittc2dzdHIgIiIKKworIzogdmdyZW1vdmUuYzo1NgorIywgYy1mb3JtYXQKK21zZ2lkICJSZW1vdmluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGZyb20gdm9sdW1lIGdyb3VwIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbW92ZS5jOjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW1vdmUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBmcm9tIHZvbHVtZSBncm91cCBcIiVzXCIiCittc2dzdHIgIiIKKworIzogdmdyZW1vdmUuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSByZW1vdmVkIgorbXNnc3RyICIiCisKKyM6IHZncmVtb3ZlLmM6ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBub3QgcHJvcGVybHkgcmVtb3ZlZCIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbW92ZS5jOjkxCittc2dpZCAiUGxlYXNlIGVudGVyIG9uZSBvciBtb3JlIHZvbHVtZSBncm91cCBwYXRocyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjM0Cittc2dpZCAiT2xkIGFuZCBuZXcgdm9sdW1lIGdyb3VwIG5hbWVzIG5lZWQgc3BlY2lmeWluZyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIk5ldyB2b2x1bWUgZ3JvdXAgcGF0aCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICVkISIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjU4Cittc2dpZCAiT2xkIGFuZCBuZXcgdm9sdW1lIGdyb3VwIG5hbWVzIG11c3QgZGlmZmVyIgorbXNnc3RyICIiCisKKyM6IHZncmVuYW1lLmM6NjYKK21zZ2lkICJObyBjb21wbGV0ZSB2b2x1bWUgZ3JvdXBzIGZvdW5kIgorbXNnc3RyICIiCisKKyM6IHZncmVuYW1lLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRm91bmQgbW9yZSB0aGFuIG9uZSBWRyBjYWxsZWQgJXMuIFBsZWFzZSBzdXBwbHkgVkcgdXVpZC4iCittc2dzdHIgIiIKKworIzogdmdyZW5hbWUuYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgJXMgJXMlcyVzbm90IGZvdW5kLiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjEyMworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN0aWxsIGhhcyBhY3RpdmUgTFZzIgorbXNnc3RyICIiCisKKyM6IHZncmVuYW1lLmM6MTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNoZWNraW5nIGZvciBuZXcgdm9sdW1lIGdyb3VwIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJOZXcgdm9sdW1lIGdyb3VwIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjE1NAorIywgYy1mb3JtYXQKK21zZ2lkICJSZW5hbWluZyBcIiVzXCIgdG8gXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IHZncmVuYW1lLmM6MTU2Cittc2dpZCAiVGVzdCBtb2RlOiBTa2lwcGluZyByZW5hbWUuIgorbXNnc3RyICIiCisKKyM6IHZncmVuYW1lLmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlbmFtaW5nIFwiJXNcIiB0byBcIiVzXCIgZmFpbGVkOiAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3JlbmFtZS5jOjE3NworIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSByZW5hbWVkIHRvIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB2Z3NjYW4uYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJGb3VuZCAlc3ZvbHVtZSBncm91cCBcIiVzXCIgdXNpbmcgbWV0YWRhdGEgdHlwZSAlcyIKK21zZ3N0ciAiIgorCisjOiB2Z3NjYW4uYzo1MAorbXNnaWQgIlRvbyBtYW55IHBhcmFtZXRlcnMgb24gY29tbWFuZCBsaW5lIgorbXNnc3RyICIiCisKKyM6IHZnc2Nhbi5jOjU3Cittc2dpZCAiUmVhZGluZyBhbGwgcGh5c2ljYWwgdm9sdW1lcy4gIFRoaXMgbWF5IHRha2UgYSB3aGlsZS4uLiIKK21zZ3N0ciAiIgorCisjOiB2Z3NwbGl0LmM6MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiUGh5c2ljYWwgdm9sdW1lICVzIG5vdCBpbiB2b2x1bWUgZ3JvdXAgJXMiCittc2dzdHIgIiIKKworIzogdmdzcGxpdC5jOjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IHNwbGl0IExvZ2ljYWwgVm9sdW1lICVzIGJldHdlZW4gdHdvIFZvbHVtZSBHcm91cHMiCittc2dzdHIgIiIKKworIzogdmdzcGxpdC5jOjE1MgorIywgYy1mb3JtYXQKK21zZ2lkICJTbmFwc2hvdCAlcyBzcGxpdCIKK21zZ3N0ciAiIgorCisjOiB2Z3NwbGl0LmM6MTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIk1pcnJvciAlcyBzcGxpdCIKK21zZ3N0ciAiIgorCisjOiB2Z3NwbGl0LmM6MjE4Cittc2dpZCAiRXhpc3RpbmcgVkcsIG5ldyBWRyBhbmQgcGh5c2ljYWwgdm9sdW1lcyByZXF1aXJlZC4iCittc2dzdHIgIiIKKworIzogdmdzcGxpdC5jOjI2NAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIG5vdCByZXNpemVhYmxlIgorbXNnc3RyICIiCisKKyM6IHZnc3BsaXQuYzoyODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVm9sdW1lIGdyb3VwIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyIKK21zZ3N0ciAiIgorCisjOiB2Z3NwbGl0LmM6MzM5Cittc2dpZCAiQ2Fubm90IHNwbGl0OiBOb3doZXJlIHRvIHN0b3JlIG1ldGFkYXRhIGZvciBuZXcgVm9sdW1lIEdyb3VwIgorbXNnc3RyICIiCisKKyM6IHZnc3BsaXQuYzozNDgKK21zZ2lkICJXcml0aW5nIG91dCB1cGRhdGVkIHZvbHVtZSBncm91cHMiCittc2dzdHIgIiIKKworIzogdmdzcGxpdC5jOjM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIGJlY2FtZSBpbmNvbnNpc3RlbnQ6IHBsZWFzZSBmaXggbWFudWFsbHkiCittc2dzdHIgIiIKKworIzogdmdzcGxpdC5jOjM4NQorIywgYy1mb3JtYXQKK21zZ2lkICJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBzcGxpdCBmcm9tIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiB6ZXJvL3plcm8uYzo3MQorbXNnaWQgInplcm8gbW9kdWxlIHN0cmluZyBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIgorbXNnc3RyICIiCmRpZmYgLS1naXQgYS9wby9wb2dlbi5oIGIvcG8vcG9nZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmRmMjhjCi0tLSAvZGV2L251bGwKKysrIGIvcG8vcG9nZW4uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIE1hY3JvcyB0byBjaGFuZ2UgbG9nIG1lc3NhZ2VzIGludG8gYSBmb3JtYXQgdGhhdCB4Z2V0dGV4dCBjYW4gaGFuZGxlLgorICoKKyAqIE5vdGUgdGhhdCBkaWZmZXJlbnQgUFJJKiBkZWZpbml0aW9ucyBsZWFkIHRvIGRpZmZlcmVudCBzdHJpbmdzIGZvcgorICogZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCisgKi8KKworI2RlZmluZSBwcmludF9sb2cobGV2ZWwsIGRtX2Vycm5vLCBmaWxlLCBsaW5lLCBmb3JtYXQsIGFyZ3MuLi4pIHByaW50X2xvZyhmb3JtYXQsIGFyZ3MpCisjZGVmaW5lIGRtX2xvZyhsZXZlbCwgZmlsZSwgbGluZSwgZm9ybWF0LCBhcmdzLi4uKSBkbV9sb2coZm9ybWF0LCBhcmdzKQorI2RlZmluZSBkbV9sb2dfd2l0aF9lcnJubyhsZXZlbCwgZG1fZXJybm8sIGZpbGUsIGxpbmUsIGZvcm1hdCwgYXJncy4uLikgXAorICAgIGRtX2xvZyhsZXZlbCwgZmlsZSwgbGluZSwgZm9ybWF0LCBhcmdzKQorCmRpZmYgLS1naXQgYS9weXRob24vLmdpdGlnbm9yZSBiL3B5dGhvbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2U0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKy5saWJsdm1fYnVpbHQKK3NldHVwLnB5CmRpZmYgLS1naXQgYS9weXRob24vTWFrZWZpbGUuaW4gYi9weXRob24vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjNTY2NAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE2IFJlZCBIYXQsIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAorCitUQVJHRVRTID0gLmxpYmx2bV9idWlsdAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworLmxpYmx2bV9idWlsdDogbGlibHZtX3B5dGhvbi5jCitpZmVxICgiQFBZVEhPTjJfQklORElOR1NAIiwgInllcyIpCisJJChQWVRIT04yKSBzZXR1cC5weSBidWlsZAorZW5kaWYKK2lmZXEgKCJAUFlUSE9OM19CSU5ESU5HU0AiLCAieWVzIikKKwkkKFBZVEhPTjMpIHNldHVwLnB5IGJ1aWxkCitlbmRpZgorCXRvdWNoICRACisKK2xpYmx2bV9weXRob24uYzoKKwkkKExOX1MpICQoc3JjZGlyKS9saWJsdm0uYyAkQAorCitpbnN0YWxsX3B5dGhvbl9iaW5kaW5nczogJChUQVJHRVRTKQoraWZlcSAoIkBQWVRIT04yX0JJTkRJTkdTQCIsICJ5ZXMiKQorCSQoUFlUSE9OMikgc2V0dXAucHkgaW5zdGFsbCAtLXNraXAtYnVpbGQgLS1wcmVmaXggJChweXRob25wcmVmaXgpCitlbmRpZgoraWZlcSAoIkBQWVRIT04zX0JJTkRJTkdTQCIsICJ5ZXMiKQorCSQoUFlUSE9OMykgc2V0dXAucHkgaW5zdGFsbCAtLXNraXAtYnVpbGQgLS1wcmVmaXggJChweXRob25wcmVmaXgpCitlbmRpZgorCitpbnN0YWxsX2x2bTI6IGluc3RhbGxfcHl0aG9uX2JpbmRpbmdzCisKK2luc3RhbGw6IGluc3RhbGxfbHZtMgorCisuUEhPTlk6IGluc3RhbGxfcHl0aG9uX2JpbmRpbmdzCisuSU5URVJNRURJQVRFOiBsaWJsdm1fcHl0aG9uLmMKKworY2xlYW46CisJJChSTSkgLXIgYnVpbGQKKworZGlzdGNsZWFuOiBjbGVhbgorCitDTEVBTl9UQVJHRVRTICs9IGxpYmx2bV9weXRob24uYworCitESVNUQ0xFQU5fVEFSR0VUUyArPSBzZXR1cC5weQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2V4YW1wbGUucHkgYi9weXRob24vZXhhbXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ViYmYyCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2V4YW1wbGUucHkKQEAgLTAsMCArMSwxMjAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQeXRob24gZXhhbXBsZSBjb2RlOgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBsdm0KKworIyBOb3RlOiBUaGlzIGV4YW1wbGUgd2lsbCBjcmVhdGUgYSBsb2dpY2FsIHVuaXQsIHRhZyBpdCBhbmQKKyMgCWRlbGV0ZSBpdCwgZG9uJ3QgcnVuIHRoaXMgb24gcHJvZHVjdGlvbiBib3ghCisKKyNEdW1wIGluZm9ybWF0aW9uIGFib3V0IFBWCitkZWYgcHJpbnRfcHYocHYpOgorICAgIHByaW50KCdQViBuYW1lOiAnLCBwdi5nZXROYW1lKCksICcgSUQ6ICcsIHB2LmdldFV1aWQoKSwgJ1NpemU6ICcsIHB2LmdldFNpemUoKSkKKworCisjRHVtcCBzb21lIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgdm9sdW1lIGdyb3VwCitkZWYgcHJpbnRfdmcodmdfbmFtZSk6CisgICAgI09wZW4gcmVhZCBvbmx5CisgICAgdmcgPSBsdm0udmdPcGVuKHZnX25hbWUsICdyJykKKworICAgIHByaW50KCdWb2x1bWUgZ3JvdXA6JywgdmdfbmFtZSwgJ1NpemU6ICcsIHZnLmdldFNpemUoKSkKKworICAgICNSZXRyaWV2ZSBhIGxpc3Qgb2YgUGh5c2ljYWwgdm9sdW1lcyBmb3IgdGhpcyB2b2x1bWUgZ3JvdXAKKyAgICBwdl9saXN0ID0gdmcubGlzdFBWcygpCisKKyAgICAjUHJpbnQgb3V0IHRoZSBwaHlzaWNhbCB2b2x1bWVzCisgICAgZm9yIHAgaW4gcHZfbGlzdDoKKyAgICAgICAgcHJpbnRfcHYocCkKKworICAgICNHZXQgYSBsaXN0IG9mIGxvZ2ljYWwgdm9sdW1lcyBpbiB0aGlzIHZvbHVtZSBncm91cAorICAgIGx2X2xpc3QgPSB2Zy5saXN0TFZzKCkKKyAgICBpZiBsZW4obHZfbGlzdCk6CisgICAgICAgIGZvciBsIGluIGx2X2xpc3Q6CisgICAgICAgICAgICBwcmludCgnTFYgbmFtZTogJywgbC5nZXROYW1lKCksICcgSUQ6ICcsIGwuZ2V0VXVpZCgpKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCdObyBsb2dpY2FsIHZvbHVtZXMgcHJlc2VudCEnKQorCisgICAgdmcuY2xvc2UoKQorCisjUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZnIHdpdGggc3BhY2UgYXZhaWxhYmxlCitkZWYgZmluZF92Z193aXRoX2ZyZWVfc3BhY2UoKToKKyAgICBmcmVlX3NwYWNlID0gMAorICAgIHJjID0gTm9uZQorCisgICAgdmdfbmFtZXMgPSBsdm0ubGlzdFZnTmFtZXMoKQorICAgIGZvciB2IGluIHZnX25hbWVzOgorICAgICAgICB2ZyA9IGx2bS52Z09wZW4odiwgJ3InKQorICAgICAgICBjX2ZyZWUgPSB2Zy5nZXRGcmVlU2l6ZSgpCisgICAgICAgIGlmIGNfZnJlZSA+IGZyZWVfc3BhY2U6CisgICAgICAgICAgICBmcmVlX3NwYWNlID0gY19mcmVlCisgICAgICAgICAgICByYyA9IHYKKyAgICAgICAgdmcuY2xvc2UoKQorCisgICAgcmV0dXJuIHJjCisKKyNXYWxrIHRocm91Z2ggdGhlIHZvbHVtZSBncm91cHMgYW5kIGZpbmUgb25lIHdpdGggc3BhY2UgaW4gd2hpY2ggd2UgY2FuCisjY3JlYXRlIGEgbmV3IGxvZ2ljYWwgdm9sdW1lCitkZWYgY3JlYXRlX2RlbGV0ZV9sb2dpY2FsX3ZvbHVtZSgpOgorICAgIHZnX25hbWUgPSBmaW5kX3ZnX3dpdGhfZnJlZV9zcGFjZSgpCisKKyAgICBwcmludCgnVXNpbmcgdm9sdW1lIGdyb3VwICcsIHZnX25hbWUsICcgZm9yIGV4YW1wbGUnKQorCisgICAgaWYgdmdfbmFtZToKKyAgICAgICAgdmcgPSBsdm0udmdPcGVuKHZnX25hbWUsICd3JykKKyAgICAgICAgbHYgPSB2Zy5jcmVhdGVMdkxpbmVhcigncHl0aG9uX2x2bV9va190b19kZWxldGUnLCB2Zy5nZXRGcmVlU2l6ZSgpKQorCisgICAgICAgIGlmIGx2OgorICAgICAgICAgICAgcHJpbnQoJ05ldyBsdiwgaWQ9ICcsIGx2LmdldFV1aWQoKSkKKworICAgICAgICAgICAgI0NyZWF0ZSBhIHRhZworICAgICAgICAgICAgbHYuYWRkVGFnKCdEZW1vX3RhZycpCisKKyAgICAgICAgICAgICNHZXQgdGhlIHRhZ3MKKyAgICAgICAgICAgIHRhZ3MgPSBsdi5nZXRUYWdzKCkKKyAgICAgICAgICAgIGZvciB0IGluIHRhZ3M6CisgICAgICAgICAgICAgICAgI1JlbW92ZSB0YWcKKyAgICAgICAgICAgICAgICBsdi5yZW1vdmVUYWcodCkKKworICAgICAgICAgICAgbHYuZGVhY3RpdmF0ZSgpCisKKyAgICAgICAgICAgICNUcnkgdG8gcmVuYW1lCisgICAgICAgICAgICBsdi5yZW5hbWUoInB5dGhvbl9sdm1fcmVuYW1lZCIpCisgICAgICAgICAgICBwcmludCgnTFYgbmFtZT0gJywgbHYuZ2V0TmFtZSgpKQorICAgICAgICAgICAgbHYucmVtb3ZlKCkKKworICAgICAgICB2Zy5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ05vIGZyZWUgc3BhY2UgYXZhaWxhYmxlIHRvIGNyZWF0ZSBkZW1vIGx2IScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgI1doYXQgdmVyc2lvbgorICAgIHByaW50KCdsdm0gdmVyc2lvbj0nLCBsdm0uZ2V0VmVyc2lvbigpKQorCisgICAgI0dldCBhIGxpc3Qgb2Ygdm9sdW1lIGdyb3VwIG5hbWVzCisgICAgdmdfbmFtZXMgPSBsdm0ubGlzdFZnTmFtZXMoKQorCisgICAgI0ZvciBlYWNoIHZvbHVtZSBncm91cCBkaXNwbGF5IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGVtCisgICAgZm9yIHZnX2kgaW4gdmdfbmFtZXM6CisgICAgICAgIHByaW50X3ZnKHZnX2kpCisKKyAgICAjRGVtbyBjcmVhdGluZyBhIGxvZ2ljYWwgdm9sdW1lCisgICAgY3JlYXRlX2RlbGV0ZV9sb2dpY2FsX3ZvbHVtZSgpCisKZGlmZiAtLWdpdCBhL3B5dGhvbi9saWJsdm0uYyBiL3B5dGhvbi9saWJsdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM1MzRlCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL2xpYmx2bS5jCkBAIC0wLDAgKzEsMjA5MiBAQAorLyoKKyAqIExpYmx2bSAtLSBQeXRob24gaW50ZXJmYWNlIHRvIExWTTIgQVBJLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yczogTGFycyBTam9zdHJvbSAobGFycyBzam9zdHJvbSByZWRoYXQgY29tKQorICoJICAgIEFuZHkgR3JvdmVyIChhZ3JvdmVyIHJlZGhhdCBjb20pCisgKgkgICAgVG9ueSBBc2xlc29uICh0YXNsZXNvbiByZWRoYXQgY29tKQorICovCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJsdm0yYXBwLmgiCisjaW5jbHVkZSAiZGVmYXVsdHMuaCIKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworI2RlZmluZSBJU19QWTNLCisjZGVmaW5lIFBZSU5UVFlQRV9DSEVDSyBQeUxvbmdfQ2hlY2sKKyNkZWZpbmUgUFlJTlRUWVBFX0FTTE9ORyBQeUxvbmdfQXNMb25nCisjZGVmaW5lIFBZSU5UVFlQRV9GUk9NTE9ORyBQeUxvbmdfRnJvbUxvbmcKKyNkZWZpbmUgUFlTVFJZUEVfQ0hFQ0sgUHlVbmljb2RlX0NoZWNrCisjZGVmaW5lIFBZU1RSVFlQRV9BU1NUUklORyBQeVVuaWNvZGVfQXNVVEY4CisjZGVmaW5lIFBZU1RSVFlQRV9GUk9NU1RSSU5HIFB5VW5pY29kZV9Gcm9tU3RyaW5nCisjZWxzZQorI2RlZmluZSBQWUlOVFRZUEVfQ0hFQ0sgUHlJbnRfQ2hlY2sKKyNkZWZpbmUgUFlJTlRUWVBFX0FTTE9ORyBQeUludF9Bc0xvbmcKKyNkZWZpbmUgUFlJTlRUWVBFX0ZST01MT05HIFB5SW50X0Zyb21Mb25nCisjZGVmaW5lIFBZU1RSWVBFX0NIRUNLIFB5U3RyaW5nX0NoZWNrCisjZGVmaW5lIFBZU1RSVFlQRV9BU1NUUklORyBQeVN0cmluZ19Bc1N0cmluZworI2RlZmluZSBQWVNUUlRZUEVfRlJPTVNUUklORyBQeVN0cmluZ19Gcm9tU3RyaW5nCisjZW5kaWYKKworc3RhdGljIGx2bV90IF9saWJoOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJdmdfdCB2ZzsJCS8qIHZnIGhhbmRsZSAqLworCWx2bV90IGxpYmhfY29weTsKK30gdmdvYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJc3RydWN0IGRtX2xpc3QgKnB2c2xpc3Q7CisJbHZtX3QgbGliaF9jb3B5OworfSBwdnNsaXN0b2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJUHlPYmplY3RfSEVBRAorCWx2X3QgbHY7CQkvKiBsdiBoYW5kbGUgKi8KKwl2Z29iamVjdCAqcGFyZW50X3Znb2JqOworfSBsdm9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVB5T2JqZWN0X0hFQUQKKwlwdl90IHB2OwkJLyogcHYgaGFuZGxlICovCisJdmdvYmplY3QgKnBhcmVudF92Z29iajsKKwlwdnNsaXN0b2JqZWN0ICpwYXJlbnRfcHZzbGlzdG9iajsKK30gcHZvYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJbHZzZWdfdCBsdl9zZWc7CQkvKiBsdiBzZWdtZW50IGhhbmRsZSAqLworCWx2b2JqZWN0ICpwYXJlbnRfbHZvYmo7Cit9IGx2c2Vnb2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJUHlPYmplY3RfSEVBRAorCXB2c2VnX3QgcHZfc2VnOwkJLyogcHYgc2VnbWVudCBoYW5kbGUgKi8KKwlwdm9iamVjdCAqcGFyZW50X3B2b2JqOworfSBwdnNlZ29iamVjdDsKKworc3RhdGljIFB5VHlwZU9iamVjdCBfTGliTFZNdmdUeXBlOworc3RhdGljIFB5VHlwZU9iamVjdCBfTGliTFZNbHZUeXBlOworc3RhdGljIFB5VHlwZU9iamVjdCBfTGliTFZNcHZsaXN0VHlwZTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgX0xpYkxWTXB2VHlwZTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgX0xpYkxWTWx2c2VnVHlwZTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgX0xpYkxWTXB2c2VnVHlwZTsKKworc3RhdGljIFB5T2JqZWN0ICpfTGliTFZNRXJyb3I7CisKKyNkZWZpbmUgTFZNX1ZBTElEKHB0cikgXAorCWRvIHsgXAorCQlpZiAoIV9saWJoKSB7IFwKKwkJCV9saWJoID0gbHZtX2luaXQoTlVMTCk7IFwKKwkJfSBcCisJCWlmIChwdHIgJiYgX2xpYmgpIHsgXAorCQkJaWYgKHB0ciAhPSBfbGliaCkgeyBcCisJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLCAiTFZNIGhhbmRsZSByZWZlcmVuY2Ugc3RhbGUiKTsgXAorCQkJCXJldHVybiBOVUxMOyBcCisJCQl9IFwKKwkJfSBlbHNlIGlmICghX2xpYmgpIHsgXAorCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLCAiTFZNIGhhbmRsZSBpbnZhbGlkIik7IFwKKwkJCXJldHVybiBOVUxMOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogRW5zdXJlIHRoYXQgd2UgaW5pdGlhbGl6ZSBhbGwgdGhlIGJpdHMgdG8gYSBzYW5lIHN0YXRlLgorICovCitzdGF0aWMgcHZvYmplY3QgKl9jcmVhdGVfcHlfcHYodm9pZCkKK3sKKwlwdm9iamVjdCAqIHB2b2JqID0gUHlPYmplY3RfTmV3KHB2b2JqZWN0LCAmX0xpYkxWTXB2VHlwZSk7CisKKwlpZiAocHZvYmopIHsKKwkJcHZvYmotPnB2ID0gTlVMTDsKKwkJcHZvYmotPnBhcmVudF92Z29iaiA9IE5VTEw7CisJCXB2b2JqLT5wYXJlbnRfcHZzbGlzdG9iaiA9IE5VTEw7CisJfQorCisJcmV0dXJuIHB2b2JqOworfQorCitzdGF0aWMgdmdvYmplY3QgKl9jcmVhdGVfcHlfdmcodm9pZCkKK3sKKwl2Z29iamVjdCAqdmdvYmogPSBQeU9iamVjdF9OZXcodmdvYmplY3QsICZfTGliTFZNdmdUeXBlKTsKKworCWlmICh2Z29iaikgeworCQl2Z29iai0+dmcgPSBOVUxMOworCQl2Z29iai0+bGliaF9jb3B5ID0gX2xpYmg7CisJfQorCisJcmV0dXJuIHZnb2JqOworfQorCitzdGF0aWMgcHZzbGlzdG9iamVjdCAqX2NyZWF0ZV9weV9wdmxpc3Qodm9pZCkKK3sKKwlwdnNsaXN0b2JqZWN0ICpwdmxpc3RvYmogPSBQeU9iamVjdF9OZXcocHZzbGlzdG9iamVjdCwgJl9MaWJMVk1wdmxpc3RUeXBlKTsKKworCWlmIChwdmxpc3RvYmopIHsKKwkJcHZsaXN0b2JqLT5wdnNsaXN0ID0gTlVMTDsKKwkJcHZsaXN0b2JqLT5saWJoX2NvcHkgPSBfbGliaDsKKwl9CisKKwlyZXR1cm4gcHZsaXN0b2JqOworfQorCitzdGF0aWMgbHZvYmplY3QgKl9jcmVhdGVfcHlfbHYodmdvYmplY3QgKnBhcmVudCwgbHZfdCBsdikKK3sKKwlsdm9iamVjdCAqIGx2b2JqID0gUHlPYmplY3RfTmV3KGx2b2JqZWN0LCAmX0xpYkxWTWx2VHlwZSk7CisJaWYgKGx2b2JqKSB7CisJCWx2b2JqLT5wYXJlbnRfdmdvYmogPSBwYXJlbnQ7CisJCVB5X0lOQ1JFRihsdm9iai0+cGFyZW50X3Znb2JqKTsKKwkJbHZvYmotPmx2ID0gbHY7CisJfQorCXJldHVybiBsdm9iajsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2dldF9sYXN0X2Vycm9yKHZvaWQpCit7CisJUHlPYmplY3QgKmluZm87CisJY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmICghKGluZm8gPSBQeVR1cGxlX05ldygyKSkpCisJCXJldHVybiBOVUxMOworCisJUHlUdXBsZV9TZXRJdGVtKGluZm8sIDAsIFBZSU5UVFlQRV9GUk9NTE9ORygobG9uZykgbHZtX2Vycm5vKF9saWJoKSkpOworCW1zZyA9IGx2bV9lcnJtc2coX2xpYmgpOworCVB5VHVwbGVfU2V0SXRlbShpbmZvLCAxLCAoKG1zZykgPyBQWVNUUlRZUEVfRlJPTVNUUklORyhtc2cpIDoKKwkJCVBZU1RSVFlQRV9GUk9NU1RSSU5HKCJNZW1vcnkgZXJyb3Igd2hpbGUgcmV0cmlldmluZyBlcnJvciBtZXNzYWdlIikpKTsKKworCXJldHVybiBpbmZvOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbGlicmFyeV9nZXRfdmVyc2lvbih2b2lkKQoreworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgbHZtX2xpYnJhcnlfZ2V0X3ZlcnNpb24oKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIF9nY19kb2NbXSA9ICJHYXJiYWdlIGNvbGxlY3QgdGhlIEMgbGlicmFyeSI7CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fZ2Modm9pZCkKK3sKKwlpZiAoX2xpYmgpIHsKKwkJbHZtX3F1aXQoX2xpYmgpOworCQlfbGliaCA9IE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbGlzdF92Z19uYW1lcyh2b2lkKQoreworCXN0cnVjdCBkbV9saXN0ICp2Z25hbWVzOworCXN0cnVjdCBsdm1fc3RyX2xpc3QgKnN0cmw7CisJUHlPYmplY3QgKiBweXR1cGxlOworCWludCBpID0gMDsKKworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmICghKHZnbmFtZXMgPSBsdm1fbGlzdF92Z19uYW1lcyhfbGliaCkpKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHB5dHVwbGUgPSBQeVR1cGxlX05ldyhkbV9saXN0X3NpemUodmduYW1lcykpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3RybCwgdmduYW1lcykgeworCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIGksIFBZU1RSVFlQRV9GUk9NU1RSSU5HKHN0cmwtPnN0cikpOworCQlpKys7CisJfQorCisJcmV0dXJuIHB5dHVwbGU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbGlzdF92Z191dWlkcyh2b2lkKQoreworCXN0cnVjdCBkbV9saXN0ICp1dWlkczsKKwlzdHJ1Y3QgbHZtX3N0cl9saXN0ICpzdHJsOworCVB5T2JqZWN0ICogcHl0dXBsZTsKKwlpbnQgaSA9IDA7CisKKwlMVk1fVkFMSUQoTlVMTCk7CisKKwlpZiAoISh1dWlkcyA9IGx2bV9saXN0X3ZnX3V1aWRzKF9saWJoKSkpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEocHl0dXBsZSA9IFB5VHVwbGVfTmV3KGRtX2xpc3Rfc2l6ZSh1dWlkcykpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3RybCwgdXVpZHMpIHsKKwkJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCBpLCBQWVNUUlRZUEVfRlJPTVNUUklORyhzdHJsLT5zdHIpKTsKKwkJaSsrOworCX0KKworCXJldHVybiBweXR1cGxlOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2bGlzdF9nZXQocHZzbGlzdG9iamVjdCAqcHZzb2JqKQoreworCXN0cnVjdCBsdm1fcHZfbGlzdCAqcHZsOworCVB5T2JqZWN0ICogcHl0dXBsZTsKKwlwdm9iamVjdCAqIHB2b2JqOworCWludCBpID0gMDsKKworCS8qIHVubGlrZSBvdGhlciBMVk0gYXBpIGNhbGxzLCBpZiB0aGVyZSBhcmUgbm8gcmVzdWx0cywgd2UgZ2V0IE5VTEwgKi8KKwlwdnNvYmotPnB2c2xpc3QgPSBsdm1fbGlzdF9wdnMoX2xpYmgpOworCisJaWYgKCFwdnNvYmotPnB2c2xpc3QpCisJCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoKSIpOworCisJaWYgKCEocHl0dXBsZSA9IFB5VHVwbGVfTmV3KGRtX2xpc3Rfc2l6ZShwdnNvYmotPnB2c2xpc3QpKSkpCisJCXJldHVybiBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzb2JqLT5wdnNsaXN0KSB7CisJCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgb2JqZWN0ICovCisJCWlmICghKHB2b2JqID0gX2NyZWF0ZV9weV9wdigpKSkgeworCQkJUHlfREVDUkVGKHB5dHVwbGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBXZSBkb24ndCBoYXZlIGEgcGFyZW50IHZnIG9iamVjdCB0byBiZSBjb25jZXJuZWQgYWJvdXQgKi8KKwkJcHZvYmotPnBhcmVudF92Z29iaiA9IE5VTEw7CisJCXB2b2JqLT5wYXJlbnRfcHZzbGlzdG9iaiA9IHB2c29iajsKKwkJUHlfSU5DUkVGKHB2b2JqLT5wYXJlbnRfcHZzbGlzdG9iaik7CisKKwkJcHZvYmotPnB2ID0gcHZsLT5wdjsKKwkJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCBpLCAoUHlPYmplY3QgKikgcHZvYmopOworCQlpKys7CisJfQorCisJcmV0dXJuIHB5dHVwbGU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZsaXN0X3B1dChwdnNsaXN0b2JqZWN0ICpzZWxmKQoreworCWlmIChzZWxmLT5wdnNsaXN0KSB7CisJCWlmIChsdm1fbGlzdF9wdnNfZnJlZShzZWxmLT5wdnNsaXN0KSkgeworCQkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJc2VsZi0+cHZzbGlzdCA9IE5VTEw7CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKworCQlyZXR1cm4gUHlfTm9uZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX3B2bGlzdF9kZWFsbG9jKHB2c2xpc3RvYmplY3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPnB2c2xpc3QpCisJCV9saWJsdm1fbHZtX3B2bGlzdF9wdXQoc2VsZik7CisKKwlQeU9iamVjdF9EZWwoc2VsZik7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbGlzdF9wdnModm9pZCkKK3sKKwlMVk1fVkFMSUQoTlVMTCk7CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopX2NyZWF0ZV9weV9wdmxpc3QoKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9wdl9yZW1vdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCit7CisJY29uc3QgY2hhciAqcHZfbmFtZTsKKworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJzIiwgJnB2X25hbWUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fcHZfcmVtb3ZlKF9saWJoLCBwdl9uYW1lKSA9PSAtMSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGludCBfc2V0X3B2X251bWVyaWNfcHJvcChwdl9jcmVhdGVfcGFyYW1zX3QgcHZfcGFyYW1zLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpCit7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbHVlID0geworCQkuaXNfaW50ZWdlciA9IDEsCisJCS52YWx1ZS5pbnRlZ2VyID0gdmFsdWUsCisJfTsKKworCXJldHVybiBsdm1fcHZfcGFyYW1zX3NldF9wcm9wZXJ0eShwdl9wYXJhbXMsIG5hbWUsICZwcm9wX3ZhbHVlKTsKK30KKworI2RlZmluZSBTRVRfUFZfUFJPUChwYXJhbXMsIG5hbWUsIHZhbHVlKSBcCisJZG8geyBcCisJCWlmIChfc2V0X3B2X251bWVyaWNfcHJvcChwYXJhbXMsIG5hbWUsIHZhbHVlKSA9PSAtMSkgXAorCQkJZ290byBlcnJvcjsgXAorCX0gd2hpbGUoMClcCisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZfY3JlYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQoreworCWNvbnN0IGNoYXIgKnB2X25hbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBwdm1ldGFkYXRhY29waWVzID0gREVGQVVMVF9QVk1FVEFEQVRBQ09QSUVTOworCXVuc2lnbmVkIGxvbmcgbG9uZyBwdm1ldGFkYXRhc2l6ZSA9IERFRkFVTFRfUFZNRVRBREFUQVNJWkU7CisJdW5zaWduZWQgbG9uZyBsb25nIGRhdGFfYWxpZ25tZW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgemVybyA9IDE7CisJcHZfY3JlYXRlX3BhcmFtc190IHB2X3BhcmFtcyA9IE5VTEw7CisKKwlMVk1fVkFMSUQoTlVMTCk7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAic3xLS0tLS0siLCAmcHZfbmFtZSwgJnNpemUsICZwdm1ldGFkYXRhY29waWVzLAorCQkJCQkJCSZwdm1ldGFkYXRhc2l6ZSwgJmRhdGFfYWxpZ25tZW50LAorCQkJCQkJCSZkYXRhX2FsaWdubWVudF9vZmZzZXQsICZ6ZXJvKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdl9wYXJhbXMgPSBsdm1fcHZfcGFyYW1zX2NyZWF0ZShfbGliaCwgcHZfbmFtZSk7CisJaWYgKCFwdl9wYXJhbXMpIHsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlTRVRfUFZfUFJPUChwdl9wYXJhbXMsICJzaXplIiwgc2l6ZSk7CisJU0VUX1BWX1BST1AocHZfcGFyYW1zLCAicHZtZXRhZGF0YWNvcGllcyIsIHB2bWV0YWRhdGFjb3BpZXMpOworCVNFVF9QVl9QUk9QKHB2X3BhcmFtcywgInB2bWV0YWRhdGFzaXplIiwgcHZtZXRhZGF0YXNpemUpOworCVNFVF9QVl9QUk9QKHB2X3BhcmFtcywgImRhdGFfYWxpZ25tZW50IiwgZGF0YV9hbGlnbm1lbnQpOworCVNFVF9QVl9QUk9QKHB2X3BhcmFtcywgImRhdGFfYWxpZ25tZW50X29mZnNldCIsIGRhdGFfYWxpZ25tZW50X29mZnNldCk7CisJU0VUX1BWX1BST1AocHZfcGFyYW1zLCAiemVybyIsIHplcm8pOworCisJaWYgKGx2bV9wdl9jcmVhdGVfYWR2KHB2X3BhcmFtcykpIHsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmV0dXJuIFB5X05vbmU7CisKK2Vycm9yOgorCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcGVyY2VudF90b19mbG9hdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKwlkb3VibGUgY29udmVydGVkOworCWludCBwZXJjZW50OworCisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImkiLCAmcGVyY2VudCkpCisJCXJldHVybiBOVUxMOworCisJY29udmVydGVkID0gbHZtX3BlcmNlbnRfdG9fZmxvYXQocGVyY2VudCk7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIGNvbnZlcnRlZCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfbmFtZV92YWxpZGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgInMiLCAmbmFtZSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKGx2bV92Z19uYW1lX3ZhbGlkYXRlKF9saWJoLCBuYW1lKSA8IDApIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmduYW1lX2Zyb21fcHZpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKwljb25zdCBjaGFyICpwdmlkOworCWNvbnN0IGNoYXIgKnZnbmFtZTsKKworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJzIiwgJnB2aWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHZnbmFtZSA9IGx2bV92Z25hbWVfZnJvbV9wdmlkKF9saWJoLCBwdmlkKSkpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCB2Z25hbWUpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnbmFtZV9mcm9tX2RldmljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKK3sKKwljb25zdCBjaGFyICpkZXZpY2U7CisJY29uc3QgY2hhciAqdmduYW1lOworCisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgInMiLCAmZGV2aWNlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoISh2Z25hbWUgPSBsdm1fdmduYW1lX2Zyb21fZGV2aWNlKF9saWJoLCBkZXZpY2UpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIHZnbmFtZSk7Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9jb25maWdfZmluZF9ib29sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQoreworCWNvbnN0IGNoYXIgKmNvbmZpZzsKKwlpbnQgcnZhbDsKKwlQeU9iamVjdCAqcmM7CisKKwlMVk1fVkFMSUQoTlVMTCk7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAicyIsICZjb25maWcpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgocnZhbCA9IGx2bV9jb25maWdfZmluZF9ib29sKF9saWJoLCBjb25maWcsIC0xMCkpID09IC0xMCkgeworCQkvKiBSZXRyaWV2aW5nIGVycm9yIGluZm9ybWF0aW9uIHlpZWxkcyBubyBlcnJvciBpbiB0aGlzIGNhc2UgKi8KKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJjb25maWcgcGF0aCBub3QgZm91bmQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmMgPSAocnZhbCkgPyBQeV9UcnVlOiBQeV9GYWxzZTsKKworCVB5X0lOQ1JFRihyYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fY29uZmlnX3JlbG9hZCh2b2lkKQoreworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmIChsdm1fY29uZmlnX3JlbG9hZChfbGliaCkgPT0gLTEpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9zY2FuKHZvaWQpCit7CisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKGx2bV9zY2FuKF9saWJoKSA9PSAtMSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9jb25maWdfb3ZlcnJpZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCit7CisJY29uc3QgY2hhciAqY29uZmlnOworCisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgInMiLCAmY29uZmlnKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobHZtX2NvbmZpZ19vdmVycmlkZShfbGliaCwgY29uZmlnKSA9PSAtMSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFZHIG9iamVjdCBpbml0aWFsaXphdGlvbi9kZWFsbG9jYXRpb24KKyAqLworCisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqdmduYW1lOworCWNvbnN0IGNoYXIgKm1vZGUgPSBOVUxMOworCisJdmdvYmplY3QgKnZnb2JqOworCisJTFZNX1ZBTElEKE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHMiLCAmdmduYW1lLCAmbW9kZSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKG1vZGUgPT0gTlVMTCkKKwkJbW9kZSA9ICJyIjsKKworCWlmICghKHZnb2JqID0gX2NyZWF0ZV9weV92ZygpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoISh2Z29iai0+dmcgPSBsdm1fdmdfb3BlbihfbGliaCwgdmduYW1lLCBtb2RlLCAwKSkpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJUHlfREVDUkVGKHZnb2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIChQeU9iamVjdCAqKXZnb2JqOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2NyZWF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqdmduYW1lOworCXZnb2JqZWN0ICp2Z29iajsKKworCUxWTV9WQUxJRChOVUxMKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZ2Z25hbWUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHZnb2JqID0gX2NyZWF0ZV9weV92ZygpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoISh2Z29iai0+dmcgPSBsdm1fdmdfY3JlYXRlKF9saWJoLCB2Z25hbWUpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlQeV9ERUNSRUYodmdvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopdmdvYmo7Cit9CisKK3N0YXRpYyB2b2lkIGxpYmx2bV92Z19kZWFsbG9jKHZnb2JqZWN0ICpzZWxmKQoreworCS8qIGlmIGFscmVhZHkgY2xvc2VkLCBkb24ndCByZWNsb3NlIGl0ICovCisJaWYgKHNlbGYtPnZnICE9IE5VTEwpIHsKKwkJbHZtX3ZnX2Nsb3NlKHNlbGYtPnZnKTsKKwkJc2VsZi0+dmcgPSBOVUxMOworCQlzZWxmLT5saWJoX2NvcHkgPSBOVUxMOworCX0KKworCVB5T2JqZWN0X0RlbChzZWxmKTsKK30KKworLyogVkcgTWV0aG9kcyAqLworCisjZGVmaW5lIFZHX1ZBTElEKHZnb2JqZWN0KSBcCisJZG8geyBcCisJCWlmICghdmdvYmplY3QgfHwgIXZnb2JqZWN0LT52ZykgeyBcCisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsICJWRyBvYmplY3QgaW52YWxpZCIpOyBcCisJCQlyZXR1cm4gTlVMTDsgXAorCQl9IFwKKwkJTFZNX1ZBTElEKHZnb2JqZWN0LT5saWJoX2NvcHkpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBQVlNMSVNUX1ZBTElEKHB2c2xpc3RvYmplY3QpIFwKKwlkbyB7IFwKKwkJaWYgKCFwdnNsaXN0b2JqZWN0IHx8ICFwdnNsaXN0b2JqZWN0LT5wdnNsaXN0KSB7IFwKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwgIlBWUyBvYmplY3QgaW52YWxpZCIpOyBcCisJCQlyZXR1cm4gTlVMTDsgXAorCQl9IFwKKwkJTFZNX1ZBTElEKHB2c2xpc3RvYmplY3QtPmxpYmhfY29weSk7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2Nsb3NlKHZnb2JqZWN0ICpzZWxmKQoreworCS8qIGlmIGFscmVhZHkgY2xvc2VkLCBkb24ndCByZWNsb3NlIGl0ICovCisJaWYgKHNlbGYtPnZnKSB7CisJCWlmIChsdm1fdmdfY2xvc2Uoc2VsZi0+dmcpID09IC0xKSB7CisJCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2VsZi0+dmcgPSBOVUxMOworCQlzZWxmLT5saWJoX2NvcHkgPSBOVUxMOworCX0KKworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKworCXJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF9uYW1lKHZnb2JqZWN0ICpzZWxmKQoreworCVZHX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBsdm1fdmdfZ2V0X25hbWUoc2VsZi0+dmcpKTsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF91dWlkKHZnb2JqZWN0ICpzZWxmKQoreworCVZHX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBsdm1fdmdfZ2V0X3V1aWQoc2VsZi0+dmcpKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19yZW1vdmUodmdvYmplY3QgKnNlbGYpCit7CisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAobHZtX3ZnX3JlbW92ZShzZWxmLT52ZykgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAobHZtX3ZnX3dyaXRlKHNlbGYtPnZnKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCS8qIE5vdCBtdWNoIHlvdSBjYW4gZG8gd2l0aCBhIHZnIHRoYXQgaXMgcmVtb3ZlZCBzbyBjbG9zZSBpdCAqLworCXJldHVybiBfbGlibHZtX2x2bV92Z19jbG9zZShzZWxmKTsKKworZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2V4dGVuZCh2Z29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqZGV2aWNlOworCisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmZGV2aWNlKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobHZtX3ZnX2V4dGVuZChzZWxmLT52ZywgZGV2aWNlKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCWlmIChsdm1fdmdfd3JpdGUoc2VsZi0+dmcpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworCitlcnJvcjoKKwlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfcmVkdWNlKHZnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICpkZXZpY2U7CisKKwlWR19WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZkZXZpY2UpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fdmdfcmVkdWNlKHNlbGYtPnZnLCBkZXZpY2UpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJaWYgKGx2bV92Z193cml0ZShzZWxmLT52ZykgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKKworZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2FkZF90YWcodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKnRhZzsKKwlpbnQgcnZhbDsKKworCVZHX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnRhZykpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgocnZhbCA9IGx2bV92Z19hZGRfdGFnKHNlbGYtPnZnLCB0YWcpKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCWlmIChsdm1fdmdfd3JpdGUoc2VsZi0+dmcpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBydmFsKTsKKworZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX3JlbW92ZV90YWcodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKnRhZzsKKworCVZHX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnRhZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKGx2bV92Z19yZW1vdmVfdGFnKHNlbGYtPnZnLCB0YWcpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJaWYgKGx2bV92Z193cml0ZShzZWxmLT52ZykgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKKworZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2lzX2NsdXN0ZXJlZCh2Z29iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdCAqcnZhbDsKKworCVZHX1ZBTElEKHNlbGYpOworCisJcnZhbCA9ICggbHZtX3ZnX2lzX2NsdXN0ZXJlZChzZWxmLT52ZykgPT0gMSkgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisKKwlQeV9JTkNSRUYocnZhbCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19pc19leHBvcnRlZCh2Z29iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdCAqcnZhbDsKKworCVZHX1ZBTElEKHNlbGYpOworCisJcnZhbCA9ICggbHZtX3ZnX2lzX2V4cG9ydGVkKHNlbGYtPnZnKSA9PSAxKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKworCVB5X0lOQ1JFRihydmFsKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2lzX3BhcnRpYWwodmdvYmplY3QgKnNlbGYpCit7CisJUHlPYmplY3QgKnJ2YWw7CisKKwlWR19WQUxJRChzZWxmKTsKKworCXJ2YWwgPSAoIGx2bV92Z19pc19wYXJ0aWFsKHNlbGYtPnZnKSA9PSAxKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKworCVB5X0lOQ1JFRihydmFsKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF9zZXFubyh2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X3NlcW5vKHNlbGYtPnZnKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfZ2V0X3NpemUodmdvYmplY3QgKnNlbGYpCit7CisJVkdfVkFMSUQoc2VsZik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSyIsICh1bnNpZ25lZCBsb25nIGxvbmcpbHZtX3ZnX2dldF9zaXplKHNlbGYtPnZnKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfZ2V0X2ZyZWVfc2l6ZSh2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X2ZyZWVfc2l6ZShzZWxmLT52ZykpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF9leHRlbnRfc2l6ZSh2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X2V4dGVudF9zaXplKHNlbGYtPnZnKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfZ2V0X2V4dGVudF9jb3VudCh2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X2V4dGVudF9jb3VudChzZWxmLT52ZykpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF9mcmVlX2V4dGVudF9jb3VudCh2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X2ZyZWVfZXh0ZW50X2NvdW50KHNlbGYtPnZnKSk7Cit9CisKKy8qIEJ1aWxkcyBhIHB5dGhvbiB0dXBsZSAoW3N0cmluZ3xudW1iZXJdLCBib29sKSBmcm9tIGEgc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqLworc3RhdGljIFB5T2JqZWN0ICpnZXRfcHJvcGVydHkoc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSAqcHJvcCkKK3sKKwlQeU9iamVjdCAqcHl0dXBsZTsKKwlQeU9iamVjdCAqc2V0YWJsZTsKKworCWlmICghcHJvcC0+aXNfdmFsaWQpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEocHl0dXBsZSA9IFB5VHVwbGVfTmV3KDIpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocHJvcC0+aXNfaW50ZWdlcikgeworCQlpZiAocHJvcC0+aXNfc2lnbmVkKSB7CisJCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIDAsIFB5X0J1aWxkVmFsdWUoIkwiLCBwcm9wLT52YWx1ZS5zaWduZWRfaW50ZWdlcikpOworCQl9IGVsc2UgeworCQkJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCAwLCBQeV9CdWlsZFZhbHVlKCJLIiwgcHJvcC0+dmFsdWUuaW50ZWdlcikpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCBwcm9wLT52YWx1ZS5zdHJpbmcgKSB7CisJCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIDAsIFBZU1RSVFlQRV9GUk9NU1RSSU5HKHByb3AtPnZhbHVlLnN0cmluZykpOworCQl9IGVsc2UgeworCQkJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCAwLCBQeV9Ob25lKTsKKwkJfQorCX0KKworCWlmIChwcm9wLT5pc19zZXR0YWJsZSkKKwkJc2V0YWJsZSA9IFB5X1RydWU7CisJZWxzZQorCQlzZXRhYmxlID0gUHlfRmFsc2U7CisKKwlQeV9JTkNSRUYoc2V0YWJsZSk7CisJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCAxLCBzZXRhYmxlKTsKKworCXJldHVybiBweXR1cGxlOworfQorCisvKiBUaGlzIHdpbGwgcmV0dXJuIGEgdHVwbGUgb2YgKHZhbHVlLCBib29sKSB3aXRoIHRoZSB2YWx1ZSBiZWluZyBhIHN0cmluZyBvcgorICAgaW50ZWdlciBhbmQgYm9vbCBpbmRpY2F0aW5nIGlmIHByb3BlcnR5IGlzIHNldHRhYmxlICovCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX2dldF9wcm9wZXJ0eSh2Z29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsdWU7CisKKwlWR19WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZuYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcm9wX3ZhbHVlID0gbHZtX3ZnX2dldF9wcm9wZXJ0eShzZWxmLT52ZywgbmFtZSk7CisKKwlyZXR1cm4gZ2V0X3Byb3BlcnR5KCZwcm9wX3ZhbHVlKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19zZXRfcHJvcGVydHkodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUgPSBOVUxMOworCVB5T2JqZWN0ICp2YXJpYW50X3R5cGVfYXJnID0gTlVMTDsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGx2bV9wcm9wZXJ0eTsKKwljaGFyICpzdHJpbmdfdmFsdWUgPSBOVUxMOworCWludCB0ZW1wX3B5X2ludDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGVtcF9weV9sb25nOworCisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPIiwgJnByb3BlcnR5X25hbWUsICZ2YXJpYW50X3R5cGVfYXJnKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsdm1fcHJvcGVydHkgPSBsdm1fdmdfZ2V0X3Byb3BlcnR5KHNlbGYtPnZnLCBwcm9wZXJ0eV9uYW1lKTsKKwlpZiAoIWx2bV9wcm9wZXJ0eS5pc192YWxpZCkKKwkJZ290byBsdm1lcnJvcjsKKworCWlmIChQWVNUUllQRV9DSEVDSyh2YXJpYW50X3R5cGVfYXJnKSkgeworCisJCWlmICghbHZtX3Byb3BlcnR5LmlzX3N0cmluZykgeworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJQcm9wZXJ0eSByZXF1aXJlcyBzdHJpbmcgdmFsdWUiKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCisJCWlmICghKHN0cmluZ192YWx1ZSA9IFBZU1RSVFlQRV9BU1NUUklORyh2YXJpYW50X3R5cGVfYXJnKSkpIHsKKwkJCVB5RXJyX05vTWVtb3J5KCk7CisJCQlnb3RvIGJhaWw7CisJCX0KKworCQlsdm1fcHJvcGVydHkudmFsdWUuc3RyaW5nID0gc3RyaW5nX3ZhbHVlOworCX0gZWxzZSB7CisKKwkJaWYgKCFsdm1fcHJvcGVydHkuaXNfaW50ZWdlcikgeworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJQcm9wZXJ0eSByZXF1aXJlcyBudW1lcmljIHZhbHVlIik7CisJCQlnb3RvIGJhaWw7CisJCX0KKworCQlpZiAoUFlJTlRUWVBFX0NIRUNLKHZhcmlhbnRfdHlwZV9hcmcpKSB7CisJCQl0ZW1wX3B5X2ludCA9IFBZSU5UVFlQRV9BU0xPTkcodmFyaWFudF90eXBlX2FyZyk7CisKKwkJCS8qIC0xIGNvdWxkIGJlIHZhbGlkLCBuZWVkIHRvIHNlZSBpZiBhbiBleGNlcHRpb24gd2FzIGdlbi4gKi8KKwkJCWlmICh0ZW1wX3B5X2ludCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQkJCWdvdG8gYmFpbDsKKworCQkJaWYgKHRlbXBfcHlfaW50IDwgMCkgeworCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiUG9zaXRpdmUgaW50ZWdlcnMgb25seSEiKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisKKwkJCWx2bV9wcm9wZXJ0eS52YWx1ZS5pbnRlZ2VyID0gdGVtcF9weV9pbnQ7CisJCX0gZWxzZSBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YXJpYW50X3R5cGVfYXJnLCAoUHlPYmplY3QqKSZQeUxvbmdfVHlwZSkpeworCQkJLyogSWYgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyBmdW5jdGlvbiBmYWlscyBhbiBPdmVyZmxvd0Vycm9yIGlzCisJCQkgKiByYWlzZWQgYW5kICh1bnNpZ25lZCBsb25nIGxvbmcpLTEgaXMgcmV0dXJuZWQKKwkJCSAqLworCQkJaWYgKCh0ZW1wX3B5X2xvbmcgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHZhcmlhbnRfdHlwZV9hcmcpKSA9PSB+MFVMTCkKKwkJCQlnb3RvIGJhaWw7CisKKwkJCWx2bV9wcm9wZXJ0eS52YWx1ZS5pbnRlZ2VyID0gdGVtcF9weV9sb25nOworCQl9IGVsc2UgeworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJzdXBwb3J0ZWQgdmFsdWUgdHlwZXMgYXJlIG51bWVyaWMgYW5kIHN0cmluZyIpOworCQkJZ290byBiYWlsOworCQl9CisJfQorCisJaWYgKGx2bV92Z19zZXRfcHJvcGVydHkoc2VsZi0+dmcsIHByb3BlcnR5X25hbWUsICZsdm1fcHJvcGVydHkpID09IC0xKQorCQlnb3RvIGx2bWVycm9yOworCisJaWYgKGx2bV92Z193cml0ZShzZWxmLT52ZykgPT0gLTEpCisJCWdvdG8gbHZtZXJyb3I7CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKKworbHZtZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKK2JhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfZ2V0X3B2X2NvdW50KHZnb2JqZWN0ICpzZWxmKQoreworCVZHX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIksiLCAodW5zaWduZWQgbG9uZyBsb25nKWx2bV92Z19nZXRfcHZfY291bnQoc2VsZi0+dmcpKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19nZXRfbWF4X3B2KHZnb2JqZWN0ICpzZWxmKQoreworCVZHX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIksiLCAodW5zaWduZWQgbG9uZyBsb25nKWx2bV92Z19nZXRfbWF4X3B2KHNlbGYtPnZnKSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfZ2V0X21heF9sdih2Z29iamVjdCAqc2VsZikKK3sKKwlWR19WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fdmdfZ2V0X21heF9sdihzZWxmLT52ZykpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX3NldF9leHRlbnRfc2l6ZSh2Z29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJdW5zaWduZWQgaW50IG5ld19zaXplOworCisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmbmV3X3NpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fdmdfc2V0X2V4dGVudF9zaXplKHNlbGYtPnZnLCBuZXdfc2l6ZSkgPT0gLTEpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfbGlzdF9sdnModmdvYmplY3QgKnNlbGYpCit7CisJc3RydWN0IGRtX2xpc3QgKmx2czsKKwlzdHJ1Y3QgbHZtX2x2X2xpc3QgKmx2bDsKKwlQeU9iamVjdCAqIHB5dHVwbGU7CisJbHZvYmplY3QgKiBsdm9iajsKKwlpbnQgaSA9IDA7CisKKwlWR19WQUxJRChzZWxmKTsKKworCS8qIHVubGlrZSBvdGhlciBMVk0gYXBpIGNhbGxzLCBpZiB0aGVyZSBhcmUgbm8gcmVzdWx0cywgd2UgZ2V0IE5VTEwgKi8KKwlpZiAoIShsdnMgPSBsdm1fdmdfbGlzdF9sdnMoc2VsZi0+dmcpKSkKKwkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIigpIik7CisKKwlpZiAoIShweXR1cGxlID0gUHlUdXBsZV9OZXcoZG1fbGlzdF9zaXplKGx2cykpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsdnMpIHsKKwkJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBvYmplY3QgKi8KKwkJaWYgKCEobHZvYmogPSBfY3JlYXRlX3B5X2x2KHNlbGYsIGx2bC0+bHYpKSkgeworCQkJUHlfREVDUkVGKHB5dHVwbGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIGksIChQeU9iamVjdCAqKSBsdm9iaik7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gcHl0dXBsZTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19nZXRfdGFncyh2Z29iamVjdCAqc2VsZikKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqdGFnc2w7CisJc3RydWN0IGx2bV9zdHJfbGlzdCAqc3RybDsKKwlQeU9iamVjdCAqIHB5dHVwbGU7CisJaW50IGkgPSAwOworCisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAoISh0YWdzbCA9IGx2bV92Z19nZXRfdGFncyhzZWxmLT52ZykpKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHB5dHVwbGUgPSBQeVR1cGxlX05ldyhkbV9saXN0X3NpemUodGFnc2wpKSkpCisJCXJldHVybiBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHN0cmwsIHRhZ3NsKSB7CisJCVB5VHVwbGVfU0VUX0lURU0ocHl0dXBsZSwgaSwgUFlTVFJUWVBFX0ZST01TVFJJTkcoc3RybC0+c3RyKSk7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gcHl0dXBsZTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19jcmVhdGVfbHZfbGluZWFyKHZnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICp2Z25hbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CisJbHZfdCBsdjsKKworCVZHX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzSyIsICZ2Z25hbWUsICZzaXplKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShsdiA9IGx2bV92Z19jcmVhdGVfbHZfbGluZWFyKHNlbGYtPnZnLCB2Z25hbWUsIHNpemUpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopX2NyZWF0ZV9weV9sdihzZWxmLCBsdik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfY3JlYXRlX2x2X3RoaW5wb29sKHZnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIG1ldGFfc2l6ZSA9IDA7CisJY29uc3QgY2hhciAqcG9vbF9uYW1lOworCXVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZSA9IDA7CisJaW50IHNraXBfemVybyA9IDA7CisJbHZtX3RoaW5fZGlzY2FyZHNfdCBkaXNjYXJkID0gTFZNX1RISU5fRElTQ0FSRFNfUEFTU0RPV047CisJbHZfdCBsdjsKKwlsdl9jcmVhdGVfcGFyYW1zX3QgbHZwID0gTlVMTDsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsdWU7CisKKwlWR19WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic0t8a0tpaSIsICZwb29sX25hbWUsICZzaXplLCAmY2h1bmtfc2l6ZSwKKwkJCSAgICAgICZtZXRhX3NpemUsICZkaXNjYXJkLCAmc2tpcF96ZXJvKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShsdnAgPSBsdm1fbHZfcGFyYW1zX2NyZWF0ZV90aGluX3Bvb2woc2VsZi0+dmcsIHBvb2xfbmFtZSwgc2l6ZSwgY2h1bmtfc2l6ZSwKKwkJCQkJCSAgIG1ldGFfc2l6ZSwgZGlzY2FyZCkpKSB7CisKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHNraXBfemVybykgeworCQlwcm9wX3ZhbHVlID0gbHZtX2x2X3BhcmFtc19nZXRfcHJvcGVydHkobHZwLCAic2tpcF96ZXJvIik7CisKKwkJaWYgKHByb3BfdmFsdWUuaXNfdmFsaWQpIHsKKwkJCXByb3BfdmFsdWUudmFsdWUuaW50ZWdlciA9IDE7CisKKwkJCWlmIChsdm1fbHZfcGFyYW1zX3NldF9wcm9wZXJ0eShsdnAsICJza2lwX3plcm8iLAorCQkJCQkJICAgICAgICZwcm9wX3ZhbHVlKSA9PSAtMSkgeworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShsdiA9IGx2bV9sdl9jcmVhdGUobHZwKSkpIHsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopX2NyZWF0ZV9weV9sdihzZWxmLCBsdik7CisKK2Vycm9yOgorCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fdmdfY3JlYXRlX2x2X3RoaW4odmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKnBvb2xfbmFtZTsKKwljb25zdCBjaGFyICpsdl9uYW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gMDsKKwlsdl90IGx2OworCWx2X2NyZWF0ZV9wYXJhbXNfdCBsdnAgPSBOVUxMOworCisJVkdfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzSyIsICZwb29sX25hbWUsICZsdl9uYW1lLCAmc2l6ZSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKCEobHZwID0gbHZtX2x2X3BhcmFtc19jcmVhdGVfdGhpbihzZWxmLT52ZywgcG9vbF9uYW1lLCBsdl9uYW1lLHNpemUpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShsdiA9IGx2bV9sdl9jcmVhdGUobHZwKSkpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIChQeU9iamVjdCAqKV9jcmVhdGVfcHlfbHYoc2VsZiwgbHYpOworfQorCitzdGF0aWMgdm9pZCBsaWJsdm1fbHZfZGVhbGxvYyhsdm9iamVjdCAqc2VsZikKK3sKKwkvKiBXZSBjYW4gZGVhbGxvYyBhbiBvYmplY3QgdGhhdCBkaWRuJ3QgZ2V0IGZ1bGx5IGNyZWF0ZWQgKi8KKwlpZiAoc2VsZi0+cGFyZW50X3Znb2JqKSB7CisJCVB5X0RFQ1JFRihzZWxmLT5wYXJlbnRfdmdvYmopOworCX0KKworCVB5T2JqZWN0X0RlbChzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV92Z19saXN0X3B2cyh2Z29iamVjdCAqc2VsZikKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZzOworCXN0cnVjdCBsdm1fcHZfbGlzdCAqcHZsOworCVB5T2JqZWN0ICogcHl0dXBsZTsKKwlwdm9iamVjdCAqIHB2b2JqOworCWludCBpID0gMDsKKworCVZHX1ZBTElEKHNlbGYpOworCisJLyogdW5saWtlIG90aGVyIExWTSBhcGkgY2FsbHMsIGlmIHRoZXJlIGFyZSBubyByZXN1bHRzLCB3ZSBnZXQgTlVMTCAqLworCWlmICghKHB2cyA9IGx2bV92Z19saXN0X3B2cyhzZWxmLT52ZykpKQorCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKCkiKTsKKworCWlmICghKHB5dHVwbGUgPSBQeVR1cGxlX05ldyhkbV9saXN0X3NpemUocHZzKSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHB2cykgeworCQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG9iamVjdCAqLworCQlpZiAoIShwdm9iaiA9IF9jcmVhdGVfcHlfcHYoKSkpIHsKKwkJCVB5X0RFQ1JFRihweXR1cGxlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcHZvYmotPnBhcmVudF92Z29iaiA9IHNlbGY7CisJCVB5X0lOQ1JFRihwdm9iai0+cGFyZW50X3Znb2JqKTsKKworCQlwdm9iai0+cHYgPSBwdmwtPnB2OworCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIGksIChQeU9iamVjdCAqKSBwdm9iaik7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gcHl0dXBsZTsKK30KKwordHlwZWRlZiBsdl90ICgqbHZfZmV0Y2hfYnlfTikodmdfdCB2ZywgY29uc3QgY2hhciAqaWQpOwordHlwZWRlZiBwdl90ICgqcHZfZmV0Y2hfYnlfTikodmdfdCB2ZywgY29uc3QgY2hhciAqaWQpOworCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2Zyb21fTih2Z29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZywgbHZfZmV0Y2hfYnlfTiBtZXRob2QpCit7CisJY29uc3QgY2hhciAqaWQ7CisJbHZfdCBsdiA9IE5VTEw7CisKKwlWR19WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJzIiwgJmlkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShsdiA9IG1ldGhvZChzZWxmLT52ZywgaWQpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopX2NyZWF0ZV9weV9sdihzZWxmLCBsdik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfZnJvbV9uYW1lKHZnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQoreworCXJldHVybiBfbGlibHZtX2x2bV9sdl9mcm9tX04oc2VsZiwgYXJnLCBsdm1fbHZfZnJvbV9uYW1lKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9sdl9mcm9tX3V1aWQodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCit7CisJcmV0dXJuIF9saWJsdm1fbHZtX2x2X2Zyb21fTihzZWxmLCBhcmcsIGx2bV9sdl9mcm9tX3V1aWQpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X25hbWVfdmFsaWRhdGUodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlWR19WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZuYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobHZtX2x2X25hbWVfdmFsaWRhdGUoc2VsZi0+dmcsIG5hbWUpIDwgMCkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9wdl9mcm9tX04odmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcsIHB2X2ZldGNoX2J5X04gbWV0aG9kKQoreworCWNvbnN0IGNoYXIgKmlkOworCXB2b2JqZWN0ICpyYzsKKwlwdl90IHB2ID0gTlVMTDsKKworCVZHX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgInMiLCAmaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHB2ID0gbWV0aG9kKHNlbGYtPnZnLCBpZCkpKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKHJjID0gX2NyZWF0ZV9weV9wdigpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlQeV9JTkNSRUYoc2VsZik7CisJcmMtPnB2ID0gcHY7CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopcmM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZfZnJvbV9uYW1lKHZnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQoreworCXJldHVybiBfbGlibHZtX2x2bV9wdl9mcm9tX04oc2VsZiwgYXJnLCBsdm1fcHZfZnJvbV9uYW1lKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9wdl9mcm9tX3V1aWQodmdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCit7CisJcmV0dXJuIF9saWJsdm1fbHZtX3B2X2Zyb21fTihzZWxmLCBhcmcsIGx2bV9wdl9mcm9tX3V1aWQpOworfQorCitzdGF0aWMgdm9pZCBfbGlibHZtX3B2X2RlYWxsb2MocHZvYmplY3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPnBhcmVudF92Z29iaikgeworCQlQeV9ERUNSRUYoc2VsZi0+cGFyZW50X3Znb2JqKTsKKwl9CisKKwlpZiAoc2VsZi0+cGFyZW50X3B2c2xpc3RvYmopIHsKKwkJUHlfREVDUkVGKHNlbGYtPnBhcmVudF9wdnNsaXN0b2JqKTsKKwl9CisKKwlzZWxmLT5wYXJlbnRfdmdvYmogPSBOVUxMOworCXNlbGYtPnBhcmVudF9wdnNsaXN0b2JqID0gTlVMTDsKKwlQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKKy8qIExWIE1ldGhvZHMgKi8KKworI2RlZmluZSBMVl9WQUxJRChsdm9iamVjdCkgXAorCWRvIHsJCQkJCVwKKwkJaWYgKCFsdm9iamVjdCB8fCAhbHZvYmplY3QtPmx2KSB7IAlcCisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsICJMViBvYmplY3QgaW52YWxpZCIpOyBcCisJCQlyZXR1cm4gTlVMTDsJXAorCQl9XAorCQlWR19WQUxJRChsdm9iamVjdC0+cGFyZW50X3Znb2JqKTsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfZ2V0X2F0dHIobHZvYmplY3QgKnNlbGYpCit7CisJTFZfVkFMSUQoc2VsZik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGx2bV9sdl9nZXRfYXR0cihzZWxmLT5sdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2dldF9vcmlnaW4obHZvYmplY3QgKnNlbGYpCit7CisJTFZfVkFMSUQoc2VsZik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGx2bV9sdl9nZXRfb3JpZ2luKHNlbGYtPmx2KSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfZ2V0X25hbWUobHZvYmplY3QgKnNlbGYpCit7CisJTFZfVkFMSUQoc2VsZik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGx2bV9sdl9nZXRfbmFtZShzZWxmLT5sdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2dldF91dWlkKGx2b2JqZWN0ICpzZWxmKQoreworCUxWX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBsdm1fbHZfZ2V0X3V1aWQoc2VsZi0+bHYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9sdl9hY3RpdmF0ZShsdm9iamVjdCAqc2VsZikKK3sKKwlMVl9WQUxJRChzZWxmKTsKKworCWlmIChsdm1fbHZfYWN0aXZhdGUoc2VsZi0+bHYpID09IC0xKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKworCXJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2RlYWN0aXZhdGUobHZvYmplY3QgKnNlbGYpCit7CisJTFZfVkFMSUQoc2VsZik7CisKKwlpZiAobHZtX2x2X2RlYWN0aXZhdGUoc2VsZi0+bHYpID09IC0xKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKworCXJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3ZnX3JlbW92ZV9sdihsdm9iamVjdCAqc2VsZikKK3sKKwlMVl9WQUxJRChzZWxmKTsKKworCWlmIChsdm1fdmdfcmVtb3ZlX2x2KHNlbGYtPmx2KSA9PSAtMSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzZWxmLT5sdiA9IE5VTEw7CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworLyogVGhpcyB3aWxsIHJldHVybiBhIHR1cGxlIG9mICh2YWx1ZSwgYm9vbCkgd2l0aCB0aGUgdmFsdWUgYmVpbmcgYSBzdHJpbmcgb3IKKyAgIGludGVnZXIgYW5kIGJvb2wgaW5kaWNhdGluZyBpZiBwcm9wZXJ0eSBpcyBzZXR0YWJsZSAqLworc3RhdGljIFB5T2JqZWN0ICogX2xpYmx2bV9sdm1fbHZfZ2V0X3Byb3BlcnR5KGx2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgcHJvcF92YWx1ZTsKKworCUxWX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm5hbWUpKQorCQlyZXR1cm4gTlVMTDsKKworCXByb3BfdmFsdWUgPSBsdm1fbHZfZ2V0X3Byb3BlcnR5KHNlbGYtPmx2LCBuYW1lKTsKKworCXJldHVybiBnZXRfcHJvcGVydHkoJnByb3BfdmFsdWUpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2dldF9zaXplKGx2b2JqZWN0ICpzZWxmKQoreworCUxWX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIksiLCAodW5zaWduZWQgbG9uZyBsb25nKWx2bV9sdl9nZXRfc2l6ZShzZWxmLT5sdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2lzX2FjdGl2ZShsdm9iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdCAqcnZhbDsKKworCUxWX1ZBTElEKHNlbGYpOworCisJcnZhbCA9IChsdm1fbHZfaXNfYWN0aXZlKHNlbGYtPmx2KSA9PSAxKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKworCVB5X0lOQ1JFRihydmFsKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2lzX3N1c3BlbmRlZChsdm9iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdCAqcnZhbDsKKworCUxWX1ZBTElEKHNlbGYpOworCisJcnZhbCA9IChsdm1fbHZfaXNfc3VzcGVuZGVkKHNlbGYtPmx2KSA9PSAxKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKworCVB5X0lOQ1JFRihydmFsKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X2FkZF90YWcobHZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKnRhZzsKKworCUxWX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnRhZykpCisJCXJldHVybiBOVUxMOworCisJaWYgKGx2bV9sdl9hZGRfdGFnKHNlbGYtPmx2LCB0YWcpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJaWYgKGx2bV92Z193cml0ZShzZWxmLT5wYXJlbnRfdmdvYmotPnZnKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKKworZXJyb3I6CisJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9sdl9yZW1vdmVfdGFnKGx2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICp0YWc7CisKKwlMVl9WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZ0YWcpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fbHZfcmVtb3ZlX3RhZyhzZWxmLT5sdiwgdGFnKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCWlmIChsdm1fdmdfd3JpdGUoc2VsZi0+cGFyZW50X3Znb2JqLT52ZykgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmV0dXJuIFB5X05vbmU7CisKK2Vycm9yOgorCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfZ2V0X3RhZ3MobHZvYmplY3QgKnNlbGYpCit7CisJc3RydWN0IGRtX2xpc3QgKnRhZ3NsOworCXN0cnVjdCBsdm1fc3RyX2xpc3QgKnN0cmw7CisJUHlPYmplY3QgKiBweXR1cGxlOworCWludCBpID0gMDsKKworCUxWX1ZBTElEKHNlbGYpOworCisJaWYgKCEodGFnc2wgPSBsdm1fbHZfZ2V0X3RhZ3Moc2VsZi0+bHYpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShweXR1cGxlID0gUHlUdXBsZV9OZXcoZG1fbGlzdF9zaXplKHRhZ3NsKSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzdHJsLCB0YWdzbCkgeworCQlQeVR1cGxlX1NFVF9JVEVNKHB5dHVwbGUsIGksIFBZU1RSVFlQRV9GUk9NU1RSSU5HKHN0cmwtPnN0cikpOworCQlpKys7CisJfQorCisJcmV0dXJuIHB5dHVwbGU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfcmVuYW1lKGx2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICpuZXdfbmFtZTsKKworCUxWX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm5ld19uYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobHZtX2x2X3JlbmFtZShzZWxmLT5sdiwgbmV3X25hbWUpID09IC0xKSB7CisJCVB5RXJyX1NldE9iamVjdChfTGliTFZNRXJyb3IsIF9saWJsdm1fZ2V0X2xhc3RfZXJyb3IoKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKworCXJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X3Jlc2l6ZShsdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5ld19zaXplOworCisJTFZfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIksiLCAmbmV3X3NpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fbHZfcmVzaXplKHNlbGYtPmx2LCBuZXdfc2l6ZSkgPT0gLTEpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fbHZfbGlzdF9sdnNlZ3MobHZvYmplY3QgKnNlbGYpCit7CisJc3RydWN0IGRtX2xpc3QgKmx2c2VnczsKKwlsdnNlZ19saXN0X3QgKmx2c2VnbDsKKwlQeU9iamVjdCAqIHB5dHVwbGU7CisJbHZzZWdvYmplY3QgKmx2c2Vnb2JqOworCWludCBpID0gMDsKKworCUxWX1ZBTElEKHNlbGYpOworCisJaWYgKCEobHZzZWdzID0gbHZtX2x2X2xpc3RfbHZzZWdzKHNlbGYtPmx2KSkpCisJCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoKSIpOworCisJaWYgKCEocHl0dXBsZSA9IFB5VHVwbGVfTmV3KGRtX2xpc3Rfc2l6ZShsdnNlZ3MpKSkpCisJCXJldHVybiBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2c2VnbCwgbHZzZWdzKSB7CisJCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgb2JqZWN0ICovCisJCWlmICghKGx2c2Vnb2JqID0gUHlPYmplY3RfTmV3KGx2c2Vnb2JqZWN0LCAmX0xpYkxWTWx2c2VnVHlwZSkpKSB7CisJCQlQeV9ERUNSRUYocHl0dXBsZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWx2c2Vnb2JqLT5wYXJlbnRfbHZvYmogPSBzZWxmOworCQlQeV9JTkNSRUYobHZzZWdvYmotPnBhcmVudF9sdm9iaik7CisKKwkJbHZzZWdvYmotPmx2X3NlZyA9IGx2c2VnbC0+bHZzZWc7CisJCVB5VHVwbGVfU0VUX0lURU0ocHl0dXBsZSwgaSwgKFB5T2JqZWN0ICopIGx2c2Vnb2JqKTsKKwkJaSsrOworCX0KKworCXJldHVybiBweXR1cGxlOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX2x2X3NuYXBzaG90KGx2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICpzbmFwX25hbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSAwOworCWx2X3QgbHY7CisJbHZfY3JlYXRlX3BhcmFtc190IGx2cCA9IE5VTEw7CisKKwlMVl9WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xLIiwgJnNuYXBfbmFtZSwgJnNpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGx2cCA9IGx2bV9sdl9wYXJhbXNfY3JlYXRlX3NuYXBzaG90KHNlbGYtPmx2LCBzbmFwX25hbWUsIHNpemUpKSkgeworCQlQeUVycl9TZXRPYmplY3QoX0xpYkxWTUVycm9yLCBfbGlibHZtX2dldF9sYXN0X2Vycm9yKCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShsdiA9IGx2bV9sdl9jcmVhdGUobHZwKSkpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIChQeU9iamVjdCAqKV9jcmVhdGVfcHlfbHYoc2VsZi0+cGFyZW50X3Znb2JqLCBsdik7Cit9CisKKy8qIFBWIE1ldGhvZHMgKi8KKworI2RlZmluZSBQVl9WQUxJRChwdm9iamVjdCkgXAorCWRvIHsgXAorCQlpZiAoIXB2b2JqZWN0IHx8ICFwdm9iamVjdC0+cHYpIHsgXAorCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLCAiUFYgb2JqZWN0IGludmFsaWQiKTsgXAorCQkJcmV0dXJuIE5VTEw7IFwKKwkJfSBcCisJCWlmIChwdm9iamVjdC0+cGFyZW50X3Znb2JqKSB7IFwKKwkJCVZHX1ZBTElEKHB2b2JqZWN0LT5wYXJlbnRfdmdvYmopOyBcCisJCX0gXAorCQlpZiAocHZvYmplY3QtPnBhcmVudF9wdnNsaXN0b2JqKSB7IFwKKwkJCVBWU0xJU1RfVkFMSUQocHZvYmplY3QtPnBhcmVudF9wdnNsaXN0b2JqKTsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2X2dldF9uYW1lKHB2b2JqZWN0ICpzZWxmKQoreworCVBWX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBsdm1fcHZfZ2V0X25hbWUoc2VsZi0+cHYpKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9wdl9nZXRfdXVpZChwdm9iamVjdCAqc2VsZikKK3sKKwlQVl9WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgbHZtX3B2X2dldF91dWlkKHNlbGYtPnB2KSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZfZ2V0X21kYV9jb3VudChwdm9iamVjdCAqc2VsZikKK3sKKwlQVl9WQUxJRChzZWxmKTsKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJLIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsdm1fcHZfZ2V0X21kYV9jb3VudChzZWxmLT5wdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2X2dldF9wcm9wZXJ0eShwdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsdWU7CisKKwlQVl9WQUxJRChzZWxmKTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZuYW1lKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcm9wX3ZhbHVlID0gbHZtX3B2X2dldF9wcm9wZXJ0eShzZWxmLT5wdiwgbmFtZSk7CisKKwlyZXR1cm4gZ2V0X3Byb3BlcnR5KCZwcm9wX3ZhbHVlKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9wdl9nZXRfZGV2X3NpemUocHZvYmplY3QgKnNlbGYpCit7CisJUFZfVkFMSUQoc2VsZik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSyIsICh1bnNpZ25lZCBsb25nIGxvbmcpbHZtX3B2X2dldF9kZXZfc2l6ZShzZWxmLT5wdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2X2dldF9zaXplKHB2b2JqZWN0ICpzZWxmKQoreworCVBWX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIksiLCAodW5zaWduZWQgbG9uZyBsb25nKWx2bV9wdl9nZXRfc2l6ZShzZWxmLT5wdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2X2dldF9mcmVlKHB2b2JqZWN0ICpzZWxmKQoreworCVBWX1ZBTElEKHNlbGYpOworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIksiLCAodW5zaWduZWQgbG9uZyBsb25nKWx2bV9wdl9nZXRfZnJlZShzZWxmLT5wdikpOworfQorCitzdGF0aWMgUHlPYmplY3QgKl9saWJsdm1fbHZtX3B2X3Jlc2l6ZShwdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5ld19zaXplOworCisJUFZfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIksiLCAmbmV3X3NpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsdm1fcHZfcmVzaXplKHNlbGYtPnB2LCBuZXdfc2l6ZSkgPT0gLTEpIHsKKwkJUHlFcnJfU2V0T2JqZWN0KF9MaWJMVk1FcnJvciwgX2xpYmx2bV9nZXRfbGFzdF9lcnJvcigpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCisJcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZfbGlzdF9wdnNlZ3MocHZvYmplY3QgKnNlbGYpCit7CisJc3RydWN0IGRtX2xpc3QgKnB2c2VnczsKKwlwdnNlZ19saXN0X3QgKnB2c2VnbDsKKwlQeU9iamVjdCAqcHl0dXBsZTsKKwlwdnNlZ29iamVjdCAqcHZzZWdvYmo7CisJaW50IGkgPSAwOworCisJUFZfVkFMSUQoc2VsZik7CisKKwlpZiAoIShwdnNlZ3MgPSBsdm1fcHZfbGlzdF9wdnNlZ3Moc2VsZi0+cHYpKSkKKwkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIigpIik7CisKKwlpZiAoIShweXR1cGxlID0gUHlUdXBsZV9OZXcoZG1fbGlzdF9zaXplKHB2c2VncykpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZzZWdsLCBwdnNlZ3MpIHsKKwkJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBvYmplY3QgKi8KKwkJaWYgKCEocHZzZWdvYmogPSBQeU9iamVjdF9OZXcocHZzZWdvYmplY3QsICZfTGliTFZNcHZzZWdUeXBlKSkpIHsKKwkJCVB5X0RFQ1JFRihweXR1cGxlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcHZzZWdvYmotPnBhcmVudF9wdm9iaiA9IHNlbGY7CisJCVB5X0lOQ1JFRihwdnNlZ29iai0+cGFyZW50X3B2b2JqKTsKKworCQlwdnNlZ29iai0+cHZfc2VnID0gcHZzZWdsLT5wdnNlZzsKKwkJUHlUdXBsZV9TRVRfSVRFTShweXR1cGxlLCBpLCAoUHlPYmplY3QgKikgcHZzZWdvYmopOworCQlpKys7CisJfQorCisJcmV0dXJuIHB5dHVwbGU7Cit9CisKKy8qIExWIHNlZyBtZXRob2RzICovCisKKy8qCisgKiBObyB3YXkgdG8gY2xvc2UvZGVzdHJveSBhbiBsdnNlZywganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSBwYXJlbnRzIGFyZQorICogc3RpbGwgZ29vZAorICovCisjZGVmaW5lIExWU0VHX1ZBTElEKGx2c2Vnb2JqZWN0KSBcCisJZG8geyBcCisJCWlmICggIWx2c2Vnb2JqZWN0IHx8ICFsdnNlZ29iamVjdC0+cGFyZW50X2x2b2JqICkgeyBcCisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsICJMViBzZWdtZW50IG9iamVjdCBpbnZhbGlkIik7IFwKKwkJCXJldHVybiBOVUxMOyBcCisJCX0gXAorCQlMVl9WQUxJRChsdnNlZ29iamVjdC0+cGFyZW50X2x2b2JqKTsgXAorCX0gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgX2xpYmx2bV9sdnNlZ19kZWFsbG9jKGx2c2Vnb2JqZWN0ICpzZWxmKQoreworCVB5X0RFQ1JFRihzZWxmLT5wYXJlbnRfbHZvYmopOworCVB5T2JqZWN0X0RlbChzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpfbGlibHZtX2x2bV9sdnNlZ19nZXRfcHJvcGVydHkobHZzZWdvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbHVlOworCisJTFZTRUdfVkFMSUQoc2VsZik7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmbmFtZSkpCisJCXJldHVybiBOVUxMOworCisJcHJvcF92YWx1ZSA9IGx2bV9sdnNlZ19nZXRfcHJvcGVydHkoc2VsZi0+bHZfc2VnLCBuYW1lKTsKKworCXJldHVybiBnZXRfcHJvcGVydHkoJnByb3BfdmFsdWUpOworfQorCisvKiBQViBzZWcgbWV0aG9kcyAqLworCisvKgorICogTm8gd2F5IHRvIGNsb3NlL2Rlc3Ryb3kgYSBwdnNlZywganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSBwYXJlbnRzIGFyZQorICogc3RpbGwgZ29vZAorICovCisjZGVmaW5lIFBWU0VHX1ZBTElEKHB2c2Vnb2JqZWN0KSBcCisJZG8geyBcCisJCWlmICghcHZzZWdvYmplY3QgfHwgIXB2c2Vnb2JqZWN0LT5wYXJlbnRfcHZvYmopIHsgXAorCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLCAiUFYgc2VnbWVudCBvYmplY3QgaW52YWxpZCIpOyBcCisJCQlyZXR1cm4gTlVMTDsgXAorCQl9IFwKKwkJUFZfVkFMSUQocHZzZWdvYmplY3QtPnBhcmVudF9wdm9iaik7IFwKKwl9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIF9saWJsdm1fcHZzZWdfZGVhbGxvYyhwdnNlZ29iamVjdCAqc2VsZikKK3sKKwlQeV9ERUNSRUYoc2VsZi0+cGFyZW50X3B2b2JqKTsKKwlQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqX2xpYmx2bV9sdm1fcHZzZWdfZ2V0X3Byb3BlcnR5KHB2c2Vnb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgcHJvcF92YWx1ZTsKKworCVBWU0VHX1ZBTElEKHNlbGYpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm5hbWUpKQorCQlyZXR1cm4gTlVMTDsKKworCXByb3BfdmFsdWUgPSBsdm1fcHZzZWdfZ2V0X3Byb3BlcnR5KHNlbGYtPnB2X3NlZywgbmFtZSk7CisKKwlyZXR1cm4gZ2V0X3Byb3BlcnR5KCZwcm9wX3ZhbHVlKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWV0aG9kIHRhYmxlcyBhbmQgb3RoZXIgYnVyZWF1Y3JhY3kKKyAqLworCitzdGF0aWMgUHlNZXRob2REZWYgX0xpYmx2bV9tZXRob2RzW10gPSB7CisJLyogTFZNIG1ldGhvZHMgKi8KKwl7ICJnZXRWZXJzaW9uIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2xpYnJhcnlfZ2V0X3ZlcnNpb24sIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2MiLAkJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9nYywgTUVUSF9OT0FSR1MsIF9nY19kb2MgfSwKKwl7ICJ2Z09wZW4iLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX29wZW4sIE1FVEhfVkFSQVJHUyB9LAorCXsgInZnQ3JlYXRlIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19jcmVhdGUsIE1FVEhfVkFSQVJHUyB9LAorCXsgImNvbmZpZ0ZpbmRCb29sIiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2NvbmZpZ19maW5kX2Jvb2wsIE1FVEhfVkFSQVJHUyB9LAorCXsgImNvbmZpZ1JlbG9hZCIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9jb25maWdfcmVsb2FkLCBNRVRIX05PQVJHUyB9LAorCXsgImNvbmZpZ092ZXJyaWRlIiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2NvbmZpZ19vdmVycmlkZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAic2NhbiIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fc2NhbiwgTUVUSF9OT0FSR1MgfSwKKwl7ICJsaXN0VmdOYW1lcyIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9saXN0X3ZnX25hbWVzLCBNRVRIX05PQVJHUyB9LAorCXsgImxpc3RWZ1V1aWRzIiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2xpc3RfdmdfdXVpZHMsIE1FVEhfTk9BUkdTIH0sCisJeyAibGlzdFB2cyIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbGlzdF9wdnMsIE1FVEhfTk9BUkdTIH0sCisJeyAicHZDcmVhdGUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X2NyZWF0ZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAicHZSZW1vdmUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X3JlbW92ZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAicGVyY2VudFRvRmxvYXQiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcGVyY2VudF90b19mbG9hdCwgTUVUSF9WQVJBUkdTIH0sCisJeyAidmdOYW1lVmFsaWRhdGUiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfbmFtZV92YWxpZGF0ZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAidmdOYW1lRnJvbVB2aWQiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmduYW1lX2Zyb21fcHZpZCwgTUVUSF9WQVJBUkdTIH0sCisJeyAidmdOYW1lRnJvbURldmljZSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z25hbWVfZnJvbV9kZXZpY2UsIE1FVEhfVkFSQVJHUyB9LAorCXsgTlVMTCwgTlVMTCB9CQkvKiBzZW50aW5lbCAqLworfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIF9saWJsdm1fdmdfbWV0aG9kc1tdID0geworCS8qIHZnIG1ldGhvZHMgKi8KKwl7ICJnZXROYW1lIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfbmFtZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRVdWlkIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfdXVpZCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfY2xvc2UsIE1FVEhfTk9BUkdTIH0sCisJeyAicmVtb3ZlIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19yZW1vdmUsIE1FVEhfTk9BUkdTIH0sCisJeyAiZXh0ZW5kIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19leHRlbmQsIE1FVEhfVkFSQVJHUyB9LAorCXsgInJlZHVjZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfcmVkdWNlLCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJhZGRUYWciLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2FkZF90YWcsIE1FVEhfVkFSQVJHUyB9LAorCXsgInJlbW92ZVRhZyIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfcmVtb3ZlX3RhZywgTUVUSF9WQVJBUkdTIH0sCisJeyAic2V0RXh0ZW50U2l6ZSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19zZXRfZXh0ZW50X3NpemUsIE1FVEhfVkFSQVJHUyB9LAorCXsgImlzQ2x1c3RlcmVkIiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2lzX2NsdXN0ZXJlZCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJpc0V4cG9ydGVkIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19pc19leHBvcnRlZCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJpc1BhcnRpYWwiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2lzX3BhcnRpYWwsIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0U2Vxbm8iLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2dldF9zZXFubywgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRTaXplIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfc2l6ZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRGcmVlU2l6ZSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfZnJlZV9zaXplLCBNRVRIX05PQVJHUyB9LAorCXsgImdldEV4dGVudFNpemUiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfZ2V0X2V4dGVudF9zaXplLCBNRVRIX05PQVJHUyB9LAorCXsgImdldEV4dGVudENvdW50IiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2dldF9leHRlbnRfY291bnQsIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0RnJlZUV4dGVudENvdW50IiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2dldF9mcmVlX2V4dGVudF9jb3VudCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRQcm9wZXJ0eSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfcHJvcGVydHksIE1FVEhfVkFSQVJHUyB9LAorCXsgInNldFByb3BlcnR5IiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX3NldF9wcm9wZXJ0eSwgTUVUSF9WQVJBUkdTIH0sCisJeyAiZ2V0UHZDb3VudCIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfZ2V0X3B2X2NvdW50LCBNRVRIX05PQVJHUyB9LAorCXsgImdldE1heFB2IiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfbWF4X3B2LCBNRVRIX05PQVJHUyB9LAorCXsgImdldE1heEx2IiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19nZXRfbWF4X2x2LCBNRVRIX05PQVJHUyB9LAorCXsgImxpc3RMVnMiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2xpc3RfbHZzLCBNRVRIX05PQVJHUyB9LAorCXsgImxpc3RQVnMiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3ZnX2xpc3RfcHZzLCBNRVRIX05PQVJHUyB9LAorCXsgImx2RnJvbU5hbWUiLCAJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2Zyb21fbmFtZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAibHZGcm9tVXVpZCIsIAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfZnJvbV91dWlkLCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJsdk5hbWVWYWxpZGF0ZSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9uYW1lX3ZhbGlkYXRlLCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJwdkZyb21OYW1lIiwgCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9wdl9mcm9tX25hbWUsIE1FVEhfVkFSQVJHUyB9LAorCXsgInB2RnJvbVV1aWQiLCAJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X2Zyb21fdXVpZCwgTUVUSF9WQVJBUkdTIH0sCisJeyAiZ2V0VGFncyIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfZ2V0X3RhZ3MsIE1FVEhfTk9BUkdTIH0sCisJeyAiY3JlYXRlTHZMaW5lYXIiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfY3JlYXRlX2x2X2xpbmVhciwgTUVUSF9WQVJBUkdTIH0sCisJeyAiY3JlYXRlTHZUaGlucG9vbCIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19jcmVhdGVfbHZfdGhpbnBvb2wsIE1FVEhfVkFSQVJHUyB9LAorCXsgImNyZWF0ZUx2VGhpbiIsIAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fdmdfY3JlYXRlX2x2X3RoaW4sIE1FVEhfVkFSQVJHUyB9LAorCXsgTlVMTCwgTlVMTCB9CQkvKiBzZW50aW5lbCAqLworfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIF9saWJsdm1fbHZfbWV0aG9kc1tdID0geworCS8qIGx2IG1ldGhvZHMgKi8KKwl7ICJnZXRBdHRyIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9nZXRfYXR0ciwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXROYW1lIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9nZXRfbmFtZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRPcmlnaW4iLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2dldF9vcmlnaW4sIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0VXVpZCIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfZ2V0X3V1aWQsIE1FVEhfTk9BUkdTIH0sCisJeyAiYWN0aXZhdGUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2FjdGl2YXRlLCBNRVRIX05PQVJHUyB9LAorCXsgImRlYWN0aXZhdGUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2RlYWN0aXZhdGUsIE1FVEhfTk9BUkdTIH0sCisJeyAicmVtb3ZlIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV92Z19yZW1vdmVfbHYsIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0UHJvcGVydHkiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfZ2V0X3Byb3BlcnR5LCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJnZXRTaXplIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9nZXRfc2l6ZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJpc0FjdGl2ZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfaXNfYWN0aXZlLCBNRVRIX05PQVJHUyB9LAorCXsgImlzU3VzcGVuZGVkIiwJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2lzX3N1c3BlbmRlZCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJhZGRUYWciLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2X2FkZF90YWcsIE1FVEhfVkFSQVJHUyB9LAorCXsgInJlbW92ZVRhZyIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfcmVtb3ZlX3RhZywgTUVUSF9WQVJBUkdTIH0sCisJeyAiZ2V0VGFncyIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfZ2V0X3RhZ3MsIE1FVEhfTk9BUkdTIH0sCisJeyAicmVuYW1lIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9yZW5hbWUsIE1FVEhfVkFSQVJHUyB9LAorCXsgInJlc2l6ZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfcmVzaXplLCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJsaXN0TFZzZWdzIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9sdl9saXN0X2x2c2VncywgTUVUSF9OT0FSR1MgfSwKKwl7ICJzbmFwc2hvdCIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fbHZfc25hcHNob3QsIE1FVEhfVkFSQVJHUyB9LAorCXsgTlVMTCwgTlVMTCB9CQkvKiBzZW50aW5lbCAqLworfTsKKworc3RhdGljIFB5TWV0aG9kRGVmIF9saWJsdm1fcHZfbGlzdF9tZXRob2RzW10gPSB7CisJLyogcHYgbGlzdCBtZXRob2RzICovCisJeyAiX19lbnRlcl9fIiwgCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZsaXN0X2dldCwgTUVUSF9WQVJBUkdTIH0sCisJeyAiX19leGl0X18iLCAJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9wdmxpc3RfcHV0LCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJvcGVuIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9wdmxpc3RfZ2V0LCBNRVRIX1ZBUkFSR1MgfSwKKwl7ICJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZsaXN0X3B1dCwgTUVUSF9WQVJBUkdTIH0sCisJeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBQeU1ldGhvZERlZiBfbGlibHZtX3B2X21ldGhvZHNbXSA9IHsKKwkvKiBwdiBtZXRob2RzICovCisJeyAiZ2V0TmFtZSIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZfZ2V0X25hbWUsIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0VXVpZCIsCQkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZfZ2V0X3V1aWQsIE1FVEhfTk9BUkdTIH0sCisJeyAiZ2V0TWRhQ291bnQiLAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZfZ2V0X21kYV9jb3VudCwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRQcm9wZXJ0eSIsCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9wdl9nZXRfcHJvcGVydHksIE1FVEhfVkFSQVJHUyB9LAorCXsgImdldFNpemUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X2dldF9zaXplLCBNRVRIX05PQVJHUyB9LAorCXsgImdldERldlNpemUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X2dldF9kZXZfc2l6ZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJnZXRGcmVlIiwJCShQeUNGdW5jdGlvbilfbGlibHZtX2x2bV9wdl9nZXRfZnJlZSwgTUVUSF9OT0FSR1MgfSwKKwl7ICJyZXNpemUiLAkJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2X3Jlc2l6ZSwgTUVUSF9WQVJBUkdTIH0sCisJeyAibGlzdFBWc2VncyIsIAkoUHlDRnVuY3Rpb24pX2xpYmx2bV9sdm1fcHZfbGlzdF9wdnNlZ3MsIE1FVEhfTk9BUkdTIH0sCisJeyBOVUxMLCBOVUxMIH0JCS8qIHNlbnRpbmVsICovCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgX2xpYmx2bV9sdnNlZ19tZXRob2RzW10gPSB7CisJeyAiZ2V0UHJvcGVydHkiLCAJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX2x2c2VnX2dldF9wcm9wZXJ0eSwgTUVUSF9WQVJBUkdTIH0sCisJeyBOVUxMLCBOVUxMIH0JCS8qIHNlbnRpbmVsICovCit9OworCitzdGF0aWMgUHlNZXRob2REZWYgX2xpYmx2bV9wdnNlZ19tZXRob2RzW10gPSB7CisJeyAiZ2V0UHJvcGVydHkiLCAJKFB5Q0Z1bmN0aW9uKV9saWJsdm1fbHZtX3B2c2VnX2dldF9wcm9wZXJ0eSwgTUVUSF9WQVJBUkdTIH0sCisJeyBOVUxMLCBOVUxMIH0JCS8qIHNlbnRpbmVsICovCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9MaWJMVk12Z1R5cGUgPSB7CisJUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKwkudHBfbmFtZSA9ICJsdm0uTGlibHZtX3ZnIiwKKwkudHBfYmFzaWNzaXplID0gc2l6ZW9mKHZnb2JqZWN0KSwKKwkudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXcsCisJLnRwX2RlYWxsb2MgPSAoZGVzdHJ1Y3RvcilsaWJsdm1fdmdfZGVhbGxvYywKKwkudHBfZmxhZ3MgPSBQeV9UUEZMQUdTX0RFRkFVTFQsCisJLnRwX2RvYyA9ICJMVk0gVm9sdW1lIEdyb3VwIG9iamVjdCIsCisJLnRwX21ldGhvZHMgPSBfbGlibHZtX3ZnX21ldGhvZHMsCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9MaWJMVk1sdlR5cGUgPSB7CisJUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKwkudHBfbmFtZSA9ICJsdm0uTGlibHZtX2x2IiwKKwkudHBfYmFzaWNzaXplID0gc2l6ZW9mKGx2b2JqZWN0KSwKKwkudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXcsCisJLnRwX2RlYWxsb2MgPSAoZGVzdHJ1Y3RvcilsaWJsdm1fbHZfZGVhbGxvYywKKwkudHBfZmxhZ3MgPSBQeV9UUEZMQUdTX0RFRkFVTFQsCisJLnRwX2RvYyA9ICJMVk0gTG9naWNhbCBWb2x1bWUgb2JqZWN0IiwKKwkudHBfbWV0aG9kcyA9IF9saWJsdm1fbHZfbWV0aG9kcywKK307CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgX0xpYkxWTXB2bGlzdFR5cGUgPSB7CisJUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKwkudHBfbmFtZSA9ICJsdm0uTGlibHZtX3B2bGlzdCIsCisJLnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihwdnNsaXN0b2JqZWN0KSwKKwkudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXcsCisJLnRwX2RlYWxsb2MgPSAoZGVzdHJ1Y3RvcilfbGlibHZtX3B2bGlzdF9kZWFsbG9jLAorCS50cF9mbGFncyA9IFB5X1RQRkxBR1NfREVGQVVMVCwKKwkudHBfZG9jID0gIkxWTSBQaHlzaWNhbCBWb2x1bWUgbGlzdCBvYmplY3QiLAorCS50cF9tZXRob2RzID0gX2xpYmx2bV9wdl9saXN0X21ldGhvZHMsCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9MaWJMVk1wdlR5cGUgPSB7CisJUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKwkudHBfbmFtZSA9ICJsdm0uTGlibHZtX3B2IiwKKwkudHBfYmFzaWNzaXplID0gc2l6ZW9mKHB2b2JqZWN0KSwKKwkudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXcsCisJLnRwX2RlYWxsb2MgPSAoZGVzdHJ1Y3RvcilfbGlibHZtX3B2X2RlYWxsb2MsCisJLnRwX2ZsYWdzID0gUHlfVFBGTEFHU19ERUZBVUxULAorCS50cF9kb2MgPSAiTFZNIFBoeXNpY2FsIFZvbHVtZSBvYmplY3QiLAorCS50cF9tZXRob2RzID0gX2xpYmx2bV9wdl9tZXRob2RzLAorfTsKKworc3RhdGljIFB5VHlwZU9iamVjdCBfTGliTFZNbHZzZWdUeXBlID0geworCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisJLnRwX25hbWUgPSAibHZtLkxpYmx2bV9sdnNlZyIsCisJLnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihsdnNlZ29iamVjdCksCisJLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3LAorCS50cF9kZWFsbG9jID0gKGRlc3RydWN0b3IpX2xpYmx2bV9sdnNlZ19kZWFsbG9jLAorCS50cF9mbGFncyA9IFB5X1RQRkxBR1NfREVGQVVMVCwKKwkudHBfZG9jID0gIkxWTSBMb2dpY2FsIFZvbHVtZSBTZWdtZW50IG9iamVjdCIsCisJLnRwX21ldGhvZHMgPSBfbGlibHZtX2x2c2VnX21ldGhvZHMsCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9MaWJMVk1wdnNlZ1R5cGUgPSB7CisJUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKwkudHBfbmFtZSA9ICJsdm0uTGlibHZtX3B2c2VnIiwKKwkudHBfYmFzaWNzaXplID0gc2l6ZW9mKHB2c2Vnb2JqZWN0KSwKKwkudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXcsCisJLnRwX2RlYWxsb2MgPSAoZGVzdHJ1Y3RvcilfbGlibHZtX3B2c2VnX2RlYWxsb2MsCisJLnRwX2ZsYWdzID0gUHlfVFBGTEFHU19ERUZBVUxULAorCS50cF9kb2MgPSAiTFZNIFBoeXNpY2FsIFZvbHVtZSBTZWdtZW50IG9iamVjdCIsCisJLnRwX21ldGhvZHMgPSBfbGlibHZtX3B2c2VnX21ldGhvZHMsCit9OworCitzdGF0aWMgdm9pZCBfbGlibHZtX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoX2xpYmgpIHsKKwkJbHZtX3F1aXQoX2xpYmgpOworCQlfbGliaCA9IE5VTEw7CisJfQorfQorCisjaWZkZWYgSVNfUFkzSworc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBtb2R1bGVkZWYgPSB7CisJUHlNb2R1bGVEZWZfSEVBRF9JTklULAorCSJsdm0iLAorCSJMaWJsdm0gbW9kdWxlIiwKKwktMSwKKwlfTGlibHZtX21ldGhvZHMsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTAorfTsKKworI2RlZmluZSBNT0RJTklURVJST1IgcmV0dXJuIE5VTEwKK1B5T2JqZWN0ICoKK1B5SW5pdF9sdm0odm9pZCkKKworI2Vsc2UKKyNkZWZpbmUgTU9ESU5JVEVSUk9SIHJldHVybgorUHlNT0RJTklUX0ZVTkMgaW5pdGx2bSh2b2lkKTsKK1B5TU9ESU5JVF9GVU5DIGluaXRsdm0odm9pZCkKKyNlbmRpZgoreworCVB5T2JqZWN0ICptOworCisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTXZnVHlwZSkgPCAwKQorCQlNT0RJTklURVJST1I7CisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTWx2VHlwZSkgPCAwKQorCQlNT0RJTklURVJST1I7CisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTXB2VHlwZSkgPCAwKQorCQlNT0RJTklURVJST1I7CisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTWx2c2VnVHlwZSkgPCAwKQorCQlNT0RJTklURVJST1I7CisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTXB2c2VnVHlwZSkgPCAwKQorCQlNT0RJTklURVJST1I7CisJaWYgKFB5VHlwZV9SZWFkeSgmX0xpYkxWTXB2bGlzdFR5cGUpIDwgMCkKKwkJTU9ESU5JVEVSUk9SOworCisjaWZkZWYgSVNfUFkzSworCW0gPSBQeU1vZHVsZV9DcmVhdGUoJm1vZHVsZWRlZik7CisjZWxzZQorCW0gPSBQeV9Jbml0TW9kdWxlMygibHZtIiwgX0xpYmx2bV9tZXRob2RzLCAiTGlibHZtIG1vZHVsZSIpOworI2VuZGlmCisJaWYgKG0gPT0gTlVMTCkKKwkJTU9ESU5JVEVSUk9SOworCisJaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSElOX0RJU0NBUkRTX0lHTk9SRSIsCisJCQkJICAgIExWTV9USElOX0RJU0NBUkRTX0lHTk9SRSkgPCAwKQorCQlNT0RJTklURVJST1I7CisKKwlpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRISU5fRElTQ0FSRFNfTk9fUEFTU0RPV04iLAorCQkJCSAgICBMVk1fVEhJTl9ESVNDQVJEU19OT19QQVNTRE9XTikgPCAwKQorCQlNT0RJTklURVJST1I7CisKKwlpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRISU5fRElTQ0FSRFNfUEFTU0RPV04iLAorCQkJCSAgICBMVk1fVEhJTl9ESVNDQVJEU19QQVNTRE9XTikgPCAwKQorCQlNT0RJTklURVJST1I7CisKKwlpZiAoKF9MaWJMVk1FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigoY2hhciopImx2bS5MaWJMVk1FcnJvciIsIE5VTEwsIE5VTEwpKSkgeworCQkvKiBFYWNoIGNhbGwgdG8gUHlNb2R1bGVfQWRkT2JqZWN0IGRlY3JlZnMgaXQ7IGNvbXBlbnNhdGU6ICovCisJCVB5X0lOQ1JFRihfTGliTFZNRXJyb3IpOworCQlQeV9JTkNSRUYoX0xpYkxWTUVycm9yKTsKKwkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIF9MaWJMVk1FcnJvcik7CisJCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGliTFZNRXJyb3IiLCBfTGliTFZNRXJyb3IpOworCX0KKworCVB5X0F0RXhpdChfbGlibHZtX2NsZWFudXApOworI2lmZGVmIElTX1BZM0sKKwlyZXR1cm4gbTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3NldHVwLnB5LmluIGIvcHl0aG9uL3NldHVwLnB5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDQ0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vc2V0dXAucHkuaW4KQEAgLTAsMCArMSwzNSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCisKK2xpYmx2bSA9IEV4dGVuc2lvbignbHZtJywKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsnbGlibHZtX3B5dGhvbi5jJ10sCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz0gWydsdm0yYXBwJ10sCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz0gWydAdG9wX2J1aWxkZGlyQC9saWJsdm0nXSwKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPSBbJ0B0b3BfYnVpbGRkaXJAL2luY2x1ZGUnXSkKKworc2V0dXAgKG5hbWU9J2x2bScsCisgICAgICAgdmVyc2lvbj1ATFZNX1ZFUlNJT05ALAorICAgICAgIGRlc2NyaXB0aW9uPSdQeXRob24gYmluZGluZ3MgZm9yIGxpYmx2bTInLAorICAgICAgIGxpY2Vuc2U9IkxHUEx2MisiLAorICAgICAgIG1haW50YWluZXI9J0xWTTIgbWFpbnRhaW5lcnMnLAorICAgICAgIG1haW50YWluZXJfZW1haWw9J2xpbnV4LWx2bUByZWRoYXQuY29tJywKKyAgICAgICB1cmw9J2h0dHA6Ly9zb3VyY2V3YXJlLm9yZy9sdm0yLycsCisgICAgICAgZXh0X21vZHVsZXM9W2xpYmx2bV0sCispCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy9saWIvbG9nLnJiIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL2xvZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc0ZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL2xvZy5yYgpAQCAtMCwwICsxLDQwIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgTWVyZWx5IHdyYXBzIHRoZSBsb2dnZXIgbGlicmFyeSB3aXRoIGEgYml0IG9mIHN0YW5kYXJkIHBvbGljeS4KK3JlcXVpcmUgJ2xvZ2dlcicKKworbW9kdWxlIExvZworICAkbG9nID0gTG9nZ2VyLm5ldyhTVERFUlIpCisKKyAgZGVmIGluaXQoaW9fKQorICAgICRsb2cgPSBMb2dnZXIubmV3KGlvXykKKyAgZW5kCitlbmQKKworZGVmIGZhdGFsKCphcmdzKQorICAkbG9nLmZhdGFsKCphcmdzKQorZW5kCisKK2RlZiBlcnJvcigqYXJncykKKyAgJGxvZy5lcnJvcigqYXJncykKK2VuZAorCitkZWYgaW5mbygqYXJncykKKyAgJGxvZy5pbmZvKCphcmdzKQorZW5kCisKK2RlZiB3YXJuaW5nKCphcmdzKQorICAkbG9nLndhcm4oKmFyZ3MpCitlbmQKKworZGVmIGRlYnVnKCphcmdzKQorICAkbG9nLmRlYnVnKCphcmdzKQorZW5kCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy9saWIvcmVwb3J0X3RlbXBsYXRlcy5yYiBiL3JlcG9ydC1nZW5lcmF0b3JzL2xpYi9yZXBvcnRfdGVtcGxhdGVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTI5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZXBvcnQtZ2VuZXJhdG9ycy9saWIvcmVwb3J0X3RlbXBsYXRlcy5yYgpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgUG9saWN5IGZvciB0aGUgbG9jYXRpb24gb2YgcmVwb3J0IHRlbXBsYXRlcworcmVxdWlyZSAnc3RyaW5nLXN0b3JlJworCitjbGFzcyBUZW1wbGF0ZVN0cmluZ1N0b3JlIDwgU3RyaW5nU3RvcmUKKyAgZGVmIGluaXRpYWxpemUoKQorICAgIHN1cGVyKFsncmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzJ10pCisgIGVuZAorZW5kCisKK21vZHVsZSBSZXBvcnRUZW1wbGF0ZXMKKyAgZGVmIGdlbmVyYXRlX3JlcG9ydChyZXBvcnQsIGJzLCBkZXN0X3BhdGggPSBuaWwpCisgICAgaW5jbHVkZSBSZXBvcnRzCisgICAgcmVwb3J0cyA9IFJlcG9ydFJlZ2lzdGVyLm5ldworICAgIHRlbXBsYXRlX3N0b3JlID0gVGVtcGxhdGVTdHJpbmdTdG9yZS5uZXcKKyAgICByZXBvcnQgPSByZXBvcnRzLmdldF9yZXBvcnQocmVwb3J0KQorICAgIGVyYiA9IEVSQi5uZXcodGVtcGxhdGVfc3RvcmUubG9va3VwKHJlcG9ydC50ZW1wbGF0ZSkpCisgICAgYm9keSA9IGVyYi5yZXN1bHQoYnMpCisgICAgdGl0bGUgPSByZXBvcnQuc2hvcnRfZGVzYworCisgICAgZXJiID0gRVJCLm5ldyh0ZW1wbGF0ZV9zdG9yZS5sb29rdXAoImJvaWxlcl9wbGF0ZS5yaHRtbCIpKQorICAgIHR4dCA9IGVyYi5yZXN1bHQoYmluZGluZykKKworICAgIGRlc3RfcGF0aCA9IGRlc3RfcGF0aC5uaWw/ID8gcmVwb3J0LnBhdGggOiBkZXN0X3BhdGgKKyAgICBkZXN0X3BhdGgub3BlbigidyIpIGRvIHxvdXR8CisgICAgICBvdXQucHV0cyB0eHQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL2xpYi9yZXBvcnRzLnJiIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL3JlcG9ydHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMGY4MwotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL2xpYi9yZXBvcnRzLnJiCkBAIC0wLDAgKzEsNTggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIHJlcG9ydHMgd2Ugc3VwcG9ydAorcmVxdWlyZSAnbG9nJworcmVxdWlyZSAncGF0aG5hbWUnCisKK21vZHVsZSBSZXBvcnRzCisgIFJlcG9ydCA9IFN0cnVjdC5uZXcoOnNob3J0X2Rlc2MsIDpkZXNjLCA6cGF0aCwgOnRlbXBsYXRlKQorCisgIGNsYXNzIFJlcG9ydFJlZ2lzdGVyCisgICAgYXR0cl9yZWFkZXIgOnJlcG9ydHMKKworICAgIHByaXZhdGUKKyAgICBkZWYgYWRkX3JlcG9ydChzeW0sICphcmdzKQorICAgICAgQHJlcG9ydHNbc3ltXSA9IFJlcG9ydC5uZXcoKmFyZ3MpCisgICAgZW5kCisKKyAgICBwdWJsaWMKKyAgICBkZWYgaW5pdGlhbGl6ZSgpCisgICAgICBAcmVwb3J0cyA9IEhhc2gubmV3CisKKyAgICAgIGFkZF9yZXBvcnQoOnVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgIlVuaXQgVGVzdHMiLAorICAgICAgICAgICAgICAgICAidW5pdCB0ZXN0cyIsCisgICAgICAgICAgICAgICAgIFBhdGhuYW1lLm5ldygicmVwb3J0cy91bml0Lmh0bWwiKSwKKyAgICAgICAgICAgICAgICAgUGF0aG5hbWUubmV3KCJ1bml0X3Rlc3Qucmh0bWwiKSkKKworICAgICAgYWRkX3JlcG9ydCg6bWVtY2hlY2ssCisgICAgICAgICAgICAgICAgICJNZW1vcnkgVGVzdHMiLAorICAgICAgICAgICAgICAgICAidW5pdCB0ZXN0cyB3aXRoIHZhbGdyaW5kIG1lbW9yeSBjaGVja2luZyIsCisgICAgICAgICAgICAgICAgIFBhdGhuYW1lLm5ldygicmVwb3J0cy9tZW1jaGVjay5odG1sIiksCisgICAgICAgICAgICAgICAgIFBhdGhuYW1lLm5ldygibWVtY2hlY2sucmh0bWwiKSkKKworICAgICAgYWRkX3JlcG9ydCg6dW5pdF9kZXRhaWwsCisgICAgICAgICAgICAgICAgICJVbml0IFRlc3QgRGV0YWlsIiwKKyAgICAgICAgICAgICAgICAgInVuaXQgdGVzdCBkZXRhaWwiLAorICAgICAgICAgICAgICAgICBQYXRobmFtZS5uZXcoInJlcG9ydHMvdW5pdF9kZXRhaWwuaHRtbCIpLCAjIEZJWE1FIHJlcGxhY2UgdGhpcyB3aXRoIGEgbGFtYmRhCisgICAgICAgICAgICAgICAgIFBhdGhuYW1lLm5ldygidW5pdF9kZXRhaWwucmh0bWwiKSkKKyAgICBlbmQKKworICAgIGRlZiBnZXRfcmVwb3J0KHN5bSkKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgInVua25vd24gcmVwb3J0ICcje3N5bX0nIiB1bmxlc3MgQHJlcG9ydHMubWVtYmVyPyhzeW0pCisgICAgICBAcmVwb3J0c1tzeW1dCisgICAgZW5kCisKKyAgICBkZWYgZWFjaCgmYmxvY2spCisgICAgICBAcmVwb3J0cy5lYWNoKCZibG9jaykKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL2xpYi9zY2hlZHVsZV9maWxlLnJiIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL3NjaGVkdWxlX2ZpbGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NWY1NwotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL2xpYi9zY2hlZHVsZV9maWxlLnJiCkBAIC0wLDAgKzEsNTYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBQYXJzZXMgdGhlIHNpbXBsZSBjb2xvbiBkZWxpbWl0ZWQgdGVzdCBzY2hlZHVsZSBmaWxlcy4KKworU2NoZWR1bGVkVGVzdCA9IFN0cnVjdC5uZXcoOmRlc2MsIDpjb21tYW5kX2xpbmUsIDpzdGF0dXMsIDpvdXRwdXQpCisKK2NsYXNzIFNjaGVkdWxlCisgIGF0dHJfcmVhZGVyIDpkaXIsIDpzY2hlZHVsZXMKKworICBkZWYgaW5pdGlhbGl6ZShkaXIsIHNzKQorICAgIEBkaXIgPSBkaXIKKyAgICBAc2NoZWR1bGVzID0gc3MKKyAgZW5kCisKKyAgZGVmIHJ1bgorICAgIERpcjo6Y2hkaXIoQGRpci50b19zKSBkbworICAgICAgQHNjaGVkdWxlcy5lYWNoIGRvIHxzfAorICAgICAgICByZWFkZXIsIHdyaXRlciA9IElPLnBpcGUKKyAgICAgICAgcHJpbnQgIiN7cy5kZXNjfSAuLi4gIgorICAgICAgICBwaWQgPSBzcGF3bihzLmNvbW1hbmRfbGluZSwgWyBTVERFUlIsIFNURE9VVCBdID0+IHdyaXRlcikKKyAgICAgICAgd3JpdGVyLmNsb3NlCisgICAgICAgIF8sIHMuc3RhdHVzID0gUHJvY2Vzczo6d2FpdHBpZDIocGlkKQorICAgICAgICBwdXRzIChzLnN0YXR1cy5zdWNjZXNzPyA/ICJwYXNzIiA6ICJmYWlsIikKKyAgICAgICAgcy5vdXRwdXQgPSByZWFkZXIucmVhZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBzZWxmLnJlYWQoZGlyLCBpbykKKyAgICBzcyA9IEFycmF5Lm5ldworCisgICAgaW8ucmVhZGxpbmVzLmVhY2ggZG8gfGxpbmV8CisgICAgICBjYXNlIGxpbmUuc3RyaXAKKyAgICAgIHdoZW4gL15cIy4qLworICAgICAgICBuZXh0CisKKyAgICAgIHdoZW4gLyhbXjpdKyk6KC4qKS8KKyAgICAgICAgc3MgPDwgU2NoZWR1bGVkVGVzdC5uZXcoJDEuc3RyaXAsICQyLnN0cmlwKQorCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImJhZGx5IGZvcm1hdHRlZCBzY2hlZHVsZSBsaW5lIgorICAgICAgZW5kICAKKyAgICBlbmQKKworICAgIFNjaGVkdWxlLm5ldyhkaXIsIHNzKQorICBlbmQKK2VuZAorCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy9saWIvc3RyaW5nLXN0b3JlLnJiIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL3N0cmluZy1zdG9yZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQyMjMxCi0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvbGliL3N0cmluZy1zdG9yZS5yYgpAQCAtMCwwICsxLDQyIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgUHJvdmlkZXMgYSBzaW1wbGUgd2F5IG9mIGFjY2Vzc2luZyB0aGUgY29udGVudHMgb2YgZmlsZXMgYnkgYSBzeW1ib2wKKyMgbmFtZS4gIFVzZWZ1bCBmb3IgZXJiIHRlbXBsYXRlcy4KKworcmVxdWlyZSAncGF0aG5hbWUnCisKK2NsYXNzIFN0cmluZ1N0b3JlCisgIGF0dHJfYWNjZXNzb3IgOnBhdGgKKworICBkZWYgaW5pdGlhbGl6ZShwKQorICAgIEBwYXRocyA9IHAubmlsPyA/IEFycmF5Lm5ldyA6IHAgIyBGSVhNRTogZG8gd2UgbmVlZCB0byBjb3B5IHAgPworICBlbmQKKworICBkZWYgbG9va3VwKHN5bSkKKyAgICBmaWxlcyA9IGV4cGFuc2lvbnMoc3ltKQorCisgICAgQHBhdGhzLmVhY2ggZG8gfHB8CisgICAgICBmaWxlcy5lYWNoIGRvIHxmfAorICAgICAgICBwbiA9IFBhdGhuYW1lLm5ldygiI3twfS8je2Z9IikKKyAgICAgICAgaWYgcG4uZmlsZT8KKyAgICAgICAgICByZXR1cm4gcG4ucmVhZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcmFpc2UgUnVudGltZUVycm9yLCAidW5rbm93biBzdHJpbmcgZW50cnk6ICN7c3ltfSIKKyAgZW5kCisKKyAgcHJpdmF0ZQorICBkZWYgZXhwYW5zaW9ucyhzeW0pCisgICAgWyIje3N5bX0iLCAiI3tzeW19LnR4dCJdCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy9tZW1jaGVjay5yYiBiL3JlcG9ydC1nZW5lcmF0b3JzL21lbWNoZWNrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2NkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9yZXBvcnQtZ2VuZXJhdG9ycy9tZW1jaGVjay5yYgpAQCAtMCwwICsxLDg2IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgUmVhZHMgdGhlIHNjaGVkdWxlIGZpbGVzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBSdW5zIHRoZW0gYW5kCisjIGdlbmVyYXRlcyB0aGUgcmVwb3J0cy4KKworIyBGSVhNRTogYSBsb3Qgb2YgZHVwbGljYXRpb24gd2l0aCB1bml0X3Rlc3QucmIKKworcmVxdWlyZSAnc2NoZWR1bGVfZmlsZScKK3JlcXVpcmUgJ3BhdGhuYW1lJworcmVxdWlyZSAncmVwb3J0cycKK3JlcXVpcmUgJ2VyYicKK3JlcXVpcmUgJ3JlcG9ydF90ZW1wbGF0ZXMnCisKK2luY2x1ZGUgUmVwb3J0VGVtcGxhdGVzCisKK3NjaGVkdWxlcyA9IEFSR1YubWFwIGRvIHxmfAorICBwID0gUGF0aG5hbWUubmV3KGYpCisgIFNjaGVkdWxlLnJlYWQocC5kaXJuYW1lLCBwKQorZW5kCisKK3RvdGFsX3Bhc3NlZCA9IDAKK3RvdGFsX2ZhaWxlZCA9IDAKKworIyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbHZtIHNoYXJlZCBsaWJzIGFyZSBpbiB0aGUgTERfTElCUkFSWV9QQVRICitFTlZbJ0xEX0xJQlJBUllfUEFUSCddID0gYHB3ZGAuc3RyaXAgKyAiL2xpYmRtOiIgKyAoRU5WWydMRF9MSUJSQVJZX1BBVEgnXSB8fCAnJykKKworRU5WWydURVNUX1RPT0wnXSA9ICJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCAtLXNob3ctcmVhY2hhYmxlPXllcyIKKworc2NoZWR1bGVzLmVhY2ggZG8gfHN8CisgIHMucnVuCisKKyAgcy5zY2hlZHVsZXMuZWFjaCBkbyB8dHwKKyAgICBpZiB0LnN0YXR1cy5zdWNjZXNzPworICAgICAgdG90YWxfcGFzc2VkICs9IDEKKyAgICBlbHNlCisgICAgICB0b3RhbF9mYWlsZWQgKz0gMQorICAgIGVuZAorICBlbmQKK2VuZAorCitkZWYgbWFuZ2xlKHR4dCkKKyAgdHh0LmdzdWIoL1xzKy8sICdfJykKK2VuZAorCitNZW1jaGVja1N0YXRzID0gU3RydWN0Lm5ldyg6ZGVmaW5pdGVseV9sb3N0LCA6aW5kaXJlY3RseV9sb3N0LCA6cG9zc2libHlfbG9zdCwgOnJlYWNoYWJsZSkKKworZGVmIGZvcm1hdChieXRlcywgYmxvY2tzKQorICAiI3tieXRlc30gYnl0ZXMsICN7YmxvY2tzfSBibG9ja3MiCitlbmQKKworIyBFeGFtaW5lcyB0aGUgb3V0cHV0IGZvciBkZXRhaWxzIG9mIGxlYWtzCitkZWYgZXh0cmFjdF9zdGF0cyh0KQorICBkID0gaSA9IHAgPSByID0gJy0nCisKKyAgdC5vdXRwdXQuc3BsaXQoIlxuIikuZWFjaCBkbyB8bHwKKyAgICBjYXNlIGwKKyAgICB3aGVuIC89PVxkKz09ICAgIGRlZmluaXRlbHkgbG9zdDogKFswLTksXSspIGJ5dGVzIGluIChbMC05LF0rKSBibG9ja3MvCisgICAgICAgIGQgPSBmb3JtYXQoJDEsICQyKQorICAgIHdoZW4gLz09XGQrPT0gICAgaW5kaXJlY3RseSBsb3N0OiAoWzAtOSxdKykgYnl0ZXMgaW4gKFswLTksXSspIGJsb2Nrcy8KKyAgICAgICAgaSA9IGZvcm1hdCgkMSwgJDIpCisgICAgd2hlbiAvPT1cZCs9PSAgICBwb3NzaWJseSBsb3N0OiAoWzAtOSxdKykgYnl0ZXMgaW4gKFswLTksXSspIGJsb2Nrcy8KKyAgICAgICAgcCA9IGZvcm1hdCgkMSwgJDIpCisgICAgd2hlbiAvPT1cZCs9PSAgICBzdGlsbCByZWFjaGFibGU6IChbMC05LF0rKSBieXRlcyBpbiAoWzAtOSxdKykgYmxvY2tzLworICAgICAgICByID0gZm9ybWF0KCQxLCAkMikKKyAgICBlbmQKKyAgZW5kCisKKyAgTWVtY2hlY2tTdGF0cy5uZXcoZCwgaSwgcCwgcikKK2VuZAorCitnZW5lcmF0ZV9yZXBvcnQoOm1lbWNoZWNrLCBiaW5kaW5nKQorCisjIG5vdyB3ZSBnZW5lcmF0ZSBhIGRldGFpbCByZXBvcnQgZm9yIGVhY2ggc2NoZWR1bGUKK3NjaGVkdWxlcy5lYWNoIGRvIHxzfAorICBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fAorICAgIGdlbmVyYXRlX3JlcG9ydCg6dW5pdF9kZXRhaWwsIGJpbmRpbmcsIFBhdGhuYW1lLm5ldygicmVwb3J0cy9tZW1jaGVja18je21hbmdsZSh0LmRlc2MpfS5odG1sIikpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy90ZW1wbGF0ZXMvYm9pbGVyX3BsYXRlLnJodG1sIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL2JvaWxlcl9wbGF0ZS5yaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YwMWNiCi0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL2JvaWxlcl9wbGF0ZS5yaHRtbApAQCAtMCwwICsxLDI1IEBACis8aHRtbD4KKzxoZWFkPgorPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVMtQVNDSUkiPgorPHRpdGxlPjwlPSB0aXRsZSAlPjwvdGl0bGU+Cis8bGluayB0aXRsZT0iU3R5bGUiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlc2hlZXQuY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJiYW5uZXIiPgorPGgyPjwlPSB0aXRsZSAlPjwvaDI+Cis8L2Rpdj4KKzxkaXYgaWQ9Im1haW4iPgorICA8ZGl2IGlkPSJjb250cm9scyI+CisgICAgPHRhYmxlPgorICAgICAgPHRyPjx0ZD48YSBocmVmPSJpbmRleC5odG1sIj5HZW5lcmF0aW9uIHRpbWVzPC9hPjwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGEgaHJlZj0idW5pdC5odG1sIj5Vbml0IHRlc3RzPC9hPjwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGEgaHJlZj0ibWVtY2hlY2suaHRtbCI+TWVtb3J5IHRlc3RzPC9hPjwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICA8L2Rpdj4KKworICA8ZGl2IGlkPSJib2R5Ij4KKyAgICA8JT0gYm9keSAlPgorICA8L2Rpdj4KKzwvZGl2PgorPC9ib2R5PgpkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL2luZGV4LnJodG1sIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL2luZGV4LnJodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzIwODEKLS0tIC9kZXYvbnVsbAorKysgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZW1wbGF0ZXMvaW5kZXgucmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBjbGFzcz0ic3RyaXBlcyI+Cis8dHI+PHRoPlJlcG9ydDwvdGg+PHRoPkdlbmVyYXRpb24gdGltZTwvdGg+PC90cj4KKzwlIFs6dW5pdF90ZXN0LCA6bWVtY2hlY2tdLmVhY2ggZG8gfHN5bXwgJT4KKzwlIHIgPSByZXBvcnRzLmdldF9yZXBvcnQoc3ltKSAlPgorPHRyPgorICA8dGQ+CisgICAgPCUgaWYgci5wYXRoLmZpbGU/ICU+CisgICAgPGEgaHJlZj0iPCU9IHIucGF0aC50b19zLmdzdWIoL15yZXBvcnRzXC8vLCAnJykgJT4iPjwlPSByLnNob3J0X2Rlc2MgJT48L2E+CisgICAgPCUgZWxzZSAlPgorICAgIDwlPSByLnNob3J0X2Rlc2MgJT4KKyAgICA8JSBlbmQgJT4KKyAgPC90ZD4KKyAgPHRkPjwlPSBzYWZlX210aW1lKHIpICU+PC90ZD4KKzwvdHI+Cis8JSBlbmQgJT4KKzwvdGFibGU+CisKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy9tZW1jaGVjay5yaHRtbCBiL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy9tZW1jaGVjay5yaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg3MmVkCi0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL21lbWNoZWNrLnJodG1sCkBAIC0wLDAgKzEsMzAgQEAKKzx0YWJsZSB3aWR0aD0iOTUlIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgY2xhc3M9InN0cmlwZXMiPgorICA8dHI+PHRoPlRlc3RzIHBhc3NlZDwvdGg+PHRoPlRlc3RzIGZhaWxlZDwvdGg+PC90cj4KKyAgPHRyPjx0ZCBjbGFzcz0icGFzcyI+PCU9IHRvdGFsX3Bhc3NlZCAlPjwvdGQ+PHRkIDwlPSB0b3RhbF9mYWlsZWQgPT0gMCA/ICIiIDogImNsYXNzPVwiZmFpbFwiIiU+PjwlPSB0b3RhbF9mYWlsZWQgJT48L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8JSBzY2hlZHVsZXMuZWFjaCBkbyB8c3wgJT4KKzxoMz48JT0gcy5kaXIuc3ViKCcuL3VuaXQtdGVzdHMvJywgJycpICU+PC9oMz4KKzx0YWJsZSB3aWR0aD0iOTUlIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgY2xhc3M9InN0cmlwZXMiPgorPHRyPjx0aD5UZXN0PC90aD48dGg+UmVzdWx0PC90aD48dGg+RGVmaW5pdGVseSBsb3N0PC90aD48dGg+aW5kaXJlY3RseSBsb3N0PC90aD48dGg+cG9zc2libHkgbG9zdDwvdGg+PHRoPnN0aWxsIHJlYWNoYWJsZTwvdGg+PHRyPgorCis8JSBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fCAlPgorPHRyPgorICA8dGQ+CisgIDxhIGhyZWY9Im1lbWNoZWNrXzwlPSBtYW5nbGUodC5kZXNjKSAlPi5odG1sIj48JT0gdC5kZXNjICU+PC9hPgorICA8L3RkPgorICA8JSBpZiB0LnN0YXR1cy5zdWNjZXNzPyAlPgorICA8dGQgY2xhc3M9InBhc3MiPnBhc3M8L3RkPgorICA8JSBlbHNlICU+CisgIDx0ZCBjbGFzcz0iZmFpbCI+ZmFpbDwvdGQ+CisgIDwlIGVuZCAlPgorIAorICA8JSBzdGF0cyA9IGV4dHJhY3Rfc3RhdHModCkgJT4KKyAgPHRkPjwlPSBzdGF0cy5kZWZpbml0ZWx5X2xvc3QgJT48L3RkPgorICA8dGQ+PCU9IHN0YXRzLmluZGlyZWN0bHlfbG9zdCAlPjwvdGQ+CisgIDx0ZD48JT0gc3RhdHMucG9zc2libHlfbG9zdCAlPjwvdGQ+CisgIDx0ZD48JT0gc3RhdHMucmVhY2hhYmxlICU+PC90ZD4KKzwvdHI+Cis8JSBlbmQgJT4KKzwvdGFibGU+Cis8JSBlbmQgJT4KZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy91bml0X2RldGFpbC5yaHRtbCBiL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy91bml0X2RldGFpbC5yaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI0ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL3VuaXRfZGV0YWlsLnJodG1sCkBAIC0wLDAgKzEsMzcgQEAKKzx0YWJsZSB3aWR0aD0iOTUlIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgY2xhc3M9InN0cmlwZXMiPgorPHRyPjx0aD5UZXN0PC90aD48dGg+UmVzdWx0PC90aD48L3RyPgorPHRyPgorICA8dGQ+CisgIDwlPSB0LmRlc2MgJT4KKyAgPC90ZD4KKyAgPCUgaWYgdC5zdGF0dXMuc3VjY2Vzcz8gJT4KKyAgPHRkIGNsYXNzPSJwYXNzIj5wYXNzPC90ZD4KKyAgPCUgZWxzZSAlPgorICA8dGQgY2xhc3M9ImZhaWwiPmZhaWw8L3RkPgorICA8JSBlbmQgJT4KKzwvdHI+Cis8L3RhYmxlPgorCis8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIGNsYXNzPSJzdHJpcGVzIj4KKzx0cj48dGg+Q29tbWFuZCBsaW5lPC90aD48L3RyPgorPHRyPgorICA8dGQ+CisgIDxwcmU+Cis8JT0gdC5jb21tYW5kX2xpbmUgJT4KKyAgPC9wcmU+CisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworCis8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIGNsYXNzPSJzdHJpcGVzIj4KKzx0cj48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPgorICA8dGQ+CisgIDxwcmU+Cis8JT0gdC5vdXRwdXQgJT4KKyAgPC9wcmU+CisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKwpkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGVtcGxhdGVzL3VuaXRfdGVzdC5yaHRtbCBiL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy91bml0X3Rlc3Qucmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzN2FiZAotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL3RlbXBsYXRlcy91bml0X3Rlc3Qucmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBjbGFzcz0ic3RyaXBlcyI+CisgIDx0cj48dGg+VGVzdHMgcGFzc2VkPC90aD48dGg+VGVzdHMgZmFpbGVkPC90aD48L3RyPgorICA8dHI+PHRkIGNsYXNzPSJwYXNzIj48JT0gdG90YWxfcGFzc2VkICU+PC90ZD48dGQgPCU9IHRvdGFsX2ZhaWxlZCA9PSAwID8gIiIgOiAiY2xhc3M9XCJmYWlsXCIiJT4+PCU9IHRvdGFsX2ZhaWxlZCAlPjwvdGQ+PC90cj4KKzwvdGFibGU+CisKKzwlIHNjaGVkdWxlcy5lYWNoIGRvIHxzfCAlPgorPGgzPjwlPSBzLmRpci5zdWIoJy4vdW5pdC10ZXN0cy8nLCAnJykgJT48L2gzPgorPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBjbGFzcz0ic3RyaXBlcyI+Cis8dHI+PHRoPlRlc3Q8L3RoPjx0aD5SZXN1bHQ8L3RoPjwvdHI+Cis8JSBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fCAlPgorPHRyPgorICA8dGQ+CisgIDxhIGhyZWY9ImRldGFpbF88JT0gbWFuZ2xlKHQuZGVzYykgJT4uaHRtbCI+PCU9IHQuZGVzYyAlPjwvYT4KKyAgPC90ZD4KKyAgPCUgaWYgdC5zdGF0dXMuc3VjY2Vzcz8gJT4KKyAgPHRkIGNsYXNzPSJwYXNzIj5wYXNzPC90ZD4KKyAgPCUgZWxzZSAlPgorICA8dGQgY2xhc3M9ImZhaWwiPmZhaWw8L3RkPgorICA8JSBlbmQgJT4KKzwvdHI+Cis8JSBlbmQgJT4KKzwvdGFibGU+Cis8JSBlbmQgJT4KZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvZXhhbXBsZS5zY2hlZHVsZSBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvZXhhbXBsZS5zY2hlZHVsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjE3MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC9leGFtcGxlLnNjaGVkdWxlCkBAIC0wLDAgKzEsNCBAQAorIyBUaGlzIGlzIGEgY29tbWVudAorZGVzY3JpcHRpb24gbnVtYmVyIDE6JFRFU1RfVE9PTCBscworZm9vIGJhcjogICAkVEVTVF9UT09MIGR1IC1ocyAuCisgICAJdGhpcyBjb21tZW50IGlzIHByZWZpeGVkIHdpdGggd2hpdGVzcGFjZTogJFRFU1RfVE9PTCBkYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC9zdHJpbmdzL21vcmVfc3RyaW5ncy90ZXN0My50eHQgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3N0cmluZ3MvbW9yZV9zdHJpbmdzL3Rlc3QzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlmZmUwCi0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC9zdHJpbmdzL21vcmVfc3RyaW5ncy90ZXN0My50eHQKQEAgLTAsMCArMSBAQAorbG9yZW0KZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3Qvc3RyaW5ncy90ZXN0MS50eHQgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3N0cmluZ3MvdGVzdDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3N0cmluZ3MvdGVzdDEudHh0CkBAIC0wLDAgKzEgQEAKK0hlbGxvLCB3b3JsZCEKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3Qvc3RyaW5ncy90ZXN0MiBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3Qvc3RyaW5ncy90ZXN0MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ1NWJmCi0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC9zdHJpbmdzL3Rlc3QyCkBAIC0wLDAgKzEsMyBAQAorb25lCit0d28KK3RocmVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC90Y19sb2cucmIgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3RjX2xvZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQzMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC90Y19sb2cucmIKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCityZXF1aXJlICd0ZXN0L3VuaXQnCityZXF1aXJlICdzdHJpbmdpbycKK3JlcXVpcmUgJ2xvZycKKworY2xhc3MgVGVzdExvZyA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGluY2x1ZGUgTG9nCisKKyAgcHJpdmF0ZQorICBkZWYgcmVtb3ZlX3RpbWVzdGFtcHMobCkKKyAgICBsLmdzdWIoL1xbW15cXV0qXF0vLCAnJykKKyAgZW5kCisKKyAgcHVibGljCisgIGRlZiB0ZXN0X2xvZworICAgIFN0cmluZ0lPLm9wZW4gZG8gfG91dHwKKyAgICAgIGluaXQob3V0KQorCisgICAgICBpbmZvKCJtc2cxIikKKyAgICAgIHdhcm5pbmcoIm1zZzIiKQorICAgICAgZGVidWcoIm1zZzMiKQorCisgICAgICBhc3NlcnRfZXF1YWwoIkksICAgSU5GTyAtLSA6IG1zZzFcblcsICAgV0FSTiAtLSA6IG1zZzJcbkQsICBERUJVRyAtLSA6IG1zZzNcbiIsCisgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3RpbWVzdGFtcHMob3V0LnN0cmluZykpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3RjX3NjaGVkdWxlX2ZpbGUucmIgYi9yZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3RjX3NjaGVkdWxlX2ZpbGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmOWVjMwotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvdGNfc2NoZWR1bGVfZmlsZS5yYgpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3JlcXVpcmUgJ3Rlc3QvdW5pdCcKK3JlcXVpcmUgJ3BhdGhuYW1lJworcmVxdWlyZSAnc2NoZWR1bGVfZmlsZScKKworY2xhc3MgVGVzdFNjaGVkdWxlRmlsZSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGRlZiB0ZXN0X3JlYWRpbmcKKyAgICBwID0gUGF0aG5hbWUubmV3KCJyZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L2V4YW1wbGUuc2NoZWR1bGUiKQorICAgIHAub3BlbiBkbyB8ZnwKKyAgICAgIHMgPSBTY2hlZHVsZS5yZWFkKHAuZGlybmFtZSwgZikKKworICAgICAgYXNzZXJ0X2VxdWFsKDMsIHMuc2NoZWR1bGVzLnNpemUpCisgICAgICBhc3NlcnRfZXF1YWwocy5zY2hlZHVsZXNbMl0uZGVzYywgInRoaXMgY29tbWVudCBpcyBwcmVmaXhlZCB3aXRoIHdoaXRlc3BhY2UiKQorICAgICAgYXNzZXJ0X2VxdWFsKHMuc2NoZWR1bGVzWzBdLmNvbW1hbmRfbGluZSwgIiRURVNUX1RPT0wgbHMiKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9ydW5uaW5nCisgICAgcCA9IFBhdGhuYW1lLm5ldygicmVwb3J0LWdlbmVyYXRvcnMvdGVzdC9leGFtcGxlLnNjaGVkdWxlIikKKyAgICBwLm9wZW4gZG8gfGZ8CisgICAgICBzID0gU2NoZWR1bGUucmVhZChwLmRpcm5hbWUsIGYpCisgICAgICBzLnJ1bgorCisgICAgICBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fAorICAgICAgICBhc3NlcnQodC5zdGF0dXMuc3VjY2Vzcz8pCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvdGNfc3RyaW5nX3N0b3JlLnJiIGIvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC90Y19zdHJpbmdfc3RvcmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTBhOAotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvdGNfc3RyaW5nX3N0b3JlLnJiCkBAIC0wLDAgKzEsMjkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworcmVxdWlyZSAnc3RyaW5nLXN0b3JlJworcmVxdWlyZSAndGVzdC91bml0JworCitjbGFzcyBUZXN0U3RyaW5nU3RvcmUgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgc2V0dXAKKyAgICBAc3MgPSBTdHJpbmdTdG9yZS5uZXcoWydyZXBvcnQtZ2VuZXJhdG9ycy90ZXN0L3N0cmluZ3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3Qvc3RyaW5ncy9tb3JlX3N0cmluZ3MnXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG9va3VwCisgICAgYXNzZXJ0X2VxdWFsKCJIZWxsbywgd29ybGQhXG4iLCBAc3MubG9va3VwKDp0ZXN0MSkpCisgICAgYXNzZXJ0X2VxdWFsKCJvbmVcbnR3b1xudGhyZWUiLCBAc3MubG9va3VwKDp0ZXN0MikpCisgICAgYXNzZXJ0X2VxdWFsKCJsb3JlbVxuIiwgQHNzLmxvb2t1cCg6dGVzdDMpKQorCisgICAgYXNzZXJ0X3JhaXNlcyhSdW50aW1lRXJyb3IpIGRvCisgICAgICBAc3MubG9va3VwKDp1bmxpa2VseV9uYW1lKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGVzdC90cy5yYiBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvdHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwMTc4MAotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL3Rlc3QvdHMucmIKQEAgLTAsMCArMSwxMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCityZXF1aXJlICd0Y19sb2cnCityZXF1aXJlICd0Y19zdHJpbmdfc3RvcmUnCityZXF1aXJlICd0Y19zY2hlZHVsZV9maWxlJwpkaWZmIC0tZ2l0IGEvcmVwb3J0LWdlbmVyYXRvcnMvdGl0bGVfcGFnZS5yYiBiL3JlcG9ydC1nZW5lcmF0b3JzL3RpdGxlX3BhZ2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNWIwMwotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydC1nZW5lcmF0b3JzL3RpdGxlX3BhZ2UucmIKQEAgLTAsMCArMSw0MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRoaXMgZ2VuZXJhdGVzIHRoZSBpbmRleCBmb3IgdGhlIHJlcG9ydHMsIGluY2x1ZGluZyBnZW5lcmF0aW9uCisjIHRpbWVzLgorCityZXF1aXJlICdsb2cnCityZXF1aXJlICdzdHJpbmctc3RvcmUnCityZXF1aXJlICdyZXBvcnRzJworcmVxdWlyZSAnZXJiJworcmVxdWlyZSAncmVwb3J0X3RlbXBsYXRlcycKKworaW5jbHVkZSBSZXBvcnRzCisKK3JlcG9ydHMgPSBSZXBvcnRSZWdpc3Rlci5uZXcKKworZGVmIHNhZmVfbXRpbWUocikKKyAgci5wYXRoLmZpbGU/ID8gci5wYXRoLm10aW1lLnRvX3MgOiAibm90IGdlbmVyYXRlZCIKK2VuZAorCit0ZW1wbGF0ZV9zdG9yZSA9IFRlbXBsYXRlU3RyaW5nU3RvcmUubmV3CisKKyMgRklYTUU6IHVzZSBnZW5lcmF0ZV9yZXBvcnQoKSBtZXRob2QKK2VyYiA9IEVSQi5uZXcodGVtcGxhdGVfc3RvcmUubG9va3VwKCJpbmRleC5yaHRtbCIpKQorYm9keSA9IGVyYi5yZXN1bHQoYmluZGluZykKK3RpdGxlID0gIkdlbmVyYXRpb24gdGltZXMiCisKK2VyYiA9IEVSQi5uZXcodGVtcGxhdGVfc3RvcmUubG9va3VwKCJib2lsZXJfcGxhdGUucmh0bWwiKSkKK3R4dCA9IGVyYi5yZXN1bHQoYmluZGluZykKKworUGF0aG5hbWUubmV3KCJyZXBvcnRzL2luZGV4Lmh0bWwiKS5vcGVuKCJ3IikgZG8gfGZ8CisgIGYucHV0cyB0eHQKK2VuZAorCisKZGlmZiAtLWdpdCBhL3JlcG9ydC1nZW5lcmF0b3JzL3VuaXRfdGVzdC5yYiBiL3JlcG9ydC1nZW5lcmF0b3JzL3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVjODk1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVwb3J0LWdlbmVyYXRvcnMvdW5pdF90ZXN0LnJiCkBAIC0wLDAgKzEsNTYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBSZWFkcyB0aGUgc2NoZWR1bGUgZmlsZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIFJ1bnMgdGhlbSBhbmQKKyMgZ2VuZXJhdGVzIHRoZSByZXBvcnRzLgorCityZXF1aXJlICdzY2hlZHVsZV9maWxlJworcmVxdWlyZSAncGF0aG5hbWUnCityZXF1aXJlICdyZXBvcnRzJworcmVxdWlyZSAnZXJiJworcmVxdWlyZSAncmVwb3J0X3RlbXBsYXRlcycKKworaW5jbHVkZSBSZXBvcnRUZW1wbGF0ZXMKKworc2NoZWR1bGVzID0gQVJHVi5tYXAgZG8gfGZ8CisgIHAgPSBQYXRobmFtZS5uZXcoZikKKyAgU2NoZWR1bGUucmVhZChwLmRpcm5hbWUsIHApCitlbmQKKwordG90YWxfcGFzc2VkID0gMAordG90YWxfZmFpbGVkID0gMAorCisjIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBsdm0gc2hhcmVkIGxpYnMgYXJlIGluIHRoZSBMRF9MSUJSQVJZX1BBVEgKK0VOVlsnTERfTElCUkFSWV9QQVRIJ10gPSBgcHdkYC5zdHJpcCArICIvbGliZG06IiArIChFTlZbJ0xEX0xJQlJBUllfUEFUSCddIHx8ICcnKQorCitzY2hlZHVsZXMuZWFjaCBkbyB8c3wKKyAgcy5ydW4KKworICBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fAorICAgIGlmIHQuc3RhdHVzLnN1Y2Nlc3M/CisgICAgICB0b3RhbF9wYXNzZWQgKz0gMQorICAgIGVsc2UKKyAgICAgIHRvdGFsX2ZhaWxlZCArPSAxCisgICAgZW5kCisgIGVuZAorZW5kCisKK2RlZiBtYW5nbGUodHh0KQorICB0eHQuZ3N1YigvXHMrLywgJ18nKQorZW5kCisKK2dlbmVyYXRlX3JlcG9ydCg6dW5pdF90ZXN0LCBiaW5kaW5nKQorCisjIG5vdyB3ZSBnZW5lcmF0ZSBhIGRldGFpbCByZXBvcnQgZm9yIGVhY2ggc2NoZWR1bGUKK3NjaGVkdWxlcy5lYWNoIGRvIHxzfAorICBzLnNjaGVkdWxlcy5lYWNoIGRvIHx0fAorICAgIGdlbmVyYXRlX3JlcG9ydCg6dW5pdF9kZXRhaWwsIGJpbmRpbmcsIFBhdGhuYW1lLm5ldygicmVwb3J0cy9kZXRhaWxfI3ttYW5nbGUodC5kZXNjKX0uaHRtbCIpKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvcmVwb3J0cy9zdHlsZXNoZWV0LmNzcyBiL3JlcG9ydHMvc3R5bGVzaGVldC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MTkyNgotLS0gL2Rldi9udWxsCisrKyBiL3JlcG9ydHMvc3R5bGVzaGVldC5jc3MKQEAgLTAsMCArMSw3NyBAQAorLyogU3R5bGVzIGZvciBtYWluIHBhZ2UgKi8KKyNiYW5uZXIgeworICBiYWNrZ3JvdW5kOiAjOWM5OworICBwYWRkaW5nLXRvcDogNXB4OworICBwYWRkaW5nLWJvdHRvbTogNXB4OworICBib3JkZXItYm90dG9tOiAycHggc29saWQ7CisgIGZvbnQ6IHNtYWxsLWNhcHMgMjBweC8yMHB4ICJUaW1lcyBOZXcgUm9tYW4iLCBzZXJpZjsKKyAgY29sb3I6ICMyODI7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworI2Jhbm5lciBpbWcgeworICBmbG9hdDogbGVmdDsKK30KKworI21haW4geworICBtYXJnaW4tbGVmdDogMGVtOworICBwYWRkaW5nLXRvcDogNGV4OworICBwYWRkaW5nLWxlZnQ6IDJlbTsKKyAgYmFja2dyb3VuZDogd2hpdGU7Cit9CisKK2gxIHsKKyAgZm9udDogIDE1MCUgc2Fucy1zZXJpZjsKKyAgY29sb3I6ICMyMjY7CisgIGJvcmRlci1ib3R0b206IDNweCBkb3R0ZWQgIzc3ZDsKK30KKworYm9keSB7CisgICAgZm9udDogbm9ybWFsIDc1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKKyAgICBjb2xvcjojMDAwMDAwOworfQorCit0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeworICBmb250LXNpemU6IDc1JTsKK30KKwordGFibGUuc3RyaXBlcyB0ciB0aCB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBiYWNrZ3JvdW5kOiAjYTBhMGEwOworfQorCit0YWJsZS5zdHJpcGVzIHRyIHRkIHsKKyAgICBiYWNrZ3JvdW5kOiAjY2NjY2MwOworfQorCit0ZC5wYXNzIHsKKyAgY29sb3I6IGdyZWVuOworfQorCit0ZC5mYWlsIHsKKyAgY29sb3I6IHJlZDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNtYWluIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDBlbTsKK30KKworI2NvbnRyb2xzIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmctdG9wOiAxZW07CisgIHBhZGRpbmctbGVmdDogMWVtOworICBwYWRkaW5nLXJpZ2h0OiAxZW07CisgIHBhZGRpbmctYm90dG9tOiAxZW07CisgIHdpZHRoOiAxNGVtOworICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZDsKK30KKworI2JvZHkgeworICBtYXJnaW4tbGVmdDogMTZlbTsKKyAgcGFkZGluZy10b3A6IDRleDsKKyAgcGFkZGluZy1sZWZ0OiAyZW07CisgIGJhY2tncm91bmQ6IHdoaXRlOworICBib3JkZXItbGVmdDogMnB4IHNvbGlkOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy8uZ2l0aWdub3JlIGIvc2NyaXB0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjY4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyNCBAQAorYmxrX2F2YWlsYWJpbGl0eV9pbml0X3JlZF9oYXQKK2Jsa19hdmFpbGFiaWxpdHlfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK2Jsa2RlYWN0aXZhdGUuc2gKK2Nsdm1kX2luaXRfcmVkX2hhdAorY21pcnJvcmRfaW5pdF9yZWRfaGF0CitkbV9ldmVudF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZQorZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldAorbHZtMl9hY3RpdmF0aW9uX2dlbmVyYXRvcl9zeXN0ZW1kX3JlZF9oYXQKK2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3JlZF9oYXQuc2gKK2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitsdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitsdm0yX2NtaXJyb3JkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitsdm0yX2x2bWV0YWRfaW5pdF9yZWRfaGF0Citsdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0Citsdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitsdm0yX2x2bWxvY2tpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UKK2x2bTJfbHZtcG9sbGRfaW5pdF9yZWRfaGF0Citsdm0yX2x2bXBvbGxkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlCitsdm0yX2x2bXBvbGxkX3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQKK2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQKK2x2bTJfbW9uaXRvcmluZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZQorbHZtMl9wdnNjYW5fc3lzdGVtZF9yZWRfaGF0QC5zZXJ2aWNlCitsdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5pbiBiL3NjcmlwdHMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3NDIzOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworaWZlcSAoIkBBUFBMSUJAIiwgInllcyIpCisJU09VUkNFUyA9IGx2bTJfYWN0aXZhdGlvbl9nZW5lcmF0b3Jfc3lzdGVtZF9yZWRfaGF0LmMKKwlUQVJHRVRTID0gbHZtMl9hY3RpdmF0aW9uX2dlbmVyYXRvcl9zeXN0ZW1kX3JlZF9oYXQKK2VuZGlmCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitpZmVxICgiQEFQUExJQkAiLCAieWVzIikKKwlERVBMSUJTICs9ICQodG9wX2J1aWxkZGlyKS9saWJsdm0vbGlibHZtMmFwcC5zbyAkKHRvcF9idWlsZGRpcikvbGliZG0vbGliZGV2bWFwcGVyLnNvCisJTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9saWJsdm0KK2lmZXEgKCJARE1FVkVOVERAIiwgInllcyIpCisJTERGTEFHUyArPSAtV2wsLXJwYXRoLWxpbmssJCh0b3BfYnVpbGRkaXIpL2RhZW1vbnMvZG1ldmVudGQKK2VuZGlmCisJTFZNTElCUyA9IEBMVk0yQVBQX0xJQkAgLWxkZXZtYXBwZXIKK2VuZGlmCisKK0xWTV9TQ1JJUFRTID0gbHZtZHVtcC5zaCBsdm1jb25mLnNoCitETV9TQ1JJUFRTID0KKworaWZlcSAoIkBGU0FETUAiLCAieWVzIikKKwlMVk1fU0NSSVBUUyArPSBmc2FkbS5zaAorZW5kaWYKKworaWZlcSAoIkBCTEtERUFDVElWQVRFQCIsICJ5ZXMiKQorCURNX1NDUklQVFMgKz0gYmxrZGVhY3RpdmF0ZS5zaAorZW5kaWYKKworT0NGX1NDUklQVFMgPQoraWZlcSAoIkBPQ0ZAIiwgInllcyIpCisgICAgICAgIE9DRl9TQ1JJUFRTICs9IFZvbHVtZUdyb3VwLm9jZgorZW5kaWYKKwordnBhdGggJS5zaCAkKHNyY2RpcikKK3ZwYXRoICUub2NmICQoc3JjZGlyKQorCislX2luc3RhbGw6ICUuc2gKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChzYmluZGlyKS8kKGJhc2VuYW1lICQoPEYpKQorCislX2luc3RhbGw6ICUub2NmCisJJChJTlNUQUxMX0RJUikgJChvY2Zfc2NyaXB0ZGlyKQorCSQoSU5TVEFMTF9TQ1JJUFQpICQ8ICQob2NmX3NjcmlwdGRpcikvJChiYXNlbmFtZSAkKDxGKSkKKworaW5zdGFsbF9sdm0yOiAkKExWTV9TQ1JJUFRTOi5zaD1faW5zdGFsbCkKK2luc3RhbGxfZGV2aWNlLW1hcHBlcjogJChETV9TQ1JJUFRTOi5zaD1faW5zdGFsbCkKKworaW5zdGFsbF9vY2Y6ICQoT0NGX1NDUklQVFM6Lm9jZj1faW5zdGFsbCkKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yIGluc3RhbGxfb2NmIGluc3RhbGxfZGV2aWNlLW1hcHBlcgorCisjIEZJWE1FIEN1c3RvbWlzZSBmb3Igb3RoZXIgZGlzdHJpYnV0aW9ucworaW5zdGFsbF9pbml0c2NyaXB0czoKKwkkKElOU1RBTExfRElSKSAkKGluaXRkaXIpCitpZmVxICgiQEJVSUxEX0RNRVZFTlREQCIsICJ5ZXMiKQorCSQoSU5TVEFMTF9TQ1JJUFQpIGx2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQgJChpbml0ZGlyKS9sdm0yLW1vbml0b3IKK2VuZGlmCitpZmVxICgiQEJVSUxEX0xWTUVUQURAIiwgInllcyIpCisJJChJTlNUQUxMX1NDUklQVCkgbHZtMl9sdm1ldGFkX2luaXRfcmVkX2hhdCAkKGluaXRkaXIpL2x2bTItbHZtZXRhZAorZW5kaWYKK2lmZXEgKCJAQlVJTERfTFZNUE9MTERAIiwgInllcyIpCisJJChJTlNUQUxMX1NDUklQVCkgbHZtMl9sdm1wb2xsZF9pbml0X3JlZF9oYXQgJChpbml0ZGlyKS9sdm0yLWx2bXBvbGxkCitlbmRpZgoraWZuZXEgKCJAQ0xWTURAIiwgIm5vbmUiKQorCSQoSU5TVEFMTF9TQ1JJUFQpIGNsdm1kX2luaXRfcmVkX2hhdCAkKGluaXRkaXIpL2Nsdm1kCitlbmRpZgoraWZlcSAoIkBCVUlMRF9DTUlSUk9SREAiLCAieWVzIikKKwkkKElOU1RBTExfU0NSSVBUKSBjbWlycm9yZF9pbml0X3JlZF9oYXQgJChpbml0ZGlyKS9jbWlycm9yZAorZW5kaWYKK2lmZXEgKCJAQkxLREVBQ1RJVkFURUAiLCAieWVzIikKKwkkKElOU1RBTExfU0NSSVBUKSBibGtfYXZhaWxhYmlsaXR5X2luaXRfcmVkX2hhdCAkKGluaXRkaXIpL2Jsay1hdmFpbGFiaWxpdHkKK2VuZGlmCisKK0NGTEFHU19sdm0yX2FjdGl2YXRpb25fZ2VuZXJhdG9yX3N5c3RlbWRfcmVkX2hhdC5vICs9ICQoRVhUUkFfRVhFQ19DRkxBR1MpCisKK2x2bTJfYWN0aXZhdGlvbl9nZW5lcmF0b3Jfc3lzdGVtZF9yZWRfaGF0OiAkKE9CSkVDVFMpICQoREVQTElCUykKKwkkKENDKSAtbyAkQCAkKE9CSkVDVFMpICQoTERGTEFHUykgJChFWFRSQV9FWEVDX0xERkxBR1MpICQoTFZNTElCUykKKworaW5zdGFsbF9zeXN0ZW1kX2dlbmVyYXRvcnM6CisJJChJTlNUQUxMX0RJUikgJChzeXN0ZW1kX2dlbmVyYXRvcl9kaXIpCitpZmVxICgiQEFQUExJQkAiLCAieWVzIikKKwkkKElOU1RBTExfUFJPR1JBTSkgbHZtMl9hY3RpdmF0aW9uX2dlbmVyYXRvcl9zeXN0ZW1kX3JlZF9oYXQgJChzeXN0ZW1kX2dlbmVyYXRvcl9kaXIpL2x2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3IKK2Vsc2UKKwlAZWNobyAiV0FSTklORzogTFZNMiBhY3RpdmF0aW9uIHN5c3RlbWQgZ2VuZXJhdG9yIG5vdCBpbnN0YWxsZWQuIiBcCisJICAgICAgIkl0IHJlcXVpcmVzIHRoZSBMVk0yIGFwcGxpY2F0aW9uIGxpYnJhcnkgdG8gYmUgYnVpbHQgYXMgd2VsbC4iCitlbmRpZgorCitpbnN0YWxsX3N5c3RlbWRfdW5pdHM6CWluc3RhbGxfZGJ1c19zZXJ2aWNlCisJJChJTlNUQUxMX0RJUikgJChzeXN0ZW1kX3VuaXRfZGlyKQoraWZlcSAoIkBCVUlMRF9ETUVWRU5UREAiLCAieWVzIikKKwkkKElOU1RBTExfREFUQSkgZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCAkKHN5c3RlbWRfdW5pdF9kaXIpL2RtLWV2ZW50LnNvY2tldAorCSQoSU5TVEFMTF9EQVRBKSBkbV9ldmVudF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSAkKHN5c3RlbWRfdW5pdF9kaXIpL2RtLWV2ZW50LnNlcnZpY2UKKwkkKElOU1RBTExfREFUQSkgbHZtMl9tb25pdG9yaW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1tb25pdG9yLnNlcnZpY2UKK2VuZGlmCitpZmVxICgiQEJMS0RFQUNUSVZBVEVAIiwgInllcyIpCisJJChJTlNUQUxMX0RBVEEpIGJsa19hdmFpbGFiaWxpdHlfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UgJChzeXN0ZW1kX3VuaXRfZGlyKS9ibGstYXZhaWxhYmlsaXR5LnNlcnZpY2UKK2VuZGlmCitpZmVxICgiQEJVSUxEX0xWTUVUQURAIiwgInllcyIpCisJJChJTlNUQUxMX0RBVEEpIGx2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0ICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1sdm1ldGFkLnNvY2tldAorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UgJChzeXN0ZW1kX3VuaXRfZGlyKS9sdm0yLWx2bWV0YWQuc2VydmljZQorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX3B2c2Nhbl9zeXN0ZW1kX3JlZF9oYXRALnNlcnZpY2UgJChzeXN0ZW1kX3VuaXRfZGlyKS9sdm0yLXB2c2NhbkAuc2VydmljZQorZW5kaWYKK2lmZXEgKCJAQlVJTERfTFZNUE9MTERAIiwgInllcyIpCisJJChJTlNUQUxMX0RBVEEpIGx2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCAkKHN5c3RlbWRfdW5pdF9kaXIpL2x2bTItbHZtcG9sbGQuc29ja2V0CisJJChJTlNUQUxMX0RBVEEpIGx2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UgJChzeXN0ZW1kX3VuaXRfZGlyKS9sdm0yLWx2bXBvbGxkLnNlcnZpY2UKK2VuZGlmCitpZmVxICgiQEJVSUxEX0xWTUxPQ0tEQCIsICJ5ZXMiKQorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1sdm1sb2NrZC5zZXJ2aWNlCisJJChJTlNUQUxMX0RBVEEpIGx2bTJfbHZtbG9ja2luZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSAkKHN5c3RlbWRfdW5pdF9kaXIpL2x2bTItbHZtbG9ja2luZy5zZXJ2aWNlCitlbmRpZgoraWZuZXEgKCJAQ0xWTURAIiwgIm5vbmUiKQorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1jbHZtZC5zZXJ2aWNlCisJJChJTlNUQUxMX0RBVEEpIGx2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1jbHVzdGVyLWFjdGl2YXRpb24uc2VydmljZQorCSQoSU5TVEFMTF9TQ1JJUFQpIGx2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3JlZF9oYXQuc2ggJChzeXN0ZW1kX2RpcikvbHZtMi1jbHVzdGVyLWFjdGl2YXRpb24KK2VuZGlmCitpZmVxICgiQEJVSUxEX0NNSVJST1JEQCIsICJ5ZXMiKQorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX2NtaXJyb3JkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlICQoc3lzdGVtZF91bml0X2RpcikvbHZtMi1jbWlycm9yZC5zZXJ2aWNlCitlbmRpZgoraWZlcSAoIkBCVUlMRF9MVk1EQlVTREAiLCAieWVzIikKKwkkKElOU1RBTExfREFUQSkgbHZtMl9sdm1kYnVzZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSAkKHN5c3RlbWRfdW5pdF9kaXIpL2x2bTItbHZtZGJ1c2Quc2VydmljZQorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1EQlVTREAiLCAieWVzIikKK2luc3RhbGxfZGJ1c19zZXJ2aWNlOgorCSQoSU5TVEFMTF9ESVIpICQoZGJ1c2NvbmZkaXIpCisJJChJTlNUQUxMX0RJUikgJChkYnVzc2VydmljZWRpcikKKwkkKElOU1RBTExfREFUQSkgJCh0b3Bfc3JjZGlyKS9zY3JpcHRzL2NvbS5yZWRoYXQubHZtZGJ1czEuY29uZiAkKGRidXNjb25mZGlyKQorCSQoSU5TVEFMTF9EQVRBKSBjb20ucmVkaGF0Lmx2bWRidXMxLnNlcnZpY2UgJChkYnVzc2VydmljZWRpcikKKworaW5zdGFsbF9zeXN0ZW1kX3VuaXRzOglpbnN0YWxsX2RidXNfc2VydmljZQorZW5kaWYKKworaW5zdGFsbF90bXBmaWxlc19jb25maWd1cmF0aW9uOgorCSQoSU5TVEFMTF9ESVIpICQodG1wZmlsZXNfZGlyKQorCSQoSU5TVEFMTF9EQVRBKSBsdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZiAkKHRtcGZpbGVzX2RpcikvbHZtMi5jb25mCisKK0RJU1RDTEVBTl9UQVJHRVRTICs9IFwKKwlibGtkZWFjdGl2YXRlLnNoIFwKKwlibGtfYXZhaWxhYmlsaXR5X2luaXRfcmVkX2hhdCBcCisJYmxrX2F2YWlsYWJpbGl0eV9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBcCisJY2x2bWRfaW5pdF9yZWRfaGF0IFwKKwljbWlycm9yZF9pbml0X3JlZF9oYXQgXAorCWNvbS5yZWRoYXQubHZtZGJ1czEuc2VydmljZSBcCisJZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UgXAorCWRtX2V2ZW50X3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQgXAorCWx2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3JlZF9oYXQuc2ggXAorCWx2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2NtaXJyb3JkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2x2bWV0YWRfaW5pdF9yZWRfaGF0IFwKKwlsdm0yX2x2bXBvbGxkX2luaXRfcmVkX2hhdCBcCisJbHZtMl9sdm1ldGFkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2x2bWV0YWRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldCBcCisJbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBcCisJbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0IFwKKwlsdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlIFwKKwlsdm0yX2x2bWxvY2tpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UgXAorCWx2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQgXAorCWx2bTJfbW9uaXRvcmluZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZSBcCisJbHZtMl9wdnNjYW5fc3lzdGVtZF9yZWRfaGF0QC5zZXJ2aWNlIFwKKwlsdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9Wb2x1bWVHcm91cC5vY2YgYi9zY3JpcHRzL1ZvbHVtZUdyb3VwLm9jZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM5NTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9Wb2x1bWVHcm91cC5vY2YKQEAgLTAsMCArMSwyNzkgQEAKKyMhL2Jpbi9zaAorIworIyBWb2x1bWVHcm91cAorIworIyBEZXNjcmlwdGlvbjoJTWFuYWdlcyBhbiBMVk0yIHZvbHVtZSBncm91cCBhcyBhbiBIQSByZXNvdXJjZSBpbgorIyAgICAgICAgICAgICAgIGFuIE9DRi1jb21wbGlhbnQgY2x1c3RlcgorIworIworIyBBdXRob3JzOglBbGFuIFJvYmVydHNvbiwgTGFycyBNYXJvd3NreS1CcmVlLCBGbG9yaWFuIEhhYXMsCisjICAgICAgICAgICAgICAgYW5kIG90aGVycyBmcm9tIHRoZSBMaW51eC1IQSBwcm9qZWN0CisjIExpY2Vuc2U6CUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisjIENvcHlyaWdodDoJKEMpIDIwMDIgLSAyMDA1IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEluYy4KKyMgICAgICAgICAgICAgICAoQykgMjAxMCBMSU5CSVQgSEEtU29sdXRpb25zIEdtYkgKKyMKKyMJVGhpcyBjb2RlIHNpZ25pZmljYW50bHkgaW5zcGlyZWQgYnkgdGhlIExWTSByZXNvdXJjZQorIwlpbiBGYWlsU2FmZSBieSBMYXJzIE1hcm93c2t5LUJyZWUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEluaXRpYWxpemF0aW9uOgorCis6ICR7T0NGX0ZVTkNUSU9OU19ESVI9JHtPQ0ZfUk9PVH0vcmVzb3VyY2UuZC9oZWFydGJlYXR9CisuICR7T0NGX0ZVTkNUSU9OU19ESVJ9Ly5vY2Ytc2hlbGxmdW5jcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK3VzYWdlKCkgeworICBtZXRob2RzPWBWb2x1bWVHcm91cF9tZXRob2RzYAorICBtZXRob2RzPWBlY2hvICRtZXRob2RzIHwgdHIgJyAnICd8J2AKKyAgY2F0IDw8RU9GCisJdXNhZ2U6ICQwICRtZXRob2RzCisKKwkkMCBtYW5hZ2VzIGFuIExWTSBWb2x1bWUgR3JvdXAgKFZHKSBhcyBhbiBIQSByZXNvdXJjZQorCisJVGhlICdzdGFydCcgb3BlcmF0aW9uIGJyaW5ncyB0aGUgZ2l2ZW4gdm9sdW1lIG9ubGluZQorCVRoZSAnc3RvcCcgb3BlcmF0aW9uIHRha2VzIHRoZSBnaXZlbiB2b2x1bWUgb2ZmbGluZQorCVRoZSAnc3RhdHVzJyBvcGVyYXRpb24gcmVwb3J0cyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlCisJVGhlICdtb25pdG9yJyBvcGVyYXRpb24gcmVwb3J0cyB3aGV0aGVyIHRoZSB2b2x1bWUgc2VlbXMgcHJlc2VudAorCVRoZSAndmFsaWRhdGUtYWxsJyBvcGVyYXRpb24gY2hlY2tzIHdoZXRoZXIgdGhlIE9DRiBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorCVRoZSAnbWV0aG9kcycgb3BlcmF0aW9uIHJlcG9ydHMgb24gdGhlIG1ldGhvZHMgJDAgc3VwcG9ydHMKKworRU9GCit9CisKK21ldGFfZGF0YSgpIHsKKwljYXQgPDxFT0YKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIHJlc291cmNlLWFnZW50IFNZU1RFTSAicmEtYXBpLTEuZHRkIj4KKzxyZXNvdXJjZS1hZ2VudCBuYW1lPSJWb2x1bWVHcm91cCI+Cis8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisKKzxsb25nZGVzYyBsYW5nPSJlbiI+CitSZXNvdXJjZSBzY3JpcHQgZm9yIGFuIExWTSBWb2x1bWUgR3JvdXAuCis8L2xvbmdkZXNjPgorPHNob3J0ZGVzYyBsYW5nPSJlbiI+Q29udHJvbHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBhbiBMVk0gVm9sdW1lIEdyb3VwPC9zaG9ydGRlc2M+CisKKzxwYXJhbWV0ZXJzPgorPHBhcmFtZXRlciBuYW1lPSJ2b2xncnBuYW1lIiB1bmlxdWU9IjAiIHJlcXVpcmVkPSIxIj4KKzxsb25nZGVzYyBsYW5nPSJlbiI+CitUaGUgbmFtZSBvZiB2b2x1bWUgZ3JvdXAuCis8L2xvbmdkZXNjPgorPHNob3J0ZGVzYyBsYW5nPSJlbiI+Vm9sdW1lIGdyb3VwIG5hbWU8L3Nob3J0ZGVzYz4KKzxjb250ZW50IHR5cGU9InN0cmluZyIgZGVmYXVsdD0iIiAvPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1c2l2ZSIgdW5pcXVlPSIwIiByZXF1aXJlZD0iMCI+Cis8bG9uZ2Rlc2MgbGFuZz0iZW4iPgorSWYgc2V0LCB0aGUgdm9sdW1lIGdyb3VwIHdpbGwgYmUgYWN0aXZhdGVkIGV4Y2x1c2l2ZWx5LgorPC9sb25nZGVzYz4KKzxzaG9ydGRlc2MgbGFuZz0iZW4iPkV4Y2x1c2l2ZSBhY3RpdmF0aW9uPC9zaG9ydGRlc2M+Cis8Y29udGVudCB0eXBlPSJib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KKzwvcGFyYW1ldGVyPgorPC9wYXJhbWV0ZXJzPgorCis8YWN0aW9ucz4KKzxhY3Rpb24gbmFtZT0ic3RhcnQiIHRpbWVvdXQ9IjMwIiAvPgorPGFjdGlvbiBuYW1lPSJzdG9wIiB0aW1lb3V0PSIzMCIgLz4KKzxhY3Rpb24gbmFtZT0ic3RhdHVzIiB0aW1lb3V0PSIzMCIgLz4KKzxhY3Rpb24gbmFtZT0ibW9uaXRvciIgZGVwdGg9IjAiIHRpbWVvdXQ9IjMwIiBpbnRlcnZhbD0iMTAiIC8+Cis8YWN0aW9uIG5hbWU9Im1ldGhvZHMiIHRpbWVvdXQ9IjUiIC8+Cis8YWN0aW9uIG5hbWU9Im1ldGEtZGF0YSIgdGltZW91dD0iNSIgLz4KKzxhY3Rpb24gbmFtZT0idmFsaWRhdGUtYWxsIiB0aW1lb3V0PSI1IiAvPgorPC9hY3Rpb25zPgorPC9yZXNvdXJjZS1hZ2VudD4KK0VPRgorfQorCisjCisjIG1ldGhvZHM6IFdoYXQgbWV0aG9kcy9vcGVyYXRpb25zIGRvIHdlIHN1cHBvcnQ/CisjCitWb2x1bWVHcm91cF9tZXRob2RzKCkgeworICBjYXQgPDxFT0YKKwlzdGFydAorCXN0b3AKKwlzdGF0dXMKKwltb25pdG9yCisJbWV0aG9kcworCXZhbGlkYXRlLWFsbAorCXVzYWdlCitFT0YKK30KKworIworIyBSZXBvcnQgb24gTFZNIHZvbHVtZSBzdGF0dXMuIFZHIG1heSBiZSByZXBvcnRlZCBhcyBhY3RpdmUKKyMgKCRPQ0ZfU1VDQ0VTUykgb3IgaW5hY3RpdmUgKCRPQ0ZfTk9UX1JVTk5JTkcpCisjCitWb2x1bWVHcm91cF9zdGF0dXMoKSB7CisKKyAgICBWR09VVD1gdmdkaXNwbGF5IC12ICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUgMj4mMWAgfHwgZXhpdCAkT0NGX0VSUl9HRU5FUklDCisgICAgZWNobyAiJFZHT1VUIiB8IGdyZXAgLWkgJ1N0YXR1c1sgXHRdKmF2YWlsYWJsZScgPi9kZXYvbnVsbAorICAgIHJjPSQ/CisKKyAgICBpZiBbICRyYyAtZXEgMCBdOyB0aGVuCisJb2NmX2xvZyBkZWJ1ZyAiTFZNIFZvbHVtZSBHcm91cCAkT0NGX1JFU0tFWV92b2xncnBuYW1lIGlzIGF2YWlsYWJsZSAoc3RhcnRlZCkiCisgICAgZWxzZQorCW9jZl9sb2cgZGVidWcgIkxWTSBWb2x1bWUgR3JvdXAgJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSBpcyBub3QgYXZhaWxhYmxlIChzdG9wcGVkKSIKKwlyZXR1cm4gJE9DRl9OT1RfUlVOTklORworICAgIGZpCisKKyAgICBpZiBlY2hvICIkVkdPVVQiIHwgZ3JlcCAtaSAnQWNjZXNzLipyZWFkL3dyaXRlJyA+L2Rldi9udWxsOyB0aGVuCisJb2NmX2xvZyBkZWJ1ZyAiVm9sdW1lICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUgaXMgYXZhaWxhYmxlIHJlYWQvd3JpdGUgKHJ1bm5pbmcpIgorICAgIGVsc2UKKwlvY2ZfbG9nIGRlYnVnICJWb2x1bWUgJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSBpcyBhdmFpbGFibGUgcmVhZC1vbmx5IChydW5uaW5nKSIKKyAgICBmaQorCisgICAgcmV0dXJuICRPQ0ZfU1VDQ0VTUworfQorCisjCisjIE1vbml0b3IgdGhlIHZvbHVtZSAtIGRvZXMgaXQgcmVhbGx5IHNlZW0gdG8gYmUgd29ya2luZz8gTWF5IHJlcG9ydAorIyAkT0NGX1NVQ0NFU1Mgb3IgJE9DRl9OT1RfUlVOTklORyBsaWtlIFZvbHVtZUdyb3VwX3N0YXR1cywgcGx1cworIyAkT0NGX0VSUl9HRU5FUklDIGluIGNhc2UgdmdjayByZXBvcnRzIGFuIGVycm9yLgorIworVm9sdW1lR3JvdXBfbW9uaXRvcigpIHsKKyAgICBpZiAhIFZvbHVtZUdyb3VwX3N0YXR1cyAkT0NGX1JFU0tFWV92b2xncnBuYW1lOyB0aGVuCisJb2NmX2xvZyBpbmZvICJMVk0gVm9sdW1lIEdyb3VwICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUgaXMgb2ZmbGluZSIKKwlyZXR1cm4gJE9DRl9OT1RfUlVOTklORworICAgIGZpCisKKyAgICBvY2ZfcnVuIHZnY2sgJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSB8fCBleGl0ICRPQ0ZfRVJSX0dFTkVSSUMKKworICAgIHJldHVybiAkT0NGX1NVQ0NFU1MKK30KKworIworIyBBY3RpdmF0ZSB0aGUgdm9sdW1lIGdyb3VwLCBlaXRoZXIgbG9jYWxseSAoaWYgJE9DRl9SRVNLRVlfZXhjbHVzaXZlCisjIGlzIGZhbHNlIG9yIHVuc2V0KSwgb3IgZXhjbHVzaXZlbHkgKGlmICRPQ0ZfUkVTS0VZX2V4Y2x1c2l2ZSBpcworIyB0cnVlKS4KKyMgRWl0aGVyIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCBvciBleGl0cyB3aXRoICRPQ0ZfRVJSX0dFTkVSSUMuCisjCitWb2x1bWVHcm91cF9zdGFydCgpIHsKKworICBvY2ZfbG9nIGluZm8gIkFjdGl2YXRpbmcgdm9sdW1lIGdyb3VwICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUiCisgIG9jZl9ydW4gdmdzY2FuCisKKyAgbG9jYWwgYWN0aXZlX21vZGUKKyAgYWN0aXZlX21vZGU9Imx5IgorICBpZiBvY2ZfaXNfdHJ1ZSAiJE9DRl9SRVNLRVlfZXhjbHVzaXZlIiA7IHRoZW4KKyAgICAgIGFjdGl2ZV9tb2RlPSJleSIKKyAgZmkKKworICBvY2ZfcnVuIHZnY2hhbmdlIC1hICRhY3RpdmVfbW9kZSAkT0NGX1JFU0tFWV92b2xncnBuYW1lIHx8IGV4aXQgJE9DRl9FUlJfR0VORVJJQworCisgIGlmICEgVm9sdW1lR3JvdXBfc3RhdHVzICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWU7IHRoZW4KKyAgICBvY2ZfbG9nIGVyciAiTFZNOiAkT0NGX1JFU0tFWV92b2xncnBuYW1lIGRpZCBub3QgYWN0aXZhdGUgY29ycmVjdGx5IgorICAgIGV4aXQgJE9DRl9FUlJfR0VORVJJQworICBmaQorCisgIHJldHVybiAkT0NGX1NVQ0NFU1MKK30KKworIworIyBEZWFjdGl2YXRlIHRoZSB2b2x1bWUgZ3JvdXAuCisjIEVpdGhlciByZXR1cm5zIHN1Y2Nlc3NmdWxseSwgb3IgZXhpdHMgd2l0aCAkT0NGX0VSUl9HRU5FUklDLgorIworVm9sdW1lR3JvdXBfc3RvcCgpIHsKKyAgICBpZiAhIFZvbHVtZUdyb3VwX3N0YXR1czsgdGhlbgorCW9jZl9sb2cgZGVidWcgIlZvbHVtZSBHcm91cCAkT0NGX1JFU0tFWV92b2xncnBuYW1lIGFscmVhZHkgc3RvcHBlZCIKKwlyZXR1cm4gJE9DRl9TVUNDRVNTCisgICAgZmkKKworICAgIG9jZl9sb2cgaW5mbyAiRGVhY3RpdmF0aW5nIHZvbHVtZSBncm91cCAkT0NGX1JFU0tFWV92b2xncnBuYW1lIgorICAgIG9jZl9ydW4gdmdjaGFuZ2UgLWEgbG4gJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSB8fCBleGl0ICRPQ0ZfRVJSX0dFTkVSSUMKKworICAgIGlmIFZvbHVtZUdyb3VwX3N0YXR1czsgdGhlbgorCW9jZl9sb2cgZXJyICJMVk06ICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUgZGlkIG5vdCBzdG9wIGNvcnJlY3RseSIKKwlleGl0ICRPQ0ZfRVJSX0dFTkVSSUMKKyAgICBmaQorCisgICAgcmV0dXJuICRPQ0ZfU1VDQ0VTUworfQorCisjCisjIENoZWNrIHdoZXRoZXIgdGhlIE9DRiBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSB2YWxpZC4KKyMgRWl0aGVyIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCBvciBleGl0cyB3aXRoCisjICRPQ0ZfRVJSX0NPTkZJR1VSRUQgaWYgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgbWlzc2luZzsKKyMgJE9DRl9FUlJfSU5TVEFMTEVEIGlmIHJlcXVpcmVkIGJpbmFyaWVzIGFyZSBtaXNzaW5nOworIyAkT0NGX0VSUl9HRU5FUklDIGluIGNhc2Ugb2YgYW55IG90aGVyIGVycm9yLgorIworVm9sdW1lR3JvdXBfdmFsaWRhdGVfYWxsKCkgeworCisgICAgaWYgWyAteiAkT0NGX1JFU0tFWV92b2xncnBuYW1lIF07IHRoZW4KKwlvY2ZfbG9nIGVyciAnTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgInZvbGdycG5hbWUiIScKKwlleGl0ICRPQ0ZfRVJSX0NPTkZJR1VSRUQKKyAgICBmaQorCisgICAgY2hlY2tfYmluYXJ5IHZnY2hhbmdlCisgICAgY2hlY2tfYmluYXJ5IHZnY2sKKyAgICBjaGVja19iaW5hcnkgdmdkaXNwbGF5CisKKyAgICAjIFJ1biB0aGUgZm9sbG93aW5nIHRlc3RzIG9ubHkgaWYgd2UncmUgbm90IGludm9rZWQgYnkgYSBwcm9iZQorICAgICMgb3BlcmF0aW9uCisgICAgaWYgISBvY2ZfaXNfcHJvYmU7IHRoZW4KKyAgICAgICAgIyBPZmYtdGhlLXNoZWxmIHRlc3RzLi4uCisJdmdjayAiJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSIgPi9kZXYvbnVsbCAyPiYxCisJaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJICAgIG9jZl9sb2cgZXJyICJWb2x1bWUgZ3JvdXAgJE9DRl9SRVNLRVlfdm9sZ3JwbmFtZSBkb2VzIG5vdCBleGlzdCBvciBjb250YWlucyBlcnJvciEiCisJICAgIGV4aXQgJE9DRl9FUlJfR0VORVJJQworCWZpCisKKyAgICAgICAgIyBEb3VibGUtY2hlY2sKKwl2Z2Rpc3BsYXkgLXYgIiRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUiID4vZGV2L251bGwgMj4mMQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCSAgICBvY2ZfbG9nIGVyciAiVm9sdW1lIGdyb3VwICRPQ0ZfUkVTS0VZX3ZvbGdycG5hbWUgZG9lcyBub3QgZXhpc3Qgb3IgY29udGFpbnMgZXJyb3IhIgorCSAgICBleGl0ICRPQ0ZfRVJSX0dFTkVSSUMKKwlmaQorICAgIGZpCisKKyAgICByZXR1cm4gJE9DRl9TVUNDRVNTCit9CisKKyMKKyMgJ21haW4nIHN0YXJ0cyBoZXJlLi4uCisjCitpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICB1c2FnZQorICAgIGV4aXQgJE9DRl9FUlJfQVJHUworZmkKKworY2FzZSAkMSBpbgorICBtZXRhLWRhdGEpCW1ldGFfZGF0YQorCQlleGl0ICRPQ0ZfU1VDQ0VTUzs7CisKKyAgbWV0aG9kcykJVm9sdW1lR3JvdXBfbWV0aG9kcworCQlleGl0ICRPQ0ZfU1VDQ0VTUzs7CisKKyAgdXNhZ2UpCXVzYWdlCisJCWV4aXQgJE9DRl9TVUNDRVNTOzsKKyAgKikJCTs7Citlc2FjCisKKyMgRXZlcnl0aGluZyBleGNlcHQgdXNhZ2UgYW5kIG1ldGEtZGF0YSBtdXN0IHBhc3MgdGhlIHZhbGlkYXRlIHRlc3QKK1ZvbHVtZUdyb3VwX3ZhbGlkYXRlX2FsbAorCisjIFdoYXQga2luZCBvZiBtZXRob2Qgd2FzIGludm9rZWQ/CitjYXNlICIkMSIgaW4KKyAgICBzdGFydCkKKwlWb2x1bWVHcm91cF9zdGFydAorCTs7CisgICAgc3RvcCkKKwlWb2x1bWVHcm91cF9zdG9wCisJOzsKKyAgICBzdGF0dXMpCisJVm9sdW1lR3JvdXBfc3RhdHVzCisJOzsKKyAgICBtb25pdG9yKQorCVZvbHVtZUdyb3VwX21vbml0b3IKKwk7OworICAgIHZhbGlkYXRlLWFsbCkKKwk7OworICAgIG5vdGlmeXxwcm9tb3RlfGRlbW90ZXxtaWdyYXRlX2Zyb218bWlncmF0ZV90bykKKwl1c2FnZQorCWV4aXQgJE9DRl9FUlJfVU5JTVBMRU1FTlRFRAorCTs7CisgICAgKikJdXNhZ2UKKwlleGl0ICRPQ0ZfRVJSX0FSR1MKKwk7OworZXNhYworCitleGl0ICQ/CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jsa19hdmFpbGFiaWxpdHlfaW5pdF9yZWRfaGF0LmluIGIvc2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X2luaXRfcmVkX2hhdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRmZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X2luaXRfcmVkX2hhdC5pbgpAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIyBJdCBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlciBoYW5kbGluZyBvZiBmYWlsdXJlcyBvZiBMVk0yIG1pcnJvcgorIyBkZXZpY2VzIHRoYXQgd2VyZSBjcmVhdGVkIHVzaW5nIHRoZSAtbSBvcHRpb24gb2YgbHZjcmVhdGUuCisjCisjCisjIGNoa2NvbmZpZzogMTIzNDUgMjUgNzUKKyMgZGVzY3JpcHRpb246IENvbnRyb2xzIGF2YWlsYWJpbGl0eSBvZiBibG9jayBkZXZpY2VzCisjCisjIEZvciBSZWQtSGF0LWJhc2VkIGRpc3RyaWJ1dGlvbnMgc3VjaCBhcyBGZWRvcmEsIFJIRUwsIENlbnRPUy4KKyMJICAgICAgIAorIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczogYmxrLWF2YWlsYWJpbGl0eQorIyBSZXF1aXJlZC1TdGFydDoKKyMgUmVxdWlyZWQtU3RvcDoKKyMgRGVmYXVsdC1TdGFydDogMSAyIDMgNCA1CisjIERlZmF1bHQtU3RvcDogMCA2CisjIFNob3J0LURlc2NyaXB0aW9uOiBBdmFpbGFiaWxpdHkgb2YgYmxvY2sgZGV2aWNlcworIyMjIEVORCBJTklUIElORk8KKworLiAvZXRjL2luaXQuZC9mdW5jdGlvbnMKKworc2JpbmRpcj1Ac2JpbmRpckAKK3NjcmlwdD1ibGtkZWFjdGl2YXRlCitvcHRpb25zPSItdSAtbCB3aG9sZXZnIC1tIGRpc2FibGVxdWV1ZWluZyIKKworTE9DS19GSUxFPSIvdmFyL2xvY2svc3Vic3lzL2Jsay1hdmFpbGFiaWxpdHkiCisKKworcnRybj0xCisKK2Nhc2UgIiQxIiBpbgorICBzdGFydCkKKwl0b3VjaCAkTE9DS19GSUxFCisJOzsKKworICBzdG9wKQorCWFjdGlvbiAiU3RvcHBpbmcgYmxvY2sgZGV2aWNlIGF2YWlsYWJpbGl0eToiICRzYmluZGlyLyRzY3JpcHQgJG9wdGlvbnMKKwlybSAtZiAkTE9DS19GSUxFCisJOzsKKworICBzdGF0dXMpCisJOzsKKyAgKikKKwllY2hvICQiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXR1c30iCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmxrX2F2YWlsYWJpbGl0eV9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbiBiL3NjcmlwdHMvYmxrX2F2YWlsYWJpbGl0eV9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRjNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ibGtfYXZhaWxhYmlsaXR5X3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsMTQgQEAKK1tVbml0XQorRGVzY3JpcHRpb249QXZhaWxhYmlsaXR5IG9mIGJsb2NrIGRldmljZXMKK0FmdGVyPWx2bTItYWN0aXZhdGlvbi5zZXJ2aWNlIGx2bTItbHZtZXRhZC5zZXJ2aWNlIGlzY3NpLXNodXRkb3duLnNlcnZpY2UgaXNjc2kuc2VydmljZSBpc2NzaWQuc2VydmljZSBmY29lLnNlcnZpY2UKK0RlZmF1bHREZXBlbmRlbmNpZXM9bm8KK0NvbmZsaWN0cz1zaHV0ZG93bi50YXJnZXQKKworW1NlcnZpY2VdCitUeXBlPW9uZXNob3QKK0V4ZWNTdGFydD0vdXNyL2Jpbi90cnVlCitFeGVjU3RvcD1Ac2JpbmRpckAvYmxrZGVhY3RpdmF0ZSAtdSAtbCB3aG9sZXZnIC1tIGRpc2FibGVxdWV1ZWluZworUmVtYWluQWZ0ZXJFeGl0PXllcworCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jsa2RlYWN0aXZhdGUuc2guaW4gYi9zY3JpcHRzL2Jsa2RlYWN0aXZhdGUuc2guaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlYTJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmxrZGVhY3RpdmF0ZS5zaC5pbgpAQCAtMCwwICsxLDQ5MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIworIyBBdXRob3I6IFBldGVyIFJham5vaGEgPHByYWpub2hhIGF0IHJlZGhhdC5jb20+CisjCisjIFNjcmlwdCBmb3IgZGVhY3RpdmF0aW5nIGJsb2NrIGRldmljZXMKKyMKKyMgUmVxdWlyZXM6CisjICAgYmFzaCA+PSA0LjAgKGFzc29jaWF0aXZlIGFycmF5IHN1cHBvcnQpCisjICAgdXRpbC1saW51eCB7CisjICAgICAgIGxzYmxrID49IDIuMjIgKGxzYmxrIC1zIHN1cHBvcnQpCisjICAgICAgIHVtb3VudAorIyAgIH0KKyMgICBkbXNldHVwID49IDEuMDIuNjggKC0tcmV0cnkgb3B0aW9uIHN1cHBvcnQpCisjICAgbHZtID49IDIuMi44OSAoYWN0aXZhdGlvbi9yZXRyeV9kZWFjdGl2YXRpb24gY29uZmlnIHN1cHBvcnQpCisjCisKKyNzZXQgLXgKK3Nob3B0IC1zIGRvdGdsb2IgbnVsbGdsb2IKKworVE9PTD1ibGtkZWFjdGl2YXRlCisKK0RFVl9ESVI9Jy9kZXYnCitTWVNfQkxLX0RJUj0nL3N5cy9ibG9jaycKKworVU1PVU5UPSIvYmluL3Vtb3VudCIKK0RNU0VUVVA9IkBzYmluZGlyQC9kbXNldHVwIgorTFZNPSJAc2JpbmRpckAvbHZtIgorTURBRE09IkBzYmluZGlyQC9tZGFkbSIKK01QQVRIRD0iL3NiaW4vbXVsdGlwYXRoZCIKKworaWYgJFVNT1VOVCAtLWhlbHAgfCBncmVwIC0tICItLWFsbC10YXJnZXRzIiA+JERFVl9ESVIvbnVsbDsgdGhlbgorCVVNT1VOVF9PUFRTPSItLWFsbC10YXJnZXRzICIKK2Vsc2UKKwlVTU9VTlRfT1BUUz0iIgorCUZJTkRNTlQ9Ii9iaW4vZmluZG1udCAtciAtLW5vaGVhZGluZ3MgLXUgLW8gVEFSR0VUIgorCUZJTkRNTlRfUkVBRD0icmVhZCAtciBtbnQiCitmaQorRE1TRVRVUF9PUFRTPSIiCitMVk1fT1BUUz0iIgorTURBRE1fT1BUUz0iIgorTVBBVEhEX09QVFM9IiIKKworTFNCTEs9Ii9iaW4vbHNibGsgLXIgLS1ub2hlYWRpbmdzIC1vIFRZUEUsS05BTUUsTkFNRSxNT1VOVFBPSU5UIgorTFNCTEtfVkFSUz0ibG9jYWwgZGV2dHlwZSBsb2NhbCBrbmFtZSBsb2NhbCBuYW1lIGxvY2FsIG1udCIKK0xTQkxLX1JFQUQ9InJlYWQgLXIgZGV2dHlwZSBrbmFtZSBuYW1lIG1udCIKK1NPUlRfTU5UPSIvYmluL3NvcnQgLXIgLXUgLWsgNCIKKworIyBEbyBub3Qgc2hvdyB0b29sIGVycm9ycyBieSBkZWZhdWx0IChvbmx5IGRvbmUvc2tpcHBpbmcgc3VtbWFyeQorIyBtZXNzYWdlIHByb3ZpZGVkIGJ5IHRoaXMgc2NyaXB0KSBhbmQgbm8gdmVyYm9zZSBtb2RlIGJ5IGRlZmF1bHQuCitFUlJPUlM9MAorVkVSQk9TRT0wCisKKyMgRG8gbm90IHVubW91bnQgbW91bnRlZCBkZXZpY2VzIGJ5IGRlZmF1bHQuCitET19VTU9VTlQ9MAorCisjIERlYWN0aXZhdGUgZWFjaCBMViBzZXBhcmF0ZWx5IGJ5IGRlZmF1bHQgKG5vdCB0aGUgd2hvbGUgVkcpLgorTFZNX0RPX1dIT0xFX1ZHPTAKKyMgRG8gbm90IHJldHJ5IExWIGRlYWN0aXZhdGlvbiBieSBkZWZhdWx0LgorTFZNX0NPTkZJRz0iYWN0aXZhdGlvbntyZXRyeV9kZWFjdGl2YXRpb249MH0iCisKKyMgRG8gbm90IGRpc2FibGUgcXVldWVpbmcgaWYgc2V0IG9uIG11bHRpcGF0aCBkZXZpY2VzLgorTVBBVEhEX0RPX0RJU0FCTEVRVUVVRUlORz0wCisKKyMKKyMgTGlzdCBvZiBkZXZpY2UgbmFtZXMgYW5kL29yIFZHcyB0byBiZSBza2lwcGVkLgorIyBEZXZpY2UgbmFtZSBpcyB0aGUgS05BTUUgZnJvbSBsc2JsayBvdXRwdXQuCisjCisjIElmIGRlYWN0aXZhdGlvbiBvZiBhbnkgZGV2aWNlIGZhaWxzLCBpdCdzIGF1dG9tYXRpY2FsbHkKKyMgYWRkZWQgdG8gdGhlIFNLSVBfREVWSUNFX0xJU1QgKGFsc28gYSBwYXJ0aWN1bGFyIFZHCisjIGFkZGVkIHRvIHRoZSBTS0lQX1ZHX0xJU1QgZm9yIGEgZGV2aWNlIHRoYXQgaXMgYW4gTFYpLgorIworIyBUaGVzZSBsaXN0cyBwcm92aWRlIGRldmljZSB0cmVlIHBydW5pbmcgdG8gc2tpcAorIyBwYXJ0aWN1bGFyIGRldmljZS9WRyBkZWFjdGl2YXRpb24gdGhhdCBmYWlsZWQgYWxyZWFkeS4KKyMgKGxpc3RzIGFyZSBhc3NvY2lhdGl2ZSBhcnJheXMhKQorIworZGVjbGFyZSAtQSBTS0lQX0RFVklDRV9MSVNUPSgpCitkZWNsYXJlIC1BIFNLSVBfVkdfTElTVD0oKQorCisjCisjIExpc3Qgb2YgbW91bnRwb2ludHMgdG8gYmUgc2tpcHBlZC4gQW55IGRldmljZSB0aGF0IGlzIG1vdW50ZWQgb24gdGhlIG1vdW50cG9pbnQKKyMgbGlzdGVkIGhlcmUgd2lsbCBiZSBhZGRlZCB0byBTS0lQX0RFVklDRV9MSVNUIChhbmQgU0tJUF9WR19MSVNUKSBhdXRvbWF0aWNhbGx5LgorIyAobGlzdCBpcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSEpCisjCitkZWNsYXJlIC1BIFNLSVBfVU1PVU5UX0xJU1Q9KFsiLyJdPTEgWyIvYm9vdCJdPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi9saWIiXT0xIFsiL2xpYjY0Il09MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiL2JpbiJdPTEgWyIvc2JpbiJdPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi92YXIiXT0xIFsiL3Zhci9sb2ciXT0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIvdXNyIl09MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiL3Vzci9saWIiXT0xIFsiL3Vzci9saWI2NCJdPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi91c3Ivc2JpbiJdPTEgWyIvdXNyL2JpbiJdPTEpCisjIEJhc2ggY2FuJ3QgcHJvcGVybHkgaGFuZGxlICdbJyBhbmQgJ10nIHVzZWQgYXMgYSBzdWJzY3JpcHQKKyMgd2l0aGluIHRoZSAnKCknaW5pdGlhbGl6YXRpb24gLSBpdCBuZWVkcyB0byBiZSBkb25lIHNlcGFyYXRlbHkhCitTS0lQX1VNT1VOVF9MSVNUWyJbU1dBUF0iXT0xCisKK3VzYWdlKCkgeworCWVjaG8gIiR7VE9PTH06IFV0aWxpdHkgdG8gZGVhY3RpdmF0ZSBibG9jayBkZXZpY2VzIgorCWVjaG8KKwllY2hvICIgICR7VE9PTH0gW29wdGlvbnNdIFtkZXZpY2UuLi5dIgorCWVjaG8gIiAgICAtIERlYWN0aXZhdGUgYmxvY2sgZGV2aWNlIHRyZWUuIgorCWVjaG8gIiAgICAgIElmIGRldmljZXMgYXJlIHNwZWNpZmllZCwgZGVhY3RpdmF0ZSBvbmx5IHN1cHBsaWVkIGRldmljZXMgYW5kIHRoZWlyIGhvbGRlcnMuIgorCWVjaG8KKwllY2hvICIgIE9wdGlvbnM6IgorCWVjaG8gIiAgICAtZSB8IC0tZXJyb3JzICAgICAgICAgICAgICAgICAgICBTaG93IGVycm9ycyByZXBvcnRlZCBmcm9tIHRvb2xzIgorCWVjaG8gIiAgICAtaCB8IC0taGVscCAgICAgICAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlIgorCWVjaG8gIiAgICAtZCB8IC0tZG1vcHRpb24gICAgRE1fT1BUSU9OUyAgICBDb21tYSBzZXBhcmF0ZWQgRE0gc3BlY2lmaWMgb3B0aW9ucyIKKwllY2hvICIgICAgLWwgfCAtLWx2bW9wdGlvbiAgIExWTV9PUFRJT05TICAgQ29tbWEgc2VwYXJhdGVkIExWTSBzcGVjaWZpYyBvcHRpb25zIgorCWVjaG8gIiAgICAtbSB8IC0tbXBhdGhvcHRpb24gTVBBVEhfT1BUSU9OUyBDb21tYSBzZXBhcmF0ZWQgRE0tbXVsdGlwYXRoIHNwZWNpZmljIG9wdGlvbnMiCisJZWNobyAiICAgIC11IHwgLS11bW91bnQgICAgICAgICAgICAgICAgICAgIFVubW91bnQgdGhlIGRldmljZSBpZiBtb3VudGVkIgorCWVjaG8gIiAgICAtdiB8IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgKGFsc28gaW1wbGllcyAtZSkiCisJZWNobworCWVjaG8gIiAgRGV2aWNlIHNwZWNpZmljIG9wdGlvbnM6IgorCWVjaG8gIiAgICBETV9PUFRJT05TOiIKKwllY2hvICIgICAgICByZXRyeSAgICAgICAgICAgcmV0cnkgcmVtb3ZhbCBzZXZlcmFsIHRpbWVzIGluIGNhc2Ugb2YgZmFpbHVyZSIKKwllY2hvICIgICAgICBmb3JjZSAgICAgICAgICAgZm9yY2UgZGV2aWNlIHJlbW92YWwiCisJZWNobyAiICAgIExWTV9PUFRJT05TOiIKKwllY2hvICIgICAgICByZXRyeSAgICAgICAgICAgcmV0cnkgcmVtb3ZhbCBzZXZlcmFsIHRpbWVzIGluIGNhc2Ugb2YgZmFpbHVyZSIKKwllY2hvICIgICAgICB3aG9sZXZnICAgICAgICAgZGVhY3RpdmF0ZSB0aGUgd2hvbGUgVkcgd2hlbiBwcm9jZXNzaW5nIGFuIExWIgorCWVjaG8gIiAgICBNUEFUSF9PUFRJT05TOiIKKwllY2hvICIgICAgICBkaXNhYmxlcXVldWVpbmcgZGlzYWJsZSBxdWV1ZWluZyBvbiBhbGwgRE0tbXVsdGlwYXRoIGRldmljZXMgZmlyc3QiCisKKwlleGl0Cit9CisKK2FkZF9kZXZpY2VfdG9fc2tpcF9saXN0KCkgeworCVNLSVBfREVWSUNFX0xJU1QrPShbIiRrbmFtZSJdPTEpCisJcmV0dXJuIDEKK30KKworYWRkX3ZnX3RvX3NraXBfbGlzdCgpIHsKKwlTS0lQX1ZHX0xJU1QrPShbIiRETV9WR19OQU1FIl09MSkKKwlyZXR1cm4gMQorfQorCitpc190b3BfbGV2ZWxfZGV2aWNlKCkgeworCSMgdG9wIGxldmVsIGRldmljZXMgZG8gbm90IGhhdmUgYW55IGhvbGRlcnMsIHRoYXQgaXMKKwkjIHRoZSBTWVNfQkxLX0RJUi88ZGV2aWNlX25hbWU+L2hvbGRlcnMgZGlyIGlzIGVtcHR5CisJZmlsZXM9ImBlY2hvICRTWVNfQkxLX0RJUi8ka25hbWUvaG9sZGVycy8qYCIKKwl0ZXN0IC16ICIkZmlsZXMiCit9CisKK2RldmljZV91bW91bnRfb25lKCkgeworCXRlc3QgLXogIiRtbnQiICYmIHJldHVybiAwCisKKwlpZiB0ZXN0IC16ICIke1NLSVBfVU1PVU5UX0xJU1RbIiRtbnQiXX0iIC1hICIkRE9fVU1PVU5UIiAtZXEgIjEiOyB0aGVuCisJCWVjaG8gLW4gIiAgW1VNT1VOVF06IHVubW91bnRpbmcgJG5hbWUgKCRrbmFtZSkgbW91bnRlZCBvbiAkbW50Li4uICIKKwkJaWYgZXZhbCAkVU1PVU5UICRVTU9VTlRfT1BUUyAiJChwcmludGYgIiVzIiAiJG1udCIpIiAkT1VUICRFUlI7IHRoZW4KKwkJCWVjaG8gImRvbmUiCisJCWVsc2UKKwkJCWVjaG8gInNraXBwaW5nIgorCQkJYWRkX2RldmljZV90b19za2lwX2xpc3QKKwkJZmkKKwllbHNlCisJCWVjaG8gIiAgW1NLSVBdOiB1bm1vdW50IG9mICRuYW1lICgka25hbWUpIG1vdW50ZWQgb24gJG1udCIKKwkJYWRkX2RldmljZV90b19za2lwX2xpc3QKKwlmaQorfQorCitkZXZpY2VfdW1vdW50KCkgeworCXRlc3QgIiRkZXZ0eXBlIiAhPSAibHZtIiAmJiB0ZXN0ICIke2tuYW1lOjA6M30iICE9ICJkbS0iICYmIHJldHVybiAwCisKKwkjIEZJTkRNTlQgaXMgZGVmaW5lZCBvbmx5IGlmIHVtb3VudCAtLWFsbC10YXJnZXRzIGlzIG5vdCBhdmFpbGFibGUuCisJIyBJbiB0aGF0IGNhc2UsIHJlYWQgdGhlIGxpc3Qgb2YgbXVsdGlwbGUgbW91bnQgcG9pbnRzIG9mIG9uZSBkZXZpY2UKKwkjIHVzaW5nIEZJTkRNTlQgYW5kIHVubW91bnQgaXQgb25lIGJ5IG9uZSBtYW51YWxseS4KKwlpZiB0ZXN0IC16ICIkRklORE1OVCI7IHRoZW4KKwkJZGV2aWNlX3Vtb3VudF9vbmUKKwllbHNlCisJCXdoaWxlICRGSU5ETU5UX1JFQUQ7IGRvCisJCQlkZXZpY2VfdW1vdW50X29uZSB8fCByZXR1cm4gMQorCQlkb25lIDw8PCAiYCRGSU5ETU5UICRERVZfRElSLyRrbmFtZWAiCisJZmkKKworfQorCitkZWFjdGl2YXRlX2hvbGRlcnMgKCkgeworCWxvY2FsIHNraXA9MTsgJExTQkxLX1ZBUlMKKworCSMgR2V0IGhvbGRlcnMgZm9yIHRoZSBkZXZpY2UgLSBlaXRoZXIgYSBtb3VudCBvciBhbm90aGVyIGRldmljZS4KKwkjIEZpcnN0IGxpbmUgb24gdGhlIGxzYmxrIG91dHB1dCBpcyB0aGUgZGV2aWNlIGl0c2VsZiAtIHNraXAgaXQgZm9yCisJIyB0aGUgZGVhY3RpdmF0ZSBjYWxsIGFzIHRoaXMgZGV2aWNlIGlzIGFscmVhZHkgYmVpbmcgZGVhY3RpdmF0ZWQuCisJd2hpbGUgJExTQkxLX1JFQUQ7IGRvCisJCXRlc3QgLWUgJFNZU19CTEtfRElSLyRrbmFtZSB8fCBjb250aW51ZQorCQkjIGNoZWNrIGlmIHRoZSBkZXZpY2Ugbm90IG9uIHRoZSBza2lwIGxpc3QgYWxyZWFkeQorCQl0ZXN0IC16ICR7U0tJUF9ERVZJQ0VfTElTVFsiJGtuYW1lIl19IHx8IHJldHVybiAxCisKKwkJIyB0cnkgdG8gZGVhY3RpdmF0ZSB0aGUgaG9sZGVyCisJCXRlc3QgJHNraXAgLWVxIDEgJiYgc2tpcD0wICYmIGNvbnRpbnVlCisJCWRlYWN0aXZhdGUgfHwgcmV0dXJuIDEKKwlkb25lIDw8PCAiYCRMU0JMSyAkMWAiCit9CisKK2RlYWN0aXZhdGVfZG0gKCkgeworCWxvY2FsIG5hbWU9JChwcmludGYgIiVzIiAiJG5hbWUiKQorCXRlc3QgLWIgIiRERVZfRElSL21hcHBlci8kbmFtZSIgfHwgcmV0dXJuIDAKKwl0ZXN0IC16ICR7U0tJUF9ERVZJQ0VfTElTVFsiJGtuYW1lIl19IHx8IHJldHVybiAxCisKKwlkZWFjdGl2YXRlX2hvbGRlcnMgIiRERVZfRElSL21hcHBlci8kbmFtZSIgfHwgcmV0dXJuIDEKKworCWVjaG8gLW4gIiAgW0RNXTogZGVhY3RpdmF0aW5nICRkZXZ0eXBlIGRldmljZSAkbmFtZSAoJGtuYW1lKS4uLiAiCisJaWYgZXZhbCAkRE1TRVRVUCAkRE1TRVRVUF9PUFRTIHJlbW92ZSAiJG5hbWUiICRPVVQgJEVSUjsgdGhlbgorCQllY2hvICJkb25lIgorCWVsc2UKKwkJZWNobyAic2tpcHBpbmciCisJCWFkZF9kZXZpY2VfdG9fc2tpcF9saXN0CisJZmkKK30KKworZGVhY3RpdmF0ZV9sdm0gKCkgeworCWxvY2FsIERNX1ZHX05BTUU7IGxvY2FsIERNX0xWX05BTUU7IGxvY2FsIERNX0xWX0xBWUVSCisKKwlldmFsICQoZXZhbCAkRE1TRVRVUCBzcGxpdG5hbWUgLS1uYW1lcHJlZml4ZXMgLS1ub2hlYWRpbmdzIC0tcm93cyAiJG5hbWUiIExWTSAkRVJSKQorCXRlc3QgLWIgIiRERVZfRElSLyRETV9WR19OQU1FLyRETV9MVl9OQU1FIiB8fCByZXR1cm4gMAorCXRlc3QgLXogJHtTS0lQX1ZHX0xJU1RbIiRETV9WR19OQU1FIl19IHx8IHJldHVybiAxCisKKwlpZiB0ZXN0ICRMVk1fRE9fV0hPTEVfVkcgLWVxIDA7IHRoZW4KKwkJIyBTa2lwIExWTSBkZXZpY2UgZGVhY3RpdmF0aW9uIGlmIExWTSB0b29scyBtaXNzaW5nLgorCQl0ZXN0ICRMVk1fQVZBSUxBQkxFIC1lcSAwICYmIHsKKwkJCWFkZF9kZXZpY2VfdG9fc2tpcF9saXN0CisJCQlyZXR1cm4gMQorCQl9CisJCSMgRGVhY3RpdmF0aW5nIG9ubHkgdGhlIExWIHNwZWNpZmllZAorCQlkZWFjdGl2YXRlX2hvbGRlcnMgIiRERVZfRElSLyRETV9WR19OQU1FLyRETV9MVl9OQU1FIiB8fCB7CisJCQlhZGRfZGV2aWNlX3RvX3NraXBfbGlzdAorCQkJcmV0dXJuIDEKKwkJfQorCisJCWVjaG8gLW4gIiAgW0xWTV06IGRlYWN0aXZhdGluZyBMb2dpY2FsIFZvbHVtZSAkRE1fVkdfTkFNRS8kRE1fTFZfTkFNRS4uLiAiCisJCWlmIGV2YWwgJExWTSBsdmNoYW5nZSAkTFZNX09QVFMgLS1jb25maWcgXCdsb2d7cHJlZml4PVwiXCJ9ICRMVk1fQ09ORklHXCcgLWFsbiAkRE1fVkdfTkFNRS8kRE1fTFZfTkFNRSAkT1VUICRFUlI7IHRoZW4KKwkJCWVjaG8gImRvbmUiCisJCWVsc2UKKwkJCWVjaG8gInNraXBwaW5nIgorCQkJYWRkX2RldmljZV90b19za2lwX2xpc3QKKwkJZmkKKworCWVsc2UKKwkJIyBTa2lwIExWTSBWRyBkZWFjdGl2YXRpb24gaWYgTFZNIHRvb2xzIG1pc3NpbmcuCisJCXRlc3QgJExWTV9BVkFJTEFCTEUgLWVxIDAgJiYgeworCQkJYWRkX3ZnX3RvX3NraXBfbGlzdAorCQkJcmV0dXJuIDEKKwkJfQorCQkjIERlYWN0aXZhdGluZyB0aGUgd2hvbGUgVkcgdGhlIExWIGlzIHBhcnQgb2YKKwkJbHZfbGlzdD0kKGV2YWwgJExWTSB2Z3MgLS1jb25maWcgIiRMVk1fQ09ORklHIiAtLW5vaGVhZGluZ3MgLS1yb3dzIC1vIGx2X25hbWUgJERNX1ZHX05BTUUgJEVSUikKKwkJZm9yIGx2IGluICRsdl9saXN0OyBkbworCQkJdGVzdCAtYiAiJERFVl9ESVIvJERNX1ZHX05BTUUvJGx2IiB8fCBjb250aW51ZQorCQkJZGVhY3RpdmF0ZV9ob2xkZXJzICIkREVWX0RJUi8kRE1fVkdfTkFNRS8kbHYiIHx8IHsKKwkJCQlhZGRfdmdfdG9fc2tpcF9saXN0CisJCQkJcmV0dXJuIDEKKwkJCX0KKwkJZG9uZQorCisJCWVjaG8gLW4gIiAgW0xWTV06IGRlYWN0aXZhdGluZyBWb2x1bWUgR3JvdXAgJERNX1ZHX05BTUUuLi4gIgorCQlpZiBldmFsICRMVk0gdmdjaGFuZ2UgJExWTV9PUFRTIC0tY29uZmlnIFwnbG9ne3ByZWZpeD1cIiAgICBcIn0gJExWTV9DT05GSUdcJyAtYWxuICRETV9WR19OQU1FICRPVVQgJEVSUjsgdGhlbgorCQkJZWNobyAiZG9uZSIKKwkJZWxzZQorCQkJZWNobyAic2tpcHBpbmciCisJCQlhZGRfdmdfdG9fc2tpcF9saXN0CisJCWZpCisJZmkKK30KKworZGVhY3RpdmF0ZV9tZCAoKSB7CisJbG9jYWwgbmFtZT0kKHByaW50ZiAiJXMiICIkbmFtZSIpCisJdGVzdCAtYiAiJERFVl9ESVIvJG5hbWUiIHx8IHJldHVybiAwCisJdGVzdCAteiAke1NLSVBfREVWSUNFX0xJU1RbIiRrbmFtZSJdfSB8fCByZXR1cm4gMQorCisJIyBTa2lwIE1EIGRldmljZSBkZWFjdGl2YXRpb24gaWYgTUQgdG9vbHMgbWlzc2luZy4KKwl0ZXN0ICRNREFETV9BVkFJTEFCTEUgLWVxIDAgJiYgeworCQlhZGRfZGV2aWNlX3RvX3NraXBfbGlzdAorCQlyZXR1cm4gMQorCX0KKworCWRlYWN0aXZhdGVfaG9sZGVycyAiJERFVl9ESVIvJG5hbWUiIHx8IHJldHVybiAxCisKKwllY2hvIC1uICIgIFtNRF06IGRlYWN0aXZhdGluZyAkZGV2dHlwZSBkZXZpY2UgJGtuYW1lLi4uICIKKwlpZiBldmFsICRNREFETSAkTURBRE1fT1BUUyAtUyAiJG5hbWUiICRPVVQgJEVSUjsgdGhlbgorCQllY2hvICJkb25lIgorCWVsc2UKKwkJZWNobyAic2tpcHBpbmciCisJCWFkZF9kZXZpY2VfdG9fc2tpcF9saXN0CisJZmkKK30KKworZGVhY3RpdmF0ZSAoKSB7CisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCSMgREVBQ1RJVkFUSU9OIEhPT0tTIEZPUiBORVcgREVWSUNFIFRZUEVTIEdPIEhFUkUhICAgICAgICAgICAgICAgICAgICMKKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisJIyBJZGVudGlmeSBhIG5ldyBkZXZpY2UgdHlwZSBlaXRoZXIgYnkgaW5zcGVjdGluZyB0aGUgVFlQRSBwcm92aWRlZCAgIworCSMgYnkgbHNibGsgZGlyZWN0bHkgKCRkZXZ0eXBlKSBvciBieSBhbnkgb3RoZXIgbWVhbiB0aGF0IGlzIHN1aXRhYmxlICMKKwkjIGUuZy4gdGhlIEtOQU1FIHByb3ZpZGVkIGJ5IGxzYmxrICgka25hbWUpLiBTZWUgJExTQkxLX1ZBUlMgZm9yICAgICAjCisJIyBjb21wbGV0ZSBsaXN0IG9mIHZhcmlhYmxlcyB0aGF0IG1heSBiZSB1c2VkLiBUaGVuIGNhbGwgYSAgICAgICAgICAgIworCSMgZGV2aWNlLXNwZWNpZmljIGRlYWN0aXZhdGlvbiBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIGV4YWN0IHR5cGUuICMKKwkjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICMgVGhpcyBkZXZpY2Utc3BlY2lmaWMgZnVuY3Rpb24gd2lsbCBjZXJ0YWlubHkgbmVlZCB0byBjYWxsICAgICAgICAgICMKKwkjIGRlYWN0aXZhdGVfaG9sZGVycyBmaXJzdCB0byByZWN1cnNpdmVseSBkZWFjdGl2YXRlIGFueSBleGlzdGluZyAgICAjCisJIyBob2xkZXJzIGl0IG1pZ2h0IGhhdmUgYmVmb3JlIGRlYWN0aXZhdGluZyB0aGUgZGV2aWNlIGl0IHByb2Nlc3Nlcy4gIworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwlpZiB0ZXN0ICIkZGV2dHlwZSIgPSAibHZtIjsgdGhlbgorCQlkZWFjdGl2YXRlX2x2bQorCWVsaWYgdGVzdCAiJHtrbmFtZTowOjN9IiA9ICJkbS0iOyB0aGVuCisJCWRlYWN0aXZhdGVfZG0KKwllbGlmIHRlc3QgIiR7a25hbWU6MDoyfSIgPSAibWQiOyB0aGVuCisJCWRlYWN0aXZhdGVfbWQKKwlmaQorfQorCitkZWFjdGl2YXRlX2FsbCgpIHsKKwkkTFNCTEtfVkFSUworCXNraXA9MAorCisJZWNobyAiRGVhY3RpdmF0aW5nIGJsb2NrIGRldmljZXM6IgorCisJdGVzdCAkTVBBVEhEX1JVTk5JTkcgLWVxIDEgJiYgeworCQllY2hvIC1uICIgIFtETV06IGRpc2FibGluZyBxdWV1ZWluZyBvbiBhbGwgbXVsdGlwYXRoIGRldmljZXMuLi4gIgorCQlldmFsICRNUEFUSEQgJE1QQVRIRF9PUFRTIGRpc2FibGVxdWV1ZWluZyBtYXBzICRFUlIgfCBncmVwICdeb2skJyA+JERFVl9ESVIvbnVsbCAmJiBlY2hvICJkb25lIiB8fCBlY2hvICJmYWlsZWQiCisJfQorCisJaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorCQkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCQkjIFByb2Nlc3MgYWxsIGRldmljZXMgIworCQkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisJCSMgVW5tb3VudCBhbGwgcmVsZXZhbnQgbW91bnRwb2ludHMgZmlyc3QKKwkJd2hpbGUgJExTQkxLX1JFQUQ7IGRvCisJCQlkZXZpY2VfdW1vdW50CisJCWRvbmUgPDw8ICJgJExTQkxLIHwgJFNPUlRfTU5UYCIKKworCQkjIERvIGRlYWN0aXZhdGUKKwkJd2hpbGUgJExTQkxLX1JFQUQ7IGRvCisJCQkjICdkaXNrJyBpcyBhdCB0aGUgYm90dG9tIGFscmVhZHkgYW5kIGl0J3MgYSByZWFsIGRldmljZQorCQkJdGVzdCAiJGRldnR5cGUiID0gImRpc2siICYmIGNvbnRpbnVlCisKKwkJCSMgaWYgZGVhY3RpdmF0aW9uIG9mIGFueSBkZXZpY2UgZmFpbHMsIHNraXAgcHJvY2Vzc2luZworCQkJIyBhbnkgc3Vic2VxdWVudCBkZXZpY2VzIHdpdGhpbiBpdHMgc3VidHJlZSBhcyB0aGUKKwkJCSMgdG9wLWxldmVsIGRldmljZSBjb3VsZCBub3QgYmUgZGVhY3RpdmF0ZWQgYW55d2F5CisJCQl0ZXN0ICRza2lwIC1lcSAxICYmIHsKKwkJCQkjIHJlc2V0ICdza2lwJyBvbiB0b3AgbGV2ZWwgZGV2aWNlCisJCQkJaXNfdG9wX2xldmVsX2RldmljZSAmJiBza2lwPTAgfHwgY29udGludWUKKwkJCX0KKworCQkJIyBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgc2tpcCBsaXN0IGFscmVhZHkKKwkJCXRlc3QgLXogJHtTS0lQX0RFVklDRV9MSVNUWyIka25hbWUiXX0gfHwgY29udGludWUKKworCQkJIyB0cnkgdG8gZGVhY3RpdmF0ZSB0b3AtbGV2ZWwgZGV2aWNlLCBzZXQgJ3NraXA9MScKKwkJCSMgaWYgaXQgZmFpbHMgdG8gZG8gc28gLSB0aGlzIHdpbGwgY2F1c2UgYWxsIHRoZQorCQkJIyBkZXZpY2UncyBzdWJ0cmVlIHRvIGJlIHNraXBwZWQgd2hlbiBwcm9jZXNzaW5nCisJCQkjIGRldmljZXMgZnVydGhlciBpbiB0aGlzIGxvb3AKKwkJCWRlYWN0aXZhdGUgfHwgc2tpcD0xCisJCWRvbmUgPDw8ICJgJExTQkxLIC1zYCIKKwllbHNlCisJCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkJIyBQcm9jZXNzIG9ubHkgc3BlY2lmaWVkIGRldmljZXMgIworCQkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKwkJd2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKwkJCSMgVW5tb3VudCBhbGwgcmVsZXZhbnQgbW91bnRwb2ludHMgZmlyc3QKKwkJCXdoaWxlICRMU0JMS19SRUFEOyBkbworCQkJCWRldmljZV91bW91bnQKKwkJCWRvbmUgPDw8ICJgJExTQkxLICQxIHwgJFNPUlRfTU5UYCIKKworCQkJIyBEbyBkZWFjdGl2YXRlCisJCQkjIFNpbmdsZSBkbSBkZXZpY2UgdHJlZSBkZWFjdGl2YXRpb24uCisJCQlpZiB0ZXN0IC1iICIkMSI7IHRoZW4KKwkJCQkkTFNCTEtfUkVBRCA8PDwgImAkTFNCTEsgLS1ub2RlcHMgJDFgIgorCisJCQkJIyBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgc2tpcCBsaXN0IGFscmVhZHkKKwkJCQl0ZXN0IC16ICR7U0tJUF9ERVZJQ0VfTElTVFsiJGtuYW1lIl19IHx8IHsKKwkJCQkJc2hpZnQKKwkJCQkJY29udGludWUKKwkJCQl9CisKKwkJCQlkZWFjdGl2YXRlCisJCQllbHNlCisJCQkJZWNobyAiJDE6IGRldmljZSBub3QgZm91bmQiCisJCQkJcmV0dXJuIDEKKwkJCWZpCisJCQlzaGlmdAorCQlkb25lOworCWZpCit9CisKK2dldF9kbW9wdHMoKSB7CisJT1JJR19JRlM9JElGUzsgSUZTPScsJworCisJZm9yIG9wdCBpbiAkMTsgZG8KKwkJY2FzZSAkb3B0IGluCisJCQkiIikgOzsKKwkJCSJyZXRyeSIpIERNU0VUVVBfT1BUUys9Ii0tcmV0cnkgIiA7OworCQkJImZvcmNlIikgRE1TRVRVUF9PUFRTKz0iLS1mb3JjZSAiIDs7CisJCQkqKSBlY2hvICIkb3B0OiB1bmtub3duIERNIG9wdGlvbiIKKwkJZXNhYworCWRvbmUKKworCUlGUz0kT1JJR19JRlMKK30KKworZ2V0X2x2bW9wdHMoKSB7CisJT1JJR19JRlM9JElGUzsgSUZTPScsJworCisJZm9yIG9wdCBpbiAkMTsgZG8KKwkJY2FzZSAiJG9wdCIgaW4KKwkJCSIiKSA7OworCQkJInJldHJ5IikgTFZNX0NPTkZJRz0iYWN0aXZhdGlvbntyZXRyeV9kZWFjdGl2YXRpb249MX0iIDs7CisJCQkid2hvbGV2ZyIpIExWTV9ET19XSE9MRV9WRz0xIDs7CisJCQkqKSBlY2hvICIkb3B0OiB1bmtub3duIExWTSBvcHRpb24iCisJCWVzYWMKKwlkb25lCisKKwlJRlM9JE9SSUdfSUZTCit9CisKK2dldF9tcGF0aG9wdHMoKSB7CisJT1JJR19JRlM9JElGUzsgSUZTPScsJworCisJZm9yIG9wdCBpbiAkMTsgZG8KKwkJY2FzZSAiJG9wdCIgaW4KKwkJCSIiKSA7OworCQkJImRpc2FibGVxdWV1ZWluZyIpIE1QQVRIRF9ET19ESVNBQkxFUVVFVUVJTkc9MSA7OworCQkJKikgZWNobyAiJG9wdDogdW5rbm93biBETS1tdWx0aXBhdGggb3B0aW9uIgorCQllc2FjCisJZG9uZQorCisJSUZTPSRPUklHX0lGUworfQorCitzZXRfZW52KCkgeworCWlmIHRlc3QgIiRFUlJPUlMiIC1lcSAiMSI7IHRoZW4KKwkJdW5zZXQgRVJSCisJZWxzZQorCQlFUlI9IjI+JERFVl9ESVIvbnVsbCIKKwlmaQorCisJaWYgdGVzdCAiJFZFUkJPU0UiIC1lcSAiMSI7IHRoZW4KKwkJdW5zZXQgT1VUCisJCVVNT1VOVF9PUFRTKz0iLXYiCisJCURNU0VUVVBfT1BUUys9Ii12dnZ2IgorCQlMVk1fT1BUUys9Ii12dnZ2IgorCQlNREFETV9PUFRTKz0iLXZ2IgorCQlNUEFUSERfT1BUUys9Ii12IDMiCisJZWxzZQorCQlPVVQ9IjE+JERFVl9ESVIvbnVsbCIKKwlmaQorCisJaWYgdGVzdCAtZiAkTFZNOyB0aGVuCisJCUxWTV9BVkFJTEFCTEU9MQorCWVsc2UKKwkJTFZNX0FWQUlMQUJMRT0wCisJZmkKKworCWlmIHRlc3QgLWYgJE1EQURNOyB0aGVuCisJCU1EQURNX0FWQUlMQUJMRT0xCisJZWxzZQorCQlNREFETV9BVkFJTEFCTEU9MAorCWZpCisKKwlNUEFUSERfUlVOTklORz0wCisJdGVzdCAkTVBBVEhEX0RPX0RJU0FCTEVRVUVVRUlORyAtZXEgMSAmJiB7CisJCWlmIHRlc3QgLWYgJE1QQVRIRDsgdGhlbgorCQkJaWYgZXZhbCAkTVBBVEhEIHNob3cgZGFlbW9uICRFUlIgfCBncmVwICJydW5uaW5nIiA+JERFVl9ESVIvbnVsbDsgdGhlbgorCQkJCU1QQVRIRF9SVU5OSU5HPTEKKwkJCWZpCisJCWZpCisJfQorfQorCit3aGlsZSB0ZXN0ICQjIC1uZSAwOyBkbworCWNhc2UgIiQxIiBpbgorCQkiIikgOzsKKwkJIi1lInwiLS1lcnJvcnMiKSBFUlJPUlM9MSA7OworCQkiLWgifCItLWhlbHAiKSB1c2FnZSA7OworCQkiLWQifCItLWRtb3B0aW9uICIpIGdldF9kbW9wdHMgIiQyIiA7IHNoaWZ0IDs7CisJCSItbCJ8Ii0tbHZtb3B0aW9uICIpIGdldF9sdm1vcHRzICIkMiIgOyBzaGlmdCA7OworCQkiLW0ifCItLW1wYXRob3B0aW9uICIpIGdldF9tcGF0aG9wdHMgIiQyIiA7IHNoaWZ0IDs7CisJCSItdSJ8Ii0tdW1vdW50IikgRE9fVU1PVU5UPTEgOzsKKwkJIi12InwiLS12ZXJib3NlIikgVkVSQk9TRT0xIDsgRVJST1JTPTEgOzsKKwkJIi12diIpIFZFUkJPU0U9MSA7IEVSUk9SUz0xIDsgc2V0IC14IDs7CisJCSopIGJyZWFrIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK3NldF9lbnYKK2RlYWN0aXZhdGVfYWxsICIkQCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2x2bWRfZml4X2NvbmYuc2ggYi9zY3JpcHRzL2Nsdm1kX2ZpeF9jb25mLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Nsdm1kX2ZpeF9jb25mLnNoCkBAIC0wLDAgKzEsMTYyIEBACisjIS9iaW4vYmFzaAorIworIyBFZGl0IGFuIGx2bS5jb25mIGZpbGUgdG8gZW5hYmxlIGNsdXN0ZXIgbG9ja2luZy4KKyMKKyMgJDEgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbG9ja2luZyBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKyMgJDIgKG9wdGlvbmFsKSBpcyB0aGUgY29uZmlnIGZpbGUKKyMgJDMgKG9wdGlvbmFsKSBpcyB0aGUgbG9ja2luZyBsaWJyYXJ5IG5hbWUKKyMKKyMKK1BSRUZJWD0kMQorTFZNQ09ORj0kMgorTElCPSQzCisKK2lmIFsgLXogIiRQUkVGSVgiIF0KK3RoZW4KKyAgZWNobyAidXNhZ2U6ICQwIDxwcmVmaXg+IFs8Y29uZmlnIGZpbGU+XSBbPGxpYnJhcnk+XSIKKyAgZWNobyAiIgorICBlY2hvICI8cHJlZml4PnxVTkRPICBsb2NhdGlvbiBvZiB0aGUgY2x1c3RlciBsb2NraW5nIHNoYXJlZCBsaWJyYXJ5LiAobm8gZGVmYXVsdCkiCisgIGVjaG8gIiAgICAgICAgICAgICAgIFVORE8gd2lsbCByZXNldCB0aGUgbG9ja2luZyBiYWNrIHRvIGxvY2FsIgorICBlY2hvICI8Y29uZmlnIGZpbGU+ICBuYW1lIG9mIHRoZSBMVk0gY29uZmlnIGZpbGUgKGRlZmF1bHQ6IC9ldGMvbHZtL2x2bS5jb25mKSIKKyAgZWNobyAiPGxpYnJhcnk+ICAgICAgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgKGRlZmF1bHQ6IGxpYmx2bTJjbHVzdGVybG9jay5zbykiCisgIGVjaG8gIiIKKyAgZXhpdCAwCitmaQorCitbIC16ICIkTFZNQ09ORiIgXSAmJiBMVk1DT05GPSIvZXRjL2x2bS9sdm0uY29uZiIKK1sgLXogIiRMSUIiIF0gJiYgTElCPSJsaWJsdm0yY2x1c3RlcmxvY2suc28iCisKK2lmIFsgIiRQUkVGSVgiID0gIlVORE8iIF0KK3RoZW4KKyAgbG9ja2luZ190eXBlPSIxIgorZWxzZQorICBsb2NraW5nX3R5cGU9IjIiCisKKyAgaWYgWyAiJHtQUkVGSVg6MDoxfSIgIT0gIi8iIF0KKyAgdGhlbgorICAgIGVjaG8gIlByZWZpeCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGggbmFtZSAoc3RhcnRpbmcgd2l0aCBhIC8pIgorICAgIGV4aXQgMTIKKyAgZmkKKworICBpZiBbICEgLWYgIiRQUkVGSVgvJExJQiIgXQorICB0aGVuCisgICAgZWNobyAiJFBSRUZJWC8kTElCIGRvZXMgbm90IGV4aXN0LCBkaWQgeW91IGRvIGEgXCJtYWtlIGluc3RhbGxcIiA/IgorICAgIGV4aXQgMTEKKyAgZmkKK2ZpCisKK2lmIFsgISAtZiAiJExWTUNPTkYiIF0KK3RoZW4KKyAgZWNobyAiJExWTUNPTkYgZG9lcyBub3QgZXhpc3QiCisgIGV4aXQgMTAKK2ZpCisKKworU0NSSVBURklMRT1gbWt0ZW1wIC10IGx2bXNjcmlwdC5YWFhYWFhYWFhYYAorVE1QRklMRT1gbWt0ZW1wIC10IGx2bXRtcC5YWFhYWFhYWFhYYAorCisKKyMgRmxhZ3Mgc28gd2Uga25vdyB3aGljaCBwYXJ0cyBvZiB0aGUgZmlsZSB3ZSBjYW4gcmVwbGFjZSBhbmQgd2hpY2ggbmVlZAorIyBhZGRpbmcuIFRoZXNlIGFyZSByZXR1cm4gY29kZXMgZnJvbSBncmVwLCBzbyB6ZXJvIG1lYW5zIGl0IElTIHByZXNlbnQhCitoYXZlX3R5cGU9MQoraGF2ZV9kaXI9MQoraGF2ZV9saWJyYXJ5PTEKK2hhdmVfZ2xvYmFsPTEKKworZ3JlcCAtcSAnXltbOmJsYW5rOl1dKmxvY2tpbmdfdHlwZVtbOmJsYW5rOl1dKj0nICRMVk1DT05GCitoYXZlX3R5cGU9JD8KKworZ3JlcCAtcSAnXltbOmJsYW5rOl1dKmxpYnJhcnlfZGlyW1s6Ymxhbms6XV0qPScgJExWTUNPTkYKK2hhdmVfZGlyPSQ/CisKK2dyZXAgLXEgJ15bWzpibGFuazpdXSpsb2NraW5nX2xpYnJhcnlbWzpibGFuazpdXSo9JyAkTFZNQ09ORgoraGF2ZV9saWJyYXJ5PSQ/CisKKyMgVGhvc2Ugb3B0aW9ucyBhcmUgaW4gc2VjdGlvbiAiZ2xvYmFsIHsiIHNvIHdlIG11c3QgaGF2ZSBvbmUgaWYgYW55IGFyZSBwcmVzZW50LgoraWYgWyAiJGhhdmVfdHlwZSIgPSAiMCIgLW8gIiRoYXZlX2RpciIgPSAiMCIgLW8gIiRoYXZlX2xpYnJhcnkiID0gIjAiIF0KK3RoZW4KKworICAgICMgU2VlIGlmIHdlIGNhbiBmaW5kIGl0Li4uCisgICAgZ3JlcCAtcSAnXltbOmJsYW5rOl1dKmdsb2JhbFtbOmJsYW5rOl1dKnsnICRMVk1DT05GCisgICAgaGF2ZV9nbG9iYWw9JD8KKyAgICAKKyAgICBpZiBbICIkaGF2ZV9nbG9iYWwiID0gIjEiIF0gCisJdGhlbgorCWVjaG8gImdsb2JhbCBrZXlzIGJ1dCBubyAnZ2xvYmFsIHsnIGZvdW5kLCBjYW4ndCBlZGl0IGZpbGUiCisJZXhpdCAxMgorICAgIGZpCitmaQorCisjIFNvIGlmIHdlIGRvbid0IGhhdmUgImdsb2JhbCB7IiB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUgYW5kIAorIyBwb3B1bGF0ZSBpdAorCitpZiBbICIkaGF2ZV9nbG9iYWwiID0gIjEiIF0KK3RoZW4KKyAgICBjYXQgJExWTUNPTkYgLSA8PEVPRiA+ICRUTVBGSUxFCitnbG9iYWwgeworICAgICMgRW5hYmxlIGxvY2tpbmcgZm9yIGNsdXN0ZXIgTFZNCisgICAgbG9ja2luZ190eXBlID0gJGxvY2tpbmdfdHlwZQorICAgIGxpYnJhcnlfZGlyID0gIiRQUkVGSVgiCisgICAgbG9ja2luZ19saWJyYXJ5ID0gIiRMSUIiCit9CitFT0YKKyAgICBpZiBbICQ/ICE9IDAgXQorICAgIHRoZW4KKwllY2hvICJmYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBjb25maWcgZmlsZSwgJExWTUNPTkYgbm90IHVwZGF0ZWQiCisJZXhpdCAxCisgICAgZmkKK2Vsc2UKKyAgICAjCisgICAgIyBXZSBoYXZlIGEgImdsb2JhbCB7IiBzZWN0aW9uLCBzbyBhZGQgb3IgcmVwbGFjZSB0aGUKKyAgICAjIGxvY2tpbmcgZW50cmllcyBhcyBhcHByb3ByaWF0ZQorICAgICMKKworICAgIGlmIFsgIiRoYXZlX3R5cGUiID0gIjAiIF0gCisgICAgdGhlbgorCVNFRENNRD0iIHMvXltbOmJsYW5rOl1dKmxvY2tpbmdfdHlwZVtbOmJsYW5rOl1dKj0uKi9cIFwgXCBcIGxvY2tpbmdfdHlwZSA9ICRsb2NraW5nX3R5cGUvZyIKKyAgICBlbHNlCisJU0VEQ01EPSIgL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgbG9ja2luZ190eXBlID0gMiIKKyAgICBmaQorICAgIAorICAgIGlmIFsgIiRoYXZlX2RpciIgPSAiMCIgXSAKKyAgICB0aGVuCisJU0VEQ01EPSIke1NFRENNRH1cbnMnXltbOmJsYW5rOl1dKmxpYnJhcnlfZGlyW1s6Ymxhbms6XV0qPS4qJ1wgXCBcIFwgbGlicmFyeV9kaXIgPSBcIiRQUkVGSVhcIidnIgorICAgIGVsc2UKKwlTRURDTUQ9IiR7U0VEQ01EfVxuL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgbGlicmFyeV9kaXIgPSBcIiRQUkVGSVhcIiIKKyAgICBmaQorCisgICAgaWYgWyAiJGhhdmVfbGlicmFyeSIgPSAiMCIgXSAKKyAgICB0aGVuCisJU0VEQ01EPSIke1NFRENNRH1cbnMvXltbOmJsYW5rOl1dKmxvY2tpbmdfbGlicmFyeVtbOmJsYW5rOl1dKj0uKi9cIFwgXCBcIGxvY2tpbmdfbGlicmFyeSA9IFwiJExJQlwiL2ciCisgICAgZWxzZQorCVNFRENNRD0iJHtTRURDTUR9XG4vZ2xvYmFsW1s6Ymxhbms6XV0qey9hXCBcIFwgXCBsb2NraW5nX2xpYnJhcnkgPSBcIiRMSUJcIiIKKyAgICBmaQorCisgICAgZWNobyAtZSAkU0VEQ01EID4gJFNDUklQVEZJTEUKKyAgICBzZWQgIDwkTFZNQ09ORiA+JFRNUEZJTEUgLWYgJFNDUklQVEZJTEUKKyAgICBpZiBbICQ/ICE9IDAgXQorICAgIHRoZW4KKwllY2hvICJzZWQgZmFpbGVkLCAkTFZNQ09ORiBub3QgdXBkYXRlZCIKKwlleGl0IDEKKyAgICBmaQorZmkKKworIyBOb3cgd2UgaGF2ZSBhIHN1aXRhYmx5IGVkaXR0ZWQgY29uZmlnIGZpbGUgaW4gYSB0ZW1wIHBsYWNlLAorIyBiYWNrdXAgdGhlIG9yaWdpbmFsIGFuZCBjb3B5IG91ciBuZXcgb25lIGludG8gcGxhY2UuCisKK2NwICRMVk1DT05GICRMVk1DT05GLm5vY2x1c3RlcgoraWYgWyAkPyAhPSAwIF0KKyAgICB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGJhY2t1cCBvbGQgY29uZmlnIGZpbGUsICRMVk1DT05GIG5vdCB1cGRhdGVkIgorICAgIGV4aXQgMgorZmkKKworY3AgJFRNUEZJTEUgJExWTUNPTkYKK2lmIFsgJD8gIT0gMCBdCisgICAgdGhlbgorICAgIGVjaG8gImZhaWxlZCB0byBjb3B5IG5ldyBjb25maWcgZmlsZSBpbnRvIHBsYWNlLCBjaGVjayAkTFZNQ09ORiBpcyBzdGlsbCBPSyIKKyAgICBleGl0IDMKK2ZpCisKK3JtIC1mICRTQ1JJUFRGSUxFICRUTVBGSUxFCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2x2bWRfaW5pdF9yZWRfaGF0LmluIGIvc2NyaXB0cy9jbHZtZF9pbml0X3JlZF9oYXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmMzM5MgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2x2bWRfaW5pdF9yZWRfaGF0LmluCkBAIC0wLDAgKzEsMjE0IEBACisjIS9iaW4vYmFzaAorIworIyBjbHZtZCAtIENsdXN0ZXJlZCBMVk0gRGFlbW9uIGluaXQgc2NyaXB0CisjCisjIGNoa2NvbmZpZzogLSAyNCA3NgorIyBkZXNjcmlwdGlvbjogQ2x1c3RlciBkYWVtb24gZm9yIHVzZXJsYW5kIGxvZ2ljYWwgdm9sdW1lIG1hbmFnZW1lbnQgdG9vbHMuCisjIHBpZGZpbGU6IEBDTFZNRF9QSURGSUxFQAorIworIyBGb3IgUmVkLUhhdC1iYXNlZCBkaXN0cmlidXRpb25zIHN1Y2ggYXMgRmVkb3JhLCBSSEVMLCBDZW50T1MuCisjCisjIyMgQkVHSU4gSU5JVCBJTkZPCisjIFByb3ZpZGVzOgkJY2x2bWQKKyMgUmVxdWlyZWQtU3RhcnQ6CSRsb2NhbF9mc0BDTFZNRF9DTUFOQUdFUlNACisjIFJlcXVpcmVkLVN0b3A6CSRsb2NhbF9mc0BDTFZNRF9DTUFOQUdFUlNACisjIFNob3J0LURlc2NyaXB0aW9uOglUaGlzIHNlcnZpY2UgaXMgQ2x1c3RlcmQgTFZNIERhZW1vbi4KKyMgRGVzY3JpcHRpb246CQlDbHVzdGVyIGRhZW1vbiBmb3IgdXNlcmxhbmQgbG9naWNhbCB2b2x1bWUgbWFuYWdlbWVudCB0b29scy4KKyMjIyBFTkQgSU5JVCBJTkZPCisKKy4gL2V0Yy9yYy5kL2luaXQuZC9mdW5jdGlvbnMKKworREFFTU9OPWNsdm1kCisKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK3NiaW5kaXI9QHNiaW5kaXJACisKK2x2bV92Z2NoYW5nZT0ke3NiaW5kaXJ9L3ZnY2hhbmdlCitsdm1fdmdzPSR7c2JpbmRpcn0vdmdzCitsdm1fdmdzY2FuPSR7c2JpbmRpcn0vdmdzY2FuCitsdm1fbHZzPSR7c2JpbmRpcn0vbHZzCisKK0NMVk1ET1BUUz0iLVQzMCIKKworWyAtZiAvZXRjL3N5c2NvbmZpZy9jbHVzdGVyIF0gJiYgLiAvZXRjL3N5c2NvbmZpZy9jbHVzdGVyCitbIC1mIC9ldGMvc3lzY29uZmlnLyREQUVNT04gXSAmJiAuIC9ldGMvc3lzY29uZmlnLyREQUVNT04KKworWyAtbiAiJENMVk1EX0NMVVNURVJfSUZBQ0UiIF0gJiYgQ0xWTURPUFRTPSIkQ0xWTURPUFRTIC1JICRDTFZNRF9DTFVTVEVSX0lGQUNFIiAKKworIyBhbGxvdyB1cCB0byAkQ0xWTURfU1RPUF9USU1FT1VUIHNlY29uZHMgdG8gY2x2bWQgdG8gY29tcGxldGUgZXhpdCBvcGVyYXRpb25zCisjIGRlZmF1bHQgdG8gMTAgc2Vjb25kcworCitbIC16ICRDTFZNRF9TVE9QX1RJTUVPVVQgXSAmJiBDTFZNRF9TVE9QX1RJTUVPVVQ9MTAKKworTE9DS19GSUxFPSIvdmFyL2xvY2svc3Vic3lzLyREQUVNT04iCisKK2NsdXN0ZXJlZF92Z3MoKSB7CisJJHtsdm1fdmdzfSAtLW5vaGVhZGluZ3MgLW8gdmdfbmFtZSAtUyAndmdfY2x1c3RlcmVkPTEnIDI+L2Rldi9udWxsCit9CisKK2NsdXN0ZXJlZF9hY3RpdmVfbHZzKCkgeworCSR7bHZtX2x2c30gLS1ub2hlYWRpbmdzIC1vIGx2X25hbWUgLVMgJ3ZnX2NsdXN0ZXJlZD0xICYmIGx2X2FjdGl2ZSE9IiInIDI+L2Rldi9udWxsCit9CisKK3JoX3N0YXR1cygpIHsKKwlzdGF0dXMgJERBRU1PTgorfQorCityaF9zdGF0dXNfcSgpIHsKKwlyaF9zdGF0dXMgPi9kZXYvbnVsbCAyPiYxCit9CisKK3N0YXJ0KCkKK3sKKwlpZiAhIHJoX3N0YXR1c19xOyB0aGVuCisJCWVjaG8gLW4gIlN0YXJ0aW5nICREQUVNT046ICIKKwkJJERBRU1PTiAkQ0xWTURPUFRTIHx8IHJldHVybiAkPworCQllY2hvCisJZmkKKworCSMgUmVmcmVzaCBsb2NhbCBjYWNoZS4KKwkjCisJIyBJdCdzIHBvc3NpYmxlIHRoYXQgbmV3IFBWcyB3ZXJlIGFkZGVkIHRvIHRoaXMsIG9yIG90aGVyIFZHcworCSMgd2hpbGUgdGhpcyBub2RlIHdhcyBkb3duLiBTbyB3ZSBydW4gdmdzY2FuIGhlcmUgdG8gYXZvaWQKKwkjIGFueSBwb3RlbnRpYWwgIk1pc3NpbmcgVVVJRCIgbWVzc2FnZXMgd2l0aCBzdWJzZXF1ZW50CisJIyBMVk0gY29tbWFuZHMuCisKKwkjIFRoZSBmb2xsb3dpbmcgc3RlcCB3b3VsZCBiZSBiZXR0ZXIgYW5kIG1vcmUgaW5mb3JtYXRpdmUgdG8gdGhlIHVzZXI6CisJIyAnYWN0aW9uICJSZWZyZXNoaW5nIFZHKHMpIGxvY2FsIGNhY2hlOiIgJHtsdm1fdmdzY2FufScKKwkjIGJ1dCBpdCBjb3VsZCBzaG93IHdhcm5pbmdzIHN1Y2ggYXM6CisJIyAnY2x2bWQgbm90IHJ1bm5pbmcgb24gbm9kZSB4LXkteiAgVW5hYmxlIHRvIG9idGFpbiBnbG9iYWwgbG9jay4nCisJIyBhbmQgdGhlIGFjdGlvbiB3b3VsZCBiZSBzaG93biBhcyBGQUlMRUQgd2hlbiBpbiByZWFsaXR5IGl0IGRpZG4ndC4KKwkjIElkZWFsbHkgdmdzY2FuIHNob3VsZCBoYXZlIGEgc3RhcnR1cCBtb2RlIHRoYXQgd291bGQgbm90IHByaW50CisJIyB1bm5lY2Vzc2FyeSB3YXJuaW5ncy4KKworCSR7bHZtX3Znc2Nhbn0gPiAvZGV2L251bGwgMj4mMQorCisJYWN0aW9uICJBY3RpdmF0aW5nIFZHKHMpOiIgJHtsdm1fdmdjaGFuZ2V9IC1hYXkgJExWTV9WR1MgfHwgcmV0dXJuICQ/CisKKwl0b3VjaCAkTE9DS19GSUxFCisKKwlyZXR1cm4gMAorfQorCit3YWl0X2Zvcl9maW5pc2goKQoreworCWNvdW50PTAKKwl3aGlsZSBbICIkY291bnQiIC1sZSAiJENMVk1EX1NUT1BfVElNRU9VVCIgXSAmJiBcCisJCSByaF9zdGF0dXNfcSBdOyBkbworCQlzbGVlcCAxCisJCWNvdW50PSQoKGNvdW50KzEpKQorCWRvbmUKKworCSEgcmhfc3RhdHVzX3EKK30KKworc3RvcCgpCit7CisJcmhfc3RhdHVzX3EgfHwgcmV0dXJuIDAKKworCVsgLXogIiRMVk1fVkdTIiBdICYmIExWTV9WR1M9IiQoY2x1c3RlcmVkX3ZncykiCisJaWYgWyAtbiAiJExWTV9WR1MiIF07IHRoZW4KKwkJYWN0aW9uICJEZWFjdGl2YXRpbmcgY2x1c3RlcmVkIFZHKHMpOiIgJHtsdm1fdmdjaGFuZ2V9IC1hbmwgJExWTV9WR1MgfHwgcmV0dXJuICQ/CisJZmkKKworCWFjdGlvbiAiU2lnbmFsaW5nICREQUVNT04gdG8gZXhpdCIga2lsbCAtVEVSTSAkKHBpZG9mcHJvYyAkREFFTU9OKSB8fCByZXR1cm4gJD8KKworCSMgd2FpdCBoYWxmIHNlY29uZCBiZWZvcmUgd2Ugc3RhcnQgdGhlIHdhaXRpbmcgbG9vcCBvciB3ZSB3aWxsIHNob3cKKwkjIHRoZSBsb29wIG1vcmUgdGltZSB0aGFuIHJlYWxseSBuZWNlc3NhcnkKKwl1c2xlZXAgNTAwMDAwCisKKwkjIGNsdm1kIGNvdWxkIHRha2Ugc29tZSB0aW1lIHRvIHN0b3AKKwlyaF9zdGF0dXNfcSAmJiBhY3Rpb24gIldhaXRpbmcgZm9yICREQUVNT04gdG8gZXhpdDoiIHdhaXRfZm9yX2ZpbmlzaAorCisJaWYgcmhfc3RhdHVzX3E7IHRoZW4KKwkJZWNobyAtbiAiJERBRU1PTiBmYWlsZWQgdG8gZXhpdCIKKwkJZmFpbHVyZQorCQllY2hvCisJCXJldHVybiAxCisJZWxzZQorCQllY2hvIC1uICIkREFFTU9OIHRlcm1pbmF0ZWQiCisJCXN1Y2Nlc3MKKwkJZWNobworCWZpCisKKwlybSAtZiAkTE9DS19GSUxFCisKKwlyZXR1cm4gMAorfQorCityZWxvYWQoKSB7CisJcmhfc3RhdHVzX3EgfHwgZXhpdCA3CisJYWN0aW9uICJSZWxvYWRpbmcgJERBRU1PTiBjb25maWd1cmF0aW9uOiAiICREQUVNT04gLVIgfHwgcmV0dXJuICQ/Cit9CisKK3Jlc3RhcnQoKSB7CisJIyBpZiBzdG9wIGZhaWxzLCByZXN0YXJ0IHdpbGwgcmV0dXJuIHRoZSBlcnJvciBhbmQgbm90IGF0dGVtcHQKKwkjIGFub3RoZXIgc3RhcnQuIEV2ZW4gaWYgc3RhcnQgaXMgcHJvdGVjdGVkIGJ5IHJoX3N0YXR1c19xLAorCSMgdGhhdCB3b3VsZCBhdm9pZCBzcGF3bmluZyBhbm90aGVyIGRhZW1vbiwgaXQgd291bGQgdHJ5IHRvCisJIyByZWFjdGl2YXRlIHRoZSBWR3MuCisKKwkjIFRyeSB0byBnZXQgY2x2bWQgdG8gcmVzdGFydCBpdHNlbGYuIFRoaXMgd2lsbCBwcmVzZXJ2ZSAKKwkjIGV4Y2x1c2l2ZSBMViBsb2NrcworCWFjdGlvbiAiUmVzdGFydGluZyAkREFFTU9OOiAiICREQUVNT04gLVMKKworCSMgSWYgdGhhdCBmYWlscyB0aGVuIGRvIGEgbm9ybWFsIHN0b3AgJiByZXN0YXJ0CisJaWYgIFsgJD8gIT0gMCBdOyB0aGVuCisJICAgIHN0b3AgJiYgc3RhcnQKKwkgICAgcmV0dXJuICQ/CisJZWxzZQorCSAgICB0b3VjaCAkTE9DS19GSUxFCisJICAgIHJldHVybiAwCisJZmkKK30KKworWyAiJEVVSUQiICE9ICIwIiBdICYmIHsKKwllY2hvICJjbHZtZCBpbml0IHNjcmlwdCBjYW4gb25seSBiZSBleGVjdXRlZCBhcyByb290IHVzZXIiCisJZXhpdCA0Cit9CisKKyMgU2VlIGhvdyB3ZSB3ZXJlIGNhbGxlZC4KK2Nhc2UgIiQxIiBpbgorICBzdGFydCkKKwlzdGFydAorCXJ0cm49JD8KKwk7OworCisgIHN0b3ApCisJc3RvcAorCXJ0cm49JD8KKwk7OworCisgIHJlc3RhcnR8Zm9yY2UtcmVsb2FkKQorCXJlc3RhcnQKKwlydHJuPSQ/CisJOzsKKworICBjb25kcmVzdGFydHx0cnktcmVzdGFydCkKKwlyaF9zdGF0dXNfcSB8fCBleGl0IDAKKwlyZXN0YXJ0CisJcnRybj0kPyAKKwk7OworCisgIHJlbG9hZCkKKwlyZWxvYWQKKwlydHJuPSQ/CisJOzsKKworICBzdGF0dXMpCisJcmhfc3RhdHVzCisJcnRybj0kPworCWlmIFsgJHJ0cm4gPSAwIF07IHRoZW4KKwkJY3Zncz0iJChjbHVzdGVyZWRfdmdzKSIKKwkJZWNobyBDbHVzdGVyZWQgVm9sdW1lIEdyb3VwczogJHtjdmdzOi0iKG5vbmUpIn0KKwkJY2x2cz0iJChjbHVzdGVyZWRfYWN0aXZlX2x2cykiCisJCWVjaG8gQWN0aXZlIGNsdXN0ZXJlZCBMb2dpY2FsIFZvbHVtZXM6ICR7Y2x2czotIihub25lKSJ9CisJZmkKKwk7OworCisgICopCisJZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxzdGF0dXN8cmVzdGFydHxjb25kcmVzdGFydHx0cnktcmVzdGFydHxyZWxvYWR8Zm9yY2UtcmVsb2FkfSIKKwlydHJuPTIKKwk7OworZXNhYworCitleGl0ICRydHJuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NtaXJyb3JkX2luaXRfcmVkX2hhdC5pbiBiL3NjcmlwdHMvY21pcnJvcmRfaW5pdF9yZWRfaGF0LmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0YjdlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NtaXJyb3JkX2luaXRfcmVkX2hhdC5pbgpAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgY2hrY29uZmlnOiAtIDIyIDc4CisjIGRlc2NyaXB0aW9uOiBTdGFydHMgYW5kIHN0b3BzIGNtaXJyb3JkCisjIHBpZGZpbGU6IEBDTUlSUk9SRF9QSURGSUxFQAorIworIyBGb3IgUmVkLUhhdC1iYXNlZCBkaXN0cmlidXRpb25zIHN1Y2ggYXMgRmVkb3JhLCBSSEVMLCBDZW50T1MuCisjCisjIyMgQkVHSU4gSU5JVCBJTkZPCisjIFByb3ZpZGVzOiBjbWlycm9yZAorIyBSZXF1aXJlZC1TdGFydDogICAgICAgJG5ldHdvcmsgJHRpbWUgJGxvY2FsX2ZzCisjIFJlcXVpcmVkLVN0b3A6CSRuZXR3b3JrICR0aW1lICRsb2NhbF9mcworIyBTaG9ydC1EZXNjcmlwdGlvbjogICAgU3RhcnRzIGFuZCBzdG9wcyBjbWlycm9yZAorIyBEZXNjcmlwdGlvbjoJICBTdGFydHMgYW5kIHN0b3BzIHRoZSBjbHVzdGVyIG1pcnJvciBsb2cgZGFlbW9uCisjIyMgRU5EIElOSVQgSU5GTworCisuIC9ldGMvaW5pdC5kL2Z1bmN0aW9ucworCitEQUVNT049Y21pcnJvcmQKKworTE9DS19GSUxFPSIvdmFyL2xvY2svc3Vic3lzLyREQUVNT04iCisKK3N0YXJ0KCkKK3sKKwlydHJuPTAKKwlpZiAhIHBpZG9mICREQUVNT04gPiAvZGV2L251bGwgCisJdGhlbiAKKwkJZWNobyAtbiAiU3RhcnRpbmcgJERBRU1PTjogIgorCQlkYWVtb24gJERBRU1PTgorCQlydHJuPSQ/CisJCWVjaG8KKwlmaQorCisJcmV0dXJuICRydHJuCit9CisKK3N0b3AoKQoreworCWVjaG8gLW4gIlN0b3BwaW5nICREQUVNT046IgorCWtpbGxwcm9jICREQUVNT04gLVRFUk0KKwlydHJuPSQ/CisJZWNobworCisJcmV0dXJuICRydHJuCit9CisKK3dhaXRfZm9yX2ZpbmlzaCgpCit7CisJY291bnQ9MAorCisJd2hpbGUgWyAiJGNvdW50IiAtbGUgMTAgLWEgLW4gImBwaWRvZiAkREFFTU9OYCIgXQorCWRvCisJCXNsZWVwIDEKKwkJY291bnQ9JCgoY291bnQgKyAxKSkKKwlkb25lCisJCisJaWYgWyBgcGlkb2YgJERBRU1PTmAgXQorCXRoZW4KKwkJcmV0dXJuIDEKKwllbHNlCisJCXJldHVybiAwCisJZmkKK30KKworY21pcnJvcl9zdGF0dXMoKQoreworCXN0YXR1cyAkREFFTU9OCit9CisKK3J0cm49MQorCisjIFNlZSBob3cgd2Ugd2VyZSBjYWxsZWQuCitjYXNlICIkMSIgaW4KKwlzdGFydCkKKwkJc3RhcnQKKwkJcnRybj0kPworCQlbICRydHJuID0gMCBdICYmIHRvdWNoICRMT0NLX0ZJTEUKKwkJOzsKKworCXN0b3ApCisJCXN0b3AKKwkJcnRybj0kPworCQlbICRydHJuID0gMCBdICYmIHJtIC1mICRMT0NLX0ZJTEUKKwkJOzsKKworCXJlc3RhcnQpCisJCWlmIHN0b3AKKwkJdGhlbgorCQkJd2FpdF9mb3JfZmluaXNoCisJCQlzdGFydAorCQlmaQorCQlydHJuPSQ/CisJCTs7CisKKwlzdGF0dXMpCisJCWNtaXJyb3Jfc3RhdHVzCisJCXJ0cm49JD8KKwkJaWYgWyAkcnRybiAtZXEgMCBdOyB0aGVuCisJCQllY2hvICJjbWlycm9yIGlzIHJ1bm5pbmcuIgorCQlmaQorCQk7OworCisJKikKKwkJZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c30iCisJCTs7Citlc2FjCisKK2V4aXQgJHJ0cm4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29tLnJlZGhhdC5sdm1kYnVzMS5jb25mIGIvc2NyaXB0cy9jb20ucmVkaGF0Lmx2bWRidXMxLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NThjNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29tLnJlZGhhdC5sdm1kYnVzMS5jb25mCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PiA8IS0tKi1ueG1sLSotLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisJImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisJPHBvbGljeSB1c2VyPSJyb290Ij4KKwkJPGFsbG93IG93bl9wcmVmaXg9ImNvbS5yZWRoYXQubHZtZGJ1czEiLz4KKwkJPGFsbG93IHNlbmRfZGVzdGluYXRpb249ImNvbS5yZWRoYXQubHZtZGJ1czEiLz4KKwk8L3BvbGljeT4KKwk8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorCQk8ZGVueSBvd25fcHJlZml4PSJjb20ucmVkaGF0Lmx2bWRidXMxIi8+CisJCTxkZW55IHNlbmRfZGVzdGluYXRpb249ImNvbS5yZWRoYXQubHZtZGJ1czEiLz4KKwk8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb20ucmVkaGF0Lmx2bWRidXMxLnNlcnZpY2UuaW4gYi9zY3JpcHRzL2NvbS5yZWRoYXQubHZtZGJ1czEuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc4ZWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb20ucmVkaGF0Lmx2bWRidXMxLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw1IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9Y29tLnJlZGhhdC5sdm1kYnVzMQorRXhlYz1Ac2JpbmRpckAvbHZtZGJ1c2QgLS11ZGV2CitVc2VyPXJvb3QKK1N5c3RlbWRTZXJ2aWNlPWx2bTItbHZtZGJ1c2Quc2VydmljZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kbV9ldmVudF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbiBiL3NjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MDdhYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxNyBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1EZXZpY2UtbWFwcGVyIGV2ZW50IGRhZW1vbgorRG9jdW1lbnRhdGlvbj1tYW46ZG1ldmVudGQoOCkKK1JlcXVpcmVzPWRtLWV2ZW50LnNvY2tldAorQWZ0ZXI9ZG0tZXZlbnQuc29ja2V0CitCZWZvcmU9bG9jYWwtZnMtcHJlLnRhcmdldAorRGVmYXVsdERlcGVuZGVuY2llcz1ubworCitbU2VydmljZV0KK1R5cGU9c2ltcGxlCitFeGVjU3RhcnQ9QHNiaW5kaXJAL2RtZXZlbnRkIC1mCitFbnZpcm9ubWVudD1TRF9BQ1RJVkFUSU9OPTEKK1BJREZpbGU9QERNRVZFTlREX1BJREZJTEVACitPT01TY29yZUFkanVzdD0tMTAwMAorCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RtX2V2ZW50X3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQuaW4gYi9zY3JpcHRzL2RtX2V2ZW50X3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiY2JiOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZG1fZXZlbnRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldC5pbgpAQCAtMCwwICsxLDEzIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPURldmljZS1tYXBwZXIgZXZlbnQgZGFlbW9uIEZJRk9zCitEb2N1bWVudGF0aW9uPW1hbjpkbWV2ZW50ZCg4KQorRGVmYXVsdERlcGVuZGVuY2llcz1ubworCitbU29ja2V0XQorTGlzdGVuRklGTz1AREVGQVVMVF9ETV9SVU5fRElSQC9kbWV2ZW50ZC1zZXJ2ZXIKK0xpc3RlbkZJRk89QERFRkFVTFRfRE1fUlVOX0RJUkAvZG1ldmVudGQtY2xpZW50CitTb2NrZXRNb2RlPTA2MDAKK1JlbW92ZU9uU3RvcD10cnVlCisKK1tJbnN0YWxsXQorV2FudGVkQnk9c29ja2V0cy50YXJnZXQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZnNhZG0uc2ggYi9zY3JpcHRzL2ZzYWRtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2YmUxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ZzYWRtLnNoCkBAIC0wLDAgKzEsNTM3IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjCisjIEF1dGhvcjogWmRlbmVrIEthYmVsYWMgPHprYWJlbGFjIGF0IHJlZGhhdC5jb20+CisjCisjIFNjcmlwdCBmb3IgcmVzaXppbmcgZGV2aWNlcyAodXNhYmxlIGZvciBMVk0gcmVzaXplKQorIworIyBOZWVkZWQgdXRpbGl0aWVzOgorIyAgIG1vdW50LCB1bW91bnQsIGdyZXAsIHJlYWRsaW5rLCBibG9ja2RldiwgYmxraWQsIGZzY2ssIHhmc19jaGVjaworIworIyBleHQyL2V4dDMvZXh0NDogcmVzaXplMmZzLCB0dW5lMmZzCisjIHJlaXNlcmZzOiByZXNpemVfcmVpc2VyZnMsIHJlaXNlcmZzdHVuZQorIyB4ZnM6IHhmc19ncm93ZnMsIHhmc19pbmZvCisjCisjIFJldHVybiB2YWx1ZXM6CisjICAgMCBzdWNjZXNzCisjICAgMSBlcnJvcgorIyAgIDIgYnJlYWsgZGV0ZWN0ZWQKKyMgICAzIHVuc3VwcG9ydGVkIG9ubGluZSBmaWxlc3lzdGVtIGNoZWNrIGZvciBnaXZlbiBtb3VudGVkIGZzCisKK1RPT0w9ZnNhZG0KKworX1NBVkVQQVRIPSRQQVRICitQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3Ivc2JpbjokUEFUSAorCisjIHV0aWxpdGllcworVFVORV9FWFQ9dHVuZTJmcworUkVTSVpFX0VYVD1yZXNpemUyZnMKK1RVTkVfUkVJU0VSPXJlaXNlcmZzdHVuZQorUkVTSVpFX1JFSVNFUj1yZXNpemVfcmVpc2VyZnMKK1RVTkVfWEZTPXhmc19pbmZvCitSRVNJWkVfWEZTPXhmc19ncm93ZnMKKworTU9VTlQ9bW91bnQKK1VNT1VOVD11bW91bnQKK01LRElSPW1rZGlyCitSTURJUj1ybWRpcgorQkxPQ0tERVY9YmxvY2tkZXYKK0JMS0lEPWJsa2lkCitEQVRFPWRhdGUKK0dSRVA9Z3JlcAorUkVBRExJTks9cmVhZGxpbmsKK1JFQURMSU5LX0U9Ii1lIgorRlNDSz1mc2NrCitYRlNfQ0hFQ0s9eGZzX2NoZWNrCisjIFhGU19SRVBBSVIgLW4gaXMgdXNlZCB3aGVuIFhGU19DSEVDSyBpcyBub3QgZm91bmQKK1hGU19SRVBBSVI9eGZzX3JlcGFpcgorCisjIHVzZXIgbWF5IG92ZXJyaWRlIGx2bSBsb2NhdGlvbiBieSBzZXR0aW5nIExWTV9CSU5BUlkKK0xWTT0ke0xWTV9CSU5BUlk6LWx2bX0KKworWUVTPSR7X0ZTQURNX1lFU30KK0RSWT0wCitWRVJCPQorRk9SQ0U9CitFWFRPRkY9JHtfRlNBRE1fRVhUT0ZGOi0wfQorRE9fTFZSRVNJWkU9MAorRlNUWVBFPXVua25vd24KK1ZPTFVNRT11bmtub3duCitURU1QRElSPSIke1RNUERJUjotL3RtcH0vJHtUT09MfV8ke1JBTkRPTX0kJC9tIgorRE1fREVWX0RJUj0iJHtETV9ERVZfRElSOi0vZGV2fSIKK0JMT0NLU0laRT0KK0JMT0NLQ09VTlQ9CitNT1VOVFBPSU5UPQorTU9VTlRFRD0KK1JFTU9VTlQ9CitQUk9DTU9VTlRTPSIvcHJvYy9tb3VudHMiCitQUk9DU0VMRk1PVU5USU5GTz0iL3Byb2Mvc2VsZi9tb3VudGluZm8iCitOVUxMPSIkRE1fREVWX0RJUi9udWxsIgorCitJRlNfT0xEPSRJRlMKKyMgd2l0aG91dCBiYXNoICQnXG4nCitOTD0nCisnCisKK3Rvb2xfdXNhZ2UoKSB7CisJZWNobyAiJHtUT09MfTogVXRpbGl0eSB0byByZXNpemUgb3IgY2hlY2sgdGhlIGZpbGVzeXN0ZW0gb24gYSBkZXZpY2UiCisJZWNobworCWVjaG8gIiAgJHtUT09MfSBbb3B0aW9uc10gY2hlY2sgPGRldmljZT4iCisJZWNobyAiICAgIC0gQ2hlY2sgdGhlIGZpbGVzeXN0ZW0gb24gZGV2aWNlIHVzaW5nIGZzY2siCisJZWNobworCWVjaG8gIiAgJHtUT09MfSBbb3B0aW9uc10gcmVzaXplIDxkZXZpY2U+IFs8bmV3X3NpemU+W0JLTUdUUEVdXSIKKwllY2hvICIgICAgLSBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZpbGVzeXN0ZW0gb24gZGV2aWNlIHRvIG5ld19zaXplIgorCWVjaG8KKwllY2hvICIgIE9wdGlvbnM6IgorCWVjaG8gIiAgICAtaCB8IC0taGVscCAgICAgICAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2UiCisJZWNobyAiICAgIC12IHwgLS12ZXJib3NlICAgICAgQmUgdmVyYm9zZSIKKwllY2hvICIgICAgLWUgfCAtLWV4dC1vZmZsaW5lICB1bm1vdW50IGZpbGVzeXN0ZW0gYmVmb3JlIGV4dDIvZXh0My9leHQ0IHJlc2l6ZSIKKwllY2hvICIgICAgLWYgfCAtLWZvcmNlICAgICAgICBCeXBhc3Mgc2FuaXR5IGNoZWNrcyIKKwllY2hvICIgICAgLW4gfCAtLWRyeS1ydW4gICAgICBQcmludCBjb21tYW5kcyB3aXRob3V0IHJ1bm5pbmcgdGhlbSIKKwllY2hvICIgICAgLWwgfCAtLWx2cmVzaXplICAgICBSZXNpemUgZ2l2ZW4gZGV2aWNlIChpZiBpdCBpcyBMVk0gZGV2aWNlKSIKKwllY2hvICIgICAgLXkgfCAtLXllcyAgICAgICAgICBBbnN3ZXIgXCJ5ZXNcIiBhdCBhbnkgcHJvbXB0cyIKKwllY2hvCisJZWNobyAiICBuZXdfc2l6ZSAtIEFic29sdXRlIG51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyB0byBiZSBpbiB0aGUgZmlsZXN5c3RlbSwiCisJZWNobyAiICAgICAgICAgICAgIG9yIGFuIGFic29sdXRlIHNpemUgdXNpbmcgYSBzdWZmaXggKGluIHBvd2VycyBvZiAxMDI0KS4iCisJZWNobyAiICAgICAgICAgICAgIElmIG5ld19zaXplIGlzIG5vdCBzdXBwbGllZCwgdGhlIHdob2xlIGRldmljZSBpcyB1c2VkLiIKKworCWV4aXQKK30KKwordmVyYm9zZSgpIHsKKwl0ZXN0IC1uICIkVkVSQiIgJiYgZWNobyAiJFRPT0w6ICRAIiB8fCB0cnVlCit9CisKK2Vycm9yKCkgeworCWVjaG8gIiRUT09MOiAkQCIgPiYyCisJY2xlYW51cCAxCit9CisKK2RyeSgpIHsKKwlpZiBbICIkRFJZIiAtbmUgMCBdOyB0aGVuCisJCXZlcmJvc2UgIkRyeSBleGVjdXRpb24gJEAiCisJCXJldHVybiAwCisJZmkKKwl2ZXJib3NlICJFeGVjdXRpbmcgJEAiCisJIiRAIgorfQorCitjbGVhbnVwKCkgeworCXRyYXAgJycgMgorCSMgcmVzZXQgTU9VTlRQT0lOVCAtIGF2b2lkIHJlY3Vyc2lvbgorCXRlc3QgIiRNT1VOVFBPSU5UIiA9ICIkVEVNUERJUiIgJiYgTU9VTlRQT0lOVD0iIiB0ZW1wX3Vtb3VudAorCWlmIFsgLW4gIiRSRU1PVU5UIiBdOyB0aGVuCisJCXZlcmJvc2UgIlJlbW91bnRpbmcgdW5tb3VudGVkIGZpbGVzeXN0ZW0gYmFjayIKKwkJZHJ5ICIkTU9VTlQiICIkVk9MVU1FIiAiJE1PVU5URUQiCisJZmkKKwlJRlM9JElGU19PTEQKKwl0cmFwIDIKKworCXRlc3QgIiQxIiAtZXEgMiAmJiB2ZXJib3NlICJCcmVhayBkZXRlY3RlZCIKKworCWlmIFsgIiRET19MVlJFU0laRSIgLWVxIDIgXTsgdGhlbgorCQkjIHN0YXJ0IExWUkVTSVpFIHdpdGggdGhlIGZpbGVzeXN0ZW0gbW9kaWZpY2F0aW9uIGZsYWcKKwkJIyBhbmQgYWxsb3cgcmVjdXJzaXZlIGNhbGwgb2YgZnNhZG0KKwkJX0ZTQURNX1lFUz0kWUVTCisJCV9GU0FETV9FWFRPRkY9JEVYVE9GRgorCQlleHBvcnQgX0ZTQURNX1lFUyBfRlNBRE1fRVhUT0ZGCisJCXVuc2V0IEZTQURNX1JVTk5JTkcKKwkJdGVzdCAtbiAiJExWTV9CSU5BUlkiICYmIFBBVEg9JF9TQVZFUEFUSAorCQlkcnkgZXhlYyAiJExWTSIgbHZyZXNpemUgJFZFUkIgJEZPUkNFIC1yIC1MJHtORVdTSVpFfWIgIiRWT0xVTUVfT1JJRyIKKwlmaQorCisJIyBlcnJvciBleGl0IHN0YXR1cyBmb3IgYnJlYWsKKwlleGl0ICR7MTotMX0KK30KKworIyBjb252ZXJ0IHBhcmFtZXRlciBmcm9tIEV4YS9QZXRhL1RlcmEvR2lnYS9NZWdhL0tpbG8vQnl0ZXMgYW5kIGJsb2NrcworIyAoMl4oNjAvNTAvNDAvMzAvMjAvMTAvMCkpCitkZWNvZGVfc2l6ZSgpIHsKKwljYXNlICIkMSIgaW4KKwkgKltlRV0pIE5FV1NJWkU9JCgoICR7MSVbZUVdfSAqIDExNTI5MjE1MDQ2MDY4NDY5NzYgKSkgOzsKKwkgKltwUF0pIE5FV1NJWkU9JCgoICR7MSVbcFBdfSAqIDExMjU4OTk5MDY4NDI2MjQgKSkgOzsKKwkgKlt0VF0pIE5FV1NJWkU9JCgoICR7MSVbdFRdfSAqIDEwOTk1MTE2Mjc3NzYgKSkgOzsKKwkgKltnR10pIE5FV1NJWkU9JCgoICR7MSVbZ0ddfSAqIDEwNzM3NDE4MjQgKSkgOzsKKwkgKlttTV0pIE5FV1NJWkU9JCgoICR7MSVbbU1dfSAqIDEwNDg1NzYgKSkgOzsKKwkgKltrS10pIE5FV1NJWkU9JCgoICR7MSVba0tdfSAqIDEwMjQgKSkgOzsKKwkgKltiQl0pIE5FV1NJWkU9JHsxJVtiQl19IDs7CisJICAgICAqKSBORVdTSVpFPSQoKCAkMSAqICQyICkpIDs7CisJZXNhYworCSNORVdCTE9DS0NPVU5UPSQocm91bmRfYmxvY2tfc2l6ZSAkTkVXU0laRSAkMikKKwlORVdCTE9DS0NPVU5UPSQoKCAkTkVXU0laRSAvICQyICkpCisKKwlpZiBbICRET19MVlJFU0laRSAtZXEgMSBdOyB0aGVuCisJCSMgc3RhcnQgbHZyZXNpemUsIGJ1dCBmaXJzdCBjbGVhbnVwIG1vdW50ZWQgZGlycworCQlET19MVlJFU0laRT0yCisJCWNsZWFudXAgMAorCWZpCit9CisKKyMgZGV0ZWN0IGZpbGVzeXN0ZW0gb24gdGhlIGdpdmVuIGRldmljZQorIyBkZXJlZmVyZW5jZSBkZXZpY2UgbmFtZSBpZiBpdCBpcyBzeW1ib2xpYyBsaW5rCitkZXRlY3RfZnMoKSB7CisJVk9MVU1FX09SSUc9JDEKKwlWT0xVTUU9JHsxLyMiJHtETV9ERVZfRElSfS8iL30KKwlWT0xVTUU9JCgiJFJFQURMSU5LIiAkUkVBRExJTktfRSAiJERNX0RFVl9ESVIvJFZPTFVNRSIpIHx8IGVycm9yICJDYW5ub3QgZ2V0IHJlYWRsaW5rIFwiJDFcIiIKKwlSVk9MVU1FPSRWT0xVTUUKKwljYXNlICIkUlZPTFVNRSIgaW4KKyAgICAgICAgICAjIGhhcmRjb2RlZCAvZGV2ICBzaW5jZSB1ZGV2IGRvZXMgbm90IGNyZWF0ZSB0aGVzZSBlbnRyaWVzIGVsc2V3aGVyZQorCSAgL2Rldi9kbS1bMC05XSopCisJCXJlYWQgPC9zeXMvYmxvY2svJHtSVk9MVU1FIy9kZXYvfS9kbS9uYW1lIFNZU1ZPTFVNRSAyPiYxICYmIFZPTFVNRT0iJERNX0RFVl9ESVIvbWFwcGVyLyRTWVNWT0xVTUUiCisJCXJlYWQgPC9zeXMvYmxvY2svJHtSVk9MVU1FIy9kZXYvfS9kZXYgTUFKT1JNSU5PUiAyPiYxIHx8IGVycm9yICJDYW5ub3QgZ2V0IG1ham9yOm1pbm9yIGZvciBcIiRWT0xVTUVcIiIKKwkJOzsKKwkgICopCisJCVNUQVQ9JChzdGF0IC0tZm9ybWF0ICJNQUpPUj0ldCBNSU5PUj0lVCIgJHtSVk9MVU1FfSkgfHwgZXJyb3IgIkNhbm5vdCBnZXQgbWFqb3I6bWlub3IgZm9yIFwiJFZPTFVNRVwiIgorCQlldmFsICRTVEFUCisJCU1BSk9SPSQoKDB4JHtNQUpPUn0pKQorCQlNSU5PUj0kKCgweCR7TUlOT1J9KSkKKwkJTUFKT1JNSU5PUj0ke01BSk9SfToke01JTk9SfQorCQk7OworCWVzYWMKKwkjIHVzZSBudWxsIGRldmljZSBhcyBjYWNoZSBmaWxlIHRvIGJlIHN1cmUgYWJvdXQgdGhlIHJlc3VsdAorCSMgbm90IHVzaW5nIG9wdGlvbiAnLW8gdmFsdWUnIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIGJsa2lkCisJRlNUWVBFPSQoIiRCTEtJRCIgLWMgIiROVUxMIiAtcyBUWVBFICIkVk9MVU1FIikgfHwgZXJyb3IgIkNhbm5vdCBnZXQgRlNUWVBFIG9mIFwiJFZPTFVNRVwiIgorCUZTVFlQRT0ke0ZTVFlQRSMjKlRZUEU9XCJ9ICMgY3V0IHF1b3RhdGlvbiBtYXJrcworCUZTVFlQRT0ke0ZTVFlQRSUlXCIqfQorCXZlcmJvc2UgIlwiJEZTVFlQRVwiIGZpbGVzeXN0ZW0gZm91bmQgb24gXCIkVk9MVU1FXCIiCit9CisKK2RldGVjdF9tb3VudGVkX3dpdGhfcHJvY19zZWxmX21vdW50aW5mbygpICB7CisJTU9VTlRFRD0kKCIkR1JFUCIgIl5bMC05XSogWzAtOV0qICRNQUpPUk1JTk9SICIgIiRQUk9DU0VMRk1PVU5USU5GTyIpCisKKwkjIGV4dHJhY3QgNXRoIGZpZWxkIHdoaWNoIGlzIG1vdW50IHBvaW50CisJIyBlY2hvIC1lIHRyYW5zbGF0ZXMgXDA0MCB0byBzcGFjZXMKKwlNT1VOVEVEPSQoZWNobyAke01PVU5URUR9IHwgY3V0IC1kICIgIiAtZiA1KQorCU1PVU5URUQ9JChlY2hvIC1uIC1lICR7TU9VTlRFRH0pCisKKwl0ZXN0IC1uICIkTU9VTlRFRCIKK30KKworZGV0ZWN0X21vdW50ZWRfd2l0aF9wcm9jX21vdW50cygpICB7CisJTU9VTlRFRD0kKCIkR1JFUCIgIl4kVk9MVU1FWyBcdF0iICIkUFJPQ01PVU5UUyIpCisKKwkjIGZvciBlbXB0eSBzdHJpbmcgdHJ5IGFnYWluIHdpdGggcmVhbCB2b2x1bWUgbmFtZQorCXRlc3QgLXogIiRNT1VOVEVEIiAmJiBNT1VOVEVEPSQoIiRHUkVQIiAiXiRSVk9MVU1FWyBcdF0iICIkUFJPQ01PVU5UUyIpCisKKwkjIGN1dCBkZXZpY2UgbmFtZSBwcmVmaXggYW5kIHRyaW0gZXZlcnl0aGluZyBwYXN0IG1vdW50cG9pbnQKKwkjIGVjaG8gdHJhbnNsYXRlcyBcMDQwIHRvIHNwYWNlcworCU1PVU5URUQ9JHtNT1VOVEVEIyogfQorCU1PVU5URUQ9JChlY2hvIC1uIC1lICR7TU9VTlRFRCUlICp9KQorCisJIyBmb3Igc3lzdGVtcyB3aXRoIGRpZmZlcmVudCBkZXZpY2UgbmFtZXMgLSBjaGVjayBhbHNvIG1vdW50IG91dHB1dAorCWlmIHRlc3QgLXogIiRNT1VOVEVEIiA7IHRoZW4KKwkJTU9VTlRFRD0kKExDX0FMTD1DICIkTU9VTlQiIHwgIiRHUkVQIiAiXiRWT0xVTUVbIFx0XSIpCisJCXRlc3QgLXogIiRNT1VOVEVEIiAmJiBNT1VOVEVEPSQoTENfQUxMPUMgIiRNT1VOVCIgfCAiJEdSRVAiICJeJFJWT0xVTUVbIFx0XSIpCisJCU1PVU5URUQ9JHtNT1VOVEVEIyMqIG9uIH0KKwkJTU9VTlRFRD0ke01PVU5URUQlIHR5cGUgKn0gIyBhbGxvdyB0eXBlIGluIHRoZSBtb3VudCBuYW1lCisJZmkKKworCXRlc3QgLW4gIiRNT1VOVEVEIgorfQorCisjIGNoZWNrIGlmIHRoZSBnaXZlbiBkZXZpY2UgaXMgYWxyZWFkeSBtb3VudGVkIGFuZCB3aGVyZQorIyBGSVhNRTogcmVzb2x2ZSBzd2FwIHVzYWdlIGFuZCBkZXZpY2Ugc3RhY2tpbmcKK2RldGVjdF9tb3VudGVkKCkgIHsKKwlpZiB0ZXN0IC1lICIkUFJPQ1NFTEZNT1VOVElORk8iOyB0aGVuCisJCWRldGVjdF9tb3VudGVkX3dpdGhfcHJvY19zZWxmX21vdW50aW5mbworCWVsaWYgdGVzdCAtZSAiJFBST0NNT1VOVFMiOyB0aGVuCisJCWRldGVjdF9tb3VudGVkX3dpdGhfcHJvY19tb3VudHMKKwllbHNlCisJCWVycm9yICJDYW5ub3QgZGV0ZWN0IG1vdW50ZWQgZGV2aWNlIFwiJFZPTFVNRVwiIgorCWZpCit9CisKKyMgZ2V0IHRoZSBmdWxsIHNpemUgb2YgZGV2aWNlIGluIGJ5dGVzCitkZXRlY3RfZGV2aWNlX3NpemUoKSB7CisJIyBjaGVjayBpZiBibG9ja2RldiBzdXBwb3J0cyBnZXRzaXplNjQKKwkiJEJMT0NLREVWIiAyPiYxIHwgIiRHUkVQIiBnZXRzaXplNjQgPiIkTlVMTCIKKwlpZiB0ZXN0ICQ/IC1lcSAwOyB0aGVuCisJCURFVlNJWkU9JCgiJEJMT0NLREVWIiAtLWdldHNpemU2NCAiJFZPTFVNRSIpIHx8IGVycm9yICJDYW5ub3QgcmVhZCBzaXplIG9mIGRldmljZSBcIiRWT0xVTUVcIiIKKwllbHNlCisJCURFVlNJWkU9JCgiJEJMT0NLREVWIiAtLWdldHNpemUgIiRWT0xVTUUiKSB8fCBlcnJvciAiQ2Fubm90IHJlYWQgc2l6ZSBvZiBkZXZpY2UgXCIkVk9MVU1FXCIiCisJCVNTU0laRT0kKCIkQkxPQ0tERVYiIC0tZ2V0c3MgIiRWT0xVTUUiKSB8fCBlcnJvciAiQ2Fubm90IGJsb2NrIHNpemUgcmVhZCBkZXZpY2UgXCIkVk9MVU1FXCIiCisJCURFVlNJWkU9JCgoJERFVlNJWkUgKiAkU1NTSVpFKSkKKwlmaQorfQorCisjIHJvdW5kIHVwICQxIC8gJDIKKyMgY291bGQgYmUgbmVlZGVkIHRvIGdhdXJhbnRlZSAnYXQgbGVhc3QgZ2l2ZW4gc2l6ZScKKyMgYnV0IGl0IG1ha2VzIG1hbnkgdHJvdWJsZXMKK3JvdW5kX3VwX2Jsb2NrX3NpemUoKSB7CisJZWNobyAkKCggKCQxICsgJDIgLSAxKSAvICQyICkpCit9CisKK3RlbXBfbW91bnQoKSB7CisJZHJ5ICIkTUtESVIiIC1wIC1tIDAwMDAgIiRURU1QRElSIiB8fCBlcnJvciAiRmFpbGVkIHRvIGNyZWF0ZSAkVEVNUERJUiIKKwlkcnkgIiRNT1VOVCIgIiRWT0xVTUUiICIkVEVNUERJUiIgfHwgZXJyb3IgIkZhaWxlZCB0byBtb3VudCAkVEVNUERJUiIKK30KKwordGVtcF91bW91bnQoKSB7CisJZHJ5ICIkVU1PVU5UIiAiJFRFTVBESVIiIHx8IGVycm9yICJGYWlsZWQgdG8gdW1vdW50IFwiJFRFTVBESVJcIiIKKwlkcnkgIiRSTURJUiIgIiR7VEVNUERJUn0iIHx8IGVycm9yICJGYWlsZWQgdG8gcmVtb3ZlIFwiJFRFTVBESVJcIiIKKwlkcnkgIiRSTURJUiIgIiR7VEVNUERJUiUlbX0iIHx8IGVycm9yICJGYWlsZWQgdG8gcmVtb3ZlIFwiJHtURU1QRElSJSVtfVwiIgorfQorCit5ZXNfbm8oKSB7CisJZWNobyAtbiAiJEA/IFtZfG5dICIKKworCWlmIFsgLW4gIiRZRVMiIF07IHRoZW4KKwkJZWNobyB5IDsgcmV0dXJuIDAKKwlmaQorCisJd2hpbGUgcmVhZCAtciAtcyAtbiAxIEFOUyA7IGRvCisJCWNhc2UgIiRBTlMiIGluCisJCSAieSIgfCAiWSIgfCAiIikgZWNobyB5IDsgcmV0dXJuIDAgOzsKKwkJICJuIiB8ICJOIikgZWNobyBuIDsgcmV0dXJuIDEgOzsKKwkJZXNhYworCWRvbmUKK30KKwordHJ5X3Vtb3VudCgpIHsKKwl5ZXNfbm8gIkRvIHlvdSB3YW50IHRvIHVubW91bnQgXCIkTU9VTlRFRFwiIiAmJiBkcnkgIiRVTU9VTlQiICIkTU9VTlRFRCIgJiYgcmV0dXJuIDAKKwllcnJvciAiQ2Fubm90IHByb2NlZWQgd2l0aCBtb3VudGVkIGZpbGVzeXN0ZW0gXCIkTU9VTlRFRFwiIgorfQorCit2YWxpZGF0ZV9wYXJzaW5nKCkgeworCXRlc3QgLW4gIiRCTE9DS1NJWkUiICYmIHRlc3QgLW4gIiRCTE9DS0NPVU5UIiB8fCBlcnJvciAiQ2Fubm90IHBhcnNlICQxIG91dHB1dCIKK30KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZXNpemUgZXh0Mi9leHQzL2V4dDQgZmlsZXN5c3RlbQorIyAtIHVubW91bnRlZCBvciBtb3VudGVkIGZvciB1cHNpemUKKyMgLSB1bm1vdW50ZWQgZm9yIGRvd25zaXplCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Jlc2l6ZV9leHQoKSB7CisJdmVyYm9zZSAiUGFyc2luZyAkVFVORV9FWFQgLWwgXCIkVk9MVU1FXCIiCisJZm9yIGkgaW4gJChMQ19BTEw9QyAiJFRVTkVfRVhUIiAtbCAiJFZPTFVNRSIpOyBkbworCQljYXNlICIkaSIgaW4KKwkJICAiQmxvY2sgc2l6ZSIqKSBCTE9DS1NJWkU9JHtpIyMqICB9IDs7CisJCSAgIkJsb2NrIGNvdW50IiopIEJMT0NLQ09VTlQ9JHtpIyMqICB9IDs7CisJCWVzYWMKKwlkb25lCisJdmFsaWRhdGVfcGFyc2luZyAiJFRVTkVfRVhUIgorCWRlY29kZV9zaXplICQxICRCTE9DS1NJWkUKKwlGU0ZPUkNFPSRGT1JDRQorCisJaWYgWyAiJE5FV0JMT0NLQ09VTlQiIC1sdCAiJEJMT0NLQ09VTlQiIC1vICIkRVhUT0ZGIiAtZXEgMSBdOyB0aGVuCisJCWRldGVjdF9tb3VudGVkICYmIHZlcmJvc2UgIiRSRVNJWkVfRVhUIG5lZWRzIHVubW91bnRlZCBmaWxlc3lzdGVtIiAmJiB0cnlfdW1vdW50CisJCVJFTU9VTlQ9JE1PVU5URUQKKwkJaWYgdGVzdCAtbiAiJE1PVU5URUQiIDsgdGhlbgorCQkJIyBGb3JjZWQgZnNjayAtZiBmb3IgdW1vdW50ZWQgZXh0WCBmaWxlc3lzdGVtLgorCQkJY2FzZSAiJC0iIGluCisJCQkgICppKikgZHJ5ICIkRlNDSyIgJFlFUyAtZiAiJFZPTFVNRSIgOzsKKwkJCSAgKikgZHJ5ICIkRlNDSyIgLWYgLXAgIiRWT0xVTUUiIDs7CisJCQllc2FjCisJCWZpCisJZmkKKworCXZlcmJvc2UgIlJlc2l6aW5nIGZpbGVzeXN0ZW0gb24gZGV2aWNlIFwiJFZPTFVNRVwiIHRvICRORVdTSVpFIGJ5dGVzICgkQkxPQ0tDT1VOVCAtPiAkTkVXQkxPQ0tDT1VOVCBibG9ja3Mgb2YgJEJMT0NLU0laRSBieXRlcykiCisJZHJ5ICIkUkVTSVpFX0VYVCIgJEZTRk9SQ0UgIiRWT0xVTUUiICRORVdCTE9DS0NPVU5UCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlc2l6ZSByZWlzZXJmcyBmaWxlc3lzdGVtCisjIC0gdW5tb3VudGVkIGZvciB1cHNpemUKKyMgLSB1bm1vdW50ZWQgZm9yIGRvd25zaXplCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcmVzaXplX3JlaXNlcigpIHsKKwlkZXRlY3RfbW91bnRlZCAmJiB2ZXJib3NlICJSZWlzZXJGUyByZXNpemVzIG9ubHkgdW5tb3VudGVkIGZpbGVzeXN0ZW0iICYmIHRyeV91bW91bnQKKwlSRU1PVU5UPSRNT1VOVEVECisJdmVyYm9zZSAiUGFyc2luZyAkVFVORV9SRUlTRVIgXCIkVk9MVU1FXCIiCisJZm9yIGkgaW4gJChMQ19BTEw9QyAiJFRVTkVfUkVJU0VSIiAiJFZPTFVNRSIpOyBkbworCQljYXNlICIkaSIgaW4KKwkJICAiQmxvY2tzaXplIiopIEJMT0NLU0laRT0ke2kjIyo6IH0gOzsKKwkJICAiQ291bnQgb2YgYmxvY2tzIiopIEJMT0NLQ09VTlQ9JHtpIyMqOiB9IDs7CisJCWVzYWMKKwlkb25lCisJdmFsaWRhdGVfcGFyc2luZyAiJFRVTkVfUkVJU0VSIgorCWRlY29kZV9zaXplICQxICRCTE9DS1NJWkUKKwl2ZXJib3NlICJSZXNpemluZyBcIiRWT0xVTUVcIiAkQkxPQ0tDT1VOVCAtPiAkTkVXQkxPQ0tDT1VOVCBibG9ja3MgKCRORVdTSVpFIGJ5dGVzLCBiczogJE5FV0JMT0NLQ09VTlQpIgorCWlmIFsgLW4gIiRZRVMiIF07IHRoZW4KKwkJZWNobyB5IHwgZHJ5ICIkUkVTSVpFX1JFSVNFUiIgLXMgJE5FV1NJWkUgIiRWT0xVTUUiCisJZWxzZQorCQlkcnkgIiRSRVNJWkVfUkVJU0VSIiAtcyAkTkVXU0laRSAiJFZPTFVNRSIKKwlmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVzaXplIFhGUyBmaWxlc3lzdGVtCisjIC0gbW91bnRlZCBmb3IgdXBzaXplCisjIC0gY2Fubm90IGRvd25zaXplCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Jlc2l6ZV94ZnMoKSB7CisJZGV0ZWN0X21vdW50ZWQKKwlNT1VOVFBPSU5UPSRNT1VOVEVECisJaWYgWyAteiAiJE1PVU5URUQiIF07IHRoZW4KKwkJTU9VTlRQT0lOVD0kVEVNUERJUgorCQl0ZW1wX21vdW50IHx8IGVycm9yICJDYW5ub3QgbW91bnQgWGZzIGZpbGVzeXN0ZW0iCisJZmkKKwl2ZXJib3NlICJQYXJzaW5nICRUVU5FX1hGUyBcIiRNT1VOVFBPSU5UXCIiCisJZm9yIGkgaW4gJChMQ19BTEw9QyAiJFRVTkVfWEZTIiAiJE1PVU5UUE9JTlQiKTsgZG8KKwkJY2FzZSAiJGkiIGluCisJCSAgImRhdGEiKikgQkxPQ0tTSVpFPSR7aSMjKmJzaXplPX0gOyBCTE9DS0NPVU5UPSR7aSMjKmJsb2Nrcz19IDs7CisJCWVzYWMKKwlkb25lCisJQkxPQ0tTSVpFPSR7QkxPQ0tTSVpFJSVbXjAtOV0qfQorCUJMT0NLQ09VTlQ9JHtCTE9DS0NPVU5UJSVbXjAtOV0qfQorCXZhbGlkYXRlX3BhcnNpbmcgIiRUVU5FX1hGUyIKKwlkZWNvZGVfc2l6ZSAkMSAkQkxPQ0tTSVpFCisJaWYgWyAkTkVXQkxPQ0tDT1VOVCAtZ3QgJEJMT0NLQ09VTlQgXTsgdGhlbgorCQl2ZXJib3NlICJSZXNpemluZyBYZnMgbW91bnRlZCBvbiBcIiRNT1VOVFBPSU5UXCIgdG8gZmlsbCBkZXZpY2UgXCIkVk9MVU1FXCIiCisJCWRyeSAiJFJFU0laRV9YRlMiICRNT1VOVFBPSU5UCisJZWxpZiBbICRORVdCTE9DS0NPVU5UIC1lcSAkQkxPQ0tDT1VOVCBdOyB0aGVuCisJCXZlcmJvc2UgIlhmcyBmaWxlc3lzdGVtIGFscmVhZHkgaGFzIHRoZSByaWdodCBzaXplIgorCWVsc2UKKwkJZXJyb3IgIlhmcyBmaWxlc3lzdGVtIHNocmlua2luZyBpcyB1bnN1cHBvcnRlZCIKKwlmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZXNpemUgZmlsZXN5c3RlbQorIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Jlc2l6ZSgpIHsKKwlORVdTSVpFPSQyCisJZGV0ZWN0X2ZzICIkMSIKKwlkZXRlY3RfZGV2aWNlX3NpemUKKwl2ZXJib3NlICJEZXZpY2UgXCIkVk9MVU1FXCIgc2l6ZSBpcyAkREVWU0laRSBieXRlcyIKKwkjIGlmIHRoZSBzaXplIHBhcmFtZXRlciBpcyBtaXNzaW5nIHVzZSBkZXZpY2Ugc2l6ZQorCSNpZiBbIC1uICIkTkVXU0laRSIgLWEgJE5FV1NJWkUgPAorCXRlc3QgLXogIiRORVdTSVpFIiAmJiBORVdTSVpFPSR7REVWU0laRX1iCisJSUZTPSROTAorCWNhc2UgIiRGU1RZUEUiIGluCisJICAiZXh0MyJ8ImV4dDIifCJleHQ0IikgcmVzaXplX2V4dCAkTkVXU0laRSA7OworCSAgInJlaXNlcmZzIikgcmVzaXplX3JlaXNlciAkTkVXU0laRSA7OworCSAgInhmcyIpIHJlc2l6ZV94ZnMgJE5FV1NJWkUgOzsKKwkgICopIGVycm9yICJGaWxlc3lzdGVtIFwiJEZTVFlQRVwiIG9uIGRldmljZSBcIiRWT0xVTUVcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbCIgOzsKKwllc2FjIHx8IGVycm9yICJSZXNpemUgJEZTVFlQRSBmYWlsZWQiCisJY2xlYW51cCAwCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDYWxjbHVsYXRlIGRpZmYgYmV0d2VlbiB0d28gZGF0ZXMKKyMgIExDX0FMTD1DIGlucHV0IGlzIGV4cGVjdGVkIHRoZQorIyAgb25seSBvbmUgc3VwcG9ydGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RpZmZfZGF0ZXMoKSB7CisgICAgICAgICBlY2hvICQoKCAkKCIkREFURSIgLXUgLWQiJDEiICslcyAyPiIkTlVMTCIpIC0gJCgiJERBVEUiIC11IC1kIiQyIiArJXMgMj4iJE5VTEwiKSApKQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIGZpbGVzeXN0ZW0KKyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NoZWNrKCkgeworCWRldGVjdF9mcyAiJDEiCisJaWYgZGV0ZWN0X21vdW50ZWQgOyB0aGVuCisJCXZlcmJvc2UgIlNraXBwaW5nIGZpbGVzeXN0ZW0gY2hlY2sgZm9yIGRldmljZSBcIiRWT0xVTUVcIiBhcyB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIG9uICRNT1VOVEVEIjsKKwkJY2xlYW51cCAzCisJZmkKKworCWNhc2UgIiRGU1RZUEUiIGluCisJICAiZXh0MiJ8ImV4dDMifCJleHQ0IikKKwkJSUZTX0NIRUNLPSRJRlMKKwkJSUZTPSROTAorCQlmb3IgaSBpbiAkKExDX0FMTD1DICIkVFVORV9FWFQiIC1sICIkVk9MVU1FIik7IGRvCisJCQljYXNlICIkaSIgaW4KKwkJCSAgIkxhc3QgbW91bnQiKikgTEFTVE1PVU5UPSR7aSMjKjogfSA7OworCQkJICAiTGFzdCBjaGVja2VkIiopIExBU1RDSEVDS0VEPSR7aSMjKjogfSA7OworCQkJZXNhYworCQlkb25lCisJCWNhc2UgIiRMQVNUTU9VTlQiIGluCisJCSAgKiJuL2EiKSA7OyAjIG5vdGhpbmcgdG8gZG8gLSBzeXN0ZW0gd2FzIG5vdCBtb3VudGVkIHlldAorCQkgICopCisJCQlMQVNURElGRj0kKGRpZmZfZGF0ZXMgJExBU1RNT1VOVCAkTEFTVENIRUNLRUQpCisJCQlpZiB0ZXN0ICIkTEFTVERJRkYiIC1ndCAwIDsgdGhlbgorCQkJCXZlcmJvc2UgIkZpbGVzeXN0ZW0gaGFzIG5vdCBiZWVuIGNoZWNrZWQgYWZ0ZXIgdGhlIGxhc3QgbW91bnQsIHVzaW5nIGZzY2sgLWYiCisJCQkJRk9SQ0U9Ii1mIgorCQkJZmkKKwkJCTs7CisJCWVzYWMKKwkJSUZTPSRJRlNfQ0hFQ0sKKwllc2FjCisKKwljYXNlICIkRlNUWVBFIiBpbgorCSAgInhmcyIpIGlmIHdoaWNoICIkWEZTX0NIRUNLIiA+IiROVUxMIiAyPiYxIDsgdGhlbgorCQkJZHJ5ICIkWEZTX0NIRUNLIiAiJFZPTFVNRSIKKwkJIGVsc2UKKwkJCSMgUmVwbGFjZW1lbnQgZm9yIG91dGRhdGVkIHhmc19jaGVjaworCQkJIyBGSVhNRTogZm9yIHNtYWxsIGRldmljZXMgd2UgbmVlZCB0byBmb3JjZV9nZW9tZXRyeSwKKwkJCSMgc2luY2Ugd2UgcnVuIGluICctbicgbW9kZSwgaXQgc2hvdWxkbid0IGJlIHByb2JsZW0uCisJCQkjIFRoaW5rIGFib3V0IGJldHRlciB3YXkuLi4uCisJCQlkcnkgIiRYRlNfUkVQQUlSIiAtbiAtbyBmb3JjZV9nZW9tZXRyeSAiJFZPTFVNRSIKKwkJIGZpIDs7CisJICAqKSAgICAjIGNoZWNrIGlmIGV4ZWN1dGVkIGZyb20gaW50ZXJhY3RpdmUgc2hlbGwgZW52aXJvbm1lbnQKKwkJY2FzZSAiJC0iIGluCisJCSAgKmkqKSBkcnkgIiRGU0NLIiAkWUVTICRGT1JDRSAiJFZPTFVNRSIgOzsKKwkJICAqKSBkcnkgIiRGU0NLIiAkRk9SQ0UgLXAgIiRWT0xVTUUiIDs7CisJCWVzYWMKKwllc2FjCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHN0YXJ0IHBvaW50IG9mIHRoaXMgc2NyaXB0CisjIC0gcGFyc2luZyBwYXJhbWV0ZXJzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordHJhcCAiY2xlYW51cCAyIiAyCisKKyMgdGVzdCBpZiB3ZSBhcmUgbm90IGludm9rZWQgcmVjdXJzaXZlbHkKK3Rlc3QgLW4gIiRGU0FETV9SVU5OSU5HIiAmJiBleGl0IDAKKworIyB0ZXN0IHNvbWUgcHJlcmVxdWlzaXRpZXMKK2ZvciBpIGluICIkVFVORV9FWFQiICIkUkVTSVpFX0VYVCIgIiRUVU5FX1JFSVNFUiIgIiRSRVNJWkVfUkVJU0VSIiBcCisJIiRUVU5FX1hGUyIgIiRSRVNJWkVfWEZTIiAiJE1PVU5UIiAiJFVNT1VOVCIgIiRNS0RJUiIgXAorCSIkUk1ESVIiICIkQkxPQ0tERVYiICIkQkxLSUQiICIkR1JFUCIgIiRSRUFETElOSyIgXAorCSIkREFURSIgIiRGU0NLIiAiJFhGU19DSEVDSyIgIiRYRlNfUkVQQUlSIiAiJExWTSIgOyBkbworCXRlc3QgLW4gIiRpIiB8fCBlcnJvciAiUmVxdWlyZWQgY29tbWFuZCBkZWZpbml0aW9ucyBpbiB0aGUgc2NyaXB0IGFyZSBtaXNzaW5nISIKK2RvbmUKKworIiRMVk0iIHZlcnNpb24gPiIkTlVMTCIgMj4mMSB8fCBlcnJvciAiQ291bGQgbm90IHJ1biBsdm0gYmluYXJ5IFwiJExWTVwiIgorJCgiJFJFQURMSU5LIiAtZSAvID4iJE5VTEwiIDI+JjEpIHx8IFJFQURMSU5LX0U9Ii1mIgorVEVTVDY0QklUPSQoKCAxMDAwICogMTAwMDAwMDAwMDAwMCApKQordGVzdCAiJFRFU1Q2NEJJVCIgLWVxIDEwMDAwMDAwMDAwMDAwMDAgfHwgZXJyb3IgIlNoZWxsIGRvZXMgbm90IGhhbmRsZSA2NGJpdCBhcml0aG1ldGljIgorJChlY2hvIFkgfCAiJEdSRVAiIFkgPiIkTlVMTCIpIHx8IGVycm9yICJHcmVwIGRvZXMgbm90IHdvcmsgcHJvcGVybHkiCit0ZXN0ICQoIiREQVRFIiAtdSAtZCJKYW4gMDEgMDA6MDA6MDEgMTk3MCIgKyVzKSAtZXEgMSB8fCBlcnJvciAiRGF0ZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCB3b3JrIgorCisKK2lmIFsgIiQjIiAtZXEgMCBdIDsgdGhlbgorCXRvb2xfdXNhZ2UKK2ZpCisKK3doaWxlIFsgIiQjIiAtbmUgMCBdCitkbworCSBjYXNlICIkMSIgaW4KKwkgICIiKSA7OworCSAgIi1oInwiLS1oZWxwIikgdG9vbF91c2FnZSA7OworCSAgIi12InwiLS12ZXJib3NlIikgVkVSQj0iLXYiIDs7CisJICAiLW4ifCItLWRyeS1ydW4iKSBEUlk9MSA7OworCSAgIi1mInwiLS1mb3JjZSIpIEZPUkNFPSItZiIgOzsKKwkgICItZSJ8Ii0tZXh0LW9mZmxpbmUiKSBFWFRPRkY9MSA7OworCSAgIi15InwiLS15ZXMiKSBZRVM9Ii15IiA7OworCSAgIi1sInwiLS1sdnJlc2l6ZSIpIERPX0xWUkVTSVpFPTEgOzsKKwkgICJjaGVjayIpIENIRUNLPSIkMiIgOyBzaGlmdCA7OworCSAgInJlc2l6ZSIpIFJFU0laRT0iJDIiOyBORVdTSVpFPSIkMyIgOyBzaGlmdCAyIDs7CisJICAqKSBlcnJvciAiV3JvbmcgYXJndW1lbnQgXCIkMVwiLiAoc2VlOiAkVE9PTCAtLWhlbHApIgorCWVzYWMKKwlzaGlmdAorZG9uZQorCit0ZXN0ICIkWUVTIiA9ICIteSIgfHwgWUVTPQordGVzdCAiJEVYVE9GRiIgLWVxIDEgfHwgRVhUT0ZGPTAKKworaWYgWyAtbiAiJENIRUNLIiBdOyB0aGVuCisJY2hlY2sgIiRDSEVDSyIKK2VsaWYgWyAtbiAiJFJFU0laRSIgXTsgdGhlbgorCWV4cG9ydCBGU0FETV9SVU5OSU5HPSJmc2FkbSIKKwlyZXNpemUgIiRSRVNJWkUiICIkTkVXU0laRSIKK2Vsc2UKKwllcnJvciAiTWlzc2luZyBjb21tYW5kLiAoc2VlOiAkVE9PTCAtLWhlbHApIgorZmkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2RiaW5pdCBiL3NjcmlwdHMvZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk1MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZGJpbml0CkBAIC0wLDAgKzEsNjI5IEBACisjIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgQXV0aG9yKHMpOgorIwlKb25hdGhhbiBCcmFzc293IDxqYnJhc3Nvd0ByZWRoYXQuY29tPgorIworIyBDb3B5IHRoaXMgZmlsZSB0byB+Ly5nZGJpbml0IG9yIDx3b3JraW5nX2Rpcj4vLmdkYmluaXQKKworcHJpbnRmICJcblxuIgorcHJpbnRmICJMb2FkaW5nIGNvbW1hbmRzOlxuIgorcHJpbnRmICIgLSBkbV9saXN0X3NpemUgPGxpc3QgcHRyPlxuIgorcHJpbnRmICIgLSBwdl9kZXZfbmFtZSA8UFYgcHRyPlxuIgorcHJpbnRmICIgLSBmaXJzdF9zZWcgPExWIHB0cj5cbiIKK3ByaW50ZiAiIC0gbHZfc3RhdHVzIDxMViBwdHI+XG4iCitwcmludGYgIiAtIGx2X3N0YXR1c19yIDxMViBwdHI+XG4iCitwcmludGYgIiAtIGx2X2lzX21pcnJvcmVkIDxMViBwdHI+XG4iCitwcmludGYgIiAtIHNlZ19pdGVtIDxzZWcgcHRyPiA8aW5kZXg+XG4iCitwcmludGYgIiAtIHNlZ19zdGF0dXMgPHNlZyBwdHI+XG4iCitwcmludGYgIiAtIHNlZ3NfdXNpbmdfdGhpc19sdiA8c2VnIHB0cj5cbiIKK3ByaW50ZiAiIC0gc2VnX3B2cyA8bGlzdCBwdHI+XG4iCitwcmludGYgIiAtIFxuIgorcHJpbnRmICJVc2UgJ2hlbHAgPGNvbW1hbmQ+JyBmb3IgbW9yZSBpbmZvXG4iCitwcmludGYgIlxuXG4iCitwcmludGYgIlBvcHVsYXIgYnJlYWtwb2ludHM6XG4iCitwcmludGYgImJyZWFrIF9hbGxvY19pbWFnZV9jb21wb25lbnRzXG4iCitwcmludGYgInJ1biAtLXJlcGFpciAtLXVzZS1wb2xpY2llcyB2Zy9sdlxuIgorcHJpbnRmICJcblxuIgorCitzZXQgZm9sbG93LWZvcmstbW9kZSBjaGlsZAorCisjIENvbnZlbnRpb25zOgorIyBmb28gICAgIDogZnVuY3Rpb24gbmFtZWQgJ2ZvbycgYXZhaWxhYmxlIHRvIHVzZXIKKyMgX19mb28gICA6IGFuIGludGVybmFsIGZ1bmN0aW9uCisjCisjIEV4dGVybmFsIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgJ2RvY3VtZW50JworIyBzZWN0aW9uLiAgSW50ZXJuYWwgZnVuY3Rpb25zIHNob3VsZCBoYXZlIGxlYWRpbmcgY29tbWVudHMKKworCisKK2RlZmluZSBkbV9saXN0X3NpemUKKwlzZXQgJF9ETFNfbGlzdF9oZWFkID0gKHN0cnVjdCBkbV9saXN0ICopJGFyZzAKKwlzZXQgJF9ETFNfbGlzdCA9ICRfRExTX2xpc3RfaGVhZC0+bgorCXNldCAkX0RMU19zaXplID0gMAorCQorCXdoaWxlICgoJF9ETFNfbGlzdCAhPSAkX0RMU19saXN0X2hlYWQpICYmICgkX0RMU19zaXplIDwgMTAwKSkKKwkJc2V0ICRfRExTX2xpc3QgPSAkX0RMU19saXN0LT5uCisJCXNldCAkX0RMU19zaXplKysKKwllbmQKKworCXByaW50ZiAiJWQgbGlzdCBpdGVtc1xuIiwgJF9ETFNfc2l6ZQorZW5kCisKK2RvY3VtZW50IGRtX2xpc3Rfc2l6ZQorUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkbV9saXN0CisKKwlVc2FnZTogZG1fbGlzdF9zaXplIDxsaXN0IHB0cj4KK2VuZAorCitkZWZpbmUgcHZfZGV2X25hbWUKKwlzZXQgJF9QRE5fcHYgPSAoc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqKSRhcmcwCisJc2V0ICRfUEROX2RldiA9ICRfUEROX3B2LT5kZXYKKwlzZXQgJF9QRE5fc3RybCA9IChzdHJ1Y3Qgc3RyX2xpc3QgKikkX1BETl9kZXYtPmFsaWFzZXMubgorCisJcHJpbnRmICIlc1xuIiwgJF9QRE5fc3RybC0+c3RyCitlbmQKKworZG9jdW1lbnQgcHZfZGV2X25hbWUKK1ByaW50IHRoZSBuYW1lIG9mIHRoZSBQViBmb3IgdGhlIGdpdmVuIFBWIHBvaW50ZXIKKworCVVzYWdlOiBwdl9kZXZfbmFtZSA8UFYgcHRyPgorZW5kCisKK2RlZmluZSBzZWdfcHZzCisJc2V0ICRfU1BfbGlzdF9oZWFkID0gKHN0cnVjdCBkbV9saXN0ICopJGFyZzAKKwlzZXQgJF9TUF9saXN0ID0gJF9TUF9saXN0X2hlYWQtPm4KKwkKKwl3aGlsZSAoKCRfU1BfbGlzdCAhPSAkX1NQX2xpc3RfaGVhZCkgJiYgKCRfU1Bfc2l6ZSA8IDEwMCkpCisJCXNldCAkX1NQX3NwdiA9IChzdHJ1Y3Qgc2VnX3B2cyAqKSRfU1BfbGlzdAorCisJCXByaW50ZiAiKiBDYW4ndCBwcmludCBQViBsaXN0XG4iCisKKwkJc2V0ICRfU1BfbGlzdCA9ICRfU1BfbGlzdC0+bgorCWVuZAorCisJcHJpbnRmICIlZCBsaXN0IGl0ZW1zXG4iLCAkX1NQX3NpemUKK2VuZAorCitkb2N1bWVudCBzZWdfcHZzCitQcmludCB0aGUgZWxlbWVudHMgb2YgYSBzZWdfcHZzIGxpc3QKKworCVVzYWdlOiBzZWdfcHZzIDxsaXN0IHB0cj4KK2VuZAorCisjCisjIF9fZmlyc3Rfc2VnIDxyZXR1cm4+IDxMVj4KK2RlZmluZSBfX2ZpcnN0X3NlZworCXNldCAkYXJnMCA9IDB4MAorCXNldCAkX0ZTX2x2ICA9IChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikkYXJnMQorCisJaWYgKCRfRlNfbHYtPnNlZ21lbnRzLm4gIT0gJiRfRlNfbHYtPnNlZ21lbnRzKQorCQlzZXQgJGFyZzAgPSAoc3RydWN0IGx2X3NlZ21lbnQgKikkX0ZTX2x2LT5zZWdtZW50cy5uCisJZW5kCitlbmQKKworZGVmaW5lIGZpcnN0X3NlZworCXNldCAkX3NlZyA9IDAKKwlzZXQgJF9sdj0oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopJGFyZzAKKworCV9fZmlyc3Rfc2VnICRfc2VnICRfbHYKKworCWlmICgkX3NlZykKKwkJcCAkX3NlZworCWVsc2UKKwkJcHJpbnRmICJObyBzZWdtZW50cyAobGlzdCBlbXB0eSlcbiIKKwllbmQKK2VuZAorCitkb2N1bWVudCBmaXJzdF9zZWcKK1JldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNlZ21lbnQgb2YgYW4gTFYKKworCVVzYWdlOiBmaXJzdF9zZWcgPExWIHB0cj4KKworV0FSTklORzogSWYgdGhlIGxpc3QgcG9pbnRlciBpbiAnc3RydWN0IGx2X3NlZ21lbnQnIG1vdmVzLAorCSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgd3JvbmcuCitlbmQKKworIworIyBfX3NlZ190eXBlIDxyZXR1cm4+IDxzZWc+IDxpbmRleD4KK2RlZmluZSBfX3NlZ190eXBlCisJc2V0ICRhcmcwICA9IDB4MAorCXNldCAkX1NUX3NlZyAgPSAoc3RydWN0IGx2X3NlZ21lbnQgKikkYXJnMQorCXNldCAkX1NUX2luZGV4PSAkYXJnMgorCXNldCAkX1NUX2FyZWEgPSAkX1NUX3NlZy0+YXJlYXNbJF9TVF9pbmRleF0KKwlzZXQgJF9TVF90eXBlID0gJF9TVF9hcmVhLnR5cGUKKworCXNldCAkYXJnMCA9ICRfU1RfdHlwZQorZW5kCisKKyMKKyMgX19zZWdfaXRlbSA8cmV0dXJuPiA8c2VnPiA8aW5kZXg+CitkZWZpbmUgX19zZWdfaXRlbQorCXNldCAkYXJnMCAgPSAweDAKKwlzZXQgJF9TSV9zZWcgID0gKHN0cnVjdCBsdl9zZWdtZW50ICopJGFyZzEKKwlzZXQgJF9TSV9pbmRleD0gJGFyZzIKKworCWlmICgkX1NJX2luZGV4IDwgJF9TSV9zZWctPmFyZWFfY291bnQpCisJCXNldCAkX1NJX2FyZWEgPSAkX1NJX3NlZy0+YXJlYXNbJF9TSV9pbmRleF0KKwkJc2V0ICRfU0lfdHlwZSA9ICRfU0lfYXJlYS50eXBlCisKKwkJaWYgKCRfU0lfdHlwZSA9PSBBUkVBX1BWKQorCQkJc2V0ICRhcmcwID0gJF9TSV9hcmVhLnUucHYucHZzZWctPnB2CisJCWVsc2UKKwkJCWlmICgkX1NJX3R5cGUgPT0gQVJFQV9MVikKKwkJCQlzZXQgJGFyZzAgPSAkX1NJX2FyZWEudS5sdi5sdgorCQkJZW5kCisJCWVuZAorCWVuZAorZW5kCisKKyMKKyMgX19zZWdfbWV0YWl0ZW0gPHJldHVybj4gPHNlZz4gPGluZGV4PgorZGVmaW5lIF9fc2VnX21ldGFpdGVtCisJc2V0ICRhcmcwICA9IDB4MAorCXNldCAkX1NNSV9zZWcgID0gKHN0cnVjdCBsdl9zZWdtZW50ICopJGFyZzEKKwlzZXQgJF9TTUlfaW5kZXg9ICRhcmcyCisKKwlpZiAoKCRfU01JX2luZGV4IDwgJF9TTUlfc2VnLT5hcmVhX2NvdW50KSAmJiAkX1NNSV9zZWctPm1ldGFfYXJlYXMpCisJCXNldCAkX1NNSV9hcmVhID0gJF9TTUlfc2VnLT5tZXRhX2FyZWFzWyRfU01JX2luZGV4XQorCQlzZXQgJF9TTUlfdHlwZSA9ICRfU01JX2FyZWEudHlwZQorCisJCWlmICgkX1NNSV90eXBlID09IEFSRUFfUFYpCisJCQlzZXQgJGFyZzAgPSAkX1NNSV9hcmVhLnUucHYucHZzZWctPnB2CisJCWVsc2UKKwkJCWlmICgkX1NNSV90eXBlID09IEFSRUFfTFYpCisJCQkJc2V0ICRhcmcwID0gJF9TTUlfYXJlYS51Lmx2Lmx2CisJCQllbmQKKwkJZW5kCisJZW5kCitlbmQKKworZGVmaW5lIHNlZ19pdGVtCisJc2V0ICRfaXRlbSA9IDB4MAorCisJX19zZWdfaXRlbSAkX2l0ZW0gJGFyZzAgJGFyZzEJCisJaWYgKCRfaXRlbSkKKwkJcCAkX2l0ZW0KKwllbHNlCisJCXByaW50ZiAiQVJFQV9VTkFTU0lHTkVEIG9yIGludmFsaWRcbiIKKwllbmQKK2VuZAorCitkZWZpbmUgc2VnX21ldGFpdGVtCisJc2V0ICRfbWV0YWl0ZW0gPSAweDAKKworCV9fc2VnX21ldGFpdGVtICRfbWV0YWl0ZW0gJGFyZzAgJGFyZzEJCisJaWYgKCRfbWV0YWl0ZW0pCisJCXAgJF9tZXRhaXRlbQorCWVsc2UKKwkJcHJpbnRmICJBUkVBX1VOQVNTSUdORUQgb3IgaW52YWxpZFxuIgorCWVuZAorZW5kCisKK2RvY3VtZW50IHNlZ19pdGVtCitSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBMViBvciBQViBmb3IgdGhlIGluZGV4ZWQgYXJlYSBvZiBhIHNlZ21lbnQKKworCVVzYWdlOiBzZWdfaXRlbSA8c3RydWN0IGx2X3NlZ21lbnQgKj4gPGluZGV4PgorCitFeGFtcGxlIC0gR2V0dGluZyB0byB0aGUgc3ViLWx2IG9mIGEgbWlycm9yOgorCShnZGIpIHAgbHYtPm5hbWUKKwkkMSA9IDB4NzEyNTQ4ICJsdiIKKworCShnZGIpIGZpcnN0X3NlZyBsdgorCSQyID0gKHN0cnVjdCBsdl9zZWdtZW50ICopIDB4NzEyOGI4CisKKwkoZ2RiKSBzZWdfaXRlbSAkMiAwCisJJDMgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIDB4NzEyNjg4CisKKwkoZ2RiKSBwICQzLT5uYW1lCisJJDQgPSAweDcxMjc3MCAibHZfbWltYWdlXzAiCitlbmQKKworZGVmaW5lIF9fc3RhdHVzCisJc2V0ICRfc19zdGF0dXMgPSAkYXJnMC0+c3RhdHVzCisKKyMJQ29uc3RhbnRzIGRlZmluZWQgaW4gbWV0YWRhdGEtZXhwb3J0ZWQuaAorCisjCWlmICgkX3Nfc3RhdHVzICYgUkFJRCkKKwlpZiAoJF9zX3N0YXR1cyAmIDB4MDAwMDAwMDEwMDAwMDAwMExVKQorCQlzZXQgJF9zX3N0YXR1cyA9ICRfc19zdGF0dXMgJiB+MHgwMDAwMDAwMTAwMDAwMDAwTFUKKwkJcHJpbnRmICIgUkFJRCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBSQUlEX01FVEEpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDAwMDAyMDAwMDAwMDBMVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwMDAwMDIwMDAwMDAwMExVCisJCXByaW50ZiAiIFJBSURfTUVUQSIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBSQUlEX0lNQUdFKQorCWlmICgkX3Nfc3RhdHVzICYgMHgwMDAwMDAwNDAwMDAwMDAwTFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDAwMDAwMDA0MDAwMDAwMDBMVQorCQlwcmludGYgIiBSQUlEX0lNQUdFIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIE1JUlJPUkVEKQorCWlmICgkX3Nfc3RhdHVzICYgMHgwMDAwODAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDAwMDA4MDAwVQorCQlwcmludGYgIiBNSVJST1JFRCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBNSVJST1JfTE9HKQorCWlmICgkX3Nfc3RhdHVzICYgMHgwMDAyMDAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDAwMDIwMDAwVQorCQlwcmludGYgIiBNSVJST1JfTE9HIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIE1JUlJPUl9JTUFHRSkKKwlpZiAoJF9zX3N0YXR1cyAmIDB4MDAwNDAwMDBVKQorCQlzZXQgJF9zX3N0YXR1cyA9ICRfc19zdGF0dXMgJiB+MHgwMDA0MDAwMFUKKwkJcHJpbnRmICIgTUlSUk9SX0lNQUdFIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIFZJU0lCTEVfTFYpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDAwMDQwVSkKKwkJcHJpbnRmICIgVklTSUJMRV9MViIKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwMDAwNDBVCisJZWxzZQorCQlwcmludGYgIiAqSElEREVOX0xWKiIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBGSVhFRF9NSU5PUikKKwlpZiAoJF9zX3N0YXR1cyAmIDB4MDAwMDAwODBVKQorCQlzZXQgJF9zX3N0YXR1cyA9ICRfc19zdGF0dXMgJiB+MHgwMDAwMDA4MFUKKwkJcHJpbnRmICIgRklYRURfTUlOT1IiCisJZW5kCisjCWlmICgkX3Nfc3RhdHVzICYgTFZNX1JFQUQpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDAwMTAwVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwMDAxMDBVCisJCXByaW50ZiAiIExWTV9SRUFEIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIExWTV9XUklURSkKKwlpZiAoJF9zX3N0YXR1cyAmIDB4MDAwMDAyMDBVKQorCQlzZXQgJF9zX3N0YXR1cyA9ICRfc19zdGF0dXMgJiB+MHgwMDAwMDIwMFUKKwkJcHJpbnRmICIgTFZNX1dSSVRFIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIFNOQVBTSE9UKQorCWlmICgkX3Nfc3RhdHVzICYgMHgwMDAwMTAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDAwMDAxMDAwVQorCQlwcmludGYgIiBTTkFQU0hPVCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBQVk1PVkUpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDAyMDAwVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwMDIwMDBVCisJCXByaW50ZiAiIFBWTU9WRSIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBMT0NLRUQpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDA0MDAwVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwMDQwMDBVCisJCXByaW50ZiAiIExPQ0tFRCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBMVl9OT1RTWU5DRUQpCisJaWYgKCRfc19zdGF0dXMgJiAweDAwMDgwMDAwVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MDAwODAwMDBVCisJCXByaW50ZiAiIExWX05PVFNZTkNFRCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBDT05WRVJUSU5HKQorCWlmICgkX3Nfc3RhdHVzICYgMHgwMDQwMDAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDAwNDAwMDAwVQorCQlwcmludGYgIiBDT05WRVJUSU5HIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIExWX1JFQlVJTEQpCisJaWYgKCRfc19zdGF0dXMgJiAweDEwMDAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDEwMDAwMFUKKwkJcHJpbnRmICIgTFZfUkVCVUlMRCIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBQQVJUSUFMX0xWKQorCWlmICgkX3Nfc3RhdHVzICYgMHgxMDAwMDAwVSkKKwkJc2V0ICRfc19zdGF0dXMgPSAkX3Nfc3RhdHVzICYgfjB4MTAwMDAwMFUKKwkJcHJpbnRmICIgUEFSVElBTF9MViIKKwllbmQKKyMJaWYgKCRfc19zdGF0dXMgJiBNRVJHSU5HKQorCWlmICgkX3Nfc3RhdHVzICYgMHgxMDAwMDAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDEwMDAwMDAwVQorCQlwcmludGYgIiBNRVJHSU5HIgorCWVuZAorIwlpZiAoJF9zX3N0YXR1cyAmIExWX1dSSVRFTU9TVExZKQorCWlmICgkX3Nfc3RhdHVzICYgMHgxMDAwMDAwMDAwMFUpCisJCXNldCAkX3Nfc3RhdHVzID0gJF9zX3N0YXR1cyAmIH4weDEwMDAwMDAwMDAwVQorCQlwcmludGYgIiBMVl9XUklURU1PU1RMWSIKKwllbmQKKworCWlmICgkX3Nfc3RhdHVzKQorCQlwcmludGYgIiAweCV4IiwgJF9zX3N0YXR1cworCWVuZAorZW5kCisKKyMKKyMgX19wcmludF9pbmRlbnQgPG51bSBpbmRlbnRzPiBbTm8gbWFya3NdCitkZWZpbmUgX19wcmludF9pbmRlbnQKKwlzZXQgJF9QSV9pbmRlbnQgPSAkYXJnMAorCXNldCAkX1BJX2xlYWRfbWFyayA9IDAKKworCXdoaWxlICgkX1BJX2luZGVudCkKKwkJaWYgKCRfUElfaW5kZW50ID09IDEpCisJCQlpZiAoJGFyZ2MgPiAxKQorCQkJCWlmICgkX1BJX2xlYWRfbWFyaykKKwkJCQkJcHJpbnRmICIgICAgICAgICIKKwkJCQllbHNlCisJCQkJCXByaW50ZiAifCAgICAgICAiCisJCQkJZW5kCisJCQllbHNlCisJCQkJcHJpbnRmICJ8LS0tLS0+ICIKKwkJCWVuZAorCQllbHNlCisJCQlwcmludGYgInwgICAgICAgIgorCQkJc2V0ICRfUElfbGVhZF9tYXJrID0gMQorCQllbmQKKwkJc2V0ICRfUElfaW5kZW50LS0KKwllbmQKK2VuZAorCitkZWZpbmUgbHZfc3RhdHVzCisJIyBVc2UgX19sdiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIGhpZ2hlciBmdW5jdGlvbnMKKwlzZXQgJF9fbHYgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopJGFyZzAKKworCWlmICgkYXJnYyA9PSAyKQorCQlfX3ByaW50X2luZGVudCAkYXJnMQorCWVuZAorCXByaW50ZiAiJXMtPnN0YXR1czoiLCAkX19sdi0+bmFtZQorCV9fc3RhdHVzICRfX2x2CisJcHJpbnRmICJcbiIKK2VuZAorCitkb2N1bWVudCBsdl9zdGF0dXMKK0Rpc3BsYXkgdGhlIGZsYWdzIHRoYXQgYXJlIHNldCBvbiBhbiBMVi4KKworCVVzYWdlOiBsdl9zdGF0dXMgPExWIHB0cj4KK2VuZAorCitkZWZpbmUgc2VnX3N0YXR1cworCXNldCAkX3NlZz0oc3RydWN0IGx2X3NlZ21lbnQgKikkYXJnMAorCisJaWYgKCRhcmdjID09IDIpCisJCV9fcHJpbnRfaW5kZW50ICRhcmcxIDEKKwllbmQKKwlwcmludGYgIlsgKCVzKSBzZWctPnN0YXR1czoiLCAkX3NlZy0+bHYtPm5hbWUKKwlfX3N0YXR1cyAkX3NlZworCXByaW50ZiAiIF1cbiIKK2VuZAorCitkb2N1bWVudCBzZWdfc3RhdHVzCitEaXNwbGF5IHRoZSBmbGFncyB0aGF0IGFyZSBzZXQgb24gYW4gbHZfc2VnbWVudC4KKworICAgICAgICBVc2FnZTogc2VnX3N0YXR1cyA8KHN0cnVjdCBsdl9zZWdtZW50ICopPgorZW5kCisKKyMKKyMgZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2IDxyZXR1cm4+IDxMVj4KK2RlZmluZSBfX2dldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdgorCXNldCAkYXJnMCA9IDB4MAorCXNldCAkX2x2PShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikkYXJnMQorCXNldCAkX3NlZ19saXN0X2hlYWQgPSAmJF9sdi0+c2Vnc191c2luZ190aGlzX2x2CisJc2V0ICRfcyA9ICRfbHYtPnNlZ3NfdXNpbmdfdGhpc19sdi5uCisJc2V0ICRfaSA9IDAKKworCXdoaWxlICgoJF9zICE9ICRfc2VnX2xpc3RfaGVhZCkgJiYgKCRfaSA8IDEwMCkpCisJCXNldCAkX3NlZ19saXN0ID0gKHN0cnVjdCBzZWdfbGlzdCAqKSRfcworCQlzZXQgJF9zZWcgPSAoc3RydWN0IGx2X3NlZ21lbnQgKikkX3NlZ19saXN0LT5zZWcKKworCQlzZXQgJF9pKysKKwkJc2V0ICRfcyA9ICRfcy0+bgorCWVuZAorCisJaWYgKCRfaSA+IDEpCisJCXByaW50ZiAiTW9yZSB0aGFuICVzIHVzaW5nICVzXG4iLCAoJF9pID4gOTkpID8gIjEwMCBzZWdtZW50cyIgOiAib25lIHNlZ21lbnQiLCAkX2x2LT5uYW1lCisJZW5kCisJaWYgKCRfaSA9PSAxKQorCQlzZXQgJGFyZzAgPSAkX3NlZworCWVuZAorZW5kCisKK2RlZmluZSBzZWdzX3VzaW5nX3RoaXNfbHYKKwlzZXQgJF9sdj0oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopJGFyZzAKKwlzZXQgJF9zZWdfbGlzdF9oZWFkID0gJiRfbHYtPnNlZ3NfdXNpbmdfdGhpc19sdgorCXNldCAkX3MgPSAkX2x2LT5zZWdzX3VzaW5nX3RoaXNfbHYubgorCXNldCAkX2kgPSAwCisKKwlpZiAoJF9zICE9ICRfc2VnX2xpc3RfaGVhZCkKKwkJcHJpbnRmICJTZWdtZW50cyB1c2luZyAlc1xuIiwgJF9sdi0+bmFtZQorCWVsc2UKKwkJcHJpbnRmICJObyBzZWdtZW50cyB1c2luZyAlc1xuIiwgJF9sdi0+bmFtZQorCWVuZAorCXdoaWxlICgkX3MgIT0gJF9zZWdfbGlzdF9oZWFkKQorCQlzZXQgJF9zZWdfbGlzdCA9IChzdHJ1Y3Qgc2VnX2xpc3QgKikkX3MKKwkJc2V0ICRfc2VnID0gKHN0cnVjdCBsdl9zZWdtZW50ICopJF9zZWdfbGlzdC0+c2VnCisJCXByaW50ZiAiICAlZCkgc2VnOiAlcCIsICRfaSwgJF9zZWcKKwkJaWYgKCRfc2VnLT5sdiA8IDB4MjAwKQorCQkJcHJpbnRmICIgIFtCQUQgTFYgUE9JTlRFUiBGUk9NIFRISVMgU0VHXVxuIgorCQllbHNlCisJCQlwcmludGYgIiAgW3NlZyBmb3VuZCBpbiAlc11cbiIsICRfc2VnLT5sdi0+bmFtZQorCQllbmQKKwkJc2V0ICRfaSsrCisJCXNldCAkX3MgPSAkX3MtPm4KKwllbmQKK2VuZAorCitkb2N1bWVudCBzZWdzX3VzaW5nX3RoaXNfbHYKK0Rpc3BsYXkgdGhlIHNlZ21lbnRzIChhbmQgdGhlaXIgYXNzb2NpYXRlZCBMVikgdXNpbmcgYW4gTFYKKworCVVzYWdlOiBzZWdzX3VzaW5nX3RoaXNfbHYgPExWIHB0cj4KKworRXhhbXBsZToKKwkoZ2RiKSBsdl9pc19taXJyb3JlZCBsdgorCWx2IGlzIG1pcnJvcmVkICgnY29yZScgbG9nKQorCisJKGdkYikgc2Vnc191c2luZ190aGlzX2x2IGx2CisJTm8gc2VnbWVudHMgdXNpbmcgbHYKKworCShnZGIpIGZpcnN0X3NlZyBsdgorCSQxID0gKHN0cnVjdCBsdl9zZWdtZW50ICopIDB4OTJkMzYwCisKKwkoZ2RiKSBzZWdfaXRlbSAkMSAwCisJJDIgPSAoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopIDB4OTI4ZjU4CisKKwkoZ2RiKSBzZWdzX3VzaW5nX3RoaXNfbHYgJDIKKwlTZWdtZW50cyB1c2luZyBsdl9taW1hZ2VfMAorCSAgMCkgc2VnOiAweDkyZDM2MCAgW3NlZyBmb3VuZCBpbiBsdl0KK2VuZAorCisjCisjIF9fbmV4dF9hcmVhX2luZGV4IDxyZXR1cm4+IDxzZWc+IDxzZWdfaXRlbT4KK2RlZmluZSBfX25leHRfYXJlYV9pbmRleAorCXNldCAkYXJnMCA9IDB4MAorCXNldCAkX3NlZyA9IChzdHJ1Y3QgbHZfc2VnbWVudCAqKSRhcmcxCisJc2V0ICRfaXRlbSA9IDB4MAorCXNldCAkX2kgPSAwCisKKwlfX3NlZ19pdGVtICRfaXRlbSAkX3NlZyAkX2kKKwl3aGlsZSAoJF9pdGVtICYmICgkX2l0ZW0gIT0gJGFyZzIpKQorCQlzZXQgJF9pKysKKwkJX19zZWdfaXRlbSAkX2l0ZW0gJF9zZWcgJF9pCisJZW5kCisKKwkjICRfaSBwb2ludHMgdG8gY3VycmVudCwgbm93IGdldCBuZXh0IChpZiB0aGVyZSkKKwlzZXQgJF9pKysKKwlfX3NlZ19pdGVtICRfaXRlbSAkX3NlZyAkX2kKKworCWlmICgkX2l0ZW0pCisJCXNldCAkYXJnMCA9ICRfaQorCWVuZAorZW5kCisKKyMKKyMgX19sdl9zdGF0dXNfciA8TFY+CisjIERlY2VuZCB0cmVlLCBwcmludGluZyBMViBhbmQgc2VnIHN0YXR1cyBhcyB3ZSBnby4gIFRoaXMKKyMgcGVyZm9ybXMgYSBkZXB0aCBmaXJzdCBhcHByb2FjaCAoYnV0IGNhbid0IGNvbWUgdXApIAorIworIyBvcgorIworIyBfX2x2X3N0YXR1c19yIDxzdWJfbHY+IDxzZWcgdXNpbmcgc3ViX2x2PgorIyBUcnkgY29udGludWluZyBkZWNlbnQgb2YgdHJlZSBieSBmaXJzdCBzaGlmdGluZyB0byB0aGUKKyMgbmV4dCAnYXJlYScgaW4gdGhlIHNlZyAoJGFyZzEpLiAgSWYgbm8gbW9yZSBhcmVhcywgdGhlbgorIyB0cnkgZ29pbmcgdG8gdGhlIG5leHQgc2VnbWVudC4KK2RlZmluZSBfX2x2X3N0YXR1c19yCisJaWYgKCRhcmdjID09IDEpCisJICAgICAgICBzZXQgJF9sdj0oc3RydWN0IGxvZ2ljYWxfdm9sdW1lICopJGFyZzAKKwkJc2V0ICRfc2VnX2xpc3RfaGVhZCA9ICYkX2x2LT5zZWdtZW50cworCQlzZXQgJF9zID0gJF9sdi0+c2VnbWVudHMubgorCQlzZXQgJF9hcmVhX2luZGV4ID0gMAorCisjCQlwcmludGYgIlxuIgorCQlsdl9zdGF0dXMgJF9sdiAkaW5kZW50CisJZWxzZQorCQlzZXQgJF9zZWcgPSAoc3RydWN0IGx2X3NlZ21lbnQgKikkYXJnMQorCisJCV9fbmV4dF9hcmVhX2luZGV4ICRfYXJlYV9pbmRleCAkX3NlZyAkYXJnMAorCisJCSMgRG9uJ3QgZnVjayB0aGlzIHVwLiAgV2UgbmVlZCB0aGUgbmV4dCB0d28gbGluZXMgaGVyZS4KKwkgICAgICAgIHNldCAkX2x2PShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikkX3NlZy0+bHYKKwkJc2V0ICRfc2VnX2xpc3RfaGVhZCA9ICYkX2x2LT5zZWdtZW50cworCQlzZXQgJF9zID0gKHN0cnVjdCBkbV9saXN0ICopJF9zZWcKKworCQlpZiAoISRfYXJlYV9pbmRleCkKKwkJCXNldCAkX3MgPSAkX3MtPm4KKwkJZW5kCisJZW5kCisKKwlpZiAoJF9zID09ICRfc2VnX2xpc3RfaGVhZCkKKwkJaWYgKCRhcmdjID09IDEpCisJCQlfX3ByaW50X2luZGVudCAkaW5kZW50IDEKKwkJCXByaW50ZiAiWyBObyBzZWdtZW50cyBmb3IgJXMgXVxuIiwgJF9sdi0+bmFtZQorCQllbmQKKwkJX19nZXRfb25seV9zZWdtZW50X3VzaW5nX3RoaXNfbHYgJF9zZWcgJF9sdgorCisJCWlmICgkX3NlZyAmJiAkaW5kZW50KQorCQkJc2V0ICRpbmRlbnQtLQorCQkJX19sdl9zdGF0dXNfciAkX2x2ICRfc2VnCisJCWVuZAorCWVsc2UKKwkJc2V0ICRfc2VnID0gKHN0cnVjdCBsdl9zZWdtZW50ICopJF9zCisJCXNldCAkX3R5cGUgPSAweDAKKworCQlpZiAoISRfYXJlYV9pbmRleCkKKwkJCXNlZ19zdGF0dXMgJF9zZWcgJGluZGVudAorCQllbmQKKwkJX19zZWdfdHlwZSAkX3R5cGUgJF9zZWcgJF9hcmVhX2luZGV4CisJCWlmICgkX3R5cGUgPT0gQVJFQV9MVikKKwkJCXNldCAkaW5kZW50KysKKworCQkJX19zZWdfbWV0YWl0ZW0gJF9sdiAkX3NlZyAkX2FyZWFfaW5kZXgKKwkJCWlmICgkX2x2KQorCQkJCXNldCAkcmluZGVudCA9ICRpbmRlbnQKKwkJCQlzZXQgJHJzZWcgPSAkX3NlZworCQkJCXNldCAkcmFyZWFfaW5kZXggPSAkX2FyZWFfaW5kZXgKKwkJCQlzZXQgJHJsdiA9ICRfbHYKKworCQkJCV9fbHZfc3RhdHVzX3IgJF9sdgorCisJCQkJc2V0ICRpbmRlbnQgPSAkcmluZGVudAorCQkJCXNldCAkX3NlZyA9ICRyc2VnCisJCQkJc2V0ICRfYXJlYV9pbmRleCA9ICRyYXJlYV9pbmRleAorCQkJCXNldCAkX2x2ID0gJHJsdgorCQkJZW5kCisKKwkJCV9fc2VnX2l0ZW0gJF9sdiAkX3NlZyAkX2FyZWFfaW5kZXgKKwkJCV9fbHZfc3RhdHVzX3IgJF9sdgorCQllbHNlCisJCQlpZiAoJF9zZWctPmxvZ19sdikKKwkJCQlzZXQgJGluZGVudCsrCisJCQkJc2V0ICRfbG9nX3NlZyA9IDB4MAorCisJCQkJX19maXJzdF9zZWcgJF9sb2dfc2VnICRfc2VnLT5sb2dfbHYKKwkJCQlsdl9zdGF0dXMgJF9zZWctPmxvZ19sdiAkaW5kZW50CisJCQkJc2VnX3N0YXR1cyAkX2xvZ19zZWcgJGluZGVudAorCisJCQkJc2V0ICRpbmRlbnQtLQorCQkJZW5kCisJCQlfX2dldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdiAkX3NlZyAkX2x2CisJCQlpZiAoJF9zZWcpCisJCQkJc2V0ICRpbmRlbnQtLQorCQkJCV9fbHZfc3RhdHVzX3IgJF9sdiAkX3NlZworCQkJZW5kCisJCWVuZAorCWVuZAorZW5kCisKK2RlZmluZSBsdl9zdGF0dXNfcgorCXNldCAkaW5kZW50ID0gMAorCV9fbHZfc3RhdHVzX3IgJGFyZzAKK2VuZAorCitkb2N1bWVudCBsdl9zdGF0dXNfcgorRGlzcGxheSB0aGUgc3RhdHVzIGZsYWdzIG9mIGFuIExWIGFuZCBpdHMgc3ViX2x2cy4KKworCVVzYWdlOiBsdl9zdGF0dXNfciA8TFYgcHRyPgorCitUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdCBhbGwgdGhlIExWcyB0aGF0Citjb21wb3NlIGEgbG9naWNhbCB2b2x1bWUgaGF2ZSB0aGUgY29ycmVjdCBmbGFncyBzZXQgKGFuZCBhbHNvCit0aGVpciBhc3NvY2lhdGVkIGx2X3NlZ21lbnRzKQorZW5kCisKK2RlZmluZSBsdl9pc19taXJyb3JlZAorCXNldCAkX2x2PShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKikkYXJnMAorCXNldCAkX2ZzPShzdHJ1Y3QgbHZfc2VnbWVudCAqKSRfbHYtPnNlZ21lbnRzLm4KKwlzZXQgJF9sb2dfbHY9KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqKSRfZnMtPmxvZ19sdgorCisjCWlmICgkX2x2LT5zdGF0dXMgJiBNSVJST1JFRCkKKwlpZiAoJF9sdi0+c3RhdHVzICYgMHgwMDAwODAwMFUpCisJCXByaW50ZiAiJXMgaXMgbWlycm9yZWQgKCIsICRfbHYtPm5hbWUKKwkJaWYgKCRfbG9nX2x2KQorCQkJaWYgKCRfbG9nX2x2LT5zdGF0dXMgJiAweDAwMDA4MDAwVSkKKwkJCQlwcmludGYgIidtaXJyb3JlZCcgbG9nKVxuIgorCQkJZWxzZQorCQkJCXByaW50ZiAiJ2Rpc2snIGxvZylcbiIKKwkJCWVuZAorCQllbHNlCisJCQlwcmludGYgIidjb3JlJyBsb2cpXG4iCisJCWVuZAorCWVsc2UKKwkJcHJpbnRmICIlcyBpcyBub3QgbWlycm9yZWRcbiIsICRfbHYtPm5hbWUKKwllbmQKK2VuZAorCitkb2N1bWVudCBsdl9pc19taXJyb3JlZAorUmVwb3J0IHdoZXRoZXIgdGhlIGdpdmVuIExWIGlzIG1pcnJvcmVkIChhbmQgaXRzIGxvZyB0eXBlKS4KKworCVVzYWdlOiBsdl9pc19taXJyb3JlZCA8TFYgcHRyPgorZW5kCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfYWN0aXZhdGlvbl9nZW5lcmF0b3Jfc3lzdGVtZF9yZWRfaGF0LmMgYi9zY3JpcHRzL2x2bTJfYWN0aXZhdGlvbl9nZW5lcmF0b3Jfc3lzdGVtZF9yZWRfaGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzZTcyMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMl9hY3RpdmF0aW9uX2dlbmVyYXRvcl9zeXN0ZW1kX3JlZF9oYXQuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIHRvb2xzLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4JCS8qIEZvciBQQVRIX01BWCBmb3IgbXVzbCBsaWJjICovCisjaW5jbHVkZSAibHZtMmFwcC5oIgorI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgkJLyogZm9yIExWTV9QQVRIICovCisKKyNkZWZpbmUgS01TR19ERVZfUEFUSAkJIi9kZXYva21zZyIKKyNkZWZpbmUgTFZNX0NPTkZfVVNFX0xWTUVUQUQJImdsb2JhbC91c2VfbHZtZXRhZCIKKyNkZWZpbmUgTFZNX0NPTkZfVVNFX0xWTVBPTExECSJnbG9iYWwvdXNlX2x2bXBvbGxkIgorCisjZGVmaW5lIFVOSVRfVEFSR0VUX0xPQ0FMX0ZTICAibG9jYWwtZnMtcHJlLnRhcmdldCIKKyNkZWZpbmUgVU5JVF9UQVJHRVRfUkVNT1RFX0ZTICJyZW1vdGUtZnMtcHJlLnRhcmdldCIKKworc3RhdGljIGNoYXIgdW5pdF9wYXRoW1BBVEhfTUFYXTsKK3N0YXRpYyBjaGFyIHRhcmdldF9wYXRoW1BBVEhfTUFYXTsKK3N0YXRpYyBjaGFyIG1lc3NhZ2VbUEFUSF9NQVggKyAzXTsgLyogKzMgZm9yICc8bj4nIHdoZXJlIG4gaXMgdGhlIGxvZyBsZXZlbCAqLworc3RhdGljIGludCBrbXNnX2ZkID0gLTE7CisKK2VudW0geworCVVOSVRfRUFSTFksCisJVU5JVF9NQUlOLAorCVVOSVRfTkVUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqdW5pdF9uYW1lc1tdID0geworCVtVTklUX0VBUkxZXSA9ICJsdm0yLWFjdGl2YXRpb24tZWFybHkuc2VydmljZSIsCisJW1VOSVRfTUFJTl0gPSAibHZtMi1hY3RpdmF0aW9uLnNlcnZpY2UiLAorCVtVTklUX05FVF0gPSAibHZtMi1hY3RpdmF0aW9uLW5ldC5zZXJ2aWNlIgorfTsKKworX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK3N0YXRpYyB2b2lkIGttc2coaW50IGxvZ19sZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgbjsKKworCXNucHJpbnRmKG1lc3NhZ2UsIDQsICI8JWQ+IiwgbG9nX2xldmVsKTsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCW4gPSB2c25wcmludGYobWVzc2FnZSArIDMsIFBBVEhfTUFYLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJaWYgKGttc2dfZmQgPCAwIHx8IChuIDwgMCB8fCAoKHVuc2lnbmVkKSBuICsgMSA+IFBBVEhfTUFYKSkpCisJCXJldHVybjsKKworCS8qIFRoZSBuKzQ6ICszIGZvciAiPG4+IiBwcmVmaXggYW5kICsxIGZvciAnXDAnIHN1ZmZpeCAqLworCWlmICh3cml0ZShrbXNnX2ZkLCBtZXNzYWdlLCBuICsgNCkpIHsgLyogSWdub3JlIHJlc3VsdCBjb2RlICovOyB9Cit9CisKK3N0YXRpYyB2b2lkIGx2bV9nZXRfdXNlX2x2bWV0YWRfYW5kX2x2bXBvbGxkKGludCAqdXNlX2x2bWV0YWQsIGludCAqdXNlX2x2bXBvbGxkKQoreworCSp1c2VfbHZtZXRhZCA9ICp1c2VfbHZtcG9sbGQgPSAwOworCisJKnVzZV9sdm1ldGFkID0gbHZtX2NvbmZpZ19maW5kX2Jvb2woTlVMTCwgTFZNX0NPTkZfVVNFX0xWTUVUQUQsIDApOworCSp1c2VfbHZtcG9sbGQgPSBsdm1fY29uZmlnX2ZpbmRfYm9vbChOVUxMLCBMVk1fQ09ORl9VU0VfTFZNUE9MTEQsIDApOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX3VuaXRfd2l0aF90YXJnZXQoY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICp1bml0LCBjb25zdCBjaGFyICp0YXJnZXQpCit7CisJaW50IHIgPSAxOworCisJaWYgKGRtX3NucHJpbnRmKHRhcmdldF9wYXRoLCBQQVRIX01BWCwgIiVzLyVzLndhbnRzIiwgZGlyLCB0YXJnZXQpIDwgMCkgeworCQlyID0gMDsgZ290byBvdXQ7CisJfQorCSh2b2lkKSBkbV9wcmVwYXJlX3NlbGludXhfY29udGV4dCh0YXJnZXRfcGF0aCwgU19JRkRJUik7CisJaWYgKG1rZGlyKHRhcmdldF9wYXRoLCAwNzU1KSA8IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWttc2coTE9HX0VSUiwgIkxWTTogRmFpbGVkIHRvIGNyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5ICVzOiAlbS5cbiIsIHRhcmdldF9wYXRoKTsKKwkJciA9IDA7IGdvdG8gb3V0OworCX0KKworCWlmIChkbV9zbnByaW50Zih0YXJnZXRfcGF0aCwgUEFUSF9NQVgsICIlcy8lcy53YW50cy8lcyIsIGRpciwgdGFyZ2V0LCB1bml0KSA8IDApIHsKKwkJciA9IDA7IGdvdG8gb3V0OworCX0KKwkodm9pZCkgZG1fcHJlcGFyZV9zZWxpbnV4X2NvbnRleHQodGFyZ2V0X3BhdGgsIFNfSUZMTkspOworCWlmIChzeW1saW5rKHVuaXRfcGF0aCwgdGFyZ2V0X3BhdGgpIDwgMCkgeworCQlrbXNnKExPR19FUlIsICJMVk06IEZhaWxlZCB0byBjcmVhdGUgc3ltbGluayBmb3IgdW5pdCAlczogJW0uXG4iLCB1bml0KTsKKwkJciA9IDA7CisJfQorb3V0OgorCWRtX3ByZXBhcmVfc2VsaW51eF9jb250ZXh0KE5VTEwsIDApOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3VuaXQoY29uc3QgY2hhciAqZGlyLCBpbnQgdW5pdCwgaW50IHN5c2luaXRfbmVlZGVkKQoreworCUZJTEUgKmY7CisJY29uc3QgY2hhciAqdW5pdF9uYW1lID0gdW5pdF9uYW1lc1t1bml0XTsKKwljb25zdCBjaGFyICp0YXJnZXRfbmFtZSA9IHVuaXQgPT0gVU5JVF9ORVQgPyBVTklUX1RBUkdFVF9SRU1PVEVfRlMgOiBVTklUX1RBUkdFVF9MT0NBTF9GUzsKKworCWlmIChkbV9zbnByaW50Zih1bml0X3BhdGgsIFBBVEhfTUFYLCAiJXMvJXMiLCBkaXIsIHVuaXRfbmFtZSkgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmICghKGYgPSBmb3Blbih1bml0X3BhdGgsICJ3eGUiKSkpIHsKKwkJa21zZyhMT0dfRVJSLCAiTFZNOiBGYWlsZWQgdG8gY3JlYXRlIHVuaXQgZmlsZSAlczogJW0uXG4iLCB1bml0X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcHV0cygiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBsdm0yLWFjdGl2YXRpb24tZ2VuZXJhdG9yLlxuIgorCSAgICAgICIjXG4iCisJICAgICAgIiMgVGhpcyB1bml0IGlzIHJlc3BvbnNpYmxlIGZvciBkaXJlY3QgYWN0aXZhdGlvbiBvZiBMVk0yIGxvZ2ljYWwgdm9sdW1lc1xuIgorCSAgICAgICIjIGlmIGx2bWV0YWQgZGFlbW9uIGlzIG5vdCB1c2VkIChnbG9iYWwvdXNlX2x2bWV0YWQ9MCBsdm0uY29uZiBzZXR0aW5nKSxcbiIKKwkgICAgICAiIyBoZW5jZSB2b2x1bWUgYXV0b2FjdGl2YXRpb24gaXMgbm90IGFwcGxpY2FibGUuXG4iCisJICAgICAgIiMgRGlyZWN0IExWTTIgYWN0aXZhdGlvbiByZXF1aXJlcyB1ZGV2IHRvIGJlIHNldHRsZWQhXG5cbiIKKwkgICAgICAiW1VuaXRdXG4iCisJICAgICAgIkRlc2NyaXB0aW9uPUFjdGl2YXRpb24gb2YgTFZNMiBsb2dpY2FsIHZvbHVtZXNcbiIKKwkgICAgICAiRG9jdW1lbnRhdGlvbj1tYW46bHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvcig4KVxuIgorCSAgICAgICJTb3VyY2VQYXRoPS9ldGMvbHZtL2x2bS5jb25mXG4iCisJICAgICAgIkRlZmF1bHREZXBlbmRlbmNpZXM9bm9cbiIsIGYpOworCisJaWYgKHVuaXQgPT0gVU5JVF9ORVQpIHsKKwkJZnByaW50ZihmLCAiQWZ0ZXI9JXMgaXNjc2kuc2VydmljZSBmY29lLnNlcnZpY2VcbiIKKwkJCSJCZWZvcmU9cmVtb3RlLWZzLXByZS50YXJnZXQgc2h1dGRvd24udGFyZ2V0XG5cbiIKKwkJCSJbU2VydmljZV1cbiIKKwkJCSJFeGVjU3RhcnRQcmU9L3Vzci9iaW4vdWRldmFkbSBzZXR0bGVcbiIsIHVuaXRfbmFtZXNbVU5JVF9NQUlOXSk7CisJfSBlbHNlIHsKKwkJaWYgKHVuaXQgPT0gVU5JVF9FQVJMWSkgeworCQkJZnB1dHMoIkFmdGVyPXN5c3RlbWQtdWRldi1zZXR0bGUuc2VydmljZVxuIgorCQkJICAgICAgIkJlZm9yZT1jcnlwdHNldHVwLnRhcmdldFxuIiwgZik7CisJCX0gZWxzZQorCQkJZnByaW50ZihmLCAiQWZ0ZXI9ICVzIGNyeXB0c2V0dXAudGFyZ2V0XG4iLCB1bml0X25hbWVzW1VOSVRfRUFSTFldKTsKKworCQlmcHV0cygiQmVmb3JlPWxvY2FsLWZzLXByZS50YXJnZXQgc2h1dGRvd24udGFyZ2V0XG4iCisJCSAgICAgICJXYW50cz1zeXN0ZW1kLXVkZXYtc2V0dGxlLnNlcnZpY2VcblxuIgorCQkgICAgICAiW1NlcnZpY2VdXG4iLCBmKTsKKwl9CisKKwlmcHV0cygiRXhlY1N0YXJ0PSIgTFZNX1BBVEggIiB2Z2NoYW5nZSAtYWF5IC0taWdub3Jlc2tpcHBlZGNsdXN0ZXIiLCBmKTsKKwlpZiAoc3lzaW5pdF9uZWVkZWQpCisJCWZwdXRzICgiIC0tc3lzaW5pdCIsIGYpOworCWZwdXRzKCJcblR5cGU9b25lc2hvdFxuIiwgZik7CisKKwlpZiAoZmNsb3NlKGYpIDwgMCkgeworCQlrbXNnKExPR19FUlIsICJMVk06IEZhaWxlZCB0byB3cml0ZSB1bml0IGZpbGUgJXM6ICVtLlxuIiwgdW5pdF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZWdpc3Rlcl91bml0X3dpdGhfdGFyZ2V0KGRpciwgdW5pdF9uYW1lLCB0YXJnZXRfbmFtZSkpIHsKKwkJa21zZyhMT0dfRVJSLCAiTFZNOiBGYWlsZWQgdG8gcmVnaXN0ZXIgdW5pdCAlcyB3aXRoIHRhcmdldCAlcy5cbiIsIHVuaXRfbmFtZSwgdGFyZ2V0X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgdXNlX2x2bWV0YWQsIHVzZV9sdm1wb2xsZCwgc3lzaW5pdF9uZWVkZWQ7CisJY29uc3QgY2hhciAqZGlyOworCWludCByID0gRVhJVF9TVUNDRVNTOworCW1vZGVfdCBvbGRfbWFzazsKKworCWttc2dfZmQgPSBvcGVuKEtNU0dfREVWX1BBVEgsIE9fV1JPTkxZfE9fTk9DVFRZKTsKKworCWlmIChhcmdjICE9IDQpIHsKKwkJa21zZyhMT0dfRVJSLCAiTFZNOiBJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgYWN0aXZhdGlvbiBnZW5lcmF0b3IuXG4iKTsKKwkJciA9IEVYSVRfRkFJTFVSRTsgZ290byBvdXQ7CisJfQorCisJLyogSWYgbHZtZXRhZCB1c2VkLCByZWx5IG9uIGF1dG9hY3RpdmF0aW9uIGluc3RlYWQgb2YgZGlyZWN0IGFjdGl2YXRpb24uICovCisJbHZtX2dldF91c2VfbHZtZXRhZF9hbmRfbHZtcG9sbGQoJnVzZV9sdm1ldGFkLCAmdXNlX2x2bXBvbGxkKTsKKwlpZiAodXNlX2x2bWV0YWQpCisJCWdvdG8gb3V0OworCisJZGlyID0gYXJndlsxXTsKKworCS8qIG1hcmsgbHZtMi1hY3RpdmF0aW9uLiouc2VydmljZSBhcyB3b3JsZC1hY2Nlc3NpYmxlICovCisJb2xkX21hc2sgPSB1bWFzaygwMDIyKTsKKworCXN5c2luaXRfbmVlZGVkID0gIXVzZV9sdm1wb2xsZDsKKworCWlmICghZ2VuZXJhdGVfdW5pdChkaXIsIFVOSVRfRUFSTFksIHN5c2luaXRfbmVlZGVkKSB8fAorCSAgICAhZ2VuZXJhdGVfdW5pdChkaXIsIFVOSVRfTUFJTiwgc3lzaW5pdF9uZWVkZWQpIHx8CisJICAgICFnZW5lcmF0ZV91bml0KGRpciwgVU5JVF9ORVQsIHN5c2luaXRfbmVlZGVkKSkKKwkJciA9IEVYSVRfRkFJTFVSRTsKKwl1bWFzayhvbGRfbWFzayk7CitvdXQ6CisJaWYgKHIpCisJCWttc2coTE9HX0VSUiwgIkxWTTogQWN0aXZhdGlvbiBnZW5lcmF0b3IgZmFpbGVkLlxuIik7CisJaWYgKGttc2dfZmQgIT0gLTEpCisJCSh2b2lkKSBjbG9zZShrbXNnX2ZkKTsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtMl9jbHVzdGVyX2FjdGl2YXRpb25fcmVkX2hhdC5zaC5pbiBiL3NjcmlwdHMvbHZtMl9jbHVzdGVyX2FjdGl2YXRpb25fcmVkX2hhdC5zaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVhMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX2NsdXN0ZXJfYWN0aXZhdGlvbl9yZWRfaGF0LnNoLmluCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9iYXNoCisKK3NiaW5kaXI9QHNiaW5kaXJACisKK2x2bV92Z2NoYW5nZT0ke3NiaW5kaXJ9L3ZnY2hhbmdlCitsdm1fdmdzY2FuPSR7c2JpbmRpcn0vdmdzY2FuCitsdm1fdmdzPSR7c2JpbmRpcn0vdmdzCitsdm1fbHZtPSR7c2JpbmRpcn0vbHZtCisKK2NsdXN0ZXJlZF92Z3MoKSB7CisJJHtsdm1fdmdzfSAtLW5vaGVhZGluZ3MgLW8gdmdfbmFtZSAtUyAndmdfY2x1c3RlcmVkPTEnIDI+L2Rldi9udWxsCit9CisKK2FjdGl2YXRlKCkgeworCWV2YWwgbG9jYWwgJCgke2x2bV9sdm19IGR1bXBjb25maWcgZGV2aWNlcy9vYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2IDI+L2Rldi9udWxsKSAyPi9kZXYvbnVsbAorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQllY2hvICJXYXJuaW5nOiBleHBlY3RlZCBzaW5nbGUgY291cGxlIG9mIGtleT12YWx1ZSBpbiBvdXRwdXQgb2YgZHVtcGNvbmZpZyIKKwlmaQorCisJaWYgWyAteiAkb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldiAtbyAkb2J0YWluX2RldmljZV9saXN0X2Zyb21fdWRldiAtbmUgMSBdOyB0aGVuCisJCWVjaG8gLW4gImx2bS5jb25mIG9wdGlvbiBvYnRhaW5fZGV2aWNlX2xpc3RfZnJvbV91ZGV2IT0xOiBFeGVjdXRpbmcgdmdzY2FuIgorCQkke2x2bV92Z3NjYW59ID4gL2Rldi9udWxsIDI+JjEKKwlmaQorCisJZWNobyAtbiAiQWN0aXZhdGluZyAke0xWTV9WR1M6LSJhbGwgVkcocykifTogIgorCSMgUmVzcGVjdCBhY3RpdmF0aW9uL2F1dG9fYWN0aXZhdGlvbl92b2x1bWVfbGlzdCEKKwkjIENhbGwgIi1hYXkiIHdoaWNoIGlzIGVxdWFsIHRvICItYWx5IiBidXQgcmVzcGVjdHMgdGhpcyBsaXN0LgorICAgICAgICAke2x2bV92Z2NoYW5nZX0gLWFheSAkTFZNX1ZHUyB8fCByZXR1cm4gMQorCisJcmV0dXJuIDAKK30KKworZGVhY3RpdmF0ZSgpCit7CisJIyBOT1RFOiBmb2xsb3dpbmcgc2VjdGlvbiB3aWxsIGJlIHJlcGxhY2VkIGJ5IGJsa2RlYWN0aXZhdGUgc2NyaXB0CisJIyB3aXRoIG9wdGlvbiBzdXBwb3J0aW5nIHJlcXVlc3QgdG8gZGVhY3RpdmF0ZSBhbGwgY2x1c3RlcmVkIHZvbHVtZQorCSMgZ3JvdXBzIGluIHRoZSBzeXN0ZW0KKwlbIC16ICRMVk1fVkdTIF0gJiYgTFZNX1ZHUz0iJChjbHVzdGVyZWRfdmdzKSIKKwlpZiBbIC1uICIkTFZNX1ZHUyIgXTsgdGhlbgorCQllY2hvIC1uICJEZWFjdGl2YXRpbmcgY2x1c3RlcmVkIFZHKHMpOiAiCisJCSR7bHZtX3ZnY2hhbmdlfSAtYW5sICRMVk1fVkdTIHx8IHJldHVybiAxCisJZmkKKworCXJldHVybiAwCit9CisKK2Nhc2UgIiQxIiBpbgorICBkZWFjdGl2YXRlKQorCWRlYWN0aXZhdGUKKwlydHJuPSQ/CisJOzsKKyAgYWN0aXZhdGUpCisJYWN0aXZhdGUKKwlydHJuPSQ/CisJOzsKKyAgKikKKwllY2hvICQiVXNhZ2U6ICQwIHthY3RpdmF0ZXxkZWFjdGl2YXRlfSIKKwlydHJuPTMKKwk7OworZXNhYworCitleGl0ICRydHJuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfY2x1c3Rlcl9hY3RpdmF0aW9uX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluIGIvc2NyaXB0cy9sdm0yX2NsdXN0ZXJfYWN0aXZhdGlvbl9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzBlOTNhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX2NsdXN0ZXJfYWN0aXZhdGlvbl9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpAQCAtMCwwICsxLDE3IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUNsdXN0ZXJlZCBMVk0gdm9sdW1lcyBhY3RpdmF0aW9uIHNlcnZpY2UKK1JlcXVpcmVzPWx2bTItY2x2bWQuc2VydmljZQorQWZ0ZXI9bHZtMi1jbHZtZC5zZXJ2aWNlIGx2bTItY21pcnJvcmQuc2VydmljZQorT25GYWlsdXJlPWx2bTItY2x2bWQuc2VydmljZQorRGVmYXVsdERlcGVuZGVuY2llcz1ubworQ29uZmxpY3RzPXNodXRkb3duLnRhcmdldAorCitbU2VydmljZV0KK1R5cGU9c2ltcGxlCitSZW1haW5BZnRlckV4aXQ9eWVzCitFbnZpcm9ubWVudEZpbGU9LUBzeXNjb25mZGlyQC9zeXNjb25maWcvY2x2bWQKK0V4ZWNTdGFydD1Ac3lzdGVtZHV0aWxkaXJAL2x2bTItY2x1c3Rlci1hY3RpdmF0aW9uIGFjdGl2YXRlCitFeGVjU3RvcD1Ac3lzdGVtZHV0aWxkaXJAL2x2bTItY2x1c3Rlci1hY3RpdmF0aW9uIGRlYWN0aXZhdGUKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluIGIvc2NyaXB0cy9sdm0yX2Nsdm1kX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDZmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfY2x2bWRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwyMyBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1DbHVzdGVyZWQgTFZNIGRhZW1vbgorRG9jdW1lbnRhdGlvbj1tYW46Y2x2bWQoOCkKK0FmdGVyPWRsbS5zZXJ2aWNlIGNvcm9zeW5jLnNlcnZpY2UKK0JlZm9yZT1yZW1vdGUtZnMtcHJlLnRhcmdldAorUmVxdWlyZXM9bmV0d29yay50YXJnZXQgZGxtLnNlcnZpY2UgY29yb3N5bmMuc2VydmljZQorUmVmdXNlTWFudWFsU3RhcnQ9dHJ1ZQorUmVmdXNlTWFudWFsU3RvcD10cnVlCitTdG9wV2hlblVubmVlZGVkPXRydWUKK0RlZmF1bHREZXBlbmRlbmNpZXM9bm8KK0NvbmZsaWN0cz1zaHV0ZG93bi50YXJnZXQKKworW1NlcnZpY2VdCitUeXBlPWZvcmtpbmcKK0Vudmlyb25tZW50PUNMVk1EX09QVFM9LVQzMAorRW52aXJvbm1lbnRGaWxlPS1Ac3lzY29uZmRpckAvc3lzY29uZmlnL2Nsdm1kCitFeGVjU3RhcnQ9QHNiaW5kaXJAL2Nsdm1kICRDTFZNRF9PUFRTCitTdWNjZXNzRXhpdFN0YXR1cz01CitUaW1lb3V0U3RhcnRTZWM9MzAKK1RpbWVvdXRTdG9wU2VjPTEwCitPT01TY29yZUFkanVzdD0tMTAwMAorUmVzdGFydD1vbi1hYm9ydAorUElERmlsZT1AQ0xWTURfUElERklMRUAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtMl9jbWlycm9yZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbiBiL3NjcmlwdHMvbHZtMl9jbWlycm9yZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZjMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX2NtaXJyb3JkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsMTcgQEAKK1tVbml0XQorRGVzY3JpcHRpb249Q2x1c3RlcmVkIExWTSBtaXJyb3IgbG9nIGRhZW1vbgorRG9jdW1lbnRhdGlvbj1tYW46Y21pcnJvcmQoOCkKK1JlcXVpcmVzPWNvcm9zeW5jLnNlcnZpY2UKK0FmdGVyPWNvcm9zeW5jLnNlcnZpY2UKK0JlZm9yZT1yZW1vdGUtZnMtcHJlLnRhcmdldAorRGVmYXVsdERlcGVuZGVuY2llcz1ubworQ29uZmxpY3RzPXNodXRkb3duLnRhcmdldAorCitbU2VydmljZV0KK1R5cGU9Zm9ya2luZworRXhlY1N0YXJ0PUBzYmluZGlyQC9jbWlycm9yZAorUElERmlsZT1AQ01JUlJPUkRfUElERklMRUAKK1Jlc3RhcnQ9b24tYWJvcnQKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluIGIvc2NyaXB0cy9sdm0yX2x2bWRidXNkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2VjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtZGJ1c2Rfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxMSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1MVk0yIEQtQnVzIHNlcnZpY2UKK0RvY3VtZW50YXRpb249bWFuOmx2bWRidXNkKDgpCisKK1tTZXJ2aWNlXQorVHlwZT1kYnVzCitCdXNOYW1lPWNvbS5yZWRoYXQubHZtZGJ1czEKK0V4ZWNTdGFydD1Ac2JpbmRpckAvbHZtZGJ1c2QKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX2x2bWV0YWRfaW5pdF9yZWRfaGF0LmluIGIvc2NyaXB0cy9sdm0yX2x2bWV0YWRfaW5pdF9yZWRfaGF0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtZXRhZF9pbml0X3JlZF9oYXQuaW4KQEAgLTAsMCArMSwxMTIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjIEl0IGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVyIGhhbmRsaW5nIG9mIGZhaWx1cmVzIG9mIExWTTIgbWlycm9yCisjIGRldmljZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgdXNpbmcgdGhlIC1tIG9wdGlvbiBvZiBsdmNyZWF0ZS4KKyMKKyMKKyMgY2hrY29uZmlnOiAxMjM0NSAwMiA5OQorIyBkZXNjcmlwdGlvbjogU3RhcnRzIGFuZCBzdG9wcyBMVk0gbWV0YWRhdGEgZGFlbW9uCisjCisjIEZvciBSZWQtSGF0LWJhc2VkIGRpc3RyaWJ1dGlvbnMgc3VjaCBhcyBGZWRvcmEsIFJIRUwsIENlbnRPUy4KKyMKKyMjIyBCRUdJTiBJTklUIElORk8KKyMgUHJvdmlkZXM6IGx2bTItbHZtZXRhZAorIyBSZXF1aXJlZC1TdGFydDogJGxvY2FsX2ZzCisjIFJlcXVpcmVkLVN0b3A6ICRsb2NhbF9mcworIyBEZWZhdWx0LVN0YXJ0OiAxIDIgMyA0IDUKKyMgRGVmYXVsdC1TdG9wOiAwIDYKKyMgU2hvcnQtRGVzY3JpcHRpb246IEEgZGFlbW9uIHRoYXQgbWFpbnRhaW5zIExWTSBtZXRhZGF0YSBzdGF0ZSBmb3IgaW1wcm92ZWQKKyMgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGJ5IGF2b2lkaW5nIGZ1cnRoZXIgc2NhbnMgd2hpbGUgcnVubmluZworIyAgICAgICAgICAgICAgICAgICAgc3Vic2VxdWVudCBMVk0gY29tbWFuZHMgb3Igd2hpbGUgdXNpbmcgbHZtMmFwcCBsaWJyYXJ5LgorIyMjIEVORCBJTklUIElORk8KKworLiAvZXRjL2luaXQuZC9mdW5jdGlvbnMKKworREFFTU9OPWx2bWV0YWQKKworZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorc2JpbmRpcj1Ac2JpbmRpckAKKworTE9DS19GSUxFPSIvdmFyL2xvY2svc3Vic3lzLyREQUVNT04iCitQSURfRklMRT0iQExWTUVUQURfUElERklMRUAiCisKK3JoX3N0YXR1cygpIHsKKwlzdGF0dXMgLXAgJFBJRF9GSUxFICREQUVNT04KK30KKworcmhfc3RhdHVzX3EoKSB7CisJcmhfc3RhdHVzID4vZGV2L251bGwgMj4mMQorfQorCitzdGFydCgpCit7CisJcmV0PTAKKwlhY3Rpb24gIlN0YXJ0aW5nIExWTSBtZXRhZGF0YSBkYWVtb246IiAkREFFTU9OIHx8IHJldD0kPworCXJldHVybiAkcmV0Cit9CisKKworc3RvcCgpCit7CisJcmV0PTAKKwlhY3Rpb24gIlNpZ25hbGluZyBMVk0gbWV0YWRhdGEgZGFlbW9uIHRvIGV4aXQ6IiBraWxscHJvYyAtcCAkUElEX0ZJTEUgJERBRU1PTiAtVEVSTSB8fCByZXQ9JD8KKwlyZXR1cm4gJHJldAorfQorCitydHJuPTEKKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorCXJoX3N0YXR1c19xICYmIGV4aXQgMAorCXN0YXJ0CisJcnRybj0kPworCVsgJHJ0cm4gPSAwIF0gJiYgdG91Y2ggJExPQ0tfRklMRQorCTs7CisKKyAgc3RvcHxmb3JjZS1zdG9wKQorCXJoX3N0YXR1c19xIHx8IGV4aXQgMAorCXN0b3AKKwlydHJuPSQ/CisJWyAkcnRybiA9IDAgXSAmJiBybSAtZiAkTE9DS19GSUxFCisJOzsKKworICByZXN0YXJ0KQorCWlmIHN0b3AKKwl0aGVuCisJCXN0YXJ0CisJZmkKKwlydHJuPSQ/CisJOzsKKworICBjb25kcmVzdGFydHx0cnktcmVzdGFydCkKKwlyaF9zdGF0dXNfcSB8fCBleGl0IDAKKwlpZiBzdG9wCisJdGhlbgorCQlzdGFydAorCWZpCisJcnRybj0kPworCTs7CisKKyAgc3RhdHVzKQorCXJoX3N0YXR1cworCXJ0cm49JD8KKwk7OworCisgICopCisJZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxmb3JjZS1zdG9wfHJlc3RhcnR8Y29uZHJlc3RhcnR8dHJ5LXJlc3RhcnR8c3RhdHVzfSIKKwk7OworZXNhYworCitleGl0ICRydHJuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbiBiL3NjcmlwdHMvbHZtMl9sdm1ldGFkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGM2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpAQCAtMCwwICsxLDE4IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUxWTTIgbWV0YWRhdGEgZGFlbW9uCitEb2N1bWVudGF0aW9uPW1hbjpsdm1ldGFkKDgpCitSZXF1aXJlcz1sdm0yLWx2bWV0YWQuc29ja2V0CitBZnRlcj1sdm0yLWx2bWV0YWQuc29ja2V0CitEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCitDb25mbGljdHM9c2h1dGRvd24udGFyZ2V0CisKK1tTZXJ2aWNlXQorVHlwZT1zaW1wbGUKK05vbkJsb2NraW5nPXRydWUKK0V4ZWNTdGFydD1Ac2JpbmRpckAvbHZtZXRhZCAtZgorRW52aXJvbm1lbnQ9U0RfQUNUSVZBVElPTj0xCitSZXN0YXJ0PW9uLWFib3J0CitQSURGaWxlPUBMVk1FVEFEX1BJREZJTEVACisKK1tJbnN0YWxsXQorV2FudGVkQnk9c3lzaW5pdC50YXJnZXQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtMl9sdm1ldGFkX3N5c3RlbWRfcmVkX2hhdC5zb2NrZXQuaW4gYi9zY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzVmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtZXRhZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0LmluCkBAIC0wLDAgKzEsMTIgQEAKK1tVbml0XQorRGVzY3JpcHRpb249TFZNMiBtZXRhZGF0YSBkYWVtb24gc29ja2V0CitEb2N1bWVudGF0aW9uPW1hbjpsdm1ldGFkKDgpCitEZWZhdWx0RGVwZW5kZW5jaWVzPW5vCisKK1tTb2NrZXRdCitMaXN0ZW5TdHJlYW09QERFRkFVTFRfUlVOX0RJUkAvbHZtZXRhZC5zb2NrZXQKK1NvY2tldE1vZGU9MDYwMAorUmVtb3ZlT25TdG9wPXRydWUKKworW0luc3RhbGxdCitXYW50ZWRCeT1zeXNpbml0LnRhcmdldApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluIGIvc2NyaXB0cy9sdm0yX2x2bWxvY2tkX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzdkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtbG9ja2Rfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxNiBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1MVk0yIGxvY2sgZGFlbW9uCitEb2N1bWVudGF0aW9uPW1hbjpsdm1sb2NrZCg4KQorQWZ0ZXI9bHZtMi1sdm1ldGFkLnNlcnZpY2UKKworW1NlcnZpY2VdCitUeXBlPXNpbXBsZQorTm9uQmxvY2tpbmc9dHJ1ZQorRXhlY1N0YXJ0PUBzYmluZGlyQC9sdm1sb2NrZCAtZgorRW52aXJvbm1lbnQ9U0RfQUNUSVZBVElPTj0xCitQSURGaWxlPUBMVk1MT0NLRF9QSURGSUxFQAorU2VuZFNJR0tJTEw9bm8KKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbHZtbG9ja2luZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbiBiL3NjcmlwdHMvbHZtMl9sdm1sb2NraW5nX3N5c3RlbWRfcmVkX2hhdC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWM1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtbG9ja2luZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpAQCAtMCwwICsxLDI0IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUF2YWlsYWJpbGl0eSBvZiBsb2Nrc3BhY2VzIGluIGx2bWxvY2tkCitEb2N1bWVudGF0aW9uPW1hbjpsdm1sb2NrZCg4KQorQWZ0ZXI9bHZtMi1sdm1sb2NrZC5zZXJ2aWNlIHNhbmxvY2suc2VydmljZSBkbG0uc2VydmljZQorCitbU2VydmljZV0KK1R5cGU9b25lc2hvdAorUmVtYWluQWZ0ZXJFeGl0PXllcworCisjIHN0YXJ0IGxvY2tzcGFjZXMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZmluaXNoIHN0YXJ0aW5nCitFeGVjU3RhcnQ9QHNiaW5kaXJAL3ZnY2hhbmdlIC0tbG9jay1zdGFydCAtLWxvY2stb3B0IGF1dG93YWl0CisKKyMgYXV0byBhY3RpdmF0ZSBMVnMgaW4gdGhlIG5ld2x5IHN0YXJ0ZWQgbG9ja2QgVkdzCitFeGVjU3RhcnQ9QHNiaW5kaXJAL3ZnY2hhbmdlIC1hYXkgLVMgJ2xvY2t0eXBlPXNhbmxvY2sgfHwgbG9ja3R5cGU9ZGxtJworCisjIGRlYWN0aXZhdGUgTFZzIGluIGxvY2tkIFZHcworRXhlY1N0b3A9QHNiaW5kaXJAL3ZnY2hhbmdlIC1hbiAtUyAnbG9ja3R5cGU9c2FubG9jayB8fCBsb2NrdHlwZT1kbG0nCisKKyMgc3RvcCBsb2Nrc3BhY2VzIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaCBzdG9wcGluZworRXhlY1N0b3A9QHNiaW5kaXJAL2x2bWxvY2tjdGwgLS1zdG9wLWxvY2tzcGFjZXMgLS13YWl0IDEKKworW0luc3RhbGxdCitXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbHZtcG9sbGRfaW5pdF9yZWRfaGF0LmluIGIvc2NyaXB0cy9sdm0yX2x2bXBvbGxkX2luaXRfcmVkX2hhdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIxOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX2x2bXBvbGxkX2luaXRfcmVkX2hhdC5pbgpAQCAtMCwwICsxLDExNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMgSXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXIgaGFuZGxpbmcgb2YgZmFpbHVyZXMgb2YgTFZNMiBtaXJyb3IKKyMgZGV2aWNlcyB0aGF0IHdlcmUgY3JlYXRlZCB1c2luZyB0aGUgLW0gb3B0aW9uIG9mIGx2Y3JlYXRlLgorIworIworIyBjaGtjb25maWc6IDEyMzQ1IDAyIDk5CisjIGRlc2NyaXB0aW9uOiBTdGFydHMgYW5kIHN0b3BzIExWTSBwb2xsIGRhZW1vbgorIworIyBGb3IgUmVkLUhhdC1iYXNlZCBkaXN0cmlidXRpb25zIHN1Y2ggYXMgRmVkb3JhLCBSSEVMLCBDZW50T1MuCisjCisjIyMgQkVHSU4gSU5JVCBJTkZPCisjIFByb3ZpZGVzOiBsdm0yLWx2bXBvbGxkCisjIFJlcXVpcmVkLVN0YXJ0OiAkbG9jYWxfZnMKKyMgUmVxdWlyZWQtU3RvcDogJGxvY2FsX2ZzCisjIERlZmF1bHQtU3RhcnQ6IDEgMiAzIDQgNQorIyBEZWZhdWx0LVN0b3A6IDAgNgorIyBTaG9ydC1EZXNjcmlwdGlvbjogQSBkYWVtb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgbW9uaXRvcmluZyBpbi1wcm9ncmVzcworIwkJICAgICBhbmQgcG9zc2libHkgbG9uZ2VyIHRlcm0gb3BlcmF0aW9ucyBvbiBsb2dpY2FsIHZvbHVtZXMuIAorIwkJICAgICBJdCBoZWxwcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzcGF3bmVkIHByb2Nlc3NlcyBpZiBzYW1lCisjICAgICAgICAgICAgICAgICAgICBsb2dpY2FsIHZvbHVtZSBpcyByZXF1ZXN0ZWQgdG8gZ2V0IG1vbml0b3JlZCBtdWx0aXBsZSB0aW1lcy4KKyMgICAgICAgICAgICAgICAgICAgIEFsc28gYXZvaWRzIHVuc29saWNpdGVkIHRlcm1pbmF0aW9uIGR1ZSB0byBleHRlcm5hbCBmYWN0b3JzLgorIyMjIEVORCBJTklUIElORk8KKworLiAvZXRjL2luaXQuZC9mdW5jdGlvbnMKKworREFFTU9OPWx2bXBvbGxkCisKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK3NiaW5kaXI9QHNiaW5kaXJACisKK0xPQ0tfRklMRT0iL3Zhci9sb2NrL3N1YnN5cy8kREFFTU9OIgorUElEX0ZJTEU9IkBMVk1QT0xMRF9QSURGSUxFQCIKKworcmhfc3RhdHVzKCkgeworCXN0YXR1cyAtcCAkUElEX0ZJTEUgJERBRU1PTgorfQorCityaF9zdGF0dXNfcSgpIHsKKwlyaF9zdGF0dXMgPi9kZXYvbnVsbCAyPiYxCit9CisKK3N0YXJ0KCkKK3sKKwlyZXQ9MAorCWFjdGlvbiAiU3RhcnRpbmcgTFZNIHBvbGwgZGFlbW9uOiIgJERBRU1PTiB8fCByZXQ9JD8KKwlyZXR1cm4gJHJldAorfQorCisKK3N0b3AoKQoreworCXJldD0wCisJYWN0aW9uICJTaWduYWxpbmcgTFZNIHBvbGwgZGFlbW9uIHRvIGV4aXQ6IiBraWxscHJvYyAtcCAkUElEX0ZJTEUgJERBRU1PTiAtVEVSTSB8fCByZXQ9JD8KKwlyZXR1cm4gJHJldAorfQorCitydHJuPTEKKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorCXJoX3N0YXR1c19xICYmIGV4aXQgMAorCXN0YXJ0CisJcnRybj0kPworCVsgJHJ0cm4gPSAwIF0gJiYgdG91Y2ggJExPQ0tfRklMRQorCTs7CisKKyAgc3RvcHxmb3JjZS1zdG9wKQorCXJoX3N0YXR1c19xIHx8IGV4aXQgMAorCXN0b3AKKwlydHJuPSQ/CisJWyAkcnRybiA9IDAgXSAmJiBybSAtZiAkTE9DS19GSUxFCisJOzsKKworICByZXN0YXJ0KQorCWlmIHN0b3AKKwl0aGVuCisJCXN0YXJ0CisJZmkKKwlydHJuPSQ/CisJOzsKKworICBjb25kcmVzdGFydHx0cnktcmVzdGFydCkKKwlyaF9zdGF0dXNfcSB8fCBleGl0IDAKKwlpZiBzdG9wCisJdGhlbgorCQlzdGFydAorCWZpCisJcnRybj0kPworCTs7CisKKyAgc3RhdHVzKQorCXJoX3N0YXR1cworCXJ0cm49JD8KKwk7OworCisgICopCisJZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxmb3JjZS1zdG9wfHJlc3RhcnR8Y29uZHJlc3RhcnR8dHJ5LXJlc3RhcnR8c3RhdHVzfSIKKwk7OworZXNhYworCitleGl0ICRydHJuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4gYi9zY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmZjQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpAQCAtMCwwICsxLDE3IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUxWTTIgcG9sbCBkYWVtb24KK0RvY3VtZW50YXRpb249bWFuOmx2bXBvbGxkKDgpCitSZXF1aXJlcz1sdm0yLWx2bXBvbGxkLnNvY2tldAorQWZ0ZXI9bHZtMi1sdm1wb2xsZC5zb2NrZXQKK0RlZmF1bHREZXBlbmRlbmNpZXM9bm8KK0NvbmZsaWN0cz1zaHV0ZG93bi50YXJnZXQKKworW1NlcnZpY2VdCitUeXBlPXNpbXBsZQorTm9uQmxvY2tpbmc9dHJ1ZQorRXhlY1N0YXJ0PUBzYmluZGlyQC9sdm1wb2xsZCAtdCA2MCAtZgorRW52aXJvbm1lbnQ9U0RfQUNUSVZBVElPTj0xCitQSURGaWxlPUBMVk1QT0xMRF9QSURGSUxFQAorCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldC5pbiBiL3NjcmlwdHMvbHZtMl9sdm1wb2xsZF9zeXN0ZW1kX3JlZF9oYXQuc29ja2V0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWYxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJfbHZtcG9sbGRfc3lzdGVtZF9yZWRfaGF0LnNvY2tldC5pbgpAQCAtMCwwICsxLDEyIEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUxWTTIgcG9sbCBkYWVtb24gc29ja2V0CitEb2N1bWVudGF0aW9uPW1hbjpsdm1wb2xsZCg4KQorRGVmYXVsdERlcGVuZGVuY2llcz1ubworCitbU29ja2V0XQorTGlzdGVuU3RyZWFtPUBERUZBVUxUX1JVTl9ESVJAL2x2bXBvbGxkLnNvY2tldAorU29ja2V0TW9kZT0wNjAwCitSZW1vdmVPblN0b3A9dHJ1ZQorCitbSW5zdGFsbF0KK1dhbnRlZEJ5PXN5c2luaXQudGFyZ2V0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQuaW4gYi9zY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JlZF9oYXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3ZmYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMl9tb25pdG9yaW5nX2luaXRfcmVkX2hhdC5pbgpAQCAtMCwwICsxLDEzNSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIyBJdCBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlciBoYW5kbGluZyBvZiBmYWlsdXJlcyBvZiBMVk0yIG1pcnJvcgorIyBkZXZpY2VzIHRoYXQgd2VyZSBjcmVhdGVkIHVzaW5nIHRoZSAtbSBvcHRpb24gb2YgbHZjcmVhdGUuCisjCisjCisjIGNoa2NvbmZpZzogMTIzNDUgMDIgOTkKKyMgZGVzY3JpcHRpb246IFN0YXJ0cyBhbmQgc3RvcHMgZG1ldmVudGQgbW9uaXRvcmluZyBmb3IgbHZtMgorIworIyBGb3IgUmVkLUhhdC1iYXNlZCBkaXN0cmlidXRpb25zIHN1Y2ggYXMgRmVkb3JhLCBSSEVMLCBDZW50T1MuCisjCSAgICAgICAKKyMjIyBCRUdJTiBJTklUIElORk8KKyMgUHJvdmlkZXM6IGx2bTItbW9uaXRvcgorIyBSZXF1aXJlZC1TdGFydDogJGxvY2FsX2ZzCisjIFJlcXVpcmVkLVN0b3A6ICRsb2NhbF9mcworIyBEZWZhdWx0LVN0YXJ0OiAxIDIgMyA0IDUKKyMgRGVmYXVsdC1TdG9wOiAwIDYKKyMgU2hvcnQtRGVzY3JpcHRpb246IE1vbml0b3Jpbmcgb2YgTFZNMiBtaXJyb3JzLCBzbmFwc2hvdHMgZXRjLiB1c2luZyBkbWV2ZW50ZCBvciBwcm9ncmVzcyBwb2xsaW5nCisjIyMgRU5EIElOSVQgSU5GTworCisuIC9ldGMvaW5pdC5kL2Z1bmN0aW9ucworCitEQUVNT049bHZtMi1tb25pdG9yCitETUVWRU5URF9EQUVNT049ZG1ldmVudGQKKworZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorc2JpbmRpcj1Ac2JpbmRpckAKKworVkdDSEFOR0U9JHtzYmluZGlyfS92Z2NoYW5nZQorVkdTPSR7c2JpbmRpcn0vdmdzCitMVlM9JHtzYmluZGlyfS9sdnMKKworTE9DS19GSUxFPSIvdmFyL2xvY2svc3Vic3lzLyREQUVNT04iCitQSURfRklMRT0iQERNRVZFTlREX1BJREZJTEVAIgorCitXQVJOPTEKK2V4cG9ydCBMVk1fU1VQUFJFU1NfTE9DS0lOR19GQUlMVVJFX01FU1NBR0VTPTEKKworcmhfc3RhdHVzKCkgeworCXN0YXR1cyAtcCAkUElEX0ZJTEUgJERNRVZFTlREX0RBRU1PTgorfQorCityaF9zdGF0dXNfcSgpIHsKKwlyaF9zdGF0dXMgPi9kZXYvbnVsbCAyPiYxCit9CitzdGFydCgpCit7CisJcmV0PTAKKwkjIFRPRE8gZG8gd2Ugd2FudCB0byBzZXBhcmF0ZSBvdXQgYWxyZWFkeSBhY3RpdmUgZ3JvdXBzIG9ubHk/CisJVkdTTElTVD1gJFZHUyAtLW5vaGVhZGluZ3MgLW8gbmFtZSAtLWlnbm9yZXNraXBwZWRjbHVzdGVyIC0tY29uZmlnICdsb2d7Y29tbWFuZF9uYW1lcz0wIHByZWZpeD0iICAifScgMj4gL2Rldi9udWxsYAorCWZvciB2ZyBpbiAkVkdTTElTVAorCWRvCisJICAgIGFjdGlvbiAiU3RhcnRpbmcgbW9uaXRvcmluZyBmb3IgVkcgJHZnOiIgJFZHQ0hBTkdFIC0tbW9uaXRvciB5IC0tcG9sbCB5IC0taWdub3Jlc2tpcHBlZGNsdXN0ZXIgLS1jb25maWcgJ2xvZ3tjb21tYW5kX25hbWVzPTAgcHJlZml4PSIgICJ9JyAkdmcgfHwgcmV0PSQ/CisJZG9uZQorCisJcmV0dXJuICRyZXQKK30KKworCitzdG9wKCkKK3sKKwlyZXQ9MAorCSMgVE9ETyBkbyB3ZSB3YW50IHRvIHNlcGFyYXRlIG91dCBhbHJlYWR5IGFjdGl2ZSBncm91cHMgb25seT8KKwlpZiB0ZXN0ICIkV0FSTiIgPSAiMSI7IHRoZW4KKwkgICBlY2hvICJOb3Qgc3RvcHBpbmcgbW9uaXRvcmluZywgdGhpcyBpcyBhIGRhbmdlcm91cyBvcGVyYXRpb24uIFBsZWFzZSB1c2UgZm9yY2Utc3RvcCB0byBvdmVycmlkZS4iCisJICAgcmV0dXJuIDEKKwlmaQorCVZHU0xJU1Q9YCRWR1MgLS1ub2hlYWRpbmdzIC1vIG5hbWUgLS1pZ25vcmVza2lwcGVkY2x1c3RlciAtLWNvbmZpZyAnbG9ne2NvbW1hbmRfbmFtZXM9MCBwcmVmaXg9IiAgIn0nIDI+IC9kZXYvbnVsbGAKKwlmb3IgdmcgaW4gJFZHU0xJU1QKKwlkbworCSAgICBhY3Rpb24gIlN0b3BwaW5nIG1vbml0b3JpbmcgZm9yIFZHICR2ZzoiICRWR0NIQU5HRSAtLW1vbml0b3IgbiAtLWlnbm9yZXNraXBwZWRjbHVzdGVyIC0tY29uZmlnICdsb2d7Y29tbWFuZF9uYW1lcz0wIHByZWZpeD0iICAifScgJHZnIHx8IHJldD0kPworCWRvbmUKKwlyZXR1cm4gJHJldAorfQorCitydHJuPTEKKworIyBTZWUgaG93IHdlIHdlcmUgY2FsbGVkLgorY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorCXJoX3N0YXR1c19xICYmIGV4aXQgMAorCXN0YXJ0CisJcnRybj0kPworCVsgJHJ0cm4gPSAwIF0gJiYgdG91Y2ggJExPQ0tfRklMRQorCTs7CisKKyAgZm9yY2Utc3RvcCkKKwlyaF9zdGF0dXNfcSB8fCBleGl0IDAKKwlXQVJOPTAKKwlzdG9wCisJcnRybj0kPworCVsgJHJ0cm4gPSAwIF0gJiYgcm0gLWYgJExPQ0tfRklMRQorCTs7CisKKyAgc3RvcCkKKwlyaF9zdGF0dXNfcSB8fCBleGl0IDAKKwl0ZXN0ICIkcnVubGV2ZWwiID0gIjAiICYmIFdBUk49MAorCXRlc3QgIiRydW5sZXZlbCIgPSAiNiIgJiYgV0FSTj0wCisJc3RvcAorCXJ0cm49JD8KKwlbICRydHJuID0gMCBdICYmIHJtIC1mICRMT0NLX0ZJTEUKKwk7OworCisgIHJlc3RhcnQpCisJV0FSTj0wCisJaWYgc3RvcAorCXRoZW4KKwkJc3RhcnQKKwlmaSAKKwlydHJuPSQ/CisJOzsKKworICBzdGF0dXMpCisJcmhfc3RhdHVzCisJcnRybj0kPworCVsgJHJ0cm4gPSAwIF0gJiYgJExWUyAtUyAnc2VnX21vbml0b3I9bW9uaXRvcmVkJyAtbyBsdl9mdWxsX25hbWUsc2VnX21vbml0b3IKKwk7OworCisgICopCisJZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c3xmb3JjZS1zdG9wfSIKKwk7OworZXNhYworCitleGl0ICRydHJuCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19pbml0X3JoZWw0IGIvc2NyaXB0cy9sdm0yX21vbml0b3JpbmdfaW5pdF9yaGVsNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX21vbml0b3JpbmdfaW5pdF9yaGVsNApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMgSXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXIgaGFuZGxpbmcgb2YgZmFpbHVyZXMgb2YgTFZNMiBtaXJyb3IKKyMgZGV2aWNlcyB0aGF0IHdlcmUgY3JlYXRlZCB1c2luZyB0aGUgLW0gb3B0aW9uIG9mIGx2Y3JlYXRlLgorIworIworIyBjaGtjb25maWc6IDEyMzQ1IDAyIDk5CisjIGRlc2NyaXB0aW9uOiBTdGFydHMgYW5kIHN0b3BzIGRtZXZlbnRkIG1vbml0b3JpbmcgZm9yIGx2bTIKKyMJICAgICAgIAorIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczogCisjIyMgRU5EIElOSVQgSU5GTworCisuIC9ldGMvaW5pdC5kL2Z1bmN0aW9ucworCitWR0NIQU5HRT0iL3Vzci9zYmluL3ZnY2hhbmdlIgorV0FSTj0xCisKK3N0YXJ0KCkKK3sKKwlyZXQ9MAorCSMgVE9ETyBkbyB3ZSB3YW50IHRvIHNlcGFyYXRlIG91dCBhbHJlYWR5IGFjdGl2ZSBncm91cHMgb25seT8KKwlWR1M9YHZncyAtLW5vaGVhZGluZ3MgLW8gbmFtZSAtLWNvbmZpZyAnbG9ne2NvbW1hbmRfbmFtZXM9MCBwcmVmaXg9IiAgIn0nIDI+IC9kZXYvbnVsbGAKKwlmb3IgdmcgaW4gJFZHUworCWRvCisJICAgIGFjdGlvbiAiU3RhcnRpbmcgbW9uaXRvcmluZyBmb3IgVkcgJHZnOiIgJFZHQ0hBTkdFIC0tbW9uaXRvciB5IC0tY29uZmlnICdsb2d7Y29tbWFuZF9uYW1lcz0wIHByZWZpeD0iICAifScgJHZnIHx8IHJldD0kPworCWRvbmUKKworCXJldHVybiAkcmV0Cit9CisKKworc3RvcCgpCit7CisJcmV0PTAKKwkjIFRPRE8gZG8gd2Ugd2FudCB0byBzZXBhcmF0ZSBvdXQgYWxyZWFkeSBhY3RpdmUgZ3JvdXBzIG9ubHk/CisJaWYgdGVzdCAiJFdBUk4iID0gIjEiOyB0aGVuCisJICAgZWNobyAiTm90IHN0b3BwaW5nIG1vbml0b3JpbmcsIHRoaXMgaXMgYSBkYW5nZXJvdXMgb3BlcmF0aW9uLiBQbGVhc2UgdXNlIGZvcmNlLXN0b3AgdG8gb3ZlcnJpZGUuIgorCSAgIHJldHVybiAxCisJZmkKKwlWR1M9YHZncyAtLW5vaGVhZGluZ3MgLW8gbmFtZSAtLWNvbmZpZyAnbG9ne2NvbW1hbmRfbmFtZXM9MCBwcmVmaXg9IiAgIn0nIDI+IC9kZXYvbnVsbGAKKwlmb3IgdmcgaW4gJFZHUworCWRvCisJICAgIGFjdGlvbiAiU3RvcHBpbmcgbW9uaXRvcmluZyBmb3IgVkcgJHZnOiIgJFZHQ0hBTkdFIC0tbW9uaXRvciBuIC0tY29uZmlnICdsb2d7Y29tbWFuZF9uYW1lcz0wIHByZWZpeD0iICAifScgJHZnIHx8IHJldD0kPworCWRvbmUKKwlyZXR1cm4gJHJldAorfQorCityZXN1bHQ9MQorCisjIFNlZSBob3cgd2Ugd2VyZSBjYWxsZWQuCitjYXNlICIkMSIgaW4KKyAgc3RhcnQpCisJc3RhcnQKKwlyZXN1bHQ9JD8KKwk7OworCisgIGZvcmNlLXN0b3ApCisJV0FSTj0wCisJc3RvcAorCXJlc3VsdD0kPworCTs7CisKKyAgc3RvcCkKKwl0ZXN0ICIkcnVubGV2ZWwiID0gIjAiICYmIFdBUk49MAorCXRlc3QgIiRydW5sZXZlbCIgPSAiNiIgJiYgV0FSTj0wCisJc3RvcAorCXJlc3VsdD0kPworCTs7CisKKyAgcmVzdGFydCkKKwlXQVJOPTAKKwlpZiBzdG9wCisJdGhlbgorCQlzdGFydAorCWZpIAorCXJlc3VsdD0kPworCTs7CisKKyAgc3RhdHVzKQorCSMgVE9ETyBhbnlvbmUgd2l0aCBhbiBpZGVhIGhvdyB0byBkdW1wIG1vbml0b3JlZCB2b2x1bWVzPworCTs7CisKKyAgKikKKwllY2hvICQiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfGZvcmNlLXN0b3B9IgorCTs7Citlc2FjCisKK2V4aXQgJHJlc3VsdApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX21vbml0b3Jpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4gYi9zY3JpcHRzL2x2bTJfbW9uaXRvcmluZ19zeXN0ZW1kX3JlZF9oYXQuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjIzOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX21vbml0b3Jpbmdfc3lzdGVtZF9yZWRfaGF0LnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxOCBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1Nb25pdG9yaW5nIG9mIExWTTIgbWlycm9ycywgc25hcHNob3RzIGV0Yy4gdXNpbmcgZG1ldmVudGQgb3IgcHJvZ3Jlc3MgcG9sbGluZworRG9jdW1lbnRhdGlvbj1tYW46ZG1ldmVudGQoOCkgbWFuOmx2Y3JlYXRlKDgpIG1hbjpsdmNoYW5nZSg4KSBtYW46dmdjaGFuZ2UoOCkKK1JlcXVpcmVzPWRtLWV2ZW50LnNvY2tldCBsdm0yLWx2bWV0YWQuc29ja2V0CitBZnRlcj1kbS1ldmVudC5zb2NrZXQgZG0tZXZlbnQuc2VydmljZSBsdm0yLWx2bWV0YWQuc29ja2V0IGx2bTItYWN0aXZhdGlvbi5zZXJ2aWNlIGx2bTItbHZtZXRhZC5zZXJ2aWNlCitCZWZvcmU9bG9jYWwtZnMtcHJlLnRhcmdldAorRGVmYXVsdERlcGVuZGVuY2llcz1ubworQ29uZmxpY3RzPXNodXRkb3duLnRhcmdldAorCitbU2VydmljZV0KK1R5cGU9b25lc2hvdAorRW52aXJvbm1lbnQ9TFZNX1NVUFBSRVNTX0xPQ0tJTkdfRkFJTFVSRV9NRVNTQUdFUz0xCitFeGVjU3RhcnQ9QHNiaW5kaXJAL2x2bSB2Z2NoYW5nZSAtLW1vbml0b3IgeSAtLWlnbm9yZXNraXBwZWRjbHVzdGVyCitFeGVjU3RvcD1Ac2JpbmRpckAvbHZtIHZnY2hhbmdlIC0tbW9uaXRvciBuIC0taWdub3Jlc2tpcHBlZGNsdXN0ZXIKK1JlbWFpbkFmdGVyRXhpdD15ZXMKKworW0luc3RhbGxdCitXYW50ZWRCeT1zeXNpbml0LnRhcmdldApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX3B2c2Nhbl9zeXN0ZW1kX3JlZF9oYXRALnNlcnZpY2UuaW4gYi9zY3JpcHRzL2x2bTJfcHZzY2FuX3N5c3RlbWRfcmVkX2hhdEAuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY1MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yX3B2c2Nhbl9zeXN0ZW1kX3JlZF9oYXRALnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxNSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1MVk0yIFBWIHNjYW4gb24gZGV2aWNlICVpCitEb2N1bWVudGF0aW9uPW1hbjpwdnNjYW4oOCkKK0RlZmF1bHREZXBlbmRlbmNpZXM9bm8KK0JpbmRzVG89ZGV2LWJsb2NrLSVpLmRldmljZQorUmVxdWlyZXM9bHZtMi1sdm1ldGFkLnNvY2tldAorQWZ0ZXI9bHZtMi1sdm1ldGFkLnNvY2tldCBsdm0yLWx2bWV0YWQuc2VydmljZQorQmVmb3JlPXNodXRkb3duLnRhcmdldAorQ29uZmxpY3RzPXNodXRkb3duLnRhcmdldAorCitbU2VydmljZV0KK1R5cGU9b25lc2hvdAorUmVtYWluQWZ0ZXJFeGl0PXllcworRXhlY1N0YXJ0PUBzYmluZGlyQC9sdm0gcHZzY2FuIC0tY2FjaGUgLS1hY3RpdmF0ZSBheSAlaQorRXhlY1N0b3A9QHNiaW5kaXJAL2x2bSBwdnNjYW4gLS1jYWNoZSAlaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yX3RtcGZpbGVzX3JlZF9oYXQuY29uZi5pbiBiL3NjcmlwdHMvbHZtMl90bXBmaWxlc19yZWRfaGF0LmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwMjYxNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMl90bXBmaWxlc19yZWRfaGF0LmNvbmYuaW4KQEAgLTAsMCArMSwyIEBACitkIEBERUZBVUxUX0xPQ0tfRElSQCAwNzAwIHJvb3Qgcm9vdCAtCitkIEBERUZBVUxUX1JVTl9ESVJAIDA3MDAgcm9vdCByb290IC0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvLmdpdGlnbm9yZSBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQwNjExCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm0yY3JlYXRlX2luaXRyZC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIU1ha2VmaWxlCishbHZtMmNyZWF0ZV9pbml0cmQuOApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yY3JlYXRlX2luaXRyZC9NYWtlZmlsZSBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiMTg5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACithbGw6CisJZWNobyAiTm90aGluZyB0byBkbyBmb3IgbWFrZSBhbGwiCisKK21hbnBhZ2U6CisJcG9kMm1hbiAtLWNlbnRlcj0iY3JlYXRlIExWTTIgaW5pdHJkIiAtLW5hbWU9J2x2bTJjcmVhdGVfaW5pdHJkJyAtLXNlY3Rpb249OCAtciAnbHZtMmNyZWF0ZV9pbml0cmQnIC4vbHZtMmNyZWF0ZV9pbml0cmQucG9kID4gbHZtMmNyZWF0ZV9pbml0cmQuOAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL1JFQURNRSBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWU5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL1JFQURNRQpAQCAtMCwwICsxLDQwIEBACitodHRwOi8vcG9vY2hpZXJlZHMubmV0L3N2bi9sdm0yLworCitUaGlzIGlzIHRoZSBsdm0yY3JlYXRlX2luaXRyZCBzY3JpcHQgd3JpdHRlbiBieSBNaWd1ZWwgQ2FiZWNhLCB3aXRoIHNvbWUgc21hbGwKK21vZGlmaWNhdGlvbnMgYnkgbXlzZWxmLgorCitIZXJlIGFyZSBzb21lIG90aGVyIHJlcXVpcmVtZW50cyBhbmQgdGlwcyBmb3IgdXNpbmcgaXQ6CisKKzEpIHRoaXMgc2NyaXB0IHVzZXMgYnVzeWJveCBvbiB0aGUgaW5pdHJkIGltYWdlLCBoZW5jZSBidXN5Ym94IG5lZWRzIHRvIGJlCitpbnN0YWxsZWQgd2hlbiB5b3UgY3JlYXRlIHlvdXIgaW5pdHJkLgorCisyKSBNYWtlIHN1cmUgL2V0Yy9sdm0vbHZtLmNvbmYgaXMgc2V0IHVwIGNvcnJlY3RseSBiZWZvcmUgcnVubmluZyB0aGlzLiBJbgorcGFydGljdWxhciwgaWYgeW91J3JlIHVzaW5nIExWTSBvbiBSQUlELCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhIGZpbHRlciB0aGF0CitleGNsdWRlcyB0aGUgUkFJRCBjb21wb25lbnQgZGV2aWNlcyAodGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeSB3aXRoIHRoZSBsYXRlc3QKK3BhdGNoIGJ5IEx1Y2EgQmVycmEsIGJ1dCBpdCBkb2Vzbid0IGh1cnQpLgorCiszKSBUaGlzIGluaXRyZCBpbWFnZSBkb2VzIG5vdCBzdXBwb3J0IG1vZHVsZXMuIElmIHlvdSBuZWVkIHRvIHBsdWcgaW4gYW55CitrZXJuZWwgbW9kdWxlcyBkdXJpbmcgdGhlIGluaXRyZCBwaGFzZSwgdGhlbiB5b3UnbGwgbmVlZCB0byBoYW5kLW1vZGlmeSB0aGUKK2ltYWdlLgorCis0KSBUaGUgZ2VuZXJhdGVkIGluaXRyZCBpbWFnZSBzdXBwb3J0cyBhbiAnbHZtMnJlc2N1ZScgbW9kZSBhcyB3ZWxsLiBJZiB5b3UgYWRkCit0aGUgcGFyYW1ldGVyICdsdm1yZXNjdWUnIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLCBpdCB3aWxsIHJ1biBhIHNoZWxsIGF0Cit0aGUgZW5kIG9mIHRoZSBpbml0cmQgJ2luaXQnIHNjcmlwdC4gVGhpcyBjYW4gYmUgaGVscGZ1bCB3aGVuIHRyeWluZyB0byBmaXggYQorY29ycnVwdCByb290IHZvbHVtZSBvciByb290IExWTTIgdm9sdW1lIGdyb3VwLgorCis1KSBObyB1c2Vyc3BhY2UgbWQgdG9vbHMgYXJlIGluc3RhbGxlZCwgc28gaWYgeW91J3JlIHVzaW5nIExWTSBvbiBSQUlELCB0aGVuCit5b3UnbGwgcHJvYmFibHkgd2FudCB0byBtYXJrIHlvdXIgUkFJRCBwYXJ0aXRpb25zIGFzIHR5cGUgJ2ZkJyBzbyB0aGF0IHRoZQora2VybmVsIHdpbGwgc3RhcnQgdGhlbSBhdXRvbWFnaWNhbGx5IChvciBoYW5kLW1vZGlmeSB0aGUgaW1hZ2UpLgorCis2KSBJJ20gbm90IHN1cmUgaWYgZGV2ZnMgd2lsbCB3b3JrIHdpdGggdGhpcyBvciBub3QuIHVkZXYsIGhvd2V2ZXIgZG9lcyB3b3JrLAorYW5kIGlzIHJlY29tbWVuZGVkLiBCZWNhdXNlIHRoZSBkbS0qIGRldmljZXMgdXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtYWpvcgorYW5kIG1pbm9yIG51bWJlcnMsIGtlcm5lbCB1cGdyYWRlcyBhbmQgdGhlIGxpa2UgY2FuIHJlbnVtYmVyIHlvdXIgZGV2aWNlcy4gVG8KK2ZpeCB0aGlzLCB5b3UgbmVlZCB0byBydW4gYSAndmdzY2FuIC0tbWtub2RlcycgcHJpb3IgdG8gZnNja2luZyBhbmQgbW91bnRpbmcKK3lvdXIgcm9vdGZzLiBEb2luZyB0aGlzIHdpdGggYSBzdGF0aWMgL2RldiBjcmVhdGVzIGEgcHJvYmxlbSB0aG91Z2ggLS0geW91Cit3aWxsIGJlIG1vZGlmeWluZyB0aGUgcm9vdCBmaWxlc3lzdGVtIGJlZm9yZSBpdCBoYXMgYmVlbiBmc2NrJ2VkLiB1ZGV2IGdldHMKK2Fyb3VuZCB0aGlzIGJ5IG1vdW50aW5nIGEgcmFtZGlzayBvdmVyIC9kZXYsIGJ1dCB5b3UnbGwgcHJvYmFibHkgbmVlZCB0byBhZGQKK2Egc3RhcnR1cCBzY3JpcHQgdGhhdCBjcmVhdGVzIGRldmljZXMgaW4gL2Rldi4gVGhlIGx2bTJ1ZGV2IHNjcmlwdCBpbiB0aGlzCitkaXJlY3RvcnkgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGEgYmVhc3QuCisKKy0tCitKZWZmcmV5IExheXRvbiA8anRsYXl0b25AcG9vY2hpZXJlZHMubmV0PgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm0yY3JlYXRlX2luaXRyZC9sdm0yY3JlYXRlX2luaXRyZCBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvbHZtMmNyZWF0ZV9pbml0cmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MGM1NQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvbHZtMmNyZWF0ZV9pbml0cmQKQEAgLTAsMCArMSw1MDIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIGx2bTJjcmVhdGVfaW5pdHJkIAorIworIyBNaWd1ZWwgQ2FiZWNhIAorIyBjYWJlY2EgKGF0KSBpc3QgKGRvdCkgdXRsIChkb3QpIHB0CisjCisjIEluc3BpcmF0aW9uIHRvIHdyaXRlIHRoaXMgc2NyaXB0IGNhbWUgZnJvbSB2YXJpb3VzIHNvdXJjZXMKKyMKKyMgT3JpZ2luYWwgTFZNIGx2bWNyZWF0ZV9pbml0cmQ6IGZ0cDovL2Z0cC5zaXN0aW5hLmNvbS9wdWIvTFZNLzEuMC8KKyMgS2VybmVsIGluaXRyZC50eHQ6IGh0dHA6Ly93d3cua2VybmVsLm9yZy8KKyMgRVZNUyBJTlNUQUxMLmluaXRyZCAmIGxpbnV4cmM6IGh0dHA6Ly9ldm1zLnNvdXJjZWZvcmdlLm5ldC8KKyMgSmVmZnJleSBMYXl0b24ncyBsdm0yY3JlYXRlX2luaXRyZDogaHR0cDovL3Bvb2NoaWVyZWRzLm5ldC9zdm4vbHZtMmNyZWF0ZV9pbml0cmQvCisjIENocmlzdG9waGUgU2FvdXQncyBpbml0cmQgJiBsaW51eHJjOiBodHRwOi8vd3d3LnNhb3V0LmRlL21pc2MvCisjCisjIFRoaXMgc2NyaXB0IHdhcyBvbmx5IHRlc3RlZCB3aXRoIGtlcm5lbCAyLjYgd2l0aCBldmVyeXRoaW5nIHJlcXVpcmVkIHRvIGJvb3QgCisjIHRoZSByb290IGZpbGVzeXN0ZW0gYnVpbHQtaW4gKG5vdCBhcyBtb2R1bGVzKS4gRXg6IFNDU0kgb3IgSURFLCBSQUlELCBkZXZpY2UgbWFwcGVyCisjIEl0IGRvZXMgbm90IHN1cHBvcnQgZGV2ZnMgYXMgaXQgaXMgZGVwcmVjYXRlZCBpbiB0aGUgMi42IGtlcm5lbCBzZXJpZXMKKyMKKyMgSXQgbmVlZHMgbHZtMiB0b29scywgYnVzeWJveCwgcGl2b3Rfcm9vdCwgTUFLRURFVgorIworIyBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gRGViaWFuIHNpZCAodW5zdGFibGUpIG9ubHkKKyMKKyMgQ2hhbmdlbG9nCisjIDI2LzAyLzIwMDQJSW5pdGlhbCByZWxlYXNlIC0tIE1pZ3VlbCBDYWJlY2EKKyMgMjcvMDIvMjAwNAlSZW1vdmVkIHRoZSBCVVNZQk9YU1lNTElOS1MgdmFyLiBUaGUgbGlua3MgYXJlIG5vdyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuCisjCQlzb21lIGNoYW5nZXMgaW4gaW5pdCBzY3JpcHQgdG8gY2FsbCBhIHNoZWxsIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiAtLSBNaWd1ZWwgQ2FiZWNhCisjIDE5LzA0LzIwMDQgICAgU2V2ZXJhbCBzbWFsbCBjaGFuZ2VzLiBQYXNzIGFyZ3MgdG8gaW5pdCBzbyBzaW5nbGUgdXNlciBtb2RlIHdvcmtzLiBBZGQgc29tZQorIyAgICAgICAgICAgICAgIFBBVEggZW50cmllcyB0byAvc2Jpbi9pbml0IHNoZWxsIHNjcmlwdCBzbyBjaHJvb3Qgd29ya3Mgd2l0aG91dCAvdXNyIG1vdW50ZWQuIFJlbW92ZQorIyAgICAgICAgICAgICAgIG1rZGlyIC9pbml0cmQgc28gd2UgZG9uJ3QgY2F1c2UgcHJvYmxlbXMgaWYgcm9vdCBmaWxlc3lzdGVtIGlzIGNvcnJ1cHRlZC4gLS0gSmVmZiBMYXl0b24KKyMgMTUvMDUvMjAwNAlpbml0aWFsIHN1cHBvcnQgZm9yIG1vZHVsZXMsIGNyZWF0ZSBsdm0uY29uZiBmcm9tIGx2bSBkdW1wY29uZmlnLCBvdGhlciBjbGVhbnVwcyAtLSBKZWZmIExheXRvbgorIyAxNC8xMS8yMDA2CVVwZGF0ZSBoYW5kbGluZyBvZiBsZGQgb3V0cHV0IHRvIGhhbmRsZSBoYXJkY29kZWQgbGlicmFyeSBsaW5rcyBhbmQgdmlydHVhbCBkbGwgbGludXgtZ2F0ZS4KKyMJCUFkZCBzdXBwb3J0IGZvciBHZW50b28tc3R5bGUgTUFLRURFVi4gUmVtb3ZlIGhhcmRjb2RlZCBCSU5VVElMUyBwYXRocyAtLSBEb3VnbGFzIE1heWxlCisjCisjIENvcHlyaWdodCBNaWd1ZWwgQ2FiZWNhLCBKZWZmcmV5IExheXRvbiwgMjAwNAorIworIyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjCisjICRJZCQKKworVE1QTU5UPS90bXAvbW50LiQkCitERVZSQU09L3RtcC9pbml0cmQuJCQKKworIyBzZXQgZGVmYXVsdHMKK0JJTkZJTEVTPSR7QklORklMRVM6LSJgd2hpY2ggbHZtYCBgd2hpY2ggYmFzaGAgYHdoaWNoIGJ1c3lib3hgIGB3aGljaCBwaXZvdF9yb290YCJ9CitCQVNJQ0RFVklDRVM9JHtCQVNJQ0RFVklDRVM6LSJzdGQgY29uc29sZW9ubHkgZmQifQorQkxPQ0tERVZJQ0VTPSR7QkxPQ0tERVZJQ0VTOi0ibWQgaGRhIGhkYiBoZGMgaGRkIHNkYSBzZGIgc2RjIHNkZCJ9CitNQUtFREVWPSR7TUFLRURFVjotImRlYmlhbiJ9CisKKyMgVW5jb21tZW50IHRoaXMgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhdXRvbWF0aWMgc2l6ZSBkZXRlY3Rpb24KKyNJTklUUkRTSVpFPTQwOTYKKworUEFUSD0vYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjokUEFUSAorCit1c2FnZSAoKSB7CisJZWNobyAiQ3JlYXRlIGFuIGluaXRpYWwgcmFtZGlzayBpbWFnZSBmb3IgTFZNMiByb290IGZpbGVzeXN0ZW0iCisJZWNobyAiJGNtZDogWy1oXSBbLXZdIFstYyBsdm0uY29uZl0gWy1tIG1vZHVsZWxpc3RdIFstZSBleHRyYWZpbGVzXSAtciBbcmFpZGRldnNdIFstUiBtZGFkbS5jb25mXSBbLU0gc3R5bGVdIFtrZXJuZWwgdmVyc2lvbl0iCisJZWNobyAiICAgICAgLWh8LS1oZWxwICAgICAgcHJpbnQgdGhpcyB1c2FnZSBtZXNzYWdlIgorCWVjaG8gIiAgICAgIC12fC0tdmVyYm9zZSAgIHZlcmJvc2UgcHJvZ3Jlc3MgbWVzc2FnZXMiCisJZWNobyAiICAgICAgLWN8LS1sdm1jb25mICAgcGF0aCB0byBsdm0uY29uZiAoL2V0Yy9sdm0vbHZtLmNvbmYpIgorCWVjaG8gIiAgICAgIC1tfC0tbW9kdWxlcyAgIG1vZHVsZXMgdG8gY29weSB0byBpbml0cmQgaW1hZ2UiCisJZWNobyAiICAgICAgLWV8LS1leHRyYSAgICAgZXh0cmEgZmlsZXMgdG8gYWRkIHRvIGluaXRyZCIKKwllY2hvICIgICAgICAtcnwtLXJhaWQgICAgICByYWlkIGRldmljZXMgdG8gc3RhcnQgaW4gaW5pdHJkIgorCWVjaG8gIiAgICAgIC1SfC0tcmFpZGNvbmYgIGxvY2F0aW9uIG9mIG1kYWRtLmNvbmYgZmlsZSB0byBpbmNsdWRlIgorCWVjaG8gIiAgICAgIC1NfC0tbWFrZWRldiAgIHNldCBNQUtFREVWIHR5cGUgKGRlYmlhbiwgcmVkaGF0LCBnZW50b28pIgorfQorCit2ZXJib3NlICgpIHsKKyAgIFsgIiRWRVJCT1NFIiBdICYmIGVjaG8gImBlY2hvICRjbWQgfCB0ciAnW2EtejAtOS9fXScgJyAnYCAtLSAkMSIgfHwgdHJ1ZQorfQorCitjbGVhbnVwICgpIHsKKyAgWyAiYG1vdW50IHwgZ3JlcCAkREVWUkFNYCIgXSAmJiB2ZXJib3NlICJ1bm1vdW50aW5nICRERVZSQU0iICYmIHVtb3VudCAkREVWUkFNCisgIFsgLWYgJERFVlJBTSBdICYmIHZlcmJvc2UgInJlbW92aW5nICRERVZSQU0iICYmIHJtICRERVZSQU0KKyAgWyAtZCAkVE1QTU5UIF0gJiYgdmVyYm9zZSAicmVtb3ZpbmcgJFRNUE1OVCIgJiYgcm1kaXIgJFRNUE1OVAorICB2ZXJib3NlICJleGl0IHdpdGggY29kZSAkMSIKKyAgZXhpdCAkMQorfQorCit0cmFwICIKKyAgdmVyYm9zZSAnQ2F1Z2h0IGludGVycnVwdCcKKyAgZWNobyAnQnllIGJ5ZS4uLicKKyAgY2xlYW51cCAxCisiIDEgMiAzIDE1CisKK2NyZWF0ZV9pbml0ICgpIHsKKyAgIGNhdCA8PCAnSU5JVCcgPiAkVE1QTU5UL3NiaW4vaW5pdAorIyEvYmluL2Jhc2gKKworIyBpbmNsdWRlIGluIHRoZSBwYXRoIHNvbWUgZGlycyBmcm9tIHRoZSByZWFsIHJvb3QgZmlsZXN5c3RlbQorIyBmb3IgY2hyb290LCBibG9ja2RldgorUEFUSD0iL3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW46L2xpYi9sdm0tMjAwOi9pbml0cmQvYmluOi9pbml0cmQvc2JpbiIKK1BSRT0iaW5pdHJkOiIKKworZG9fc2hlbGwoKXsKKyAgICAvYmluL2VjaG8KKyAgICAvYmluL2VjaG8gIioqKiBFbnRlcmluZyBMVk0yIHJlc2N1ZSBzaGVsbC4gRXhpdCBzaGVsbCB0byBjb250aW51ZSBib290aW5nLiAqKioiCisgICAgL2Jpbi9lY2hvCisgICAgL2Jpbi9iYXNoCit9CisKK2VjaG8gIiRQUkUgUmVtb3VudGluZyAvIHJlYWQvd3JpdGUiCittb3VudCAtdCBleHQyIC1vIHJlbW91bnQscncgL2Rldi9yYW0wIC8KKworCisjIFdlIG5lZWQgL3Byb2MgZm9yIGRldmljZSBtYXBwZXIKK2VjaG8gIiRQUkUgTW91bnRpbmcgL3Byb2MiCittb3VudCAtdCBwcm9jIG5vbmUgL3Byb2MKKworIyBwbHVnIGluIG1vZHVsZXMgbGlzdGVkIGluIC9ldGMvbW9kdWxlcworaWYgWyAtZiAvZXRjL21vZHVsZXMgXTsgdGhlbgorICAgIGVjaG8gLW4gIiRQUkUgcGx1Z2dpbmcgaW4ga2VybmVsIG1vZHVsZXM6IgorICAgIGNhdCAvZXRjL21vZHVsZXMgfAorICAgIHdoaWxlIHJlYWQgbW9kdWxlOyBkbworICAgICAgICBlY2hvIC1uICIgJG1vZHVsZSIKKyAgICAgICAgbW9kcHJvYmUgJG1vZHVsZQorICAgIGRvbmUKKyAgICBlY2hvICcuJworZmkKKworIyBzdGFydCByYWlkIGRldmljZXMgaWYgcmFpZF9hdXRvc3RhcnQgZmlsZSBleGlzdHMKK2lmIFsgLWYgL2V0Yy9yYWlkX2F1dG9zdGFydCBdOyB0aGVuCisgICAgaWYgWyAhIC1mIC9ldGMvbWRhZG0vbWRhZG0uY29uZiBdOyB0aGVuCisgICAgICAgIG1kb3B0aW9ucz0nLS1zdXBlci1taW5vcj1kZXYnCisgICAgZmkKKyAgICBjYXQgL2V0Yy9yYWlkX2F1dG9zdGFydHwKKyAgICB3aGlsZSByZWFkIGRldjsgZG8KKyAgICAJZWNobyAiU3RhcnRpbmcgUkFJRCBkZXZpY2UgJGRldiIKKyAgICAgICAgL3NiaW4vbWRhZG0gLS1hc3NlbWJsZSAkZGV2ICRtZG9wdGlvbnMgCisgICAgZG9uZQorZmkKKworIyBDcmVhdGUgdGhlIC9kZXYvbWFwcGVyL2NvbnRyb2wgZGV2aWNlIGZvciB0aGUgaW9jdGwKKyMgaW50ZXJmYWNlIHVzaW5nIHRoZSBtYWpvciBhbmQgbWlub3IgbnVtYmVycyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyMgZHluYW1pY2FsbHkuCisKK2VjaG8gLW4gIiRQUkUgRmluZGluZyBkZXZpY2UgbWFwcGVyIG1ham9yIGFuZCBtaW5vciBudW1iZXJzICIKKworTUFKT1I9JChzZWQgLW4gJ3MvXiAqXChbMC05XVwrXCkgXCttaXNjJC9cMS9wJyAvcHJvYy9kZXZpY2VzKQorTUlOT1I9JChzZWQgLW4gJ3MvXiAqXChbMC05XVwrXCkgXCtkZXZpY2UtbWFwcGVyJC9cMS9wJyAvcHJvYy9taXNjKQoraWYgdGVzdCAtbiAiJE1BSk9SIiAtYSAtbiAiJE1JTk9SIiA7IHRoZW4KKwlta2RpciAtcCAtbSA3NTUgL2Rldi9tYXBwZXIKKwlta25vZCAtbSA2MDAgL2Rldi9tYXBwZXIvY29udHJvbCBjICRNQUpPUiAkTUlOT1IKK2ZpCisKK2VjaG8gIigkTUFKT1IsJE1JTk9SKSIKKworIyBEZXZpY2UtTWFwcGVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhbGwgZGV2aWNlIG51bWJlcnMuIFRoaXMgbWVhbnMgaXQgaXMgcG9zc2libGUgCisjIHRoYXQgdGhlIHJvb3Qgdm9sdW1lIHNwZWNpZmllZCB0byBMSUxPIG9yIEdydWIgbWF5IGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIHdoZW4gdGhlCisjIGluaXRyZCBydW5zIHRoYW4gd2hlbiB0aGUgc3lzdGVtIHdhcyBsYXN0IHJ1bm5pbmcuIEluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUKKyMgY29ycmVjdCB2b2x1bWUgaXMgbW91bnRlZCBhcyByb290LCB0aGUgaW5pdCBzY3JpcHQgbXVzdCBkZXRlcm1pbmUgd2hhdCB0aGUKKyMgZGVzaXJlZCByb290IHZvbHVtZSBuYW1lIGlzIGJ5IGdldHRpbmcgdGhlIExWTTIgcm9vdCB2b2x1bWUgbmFtZSBmcm9tIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBJbiBvcmRlciBmb3IKKyMgdGhpcyB0byB3b3JrIGNvcnJlY3RseSwgImx2bTJyb290PS9kZXYvVm9sdW1lX0dyb3VwX05hbWUvUm9vdF9Wb2x1bWVfTmFtZSIgbmVlZHMgdG8gYmUgcGFzc2VkIAorIyB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAod2hlcmUgUm9vdF9Wb2x1bWVfTmFtZSBpcyByZXBsYWNlZCBieSB5b3VyIGFjdHVhbAorIyByb290IHZvbHVtZSdzIG5hbWUuCitmb3IgYXJnIGluIGBjYXQgL3Byb2MvY21kbGluZWA7IGRvCisJZWNobyAkYXJnIHwgZ3JlcCAnXmx2bTJyb290PScgPiAvZGV2L251bGwKKwlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJcm9vdHZvbD0ke2FyZyNsdm0ycm9vdD19CisJCWJyZWFrCisJZmkKK2RvbmUKKworZWNobyAiJFBSRSBBY3RpdmF0aW5nIExWTTIgdm9sdW1lcyIKKworCisjIHJ1biBhIHNoZWxsIGlmIHdlJ3JlIHBhc3NlZCBsdm0ycmVzY3VlIG9uIGNvbW1hbmRsaW5lCitncmVwIGx2bTJyZXNjdWUgL3Byb2MvY21kbGluZSAxPi9kZXYvbnVsbCAyPiYxCitpZiBbICQ/IC1lcSAwIF07IHRoZW4KKyAgICBsdm0gdmdjaGFuZ2UgLS1pZ25vcmVsb2NraW5nZmFpbHVyZSAtUCAtYSB5CisgICAgZG9fc2hlbGwKK2Vsc2UKKyAgICBsdm0gdmdjaGFuZ2UgLS1pZ25vcmVsb2NraW5nZmFpbHVyZSAtYSB5CitmaQorCitlY2hvICIkUFJFIE1vdW50aW5nIHJvb3QgZmlsZXN5c3RlbSAkcm9vdHZvbCBybyIKK21rZGlyIC9yb290dm9sCitpZiAhIG1vdW50IC10IGF1dG8gLW8gcm8gJHJvb3R2b2wgL3Jvb3R2b2w7IHRoZW4KKwllY2hvICJcdCpGQUlMRUQqIjsKKwlkb19zaGVsbAorZmkKKworZWNobyAiJFBSRSBVbW91bnRpbmcgL3Byb2MiCit1bW91bnQgL3Byb2MKKworZWNobyAiJFBSRSBDaGFuZ2luZyByb290cyIKK2NkIC9yb290dm9sCitpZiAhIHBpdm90X3Jvb3QgLiBpbml0cmQgOyB0aGVuCisJZWNobyAiXHQqRkFJTEVEKiIKKwlkb19zaGVsbAorZmkKKworZWNobyAiJFBSRSBQcm9jZWVkaW5nIHdpdGggYm9vdC4uLiIKKworZXhlYyBjaHJvb3QgLiAvYmluL3NoIC1jICJ1bW91bnQgL2luaXRyZDsgYmxvY2tkZXYgLS1mbHVzaGJ1ZnMgL2Rldi9yYW0wIDsgZXhlYyAvc2Jpbi9pbml0ICQqIiA8IGRldi9jb25zb2xlID4gZGV2L2NvbnNvbGUgMj4mMQorCitJTklUCisgICBjaG1vZCA1NTUgJFRNUE1OVC9zYmluL2luaXQKK30KKworIyBjcmVhdGUgbHZtLmNvbmYgZmlsZSBmcm9tIGR1bXBjb25maWcuIEp1c3QgdXNlIGZpbHRlciBvcHRpb25zCitjcmVhdGVfbHZtY29uZiAoKSB7CisgICAgZWNobyAnZGV2aWNlcyB7JyA+ICRUTVBNTlQvZXRjL2x2bS9sdm0uY29uZgorICAgIGx2bSBkdW1wY29uZmlnIHwgZ3JlcCAnZmlsdGVyPScgPj4gJFRNUE1OVC9ldGMvbHZtL2x2bS5jb25mCisgICAgZWNobyAnfScgPj4gJFRNUE1OVC9ldGMvbHZtL2x2bS5jb25mCit9CisKKyMKKyMgTWFpbgorIworCitjbWQ9YGJhc2VuYW1lICQwYAorCitWRVJTSU9OPWB1bmFtZSAtcmAKKword2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworICAgY2FzZSAkMSBpbgorICAgLWh8LS1oZWxwKSB1c2FnZTsgZXhpdCAwOzsKKyAgIC12fC0tdmVyYm9zZSkgIFZFUkJPU0U9InkiOzsKKyAgIC1jfC0tbHZtY29uZikgIExWTUNPTkY9JDI7IHNoaWZ0OzsKKyAgIC1tfC0tbW9kdWxlcykgIE1PRFVMRVM9JDI7IHNoaWZ0OzsKKyAgIC1lfC0tZXh0cmEpICAgIEVYVFJBRklMRVM9JDI7IHNoaWZ0OzsKKyAgIC1yfC0tcmFpZCkgICAgIFJBSUQ9JDI7IHNoaWZ0OzsKKyAgIC1SfC0tcmFpZGNvbmYpIFJBSURDT05GPSQyOyBzaGlmdDs7CisgICAtTXwtLW1ha2VkZXYpICBNQUtFREVWPSQyOyBzaGlmdDs7CisgICBbMi05XS5bMC05XSouWzAtOV0qKSBWRVJTSU9OPSQxOzsKKyAgICopIGVjaG8gIiRjbWQgLS0gaW52YWxpZCBvcHRpb24gJyQxJyI7IHVzYWdlOyBleGl0IDA7OworICAgZXNhYworICAgc2hpZnQKK2RvbmUKKworSU5JVFJEPSR7SU5JVFJEOi0iL2Jvb3QvaW5pdHJkLWx2bTItJFZFUlNJT04uZ3oifQorCitlY2hvICIkY21kIC0tIG1ha2UgTFZNIGluaXRpYWwgcmFtIGRpc2sgJElOSVRSRCIKK2VjaG8gIiIKKworaWYgWyAtbiAiJFJBSUQiIF07IHRoZW4KKyAgICBCSU5GSUxFUz0iJEJJTkZJTEVTIC9zYmluL21kYWRtIgorICAgIFJBSURDT05GPSR7UkFJRENPTkY6LSIvZXRjL21kYWRtL21kYWRtLmNvbmYifQorICAgIGlmIFsgLXIgJFJBSURDT05GIF07IHRoZW4KKwlFWFRSQUZJTEVTPSIkRVhUUkFGSUxFUyAkUkFJRENPTkYiCisgICAgZWxzZQorICAgICAgICBlY2hvICIkY21kIC0tIFdBUk5JTkc6IE5vICRSQUlEQ09ORiEgWW91ciBSQUlEIGRldmljZSBtaW5vciBudW1iZXJzIG11c3QgbWF0Y2ggdGhlaXIgc3VwZXJibG9jayB2YWx1ZXMhIgorICAgIGZpCitmaQorCisjIGFkZCBtb2Rwcm9iZSBpZiB3ZSBkZWNsYXJlZCBhbnkgbW9kdWxlcworaWYgWyAtbiAiJE1PRFVMRVMiIF07IHRoZW4KKyAgICBCSU5GSUxFUz0iJEJJTkZJTEVTIC9zYmluL21vZHByb2JlIC9zYmluL2luc21vZCAvc2Jpbi9ybW1vZCIKK2ZpCisKK2ZvciBhIGluICRCSU5GSUxFUyAkRVhUUkFGSUxFUzsgZG8KKyAgICBpZiBbICEgLXIgIiRhIiBdIDsgdGhlbgorCWVjaG8gIiRjbWQgLS0gRVJST1I6IHlvdSBuZWVkICRhIgorCWV4aXQgMTsKKyAgICBmaTsKK2RvbmUKKworIyBGaWd1cmUgb3V0IHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgd2UgYWN0dWFsbHkgbmVlZCBpbiBvdXIgaW5pdHJkCitlY2hvICIkY21kIC0tIGZpbmRpbmcgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcmllcyIKK3ZlcmJvc2UgIkJJTkZJTEVTOiBgZWNobyAkQklORklMRVNgIgorCisjIFdlIG5lZWQgdG8gc3RyaXAgY2VydGFpbiBsaW5lcyBmcm9tIGxkZCBvdXRwdXQuICBUaGlzIGlzIHRoZSBmdWxsIG91dHB1dCBvZiBhbiBleGFtcGxlIGxkZDoKKyNsdm1ob3N0fiAjIGxkZCAvc2Jpbi9sdm0gL2Jpbi9iYXNoCisjL3NiaW4vbHZtOgorIyAgICAgICAgbm90IGEgZHluYW1pYyBleGVjdXRhYmxlCisjL2Jpbi9iYXNoOgorIyAgICAgICAgbGludXgtZ2F0ZS5zby4xID0+ICAoMHhiZmZmZTAwMCkKKyMgICAgICAgIGxpYm5jdXJzZXMuc28uNSA9PiAvbGliL2xpYm5jdXJzZXMuc28uNSAoMHhiN2VlMzAwMCkKKyMgICAgICAgIGxpYmRsLnNvLjIgPT4gL2xpYi9saWJkbC5zby4yICgweGI3ZWRmMDAwKQorIyAgICAgICAgbGliYy5zby42ID0+IC9saWIvbGliYy5zby42ICgweGI3ZGMxMDAwKQorIyAgICAgICAgL2xpYi9sZC1saW51eC5zby4yICgweGI3ZjI4MDAwKQorIworIyAxKSBMaW5lcyB3aXRoIGEgIjoiIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGJpbmFyeSB3ZSdyZSBleGFtaW5pbmcsIGFuZCBzbyBhcmUgdW5uZWNlc3NhcnkuCisjICAgIFdlIG5lZWQgdG8gc3RyaXAgdGhlbSBiZWNhdXNlIHRoZXkgY29udGFpbiAiLyIsIGFuZCBjYW4gYmUgY29uZnVzZWQgd2l0aCBsaW5rcyB3aXRoIGEgaGFyZGNvZGVkIHBhdGguCisjIDIpIFRoZSBsaW51eC1nYXRlIGxpYnJhcnkgaXMgYSB2aXJ0dWFsIGRsbCB0aGF0IGRvZXMgbm90IGV4aXN0IG9uIGRpc2ssIGJ1dCBpcyBpbnN0ZWFkIGxvYWRlZCBhdXRvbWF0aWNhbGx5CisjICAgIGludG8gdGhlIHByb2Nlc3Mgc3BhY2UsIGFuZCBjYW4ndCBiZSBjb3BpZWQgdG8gdGhlIHJhbWRpc2sKKyMKKyMgQWZ0ZXIgdGhlc2UgbGluZXMgaGF2ZSBiZWVuIHN0cmlwcGVkLCB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBsaW5lcyByZW1haW5pbmcgaWYgdGhleQorIyAxKSBDb250YWluICI9PiIgYmVjYXVzZSB0aGV5IGFyZSBwYXRobGVzcyBsaW5rcywgYW5kIHRoZSB2YWx1ZSBmb2xsb3dpbmcgdGhlIHRva2VuIGlzIHRoZSBwYXRoIG9uIHRoZSBkaXNrCisjIDIpIENvbnRhaW4gIi8iIGJlY2F1c2UgaXQncyBhIGxpbmsgd2l0aCBhIGhhcmRjb2RlZCBwYXRoLCBhbmQgc28gd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgbGluayBpdHNlbGYuCitMSUJGSUxFUz1gbGRkICRCSU5GSUxFUyAyPi9kZXYvbnVsbCB8Z3JlcCAtdiAtRSBcKGxpbnV4LWdhdGVcfDpcKSB8IGF3ayAne2lmICgvPT4vKSB7IHByaW50ICQzIH0gZWxzZSBpZiAoL1wvLykgeyBwcmludCAkMSB9fScgfCBzb3J0IC11YAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICBlY2hvICIkY21kIC0tIEVSUk9SIGZpZ3VyaW5nIG91dCBuZWVkZWQgc2hhcmVkIGxpYnJhcmllcyIKKyAgIGV4aXQgMQorZmkKKwordmVyYm9zZSAiU2hhcmVkIGxpYnJhcmllcyBuZWVkZWQ6IGBlY2hvICRMSUJGSUxFU2AiCisKK0lOSVRSREZJTEVTPSIkQklORklMRVMgJExJQkZJTEVTICRNT0RVTEVTICRFWFRSQUZJTEVTIgorCisjIHRhY2sgb24gc3R1ZmYgZm9yIG1vZHVsZXMgaWYgd2UgZGVjbGFyZWQgYW55IGFuZCB0aGUgZmlsZXMgZXhpc3QKK2lmIFsgLW4gIiRNT0RVTEVTIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiL2V0Yy9tb2Rwcm9iZS5jb25mIiBdOyB0aGVuCisJSU5JVFJERklMRVM9IiRJTklUUkRGSUxFUyAvZXRjL21vZHByb2JlLmNvbmYiCisgICAgZmkKKyAgICBpZiBbIC1mICIvbGliL21vZHVsZXMvbW9kcHJvYmUuY29uZiIgXTsgdGhlbgorCUlOSVRSREZJTEVTPSIkSU5JVFJERklMRVMgL2xpYi9tb2R1bGVzL21vZHByb2JlLmNvbmYiCisgICAgZmkKK2ZpCisKKyMgQ2FsY3VsYXRlIHRoZSB0aGUgc2l6ZSBvZiB0aGUgcmFtZGlzayBpbWFnZS4KKyMgRG9uJ3QgZm9yZ2V0IHRoYXQgaW5vZGVzIHRha2UgdXAgc3BhY2UgdG9vLCBhcyBkb2VzIHRoZSBmaWxlc3lzdGVtIG1ldGFkYXRhLgorZWNobyAiJGNtZCAtLSBjYWxjdWxhdGluZyBpbml0cmQgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzIgoraWYgWyAteiAiJElOSVRSRFNJWkUiIF07IHRoZW4KKyAgIGVjaG8gIiRjbWQgLS0gY2FsY3VsYXRpbmcgbG9vcGJhY2sgZmlsZSBzaXplIgorICAgdmVyYm9zZSAiZmluZGluZyBzaXplIgorICAgSU5JVFJEU0laRT0iYGR1IC1MY2sgJElOSVRSREZJTEVTIHwgdGFpbCAtMSB8IGN1dCAtZiAxYCIKKyAgIHZlcmJvc2UgIm1pbmltdW06ICRJTklUUkRTSVpFIGtCIGZvciBmaWxlcyArIGlub2RlcyArIGZpbGVzeXN0ZW0gbWV0YWRhdGEiCisgICBJTklUUkRTSVpFPWBleHByICRJTklUUkRTSVpFICsgNTEyYCAgIyBlbm91Z2ggZm9yIGV4dDIgZnMgKyBhIGJpdAorZmkKKworZWNobyAiJGNtZCAtLSBtYWtpbmcgbG9vcGJhY2sgZmlsZSAoJElOSVRSRFNJWkUga0IpIgordmVyYm9zZSAidXNpbmcgJERFVlJBTSBhcyBhIHRlbXBvcmFyeSBsb29wYmFjayBmaWxlIgorZGQgaWY9L2Rldi96ZXJvIG9mPSRERVZSQU0gY291bnQ9JElOSVRSRFNJWkUgYnM9MTAyNCA+IC9kZXYvbnVsbCAyPiYxCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgIGVjaG8gIiRjbWQgLS0gRVJST1IgY3JlYXRpbmcgbG9vcGJhY2sgZmlsZSIKKyAgIGNsZWFudXAgMQorZmkKKworZWNobyAiJGNtZCAtLSBtYWtpbmcgcmFtIGRpc2sgZmlsZXN5c3RlbSIKK3ZlcmJvc2UgIm1rZTJmcyAtRiAtbTAgLUwgTFZNLSRWRVJTSU9OICRERVZSQU0gJElOSVRSRFNJWkUiCitbICIkVkVSQk9TRSIgXSAmJiBPUFRfUT0iIiB8fCBPUFRfUT0iLXEiCitta2UyZnMgJE9QVF9RIC1GIC1tMCAtTCBMVk0tJFZFUlNJT04gJERFVlJBTSAkSU5JVFJEU0laRQoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICBlY2hvICIkY21kIC0tIEVSUk9SIG1ha2luZyByYW0gZGlzayBmaWxlc3lzdGVtIgorICAgZWNobyAiJGNtZCAtLSBFUlJPUiB5b3UgbmVlZCB0byB1c2UgbWtlMmZzID49IDEuMTQgb3IgaW5jcmVhc2UgSU5JVFJEU0laRSIKKyAgIGNsZWFudXAgMQorZmkKKwordmVyYm9zZSAiY3JlYXRpbmcgbW91bnRwb2ludCAkVE1QTU5UIgorbWtkaXIgJFRNUE1OVAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICBlY2hvICIkY21kIC0tIEVSUk9SIG1ha2luZyAkVE1QTU5UIgorICAgY2xlYW51cCAxCitmaQorCitlY2hvICIkY21kIC0tIG1vdW50aW5nIHJhbSBkaXNrIGZpbGVzeXN0ZW0iCit2ZXJib3NlICJtb3VudCAtbyBsb29wICRERVZSQU0gJFRNUE1OVCIKK21vdW50IC1vbG9vcCAkREVWUkFNICRUTVBNTlQKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgZWNobyAiJGNtZCAtLSBFUlJPUiBtb3VudGluZyAkREVWUkFNIG9uICRUTVBNTlQiCisgICBjbGVhbnVwIDEKK2ZpCisKK3ZlcmJvc2UgImNyZWF0aW5nIGJhc2ljIHNldCBvZiBkaXJlY3RvcmllcyBpbiAkVE1QTU5UIgorKGNkICRUTVBNTlQ7IG1rZGlyIGJpbiBkZXYgZXRjIGxpYiBwcm9jIHNiaW4gdmFyKQoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICBlY2hvICIkY21kIC0tIEVSUk9SIGNyZWF0aW5nIGRpcmVjdG9yaWVzIGluICRUTVBNTlQiCisgICBjbGVhbnVwIDEKK2ZpCisKKyMgQWRkIHNvbWUgL2RldiBmaWxlcy4gV2UgaGF2ZSB0byBoYW5kbGUgZGlmZmVyZW50IHR5cGVzIG9mIE1BS0VERVYgaW52b2NhdGlvbnMKKyMgaGVyZSwgc28gdGhpcyBpcyByYXRoZXIgbWVzc3kuCitSRVRDT0RFPTAKK2VjaG8gIiRjbWQgLS0gYWRkaW5nIHJlcXVpcmVkIC9kZXYgZmlsZXMiCit2ZXJib3NlICJCQVNJQ0RFVklDRVM6IGBlY2hvICRCQVNJQ0RFVklDRVNgIgordmVyYm9zZSAiQkxPQ0tERVZJQ0VTOiBgZWNobyAkQkxPQ0tERVZJQ0VTYCIKK1sgIiRWRVJCT1NFIiBdICYmIE9QVF9RPSItdiIgfHwgT1BUX1E9IiIKK2Nhc2UgIiRNQUtFREVWIiBpbiAKK2RlYmlhbikKKyAgICAoY2QgJFRNUE1OVC9kZXY7IC9kZXYvTUFLRURFViAkT1BUX1EgJEJBU0lDREVWSUNFUyAkQkxPQ0tERVZJQ0VTKQorICAgIFJFVENPREU9JD8KKyAgICA7OworcmVkaGF0KQorICAgIChjZCAkVE1QTU5UL2RldjsgL2Rldi9NQUtFREVWICRPUFRfUSAtZCAkVE1QTU5UL2RldiAtbSAyKQorICAgIFJFVENPREU9JD8KKyAgICA7OworZ2VudG9vKQorICAgIChjZCAkVE1QTU5UL2RldjsgL3NiaW4vTUFLRURFViAkT1BUX1EgJEJBU0lDREVWSUNFUyAkQkxPQ0tERVZJQ0VTKQorICAgIFJFVENPREU9JD8KKyAgICA7OworKikKKyAgICBlY2hvICIkY21kIC0tIEVSUk9SOiAkTUFLRURFViBpcyBub3QgYSBrbm93biBNQUtFREVWIHN0eWxlLiIKKyAgICBSRVRDT0RFPTEKKyAgICA7OworZXNhYworCisKK2lmIFsgJFJFVENPREUgLW5lIDAgXTsgdGhlbgorICAgZWNobyAiJGNtZCAtLSBFUlJPUiBhZGRpbmcgL2RldiBmaWxlcyIKKyAgIGNsZWFudXAgMQorZmkKKworCisjIGNvcHkgbmVjZXNzYXJ5IGZpbGVzIHRvIHJhbSBkaXNrCitlY2hvICIkY21kIC0tIGNvcHlpbmcgaW5pdHJkIGZpbGVzIHRvIHJhbSBkaXNrIgorWyAiJFZFUkJPU0UiIF0gJiYgT1BUX1E9Ii12IiB8fCBPUFRfUT0iLS1xdWlldCIKK3ZlcmJvc2UgImZpbmQgXCRJTklUUkRGSUxFUyB8IGNwaW8gLXBkbUwgJE9QVF9RICRUTVBNTlQiCitmaW5kICRJTklUUkRGSUxFUyB8IGNwaW8gLXBkbUwgJE9QVF9RICRUTVBNTlQKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgZWNobyAiJGNtZCAtLSBFUlJPUiBjcGlvIHRvIHJhbSBkaXNrIgorICAgY2xlYW51cCAxCitmaQorCisKK2VjaG8gIiRjbWQgLS0gY3JlYXRpbmcgc3ltbGlua3MgdG8gYnVzeWJveCIKK3Nob3B0IC1zIGV4dGdsb2IKK1sgIiRWRVJCT1NFIiBdICYmIE9QVF9RPSItdiIgfHwgT1BUX1E9IiIKK0JVU1lCT1hTWU1MSU5LUz1gYnVzeWJveCAyPiYxfCBhd2sgJy9eQ3VycmVudGx5IGRlZmluZWQgZnVuY3Rpb25zOiQvIHtpKys7bmV4dH0gaSd8dHIgJyxcdFxuJyAnICdgCitmb3IgbGluayBpbiAke0JVU1lCT1hTWU1MSU5LUy8vQChsaW51eHJjfGluaXR8YnVzeWJveCl9OyBkbyAKKwlsbiAtcyAkT1BUX1EgYnVzeWJveCAkVE1QTU5UL2Jpbi8kbGluazsKK2RvbmUKK3Nob3B0IC11IGV4dGdsb2IKKworZWNobyAiJGNtZCAtLSBjcmVhdGluZyBuZXcgJFRNUE1OVC9zYmluL2luaXQiCitjcmVhdGVfaW5pdAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICBlY2hvICIkY21kIC0tIEVSUk9SIGNyZWF0aW5nIGluaXQiCisgICBjbGVhbnVwCisgICBleGl0IDEKK2ZpCisKKyMgY29weSBMVk1DT05GIGludG8gcGxhY2Ugb3IgY3JlYXRlIGEgc3RyaXBwZWQgZG93biBvbmUgZnJvbSBsdm0gZHVtcGNvbmZpZworbWtkaXIgLXAgJFRNUE1OVC9ldGMvbHZtCitpZiBbIC1uICIkTFZNQ09ORiIgXTsgdGhlbgorICAgIGVjaG8gIiRjbWQgLS0gY29weWluZyAkTFZNQ09ORiB0byAkVE1QTU5UL2V0Yy9sdm0vbHZtLmNvbmYiCisgICAgaWYgWyAtZiAiJExWTUNPTkYiIF07IHRoZW4KKyAgICAgICAgY3AgJExWTUNPTkYgJFRNUE1OVC9ldGMvbHZtL2x2bS5jb25mCisgICAgZWxzZQorICAgICAgICBlY2hvICIkY21kIC0tIEVSUk9SOiAkTFZNQ09ORiBkb2VzIG5vdCBleGlzdCEiCisJY2xlYW51cAorCWV4aXQgMQorICAgIGZpCitlbHNlCisgICAgZWNobyAiJGNtZCAtLSBjcmVhdGluZyBuZXcgJFRNUE1OVC9ldGMvbHZtL2x2bS5jb25mIgorICAgIGNyZWF0ZV9sdm1jb25mCitmaQorCitpZiBbIC1uICIkUkFJRCIgXTsgdGhlbgorICAgIFJBSURMSVNUPSIkVE1QTU5UL2V0Yy9yYWlkX2F1dG9zdGFydCIKKyAgICBlY2hvICIkY21kIC0tIGNyZWF0aW5nICRSQUlETElTVCBmaWxlLiIKKyAgICBmb3IgZGV2aWNlIGluICRSQUlEOyBkbworICAgICAgICBlY2hvICRkZXZpY2UgPj4gJFJBSURMSVNUCisgICAgZG9uZQorZmkKKworIyBjcmVhdGUgbW9kdWxlcy5kZXAgYW5kIC9ldGMvbW9kdWxlcyBmaWxlcyBpZiBuZWVkZWQKK2lmIFsgLW4gIiRNT0RVTEVTIiBdOyB0aGVuCisgICAgZWNobyAiJGNtZCAtLSBjcmVhdGluZyAkTU9ERElSL21vZHVsZXMuZGVwIGZpbGUgYW5kICRUTVBNTlQvZXRjL21vZHVsZXMiCisgICAgZGVwbW9kIC1iICRUTVBNTlQgJFZFUlNJT04KKyAgICBmb3IgbW9kdWxlIGluICRNT0RVTEVTOyBkbworICAgICAgICBiYXNlbmFtZSAkbW9kdWxlIHwgc2VkICdzL1wua1x7MCwxXH1vJC8vJyA+PiAkVE1QTU5UL2V0Yy9tb2R1bGVzCisgICAgZG9uZQorZmkKKwordmVyYm9zZSAicmVtb3ZpbmcgJFRNUE1OVC9sb3N0K2ZvdW5kIgorcm1kaXIgJFRNUE1OVC9sb3N0K2ZvdW5kCisKK2VjaG8gIiRjbWQgLS0gdW1tb3VudGluZyByYW0gZGlzayIKK3Vtb3VudCAkREVWUkFNCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgIGVjaG8gIiRjbWQgLS0gRVJST1IgdW1vdW50aW5nICRERVZSQU0iCisgICBjbGVhbnVwIDEKK2ZpCisKK2VjaG8gIiRjbWQgLS0gY3JlYXRpbmcgY29tcHJlc3NlZCBpbml0cmQgJElOSVRSRCIKK3ZlcmJvc2UgImRkIGlmPSRERVZSQU0gYnM9MWsgY291bnQ9JElOSVRSRFNJWkUgfCBnemlwIC05IgorZGQgaWY9JERFVlJBTSBicz0xayBjb3VudD0kSU5JVFJEU0laRSAyPi9kZXYvbnVsbCB8IGd6aXAgLTkgPiAkSU5JVFJECitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgIGVjaG8gIiRjbWQgLS0gRVJST1IgY3JlYXRpbmcgJElOSVRSRCIKKyAgIGNsZWFudXAgMQorZmkKKworCitjYXQgPDwgRklOQUxUWFQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitZb3VyIGluaXRyZCBpcyByZWFkeSBpbiAkSU5JVFJECisKK0Rvbid0IGZvcmdldCB0byBzZXQgcm9vdD0vZGV2L3JhbTAgaW4ga2VybmVsIHBhcmFtZXRlcnMKK0Rvbid0IGZvcmdldCB0byBzZXQgbHZtMnJvb3Q9L2Rldi9WRy9MViBpbiBrZXJuZWwgcGFyYW1ldGVycywgd2hlcmUgTFYgaXMgeW91ciByb290IHZvbHVtZQorSWYgeW91IHVzZSBsaWxvIHRyeSBhZGRpbmcvbW9kaWZ5aW5nIGFuIGVudHJ5IHNpbWlsYXIgdG8gdGhpcyBvbmUgaW4gbGlsby5jb25mOgorCitpbWFnZT0vYm9vdC92bWxpbnV6LWx2bTItJFZFUlNJT04KKyAgICAgICAgbGFiZWw9InJhbWRpc2tfTFZNIgorICAgICAgICBpbml0cmQ9L2Jvb3QvaW5pdHJkLWx2bTItJFZFUlNJT04uZ3oKKyAgICAgICAgYXBwZW5kPSJyb290PS9kZXYvcmFtMCBsdm0ycm9vdD0vZGV2L3N5c3RlbS9yb290IDxvdGhlciBwYXJhbWV0ZXJzPiIKKworSWYgdXNpbmcgZ3J1YiB0cnkgYWRkaW5nL21vZGlmeWluZyBhbiBlbnRyeSBzaW1pbGFyIHRvIHRoaXMgb25lIGluIG1lbnUubHN0CisKK3RpdGxlIHJhbWRpc2sgTFZNCisgICAgICAgIGtlcm5lbCAvYm9vdC92bWxpbnV6LWx2bTItJFZFUlNJT04gcm9vdD0vZGV2L3JhbTAgbHZtMnJvb3Q9L2Rldi9zeXN0ZW0vcm9vdCA8b3RoZXIgcGFyYW1ldGVycz4KKyAgICAgICAgaW5pdHJkIC9ib290L2luaXRyZC1sdm0yLSRWRVJTSU9OLmd6CisKK1lvdSBjYW4gYWxzbyBwYXNzIGx2bTJyZXNjdWUgdG8gdGhlIGtlcm5lbCB0byBnZXQgYSBzaGVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZJTkFMVFhUCisKK2NsZWFudXAgMAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJjcmVhdGVfaW5pdHJkLjggYi9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJjcmVhdGVfaW5pdHJkLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0MzY3OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvbHZtMmNyZWF0ZV9pbml0cmQuOApAQCAtMCwwICsxLDI5MCBAQAorLlwiIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFBvZDo6TWFuIDIuMjMgKFBvZDo6U2ltcGxlIDMuMTQpCisuXCIKKy5cIiBTdGFuZGFyZCBwcmVhbWJsZToKKy5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy5kZSBTcCBcIiBWZXJ0aWNhbCBzcGFjZSAod2hlbiB3ZSBjYW4ndCB1c2UgLlBQKQorLmlmIHQgLnNwIC41dgorLmlmIG4gLnNwCisuLgorLmRlIFZiIFwiIEJlZ2luIHZlcmJhdGltIHRleHQKKy5mdCBDVworLm5mCisubmUgXFwkMQorLi4KKy5kZSBWZSBcIiBFbmQgdmVyYmF0aW0gdGV4dAorLmZ0IFIKKy5maQorLi4KKy5cIiBTZXQgdXAgc29tZSBjaGFyYWN0ZXIgdHJhbnNsYXRpb25zIGFuZCBwcmVkZWZpbmVkIHN0cmluZ3MuICBcKigtLSB3aWxsCisuXCIgZ2l2ZSBhbiB1bmJyZWFrYWJsZSBkYXNoLCBcKihQSSB3aWxsIGdpdmUgcGksIFwqKEwiIHdpbGwgZ2l2ZSBhIGxlZnQKKy5cIiBkb3VibGUgcXVvdGUsIGFuZCBcKihSIiB3aWxsIGdpdmUgYSByaWdodCBkb3VibGUgcXVvdGUuICBcKihDKyB3aWxsCisuXCIgZ2l2ZSBhIG5pY2VyIEMrKy4gIENhcGl0YWwgb21lZ2EgaXMgdXNlZCB0byBkbyB1bmJyZWFrYWJsZSBkYXNoZXMgYW5kCisuXCIgdGhlcmVmb3JlIHdvbid0IGJlIGF2YWlsYWJsZS4gIFwqKENgIGFuZCBcKihDJyBleHBhbmQgdG8gYCcgaW4gbnJvZmYsCisuXCIgbm90aGluZyBpbiB0cm9mZiwgZm9yIHVzZSB3aXRoIEM8Pi4KKy50ciBcKCpXLQorLmRzIEMrIENcdictLjF2J1xoJy0xcCdccy0yK1xoJy0xcCcrXHMwXHYnLjF2J1xoJy0xcCcKKy5pZSBuIFx7XAorLiAgICBkcyAtLSBcKCpXLQorLiAgICBkcyBQSSBwaQorLiAgICBpZiAoXG4oLkg9NHUpJigxbT0yNHUpIC5kcyAtLSBcKCpXXGgnLTEydSdcKCpXXGgnLTEydSctXCIgZGlhYmxvIDEwIHBpdGNoCisuICAgIGlmIChcbiguSD00dSkmKDFtPTIwdSkgLmRzIC0tIFwoKldcaCctMTJ1J1woKldcaCctOHUnLVwiICBkaWFibG8gMTIgcGl0Y2gKKy4gICAgZHMgTCIgIiIKKy4gICAgZHMgUiIgIiIKKy4gICAgZHMgQ2AgIiIKKy4gICAgZHMgQycgIiIKKydiclx9CisuZWxce1wKKy4gICAgZHMgLS0gXHxcKGVtXHwKKy4gICAgZHMgUEkgXCgqcAorLiAgICBkcyBMIiBgYAorLiAgICBkcyBSIiAnJworJ2JyXH0KKy5cIgorLlwiIEVzY2FwZSBzaW5nbGUgcXVvdGVzIGluIGxpdGVyYWwgc3RyaW5ncyBmcm9tIGdyb2ZmJ3MgVW5pY29kZSB0cmFuc2Zvcm0uCisuaWUgXG4oLmcgLmRzIEFxIFwoYXEKKy5lbCAgICAgICAuZHMgQXEgJworLlwiCisuXCIgSWYgdGhlIEYgcmVnaXN0ZXIgaXMgdHVybmVkIG9uLCB3ZSdsbCBnZW5lcmF0ZSBpbmRleCBlbnRyaWVzIG9uIHN0ZGVyciBmb3IKKy5cIiB0aXRsZXMgKC5USCksIGhlYWRlcnMgKC5TSCksIHN1YnNlY3Rpb25zICguU1MpLCBpdGVtcyAoLklwKSwgYW5kIGluZGV4CisuXCIgZW50cmllcyBtYXJrZWQgd2l0aCBYPD4gaW4gUE9ELiAgT2YgY291cnNlLCB5b3UnbGwgaGF2ZSB0byBwcm9jZXNzIHRoZQorLlwiIG91dHB1dCB5b3Vyc2VsZiBpbiBzb21lIG1lYW5pbmdmdWwgZmFzaGlvbi4KKy5pZSBcbkYgXHtcCisuICAgIGRlIElYCisuICAgIHRtIEluZGV4OlxcJDFcdFxcbiVcdCJcXCQyIgorLi4KKy4gICAgbnIgJSAwCisuICAgIHJyIEYKKy5cfQorLmVsIFx7XAorLiAgICBkZSBJWAorLi4KKy5cfQorLlwiCisuXCIgQWNjZW50IG1hcmsgZGVmaW5pdGlvbnMgKEAoIyltcy5hY2MgMS41IDg4LzAyLzA4IFNNSTsgZnJvbSBVQ0IgNC4yKS4KKy5cIiBGZWFyLiAgUnVuLiAgU2F2ZSB5b3Vyc2VsZi4gIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMuCisuICAgIFwiIGZ1ZGdlIGZhY3RvcnMgZm9yIG5yb2ZmIGFuZCB0cm9mZgorLmlmIG4gXHtcCisuICAgIGRzICNIIDAKKy4gICAgZHMgI1YgLjhtCisuICAgIGRzICNGIC4zbQorLiAgICBkcyAjWyBcZjEKKy4gICAgZHMgI10gXGZQCisuXH0KKy5pZiB0IFx7XAorLiAgICBkcyAjSCAoKDF1LShcXFxcbiguZnUlMnUpKSouMTNtKQorLiAgICBkcyAjViAuNm0KKy4gICAgZHMgI0YgMAorLiAgICBkcyAjWyBcJgorLiAgICBkcyAjXSBcJgorLlx9CisuICAgIFwiIHNpbXBsZSBhY2NlbnRzIGZvciBucm9mZiBhbmQgdHJvZmYKKy5pZiBuIFx7XAorLiAgICBkcyAnIFwmCisuICAgIGRzIGAgXCYKKy4gICAgZHMgXiBcJgorLiAgICBkcyAsIFwmCisuICAgIGRzIH4gfgorLiAgICBkcyAvCisuXH0KKy5pZiB0IFx7XAorLiAgICBkcyAnIFxcazpcaCctKFxcbigud3UqOC8xMC1cKigjSCknXCdcaCJ8XFxuOnUiCisuICAgIGRzIGAgXFxrOlxoJy0oXFxuKC53dSo4LzEwLVwqKCNIKSdcYFxoJ3xcXG46dScKKy4gICAgZHMgXiBcXGs6XGgnLShcXG4oLnd1KjEwLzExLVwqKCNIKSdeXGgnfFxcbjp1JworLiAgICBkcyAsIFxcazpcaCctKFxcbigud3UqOC8xMCknLFxoJ3xcXG46dScKKy4gICAgZHMgfiBcXGs6XGgnLShcXG4oLnd1LVwqKCNILS4xbSknflxoJ3xcXG46dScKKy4gICAgZHMgLyBcXGs6XGgnLShcXG4oLnd1KjgvMTAtXCooI0gpJ1x6XChzbFxoJ3xcXG46dScKKy5cfQorLiAgICBcIiB0cm9mZiBhbmQgKGRhaXN5LXdoZWVsKSBucm9mZiBhY2NlbnRzCisuZHMgOiBcXGs6XGgnLShcXG4oLnd1KjgvMTAtXCooI0grLjFtK1wqKCNGKSdcdictXCooI1YnXHouXGgnLjJtK1wqKCNGJy5caCd8XFxuOnUnXHYnXCooI1YnCisuZHMgOCBcaCdcKigjSCdcKCpiXGgnLVwqKCNIJworLmRzIG8gXFxrOlxoJy0oXFxuKC53dStcdydcKGRlJ3UtXCooI0gpLzJ1J1x2Jy0uM24nXCooI1tcelwoZGVcdicuM24nXGgnfFxcbjp1J1wqKCNdCisuZHMgZC0gXGgnXCooI0gnXChwZFxoJy1cdyd+J3UnXHYnLS4yNW0nXGYyXChoeVxmUFx2Jy4yNW0nXGgnLVwqKCNIJworLmRzIEQtIERcXGs6XGgnLVx3J0QndSdcdictLjExbSdcelwoaHlcdicuMTFtJ1xoJ3xcXG46dScKKy5kcyB0aCBcKigjW1x2Jy4zbSdccysxSVxzLTFcdictLjNtJ1xoJy0oXHcnSSd1KjIvMyknXHMtMW9ccysxXCooI10KKy5kcyBUaCBcKigjW1xzKzJJXHMtMlxoJy1cdydJJ3UqMy81J1x2Jy0uM20nb1x2Jy4zbSdcKigjXQorLmRzIGFlIGFcaCctKFx3J2EndSo0LzEwKSdlCisuZHMgQWUgQVxoJy0oXHcnQSd1KjQvMTApJ0UKKy4gICAgXCIgY29ycmVjdGlvbnMgZm9yIHZyb2ZmCisuaWYgdiAuZHMgfiBcXGs6XGgnLShcXG4oLnd1KjkvMTAtXCooI0gpJ1xzLTJcdX5cZFxzKzJcaCd8XFxuOnUnCisuaWYgdiAuZHMgXiBcXGs6XGgnLShcXG4oLnd1KjEwLzExLVwqKCNIKSdcdictLjRtJ15cdicuNG0nXGgnfFxcbjp1JworLiAgICBcIiBmb3IgbG93IHJlc29sdXRpb24gZGV2aWNlcyAoY3J0IGFuZCBscHIpCisuaWYgXG4oLkg+MjMgLmlmIFxuKC5WPjE5IFwKK1x7XAorLiAgICBkcyA6IGUKKy4gICAgZHMgOCBzcworLiAgICBkcyBvIGEKKy4gICAgZHMgZC0gZFxoJy0xJ1woZ2EKKy4gICAgZHMgRC0gRFxoJy0xJ1woaHkKKy4gICAgZHMgdGggXG8nYnAnCisuICAgIGRzIFRoIFxvJ0xQJworLiAgICBkcyBhZSBhZQorLiAgICBkcyBBZSBBRQorLlx9Cisucm0gI1sgI10gI0ggI1YgI0YgQworLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLlwiCisuSVggVGl0bGUgImx2bTJjcmVhdGVfaW5pdHJkIDgiCisuVEggbHZtMmNyZWF0ZV9pbml0cmQgOCAiMjAxMS0xMS0xMiIgImx2bTJjcmVhdGVfaW5pdHJkIiAiY3JlYXRlIExWTTIgaW5pdHJkIgorLlwiIEZvciBucm9mZiwgdHVybiBvZmYganVzdGlmaWNhdGlvbi4gIEFsd2F5cyB0dXJuIG9mZiBoeXBoZW5hdGlvbjsgaXQgbWFrZXMKKy5cIiB3YXkgdG9vIG1hbnkgbWlzdGFrZXMgaW4gdGVjaG5pY2FsIGRvY3VtZW50cy4KKy5pZiBuIC5hZCBsCisubmgKKy5TSCAiTkFNRSIKK2x2bTJjcmVhdGVfaW5pdHJkIFwtIGNyZWF0ZSBpbml0cmQgaW1hZ2UgZm9yIGJvb3RpbmcgdG8gcm9vdFxlXC1vblxlXC1MVk0yCisuU0ggIlNZTk9QU0lTIgorLklYIEhlYWRlciAiU1lOT1BTSVMiCitcJlxmQmx2bTJjcmVhdGVfaW5pdHJkXGZSIFsgXGZCXC1ofFwtXC1oZWxwXGZSIF0gWyBcZkJcLXZ8XC1cLXZlcmJvc2VcZlIgXSBbIFxmQlwtY3xcLVwtbHZtY29uZlxmUiBcZkkvcGF0aC90by9sdm0uY29uZlxmUiBdIFsgXGZCXC1tfFwtXC1tb2R1bGVzXGZSICJcZkltb2R1bGUxIG1vZHVsZTIgLi4uXGZSIiBdIFsgXGZCXC1lfFwtXC1leHRyYVxmUiAiXGZJZmlsZTEgZmlsZTIgLi4uXGZSIiBdIFsgXGZCXC1yfFwtXC1yYWlkXGZSICJcZkkvZGV2L21kMSAvZGV2L21kMiAuLi5cZlIiIF0KK1sgXGZCXC1SfFwtXC1yYWlkY29uZlxmUiBcZkkvcGF0aC90by9tZGFkbS5jb25mXGZSIF0gWyBcZkJcLU18XC1cLW1ha2VkZXZcZlIgXGZJc3R5bGVcZlIgXQorLlNIICJERVNDUklQVElPTiIKKy5JWCBIZWFkZXIgIkRFU0NSSVBUSU9OIgorbHZtMmNyZWF0ZV9pbml0cmQgY3JlYXRlcyBhbiBpbml0aWFsIHJhbWRpc2sgKGluaXRyZCkgaW1hZ2Ugc3VpdGFibGUgZm9yIGJvb3RpbmcgdG8gc3lzdGVtIHRoYXQgaGFzIGFuIFxzLTFMVk0yXHMwIHZvbHVtZSBhcyBpdHMgcm9vdCBmaWxlc3lzdGVtLgorLlBQCitUbyBib290IHRvIHN1Y2ggYSBzZXR1cCwgeW91J2xsCitlaXRoZXIgbmVlZCBhIGJvb3Rsb2FkZXIgdGhhdCB1bmRlcnN0YW5kcyBccy0xTFZNMlxzMCB2b2x1bWVzLCBvciB5b3UnbGwgbmVlZCBhCitmaWxlc3lzdGVtIG9uIGEgcmVndWxhciB2b2x1bWUgdG8gYWN0IGFzIGEgYm9vdCBwYXJ0aXRpb24gKHR5cGljYWxseSBtb3VudGVkCitvbiAvYm9vdCkuCisuUFAKK1RoZSByZXN1bHRpbmcgaW5pdHJkIGltYWdlIGlzIGZhaXJseSBmdWxsLWZlYXR1cmVkLiBJdCBjYW4gaGFyYm9yIGFuZCBsb2FkCitrZXJuZWwgbW9kdWxlcywgc3RhcnQgXHMtMU1EXHMwIGRldmljZXMsIGFuZCBib290IHRvIGEgc2hlbGwgdG8gcGVyZm9ybSByZXNjdWUKK29wZXJhdGlvbnMuCisuU1MgIkJvb3RpbmcgdG8geW91ciBpbml0cmQgSW1hZ2U6IgorLklYIFN1YnNlY3Rpb24gIkJvb3RpbmcgdG8geW91ciBpbml0cmQgSW1hZ2U6IgorVGhlIGZpbGVzeXN0ZW0gaW1hZ2UgY3JlYXRlZCBpcyBhbiBleHQyZnMgZmlsZXN5c3RlbSwgaGVuY2UgeW91ciBrZXJuZWwgbXVzdCBoYXZlCitleHQyZnMgYnVpbHQgaW50byBpdCBzdGF0aWNhbGx5IGluIG9yZGVyIHRvIGJvb3QgdG8gdGhlIGltYWdlLgorLlBQCitPbmNlIHlvdSBjcmVhdGUgeW91ciBpbml0cmQgaW1hZ2UsIHlvdSBtdXN0IHBhc3MgdGhlIGNvcnJlY3Qgb3B0aW9ucyB0byB0aGUga2VybmVsIHdoZW4KK3lvdSBib290IHVzaW5nIGl0LiBZb3VyIGtlcm5lbCBjb21tYW5kIGxpbmUgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKy5QUAorXCZcZkJyb290PS9kZXYvcmFtMCBsdm0ycm9vdD0vZGV2L3Jvb3R2Zy9yb290IFsgbHZtMnJlc2N1ZSBdXGZSCisuUFAKK29mIGNvdXJzZSB0aGVyZSBtYXkgYmUgb3RoZXIgb3B0aW9ucy4KKy5JUCAiXGZCcm9vdD0vZGV2L3JhbTBcZlIiIDQKKy5JWCBJdGVtICJyb290PS9kZXYvcmFtMCIKK1RoaXMgb3B0aW9uIGlzIHJlcXVpcmVkLiBJdCB0ZWxscyB0aGUga2VybmVsIHRoYXQgdGhlIHJvb3QgZmlsZXN5c3RlbSBzaG91bGQgaW5pdGlhbGx5CitiZSBzZXQgdG8gdGhlIHJhbWRpc2sgKC9kZXYvcmFtMCkuCisuSVAgIlxmQmx2bTJyb290PS9kZXYvcm9vdHZnL3Jvb3RcZlIiIDQKKy5JWCBJdGVtICJsdm0ycm9vdD0vZGV2L3Jvb3R2Zy9yb290IgorVGhpcyBvcHRpb24gaXMgYWxzbyByZXF1aXJlZC4gSXQgdGVsbHMgdGhlIGluaXRyZCBpbWFnZSB3aGljaCBccy0xTFZNMlxzMCBkZXZpY2UgdGhlIHJvb3QgZmlsZXN5c3RlbSBpcyBsb2NhdGVkIG9uLgorLklQICJcZkJsdm0ycmVzY3VlXGZSIiA0CisuSVggSXRlbSAibHZtMnJlc2N1ZSIKK0NhdXNlcyB0aGUgaW5pdHJkIGltYWdlIHRvIHJ1biBhIHNoZWxsIHByaW9yIHRvIG1vdW50aW5nIHRoZSByb290IGZpbGVzeXN0ZW0uIFRoaXMgaXMKK2hlbHBmdWwgaW4gZGlzYXN0ZXIgc2l0dWF0aW9ucyB3aGVyZSB5b3VyIGluaXRyZCBpbWFnZSBpcyBhY2Nlc3NhYmxlLCBidXQgdGhlcmUgaXMKK2EgcHJvYmxlbSB3aXRoIHRoZSByb290IGZpbGVzeXN0ZW0gKGNvcnJ1cHRlZCBpbWFnZSwgaW5jb3JyZWN0IGRldmljZSBzZXR1cCwgZXRjLikuIFRoaXMKK29wdGlvbiBpcyAob2YgY291cnNlKSBvcHRpb25hbC4KKy5TSCAiT1BUSU9OUyIKKy5JWCBIZWFkZXIgIk9QVElPTlMiCitNb3N0IG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHZpYSBjb21tYW5kLWxpbmUgb3B0aW9ucyBjYW4gYWxzbyBiZSBzZXQKK3ZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIE9wdGlvbnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYWx3YXlzIHRha2UKK3ByZWNlZGVuY2UuCisuSVAgIlxmQlwtaHxcLVwtaGVscFxmUiIgNAorLklYIEl0ZW0gIi1ofC0taGVscCIKK0Rpc3BsYXkgc2hvcnQgaGVscCB0ZXh0IGFuZCBleGl0LiBJZiB1c2VkLCBvdGhlciBvcHRpb25zIGFyZSBpZ25vcmVkLgorLklQICJcZkJcLXZ8XC1cLXZlcmJvc2VcZlIiIDQKKy5JWCBJdGVtICItdnwtLXZlcmJvc2UiCitUdXJuIG9uIGV4dHJhIHZlcmJvc2l0eSBmb3IgZGVidWdnaW5nLCBldGMuCisuSVAgIlxmQlwtY3xcLVwtbHZtY29uZlxmUiBcZkkvcGF0aC90by9sdm0uY29uZlxmUiIgNAorLklYIEl0ZW0gIi1jfC0tbHZtY29uZiAvcGF0aC90by9sdm0uY29uZiIKK1NwZWNpZnkgYW4gbHZtLmNvbmYgZmlsZSB0byBpbmNsdWRlIGluIHRoZSBpbWFnZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUKK3NwZWNpYWwgZGV2aWNlIGZpbHRlcnMgb3Igb3RoZXIgb3B0aW9ucyB5b3Ugd2lzaCB0byB1c2UgZHVyaW5nIHRoZSBpbml0cmQKK3N0YWdlLiBJZiB0aGlzIG9wdGlvbiBpcyBub3QKK2luY2x1ZGVkLCB0aGVuIGEgbHZtLmNvbmYgZmlsZSBpcyBjcmVhdGVkIHRoYXQgY29udGFpbnMgb25seSB0aGUgY3VycmVudAorZGV2aWNlIGZpbHRlciBmcm9tIGFuIFxmQmx2bSBkdW1wY29uZmlnXGZSLiBUaGlzIGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIFxmQlxmKENCJExWTUNPTkZcZkJcZlIKK2Vudmlyb25tZW50IHZhcmlhYmxlLgorLmllIG4gLklQICJcZkJcLW18XC1cLW1vZHVsZXNcZlIgIiJcZkkvcGF0aC90by9tb2R1bGUxLmtvIC9wYXRoL3RvL21vZHVsZTIua28gLi4uXGZSIiIiIDQKKy5lbCAuSVAgIlxmQlwtbXxcLVwtbW9kdWxlc1xmUiBgYFxmSS9wYXRoL3RvL21vZHVsZTEua28gL3BhdGgvdG8vbW9kdWxlMi5rbyAuLi5cZlInJyIgNAorLklYIEl0ZW0gIi1tfC0tbW9kdWxlcyAiIi9wYXRoL3RvL21vZHVsZTEua28gL3BhdGgvdG8vbW9kdWxlMi5rbyAuLi4iIiIKK1NwZWNpZnkgbW9kdWxlcyB0byBpbmNsdWRlIGFuZCBwbHVnIGluIGR1cmluZyB0aGUgaW5pdHJkIHBoYXNlLiBUaGlzIG9wdGlvbgordGFrZXMgYSBxdW90ZWQsIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMuIEZ1bGwgcGF0aG5hbWVzIGFyZSByZXF1aXJlZC4KK1RoZXNlIG1vZHVsZXMgYXJlIGxvYWRlZCBpbnRvIHRoZSBrZXJuZWwgZWFybHkgaW4gdGhlIGluaXRyZCBwaGFzZSBvZiB0aGUgYm9vdAorcHJvY2Vzcy4gVGhlIGN1cnJlbnQgbW9kcHJvYmUuY29uZiBmaWxlIGlzIGFsc28gY29waWVkIHRvIHRoZSBpbml0cmQgaW1hZ2UKK2FzIHdlbGwuIFRoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHZpYSB0aGUgXGZCXGYoQ0IkTU9EVUxFU1xmQlxmUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKy5pZSBuIC5JUCAiXGZCXC1lfFwtXC1leHRyYVxmUiAiIlxmSS9wYXRoL3RvL2ZpbGUxIC9wYXRoL3RvL2ZpbGUyIC4uLlxmUiIiIiA0CisuZWwgLklQICJcZkJcLWV8XC1cLWV4dHJhXGZSIGBgXGZJL3BhdGgvdG8vZmlsZTEgL3BhdGgvdG8vZmlsZTIgLi4uXGZSJyciIDQKKy5JWCBJdGVtICItZXwtLWV4dHJhICIiL3BhdGgvdG8vZmlsZTEgL3BhdGgvdG8vZmlsZTIgLi4uIiIiCitFeHRyYSBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5pdHJkIGltYWdlLiBUaGVzZSBmaWxlcyB3aWxsIGJlCitjb3BpZWQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGluaXRyZCBpbWFnZSB0aGF0IHRoZXkgYXJlIGluIHRoZSBjdXJyZW50CitmaWxlc3lzdGVtLiBBZ2FpbiBmdWxsIHBhdGhuYW1lcyBhcmUgcmVxdWlyZWQuIFRoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHZpYQordGhlIFxmQlxmKENCJEVYVFJBRklMRVNcZkJcZlIgZW52aXJvbm1lbnQgdmFyaWFibGUuCisuaWUgbiAuSVAgIlxmQlwtcnxcLVwtcmFpZFxmUiAiIlxmSS9kZXYvbWQxIC9kZXYvbWQyLi4uXGZSIiIiIDQKKy5lbCAuSVAgIlxmQlwtcnxcLVwtcmFpZFxmUiBgYFxmSS9kZXYvbWQxIC9kZXYvbWQyLi4uXGZSJyciIDQKKy5JWCBJdGVtICItcnwtLXJhaWQgIiIvZGV2L21kMSAvZGV2L21kMi4uLiIiIgorXCZccy0xUkFJRFxzMCBkZXZpY2VzIHRvIGJlIHN0YXJ0ZWQgcHJpb3IgdG8gc2Nhbm5pbmcgZm9yIFxzLTFMVk0yXHMwIHZvbHVtZSBncm91cHMuIElmIHRoaXMKK29wdGlvbiBpcyB1c2VkIHRoZW4gdGhlbiBcZkJtZGFkbVxmUiBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkLiBUaGlzIGNhbiBhbHNvIGJlCitzcGVjaWZpZWQgdmlhIHRoZSBcZkJcZihDQiRSQUlEXGZCXGZSIGVudmlyb25tZW50IHZhcmlhYmxlLgorLmllIG4gLklQICJcZkJcLVJ8XC1cLXJhaWRjb25mXGZSICIiXGZJL3BhdGgvdG8vbWRhZG0uY29uZlxmUiIiIiA0CisuZWwgLklQICJcZkJcLVJ8XC1cLXJhaWRjb25mXGZSIGBgXGZJL3BhdGgvdG8vbWRhZG0uY29uZlxmUicnIiA0CisuSVggSXRlbSAiLVJ8LS1yYWlkY29uZiAiIi9wYXRoL3RvL21kYWRtLmNvbmYiIiIKK0xvY2F0aW9uIG9mIGEgbWRhZG0uY29uZiBmaWxlIHRvIGluY2x1ZGUuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBubworZmlsZXMgYXJlIGluY2x1ZGVkLCBhbmQgYW55IGRldmljZXMgc3BlY2lmaWVkIHdpdGggdGhlIFxmQlwtclxmUiBvcHRpb24gYWJvdmUKK211c3QgaGF2ZSBtaW5vciBudW1iZXJzIHRoYXQgbWF0Y2ggdGhlaXIgc3VwZXJibG9jayB2YWx1ZXMuIFRoaXMgY2FuIGFsc28gYmUKK3NwZWNpZmllZCB2aWEgdGhlIFxmQlxmKENCJFJBSURDT05GXGZCXGZSIGVudmlyb25tZW50IHZhcmlhYmxlLgorLklQICJcZkJcLU18XC1cLW1ha2VkZXZcZlIgXGZJc3R5bGVcZlIiIDQKKy5JWCBJdGVtICItTXwtLW1ha2VkZXYgc3R5bGUiCitTZXQgXHMtMU1BS0VERVZcczAgaW52b2NhdGlvbiBzdHlsZS4gVGhlIHNjcmlwdCBjdXJyZW50bHkgc3VwcG9ydHMgMyBzdHlsZXMgb2YKK1wmXHMtMU1BS0VERVZcczAgcHJvZ3JhbXMgXGZJZGViaWFuXGZSLCBcZklyZWRoYXRcZlIgYW5kIFxmSWdlbnRvb1xmUi4gVGhlIGRlZmF1bHQgaXMgXGZJZGViaWFuXGZSLgorU2V0IHRvIFxmSXJlZGhhdFxmUiBpZiB1c2luZyB0aGUgUmVkSGF0L0ZlZG9yYSBiaW5hcnkgXHMtMU1BS0VERVZcczAgcHJvZ3JhbS4gXGZJZ2VudG9vXGZSCitoYXMgdGhlIHNhbWUgYmluYXJ5IGJ1dCBpbiAvc2JpbiBpbnN0ZWFkIG9mIC9kZXYuIFBsZWFzZSBzZW5kIGEgYnVnIHJlcG9ydCB0bworbWFpbnRhaW5lciBpZiB5b3VyIGRpc3RyaWJ1dGlvbiBkb2Vzbid0IHdvcmsgd2l0aCBhbnkgb2YgdGhlIGN1cnJlbnQgb3B0aW9ucy4KKy5TSCAiRU5WSVJPTk1FTlQgVkFSSUFCTEVTIgorLklYIEhlYWRlciAiRU5WSVJPTk1FTlQgVkFSSUFCTEVTIgorTW9zdCBvZiB0aGUgb3B0aW9ucyB0byB0aGlzIHNjcmlwdCBjYW4gYmUgc2V0IHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEluCitzaXR1YXRpb25zIHdoZXJlIGJvdGggYXJlIHNldCwgdGhlbiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlLgorLmllIG4gLklQICJcZkJcZkIkTFZNQ09ORlxmQlxmUiIgNAorLmVsIC5JUCAiXGZCXGYoQ0IkTFZNQ09ORlxmQlxmUiIgNAorLklYIEl0ZW0gIiRMVk1DT05GIgorU2FtZSBhcyBcLWMgb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkTU9EVUxFU1xmQlxmUiIgNAorLmVsIC5JUCAiXGZCXGYoQ0IkTU9EVUxFU1xmQlxmUiIgNAorLklYIEl0ZW0gIiRNT0RVTEVTIgorU2FtZSBhcyBcLW0gb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkRVhUUkFGSUxFU1xmQlxmUiIgNAorLmVsIC5JUCAiXGZCXGYoQ0IkRVhUUkFGSUxFU1xmQlxmUiIgNAorLklYIEl0ZW0gIiRFWFRSQUZJTEVTIgorU2FtZSBhcyBcLWUgb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkUkFJRFxmQlxmUiIgNAorLmVsIC5JUCAiXGZCXGYoQ0IkUkFJRFxmQlxmUiIgNAorLklYIEl0ZW0gIiRSQUlEIgorU2FtZSBhcyBcLXIgb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkUkFJRENPTkZcZkJcZlIiIDQKKy5lbCAuSVAgIlxmQlxmKENCJFJBSURDT05GXGZCXGZSIiA0CisuSVggSXRlbSAiJFJBSURDT05GIgorU2FtZSBhcyBcLVIgb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkTUFLRURFVlxmQlxmUiIgNAorLmVsIC5JUCAiXGZCXGYoQ0IkTUFLRURFVlxmQlxmUiIgNAorLklYIEl0ZW0gIiRNQUtFREVWIgorU2FtZSBhcyBcLU0gb3B0aW9uLgorLmllIG4gLklQICJcZkJcZkIkQkFTSUNERVZJQ0VTXGZCXGZSIiA0CisuZWwgLklQICJcZkJcZihDQiRCQVNJQ0RFVklDRVNcZkJcZlIiIDQKKy5JWCBJdGVtICIkQkFTSUNERVZJQ0VTIgorT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFxmKENXJEJBU0lDREVWSUNFU1xmUiBpbiB0aGUgc2NyaXB0ICh3aGljaCBpcyBcKihMInN0ZCBjb25zb2xlb25seSBmZFwqKFIiKS4gVGhlc2UgdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIFxmQlxzLTFNQUtFREVWXHMwXGZSIHByb2dyYW0gdG8gY3JlYXRlIGRldmljZQorZW50cmllcyBpbiB0aGUgaW5pdHJkIGltYWdlLgorLmllIG4gLklQICJcZkJcZkIkQkxPQ0tERVZJQ0VTXGZCXGZSIiA0CisuZWwgLklQICJcZkJcZihDQiRCTE9DS0RFVklDRVNcZkJcZlIiIDQKKy5JWCBJdGVtICIkQkxPQ0tERVZJQ0VTIgorT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFxmKENXJEJMT0NLREVWSUNFU1xmUiBpbiB0aGUgc2NyaXB0ICh3aGljaCBpcyBcKihMIm1kIGhkYSBoZGIgaGRjIGhkZCBzZGEgc2RiIHNkYyBzZGRcKihSIikuIFRoaXMgdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBcZkJccy0xTUFLRURFVlxzMFxmUiBwcm9ncmFtIHRvCitjcmVhdGUgZGV2aWNlIGVudHJpZXMgaW4gdGhlIGluaXRyZCBpbWFnZS4KKy5pZSBuIC5JUCAiXGZCXGZCJEJJTkZJTEVTXGZCXGZSIiA0CisuZWwgLklQICJcZkJcZihDQiRCSU5GSUxFU1xmQlxmUiIgNAorLklYIEl0ZW0gIiRCSU5GSUxFUyIKK092ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcZihDVyRCSU5GSUxFU1xmUiAod2hpY2ggaXMgXCooTCIvbGliL2x2bVwtMjAwL2x2bSAvYmluL2Jhc2ggL2Jpbi9idXN5Ym94IC9zYmluL3Bpdm90X3Jvb3RcKihSIikuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdXNpbmcgdGhpcyBhbmQgYWRkaW5nCithIGZpbGUgdG8gdGhlIFxmKENXJEVYVFJBRklMRVNcZlIgbGlzdCBhYm92ZSBpcyB0aGF0IGxpYnJhcmllcyB0aGF0IHRoZXNlIGRlcGVuZCB1cG9uIGFyZSBhbHNvIGluY2x1ZGVkLiBZb3UgY2FuIHN0aWxsIHVzZSBcZihDVyRFWFRSQUZJTEVTXGZSIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LCBidXQKK3lvdSBtdXN0IHJlc29sdmUgbGlicmFyeSBkZXBlbmRlbmNpZXMgeW91c2VsZi4KKy5pZSBuIC5JUCAiXGZCXGZCJElOSVRSRFNJWkVcZkJcZlIiIDQKKy5lbCAuSVAgIlxmQlxmKENCJElOSVRSRFNJWkVcZkJcZlIiIDQKKy5JWCBJdGVtICIkSU5JVFJEU0laRSIKK0ZvcmNlIGEgcGFydGljdWxhciBzaXplIGZvciB5b3VyIGluaXRyZCBpbWFnZS4gVGhlIGRlZmF1bHQgaXMgdG8gdG90YWwgdXAgdGhlIHNpemUgb2YKK3RoZSBpbmNsdWRlZCBmaWxlcyBhbmQgdG8gYWRkIDUxMksgYXMgYSBidWZmZXIuCisuU0ggIkJVR1MiCisuSVggSGVhZGVyICJCVUdTIgorSSBkb24ndCBsaWtlIGhhdmluZyB0byBzcGVjaWZ5IGEgXC1NIG9wdGlvbiB0byBzZXQgdGhlIFxzLTFNQUtFREVWXHMwIHN0eWxlLCBidXQgSSBrbm93CitvZiBubyB3YXkgdG8gcmVsaWFibHkgZGV0ZWN0IHdoYXQgdHlwZSBvZiBccy0xTUFLRURFVlxzMCBpcyBiZWluZyB1c2VkLiBXZSdsbCBwcm9iYWJseQoraGF2ZSB0byBhZGQgb3RoZXIgXHMtMU1BS0VERVZcczAgc3R5bGVzIGluIHRoZSBmdXR1cmUgYXMgdGhpcyBzY3JpcHQgaXMgdGVzdGVkIG9uCitvdGhlciBkaXN0cmlidXRpb25zLgorLlNIICJBVVRIT1JTIgorLklYIEhlYWRlciAiQVVUSE9SUyIKK1RoZSBzY3JpcHQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWd1ZWwgQ2FiZWNhLCB3aXRoIHNpZ25pZmljYW50CitpbXByb3ZlbWVudHMgYnkgSmVmZnJleSBMYXl0b24uIENvbW1lbnRzLCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyBzaG91bGQgYmUKK3NlbnQgdG8gSmVmZnJleSBMYXl0b24gYXQgXGZCanRsYXl0b25AcG9vY2hpZXJlZHMubmV0XGZSLgorLlNIICJTRUUgQUxTTyIKKy5JWCBIZWFkZXIgIlNFRSBBTFNPIgorXCZcZkJccy0xTUFLRURFVlxzMFxmUig4KSwgXGZCbWRhZG1cZlIoOCksIFxmQmJ1c3lib3hcZlIoOCksIFxmQmx2bS5jb25mXGZSKDUpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJjcmVhdGVfaW5pdHJkLnBvZCBiL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvbHZtMmNyZWF0ZV9pbml0cmQucG9kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWRlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJjcmVhdGVfaW5pdHJkLnBvZApAQCAtMCwwICsxLDE4NyBAQAorPWhlYWQxIE5BTUUKKworbHZtMmNyZWF0ZV9pbml0cmQgLSBjcmVhdGUgaW5pdHJkIGltYWdlIGZvciBib290aW5nIHRvIHJvb3RcLW9uXC1MVk0yCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGx2bTJjcmVhdGVfaW5pdHJkPiBbIEI8LWh8LS1oZWxwPiBdIFsgQjwtdnwtLXZlcmJvc2U+IF0gWyBCPC1jfC0tbHZtY29uZj4gSTwvcGF0aC90by9sdm0uY29uZj4gXSBbIEI8LW18LS1tb2R1bGVzPiAiSTxtb2R1bGUxIG1vZHVsZTIgLi4uPiIgXSBbIEI8LWV8LS1leHRyYT4gIkk8ZmlsZTEgZmlsZTIgLi4uPiIgXSBbIEI8LXJ8LS1yYWlkPiAiSTwvZGV2L21kMSAvZGV2L21kMiAuLi4+IiBdCitbIEI8LVJ8LS1yYWlkY29uZj4gSTwvcGF0aC90by9tZGFkbS5jb25mPiBdIFsgQjwtTXwtLW1ha2VkZXY+IEk8c3R5bGU+IF0KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK2x2bTJjcmVhdGVfaW5pdHJkIGNyZWF0ZXMgYW4gaW5pdGlhbCByYW1kaXNrIChpbml0cmQpIGltYWdlIHN1aXRhYmxlIGZvciBib290aW5nIHRvIHN5c3RlbSB0aGF0IGhhcyBhbiBMVk0yIHZvbHVtZSBhcyBpdHMgcm9vdCBmaWxlc3lzdGVtLgorCitUbyBib290IHRvIHN1Y2ggYSBzZXR1cCwgeW91J2xsCitlaXRoZXIgbmVlZCBhIGJvb3Rsb2FkZXIgdGhhdCB1bmRlcnN0YW5kcyBMVk0yIHZvbHVtZXMsIG9yIHlvdSdsbCBuZWVkIGEKK2ZpbGVzeXN0ZW0gb24gYSByZWd1bGFyIHZvbHVtZSB0byBhY3QgYXMgYSBib290IHBhcnRpdGlvbiAodHlwaWNhbGx5IG1vdW50ZWQKK29uIC9ib290KS4KKworVGhlIHJlc3VsdGluZyBpbml0cmQgaW1hZ2UgaXMgZmFpcmx5IGZ1bGwtZmVhdHVyZWQuIEl0IGNhbiBoYXJib3IgYW5kIGxvYWQKK2tlcm5lbCBtb2R1bGVzLCBzdGFydCBNRCBkZXZpY2VzLCBhbmQgYm9vdCB0byBhIHNoZWxsIHRvIHBlcmZvcm0gcmVzY3VlCitvcGVyYXRpb25zLgorCis9aGVhZDIgQm9vdGluZyB0byB5b3VyIGluaXRyZCBJbWFnZToKKworVGhlIGZpbGVzeXN0ZW0gaW1hZ2UgY3JlYXRlZCBpcyBhbiBleHQyZnMgZmlsZXN5c3RlbSwgaGVuY2UgeW91ciBrZXJuZWwgbXVzdCBoYXZlCitleHQyZnMgYnVpbHQgaW50byBpdCBzdGF0aWNhbGx5IGluIG9yZGVyIHRvIGJvb3QgdG8gdGhlIGltYWdlLgorCitPbmNlIHlvdSBjcmVhdGUgeW91ciBpbml0cmQgaW1hZ2UsIHlvdSBtdXN0IHBhc3MgdGhlIGNvcnJlY3Qgb3B0aW9ucyB0byB0aGUga2VybmVsIHdoZW4KK3lvdSBib290IHVzaW5nIGl0LiBZb3VyIGtlcm5lbCBjb21tYW5kIGxpbmUgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKworQjxyb290PS9kZXYvcmFtMCBsdm0ycm9vdD0vZGV2L3Jvb3R2Zy9yb290IFsgbHZtMnJlc2N1ZSBdPgorCitvZiBjb3Vyc2UgdGhlcmUgbWF5IGJlIG90aGVyIG9wdGlvbnMuCisKKz1vdmVyCisKKz1pdGVtIEI8cm9vdD0vZGV2L3JhbTA+CisKK1RoaXMgb3B0aW9uIGlzIHJlcXVpcmVkLiBJdCB0ZWxscyB0aGUga2VybmVsIHRoYXQgdGhlIHJvb3QgZmlsZXN5c3RlbSBzaG91bGQgaW5pdGlhbGx5CitiZSBzZXQgdG8gdGhlIHJhbWRpc2sgKC9kZXYvcmFtMCkuCisKKz1pdGVtIEI8bHZtMnJvb3Q9L2Rldi9yb290dmcvcm9vdD4KKworVGhpcyBvcHRpb24gaXMgYWxzbyByZXF1aXJlZC4gSXQgdGVsbHMgdGhlIGluaXRyZCBpbWFnZSB3aGljaCBMVk0yIGRldmljZSB0aGUgcm9vdCBmaWxlc3lzdGVtIGlzIGxvY2F0ZWQgb24uCisKKz1pdGVtIEI8bHZtMnJlc2N1ZT4KKworQ2F1c2VzIHRoZSBpbml0cmQgaW1hZ2UgdG8gcnVuIGEgc2hlbGwgcHJpb3IgdG8gbW91bnRpbmcgdGhlIHJvb3QgZmlsZXN5c3RlbS4gVGhpcyBpcworaGVscGZ1bCBpbiBkaXNhc3RlciBzaXR1YXRpb25zIHdoZXJlIHlvdXIgaW5pdHJkIGltYWdlIGlzIGFjY2Vzc2FibGUsIGJ1dCB0aGVyZSBpcworYSBwcm9ibGVtIHdpdGggdGhlIHJvb3QgZmlsZXN5c3RlbSAoY29ycnVwdGVkIGltYWdlLCBpbmNvcnJlY3QgZGV2aWNlIHNldHVwLCBldGMuKS4gVGhpcworb3B0aW9uIGlzIChvZiBjb3Vyc2UpIG9wdGlvbmFsLgorCis9YmFjaworCis9aGVhZDEgT1BUSU9OUworCitNb3N0IG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHZpYSBjb21tYW5kLWxpbmUgb3B0aW9ucyBjYW4gYWxzbyBiZSBzZXQKK3ZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIE9wdGlvbnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYWx3YXlzIHRha2UKK3ByZWNlZGVuY2UuCisKKz1vdmVyCisKKz1pdGVtIEI8LWh8LS1oZWxwPgorCitEaXNwbGF5IHNob3J0IGhlbHAgdGV4dCBhbmQgZXhpdC4gSWYgdXNlZCwgb3RoZXIgb3B0aW9ucyBhcmUgaWdub3JlZC4KKworPWl0ZW0gQjwtdnwtLXZlcmJvc2U+CisKK1R1cm4gb24gZXh0cmEgdmVyYm9zaXR5IGZvciBkZWJ1Z2dpbmcsIGV0Yy4KKworPWl0ZW0gQjwtY3wtLWx2bWNvbmY+IEk8L3BhdGgvdG8vbHZtLmNvbmY+CisKK1NwZWNpZnkgYW4gbHZtLmNvbmYgZmlsZSB0byBpbmNsdWRlIGluIHRoZSBpbWFnZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUKK3NwZWNpYWwgZGV2aWNlIGZpbHRlcnMgb3Igb3RoZXIgb3B0aW9ucyB5b3Ugd2lzaCB0byB1c2UgZHVyaW5nIHRoZSBpbml0cmQKK3N0YWdlLiBJZiB0aGlzIG9wdGlvbiBpcyBub3QKK2luY2x1ZGVkLCB0aGVuIGEgbHZtLmNvbmYgZmlsZSBpcyBjcmVhdGVkIHRoYXQgY29udGFpbnMgb25seSB0aGUgY3VycmVudAorZGV2aWNlIGZpbHRlciBmcm9tIGFuIEI8bHZtIGR1bXBjb25maWc+LiBUaGlzIGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIEI8JExWTUNPTkY+CitlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworPWl0ZW0gQjwtbXwtLW1vZHVsZXM+ICJJPC9wYXRoL3RvL21vZHVsZTEua28gL3BhdGgvdG8vbW9kdWxlMi5rbyAuLi4+IgorCitTcGVjaWZ5IG1vZHVsZXMgdG8gaW5jbHVkZSBhbmQgcGx1ZyBpbiBkdXJpbmcgdGhlIGluaXRyZCBwaGFzZS4gVGhpcyBvcHRpb24KK3Rha2VzIGEgcXVvdGVkLCBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGVzLiBGdWxsIHBhdGhuYW1lcyBhcmUgcmVxdWlyZWQuCitUaGVzZSBtb2R1bGVzIGFyZSBsb2FkZWQgaW50byB0aGUga2VybmVsIGVhcmx5IGluIHRoZSBpbml0cmQgcGhhc2Ugb2YgdGhlIGJvb3QKK3Byb2Nlc3MuIFRoZSBjdXJyZW50IG1vZHByb2JlLmNvbmYgZmlsZSBpcyBhbHNvIGNvcGllZCB0byB0aGUgaW5pdHJkIGltYWdlCithcyB3ZWxsLiBUaGlzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB2aWEgdGhlIEI8JE1PRFVMRVM+IGVudmlyb25tZW50IHZhcmlhYmxlLgorCis9aXRlbSBCPC1lfC0tZXh0cmE+ICJJPC9wYXRoL3RvL2ZpbGUxIC9wYXRoL3RvL2ZpbGUyIC4uLj4iCisKK0V4dHJhIGZpbGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBpbml0cmQgaW1hZ2UuIFRoZXNlIGZpbGVzIHdpbGwgYmUKK2NvcGllZCB0byB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgaW5pdHJkIGltYWdlIHRoYXQgdGhleSBhcmUgaW4gdGhlIGN1cnJlbnQKK2ZpbGVzeXN0ZW0uIEFnYWluIGZ1bGwgcGF0aG5hbWVzIGFyZSByZXF1aXJlZC4gVGhpcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgdmlhCit0aGUgQjwkRVhUUkFGSUxFUz4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKz1pdGVtIEI8LXJ8LS1yYWlkPiAiSTwvZGV2L21kMSAvZGV2L21kMi4uLj4iCisKK1JBSUQgZGV2aWNlcyB0byBiZSBzdGFydGVkIHByaW9yIHRvIHNjYW5uaW5nIGZvciBMVk0yIHZvbHVtZSBncm91cHMuIElmIHRoaXMKK29wdGlvbiBpcyB1c2VkIHRoZW4gdGhlbiBCPG1kYWRtPiBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkLiBUaGlzIGNhbiBhbHNvIGJlCitzcGVjaWZpZWQgdmlhIHRoZSBCPCRSQUlEPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworPWl0ZW0gQjwtUnwtLXJhaWRjb25mPiAiSTwvcGF0aC90by9tZGFkbS5jb25mPiIKKworTG9jYXRpb24gb2YgYSBtZGFkbS5jb25mIGZpbGUgdG8gaW5jbHVkZS4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIG5vCitmaWxlcyBhcmUgaW5jbHVkZWQsIGFuZCBhbnkgZGV2aWNlcyBzcGVjaWZpZWQgd2l0aCB0aGUgQjwtcj4gb3B0aW9uIGFib3ZlCittdXN0IGhhdmUgbWlub3IgbnVtYmVycyB0aGF0IG1hdGNoIHRoZWlyIHN1cGVyYmxvY2sgdmFsdWVzLiBUaGlzIGNhbiBhbHNvIGJlCitzcGVjaWZpZWQgdmlhIHRoZSBCPCRSQUlEQ09ORj4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKz1pdGVtIEI8LU18LS1tYWtlZGV2PiBJPHN0eWxlPgorCitTZXQgTUFLRURFViBpbnZvY2F0aW9uIHN0eWxlLiBUaGUgc2NyaXB0IGN1cnJlbnRseSBzdXBwb3J0cyAzIHN0eWxlcyBvZgorTUFLRURFViBwcm9ncmFtcyBJPGRlYmlhbj4sIEk8cmVkaGF0PiBhbmQgSTxnZW50b28+LiBUaGUgZGVmYXVsdCBpcyBJPGRlYmlhbj4uCitTZXQgdG8gSTxyZWRoYXQ+IGlmIHVzaW5nIHRoZSBSZWRIYXQvRmVkb3JhIGJpbmFyeSBNQUtFREVWIHByb2dyYW0uIEk8Z2VudG9vPgoraGFzIHRoZSBzYW1lIGJpbmFyeSBidXQgaW4gL3NiaW4gaW5zdGVhZCBvZiAvZGV2LiBQbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQgdG8KK21haW50YWluZXIgaWYgeW91ciBkaXN0cmlidXRpb24gZG9lc24ndCB3b3JrIHdpdGggYW55IG9mIHRoZSBjdXJyZW50IG9wdGlvbnMuCisKKz1iYWNrCisKKz1oZWFkMSBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKworTW9zdCBvZiB0aGUgb3B0aW9ucyB0byB0aGlzIHNjcmlwdCBjYW4gYmUgc2V0IHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEluCitzaXR1YXRpb25zIHdoZXJlIGJvdGggYXJlIHNldCwgdGhlbiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlLgorCis9b3ZlcgorCis9aXRlbSBCPCRMVk1DT05GPgorCitTYW1lIGFzIC1jIG9wdGlvbi4KKworPWl0ZW0gQjwkTU9EVUxFUz4KKworU2FtZSBhcyAtbSBvcHRpb24uCisKKz1pdGVtIEI8JEVYVFJBRklMRVM+CisKK1NhbWUgYXMgLWUgb3B0aW9uLgorCis9aXRlbSBCPCRSQUlEPgorCitTYW1lIGFzIC1yIG9wdGlvbi4KKworPWl0ZW0gQjwkUkFJRENPTkY+CisKK1NhbWUgYXMgLVIgb3B0aW9uLgorCis9aXRlbSBCPCRNQUtFREVWPgorCitTYW1lIGFzIC1NIG9wdGlvbi4KKworPWl0ZW0gQjwkQkFTSUNERVZJQ0VTPgorCitPdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgJEJBU0lDREVWSUNFUyBpbiB0aGUgc2NyaXB0ICh3aGljaCBpcyAic3RkIGNvbnNvbGVvbmx5IGZkIikuIFRoZXNlIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSBCPE1BS0VERVY+IHByb2dyYW0gdG8gY3JlYXRlIGRldmljZQorZW50cmllcyBpbiB0aGUgaW5pdHJkIGltYWdlLgorCis9aXRlbSBCPCRCTE9DS0RFVklDRVM+CisKK092ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAkQkxPQ0tERVZJQ0VTIGluIHRoZSBzY3JpcHQgKHdoaWNoIGlzICJtZCBoZGEgaGRiIGhkYyBoZGQgc2RhIHNkYiBzZGMgc2RkIikuIFRoaXMgdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBCPE1BS0VERVY+IHByb2dyYW0gdG8KK2NyZWF0ZSBkZXZpY2UgZW50cmllcyBpbiB0aGUgaW5pdHJkIGltYWdlLgorCis9aXRlbSBCPCRCSU5GSUxFUz4KKworT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mICRCSU5GSUxFUyAod2hpY2ggaXMgIi9saWIvbHZtLTIwMC9sdm0gL2Jpbi9iYXNoIC9iaW4vYnVzeWJveCAvc2Jpbi9waXZvdF9yb290IikuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdXNpbmcgdGhpcyBhbmQgYWRkaW5nCithIGZpbGUgdG8gdGhlICRFWFRSQUZJTEVTIGxpc3QgYWJvdmUgaXMgdGhhdCBsaWJyYXJpZXMgdGhhdCB0aGVzZSBkZXBlbmQgdXBvbiBhcmUgYWxzbyBpbmNsdWRlZC4gWW91IGNhbiBzdGlsbCB1c2UgJEVYVFJBRklMRVMgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QsIGJ1dAoreW91IG11c3QgcmVzb2x2ZSBsaWJyYXJ5IGRlcGVuZGVuY2llcyB5b3VzZWxmLgorCis9aXRlbSBCPCRJTklUUkRTSVpFPgorCitGb3JjZSBhIHBhcnRpY3VsYXIgc2l6ZSBmb3IgeW91ciBpbml0cmQgaW1hZ2UuIFRoZSBkZWZhdWx0IGlzIHRvIHRvdGFsIHVwIHRoZSBzaXplIG9mCit0aGUgaW5jbHVkZWQgZmlsZXMgYW5kIHRvIGFkZCA1MTJLIGFzIGEgYnVmZmVyLgorCis9YmFjaworCis9aGVhZDEgQlVHUworCitJIGRvbid0IGxpa2UgaGF2aW5nIHRvIHNwZWNpZnkgYSAtTSBvcHRpb24gdG8gc2V0IHRoZSBNQUtFREVWIHN0eWxlLCBidXQgSSBrbm93CitvZiBubyB3YXkgdG8gcmVsaWFibHkgZGV0ZWN0IHdoYXQgdHlwZSBvZiBNQUtFREVWIGlzIGJlaW5nIHVzZWQuIFdlJ2xsIHByb2JhYmx5CitoYXZlIHRvIGFkZCBvdGhlciBNQUtFREVWIHN0eWxlcyBpbiB0aGUgZnV0dXJlIGFzIHRoaXMgc2NyaXB0IGlzIHRlc3RlZCBvbgorb3RoZXIgZGlzdHJpYnV0aW9ucy4KKworPWhlYWQxIEFVVEhPUlMKKworVGhlIHNjcmlwdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pZ3VlbCBDYWJlY2EsIHdpdGggc2lnbmlmaWNhbnQKK2ltcHJvdmVtZW50cyBieSBKZWZmcmV5IExheXRvbi4gQ29tbWVudHMsIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIHNob3VsZCBiZQorc2VudCB0byBKZWZmcmV5IExheXRvbiBhdCBTPEI8anRsYXl0b25AcG9vY2hpZXJlZHMubmV0Pj4uCisKKz1oZWFkMSBTRUUgQUxTTworCitCPE1BS0VERVY+KDgpLCBCPG1kYWRtPig4KSwgQjxidXN5Ym94Pig4KSwgQjxsdm0uY29uZj4oNSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtMmNyZWF0ZV9pbml0cmQvbHZtMnVkZXYgYi9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJ1ZGV2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzMzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x2bTJjcmVhdGVfaW5pdHJkL2x2bTJ1ZGV2CkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorCisjICRJZCQKKworIyBzaW1wbGUgc3RhcnR1cCBzY3JpcHQgdG8gY3JlYXRlIGx2bTIgZGV2aWNlcyBpZiAvZGV2IGlzIGEgbW91bnRwb2ludCwgdGhlcmUKKyMgYXJlIGFjdGl2ZSBkbS0gZGV2aWNlcywgYW5kIGFuIGV4ZWN1dGFibGUgL3NiaW4vdmdzY2FuLgorCisjIHRoaXMgc2NyaXB0IGlzIGxpY2Vuc2VkIHVuZGVyIEdQTHYyLgorIyBTZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCisKK2Nhc2UgJDEgaW4KK3N0YXJ0KQorICAgICMgaXMgL2RldiBhIG1vdW50cG9pbnQ/CisgICAgbW91bnRwb2ludCAtcSAvZGV2CisgICAgREVWTU5UUE9JTlQ9JD8KKworICAgICMgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhY3RpdmUgZG0gZW50cmllcyB1bmRlciAvc3lzCisgICAgbHMgL3N5cy9ibG9jay9kbS0qL2RldiAxPi9kZXYvbnVsbCAyPiYxCisgICAgQUNUSVZFRE1ERVZTPSQ/CisKKyAgICAjIG1rbm9kZXMgaWYgY29uZGl0aW9ucyBhcmUgcmlnaHQKKyAgICBpZiBbICRERVZNTlRQT0lOVCAtZXEgMCAtYSAkQUNUSVZFRE1ERVZTIC1lcSAwIC1hIC14IC9zYmluL3Znc2NhbiBdOyB0aGVuCisgICAgICAgIC9zYmluL3Znc2NhbiAtLW1rbm9kZXMgLS1pZ25vcmVsb2NraW5nZmFpbHVyZQorICAgIGZpCisgICAgOzsKK3N0b3ApCisgICAgZXhpdCAwCisgICAgOzsKKyopCisgICAgZWNobyAidXNhZ2U6IgorICAgIGVjaG8gIiAgICAkMCBzdGFydHxzdG9wIgorICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x2bWNvbmYuc2ggYi9zY3JpcHRzL2x2bWNvbmYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2MDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtY29uZi5zaApAQCAtMCwwICsxLDQ1NSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHZtMiBwYWNrYWdlLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjCisjIEVkaXQgYW4gbHZtLmNvbmYgZmlsZSB0byBhZGp1c3QgdmFyaW91cyBwcm9wZXJ0aWVzCisjCisKKyMgY2x1c3RlciB3aXRoIGNsdm1kIGFuZC9vciBsb2NraW5nIGxpYj8KK0hBTkRMRV9DTFVTVEVSPTAKKworIyBjbHVzdGVyIHdpdGhvdXQgY2x2bWQ/CitIQU5ETEVfSEFMVk09MAorCisjIGFsc28gZW5hYmxlIHNlcnZpY2VzIGFwcHJvcHJpYXRlbHkgKGx2bWV0YWQsIGNsdm1kKT8KK0hBTkRMRV9TRVJWSUNFUz0wCisKKyMgYWxzbyBlbmFibGUgY21pcnJvcmQgc2VydmljZSBpbiBhZGRpdGlvbj8KK0hBTkRMRV9NSVJST1JfU0VSVklDRT0wCisKKyMgYWxzbyBzdGFydC9zdGFydCBzZXJ2aWNlcyBpbiBhZGRpdGlvbiB0byBlbmFibGluZy9kaXNhYmxpbmcgdGhlbT8KK1NUQVJUX1NUT1BfU0VSVklDRVM9MAorCitmdW5jdGlvbiB1c2FnZQoreworICAgIGVjaG8gIlVzYWdlOiAkMCA8Y29tbWFuZD4iCisgICAgZWNobyAiIgorICAgIGVjaG8gIkNvbW1hbmRzOiIKKyAgICBlY2hvICJFbmFibGUgY2x2bTogIC0tZW5hYmxlLWNsdXN0ZXIgWy0tbG9ja2luZ2xpYmRpciA8ZGlyPl0gWy0tbG9ja2luZ2xpYiA8bGliPl0iCisgICAgZWNobyAiRGlzYWJsZSBjbHZtOiAtLWRpc2FibGUtY2x1c3RlciIKKyAgICBlY2hvICJFbmFibGUgaGFsdm06IC0tZW5hYmxlLWhhbHZtIgorICAgIGVjaG8gIkRpc2FibGUgaGFsdm06IC0tZGlzYWJsZS1oYWx2bSIKKyAgICBlY2hvICJTZXQgbG9ja2luZyBsaWJyYXJ5OiAtLWxvY2tpbmdsaWJkaXIgPGRpcj4gWy0tbG9ja2luZ2xpYiA8bGliPl0iCisgICAgZWNobyAiIgorICAgIGVjaG8gIkdsb2JhbCBvcHRpb25zOiIKKyAgICBlY2hvICJDb25maWcgZmlsZSBsb2NhdGlvbjogLS1maWxlIDxjb25maWdmaWxlPiIKKyAgICBlY2hvICJTZXQgc2VydmljZXM6IC0tc2VydmljZXMgWy0tbWlycm9yc2VydmljZV0gWy0tc3RhcnRzdG9wc2VydmljZXNdIgorICAgIGVjaG8gIiIKKyAgICBlY2hvICJVc2UgdGhlIHNlcGFyYXRlIGNvbW1hbmQgJ2x2bWNvbmZpZycgdG8gZGlzcGxheSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIgorfQorCitmdW5jdGlvbiBzZXRfZGVmYXVsdF91c2VfbHZtZXRhZF92YXIKK3sKKwlldmFsICQobHZtIGR1bXBjb25maWcgLS10eXBlIGRlZmF1bHQgZ2xvYmFsL3VzZV9sdm1ldGFkIDI+L2Rldi9udWxsKQorCWlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorCQlVU0VfTFZNRVRBRD0wCisJZWxzZQorICAgICAgICAgICAgICAgIFVTRV9MVk1FVEFEPSR1c2VfbHZtZXRhZAorCWZpCit9CisKK2Z1bmN0aW9uIHBhcnNlX2FyZ3MKK3sKKyAgICB3aGlsZSBbIC1uICIkMSIgXTsgZG8KKyAgICAgICAgY2FzZSAkMSBpbgorICAgICAgICAgICAgLS1lbmFibGUtY2x1c3RlcikKKyAgICAgICAgICAgICAgICBMT0NLSU5HX1RZUEU9MworICAgICAgICAgICAgICAgIFVTRV9MVk1FVEFEPTAKKyAgICAgICAgICAgICAgICBIQU5ETEVfQ0xVU1RFUj0xCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgLS1kaXNhYmxlLWNsdXN0ZXIpCisgICAgICAgICAgICAgICAgTE9DS0lOR19UWVBFPTEKKyAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF91c2VfbHZtZXRhZF92YXIKKyAgICAgICAgICAgICAgICBIQU5ETEVfQ0xVU1RFUj0xCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgLS1lbmFibGUtaGFsdm0pCisgICAgICAgICAgICAgICAgTE9DS0lOR19UWVBFPTEKKwkJVVNFX0xWTUVUQUQ9MAorICAgICAgICAgICAgICAgIEhBTkRMRV9IQUxWTT0xCisJCXNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tZGlzYWJsZS1oYWx2bSkKKyAgICAgICAgICAgICAgICBMT0NLSU5HX1RZUEU9MQorICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3VzZV9sdm1ldGFkX3ZhcgorICAgICAgICAgICAgICAgIEhBTkRMRV9IQUxWTT0xCisJCXNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tbG9ja2luZ2xpYmRpcikKKyAgICAgICAgICAgICAgICBpZiBbIC1uICIkMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBMT0NLSU5HTElCRElSPSQyCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzYWdlCisgICAgICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgSEFORExFX0NMVVNURVI9MQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAtLWxvY2tpbmdsaWIpCisgICAgICAgICAgICAgICAgaWYgWyAtbiAiJDIiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgTE9DS0lOR0xJQj0kMgorICAgICAgICAgICAgICAgICAgICBzaGlmdCAyCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1c2FnZQorICAgICAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIEhBTkRMRV9DTFVTVEVSPTEKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgLS1maWxlKQorICAgICAgICAgICAgICAgIGlmIFsgLW4gIiQyIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIENPTkZJR0ZJTEU9JDIKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgMgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UKKyAgICAgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgLS1zZXJ2aWNlcykKKyAgICAgICAgICAgICAgICBIQU5ETEVfU0VSVklDRVM9MQorICAgICAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tbWlycm9yc2VydmljZSkKKyAgICAgICAgICAgICAgICBIQU5ETEVfTUlSUk9SX1NFUlZJQ0U9MQorICAgICAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tc3RhcnRzdG9wc2VydmljZXMpCisgICAgICAgICAgICAgICAgU1RBUlRfU1RPUF9TRVJWSUNFUz0xCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICB1c2FnZQorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgaWYgWyAiJExPQ0tJTkdMSUJESVIiIC1vICIkTE9DS0lOR0xJQiIgXTsgdGhlbgorICAgICAgICBMT0NLSU5HX1RZUEU9MgorICAgICAgICBVU0VfTFZNRVRBRD0wCisgICAgZmkKK30KKworZnVuY3Rpb24gdmFsaWRhdGVfYXJncworeworICAgIFsgLXogIiRDT05GSUdGSUxFIiBdICYmIENPTkZJR0ZJTEU9Ii9ldGMvbHZtL2x2bS5jb25mIgorCisgICAgaWYgWyAhIC1mICIkQ09ORklHRklMRSIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiJENPTkZJR0ZJTEUgZG9lcyBub3QgZXhpc3QiCisgICAgICAgICAgICBleGl0IDEwCisgICAgZmkKKworICAgIGlmIFsgIiRIQU5ETEVfQ0xVU1RFUiIgPSAiMSIgLWEgIiRIQU5ETEVfSEFMVk0iID0gIjEiIF07IHRoZW4KKyAgICAgICAgZWNobyAiRWl0aGVyIEhBIExWTSBvciBjbHVzdGVyIG1ldGhvZCBtYXkgYmUgdXNlZCBhdCBvbmUgdGltZSIKKwkgICAgZXhpdCAxOAorICAgIGZpCisKKyAgICBpZiBbICIkSEFORExFX1NFUlZJQ0VTIiA9ICIwIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRIQU5ETEVfTUlSUk9SX1NFUlZJQ0UiID0gIjEiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIi0tbWlycm9yc2VydmljZSBtYXkgYmUgdXNlZCBvbmx5IHdpdGggLS1zZXJ2aWNlcyIKKyAgICAgICAgICAgIGV4aXQgMTkKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAiJFNUQVJUX1NUT1BfU0VSVklDRVMiID0gIjEiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIi0tc3RhcnRzdG9wc2VydmljZXMgbWF5IGJlIHVzZWQgb25seSB3aXRoIC0tc2VydmljZXMiCisgICAgICAgICAgICBleGl0IDE5CisgICAgICAgIGZpCisgICAgZmkKKworICAgIGlmIFsgLXogIiRMT0NLSU5HX1RZUEUiIF0gJiYgWyAteiAiJExPQ0tJTkdMSUJESVIiIF07IHRoZW4KKyAgICAgICAgdXNhZ2UKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIFsgLW4gIiRMT0NLSU5HTElCRElSIiBdOyB0aGVuCisKKyAgICAgICAgaWYgWyAiJHtMT0NLSU5HTElCRElSOjA6MX0iICE9ICIvIiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBlY2hvICJQcmVmaXggbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUgKHN0YXJ0aW5nIHdpdGggYSAvKSIKKyAgICAgICAgICAgIGV4aXQgMTIKKyAgICAgICAgZmkKKworICAgICAgICBpZiBbIC1uICIkTE9DS0lOR0xJQiIgXSAmJiBbICEgLWYgIiRMT0NLSU5HTElCRElSLyRMT0NLSU5HTElCIiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBlY2hvICIkTE9DS0lOR0xJQkRJUi8kTE9DS0lOR0xJQiBkb2VzIG5vdCBleGlzdCwgZGlkIHlvdSBkbyBhIFwibWFrZSBpbnN0YWxsXCIgPyIKKyAgICAgICAgICAgIGV4aXQgMTEKKyAgICAgICAgZmkKKworICAgIGZpCisKKyAgICBpZiBbICIkTE9DS0lOR19UWVBFIiA9ICIxIiBdICYmIFsgLW4gIiRMT0NLSU5HTElCRElSIiAtbyAtbiAiJExPQ0tJTkdMSUIiIF07IHRoZW4KKwllY2hvICJTdXBlcmZsdW91cyBsb2NraW5nIGxpYiBwYXJhbWV0ZXIsIGlnbm9yaW5nIgorICAgIGZpCit9CisKK3VtYXNrIDAwNzcKKworcGFyc2VfYXJncyAiJEAiCisKK3ZhbGlkYXRlX2FyZ3MKKworCitTQ1JJUFRGSUxFPS9ldGMvbHZtLy5sdm1jb25mLXNjcmlwdC50bXAKK1RNUEZJTEU9L2V0Yy9sdm0vLmx2bWNvbmYtdG1wLnRtcAorCisKKyMgRmxhZ3Mgc28gd2Uga25vdyB3aGljaCBwYXJ0cyBvZiB0aGUgZmlsZSB3ZSBjYW4gcmVwbGFjZSBhbmQgd2hpY2ggbmVlZAorIyBhZGRpbmcuIFRoZXNlIGFyZSByZXR1cm4gY29kZXMgZnJvbSBncmVwLCBzbyB6ZXJvIG1lYW5zIGl0IElTIHByZXNlbnQhCitoYXZlX3R5cGU9MQoraGF2ZV9kaXI9MQoraGF2ZV9saWJyYXJ5PTEKK2hhdmVfdXNlX2x2bWV0YWQ9MQoraGF2ZV9nbG9iYWw9MQorCitncmVwIC1xICdeW1s6Ymxhbms6XV0qbG9ja2luZ190eXBlW1s6Ymxhbms6XV0qPScgJENPTkZJR0ZJTEUKK2hhdmVfdHlwZT0kPworCitncmVwIC1xICdeW1s6Ymxhbms6XV0qbGlicmFyeV9kaXJbWzpibGFuazpdXSo9JyAkQ09ORklHRklMRQoraGF2ZV9kaXI9JD8KKworZ3JlcCAtcSAnXltbOmJsYW5rOl1dKmxvY2tpbmdfbGlicmFyeVtbOmJsYW5rOl1dKj0nICRDT05GSUdGSUxFCitoYXZlX2xpYnJhcnk9JD8KKworZ3JlcCAtcSAnXltbOmJsYW5rOl1dKnVzZV9sdm1ldGFkW1s6Ymxhbms6XV0qPScgJENPTkZJR0ZJTEUKK2hhdmVfdXNlX2x2bWV0YWQ9JD8KKworIyBUaG9zZSBvcHRpb25zIGFyZSBpbiBzZWN0aW9uICJnbG9iYWwgeyIgc28gd2UgbXVzdCBoYXZlIG9uZSBpZiBhbnkgYXJlIHByZXNlbnQuCitpZiBbICIkaGF2ZV90eXBlIiA9ICIwIiAtbyAiJGhhdmVfZGlyIiA9ICIwIiAtbyAiJGhhdmVfbGlicmFyeSIgPSAiMCIgLW8gIiRoYXZlX3VzZV9sdm1ldGFkIiA9ICIwIiBdCit0aGVuCisKKyAgICAjIFNlZSBpZiB3ZSBjYW4gZmluZCBpdC4uLgorICAgIGdyZXAgLXEgJ15bWzpibGFuazpdXSpnbG9iYWxbWzpibGFuazpdXSp7JyAkQ09ORklHRklMRQorICAgIGhhdmVfZ2xvYmFsPSQ/CisKKyAgICBpZiBbICIkaGF2ZV9nbG9iYWwiID0gIjEiIF0gCisJdGhlbgorCWVjaG8gImdsb2JhbCBrZXlzIGJ1dCBubyAnZ2xvYmFsIHsnIGZvdW5kLCBjYW4ndCBlZGl0IGZpbGUiCisJZXhpdCAxMworICAgIGZpCitmaQorCitpZiBbICIkTE9DS0lOR19UWVBFIiA9ICIyIiBdICYmIFsgLXogIiRMT0NLSU5HTElCRElSIiBdICYmIFsgIiRoYXZlX2RpciIgPSAiMSIgXTsgdGhlbgorCWVjaG8gIm5vIGxpYnJhcnlfZGlyIHNwZWNpZmllZCBpbiAkQ09ORklHRklMRSIKKwlleGl0IDE2CitmaQorCisjIFNvIGlmIHdlIGRvbid0IGhhdmUgImdsb2JhbCB7IiB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUgYW5kIAorIyBwb3B1bGF0ZSBpdAorCitpZiBbICIkaGF2ZV9nbG9iYWwiID0gIjEiIF0KK3RoZW4KKyAgICBpZiBbIC16ICIkTE9DS0lOR19UWVBFIiBdOyB0aGVuCisJTE9DS0lOR19UWVBFPTEKKyAgICBmaQorICAgIGlmIFsgIiRMT0NLSU5HX1RZUEUiID0gIjMiIF0gfHwgWyAiJExPQ0tJTkdfVFlQRSIgPSAiMiIgXTsgdGhlbgorICAgICAgICBjYXQgJENPTkZJR0ZJTEUgLSA8PEVPRiA+ICRUTVBGSUxFCitnbG9iYWwgeworICAgICMgRW5hYmxlIGxvY2tpbmcgZm9yIGNsdXN0ZXIgTFZNCisgICAgbG9ja2luZ190eXBlID0gJExPQ0tJTkdfVFlQRQorICAgIGxpYnJhcnlfZGlyID0gIiRMT0NLSU5HTElCRElSIgorICAgICMgRGlzYWJsZSBsdm1ldGFkIGluIGNsdXN0ZXIKKyAgICB1c2VfbHZtZXRhZCA9IDAKK0VPRgorICAgICAgICBpZiBbICQ/ICE9IDAgXQorICAgICAgICB0aGVuCisgICAgCSAgICBlY2hvICJmYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBjb25maWcgZmlsZSwgJENPTkZJR0ZJTEUgbm90IHVwZGF0ZWQiCisJICAgIGV4aXQgMTQKKyAgICAgICAgZmkKKwlpZiBbIC1uICIkTE9DS0lOR0xJQiIgXTsgdGhlbgorCSAgICBjYXQgLSA8PEVPRiA+PiAkVE1QRklMRQorICAgIGxvY2tpbmdfbGlicmFyeSA9ICIkTE9DS0lOR0xJQiIKK0VPRgorICAgICAgICAgICAgaWYgWyAkPyAhPSAwIF0KKyAgICAgICAgICAgIHRoZW4KKwkgICAgICAgIGVjaG8gImZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlLCAkQ09ORklHRklMRSBub3QgdXBkYXRlZCIKKwkgICAgICAgIGV4aXQgMTYKKyAgICAgICAgICAgIGZpCisJZmkKKwljYXQgLSA8PEVPRiA+PiAkVE1QRklMRQorfQorRU9GCisgICAgZmkgIyBpZiB3ZSBhcmVuJ3Qgc2V0dGluZyBjbHVzdGVyIGxvY2tpbmcsIHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgZ2xvYmFsIHNlY3Rpb24KKworICAgIGlmIFsgJD8gIT0gMCBdCisgICAgdGhlbgorCWVjaG8gImZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlLCAkQ09ORklHRklMRSBub3QgdXBkYXRlZCIKKwlleGl0IDE3CisgICAgZmkKK2Vsc2UKKyAgICAjCisgICAgIyBXZSBoYXZlIGEgImdsb2JhbCB7IiBzZWN0aW9uLCBzbyBhZGQgb3IgcmVwbGFjZSB0aGUKKyAgICAjIGxvY2tpbmcgZW50cmllcyBhcyBhcHByb3ByaWF0ZQorICAgICMKKworICAgIGlmIFsgLW4gIiRMT0NLSU5HX1RZUEUiIF07IHRoZW4KKwlpZiBbICIkaGF2ZV90eXBlIiA9ICIwIiBdIAorCXRoZW4KKwkgICAgU0VEQ01EPSIgcy9eW1s6Ymxhbms6XV0qbG9ja2luZ190eXBlW1s6Ymxhbms6XV0qPS4qL1wgXCBcIFwgbG9ja2luZ190eXBlID0gJExPQ0tJTkdfVFlQRS9nIgorCWVsc2UKKwkgICAgU0VEQ01EPSIgL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgbG9ja2luZ190eXBlID0gJExPQ0tJTkdfVFlQRSIKKwlmaQorICAgIGZpCisKKyAgICBpZiBbIC1uICIkTE9DS0lOR0xJQkRJUiIgXTsgdGhlbgorICAgICAgICBpZiBbICIkaGF2ZV9kaXIiID0gIjAiIF0gCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxucydeW1s6Ymxhbms6XV0qbGlicmFyeV9kaXJbWzpibGFuazpdXSo9LionXCBcIFwgXCBsaWJyYXJ5X2RpciA9IFwiJExPQ0tJTkdMSUJESVJcIidnIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxuL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgbGlicmFyeV9kaXIgPSBcIiRMT0NLSU5HTElCRElSXCIiCisgICAgICAgIGZpCisgICAgZmkKKworICAgIGlmIFsgLW4gIiRMT0NLSU5HTElCIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRoYXZlX2xpYnJhcnkiID0gIjAiIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgIFNFRENNRD0iJHtTRURDTUR9XG5zL15bWzpibGFuazpdXSpsb2NraW5nX2xpYnJhcnlbWzpibGFuazpdXSo9LiovXCBcIFwgXCBsb2NraW5nX2xpYnJhcnkgPSBcIiRMT0NLSU5HTElCXCIvZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU0VEQ01EPSIke1NFRENNRH1cbi9nbG9iYWxbWzpibGFuazpdXSp7L2FcIFwgXCBcIGxvY2tpbmdfbGlicmFyeSA9IFwiJExPQ0tJTkdMSUJcIiIKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgWyAiJGhhdmVfdXNlX2x2bWV0YWQiID0gIjAiIF0KKyAgICB0aGVuCisgICAgICAgIFNFRENNRD0iJHtTRURDTUR9XG5zJ15bWzpibGFuazpdXSp1c2VfbHZtZXRhZFtbOmJsYW5rOl1dKj0uKidcIFwgXCBcIHVzZV9sdm1ldGFkID0gJFVTRV9MVk1FVEFEJ2ciCisgICAgZWxzZQorICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxuL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgdXNlX2x2bWV0YWQgPSAkVVNFX0xWTUVUQUQiCisgICAgZmkKKworICAgIGVjaG8gLWUgJFNFRENNRCA+ICRTQ1JJUFRGSUxFCisgICAgc2VkICA8JENPTkZJR0ZJTEUgPiRUTVBGSUxFIC1mICRTQ1JJUFRGSUxFCisgICAgaWYgWyAkPyAhPSAwIF0KKyAgICB0aGVuCisJZWNobyAic2VkIGZhaWxlZCwgJENPTkZJR0ZJTEUgbm90IHVwZGF0ZWQiCisJZXhpdCAxNQorICAgIGZpCitmaQorCisjIE5vdyB3ZSBoYXZlIGEgc3VpdGFibHkgZWRpdHRlZCBjb25maWcgZmlsZSBpbiBhIHRlbXAgcGxhY2UsCisjIGJhY2t1cCB0aGUgb3JpZ2luYWwgYW5kIGNvcHkgb3VyIG5ldyBvbmUgaW50byBwbGFjZS4KKworY3AgJENPTkZJR0ZJTEUgJENPTkZJR0ZJTEUubHZtY29uZm9sZAoraWYgWyAkPyAhPSAwIF0KKyAgICB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGJhY2t1cCBvbGQgY29uZmlnIGZpbGUsICRDT05GSUdGSUxFIG5vdCB1cGRhdGVkIgorICAgIGV4aXQgMgorZmkKKworY3AgJFRNUEZJTEUgJENPTkZJR0ZJTEUKK2lmIFsgJD8gIT0gMCBdCisgICAgdGhlbgorICAgIGVjaG8gImZhaWxlZCB0byBjb3B5IG5ldyBjb25maWcgZmlsZSBpbnRvIHBsYWNlLCBjaGVjayAkQ09ORklHRklMRSBpcyBzdGlsbCBPSyIKKyAgICBleGl0IDMKK2ZpCisKK3JtIC1mICRTQ1JJUFRGSUxFICRUTVBGSUxFCisKK2Z1bmN0aW9uIHNldF9zZXJ2aWNlIHsKKyAgICBsb2NhbCB0eXBlPSIkMSIKKyAgICBsb2NhbCBhY3Rpb249IiQyIgorICAgIHNoaWZ0IDIKKworICAgIGlmIFsgIiR0eXBlIiA9ICJzeXN0ZW1kIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRhY3Rpb24iID0gImFjdGl2YXRlIiBdOyB0aGVuCisgICAgICAgICAgICBmb3IgaSBpbiAkQDsgZG8KKyAgICAgICAgICAgICAgICBldmFsICQoJFNZU1RFTUNUTF9CSU4gc2hvdyAkaSAtcCBMb2FkU3RhdGUpCisgICAgICAgICAgICAgICAgdGVzdCAgIiRMb2FkU3RhdGUiID0gImxvYWRlZCIgfHwgY29udGludWUKKyAgICAgICAgICAgICAgICAkU1lTVEVNQ1RMX0JJTiBlbmFibGUgJGkKKyAgICAgICAgICAgICAgICBpZiBbICIkU1RBUlRfU1RPUF9TRVJWSUNFUyIgPSAiMSIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAkU1lTVEVNQ1RMX0JJTiBzdGFydCAkaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgIGVsaWYgWyAiJGFjdGlvbiIgPSAiZGVhY3RpdmF0ZSIgXTsgdGhlbgorICAgICAgICAgICAgZm9yIGkgaW4gJEA7IGRvCisgICAgICAgICAgICAgICAgZXZhbCAkKCRTWVNURU1DVExfQklOIHNob3cgJGkgLXAgTG9hZFN0YXRlKQorICAgICAgICAgICAgICAgIHRlc3QgICIkTG9hZFN0YXRlIiA9ICJsb2FkZWQiIHx8IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgJFNZU1RFTUNUTF9CSU4gZGlzYWJsZSAkaQorICAgICAgICAgICAgICAgIGlmIFsgIiRTVEFSVF9TVE9QX1NFUlZJQ0VTIiA9ICIxIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICRTWVNURU1DVExfQklOIHN0b3AgJGkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICBmaQorICAgIGVsaWYgWyAiJHR5cGUiID0gInN5c3YiIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJGFjdGlvbiIgPSAiYWN0aXZhdGUiIF07IHRoZW4KKyAgICAgICAgICAgIGZvciBpIGluICRAOyBkbworICAgICAgICAgICAgICAgICRDSEtDT05GSUdfQklOIC0tbGlzdCAkaSA+IC9kZXYvbnVsbCB8fCBjb250aW51ZQorICAgICAgICAgICAgICAgICRDSEtDT05GSUdfQklOICRpIG9uCisgICAgICAgICAgICAgICAgaWYgWyAiJFNUQVJUX1NUT1BfU0VSVklDRVMiID0gIjEiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgJFNFUlZJQ0VfQklOICRpIHN0YXJ0CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZWxpZiBbICIkYWN0aW9uIiA9ICJkZWFjdGl2YXRlIiBdOyB0aGVuCisgICAgICAgICAgICBmb3IgaSBpbiAkQDsgZG8KKyAgICAgICAgICAgICAgICAkQ0hLQ09ORklHX0JJTiAtLWxpc3QgJGkgPiAvZGV2L251bGwgIHx8IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgWyAiJFNUQVJUX1NUT1BfU0VSVklDRVMiID0gIjEiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgJFNFUlZJQ0VfQklOICRpIHN0b3AKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICRDSEtDT05GSUdfQklOICRpIG9mZgorICAgICAgICAgICAgZG9uZQorICAgICAgICBmaQorICAgIGZpCit9CisKKyMgU3RhcnQvc3RvcCBhbmQgZW5hYmxlL2Rpc2FibGUgc2VydmljZXMgaWYgbmVlZGVkLgorCitpZiBbICIkSEFORExFX1NFUlZJQ0VTIiA9PSAiMSIgXTsgdGhlbgorCisgICAgU1lTVEVNQ1RMX0JJTj0kKHdoaWNoIHN5c3RlbWN0bCAyPi9kZXYvbnVsbCkKKyAgICBDSEtDT05GSUdfQklOPSQod2hpY2ggY2hrY29uZmlnIDI+L2Rldi9udWxsKQorICAgIFNFUlZJQ0VfQklOPSQod2hpY2ggc2VydmljZSAyPi9kZXYvbnVsbCkKKworICAgICMgU3lzdGVtZCBzZXJ2aWNlcworICAgIGlmIFsgLW4gIiRTWVNURU1DVExfQklOIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRVU0VfTFZNRVRBRCIgPSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgc2V0X3NlcnZpY2Ugc3lzdGVtZCBkZWFjdGl2YXRlIGx2bTItbHZtZXRhZC5zZXJ2aWNlIGx2bTItbHZtZXRhZC5zb2NrZXQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0X3NlcnZpY2Ugc3lzdGVtZCBhY3RpdmF0ZSBsdm0yLWx2bWV0YWQuc29ja2V0CisgICAgICAgIGZpCisKKyAgICAgICAgaWYgWyAiJExPQ0tJTkdfVFlQRSIgPSAiMyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0X3NlcnZpY2Ugc3lzdGVtZCBhY3RpdmF0ZSBsdm0yLWNsdXN0ZXItYWN0aXZhdGlvbi5zZXJ2aWNlCisgICAgICAgICAgICBpZiBbICIkSEFORExFX01JUlJPUl9TRVJWSUNFIiA9ICIxIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgc2V0X3NlcnZpY2UgYWN0aXZhdGUgbHZtMi1jbWlycm9yZC5zZXJ2aWNlCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRfc2VydmljZSBzeXN0ZW1kIGRlYWN0aXZhdGUgbHZtMi1jbHVzdGVyLWFjdGl2YXRpb24uc2VydmljZQorICAgICAgICAgICAgaWYgWyAiJEhBTkRMRV9NSVJST1JfU0VSVklDRSIgPSAiMSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHNldF9zZXJ2aWNlIHN5c3RlbWQgZGVhY3RpdmF0ZSBsdm0yLWNtaXJyb3JkLnNlcnZpY2UKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAjIFN5c3RlbSBWIGluaXQgc2NyaXB0cworICAgIGVsaWYgWyAtbiAiJFNFUlZJQ0VfQklOIiAtYSAtbiAiJENIS0NPTkZJR19CSU4iIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJFVTRV9MVk1FVEFEIiA9ICIwIiBdOyB0aGVuCisgICAgICAgICAgICBzZXRfc2VydmljZSBzeXN2IGRlYWN0aXZhdGUgbHZtMi1sdm1ldGFkCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9zZXJ2aWNlIHN5c3YgYWN0aXZhdGUgbHZtMi1sdm1ldGFkCisgICAgICAgIGZpCisKKyAgICAgICAgaWYgWyAiJExPQ0tJTkdfVFlQRSIgPSAiMyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0X3NlcnZpY2Ugc3lzdiBhY3RpdmF0ZSBjbHZtZAorICAgICAgICAgICAgaWYgWyAiJEhBTkRMRV9NSVJST1JfU0VSVklDRSIgPSAiMSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHNldF9zZXJ2aWNlIHN5c3YgYWN0aXZhdGUgY21pcnJvcmQKKyAgICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9zZXJ2aWNlIHN5c3YgZGVhY3RpdmF0ZSBjbHZtZAorICAgICAgICAgICAgaWYgWyAiJEhBTkRMRV9NSVJST1JfU0VSVklDRSIgPSAiMSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHNldF9zZXJ2aWNlIHN5c3YgZGVhY3RpdmF0ZSBjbWlycm9yZAorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICMgTm9uZSBvZiB0aGUgc2VydmljZSB0b29scyBmb3VuZCwgZXJyb3Igb3V0CisgICAgZWxzZQorICAgICAgICBlY2hvICJNaXNzaW5nIHRvb2xzIHRvIGhhbmRsZSBzZXJ2aWNlcyIKKyAgICAgICAgZXhpdCAyMAorICAgIGZpCitmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9sdm1jb25mX2xvY2tpbmd0eXBlMi5zaCBiL3NjcmlwdHMvbHZtY29uZl9sb2NraW5ndHlwZTIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1ZWYwNwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHZtY29uZl9sb2NraW5ndHlwZTIuc2gKQEAgLTAsMCArMSwyNTkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGx2bTItY2x1c3RlciBwYWNrYWdlLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjCisjIEVkaXQgYW4gbHZtLmNvbmYgZmlsZSB0byBhZGp1c3QgdmFyaW91cyBwcm9wZXJ0aWVzCisjCisKK2Z1bmN0aW9uIHVzYWdlCit7CisgICAgZWNobyAidXNhZ2U6ICQwIDxjb21tYW5kPiIKKyAgICBlY2hvICIiCisgICAgZWNobyAiQ29tbWFuZHM6IgorICAgIGVjaG8gIkVuYWJsZSBjbHZtOiAgLS1lbmFibGUtY2x1c3RlciBbLS1sb2NraW5nbGliZGlyIDxkaXI+XSBbLS1sb2NraW5nbGliIDxsaWI+XSIKKyAgICBlY2hvICJEaXNhYmxlIGNsdm06IC0tZGlzYWJsZS1jbHVzdGVyIgorICAgIGVjaG8gIlNldCBsb2NraW5nIGxpYnJhcnk6IC0tbG9ja2luZ2xpYmRpciA8ZGlyPiBbLS1sb2NraW5nbGliIDxsaWI+XSIKKyAgICBlY2hvICIiCisgICAgZWNobyAiR2xvYmFsIG9wdGlvbnM6IgorICAgIGVjaG8gIkNvbmZpZyBmaWxlIGxvY2F0aW9uOiAtLWZpbGUgPGNvbmZpZ2ZpbGU+IgorICAgIGVjaG8gIiIKK30KKworCitmdW5jdGlvbiBwYXJzZV9hcmdzCit7CisgICAgd2hpbGUgWyAtbiAiJDEiIF07IGRvCisgICAgICAgIGNhc2UgJDEgaW4KKyAgICAgICAgICAgIC0tZW5hYmxlLWNsdXN0ZXIpCisgICAgICAgICAgICAgICAgTE9DS0lOR19UWVBFPTIKKyAgICAgICAgICAgICAgICBzaGlmdAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAtLWRpc2FibGUtY2x1c3RlcikKKyAgICAgICAgICAgICAgICBMT0NLSU5HX1RZUEU9MQorICAgICAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tbG9ja2luZ2xpYmRpcikKKyAgICAgICAgICAgICAgICBpZiBbIC1uICIkMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBMT0NLSU5HTElCRElSPSQyCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzYWdlCisgICAgICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tbG9ja2luZ2xpYikKKyAgICAgICAgICAgICAgICBpZiBbIC1uICIkMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBMT0NLSU5HTElCPSQyCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzYWdlCisgICAgICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIC0tZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBbIC1uICIkMiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBDT05GSUdGSUxFPSQyCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0IDIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVzYWdlCisgICAgICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgdXNhZ2UKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZXNhYworICAgIGRvbmUKK30KKworZnVuY3Rpb24gdmFsaWRhdGVfYXJncworeworICAgIFsgLXogIiRDT05GSUdGSUxFIiBdICYmIENPTkZJR0ZJTEU9Ii9ldGMvbHZtL2x2bS5jb25mIgorCisgICAgaWYgWyAhIC1mICIkQ09ORklHRklMRSIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiJENPTkZJR0ZJTEUgZG9lcyBub3QgZXhpc3QiCisgICAgICAgICAgICBleGl0IDEwCisgICAgZmkKKworICAgIGlmIFsgLXogIiRMT0NLSU5HX1RZUEUiIF0gJiYgWyAteiAiJExPQ0tJTkdMSUJESVIiIF07IHRoZW4KKyAgICAgICAgdXNhZ2UKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIFsgLW4gIiRMT0NLSU5HTElCRElSIiBdOyB0aGVuCisKKyAgICAgICAgWyAteiAiJExPQ0tJTkdMSUIiIF0gJiYgTE9DS0lOR0xJQj0ibGlibHZtMmNsdXN0ZXJsb2NrLnNvIgorICAgICAgICAgICAgCisgICAgICAgIGlmIFsgIiR7TE9DS0lOR0xJQkRJUjowOjF9IiAhPSAiLyIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiUHJlZml4IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCBuYW1lIChzdGFydGluZyB3aXRoIGEgLykiCisgICAgICAgICAgICBleGl0IDEyCisgICAgICAgIGZpCisgICAgCisgICAgICAgIGlmIFsgISAtZiAiJExPQ0tJTkdMSUJESVIvJExPQ0tJTkdMSUIiIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiRMT0NLSU5HTElCRElSLyRMT0NLSU5HTElCIGRvZXMgbm90IGV4aXN0LCBkaWQgeW91IGRvIGEgXCJtYWtlIGluc3RhbGxcIiA/IgorICAgICAgICAgICAgZXhpdCAxMQorICAgICAgICBmaQorICAgICAgICAKKyAgICBmaQorCisgICAgaWYgWyAiJExPQ0tJTkdfVFlQRSIgPSAiMSIgXSAmJiBbIC1uICIkTE9DS0lOR0xJQkRJUiIgLW8gLW4gIiRMT0NLSU5HTElCIiBdOyB0aGVuCisJZWNobyAiU3VwZXJmbHVvdXMgbG9ja2luZyBsaWIgcGFyYW1ldGVyLCBpZ25vcmluZyIKKyAgICBmaQorfQorCit1bWFzayAwMDc3CisKK3BhcnNlX2FyZ3MgIiRAIgorCit2YWxpZGF0ZV9hcmdzCisKKworU0NSSVBURklMRT0vZXRjL2x2bS8ubHZtY29uZi1zY3JpcHQudG1wCitUTVBGSUxFPS9ldGMvbHZtLy5sdm1jb25mLXRtcC50bXAKKworCisjIEZsYWdzIHNvIHdlIGtub3cgd2hpY2ggcGFydHMgb2YgdGhlIGZpbGUgd2UgY2FuIHJlcGxhY2UgYW5kIHdoaWNoIG5lZWQKKyMgYWRkaW5nLiBUaGVzZSBhcmUgcmV0dXJuIGNvZGVzIGZyb20gZ3JlcCwgc28gemVybyBtZWFucyBpdCBJUyBwcmVzZW50IQoraGF2ZV90eXBlPTEKK2hhdmVfZGlyPTEKK2hhdmVfbGlicmFyeT0xCitoYXZlX2dsb2JhbD0xCisKK2dyZXAgLXEgJ15bWzpibGFuazpdXSpsb2NraW5nX3R5cGVbWzpibGFuazpdXSo9JyAkQ09ORklHRklMRQoraGF2ZV90eXBlPSQ/CisKK2dyZXAgLXEgJ15bWzpibGFuazpdXSpsaWJyYXJ5X2RpcltbOmJsYW5rOl1dKj0nICRDT05GSUdGSUxFCitoYXZlX2Rpcj0kPworCitncmVwIC1xICdeW1s6Ymxhbms6XV0qbG9ja2luZ19saWJyYXJ5W1s6Ymxhbms6XV0qPScgJENPTkZJR0ZJTEUKK2hhdmVfbGlicmFyeT0kPworCisjIFRob3NlIG9wdGlvbnMgYXJlIGluIHNlY3Rpb24gImdsb2JhbCB7IiBzbyB3ZSBtdXN0IGhhdmUgb25lIGlmIGFueSBhcmUgcHJlc2VudC4KK2lmIFsgIiRoYXZlX3R5cGUiID0gIjAiIC1vICIkaGF2ZV9kaXIiID0gIjAiIC1vICIkaGF2ZV9saWJyYXJ5IiA9ICIwIiBdCit0aGVuCisKKyAgICAjIFNlZSBpZiB3ZSBjYW4gZmluZCBpdC4uLgorICAgIGdyZXAgLXEgJ15bWzpibGFuazpdXSpnbG9iYWxbWzpibGFuazpdXSp7JyAkQ09ORklHRklMRQorICAgIGhhdmVfZ2xvYmFsPSQ/CisgICAgCisgICAgaWYgWyAiJGhhdmVfZ2xvYmFsIiA9ICIxIiBdIAorCXRoZW4KKwllY2hvICJnbG9iYWwga2V5cyBidXQgbm8gJ2dsb2JhbCB7JyBmb3VuZCwgY2FuJ3QgZWRpdCBmaWxlIgorCWV4aXQgMTMKKyAgICBmaQorZmkKKworaWYgWyAiJExPQ0tJTkdfVFlQRSIgPSAiMiIgXSAmJiBbIC16ICIkTE9DS0lOR0xJQkRJUiIgXSAmJiBbICIkaGF2ZV9kaXIiID0gIjEiIF07IHRoZW4KKwllY2hvICJubyBsaWJyYXJ5X2RpciBzcGVjaWZpZWQgaW4gJENPTkZJR0ZJTEUiCisJZXhpdCAxNgorZmkKKworIyBTbyBpZiB3ZSBkb24ndCBoYXZlICJnbG9iYWwgeyIgd2UgbmVlZCB0byBjcmVhdGUgb25lIGFuZCAKKyMgcG9wdWxhdGUgaXQKKworaWYgWyAiJGhhdmVfZ2xvYmFsIiA9ICIxIiBdCit0aGVuCisgICAgaWYgWyAteiAiJExPQ0tJTkdfVFlQRSIgXTsgdGhlbgorCUxPQ0tJTkdfVFlQRT0xCisgICAgZmkKKyAgICBpZiBbICIkTE9DS0lOR19UWVBFIiA9ICIyIiBdOyB0aGVuCisgICAgICAgIGNhdCAkQ09ORklHRklMRSAtIDw8RU9GID4gJFRNUEZJTEUKK2dsb2JhbCB7CisgICAgIyBFbmFibGUgbG9ja2luZyBmb3IgY2x1c3RlciBMVk0KKyAgICBsb2NraW5nX3R5cGUgPSAkTE9DS0lOR19UWVBFCisgICAgbGlicmFyeV9kaXIgPSAiJExPQ0tJTkdMSUJESVIiCisgICAgbG9ja2luZ19saWJyYXJ5ID0gIiRMT0NLSU5HTElCIgorfQorRU9GCisgICAgZmkgIyBpZiB3ZSBhcmVuJ3Qgc2V0dGluZyBjbHVzdGVyIGxvY2tpbmcsIHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgZ2xvYmFsIHNlY3Rpb24KKworICAgIGlmIFsgJD8gIT0gMCBdCisgICAgdGhlbgorCWVjaG8gImZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlLCAkQ09ORklHRklMRSBub3QgdXBkYXRlZCIKKwlleGl0IDE0CisgICAgZmkKK2Vsc2UKKyAgICAjCisgICAgIyBXZSBoYXZlIGEgImdsb2JhbCB7IiBzZWN0aW9uLCBzbyBhZGQgb3IgcmVwbGFjZSB0aGUKKyAgICAjIGxvY2tpbmcgZW50cmllcyBhcyBhcHByb3ByaWF0ZQorICAgICMKKworICAgIGlmIFsgLW4gIiRMT0NLSU5HX1RZUEUiIF07IHRoZW4KKwlpZiBbICIkaGF2ZV90eXBlIiA9ICIwIiBdIAorCXRoZW4KKwkgICAgU0VEQ01EPSIgcy9eW1s6Ymxhbms6XV0qbG9ja2luZ190eXBlW1s6Ymxhbms6XV0qPS4qL1wgXCBcIFwgbG9ja2luZ190eXBlID0gJExPQ0tJTkdfVFlQRS9nIgorCWVsc2UKKwkgICAgU0VEQ01EPSIgL2dsb2JhbFtbOmJsYW5rOl1dKnsvYVwgXCBcIFwgbG9ja2luZ190eXBlID0gJExPQ0tJTkdfVFlQRSIKKwlmaQorICAgIGZpCisgICAgCisgICAgaWYgWyAtbiAiJExPQ0tJTkdMSUJESVIiIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJGhhdmVfZGlyIiA9ICIwIiBdIAorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgU0VEQ01EPSIke1NFRENNRH1cbnMnXltbOmJsYW5rOl1dKmxpYnJhcnlfZGlyW1s6Ymxhbms6XV0qPS4qJ1wgXCBcIFwgbGlicmFyeV9kaXIgPSBcIiRMT0NLSU5HTElCRElSXCInZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU0VEQ01EPSIke1NFRENNRH1cbi9nbG9iYWxbWzpibGFuazpdXSp7L2FcIFwgXCBcIGxpYnJhcnlfZGlyID0gXCIkTE9DS0lOR0xJQkRJUlwiIgorICAgICAgICBmaQorCisgICAgICAgIGlmIFsgIiRoYXZlX2xpYnJhcnkiID0gIjAiIF0gCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxucy9eW1s6Ymxhbms6XV0qbG9ja2luZ19saWJyYXJ5W1s6Ymxhbms6XV0qPS4qL1wgXCBcIFwgbG9ja2luZ19saWJyYXJ5ID0gXCIkTE9DS0lOR0xJQlwiL2ciCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNFRENNRD0iJHtTRURDTUR9XG4vZ2xvYmFsW1s6Ymxhbms6XV0qey9hXCBcIFwgXCBsb2NraW5nX2xpYnJhcnkgPSBcIiRMT0NLSU5HTElCXCIiCisgICAgICAgIGZpCisgICAgZmkKKworICAgIGlmIFsgIiRMT0NLSU5HX1RZUEUiID0gIjEiIF07IHRoZW4KKyAgICAgICAgIyBpZiB3ZSdyZSBub3QgdXNpbmcgY2x1c3RlciBsb2NraW5nLCByZW1vdmUgdGhlIGxpYnJhcnkgZGlyIGFuZCBsb2NraW5nIGxpYnJhcnkgbmFtZQorICAgICAgICBpZiBbICIkaGF2ZV9kaXIiID0gIjAiIF0gCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxuL15bWzpibGFuazpdXSpsaWJyYXJ5X2RpcltbOmJsYW5rOl1dKj0uKi9kIgorICAgICAgICBmaQorCisgICAgICAgIGlmIFsgIiRoYXZlX2xpYnJhcnkiID0gIjAiIF0gCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICBTRURDTUQ9IiR7U0VEQ01EfVxuL15bWzpibGFuazpdXSpsb2NraW5nX2xpYnJhcnlbWzpibGFuazpdXSo9LiovZCIKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgZWNobyAtZSAkU0VEQ01EID4gJFNDUklQVEZJTEUKKyAgICBzZWQgIDwkQ09ORklHRklMRSA+JFRNUEZJTEUgLWYgJFNDUklQVEZJTEUKKyAgICBpZiBbICQ/ICE9IDAgXQorICAgIHRoZW4KKwllY2hvICJzZWQgZmFpbGVkLCAkQ09ORklHRklMRSBub3QgdXBkYXRlZCIKKwlleGl0IDE1CisgICAgZmkKK2ZpCisKKyMgTm93IHdlIGhhdmUgYSBzdWl0YWJseSBlZGl0dGVkIGNvbmZpZyBmaWxlIGluIGEgdGVtcCBwbGFjZSwKKyMgYmFja3VwIHRoZSBvcmlnaW5hbCBhbmQgY29weSBvdXIgbmV3IG9uZSBpbnRvIHBsYWNlLgorCitjcCAkQ09ORklHRklMRSAkQ09ORklHRklMRS5sdm1jb25mb2xkCitpZiBbICQ/ICE9IDAgXQorICAgIHRoZW4KKyAgICBlY2hvICJmYWlsZWQgdG8gYmFja3VwIG9sZCBjb25maWcgZmlsZSwgJENPTkZJR0ZJTEUgbm90IHVwZGF0ZWQiCisgICAgZXhpdCAyCitmaQorCitjcCAkVE1QRklMRSAkQ09ORklHRklMRQoraWYgWyAkPyAhPSAwIF0KKyAgICB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGNvcHkgbmV3IGNvbmZpZyBmaWxlIGludG8gcGxhY2UsIGNoZWNrICRDT05GSUdGSUxFIGlzIHN0aWxsIE9LIgorICAgIGV4aXQgMworZmkKKworcm0gLWYgJFNDUklQVEZJTEUgJFRNUEZJTEUKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHZtZHVtcC5zaCBiL3NjcmlwdHMvbHZtZHVtcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTNhNjliCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sdm1kdW1wLnNoCkBAIC0wLDAgKzEsMzQ5IEBACisjIS9iaW4vYmFzaAorIyBXZSB1c2Ugc29tZSBiYXNoLWlzbXMgKGdldG9wdHM/KQorCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBsdm1fZHVtcDogVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBjb2xsZWN0IHBlcnRpbmVudCBpbmZvcm1hdGlvbiBmb3IKKyMgICAgICAgICAgIHRoZSBkZWJ1Z2dpbmcgb2YgbHZtIGlzc3Vlcy4KKworIyBmb2xsb3dpbmcgZXh0ZXJuYWwgY29tbWFuZHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgc2NyaXB0CisjIGVjaG8gYW5kIHRlc3QgYXJlIGludGVybmFsIGluIGJhc2ggYXQgbGVhc3QKK01LRElSPW1rZGlyICMgbmVlZCAtcAorVEFSPXRhciAjIG5lZWQgY3pmCitSTT1ybSAjIG5lZWQgLXJmCitDUD1jcAorVEFJTD10YWlsICMgd2UgbmVlZCAtbgorTFM9bHMgIyBuZWVkIC1sYQorUFM9cHMgIyBuZWVkIGFseAorU0VEPXNlZAorREQ9ZGQKK0NVVD1jdXQKK0RBVEU9ZGF0ZQorQkFTRU5BTUU9YmFzZW5hbWUKK1VERVZBRE09dWRldmFkbQorVU5BTUU9dW5hbWUKK1RSPXRyCitTT0NBVD1zb2NhdCAjIGVpdGhlciBzb2NhdCBvciBuYyBpcyBuZWVkZWQgZm9yIGR1bXBpbmcgbHZtZXRhZCBzdGF0ZQorTkM9bmMKKworIyB1c2VyIG1heSBvdmVycmlkZSBsdm0gYW5kIGRtc2V0dXAgbG9jYXRpb24gYnkgc2V0dGluZyBMVk1fQklOQVJZCisjIGFuZCBETVNFVFVQX0JJTkFSWSByZXNwZWN0aXZlbHkKK0xWTT0ke0xWTV9CSU5BUlktbHZtfQorRE1TRVRVUD0ke0RNU0VUVVBfQklOQVJZLWRtc2V0dXB9CitMVk1FVEFEX1NPQ0tFVD0ke0xWTV9MVk1FVEFEX1NPQ0tFVC0vdmFyL3J1bi9sdm0vbHZtZXRhZC5zb2NrZXR9CitMVk1QT0xMRF9TT0NLRVQ9JHtMVk1fTFZNUE9MTERfU09DS0VULS92YXIvcnVuL2x2bS9sdm1wb2xsZC5zb2NrZXR9CisKK2RpZSgpIHsKKyAgICBjb2RlPSQxOyBzaGlmdAorICAgIGVjaG8gIiRAIiAxPiYyCisgICAgZXhpdCAkY29kZQorfQorCisiJExWTSIgdmVyc2lvbiA+JiAvZGV2L251bGwgfHwgZGllIDIgIkNvdWxkIG5vdCBydW4gbHZtIGJpbmFyeSAnJExWTSciCisiJERNU0VUVVAiIHZlcnNpb24gPiYgL2Rldi9udWxsIHx8IERNU0VUVVA9OgorCitmdW5jdGlvbiB1c2FnZSB7CisJZWNobyAiJDAgW29wdGlvbnNdIgorCWVjaG8gIiAgICAtaCBwcmludCB0aGlzIG1lc3NhZ2UiCisJZWNobyAiICAgIC1hIGFkdmFuY2VkIGNvbGxlY3Rpb24gLSB3YXJuaW5nOiBpZiBsdm0gaXMgYWxyZWFkeSBodW5nLCIKKwllY2hvICIgICAgICAgdGhlbiB0aGlzIHNjcmlwdCBtYXkgaGFuZyBhcyB3ZWxsIGlmIC1hIGlzIHVzZWQiCisJZWNobyAiICAgIC1jIGlmIHJ1bm5pbmcgY2x2bWQsIGdhdGhlciBjbHVzdGVyIGRhdGEgYXMgd2VsbCIKKwllY2hvICIgICAgLWQgPGRpcmVjdG9yeT4gZHVtcCBpbnRvIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGFyYmFsbCIKKwllY2hvICIgICAgLWwgZ2F0aGVyIGx2bWV0YWQgc3RhdGUgaWYgcnVubmluZyIKKwllY2hvICIgICAgLXAgZ2F0aGVyIGx2bXBvbGxkIHN0YXRlIGlmIHJ1bm5pbmciCisJZWNobyAiICAgIC1tIGdhdGhlciBMVk0gbWV0YWRhdGEgZnJvbSB0aGUgUFZzIgorCWVjaG8gIiAgICAtcyBnYXRoZXIgc3lzdGVtIGluZm8gYW5kIGNvbnRleHQiCisJZWNobyAiICAgIC11IGdhdGhlciB1ZGV2IGluZm8gYW5kIGNvbnRleHQiCisJZWNobyAiIgorCisJZXhpdCAxCit9CisKK2FkdmFuY2VkPTAKK2NsdXN0ZXJlZD0wCittZXRhZGF0YT0wCitzeXNyZXBvcnQ9MAordWRldj0wCit3aGlsZSBnZXRvcHRzIDphY2Q6aGxwbXVzIG9wdDsgZG8KKwljYXNlICRvcHQgaW4gCisJCWEpCWFkdmFuY2VkPTEgOzsKKwkJYykJY2x1c3RlcmVkPTEgOzsKKwkJZCkJdXNlcmRpcj0kT1BUQVJHIDs7CisJCWgpCXVzYWdlIDs7CisJCWwpCWx2bWV0YWQ9MSA7OworCQlwKQlsdm1wb2xsZD0xIDs7CisJCW0pCW1ldGFkYXRhPTEgOzsKKwkJcykgICAgICBzeXNyZXBvcnQ9MSA7OworCQl1KQl1ZGV2PTEgOzsKKwkJOikJZWNobyAiJDA6ICRPUFRBUkcgcmVxdWlyZXMgYSB2YWx1ZToiOyB1c2FnZSA7OworCQlcPykgICAgIGVjaG8gIiQwOiB1bmtub3duIG9wdGlvbiAkT1BUQVJHIjsgdXNhZ2UgOzsKKwkJKikJdXNhZ2UgOzsKKwllc2FjCitkb25lCisKK05PVz1gJERBVEUgLXUgKyVHJW0lZCVrJU0lUyB8ICRUUiAtZCAnICdgCitpZiB0ZXN0IC1uICIkdXNlcmRpciI7IHRoZW4KKwlkaXI9IiR1c2VyZGlyIgorZWxzZQorCWRpcmJhc2U9Imx2bWR1bXAtJEhPU1ROQU1FLSROT1ciCisJZGlyPSIkSE9NRS8kZGlyYmFzZSIKK2ZpCisKK2lmIHRlc3QgLWQgJGRpciA7IHRoZW4KKwkoc2hvcHQgLXMgbnVsbGdsb2IgZG90Z2xvYjsgdGVzdCAtciAkZGlyIC1hIC13ICRkaXIgLWEgLXggJGRpciAmJiBjZCAkZGlyICYmIGZpbGVzPSgqKSAmJiAoKCEgJHsjZmlsZXNbQF19KSkpIHx8IFwKKwkJZGllIDUgIkZhdGFsOiBkaXJlY3RvcnkgJGRpciBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5IG9yIGluYWNjZXNzaWJsZSIKK2Vsc2UKKwl0ZXN0IC1lICRkaXIgJiYgZGllIDMgIkZhdGFsOiAkZGlyIGFscmVhZHkgZXhpc3RzIgorCSRNS0RJUiAtcCAkZGlyIHx8IGRpZSA0ICJGYXRhbDogY291bGQgbm90IGNyZWF0ZSAkZGlyIgorZmkKKworbG9nPSIkZGlyL2x2bWR1bXAubG9nIgorCitteWVjaG8oKSB7CisJZWNobyAiJEAiCisJZWNobyAiJEAiID4+ICIkbG9nIgorfQorCitsb2coKSB7CisJZWNobyAiJEAiID4+ICIkbG9nIgorCWV2YWwgIiRAIgorfQorCit3YXJuaW5ncygpIHsKKwlpZiB0ZXN0ICIkVUlEIiAhPSAiMCIgJiYgdGVzdCAiJEVVSUQiICE9ICIwIjsgdGhlbgorCQlteWVjaG8gIldBUk5JTkchIFJ1bm5pbmcgYXMgbm9uLXByaXZpbGVnZWQgdXNlciwgZHVtcCBpcyBsaWtlbHkgaW5jb21wbGV0ZSEiCisJZWxpZiB0ZXN0ICIkRE1TRVRVUCIgPSAiOiI7IHRoZW4KKwkJbXllY2hvICJXQVJOSU5HISBDb3VsZCBub3QgcnVuIGRtc2V0dXAsIGR1bXAgaXMgbGlrZWx5IGluY29tcGxldGUuIgorCWZpCit9CisKK3dhcm5pbmdzCisKK215ZWNobyAiQ3JlYXRpbmcgZHVtcCBkaXJlY3Rvcnk6ICRkaXIiCitlY2hvICIgIgorCitpZiAoKCAkYWR2YW5jZWQgKSk7IHRoZW4KKwlteWVjaG8gIkdhdGhlcmluZyBMVk0gdm9sdW1lIGluZm8uLi4iCisKKwlteWVjaG8gIiAgdmdzY2FuLi4uIgorCWxvZyAiXCIkTFZNXCIgdmdzY2FuIC12dnZ2ID4+IFwiJGRpci92Z3NjYW5cIiAyPiYxIgorCisJbXllY2hvICIgIHB2c2Nhbi4uLiIKKwlsb2cgIlwiJExWTVwiIHB2c2NhbiAtdiA+PiBcIiRkaXIvcHZzY2FuXCIgMj4+IFwiJGxvZ1wiIgorCisJbXllY2hvICIgIGx2cy4uLiIKKwlsb2cgIlwiJExWTVwiIGx2cyAtYSAtSCAtbyArZGV2aWNlcyxrZXJuZWxfbWFqb3Isa2VybmVsX21pbm9yID4+IFwiJGRpci9sdnNcIiAyPj4gXCIkbG9nXCIiCisKKwlteWVjaG8gIiAgcHZzLi4uIgorCWxvZyAiXCIkTFZNXCIgcHZzIC1hIC1vICttYWpvcixtaW5vciAtdiA+PiBcIiRkaXIvcHZzXCIgMj4+IFwiJGxvZ1wiIgorCisJbXllY2hvICIgIHZncy4uLiIKKwlsb2cgIlwiJExWTVwiIHZncyAtdiA+PiBcIiRkaXIvdmdzXCIgMj4+IFwiJGxvZ1wiIgorZmkKKworaWYgKCggJGNsdXN0ZXJlZCApKTsgdGhlbgorCW15ZWNobyAiR2F0aGVyaW5nIGNsdXN0ZXIgaW5mby4uLiIKKworCXsKKwlmb3IgaSBpbiBub2RlcyBzdGF0dXMgc2VydmljZXM7IGRvCisJCWNhcF9pPSQoZWNobyAkaXx0ciBhLXogQS1aKQorCQlwcmludGYgIiRjYXBfaTpcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJbG9nICJjbWFuX3Rvb2wgJGkgMj4+IFwiJGxvZ1wiIgorCQllY2hvCisJZG9uZQorCisJZWNobyAiTE9DS1M6IgorCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJaWYgWyAtZiAvcHJvYy9jbHVzdGVyL2RsbV9sb2NrcyBdCisJdGhlbgorCQllY2hvIGNsdm1kID4gL3Byb2MvY2x1c3Rlci9kbG1fbG9ja3MKKwkJY2F0IC9wcm9jL2NsdXN0ZXIvZGxtX2xvY2tzCisJCWVjaG8KKwkJZWNobyAiUkVTT1VSQ0UgRElSOiIKKwkJY2F0IC9wcm9jL2NsdXN0ZXIvZGxtX2RpcgorCQllY2hvCisJCWVjaG8gIkRFQlVHIExPRzoiCisJCWNhdCAvcHJvYy9jbHVzdGVyL2RsbV9kZWJ1ZworCQllY2hvCisJZmkKKwlpZiBbIC1mIC9kZWJ1Zy9kbG0vY2x2bWQgXQorCXRoZW4KKwkJY2F0IC9kZWJ1Zy9kbG0vY2x2bWQKKwkJZWNobworCQllY2hvICJXQUlURVJTOiIKKwkJY2F0IC9kZWJ1Zy9kbG0vY2x2bWRfd2FpdGVycworCQllY2hvCisJCWVjaG8gIk1BU1RFUjoiCisJCWNhdCAvZGVidWcvZGxtL2Nsdm1kX21hc3RlcgorCWZpCisJfSA+PiAkZGlyL2NsdXN0ZXJfaW5mbworZmkKKworbXllY2hvICJHYXRoZXJpbmcgTFZNICYgZGV2aWNlLW1hcHBlciB2ZXJzaW9uIGluZm8uLi4iCitlY2hvICJMVk0gVkVSU0lPTjoiID4+ICIkZGlyL3ZlcnNpb25zIgorIiRMVk0iIGx2cyAtLXZlcnNpb24gPj4gIiRkaXIvdmVyc2lvbnMiIDI+PiAiJGxvZyIKK2VjaG8gIkRFVklDRSBNQVBQRVIgVkVSU0lPTjoiID4+ICIkZGlyL3ZlcnNpb25zIgorIiRETVNFVFVQIiAtLXZlcnNpb24gPj4gIiRkaXIvdmVyc2lvbnMiIDI+PiAiJGxvZyIKK2VjaG8gIktFUk5FTCBWRVJTSU9OOiIgPj4gIiRkaXIvdmVyc2lvbnMiCisiJFVOQU1FIiAtYSA+PiAiJGRpci92ZXJzaW9ucyIgMj4+ICIkbG9nIgorZWNobyAiRE0gVEFSR0VUUyBWRVJTSU9OUzoiID4+ICIkZGlyL3ZlcnNpb25zIgorIiRETVNFVFVQIiB0YXJnZXRzID4+ICIkZGlyL3ZlcnNpb25zIiAyPj4gIiRsb2ciCisKK215ZWNobyAiR2F0aGVyaW5nIGRtc2V0dXAgaW5mby4uLiIKK2xvZyAiXCIkRE1TRVRVUFwiIGluZm8gLWMgPj4gXCIkZGlyL2Rtc2V0dXBfaW5mb1wiIDI+PiBcIiRsb2dcIiIKK2xvZyAiXCIkRE1TRVRVUFwiIHRhYmxlID4+IFwiJGRpci9kbXNldHVwX3RhYmxlXCIgMj4+IFwiJGxvZ1wiIgorbG9nICJcIiRETVNFVFVQXCIgc3RhdHVzID4+IFwiJGRpci9kbXNldHVwX3N0YXR1c1wiIDI+PiBcIiRsb2dcIiIKKworIyBjYXQgYXMgd29ya2Fyb3VuZCB0byBhdm9pZCB0dHkgaW9jdGwgKHNlbGludXgpCitsb2cgIlwiJERNU0VUVVBcIiBscyAtLXRyZWUgMj4+IFwiJGxvZ1wiIHwgY2F0ID4+IFwiJGRpci9kbXNldHVwX2xzX3RyZWVcIiIKKworbXllY2hvICJHYXRoZXJpbmcgcHJvY2VzcyBpbmZvLi4uIgorbG9nICIkUFMgYWx4ID4+IFwiJGRpci9wc19pbmZvXCIgMj4+IFwiJGxvZ1wiIgorCitteWVjaG8gIkdhdGhlcmluZyBjb25zb2xlIG1lc3NhZ2VzLi4uIgorbG9nICIkVEFJTCAtbiA3NSAvdmFyL2xvZy9tZXNzYWdlcyA+PiBcIiRkaXIvbWVzc2FnZXNcIiAyPj4gXCIkbG9nXCIiCisKK215ZWNobyAiR2F0aGVyaW5nIC9ldGMvbHZtIGluZm8uLi4iCitsb2cgIiRMUyAtbGFSIC9ldGMvbHZtID4+IFwiJGRpci9ldGNfbHZtX2xpc3RpbmdcIiAyPj4gXCIkbG9nXCIiCitsb2cgIiRDUCAtUkwgLS1wcmVzZXJ2ZT1hbGwgL2V0Yy9sdm0gXCIkZGlyL2x2bVwiIDI+PiBcIiRsb2dcIiIKK2xvZyAiJExWTSBkdW1wY29uZmlnIC0tdHlwZSBkaWZmIC0tZmlsZSBcIiRkaXIvY29uZmlnX2RpZmZcIiAyPj4gXCIkbG9nXCIiCitsb2cgIiRMVk0gZHVtcGNvbmZpZyAtLXR5cGUgbWlzc2luZyAtLWZpbGUgXCIkZGlyL2NvbmZpZ19taXNzaW5nXCIgMj4+IFwiJGxvZ1wiIgorCitteWVjaG8gIkdhdGhlcmluZyAvZGV2IGxpc3RpbmcuLi4iCitsb2cgIiRMUyAtbGFSIC9kZXYgPj4gXCIkZGlyL2Rldl9saXN0aW5nXCIgMj4+IFwiJGxvZ1wiIgorCitteWVjaG8gIkdhdGhlcmluZyAvc3lzL2Jsb2NrIGxpc3RpbmcuLi4iCitsb2cgIiRMUyAtbGFSIC9zeXMvYmxvY2sgPj4gXCIkZGlyL3N5c2Jsb2NrX2xpc3RpbmdcIiAgMj4+IFwiJGxvZ1wiIgorbG9nICIkTFMgLWxhUiAvc3lzL2RldmljZXMvdmlydHVhbC9ibG9jayA+PiBcIiRkaXIvc3lzYmxvY2tfbGlzdGluZ1wiICAyPj4gXCIkbG9nXCIiCisKK2lmICgoICRtZXRhZGF0YSApKTsgdGhlbgorCW15ZWNobyAiR2F0aGVyaW5nIExWTSBtZXRhZGF0YSBmcm9tIFBoeXNpY2FsIFZvbHVtZXMuLi4iCisKKwlsb2cgIiRNS0RJUiAtcCBcIiRkaXIvbWV0YWRhdGFcIiIKKworCXB2cz0iJCgiJExWTSIgcHZzIC0tc2VwYXJhdG9yICwgLS1ub2hlYWRpbmdzIC0tdW5pdHMgcyAtLW5vc3VmZml4IC1vIFwKKwkgICAgbmFtZSxwZV9zdGFydCAyPj4gIiRsb2ciIHwgJFNFRCAtZSAncy9eICovLycpIgorCWZvciBsaW5lIGluICRwdnMKKwlkbworCQl0ZXN0IC16ICIkbGluZSIgJiYgY29udGludWUKKwkJcHY9IiQoZWNobyAkbGluZSB8ICRDVVQgLWQsIC1mMSkiCisJCXBlX3N0YXJ0PSIkKGVjaG8gJGxpbmUgfCAkQ1VUIC1kLCAtZjIpIgorCQluYW1lPSIkKCRCQVNFTkFNRSAiJHB2IikiCisJCW15ZWNobyAiICAkcHYiCisJCWxvZyAiJEREIGlmPSRwdiBcIm9mPSRkaXIvbWV0YWRhdGEvJG5hbWVcIiBicz01MTIgY291bnQ9JHBlX3N0YXJ0IDI+PiBcIiRsb2dcIiIKKwlkb25lCitmaQorCitpZiAoKCAkc3lzcmVwb3J0ICkpOyB0aGVuCisJbXllY2hvICJHYXRoZXJpbmcgc3lzdGVtIGluZm8uLi4iCisKKwlzeXNyZXBvcnRfZGlyPSIkZGlyL3N5c3JlcG9ydCIKKwlsb2dfbGluZXM9MTAwMDAKKworCVNZU1RFTUNUTD0kKHdoaWNoIHN5c3RlbWN0bCAyPj4gJGxvZykKKwlKT1VSTkFMQ1RMPSQod2hpY2ggam91cm5hbGN0bCAyPj4gJGxvZykKKwlMU0JMSz0kKHdoaWNoIGxzYmxrIDI+PiAkbG9nKQorCisJbG9nICIkTUtESVIgLXAgXCIkc3lzcmVwb3J0X2RpclwiIgorCisJaWYgdGVzdCAteiAiTFNCTEsiOyB0aGVuCisJCW15ZWNobyAiV0FSTklORzogbHNibGsgbm90IGZvdW5kIgorCWVsc2UKKwkJbG9nICIkTFNCTEsgLU8gPj4gXCIkc3lzcmVwb3J0X2Rpci9sc2Jsa1wiIgorCQlsb2cgIiRMU0JMSyAtcyA+PiBcIiRzeXNyZXBvcnRfZGlyL2xzYmxrX3NcIiIKKwlmaQorCisJaWYgdGVzdCAteiAiJFNZU1RFTUNUTCI7IHRoZW4KKwkJbXllY2hvICJXQVJOSU5HOiBzeXN0ZW1jdGwgbm90IGZvdW5kIgorCWVsaWYgdGVzdCAteiAiJEpPVVJOQUxDVEwiOyB0aGVuCisJCW15ZWNobyAiV0FSTklORzogam91cm5hbGN0bCBub3QgZm91bmQiCisJZWxzZQorCQlsb2cgIiRKT1VSTkFMQ1RMIC1iIC0tbm8tcGFnZXIgLW8gc2hvcnQtcHJlY2lzZSA+IFwiJHN5c3JlcG9ydF9kaXIvam91cm5hbF9jb250ZW50XCIgMj4+IFwiJGxvZ1wiIgorCQlsb2cgIiRTWVNURU1DVEwgc3RhdHVzIC1sIC0tbm8tcGFnZXIgLW4gJGxvZ19saW5lcyAtbyBzaG9ydC1wcmVjaXNlIGRtLWV2ZW50LnNvY2tldCBkbS1ldmVudC5zZXJ2aWNlIFwKKwkJCQkJCSAgIGx2bTItbW9uaXRvci5zZXJ2aWNlIFwKKwkJCQkJCSAgIGx2bTItbHZtZXRhZC5zb2NrZXQgbHZtMi1sdm1ldGFkLnNlcnZpY2UgXAorCQkJCQkJICAgbHZtMi1sdm1wb2xsZC5zb2NrZXQgbHZtMi1sdm1wb2xsZC5zZXJ2aWNlIFwKKwkJCQkJCSAgIGx2bTItY2x1c3Rlci1hY3RpdmF0aW9uLnNlcnZpY2UgXAorCQkJCQkJICAgbHZtMi1jbHZtZC5zZXJ2aWNlIFwKKwkJCQkJCSAgIGx2bTItY21pcnJvcmQuc2VydmljZSBcCisJCQkJCQkgICBsdm0yLWFjdGl2YXRpb24tZWFybHkuc2VydmljZSBcCisJCQkJCQkgICBsdm0yLWFjdGl2YXRpb24uc2VydmljZSBcCisJCQkJCQkgICBsdm0yLWFjdGl2YXRpb24tbmV0LnNlcnZpY2UgXAorCQkJCQkJICAgPiBcIiRzeXNyZXBvcnRfZGlyL3N5c3RlbWRfbHZtMl9zZXJ2aWNlc19zdGF0dXNcIiAyPj4gXCIkbG9nXCIiCisJCWxvZyAiJFNZU1RFTUNUTCBsaXN0LXVuaXRzIC1sIC1hIC0tbm8tbGVnZW5kIC0tbm8tcGFnZXIgPiBcIiRzeXNyZXBvcnRfZGlyL3N5c3RlbWRfdW5pdF9saXN0XCIgMj4+IFwiJGxvZ1wiIgorCQlmb3IgdW5pdCBpbiAkKGNhdCAkc3lzcmVwb3J0X2Rpci9zeXN0ZW1kX3VuaXRfbGlzdCB8IGdyZXAgbHZtMi1wdnNjYW4gfCBjdXQgLWQgIiAiIC1mIDEpOyBkbworCQkJbG9nICIkU1lTVEVNQ1RMIHN0YXR1cyAtbCAtLW5vLXBhZ2VyIC1uICRsb2dfbGluZXMgLW8gc2hvcnQtcHJlY2lzZSAkdW5pdCA+PiBcIiRzeXNyZXBvcnRfZGlyL3N5c3RlbWRfbHZtMl9wdnNjYW5fc2VydmljZV9zdGF0dXNcIiIKKwkJZG9uZQorCWZpCitmaQorCitpZiAoKCAkdWRldiApKTsgdGhlbgorCW15ZWNobyAiR2F0aGVyaW5nIHVkZXYgaW5mby4uLiIKKworCXVkZXZfZGlyPSIkZGlyL3VkZXYiCisKKwlsb2cgIiRNS0RJUiAtcCBcIiR1ZGV2X2RpclwiIgorCWxvZyAiJFVERVZBRE0gaW5mbyAtLXZlcnNpb24gPj4gXCIkdWRldl9kaXIvdmVyc2lvblwiIDI+PiBcIiRsb2dcIiIKKwlsb2cgIiRVREVWQURNIGluZm8gLS1leHBvcnQtZGIgPj4gXCIkdWRldl9kaXIvZGJcIiAyPj4gXCIkbG9nXCIiCisJbG9nICIkQ1AgLWEgL2V0Yy91ZGV2L3VkZXYuY29uZiBcIiR1ZGV2X2Rpci9jb25mXCIgMj4+IFwiJGxvZ1wiIgorCWxvZyAiJExTIC1sYSAvbGliL3VkZXYgPj4gXCIkdWRldl9kaXIvbGliX2RpclwiIDI+PiBcIiRsb2dcIiIKKwlsb2cgIiRDUCAtUkwgLS1wcmVzZXJ2ZT1hbGwgL2V0Yy91ZGV2L3J1bGVzLmQgXCIkdWRldl9kaXIvcnVsZXNfZXRjXCIgMj4+IFwiJGxvZ1wiIgorCWxvZyAiJENQIC1STCAtLXByZXNlcnZlPWFsbCAvbGliL3VkZXYvcnVsZXMuZCBcIiR1ZGV2X2Rpci9ydWxlc19saWJcIiAyPj4gXCIkbG9nXCIiCitmaQorCitpZiAoKCAkbHZtZXRhZCApKTsgdGhlbgorICAgIChlY2hvICdyZXF1ZXN0PSJkdW1wIic7IGVjaG8gJyMjJykgfCB7CisJaWYgdHlwZSAtcCAkU09DQVQgPiYgL2Rldi9udWxsOyB0aGVuCisJICAgIGVjaG8gIiRTT0NBVCB1bml4LWNvbm5lY3Q6JExWTUVUQURfU09DS0VUIC0iID4+ICIkbG9nIgorCSAgICAkU09DQVQgInVuaXgtY29ubmVjdDokTFZNRVRBRF9TT0NLRVQiIC0gMj4+ICIkbG9nIgorCWVsaWYgZWNobyB8ICROQyAtVSAiJExWTUVUQURfU09DS0VUIjsgdGhlbgorCSAgICBlY2hvICIkTkMgLVUgJExWTUVUQURfU09DS0VUIiA+PiAiJGxvZyIKKwkgICAgJE5DIC1VICIkTFZNRVRBRF9TT0NLRVQiIDI+PiAiJGxvZyIKKwllbHNlCisJICAgIG15ZWNobyAiV0FSTklORzogTmVpdGhlciBzb2NhdCBub3IgbmMgLVUgc2VlbXMgdG8gYmUgYXZhaWxhYmxlLiIgMT4mMgorCSAgICBlY2hvICIjIERVTVAgRkFJTEVEIgorCSAgICByZXR1cm4gMQorCWZpCisgICAgfSA+ICIkZGlyL2x2bWV0YWQudHh0IgorZmkKKworaWYgKCggJGx2bXBvbGxkICkpOyB0aGVuCisgICAgKGVjaG8gJ3JlcXVlc3Q9ImR1bXAiJzsgZWNobyAnIyMnKSB8IHsKKwlpZiB0eXBlIC1wICRTT0NBVCA+JiAvZGV2L251bGw7IHRoZW4KKwkgICAgZWNobyAiJFNPQ0FUIHVuaXgtY29ubmVjdDokTFZNUE9MTERfU09DS0VUIC0iID4+ICIkbG9nIgorCSAgICAkU09DQVQgInVuaXgtY29ubmVjdDokTFZNUE9MTERfU09DS0VUIiAtIDI+PiAiJGxvZyIKKwllbGlmIGVjaG8gfCAkTkMgLVUgIiRMVk1QT0xMRF9TT0NLRVQiOyB0aGVuCisJICAgIGVjaG8gIiROQyAtVSAkTFZNUE9MTERfU09DS0VUIiA+PiAiJGxvZyIKKwkgICAgJE5DIC1VICIkTFZNUE9MTERfU09DS0VUIiAyPj4gIiRsb2ciCisJZWxzZQorCSAgICBteWVjaG8gIldBUk5JTkc6IE5laXRoZXIgc29jYXQgbm9yIG5jIC1VIHNlZW1zIHRvIGJlIGF2YWlsYWJsZS4iIDE+JjIKKwkgICAgZWNobyAiIyBEVU1QIEZBSUxFRCIKKwkgICAgcmV0dXJuIDEKKwlmaQorICAgIH0gPiAiJGRpci9sdm1wb2xsZC50eHQiCitmaQorCitpZiB0ZXN0IC16ICIkdXNlcmRpciI7IHRoZW4KKwlsdm1fZHVtcD0iJGRpcmJhc2UudGd6IgorCW15ZWNobyAiQ3JlYXRpbmcgcmVwb3J0IHRhcmJhbGwgaW4gJEhPTUUvJGx2bV9kdW1wLi4uIgorZmkKKword2FybmluZ3MKKworaWYgdGVzdCAteiAiJHVzZXJkaXIiOyB0aGVuCisJY2QgIiRIT01FIgorCSIkVEFSIiBjemYgIiRsdm1fZHVtcCIgIiRkaXJiYXNlIiAyPi9kZXYvbnVsbAorCSIkUk0iIC1yZiAiJGRpciIKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWxwYXRoLmF3ayBiL3NjcmlwdHMvcmVscGF0aC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRkNWU1YgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmVscGF0aC5hd2sKQEAgLTAsMCArMSw0MCBAQAorIyEvdXNyL2Jpbi9hd2sgLWYKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyByZWxwYXRoLmF3azogU2NyaXB0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHJlbGF0aXZlIHBhdGgKKyMJICAgICAgIGJldHdlZW4gdHdvIHJlYWwgYWJzb2x1dGUgcGF0aHMuCisjCisjIGVjaG8gL2EvYi9jL2QgIC9hL2IvZS9mIHwgcmVscGF0aC5hd2sKKyMgLT4gLi4vLi4vZS9mLworCit7CisJbGVuZ3RoX2Zyb20gPSBzcGxpdCgkMSwgZnJvbSwgIi8iKTsKKwlsZW5ndGhfdG8gPSBzcGxpdCgkMiwgdG8sICIvIikgOworCWwgPSAxOworCXdoaWxlIChsIDw9IGxlbmd0aF9mcm9tICYmIGwgPD0gbGVuZ3RoX3RvICYmIGZyb21bbF0gPT0gdG9bbF0pCisJCWwrKzsKKwlmb3IgKGkgPSBsOyBpIDw9IGxlbmd0aF9mcm9tICYmIGxlbmd0aChmcm9tW2ldKTsgaSsrKSB7CisJCWlmIChpID4gbCkKKwkJCXAgPSBzcHJpbnRmKCIlcy8iLCBwKTsKKwkJcCA9IHNwcmludGYoIiVzLi4iLCBwKTsKKwl9CisJZm9yIChpID0gbDsgaSA8PSBsZW5ndGhfdG8gJiYgbGVuZ3RoKHRvW2ldKTsgaSsrKSB7CisJCWlmIChsZW5ndGgocCkgPiAwKQorCQkJcCA9IHNwcmludGYoIiVzLyIsIHApOworCQlwID0gc3ByaW50ZigiJXMlcyIsIHAsIHRvW2ldKTsKKwl9CisJaWYgKGxlbmd0aChwKSkKKwkJcCA9IHNwcmludGYoIiVzLyIsIHApOworCXByaW50IHAKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvdmdfY29udmVydCBiL3NjcmlwdHMvdmdfY29udmVydApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTU5OTQxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy92Z19jb252ZXJ0CkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaCAteAorCisjIE9yaWdpbmFsIHNjcmlwdCB1c2VkIHRvIGNvbnZlcnQgYSBWRyBmcm9tIExWTTEgdG8gTFZNMiBtZXRhZGF0YSBmb3JtYXQuCisjIFN1cGVyY2VkZWQgYnkgJ3ZnY29udmVydCcsIGJ1dCBsZWZ0IGhlcmUgdG8gc2hvdyBob3cgdG8gZG8gaXQgc3RlcC1ieS1zdGVwLgorCisjIFRha2VzIHZnbmFtZSBhcyBwYXJhbWV0ZXIuICBObyBlcnJvciBjaGVja2luZy4gIFVzZXMgdGVtcCBmaWxlICdsdm1iYWNrdXAnLgorCitlY2hvICJQbGVhc2UgdXNlIHRoZSAndmdjb252ZXJ0JyB0b29sIGluc3RlYWQiCitleGl0IDEKKworLi92Z2NmZ2JhY2t1cCAkMSB8fCBleGl0IDEKKy4vdmdjZmdiYWNrdXAgLS1maWxlIGx2bWJhY2t1cCAkMSB8fCBleGl0IDEKKworQ01EUz1gLi9wdnNjYW4gLXUgfCBzZWQgLW5lICJzLy4qUFYgXCguKlwpIHdpdGggVVVJRCBcKC4qXCkgVkcgJDEgLiovLlwvcHZjcmVhdGUgLWZmIC15IC1NIGx2bTIgLS1yZXN0b3JlZmlsZSBsdm1iYWNrdXAgLXUgXDIgXDEgOyAvcCJgCisKK3NoIC14IC1jICIkQ01EUyIgfHwgZXhpdCAxCisKKy4vdmdjZmdyZXN0b3JlIC0tZmlsZSBsdm1iYWNrdXAgLU0gbHZtMiAkMSB8fCBleGl0IDEKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdmdpbXBvcnRjbG9uZS5zaCBiL3NjcmlwdHMvdmdpbXBvcnRjbG9uZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWI2MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy92Z2ltcG9ydGNsb25lLnNoCkBAIC0wLDAgKzEsMzM5IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAoQykgMjAwOSBDaHJpcyBQcm9jdGVyIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgdmdpbXBvcnRjbG9uZTogVGhpcyBzY3JpcHQgaXMgdXNlZCB0byByZW5hbWUgdGhlIFZHIGFuZCBjaGFuZ2UgdGhlIGFzc29jaWF0ZWQKKyMgICAgICAgICAgICAgICAgVkcgYW5kIFBWIFVVSURzIChwcmltYXJ5IGFwcGxpY2F0aW9uIGJlaW5nIEhXIHNuYXBzaG90IHJlc3RvcmUpCisKKyMgZm9sbG93aW5nIGV4dGVybmFsIGNvbW1hbmRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIHNjcmlwdAorIyBlY2hvIGFuZCB0ZXN0IGFyZSBpbnRlcm5hbCBpbiBiYXNoIGF0IGxlYXN0CitSTT1ybQorQkFTRU5BTUU9YmFzZW5hbWUKK01LVEVNUD1ta3RlbXAKK1JFQURMSU5LPXJlYWRsaW5rCitHRVRPUFQ9Z2V0b3B0CisKKyMgdXNlciBtYXkgb3ZlcnJpZGUgbHZtIGxvY2F0aW9uIGJ5IHNldHRpbmcgTFZNX0JJTkFSWQorTFZNPSIke0xWTV9CSU5BUlk6LWx2bX0iCisKK2RpZSgpIHsKKyAgICBjb2RlPSQxOyBzaGlmdAorICAgIGVjaG8gIkZhdGFsOiAkQCIgMT4mMgorICAgIGV4aXQgJGNvZGUKK30KKworIiRMVk0iIHZlcnNpb24gPiYgL2Rldi9udWxsIHx8IGRpZSAyICJDb3VsZCBub3QgcnVuIGx2bSBiaW5hcnkgJyRMVk0nIgorCisKK2Z1bmN0aW9uIGdldHZnbmFtZSB7CisjIyMgZ2V0IGEgdW5pcXVlIHZnIG5hbWUKKyMjIyAgICAgICAgJDEgPSBsaXN0IG9mIGV4aXN0cyBWR3MKKyMjIyAgICAgICAgJDIgPSB0aGUgbmFtZSB3ZSB3YW50CisgICAgVkdMSVNUPSQxCisgICAgVkc9JDIKKyAgICBORVdWRz0kMworCisgICAgQk5BTUU9IiR7TkVXVkc6LSR7Vkd9fSIKKyAgICBOQU1FPSIke0JOQU1FfSIKKyAgICBJPTAKKworICAgIHdoaWxlIFtbICIke1ZHTElTVH0iID1+ICI6JHtOQU1FfToiIF1dCisgICAgZG8KKyAgICAgICAgST0kKCgkSSsxKSkKKyAgICAgICAgTkFNRT0iJHtCTkFNRX0kSSIKKyAgICBkb25lCisgICAgZWNobyAiJHtOQU1FfSIKK30KKworCitmdW5jdGlvbiBjaGVja3ZhbHVlIHsKKyMjIyBjaGVjayByZXR1cm4gdmFsdWUgYW5kIGVycm9yIGlmIG5vbiB6ZXJvCisgICAgaWYgWyAkMSAtbmUgMCBdCisgICAgdGhlbgorICAgICAgICBkaWUgJDEgIiQyLCBlcnJvcjogJDEiCisgICAgZmkKK30KKworCitmdW5jdGlvbiB1c2FnZSB7CisjIyMgZGlzcGxheSB1c2FnZSBtZXNzYWdlCisgICAgZWNobyAiVXNhZ2U6ICR7U0NSSVBUTkFNRX0gW29wdGlvbnNdIFBoeXNpY2FsVm9sdW1lIFtQaHlzaWNhbFZvbHVtZS4uLl0iCisgICAgZWNobyAiICAgIC1ufC0tYmFzZXZnbmFtZSAtIEJhc2UgbmFtZSBmb3IgdGhlIG5ldyB2b2x1bWUgZ3JvdXAocykiCisgICAgZWNobyAiICAgIC1pfC0taW1wb3J0ICAgICAtIEltcG9ydCBhbnkgZXhwb3J0ZWQgdm9sdW1lIGdyb3VwcyBmb3VuZCIKKyAgICBlY2hvICIgICAgLXR8LS10ZXN0ICAgICAgIC0gUnVuIGluIHRlc3QgbW9kZSIKKyAgICBlY2hvICIgICAgLS1xdWlldCAgICAgICAgIC0gU3VwcHJlc3Mgb3V0cHV0IgorICAgIGVjaG8gIiAgICAtdnwtLXZlcmJvc2UgICAgLSBTZXQgdmVyYm9zZSBsZXZlbCIKKyAgICBlY2hvICIgICAgLWR8LS1kZWJ1ZyAgICAgIC0gU2V0IGRlYnVnIGxldmVsIgorICAgIGVjaG8gIiAgICAtLXZlcnNpb24gICAgICAgLSBEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24iCisgICAgZWNobyAiICAgIC1ofC0taGVscCAgICAgICAtIERpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UiCisgICAgZWNobyAiIgorICAgIGV4aXQgMQorfQorCisKK2Z1bmN0aW9uIGNsZWFudXAgeworICAgICNzZXQgdG8gdXNlIG9sZCBsdm0uY29uZgorICAgIExWTV9TWVNURU1fRElSPSR7T1JJR19MVk1fU1lTX0RJUn0KKworICAgIGlmIFsgJEtFRVBfVE1QX0xWTV9TWVNURU1fRElSIC1lcSAxIF07IHRoZW4KKyAgICAgICAgZWNobyAiJHtTQ1JJUFROQU1FfTogTFZNX1NZU1RFTV9ESVIgKCR7VE1QX0xWTV9TWVNURU1fRElSfSkgbXVzdCBiZSBjbGVhbmVkIHVwIG1hbnVhbGx5LiIKKyAgICBlbHNlCisgICAgICAgICIkUk0iIC1yZiAtLSAiJHtUTVBfTFZNX1NZU1RFTV9ESVJ9IgorICAgIGZpCit9CisKK1NDUklQVE5BTUU9YCIkQkFTRU5BTUUiICQwYAorCisKK2lmIFsgIiRVSUQiICE9ICIwIiAtYSAiJEVVSUQiICE9ICIwIiBdCit0aGVuCisgICAgZGllIDMgIiR7U0NSSVBUTkFNRX0gbXVzdCBiZSBydW4gYXMgcm9vdC4iCitmaQorCitMVk1fT1BUUz0iIgorVEVTVF9PUFQ9IiIKK0RJU0tTPSIiCisjIGZvciBjb21wYXRpYmlsaXR5OiB1c2luZyBta3RlbXAgLXQgcmF0aGVyIHRoYW4gLS10bXBkaXIKK1RNUF9MVk1fU1lTVEVNX0RJUj1gIiRNS1RFTVAiIC1kIC10IHNuYXAuWFhYWFhYWFhgCitLRUVQX1RNUF9MVk1fU1lTVEVNX0RJUj0wCitDSEFOR0VTX01BREU9MAorSU1QT1JUPTAKK0RFQlVHPSIiCitWRVJCT1NFPSIiCitWRVJCT1NFX0NPVU5UPTAKK0RFVk5PPTAKKworaWYgWyAtbiAiJHtMVk1fU1lTVEVNX0RJUn0iIF07IHRoZW4KKyAgICBleHBvcnQgT1JJR19MVk1fU1lTX0RJUj0iJHtMVk1fU1lTVEVNX0RJUn0iCitmaQorCit0cmFwICBjbGVhbnVwIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTgKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgR2V0IGFuZCBjaGVjayBhcmd1bWVudHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworT1BUSU9OUz1gIiRHRVRPUFQiIC1vIG46ZGhpdHYgXAorICAgIC1sIGJhc2V2Z25hbWU6LGRlYnVnLGhlbHAsaW1wb3J0LHF1aWV0LHRlc3QsdmVyYm9zZSx2ZXJzaW9uIFwKKyAgICAtbiAiJHtTQ1JJUFROQU1FfSIgLS0gIiRAImAKK1sgJD8gLW5lIDAgXSAmJiB1c2FnZQorZXZhbCBzZXQgLS0gIiRPUFRJT05TIgorCit3aGlsZSB0cnVlCitkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLW58LS1iYXNldmduYW1lKQorICAgICAgICAgICAgTkVXVkc9IiQyIjsgc2hpZnQ7IHNoaWZ0CisgICAgICAgICAgICA7OworICAgICAgICAtaXwtLWltcG9ydCkKKyAgICAgICAgICAgIElNUE9SVD0xOyBzaGlmdAorICAgICAgICAgICAgOzsKKyAgICAgICAgLXR8LS10ZXN0KQorICAgICAgICAgICAgVEVTVF9PUFQ9Ii10IgorICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tcXVpZXQpCisgICAgICAgICAgICBMVk1fT1BUUz0iLS1xdWlldCAke0xWTV9PUFRTfSIKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICA7OworICAgICAgICAtdnwtLXZlcmJvc2UpCisgICAgICAgICAgICBsZXQgVkVSQk9TRV9DT1VOVD1WRVJCT1NFX0NPVU5UKzEKKyAgICAgICAgICAgIGlmIFsgLXogIiRWRVJCT1NFIiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgVkVSQk9TRT0iLXYiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVkVSQk9TRT0iJHtWRVJCT1NFfXYiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgIDs7CisgICAgICAgIC1kfC0tZGVidWcpCisgICAgICAgICAgICBpZiBbIC16ICIkREVCVUciIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBERUJVRz0iLWQiCisgICAgICAgICAgICAgICAgc2V0IC14CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgREVCVUc9IiR7REVCVUd9ZCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBzaGlmdAorICAgICAgICAgICAgOzsKKyAgICAgICAgLS12ZXJzaW9uKQorICAgICAgICAgICAgIiRMVk0iIHZlcnNpb24KKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICBleGl0IDAKKyAgICAgICAgICAgIDs7CisgICAgICAgIC1ofC0taGVscCkKKyAgICAgICAgICAgIHVzYWdlOyBzaGlmdAorICAgICAgICAgICAgOzsKKyAgICAgICAgLS0pCisgICAgICAgICAgICBzaGlmdDsgYnJlYWsKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICB1c2FnZQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgdHVybiBvbiBERUJVRyAoc3BlY2lhbCBjYXNlIGFzc29jaWF0ZWQgd2l0aCAtdiB1c2UpCitpZiBbIC16ICIkREVCVUciIC1hICRWRVJCT1NFX0NPVU5UIC1ndCAzIF07IHRoZW4KKyAgICBERUJVRz0iLWQiCisgICAgc2V0IC14CitmaQorCisjIHNldHVwIExWTV9PUFRTCitpZiBbIC1uICIke0RFQlVHfSIgLW8gLW4gIiR7VkVSQk9TRX0iIF0KK3RoZW4KKyAgICBMVk1fT1BUUz0iJHtMVk1fT1BUU30gJHtERUJVR30gJHtWRVJCT1NFfSIKK2ZpCisKKyMgcHJvY2VzcyByZW1haW5pbmcgYXJndW1lbnRzICh3aGljaCBzaG91bGQgYmUgZGlza3MpCitmb3IgQVJHCitkbworICAgIGlmIFsgLWIgIiRBUkciIF0KKyAgICB0aGVuCisgICAgICAgIGxuIC1zICIkQVJHIiAke1RNUF9MVk1fU1lTVEVNX0RJUn0vdmdpbXBvcnQke0RFVk5PfQorICAgICAgICBESVNLUz0iJHtESVNLU30gJHtUTVBfTFZNX1NZU1RFTV9ESVJ9L3ZnaW1wb3J0JHtERVZOT30iCisgICAgICAgIERFVk5PPSQoKCR7REVWTk99KzEpKQorICAgIGVsc2UKKyAgICAgICAgZGllIDMgIiRBUkcgaXMgbm90IGEgYmxvY2sgZGV2aWNlLiIKKyAgICBmaQorZG9uZQorCisjIyMgY2hlY2sgd2UgaGF2ZSBzdWl0YWJsZSB2YWx1ZXMgZm9yIGltcG9ydGFudCB2YXJpYWJsZXMKK2lmIFsgLXogIiR7RElTS1N9IiBdCit0aGVuCisgICAgdXNhZ2UKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIEdldCB0aGUgZXhpc3Rpbmcgc3RhdGUgc28gd2UgY2FuIHVzZSBpdCBsYXRlci4KKyMjIyBUaGUgbGlzdCBvZiBWRyBuYW1lcyBpcyBzYXZlZCBpbiB0aGlzIGZvcm1hdDoKKyMjIyAgICAgOnZnbmFtZTE6dmduYW1lMjouLi46dmduYW1lTjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitPTERWR1M9IjpgIiR7TFZNfSIgdmdzICR7TFZNX09QVFN9IC1vIG5hbWUgLS1ub2hlYWRpbmdzIC0tcm93cyAtLXNlcGFyYXRvciA6IC0tY29uZmlnICdsb2d7cHJlZml4PSIifSdgOiIKK2NoZWNrdmFsdWUgJD8gIkN1cnJlbnQgVkcgbmFtZXMgY291bGQgbm90IGJlIGNvbGxlY3RlZCB3aXRob3V0IGVycm9ycyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgUHJlcGFyZSB0aGUgdGVtcG9yYXJ5IGx2bSBlbnZpcm9ubWVudAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ZvciBCTE9DSyBpbiAke0RJU0tTfQorZG8KKyAgICBGSUxURVI9IlwiYXxeJHtCTE9DS30kfFwiLCAke0ZJTFRFUn0iCitkb25lCitleHBvcnQgRklMVEVSPSJmaWx0ZXI9WyAke0ZJTFRFUn0gXCJyfC4qfFwiIF0iCisKK0xWTUNPTkY9JHtUTVBfTFZNX1NZU1RFTV9ESVJ9L2x2bS5jb25mCisKK0NNRF9DT05GSUdfTElORT0iZGV2aWNlcyB7IFwKKyAgICAgICAgICAgICAgICAgICBzY2FuID0gWyBcIiR7VE1QX0xWTV9TWVNURU1fRElSfVwiIF0gXAorICAgICAgICAgICAgICAgICAgIGNhY2hlX2RpciA9IFwiJHtUTVBfTFZNX1NZU1RFTV9ESVJ9L2NhY2hlXCIKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfZmlsdGVyID0gWyBcImF8Lip8XCIgXSBcCisgICAgICAgICAgICAgICAgICAgJHtGSUxURVJ9CisgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICBnbG9iYWwgeyBcCisgICAgICAgICAgICAgICAgICAgdXNlX2x2bWV0YWQgPSAwIFwKKyAgICAgICAgICAgICAgICAgfSIKKworJExWTSBkdW1wY29uZmlnICR7TFZNX09QVFN9IC0tZmlsZSAke0xWTUNPTkZ9IC0tbWVyZ2VkY29uZmlnIC0tY29uZmlnICIke0NNRF9DT05GSUdfTElORX0iCisKK2NoZWNrdmFsdWUgJD8gIkZhaWxlZCB0byBnZW5lcmF0ZSAke0xWTUNPTkZ9IgorIyBPbmx5IGtlZXAgVE1QX0xWTV9TWVNURU1fRElSIGlmIGl0IGNvbnRhaW5zIHNvbWV0aGluZyB3b3J0aCBrZWVwaW5nCitbIC1uICIke0RFQlVHfSIgXSAmJiBLRUVQX1RNUF9MVk1fU1lTVEVNX0RJUj0xCisKKyMjIyBzZXQgdG8gdXNlIG5ldyBsdm0uY29uZgorZXhwb3J0IExWTV9TWVNURU1fRElSPSR7VE1QX0xWTV9TWVNURU1fRElSfQorCisjIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgUFZzIHRoYXQgZG9uJ3QgYmVsb25nIHRvIGFueSBWRworIyBvciBldmVuIGlmIHRoZXJlIGFyZSBkaXNrcyB3aGljaCBhcmUgbm90IFBWcyBhdCBhbGwuCitOT1ZHREVWTElTVD1gJHtMVk19IHB2cyAtYSAtbyBwdl9uYW1lIC0tc2VsZWN0IHZnX25hbWU9IiIgLS1ub2hlYWRpbmdzYAorY2hlY2t2YWx1ZSAkPyAiRmFpbGVkIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gZm9yIFBWIGNoZWNrIgoraWYgWyAtbiAiJHtOT1ZHREVWTElTVH0iIF07IHRoZW4KKyAgICBGT0xMT1dMSVNUPSIiCisgICAgd2hpbGUgcmVhZCBQVk5BTUU7IGRvCisgICAgICAgIEZPTExPVz1gJFJFQURMSU5LICRQVk5BTUVgCisgICAgICAgIEZPTExPV0xJU1Q9IiRGT0xMT1dMSVNUICRGT0xMT1ciCisgICAgZG9uZSA8PDwgImBlY2hvICIke05PVkdERVZMSVNUfSJgIgorICAgIGRpZSA4ICJTcGVjaWZpZWQgZGV2aWNlcyBkb24ndCBiZWxvbmcgdG8gYSBWRzokRk9MTE9XTElTVCIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFJlbmFtZSB0aGUgVkcocykgYW5kIGNoYW5nZSB0aGUgVkcgYW5kIFBWIFVVSURzLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitWR0xJU1Q9YCR7TFZNfSB2Z3MgLW8gdmdfbmFtZSx2Z19leHBvcnRlZCx2Z19taXNzaW5nX3B2X2NvdW50IC0tbm9oZWFkaW5ncyAtLWJpbmFyeWAKK2NoZWNrdmFsdWUgJD8gIkZhaWxlZCB0byBjb2xsZWN0IFZHIGluZm9ybWF0aW9uIgorCit3aGlsZSByZWFkIFZHTkFNRSBWR0VYUE9SVEVEIFZHTUlTU0lOR1BWQ09VTlQ7IGRvCisgICAgaWYgWyAkVkdNSVNTSU5HUFZDT1VOVCAtZ3QgMCBdOyB0aGVuCisgICAgICAgIGVjaG8gIlZvbHVtZSBHcm91cCAke1ZHTkFNRX0gaGFzIHVua25vd24gUFYocyksIHNraXBwaW5nLiIKKyAgICAgICAgZWNobyAiLSBXZXJlIGFsbCBhc3NvY2lhdGVkIFBWKHMpIHN1cHBsaWVkIGFzIGFyZ3VtZW50cz8iCisgICAgICAgIGNvbnRpbnVlCisgICAgZmkKKworICAgIGlmIFsgIiRWR0VYUE9SVEVEIiA9ICIxIiBdOyB0aGVuCisgICAgICAgIGlmIFsgJHtJTVBPUlR9IC1lcSAxIF07IHRoZW4KKyAgICAgICAgICAgICIkTFZNIiB2Z2ltcG9ydCAke0xWTV9PUFRTfSAke1RFU1RfT1BUfSAiJHtWR05BTUV9IgorICAgICAgICAgICAgY2hlY2t2YWx1ZSAkPyAiVm9sdW1lIEdyb3VwICR7VkdOQU1FfSBjb3VsZCBub3QgYmUgaW1wb3J0ZWQiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlZvbHVtZSBHcm91cCAke1ZHTkFNRX0gZXhwb3J0ZWQsIHNraXBwaW5nLiIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisgICAgZmkKKworICAgICIkTFZNIiBwdmNoYW5nZSAke0xWTV9PUFRTfSAke1RFU1RfT1BUfSAtLXV1aWQgLS1jb25maWcgJ2dsb2JhbHthY3RpdmF0aW9uPTB9JyAtLXNlbGVjdCAidmdfbmFtZT0ke1ZHTkFNRX0iCisgICAgY2hlY2t2YWx1ZSAkPyAiVW5hYmxlIHRvIGNoYW5nZSBhbGwgUFYgdXVpZHMgaW4gVkcgJHtWR05BTUV9IgorCisgICAgTkVXVkdOQU1FPWBnZXR2Z25hbWUgIiR7T0xEVkdTfSIgIiR7VkdOQU1FfSIgIiR7TkVXVkd9ImAKKworICAgICIkTFZNIiB2Z2NoYW5nZSAke0xWTV9PUFRTfSAke1RFU1RfT1BUfSAtLXV1aWQgLS1jb25maWcgJ2dsb2JhbHthY3RpdmF0aW9uPTB9JyAke1ZHTkFNRX0KKyAgICBjaGVja3ZhbHVlICQ/ICJVbmFibGUgdG8gY2hhbmdlIFZHIHV1aWQgZm9yICR7VkdOQU1FfSIKKworICAgICMjIGlmIHRoZSBuYW1lIGlzbid0IGdvaW5nIHRvIGdldCBjaGFuZ2VkIGRvbnQgZXZlbiB0cnkuCisgICAgaWYgWyAiJHtWR05BTUV9IiAhPSAiJHtORVdWR05BTUV9IiBdCisgICAgdGhlbgorICAgICAgICAiJExWTSIgdmdyZW5hbWUgJHtMVk1fT1BUU30gJHtURVNUX09QVH0gIiR7VkdOQU1FfSIgIiR7TkVXVkdOQU1FfSIKKyAgICAgICAgY2hlY2t2YWx1ZSAkPyAiVW5hYmxlIHRvIHJlbmFtZSAke1ZHTkFNRX0gdG8gJHtORVdWR05BTUV9IgorICAgIGZpCisKKyAgICBDSEFOR0VTX01BREU9MQorZG9uZSA8PDwgImBlY2hvICIke1ZHTElTVH0iYCIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgUmVzdG9yZSB0aGUgb2xkIGVudmlyb25tZW50CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBzZXQgdG8gdXNlIG9sZCBsdm0uY29uZgoraWYgWyAteiAiJHtPUklHX0xWTV9TWVNfRElSfSIgXQordGhlbgorICAgIHVuc2V0IExWTV9TWVNURU1fRElSCitlbHNlCisgICAgTFZNX1NZU1RFTV9ESVI9JHtPUklHX0xWTV9TWVNfRElSfQorZmkKKworIyMjIHVwZGF0ZSB0aGUgZGV2aWNlIGNhY2hlIGFuZCBtYWtlIHN1cmUgYWxsCisjIyMgdGhlIGRldmljZSBub2RlcyB3ZSBuZWVkIGFyZSBzdHJhaWdodAoraWYgWyAke0NIQU5HRVNfTUFERX0gLWVxIDEgXQordGhlbgorICAgICMgZ2V0IGdsb2JhbC91c2VfbHZtZXRhZCBjb25maWcgYW5kIGlmIHNldCBhbHNvIG5vdGlmeSBsdm1ldGFkIGFib3V0IGNoYW5nZXMKKyAgICAjIHNpbmNlIHdlIHdlcmUgcnVubmluZyBMVk0gY29tbWFuZHMgYWJvdmUgd2l0aCB1c2VfbHZtZXRhZD0wCisgICAgZXZhbCAkKCR7TFZNfSBkdW1wY29uZmlnICR7TFZNX09QVFN9IGdsb2JhbC91c2VfbHZtZXRhZCkKKyAgICBpZiBbICIkdXNlX2x2bWV0YWQiID0gIjEiIF0KKyAgICB0aGVuCisgICAgICBlY2hvICJOb3RpZnlpbmcgbHZtZXRhZCBhYm91dCBjaGFuZ2VzIHNpbmNlIGl0IHdhcyBkaXNhYmxlZCB0ZW1wb3JhcmlseS4iCisgICAgICBlY2hvICIoVGhpcyByZXNvbHZlcyBhbnkgV0FSTklORyBtZXNzYWdlIGFib3V0IHJlc3RhcnRpbmcgbHZtZXRhZCB0aGF0IGFwcGVhcnMgYWJvdmUuKSIKKyAgICAgIExWTV9PUFRTPSIke0xWTV9PUFRTfSAtLWNhY2hlIgorICAgIGZpCisKKyAgICAiJExWTSIgdmdzY2FuICR7TFZNX09QVFN9IC0tbWtub2RlcworZmkKKworZXhpdCAwCmRpZmYgLS1naXQgYS9zcGVjL2J1aWxkLmluYyBiL3NwZWMvYnVpbGQuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNThmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVjL2J1aWxkLmluYwpAQCAtMCwwICsxLDY3IEBACisld2l0aCBkZWZhdWx0LWRtLXJ1bi1kaXIgJXtfZGVmYXVsdF9kbV9ydW5fZGlyfQorJXdpdGggZGVmYXVsdC1ydW4tZGlyICV7X2RlZmF1bHRfcnVuX2Rpcn0KKyV3aXRoIGRlZmF1bHQtcGlkLWRpciAle19kZWZhdWx0X3BpZF9kaXJ9Cisld2l0aCBkZWZhdWx0LWxvY2tpbmctZGlyICV7X2RlZmF1bHRfbG9ja2luZ19kaXJ9Cisld2l0aCB1c3JsaWJkaXIgJXtfbGliZGlyfQorJWVuYWJsZWlmIDEgbHZtMV9mYWxsYmFjaworJWVuYWJsZWlmIDEgZnNhZG0KKyV3aXRoIHBvb2wgaW50ZXJuYWwKKyV3aXRoIHVzZXIKKyV3aXRoIGdyb3VwCisld2l0aCBkZXZpY2UtdWlkIDAKKyV3aXRoIGRldmljZS1naWQgNgorJXdpdGggZGV2aWNlLW1vZGUgMDY2MAorJWVuYWJsZWlmIDEgcGtnY29uZmlnCislZW5hYmxlaWYgMSBhcHBsaWIKKyVlbmFibGVpZiAxIGNtZGxpYgorJWVuYWJsZWlmIDEgZG1ldmVudGQKKyVlbmFibGVpZiAxIHdyaXRlX2luc3RhbGwKKworJXdpdGggdWRldmRpciAle191ZGV2ZGlyfQorJWVuYWJsZWlmICV7ZW5hYmxlX2NtaXJyb3J9IGNtaXJyb3JkCislZW5hYmxlaWYgJXtlbmFibGVfdWRldn0gdWRldl9zeW5jCislZW5hYmxlaWYgJXtlbmFibGVfcHJvZmlsaW5nfSBwcm9maWxpbmcKKyVnbG9iYWwgZW5hYmxlX2x2bWV0YWQgJShpZiBlY2hvICV7c2VydmljZXN9IHwgZ3JlcCAtcSBsdm1ldGFkOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQorJWVuYWJsZWlmICV7ZW5hYmxlX2x2bWV0YWR9IGx2bWV0YWQKKyVnbG9iYWwgZW5hYmxlX2x2bXBvbGxkICUoaWYgZWNobyAle3NlcnZpY2VzfSB8IGdyZXAgLXEgbHZtcG9sbGQ7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCislZW5hYmxlaWYgJXtlbmFibGVfbHZtcG9sbGR9IGx2bXBvbGxkCislZ2xvYmFsIGVuYWJsZV9sdm1sb2NrZCAlKGlmIGVjaG8gJXtzZXJ2aWNlc30gfCBncmVwIC1xIGx2bWxvY2tkOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQorJWlmICV7ZW5hYmxlX2x2bWxvY2tkfQorJWVuYWJsZWlmICV7ZW5hYmxlX2xvY2tkX2RsbX0gbG9ja2QtZGxtCislZW5hYmxlaWYgJXtlbmFibGVfbG9ja2Rfc2FubG9ja30gbG9ja2Qtc2FubG9jaworJWVuZGlmCislZW5hYmxlaWYgJXtlbmFibGVfcHl0aG9ufSBweXRob24yLWJpbmRpbmdzCislZW5hYmxlaWYgJXtlbmFibGVfcHl0aG9uM30gcHl0aG9uMy1iaW5kaW5ncworJWVuYWJsZWlmICV7ZW5hYmxlX3B5dGhvbn0gYXBwbGliCislZW5hYmxlaWYgJXtlbmFibGVfZGJ1c2R9IGRidXMtc2VydmljZQorCislYnVpbGQKKworJWNvbmZpZ3VyZSAle2NvbmZpZ3VyZV9mbGFnc30KKworbWFrZSAlez9fc21wX21mbGFnc30KKyV7P2V4dHJhX2J1aWxkX2NvbW1hbmRzfQorCislaW5zdGFsbAorbWFrZSBpbnN0YWxsIERFU1RESVI9JFJQTV9CVUlMRF9ST09UCittYWtlIGluc3RhbGxfc3lzdGVtX2RpcnMgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QKKyVpZiAle2VuYWJsZV9zeXN0ZW1kfQorbWFrZSBpbnN0YWxsX3N5c3RlbWRfdW5pdHMgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QKK21ha2UgaW5zdGFsbF9zeXN0ZW1kX2dlbmVyYXRvcnMgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QKK21ha2UgaW5zdGFsbF90bXBmaWxlc19jb25maWd1cmF0aW9uIERFU1RESVI9JFJQTV9CVUlMRF9ST09UCislZWxzZQorbWFrZSBpbnN0YWxsX2luaXRzY3JpcHRzIERFU1RESVI9JFJQTV9CVUlMRF9ST09UCislZW5kaWYKKyVpZiAle2VuYWJsZV90ZXN0c3VpdGV9CittYWtlIC1DIHRlc3QgaW5zdGFsbCBERVNURElSPSRSUE1fQlVJTERfUk9PVAorJWVuZGlmCisKKyMgd2hlbiBidWlsZGluZyBhbiBzcmMucnBtIGZyb20gZnJlZXN0YW5kaW5nIHNwZWNmaWxlcwordGVzdCAtZSAle19zb3VyY2VkaXJ9L3NvdXJjZS5pbmMgfHwgY3Agc291cmNlLmluYyBidWlsZC5pbmMgcGFja2FnZXMuaW5jIG1hY3Jvcy5pbmMgJXtfc291cmNlZGlyfQorCislY2hlY2sKKyV7P2NoZWNrX2NvbW1hbmRzfQorCislY2xlYW4KK3B3ZAordGVzdCAtbiBycG0tbm8tY2xlYW4gfHwgcm0gLXJmICRSUE1fQlVJTERfUk9PVApkaWZmIC0tZ2l0IGEvc3BlYy9sdm0yLnNwZWMgYi9zcGVjL2x2bTIuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjM3M2JjCi0tLSAvZGV2L251bGwKKysrIGIvc3BlYy9sdm0yLnNwZWMKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgTkIuIFRoaXMgc3BlY2ZpbGUgaXMgYSB3b3JrIGluIHByb2dyZXNzLiBJdCBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUKKyMgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0gZHJpdmVuIGJ5IG5peCBhbmQgaHlkcmEgdG8gY3JlYXRlIGFuZCB0ZXN0IFJQTXMKKyMgb24gRmVkb3JhLCBDZW50T1MgYW5kIFJIRUwgc3lzdGVtcy4gSXQgaXMgbm90IHlldCByZWFkeSBmb3IgZGVwbG95bWVudCBvZiBMVk0KKyMgb24gdGhvc2Ugc3lzdGVtcy4KKworIyBBIG1hY3JvIHRvIHB1bGwgaW4gYW4gaW5jbHVkZSBmaWxlIGZyb20gYW4gYXBwcm9wcmlhdGUgbG9jYXRpb24uCislZGVmaW5lIGltcG9ydCgpICVpbmNsdWRlICUodGVzdCAtZSAle1M6JTF9ICYmIGVjaG8gJXtTOiUxfSB8fCBlY2hvICV7X3NvdXJjZWRpcn0vJTEpCisKKyVpbXBvcnQgc291cmNlLmluYworCisjIFBhdGNoTjogbm5uLnBhdGNoIGdvZXMgaGVyZQorCislcHJlcAorJXNldHVwIC1xIC1uIExWTTIuJXt2ZXJzaW9ufQorCislaW1wb3J0IGJ1aWxkLmluYworJWltcG9ydCBwYWNrYWdlcy5pbmMKKworJWNoYW5nZWxvZwpkaWZmIC0tZ2l0IGEvc3BlYy9tYWNyb3MuaW5jIGIvc3BlYy9tYWNyb3MuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGU2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVjL21hY3Jvcy5pbmMKQEAgLTAsMCArMSw4MyBAQAorJWdsb2JhbCBfZGVmYXVsdF9waWRfZGlyIC9ydW4KKyVnbG9iYWwgX2RlZmF1bHRfZG1fcnVuX2RpciAvcnVuCislZ2xvYmFsIF9kZWZhdWx0X3J1bl9kaXIgL3J1bi9sdm0KKyVnbG9iYWwgX2RlZmF1bHRfbG9ja2luZ19kaXIgL3J1bi9sb2NrL2x2bQorJWdsb2JhbCBfdWRldmJhc2VkaXIgJXtfcHJlZml4fS9saWIvdWRldgorJWdsb2JhbCBfdWRldmRpciAle191ZGV2YmFzZWRpcn0vcnVsZXMuZAorJWdsb2JhbCBfdG1wZmlsZXNkaXIgJXtfcHJlZml4fS9saWIvdG1wZmlsZXMuZAorCislaWYgITAlez9mZWRvcmF9CislZ2xvYmFsIGZlZG9yYSAwCislZW5kaWYKKworJWlmICEwJXs/cmhlbH0KKyVnbG9iYWwgcmhlbCAwCislZW5kaWYKKworJWRlZmluZSBlbmFibGVpZigpIFwKKyVnbG9iYWwgY29uZmlndXJlX2ZsYWdzICV7P2NvbmZpZ3VyZV9mbGFnc30gLS0lKGlmIHRlc3QgJTEgLWd0IDA7IHRoZW4gZWNobyBlbmFibGUtJTI7IGVsc2UgZWNobyBkaXNhYmxlLSUyOyBmaSkKKworJWRlZmluZSB3aXRoKCkgXAorJWdsb2JhbCBjb25maWd1cmVfZmxhZ3MgJShlY2hvIC1uICIlez9jb25maWd1cmVfZmxhZ3N9ICIgfCBzZWQgLWUgInMsLS13aXRoLSUxPVteIF0qLCwiOyB0ZXN0IC1uICIlez8yfSIgJiYgZWNobyAtLXdpdGgtJTE9JTIpIFwKKyVnbG9iYWwgd2l0aF9mbGFncyAlKGVjaG8gLW4gIiV7P3dpdGhfZmxhZ3N9ICIgfCBzZWQgLWUgInMsJTEsLCI7IHRlc3QgLW4gIiV7PzJ9IiAmJiB0ZXN0ICIlez8yfSIgIT0gbm9uZSAmJiBlY2hvICUxKQorCislZ2xvYmFsIHNlcnZpY2VzIG1vbml0b3IKKyVkZWZpbmUgc2VydmljZSgpIFwKKyVnbG9iYWwgc2VydmljZXMgJShlY2hvIC1uICIlez9zZXJ2aWNlc30gIiB8IHNlZCAtZSBzLCUxLCw7IHRlc3QgIiUyIiA9IDEgJiYgZWNobyAlMSkKKworJWRlZmluZSBtYXliZSgpIFwKKyVpZiAlKHRlc3QgLW4gIiV7PzJ9IiAmJiBlY2hvIDEgfHwgZWNobyAwKSBcCislKiBcCislZW5kaWYKKworJWRlZmluZSBoYXZlX3dpdGgoKSAlKGlmIGVjaG8gJXt3aXRoX2ZsYWdzfSB8IGdyZXAgLXEgJTE7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCislZGVmaW5lIGhhdmVfc2VydmljZSgpICUoaWYgZWNobyAle3NlcnZpY2VzfSB8IGdyZXAgLXEgJTE7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCisKKyVkZWZpbmUgZGFlbW9uX3JlbG9hZCBcCislaWYgJXtlbmFibGVfc3lzdGVtZH0gXAorc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQgPiAvZGV2L251bGwgMj4mMSB8fCA6IFwKKyVlbmRpZiBcCis6IFwKKyV7bmlsfQorCislZGVmaW5lIGVuYWJsZShzOnQ6KSBcCislaWYgJXtoYXZlX3NlcnZpY2UgJXstcyp9fSBcCislaWYgJXtlbmFibGVfc3lzdGVtZH0gXAoraWYgWyAkMSA9IDEgXTsgdGhlbiBcCisJc3lzdGVtY3RsIHByZXNldCBsdm0yLSV7LXMqfS4ley10Kn0gPiAvZGV2L251bGwgMj4mMSB8fCA6IFwKK2ZpIFwKKyVlbHNlIFwKKy9zYmluL2Noa2NvbmZpZyAtLWFkZCBsdm0yLSV7LXMqfSBcCislZW5kaWYgXAorJWVuZGlmIFwKKzogXAorJXtuaWx9CisKKyVkZWZpbmUgZGlzYWJsZShzOnQ6KSBcCislaWYgJXtoYXZlX3NlcnZpY2UgJXstcyp9fSBcCislaWYgJXtlbmFibGVfc3lzdGVtZH0gXAoraWYgWyAkMSA9IDAgXTsgdGhlbiBcCisJc3lzdGVtY3RsIC0tbm8tcmVsb2FkIGRpc2FibGUgbHZtMi0ley1zKn0uJXstdCp9ID4gL2Rldi9udWxsIDI+JjEgfHwgOiBcCisJJWlmICV7LXQqfSA9PSBzb2NrZXQgXAorCXN5c3RlbWN0bCAtLW5vLXJlbG9hZCBkaXNhYmxlIGx2bTItJXstcyp9LnNlcnZpY2UgPiAvZGV2L251bGwgMj4mMSB8fCA6IFwKKwklZW5kaWYgXAorCXN5c3RlbWN0bCBzdG9wIGx2bTItJXstcyp9LiV7LXQqfSA+IC9kZXYvbnVsbCAyPiYxIHx8IDogXAorCSVpZiAley10Kn0gPT0gc29ja2V0IFwKKwlzeXN0ZW1jdGwgc3RvcCBsdm0yLSV7LXMqfS5zZXJ2aWNlID4gL2Rldi9udWxsIDI+JjEgfHwgOiBcCisJJWVuZGlmIFwKK2ZpIFwKKyVlbHNlIFwKKy9zYmluL2Noa2NvbmZpZyAtLWRlbCBsdm0yLSV7LXMqfSBcCislZW5kaWYgXAorJWVuZGlmIFwKKzogXAorJXtuaWx9CisKKyVkZWZpbmUgdHJ5X3Jlc3RhcnQoczp0OikgXAorJWlmICV7aGF2ZV9zZXJ2aWNlICV7LXMqfX0gJiYgJXtlbmFibGVfc3lzdGVtZH0gXAoraWYgWyAkMSA9IDEgXTsgdGhlbiBcCisJc3lzdGVtY3RsIHRyeS1yZXN0YXJ0IGx2bTItJXstcyp9LiV7LXQqfSA+IC9kZXYvbnVsbCAyPiYxIHx8IDogXAorZmkgXAorJWVuZGlmIFwKKzogXAorJXtuaWx9CmRpZmYgLS1naXQgYS9zcGVjL3BhY2thZ2VzLmluYyBiL3NwZWMvcGFja2FnZXMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzQ1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVjL3BhY2thZ2VzLmluYwpAQCAtMCwwICsxLDY3MCBAQAorIyMjIE1BSU4gUEFDS0FHRSAobHZtMikKKworJXBvc3QKKyVkYWVtb25fcmVsb2FkCislZW5hYmxlIC1zIG1vbml0b3IgLXQgc2VydmljZQorJWlmICV7aGF2ZV9zZXJ2aWNlIGx2bWV0YWR9CislZW5hYmxlIC1zIGx2bWV0YWQgLXQgc29ja2V0CislZW5kaWYKKyVpZiAle2hhdmVfc2VydmljZSBsdm1wb2xsZH0KKyVlbmFibGUgLXMgbHZtcG9sbGQgLXQgc29ja2V0CislZW5kaWYKKworJXByZXVuCislaWYgJXtoYXZlX3NlcnZpY2UgbHZtcG9sbGR9CislZGlzYWJsZSAtcyBsdm1wb2xsZCAtdCBzb2NrZXQKKyVlbmRpZgorJWlmICV7aGF2ZV9zZXJ2aWNlIGx2bWV0YWR9CislZGlzYWJsZSAtcyBsdm1ldGFkIC10IHNvY2tldAorJWVuZGlmCislZGlzYWJsZSAtcyBtb25pdG9yIC10IHNlcnZpY2UKKworJXBvc3R1bgorJXRyeV9yZXN0YXJ0IC1zIG1vbml0b3IgLXQgc2VydmljZQorJWlmICV7aGF2ZV9zZXJ2aWNlIGx2bWV0YWR9CisldHJ5X3Jlc3RhcnQgLXMgbHZtZXRhZCAtdCBzZXJ2aWNlCislZW5kaWYKKyVpZiAle2hhdmVfc2VydmljZSBsdm1wb2xsZH0KKyV0cnlfcmVzdGFydCAtcyBsdm1wb2xsZCAtdCBzZXJ2aWNlCislZW5kaWYKK2lmIFsgJDEgPSAwIF07IHRoZW4KKyVkYWVtb25fcmVsb2FkCitmaQorCisldHJpZ2dlcnVuIC0tICV7bmFtZX0gPCAyLjAyLjg2LTIKKyV7X2JpbmRpcn0vc3lzdGVtZC1zeXN2LWNvbnZlcnQgLS1zYXZlIGx2bTItbW9uaXRvciA+L2Rldi9udWxsIDI+JjEgfHwgOgorL2Jpbi9zeXN0ZW1jdGwgLS1uby1yZWxvYWQgZW5hYmxlIGx2bTItbW9uaXRvci5zZXJ2aWNlID4gL2Rldi9udWxsIDI+JjEgfHwgOgorL3NiaW4vY2hrY29uZmlnIC0tZGVsIGx2bTItbW9uaXRvciA+IC9kZXYvbnVsbCAyPiYxIHx8IDoKKy9iaW4vc3lzdGVtY3RsIHRyeS1yZXN0YXJ0IGx2bTItbW9uaXRvci5zZXJ2aWNlID4gL2Rldi9udWxsIDI+JjEgfHwgOgorIyBmaWxlcyBpbiB0aGUgbWFpbiBwYWNrYWdlCisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyVkb2MgQ09QWUlORyBDT1BZSU5HLkxJQiBJTlNUQUxMIFJFQURNRSBWRVJTSU9OIFdIQVRTX05FVworJWRvYyBkb2MvbHZtX2ZhdWx0X2hhbmRsaW5nLnR4dAorJXtfc2JpbmRpcn0vYmxrZGVhY3RpdmF0ZQorJXtfc2JpbmRpcn0vZnNhZG0KKyV7X3NiaW5kaXJ9L2x2Y2hhbmdlCisle19zYmluZGlyfS9sdmNvbnZlcnQKKyV7X3NiaW5kaXJ9L2x2Y3JlYXRlCisle19zYmluZGlyfS9sdmRpc3BsYXkKKyV7X3NiaW5kaXJ9L2x2ZXh0ZW5kCisle19zYmluZGlyfS9sdm0KKyV7X3NiaW5kaXJ9L2x2bWNoYW5nZQorJXtfc2JpbmRpcn0vbHZtY29uZgorJXtfc2JpbmRpcn0vbHZtY29uZmlnCisle19zYmluZGlyfS9sdm1kaXNrc2NhbgorJXtfc2JpbmRpcn0vbHZtZHVtcAorJXtfc2JpbmRpcn0vbHZtc2FkYworJXtfc2JpbmRpcn0vbHZtc2FyCisle19zYmluZGlyfS9sdnJlZHVjZQorJXtfc2JpbmRpcn0vbHZyZW1vdmUKKyV7X3NiaW5kaXJ9L2x2cmVuYW1lCisle19zYmluZGlyfS9sdnJlc2l6ZQorJXtfc2JpbmRpcn0vbHZzCisle19zYmluZGlyfS9sdnNjYW4KKyV7X3NiaW5kaXJ9L3B2Y2hhbmdlCisle19zYmluZGlyfS9wdmNrCisle19zYmluZGlyfS9wdmNyZWF0ZQorJXtfc2JpbmRpcn0vcHZkaXNwbGF5Cisle19zYmluZGlyfS9wdm1vdmUKKyV7X3NiaW5kaXJ9L3B2cmVtb3ZlCisle19zYmluZGlyfS9wdnJlc2l6ZQorJXtfc2JpbmRpcn0vcHZzCisle19zYmluZGlyfS9wdnNjYW4KKyV7X3NiaW5kaXJ9L3ZnY2ZnYmFja3VwCisle19zYmluZGlyfS92Z2NmZ3Jlc3RvcmUKKyV7X3NiaW5kaXJ9L3ZnY2hhbmdlCisle19zYmluZGlyfS92Z2NrCisle19zYmluZGlyfS92Z2NvbnZlcnQKKyV7X3NiaW5kaXJ9L3ZnY3JlYXRlCisle19zYmluZGlyfS92Z2Rpc3BsYXkKKyV7X3NiaW5kaXJ9L3ZnZXhwb3J0Cisle19zYmluZGlyfS92Z2V4dGVuZAorJXtfc2JpbmRpcn0vdmdpbXBvcnQKKyV7X3NiaW5kaXJ9L3ZnaW1wb3J0Y2xvbmUKKyV7X3NiaW5kaXJ9L3ZnbWVyZ2UKKyV7X3NiaW5kaXJ9L3ZnbWtub2RlcworJXtfc2JpbmRpcn0vdmdyZWR1Y2UKKyV7X3NiaW5kaXJ9L3ZncmVtb3ZlCisle19zYmluZGlyfS92Z3JlbmFtZQorJXtfc2JpbmRpcn0vdmdzCisle19zYmluZGlyfS92Z3NjYW4KKyV7X3NiaW5kaXJ9L3Znc3BsaXQKKyVpZiAle2hhdmVfc2VydmljZSBsdm1ldGFkfQorICV7X3NiaW5kaXJ9L2x2bWV0YWQKKyVlbmRpZgorJWlmICV7aGF2ZV9zZXJ2aWNlIGx2bXBvbGxkfQorICV7X3NiaW5kaXJ9L2x2bXBvbGxkCislZW5kaWYKKyV7X21hbmRpcn0vbWFuNS9sdm0uY29uZi41Lmd6Cisle19tYW5kaXJ9L21hbjcvbHZtc3lzdGVtaWQuNy5negorJXtfbWFuZGlyfS9tYW44L2Jsa2RlYWN0aXZhdGUuOC5negorJXtfbWFuZGlyfS9tYW44L2ZzYWRtLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdmNoYW5nZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZjb252ZXJ0LjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdmNyZWF0ZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZkaXNwbGF5LjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdmV4dGVuZC44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZtLWNvbmZpZy44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZtLWR1bXBjb25maWcuOC5negorJXtfbWFuZGlyfS9tYW44L2x2bS44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZtMi1hY3RpdmF0aW9uLWdlbmVyYXRvci44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZtY2hhbmdlLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1jb25mLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1jb25maWcuOC5negorJXtfbWFuZGlyfS9tYW44L2x2bWRpc2tzY2FuLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1kdW1wLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1zYWRjLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1zYXIuOC5negorJXtfbWFuZGlyfS9tYW44L2x2cmVkdWNlLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdnJlbW92ZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvbHZyZW5hbWUuOC5negorJXtfbWFuZGlyfS9tYW44L2x2cmVzaXplLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdnMuOC5negorJXtfbWFuZGlyfS9tYW44L2x2c2Nhbi44Lmd6Cisle19tYW5kaXJ9L21hbjgvcHZjaGFuZ2UuOC5negorJXtfbWFuZGlyfS9tYW44L3B2Y2suOC5negorJXtfbWFuZGlyfS9tYW44L3B2Y3JlYXRlLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9wdmRpc3BsYXkuOC5negorJXtfbWFuZGlyfS9tYW44L3B2bW92ZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvcHZyZW1vdmUuOC5negorJXtfbWFuZGlyfS9tYW44L3B2cmVzaXplLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9wdnMuOC5negorJXtfbWFuZGlyfS9tYW44L3B2c2Nhbi44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdjZmdiYWNrdXAuOC5negorJXtfbWFuZGlyfS9tYW44L3ZnY2ZncmVzdG9yZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdjaGFuZ2UuOC5negorJXtfbWFuZGlyfS9tYW44L3ZnY2suOC5negorJXtfbWFuZGlyfS9tYW44L3ZnY29udmVydC44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdjcmVhdGUuOC5negorJXtfbWFuZGlyfS9tYW44L3ZnZGlzcGxheS44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdleHBvcnQuOC5negorJXtfbWFuZGlyfS9tYW44L3ZnZXh0ZW5kLjguZ3oKKyV7X21hbmRpcn0vbWFuOC92Z2ltcG9ydC44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdpbXBvcnRjbG9uZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdtZXJnZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdta25vZGVzLjguZ3oKKyV7X21hbmRpcn0vbWFuOC92Z3JlZHVjZS44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdyZW1vdmUuOC5negorJXtfbWFuZGlyfS9tYW44L3ZncmVuYW1lLjguZ3oKKyV7X21hbmRpcn0vbWFuOC92Z3MuOC5negorJXtfbWFuZGlyfS9tYW44L3Znc2Nhbi44Lmd6Cisle19tYW5kaXJ9L21hbjgvdmdzcGxpdC44Lmd6CislaWYgJXtoYXZlX3dpdGggY2FjaGV9CisgICV7X21hbmRpcn0vbWFuNy9sdm1jYWNoZS43Lmd6CislZW5kaWYKKyVpZiAle2hhdmVfd2l0aCB0aGlufQorICAle19tYW5kaXJ9L21hbjcvbHZtdGhpbi43Lmd6CislZW5kaWYKKyVpZiAle2hhdmVfc2VydmljZSBsdm1wb2xsZH0KKyAgJXtfbWFuZGlyfS9tYW44L2x2bXBvbGxkLjguZ3oKKyAgJXtfbWFuZGlyfS9tYW44L2x2bS1sdnBvbGwuOC5negorJWVuZGlmCislaWYgJXtlbmFibGVfdWRldn0KKyAle191ZGV2ZGlyfS8xMS1kbS1sdm0ucnVsZXMKKyAlaWYgJXtoYXZlX3NlcnZpY2UgbHZtZXRhZH0KKyAgJXtfbWFuZGlyfS9tYW44L2x2bWV0YWQuOC5negorICAle191ZGV2ZGlyfS82OS1kbS1sdm0tbWV0YWQucnVsZXMKKyAlZW5kaWYKKyVlbmRpZgorJWRpciAle19zeXNjb25mZGlyfS9sdm0KKyVnaG9zdCAle19zeXNjb25mZGlyfS9sdm0vY2FjaGUvLmNhY2hlCislYXR0cig2NDQsIC0sIC0pICVjb25maWcobm9yZXBsYWNlKSAldmVyaWZ5KG5vdCBtZDUgbXRpbWUgc2l6ZSkgJXtfc3lzY29uZmRpcn0vbHZtL2x2bS5jb25mCislYXR0cig2NDQsIC0sIC0pICVjb25maWcobm9yZXBsYWNlKSAldmVyaWZ5KG5vdCBtZDUgbXRpbWUgc2l6ZSkgJXtfc3lzY29uZmRpcn0vbHZtL2x2bWxvY2FsLmNvbmYKKyVkaXIgJXtfc3lzY29uZmRpcn0vbHZtL3Byb2ZpbGUKKyVjb25maWcobm9yZXBsYWNlKSAldmVyaWZ5KG5vdCBtZDUgbXRpbWUgc2l6ZSkgJXtfc3lzY29uZmRpcn0vbHZtL3Byb2ZpbGUvY29tbWFuZF9wcm9maWxlX3RlbXBsYXRlLnByb2ZpbGUKKyVjb25maWcobm9yZXBsYWNlKSAldmVyaWZ5KG5vdCBtZDUgbXRpbWUgc2l6ZSkgJXtfc3lzY29uZmRpcn0vbHZtL3Byb2ZpbGUvbWV0YWRhdGFfcHJvZmlsZV90ZW1wbGF0ZS5wcm9maWxlCislY29uZmlnKG5vcmVwbGFjZSkgJXZlcmlmeShub3QgbWQ1IG10aW1lIHNpemUpICV7X3N5c2NvbmZkaXJ9L2x2bS9wcm9maWxlL3RoaW4tZ2VuZXJpYy5wcm9maWxlCislY29uZmlnKG5vcmVwbGFjZSkgJXZlcmlmeShub3QgbWQ1IG10aW1lIHNpemUpICV7X3N5c2NvbmZkaXJ9L2x2bS9wcm9maWxlL3RoaW4tcGVyZm9ybWFuY2UucHJvZmlsZQorJWNvbmZpZyhub3JlcGxhY2UpICV2ZXJpZnkobm90IG1kNSBtdGltZSBzaXplKSAle19zeXNjb25mZGlyfS9sdm0vcHJvZmlsZS9jYWNoZS1tcS5wcm9maWxlCislY29uZmlnKG5vcmVwbGFjZSkgJXZlcmlmeShub3QgbWQ1IG10aW1lIHNpemUpICV7X3N5c2NvbmZkaXJ9L2x2bS9wcm9maWxlL2NhY2hlLXNtcS5wcm9maWxlCislZGlyICV7X3N5c2NvbmZkaXJ9L2x2bS9iYWNrdXAKKyVkaXIgJXtfc3lzY29uZmRpcn0vbHZtL2NhY2hlCislZGlyICV7X3N5c2NvbmZkaXJ9L2x2bS9hcmNoaXZlCislZ2hvc3QgJWRpciAle19kZWZhdWx0X2xvY2tpbmdfZGlyfQorJWdob3N0ICVkaXIgJXtfZGVmYXVsdF9ydW5fZGlyfQorJWlmICV7ZW5hYmxlX3N5c3RlbWR9CisgJXtfdG1wZmlsZXNkaXJ9LyV7bmFtZX0uY29uZgorICV7X3VuaXRkaXJ9L2Jsay1hdmFpbGFiaWxpdHkuc2VydmljZQorICV7X3VuaXRkaXJ9L2x2bTItbW9uaXRvci5zZXJ2aWNlCisgJWF0dHIoNTU1LCAtLCAtKSAle19wcmVmaXh9L2xpYi9zeXN0ZW1kL3N5c3RlbS1nZW5lcmF0b3JzL2x2bTItYWN0aXZhdGlvbi1nZW5lcmF0b3IKKyAlaWYgJXtoYXZlX3NlcnZpY2UgbHZtZXRhZH0KKyAgJXtfdW5pdGRpcn0vbHZtMi1sdm1ldGFkLnNvY2tldAorICAle191bml0ZGlyfS9sdm0yLWx2bWV0YWQuc2VydmljZQorICAle191bml0ZGlyfS9sdm0yLXB2c2NhbkAuc2VydmljZQorICVlbmRpZgorICVpZiAle2hhdmVfc2VydmljZSBsdm1wb2xsZH0KKyAgJXtfdW5pdGRpcn0vbHZtMi1sdm1wb2xsZC5zZXJ2aWNlCisgICV7X3VuaXRkaXJ9L2x2bTItbHZtcG9sbGQuc29ja2V0CisgJWVuZGlmCislZWxzZQorICV7X3N5c2NvbmZkaXJ9L3JjLmQvaW5pdC5kL2Jsay1hdmFpbGFiaWxpdHkKKyAle19zeXNjb25mZGlyfS9yYy5kL2luaXQuZC9sdm0yLW1vbml0b3IKKyAlaWYgJXtoYXZlX3NlcnZpY2UgbHZtZXRhZH0KKyAgJXtfc3lzY29uZmRpcn0vcmMuZC9pbml0LmQvbHZtMi1sdm1ldGFkCisgJWVuZGlmCisgJWlmICV7aGF2ZV9zZXJ2aWNlIGx2bXBvbGxkfQorICAle19zeXNjb25mZGlyfS9yYy5kL2luaXQuZC9sdm0yLWx2bXBvbGxkCisgJWVuZGlmCislZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpYnJhcnkgYW5kIERldmVsb3BtZW50IHN1YnBhY2thZ2VzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyVwYWNrYWdlIGRldmVsCitTdW1tYXJ5OiBEZXZlbG9wbWVudCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK0xpY2Vuc2U6IExHUEx2MgorUmVxdWlyZXM6ICV7bmFtZX0gPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiBkZXZpY2UtbWFwcGVyLWRldmVsID49ICV7ZGV2aWNlX21hcHBlcl92ZXJzaW9ufS0le3JlbGVhc2V9CitSZXF1aXJlczogZGV2aWNlLW1hcHBlci1ldmVudC1kZXZlbCA+PSAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6IHBrZ2NvbmZpZworCislZGVzY3JpcHRpb24gZGV2ZWwKK1RoaXMgcGFja2FnZSBjb250YWlucyBmaWxlcyBuZWVkZWQgdG8gZGV2ZWxvcCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKK3RoZSBsdm0yIGxpYnJhcmllcy4KKworJWZpbGVzIGRldmVsCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJXtfbGliZGlyfS9saWJsdm0yYXBwLnNvCisle19saWJkaXJ9L2xpYmx2bTJjbWQuc28KKyV7X2luY2x1ZGVkaXJ9L2x2bTJhcHAuaAorJXtfaW5jbHVkZWRpcn0vbHZtMmNtZC5oCisle19saWJkaXJ9L3BrZ2NvbmZpZy9sdm0yYXBwLnBjCisle19saWJkaXJ9L2xpYmRldm1hcHBlci1ldmVudC1sdm0yLnNvCisKKyVwYWNrYWdlIGxpYnMKK1N1bW1hcnk6IFNoYXJlZCBsaWJyYXJpZXMgZm9yIGx2bTIKK0xpY2Vuc2U6IExHUEx2MgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiBkZXZpY2UtbWFwcGVyLWV2ZW50ID49ICV7ZGV2aWNlX21hcHBlcl92ZXJzaW9ufS0le3JlbGVhc2V9CisKKyVkZXNjcmlwdGlvbiBsaWJzCitUaGlzIHBhY2thZ2UgY29udGFpbnMgc2hhcmVkIGx2bTIgbGlicmFyaWVzIGZvciBhcHBsaWNhdGlvbnMuCisKKyVwb3N0IGxpYnMgLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3R1biBsaWJzIC1wIC9zYmluL2xkY29uZmlnCisKKyVmaWxlcyBsaWJzCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfbGliZGlyfS9saWJsdm0yYXBwLnNvLioKKyVhdHRyKDc1NSxyb290LHJvb3QpICV7X2xpYmRpcn0vbGlibHZtMmNtZC5zby4qCislYXR0cig3NTUscm9vdCxyb290KSAle19saWJkaXJ9L2xpYmRldm1hcHBlci1ldmVudC1sdm0yLnNvLioKKyVkaXIgJXtfbGliZGlyfS9kZXZpY2UtbWFwcGVyCisle19saWJkaXJ9L2RldmljZS1tYXBwZXIvbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJtaXJyb3Iuc28KKyV7X2xpYmRpcn0vZGV2aWNlLW1hcHBlci9saWJkZXZtYXBwZXItZXZlbnQtbHZtMnNuYXBzaG90LnNvCisle19saWJkaXJ9L2RldmljZS1tYXBwZXIvbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJyYWlkLnNvCislaWYgJXtoYXZlX3dpdGggdGhpbn0KKyV7X2xpYmRpcn0vZGV2aWNlLW1hcHBlci9saWJkZXZtYXBwZXItZXZlbnQtbHZtMnRoaW4uc28KKyV7X2xpYmRpcn0vbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJ0aGluLnNvCislZW5kaWYKKyV7X2xpYmRpcn0vbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJtaXJyb3Iuc28KKyV7X2xpYmRpcn0vbGliZGV2bWFwcGVyLWV2ZW50LWx2bTJzbmFwc2hvdC5zbworJXtfbGliZGlyfS9saWJkZXZtYXBwZXItZXZlbnQtbHZtMnJhaWQuc28KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTFZNIGxvY2tpbmcgZGFlbW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyVpZiAle2hhdmVfc2VydmljZSBsdm1sb2NrZH0KKyVwYWNrYWdlIGxvY2tkCitTdW1tYXJ5OiBMVk0gbG9ja2luZyBkYWVtb24KK0dyb3VwOiBTeXN0ZW0gRW52aXJvbm1lbnQvQmFzZQorUmVxdWlyZXM6IGx2bTIgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KKyVpZiAle2VuYWJsZV9sb2NrZF9kbG19CitSZXF1aXJlczogZGxtLWxpYiA+PSAle2RsbV92ZXJzaW9ufQorJWVuZGlmCislaWYgJXtlbmFibGVfbG9ja2Rfc2FubG9ja30KK1JlcXVpcmVzOiBzYW5sb2NrLWxpYiA+PSAle3NhbmxvY2tfdmVyc2lvbn0KKyVlbmRpZgorUmVxdWlyZXMocG9zdCk6IHN5c3RlbWQtdW5pdHMKK1JlcXVpcmVzKHByZXVuKTogc3lzdGVtZC11bml0cworUmVxdWlyZXMocG9zdHVuKTogc3lzdGVtZC11bml0cworCislZGVzY3JpcHRpb24gbG9ja2QKK0xWTSBjb21tYW5kcyB1c2UgbHZtbG9ja2QgdG8gY29vcmRpbmF0ZSBhY2Nlc3MgdG8gc2hhcmVkIHN0b3JhZ2UuCisKKyVwb3N0IGxvY2tkCislZGFlbW9uX3JlbG9hZAorJWVuYWJsZSAtcyBsdm1sb2NrZCAtdCBzZXJ2aWNlCislZW5hYmxlIC1zIGx2bWxvY2tpbmcgLXQgc2VydmljZQorCislcHJldW4gbG9ja2QKKyVkaXNhYmxlIC1zIGx2bWxvY2tpbmcgLXQgc2VydmljZQorJWRpc2FibGUgLXMgbHZtbG9ja2QgLXQgc2VydmljZQorCislcG9zdHVuIGxvY2tkCitpZiBbICQxID0gMCBdOyB0aGVuCislZGFlbW9uX3JlbG9hZAorZmkKKworJWZpbGVzIGxvY2tkCisle19zYmluZGlyfS9sdm1sb2NrZAorJXtfc2JpbmRpcn0vbHZtbG9ja2N0bAorJXtfbWFuZGlyfS9tYW44L2x2bWxvY2tkLjguZ3oKKyV7X21hbmRpcn0vbWFuOC9sdm1sb2NrY3RsLjguZ3oKKyVkaXIgJXtfZGVmYXVsdF9sb2NraW5nX2Rpcn0KKyV7X3VuaXRkaXJ9L2x2bTItbHZtbG9ja2Quc2VydmljZQorJXtfdW5pdGRpcn0vbHZtMi1sdm1sb2NraW5nLnNlcnZpY2UKKyVlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2x1c3RlciBzdWJwYWNrYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyVpZiAle2hhdmVfd2l0aCBjbHZtZH0KKworJXBhY2thZ2UgY2x1c3RlcgorU3VtbWFyeTogQ2x1c3RlciBleHRlbnNpb25zIGZvciB1c2VybGFuZCBsb2dpY2FsIHZvbHVtZSBtYW5hZ2VtZW50IHRvb2xzCitMaWNlbnNlOiBHUEx2MgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9CYXNlCitSZXF1aXJlczogbHZtMiA+PSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzKHBvc3QpOiBjaGtjb25maWcKK1JlcXVpcmVzKHByZXVuKTogY2hrY29uZmlnCitSZXF1aXJlcyhwcmV1bik6IGRldmljZS1tYXBwZXIgPj0gJXtkZXZpY2VfbWFwcGVyX3ZlcnNpb259CitSZXF1aXJlcyhwcmV1bik6IGx2bTIgPj0gMi4wMgorJW1heWJlIFJlcXVpcmVzOiAle3JlcV9jbHVzdGVyfQorCislZGVzY3JpcHRpb24gY2x1c3RlcgorCitFeHRlbnNpb25zIHRvIExWTTIgdG8gc3VwcG9ydCBjbHVzdGVycy4KKworJXBvc3QgY2x1c3RlcgorJWRhZW1vbl9yZWxvYWQKKyVlbmFibGUgLXMgY2x2bWQgLXQgc2VydmljZQorJWlmICV7aGF2ZV9zZXJ2aWNlIGNsdm1kfQoraWYgWyAkMSA9IDIgXTsgdGhlbgorCWlmIFsgLWUgJXtfZGVmYXVsdF9waWRfZGlyfS9jbHZtZC5waWQgXTsgdGhlbgorCQkle19zYmluZGlyfS9jbHZtZCAtUyA+L2Rldi9udWxsIDI+JjEgfHwgOgorCWZpCitmaQorJWVuZGlmCisKKyVwcmV1biBjbHVzdGVyCislZGlzYWJsZSAtcyBjbHZtZCAtdCBzZXJ2aWNlCislaWYgJXtoYXZlX3NlcnZpY2UgY2x2bWR9CitpZiBbICQxID0gMCBdOyB0aGVuCisJIyBsdm1jb25mIG1heSBubyBsb25nZXIgZXhpc3QgaWYgbHZtMiBpcyBiZWluZyByZW1vdmVkIGluIHRoZSBzYW1lIHJwbSBydW4KKwlpZiB0ZXN0IC14IC9zYmluL2x2bWNvbmY7IHRoZW4gL3NiaW4vbHZtY29uZiAtLWRpc2FibGUtY2x1c3RlcjsgZmkKK2ZpCislZW5kaWYKKworJXBvc3R1biBjbHVzdGVyCitpZiBbICQxID0gMCBdOyB0aGVuCislZGFlbW9uX3JlbG9hZAorZmkKKworJWZpbGVzIGNsdXN0ZXIKKyVkZWZhdHRyKC0scm9vdCxyb290LC0pCislYXR0cig3NTUscm9vdCxyb290KSAvdXNyL3NiaW4vY2x2bWQKKyV7X21hbmRpcn0vbWFuOC9jbHZtZC44Lmd6CislaWYgJXtlbmFibGVfc3lzdGVtZH0KKyAgJXtfdW5pdGRpcn0vbHZtMi1jbHZtZC5zZXJ2aWNlCisgICV7X3VuaXRkaXJ9L2x2bTItY2x1c3Rlci1hY3RpdmF0aW9uLnNlcnZpY2UKKyAgJXtfdW5pdGRpcn0vLi4vbHZtMi1jbHVzdGVyLWFjdGl2YXRpb24KKyVlbHNlCisgICV7X3N5c2NvbmZkaXJ9L3JjLmQvaW5pdC5kL2Nsdm1kCislZW5kaWYKKworJWVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDbHVzdGVyIG1pcnJvciBzdWJwYWNrYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyVpZiAle2VuYWJsZV9jbWlycm9yfQorCislcGFja2FnZSAtbiBjbWlycm9yCitTdW1tYXJ5OiBEYWVtb24gZm9yIGRldmljZS1tYXBwZXItYmFzZWQgY2x1c3RlcmVkIG1pcnJvcnMKK0dyb3VwOiBTeXN0ZW0gRW52aXJvbm1lbnQvQmFzZQorUmVxdWlyZXMocG9zdCk6IGNoa2NvbmZpZworUmVxdWlyZXMocHJldW4pOiBjaGtjb25maWcKK1JlcXVpcmVzOiBjb3Jvc3luYyA+PSAle2Nvcm9zeW5jX3ZlcnNpb259CitSZXF1aXJlczogZGV2aWNlLW1hcHBlciA+PSAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0tJXtyZWxlYXNlfQorCislZGVzY3JpcHRpb24gLW4gY21pcnJvcgorRGFlbW9uIHByb3ZpZGluZyBkZXZpY2UtbWFwcGVyLWJhc2VkIG1pcnJvcnMgaW4gYSBzaGFyZWQtc3RvcmFnZSBjbHVzdGVyLgorCislcG9zdCAtbiBjbWlycm9yCislZGFlbW9uX3JlbG9hZAorJWVuYWJsZSAtcyBjbWlycm9yZCAtdCBzZXJ2aWNlCisKKyVwcmV1biAtbiBjbWlycm9yCislZGlzYWJsZSAtcyBjbWlycm9yZCAtdCBzZXJ2aWNlCisKKyVwb3N0dW4gLW4gY21pcnJvcgorJXRyeV9yZXN0YXJ0IC1zIGNtaXJyb3JkIC10IHNlcnZpY2UKK2lmIFsgJDEgPSAwIF07IHRoZW4KKyVkYWVtb25fcmVsb2FkCitmaQorCislZmlsZXMgLW4gY21pcnJvcgorJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyVhdHRyKDc1NSxyb290LHJvb3QpIC91c3Ivc2Jpbi9jbWlycm9yZAorJXtfbWFuZGlyfS9tYW44L2NtaXJyb3JkLjguZ3oKKyVpZiAle2VuYWJsZV9zeXN0ZW1kfQorICAle191bml0ZGlyfS9sdm0yLWNtaXJyb3JkLnNlcnZpY2UKKyVlbHNlCisgICV7X3N5c2NvbmZkaXJ9L3JjLmQvaW5pdC5kL2NtaXJyb3JkCislZW5kaWYKKworJWVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQeXRob24gYmluZGluZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJWlmICV7ZW5hYmxlX3B5dGhvbn0KKyVwYWNrYWdlIHB5dGhvbi1saWJzCitTdW1tYXJ5OiBQeXRob24gbW9kdWxlIHRvIGFjY2VzcyBMVk0KK0xpY2Vuc2U6IExHUEx2MgorR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcworUHJvdmlkZXM6IHB5dGhvbi1sdm0gPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiAle25hbWV9LWxpYnMgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KKworJWRlc2NyaXB0aW9uIHB5dGhvbi1saWJzCitQeXRob24gbW9kdWxlIHRvIGFsbG93IHRoZSBjcmVhdGlvbiBhbmQgdXNlIG9mIExWTQorbG9naWNhbCB2b2x1bWVzLCBwaHlzaWNhbCB2b2x1bWVzLCBhbmQgdm9sdW1lIGdyb3Vwcy4KKworJWZpbGVzIHB5dGhvbi1saWJzCisle3B5dGhvbl9zaXRlYXJjaH0vKgorJWVuZGlmCisKKyVpZiAle2VuYWJsZV9weXRob24zfQorJXBhY2thZ2UgcHl0aG9uMy1saWJzCitTdW1tYXJ5OiBQeXRob24gMyBtb2R1bGUgdG8gYWNjZXNzIExWTQorTGljZW5zZTogTEdQTHYyCitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCitQcm92aWRlczogcHl0aG9uMy1sdm0gPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiAle25hbWV9LWxpYnMgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KKworJWRlc2NyaXB0aW9uIHB5dGhvbjMtbGlicworUHl0aG9uIDMgbW9kdWxlIHRvIGFsbG93IHRoZSBjcmVhdGlvbiBhbmQgdXNlIG9mIExWTQorbG9naWNhbCB2b2x1bWVzLCBwaHlzaWNhbCB2b2x1bWVzLCBhbmQgdm9sdW1lIGdyb3Vwcy4KKworJWZpbGVzIHB5dGhvbjMtbGlicworJXtweXRob24zX3NpdGVhcmNofS8qLnNvCisle3B5dGhvbjNfc2l0ZWFyY2h9LyouZWdnLWluZm8KKyVlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTFZNIEQtQnVzIGRhZW1vbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCislaWYgJXtlbmFibGVfZGJ1c2R9CislcGFja2FnZSBkYnVzZAorU3VtbWFyeTogTFZNMiBELUJ1cyBkYWVtb24KK0xpY2Vuc2U6IEdQTHYyCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0Jhc2UKK1JlcXVpcmVzOiBsdm0yID49ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6IGRidXMKK1JlcXVpcmVzOiBweXRob24zLWRidXMKK1JlcXVpcmVzOiBweXRob24zLXB5dWRldgorUmVxdWlyZXM6IHB5dGhvbjMtZ29iamVjdC1iYXNlCitSZXF1aXJlcyhwb3N0KTogc3lzdGVtZC11bml0cyA+PSAle3N5c3RlbWRfdmVyc2lvbn0KK1JlcXVpcmVzKHByZXVuKTogc3lzdGVtZC11bml0cyA+PSAle3N5c3RlbWRfdmVyc2lvbn0KK1JlcXVpcmVzKHBvc3R1bik6IHN5c3RlbWQtdW5pdHMgPj0gJXtzeXN0ZW1kX3ZlcnNpb259CisKKyVkZXNjcmlwdGlvbiBkYnVzZAorCitEYWVtb24gZm9yIGFjY2VzcyB0byBMVk0yIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBhIEQtQnVzIGludGVyZmFjZS4KKworJXBvc3QgZGJ1c2QKKyVzeXN0ZW1kX3Bvc3QgbHZtMi1sdm1kYnVzZC5zZXJ2aWNlCisKKyVwcmV1biBkYnVzZAorJXN5c3RlbWRfcHJldW4gbHZtMi1sdm1kYnVzZC5zZXJ2aWNlCisKKyVwb3N0dW4gZGJ1c2QKKyVzeXN0ZW1kX3Bvc3R1biBsdm0yLWx2bWRidXNkLnNlcnZpY2UKKworJWZpbGVzIGRidXNkCislZGVmYXR0cig1NTUscm9vdCxyb290LC0pCisle19zYmluZGlyfS9sdm1kYnVzZAorJWRlZmF0dHIoNDQ0LHJvb3Qscm9vdCwtKQorJXtfc3lzY29uZmRpcn0vZGJ1cy0xL3N5c3RlbS5kL2NvbS5yZWRoYXQubHZtZGJ1czEuY29uZgorJXtfZGF0YWRpcn0vZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcy9jb20ucmVkaGF0Lmx2bWRidXMxLnNlcnZpY2UKKyV7X21hbmRpcn0vbWFuOC9sdm1kYnVzZC44Lmd6Cisle191bml0ZGlyfS9sdm0yLWx2bWRidXNkLnNlcnZpY2UKKyV7cHl0aG9uM19zaXRlbGlifS9sdm1kYnVzZC8qCisKKyVlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdHN1aXRlIHN1YnBhY2thZ2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJWlmICV7ZW5hYmxlX3Rlc3RzdWl0ZX0KKyVwYWNrYWdlIHRlc3RzdWl0ZQorU3VtbWFyeTogTFZNMiBUZXN0c3VpdGUKK0xpY2Vuc2U6IExHUEx2MgorR3JvdXA6IERldmVsb3BtZW50CisKKyVkZXNjcmlwdGlvbiB0ZXN0c3VpdGUKK0FuIGV4dGVuc2l2ZSBmdW5jdGlvbmFsIHRlc3RzdWl0ZSBmb3IgTFZNMi4KKworJWZpbGVzIHRlc3RzdWl0ZQorJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyV7X2RhdGFkaXJ9L2x2bTItdGVzdHN1aXRlLworJXtfbGliZXhlY2Rpcn0vbHZtMi10ZXN0c3VpdGUvCisle19iaW5kaXJ9L2x2bTItdGVzdHN1aXRlCislZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERldmljZS1tYXBwZXIgc3VicGFja2FnZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJXBhY2thZ2UgLW4gZGV2aWNlLW1hcHBlcgorU3VtbWFyeTogRGV2aWNlIG1hcHBlciB1dGlsaXR5CitWZXJzaW9uOiAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0KK1JlbGVhc2U6ICV7cmVsZWFzZX0KK0xpY2Vuc2U6IEdQTHYyCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0Jhc2UKK1VSTDogaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9kbQorUmVxdWlyZXM6IGRldmljZS1tYXBwZXItbGlicyA9ICV7ZGV2aWNlX21hcHBlcl92ZXJzaW9ufS0le3JlbGVhc2V9CitSZXF1aXJlczogdXRpbC1saW51eCA+PSAyLjE1CislbWF5YmUgUmVxdWlyZXM6ICV7cmVxX3VkZXZ9CislaWYgJXtlbmFibGVfdWRldn0KKyMgV2UgbmVlZCBkcmFjdXQgdG8gaW5zdGFsbCByZXF1aXJlZCB1ZGV2IHJ1bGVzIGlmIHVkZXZfc3luYworIyBmZWF0dXJlIGlzIHR1cm5lZCBvbiBzbyB3ZSBkb24ndCBsb3NlIHJlcXVpcmVkIG5vdGlmaWNhdGlvbnMuCitDb25mbGljdHM6IGRyYWN1dCA8IDAwMi0xOAorJWVuZGlmCisKKyVkZXNjcmlwdGlvbiAtbiBkZXZpY2UtbWFwcGVyCitUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgdXNlcnNwYWNlIHV0aWxpdHksIGRtc2V0dXAsCitmb3IgdGhlIGtlcm5lbCBkZXZpY2UtbWFwcGVyLgorCislZmlsZXMgLW4gZGV2aWNlLW1hcHBlcgorJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyVkb2MgQ09QWUlORyBDT1BZSU5HLkxJQiBXSEFUU19ORVdfRE0gVkVSU0lPTl9ETSBSRUFETUUgSU5TVEFMTAorJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfc2JpbmRpcn0vZG1zZXR1cAorJXtfc2JpbmRpcn0vZG1zdGF0cworJXtfbWFuZGlyfS9tYW44L2Rtc2V0dXAuOC5negorJXtfbWFuZGlyfS9tYW44L2Rtc3RhdHMuOC5negorJWlmICV7ZW5hYmxlX3VkZXZ9CislZG9jIHVkZXYvMTItZG0tcGVybWlzc2lvbnMucnVsZXMKKyVkaXIgJXtfdWRldmJhc2VkaXJ9CislZGlyICV7X3VkZXZkaXJ9Cisle191ZGV2ZGlyfS8xMC1kbS5ydWxlcworJXtfdWRldmRpcn0vMTMtZG0tZGlzay5ydWxlcworJXtfdWRldmRpcn0vOTUtZG0tbm90aWZ5LnJ1bGVzCislZW5kaWYKKworJXBhY2thZ2UgLW4gZGV2aWNlLW1hcHBlci1kZXZlbAorU3VtbWFyeTogRGV2ZWxvcG1lbnQgbGlicmFyaWVzIGFuZCBoZWFkZXJzIGZvciBkZXZpY2UtbWFwcGVyCitWZXJzaW9uOiAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0KK1JlbGVhc2U6ICV7cmVsZWFzZX0KK0xpY2Vuc2U6IExHUEx2MgorR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcworUmVxdWlyZXM6IGRldmljZS1tYXBwZXIgPSAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6IHBrZ2NvbmZpZworCislZGVzY3JpcHRpb24gLW4gZGV2aWNlLW1hcHBlci1kZXZlbAorVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGZpbGVzIG5lZWRlZCB0byBkZXZlbG9wIGFwcGxpY2F0aW9ucyB0aGF0IHVzZQordGhlIGRldmljZS1tYXBwZXIgbGlicmFyaWVzLgorCislZmlsZXMgLW4gZGV2aWNlLW1hcHBlci1kZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyV7X2xpYmRpcn0vbGliZGV2bWFwcGVyLnNvCisle19pbmNsdWRlZGlyfS9saWJkZXZtYXBwZXIuaAorJXtfbGliZGlyfS9wa2djb25maWcvZGV2bWFwcGVyLnBjCisKKyVwYWNrYWdlIC1uIGRldmljZS1tYXBwZXItbGlicworU3VtbWFyeTogRGV2aWNlLW1hcHBlciBzaGFyZWQgbGlicmFyeQorVmVyc2lvbjogJXtkZXZpY2VfbWFwcGVyX3ZlcnNpb259CitSZWxlYXNlOiAle3JlbGVhc2V9CitMaWNlbnNlOiBMR1BMdjIKK0dyb3VwOiBTeXN0ZW0gRW52aXJvbm1lbnQvTGlicmFyaWVzCitSZXF1aXJlczogZGV2aWNlLW1hcHBlciA9ICV7ZGV2aWNlX21hcHBlcl92ZXJzaW9ufS0le3JlbGVhc2V9CisKKyVkZXNjcmlwdGlvbiAtbiBkZXZpY2UtbWFwcGVyLWxpYnMKK1RoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGV2aWNlLW1hcHBlciBzaGFyZWQgbGlicmFyeSwgbGliZGV2bWFwcGVyLgorCislcG9zdCAtbiBkZXZpY2UtbWFwcGVyLWxpYnMgLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3R1biAtbiBkZXZpY2UtbWFwcGVyLWxpYnMgLXAgL3NiaW4vbGRjb25maWcKKworJWZpbGVzIC1uIGRldmljZS1tYXBwZXItbGlicworJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfbGliZGlyfS9saWJkZXZtYXBwZXIuc28uKgorCislcGFja2FnZSAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50CitTdW1tYXJ5OiBEZXZpY2UtbWFwcGVyIGV2ZW50IGRhZW1vbgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9CYXNlCitWZXJzaW9uOiAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0KK1JlbGVhc2U6ICV7cmVsZWFzZX0KK1JlcXVpcmVzOiBkZXZpY2UtbWFwcGVyID0gJXtkZXZpY2VfbWFwcGVyX3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiBkZXZpY2UtbWFwcGVyLWV2ZW50LWxpYnMgPSAle2RldmljZV9tYXBwZXJfdmVyc2lvbn0tJXtyZWxlYXNlfQorJWlmICV7ZW5hYmxlX3N5c3RlbWR9CitSZXF1aXJlcyhwb3N0KTogc3lzdGVtZC11bml0cworUmVxdWlyZXMocHJldW4pOiBzeXN0ZW1kLXVuaXRzCitSZXF1aXJlcyhwb3N0dW4pOiBzeXN0ZW1kLXVuaXRzCislZW5kaWYKKworJWRlc2NyaXB0aW9uIC1uIGRldmljZS1tYXBwZXItZXZlbnQKK1RoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZG1ldmVudGQgZGFlbW9uIGZvciBtb25pdG9yaW5nIHRoZSBzdGF0ZQorb2YgZGV2aWNlLW1hcHBlciBkZXZpY2VzLgorCislcG9zdCAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50CislZGFlbW9uX3JlbG9hZAorJWlmICV7ZW5hYmxlX3N5c3RlbWR9CitzeXN0ZW1jdGwgcHJlc2V0IGRtLWV2ZW50LnNvY2tldCA+IC9kZXYvbnVsbCAyPiYxIHx8IDoKKyVlbmRpZgoraWYgWyAtZSAle19kZWZhdWx0X3BpZF9kaXJ9L2RtZXZlbnRkLnBpZCBdOyB0aGVuCisgICAgICAgICV7X3NiaW5kaXJ9L2RtZXZlbnRkIC1SIHx8IGVjaG8gIkZhaWxlZCB0byByZXN0YXJ0IGRtZXZlbnRkIGRhZW1vbi4gUGxlYXNlLCB0cnkgbWFudWFsIHJlc3RhcnQuIgorZmkKKworJXByZXVuIC1uIGRldmljZS1tYXBwZXItZXZlbnQKKyVpZiAle2VuYWJsZV9zeXN0ZW1kfQoraWYgWyAkMSA9IDAgXTsgdGhlbgorCXN5c3RlbWN0bCAtLW5vLXJlbG9hZCBkaXNhYmxlIGRtLWV2ZW50LnNlcnZpY2UgZG0tZXZlbnQuc29ja2V0ID4gL2Rldi9udWxsIDI+JjEgfHwgOgorCXN5c3RlbWN0bCBzdG9wIGRtLWV2ZW50LnNlcnZpY2UgZG0tZXZlbnQuc29ja2V0PiAvZGV2L251bGwgMj4mMSB8fCA6CitmaQorJWVuZGlmCisKKyVwb3N0dW4gLW4gZGV2aWNlLW1hcHBlci1ldmVudAoraWYgWyAkMSA9IDAgXTsgdGhlbgorJWRhZW1vbl9yZWxvYWQKK2ZpCisKKyVmaWxlcyAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50CislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJXtfc2JpbmRpcn0vZG1ldmVudGQKKyV7X21hbmRpcn0vbWFuOC9kbWV2ZW50ZC44Lmd6CislaWYgJXtlbmFibGVfc3lzdGVtZH0KKyV7X3VuaXRkaXJ9L2RtLWV2ZW50LnNvY2tldAorJXtfdW5pdGRpcn0vZG0tZXZlbnQuc2VydmljZQorJWVuZGlmCisKKyVwYWNrYWdlIC1uIGRldmljZS1tYXBwZXItZXZlbnQtbGlicworU3VtbWFyeTogRGV2aWNlLW1hcHBlciBldmVudCBkYWVtb24gc2hhcmVkIGxpYnJhcnkKK1ZlcnNpb246ICV7ZGV2aWNlX21hcHBlcl92ZXJzaW9ufQorUmVsZWFzZTogJXtyZWxlYXNlfQorTGljZW5zZTogTEdQTHYyCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0xpYnJhcmllcworCislZGVzY3JpcHRpb24gLW4gZGV2aWNlLW1hcHBlci1ldmVudC1saWJzCitUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRldmljZS1tYXBwZXIgZXZlbnQgZGFlbW9uIHNoYXJlZCBsaWJyYXJ5LAorbGliZGV2bWFwcGVyLWV2ZW50LgorCislcG9zdCAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50LWxpYnMgLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3R1biAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50LWxpYnMgLXAgL3NiaW4vbGRjb25maWcKKworJWZpbGVzIC1uIGRldmljZS1tYXBwZXItZXZlbnQtbGlicworJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfbGliZGlyfS9saWJkZXZtYXBwZXItZXZlbnQuc28uKgorCislcGFja2FnZSAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50LWRldmVsCitTdW1tYXJ5OiBEZXZlbG9wbWVudCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMgZm9yIHRoZSBkZXZpY2UtbWFwcGVyIGV2ZW50IGRhZW1vbgorVmVyc2lvbjogJXtkZXZpY2VfbWFwcGVyX3ZlcnNpb259CitSZWxlYXNlOiAle3JlbGVhc2V9CitMaWNlbnNlOiBMR1BMdjIKK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKK1JlcXVpcmVzOiBkZXZpY2UtbWFwcGVyLWV2ZW50ID0gJXtkZXZpY2VfbWFwcGVyX3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiBwa2djb25maWcKKworJWRlc2NyaXB0aW9uIC1uIGRldmljZS1tYXBwZXItZXZlbnQtZGV2ZWwKK1RoaXMgcGFja2FnZSBjb250YWlucyBmaWxlcyBuZWVkZWQgdG8gZGV2ZWxvcCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKK3RoZSBkZXZpY2UtbWFwcGVyIGV2ZW50IGxpYnJhcnkuCisKKyVmaWxlcyAtbiBkZXZpY2UtbWFwcGVyLWV2ZW50LWRldmVsCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJXtfbGliZGlyfS9saWJkZXZtYXBwZXItZXZlbnQuc28KKyV7X2luY2x1ZGVkaXJ9L2xpYmRldm1hcHBlci1ldmVudC5oCisle19saWJkaXJ9L3BrZ2NvbmZpZy9kZXZtYXBwZXItZXZlbnQucGMKKwpkaWZmIC0tZ2l0IGEvc3BlYy9zb3VyY2UuaW5jIGIvc3BlYy9zb3VyY2UuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjI5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVjL3NvdXJjZS5pbmMKQEAgLTAsMCArMSwxOTUgQEAKKyVpbXBvcnQgbWFjcm9zLmluYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWZhdWx0cyAocmF3aGlkZSkuLi4gCisKKyVnbG9iYWwgZW5hYmxlX3Byb2ZpbGluZyAwCislZ2xvYmFsIGVuYWJsZV90ZXN0c3VpdGUgMQorJWdsb2JhbCBlbmFibGVfcHl0aG9uIDEKKyMgT2ZmIGJ5IGRlZmF1bHQgLSA8PSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBvcjoKKyVnbG9iYWwgZW5hYmxlX3B5dGhvbjMgMAorJWdsb2JhbCBlbmFibGVfZGJ1c2QgMAorJWdsb2JhbCBlbmFibGVfdWRldiAxCislZ2xvYmFsIGVuYWJsZV9zeXN0ZW1kIDEKKyVnbG9iYWwgZW5hYmxlX2NtaXJyb3IgMQorJWdsb2JhbCBlbmFibGVfbHZtbG9ja2QgMQorJWdsb2JhbCBlbmFibGVfbHZtZXRhZCAxCislZ2xvYmFsIGVuYWJsZV9sdm1wb2xsZCAxCisjJWdsb2JhbCBlbmFibGVfbG9ja2RfZGxtIDAKKyMlZ2xvYmFsIGVuYWJsZV9sb2NrZF9zYW5sb2NrIDAKKworJWlmICV7ZW5hYmxlX3VkZXZ9Cislc2VydmljZSBsdm1ldGFkIDEKKyVzZXJ2aWNlIGx2bXBvbGxkIDEKKyVlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3JtYWxseSBjbHVzdGVyaW5nIGlzIG1haW50YWluZWQgdmlhIHJlc291cmNlIGFnZW50cworIworIyBlbmFibGUgc2VydmljZSBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIworJWlmICV7ZW5hYmxlX2NtaXJyb3J9Cisjc2VydmljZSBjbHZtZCAxCisjc2VydmljZSBjbWlycm9yZCAxCislZW5kaWYKKworJWdsb2JhbCBidWlsZHJlcV9jbHVzdGVyIGNvcm9zeW5jLWRldmVsID49IDEuOTkuOS0xLCBkbG0tZGV2ZWwgPj0gMy45OS4xLTEKKyVnbG9iYWwgcmVxX2NsdXN0ZXIgY29yb3N5bmMgPj0gMS45OS45LTEsIGRsbSA+PSAzLjk5LjItMQorJXdpdGggY2x2bWQgY29yb3N5bmMKKworIyBUT0RPICVnbG9iYWwgcmVxX2RtX3BlcnNpc3RlbnQgZGV2aWNlLW1hcHBlci1wZXJzaXN0ZW50LWRhdGEgPj0gMC4xLjQKKyV3aXRoIGNhY2hlIGludGVybmFsCisld2l0aCB0aGluIGludGVybmFsCisld2l0aCB0aGluX2NoZWNrICV7X3NiaW5kaXJ9L3RoaW5fY2hlY2sKKyV3aXRoIHRoaW5fcmVwYWlyICV7X3NiaW5kaXJ9L3RoaW5fcmVwYWlyCisld2l0aCB0aGluX2R1bXAgJXtfc2JpbmRpcn0vdGhpbl9kdW1wCisKKyVnbG9iYWwgYnVpbGRyZXFfdWRldiBzeXN0ZW1kLWRldmVsCislZ2xvYmFsIHJlcV91ZGV2IHVkZXYgPj0gMTgxLTEKKworCislaWYgJXtmZWRvcmF9ID49IDIyIHx8ICV7cmhlbH0gPj0gNworICVzZXJ2aWNlIGx2bWxvY2tkIDEKKyAlZGVmaW5lIHNhbmxvY2tfdmVyc2lvbiAzLjIuNC0xCisgJWRlZmluZSBlbmFibGVfbG9ja2RfZGxtIDEKKyAlZGVmaW5lIGVuYWJsZV9sb2NrZF9zYW5sb2NrIDEKKyAlaWYgJXtyaGVsfQorICAlaWZhcmNoIGk2ODYgeDg2XzY0IHMzOTB4CisgICAlZ2xvYmFsIGJ1aWxkcmVxX2xvY2tkX2RsbSBkbG0tZGV2ZWwgPj0gJXtkbG1fdmVyc2lvbn0KKyAgJWVsc2UKKyAgICVkZWZpbmUgZW5hYmxlX2xvY2tkX2RsbSAwCisgICVlbmRpZgorICAlaWZhcmNoIHg4Nl82NCBwcGM2NGxlIHBwYzY0IGFhcmNoNjQKKyAgICVnbG9iYWwgYnVpbGRyZXFfbG9ja2Rfc2FubG9jayBzYW5sb2NrLWRldmVsID49ICV7c2FubG9ja192ZXJzaW9ufQorICAlZWxzZQorICAgJWRlZmluZSBlbmFibGVfbG9ja2Rfc2FubG9jayAwCisgICVlbmRpZgorICVlbmRpZgorJWVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyVpZiAle3JoZWx9ID09IDUKKyVnbG9iYWwgZW5hYmxlX3B5dGhvbiAwCislZW5kaWYKKworJWlmICV7cmhlbH0gPj0gOCB8fCAle2ZlZG9yYX0gPj0gMjAKKyVnbG9iYWwgZW5hYmxlX3B5dGhvbjMgMQorJWVuZGlmCisKKyVpZiAle2VuYWJsZV9weXRob259CisgICVnbG9iYWwgYnVpbGRyZXFfcHl0aG9uMl9kZXZlbCBweXRob24yLWRldmVsCisgICVnbG9iYWwgYnVpbGRyZXFfcHl0aG9uX3NldHVwdG9vbHMgcHl0aG9uLXNldHVwdG9vbHMKKyVlbmRpZgorJWlmICV7ZW5hYmxlX3B5dGhvbjN9CisgICVnbG9iYWwgYnVpbGRyZXFfcHl0aG9uM19kZXZlbCBweXRob24zLWRldmVsCisgICVnbG9iYWwgYnVpbGRyZXFfcHl0aG9uX3NldHVwdG9vbHMgcHl0aG9uLXNldHVwdG9vbHMKKyVlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCislaWYgJXtyaGVsfSA+PSA4IHx8ICV7ZmVkb3JhfSA+PSAyMworICAlaWYgJXtlbmFibGVfcHl0aG9uM30KKyAgICAlZ2xvYmFsIGVuYWJsZV9kYnVzZCAxCisgICVlbHNlCisgICAgIyBkYnVzZCByZXF1aXJlcyBweXRob24zCisgICAgZmFsc2UKKyAgJWVuZGlmCislZW5kaWYKKworJWlmICV7ZW5hYmxlX2RidXNkfQorICAlZ2xvYmFsIGJ1aWxkcmVxX3B5dGhvbjNfZGJ1cyBweXRob24zLWRidXMKKyAgJWdsb2JhbCBidWlsZHJlcV9weXRob24zX3B5dWRldiBweXRob24zLXB5dWRldgorJWVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyVpZiAle2ZlZG9yYX0gPT0gMTYgfHwgJXtyaGVsfSA9PSA2CislZ2xvYmFsIGVuYWJsZV9zeXN0ZW1kIDAKKworJWdsb2JhbCBidWlsZHJlcV91ZGV2IGxpYnVkZXYtZGV2ZWwKKyVnbG9iYWwgYnVpbGRyZXFfY2x1c3RlciBvcGVuYWlzbGliLWRldmVsID49IDEuMS4xLTEsIGNsdXN0ZXJsaWItZGV2ZWwgPj0gMy4wLjYtMSwgY29yb3N5bmNsaWItZGV2ZWwgPj0gMS4yLjAtMQorCislZ2xvYmFsIHJlcV91ZGV2IHVkZXYgPj0gMTU4LTEKKyVnbG9iYWwgcmVxX2NsdXN0ZXIgb3BlbmFpcyA+PSAxLjEuMS0xLCBjbWFuID49IDMuMC42LTEsIGNvcm9zeW5jID49IDEuMi4wLTEKKworJWdsb2JhbCBfdWRldmJhc2VkaXIgL2xpYi91ZGV2CislZ2xvYmFsIF91ZGV2ZGlyICV7X3VkZXZiYXNlZGlyfS9ydWxlcy5kCislZW5kaWYKKworJWlmICV7ZmVkb3JhfSA9PSAxNgorJXdpdGggY2FjaGUgbm9uZQorJXdpdGggdGhpbiBub25lCisld2l0aCB0aGluX2NoZWNrCisld2l0aCB0aGluX3JlcGFpcgorJXdpdGggdGhpbl9kdW1wCislZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJWlmICV7ZmVkb3JhfSA9PSAxNworJWdsb2JhbCBidWlsZHJlcV91ZGV2IHN5c3RlbWQtZGV2ZWwKKyVnbG9iYWwgYnVpbGRyZXFfY2x1c3RlciBjb3Jvc3luYy1kZXZlbCA+PSAxLjk5LjktMSwgZGxtLWRldmVsID49IDMuOTkuMS0xCisKKyVnbG9iYWwgcmVxX3VkZXYgdWRldiA+PSAxODEtMQorJWdsb2JhbCByZXFfZG1fcGVyc2lzdGVudCBkZXZpY2UtbWFwcGVyLXBlcnNpc3RlbnQtZGF0YSA+PSAwLjEuNAorJWdsb2JhbCByZXFfY2x1c3RlciBjb3Jvc3luYyA+PSAxLjk5LjktMSwgZGxtID49IDMuOTkuMi0xCislZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2FtZSBhcyBGQyAxNiBhYm92ZSwgb25seSB3aXRoIG9sZGVyIHVkZXYKKworJWlmICV7cmhlbH0gPT0gNgorJWRlZmluZSByZXFfdWRldiB1ZGV2ID49IDE0Ny0yCislZ2xvYmFsIHJlcV9kbV9wZXJzaXN0ZW50IGRldmljZS1tYXBwZXItcGVyc2lzdGVudC1kYXRhID49IDAuMS40CislZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEbyBub3QgcmVzZXQgUmVsZWFzZSB0byAxIHVubGVzcyBib3RoIGx2bTIgYW5kIGRldmljZS1tYXBwZXIKKyMgdmVyc2lvbnMgYXJlIGluY3JlYXNlZCB0b2dldGhlci4KKworJWRlZmluZSBkZXZpY2VfbWFwcGVyX3ZlcnNpb24gMS4wMi45NworCitTdW1tYXJ5OiBVc2VybGFuZCBsb2dpY2FsIHZvbHVtZSBtYW5hZ2VtZW50IHRvb2xzCitOYW1lOiBsdm0yCitWZXJzaW9uOiAyLjAyLjEyMAorUmVsZWFzZTogMSV7P2Rpc3R9CitMaWNlbnNlOiBHUEx2MgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9CYXNlCitVUkw6IGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vbHZtMgorU291cmNlMDogZnRwOi8vc291cmNlcy5yZWRoYXQuY29tL3B1Yi9sdm0yL0xWTTIuJXt2ZXJzaW9ufS50Z3oKK1NvdXJjZTkxOiBzb3VyY2UuaW5jCitTb3VyY2U5MjogYnVpbGQuaW5jCitTb3VyY2U5MzogcGFja2FnZXMuaW5jCitTb3VyY2U5NDogbWFjcm9zLmluYworCitCdWlsZFJlcXVpcmVzOiBsaWJzZWxpbnV4LWRldmVsID49IDEuMzAuMTktNCwgbGlic2Vwb2wtZGV2ZWwKK0J1aWxkUmVxdWlyZXM6IG5jdXJzZXMtZGV2ZWwKK0J1aWxkUmVxdWlyZXM6IHJlYWRsaW5lLWRldmVsCitCdWlsZFJlcXVpcmVzOiBtb2R1bGUtaW5pdC10b29scworQnVpbGRSZXF1aXJlczogcGtnY29uZmlnCisKKyMgRXhwYW5kcyB0byBub3RoaW5nIHVubGVzcyBhdCBsZWFzdCAyIGFyZ3VtZW50cyBhcmUgZ2l2ZW4KKyVkZWZpbmUgbWF5YmUoKSBcCislaWYgJSh0ZXN0IC1uICIlez8yfSIgJiYgZWNobyAxIHx8IGVjaG8gMCkgXAorJSogXAorJWVuZGlmCislZGVmaW5lIGlmd2l0aCgpIFwKKyVpZiAlKGlmIGVjaG8gJXt3aXRoX2ZsYWdzfSB8IGdyZXAgLXEgJTE7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCisKKyVtYXliZSBCdWlsZFJlcXVpcmVzOiAlez9idWlsZHJlcV91ZGV2fQorJW1heWJlIEJ1aWxkUmVxdWlyZXM6ICV7P2J1aWxkcmVxX2NsdXN0ZXJ9CislbWF5YmUgQnVpbGRSZXF1aXJlczogJXs/YnVpbGRyZXFfbG9ja2RfZGxtfQorJW1heWJlIEJ1aWxkUmVxdWlyZXM6ICV7P2J1aWxkcmVxX2xvY2tkX3NhbmxvY2t9CislbWF5YmUgQnVpbGRSZXF1aXJlczogJXs/YnVpbGRyZXFfcHl0aG9uMl9kZXZlbH0KKyVtYXliZSBCdWlsZFJlcXVpcmVzOiAlez9idWlsZHJlcV9weXRob24zX2RldmVsfQorJW1heWJlIEJ1aWxkUmVxdWlyZXM6ICV7P2J1aWxkcmVxX3B5dGhvbl9zZXR1cHRvb2xzfQorCislZGVzY3JpcHRpb24KK0xWTTIgaW5jbHVkZXMgYWxsIG9mIHRoZSBzdXBwb3J0IGZvciBoYW5kbGluZyByZWFkL3dyaXRlIG9wZXJhdGlvbnMgb24KK3BoeXNpY2FsIHZvbHVtZXMgKGhhcmQgZGlza3MsIFJBSUQtU3lzdGVtcywgbWFnbmV0byBvcHRpY2FsLCBldGMuLAorbXVsdGlwbGUgZGV2aWNlcyAoTUQpLCBzZWUgbWRhZGQoOCkgb3IgZXZlbiBsb29wIGRldmljZXMsIHNlZQorbG9zZXR1cCg4KSksIGNyZWF0aW5nIHZvbHVtZSBncm91cHMgKGtpbmQgb2YgdmlydHVhbCBkaXNrcykgZnJvbSBvbmUKK29yIG1vcmUgcGh5c2ljYWwgdm9sdW1lcyBhbmQgY3JlYXRpbmcgb25lIG9yIG1vcmUgbG9naWNhbCB2b2x1bWVzCisoa2luZCBvZiBsb2dpY2FsIHBhcnRpdGlvbnMpIGluIHZvbHVtZSBncm91cHMuCmRpZmYgLS1naXQgYS90ZXN0Ly5naXRpZ25vcmUgYi90ZXN0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1MGM2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKy5iaW4tZGlyLXN0YW1wCitiaW4KK2luaXQuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuaW4gYi90ZXN0L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjMxMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzQzIEBACisjIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworI1RFU1RfT1BUUz0tLXZlcmJvc2UgLS1kZWJ1ZworU0hFTExfUEFUSCA/PSAkKFNIRUxMKQorUk0gPz0gcm0gLWYKKworc3ViZGlyID0gJChzaGVsbCBwd2R8c2VkICdzLC4qLywsJykKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKKworTFZNX1RFU1RfUkVTVUxUUyA/PSByZXN1bHRzCisKK1NVQkRJUlMgPSBhcGkgdW5pdAorU09VUkNFUyA9IGxpYi9ub3QuYyBsaWIvaGFybmVzcy5jCitDWFhTT1VSQ0VTID0gbGliL3J1bm5lci5jcHAKK0NYWEZMQUdTICs9ICQoRVhUUkFfRVhFQ19DRkxBR1MpCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitUID89IC4KK1MgPz0gQCAjIG5ldmVyIG1hdGNoIGFueXRoaW5nIGJ5IGRlZmF1bHQKK1ZFUkJPU0UgPz0gMAorQUxMIDo9ICQoc2hlbGwgZmluZCAtTCAkKHNyY2RpcikgXCggLXBhdGggXCovc2hlbGwvXCouc2ggLW9yIC1wYXRoIFwqL2FwaS9cKi5zaCBcKSB8IHNvcnQpCitjb21tYSA9ICwKK1JVTiA6PSAkKHNoZWxsIGZpbmQgLUwgJChzcmNkaXIpIC1yZWdleHR5cGUgcG9zaXgtZWdyZXAgXCggLXBhdGggXCovc2hlbGwvXCouc2ggLW9yIC1wYXRoIFwqL2FwaS9cKi5zaCBcKSAtYW5kIC1yZWdleCAiJChzcmNkaXIpLy4qKCQoc3Vic3QgJChjb21tYSksfCwkKFQpKSkuKiIgLWFuZCAtbm90IC1yZWdleCAiJChzcmNkaXIpLy4qKCQoc3Vic3QgJChjb21tYSksfCwkKFMpKSkuKiIgfCBzb3J0KQorUlVOX0JBU0UgPSAkKHN1YnN0ICQoc3JjZGlyKS8sLCQoUlVOKSkKKworaWZlcSAoIkBCVUlMRF9MVk1FVEFEQCIsICJ5ZXMiKQorTFZNRVRBRF9SVU5fQkFTRSA9ICQoUlVOX0JBU0UpCitMVk1FVEFEX05ERVZfRkxBVk9VUiA9ICxuZGV2LWx2bWV0YWQKK0xWTUVUQURfVURFVl9GTEFWT1VSID0gLHVkZXYtbHZtZXRhZAorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1QT0xMREAiLCAieWVzIikKK0xWTVBPTExEX1JVTl9CQVNFID0gJChSVU5fQkFTRSkKK0xWTVBPTExEX05ERVZfRkxBVk9VUiA9ICxuZGV2LWx2bXBvbGxkLG5kZXYtY2x1c3Rlci1sdm1wb2xsZCxuZGV2LWx2bWV0YWQtbHZtcG9sbGQKK0xWTVBPTExEX1VERVZfRkxBVk9VUiA9ICx1ZGV2LWx2bXBvbGxkLHVkZXYtY2x1c3Rlci1sdm1wb2xsZCx1ZGV2LWx2bWV0YWQtbHZtcG9sbGQKK2VuZGlmCisKK2lmZXEgKCJAQlVJTERfTFZNTE9DS0RAIiwgInllcyIpCitMVk1MT0NLRF9SVU5fQkFTRSA9ICQoUlVOX0JBU0UpCitMVk1MT0NLRF9VREVWX0ZMQVZPVVIgPSAsdWRldi1sdm1sb2NrZC10ZXN0CitlbmRpZgorCisjIFNoZWxsIHF1b3RlOworU0hFTExfUEFUSF9TUSA6PSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorCitpZmVxICgiQFVERVZfU1lOQ0AiLCAieWVzIikKK2RtX3VkZXZfc3luY2hyb25pc2F0aW9uID0gMQorZW5kaWYKKworYWxsOiAudGVzdHMtc3RhbXAKKworaGVscDoKKwlAZWNobyAtZSAiXG5BdmFpbGFibGUgdGFyZ2V0czoiCisJQGVjaG8gIiAgYWxsCQkJRGVmYXVsdCB0YXJnZXQsIHJ1biBjaGVjay4iCisJQGVjaG8gIiAgY2hlY2sJCQlSdW4gYWxsIHRlc3RzLiIKKwlAZWNobyAiICBjaGVja19zeXN0ZW0JCVJ1biBhbGwgdGVzdHMgdXNpbmcgdWRldi4iCisJQGVjaG8gIiAgY2hlY2tfbG9jYWwJCVJ1biB0ZXN0cyB3aXRob3V0IGNsdm1kIGFuZCBsdm1ldGFkLiIKKwlAZWNobyAiICBjaGVja19jbHVzdGVyCQlSdW4gdGVzdHMgd2l0aCBjbHVzdGVyIGRhZW1vbi4iCisJQGVjaG8gIiAgY2hlY2tfbHZtZXRhZAkJUnVuIHRlc3RzIHdpdGggbHZtZXRhZCBkYWVtb24uIgorCUBlY2hvICIgIGNoZWNrX2x2bXBvbGxkICAgICAgICAgUnVuIHRlc3RzIHdpdGggbHZtcG9sbGQgZGFlbW9uLiIKKwlAZWNobyAiICBjaGVja19sdm1sb2NrZF9zYW5sb2NrIFJ1biB0ZXN0cyB3aXRoIGx2bWxvY2tkIGFuZCBzYW5sb2NrLiIKKwlAZWNobyAiICBjaGVja19sdm1sb2NrZF9kbG0gICAgIFJ1biB0ZXN0cyB3aXRoIGx2bWxvY2tkIGFuZCBkbG0uIgorCUBlY2hvICIgIGNoZWNrX2x2bWxvY2tkX3Rlc3QgICAgUnVuIHRlc3RzIHdpdGggbHZtbG9ja2QgLS10ZXN0LiIKKwlAZWNobyAiICBjbGVhbgkJCUNsZWFuIGRpci4iCisJQGVjaG8gIiAgaGVscAkJCURpc3BsYXkgY2FsbGFibGUgdGFyZ2V0cy4iCisJQGVjaG8gLWUgIlxuU3VwcG9ydGVkIHZhcmlhYmxlczoiCisJQGVjaG8gIiAgTFZNX1RFU1RfQVVYX1RSQUNFCVNldCBmb3IgdmVyYm9zZSBtZXNzYWdlcyBmb3IgYXV4IHNjcmlwdHMgW10uIgorCUBlY2hvICIgIExWTV9URVNUX0JBQ0tJTkdfREVWSUNFIFNldCBkZXZpY2UgdXNlZCBmb3IgdGVzdGluZyAoc2VlIGFsc28gTFZNX1RFU1RfRElSKS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfQ0FOX0NMT0JCRVJfRE1FU0cgQWxsb3cgdG8gY2xvYmJlciBkbWVzZyBidWZmZXIgd2l0aG91dCAvZGV2L2ttc2cuICgxKSIKKwlAZWNobyAiICBMVk1fVEVTVF9ERVZESVIJU2V0IHRvICcvZGV2JyB0byBydW4gb24gcmVhbCAvZGV2LiIKKwlAZWNobyAiICBMVk1fVEVTVF9ESVIJCVdoZXJlIHRvIGNyZWF0ZSB0ZXN0IGZpbGVzICBbJChMVk1fVEVTVF9ESVIpXS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfTE9DS0lORwlOb3JtYWwgKDEpLCBDbHVzdGVyICgzKS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfTFZNRVRBRAlTdGFydCBsdm1ldGFkICgxKS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfTFZNRVRBRF9ERUJVR19PUFRTICBBbGxvd3MgdG8gb3ZlcnJpZGUgZGVidWcgb3B0cyBbLWwgYWxsXS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfTFZNUE9MTEQJU3RhcnQgbHZtcG9sbGQiCisJQGVjaG8gIiAgTFZNX1RFU1RfTk9ERUJVRwlEbyBub3QgZGVidWcgbHZtIGNvbW1hbmRzLiIKKwlAZWNobyAiICBMVk1fVEVTVF9QQVJBTExFTAlNYXkgc2tpcCBhZ3Jlc2l2ZSB3aXBlIG9mIExWTVRFU1QgcmVzb3VyY2VzLiIKKwlAZWNobyAiICBMVk1fVEVTVF9SRVNVTFRTCVdoZXJlIHRvIGNyZWF0ZSByZXN1bHQgZmlsZXMgW3Jlc3VsdHNdLiIKKwlAZWNobyAiICBMVk1fVEVTVF9USElOX0NIRUNLX0NNRCAgIENvbW1hbmQgZm9yIHRoaW5fY2hlY2sgICBbJChMVk1fVEVTVF9USElOX0NIRUNLX0NNRCldLiIKKwlAZWNobyAiICBMVk1fVEVTVF9USElOX0RVTVBfQ01EICAgIENvbW1hbmQgZm9yIHRoaW5fZHVtcCAgICBbJChMVk1fVEVTVF9USElOX0RVTVBfQ01EKV0uIgorCUBlY2hvICIgIExWTV9URVNUX1RISU5fUkVQQUlSX0NNRCAgQ29tbWFuZCBmb3IgdGhpbl9yZXBhaXIgIFskKExWTV9URVNUX1RISU5fUkVQQUlSX0NNRCldLiIKKwlAZWNobyAiICBMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIENvbW1hbmQgZm9yIHRoaW5fcmVzdG9yZSBbJChMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EKV0uIgorCUBlY2hvICIgIExWTV9URVNUX0NBQ0hFX0NIRUNLX0NNRCAgIENvbW1hbmQgZm9yIGNhY2hlX2NoZWNrICAgWyQoTFZNX1RFU1RfQ0FDSEVfQ0hFQ0tfQ01EKV0uIgorCUBlY2hvICIgIExWTV9URVNUX0NBQ0hFX0RVTVBfQ01EICAgIENvbW1hbmQgZm9yIGNhY2hlX2R1bXAgICAgWyQoTFZNX1RFU1RfQ0FDSEVfRFVNUF9DTUQpXS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfQ0FDSEVfUkVQQUlSX0NNRCAgQ29tbWFuZCBmb3IgY2FjaGVfcmVwYWlyICBbJChMVk1fVEVTVF9DQUNIRV9SRVBBSVJfQ01EKV0uIgorCUBlY2hvICIgIExWTV9URVNUX0NBQ0hFX1JFU1RPUkVfQ01EIENvbW1hbmQgZm9yIGNhY2hlX3Jlc3RvcmUgWyQoTFZNX1RFU1RfQ0FDSEVfUkVTVE9SRV9DTUQpXS4iCisJQGVjaG8gIiAgTFZNX1RFU1RfVU5MSU1JVEVECVNldCB0byBnZXQgdW5saW1pdGVkIHRlc3QgbG9nICg+MzJNQikiCisJQGVjaG8gIiAgTFZNX1ZBTEdSSU5ECQlFbmFibGUgdmFsZ3JpbmQgdGVzdGluZywgZXhlY3MgJCQiVkFMR1JJTkQuCisJQGVjaG8gIiAgTFZNX1ZBTEdSSU5EX0NMVk1ECUVuYWJsZSB2YWxncmluZCB0ZXN0aW5nIG9mIGNsdm1kICgxKS4iCisJQGVjaG8gIiAgTFZNX1ZBTEdSSU5EX0RNRVZFTlRECUVuYWJsZSB2YWxncmluZCB0ZXN0aW5nIG9mIGRtZXZlbnRkICgxKS4iCisJQGVjaG8gIiAgTFZNX1ZBTEdSSU5EX0xWTUVUQUQJRW5hYmxlIHZhbGdyaW5kIHRlc3Rpbmcgb2YgbHZtZXRhZCAoMSkuIgorCUBlY2hvICIgIExWTV9TVFJBQ0UJCUVuYWJsZSBzdHJhY2UgbG9nZ2luZy4iCisJQGVjaG8gIiAgTFZNX0RFQlVHX0xFVkVMCVNldHMgZGVidWdpbmcgbGV2ZWwgZm9yIHZhbGdyaW5kL3N0cmFjZSAodXNlID4gMCkuIgorCUBlY2hvICIgIExWTV9WRVJJRllfVURFVglEZWZhdWx0IHZlcmlmeSBzdGF0ZSBmb3IgbHZtLmNvbmYuIgorCUBlY2hvICIgIFMJCQlTa2lwIGdpdmVuIHRlc3QgKHJlZ2V4KS4iCisJQGVjaG8gIiAgVAkJCVJ1biBnaXZlbiB0ZXN0IChyZWdleCkuIgorCUBlY2hvICIgIFZFUkJPU0UJCVZlcmJvc2Ugb3V0cHV0ICgxKSwgdGltaW5nICgyKS4iCisKK2NoZWNrOiAudGVzdHMtc3RhbXAKKwlWRVJCT1NFPSQoVkVSQk9TRSkgLi9saWIvcnVubmVyIFwKKwkJLS10ZXN0ZGlyIC4gLS1vdXRkaXIgJChMVk1fVEVTVF9SRVNVTFRTKSBcCisJCS0tZmxhdm91cnMgbmRldi12YW5pbGxhLG5kZXYtY2x1c3RlciQoTFZNRVRBRF9OREVWX0ZMQVZPVVIpJChMVk1QT0xMRF9OREVWX0ZMQVZPVVIpIC0tb25seSAkKFQpIC0tc2tpcCAkKFMpCisKK2NoZWNrX3N5c3RlbTogLnRlc3RzLXN0YW1wCisJVkVSQk9TRT0kKFZFUkJPU0UpIC4vbGliL3J1bm5lciBcCisJCS0tdGVzdGRpciAuIC0tb3V0ZGlyICQoTFZNX1RFU1RfUkVTVUxUUykgXAorCQktLWZsYXZvdXJzIHVkZXYtdmFuaWxsYSx1ZGV2LWNsdXN0ZXIkKExWTUVUQURfVURFVl9GTEFWT1VSKSQoTFZNUE9MTERfVURFVl9GTEFWT1VSKSQoTFZNTE9DS0RfVURFVl9GTEFWT1VSKSAtLW9ubHkgJChUKSAtLXNraXAgJChTKQorCitjaGVja19jbHVzdGVyOiAudGVzdHMtc3RhbXAKKwlWRVJCT1NFPSQoVkVSQk9TRSkgLi9saWIvcnVubmVyIFwKKwkJLS10ZXN0ZGlyIC4gLS1vdXRkaXIgJChMVk1fVEVTVF9SRVNVTFRTKSBcCisJCS0tZmxhdm91cnMgbmRldi1jbHVzdGVyIC0tb25seSAkKFQpIC0tc2tpcCAkKFMpCisKK2NoZWNrX2xvY2FsOiAudGVzdHMtc3RhbXAKKwlWRVJCT1NFPSQoVkVSQk9TRSkgLi9saWIvcnVubmVyIFwKKwkJLS10ZXN0ZGlyIC4gLS1vdXRkaXIgJChMVk1fVEVTVF9SRVNVTFRTKSBcCisJCS0tZmxhdm91cnMgbmRldi12YW5pbGxhIC0tb25seSAkKFQpIC0tc2tpcCAkKFMpCisKK2lmZXEgKCJAQlVJTERfTFZNRVRBREAiLCAieWVzIikKK2NoZWNrX2x2bWV0YWQ6IC50ZXN0cy1zdGFtcAorCVZFUkJPU0U9JChWRVJCT1NFKSAuL2xpYi9ydW5uZXIgXAorCQktLXRlc3RkaXIgLiAtLW91dGRpciAkKExWTV9URVNUX1JFU1VMVFMpIFwKKwkJLS1mbGF2b3VycyBuZGV2LWx2bWV0YWQgLS1vbmx5ICQoVCkgLS1za2lwICQoUykKK2VuZGlmCisKK2lmZXEgKCJAQlVJTERfTFZNUE9MTERAIiwgInllcyIpCitjaGVja19sdm1wb2xsZDogLnRlc3RzLXN0YW1wCisJVkVSQk9TRT0kKFZFUkJPU0UpIC4vbGliL3J1bm5lciBcCisJCS0tdGVzdGRpciAuIC0tb3V0ZGlyIHJlc3VsdHMgXAorCQktLWZsYXZvdXJzIG5kZXYtbHZtcG9sbGQsbmRldi1jbHVzdGVyLWx2bXBvbGxkLG5kZXYtbHZtZXRhZC1sdm1wb2xsZCAtLW9ubHkgJChUKSAtLXNraXAgJChTKQorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1MT0NLREAiLCAieWVzIikKK2NoZWNrX2x2bWxvY2tkX3NhbmxvY2s6IC50ZXN0cy1zdGFtcAorCVZFUkJPU0U9JChWRVJCT1NFKSAuL2xpYi9ydW5uZXIgXAorCQktLXRlc3RkaXIgLiAtLW91dGRpciByZXN1bHRzIFwKKwkJLS1mbGF2b3VycyB1ZGV2LWx2bWxvY2tkLXNhbmxvY2sgLS1vbmx5IHNoZWxsL2FhLWx2bWxvY2tkLXNhbmxvY2stcHJlcGFyZS5zaCwkKFQpLHNoZWxsL3p6LWx2bWxvY2tkLXNhbmxvY2stcmVtb3ZlLnNoIC0tc2tpcCAkKFMpCitlbmRpZgorCitpZmVxICgiQEJVSUxEX0xWTUxPQ0tEQCIsICJ5ZXMiKQorY2hlY2tfbHZtbG9ja2RfZGxtOiAudGVzdHMtc3RhbXAKKwlWRVJCT1NFPSQoVkVSQk9TRSkgLi9saWIvcnVubmVyIFwKKwkJLS10ZXN0ZGlyIC4gLS1vdXRkaXIgcmVzdWx0cyBcCisJCS0tZmxhdm91cnMgdWRldi1sdm1sb2NrZC1kbG0gLS1vbmx5IHNoZWxsL2FhLWx2bWxvY2tkLWRsbS1wcmVwYXJlLnNoLCQoVCksc2hlbGwvenotbHZtbG9ja2QtZGxtLXJlbW92ZS5zaCAtLXNraXAgJChTKQorZW5kaWYKKworaWZlcSAoIkBCVUlMRF9MVk1MT0NLREAiLCAieWVzIikKK2NoZWNrX2x2bWxvY2tkX3Rlc3Q6IC50ZXN0cy1zdGFtcAorCVZFUkJPU0U9JChWRVJCT1NFKSAuL2xpYi9ydW5uZXIgXAorCQktLXRlc3RkaXIgLiAtLW91dGRpciByZXN1bHRzIFwKKwkJLS1mbGF2b3VycyB1ZGV2LWx2bWxvY2tkLXRlc3QgLS1vbmx5ICQoVCkgLS1za2lwICQoUykKK2VuZGlmCisKK0RBVEFESVIgPSAkKGRhdGFkaXIpL2x2bTItdGVzdHN1aXRlCitFWEVDRElSID0gJChsaWJleGVjZGlyKS9sdm0yLXRlc3RzdWl0ZQorCitMSUJfRkxBVk9VUlMgPSBcCisgZmxhdm91ci1uZGV2LWNsdXN0ZXItbHZtcG9sbGRcCisgZmxhdm91ci1uZGV2LWNsdXN0ZXJcCisgZmxhdm91ci1uZGV2LWx2bWV0YWQtbHZtcG9sbGRcCisgZmxhdm91ci1uZGV2LWx2bWV0YWRcCisgZmxhdm91ci1uZGV2LWx2bXBvbGxkXAorIGZsYXZvdXItbmRldi12YW5pbGxhXAorIGZsYXZvdXItdWRldi1jbHVzdGVyLWx2bXBvbGxkXAorIGZsYXZvdXItdWRldi1jbHVzdGVyXAorIGZsYXZvdXItdWRldi1sdm1ldGFkLWx2bXBvbGxkXAorIGZsYXZvdXItdWRldi1sdm1ldGFkXAorIGZsYXZvdXItdWRldi1sdm1wb2xsZFwKKyBmbGF2b3VyLXVkZXYtbHZtbG9ja2Qtc2FubG9ja1wKKyBmbGF2b3VyLXVkZXYtbHZtbG9ja2QtZGxtXAorIGZsYXZvdXItdWRldi1sdm1sb2NrZC10ZXN0XAorIGZsYXZvdXItdWRldi12YW5pbGxhCisKK0xJQl9MVk1MT0NLRF9DT05GID0gXAorIHRlc3QtY29yb3N5bmMtY29uZiBcCisgdGVzdC1kbG0tY29uZiBcCisgdGVzdC1zYW5sb2NrLWNvbmYKKworTElCX0xPQ0FMID0gcGF0aHMgcnVubmVyCitMSUJfTk9UID0gbm90CitMSUJfTElOS19OT1QgPSBpbnZhbGlkIGZhaWwgc2hvdWxkCitMSUJfU0hBUkVEID0gY2hlY2sgYXV4IGluaXR0ZXN0IHV0aWxzIGdldCBsdm0td3JhcHBlcgorCitpbnN0YWxsOiAudGVzdHMtc3RhbXAgbGliL3BhdGhzLWluc3RhbGxlZAorCUBlY2hvICQoc3JjZGlyKQorCSQoSU5TVEFMTF9ESVIpICQoREFUQURJUikve3NoZWxsLGFwaSxsaWIsZGJ1c30gJChFWEVDRElSKQorCSQoSU5TVEFMTF9EQVRBKSBzaGVsbC8qLnNoICQoREFUQURJUikvc2hlbGwKKwkkKElOU1RBTExfREFUQSkgYXBpLyouc2ggJChEQVRBRElSKS9hcGkKKwkkKElOU1RBTExfREFUQSkgbGliL21rZTJmcy5jb25mICQoREFUQURJUikvbGliCisJJChJTlNUQUxMX1BST0dSQU0pIGFwaS8qLnt0LHB5fSAkKERBVEFESVIpL2FwaQorCSQoSU5TVEFMTF9QUk9HUkFNKSBkYnVzLyoucHkgJChEQVRBRElSKS9kYnVzLworCSQoSU5TVEFMTF9EQVRBKSBsaWIvcGF0aHMtaW5zdGFsbGVkICQoREFUQURJUikvbGliL3BhdGhzCisJY2QgbGliICYmICQoSU5TVEFMTF9EQVRBKSBcCisJCSQoTElCX0ZMQVZPVVJTKSBcCisJCSQoTElCX0xWTUxPQ0tEX0NPTkYpIFwKKwkJZG0tdmVyc2lvbi1leHBlY3RlZCBcCisJCXZlcnNpb24tZXhwZWN0ZWQgXAorCQkkKERBVEFESVIpL2xpYgorCUBmb3IgaSBpbiBjYWNoZS1tcSBjYWNoZS1zbXEgdGhpbi1wZXJmb3JtYW5jZSA7IGRvIFwKKwkJZWNobyAiJChJTlNUQUxMX0RBVEEpICQoYWJzX3RvcF9zcmNkaXIpL2NvbmYvJCRpLnByb2ZpbGUgJChEQVRBRElSKS9saWIiOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKGFic190b3Bfc3JjZGlyKS9jb25mLyQkaS5wcm9maWxlICQoREFUQURJUikvbGliOyBkb25lCisJY2QgbGliICYmICQoSU5TVEFMTF9TQ1JJUFQpICQoTElCX1NIQVJFRCkgJChEQVRBRElSKS9saWIKKwlAY2QgJChEQVRBRElSKS9saWIgJiYgZm9yIGkgaW4gJChDTURTKTsgZG8gXAorCQllY2hvICIkKExOX1MpIC1mIGx2bS13cmFwcGVyICQkaSI7IFwKKwkJJChMTl9TKSAtZiBsdm0td3JhcHBlciAkJGk7IGRvbmUKKwkkKElOU1RBTExfUFJPR1JBTSkgbGliLyQoTElCX05PVCkgJChFWEVDRElSKQorCUBjZCAkKEVYRUNESVIpICYmIGZvciBpIGluICQoTElCX0xJTktfTk9UKTsgZG8gXAorCQllY2hvICIkKExOX1MpIC1mIG5vdCAkJGkiOyBcCisJCSQoTE5fUykgLWYgbm90ICQkaTsgZG9uZQorCSQoSU5TVEFMTF9QUk9HUkFNKSAtRCBsaWIvcnVubmVyICQoYmluZGlyKS9sdm0yLXRlc3RzdWl0ZQorCitsaWIvc2hvdWxkOiBsaWIvbm90CisJJChMTl9TKSAtZiBub3QgbGliL3Nob3VsZAorCitsaWIvaW52YWxpZDogbGliL25vdAorCSQoTE5fUykgLWYgbm90IGxpYi9pbnZhbGlkCisKK2xpYi9mYWlsOiBsaWIvbm90CisJJChMTl9TKSAtZiBub3QgbGliL2ZhaWwKKworbGliL3J1bm5lcjogbGliL3J1bm5lci5vIC5saWItZGlyLXN0YW1wCisJJChDWFgpICQoTERGTEFHUykgJChFWFRSQV9FWEVDX0xERkxBR1MpIC1vICRAICQ8CisKK2xpYi9ydW5uZXIubzogJCh3aWxkY2FyZCAkKHNyY2RpcikvbGliLyouaCkKKworQ0ZMQUdTX3J1bm5lci5vICs9ICQoRVhUUkFfRVhFQ19DRkxBR1MpCisKK2xpYi8lOiBsaWIvJS5vIC5saWItZGlyLXN0YW1wCisJJChDQykgJChMREZMQUdTKSAtbyAkQCAkPAorCitsaWIvJTogJChzcmNkaXIpL2xpYi8lLnNoIC5saWItZGlyLXN0YW1wCisJY3AgJDwgJEAKKwljaG1vZCAreCAkQAorCitsaWIvZmxhdm91ci0lOiAkKHNyY2RpcikvbGliL2ZsYXZvdXItJS5zaCAubGliLWRpci1zdGFtcAorCWNwICQ8ICRACisKK2xpYi9wYXRocy1jb21tb246ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAubGliLWRpci1zdGFtcCBNYWtlZmlsZQorCWVjaG8gJ2V4cG9ydCBETV9VREVWX1NZTkNIUk9OSVNBVElPTj0kKGRtX3VkZXZfc3luY2hyb25pc2F0aW9uKScgPj4gJEAtdAorCWVjaG8gJ2V4cG9ydCBUSElOPUBUSElOQCcgPj4gJEAtdAorCWVjaG8gJ2V4cG9ydCBSQUlEPUBSQUlEQCcgPj4gJEAtdAorCWVjaG8gJ2V4cG9ydCBDQUNIRT1AQ0FDSEVAJyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTUVUQURfUElERklMRT0iQExWTUVUQURfUElERklMRUAiJyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTVBPTExEX1BJREZJTEU9IkBMVk1QT0xMRF9QSURGSUxFQCInID4+ICRALXQKKwllY2hvICdleHBvcnQgRE1FVkVOVERfUElERklMRT0iQERNRVZFTlREX1BJREZJTEVAIicgPj4gJEAtdAorCWVjaG8gJ2V4cG9ydCBDTFZNRF9QSURGSUxFPSJAQ0xWTURfUElERklMRUAiJyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX1RISU5fQ0hFQ0tfQ01EPSQke0xWTV9URVNUX1RISU5fQ0hFQ0tfQ01ELUBUSElOX0NIRUNLX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX1RISU5fRFVNUF9DTUQ9JCR7TFZNX1RFU1RfVEhJTl9EVU1QX0NNRC1AVEhJTl9EVU1QX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0kJHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtQFRISU5fUkVQQUlSX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX1RISU5fUkVTVE9SRV9DTUQ9JCR7TFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRC1AVEhJTl9SRVNUT1JFX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX0NBQ0hFX0NIRUNLX0NNRD0kJHtMVk1fVEVTVF9DQUNIRV9DSEVDS19DTUQtQENBQ0hFX0NIRUNLX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX0NBQ0hFX0RVTVBfQ01EPSQke0xWTV9URVNUX0NBQ0hFX0RVTVBfQ01ELUBDQUNIRV9EVU1QX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX0NBQ0hFX1JFUEFJUl9DTUQ9JCR7TFZNX1RFU1RfQ0FDSEVfUkVQQUlSX0NNRC1AQ0FDSEVfUkVQQUlSX0NNREB9JyA+PiAkQC10CisJZWNobyAnZXhwb3J0IExWTV9URVNUX0NBQ0hFX1JFU1RPUkVfQ01EPSQke0xWTV9URVNUX0NBQ0hFX1JFU1RPUkVfQ01ELUBDQUNIRV9SRVNUT1JFX0NNREB9JyA+PiAkQC10CisJbXYgJEAtdCAkQAorCitsaWIvcGF0aHMtaW5zdGFsbGVkOiBsaWIvcGF0aHMtY29tbW9uCisJJChSTSkgJEAtdAorCWNhdCBsaWIvcGF0aHMtY29tbW9uID4gJEAtdAorCWVjaG8gJ2luc3RhbGxlZF90ZXN0c3VpdGU9MScgPj4gJEAtdAorCWVjaG8gJ3Rlc3RfZGF0YV9kaXI9IkBkYXRhZGlyQC9sdm0yLXRlc3RzdWl0ZSInID4+ICRALXQKKwllY2hvICdleHBvcnQgUEFUSD1AbGliZXhlY2RpckAvbHZtMi10ZXN0c3VpdGU6QGRhdGFkaXJAL2x2bTItdGVzdHN1aXRlL2xpYjpAZGF0YWRpckAvbHZtMi10ZXN0c3VpdGUvYXBpOiQkUEFUSCcgPj4gJEAtdAorCW12ICRALXQgJEAKKworbGliL3BhdGhzOiBsaWIvcGF0aHMtY29tbW9uCisJJChSTSkgJEAtdAorCWNhdCBsaWIvcGF0aHMtY29tbW9uID4gJEAtdAorCWVjaG8gJ3Rlc3RfZGF0YV9kaXI9IiQoYWJzX3RvcF9idWlsZGRpcikvdGVzdCInID4+ICRALXQKKwllY2hvICd0b3Bfc3JjZGlyPSIkKHRvcF9zcmNkaXIpIicgPj4gJEAtdAorCWVjaG8gJ2Fic190b3BfYnVpbGRkaXI9IiQoYWJzX3RvcF9idWlsZGRpcikiJyA+PiAkQC10CisJZWNobyAnYWJzX3RvcF9zcmNkaXI9IiQoYWJzX3RvcF9zcmNkaXIpIicgPj4gJEAtdAorCWVjaG8gJ2Fic19zcmNkaXI9IiQoYWJzX3NyY2RpcikiJyA+PiAkQC10CisJZWNobyAnYWJzX2J1aWxkZGlyPSIkKGFic19idWlsZGRpcikiJyA+PiAkQC10CisJbXYgJEAtdCAkQAorCitsaWIvdmVyc2lvbi1leHBlY3RlZDogJCh0b3Bfc3JjZGlyKS9WRVJTSU9OIC5saWItZGlyLXN0YW1wCisJY3V0IC1mIDEgLWQgJyAnIDwkPCA+JEAKKworbGliL2RtLXZlcnNpb24tZXhwZWN0ZWQ6ICQodG9wX3NyY2RpcikvVkVSU0lPTl9ETSAubGliLWRpci1zdGFtcAorCWN1dCAtZiAxIC1kICcgJyA8JDwgPiRACisKK0NNRFMgPSBsdm0gJChzaGVsbCBjYXQgJCh0b3BfYnVpbGRkaXIpL3Rvb2xzLy5jb21tYW5kcyAyPi9kZXYvbnVsbCkKK0xJQiA9ICQoYWRkcHJlZml4IGxpYi8sICQoTElCX1NIQVJFRCkgJChMSUJfTE9DQUwpICQoTElCX05PVCkgJChMSUJfTElOS19OT1QpICQoTElCX0ZMQVZPVVJTKSkKKworLnRlc3RzLXN0YW1wOiAkKEFMTCkgJChMSUIpICQoU1VCRElSUykgbGliL3ZlcnNpb24tZXhwZWN0ZWQgbGliL2RtLXZlcnNpb24tZXhwZWN0ZWQKKwlAaWYgdGVzdCAiJChzcmNkaXIpIiAhPSAuIDsgdGhlbiBcCisJCWVjaG8gIkxpbmtpbmcgdGVzdHMgdG8gYnVpbGRkaXIuIjsgXAorCQkkKE1LRElSX1ApIHNoZWxsOyBcCisJCWZvciBmIGluICQoc3Vic3QgJChzcmNkaXIpLywsJChBTEwpKTsgZG8gXAorCQkJJChMTl9TKSAtZiAkKGFic190b3Bfc3JjZGlyKS90ZXN0LyQkZiAkJGY7IFwKKwkJZG9uZTsgXAorCWZpCisJQCQoTUtESVJfUCkgLW0gYT1yd3ggJChMVk1fVEVTVF9SRVNVTFRTKQorCXRvdWNoICRACisKKy5saWItZGlyLXN0YW1wOgorCSQoTUtESVJfUCkgbGliCisJZm9yIGkgaW4gJChDTURTKTsgZG8gJChMTl9TKSAtZiBsdm0td3JhcHBlciBsaWIvJCRpOyBkb25lCisJZm9yIGkgaW4gZGFlbW9ucy9jbHZtZC9jbHZtZCBkYWVtb25zL2RtZXZlbnRkL2RtZXZlbnRkIFwKKwkJdG9vbHMvZG1zZXR1cCBkYWVtb25zL2x2bWV0YWQvbHZtZXRhZCBcCisJCWRhZW1vbnMvbHZtcG9sbGQvbHZtcG9sbGQgOyBkbyBcCisJCSQoTE5fUykgLWYgJChhYnNfdG9wX2J1aWxkZGlyKS8kJGkgbGliLzsgZG9uZQorCSQoTE5fUykgLWYgJChhYnNfdG9wX2J1aWxkZGlyKS90b29scy9kbXNldHVwIGxpYi9kbXN0YXRzCisJJChMTl9TKSAtZiAkKGFic190b3Bfc3JjZGlyKS9jb25mL3RoaW4tcGVyZm9ybWFuY2UucHJvZmlsZSBsaWIvCisJJChMTl9TKSAtZiAkKGFic190b3Bfc3JjZGlyKS9zY3JpcHRzL2ZzYWRtLnNoIGxpYi9mc2FkbQorCXRlc3QgIiQoc3JjZGlyKSIgPSAuIHx8IGZvciBpIGluICQoTElCX0xWTUxPQ0tEX0NPTkYpOyBkbyBcCisJCSQoTE5fUykgLWYgJChhYnNfdG9wX3NyY2RpcikvdGVzdC9saWIvJCRpIGxpYi87IGRvbmUKKwl0b3VjaCAkQAorCitDTEVBTl9ESVJTICs9ICQoTFZNX1RFU1RfUkVTVUxUUykKK2lmbmVxICguLCQoZmlyc3R3b3JkICQoc3JjZGlyKSkpCitDTEVBTl9UQVJHRVRTICs9ICQoUlVOX0JBU0UpICQoYWRkcHJlZml4IGxpYi8sJChMSUJfTFZNTE9DS0RfQ09ORikpCitlbmRpZgorCitDTEVBTl9UQVJHRVRTICs9IC5saWItZGlyLXN0YW1wIC50ZXN0cy1zdGFtcCAkKExJQikgJChhZGRwcmVmaXggbGliLyxcCisJJChDTURTKSBjbHZtZCBkbWV2ZW50ZCBkbXNldHVwIGRtc3RhdHMgbHZtZXRhZCBsdm1wb2xsZCBcCisJaGFybmVzcyB0aGluLXBlcmZvcm1hbmNlLnByb2ZpbGUgZnNhZG0gXAorCWRtLXZlcnNpb24tZXhwZWN0ZWQgdmVyc2lvbi1leHBlY3RlZCBcCisJcGF0aHMtaW5zdGFsbGVkIHBhdGhzLWluc3RhbGxlZC10IHBhdGhzLWNvbW1vbiBwYXRocy1jb21tb24tdCkKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACisKKy5OT1RQQVJBTExFTDoKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL01ha2VmaWxlLmluIGIvdGVzdC9hcGkvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NGRkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworVEFSR0VUUyA9CitpZmVxICgiQEFQUExJQkAiLCAieWVzIikKK1RBUkdFVFMgKz0gdGVzdAorU09VUkNFUyA9IHRlc3QuYworCitUQVJHRVRTICs9IFwKKwlsdnRlc3QudCBcCisJdmdsaXN0LnQgXAorCXBlcmNlbnQudCBcCisJcGVfc3RhcnQudCBcCisJdGhpbl9wZXJjZW50LnQgXAorCXZndGVzdC50CisKK1NPVVJDRVMyID0gXAorCWx2dGVzdC5jIFwKKwl2Z2xpc3QuYyBcCisJcGVyY2VudC5jIFwKKwlwZV9zdGFydC5jIFwKKwl0aGluX3BlcmNlbnQuYyBcCisJdmd0ZXN0LmMKKworZW5kaWYKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK0RFRlMgKz0gLURfUkVFTlRSQU5UCitERVBMSUJTICs9ICQodG9wX2J1aWxkZGlyKS9saWJsdm0vbGlibHZtMmFwcC5zbyAkKHRvcF9idWlsZGRpcikvbGliZG0vbGliZGV2bWFwcGVyLnNvCitMREZMQUdTICs9IC1MJCh0b3BfYnVpbGRkaXIpL2xpYmx2bQorTFZNTElCUyA9IEBMVk0yQVBQX0xJQkAgLWxkZXZtYXBwZXIKKworaWZlcSAoIkBETUVWRU5UREAiLCAieWVzIikKKyAgICAgICBMVk1MSUJTICs9IC1sZGV2bWFwcGVyLWV2ZW50CisgICAgICAgTERGTEFHUyArPSAtTCQodG9wX2J1aWxkZGlyKS9kYWVtb25zL2RtZXZlbnRkCitlbmRpZgorCitMVk1MSUJTICs9ICQoTElCUykKKworJS50OiAlLm8gJChERVBMSUJTKQorCSQoQ0MpIC1vICRAICQoPCkgJChMREZMQUdTKSAkKExWTUxJQlMpCisKK3Rlc3Q6ICQoT0JKRUNUUykgJChERVBMSUJTKQorCSQoQ0MpIC1vICRAICQoT0JKRUNUUykgJChMREZMQUdTKSAkKExWTUxJQlMpICQoUkVBRExJTkVfTElCUykKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgdGVzdC9hcGkvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL2RidXN0ZXN0LnNoIGIvdGVzdC9hcGkvZGJ1c3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0MWViOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL2RidXN0ZXN0LnNoCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDYKKworYXV4IHByZXBhcmVfbHZtZGJ1c2QKKyR0ZXN0X2RhdGFfZGlyL2RidXMvbHZtZGJ1c3Rlc3QucHkgLXYKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL2x2dGVzdC5jIGIvdGVzdC9hcGkvbHZ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxYzk0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL2x2dGVzdC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI3VuZGVmIE5ERUJVRworCisjaW5jbHVkZSAibHZtMmFwcC5oIgorI2luY2x1ZGUgImFzc2VydC5oIgorCisjZGVmaW5lIGVycihhcmdzLi4uKSBcCisJZG8geyBmcHJpbnRmKHN0ZGVyciwgYXJncyk7IGdvdG8gYmFkOyB9IHdoaWxlICgwKQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWx2bV90IGhhbmRsZTsKKwl2Z190IHZnOworCWx2X3QgbHY7CisJaW50IHIgPSAtMTsKKworCWlmICghKGhhbmRsZSA9IGx2bV9pbml0KE5VTEwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKwlpZiAoISh2ZyA9IGx2bV92Z19vcGVuKGhhbmRsZSwgYXJndlsxXSwgInciLCAwKSkpCisJCWVycigiVkcgb3BlbiAlcyBmYWlsZWQuXG4iLCBhcmd2WzFdKTsKKworCWlmICghKGx2ID0gbHZtX2x2X2Zyb21fbmFtZSh2ZywgInRlc3QiKSkpCisgICAgICAgICAgICAgICAgZXJyKCJMViB0ZXN0IG5vdCBmb3VuZC5cbiIpOworCisJaWYgKGx2bV9sdl9kZWFjdGl2YXRlKGx2KSkKKyAgICAgICAgICAgICAgICBlcnIoIkxWIHRlc3QgZGVhY3RpdmF0aW9uIGZhaWxlZC5cbiIpOworCisJaWYgKGx2bV9sdl9hY3RpdmF0ZShsdikpCisgICAgICAgICAgICAgICAgZXJyKCJMViB0ZXN0IGFjdGl2YXRpb24gZmFpbGVkLlxuIik7CisKKwlpZiAobHZtX2x2X2FjdGl2YXRlKGx2KSkKKyAgICAgICAgICAgICAgICBlcnIoIkxWIHRlc3QgcmVwZWF0ZWQgYWN0aXZhdGlvbiBmYWlsZWQuXG4iKTsKKworCWlmIChsdm1fbHZfcmVuYW1lKGx2LCAidGVzdDEiKSkKKwkJZXJyKCJMViB0ZXN0IHJlbmFtZSB0byB0ZXN0MSBmYWlsZWQuXG4iKTsKKworCWlmIChsdm1fbHZfcmVuYW1lKGx2LCAidGVzdDIiKSkKKwkJZXJyKCJMViB0ZXN0MSByZW5hbWUgdG8gdGVzdDIgZmFpbGVkLlxuIik7CisKKwlpZiAobHZtX2x2X3JlbmFtZShsdiwgInRlc3QiKSkKKwkJZXJyKCJMViB0ZXN0MiByZW5hbWUgdG8gdGVzdCBmYWlsZWQuXG4iKTsKKworCWlmIChsdm1fdmdfY2xvc2UodmcpKQorCQllcnIoIlZHIGNsb3NlIGZhaWxlZC5cbiIpOworCisgICAgICAgIHIgPSAwOworYmFkOgorCWx2bV9xdWl0KGhhbmRsZSk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2FwaS9sdnRlc3Quc2ggYi90ZXN0L2FwaS9sdnRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0ZjBmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL2x2dGVzdC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMQorCitsdmNyZWF0ZSAtbiB0ZXN0IC1sIDUgJHZnCithdXggYXBpdGVzdCBsdnRlc3QgJHZnCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy90ZXN0IGx2X25hbWUgdGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9hcGkvcGVfc3RhcnQuYyBiL3Rlc3QvYXBpL3BlX3N0YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzNmM0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL3BlX3N0YXJ0LmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjdW5kZWYgTkRFQlVHCisKKyNpbmNsdWRlICJsdm0yYXBwLmgiCisjaW5jbHVkZSAiYXNzZXJ0LmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJbHZtX3QgaGFuZGxlOworCXZnX3QgdmcgPSBOVUxMOworCXB2X3QgcHY7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworCisJaGFuZGxlID0gbHZtX2luaXQoTlVMTCk7CisgICAgICAgIGFzc2VydChoYW5kbGUpOworCisJdmcgPSBsdm1fdmdfY3JlYXRlKGhhbmRsZSwgYXJndlsxXSk7CisgICAgICAgIGFzc2VydCh2Zyk7CisKKwlpZiAobHZtX3ZnX2V4dGVuZCh2ZywgYXJndlsyXSkpCisJCWFib3J0KCk7CisKKwlwdiA9IGx2bV9wdl9mcm9tX25hbWUodmcsIGFyZ3ZbMl0pOworCWFzc2VydChwdik7CisKKyAgICAgICAgdiA9IGx2bV9wdl9nZXRfcHJvcGVydHkocHYsICJwZV9zdGFydCIpOworICAgICAgICBhc3NlcnQodi5pc192YWxpZCk7CisJZnByaW50ZihzdGRlcnIsICJwZV9zdGFydCA9ICVkXG4iLCAoaW50KXYudmFsdWUuaW50ZWdlcik7CisgICAgICAgIGFzc2VydCh2LnZhbHVlLmludGVnZXIgPT0gMjA0OCAqIDUxMik7CisKKyAgICAgICAgbHZtX3ZnX2Nsb3NlKHZnKTsKKwlsdm1fcXVpdChoYW5kbGUpOworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL3BlX3N0YXJ0LnNoIGIvdGVzdC9hcGkvcGVfc3RhcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkNGQwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL3BlX3N0YXJ0LnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKKworYXV4IGFwaXRlc3QgcGVfc3RhcnQgdGVzdF92ZyAkZGV2MQorCitub3QgdmdzIHRlc3RfdmcKK25vdCBwdnMgJGRldjEKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL3BlcmNlbnQuYyBiL3Rlc3QvYXBpL3BlcmNlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQxNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hcGkvcGVyY2VudC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI3VuZGVmIE5ERUJVRworCisjaW5jbHVkZSAibHZtMmFwcC5oIgorI2luY2x1ZGUgImFzc2VydC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWx2bV90IGhhbmRsZTsKKwl2Z190IHZnID0gTlVMTDsKKwlsdl90IGx2OworCXN0cnVjdCBsdm1fcHJvcGVydHlfdmFsdWUgdjsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIGQ7CisKKwloYW5kbGUgPSBsdm1faW5pdChOVUxMKTsKKyAgICAgICAgYXNzZXJ0KGhhbmRsZSk7CisKKwl2ZyA9IGx2bV92Z19vcGVuKGhhbmRsZSwgYXJndlsxXSwgInIiLCAwKTsKKyAgICAgICAgYXNzZXJ0KHZnKTsKKworCWx2ID0gbHZtX2x2X2Zyb21fbmFtZSh2ZywgInNuYXAiKTsKKyAgICAgICAgYXNzZXJ0KGx2KTsKKworICAgICAgICB2ID0gbHZtX2x2X2dldF9wcm9wZXJ0eShsdiwgInNuYXBfcGVyY2VudCIpOworICAgICAgICBhc3NlcnQodi5pc192YWxpZCk7CisgICAgICAgIGFzc2VydCh2LnZhbHVlLmludGVnZXIgPT0gUEVSQ0VOVF8wKTsKKworCWx2ID0gbHZtX2x2X2Zyb21fbmFtZSh2ZywgIm1pcnIiKTsKKyAgICAgICAgYXNzZXJ0KGx2KTsKKworICAgICAgICB2ID0gbHZtX2x2X2dldF9wcm9wZXJ0eShsdiwgImNvcHlfcGVyY2VudCIpOworICAgICAgICBhc3NlcnQodi5pc192YWxpZCk7CisgICAgICAgIGFzc2VydCh2LnZhbHVlLmludGVnZXIgPT0gUEVSQ0VOVF8xMDApOworCisgICAgICAgIGx2ID0gbHZtX2x2X2Zyb21fbmFtZSh2ZywgInNuYXAyIik7CisgICAgICAgIGFzc2VydChsdik7CisKKyAgICAgICAgdiA9IGx2bV9sdl9nZXRfcHJvcGVydHkobHYsICJzbmFwX3BlcmNlbnQiKTsKKyAgICAgICAgYXNzZXJ0KHYuaXNfdmFsaWQpOworICAgICAgICBhc3NlcnQodi52YWx1ZS5pbnRlZ2VyID09IDUwICogUEVSQ0VOVF8xKTsKKworCWQgPSBsdm1fbHZfZ2V0X3Byb3BlcnR5KGx2LCAiZGF0YV9wZXJjZW50Iik7CisJYXNzZXJ0KGQuaXNfdmFsaWQpOworCWFzc2VydChkLnZhbHVlLmludGVnZXIgPT0gdi52YWx1ZS5pbnRlZ2VyKTsKKworICAgICAgICBsdm1fdmdfY2xvc2UodmcpOworCisJbHZtX3F1aXQoaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2FwaS9wZXJjZW50LnNoIGIvdGVzdC9hcGkvcGVyY2VudC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVjNDQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hcGkvcGVyY2VudC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXgga2VybmVsX2F0X2xlYXN0IDIgNiAzMyB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyCisKK3ZnY3JlYXRlIC1zIDRrICR2ZyAkKGNhdCBERVZJQ0VTKQorbHZjcmVhdGUgLWFleSAtbCA1IC1uIGZvbyAkdmcKK2x2Y3JlYXRlIC1zIC1uIHNuYXAgJHZnL2ZvbyAtbCAzIC1jIDRrCitsdmNyZWF0ZSAtcyAtbiBzbmFwMiAkdmcvZm9vIC1sIDYgLWMgNGsKK2RkIGlmPS9kZXYvemVybyBvZj0iJERNX0RFVl9ESVIvJHZnL3NuYXAyIiBjb3VudD0xIGJzPTEwMjQgb2ZsYWc9ZGlyZWN0CisjIHNraXAgdGVzdCB3aXRoIGJyb2tlbiBrZXJuZWwKK2NoZWNrIGx2X2ZpZWxkICR2Zy9zbmFwMiBkYXRhX3BlcmNlbnQgIjUwLjAwIiB8fCBza2lwCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMSAtbiBtaXJyICR2ZyAtbCAxIC0tbWlycm9ybG9nIGNvcmUKK2x2cyAtYSAkdmcKK2F1eCBhcGl0ZXN0IHBlcmNlbnQgJHZnCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL3B5dGVzdC5zaCBiL3Rlc3QvYXBpL3B5dGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGExY2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hcGkvcHl0ZXN0LnNoCkBAIC0wLDAgKzEsMTA3IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9DTFZNRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RtZXZlbnRkCisKKyMKKyMgVE9ETzoKKyMgbHZtMmFwcCBpcyBub3QgeWV0IGNhcGFibGUgdG8gcmVzcGVjdCBtYW55IGx2bS5jb25mIG9wdGlvbnMKKyMgc2luY2UgYSBsb3Qgb2YgdGhlbSBpcyBzZXQgaW4gL3Rvb2xzL2xpYmx2bWxpbmUKKyMgVW50aWwgZml4ZWQgLSB0ZXN0aW5nIGFsd2F5cyBydW5zIHdpdGggZW5hYmxlZCBtb25pdG9yaW5nCisjIHRodXMgaXQgbmVlZHMgZG1ldmVudGQKKyMKKworIyBFeGFtcGxlIG9mIHVzaW5nICdnZGInIHdpdGggcHl0aG9uOgorIyBnZGIgLWV4IHIgLS1hcmdzIHB5dGhvbiBGVUxMX1BBVEgvbHZtMi90ZXN0L2FwaS9weXRob25fbHZtX3VuaXQucHkgLXYgVGVzdEx2bS50ZXN0X2x2X2FjdGl2ZV9pbmFjdGl2ZQorCisjTG9jYXRlIHRoZSBweXRob24gYmluZGluZyBsaWJyYXJ5IHRvIHVzZS4KK2lmIFtbIC1uICRhYnNfdG9wX2J1aWxkZGlyIF1dOyB0aGVuCisgIHB5dGhvbl9saWI9KCQoZmluZCAkYWJzX3RvcF9idWlsZGRpciAtbmFtZSBsdm0uc28pKQorICBpZiBbWyAkeyNweXRob25fbGliWypdfSAtbmUgMSBdXTsgdGhlbgorICAgIGlmIFtbICR7I3B5dGhvbl9saWJbKl19IC1ndCAxIF1dOyB0aGVuCisgICAgICAjIFVuYWJsZSB0byB0ZXN0IHB5dGhvbiBiaW5kaW5ncyBpZiBtdWx0aXBsZSBsaWJyYXJpZXMgZm91bmQ6CisgICAgICBlY2hvICJGb3VuZCBsZWZ0IG92ZXIgbHZtLnNvOiAke3B5dGhvbl9saWJbKl19IgorICAgICAgZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFVuYWJsZSB0byB0ZXN0IHB5dGhvbiBiaW5kaW5ncyBpZiBsaWJyYXJ5IG5vdCBhdmFpbGFibGUKKyAgICAgIHNraXAgImx2bTItcHl0aG9uLWxpYnMgbm90IGJ1aWx0IgorICAgIGZpCisgIGZpCisKKyAgZXhwb3J0IFBZVEhPTlBBVEg9JChkaXJuYW1lICRweXRob25fbGliKTokUFlUSE9OUEFUSAorZWxpZiBycG0gLXEgbHZtMi1weXRob24tbGlicyAmPi9kZXYvbnVsbDsgdGhlbgorICB0cnVlCitlbHNlCisgIHNraXAgImx2bTItcHl0aG9uLWxpYnMgbmVpdGhlciBidWlsdCBub3IgaW5zdGFsbGVkIgorZmkKKworI0lmIHlvdSBjaGFuZ2UgdGhpcyBjaGFuZ2UgdGhlIHVuaXQgdGVzdCBjYXNlIHRvby4KK2F1eCBwcmVwYXJlX3B2cyA2CisKKyNTZXR1cCB3aGljaCBkZXZpY2VzIHRoZSB1bml0IHRlc3QgY2FuIHVzZS4KK2V4cG9ydCBQWV9VTklUX1BWUz0kKGNhdCBERVZJQ0VTKQorCisjcHl0aG9uX2x2bV91bml0LnB5IC12IC1mCisKKyMgUnVuIGluZGl2aWR1YWwgdGVzdHMgZm9yIHNob3J0ZXIgZXJyb3IgdHJhY2UKK2ZvciBpIGluIFwKKyBsdl9wZXJzaXN0ZW5jZSBcCisgY29uZmlnX2ZpbmRfYm9vbCBcCisgY29uZmlnX292ZXJyaWRlIFwKKyBjb25maWdfcmVsb2FkICBcCisgZHVwZV9sdl9jcmVhdGUgXAorIGdldF9zZXRfZXh0ZW5kX3NpemUgXAorIGx2X2FjdGl2ZV9pbmFjdGl2ZSBcCisgbHZfcHJvcGVydHkgXAorIGx2X3JlbmFtZSBcCisgbHZfcmVzaXplIFwKKyBsdl9zZWcgXAorIGx2X3NpemUgXAorIGx2X3NuYXBzaG90IFwKKyBsdl9zdXNwZW5kIFwKKyBsdl90YWdzIFwKKyBwZXJjZW50X3RvX2Zsb2F0IFwKKyBwdl9jcmVhdGUgXAorIHB2X2VtcHR5X2xpc3RpbmcgXAorIHB2X2dldHRlcnMgXAorIHB2X2xpZmVfY3ljbGUgXAorIHB2X2xvb2t1cF9mcm9tX3ZnIFwKKyBwdl9wcm9wZXJ0eSBcCisgcHZfcmVzaXplIFwKKyBwdl9zZWdzIFwKKyBzY2FuIFwKKyB2ZXJzaW9uIFwKKyB2Z19mcm9tX3B2X2xvb2t1cHMgXAorIHZnX2dldHRlcnMgXAorIHZnX2dldF9uYW1lIFwKKyB2Z19nZXRfc2V0X3Byb3AgXAorIHZnX2dldF91dWlkIFwKKyB2Z19sdl9uYW1lX3ZhbGlkYXRlIFwKKyB2Z19uYW1lcyBcCisgdmdfcmVkdWNlIFwKKyB2Z19yZW1vdmVfcmVzdG9yZSBcCisgdmdfdGFncyBcCisgdmdfdXVpZHMKK2RvCisJcHl0aG9uX2x2bV91bml0LnB5IC12IFRlc3RMdm0udGVzdF8kaQorCXJtIC1mIGRlYnVnLmxvZ19ERUJVRyoKK2RvbmUKKworIyBDSEVDS01FOiBub3QgZm9yIHRlc3Rpbmc/CisjcHl0aG9uX2x2bV91bml0LnB5IC12IFRlc3RMdm0udGVzdF9saXN0aW5nCisjcHl0aG9uX2x2bV91bml0LnB5IC12IFRlc3RMdm0udGVzdF9wdl9tZXRob2RzCmRpZmYgLS1naXQgYS90ZXN0L2FwaS9weXRob25fbHZtX3VuaXQucHkgYi90ZXN0L2FwaS9weXRob25fbHZtX3VuaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVjMzcwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL3B5dGhvbl9sdm1fdW5pdC5weQpAQCAtMCwwICsxLDEwNDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgbHZtCitpbXBvcnQgb3MKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBzeXMKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+IDI6CisJbG9uZyA9IGludAorCisjIFNldCBvZiBiYXNpYyB1bml0IHRlc3RzIGZvciB0aGUgcHl0aG9uIGJpbmRpbmdzLgorIworIyAqKiogV0FSTklORyAqKioKKyMKKyMgVGhpcyB0ZXN0IHRyaWVzIHRvIG9ubHkgbW9kaWZ5IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsaXN0IG9mIGFsbG93ZWQKKyMgUFZzLCBidXQgYW4gZXJyb3IgaW4gaXQgY291bGQgcG90ZW50aWFsbHkgY2F1c2UgZGF0YSBsb3NzIGlmIHJ1biBvbiBhCisjIHByb2R1Y3Rpb24gc3lzdGVtLiAgVGhlcmVmb3JlIGl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdGhhdCB0aGlzIHVuaXQgdGVzdAorIyBub3QgYmUgcnVuIG9uIGEgc3lzdGVtIHRoYXQgY29udGFpbnMgZGF0YSBvZiB2YWx1ZS4KKworZmggPSBOb25lCisKKworZGVmIGwodHh0KToKKwlpZiBvcy5lbnZpcm9uLmdldCgnUFlfVU5JVF9MT0cnKSBpcyBub3QgTm9uZToKKwkJZ2xvYmFsIGZoCisJCWlmIGZoIGlzIE5vbmU6CisJCQlmaCA9IG9wZW4oJy90bXAvbHZtX3B5X3VuaXRfdGVzdF8nICsgcnMoMTApLCAiYSIpCisJCWZoLndyaXRlKHR4dCArICJcbiIpCisJCWZoLmZsdXNoKCkKKworCitkZWYgcnMocmFuZF9sZW49MTApOgorCSIiIgorCUdlbmVyYXRlIGEgcmFuZG9tIHN0cmluZworCSIiIgorCXJldHVybiAnJy5qb2luKAorCQlyYW5kb20uY2hvaWNlKHN0cmluZy5hc2NpaV91cHBlcmNhc2UpZm9yIHggaW4gcmFuZ2UocmFuZF9sZW4pKQorCisKK2RlZiBfZ2V0X2FsbG93ZWRfZGV2aWNlcygpOgorCXJjID0gb3MuZW52aXJvbi5nZXQoJ1BZX1VOSVRfUFZTJykKKwlpZiByYyBpcyBub3QgTm9uZToKKwkJcmMgPSByYy5zcGxpdGxpbmVzKCkKKwkJcmMuc29ydCgpCisJcmV0dXJuIHJjCisKKworY2xhc3MgQWxsb3dlZFBWUyhvYmplY3QpOgorCSIiIgorCVdlIGFyZSBvbmx5IGFsbG93ZWQgdG8gbXVjayB3aXRoIGNlcnRhaW4gUFYsIGZpbHRlciB0byBvbmx5CisJdGhlIG9uZXMgd2UgY2FuIHVzZS4KKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi5oYW5kbGUgPSBOb25lCisJCXNlbGYucHZzX2FsbCA9IE5vbmUKKworCWRlZiBfX2VudGVyX18oc2VsZik6CisJCXJjID0gW10KKworCQlhbGxvd2VkX2RldiA9IF9nZXRfYWxsb3dlZF9kZXZpY2VzKCkKKworCQlpZiBhbGxvd2VkX2RldjoKKwkJCXNlbGYuaGFuZGxlID0gbHZtLmxpc3RQdnMoKQorCQkJc2VsZi5wdnNfYWxsID0gc2VsZi5oYW5kbGUub3BlbigpCisKKwkJCWZvciBwIGluIHNlbGYucHZzX2FsbDoKKwkJCQlpZiBwLmdldE5hbWUoKSBpbiBhbGxvd2VkX2RldjoKKwkJCQkJcmMuYXBwZW5kKHApCisKKwkJI1NvcnQgdGhlbSBjb25zaXN0ZW50bHkKKwkJcmMuc29ydChrZXk9bGFtYmRhIHg6IHguZ2V0TmFtZSgpKQorCQlyZXR1cm4gcmMKKworCWRlZiBfX2V4aXRfXyhzZWxmLCB0X3R5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorCQlpZiBzZWxmLmhhbmRsZToKKwkJCXNlbGYucHZzX2FsbCA9IE5vbmUKKwkJCXNlbGYuaGFuZGxlLmNsb3NlKCkKKworCitjbGFzcyBUZXN0THZtKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworCVZHX1AgPSBvcy5lbnZpcm9uLmdldCgnUFJFRklYJykKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX2dldF9wdl9kZXZpY2VfbmFtZXMoKToKKwkJcmMgPSBbXQorCQl3aXRoIEFsbG93ZWRQVlMoKSBhcyBwdnM6CisJCQlmb3IgcCBpbiBwdnM6CisJCQkJcmMuYXBwZW5kKHAuZ2V0TmFtZSgpKQorCQlyZXR1cm4gcmMKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX2NyZWF0ZV90aGlja19sdihkZXZpY2VfbGlzdCwgbmFtZSk6CisJCXZnID0gbHZtLnZnQ3JlYXRlKFRlc3RMdm0uVkdfUCArICJfIiArIG5hbWUpCisKKwkJZm9yIGQgaW4gZGV2aWNlX2xpc3Q6CisJCQl2Zy5leHRlbmQoZCkKKworCQl2Zy5jcmVhdGVMdkxpbmVhcihuYW1lLCB2Zy5nZXRTaXplKCkgLyAyKQorCQl2Zy5jbG9zZSgpCisJCXZnID0gTm9uZQorCisJQHN0YXRpY21ldGhvZAorCWRlZiBfY3JlYXRlX3RoaW5fcG9vbChkZXZpY2VfbGlzdCwgcG9vbF9uYW1lKToKKwkJdmcgPSBsdm0udmdDcmVhdGUoVGVzdEx2bS5WR19QICsgIl8iICsgcG9vbF9uYW1lKQorCisJCWZvciBkIGluIGRldmljZV9saXN0OgorCQkJdmcuZXh0ZW5kKGQpCisKKwkJdmcuY3JlYXRlTHZUaGlucG9vbCgKKwkJCXBvb2xfbmFtZSwgdmcuZ2V0U2l6ZSgpIC8gMiwgMCwgMCwgbHZtLlRISU5fRElTQ0FSRFNfUEFTU0RPV04sIDEpCisJCXJldHVybiB2ZworCisJQHN0YXRpY21ldGhvZAorCWRlZiBfY3JlYXRlX3RoaW5fbHYocHZfZGV2aWNlcywgbmFtZSk6CisJCXRoaW5fcG9vbF9uYW1lID0gJ3RoaW5fdmdfcG9vbF8nICsgcnMoNCkKKwkJdmcgPSBUZXN0THZtLl9jcmVhdGVfdGhpbl9wb29sKHB2X2RldmljZXMsIHRoaW5fcG9vbF9uYW1lKQorCQl2Zy5jcmVhdGVMdlRoaW4odGhpbl9wb29sX25hbWUsIG5hbWUsIHZnLmdldFNpemUoKSAvIDgpCisJCXZnLmNsb3NlKCkKKwkJdmcgPSBOb25lCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF92Z19uYW1lcygpOgorCQlyYyA9IFtdCisJCXZnX25hbWVzID0gbHZtLmxpc3RWZ05hbWVzKCkKKworCQlmb3IgaSBpbiB2Z19uYW1lczoKKwkJCWlmIGlbMDpsZW4oVGVzdEx2bS5WR19QKV0gPT0gVGVzdEx2bS5WR19QOgorCQkJCXJjLmFwcGVuZChpKQorCisJCXJldHVybiByYworCisJQHN0YXRpY21ldGhvZAorCWRlZiBfZ2V0X2x2KGx2X3ZvbF90eXBlPU5vbmUsIGx2X25hbWU9Tm9uZSk6CisJCXZnX25hbWVfbGlzdCA9IFRlc3RMdm0uX3ZnX25hbWVzKCkKKwkJZm9yIHZnX25hbWUgaW4gdmdfbmFtZV9saXN0OgorCQkJdmcgPSBsdm0udmdPcGVuKHZnX25hbWUsICJ3IikKKwkJCWx2cyA9IHZnLmxpc3RMVnMoKQorCisJCQlmb3IgbHYgaW4gbHZzOgorCQkJCWF0dHIgPSBsdi5nZXRBdHRyKCkKKwkJCQlpZiBsdl92b2xfdHlwZSBvciBsdl9uYW1lOgorCQkJCQlpZiBsdl92b2xfdHlwZSBpcyBub3QgTm9uZSBhbmQgYXR0clswXSA9PSBsdl92b2xfdHlwZToKKwkJCQkJCXJldHVybiBsdiwgdmcKKwkJCQkJZWxpZiBsdl9uYW1lIGlzIG5vdCBOb25lIGFuZCBsdl9uYW1lID09IGx2LmdldE5hbWUoKToKKwkJCQkJCXJldHVybiBsdiwgdmcKKwkJCQllbHNlOgorCQkJCQlyZXR1cm4gbHYsIHZnCisJCQl2Zy5jbG9zZSgpCisJCXJldHVybiBOb25lLCBOb25lCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9yZW1vdmVfdmcodmdfbmFtZSk6CisJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAndycpCisKKwkJcHZzID0gdmcubGlzdFBWcygpCisKKwkJcGVfZGV2aWNlcyA9IFtdCisKKwkJI1JlbW92ZSBvbGQgc25hcHNob3RzIGZpcnN0LCB0aGVuIGx2CisJCWZvciBsdiBpbiB2Zy5saXN0TFZzKCk6CisJCQlhdHRyID0gbHYuZ2V0QXR0cigpCisJCQlpZiBhdHRyWzBdID09ICdzJzoKKwkJCQlsdi5yZW1vdmUoKQorCisJCWx2cyA9IHZnLmxpc3RMVnMoKQorCisJCSNOb3cgcmVtb3ZlIGFueSB0aGluIGxWcworCQlmb3IgbHYgaW4gdmcubGlzdExWcygpOgorCQkJYXR0ciA9IGx2LmdldEF0dHIoKQorCQkJaWYgYXR0clswXSA9PSAnVic6CisJCQkJbHYucmVtb3ZlKCkKKworCQkjbm93IHJlbW92ZSB0aGUgcmVzdAorCQlmb3IgbHYgaW4gdmcubGlzdExWcygpOgorCQkJbmFtZSA9IGx2LmdldE5hbWUoKQorCisJCQkjRG9uJ3QgcmVtb3ZlIHRoZSBoaWRkZW4gb25lcworCQkJaWYgJ190bWV0YScgbm90IGluIG5hbWUgYW5kICdfdGRhdGEnIG5vdCBpbiBuYW1lOgorCQkJCWx2LnJlbW92ZSgpCisKKwkJZm9yIHAgaW4gcHZzOgorCQkJcGVfZGV2aWNlcy5hcHBlbmQocC5nZXROYW1lKCkpCisKKwkJZm9yIHB2IGluIHBlX2RldmljZXNbOi0xXToKKwkJCXZnLnJlZHVjZShwdikKKworCQl2Zy5yZW1vdmUoKQorCQl2Zy5jbG9zZSgpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIF9jbGVhbl91cCgpOgorCQkjQ2xlYXIgb3V0IHRoZSB0ZXN0aW5nIFBWcywgYnV0IG9ubHkgaWYgdGhleSBjb250YWluIHN0dWZmCisJCSN0aGlzIHVuaXQgdGVzdCBjcmVhdGVkCisJCWZvciB2Z19uIGluIFRlc3RMdm0uX3ZnX25hbWVzKCk6CisJCQlUZXN0THZtLl9yZW1vdmVfdmcodmdfbikKKworCQlmb3IgZCBpbiBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCk6CisJCQlsdm0ucHZSZW1vdmUoZCkKKwkJCWx2bS5wdkNyZWF0ZShkKQorCisJZGVmIHNldFVwKHNlbGYpOgorCQlkZXZpY2VfbGlzdCA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCisJCSNNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhZGVxdWF0ZSBudW1iZXIgb2YgUFZzIHRvIHVzZQorCQlzZWxmLmFzc2VydFRydWUobGVuKGRldmljZV9saXN0KSA+PSA0KQorCQlUZXN0THZtLl9jbGVhbl91cCgpCisKKwlkZWYgdGVhckRvd24oc2VsZik6CisJCVRlc3RMdm0uX2NsZWFuX3VwKCkKKworCWRlZiB0ZXN0X3B2X3Jlc2l6ZShzZWxmKToKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJcHYgPSBwdnNbMF0KKwkJCWN1cnJfc2l6ZSA9IHB2LmdldFNpemUoKQorCQkJZGV2X3NpemUgPSBwdi5nZXREZXZTaXplKCkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShjdXJyX3NpemUgPT0gZGV2X3NpemUpCisJCQlwdi5yZXNpemUoY3Vycl9zaXplIC8gMikKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJcHYgPSBwdnNbMF0KKwkJCXJlc2l6ZWRfc2l6ZSA9IHB2LmdldFNpemUoKQorCQkJc2VsZi5hc3NlcnRUcnVlKHJlc2l6ZWRfc2l6ZSAhPSBjdXJyX3NpemUpCisJCQlwdi5yZXNpemUoZGV2X3NpemUpCisKKwlkZWYgdGVzdF9wdl9saWZlX2N5Y2xlKHNlbGYpOgorCQkiIiIKKwkJVGVzdCByZW1vdmluZyBhbmQgcmUtY3JlYXRpbmcgYSBQVgorCQkiIiIKKwkJdGFyZ2V0X25hbWUgPSBOb25lCisKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJcHYgPSBwdnNbMF0KKwkJCXRhcmdldF9uYW1lID0gcHYuZ2V0TmFtZSgpCisJCQlsdm0ucHZSZW1vdmUodGFyZ2V0X25hbWUpCisKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJZm9yIHAgaW4gcHZzOgorCQkJCXNlbGYuYXNzZXJ0VHJ1ZShwLmdldE5hbWUoKSAhPSB0YXJnZXRfbmFtZSkKKworCQlsdm0ucHZDcmVhdGUodGFyZ2V0X25hbWUsIDApCisKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJZm91bmQgPSBGYWxzZQorCQkJZm9yIHAgaW4gcHZzOgorCQkJCWlmIHAuZ2V0TmFtZSgpID09IHRhcmdldF9uYW1lOgorCQkJCQlmb3VuZCA9IFRydWUKKworCQlzZWxmLmFzc2VydFRydWUoZm91bmQpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIHRlc3RfcHZfbWV0aG9kcygpOgorCQl3aXRoIEFsbG93ZWRQVlMoKSBhcyBwdnM6CisJCQlmb3IgcCBpbiBwdnM6CisJCQkJcC5nZXROYW1lKCkKKwkJCQlwLmdldFV1aWQoKQorCQkJCXAuZ2V0TWRhQ291bnQoKQorCQkJCXAuZ2V0U2l6ZSgpCisJCQkJcC5nZXREZXZTaXplKCkKKwkJCQlwLmdldEZyZWUoKQorCQkJCXAgPSBOb25lCisKKwlkZWYgdGVzdF92ZXJzaW9uKHNlbGYpOgorCQl2ZXJzaW9uID0gbHZtLmdldFZlcnNpb24oKQorCQlzZWxmLmFzc2VydE5vdEVxdWFscyh2ZXJzaW9uLCBOb25lKQorCQlzZWxmLmFzc2VydEVxdWFscyh0eXBlKHZlcnNpb24pLCBzdHIpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmVyc2lvbikgPiAwKQorCisJZGVmIHRlc3RfcHZfZ2V0dGVycyhzZWxmKToKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJcHYgPSBwdnNbMF0KKwkJCXNlbGYuYXNzZXJ0RXF1YWwodHlwZShwdi5nZXROYW1lKCkpLCBzdHIpCisJCQlzZWxmLmFzc2VydFRydWUobGVuKHB2LmdldE5hbWUoKSkgPiAwKQorCisJCQlzZWxmLmFzc2VydEVxdWFsKHR5cGUocHYuZ2V0VXVpZCgpKSwgc3RyKQorCQkJc2VsZi5hc3NlcnRUcnVlKGxlbihwdi5nZXRVdWlkKCkpID4gMCkKKworCQkJc2VsZi5hc3NlcnRUcnVlKAorCQkJCXR5cGUocHYuZ2V0TWRhQ291bnQoKSkgPT0gaW50IG9yCisJCQkJdHlwZShwdi5nZXRNZGFDb3VudCgpKSA9PSBsb25nKQorCisJCQlzZWxmLmFzc2VydFRydWUoCisJCQkJdHlwZShwdi5nZXRTaXplKCkpID09IGludCBvcgorCQkJCXR5cGUocHYuZ2V0U2l6ZSgpKSA9PSBsb25nKQorCisJCQlzZWxmLmFzc2VydFRydWUoCisJCQkJdHlwZShwdi5nZXREZXZTaXplKCkpID09IGludCBvcgorCQkJCXR5cGUocHYuZ2V0U2l6ZSgpKSA9PSBsb25nKQorCisJCQlzZWxmLmFzc2VydFRydWUoCisJCQkJdHlwZShwdi5nZXRGcmVlKCkpID09IGludCBvcgorCQkJCXR5cGUocHYuZ2V0RnJlZSgpKSA9PSBsb25nKQorCisJZGVmIF90ZXN0X3Byb3Aoc2VsZiwgcHJvcF9vYmosIHByb3AsIHZhcl90eXBlLCBzZXR0YWJsZSk6CisJCXJlc3VsdCA9IHByb3Bfb2JqLmdldFByb3BlcnR5KHByb3ApCisKKwkJI0lmIHdlIGhhdmUgbm8gc3RyaW5nIHZhbHVlIHdlIGNhbiBnZXQgYSBOb25lIHR5cGUgYmFjaworCQlpZiByZXN1bHRbMF0gaXMgbm90IE5vbmU6CisJCQlzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0WzBdKSwgdmFyX3R5cGUpCisJCWVsc2U6CisJCQlzZWxmLmFzc2VydFRydWUoc3RyID09IHZhcl90eXBlKQorCQlzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0WzFdKSwgYm9vbCkKKwkJc2VsZi5hc3NlcnRUcnVlKHJlc3VsdFsxXSA9PSBzZXR0YWJsZSkKKworCWRlZiB0ZXN0X3B2X3NlZ3Moc2VsZik6CisJCXdpdGggQWxsb3dlZFBWUygpIGFzIHB2czoKKwkJCXB2ID0gcHZzWzBdCisJCQlwdl9zZWdzID0gcHYubGlzdFBWc2VncygpCisKKwkJCSNMVnNlZ3MgcmV0dXJucyBhIHR1cGxlLCAodmFsdWUsIGJvb2wgc2V0dGFibGUpCisJCQkjVE9ETzogVGVzdCBvdGhlciBwcm9wZXJ0aWVzIG9mIHB2X3NlZworCQkJZm9yIGkgaW4gcHZfc2VnczoKKwkJCQlzZWxmLl90ZXN0X3Byb3AoaSwgJ3B2c2VnX3N0YXJ0JywgbG9uZywgRmFsc2UpCisKKwlkZWYgdGVzdF9wdl9wcm9wZXJ0eShzZWxmKToKKwkJd2l0aCBBbGxvd2VkUFZTKCkgYXMgcHZzOgorCQkJcHYgPSBwdnNbMF0KKwkJCXNlbGYuX3Rlc3RfcHJvcChwdiwgJ3B2X21kYV9jb3VudCcsIGxvbmcsIEZhbHNlKQorCisJZGVmIHRlc3RfbHZfcHJvcGVydHkoc2VsZik6CisJCWx2X25hbWUgPSAnbHZfdGVzdCcKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaW5fbHYoVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpLCBsdl9uYW1lKQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKworCQlsdl9zZWdfcHJvcGVydGllcyA9IFsKKwkJCSgnY2h1bmtfc2l6ZScsIGxvbmcsIEZhbHNlKSwgKCdkZXZpY2VzJywgc3RyLCBGYWxzZSksCisJCQkoJ2Rpc2NhcmRzJywgc3RyLCBGYWxzZSksICgncmVnaW9uX3NpemUnLCBsb25nLCBGYWxzZSksCisJCQkoJ3NlZ3R5cGUnLCBzdHIsIEZhbHNlKSwgKCdzZWdfcGVfcmFuZ2VzJywgc3RyLCBGYWxzZSksCisJCQkoJ3NlZ19zaXplJywgbG9uZywgRmFsc2UpLCAoJ3NlZ19zaXplX3BlJywgbG9uZywgRmFsc2UpLAorCQkJKCdzZWdfc3RhcnQnLCBsb25nLCBGYWxzZSksICgnc2VnX3N0YXJ0X3BlJywgbG9uZywgRmFsc2UpLAorCQkJKCdzZWdfdGFncycsIHN0ciwgRmFsc2UpLCAoJ3N0cmlwZXMnLCBsb25nLCBGYWxzZSksCisJCQkoJ3N0cmlwZV9zaXplJywgbG9uZywgRmFsc2UpLCAoJ3RoaW5fY291bnQnLCBsb25nLCBGYWxzZSksCisJCQkoJ3RyYW5zYWN0aW9uX2lkJywgbG9uZywgRmFsc2UpLCAoJ3plcm8nLCBsb25nLCBGYWxzZSldCisKKwkJbHZfcHJvcGVydGllcyA9IFsKKwkJCSgnY29udmVydF9sdicsIHN0ciwgRmFsc2UpLCAoJ2NvcHlfcGVyY2VudCcsIGxvbmcsIEZhbHNlKSwKKwkJCSgnZGF0YV9sdicsIHN0ciwgRmFsc2UpLCAoJ2x2X2F0dHInLCBzdHIsIEZhbHNlKSwKKwkJCSgnbHZfaG9zdCcsIHN0ciwgRmFsc2UpLCAoJ2x2X2tlcm5lbF9tYWpvcicsIGxvbmcsIEZhbHNlKSwKKwkJCSgnbHZfa2VybmVsX21pbm9yJywgbG9uZywgRmFsc2UpLAorCQkJKCdsdl9rZXJuZWxfcmVhZF9haGVhZCcsIGxvbmcsIEZhbHNlKSwKKwkJCSgnbHZfbWFqb3InLCBsb25nLCBGYWxzZSksICgnbHZfbWlub3InLCBsb25nLCBGYWxzZSksCisJCQkoJ2x2X25hbWUnLCBzdHIsIEZhbHNlKSwgKCdsdl9wYXRoJywgc3RyLCBGYWxzZSksCisJCQkoJ2x2X3Byb2ZpbGUnLCBzdHIsIEZhbHNlKSwgKCdsdl9yZWFkX2FoZWFkJywgbG9uZywgRmFsc2UpLAorCQkJKCdsdl9zaXplJywgbG9uZywgRmFsc2UpLCAoJ2x2X3RhZ3MnLCBzdHIsIEZhbHNlKSwKKwkJCSgnbHZfdGltZScsIHN0ciwgRmFsc2UpLCAoJ2x2X3V1aWQnLCBzdHIsIEZhbHNlKSwKKwkJCSgnbWV0YWRhdGFfbHYnLCBzdHIsIEZhbHNlKSwgKCdtaXJyb3JfbG9nJywgc3RyLCBGYWxzZSksCisJCQkoJ2x2X21vZHVsZXMnLCBzdHIsIEZhbHNlKSwgKCdtb3ZlX3B2Jywgc3RyLCBGYWxzZSksCisJCQkoJ29yaWdpbicsIHN0ciwgRmFsc2UpLCAoJ29yaWdpbl9zaXplJywgbG9uZywgRmFsc2UpLAorCQkJKCdwb29sX2x2Jywgc3RyLCBGYWxzZSksICgncmFpZF9tYXhfcmVjb3ZlcnlfcmF0ZScsIGxvbmcsIEZhbHNlKSwKKwkJCSgncmFpZF9taW5fcmVjb3ZlcnlfcmF0ZScsIGxvbmcsIEZhbHNlKSwKKwkJCSgncmFpZF9taXNtYXRjaF9jb3VudCcsIGxvbmcsIEZhbHNlKSwKKwkJCSgncmFpZF9zeW5jX2FjdGlvbicsIHN0ciwgRmFsc2UpLAorCQkJKCdyYWlkX3dyaXRlX2JlaGluZCcsIGxvbmcsIEZhbHNlKSwgKCdzZWdfY291bnQnLCBsb25nLCBGYWxzZSksCisJCQkoJ3NuYXBfcGVyY2VudCcsIGxvbmcsIEZhbHNlKSwgKCdzeW5jX3BlcmNlbnQnLCBsb25nLCBGYWxzZSldCisKKwkJIyBHZW5lcmljIHRlc3QgY2FzZSwgbWFrZSBzdXJlIHdlIGdldCB3aGF0IHdlIGV4cGVjdAorCQlmb3IgdCBpbiBsdl9wcm9wZXJ0aWVzOgorCQkJc2VsZi5fdGVzdF9wcm9wKGx2LCAqdCkKKworCQlzZWdtZW50cyA9IGx2Lmxpc3RMVnNlZ3MoKQorCQlpZiBzZWdtZW50cyBhbmQgbGVuKHNlZ21lbnRzKToKKwkJCWZvciBzIGluIHNlZ21lbnRzOgorCQkJCWZvciB0IGluIGx2X3NlZ19wcm9wZXJ0aWVzOgorCQkJCQlzZWxmLl90ZXN0X3Byb3AocywgKnQpCisKKwkJIyBUZXN0IHNwZWNpZmljIGNhc2VzCisJCXRhZyA9ICdoZWxsb193b3JsZCcKKwkJbHYuYWRkVGFnKHRhZykKKwkJdGFncyA9IGx2LmdldFByb3BlcnR5KCdsdl90YWdzJykKKwkJc2VsZi5hc3NlcnRUcnVlKHRhZyBpbiB0YWdzWzBdKQorCQl2Zy5jbG9zZSgpCisKKwlkZWYgdGVzdF9sdl90YWdzKHNlbGYpOgorCQlsdl9uYW1lID0gJ2x2X3Rlc3QnCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKSwgbHZfbmFtZSkKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisJCXNlbGYuX3Rlc3RfdGFncyhsdikKKwkJdmcuY2xvc2UoKQorCisJZGVmIHRlc3RfbHZfYWN0aXZlX2luYWN0aXZlKHNlbGYpOgorCQlsdl9uYW1lID0gJ2x2X3Rlc3QnCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKSwgbHZfbmFtZSkKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisJCWx2LmRlYWN0aXZhdGUoKQorCQlzZWxmLmFzc2VydFRydWUobHYuaXNBY3RpdmUoKSBpcyBGYWxzZSkKKwkJbHYuYWN0aXZhdGUoKQorCQlzZWxmLmFzc2VydFRydWUobHYuaXNBY3RpdmUoKSBpcyBUcnVlKQorCQl2Zy5jbG9zZSgpCisKKwlkZWYgdGVzdF9sdl9yZW5hbWUoc2VsZik6CisJCWx2X25hbWUgPSAnbHZfdGVzdCcKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaW5fbHYoVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpLCBsdl9uYW1lKQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKworCQljdXJyZW50X25hbWUgPSBsdi5nZXROYW1lKCkKKwkJbmV3X25hbWUgPSBycygpCisJCWx2LnJlbmFtZShuZXdfbmFtZSkKKwkJc2VsZi5hc3NlcnRFcXVhbChsdi5nZXROYW1lKCksIG5ld19uYW1lKQorCQlsdi5yZW5hbWUoY3VycmVudF9uYW1lKQorCQl2Zy5jbG9zZSgpCisKKwlkZWYgdGVzdF9sdl9wZXJzaXN0ZW5jZShzZWxmKToKKwkJIyBNYWtlIGNoYW5nZXMgdG8gdGhlIGx2LCBjbG9zZSB0aGUgdmcgYW5kIHJlLW9wZW4gdG8gbWFrZSBzdXJlIHRoYXQKKwkJIyB0aGUgY2hhbmdlcyBwZXJzaXN0CisJCWx2X25hbWUgPSAnbHZfdGVzdF9wZXJzaXN0JworCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpLCBsdl9uYW1lKQorCisJCSMgVGVzdCByZW5hbWUKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisJCWN1cnJlbnRfbmFtZSA9IGx2LmdldE5hbWUoKQorCQluZXdfbmFtZSA9IHJzKCkKKwkJbHYucmVuYW1lKG5ld19uYW1lKQorCisJCXZnLmNsb3NlKCkKKwkJdmcgPSBOb25lCisKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIG5ld19uYW1lKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsdiBpcyBub3QgTm9uZSkKKworCQlpZiBsdiBhbmQgdmc6CisJCQlsdi5yZW5hbWUobHZfbmFtZSkKKwkJCXZnLmNsb3NlKCkKKwkJCXZnID0gTm9uZQorCisJCSMgVGVzdCBsdiB0YWcgYWRkCisJCXRhZyA9ICdoZWxsb193b3JsZCcKKworCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKwkJbHYuYWRkVGFnKHRhZykKKwkJdmcuY2xvc2UoKQorCQl2ZyA9IE5vbmUKKworCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKwkJdGFncyA9IGx2LmdldFRhZ3MoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSh0YWcgaW4gdGFncykKKwkJdmcuY2xvc2UoKQorCQl2ZyA9IE5vbmUKKworCQkjIFRlc3QgbHYgdGFnIGRlbGV0ZQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKwkJc2VsZi5hc3NlcnRUcnVlKGx2IGlzIG5vdCBOb25lIGFuZCB2ZyBpcyBub3QgTm9uZSkKKworCQlpZiBsdiBhbmQgdmc6CisJCQl0YWdzID0gbHYuZ2V0VGFncygpCisKKwkJCWZvciB0IGluIHRhZ3M6CisJCQkJbHYucmVtb3ZlVGFnKHQpCisKKwkJCXZnLmNsb3NlKCkKKwkJCXZnID0gTm9uZQorCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCBsdl9uYW1lKQorCQlzZWxmLmFzc2VydFRydWUobHYgaXMgbm90IE5vbmUgYW5kIHZnIGlzIG5vdCBOb25lKQorCisJCWlmIGx2IGFuZCB2ZzoKKwkJCXRhZ3MgPSBsdi5nZXRUYWdzKCkKKworCQkJaWYgdGFnczoKKwkJCQlzZWxmLmFzc2VydEVxdWFsKGxlbih0YWdzKSwgMCkKKwkJCXZnLmNsb3NlKCkKKwkJCXZnID0gTm9uZQorCisJCSMgVGVzdCBsdiBkZWFjdGl2YXRlCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCBsdl9uYW1lKQorCQlzZWxmLmFzc2VydFRydWUobHYgaXMgbm90IE5vbmUgYW5kIHZnIGlzIG5vdCBOb25lKQorCisJCWlmIGx2IGFuZCB2ZzoKKwkJCWx2LmRlYWN0aXZhdGUoKQorCQkJdmcuY2xvc2UoKQorCQkJdmcgPSBOb25lCisKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsdiBpcyBub3QgTm9uZSBhbmQgdmcgaXMgbm90IE5vbmUpCisJCWlmIGx2IGFuZCB2ZzoKKwkJCXNlbGYuYXNzZXJ0RmFsc2UobHYuaXNBY3RpdmUoKSkKKwkJCXZnLmNsb3NlKCkKKwkJCXZnID0gTm9uZQorCisJCSMgVGVzdCBsdiBhY3RpdmF0ZQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKwkJc2VsZi5hc3NlcnRUcnVlKGx2IGlzIG5vdCBOb25lIGFuZCB2ZyBpcyBub3QgTm9uZSkKKwkJaWYgbHYgYW5kIHZnOgorCQkJbHYuYWN0aXZhdGUoKQorCQkJdmcuY2xvc2UoKQorCQkJdmcgPSBOb25lCisKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsdiBpcyBub3QgTm9uZSBhbmQgdmcgaXMgbm90IE5vbmUpCisJCWlmIGx2IGFuZCB2ZzoKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShsdi5pc0FjdGl2ZSgpKQorCQkJdmcuY2xvc2UoKQorCQkJdmcgPSBOb25lCisKKwlkZWYgdGVzdF9sdl9zbmFwc2hvdChzZWxmKToKKworCQl0aGluX2x2ID0gJ3RoaW5fbHYnCisJCXRoaWNrX2x2ID0gJ3RoaWNrX2x2JworCisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KGRldmljZV9uYW1lc1swOjJdLCB0aGluX2x2KQorCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoZGV2aWNlX25hbWVzWzI6NF0sIHRoaWNrX2x2KQorCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCB0aGlja19sdikKKyMgRklYTUUJCWx2LnNuYXBzaG90KCd0aGlja19zbmFwX3Nob3QnLCAxMDI0KjEwMjQpCisJCXZnLmNsb3NlKCkKKworIyBGSVhNRQkJdGhpY2tfc3MsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsICd0aGlja19zbmFwX3Nob3QnKQorIyBGSVhNRQkJc2VsZi5hc3NlcnRUcnVlKHRoaWNrX3NzIGlzIG5vdCBOb25lKQorIyBGSVhNRQkJdmcuY2xvc2UoKQorCisJCXRoaW5fbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIHRoaW5fbHYpCisJCXRoaW5fbHYuc25hcHNob3QoJ3RoaW5fc25hcF9zaG90JykKKwkJdmcuY2xvc2UoKQorCisJCXRoaW5fc3MsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsICd0aGluX3NuYXBfc2hvdCcpCisJCXNlbGYuYXNzZXJ0VHJ1ZSh0aGluX3NzIGlzIG5vdCBOb25lKQorCisJCW9yaWdpbiA9IHRoaW5fc3MuZ2V0T3JpZ2luKCkKKwkJc2VsZi5hc3NlcnRUcnVlKHRoaW5fbHYsIG9yaWdpbikKKworCQl2Zy5jbG9zZSgpCisKKwlkZWYgdGVzdF9sdl9zdXNwZW5kKHNlbGYpOgorCQlsdl9uYW1lID0gJ2x2X3Rlc3QnCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKSwgbHZfbmFtZSkKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisKKwkJcmVzdWx0ID0gbHYuaXNTdXNwZW5kZWQoKQorCQlzZWxmLmFzc2VydFRydWUodHlwZShyZXN1bHQpID09IGJvb2wpCisJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X2x2X3NpemUoc2VsZik6CisJCWx2X25hbWUgPSAnbHZfdGVzdCcKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaW5fbHYoVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpLCBsdl9uYW1lKQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgbHZfbmFtZSkKKworCQlyZXN1bHQgPSBsdi5nZXRTaXplKCkKKwkJc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVzdWx0KSA9PSBpbnQgb3IgdHlwZShyZXN1bHQpID09IGxvbmcpCisJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X2x2X3Jlc2l6ZShzZWxmKToKKwkJbHZfbmFtZSA9ICdsdl90ZXN0JworCQlUZXN0THZtLl9jcmVhdGVfdGhpbl9sdihUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCksIGx2X25hbWUpCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCBsdl9uYW1lKQorCisJCWN1cnJfc2l6ZSA9IGx2LmdldFNpemUoKQorCQlsdi5yZXNpemUoY3Vycl9zaXplICsgKDEwMjQgKiAxMDI0KSkKKwkJbGF0ZXN0ID0gbHYuZ2V0U2l6ZSgpCisJCXNlbGYuYXNzZXJ0VHJ1ZShjdXJyX3NpemUgIT0gbGF0ZXN0KQorCisJZGVmIHRlc3RfbHZfc2VnKHNlbGYpOgorCQlsdl9uYW1lID0gJ2x2X3Rlc3QnCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKSwgbHZfbmFtZSkKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIGx2X25hbWUpCisKKwkJbHZfc2VncyA9IGx2Lmxpc3RMVnNlZ3MoKQorCisJCSNMVnNlZ3MgcmV0dXJucyBhIHR1cGxlLCAodmFsdWUsIGJvb2wgc2V0dGFibGUpCisJCSNUT0RPOiBUZXN0IG90aGVyIHByb3BlcnRpZXMgb2YgbHZfc2VnCisJCWZvciBpIGluIGx2X3NlZ3M6CisJCQlzZWxmLl90ZXN0X3Byb3AoaSwgJ3NlZ19zdGFydF9wZScsIGxvbmcsIEZhbHNlKQorCisJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X2dldF9zZXRfZXh0ZW5kX3NpemUoc2VsZik6CisJCXRoaWNrX2x2ID0gJ2dldF9zZXRfcHJvcCcKKwkJZGV2aWNlX25hbWVzID0gVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpCisJCVRlc3RMdm0uX2NyZWF0ZV90aGlja19sdihkZXZpY2VfbmFtZXNbMDoyXSwgdGhpY2tfbHYpCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCB0aGlja19sdikKKworCQluZXdfZXh0ZW50ID0gMTAyNCAqIDEwMjQgKiA0CisKKwkJc2VsZi5hc3NlcnRGYWxzZSgKKwkJCXZnLmdldEV4dGVudFNpemUoKSAhPSBuZXdfZXh0ZW50LAorCQkJIkNhbm5vdCBkZXRlcm1pbmUgaWYgaXQgd29ya3MgaWYgdGhleSBhcmUgdGhlIHNhbWUiKQorCisJCXZnLnNldEV4dGVudFNpemUobmV3X2V4dGVudCkKKwkJc2VsZi5hc3NlcnRFcXVhbCh2Zy5nZXRFeHRlbnRTaXplKCksIG5ld19leHRlbnQpCisJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X3ZnX2dldF9zZXRfcHJvcChzZWxmKToKKwkJdGhpY2tfbHYgPSAnZ2V0X3NldF9wcm9wJworCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaWNrX2x2KGRldmljZV9uYW1lc1swOjJdLCB0aGlja19sdikKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIHRoaWNrX2x2KQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSh2ZyBpcyBub3QgTm9uZSkKKwkJaWYgdmc6CisJCQl2Z19tZGFfY29waWVzID0gdmcuZ2V0UHJvcGVydHkoJ3ZnX21kYV9jb3BpZXMnKQorCQkJdmcuc2V0UHJvcGVydHkoJ3ZnX21kYV9jb3BpZXMnLCB2Z19tZGFfY29waWVzWzBdKQorCQkJdmcuY2xvc2UoKQorCisJZGVmIHRlc3RfdmdfcmVtb3ZlX3Jlc3RvcmUoc2VsZik6CisJCSNTdG9yZSBvZmYgdGhlIGxpc3Qgb2YgcGh5c2ljYWwgZGV2aWNlcworCQlwdl9kZXZpY2VzID0gW10KKworCQl0aGlja19sdiA9ICdnZXRfc2V0X3Byb3AnCisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoZGV2aWNlX25hbWVzWzA6Ml0sIHRoaWNrX2x2KQorCQlsdiwgdmcgPSBUZXN0THZtLl9nZXRfbHYoTm9uZSwgdGhpY2tfbHYpCisKKwkJdmdfbmFtZSA9IHZnLmdldE5hbWUoKQorCisJCXB2cyA9IHZnLmxpc3RQVnMoKQorCQlmb3IgcCBpbiBwdnM6CisJCQlwdl9kZXZpY2VzLmFwcGVuZChwLmdldE5hbWUoKSkKKwkJdmcuY2xvc2UoKQorCisJCVRlc3RMdm0uX3JlbW92ZV92Zyh2Z19uYW1lKQorCQlzZWxmLl9jcmVhdGVfdGhpY2tfbHYocHZfZGV2aWNlcywgdGhpY2tfbHYpCisKKwlkZWYgdGVzdF92Z19uYW1lcyhzZWxmKToKKwkJdmcgPSBsdm0ubGlzdFZnTmFtZXMoKQorCQlzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2ZywgdHVwbGUpKQorCisJZGVmIHRlc3RfZHVwZV9sdl9jcmVhdGUoc2VsZik6CisJCSIiIgorCQlUcnkgdG8gY3JlYXRlIGEgbHYgd2l0aCB0aGUgc2FtZSBuYW1lIGV4cGVjdGluZyBhIGZhaWx1cmUKKwkJTm90ZTogVGhpcyB3YXMgY2F1c2luZyBhIHNlZy4gZmF1bHQgcHJldmlvdXNseQorCQkiIiIKKwkJdGhpY2tfbHYgPSAnZHVwZV9uYW1lJworCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaWNrX2x2KGRldmljZV9uYW1lc1swOjJdLCB0aGlja19sdikKKwkJbHYsIHZnID0gVGVzdEx2bS5fZ2V0X2x2KE5vbmUsIHRoaWNrX2x2KQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSh2ZyBpcyBub3QgTm9uZSkKKworCQlpZiB2ZzoKKwkJCWx2cyA9IHZnLmxpc3RMVnMoKQorCisJCQlpZiBsZW4obHZzKToKKwkJCQlsdiA9IGx2c1swXQorCQkJCWx2X25hbWUgPSBsdi5nZXROYW1lKCkKKwkJCQlzZWxmLmFzc2VydFJhaXNlcygKKwkJCQkJbHZtLkxpYkxWTUVycm9yLCB2Zy5jcmVhdGVMdkxpbmVhciwgbHZfbmFtZSwgbHYuZ2V0U2l6ZSgpKQorCQkJdmcuY2xvc2UoKQorCisJZGVmIHRlc3RfdmdfdXVpZHMoc2VsZik6CisKKwkJZGV2aWNlX25hbWVzID0gVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KGRldmljZV9uYW1lc1swOjJdLCAndGhpbicpCisJCVRlc3RMdm0uX2NyZWF0ZV90aGlja19sdihkZXZpY2VfbmFtZXNbMjo0XSwgJ3RoaWNrJykKKworCQl2Z3NfdXVpZHMgPSBsdm0ubGlzdFZnVXVpZHMoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmdzX3V1aWRzKSA+IDApCisJCXNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZnc191dWlkcywgdHVwbGUpKQorCisJCXZnc191dWlkcyA9IGxpc3QodmdzX3V1aWRzKQorCQl2Z3NfbmFtZXMgPSBsdm0ubGlzdFZnTmFtZXMoKQorCisJCWZvciB2Z19uYW1lIGluIHZnc19uYW1lczoKKwkJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAiciIpCisKKwkJCSNUT0RPIFdyaXRlL2ZpeCBCVUcsIHZnIHV1aWQgZG9uJ3QgbWF0Y2ggYmV0d2VlbgorCQkJI2x2bS5saXN0VmdVdWlkcyBhbmQgdmcuZ2V0VXVpZCgpCisJCQl2Z191dWlkX3NlYXJjaCA9IHZnLmdldFV1aWQoKS5yZXBsYWNlKCctJywgJycpCisKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh2Z191dWlkX3NlYXJjaCBpbiB2Z3NfdXVpZHMpCisJCQl2Z3NfdXVpZHMucmVtb3ZlKHZnX3V1aWRfc2VhcmNoKQorCQkJdmcuY2xvc2UoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmdzX3V1aWRzKSA9PSAwKQorCisJZGVmIHRlc3RfcHZfbG9va3VwX2Zyb21fdmcoc2VsZik6CisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCQlUZXN0THZtLl9jcmVhdGVfdGhpbl9sdihkZXZpY2VfbmFtZXNbMDoyXSwgJ3RoaW4nKQorCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoZGV2aWNlX25hbWVzWzI6NF0sICd0aGljaycpCisKKwkJdmdfbmFtZXMgPSBUZXN0THZtLl92Z19uYW1lcygpCisKKwkJc2VsZi5hc3NlcnRUcnVlKGxlbih2Z19uYW1lcykgPiAwKQorCisJCWZvciB2Z19uYW1lIGluIHZnX25hbWVzOgorCQkJdmcgPSBsdm0udmdPcGVuKHZnX25hbWUsICd3JykKKwkJCXB2cyA9IHZnLmxpc3RQVnMoKQorCisJCQlmb3IgcCBpbiBwdnM6CisJCQkJbmFtZSA9IHAuZ2V0TmFtZSgpCisJCQkJdXVpZCA9IHAuZ2V0VXVpZCgpCisKKwkJCQlwdl9uYW1lX2xvb2t1cCA9IHZnLnB2RnJvbU5hbWUobmFtZSkKKwkJCQlwdl91dWlkX2xvb2t1cCA9IHZnLnB2RnJvbVV1aWQodXVpZCkKKworCQkJCXNlbGYuYXNzZXJ0VHJ1ZSgKKwkJCQkJcHZfbmFtZV9sb29rdXAuZ2V0TmFtZSgpID09IHB2X3V1aWRfbG9va3VwLmdldE5hbWUoKSkKKwkJCQlzZWxmLmFzc2VydFRydWUoCisJCQkJCXB2X25hbWVfbG9va3VwLmdldFV1aWQoKSA9PSBwdl91dWlkX2xvb2t1cC5nZXRVdWlkKCkpCisKKwkJCQlzZWxmLmFzc2VydFRydWUobmFtZSA9PSBwdl9uYW1lX2xvb2t1cC5nZXROYW1lKCkpCisJCQkJc2VsZi5hc3NlcnRUcnVlKHV1aWQgPT0gcHZfdXVpZF9sb29rdXAuZ2V0VXVpZCgpKQorCisJCQkJcHZfbmFtZV9sb29rdXAgPSBOb25lCisJCQkJcHZfdXVpZF9sb29rdXAgPSBOb25lCisJCQkJcCA9IE5vbmUKKworCQkJcHZzID0gTm9uZQorCQkJdmcuY2xvc2UoKQorCisJZGVmIHRlc3RfcGVyY2VudF90b19mbG9hdChzZWxmKToKKwkJc2VsZi5hc3NlcnRFcXVhbChsdm0ucGVyY2VudFRvRmxvYXQoMCksIDAuMCkKKwkJc2VsZi5hc3NlcnRFcXVhbChsdm0ucGVyY2VudFRvRmxvYXQoMTAwMDAwMCksIDEuMCkKKwkJc2VsZi5hc3NlcnRFcXVhbChsdm0ucGVyY2VudFRvRmxvYXQoMTAwMDAwMCAvIDIpLCAwLjUpCisKKwlkZWYgdGVzdF9zY2FuKHNlbGYpOgorCQlzZWxmLmFzc2VydEVxdWFsKGx2bS5zY2FuKCksIE5vbmUpCisKKwlkZWYgdGVzdF9jb25maWdfcmVsb2FkKHNlbGYpOgorCQlzZWxmLmFzc2VydEVxdWFsKGx2bS5jb25maWdSZWxvYWQoKSwgTm9uZSkKKworCWRlZiB0ZXN0X2NvbmZpZ19vdmVycmlkZShzZWxmKToKKwkJc2VsZi5hc3NlcnRFcXVhbHMobHZtLmNvbmZpZ092ZXJyaWRlKCJnbG9iYWwudGVzdCA9IDEiKSwgTm9uZSkKKworCWRlZiB0ZXN0X2NvbmZpZ19maW5kX2Jvb2woc2VsZik6CisJCWVpdGhlcl9vciA9IGx2bS5jb25maWdGaW5kQm9vbCgiZ2xvYmFsL2ZhbGxiYWNrX3RvX2xvY2FsX2xvY2tpbmciKQorCQlzZWxmLmFzc2VydFRydWUodHlwZShlaXRoZXJfb3IpID09IGJvb2wpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsdm0uY29uZmlnRmluZEJvb2woImdsb2JhbC9sb2NraW5nX3R5cGUiKSkKKworCWRlZiB0ZXN0X3ZnX2Zyb21fcHZfbG9va3VwcyhzZWxmKToKKwkJZGV2aWNlX25hbWVzID0gVGVzdEx2bS5fZ2V0X3B2X2RldmljZV9uYW1lcygpCisJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KGRldmljZV9uYW1lc1swOjJdLCAndGhpbicpCisJCVRlc3RMdm0uX2NyZWF0ZV90aGlja19sdihkZXZpY2VfbmFtZXNbMjo0XSwgJ3RoaWNrJykKKworCQl2Z25hbWVfbGlzdCA9IFRlc3RMdm0uX3ZnX25hbWVzKCkKKworCQlzZWxmLmFzc2VydFRydWUobGVuKHZnbmFtZV9saXN0KSA+IDApCisKKwkJZm9yIHZnX25hbWUgaW4gdmduYW1lX2xpc3Q6CisJCQl2ZyA9IGx2bS52Z09wZW4odmdfbmFtZSwgJ3InKQorCisJCQl2Z19uYW1lID0gdmcuZ2V0TmFtZSgpCisKKwkJCXB2X2xpc3QgPSB2Zy5saXN0UFZzKCkKKwkJCWZvciBwdiBpbiBwdl9saXN0OgorCQkJCXZnX25hbWVfZnJvbV9wdiA9IGx2bS52Z05hbWVGcm9tUHZpZChwdi5nZXRVdWlkKCkpCisJCQkJc2VsZi5hc3NlcnRFcXVhbHModmdfbmFtZSwgdmdfbmFtZV9mcm9tX3B2KQorCQkJCXNlbGYuYXNzZXJ0RXF1YWwodmdfbmFtZSwgbHZtLnZnTmFtZUZyb21EZXZpY2UocHYuZ2V0TmFtZSgpKSkKKwkJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X3ZnX2dldF9uYW1lKHNlbGYpOgorCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaW5fbHYoZGV2aWNlX25hbWVzWzA6Ml0sICd0aGluJykKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaWNrX2x2KGRldmljZV9uYW1lc1syOjRdLCAndGhpY2snKQorCisJCXZnbmFtZV9saXN0ID0gVGVzdEx2bS5fdmdfbmFtZXMoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmduYW1lX2xpc3QpID4gMCkKKworCQlmb3IgdmdfbmFtZSBpbiB2Z25hbWVfbGlzdDoKKwkJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAncicpCisJCQlzZWxmLmFzc2VydEVxdWFsKHZnLmdldE5hbWUoKSwgdmdfbmFtZSkKKwkJCXZnLmNsb3NlKCkKKworCWRlZiB0ZXN0X3ZnX2dldF91dWlkKHNlbGYpOgorCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaW5fbHYoZGV2aWNlX25hbWVzWzA6Ml0sICd0aGluJykKKwkJVGVzdEx2bS5fY3JlYXRlX3RoaWNrX2x2KGRldmljZV9uYW1lc1syOjRdLCAndGhpY2snKQorCisJCXZnbmFtZV9saXN0ID0gVGVzdEx2bS5fdmdfbmFtZXMoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmduYW1lX2xpc3QpID4gMCkKKworCQlmb3IgdmdfbmFtZSBpbiB2Z25hbWVfbGlzdDoKKwkJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAncicpCisJCQl1dWlkID0gdmcuZ2V0VXVpZCgpCisJCQlzZWxmLmFzc2VydE5vdEVxdWFsKHV1aWQsIE5vbmUpCisJCQlzZWxmLmFzc2VydFRydWUobGVuKHV1aWQpID4gMCkKKwkJCXZnLmNsb3NlKCkKKworCVJFVFVSTl9OVU1FUklDID0gWworCQkiZ2V0U2Vxbm8iLCAiZ2V0U2l6ZSIsICJnZXRGcmVlU2l6ZSIsICJnZXRGcmVlU2l6ZSIsCisJCSJnZXRFeHRlbnRTaXplIiwgImdldEV4dGVudENvdW50IiwgImdldEZyZWVFeHRlbnRDb3VudCIsCisJCSJnZXRQdkNvdW50IiwgImdldE1heFB2IiwgImdldE1heEx2Il0KKworCWRlZiB0ZXN0X3ZnX2dldHRlcnMoc2VsZik6CisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCQlUZXN0THZtLl9jcmVhdGVfdGhpbl9sdihkZXZpY2VfbmFtZXNbMDoyXSwgJ3RoaW4nKQorCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoZGV2aWNlX25hbWVzWzI6NF0sICd0aGljaycpCisKKwkJdmdfbmFtZV9saXN0ID0gVGVzdEx2bS5fdmdfbmFtZXMoKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4odmdfbmFtZV9saXN0KSA+IDApCisKKwkJZm9yIHZnX25hbWUgaW4gdmdfbmFtZV9saXN0OgorCQkJdmcgPSBsdm0udmdPcGVuKHZnX25hbWUsICdyJykKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHZnLmlzQ2x1c3RlcmVkKCkpID09IGJvb2wpCisJCQlzZWxmLmFzc2VydFRydWUodHlwZSh2Zy5pc0V4cG9ydGVkKCkpID09IGJvb2wpCisJCQlzZWxmLmFzc2VydFRydWUodHlwZSh2Zy5pc1BhcnRpYWwoKSkgPT0gYm9vbCkKKworCQkJI0xvb3AgdGhyb3VnaCB0aGUgbGlzdCBpbnZva2luZyB0aGUgbWV0aG9kCisJCQlmb3IgbWV0aG9kX25hbWUgaW4gVGVzdEx2bS5SRVRVUk5fTlVNRVJJQzoKKwkJCQltZXRob2QgPSBnZXRhdHRyKHZnLCBtZXRob2RfbmFtZSkKKwkJCQlyZXN1bHQgPSBtZXRob2QoKQorCQkJCXNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlc3VsdCkgPT0gaW50IG9yIHR5cGUocmVzdWx0KSA9PSBsb25nKQorCisJCQl2Zy5jbG9zZSgpCisKKwlkZWYgX3Rlc3RfdGFncyhzZWxmLCB0YWdfb2JqKToKKwkJZXhpc3RpbmdfdGFncyA9IHRhZ19vYmouZ2V0VGFncygpCisJCXNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGV4aXN0aW5nX3RhZ3MpID09IHR1cGxlKQorCisJCW51bV90YWdzID0gcmFuZG9tLnJhbmRpbnQoMiwgNDApCisJCWNyZWF0ZWRfdGFncyA9IFtdCisKKwkJZm9yIGkgaW4gcmFuZ2UobnVtX3RhZ3MpOgorCQkJdGFnX25hbWUgPSBycyhyYW5kb20ucmFuZGludCgxLCAxMjgpKQorCQkJdGFnX29iai5hZGRUYWcodGFnX25hbWUpCisJCQljcmVhdGVkX3RhZ3MuYXBwZW5kKHRhZ19uYW1lKQorCisJCXRhZ3MgPSB0YWdfb2JqLmdldFRhZ3MoKQorCQlzZWxmLmFzc2VydFRydWUobGVuKGV4aXN0aW5nX3RhZ3MpICsgbGVuKGNyZWF0ZWRfdGFncykgPT0gbGVuKHRhZ3MpKQorCisJCW51bV9yZW1vdmUgPSBsZW4oY3JlYXRlZF90YWdzKQorCisJCWZvciBpIGluIHJhbmdlKG51bV9yZW1vdmUpOgorCQkJdGFnX3RvX3JlbW92ZSA9IGNyZWF0ZWRfdGFnc1sKKwkJCQlyYW5kb20ucmFuZGludCgwLCBsZW4oY3JlYXRlZF90YWdzKSAtIDEpXQorCisJCQljcmVhdGVkX3RhZ3MucmVtb3ZlKHRhZ190b19yZW1vdmUpCisKKwkJCXRhZ19vYmoucmVtb3ZlVGFnKHRhZ190b19yZW1vdmUpCisKKwkJCWN1cnJlbnRfdGFncyA9IHRhZ19vYmouZ2V0VGFncygpCisJCQlzZWxmLmFzc2VydEZhbHNlKHRhZ190b19yZW1vdmUgaW4gY3VycmVudF90YWdzKQorCisJCWN1cnJlbnRfdGFncyA9IHRhZ19vYmouZ2V0VGFncygpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4oY3VycmVudF90YWdzKSA9PSBsZW4oZXhpc3RpbmdfdGFncykpCisJCWZvciBlIGluIGV4aXN0aW5nX3RhZ3M6CisJCQlzZWxmLmFzc2VydFRydWUoZSBpbiBjdXJyZW50X3RhZ3MpCisKKwlkZWYgdGVzdF92Z190YWdzKHNlbGYpOgorCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKworCQlpID0gMAorCQlmb3IgZCBpbiBkZXZpY2VfbmFtZXM6CisJCQlpZiBpICUgMiA9PSAwOgorCQkJCVRlc3RMdm0uX2NyZWF0ZV90aGluX2x2KFtkXSwgInRoaW5fbHYlZCIgJSBpKQorCQkJZWxzZToKKwkJCQlUZXN0THZtLl9jcmVhdGVfdGhpY2tfbHYoW2RdLCAidGhpY2tfbHYlZCIgJSBpKQorCQkJaSArPSAxCisKKwkJZm9yIHZnX25hbWUgaW4gVGVzdEx2bS5fdmdfbmFtZXMoKToKKwkJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAndycpCisJCQlzZWxmLl90ZXN0X3RhZ3ModmcpCisJCQl2Zy5jbG9zZSgpCisKKwlAc3RhdGljbWV0aG9kCisJZGVmIHRlc3RfbGlzdGluZygpOgorCisJCWVudiA9IG9zLmVudmlyb24KKworCQlmb3IgaywgdiBpbiBlbnYuaXRlbXMoKToKKwkJCWwoIiVzOiVzIiAlIChrLCB2KSkKKworCQl3aXRoIGx2bS5saXN0UHZzKCkgYXMgcHZzOgorCQkJZm9yIHAgaW4gcHZzOgorCQkJCWwoJ3B2PSAlcycgJSBwLmdldE5hbWUoKSkKKworCQlsKCdDaGVja2luZyBmb3IgVkcnKQorCQlmb3IgdiBpbiBsdm0ubGlzdFZnTmFtZXMoKToKKwkJCWwoJ3ZnPSAlcycgJSB2KQorCisJZGVmIHRlc3RfcHZfZW1wdHlfbGlzdGluZyhzZWxmKToKKwkJI1dlIGhhZCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBzZWcuIGZhdWx0IGlmIHdlIGhhZCBubyBQVnMuCisKKwkJbCgndGVzdFBWZW1wdHlsaXN0aW5nIGVudHJ5JykKKworCQlkZXZpY2VfbmFtZXMgPSBUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCkKKworCQlmb3IgZCBpbiBkZXZpY2VfbmFtZXM6CisJCQlsKCJSZW1vdmluZyAlcyIgJSBkKQorCQkJbHZtLnB2UmVtb3ZlKGQpCisKKwkJY291bnQgPSAwCisKKwkJd2l0aCBsdm0ubGlzdFB2cygpIGFzIHB2czoKKwkJCWZvciBwIGluIHB2czoKKwkJCQljb3VudCArPSAxCisJCQkJbCgncHY9ICVzJyAlIHAuZ2V0TmFtZSgpKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShjb3VudCA9PSAwKQorCisJCWZvciBkIGluIGRldmljZV9uYW1lczoKKwkJCWx2bS5wdkNyZWF0ZShkKQorCisJZGVmIHRlc3RfcHZfY3JlYXRlKHNlbGYpOgorCQlzaXplID0gWzAsIDEwMjQgKiAxMDI0ICogNF0KKwkJcHZtZXRhX2NvcGllcyA9IFswLCAxLCAyXQorCQlwdm1ldGFfc2l6ZSA9IFswLCAyNTUsIDUxMiwgMTAyNF0KKwkJZGF0YV9hbGlnbm1lbnQgPSBbMCwgMjA0OCwgNDA5Nl0KKwkJemVybyA9IFswLCAxXQorCisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCisJCWZvciBkIGluIGRldmljZV9uYW1lczoKKwkJCWx2bS5wdlJlbW92ZShkKQorCisJCWQgPSBkZXZpY2VfbmFtZXNbMF0KKworCQkjVGVzdCBzb21lIGVycm9yIGNhc2VzCisJCXNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbHZtLnB2Q3JlYXRlLCBOb25lKQorCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIGx2bS5wdkNyZWF0ZSwgJycpCisJCXNlbGYuYXNzZXJ0UmFpc2VzKGx2bS5MaWJMVk1FcnJvciwgbHZtLnB2Q3JlYXRlLCBkLCA0KQorCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIGx2bS5wdkNyZWF0ZSwgZCwgMCwgNCkKKwkJc2VsZi5hc3NlcnRSYWlzZXMobHZtLkxpYkxWTUVycm9yLCBsdm0ucHZDcmVhdGUsIGQsIDAsIDAsIDAsIDIgKiogMzQpCisJCXNlbGYuYXNzZXJ0UmFpc2VzKAorCQkJbHZtLkxpYkxWTUVycm9yLCBsdm0ucHZDcmVhdGUsIGQsIDAsIDAsIDAsIDQwOTYsIDIgKiogMzQpCisKKwkJI1RyeSBhIG51bWJlciBvZiBjb21iaW5hdGlvbnMgYW5kIHBlcm11dGF0aW9ucworCQlmb3IgcyBpbiBzaXplOgorCQkJZm9yIGNvcGllcyBpbiBwdm1ldGFfY29waWVzOgorCQkJCWZvciBwdl9zaXplIGluIHB2bWV0YV9zaXplOgorCQkJCQlmb3IgYWxpZ24gaW4gZGF0YV9hbGlnbm1lbnQ6CisJCQkJCQlmb3IgeiBpbiB6ZXJvOgorCQkJCQkJCWx2bS5wdkNyZWF0ZShkLCBzLCBjb3BpZXMsIHB2X3NpemUsIGFsaWduLAorCQkJCQkJCQkgICAgIGFsaWduLCB6KQorCQkJCQkJCWx2bS5wdlJlbW92ZShkKQorCisJCSNSZXN0b3JlCisJCWZvciBkIGluIGRldmljZV9uYW1lczoKKwkJCWx2bS5wdkNyZWF0ZShkKQorCisJZGVmIHRlc3RfdmdfcmVkdWNlKHNlbGYpOgorCQkjIFRlc3QgdGhlIGNhc2Ugd2hlcmUgd2UgdHJ5IHRvIHJlZHVjZSBhIHZnIHdoZXJlIHRoZSBsYXN0IFBWIGhhcworCQkjIG5vIG1ldGFkYXRhIGNvcGllcy4gIEluIHRoaXMgY2FzZSB0aGUgcmVkdWNlIHNob3VsZCBmYWlsLgorCQl2Z19uYW1lID0gVGVzdEx2bS5WR19QICsgJ3JlZHVjZV90ZXN0JworCisJCWRldmljZV9uYW1lcyA9IFRlc3RMdm0uX2dldF9wdl9kZXZpY2VfbmFtZXMoKQorCisJCWZvciBkIGluIGRldmljZV9uYW1lczoKKwkJCWx2bS5wdlJlbW92ZShkKQorCisJCWx2bS5wdkNyZWF0ZShkZXZpY2VfbmFtZXNbMF0sIDAsIDApICAjIFNpemUgYWxsLCBwdm1ldGFkYXRhY29waWVzIDAKKwkJbHZtLnB2Q3JlYXRlKGRldmljZV9uYW1lc1sxXSkKKwkJbHZtLnB2Q3JlYXRlKGRldmljZV9uYW1lc1syXSkKKwkJbHZtLnB2Q3JlYXRlKGRldmljZV9uYW1lc1szXSkKKworCQl2ZyA9IGx2bS52Z0NyZWF0ZSh2Z19uYW1lKQorCisJCXZnLmV4dGVuZChkZXZpY2VfbmFtZXNbM10pCisJCXZnLmV4dGVuZChkZXZpY2VfbmFtZXNbMl0pCisJCXZnLmV4dGVuZChkZXZpY2VfbmFtZXNbMV0pCisJCXZnLmV4dGVuZChkZXZpY2VfbmFtZXNbMF0pCisJCXZnLmNsb3NlKCkKKworCQl2ZyA9IE5vbmUKKworCQl2ZyA9IGx2bS52Z09wZW4odmdfbmFtZSwgJ3cnKQorCisJCXZnLnJlZHVjZShkZXZpY2VfbmFtZXNbM10pCisJCXZnLnJlZHVjZShkZXZpY2VfbmFtZXNbMl0pCisKKwkJc2VsZi5hc3NlcnRSYWlzZXMobHZtLkxpYkxWTUVycm9yLCB2Zy5yZWR1Y2UsIGRldmljZV9uYW1lc1sxXSkKKworCQl2Zy5jbG9zZSgpCisJCXZnID0gTm9uZQorCisJCXZnID0gbHZtLnZnT3Blbih2Z19uYW1lLCAndycpCisJCXZnLnJlbW92ZSgpCisJCXZnLmNsb3NlKCkKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3Rlc3RfdmFsaWRfbmFtZXMobWV0aG9kKToKKwkJc2FtcGxlID0gJ2F6QVowOS5fLSsnCisKKwkJbWV0aG9kKCd4JyAqIDEyNykKKwkJbWV0aG9kKCcuWCcpCisJCW1ldGhvZCgnLi5YJykKKworCQlmb3IgaSBpbiByYW5nZSgxLCA3KToKKwkJCXRlc3RzID0gKCcnLmpvaW4oaSkgZm9yIGkgaW4gaXRlcnRvb2xzLnByb2R1Y3Qoc2FtcGxlLCByZXBlYXQ9aSkpCisJCQlmb3IgdCBpbiB0ZXN0czoKKwkJCQlpZiB0ID09ICcuJyBvciB0ID09ICcuLic6CisJCQkJCXQgKz0gJ1gnCisJCQkJZWxpZiB0LnN0YXJ0c3dpdGgoJy0nKToKKwkJCQkJdCA9ICdIJyArIHQKKwkJCQltZXRob2QodCkKKworCWRlZiBfdGVzdF9iYWRfbmFtZXMoc2VsZiwgbWV0aG9kLCBkdXBlX25hbWUpOgorCQkjIFRlc3QgZm9yIGR1cGxpY2F0ZSBuYW1lCisJCXNlbGYuYXNzZXJ0UmFpc2VzKGx2bS5MaWJMVk1FcnJvciwgbWV0aG9kLCBkdXBlX25hbWUpCisKKwkJIyBUZXN0IGZvciB0b28gbG9uZyBhIG5hbWUKKwkJc2VsZi5hc3NlcnRSYWlzZXMobHZtLkxpYkxWTUVycm9yLCBtZXRob2QsICgneCcgKiAxMjgpKQorCisJCSMgVGVzdCBlbXB0eQorCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIG1ldGhvZCwgJycpCisKKwkJIyBJbnZhbGlkIGNoYXJhY3RlcnMKKwkJc2VsZi5hc3NlcnRSYWlzZXMobHZtLkxpYkxWTUVycm9yLCBtZXRob2QsICcmaW52YWxpZF5jaGFyJykKKworCQkjIENhbm5vdCBzdGFydCB3aXRoIC4uIGFuZCBubyBmb2xsb3dpbmcgY2hhcmFjdGVycworCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIG1ldGhvZCwgJy4uJykKKworCQkjIENhbm5vdCBzdGFydCB3aXRoIC4gYW5kIG5vIGZvbGxvd2luZyBjaGFyYWN0ZXJzCisJCXNlbGYuYXNzZXJ0UmFpc2VzKGx2bS5MaWJMVk1FcnJvciwgbWV0aG9kLCAnLicpCisKKwkJIyBDYW5ub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbgorCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIG1ldGhvZCwgJy1ub3RfZ29vZCcpCisKKwlkZWYgX2x2X3Jlc2VydmVkX25hbWVzKHNlbGYsIG1ldGhvZCk6CisJCXByZWZpeGVzID0gWydzbmFwc2hvdCcsICdwdm1vdmUnXQorCQlyZXNlcnZlZCA9IFsKKwkJCSdfbWxvZycsICdfbWltYWdlJywgJ19wbXNwYXJlJywgJ19yaW1hZ2UnLCAnX3JtZXRhJywKKwkJCSdfdm9yaWdpbicsICdfdGRhdGEnLCAnX3RtZXRhJ10KKworCQlmb3IgcCBpbiBwcmVmaXhlczoKKwkJCXNlbGYuYXNzZXJ0UmFpc2VzKGx2bS5MaWJMVk1FcnJvciwgbWV0aG9kLCBwICsgcnMoMykpCisKKwkJZm9yIHIgaW4gcmVzZXJ2ZWQ6CisJCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIG1ldGhvZCwgcnMoMykgKyByICsgcnMoMSkpCisJCQlzZWxmLmFzc2VydFJhaXNlcyhsdm0uTGliTFZNRXJyb3IsIG1ldGhvZCwgciArIHJzKDEpKQorCisJZGVmIHRlc3RfdmdfbHZfbmFtZV92YWxpZGF0ZShzZWxmKToKKwkJbHZfbmFtZSA9ICd2Z19sdl9uYW1lX3ZhbGlkYXRlJworCQlUZXN0THZtLl9jcmVhdGVfdGhpbl9sdihUZXN0THZtLl9nZXRfcHZfZGV2aWNlX25hbWVzKCksIGx2X25hbWUpCisJCWx2LCB2ZyA9IFRlc3RMdm0uX2dldF9sdihOb25lLCBsdl9uYW1lKQorCisJCXNlbGYuX3Rlc3RfYmFkX25hbWVzKGx2bS52Z05hbWVWYWxpZGF0ZSwgdmcuZ2V0TmFtZSgpKQorCQlzZWxmLl90ZXN0X2JhZF9uYW1lcyh2Zy5sdk5hbWVWYWxpZGF0ZSwgbHYuZ2V0TmFtZSgpKQorCisJCSMgVGVzdCBnb29kIHZhbHVlcworCQlUZXN0THZtLl90ZXN0X3ZhbGlkX25hbWVzKGx2bS52Z05hbWVWYWxpZGF0ZSkKKwkJVGVzdEx2bS5fdGVzdF92YWxpZF9uYW1lcyh2Zy5sdk5hbWVWYWxpZGF0ZSkKKwkJc2VsZi5fbHZfcmVzZXJ2ZWRfbmFtZXModmcubHZOYW1lVmFsaWRhdGUpCisKKwkJdmcuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCXVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdC9hcGkvdGVzdC5jIGIvdGVzdC9hcGkvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTMwMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwaS90ZXN0LmMKQEAgLTAsMCArMSwxMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorI2luY2x1ZGUgImx2bTJhcHAuaCIKKworI2lmZGVmIFJFQURMSU5FX1NVUFBPUlQKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorCisjZGVmaW5lIE1BWF9BUkdTIDY0CisKK3N0YXRpYyBpbnQgbHZtX3NwbGl0KGNoYXIgKnN0ciwgaW50ICphcmdjLCBjaGFyICoqYXJndiwgaW50IG1heCkKK3sKKwljaGFyICpiID0gc3RyLCAqZTsKKwkqYXJnYyA9IDA7CisKKwl3aGlsZSAoKmIpIHsKKwkJd2hpbGUgKCpiICYmIGlzc3BhY2UoKmIpKQorCQkJYisrOworCisJCWlmICgoISpiKSB8fCAoKCphcmdjID09IDApJiYoKmIgPT0gJyMnKSkpCisJCQlicmVhazsKKworCQllID0gYjsKKwkJd2hpbGUgKCplICYmICFpc3NwYWNlKCplKSkKKwkJCWUrKzsKKworCQlhcmd2WygqYXJnYykrK10gPSBiOworCQlpZiAoISplKQorCQkJYnJlYWs7CisJCSplKysgPSAnXDAnOworCQliID0gZTsKKwkJaWYgKCphcmdjID09IG1heCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAqYXJnYzsKK30KKworc3RhdGljIHZvaWQgX3Nob3dfaGVscCh2b2lkKQoreworCXByaW50ZigiJ2x2X2FjdGl2YXRlIHZnbmFtZSBsdm5hbWU6ICIKKwkgICAgICAgIkFjdGl2YXRlIGFuIExWXG4iKTsKKwlwcmludGYoIidsdl9kZWFjdGl2YXRlIHZnbmFtZSBsdm5hbWU6ICIKKwkgICAgICAgIkRlYWN0aXZhdGUgYW4gTFZcbiIpOworCXByaW50ZigiJ3ZnX3JlbW92ZV9sdiB2Z25hbWUgbHZuYW1lJzogIgorCSAgICAgICAiUmVtb3ZlIGEgTFZcbiIpOworCXByaW50ZigiJ3ZnX2NyZWF0ZV9sdl9saW5lYXIgdmduYW1lIGx2bmFtZSBzaXplX2luX2J5dGVzJzogIgorCSAgICAgICAiQ3JlYXRlIGEgbGluZWFyIExWXG4iKTsKKwlwcmludGYoIidzY2FuX3Zncyc6ICIKKwkgICAgICAgIlNjYW4gdGhlIHN5c3RlbSBmb3IgTFZNIG1ldGFkYXRhXG4iKTsKKwlwcmludGYoIidsaXN0X3ZnX25hbWVzJzogIgorCSAgICAgICAiTGlzdCB0aGUgbmFtZXMgb2YgdGhlIFZHcyB0aGF0IGV4aXN0IGluIHRoZSBzeXN0ZW1cbiIpOworCXByaW50ZigiJ2xpc3RfdmdfaWRzJzogIgorCSAgICAgICAiTGlzdCB0aGUgdXVpZHMgb2YgdGhlIFZHcyB0aGF0IGV4aXN0IGluIHRoZSBzeXN0ZW1cbiIpOworCXByaW50ZigiJ3ZnX2xpc3RfcHZzIHZnbmFtZSc6ICIKKwkgICAgICAgIkxpc3QgdGhlIFBWcyB0aGF0IGV4aXN0IGluIFZHIHZnbmFtZVxuIik7CisJcHJpbnRmKCIncHZfbGlzdF9wdnNlZ3MgcHZuYW1lJzogIgorCSAgICAgICAiTGlzdCB0aGUgUFYgc2VnbWVudHMgdGhhdCBleGlzdCBpbiBQViBwdm5hbWVcbiIpOworCXByaW50ZigiJ3ZnX2xpc3RfbHZzIHZnbmFtZSc6ICIKKwkgICAgICAgIkxpc3QgdGhlIExWcyB0aGF0IGV4aXN0IGluIFZHIHZnbmFtZVxuIik7CisJcHJpbnRmKCInbHZfbGlzdF9sdnNlZ3MgdmduYW1lIGx2bmFtZSc6ICIKKwkgICAgICAgIkxpc3QgdGhlIExWIHNlZ21lbnRzIHRoYXQgZXhpc3QgaW4gTFYgdmduYW1lL2x2bmFtZVxuIik7CisJcHJpbnRmKCIndmdzX29wZW4nOiAiCisJICAgICAgICJMaXN0IHRoZSBWR3MgdGhhdCBhcmUgY3VycmVudGx5IG9wZW5cbiIpOworCXByaW50ZigiJ3Zncyc6ICIKKwkgICAgICAgIkxpc3QgYWxsIFZHcyBrbm93biB0byB0aGUgc3lzdGVtXG4iKTsKKwlwcmludGYoIid2Z19leHRlbmQgdmduYW1lIGRldmljZTogIgorCSAgICAgICAiSXNzdWUgYSBsdm1fdmdfZXh0ZW5kKCkgQVBJIGNhbGwgb24gVkcgJ3ZnbmFtZSdcbiIpOworCXByaW50ZigiJ3ZnX3JlZHVjZSB2Z25hbWUgZGV2aWNlOiAiCisJICAgICAgICJJc3N1ZSBhIGx2bV92Z19yZWR1Y2UoKSBBUEkgY2FsbCBvbiBWRyAndmduYW1lJ1xuIik7CisJcHJpbnRmKCIndmdfb3BlbiB2Z25hbWUgWydyJyB8ICd3J10nOiAiCisJICAgICAgICJJc3N1ZSBhIGx2bV92Z19vcGVuKCkgQVBJIGNhbGwgb24gVkcgJ3ZnbmFtZSdcbiIpOworCXByaW50ZigiJ3ZnX2Nsb3NlIHZnbmFtZSc6ICIKKwkgICAgICAgIklzc3VlIGEgbHZtX3ZnX2Nsb3NlKCkgQVBJIGNhbGwgb24gVkcgJ3ZnbmFtZSdcbiIpOworCXByaW50ZigiJ3ZnX2NyZWF0ZSB2Z25hbWU6ICIKKwkgICAgICAgIklzc3VlIGEgbHZtX3ZnX2NyZWF0ZSgpIHRvIGNyZWF0ZSBWRyAndmduYW1lJ1xuIik7CisJcHJpbnRmKCIndmdfcmVtb3ZlIHZnbmFtZTogIgorCSAgICAgICAiSXNzdWUgYSBsdm1fdmdfcmVtb3ZlKCkgdG8gcmVtb3ZlIFZHICd2Z25hbWUnXG4iKTsKKwlwcmludGYoIidjb25maWdfcmVsb2FkJzogIgorCSAgICAgICAiSXNzdWUgYSBsdm1fY29uZmlnX3JlbG9hZCgpIEFQSSB0byByZWxvYWQgTFZNIGNvbmZpZ1xuIik7CisJcHJpbnRmKCInY29uZmlnX292ZXJyaWRlJyBkZXZpY2U6ICIKKwkgICAgICAgIklzc3VlIGEgbHZtX2NvbmZpZ19vdmVycmlkZSgpIHdpdGggYWNjZXB0IGRldmljZSBmaWx0ZXJcbiIpOworCXByaW50ZigiJ3ZnX2dldF90YWdzIHZnbmFtZSc6ICIKKwkgICAgICAgIkxpc3QgdGhlIHRhZ3Mgb2YgYSBWR1xuIik7CisJcHJpbnRmKCInbHZfZ2V0X3Byb3BlcnR5IHZnbmFtZSBsdm5hbWUgcHJvcGVydHlfbmFtZSc6ICIKKwkgICAgICAgIkRpc3BsYXkgdGhlIHZhbHVlIG9mIExWIHByb3BlcnR5XG4iKTsKKwlwcmludGYoIid2Z19nZXRfcHJvcGVydHkgdmduYW1lIHByb3BlcnR5X25hbWUnOiAiCisJICAgICAgICJEaXNwbGF5IHRoZSB2YWx1ZSBvZiBWRyBwcm9wZXJ0eVxuIik7CisJcHJpbnRmKCIncHZfZ2V0X3Byb3BlcnR5IHB2bmFtZSBwcm9wZXJ0eV9uYW1lJzogIgorCSAgICAgICAiRGlzcGxheSB0aGUgdmFsdWUgb2YgUFYgcHJvcGVydHlcbiIpOworCXByaW50ZigiJ3ZnX3NldF9wcm9wZXJ0eSB2Z25hbWUgcHJvcGVydHlfbmFtZSc6ICIKKwkgICAgICAgIlNldCB0aGUgdmFsdWUgb2YgVkcgcHJvcGVydHlcbiIpOworCXByaW50ZigiJ2x2X2dldF90YWdzIHZnbmFtZSBsdm5hbWUnOiAiCisJICAgICAgICJMaXN0IHRoZSB0YWdzIG9mIGEgTFZcbiIpOworCXByaW50ZigiJ3ZnX3thZGR8cmVtb3ZlfV90YWcgdmduYW1lIHRhZyc6ICIKKwkgICAgICAgIkFkZC9yZW1vdmUgYSB0YWcgZnJvbSBhIFZHXG4iKTsKKwlwcmludGYoIidsdl97YWRkfHJlbW92ZX1fdGFnIHZnbmFtZSBsdm5hbWUgdGFnJzogIgorCSAgICAgICAiQWRkL3JlbW92ZSBhIHRhZyBmcm9tIGEgTFZcbiIpOworCXByaW50ZigiJ3ZnbmFtZV9mcm9tX2Rldm5hbWUgZGV2aWNlJzogIgorCSAgICAgICAiTG9va3VwIGEgdmduYW1lIGZyb20gYSBkZXZpY2UgbmFtZVxuIik7CisJcHJpbnRmKCIndmduYW1lX2Zyb21fcHZpZCBwdmlkJzogIgorCSAgICAgICAiTG9va3VwIGEgdmduYW1lIGZyb20gYSBwdmlkXG4iKTsKKwlwcmludGYoIidsdl9mcm9tX3V1aWQgdmduYW1lIGx2dXVpZCc6ICIKKwkgICAgICAgIkxvb2t1cCBhbiBMViBmcm9tIGFuIExWIHV1aWRcbiIpOworCXByaW50ZigiJ2x2X2Zyb21fbmFtZSB2Z25hbWUgbHZuYW1lJzogIgorCSAgICAgICAiTG9va3VwIGFuIExWIGZyb20gYW4gTFYgbmFtZVxuIik7CisJcHJpbnRmKCIncHZfZnJvbV91dWlkIHZnbmFtZSBwdnV1aWQnOiAiCisJICAgICAgICJMb29rdXAgYW4gTFYgZnJvbSBhbiBMViB1dWlkXG4iKTsKKwlwcmludGYoIidwdl9mcm9tX25hbWUgdmduYW1lIHB2bmFtZSc6ICIKKwkgICAgICAgIkxvb2t1cCBhbiBMViBmcm9tIGFuIExWIG5hbWVcbiIpOworCXByaW50ZigiJ3F1aXQnOiBleGl0IHRoZSBwcm9ncmFtXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBkbV9oYXNoX3RhYmxlICpfdmdpZF9oYXNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX3ZnbmFtZV9oYXNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX3B2bmFtZV9oYXNoID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZG1faGFzaF90YWJsZSAqX2x2bmFtZV9oYXNoID0gTlVMTDsKKworc3RhdGljIHZvaWQgX2hhc2hfZGVzdHJveV9zaW5nbGUoc3RydWN0IGRtX2hhc2hfdGFibGUgKipodGFibGUpCit7CisJaWYgKGh0YWJsZSAmJiAqaHRhYmxlKSB7CisJCWRtX2hhc2hfZGVzdHJveSgqaHRhYmxlKTsKKwkJKmh0YWJsZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBfaGFzaF9kZXN0cm95KHZvaWQpCit7CisJX2hhc2hfZGVzdHJveV9zaW5nbGUoJl92Z25hbWVfaGFzaCk7CisJX2hhc2hfZGVzdHJveV9zaW5nbGUoJl92Z2lkX2hhc2gpOworCV9oYXNoX2Rlc3Ryb3lfc2luZ2xlKCZfcHZuYW1lX2hhc2gpOworCV9oYXNoX2Rlc3Ryb3lfc2luZ2xlKCZfbHZuYW1lX2hhc2gpOworfQorCitzdGF0aWMgaW50IF9oYXNoX2NyZWF0ZSh2b2lkKQoreworCWlmICghKF92Z25hbWVfaGFzaCA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShfcHZuYW1lX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkgeworCQlfaGFzaF9kZXN0cm95X3NpbmdsZSgmX3ZnbmFtZV9oYXNoKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKF9sdm5hbWVfaGFzaCA9IGRtX2hhc2hfY3JlYXRlKDEyOCkpKSB7CisJCV9oYXNoX2Rlc3Ryb3lfc2luZ2xlKCZfdmduYW1lX2hhc2gpOworCQlfaGFzaF9kZXN0cm95X3NpbmdsZSgmX3B2bmFtZV9oYXNoKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKF92Z2lkX2hhc2ggPSBkbV9oYXNoX2NyZWF0ZSgxMjgpKSkgeworCQlfaGFzaF9kZXN0cm95X3NpbmdsZSgmX3ZnbmFtZV9oYXNoKTsKKwkJX2hhc2hfZGVzdHJveV9zaW5nbGUoJl9wdm5hbWVfaGFzaCk7CisJCV9oYXNoX2Rlc3Ryb3lfc2luZ2xlKCZfbHZuYW1lX2hhc2gpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBwZXIgdmcgKi8KK3N0YXRpYyBsdl90IF9sb29rdXBfbHZfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWx2X3QgbHY7CisKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRmICgiSW52YWxpZCBMViBuYW1lXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKGx2ID0gZG1faGFzaF9sb29rdXAoX2x2bmFtZV9oYXNoLCBuYW1lKSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCAlcyBpbiBMVnMgLSBydW4gdmdfY3JlYXRlX2x2IGZpcnN0XG4iLAorCQkJbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbHY7Cit9CisKK3N0YXRpYyB2Z190IF9sb29rdXBfdmdfYnlfbmFtZShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYgKCJQbGVhc2UgZW50ZXIgdmdfbmFtZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoISh2ZyA9IGRtX2hhc2hfbG9va3VwKF92Z2lkX2hhc2gsIGFyZ3ZbMV0pKSAmJgorCSAgICAhKHZnID0gZG1faGFzaF9sb29rdXAoX3ZnbmFtZV9oYXNoLCBhcmd2WzFdKSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCAlcyBpbiBvcGVuIFZHcyAtIHJ1biB2Z19vcGVuIGZpcnN0XG4iLAorCQkJYXJndlsxXSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdmc7Cit9CisKK3N0YXRpYyBwdl90IF9sb29rdXBfcHZfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXB2X3QgcHY7CisKKwlpZiAoIShwdiA9IGRtX2hhc2hfbG9va3VwKF9wdm5hbWVfaGFzaCwgbmFtZSkpKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgJXMgaW4gb3BlbiBQVnMgLSBydW4gdmdfb3BlbiBmaXJzdFxuIiwKKwkJCW5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHB2OworfQorCitzdGF0aWMgdm9pZCBfYWRkX2x2c190b19sdm5hbWVfaGFzaChzdHJ1Y3QgZG1fbGlzdCAqbHZzKQoreworCXN0cnVjdCBsdm1fbHZfbGlzdCAqbHZsOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGx2cykgeworCQkvKiBDb25jYXRlbmF0ZSBWRyBuYW1lIHdpdGggTFYgbmFtZSAqLworCQlkbV9oYXNoX2luc2VydChfbHZuYW1lX2hhc2gsIGx2bV9sdl9nZXRfbmFtZShsdmwtPmx2KSwgbHZsLT5sdik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfYWRkX3B2c190b19wdm5hbWVfaGFzaChzdHJ1Y3QgZG1fbGlzdCAqcHZzKQoreworCXN0cnVjdCBsdm1fcHZfbGlzdCAqcHZsOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHB2cykgeworCQlkbV9oYXNoX2luc2VydChfcHZuYW1lX2hhc2gsIGx2bV9wdl9nZXRfbmFtZShwdmwtPnB2KSwgcHZsLT5wdik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcmVtb3ZlX2RldmljZV9mcm9tX3B2bmFtZV9oYXNoKHN0cnVjdCBkbV9saXN0ICpwdnMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGx2bV9wdl9saXN0ICpwdmw7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzKSB7CisJCWlmICghc3RybmNtcChsdm1fcHZfZ2V0X25hbWUocHZsLT5wdiksIG5hbWUsIHN0cmxlbihuYW1lKSkpCisJCQlkbV9oYXNoX3JlbW92ZShfcHZuYW1lX2hhc2gsIG5hbWUpOworCX0KK30KK3N0YXRpYyB2b2lkIF9hZGRfZGV2aWNlX3RvX3B2bmFtZV9oYXNoKHN0cnVjdCBkbV9saXN0ICpwdnMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGx2bV9wdl9saXN0ICpwdmw7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgcHZzKSB7CisJCWlmICghc3RybmNtcChsdm1fcHZfZ2V0X25hbWUocHZsLT5wdiksIG5hbWUsIHN0cmxlbihuYW1lKSkpCisJCQlkbV9oYXNoX2luc2VydChfcHZuYW1lX2hhc2gsIG5hbWUsIHB2bC0+cHYpOworCX0KK30KKworc3RhdGljIHZvaWQgX3ZnX3JlZHVjZShjaGFyICoqYXJndiwgaW50IGFyZ2MsIGx2bV90IGxpYmgpCit7CisJdmdfdCB2ZzsKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZzOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZiAoIlBsZWFzZSBlbnRlciB2Z19uYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh2ZyA9IGRtX2hhc2hfbG9va3VwKF92Z2lkX2hhc2gsIGFyZ3ZbMV0pKSAmJgorCSAgICAhKHZnID0gZG1faGFzaF9sb29rdXAoX3ZnbmFtZV9oYXNoLCBhcmd2WzFdKSkpIHsKKwkJcHJpbnRmICgiVkcgbm90IG9wZW5cbiIpOworCQlyZXR1cm47CisJfQorCWlmIChsdm1fdmdfcmVkdWNlKHZnLCBhcmd2WzJdKSkgeworCQlwcmludGYoIkVycm9yIHJlZHVjaW5nICVzIGJ5ICVzXG4iLCBhcmd2WzFdLCBhcmd2WzJdKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiU3VjY2VzcyByZWR1Y2luZyB2ZyAlcyBieSAlc1xuIiwgYXJndlsxXSwgYXJndlsyXSk7CisKKwkvKgorCSAqIEFkZCB0aGUgZGV2aWNlIGludG8gdGhlIGhhc2hlcyBmb3IgbG9va3VwcworCSAqLworCXB2cyA9IGx2bV92Z19saXN0X3B2cyh2Zyk7CisJaWYgKHB2cyAmJiAhZG1fbGlzdF9lbXB0eShwdnMpKQorCQlfcmVtb3ZlX2RldmljZV9mcm9tX3B2bmFtZV9oYXNoKHB2cywgYXJndlsyXSk7Cit9CisKKy8qIFByaW50ICJFcnJvciIgb3IgIlN1Y2Nlc3MiIGRlcGVuZGluZyBvbiBsdm0gc3RhdHVzICovCitzdGF0aWMgaW50IF9sdm1fc3RhdHVzX3RvX3Bhc3NfZmFpbChpbnQgcmMpCit7CisJaWYgKHJjKQorCQlwcmludGYoIkVycm9yICIpOworCWVsc2UKKwkJcHJpbnRmKCJTdWNjZXNzICIpOworCXJldHVybiByYzsKK30KK3N0YXRpYyB2b2lkIF9jb25maWdfb3ZlcnJpZGUoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBsdm1fdCBsaWJoKQoreworCWludCByYzsKKwljaGFyIHRtcFs2NF07CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcHJpbnRmICgiUGxlYXNlIGVudGVyIGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisJc25wcmludGYodG1wLCA2MywgImRldmljZXN7ZmlsdGVyPVtcImF8JXN8XCIsIFwicnwuKnxcIl19IiwgYXJndlsxXSk7CisJcmMgPSBsdm1fY29uZmlnX292ZXJyaWRlKGxpYmgsIHRtcCk7CisJX2x2bV9zdGF0dXNfdG9fcGFzc19mYWlsKHJjKTsKKwlwcmludGYoIm92ZXJyaWRpbmcgTFZNIGNvbmZpZ3VyYXRpb25cbiIpOworfQorCitzdGF0aWMgdm9pZCBfY29uZmlnX3JlbG9hZChjaGFyICoqYXJndiwgaW50IGFyZ2MsIGx2bV90IGxpYmgpCit7CisJaW50IHJjOworCXJjID0gbHZtX2NvbmZpZ19yZWxvYWQobGliaCk7CisJX2x2bV9zdGF0dXNfdG9fcGFzc19mYWlsKHJjKTsKKwlwcmludGYoInJlbG9hZGluZyBMVk0gY29uZmlndXJhdGlvblxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF92Z19leHRlbmQoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBsdm1fdCBsaWJoKQoreworCXZnX3Qgdmc7CisJc3RydWN0IGRtX2xpc3QgKnB2czsKKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYgKCJQbGVhc2UgZW50ZXIgdmdfbmFtZVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEodmcgPSBkbV9oYXNoX2xvb2t1cChfdmdpZF9oYXNoLCBhcmd2WzFdKSkgJiYKKwkgICAgISh2ZyA9IGRtX2hhc2hfbG9va3VwKF92Z25hbWVfaGFzaCwgYXJndlsxXSkpKSB7CisJCXByaW50ZiAoIlZHIG5vdCBvcGVuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobHZtX3ZnX2V4dGVuZCh2ZywgYXJndlsyXSkpIHsKKwkJcHJpbnRmKCJFcnJvciBleHRlbmRpbmcgJXMgd2l0aCAlc1xuIiwgYXJndlsxXSwgYXJndlsyXSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIlN1Y2Nlc3MgZXh0ZW5kaW5nIHZnICVzIHdpdGggJXNcbiIsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJLyoKKwkgKiBBZGQgdGhlIGRldmljZSBpbnRvIHRoZSBoYXNoZXMgZm9yIGxvb2t1cHMKKwkgKi8KKwlwdnMgPSBsdm1fdmdfbGlzdF9wdnModmcpOworCWlmIChwdnMgJiYgIWRtX2xpc3RfZW1wdHkocHZzKSkKKwkJX2FkZF9kZXZpY2VfdG9fcHZuYW1lX2hhc2gocHZzLCBhcmd2WzJdKTsKK30KKworc3RhdGljIHZvaWQgX3ZnX29wZW4oY2hhciAqKmFyZ3YsIGludCBhcmdjLCBsdm1fdCBsaWJoKQoreworCXZnX3Qgdmc7CisJc3RydWN0IGRtX2xpc3QgKmx2czsKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZzOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZiAoIlBsZWFzZSBlbnRlciB2Z19uYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHZnID0gZG1faGFzaF9sb29rdXAoX3ZnaWRfaGFzaCwgYXJndlsxXSkpIHx8CisJICAgICh2ZyA9IGRtX2hhc2hfbG9va3VwKF92Z25hbWVfaGFzaCwgYXJndlsxXSkpKSB7CisJCXByaW50ZiAoIlZHIGFscmVhZHkgb3BlblxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKGFyZ2MgPCAzKQorCQl2ZyA9IGx2bV92Z19vcGVuKGxpYmgsIGFyZ3ZbMV0sICJyIiwgMCk7CisJZWxzZQorCQl2ZyA9IGx2bV92Z19vcGVuKGxpYmgsIGFyZ3ZbMV0sIGFyZ3ZbMl0sIDApOworCWlmICghdmcgfHwgIWx2bV92Z19nZXRfbmFtZSh2ZykpIHsKKwkJcHJpbnRmKCJFcnJvciBvcGVuaW5nICVzXG4iLCBhcmd2WzFdKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiU3VjY2VzcyBvcGVuaW5nIHZnICVzXG4iLCBhcmd2WzFdKTsKKwlkbV9oYXNoX2luc2VydChfdmduYW1lX2hhc2gsIGx2bV92Z19nZXRfbmFtZSh2ZyksIHZnKTsKKwlkbV9oYXNoX2luc2VydChfdmdpZF9oYXNoLCBsdm1fdmdfZ2V0X3V1aWQodmcpLCB2Zyk7CisKKwkvKgorCSAqIEFkZCB0aGUgTFZzIGFuZCBQVnMgaW50byB0aGUgaGFzaGVzIGZvciBsb29rdXBzCisJICovCisJbHZzID0gbHZtX3ZnX2xpc3RfbHZzKHZnKTsKKwlpZiAobHZzICYmICFkbV9saXN0X2VtcHR5KGx2cykpCisJCV9hZGRfbHZzX3RvX2x2bmFtZV9oYXNoKGx2cyk7CisJcHZzID0gbHZtX3ZnX2xpc3RfcHZzKHZnKTsKKwlpZiAocHZzICYmICFkbV9saXN0X2VtcHR5KHB2cykpCisJCV9hZGRfcHZzX3RvX3B2bmFtZV9oYXNoKHB2cyk7Cit9CisvKiBMb29rdXAgdGhlIHZnIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdmduYW1lIGFuZCB2Z2lkIGhhc2hlcyAqLworc3RhdGljIHZnX3QgX2xvb2t1cF9hbmRfcmVtb3ZlX3ZnKGNvbnN0IGNoYXIgKnZnbmFtZSkKK3sKKwl2Z190IHZnPU5VTEw7CisKKwlpZiAoKHZnID0gZG1faGFzaF9sb29rdXAoX3ZnbmFtZV9oYXNoLCB2Z25hbWUpKSkgeworCQlkbV9oYXNoX3JlbW92ZShfdmdpZF9oYXNoLCBsdm1fdmdfZ2V0X3V1aWQodmcpKTsKKwkJZG1faGFzaF9yZW1vdmUoX3ZnbmFtZV9oYXNoLCBsdm1fdmdfZ2V0X25hbWUodmcpKTsKKwl9CisJaWYgKCF2ZyAmJiAodmcgPSBkbV9oYXNoX2xvb2t1cChfdmdpZF9oYXNoLCB2Z25hbWUpKSkgeworCQlkbV9oYXNoX3JlbW92ZShfdmdpZF9oYXNoLCBsdm1fdmdfZ2V0X3V1aWQodmcpKTsKKwkJZG1faGFzaF9yZW1vdmUoX3ZnbmFtZV9oYXNoLCBsdm1fdmdfZ2V0X25hbWUodmcpKTsKKwl9CisJcmV0dXJuIHZnOworfQorCitzdGF0aWMgdm9pZCBfdmdfd3JpdGUoY2hhciAqKmFyZ3YsIGludCBhcmdjKQoreworCXZnX3Qgdmc7CisJaW50IHJjID0gMDsKKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYgKCJQbGVhc2UgZW50ZXIgdmdfbmFtZVxuIik7CisJCXJldHVybjsKKwl9CisJdmcgPSBfbG9va3VwX3ZnX2J5X25hbWUoYXJndiwgYXJnYyk7CisJaWYgKCF2ZykgeworCQlwcmludGYoIkNhbid0IGZpbmQgdmdfbmFtZSAlc1xuIiwgYXJndlsxXSk7CisJCXJldHVybjsKKwl9CisJcmMgPSBsdm1fdmdfd3JpdGUodmcpOworCV9sdm1fc3RhdHVzX3RvX3Bhc3NfZmFpbChyYyk7CisJcHJpbnRmKCJ3cml0aW5nIFZHICVzXG4iLCBsdm1fdmdfZ2V0X25hbWUodmcpKTsKK30KKworc3RhdGljIHZvaWQgX3ZnX2NyZWF0ZShjaGFyICoqYXJndiwgaW50IGFyZ2MsIGx2bV90IGxpYmgpCit7CisJdmdfdCB2ZzsKKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYgKCJQbGVhc2UgZW50ZXIgdmdfbmFtZVxuIik7CisJCXJldHVybjsKKwl9CisJdmcgPSBsdm1fdmdfY3JlYXRlKGxpYmgsIGFyZ3ZbMV0pOworCWlmICghdmcgfHwgIWx2bV92Z19nZXRfbmFtZSh2ZykpIHsKKwkJcHJpbnRmKCJFcnJvciBjcmVhdGluZyAlc1xuIiwgYXJndlsxXSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIlN1Y2Nlc3MgY3JlYXRpbmcgdmcgJXNcbiIsIGFyZ3ZbMV0pOworCWRtX2hhc2hfaW5zZXJ0KF92Z25hbWVfaGFzaCwgbHZtX3ZnX2dldF9uYW1lKHZnKSwgdmcpOworCWRtX2hhc2hfaW5zZXJ0KF92Z2lkX2hhc2gsIGx2bV92Z19nZXRfdXVpZCh2ZyksIHZnKTsKK30KKworc3RhdGljIHZvaWQgX3ZnX3JlbW92ZShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZiAoIlBsZWFzZSBlbnRlciB2Z19uYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwl2ZyA9IF9sb29rdXBfdmdfYnlfbmFtZShhcmd2LCBhcmdjKTsKKwlpZiAoIXZnKSB7CisJCXByaW50ZigiQ2FuJ3QgZmluZCB2Z19uYW1lICVzXG4iLCBhcmd2WzFdKTsKKwkJcmV0dXJuOworCX0KKwlyYyA9IGx2bV92Z19yZW1vdmUodmcpOworCV9sdm1fc3RhdHVzX3RvX3Bhc3NfZmFpbChyYyk7CisJcHJpbnRmKCJyZW1vdmluZyBWR1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIF92Z19jbG9zZShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXByaW50ZiAoIlBsZWFzZSBlbnRlciB2Z19uYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwl2ZyA9IF9sb29rdXBfYW5kX3JlbW92ZV92Zyhhcmd2WzFdKTsKKwlpZiAoIXZnKSB7CisJCXByaW50ZigiQ2FuJ3QgZmluZCB2Z19uYW1lICVzXG4iLCBhcmd2WzFdKTsKKwkJcmV0dXJuOworCX0KKwlyYyA9IGx2bV92Z19jbG9zZSh2Zyk7CisJX2x2bV9zdGF0dXNfdG9fcGFzc19mYWlsKHJjKTsKKwlwcmludGYoImNsb3NpbmcgVkdcbiIpOworfQorCitzdGF0aWMgdm9pZCBfc2hvd19vbmVfdmcodmdfdCB2ZykKK3sKKwlwcmludGYoIiVzICglcyk6IHN6PSUiUFJJdTY0IiwgZnJlZT0lIlBSSXU2NCIsICNwdj0lIlBSSXU2NAorCQkiLCBzZXEjPSUiUFJJdTY0IlxuIiwKKwkJbHZtX3ZnX2dldF9uYW1lKHZnKSwgbHZtX3ZnX2dldF91dWlkKHZnKSwKKwkJbHZtX3ZnX2dldF9zaXplKHZnKSwgbHZtX3ZnX2dldF9mcmVlX3NpemUodmcpLAorCQlsdm1fdmdfZ2V0X3B2X2NvdW50KHZnKSwgbHZtX3ZnX2dldF9zZXFubyh2ZykpOworfQorCitzdGF0aWMgdm9pZCBfcHJpbnRfcHYocHZfdCBwdikKK3sKKwlpZiAoIXB2KQorCQlyZXR1cm47CisJcHJpbnRmKCIlcyAoJXMpOiBzaXplPSUiUFJJdTY0IiwgZnJlZT0lIlBSSXU2NAorCSAgICAgICAiLCBkZXZfc2l6ZT0lIlBSSXU2NCIsIG1kYV9jb3VudD0lIlBSSXU2NCJcbiIsCisJICAgICAgIGx2bV9wdl9nZXRfbmFtZShwdiksIGx2bV9wdl9nZXRfdXVpZChwdiksCisJICAgICAgIGx2bV9wdl9nZXRfc2l6ZShwdiksIGx2bV9wdl9nZXRfZnJlZShwdiksCisJICAgICAgIGx2bV9wdl9nZXRfZGV2X3NpemUocHYpLAorCSAgICAgICBsdm1fcHZfZ2V0X21kYV9jb3VudChwdikpOworfQorCitzdGF0aWMgdm9pZCBfcHJpbnRfbHYodmdfdCB2ZywgbHZfdCBsdikKK3sKKwlpZiAoIWx2KQorCQlyZXR1cm47CisJcHJpbnRmKCIlcy8lcyAoJXMpOiBzaXplPSUiUFJJdTY0IiwgJXNBQ1RJVkUgLyAlc1NVU1BFTkRFRFxuIiwKKwkgICAgICAgbHZtX3ZnX2dldF9uYW1lKHZnKSwKKwkgICAgICAgbHZtX2x2X2dldF9uYW1lKGx2KSwgbHZtX2x2X2dldF91dWlkKGx2KSwKKwkgICAgICAgbHZtX2x2X2dldF9zaXplKGx2KSwKKwkgICAgICAgbHZtX2x2X2lzX2FjdGl2ZShsdikgPyAiIiA6ICJJTiIsCisJICAgICAgIGx2bV9sdl9pc19zdXNwZW5kZWQobHYpID8gIiIgOiAiTk9UICIpOworfQorCitzdGF0aWMgdm9pZCBfbGlzdF9vcGVuX3Zncyh2b2lkKQoreworCWRtX2hhc2hfaXRlcihfdmdpZF9oYXNoLCAoZG1faGFzaF9pdGVyYXRlX2ZuKSBfc2hvd19vbmVfdmcpOworfQorCitzdGF0aWMgdm9pZCBfcHZzX2luX3ZnKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZzOworCXN0cnVjdCBsdm1fcHZfbGlzdCAqcHZsOworCXZnX3Qgdmc7CisKKwlpZiAoISh2ZyA9IF9sb29rdXBfdmdfYnlfbmFtZShhcmd2LCBhcmdjKSkpCisJCXJldHVybjsKKwlwdnMgPSBsdm1fdmdfbGlzdF9wdnModmcpOworCWlmICghcHZzIHx8IGRtX2xpc3RfZW1wdHkocHZzKSkgeworCQlwcmludGYoIk5vIFBWcyBpbiBWRyAlc1xuIiwgbHZtX3ZnX2dldF9uYW1lKHZnKSk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKCJQVnMgaW4gVkcgJXM6XG4iLCBsdm1fdmdfZ2V0X25hbWUodmcpKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCBwdnMpIHsKKwkJX3ByaW50X3B2KHB2bC0+cHYpOworCX0KK30KKworc3RhdGljIHZvaWQgX3ByaW50X3Byb3BlcnR5X3ZhbHVlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHYpCit7CisJaWYgKCF2LmlzX3ZhbGlkKQorCQlwcmludGYoIiVzID0gSU5WQUxJRFxuIiwgbmFtZSk7CisJZWxzZSBpZiAodi5pc19zdHJpbmcpCisJCXByaW50ZigiJXMgPSAlc1xuIiwgbmFtZSwgdi52YWx1ZS5zdHJpbmcpOworCWVsc2UKKwkJcHJpbnRmKCIlcyA9ICUiUFJJdTY0IlxuIiwgbmFtZSwgdi52YWx1ZS5pbnRlZ2VyKTsKK30KKworc3RhdGljIHZvaWQgX3B2c2Vnc19pbl9wdihjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJc3RydWN0IGRtX2xpc3QgKnB2c2VnczsKKwlzdHJ1Y3QgbHZtX3B2c2VnX2xpc3QgKnB2bDsKKwlwdl90IHB2OworCisJaWYgKCEocHYgPSBfbG9va3VwX3B2X2J5X25hbWUoYXJndlsxXSkpKQorCQlyZXR1cm47CisJcHZzZWdzID0gbHZtX3B2X2xpc3RfcHZzZWdzKHB2KTsKKwlpZiAoIXB2c2VncyB8fCBkbV9saXN0X2VtcHR5KHB2c2VncykpIHsKKwkJcHJpbnRmKCJObyBQViBzZWdtZW50cyBpbiBwdiAlc1xuIiwgYXJndlsxXSk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKCJQViBzZWdtZW50cyBpbiBwdiAlczpcbiIsIGFyZ3ZbMV0pOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHB2c2VncykgeworCQlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHY7CisJCXYgPSBsdm1fcHZzZWdfZ2V0X3Byb3BlcnR5KHB2bC0+cHZzZWcsICJwdnNlZ19zdGFydCIpOworCQlfcHJpbnRfcHJvcGVydHlfdmFsdWUoInB2c2VnX3N0YXJ0Iiwgdik7CisJCXYgPSBsdm1fcHZzZWdfZ2V0X3Byb3BlcnR5KHB2bC0+cHZzZWcsICJwdnNlZ19zaXplIik7CisJCV9wcmludF9wcm9wZXJ0eV92YWx1ZSgicHZzZWdfc2l6ZSIsIHYpOworCX0KK30KKworc3RhdGljIHZvaWQgX3NjYW5fdmdzKGx2bV90IGxpYmgpCit7CisJbHZtX3NjYW4obGliaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9saXN0X3ZnX25hbWVzKGx2bV90IGxpYmgpCit7CisJc3RydWN0IGRtX2xpc3QgKmxpc3Q7CisJc3RydWN0IGx2bV9zdHJfbGlzdCAqc3RybDsKKworCWxpc3QgPSBsdm1fbGlzdF92Z19uYW1lcyhsaWJoKTsKKwlwcmludGYoIlZHIG5hbWVzOlxuIik7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHN0cmwsIGxpc3QpIHsKKwkJcHJpbnRmKCIlc1xuIiwgc3RybC0+c3RyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9saXN0X3ZnX2lkcyhsdm1fdCBsaWJoKQoreworCXN0cnVjdCBkbV9saXN0ICpsaXN0OworCXN0cnVjdCBsdm1fc3RyX2xpc3QgKnN0cmw7CisKKwlsaXN0ID0gbHZtX2xpc3RfdmdfdXVpZHMobGliaCk7CisJcHJpbnRmKCJWRyB1dWlkczpcbiIpOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzdHJsLCBsaXN0KSB7CisJCXByaW50ZigiJXNcbiIsIHN0cmwtPnN0cik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfZGlzcGxheV90YWdzKHN0cnVjdCBkbV9saXN0ICpsaXN0KQoreworCXN0cnVjdCBsdm1fc3RyX2xpc3QgKnN0cmw7CisJaWYgKGRtX2xpc3RfZW1wdHkobGlzdCkpIHsKKwkJcHJpbnRmKCJObyB0YWdzIGV4aXN0XG4iKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoIWxpc3QpIHsKKwkJcHJpbnRmKCJFcnJvciBvYnRhaW5pbmcgdGFnc1xuIik7CisJCXJldHVybjsKKwl9CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHN0cmwsIGxpc3QpIHsKKwkJcHJpbnRmKCIlc1xuIiwgc3RybC0+c3RyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF92Z19nZXRfdGFncyhjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKworCWlmICghKHZnID0gX2xvb2t1cF92Z19ieV9uYW1lKGFyZ3YsIGFyZ2MpKSkKKwkJcmV0dXJuOworCXByaW50ZigiVkcgdGFnczpcbiIpOworCV9kaXNwbGF5X3RhZ3MobHZtX3ZnX2dldF90YWdzKHZnKSk7Cit9CisKK3N0YXRpYyB2b2lkIF92Z190YWcoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgYWRkKQoreworCXZnX3Qgdmc7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCB0YWdcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghKHZnID0gX2xvb2t1cF92Z19ieV9uYW1lKGFyZ3YsIGFyZ2MpKSkKKwkJcmV0dXJuOworCWlmIChhZGQgJiYgbHZtX3ZnX2FkZF90YWcodmcsIGFyZ3ZbMl0pKQorCQlwcmludGYoIkVycm9yICIpOworCWVsc2UgaWYgKCFhZGQgJiYgbHZtX3ZnX3JlbW92ZV90YWcodmcsIGFyZ3ZbMl0pKXsKKwkJcHJpbnRmKCJFcnJvciAiKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlN1Y2Nlc3MgIik7CisJfQorCXByaW50ZigiJXMgdGFnICVzIHRvIFZHICVzXG4iLAorCSAgICAgICBhZGQgPyAiYWRkaW5nIjoicmVtb3ZpbmciLCBhcmd2WzJdLCBhcmd2WzFdKTsKK30KKworc3RhdGljIHZvaWQgX3B2X2dldF9wcm9wZXJ0eShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJcHZfdCBwdjsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHY7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgcHZuYW1lLCBmaWVsZF9pZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEocHYgPSBfbG9va3VwX3B2X2J5X25hbWUoYXJndlsxXSkpKQorCQlyZXR1cm47CisJdiA9IGx2bV9wdl9nZXRfcHJvcGVydHkocHYsIGFyZ3ZbMl0pOworCV9wcmludF9wcm9wZXJ0eV92YWx1ZShhcmd2WzJdLCB2KTsKK30KKworc3RhdGljIHZvaWQgX3ZnX2dldF9wcm9wZXJ0eShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHY7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCBmaWVsZF9pZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEodmcgPSBfbG9va3VwX3ZnX2J5X25hbWUoYXJndiwgYXJnYykpKQorCQlyZXR1cm47CisJdiA9ICBsdm1fdmdfZ2V0X3Byb3BlcnR5KHZnLCBhcmd2WzJdKTsKKwlfcHJpbnRfcHJvcGVydHlfdmFsdWUoYXJndlsyXSwgdik7Cit9CisKK3N0YXRpYyB2b2lkIF9sdl9nZXRfcHJvcGVydHkoY2hhciAqKmFyZ3YsIGludCBhcmdjKQoreworCWx2X3QgbHY7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworCisJaWYgKGFyZ2MgPCA0KSB7CisJCXByaW50ZigiUGxlYXNlIGVudGVyIHZnbmFtZSwgbHZuYW1lLCBmaWVsZF9pZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEobHYgPSBfbG9va3VwX2x2X2J5X25hbWUoYXJndlsyXSkpKQorCQlyZXR1cm47CisJdiA9IGx2bV9sdl9nZXRfcHJvcGVydHkobHYsIGFyZ3ZbM10pOworCV9wcmludF9wcm9wZXJ0eV92YWx1ZShhcmd2WzNdLCB2KTsKK30KKworc3RhdGljIHZvaWQgX3ZnX3NldF9wcm9wZXJ0eShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKwlzdHJ1Y3QgbHZtX3Byb3BlcnR5X3ZhbHVlIHZhbHVlOworCWludCByYzsKKworCWlmIChhcmdjIDwgNCkgeworCQlwcmludGYoIlBsZWFzZSBlbnRlciB2Z25hbWUsIGZpZWxkX2lkLCB2YWx1ZVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEodmcgPSBfbG9va3VwX3ZnX2J5X25hbWUoYXJndiwgYXJnYykpKQorCQlyZXR1cm47CisJdmFsdWUgPSBsdm1fdmdfZ2V0X3Byb3BlcnR5KHZnLCBhcmd2WzJdKTsKKwlpZiAoIXZhbHVlLmlzX3ZhbGlkKSB7CisJCXByaW50ZigiRXJyb3Igb2J0YWluaW5nIHByb3BlcnR5IHZhbHVlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmFsdWUuaXNfc3RyaW5nKQorCQl2YWx1ZS52YWx1ZS5zdHJpbmcgPSBhcmd2WzNdOworCWVsc2UKKwkJdmFsdWUudmFsdWUuaW50ZWdlciA9IGF0b2koYXJndlszXSk7CisJcmMgPSBsdm1fdmdfc2V0X3Byb3BlcnR5KHZnLCBhcmd2WzJdLCAmdmFsdWUpOworCWlmIChyYykKKwkJcHJpbnRmKCJFcnJvciAiKTsKKwllbHNlCisJCXByaW50ZigiU3VjY2VzcyAiKTsKKwlwcmludGYoInNldHRpbmcgdmFsdWUgb2YgcHJvcGVydHkgJXMgaW4gVkcgJXNcbiIsCisJICAgICAgIGFyZ3ZbMl0sIGFyZ3ZbMV0pOworfQorCitzdGF0aWMgdm9pZCBfbHZfZ2V0X3RhZ3MoY2hhciAqKmFyZ3YsIGludCBhcmdjKQoreworCWx2X3QgbHY7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCBsdm5hbWVcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghKGx2ID0gX2xvb2t1cF9sdl9ieV9uYW1lKGFyZ3ZbMl0pKSkKKwkJcmV0dXJuOworCXByaW50ZigiTFYgdGFnczpcbiIpOworCV9kaXNwbGF5X3RhZ3MobHZtX2x2X2dldF90YWdzKGx2KSk7Cit9CisKK3N0YXRpYyB2b2lkIF9sdl90YWcoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgYWRkKQoreworCWx2X3QgbHY7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCBsdm5hbWVcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghKGx2ID0gX2xvb2t1cF9sdl9ieV9uYW1lKGFyZ3ZbMl0pKSkKKwkJcmV0dXJuOworCWlmIChhZGQgJiYgbHZtX2x2X2FkZF90YWcobHYsIGFyZ3ZbM10pKQorCQlwcmludGYoIkVycm9yICIpOworCWVsc2UgaWYgKCFhZGQgJiYgbHZtX2x2X3JlbW92ZV90YWcobHYsIGFyZ3ZbM10pKXsKKwkJcHJpbnRmKCJFcnJvciAiKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlN1Y2Nlc3MgIik7CisJfQorCXByaW50ZigiJXMgdGFnICVzIHRvIExWICVzXG4iLAorCSAgICAgICBhZGQgPyAiYWRkaW5nIjoicmVtb3ZpbmciLCBhcmd2WzNdLCBhcmd2WzJdKTsKK30KKworc3RhdGljIHZvaWQgX2x2X2Zyb21fdXVpZChjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJdmdfdCB2ZzsKKworCWlmIChhcmdjIDwgMykgeworCQlwcmludGYoIlBsZWFzZSBlbnRlciB2Z25hbWUsIGx2X3V1aWRcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghKHZnID0gX2xvb2t1cF92Z19ieV9uYW1lKGFyZ3YsIGFyZ2MpKSkKKwkJcmV0dXJuOworCV9wcmludF9sdih2ZywgbHZtX2x2X2Zyb21fdXVpZCh2ZywgYXJndlsyXSkpOworfQorCitzdGF0aWMgdm9pZCBfbHZfZnJvbV9uYW1lKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwl2Z190IHZnOworCisJaWYgKGFyZ2MgPCAzKSB7CisJCXByaW50ZigiUGxlYXNlIGVudGVyIHZnbmFtZSwgbHZfdXVpZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEodmcgPSBfbG9va3VwX3ZnX2J5X25hbWUoYXJndiwgYXJnYykpKQorCQlyZXR1cm47CisJX3ByaW50X2x2KHZnLCBsdm1fbHZfZnJvbV9uYW1lKHZnLCBhcmd2WzJdKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9wdl9mcm9tX3V1aWQoY2hhciAqKmFyZ3YsIGludCBhcmdjKQoreworCXZnX3Qgdmc7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCBwdl91dWlkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh2ZyA9IF9sb29rdXBfdmdfYnlfbmFtZShhcmd2LCBhcmdjKSkpCisJCXJldHVybjsKKwlfcHJpbnRfcHYobHZtX3B2X2Zyb21fdXVpZCh2ZywgYXJndlsyXSkpOworfQorCitzdGF0aWMgdm9pZCBfcHZfZnJvbV9uYW1lKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwl2Z190IHZnOworCisJaWYgKGFyZ2MgPCAzKSB7CisJCXByaW50ZigiUGxlYXNlIGVudGVyIHZnbmFtZSwgcHZfdXVpZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEodmcgPSBfbG9va3VwX3ZnX2J5X25hbWUoYXJndiwgYXJnYykpKQorCQlyZXR1cm47CisJX3ByaW50X3B2KGx2bV9wdl9mcm9tX25hbWUodmcsIGFyZ3ZbMl0pKTsKK30KKworc3RhdGljIHZvaWQgX3ZnbmFtZV9mcm9tX3B2aWQoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBsdm1fdCBsaWJoKQoreworCWNvbnN0IGNoYXIgKnZnbmFtZTsKKworCWlmIChhcmdjIDwgMSkgeworCQlwcmludGYoIlBsZWFzZSBlbnRlciBwdmlkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh2Z25hbWUgPSBsdm1fdmduYW1lX2Zyb21fcHZpZChsaWJoLCBhcmd2WzFdKSkpIHsKKwkJcHJpbnRmKCJFcnJvciAiKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlN1Y2Nlc3MgIik7CisJfQorCXByaW50ZigibG9va2luZyB1cCB2Z25hbWU9JXMgZnJvbSBQVklEPSVzXG4iLAorCSAgICAgICB2Z25hbWUsIGFyZ3ZbMV0pOworfQorc3RhdGljIHZvaWQgX3ZnbmFtZV9mcm9tX2Rldm5hbWUoY2hhciAqKmFyZ3YsIGludCBhcmdjLCBsdm1fdCBsaWJoKQoreworCWNvbnN0IGNoYXIgKnZnbmFtZTsKKworCWlmIChhcmdjIDwgMSkgeworCQlwcmludGYoIlBsZWFzZSBlbnRlciBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCWlmICghKHZnbmFtZSA9IGx2bV92Z25hbWVfZnJvbV9kZXZpY2UobGliaCwgYXJndlsxXSkpKSB7CisJCXByaW50ZigiRXJyb3IgIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJTdWNjZXNzICIpOworCX0KKwlwcmludGYoImxvb2tpbmcgdXAgdmduYW1lPSVzIGZyb20gZGV2aWNlIG5hbWU9JXNcbiIsCisJICAgICAgIHZnbmFtZSwgYXJndlsxXSk7Cit9CitzdGF0aWMgdm9pZCBfbHZzX2luX3ZnKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZzOworCXN0cnVjdCBsdm1fbHZfbGlzdCAqbHZsOworCXZnX3Qgdmc7CisKKwlpZiAoISh2ZyA9IF9sb29rdXBfdmdfYnlfbmFtZShhcmd2LCBhcmdjKSkpCisJCXJldHVybjsKKwlsdnMgPSBsdm1fdmdfbGlzdF9sdnModmcpOworCWlmICghbHZzIHx8IGRtX2xpc3RfZW1wdHkobHZzKSkgeworCQlwcmludGYoIk5vIExWcyBpbiBWRyAlc1xuIiwgbHZtX3ZnX2dldF9uYW1lKHZnKSk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKCJMVnMgaW4gVkcgJXM6XG4iLCBsdm1fdmdfZ2V0X25hbWUodmcpKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsdnMpIHsKKwkJX3ByaW50X2x2KHZnLCBsdmwtPmx2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9sdnNlZ3NfaW5fbHYoY2hhciAqKmFyZ3YsIGludCBhcmdjKQoreworCXN0cnVjdCBkbV9saXN0ICpsdnNlZ3M7CisJc3RydWN0IGx2bV9sdnNlZ19saXN0ICpsdmw7CisJbHZfdCBsdjsKKworCWlmICghKGx2ID0gX2xvb2t1cF9sdl9ieV9uYW1lKGFyZ3ZbMl0pKSkKKwkJcmV0dXJuOworCWx2c2VncyA9IGx2bV9sdl9saXN0X2x2c2Vncyhsdik7CisJaWYgKCFsdnNlZ3MgfHwgZG1fbGlzdF9lbXB0eShsdnNlZ3MpKSB7CisJCXByaW50ZigiTm8gTFYgc2VnbWVudHMgaW4gbHYgJXNcbiIsIGx2bV9sdl9nZXRfbmFtZShsdikpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiTFYgc2VnbWVudHMgaW4gbHYgJXM6XG4iLCBsdm1fbHZfZ2V0X25hbWUobHYpKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsdnNlZ3MpIHsKKwkJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworCQl2ID0gbHZtX2x2c2VnX2dldF9wcm9wZXJ0eShsdmwtPmx2c2VnLCAic2VndHlwZSIpOworCQlfcHJpbnRfcHJvcGVydHlfdmFsdWUoInNlZ3R5cGUiLCB2KTsKKwkJdiA9IGx2bV9sdnNlZ19nZXRfcHJvcGVydHkobHZsLT5sdnNlZywgInNlZ19zdGFydF9wZSIpOworCQlfcHJpbnRfcHJvcGVydHlfdmFsdWUoInNlZ19zdGFydF9wZSIsIHYpOworCQl2ID0gbHZtX2x2c2VnX2dldF9wcm9wZXJ0eShsdmwtPmx2c2VnLCAic2VnX3NpemUiKTsKKwkJX3ByaW50X3Byb3BlcnR5X3ZhbHVlKCJzZWdfc2l6ZSIsIHYpOworCQl2ID0gbHZtX2x2c2VnX2dldF9wcm9wZXJ0eShsdmwtPmx2c2VnLCAiZGV2aWNlcyIpOworCQlfcHJpbnRfcHJvcGVydHlfdmFsdWUoImRldmljZXMiLCB2KTsKKwkJdiA9IGx2bV9sdnNlZ19nZXRfcHJvcGVydHkobHZsLT5sdnNlZywgInNlZ19wZV9yYW5nZXMiKTsKKwkJX3ByaW50X3Byb3BlcnR5X3ZhbHVlKCJzZWdfcGVfcmFuZ2VzIiwgdik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfbHZfZGVhY3RpdmF0ZShjaGFyICoqYXJndiwgaW50IGFyZ2MpCit7CisJbHZfdCBsdjsKKwlpbnQgcmM9MDsKKworCWlmIChhcmdjIDwgMykgeworCQlwcmludGYoIlBsZWFzZSBlbnRlciB2Z25hbWUsIGx2bmFtZVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCEobHYgPSBfbG9va3VwX2x2X2J5X25hbWUoYXJndlsyXSkpKQorCQlyZXR1cm47CisJcmMgPSBsdm1fbHZfZGVhY3RpdmF0ZShsdik7CisJX2x2bV9zdGF0dXNfdG9fcGFzc19mYWlsKHJjKTsKKwlwcmludGYoIkRlLWFjdGl2YXRpbmcgTFYgJXMgaW4gVkcgJXNcbiIsCisJCWFyZ3ZbMl0sIGFyZ3ZbMV0pOworfQorc3RhdGljIHZvaWQgX2x2X2FjdGl2YXRlKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwlsdl90IGx2OworCWludCByYz0wOworCisJaWYgKGFyZ2MgPCAzKSB7CisJCXByaW50ZigiUGxlYXNlIGVudGVyIHZnbmFtZSwgbHZuYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShsdiA9IF9sb29rdXBfbHZfYnlfbmFtZShhcmd2WzJdKSkpCisJCXJldHVybjsKKwlyYyA9IGx2bV9sdl9hY3RpdmF0ZShsdik7CisJX2x2bV9zdGF0dXNfdG9fcGFzc19mYWlsKHJjKTsKKwlwcmludGYoImFjdGl2YXRpbmcgTFYgJXMgaW4gVkcgJXNcbiIsCisJCWFyZ3ZbMl0sIGFyZ3ZbMV0pOworfQorCitzdGF0aWMgdm9pZCBfdmdfcmVtb3ZlX2x2KGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwlsdl90IGx2OworCisJaWYgKGFyZ2MgPCAzKSB7CisJCXByaW50ZigiUGxlYXNlIGVudGVyIHZnbmFtZSwgbHZuYW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShsdiA9IF9sb29rdXBfbHZfYnlfbmFtZShhcmd2WzJdKSkpCisJCXJldHVybjsKKwlpZiAobHZtX3ZnX3JlbW92ZV9sdihsdikpCisJCXByaW50ZigiRXJyb3IgIik7CisJZWxzZSB7CisJCXByaW50ZigiU3VjY2VzcyAiKTsKKwkJZG1faGFzaF9yZW1vdmUoX2x2bmFtZV9oYXNoLCBhcmd2WzJdKTsKKwl9CisJcHJpbnRmKCJyZW1vdmluZyBMViAlcyBpbiBWRyAlc1xuIiwKKwkJYXJndlsyXSwgYXJndlsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIF92Z19jcmVhdGVfbHZfbGluZWFyKGNoYXIgKiphcmd2LCBpbnQgYXJnYykKK3sKKwl2Z190IHZnOworCWx2X3QgbHY7CisKKwlpZiAoYXJnYyA8IDQpIHsKKwkJcHJpbnRmKCJQbGVhc2UgZW50ZXIgdmduYW1lLCBsdm5hbWUsIGFuZCBzaXplXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh2ZyA9IF9sb29rdXBfdmdfYnlfbmFtZShhcmd2LCBhcmdjKSkpCisJCXJldHVybjsKKwlsdiA9IGx2bV92Z19jcmVhdGVfbHZfbGluZWFyKHZnLCBhcmd2WzJdLCBhdG9sKGFyZ3ZbM10pKTsKKwlpZiAoIWx2KQorCQlwcmludGYoIkVycm9yICIpOworCWVsc2UgeworCQlwcmludGYoIlN1Y2Nlc3MgIik7CisJCWRtX2hhc2hfaW5zZXJ0KF9sdm5hbWVfaGFzaCwgYXJndlsyXSwgbHYpOworCX0KKwlwcmludGYoImNyZWF0aW5nIExWICVzIGluIFZHICVzXG4iLAorCQlhcmd2WzJdLCBhcmd2WzFdKTsKK30KKworc3RhdGljIGludCBsdm1hcGlfdGVzdF9zaGVsbChsdm1fdCBsaWJoKQoreworCWludCBhcmdjOworCWNoYXIgKmlucHV0ID0gTlVMTCwgKmFyZ3NbTUFYX0FSR1NdLCAqKmFyZ3Y7CisKKwlfaGFzaF9jcmVhdGUoKTsKKwlhcmdjPTA7CisJd2hpbGUgKDEpIHsKKwkJZnJlZShpbnB1dCk7CisJCWlucHV0ID0gcmVhZGxpbmUoImxpYmx2bT4gIik7CisKKwkJLyogRU9GICovCisJCWlmICghaW5wdXQpIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZW1wdHkgbGluZSAqLworCQlpZiAoISppbnB1dCkKKwkJCWNvbnRpbnVlOworCisJCWFyZ3YgPSBhcmdzOworCisJCWlmIChsdm1fc3BsaXQoaW5wdXQsICZhcmdjLCBhcmd2LCBNQVhfQVJHUykgPT0gTUFYX0FSR1MpIHsKKwkJCXByaW50ZigiVG9vIG1hbnkgYXJndW1lbnRzLCBzb3JyeS4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJndlswXSwgImx2bSIpKSB7CisJCQlhcmd2Kys7CisJCQlhcmdjLS07CisJCX0KKworCQlpZiAoIWFyZ2MpCisJCQljb250aW51ZTsKKworCQlpZiAoIXN0cmNtcChhcmd2WzBdLCAicXVpdCIpIHx8ICFzdHJjbXAoYXJndlswXSwgImV4aXQiKSkgeworCQkJcHJpbnRmKCJFeGl0aW5nLlxuIik7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICI/IikgfHwgIXN0cmNtcChhcmd2WzBdLCAiaGVscCIpKSB7CisJCQlfc2hvd19oZWxwKCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAiY29uZmlnX3JlbG9hZCIpKSB7CisJCQlfY29uZmlnX3JlbG9hZChhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJjb25maWdfb3ZlcnJpZGUiKSkgeworCQkJX2NvbmZpZ19vdmVycmlkZShhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19leHRlbmQiKSkgeworCQkJX3ZnX2V4dGVuZChhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19yZWR1Y2UiKSkgeworCQkJX3ZnX3JlZHVjZShhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z193cml0ZSIpKSB7CisJCQlfdmdfd3JpdGUoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfb3BlbiIpKSB7CisJCQlfdmdfb3Blbihhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19jbG9zZSIpKSB7CisJCQlfdmdfY2xvc2UoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfY3JlYXRlIikpIHsKKwkJCV92Z19jcmVhdGUoYXJndiwgYXJnYywgbGliaCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfcmVtb3ZlIikpIHsKKwkJCV92Z19yZW1vdmUoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAibHZfYWN0aXZhdGUiKSkgeworCQkJX2x2X2FjdGl2YXRlKGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImx2X2RlYWN0aXZhdGUiKSkgeworCQkJX2x2X2RlYWN0aXZhdGUoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfcmVtb3ZlX2x2IikpIHsKKwkJCV92Z19yZW1vdmVfbHYoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdzX29wZW4iKSkgeworCQkJX2xpc3Rfb3Blbl92Z3MoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19saXN0X3B2cyIpKSB7CisJCQlfcHZzX2luX3ZnKGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInB2X2xpc3RfcHZzZWdzIikpIHsKKwkJCV9wdnNlZ3NfaW5fcHYoYXJndiwgYXJnYyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfbGlzdF9sdnMiKSkgeworCQkJX2x2c19pbl92Zyhhcmd2LCBhcmdjKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJsdl9saXN0X2x2c2VncyIpKSB7CisJCQlfbHZzZWdzX2luX2x2KGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImxpc3RfdmdfbmFtZXMiKSkgeworCQkJX2xpc3RfdmdfbmFtZXMobGliaCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAibGlzdF92Z19pZHMiKSkgeworCQkJX2xpc3RfdmdfaWRzKGxpYmgpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInNjYW5fdmdzIikpIHsKKwkJCV9zY2FuX3ZncyhsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19jcmVhdGVfbHZfbGluZWFyIikpIHsKKwkJCV92Z19jcmVhdGVfbHZfbGluZWFyKGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInZnX2FkZF90YWciKSkgeworCQkJX3ZnX3RhZyhhcmd2LCBhcmdjLCAxKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ2Z19yZW1vdmVfdGFnIikpIHsKKwkJCV92Z190YWcoYXJndiwgYXJnYywgMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmdfZ2V0X3RhZ3MiKSkgeworCQkJX3ZnX2dldF90YWdzKGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImx2X2dldF9wcm9wZXJ0eSIpKSB7CisJCQlfbHZfZ2V0X3Byb3BlcnR5KGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInZnX2dldF9wcm9wZXJ0eSIpKSB7CisJCQlfdmdfZ2V0X3Byb3BlcnR5KGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInB2X2dldF9wcm9wZXJ0eSIpKSB7CisJCQlfcHZfZ2V0X3Byb3BlcnR5KGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInZnX3NldF9wcm9wZXJ0eSIpKSB7CisJCQlfdmdfc2V0X3Byb3BlcnR5KGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImx2X2FkZF90YWciKSkgeworCQkJX2x2X3RhZyhhcmd2LCBhcmdjLCAxKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJsdl9yZW1vdmVfdGFnIikpIHsKKwkJCV9sdl90YWcoYXJndiwgYXJnYywgMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAibHZfZ2V0X3RhZ3MiKSkgeworCQkJX2x2X2dldF90YWdzKGFyZ3YsIGFyZ2MpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInZnbmFtZV9mcm9tX2Rldm5hbWUiKSkgeworCQkJX3ZnbmFtZV9mcm9tX2Rldm5hbWUoYXJndiwgYXJnYywgbGliaCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidmduYW1lX2Zyb21fcHZpZCIpKSB7CisJCQlfdmduYW1lX2Zyb21fcHZpZChhcmd2LCBhcmdjLCBsaWJoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJsdl9mcm9tX3V1aWQiKSkgeworCQkJX2x2X2Zyb21fdXVpZChhcmd2LCBhcmdjKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJsdl9mcm9tX25hbWUiKSkgeworCQkJX2x2X2Zyb21fbmFtZShhcmd2LCBhcmdjKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJwdl9mcm9tX3V1aWQiKSkgeworCQkJX3B2X2Zyb21fdXVpZChhcmd2LCBhcmdjKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJwdl9mcm9tX25hbWUiKSkgeworCQkJX3B2X2Zyb21fbmFtZShhcmd2LCBhcmdjKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIlVucmVjb2duaXplZCBjb21tYW5kICVzXG4iLCBhcmd2WzBdKTsKKwkJfQorCX0KKworCWRtX2hhc2hfaXRlcihfdmduYW1lX2hhc2gsIChkbV9oYXNoX2l0ZXJhdGVfZm4pIGx2bV92Z19jbG9zZSk7CisJX2hhc2hfZGVzdHJveSgpOworCWZyZWUoaW5wdXQpOworCXJldHVybiAwOworfQorI2Vsc2UgLyogIVJFQURMSU5FX1NVUFBPUlQgKi8KK3N0YXRpYyBpbnQgbHZtYXBpX3Rlc3Rfc2hlbGwobHZtX3QgbGliaCkKK3sKKwlwcmludGYoIkJ1aWxkIHdpdGhvdXQgcmVhZGxpbmUgbGlicmFyeSwgbm8gaW50ZXJhY3RpdmUgdGVzdGluZy5cbiIpOworCXJldHVybiAxOworfQorI2VuZGlmCisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWx2bV90IGxpYmg7CisKKwlsaWJoID0gbHZtX2luaXQoTlVMTCk7CisJaWYgKCFsaWJoKSB7CisJCXByaW50ZigiVW5hYmxlIHRvIG9wZW4gbHZtIGxpYnJhcnkgaW5zdGFuY2VcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGYoIkxpYnJhcnkgdmVyc2lvbjogJXNcbiIsIGx2bV9saWJyYXJ5X2dldF92ZXJzaW9uKCkpOworCWx2bWFwaV90ZXN0X3NoZWxsKGxpYmgpOworCisJbHZtX3F1aXQobGliaCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvYXBpL3RoaW5fcGVyY2VudC5jIGIvdGVzdC9hcGkvdGhpbl9wZXJjZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNDhjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL3RoaW5fcGVyY2VudC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI3VuZGVmIE5ERUJVRworCisjaW5jbHVkZSAibHZtMmFwcC5oIgorI2luY2x1ZGUgImFzc2VydC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWx2bV90IGhhbmRsZTsKKwl2Z190IHZnOworCWx2X3QgbHY7CisJc3RydWN0IGx2bV9wcm9wZXJ0eV92YWx1ZSB2OworCXN0cnVjdCBkbV9saXN0ICpsdnNlZ3M7CisJc3RydWN0IGx2bV9sdnNlZ19saXN0ICpsdmw7CisKKwloYW5kbGUgPSBsdm1faW5pdChOVUxMKTsKKwlhc3NlcnQoaGFuZGxlKTsKKworCXZnID0gbHZtX3ZnX29wZW4oaGFuZGxlLCBhcmd2WzFdLCAiciIsIDApOworCWFzc2VydCh2Zyk7CisKKwlsdiA9IGx2bV9sdl9mcm9tX25hbWUodmcsICJwb29sIik7CisJYXNzZXJ0KGx2KTsKKworCWx2c2VncyA9IGx2bV9sdl9saXN0X2x2c2Vncyhsdik7CisJYXNzZXJ0KGx2c2VncyAmJiAoZG1fbGlzdF9zaXplKGx2c2VncykgPT0gMSkpOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGx2c2VncykgeworCQl2ID0gbHZtX2x2c2VnX2dldF9wcm9wZXJ0eShsdmwtPmx2c2VnLCAiZGlzY2FyZHMiKTsKKwkJYXNzZXJ0KHYuaXNfdmFsaWQgJiYgdi5pc19zdHJpbmcpOworCQlhc3NlcnQoc3RyY21wKHYudmFsdWUuc3RyaW5nLCAicGFzc2Rvd24iKSA9PSAwKTsKKwl9CisKKwl2ID0gbHZtX2x2X2dldF9wcm9wZXJ0eShsdiwgImRhdGFfcGVyY2VudCIpOworCWFzc2VydCh2LmlzX3ZhbGlkKTsKKwlhc3NlcnQodi52YWx1ZS5pbnRlZ2VyID09IDI1ICogUEVSQ0VOVF8xKTsKKworCisJbHYgPSBsdm1fbHZfZnJvbV9uYW1lKHZnLCAidGhpbiIpOworCWFzc2VydChsdik7CisKKwl2ID0gbHZtX2x2X2dldF9wcm9wZXJ0eShsdiwgImRhdGFfcGVyY2VudCIpOworCWFzc2VydCh2LmlzX3ZhbGlkKTsKKwlhc3NlcnQodi52YWx1ZS5pbnRlZ2VyID09IDUwICogUEVSQ0VOVF8xKTsKKworCisJbHYgPSBsdm1fbHZfZnJvbV9uYW1lKHZnLCAic25hcCIpOworCWFzc2VydChsdik7CisKKwl2ID0gbHZtX2x2X2dldF9wcm9wZXJ0eShsdiwgImRhdGFfcGVyY2VudCIpOworCWFzc2VydCh2LmlzX3ZhbGlkKTsKKwlhc3NlcnQodi52YWx1ZS5pbnRlZ2VyID09IDc1ICogUEVSQ0VOVF8xKTsKKworCXYgPSBsdm1fbHZfZ2V0X3Byb3BlcnR5KGx2LCAic25hcF9wZXJjZW50Iik7CisJYXNzZXJ0KHYuaXNfdmFsaWQpOworCWFzc2VydCh2LnZhbHVlLmludGVnZXIgPT0gKHVpbnQ2NF90KSBETV9QRVJDRU5UX0lOVkFMSUQpOworCisJdiA9IGx2bV9sdl9nZXRfcHJvcGVydHkobHYsICJvcmlnaW4iKTsKKwlhc3NlcnQodi5pc192YWxpZCk7CisJYXNzZXJ0KHN0cmNtcCh2LnZhbHVlLnN0cmluZywgInRoaW4iKSA9PSAwKTsKKworCWx2bV92Z19jbG9zZSh2Zyk7CisJbHZtX3F1aXQoaGFuZGxlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcGkvdGhpbl9wZXJjZW50LnNoIGIvdGVzdC9hcGkvdGhpbl9wZXJjZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDk3MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwaS90aGluX3BlcmNlbnQuc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX2RldnMgMgorCit2Z2NyZWF0ZSAtcyA2NGsgJHZnICQoY2F0IERFVklDRVMpCisKK2x2Y3JlYXRlIC1MNU0gLVQgJHZnL3Bvb2wKKworbHZjcmVhdGUgLVYxTSAtVCAkdmcvcG9vbCAtbiB0aGluCitkZCBpZj0vZGV2L3VyYW5kb20gb2Y9IiRETV9ERVZfRElSLyR2Zy90aGluIiBjb3VudD0yIGJzPTI1NksKKworbHZjcmVhdGUgLXMgJHZnL3RoaW4gLUsgLW4gc25hcAorZGQgaWY9L2Rldi91cmFuZG9tIG9mPSIkRE1fREVWX0RJUi8kdmcvc25hcCIgY291bnQ9MyBicz0yNTZLCisKK2x2cyAtbytkaXNjYXJkcyAkdmcKKworYXV4IGFwaXRlc3QgdGhpbl9wZXJjZW50ICR2ZworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L2FwaS92Z2xpc3QuYyBiL3Rlc3QvYXBpL3ZnbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2Q1OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwaS92Z2xpc3QuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJsdm0yYXBwLmgiCisKK2x2bV90IGhhbmRsZTsKK3ZnX3Qgdmc7CisKK3N0YXRpYyB2b2lkIHN0YXJ0KHZvaWQpIHsKKwloYW5kbGUgPSBsdm1faW5pdChOVUxMKTsKKwlpZiAoIWhhbmRsZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsdm1faW5pdFxuIik7CisJCWFib3J0KCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb25lKGludCBvaykgeworCWlmIChoYW5kbGUgJiYgbHZtX2Vycm5vKGhhbmRsZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJMVk0gRXJyb3I6ICVzXG4iLCBsdm1fZXJybXNnKGhhbmRsZSkpOworCQlvayA9IDA7CisJfQorCWlmIChoYW5kbGUpCisJCWx2bV9xdWl0KGhhbmRsZSk7CisJaWYgKCFvaykKKwkJYWJvcnQoKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlsdm1fc3RyX2xpc3RfdCAqc3RyOworCWludCBpID0gMDsKKwlzdHJ1Y3QgZG1fbGlzdCAqdmduYW1lczsKKwlzdHJ1Y3QgZG1fbGlzdCAqdmdpZHM7CisKKwlpZiAoYXJnYyAhPSAzKQorCQlhYm9ydCgpOworCisJc3RhcnQoKTsKKwl2Z25hbWVzID0gbHZtX2xpc3RfdmdfbmFtZXMoaGFuZGxlKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3RyLCB2Z25hbWVzKSB7CisJCWFzc2VydCgrK2kgPD0gMSk7CisJCWFzc2VydCghc3RyY21wKHN0ci0+c3RyLCBhcmd2WzFdKSk7CisJfQorCWFzc2VydChpID09IDEpOworCWRvbmUoMSk7CisKKwlpID0gMDsKKwlzdGFydCgpOworCXZnaWRzID0gbHZtX2xpc3RfdmdfdXVpZHMoaGFuZGxlKTsKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc3RyLCB2Z2lkcykgeworCQlhc3NlcnQoKytpIDw9IDEpOworCQlhc3NlcnQoIXN0cmNtcChzdHItPnN0ciwgYXJndlsyXSkpOworCX0KKwlhc3NlcnQoaSA9PSAxKTsKKwlkb25lKDEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcGkvdmdsaXN0LnNoIGIvdGVzdC9hcGkvdmdsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmE5MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwaS92Z2xpc3Quc2gKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDIKK2F1eCBhcGl0ZXN0IHZnbGlzdCAkdmcgYGdldCB2Z19maWVsZCAkdmcgdmdfdXVpZCB8IHNlZCAtZSBzLC0sLGdgCmRpZmYgLS1naXQgYS90ZXN0L2FwaS92Z3Rlc3QuYyBiL3Rlc3QvYXBpL3ZndGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDRkZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwaS92Z3Rlc3QuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworLyoKKyAqIFVuaXQgdGVzdCBjYXNlIGZvciB2Z2NyZWF0ZSBhbmQgcmVsYXRlZCBBUElzLgorICogIyBnY2MgLWcgdmdjcmVhdGUuYyAtSS4uLy4uL2xpYmx2bSAtSS4uLy4uL2luY2x1ZGUgLUwuLi8uLi9saWJsdm0gXAorICogICAtTC4uLy4uL2xpYmRtIC1sZGV2bWFwcGVyIC1sbHZtMmFwcAorICogIyBleHBvcnQgTERfTElCUkFSWV9QQVRIPWBwd2RgLy4uLy4uL2xpYmRtOmBwd2RgLy4uLy4uL2xpYmx2bQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibHZtMmFwcC5oIgorCitsdm1fdCBoYW5kbGU7Cit2Z190IHZnOworY29uc3QgY2hhciAqdmdfbmFtZTsKKyNkZWZpbmUgTUFYX0RFVklDRVMgMTYKK2NvbnN0IGNoYXIgKmRldmljZVtNQVhfREVWSUNFU107Cit1aW50NjRfdCBzaXplID0gMTAyNDsKKworI2RlZmluZSB2Z19jcmVhdGUodmdfbmFtZSkgXAorCXByaW50ZigiQ3JlYXRpbmcgVkcgJXNcbiIsIHZnX25hbWUpOyBcCisJdmcgPSBsdm1fdmdfY3JlYXRlKGhhbmRsZSwgdmdfbmFtZSk7IFwKKwlpZiAoIXZnKSB7IFwKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyB2b2x1bWUgZ3JvdXAgJXNcbiIsIHZnX25hbWUpOyBcCisJCWdvdG8gYmFkOyBcCisJfQorI2RlZmluZSB2Z19leHRlbmQodmcsIGRldikgXAorCXByaW50ZigiRXh0ZW5kaW5nIFZHICVzIGJ5ICVzXG4iLCB2Z19uYW1lLCBkZXYpOyBcCisJc3RhdHVzID0gbHZtX3ZnX2V4dGVuZCh2ZywgZGV2KTsgXAorCWlmIChzdGF0dXMpIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGV4dGVuZGluZyB2b2x1bWUgZ3JvdXAgJXMgIiBcCisJCQkid2l0aCBkZXZpY2UgJXNcbiIsIHZnX25hbWUsIGRldik7IFwKKwkJZ290byBiYWQ7IFwKKwl9CisjZGVmaW5lIHZnX2NvbW1pdCh2ZykgXAorCXByaW50ZigiQ29tbWl0dGluZyBWRyAlcyB0byBkaXNrXG4iLCB2Z19uYW1lKTsgXAorCXN0YXR1cyA9IGx2bV92Z193cml0ZSh2Zyk7IFwKKwlpZiAoc3RhdHVzKSB7IFwKKwkJZnByaW50ZihzdGRlcnIsICJDb21taXQgb2Ygdm9sdW1lIGdyb3VwICclcycgZmFpbGVkXG4iLCBcCisJCQlsdm1fdmdfZ2V0X25hbWUodmcpKTsgXAorCQlnb3RvIGJhZDsgXAorCX0KKyNkZWZpbmUgdmdfb3Blbih2Z19uYW1lLCBtb2RlKSBcCisJcHJpbnRmKCJPcGVuaW5nIFZHICVzICVzXG4iLCB2Z19uYW1lLCBtb2RlKTsgXAorCXZnID0gbHZtX3ZnX29wZW4oaGFuZGxlLCB2Z19uYW1lLCBtb2RlLCAwKTsgXAorCWlmICghdmcpIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgdm9sdW1lIGdyb3VwICVzXG4iLCB2Z19uYW1lKTsgXAorCQlnb3RvIGJhZDsgXAorCX0KKyNkZWZpbmUgdmdfY2xvc2UodmcpIFwKKwlwcmludGYoIkNsb3NpbmcgVkcgJXNcbiIsIHZnX25hbWUpOyBcCisJaWYgKGx2bV92Z19jbG9zZSh2ZykpIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNsb3Npbmcgdm9sdW1lIGdyb3VwICVzXG4iLCB2Z19uYW1lKTsgXAorCQlnb3RvIGJhZDsgXAorCX0KKyNkZWZpbmUgdmdfcmVkdWNlKHZnLCBkZXYpIFwKKwlwcmludGYoIlJlZHVjaW5nIFZHICVzIGJ5ICVzXG4iLCB2Z19uYW1lLCBkZXYpOyBcCisJc3RhdHVzID0gbHZtX3ZnX3JlZHVjZSh2ZywgZGV2KTsgXAorCWlmIChzdGF0dXMpIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlZHVjaW5nIHZvbHVtZSBncm91cCAlcyAiIFwKKwkJCSJieSBkZXZpY2UgJXNcbiIsIHZnX25hbWUsIGRldik7IFwKKwkJZ290byBiYWQ7IFwKKwl9CisjZGVmaW5lIHZnX3JlbW92ZSh2ZykgXAorCXByaW50ZigiUmVtb3ZpbmcgVkcgJXMgZnJvbSBzeXN0ZW1cbiIsIHZnX25hbWUpOyBcCisJc3RhdHVzID0gbHZtX3ZnX3JlbW92ZSh2Zyk7IFwKKwlpZiAoc3RhdHVzKSB7IFwKKwkJZnByaW50ZihzdGRlcnIsICJSZXZtb3ZhbCBvZiB2b2x1bWUgZ3JvdXAgJyVzJyBmYWlsZWRcbiIsIFwKKwkJCXZnX25hbWUpOyBcCisJCWdvdG8gYmFkOyBcCisJfQorCitzdGF0aWMgaW50IGluaXRfdmd0ZXN0KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlpZiAoYXJnYyA8IDQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPHZnbmFtZT4gPHB2MT4gPHB2Mj4gWy4uLiA8cHZOPiBdIiwKKwkJCWFyZ3ZbMF0pOworCQlyZXR1cm4gLTE7CisJfQorCXZnX25hbWUgPSBhcmd2WzFdOworCWZvcihpPTI7IGk8TUFYX0RFVklDRVMgJiYgaSA8IGFyZ2M7IGkrKykgeworCQlkZXZpY2VbaS0yXSA9IGFyZ3ZbaV07CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoaW5pdF92Z3Rlc3QoYXJnYywgYXJndikgPCAwKQorCQlnb3RvIGJhZDsKKworCS8qIEZJWE1FOiBtYWtlIHRoZSBiZWxvdyBtZXNzYWdlcyB2ZXJib3NlLW9ubHkgYW5kIHByaW50IFBBU1MvRkFJTCovCisJcHJpbnRmKCJPcGVuaW5nIExWTVxuIik7CisJaGFuZGxlID0gbHZtX2luaXQoTlVMTCk7CisJaWYgKCFoYW5kbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbHZtX2luaXRcbiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlwcmludGYoIkxpYnJhcnkgdmVyc2lvbjogJXNcbiIsIGx2bV9saWJyYXJ5X2dldF92ZXJzaW9uKCkpOworCXZnX2NyZWF0ZSh2Z19uYW1lKTsKKwl2Z19leHRlbmQodmcsIGRldmljZVswXSk7CisKKwlwcmludGYoIlNldHRpbmcgVkcgJXMgZXh0ZW50X3NpemUgdG8gJSJQUkl1NjQiXG4iLCB2Z19uYW1lLCBzaXplKTsKKwlzdGF0dXMgPSBsdm1fdmdfc2V0X2V4dGVudF9zaXplKHZnLCBzaXplKTsKKwlpZiAoc3RhdHVzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCBzZXQgcGh5c2ljYWwgZXh0ZW50ICIKKwkJCSJzaXplICclIlBSSXU2NCInIGZvciAnJXMnXG4iLAorCQkJc2l6ZSwgdmdfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCXZnX2NvbW1pdCh2Zyk7CisJdmdfY2xvc2UodmcpOworCisJdmdfb3Blbih2Z19uYW1lLCAiciIpOworCXZnX2Nsb3NlKHZnKTsKKworCXZnX29wZW4odmdfbmFtZSwgInciKTsKKwl2Z19leHRlbmQodmcsIGRldmljZVsxXSk7CisJdmdfcmVkdWNlKHZnLCBkZXZpY2VbMF0pOworCXZnX2NvbW1pdCh2Zyk7CisJdmdfY2xvc2UodmcpOworCisJdmdfb3Blbih2Z19uYW1lLCAidyIpOworCXZnX2V4dGVuZCh2ZywgZGV2aWNlWzBdKTsKKwl2Z19jb21taXQodmcpOworCXZnX2Nsb3NlKHZnKTsKKworCXZnX29wZW4odmdfbmFtZSwgInciKTsKKwl2Z19yZW1vdmUodmcpOworCXZnX2NvbW1pdCh2Zyk7CisJdmdfY2xvc2UodmcpOworCisJbHZtX3F1aXQoaGFuZGxlKTsKKwlwcmludGYoImxpYmx2bSB2Z2NyZWF0ZSB1bml0IHRlc3QgUEFTU1xuIik7CisJX2V4aXQoMCk7CitiYWQ6CisJcHJpbnRmKCJsaWJsdm0gdmdjcmVhdGUgdW5pdCB0ZXN0IEZBSUxcbiIpOworCWlmIChoYW5kbGUgJiYgbHZtX2Vycm5vKGhhbmRsZSkpCisJCWZwcmludGYoc3RkZXJyLCAiTFZNIEVycm9yOiAlc1xuIiwgbHZtX2Vycm1zZyhoYW5kbGUpKTsKKwlpZiAodmcpCisJCWx2bV92Z19jbG9zZSh2Zyk7CisJaWYgKGhhbmRsZSkKKwkJbHZtX3F1aXQoaGFuZGxlKTsKKwlfZXhpdCgtMSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2FwaS92Z3Rlc3Quc2ggYi90ZXN0L2FwaS92Z3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiZjUwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBpL3ZndGVzdC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIworIyB0ZXN0cyBsdm0yYXBwIGxpYnJhcnkKKyMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyAyCisKK2F1eCBhcGl0ZXN0IHZndGVzdCAkdmcxICIkZGV2MSIgIiRkZXYyIgpkaWZmIC0tZ2l0IGEvdGVzdC9kYnVzL2x2bWRidXN0ZXN0LnB5IGIvdGVzdC9kYnVzL2x2bWRidXN0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ1N2RiOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RidXMvbHZtZGJ1c3Rlc3QucHkKQEAgLTAsMCArMSwxMTY0IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IGRidXMKKyMgbm9pbnNwZWN0aW9uIFB5VW5yZXNvbHZlZFJlZmVyZW5jZXMKK2Zyb20gZGJ1cy5tYWlubG9vcC5nbGliIGltcG9ydCBEQnVzR01haW5Mb29wCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgcHl1ZGV2CitpbXBvcnQgb3MKK2Zyb20gdGVzdGxpYiBpbXBvcnQgKgorCit1c2Vfc2Vzc2lvbiA9IG9zLmdldGVudignTFZNREJVU0RfVVNFX1NFU1NJT04nLCBGYWxzZSkKKworaWYgdXNlX3Nlc3Npb246CisJYnVzID0gZGJ1cy5TZXNzaW9uQnVzKG1haW5sb29wPURCdXNHTWFpbkxvb3AoKSkKK2Vsc2U6CisJYnVzID0gZGJ1cy5TeXN0ZW1CdXMobWFpbmxvb3A9REJ1c0dNYWluTG9vcCgpKQorCisKK2RlZiBnZXRfb2JqZWN0cygpOgorCXJjID0ge01BTkFHRVJfSU5UOiBbXSwgUFZfSU5UOiBbXSwgVkdfSU5UOiBbXSwgTFZfSU5UOiBbXSwKKwkJCVRISU5QT09MX0lOVDogW10sIEpPQl9JTlQ6IFtdLCBTTkFQU0hPVF9JTlQ6IFtdLCBMVl9DT01NT05fSU5UOiBbXSwKKwkJCUNBQ0hFX1BPT0xfSU5UOiBbXSwgQ0FDSEVfTFZfSU5UOiBbXX0KKworCW1hbmFnZXIgPSBkYnVzLkludGVyZmFjZShidXMuZ2V0X29iamVjdCgKKwkJQlVTTkFNRSwgIi9jb20vcmVkaGF0L2x2bWRidXMxIiksCisJCSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyIikKKworCW9iamVjdHMgPSBtYW5hZ2VyLkdldE1hbmFnZWRPYmplY3RzKCkKKworCWZvciBvYmplY3RfcGF0aCwgdmFsIGluIGxpc3Qob2JqZWN0cy5pdGVtcygpKToKKwkJZm9yIGludGVyZmFjZSwgcHJvcHMgaW4gbGlzdCh2YWwuaXRlbXMoKSk6CisJCQlvID0gQ2xpZW50UHJveHkoYnVzLCBvYmplY3RfcGF0aCwgaW50ZXJmYWNlLCBwcm9wcykKKwkJCXJjW2ludGVyZmFjZV0uYXBwZW5kKG8pCisKKwlyZXR1cm4gcmMsIGJ1cworCisKK2RlZiBzZXRfZXhlY3V0aW9uKGx2bXNoZWxsKToKKwlsdm1fbWFuYWdlciA9IGRidXMuSW50ZXJmYWNlKGJ1cy5nZXRfb2JqZWN0KAorCQlCVVNOQU1FLCAiL2NvbS9yZWRoYXQvbHZtZGJ1czEvTWFuYWdlciIpLAorCQkiY29tLnJlZGhhdC5sdm1kYnVzMS5NYW5hZ2VyIikKKwlsdm1fbWFuYWdlci5Vc2VMdm1TaGVsbChsdm1zaGVsbCkKKworCisjIG5vaW5zcGVjdGlvbiBQeVVucmVzb2x2ZWRSZWZlcmVuY2VzCitjbGFzcyBUZXN0RGJ1c1NlcnZpY2UodW5pdHRlc3QuVGVzdENhc2UpOgorCWRlZiBzZXRVcChzZWxmKToKKwkJIyBCZWNhdXNlIG9mIHRoZSBzZW5zaXRpdmUgbmF0dXJlIG9mIHJ1bm5pbmcgTFZNIHRlc3RzIHdlIHdpbGwgb25seQorCQkjIHJ1biBpZiB3ZSBoYXZlIFBWcyBhbmQgbm90aGluZyBlbHNlLCBzbyB0aGF0IHdlIGNhbiBiZSBjb25maWRlbnQgdGhhdAorCQkjIHdlIGFyZSBub3QgbXVja2luZyB3aXRoIHNvbWVvbmVzIGRhdGEgb24gdGhlaXIgc3lzdGVtCisJCXNlbGYub2Jqcywgc2VsZi5idXMgPSBnZXRfb2JqZWN0cygpCisJCWlmIGxlbihzZWxmLm9ianNbUFZfSU5UXSkgPT0gMDoKKwkJCXByaW50KCdObyBQVnMgcHJlc2VudCBleGl0aW5nIScpCisJCQlzeXMuZXhpdCgxKQorCQlpZiBsZW4oc2VsZi5vYmpzW01BTkFHRVJfSU5UXSkgIT0gMToKKwkJCXByaW50KCdFeHBlY3RpbmcgYSBtYW5hZ2VyIG9iamVjdCEnKQorCQkJc3lzLmV4aXQoMSkKKworCQlpZiBsZW4oc2VsZi5vYmpzW1ZHX0lOVF0pICE9IDA6CisJCQlwcmludCgnRXhwZWN0aW5nIG5vIFZHcyB0byBleGlzdCEnKQorCQkJc3lzLmV4aXQoMSkKKworCQlzZWxmLnB2cyA9IFtdCisJCWZvciBwIGluIHNlbGYub2Jqc1tQVl9JTlRdOgorCQkJc2VsZi5wdnMuYXBwZW5kKHAuUHYuTmFtZSkKKworCWRlZiB0ZWFyRG93bihzZWxmKToKKwkJIyBJZiB3ZSBnZXQgaGVyZSBpdCBtZWFucyB3ZSBwYXNzZWQgc2V0VXAsIHNvIGxldHMgcmVtb3ZlIGFueXRoaW5nCisJCSMgYW5kIGV2ZXJ5dGhpbmcgdGhhdCByZW1haW5zLCBiZXNpZGVzIHRoZSBQVnMgdGhlbXNlbHZlcworCQlzZWxmLm9ianMsIHNlbGYuYnVzID0gZ2V0X29iamVjdHMoKQorCQlmb3IgdiBpbiBzZWxmLm9ianNbVkdfSU5UXToKKwkJCSMgcHJpbnQgIkRFQlVHOiBSZW1vdmluZyBWRz0gIiwgdi5VdWlkLCB2Lk5hbWUKKwkJCXYuVmcuUmVtb3ZlKC0xLCB7fSkKKworCQkjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUFZzIHdlIGhhZCB0byBzdGFydCBleGlzdCwgZWxzZSByZS1jcmVhdGUKKwkJIyB0aGVtCisJCWlmIGxlbihzZWxmLnB2cykgIT0gbGVuKHNlbGYub2Jqc1tQVl9JTlRdKToKKwkJCWZvciBwIGluIHNlbGYucHZzOgorCQkJCWZvdW5kID0gRmFsc2UKKwkJCQlmb3IgcGMgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQkJCWlmIHBjLlB2Lk5hbWUgPT0gcDoKKwkJCQkJCWZvdW5kID0gVHJ1ZQorCQkJCQkJYnJlYWsKKworCQkJCWlmIG5vdCBmb3VuZDoKKwkJCQkJIyBwcmludCgnUmUtY3JlYXRpbmcgUFY9JywgcCkKKwkJCQkJc2VsZi5fcHZfY3JlYXRlKHApCisKKwlkZWYgX3B2X2NyZWF0ZShzZWxmLCBkZXZpY2UpOgorCQlwdl9wYXRoID0gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyLlB2Q3JlYXRlKGRldmljZSwgLTEsIHt9KVswXQorCQlzZWxmLmFzc2VydFRydWUocHZfcGF0aCBpcyBub3QgTm9uZSBhbmQgbGVuKHB2X3BhdGgpID4gMCkKKwkJcmV0dXJuIHB2X3BhdGgKKworCWRlZiBfbWFuYWdlcihzZWxmKToKKwkJcmV0dXJuIHNlbGYub2Jqc1tNQU5BR0VSX0lOVF1bMF0KKworCWRlZiBfcmVmcmVzaChzZWxmKToKKwkJcmV0dXJuIHNlbGYuX21hbmFnZXIoKS5NYW5hZ2VyLlJlZnJlc2goKQorCisJZGVmIHRlc3RfcmVmcmVzaChzZWxmKToKKwkJcmMgPSBzZWxmLl9yZWZyZXNoKCkKKwkJc2VsZi5hc3NlcnRFcXVhbChyYywgMCkKKworCWRlZiB0ZXN0X3ZlcnNpb24oc2VsZik6CisJCXJjID0gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyLlZlcnNpb24KKwkJc2VsZi5hc3NlcnRUcnVlKHJjIGlzIG5vdCBOb25lIGFuZCBsZW4ocmMpID4gMCkKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwlkZWYgX3ZnX2NyZWF0ZShzZWxmLCBwdl9wYXRocz1Ob25lKToKKworCQlpZiBub3QgcHZfcGF0aHM6CisJCQlwdl9wYXRocyA9IFtzZWxmLm9ianNbUFZfSU5UXVswXS5vYmplY3RfcGF0aF0KKworCQl2Z19uYW1lID0gcnMoOCwgJ192ZycpCisKKwkJdmdfcGF0aCA9IHNlbGYub2Jqc1tNQU5BR0VSX0lOVF1bMF0uTWFuYWdlci5WZ0NyZWF0ZSgKKwkJCXZnX25hbWUsCisJCQlwdl9wYXRocywKKwkJCS0xLAorCQkJe30pWzBdCisJCXNlbGYuYXNzZXJ0VHJ1ZSh2Z19wYXRoIGlzIG5vdCBOb25lIGFuZCBsZW4odmdfcGF0aCkgPiAwKQorCQlyZXR1cm4gQ2xpZW50UHJveHkoc2VsZi5idXMsIHZnX3BhdGgpCisKKwlkZWYgdGVzdF92Z19jcmVhdGUoc2VsZik6CisJCXNlbGYuX3ZnX2NyZWF0ZSgpCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJZGVmIHRlc3RfdmdfZGVsZXRlKHNlbGYpOgorCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZSgpLlZnCisJCXZnLlJlbW92ZSgtMSwge30pCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJZGVmIF9wdl9yZW1vdmUoc2VsZiwgcHYpOgorCQlyYyA9IHB2LlB2LlJlbW92ZSgtMSwge30pCisJCXJldHVybiByYworCisJZGVmIHRlc3RfcHZfcmVtb3ZlX2FkZChzZWxmKToKKwkJdGFyZ2V0ID0gc2VsZi5vYmpzW1BWX0lOVF1bMF0KKworCQkjIFJlbW92ZSB0aGUgUFYKKwkJcmMgPSBzZWxmLl9wdl9yZW1vdmUodGFyZ2V0KQorCQlzZWxmLmFzc2VydFRydWUocmMgPT0gJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQkjIEFkZCBpdCBiYWNrCisJCXJjID0gc2VsZi5fcHZfY3JlYXRlKHRhcmdldC5Qdi5OYW1lKVswXQorCQlzZWxmLmFzc2VydFRydWUocmMgPT0gJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCWRlZiBfY3JlYXRlX3JhaWQ1X3RoaW5fcG9vbChzZWxmLCB2Zz1Ob25lKToKKworCQlpZiBub3Qgdmc6CisJCQlwdl9wYXRocyA9IFtdCisJCQlmb3IgcHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQkJcHZfcGF0aHMuYXBwZW5kKHBwLm9iamVjdF9wYXRoKQorCisJCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZShwdl9wYXRocykuVmcKKworCQlsdl9tZXRhX3BhdGggPSB2Zy5MdkNyZWF0ZVJhaWQoCisJCQkibWV0YV9yNSIsICJyYWlkNSIsIG1pYig0KSwgMCwgMCwgLTEsIHt9KVswXQorCisJCWx2X2RhdGFfcGF0aCA9IHZnLkx2Q3JlYXRlUmFpZCgKKwkJCSJkYXRhX3I1IiwgInJhaWQ1IiwgbWliKDE2KSwgMCwgMCwgLTEsIHt9KVswXQorCisJCXRoaW5fcG9vbF9wYXRoID0gdmcuQ3JlYXRlVGhpblBvb2woCisJCQlsdl9tZXRhX3BhdGgsIGx2X2RhdGFfcGF0aCwgLTEsIHt9KVswXQorCisJCSMgR2V0IHRoaW4gcG9vbCBjbGllbnQgcHJveHkKKwkJdGhpbl9wb29sID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHRoaW5fcG9vbF9wYXRoKQorCisJCXJldHVybiB2ZywgdGhpbl9wb29sCisKKwlkZWYgdGVzdF9tZXRhX2x2X2RhdGFfbHZfcHJvcHMoc2VsZik6CisJCSMgRW5zdXJlIHRoYXQgbWV0YWRhdGEgbHYgYW5kIGRhdGEgbHYgZm9yIHRoaW4gcG9vbHMgYW5kIGNhY2hlIHBvb2xzCisJCSMgcG9pbnQgdG8gYSB2YWxpZCBMVgorCQkodmcsIHRoaW5fcG9vbCkgPSBzZWxmLl9jcmVhdGVfcmFpZDVfdGhpbl9wb29sKCkKKworCQkjIENoZWNrIHByb3BlcnRpZXMgb24gdGhpbiBwb29sCisJCXNlbGYuYXNzZXJ0VHJ1ZSh0aGluX3Bvb2wuVGhpblBvb2wuRGF0YUx2ICE9ICcvJykKKwkJc2VsZi5hc3NlcnRUcnVlKHRoaW5fcG9vbC5UaGluUG9vbC5NZXRhRGF0YUx2ICE9ICcvJykKKworCQkodmcsIGNhY2hlX3Bvb2wpID0gc2VsZi5fY3JlYXRlX2NhY2hlX3Bvb2wodmcpCisKKwkJc2VsZi5hc3NlcnRUcnVlKGNhY2hlX3Bvb2wuQ2FjaGVQb29sLkRhdGFMdiAhPSAnLycpCisJCXNlbGYuYXNzZXJ0VHJ1ZShjYWNoZV9wb29sLkNhY2hlUG9vbC5NZXRhRGF0YUx2ICE9ICcvJykKKworCQkjIENhY2hlIHRoZSB0aGluIHBvb2wKKwkJY2FjaGVkX3RoaW5fcG9vbF9wYXRoID0gY2FjaGVfcG9vbC5cCisJCQlDYWNoZVBvb2wuQ2FjaGVMdih0aGluX3Bvb2wub2JqZWN0X3BhdGgsIC0xLCB7fSlbMF0KKworCQkjIEdldCBvYmplY3QgcHJveHkgZm9yIGNhY2hlZCB0aGluIHBvb2wKKwkJY2FjaGVkX3RoaW5fcG9vbF9vYmplY3QgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgY2FjaGVkX3RoaW5fcG9vbF9wYXRoKQorCisJCSMgQ2hlY2sgcHJvcGVydGllcyBvbiBjYWNoZSBwb29sCisJCXNlbGYuYXNzZXJ0VHJ1ZShjYWNoZWRfdGhpbl9wb29sX29iamVjdC5UaGluUG9vbC5EYXRhTHYgIT0gJy8nKQorCQlzZWxmLmFzc2VydFRydWUoY2FjaGVkX3RoaW5fcG9vbF9vYmplY3QuVGhpblBvb2wuTWV0YURhdGFMdiAhPSAnLycpCisKKwlkZWYgX2xvb2t1cChzZWxmLCBsdm1faWQpOgorCQlyZXR1cm4gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyLkxvb2tVcEJ5THZtSWQobHZtX2lkKQorCisJZGVmIHRlc3RfbG9va3VwX2J5X2x2bV9pZChzZWxmKToKKwkJIyBGb3IgdGhlIG1vbWVudCBsZXRzIGp1c3QgbG9va3VwIHdoYXQgd2Uga25vdyBhYm91dCB3aGljaCBpcyBQVnMKKwkJIyBXaGVuIHdlIHN0YXJ0IHRlc3RpbmcgVkdzIGFuZCBMVnMgd2Ugd2lsbCB0ZXN0IGxvb2t1cHMgZm9yIHRob3NlCisJCSMgZHVyaW5nIHRob3NlIHVuaXQgdGVzdHMKKwkJZm9yIHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQlyYyA9IHNlbGYuX2xvb2t1cChwLlB2Lk5hbWUpCisJCQlzZWxmLmFzc2VydFRydWUocmMgaXMgbm90IE5vbmUgYW5kIHJjICE9ICcvJykKKworCQkjIFNlYXJjaCBmb3Igc29tZXRoaW5nIHdoaWNoIGRvZXNuJ3QgZXhpc3QKKwkJcmMgPSBzZWxmLl9sb29rdXAoJy9kZXYvbnVsbCcpCisJCXNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAnLycpCisKKwlkZWYgdGVzdF92Z19leHRlbmQoc2VsZik6CisJCSMgQ3JlYXRlIGEgVkcKKwkJc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm9ianNbUFZfSU5UXSkgPj0gMikKKworCQlpZiBsZW4oc2VsZi5vYmpzW1BWX0lOVF0pID49IDI6CisJCQlwdl9pbml0aWFsID0gc2VsZi5vYmpzW1BWX0lOVF1bMF0KKwkJCXB2X25leHQgPSBzZWxmLm9ianNbUFZfSU5UXVsxXQorCisJCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZShbcHZfaW5pdGlhbC5vYmplY3RfcGF0aF0pLlZnCisJCQlwYXRoID0gdmcuRXh0ZW5kKFtwdl9uZXh0Lm9iamVjdF9wYXRoXSwgLTEsIHt9KQorCQkJc2VsZi5hc3NlcnRUcnVlKHBhdGggPT0gJy8nKQorCQkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwkjIG5vaW5zcGVjdGlvbiBQeVVucmVzb2x2ZWRSZWZlcmVuY2VzCisJZGVmIHRlc3RfdmdfcmVkdWNlKHNlbGYpOgorCQlzZWxmLmFzc2VydFRydWUobGVuKHNlbGYub2Jqc1tQVl9JTlRdKSA+PSAyKQorCisJCWlmIGxlbihzZWxmLm9ianNbUFZfSU5UXSkgPj0gMjoKKwkJCXZnID0gc2VsZi5fdmdfY3JlYXRlKAorCQkJCVtzZWxmLm9ianNbUFZfSU5UXVswXS5vYmplY3RfcGF0aCwKKwkJCQlzZWxmLm9ianNbUFZfSU5UXVsxXS5vYmplY3RfcGF0aF0pLlZnCisKKwkJCXBhdGggPSB2Zy5SZWR1Y2UoRmFsc2UsIFt2Zy5QdnNbMF1dLCAtMSwge30pCisJCQlzZWxmLmFzc2VydFRydWUocGF0aCA9PSAnLycpCisJCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCSMgbm9pbnNwZWN0aW9uIFB5VW5yZXNvbHZlZFJlZmVyZW5jZXMKKwlkZWYgdGVzdF92Z19yZW5hbWUoc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKworCQltZ3IgPSBzZWxmLm9ianNbTUFOQUdFUl9JTlRdWzBdLk1hbmFnZXIKKworCQkjIERvIGEgdmcgbG9va3VwCisJCXBhdGggPSBtZ3IuTG9va1VwQnlMdm1JZCh2Zy5OYW1lKQorCisJCXZnX25hbWVfc3RhcnQgPSB2Zy5OYW1lCisKKwkJcHJldl9wYXRoID0gcGF0aAorCQlzZWxmLmFzc2VydFRydWUocGF0aCAhPSAnLycsICIlcyIgJSAocGF0aCkpCisKKwkJIyBDcmVhdGUgc29tZSBMVnMgaW4gdGhlIFZHCisJCWZvciBpIGluIHJhbmdlKDAsIDUpOgorCQkJbHZfdCA9IHNlbGYuX2NyZWF0ZV9sdihzaXplPW1pYig0KSwgdmc9dmcpCisJCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKHZnX25hbWVfc3RhcnQsIGx2X3QuTHZDb21tb24uTmFtZSkKKwkJCWx2X3BhdGggPSBtZ3IuTG9va1VwQnlMdm1JZChmdWxsX25hbWUpCisJCQlzZWxmLmFzc2VydFRydWUobHZfcGF0aCA9PSBsdl90Lm9iamVjdF9wYXRoKQorCisJCW5ld19uYW1lID0gJ3JlbmFtZWRfJyArIHZnLk5hbWUKKworCQlwYXRoID0gdmcuUmVuYW1lKG5ld19uYW1lLCAtMSwge30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShwYXRoID09ICcvJykKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwkJIyBEbyBhIHZnIGxvb2t1cAorCQlwYXRoID0gbWdyLkxvb2tVcEJ5THZtSWQobmV3X25hbWUpCisJCXNlbGYuYXNzZXJ0VHJ1ZShwYXRoICE9ICcvJywgIiVzIiAlIChwYXRoKSkKKwkJc2VsZi5hc3NlcnRUcnVlKHByZXZfcGF0aCA9PSBwYXRoLCAiJXMgIT0gJXMiICUgKHByZXZfcGF0aCwgcGF0aCkpCisKKwkJIyBHbyB0aHJvdWdoIGVhY2ggTFYgYW5kIG1ha2Ugc3VyZSBpdCBoYXMgdGhlIGNvcnJlY3QgcGF0aCBiYWNrIHRvIHRoZQorCQkjIFZHCisJCXZnLnVwZGF0ZSgpCisKKwkJbHZfcGF0aHMgPSB2Zy5MdnMKKwkJc2VsZi5hc3NlcnRUcnVlKGxlbihsdl9wYXRocykgPT0gNSkKKworCQlmb3IgbCBpbiBsdl9wYXRoczoKKwkJCWx2X3Byb3h5ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIGwpLkx2Q29tbW9uCisJCQlzZWxmLmFzc2VydFRydWUobHZfcHJveHkuVmcgPT0gdmcub2JqZWN0X3BhdGgsICIlcyAhPSAlcyIgJQorCQkJCQkJCShsdl9wcm94eS5WZywgdmcub2JqZWN0X3BhdGgpKQorCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlIChuZXdfbmFtZSwgbHZfcHJveHkuTmFtZSkKKwkJCWx2X3BhdGggPSBtZ3IuTG9va1VwQnlMdm1JZChmdWxsX25hbWUpCisJCQlzZWxmLmFzc2VydFRydWUobHZfcGF0aCA9PSBsdl9wcm94eS5vYmplY3RfcGF0aCwgIiVzICE9ICVzIiAlCisJCQkJCQkJKGx2X3BhdGgsIGx2X3Byb3h5Lm9iamVjdF9wYXRoKSkKKworCWRlZiBfdmVyaWZ5X2hpZGRlbl9sb29rdXBzKHNlbGYsIGx2X2NvbW1vbl9vYmplY3QsIHZnbmFtZSk6CisJCW1nciA9IHNlbGYub2Jqc1tNQU5BR0VSX0lOVF1bMF0uTWFuYWdlcgorCisJCWhpZGRlbl9sdl9wYXRocyA9IGx2X2NvbW1vbl9vYmplY3QuSGlkZGVuTHZzCisKKwkJZm9yIGggaW4gaGlkZGVuX2x2X3BhdGhzOgorCQkJaF9sdiA9IENsaWVudFByb3h5KHNlbGYuYnVzLCBoKS5MdkNvbW1vbgorCisJCQlpZiBsZW4oaF9sdi5IaWRkZW5MdnMpID4gMDoKKwkJCQlzZWxmLl92ZXJpZnlfaGlkZGVuX2xvb2t1cHMoaF9sdiwgdmduYW1lKQorCisJCQkjIHByaW50KCJIaWRkZW4gY2hlY2sgJXMgJXMiICUgKGgsIGhfbHYuTmFtZSkpCisJCQlmdWxsX25hbWUgPSAiJXMvJXMiICUgKHZnbmFtZSwgaF9sdi5OYW1lKQorCQkJbG9va3VwX3BhdGggPSBtZ3IuTG9va1VwQnlMdm1JZChmdWxsX25hbWUpCisJCQlzZWxmLmFzc2VydFRydWUobG9va3VwX3BhdGggIT0gJy8nKQorCQkJc2VsZi5hc3NlcnRUcnVlKGxvb2t1cF9wYXRoID09IGhfbHYub2JqZWN0X3BhdGgpCisKKwlkZWYgdGVzdF92Z19yZW5hbWVfd2l0aF90aGluX3Bvb2woc2VsZik6CisKKwkJKHZnLCB0aGluX3Bvb2wpID0gc2VsZi5fY3JlYXRlX3JhaWQ1X3RoaW5fcG9vbCgpCisKKwkJdmdfbmFtZV9zdGFydCA9IHZnLk5hbWUKKwkJbWdyID0gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyCisKKwkJIyBub2luc3BlY3Rpb24gUHlUeXBlQ2hlY2tlcgorCQlzZWxmLl92ZXJpZnlfaGlkZGVuX2xvb2t1cHModGhpbl9wb29sLkx2Q29tbW9uLCB2Z19uYW1lX3N0YXJ0KQorCisJCWZvciBpIGluIHJhbmdlKDAsIDUpOgorCQkJbHZfbmFtZSA9IHJzKDgsICdfbHYnKQorCisJCQl0aGluX2x2X3BhdGggPSB0aGluX3Bvb2wuVGhpblBvb2wuTHZDcmVhdGUoCisJCQkJbHZfbmFtZSwgbWliKDE2KSwgLTEsIHt9KVswXQorCisJCQlzZWxmLmFzc2VydFRydWUodGhpbl9sdl9wYXRoICE9ICcvJykKKworCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlICh2Z19uYW1lX3N0YXJ0LCBsdl9uYW1lKQorCisJCQlsb29rdXBfbHZfcGF0aCA9IG1nci5Mb29rVXBCeUx2bUlkKGZ1bGxfbmFtZSkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh0aGluX2x2X3BhdGggPT0gbG9va3VwX2x2X3BhdGgsCisJCQkJCQkJIiVzICE9ICVzIiAlICh0aGluX2x2X3BhdGgsIGxvb2t1cF9sdl9wYXRoKSkKKworCQkjIFJlbmFtZSB0aGUgVkcKKwkJbmV3X25hbWUgPSAncmVuYW1lZF8nICsgdmcuTmFtZQorCisJCXBhdGggPSB2Zy5SZW5hbWUobmV3X25hbWUsIC0xLCB7fSkKKwkJc2VsZi5hc3NlcnRUcnVlKHBhdGggPT0gJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQkjIEdvIHRocm91Z2ggZWFjaCBMViBhbmQgbWFrZSBzdXJlIGl0IGhhcyB0aGUgY29ycmVjdCBwYXRoIGJhY2sgdG8gdGhlCisJCSMgVkcKKwkJdmcudXBkYXRlKCkKKwkJdGhpbl9wb29sLnVwZGF0ZSgpCisKKwkJbHZfcGF0aHMgPSB2Zy5MdnMKKworCQlmb3IgbCBpbiBsdl9wYXRoczoKKwkJCWx2X3Byb3h5ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIGwpLkx2Q29tbW9uCisJCQlzZWxmLmFzc2VydFRydWUobHZfcHJveHkuVmcgPT0gdmcub2JqZWN0X3BhdGgsICIlcyAhPSAlcyIgJQorCQkJCQkJCShsdl9wcm94eS5WZywgdmcub2JqZWN0X3BhdGgpKQorCQkJZnVsbF9uYW1lID0gIiVzLyVzIiAlIChuZXdfbmFtZSwgbHZfcHJveHkuTmFtZSkKKwkJCSMgcHJpbnQoJ0Z1bGwgTmFtZSAlcycgJSAoZnVsbF9uYW1lKSkKKwkJCWx2X3BhdGggPSBtZ3IuTG9va1VwQnlMdm1JZChmdWxsX25hbWUpCisJCQlzZWxmLmFzc2VydFRydWUobHZfcGF0aCA9PSBsdl9wcm94eS5vYmplY3RfcGF0aCwgIiVzICE9ICVzIiAlCisJCQkJCQkJKGx2X3BhdGgsIGx2X3Byb3h5Lm9iamVjdF9wYXRoKSkKKworCQkjIG5vaW5zcGVjdGlvbiBQeVR5cGVDaGVja2VyCisJCXNlbGYuX3ZlcmlmeV9oaWRkZW5fbG9va3Vwcyh0aGluX3Bvb2wuTHZDb21tb24sIG5ld19uYW1lKQorCisJZGVmIF90ZXN0X2x2X2NyZWF0ZShzZWxmLCBtZXRob2QsIHBhcmFtcywgdmcpOgorCQlsdiA9IE5vbmUKKwkJcGF0aCA9IG1ldGhvZCgqcGFyYW1zKVswXQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSh2ZykKKworCQlpZiBwYXRoOgorCQkJbHYgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgcGF0aCkKKwkJCSMgVE9ETyB2ZXJpZnkgb2JqZWN0IHByb3BlcnRpZXMKKworCQkjIFdlIGFyZSBxdWljayBlbm91Z2ggbm93IHRoYXQgd2UgY2FuIGdldCBWb2x1bWVUeXBlIGNoYW5nZXMgZnJvbQorCQkjICdJJyB0byAnaScgYmV0d2VlbiB0aGUgdGltZSBpdCB0YWtlcyB0byBjcmVhdGUgYSBSQUlEIGFuZCBpdCByZXR1cm5zCisJCSMgYW5kIHdoZW4gd2UgcmVmcmVzaCBzdGF0ZSBoZXJlLiAgTm90IHN1cmUgaG93IHdlIGNhbiBoYW5kbGUgdGhpcyBhcworCQkjIHdlIGNhbm5vdCBqdXN0IHNpdCBhbmQgcG9sbCBhbGwgdGhlIHRpbWUgZm9yIGNoYW5nZXMuLi4KKwkJIyBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKwkJcmV0dXJuIGx2CisKKwlkZWYgdGVzdF9sdl9jcmVhdGUoc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKwkJc2VsZi5fdGVzdF9sdl9jcmVhdGUoCisJCQl2Zy5MdkNyZWF0ZSwKKwkJCShycyg4LCAnX2x2JyksIG1pYig0KSwKKwkJCWRidXMuQXJyYXkoW10sICcob3R0KScpLCAtMSwge30pLCB2ZykKKworCWRlZiB0ZXN0X2x2X2NyZWF0ZV9saW5lYXIoc2VsZik6CisKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUoKS5WZworCQlzZWxmLl90ZXN0X2x2X2NyZWF0ZSgKKwkJCXZnLkx2Q3JlYXRlTGluZWFyLAorCQkJKHJzKDgsICdfbHYnKSwgbWliKDQpLCBGYWxzZSwgLTEsIHt9KSwgdmcpCisKKwlkZWYgdGVzdF9sdl9jcmVhdGVfc3RyaXBlZChzZWxmKToKKwkJcHZfcGF0aHMgPSBbXQorCQlmb3IgcHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQlwdl9wYXRocy5hcHBlbmQocHAub2JqZWN0X3BhdGgpCisKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUocHZfcGF0aHMpLlZnCisJCXNlbGYuX3Rlc3RfbHZfY3JlYXRlKAorCQkJdmcuTHZDcmVhdGVTdHJpcGVkLAorCQkJKHJzKDgsICdfbHYnKSwgbWliKDQpLCAyLCA4LCBGYWxzZSwKKwkJCS0xLCB7fSksIHZnKQorCisJZGVmIHRlc3RfbHZfY3JlYXRlX21pcnJvcihzZWxmKToKKwkJcHZfcGF0aHMgPSBbXQorCQlmb3IgcHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQlwdl9wYXRocy5hcHBlbmQocHAub2JqZWN0X3BhdGgpCisKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUocHZfcGF0aHMpLlZnCisJCXNlbGYuX3Rlc3RfbHZfY3JlYXRlKHZnLkx2Q3JlYXRlTWlycm9yLAorCQkJKHJzKDgsICdfbHYnKSwgbWliKDQpLCAyLCAtMSwge30pLCB2ZykKKworCWRlZiB0ZXN0X2x2X2NyZWF0ZV9yYWlkKHNlbGYpOgorCQlwdl9wYXRocyA9IFtdCisJCWZvciBwcCBpbiBzZWxmLm9ianNbUFZfSU5UXToKKwkJCXB2X3BhdGhzLmFwcGVuZChwcC5vYmplY3RfcGF0aCkKKworCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZShwdl9wYXRocykuVmcKKwkJc2VsZi5fdGVzdF9sdl9jcmVhdGUodmcuTHZDcmVhdGVSYWlkLAorCQkJKHJzKDgsICdfbHYnKSwgJ3JhaWQ0JywKKwkJCW1pYigxNiksIDIsIDgsIC0xLCB7fSksIHZnKQorCisJZGVmIF9jcmVhdGVfbHYoc2VsZiwgdGhpbnBvb2w9RmFsc2UsIHNpemU9Tm9uZSwgdmc9Tm9uZSk6CisKKwkJaWYgbm90IHZnOgorCQkJcHZfcGF0aHMgPSBbXQorCQkJZm9yIHBwIGluIHNlbGYub2Jqc1tQVl9JTlRdOgorCQkJCXB2X3BhdGhzLmFwcGVuZChwcC5vYmplY3RfcGF0aCkKKworCQkJdmcgPSBzZWxmLl92Z19jcmVhdGUocHZfcGF0aHMpLlZnCisKKwkJaWYgc2l6ZSBpcyBOb25lOgorCQkJc2l6ZSA9IG1pYig0KQorCisJCXJldHVybiBzZWxmLl90ZXN0X2x2X2NyZWF0ZSgKKwkJCXZnLkx2Q3JlYXRlTGluZWFyLAorCQkJKHJzKDgsICdfbHYnKSwgc2l6ZSwgdGhpbnBvb2wsIC0xLCB7fSksIHZnKQorCisJZGVmIHRlc3RfbHZfY3JlYXRlX3JvdW5kaW5nKHNlbGYpOgorCQlzZWxmLl9jcmVhdGVfbHYoc2l6ZT0obWliKDIpICsgMTMpKQorCisJZGVmIHRlc3RfbHZfY3JlYXRlX3RoaW5fcG9vbChzZWxmKToKKwkJc2VsZi5fY3JlYXRlX2x2KFRydWUpCisKKwlkZWYgdGVzdF9sdl9yZW5hbWUoc2VsZik6CisJCSMgUmVuYW1lIGEgcmVndWxhciBMVgorCQlsdiA9IHNlbGYuX2NyZWF0ZV9sdigpCisKKwkJcGF0aCA9IHNlbGYub2Jqc1tNQU5BR0VSX0lOVF1bMF0uTWFuYWdlci5Mb29rVXBCeUx2bUlkKGx2Lkx2Q29tbW9uLk5hbWUpCisJCXByZXZfcGF0aCA9IHBhdGgKKworCQluZXdfbmFtZSA9ICdyZW5hbWVkXycgKyBsdi5MdkNvbW1vbi5OYW1lCisJCWx2Lkx2LlJlbmFtZShuZXdfbmFtZSwgLTEsIHt9KQorCisJCXBhdGggPSBzZWxmLm9ianNbTUFOQUdFUl9JTlRdWzBdLk1hbmFnZXIuTG9va1VwQnlMdm1JZChuZXdfbmFtZSkKKworCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKwkJc2VsZi5hc3NlcnRUcnVlKHByZXZfcGF0aCA9PSBwYXRoLCAiJXMgIT0gJXMiICUgKHByZXZfcGF0aCwgcGF0aCkpCisKKwlkZWYgdGVzdF9sdl90aGlucG9vbF9yZW5hbWUoc2VsZik6CisJCSMgUmVuYW1lIGEgdGhpbiBwb29sCisJCXRwID0gc2VsZi5fY3JlYXRlX2x2KFRydWUpCisJCXNlbGYuYXNzZXJ0VHJ1ZShUSElOUE9PTF9MVl9QQVRIIGluIHRwLm9iamVjdF9wYXRoLAorCQkJCQkJIiVzIiAlICh0cC5vYmplY3RfcGF0aCkpCisKKwkJbmV3X25hbWUgPSAncmVuYW1lZF8nICsgdHAuTHZDb21tb24uTmFtZQorCQl0cC5Mdi5SZW5hbWUobmV3X25hbWUsIC0xLCB7fSkKKwkJdHAudXBkYXRlKCkKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisJCXNlbGYuYXNzZXJ0RXF1YWwobmV3X25hbWUsIHRwLkx2Q29tbW9uLk5hbWUpCisKKwkjIG5vaW5zcGVjdGlvbiBQeVVucmVzb2x2ZWRSZWZlcmVuY2VzCisJZGVmIHRlc3RfbHZfb25fdGhpbl9wb29sX3JlbmFtZShzZWxmKToKKwkJIyBSZW5hbWUgYSBMViBvbiBhIHRoaW4gUG9vbAorCisJCSMgVGhpcyByZXR1cm5zIGEgTFYgd2l0aCB0aGUgTFYgaW50ZXJmYWNlLCBuZWVkIHRvIGdldCBhIHByb3h5IGZvcgorCQkjIHRoaW5wb29sIGludGVyZmFjZSB0b28KKwkJdHAgPSBzZWxmLl9jcmVhdGVfbHYoVHJ1ZSkKKworCQl0aGluX3BhdGggPSB0cC5UaGluUG9vbC5MdkNyZWF0ZSgKKwkJCXJzKDEwLCAnX3RoaW5fbHYnKSwgbWliKDgpLCAtMSwge30pWzBdCisKKwkJbHYgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgdGhpbl9wYXRoKQorCQlyYyA9IGx2Lkx2LlJlbmFtZSgncmVuYW1lX3Rlc3QnICsgbHYuTHZDb21tb24uTmFtZSwgLTEsIHt9KQorCQlzZWxmLmFzc2VydFRydWUocmMgPT0gJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCWRlZiB0ZXN0X2x2X3JlbW92ZShzZWxmKToKKwkJbHYgPSBzZWxmLl9jcmVhdGVfbHYoKS5MdgorCQlyYyA9IGx2LlJlbW92ZSgtMSwge30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAnLycpCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJZGVmIHRlc3RfbHZfc25hcHNob3Qoc2VsZik6CisJCWx2X3AgPSBzZWxmLl9jcmVhdGVfbHYoKQorCQlzc19uYW1lID0gJ3NzXycgKyBsdl9wLkx2Q29tbW9uLk5hbWUKKworCQkjIFRlc3Qgd2FpdGluZyB0byBjb21wbGV0ZQorCQlzcywgam9iID0gbHZfcC5Mdi5TbmFwc2hvdChzc19uYW1lLCAwLCAtMSwge30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShzcyAhPSAnLycpCisJCXNlbGYuYXNzZXJ0VHJ1ZShqb2IgPT0gJy8nKQorCisJCXNuYXBzaG90ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHNzKQorCQlzZWxmLmFzc2VydFRydWUoc25hcHNob3QuTHZDb21tb24uTmFtZSA9PSBzc19uYW1lKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJCSMgVGVzdCBnZXR0aW5nIGEgam9iIHJldHVybmVkIGltbWVkaWF0ZWx5CisJCXJjLCBqb2IgPSBsdl9wLkx2LlNuYXBzaG90KCdzczJfJyArIGx2X3AuTHZDb21tb24uTmFtZSwgMCwgMCwge30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAnLycpCisJCXNlbGYuYXNzZXJ0VHJ1ZShqb2IgIT0gJy8nKQorCQlzZWxmLl93YWl0X2Zvcl9qb2Ioam9iKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJIyBub2luc3BlY3Rpb24gUHlVbnJlc29sdmVkUmVmZXJlbmNlcworCWRlZiBfd2FpdF9mb3Jfam9iKHNlbGYsIGpfcGF0aCk6CisJCWltcG9ydCB0aW1lCisJCXJjID0gTm9uZQorCQlqID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIGpfcGF0aCkuSm9iCisKKwkJd2hpbGUgVHJ1ZToKKwkJCWoudXBkYXRlKCkKKwkJCWlmIGouQ29tcGxldGU6CisJCQkJKGVjLCBlcnJvcl9tc2cpID0gai5HZXRFcnJvcgorCQkJCXNlbGYuYXNzZXJ0VHJ1ZShlYyA9PSAwLCAiJWQgOiVzIiAlIChlYywgZXJyb3JfbXNnKSkKKworCQkJCWlmIGVjID09IDA6CisJCQkJCXNlbGYuYXNzZXJ0VHJ1ZShqLlBlcmNlbnQgPT0gMTAwLCAiUD0gJWYiICUgai5QZXJjZW50KQorCisJCQkJcmMgPSBqLlJlc3VsdAorCQkJCWouUmVtb3ZlKCkKKworCQkJCWJyZWFrCisKKwkJCWlmIGouV2FpdCgxKToKKwkJCQlqLnVwZGF0ZSgpCisJCQkJc2VsZi5hc3NlcnRUcnVlKGouQ29tcGxldGUpCisKKwkJcmV0dXJuIHJjCisKKwlkZWYgdGVzdF9sdl9jcmVhdGVfcHZfc3BlY2lmaWMoc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKworCQlwdiA9IHZnLlB2cworCisJCXB2X3Byb3h5ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHB2WzBdKQorCisJCXNlbGYuX3Rlc3RfbHZfY3JlYXRlKHZnLkx2Q3JlYXRlLCAocnMoOCwgJ19sdicpLCBtaWIoNCksCisJCQlkYnVzLkFycmF5KFtbcHZfcHJveHkub2JqZWN0X3BhdGgsIDAsIChwdl9wcm94eS5Qdi5QZUNvdW50IC0gMSldXSwKKwkJCScob3R0KScpLCAtMSwge30pLCB2ZykKKworCWRlZiB0ZXN0X2x2X3Jlc2l6ZShzZWxmKToKKworCQlwdl9wYXRocyA9IFtdCisJCWZvciBwcCBpbiBzZWxmLm9ianNbUFZfSU5UXToKKwkJCXB2X3BhdGhzLmFwcGVuZChwcC5vYmplY3RfcGF0aCkKKworCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZShwdl9wYXRocykuVmcKKwkJbHYgPSBzZWxmLl9jcmVhdGVfbHYodmc9dmcsIHNpemU9bWliKDE2KSkKKworCQlmb3Igc2l6ZSBpbiBcCisJCQlbCisJCQlsdi5MdkNvbW1vbi5TaXplQnl0ZXMgKyA0MTk0MzA0LAorCQkJbHYuTHZDb21tb24uU2l6ZUJ5dGVzIC0gNDE5NDMwNCwKKwkJCWx2Lkx2Q29tbW9uLlNpemVCeXRlcyArIDIwNDgsCisJCQlsdi5MdkNvbW1vbi5TaXplQnl0ZXMgLSAyMDQ4XToKKworCQkJcHZfaW5fdXNlID0gW2lbMF0gZm9yIGkgaW4gbHYuTHZDb21tb24uRGV2aWNlc10KKwkJCSMgU2VsZWN0IGEgUFYgaW4gdGhlIFZHIHRoYXQgaXNuJ3QgaW4gdXNlCisJCQlwdl9lbXB0eSA9IFtwIGZvciBwIGluIHZnLlB2cyBpZiBwIG5vdCBpbiBwdl9pbl91c2VdCisKKwkJCXByZXYgPSBsdi5MdkNvbW1vbi5TaXplQnl0ZXMKKworCQkJaWYgbGVuKHB2X2VtcHR5KToKKwkJCQlwID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHB2X2VtcHR5WzBdKQorCQkJCXJjID0gbHYuTHYuUmVzaXplKAorCQkJCQlzaXplLAorCQkJCQlkYnVzLkFycmF5KFtbcC5vYmplY3RfcGF0aCwgMCwgcC5Qdi5QZUNvdW50IC0gMV1dLCAnKG9paSknKSwKKwkJCQkJLTEsIHt9KQorCQkJZWxzZToKKwkJCQlyYyA9IGx2Lkx2LlJlc2l6ZShzaXplLCBkYnVzLkFycmF5KFtdLCAnKG9paSknKSwgLTEsIHt9KQorCisJCQlzZWxmLmFzc2VydEVxdWFsKHJjLCAnLycpCisJCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQkJbHYudXBkYXRlKCkKKworCQkJaWYgcHJldiA8IHNpemU6CisJCQkJc2VsZi5hc3NlcnRUcnVlKGx2Lkx2Q29tbW9uLlNpemVCeXRlcyA+IHByZXYpCisJCQllbHNlOgorCQkJCSMgV2UgYXJlIHRlc3RpbmcgcmUtc2l6aW5nIHRvIHNhbWUgc2l6ZSB0b28uLi4KKwkJCQlzZWxmLmFzc2VydFRydWUobHYuTHZDb21tb24uU2l6ZUJ5dGVzIDw9IHByZXYpCisKKwlkZWYgdGVzdF9sdl9yZXNpemVfc2FtZShzZWxmKToKKwkJcHZfcGF0aHMgPSBbXQorCQlmb3IgcHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQlwdl9wYXRocy5hcHBlbmQocHAub2JqZWN0X3BhdGgpCisKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUocHZfcGF0aHMpLlZnCisJCWx2ID0gc2VsZi5fY3JlYXRlX2x2KHZnPXZnKQorCisJCXdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24pOgorCQkJbHYuTHYuUmVzaXplKGx2Lkx2Q29tbW9uLlNpemVCeXRlcywgZGJ1cy5BcnJheShbXSwgJyhvaWkpJyksIC0xLCB7fSkKKworCWRlZiB0ZXN0X2x2X21vdmUoc2VsZik6CisJCWx2ID0gc2VsZi5fY3JlYXRlX2x2KCkKKworCQlwdl9wYXRoX21vdmUgPSBzdHIobHYuTHZDb21tb24uRGV2aWNlc1swXVswXSkKKworCQkjIFRlc3QgbW92aW5nIGEgc3BlY2lmaWMgTFYKKwkJam9iID0gbHYuTHYuTW92ZShwdl9wYXRoX21vdmUsICgwLCAwKSwgZGJ1cy5BcnJheShbXSwgJyhvaWkpJyksIDAsIHt9KQorCQlzZWxmLl93YWl0X2Zvcl9qb2Ioam9iKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQlsdi51cGRhdGUoKQorCQluZXdfcHYgPSBzdHIobHYuTHZDb21tb24uRGV2aWNlc1swXVswXSkKKwkJc2VsZi5hc3NlcnRUcnVlKHB2X3BhdGhfbW92ZSAhPSBuZXdfcHYsICIlcyA9PSAlcyIgJQorCQkJCQkJKHB2X3BhdGhfbW92ZSwgbmV3X3B2KSkKKworCWRlZiB0ZXN0X2x2X2FjdGl2YXRlX2RlYWN0aXZhdGUoc2VsZik6CisJCWx2X3AgPSBzZWxmLl9jcmVhdGVfbHYoKQorCQlsdl9wLnVwZGF0ZSgpCisKKwkJbHZfcC5Mdi5EZWFjdGl2YXRlKDAsIC0xLCB7fSkKKwkJbHZfcC51cGRhdGUoKQorCQlzZWxmLmFzc2VydEZhbHNlKGx2X3AuTHZDb21tb24uQWN0aXZlKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQlsdl9wLkx2LkFjdGl2YXRlKDAsIC0xLCB7fSkKKworCQlsdl9wLnVwZGF0ZSgpCisJCXNlbGYuYXNzZXJ0VHJ1ZShsdl9wLkx2Q29tbW9uLkFjdGl2ZSkKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwkJIyBUcnkgY29udHJvbCBmbGFncworCQlmb3IgaSBpbiByYW5nZSgwLCA1KToKKwkJCWx2X3AuTHYuQWN0aXZhdGUoMSA8PCBpLCAtMSwge30pCisJCQlzZWxmLmFzc2VydFRydWUobHZfcC5MdkNvbW1vbi5BY3RpdmUpCisJCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCWRlZiB0ZXN0X21vdmUoc2VsZik6CisJCWx2ID0gc2VsZi5fY3JlYXRlX2x2KCkKKworCQkjIFRlc3QgbW92aW5nIHdpdGhvdXQgYmVpbmcgTFYgc3BlY2lmaWMKKwkJdmcgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgbHYuTHZDb21tb24uVmcpLlZnCisJCXB2X3RvX21vdmUgPSBzdHIobHYuTHZDb21tb24uRGV2aWNlc1swXVswXSkKKwkJam9iID0gdmcuTW92ZShwdl90b19tb3ZlLCAoMCwgMCksIGRidXMuQXJyYXkoW10sICcob2lpKScpLCAwLCB7fSkKKwkJc2VsZi5fd2FpdF9mb3Jfam9iKGpvYikKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwkJIyBUZXN0IFZnLk1vdmUKKwkJIyBUT0RPIFRlc3QgdGhpcyBtb3JlIQorCQl2Zy51cGRhdGUoKQorCQlsdi51cGRhdGUoKQorCisJCWxvY2F0aW9uID0gbHYuTHZDb21tb24uRGV2aWNlc1swXVswXQorCisJCWRzdCA9IE5vbmUKKwkJZm9yIHAgaW4gdmcuUHZzOgorCQkJaWYgcCAhPSBsb2NhdGlvbjoKKwkJCQlkc3QgPSBwCisKKwkJIyBGZXRjaCB0aGUgZGVzdGluYXRpb24KKwkJcHYgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgZHN0KS5QdgorCisJCSMgVGVzdCByYW5nZSwgbW92ZSBpdCB0byB0aGUgbWlkZGxlIG9mIHRoZSBuZXcgZGVzdGluYXRpb24gYW5kIGJsb2NraW5nCisJCSMgYmxvY2tpbmcgZm9yIGl0IHRvIGNvbXBsZXRlCisJCWpvYiA9IHZnLk1vdmUoCisJCQlsb2NhdGlvbiwgKDAsIDApLCBbKGRzdCwgcHYuUGVDb3VudCAvIDIsIDApLCBdLCAtMSwge30pCisJCXNlbGYuYXNzZXJ0RXF1YWwoam9iLCAnLycpCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJZGVmIHRlc3Rfam9iX2hhbmRsaW5nKHNlbGYpOgorCQlwdl9wYXRocyA9IFtdCisJCWZvciBwcCBpbiBzZWxmLm9ianNbUFZfSU5UXToKKwkJCXB2X3BhdGhzLmFwcGVuZChwcC5vYmplY3RfcGF0aCkKKworCQl2Z19uYW1lID0gcnMoOCwgJ192ZycpCisKKwkJIyBUZXN0IGdldHRpbmcgYSBqb2IgcmlnaHQgYXdheQorCQl2Z19wYXRoLCB2Z19qb2IgPSBzZWxmLm9ianNbTUFOQUdFUl9JTlRdWzBdLk1hbmFnZXIuVmdDcmVhdGUoCisJCQl2Z19uYW1lLCBwdl9wYXRocywKKwkJCTAsIHt9KQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSh2Z19wYXRoID09ICcvJykKKwkJc2VsZi5hc3NlcnRUcnVlKHZnX2pvYiBhbmQgbGVuKHZnX2pvYikgPiAwKQorCisJCXNlbGYuX3dhaXRfZm9yX2pvYih2Z19qb2IpCisKKwlkZWYgX3Rlc3RfZXhwaXJlZF90aW1lcihzZWxmLCBudW1fbHZzKToKKwkJcmMgPSBGYWxzZQorCQlwdl9wYXRocyA9IFtdCisJCWZvciBwcCBpbiBzZWxmLm9ianNbUFZfSU5UXToKKwkJCXB2X3BhdGhzLmFwcGVuZChwcC5vYmplY3RfcGF0aCkKKworCQkjIEluIHNtYWxsIGNvbmZpZ3VyYXRpb25zIGx2bSBpcyBwcmV0dHkgc25hcHB5LCBzbyBsZXRzIGNyZWF0ZSBhIFZHCisJCSMgYWRkIGEgbnVtYmVyIG9mIExWcyBhbmQgdGhlbiByZW1vdmUgdGhlIFZHIGFuZCBhbGwgdGhlIGNvbnRhaW5lZAorCQkjIExWcyB3aGljaCBhcHBlYXJzIHRvIGNvbnNpc3RlbnRseSBydW4gYSBsaXR0bGUgc2xvdy4KKworCQl2Z19wcm94eSA9IHNlbGYuX3ZnX2NyZWF0ZShwdl9wYXRocykKKworCQlmb3IgaSBpbiByYW5nZSgwLCBudW1fbHZzKToKKworCQkJdmdfcHJveHkudXBkYXRlKCkKKwkJCWlmIHZnX3Byb3h5LlZnLkZyZWVDb3VudCA+IDA6CisJCQkJb2JqX3BhdGgsIGpvYiA9IHZnX3Byb3h5LlZnLkx2Q3JlYXRlTGluZWFyKAorCQkJCQlycyg4LCAiX2x2IiksIG1pYig0KSwgRmFsc2UsIC0xLCB7fSkKKwkJCQlzZWxmLmFzc2VydFRydWUoam9iID09ICcvJykKKwkJCWVsc2U6CisJCQkJIyBXZSByYW4gb3V0IG9mIHNwYWNlLCB0ZXN0IHdpbGwgcHJvYmFibHkgZmFpbAorCQkJCWJyZWFrCisKKwkJIyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgaG9ub3JpbmcgdGhlIHRpbWVvdXQKKwkJc3RhcnQgPSB0aW1lLnRpbWUoKQorCisJCXJlbW92ZV9qb2IgPSB2Z19wcm94eS5WZy5SZW1vdmUoMSwge30pCisKKwkJZW5kID0gdGltZS50aW1lKCkKKworCQl0dF9yZW1vdmUgPSBmbG9hdChlbmQpIC0gZmxvYXQoc3RhcnQpCisKKwkJc2VsZi5hc3NlcnRUcnVlKHR0X3JlbW92ZSA8IDIuMCwgInJlbW92ZSB0aW1lICVzIiAlIChzdHIodHRfcmVtb3ZlKSkpCisKKwkJIyBEZXBlbmRpbmcgb24gaG93IGxvbmcgaXQgdG9vayB3ZSBjb3VsZCBmaW5pc2ggZWl0aGVyIHdheQorCQlpZiByZW1vdmVfam9iICE9ICcvJzoKKwkJCSMgV2UgZ290IGEgam9iCisJCQlyZXN1bHQgPSBzZWxmLl93YWl0X2Zvcl9qb2IocmVtb3ZlX2pvYikKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQgPT0gJy8nKQorCQkJcmMgPSBUcnVlCisJCWVsc2U6CisJCQkjIEl0IGNvbXBsZXRlZCBiZWZvcmUgdGltZXIgcG9wcGVkCisJCQlwYXNzCisKKwkJcmV0dXJuIHJjCisKKwlkZWYgdGVzdF9qb2JfaGFuZGxpbmdfdGltZXIoc2VsZik6CisKKwkJeWVzID0gRmFsc2UKKworCQkjIFRoaXMgbWF5IG5vdCBwYXNzCisJCWZvciBpIGluIFs0OCwgNjQsIDEyOF06CisJCQl5ZXMgPSBzZWxmLl90ZXN0X2V4cGlyZWRfdGltZXIoaSkKKwkJCWlmIHllczoKKwkJCQlicmVhaworCQkJcHJpbnQoJ0F0dGVtcHQgKCVkKSBmYWlsZWQsIHRyeWluZyBhZ2Fpbi4uLicgJSAoaSkpCisKKwkJc2VsZi5hc3NlcnRUcnVlKHllcykKKworCWRlZiB0ZXN0X3B2X3RhZ3Moc2VsZik6CisJCXB2cyA9IFtdCisKKwkJcHZfcGF0aHMgPSBbXQorCQlmb3IgcHAgaW4gc2VsZi5vYmpzW1BWX0lOVF06CisJCQlwdl9wYXRocy5hcHBlbmQocHAub2JqZWN0X3BhdGgpCisKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUocHZfcGF0aHMpLlZnCisKKwkJIyBHZXQgdGhlIFBWcworCQlmb3IgcCBpbiB2Zy5QdnM6CisJCQlwdnMuYXBwZW5kKENsaWVudFByb3h5KHNlbGYuYnVzLCBwKS5QdikKKworCQlmb3IgdGFnc192YWx1ZSBpbiBbWydoZWxsbyddLCBbJ2ZvbycsICdiYXInXV06CisJCQlyYyA9IHZnLlB2VGFnc0FkZCh2Zy5QdnMsIHRhZ3NfdmFsdWUsIC0xLCB7fSkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAnLycpCisKKwkJCWZvciBwIGluIHB2czoKKwkJCQlwLnVwZGF0ZSgpCisJCQkJc2VsZi5hc3NlcnRUcnVlKHNvcnRlZCh0YWdzX3ZhbHVlKSA9PSBwLlRhZ3MpCisKKwkJCXZnLlB2VGFnc0RlbCh2Zy5QdnMsIHRhZ3NfdmFsdWUsIC0xLCB7fSkKKwkJCWZvciBwIGluIHB2czoKKwkJCQlwLnVwZGF0ZSgpCisJCQkJc2VsZi5hc3NlcnRUcnVlKFtdID09IHAuVGFncykKKworCWRlZiB0ZXN0X3ZnX3RhZ3Moc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKworCQl0ID0gWydUZXN0aW5nJywgJ3RhZ3MnXQorCisJCXZnLlRhZ3NBZGQodCwgLTEsIHt9KQorCQl2Zy51cGRhdGUoKQorCQlzZWxmLmFzc2VydFRydWUodCA9PSB2Zy5UYWdzKQorCQl2Zy5UYWdzRGVsKHQsIC0xLCB7fSkKKwkJdmcudXBkYXRlKCkKKwkJc2VsZi5hc3NlcnRUcnVlKFtdID09IHZnLlRhZ3MpCisKKwlkZWYgdGVzdF9sdl90YWdzKHNlbGYpOgorCQl2ZyA9IHNlbGYuX3ZnX2NyZWF0ZSgpLlZnCisJCWx2ID0gc2VsZi5fdGVzdF9sdl9jcmVhdGUoCisJCQl2Zy5MdkNyZWF0ZUxpbmVhciwKKwkJCShycyg4LCAnX2x2JyksIG1pYig0KSwgRmFsc2UsIC0xLCB7fSksCisJCQl2ZykKKworCQl0ID0gWydUZXN0aW5nJywgJ3RhZ3MnXQorCisJCWx2Lkx2LlRhZ3NBZGQodCwgLTEsIHt9KQorCQlsdi51cGRhdGUoKQorCQlzZWxmLmFzc2VydFRydWUodCA9PSBsdi5MdkNvbW1vbi5UYWdzKQorCQlsdi5Mdi5UYWdzRGVsKHQsIC0xLCB7fSkKKwkJbHYudXBkYXRlKCkKKwkJc2VsZi5hc3NlcnRUcnVlKFtdID09IGx2Lkx2Q29tbW9uLlRhZ3MpCisKKwlkZWYgdGVzdF92Z19hbGxvY2F0aW9uX3BvbGljeV9zZXQoc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKworCQlmb3IgcCBpbiBbJ2FueXdoZXJlJywgJ2NvbnRpZ3VvdXMnLCAnY2xpbmcnLCAnbm9ybWFsJ106CisJCQlyYyA9IHZnLkFsbG9jYXRpb25Qb2xpY3lTZXQocCwgLTEsIHt9KQorCQkJc2VsZi5hc3NlcnRFcXVhbChyYywgJy8nKQorCQkJdmcudXBkYXRlKCkKKworCQkJcHJvcCA9IGdldGF0dHIodmcsICdBbGxvYycgKyBwLnRpdGxlKCkpCisJCQlzZWxmLmFzc2VydFRydWUocHJvcCkKKworCWRlZiB0ZXN0X3ZnX21heF9wdihzZWxmKToKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUoKS5WZworCisJCSMgQlo6IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTI4MDQ5NgorCQkjIFRPRE86IEFkZCBhIHRlc3QgYmFjayBmb3IgbGFyZ2VyIHZhbHVlcyBoZXJlIHdoZW4gYnVnIGlzIHJlc29sdmVkCisJCWZvciBwIGluIFswLCAxLCAxMCwgMTAwLCAxMDAsIDEwMjQsIDIgKiogMzIgLSAxXToKKwkJCXJjID0gdmcuTWF4UHZTZXQocCwgLTEsIHt9KQorCQkJc2VsZi5hc3NlcnRFcXVhbChyYywgJy8nKQorCQkJdmcudXBkYXRlKCkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh2Zy5NYXhQdiA9PSBwLCAiRXhwZWN0ZWQgJXMgIT0gQWN0dWFsICVzIiAlCisJCQkJCQkJKHN0cihwKSwgc3RyKHZnLk1heFB2KSkpCisKKwlkZWYgdGVzdF92Z19tYXhfbHYoc2VsZik6CisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKCkuVmcKKworCQkjIEJaOiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTEyODA0OTYKKwkJIyBUT0RPOiBBZGQgYSB0ZXN0IGJhY2sgZm9yIGxhcmdlciB2YWx1ZXMgaGVyZSB3aGVuIGJ1ZyBpcyByZXNvbHZlZAorCQlmb3IgcCBpbiBbMCwgMSwgMTAsIDEwMCwgMTAwLCAxMDI0LCAyICoqIDMyIC0gMV06CisJCQlyYyA9IHZnLk1heEx2U2V0KHAsIC0xLCB7fSkKKwkJCXNlbGYuYXNzZXJ0RXF1YWwocmMsICcvJykKKwkJCXZnLnVwZGF0ZSgpCisJCQlzZWxmLmFzc2VydFRydWUodmcuTWF4THYgPT0gcCwgIkV4cGVjdGVkICVzICE9IEFjdHVhbCAlcyIgJQorCQkJCQkJCShzdHIocCksIHN0cih2Zy5NYXhMdikpKQorCisJZGVmIHRlc3RfdmdfdXVpZF9nZW4oc2VsZik6CisJCSMgVE9ETyByZW5hYmxlIHRlc3QgY2FzZSB3aGVuCisJCSMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjY0MTY5IGdldHMgZml4ZWQKKwkJIyBUaGlzIHdhcyB0ZXN0ZWQgd2l0aCBsdm1ldGFkIGRpc2FibGVkIGFuZCB3ZSBwYXNzZWQKKwkJcHJpbnQoIlxuU2tpcHBpbmcgVmcuVXVpZEdlbmVyYXRlIHVudGlsIEJaOiAxMjY0MTY5IHJlc29sdmVkXG4iKQorCisJCWlmIEZhbHNlOgorCQkJdmcgPSBzZWxmLl92Z19jcmVhdGUoKS5WZworCQkJcHJldl91dWlkID0gdmcuVXVpZAorCQkJcmMgPSB2Zy5VdWlkR2VuZXJhdGUoLTEsIHt9KQorCQkJc2VsZi5hc3NlcnRFcXVhbChyYywgJy8nKQorCQkJdmcudXBkYXRlKCkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh2Zy5VdWlkICE9IHByZXZfdXVpZCwgIkV4cGVjdGVkICVzICE9IEFjdHVhbCAlcyIgJQorCQkJCQkJCSh2Zy5VdWlkLCBwcmV2X3V1aWQpKQorCisJZGVmIHRlc3RfdmdfYWN0aXZhdGVfZGVhY3RpdmF0ZShzZWxmKToKKwkJdmcgPSBzZWxmLl92Z19jcmVhdGUoKS5WZworCQlzZWxmLl90ZXN0X2x2X2NyZWF0ZSgKKwkJCXZnLkx2Q3JlYXRlTGluZWFyLAorCQkJKHJzKDgsICdfbHYnKSwgbWliKDQpLCBGYWxzZSwgLTEsIHt9KSwKKwkJCXZnKQorCisJCXZnLnVwZGF0ZSgpCisKKwkJdmcuRGVhY3RpdmF0ZSgwLCAtMSwge30pCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJCXZnLkFjdGl2YXRlKDAsIC0xLCB7fSkKKwkJc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9yZWZyZXNoKCksIDApCisKKwkJIyBUcnkgY29udHJvbCBmbGFncworCQlmb3IgaSBpbiByYW5nZSgwLCA1KToKKwkJCXZnLkFjdGl2YXRlKDEgPDwgaSwgLTEsIHt9KQorCisJZGVmIHRlc3RfcHZfcmVzaXplKHNlbGYpOgorCisJCXNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5vYmpzW1BWX0lOVF0pID4gMCkKKworCQlpZiBsZW4oc2VsZi5vYmpzW1BWX0lOVF0pID4gMDoKKwkJCXB2ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHNlbGYub2Jqc1tQVl9JTlRdWzBdLm9iamVjdF9wYXRoKS5QdgorCisJCQlvcmlnaW5hbF9zaXplID0gcHYuU2l6ZUJ5dGVzCisKKwkJCW5ld19zaXplID0gb3JpZ2luYWxfc2l6ZSAvIDIKKworCQkJcHYuUmVTaXplKG5ld19zaXplLCAtMSwge30pCisJCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKwkJCXB2LnVwZGF0ZSgpCisKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShwdi5TaXplQnl0ZXMgIT0gb3JpZ2luYWxfc2l6ZSkKKwkJCXB2LlJlU2l6ZSgwLCAtMSwge30pCisJCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKwkJCXB2LnVwZGF0ZSgpCisJCQlzZWxmLmFzc2VydFRydWUocHYuU2l6ZUJ5dGVzID09IG9yaWdpbmFsX3NpemUpCisKKwlkZWYgdGVzdF9wdl9hbGxvY2F0aW9uKHNlbGYpOgorCisJCXB2X3BhdGhzID0gW10KKwkJZm9yIHBwIGluIHNlbGYub2Jqc1tQVl9JTlRdOgorCQkJcHZfcGF0aHMuYXBwZW5kKHBwLm9iamVjdF9wYXRoKQorCisJCXZnID0gc2VsZi5fdmdfY3JlYXRlKHB2X3BhdGhzKS5WZworCisJCXB2ID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHZnLlB2c1swXSkuUHYKKworCQlwdi5BbGxvY2F0aW9uRW5hYmxlZChGYWxzZSwgLTEsIHt9KQorCQlwdi51cGRhdGUoKQorCQlzZWxmLmFzc2VydEZhbHNlKHB2LkFsbG9jYXRhYmxlKQorCisJCXB2LkFsbG9jYXRpb25FbmFibGVkKFRydWUsIC0xLCB7fSkKKwkJcHYudXBkYXRlKCkKKwkJc2VsZi5hc3NlcnRUcnVlKHB2LkFsbG9jYXRhYmxlKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJZGVmIF9nZXRfZGV2aWNlcyhzZWxmKToKKwkJY29udGV4dCA9IHB5dWRldi5Db250ZXh0KCkKKwkJcmV0dXJuIGNvbnRleHQubGlzdF9kZXZpY2VzKHN1YnN5c3RlbT0nYmxvY2snLCBNQUpPUj0nOCcpCisKKwlkZWYgdGVzdF9wdl9zY2FuKHNlbGYpOgorCQlkZXZpY2VzID0gc2VsZi5fZ2V0X2RldmljZXMoKQorCisJCW1nciA9IHNlbGYuX21hbmFnZXIoKS5NYW5hZ2VyCisKKwkJc2VsZi5hc3NlcnRFcXVhbCgKKwkJCW1nci5QdlNjYW4oCisJCQkJRmFsc2UsIFRydWUsIGRidXMuQXJyYXkoW10sICdzJyksCisJCQkJZGJ1cy5BcnJheShbXSwgJyhpaSknKSwgLTEsIHt9KSwgJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKwkJc2VsZi5hc3NlcnRFcXVhbCgKKwkJCW1nci5QdlNjYW4oCisJCQkJRmFsc2UsIEZhbHNlLAorCQkJCWRidXMuQXJyYXkoW10sICdzJyksCisJCQkJZGJ1cy5BcnJheShbXSwgJyhpaSknKSwgLTEsIHt9KSwgJy8nKQorCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCQlibG9ja19wYXRoID0gW10KKwkJZm9yIGQgaW4gZGV2aWNlczoKKwkJCWJsb2NrX3BhdGguYXBwZW5kKGRbJ0RFVk5BTUUnXSkKKworCQlzZWxmLmFzc2VydEVxdWFsKG1nci5QdlNjYW4oRmFsc2UsIFRydWUsCisJCQkJCQkJCQlibG9ja19wYXRoLAorCQkJCQkJCQkJZGJ1cy5BcnJheShbXSwgJyhpaSknKSwgLTEsIHt9KSwgJy8nKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJCW1tID0gW10KKwkJZm9yIGQgaW4gZGV2aWNlczoKKwkJCW1tLmFwcGVuZCgoaW50KGRbJ01BSk9SJ10pLCBpbnQoZFsnTUlOT1InXSkpKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwobWdyLlB2U2NhbihGYWxzZSwgVHJ1ZSwKKwkJCQkJCQkJCWJsb2NrX3BhdGgsCisJCQkJCQkJCQltbSwgLTEsIHt9KSwgJy8nKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcmVmcmVzaCgpLCAwKQorCisJCXNlbGYuYXNzZXJ0RXF1YWwoCisJCQltZ3IuUHZTY2FuKAorCQkJCUZhbHNlLCBUcnVlLAorCQkJCWRidXMuQXJyYXkoW10sICdzJyksCisJCQkJbW0sIC0xLCB7fSksICcvJykKKworCQlzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3JlZnJlc2goKSwgMCkKKworCUBzdGF0aWNtZXRob2QKKwlkZWYgX3dyaXRlX3NvbWVfZGF0YShkZXZpY2VfcGF0aCwgc2l6ZSk6CisJCWJsb2NrcyA9IGludChzaXplIC8gNTEyKQorCQlibG9jayA9IGJ5dGVhcnJheSg1MTIpCisJCWZvciBpIGluIHJhbmdlKDAsIDUxMik6CisJCQlibG9ja1tpXSA9IGkgJSAyNTUKKworCQl3aXRoIG9wZW4oZGV2aWNlX3BhdGgsIG1vZGU9J3diJykgYXMgbHY6CisJCQlmb3IgaSBpbiByYW5nZSgwLCBibG9ja3MpOgorCQkJCWx2LndyaXRlKGJsb2NrKQorCisJZGVmIHRlc3Rfc25hcHNob3RfbWVyZ2Uoc2VsZik6CisJCSMgQ3JlYXRlIGEgbm9uLXRoaW4gTFYgYW5kIG1lcmdlIGl0CisJCXNzX3NpemUgPSBtaWIoOCkKKworCQlsdl9wID0gc2VsZi5fY3JlYXRlX2x2KHNpemU9bWliKDE2KSkKKwkJc3NfbmFtZSA9IGx2X3AuTHZDb21tb24uTmFtZSArICdfc25hcCcKKwkJc25hcHNob3RfcGF0aCA9IGx2X3AuTHYuU25hcHNob3Qoc3NfbmFtZSwgc3Nfc2l6ZSwgLTEsIHt9KVswXQorCQlzcyA9IENsaWVudFByb3h5KHNlbGYuYnVzLCBzbmFwc2hvdF9wYXRoKQorCisJCSMgV3JpdGUgc29tZSBkYXRhIHRvIHNuYXBzaG90IHNvIG1lcmdlIHRha2VzIHNvbWUgdGltZQorCQlUZXN0RGJ1c1NlcnZpY2UuX3dyaXRlX3NvbWVfZGF0YShzcy5MdkNvbW1vbi5QYXRoLCBzc19zaXplIC8gMikKKworCQlqb2JfcGF0aCA9IHNzLlNuYXBzaG90Lk1lcmdlKDAsIHt9KQorCisJCXNlbGYuYXNzZXJ0VHJ1ZShqb2JfcGF0aCAhPSAnLycpCisJCXNlbGYuX3dhaXRfZm9yX2pvYihqb2JfcGF0aCkKKworCWRlZiB0ZXN0X3NuYXBzaG90X21lcmdlX3RoaW4oc2VsZik6CisJCSMgQ3JlYXRlIGEgdGhpbiBMViwgc25hcHNob3QgaXQgYW5kIG1lcmdlIGl0CisJCXRwID0gc2VsZi5fY3JlYXRlX2x2KFRydWUpCisKKwkJdGhpbl9wYXRoID0gdHAuVGhpblBvb2wuTHZDcmVhdGUoCisJCQlycygxMCwgJ190aGluX2x2JyksIG1pYigxMCksIC0xLCB7fSlbMF0KKworCQlsdl9wID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHRoaW5fcGF0aCkKKworCQlzc19uYW1lID0gbHZfcC5MdkNvbW1vbi5OYW1lICsgJ19zbmFwJworCQlzbmFwc2hvdF9wYXRoID0gbHZfcC5Mdi5TbmFwc2hvdChzc19uYW1lLCAwLCAtMSwge30pWzBdCisJCXNzID0gQ2xpZW50UHJveHkoc2VsZi5idXMsIHNuYXBzaG90X3BhdGgpCisJCWpvYl9wYXRoID0gc3MuU25hcHNob3QuTWVyZ2UoMCwge30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShqb2JfcGF0aCAhPSAnLycpCisJCXNlbGYuX3dhaXRfZm9yX2pvYihqb2JfcGF0aCkKKworCWRlZiBfY3JlYXRlX2NhY2hlX3Bvb2woc2VsZiwgdmc9Tm9uZSk6CisKKwkJaWYgbm90IHZnOgorCQkJdmcgPSBzZWxmLl92Z19jcmVhdGUoKS5WZworCisJCW1kID0gc2VsZi5fY3JlYXRlX2x2KHNpemU9KG1pYig4KSksIHZnPXZnKQorCQlkYXRhID0gc2VsZi5fY3JlYXRlX2x2KHNpemU9KG1pYig4KSksIHZnPXZnKQorCisJCWNhY2hlX3Bvb2xfcGF0aCA9IHZnLkNyZWF0ZUNhY2hlUG9vbCgKKwkJCW1kLm9iamVjdF9wYXRoLCBkYXRhLm9iamVjdF9wYXRoLCAtMSwge30pWzBdCisKKwkJY3AgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgY2FjaGVfcG9vbF9wYXRoKQorCisJCXJldHVybiB2ZywgY3AKKworCWRlZiB0ZXN0X2NhY2hlX3Bvb2xfY3JlYXRlKHNlbGYpOgorCisJCXZnLCBjYWNoZV9wb29sID0gc2VsZi5fY3JlYXRlX2NhY2hlX3Bvb2woKQorCisJCXNlbGYuYXNzZXJ0VHJ1ZSgnL2NvbS9yZWRoYXQvbHZtZGJ1czEvQ2FjaGVQb29sJyBpbgorCQkJCQkJY2FjaGVfcG9vbC5vYmplY3RfcGF0aCkKKworCWRlZiB0ZXN0X2NhY2hlX2x2X2NyZWF0ZShzZWxmKToKKworCQlmb3IgZGVzdHJveV9jYWNoZSBpbiBbVHJ1ZSwgRmFsc2VdOgorCQkJdmcsIGNhY2hlX3Bvb2wgPSBzZWxmLl9jcmVhdGVfY2FjaGVfcG9vbCgpCisKKwkJCWx2X3RvX2NhY2hlID0gc2VsZi5fY3JlYXRlX2x2KHNpemU9bWliKDgpLCB2Zz12ZykKKworCQkJY19sdl9wYXRoID0gY2FjaGVfcG9vbC5DYWNoZVBvb2wuQ2FjaGVMdigKKwkJCQlsdl90b19jYWNoZS5vYmplY3RfcGF0aCwgLTEsIHt9KVswXQorCisJCQljYWNoZWRfbHYgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgY19sdl9wYXRoKQorCisJCQl1bmNhY2hlZF9sdl9wYXRoID0gXAorCQkJCWNhY2hlZF9sdi5DYWNoZWRMdi5EZXRhY2hDYWNoZVBvb2woZGVzdHJveV9jYWNoZSwgLTEsIHt9KVswXQorCisJCQlzZWxmLmFzc2VydFRydWUoJy9jb20vcmVkaGF0L2x2bWRidXMxL0x2JyBpbgorCQkJCQkJCXVuY2FjaGVkX2x2X3BhdGgpCisKKwkJCXZnLlJlbW92ZSgtMSwge30pCisKKwlkZWYgdGVzdF92Z19jaGFuZ2Uoc2VsZik6CisJCXZnX3Byb3h5ID0gc2VsZi5fdmdfY3JlYXRlKCkKKwkJcmVzdWx0ID0gdmdfcHJveHkuVmcuQ2hhbmdlKC0xLCB7Jy1hJzogJ2F5J30pCisJCXNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQgPT0gJy8nKQorCQlyZXN1bHQgPSB2Z19wcm94eS5WZy5DaGFuZ2UoLTEsIHsnLWEnOiAnbid9KQorCQlzZWxmLmFzc2VydFRydWUocmVzdWx0ID09ICcvJykKKworCWRlZiBfaW52YWxpZF92Z19sdl9uYW1lX2NoYXJhY3RlcnMoc2VsZik6CisJCWJhZF92Z19sdl9zZXQgPSBzZXQoc3RyaW5nLnByaW50YWJsZSkgLSBcCisJCQlzZXQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgJy4tXysnKQorCQlyZXR1cm4gJycuam9pbihiYWRfdmdfbHZfc2V0KQorCisJZGVmIHRlc3RfaW52YWxpZF9uYW1lcyhzZWxmKToKKwkJbWdyID0gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyCisKKwkJIyBQdiBkZXZpY2UgcGF0aAorCQl3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKToKKwkJCW1nci5QdkNyZWF0ZSgiL2Rldi9zcGFjZSBpbiBuYW1lIiwgLTEsIHt9KQorCisJCSMgVkcgTmFtZSB0ZXN0aW5nLi4uCisJCSMgR28gdGhyb3VnaCBhbGwgYmFkIGNoYXJhY3RlcnMKKwkJcHZfcGF0aHMgPSBbc2VsZi5vYmpzW1BWX0lOVF1bMF0ub2JqZWN0X3BhdGhdCisJCWJhZF9jaGFycyA9IHNlbGYuX2ludmFsaWRfdmdfbHZfbmFtZV9jaGFyYWN0ZXJzKCkKKwkJZm9yIGMgaW4gYmFkX2NoYXJzOgorCQkJd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbik6CisJCQkJbWdyLlZnQ3JlYXRlKCJuYW1lJXMiICUgKGMpLCBwdl9wYXRocywgLTEsIHt9KQorCisJCSMgQmFkIG5hbWVzCisJCWZvciBiYWQgaW4gWyIuIiwgIi4uIl06CisJCQl3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKToKKwkJCQltZ3IuVmdDcmVhdGUoYmFkLCBwdl9wYXRocywgLTEsIHt9KQorCisJCSMgRXhjZWVkIG5hbWUgbGVuZ3RoCisJCWZvciBpIGluIFsxMjgsIDEwMjQsIDQwOTZdOgorCQkJd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbik6CisJCQkJbWdyLlZnQ3JlYXRlKCdUJyAqIGksIHB2X3BhdGhzLCAtMSwge30pCisKKwkJIyBDcmVhdGUgYSBWRyBhbmQgdHJ5IHRvIGNyZWF0ZSBMVnMgd2l0aCBkaWZmZXJlbnQgYmFkIG5hbWVzCisJCXZnX3BhdGggPSBtZ3IuVmdDcmVhdGUoInRlc3QiLCBwdl9wYXRocywgLTEsIHt9KVswXQorCQl2Z19wcm94eSA9IENsaWVudFByb3h5KHNlbGYuYnVzLCB2Z19wYXRoKQorCisJCWZvciBjIGluIGJhZF9jaGFyczoKKwkJCXdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24pOgorCQkJCXZnX3Byb3h5LlZnLkx2Q3JlYXRlTGluZWFyKHJzKDgsICdfbHYnKSArIGMsCisJCQkJCW1pYig0KSwgRmFsc2UsIC0xLCB7fSkKKworCQlmb3IgciBpbiAoIl9jZGF0YSIsICJfY21ldGEiLCAiX2NvcmlnIiwgIl9taW1hZ2UiLCAiX21sb2ciLAorCQkJIl9wbXNwYXJlIiwgIl9yaW1hZ2UiLCAiX3JtZXRhIiwgIl90ZGF0YSIsICJfdG1ldGEiLCAiX3ZvcmlnaW4iKToKKwkJCXdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24pOgorCQkJCXZnX3Byb3h5LlZnLkx2Q3JlYXRlTGluZWFyKHJzKDgsICdfbHYnKSArIHIsCisJCQkJCW1pYig0KSwgRmFsc2UsIC0xLCB7fSkKKworCQlmb3IgciBpbiAoInNuYXBzaG90IiwgInB2bW92ZSIpOgorCQkJd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhkYnVzLmV4Y2VwdGlvbnMuREJ1c0V4Y2VwdGlvbik6CisJCQkJdmdfcHJveHkuVmcuTHZDcmVhdGVMaW5lYXIociArIHJzKDgsICdfbHYnKSwKKwkJCQkJbWliKDQpLCBGYWxzZSwgLTEsIHt9KQorCisJX0FMTE9XQUJMRV9UQUdfQ0ggPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiLl8tKy89ITomIyIKKworCWRlZiBfaW52YWxpZF90YWdfY2hhcmFjdGVycyhzZWxmKToKKwkJYmFkX3RhZ19jaF9zZXQgPSBzZXQoc3RyaW5nLnByaW50YWJsZSkgLSBzZXQoc2VsZi5fQUxMT1dBQkxFX1RBR19DSCkKKwkJcmV0dXJuICcnLmpvaW4oYmFkX3RhZ19jaF9zZXQpCisKKwlkZWYgdGVzdF9pbnZhbGlkX3RhZ3Moc2VsZik6CisJCW1nciA9IHNlbGYub2Jqc1tNQU5BR0VSX0lOVF1bMF0uTWFuYWdlcgorCQlwdl9wYXRocyA9IFtzZWxmLm9ianNbUFZfSU5UXVswXS5vYmplY3RfcGF0aF0KKworCQl2Z19wYXRoID0gbWdyLlZnQ3JlYXRlKCJ0ZXN0IiwgcHZfcGF0aHMsIC0xLCB7fSlbMF0KKwkJdmdfcHJveHkgPSBDbGllbnRQcm94eShzZWxmLmJ1cywgdmdfcGF0aCkKKworCQlmb3IgYyBpbiBzZWxmLl9pbnZhbGlkX3RhZ19jaGFyYWN0ZXJzKCk6CisJCQl3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGRidXMuZXhjZXB0aW9ucy5EQnVzRXhjZXB0aW9uKToKKwkJCQl2Z19wcm94eS5WZy5UYWdzQWRkKFtjXSwgLTEsIHt9KQorCisJCWZvciBjIGluIHNlbGYuX2ludmFsaWRfdGFnX2NoYXJhY3RlcnMoKToKKwkJCXdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24pOgorCQkJCXZnX3Byb3h5LlZnLlRhZ3NBZGQoWyJhJXNiIiAlIChjKV0sIC0xLCB7fSkKKworCWRlZiB0ZXN0X3RhZ19uYW1lcyhzZWxmKToKKwkJbWdyID0gc2VsZi5vYmpzW01BTkFHRVJfSU5UXVswXS5NYW5hZ2VyCisJCXB2X3BhdGhzID0gW3NlbGYub2Jqc1tQVl9JTlRdWzBdLm9iamVjdF9wYXRoXQorCisJCXZnX3BhdGggPSBtZ3IuVmdDcmVhdGUoInRlc3QiLCBwdl9wYXRocywgLTEsIHt9KVswXQorCQl2Z19wcm94eSA9IENsaWVudFByb3h5KHNlbGYuYnVzLCB2Z19wYXRoKQorCisJCWZvciBpIGluIHJhbmdlKDEsIDY0KToKKwkJCXRhZyA9IHJzKGksICIiLCBzZWxmLl9BTExPV0FCTEVfVEFHX0NIKQorCQkJciA9IHZnX3Byb3h5LlZnLlRhZ3NBZGQoW3RhZ10sIC0xLCB7fSkKKwkJCXNlbGYuYXNzZXJ0VHJ1ZShyID09ICcvJykKKwkJCXZnX3Byb3h5LnVwZGF0ZSgpCisKKwkJCXNlbGYuYXNzZXJ0VHJ1ZSh0YWcgaW4gdmdfcHJveHkuVmcuVGFncywgIiVzIG5vdCBpbiAlcyIgJQorCQkJCSh0YWcsIHN0cih2Z19wcm94eS5WZy5UYWdzKSkpCisKKwkJCXNlbGYuYXNzZXJ0RXF1YWwoaSwgbGVuKHZnX3Byb3h5LlZnLlRhZ3MpLCAiJWQgIT0gJWQiICUKKwkJCQkoaSwgbGVuKHZnX3Byb3h5LlZnLlRhZ3MpKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCSMgVGVzdCBmb3JraW5nICYgZXhlYyBuZXcgZWFjaCB0aW1lCisJdGVzdF9zaGVsbCA9IG9zLmdldGVudignTFZNX0RCVVNfVEVTVF9TSEVMTCcsIDApCisKKwlzZXRfZXhlY3V0aW9uKEZhbHNlKQorCisJaWYgdGVzdF9zaGVsbCA9PSAwOgorCQl1bml0dGVzdC5tYWluKGV4aXQ9VHJ1ZSkKKwllbHNlOgorCQl1bml0dGVzdC5tYWluKGV4aXQ9RmFsc2UpCisJCSMgVGVzdCBsdm0gc2hlbGwKKwkJcHJpbnQoJ1xuICoqKiBUZXN0aW5nIGx2bSBzaGVsbCAqKiogXG4nKQorCQlzZXRfZXhlY3V0aW9uKFRydWUpCisJCXVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdC9kYnVzL3Rlc3RsaWIucHkgYi90ZXN0L2RidXMvdGVzdGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTBiMGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYnVzL3Rlc3RsaWIucHkKQEAgLTAsMCArMSwxNzQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoraW1wb3J0IHN0cmluZworaW1wb3J0IHJhbmRvbQoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFdAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBkYnVzCisKK0JVU05BTUUgPSAiY29tLnJlZGhhdC5sdm1kYnVzMSIKK01BTkFHRVJfSU5UID0gQlVTTkFNRSArICcuTWFuYWdlcicKK01BTkFHRVJfT0JKID0gJy8nICsgQlVTTkFNRS5yZXBsYWNlKCcuJywgJy8nKSArICcvTWFuYWdlcicKK1BWX0lOVCA9IEJVU05BTUUgKyAiLlB2IgorVkdfSU5UID0gQlVTTkFNRSArICIuVmciCitMVl9JTlQgPSBCVVNOQU1FICsgIi5MdiIKK1RISU5QT09MX0lOVCA9IEJVU05BTUUgKyAiLlRoaW5Qb29sIgorU05BUFNIT1RfSU5UID0gQlVTTkFNRSArICIuU25hcHNob3QiCitMVl9DT01NT05fSU5UID0gQlVTTkFNRSArICIuTHZDb21tb24iCitKT0JfSU5UID0gQlVTTkFNRSArICIuSm9iIgorQ0FDSEVfUE9PTF9JTlQgPSBCVVNOQU1FICsgIi5DYWNoZVBvb2wiCitDQUNIRV9MVl9JTlQgPSBCVVNOQU1FICsgIi5DYWNoZWRMdiIKKworVEhJTlBPT0xfTFZfUEFUSCA9ICcvJyArIFRISU5QT09MX0lOVC5yZXBsYWNlKCcuJywgJy8nKQorCisKK2RlZiBycyhsZW5ndGgsIHN1ZmZpeCwgY2hhcmFjdGVyX3NldD1zdHJpbmcuYXNjaWlfbG93ZXJjYXNlKToKKwlyZXR1cm4gJycuam9pbihyYW5kb20uY2hvaWNlKGNoYXJhY3Rlcl9zZXQpCisJCQkJZm9yIF8gaW4gcmFuZ2UobGVuZ3RoKSkgKyBzdWZmaXgKKworCitkZWYgbWliKHMpOgorCXJldHVybiAxMDI0ICogMTAyNCAqIHMKKworCitjbGFzcyBEYnVzSW50cm9zcGVjdGlvbihvYmplY3QpOgorCUBzdGF0aWNtZXRob2QKKwlkZWYgaW50cm9zcGVjdCh4bWxfcmVwcmVzZW50YXRpb24pOgorCQlpbnRlcmZhY2VzID0ge30KKworCQlyb290ID0gRXQuZnJvbXN0cmluZyh4bWxfcmVwcmVzZW50YXRpb24pCisKKwkJZm9yIGMgaW4gcm9vdDoKKwkJCWlmIGMudGFnID09ICJpbnRlcmZhY2UiOgorCQkJCWluX2YgPSBjLmF0dHJpYlsnbmFtZSddCisJCQkJaW50ZXJmYWNlc1tpbl9mXSA9IFwKKwkJCQkJZGljdChtZXRob2RzPU9yZGVyZWREaWN0KCksIHByb3BlcnRpZXM9e30pCisJCQkJZm9yIG5lc3RlZCBpbiBjOgorCQkJCQlpZiBuZXN0ZWQudGFnID09ICJtZXRob2QiOgorCQkJCQkJbW4gPSBuZXN0ZWQuYXR0cmliWyduYW1lJ10KKwkJCQkJCWludGVyZmFjZXNbaW5fZl1bJ21ldGhvZHMnXVttbl0gPSBPcmRlcmVkRGljdCgpCisKKwkJCQkJCWZvciBhcmcgaW4gbmVzdGVkOgorCQkJCQkJCWlmIGFyZy50YWcgPT0gJ2FyZyc6CisJCQkJCQkJCWFyZ19kaXIgPSBhcmcuYXR0cmliWydkaXJlY3Rpb24nXQorCQkJCQkJCQlpZiBhcmdfZGlyID09ICdpbic6CisJCQkJCQkJCQluID0gYXJnLmF0dHJpYlsnbmFtZSddCisJCQkJCQkJCWVsc2U6CisJCQkJCQkJCQluID0gTm9uZQorCisJCQkJCQkJCWFyZ190eXBlID0gYXJnLmF0dHJpYlsndHlwZSddCisKKwkJCQkJCQkJaWYgbjoKKwkJCQkJCQkJCXYgPSBkaWN0KAorCQkJCQkJCQkJCQluYW1lPW1uLAorCQkJCQkJCQkJCQlhX2Rpcj1hcmdfZGlyLAorCQkJCQkJCQkJCQlhX3R5cGU9YXJnX3R5cGUpCisJCQkJCQkJCQlpbnRlcmZhY2VzW2luX2ZdWydtZXRob2RzJ11bbW5dW25dID0gdgorCisJCQkJCWVsaWYgbmVzdGVkLnRhZyA9PSAncHJvcGVydHknOgorCQkJCQkJcG4gPSBuZXN0ZWQuYXR0cmliWyduYW1lJ10KKwkJCQkJCXBfYWNjZXNzID0gbmVzdGVkLmF0dHJpYlsnYWNjZXNzJ10KKwkJCQkJCXBfdHlwZSA9IG5lc3RlZC5hdHRyaWJbJ3R5cGUnXQorCisJCQkJCQlpbnRlcmZhY2VzW2luX2ZdWydwcm9wZXJ0aWVzJ11bcG5dID0gXAorCQkJCQkJCWRpY3QocF9hY2Nlc3M9cF9hY2Nlc3MsIHBfdHlwZT1wX3R5cGUpCisJCQkJCWVsc2U6CisJCQkJCQlwYXNzCisKKwkJIyBwcmludCgnSW50ZXJmYWNlcy4uLicpCisJCSMgZm9yIGssIHYgaW4gbGlzdChpbnRlcmZhY2VzLml0ZW1zKCkpOgorCQkjICAgICBwcmludCgnSW50ZXJmYWNlICVzJyAlIGspCisJCSMgICAgIGlmIHZbJ21ldGhvZHMnXToKKwkJIyAgICAgICAgIGZvciBtLCBhcmdzIGluIGxpc3QodlsnbWV0aG9kcyddLml0ZW1zKCkpOgorCQkjICAgICAgICAgICAgIHByaW50KCcgICAgbWV0aG9kOiAlcycgJSBtKQorCQkjICAgICAgICAgICAgIGZvciBhLCBhYSBpbiBhcmdzLml0ZW1zKCk6CisJCSMgICAgICAgICAgICAgICAgIHByaW50KCcgICAgICAgICBtZXRob2QgYXJnOiAlcycgJSAoYSkpCisJCSMgICAgIGlmIHZbJ3Byb3BlcnRpZXMnXToKKwkJIyAgICAgICAgIGZvciBwLCBkIGluIGxpc3QodlsncHJvcGVydGllcyddLml0ZW1zKCkpOgorCQkjICAgICAgICAgICAgIHByaW50KCcgICAgUHJvcGVydHk6ICVzJyAlIChwKSkKKwkJIyBwcmludCgnRW5kIGludGVyZmFjZXMnKQorCisJCXJldHVybiBpbnRlcmZhY2VzCisKKworY2xhc3MgUmVtb3RlT2JqZWN0KG9iamVjdCk6CisJZGVmIF9zZXRfcHJvcHMoc2VsZiwgcHJvcHM9Tm9uZSk6CisJCSMgcHJpbnQgJ0ZldGNoaW5nIHByb3BlcnRpZXMnCisJCWlmIG5vdCBwcm9wczoKKwkJCSMgcHJvcF9mZXRjaCA9IGRidXMuSW50ZXJmYWNlKHNlbGYuYnVzLmdldF9vYmplY3QoCisJCQkjICAgIEJVU05BTUUsIHNlbGYub2JqZWN0X3BhdGgpLCAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcycpCisKKwkJCWZvciBpIGluIHJhbmdlKDAsIDMpOgorCQkJCXRyeToKKwkJCQkJcHJvcF9mZXRjaCA9IGRidXMuSW50ZXJmYWNlKHNlbGYuYnVzLmdldF9vYmplY3QoCisJCQkJCQlCVVNOQU1FLCBzZWxmLm9iamVjdF9wYXRoKSwKKwkJCQkJCSdvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzJykKKwkJCQkJcHJvcHMgPSBwcm9wX2ZldGNoLkdldEFsbChzZWxmLmludGVyZmFjZSkKKwkJCQkJYnJlYWsKKwkJCQlleGNlcHQgZGJ1cy5leGNlcHRpb25zLkRCdXNFeGNlcHRpb24gYXMgZGJlOgorCQkJCQlpZiAiR2V0QWxsIiBub3QgaW4gc3RyKGRiZSk6CisJCQkJCQlyYWlzZSBkYmUKKwkJaWYgcHJvcHM6CisJCQlmb3Iga2wsIHZsIGluIGxpc3QocHJvcHMuaXRlbXMoKSk6CisJCQkJc2V0YXR0cihzZWxmLCBrbCwgdmwpCisKKwlkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVkX2J1cywgb2JqZWN0X3BhdGgsIGludGVyZmFjZSwgcHJvcGVydGllcz1Ob25lKToKKwkJc2VsZi5vYmplY3RfcGF0aCA9IG9iamVjdF9wYXRoCisJCXNlbGYuaW50ZXJmYWNlID0gaW50ZXJmYWNlCisJCXNlbGYuYnVzID0gc3BlY2lmaWVkX2J1cworCisJCXNlbGYuZGJ1c19tZXRob2QgPSBkYnVzLkludGVyZmFjZShzcGVjaWZpZWRfYnVzLmdldF9vYmplY3QoCisJCQlCVVNOQU1FLCBzZWxmLm9iamVjdF9wYXRoKSwgc2VsZi5pbnRlcmZhY2UpCisKKwkJc2VsZi5fc2V0X3Byb3BzKHByb3BlcnRpZXMpCisKKwlkZWYgX19nZXRhdHRyX18oc2VsZiwgaXRlbSk6CisJCWlmIGhhc2F0dHIoc2VsZi5kYnVzX21ldGhvZCwgaXRlbSk6CisJCQlyZXR1cm4gZnVuY3Rvb2xzLnBhcnRpYWwoc2VsZi5fd3JhcHBlciwgaXRlbSkKKwkJZWxzZToKKwkJCXJldHVybiBmdW5jdG9vbHMucGFydGlhbChzZWxmLCBpdGVtKQorCisJZGVmIF93cmFwcGVyKHNlbGYsIF9tZXRob2RfbmFtZSwgKmFyZ3MsICoqa3dhcmdzKToKKwkJcmV0dXJuIGdldGF0dHIoc2VsZi5kYnVzX21ldGhvZCwgX21ldGhvZF9uYW1lKSgqYXJncywgKiprd2FyZ3MpCisKKwlkZWYgdXBkYXRlKHNlbGYpOgorCQlzZWxmLl9zZXRfcHJvcHMoKQorCisKK2NsYXNzIENsaWVudFByb3h5KG9iamVjdCk6CisJQHN0YXRpY21ldGhvZAorCWRlZiBfaW50Zl9zaG9ydF9uYW1lKG5tKToKKwkJcmV0dXJuIG5tLnNwbGl0KCcuJylbLTE6XVswXQorCisJZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllZF9idXMsIG9iamVjdF9wYXRoLCBpbnRlcmZhY2U9Tm9uZSwgcHJvcHM9Tm9uZSk6CisJCWkgPSBkYnVzLkludGVyZmFjZShzcGVjaWZpZWRfYnVzLmdldF9vYmplY3QoCisJCQlCVVNOQU1FLCBvYmplY3RfcGF0aCksICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZScpCisJCXNlbGYuaW50cm9fc3BlY3QgPSBEYnVzSW50cm9zcGVjdGlvbi5pbnRyb3NwZWN0KGkuSW50cm9zcGVjdCgpKQorCisJCWZvciBrIGluIHNlbGYuaW50cm9fc3BlY3Qua2V5cygpOgorCQkJc24gPSBDbGllbnRQcm94eS5faW50Zl9zaG9ydF9uYW1lKGspCisJCQkjIHByaW50KCdDbGllbnQgcHJveHkgaGFzIGludGVyZmFjZTogJXMgJXMnICUgKGssIHNuKSkKKworCQkJaWYgaW50ZXJmYWNlIGFuZCBpbnRlcmZhY2UgPT0gayBhbmQgcHJvcHMgaXMgbm90IE5vbmU6CisJCQkJcm8gPSBSZW1vdGVPYmplY3Qoc3BlY2lmaWVkX2J1cywgb2JqZWN0X3BhdGgsIGssIHByb3BzKQorCQkJZWxzZToKKwkJCQlybyA9IFJlbW90ZU9iamVjdChzcGVjaWZpZWRfYnVzLCBvYmplY3RfcGF0aCwgaykKKworCQkJc2V0YXR0cihzZWxmLCBzbiwgcm8pCisKKwkJc2VsZi5vYmplY3RfcGF0aCA9IG9iamVjdF9wYXRoCisKKwlkZWYgdXBkYXRlKHNlbGYpOgorCQkjIEdvIHRocm91Z2ggYWxsIGludGVyZmFjZXMgYW5kIHVwZGF0ZSB0aGVtCisJCWZvciBpbnRfZiBpbiBzZWxmLmludHJvX3NwZWN0LmtleXMoKToKKwkJCXNuID0gQ2xpZW50UHJveHkuX2ludGZfc2hvcnRfbmFtZShpbnRfZikKKwkJCWdldGF0dHIoc2VsZiwgc24pLnVwZGF0ZSgpCmRpZmYgLS1naXQgYS90ZXN0L2RidXMvdmFsaWRhdGVzdGF0ZS5weSBiL3Rlc3QvZGJ1cy92YWxpZGF0ZXN0YXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhYTIwODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RidXMvdmFsaWRhdGVzdGF0ZS5weQpAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgU2ltcGx5IGNvbm5lY3RzIHRvIHRoZSBkYnVzIHNlcnZpY2UgYW5kIGNhbGxzIFJlZnJlc2ggYW5kIGVuc3VyZXMgdGhhdCB0aGUKKyMgdmFsdWUgcmV0dXJuZWQgaXMgemVybworCitpbXBvcnQgdGVzdGxpYgoraW1wb3J0IGRidXMKK2Zyb20gZGJ1cy5tYWlubG9vcC5nbGliIGltcG9ydCBEQnVzR01haW5Mb29wCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCisJdXNlX3Nlc3Npb24gPSBvcy5nZXRlbnYoJ0xWTURCVVNEX1VTRV9TRVNTSU9OJywgRmFsc2UpCisKKwlpZiB1c2Vfc2Vzc2lvbjoKKwkJYnVzID0gZGJ1cy5TZXNzaW9uQnVzKG1haW5sb29wPURCdXNHTWFpbkxvb3AoKSkKKwllbHNlOgorCQlidXMgPSBkYnVzLlN5c3RlbUJ1cyhtYWlubG9vcD1EQnVzR01haW5Mb29wKCkpCisKKwltZ3JfcHJveHkgPSB0ZXN0bGliLkNsaWVudFByb3h5KGJ1cywgdGVzdGxpYi5NQU5BR0VSX09CSikKKwlzeXMuZXhpdChtZ3JfcHJveHkuTWFuYWdlci5SZWZyZXNoKCkpCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9hdXguc2ggYi90ZXN0L2xpYi9hdXguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmMmFiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2F1eC5zaApAQCAtMCwwICsxLDE0OTEgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisuIGxpYi91dGlscworCitydW5fdmFsZ3JpbmQoKSB7CisJIyBFeGVjdXRlIHNjcmlwdCB3aGljaCBtYXkgdXNlICRURVNUTkFNRSBmb3IgY3JlYXRpbmcgaW5kaXZpZHVhbAorCSMgbG9nIGZpbGVzIGZvciBlYWNoIGV4ZWN1dGUgY29tbWFuZAorCWV4ZWMgIiR7VkFMR1JJTkQ6LXZhbGdyaW5kfSIgIiRAIgorfQorCitleHBlY3RfZmFpbHVyZSgpIHsKKyAgICAgICAgZWNobyAiVEVTVCBFWFBFQ1QgRkFJTFVSRSIKK30KKworQ09ST1NZTkNfQ09ORj0iL2V0Yy9jb3Jvc3luYy9jb3Jvc3luYy5jb25mIgorQ09ST1NZTkNfTk9ERT0iJChob3N0bmFtZSkiCitjcmVhdGVfY29yb3N5bmNfY29uZigpIHsKKwlpZiB0ZXN0IC1hICRDT1JPU1lOQ19DT05GOyB0aGVuCisJCWlmICEgZ3JlcCAiY3JlYXRlZCBieSBsdm0gdGVzdCBzdWl0ZSIgJENPUk9TWU5DX0NPTkY7IHRoZW4KKwkJCXJtICRDT1JPU1lOQ19DT05GCisJCWVsc2UKKwkJCW12ICRDT1JPU1lOQ19DT05GICRDT1JPU1lOQ19DT05GLnByZWx2bXRlc3QKKwkJZmkKKwlmaQorCisJc2VkIC1lICJzL0BMT0NBTF9OT0RFQC8kQ09ST1NZTkNfTk9ERS8iIGxpYi90ZXN0LWNvcm9zeW5jLWNvbmYgPiAkQ09ST1NZTkNfQ09ORgorCWVjaG8gImNyZWF0ZWQgbmV3ICRDT1JPU1lOQ19DT05GIgorfQorCitETE1fQ09ORj0iL2V0Yy9kbG0vZGxtLmNvbmYiCitjcmVhdGVfZGxtX2NvbmYoKSB7CisJaWYgdGVzdCAtYSAkRExNX0NPTkY7IHRoZW4KKwkJaWYgISBncmVwICJjcmVhdGVkIGJ5IGx2bSB0ZXN0IHN1aXRlIiAkRExNX0NPTkY7IHRoZW4KKwkJCXJtICRETE1fQ09ORgorCQllbHNlCisJCQltdiAkRExNX0NPTkYgJERMTV9DT05GLnByZWx2bXRlc3QKKwkJZmkKKwlmaQorCisJY3AgbGliL3Rlc3QtZGxtLWNvbmYgJERMTV9DT05GCisJZWNobyAiY3JlYXRlZCBuZXcgJERMTV9DT05GIgorfQorCitwcmVwYXJlX2RsbSgpIHsKKwlpZiBwZ3JlcCBkbG1fY29udHJvbGQgOyB0aGVuCisJCWVjaG8gIkNhbm5vdCBydW4gd2hpbGUgZXhpc3RpbmcgZGxtX2NvbnRyb2xkIHByb2Nlc3MgZXhpc3RzIgorCQlleGl0IDEKKwlmaQorCisJaWYgcGdyZXAgY29yb3N5bmM7IHRoZW4KKwkJZWNobyAiQ2Fubm90IHJ1biB3aGlsZSBleGlzdGluZyBjb3Jvc3luYyBwcm9jZXNzIGV4aXN0cyIKKwkJZXhpdCAxCisJZmkKKworCWNyZWF0ZV9jb3Jvc3luY19jb25mCisJY3JlYXRlX2RsbV9jb25mCisKKwlzeXN0ZW1jdGwgc3RhcnQgY29yb3N5bmMKKwlzbGVlcCAxCisJaWYgISBwZ3JlcCBjb3Jvc3luYzsgdGhlbgorCQllY2hvICJGYWlsZWQgdG8gc3RhcnQgY29yb3N5bmMiCisJCWV4aXQgMQorCWZpCisKKwlzeXN0ZW1jdGwgc3RhcnQgZGxtCisJc2xlZXAgMQorCWlmICEgcGdyZXAgZGxtX2NvbnRyb2xkOyB0aGVuCisJCWVjaG8gIkZhaWxlZCB0byBzdGFydCBkbG0iCisJCWV4aXQgMQorCWZpCit9CisKK1NBTkxPQ0tfQ09ORj0iL2V0Yy9zYW5sb2NrL3NhbmxvY2suY29uZiIKK2NyZWF0ZV9zYW5sb2NrX2NvbmYoKSB7CisJaWYgdGVzdCAtYSAkU0FOTE9DS19DT05GOyB0aGVuCisJCWlmICEgZ3JlcCAiY3JlYXRlZCBieSBsdm0gdGVzdCBzdWl0ZSIgJFNBTkxPQ0tfQ09ORjsgdGhlbgorCQkJcm0gJFNBTkxPQ0tfQ09ORgorCQllbHNlCisJCQltdiAkU0FOTE9DS19DT05GICRTQU5MT0NLX0NPTkYucHJlbHZtdGVzdAorCQlmaQorCWZpCisKKwljcCBsaWIvdGVzdC1zYW5sb2NrLWNvbmYgJFNBTkxPQ0tfQ09ORgorCWVjaG8gImNyZWF0ZWQgbmV3ICRTQU5MT0NLX0NPTkYiCit9CisKK3ByZXBhcmVfc2FubG9jaygpIHsKKwlpZiBwZ3JlcCBzYW5sb2NrIDsgdGhlbgorCQllY2hvICJDYW5ub3QgcnVuIHdoaWxlIGV4aXN0aW5nIHNhbmxvY2sgcHJvY2VzcyBleGlzdHMiCisJCWV4aXQgMQorCWZpCisKKwljcmVhdGVfc2FubG9ja19jb25mCisKKwlzeXN0ZW1jdGwgc3RhcnQgc2FubG9jaworCWlmICEgcGdyZXAgc2FubG9jazsgdGhlbgorCQllY2hvICJGYWlsZWQgdG8gc3RhcnQgc2FubG9jayIKKwkJZXhpdCAxCisJZmkKK30KKworcHJlcGFyZV9sdm1sb2NrZCgpIHsKKwlpZiBwZ3JlcCBsdm1sb2NrZCA7IHRoZW4KKwkJZWNobyAiQ2Fubm90IHJ1biB3aGlsZSBleGlzdGluZyBsdm1sb2NrZCBwcm9jZXNzIGV4aXN0cyIKKwkJZXhpdCAxCisJZmkKKworCWlmIHRlc3QgLW4gIiRMVk1fVEVTVF9MT0NLX1RZUEVfU0FOTE9DSyI7IHRoZW4KKwkJIyBtYWtlIGNoZWNrX2x2bWxvY2tkX3NhbmxvY2sKKwkJZWNobyAic3RhcnRpbmcgbHZtbG9ja2QgZm9yIHNhbmxvY2siCisJCWx2bWxvY2tkIC1vIDIKKworCWVsaWYgdGVzdCAtbiAiJExWTV9URVNUX0xPQ0tfVFlQRV9ETE0iOyB0aGVuCisJCSMgbWFrZSBjaGVja19sdm1sb2NrZF9kbG0KKwkJZWNobyAic3RhcnRpbmcgbHZtbG9ja2QgZm9yIGRsbSIKKwkJbHZtbG9ja2QKKworCWVsaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTUxPQ0tEX1RFU1RfRExNIjsgdGhlbgorCQkjIG1ha2UgY2hlY2tfbHZtbG9ja2RfdGVzdAorCQllY2hvICJzdGFydGluZyBsdm1sb2NrZCAtLXRlc3QgKGRsbSkiCisJCWx2bWxvY2tkIC0tdGVzdCAtZyBkbG0KKworCWVsaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTUxPQ0tEX1RFU1RfU0FOTE9DSyI7IHRoZW4KKwkJIyBGSVhNRTogYWRkIG9wdGlvbiBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiAtLXRlc3QgYW5kIHNhbmxvY2sKKwkJZWNobyAic3RhcnRpbmcgbHZtbG9ja2QgLS10ZXN0IChzYW5sb2NrKSIKKwkJbHZtbG9ja2QgLS10ZXN0IC1nIHNhbmxvY2sgLW8gMgorCWVsc2UKKwkJZWNobyAibm90IHN0YXJ0aW5nIGx2bWxvY2tkIgorCQlleGl0IDAKKwlmaQorCisJc2xlZXAgMQorCWlmICEgcGdyZXAgbHZtbG9ja2Q7IHRoZW4KKwkJZWNobyAiRmFpbGVkIHRvIHN0YXJ0IGx2bWxvY2tkIgorCQlleGl0IDEKKwlmaQorfQorCitwcmVwYXJlX2Nsdm1kKCkgeworCXJtIC1mIGRlYnVnLmxvZyBzdHJhY2UubG9nCisJdGVzdCAiJHtMVk1fVEVTVF9MT0NLSU5HOi0wfSIgLW5lIDMgJiYgcmV0dXJuICMgbm90IG5lZWRlZAorCisJaWYgcGdyZXAgY2x2bWQgOyB0aGVuCisJCWVjaG8gIkNhbm5vdCB1c2UgZmFrZSBjbHVzdGVyIGxvY2tpbmcgd2l0aCByZWFsIGNsdm1kICgkKHBncmVwIGNsdm1kKSkgcnVubmluZy4iCisJCXNraXAKKwlmaQorCisJIyBza2lwIGlmIHdlIGRvbid0IGhhdmUgb3VyIG93biBjbHZtZC4uLgorCWlmIHRlc3QgLXogIiR7aW5zdGFsbGVkX3Rlc3RzdWl0ZSt2YXJzZXR9IjsgdGhlbgorCQkod2hpY2ggY2x2bWQgMj4vZGV2L251bGwgfCBncmVwIC1xICIkYWJzX2J1aWxkZGlyIikgfHwgc2tpcAorCWZpCisKKwl0ZXN0IC1lICIkRE1fREVWX0RJUi9jb250cm9sIiB8fCBkbXNldHVwIHRhYmxlID4vZGV2L251bGwgIyBjcmVhdGUgY29udHJvbCBub2RlCisJIyBza2lwIGlmIHNpbmdsZW5vZGUgaXMgbm90IGNvbXBpbGVkIGluCisJKGNsdm1kIC0taGVscCAyPiYxIHwgZ3JlcCAiQXZhaWxhYmxlIGNsdXN0ZXIgbWFuYWdlcnMiIHwgZ3JlcCAtcSAic2luZ2xlbm9kZSIpIHx8IHNraXAKKworIwlsdm1jb25mICJhY3RpdmF0aW9uL21vbml0b3JpbmcgPSAxIgorCWxvY2FsIHJ1bl92YWxncmluZD0KKwl0ZXN0ICIke0xWTV9WQUxHUklORF9DTFZNRDotMH0iIC1lcSAwIHx8IHJ1bl92YWxncmluZD0icnVuX3ZhbGdyaW5kIgorCXJtIC1mICIkQ0xWTURfUElERklMRSIKKwllY2hvICI8PT09PT09PT0gU3RhcnRpbmcgQ0xWTUQgPT09PT09PT0+IgorCSMgbHZzIGlzIGV4ZWN1dGVkIGZyb20gY2x2bWQgLSB1c2Ugb3VyIHZlcnNpb24KKwlMVk1fTE9HX0ZJTEVfRVBPQ0g9Q0xWTUQgTFZNX0xPR19GSUxFX01BWF9MSU5FUz0xMDAwMDAwIExWTV9CSU5BUlk9JCh3aGljaCBsdm0pICRydW5fdmFsZ3JpbmQgY2x2bWQgLUlzaW5nbGVub2RlIC1kIDEgLWYgJgorCWVjaG8gJCEgPiBMT0NBTF9DTFZNRAorCisJZm9yIGkgaW4gezEuLjEwMH0gOyBkbworCQl0ZXN0ICRpIC1lcSAxMDAgJiYgZGllICJTdGFydHVwIG9mIGNsdm1kIGlzIHRvbyBzbG93LiIKKwkJdGVzdCAtZSAiJENMVk1EX1BJREZJTEUiIC1hIC1lICIke0NMVk1EX1BJREZJTEUlLyp9L2x2bS9jbHZtZC5zb2NrIiAmJiBicmVhaworCQlzbGVlcCAuMgorCWRvbmUKK30KKworcHJlcGFyZV9kbWV2ZW50ZCgpIHsKKwlybSAtZiBkZWJ1Zy5sb2cgc3RyYWNlLmxvZworCWlmIHBncmVwIGRtZXZlbnRkIDsgdGhlbgorCQllY2hvICJDYW5ub3QgdGVzdCBkbWV2ZW50ZCB3aXRoIHJlYWwgZG1ldmVudGQgKCQocGdyZXAgZG1ldmVudGQpKSBydW5uaW5nLiIKKwkJc2tpcAorCWZpCisKKwkjIHNraXAgaWYgd2UgZG9uJ3QgaGF2ZSBvdXIgb3duIGRtZXZlbnRkLi4uCisJaWYgdGVzdCAteiAiJHtpbnN0YWxsZWRfdGVzdHN1aXRlK3ZhcnNldH0iOyB0aGVuCisJCSh3aGljaCBkbWV2ZW50ZCAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIiRhYnNfYnVpbGRkaXIiKSB8fCBza2lwCisJZmkKKwlsdm1jb25mICJhY3RpdmF0aW9uL21vbml0b3JpbmcgPSAxIgorCisJbG9jYWwgcnVuX3ZhbGdyaW5kPQorCXRlc3QgIiR7TFZNX1ZBTEdSSU5EX0RNRVZFTlREOi0wfSIgLWVxIDAgfHwgcnVuX3ZhbGdyaW5kPSJydW5fdmFsZ3JpbmQiCisjCUxWTV9MT0dfRklMRV9FUE9DSD1ETUVWRU5URCAkcnVuX3ZhbGdyaW5kIGRtZXZlbnRkIC1mZGRkZGwgIiRAIiAyPiYxICYKKwlMVk1fTE9HX0ZJTEVfRVBPQ0g9RE1FVkVOVEQgJHJ1bl92YWxncmluZCBkbWV2ZW50ZCAtZmRkZGRsICIkQCIgPmRlYnVnLmxvZ19ETUVWRU5URF9vdXQgMj4mMSAmCisJZWNobyAkISA+IExPQ0FMX0RNRVZFTlRECisKKwkjIEZJWE1FIHdhaXQgZm9yIHBpcGUgaW4gL3Zhci9ydW4gaW5zdGVhZAorCWZvciBpIGluIHsxLi4xMDB9IDsgZG8KKwkJdGVzdCAkaSAtZXEgMTAwICYmIGRpZSAiU3RhcnR1cCBvZiBkbWV2ZW50ZCBpcyB0b28gc2xvdy4iCisJCXRlc3QgLWUgIiR7RE1FVkVOVERfUElERklMRX0iICYmIGJyZWFrCisJCXNsZWVwIC4yCisJZG9uZQorCWVjaG8gb2sKK30KKworcHJlcGFyZV9sdm1ldGFkKCkgeworCXJtIC1mIGRlYnVnLmxvZyBzdHJhY2UubG9nCisJIyBza2lwIGlmIHdlIGRvbid0IGhhdmUgb3VyIG93biBsdm1ldGFkLi4uCisJaWYgdGVzdCAteiAiJHtpbnN0YWxsZWRfdGVzdHN1aXRlK3ZhcnNldH0iOyB0aGVuCisJCSh3aGljaCBsdm1ldGFkIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiJGFic19idWlsZGRpciIpIHx8IHNraXAKKwlmaQorCisJbG9jYWwgcnVuX3ZhbGdyaW5kPQorCXRlc3QgIiR7TFZNX1ZBTEdSSU5EX0xWTUVUQUQ6LTB9IiAtZXEgMCB8fCBydW5fdmFsZ3JpbmQ9InJ1bl92YWxncmluZCIKKworCWtpbGxfc2xlZXBfa2lsbF8gTE9DQUxfTFZNRVRBRCAke0xWTV9WQUxHUklORF9MVk1FVEFEOi0wfQorCisJIyBBdm9pZCByZWNvbmZpZ3VyaW5nLCBpZiBhbHJlYWR5IHNldCB0byB1c2VfbHZtZXRhZAorCShncmVwIHVzZV9sdm1ldGFkIENPTkZJR19WQUxVRVMgMj4vZGV2L251bGwgfCB0YWlsIC1uIDEgfCBncmVwIC1xIDEpIHx8IFwKKwkJYXV4IGx2bWNvbmYgImdsb2JhbC91c2VfbHZtZXRhZCA9IDEiICJkZXZpY2VzL21kX2NvbXBvbmVudF9kZXRlY3Rpb24gPSAwIgorCSMgRGVmYXVsdCBkZWJ1ZyBpcyAiLWwgYWxsIiBhbmQgY291bGQgYmUgb3ZlcnJpZGUKKwkjIGJ5IHNldHRpbmcgTFZNX1RFU1RfTFZNRVRBRF9ERUJVR19PUFRTIGJlZm9yZSBjYWxsaW5nIGluaXR0ZXN0LgorCWVjaG8gInByZXBhcmluZyBsdm1ldGFkLi4uIgorCSRydW5fdmFsZ3JpbmQgbHZtZXRhZCAtZiAiJEAiIC1zICIkVEVTVERJUi9sdm1ldGFkLnNvY2tldCIgXAorCQkke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy0tbCBhbGx9ICIkQCIgJgorCWVjaG8gJCEgPiBMT0NBTF9MVk1FVEFECisJd2hpbGUgISB0ZXN0IC1lICIkVEVTVERJUi9sdm1ldGFkLnNvY2tldCI7IGRvIGVjaG8gLW4gLjsgc2xlZXAgLjE7IGRvbmUgIyB3YWl0IGZvciB0aGUgc29ja2V0CisJZWNobyBvaworfQorCitsdm1ldGFkX3RhbGsoKSB7CisJbG9jYWwgdXNlPW5jCisJaWYgdHlwZSAtcCBzb2NhdCA+JiAvZGV2L251bGw7IHRoZW4KKwkJdXNlPXNvY2F0CisJZWxpZiBlY2hvIHwgbm90IG5jIC1VICIkVEVTVERJUi9sdm1ldGFkLnNvY2tldCIgOyB0aGVuCisJCWVjaG8gIldBUk5JTkc6IE5laXRoZXIgc29jYXQgbm9yIG5jIC1VIHNlZW1zIHRvIGJlIGF2YWlsYWJsZS4iIDE+JjIKKwkJZWNobyAiIyBmYWlsZWQgdG8gY29udGFjdCBsdm1ldGFkIgorCQlyZXR1cm4gMQorCWZpCisKKwlpZiB0ZXN0ICIkdXNlIiA9IG5jIDsgdGhlbgorCQluYyAtVSAiJFRFU1RESVIvbHZtZXRhZC5zb2NrZXQiCisJZWxzZQorCQlzb2NhdCAidW5peC1jb25uZWN0OiRURVNURElSL2x2bWV0YWQuc29ja2V0IiAtCisJZmkgfCB0ZWUgLWEgbHZtZXRhZC10YWxrLnR4dAorfQorCitsdm1ldGFkX2R1bXAoKSB7CisJKGVjaG8gJ3JlcXVlc3Q9ImR1bXAiJzsgZWNobyAnIyMnKSB8IGx2bWV0YWRfdGFsayAiJEAiCit9CisKK25vdGlmeV9sdm1ldGFkKCkgeworCWlmIHRlc3QgLWUgTE9DQUxfTFZNRVRBRDsgdGhlbgorCQkjIElnbm9yZSByZXN1bHRzIGhlcmUuLi4KKwkJTFZNX0xPR19GSUxFX0VQT0NIPSBwdnNjYW4gLS1jYWNoZSAiJEAiIHx8IHRydWUKKwkJcm0gLWYgZGVidWcubG9nCisJZmkKK30KKworcHJlcGFyZV9sdm1wb2xsZCgpIHsKKwlybSAtZiBkZWJ1Zy5sb2cKKwkjIHNraXAgaWYgd2UgZG9uJ3QgaGF2ZSBvdXIgb3duIGx2bXBvbGxkLi4uCisJKHdoaWNoIGx2bXBvbGxkIDI+L2Rldi9udWxsIHwgZ3JlcCAiJGFic19idWlsZGRpciIpIHx8IHNraXAKKworCWx2bWNvbmYgImdsb2JhbC91c2VfbHZtcG9sbGQgPSAxIgorCisJbG9jYWwgcnVuX3ZhbGdyaW5kPQorCXRlc3QgIiR7TFZNX1ZBTEdSSU5EX0xWTVBPTExEOi0wfSIgLWVxIDAgfHwgcnVuX3ZhbGdyaW5kPSJydW5fdmFsZ3JpbmQiCisKKwlraWxsX3NsZWVwX2tpbGxfIExPQ0FMX0xWTVBPTExEICR7TFZNX1ZBTEdSSU5EX0xWTVBPTExEOi0wfQorCisJZWNobyAicHJlcGFyaW5nIGx2bXBvbGxkLi4uIgorCSRydW5fdmFsZ3JpbmQgbHZtcG9sbGQgLWYgIiRAIiAtcyAiJFRFU1RESVIvbHZtcG9sbGQuc29ja2V0IiAtQiAiJFRFU1RESVIvbGliL2x2bSIgLWwgYWxsICYKKwllY2hvICQhID4gTE9DQUxfTFZNUE9MTEQKKwl3aGlsZSAhIHRlc3QgLWUgIiRURVNURElSL2x2bXBvbGxkLnNvY2tldCI7IGRvIGVjaG8gLW4gLjsgc2xlZXAgLjE7IGRvbmUgIyB3YWl0IGZvciB0aGUgc29ja2V0CisJZWNobyBvaworfQorCitsdm1wb2xsZF90YWxrKCkgeworCWxvY2FsIHVzZT1uYworCWlmIHR5cGUgLXAgc29jYXQgPiYgL2Rldi9udWxsOyB0aGVuCisJCXVzZT1zb2NhdAorCWVsaWYgZWNobyB8IG5vdCBuYyAtVSAiJFRFU1RESVIvbHZtcG9sbGQuc29ja2V0IiA7IHRoZW4KKwkJZWNobyAiV0FSTklORzogTmVpdGhlciBzb2NhdCBub3IgbmMgLVUgc2VlbXMgdG8gYmUgYXZhaWxhYmxlLiIgMT4mMgorCQllY2hvICIjIGZhaWxlZCB0byBjb250YWN0IGx2bXBvbGxkIgorCQlyZXR1cm4gMQorCWZpCisKKwlpZiB0ZXN0ICIkdXNlIiA9IG5jIDsgdGhlbgorCQluYyAtVSAiJFRFU1RESVIvbHZtcG9sbGQuc29ja2V0IgorCWVsc2UKKwkJc29jYXQgInVuaXgtY29ubmVjdDokVEVTVERJUi9sdm1wb2xsZC5zb2NrZXQiIC0KKwlmaSB8IHRlZSAtYSBsdm1wb2xsZC10YWxrLnR4dAorfQorCitsdm1wb2xsZF9kdW1wKCkgeworCShlY2hvICdyZXF1ZXN0PSJkdW1wIic7IGVjaG8gJyMjJykgfCBsdm1wb2xsZF90YWxrICIkQCIKK30KKworcHJlcGFyZV9sdm1kYnVzZCgpIHsKKwlsb2NhbCBkYWVtb249CisJcm0gLWYgZGVidWcubG9nX0xWTURCVVNEX291dAorCisJa2lsbF9zbGVlcF9raWxsXyBMT0NBTF9MVk1EQlVTRCAwCisKKyAgICAgICAgIyBGSVhNRTogVGhpcyBpcyBub3QgY29ycmVjdCEgRGFlbW9uIGlzIGF1dG8gc3RhcnRlZC4KKwllY2hvICJjaGVja2luZyBsdm1kYnVzZCBpcyBOT1QgcnVubmluZy4uLiIKKwlpZiBwcyAtZWxmIHwgZ3JlcCBsdm1kYnVzZCB8IGdyZXAgcHl0aG9uMzsgdGhlbgorCQllY2hvICJDYW5ub3QgcnVuIHdoaWxlIGV4aXN0aW5nIGx2bWRidXNkIHByb2Nlc3MgZXhpc3RzIgorCQlyZXR1cm4gMQorCWZpCisJZWNobyBvaworCisJIyBza2lwIGlmIHdlIGRvbid0IGhhdmUgb3VyIG93biBsdm1kYnVzZC4uLgorCWlmIHRlc3QgLXogIiR7aW5zdGFsbGVkX3Rlc3RzdWl0ZSt2YXJzZXR9IjsgdGhlbgorCQkjIE5PVEU6IHRoaXMgaXMgYWx3YXlzIHByZXNlbnQgLSBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgbmVlZGVkOgorCQlkYWVtb249IiRhYnNfdG9wX2J1aWxkZGlyL2RhZW1vbnMvbHZtZGJ1c2QvbHZtZGJ1c2QiCisJCSMgU2V0dXAgdGhlIHB5dGhvbiBwYXRoIHNvIHdlIGNhbiBydW4KKwkJZXhwb3J0IFBZVEhPTlBBVEg9JGFic190b3BfYnVpbGRkaXIvZGFlbW9ucworCWVsc2UKKwkJZGFlbW9uPSIkKHdoaWNoIGx2bWRidXNkIHx8IDopIgorCWZpCisJW1sgLW4gJGRhZW1vbiAmJiAteCAkZGFlbW9uIF1dIHx8IHNraXAgIlRoZSBkYWVtb24gaXMgbWlzc2luZyIKKworCXdoaWNoIHB5dGhvbjMgPi9kZXYvbnVsbCB8fCBza2lwICJNaXNzaW5nIHB5dGhvbjMiCisJcHl0aG9uMyAtYyAiaW1wb3J0IHB5dWRldiwgZGJ1cywgZ2kucmVwb3NpdG9yeSIgfHwgc2tpcCAiTWlzc2luZyBweXRob24gbW9kdWxlcyIKKworICAgICAgICAjIFRPRE86IFRlc3RzIHNob3VsZCB1c2Ugc2Vzc2lvbiBidXMgaW5zdGVhZCBvZiBzeXN0ZW0gYnVzCisJIyBDb3B5IHRoZSBuZWVkZWQgZmlsZSB0byBydW4gb24gdGhlIHN5c3RlbSBidXMgaWYgaXQgZG9lc24ndAorCSMgYWxyZWFkeSBleGlzdAorCWlmIFsgISAtZiAvZXRjL2RidXMtMS9zeXN0ZW0uZC9jb20ucmVkaGF0Lmx2bWRidXMxLmNvbmYgXTsgdGhlbgorCQlpbnN0YWxsIC1tIDY0NCAkYWJzX3RvcF9idWlsZGRpci9zY3JpcHRzL2NvbS5yZWRoYXQubHZtZGJ1czEuY29uZiAvZXRjL2RidXMtMS9zeXN0ZW0uZC8KKwlmaQorCisJZWNobyAicHJlcGFyaW5nIGx2bWRidXNkLi4uIgorCSIkZGFlbW9uIiAtLWRlYnVnIC0tdWRldiA+IGRlYnVnLmxvZ19MVk1EQlVTRF9vdXQgMj4mMSAmCisJbG9jYWwgcGlkPSQhCisKKwlzbGVlcCAxCisJZWNobyAiY2hlY2tpbmcgbHZtZGJ1c2QgSVMgcnVubmluZy4uLiIKKwlpZiAhIHBzIC1lbGYgfCBncmVwIGx2bWRidXNkIHwgZ3JlcCBweXRob24zOyB0aGVuCisJCWVjaG8gIkZhaWxlZCB0byBzdGFydCBsdm1kYnVzZCBkYWVtb24iCisJCXJldHVybiAxCisJZmkKKwkjIFRPRE86IElzIHRoZXJlIGEgYmV0dGVyIGNoZWNrIHRoYW4gd2FpdCAxIHNlY29uZCBhbmQgY2hlY2sgcGlkPworCWlmICEgcHMgLXAgJHBpZCAtbyBjb21tPSA+L2Rldi9udWxsIHx8IFtbICQocHMgLXAgJHBpZCAtbyBjb21tPSkgIT0gcHl0aG9uMyBdXTsgdGhlbgorCQllY2hvICJGYWlsZWQgdG8gc3RhcnQgbHZtZGJ1c2QgZGFlbW9uIgorCQlyZXR1cm4gMQorCWZpCisJZWNobyAkcGlkID4gTE9DQUxfTFZNREJVU0QKKwllY2hvIG9rCit9CisKKyMKKyMgVGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGNyZWF0ZSBzb21lIG9jY3VwaWVkIHRoaW4gbWV0YWRhdGEKKyMgVGhpcyBoZWF2aWx5IGRlcGVuZHMgb24gdGhpbiBtZXRhZGF0YSBvdXRwdXQgZm9ybWF0IHRvIHN0YXkgYXMgaXMuCisjIEN1cnJlbnRseSBpdCBleHBlY3RzIDJNQiB0aGluIG1ldGFkYXRhIGFuZCAyMDBNQiBkYXRhIHZvbHVtZSBzaXplCisjIEFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBkZXZpY2VzIHNob3VsZCBiZSBjcmVhdGVkLgorIworcHJlcGFyZV90aGluX21ldGFkYXRhKCkgeworCWxvY2FsIGRldmljZXM9JDEKKwlsb2NhbCB0cmFuc2FjdGlvbl9pZD0kezI6LTB9CisJbG9jYWwgZGF0YV9ibG9ja19zaXplPSR7MzotMTI4fQorCWxvY2FsIG5yX2RhdGFfYmxvY2tzPSR7NDotMzIwMH0KKwlsb2NhbCBpCisKKwllY2hvICc8c3VwZXJibG9jayB1dWlkPSIiIHRpbWU9IjEiIHRyYW5zYWN0aW9uPSInJHRyYW5zYWN0aW9uX2lkJyIgZGF0YV9ibG9ja19zaXplPSInJGRhdGFfYmxvY2tfc2l6ZSciIG5yX2RhdGFfYmxvY2tzPSInJG5yX2RhdGFfYmxvY2tzJyI+JworCWZvciBpIGluICQoc2VxIDEgJGRldmljZXMpCisJZG8KKwkJZWNobyAnIDxkZXZpY2UgZGV2X2lkPSInJGknIiBtYXBwZWRfYmxvY2tzPSIzNyIgdHJhbnNhY3Rpb249IickaSciIGNyZWF0aW9uX3RpbWU9IjAiIHNuYXBfdGltZT0iMSI+JworCQllY2hvICcgIDxyYW5nZV9tYXBwaW5nIG9yaWdpbl9iZWdpbj0iMCIgZGF0YV9iZWdpbj0iMCIgbGVuZ3RoPSIzNyIgdGltZT0iMCIvPicKKwkJZWNobyAnIDwvZGV2aWNlPicKKwlkb25lCisJZWNobyAiPC9zdXBlcmJsb2NrPiIKK30KKwordGVhcmRvd25fZGV2c19wcmVmaXhlZCgpIHsKKwlsb2NhbCBwcmVmaXg9JDEKKwlsb2NhbCBzdHJheT0kezI6LTB9CisJbG9jYWwgSUZTPSRJRlNfTkwKKwlsb2NhbCBkbQorCisJcm0gLXJmICIkVEVTVERJUi9kZXYvJHByZWZpeCIqCisKKwkjIFJlc3VtZSBzdXNwZW5kZWQgZGV2aWNlcyBmaXJzdAorCWZvciBkbSBpbiAkKGRtX2luZm8gc3VzcGVuZGVkLG5hbWUgfCBncmVwICJeU3VzcGVuZGVkOi4qJHByZWZpeCIpOyBkbworCQllY2hvICJkbXNldHVwIHJlc3VtZSBcIiR7ZG0jU3VzcGVuZGVkOn1cIiIKKwkJZG1zZXR1cCBjbGVhciAiJHtkbSNTdXNwZW5kZWQ6fSIKKwkJZG1zZXR1cCByZXN1bWUgIiR7ZG0jU3VzcGVuZGVkOn0iICYKKwlkb25lCisKKwl3YWl0CisKKwlsb2NhbCBtb3VudHM9KCAkKGdyZXAgIiRwcmVmaXgiIC9wcm9jL21vdW50cyB8IGN1dCAtZCcgJyAtZjEpICkKKwlpZiB0ZXN0ICR7I21vdW50c1tAXX0gLWd0IDA7IHRoZW4KKwkJdGVzdCAiJHN0cmF5IiAtZXEgMCB8fCBlY2hvICJSZW1vdmluZyBzdHJheSBtb3VudGVkIGRldmljZXMgY29udGFpbmluZyAkcHJlZml4OiAke21vdW50c1tAXX0iCisJCWlmIHVtb3VudCAtZmwgIiR7bW91bnRzW0BdfSI7IHRoZW4KKwkJCXVkZXZfd2FpdAorCQlmaQorCWZpCisKKwkjIFJlbW92ZSBkZXZpY2VzLCBzdGFydCB3aXRoIGNsb3NlZCAoc29ydGVkIGJ5IG9wZW4gY291bnQpCisJbG9jYWwgcmVtZmFpbD1ubworCWxvY2FsIG5lZWRfdWRldl93YWl0PTAKKwlpbml0X3VkZXZfdHJhbnNhY3Rpb24KKwlmb3IgZG0gaW4gJChkbV9pbmZvIG5hbWUgLS1zb3J0IG9wZW4gfCBncmVwICIkcHJlZml4Iik7IGRvCisJCWRtc2V0dXAgcmVtb3ZlICIkZG0iICY+L2Rldi9udWxsIHx8IHJlbWZhaWw9eWVzCisJCW5lZWRfdWRldl93YWl0PTEKKwlkb25lCisJZmluaXNoX3VkZXZfdHJhbnNhY3Rpb24KKwl0ZXN0ICRuZWVkX3VkZXZfd2FpdCAtZXEgMCB8fCB1ZGV2X3dhaXQKKworCWlmIHRlc3QgJHJlbWZhaWwgPSB5ZXM7IHRoZW4KKwkJbG9jYWwgbnVtX2RldnMKKwkJbG9jYWwgbnVtX3JlbWFpbmluZ19kZXZzPTk5OQorCQl3aGlsZSBudW1fZGV2cz0kKGRtX3RhYmxlIHwgZ3JlcCAiJHByZWZpeCIgfCB3YyAtbCkgJiYgXAorCQkgICAgdGVzdCAkbnVtX2RldnMgLWx0ICRudW1fcmVtYWluaW5nX2RldnMgLWEgJG51bV9kZXZzIC1uZSAwOyBkbworCQkJdGVzdCAiJHN0cmF5IiAtZXEgMCB8fCBlY2hvICJSZW1vdmluZyAkbnVtX2RldnMgc3RyYXkgbWFwcGVkIGRldmljZXMgd2l0aCBuYW1lcyBiZWdpbm5pbmcgd2l0aCAkcHJlZml4OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAjIEhBQ0s6IHNvcnQgYWxzbyBieSBtaW5vcnMgLSBzbyB3ZSB0cnkgdG8gY2xvc2UgJ3Bvc3NpYmx5IGxhdGVyJyBjcmVhdGVkIGRldmljZSBmaXJzdAorCQkJZm9yIGRtIGluICQoZG1faW5mbyBuYW1lIC0tc29ydCBvcGVuLC1taW5vciB8IGdyZXAgIiRwcmVmaXgiKSA7IGRvCisJCQkJZG1zZXR1cCByZW1vdmUgLWYgIiRkbSIgfHwgdHJ1ZQorCQkJZG9uZQorCQkJbnVtX3JlbWFpbmluZ19kZXZzPSRudW1fZGV2cworCQlkb25lCisJZmkKKworCXVkZXZfd2FpdAorfQorCit0ZWFyZG93bl9kZXZzKCkgeworCSMgRGVsZXRlIGFueSByZW1haW5pbmcgZG0vdWRldiBzZW1hcGhvcmVzCisJdGVhcmRvd25fdWRldl9jb29raWVzCisKKwl0ZXN0ICEgLWYgTURfREVWIHx8IGNsZWFudXBfbWRfZGV2CisJdGVzdCAhIC1mIERFVklDRVMgfHwgdGVhcmRvd25fZGV2c19wcmVmaXhlZCAiJFBSRUZJWCIKKworCSMgTk9URTogU0NTSV9ERUJVR19ERVYgdGVzdCBtdXN0IGNvbWUgYmVmb3JlIHRoZSBMT09QIHRlc3QgYmVjYXVzZQorCSMgcHJlcGFyZV9zY3NpX2RlYnVnX2RldigpIGFsc28gc2V0cyBMT09QIHRvIHNob3J0LWNpcmN1aXQgcHJlcGFyZV9sb29wKCkKKwlpZiB0ZXN0IC1mIFNDU0lfREVCVUdfREVWOyB0aGVuCisJCXRlc3QgIiR7TFZNX1RFU1RfUEFSQUxMRUw6LTB9IiAtZXEgMSB8fCBtb2Rwcm9iZSAtciBzY3NpX2RlYnVnCisJZWxzZQorCQl0ZXN0ICEgLWYgTE9PUCB8fCBsb3NldHVwIC1kICQoPCBMT09QKSB8fCB0cnVlCisJCXRlc3QgISAtZiBMT09QRklMRSB8fCBybSAtZiAkKDwgTE9PUEZJTEUpCisJZmkKKworCW5vdCBkaWZmIExPT1AgQkFDS0lOR19ERVYgPi9kZXYvbnVsbCAyPiYxIHx8IHJtIC1mIEJBQ0tJTkdfREVWCisJcm0gLWYgREVWSUNFUyBMT09QCisKKwkjIEF0dGVtcHQgdG8gcmVtb3ZlIGFueSBsb29wIGRldmljZXMgdGhhdCBmYWlsZWQgdG8gZ2V0IHRvcm4gZG93biBpZiBlYXJsaWVyIHRlc3RzIGFib3J0ZWQKKwl0ZXN0ICIke0xWTV9URVNUX1BBUkFMTEVMOi0wfSIgLWVxIDEgLW8gLXogIiRDT01NT05fUFJFRklYIiB8fCB7CisJCWxvY2FsIHN0cmF5X2xvb3BzPSggJChsb3NldHVwIC1hIHwgZ3JlcCAiJENPTU1PTl9QUkVGSVgiIHwgY3V0IC1kOiAtZjEpICkKKwkJdGVzdCAkeyNzdHJheV9sb29wc1tAXX0gLWVxIDAgfHwgeworCQkJdGVhcmRvd25fZGV2c19wcmVmaXhlZCAiJENPTU1PTl9QUkVGSVgiIDEKKwkJCWVjaG8gIlJlbW92aW5nIHN0cmF5IGxvb3AgZGV2aWNlcyBjb250YWluaW5nICRDT01NT05fUFJFRklYOiAke3N0cmF5X2xvb3BzW0BdfSIKKwkJCWZvciBpIGluICIke3N0cmF5X2xvb3BzW0BdfSIgOyBkbyB0ZXN0ICEgLWIgJGkgfHwgbG9zZXR1cCAtZCAkaSB8fCB0cnVlIDsgZG9uZQorCQkJIyBMZWF2ZSB0ZXN0IHdoZW4gdWRldiBwcm9jZXNzZWQgYWxsIHJlbW92ZWQgZGV2aWNlcworCQkJdWRldl93YWl0CisJCX0KKwl9Cit9CisKK2tpbGxfc2xlZXBfa2lsbF8oKSB7CisJcGlkZmlsZT0kMQorCXNsb3c9JDIKKwlpZiB0ZXN0IC1zICRwaWRmaWxlIDsgdGhlbgorCQlwaWQ9JCg8ICRwaWRmaWxlKQorCQlybSAtZiAkcGlkZmlsZQorCQlraWxsIC1URVJNICRwaWQgMj4vZGV2L251bGwgfHwgcmV0dXJuIDAKKwkJaWYgdGVzdCAkc2xvdyAtZXEgMCA7IHRoZW4gc2xlZXAgLjEgOyBlbHNlIHNsZWVwIDEgOyBmaQorCQlraWxsIC1LSUxMICRwaWQgMj4vZGV2L251bGwgfHwgdHJ1ZQorCQl3YWl0PTAKKwkJd2hpbGUgcHMgJHBpZCA+IC9kZXYvbnVsbCAmJiB0ZXN0ICR3YWl0IC1sZSAxMDsgZG8KKwkJCXNsZWVwIC41CisJCQl3YWl0PSQoKCR3YWl0ICsgMSkpCisJCWRvbmUKKwlmaQorfQorCitwcmludF9wcm9jc19ieV90YWdfKCkgeworCShwcyAtbyBwaWQsYXJncyBlaGF4IHwgZ3JlcCAtd2UiTFZNX1RFU1RfVEFHPSR7MTota2lsbF9tZV8kUFJFRklYfSIpIHx8IHRydWUKK30KKworY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKCkgeworCXByaW50X3Byb2NzX2J5X3RhZ18gfCB3YyAtbAorfQorCitraWxsX3RhZ2dlZF9wcm9jZXNzZXMoKSB7CisJbG9jYWwgcGlkCisJbG9jYWwgcGlkcworCWxvY2FsIHdhaXQKKworCSMgcmVhZCB1c2VzIGFsbCB2YXJzIHdpdGhpbiBwaXBlIHN1YnNoZWxsCisJcHJpbnRfcHJvY3NfYnlfdGFnXyAiJEAiIHwgd2hpbGUgcmVhZCAtciBwaWQgd2FpdDsgZG8KKwkJaWYgdGVzdCAtbiAiJHBpZCIgOyB0aGVuCisJCQllY2hvICJLaWxsaW5nIHRhZ2dlZCBwcm9jZXNzOiAkcGlkICR7d2FpdDowOjEyMH0uLi4iCisJCQlraWxsIC1URVJNICRwaWQgMj4vZGV2L251bGwgfHwgdHJ1ZQorCQlmaQorCQlwaWRzPSIkcGlkcyAkcGlkIgorCWRvbmUKKworCSMgd2FpdCBpZiBwcm9jZXNzIGV4aXRlZCBhbmQgZXZlbnR1YWxseSAtS0lMTAorCXdhaXQ9MAorCWZvciBwaWQgaW4gJHBpZHMgOyBkbworCQl3aGlsZSBwcyAkcGlkID4gL2Rldi9udWxsICYmIHRlc3QgJHdhaXQgLWxlIDEwOyBkbworCQkJc2xlZXAgLjIKKwkJCXdhaXQ9JCgoJHdhaXQgKyAxKSkKKwkJZG9uZQorCQl0ZXN0ICR3YWl0IC1sZSAxMCB8fCBraWxsIC1LSUxMICRwaWQgMj4vZGV2L251bGwgfHwgdHJ1ZQorCWRvbmUKK30KKwordGVhcmRvd24oKSB7CisJZWNobyAtbiAiIyMgdGVhcmRvd24uLi4iCisJdW5zZXQgTFZNX0xPR19GSUxFX0VQT0NICisKKwlpZiB0ZXN0IC1mIFRFU1ROQU1FIDsgdGhlbgorCisJa2lsbF90YWdnZWRfcHJvY2Vzc2VzCisKKwlpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNTE9DS0RfVEVTVCIgOyB0aGVuCisJCWVjaG8gIiIKKwkJZWNobyAic3RvcHBpbmcgbHZtbG9ja2QgaW4gdGVhcmRvd24iCisJCWtpbGxhbGwgbHZtbG9ja2QKKwkJc2xlZXAgMQorCQlraWxsYWxsIGx2bWxvY2tkIHx8IHRydWUKKwkJc2xlZXAgMQorCQlraWxsYWxsIC05IGx2bWxvY2tkIHx8IHRydWUKKwlmaQorCisJa2lsbF9zbGVlcF9raWxsXyBMT0NBTF9MVk1FVEFEICR7TFZNX1ZBTEdSSU5EX0xWTUVUQUQ6LTB9CisKKwlkbV90YWJsZSB8IG5vdCBlZ3JlcCAtcSAiJHZnfCR2ZzF8JHZnMnwkdmczfCR2ZzQiIHx8IHsKKwkJIyBBdm9pZCBhY3RpdmF0aW9uIG9mIGRtZXZlbnRkIGlmIHRoZXJlIGlzIG5vIHBpZAorCQljZmc9JCh0ZXN0IC1zIExPQ0FMX0RNRVZFTlREIHx8IGVjaG8gIi0tY29uZmlnIGFjdGl2YXRpb257bW9uaXRvcmluZz0wfSIpCisJCWlmIGVjaG8gIiQoZG1faW5mbyBzdXNwZW5kZWQsbmFtZSkiIHwgZ3JlcCAtcSAiXlN1c3BlbmRlZDouKiRwcmVmaXgiIDsgdGhlbgorCQkJZWNobyAiU2tpcHBpbmcgdmdyZW1vdmUsIHN1c3BlbmRlZCBkZXZpY2VzIGRldGVjdGVkLiIKKwkJZWxzZQorCQkJdmdyZW1vdmUgLWZmICRjZmcgIFwKKwkJCSR2ZyAkdmcxICR2ZzIgJHZnMyAkdmc0ICY+L2Rldi9udWxsIHx8IHJtIC1mIGRlYnVnLmxvZyBzdHJhY2UubG9nCisJCWZpCisJfQorCisJa2lsbF9zbGVlcF9raWxsXyBMT0NBTF9MVk1EQlVTRCAwCisKKwllY2hvIC1uIC4KKworCWtpbGxfc2xlZXBfa2lsbF8gTE9DQUxfTFZNUE9MTEQgJHtMVk1fVkFMR1JJTkRfTFZNUE9MTEQ6LTB9CisKKwllY2hvIC1uIC4KKworCWtpbGxfc2xlZXBfa2lsbF8gTE9DQUxfQ0xWTUQgJHtMVk1fVkFMR1JJTkRfQ0xWTUQ6LTB9CisKKwllY2hvIC1uIC4KKworCWtpbGxfc2xlZXBfa2lsbF8gTE9DQUxfRE1FVkVOVEQgJHtMVk1fVkFMR1JJTkRfRE1FVkVOVEQ6LTB9CisKKwllY2hvIC1uIC4KKworCXRlc3QgLWQgIiRETV9ERVZfRElSL21hcHBlciIgJiYgdGVhcmRvd25fZGV2cworCisJZWNobyAtbiAuCisKKwlmaQorCisJdGVzdCAtbiAiJFRFU1RESVIiICYmIHsKKwkJY2QgIiRURVNUT0xEUFdEIgorCQlybSAtcmYgIiRURVNURElSIiB8fCBlY2hvIEJMQQorCX0KKworCWVjaG8gIm9rIgorCisJdGVzdCAiJHtMVk1fVEVTVF9QQVJBTExFTDotMH0iIC1lcSAxIC1vIC1uICIkUlVOTklOR19ETUVWRU5URCIgfHwgbm90IHBncmVwIGRtZXZlbnRkICMmPi9kZXYvbnVsbAorfQorCitwcmVwYXJlX2xvb3AoKSB7CisJbG9jYWwgc2l6ZT0kezE9MzJ9CisJbG9jYWwgbG9zZXR1cF9wYXJhbXM9JHtAOjJ9CisJbG9jYWwgaQorCWxvY2FsIHNsYXNoCisKKwl0ZXN0IC1mIExPT1AgJiYgTE9PUD0kKDwgTE9PUCkKKwllY2hvIC1uICIjIyBwcmVwYXJpbmcgbG9vcCBkZXZpY2UuLi4iCisKKwkjIHNraXAgaWYgcHJlcGFyZV9zY3NpX2RlYnVnX2RldigpIHdhcyB1c2VkCisJaWYgdGVzdCAtZiBTQ1NJX0RFQlVHX0RFViAtYSAtZiBMT09QIDsgdGhlbgorCQllY2hvICIoc2tpcHBlZCkiCisJCXJldHVybiAwCisJZmkKKworCXRlc3QgISAtZSBMT09QCisJdGVzdCAtbiAiJERNX0RFVl9ESVIiCisKKwlmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDc7IGRvCisJCXRlc3QgLWUgIiRETV9ERVZfRElSL2xvb3AkaSIgfHwgbWtub2QgIiRETV9ERVZfRElSL2xvb3AkaSIgYiA3ICRpCisJZG9uZQorCisJZWNobyAtbiAuCisKKwlsb2NhbCBMT09QRklMRT0iJFBXRC90ZXN0LmltZyIKKwlybSAtZiAiJExPT1BGSUxFIgorCWRkIGlmPS9kZXYvemVybyBvZj0iJExPT1BGSUxFIiBicz0kKCgxMDI0KjEwMjQpKSBjb3VudD0wIHNlZWs9JCgoJHNpemUgKyAxKSkgMj4gL2Rldi9udWxsCisJaWYgTE9PUD0kKGxvc2V0dXAgJHtsb3NldHVwX3BhcmFtc30gLXMgLWYgIiRMT09QRklMRSIgMj4vZGV2L251bGwpOyB0aGVuCisJCToKKwllbGlmIExPT1A9JChsb3NldHVwIC1mKSAmJiBsb3NldHVwICR7bG9zZXR1cF9wYXJhbXN9ICIkTE9PUCIgIiRMT09QRklMRSI7IHRoZW4KKwkJIyBubyAtcyBzdXBwb3J0CisJCToKKwllbHNlCisJCSMgbm8gLWYgc3VwcG9ydAorCQkjIEl0ZXJhdGUgdGhyb3VnaCAkRE1fREVWX0RJUi9sb29weywvfXswLDEsMiwzLDQsNSw2LDd9CisJCWZvciBzbGFzaCBpbiAnJyAvOyBkbworCQkJZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3OyBkbworCQkJCWxvY2FsIGRldj0iJERNX0RFVl9ESVIvbG9vcCRzbGFzaCRpIgorCQkJCSEgbG9zZXR1cCAiJGRldiIgPi9kZXYvbnVsbCAyPiYxIHx8IGNvbnRpbnVlCisJCQkJIyBnb3QgYSBmcmVlCisJCQkJbG9zZXR1cCAke2xvc2V0dXBfcGFyYW1zfSAiJGRldiIgIiRMT09QRklMRSIKKwkJCQlMT09QPSRkZXYKKwkJCQlicmVhaworCQkJZG9uZQorCQkJdGVzdCAteiAiJExPT1AiIHx8IGJyZWFrCisJCWRvbmUKKwlmaQorCXRlc3QgLW4gIiRMT09QIiAjIGNvbmZpcm0gb3IgZmFpbAorCUJBQ0tJTkdfREVWPSIkTE9PUCIKKwllY2hvICIkTE9PUCIgPiBMT09QCisJZWNobyAiJExPT1AiID4gQkFDS0lOR19ERVYKKwllY2hvICJvayAoJExPT1ApIgorfQorCisjIEEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgcHJlcGFyZV9sb29wKCkgdGhhdCB1c2VzIHNjc2lfZGVidWcgdG8gY3JlYXRlCisjIGEgcmFtZGlzay1iYXNlZCBTQ1NJIGRldmljZSB1cG9uIHdoaWNoIGFsbCBMVk0gZGV2aWNlcyB3aWxsIGJlIGNyZWF0ZWQKKyMgLSBzY3JpcHRzIG11c3QgdGFrZSBjYXJlIG5vdCB0byB1c2UgYSBERVZfU0laRSB0aGF0IHdpbGwgZW5kdWNlIE9PTS1raWxsZXIKK3ByZXBhcmVfc2NzaV9kZWJ1Z19kZXYoKSB7CisJbG9jYWwgREVWX1NJWkU9JDEKKwlsb2NhbCBTQ1NJX0RFQlVHX1BBUkFNUz0ke0A6Mn0KKwlsb2NhbCBERUJVR19ERVYKKworCXJtIC1mIGRlYnVnLmxvZyBzdHJhY2UubG9nCisJdGVzdCAhIC1mICJTQ1NJX0RFQlVHX0RFViIgfHwgcmV0dXJuIDAKKwl0ZXN0IC16ICIkTE9PUCIKKwl0ZXN0IC1uICIkRE1fREVWX0RJUiIKKworCSMgU2tpcCB0ZXN0IGlmIHNjc2lfZGVidWcgbW9kdWxlIGlzIHVuYXZhaWxhYmxlIG9yIGlzIGFscmVhZHkgaW4gdXNlCisJbW9kcHJvYmUgLS1kcnktcnVuIHNjc2lfZGVidWcgfHwgc2tpcAorCWxzbW9kIHwgbm90IGdyZXAgLXEgc2NzaV9kZWJ1ZyB8fCBza2lwCisKKwkjIENyZWF0ZSB0aGUgc2NzaV9kZWJ1ZyBkZXZpY2UgYW5kIGRldGVybWluZSB0aGUgbmV3IHNjc2kgZGV2aWNlJ3MgbmFtZQorCSMgTk9URTogaXQgd2lsbCBfbmV2ZXJfIG1ha2Ugc2Vuc2UgdG8gcGFzcyBudW1fdGd0cyBwYXJhbTsKKwkjIGxhc3QgcGFyYW0gd2lucy4uIHNvIG51bV90Z3RzPTEgaXMgaW1wb3NlZAorCXRvdWNoIFNDU0lfREVCVUdfREVWCisJbW9kcHJvYmUgc2NzaV9kZWJ1ZyBkZXZfc2l6ZV9tYj0kREVWX1NJWkUgJFNDU0lfREVCVUdfUEFSQU1TIG51bV90Z3RzPTEgfHwgc2tpcAorCQorCWZvciBpIGluIHsxLi4yMH0gOyBkbworCQlERUJVR19ERVY9Ii9kZXYvJChncmVwIC1IIHNjc2lfZGVidWcgL3N5cy9ibG9jay8qL2RldmljZS9tb2RlbCB8IGN1dCAtZjQgLWQgLykiCisJCXRlc3QgLWIgIiRERUJVR19ERVYiICYmIGJyZWFrCisJCXNsZWVwIC4xICMgYWxsb3cgZm9yIGFzeW5jIExpbnV4IFNDU0kgZGV2aWNlIHJlZ2lzdHJhdGlvbgorICAgICAgICBkb25lCisJdGVzdCAtYiAiJERFQlVHX0RFViIgfHwgcmV0dXJuIDEgIyBzaG91bGQgbm90IGhhcHBlbgorCisJIyBDcmVhdGUgc3ltbGluayB0byBzY3NpX2RlYnVnIGRldmljZSBpbiAkRE1fREVWX0RJUgorCVNDU0lfREVCVUdfREVWPSIkRE1fREVWX0RJUi8kKGJhc2VuYW1lICRERUJVR19ERVYpIgorCWVjaG8gIiRTQ1NJX0RFQlVHX0RFViIgPiBTQ1NJX0RFQlVHX0RFVgorCWVjaG8gIiRTQ1NJX0RFQlVHX0RFViIgPiBCQUNLSU5HX0RFVgorCSMgU2V0dGluZyAkTE9PUCBwcm92aWRlcyBtZWFucyBmb3IgcHJlcGFyZV9kZXZzKCkgb3ZlcnJpZGUKKwl0ZXN0ICIkREVCVUdfREVWIiA9ICIkU0NTSV9ERUJVR19ERVYiIHx8IGxuIC1zbmYgIiRERUJVR19ERVYiICIkU0NTSV9ERUJVR19ERVYiCit9CisKK2NsZWFudXBfc2NzaV9kZWJ1Z19kZXYoKSB7CisJdGVhcmRvd25fZGV2cworCXJtIC1mIFNDU0lfREVCVUdfREVWIExPT1AKK30KKworcHJlcGFyZV9tZF9kZXYoKSB7CisJbG9jYWwgbGV2ZWw9JDEKKwlsb2NhbCByY2h1bms9JDIKKwlsb2NhbCByZGV2cz0kMworCisJbG9jYWwgbWFqPSQobWRhZG0gLS12ZXJzaW9uIDI+JjEpIHx8IHNraXAgIm1kYWRtIHRvb2wgaXMgbWlzc2luZyEiCisJbG9jYWwgbWRkZXYKKworCWNsZWFudXBfbWRfZGV2CisKKwlybSAtZiBkZWJ1Zy5sb2cgc3RyYWNlLmxvZyBNRF9ERVYgTURfREVWX1BWIE1EX0RFVklDRVMKKworCWNvcHRpb249Ii0tY2h1bmsiCisJdGVzdCAiJGxldmVsIiA9ICIxIiAmJiBjb3B0aW9uPSItLWJpdG1hcC1jaHVuayIKKwkjIEhhdmUgTUQgdXNlIGEgbm9uLXN0YW5kYXJkIG5hbWUgdG8gYXZvaWQgY29sbGlkaW5nIHdpdGggYW4gZXhpc3RpbmcgTUQgZGV2aWNlCisJIyAtIG1kYWRtID49IDMuMCByZXF1aXJlcyB0aGF0IG5vbi1zdGFuZGFyZCBkZXZpY2UgbmFtZXMgYmUgaW4gL2Rldi9tZC8KKwkjIC0gbmV3ZXIgbWRhZG0gX2NvbXBsZXRlbHlfIGRlZmVycyB0byB1ZGV2IHRvIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBkZXZpY2Ugbm9kZQorCW1haj0ke21haiMjKi0gdn0KKwltYWo9JHttYWolJS4qfQorCVsgIiRtYWoiIC1nZSAzIF0gJiYgXAorCQltZGRldj0vZGV2L21kL21kX2x2bV90ZXN0MCB8fCBcCisJCW1kZGV2PS9kZXYvbWRfbHZtX3Rlc3QwCisKKwltZGFkbSAtLWNyZWF0ZSAtLW1ldGFkYXRhPTEuMCAiJG1kZGV2IiAtLWF1dG89bWQgLS1sZXZlbCAkbGV2ZWwgLS1iaXRtYXA9aW50ZXJuYWwgJGNvcHRpb249JHJjaHVuayAtLXJhaWQtZGV2aWNlcz0kcmRldnMgIiR7QDo0fSIgfHwgeworCQkjIFNvbWUgb2xkZXIgJ21kYWRtJyB2ZXJzaW9uIG1hbmFnZWQgdG8gb3BlbiBhbmQgY2xvc2UgZGV2aWNlcyBpbnRlcm5hbHkKKwkJIyBhbmQgcmVwb3J0aW5nIG5vbi1leGNsdXNpdmUgYWNjZXNzIG9uIHN1Y2ggZGV2aWNlCisJCSMgbGV0J3MganVzdCBza2lwIHRoZSB0ZXN0IGlmIHRoaXMgaGFwcGVucy4KKwkJIyBOb3RlOiBJdCdzIHByZXR0eSBjb21wbGV4IHRvIGdldCByaWQgb2YgY29uc2VxdWVuY2VzCisJCSMgICAgICAgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBhdm9pZCBsZWFrcyBvbiBmMTkKKwkJIyBUT0RPOiBtYXliZSB0cnkgaGVyZSB0byByZWNyZWF0ZSBmZXcgdGltZXMuLi4uCisJCW1kYWRtIC0tc3RvcCAiJG1kZGV2IiB8fCB0cnVlCisJCXVkZXZfd2FpdAorCQltZGFkbSAtLXplcm8tc3VwZXJibG9jayAiJHtAOjR9IiB8fCB0cnVlCisJCXVkZXZfd2FpdAorCQlza2lwICJUZXN0IHNraXBwZWQsIHVucmVsaWFibGUgbWRhZG0gZGV0ZWN0ZWQhIgorCX0KKwl0ZXN0IC1iICIkbWRkZXYiIHx8IHNraXAgIm1kYWRtIGhhcyBub3QgY3JlYXRlZCBkZXZpY2UhIgorCisJIyBMVk0vRE0gd2lsbCBzZWUgdGhpcyBkZXZpY2UKKwljYXNlICIkRE1fREVWX0RJUiIgaW4KKwkiL2RldiIpIHJlYWRsaW5rIC1mICIkbWRkZXYiIDs7CisJKikJY3AgLUxSICIkbWRkZXYiICIkRE1fREVWX0RJUiIKKwkJZWNobyAiJERNX0RFVl9ESVIvbWRfbHZtX3Rlc3QwIiA7OworCWVzYWMgPiBNRF9ERVZfUFYKKwllY2hvICIkbWRkZXYiID4gTURfREVWCisJbm90aWZ5X2x2bWV0YWQgJCg8IE1EX0RFVl9QVikKKwlwcmludGYgIiVzXG4iICIke0A6NH0iID4gTURfREVWSUNFUworCWZvciBtZGRldiBpbiAiJHtAOjR9IjsgZG8KKwkJbm90aWZ5X2x2bWV0YWQgIiRtZGRldiIKKwlkb25lCit9CisKK2NsZWFudXBfbWRfZGV2KCkgeworCXRlc3QgLWYgTURfREVWIHx8IHJldHVybiAwCisKKwlsb2NhbCBJRlM9JElGU19OTAorCWxvY2FsIGRldj0kKDwgTURfREVWKQorCisJdWRldl93YWl0CisJbWRhZG0gLS1zdG9wICIkZGV2IiB8fCB0cnVlCisJdGVzdCAiJERNX0RFVl9ESVIiICE9ICIvZGV2IiAmJiBybSAtZiAiJERNX0RFVl9ESVIvJChiYXNlbmFtZSAkZGV2KSIKKwlub3RpZnlfbHZtZXRhZCAkKDwgTURfREVWX1BWKQorCXVkZXZfd2FpdCAgIyB3YWl0IHRpbGwgZXZlbnRzIGFyZSBwcm9jZXNzLCBub3QgemVyb2luZyB0byBlYXJseQorCWZvciBkZXYgaW4gJCg8IE1EX0RFVklDRVMpOyBkbworCQltZGFkbSAtLXplcm8tc3VwZXJibG9jayAiJGRldiIgfHwgdHJ1ZQorCQlub3RpZnlfbHZtZXRhZCAiJGRldiIKKwlkb25lCisJdWRldl93YWl0CisJaWYgWyAtYiAiJG1kZGV2IiBdOyB0aGVuCisJCSMgbWRhZG0gZG9lc24ndCBhbHdheXMgY2xlYW51cCB0aGUgZGV2aWNlIG5vZGUKKwkJIyBzbGVlcHMgb2ZmZXIgaGFjayB0byBkZWZlYXQ6ICdtZDogbWQxMjcgc3RpbGwgaW4gdXNlJworCQkjIHNlZTogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01MDk5MDgjYzI1CisJCXNsZWVwIDIKKwkJcm0gLWYgIiRtZGRldiIKKwlmaQorCXJtIC1mIE1EX0RFViBNRF9ERVZJQ0VTIE1EX0RFVl9QVgorfQorCitwcmVwYXJlX2JhY2tpbmdfZGV2KCkgeworCWlmIHRlc3QgLWYgQkFDS0lOR19ERVY7IHRoZW4KKwkJQkFDS0lOR19ERVY9JCg8IEJBQ0tJTkdfREVWKQorCWVsaWYgdGVzdCAtYiAiJExWTV9URVNUX0JBQ0tJTkdfREVWSUNFIjsgdGhlbgorCQlCQUNLSU5HX0RFVj0kTFZNX1RFU1RfQkFDS0lOR19ERVZJQ0UKKwkJZWNobyAiJEJBQ0tJTkdfREVWIiA+IEJBQ0tJTkdfREVWCisJZWxzZQorCQlwcmVwYXJlX2xvb3AgIiRAIgorCWZpCit9CisKK3ByZXBhcmVfZGV2cygpIHsKKwlsb2NhbCBuPSR7MTotM30KKwlsb2NhbCBkZXZzaXplPSR7MjotMzR9CisJbG9jYWwgcHZuYW1lPSR7MzotcHZ9CisJbG9jYWwgc2hpZnQ9MAorCisJIyBzYW5sb2NrIHJlcXVpcmVzIG1vcmUgc3BhY2UgZm9yIHRoZSBpbnRlcm5hbCBzYW5sb2NrIGx2CisJIyBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIGxvd2VyLCBidXQgd2hhdCBhcmUgdGhlIHVuaXRzPworCWlmIHRlc3QgLW4gIiRMVk1fVEVTVF9MT0NLX1RZUEVfU0FOTE9DSyIgOyB0aGVuCisJCWRldnNpemU9MTAyNAorCWZpCisKKwl0b3VjaCBERVZJQ0VTCisJcHJlcGFyZV9iYWNraW5nX2RldiAkKCgkbiokZGV2c2l6ZSkpCisJIyBzaGlmdCBzdGFydCBvZiBQViBkZXZpY2VzIG9uIC9kZXYvbG9vcFhYIGJ5IDFNCisJbm90IGRpZmYgTE9PUCBCQUNLSU5HX0RFViA+L2Rldi9udWxsIDI+JjEgfHwgc2hpZnQ9MjA0OAorCWVjaG8gLW4gIiMjIHByZXBhcmluZyAkbiBkZXZpY2VzLi4uIgorCisJbG9jYWwgc2l6ZT0kKCgkZGV2c2l6ZSoyMDQ4KSkgIyBzZWN0b3JzCisJbG9jYWwgY291bnQ9MAorCWluaXRfdWRldl90cmFuc2FjdGlvbgorCWZvciBpIGluICQoc2VxIDEgJG4pOyBkbworCQlsb2NhbCBuYW1lPSIke1BSRUZJWH0kcHZuYW1lJGkiCisJCWxvY2FsIGRldj0iJERNX0RFVl9ESVIvbWFwcGVyLyRuYW1lIgorCQlERVZJQ0VTWyRjb3VudF09JGRldgorCQljb3VudD0kKCggJGNvdW50ICsgMSApKQorCQllY2hvIDAgJHNpemUgbGluZWFyICIkQkFDS0lOR19ERVYiICQoKCgkaS0xKSokc2l6ZSArICRzaGlmdCkpID4gIiRuYW1lLnRhYmxlIgorCQlpZiBub3QgZG1zZXR1cCBjcmVhdGUgLXUgIlRFU1QtJG5hbWUiICIkbmFtZSIgIiRuYW1lLnRhYmxlIiAmJgorCQkgICB0ZXN0IC1uICIkTFZNX1RFU1RfQkFDS0lOR19ERVZJQ0UiOworCQl0aGVuICMgbWF5YmUgdGhlIGJhY2tpbmcgZGV2aWNlIGlzIHRvbyBzbWFsbCBmb3IgdGhpcyB0ZXN0CisJCSAgICBMVk1fVEVTVF9CQUNLSU5HX0RFVklDRT0KKwkJICAgIHJtIC1mIEJBQ0tJTkdfREVWCisJCSAgICBwcmVwYXJlX2RldnMgIiRAIgorCQkgICAgcmV0dXJuICQ/CisJCWZpCisJZG9uZQorCWZpbmlzaF91ZGV2X3RyYW5zYWN0aW9uCisKKwkjIG5vbi1lcGhlbWVyYWwgZGV2aWNlcyBuZWVkIHRvIGJlIGNsZWFyZWQgYmV0d2VlbiB0ZXN0cworCXRlc3QgLWYgTE9PUCB8fCBmb3IgZCBpbiAke0RFVklDRVNbQF19OyBkbworCQlibGtkaXNjYXJkICIkZCIgMj4vZGV2L251bGwgfHwgdHJ1ZQorCQkjIGVuc3VyZSBkaXNrIGhlYWRlciBpcyBhbHdheXMgemVyb2VkCisJCWRkIGlmPS9kZXYvemVybyBvZj0iJGQiIGJzPTMyayBjb3VudD0xCisJCXdpcGVmcyAtYSAiJGQiIDI+L2Rldi9udWxsIHx8IHRydWUKKwlkb25lCisKKwkjZm9yIGkgaW4gYHNlcSAxICRuYDsgZG8KKwkjCWxvY2FsIG5hbWU9IiR7UFJFRklYfSRwdm5hbWUkaSIKKwkjCWRtc2V0dXAgaW5mbyAtYyAkbmFtZQorCSNkb25lCisJI2ZvciBpIGluIGBzZXEgMSAkbmA7IGRvCisJIwlsb2NhbCBuYW1lPSIke1BSRUZJWH0kcHZuYW1lJGkiCisJIwlkbXNldHVwIHRhYmxlICRuYW1lCisJI2RvbmUKKworCXByaW50ZiAiJXNcbiIgIiR7REVWSUNFU1tAXX0iID4gREVWSUNFUworIwkoIElGUz0kJ1xuJzsgZWNobyAiJHtERVZJQ0VTWypdfSIgKSA+REVWSUNFUworCWVjaG8gIm9rIgorCisJZm9yIGRldiBpbiAiJHtERVZJQ0VTW0BdfSI7IGRvCisJCW5vdGlmeV9sdm1ldGFkICIkZGV2IgorCWRvbmUKK30KKworCitjb21tb25fZGV2XygpIHsKKwlsb2NhbCB0Z3R5cGU9JDEKKwlsb2NhbCBuYW1lPSR7MiMjKi99CisJbG9jYWwgb2Zmc2V0cworCWxvY2FsIHJlYWRfbXMKKwlsb2NhbCB3cml0ZV9tcworCisJY2FzZSAiJHRndHlwZSIgaW4KKwlkZWxheSkKKwkJcmVhZF9tcz0kezM6LTB9CisJCXdyaXRlX21zPSR7NDotMH0KKwkJb2Zmc2V0cz0ke0A6NX0KKwkJaWYgdGVzdCAiJHJlYWRfbXMiIC1lcSAwIC1hICIkd3JpdGVfbXMiIC1lcSAwIDsgdGhlbgorCQkJb2Zmc2V0cz0KKwkJZWxzZQorCQkJdGVzdCAteiAiJHtvZmZzZXRzW0BdfSIgJiYgb2Zmc2V0cz0iMDoiCisJCWZpIDs7CisJZXJyb3IpICBvZmZzZXRzPSR7QDozfQorCQl0ZXN0IC16ICIke29mZnNldHNbQF19IiAmJiBvZmZzZXRzPSIwOiIgOzsKKwllc2FjCisKKwlsb2NhbCBwb3MKKwlsb2NhbCBzaXplCisJbG9jYWwgdHlwZQorCWxvY2FsIHB2ZGV2CisJbG9jYWwgb2Zmc2V0CisKKwlyZWFkIHBvcyBzaXplIHR5cGUgcHZkZXYgb2Zmc2V0IDwgIiRuYW1lLnRhYmxlIgorCisJZm9yIGZyb21sZW4gaW4gJHtvZmZzZXRzW0BdfTsgZG8KKwkJZnJvbT0ke2Zyb21sZW4lJToqfQorCQlsZW49JHtmcm9tbGVuIyMqOn0KKwkJdGVzdCAtbiAiJGxlbiIgfHwgbGVuPSQoKCRzaXplIC0gJGZyb20pKQorCQlkaWZmPSQoKCRmcm9tIC0gJHBvcykpCisJCWlmIHRlc3QgJGRpZmYgLWd0IDAgOyB0aGVuCisJCQllY2hvICIkcG9zICRkaWZmICR0eXBlICRwdmRldiAkKCgkcG9zICsgJG9mZnNldCkpIgorCQkJcG9zPSQoKCRwb3MgKyAkZGlmZikpCisJCWVsaWYgdGVzdCAkZGlmZiAtbHQgMCA7IHRoZW4KKwkJCWRpZSAiUG9zaXRpb24gZXJyb3IiCisJCWZpCisKKwkJY2FzZSAiJHRndHlwZSIgaW4KKwkJZGVsYXkpCisJCQllY2hvICIkZnJvbSAkbGVuIGRlbGF5ICRwdmRldiAkKCgkcG9zICsgJG9mZnNldCkpICRyZWFkX21zICRwdmRldiAkKCgkcG9zICsgJG9mZnNldCkpICR3cml0ZV9tcyIgOzsKKwkJZXJyb3IpCisJCQllY2hvICIkZnJvbSAkbGVuIGVycm9yIiA7OworCQllc2FjCisJCXBvcz0kKCgkcG9zICsgJGxlbikpCisJZG9uZSA+ICIkbmFtZS5kZXZ0YWJsZSIKKwlkaWZmPSQoKCRzaXplIC0gJHBvcykpCisJdGVzdCAiJGRpZmYiIC1ndCAwICYmIGVjaG8gIiRwb3MgJGRpZmYgJHR5cGUgJHB2ZGV2ICQoKCRwb3MgKyAkb2Zmc2V0KSkiID4+IiRuYW1lLmRldnRhYmxlIgorCisJaW5pdF91ZGV2X3RyYW5zYWN0aW9uCisJZG1zZXR1cCBsb2FkICIkbmFtZSIgIiRuYW1lLmRldnRhYmxlIgorCSMgVE9ETzogYWRkIHN1cHBvcnQgZm9yIHJlc3VtZSB3aXRob3V0IHVkZXYgcmVzY2FuCisJZG1zZXR1cCByZXN1bWUgIiRuYW1lIgorCWZpbmlzaF91ZGV2X3RyYW5zYWN0aW9uCit9CisKKyMgUmVwbGFjZSBsaW5lYXIgUFYgZGV2aWNlIHdpdGggaXRzICdkZWxheWVkJyB2ZXJzaW9uCisjIENvdWxkIGJlIHVzZWQgdG8gbW9yZSBkZXRlcm1pbmlzdGljYWx5IGhpdCBzb21lIHByb2JsZW1zLgorIyBQYXJhbWV0ZXJzOiB7ZGV2aWNlIHBhdGh9IFtyZWFkIGRlbGF5IG1zXSBbd3JpdGUgZGVsYXkgbXNdIFtvZmZzZXQ6c2l6ZV0uLi4KKyMgT3JpZ2luYWwgZGV2aWNlIGlzIHJlc3RvcmVkIHdoZW4gYm90aCBkZWxheSBwYXJhbXMgYXJlIDAgKG9yIG1pc3NpbmcpLgorIyBJZiB0aGUgc2l6ZSBpcyBtaXNzaW5nLCB0aGUgcmVtYWluZyBwb3J0aW9uIG9mIGRldmljZSBpcyB0YWtlbgorIyBpLmUuICBkZWxheV9kZXYgIiRkZXYxIiAwIDIwMCAyNTY6CitkZWxheV9kZXYoKSB7CisJaWYgdGVzdCAhIC1mIEhBVkVfRE1fREVMQVkgOyB0aGVuCisJCXRhcmdldF9hdF9sZWFzdCBkbS1kZWxheSAxIDEgMCB8fCByZXR1cm4gMAorCWZpCisJdG91Y2ggSEFWRV9ETV9ERUxBWQorCWNvbW1vbl9kZXZfIGRlbGF5ICIkQCIKK30KKworZGlzYWJsZV9kZXYoKSB7CisJbG9jYWwgZGV2CisJbG9jYWwgc2lsZW50CisJbG9jYWwgZXJyb3IKKwlsb2NhbCBub3RpZnkKKworCXdoaWxlIHRlc3QgLW4gIiQxIjsgZG8KKwkgICAgaWYgdGVzdCAiJDEiID0gIi0tc2lsZW50IjsgdGhlbgorCQlzaWxlbnQ9MQorCQlzaGlmdAorCSAgICBlbGlmIHRlc3QgIiQxIiA9ICItLWVycm9yIjsgdGhlbgorCQllcnJvcj0xCisJCXNoaWZ0CisJICAgIGVsc2UKKwkJYnJlYWsKKwkgICAgZmkKKwlkb25lCisKKwl1ZGV2X3dhaXQKKwlmb3IgZGV2IGluICIkQCI7IGRvCisJCW1haj0kKCgkKHN0YXQgLUwgLS1wcmludGY9MHgldCAiJGRldiIpKSkKKwkJbWluPSQoKCQoc3RhdCAtTCAtLXByaW50Zj0weCVUICIkZGV2IikpKQorCQllY2hvICJEaXNhYmxpbmcgZGV2aWNlICRkZXYgKCRtYWo6JG1pbikiCisJCW5vdGlmeT0iJG5vdGlmeSAkbWFqOiRtaW4iCisJCWlmIHRlc3QgLW4gIiRlcnJvciI7IHRoZW4KKwkJICAgIGVjaG8gMCAxMDAwMDAwMCBlcnJvciB8IGRtc2V0dXAgbG9hZCAiJGRldiIKKwkJICAgIGRtc2V0dXAgcmVzdW1lICIkZGV2IgorCQllbHNlCisJCSAgICBkbXNldHVwIHJlbW92ZSAtZiAiJGRldiIgMj4vZGV2L251bGwgfHwgdHJ1ZQorCQlmaQorCWRvbmUKKworCXRlc3QgLW4gIiRzaWxlbnQiIHx8IGZvciBudW0gaW4gJG5vdGlmeTsgZG8KKwkJbm90aWZ5X2x2bWV0YWQgLS1tYWpvciAkKGVjaG8gJG51bSB8IHNlZCAtZSAicyw6LiosLCIpIFwKKwkJICAgICAgICAgICAgICAgLS1taW5vciAkKGVjaG8gJG51bSB8IHNlZCAtZSAicywuKjosLCIpCisJZG9uZQorfQorCitlbmFibGVfZGV2KCkgeworCWxvY2FsIGRldgorCWxvY2FsIHNpbGVudAorCisJaWYgdGVzdCAiJDEiID0gIi0tc2lsZW50IjsgdGhlbgorCSAgICBzaWxlbnQ9MQorCSAgICBzaGlmdAorCWZpCisKKwlybSAtZiBkZWJ1Zy5sb2cgc3RyYWNlLmxvZworCWluaXRfdWRldl90cmFuc2FjdGlvbgorCWZvciBkZXYgaW4gIiRAIjsgZG8KKwkJbG9jYWwgbmFtZT0kKGVjaG8gIiRkZXYiIHwgc2VkIC1lICdzLC4qLywsJykKKwkJZG1zZXR1cCBjcmVhdGUgLXUgIlRFU1QtJG5hbWUiICIkbmFtZSIgIiRuYW1lLnRhYmxlIiAyPi9kZXYvbnVsbCB8fCBcCisJCQlkbXNldHVwIGxvYWQgIiRuYW1lIiAiJG5hbWUudGFibGUiCisJCSMgdXNpbmcgZGV2aWNlIG5hbWUgKHNpbmNlIGRldmljZSBwYXRoIGRvZXMgbm90IGV4aXN0cyB5ZXMgd2l0aCB1ZGV2KQorCQlkbXNldHVwIHJlc3VtZSAiJG5hbWUiCisJZG9uZQorCWZpbmlzaF91ZGV2X3RyYW5zYWN0aW9uCisKKwl0ZXN0IC1uICIkc2lsZW50IiB8fCBmb3IgZGV2IGluICIkQCI7IGRvCisJCW5vdGlmeV9sdm1ldGFkICIkZGV2IgorCWRvbmUKK30KKworIworIyBDb252ZXJ0IGRldmljZSB0byBkZXZpY2Ugd2l0aCBlcnJvcnMKKyMgVGFrZXMgdGhlIGxpc3Qgb2YgcGFpcnMgb2YgZXJyb3Igc2VnbWVudCBmcm9tOmxlbgorIyBPcmlnaW5hbCBkZXZpY2UgdGFibGUgaXMgcmVwbGFjZSB3aXRoIG11bHRpcGxlIGxpbmVzCisjIGkuZS4gIGVycm9yX2RldiAiJGRldjEiIDg6MzIgOTY6OAorZXJyb3JfZGV2KCkgeworCWNvbW1vbl9kZXZfIGVycm9yICIkQCIKK30KKworYmFja3VwX2RldigpIHsKKwlsb2NhbCBkZXYKKworCWZvciBkZXYgaW4gIiRAIjsgZG8KKwkJZGQgaWY9IiRkZXYiIG9mPSIkZGV2LmJhY2t1cCIgYnM9MTAyNAorCWRvbmUKK30KKworcmVzdG9yZV9kZXYoKSB7CisJbG9jYWwgZGV2CisKKwlmb3IgZGV2IGluICIkQCI7IGRvCisJCXRlc3QgLWUgIiRkZXYuYmFja3VwIiB8fCBcCisJCQlkaWUgIkludGVybmFsIGVycm9yOiAkZGV2IG5vdCBiYWNrZWQgdXAsIGNhbid0IHJlc3RvcmUhIgorCQlkZCBvZj0iJGRldiIgaWY9IiRkZXYuYmFja3VwIiBicz0xMDI0CisJZG9uZQorfQorCitwcmVwYXJlX3B2cygpIHsKKwlwcmVwYXJlX2RldnMgIiRAIgorCXB2Y3JlYXRlIC1mZiAiJHtERVZJQ0VTW0BdfSIKK30KKworcHJlcGFyZV92ZygpIHsKKwl0ZWFyZG93bl9kZXZzCisKKwlwcmVwYXJlX2RldnMgIiRAIgorCXZnY3JlYXRlIC1zIDUxMksgJHZnICIke0RFVklDRVNbQF19IgorfQorCitleHRlbmRfZmlsdGVyKCkgeworCWZpbHRlcj0kKGdyZXAgXmRldmljZXMvZ2xvYmFsX2ZpbHRlciBDT05GSUdfVkFMVUVTIHwgdGFpbCAtbiAxKQorCWZvciByeCBpbiAiJEAiOyBkbworCQlmaWx0ZXI9JChlY2hvICRmaWx0ZXIgfCBzZWQgLWUgInM6XFs6WyBcIiRyeFwiLCA6IikKKwlkb25lCisJbHZtY29uZiAiJGZpbHRlciIKK30KKworZXh0ZW5kX2ZpbHRlcl9MVk1URVNUKCkgeworCWV4dGVuZF9maWx0ZXIgImF8JERNX0RFVl9ESVIvJFBSRUZJWHwiCit9CisKK2hpZGVfZGV2KCkgeworCWZpbHRlcj0kKGdyZXAgXmRldmljZXMvZ2xvYmFsX2ZpbHRlciBDT05GSUdfVkFMVUVTIHwgdGFpbCAtbiAxKQorCWZvciBkZXYgaW4gJEA7IGRvCisJCWZpbHRlcj0kKGVjaG8gJGZpbHRlciB8IHNlZCAtZSAiczpcWzpbIFwicnwkZGV2fFwiLCA6IikKKwlkb25lCisJbHZtY29uZiAiJGZpbHRlciIKK30KKwordW5oaWRlX2RldigpIHsKKwlmaWx0ZXI9JChncmVwIF5kZXZpY2VzL2dsb2JhbF9maWx0ZXIgQ09ORklHX1ZBTFVFUyB8IHRhaWwgLW4gMSkKKwlmb3IgZGV2IGluICRAOyBkbworCQlmaWx0ZXI9JChlY2hvICRmaWx0ZXIgfCBzZWQgLWUgInM6XCJyfCRkZXZ8XCIsIDo6IikKKwlkb25lCisJbHZtY29uZiAiJGZpbHRlciIKK30KKworbWtkZXZfbWQ1c3VtKCkgeworCXJtIC1mIGRlYnVnLmxvZyBzdHJhY2UubG9nCisJbWtmcy5leHQyICIkRE1fREVWX0RJUi8kMS8kMiIgfHwgcmV0dXJuIDEKKwltZDVzdW0gIiRETV9ERVZfRElSLyQxLyQyIiA+ICJtZDUuJDEtJDIiCit9CisKK2dlbmVyYXRlX2NvbmZpZygpIHsKKwlpZiB0ZXN0IC1uICIkcHJvZmlsZV9uYW1lIjsgdGhlbgorCQljb25maWdfdmFsdWVzPVBST0ZJTEVfVkFMVUVTXyRwcm9maWxlX25hbWUKKwkJY29uZmlnPVBST0ZJTEVfJHByb2ZpbGVfbmFtZQorCQl0b3VjaCAkY29uZmlnX3ZhbHVlcworCWVsc2UKKwkJY29uZmlnX3ZhbHVlcz1DT05GSUdfVkFMVUVTCisJCWNvbmZpZz1DT05GSUcKKwlmaQorCisJTFZNX1RFU1RfTE9DS0lORz0ke0xWTV9URVNUX0xPQ0tJTkc6LTF9CisJTFZNX1RFU1RfTFZNRVRBRD0ke0xWTV9URVNUX0xWTUVUQUQ6LTB9CisJTFZNX1RFU1RfTFZNUE9MTEQ9JHtMVk1fVEVTVF9MVk1QT0xMRDotMH0KKwlMVk1fVEVTVF9MVk1MT0NLRD0ke0xWTV9URVNUX0xWTUxPQ0tEOi0wfQorICAgICAgICAjIEZJWE1FOmRjdDogVGhpcyBpcyBoYXJtZnVsISBWYXJpYWJsZXMgYXJlIHVudXNlZCBoZXJlIGFuZCBhcmUgdGVzdGVkIG5vdCBiZWluZyBlbXB0eSBlbHNld2hlcmU6CisJI0xWTV9URVNUX0xPQ0tfVFlQRV9TQU5MT0NLPSR7TFZNX1RFU1RfTE9DS19UWVBFX1NBTkxPQ0s6LTB9CisJI0xWTV9URVNUX0xPQ0tfVFlQRV9ETE09JHtMVk1fVEVTVF9MT0NLX1RZUEVfRExNOi0wfQorCWlmIHRlc3QgIiRETV9ERVZfRElSIiA9ICIvZGV2IjsgdGhlbgorCSAgICBMVk1fVkVSSUZZX1VERVY9JHtMVk1fVkVSSUZZX1VERVY6LTB9CisJZWxzZQorCSAgICBMVk1fVkVSSUZZX1VERVY9JHtMVk1fVkVSSUZZX1VERVY6LTF9CisJZmkKKwl0ZXN0IC1mICIkY29uZmlnX3ZhbHVlcyIgfHwgeworICAgICAgICAgICAgY2F0ID4gIiRjb25maWdfdmFsdWVzIiA8PC1FT0YKK2FjdGl2YXRpb24vY2hlY2tzID0gMQorYWN0aXZhdGlvbi9tb25pdG9yaW5nID0gMAorYWN0aXZhdGlvbi9wb2xsaW5nX2ludGVydmFsID0gMAorYWN0aXZhdGlvbi9yZXRyeV9kZWFjdGl2YXRpb24gPSAxCithY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudCA9IDUwCithY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfdGhyZXNob2xkID0gNTAKK2FjdGl2YXRpb24vdWRldl9ydWxlcyA9IDEKK2FjdGl2YXRpb24vdWRldl9zeW5jID0gMQorYWN0aXZhdGlvbi92ZXJpZnlfdWRldl9vcGVyYXRpb25zID0gJExWTV9WRVJJRllfVURFVgorYWxsb2NhdGlvbi93aXBlX3NpZ25hdHVyZXNfd2hlbl96ZXJvaW5nX25ld19sdnMgPSAwCitiYWNrdXAvYXJjaGl2ZSA9IDAKK2JhY2t1cC9iYWNrdXAgPSAwCitkZXZpY2VzL2NhY2hlX2RpciA9ICIkVEVTVERJUi9ldGMiCitkZXZpY2VzL2RlZmF1bHRfZGF0YV9hbGlnbm1lbnQgPSAxCitkZXZpY2VzL2RpciA9ICIkRE1fREVWX0RJUiIKK2RldmljZXMvZmlsdGVyID0gImF8Lip8IgorZGV2aWNlcy9nbG9iYWxfZmlsdGVyID0gWyAiYXwkRE1fREVWX0RJUi9tYXBwZXIvLipwdlswLTlfXSokfCIsICJyfC4qfCIgXQorZGV2aWNlcy9tZF9jb21wb25lbnRfZGV0ZWN0aW9uICA9IDAKK2RldmljZXMvc2NhbiA9ICIkRE1fREVWX0RJUiIKK2RldmljZXMvc3lzZnNfc2NhbiA9IDEKK2dsb2JhbC9hYm9ydF9vbl9pbnRlcm5hbF9lcnJvcnMgPSAxCitnbG9iYWwvY2FjaGVfY2hlY2tfZXhlY3V0YWJsZSA9ICIkTFZNX1RFU1RfQ0FDSEVfQ0hFQ0tfQ01EIgorZ2xvYmFsL2NhY2hlX2R1bXBfZXhlY3V0YWJsZSA9ICIkTFZNX1RFU1RfQ0FDSEVfRFVNUF9DTUQiCitnbG9iYWwvY2FjaGVfcmVwYWlyX2V4ZWN1dGFibGUgPSAiJExWTV9URVNUX0NBQ0hFX1JFUEFJUl9DTUQiCitnbG9iYWwvZGV0ZWN0X2ludGVybmFsX3ZnX2NhY2hlX2NvcnJ1cHRpb24gPSAxCitnbG9iYWwvZmFsbGJhY2tfdG9fbG9jYWxfbG9ja2luZyA9IDAKK2dsb2JhbC9saWJyYXJ5X2RpciA9ICIkVEVTVERJUi9saWIiCitnbG9iYWwvbG9ja2luZ19kaXIgPSAiJFRFU1RESVIvdmFyL2xvY2svbHZtIgorZ2xvYmFsL2xvY2tpbmdfdHlwZT0kTFZNX1RFU1RfTE9DS0lORworZ2xvYmFsL3NpX3VuaXRfY29uc2lzdGVuY3kgPSAxCitnbG9iYWwvdGhpbl9jaGVja19leGVjdXRhYmxlID0gIiRMVk1fVEVTVF9USElOX0NIRUNLX0NNRCIKK2dsb2JhbC90aGluX2R1bXBfZXhlY3V0YWJsZSA9ICIkTFZNX1RFU1RfVEhJTl9EVU1QX0NNRCIKK2dsb2JhbC90aGluX3JlcGFpcl9leGVjdXRhYmxlID0gIiRMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQiCitnbG9iYWwvdXNlX2x2bWV0YWQgPSAkTFZNX1RFU1RfTFZNRVRBRAorZ2xvYmFsL3VzZV9sdm1wb2xsZCA9ICRMVk1fVEVTVF9MVk1QT0xMRAorZ2xvYmFsL3VzZV9sdm1sb2NrZCA9ICRMVk1fVEVTVF9MVk1MT0NLRAorbG9nL2FjdGl2YXRpb24gPSAxCitsb2cvZmlsZSA9ICIkVEVTVERJUi9kZWJ1Zy5sb2ciCitsb2cvaW5kZW50ID0gMQorbG9nL2xldmVsID0gOQorbG9nL292ZXJ3cml0ZSA9IDEKK2xvZy9zeXNsb2cgPSAwCitsb2cvdmVyYm9zZSA9IDAKK0VPRgorCX0KKworCWxvY2FsIHYKKwlmb3IgdiBpbiAiJEAiOyBkbworCSAgICBlY2hvICIkdiIKKwlkb25lID4+ICIkY29uZmlnX3ZhbHVlcyIKKworCWRlY2xhcmUgLUEgQ09ORiAyPi9kZXYvbnVsbCB8fCB7CisJCSMgQXNzb2NpYXRpdmUgYXJyYXlzIGlzIG5vdCBhdmFpbGFibGUKKwkJbG9jYWwgcworCQlmb3IgcyBpbiAkKGN1dCAtZjEgLWQvICIkY29uZmlnX3ZhbHVlcyIgfCBzb3J0IHwgdW5pcSk7IGRvCisJCQllY2hvICIkcyB7IgorCQkJbG9jYWwgaworCQkJZm9yIGsgaW4gJChncmVwIF4iJHMiLyAiJGNvbmZpZ192YWx1ZXMiIHwgY3V0IC1mMSAtZD0gfCBzZWQgLWUgJ3MsICokLCwnIHwgc29ydCB8IHVuaXEpOyBkbworCQkJCWdyZXAgIl4kayIgIiRjb25maWdfdmFsdWVzIiB8IHRhaWwgLW4gMSB8IHNlZCAtZSAicyxeJHMvLAkgLCIKKwkJCWRvbmUKKwkJCWVjaG8gIn0iCisJCQllY2hvCisJCWRvbmUgfCB0ZWUgIiRjb25maWciIHwgc2VkIC1lICJzLF4sIyMgTFZNQ09ORjogLCIKKwkJcmV0dXJuIDAKKwl9CisKKwlsb2NhbCBzZWMKKwlsb2NhbCBsYXN0X3NlYworCisJIyByZWFkIHNlcXVlbnRpYWwgbGlzdCBhbmQgcHV0IGludG8gYXNzb2NpYXRpdmUgYXJyYXkKKwl3aGlsZSBJRlM9JElGU19OTCByZWFkIC1yIHY7IGRvCisJCSMgdHJpbSB3aGl0ZS1zcGFjZS1jaGFycyB2aWEgZWNobyB3aGVuIGluc2VydGluZworCQlDT05GWyQoZWNobyAke3YlJVs9e10qfSldPSR7diMqL30KKwlkb25lIDwgIiRjb25maWdfdmFsdWVzIgorCisJIyBzb3J0IGJ5IHNlY3Rpb24gYW5kIGl0ZXJhdGUgdGhyb3VnaCB0aGVtCisJcHJpbnRmICIlc1xuIiAkeyFDT05GW0BdfSB8IHNvcnQgfCB3aGlsZSByZWFkIC1yIHYgOyBkbworCQlzZWM9JHt2JSUvKn0gIyBzcGxpdCBvbiBzZWN0aW9uJy8ncGFyYW1fbmFtZQorCQl0ZXN0ICIkc2VjIiA9ICIkbGFzdF9zZWMiIHx8IHsKKwkJCXRlc3QgLXogIiRsYXN0X3NlYyIgfHwgZWNobyAifSIKKwkJCWVjaG8gIiRzZWMgeyIKKwkJCWxhc3Rfc2VjPSRzZWMKKwkJfQorCQllY2hvICIgICAgJHtDT05GWyR2XX0iCisJZG9uZSA+ICIkY29uZmlnIgorCWVjaG8gIn0iID4+ICIkY29uZmlnIgorCisJc2VkIC1lICJzLF4sIyMgTFZNQ09ORjogLCIgIiRjb25maWciCit9CisKK2x2bWNvbmYoKSB7CisJdW5zZXQgcHJvZmlsZV9uYW1lCisJZ2VuZXJhdGVfY29uZmlnICIkQCIKKwltdiAtZiBDT05GSUcgZXRjL2x2bS5jb25mCit9CisKK3Byb2ZpbGVjb25mKCkgeworCXByb2ZpbGVfbmFtZT0iJDEiCisJc2hpZnQKKwlnZW5lcmF0ZV9jb25maWcgIiRAIgorCW1rZGlyIC1wIGV0Yy9wcm9maWxlCisJbXYgLWYgIlBST0ZJTEVfJHByb2ZpbGVfbmFtZSIgImV0Yy9wcm9maWxlLyRwcm9maWxlX25hbWUucHJvZmlsZSIKK30KKworcHJlcGFyZV9wcm9maWxlcygpIHsKKwlta2RpciAtcCBldGMvcHJvZmlsZQorCWZvciBwcm9maWxlX25hbWUgaW4gJEA7IGRvCisJCXRlc3QgLUwgImxpYi8kcHJvZmlsZV9uYW1lLnByb2ZpbGUiIHx8IHNraXAKKwkJY3AgImxpYi8kcHJvZmlsZV9uYW1lLnByb2ZpbGUiICJldGMvcHJvZmlsZS8kcHJvZmlsZV9uYW1lLnByb2ZpbGUiCisJZG9uZQorfQorCithcGl0ZXN0KCkgeworCXRlc3QgLXggIiRURVNUT0xEUFdEL2FwaS8kMS50IiB8fCBza2lwCisJIiRURVNUT0xEUFdEL2FwaS8kMS50IiAiJHtAOjJ9IiAmJiBybSAtZiBkZWJ1Zy5sb2cgc3RyYWNlLmxvZworfQorCittaXJyb3JfcmVjb3Zlcnlfd29ya3MoKSB7CisJY2FzZSAiJCh1bmFtZSAtcikiIGluCisJICAzLjMuNC01LmZjMTcuaTY4NnwzLjMuNC01LmZjMTcueDg2XzY0KSByZXR1cm4gMSA7OworCWVzYWMKK30KKworcmFpZDQ1Nl9yZXBsYWNlX3dvcmtzKCkgeworIyBUaGUgd2F5IGttZW1fY2FjaGUgYWxpYXNpbmcgaXMgZG9uZSBpbiB0aGUga2VybmVsIGlzIGJyb2tlbi4KKyMgSXQgY2F1c2VzIFJBSUQgNC81LzYgdGVzdHMgdG8gZmFpbC4KKyMKKyMgVGhlIHByb2JsZW0gd2l0aCBrbWVtX2NhY2hlKiBpcyB0aGlzOgorIyAqKSBBc3N1bWUgQ09ORklHX1NMVUIgaXMgc2V0CisjIDEpIGttZW1fY2FjaGVfY3JlYXRlKG5hbWU9ImZvby1hIikKKyMgLSBjcmVhdGVzIG5ldyBrbWVtX2NhY2hlIHN0cnVjdHVyZQorIyAyKSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lPSJmb28tYiIpCisjIC0gSWYgaWRlbnRpY2FsIGNhY2hlIGNoYXJhY3RlcmlzdGljcywgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXNseQorIyAgIGNyZWF0ZWQgY2FjaGUgYXNzb2NpYXRlZCB3aXRoICJmb28tYSIuICBUaGUgY2FjaGUncyByZWZjb3VudCB3aWxsIGJlCisjICAgaW5jcmVtZW50ZWQgYW5kIGFuIGFsaWFzIHdpbGwgYmUgY3JlYXRlZCB2aWEgc3lzZnNfc2xhYl9hbGlhcygpLgorIyAzKSBrbWVtX2NhY2hlX2Rlc3Ryb3koPHB0cj4pCisjIC0gQXR0ZW1wdGluZyB0byBkZXN0cm95IGNhY2hlIGFzc29jaWF0ZWQgd2l0aCAiZm9vLWEiLCBidXQgaW5zdGVhZCB0aGUKKyMgICByZWZjb3VudCBpcyBzaW1wbHkgZGVjcmVtZW50ZWQuICBJIGRvbid0IGV2ZW4gdGhpbmsgdGhlIHN5c2ZzIGFsaWFzZXMgYXJlCisjICAgZXZlciByZW1vdmVkLi4uCisjIDQpIGttZW1fY2FjaGVfY3JlYXRlKG5hbWU9ImZvby1hIikKKyMgLSBUaGlzIEZBSUxTIGJlY2F1c2Uga21lbV9jYWNoZV9zYW5pdHlfY2hlY2sgY29saWRlcyB3aXRoIHRoZSBleGlzdGluZworIyAgIG5hbWUgKCJmb28tYSIpIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9uLXJlbW92ZWQgY2FjaGUuCisjCisjIFRoaXMgaXMgYSBwcm9ibGVtIGZvciBSQUlEIChzcGVjaWZpY2FsbHkgZG0tcmFpZCkgYmVjYXVzZSB0aGUgbmFtZSB1c2VkCisjIGZvciB0aGUga21lbV9jYWNoZV9jcmVhdGUgaXMgKCJyYWlkJWQtJXAiLCBsZXZlbCwgbWRkZXYpLiAgSWYgdGhlIGNhY2hlCisjIHBlcnNpc3RzIGZvciBsb25nIGVub3VnaCwgdGhlIG1lbW9yeSBhZGRyZXNzIG9mIGFuIG9sZCBtZGRldiB3aWxsIGJlCisjIHJldXNlZCBmb3IgYSBuZXcgbWRkZXYgLSBjYXVzaW5nIGFuIGlkZW50aWNhbCBmb3JtdWxhdGlvbiBvZiB0aGUgY2FjaGUKKyMgbmFtZS4gIEV2ZW4gdGhvdWdoIGttZW1fY2FjaGVfZGVzdG9yeSBoYWQgbG9uZyBhZ28gYmVlbiB1c2VkIHRvIGRlbGV0ZQorIyB0aGUgb2xkIGNhY2hlLCB0aGUgbWVyZ2luZyBvZiBjYWNoZXMgaGFzIGNhdXNlIHRoZSBuYW1lIGFuZCBjYWNoZSBvZiB0aGF0CisjIG9sZCBpbnN0YW5jZSB0byBiZSBwcmVzZXJ2ZWQgYW5kIGNhdXNlcyBhIGNvbGlzaW9uIChhbmQgdGh1cyBmYWlsdXJlKSBpbgorIyBrbWVtX2NhY2hlX2NyZWF0ZSgpLiAgSSBzZWUgdGhpcyByZWd1bGFybHkgaW4gdGVzdGluZyB0aGUgZm9sbG93aW5nCisjIGtlcm5lbHM6CisjCisjIFRoaXMgc2VlbXMgdG8gYmUgZmluYWx5IHJlc29sdmVkIHdpdGggdGhpcyBwYXRjaDoKKyMgaHR0cDovL3d3dy5yZWRoYXQuY29tL2FyY2hpdmVzL2RtLWRldmVsLzIwMTQtTWFyY2gvbXNnMDAwMDguaHRtbAorIyBzbyB3ZSBuZWVkIHRvIHB1dCBoZXJlIGV4bHVzaW9uIGZvciBrZXJuZXMgd2hpY2ggZG8gdHJhY2UgU0xVQgorIworCWNhc2UgIiQodW5hbWUgLXIpIiBpbgorCSAgMy42LiouZmMxOC5pNjg2KnwzLjYuKi5mYzE4Lng4Nl82NCkgcmV0dXJuIDEgOzsKKwkgIDMuOS4qLmZjMTkuaTY4Nip8My45LiouZmMxOS54ODZfNjQpIHJldHVybiAxIDs7CisJICAzLjFbMDEyM10uKi5mYzE4Lmk2ODYqfDMuMVswMTIzXS4qLmZjMTgueDg2XzY0KSByZXR1cm4gMSA7OworCSAgMy4xWzAxMjM0XS4qLmZjMTkuaTY4Nip8My4xWzAxMjM0XS4qLmZjMTkueDg2XzY0KSByZXR1cm4gMSA7OworCSAgMy4xWzEyM10uKi5mYzIwLmk2ODYqfDMuMVsxMjNdLiouZmMyMC54ODZfNjQpIHJldHVybiAxIDs7CisJICAzLjE0LiouZmMyMS5pNjg2KnwzLjE0LiouZmMyMS54ODZfNjQpIHJldHVybiAxIDs7CisJICAzLjE1LipyYzYqLmZjMjEuaTY4Nip8My4xNS4qcmM2Ki5mYzIxLng4Nl82NCkgcmV0dXJuIDEgOzsKKwkgIDMuMTYuKnJjNCouZmMyMS5pNjg2KnwzLjE2LipyYzQqLmZjMjEueDg2XzY0KSByZXR1cm4gMSA7OworCWVzYWMKK30KKworIworIyBTb21lIDMyYml0IGtlcm5lbCBjYW5ub3QgcGFzcyBzb21lIGVycm9yaW5nIG1hZ2ljIHdoaWNoIGZvcmNlcworIyB0aGluLXBvb2wgdG8gYmUgZmFsbGluZyBpbnRvIEVycm9yIHN0YXRlLgorIworIyBTa2lwIHRlc3Qgb24gc3VjaCBrZXJuZWxzIChzZWU6IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS8xMzEwNjYxKQorIwordGhpbl9wb29sX2Vycm9yX3dvcmtzXzMyKCkgeworCWNhc2UgIiQodW5hbWUgLXIpIiBpbgorCSAgMi42LjMyLTYxOC4qLmk2ODYpIHJldHVybiAxIDs7CisJICAyLjYuMzItNjIzLiouaTY4NikgcmV0dXJuIDEgOzsKKwkgIDIuNi4zMi01NzMuMVsyOF0uMS5lbDYuaTY4NikgcmV0dXJuIDEgOzsKKwllc2FjCit9CisKK3VkZXZfd2FpdCgpIHsKKwlwZ3JlcCB1ZGV2ID4vZGV2L251bGwgfHwgcmV0dXJuIDAKKwl3aGljaCB1ZGV2YWRtICY+L2Rldi9udWxsIHx8IHJldHVybiAwCisJaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorCQl1ZGV2YWRtIHNldHRsZSAtLWV4aXQtaWYtZXhpc3RzPSIkMSIgfHwgdHJ1ZQorCWVsc2UKKwkJdWRldmFkbSBzZXR0bGUgLS10aW1lb3V0PTE1IHx8IHRydWUKKwlmaQorfQorCisjIHdhaXRfZm9yX3N5bmMgPFZHL0xWPgord2FpdF9mb3Jfc3luYygpIHsKKwlsb2NhbCBpCisJZm9yIGkgaW4gezEuLjEwMH0gOyBkbworCQljaGVjayBpbl9zeW5jICQxICQyICYmIHJldHVybgorCQlzbGVlcCAuMgorCWRvbmUKKworCWVjaG8gIlN5bmMgaXMgdGFraW5nIHRvbyBsb25nIC0gYXNzdW1lIHN0dWNrIgorCXJldHVybiAxCit9CisKKyMgQ2hlY2sgaWYgdGVzdHMgYXJlIHJ1bm5pbmcgb24gNjRiaXQgYXJjaGl0ZWN0dXJlCitjYW5fdXNlXzE2VCgpIHsKKwl0ZXN0ICIkKGdldGNvbmYgTE9OR19CSVQpIiAtZXEgNjQKK30KKworIyBDaGVjayBpZiBtYWpvci5taW5vci5yZXZpc2lvbicgc3RyaW5nIGlzICdhdF9sZWFzdCcKK3ZlcnNpb25fYXRfbGVhc3QoKSB7CisJbG9jYWwgbWFqb3IKKwlsb2NhbCBtaW5vcgorCWxvY2FsIHJldmlzaW9uCisJSUZTPSIuLSIgcmVhZCAtciBtYWpvciBtaW5vciByZXZpc2lvbiA8PDwgIiQxIgorCXNoaWZ0CisKKwl0ZXN0IC16ICIkMSIgJiYgcmV0dXJuIDAKKwl0ZXN0IC1uICIkbWFqb3IiIHx8IHJldHVybiAxCisJdGVzdCAiJG1ham9yIiAtZ3QgIiQxIiAmJiByZXR1cm4gMAorCXRlc3QgIiRtYWpvciIgLWVxICIkMSIgfHwgcmV0dXJuIDEKKworCXRlc3QgLXogIiQyIiAmJiByZXR1cm4gMAorCXRlc3QgLW4gIiRtaW5vciIgfHwgcmV0dXJuIDEKKwl0ZXN0ICIkbWlub3IiIC1ndCAiJDIiICYmIHJldHVybiAwCisJdGVzdCAiJG1pbm9yIiAtZXEgIiQyIiB8fCByZXR1cm4gMQorCisJdGVzdCAteiAiJDMiICYmIHJldHVybiAwCisJdGVzdCAiJHJldmlzaW9uIiAtZ2UgIiQzIiAyPi9kZXYvbnVsbCB8fCByZXR1cm4gMQorfQorIworIyBDaGVjayB3aGV0ZXIga2VybmVsIFtkbSBtb2R1bGVdIHRhcmdldCBleGlzdAorIyBhdCBsZWFzdCBpbiBleHBlY3RlZCB2ZXJzaW9uCisjCisjIFtkbS1ddGFyZ2V0LW5hbWUgbWFqb3IgbWlub3IgcmV2aXNpb24KKyMKKyMgaS5lLiAgIGRtX3RhcmdldF9hdF9sZWFzdCAgZG0tdGhpbi1wb29sICAxIDAKK3RhcmdldF9hdF9sZWFzdCgpIHsKKwlybSAtZiBkZWJ1Zy5sb2cgc3RyYWNlLmxvZworCWNhc2UgIiQxIiBpbgorCSAgZG0tKikgbW9kcHJvYmUgIiQxIiB8fCB0cnVlIDs7CisJZXNhYworCisJaWYgdGVzdCAiJDEiID0gZG0tcmFpZDsgdGhlbgorCQljYXNlICIkKHVuYW1lIC1yKSIgaW4KKwkJICAzLjEyLjAqKSByZXR1cm4gMSA7OworCQllc2FjCisJZmkKKworCWxvY2FsIHZlcnNpb249JChkbXNldHVwIHRhcmdldHMgMj4vZGV2L251bGwgfCBncmVwICIkezEjI2RtLX0gIiAyPi9kZXYvbnVsbCkKKwl2ZXJzaW9uPSR7dmVyc2lvbiMjKiB2fQorCisJdmVyc2lvbl9hdF9sZWFzdCAiJHZlcnNpb24iICIke0A6Mn0iIHx8IHsKKwkJZWNobyAiRm91bmQgJDEgdmVyc2lvbiAkdmVyc2lvbiwgYnV0IHJlcXVlc3RlZCAkeyo6Mn0uIiA+JjIKKwkJcmV0dXJuIDEKKwl9Cit9CisKKyMgQ2hlY2sgd2hldGhlciB0aGUga2VybmVsIGRyaXZlciB2ZXJzaW9uIGlzIGdyZWF0ZXIgb3IgZXF1YWwKKyMgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNraXAgdGVzdHMgb24KKyMga2VybmVscyB3aGVyZSB0aGV5IGFyZSBrbm93biB0byBub3QgYmUgc3VwcG9ydGVkLgorIworIyBlLmcuIGRyaXZlcl9hdF9sZWFzdCA0IDMzCisjCitkcml2ZXJfYXRfbGVhc3QoKSB7CisJbG9jYWwgdmVyc2lvbj0kKGRtc2V0dXAgdmVyc2lvbiB8IHRhaWwgLTEgMj4vZGV2L251bGwpCisJdmVyc2lvbj0ke3ZlcnNpb24jIyo6fQorCXZlcnNpb25fYXRfbGVhc3QgIiR2ZXJzaW9uIiAiJEAiIHx8IHsKKwkJZWNobyAiRm91bmQgZHJpdmVyIHZlcnNpb24gJHZlcnNpb24sIGJ1dCByZXF1ZXN0ZWQgJEAuIiA+JjIKKwkJcmV0dXJuIDEKKwl9Cit9CisKK2hhdmVfdGhpbigpIHsKKwl0ZXN0ICIkVEhJTiIgPSBzaGFyZWQgLW8gIiRUSElOIiA9IGludGVybmFsIHx8IHsKKwkJZWNobyAiVGhpbiBpcyBub3QgYnVpbHQtaW4uIiA+JjIKKwkJcmV0dXJuIDE7CisJfQorCXRhcmdldF9hdF9sZWFzdCBkbS10aGluLXBvb2wgIiRAIgorCisJZGVjbGFyZSAtYSBDT05GCisJIyBkaXNhYmxlIHRoaW5fY2hlY2sgaWYgbm90IHByZXNlbnQgaW4gc3lzdGVtCisJaWYgdGVzdCAtbiAiJExWTV9URVNUX1RISU5fQ0hFQ0tfQ01EIiAtYSAhIC14ICIkTFZNX1RFU1RfVEhJTl9DSEVDS19DTUQiIDsgdGhlbgorCQlDT05GWzBdPSJnbG9iYWwvdGhpbl9jaGVja19leGVjdXRhYmxlID0gXCJcIiIKKwlmaQorCWlmIHRlc3QgLW4gIiRMVk1fVEVTVF9USElOX0RVTVBfQ01EIiAtYSAhIC14ICIkTFZNX1RFU1RfVEhJTl9EVU1QX0NNRCIgOyB0aGVuCisJCUNPTkZbMV09Imdsb2JhbC90aGluX2R1bXBfZXhlY3V0YWJsZSA9IFwiXCIiCisJZmkKKwlpZiB0ZXN0IC1uICIkTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EIiAtYSAhIC14ICIkTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EIiA7IHRoZW4KKwkJQ09ORlsyXT0iZ2xvYmFsL3RoaW5fcmVwYWlyX2V4ZWN1dGFibGUgPSBcIlwiIgorCWZpCisJaWYgdGVzdCAkeyNDT05GW0BdfSAtbmUgMCA7IHRoZW4KKwkJZWNobyAiVEVTVCBXQVJOSU5HOiBSZWNvbmZpZ3VyaW5nICR7Q09ORltAXX0iCisJCWx2bWNvbmYgIiR7Q09ORltAXX0iCisJZmkKK30KKworaGF2ZV9yYWlkKCkgeworCXRlc3QgIiRSQUlEIiA9IHNoYXJlZCAtbyAiJFJBSUQiID0gaW50ZXJuYWwgfHwgeworCQllY2hvICJSYWlkIGlzIG5vdCBidWlsdC1pbi4iID4mMgorCQlyZXR1cm4gMTsKKwl9CisJdGFyZ2V0X2F0X2xlYXN0IGRtLXJhaWQgIiRAIgorCisJIyBzb21lIGtlcm5lbHMgaGF2ZSBicm9rZW4gbWRyYWlkIGJpdG1hcHMsIGRvbid0IHVzZSB0aGVtIQorCSMgbWF5IG9vcHMga2VybmVsLCB3ZSBrbm93IGZvciBzdXJlIGFsbCBGQzI0IGFyZSBjdXJyZW50bHkgYnJva2VuCisJIyBpbiBnZW5lcmFsIGFueSA0LjEsIDQuMiBpcyBsaWtlbHkgdXNlbGVzcyB1bmxlc3MgcGF0Y2hlZAorCWNhc2UgIiQodW5hbWUgLXIpIiBpbgorCSAgNC5bMTJdLipmYzI0KikgcmV0dXJuIDEgOzsKKwllc2FjCit9CisKK2hhdmVfY2FjaGUoKSB7CisJdGVzdCAiJENBQ0hFIiA9IHNoYXJlZCAtbyAiJENBQ0hFIiA9IGludGVybmFsIHx8IHsKKwkJZWNobyAiQ2FjaGUgaXMgbm90IGJ1aWx0LWluLiIgPiYyCisJCXJldHVybiAxOworCX0KKwl0YXJnZXRfYXRfbGVhc3QgZG0tY2FjaGUgIiRAIgorCisJZGVjbGFyZSAtYSBDT05GCisJIyBkaXNhYmxlIGNhY2hlX2NoZWNrIGlmIG5vdCBwcmVzZW50IGluIHN5c3RlbQorCWlmIHRlc3QgLW4gIiRMVk1fVEVTVF9DQUNIRV9DSEVDS19DTUQiIC1hICEgLXggIiRMVk1fVEVTVF9DQUNIRV9DSEVDS19DTUQiIDsgdGhlbgorCQlDT05GWzBdPSJnbG9iYWwvY2FjaGVfY2hlY2tfZXhlY3V0YWJsZSA9IFwiXCIiCisJZmkKKwlpZiB0ZXN0IC1uICIkTFZNX1RFU1RfQ0FDSEVfRFVNUF9DTUQiIC1hICEgLXggIiRMVk1fVEVTVF9DQUNIRV9EVU1QX0NNRCIgOyB0aGVuCisJCUNPTkZbMV09Imdsb2JhbC9jYWNoZV9kdW1wX2V4ZWN1dGFibGUgPSBcIlwiIgorCWZpCisJaWYgdGVzdCAtbiAiJExWTV9URVNUX0NBQ0hFX1JFUEFJUl9DTUQiIC1hICEgLXggIiRMVk1fVEVTVF9DQUNIRV9SRVBBSVJfQ01EIiA7IHRoZW4KKwkJQ09ORlsyXT0iZ2xvYmFsL2NhY2hlX3JlcGFpcl9leGVjdXRhYmxlID0gXCJcIiIKKwlmaQorCWlmIHRlc3QgJHsjQ09ORltAXX0gLW5lIDAgOyB0aGVuCisJCWVjaG8gIlRFU1QgV0FSTklORzogUmVjb25maWd1cmluZyAke0NPTkZbQF19IgorCQlsdm1jb25mICIke0NPTkZbQF19IgorCWZpCit9CisKK2hhdmVfdG9vbF9hdF9sZWFzdCgpIHsKKwlsb2NhbCB2ZXJzaW9uPSQoJDEgLVYgMj4vZGV2L251bGwpCisJdmVyc2lvbj0ke3ZlcnNpb24lJS0qfQorCXNoaWZ0CisKKwl2ZXJzaW9uX2F0X2xlYXN0ICIkdmVyc2lvbiIgIiRAIgorfQorCisjIGNoZWNrIGlmIGx2bSBzaGVsbCBpcyBidWlsZC1pbiAgKG5lZWRzIHJlYWRsaW5lKQoraGF2ZV9yZWFkbGluZSgpIHsKKwllY2hvIHZlcnNpb24gfCBsdm0gJj4vZGV2L251bGwKK30KKworZG1zZXR1cF93cmFwcGVkKCkgeworCXVkZXZfd2FpdAorCWRtc2V0dXAgIiRAIgorfQorCithd2tfcGFyc2VfaW5pdF9jb3VudF9pbl9sdm1wb2xsZF9kdW1wKCkgeworCXByaW50ZiAnJXMnIFwKKwlcCisJJCdCRUdJTkZJTEUgeyB4PTA7IGFuc3c9MDsgRlM9Ij0iOyBrZXk9IltbOnNwYWNlOl1dKiJ2a2V5IH0nIFwKKwkkJ3snIFwKKwkJJCdpZiAoLy4qeyQvKSB7IHgrKyB9JyBcCisJCSQnZWxzZSBpZiAoLy4qfSQvKSB7IHgtLSB9JyBcCisJCSQnZWxzZSBpZiAoIHggPT0gMiAmJiAkMSB+IGtleSkgeyB2YWx1ZT1zdWJzdHIoJDIsIDIpOyB2YWx1ZT1zdWJzdHIodmFsdWUsIDEsIGxlbmd0aCh2YWx1ZSkgLSAxKTsgfScgXAorCQkkJ2lmICggeCA9PSAyICYmIHZhbHVlID09IHZ2YWx1ZSAmJiAkMSB+IC9bWzpzcGFjZTpdXSppbml0X3JlcXVlc3RzX2NvdW50LykgeyBhbnN3PSQyIH0nIFwKKwkJJCdpZiAoYW5zdyA+IDApIHsgZXhpdCAwIH0nIFwKKwkkJ30nIFwKKwkkJ0VORCB7IHByaW50ZiAiJWQiLCBhbnN3IH0nCit9CisKK2NoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQoKSB7CisJbG9jYWwgcmV0PSQoYXdrIC12IHZ2YWx1ZT0iJDIiIC12IHZrZXk9JHszOi1sdm5hbWV9ICIkKGF3a19wYXJzZV9pbml0X2NvdW50X2luX2x2bXBvbGxkX2R1bXApIiBsdm1wb2xsZF9kdW1wLnR4dCkKKwl0ZXN0ICRyZXQgLWVxICQxIHx8IHsKKwkJZWNobyAiY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCBmYWlsZWQuIEV4cGVjdGVkICQxLCBnb3QgJHJldCIKKwkJcmV0dXJuIDEKKwl9Cit9CisKK3dhaXRfcHZtb3ZlX2x2X3JlYWR5KCkgeworCSMgZ2l2ZW4gc2xlZXAgLjEgdGhpcyBpcyBhYm91dCA2MCBzZWNzIG9mIHdhaXRpbmcKKwlsb2NhbCByZXRyaWVzPSR7MjotMzAwfQorCisJaWYgWyAtZSBMT0NBTF9MVk1QT0xMRCBdOyB0aGVuCisJCWxvY2FsIGx2aWQKKwkJd2hpbGUgOiA7IGRvCisJCQl0ZXN0ICRyZXRyaWVzIC1sZSAwICYmIGRpZSAiV2FpdGluZyBmb3IgbHZtcG9sbGQgdGltZWQgb3V0IgorCQkJdGVzdCAtbiAiJGx2aWQiIHx8IHsKKwkJCQlsdmlkPSQoZ2V0IGx2X2ZpZWxkICR7MS8vLS9cL30gdmdfdXVpZCxsdl91dWlkIC1hIDI+L2Rldi9udWxsKQorCQkJCWx2aWQ9JHtsdmlkLy9cIC99CisJCQkJbHZpZD0ke2x2aWQvLy0vfQorCQkJfQorCQkJdGVzdCAteiAiJGx2aWQiIHx8IHsKKwkJCQlsdm1wb2xsZF9kdW1wID4gbHZtcG9sbGRfZHVtcC50eHQKKwkJCQkhIGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAkbHZpZCBsdmlkIHx8IGJyZWFrOworCQkJfQorCQkJc2xlZXAgLjEKKwkJCXJldHJpZXM9JCgocmV0cmllcy0xKSkKKwkJZG9uZQorCWVsc2UKKwkJd2hpbGUgOiA7IGRvCisJCQl0ZXN0ICRyZXRyaWVzIC1sZSAwICYmIGRpZSAiV2FpdGluZyBmb3IgcHZtb3ZlIExWIHRvIGdldCBhY3RpdmF0ZWQgaGFzIHRpbWVkIG91dCIKKwkJCWRtc2V0dXAgaW5mbyAtYyAtbyB0YWJsZXNfbG9hZGVkICQxID4gb3V0IDI+L2Rldi9udWxsfHwgdHJ1ZTsKKwkJCW5vdCBncmVwIExpdmUgb3V0ID4vZGV2L251bGwgfHwgYnJlYWsKKwkJCXNsZWVwIC4xCisJCQlyZXRyaWVzPSQoKHJldHJpZXMtMSkpCisJCWRvbmUKKwlmaQorfQorCisjIHJldHVybiB0b3RhbCBtZW1vcnkgc2l6ZSBpbiBrQiB1bml0cwordG90YWxfbWVtKCkgeworCXdoaWxlIElGUz0iOiIgcmVhZCAtciBhIGIgOyBkbworCQljYXNlICIkYSIgaW4gTWVtVG90YWwqKSBlY2hvICR7YiUlIGtCfSA7IGJyZWFrIDs7IGVzYWMKKwlkb25lIDwgL3Byb2MvbWVtaW5mbworfQorCitrZXJuZWxfYXRfbGVhc3QoKSB7CisJdmVyc2lvbl9hdF9sZWFzdCAiJCh1bmFtZSAtcikiICIkQCIKK30KKwordGVzdCAteiAiJExWTV9URVNUX0FVWF9UUkFDRSIgfHwgc2V0IC14CisKK3Rlc3QgLWYgREVWSUNFUyAmJiBkZXZzPSQoPCBERVZJQ0VTKQorCitpZiB0ZXN0ICIkMSIgPSBkbXNldHVwOyB0aGVuCisgICAgc2hpZnQKKyAgICBkbXNldHVwX3dyYXBwZWQgIiRAIgorZWxzZQorICAgICIkQCIKK2ZpCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9icmljay1zaGVsbHRlc3QuaCBiL3Rlc3QvbGliL2JyaWNrLXNoZWxsdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODI1M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9icmljay1zaGVsbHRlc3QuaApAQCAtMCwwICsxLDEzMjcgQEAKKy8vIC0qLSBtb2RlOiBDKys7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotCisKKy8qCisgKiBUaGlzIGJyaWNrIGFsbG93cyB5b3UgdG8gYnVpbGQgYSB0ZXN0IHJ1bm5lciBmb3Igc2hlbGwtYmFzZWQgZnVuY3Rpb25hbAorICogdGVzdHMuIEl0IGNvbWVzIHdpdGggZmFpcmx5IGVsYWJvcmF0ZSBmZWF0dXJlcyAoYWx0aG91Z2ggbW9zdCBhcmUgb25seQorICogYXZhaWxhYmxlIG9uIHBvc2l4IHN5c3RlbXMpLCBnZWFyZWQgdG93YXJkIGRpZmZpY3VsdC10by10ZXN0IHNvZnR3YXJlLgorICoKKyAqIEl0IHByb3ZpZGVzIGEgZnVsbC1mZWF0dXJlZCAibWFpbiIgZnVuY3Rpb24gKGJyaWNrOjpzaGVsbHRlc3Q6OnJ1bikgdGhhdCB5b3UKKyAqIGNhbiB1c2UgYXMgYSBkcm9wLWluIHNoZWxsIHRlc3QgcnVubmVyLgorICoKKyAqIEZlYXR1cmVzIGluY2x1ZGU6CisgKiAtIGludGVyYWN0aXZlIGFuZCBiYXRjaC1tb2RlIGV4ZWN1dGlvbgorICogLSBjb2xsZWN0cyB0ZXN0IHJlc3VsdHMgYW5kIHRlc3QgbG9ncyBpbiBhIHNpbXBsZSB0ZXh0LWJhc2VkIGZvcm1hdAorICogLSBtZWFzdXJlcyByZXNvdXJjZSB1c2Ugb2YgaW5kaXZpZHVhbCB0ZXN0cworICogLSBydWdnZWQ6IHN1aXRlZCBmb3IgcnVubmluZyBpbiBtb25pdG9yZWQgdmlydHVhbCBtYWNoaW5lcworICogLSBzdXBwb3J0cyB0ZXN0IGZsYXZvdXJpbmcKKyAqLworCisvKgorICogKGMpIDIwMTQgUGV0ciBSb2NrYWkgPG1lQG1vcm5mYWxsLm5ldD4KKyAqIChjKSAyMDE0IFJlZCBIYXQsIEluYy4KKyAqLworCisvKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaWZkZWYgX191bml4CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gLyogcnVzYWdlICovCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL2tsb2cuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorCisvKiAgVGltZW91dCBmb3IgdGhlIHdob2xlIHRlc3Qgc3VpdGUgaW4gaG91cnMgKi8KK3N0YXRpYyBjb25zdCB0aW1lX3QgVEVTVF9TVUlURV9USU1FT1VUID0gNDsKKworI2lmbmRlZiBCUklDS19TSEVMTFRFU1RfSAorI2RlZmluZSBCUklDS19TSEVMTFRFU1RfSAorCituYW1lc3BhY2UgYnJpY2sgeworbmFtZXNwYWNlIHNoZWxsdGVzdCB7CisKKy8qIFRPRE86IHJlbW92ZSB0aGlzIHNlY3Rpb24gaW4gZmF2b3VyIG9mIGJyaWNrLWZpbGVzeXN0ZW0uaCAqLworCitpbmxpbmUgc3RkOjpydW50aW1lX2Vycm9yIHN5c2Vyciggc3RkOjpzdHJpbmcgbXNnLCBzdGQ6OnN0cmluZyBjdHggPSAiIiApIHsKKyAgICByZXR1cm4gc3RkOjpydW50aW1lX2Vycm9yKCBzdGQ6OnN0cmluZyggc3RyZXJyb3IoIGVycm5vICkgKSArICIgIiArIG1zZyArICIgIiArIGN0eCApOworfQorCitzdHJ1Y3QgZGlyIHsKKyAgICBESVIgKmQ7CisgICAgZGlyKCBzdGQ6OnN0cmluZyBwICkgeworICAgICAgICBkID0gb3BlbmRpciggcC5jX3N0cigpICk7CisgICAgICAgIGlmICggIWQgKQorICAgICAgICAgICAgdGhyb3cgc3lzZXJyKCAiZXJyb3Igb3BlbmluZyBkaXJlY3RvcnkiLCBwICk7CisgICAgfQorICAgIH5kaXIoKSB7IGNsb3NlZGlyKCBkICk7IH0KK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID4gTGlzdGluZzsKKworaW5saW5lIHZvaWQgZnN5bmNfbmFtZSggc3RkOjpzdHJpbmcgbiApCit7CisgICAgaW50IGZkID0gb3Blbiggbi5jX3N0cigpLCBPX1dST05MWSApOworICAgIGlmICggZmQgPj0gMCApIHsKKyAgICAgICAgZnN5bmMoIGZkICk7CisgICAgICAgIGNsb3NlKCBmZCApOworICAgIH0KK30KKworaW5saW5lIExpc3RpbmcgbGlzdGRpciggc3RkOjpzdHJpbmcgcCwgYm9vbCByZWN1cnNlID0gZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiICkKK3sKKyAgICBMaXN0aW5nIHI7CisKKyAgICBkaXIgZCggcCApOworI2lmICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpIHx8ICgoX19HTElCQ19fID09IDIpICYmIChfX0dMSUJDX01JTk9SX18gPCAyMykpCisgICAgLyogcmVhZGRpcl9yIGlzIGRlcHJlY2F0ZWQgd2l0aCBuZXdlciBHTElCQyAqLworICAgIHN0cnVjdCBkaXJlbnQgZW50cnksICppdGVyID0gMDsKKyAgICB3aGlsZSAoIChlcnJubyA9IHJlYWRkaXJfciggZC5kLCAmZW50cnksICZpdGVyICkpID09IDAgJiYgaXRlciApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5hbWUoIGVudHJ5LmRfbmFtZSApOworI2Vsc2UKKyAgICBzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKyAgICBlcnJubyA9IDA7CisgICAgd2hpbGUgKCAoZW50cnkgPSByZWFkZGlyKCBkLmQgKSkgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVuYW1lKCBlbnRyeS0+ZF9uYW1lICk7CisjZW5kaWYKKworICAgICAgICBpZiAoIGVuYW1lID09ICIuIiB8fCBlbmFtZSA9PSAiLi4iICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICggcmVjdXJzZSApIHsKKyAgICAgICAgICAgIHN0cnVjdCBzdGF0NjQgc3RhdDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBwICsgIi8iICsgZW5hbWU7CisgICAgICAgICAgICBpZiAoIDo6c3RhdDY0KCBzLmNfc3RyKCksICZzdGF0ICkgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBTX0lTRElSKHN0YXQuc3RfbW9kZSkgKSB7CisgICAgICAgICAgICAgICAgTGlzdGluZyBzbCA9IGxpc3RkaXIoIHMsIHRydWUsIHByZWZpeCArIGVuYW1lICsgIi8iICk7CisgICAgICAgICAgICAgICAgZm9yICggTGlzdGluZzo6aXRlcmF0b3IgaSA9IHNsLmJlZ2luKCk7IGkgIT0gc2wuZW5kKCk7ICsraSApCisgICAgICAgICAgICAgICAgICAgIHIucHVzaF9iYWNrKCBwcmVmaXggKyAqaSApOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgci5wdXNoX2JhY2soIHByZWZpeCArIGVuYW1lICk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgci5wdXNoX2JhY2soIGVuYW1lICk7CisgICAgfTsKKworICAgIGlmICggZXJybm8gIT0gMCApCisgICAgICAgIHRocm93IHN5c2VyciggImVycm9yIHJlYWRpbmcgZGlyZWN0b3J5IiwgcCApOworCisgICAgcmV0dXJuIHI7Cit9CisKKy8qIEVORCByZW1vdmUgdGhpcyBzZWN0aW9uICovCisKK3N0cnVjdCBKb3VybmFsIHsKKyAgICBlbnVtIFIgeworICAgICAgICBTVEFSVEVELAorICAgICAgICBSRVRSSUVELAorICAgICAgICBVTktOT1dOLAorICAgICAgICBGQUlMRUQsCisgICAgICAgIElOVEVSUlVQVEVELAorICAgICAgICBLTk9XTkZBSUwsCisgICAgICAgIFBBU1NFRCwKKyAgICAgICAgU0tJUFBFRCwKKyAgICAgICAgVElNRU9VVCwKKyAgICAgICAgV0FSTkVELAorICAgIH07CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0gJm8sIFIgciApIHsKKyAgICAgICAgc3dpdGNoICggciApIHsKKyAgICAgICAgICAgIGNhc2UgU1RBUlRFRDogcmV0dXJuIG8gPDwgInN0YXJ0ZWQiOworICAgICAgICAgICAgY2FzZSBSRVRSSUVEOiByZXR1cm4gbyA8PCAicmV0cmllZCI7CisgICAgICAgICAgICBjYXNlIEZBSUxFRDogcmV0dXJuIG8gPDwgImZhaWxlZCI7CisgICAgICAgICAgICBjYXNlIElOVEVSUlVQVEVEOiByZXR1cm4gbyA8PCAiaW50ZXJydXB0ZWQiOworICAgICAgICAgICAgY2FzZSBQQVNTRUQ6IHJldHVybiBvIDw8ICJwYXNzZWQiOworICAgICAgICAgICAgY2FzZSBTS0lQUEVEOiByZXR1cm4gbyA8PCAic2tpcHBlZCI7CisgICAgICAgICAgICBjYXNlIFRJTUVPVVQ6IHJldHVybiBvIDw8ICJ0aW1lb3V0IjsKKyAgICAgICAgICAgIGNhc2UgV0FSTkVEOiByZXR1cm4gbyA8PCAid2FybmluZ3MiOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG8gPDwgInVua25vd24iOworICAgICAgICB9CisgICAgfQorCisgICAgZnJpZW5kIHN0ZDo6aXN0cmVhbSAmb3BlcmF0b3I+Piggc3RkOjppc3RyZWFtICZpLCBSICZyICkgeworICAgICAgICBzdGQ6OnN0cmluZyB4OworICAgICAgICBpID4+IHg7CisKKyAgICAgICAgciA9IFVOS05PV047CisgICAgICAgIGlmICggeCA9PSAic3RhcnRlZCIgKSByID0gU1RBUlRFRDsKKyAgICAgICAgaWYgKCB4ID09ICJyZXRyaWVkIiApIHIgPSBSRVRSSUVEOworICAgICAgICBpZiAoIHggPT0gImZhaWxlZCIgKSByID0gRkFJTEVEOworICAgICAgICBpZiAoIHggPT0gImludGVycnVwdGVkIiApIHIgPSBJTlRFUlJVUFRFRDsKKyAgICAgICAgaWYgKCB4ID09ICJwYXNzZWQiICkgciA9IFBBU1NFRDsKKyAgICAgICAgaWYgKCB4ID09ICJza2lwcGVkIiApIHIgPSBTS0lQUEVEOworICAgICAgICBpZiAoIHggPT0gInRpbWVvdXQiICkgciA9IFRJTUVPVVQ7CisgICAgICAgIGlmICggeCA9PSAid2FybmluZ3MiICkgciA9IFdBUk5FRDsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQgPgorICAgIGZyaWVuZCBzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4oIHN0ZDo6aXN0cmVhbSAmaSwgc3RkOjpwYWlyPCBTLCBUID4gJnIgKSB7CisgICAgICAgIHJldHVybiBpID4+IHIuZmlyc3QgPj4gci5zZWNvbmQ7CisgICAgfQorCisgICAgdHlwZWRlZiBzdGQ6Om1hcDwgc3RkOjpzdHJpbmcsIFIgPiBTdGF0dXM7CisgICAgU3RhdHVzIHN0YXR1cywgd3JpdHRlbjsKKworICAgIHN0ZDo6c3RyaW5nIGxvY2F0aW9uLCBsaXN0OworICAgIGludCB0aW1lb3V0czsKKworICAgIHZvaWQgYXBwZW5kKCBzdGQ6OnN0cmluZyBwYXRoICkgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIG9mKCBwYXRoLmNfc3RyKCksIHN0ZDo6ZnN0cmVhbTo6YXBwICk7CisgICAgICAgIFN0YXR1czo6aXRlcmF0b3Igd3JpdDsKKyAgICAgICAgZm9yICggU3RhdHVzOjppdGVyYXRvciBpID0gc3RhdHVzLmJlZ2luKCk7IGkgIT0gc3RhdHVzLmVuZCgpOyArK2kgKSB7CisgICAgICAgICAgICB3cml0ID0gd3JpdHRlbi5maW5kKCBpLT5maXJzdCApOworICAgICAgICAgICAgaWYgKCB3cml0ID09IHdyaXR0ZW4uZW5kKCkgfHwgd3JpdC0+c2Vjb25kICE9IGktPnNlY29uZCApCisgICAgICAgICAgICAgICAgb2YgPDwgaS0+Zmlyc3QgPDwgIiAiIDw8IGktPnNlY29uZCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgd3JpdHRlbiA9IHN0YXR1czsKKyAgICAgICAgb2YuY2xvc2UoKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlKCBzdGQ6OnN0cmluZyBwYXRoICkgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIG9mKCBwYXRoLmNfc3RyKCkgKTsKKyAgICAgICAgZm9yICggU3RhdHVzOjppdGVyYXRvciBpID0gc3RhdHVzLmJlZ2luKCk7IGkgIT0gc3RhdHVzLmVuZCgpOyArK2kgKQorICAgICAgICAgICAgb2YgPDwgaS0+Zmlyc3QgPDwgIiAiIDw8IGktPnNlY29uZCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIG9mLmNsb3NlKCk7CisgICAgfQorCisgICAgdm9pZCBzeW5jKCkgeworICAgICAgICBhcHBlbmQoIGxvY2F0aW9uICk7CisgICAgICAgIGZzeW5jX25hbWUoIGxvY2F0aW9uICk7CisgICAgICAgIHdyaXRlICggbGlzdCApOworICAgICAgICBmc3luY19uYW1lKCBsaXN0ICk7CisgICAgfQorCisgICAgdm9pZCBzdGFydGVkKCBzdGQ6OnN0cmluZyBuICkgeworICAgICAgICBpZiAoIHN0YXR1cy5jb3VudCggbiApICYmIHN0YXR1c1sgbiBdID09IFNUQVJURUQgKQorICAgICAgICAgICAgc3RhdHVzWyBuIF0gPSBSRVRSSUVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0dXNbIG4gXSA9IFNUQVJURUQ7CisgICAgICAgIHN5bmMoKTsKKyAgICB9CisKKyAgICB2b2lkIGRvbmUoIHN0ZDo6c3RyaW5nIG4sIFIgciApIHsKKyAgICAgICAgc3RhdHVzWyBuIF0gPSByOworICAgICAgICBpZiAoIHIgPT0gVElNRU9VVCApCisgICAgICAgICAgICArKyB0aW1lb3V0czsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGltZW91dHMgPSAwOworICAgICAgICBzeW5jKCk7CisgICAgfQorCisgICAgYm9vbCBkb25lKCBzdGQ6OnN0cmluZyBuICkgeworICAgICAgICBpZiAoICFzdGF0dXMuY291bnQoIG4gKSApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdGF0dXNbIG4gXSAhPSBTVEFSVEVEICYmIHN0YXR1c1sgbiBdICE9IElOVEVSUlVQVEVEOworICAgIH0KKworICAgIGludCBjb3VudCggUiByICkgeworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGZvciAoIFN0YXR1czo6aXRlcmF0b3IgaSA9IHN0YXR1cy5iZWdpbigpOyBpICE9IHN0YXR1cy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgIGlmICggaS0+c2Vjb25kID09IHIgKQorICAgICAgICAgICAgICAgICsrIGM7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIHZvaWQgYmFubmVyKCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8ICIjIyMgIiA8PCBzdGF0dXMuc2l6ZSgpIDw8ICIgdGVzdHM6ICIKKyAgICAgICAgICAgICAgICAgIDw8IGNvdW50KCBQQVNTRUQgKSA8PCAiIHBhc3NlZCwgIgorICAgICAgICAgICAgICAgICAgPDwgY291bnQoIFNLSVBQRUQgKSA8PCAiIHNraXBwZWQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGNvdW50KCBUSU1FT1VUICkgPDwgIiB0aW1lZCBvdXQsICIgPDwgY291bnQoIFdBUk5FRCApIDw8ICIgd2FybmVkLCAiCisgICAgICAgICAgICAgICAgICA8PCBjb3VudCggRkFJTEVEICkgPDwgIiBmYWlsZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICB2b2lkIGRldGFpbHMoKSB7CisgICAgICAgIGZvciAoIFN0YXR1czo6aXRlcmF0b3IgaSA9IHN0YXR1cy5iZWdpbigpOyBpICE9IHN0YXR1cy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgIGlmICggaS0+c2Vjb25kICE9IFBBU1NFRCApCisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGktPnNlY29uZCA8PCAiOiAiIDw8IGktPmZpcnN0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICB2b2lkIHJlYWQoIHN0ZDo6c3RyaW5nIG4gKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gaWZzKCBuLmNfc3RyKCkgKTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OmlzdHJlYW1faXRlcmF0b3I8IHN0ZDo6cGFpcjwgc3RkOjpzdHJpbmcsIFIgPiA+IEl0OworICAgICAgICBmb3IgKCBJdCBpKCBpZnMgKTsgaSAhPSBJdCgpOyArK2kgKQorICAgICAgICAgICAgc3RhdHVzWyBpLT5maXJzdCBdID0gaS0+c2Vjb25kOworICAgIH0KKworICAgIHZvaWQgcmVhZCgpIHsgcmVhZCggbG9jYXRpb24gKTsgfQorCisgICAgSm91cm5hbCggc3RkOjpzdHJpbmcgZGlyICkKKyAgICAgICAgOiBsb2NhdGlvbiggZGlyICsgIi9qb3VybmFsIiApLAorICAgICAgICAgIGxpc3QoIGRpciArICIvbGlzdCIgKSwKKyAgICAgICAgICB0aW1lb3V0cyggMCApCisgICAge30KK307CisKK3N0cnVjdCBUaW1lZEJ1ZmZlciB7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8IHRpbWVfdCwgc3RkOjpzdHJpbmcgPiBMaW5lOworCisgICAgc3RkOjpkZXF1ZTwgTGluZSA+IGRhdGE7CisgICAgTGluZSBpbmNvbXBsZXRlOworICAgIGJvb2wgc3RhbXA7CisKKyAgICBMaW5lIHNoaWZ0KCBib29sIGZvcmNlID0gZmFsc2UgKSB7CisgICAgICAgIExpbmUgcmVzdWx0ID0gc3RkOjptYWtlX3BhaXIoIDAsICIiICk7CisgICAgICAgIGlmICggZm9yY2UgJiYgZGF0YS5lbXB0eSgpICkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCggcmVzdWx0LCBpbmNvbXBsZXRlICk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gZGF0YS5mcm9udCgpOworICAgICAgICAgICAgZGF0YS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZvaWQgcHVzaCggc3RkOjpzdHJpbmcgYnVmICkgeworICAgICAgICB0aW1lX3Qgbm93ID0gc3RhbXAgPyB0aW1lKCAwICkgOiAwOworICAgICAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgYiA9IGJ1Zi5iZWdpbigpLCBlID0gYnVmLmJlZ2luKCk7CisKKyAgICAgICAgd2hpbGUgKCBlICE9IGJ1Zi5lbmQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGUgPSBzdGQ6OmZpbmQoIGIsIGJ1Zi5lbmQoKSwgJ1xuJyApOworICAgICAgICAgICAgaW5jb21wbGV0ZS5zZWNvbmQgKz0gc3RkOjpzdHJpbmcoIGIsIGUgKTsKKworICAgICAgICAgICAgaWYgKCAhaW5jb21wbGV0ZS5maXJzdCApCisgICAgICAgICAgICAgICAgaW5jb21wbGV0ZS5maXJzdCA9IG5vdzsKKworICAgICAgICAgICAgaWYgKCBlICE9IGJ1Zi5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICBpbmNvbXBsZXRlLnNlY29uZCArPSAiXG4iOworICAgICAgICAgICAgICAgIGRhdGEucHVzaF9iYWNrKCBpbmNvbXBsZXRlICk7CisgICAgICAgICAgICAgICAgaWYgKGluY29tcGxldGUuc2Vjb25kWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRpbWluZyBiZXR3ZWVuICcjIyAwIFNUQUNLVFJBQ0UnICYgJyMjIHRlYXJkb3duJyBrZXl3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW5jb21wbGV0ZS5zZWNvbmQuZmluZCgiIyAwIFNUQUNLVFJBQ0UiLCAxKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wbGV0ZS5zZWNvbmQuZmluZCgiIyB0aW1pbmcgb2ZmIiwgMSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW1wID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY29tcGxldGUuc2Vjb25kLmZpbmQoIiMgdGVhcmRvd24iLCAxKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGxldGUuc2Vjb25kLmZpbmQoIiMgdGltaW5nIG9uIiwgMSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW1wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA9IHRpbWUoIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmNvbXBsZXRlID0gc3RkOjptYWtlX3BhaXIoIG5vdywgIiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSAoZSA9PSBidWYuZW5kKCkgPyBlIDogZSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBlbXB0eSggYm9vbCBmb3JjZSA9IGZhbHNlICkgeworICAgICAgICBpZiAoIGZvcmNlICYmICFpbmNvbXBsZXRlLnNlY29uZC5lbXB0eSgpICkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGRhdGEuZW1wdHkoKTsKKyAgICB9CisKKyAgICBUaW1lZEJ1ZmZlcigpIDogc3RhbXAodHJ1ZSkge30KK307CisKK3N0cnVjdCBTaW5rIHsKKyAgICB2aXJ0dWFsIHZvaWQgb3V0bGluZSggYm9vbCApIHt9CisgICAgdmlydHVhbCB2b2lkIHB1c2goIHN0ZDo6c3RyaW5nIHggKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHN5bmMoIGJvb2wgKSB7fQorICAgIHZpcnR1YWwgflNpbmsoKSB7fQorfTsKKworc3RydWN0IFN1YnN0aXR1dGUgeworICAgIHR5cGVkZWYgc3RkOjptYXA8IHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyA+IE1hcDsKKyAgICBzdGQ6OnN0cmluZyB0ZXN0ZGlyOyAvLyByZXBsYWNlIHRlc3RkaXIgZmlyc3QKKyAgICBzdGQ6OnN0cmluZyBwcmVmaXg7CisKKyAgICBzdGQ6OnN0cmluZyBtYXAoIHN0ZDo6c3RyaW5nIGxpbmUgKSB7CisgICAgICAgIGlmICggc3RkOjpzdHJpbmcoIGxpbmUsIDAsIDkgKSA9PSAiQFRFU1RESVI9IiApCisgICAgICAgICAgICB0ZXN0ZGlyID0gc3RkOjpzdHJpbmcoIGxpbmUsIDksIGxpbmUubGVuZ3RoKCkgLSAxMCApOyAvLyBza2lwIFxuCisgICAgICAgIGVsc2UgaWYgKCBzdGQ6OnN0cmluZyggbGluZSwgMCwgOCApID09ICJAUFJFRklYPSIgKQorICAgICAgICAgICAgcHJlZml4ID0gc3RkOjpzdHJpbmcoIGxpbmUsIDgsIGxpbmUubGVuZ3RoKCkgLSA5ICk7ICAvLyBza2lwIFxuCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG9mZjsKKyAgICAgICAgICAgIGlmICghdGVzdGRpci5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHdoaWxlICggKG9mZiA9IGxpbmUuZmluZCggdGVzdGRpciApKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgIGxpbmUucmVwbGFjZSggb2ZmLCB0ZXN0ZGlyLmxlbmd0aCgpLCAiQFRFU1RESVJAIiApOworCisgICAgICAgICAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHdoaWxlICggKG9mZiA9IGxpbmUuZmluZCggcHJlZml4ICkpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgbGluZS5yZXBsYWNlKCBvZmYsIHByZWZpeC5sZW5ndGgoKSwgIkBQUkVGSVhAIiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KK307CisKK3N0cnVjdCBGb3JtYXQgeworICAgIHRpbWVfdCBzdGFydDsKKyAgICBTdWJzdGl0dXRlIHN1YnN0OworCisgICAgc3RkOjpzdHJpbmcgZm9ybWF0KCBUaW1lZEJ1ZmZlcjo6TGluZSBsICkgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgICAgIGlmICggbC5maXJzdCA+PSBzdGFydCApIHsKKyAgICAgICAgICAgIHRpbWVfdCByZWwgPSBsLmZpcnN0IC0gc3RhcnQ7CisgICAgICAgICAgICByZXN1bHQgPDwgIlsiIDw8IHN0ZDo6c2V0dyggMiApIDw8IHN0ZDo6c2V0ZmlsbCggJyAnICkgPDwgcmVsIC8gNjAKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgc3RkOjpzZXR3KCAyICkgPDwgc3RkOjpzZXRmaWxsKCAnMCcgKSA8PCByZWwgJSA2MCA8PCAiXSAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA8PCBzdWJzdC5tYXAoIGwuc2Vjb25kICk7CisgICAgICAgIHJldHVybiByZXN1bHQuc3RyKCk7CisgICAgfQorCisgICAgRm9ybWF0KCkgOiBzdGFydCggdGltZSggMCApICkge30KK307CisKK3N0cnVjdCBCdWZTaW5rIDogU2luayB7CisgICAgVGltZWRCdWZmZXIgZGF0YTsKKyAgICBGb3JtYXQgZm10OworCisgICAgdmlydHVhbCB2b2lkIHB1c2goIHN0ZDo6c3RyaW5nIHggKSB7CisgICAgICAgIGRhdGEucHVzaCggeCApOworICAgIH0KKworICAgIHZvaWQgZHVtcCggc3RkOjpvc3RyZWFtICZvICkgeworICAgICAgICBvIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgd2hpbGUgKCAhZGF0YS5lbXB0eSggdHJ1ZSApICkKKyAgICAgICAgICAgIG8gPDwgInwgIiA8PCBmbXQuZm9ybWF0KCBkYXRhLnNoaWZ0KCB0cnVlICkgKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRmRTaW5rIDogU2luayB7CisgICAgaW50IGZkOworCisgICAgVGltZWRCdWZmZXIgc3RyZWFtOworICAgIEZvcm1hdCBmbXQ7CisgICAgYm9vbCBraWxsZWQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgb3V0bGluZSggYm9vbCBmb3JjZSApCisgICAgeworICAgICAgICBUaW1lZEJ1ZmZlcjo6TGluZSBsaW5lID0gc3RyZWFtLnNoaWZ0KCBmb3JjZSApOworICAgICAgICBzdGQ6OnN0cmluZyBvdXQgPSBmbXQuZm9ybWF0KCBsaW5lICk7CisgICAgICAgIHdyaXRlKCBmZCwgb3V0LmNfc3RyKCksIG91dC5sZW5ndGgoKSApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzeW5jKCBib29sIGZvcmNlICkgeworICAgICAgICBpZiAoIGtpbGxlZCApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHdoaWxlICggIXN0cmVhbS5lbXB0eSggZm9yY2UgKSApCisgICAgICAgICAgICBvdXRsaW5lKCBmb3JjZSApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBwdXNoKCBzdGQ6OnN0cmluZyB4ICkgeworICAgICAgICBpZiAoICFraWxsZWQgKQorICAgICAgICAgICAgc3RyZWFtLnB1c2goIHggKTsKKyAgICB9CisKKyAgICBGZFNpbmsoIGludCBfZmQgKSA6IGZkKCBfZmQgKSwga2lsbGVkKCBmYWxzZSApIHt9Cit9OworCitzdHJ1Y3QgRmlsZVNpbmsgOiBGZFNpbmsgeworICAgIHN0ZDo6c3RyaW5nIGZpbGU7CisgICAgRmlsZVNpbmsoIHN0ZDo6c3RyaW5nIG4gKSA6IEZkU2luayggLTEgKSwgZmlsZSggbiApIHt9CisKKyAgICB2b2lkIHN5bmMoIGJvb2wgZm9yY2UgKSB7CisgICAgICAgIGlmICggZmQgPCAwICYmICFraWxsZWQgKSB7CisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgICBmZCA9IG9wZW4oIGZpbGUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCApOworI2Vsc2UKKyAgICAgICAgICAgIGZkID0gb3BlbiggZmlsZS5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0ICk7CisgICAgICAgICAgICBpZiAoIGZjbnRsKCBmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyApIDwgMCApCisgICAgICAgICAgICAgICAgcGVycm9yKCJmYWlsZWQgdG8gc2V0IEZEX0NMT0VYRUMgb24gZmlsZSIpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoIGZkIDwgMCApCisgICAgICAgICAgICAgICAga2lsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBGZFNpbms6OnN5bmMoIGZvcmNlICk7CisgICAgfQorCisgICAgfkZpbGVTaW5rKCkgeworICAgICAgICBpZiAoIGZkID49IDAgKSB7CisgICAgICAgICAgICBmc3luYyggZmQgKTsKKyAgICAgICAgICAgIGNsb3NlKCBmZCApOworICAgICAgICB9CisgICAgfQorfTsKKworI2RlZmluZSBCUklDS19TWVNMT0dfQUNUSU9OX1JFQURfQ0xFQVIgICAgIDQKKyNkZWZpbmUgQlJJQ0tfU1lTTE9HX0FDVElPTl9DTEVBUiAgICAgICAgICA1CisKK3N0cnVjdCBTb3VyY2UgeworICAgIGludCBmZDsKKworICAgIHZpcnR1YWwgdm9pZCBzeW5jKCBTaW5rICpzaW5rICkgeworICAgICAgICBzc2l6ZV90IHN6OworICAgICAgICBjaGFyIGJ1ZlsgMTI4ICogMTAyNCBdOworICAgICAgICBpZiAoIChzeiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKSkgPiAwICkKKyAgICAgICAgICAgIHNpbmstPnB1c2goIHN0ZDo6c3RyaW5nKCBidWYsIHN6ICkgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPbiBSSEVMNSBib3ggdGhpcyBjb2RlIGJ1c3ktbG9vcHMgaGVyZSwgd2hpbGUKKyAgICAgICAgICogcGFyZW50IHByb2Nlc3Mgbm8gbG9uZ2VyIHdyaXRlcyBhbnl0aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogVW5jbGVhciB3aHkgJ3NlbGVjdCgpJyBpcyBhbm91bmNpbmcgYXZhaWxhYmxlCisgICAgICAgICAqIGRhdGEsIHdoaWxlIHdlIHJlYWQgMCBieXRlcyB3aXRoIGVycm5vID09IDAuCisgICAgICAgICAqCisgICAgICAgICAqIFRlbXBvcmFyaWx5IHJlc29sdmVkIHdpdGggdXNsZWVwKCkgaW5zdGVhZCBvZiBsb29wLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFzeiAmJiAoIWVycm5vIHx8IGVycm5vID09IEVJTlRSKSkKKyAgICAgICAgICAgIHVzbGVlcCg1MDAwMCk7CisKKyAgICAgICAgaWYgKCBzeiA8IDAgJiYgZXJybm8gIT0gRUFHQUlOICkKKyAgICAgICAgICAgIHRocm93IHN5c2VyciggInJlYWRpbmcgcGlwZSIgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQorCisgICAgdmlydHVhbCBpbnQgZmRfc2V0XyggZmRfc2V0ICpzZXQgKSB7CisgICAgICAgIGlmICggZmQgPj0gMCApIHsKKyAgICAgICAgICAgIEZEX1NFVCggZmQsIHNldCApOworICAgICAgICAgICAgcmV0dXJuIGZkOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBTb3VyY2UoIGludCBfZmQgPSAtMSApIDogZmQoIF9mZCApIHt9CisgICAgdmlydHVhbCB+U291cmNlKCkgeworICAgICAgICBpZiAoIGZkID49IDAgKQorICAgICAgICAgICAgOjpjbG9zZSggZmQgKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRmlsZVNvdXJjZSA6IFNvdXJjZSB7CisgICAgc3RkOjpzdHJpbmcgZmlsZTsKKyAgICBGaWxlU291cmNlKCBzdGQ6OnN0cmluZyBuICkgOiBTb3VyY2UoIC0xICksIGZpbGUoIG4gKSB7fQorCisgICAgaW50IGZkX3NldF8oIDo6ZmRfc2V0ICogKSB7IHJldHVybiAtMTsgfSAvKiByZWFkaW5nIGEgZmlsZSBpcyBhbHdheXMgbm9uLWJsb2NraW5nICovCisgICAgdm9pZCBzeW5jKCBTaW5rICpzICkgeworICAgICAgICBpZiAoIGZkIDwgMCApIHsKKyNpZmRlZiBPX0NMT0VYRUMKKyAgICAgICAgICAgIGZkID0gb3BlbiggZmlsZS5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQyB8IE9fTk9OQkxPQ0sgKTsKKyNlbHNlCisgICAgICAgICAgICBmZCA9IG9wZW4oIGZpbGUuY19zdHIoKSwgT19SRE9OTFkgfCBPX05PTkJMT0NLICk7CisgICAgICAgICAgICBpZiAoIGZjbnRsKCBmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyApIDwgMCApCisgICAgICAgICAgICAgICAgcGVycm9yKCJmYWlsZWQgdG8gc2V0IEZEX0NMT0VYRUMgb24gZmlsZSIpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoIGZkID49IDAgKQorICAgICAgICAgICAgICAgIGxzZWVrKCBmZCwgMCwgU0VFS19FTkQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGZkID49IDAgKQorICAgICAgICAgICAgU291cmNlOjpzeW5jKCBzICk7CisgICAgfQorfTsKKworc3RydWN0IEtNc2cgOiBTb3VyY2UgeworICAgIGJvb2wgY2FuX2NsZWFyOworCisgICAgS01zZygpIDogY2FuX2NsZWFyKCBzdHJjbXAoZ2V0ZW52KCJMVk1fVEVTVF9DQU5fQ0xPQkJFUl9ETUVTRyIpID8gOiAiMCIsICIwIikgKSB7CisjaWZkZWYgX191bml4CisgICAgICAgIGlmICggKGZkID0gb3BlbigiL2Rldi9rbXNnIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLKSkgPCAwICkgeworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkgLyogT2xkZXIga2VybmVscyAoPDMuNSkgZG8gbm90IHN1cHBvcnQgL2Rldi9rbXNnICovCisgICAgICAgICAgICAgICAgcGVycm9yKCJvcGVuaW5nIC9kZXYva21zZyIpOworICAgICAgICAgICAgaWYgKCBrbG9nY3RsKCBCUklDS19TWVNMT0dfQUNUSU9OX0NMRUFSLCAwLCAwICkgPCAwICkKKyAgICAgICAgICAgICAgICBjYW5fY2xlYXIgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChsc2VlayhmZCwgMEwsIFNFRUtfRU5EKSA9PSAob2ZmX3QpIC0xKQorICAgICAgICAgICAgcGVycm9yKCJsc2VlayAvZGV2L2ttc2ciKTsKKyNlbmRpZgorICAgIH0KKworICAgIGJvb2wgZGV2X2ttc2coKSB7CisgICAgICAgIHJldHVybiBmZCA+PSAwOworICAgIH0KKworICAgIHZvaWQgc3luYyggU2luayAqcyApIHsKKyNpZmRlZiBfX3VuaXgKKyAgICAgICAgc3NpemVfdCBzejsKKyAgICAgICAgY2hhciBidWZbIDEyOCAqIDEwMjQgXTsKKworICAgICAgICBpZiAoIGRldl9rbXNnKCkgKSB7CisgICAgICAgICAgICB3aGlsZSAoIChzeiA9IDo6cmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpKSA+IDAgKQorICAgICAgICAgICAgICAgIHMtPnB1c2goIHN0ZDo6c3RyaW5nKCBidWYsIHN6ICkgKTsKKyAgICAgICAgfSBlbHNlIGlmICggY2FuX2NsZWFyICkgeworICAgICAgICAgICAgd2hpbGUgKCAoc3ogPSBrbG9nY3RsKCBCUklDS19TWVNMT0dfQUNUSU9OX1JFQURfQ0xFQVIsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZikgLSAxICkpID4gMCApCisgICAgICAgICAgICAgICAgcy0+cHVzaCggc3RkOjpzdHJpbmcoIGJ1Ziwgc3ogKSApOworICAgICAgICAgICAgaWYgKCBzeiA8IDAgJiYgZXJybm8gPT0gRVBFUk0gKQorICAgICAgICAgICAgICAgIGNhbl9jbGVhciA9IGZhbHNlOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9OworCitzdHJ1Y3QgT2JzZXJ2ZXIgOiBTaW5rIHsKKyAgICBUaW1lZEJ1ZmZlciBzdHJlYW07CisKKyAgICBib29sIHdhcm5pbmdzOworICAgIE9ic2VydmVyKCkgOiB3YXJuaW5ncyggZmFsc2UgKSB7fQorCisgICAgdm9pZCBwdXNoKCBzdGQ6OnN0cmluZyBzICkgeworICAgICAgICBzdHJlYW0ucHVzaCggcyApOworICAgIH0KKworICAgIHZvaWQgc3luYyggYm9vbCBmb3JjZSApIHsKKyAgICAgICAgd2hpbGUgKCAhc3RyZWFtLmVtcHR5KCBmb3JjZSApICkgeworICAgICAgICAgICAgVGltZWRCdWZmZXI6OkxpbmUgbGluZSA9IHN0cmVhbS5zaGlmdCggZm9yY2UgKTsKKyAgICAgICAgICAgIGlmICggbGluZS5zZWNvbmQuZmluZCggIlRFU1QgV0FSTklORyIgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgd2FybmluZ3MgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfTsKKworc3RydWN0IElPIDogU2luayB7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjwgU2luayogPiBTaW5rczsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPCBTb3VyY2UqID4gU291cmNlczsKKworICAgIG11dGFibGUgU2lua3Mgc2lua3M7CisgICAgbXV0YWJsZSBTb3VyY2VzIHNvdXJjZXM7CisKKyAgICBPYnNlcnZlciAqX29ic2VydmVyOworCisgICAgdmlydHVhbCB2b2lkIHB1c2goIHN0ZDo6c3RyaW5nIHggKSB7CisgICAgICAgIGZvciAoIFNpbmtzOjppdGVyYXRvciBpID0gc2lua3MuYmVnaW4oKTsgaSAhPSBzaW5rcy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgICgqaSktPnB1c2goIHggKTsKKyAgICB9CisKKyAgICB2b2lkIHN5bmMoIGJvb2wgZm9yY2UgKSB7CisgICAgICAgIGZvciAoIFNvdXJjZXM6Oml0ZXJhdG9yIGkgPSBzb3VyY2VzLmJlZ2luKCk7IGkgIT0gc291cmNlcy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgICgqaSktPnN5bmMoIHRoaXMgKTsKKworICAgICAgICBmb3IgKCBTaW5rczo6aXRlcmF0b3IgaSA9IHNpbmtzLmJlZ2luKCk7IGkgIT0gc2lua3MuZW5kKCk7ICsraSApCisgICAgICAgICAgICAoKmkpLT5zeW5jKCBmb3JjZSApOworICAgIH0KKworICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGZvciAoIFNvdXJjZXM6Oml0ZXJhdG9yIGkgPSBzb3VyY2VzLmJlZ2luKCk7IGkgIT0gc291cmNlcy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgIGRlbGV0ZSAqaTsKKyAgICAgICAgc291cmNlcy5jbGVhcigpOworICAgIH0KKworICAgIGludCBmZF9zZXRfKCBmZF9zZXQgKnNldCApIHsKKyAgICAgICAgaW50IG1heCA9IC0xOworCisgICAgICAgIGZvciAoIFNvdXJjZXM6Oml0ZXJhdG9yIGkgPSBzb3VyY2VzLmJlZ2luKCk7IGkgIT0gc291cmNlcy5lbmQoKTsgKytpICkKKyAgICAgICAgICAgIG1heCA9IHN0ZDo6bWF4KCAoKmkpLT5mZF9zZXRfKCBzZXQgKSwgbWF4ICk7CisgICAgICAgIHJldHVybiBtYXggKyAxOworICAgIH0KKworICAgIE9ic2VydmVyICZvYnNlcnZlcigpIHsgcmV0dXJuICpfb2JzZXJ2ZXI7IH0KKworICAgIElPKCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIC8qIGEgc3RlYWxpbmcgY29weSBjb25zdHJ1Y3RvciAqLworICAgIElPKCBjb25zdCBJTyAmaW8gKSA6IHNpbmtzKCBpby5zaW5rcyApLCBzb3VyY2VzKCBpby5zb3VyY2VzICksIF9vYnNlcnZlciggaW8uX29ic2VydmVyICkKKyAgICB7CisgICAgICAgIGlvLnNpbmtzLmNsZWFyKCk7CisgICAgICAgIGlvLnNvdXJjZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBJTyAmb3BlcmF0b3I9ICggY29uc3QgSU8gJmlvICkgeworICAgICAgICB0aGlzLT5+SU8oKTsKKyAgICAgICAgcmV0dXJuICpuZXcgKHRoaXMpIElPKCBpbyApOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoIGludCB0b19wdXNoID0gMSApIHsKKyAgICAgICAgZm9yICggU2lua3M6Oml0ZXJhdG9yIGkgPSBzaW5rcy5iZWdpbigpOyBpICE9IHNpbmtzLmVuZCgpOyArK2kgKQorICAgICAgICAgICAgZGVsZXRlICppOworICAgICAgICBzaW5rcy5jbGVhcigpOworICAgICAgICBpZiAoIHRvX3B1c2ggKQorICAgICAgICAgICAgc2lua3MucHVzaF9iYWNrKCBfb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIgKTsKKyAgICB9CisKKyAgICB+SU8oKSB7IGNsb3NlKCk7IGNsZWFyKDApOyB9CisKK307CisKK25hbWVzcGFjZSB7CitwaWRfdCBraWxsX3BpZCA9IDA7Citib29sIGZhdGFsX3NpZ25hbCA9IGZhbHNlOworYm9vbCBpbnRlcnJ1cHQgPSBmYWxzZTsKK30KKworc3RydWN0IE9wdGlvbnMgeworICAgIGJvb2wgdmVyYm9zZSwgYmF0Y2gsIGludGVyYWN0aXZlLCBjb250LCBmYXRhbF90aW1lb3V0cywga21zZzsKKyAgICBzdGQ6OnN0cmluZyB0ZXN0ZGlyLCBvdXRkaXIsIHdvcmtkaXIsIGhlYXJ0YmVhdDsKKyAgICBzdGQ6OnZlY3Rvcjwgc3RkOjpzdHJpbmcgPiBmbGF2b3VycywgZmlsdGVyLCBza2lwLCB3YXRjaDsKKyAgICBzdGQ6OnN0cmluZyBmbGF2b3VyX2VudnZhcjsKKyAgICBpbnQgdGltZW91dDsKKyAgICBPcHRpb25zKCkgOiB2ZXJib3NlKCBmYWxzZSApLCBiYXRjaCggZmFsc2UgKSwgaW50ZXJhY3RpdmUoIGZhbHNlICksCisgICAgICAgICAgICAgICAgY29udCggZmFsc2UgKSwgZmF0YWxfdGltZW91dHMoIGZhbHNlICksIGttc2coIHRydWUgKSwKKyAgICAgICAgICAgICAgICB0aW1lb3V0KCAxODAgKSB7fQorfTsKKworc3RydWN0IFRlc3RQcm9jZXNzCit7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisgICAgYm9vbCBpbnRlcmFjdGl2ZTsKKyAgICBpbnQgZmQ7CisKKyAgICB2b2lkIGV4ZWMoKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSB7CisgICAgICAgIGFzc2VydCggZmQgPj0gMCApOworICAgICAgICBpZiAoICFpbnRlcmFjdGl2ZSApIHsKKyAgICAgICAgICAgIGludCBkZXZudWxsID0gOjpvcGVuKCAiL2Rldi9udWxsIiwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgIGlmICggZGV2bnVsbCA+PSAwICkgeyAvKiBnY2MgcmVhbGx5IGRvZXNuJ3QgbGlrZSB0byBub3QgaGF2ZSBzdGRpbiAqLworICAgICAgICAgICAgICAgIGR1cDIoIGRldm51bGwsIFNURElOX0ZJTEVOTyApOworICAgICAgICAgICAgICAgIGNsb3NlKCBkZXZudWxsICk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjbG9zZSggU1RESU5fRklMRU5PICk7CisgICAgICAgICAgICBkdXAyKCBmZCwgU1RET1VUX0ZJTEVOTyApOworICAgICAgICAgICAgZHVwMiggZmQsIFNUREVSUl9GSUxFTk8gKTsKKyAgICAgICAgICAgIGNsb3NlKCBmZCApOworICAgICAgICB9CisKKyAgICAgICAgc2V0cGdpZCggMCwgMCApOworCisgICAgICAgIGV4ZWNscCggImJhc2giLCAiYmFzaCIsICItbm9wcm9maWxlIiwgIi1ub3JjIiwgZmlsZW5hbWUuY19zdHIoKSwgTlVMTCApOworICAgICAgICBwZXJyb3IoICJleGVjbHAiICk7CisgICAgICAgIF9leGl0KCAyMDIgKTsKKyAgICB9CisKKyAgICBUZXN0UHJvY2Vzcyggc3RkOjpzdHJpbmcgZmlsZSApCisgICAgICAgIDogZmlsZW5hbWUoIGZpbGUgKSwgaW50ZXJhY3RpdmUoIGZhbHNlICksIGZkKCAtMSApCisgICAge30KK307CisKK3N0cnVjdCBUZXN0Q2FzZSB7CisgICAgVGVzdFByb2Nlc3MgY2hpbGQ7CisgICAgc3RkOjpzdHJpbmcgbmFtZSwgZmxhdm91cjsKKyAgICBJTyBpbzsKKyAgICBCdWZTaW5rICppb2J1ZjsKKworICAgIHN0cnVjdCBydXNhZ2UgdXNhZ2U7CisgICAgaW50IHN0YXR1czsKKyAgICBib29sIHRpbWVvdXQ7CisgICAgcGlkX3QgcGlkOworCisgICAgdGltZV90IHN0YXJ0LCBlbmQsIHNpbGVudF9zdGFydCwgbGFzdF91cGRhdGUsIGxhc3RfaGVhcnRiZWF0OworICAgIE9wdGlvbnMgb3B0aW9uczsKKworICAgIEpvdXJuYWwgKmpvdXJuYWw7CisKKyAgICBzdGQ6OnN0cmluZyBwcmV0dHkoKSB7CisgICAgICAgIGlmICggb3B0aW9ucy5iYXRjaCApCisgICAgICAgICAgICByZXR1cm4gZmxhdm91ciArICI6ICIgKyBuYW1lOworICAgICAgICByZXR1cm4gIlsiICsgZmxhdm91ciArICJdICIgKyBuYW1lOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGlkKCkgeworICAgICAgICByZXR1cm4gZmxhdm91ciArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgdm9pZCBwaXBlKCkgeworICAgICAgICBpbnQgZmRzWzJdOworCisgICAgICAgIGlmIChzb2NrZXRwYWlyKCBQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmRzICkpIHsKKyAgICAgICAgICAgIHBlcnJvcigic29ja2V0cGFpciIpOworICAgICAgICAgICAgZXhpdCgyMDEpOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIGlmIChmY250bCggZmRzWzBdLCBGX1NFVEZMLCBPX05PTkJMT0NLICkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiZmNudGwgb24gc29ja2V0Iik7CisgICAgICAgICAgICBleGl0KDIwMik7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlvLnNvdXJjZXMucHVzaF9iYWNrKCBuZXcgU291cmNlKCBmZHNbMF0gKSApOworICAgICAgICBjaGlsZC5mZCA9IGZkc1sxXTsKKyAgICAgICAgY2hpbGQuaW50ZXJhY3RpdmUgPSBvcHRpb25zLmludGVyYWN0aXZlOworICAgIH0KKworICAgIGJvb2wgbW9uaXRvcigpIHsKKyAgICAgICAgZW5kID0gdGltZSggMCApOworCisgICAgICAgIC8qIGhlYXJ0YmVhdCAqLworICAgICAgICBpZiAoIGVuZCAtIGxhc3RfaGVhcnRiZWF0ID49IDIwICYmICFvcHRpb25zLmhlYXJ0YmVhdC5lbXB0eSgpICkgeworICAgICAgICAgICAgc3RkOjpvZnN0cmVhbSBoYiggb3B0aW9ucy5oZWFydGJlYXQuY19zdHIoKSwgc3RkOjpmc3RyZWFtOjphcHAgKTsKKyAgICAgICAgICAgIGhiIDw8ICIuIjsKKyAgICAgICAgICAgIGhiLmNsb3NlKCk7CisgICAgICAgICAgICBmc3luY19uYW1lKCBvcHRpb25zLmhlYXJ0YmVhdCApOworICAgICAgICAgICAgbGFzdF9oZWFydGJlYXQgPSBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHdhaXQ0KHBpZCwgJnN0YXR1cywgV05PSEFORywgJnVzYWdlKSAhPSAwICkgeworICAgICAgICAgICAgaW8uc3luYyggdHJ1ZSApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoga2lsbCBvZmYgdGVzdHMgYWZ0ZXIgYSB0aW1lb3V0IHNpbGVuY2UgKi8KKyAgICAgICAgaWYgKCAhb3B0aW9ucy5pbnRlcmFjdGl2ZSApCisgICAgICAgICAgICBpZiAoIGVuZCAtIHNpbGVudF9zdGFydCA+IG9wdGlvbnMudGltZW91dCApIHsKKyAgICAgICAgICAgICAgICBraWxsKCBwaWQsIFNJR0lOVCApOworICAgICAgICAgICAgICAgIHNsZWVwKCA1ICk7IC8qIHdhaXQgYSBiaXQgZm9yIGEgcmVhY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIHdhaXRwaWQoIHBpZCwgJnN0YXR1cywgV05PSEFORyApID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbSggImVjaG8gdCA+IC9wcm9jL3N5c3JxLXRyaWdnZXIgMj4gL2Rldi9udWxsIiApOworICAgICAgICAgICAgICAgICAgICBraWxsKCAtcGlkLCBTSUdLSUxMICk7CisgICAgICAgICAgICAgICAgICAgIHdhaXRwaWQoIHBpZCwgJnN0YXR1cywgMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpby5zeW5jKCB0cnVlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHdhaXQ7CisgICAgICAgIGZkX3NldCBzZXQ7CisKKyAgICAgICAgRkRfWkVSTyggJnNldCApOworICAgICAgICBpbnQgbmZkcyA9IGlvLmZkX3NldF8oICZzZXQgKTsKKyAgICAgICAgd2FpdC50dl9zZWMgPSAwOworICAgICAgICB3YWl0LnR2X3VzZWMgPSA1MDAwMDA7IC8qIHRpbWVvdXQgMC41cyAqLworCisgICAgICAgIGlmICggIW9wdGlvbnMudmVyYm9zZSAmJiAhb3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiAhb3B0aW9ucy5iYXRjaCApIHsKKyAgICAgICAgICAgIGlmICggZW5kIC0gbGFzdF91cGRhdGUgPj0gMSApIHsKKyAgICAgICAgICAgICAgICBwcm9ncmVzcyggVXBkYXRlICkgPDwgdGFnKCAicnVubmluZyIgKSA8PCBwcmV0dHkoKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kIC0gc3RhcnQgPDwgc3RkOjpmbHVzaDsKKyAgICAgICAgICAgICAgICBsYXN0X3VwZGF0ZSA9IGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIHNlbGVjdCggbmZkcywgJnNldCwgTlVMTCwgTlVMTCwgJndhaXQgKSA+IDAgKSB7CisgICAgICAgICAgICBzaWxlbnRfc3RhcnQgPSBlbmQ7IC8qIHNvbWV0aGluZyBoYXBwZW5lZCAqLworICAgICAgICAgICAgaW8uc3luYyggZmFsc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRpbWVmbXQoIHRpbWVfdCB0ICkgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgdCAvIDYwIDw8ICI6IiA8PCBzdGQ6OnNldHcoIDIgKSA8PCBzdGQ6OnNldGZpbGwoICcwJyApIDw8IHQgJSA2MDsKKyAgICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJ1c2FnZSgpCisgICAgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgdGltZV90IHdhbGwgPSBlbmQgLSBzdGFydCwgdXNlciA9IHVzYWdlLnJ1X3V0aW1lLnR2X3NlYywKKyAgICAgICAgICAgICBzeXN0ZW0gPSB1c2FnZS5ydV9zdGltZS50dl9zZWM7CisgICAgICAgIHNpemVfdCByc3MgPSB1c2FnZS5ydV9tYXhyc3MgLyAxMDI0LAorICAgICAgICAgICAgICAgaW5iID0gdXNhZ2UucnVfaW5ibG9jayAvIDEwMCwKKyAgICAgICAgICAgICAgb3V0YiA9IHVzYWdlLnJ1X291YmxvY2sgLyAxMDA7CisKKyAgICAgICAgc2l6ZV90IGluYl8xMCA9IGluYiAlIDEwLCBvdXRiXzEwID0gb3V0YiAlIDEwOworICAgICAgICBpbmIgLz0gMTA7IG91dGIgLz0gMTA7CisKKyAgICAgICAgc3MgPDwgdGltZWZtdCggd2FsbCApIDw8ICIgd2FsbCAiIDw8IHRpbWVmbXQoIHVzZXIgKSA8PCAiIHVzZXIgIgorICAgICAgICAgICA8PCB0aW1lZm10KCBzeXN0ZW0gKSA8PCAiIHN5cyAgICIgPDwgc3RkOjpzZXR3KCAzICkgPDwgcnNzIDw8ICJNIFJTUyB8ICIKKyAgICAgICAgICAgPDwgIklPUFM6ICIgPDwgc3RkOjpzZXR3KCA1ICkgPDwgaW5iIDw8ICIuIiA8PCBpbmJfMTAgPDwgIksgaW4gIgorICAgICAgICAgICA8PCBzdGQ6OnNldHcoIDUgKSA8PCBvdXRiIDw8ICIuIiA8PCBvdXRiXzEwIDw8ICJLIG91dCI7CisgICAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyB0YWcoIHN0ZDo6c3RyaW5nIG4gKSB7CisgICAgICAgIGlmICggb3B0aW9ucy5iYXRjaCApCisgICAgICAgICAgICByZXR1cm4gIiMjICI7CisgICAgICAgIHNpemVfdCBwYWQgPSBuLmxlbmd0aCgpOworICAgICAgICBwYWQgPSAocGFkIDwgMTIpID8gMTIgLSBwYWQgOiAwOworICAgICAgICByZXR1cm4gIiMjIyAiICsgc3RkOjpzdHJpbmcoIHBhZCwgJyAnICkgKyBuICsgIjogIjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyB0YWcoIEpvdXJuYWw6OlIgciApIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICAgICAgcyA8PCByOworICAgICAgICByZXR1cm4gdGFnKCBzLnN0cigpICk7CisgICAgfQorCisgICAgZW51bSBQIHsgRmlyc3QsIFVwZGF0ZSwgTGFzdCB9OworCisgICAgc3RkOjpvc3RyZWFtICZwcm9ncmVzcyggUCBwID0gTGFzdCApCisgICAgeworICAgICAgICBzdGF0aWMgc3RydWN0IDogc3RkOjpzdHJlYW1idWYge30gYnVmOworICAgICAgICBzdGF0aWMgc3RkOjpvc3RyZWFtIG51bGwoJmJ1Zik7CisKKyAgICAgICAgaWYgKCBvcHRpb25zLmJhdGNoICYmIHAgPT0gRmlyc3QgKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6Y291dDsKKworICAgICAgICBpZiAoIGlzYXR0eSggU1RET1VUX0ZJTEVOTyApICYmICFvcHRpb25zLmJhdGNoICkgeworICAgICAgICAgICAgaWYgKCBwICE9IEZpcnN0ICkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpjb3V0IDw8ICJcciI7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpjb3V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBwID09IExhc3QgKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6Y291dDsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIHBhcmVudCgpCisgICAgeworICAgICAgICA6OmNsb3NlKCBjaGlsZC5mZCApOworICAgICAgICBzZXR1cElPKCk7CisKKyAgICAgICAgam91cm5hbC0+c3RhcnRlZCggaWQoKSApOworICAgICAgICBzaWxlbnRfc3RhcnQgPSBzdGFydCA9IHRpbWUoIDAgKTsKKworICAgICAgICBwcm9ncmVzcyggRmlyc3QgKSA8PCB0YWcoICJydW5uaW5nIiApIDw8IHByZXR0eSgpIDw8IHN0ZDo6Zmx1c2g7CisgICAgICAgIGlmICggb3B0aW9ucy52ZXJib3NlIHx8IG9wdGlvbnMuaW50ZXJhY3RpdmUgKQorICAgICAgICAgICAgcHJvZ3Jlc3MoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgd2hpbGUgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgLyogZW1wdHkgKi8gOworCisgICAgICAgIEpvdXJuYWw6OlIgciA9IEpvdXJuYWw6OlVOS05PV047CisKKyAgICAgICAgaWYgKCB0aW1lb3V0ICkgeworICAgICAgICAgICAgciA9IEpvdXJuYWw6OlRJTUVPVVQ7CisgICAgICAgIH0gZWxzZSBpZiAoIFdJRkVYSVRFRCggc3RhdHVzICkgKSB7CisgICAgICAgICAgICBpZiAoIFdFWElUU1RBVFVTKCBzdGF0dXMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICByID0gSm91cm5hbDo6UEFTU0VEOworICAgICAgICAgICAgZWxzZSBpZiAoIFdFWElUU1RBVFVTKCBzdGF0dXMgKSA9PSAyMDAgKQorICAgICAgICAgICAgICAgIHIgPSBKb3VybmFsOjpTS0lQUEVEOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHIgPSBKb3VybmFsOjpGQUlMRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoIGludGVycnVwdCAmJiBXSUZTSUdOQUxFRCggc3RhdHVzICkgJiYgV1RFUk1TSUcoIHN0YXR1cyApID09IFNJR0lOVCApCisgICAgICAgICAgICByID0gSm91cm5hbDo6SU5URVJSVVBURUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHIgPSBKb3VybmFsOjpGQUlMRUQ7CisKKyAgICAgICAgaWYgKCByID09IEpvdXJuYWw6OlBBU1NFRCAmJiBpby5vYnNlcnZlcigpLndhcm5pbmdzICkKKyAgICAgICAgICAgIHIgPSBKb3VybmFsOjpXQVJORUQ7CisKKyAgICAgICAgaW8uY2xvc2UoKTsKKworICAgICAgICBpZiAoIGlvYnVmICYmICggciA9PSBKb3VybmFsOjpGQUlMRUQgfHwgciA9PSBKb3VybmFsOjpUSU1FT1VUICkgKQorICAgICAgICAgICAgaW9idWYtPmR1bXAoIHN0ZDo6Y291dCApOworCisgICAgICAgIGpvdXJuYWwtPmRvbmUoIGlkKCksIHIgKTsKKworICAgICAgICBpZiAoIG9wdGlvbnMuYmF0Y2ggKSB7CisgICAgICAgICAgICBpbnQgc3BhY2VzID0gc3RkOjptYXgoIDY0IC0gaW50KHByZXR0eSgpLmxlbmd0aCgpKSwgMCApOworICAgICAgICAgICAgcHJvZ3Jlc3MoIExhc3QgKSA8PCAiICIgPDwgc3RkOjpzdHJpbmcoIHNwYWNlcywgJy4nICkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgc3RkOjpsZWZ0IDw8IHN0ZDo6c2V0dyggOSApIDw8IHN0ZDo6c2V0ZmlsbCggJyAnICkgPDwgcjsKKyAgICAgICAgICAgIGlmICggciAhPSBKb3VybmFsOjpTS0lQUEVEICkKKyAgICAgICAgICAgICAgICBwcm9ncmVzcyggRmlyc3QgKSA8PCAiICAgIiA8PCBydXNhZ2UoKTsKKyAgICAgICAgICAgIHByb2dyZXNzKCBMYXN0ICkgPDwgc3RkOjplbmRsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHByb2dyZXNzKCBMYXN0ICkgPDwgdGFnKCByICkgPDwgcHJldHR5KCkgPDwgc3RkOjplbmRsOworCisgICAgICAgIGlvLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICAgIHBpcGUoKTsKKyAgICAgICAgcGlkID0ga2lsbF9waWQgPSBmb3JrKCk7CisgICAgICAgIGlmIChwaWQgPCAwKSB7CisgICAgICAgICAgICBwZXJyb3IoIkZvcmsgZmFpbGVkLiIpOworICAgICAgICAgICAgZXhpdCgyMDEpOworICAgICAgICB9IGVsc2UgaWYgKHBpZCA9PSAwKSB7CisgICAgICAgICAgICBpby5jbG9zZSgpOworICAgICAgICAgICAgY2hkaXIoIG9wdGlvbnMud29ya2Rpci5jX3N0cigpICk7CisgICAgICAgICAgICBpZiAoICFvcHRpb25zLmZsYXZvdXJfZW52dmFyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHNldGVudiggb3B0aW9ucy5mbGF2b3VyX2VudnZhci5jX3N0cigpLCBmbGF2b3VyLmNfc3RyKCksIDEgKTsKKyAgICAgICAgICAgIGNoaWxkLmV4ZWMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXR1cElPKCkgeworICAgICAgICBpb2J1ZiA9IDA7CisgICAgICAgIGlmICggb3B0aW9ucy52ZXJib3NlIHx8IG9wdGlvbnMuaW50ZXJhY3RpdmUgKQorICAgICAgICAgICAgaW8uc2lua3MucHVzaF9iYWNrKCBuZXcgRmRTaW5rKCAxICkgKTsKKyAgICAgICAgZWxzZSBpZiAoICFvcHRpb25zLmJhdGNoICkKKyAgICAgICAgICAgIGlvLnNpbmtzLnB1c2hfYmFjayggaW9idWYgPSBuZXcgQnVmU2luaygpICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbiA9IGlkKCk7CisgICAgICAgIHN0ZDo6cmVwbGFjZSggbi5iZWdpbigpLCBuLmVuZCgpLCAnLycsICdfJyApOworICAgICAgICBzdGQ6OnN0cmluZyBmbiA9IG9wdGlvbnMub3V0ZGlyICsgIi8iICsgbiArICIudHh0IjsKKyAgICAgICAgaW8uc2lua3MucHVzaF9iYWNrKCBuZXcgRmlsZVNpbmsoIGZuICkgKTsKKworICAgICAgICBmb3IgKCBzdGQ6OnZlY3Rvcjwgc3RkOjpzdHJpbmcgPjo6aXRlcmF0b3IgaSA9IG9wdGlvbnMud2F0Y2guYmVnaW4oKTsKKyAgICAgICAgICAgICAgaSAhPSBvcHRpb25zLndhdGNoLmVuZCgpOyArK2kgKQorICAgICAgICAgICAgaW8uc291cmNlcy5wdXNoX2JhY2soIG5ldyBGaWxlU291cmNlKCAqaSApICk7CisgICAgICAgIGlmICggb3B0aW9ucy5rbXNnICkKKyAgICAgICAgICAgIGlvLnNvdXJjZXMucHVzaF9iYWNrKCBuZXcgS01zZyApOworICAgIH0KKworICAgIFRlc3RDYXNlKCBKb3VybmFsICZqLCBPcHRpb25zIG9wdCwgc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgX25hbWUsIHN0ZDo6c3RyaW5nIF9mbGF2b3VyICkKKyAgICAgICAgOiBjaGlsZCggcGF0aCApLCBuYW1lKCBfbmFtZSApLCBmbGF2b3VyKCBfZmxhdm91ciApLCB0aW1lb3V0KCBmYWxzZSApLAorICAgICAgICAgIGxhc3RfdXBkYXRlKCAwICksIGxhc3RfaGVhcnRiZWF0KCAwICksIG9wdGlvbnMoIG9wdCApLCBqb3VybmFsKCAmaiApCisgICAgeworICAgIH0KK307CisKK3N0cnVjdCBNYWluIHsKKyAgICBib29sIGRpZTsKKyAgICB0aW1lX3Qgc3RhcnQ7CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPCBUZXN0Q2FzZSA+IENhc2VzOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID4gRmxhdm91cnM7CisKKyAgICBKb3VybmFsIGpvdXJuYWw7CisgICAgT3B0aW9ucyBvcHRpb25zOworICAgIENhc2VzIGNhc2VzOworCisgICAgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgYm9vbCBmaWx0ZXI7CisgICAgICAgIExpc3RpbmcgbCA9IGxpc3RkaXIoIG9wdGlvbnMudGVzdGRpciwgdHJ1ZSApOworICAgICAgICBzdGQ6OnNvcnQoIGwuYmVnaW4oKSwgbC5lbmQoKSApOworCisgICAgICAgIGZvciAoIEZsYXZvdXJzOjppdGVyYXRvciBmbGF2ID0gb3B0aW9ucy5mbGF2b3Vycy5iZWdpbigpOworICAgICAgICAgICAgICBmbGF2ICE9IG9wdGlvbnMuZmxhdm91cnMuZW5kKCk7ICsrZmxhdiApIHsKKworICAgICAgICAgICAgZm9yICggTGlzdGluZzo6aXRlcmF0b3IgaSA9IGwuYmVnaW4oKTsgaSAhPSBsLmVuZCgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoIGktPmxlbmd0aCgpIDwgMyApIHx8ICggaS0+c3Vic3RyKCBpLT5sZW5ndGgoKSAtIDMsIGktPmxlbmd0aCgpICkgIT0gIi5zaCIgKSApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICggaS0+c3Vic3RyKCAwLCA0ICkgPT0gImxpYi8iICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuZmlsdGVyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID46Oml0ZXJhdG9yIGZpbHQgPSBvcHRpb25zLmZpbHRlci5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ICE9IG9wdGlvbnMuZmlsdGVyLmVuZCgpOyArK2ZpbHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGktPmZpbmQoICpmaWx0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmaWx0ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNraXAuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID46Oml0ZXJhdG9yIGZpbHQgPSBvcHRpb25zLnNraXAuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdCAhPSBvcHRpb25zLnNraXAuZW5kKCk7ICsrZmlsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaS0+ZmluZCggKmZpbHQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggZmlsdGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2VzLnB1c2hfYmFjayggVGVzdENhc2UoIGpvdXJuYWwsIG9wdGlvbnMsIG9wdGlvbnMudGVzdGRpciArICppLCAqaSwgKmZsYXYgKSApOworICAgICAgICAgICAgICAgIGNhc2VzLmJhY2soKS5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggb3B0aW9ucy5jb250ICkKKyAgICAgICAgICAgIGpvdXJuYWwucmVhZCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICA6OnVubGluayggam91cm5hbC5sb2NhdGlvbi5jX3N0cigpICk7CisgICAgfQorCisgICAgaW50IHJ1bigpIHsKKyAgICAgICAgc2V0dXAoKTsKKyAgICAgICAgc3RhcnQgPSB0aW1lKCAwICk7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAicnVubmluZyAiIDw8IGNhc2VzLnNpemUoKSA8PCAiIHRlc3RzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgZm9yICggQ2FzZXM6Oml0ZXJhdG9yIGkgPSBjYXNlcy5iZWdpbigpOyBpICE9IGNhc2VzLmVuZCgpOyArK2kgKSB7CisKKyAgICAgICAgICAgIGlmICggb3B0aW9ucy5jb250ICYmIGpvdXJuYWwuZG9uZSggaS0+aWQoKSApICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaS0+cnVuKCk7CisKKyAgICAgICAgICAgIGlmICggb3B0aW9ucy5mYXRhbF90aW1lb3V0cyAmJiBqb3VybmFsLnRpbWVvdXRzID49IDIgKSB7CisgICAgICAgICAgICAgICAgam91cm5hbC5zdGFydGVkKCBpLT5pZCgpICk7IC8vIHJldHJ5IHRoZSB0ZXN0IG9uIC0tY29udGludWUKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkU6IEhpdCAyIHRpbWVvdXRzIGluIGEgcm93IHdpdGggLS1mYXRhbC10aW1lb3V0cyIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiU3VzcGVuZGluZyAocGxlYXNlIHJlc3RhcnQgdGhlIFZNKS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzbGVlcCggMzYwMCApOworICAgICAgICAgICAgICAgIGRpZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggdGltZSgwKSAtIHN0YXJ0ID4gKFRFU1RfU1VJVEVfVElNRU9VVCAqIDM2MDApICkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCBURVNUX1NVSVRFX1RJTUVPVVQgPDwgIiBob3VycyBwYXNzZWQsIGdpdmluZyB1cC4uLiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGRpZSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZGllIHx8IGZhdGFsX3NpZ25hbCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBqb3VybmFsLmJhbm5lcigpOworICAgICAgICBpZiAoIGRpZSB8fCBmYXRhbF9zaWduYWwgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgcmV0dXJuIGpvdXJuYWwuY291bnQoIEpvdXJuYWw6OkZBSUxFRCApIHx8IGpvdXJuYWwuY291bnQoIEpvdXJuYWw6OlRJTUVPVVQgKSA/IDEgOiAwOworICAgIH0KKworICAgIE1haW4oIE9wdGlvbnMgbyApIDogZGllKCBmYWxzZSApLCBqb3VybmFsKCBvLm91dGRpciApLCBvcHRpb25zKCBvICkge30KK307CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgaGFuZGxlciggaW50IHNpZyApIHsKKyAgICBzaWduYWwoIHNpZywgU0lHX0RGTCApOyAvKiBkaWUgcmlnaHQgYXdheSBuZXh0IHRpbWUgKi8KKyAgICBpZiAoIGtpbGxfcGlkID4gMCApCisgICAgICAgIGtpbGwoIC1raWxsX3BpZCwgc2lnICk7CisgICAgZmF0YWxfc2lnbmFsID0gdHJ1ZTsKKyAgICBpZiAoIHNpZyA9PSBTSUdJTlQgKQorICAgICAgICBpbnRlcnJ1cHQgPSB0cnVlOworfQorCit2b2lkIHNldHVwX2hhbmRsZXJzKCkgeworICAgIC8qIHNldCB1cCBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPD0gMzI7ICsraSApCisgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgY2FzZSBTSUdDSExEOiBjYXNlIFNJR1dJTkNIOiBjYXNlIFNJR1VSRzoKKyAgICAgICAgICAgIGNhc2UgU0lHS0lMTDogY2FzZSBTSUdTVE9QOiBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHNpZ25hbChpLCBoYW5kbGVyKTsKKyAgICAgICAgfQorfQorCit9CisKKy8qIFRPRE8gcmVtb3ZlIGluIGZhdm91ciBvZiBicmljay1jb21tYW5kbGluZS5oICovCitzdHJ1Y3QgQXJncyB7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3RkOjpzdHJpbmcgPiBWOworICAgIFYgYXJnczsKKworICAgIEFyZ3MoIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiApIHsKKyAgICAgICAgZm9yICggaW50IGkgPSAxOyBpIDwgYXJnYzsgKysgaSApCisgICAgICAgICAgICBhcmdzLnB1c2hfYmFjayggYXJndlsgaSBdICk7CisgICAgfQorCisgICAgYm9vbCBoYXMoIHN0ZDo6c3RyaW5nIGZsICkgeworICAgICAgICByZXR1cm4gc3RkOjpmaW5kKCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksIGZsICkgIT0gYXJncy5lbmQoKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBUaGlzIGRvZXMgbm90IGhhbmRsZSBgLS1vcHRpb249VkFMVUVgOgorICAgIHN0ZDo6c3RyaW5nIG9wdCggc3RkOjpzdHJpbmcgZmwgKSB7CisgICAgICAgIFY6Oml0ZXJhdG9yIGkgPSBzdGQ6OmZpbmQoIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgZmwgKTsKKyAgICAgICAgaWYgKCBpID09IGFyZ3MuZW5kKCkgfHwgaSArIDEgPT0gYXJncy5lbmQoKSApCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiAqKGkgKyAxKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgeworCitib29sIGhhc2VudiggY29uc3QgY2hhciAqbmFtZSApIHsKKyAgICBjb25zdCBjaGFyICp2ID0gZ2V0ZW52KCBuYW1lICk7CisgICAgaWYgKCAhdiApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIHN0cmxlbiggdiApID09IDAgfHwgIXN0cmNtcCggdiwgIjAiICkgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBDID4KK3ZvaWQgc3BsaXQoIHN0ZDo6c3RyaW5nIHMsIEMgJmMgKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3MoIHMgKTsKKyAgICBzdGQ6OnN0cmluZyBpdGVtOworICAgIHdoaWxlICggc3RkOjpnZXRsaW5lKCBzcywgaXRlbSwgJywnICkgKQorICAgICAgICBjLnB1c2hfYmFjayggaXRlbSApOworfQorCit9CisKK2NvbnN0IGNoYXIgKkRFRl9GTEFWT1VSUz0ibmRldi12YW5pbGxhIjsKKworc3RkOjpzdHJpbmcgcmVzb2x2ZV9wYXRoKHN0ZDo6c3RyaW5nIGFfcGF0aCwgY29uc3QgY2hhciAqZGVmYXVsdF9wYXRoPSIuIikKK3sKKyAgICBjaGFyIHRlbXBbUEFUSF9NQVhdOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgcCA9IGFfcGF0aC5lbXB0eSgpID8gZGVmYXVsdF9wYXRoIDogYV9wYXRoLmNfc3RyKCk7CisgICAgaWYgKCAhcmVhbHBhdGgoIHAsIHRlbXAgKSApCisgICAgICAgIHRocm93IHN5c2VyciggIkZhaWxlZCB0byByZXNvbHZlIHBhdGgiLCBwICk7CisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgcnVuKCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHN0ZDo6c3RyaW5nIGZsX2VudnZhciA9ICJURVNUX0ZMQVZPVVIiICkKK3sKKyAgICBBcmdzIGFyZ3MoIGFyZ2MsIGFyZ3YgKTsKKyAgICBPcHRpb25zIG9wdDsKKworICAgIGlmICggYXJncy5oYXMoICItLWhlbHAiICkgKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PAorICAgICAgICAgICAgIiAgbHZtMi10ZXN0c3VpdGUgLSBSdW4gYSBsdm0yIHRlc3RzdWl0ZS5cblxuIgorICAgICAgICAgICAgImx2bTItdGVzdHN1aXRlIgorICAgICAgICAgICAgIlxuXHQiCisgICAgICAgICAgICAiIFstLWZsYXZvdXJzIEZMQVZPVVJTXSIKKyAgICAgICAgICAgICIgWy0tb25seSBURVNUU10iCisgICAgICAgICAgICAiXG5cdCIKKyAgICAgICAgICAgICIgWy0tb3V0ZGlyIE9VVERJUl0iCisgICAgICAgICAgICAiIFstLXRlc3RkaXIgVEVTVERJUl0iCisgICAgICAgICAgICAiIFstLXdvcmtkaXIgV09SS0RJUl0iCisgICAgICAgICAgICAiXG5cdCIKKyAgICAgICAgICAgICIgWy0tYmF0Y2h8LS12ZXJib3NlfC0taW50ZXJhY3RpdmVdIgorICAgICAgICAgICAgIlxuXHQiCisgICAgICAgICAgICAiIFstLWZhdGFsLXRpbWVvdXRzXSIKKyAgICAgICAgICAgICIgWy0tY29udGludWVdIgorICAgICAgICAgICAgIiBbLS1oZWFydGJlYXRdIgorICAgICAgICAgICAgIiBbLS13YXRjaCBXQVRDSF0iCisgICAgICAgICAgICAiIFstLXRpbWVvdXQgVElNRU9VVF0iCisgICAgICAgICAgICAiIFstLW5va21zZ11cblxuIgorICAgICAgICAgICAgLyogVE9ETzogbGlzdCBvZiBmbGF2b3VyczoKKyAgICAgICAgICAgICJsdm0yLXRlc3RzdWl0ZSIKKyAgICAgICAgICAgICJcblx0IgorICAgICAgICAgICAgIiAtLWxpc3QtZmxhdm91cnMgWy0tdGVzdGRpciBURVNURElSXSIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAiXG5cbiIKKyAgICAgICAgICAgICJPUFRJT05TOlxuXG4iCisgICAgICAgICAgICAvLyBUT0RPOiBsb29rcyBsaWtlIHRoaXMgY291bGQgYmUgd29ydGggYSBtYW4gcGFnZS4uLgorICAgICAgICAgICAgIkZpbHRlcnM6XG4iCisgICAgICAgICAgICAiICAtLWZsYXZvdXJzIEZMQVZPVVJTXG5cdFx0LSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmbGF2b3VycyB0byBydW4uXG5cdFx0ICBGb3IgdGhlIGxpc3Qgb2YgZmxhdm91cnMgc2VlIGAkVEVTVERJUi9saWIvZmxhdm91ci0qYC5cblx0XHQgIERlZmF1bHQ6IFwiIiA8PCBERUZfRkxBVk9VUlMgPDwgIlwiLlxuIgorICAgICAgICAgICAgIiAgLS1vbmx5IFRFU1RTXHQtIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRlc3RzIHRvIHJ1bi4gRGVmYXVsdDogQWxsIHRlc3RzLlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIkRpcmVjdG9yaWVzOlxuIgorICAgICAgICAgICAgIiAgLS10ZXN0ZGlyIFRFU1RESVJcblx0XHQtIGRpcmVjdG9yeSB3aGVyZSB0ZXN0cyByZXNpZGUuIERlZmF1bHQ6IFwiIiBURVNUU1VJVEVfREFUQSAiXCIuXG4iCisgICAgICAgICAgICAiICAtLXdvcmtkaXIgV09SS0RJUlxuXHRcdC0gZGlyZWN0b3J5IHRvIGNoYW5nZSB0byB3aGVuIHJ1bm5pbmcgdGVzdHMuXG5cdFx0ICBUaGlzIGlzIGRpcmVjdG9yeSBjb250YWluaW5nIHRlc3RpbmcgbGlicy4gRGVmYXVsdDogVEVTVERJUi5cbiIKKyAgICAgICAgICAgICIgIC0tb3V0ZGlyIE9VVERJUlxuXHRcdC0gZGlyZWN0b3J5IHdoZXJlIGFsbCB0aGUgb3V0cHV0IGZpbGVzIHNob3VsZCBnby4gRGVmYXVsdDogXCIuXCIuXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiRm9ybWF0dGluZzpcbiIKKyAgICAgICAgICAgICIgIC0tYmF0Y2hcdC0gQnJpZWYgZm9ybWF0IGZvciBhdXRvbWF0ZWQgcnVucy5cbiIKKyAgICAgICAgICAgICIgIC0tdmVyYm9zZVx0LSBNb3JlIHZlcmJvc2UgZm9ybWF0IGZvciBhdXRvbWF0ZWQgcnVucyBkaXNwbGF5aW5nIHByb2dyZXNzIG9uIHN0ZG91dC5cbiIKKyAgICAgICAgICAgICIgIC0taW50ZXJhY3RpdmVcdC0gVmVyYm9zZSBmb3JtYXQgZm9yIGludGVyYWN0aXZlIHJ1bnMuXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiT3RoZXI6XG4iCisgICAgICAgICAgICAiICAtLWZhdGFsLXRpbWVvdXRzXG5cdFx0LSBleGl0IGFmdGVyIGVuY291bnRlcmluZyAyIHRpbWVvdXRzIGluIGEgcm93LlxuIgorICAgICAgICAgICAgIiAgLS1jb250aW51ZVx0LSBJZiBzZXQgYXBwZW5kIHRvIGpvdXJuYWwuIE90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuIgorICAgICAgICAgICAgIiAgLS1oZWFydGJlYXQgSEVBUlRCRUFUXG5cdFx0LSBOYW1lIG9mIGZpbGUgdG8gdXBkYXRlIHBlcmlvZGljYWx5IHdoaWxlIHJ1bm5pbmcuXG4iCisgICAgICAgICAgICAiICAtLXdhdGNoIFdBVENIXHQtIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIHRvIHdhdGNoIGFuZCBwcmludC5cbiIKKyAgICAgICAgICAgICIgIC0tdGltZW91dCBUSU1FT1VUXG5cdFx0LSBQZXJpb2Qgb2Ygc2lsZW5jZSBpbiBzZWNvbmRzIGNvbnNpZGVyZWQgYSB0aW1lb3V0LiBEZWZhdWx0OiAxODAuXG4iCisgICAgICAgICAgICAiICAtLW5va21zZ1x0LSBEbyBub3QgdHJ5IHRvIHJlYWQga2VybmVsIG1lc3NhZ2VzLlxuIgorICAgICAgICAgICAgIlxuXG4iCisgICAgICAgICAgICAiRU5WLlZBUklBQkxFUzpcblxuIgorICAgICAgICAgICAgIiAgVFx0XHQtIHNlZSAtLW9ubHlcbiIKKyAgICAgICAgICAgICIgIElOVEVSQUNUSVZFXHQtIHNlZSAtLWludGVyYWN0aXZlXG4iCisgICAgICAgICAgICAiICBWRVJCT1NFXHQtIHNlZSAtLXZlcmJvc2VcbiIKKyAgICAgICAgICAgICIgIEJBVENIXHRcdC0gc2VlIC0tYmF0Y2hcbiIKKyAgICAgICAgICAgICIgIExWTV9URVNUX0NBTl9DTE9CQkVSX0RNRVNHXG5cdFx0LSB3aGVuIHNldCBhbmQgbm9uLWVtcHR5IHRlc3RzIGFyZSBhbGxvd2VkIHRvIGZsdXNoXG5cdFx0ICBrbXNnIGluIGFuIGF0dGVtcHQgdG8gcmVhZCBpdC4iCisgICAgICAgICAgICAiXG5cbiIKKyAgICAgICAgICAgICJGT1JNQVRTOlxuXG4iCisgICAgICAgICAgICAiV2hlbiBtdWx0aXBsZSBmb3JtYXRzIGFyZSBzcGVjaWZpZWQgaW50ZXJhY3RpdmUgb3ZlcnJpZGVzIHZlcmJvc2VcbiIKKyAgICAgICAgICAgICJ3aGljaCBvdmVycmlkZXMgYmF0Y2guIENvbW1hbmQgbGluZSBvcHRpb25zIG92ZXJyaWRlIGVudmlyb25tZW50XG4iCisgICAgICAgICAgICAidmFyaWFibGVzLlxuXG4iCisgICAgICAgICAgICA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG9wdC5mbGF2b3VyX2VudnZhciA9IGZsX2VudnZhcjsKKworICAgIGlmICggYXJncy5oYXMoICItLWNvbnRpbnVlIiApICkKKyAgICAgICAgb3B0LmNvbnQgPSB0cnVlOworCisgICAgaWYgKCBhcmdzLmhhcyggIi0tb25seSIgKSApCisgICAgICAgIHNwbGl0KCBhcmdzLm9wdCggIi0tb25seSIgKSwgb3B0LmZpbHRlciApOworICAgIGVsc2UgaWYgKCBoYXNlbnYoICJUIiApICkKKyAgICAgICAgc3BsaXQoIGdldGVudiggIlQiICksIG9wdC5maWx0ZXIgKTsKKworICAgIGlmICggYXJncy5oYXMoICItLXNraXAiICkgKQorICAgICAgICBzcGxpdCggYXJncy5vcHQoICItLXNraXAiICksIG9wdC5za2lwICk7CisgICAgZWxzZSBpZiAoIGhhc2VudiggIlMiICkgKQorICAgICAgICBzcGxpdCggZ2V0ZW52KCAiUyIgKSwgb3B0LnNraXAgKTsKKworICAgIGlmICggYXJncy5oYXMoICItLWZhdGFsLXRpbWVvdXRzIiApICkKKyAgICAgICAgb3B0LmZhdGFsX3RpbWVvdXRzID0gdHJ1ZTsKKworICAgIGlmICggYXJncy5oYXMoICItLWhlYXJ0YmVhdCIgKSApCisgICAgICAgIG9wdC5oZWFydGJlYXQgPSBhcmdzLm9wdCggIi0taGVhcnRiZWF0IiApOworCisgICAgaWYgKCBhcmdzLmhhcyggIi0tYmF0Y2giICkgfHwgYXJncy5oYXMoICItLXZlcmJvc2UiICkgfHwgYXJncy5oYXMoICItLWludGVyYWN0aXZlIiApICkgeworICAgICAgICBpZiAoIGFyZ3MuaGFzKCAiLS1iYXRjaCIgKSApIHsKKyAgICAgICAgICAgIG9wdC52ZXJib3NlID0gZmFsc2U7CisgICAgICAgICAgICBvcHQuYmF0Y2ggPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhcmdzLmhhcyggIi0tdmVyYm9zZSIgKSApIHsKKyAgICAgICAgICAgIG9wdC5iYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgb3B0LnZlcmJvc2UgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBhcmdzLmhhcyggIi0taW50ZXJhY3RpdmUiICkgKSB7CisgICAgICAgICAgICBvcHQudmVyYm9zZSA9IGZhbHNlOworICAgICAgICAgICAgb3B0LmJhdGNoID0gZmFsc2U7CisgICAgICAgICAgICBvcHQuaW50ZXJhY3RpdmUgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBoYXNlbnYoICJCQVRDSCIgKSApIHsKKyAgICAgICAgICAgIG9wdC52ZXJib3NlID0gZmFsc2U7CisgICAgICAgICAgICBvcHQuYmF0Y2ggPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBoYXNlbnYoICJWRVJCT1NFIiApICkgeworICAgICAgICAgICAgb3B0LmJhdGNoID0gZmFsc2U7CisgICAgICAgICAgICBvcHQudmVyYm9zZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGhhc2VudiggIklOVEVSQUNUSVZFIiApICkgeworICAgICAgICAgICAgb3B0LnZlcmJvc2UgPSBmYWxzZTsKKyAgICAgICAgICAgIG9wdC5iYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgb3B0LmludGVyYWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggYXJncy5oYXMoICItLWZsYXZvdXJzIiApICkKKyAgICAgICAgc3BsaXQoIGFyZ3Mub3B0KCAiLS1mbGF2b3VycyIgKSwgb3B0LmZsYXZvdXJzICk7CisgICAgZWxzZQorICAgICAgICBzcGxpdCggREVGX0ZMQVZPVVJTLCBvcHQuZmxhdm91cnMgKTsKKworICAgIGlmICggYXJncy5oYXMoICItLXdhdGNoIiApICkKKyAgICAgICAgc3BsaXQoIGFyZ3Mub3B0KCAiLS13YXRjaCIgKSwgb3B0LndhdGNoICk7CisKKyAgICBpZiAoIGFyZ3MuaGFzKCAiLS10aW1lb3V0IiApICkKKyAgICAgICAgb3B0LnRpbWVvdXQgPSBhdG9pKCBhcmdzLm9wdCggIi0tdGltZW91dCIgKS5jX3N0cigpICk7CisKKyAgICBpZiAoIGFyZ3MuaGFzKCAiLS1ub2ttc2ciICkgKQorICAgICAgICBvcHQua21zZyA9IGZhbHNlOworCisgICAgb3B0LnRlc3RkaXIgPSByZXNvbHZlX3BhdGgoIGFyZ3Mub3B0KCAiLS10ZXN0ZGlyIiApLCBURVNUU1VJVEVfREFUQSApICsgIi8iOworICAgIG9wdC53b3JrZGlyID0gcmVzb2x2ZV9wYXRoKCBhcmdzLm9wdCggIi0td29ya2RpciIgKSwgb3B0LnRlc3RkaXIuY19zdHIoKSApOworICAgIG9wdC5vdXRkaXIgPSByZXNvbHZlX3BhdGgoIGFyZ3Mub3B0KCAiLS1vdXRkaXIiICksICIuIiApOworCisgICAgc2V0dXBfaGFuZGxlcnMoKTsKKworICAgIE1haW4gbWFpbiggb3B0ICk7CisgICAgcmV0dXJuIG1haW4ucnVuKCk7Cit9CisKK30KK30KKworI2VuZGlmCisKKyNpZmRlZiBCUklDS19ERU1PCisKK2ludCBtYWluKCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YgKSB7CisgICAgcmV0dXJuIGJyaWNrOjpzaGVsbHRlc3Q6OnJ1biggYXJnYywgYXJndiApOworfQorCisjZW5kaWYKKworLy8gdmltOiBzeW50YXg9Y3BwIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgZXhwYW5kdGFiCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9jaGVjay5zaCBiL3Rlc3QvbGliL2NoZWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjlhYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9jaGVjay5zaApAQCAtMCwwICsxLDM5NyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgY2hlY2suc2g6IGFzc2VydCB2YXJpb3VzIHRoaW5ncyBhYm91dCB2b2x1bWVzCisKKyMgVVNBR0U6CisjICBjaGVjayBsaW5lYXIgVkcgTFYKKyMgIGNoZWNrIGx2X29uIFZHIExWIFBWCisKKyMgIGNoZWNrIG1pcnJvciBWRyBMViBbTE9HREVWfGNvcmVdCisjICBjaGVjayBtaXJyb3Jfbm9ucmVkdW5kYW50IFZHIExWCisjICBjaGVjayBtaXJyb3JfbGVncyBWRyBMViBOCisjICBjaGVjayBtaXJyb3JfaW1hZ2VzX29uIFZHIExWIERFViBbREVWLi4uXQorCisjIC4uLgorCit0ZXN0IC16ICIkQkFTSCIgfHwgc2V0IC1lIC1vIHBpcGVmYWlsCisKK2RpZSgpIHsKKwlybSAtZiBkZWJ1Zy5sb2cKKwllY2hvIC1lICIkQCIgPiYyCisJcmV0dXJuIDEKK30KKworbHZsKCkgeworCWx2cyAtYSAtLW5vaGVhZGluZ3MgIiRAIgorfQorCitsdmRldmljZXMoKSB7CisJZ2V0IGx2X2RldmljZXMgIiRAIgorfQorCittaXJyb3JfaW1hZ2VzX3JlZHVuZGFudCgpIHsKKwlsb2NhbCB2Zz0kMQorCWxvY2FsIGx2PSR2Zy8kMgorCWx2cyAtYSAkdmcgLW8rZGV2aWNlcworCWZvciBpIGluICQobHZkZXZpY2VzICRsdik7IGRvCisJCWVjaG8gIiMgJGk6IgorCQlsdmRldmljZXMgJHZnLyRpIHwgc29ydCB8IHVuaXEKKwlkb25lID4gY2hlY2sudG1wLmFsbAorCisJKGdyZXAgLXYgXiMgY2hlY2sudG1wLmFsbCB8fCB0cnVlKSB8IHNvcnQgfCB1bmlxIC1kID4gY2hlY2sudG1wCisKKwl0ZXN0ICQoY2F0IGNoZWNrLnRtcCB8IHdjIC1sKSAtZXEgMCB8fCBcCisJCWRpZSAibWlycm9yIGltYWdlcyBvZiAkbHYgZXhwZWN0ZWQgcmVkdW5kYW50LCBidXQgYXJlIG5vdDoiIFwKKwkJCSQoY2F0IGNoZWNrLnRtcC5hbGwpCit9CisKK2x2X2Vycl9saXN0XygpIHsKKwkoZWNobyAiJDIiIHwgbm90IGdyZXAgLW0gMSAtcSAiJDEiKSB8fCBcCisJCWVjaG8gIiQzIG9uIFsgJChlY2hvICIkMiIgfCBncmVwICIkMSIgfCBjdXQgLWIzLSB8IHRyICdcbicgJyAnKV0gIgorfQorCitsdl9vbl9kaWZmXygpIHsKKwlkZWNsYXJlIC1hIHhkZXZzPSgiJHshMX0iKSAjIHBhc3MgaW4gc2hlbGwgYXJyYXkKKwlsb2NhbCBleHBlY3Q9KCAiJHtAOjR9IiApICMgbWFrZSBhbiBhcnJheSBzdGFydGluZyBmcm9tIDR0aCBhcmdzLi4uCisJbG9jYWwgZGlmZl9lCisKKwkjIEZpbmQgZGlmZiBiZXR3ZWVuIDIgc2hlbGwgYXJyYXlzLCBwcmludCB0aGVtIGFzIHN0ZGluIGZpbGVzCisJcHJpbnRmICIlc1xuIiAiJHtleHBlY3RbQF19IiB8IHNvcnQgfCB1bmlxID5fbHZfb25fZGlmZjEKKwlwcmludGYgIiVzXG4iICIke3hkZXZzW0BdfSIgPl9sdl9vbl9kaWZmMgorCWRpZmZfZT0kKGRpZmYgX2x2X29uX2RpZmYxIF9sdl9vbl9kaWZmMikgfHwKKwkJZGllICJMViAkMi8kMyAkKGx2X2Vycl9saXN0XyAiXj4iICIke2RpZmZfZX0iIGZvdW5kKSQobHZfZXJyX2xpc3RfICJePCIgIiR7ZGlmZl9lfSIgIm5vdCBmb3VuZCIpLiIKK30KKworIyBsaXN0IGRldmljZXMgZm9yIGdpdmVuIExWCitsdl9vbigpIHsKKwlsb2NhbCBkZXZzCisKKwlkZXZzPSggJChsdmRldmljZXMgIiQxLyQyIiB8IHNvcnQgfCB1bmlxICkgKQorCisJbHZfb25fZGlmZl8gZGV2c1tAXSAiJHtAfSIKK30KKworIyBsaXN0IGRldmljZXMgZm9yIGdpdmVuIExWIGFuZCBhbGwgaXRzIHN1YmRldmljZXMKK2x2X3RyZWVfb24oKSB7CisJbG9jYWwgZGV2cworCisJIyBHZXQgc29ydGVkIGxpc3Qgb2YgZGV2aWNlcworCWRldnM9KCAkKGdldCBsdl90cmVlX2RldmljZXMgIiQxIiAiJDIiKSApCisKKwlsdl9vbl9kaWZmXyBkZXZzW0BdICIke0B9IgorfQorCittaXJyb3JfaW1hZ2VzX29uKCkgeworCWxvY2FsIHZnPSQxCisJbG9jYWwgbHY9JDIKKwlzaGlmdCAyCisJZm9yIGkgaW4gJChsdmRldmljZXMgJGx2KTsgZG8KKwkJbHZfb24gJHZnICRsdiAkMQorCQlzaGlmdAorCWRvbmUKK30KKworbWlycm9yX2xvZ19vbigpIHsKKwlsb2NhbCB2Zz0kMQorCWxvY2FsIGx2PSQyCisJbG9jYWwgd2hlcmU9JDMKKwlpZiB0ZXN0ICIkd2hlcmUiID0gImNvcmUiOyB0aGVuCisJCWdldCBsdl9maWVsZCAkdmcvJGx2IG1pcnJvcl9sb2cgfCBub3QgZ3JlcCBtbG9nCisJZWxzZQorCQlsdl9vbiAkdmcgJHtsdn1fbWxvZyAiJHdoZXJlIgorCWZpCit9CisKK2x2X2lzX2NvbnRpZ3VvdXMoKSB7CisJbG9jYWwgbHY9JDEvJDIKKwl0ZXN0ICQobHZsIC0tc2VnbWVudHMgJGx2IHwgd2MgLWwpIC1lcSAxIHx8IFwKKwkJZGllICJMViAkbHYgZXhwZWN0ZWQgdG8gYmUgY29udGlndW91cywgYnV0IGlzIG5vdDoiIFwKKwkJCSQobHZsIC0tc2VnbWVudHMgJGx2KQorfQorCitsdl9pc19jbHVuZygpIHsKKwlsb2NhbCBsdj0kMS8kMgorCXRlc3QgJChsdmRldmljZXMgJGx2IHwgc29ydCB8IHVuaXEgfCB3YyAtbCkgLWVxIDEgfHwgXAorCQlkaWUgIkxWICRsdiBleHBlY3RlZCB0byBiZSBjbHVuZywgYnV0IGlzIG5vdDoiIFwKKwkJCSQobHZkZXZpY2VzICRsdiB8IHNvcnQgfCB1bmlxKQorfQorCittaXJyb3JfaW1hZ2VzX2NvbnRpZ3VvdXMoKSB7CisJZm9yIGkgaW4gJChsdmRldmljZXMgJDEvJDIpOyBkbworCQlsdl9pc19jb250aWd1b3VzICQxICRpCisJZG9uZQorfQorCittaXJyb3JfaW1hZ2VzX2NsdW5nKCkgeworCWZvciBpIGluICQobHZkZXZpY2VzICQxLyQyKTsgZG8KKwkJbHZfaXNfY2x1bmcgJDEgJGkKKwlkb25lCit9CisKK21pcnJvcigpIHsKKwltaXJyb3Jfbm9ucmVkdW5kYW50ICIkQCIKKwltaXJyb3JfaW1hZ2VzX3JlZHVuZGFudCAkMSAkMgorfQorCittaXJyb3Jfbm9ucmVkdW5kYW50KCkgeworCWxvY2FsIGx2PSQxLyQyCisJbG9jYWwgYXR0cj0kKGdldCBsdl9maWVsZCAkbHYgYXR0cikKKwkoZWNobyAiJGF0dHIiIHwgZ3JlcCAiXi4uLi4uLm0uLi4kIiA+L2Rldi9udWxsKSB8fCB7CisJCWlmIChlY2hvICIkYXR0ciIgfCBncmVwICJeby4uLi4uLi4uLiQiID4vZGV2L251bGwpICYmCisJCSAgIGx2cyAtYSB8IGZncmVwICJbJHsyfV9taW1hZ2UiID4vZGV2L251bGw7IHRoZW4KKwkJCWVjaG8gIlRFU1QgV0FSTklORzogJGx2IGlzIGEgc25hcHNob3Qgb3JpZ2luIGFuZCBsb29rcyBsaWtlIGEgbWlycm9yLCIKKwkJCWVjaG8gImFzc3VtaW5nIGl0IGlzIGFjdHVhbGx5IGEgbWlycm9yIgorCQllbHNlCisJCQlkaWUgIiRsdiBleHBlY3RlZCBhIG1pcnJvciwgYnV0IGlzIG5vdDoiIFwKKwkJCQkkKGx2cyAkbHYpCisJCWZpCisJfQorCXRlc3QgLXogIiQzIiB8fCBtaXJyb3JfbG9nX29uICQxICQyICIkMyIKK30KKworbWlycm9yX2xlZ3MoKSB7CisJbG9jYWwgZXhwZWN0PSQzCisJdGVzdCAiJGV4cGVjdCIgLWVxICQobHZkZXZpY2VzICQxLyQyIHwgd2MgLXcpCit9CisKK21pcnJvcl9ub190ZW1wb3JhcmllcygpIHsKKwlsb2NhbCB2Zz0kMQorCWxvY2FsIGx2PSQyCisJKGx2bCAtbyBuYW1lICR2ZyB8IGdyZXAgJGx2IHwgbm90IGdyZXAgInRtcCIpIHx8IFwKKwkJZGllICIkbHYgaGFzIHRlbXBvcmFyeSBtaXJyb3IgaW1hZ2VzIHVuZXhwZWN0ZWRseToiIFwKKwkJCSQobHZsICR2ZyB8IGdyZXAgJGx2KQorfQorCitsaW5lYXIoKSB7CisJbG9jYWwgbHY9JDEvJDIKKwl0ZXN0ICQoZ2V0IGx2X2ZpZWxkICRsdiBzdHJpcGVzIC1hKSAtZXEgMSB8fCBcCisJCWRpZSAiJGx2IGV4cGVjdGVkIGxpbmVhciwgYnV0IGlzIG5vdDoiIFwKKwkJCSQobHZsICRsdiAtbytkZXZpY2VzKQorfQorCisjIGluX3N5bmMgPFZHPiA8TFY+CisjIFdvcmtzIGZvciAibWlycm9yIiBhbmQgInJhaWQqIgoraW5fc3luYygpIHsKKwlsb2NhbCBhCisJbG9jYWwgYgorCWxvY2FsIGlkeAorCWxvY2FsIHR5cGUKKwlsb2NhbCBzbmFwPSIiCisJbG9jYWwgbHZtX25hbWU9IiQxLyQyIgorCWxvY2FsIGRtX25hbWU9JChlY2hvICRsdm1fbmFtZSB8IHNlZCBzOi06LS06IHwgc2VkIHM6LzotOikKKworCWE9KCAkKGRtc2V0dXAgc3RhdHVzICRkbV9uYW1lKSApICB8fCBcCisJCWRpZSAiVW5hYmxlIHRvIGdldCBzeW5jIHN0YXR1cyBvZiAkMSIKKworCWlmIFsgJHthWzJdfSA9ICJzbmFwc2hvdC1vcmlnaW4iIF07IHRoZW4KKwkJYT0oICQoZG1zZXR1cCBzdGF0dXMgJHtkbV9uYW1lfS1yZWFsKSApIHx8IFwKKwkJCWRpZSAiVW5hYmxlIHRvIGdldCBzeW5jIHN0YXR1cyBvZiAkMSIKKwkJc25hcD0iOiB1bmRlciBzbmFwc2hvdCIKKwlmaQorCisJY2FzZSAke2FbMl19IGluCisJInJhaWQiKQorCQkjIDZ0aCBhcmd1bWVudCBpcyB0aGUgc3luYyByYXRpbyBmb3IgUkFJRAorCQlpZHg9NgorCQl0eXBlPSR7YVszXX0KKwkJaWYgWyAke2FbJCgoJGlkeCArIDEpKV19ICE9ICJpZGxlIiBdOyB0aGVuCisJCQllY2hvICIkbHZtX25hbWUgKCR0eXBlJHNuYXApIGlzIG5vdCBpbi1zeW5jIgorCQkJcmV0dXJuIDEKKwkJZmkKKwkJOzsKKwkibWlycm9yIikKKwkJIyA0dGggQXJnIHRlbGxzIHVzIGhvdyBmYXIgdG8gdGhlIHN5bmMgcmF0aW8KKwkJaWR4PSQoKCR7YVszXX0gKyA0KSkKKwkJdHlwZT0ke2FbMl19CisJCTs7CisJKikKKwkJZGllICJVbmFibGUgdG8gZ2V0IHN5bmMgcmF0aW8gZm9yIHRhcmdldCB0eXBlICcke2FbMl19JyIKKwkJOzsKKwllc2FjCisKKwliPSggJChlY2hvICR7YVskaWR4XX0gfCBzZWQgczovOicgJzopICkKKworCWlmIFsgJHtiWzBdfSAtZXEgMCAtbyAke2JbMF19ICE9ICR7YlsxXX0gXTsgdGhlbgorCQllY2hvICIkbHZtX25hbWUgKCR0eXBlJHNuYXApIGlzIG5vdCBpbi1zeW5jIgorCQlyZXR1cm4gMQorCWZpCisKKwlbWyAke2FbJCgoJGlkeCAtIDEpKV19ID1+IGEgXV0gJiYgXAorCQlkaWUgIiRsdm1fbmFtZSAoJHR5cGUkc25hcCkgaW4tc3luYywgYnV0ICdhJyBjaGFyYWN0ZXJzIGluIGhlYWx0aCBzdGF0dXMiCisKKwllY2hvICIkbHZtX25hbWUgKCR0eXBlJHNuYXApIGlzIGluLXN5bmMgXCIke2FbQF19XCIiCit9CisKK2FjdGl2ZSgpIHsKKwlsb2NhbCBsdj0kMS8kMgorCShnZXQgbHZfZmllbGQgJGx2IGF0dHIgfCBncmVwICJeLi4uLmEuLi4uLiQiID4vZGV2L251bGwpIHx8IFwKKwkJZGllICIkbHYgZXhwZWN0ZWQgYWN0aXZlLCBidXQgbHZzIHNheXMgaXQncyBub3Q6IiBcCisJCQkkKGx2bCAkbHYgLW8rZGV2aWNlcykKKwlkbXNldHVwIGluZm8gJDEtJDIgPi9kZXYvbnVsbCB8fAorCQlkaWUgIiRsdiBleHBlY3RlZCBhY3RpdmUsIGx2cyB0aGlua3MgaXQgaXMgYnV0IHRoZXJlIGFyZSBubyBtYXBwaW5ncyEiCit9CisKK2luYWN0aXZlKCkgeworCWxvY2FsIGx2PSQxLyQyCisJKGdldCBsdl9maWVsZCAkbHYgYXR0ciB8IGdyZXAgIl4uLi4uWy1pc2RdLi4uLi4kIiA+L2Rldi9udWxsKSB8fCBcCisJCWRpZSAiJGx2IGV4cGVjdGVkIGluYWN0aXZlLCBidXQgbHZzIHNheXMgaXQncyBub3Q6IiBcCisJCQkkKGx2bCAkbHYgLW8rZGV2aWNlcykKKwlub3QgZG1zZXR1cCBpbmZvICQxLSQyIDI+L2Rldi9udWxsIHx8IFwKKwkJZGllICIkbHYgZXhwZWN0ZWQgaW5hY3RpdmUsIGx2cyB0aGlua3MgaXQgaXMgYnV0IHRoZXJlIGFyZSBtYXBwaW5ncyEiCit9CisKKyMgQ2hlY2sgZm9yIGxpc3Qgb2YgTFZzIGZyb20gZ2l2ZW4gVkcKK2x2X2V4aXN0cygpIHsKKwlsb2NhbCB2Zz0kMQorCWxvY2FsIGx2PQorCXdoaWxlIFsgJCMgLWd0IDEgXTsgZG8KKwkJc2hpZnQKKwkJbHY9IiRsdiAkdmcvJDEiCisJZG9uZQorCXRlc3QgLW4gIiRsdiIgfHwgbHY9JHZnCisJbHZsICRsdiAmPi9kZXYvbnVsbCB8fCBcCisJCWRpZSAiJGx2IGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCBkb2VzIG5vdCIKK30KKworbHZfbm90X2V4aXN0cygpIHsKKwlsb2NhbCB2Zz0kMQorCWlmIHRlc3QgJCMgLWxlIDEgOyB0aGVuCisJCWlmIGx2bCAkdmcgJj4vZGV2L251bGwgOyB0aGVuCisJCQlkaWUgIiR2ZyBleHBlY3RlZCB0byBub3QgZXhpc3QgYnV0IGl0IGRvZXMhIgorCQlmaQorCWVsc2UKKwkJd2hpbGUgWyAkIyAtZ3QgMSBdOyBkbworCQkJc2hpZnQKKwkJCW5vdCBsdmwgJHZnLyQxICY+L2Rldi9udWxsIHx8IGRpZSAiJHZnLyQxIGV4cGVjdGVkIHRvIG5vdCBleGlzdCBidXQgaXQgZG9lcyEiCisJCWRvbmUKKwlmaQorCXJtIC1mIGRlYnVnLmxvZworfQorCitwdl9maWVsZCgpIHsKKwlsb2NhbCBhY3R1YWw9JChnZXQgcHZfZmllbGQgIiQxIiAiJDIiICIke0A6NH0iKQorCXRlc3QgIiRhY3R1YWwiID0gIiQzIiB8fCBcCisJCWRpZSAicHZfZmllbGQ6IFBWPVwiJDFcIiwgZmllbGQ9XCIkMlwiLCBhY3R1YWw9XCIkYWN0dWFsXCIsIGV4cGVjdGVkPVwiJDNcIiIKK30KKwordmdfZmllbGQoKSB7CisJbG9jYWwgYWN0dWFsPSQoZ2V0IHZnX2ZpZWxkICIkMSIgIiQyIiAiJHtAOjR9IikKKwl0ZXN0ICIkYWN0dWFsIiA9ICIkMyIgfHwgXAorCQlkaWUgInZnX2ZpZWxkOiB2Zz0kMSwgZmllbGQ9XCIkMlwiLCBhY3R1YWw9XCIkYWN0dWFsXCIsIGV4cGVjdGVkPVwiJDNcIiIKK30KKwordmdfYXR0cl9iaXQoKSB7CisJbG9jYWwgYWN0dWFsPSQoZ2V0IHZnX2ZpZWxkICIkMiIgdmdfYXR0ciAiJHtAOjR9IikKKwlsb2NhbCBvZmZzZXQ9JDEKKwljYXNlICIkb2Zmc2V0IiBpbgorCSAgcGVybSopIG9mZnNldD0wIDs7CisJICByZXNpeiopIG9mZnNldD0xIDs7CisJICBleHBvcnQqKSBvZmZzZXQ9MiA7OworCSAgcGFydGlhbCkgb2Zmc2V0PTMgOzsKKwkgIGFsbG9jKikgb2Zmc2V0PTQgOzsKKwkgIGNsdXN0ZXIqKSBvZmZzZXQ9NSA7OworCWVzYWMKKwl0ZXN0ICIke2FjdHVhbDokb2Zmc2V0OjF9IiA9ICIkMyIgfHwgXAorCQlkaWUgInZnX2F0dHJfYml0OiB2Zz0kMiwgJHtvZmZzZXR9IGJpdCBvZiBcIiRhY3R1YWxcIiBpcyBcIiR7YWN0dWFsOiRvZmZzZXQ6MX1cIiwgYnV0IGV4cGVjdGVkIFwiJDNcIiIKK30KKworbHZfZmllbGQoKSB7CisJbG9jYWwgYWN0dWFsPSQoZ2V0IGx2X2ZpZWxkICIkMSIgIiQyIiAiJHtAOjR9IikKKwl0ZXN0ICIkYWN0dWFsIiA9ICIkMyIgfHwgXAorCQlkaWUgImx2X2ZpZWxkOiBsdj0kMSwgZmllbGQ9XCIkMlwiLCBhY3R1YWw9XCIkYWN0dWFsXCIsIGV4cGVjdGVkPVwiJDNcIiIKK30KKworbHZoX2ZpZWxkKCkgeworCWxvY2FsIGFjdHVhbD0kKGdldCBsdmhfZmllbGQgIiQxIiAiJDIiICIke0A6NH0iKQorCXRlc3QgIiRhY3R1YWwiID0gIiQzIiB8fCBcCisJCWRpZSAibHZoX2ZpZWxkOiBsdj0kMSwgZmllbGQ9XCIkMlwiLCBhY3R1YWw9XCIkYWN0dWFsXCIsIGV4cGVjdGVkPVwiJDNcIiIKK30KKworbHZhX2ZpZWxkKCkgeworCWxvY2FsIGFjdHVhbD0kKGdldCBsdmFfZmllbGQgIiQxIiAiJDIiICIke0A6NH0iKQorCXRlc3QgIiRhY3R1YWwiID0gIiQzIiB8fCBcCisJCWRpZSAibHZhX2ZpZWxkOiBsdj0kMSwgZmllbGQ9XCIkMlwiLCBhY3R1YWw9XCIkYWN0dWFsXCIsIGV4cGVjdGVkPVwiJDNcIiIKK30KKworbHZfYXR0cl9iaXQoKSB7CisJbG9jYWwgYWN0dWFsPSQoZ2V0IGx2X2ZpZWxkICIkMiIgbHZfYXR0ciAiJHtAOjR9IikKKwlsb2NhbCBvZmZzZXQ9JDEKKwljYXNlICIkb2Zmc2V0IiBpbgorCSAgdHlwZSkgb2Zmc2V0PTAgOzsKKwkgIHBlcm0qKSBvZmZzZXQ9MSA7OworCSAgYWxsb2MqKSBvZmZzZXQ9MiA7OworCSAgZml4ZWQqKSBvZmZzZXQ9MyA7OworCSAgc3RhdGUpIG9mZnNldD00IDs7CisJICBvcGVuKSBvZmZzZXQ9NSA7OworCSAgdGFyZ2V0KSBvZmZzZXQ9NiA7OworCSAgemVybykgb2Zmc2V0PTcgOzsKKwkgIGhlYWx0aCkgb2Zmc2V0PTggOzsKKwkgIHNraXApIG9mZnNldD05IDs7CisJZXNhYworCXRlc3QgIiR7YWN0dWFsOiRvZmZzZXQ6MX0iID0gIiQzIiB8fCBcCisJCWRpZSAibHZfYXR0cl9iaXQ6IGx2PSQyLCAke29mZnNldH0gYml0IG9mIFwiJGFjdHVhbFwiIGlzIFwiJHthY3R1YWw6JG9mZnNldDoxfVwiLCBidXQgZXhwZWN0ZWQgXCIkM1wiIgorfQorCitjb21wYXJlX2ZpZWxkcygpIHsKKwlsb2NhbCBjbWQxPSQxCisJbG9jYWwgb2JqMT0kMgorCWxvY2FsIGZpZWxkMT0kMworCWxvY2FsIGNtZDI9JDQKKwlsb2NhbCBvYmoyPSQ1CisJbG9jYWwgZmllbGQyPSQ2CisJbG9jYWwgdmFsMT0kKCRjbWQxIC0tbm9oZWFkaW5ncyAtbyAiJGZpZWxkMSIgIiRvYmoxIikKKwlsb2NhbCB2YWwyPSQoJGNtZDIgLS1ub2hlYWRpbmdzIC1vICIkZmllbGQyIiAiJG9iajIiKQorCXRlc3QgIiR2YWwxIiA9ICIkdmFsMiIgfHwgXAorCQlkaWUgImNvbXBhcmVfZmllbGRzICRvYmoxKCRmaWVsZDEpOiAkdmFsMSAkb2JqMigkZmllbGQyKTogJHZhbDIiCit9CisKK2NvbXBhcmVfdmdfZmllbGQoKSB7CisJbG9jYWwgdmcxPSQxCisJbG9jYWwgdmcyPSQyCisJbG9jYWwgZmllbGQ9JDMKKwlsb2NhbCB2YWwxPSQodmdzIC0tbm9oZWFkaW5ncyAtbyAiJGZpZWxkIiAkdmcxKQorCWxvY2FsIHZhbDI9JCh2Z3MgLS1ub2hlYWRpbmdzIC1vICIkZmllbGQiICR2ZzIpCisJdGVzdCAiJHZhbDEiID0gIiR2YWwyIiB8fCBcCisJCWRpZSAiY29tcGFyZV92Z19maWVsZDogJHZnMTogJHZhbDEsICR2ZzI6ICR2YWwyIgorfQorCitwdmx2X2NvdW50cygpIHsKKwlsb2NhbCBsb2NhbF92Zz0kMQorCWxvY2FsIG51bV9wdnM9JDIKKwlsb2NhbCBudW1fbHZzPSQzCisJbG9jYWwgbnVtX3NuYXBzPSQ0CisJbHZzIC1vK2RldmljZXMgJGxvY2FsX3ZnCisJdmdfZmllbGQgJGxvY2FsX3ZnIHB2X2NvdW50ICRudW1fcHZzCisJdmdfZmllbGQgJGxvY2FsX3ZnIGx2X2NvdW50ICRudW1fbHZzCisJdmdfZmllbGQgJGxvY2FsX3ZnIHNuYXBfY291bnQgJG51bV9zbmFwcworfQorCisjIENvbXBhcmUgbWQ1IGNoZWNrIGdlbmVyYXRlZCBmcm9tIGdldCBkZXZfbWQ1c3VtCitkZXZfbWQ1c3VtKCkgeworCW1kNXN1bSAtYyAibWQ1LiQxLSQyIiB8fCBcCisJCShnZXQgbHZfZmllbGQgJDEvJDIgIm5hbWUsc2l6ZSxzZWdfcGVfcmFuZ2VzIgorCQkgZGllICJMViAkMS8kMiBoYXMgZGlmZmVyZW50IE1ENSBjaGVjayBzdW0hIikKK30KKworc3lzZnMoKSB7CisJIyByZWFkIG1haiBtaW4gYW5kIGFsc28gY29udmVydCBoZXggdG8gZGVjaW1hbAorCWxvY2FsIG1haj0kKCgkKHN0YXQgLUwgLS1wcmludGY9MHgldCAiJDEiKSkpCisJbG9jYWwgbWluPSQoKCQoc3RhdCAtTCAtLXByaW50Zj0weCVUICIkMSIpKSkKKwlsb2NhbCBQPSIvc3lzL2Rldi9ibG9jay8kbWFqOiRtaW4vJDIiCisJbG9jYWwgdmFsPSQoPCAiJFAiKSB8fCByZXR1cm4gMCAjIG5vIHN5c2ZzID8KKwl0ZXN0ICIkdmFsIiAtZXEgIiQzIiB8fCBcCisJCWRpZSAiJDE6ICRQID0gJHZhbCBkaWZmZXJzIGZyb20gZXhwZWN0ZWQgdmFsdWUgJDMhIgorfQorCisjc2V0IC14Cit1bnNldCBMVk1fVkFMR1JJTkQKKyIkQCIKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItbmRldi1jbHVzdGVyLWx2bXBvbGxkLnNoIGIvdGVzdC9saWIvZmxhdm91ci1uZGV2LWNsdXN0ZXItbHZtcG9sbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMWJiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItbmRldi1jbHVzdGVyLWx2bXBvbGxkLnNoCkBAIC0wLDAgKzEsMiBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MworZXhwb3J0IExWTV9URVNUX0xWTVBPTExEPTEKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItbmRldi1jbHVzdGVyLnNoIGIvdGVzdC9saWIvZmxhdm91ci1uZGV2LWNsdXN0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MmIxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItbmRldi1jbHVzdGVyLnNoCkBAIC0wLDAgKzEsMiBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MworZXhwb3J0IExWTV9URVNUX0xWTTE9MQpkaWZmIC0tZ2l0IGEvdGVzdC9saWIvZmxhdm91ci1uZGV2LWx2bWV0YWQtbHZtcG9sbGQuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtbHZtZXRhZC1sdm1wb2xsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZiM2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvZmxhdm91ci1uZGV2LWx2bWV0YWQtbHZtcG9sbGQuc2gKQEAgLTAsMCArMSwzIEBACitleHBvcnQgTFZNX1RFU1RfTE9DS0lORz0xCitleHBvcnQgTFZNX1RFU1RfTFZNRVRBRD0xCitleHBvcnQgTFZNX1RFU1RfTFZNUE9MTEQ9MQpkaWZmIC0tZ2l0IGEvdGVzdC9saWIvZmxhdm91ci1uZGV2LWx2bWV0YWQuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtbHZtZXRhZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNjNDllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvZmxhdm91ci1uZGV2LWx2bWV0YWQuc2gKQEAgLTAsMCArMSwyIEBACitleHBvcnQgTFZNX1RFU1RfTE9DS0lORz0xCitleHBvcnQgTFZNX1RFU1RfTFZNRVRBRD0xCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtbHZtcG9sbGQuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtbHZtcG9sbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3MDcwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItbmRldi1sdm1wb2xsZC5zaApAQCAtMCwwICsxLDIgQEAKK2V4cG9ydCBMVk1fVEVTVF9MT0NLSU5HPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1QT0xMRD0xCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtdmFuaWxsYS5zaCBiL3Rlc3QvbGliL2ZsYXZvdXItbmRldi12YW5pbGxhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDZlNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9mbGF2b3VyLW5kZXYtdmFuaWxsYS5zaApAQCAtMCwwICsxLDIgQEAKK2V4cG9ydCBMVk1fVEVTVF9MT0NLSU5HPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk0xPTEKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1jbHVzdGVyLWx2bXBvbGxkLnNoIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LWNsdXN0ZXItbHZtcG9sbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNzZlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1jbHVzdGVyLWx2bXBvbGxkLnNoCkBAIC0wLDAgKzEsMyBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MworZXhwb3J0IExWTV9URVNUX0xWTVBPTExEPTEKK2V4cG9ydCBMVk1fVEVTVF9ERVZESVI9L2RldgpkaWZmIC0tZ2l0IGEvdGVzdC9saWIvZmxhdm91ci11ZGV2LWNsdXN0ZXIuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtY2x1c3Rlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FiNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LWNsdXN0ZXIuc2gKQEAgLTAsMCArMSwzIEBACitleHBvcnQgTFZNX1RFU1RfTE9DS0lORz0zCitleHBvcnQgTFZNX1RFU1RfREVWRElSPS9kZXYKK2V4cG9ydCBMVk1fVEVTVF9MVk0xPTEKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1ldGFkLWx2bXBvbGxkLnNoIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LWx2bWV0YWQtbHZtcG9sbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyNTNkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1ldGFkLWx2bXBvbGxkLnNoCkBAIC0wLDAgKzEsNCBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MQorZXhwb3J0IExWTV9URVNUX0xWTUVUQUQ9MQorZXhwb3J0IExWTV9URVNUX0xWTVBPTExEPTEKK2V4cG9ydCBMVk1fVEVTVF9ERVZESVI9L2RldgpkaWZmIC0tZ2l0IGEvdGVzdC9saWIvZmxhdm91ci11ZGV2LWx2bWV0YWQuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtZXRhZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JlMzJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LWx2bWV0YWQuc2gKQEAgLTAsMCArMSwzIEBACitleHBvcnQgTFZNX1RFU1RfTE9DS0lORz0xCitleHBvcnQgTFZNX1RFU1RfTFZNRVRBRD0xCitleHBvcnQgTFZNX1RFU1RfREVWRElSPS9kZXYKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1sb2NrZC1kbG0uc2ggYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtbG9ja2QtZGxtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDI3NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtbG9ja2QtZGxtLnNoCkBAIC0wLDAgKzEsNiBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MQorZXhwb3J0IExWTV9URVNUX0xWTUVUQUQ9MQorZXhwb3J0IExWTV9URVNUX0xWTVBPTExEPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1MT0NLRD0xCitleHBvcnQgTFZNX1RFU1RfTE9DS19UWVBFX0RMTT0xCitleHBvcnQgTFZNX1RFU1RfREVWRElSPS9kZXYKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1sb2NrZC1zYW5sb2NrLnNoIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LWx2bWxvY2tkLXNhbmxvY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5ZWUyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1sb2NrZC1zYW5sb2NrLnNoCkBAIC0wLDAgKzEsNiBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MQorZXhwb3J0IExWTV9URVNUX0xWTUVUQUQ9MQorZXhwb3J0IExWTV9URVNUX0xWTVBPTExEPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1MT0NLRD0xCitleHBvcnQgTFZNX1RFU1RfTE9DS19UWVBFX1NBTkxPQ0s9MQorZXhwb3J0IExWTV9URVNUX0RFVkRJUj0vZGV2CmRpZmYgLS1naXQgYS90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtbG9ja2QtdGVzdC5zaCBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1sb2NrZC10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTdiNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtbG9ja2QtdGVzdC5zaApAQCAtMCwwICsxLDkgQEAKK2V4cG9ydCBMVk1fVEVTVF9MT0NLSU5HPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1FVEFEPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1QT0xMRD0xCitleHBvcnQgTFZNX1RFU1RfTFZNTE9DS0Q9MQorZXhwb3J0IExWTV9URVNUX0xWTUxPQ0tEX1RFU1Q9MQorZXhwb3J0IExWTV9URVNUX0RFVkRJUj0vZGV2CisKKyMgRklYTUU6ZGN0OiBhZGQgb3B0aW9uIHRvIGFsbG93IC0tdGVzdCB3aXRoIHNhbmxvY2sKK2V4cG9ydCBMVk1fVEVTVF9MVk1MT0NLRF9URVNUX0RMTT0xCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtcG9sbGQuc2ggYi90ZXN0L2xpYi9mbGF2b3VyLXVkZXYtbHZtcG9sbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNDBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi1sdm1wb2xsZC5zaApAQCAtMCwwICsxLDMgQEAKK2V4cG9ydCBMVk1fVEVTVF9MT0NLSU5HPTEKK2V4cG9ydCBMVk1fVEVTVF9MVk1QT0xMRD0xCitleHBvcnQgTFZNX1RFU1RfREVWRElSPS9kZXYKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL2ZsYXZvdXItdWRldi12YW5pbGxhLnNoIGIvdGVzdC9saWIvZmxhdm91ci11ZGV2LXZhbmlsbGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZGFmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2ZsYXZvdXItdWRldi12YW5pbGxhLnNoCkBAIC0wLDAgKzEsMyBAQAorZXhwb3J0IExWTV9URVNUX0xPQ0tJTkc9MQorZXhwb3J0IExWTV9URVNUX0RFVkRJUj0vZGV2CitleHBvcnQgTFZNX1RFU1RfTFZNMT0xCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9nZXQuc2ggYi90ZXN0L2xpYi9nZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MDQxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2dldC5zaApAQCAtMCwwICsxLDEwNyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgZ2V0LnNoOiBnZXQgdmFyaW91cyB2YWx1ZXMgZnJvbSB2b2x1bWVzCisjCisjIFVTQUdFOgorIyAgZ2V0IHB2X2ZpZWxkIFBWIGZpZWxkIFtwdnMgcGFyYW1zXQorIyAgZ2V0IHZnX2ZpZWxkIFZHIGZpZWxkIFt2Z3MgcGFyYW1zXQorIyAgZ2V0IGx2X2ZpZWxkIExWIGZpZWxkIFtsdnMgcGFyYW1zXQorIworIyAgZ2V0IGx2X2RldmljZXMgTFYgICAgIFtsdnMgcGFyYW1zXQorCit0ZXN0IC16ICIkQkFTSCIgfHwgc2V0IC1lIC1vIHBpcGVmYWlsCisKKyMgdHJpbXMgb25seSBsZWFkaW5nIHByZWZpeCBhbmQgc3VmZml4Cit0cmltXygpIHsKKwlybSAtZiBkZWJ1Zy5sb2cgICAgICAgICAgICAgIyBkcm9wIGxvZywgY29tbWFuZCB3YXMgb2sKKwlsb2NhbCB2YXI9JHsxJSR7MSMjKlshIF19fSAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2UgY2hhcmFjdGVycworCWVjaG8gIiR7dmFyIyR7dmFyJSVbISBdKn19IiAjIHJlbW92ZSBsZWFkaW5nIHNwYWNlIGNoYXJhY3RlcnMKK30KKworcHZfZmllbGQoKSB7CisJbG9jYWwgcj0kKHB2cyAtLWNvbmZpZyAnbG9ne3ByZWZpeD0iIn0nIC0tbm9oZWFkaW5ncyAtbyAiJDIiICIke0A6M30iICIkMSIpCisJdHJpbV8gIiRyIgorfQorCit2Z19maWVsZCgpIHsKKwlsb2NhbCByPSQodmdzIC0tY29uZmlnICdsb2d7cHJlZml4PSIifScgLS1ub2hlYWRpbmdzIC1vICIkMiIgIiR7QDozfSIgIiQxIikKKwl0cmltXyAiJHIiCit9CisKK2x2X2ZpZWxkKCkgeworCWxvY2FsIHI9JChsdnMgLS1jb25maWcgJ2xvZ3twcmVmaXg9IiJ9JyAtLW5vaGVhZGluZ3MgLW8gIiQyIiAiJHtAOjN9IiAiJDEiKQorCXRyaW1fICIkciIKK30KKworbHZoX2ZpZWxkKCkgeworCWxvY2FsIHI9JChsdnMgLUggLS1jb25maWcgJ2xvZ3twcmVmaXg9IiJ9JyAtLW5vaGVhZGluZ3MgLW8gIiQyIiAiJHtAOjN9IiAiJDEiKQorCXRyaW1fICIkciIKK30KKworbHZhX2ZpZWxkKCkgeworCWxvY2FsIHI9JChsdnMgLWEgLS1jb25maWcgJ2xvZ3twcmVmaXg9IiJ9JyAtLW5vaGVhZGluZ3MgLW8gIiQyIiAiJHtAOjN9IiAiJDEiKQorCXRyaW1fICIkciIKK30KKworbHZfZGV2aWNlcygpIHsKKwlsdl9maWVsZCAiJDEiIGRldmljZXMgLWEgIiR7QDoyfSIgfCBzZWQgJ3MvKFteKV0qKS8vZzsgcy8sL1xuL2cnCit9CisKK2x2X2ZpZWxkX2x2XygpIHsKKwlsdl9maWVsZCAiJDEiICIkMiIgLWEgLS11bmJ1ZmZlcmVkIHwgc2VkICdzL1xbLy87IHMvXS8vJworfQorCitsdl90cmVlX2RldmljZXNfKCkgeworCWxvY2FsIGx2PSIkMS8kMiIKKwlsb2NhbCB0eXBlPSQobHZfZmllbGQgIiRsdiIgc2VndHlwZSAtYSAtLXVuYnVmZmVyZWQgfCBoZWFkIC1uIDEpCisJbG9jYWwgb3JpZz0kKGx2X2ZpZWxkX2x2XyAiJGx2IiBvcmlnaW4pCisJIyBGSVhNRTogc2hvdWxkIHdlIGNvdW50IGluIGFsc28gb3JpZ2lucyA/CisJI3Rlc3QgLXogIiRvcmlnIiB8fCBsdl90cmVlX2RldmljZXNfICQxICRvcmlnCisJY2FzZSAiJHR5cGUiIGluCisJbGluZWFyfHN0cmlwZWQpCisJCWx2X2RldmljZXMgIiRsdiIKKwkJOzsKKwltaXJyb3J8cmFpZCopCisJCWxvY2FsIGxvZz0kKGx2X2ZpZWxkX2x2XyAiJGx2IiBtaXJyb3JfbG9nKQorCQl0ZXN0IC16ICIkbG9nIiB8fCBsdl90cmVlX2RldmljZXNfICIkMSIgIiRsb2ciCisJCWZvciBpIGluICQobHZfZGV2aWNlcyAiJGx2IikKKwkJCWRvIGx2X3RyZWVfZGV2aWNlc18gIiQxIiAiJGkiOyBkb25lCisJCTs7CisJdGhpbikKKwkJbHZfdHJlZV9kZXZpY2VzXyAiJDEiICIkKGx2X2ZpZWxkX2x2XyAkbHYgcG9vbF9sdikiCisJCTs7CisJdGhpbi1wb29sKQorCQlsdl90cmVlX2RldmljZXNfICIkMSIgIiQobHZfZmllbGRfbHZfICRsdiBkYXRhX2x2KSIKKwkJbHZfdHJlZV9kZXZpY2VzXyAiJDEiICIkKGx2X2ZpZWxkX2x2XyAkbHYgbWV0YWRhdGFfbHYpIgorCQk7OworCWNhY2hlKQorCQlsdl90cmVlX2RldmljZXNfICIkMSIgIiQobHZfZGV2aWNlcyAkbHYpIgorCQk7OworCWNhY2hlLXBvb2wpCisJCWx2X3RyZWVfZGV2aWNlc18gIiQxIiAiJChsdl9maWVsZF9sdl8gJGx2IGRhdGFfbHYpIgorCQlsdl90cmVlX2RldmljZXNfICIkMSIgIiQobHZfZmllbGRfbHZfICRsdiBtZXRhZGF0YV9sdikiCisJCTs7CisJZXNhYworfQorCitsdl90cmVlX2RldmljZXMoKSB7CisJbHZfdHJlZV9kZXZpY2VzXyAiJEAiIHwgc29ydCB8IHVuaXEKK30KKworZmlyc3RfZXh0ZW50X3NlY3RvcigpIHsKKwlwdl9maWVsZCAiJEAiIHBlX3N0YXJ0IC0tdW5pdHMgcyAtLW5vc3VmZml4Cit9CisKKyNzZXQgLXgKK3Vuc2V0IExWTV9WQUxHUklORAordW5zZXQgTFZNX0xPR19GSUxFX0VQT0NICisiJEAiCmRpZmYgLS1naXQgYS90ZXN0L2xpYi9oYXJuZXNzLmMgYi90ZXN0L2xpYi9oYXJuZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlM2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL2hhcm5lc3MuYwpAQCAtMCwwICsxLDY1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9rbG9nLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+IC8qIHJ1c2FnZSAqLworI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgcGlkX3QgcGlkOworc3RhdGljIGludCBmZHNbMl07CisKKyNkZWZpbmUgTUFYIDEwMjQKKyNkZWZpbmUgTUFYX0xPR19TSVpFICgzMioxMDI0KjEwMjQpIC8qIERlZmF1bHQgbWF4IHNpemUgb2YgdGVzdCBsb2cgKi8KKyNkZWZpbmUgV1JJVEVfVElNRU9VVCAoMTgwICogMikJLyogMyBtaW51dGVzICovCisKK3N0cnVjdCBzdGF0cyB7CisJaW50IG5mYWlsZWQ7CisJaW50IG5za2lwcGVkOworCWludCBucGFzc2VkOworCWludCBua25vd25mYWlsOworCWludCBud2FybmVkOworCWludCBuaW50ZXJydXB0ZWQ7CisJaW50IHN0YXR1c1tNQVhdOworfTsKKworc3RhdGljIHN0cnVjdCBzdGF0cyBzOworCitzdGF0aWMgY2hhciAqcmVhZGJ1ZiA9IE5VTEw7CitzdGF0aWMgc2l6ZV90IHJlYWRidWZfc3ogPSAwLCByZWFkYnVmX3VzZWQgPSAwOworCitzdGF0aWMgaW50IGRpZSA9IDA7CitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOyAvKiA+MSB3aXRoIHRpbWVzdGFtcHMgKi8KK3N0YXRpYyBpbnQgaW50ZXJhY3RpdmUgPSAwOyAvKiBkaXNhYmxlIGFsbCByZWRpcmVjdGlvbnMgKi8KK3N0YXRpYyBpbnQgcXVpZXQgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKnJlc3VsdHM7CitzdGF0aWMgdW5zaWduZWQgZnVsbGJ1ZmZlciA9IDA7CitzdGF0aWMgaW50IHVubGltaXRlZCA9IDA7CitzdGF0aWMgaW50IHdyaXRlX3RpbWVvdXQgPSBXUklURV9USU1FT1VUOworCitzdGF0aWMgdGltZV90IGhhcm5lc3Nfc3RhcnQ7CisKK3N0YXRpYyBGSUxFICpvdXRmaWxlID0gTlVMTDsKK2NoYXIgdGVzdGRpcmRlYnVnW1BBVEhfTUFYXTsKKworc3RydWN0IHN1YnN0IHsKKwljb25zdCBjaGFyICprZXk7CisJY2hhciAqdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHN1YnN0IHN1YnN0WzJdOworCitlbnVtIHsKKwlVTktOT1dOLAorCUZBSUxFRCwKKwlJTlRFUlJVUFRFRCwKKwlLTk9XTkZBSUwsCisJUEFTU0VELAorCVNLSVBQRUQsCisJVElNRU9VVCwKKwlXQVJORUQsCit9OworCitzdGF0aWMgdm9pZCBoYW5kbGVyKCBpbnQgc2lnICkgeworCXNpZ25hbCggc2lnLCBTSUdfREZMICk7CisJa2lsbCggLXBpZCwgc2lnICk7CisJZGllID0gc2lnOworfQorCitzdGF0aWMgaW50IG91dGxpbmUoRklMRSAqb3V0LCBjaGFyICpidWYsIGludCBzdGFydCwgaW50IGZvcmNlKSB7CisJY2hhciAqZnJvbSA9IGJ1ZiArIHN0YXJ0OworCWNoYXIgKm5leHQgPSBzdHJjaHIoYnVmICsgc3RhcnQsICdcbicpOworCisJaWYgKCFuZXh0ICYmICFmb3JjZSkgLyogbm90IGEgY29tcGxldGUgbGluZSB5ZXQuLi4gKi8KKwkJcmV0dXJuIHN0YXJ0OworCisJaWYgKCFuZXh0KQorCQluZXh0ID0gZnJvbSArIHN0cmxlbihmcm9tKTsKKwllbHNlCisJCSsrbmV4dDsKKworCWlmICghc3RybmNtcChmcm9tLCAiQFRFU1RESVI9IiwgOSkpIHsKKwkJc3Vic3RbMF0ua2V5ID0gIkBURVNURElSQCI7CisJCWZyZWUoc3Vic3RbMF0udmFsdWUpOworCQlzdWJzdFswXS52YWx1ZSA9IHN0cm5kdXAoZnJvbSArIDksIG5leHQgLSBmcm9tIC0gOSAtIDEpOworCQlzbnByaW50Zih0ZXN0ZGlyZGVidWcsIHNpemVvZih0ZXN0ZGlyZGVidWcpLCAiJXMvZGVidWcubG9nIiwgc3Vic3RbMF0udmFsdWUpOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoZnJvbSwgIkBQUkVGSVg9IiwgOCkpIHsKKwkJc3Vic3RbMV0ua2V5ID0gIkBQUkVGSVhAIjsKKwkJZnJlZShzdWJzdFsxXS52YWx1ZSk7CisJCXN1YnN0WzFdLnZhbHVlID0gc3RybmR1cChmcm9tICsgOCwgbmV4dCAtIGZyb20gLSA4IC0gMSk7CisJfSBlbHNlIHsKKwkJY2hhciAqbGluZSA9IHN0cm5kdXAoZnJvbSwgbmV4dCAtIGZyb20pOworCQljaGFyICphID0gbGluZSwgKmI7CisJCWRvIHsKKwkJCWludCBpZHggPSAtMTsKKwkJCWludCBpOworCQkJYiA9IGxpbmUgKyBzdHJsZW4obGluZSk7CisJCQlmb3IgKCBpID0gMDsgaSA8IDI7ICsraSApIHsKKwkJCQlpZiAoc3Vic3RbaV0ua2V5KSB7CisJCQkJCS8vIHByaW50ZigidHJ5aW5nOiAlcyAtPiAlc1xuIiwgc3Vic3RbaV0udmFsdWUsIHN1YnN0W2ldLmtleSk7CisJCQkJCWNoYXIgKnN0b3AgPSBzdHJzdHIoYSwgc3Vic3RbaV0udmFsdWUpOworCQkJCQlpZiAoc3RvcCAmJiBzdG9wIDwgYikgeworCQkJCQkJaWR4ID0gaTsKKwkJCQkJCWIgPSBzdG9wOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZndyaXRlKGEsIDEsIGIgLSBhLCBvdXQpOworCQkJYSA9IGI7CisKKwkJCWlmICggaWR4ID49IDAgKSB7CisJCQkJZnByaW50ZihvdXQsICIlcyIsIHN1YnN0W2lkeF0ua2V5KTsKKwkJCQlhICs9IHN0cmxlbihzdWJzdFtpZHhdLnZhbHVlKTsKKwkJCX0KKwkJfSB3aGlsZSAoYiA8IGxpbmUgKyBzdHJsZW4obGluZSkpOworCQlmcmVlKGxpbmUpOworCX0KKworCXJldHVybiBuZXh0IC0gYnVmICsgKGZvcmNlID8gMCA6IDEpOworfQorCitzdGF0aWMgdm9pZCBkdW1wKHZvaWQpIHsKKwlpbnQgY291bnRlcl9sYXN0ID0gLTEsIGNvdW50ZXIgPSAwOworCisJd2hpbGUgKChjb3VudGVyIDwgKGludCkgcmVhZGJ1Zl91c2VkKSAmJiAoY291bnRlciAhPSBjb3VudGVyX2xhc3QpKSB7CisJCWNvdW50ZXJfbGFzdCA9IGNvdW50ZXI7CisJCWNvdW50ZXIgPSBvdXRsaW5lKCBzdGRvdXQsIHJlYWRidWYsIGNvdW50ZXIsIDEgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRyaWNrbGUoRklMRSAqb3V0LCBpbnQgKmxhc3QsIGludCAqY291bnRlcikgeworCWlmICgqbGFzdCA+IChpbnQpIHJlYWRidWZfdXNlZCkgeworCQkqbGFzdCA9IC0xOworCQkqY291bnRlciA9IDA7CisJfQorCXdoaWxlICgoKmNvdW50ZXIgPCAoaW50KSByZWFkYnVmX3VzZWQpICYmICgqY291bnRlciAhPSAqbGFzdCkpIHsKKwkJKmxhc3QgPSAqY291bnRlcjsKKwkJKmNvdW50ZXIgPSBvdXRsaW5lKCBvdXQsIHJlYWRidWYsICpjb3VudGVyLCAxICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcih2b2lkKSB7CisJcmVhZGJ1Zl91c2VkID0gMDsKKwlmdWxsYnVmZmVyID0gMDsKK30KKworc3RhdGljIGludDY0X3QgX2dldF90aW1lX3VzKHZvaWQpCit7CisgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICAgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisgICAgICAgcmV0dXJuIChpbnQ2NF90KSB0di50dl9zZWMgKiAxMDAwMDAwICsgKGludDY0X3QpIHR2LnR2X3VzZWM7Cit9CisKK3N0YXRpYyB2b2lkIF9hcHBlbmRfYnVmKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAoKHJlYWRidWZfdXNlZCArIGxlbikgPj0gcmVhZGJ1Zl9zeikgeworCQlpZiAoKHJlYWRidWZfc3ogPj0gTUFYX0xPR19TSVpFKSAmJiAhdW5saW1pdGVkKSB7CisJCQlpZiAoZnVsbGJ1ZmZlcisrID09ICAwKQorCQkJCWtpbGwoLXBpZCwgU0lHSU5UKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZWFkYnVmX3N6ID0gMiAqIChyZWFkYnVmX3VzZWQgKyBsZW4gKyByZWFkYnVmX3N6KTsKKwkJcmVhZGJ1ZiA9IHJlYWxsb2MocmVhZGJ1ZiwgcmVhZGJ1Zl9zeik7CisJfQorCisJaWYgKCFyZWFkYnVmKQorCQlleGl0KDIwNSk7CisKKwltZW1jcHkocmVhZGJ1ZiArIHJlYWRidWZfdXNlZCwgYnVmLCBsZW4pOworCXJlYWRidWZfdXNlZCArPSBsZW47Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfYXBwZW5kX3dpdGhfc3RhbXAoY29uc3QgY2hhciAqYnVmLCBpbnQgc3RhbXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3BhY2VzW10gPSAiICAgICAgICAgICAgICAgICAiOworCXN0YXRpYyBpbnQ2NF90IHRfbGFzdDsKKwlzdGF0aWMgaW50NjRfdCB0X3N0YXJ0ID0gMDsKKwlpbnQ2NF90IHRfbm93OworCWNoYXIgc3RhbXBfYnVmWzMyXTsgLyogQmlnZ2VyIHRvIGFsd2F5cyBmaXQgYm90aCBudW1iZXJzICovCisJY29uc3QgY2hhciAqYmU7CisJY29uc3QgY2hhciAqYmIgPSBidWY7CisJc2l6ZV90IGxlbjsKKworCXdoaWxlICgoYmUgPSBzdHJjaHIoYmIsICdcbicpKSkgeworCQlpZiAoc3RhbXArKyA9PSAwKSB7CisJCQl0X25vdyA9IF9nZXRfdGltZV91cygpOworCQkJaWYgKCF0X3N0YXJ0KQorCQkJCXRfc3RhcnQgPSB0X2xhc3QgPSB0X25vdzsKKwkJCWxlbiA9IHNucHJpbnRmKHN0YW1wX2J1Ziwgc2l6ZW9mKHN0YW1wX2J1ZiksCisJCQkJICAgICAgICIlOC4zZiU4LjRmICIsCisJCQkJICAgICAgICh0X25vdyAtIHRfc3RhcnQpIC8gMTAwMDAwMC5mLAorCQkJCSAgICAgICAodF9ub3cgLSB0X2xhc3QpIC8gMTAwMDAwMC5mKTsKKwkJCV9hcHBlbmRfYnVmKHN0YW1wX2J1ZiwgKGxlbiA8IChzaXplb2Yoc3BhY2VzKSAtIDEpKSA/CisJCQkJICAgIGxlbiA6IChzaXplb2Yoc3BhY2VzKSAtIDEpKTsKKwkJCXRfbGFzdCA9IHRfbm93OworCQl9CisKKwkJX2FwcGVuZF9idWYoYmIsIGJlICsgMSAtIGJiKTsKKwkJYmIgPSBiZSArIDE7CisKKwkJaWYgKHN0YW1wID4gMCAmJiBiYlswXSkKKwkJCV9hcHBlbmRfYnVmKHNwYWNlcywgc2l6ZW9mKHNwYWNlcykgLSAxKTsKKwl9CisKKwlyZXR1cm4gYmI7Cit9CisKK3N0YXRpYyBpbnQgZHJhaW4oaW50IGZkKQoreworCWNoYXIgYnVmWzIgKiAxMDI0ICogMTAyNCArIDFdOyAvKiB0cnkgdG8gY2FwdHVyZSBsYXJnZSBzeXNycSB0cmFjZSAqLworCWNvbnN0IGNoYXIgKmJwOworCWludCBzdGFtcCA9IDA7CisJaW50IHN6OworCisJc3RhdGljIGludCBzdGRvdXRfbGFzdCA9IC0xLCBzdGRvdXRfY291bnRlciA9IDA7CisJc3RhdGljIGludCBvdXRmaWxlX2xhc3QgPSAtMSwgb3V0ZmlsZV9jb3VudGVyID0gMDsKKworCWlmICgoc3ogPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpIC0gMSkpID4gMCkgeworCQlidWZbc3pdID0gJ1wwJzsKKwkJYnAgPSAodmVyYm9zZSA8IDIpID8gYnVmIDogX2FwcGVuZF93aXRoX3N0YW1wKGJ1Ziwgc3RhbXApOworCQlpZiAoc3ogPiAoYnAgLSBidWYpKSB7CisJCQlfYXBwZW5kX2J1ZihicCwgc3ogLSAoYnAgLSBidWYpKTsKKwkJCXN0YW1wID0gLTE7IC8qIHVuZmluaXNoZWQgbGluZSAqLworCQl9IGVsc2UKKwkJCXN0YW1wID0gMDsKKworCQlyZWFkYnVmW3JlYWRidWZfdXNlZF0gPSAwOworCisJCWlmICh2ZXJib3NlKQorCQkJdHJpY2tsZShzdGRvdXQsICZzdGRvdXRfbGFzdCwgJnN0ZG91dF9jb3VudGVyKTsKKwkJaWYgKG91dGZpbGUpCisJCQl0cmlja2xlKG91dGZpbGUsICZvdXRmaWxlX2xhc3QsICZvdXRmaWxlX2NvdW50ZXIpOworCX0KKworCXJldHVybiBzejsKK30KKworc3RhdGljIGludCBkcmFpbl9mZHMoaW50IGZkMSwgaW50IGZkMiwgbG9uZyB0aW1lb3V0KQoreworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBTWVNMT0dfQUNUSU9OX1JFQURfQ0xFQVIgICAgIDQKKyNkZWZpbmUgU1lTTE9HX0FDVElPTl9DTEVBUiAgICAgICAgICA1CisKK3N0YXRpYyB2b2lkIGNsZWFyX2RtZXNnKHZvaWQpCit7CisJa2xvZ2N0bChTWVNMT0dfQUNUSU9OX0NMRUFSLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHJhaW5fZG1lc2codm9pZCkKK3sKKwljaGFyIGJ1ZlsxMDI0ICogMTAyNCArIDFdOworCWludCBzeiA9IGtsb2djdGwoU1lTTE9HX0FDVElPTl9SRUFEX0NMRUFSLCBidWYsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKHN6ID4gMCkgeworCQlidWZbc3pdID0gMDsKKwkJX2FwcGVuZF9idWYoYnVmLCBzeik7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZHVyYXRpb24odGltZV90IHN0YXJ0LCBjb25zdCBzdHJ1Y3QgcnVzYWdlICp1c2FnZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTAwXTsKKwlpbnQgdCA9IChpbnQpKHRpbWUoTlVMTCkgLSBzdGFydCk7CisKKwlpbnQgcCA9IHNwcmludGYoYnVmLCAiJTJkOiUwMmQiLCB0IC8gNjAsIHQgJSA2MCk7CisKKwlpZiAodXNhZ2UpCisJCXNwcmludGYoYnVmICsgcCwgIiAgICUybGQ6JTAybGQuJTAzbGQvJWxkOiUwMmxkLiUwM2xkJTVsZCU4bGQvJWxkIiwKKwkJCXVzYWdlLT5ydV91dGltZS50dl9zZWMgLyA2MCwgdXNhZ2UtPnJ1X3V0aW1lLnR2X3NlYyAlIDYwLAorCQkJdXNhZ2UtPnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwLAorCQkJdXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyAvIDYwLCB1c2FnZS0+cnVfc3RpbWUudHZfc2VjICUgNjAsCisJCQl1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyAvIDEwMDAsCisJCQl1c2FnZS0+cnVfbWF4cnNzIC8gMTAyNCwKKwkJCXVzYWdlLT5ydV9pbmJsb2NrLCB1c2FnZS0+cnVfb3VibG9jayk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwYXNzZWQoaW50IGksIGNoYXIgKmYsIHRpbWVfdCB0LCBjb25zdCBzdHJ1Y3QgcnVzYWdlICp1c2FnZSkgeworCWlmIChyZWFkYnVmICYmIHN0cnN0cihyZWFkYnVmLCAiVEVTVCBFWFBFQ1QgRkFJTCIpKSB7CisJCSsrIHMubnBhc3NlZDsKKwkJcy5zdGF0dXNbaV0gPSBQQVNTRUQ7CisJCXByaW50ZigicGFzc2VkIChVTkVYUEVDVEVEKS4gJXNcbiIsIGR1cmF0aW9uKHQsIHVzYWdlKSk7CisJfSBlbHNlIGlmIChyZWFkYnVmICYmIHN0cnN0cihyZWFkYnVmLCAiVEVTVCBXQVJOSU5HIikpIHsKKwkJKytzLm53YXJuZWQ7CisJCXMuc3RhdHVzW2ldID0gV0FSTkVEOworCQlwcmludGYoIndhcm5pbmdzICAlc1xuIiwgZHVyYXRpb24odCwgdXNhZ2UpKTsKKwl9IGVsc2UgeworCQkrKyBzLm5wYXNzZWQ7CisJCXMuc3RhdHVzW2ldID0gUEFTU0VEOworCQlwcmludGYoInBhc3NlZC4gICAlc1xuIiwgZHVyYXRpb24odCwgdXNhZ2UpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludGVycnVwdGVkKGludCBpLCBjaGFyICpmKSB7CisJKysgcy5uaW50ZXJydXB0ZWQ7CisJcy5zdGF0dXNbaV0gPSBJTlRFUlJVUFRFRDsKKwlwcmludGYoIlxuaW50ZXJydXB0ZWQuXG4iKTsKKwlpZiAoIXF1aWV0ICYmICF2ZXJib3NlICYmIGZ1bGxidWZmZXIpIHsKKwkJcHJpbnRmKCItLSBJbnRlcnJ1cHRlZCAlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIGYpOworCQlkdW1wKCk7CisJCXByaW50ZigiXG4tLSBJbnRlcnJ1cHRlZCAlcyAoZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIGYpOworCX0KK30KKworc3RhdGljIHZvaWQgdGltZW91dChpbnQgaSwgY2hhciAqZikgeworCSsrIHMubmludGVycnVwdGVkOworCXMuc3RhdHVzW2ldID0gVElNRU9VVDsKKwlwcmludGYoInRpbWVvdXQuXG4iKTsKKwlpZiAoIXF1aWV0ICYmICF2ZXJib3NlICYmIHJlYWRidWYpIHsKKwkJcHJpbnRmKCItLSBUaW1lZCBvdXQgJXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBmKTsKKwkJZHVtcCgpOworCQlwcmludGYoIlxuLS0gVGltZWQgb3V0ICVzIChlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgZik7CisJfQorfQorCitzdGF0aWMgdm9pZCBza2lwcGVkKGludCBpLCBjaGFyICpmKSB7CisJKysgcy5uc2tpcHBlZDsKKwlzLnN0YXR1c1tpXSA9IFNLSVBQRUQ7CisJcHJpbnRmKCJza2lwcGVkLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGZhaWxlZChpbnQgaSwgY2hhciAqZiwgaW50IHN0KSB7CisJaWYgKHJlYWRidWYgJiYgc3Ryc3RyKHJlYWRidWYsICJURVNUIEVYUEVDVCBGQUlMIikpIHsKKwkJcHJpbnRmKCJGQUlMRUQgKGV4cGVjdGVkKS5cbiIpOworCQlzLnN0YXR1c1tpXSA9IEtOT1dORkFJTDsKKwkJKysgcy5ua25vd25mYWlsOworCQlyZXR1cm47CisJfQorCisJKysgcy5uZmFpbGVkOworCXMuc3RhdHVzW2ldID0gRkFJTEVEOworCXByaW50ZigiRkFJTEVEICAoc3RhdHVzICVkKS5cbiIsIFdFWElUU1RBVFVTKHN0KSk7CisJaWYgKCFxdWlldCAmJiAhdmVyYm9zZSAmJiByZWFkYnVmKSB7CisJCXByaW50ZigiLS0gRkFJTEVEICVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgZik7CisJCWR1bXAoKTsKKwkJcHJpbnRmKCItLSBGQUlMRUQgJXMgKGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ1bihpbnQgaSwgY2hhciAqZikgeworCXN0cnVjdCBydXNhZ2UgdXNhZ2U7CisJY2hhciBmbGF2b3VyWzUxMl0sIHNjcmlwdFs1MTJdOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSB7CisJCXBlcnJvcigiRm9yayBmYWlsZWQuIik7CisJCWV4aXQoMjAxKTsKKwl9IGVsc2UgaWYgKHBpZCA9PSAwKSB7CisJCWlmICghaW50ZXJhY3RpdmUpIHsKKwkJCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJCQlkdXAyKGZkc1sxXSwgU1RET1VUX0ZJTEVOTyk7CisJCQlkdXAyKGZkc1sxXSwgU1RERVJSX0ZJTEVOTyk7CisJCQljbG9zZShmZHNbMV0pOworCQl9CisJCWNsb3NlKGZkc1swXSk7CisJCWlmIChzdHJjaHIoZiwgJzonKSkgeworCQkJc3RyY3B5KGZsYXZvdXIsIGYpOworCQkJKnN0cmNocihmbGF2b3VyLCAnOicpID0gMDsKKwkJCXNldGVudigiTFZNX1RFU1RfRkxBVk9VUiIsIGZsYXZvdXIsIDEpOworCQkJc3RyY3B5KHNjcmlwdCwgc3RyY2hyKGYsICc6JykgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCXN0cmNweShzY3JpcHQsIGYpOworCQl9CisJCXNldHBnaWQoMCwgMCk7CisJCWV4ZWNscCgiYmFzaCIsICJiYXNoIiwgIi1ub3Byb2ZpbGUiLCAiLW5vcmMiLCBzY3JpcHQsIE5VTEwpOworCQlwZXJyb3IoImV4ZWNscCIpOworCQlmZmx1c2goc3RkZXJyKTsKKwkJX2V4aXQoMjAyKTsKKwl9IGVsc2UgeworCQlpbnQgc3QgPSAtMSwgdzsKKwkJdGltZV90IHN0YXJ0ID0gdGltZShOVUxMKTsKKwkJY2hhciBidWZbMTI4XTsKKwkJY2hhciBvdXRwYXRoW1BBVEhfTUFYXTsKKwkJY2hhciAqYyA9IG91dHBhdGggKyBzdHJsZW4ocmVzdWx0cykgKyAxOworCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQlpbnQgcnVuYXdheSA9IDA7CisJCWludCBub193cml0ZSA9IDA7CisJCWludCBjbG9iYmVyX2RtZXNnID0gMDsKKwkJaW50IGNvbGxlY3RfZGVidWcgPSAwOworCQlpbnQgZmRfZGVidWdsb2cgPSAtMTsKKwkJaW50IGZkX2ttc2c7CisJCWZkX3NldCBzZXQ7CisJCWludCByZXQ7CisKKwkJLy9jbG9zZShmZHNbMV0pOworCQl0ZXN0ZGlyZGVidWdbMF0gPSAnXDAnOyAvKiBDYXB0dXJlIFJVTlRFU1RESVIgKi8KKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIC4uLiIsIGYpOworCQlwcmludGYoIlJ1bm5pbmcgJS02MHMlYyIsIGJ1ZiwgdmVyYm9zZSA/ICdcbicgOiAnICcpOworCQlmZmx1c2goc3Rkb3V0KTsKKwkJc25wcmludGYob3V0cGF0aCwgc2l6ZW9mKG91dHBhdGgpLCAiJXMvJXMudHh0IiwgcmVzdWx0cywgZik7CisJCXdoaWxlICgoYyA9IHN0cmNocihjLCAnLycpKSkKKwkJCSpjID0gJ18nOworCQlpZiAoIShvdXRmaWxlID0gZm9wZW4ob3V0cGF0aCwgInciKSkpCisJCQlwZXJyb3IoImZvcGVuIik7CisKKwkJLyogTWl4LWluIGtlcm5lbCBsb2cgbWVzc2FnZSAqLworCQlpZiAoKGZkX2ttc2cgPSBvcGVuKCIvZGV2L2ttc2ciLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spKSA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpIC8qIE9sZGVyIGtlcm5lbHMgKDwzLjUpIGRvIG5vdCBzdXBwb3J0IC9kZXYva21zZyAqLworCQkJCXBlcnJvcigib3BlbiAvZGV2L2ttc2ciKTsKKwkJfSBlbHNlIGlmIChsc2VlayhmZF9rbXNnLCAwTCwgU0VFS19FTkQpID09IChvZmZfdCkgLTEpCisJCQlwZXJyb3IoImxzZWVrIC9kZXYva21zZyIpOworCisJCWlmICgoZmRfa21zZyA8IDApICYmCisJCSAgICAoY2xvYmJlcl9kbWVzZyA9IHN0cmNtcChnZXRlbnYoIkxWTV9URVNUX0NBTl9DTE9CQkVSX0RNRVNHIikgPyA6ICIwIiwgIjAiKSkpCisJCQljbGVhcl9kbWVzZygpOworCisJCXdoaWxlICgodyA9IHdhaXQ0KHBpZCwgJnN0LCBXTk9IQU5HLCAmdXNhZ2UpKSA9PSAwKSB7CisJCQlzdHJ1Y3QgdGltZXZhbCBzZWxlY3R3YWl0ID0geyAudHZfdXNlYyA9IDUwMDAwMCB9OyAvKiAwLjVzICovCisKKwkJCWlmICgoZnVsbGJ1ZmZlciAmJiBmdWxsYnVmZmVyKysgPT0gODAwMCkgfHwKKwkJCSAgICAod3JpdGVfdGltZW91dCA+IDAgJiYgbm9fd3JpdGUgPiB3cml0ZV90aW1lb3V0KSkgCisJCQl7CisJCQl0aW1lb3V0OgorCQkJCWtpbGwocGlkLCBTSUdJTlQpOworCQkJCXNsZWVwKDUpOyAvKiB3YWl0IGEgYml0IGZvciBhIHJlYWN0aW9uICovCisJCQkJaWYgKCh3ID0gd2FpdHBpZChwaWQsICZzdCwgV05PSEFORykpID09IDApIHsKKwkJCQkJaWYgKHdyaXRlX3RpbWVvdXQgPiAwICYmIG5vX3dyaXRlID4gd3JpdGVfdGltZW91dCkKKwkJCQkJCS8qCisJCQkJCQkgKiBLZXJuZWwgdHJhY2VzIG5lZWRlZCwgd2hlbiBzdHVjayBmb3IKKwkJCQkJCSAqIHRvbyBsb25nIGluIHVzZXJzcGFjZSB3aXRob3V0IHByb2R1Y2luZworCQkJCQkJICogYW55IG91dHB1dCwgaW4gb3RoZXIgY2FzZSBpdCBzaG91bGQgYmUKKwkJCQkJCSAqIHVzZXIgc3BhY2UgcHJvYmxlbQorCQkJCQkJICovCisJCQkJCQlzeXN0ZW0oImVjaG8gdCA+IC9wcm9jL3N5c3JxLXRyaWdnZXIiKTsKKwkJCQkJY29sbGVjdF9kZWJ1ZyA9IDE7CisJCQkJCWtpbGwoLXBpZCwgU0lHS0lMTCk7CisJCQkJCXcgPSBwaWQ7IC8vIHdhaXRwaWQocGlkLCAmc3QsIE5VTEwpOworCQkJCX0KKwkJCQlydW5hd2F5ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGNsb2JiZXJfZG1lc2cpCisJCQkJZHJhaW5fZG1lc2coKTsKKworCQkJRkRfWkVSTygmc2V0KTsKKwkJCUZEX1NFVChmZHNbMF0sICZzZXQpOworCQkJaWYgKGZkX2ttc2cgPj0gMCkKKwkJCQlGRF9TRVQoZmRfa21zZywgJnNldCk7CisKKwkJCWlmICgocmV0ID0gc2VsZWN0KGZkX2ttc2cgPiBmZHNbMF0gPyBmZF9rbXNnICsgMSA6IGZkc1swXSArIDEsICZzZXQsIE5VTEwsIE5VTEwsICZzZWxlY3R3YWl0KSkgPD0gMCkgeworCQkJCS8qIFN0aWxsIGNoZWNraW5nIGRlYnVnIGxvZyBzaXplIGlmIGl0J3Mgbm90IGdyb3dpbmcgdG9vIG11Y2ggKi8KKwkJCQlpZiAoIXVubGltaXRlZCAmJiB0ZXN0ZGlyZGVidWdbMF0gJiYKKwkJCQkgICAgKHN0YXQodGVzdGRpcmRlYnVnLCAmc3RhdGJ1ZikgPT0gMCkgJiYKKwkJCQkgICAgc3RhdGJ1Zi5zdF9zaXplID4gMzIgKiAxMDI0ICogMTAyNCkgeyAvKiAzMk1CIGNvbW1hbmQgbG9nIHNpemUgKi8KKwkJCQkJcHJpbnRmKCJLaWxsaW5nIHRlc3Qgc2luY2UgZGVidWcubG9nIGhhcyBnb25lIHdpbGQgKHNpemUgJWxkKVxuIiwKKwkJCQkJICAgICAgIHN0YXRidWYuc3Rfc2l6ZSk7CisJCQkJCWdvdG8gdGltZW91dDsKKwkJCQl9CisJCQkJbm9fd3JpdGUrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKEZEX0lTU0VUKGZkc1swXSwgJnNldCkgJiYgZHJhaW4oZmRzWzBdKSA+IDApCisJCQkJbm9fd3JpdGUgPSAwOworCQkJZWxzZSBpZiAoZmRfa21zZyA+PSAwICYmIEZEX0lTU0VUKGZkX2ttc2csICZzZXQpICYmIChkcmFpbihmZF9rbXNnKSA8IDApKSB7CisJCQkJY2xvc2UoZmRfa21zZyk7CisJCQkJZmRfa21zZyA9IC0xOyAvKiBMaWtlbHkgL2Rldi9rbXNnIGlzIG5vdCByZWFkYWJsZSAqLworCQkJCWlmICgoY2xvYmJlcl9kbWVzZyA9IHN0cmNtcChnZXRlbnYoIkxWTV9URVNUX0NBTl9DTE9CQkVSX0RNRVNHIikgPyA6ICIwIiwgIjAiKSkpCisJCQkJCWNsZWFyX2RtZXNnKCk7CisJCQl9CisJCX0KKwkJaWYgKHcgIT0gcGlkKSB7CisJCQlwZXJyb3IoIndhaXRwaWQiKTsKKwkJCWV4aXQoMjA2KTsKKwkJfQorCisJCXdoaWxlICghZnVsbGJ1ZmZlciAmJiAoZHJhaW5fZmRzKGZkc1swXSwgZmRfa21zZywgMCkgPiAwKSkKKwkJCS8qIHJlYWQgb3V0IHdoYXQgd2FzIGxlZnQgKi87CisKKwkJaWYgKGRpZSA9PSAyKQorCQkJaW50ZXJydXB0ZWQoaSwgZik7CisJCWVsc2UgaWYgKHJ1bmF3YXkpIHsKKwkJCWlmIChjb2xsZWN0X2RlYnVnICYmCisJCQkgICAgKGZkX2RlYnVnbG9nID0gb3Blbih0ZXN0ZGlyZGVidWcsIE9fUkRPTkxZKSkgIT0gLTEpIHsKKwkJCQlydW5hd2F5ID0gdW5saW1pdGVkID8gSU5UMzJfTUFYIDogNCAqIDEwMjQgKiAxMDI0OworCQkJCXdoaWxlICghZnVsbGJ1ZmZlciAmJiBydW5hd2F5ID4gMCAmJiAocmV0ID0gZHJhaW4oZmRfZGVidWdsb2cpKSA+IDApCisJCQkJCXJ1bmF3YXkgLT0gcmV0OworCQkJCWNsb3NlKGZkX2RlYnVnbG9nKTsKKwkJCX0KKwkJCXRpbWVvdXQoaSwgZik7CisJCX0gZWxzZSBpZiAoV0lGRVhJVEVEKHN0KSkgeworCQkJaWYgKFdFWElUU1RBVFVTKHN0KSA9PSAwKQorCQkJCXBhc3NlZChpLCBmLCBzdGFydCwgJnVzYWdlKTsKKwkJCWVsc2UgaWYgKFdFWElUU1RBVFVTKHN0KSA9PSAyMDApCisJCQkJc2tpcHBlZChpLCBmKTsKKwkJCWVsc2UKKwkJCQlmYWlsZWQoaSwgZiwgc3QpOworCQl9IGVsc2UKKwkJCWZhaWxlZChpLCBmLCBzdCk7CisKKwkJaWYgKGZkX2ttc2cgPj0gMCkKKwkJCWNsb3NlKGZkX2ttc2cpOworCQllbHNlIGlmIChjbG9iYmVyX2RtZXNnKQorCQkJZHJhaW5fZG1lc2coKTsKKwkJaWYgKG91dGZpbGUpCisJCQlmY2xvc2Uob3V0ZmlsZSk7CisJCWlmIChmdWxsYnVmZmVyKQorCQkJcHJpbnRmKCJcblRlc3Qgd2FzIGludGVycnVwdGVkLCBvdXRwdXQgaGFzIGdvdCB0b28gbGFyZ2UgKD4ldSkgKGxvb3A6JXUpXG4iCisJCQkgICAgICAgIlNldCBMVk1fVEVTVF9VTkxJTUlURUQ9MSBmb3IgdW5saW1pdGVkIGxvZy5cbiIsCisJCQkgICAgICAgKHVuc2lnbmVkKSByZWFkYnVmX3N6LCBmdWxsYnVmZmVyKTsKKwkJY2xlYXIoKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworCWNoYXIgcmVzdWx0c19saXN0W1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpyZXN1bHQ7CisJY29uc3QgY2hhciAqYmVfdmVyYm9zZSA9IGdldGVudigiVkVSQk9TRSIpLAorCQkgICAqYmVfaW50ZXJhY3RpdmUgPSBnZXRlbnYoIklOVEVSQUNUSVZFIiksCisJCSAgICpiZV9xdWlldCA9IGdldGVudigiUVVJRVQiKSwKKwkJICAgKmJlX3dyaXRlX3RpbWVvdXQgPSBnZXRlbnYoIldSSVRFX1RJTUVPVVQiKTsKKwl0aW1lX3Qgc3RhcnQgPSB0aW1lKE5VTEwpOworCWludCBpOworCUZJTEUgKmxpc3Q7CisKKwlpZiAoYXJnYyA+PSBNQVgpIHsKKwkJZnByaW50ZihzdGRlcnIsICJTb3JyeSwgbXkgaGVhZCBleHBsb2RlZC4gUGxlYXNlIGluY3JlYXNlIE1BWC5cbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChiZV92ZXJib3NlKQorCQl2ZXJib3NlID0gYXRvaShiZV92ZXJib3NlKTsKKworCWlmIChiZV9pbnRlcmFjdGl2ZSkKKwkJaW50ZXJhY3RpdmUgPSBhdG9pKGJlX2ludGVyYWN0aXZlKTsKKworCWlmIChiZV9xdWlldCkKKwkJcXVpZXQgPSBhdG9pKGJlX3F1aWV0KTsKKworCWlmIChiZV93cml0ZV90aW1lb3V0KQorCQl3cml0ZV90aW1lb3V0ID0gYXRvaShiZV93cml0ZV90aW1lb3V0KSAqIDI7CisKKwlyZXN1bHRzID0gZ2V0ZW52KCJMVk1fVEVTVF9SRVNVTFRTIikgPyA6ICJyZXN1bHRzIjsKKwl1bmxpbWl0ZWQgPSBnZXRlbnYoIkxWTV9URVNUX1VOTElNSVRFRCIpID8gMSA6IDA7CisJKHZvaWQpIHNucHJpbnRmKHJlc3VsdHNfbGlzdCwgc2l6ZW9mKHJlc3VsdHNfbGlzdCksICIlcy9saXN0IiwgcmVzdWx0cyk7CisKKwkvL2lmIChwaXBlKGZkcykpIHsKKwlpZiAoc29ja2V0cGFpcihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmRzKSkgeworCQlwZXJyb3IoInNvY2tldHBhaXIiKTsKKwkJcmV0dXJuIDIwMTsKKwl9CisKKwlpZiAoZmNudGwoZmRzWzBdLCBGX1NFVEZMLCBPX05PTkJMT0NLICkgPT0gLTEpIHsKKwkJcGVycm9yKCJmY250bCBvbiBzb2NrZXQiKTsKKwkJcmV0dXJuIDIwMjsKKwl9CisKKwkvKiBzZXQgdXAgc2lnbmFsIGhhbmRsZXJzICovCisJZm9yIChpID0gMDsgaSA8PSAzMjsgKytpKQorCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBTSUdDSExEOiBjYXNlIFNJR1dJTkNIOiBjYXNlIFNJR1VSRzoKKwkJY2FzZSBTSUdLSUxMOiBjYXNlIFNJR1NUT1A6IGJyZWFrOworCQlkZWZhdWx0OiBzaWduYWwoaSwgaGFuZGxlcik7CisJCX0KKworCWhhcm5lc3Nfc3RhcnQgPSB0aW1lKE5VTEwpOworCS8qIHJ1biB0aGUgdGVzdHMgKi8KKwlmb3IgKGkgPSAxOyAhZGllICYmIGkgPCBhcmdjOyArK2kpIHsKKwkJcnVuKGksIGFyZ3ZbaV0pOworCQlpZiAoIHRpbWUoTlVMTCkgLSBoYXJuZXNzX3N0YXJ0ID4gNDggKiAzNjAgKSB7IC8qIDA0OjQ4ICovCisJCQlwcmludGYoIk5lYXJseSA1IGhvdXJzIHBhc3NlZCwgZ2l2aW5nIHVwLi4uXG4iKTsKKwkJCWRpZSA9IDE7CisJCX0KKwl9CisKKwlmcmVlKHN1YnN0WzBdLnZhbHVlKTsKKwlmcmVlKHN1YnN0WzFdLnZhbHVlKTsKKwlmcmVlKHJlYWRidWYpOworCisJcHJpbnRmKCJcbiMjICVkIHRlc3RzICVzIDogJWQgT0ssICVkIHdhcm5pbmdzLCAlZCBmYWlsdXJlcyAoJWQgaW50ZXJydXB0ZWQpLCAlZCBrbm93biBmYWlsdXJlczsgIgorCSAgICAgICAiJWQgc2tpcHBlZFxuIiwKKwkgICAgICAgcy5ud2FybmVkICsgcy5ucGFzc2VkICsgcy5uZmFpbGVkICsgcy5uc2tpcHBlZCArIHMubmludGVycnVwdGVkLAorCSAgICAgICBkdXJhdGlvbihzdGFydCwgTlVMTCksCisJICAgICAgIHMubnBhc3NlZCwgcy5ud2FybmVkLCBzLm5mYWlsZWQgKyBzLm5pbnRlcnJ1cHRlZCwgcy5uaW50ZXJydXB0ZWQsCisJICAgICAgIHMubmtub3duZmFpbCwgcy5uc2tpcHBlZCk7CisKKwkvKiBkdW1wIGEgbGlzdCB0byByZXN1bHRzICovCisJaWYgKChsaXN0ID0gZm9wZW4ocmVzdWx0c19saXN0LCAidyIpKSkgeworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKysgaSkgeworCQkJc3dpdGNoIChzLnN0YXR1c1tpXSkgeworCQkJY2FzZSBGQUlMRUQ6IHJlc3VsdCA9ICJmYWlsZWQiOyBicmVhazsKKwkJCWNhc2UgSU5URVJSVVBURUQ6IHJlc3VsdCA9ICJpbnRlcnJ1cHRlZCI7IGJyZWFrOworCQkJY2FzZSBQQVNTRUQ6IHJlc3VsdCA9ICJwYXNzZWQiOyBicmVhazsKKwkJCWNhc2UgU0tJUFBFRDogcmVzdWx0ID0gInNraXBwZWQiOyBicmVhazsKKwkJCWNhc2UgVElNRU9VVDogcmVzdWx0ID0gInRpbWVvdXQiOyBicmVhazsKKwkJCWNhc2UgV0FSTkVEOiByZXN1bHQgPSAid2FybmluZ3MiOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJlc3VsdCA9ICJ1bmtub3duIjsgYnJlYWs7CisJCQl9CisJCQlmcHJpbnRmKGxpc3QsICIlcyAlc1xuIiwgYXJndltpXSwgcmVzdWx0KTsKKwkJfQorCQlmY2xvc2UobGlzdCk7CisJfSBlbHNlCisJCXBlcnJvcigiZm9wZW4gcmVzdWx0Iik7CisKKwkvKiBwcmludCBvdXQgYSBzdW1tYXJ5ICovCisJaWYgKHMubmZhaWxlZCB8fCBzLm5za2lwcGVkIHx8IHMubmtub3duZmFpbCB8fCBzLm5pbnRlcnJ1cHRlZCB8fCBzLm53YXJuZWQpIHsKKwkJZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsrIGkpIHsKKwkJCXN3aXRjaCAocy5zdGF0dXNbaV0pIHsKKwkJCWNhc2UgRkFJTEVEOgorCQkJCXByaW50ZigiRkFJTEVEOiAlc1xuIiwgYXJndltpXSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVSUlVQVEVEOgorCQkJCXByaW50ZigiSU5URVJSVVBURUQ6ICVzXG4iLCBhcmd2W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgS05PV05GQUlMOgorCQkJCXByaW50ZigiRkFJTEVEIChleHBlY3RlZCk6ICVzXG4iLCBhcmd2W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tJUFBFRDoKKwkJCQlwcmludGYoInNraXBwZWQ6ICVzXG4iLCBhcmd2W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElNRU9VVDoKKwkJCQlwcmludGYoIlRJTUVPVVQ6ICVzXG4iLCBhcmd2W2ldKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0FSTkVEOgorCQkJCXByaW50ZigiV0FSTkVEOiAlc1xuIiwgYXJndltpXSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvKiBkbyBub3RoaW5nICovIDsKKwkJCX0KKwkJfQorCQlwcmludGYoIlxuIik7CisJCXJldHVybiAocy5uZmFpbGVkID4gMCkgfHwgKHMubmludGVycnVwdGVkID4gMCkgfHwgZGllOworCX0KKworCXJldHVybiBkaWU7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2xpYi9pbml0dGVzdC5zaCBiL3Rlc3QvbGliL2luaXR0ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzEzMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpYi9pbml0dGVzdC5zaApAQCAtMCwwICsxLDE0NyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK2luaXRza2lwKCkgeworCXRlc3QgIiQjIiAtZXEgMCB8fCBlY2hvICJURVNUIFNLSVBQRUQ6ICRAIgorCWV4aXQgMjAwCit9CisKKyMgc2FuaXRpemUgdGhlIGVudmlyb25tZW50CitMQU5HPUMKK0xDX0FMTD1DCitUWj1VVEMKKworIyBQdXQgc2NyaXB0IG5hbWUgaW50byB2YXJpYWJsZSwgc28gaXQgY2FuIHVzZWQgaW4gZXh0ZXJuYWwgc2NyaXB0cworVEVTVE5BTUU9JHswIyMqL30KKyMgTmljZSBkZWJ1ZyBtZXNzYWdlCitQUzQ9JyMke0JBU0hfU09VUkNFWzBdIyMqL306JHtMSU5FTk99KyAnCitleHBvcnQgVEVTVE5BTUUgUFM0CisKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9GTEFWT1VSIjsgdGhlbgorCS4gbGliL2ZsYXZvdXItJExWTV9URVNUX0ZMQVZPVVIKK2ZpCisKK3Rlc3QgLW4gIiRTS0lQX1dJVEhPVVRfQ0xWTUQiICYmIHRlc3QgIiRMVk1fVEVTVF9MT0NLSU5HIiAtbmUgMyAmJiBpbml0c2tpcAordGVzdCAtbiAiJFNLSVBfV0lUSF9DTFZNRCIgJiYgdGVzdCAiJExWTV9URVNUX0xPQ0tJTkciIC1lcSAzICYmIGluaXRza2lwCisKK3Rlc3QgLW4gIiRTS0lQX1dJVEhPVVRfTFZNRVRBRCIgJiYgdGVzdCAteiAiJExWTV9URVNUX0xWTUVUQUQiICYmIGluaXRza2lwCit0ZXN0IC1uICIkU0tJUF9XSVRIX0xWTUVUQUQiICYmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk1FVEFEIiAmJiBpbml0c2tpcAorCit0ZXN0IC1uICIkU0tJUF9XSVRIX0xWTVBPTExEIiAmJiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNUE9MTEQiICYmIGluaXRza2lwCisKK3Rlc3QgLW4gIiRTS0lQX1dJVEhfTFZNTE9DS0QiICYmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk1MT0NLRCIgJiYgaW5pdHNraXAKKwordW5zZXQgQ0RQQVRICisKKyMgZ3JhYiBzb21lIGNvbW1vbiB1dGlsaXRpZXMKKy4gbGliL3V0aWxzCisKK1RFU1RPTERQV0Q9JChwd2QpCitDT01NT05fUFJFRklYPSJMVk1URVNUIgorUFJFRklYPSIke0NPTU1PTl9QUkVGSVh9JCQiCisKKyMgQ2hlY2sgd2UgYXJlIG5vdCBjb25mbGlja3Rpbmcgd2l0aCBzb21lIGV4aXRpbmcgc2V0dXAKK2Rtc2V0dXAgdGFibGUgfCBub3QgZ3JlcCAiJHtQUkVGSVh9W14wLTldIiB8fCBkaWUgIkRNIHRhYmxlIGFscmVhZHkgaGFzIGRldmljZXMgd2l0aCBwcmVmaXggJFBSRUZJWCEiCisKK2lmIHRlc3QgLXogIiRMVk1fVEVTVF9ESVIiOyB0aGVuIExWTV9URVNUX0RJUj0kVE1QRElSOyBmaQorVEVTVERJUj0kKG1rZHRlbXAgIiR7TFZNX1RFU1RfRElSOi0vdG1wfSIgIiRQUkVGSVguWFhYWFhYWFhYWCIpIHx8IFwKKwlkaWUgImZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAke0xWTV9URVNUX0RJUjotJFRFU1RPTERQV0R9IgorUlVOTklOR19ETUVWRU5URD0kKHBncmVwIGRtZXZlbnRkIHx8IHRydWUpCisKK2V4cG9ydCBURVNUT0xEUFdEIFRFU1RESVIgQ09NTU9OX1BSRUZJWCBQUkVGSVggUlVOTklOR19ETUVWRU5URAorZXhwb3J0IExWTV9MT0dfRklMRV9FUE9DSD1ERUJVRworZXhwb3J0IExWTV9MT0dfRklMRV9NQVhfTElORVM9MTAwMDAwCitleHBvcnQgTFZNX0VYUEVDVEVEX0VYSVRfU1RBVFVTPTEKKwordGVzdCAtbiAiJEJBU0giICYmIHRyYXAgJ3NldCArdng7IFNUQUNLVFJBQ0U7IHNldCAtdngnIEVSUgordHJhcCAnYXV4IHRlYXJkb3duJyBFWElUICMgZG9uJ3QgZm9yZ2V0IHRvIGNsZWFuIHVwCisKK2NkICIkVEVTVERJUiIKK21rZGlyIGxpYgorCisjIFNldHRpbmcgdXAgc3ltbGluayBmcm9tICRpIHRvICRURVNURElSL2xpYgordGVzdCAtbiAiJGFic190b3BfYnVpbGRkaXIiICYmIFwKKyAgICBmaW5kICIkYWJzX3RvcF9idWlsZGRpci9kYWVtb25zL2RtZXZlbnRkL3BsdWdpbnMvIiAtbmFtZSAnKi5zbycgXAorICAgIC1leGVjIGxuIC1zIC10IGxpYiAie30iICsKK2ZpbmQgIiRURVNUT0xEUFdEL2xpYiIgISBcKCAtbmFtZSAnKi5zaCcgLW8gLW5hbWUgJyouW2Nkb10nIFwKKyAgICAtbyAtbmFtZSAnKn4nIFwpICAtZXhlYyBsbiAtcyAtdCBsaWIgInt9IiArCisKK0RNX0RFRkFVTFRfTkFNRV9NQU5HTElOR19NT0RFPW5vbmUKK0RNX0RFVl9ESVI9IiRURVNURElSL2RldiIKK0xWTV9TWVNURU1fRElSPSIkVEVTVERJUi9ldGMiCitta2RpciAiJExWTV9TWVNURU1fRElSIiAiJERNX0RFVl9ESVIiCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfREVWRElSIiA7IHRoZW4KKwl0ZXN0IC1kICIkTFZNX1RFU1RfREVWRElSIiB8fCBkaWUgIlRlc3QgZGV2aWNlIGRpcmVjdG9yeSBMVk1fVEVTVF9ERVZESVI9XCIkTFZNX1RFU1RfREVWRElSXCIgaXMgbm90IHZhbGlkLiIKKwlETV9ERVZfRElSPSRMVk1fVEVTVF9ERVZESVIKK2Vsc2UKKwlta25vZCAiJERNX0RFVl9ESVIvdGVzdG51bGwiIGMgMSAzIHx8IGRpZSAibWtub2QgZmFpbGVkIgorCWVjaG8gPiIkRE1fREVWX0RJUi90ZXN0bnVsbCIgfHwgXAorCQlkaWUgIkZpbGVzeXN0ZW0gZG9lcyBzdXBwb3J0IGRldmljZXMgaW4gJERNX0RFVl9ESVIgKG1vdW50ZWQgd2l0aCBub2Rldj8pIgorCW1rZGlyICIkRE1fREVWX0RJUi9tYXBwZXIiCitmaQorCisjIGFib3J0IG9uIHRoZSBpbnRlcm5hbCBkbSBlcnJvcnMgaW4gdGhlIHRlc3RzIChhbGxvd2luZyB0ZXN0IHVzZXIgb3ZlcnJpZGUpCitETV9BQk9SVF9PTl9JTlRFUk5BTF9FUlJPUlM9JHtETV9BQk9SVF9PTl9JTlRFUk5BTF9FUlJPUlM6LTF9CisKK2V4cG9ydCBETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERSBETV9ERVZfRElSIExWTV9TWVNURU1fRElSIERNX0FCT1JUX09OX0lOVEVSTkFMX0VSUk9SUworCitlY2hvICIkVEVTVE5BTUUiID5URVNUTkFNRQorCitlY2hvICJLZXJuZWwgaXMgJCh1bmFtZSAtYSkiCisjIFJlcG9ydCBTRUxpbnV4IG1vZGUKK2VjaG8gIlNlbGludXggbW9kZSBpcyAkKGdldGVuZm9yY2UgMj4vZGV2L251bGwgfHwgZWNobyBub3QgaW5zdGFsbGVkKS4iCitmcmVlIC1tIHx8IHRydWUKKworIyBTZXQgdmFycyBmcm9tIHV0aWxzIG5vdyB0aGF0IHdlIGhhdmUgVEVTVERJUi9QUkVGSVgvLi4uCitwcmVwYXJlX3Rlc3RfdmFycworCit0ZXN0IC1uICIkQkFTSCIgJiYgc2V0IC1lRSAtbyBwaXBlZmFpbAorCisjIFZhcnMgZm9yIGhhcm5lc3MKK2VjaG8gIkBURVNURElSPSRURVNURElSIgorZWNobyAiQFBSRUZJWD0kUFJFRklYIgorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNRVRBRCIgOyB0aGVuCisJZXhwb3J0IExWTV9MVk1FVEFEX1NPQ0tFVD0iJFRFU1RESVIvbHZtZXRhZC5zb2NrZXQiCisJZXhwb3J0IExWTV9MVk1FVEFEX1BJREZJTEU9IiRURVNURElSL2x2bWV0YWQucGlkIgorCWF1eCBwcmVwYXJlX2x2bWV0YWQKK2Vsc2UKKwkjIGx2bWV0YWQgcHJlcGFyZXMgaXRzIG93biBsdm1jb25mCisJZXhwb3J0IExWTV9MVk1FVEFEX1BJREZJTEU9IiRURVNURElSL25vbi1leGlzdGluZy1maWxlIgorCWF1eCBsdm1jb25mCisJYXV4IHByZXBhcmVfY2x2bWQKK2ZpCisKK3Rlc3QgLW4gIiRMVk1fVEVTVF9MVk1QT0xMRCIgJiYgeworCWV4cG9ydCBMVk1fTFZNUE9MTERfU09DS0VUPSIkVEVTVERJUi9sdm1wb2xsZC5zb2NrZXQiCisJZXhwb3J0IExWTV9MVk1QT0xMRF9QSURGSUxFPSIkVEVTVERJUi9sdm1wb2xsZC5waWQiCisJYXV4IHByZXBhcmVfbHZtcG9sbGQKK30KKworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTUxPQ0tEIiA7IHRoZW4KKwlpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTE9DS19UWVBFX1NBTkxPQ0siIDsgdGhlbgorCQlhdXggbHZtY29uZiAnbG9jYWwvaG9zdF9pZCA9IDEnCisJZmkKKworCWV4cG9ydCBTSEFSRUQ9Ii0tc2hhcmVkIgorZmkKKworIyBmb3IgY2hlY2tfbHZtbG9ja2RfdGVzdCwgbHZtbG9ja2QgaXMgcmVzdGFydGVkIGZvciBlYWNoIHNoZWxsIHRlc3QuCisjIGZvciBjaGVja19sdm1sb2NrZF97c2FubG9jayxkbG19LCBsdm1sb2NrZCBpcyBzdGFydGVkIG9uY2UgYnkKKyMgYWEtbHZtbG9ja2Qte3NhbmxvY2ssZGxtfS1wcmVwYXJlLnNoIGFuZCBsZWZ0IHJ1bm5pbmcgZm9yIGFsbCBzaGVsbCB0ZXN0cy4KKworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTUxPQ0tEX1RFU1QiIDsgdGhlbgorCWF1eCBwcmVwYXJlX2x2bWxvY2tkCitmaQorCitlY2hvICI8PT09PT09PT0gUHJvY2Vzc2luZyB0ZXN0OiBcIiRURVNUTkFNRVwiID09PT09PT09PiIKKworc2V0IC12eApkaWZmIC0tZ2l0IGEvdGVzdC9saWIvbHZtLXdyYXBwZXIuc2ggYi90ZXN0L2xpYi9sdm0td3JhcHBlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzMjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvbHZtLXdyYXBwZXIuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFJlZCBIYXQsIEluYy4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworLiBsaWIvcGF0aHMKKworQ01EPSR7MCMjKi99Cit0ZXN0ICIkQ01EIiAhPSBsdm0gfHwgdW5zZXQgQ01ECisKKyMgV2hlbiBuZWVkZWQgdG8gdHJhY2UgY29tbWFuZCBmcm9tIHRlc3Qgc3VpdGUgdXNlIGVudiB2YXIgYmVmb3JlIHByb2dyYW0KKyMgYW5kIHJ1biBwcm9ncmFtIGRpcmVjdGx5IHZpYSBzaGVsbCBpbiB0ZXN0IGRpciBpLmUuOgorIyBzaCBzaGVsbC9hY3RpdmF0ZS1taXJyb3Iuc2gKKyMgJ0xWTV9HREI9MSBsdmNyZWF0ZSAtbDEgJHZnJworIyA+IHJ1bgordGVzdCAteiAiJExWTV9HREIiIHx8IGV4ZWMgZ2RiIC0tcmVhZG5vdyAtLWFyZ3MgIiRhYnNfdG9wX2J1aWxkZGlyL3Rvb2xzL2x2bSIgJENNRCAiJEAiCisKKyMgTXVsdGlwbGUgbGV2ZWwgb2YgTFZNX1ZBTEdSSU5EIHN1cHBvcnQKKyMgdGhlIGhpZ2hlciBsZXZlbCB0aGUgbW9yZSBjb21tYW5kcyBhcmUgdHJhY2VkCitpZiB0ZXN0IC1uICIkTFZNX1ZBTEdSSU5EIjsgdGhlbgorCVJVTl9EQkc9IiR7VkFMR1JJTkQ6LXZhbGdyaW5kfSI7CitmaQorCitpZiB0ZXN0IC1uICIkTFZNX1NUUkFDRSI7IHRoZW4KKwlSVU5fREJHPSJzdHJhY2UgJExWTV9TVFJBQ0UgLW8gc3RyYWNlLmxvZyIKK2ZpCisKK2Nhc2UgIiRDTUQiIGluCisgIGx2c3xwdnN8dmdzfHZnY2t8dmdzY2FuKQorCXRlc3QgJHtMVk1fREVCVUdfTEVWRUw6LTB9IC1sdCAyICYmIFJVTl9EQkc9IDs7CisgIHB2Y3JlYXRlfHB2cmVtb3ZlfGx2cmVtb3ZlfHZnY3JlYXRlfHZncmVtb3ZlKQorCXRlc3QgJHtMVk1fREVCVUdfTEVWRUw6LTB9IC1sdCAxICYmIFJVTl9EQkc9IDs7Citlc2FjCisKKyMgQ2FwdHVyZSBwYXJhbGxlbCB1c2VycyBvZiBkZWJ1Zy5sb2cgZmlsZQorI3Rlc3QgLXogIiQoZnVzZXIgZGVidWcubG9nIDI+L2Rldi9udWxsKSIgfHwgeworIwllY2hvICJURVNUIFdBUk5JTkc6IFwiZGVidWcubG9nXCIgaXMgc3RpbGwgaW4gdXNlIHdoaWxlIHJ1bm5pbmcgJENNRCAkQCIgPiYyCisjCWZ1c2VyIC12IGRlYnVnLmxvZyA+JjIKKyN9CisKKyMgdGhlIGV4ZWMgaXMgaW1wb3J0YW50LCBiZWNhdXNlIG90aGVyd2lzZSBmYXRhbCBzaWduYWxzIGluc2lkZSAibm90IiBnbyB1bm5vdGljZWQKK2lmIHRlc3QgLW4gIiRhYnNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgIGV4ZWMgJFJVTl9EQkcgIiRhYnNfdG9wX2J1aWxkZGlyL3Rvb2xzL2x2bSIgJENNRCAiJEAiCitlbHNlICMgd2UgYXJlIHRlc3RpbmcgdGhlIGx2bSBvbiAkUEFUSAorICAgIFBBVEg9YGVjaG8gJFBBVEggfCBzZWQgLWUgcyxbXjpdKmx2bTItdGVzdHN1aXRlW146XSo6LCxnYAorICAgIGV4ZWMgJFJVTl9EQkcgbHZtICRDTUQgIiRAIgorZmkKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL21rZTJmcy5jb25mIGIvdGVzdC9saWIvbWtlMmZzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiZWQyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL21rZTJmcy5jb25mCkBAIC0wLDAgKzEsNDUgQEAKK1tkZWZhdWx0c10KKwliYXNlX2ZlYXR1cmVzID0gc3BhcnNlX3N1cGVyLGZpbGV0eXBlLHJlc2l6ZV9pbm9kZSxkaXJfaW5kZXgsZXh0X2F0dHIKKwllbmFibGVfcGVyaW9kaWNfZnNjayA9IDEKKwlibG9ja3NpemUgPSA0MDk2CisJaW5vZGVfc2l6ZSA9IDI1NgorCWlub2RlX3JhdGlvID0gMTYzODQKKworW2ZzX3R5cGVzXQorCWV4dDMgPSB7CisJCWZlYXR1cmVzID0gaGFzX2pvdXJuYWwKKwl9CisJZXh0NCA9IHsKKwkJZmVhdHVyZXMgPSBoYXNfam91cm5hbCxleHRlbnQsaHVnZV9maWxlLGZsZXhfYmcsZGlyX25saW5rLGV4dHJhX2lzaXplCisJCWlub2RlX3NpemUgPSAyNTYKKwl9CisJZXh0NGRldiA9IHsKKwkJZmVhdHVyZXMgPSBoYXNfam91cm5hbCxleHRlbnQsaHVnZV9maWxlLGZsZXhfYmcsZGlyX25saW5rLGV4dHJhX2lzaXplCisJCWlub2RlX3NpemUgPSAyNTYKKwkJb3B0aW9ucyA9IHRlc3RfZnM9MQorCX0KKwlzbWFsbCA9IHsKKwkJYmxvY2tzaXplID0gMTAyNAorCQlpbm9kZV9zaXplID0gMTI4CisJCWlub2RlX3JhdGlvID0gNDA5NgorCX0KKwlmbG9wcHkgPSB7CisJCWJsb2Nrc2l6ZSA9IDEwMjQKKwkJaW5vZGVfc2l6ZSA9IDEyOAorCQlpbm9kZV9yYXRpbyA9IDgxOTIKKwl9CisJbmV3cyA9IHsKKwkJaW5vZGVfcmF0aW8gPSA0MDk2CisJfQorCWxhcmdlZmlsZSA9IHsKKwkJaW5vZGVfcmF0aW8gPSAxMDQ4NTc2CisJCWJsb2Nrc2l6ZSA9IC0xCisJfQorCWxhcmdlZmlsZTQgPSB7CisJCWlub2RlX3JhdGlvID0gNDE5NDMwNAorCQlibG9ja3NpemUgPSAtMQorCX0KKwlodXJkID0geworCSAgICAgYmxvY2tzaXplID0gNDA5NgorCSAgICAgaW5vZGVfc2l6ZSA9IDEyOAorCX0KZGlmZiAtLWdpdCBhL3Rlc3QvbGliL25vdC5jIGIvdGVzdC9saWIvbm90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjNTJhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL25vdC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworc3RhdGljIGludCBfZmluaXNoZWQoY29uc3QgY2hhciAqY21kLCBpbnQgc3RhdHVzLCBpbnQgcGlkKSB7CisJaW50IHJldDsKKwlpZiAoIXN0cmNtcChjbWQsICJub3QiKSkKKwkJcmV0dXJuICFzdGF0dXM7CisJaWYgKCFzdHJjbXAoY21kLCAic2hvdWxkIikpIHsKKwkJaWYgKHN0YXR1cykgeworCQkJZnByaW50ZihzdGRlcnIsICJURVNUIFdBUk5JTkc6IElnbm9yaW5nIGNvbW1hbmQgZmFpbHVyZS5cbiIpOworCQkJLyogVE9ETzogYXZvaWQgdXNpbmcgc2hlbGwgaGVyZSAqLworCQkJLyogU2hvdyBsb2cgZm9yIGZhaWxpbmcgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgcGFzc2luZyAqLworCQkJcmV0ID0gc3lzdGVtKCJscyBkZWJ1Zy5sb2cqJHtMVk1fTE9HX0ZJTEVfRVBPQ0h9KiAyPi9kZXYvbnVsbCIpOworCQkJaWYgKFdJRkVYSVRFRChyZXQpICYmIFdFWElUU1RBVFVTKHJldCkgPT0gMCkgeworCQkJCXByaW50ZigiIyMgdGltaW5nIG9mZlxuPD09PT09PT09IERlYnVnIGxvZyA9PT09PT09PT5cbiIpOyAvKiB0aW1pbmcgb2ZmICovCisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQkJaWYgKHN5c3RlbSgic2VkIC1lICdzLF4sIyMgREVCVUc6ICwnIGRlYnVnLmxvZyoke0xWTV9MT0dfRklMRV9FUE9DSH0qIDI+L2Rldi9udWxsIikpIHsKKwkJCQkgICAgLyogSWdub3JlIHJlc3VsdCBjb2RlICovOworCQkJCX0KKwkJCQlwcmludGYoIiMjIHRpbWluZyBvblxuIik7IC8qIHRpbWluZyBvbiAqLworCQkJCWlmIChzeXN0ZW0oInJtIC1mIGRlYnVnLmxvZyoke0xWTV9MT0dfRklMRV9FUE9DSH0qIikpIHsKKwkJCQkgICAgLyogSWdub3JlIHJlc3VsdCBjb2RlICovOworCQkJCX0KKwkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiaW52YWxpZCIpKSB7CisJCWlmIChzdGF0dXMgPT0gMykKKwkJCXJldHVybiAwOworCQlmcHJpbnRmKHN0ZGVyciwgIlRlc3QgZXhwZWN0ZWQgZXhpdCBjb2RlIDMgKGludmFsaWQpLCBidXQgZ290ICVkLlxuIiwgc3RhdHVzKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiZmFpbCIpKSB7CisJCWlmIChzdGF0dXMgPT0gNSkKKwkJCXJldHVybiAwOworCQlmcHJpbnRmKHN0ZGVyciwgIlRlc3QgZXhwZWN0ZWQgZXhpdCBjb2RlIDUgKGZhaWwpLCBidXQgZ290ICVkLlxuIiwgc3RhdHVzKTsKKwl9CisJcmV0dXJuIDY7Cit9CisKK2ludCBtYWluKGludCBhcmdzLCBjaGFyICoqYXJndikgeworCWNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXM7CisJaW50IEZBSUxVUkUgPSA2OworCisJaWYgKGFyZ3MgPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTmVlZCBhcmdzXG4iKTsKKwkJcmV0dXJuIEZBSUxVUkU7CisJfQorCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZm9ya1xuIik7CisJCXJldHVybiBGQUlMVVJFOworCX0gZWxzZSBpZiAocGlkID09IDApIHsgCS8qIGNoaWxkICovCisJCWlmICghc3RyY21wKGFyZ3ZbMF0sICJub3QiKSkKKwkJCXZhbCA9ICI+MSI7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImludmFsaWQiKSkKKwkJCXZhbCA9ICIzIjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAiZmFpbCIpKQorCQkJdmFsID0gIjUiOworCisJCWlmICh2YWwpCisJCQlzZXRlbnYoIkxWTV9FWFBFQ1RFRF9FWElUX1NUQVRVUyIsIHZhbCwgMSk7CisKKwkJZXhlY3ZwKGFyZ3ZbMV0sICZhcmd2WzFdKTsKKwkJLyogc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlICovCisJCXJldHVybiBGQUlMVVJFOworCX0gZWxzZSB7CQkvKiBwYXJlbnQgKi8KKwkJd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKSB7CisJCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIlByb2Nlc3MgJWQgZGllZCBvZiBzaWduYWwgJWQuXG4iLAorCQkJCQlwaWQsIFdURVJNU0lHKHN0YXR1cykpOworCQkJLyogZGlkIG5vdCBleGl0IGNvcnJlY3RseSAqLworCQkJcmV0dXJuIEZBSUxVUkU7CisJCX0KKworCQlyZXR1cm4gX2ZpbmlzaGVkKGFyZ3ZbMF0sIFdFWElUU1RBVFVTKHN0YXR1cyksIHBpZCk7CisJfQorCS8qIG5vdCBhY2Nlc3NpYmxlICovCisJcmV0dXJuIEZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2xpYi9ydW5uZXIuY3BwIGIvdGVzdC9saWIvcnVubmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvcnVubmVyLmNwcApAQCAtMCwwICsxLDQwIEBACisvKiAtKi0gQysrIC0qLSBjb3B5cmlnaHQgKGMpIDIwMTQgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJicmljay1zaGVsbHRlc3QuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgIHRyeSB7CisgICAgICAgIHJldHVybiBicmljazo6c2hlbGx0ZXN0OjpydW4oIGFyZ2MsIGFyZ3YsICJMVk1fVEVTVF9GTEFWT1VSIiApOworICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uIGNvbnN0JiBlKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRXhjZXB0aW9uOiAiIDw8IGUud2hhdCgpIDw8ICJcbiI7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL3Rlc3QtY29yb3N5bmMtY29uZiBiL3Rlc3QvbGliL3Rlc3QtY29yb3N5bmMtY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2M5NThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvdGVzdC1jb3Jvc3luYy1jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyMgY3JlYXRlZCBieSBsdm0gdGVzdCBzdWl0ZQordG90ZW0geworICAgICAgICB2ZXJzaW9uOiAyCisgICAgICAgIHNlY2F1dGg6IG9mZgorICAgICAgICBjbHVzdGVyX25hbWU6IHRlc3QKK30KK25vZGVsaXN0IHsKKyAgICAgICAgbm9kZSB7CisgICAgICAgICAgICAgICAgcmluZzBfYWRkcjogQExPQ0FMX05PREVACisgICAgICAgICAgICAgICAgbm9kZWlkOiAxCisgICAgICAgIH0KK30KK3F1b3J1bSB7CisgICAgICAgIHByb3ZpZGVyOiBjb3Jvc3luY192b3RlcXVvcnVtCit9Citsb2dnaW5nIHsKKyAgICAgICAgdG9fc3lzbG9nOiB5ZXMKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9saWIvdGVzdC1kbG0tY29uZiBiL3Rlc3QvbGliL3Rlc3QtZGxtLWNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzYzkzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL3Rlc3QtZGxtLWNvbmYKQEAgLTAsMCArMSw0IEBACisjIGNyZWF0ZWQgYnkgbHZtIHRlc3Qgc3VpdGUKK2xvZ19kZWJ1Zz0xCitlbmFibGVfZmVuY2luZz0wCisKZGlmZiAtLWdpdCBhL3Rlc3QvbGliL3Rlc3Qtc2FubG9jay1jb25mIGIvdGVzdC9saWIvdGVzdC1zYW5sb2NrLWNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4NWQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGliL3Rlc3Qtc2FubG9jay1jb25mCkBAIC0wLDAgKzEsMiBAQAorIyBjcmVhdGVkIGJ5IGx2bSB0ZXN0IHN1aXRlCit1c2Vfd2F0Y2hkb2c9MApkaWZmIC0tZ2l0IGEvdGVzdC9saWIvdXRpbHMuc2ggYi90ZXN0L2xpYi91dGlscy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I1ZTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9saWIvdXRpbHMuc2gKQEAgLTAsMCArMSwyNjkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzZXQgLWUKK01BWF9UUklFUz00CitJRlNfTkw9JworJworCitkaWUoKSB7CisJcm0gLWYgZGVidWcubG9nCisJZWNobyAtZSAiJEAiID4mMgorCXJldHVybiAxCit9CisKK3JhbmRfYnl0ZXMoKSB7CisJbj0kMQorCisJY2hhcnM9ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IgorCisJZGV2X3JhbmQ9Ii9kZXYvdXJhbmRvbSIKKwlpZiB0ZXN0IC1yICIkZGV2X3JhbmQiOyB0aGVuCisJCSMgTm90ZTogMjU2LWxlbmd0aCgkY2hhcnMpID09IDE5NDsgMyBjb3BpZXMgb2YgJGNoYXJzIGlzIDE4NiArIDggPSAxOTQuCisJCWhlYWQgLWMiJG4iICIkZGV2X3JhbmQiIHwgdHIgLWMgIiRjaGFycyIgIjAxMjM0NTY3JGNoYXJzJGNoYXJzJGNoYXJzIgorCQlyZXR1cm4KKwlmaQorCisJY21kcz0nZGF0ZTsgZGF0ZSArJU47IGZyZWU7IHdobyAtYTsgdzsgcHMgYXV4d3c7IHBzIGVmOyBuZXRzdGF0IC1uJworCWRhdGE9JCggKGV2YWwgIiRjbWRzIikgMj4mMSB8IGd6aXAgKQorCisJbl9wbHVzXzUwPSQoZXhwciAkbiArIDUwKQorCisJIyBFbnN1cmUgdGhhdCAkZGF0YSBoYXMgbGVuZ3RoIGF0IGxlYXN0IDUwKyRuCisJd2hpbGUgOjsgZG8KKwkJbGVuPSQoZWNobyAiJGRhdGEiIHwgd2MgLWMpCisJCXRlc3QgJG5fcGx1c181MCAtbGUgJGxlbiAmJiBicmVhazsKKwkJZGF0YT0kKCAoZWNobyAiJGRhdGEiOyBldmFsICIkY21kcyIpIDI+JjEgfCBnemlwICkKKwlkb25lCisKKwllY2hvICIkZGF0YSIgfCBkZCBicz0xIHNraXA9NTAgY291bnQ9JG4gMj4vZGV2L251bGwgXAorCQl8IHRyIC1jICIkY2hhcnMiICIwMTIzNDU2NyRjaGFycyRjaGFycyRjaGFycyIKK30KKworbWtkdGVtcCgpIHsKKwljYXNlICQjIGluCisJCTIpIDs7CisJCSopIGRpZSAiVXNhZ2U6IG1rZHRlbXAgRElSIFRFTVBMQVRFIjs7CisJZXNhYworCisJZGVzdGRpcj0kMQorCXRlbXBsYXRlPSQyCisKKyAgICAgICAgdGVzdCAtZCAiJGRlc3RkaXIiIHx8IGRpZSAiRElSICgnJGRlc3RkaXInKSBkb2VzIG5vdCBleGlzdC4iCisKKwljYXNlICIkdGVtcGxhdGUiIGluCisJCSpYWFhYKSA7OworCQkqKSBkaWUgIkludmFsaWQgdGVtcGxhdGU6ICR0ZW1wbGF0ZSAobXVzdCBoYXZlIGEgc3VmZml4IG9mIGF0IGxlYXN0IDQgWCdzKSI7OworCWVzYWMKKworCWZhaWw9MAorCisJIyBGaXJzdCwgdHJ5IHRvIHVzZSBta3RlbXAuCisJZD0kKGVudiAtdSBUTVBESVIgbWt0ZW1wIC1kIC10IC1wICIkZGVzdGRpciIgIiR0ZW1wbGF0ZSIgMj4vZGV2L251bGwpIHx8IGZhaWw9MQorCisJIyBUaGUgcmVzdWx0aW5nIG5hbWUgbXVzdCBiZSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KKwljYXNlICIkZCIgaW4gIiR7ZGVzdGRpcn0iKik7OyAqKSBmYWlsPTE7OyBlc2FjCisKKwkjIEl0IG11c3QgaGF2ZSBjcmVhdGVkIHRoZSBkaXJlY3RvcnkuCisJdGVzdCAtZCAiJGQiIHx8IGZhaWw9MQorCisJIyBJdCBtdXN0IGhhdmUgMDcwMCBwZXJtaXNzaW9ucy4KKwlwZXJtcz0kKGxzIC1kZ28gIiRkIiAyPi9kZXYvbnVsbCkgfHwgZmFpbD0xCisJY2FzZSAiJHBlcm1zIiBpbiBkcnd4LS0tLS0tKikgOzsgKikgZmFpbD0xOzsgZXNhYworCisJdGVzdCAkZmFpbCA9IDAgJiYgeyBlY2hvICIkZCI7IHJldHVybjsgfQorCisJIyBJZiB3ZSByZWFjaCB0aGlzIHBvaW50LCB3ZSdsbCBoYXZlIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBtYW51YWxseS4KKworCSMgR2V0IGEgY29weSBvZiB0aGUgdGVtcGxhdGUgd2l0aG91dCBpdHMgc3VmZml4IG9mIFgncy4KKwliYXNlX3RlbXBsYXRlPSQoZWNobyAiJHRlbXBsYXRlIiB8IHNlZCAncy9YWCokLy8nKQorCisJIyBDYWxjdWxhdGUgaG93IG1hbnkgWCdzIHdlJ3ZlIGp1c3QgcmVtb3ZlZC4KKwlueD0kKGV4cHIgbGVuZ3RoICIkdGVtcGxhdGUiIC0gbGVuZ3RoICIkYmFzZV90ZW1wbGF0ZSIpCisKKwllcnI9CisJaT0xCisJd2hpbGUgOjsgZG8KKwkJWD0kKHJhbmRfYnl0ZXMgIiRueCIpCisJCWNhbmRpZGF0ZV9kaXI9IiRkZXN0ZGlyLyRiYXNlX3RlbXBsYXRlJFgiCisJCWVycj0kKG1rZGlyIC1tIDA3MDAgIiRjYW5kaWRhdGVfZGlyIiAyPiYxKSAmJiBcCisJCQl7IGVjaG8gIiRjYW5kaWRhdGVfZGlyIjsgcmV0dXJuOyB9CisJCXRlc3QgJE1BWF9UUklFUyAtbGUgJGkgJiYgYnJlYWs7CisJCWk9JChleHByICRpICsgMSkKKwlkb25lCisJZGllICIkZXJyIgorfQorCisjIExpa2UgZ3JlcCwganVzdCBhbHdheXMgcHJpbnQgMXN0LiBsaW5lCitncmVwMV8oKSB7CisJYXdrIC12IHBhdHRlcm49IiR7MX0iICdOUj09MSB8fCAkMH5wYXR0ZXJuJyAiJHtAOjJ9IgorfQorCitzdGFja3RyYWNlKCkgeworCXRyYXAgLSBFUlIKKwlsb2NhbCBpPTAKKworCWVjaG8gIiMjIC0gJDA6JHtCQVNIX0xJTkVOT1swXX0iCisJd2hpbGUgRlVOQz0ke0ZVTkNOQU1FWyRpXX07IHRlc3QgIiRGVU5DIiAhPSAibWFpbiI7IGRvCisJCWVjaG8gIiMjICRpICR7RlVOQ30oKSBjYWxsZWQgZnJvbSAke0JBU0hfU09VUkNFWyRpXX06JHtCQVNIX0xJTkVOT1skaV19IgorCQlpPSQoKCRpICsgMSkpCisJZG9uZQorfQorCitTVEFDS1RSQUNFKCkgeworCXRyYXAgLSBFUlIKKwlsb2NhbCBpPTAKKworCXN0YWNrdHJhY2UKKworCXRlc3QgIiR7TFZNX1RFU1RfUEFSQUxMRUw6LTB9IiAtZXEgMSAtbyAtbiAiJFJVTk5JTkdfRE1FVkVOVEQiIC1vIC1mIExPQ0FMX0RNRVZFTlREIHx8IHsKKwkJcGdyZXAgZG1ldmVudGQgJj4vZGV2L251bGwgJiYgXAorCQkJZGllICJFUlJPUjogVGhlIHRlc3Qgc3RhcnRlZCBkbWV2ZW50ZCB1bmV4cGVjdGVkbHkuIgorCX0KKworCSMgR2V0IGJhY2t0cmFjZXMgZnJvbSBjb3JlZHVtcHMKKwlpZiB3aGljaCBnZGIgJj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyBidCBmdWxsID4gZ2RiX2NvbW1hbmRzLnR4dAorCQllY2hvIGwgPj4gZ2RiX2NvbW1hbmRzLnR4dAorCQllY2hvIHF1aXQgPj4gZ2RiX2NvbW1hbmRzLnR4dAorCQlmb3IgY29yZSBpbiAkKGxzIGNvcmUqIDI+L2Rldi9udWxsKTsgZG8KKwkJCWJpbj0kKGdkYiAtYmF0Y2ggLWMgIiRjb3JlIiAyPiYxIHwgZ3JlcCAiZ2VuZXJhdGVkIGJ5IiB8IFwKKwkJCXNlZCAtZSAicywuKmdlbmVyYXRlZCBieSBcYFwoW14gJ10qXCkuKixcMSwiKQorCQkJZ2RiIC1iYXRjaCAtYyAiJGNvcmUiIC14IGdkYl9jb21tYW5kcy50eHQgJCh3aGljaCAiJGJpbiIpCisJCWRvbmUKKwlmaQorCisJdGVzdCAtZiBTS0lQX1RISVNfVEVTVCAmJiBleGl0IDIwMAorCisJdGVzdCAteiAiJExWTV9URVNUX05PREVCVUciIC1hIC1mIFRFU1ROQU1FICYmIHsKKwkJbG9jYWwgbmFtZQorCQlsb2NhbCBpZHgKKwkJZm9yIGkgaW4gZGVidWcubG9nKiA7IGRvCisJCQl0ZXN0IC1mICIkaSIgfHwgYnJlYWsgICMgbm90aGluZyBpcyBmb3VuZCAoZXhwYW5kcyB0byBkZWJ1Zy5sb2cqKQorCQkJbmFtZT0ke2kjI2RlYnVnLmxvZ199CisJCQluYW1lPSR7bmFtZSUlXyp9CisJCQl0ZXN0ICIkbmFtZSIgPSAiREVCVUciICYmIHsgbmFtZT0iJG5hbWUkaWR4IiA7IGlkeD0kKCgkaWR4ICsgMSkpIDsgfQorCQkJZWNobyAiPD09PT09PT09IERlYnVnIGxvZyAkaSA9PT09PT09PT4iCisJCQlzZWQgLWUgInMsXiwjIyAkbmFtZTogLCIgIiRpIgorCQlkb25lCisJCWlmIHRlc3QgLWUgc3RyYWNlLmxvZyA7IHRoZW4KKwkJCWVjaG8gIjw9PT09PT09PSBTdHJhY2UgZGVidWcgbG9nID09PT09PT09PiIKKwkJCXNlZCAtZSAicyxeLCMjIFNUUkFDRTogLCIgc3RyYWNlLmxvZworCQlmaQorCQlkbXNldHVwIGluZm8gLWMgfCBncmVwMV8gIiRQUkVGSVgiID4gb3V0CisJCWlmIHRlc3QgJCh3YyAtbCA8IG91dCkgLWd0IDEgOyB0aGVuCisJCQllY2hvICI8PT09PT09PT0gSW5mbyA9PT09PT09PT4iCisJCQlzZWQgLWUgInMsXiwjIyBETUlORk86ICAgLCIgb3V0CisJCQllY2hvICI8PT09PT09PT0gQWN0aXZlIHRhYmxlID09PT09PT09PiIKKwkJCWRtc2V0dXAgdGFibGUgfCBncmVwICIkUFJFRklYIiB8IHNlZCAtZSAicyxeLCMjIERNVEFCTEU6ICAsIgorCQkJZWNobyAiPD09PT09PT09IEluYWN0aXZlIHRhYmxlID09PT09PT09PiIKKwkJCWRtc2V0dXAgdGFibGUgLS1pbmFjdGl2ZSAgfCBncmVwICIkUFJFRklYIiB8IHNlZCAtZSAicyxeLCMjIERNSVRBQkxFOiAsIgorCQkJZWNobyAiPD09PT09PT09IFN0YXR1cyA9PT09PT09PT4iCisJCQlkbXNldHVwIHN0YXR1cyB8IGdyZXAgIiRQUkVGSVgiIHwgc2VkIC1lICJzLF4sIyMgRE1TVEFUVVM6ICwiCisJCQllY2hvICI8PT09PT09PT0gVHJlZSA9PT09PT09PT4iCisJCQlkbXNldHVwIGxzIC0tdHJlZSB8IHNlZCAtZSAicyxeLCMjIERNVFJFRTogICAsIgorCQkJZWNobyAiPD09PT09PT09IFJlY3Vyc2l2ZSBsaXN0IG9mICRETV9ERVZfRElSID09PT09PT09PiIKKwkJCWxzIC1SbCAtLWhpZGU9c2htIC0taGlkZT1idXMgLS1oaWRlPXNuZCAtLWhpZGU9aW5wdXQgLS1oaWRlPWRyaSBcCisJCQkgICAgICAgLS1oaWRlPW5ldCAtLWhpZGU9aHVnZXBhZ2VzIC0taGlkZT1tcXVldWUgLS1oaWRlPXB0cyBcCisJCQkgICAgICAgIiRETV9ERVZfRElSIiB8IHNlZCAtZSAicyxeLCMjIExTTFI6CSwiCisJCQllY2hvICI8PT09PT09PT0gVWRldiBEQiBjb250ZW50ID09PT09PT09PiIKKwkJCWZvciBpIGluIC9zeXMvYmxvY2svZG0tKiAvc3lzL2Jsb2NrL2xvb3AqIDsgZG8KKwkJCQl1ZGV2YWRtIGluZm8gLS1xdWVyeT1hbGwgLS1wYXRoICIkaSIgMj4vZGV2L251bGwgfHwgdHJ1ZQorCQkJZG9uZSB8IHNlZCAtZSAicyxeLCMjIFVERVY6CSwiCisJCWZpCisJCWVjaG8gIjw9PT09PT09PSBTY3JpcHQgZmlsZSBcIiQoPCBURVNUTkFNRSlcIiA9PT09PT09PT4iCisJCWxvY2FsIHNjcmlwdD0kMAorCQl0ZXN0IC1mICIkc2NyaXB0IiB8fCBzY3JpcHQ9IiRURVNUT0xEUFdELyQwIgorCQlhd2sgJ3twcmludCAiIyMgTGluZToiLCBOUiwgIlx0IiwgJDB9JyAiJHNjcmlwdCIKKwl9Cit9CisKK2luaXRfdWRldl90cmFuc2FjdGlvbigpIHsKKwlpZiB0ZXN0ICIkRE1fVURFVl9TWU5DSFJPTklTQVRJT04iID0gMTsgdGhlbgorCQlsb2NhbCBjb29raWU9JChkbXNldHVwIHVkZXZjcmVhdGVjb29raWUpCisJCSMgQ29va2llIGlzIG5vdCBnZW5lcmF0ZWQgaWYgdWRldiBpcyBub3QgcnVubmluZyEKKwkJdGVzdCAteiAiJGNvb2tpZSIgfHwgZXhwb3J0IERNX1VERVZfQ09PS0lFPSRjb29raWUKKwlmaQorfQorCitmaW5pc2hfdWRldl90cmFuc2FjdGlvbigpIHsKKwlpZiB0ZXN0ICIkRE1fVURFVl9TWU5DSFJPTklTQVRJT04iID0gMSAtYSAtbiAiJERNX1VERVZfQ09PS0lFIjsgdGhlbgorCQlkbXNldHVwIHVkZXZyZWxlYXNlY29va2llCisJCXVuc2V0IERNX1VERVZfQ09PS0lFCisJZmkKK30KKwordGVhcmRvd25fdWRldl9jb29raWVzKCkgeworCWlmIHRlc3QgIiRETV9VREVWX1NZTkNIUk9OSVNBVElPTiIgPSAxOyB0aGVuCisJCSMgRGVsZXRlIGFueSBjb29raWVzIGNyZWF0ZWQgbW9yZSB0aGFuIDEwIG1pbnV0ZXMgYWdvCisJCSMgYW5kIG5vdCB1c2VkIGluIHRoZSBsYXN0IDEwIG1pbnV0ZXMuCisJCSMgTG9nIG9ubHkgbm9uLXplcm8gc2VtYXBob3JlcyBjb3VudAorCQkoZG1zZXR1cCB1ZGV2Y29tcGxldGVfYWxsIC15IDEwIHwgZ3JlcCAtdiAiXjAgIikgfHwgdHJ1ZQorCWZpCit9CisKK2RtX2luZm8oKSB7CisJc2hvdWxkIGRtc2V0dXAgaW5mbyAtLW5vaGVhZGluZ3MgLWMgLW8gIiRAIgorfQorCitkbV90YWJsZSgpIHsKKwlzaG91bGQgZG1zZXR1cCB0YWJsZSAiJEAiCit9CisKK3NraXAoKSB7CisJaWYgdGVzdCAiJCMiIC1lcSAwOyB0aGVuCisJCXN0YWNrdHJhY2UKKwllbHNlCisJCWVjaG8gIlRFU1QgU0tJUFBFRDogJEAiCisJZmkKKwl0b3VjaCBTS0lQX1RISVNfVEVTVAorCWV4aXQgMjAwCit9CisKK2dldF9kZXZzKCkgeworCWxvY2FsIElGUz0kSUZTX05MCisJREVWSUNFUz0oICQoPERFVklDRVMpICkKKwlleHBvcnQgREVWSUNFUworIwlsb2NhbCBERVZTPSggJCg8REVWSUNFUykgKQorIwlldmFsICIkMSInPSgiJHtERVZTW0BdfSIpJworfQorCitwcmVwYXJlX3Rlc3RfdmFycygpIHsKKwl2Zz0iJHtQUkVGSVh9dmciCisJbHY9TFYKKworCWZvciBpIGluICQoc2VxIDEgMTYpOyBkbworCQluYW1lPSIke1BSRUZJWH1wdiRpIgorCQlkZXY9IiRETV9ERVZfRElSL21hcHBlci8kbmFtZSIKKwkJZXZhbCAiZGV2JGk9XCIkZGV2XCIiCisJCWV2YWwgImx2JGk9TFYkaSIKKwkJZXZhbCAidmckaT0ke1BSRUZJWH12ZyRpIgorCWRvbmUKK30KKworaWYgdGVzdCAteiAiJHthYnNfdG9wX2J1aWxkZGlyK3ZhcnNldH0iICYmIHRlc3QgLXogIiR7aW5zdGFsbGVkX3Rlc3RzdWl0ZSt2YXJzZXR9IjsgdGhlbgorICAgIC4gbGliL3BhdGhzIHx8IGRpZSAic29tZXRoaW5nIHdlbnQgd3JvbmcgLS0gbGliL3BhdGhzIGlzIG1pc3Npbmc/IgorZmkKKworaWYgdGVzdCAteiAiJHtpbnN0YWxsZWRfdGVzdHN1aXRlK3ZhcnNldH0iOyB0aGVuCisgICAgY2FzZSAiJFBBVEgiIGluCisgICAgKiIkYWJzX3RvcF9idWlsZGRpci90ZXN0L2xpYiIqKSA7OworICAgICopCisJICAgIFBBVEg9IiRhYnNfdG9wX2J1aWxkZGlyL3Rlc3QvbGliIjoiJGFic190b3BfYnVpbGRkaXIvdGVzdC9hcGkiOiRQQVRICisJICAgIGZvciBpIGluIGBmaW5kICRhYnNfdG9wX2J1aWxkZGlyIC1uYW1lIFwqLnNvYDsgZG8KKwkJICAgIHA9YGRpcm5hbWUgJGlgCisJCSAgICBMRF9MSUJSQVJZX1BBVEg9IiRwIjokTERfTElCUkFSWV9QQVRICisJICAgIGRvbmUKKyAgICAgICAgICAgIGV4cG9ydCBQQVRIIExEX0xJQlJBUllfUEFUSCA7OworICAgIGVzYWMKK2ZpCisKK3Rlc3QgLXogIiRQUkVGSVgiIHx8IHByZXBhcmVfdGVzdF92YXJzCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsLzAwMC1iYXNpYy5zaCBiL3Rlc3Qvc2hlbGwvMDAwLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODRmM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsLzAwMC1iYXNpYy5zaApAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworbHZtIHZlcnNpb24KKworbHZtIHB2bW92ZSAtLXZlcnNpb258c2VkIC1uICIxcy8uKjogKlwoWzAtOV1bXiBdKlwpIC4qL1wxL3AiIHwgdGVlIHZlcnNpb24KKworIyBlbnN1cmUgdGhleSBhcmUgdGhlIHNhbWUKK2RpZmYgLXUgdmVyc2lvbiBsaWIvdmVyc2lvbi1leHBlY3RlZAorCitkbXN0YXRzIHZlcnNpb24gfHNlZCAtbiAiMXMvLio6ICpcKFswLTldW14gXSpcKSAuKi9cMS9wIiB8IHRlZSBkbXN0YXRzLXZlcnNpb24KKworIyBlbnN1cmUgZG1zdGF0cyB2ZXJzaW9uIG1hdGNoZXMgYnVpbGQKK2RpZmYgLXUgZG1zdGF0cy12ZXJzaW9uIGxpYi9kbS12ZXJzaW9uLWV4cGVjdGVkCisKKyMgZW5zdXJlIHdlIGNhbiBjcmVhdGUgZGV2aWNlcyAodXNlcyBkbXNldHVwLCBldGMpCithdXggcHJlcGFyZV9kZXZzIDUKKworIyBlbnN1cmUgd2UgZG8gbm90IGNyYXNoIG9uIGEgYnVnIGluIGNvbmZpZyBmaWxlCithdXggbHZtY29uZiAnbG9nL3ByZWZpeCA9IDEiIicKK25vdCBsdnMgJChjYXQgREVWSUNFUykKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvYWEtbHZtbG9ja2QtZGxtLXByZXBhcmUuc2ggYi90ZXN0L3NoZWxsL2FhLWx2bWxvY2tkLWRsbS1wcmVwYXJlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzBiYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2FhLWx2bWxvY2tkLWRsbS1wcmVwYXJlLnNoCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249J1NldCB1cCB0aGluZ3MgdG8gcnVuIHRlc3RzIHdpdGggZGxtJworCisuIGxpYi91dGlscworLiBsaWIvaW5pdHRlc3QKKworWyAteiAiJExWTV9URVNUX0xPQ0tfVFlQRV9ETE0iIF0gJiYgc2tpcDsKKworYXV4IHByZXBhcmVfZGxtCithdXggcHJlcGFyZV9sdm1sb2NrZAorCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2FhLWx2bWxvY2tkLXNhbmxvY2stcHJlcGFyZS5zaCBiL3Rlc3Qvc2hlbGwvYWEtbHZtbG9ja2Qtc2FubG9jay1wcmVwYXJlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Yjk0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2FhLWx2bWxvY2tkLXNhbmxvY2stcHJlcGFyZS5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdTZXQgdXAgdGhpbmdzIHRvIHJ1biB0ZXN0cyB3aXRoIHNhbmxvY2snCisKKy4gbGliL3V0aWxzCisuIGxpYi9pbml0dGVzdAorCitbIC16ICIkTFZNX1RFU1RfTE9DS19UWVBFX1NBTkxPQ0siIF0gJiYgc2tpcDsKKworIyBDcmVhdGUgYSBkZXZpY2UgYW5kIGEgVkcgdGhhdCBhcmUgYm90aCBvdXRzaWRlIHRoZSBzY29wZSBvZgorIyB0aGUgc3RhbmRhcmQgbHZtIHRlc3Qgc3VpdGUgc28gdGhhdCB0aGV5IHdpbGwgbm90IGJlIHJlbW92ZWQKKyMgYW5kIHdpbGwgcmVtYWluIGluIHBsYWNlIHdoaWxlIGFsbCB0aGUgdGVzdHMgYXJlIHJ1bi4KKyMKKyMgVXNlIHRoaXMgVkcgdG8gaG9sZCB0aGUgc2FubG9jayBnbG9iYWwgbG9jayB3aGljaCB3aWxsIGJlIHVzZWQKKyMgYnkgbHZtbG9ja2QgZHVyaW5nIG90aGVyIHRlc3RzLgorIworIyBUaGlzIHNjcmlwdCB3aWxsIGJlIHJ1biBiZWZvcmUgYW55IHN0YW5kYXJkIHRlc3RzIGFyZSBydW4uCisjIEFmdGVyIGFsbCB0aGUgdGVzdHMgYXJlIHJ1biwgYW5vdGhlciBzY3JpcHQgd2lsbCBiZSBydW4KKyMgdG8gcmVtb3ZlIHRoaXMgVkcgYW5kIGRldmljZS4KKworR0xfREVWPSIvZGV2L21hcHBlci9HTF9ERVYiCitHTF9GSUxFPSIkUFdEL2dsX2ZpbGUuaW1nIgorZG1zZXR1cCByZW1vdmUgR0xfREVWIHx8IHRydWUKK3JtIC1mICIkR0xfRklMRSIKK2RkIGlmPS9kZXYvemVybyBvZj0iJEdMX0ZJTEUiIGJzPSQoKDEwMjQqMTAyNCkpIGNvdW50PTEwMjQgMj4gL2Rldi9udWxsCitHTF9MT09QPSQobG9zZXR1cCAtZiAiJEdMX0ZJTEUiIC0tc2hvdykKK2VjaG8gIjAgYGJsb2NrZGV2IC0tZ2V0c2l6ZSAkR0xfTE9PUGAgbGluZWFyICRHTF9MT09QIDAiIHwgZG1zZXR1cCBjcmVhdGUgR0xfREVWCisKK2F1eCBwcmVwYXJlX3NhbmxvY2sKK2F1eCBwcmVwYXJlX2x2bWxvY2tkCisKK3ZnY3JlYXRlIC0tY29uZmlnICdkZXZpY2VzIHsgZ2xvYmFsX2ZpbHRlcj1bImF8R0xfREVWfCIsICJyfC4qfCJdIGZpbHRlcj1bImF8R0xfREVWfCIsICJyfC4qfCJdfScgLS1sb2NrLXR5cGUgc2FubG9jayBnbHZnICRHTF9ERVYKKwordmdzIC0tY29uZmlnICdkZXZpY2VzIHsgZ2xvYmFsX2ZpbHRlcj1bImF8R0xfREVWfCIsICJyfC4qfCJdIGZpbHRlcj1bImF8R0xfREVWfCIsICJyfC4qfCJdfScgLW8rbG9ja3R5cGUsbG9ja2FyZ3MgZ2x2ZworCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2FjdGl2YXRlLW1pbm9yLnNoIGIvdGVzdC9zaGVsbC9hY3RpdmF0ZS1taW5vci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc4YzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9hY3RpdmF0ZS1taW5vci5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBKdXN0IHNraXAgdGhpcyB0ZXN0IGlmIG1pbm9yIGlzIGFscmVhZHkgaW4gdXNlLi4uCitkbXNldHVwIGluZm8gfCB0ZWUgaW5mbworZWdyZXAgIl5NYWpvciwgbWlub3I6ICpbMC05XSssIDEyMyIgaW5mbyAmJiBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDIKK2x2Y3JlYXRlIC1hIG4gLS16ZXJvIG4gLWwgMSAtbiBmb28gJHZnCitsdmNoYW5nZSAkdmcvZm9vIC1NeSAtLW1ham9yPTI1NSAtLW1pbm9yPTEyMworbHZjaGFuZ2UgJHZnL2ZvbyAtYSB5CitkbXNldHVwIGluZm8gJHZnLWZvbyB8IHRlZSBpbmZvCitlZ3JlcCAiXk1ham9yLCBtaW5vcjogKlswLTldKywgMTIzIiBpbmZvCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvYWN0aXZhdGUtbWlzc2luZy1zZWdtZW50LnNoIGIvdGVzdC9zaGVsbC9hY3RpdmF0ZS1taXNzaW5nLXNlZ21lbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNmUxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvYWN0aXZhdGUtbWlzc2luZy1zZWdtZW50LnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgYWN0aXZhdGlvbiBiZWhhdmlvdXIgd2l0aCBkZXZpY2VzIG1pc3NpbmcuCisjIC0gc25hcHNob3RzIGFuZCB0aGVpciBvcmlnaW5zIGFyZSBvbmx5IGFjdGl2YXRlZCB0b2dldGhlcjsgaWYgb25lIGZhaWxzLCBib3RoCisjICAgZmFpbAorIyAtIHBhcnRpYWwgbWlycm9ycyBhcmUgbm90IGFjdGl2YXRlZCAoYnV0IG1heWJlIHRoZXkgc2hvdWxkPyBtYXliZSB3ZSBzaG91bGQKKyMgICBpbnN0ZWFkIGx2Y29udmVydCAtLXJlcGFpciB0aGVtPykKKyMgLSBsaW5lYXIgTFZzIHdpdGggYml0cyBtaXNzaW5nIGFyZSBub3QgYWN0aXZhdGVkCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAyCisKK2x2Y3JlYXRlIC1sMTAwJUZSRUUgLW4gc3BhbiAkdmcKK3ZnY2hhbmdlIC1hIG4gJHZnCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitub3QgdmdjaGFuZ2UgLWEgeSAkdmcKK3ZnY2hhbmdlIC1hIHkgLS1wYXJ0aWFsICR2ZworY2hlY2sgYWN0aXZlICR2ZyBzcGFuCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvYWN0aXZhdGUtbWlzc2luZy5zaCBiL3Rlc3Qvc2hlbGwvYWN0aXZhdGUtbWlzc2luZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM0NDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9hY3RpdmF0ZS1taXNzaW5nLnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgYWN0aXZhdGlvbiBiZWhhdmlvdXIgd2l0aCBkZXZpY2VzIG1pc3NpbmcuCisjIC0gc25hcHNob3RzIGFuZCB0aGVpciBvcmlnaW5zIGFyZSBvbmx5IGFjdGl2YXRlZCB0b2dldGhlcjsgaWYgb25lIGZhaWxzLCBib3RoCisjICAgZmFpbAorIyAtIHBhcnRpYWwgbWlycm9ycyBhcmUgbm90IGFjdGl2YXRlZCAoYnV0IG1heWJlIHRoZXkgc2hvdWxkPyBtYXliZSB3ZSBzaG91bGQKKyMgICBpbnN0ZWFkIGx2Y29udmVydCAtLXJlcGFpciB0aGVtPykKKyMgLSBsaW5lYXIgTFZzIHdpdGggYml0cyBtaXNzaW5nIGFyZSBub3QgYWN0aXZhdGVkCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyA0CisKK2x2Y3JlYXRlIC1sMSAtbiBsaW5lYXIxICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtbDEgLW4gbGluZWFyMiAkdmcgIiRkZXYyIgorbHZjcmVhdGUgLWwyIC1uIGxpbmVhcjEyICR2ZyAiJGRldjEiOjQgIiRkZXYyIjo0CisKK2x2Y3JlYXRlIC1hZXkgLWwxIC1uIG9yaWdpbjEgJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1zICR2Zy9vcmlnaW4xIC1sMSAtbiBzX25hcHNob3QyICIkZGV2MiIKKworbHZjcmVhdGUgLWFleSAtbDEgLS10eXBlIG1pcnJvciAtbTEgLW4gbWlycm9yMTIgLS1taXJyb3Jsb2cgY29yZSAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMSAtbiBtaXJyb3IxMjMgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisKK3ZnY2hhbmdlIC1hIG4gJHZnCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorbm90IHZnY2hhbmdlIC1hIHkgJHZnCitub3QgdmdjayAkdmcKKworY2hlY2sgaW5hY3RpdmUgJHZnIGxpbmVhcjEKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMgorY2hlY2sgaW5hY3RpdmUgJHZnIG9yaWdpbjEKK2NoZWNrIGluYWN0aXZlICR2ZyBzX25hcHNob3QyCitjaGVjayBpbmFjdGl2ZSAkdmcgbGluZWFyMTIKK2NoZWNrIGluYWN0aXZlICR2ZyBtaXJyb3IxMgorY2hlY2sgaW5hY3RpdmUgJHZnIG1pcnJvcjEyMworCit2Z2NoYW5nZSAtYSBuICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorYXV4IGRpc2FibGVfZGV2ICIkZGV2MiIKK25vdCB2Z2NoYW5nZSAtYWV5ICR2Zworbm90IHZnY2sgJHZnCisKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMQorY2hlY2sgaW5hY3RpdmUgJHZnIGxpbmVhcjIKK2NoZWNrIGluYWN0aXZlICR2ZyBsaW5lYXIxMgorY2hlY2sgaW5hY3RpdmUgJHZnIG9yaWdpbjEKK2NoZWNrIGluYWN0aXZlICR2ZyBzX25hcHNob3QyCitjaGVjayBpbmFjdGl2ZSAkdmcgbWlycm9yMTIKK2NoZWNrIGluYWN0aXZlICR2ZyBtaXJyb3IxMjMKKwordmdjaGFuZ2UgLWEgbiAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjMiCitub3QgdmdjaGFuZ2UgLWFleSAkdmcKK25vdCB2Z2NrICR2ZworCitjaGVjayBhY3RpdmUgJHZnIG9yaWdpbjEKK2NoZWNrIGFjdGl2ZSAkdmcgc19uYXBzaG90MgorY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIxCitjaGVjayBhY3RpdmUgJHZnIGxpbmVhcjIKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMTIKK2NoZWNrIGluYWN0aXZlICR2ZyBtaXJyb3IxMjMKK2NoZWNrIGFjdGl2ZSAkdmcgbWlycm9yMTIKKwordmdjaGFuZ2UgLWEgbiAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MyIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjQiCit2Z2NoYW5nZSAtYWV5ICR2Zworbm90IHZnY2sgJHZnCisKK2NoZWNrIGFjdGl2ZSAkdmcgb3JpZ2luMQorY2hlY2sgYWN0aXZlICR2ZyBzX25hcHNob3QyCitjaGVjayBhY3RpdmUgJHZnIGxpbmVhcjEKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMgorY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIxMgorY2hlY2sgYWN0aXZlICR2ZyBtaXJyb3IxMgorY2hlY2sgYWN0aXZlICR2ZyBtaXJyb3IxMjMKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9hY3RpdmF0ZS1wYXJ0aWFsLnNoIGIvdGVzdC9zaGVsbC9hY3RpdmF0ZS1wYXJ0aWFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODZlYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2FjdGl2YXRlLXBhcnRpYWwuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAzCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC1sIDEgLS1ub3N5bmMgLW4gbWlycm9yICR2ZworbHZjaGFuZ2UgLWEgbiAkdmcvbWlycm9yCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorCitub3QgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2Zworbm90IGx2Y2hhbmdlIC12IC1hZXkgJHZnL21pcnJvcgorbHZjaGFuZ2UgLXYgLS1wYXJ0aWFsIC1hZXkgJHZnL21pcnJvcgorbm90IGx2Y2hhbmdlIC12IC0tcmVmcmVzaCAkdmcvbWlycm9yCitsdmNoYW5nZSAtdiAtLXJlZnJlc2ggLS1wYXJ0aWFsICR2Zy9taXJyb3IKKworIyBhbHNvIGNoZWNrIHRoYXQgdmdjaGFuZ2Ugd29ya3MKK3ZnY2hhbmdlIC1hIG4gLS1wYXJ0aWFsICR2ZwordmdjaGFuZ2UgLWFleSAtLXBhcnRpYWwgJHZnCisKKyMgY2hlY2sgdmdyZW1vdmUKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvYWN0aXZhdGlvbi1za2lwLnNoIGIvdGVzdC9zaGVsbC9hY3RpdmF0aW9uLXNraXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNTI4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvYWN0aXZhdGlvbi1za2lwLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIFRlc3Qgc2tpcCBhY3RpdmF0aW9uIGZsYWcgIC1rfC0tc2V0YWN0aXZhdGlvbnNraXAKKworYXV4IHByZXBhcmVfdmcKKworbHZjcmVhdGUgLWFuIC0temVybyBuIC1sIDEgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1reSAtSyAtbDEgLW4gJGx2MiAkdmcKK2dldCBsdl9maWVsZCAkdmcvJGx2MiBsdl9hdHRyIHwgZ3JlcCAtLSAiLXdpLWEtLS0tayIKKworbHZjaGFuZ2UgLWF5IC1LICR2ZworY2hlY2sgYWN0aXZlICR2ZyAkbHYxCitsdmNoYW5nZSAtYW4gJHZnCisKK2x2Y2hhbmdlIC1heSAtLXNldGFjdGl2YXRpb25za2lwIHkgJHZnLyRsdjEKK2NoZWNrIGluYWN0aXZlICR2ZyAkbHYxCisKK2dldCBsdl9maWVsZCAkdmcvJGx2MSBsdl9hdHRyIHwgZ3JlcCAtLSAiLXdpLS0tLS0tayIKKworbHZjaGFuZ2UgLWF5IC1LICR2ZworY2hlY2sgYWN0aXZlICR2ZyAkbHYxCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvYmFja3VwLXJlYWQtb25seS5zaCBiL3Rlc3Qvc2hlbGwvYmFja3VwLXJlYWQtb25seS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhjNDliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9iYWNrdXAtcmVhZC1vbmx5LnNoCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MyB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDIKKworIyBOb3RlOiBpbml0dGVzdC5zaCAgc2V0cyAgIExWTV9TWVNURU1fRElSIHRvICdqdXN0JyBldGMKK2V0Y19sdj0iJERNX0RFVl9ESVIvJHZnLyRsdjEiCisKK2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24oKQoreworCXVtb3VudCAiJG1vdW50X2RpciIgfHwgdHJ1ZQorCWF1eCB0ZWFyZG93bgorfQorCit2Z3JlZHVjZSAkdmcgIiRkZXYyIgorCitsdmNyZWF0ZSAtbiAkbHYxIC1sIDIwJUZSRUUgJHZnCitta2ZzLmV4dDMgLWI0MDk2IC1qICIkZXRjX2x2IgorCisjCisjIGNoZWNrICByZWFkLW9ubHkgIGFyY2hpdmUgZGlyCisjCittb3VudF9kaXI9ImV0Yy9hcmNoaXZlIgordHJhcCAnY2xlYW51cF9tb3VudGVkX2FuZF90ZWFyZG93bicgRVhJVAorbWtkaXIgLXAgIiRtb3VudF9kaXIiCittb3VudCAtbiAtciAiJGV0Y19sdiIgIiRtb3VudF9kaXIiCisKK2F1eCBsdm1jb25mICJiYWNrdXAvYXJjaGl2ZSA9IDEiICJiYWNrdXAvYmFja3VwID0gMSIKKworIyBjYW5ub3QgYXJjaGl2ZSB0byByZWFkLW9ubHkgLSByZXF1aXJlcyB1c2VyIHRvIHNwZWNpZnkgLUFuCitub3QgbHZjcmVhdGUgLW4gJGx2MiAtbCAxMCVGUkVFICR2ZworbHZjcmVhdGUgLUFuIC1uICRsdjIgLWwgMTAlRlJFRSAkdmcKKworbm90IHZnZXh0ZW5kICAkdmcgIiRkZXYyIgordmdleHRlbmQgLUFuICR2ZyAiJGRldjIiCisKK3Vtb3VudCAiJG1vdW50X2RpciIgfHwgdHJ1ZQorCit2Z3JlZHVjZSAkdmcgIiRkZXYyIgorCisjCisjIGNoZWNrICByZWFkLW9ubHkgIGJhY2t1cCBkaXIKKyMKK21vdW50X2Rpcj0iZXRjL2JhY2t1cCIKK21vdW50IC1uIC1yICIkZXRjX2x2IiAiJG1vdW50X2RpciIKKworIyBNdXN0IG5vdCBmYWlsIG9uIG1ha2luZyBiYWNrdXAKK3Znc2NhbgorCitsdmNyZWF0ZSAtQW4gLW4gJGx2MyAtbCAxMCVGUkVFICR2ZworCit2Z2V4dGVuZCAkdmcgIiRkZXYyIgorCisjCisjIE5vdyBjaGVjayBib3RoIGFyY2hpdmUgJiBiYWNrdXAgcmVhZC1vbmx5CisjCitybSAtcmYgZXRjL2FyY2hpdmUKK2xuIC1zIGJhY2t1cCBldGMvYXJjaGl2ZQorCisjIE11c3Qgbm90IGZhaWwgb24gbWFraW5nIGJhY2t1cAordmdzY2FuCitsdmNyZWF0ZSAtQW4gLW4gJGx2NCAtbCAxMCVGUkVFICR2ZworCit1bW91bnQgIiRtb3VudF9kaXIiIHx8IHRydWUKKworIyBUT0RPIG1heWJlIGFsc28gc3VwcG9ydCAtLWlnbm9yZWxvY2tpbmdmYWlsdXJlID8/Cit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2Nsdm1kLXJlc3RhcnQuc2ggYi90ZXN0L3NoZWxsL2Nsdm1kLXJlc3RhcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNDQyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvY2x2bWQtcmVzdGFydC5zaApAQCAtMCwwICsxLDcyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIHNldCBiZWZvcmUgdGVzdCdzIGNsdm1kIGlzIHN0YXJ0ZWQsIHNvIGl0J3MgcGFzc2VkIGluIGVudmlyb24KK2V4cG9ydCBMVk1fQ0xWTURfQklOQVJZPWNsdm1kCitleHBvcnQgTFZNX0JJTkFSWT1sdm0KKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSE9VVF9DTFZNRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIG9ubHkgY2x2bWQgYmFzZWQgdGVzdCwgc2tpcCBvdGhlcndpc2UKK3JlYWQgTE9DQUxfQ0xWTUQgPCBMT0NBTF9DTFZNRAorCisjIFRPRE8gcmVhZCBmcm9tIGJ1aWxkLCBmb3Igbm93IGhhcmRjb2RlZAorQ0xWTURfU09DS0VUPSIvdmFyL3J1bi9sdm0vY2x2bWQuc29jayIKKworcmVzdGFydF9jbHZtZF8oKSB7CisJIiRMVk1fQ0xWTURfQklOQVJZIiAtUworCWxzIC1sYSAkQ0xWTURfU09DS0VUIHx8IHRydWUKKworCWZvciBpIGluICQoc2VxIDEgMjApIDsgZG8KKwkJdGVzdCAtUyAiJENMVk1EX1NPQ0tFVCIgJiYgYnJlYWsKKwkJc2xlZXAgLjEKKwlkb25lCisJIyByZXN0YXJ0ZWQgY2x2bWQgaGFzIHRoZSBzYW1lIFBJRCAobm8gZm9yaywgb25seSBleGVjdnApCisJTkVXX0xPQ0FMX0NMVk1EPSQocGdyZXAgY2x2bWQpCisJdGVzdCAiJExPQ0FMX0NMVk1EIiAtZXEgIiRORVdfTE9DQUxfQ0xWTUQiCit9CisKK2F1eCBwcmVwYXJlX3ZnCisKK2x2Y3JlYXRlIC1hbiAtLXplcm8gbiAtbiAkbHYxIC1sMSAkdmcKK2x2Y3JlYXRlIC1hbiAtLXplcm8gbiAtbiAkbHYyIC1sMSAkdmcKK2x2Y3JlYXRlIC1sMSAkdmcKKworbHZjaGFuZ2UgLWFleSAkdmcvJGx2MQorbHZjaGFuZ2UgLWFleSAkdmcvJGx2MgorCityZXN0YXJ0X2Nsdm1kXworCisjIHRyeSByZXN0YXJ0IG9uY2UgbW9yZQorcmVzdGFydF9jbHZtZF8KKworIyBGSVhNRTogSG1tIC0gaG93IGNvdWxkIHdlIHRlc3QgZXhjbHVzaXZpdHkgaXMgcHJlc2VydmVkIGluIHNpbmdsZW5vZGUgPworbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCitsdmNoYW5nZSAtYWV5ICR2Zy8kbHYxCitsdmNyZWF0ZSAtcyAtbDMgLW4gc25hcCAkdmcvJGx2MQorCisiJExWTV9DTFZNRF9CSU5BUlkiIC1SCisKK3ZnY2hhbmdlIC1hbiAkdmcKKworIyBUZXN0IHdoYXQgaGFwcGVucyBhZnRlciAncmVib290Jwora2lsbCAiJExPQ0FMX0NMVk1EIgord2hpbGUgdGVzdCAtZSAiJENMVk1EX1BJREZJTEUiOyBkbyBlY2hvIC1uIC47IHNsZWVwIC4xOyBkb25lICMgd2FpdCBmb3IgdGhlIHBpZCByZW1vdmFsCithdXggcHJlcGFyZV9jbHZtZAorCit2Z2NoYW5nZSAtYXkgJHZnCitsdnJlbW92ZSAtZiAkdmcvc25hcAorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2NvdmVyY21kLnNoIGIvdGVzdC9zaGVsbC9jb3ZlcmNtZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZmOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9jb3ZlcmNtZC5zaApAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjCisjIHRlc3RzIGZ1bmN0aW9uYWxpdHkgd2UgZG9uJ3QgaGF2ZSBpbiBvdGhlciBzcGVjaWFsIHRlc3QgZmlsZXMgeWV0CisjIHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZQorIworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDUKK2dldF9kZXZzCisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjIiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYzIgorCisjIEZJWE1FIHRha2VzIHZlcnkgbG9uZyB0aW1lCisjcHZjayAiJGRldjEiCisKK3ZnY3JlYXRlICR2ZyAiJHtERVZJQ0VTW0BdfSIKKworbHZjcmVhdGUgLWwgNSAtaTUgLUkyNTYgLW4gJGx2ICR2ZworbHZjcmVhdGUgLWFleSAtbCA1IC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtcyAtbCA1IC1uICRsdjIgJHZnLyRsdjEKK3B2Y2sgIiRkZXYxIgorCisjICItcGVyc2lzdGVudCB5IC0tbWFqb3IgMjU0IC0tbWlub3IgMjAiCisjICItcGVyc2lzdGVudCBuIgorZm9yIGkgaW4gcHIgInAgcnciICItbW9uaXRvciB5IiAiLW1vbml0b3IgbiIgLXJlZnJlc2g7IGRvCisJbHZjaGFuZ2UgLSRpICR2Zy8kbHYKK2RvbmUKKworbHZyZW5hbWUgJHZnICRsdiAkbHYtcmVuYW1lCitpbnZhbGlkIGx2cmVuYW1lICR2ZworaW52YWxpZCBsdnJlbmFtZSAkdmcgJHZnLyRsdi1yZW5hbWUgJHZnMS8kbHYKK2ludmFsaWQgbHZyZW5hbWUgJHZnLyRsdi1yZW5hbWUgJHZnMS8kbHYgJHZnCitpbnZhbGlkIGx2cmVuYW1lICR2Zy8kbHYtcmVuYW1lICR2Zy8wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2ludmFsaWQgbHZyZW5hbWUgJHZnLyRsdi1yZW5hbWUgJHZnLyIiCitpbnZhbGlkIGx2cmVuYW1lICR2Zy8kbHYtcmVuYW1lICIkdmcvIUAjJCUiCitpbnZhbGlkIGx2cmVuYW1lICR2Zy8kbHYtcmVuYW1lICR2Zy8kbHYtcmVuYW1lCitmYWlsIGx2cmVuYW1lICR2ZzEvJGx2LXJlbmFtZSAkdmcxLyRsdgorCit2Z3JlbW92ZSAtZiAkdmcKKworCisjIHRlc3QgcHZyZXNpemUgZnVuY3Rpb25hbGl0eQorIyBtaXNzaW5nIHBhcmFtcworbm90IHB2cmVzaXplCisjIG5lZ2F0aXZlIHNpemUKK25vdCBwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAtMTBNICIkZGV2MSIKKyMgbm90IGV4aXN0aW5nIGRldmljZQorbm90IHB2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDEwTSAiJGRldjciCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAxME0gIiRkZXYxIgorcHZyZXNpemUgIiRkZXYxIgorCisKKyMgdGVzdCB2YXJpb3VzIGx2bSB1dGlscworbHZtIGR1bXBjb25maWcKK2x2bSBkZXZ0eXBlcworbHZtIGZvcm1hdHMKK2x2bSBzZWd0eXBlcworbHZtIHRhZ3MKKworCisjIHRlc3Qgb2Jzb2xldGVkIHRvb2xzCitub3QgbHZtIGx2bWNoYW5nZQorbm90IGx2bSBsdm1zYWRjCitub3QgbHZtIGx2bXNhcgorbm90IGx2bSBwdmRhdGEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvZGlzY2FyZHMtdGhpbi5zaCBiL3Rlc3Qvc2hlbGwvZGlzY2FyZHMtdGhpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODViMjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9kaXNjYXJkcy10aGluLnNoCkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgdGVzdCBzdXBwb3J0IG9mIHRoaW4gZGlzY2FyZHMKKyMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworLiBsaWIvaW5pdHRlc3QKKworIworIyBNYWluCisjCithdXggaGF2ZV90aGluIDEgMSAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDIgNjQKKworYXV4IGV4dGVuZF9maWx0ZXJfTFZNVEVTVAorCit2Z2NyZWF0ZSAkdmcgLXMgNjRLICQoY2F0IERFVklDRVMpCisKKyMgQ3JlYXRlIG5hbWVkIHBvb2wgb25seQorbHZjcmVhdGUgLWwxIC0tZGlzY2FyZHMgaWdub3JlIC1UICR2Zy9wb29sCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbCBkaXNjYXJkcyAiaWdub3JlIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wga2VybmVsX2Rpc2NhcmRzICJpZ25vcmUiCitsdmNyZWF0ZSAtbDEgLS1kaXNjYXJkcyBub3Bhc3Nkb3duIC1UICR2Zy9wb29sMQorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wxIGRpc2NhcmRzICJub3Bhc3Nkb3duIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wxIGtlcm5lbF9kaXNjYXJkcyAibm9wYXNzZG93biIKK2x2Y3JlYXRlIC1sMSAtLWRpc2NhcmRzIHBhc3Nkb3duIC1UICR2Zy9wb29sMgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wyIGRpc2NhcmRzICJwYXNzZG93biIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMiBkaXNjYXJkcyAicGFzc2Rvd24iCisKK2x2Y2hhbmdlIC0tZGlzY2FyZHMgbm9wYXNzZG93biAkdmcvcG9vbDIKKworbHZjcmVhdGUgLVYxTSAtbiBvcmlnaW4gLVQgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1zICR2Zy9vcmlnaW4gLW4gc25hcAorCisjIENhbm5vdCBjb252ZXJ0IGFjdGl2ZSAgbm9wYXNzZG93biAtPiBpZ25vcmUKK25vdCBsdmNoYW5nZSAtLWRpc2NhcmRzIG5vcGFzc2Rvd24gJHZnL3Bvb2wKKworIyBDYW5ub3QgY29udmVydCBhY3RpdmUgIGlnbm9yZSAtPiBwYXNzZG93bgorbm90IGx2Y2hhbmdlIC0tZGlzY2FyZHMgcGFzc2Rvd24gJHZnL3Bvb2wKKworIyBDYW5ub3QgY29udmVydCBhY3RpdmUgIG5vcGFzc2Rvd24gLT4gaWdub3JlCitub3QgbHZjaGFuZ2UgLS1kaXNjYXJkcyBpZ25vcmUgJHZnL3Bvb2wxCisKKyMgRGVhY3RpdmF0ZSBwb29sIG9ubHkKK2x2Y2hhbmdlIC1hbiAkdmcvcG9vbCAkdmcvcG9vbDEKKworIyBDYW5ub3QgY29udmVydCwgc2luY2UgdGhpbiB2b2x1bWVzIGFyZSBzdGlsbCBhY3RpdmUKK25vdCBsdmNoYW5nZSAtLWRpc2NhcmRzIHBhc3Nkb3duICR2Zy9wb29sCisKKyMgRGVhY3RpdmUgdGhpbiB2b2x1bWVzCitsdmNoYW5nZSAtYW4gJHZnL29yaWdpbiAkdmcvc25hcAorCitsdmNoYW5nZSAtLWRpc2NhcmRzIHBhc3Nkb3duICR2Zy9wb29sCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbCBkaXNjYXJkcyAicGFzc2Rvd24iCisKK2x2Y2hhbmdlIC0tZGlzY2FyZHMgaWdub3JlICR2Zy9wb29sMQorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wxIGRpc2NhcmRzICJpZ25vcmUiCisKK3ZncmVtb3ZlIC1mZiAkdmcKKworIyBDcmVhdGUgdGhpbiBwb29sIHdpdGggZGlzY2FyZHMgc2V0IHRvICJpZ25vcmUiLgorIyBJZiB3ZSBjcmVhdGUgYSB0aGluIHZvbHVtZSB3aGljaCB3ZSB1c2UgZm9yIGEgUFYKKyMgd2hpY2ggd2UgdXNlIHRvIGNyZWF0ZSBhbm90aGVyIHRoaW4gcG9vbCBvbiB0b3AKKyMgd2l0aCBkaXNjYXJkcyBzZXQgdG8gInBhc3Nkb3duIiwgdGhlIGRpc2NhcmRzIHZhbHVlCisjIGluIG1ldGFkYXRhIGlzIHN0aWxsICJwYXNzZG93biIsIGJ1dCBiZWNhdXNlIHRoZQorIyBkZXZpY2UgYmVsb3cgZG9lcyBub3Qgc3VwcG9ydCBpdCwgdGhlIGtlcm5lbCB2YWx1ZQorIyBvZiBkaXNjYXJkcyBhY3R1YWxseSB1c2VkIHdpbGwgYmUgIm5vcGFzc2Rvd24iLgorIyBUaGlzIGlzIHdoeSB3ZSBoYXZlICItbyBkaXNjYXJkcyIgYW5kICItbyBrZXJuZWxfZGlzY2FyZHMiLgordmdjcmVhdGUgLXMgMW0gJHt2Z31fMSAkKGNhdCBERVZJQ0VTKQorbHZjcmVhdGUgLWwgMTAgLVQgJHt2Z31fMS9wb29sIC0tZGlzY2FyZHMgaWdub3JlCitsdmNyZWF0ZSAtViA5bSAtVCAke3ZnfV8xL3Bvb2wgLW4gZGV2aWNlX3dpdGhfaWdub3JlZF9kaXNjYXJkcwordmdjcmVhdGUgLXMgMW0gJHt2Z31fMiAiJERNX0RFVl9ESVIvJHt2Z31fMS9kZXZpY2Vfd2l0aF9pZ25vcmVkX2Rpc2NhcmRzIgorbHZjcmVhdGUgLWwgMSAtVCAke3ZnfV8yL3Bvb2wgLS1kaXNjYXJkcyBwYXNzZG93bgorbHZjcmVhdGUgLVYgMSAtVCAke3ZnfV8yL3Bvb2wKK2NoZWNrIGx2X2ZpZWxkICR7dmd9XzEvcG9vbCBkaXNjYXJkcyAiaWdub3JlIgorY2hlY2sgbHZfZmllbGQgJHt2Z31fMS9wb29sIGtlcm5lbF9kaXNjYXJkcyAiaWdub3JlIgorY2hlY2sgbHZfZmllbGQgJHt2Z31fMi9wb29sIGRpc2NhcmRzICJwYXNzZG93biIKK2NoZWNrIGx2X2ZpZWxkICR7dmd9XzIvcG9vbCBrZXJuZWxfZGlzY2FyZHMgIm5vcGFzc2Rvd24iCisKK3ZncmVtb3ZlIC1mZiAke3ZnfV8yCit2Z3JlbW92ZSAtZmYgJHt2Z31fMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9kbWV2ZW50ZC1yZXN0YXJ0LnNoIGIvdGVzdC9zaGVsbC9kbWV2ZW50ZC1yZXN0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWQ5YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2RtZXZlbnRkLXJlc3RhcnQuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kbWV2ZW50ZAorCithdXggcHJlcGFyZV92ZyA1CisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAzIC0tbm9zeW5jIC0taWdub3JlbW9uaXRvcmluZyAtbDEgLW4gNHdheSAkdmcKK2x2Y2hhbmdlIC0tbW9uaXRvciB5ICR2Zy80d2F5CitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMiAtLW5vc3luYyAtLWlnbm9yZW1vbml0b3JpbmcgLWwxIC1uIDN3YXkgJHZnCitsdmNoYW5nZSAtLW1vbml0b3IgeSAkdmcvM3dheQorCitkbWV2ZW50ZCAtUiAtZiAmCitlY2hvICQhID5MT0NBTF9ETUVWRU5URAorc2xlZXAgMiAjIHdhaXQgYSBiaXQsIHNvIHdlIHRhbGsgdG8gdGhlIG5ldyBkbWV2ZW50ZCBsYXRlcgorCitsdmNoYW5nZSAtLW1vbml0b3IgeSAtLXZlcmJvc2UgJHZnLzN3YXkgMj4mMSB8IHRlZSBsdmNoYW5nZS5vdXQKK2dyZXAgJ2FscmVhZHkgbW9uaXRvcmVkJyBsdmNoYW5nZS5vdXQKK2x2Y2hhbmdlIC0tbW9uaXRvciB5IC0tdmVyYm9zZSAkdmcvNHdheSAyPiYxIHwgdGVlIGx2Y2hhbmdlLm91dAorZ3JlcCAnYWxyZWFkeSBtb25pdG9yZWQnIGx2Y2hhbmdlLm91dAorCisjIG5vdyB0cnkgd2hhdCBoYXBwZW5zIGlmIG5vIGRtZXZlbnRkIGlzIHJ1bm5pbmcKK2tpbGwgLTkgJCg8IExPQ0FMX0RNRVZFTlREKQorcm0gTE9DQUxfRE1FVkVOVEQKKworZG1ldmVudGQgLVIgLWYgJgorZWNobyAkISA+TE9DQUxfRE1FVkVOVEQKKworIyB3YWl0IGxvbmdlciBhcyB0cmllcyB0byBjb21tdW5pY2F0ZSB3aXRoIGtpbGxlZCBkYWVtb24KK3NsZWVwIDcKKyMgbm93IGRtZXZlbnRkIHNob3VsZCBub3QgYmUgcnVubmluZworbm90IHBncmVwIGRtZXZlbnRkCitybSBMT0NBTF9ETUVWRU5URAorCisjIHNldCBkbWV2ZW50ZCBwYXRoCitpZiB0ZXN0IC1uICIkYWJzX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICBhdXggbHZtY29uZiAiZG1ldmVudGQvZXhlY3V0YWJsZT1cIiRhYnNfdG9wX2J1aWxkZGlyL3Rlc3QvbGliL2RtZXZlbnRkXCIiCitmaQorCitsdmNoYW5nZSAtLW1vbml0b3IgeSAtLXZlcmJvc2UgJHZnLzN3YXkgMj4mMSB8IHRlZSBsdmNoYW5nZS5vdXQKK3BncmVwIC1vIGRtZXZlbnRkID5MT0NBTF9ETUVWRU5URAorbm90IGdyZXAgJ2FscmVhZHkgbW9uaXRvcmVkJyBsdmNoYW5nZS5vdXQKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9kbXN0YXRzLWNyZWF0ZS5zaCBiL3Rlc3Qvc2hlbGwvZG1zdGF0cy1jcmVhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyY2QzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvZG1zdGF0cy1jcmVhdGUuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgRG9uJ3QgYXR0ZW1wdCB0byB0ZXN0IHN0YXRzIHdpdGggZHJpdmVyIDwgNC4zMy4wMAorYXV4IGRyaXZlcl9hdF9sZWFzdCA0IDMzIHx8IHNraXAKKworIyBlbnN1cmUgd2UgY2FuIGNyZWF0ZSBkZXZpY2VzICh1c2VzIGRtc2V0dXAsIGV0YykKK2F1eCBwcmVwYXJlX2RldnMgMQorCisjIGJhc2ljIGRtc3RhdHMgY3JlYXRlIGNvbW1hbmRzCisKK2Rtc3RhdHMgY3JlYXRlICIkZGV2MSIKK2Rtc3RhdHMgY3JlYXRlIC0tc3RhcnQgMCAtLWxlbiAxICIkZGV2MSIKK2Rtc3RhdHMgY3JlYXRlIC0tc2VnbWVudHMgIiRkZXYxIgorZG1zdGF0cyBjcmVhdGUgLS1wcmVjaXNlICIkZGV2MSIKK2Rtc3RhdHMgY3JlYXRlIC0tYm91bmRzIDEwbXMsMjBtcywzMG1zICIkZGV2MSIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvZG1zdGF0cy1yZXBvcnQuc2ggYi90ZXN0L3NoZWxsL2Rtc3RhdHMtcmVwb3J0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjkxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2Rtc3RhdHMtcmVwb3J0LnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIERvbid0IGF0dGVtcHQgdG8gdGVzdCBzdGF0cyB3aXRoIGRyaXZlciA8IDQuMzMuMDAKK2F1eCBkcml2ZXJfYXRfbGVhc3QgNCAzMyB8fCBza2lwCisKKyMgZW5zdXJlIHdlIGNhbiBjcmVhdGUgZGV2aWNlcyAodXNlcyBkbXNldHVwLCBldGMpCithdXggcHJlcGFyZV9kZXZzIDEKKworIyBwcmVwYXJlIGEgc3RhdHMgcmVnaW9uIHdpdGggYSBoaXN0b2dyYW0KK2Rtc3RhdHMgY3JlYXRlIC0tYm91bmRzIDEwbXMsMjBtcywzMG1zICIkZGV2MSIKKworIyBiYXNpYyBkbXN0YXRzIHJlcG9ydCBjb21tYW5kcworZG1zdGF0cyByZXBvcnQKK2Rtc3RhdHMgcmVwb3J0IC0tY291bnQgMQorZG1zdGF0cyByZXBvcnQgLS1oaXN0b2dyYW0KZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvZHVtcGNvbmZpZy5zaCBiL3Rlc3Qvc2hlbGwvZHVtcGNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjJkMjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9kdW1wY29uZmlnLnNoCkBAIC0wLDAgKzEsNDggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworZmxhdHRlbigpIHsKKwljYXQgPiBmbGF0dGVuLmNvbmZpZworCWZvciBzIGluIGBlZ3JlcCAnXlthLXpdKyB7JCcgZmxhdHRlbi5jb25maWcgfCBzZWQgLWUgcyx7JCwsYDsgZG8KKwkJc2VkIC1lICIvXiRzLywvXn0vcDtkIiBmbGF0dGVuLmNvbmZpZyB8IHNlZCAtZSAnMWQ7JGQnIHwgc2VkIC1lICJzLF5bIFx0XSosJHMvLCI7CisJZG9uZQorfQorCisjIGNsdm1kIG1pZ2h0IG5vdCBiZSBzdGFydGVkIGZhc3QgZW5vdWdoIGFuZAorIyBsdm0gc3RpbGwgYWN0aXZhdGVzIGxvY2tpbmcgZm9yIGFsbCBjb21tYW5kcy4KKyMgRklYTUU6IEVpdGhlciBtYWtlIGxvbmdlciBzdGFydCBkZWxheSwKKyMgIG9yIGV2ZW4gYmV0dGVyIGRvIG5vdCBpbml0aWFsaXplCisjICBsb2NraW5nIGZvciBjb21tYW5kcyBsaWtlICdkdW1wY29uZmlnJworI2F1eCBsdm1jb25mICJnbG9iYWwvbG9ja2luZ190eXBlPTAiCisKK2x2bSBkdW1wY29uZmlnIC1mIGx2bWR1bXBjb25maWcKK2ZsYXR0ZW4gPCBsdm1kdW1wY29uZmlnIHwgc29ydCA+IGNvbmZpZy5kdW1wCitmbGF0dGVuIDwgZXRjL2x2bS5jb25mIHwgc29ydCA+IGNvbmZpZy5pbnB1dAorIyBjaGVjayB0aGF0IGR1bXBjb25maWcgb3V0cHV0IGNvcnJlc3BvbmRzIHRvIHRoZSBsdm0uY29uZiBpbnB1dAorZGlmZiAtd3UgY29uZmlnLmlucHV0IGNvbmZpZy5kdW1wCisKKyMgYW5kIHRoYXQgbWVyZ2luZyBtdWx0aXBsZSBjb25maWcgZmlsZXMgKHRocm91Z2ggdGFncykgd29ya3MKK2x2bSBkdW1wY29uZmlnIC1mIGx2bWR1bXBjb25maWcKK2ZsYXR0ZW4gPCBsdm1kdW1wY29uZmlnIHwgbm90IGdyZXAgJ2xvZy92ZXJib3NlPTEnCitsdm0gZHVtcGNvbmZpZyAtZiBsdm1kdW1wY29uZmlnCitmbGF0dGVuIDwgbHZtZHVtcGNvbmZpZyB8IGdyZXAgJ2xvZy9pbmRlbnQ9MScKKworYXV4IGx2bWNvbmYgJ3RhZ3MvQGZvbyB7fScKK2VjaG8gJ2xvZyB7IHZlcmJvc2UgPSAxIH0nID4gZXRjL2x2bV9mb28uY29uZgorbHZtIGR1bXBjb25maWcgLWYgbHZtZHVtcGNvbmZpZworZmxhdHRlbiA8IGx2bWR1bXBjb25maWcgfCBncmVwICdsb2cvdmVyYm9zZT0xJworbHZtIGR1bXBjb25maWcgLWYgbHZtZHVtcGNvbmZpZworZmxhdHRlbiA8IGx2bWR1bXBjb25maWcgfCBncmVwICdsb2cvaW5kZW50PTEnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2Vycm9yLXVzYWdlLnNoIGIvdGVzdC9zaGVsbC9lcnJvci11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFkYWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9lcnJvci11c2FnZS5zaApAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIEJhc2ljIHVzYWdlIG9mIHplcm8gdGFyZ2V0CisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMQorCit2Z2NyZWF0ZSAtcyAyNTZrICR2ZyAkKGNhdCBERVZJQ0VTKQorCitsdmNyZWF0ZSAtLXR5cGUgZXJyb3IgLUwxIC1uICRsdjEgJHZnCitsdmV4dGVuZCAtTCsxICR2Zy8kbHYxCisKKyMgaGFzIHRvIG1hdGNoCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGx2X21vZHVsZXMgImVycm9yIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgc2VndHlwZSAiZXJyb3IiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWdfY291bnQgIjEiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWdfc2l6ZV9wZSAiOCIgICAjIDggKiAyNTYKKworIyBGSVhNRSBzaG91bGQgd2UgcHJpbnQgaW5mbyB3ZSBhcmUgaWdub3Jpbmcgc3RyaXBwaW5nPworbHZleHRlbmQgLUwrMSAtSTY0IC1pMiAkdmcvJGx2MQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9mb3JtYXQtbHZtMS5zaCBiL3Rlc3Qvc2hlbGwvZm9ybWF0LWx2bTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxMGIxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvZm9ybWF0LWx2bTEuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbHZtMSBmb3JtYXQnCisKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMQorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNMSIgOyB0aGVuCitwdmNyZWF0ZSAtTTEgIiRkZXYxIgordmdjcmVhdGUgLU0xICR2ZyAiJGRldjEiCitjaGVjayB2Z19maWVsZCAkdmcgZm10ICJsdm0xIgorZmkKKworIyBUT0RPOiBpZiB3ZSBkZWNpZGUgdG8gbWFrZSB1c2luZyBsdm0xIHdpdGggbHZtZXRhZCBhbiBlcnJvciwKKyMgdGhlbiBpZiBsdm1ldGFkIGlzIGJlaW5nIHVzZWQsIHRoZW4gdmVyaWZ5OgorIyBub3QgcHZjcmVhdGUgLU0xICIkZGV2MSIKKyMgbm90IHZnY3JlYXRlIC1NMSAkdmcgIiRkZXYxIgorIworIyBUT0RPOiBpZiB3ZSBkZWNpZGUgdG8gYWxsb3cgdXNpbmcgbHZtMSB3aXRoIGx2bWV0YWQsIGJ1dCBkaXNhYmxlIGx2bWV0YWQKKyMgd2hlbiBpdCBoYXBwZW5zLCB0aGVuIHZlcmlmeToKKyMgcHZjcmVhdGUgLU0xICIkZGV2MSIgfCB0ZWUgZXJyCisjIGdyZXAgImRpc2FibGVkIiBlcnIKKyMgdmdjcmVhdGUgLU0xICR2ZyAiJGRldjEiIHwgdGVlIGVycgorIyBncmVwICJkaXNhYmxlZCIgZXJyCisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvZnNhZG0uc2ggYi90ZXN0L3NoZWxsL2ZzYWRtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDM5MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2ZzYWRtLnNoCkBAIC0wLDAgKzEsMTc1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdFeGVyY2lzZSBmc2FkbSBmaWxlc3lzdGVtIHJlc2l6ZScKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAxIDEwMAorCisjIHNldCB0byAic2tpcCIgdG8gYXZvaWQgdGVzdGluZyBnaXZlbiBmcyBhbmQgdGVzdCB3YXJuaW5nIHJlc3VsdAorIyBpLmUuIGNoZWNrX3JlaXNlcmZzPXNraXAKK2NoZWNrX2V4dDI9CitjaGVja19leHQzPQorY2hlY2tfeGZzPQorY2hlY2tfcmVpc2VyZnM9CisKK3doaWNoIG1rZnMuZXh0MiB8fCBjaGVja19leHQyPSR7Y2hlY2tfZXh0MjotbWtmcy5leHQyfQord2hpY2ggbWtmcy5leHQzIHx8IGNoZWNrX2V4dDM9JHtjaGVja19leHQzOi1ta2ZzLmV4dDN9Cit3aGljaCBmc2NrLmV4dDMgfHwgY2hlY2tfZXh0Mz0ke2NoZWNrX2V4dDM6LWZzY2suZXh0M30KK3doaWNoIG1rZnMueGZzIHx8IGNoZWNrX3hmcz0ke2NoZWNrX3hmczotbWtmcy54ZnN9Cit3aGljaCB4ZnNfY2hlY2sgfHwgeworCXdoaWNoIHhmc19yZXBhaXIgfHwgY2hlY2tfeGZzPSR7Y2hlY2tfeGZzOi14ZnNfcmVwYWlyfQorfQorZ3JlcCB4ZnMgL3Byb2MvZmlsZXN5c3RlbXMgfHwgY2hlY2tfeGZzPSR7Y2hlY2tfeGZzOi1ub194ZnN9CisKK3doaWNoIG1rZnMucmVpc2VyZnMgfHwgY2hlY2tfcmVpc2VyZnM9JHtjaGVja19yZWlzZXJmczotbWtmcy5yZWlzZXJmc30KK3doaWNoIHJlaXNlcmZzY2sgfHwgY2hlY2tfcmVpc2VyZnM9JHtjaGVja19yZWlzZXJmczotcmVpc2VyZnNja30KK2dyZXAgcmVpc2VyZnMgL3Byb2MvZmlsZXN5c3RlbXMgfHwgY2hlY2tfcmVpc2VyZnM9JHtjaGVja19yZWlzZXJmczotbm9fcmVpc2VyZnN9CisKK3ZnX2x2PSR2Zy8kbHYxCit2Z19sdjI9JHZnLyR7bHYxfWJhcgorZGV2X3ZnX2x2PSIkRE1fREVWX0RJUi8kdmdfbHYiCitkZXZfdmdfbHYyPSIkRE1fREVWX0RJUi8kdmdfbHYyIgorbW91bnRfZGlyPSJtbnQiCittb3VudF9zcGFjZV9kaXI9Im1udCBzcGFjZSBkaXIiCisjIGZvciByZWN1cnNpdmUgY2FsbAorZXhwb3J0IExWTV9CSU5BUlk9JCh3aGljaCBsdm0pCisKK3Rlc3QgISAtZCAiJG1vdW50X2RpciIgJiYgbWtkaXIgIiRtb3VudF9kaXIiCit0ZXN0ICEgLWQgIiRtb3VudF9zcGFjZV9kaXIiICYmIG1rZGlyICIkbW91bnRfc3BhY2VfZGlyIgorCitjbGVhbnVwX21vdW50ZWRfYW5kX3RlYXJkb3duKCkKK3sKKwl1bW91bnQgIiRtb3VudF9kaXIiIHx8IHRydWUKKwl1bW91bnQgIiRtb3VudF9zcGFjZV9kaXIiIHx8IHRydWUKKwlhdXggdGVhcmRvd24KK30KKworZnNjaGVja19leHQzKCkKK3sKKwlmc2NrLmV4dDMgLXAgLUYgLWYgIiRkZXZfdmdfbHYiCit9CisKK2ZzY2hlY2tfeGZzKCkKK3sKKwlpZiB3aGljaCB4ZnNfcmVwYWlyIDsgdGhlbgorCQl4ZnNfcmVwYWlyIC1uICIkZGV2X3ZnX2x2IgorCWVsc2UKKwkJeGZzX2NoZWNrICIkZGV2X3ZnX2x2IgorCWZpCit9CisKK2ZzY2hlY2tfcmVpc2VyZnMoKQoreworCXJlaXNlcmZzY2sgLS1jaGVjayAtcCAtZiAiJGRldl92Z19sdiIgPC9kZXYvbnVsbAorfQorCitjaGVja19taXNzaW5nKCkKK3sKKwlsb2NhbCB0CisJZXZhbCB0PSRcY2hlY2tfJDEKKwl0ZXN0IC16ICIkdCIgJiYgcmV0dXJuIDAKKwl0ZXN0ICIkdCIgPSBza2lwICYmIHJldHVybiAxCisJZWNobyAiV0FSTklORzogZnNhZG0gdGVzdCBza2lwcGVkICQxIHRlc3RzLCAkdCB0b29sIGlzIG1pc3NpbmcuIgorCSMgdHJpY2sgdG8gZ2V0IHRlc3QgbGlzdGVkIHdpdGggd2FybmluZworCSMgc2hvdWxkIGZhbHNlOworCXJldHVybiAxCit9CisKKyMgVGVzdCBmb3IgYmxvY2sgc2l6ZXMgIT0gMTAyNCAocmhieiAjNDgwMDIyKQorbHZjcmVhdGUgLW4gJGx2MSAtTDIwTSAkdmcKK2x2Y3JlYXRlIC1uICR7bHYxfWJhciAtTDEwTSAkdmcKK3RyYXAgJ2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24nIEVYSVQKKworaWYgY2hlY2tfbWlzc2luZyBleHQyOyB0aGVuCisJbWtmcy5leHQyIC1iNDA5NiAtaiAiJGRldl92Z19sdiIKKworCWZzYWRtIC0tbHZyZXNpemUgcmVzaXplICR2Z19sdiAzME0KKwkjIEZhaWxzIC0gbm90IGVub3VnaCBzcGFjZSBmb3IgNE0gZnMKKwlub3QgZnNhZG0gLXkgLS1sdnJlc2l6ZSByZXNpemUgIiRkZXZfdmdfbHYiIDRNCisJbHZyZXNpemUgLUwrMTBNIC1yICR2Z19sdgorCWx2cmVkdWNlIC1MMTBNIC1yICR2Z19sdgorCisJZnNjaGVja19leHQzCisJbW91bnQgIiRkZXZfdmdfbHYiICIkbW91bnRfZGlyIgorCW5vdCBmc2FkbSAteSAtLWx2cmVzaXplIHJlc2l6ZSAkdmdfbHYgNE0KKwllY2hvIG4gfCBub3QgbHZyZXNpemUgLUw0TSAtciAtbiAkdmdfbHYKKwlsdnJlc2l6ZSAtTCsyME0gLXIgLW4gJHZnX2x2CisJdW1vdW50ICIkbW91bnRfZGlyIgorCWZzY2hlY2tfZXh0MworCisJbHZyZXNpemUgLWYgLUwyME0gJHZnX2x2CitmaQorCitpZiBjaGVja19taXNzaW5nIGV4dDM7IHRoZW4KKwlta2ZzLmV4dDMgLWI0MDk2IC1qICIkZGV2X3ZnX2x2IgorCW1rZnMuZXh0MyAtYjQwOTYgLWogIiRkZXZfdmdfbHYyIgorCisJZnNhZG0gLS1sdnJlc2l6ZSByZXNpemUgJHZnX2x2IDMwTQorCSMgRmFpbHMgLSBub3QgZW5vdWdoIHNwYWNlIGZvciA0TSBmcworCW5vdCBmc2FkbSAteSAtLWx2cmVzaXplIHJlc2l6ZSAiJGRldl92Z19sdiIgNE0KKwlsdnJlc2l6ZSAtTCsxME0gLXIgJHZnX2x2CisJbHZyZWR1Y2UgLUwxME0gLXIgJHZnX2x2CisKKwlmc2NoZWNrX2V4dDMKKwltb3VudCAiJGRldl92Z19sdiIgIiRtb3VudF9kaXIiCisJbHZyZXNpemUgLUwrMTBNIC1yICR2Z19sdgorCW1vdW50ICIkZGV2X3ZnX2x2MiIgIiRtb3VudF9zcGFjZV9kaXIiCisJZnNhZG0gLS1sdnJlc2l6ZSAtZSAteSByZXNpemUgJHZnX2x2MiAyNU0KKworCW5vdCBmc2FkbSAteSAtLWx2cmVzaXplIHJlc2l6ZSAkdmdfbHYgNE0KKwllY2hvIG4gfCBub3QgbHZyZXNpemUgLUw0TSAtciAtbiAkdmdfbHYKKwlsdnJlc2l6ZSAtTCsyME0gLXIgLW4gJHZnX2x2CisJdW1vdW50ICIkbW91bnRfZGlyIgorCXVtb3VudCAiJG1vdW50X3NwYWNlX2RpciIKKwlmc2NoZWNrX2V4dDMKKworCWx2cmVzaXplIC1mIC1MMjBNICR2Z19sdgorZmkKKworaWYgY2hlY2tfbWlzc2luZyB4ZnM7IHRoZW4KKwlta2ZzLnhmcyAtbCBpbnRlcm5hbCxzaXplPTEwMDBiIC1mICIkZGV2X3ZnX2x2IgorCisJZnNhZG0gLS1sdnJlc2l6ZSByZXNpemUgJHZnX2x2IDMwTQorCSMgRmFpbHMgLSBub3QgZW5vdWdoIHNwYWNlIGZvciA0TSBmcworCWx2cmVzaXplIC1MKzEwTSAtciAkdmdfbHYKKwlub3QgbHZyZWR1Y2UgLUwxME0gLXIgJHZnX2x2CisKKwlmc2NoZWNrX3hmcworCW1vdW50ICIkZGV2X3ZnX2x2IiAiJG1vdW50X2RpciIKKwlsdnJlc2l6ZSAtTCsxME0gLXIgLW4gJHZnX2x2CisJdW1vdW50ICIkbW91bnRfZGlyIgorCWZzY2hlY2tfeGZzCisKKwlsdnJlc2l6ZSAtZiAtTDIwTSAkdmdfbHYKK2ZpCisKK2lmIGNoZWNrX21pc3NpbmcgcmVpc2VyZnM7IHRoZW4KKwlta2ZzLnJlaXNlcmZzIC1zIDUxMyAtZiAiJGRldl92Z19sdiIKKworCWZzYWRtIC0tbHZyZXNpemUgcmVzaXplICR2Z19sdiAzME0KKwlsdnJlc2l6ZSAtTCsxME0gLXIgJHZnX2x2CisJZnNhZG0gLS1sdnJlc2l6ZSAteSByZXNpemUgJHZnX2x2IDEwTQorCisJZnNjaGVja19yZWlzZXJmcworCW1vdW50ICIkZGV2X3ZnX2x2IiAiJG1vdW50X2RpciIKKworCWZzYWRtIC15IC0tbHZyZXNpemUgcmVzaXplICR2Z19sdiAzME0KKwl1bW91bnQgIiRtb3VudF9kaXIiCisJZnNjaGVja19yZWlzZXJmcworCisJbHZyZXNpemUgLWYgLUwyME0gJHZnX2x2CitmaQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2luY29uc2lzdGVudC1tZXRhZGF0YS5zaCBiL3Rlc3Qvc2hlbGwvaW5jb25zaXN0ZW50LW1ldGFkYXRhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODYxNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2luY29uc2lzdGVudC1tZXRhZGF0YS5zaApAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDMgMTIKKworbHZjcmVhdGUgLWF5ZSAtLXR5cGUgbWlycm9yIC1tIDEgLWwgMSAtbiBtaXJyb3IgJHZnCitsdmNyZWF0ZSAtbCAxIC1uIHJlc2l6ZWQgJHZnCitsdmNoYW5nZSAtYSBuICR2Zy9taXJyb3IKKworYXV4IGJhY2t1cF9kZXYgJChjYXQgREVWSUNFUykKKworaW5pdCgpIHsKKwlhdXggcmVzdG9yZV9kZXYgJChjYXQgREVWSUNFUykKKwlub3QgY2hlY2sgbHZfZmllbGQgJHZnL3Jlc2l6ZWQgbHZfc2l6ZSAiOC4wMG0iCisJbHZyZXNpemUgLUwgODE5MksgJHZnL3Jlc2l6ZWQKKwlhdXggcmVzdG9yZV9kZXYgIiRkZXYxIgorfQorCisjIHZnc2NhbiBmaXhlcyB1cCBtZXRhZGF0YSAobmVlZHMgLS1jYWNoZSBvcHRpb24gZm9yIGRpcmVjdCBzY2FuIGlmIGx2bWV0YWQgaXMgdXNlZCkKK3Rlc3QgLWUgTE9DQUxfTFZNRVRBRCAmJiBjYWNoZT0iLS1jYWNoZSIKK2luaXQKK3Znc2NhbiAkY2FjaGUgMj4mMSB8IHRlZSBjbWQub3V0CitncmVwICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICR2ZyIgY21kLm91dAordGVzdCAtZSBMT0NBTF9MVk1FVEFEICYmIHZncmVuYW1lICR2ZyBmb28gJiYgdmdyZW5hbWUgZm9vICR2ZyAjIHRyaWdnZXIgYSB3cml0ZQordmdzY2FuICRjYWNoZSAyPiYxIHwgdGVlIGNtZC5vdXQKK25vdCBncmVwICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICR2ZyIgY21kLm91dAorY2hlY2sgbHZfZmllbGQgJHZnL3Jlc2l6ZWQgbHZfc2l6ZSAiOC4wMG0iCisKKyMgb25seSB2Z3NjYW4gd291bGQgaGF2ZSBub3RpY2VkIG1ldGFkYXRhIGluY29uc2lzdGVuY2llcyB3aGVuIGx2bWV0YWQgaXMgYWN0aXZlCitpZiB0ZXN0ICEgLWUgTE9DQUxfTFZNRVRBRDsgdGhlbgorCSMgdmdkaXNwbGF5IGZpeGVzCisJaW5pdAorCXZnZGlzcGxheSAkdmcgMj4mMSB8IHRlZSBjbWQub3V0CisJZ3JlcCAiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAkdmciIGNtZC5vdXQKKwl2Z2Rpc3BsYXkgJHZnIDI+JjEgfCB0ZWUgY21kLm91dAorCW5vdCBncmVwICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICR2ZyIgY21kLm91dAorCWNoZWNrIGx2X2ZpZWxkICR2Zy9yZXNpemVkIGx2X3NpemUgIjguMDBtIgorCisJIyBsdnMgZml4ZXMgdXAKKwlpbml0CisJbHZzICR2ZyAyPiYxIHwgdGVlIGNtZC5vdXQKKwlncmVwICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICR2ZyIgY21kLm91dAorCXZnZGlzcGxheSAkdmcgMj4mMSB8IHRlZSBjbWQub3V0CisJbm90IGdyZXAgIkluY29uc2lzdGVudCBtZXRhZGF0YSBmb3VuZCBmb3IgVkcgJHZnIiBjbWQub3V0CisJY2hlY2sgbHZfZmllbGQgJHZnL3Jlc2l6ZWQgbHZfc2l6ZSAiOC4wMG0iCisKKwkjIHZncyBmaXhlcyB1cCBhcyB3ZWxsCisJaW5pdAorCXZncyAkdmcgMj4mMSB8IHRlZSBjbWQub3V0CisJZ3JlcCAiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAkdmciIGNtZC5vdXQKKwl2Z3MgJHZnIDI+JjEgfCB0ZWUgY21kLm91dAorCW5vdCBncmVwICJJbmNvbnNpc3RlbnQgbWV0YWRhdGEgZm91bmQgZm9yIFZHICR2ZyIgY21kLm91dAorCWNoZWNrIGx2X2ZpZWxkICR2Zy9yZXNpemVkIGx2X3NpemUgIjguMDBtIgorZmkKKworZWNobyBDaGVjayBhdXRvLXJlcGFpciBvZiBmYWlsZWQgdmdleHRlbmQgLSBtZXRhZGF0YSB3cml0dGVuIHRvIG9yaWdpbmFsIHB2IGJ1dCBub3QgbmV3IHB2Cit2Z3JlbW92ZSAtZiAkdmcKK3B2cmVtb3ZlIC1mZiAkKGNhdCBERVZJQ0VTKQorcHZjcmVhdGUgJChjYXQgREVWSUNFUykKK2F1eCBiYWNrdXBfZGV2ICIkZGV2MiIKK3ZnY3JlYXRlICR2ZyAiJGRldjEiCit2Z2V4dGVuZCAkdmcgIiRkZXYyIgorYXV4IHJlc3RvcmVfZGV2ICIkZGV2MiIKK3Znc2NhbiAkY2FjaGUKK3Nob3VsZCBjaGVjayBjb21wYXJlX2ZpZWxkcyB2Z3MgJHZnIHZnX21kYV9jb3VudCBwdnMgIiRkZXYyIiB2Z19tZGFfY291bnQKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9saXN0aW5ncy5zaCBiL3Rlc3Qvc2hlbGwvbGlzdGluZ3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZWUxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbGlzdGluZ3Muc2gKQEAgLTAsMCArMSwyMjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMKKyMgdGVzdHMgZnVuY3Rpb25hbGl0eSBvZiBsdnMsIHB2cywgdmdzLCAqZGlzcGxheSB0b29scworIworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyA1CitnZXRfZGV2cworCisjIENoZWNrIHRoZXJlIGlzIG5vIFBWCitwdnNjYW4gfCB0ZWUgb3V0CitncmVwICJObyBtYXRjaGluZyIgb3V0CisKK3B2Y3JlYXRlIC0tdXVpZCBCQURCRUUtQkFBRC1CQUFELUJBQUQtQkFBRC1CQUFELUJBREJFRSAtLW5vcmVzdG9yZWZpbGUgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MiIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjMiCitwdmNyZWF0ZSAiJGRldjQiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXY1IgorCisjQ09NTSBiejE5NTI3NiAtLSBwdnMgZG9lc24ndCBzaG93IFBWcyB1bnRpbCBhIFZHIGlzIGNyZWF0ZWQKK3B2cyAtLW5vaGVhZGluZ3MgIiR7REVWSUNFU1tAXX0iCit0ZXN0ICQocHZzIC0tbm9oZWFkaW5ncyAiJHtERVZJQ0VTW0BdfSIgfCB3YyAtbCkgLWVxIDUKK3B2ZGlzcGxheQorCisjQ09NTSBwdnMgd2l0aCBzZWdtZW50IGF0dHJpYnV0ZXMgd29ya3MgZXZlbiBmb3Igb3JwaGFucwordGVzdCAkKHB2cyAtLW5vaGVhZGluZ3MgLW8gc2VnX2FsbCxwdl9hbGwsbHZfYWxsLHZnX2FsbCAiJHtERVZJQ0VTW0BdfSIgfCB3YyAtbCkgLWVxIDUKKwordmdjcmVhdGUgJHZnICIke0RFVklDRVNbQF19IgorCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X3V1aWQgQkFEQkVFLUJBQUQtQkFBRC1CQUFELUJBQUQtQkFBRC1CQURCRUUKKworI0NPTU0gcHZzIGFuZCB2Z3MgcmVwb3J0IG1kYV9jb3VudCwgbWRhX2ZyZWUgKGJ6MjAyODg2LCBiejI0NzQ0NCkKK3B2cyAtbyArcHZfbWRhX2NvdW50LHB2X21kYV9mcmVlICIke0RFVklDRVNbQF19IgorZm9yIEkgaW4gIiRkZXYyIiAiJGRldjMiICIkZGV2NSI7IGRvCisJY2hlY2sgcHZfZmllbGQgIiRJIiBwdl9tZGFfY291bnQgMAorCWNoZWNrIHB2X2ZpZWxkICIkSSIgcHZfbWRhX2ZyZWUgMAorZG9uZQordmdzIC1vICt2Z19tZGFfY291bnQsdmdfbWRhX2ZyZWUgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50IDIKKworI0NPTU0gcHZzIGRvZXNuJ3QgZGlzcGxheSAtLW1ldGFkYXRhY29waWVzIDAgUFZzIGFzIG9ycGhhbnMgKGJ6NDA5MDYxKQorcHZkaXNwbGF5ICIkZGV2MiJ8Z3JlcCAiVkcgTmFtZS4qJHZnIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZworCisjQ09NTSBsdnMgZGlzcGxheXMgc25hcHNob3RzIChiejE3MTIxNSkKK2x2Y3JlYXRlIC1hZXkgLWw0IC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtbDQgLXMgLW4gJGx2MiAkdmcvJGx2MQordGVzdCAkKGx2cyAtLW5vaGVhZGluZ3MgJHZnIHwgd2MgLWwpIC1lcSAyCisjIHNob3VsZCBsdnMgLWEgZGlzcGxheSBjb3cgJiYgcmVhbCBkZXZpY2VzPyAoaXQgZG9lc24ndCkKK3Rlc3QgJChsdnMgLWEgLS1ub2hlYWRpbmdzICR2ZyB8IHdjIC1sKSAgLWVxIDIKK2Rtc2V0dXAgbHMgfCBncmVwICIkUFJFRklYIiB8IGdyZXAgLXYgIkxWTVRFU1QuKnB2LiIKK2x2cmVtb3ZlIC1mICR2Zy8kbHYyCisKKyNDT01NIGx2cyAtYSBkaXNwbGF5cyBtaXJyb3IgbGVncyBhbmQgbG9nCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMiAtbiAkbHYzICR2ZwordGVzdCAkKGx2cyAtLW5vaGVhZGluZ3MgJHZnIHwgd2MgLWwpIC1lcSAyCit0ZXN0ICQobHZzIC1hIC0tbm9oZWFkaW5ncyAkdmcgfCB3YyAtbCkgLWVxIDYKK2Rtc2V0dXAgbHMgfCBncmVwICIkUFJFRklYIiB8IGdyZXAgLXYgIkxWTVRFU1QuKnB2LiIKKworIyBDaGVjayB3ZSBwYXJzZSAvZGV2L21hcHBlci92Zy1sdgorbHZkaXNwbGF5ICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjMiCisjIENoZWNrIHdlIHBhcnNlIC9kZXYvdmcvbHYKK2x2ZGlzcGxheSAiJERNX0RFVl9ESVIvJHZnLyRsdjMiCisKK2x2Y3JlYXRlIC1sMiAtcyAkdmcvJGx2MworbHZjcmVhdGUgLWwxIC1zIC1uIGludmFsICR2Zy8kbHYzCitsdmNyZWF0ZSAtbDQgLUk0IC1pMiAtbiBzdHJpcGUgJHZnCisjIEludmFsaWRhdGUgc25hcHNob3QKK25vdCBkZCBpZj0vZGV2L3plcm8gb2Y9IiRETV9ERVZfRElSLyR2Zy9pbnZhbCIgYnM9NEsKK2ludmFsaWQgbHZzY2FuICIkZGV2MSIKK2x2ZGlzcGxheSAtLW1hcHMKK2x2c2NhbiAtLWFsbAorCisjQ09NTSB2Z3Mgd2l0aCBvcHRpb25zIGZyb20gcHZzIHN0aWxsIHRyZWF0cyBhcmd1bWVudHMgYXMgVkdzIChiejE5MzU0MykKK3ZncyAtbyBwdl9uYW1lLHZnX25hbWUgJHZnCisjIHdvdWxkIGNvbXBsYWluIGlmIG5vdAordmdzIC1vIGFsbCAkdmcKKworI0NPTU0gcHZkaXNwbGF5IC0tbWFwcyBmZWF0dXJlIChiejE0OTgxNCkKK3B2ZGlzcGxheSAiJHtERVZJQ0VTW0BdfSIgPm91dAorcHZkaXNwbGF5IC0tbWFwcyAiJHtERVZJQ0VTW0BdfSIgPm91dDIKK25vdCBkaWZmIG91dCBvdXQyCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitwdnMgLW8gK3B2X3V1aWQgfCBncmVwIEJBREJFRS1CQUFELUJBQUQtQkFBRC1CQUFELUJBQUQtQkFEQkVFCithdXggZW5hYmxlX2RldiAiJGRldjEiCisKK3B2c2NhbiAtLXV1aWQKK3B2c2NhbiAtZQorcHZzY2FuIC1zCitwdnNjYW4gLS1ub3ZvbHVtZWdyb3VwCit2Z3NjYW4gLS1ta25vZGVzCit2Z21rbm9kZXMgLS1yZWZyZXNoCitsdnNjYW4KK2x2bWRpc2tzY2FuCisKK2ludmFsaWQgcHZzY2FuICIkZGV2MSIKK2ludmFsaWQgcHZzY2FuIC1hYXkKK2ludmFsaWQgcHZzY2FuIC0tbWFqb3IgMjU0CitpbnZhbGlkIHB2c2NhbiAtLW1pbm9yIDAKK2ludmFsaWQgcHZzY2FuIC0tbm92b2x1bWVncm91cCAtZQoraW52YWxpZCB2Z3NjYW4gJHZnCitpbnZhbGlkIGx2c2NhbiAkdmcKKworaWYgYXV4IGhhdmVfcmVhZGxpbmU7IHRoZW4KK2NhdCA8PEVPRiB8IGx2bQordmdkaXNwbGF5IC0tdW5pdHMgayAkdmcKK3ZnZGlzcGxheSAtYyAkdmcKK3ZnZGlzcGxheSAtQyAkdmcKK3ZnZGlzcGxheSAtcyAkdmcKK3ZnZGlzcGxheSAtdiAkdmcKK2x2ZGlzcGxheSAtYyAkdmcKK2x2ZGlzcGxheSAtQyAkdmcKK2x2ZGlzcGxheSAtbSAkdmcKK2x2ZGlzcGxheSAtLXVuaXRzIGcgJHZnCitFT0YKK2Vsc2UKK3B2ZGlzcGxheSAtYyAiJGRldjEiCitwdmRpc3BsYXkgLXMgIiRkZXYxIgordmdkaXNwbGF5IC0tdW5pdHMgayAkdmcKK3ZnZGlzcGxheSAtYyAkdmcKK3ZnZGlzcGxheSAtQyAkdmcKK3ZnZGlzcGxheSAtcyAkdmcKK3ZnZGlzcGxheSAtdiAkdmcKK2x2ZGlzcGxheSAtYyAkdmcKK2x2ZGlzcGxheSAtQyAkdmcKK2x2ZGlzcGxheSAtbSAkdmcKK2x2ZGlzcGxheSAtLXVuaXRzIGcgJHZnCitmaQorCitwdmRpc3BsYXkgLWMgIiRkZXYxIgorcHZkaXNwbGF5IC1zICIkZGV2MSIKKworZm9yIGkgaW4gaCBiIHMgayBtIGcgdCBwIGUgSCBCIFMgSyBNIEcgVCBQIEU7IGRvCisJcHZkaXNwbGF5IC0tdW5pdHMgJGkgIiRkZXYxIgorZG9uZQorCitpbnZhbGlkIGx2ZGlzcGxheSAtQyAtbSAkdmcKK2ludmFsaWQgbHZkaXNwbGF5IC1jIC1tICR2ZworaW52YWxpZCBsdmRpc3BsYXkgLS1hbGlnbmVkICR2ZworaW52YWxpZCBsdmRpc3BsYXkgLS1ub2hlYWRpbmdzICR2ZworaW52YWxpZCBsdmRpc3BsYXkgLS1vcHRpb25zIGx2X25hbWUgJHZnCitpbnZhbGlkIGx2ZGlzcGxheSAtLXNlcGFyYXRvciA6ICR2ZworaW52YWxpZCBsdmRpc3BsYXkgLS1zb3J0IHNpemUgJHZnCitpbnZhbGlkIGx2ZGlzcGxheSAtLXVuYnVmZmVyZWQgJHZnCisKK2ludmFsaWQgdmdkaXNwbGF5IC1DIC1BCitpbnZhbGlkIHZnZGlzcGxheSAtQyAtYworaW52YWxpZCB2Z2Rpc3BsYXkgLUMgLXMKK2ludmFsaWQgdmdkaXNwbGF5IC1jIC1zCitpbnZhbGlkIHZnZGlzcGxheSAtLWFsaWduZWQKK2ludmFsaWQgdmdkaXNwbGF5IC0tbm9oZWFkaW5ncworaW52YWxpZCB2Z2Rpc3BsYXkgLS1vcHRpb25zCitpbnZhbGlkIHZnZGlzcGxheSAtLXNlcGFyYXRvciA6CitpbnZhbGlkIHZnZGlzcGxheSAtLXNvcnQgc2l6ZQoraW52YWxpZCB2Z2Rpc3BsYXkgLS11bmJ1ZmZlcmVkCitpbnZhbGlkIHZnZGlzcGxheSAtQSAkdmcxCisKK2ludmFsaWQgcHZkaXNwbGF5IC1DIC1BCitpbnZhbGlkIHB2ZGlzcGxheSAtQyAtYworaW52YWxpZCBwdmRpc3BsYXkgLUMgLW0KK2ludmFsaWQgcHZkaXNwbGF5IC1DIC1zCitpbnZhbGlkIHB2ZGlzcGxheSAtYyAtbQoraW52YWxpZCBwdmRpc3BsYXkgLWMgLXMKK2ludmFsaWQgcHZkaXNwbGF5IC0tYWxpZ25lZAoraW52YWxpZCBwdmRpc3BsYXkgLS1hbGwKK2ludmFsaWQgcHZkaXNwbGF5IC0tbm9oZWFkaW5ncworaW52YWxpZCBwdmRpc3BsYXkgLS1vcHRpb25zCitpbnZhbGlkIHB2ZGlzcGxheSAtLXNlcGFyYXRvciA6CitpbnZhbGlkIHB2ZGlzcGxheSAtLXNvcnQgc2l6ZQoraW52YWxpZCBwdmRpc3BsYXkgLS11bmJ1ZmZlcmVkCitpbnZhbGlkIHB2ZGlzcGxheSAtQSAkdmcxCisKKyMgQ2hlY2sgZXhwb3J0ZWQgVkcgbGlzdGluZwordmdjaGFuZ2UgLWFuICR2ZwordmdleHBvcnQgLWEKK3B2c2NhbgorcHZkaXNwbGF5IC0tbm9oZWFkaW5ncyAtQyAtbyBhdHRyLG5hbWUgfCB0ZWUgb3V0Citub3QgZ3JlcCAtdiAiYXgtIiBvdXQKK3ZnaW1wb3J0IC1hCitwdmRpc3BsYXkgLS1ub2hlYWRpbmdzIC1DIC1vIGF0dHIsbmFtZSB8IHRlZSBvdXQKK2dyZXAgLXYgImF4LSIgb3V0CisKK3ZncmVtb3ZlIC1mZiAkdmcKKworI3Rlc3QgdmdkaXNwbGF5IC1BIHRvIHNlbGVjdCBvbmx5IGFjdGl2ZSBWR3MKKyMgYWxsIExWcyBhY3RpdmUgLSBWRyBjb25zaWRlcmVkIGFjdGl2ZQorcHZjcmVhdGUgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwordmdjcmVhdGUgJHZnMSAiJGRldjEiCitsdmNyZWF0ZSAtbDEgJHZnMQorbHZjcmVhdGUgLWwxICR2ZzEKKworIyBhdCBsZWFzdCBvbmUgTFYgYWN0aXZlIC0gVkcgY29uc2lkZXJlZCBhY3RpdmUKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIgorbHZjcmVhdGUgLWwxICR2ZzIKK2x2Y3JlYXRlIC1sMSAtYW4gLVpuICR2ZzIKKworIyBubyBMVnMgYWN0aXZlIC0gVkcgY29uc2lkZXJlZCBpbmFjdGl2ZQordmdjcmVhdGUgJHZnMyAiJGRldjMiCitsdmNyZWF0ZSAtbDEgLWFuIC1abiAkdmczCitsdmNyZWF0ZSAtbDEgLWFuIC1abiAkdmczCisKK3ZnZGlzcGxheSAtcyAtQSB8IGdyZXAgJHZnMQordmdkaXNwbGF5IC1zIC1BIHwgZ3JlcCAkdmcyCit2Z2Rpc3BsYXkgLXMgLUEgfCBub3QgZ3JlcCAkdmczCisKK3ZncmVtb3ZlIC1mICR2ZzEgJHZnMiAkdmczCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2xvY2stYmxvY2tpbmcuc2ggYi90ZXN0L3NoZWxsL2xvY2stYmxvY2tpbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExNGQyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbG9jay1ibG9ja2luZy5zaApAQCAtMCwwICsxLDQ1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBzb21lIGJsb2NraW5nIC8gbm9uLWJsb2NraW5nIG11bHRpLXZnIG9wZXJhdGlvbnMnCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMworcHZjcmVhdGUgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiCisKKyMgaWYgd2FpdF9mb3JfbG9ja3Mgc2V0LCB2Z3JlbW92ZSBzaG91bGQgd2FpdCBmb3Igb3JwaGFuIGxvY2sKKyMgZmxvY2sgcHJvY2VzcyBzaG91bGQgaGF2ZSBleGl0ZWQgYnkgdGhlIHRpbWUgZmlyc3QgdmdyZW1vdmUgY29tcGxldGVzCitmbG9jayAtdyA1ICRURVNURElSL3Zhci9sb2NrL2x2bS9QX29ycGhhbnMgc2xlZXAgMTAgJgord2hpbGUgISB0ZXN0IC1mICRURVNURElSL3Zhci9sb2NrL2x2bS9QX29ycGhhbnMgOyBkbyBzbGVlcCAuMSA7IGRvbmUKKwordmdyZW1vdmUgLS1jb25maWcgJ2dsb2JhbCB7IHdhaXRfZm9yX2xvY2tzID0gMSB9JyAkdmcKK25vdCB2Z3JlbW92ZSAtLWNvbmZpZyAnZ2xvYmFsIHsgd2FpdF9mb3JfbG9ja3MgPSAxIH0nICR2ZworCit0ZXN0ICEgLWYgJFRFU1RESVIvdmFyL2xvY2svbHZtL1Bfb3JwaGFucworCisjIGlmIHdhaXRfZm9yX2xvY2tzIG5vdCBzZXQsIHZncmVtb3ZlIHNob3VsZCBmYWlsIG9uIG5vbi1ibG9ja2luZyBsb2NrCisjIHdlIG11c3Qgd2FpdCBmb3IgZmxvY2sgcHJvY2VzcyBhdCB0aGUgZW5kIC0gdmdyZW1vdmUgd29uJ3Qgd2FpdAordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIgorZmxvY2sgLXcgNSAkVEVTVERJUi92YXIvbG9jay9sdm0vUF9vcnBoYW5zIHNsZWVwIDEwICYKKword2hpbGUgISB0ZXN0IC1mICRURVNURElSL3Zhci9sb2NrL2x2bS9QX29ycGhhbnMgOyBkbyBzbGVlcCAuMSA7IGRvbmUKK2Zsb2NrX3BpZD1gam9icyAtcGAKKworbm90IHZncmVtb3ZlIC0tY29uZmlnICdnbG9iYWwgeyB3YWl0X2Zvcl9sb2NrcyA9IDAgfScgJHZnCit0ZXN0IC1mICRURVNURElSL3Zhci9sb2NrL2x2bS9QX29ycGhhbnMgIyBzdGlsbCBydW5uaW5nCitraWxsICRmbG9ja19waWQKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sb2NrLXBhcmFsbGVsLnNoIGIvdGVzdC9zaGVsbC9sb2NrLXBhcmFsbGVsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGIzNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2xvY2stcGFyYWxsZWwuc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0IHBhcmFsbGVsIHVzZSBvZiBsdm0gY29tbWFuZHMgYW5kIGNoZWNrIGxvY2tzIGFyZW4ndCBkcm9wcGVkCisjIFJIQlo6IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTA0OTI5NgorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKword2hpY2ggbWtmcy5leHQzIHx8IHNraXAKK3doaWNoIGZzY2sgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZworCitsdmNyZWF0ZSAtTDEwIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtbDEgLW4gJGx2MiAkdmcKK21rZnMuZXh0MyAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCisKKyMgU2xvd2Rvd24gUFYgZm9yIHJlc2l6ZWQgTFYKK2F1eCBkZWxheV9kZXYgIiRkZXYxIiA1MCA1MCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MSIpOgorCitsdnJlc2l6ZSAtTC01IC1yICR2Zy8kbHYxICYKKworIyBMZXQncyB3YWl0IHRpbGwgcmVzaXplIHN0YXJ0cworZm9yIGkgaW4gJChzZXEgMSAzMDApOyBkbworICAgICAgICBwZ3JlcCBmc2NrICYmIGJyZWFrCisgICAgICAgIHNsZWVwIC4xCitkb25lCisKK2x2cmVtb3ZlIC1mICR2Zy8kbHYyCisKK3dhaXQKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCisjIENoZWNrIHJlbW92ZWQgJGx2MiBkb2VzIG5vdCByZWFwcGVhcgorbm90IGNoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2xvc2V0dXBfcGFydHNjYW4uc2ggYi90ZXN0L3NoZWxsL2xvc2V0dXBfcGFydHNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmYWZjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbG9zZXR1cF9wYXJ0c2Nhbi5zaApAQCAtMCwwICsxLDYzIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIENoZWNrIGhvdyBsdm0yIGhhbmRsZXMgcGFydGl0aW9ucyBvdmVyIGxvc2V0dXAgLVAgZGV2aWNlcworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKword2hpY2ggc2ZkaXNrIHx8IHNraXAKKworYXV4IHByZXBhcmVfbG9vcCAxMDAwIC1QIHx8IHNraXAKKwordGVzdCAtZiBMT09QCitMT09QPSQoPCBMT09QKQorCitlY2hvICIxIDIiIHwgc2ZkaXNrICRMT09QCisKKyMgd2FpdCBmb3IgbGlua3MKK2F1eCB1ZGV2X3dhaXQKKworIyBsb3NldHVwIC1QIHNob3VsZCBwcm92aWRlIHBhcnRpdGlvbgorbHMgLWxhICIke0xPT1B9IioKK3Rlc3QgLWUgIiR7TE9PUH1wMSIKKworYXV4IGV4dGVuZF9maWx0ZXIgImF8JExPT1B8IgorCisjIGNyZWF0aW9uIHNob3VsZCBmYWlsIGZvciAncGFydGl0aW9uZWQnIGxvb3AgZGV2aWNlCitub3QgcHZjcmVhdGUgLXkgJExPT1AKK25vdCB2Z2NyZWF0ZSB2ZyAkTE9PUAorCithdXggdGVhcmRvd25fZGV2cworCithdXggcHJlcGFyZV9sb29wIDEwMDAgfHwgc2tpcAorCit0ZXN0IC1mIExPT1AKK0xPT1A9JCg8IExPT1ApCisKKworZWNobyAiMSAyIiB8IHNmZGlzayAkTE9PUAorCisjIHdhaXQgZm9yIGxpbmtzCithdXggdWRldl93YWl0CisKKyMgbm8gcGFydGl0aW9uZSBzaG91bGQgYmUgYWN0dWFsbHkgdGhlcmUKK2xzIC1sYSAiJHtMT09QfSIqCit0ZXN0ICEgLWUgIiR7TE9PUH1wMSIKKworYXV4IGV4dGVuZF9maWx0ZXIgImF8JExPT1B8IgorCisjIGNyZWF0aW9uIHNob3VsZCBwYXNzIGZvciAnbm9uLXBhcnRpdGlvbmVkJyBsb29wIGRldmljZQorcHZjcmVhdGUgLXkgJExPT1AKKwordmdjcmVhdGUgdmcgJExPT1AKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHYtYW5jZXN0cnkuc2ggYi90ZXN0L3NoZWxsL2x2LWFuY2VzdHJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGNjNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2LWFuY2VzdHJ5LnNoCkBAIC0wLDAgKzEsMjI4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKK2F1eCBwcmVwYXJlX3B2cyAxIDE2CisKK2F1eCBsdm1jb25mICJtZXRhZGF0YS9yZWNvcmRfbHZzX2hpc3Rvcnk9MSIKKwordmdjcmVhdGUgJHZnIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCitsdmNyZWF0ZSAtbDEwMCVGUkVFIC1UICR7dmd9L3Bvb2wKKworIyBUaGluIHNuYXAgY2hhaW4gd2l0aCAyIGJyYW5jaGVzIHN0YXJ0aW5nIGF0IGx2My4KKyMKKyMgbHYxIC0tPiBsdjIgLS0+IGx2MyAtLT4gbHY0IC0tPiBsdjUKKyMgICAgICAgICAgICAgICAgICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICAtLT4gbHY2IC0tPiBsdjcKKworbHZjcmVhdGUgLVYxIC1UICR7dmd9L3Bvb2wgLW4gbHYxCitsdmNyZWF0ZSAtcyAke3ZnfS9sdjEgLW4gbHYyCitsdmNyZWF0ZSAtcyAke3ZnfS9sdjIgLW4gbHYzCitsdmNyZWF0ZSAtcyAke3ZnfS9sdjMgLW4gbHY0CitsdmNyZWF0ZSAtcyAke3ZnfS9sdjQgLW4gbHY1CitsdmNyZWF0ZSAtcyAke3ZnfS9sdjMgLW4gbHY2CitsdmNyZWF0ZSAtcyAke3ZnfS9sdjYgLW4gbHY3CisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9hbmNlc3RvcnMgIiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9kZXNjZW5kYW50cyAibHYyLGx2MyxsdjQsbHY1LGx2NixsdjciCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjIgZnVsbF9hbmNlc3RvcnMgImx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjIgZnVsbF9kZXNjZW5kYW50cyAibHYzLGx2NCxsdjUsbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2MyBmdWxsX2FuY2VzdG9ycyAibHYyLGx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjMgZnVsbF9kZXNjZW5kYW50cyAibHY0LGx2NSxsdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY0IGZ1bGxfYW5jZXN0b3JzICJsdjMsbHYyLGx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjQgZnVsbF9kZXNjZW5kYW50cyAibHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfYW5jZXN0b3JzICJsdjQsbHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NiBmdWxsX2FuY2VzdG9ycyAibHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY2IGZ1bGxfZGVzY2VuZGFudHMgImx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2FuY2VzdG9ycyAibHY2LGx2MyxsdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2Rlc2NlbmRhbnRzICIiCisKKworIyBsdjEgLS0+IGx2MiAtLT4gbHYzIC0tPiAtbHY0IC0tPiBsdjUKKyMgICAgICAgICAgICAgICAgICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICAtLT4gIGx2NiAtLT4gbHY3CitsdnJlbW92ZSAtZmYgJHt2Z30vbHY0CisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9hbmNlc3RvcnMgIiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9kZXNjZW5kYW50cyAibHYyLGx2MyxsdjYsbHY3LC1sdjQsbHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHYyIGZ1bGxfYW5jZXN0b3JzICJsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHYyIGZ1bGxfZGVzY2VuZGFudHMgImx2MyxsdjYsbHY3LC1sdjQsbHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHYzIGZ1bGxfYW5jZXN0b3JzICJsdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2MyBmdWxsX2Rlc2NlbmRhbnRzICJsdjYsbHY3LC1sdjQsbHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2FuY2VzdG9ycyAibHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2Rlc2NlbmRhbnRzICJsdjUiCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjUgZnVsbF9hbmNlc3RvcnMgIi1sdjQsbHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NiBmdWxsX2FuY2VzdG9ycyAibHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY2IGZ1bGxfZGVzY2VuZGFudHMgImx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2FuY2VzdG9ycyAibHY2LGx2MyxsdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2Rlc2NlbmRhbnRzICIiCisKKworIyBsdjEgLS0+IGx2MiAtLT4gLWx2MyAtLT4gLWx2NCAtLT4gbHY1CisjICAgICAgICAgICAgICAgICAgICAgXAorIyAgICAgICAgICAgICAgICAgICAgICAtLT4gIGx2NiAtLT4gbHY3CitsdnJlbW92ZSAtZmYgJHt2Z30vbHYzCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9hbmNlc3RvcnMgIiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9kZXNjZW5kYW50cyAibHYyLC1sdjMsLWx2NCxsdjUsbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2MiBmdWxsX2FuY2VzdG9ycyAibHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2MiBmdWxsX2Rlc2NlbmRhbnRzICItbHYzLC1sdjQsbHY1LGx2NixsdjciCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHYzIGZ1bGxfYW5jZXN0b3JzICJsdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjMgZnVsbF9kZXNjZW5kYW50cyAiLWx2NCxsdjUsbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjQgZnVsbF9hbmNlc3RvcnMgIi1sdjMsbHYyLGx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHY0IGZ1bGxfZGVzY2VuZGFudHMgImx2NSIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NSBmdWxsX2FuY2VzdG9ycyAiLWx2NCwtbHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NiBmdWxsX2FuY2VzdG9ycyAiLWx2MyxsdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NiBmdWxsX2Rlc2NlbmRhbnRzICJsdjciCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjcgZnVsbF9hbmNlc3RvcnMgImx2NiwtbHYzLGx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY3IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworIyBsdjEgLS0+IC1sdjIgLS0+IC1sdjMgLS0+IC1sdjQgLS0+IGx2NQorIyAgICAgICAgICAgICAgICAgICAgICBcCisjICAgICAgICAgICAgICAgICAgICAgICAtLT4gIGx2NiAtLT4gbHY3CitsdnJlbW92ZSAtZmYgJHZnL2x2MgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHYxIGZ1bGxfYW5jZXN0b3JzICIiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHYxIGZ1bGxfZGVzY2VuZGFudHMgIi1sdjIsLWx2MywtbHY0LGx2NSxsdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MiBmdWxsX2FuY2VzdG9ycyAibHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjIgZnVsbF9kZXNjZW5kYW50cyAiLWx2MywtbHY0LGx2NSxsdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MyBmdWxsX2FuY2VzdG9ycyAiLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MyBmdWxsX2Rlc2NlbmRhbnRzICItbHY0LGx2NSxsdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2FuY2VzdG9ycyAiLWx2MywtbHYyLGx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHY0IGZ1bGxfZGVzY2VuZGFudHMgImx2NSIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NSBmdWxsX2FuY2VzdG9ycyAiLWx2NCwtbHYzLC1sdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NSBmdWxsX2Rlc2NlbmRhbnRzICIiCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjYgZnVsbF9hbmNlc3RvcnMgIi1sdjMsLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY2IGZ1bGxfZGVzY2VuZGFudHMgImx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2FuY2VzdG9ycyAibHY2LC1sdjMsLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY3IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworIyBsdjEgLS0+IC1sdjIgLS0+IC1sdjMgLS0+IC1sdjQgLS0+IGx2NQorIyAgICAgICAgICAgICAgICAgICAgICBcCisjICAgICAgICAgICAgICAgICAgICAgICAtLT4gLWx2NiAtLT4gbHY3CitsdnJlbW92ZSAtZmYgJHt2Z30vbHY2CisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9hbmNlc3RvcnMgIiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9kZXNjZW5kYW50cyAiLWx2MiwtbHYzLC1sdjQsbHY1LC1sdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MiBmdWxsX2FuY2VzdG9ycyAibHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjIgZnVsbF9kZXNjZW5kYW50cyAiLWx2MywtbHY0LGx2NSwtbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjMgZnVsbF9hbmNlc3RvcnMgIi1sdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjMgZnVsbF9kZXNjZW5kYW50cyAiLWx2NCxsdjUsLWx2NixsdjciCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHY0IGZ1bGxfYW5jZXN0b3JzICItbHYzLC1sdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjQgZnVsbF9kZXNjZW5kYW50cyAibHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfYW5jZXN0b3JzICItbHY0LC1sdjMsLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjYgZnVsbF9hbmNlc3RvcnMgIi1sdjMsLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NiBmdWxsX2Rlc2NlbmRhbnRzICJsdjciCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjcgZnVsbF9hbmNlc3RvcnMgIi1sdjYsLWx2MywtbHYyLGx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjcgZnVsbF9kZXNjZW5kYW50cyAiIgorCisjIGx2MSAtLT4gLWx2MiAtLS0tLS0tLS0tLT4gLWx2NCAtLT4gbHY1CisjICAgICAgICAgICAgICAgICAgICAgIFwKKyMgICAgICAgICAgICAgICAgICAgICAgIC0tPiAtbHY2IC0tPiBsdjcKK2x2cmVtb3ZlIC1mZiAke3ZnfS8tbHYzCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9hbmNlc3RvcnMgIiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjEgZnVsbF9kZXNjZW5kYW50cyAiLWx2MiwtbHY0LGx2NSwtbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjIgZnVsbF9hbmNlc3RvcnMgImx2MSIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHYyIGZ1bGxfZGVzY2VuZGFudHMgIi1sdjQsbHY1LC1sdjYsbHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2FuY2VzdG9ycyAiLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2Rlc2NlbmRhbnRzICJsdjUiCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjUgZnVsbF9hbmNlc3RvcnMgIi1sdjQsLWx2MixsdjEiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjYgZnVsbF9hbmNlc3RvcnMgIi1sdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjYgZnVsbF9kZXNjZW5kYW50cyAibHY3IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY3IGZ1bGxfYW5jZXN0b3JzICItbHY2LC1sdjIsbHYxIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2Rlc2NlbmRhbnRzICIiCisKKyMgIC1sdjIgLS0tLS0tLS0tLS0+IC1sdjQgLS0+IGx2NQorIyAgICAgICAgICAgICAgIFwKKyMgICAgICAgICAgICAgICAgLS0+IC1sdjYgLS0+IGx2NworCitsdnJlbW92ZSAtLW5vaGlzdG9yeSAtZmYgJHt2Z30vbHYxCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHYyIGZ1bGxfYW5jZXN0b3JzICIiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MiBmdWxsX2Rlc2NlbmRhbnRzICItbHY0LGx2NSwtbHY2LGx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjQgZnVsbF9hbmNlc3RvcnMgIi1sdjIiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NCBmdWxsX2Rlc2NlbmRhbnRzICJsdjUiCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjUgZnVsbF9hbmNlc3RvcnMgIi1sdjQsLWx2MiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS9sdjUgZnVsbF9kZXNjZW5kYW50cyAiIgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2NiBmdWxsX2FuY2VzdG9ycyAiLWx2MiIKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHY2IGZ1bGxfZGVzY2VuZGFudHMgImx2NyIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2FuY2VzdG9ycyAiLWx2NiwtbHYyIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2Rlc2NlbmRhbnRzICIiCisKKyMgIC1sdjIgLS0tLS0tLS0tLS0+IC1sdjQgLS0+IGx2NQorIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHY3CitsdnJlbW92ZSAtLW5vaGlzdG9yeSAtZmYgJHt2Z30vLWx2NgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vLWx2MiBmdWxsX2FuY2VzdG9ycyAiIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjIgZnVsbF9kZXNjZW5kYW50cyAiLWx2NCxsdjUiCisKK2NoZWNrIGx2aF9maWVsZCAke3ZnfS8tbHY0IGZ1bGxfYW5jZXN0b3JzICItbHYyIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9Ly1sdjQgZnVsbF9kZXNjZW5kYW50cyAibHY1IgorCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfYW5jZXN0b3JzICItbHY0LC1sdjIiCitjaGVjayBsdmhfZmllbGQgJHt2Z30vbHY1IGZ1bGxfZGVzY2VuZGFudHMgIiIKKworY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2FuY2VzdG9ycyAiIgorY2hlY2sgbHZoX2ZpZWxkICR7dmd9L2x2NyBmdWxsX2Rlc2NlbmRhbnRzICIiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtY2FjaGUtbW9kZS5zaCBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtY2FjaGUtbW9kZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDcwMzRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1jYWNoZS1tb2RlLnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIEV4ZXJjaXNlIGNoYW5naW5nIG9mIGNhY2hpbmcgbW9kZSBvbiBib3RoIGNhY2hlIHBvb2wgYW5kIGNhY2hlZCBMVi4KKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX2NhY2hlIDEgNSAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgMgorCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtTDE4IC1uIGNwb29sICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtSCAtTDE0IC1uICRsdjEgLS1jYWNoZW1vZGUgd3JpdGViYWNrIC0tY2FjaGVzZXR0aW5ncyBtaWdyYXRpb25fdGhyZXNob2xkPTIwNDgwMCAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wgJHZnICIkZGV2MiIKKworI2NhdCAiJERNX0RFVl9ESVIvJHZnLyRsdjEiICA+L2Rldi9udWxsCisjYXV4IGRlbGF5X2RldiAiJGRldjIiICAzMDAgMTAwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MiIpOgorCisjZG1zZXR1cCBzdGF0dXMgJHZnLSRsdjEKKyNkbXNldHVwIHRhYmxlICR2Zy0kbHYxCisKK2ZvciBpIGluICQoc2VxIDEgMTApIDsgZG8gCitlY2hvIDMgPi9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcworZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi8kdmcvJGx2MSIgYnM9NjRLIGNvdW50PTIwIGNvbnY9ZmRhdGFzeW5jIHx8IHRydWUKK2VjaG8gMyA+L3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzCitkZCBpZj0iJERNX0RFVl9ESVIvJHZnLyRsdjEiIG9mPS9kZXYvbnVsbCBicz02NEsgY291bnQ9MjAgfHwgdHJ1ZQorZG9uZQorCitsdnMgLW8rY2FjaGVfZGlydHlfYmxvY2tzLGNhY2hlX3JlYWRfaGl0cyxjYWNoZV9yZWFkX21pc3NlcyxjYWNoZV93cml0ZV9oaXRzLGNhY2hlX3dyaXRlX21pc3NlcyAkdmcvJGx2MQorCit2Z2NmZ2JhY2t1cCAtZiAvdG1wL29vbyAkdmcKKworCisjCisjIERyb3AgbGF0ZXIsIGNvZGUgbG9hZGluZyBkbSB0YWJsZXMgZGlyZWN0bHkgd2l0aG91dCBsdm0KKyMgUkhCWiAxMzM3NTg4CisjCisjZG1zZXR1cCB0YWJsZQorI2VjaG8gIlNUQVRVUyBiZWZvcmUgY2xlYW5lciIKKyNkbXNldHVwIHN0YXR1cworI2Rtc2V0dXAgbG9hZCAtLXRhYmxlICIwIDI4NjcyIGNhY2hlIDI1Mzo0IDI1MzozIDI1Mzo1IDEyOCAxIHdyaXRldGhyb3VnaCBjbGVhbmVyIDAiICR2Zy0kbHYxCisjZG1zZXR1cCByZXN1bWUgJHZnLSRsdjEKKyNzbGVlcCAxCisjZG1zZXR1cCB0YWJsZQorI2VjaG8gIlNUQVRVUyBhZnRlciBjbGVhbmVyIDFzZWMiCisjZG1zZXR1cCBzdGF0dXMgLS1ub2ZsdXNoCisjZG1zZXR1cCBzdXNwZW5kIC0tbm9mbHVzaCAkdmctJGx2MQorI2Rtc2V0dXAgcmVzdW1lICR2Zy0kbHYxCisKKyNkbXNldHVwIGxvYWQgLS10YWJsZSAiMCAyODY3MiBjYWNoZSAyNTM6NCAyNTM6MyAyNTM6NSAxMjggMSBwYXNzdGhyb3VnaCBzbXEgMiBtaWdyYXRpb25fdGhyZXNob2xkIDIwNDgwMCIgJHZnLSRsdjEKKyNkbXNldHVwIHN0YXR1cyAkdmctJGx2MQorI2Rtc2V0dXAgbG9hZCAtLXRhYmxlICIwIDI4NjcyIGNhY2hlIDI1Mzo0IDI1MzozIDI1Mzo1IDEyOCAxIHdyaXRldGhyb3VnaCBzbXEgMiBtaWdyYXRpb25fdGhyZXNob2xkIDIwNDgwMCIgJHZnLSRsdjEKKyNkbXNldHVwIHJlc3VtZSAkdmctJGx2MQorI2Rtc2V0dXAgc3RhdHVzICR2Zy0kbHYxCisjZG1zZXR1cCB0YWJsZSAgJHZnLSRsdjEKKyNkbXNldHVwIGxzIC0tdHJlZQorI2V4aXQKKworY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgY2FjaGVfbW9kZSAid3JpdGViYWNrIgorbHZjaGFuZ2UgLS1jYWNoZW1vZGUgcGFzc3Rocm91Z2ggJHZnLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICAkdmcvJGx2MSBjYWNoZV9tb2RlICJwYXNzdGhyb3VnaCIKK2x2Y2hhbmdlIC0tY2FjaGVtb2RlIHdyaXRldGhyb3VnaCAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgICR2Zy8kbHYxIGNhY2hlX21vZGUgIndyaXRldGhyb3VnaCIKK2x2Y2hhbmdlIC0tY2FjaGVtb2RlIHdyaXRlYmFjayAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgICR2Zy8kbHYxIGNhY2hlX21vZGUgIndyaXRlYmFjayIKKworbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSAkdmcvJGx2MQorCitsdnMgLWEgJHZnCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy9jcG9vbCBjYWNoZV9tb2RlICJ3cml0ZWJhY2siCitsdmNoYW5nZSAtLWNhY2hlbW9kZSBwYXNzdGhyb3VnaCAkdmcvY3Bvb2wKK2NoZWNrIGx2X2ZpZWxkICAkdmcvY3Bvb2wgY2FjaGVfbW9kZSAicGFzc3Rocm91Z2giCitsdmNoYW5nZSAtLWNhY2hlbW9kZSB3cml0ZXRocm91Z2ggJHZnL2Nwb29sCitjaGVjayBsdl9maWVsZCAgJHZnL2Nwb29sIGNhY2hlX21vZGUgIndyaXRldGhyb3VnaCIKK2x2Y2hhbmdlIC0tY2FjaGVtb2RlIHdyaXRlYmFjayAkdmcvY3Bvb2wKK2NoZWNrIGx2X2ZpZWxkICAkdmcvY3Bvb2wgY2FjaGVfbW9kZSAid3JpdGViYWNrIgorCitsdnMgLWEgJHZnCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNoYW5nZS1jYWNoZS1vbGQuc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLWNhY2hlLW9sZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThkMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1jYWNoZS1vbGQuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgRXhlcmNpc2UgdXNhZ2Ugb2Ygb2xkZXIgbWV0YWRhdGEgd2hpY2ggYXJlIG1pc3Npbmcgc29tZSBuZXcgc2V0dGluZ3MKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX2NhY2hlIDEgMyAwIHx8IHNraXAKKworIyBGSVhNRTogcGFyYWxsZWwgY2FjaGUgbWV0YWRhdGEgYWxsb2NhdG9yIGlzIGNyYXNoaW5nIHdoZW4gdXNlZCB2YWx1ZSA4MDAwIQorYXV4IHByZXBhcmVfdmcgNSA4MAorCisKK2x2Y3JlYXRlIC1sIDEwIC0tdHlwZSBjYWNoZS1wb29sICR2Zy9jcG9vbAorbHZjcmVhdGUgLWwgMjAgLUggLW4gJGx2MSAkdmcvY3Bvb2wKKwordmdjZmdiYWNrdXAgLWYgYmFja3VwICR2ZworCisjIGNoZWNrIG1ldGFkYXRhIHdpdGhvdXQgY2FjaGUgcG9saWN5CitsdmNoYW5nZSAtYW4gJHZnCitncmVwIC12ICJwb2xpY3kgPSIgYmFja3VwID5iYWNrdXBfMQordmdjZmdyZXN0b3JlIC1mIGJhY2t1cF8xICR2ZworbHZjaGFuZ2UgLWF5ICR2ZworCisjIGNoZWNrIG1ldGFkYXRhIHdpdGhvdXQgY2FjaGUgbW9kZQorbHZjaGFuZ2UgLWFuICR2ZworZ3JlcCAtdiAiY2FjaGVfbW9kZSA9IiBiYWNrdXAgPmJhY2t1cF8yCit2Z2NmZ3Jlc3RvcmUgLWYgYmFja3VwXzIgJHZnCitsdmNoYW5nZSAtYXkgJHZnCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtY2FjaGUuc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLWNhY2hlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWZjZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLWNhY2hlLnNoCkBAIC0wLDAgKzEsOTUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9jYWNoZSAxIDMgMCB8fCBza2lwCithdXggcHJlcGFyZV92ZyAzCisKK2F1eCBsdm1jb25mICdnbG9iYWwvY2FjaGVfZGlzYWJsZWRfZmVhdHVyZXMgPSBbICJwb2xpY3lfc21xIiBdJworCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtYW4gLXYgLUwgMiAtbiBjcG9vbCAkdmcKK2x2Y3JlYXRlIC1IIC1MIDQgLW4gY29yaWdpbiAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wKK2x2Y3JlYXRlIC1uIG5vbmNhY2hlIC1sIDEgJHZnCisKKyMgY2Fubm90IGNoYW5nZSBtYWpvciBtaW5vciBmb3IgcG9vbHMKK25vdCBsdmNoYW5nZSAtLXllcyAtTSB5IC0tbWlub3IgMjM1IC0tbWFqb3IgMjUzICR2Zy9jcG9vbAorbm90IGx2Y2hhbmdlIC1NIG4gJHZnL2Nwb29sCisKK25vdCBsdmNoYW5nZSAtLWNhY2hlcG9saWN5IG1xICR2Zy9ub25jYWNoZQorbm90IGx2Y2hhbmdlIC0tY2FjaGVzZXR0aW5ncyBmb289YmFyICR2Zy9ub25jYWNoZQorCitsdmNoYW5nZSAtLWNhY2hlcG9saWN5IGNsZWFuZXIgJHZnL2NvcmlnaW4KK2NoZWNrIGx2X2ZpZWxkICAkdmcvY29yaWdpbiBrZXJuZWxfY2FjaGVfcG9saWN5ICJjbGVhbmVyIgorCisjIFNraXAgdGhlc2UgdGVzdCBvbiBvbGRlciBjYWNoZSBkcml2ZXIgYXMgaXQgc2hvd3MgZXJyb3JzIHdpdGggdGhlc2UgbHZjaGFuZ2VzCisjIGRldmljZS1tYXBwZXI6IHNwYWNlIG1hcCBjb21tb246IGluZGV4X2NoZWNrIGZhaWxlZDogYmxvY2tuciAxNzE3OTg2OTIxNiAhPSB3YW50ZWQgMTEKK2lmIGF1eCBoYXZlX2NhY2hlIDEgNSAwIDsgdGhlbgorCitsdmNoYW5nZSAtLWNhY2hlcG9saWN5IG1xIC0tY2FjaGVzZXR0aW5ncyBtaWdyYXRpb25fdGhyZXNob2xkPTMzMyAkdmcvY29yaWdpbgorCisjIFRPRE8gb25jZSBtcS0+c21xIGhhcHBlbnMgd2Ugd2lsbCBnZXQgaGVyZSBzb21lIDAgZm9yIG1xIHNldHRpbmdzCitjaGVjayBsdl9maWVsZCAkdmcvY29yaWdpbiBrZXJuZWxfY2FjaGVfcG9saWN5ICJtcSIKK2dldCBsdl9maWVsZCAkdmcvY29yaWdpbiBrZXJuZWxfY2FjaGVfc2V0dGluZ3MgfCBncmVwICdtaWdyYXRpb25fdGhyZXNob2xkPTMzMycKKworbHZjaGFuZ2UgLS1yZWZyZXNoICR2Zy9jb3JpZ2luCitnZXQgbHZfZmllbGQgJHZnL2NvcmlnaW4ga2VybmVsX2NhY2hlX3NldHRpbmdzIHwgZ3JlcCAnbWlncmF0aW9uX3RocmVzaG9sZD0zMzMnCitsdmNoYW5nZSAtYW4gJHZnCitsdmNoYW5nZSAtYXkgJHZnCitnZXQgbHZfZmllbGQgJHZnL2NvcmlnaW4ga2VybmVsX2NhY2hlX3NldHRpbmdzIHwgZ3JlcCAnbWlncmF0aW9uX3RocmVzaG9sZD0zMzMnCisKK2x2Y2hhbmdlIC0tY2FjaGVzZXR0aW5ncyAnbWlncmF0aW9uX3RocmVzaG9sZCA9IDIzMyBzZXF1ZW50aWFsX3RocmVzaG9sZCA9IDEzJyAkdmcvY29yaWdpbgorZ2V0IGx2X2ZpZWxkICR2Zy9jb3JpZ2luIGtlcm5lbF9jYWNoZV9zZXR0aW5ncyB8IHRlZSBvdXQKK2dyZXAgJ21pZ3JhdGlvbl90aHJlc2hvbGQ9MjMzJyBvdXQKKworaWYgZ3JlcCAnc2VxdWVudGlhbF90aHJlc2hvbGQ9MTMnIG91dCA7IHRoZW4KKworbHZjaGFuZ2UgLS1jYWNoZXNldHRpbmdzICdtaWdyYXRpb25fdGhyZXNob2xkID0gMTcnICR2Zy9jb3JpZ2luCitnZXQgbHZfZmllbGQgJHZnL2NvcmlnaW4ga2VybmVsX2NhY2hlX3NldHRpbmdzIHwgdGVlIG91dAorZ3JlcCAnbWlncmF0aW9uX3RocmVzaG9sZD0xNycgb3V0CitncmVwICdzZXF1ZW50aWFsX3RocmVzaG9sZD0xMycgb3V0CisKK2x2Y2hhbmdlIC0tY2FjaGVzZXR0aW5ncyAnbWlncmF0aW9uX3RocmVzaG9sZCA9IGRlZmF1bHQnICR2Zy9jb3JpZ2luCitnZXQgbHZfZmllbGQgJHZnL2NvcmlnaW4ga2VybmVsX2NhY2hlX3NldHRpbmdzIHwgdGVlIG91dAorZ3JlcCAnbWlncmF0aW9uX3RocmVzaG9sZD0yMDQ4JyBvdXQKK2dyZXAgJ3NlcXVlbnRpYWxfdGhyZXNob2xkPTEzJyBvdXQKKworbHZjaGFuZ2UgLS1jYWNoZXNldHRpbmdzICdtaWdyYXRpb25fdGhyZXNob2xkID0gMjMzIHNlcXVlbnRpYWxfdGhyZXNob2xkID0gMTMgcmFuZG9tX3RocmVzaG9sZCA9IDEnICR2Zy9jb3JpZ2luCitsdmNoYW5nZSAtLWNhY2hlc2V0dGluZ3MgJ3JhbmRvbV90aHJlc2hvbGQgPSBkZWZhdWx0IG1pZ3JhdGlvbl90aHJlc2hvbGQgPSBkZWZhdWx0JyAkdmcvY29yaWdpbgorZ2V0IGx2X2ZpZWxkICR2Zy9jb3JpZ2luIGtlcm5lbF9jYWNoZV9zZXR0aW5ncyB8IHRlZSBvdXQKK2dyZXAgJ21pZ3JhdGlvbl90aHJlc2hvbGQ9MjA0OCcgb3V0CitncmVwICdzZXF1ZW50aWFsX3RocmVzaG9sZD0xMycgb3V0CitncmVwICdyYW5kb21fdGhyZXNob2xkPTQnIG91dAorCitsdmNoYW5nZSAtLWNhY2hlc2V0dGluZ3MgbWlncmF0aW9uX3RocmVzaG9sZD0yMzMgLS1jYWNoZXNldHRpbmdzIHNlcXVlbnRpYWxfdGhyZXNob2xkPTEzIC0tY2FjaGVzZXR0aW5ncyByYW5kb21fdGhyZXNob2xkPTEgJHZnL2NvcmlnaW4KK2dldCBsdl9maWVsZCAkdmcvY29yaWdpbiBrZXJuZWxfY2FjaGVfc2V0dGluZ3MgfCB0ZWUgb3V0CitncmVwICdtaWdyYXRpb25fdGhyZXNob2xkPTIzMycgb3V0CitncmVwICdzZXF1ZW50aWFsX3RocmVzaG9sZD0xMycgb3V0CitncmVwICdyYW5kb21fdGhyZXNob2xkPTEnIG91dAorCitsdmNoYW5nZSAtLWNhY2hlc2V0dGluZ3MgcmFuZG9tX3RocmVzaG9sZD1kZWZhdWx0IC0tY2FjaGVzZXR0aW5ncyBtaWdyYXRpb25fdGhyZXNob2xkPWRlZmF1bHQgJHZnL2NvcmlnaW4KK2dldCBsdl9maWVsZCAkdmcvY29yaWdpbiBrZXJuZWxfY2FjaGVfc2V0dGluZ3MgfCB0ZWUgb3V0CitncmVwICdtaWdyYXRpb25fdGhyZXNob2xkPTIwNDgnIG91dAorZ3JlcCAnc2VxdWVudGlhbF90aHJlc2hvbGQ9MTMnIG91dAorZ3JlcCAncmFuZG9tX3RocmVzaG9sZD00JyBvdXQKKworZWxzZQorIyBXaGVuIE1RIGlzIGVtdWxhdGVkIGJ5IFNNUSBwb2xpY3kgaXQgZG9lcyBub3QgaG9sZCBzZXR0aW5ncy4KKyMgU28ganVzdCBza2lwIHRlc3Rpbmcgb2YgcGFyYW0gY2hhbmdlcyB3aGVuIHNlcXVlbnRpYWxfdGhyZXNob2xkPTAKK2dyZXAgJ3NlcXVlbnRpYWxfdGhyZXNob2xkPTAnIG91dAorZmkKKworZmkgICMgaGF2ZV9jYWNoZSAxIDUgMAorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtbWlycm9yLnNoIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1taXJyb3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NWYwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtbWlycm9yLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIEZJWE1FIFJFU1lOQyBkb2Vzbid0IHdvcmsgaW4gY2x1c3RlciB3aXRoIGV4Y2x1c2l2ZSBhY3RpdmF0aW9uCisjIHNlcmlvdXNseSBicm9rZW4hCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RtZXZlbnRkCithdXggcHJlcGFyZV92ZyAzCisKKyMgZm9yY2UgcmVzeW5jIDItd2F5IGFjdGl2ZSBtaXJyb3IKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiOjAtMQorY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKK2x2Y2hhbmdlIC15IC0tcmVzeW5jICR2Zy8kbHYxCitjaGVjayBtaXJyb3IgJHZnICRsdjEgIiRkZXYzIgorbHZyZW1vdmUgLWZmICR2ZworCisjIGZvcmNlIHJlc3luYyAyLXdheSBpbmFjdGl2ZSBtaXJyb3IKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiOjAtMQorbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCitjaGVjayBtaXJyb3IgJHZnICRsdjEgIiRkZXYzIgorbHZjaGFuZ2UgLS1yZXN5bmMgJHZnLyRsdjEKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtcGFydGlhbC1yYWlkMTAuc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXBhcnRpYWwtcmFpZDEwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTEyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXBhcnRpYWwtcmFpZDEwLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9yYWlkIDEgMyAyIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgNAorCisjIHJoYnogODg5MzU4CisjIFNob3VsZCBiZSBhYmxlIHRvIGFjdGl2YXRlIHdoZW4gUkFJRDEwCisjIGhhcyBmYWlsZWQgZGV2cyBpbiBkaWZmZXJlbnQgbWlycm9yIHNldHMuCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tIDEgLWkgMiAtbCAyIC1uICRsdjEgJHZnCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIiAiJGRldjMiCitsdmNoYW5nZSAtYXkgJHZnLyRsdjEgLS1wYXJ0aWFsCitsdmNoYW5nZSAtYW4gJHZnLyRsdjEKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y2hhbmdlLXBhcnRpYWwuc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXBhcnRpYWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlZGUyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtcGFydGlhbC5zaApAQCAtMCwwICsxLDczIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNAorCitUWVBFPXJhaWQxCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IFRZUEU9bWlycm9yCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlICRUWVBFIC1tIDEgLWwgMiAtbiAkbHYxICR2ZworbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorCisjCisjIFRlc3QgZm9yIGFsbG93YWJsZSBtZXRhZGF0YSBjaGFuZ2VzCisjCisjIGNvbnRpZ3VvdXNfQVJHCitsdmNoYW5nZSAtQyB5ICR2Zy8kbHYxCitsdmNoYW5nZSAtQyBuICR2Zy8kbHYxCisKKyMgcGVybWlzc2lvbl9BUkcKK2x2Y2hhbmdlIC1wIHIgJHZnLyRsdjEKK2x2Y2hhbmdlIC1wIHJ3ICR2Zy8kbHYxCisKKyMgcmVhZGFoZWFkX0FSRworbHZjaGFuZ2UgLXIgbm9uZSAkdmcvJGx2MQorbHZjaGFuZ2UgLXIgYXV0byAkdmcvJGx2MQorCisjIHBlcnNpc3RlbnRfQVJHCitsdmNoYW5nZSAtTSB5IC0tbWlub3IgNTYgLS1tYWpvciAyNTMgJHZnLyRsdjEKK2x2Y2hhbmdlIC1NIG4gJHZnLyRsdjEKKworIyBhZGR0YWdfQVJHCisjIGRlbHRhZ19BUkcKK2x2Y2hhbmdlIC0tYWRkdGFnIGZvbyAkdmcvJGx2MQorbHZjaGFuZ2UgLS1kZWx0YWcgZm9vICR2Zy8kbHYxCisKKyMKKyMgVGVzdCBmb3IgZGlzYWxsb3dlZCBtZXRhZGF0YSBjaGFuZ2VzCisjCisjIHJlc3luY19BUkcKK25vdCBsdmNoYW5nZSAtLXJlc3luYyAkdmcvJGx2MQorCisjIGFsbG9jX0FSRworbm90IGx2Y2hhbmdlIC0tYWxsb2MgYW55d2hlcmUgJHZnLyRsdjEKKworIyBkaXNjYXJkc19BUkcKK25vdCBsdmNoYW5nZSAtLWRpc2NhcmRzIGlnbm9yZSAkdmcvJGx2MQorCisjIHplcm9fQVJHCitub3QgbHZjaGFuZ2UgLS16ZXJvIHkgJHZnLyRsdjEKKworIworIyBFbnN1cmUgdGhhdCBhbGxvd2VkIGFyZ3MgZG9uJ3QgY2F1c2UgZGlzYWxsb3dlZCBhcmdzIHRvIGdldCB0aHJvdWdoCisjCitub3QgbHZjaGFuZ2UgLS1yZXN5bmMgLWF5ICR2Zy8kbHYxCitub3QgbHZjaGFuZ2UgLS1yZXN5bmMgLS1hZGR0YWcgZm9vICR2Zy8kbHYxCisKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNoYW5nZS1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1yYWlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzg4NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXJhaWQuc2gKQEAgLTAsMCArMSwzMzggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBXcml0ZW1vc3RseSBoYXMgYmVlbiBpbiBldmVyeSB2ZXJzaW9uIHNpbmNlIHRoZSBiZWdpbmluZworIyBEZXZpY2UgcmVmcmVzaCBpbiAxLjUuMSB1cHN0cmVhbSBhbmQgMS4zLjQgPCB4IDwgMS40LjAgaW4gUkhFTDYKKyMgU3luYyBhY3Rpb24gICAgaW4gMS41LjAgdXBzdHJlYW0gYW5kIDEuMy4zIDwgeCA8IDEuNC4wIGluIFJIRUw2CisjIFByb3BlciBtaXNtYXRjaCBjb3VudCAxLjUuMiB1cHN0cmVhbSwxLjMuNSA8IHggPCAxLjQuMCBpbiBSSEVMNgorIworIyBXZSB3aWxsIHNpbXBsaWZ5IGFuZCBzaW1wbGUgdGVzdCBmb3IgMS41LjIgYW5kIDEuMy41IDwgeCA8IDEuNC4wCithdXggaGF2ZV9yYWlkIDEgMyA1ICYmCisgICEgYXV4IGhhdmVfcmFpZCAxIDQgMCB8fAorICBhdXggaGF2ZV9yYWlkIDEgNSAyIHx8IHNraXAKKworIyBERVZJQ0UgIiRkZXY2IiBpcyByZXNlcnZlZCBmb3Igbm9uLVJBSUQgTFZzIHRoYXQKKyMgd2lsbCBub3QgdW5kZXJnbyBmYWlsdXJlCithdXggcHJlcGFyZV92ZyA2CisKKyMgcnVuX3dyaXRlbW9zdGx5X2NoZWNrIDxWRz4gPExWPgorcnVuX3dyaXRlbW9zdGx5X2NoZWNrKCkgeworCWxvY2FsIHZnPSQxCisJbG9jYWwgbHY9JHsyfSR7VEhJTl9QT1NURklYfQorCWxvY2FsIHNlZ3R5cGU9CisJbG9jYWwgZDAKKwlsb2NhbCBkMQorCisJc2VndHlwZT0kKGdldCBsdl9maWVsZCAkdmcvJGx2IHNlZ3R5cGUgLWEpCisJZDA9JChnZXQgbHZfZGV2aWNlcyAkdmcvJHtsdn1fcmltYWdlXzApCisJZDE9JChnZXQgbHZfZGV2aWNlcyAkdmcvJHtsdn1fcmltYWdlXzEpCisKKwlwcmludGYgIiNcbiNcbiNcbiMgJXMvJXMgKCVzKTogcnVuX3dyaXRlbW9zdGx5X2NoZWNrXG4jXG4jXG4jXG4iIFwKKwkJJHZnICRsdiAkc2VndHlwZQorCisJIyBObyB3cml0ZW1vc3RseSBmbGFnIHNob3VsZCBiZSB0aGVyZSB5ZXQuCisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMCAiLSIKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8xICItIgorCisJaWYgWyAiJHNlZ3R5cGUiICE9ICJyYWlkMSIgXTsgdGhlbgorCQlub3QgbHZjaGFuZ2UgLS13cml0ZW1vc3RseSAkZDAgJHZnLyRsdgorCQlyZXR1cm4KKwlmaQorCisJIyBTZXQgdGhlIGZsYWcKKwlsdmNoYW5nZSAtLXdyaXRlbW9zdGx5ICRkMCAkdmcvJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMCAidyIKKworCSMgUnVubmluZyBhZ2FpbiBzaG91bGQgbGVhdmUgaXQgc2V0IChub3QgdG9nZ2xlKQorCWx2Y2hhbmdlIC0td3JpdGVtb3N0bHkgJGQwICR2Zy8kbHYKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICJ3IgorCisJIyBSdW5uaW5nIGFnYWluIHdpdGggJzp5JyBzaG91bGQgbGVhdmUgaXQgc2V0CisJbHZjaGFuZ2UgLS13cml0ZW1vc3RseSAkZDA6eSAkdmcvJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMCAidyIKKworCSMgJzpuJyBzaG91bGQgdW5zZXQgaXQKKwlsdmNoYW5nZSAtLXdyaXRlbW9zdGx5ICRkMDpuICR2Zy8kbHYKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICItIgorCisJIyAnOm4nIGFnYWluIHNob3VsZCBsZWF2ZSBpdCB1bnNldAorCWx2Y2hhbmdlIC0td3JpdGVtb3N0bHkgJGQwOm4gJHZnLyRsdgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzAgIi0iCisKKwkjICc6dCcgdG9nZ2xlIHRvIHNldAorCWx2Y2hhbmdlIC0td3JpdGVtb3N0bHkgJGQwOnQgJHZnLyRsdgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzAgInciCisKKwkjICc6dCcgdG9nZ2xlIHRvIHVuc2V0CisJbHZjaGFuZ2UgLS13cml0ZW1vc3RseSAkZDA6dCAkdmcvJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMCAiLSIKKworCSMgJzp5JyB0byBzZXQKKwlsdmNoYW5nZSAtLXdyaXRlbW9zdGx5ICRkMDp5ICR2Zy8kbHYKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICJ3IgorCisJIyBUb2dnbGUgYm90aCBhdCBvbmNlCisJbHZjaGFuZ2UgLS13cml0ZW1vc3RseSAkZDA6dCAtLXdyaXRlbW9zdGx5ICRkMTp0ICR2Zy8kbHYKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICItIgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzEgInciCisKKwkjIFRvZ2dsZSBib3RoIGF0IG9uY2UgYWdhaW4KKwlsdmNoYW5nZSAtLXdyaXRlbW9zdGx5ICRkMDp0IC0td3JpdGVtb3N0bHkgJGQxOnQgJHZnLyRsdgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzAgInciCisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMSAiLSIKKworCSMgVG9nZ2xlIG9uZSwgdW5zZXQgdGhlIG90aGVyCisJbHZjaGFuZ2UgLS13cml0ZW1vc3RseSAkZDA6biAtLXdyaXRlbW9zdGx5ICRkMTp0ICR2Zy8kbHYKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICItIgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzEgInciCisKKwkjIFRvZ2dsZSBvbmUsIHNldCB0aGUgb3RoZXIKKwlsdmNoYW5nZSAtLXdyaXRlbW9zdGx5ICRkMDp5IC0td3JpdGVtb3N0bHkgJGQxOnQgJHZnLyRsdgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzAgInciCisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMSAiLSIKKworCSMgUGFydGlhbCBmbGFnIHN1cGVyY2VkZXMgd3JpdGVtb3N0bHkgZmxhZworCWF1eCBkaXNhYmxlX2RldiAkZDAKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICJwIgorCisJIyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGtlcm5lbCB0byBkZXRlY3QgdGhlIGZhaWxlZCBkZXZpY2UgYmVmb3JlCisJIyB3ZSByZS1lbmFibGUgaXQuICBJZiBzbywgdGhlIGZpZWxkIHdpbGwgYmUgc2V0IHRvICdyJ2VmcmVzaCBzaW5jZQorCSMgdGhhdCBhbHNvIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAndydyaXRlbW9zdGx5LiAgSWYgdGhpcyBoYXMgaGFwcGVuZWQsCisJIyB3ZSByZWZyZXNoIHRoZSBMViBhbmQgdGhlbiBjaGVjayBmb3IgJ3cnLgorCWF1eCBlbmFibGVfZGV2ICRkMAorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzAgInIiICYmIGx2Y2hhbmdlIC0tcmVmcmVzaCAkdmcvJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8ke2x2fV9yaW1hZ2VfMCAidyIKKworCSMgQ2F0Y2ggQmFkIHdyaXRlYmVoaW5kIHZhbHVlcworCWludmFsaWQgbHZjaGFuZ2UgLS13cml0ZWJlaGluZCAiaW52YWxpZCIgJHZnLyRsdgorCWludmFsaWQgbHZjaGFuZ2UgLS13cml0ZWJlaGluZCAtMjU2ICR2Zy8kbHYKKworCSMgU2V0IHdyaXRlYmVoaW5kCisJY2hlY2sgbHZfZmllbGQgJHZnLyRsdiByYWlkX3dyaXRlX2JlaGluZCAiIgorCWx2Y2hhbmdlIC0td3JpdGViZWhpbmQgNTEyICR2Zy8kbHYKKwljaGVjayBsdl9maWVsZCAkdmcvJGx2IHJhaWRfd3JpdGVfYmVoaW5kICI1MTIiCisKKwkjIENvbnZlcnRpbmcgdG8gbGluZWFyIHNob3VsZCBjbGVhciBmbGFncyBhbmQgd3JpdGViZWhpbmQKKwlsdmNvbnZlcnQgLW0gMCAkdmcvJGx2ICRkMQorCWx2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAkdmcvJGx2ICRkMQorCWNoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmFpZF93cml0ZV9iZWhpbmQgIiIKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyR7bHZ9X3JpbWFnZV8wICItIgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJHtsdn1fcmltYWdlXzEgIi0iCit9CisKKyMgcnVuX3N5bmNhY3Rpb25fY2hlY2sgPFZHPiA8TFY+CitydW5fc3luY2FjdGlvbl9jaGVjaygpIHsKKwlsb2NhbCBkZXZpY2UKKwlsb2NhbCBzZWVrCisJbG9jYWwgc2l6ZQorCWxvY2FsIHRtcAorCWxvY2FsIHZnPSQxCisJbG9jYWwgbHY9JHsyfSR7VEhJTl9QT1NURklYfQorCisJcHJpbnRmICIjXG4jXG4jXG4jICVzLyVzICglcyk6IHJ1bl9zeW5jYWN0aW9uX2NoZWNrXG4jXG4jXG4jXG4iIFwKKwkJJHZnICRsdiAkKGdldCBsdl9maWVsZCAkdmcvJGx2IHNlZ3R5cGUgLWEpCisJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdgorCisJZGV2aWNlPSQoZ2V0IGx2X2RldmljZXMgJHZnLyR7bHZ9X3JpbWFnZV8xKQorCisJc2l6ZT0kKGdldCBsdl9maWVsZCAkdmcvJHtsdn1fcmltYWdlXzEgc2l6ZSAtYSAtLXVuaXRzIDFrKQorCXNpemU9JCgoJHtzaXplJVwuMDBrfSAvIDIpKQorCisJdG1wPSQoZ2V0IHB2X2ZpZWxkICIkZGV2aWNlIiBtZGFfc2l6ZSAtLXVuaXRzIDFrKQorCXNlZWs9JHt0bXAlXC4wMGt9ICMgSnVtcCBvdmVyIE1EQQorCisJdG1wPSQoZ2V0IGx2X2ZpZWxkICR2Zy8ke2x2fV9ybWV0YV8xIHNpemUgLWEgLS11bml0cyAxaykKKwlzZWVrPSQoKCRzZWVrICsgJHt0bXAlXC4wMGt9KSkgICMgSnVtcCBvdmVyIFJBSUQgbWV0YWRhdGEgaW1hZ2UKKworCXNlZWs9JCgoJHNlZWsgKyAkc2l6ZSkpICMgSnVtcCBoYWxmd2F5IHRocm91Z2ggdGhlIFJBSUQgaW1hZ2UKKworCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJGx2ICItIgorCWNoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmFpZF9taXNtYXRjaF9jb3VudCAiMCIKKworCSMgT3ZlcndyaXRlIHRoZSBsYXN0IGhhbGYgb2Ygb25lIG9mIHRoZSBQVnMgd2l0aCBjcmFwCisJZGQgaWY9L2Rldi91cmFuZG9tIG9mPSIkZGV2aWNlIiBicz0xayBjb3VudD0kc2l6ZSBzZWVrPSRzZWVrCisJc3luYworCisJIyAiY2hlY2siIHNob3VsZCBmaW5kIGRpc2NyZXBhbmNpZXMgYnV0IG5vdCBjaGFuZ2UgdGhlbQorCSMgJ2x2cycgc2hvdWxkIHNob3cgcmVzdWx0cworCWx2Y2hhbmdlIC0tc3luY2FjdGlvbiBjaGVjayAkdmcvJGx2CisJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdgorICAgICAgICAjIEZJWE1FOiB0aGlzIG5lZWRzIGtlcm5lbCBmaXggaW4gbWQtcmFpZAorICAgICAgICAjIGN1cnJlbnRseSBsZXQganVzdCB0aGlzIHRlc3QgdG8gY2F1c2UgJ3dhcm5pbmcnCisJaWYgISBnZXQgbHZfZmllbGQgJHZnLyRsdiBsdl9hdHRyIC1hIHwgZ3JlcCAnLiptLiQnOyB0aGVuCisJCWRtc2V0dXAgc3RhdHVzIHwgZ3JlcCAkdmcKKwkJIyBmYWxzZQorCWZpCisgICAgICAgICMgRklYTUU6IHdpdGggZml4ZWQga2VybmVsIHRoaXMgc2hvdWxkIG5vdCBmYWlsCisgICAgICAgICMgYWRkICd3cmFwcGVyJyBkZXRlY3Rpbmcga2VybmVsIGZvciB0aGlzCisJc2hvdWxkIG5vdCBjaGVjayBsdl9maWVsZCAkdmcvJGx2IHJhaWRfbWlzbWF0Y2hfY291bnQgIjAiCisKKwkjICJyZXBhaXIiIHdpbGwgZml4IGRpc2NyZXBhbmNpZXMKKwlsdmNoYW5nZSAtLXN5bmNhY3Rpb24gcmVwYWlyICR2Zy8kbHYKKwlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2CisKKwkjIEZpbmFsICJjaGVjayIgc2hvdWxkIHNob3cgbm8gbWlzbWF0Y2hlcworCSMgJ2x2cycgc2hvdWxkIHNob3cgcmVzdWx0cworCWx2Y2hhbmdlIC0tc3luY2FjdGlvbiBjaGVjayAkdmcvJGx2CisJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdgorCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJGx2ICItIgorCWNoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmFpZF9taXNtYXRjaF9jb3VudCAiMCIKK30KKworIyBydW5fcmVmcmVzaF9jaGVjayA8Vkc+IDxMVj4KKyMgICBBc3N1bWVzICIkZGV2MiIgaXMgaW4gdGhlIGFycmF5CitydW5fcmVmcmVzaF9jaGVjaygpIHsKKwlsb2NhbCBzaXplCisJbG9jYWwgc2l6ZWx2CisJbG9jYWwgdmc9JDEKKwlsb2NhbCBsdj0kezJ9JHtUSElOX1BPU1RGSVh9CisKKwlwcmludGYgIiNcbiNcbiNcbiMgJXMvJXMgKCVzKTogcnVuX3JlZnJlc2hfY2hlY2tcbiNcbiNcbiNcbiIgXAorCQkkdmcgJGx2ICQoZ2V0IGx2X2ZpZWxkICR2Zy8kbHYgc2VndHlwZSAtYSkKKworCWF1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYKKworCXNpemVsdj0kdmcvJGx2CisJdGVzdCAteiAiJFRISU5fUE9TVEZJWCIgfHwgc2l6ZWx2PSR2Zy90aGlubHYKKwlzaXplPSQoZ2V0IGx2X2ZpZWxkICRzaXplbHYgc2l6ZSAtLXVuaXRzIDFrKQorCXNpemU9JHtzaXplJVwuMDBrfQorCisJIyBEaXNhYmxlIGRldjIgYW5kIGRvIHNvbWUgSS9PIHRvIG1ha2UgdGhlIGtlcm5lbCBub3RpY2UKKwlhdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorCWRkIGlmPS9kZXYvdXJhbmRvbSBvZj0iJERNX0RFVl9ESVIvJHNpemVsdiIgYnM9MWsgY291bnQ9JHNpemUKKwlzeW5jCisKKwkjIENoZWNrIGZvciAncCdhcnRpYWwgZmxhZworCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJGx2ICJwIgorCWRtc2V0dXAgc3RhdHVzCisJbHZzIC1hIC1vIG5hbWUsYXR0cixkZXZpY2VzICR2ZworCisJYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorCisJZG1zZXR1cCBzdGF0dXMKKwlsdnMgLWEgLW8gbmFtZSxhdHRyLGRldmljZXMgJHZnCisKKwkjIENoZWNrIGZvciAncidlZnJlc2ggZmxhZworCWNoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJGx2ICJyIgorCisJbHZjaGFuZ2UgLS1yZWZyZXNoICR2Zy8kbHYKKwlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8kbHYgIi0iCisKKwkjIFdyaXRpbmcgcmFuZG9tIGRhdGEgYWJvdmUgc2hvdWxkIG1lYW4gdGhhdCB0aGUgZGV2aWNlcworCSMgd2VyZSBvdXQtb2Ytc3luYy4gIFRoZSByZWZyZXNoIHNob3VsZCBoYXZlIHRha2VuIGNhcmUKKwkjIG9mIHByb3Blcmx5IHJlaW50ZWdyYXRpbmcgdGhlIGRldmljZS4KKwlsdmNoYW5nZSAtLXN5bmNhY3Rpb24gcmVwYWlyICR2Zy8kbHYKKwlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2CisJY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8kbHYgIi0iCit9CisKKyMgcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2sgPFZHPiA8TFY+CisjICAgQXNzdW1lcyAiJGRldjIiIGlzIGluIHRoZSBhcnJheQorcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2soKSB7CisJbG9jYWwgdmc9JDEKKwlsb2NhbCBsdj0kezJ9JHtUSElOX1BPU1RGSVh9CisKKwlwcmludGYgIiNcbiNcbiNcbiMgJXMvJXMgKCVzKTogcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2tcbiNcbiNcbiNcbiIgXAorCQkgJHZnICRsdiAkKGdldCBsdl9maWVsZCAkdmcvJGx2IHNlZ3R5cGUgLWEpCisJbHZjaGFuZ2UgLS1taW5yZWNvdmVyeXJhdGUgNTAgJHZnLyRsdgorCWx2Y2hhbmdlIC0tbWF4cmVjb3ZlcnlyYXRlIDEwMCAkdmcvJGx2CisKKwljaGVjayBsdl9maWVsZCAkdmcvJGx2IHJhaWRfbWluX3JlY292ZXJ5X3JhdGUgIjUwIgorCWNoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmFpZF9tYXhfcmVjb3ZlcnlfcmF0ZSAiMTAwIgorfQorCisjIHJ1bl9jaGVja3MgPFZHPiA8TFY+IDwiLSJ8c25hcHNob3RfZGV2fCJ0aGlucG9vbF9kYXRhInwidGhpbnBvb2xfbWV0YSI+CitydW5fY2hlY2tzKCkgeworCVRISU5fUE9TVEZJWD0iIgorCisJaWYgWyAteiAkMyBdOyB0aGVuCisJCXByaW50ZiAiI1xuI1xuIyBydW5fY2hlY2tzOiBUb28gZmV3IGFyZ3VtZW50c1xuI1xuI1xuIgorCQlyZXR1cm4gMQorCWVsaWYgWyAnLScgPT0gJDMgXTsgdGhlbgorCQlwcmludGYgIiNcbiNcbiMgcnVuX2NoZWNrczogU2ltcGxlIGNoZWNrXG4jXG4jXG4iCisKKwkJcnVuX3dyaXRlbW9zdGx5X2NoZWNrICQxICQyCisJCXJ1bl9zeW5jYWN0aW9uX2NoZWNrICQxICQyCisJCXJ1bl9yZWZyZXNoX2NoZWNrICQxICQyCisJCXJ1bl9yZWNvdmVyeV9yYXRlX2NoZWNrICQxICQyCisJZWxpZiBbICd0aGlucG9vbF9kYXRhJyA9PSAkMyBdOyB0aGVuCisJCXByaW50ZiAiI1xuI1xuIyBydW5fY2hlY2tzOiBSQUlEIGFzIHRoaW5wb29sIGRhdGFcbiNcbiNcbiIKKworIyBIZXksIHNwZWNpZnlpbmcgZGV2aWNlcyBmb3IgdGhpbiBhbGxvY2F0aW9uIGRvZXNuJ3Qgd29yaworIwkJbHZjb252ZXJ0IC0tdGhpbnBvb2wgJDEvJDIgIiRkZXY2IgorCQlsdmNyZWF0ZSAtYWV5IC1MIDJNIC1uICR7Mn1fbWV0YSAkMSAiJGRldjYiCisJCWx2Y29udmVydCAtLXRoaW5wb29sICQxLyQyIC0tcG9vbG1ldGFkYXRhICR7Mn1fbWV0YQorCQlsdmNyZWF0ZSAtVCAkMS8kMiAtViAxIC1uIHRoaW5sdgorCQlUSElOX1BPU1RGSVg9Il90ZGF0YSIKKworCQlydW5fd3JpdGVtb3N0bHlfY2hlY2sgJDEgJDIKKwkJcnVuX3N5bmNhY3Rpb25fY2hlY2sgJDEgJDIKKwkJcnVuX3JlZnJlc2hfY2hlY2sgJDEgJDIKKwkJcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2sgJDEgJDIKKwllbGlmIFsgJ3RoaW5wb29sX21ldGEnID09ICQzIF07IHRoZW4KKwkJcHJpbnRmICIjXG4jXG4jIHJ1bl9jaGVja3M6IFJBSUQgYXMgdGhpbnBvb2wgbWV0YWRhdGFcbiNcbiNcbiIKKworCQlsdnJlbmFtZSAkMS8kMiAkezJ9X21ldGEKKwkJbHZjcmVhdGUgLWFleSAtTCAyTSAtbiAkMiAkMSAiJGRldjYiCisJCWx2Y29udmVydCAtLXRoaW5wb29sICQxLyQyIC0tcG9vbG1ldGFkYXRhICR7Mn1fbWV0YQorCQlsdmNyZWF0ZSAtVCAkMS8kMiAtViAxIC1uIHRoaW5sdgorCQlUSElOX1BPU1RGSVg9Il90bWV0YSIKKworCQlydW5fd3JpdGVtb3N0bHlfY2hlY2sgJDEgJDIKKwkJcnVuX3N5bmNhY3Rpb25fY2hlY2sgJDEgJDIKKwkJcnVuX3JlZnJlc2hfY2hlY2sgJDEgJDIKKwkJcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2sgJDEgJDIKKwllbGlmIFsgJ3NuYXBzaG90JyA9PSAkMyBdOyB0aGVuCisJCXByaW50ZiAiI1xuI1xuIyBydW5fY2hlY2tzOiBSQUlEIHVuZGVyIHNuYXBzaG90XG4jXG4jXG4iCisJCWx2Y3JlYXRlIC1hZXkgLXMgJDEvJDIgLWwgNCAtbiBzbmFwICIkZGV2NiIKKworCQlydW5fd3JpdGVtb3N0bHlfY2hlY2sgJDEgJDIKKwkJcnVuX3N5bmNhY3Rpb25fY2hlY2sgJDEgJDIKKwkJcnVuX3JlZnJlc2hfY2hlY2sgJDEgJDIKKwkJcnVuX3JlY292ZXJ5X3JhdGVfY2hlY2sgJDEgJDIKKworCQlsdnJlbW92ZSAtZmYgJDEvc25hcAorCWVsc2UKKwkJcHJpbnRmICIjXG4jXG4jIHJ1bl9jaGVja3M6IEludmFsaWQgYXJndW1lbnRcbiNcbiNcbiIKKwkJcmV0dXJuIDEKKwlmaQorfQorCitydW5fdHlwZXMoKSB7CisJZm9yIGkgaW4gJFRFU1RfVFlQRVMgOyBkbworCQlsdmNyZWF0ZSAtbiAkbHYxICR2ZyAtTDJNIC0tdHlwZSAiJEAiCisJCXJ1bl9jaGVja3MgJHZnICRsdjEgJGkKKwkJbHZyZW1vdmUgLWZmICR2ZworCWRvbmUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTUFJTgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVEVTVF9UWVBFUz0iLSBzbmFwc2hvdCIKKyMgUkFJRCB3b3JrcyBFWCBpbiBjbHVzdGVyCisjIHRoaW5wb29sIHdvcmtzIEVYIGluIGNsdXN0ZXIKKyMgYnV0IHRoZXkgZG9uJ3Qgd29yayB0b2dldGhlciBpbiBhIGNsdXN0ZXIgeWV0CisjICAobm9yIGRvZXMgdGhpbnBvb2wrbWlycm9yIHdvcmsgaW4gYSBjbHVzdGVyIHlldCkKK3Rlc3QgISAtZSBMT0NBTF9DTFZNRCAtYSBhdXggaGF2ZV90aGluIDEgOCAwICYmIFRFU1RfVFlQRT0iJFRFU1RfVFlQRVMgdGhpbnBvb2xfZGF0YSB0aGlucG9vbF9tZXRhIgorCisjIEltcGxpY2l0IHRlc3QgZm9yICdyYWlkMScgb25seQoraWYgdGVzdCAiJHtURVNUX1JBSUQ6LXJhaWQxfSIgPSByYWlkMSA7IHRoZW4KKwlydW5fdHlwZXMgcmFpZDEgLW0gMSAiJGRldjEiICIkZGV2MiIKKwl2Z3JlbW92ZSAtZmYgJHZnCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNoYW5nZS1yYWlkMTAuc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXJhaWQxMC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBhMWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1yYWlkMTAuc2gKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1RFU1RfUkFJRD1yYWlkMTAKKworLiBzaGVsbC9sdmNoYW5nZS1yYWlkLnNoCisKK2F1eCBoYXZlX3JhaWQgMSA1IDIgfHwgc2tpcAorCitydW5fdHlwZXMgcmFpZDEwIC1tIDEgLWkgMiAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtcmFpZDQ1Ni5zaCBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtcmFpZDQ1Ni5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IxOWRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1yYWlkNDU2LnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitURVNUX1JBSUQ9cmFpZDQ1NgorCisuIHNoZWxsL2x2Y2hhbmdlLXJhaWQuc2gKKworYXV4IHJhaWQ0NTZfcmVwbGFjZV93b3JrcyB8fCBza2lwCithdXggaGF2ZV9yYWlkIDEgNSAyIHx8IHNraXAKKworcnVuX3R5cGVzIHJhaWQ0IC1pIDIgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorcnVuX3R5cGVzIHJhaWQ1IC1pIDIgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorcnVuX3R5cGVzIHJhaWQ2IC1pIDMgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjaGFuZ2Utc3luY2FjdGlvbi1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmNoYW5nZS1zeW5jYWN0aW9uLXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5N2JjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2Utc3luY2FjdGlvbi1yYWlkLnNoCkBAIC0wLDAgKzEsODUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgdGVzdCBhY3RpdmF0aW9uIHJhY2UgZm9yIHJhaWQncyAtLXN5bmNhY3Rpb24gY2hlY2sKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgUHJvcGVyIG1pc21hdGNoIGNvdW50IDEuNS4yKyB1cHN0cmVhbSwgMS4zLjUgPCB4IDwgMS40LjAgaW4gUkhFTDYKK2F1eCBoYXZlX3JhaWQgMSAzIDUgJiYKKyAgISBhdXggaGF2ZV9yYWlkIDEgNCAwIHx8CisgIGF1eCBoYXZlX3JhaWQgMSA1IDIgfHwgc2tpcAorYXV4IHByZXBhcmVfdmcgMworCitsdmNyZWF0ZSAtbiAkbHYxICR2ZyAtbDEgLS10eXBlIHJhaWQxCisKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCisKK1NUQVJUPSQoZ2V0IHB2X2ZpZWxkICIkZGV2MiIgcGVfc3RhcnQgLS11bml0cyAxaykKK01FVEFTSVpFPSQoZ2V0IGx2X2ZpZWxkICR2Zy8ke2x2MX1fcm1ldGFfMSBzaXplIC1hIC0tdW5pdHMgMWspCitTRUVLPSQoKCR7U1RBUlQlXC4wMGt9ICsgJHtNRVRBU0laRSVcLjAwa30pKQorIyBPdmVyd3JpdGUgc29tZSBwb3J0aW9uIG9mICBfcmltYWdlXzEKKworI2F1eCBkZWxheV9kZXYgIiRkZXYyIiAxMCAxMAorZGQgaWY9L2Rldi91cmFuZG9tIG9mPSIkZGV2MiIgYnM9MUsgY291bnQ9MSBzZWVrPSRTRUVLIG9mbGFnPWRpcmVjdAorIyBGSVhNRQorIyBTb21lIGRlbGF5IC0gdGhlcmUgaXMgY3VycmVudGx5IHJhY2UgaW4gdXBzdHJlYW0ga2VybmVsCisjIHRlc3QgbWF5IG9jY2FzaW9uYWx5IGZhaWwgd2l0aDoKKyMgZGV2aWNlLW1hcHBlcjogbWVzc2FnZSBpb2N0bCBvbiAgZmFpbGVkOiBEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeQorIworIyBIZWlueidzIGtlcm5lbCBzZWVtcyB0byBmaXggdGhpcyBwYXJ0aWN1bGFyIGlzc3VlIGJ1dAorIyBoYXMgc29tZSBvdGhlciBwcm9ibGVtIGZvciBub3cKK2F1eCB1ZGV2X3dhaXQKKworbHZjaGFuZ2UgLS1zeW5jYWN0aW9uIGNoZWNrICR2Zy8kbHYxCisKKyMgV2FpdCB0aWxsIHNjcnViYmluZyBpcyBmaW5pc2hlZAorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgcmFpZF9taXNtYXRjaF9jb3VudCAiMTI4IgorCisjIExldCdzIGRlYWN0aXZhdGUKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCitsdmNoYW5nZSAtYXkgJHZnLyRsdjEKKyMgbm9vbmUgaGFzIGl0IG9wZW4gYW5kIHRhcmdldCBpcyByZWFkICYgcnVubmluZworZG1zZXR1cCBpbmZvIC1jIHwgZ3JlcCAkdmcKKworI3NsZWVwIDEwIDwgIiRETV9ERVZfRElSLyR2Zy8kbHYxIiAmCisjICJjaGVjayIgc2hvdWxkIGZpbmQgZGlzY3JlcGFuY2llcyBidXQgbm90IGNoYW5nZSB0aGVtCisjICdsdnMnIHNob3VsZCBzaG93IHJlc3VsdHMKKworIyBGSVhNRQorIyB0aGlzIGxvb2tzIGxpa2Ugc29tZSByYWNlIHdpdGggJ3dyaXRlJyBkdXJpbmcgYWN0aXZhdGlvbgorIyBhbmQgc3luY2FjdGlvbi4uLgorIyBGb3Igbm93IGl0IGZhaWxzIHdpdGg6CisjIGRldmljZS1tYXBwZXI6IG1lc3NhZ2UgaW9jdGwgb24gIGZhaWxlZDogRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kKKyMKKyMgQXMgc29sdXRpb24gZm9yIG5vdyAtIHVzZXIgbmVlZHMgdG8gcnVuIC0tc3luYWN0aW9uIG9uIHN5bmNocm9ub3VzIHJhaWQgYXJyYXkKKyMKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCisKKyMgQ2hlY2sgcmFpZCBhcnJheSBkb2Vzbid0IGtub3cgYWJvdXQgZXJyb3IgeWV0CitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSByYWlkX21pc21hdGNoX2NvdW50ICIwIgorCisjIFN0YXJ0IHNjcnViYmluZworbHZjaGFuZ2UgLS1zeW5jYWN0aW9uIGNoZWNrICR2Zy8kbHYxCisKKyMgV2FpdCB0aWxsIHNjcnViYmluZyBpcyBmaW5pc2hlZAorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworIyBSZXRlc3QgbWlzdG1hdGNoIGV4aXN0cworY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgcmFpZF9taXNtYXRjaF9jb3VudCAiMTI4IgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y2hhbmdlLXRoaW4uc2ggYi90ZXN0L3NoZWxsL2x2Y2hhbmdlLXRoaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjNGIzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjaGFuZ2UtdGhpbi5zaApAQCAtMCwwICsxLDEzOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgMworCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZyAgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZzIgIiRkZXYzIgorCitsdmNyZWF0ZSAtVjEwTSAtTDEwTSAtVCAkdmcvcG9vbCAtbiAkbHYxCitsdmNyZWF0ZSAtTDEwTSAtbiAkbHYyICR2ZworCitsdmNoYW5nZSAtYW4gJHZnLyRsdjEKKworIyBUZXN0IGFjdGl2YXRpb24KK2x2Y2hhbmdlIC1hbHkgJHZnLyRsdjEKK2NoZWNrIGFjdGl2ZSAkdmcgJGx2MQorCitsdmNoYW5nZSAtYWxuICR2Zy8kbHYxCitjaGVjayBpbmFjdGl2ZSAkdmcgJGx2MQorCisjIFRlc3QgZm9yIGFsbG93YWJsZSBjaGFuZ2VzCisjCisjIGNvbnRpZ3VvdXNfQVJHCitsdmNoYW5nZSAtQyB5ICR2Zy8kbHYxCitsdmNoYW5nZSAtQyBuICR2Zy8kbHYxCisKKyMgcGVybWlzc2lvbl9BUkcKK2x2Y2hhbmdlIC1wIHIgJHZnLyRsdjEKK2x2Y2hhbmdlIC1wIHJ3ICR2Zy8kbHYxCisKKyMgRklYTUUKKyNzaG91bGQgbHZjaGFuZ2UgLXAgciAkdmcvcG9vbAorI3Nob3VsZCBsdmNoYW5nZSAtcCBydyAkdmcvcG9vbAorCisjIHJlYWRhaGVhZF9BUkcKK2x2Y2hhbmdlIC1yIG5vbmUgJHZnLyRsdjEKK2x2Y2hhbmdlIC1yIGF1dG8gJHZnLyRsdjEKKyMgRklYTUUKKyMgVGhpbmsgYWJvdXQgbW9yZSBzdXBwb3J0CisKKyMgbWlub3JfQVJHCitsdmNoYW5nZSAtLXllcyAtTSB5IC0tbWlub3IgMjM0IC0tbWFqb3IgMjUzICR2Zy8kbHYxCitsdmNoYW5nZSAtTSBuICR2Zy8kbHYxCisKKyMgY2Fubm90IGNoYW5nZSBtYWpvciBtaW5vciBmb3IgcG9vbHMKK25vdCBsdmNoYW5nZSAtLXllcyAtTSB5IC0tbWlub3IgMjM1IC0tbWFqb3IgMjUzICR2Zy9wb29sCitub3QgbHZjaGFuZ2UgLU0gbiAkdmcvcG9vbAorCisjIGFkZHRhZ19BUkcKK2x2Y2hhbmdlIC0tYWRkdGFnIGZvbyAkdmcvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgZm9vICR2Zy9wb29sCisKKyMgZGVsdGFnX0FSRworbHZjaGFuZ2UgLS1kZWx0YWcgZm9vICR2Zy8kbHYxCitsdmNoYW5nZSAtLWRlbHRhZyBmb28gJHZnL3Bvb2wKKworIyBkaXNjYXJkc19BUkcKK2x2Y2hhbmdlIC0tZGlzY2FyZHMgbm9wYXNzZG93biAkdmcvcG9vbAorbHZjaGFuZ2UgLS1kaXNjYXJkcyBwYXNzZG93biAkdmcvcG9vbAorCisjIHplcm9fQVJHCitsdmNoYW5nZSAtLXplcm8gbiAkdmcvcG9vbAorbHZjaGFuZ2UgLS16ZXJvIHkgJHZnL3Bvb2wKKworIworIyBUZXN0IGZvciBkaXNhbGxvd2VkIG1ldGFkYXRhIGNoYW5nZXMKKyMKKyMgcmVzeW5jX0FSRworbm90IGx2Y2hhbmdlIC0tcmVzeW5jICR2Zy8kbHYxCisKKyMgYWxsb2NfQVJHCisjbm90IGx2Y2hhbmdlIC0tYWxsb2MgYW55d2hlcmUgJHZnLyRsdjEKKworIyBkaXNjYXJkc19BUkcKK25vdCBsdmNoYW5nZSAtLWRpc2NhcmRzIGlnbm9yZSAkdmcvJGx2MQorCisjIHplcm9fQVJHCitub3QgbHZjaGFuZ2UgLS16ZXJvIHkgJHZnLyRsdjEKKworCisjCisjIEVuc3VyZSB0aGF0IGFsbG93ZWQgYXJncyBkb24ndCBjYXVzZSBkaXNhbGxvd2VkIGFyZ3MgdG8gZ2V0IHRocm91Z2gKKyMKK25vdCBsdmNoYW5nZSAtLXJlc3luYyAtYXkgJHZnLyRsdjEKK25vdCBsdmNoYW5nZSAtLXJlc3luYyAtLWFkZHRhZyBmb28gJHZnLyRsdjEKKworIworIyBQbGF5IHdpdGggdGFncyBhbmQgYWN0aXZhdGlvbgorIworVEFHPSQodW5hbWUgLW4pCithdXggbHZtY29uZiAiYWN0aXZhdGlvbi92b2x1bWVfbGlzdCA9IFsgXCIkdmcvJGx2MlwiLCBcIkBteXRhZ1wiIF0iCisKK2x2Y2hhbmdlIC1heSAkdmcvJGx2MQorY2hlY2sgaW5hY3RpdmUgJHZnICRsdjEKKworbHZjaGFuZ2UgLS1hZGR0YWcgbXl0YWcgJHZnLyRsdjEKKworbHZjaGFuZ2UgLWF5IEBteXRhZ19mYWtlCitjaGVjayBpbmFjdGl2ZSAkdmcgJGx2MQorCitsdmNoYW5nZSAtYXkgJHZnLyRsdjEKKyMgVm9sdW1lIGhhcyBtYXRjaGluZyB0YWcKK2NoZWNrIGFjdGl2ZSAkdmcgJGx2MQorbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCisKK2x2Y2hhbmdlIC1heSBAbXl0YWcKK2NoZWNrIGFjdGl2ZSAkdmcgJGx2MQorCisjIEZhaWxzIGhlcmUgc2luY2UgaXQgY2Fubm90IGNsZWFyIGRldmljZSBoZWFkZXIKK25vdCBsdmNyZWF0ZSAtWnkgLUwxMCAtbiAkbHYzICR2ZzIKKyMgT0sgd2hlbiB6ZXJvaW5nIGlzIGRpc2FibGVkCitsdmNyZWF0ZSAtWm4gLUwxMCAtbiAkbHYzICR2ZzIKK2NoZWNrIGluYWN0aXZlICR2ZzIgJGx2MworCithdXggbHZtY29uZiAiYWN0aXZhdGlvbi92b2x1bWVfbGlzdCA9IFsgXCIkdmcyXCIgXSIKK3ZnY2hhbmdlIC1hbiAkdmcKK3ZnY2hhbmdlIC1heSAkdmcgJHZnMgorbHZzIC1hIC1vK2x2X2FjdGl2ZSAkdmcgJHZnMgorCithdXggbHZtY29uZiAiYWN0aXZhdGlvbi92b2x1bWVfbGlzdCA9IFsgXCIkdmdcIiwgXCIkdmcyXCIgXSIKKwordmdyZW1vdmUgLWZmICR2ZyAkdmcyCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtY2FjaGUtcmFpZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmI5Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtY2FjaGUtcmFpZC5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSB1c2FnZSBvZiBzdGFja2VkIGNhY2hlIHZvbHVtZSB1c2luZyByYWlkIHZvbHVtZQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfY2FjaGUgMSAzIDAgfHwgc2tpcAorYXV4IGhhdmVfcmFpZCAxIDAgMCB8fCBza2lwCisKK2F1eCBsdm1jb25mICdnbG9iYWwvY2FjaGVfZGlzYWJsZWRfZmVhdHVyZXMgPSBbICJwb2xpY3lfc21xIiBdJworCithdXggcHJlcGFyZV92ZyA1IDgwCisKKyMgQnVnIDEwOTU4NDMKKyMgbHZjcmVhdGUgUkFJRDEgb3JpZ2luLCBsdmNyZWF0ZSBjYWNoZS1wb29sLCBhbmQgbHZjb252ZXJ0IHRvIGNhY2hlCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtLW5vc3luYyAtbCAyIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtbCAxIC1uICR7bHYxfV9jYWNoZXBvb2wgJHZnCitsdmNvbnZlcnQgLS1jYWNoZSAtWnkgLS1jYWNoZXBvb2wgJHZnLyR7bHYxfV9jYWNoZXBvb2wgJHZnLyRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcvJHtsdjF9X2NvcmlnX3JpbWFnZV8wICMgZW5zdXJlIGltYWdlcyBhcmUgcHJvcGVybHkgcmVuYW1lZAorZG1zZXR1cCB0YWJsZSAke3ZnfS0kbHYxIHwgZ3JlcCBjYWNoZSAgICMgZW5zdXJlIGl0IGlzIGxvYWRlZCBpbiBrZXJuZWwKK2x2cmVtb3ZlIC1mICR2ZworCisKKyMgbHZjcmVhdGUgUkFJRDEgb3JpZ2luLCBsdmNyZWF0ZSBSQUlEMSBjYWNoZS1wb29sLCBhbmQgbHZjb252ZXJ0IHRvIGNhY2hlCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtLW5vc3luYyAtbCAyIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtLW5vc3luYyAtbCAyIC1uICR7bHYxfV9jYWNoZXBvb2wgJHZnCisjc2hvdWxkIGx2cyAtYSAkdmcvJHtsdjF9X2NkYXRhX3JpbWFnZV8wICAjIGVuc3VyZSBpbWFnZXMgYXJlIHByb3Blcmx5IHJlbmFtZWQKK2x2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUgLS1jYWNoZW1vZGUgd3JpdGViYWNrIC0tY2FjaGVwb29sICR2Zy8ke2x2MX1fY2FjaGVwb29sICR2Zy8kbHYxIDI+JjEgfCB0ZWUgb3V0CitncmVwICJXQVJOSU5HOiBEYXRhIHJlZHVuZGFuY3kgaXMgbG9zdCIgb3V0CitjaGVjayBsdl9leGlzdHMgJHZnLyR7bHYxfV9jb3JpZ19yaW1hZ2VfMCAgICAgICAgIyBlbnN1cmUgaW1hZ2VzIGFyZSBwcm9wZXJseSByZW5hbWVkCitkbXNldHVwIHRhYmxlICR7dmd9LSRsdjEgfCBncmVwIGNhY2hlICAgIyBlbnN1cmUgaXQgaXMgbG9hZGVkIGluIGtlcm5lbAorbHZyZW1vdmUgLWYgJHZnCisKKworbHZjcmVhdGUgLW4gY29yaWdpbiAtbSAxIC0tdHlwZSByYWlkMSAtLW5vc3luYyAtbCAxMCAkdmcKK2x2Y3JlYXRlIC1uIGNwb29sIC0tdHlwZSBjYWNoZSAkdmcvY29yaWdpbiAtLWNhY2hlbW9kZSB3cml0ZWJhY2sgLWwgMTAgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIldBUk5JTkc6IERhdGEgcmVkdW5kYW5jeSBpcyBsb3N0IiBvdXQKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC0tbmFtZSBzcGxpdCAkdmcvY29yaWdpbiAiJGRldjEiCisKK2x2cmVtb3ZlIC1mICR2ZworCitsdmNyZWF0ZSAtbiBjcG9vbF9tZXRhIC1tIDEgLS10eXBlIHJhaWQxIC1sIDEwICR2ZworbHZjcmVhdGUgLW4gY3Bvb2wgLW0gMSAtLXR5cGUgcmFpZDEgLWwgMTAgJHZnCithdXggd2FpdF9mb3Jfc3luYyAkdmcgY3Bvb2xfbWV0YQorYXV4IHdhaXRfZm9yX3N5bmMgJHZnIGNwb29sCitsdnMgLWEgLW8rc2VnX3BlX3JhbmdlcyAkdmcKK2x2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUtcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvY3Bvb2xfbWV0YSAkdmcvY3Bvb2wKK2x2Y3JlYXRlIC1uIGNvcmlnaW4gLS10eXBlIGNhY2hlIC0tY2FjaGVwb29sICR2Zy9jcG9vbCAtbCAxMAorCitsdmNoYW5nZSAtLXN5bmNhY3Rpb24gcmVwYWlyICR2Zy9jcG9vbF9jbWV0YQorbHZjaGFuZ2UgLS1zeW5jYWN0aW9uIHJlcGFpciAkdmcvY3Bvb2xfY2RhdGEKKworbHZjb252ZXJ0IC0tcmVwYWlyIC15ICR2Zy9jcG9vbF9jbWV0YQorbHZjb252ZXJ0IC0tcmVwYWlyIC15ICR2Zy9jcG9vbF9jZGF0YQorCisjIGRvIG5vdCBhbGxvdyByZXNlcnZlZCBuYW1lcyBmb3IgKm5ldyogTFZzCitub3QgbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIDEgLS1uYW1lIHNwbGl0X2NtZXRhICR2Zy9jcG9vbF9jbWV0YSAiJGRldjEiCitub3QgbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIDEgLS1uYW1lIHNwbGl0X2NkYXRhICR2Zy9jcG9vbF9jZGF0YSAiJGRldjEiCisKKyMgYnV0IGFsbG93IG1hbmlwdWxhdGluZyBleGlzdGluZyBMVnMgd2l0aCByZXNlcnZlZCBuYW1lcworYXV4IHdhaXRfZm9yX3N5bmMgJHZnIGNwb29sX2NtZXRhCithdXggd2FpdF9mb3Jfc3luYyAkdmcgY3Bvb2xfY2RhdGEKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC0tbmFtZSBzcGxpdF9tZXRhICR2Zy9jcG9vbF9jbWV0YSAiJGRldjEiCitsdmNvbnZlcnQgLS1zcGxpdG1pcnJvcnMgMSAtLW5hbWUgc3BsaXRfZGF0YSAkdmcvY3Bvb2xfY2RhdGEgIiRkZXYxIgorCitsdnJlbW92ZSAtZiAkdmcKKworCisjIFRlc3QgdXAvZG93biByYWlkIGNvbnZlcnNpb24gb2YgY2FjaGUgcG9vbCBkYXRhIGFuZCBtZXRhZGF0YQorbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgJHZnL2Nwb29sIC1sIDEwCitsdmNyZWF0ZSAtbiBjb3JpZ2luIC1IICR2Zy9jcG9vbCAtbCAyMAorCitsdmNvbnZlcnQgLW0rMSAtLXR5cGUgcmFpZDEgJHZnL2Nwb29sX2NtZXRhCitjaGVjayBsdl9maWVsZCAkdmcvY3Bvb2xfY21ldGEgbGF5b3V0ICJyYWlkLHJhaWQxIgorY2hlY2sgbHZfZmllbGQgJHZnL2Nwb29sX2NtZXRhIHJvbGUgInByaXZhdGUsY2FjaGUscG9vbCxtZXRhZGF0YSIKKworbHZjb252ZXJ0IC1tKzEgLS10eXBlIHJhaWQxICR2Zy9jcG9vbF9jZGF0YQorY2hlY2sgbHZfZmllbGQgJHZnL2Nwb29sX2NkYXRhIGxheW91dCAicmFpZCxyYWlkMSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9jcG9vbF9jZGF0YSByb2xlICJwcml2YXRlLGNhY2hlLHBvb2wsZGF0YSIKKworbHZjb252ZXJ0IC1tLTEgICR2Zy9jcG9vbF9jbWV0YQorY2hlY2sgbHZfZmllbGQgJHZnL2Nwb29sX2NtZXRhIGxheW91dCAibGluZWFyIgorbHZjb252ZXJ0IC1tLTEgICR2Zy9jcG9vbF9jZGF0YQorY2hlY2sgbHZfZmllbGQgJHZnL2Nwb29sX2NkYXRhIGxheW91dCAibGluZWFyIgorCitsdnJlbW92ZSAtZiAkdmcKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS1zbXEuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS1zbXEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkYWViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LWNhY2hlLXNtcS5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSBjb252ZXJzaW9uIG9mIGNhY2hlIGFuZCBjYWNoZSBwb29sCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9jYWNoZSAxIDggMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDUgODAKKworbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLWFuIC12IC1MIDIgLW4gY3Bvb2wgJHZnCisKK2x2Y3JlYXRlIC1IIC0tY2FjaGVwb2xpY3kgc21xIC1MIDQgLW4gY29yaWdpbiAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wKKworY2hlY2sgbHZfZmllbGQgJHZnL2NvcmlnaW4gY2FjaGVfcG9saWN5ICJzbXEiCisKK2x2Y29udmVydCAtLXNwbGl0Y2FjaGUgJHZnL2NvcmlnaW4KKworbHZzIC1vK2NhY2hlX3BvbGljeSAtYSAkdmcKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS10aGluLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtY2FjaGUtdGhpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRlYTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtY2FjaGUtdGhpbi5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSB1c2FnZSBvZiBzdGFja2VkIGNhY2hlIHZvbHVtZSB1c2VkIGluIHRoaW4gcG9vbCB2b2x1bWVzCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9jYWNoZSAxIDMgMCB8fCBza2lwCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgNSA4MAorCitsdmNyZWF0ZSAtTDEwIC1uIGNwb29sICR2ZworbHZjcmVhdGUgLUwxMCAtbiB0cG9vbCAkdmcKK2x2Y3JlYXRlIC1MMTAgLW4gJGx2MSAkdmcKKworbHZjb252ZXJ0IC0teWVzIC0tY2FjaGUgLS1jYWNoZXBvb2wgY3Bvb2wgJHZnL3Rwb29sCisKKyMgQ3VycmVudGx5IHRoZSBvbmx5IGFsbG93ZWQgc3RhY2tpbmcgaXMgY2FjaGUgdGhpbiBkYXRhIHZvbHVtZQorbHZjb252ZXJ0IC0teWVzIC0tdHlwZSB0aGluLXBvb2wgJHZnL3Rwb29sCisKK2x2Y3JlYXRlIC1WMTAgLVQgLW4gJGx2MiAkdmcvdHBvb2wKKworYXV4IG1rZGV2X21kNXN1bSAkdmcgJGx2MgorCitsdmNvbnZlcnQgLS1zcGxpdGNhY2hlICR2Zy90cG9vbAorCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYyCitsdmNoYW5nZSAtYW4gJHZnCitsdmNoYW5nZSAtYXkgJHZnCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYyCisKK2x2cyAtYSAkdmcKK2x2Y29udmVydCAtLXllcyAtLWNhY2hlIC0tY2FjaGVwb29sIGNwb29sICR2Zy90cG9vbAorCitsdmNvbnZlcnQgLS15ZXMgLVQgLS10aGlucG9vbCAkdmcvdHBvb2wgJHZnLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICR2Zy90cG9vbCBzZWd0eXBlICJ0aGluLXBvb2wiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlICJ0aGluIgorbHZjb252ZXJ0IC0tdW5jYWNoZSAkdmcvdHBvb2wKK2x2cyAtYSAkdmcKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LWNhY2hlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1jYWNoZS5zaApAQCAtMCwwICsxLDE2OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNC0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSBjb252ZXJzaW9uIG9mIGNhY2hlIGFuZCBjYWNoZSBwb29sCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9jYWNoZSAxIDMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDUgODAKKworbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLWFuIC12IC1MIDIgLW4gY3Bvb2wgJHZnCitsdmNyZWF0ZSAtSCAtTCA0IC1uIGNvcmlnaW4gLS1jYWNoZXBvb2wgJHZnL2Nwb29sCisKK2ZhaWwgbHZjcmVhdGUgLXMgLUwyICR2Zy9jb3JpZ2luCitmYWlsIGx2Y3JlYXRlIC1zIC1MMiAkdmcvY3Bvb2wKK2ZhaWwgbHZjcmVhdGUgLXMgLUwyICR2Zy9jcG9vbF9jZGF0YQorZmFpbCBsdmNyZWF0ZSAtcyAtTDIgJHZnL2Nwb29sX2NtZXRhCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayByZWd1bGFyIGNvbnZlcmlvbiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbHZjcmVhdGUgb3JpZ2luLCBsdmNyZWF0ZSBjYWNoZS1wb29sLCBhbmQgbHZjb252ZXJ0IHRvIGNhY2hlCitsdmNyZWF0ZSAtYW4gLVpuIC1MIDIgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1MIDggLW4gJGx2MiAkdmcKK2x2Y3JlYXRlIC1hbiAtWm4gLUwgOCAtbiAkbHYzICR2ZworbHZjcmVhdGUgLWFuIC1abiAtTCA4IC1uICRsdjQgJHZnCitsdmNyZWF0ZSAtYW4gLVpuIC1MIDE2IC1uICRsdjUgJHZnCisKKyMgY2hlY2sgdmFsaWRhdGlvbiBvZiBjYWNoZW1vZGUgYXJnIHdvcmtzCitpbnZhbGlkIGx2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUtcG9vbCAtLWNhY2hlbW9kZSB3cml0ZXRocm91Z2hYIC0tY2FjaGVwb29sICR2Zy8kbHYxCisKKyMgYnkgZGVmYXVsdCBubyBjYWNoZSBzZXR0aW5ncyBhcmUgYXR0YWNoZWQgdG8gY29udmVydGVkIGNhY2hlLXBvb2wKK2x2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUtcG9vbCAtLWNodW5rc2l6ZSAyNTYgJHZnLyRsdjEKK2NoZWNrIGluYWN0aXZlICR2ZyAke2x2MX1fY2RhdGEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGNhY2hlX21vZGUgIiIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGNhY2hlX3BvbGljeSAiIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgY2FjaGVfc2V0dGluZ3MgIiIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGNodW5rX3NpemUgIjI1Ni4wMGsiCisKKyMgYnV0IGFsbG93IHRvIHNldCB0aGVtIHdoZW4gc3BlY2lmaWVkIGV4cGxpY2l0ZWx5IG9uIGNvbW1hbmQgbGluZQorbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBjYWNoZS1wb29sIC0tY2FjaGVtb2RlIHdyaXRlYmFjayAtLWNhY2hlcG9saWN5IG1xIFwKKwktLWNhY2hlc2V0dGluZ3Mgc2VxdWVudGlhbF90aHJlc2hvbGQ9MTIzNCAtLWNhY2hlc2V0dGluZ3MgcmFuZG9tX3RocmVzaG9sZD01NiBcCisJLS1jYWNoZXBvb2wgJHZnLyRsdjIKK2NoZWNrIGluYWN0aXZlICR2ZyAke2x2Mn1fY2RhdGEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIGNhY2hlX21vZGUgIndyaXRlYmFjayIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIGNhY2hlX3BvbGljeSAibXEiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBjYWNoZV9zZXR0aW5ncyAicmFuZG9tX3RocmVzaG9sZD01NixzZXF1ZW50aWFsX3RocmVzaG9sZD0xMjM0IgorCisjIENoZWNrIHN3YXAgb2YgY2FjaGUgcG9vbCBtZXRhZGF0YQorbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBjYWNoZS1wb29sIC0tcG9vbG1ldGFkYXRhICRsdjQgJHZnLyRsdjMKK1VVSUQ9JChnZXQgbHZfZmllbGQgJHZnLyRsdjUgdXVpZCkKK2x2Y29udmVydCAtLXllcyAtLWNhY2hlcG9vbCAkdmcvJGx2MyAtLXBvb2xtZXRhZGF0YSAkbHY1CitjaGVjayBsdl9maWVsZCAkdmcvJHtsdjN9X2NtZXRhIHV1aWQgIiRVVUlEIgorCisKKyNmYWlsIGx2Y29udmVydCAtLWNhY2hlcG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MgorI2x2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUtcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MiAkdmcvJGx2MQorI2x2Y29udmVydCAtLXllcyAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MiAtLWNhY2hlcG9vbCAkdmcvJGx2MQorCitsdnJlbW92ZSAtZmYgJHZnCisKK2x2Y3JlYXRlIC1MIDIgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1sIDEgLW4gJHtsdjF9X2NhY2hlcG9vbCAkdmcKK2x2Y29udmVydCAtLWNhY2hlIC0tY2FjaGVwb29sICR2Zy8ke2x2MX1fY2FjaGVwb29sIC0tY2FjaGVtb2RlIHdyaXRlYmFjayAtWnkgJHZnLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGNhY2hlX21vZGUgIndyaXRlYmFjayIKK2Rtc2V0dXAgdGFibGUgJHt2Z30tJGx2MSB8IGdyZXAgY2FjaGUgICMgZW5zdXJlIGl0IGlzIGxvYWRlZCBpbiBrZXJuZWwKKworI2x2Y29udmVydCAtLWNhY2hlcG9vbCAkdmcvJHtsdjF9X2NhY2hlcG9vbCAkdmcvJGx2MQorI2x2Y29udmVydCAtLWNhY2hlcG9vbCAkdmcvJHtsdjF9X2NhY2hlcG9vbCAtLXBvb2xtZXRhZGF0YXNpemUgMjAgIiRkZXYzIgorCisKK2ZhaWwgbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSAtLWNhY2hlcG9vbCAkdmcvJHtsdjF9X2NhY2hlcG9vbCAtWnkgJHZnLyRsdjEKKworIyBUZXN0IC0tc3BsaXRjYWNoZSBsZWF2ZXMgYm90aCBjYWNoZSBvcmlnaW4gYW5kIGNhY2hlIHBvb2wKK2x2Y29udmVydCAtLXNwbGl0Y2FjaGUgJHZnLyRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MSAke2x2MX1fY2FjaGVwb29sCitsdnJlbW92ZSAtZiAkdmcKKworCitsdmNyZWF0ZSAtbiBjb3JpZ2luIC1sIDEwICR2ZworbHZjcmVhdGUgLW4gcG9vbCAtbCAxMCAkdmcKK2x2cyAtYSAtbyArZGV2aWNlcworZmFpbCBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIC0tY2FjaGVwb29sICR2Zy9wb29sICR2Zy9jb3JpZ2luCitsdmNvbnZlcnQgLS15ZXMgLS1jYWNoZSAtLWNhY2hlcG9vbCAkdmcvcG9vbCAkdmcvY29yaWdpbgorbHZyZW1vdmUgLWZmICR2ZworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEludmFsaWQgY29udmVyc2lvbnMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2x2Y3JlYXRlIC1hbiAtWm4gLUwgMiAtbiAkbHYxICR2ZworbHZjcmVhdGUgLWFuIC1abiAtTCA4IC1uICRsdjIgJHZnCitsdmNyZWF0ZSAtYW4gLVpuIC1MIDggLW4gJGx2MyAkdmcKK2x2Y3JlYXRlIC1hbiAtWm4gLUwgOCAtbiAkbHY0ICR2ZworCisjIFVuZGVmaW5lZCBjYWNoZXBvb2wKK2ludmFsaWQgbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MiAkdmcvJGx2MQorCisjIENhbm5vdCBtaXggd2l0aCB0aGlucworaW52YWxpZCBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyIC0tdGhpbnBvb2wgJHZnLyRsdjEKK2ludmFsaWQgbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSAtLXRoaW4gLS1wb29sbWV0YWRhdGEgJHZnLyRsdjIgJHZnLyRsdjEKKworIyBVbmRlZmluZWQgY2FjaGVkIHZvbHVtZQoraW52YWxpZCBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIC0tY2FjaGVwb29sICR2Zy8kbHYxCitpbnZhbGlkIGx2Y29udmVydCAtLWNhY2hlIC0tY2FjaGVwb29sICR2Zy8kbHYxCisKKyMgU2luZ2xlIHZnIGlzIHJlcXVpcmVkCitpbnZhbGlkIGx2Y29udmVydCAtLXR5cGUgY2FjaGUgLS1jYWNoZXBvb2wgJHZnLyRsdjEgLS1wb29sbWV0YWRhdGEgJHZnMS8kbHYyICR2Zy8kbHYzCitpbnZhbGlkIGx2Y29udmVydCAtLXR5cGUgY2FjaGUgLS1jYWNoZXBvb2wgJHZnLyRsdjEgLS1wb29sbWV0YWRhdGEgJGx2MiAkdmcxLyRsdjMKK2ludmFsaWQgbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSAtLWNhY2hlcG9vbCAkdmcxLyRsdjEgLS1wb29sbWV0YWRhdGEgJHZnMi8kbHYyICR2Zy8kbHYzCitpbnZhbGlkIGx2Y29udmVydCAtLXR5cGUgY2FjaGUtcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcyLyRsdjIgJHZnMS8kbHYxCisKK2ludmFsaWQgbHZjb252ZXJ0IC0tY2FjaGVwb29sICR2ZzEvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcyLyRsdjIKKworIyBJbnZhbGlkIHN5bnRheCwgdmcgaXMgdW5rbm93bgoraW52YWxpZCBsdmNvbnZlcnQgLS15ZXMgLS1jYWNoZXBvb2wgJGx2MyAtLXBvb2xtZXRhZGF0YSAkbHY0CisKKyMgSW52YWxpZCBjaHVuayBzaXplIGlzIDwzMktpQiA+MUdpQgoraW52YWxpZCBsdmNvbnZlcnQgLS10eXBlIGNhY2hlLXBvb2wgLS1jaHVua3NpemUgMTYgLS1wb29sbWV0YWRhdGEgJGx2MiAkdmcvJGx2MQoraW52YWxpZCBsdmNvbnZlcnQgLS10eXBlIGNhY2hlLXBvb2wgLS1jaHVua3NpemUgMkcgLS1wb29sbWV0YWRhdGEgJGx2MiAkdmcvJGx2MQorCisjIEludmFsaWQgY2h1bmsgc2l6ZSBpcyBiaWdnZXIgdGhlbiBkYXRhIHNpemUsIG5lZWRzIHRvIG9wZW4gVkcKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBjYWNoZS1wb29sIC0tY2h1bmtzaXplIDE2TSAtLXBvb2xtZXRhZGF0YSAkbHYyICR2Zy8kbHYxCisKK2x2cmVtb3ZlIC1mICR2ZworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVwYWlyIG9mIGNhY2hlIHBvb2wgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtYW4gLXYgLUwgMiAtbiBjcG9vbCAkdmcKK2x2Y3JlYXRlIC1IIC1MIDQgLW4gY29yaWdpbiAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wKKworIyB1bnN1cHBvcnRlZCB5ZXQKK2ZhaWwgbHZjb252ZXJ0IC0tcmVwYWlyICR2Zy9jcG9vbCAyPiYxIHwgdGVlIG91dAorI2dyZXAgIkNhbm5vdCBjb252ZXJ0IGludGVybmFsIExWIiBvdXQKKworbHZyZW1vdmUgLWYgJHZnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByb2hpYml0ZWQgY29udmVyc2lvbnMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgJHZnLyRsdjEKK2x2Y3JlYXRlIC0tY2FjaGUgLUwyMCAkdmcvJGx2MQorbHZjcmVhdGUgLUwxMCAtbiAkbHYyICR2ZworCitmYWlsIGx2Y29udmVydCAtLXllcyAtLXR5cGUgY2FjaGUgJHZnLyRsdjIgLS1jYWNoZXBvb2wgJHZnLyRsdjEKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBjYWNoZSAkdmcvJGx2MSAtLWNhY2hlcG9vbCAkdmcvJGx2MgorZmFpbCBsdmNvbnZlcnQgLS15ZXMgLS10eXBlIGNhY2hlLXBvb2wgJHZnLyRsdjEKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBtaXJyb3IgLW0xICR2Zy8kbHYxCitub3QgYXV4IGhhdmVfcmFpZCAxIDAgMCB8fCBmYWlsIGx2Y29udmVydCAtLXllcyAtLXR5cGUgcmFpZDEgLW0xICR2Zy8kbHYxCitmYWlsIGx2Y29udmVydCAtLXllcyAtLXR5cGUgc25hcHNob3QgJHZnLyRsdjEgJHZnLyRsdjIKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBzbmFwc2hvdCAkdmcvJGx2MiAkdmcvJGx2MQorbm90IGF1eCBoYXZlX3RoaW4gMSAwIDAgfHwgZmFpbCBsdmNvbnZlcnQgLS15ZXMgLVQgLS10aGlucG9vbCAkdmcvJGx2MiAkdmcvJGx2MQorCitsdnJlbW92ZSAtZiAkdmcKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMtMC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LW1pcnJvci1iYXNpYy0wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzZmNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMtMC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworLiAuL3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMuc2gKKwordGVzdF9tYW55IDAKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLTEuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMtMS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzA3YjFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLTEuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKy4gLi9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLnNoCisKK3Rlc3RfbWFueSAxCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LW1pcnJvci1iYXNpYy0yLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLTIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3MTdmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LW1pcnJvci1iYXNpYy0yLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisuIC4vc2hlbGwvbHZjb252ZXJ0LW1pcnJvci1iYXNpYy5zaAorCit0ZXN0X21hbnkgMgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMtMy5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LW1pcnJvci1iYXNpYy0zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGYyODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMtMy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworLiAuL3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMuc2gKKwordGVzdF9tYW55IDMKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGU2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItYmFzaWMuc2gKQEAgLTAsMCArMSwxNDEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKyMgZGlzYWJsZSBsdm1ldGFkIGxvZ2dpbmcgYXMgaXQgYm9ncyBkb3duIHRlc3Qgc3lzdGVtcworZXhwb3J0IExWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUz0ke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy19CisKKy4gbGliL2luaXR0ZXN0CisKK2xvZ19uYW1lX3RvX2NvdW50KCkgeworCWNhc2UgIiQxIiAgaW4KKwltaXJyb3JlZCkgZWNobyAyIDs7CisJZGlzaykJICBlY2hvIDEgOzsKKwkqKQkgIGVjaG8gMCA7OworCWVzYWMKK30KKworIyBGSVhNRTogRm9yIHRlc3RfW3VwfGRvd25dY29udmVydCwgSSdkIHN0aWxsIGxpa2UgdG8gYmUgYWJsZQorIyB0byBzcGVjaWZpeSBkZXZpY2VzIC0gZXNwZWNpYWxseSBpZiBJIGNhbiBkbyBwYXJ0aWFsIFBWCisjIHNwZWNpZmljYXRpb24gZm9yIGRvd24tY29udmVydHMuICBJdCBtYXkgZXZlbiBiZSB3aXNlIHRvCisjIGRvIG9uZSByb3VuZCB0aHJvdWdoIHRoZXNlIHRlc3RzIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgUFZzCisjIHRvIHVzZSBhbmQgb25lIHJvdW5kIHdoZXJlIHdlIGRvLgorCisjIHRlc3RfbHZjb252ZXJ0CisjICAgc3RhcnRfbWlycm9yX2NvdW50OiAgVGhlICctbScgYXJndW1lbnQgdG8gY3JlYXRlIHdpdGgKKyMgICBzdGFydF9sb2dfdHlwZTogY29yZXxkaXNrfG1pcnJvcmVkCisjICAgZmluYWxfbWlycm9yX2NvdW50OiBUaGUgJy1tJyBhcmd1bWVudCB0byBjb252ZXJ0IHRvCisjICAgZmluYWxfbG9nX3R5cGU6IGNvcmV8ZGlza3xtaXJyb3JlZAorIyAgIGFjdGl2ZTogV2hldGhlciB0aGUgTFYgc2hvdWxkIGJlIGFjdGl2ZSB3aGVuIHRoZSBjb252ZXJ0IGhhcHBlbnMKKyMKKyMgRXhtYXBsZTogQ29udmVydCAzLXdheSBkaXNrLWxvZyBtaXJyb3IgdG8KKyMgICAgICAgICAgMi13YXkgZGlzay1sb2cgbWlycm9yIHdoaWxlIG5vdCBhY3RpdmUKKyMgLT4gdGVzdF9sdmNvbnZlcnQgMiBkaXNrIDMgZGlzayAwCisKK3Rlc3RfbHZjb252ZXJ0KCkgeworCWxvY2FsIHN0YXJ0X2NvdW50PSQxCisJbG9jYWwgc3RhcnRfY291bnRfcDE9JCgoJHN0YXJ0X2NvdW50ICsgMSkpCisJbG9jYWwgc3RhcnRfbG9nX3R5cGU9JDIKKwlsb2NhbCBmaW5pc2hfY291bnQ9JDMKKwlsb2NhbCBmaW5pc2hfY291bnRfcDE9JCgoJGZpbmlzaF9jb3VudCArIDEpKQorCWxvY2FsIGZpbmlzaF9sb2dfdHlwZT0kNAorCWxvY2FsIGRldl9hcnJheT0oICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiApCisJbG9jYWwgc3RhcnRfbG9nX2NvdW50CisJbG9jYWwgZmluaXNoX2xvZ19jb3VudAorCWxvY2FsIG1heF9sb2dfY291bnQKKwlsb2NhbCBhbGxvYz0iIgorCWxvY2FsIGFjdGl2ZT10cnVlCisJbG9jYWwgaQorCisJdGVzdCAiJDUiID0gImFjdGl2ZSIgJiYgYWN0aXZlPWZhbHNlCisJI3Rlc3QgJGZpbmlzaF9jb3VudCAtZ3QgJHN0YXJ0X2NvdW50ICYmIHVwPXRydWUKKworCSMgRG8gd2UgaGF2ZSBlbm91Z2ggZGV2aWNlcyBmb3IgdGhlIG1pcnJvciBpbWFnZXM/CisJdGVzdCAkc3RhcnRfY291bnRfcDEgLWd0ICR7I2Rldl9hcnJheVtAXX0gJiYgXAorCQlkaWUgIkFjdGlvbiByZXF1aXJlcyB0b28gbWFueSBkZXZpY2VzIgorCisJIyBEbyB3ZSBoYXZlIGVub3VnaCBkZXZpY2VzIGZvciB0aGUgbWlycm9yIGltYWdlcz8KKwl0ZXN0ICRmaW5pc2hfY291bnRfcDEgLWd0ICR7I2Rldl9hcnJheVtAXX0gJiYgXAorCQlkaWUgIkFjdGlvbiByZXF1aXJlcyB0b28gbWFueSBkZXZpY2VzIgorCisJc3RhcnRfbG9nX2NvdW50PSQobG9nX25hbWVfdG9fY291bnQgJHN0YXJ0X2xvZ190eXBlKQorCWZpbmlzaF9sb2dfY291bnQ9JChsb2dfbmFtZV90b19jb3VudCAkZmluaXNoX2xvZ190eXBlKQorCWlmIFsgJGZpbmlzaF9sb2dfY291bnQgLWd0ICRzdGFydF9sb2dfY291bnQgXTsgdGhlbgorCQltYXhfbG9nX2NvdW50PSRmaW5pc2hfbG9nX2NvdW50CisJZWxzZQorCQltYXhfbG9nX2NvdW50PSRzdGFydF9sb2dfY291bnQKKwlmaQorCisJaWYgWyAkc3RhcnRfY291bnQgLWd0IDAgXTsgdGhlbgorCQkjIEFyZSB0aGVyZSBleHRyYSBkZXZpY2VzIGZvciB0aGUgbG9nIG9yIGRvIHdlIG92ZXJsYXAKKwkJaWYgWyAkKCgkc3RhcnRfY291bnRfcDEgKyAkc3RhcnRfbG9nX2NvdW50KSkgLWd0ICR7I2Rldl9hcnJheVtAXX0gXTsgdGhlbgorCQkJYWxsb2M9Ii0tYWxsb2MgYW55d2hlcmUiCisJCWZpCisKKwkJbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbSAkc3RhcnRfY291bnQgLS1taXJyb3Jsb2cgJHN0YXJ0X2xvZ190eXBlIFwKKwkJCS1uICRsdjEgJHZnICRhbGxvYworCQljaGVjayBtaXJyb3JfbGVncyAkdmcgJGx2MSAkc3RhcnRfY291bnRfcDEKKwkJIyBGSVhNRTogY2hlY2sgbWlycm9yIGxvZworCWVsc2UKKwkJbHZjcmVhdGUgLWFleSAtbDIgLW4gJGx2MSAkdmcKKwlmaQorCisJbHZzIC1hIC1vIG5hbWUsY29weV9wZXJjZW50LGRldmljZXMgJHZnCisJdGVzdCAkYWN0aXZlIHx8IGx2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisJIyBBcmUgdGhlcmUgZXh0cmEgZGV2aWNlcyBmb3IgdGhlIGxvZyBvciBkbyB3ZSBvdmVybGFwCisJaWYgWyAkKCgkZmluaXNoX2NvdW50X3AxICsgJGZpbmlzaF9sb2dfY291bnQpKSAtZ3QgJHsjZGV2X2FycmF5W0BdfSBdOyB0aGVuCisJCWFsbG9jPSItLWFsbG9jIGFueXdoZXJlIgorCWZpCisKKwlsdmNvbnZlcnQgLS10eXBlIG1pcnJvciAtbSAkZmluaXNoX2NvdW50IC0tbWlycm9ybG9nICRmaW5pc2hfbG9nX3R5cGUgXAorCQkkdmcvJGx2MSAkYWxsb2MKKworCXRlc3QgJGFjdGl2ZSB8fCBsdmNoYW5nZSAtYWV5ICR2Zy8kbHYxCisKKwljaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKKwlpZiBbICIkZmluaXNoX2NvdW50X3AxIiAtZXEgMSBdOyB0aGVuCisJCWNoZWNrIGxpbmVhciAkdmcgJGx2MQorCWVsc2UKKwkJaWYgdGVzdCAtbiAiJGFsbG9jIjsgdGhlbgorCQkJY2hlY2sgbWlycm9yX25vbnJlZHVuZGFudCAkdmcgJGx2MQorCQllbHNlCisJCQljaGVjayBtaXJyb3IgJHZnICRsdjEKKwkJZmkKKwkJY2hlY2sgbWlycm9yX2xlZ3MgJHZnICRsdjEgJGZpbmlzaF9jb3VudF9wMQorCWZpCit9CisKK2F1eCBwcmVwYXJlX3B2cyA1IDUKK3ZnY3JlYXRlIC1zIDMyayAkdmcgJChjYXQgREVWSUNFUykKKworTUlSUk9SRUQ9Im1pcnJvcmVkIgorIyBGSVhNRTogQ2x1c3RlciBpcyBub3Qgc3VwcG9ydGluZyBleGx1c2l2ZSBhY3RpdmF0aW9uIG9mIG1pcnJvcmVkIGxvZwordGVzdCAtZSBMT0NBTF9DTFZNRCAmJiBNSVJST1JFRD0KKwordGVzdF9tYW55KCkgeworCWk9JDEKKwlmb3IgaiBpbiAkKHNlcSAwIDMpOyBkbworCQlmb3IgayBpbiBjb3JlIGRpc2sgJE1JUlJPUkVEOyBkbworCQkJZm9yIGwgaW4gY29yZSBkaXNrICRNSVJST1JFRDsgZG8KKwkJCQlpZiB0ZXN0ICIkaSIgLWVxICIkaiIgJiYgdGVzdCAiJGsiID0gIiRsIjsgdGhlbiBjb250aW51ZTsgZmkKKwkJCQk6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQk6ICJUZXN0aW5nIG1pcnJvciBjb252ZXJzaW9uIC1tJGkvJGsgLT4gLW0kai8kbCIKKwkJCQk6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl0ZXN0X2x2Y29udmVydCAkaSAkayAkaiAkbCAwCisJCQkJbHZyZW1vdmUgLWZmICR2ZworCQkJCXRlc3RfbHZjb252ZXJ0ICRpICRrICRqICRsIDEKKwkJCQlsdnJlbW92ZSAtZmYgJHZnCisJCQlkb25lCisJCWRvbmUKKwlkb25lCit9CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3ItdXBkb3duLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLXVwZG93bi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M3N2NlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLXVwZG93bi5zaApAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBEZW1vbnN0cmF0ZSBwcm9ibGVtIHdoZW4gdXBjb252ZXJ0aW5nIGFuZCBjdXR0aW5nIGxlZyBpbiBjbHZtZAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMworCit2Z2NyZWF0ZSAtcyA2NGsgJHZnICQoY2F0IERFVklDRVMpCisKK2x2Y3JlYXRlIC1hZXkgLWwxMCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIKKworIyBTbG93IGRvd24gZGV2aWNlIHNvIHdlIGFyZSBhYmxlIHRvIHN0YXJ0IG5leHQgY29udmVyc2lvbiBpbiBwYXJhbGxlbAorYXV4IGRlbGF5X2RldiAiJGRldjMiIDAgMjAwCisKK2x2Y29udmVydCAtbSsxIC1iICR2Zy8kbHYxICIkZGV2MyIKKworIyBUbyBmaXggLSB3YWl0IGhlbHBzIGhlcmUuLi4uCisjbHZjb252ZXJ0ICR2Zy8kbHYxCisKK2x2cyAtYSAkdmcKKworIworIyBJdCBmYWlscyBzbyB1c2UgJ3Nob3VsZCcgYW5kIC12dnZ2IGZvciBub3cKKyMKK3Nob3VsZCBsdmNvbnZlcnQgLXZ2dnYgLW0tMSAkdmcvJGx2MSAiJGRldjIiCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtbWlycm9yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1taXJyb3Iuc2gKQEAgLTAsMCArMSwzMzYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKyMgZGlzYWJsZSBsdm1ldGFkIGxvZ2dpbmcgYXMgaXQgYm9ncyBkb3duIHRlc3Qgc3lzdGVtcworZXhwb3J0IExWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUz0ke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy19CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA1IDIwCisjIHByb3BlciBERVZSQU5HRSBuZWVkcyB0byBiZSBzZXQgYWNjb3JkaW5nIHRvIGV4dGVudCBzaXplCitERVZSQU5HRT0iMC0zMiIKK3ZnY3JlYXRlIC1zIDMyayAkdmcgJChjYXQgREVWSUNFUykKKworIyBjb252ZXJ0IGZyb20gbGluZWFyIHRvIDItd2F5IG1pcnJvciAoIm1pcnJvciIgZGVmYXVsdCB0eXBlKQorbHZjcmVhdGUgLWFleSAtbDIgLW4gJGx2MSAkdmcgIiRkZXYxIgorbHZjb252ZXJ0IC1pMSAtbSsxICR2Zy8kbHYxICIkZGV2MiIgIiRkZXYzOjAtMSIgXAorCS0tY29uZmlnICdnbG9iYWwgeyBtaXJyb3Jfc2VndHlwZV9kZWZhdWx0ID0gIm1pcnJvciIgfScKK2x2cyAtLW5vaGVhZGluZ3MgLW8gYXR0ciAkdmcvJGx2MSB8IGdyZXAgJ15bWzpzcGFjZTpdXSptJworbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgZnJvbSBsaW5lYXIgdG8gMi13YXkgbWlycm9yIChvdmVycmlkZSAicmFpZDEiIGRlZmF1bHQgdHlwZSkKK2x2Y3JlYXRlIC1hZXkgLWwyIC1uICRsdjEgJHZnICIkZGV2MSIKK2x2Y29udmVydCAtaTEgLS10eXBlIG1pcnJvciAtbSsxICR2Zy8kbHYxICIkZGV2MiIgIiRkZXYzOjAtMSIgXAorCS0tY29uZmlnICdnbG9iYWwgeyBtaXJyb3Jfc2VndHlwZV9kZWZhdWx0ID0gInJhaWQxIiB9JworbHZzIC0tbm9oZWFkaW5ncyAtbyBhdHRyICR2Zy8kbHYxIHwgZ3JlcCAnXltbOnNwYWNlOl1dKm0nCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgY29udmVydCBmcm9tIGxpbmVhciB0byAyLXdheSBtaXJyb3IgLSB3aXRoIHRhZ3MgYW5kIHZvbHVtZV9saXN0IChiejY4MzI3MCkKK2x2Y3JlYXRlIC1hZXkgLWwyIC1uICRsdjEgJHZnIC0tYWRkdGFnIGhlbGxvCitsdmNvbnZlcnQgLWkxIC0tdHlwZSBtaXJyb3IgLW0rMSAkdmcvJGx2MSBcCisgICAgLS1jb25maWcgJ2FjdGl2YXRpb24geyB2b2x1bWVfbGlzdCA9IFsgIkBoZWxsbyIgXSB9JworbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgZnJvbSAyLXdheSB0byAzLXdheSBtaXJyb3IgLSB3aXRoIHRhZ3MgYW5kIHZvbHVtZV9saXN0IChiejY4MzI3MCkKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnIC0tYWRkdGFnIGhlbGxvCitsdmNvbnZlcnQgLWkxIC1tKzEgJHZnLyRsdjEgXAorICAgIC0tY29uZmlnICdhY3RpdmF0aW9uIHsgdm9sdW1lX2xpc3QgPSBbICJAaGVsbG8iIF0gfScKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBjb252ZXJ0IGZyb20gMi13YXkgbWlycm9yIHRvIGxpbmVhcgorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzowLTEiCitsdmNvbnZlcnQgLW0tMSAkdmcvJGx2MQorY2hlY2sgbGluZWFyICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisjIGFuZCBub3cgdHJ5IHJlbW92aW5nIGEgc3BlY2lmaWMgbGVnIChiejQ1MzY0MykKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjM6MC0xIgorbHZjb252ZXJ0IC1tMCAkdmcvJGx2MSAiJGRldjIiCitjaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgY29udmVydCBmcm9tIGRpc2tsb2cgdG8gY29yZWxvZywgYWN0aXZlCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzOjAtMSIKK2x2Y29udmVydCAtZiAtLW1pcnJvcmxvZyBjb3JlICR2Zy8kbHYxCitjaGVjayBtaXJyb3IgJHZnICRsdjEgY29yZQorbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgZnJvbSBjb3JlbG9nIHRvIGRpc2tsb2csIGFjdGl2ZQorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIKK2x2Y29udmVydCAtLW1pcnJvcmxvZyBkaXNrICR2Zy8kbHYxICIkZGV2MzowLTEiCitjaGVjayBtaXJyb3IgJHZnICRsdjEgIiRkZXYzIgorbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgbGluZWFyIHRvIDItd2F5IG1pcnJvciB3aXRoIDEgUFYKK2x2Y3JlYXRlIC1hZXkgLWwyIC1uICRsdjEgJHZnICIkZGV2MSIKK25vdCBsdmNvbnZlcnQgLW0rMSAtLW1pcnJvcmxvZyBjb3JlICR2Zy8kbHYxICIkZGV2MSIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBTdGFydCB3LyAzLXdheSBtaXJyb3IKKyMgVGVzdCBwdWxsaW5nIHByaW1hcnkgaW1hZ2UgYmVmb3JlIG1pcnJvciBpbi1zeW5jIChzaG91bGQgZmFpbCkKKyMgVGVzdCBwdWxsaW5nIHByaW1hcnkgaW1hZ2UgYWZ0ZXIgbWlycm9yIGluLXN5bmMgKHNob3VsZCB3b3JrKQorIyBUZXN0IHRoYXQgdGhlIGNvcnJlY3QgZGV2aWNlcyByZW1haW4gaW4gdGhlIG1pcnJvcgorb2Zmc2V0PSQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYyIikKK29mZnNldD0kKCggb2Zmc2V0ICsgMiApKQorIyBwdXQgMSBzaW5nbGUgc2xvd2luZyBkZWxheWVkIHNlY3RvcgorIyB1cGRhdGUgaW4gY2FzZSAgbWlycm9yIGV2ZXIgZ2V0cyBmYXN0ZXIgYW5kIGFsbG93cyBwYXJhbGxlbCByZWFkCithdXggZGVsYXlfZGV2ICIkZGV2MiIgMCAyMDAwICR7b2Zmc2V0fToxCitsdmNyZWF0ZSAtYWV5IC1sNSAtWm4gLVduIC0tdHlwZSBtaXJyb3IgLS1yZWdpb25zaXplIDE2SyAtbTIgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2NCIgIiRkZXYzOiRERVZSQU5HRSIKKyMgRklYTUU6IGFkZCBhIG5ldyBleHBsaWNpdCBvcHRpb24gdG8gZGVmaW5lIHRoZSBwb2xsaW5nIGJlaGF2aW9yCisjIGRvbmUgaGVyZSB3aXRoICdsdmNvbnZlcnQgdmcvbHYnLiAgVGhhdCBvcHRpb24gY2FuIHNwZWNpZnkKKyMgdGhhdCB0aGUgY29tbWFuZCBzdWNjZWVkcyBldmVuIGlmIHRoZSBMViBkb2Vzbid0IG5lZWQgcG9sbGluZy4KK3Nob3VsZCBub3QgbHZjb252ZXJ0IC1tLTEgJHZnLyRsdjEgIiRkZXYxIgorYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorc2hvdWxkIGx2Y29udmVydCAkdmcvJGx2MSAjIHdhaXQKK2x2Y29udmVydCAtbTIgJHZnLyRsdjEgIiRkZXYxIiAiJGRldjIiICIkZGV2NCIgIiRkZXYzOjAiICMgSWYgdGhlIGFib3ZlICJzaG91bGQiIGZhaWxlZC4uLgorCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorbHZjb252ZXJ0IC1tLTEgJHZnLyRsdjEgIiRkZXYxIgorY2hlY2sgbWlycm9yX2ltYWdlc19vbiAkbHYxICIkZGV2MiIgIiRkZXY0IgorbHZjb252ZXJ0IC1tLTEgJHZnLyRsdjEgIiRkZXYyIgorY2hlY2sgbGluZWFyICR2ZyAkbHYxCitjaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjQiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgRklYTUU6IGxvdHMgb2YgdW5uZWVkZWQgZXh0ZW50cyBoZXJlIGZvciBsb2cgLSBpdCBuZWVkcyB0byBiZSBhdCBsZWFzdCByZWdpb25fc2l6ZSBpbiBzaXplCisjIE5vIHBhcmFsbGVsIGx2Y29udmVydHMgb24gYSBzaW5nbGUgTFYgcGxlYXNlCisKK2x2Y3JlYXRlIC1hZXkgLVpuIC1XbiAtbDggLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzowLTgiCitjaGVjayBtaXJyb3IgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDIKKworb2Zmc2V0PSQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXY0IikKK29mZnNldD0kKCggb2Zmc2V0ICsgMiApKQorYXV4IGRlbGF5X2RldiAiJGRldjQiIDAgMjAwMCAke29mZnNldH06CitMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjb252ZXJ0IC1tKzEgLWIgJHZnLyRsdjEgIiRkZXY0IgorCisjIE5leHQgY29udmVydCBzaG91bGQgZmFpbCBiL2Mgd2UgY2FuJ3QgaGF2ZSAyIGF0IG9uY2UKK3Nob3VsZCBub3QgbHZjb252ZXJ0IC1tKzEgJHZnLyRsdjEgIiRkZXY1IgorYXV4IGVuYWJsZV9kZXYgIiRkZXY0Igorc2hvdWxkIGx2Y29udmVydCAkdmcvJGx2MSAjIHdhaXQKK2x2Y29udmVydCAtbTIgJHZnLyRsdjEgIyBJbiBjYXNlIHRoZSBhYm92ZSAic2hvdWxkIiBhY3R1YWxseSBmYWlsZWQKKworY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKK2NoZWNrIG1pcnJvcl9ub190ZW1wb3JhcmllcyAkdmcgJGx2MQorY2hlY2sgbWlycm9yX2xlZ3MgJHZnICRsdjEgMworbHZyZW1vdmUgLWZmICR2ZworCisjIGFkZCAxIG1pcnJvciB0byBjb3JlIGxvZyBtaXJyb3IsIGJ1dAorIyAgaW1wbGljaXRseSBrZWVwIGxvZyBhcyAnY29yZScKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC0tbWlycm9ybG9nIGNvcmUgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNvbnZlcnQgLW0gKzEgLWkxICR2Zy8kbHYxCisKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSBjb3JlCitjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDMKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyByZW1vdmUgMSBtaXJyb3IgZnJvbSBjb3JlbG9nJ2VkIG1pcnJvcjsgc2hvdWxkIHJldGFpbiAnY29yZScgbG9nIHR5cGUKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0yIC0tY29yZWxvZyAtbiAkbHYxICR2ZworbHZjb252ZXJ0IC1tIC0xIC1pMSAkdmcvJGx2MQorCitjaGVjayBtaXJyb3IgJHZnICRsdjEgY29yZQorY2hlY2sgbWlycm9yX25vX3RlbXBvcmFyaWVzICR2ZyAkbHYxCitjaGVjayBtaXJyb3JfbGVncyAkdmcgJGx2MSAyCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgYWRkIDEgbWlycm9yIHRoZW4gYWRkIDEgbW9yZSBtaXJyb3IgZHVyaW5nIGNvbnZlcnNpb24KKyMgRklYTUUgdGhpcyBoYXMgYmVlbiBleHBsaWNpdGx5IGZvcmJpZGRlbj8KKyNsdmNyZWF0ZSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyI6MAorI2x2Y29udmVydCAtbSsxIC1iICR2Zy8kbHYxICIkZGV2NCIKKyNsdmNvbnZlcnQgLW0rMSAkdmcvJGx2MSAiJGRldjUiCisjCisjY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKKyNjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKKyNjaGVjayBtaXJyb3JfbGVncyAkdmcgJGx2MSA0CisjbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgaW5hY3RpdmUgbWlycm9yIGFuZCBzdGFydCBwb2xsaW5nCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzOiRERVZSQU5HRSIKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorbHZjb252ZXJ0IC1tKzEgJHZnLyRsdjEgIiRkZXY0IgorbHZjaGFuZ2UgLWFleSAkdmcvJGx2MQorc2hvdWxkIGx2Y29udmVydCAkdmcvJGx2MSAjIHdhaXQKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCitjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcmVtb3ZhbCBkdXJpbmcgY29udmVyc2lvbgorCisjICJyZW1vdmUgbmV3bHkgYWRkZWQgbWlycm9yIgorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzokREVWUkFOR0UiCitMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjb252ZXJ0IC1tKzEgLWIgJHZnLyRsdjEgIiRkZXY0IgorbHZjb252ZXJ0IC1tLTEgJHZnLyRsdjEgIiRkZXY0Igorc2hvdWxkIGx2Y29udmVydCAkdmcvJGx2MSAjIHdhaXQKKworY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKK2NoZWNrIG1pcnJvcl9ub190ZW1wb3JhcmllcyAkdmcgJGx2MQorY2hlY2sgbWlycm9yX2xlZ3MgJHZnICRsdjEgMgorbHZyZW1vdmUgLWZmICR2ZworCisjICJyZW1vdmUgb25lIG9mIG5ld2x5IGFkZGVkIG1pcnJvcnMiCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzOiRERVZSQU5HRSIKK0xWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBsdmNvbnZlcnQgLW0rMiAtYiAkdmcvJGx2MSAiJGRldjQiICIkZGV2NSIKK2x2Y29udmVydCAtbS0xICR2Zy8kbHYxICIkZGV2NCIKK3Nob3VsZCBsdmNvbnZlcnQgJHZnLyRsdjEgIyB3YWl0CisKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCitjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDMKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAicmVtb3ZlIGZyb20gb3JpZ2luYWwgbWlycm9yICh0aGUgb3JpZ2luYWwgaXMgc3RpbGwgbWlycm9yKSIKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0yIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjUiICIkZGV2MzokREVWUkFOR0UiCitMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjb252ZXJ0IC1tKzEgLWIgJHZnLyRsdjEgIiRkZXY0IgorIyBGSVhNRTogRXh0cmEgd2FpdCBoZXJlIGZvciBtaXJyb3IgdXBjb252ZXJ0IHN5bmNocm9uaXphdGlvbgorIyBvdGhlcndpc2Ugd2UgbWF5IGZhaWwgaGVyIG9uIHBhcmFsbGVsIHVwY29udmVydCBhbmQgZG93bmNvbnZlcnQKKyMgbHZjb252ZXJ0LW1pcnJvci11cGRvd24uc2ggdGVzdHMgdGhpcyBlcnJvcm5vdXMgY2FzZSBzZXBhcmF0ZWx5CitzaG91bGQgbHZjb252ZXJ0ICR2Zy8kbHYxCitsdmNvbnZlcnQgLW0tMSAkdmcvJGx2MSAiJGRldjIiCitzaG91bGQgbHZjb252ZXJ0ICR2Zy8kbHYxCisKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCitjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDMKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAicmVtb3ZlIGZyb20gb3JpZ2luYWwgbWlycm9yICh0aGUgb3JpZ2luYWwgYmVjb21lcyBsaW5lYXIpIgorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzokREVWUkFOR0UiCitMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjb252ZXJ0IC1tKzEgLWIgJHZnLyRsdjEgIiRkZXY0IgorIyBGSVhNRTogRXh0cmEgd2FpdCBoZXJlIGZvciBtaXJyb3IgdXBjb252ZXJ0IHN5bmNocm9uaXphdGlvbgorIyBvdGhlcndpc2Ugd2UgbWF5IGZhaWwgaGVyIG9uIHBhcmFsbGVsIHVwY29udmVydCBhbmQgZG93bmNvbnZlcnQKKyMgbHZjb252ZXJ0LW1pcnJvci11cGRvd24uc2ggdGVzdHMgdGhpcyBlcnJvcm5vdXMgY2FzZSBzZXBhcmF0ZWx5CitzaG91bGQgbHZjb252ZXJ0ICR2Zy8kbHYxCitsdmNvbnZlcnQgLW0tMSAkdmcvJGx2MSAiJGRldjIiCitzaG91bGQgbHZjb252ZXJ0ICR2Zy8kbHYxCisKK2NoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCitjaGVjayBtaXJyb3Jfbm9fdGVtcG9yYXJpZXMgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAicmhiejQ0MDQwNTogbHZjb252ZXJ0IC1tMCBpbmNvcnJlY3RseSBmYWlscyBpZiBhbGwgUEVzIGFsbG9jYXRlZCIKK2x2Y3JlYXRlIC1hZXkgLWwkKHB2cyAtLW5vaGVhZGluZ3MgLW9wZV9jb3VudCAiJGRldjEiKSAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzOiRERVZSQU5HRSIKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdmNvbnZlcnQgLW0wICR2Zy8kbHYxICIkZGV2MSIKK2NoZWNrIGxpbmVhciAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCisjICJyaGJ6MjY0MjQxOiBsdm0gbWlycm9yIGRvZXNuJ3QgbG9zZSBpdCdzICJNIiAtLW5vc3luYyBhdHRyaWJ1dGUKKyMgYWZ0ZXIgYmVpbmcgZG93biBhbmQgdGhlIHVwIGNvbnZlcnRlZCIKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgLS1ub3N5bmMgJHZnCitsdmNvbnZlcnQgLW0wICR2Zy8kbHYxCitsdmNvbnZlcnQgLS10eXBlIG1pcnJvciAtbTEgJHZnLyRsdjEKK2x2cyAtLW5vaGVhZGluZ3MgLW8gYXR0ciAkdmcvJGx2MSB8IGdyZXAgJ15bWzpzcGFjZTpdXSptJworbHZyZW1vdmUgLWZmICR2ZworCisjIGx2Y29udmVydCBmcm9tIGxpbmVhciAob24gbXVsdGlwbGUgUFZzKSB0byBtaXJyb3IKK2x2Y3JlYXRlIC1hZXkgLWwgOCAtbiAkbHYxICR2ZyAiJGRldjE6MC0zIiAiJGRldjI6MC0zIgorbHZjb252ZXJ0IC0tdHlwZSBtaXJyb3IgLXZ2dnYgLW0xICR2Zy8kbHYxCisKK3Nob3VsZCBjaGVjayBtaXJyb3IgJHZnICRsdjEKK2NoZWNrIG1pcnJvcl9sZWdzICR2ZyAkbHYxIDIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBCWiA0NjMyNzI6IGRpc2sgbG9nIG1pcnJvciBjb252ZXJ0IG9wdGlvbiBpcyBsb3N0IGlmIGRvd25jb252ZXJ0IG9wdGlvbiBpcyBhbHNvIGdpdmVuCitsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMiAtLWNvcmVsb2cgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdmNvbnZlcnQgLS10eXBlIG1pcnJvciAtbTEgLS1taXJyb3Jsb2cgZGlzayAkdmcvJGx2MQorY2hlY2sgbWlycm9yICR2ZyAkbHYxCitub3QgY2hlY2sgbWlycm9yICR2ZyAkbHYxIGNvcmUKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAtLS0KKyMgYWRkIG1pcnJvciBhbmQgZGlzayBsb2cKKworIyAiYWRkIDEgbWlycm9yIGFuZCBkaXNrIGxvZyIKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC0tbWlycm9ybG9nIGNvcmUgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiCisKKyMgRklYTUUgb24gbmV4dCBsaW5lLCBzcGVjaWZ5aW5nICRkZXYzOjAgJGRldjQgKGkuZSBsb2cgZGV2aWNlIGZpcnN0KSBmYWlscyAoISkKK2x2Y29udmVydCAtbSsxIC0tbWlycm9ybG9nIGRpc2sgLWkxICR2Zy8kbHYxICIkZGV2NCIgIiRkZXYzOiRERVZSQU5HRSIKKworY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKK2NoZWNrIG1pcnJvcl9ub190ZW1wb3JhcmllcyAkdmcgJGx2MQorY2hlY2sgbWlycm9yX2xlZ3MgJHZnICRsdjEgMworbHZyZW1vdmUgLWZmICR2ZworCisjIHNpbXBsZSBtaXJyb3JlZCBzdHJpcGUKK2x2Y3JlYXRlIC1hZXkgLWkyIC1sMTAgLW4gJGx2MSAkdmcKK2x2Y29udmVydCAtLXR5cGUgbWlycm9yIC1tMSAtaTEgJHZnLyRsdjEKK2x2cmVkdWNlIC1mIC1sMSAkdmcvJGx2MQorbHZleHRlbmQgLWYgLWwxMCAkdmcvJGx2MQorbHZyZW1vdmUgLWZmICR2Zy8kbHYxCisKKyMgZXh0ZW50cyBtdXN0IGJlIGRpdmlzaWJsZQorbHZjcmVhdGUgLWFleSAtbDE1IC1uICRsdjEgJHZnCitub3QgbHZjb252ZXJ0IC0tdHlwZSBtaXJyb3IgLW0xIC0tY29yZWxvZyAtLXN0cmlwZXMgMiAkdmcvJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCit0ZXN0IC1lIExPQ0FMX0NMVk1EICYmIGV4aXQgMAorCisjIEZJWE1FIC0gY2FzZXMgd2hpY2ggbmVlZHMgdG8gYmUgZml4ZWQgdG8gd29yayBpbiBjbHVzdGVyCisjIExpbmVhciB0byBtaXJyb3Igd2l0aCBtaXJyb3JlZCBsb2cgdXNpbmcgLS1hbGxvYyBhbnl3aGVyZQorbHZjcmVhdGUgLWFleSAtbDIgLW4gJGx2MSAkdmcgIiRkZXYxIgorbHZjb252ZXJ0IC0tdHlwZSBtaXJyb3IgLW0gKzEgLS1taXJyb3Jsb2cgbWlycm9yZWQgLS1hbGxvYyBhbnl3aGVyZSAkdmcvJGx2MSAiJGRldjEiICIkZGV2MiIKK3Nob3VsZCBjaGVjayBtaXJyb3IgJHZnICRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBTaG91bGQgbm90IGJlIGFibGUgdG8gYWRkIGltYWdlcyB0byAtLW5vc3luYyBtaXJyb3IKKyMgYnV0IHNob3VsZCBiZSBhYmxlIHRvIGFmdGVyICdsdmNoYW5nZSAtLXJlc3luYycKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC1sMSAtbiAkbHYxICR2ZyAtLW5vc3luYworbm90IGx2Y29udmVydCAtbSArMSAkdmcvJGx2MQorbHZjaGFuZ2UgLWFleSAtLXJlc3luYyAteSAkdmcvJGx2MQorbHZjb252ZXJ0IC1tICsxICR2Zy8kbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC0tY29yZWxvZyAtbDEgLW4gJGx2MSAkdmcgLS1ub3N5bmMKK25vdCBsdmNvbnZlcnQgLW0gKzEgJHZnLyRsdjEKK2x2Y2hhbmdlIC1hZXkgLS1yZXN5bmMgLXkgJHZnLyRsdjEKK2x2Y29udmVydCAtbSArMSAkdmcvJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCisjIEZJWE1FOiBDbHVzdGVyIGV4Y2x1c2l2ZSBhY3RpdmF0aW9uIGRvZXMgbm90IHdvcmsgaGVyZQorIyB1bnN1cmUgd2h5ICBsaWIvbWV0YWRhdGEvbWlycm9yLmMKKyMgaGFzIHRoaXMgY29kZToKKyMKKyMgICAgICAgfSBlbHNlIGlmICh2Z19pc19jbHVzdGVyZWQodmcpKSB7CisjICAgICAgICAgICAgICAgIGxvZ19lcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgdGhlIGxvZyBvZiBhbiBpbmFjdGl2ZSAiCisjICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlciBtaXJyb3IsICVzIiwgbHYtPm5hbWUpOworIyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyMgZGlzYWJsaW5nIHRoaXMgaW4gdGhlIGNvZGUgcGFzc2VzIHRoaXMgdGVzdAorCisjIGJ6MTkyODY1OiBsdmNvbnZlcnQgbG9nIG9mIGFuIGluYWN0aXZlIG1pcnJvciBsdgorIyBjb252ZXJ0IGZyb20gZGlza2xvZyB0byBjb3JlbG9nLCBpbmFjdGl2ZQorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzowLTEiCitsdmNoYW5nZSAtYW4gJHZnLyRsdjEKK2x2Y29udmVydCAteSAtZiAtLW1pcnJvcmxvZyBjb3JlICR2Zy8kbHYxCitjaGVjayBtaXJyb3IgJHZnICRsdjEgY29yZQorbHZyZW1vdmUgLWZmICR2ZworCisjIGNvbnZlcnQgZnJvbSBjb3JlbG9nIHRvIGRpc2tsb2csIGluYWN0aXZlCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW1pcnJvcmxvZyBjb3JlIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIgorbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCitsdmNvbnZlcnQgLS1taXJyb3Jsb2cgZGlzayAkdmcvJGx2MSAiJGRldjM6MC0xIgorY2hlY2sgbWlycm9yICR2ZyAkbHYxICIkZGV2MyIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBiejEyNzIxNzU6IGNoZWNrIGx2Y29udmVydCByZXBvcnRzIHByb2dyZXNzIHdoaWxlIHdhaXRpbmcgZm9yIG1pcnJvcgorIyB0byBnZXQgc3luY2VkCitsdmNyZWF0ZSAtbDIgLW4gJGx2MSAkdmcKK2x2Y29udmVydCAtLXR5cGUgbWlycm9yIC1pMSAtbTEgJHZnLyRsdjEgfCB0ZWUgb3V0CitncmVwIC1lICIkdmcvJGx2MTogQ29udmVydGVkOiIgb3V0IHx8IGRpZSAiTWlzc2luZyBzeW5jIGluZm8gaW4gZm9yZWdyb3VuZCBtb2RlIgorbHZyZW1vdmUgLWZmICR2ZworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1yYWlkLWFsbG9jYXRpb24uc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yYWlkLWFsbG9jYXRpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MjdhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJhaWQtYWxsb2NhdGlvbi5zaApAQCAtMCwwICsxLDc0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfcmFpZCAxIDMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyA1Cit2Z2NyZWF0ZSAtcyAyNTZrICR2ZyAkKGNhdCBERVZJQ0VTKQorCisjIFN0YXJ0IHdpdGggbGluZWFyIG9uIDIgUFYgYW5kIGVuc3VyZSB0aGF0IGNvbnZlcnRpbmcgdG8KKyMgUkFJRCBpcyBub3QgYWxsb3dlZCB0byByZXVzZSBQVnMgZm9yIGRpZmZlcmVudCBpbWFnZXMuICAoQnVnIDExMTMxODApCitsdmNyZWF0ZSAtYWV5IC1sIDQgLW4gJGx2MSAkdmcgIiRkZXYxOjAtMSIgIiRkZXYyOjAtMSIKK25vdCBsdmNvbnZlcnQgLS10eXBlIHJhaWQxIC1tIDEgJHZnLyRsdjEgIiRkZXYxIiAiJGRldjIiCitub3QgbHZjb252ZXJ0IC0tdHlwZSByYWlkMSAtbSAxICR2Zy8kbHYxICIkZGV2MSIgIiRkZXYzOjAtMiIKK2x2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAkdmcvJGx2MSAiJGRldjMiCitsdmNvbnZlcnQgLW0gMCAkdmcvJGx2MQorIyBSQUlEIGNvbnZlcnNpb25zIGFyZSBub3QgaG9ub3JpbmcgYWxsb2NhdGlvbiBwb2xpY3khCisjIGx2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAtLWFsbG9jIGFueXdoZXJlICR2Zy8kbHYxICIkZGV2MSIgIiRkZXYyIgorbHZyZW1vdmUgLWZmICR2ZworCisKKyMgU2V0dXAgMi13YXkgUkFJRDEgTFYsIHNwcmVhZCBhY3Jvc3MgNCBkZXZpY2VzLgorIyBGb3IgZWFjaCBpbWFnZToKKyMgIC0gbWV0YWRhdGEgTFYgKyAxIGltYWdlIGV4dGVudCAoMiB0b3RhbCBleHRlbnRzKSBvbiBvbmUgUFYKKyMgIC0gMiBpbWFnZSBleHRlbnRzIG9uIHRoZSBvdGhlciBQVgorIyBUaGVuIGF0dGVtcHQgYWxsb2NhdGlvbiBvZiBhbm90aGVyIGltYWdlIGZyb20gMiBleHRlbnRzIG9uCisjIGEgNXRoIFBWIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXN0IG9mIGFscmVhZHkgdXNlZCBQVnMuCisjCisjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3BhY2Ugb24gdGhlCisjIG5vbi1wYXJhbGxlbCBQViAoaS5lLiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgaW1hZ2UKKyMgaWYgaXQgZG9lc24ndCBzaGFyZSBhIFBWIHdpdGggYW5vdGhlciBpbWFnZSkuCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtbCAzIC1uICRsdjEgJHZnIFwKKyAgICAiJGRldjE6MC0xIiAiJGRldjI6MC0xIiAiJGRldjM6MC0xIiAiJGRldjQ6MC0xIgorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKyMgU2hvdWxkIG5vdCBiZSBlbm91Z2ggbm9uLW92ZXJsYXBwaW5nIHNwYWNlLgorbm90IGx2Y29udmVydCAtbSArMSAkdmcvJGx2MSBcCisgICAgIiRkZXY1OjAtMSIgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorbHZjb252ZXJ0IC1tICsxICR2Zy8kbHYxICIkZGV2NSIKK2x2Y29udmVydCAtbSAwICR2Zy8kbHYxCisjIFNob3VsZCB3b3JrIGR1ZSB0byAnLS1hbGxvYyBhbnl3aGVyZScKKyMgUkFJRCBjb252ZXJzaW9uIG5vdCBob25vcmluZyBhbGxvY2F0aW9uIHBvbGljeSEKKyNsdmNvbnZlcnQgLW0gKzEgLS1hbGxvYyBhbnl3aGVyZSAkdmcvJGx2MSBcCisjICAgICIkZGV2NTowLTEiICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2x2cmVtb3ZlIC1mZiAkdmcKKworCisjIFNldHVwIDItd2F5IFJBSUQxIExWLCBzcHJlYWQgYWNyb3NzIDQgZGV2aWNlcworIyAgLSBtZXRhZGF0YSBMViArIDEgaW1hZ2UgZXh0ZW50ICgyIHRvdGFsIGV4dGVudHMpIG9uIG9uZSBQVgorIyAgLSAyIGltYWdlIGV4dGVudHMgb24gdGhlIG90aGVyIFBWCisjIEtpbGwgb25lIFBWLiAgVGhlcmUgc2hvdWxkIGJlIGVub3VnaCBzcGFjZSBvbiB0aGUgcmVtYWluaW5nCisjIFBWIGZvciB0aGF0IGltYWdlIHRvIHJlYWxsb2NhdGUgdGhlIGVudGlyZSBpbWFnZSB0aGVyZSBhbmQKKyMgc3RpbGwgbWFpbnRhaW4gcmVkdW5kYW5jeS4KK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDMgLW4gJGx2MSAkdmcgXAorICAgICIkZGV2MTowLTEiICIkZGV2MjowLTEiICIkZGV2MzowLTEiICIkZGV2NDowLTEiCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK2x2Y29udmVydCAtLXJlcGFpciAteSAkdmcvJGx2MSAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorI0ZJWE1FOiBlbnN1cmUgbm9uLW92ZXJsYXBwaW5nIGltYWdlcyAodGhleSBzaG91bGQgbm90IHNoYXJlIFBWcykKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKK2x2cmVtb3ZlIC1mZiAkdmcKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmFpZC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYzRhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJhaWQuc2gKQEAgLTAsMCArMSwyMjAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgZGlzYWJsZSBsdm1ldGFkIGxvZ2dpbmcgYXMgaXQgYm9ncyBkb3duIHRlc3Qgc3lzdGVtcworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUz0ke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy19CisKKy4gbGliL2luaXR0ZXN0CisKK2dldF9pbWFnZV9wdnMoKSB7CisJbG9jYWwgZAorCWxvY2FsIGltYWdlcworCisJaW1hZ2VzPWBkbXNldHVwIGxzIHwgZ3JlcCAkezF9LSR7Mn1fLmltYWdlXy4qIHwgY3V0IC1mMSB8IHNlZCAtZSBzOi06LzpgCisJbHZzIC0tbm9oZWFkaW5ncyAtYSAtbyBkZXZpY2VzICRpbWFnZXMgfCBzZWQgcy9cKC5cKS8vCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1BSU4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDkKK3ZnY3JlYXRlIC1zIDI1NmsgJHZnICQoY2F0IERFVklDRVMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUkFJRDEgY29udmVydCB0ZXN0cworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZm9yIHVuZGVyX3NuYXAgaW4gZmFsc2UgdHJ1ZTsgZG8KK2ZvciBpIGluIDEgMiAzOyBkbworCWZvciBqIGluIDEgMiAzOyBkbworCQlpZiBbICRpIC1lcSAxIF07IHRoZW4KKwkJCWZyb209ImxpbmVhciIKKwkJZWxzZQorCQkJZnJvbT0iJGktd2F5IgorCQlmaQorCQlpZiBbICRqIC1lcSAxIF07IHRoZW4KKwkJCXRvPSJsaW5lYXIiCisJCWVsc2UKKwkJCXRvPSIkai13YXkiCisJCWZpCisKKwkJZWNobyAtbiAiQ29udmVydGluZyBmcm9tICRmcm9tIHRvICR0byIKKwkJaWYgJHVuZGVyX3NuYXA7IHRoZW4KKwkJCWVjaG8gLW4gIiAod2hpbGUgdW5kZXIgYSBzbmFwc2hvdCkiCisJCWZpCisJCWVjaG8KKworCQlpZiBbICRpIC1lcSAxIF07IHRoZW4KKwkJCSMgU2hvdWxkbid0IGJlIGFibGUgdG8gY3JlYXRlIHdpdGgganVzdCAxIGltYWdlCisJCQlub3QgbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDAgLWwgMiAtbiAkbHYxICR2ZworCisJCQlsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJGx2MSAkdmcKKwkJZWxzZQorCQkJbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tICQoKCRpIC0gMSkpIC1sIDIgLW4gJGx2MSAkdmcKKwkJCWF1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCisJCWZpCisKKwkJaWYgJHVuZGVyX3NuYXA7IHRoZW4KKwkJCWx2Y3JlYXRlIC1hZXkgLXMgJHZnLyRsdjEgLW4gc25hcCAtbCAyCisJCWZpCisKKwkJbHZjb252ZXJ0IC1tICQoKGogLSAxKSkgJHZnLyRsdjEKKworCQkjIEZJWE1FOiBlbnN1cmUgbm8gcmVzaWR1YWwgZGV2aWNlcworCisJCWlmIFsgJGogLWVxIDEgXTsgdGhlbgorCQkJY2hlY2sgbGluZWFyICR2ZyAkbHYxCisJCWZpCisJCWx2cmVtb3ZlIC1mZiAkdmcKKwlkb25lCitkb25lCitkb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUkFJRDEgLSBzaG91bGRuJ3QgYmUgYWJsZSB0byBhZGQgaW1hZ2UKKyMgICAgICAgICBpZiBjcmVhdGVkICctLW5vc3luYycsIGJ1dCBzaG91bGQKKyMgICAgICAgICBiZSBhYmxlIHRvIGFmdGVyICdsdmNoYW5nZSAtLXJlc3luYycKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDIgLW4gJGx2MSAkdmcgLS1ub3N5bmMKK25vdCBsdmNvbnZlcnQgLW0gKzEgJHZnLyRsdjEKK2x2Y2hhbmdlIC0tcmVzeW5jIC15ICR2Zy8kbHYxCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorbHZjb252ZXJ0IC1tICsxICR2Zy8kbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgMy13YXkgdG8gMi13YXkgY29udmVydCB3aGlsZSBzcGVjaWZ5aW5nIGRldmljZXMKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAyIC1sIDIgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdmNvbnZlcnQgLW0xICR2Zy8kbHYxICIkZGV2MiIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIworIyBGSVhNRTogQWRkIHRlc3RzIHRoYXQgc3BlY2lmeSBwYXJ0aWN1bGFyIGRldmljZXMgdG8gYmUgcmVtb3ZlZAorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJBSUQxIHNwbGl0IHRlc3RzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDMtd2F5IHRvIDItd2F5L2xpbmVhcgorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDIgLWwgMiAtbiAkbHYxICR2ZworYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC1uICRsdjIgJHZnLyRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MQorY2hlY2sgbGluZWFyICR2ZyAkbHYyCitjaGVjayBhY3RpdmUgJHZnICRsdjIKKyMgRklYTUU6IGVuc3VyZSBubyByZXNpZHVhbCBkZXZpY2VzCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgMi13YXkgdG8gbGluZWFyL2xpbmVhcgorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLWwgMiAtbiAkbHYxICR2ZworYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC1uICRsdjIgJHZnLyRsdjEKK2NoZWNrIGxpbmVhciAkdmcgJGx2MQorY2hlY2sgbGluZWFyICR2ZyAkbHYyCitjaGVjayBhY3RpdmUgJHZnICRsdjIKKyMgRklYTUU6IGVuc3VyZSBubyByZXNpZHVhbCBkZXZpY2VzCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgNC13YXkKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSA0IC1sIDIgLW4gJGx2MSAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdmNvbnZlcnQgLS15ZXMgLS1zcGxpdG1pcnJvcnMgMSAtLW5hbWUgJGx2MiAkdmcvJGx2MSAiJGRldjIiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUkFJRDEgc3BsaXQgKyB0cmFja2NoYW5nZXMgLyBtZXJnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAzLXdheSB0byAyLXdheS9saW5lYXIKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAyIC1sIDIgLW4gJGx2MSAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdmNvbnZlcnQgLS1zcGxpdG1pcnJvcnMgMSAtLXRyYWNrY2hhbmdlcyAkdmcvJGx2MQorY2hlY2sgbHZfZXhpc3RzICR2ZyAkbHYxCitjaGVjayBsaW5lYXIgJHZnICR7bHYxfV9yaW1hZ2VfMgorbHZjb252ZXJ0IC0tbWVyZ2UgJHZnLyR7bHYxfV9yaW1hZ2VfMgorIyBGSVhNRTogZW5zdXJlIG5vIHJlc2lkdWFsIGRldmljZXMKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMaW5lYXIgdG8gUkFJRDEgY29udmVyc2lvbiAoInJhaWQxIiBkZWZhdWx0IHNlZ3R5cGUpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJGx2MSAkdmcKK2x2Y29udmVydCAtbSAxICR2Zy8kbHYxIFwKKwktLWNvbmZpZyAnZ2xvYmFsIHsgbWlycm9yX3NlZ3R5cGVfZGVmYXVsdCA9ICJyYWlkMSIgfScKK2x2cyAtLW5vaGVhZGluZ3MgLW8gYXR0ciAkdmcvJGx2MSB8IGdyZXAgJ15bWzpzcGFjZTpdXSpyJworbHZyZW1vdmUgLWZmICR2ZworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpbmVhciB0byBSQUlEMSBjb252ZXJzaW9uIChvdmVycmlkZSAibWlycm9yIiBkZWZhdWx0IHNlZ3R5cGUpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJGx2MSAkdmcKK2x2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAkdmcvJGx2MSBcCisJLS1jb25maWcgJ2dsb2JhbCB7IG1pcnJvcl9zZWd0eXBlX2RlZmF1bHQgPSAibWlycm9yIiB9JworbHZzIC0tbm9oZWFkaW5ncyAtbyBhdHRyICR2Zy8kbHYxIHwgZ3JlcCAnXltbOnNwYWNlOl1dKnInCitsdnJlbW92ZSAtZmYgJHZnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTXVzdCBub3QgYmUgYWJsZSB0byBjb252ZXJ0IG5vbi1FWCBMVnMgaW4gYSBjbHVzdGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiBbIC1lIExPQ0FMX0NMVk1EIF07IHRoZW4KKwlsdmNyZWF0ZSAtbCAyIC1uICRsdjEgJHZnCisJbm90IGx2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAkdmcvJGx2MSBcCisJCS0tY29uZmlnICdnbG9iYWwgeyBtaXJyb3Jfc2VndHlwZV9kZWZhdWx0ID0gIm1pcnJvciIgfScKKwlsdnJlbW92ZSAtZmYgJHZnCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1pcnJvciB0byBSQUlEMSBjb252ZXJzaW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmb3IgaSBpbiAxIDIgMyA7IGRvCisJbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tICRpIC1sIDIgLW4gJGx2MSAkdmcKKwlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorCWx2Y29udmVydCAtLXR5cGUgcmFpZDEgJHZnLyRsdjEKKwlsdnJlbW92ZSAtZmYgJHZnCitkb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGV2aWNlIFJlcGxhY2VtZW50IFRlc3RpbmcKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUkFJRDE6IFJlcGxhY2UgdXAgdG8gbi0xIGRldmljZXMgLSB0cnlpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucworIyBUZXN0IGZvciAyLXdheSB0byA0LXdheSBSQUlEMSBMVnMKK2ZvciBpIGluIHsxLi4zfTsgZG8KKwlsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gJGkgLWwgMiAtbiAkbHYxICR2ZworCisJZm9yIGogaW4gJChzZXEgJCgoJGkgKyAxKSkpOyBkbyAjIFRoZSBudW1iZXIgb2YgZGV2cyB0byByZXBsYWNlIGF0IG9uY2UKKwlmb3IgbyBpbiAkKHNlcSAwICRpKTsgZG8gICAgICAgICMgVGhlIG9mZnNldCBpbnRvIHRoZSBkZXZpY2UgbGlzdAorCQlyZXBsYWNlPSIiCisKKwkJZGV2aWNlcz0oICQoZ2V0X2ltYWdlX3B2cyAkdmcgJGx2MSkgKQorCisJCWZvciBrIGluICQoc2VxICRqKTsgZG8KKwkJCWluZGV4PSQoKCgkayArICRvKSAlICgkaSArIDEpKSkKKwkJCXJlcGxhY2U9IiRyZXBsYWNlIC0tcmVwbGFjZSAke2RldmljZXNbJGluZGV4XX0iCisJCWRvbmUKKwkJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworCQlpZiBbICRqIC1nZSAkKChpICsgMSkpIF07IHRoZW4KKwkJCSMgQ2FuJ3QgcmVwbGFjZSBhbGwgYXQgb25jZS4KKwkJCW5vdCBsdmNvbnZlcnQgJHJlcGxhY2UgJHZnLyRsdjEKKwkJZWxzZQorCQkJbHZjb252ZXJ0ICRyZXBsYWNlICR2Zy8kbHYxCisJCWZpCisJZG9uZQorCWRvbmUKKworCWx2cmVtb3ZlIC1mZiAkdmcKK2RvbmUKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmFpZDEwLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmFpZDEwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZWFhNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yYWlkMTAuc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitnZXRfaW1hZ2VfcHZzKCkgeworCWxvY2FsIGQKKwlsb2NhbCBpbWFnZXMKKworCWltYWdlcz1gZG1zZXR1cCBscyB8IGdyZXAgJHsxfS0kezJ9Xy5pbWFnZV8uKiB8IGN1dCAtZjEgfCBzZWQgLWUgczotOi86YAorCWx2cyAtLW5vaGVhZGluZ3MgLWEgLW8gZGV2aWNlcyAkaW1hZ2VzIHwgc2VkIHMvXCguXCkvLworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNQUlOCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSQUlEMTA6IENhbiByZXBsYWNlICdjb3BpZXMgLSAxJyBkZXZpY2VzIGZyb20gZWFjaCBzdHJpcGUKKyMgVGVzdHMgYXJlIHJ1biBvbiAyLXdheSBtaXJyb3IsIDMtd2F5IHN0cmlwZSBSQUlEMTAKK2F1eCBoYXZlX3JhaWQgMSAzIDEgfHwgc2tpcAorCisjIDkgUFZzIG5lZWRlZCBmb3IgUkFJRDEwIHRlc3RpbmcgKDMtc3RyaXBlcy8yLW1pcnJvciAtIHJlcGxhY2luZyAzIGRldnMpCithdXggcHJlcGFyZV9wdnMgOSA4MAordmdjcmVhdGUgLXMgMjU2ayAkdmcgJChjYXQgREVWSUNFUykKKworbHZjcmVhdGUgLS10eXBlIHJhaWQxMCAtbSAxIC1pIDMgLWwgMyAtbiAkbHYxICR2ZworYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworIyBDYW4gcmVwbGFjZSBhbnkgc2luZ2xlIGRldmljZQorZm9yIGkgaW4gJChnZXRfaW1hZ2VfcHZzICR2ZyAkbHYxKTsgZG8KKwlsdmNvbnZlcnQgLS1yZXBsYWNlICRpICR2Zy8kbHYxCisJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2RvbmUKKworIyBDYW4ndCByZXBsYWNlIGFkamFjZW50IGRldmljZXMKK2RldmljZXM9KCAkKGdldF9pbWFnZV9wdnMgJHZnICRsdjEpICkKK25vdCBsdmNvbnZlcnQgLS1yZXBsYWNlICR7ZGV2aWNlc1swXX0gLS1yZXBsYWNlICR7ZGV2aWNlc1sxXX0gJHZnLyRsdjEKK25vdCBsdmNvbnZlcnQgLS1yZXBsYWNlICR7ZGV2aWNlc1syXX0gLS1yZXBsYWNlICR7ZGV2aWNlc1szXX0gJHZnLyRsdjEKK25vdCBsdmNvbnZlcnQgLS1yZXBsYWNlICR7ZGV2aWNlc1s0XX0gLS1yZXBsYWNlICR7ZGV2aWNlc1s1XX0gJHZnLyRsdjEKKworIyBDYW4gcmVwbGFjZSBub24tYWRqYWNlbnQgZGV2aWNlcworZm9yIGkgaW4gMCAxOyBkbworCWx2Y29udmVydCBcCisJCS0tcmVwbGFjZSAke2RldmljZXNbJGldfSBcCisJCS0tcmVwbGFjZSAke2RldmljZXNbJCgoJGkgKyAyKSldfSBcCisJCS0tcmVwbGFjZSAke2RldmljZXNbJCgoJGkgKyA0KSldfSBcCisJCSAkdmcvJGx2MQorCWF1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitkb25lCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJhaWQ0NTYuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yYWlkNDU2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTZlNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yYWlkNDU2LnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitnZXRfaW1hZ2VfcHZzKCkgeworCWxvY2FsIGQKKwlsb2NhbCBpbWFnZXMKKworCWltYWdlcz1gZG1zZXR1cCBscyB8IGdyZXAgJHsxfS0kezJ9Xy5pbWFnZV8uKiB8IGN1dCAtZjEgfCBzZWQgLWUgczotOi86YAorCWx2cyAtLW5vaGVhZGluZ3MgLWEgLW8gZGV2aWNlcyAkaW1hZ2VzIHwgc2VkIHMvXCguXCkvLworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNQUlOCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYXV4IHJhaWQ0NTZfcmVwbGFjZV93b3JrcyB8fCBza2lwCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDcgICMgNyBkZXZpY2VzIGZvciAyIGRldiByZXBsYWNlbWVudCBvZiA1LWRldiBSQUlENgordmdjcmVhdGUgLXMgMjU2ayAkdmcgJChjYXQgREVWSUNFUykKKworIyBSQUlEIDQvNS82IChjYW4gcmVwbGFjZSB1cCB0byAncGFyaXR5JyBkZXZpY2VzKQorZm9yIGkgaW4gNCA1IDY7IGRvCisJbHZjcmVhdGUgLS10eXBlIHJhaWQkaSAtaSAzIC1sIDMgLW4gJGx2MSAkdmcKKworCWlmIFsgJGkgLWVxIDYgXTsgdGhlbgorCQlkZXZfY250PTUKKwkJbGltaXQ9MgorCWVsc2UKKwkJZGV2X2NudD00CisJCWxpbWl0PTEKKwlmaQorCisJZm9yIGogaW4gezEuLjN9OyBkbworCWZvciBvIGluICQoc2VxIDAgJGkpOyBkbworCQlyZXBsYWNlPSIiCisKKwkJZGV2aWNlcz0oICQoZ2V0X2ltYWdlX3B2cyAkdmcgJGx2MSkgKQorCisJCWZvciBrIGluICQoc2VxICRqKTsgZG8KKwkJCWluZGV4PSQoKCgkayArICRvKSAlICRkZXZfY250KSkKKwkJCXJlcGxhY2U9IiRyZXBsYWNlIC0tcmVwbGFjZSAke2RldmljZXNbJGluZGV4XX0iCisJCWRvbmUKKwkJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworCQlpZiBbICRqIC1ndCAkbGltaXQgXTsgdGhlbgorCQkJbm90IGx2Y29udmVydCAkcmVwbGFjZSAkdmcvJGx2MQorCQllbHNlCisJCQlsdmNvbnZlcnQgJHJlcGxhY2UgJHZnLyRsdjEKKwkJZmkKKwlkb25lCisJZG9uZQorCisJbHZyZW1vdmUgLWZmICR2ZworZG9uZQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItY2FjaGUuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItY2FjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwNzI4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1jYWNoZS5zaApAQCAtMCwwICsxLDEzMyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0IHJlcGFpcmluZyBvZiBicm9rZW4gY2FjaGVkIExWCisKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK01LRlM9bWtmcy5leHQ0CitGU0NLPWZzY2sKKword2hpY2ggIiRNS0ZTIiB8fCBza2lwCit3aGljaCAiJEZTQ0siIHx8IHNraXAKKworIworIyBNYWluCisjCithdXggaGF2ZV9jYWNoZSAxIDUgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDQKKworI2lmIFsgMSAtZXEgMCBdIDsgdGhlbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyBXUklURVRIUk9VR0ggIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENyZWF0ZSBjYWNoZWQgTFYKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgJHZnL2Nwb29sICIkZGV2MSIKK2x2Y3JlYXRlIC1IIC1MMjAgLS1jYWNoZW1vZGUgd3JpdGV0aHJvdWdoIC1uICRsdjEgJHZnL2Nwb29sICIkZGV2MiIKKworIiRNS0ZTIiAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCitzeW5jCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCisKKyNsdmNoYW5nZSAtYW4gJHZnCisKKyMgQ2hlY2sgaXQgaXMgcHJvbXB0aW5nIGZybyBjb25maXJtYXRpb24KK25vdCBsdmNvbnZlcnQgLS11bmNhY2hlICR2Zy8kbHYxCisjIC0teWVzIHRvIGRyb3Agd2hlbiBDaGVjayBpdHMgcHJvbXB0aW5nCitsdmNvbnZlcnQgLS15ZXMgLS11bmNhY2hlICR2Zy8kbHYxCisKKyIkRlNDSyIgLW4gIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorCithdXggZW5hYmxlX2RldiAiJGRldjEiCisKKyMjIyMjIyMjIyMjIyMjIyMjIworCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtTDEwICR2Zy9jcG9vbCAiJGRldjEiCitsdmNvbnZlcnQgLUggLS1jYWNoZW1vZGUgd3JpdGV0aHJvdWdoIC0tY2FjaGVwb29sICR2Zy9jcG9vbCAtWnkgJGx2MQorCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorCisjIERlYWN0aXZhdGUgYmVmb3JlIHJlbW92ZQorIyBGSVhNRTogaGFuZGxlIHRoaXMgd2hpbGUgTFYgaXMgYWxpdmUKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisjIENoZWNrIGl0IGlzIHByb21wdGluZyBmb3IgY29uZmlybWF0aW9uCitub3QgbHZjb252ZXJ0IC0tdW5jYWNoZSAkdmcvJGx2MQorIyAtLXllcyB0byBkcm9wIHdoZW4gQ2hlY2sgaXRzIHByb21wdGluZworbHZjb252ZXJ0IC0teWVzIC0tdW5jYWNoZSAkdmcvJGx2MQorCisjbHZjb252ZXJ0IC0tcmVwYWlyICR2Zy8kbHYxIC12dnZ2dgorIy8kbHYxCisKKyNsdmNoYW5nZSAtYXkgJHZnCisKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIKKworIyBGSVhNRTogdGVtcG9yYXJ5IHdvcmthcm91bmQKK2x2Y3JlYXRlIC1MMSAtbiAkbHY1ICR2ZworbHZyZW1vdmUgLWZmICR2ZworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIFdSSVRFQkFDSyAjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjZmkKKworIyBDcmVhdGUgY2FjaGVkIExWICBzbyBtZXRhZGF0YSBpcyBvbiBkZXYxIGFuZCBkYXRhIG9uIGRldjIKK2x2Y3JlYXRlIC1MNSAtbiBtZXRhICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtTDEwIC1uIGNwb29sICR2ZyAiJGRldjIiCitsdmNvbnZlcnQgLS15ZXMgLS1wb29sbWV0YWRhdGEgJHZnL21ldGEgIC0tY2FjaGVwb29sICR2Zy9jcG9vbAorCitsdmNyZWF0ZSAtSCAtTDIwIC0tY2FjaGVtb2RlIHdyaXRlYmFjayAtbiAkbHYxICR2Zy9jcG9vbCAiJGRldjMiCisKK2x2cyAtYSAtbytzZWdfcGVfcmFuZ2VzLGNhY2hlbW9kZSAkdmcKKworIiRNS0ZTIiAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCitzeW5jCisKKyMgU2VyaW91c2x5IGRhbWFnZSBjYWNoZSBtZXRhZGF0YQorYXV4IGVycm9yX2RldiAiJGRldjEiIDIwNTQ6MgorCisjIGZsdXNoaW5nIHN0YXR1cworZG1zZXR1cCBzdGF0dXMgJHZnLSRsdjEKKworIyBPbiBmaXhlZCBrZXJuZWwgd2UgZ2V0IGluc3RhbnQgRmFpbCBoZXJlCitnZXQgbHZfZmllbGQgICR2Zy8kbHYxIGx2X2F0dHIgfCB0ZWUgb3V0CitncmVwICJDd2ktYS1DLUYtIiBvdXQgfHwgeworCSMgd2hpbGUgb24gb2xkZXIgdW5maXhlZCB3ZSBqdXN0IG5vdGljZSBuZWVkc19jaGVjaworCWdyZXAgIkN3aS1jLUMtLS0iIG91dAorCXNsZWVwIC4xCisJIyBBbmQgbm93IGNhY2hlIGlzIGZpbmFseSBGYWlsZWQKKwljaGVjayBsdl9hdHRyX2JpdCBoZWFsdGggJHZnLyRsdjEgIkYiCit9CitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBsdl9oZWFsdGhfc3RhdHVzICJmYWlsZWQiCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCisKKyMgQ2hlY2sgaXQgaXMgcHJvbXB0aW5nIGZvciBjb25maXJtYXRpb24KK25vdCBsdmNvbnZlcnQgLS11bmNhY2hlICR2Zy8kbHYxCisjIENoZWNrIC0teWVzIGlzIG5vdCBlbm91Z2h0IHRvIGRyb3Agd3JpdGV0aHJvdWdoIGNhY2hpbmcKK25vdCBsdmNvbnZlcnQgLS15ZXMgLS11bmNhY2hlICR2Zy8kbHYxCisjIC0tZm9yY2UgbmVlZHMgLS15ZXMgdG8gZHJvcCB3aGVuIENoZWNrIGl0cyBwcm9tcHRpbmcKK25vdCBsdmNvbnZlcnQgLS1mb3JjZSAtLXVuY2FjaGUgJHZnLyRsdjEKKworbHZjb252ZXJ0IC0tZm9yY2UgLS15ZXMgLS11bmNhY2hlICR2Zy8kbHYxCisKK25vdCAiJEZTQ0siIC1uICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItZG1ldmVudGQuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItZG1ldmVudGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1NjIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1kbWV2ZW50ZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MiB8fCBza2lwCithdXggbWlycm9yX3JlY292ZXJ5X3dvcmtzIHx8IHNraXAKKworYXV4IHByZXBhcmVfZG1ldmVudGQKK2F1eCBwcmVwYXJlX3ZnIDUKKworbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tIDMgLS1pZ25vcmVtb25pdG9yaW5nIC1MIDEgLW4gNHdheSAkdmcKK2x2Y2hhbmdlIC0tbW9uaXRvciB5ICR2Zy80d2F5CithdXggZGlzYWJsZV9kZXYgIiRkZXYyIiAiJGRldjQiCitta2ZzLmV4dDIgIiRETV9ERVZfRElSLyR2Zy80d2F5Igorc2xlZXAgMTAgIyBGSVhNRTogbmVlZCBhICJwb2xsIiB1dGlsaXR5LCBha2luIHRvICJjaGVjayIKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIgIiRkZXY0IgorY2hlY2sgbWlycm9yICR2ZyA0d2F5CitjaGVjayBtaXJyb3JfbGVncyAkdmcgNHdheSAyCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1taXJyb3Iuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItbWlycm9yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MGY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItbWlycm9yLnNoCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworTUtGUz1ta2ZzLmV4dDMKK01PVU5UX0RJUj1tbnQKKworLiBsaWIvaW5pdHRlc3QKKword2hpY2ggIiRNS0ZTIiB8fCBza3AKKworY2xlYW51cF9tb3VudGVkX2FuZF90ZWFyZG93bigpCit7CisJdW1vdW50ICIkTU9VTlRfRElSIiB8fCB0cnVlCisJYXV4IHRlYXJkb3duCit9CisKK2F1eCBsdm1jb25mICdhbGxvY2F0aW9uL21pcnJvcl9sb2dzX3JlcXVpcmVfc2VwYXJhdGVfcHZzID0gMScKKworYXV4IHByZXBhcmVfdmcgNQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIENoZWNrIGxvc3QgbWlycm9yIGxlZyAjIyMjIyMjIyMjIyMjIyMjIworIworIyBOT1RFOiB1c2luZyAgLS1yZWdpb25zaXplIDFNICBoYXMgIG1ham9yIGltcGFjdCBvbiBteSBib3gKKyMgb24gcmVhZCBwZXJmb3JtYW5jZSB3aGlsZSBtaXJyb3IgaXMgc3luY2hyb25pemVkCisjIHdpdGggdGhlIGRlZmF1bHQgNTEySyAtIG15IEMyRCBUNjEgcmVhZHMganVzdCBjb3VwbGUgTUIvcyEKKyMKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtTDEwIC0tcmVnaW9uc2l6ZSAxTSAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKyIkTUtGUyIgIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorbWtkaXIgIiRNT1VOVF9ESVIiCisKK2F1eCBkZWxheV9kZXYgIiRkZXYyIiAwIDUwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MiIpOgorYXV4IGRlbGF5X2RldiAiJGRldjQiIDAgNTAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXY0Iik6CisjCisjIEVuZm9yY2Ugc3luY3Jvbml6YXRpb24KKyMgQVRNIHJlcXVpcmVzIHVubW91bnRlZC91bnVzZWQgTFY/PworIworbHZjaGFuZ2UgLS15ZXMgLS1yZXN5bmMgJHZnLyRsdjEKK3RyYXAgJ2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24nIEVYSVQKK21vdW50ICIkRE1fREVWX0RJUi8kdmcvJGx2MSIgIiRNT1VOVF9ESVIiCisKKyMgcnVuICdkZCcgb3BlcmF0aW9uIGR1cmluZyBmYWlsdXJlIG9mICdtbG9nL21pbWFnZScgZGV2aWNlCisKK2RkIGlmPS9kZXYvemVybyBvZj1tbnQvemVybyBicz00SyBjb3VudD0xMDAgY29udj1mZGF0YXN5bmMgMj5lcnIgJgorCitQRVJDRU5UPSQoZ2V0IGx2X2ZpZWxkICR2Zy8kbHYxIGNvcHlfcGVyY2VudCkKK1BFUkNFTlQ9JHtQRVJDRU5UJSVcLip9ICAjIGN1dCBkZWNpbWFsCisjIGFuZCBjaGVjayBsZXNzIHRoZW4gNTAlIG1pcnJvciBpcyBpbiBzeW5jIChjb3VsZCBiZSB1bnVzYWJsZSBkZWxheV9kZXYgPykKK3Rlc3QgIiRQRVJDRU5UIiAtbHQgNTAgfHwgc2tpcAorI2x2cyAtYSAtbytkZXZpY2VzICR2ZworCisjYXV4IGRpc2FibGVfZGV2ICIkZGV2MyIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiCisKK2x2Y29udmVydCAtLXllcyAtLXJlcGFpciAkdmcvJGx2MQorbHZzIC1hICR2ZworCithdXggZW5hYmxlX2RldiAiJGRldjIiCisKK3dhaXQKKyMgZGQgTUFZIE5PVCBIQVZFIHByb2R1Y2VkIGFueSBlcnJvciBtZXNzYWdlCitub3QgZ3JlcCBlcnJvciBlcnIKKworbHZzIC1hIC1vK2RldmljZXMgJHZnCit1bW91bnQgIiRNT1VOVF9ESVIiCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKKworYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorbHZyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXBvbGljeS5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1wb2xpY3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmNWYxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1wb2xpY3kuc2gKQEAgLTAsMCArMSw5NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDQKK2F1eCBsdm1jb25mICdhbGxvY2F0aW9uL21heGltaXNlX2NsaW5nID0gMCcgXAorCSAgICAnYWxsb2NhdGlvbi9taXJyb3JfbG9nc19yZXF1aXJlX3NlcGFyYXRlX3B2cyA9IDEnCisKKyMgQ2xlYW4tdXAgYW5kIGNyZWF0ZSBhIDItd2F5IG1pcnJvciwgd2hlcmUgdGhlIHRoZQorIyBsZWcgZGV2aWNlcyBhcmUgYWx3YXlzIG9uICRkZXZbMTJdIGFuZCB0aGUgbG9nCisjIGlzIGFsd2F5cyBvbiAkZGV2My4gICgkZGV2NCBiZWhhdmVzIGFzIGEgc3BhcmUpCitjbGVhbnVwXygpIHsKKwl2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCisJZm9yIGQgaW4gIiRAIjsgZG8gYXV4IGVuYWJsZV9kZXYgIiRkIjsgZG9uZQorCWZvciBkIGluICIkQCI7IGRvIHZnZXh0ZW5kICR2ZyAiJGQiOyBkb25lCisJbHZyZW1vdmUgLWZmICR2Zy9taXJyb3IKKwlsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMSAtLWlnbm9yZW1vbml0b3JpbmcgLWwgMiAtbiBtaXJyb3IgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjM6MCIKK30KKworcmVwYWlyXygpIHsKKwlsdmNvbnZlcnQgLS1yZXBhaXIgLS11c2UtcG9saWNpZXMgLS1jb25maWcgIiQxIiAkdmcvbWlycm9yCit9CisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC0taWdub3JlbW9uaXRvcmluZyAtbCAyIC1uIG1pcnJvciAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MzowIgorbHZjaGFuZ2UgLWEgbiAkdmcvbWlycm9yCisKKyMgRmFpbCBhIGxlZyBvZiBhIG1pcnJvci4KK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitsdmNoYW5nZSAtLXBhcnRpYWwgLWFleSAkdmcvbWlycm9yCityZXBhaXJfICdhY3RpdmF0aW9uIHsgbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeSA9ICJyZW1vdmUiIH0nCitjaGVjayBsaW5lYXIgJHZnIG1pcnJvcgorY2xlYW51cF8gIiRkZXYxIgorCisjIEZhaWwgYSBsZWcgb2YgYSBtaXJyb3IuCisjIEV4cGVjdGVkIHJlc3VsdDogTWlycm9yIChsZWcgcmVwbGFjZWQsIHNob3VsZCByZXRhaW4gbG9nKQorYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK3JlcGFpcl8gJ2FjdGl2YXRpb24geyBtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5ID0gInJlcGxhY2UiIG1pcnJvcl9sb2dfZmF1bHRfcG9saWN5ID0gInJlbW92ZSIgfScKK2NoZWNrIG1pcnJvciAkdmcgbWlycm9yCitjaGVjayBhY3RpdmUgJHZnIG1pcnJvcl9tbG9nCitjbGVhbnVwXyAiJGRldjEiCisKKyMgRmFpbCBhIGxlZyBvZiBhIG1pcnJvci4KKyMgRXhwZWN0ZWQgcmVzdWx0OiBNaXJyb3IgKGxlZyByZXBsYWNlZCkKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCityZXBhaXJfICdhY3RpdmF0aW9uIHsgbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeSA9ICJyZXBsYWNlIiB9JworY2hlY2sgbWlycm9yICR2ZyBtaXJyb3IKK2NoZWNrIGFjdGl2ZSAkdmcgbWlycm9yX21sb2cKK2NsZWFudXBfICIkZGV2MSIKKworIyBGYWlsIGEgbGVnIG9mIGEgbWlycm9yICh1c2Ugb2xkIG5hbWUgZm9yIHBvbGljeSBzcGVjaWZpY2F0aW9uKQorIyBFeHBlY3RlZCByZXN1bHQ6IE1pcnJvciAobGVnIHJlcGxhY2VkKQorYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK3JlcGFpcl8gJ2FjdGl2YXRpb24geyBtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5ID0gInJlcGxhY2UiIH0nCitjaGVjayBtaXJyb3IgJHZnIG1pcnJvcgorY2hlY2sgYWN0aXZlICR2ZyBtaXJyb3JfbWxvZworbm90IHB2ZGlzcGxheSAkdmcKK2NsZWFudXBfICIkZGV2MSIKKworIyBGYWlsIGEgbGVnIG9mIGEgbWlycm9yIHcvIG5vIGF2YWlsYWJsZSBzcGFyZQorIyBFeHBlY3RlZCByZXN1bHQ6IGxpbmVhcgorIyAgICAgICAgICAgICAgICAgIChvciAyLXdheSB3aXRoIGxlZy9sb2cgb3ZlcmxhcCBpZiBhbGxvYyBhbnl3aGVyZSkKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiICIkZGV2NCIKK3JlcGFpcl8gJ2FjdGl2YXRpb24geyBtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5ID0gInJlcGxhY2UiIH0nCitjaGVjayBtaXJyb3IgJHZnIG1pcnJvcgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgbWlycm9yX21sb2cKK2NsZWFudXBfICIkZGV2MiIgIiRkZXY0IgorCisjIEZhaWwgdGhlIGxvZyBkZXZpY2Ugb2YgYSBtaXJyb3Igdy8gbm8gYXZhaWxhYmxlIHNwYXJlCisjIEV4cGVjdGVkIHJlc3VsdDogbWlycm9yIHcvIGNvcmVsb2cKK2F1eCBkaXNhYmxlX2RldiAiJGRldjMiICIkZGV2NCIKK3JlcGFpcl8gJ2FjdGl2YXRpb24geyBtaXJyb3JfaW1hZ2VfZmF1bHRfcG9saWN5ID0gInJlcGxhY2UiIH0nICR2Zy9taXJyb3IKK2NoZWNrIG1pcnJvciAkdmcgbWlycm9yCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZyBtaXJyb3JfbWxvZworY2xlYW51cF8gIiRkZXYzIiAiJGRldjQiCisKKyMgRmFpbCB0aGUgbG9nIGRldmljZSB3aXRoIGEgcmVtb3ZlIHBvbGljeQorIyBFeHBlY3RlZCByZXN1bHQ6IG1pcnJvciB3LyBjb3JlbG9nCitsdmNoYW5nZSAtYWV5ICR2Zy9taXJyb3IKK2F1eCBkaXNhYmxlX2RldiAiJGRldjMiICIkZGV2NCIKK3JlcGFpcl8gJ2FjdGl2YXRpb24geyBtaXJyb3JfbG9nX2ZhdWx0X3BvbGljeSA9ICJyZW1vdmUiIH0nCitjaGVjayBtaXJyb3IgJHZnIG1pcnJvciBjb3JlCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZyBtaXJyb3JfbWxvZworY2xlYW51cF8gIiRkZXYzIiAiJGRldjQiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1yYWlkLWRtZXZlbnRkLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXJhaWQtZG1ldmVudGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5ZTk5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1yYWlkLWRtZXZlbnRkLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKword2hpY2ggbWtmcy5leHQzIHx8IHNraXAKK2F1eCBoYXZlX3JhaWQgMSAzIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9kbWV2ZW50ZAorYXV4IHByZXBhcmVfdmcgNQorCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSByYWlkMSAtbSAzIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIDR3YXkgJHZnCitsdmNoYW5nZSAtLW1vbml0b3IgeSAkdmcvNHdheQorbHZzIC1hIC1vIGFsbCxsdl9tb2R1bGVzICR2ZworbHZkaXNwbGF5IC0tbWFwcyAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyA0d2F5CithdXggZGlzYWJsZV9kZXYgIiRkZXYyIiAiJGRldjQiCitta2ZzLmV4dDMgIiRETV9ERVZfRElSLyR2Zy80d2F5Igorc2xlZXAgMTAgIyBGSVhNRTogbmVlZCBhICJwb2xsIiB1dGlsaXR5LCBha2luIHRvICJjaGVjayIKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIgIiRkZXY0IgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItcmFpZC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1yYWlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjkxYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItcmFpZC5zaApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX3JhaWQgMSAzIDAgfHwgc2tpcAorYXV4IHJhaWQ0NTZfcmVwbGFjZV93b3JrcyB8fCBza2lwCisKK2F1eCBsdm1jb25mICdhbGxvY2F0aW9uL21heGltaXNlX2NsaW5nID0gMCcgXAorCSAgICAnYWxsb2NhdGlvbi9taXJyb3JfbG9nc19yZXF1aXJlX3NlcGFyYXRlX3B2cyA9IDEnCisKK2F1eCBwcmVwYXJlX3ZnIDgKKworIyBJdCdzIHBvc3NpYmxlIHNtYWxsIHJhaWQgYXJyYXlzIGRvIGhhdmUgcHJvYmxlbXMgd2l0aCByZXBvcnRpbmcgaW4tc3luYy4KKyMgU28gdHJ5IGJpZ2dlciBzaXplCitSQUlEX1NJWkU9NjQKKworIyBSQUlENSBzaW5nbGUgcmVwbGFjZQorbHZjcmVhdGUgLS10eXBlIHJhaWQ1IC1pIDIgLUwgJFJBSURfU0laRSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2F1eCBkaXNhYmxlX2RldiAiJGRldjMiCitsdmNvbnZlcnQgLXkgLS1yZXBhaXIgJHZnLyRsdjEKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MyIKK3ZnZXh0ZW5kICR2ZyAiJGRldjMiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgUkFJRDYgZG91YmxlIHJlcGxhY2UKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNiAtaSAzIC1MICRSQUlEX1NJWkUgLW4gJGx2MSAkdmcgXAorICAgICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2F1eCBkaXNhYmxlX2RldiAiJGRldjQiICIkZGV2NSIKK2x2Y29udmVydCAteSAtLXJlcGFpciAkdmcvJGx2MQordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorYXV4IGVuYWJsZV9kZXYgIiRkZXY1IgordmdleHRlbmQgJHZnICIkZGV2NCIgIiRkZXY1IgordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXJlcGxhY2Uuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItcmVwbGFjZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQ0NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXJlcGxhY2Uuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyA2CithdXggbHZtY29uZiAnYWxsb2NhdGlvbi9tYXhpbWlzZV9jbGluZyA9IDAnIFwKKwkgICAgJ2FsbG9jYXRpb24vbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMgPSAxJworCisjIDMtd2F5LCBkaXNrIGxvZworIyBtdWx0aXBsZSBmYWlsdXJlcywgZnVsbCByZXBsYWNlCitsdmNyZWF0ZSAtYWV5IC0tbWlycm9ybG9nIGRpc2sgLS10eXBlIG1pcnJvciAtbSAyIC0taWdub3JlbW9uaXRvcmluZyAtLW5vc3luYyAtTCAxIC1uIDN3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCI6MC0xCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIiAiJGRldjIiCitsdmNvbnZlcnQgLXkgLS1yZXBhaXIgJHZnLzN3YXkgMj4mMSB8IHRlZSAzd2F5Lm91dAorbHZzIC1hIC1vICtkZXZpY2VzICR2ZyB8IG5vdCBncmVwIHVua25vd24KK25vdCBncmVwICJXQVJOSU5HOiBGYWlsZWQiIDN3YXkub3V0Cit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCitjaGVjayBtaXJyb3IgJHZnIDN3YXkKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIgIiRkZXYyIgordmdyZW1vdmUgLWZmICR2ZworCisjIDMtd2F5LCBkaXNrIGxvZworIyBtdWx0aXBsZSBmYWlsdXJlcywgcGFydGlhbCByZXBsYWNlCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCitsdmNyZWF0ZSAtYWV5IC0tbWlycm9ybG9nIGRpc2sgLS10eXBlIG1pcnJvciAtbSAyIC0taWdub3JlbW9uaXRvcmluZyAtLW5vc3luYyAtTCAxIC1uIDN3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiICIkZGV2MiIKK2x2Y29udmVydCAteSAtLXJlcGFpciAkdmcvM3dheSAyPiYxIHwgdGVlIDN3YXkub3V0CitncmVwICJXQVJOSU5HOiBGYWlsZWQiIDN3YXkub3V0CitsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgbm90IGdyZXAgdW5rbm93bgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworY2hlY2sgbWlycm9yICR2ZyAzd2F5CithdXggZW5hYmxlX2RldiAiJGRldjEiICIkZGV2MiIKK3ZncmVtb3ZlIC1mZiAkdmcKKwordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitsdmNyZWF0ZSAtYWV5IC0tbWlycm9ybG9nIGRpc2sgLS10eXBlIG1pcnJvciAtbSAxIC0taWdub3JlbW9uaXRvcmluZyAtLW5vc3luYyAtbCAxIC1uIDJ3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorbHZjb252ZXJ0IC15IC0tcmVwYWlyICR2Zy8yd2F5IDI+JjEgfCB0ZWUgMndheS5vdXQKK2dyZXAgIldBUk5JTkc6IEZhaWxlZCIgMndheS5vdXQKK2x2cyAtYSAtbyArZGV2aWNlcyAkdmcgfCBub3QgZ3JlcCB1bmtub3duCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCitjaGVjayBtaXJyb3IgJHZnIDJ3YXkKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIgIiRkZXYyIgordmdyZW1vdmUgLWZmICR2ZworCisjIEZJWE1FICAtIGV4Y2x1c2l2ZSBhY3RpdmF0aW9uIGZvciBtaXJyb3JzIHNob3VsZCB3b3JrIGhlcmUKKyMgY29udmVyc2lvbiBvZiBpbmFjdGl2ZSBjbHVzdGVyIGxvZ3MgaXMgYWxzbyB1bnN1cHBvcnRlZAordGVzdCAtZSBMT0NBTF9DTFZNRCAmJiBleGl0IDAKKworCisjIFRlc3QgcmVwYWlyIG9mIGluYWN0aXZlIG1pcnJvciB3aXRoIGxvZyBmYWlsdXJlCisjICBSZXBsYWNlbWVudCBzaG91bGQgZmFpbCwgYnV0IGNvbnZlcnQgc2hvdWxkIHN1Y2NlZWQgKHN3aXRjaCB0byBjb3JlbG9nKQordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAyIC0taWdub3JlbW9uaXRvcmluZyAtbCAyIC1uIG1pcnJvcjIgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCI6MAordmdjaGFuZ2UgLWEgbiAkdmcKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjQiCitsdmNvbnZlcnQgLXkgLS1yZXBhaXIgJHZnL21pcnJvcjIKK2NoZWNrIG1pcnJvciAkdmcgbWlycm9yMgordmdzICR2ZwordmdyZW1vdmUgLWZmICR2ZworCitpZiBhdXgga2VybmVsX2F0X2xlYXN0IDMgMCAwOyB0aGVuCisJIyAyLXdheSwgbWlycm9yZWQgbG9nCisJIyBEb3VibGUgbG9nIGZhaWx1cmUsIGZ1bGwgcmVwbGFjZQorCXZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IgorCWx2Y3JlYXRlIC1hZXkgLS1taXJyb3Jsb2cgbWlycm9yZWQgLS10eXBlIG1pcnJvciAtbSAxIC0taWdub3JlbW9uaXRvcmluZyAtLW5vc3luYyAtTCAxIC1uIDJ3YXkgJHZnIFwKKwkgICAgIiRkZXYxIiAiJGRldjIiICIkZGV2MyI6MCAiJGRldjQiOjAKKwlhdXggZGlzYWJsZV9kZXYgIiRkZXYzIiAiJGRldjQiCisJbHZjb252ZXJ0IC15IC0tcmVwYWlyICR2Zy8yd2F5IDI+JjEgfCB0ZWUgMndheS5vdXQKKwlsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgbm90IGdyZXAgdW5rbm93bgorCW5vdCBncmVwICJXQVJOSU5HOiBGYWlsZWQiIDJ3YXkub3V0CisJdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworCWNoZWNrIG1pcnJvciAkdmcgMndheQorCWF1eCBlbmFibGVfZGV2ICIkZGV2MyIgIiRkZXY0IgorCXZncmVtb3ZlIC1mZiAkdmcKK2ZpCisKKyMgMy13YXksIG1pcnJvcmVkIGxvZworIyBTaW5nbGUgbG9nIGZhaWx1cmUsIHJlcGxhY2UKK3ZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IgorbHZjcmVhdGUgLWFleSAtLW1pcnJvcmxvZyBtaXJyb3JlZCAtLXR5cGUgbWlycm9yIC1tIDIgLS1pZ25vcmVtb25pdG9yaW5nIC0tbm9zeW5jIC1MIDEgLW4gM3dheSAkdmcgXAorICAgICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCI6MCAiJGRldjUiOjAKK2F1eCBkaXNhYmxlX2RldiAiJGRldjQiCitsdmNvbnZlcnQgLXkgLS1yZXBhaXIgJHZnLzN3YXkgMj4mMSB8IHRlZSAzd2F5Lm91dAorbHZzIC1hIC1vICtkZXZpY2VzICR2ZyB8IG5vdCBncmVwIHVua25vd24KK25vdCBncmVwICJXQVJOSU5HOiBGYWlsZWQiIDN3YXkub3V0Cit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCitjaGVjayBtaXJyb3IgJHZnIDN3YXkKK2F1eCBlbmFibGVfZGV2ICIkZGV2NCIKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1zbmFwc2hvdC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci1zbmFwc2hvdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjk1NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXNuYXBzaG90LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNQorYXV4IGx2bWNvbmYgJ2FsbG9jYXRpb24vbWF4aW1pc2VfY2xpbmcgPSAwJyBcCisJICAgICdhbGxvY2F0aW9uL21pcnJvcl9sb2dzX3JlcXVpcmVfc2VwYXJhdGVfcHZzID0gMScKKworbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tIDMgLS1pZ25vcmVtb25pdG9yaW5nIC1MIDJNIC1uIDR3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IjowCitsdmNyZWF0ZSAtcyAkdmcvNHdheSAtTCAyTSAtbiBzbmFwCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiICIkZGV2NCIKK2VjaG8gbiB8IGx2Y29udmVydCAtLXJlcGFpciAkdmcvNHdheSAyPiYxIHwgdGVlIDR3YXkub3V0CitsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgbm90IGdyZXAgdW5rbm93bgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYyIiAiJGRldjQiCitsdnMgLWEgLW8gK2RldmljZXMgJHZnCitjaGVjayBtaXJyb3IgJHZnIDR3YXkgIiRkZXY1IgorCit2Z2NoYW5nZSAtYW4gJHZnCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItdGhpbi1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXRoaW4tcmFpZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWZjZWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXRoaW4tcmFpZC5zaApAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgcmVwYWlyaW5nIG9mIGJyb2tlbiB0aGluIHBvb2wgb24gcmFpZAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCithdXggaGF2ZV9yYWlkIDEgNCAwIHx8IHNraXAKKworIworIyBUbyBjb250aW51ZSB0aGlzIHRlc3QgLSB3ZSBuZWVkIHJlYWwgdG9vbHMgYXZhaWxhYmxlCisjIFdoZW4gdGhleSBhcmUgbm90IHByZXNlbnQgbWFyayB0ZXN0IGFzIHNraXBwZWQsIGJ1dCBzdGlsbAorIyBsZXQgcHJvY2VlZCBpbml0aWFsIHBhcnQgd2hpY2ggc2hvdWxkIHdvcmsgZXZlbiB3aXRob3V0IHRvb2xzCisjCithdXggaGF2ZV90b29sX2F0X2xlYXN0ICIkTFZNX1RFU1RfVEhJTl9DSEVDS19DTUQiIDAgMyAxIHx8IHNraXAKK2F1eCBoYXZlX3Rvb2xfYXRfbGVhc3QgIiRMVk1fVEVTVF9USElOX0RVTVBfQ01EIiAwIDMgMSB8fCBza2lwCithdXggaGF2ZV90b29sX2F0X2xlYXN0ICIkTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EIiAwIDMgMSB8fCBza2lwCisKKyMKKyMgTWFpbgorIworCithdXggcHJlcGFyZV92ZyA0CisKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtTDEgLW4gcG9vbCAkdmcKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtTDIgLW4gbWV0YSAkdmcKKyMgcmFpZCBfdGRhdGEgJiBfdG1ldGEKK2x2Y29udmVydCAteSAtLXRoaW5wb29sICR2Zy9wb29sIC0tcG9vbG1ldGFkYXRhICR2Zy9tZXRhCisKK2x2Y3JlYXRlIC1WMUcgJHZnL3Bvb2wKKworIyBQb29sIGhhcyB0byBiZSBpbmFjdGl2ZSAoQVRNKSBmb3IgcmVwYWlyCitmYWlsIGx2Y29udmVydCAteSAtLXJlcGFpciAkdmcvcG9vbCAiJGRldjMiCisKK2x2Y2hhbmdlIC1hbiAkdmcKKworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfdG1ldGEgbHZfcm9sZSAicHJpdmF0ZSx0aGluLHBvb2wsbWV0YWRhdGEiCisKK2x2Y29udmVydCAteSAtLXJlcGFpciAkdmcvcG9vbCAiJGRldjMiCisKK2x2cyAtYSAtbytkZXZpY2VzLHNlZ19wZV9yYW5nZXMscm9sZSxsYXlvdXQgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF9tZXRhMCBsdl9yb2xlICJwdWJsaWMiCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF9tZXRhMCBsdl9sYXlvdXQgInJhaWQscmFpZDEiCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF90bWV0YSBsdl9sYXlvdXQgImxpbmVhciIKK2NoZWNrIGx2X29uICR2ZyBwb29sX3RtZXRhICIkZGV2MSIKKworIyBIbW0gbmFtZSBpcyBnZW5lcmF0ZWQgaW4gb3JkZXIKK1NQQVJFPSQobHZzIC0tbm9oZWFkaW5ncyAtYSAtLXNlbGVjdCAibmFtZT1+X3Btc3BhcmUiIC1vIG5hbWUgJHZnKQorU1BBUkU9JHtTUEFSRSMjKlt9CitTUEFSRT0ke1NQQVJFJSVdKn0KKworY2hlY2sgbHZfb24gJHZnICRTUEFSRSAiJGRldjMiCisKK2x2Y2hhbmdlIC1heSAkdmcKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXRoaW4uc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItdGhpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTMwODk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXRoaW4uc2gKQEAgLTAsMCArMSwxMDQgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0IHJlcGFpcmluZyBvZiBicm9rZW4gdGhpbiBwb29sIG1ldGFkYXRhCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBta2ZzLmV4dDIgfHwgc2tpcAorCisjCisjIE1haW4KKyMKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyA0CisKKyMgQ3JlYXRlIExWCisjIFRPRE86IGludmVzdGlnYXRlIHByb2JsZW0gd2l0aCAtLXplcm8gbiBhbmQgbXkgcmVwYWlyYWJsZSBkYW1hZ2UgdHJpY2sKKyNsdmNyZWF0ZSAtVCAtTDIwIC1WMTAgLW4gJGx2MSAkdmcvcG9vbCAtLWRpc2NhcmRzIGlnbm9yZSAtLXplcm8gbiAtLWNodW5rc2l6ZSAxMjggIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtVCAtTDIwIC1WMTAgLW4gJGx2MSAkdmcvcG9vbCAtLWNodW5rc2l6ZSAxMjggLS1kaXNjYXJkcyBpZ25vcmUgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtVCAtVjEwIC1uICRsdjIgJHZnL3Bvb2wKKworbWtmcy5leHQyICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK21rZnMuZXh0MiAiJERNX0RFVl9ESVIvJHZnLyRsdjIiCisKK2x2Y3JlYXRlIC1MMjAgLW4gcmVwYWlyICR2ZworbHZjcmVhdGUgLUwyIC1uIGZpeGVkICR2ZworCitsdnMgLWEgLW8rc2VnX3BlX3JhbmdlcyAkdmcKKyNhdXggZXJyb3JfZGV2ICIkZGV2MiIgMjA1MDoxCisKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MiAkdmcvJGx2MSAkdmcvcG9vbCAkdmcvcmVwYWlyCisKKyMgTWFudWFsIHJlcGFpciBzdGVwczoKKyMgVGVzdCBzd2FwcGluZyAtIHN3YXAgb3V0IHRoaW4tcG9vbCdzIG1ldGFkYXRhIHdpdGggb3VyIHJlcGFpciB2b2x1bWUKK2x2Y29udmVydCAteSAtZiAtLXBvb2xtZXRhZGF0YSAkdmcvcmVwYWlyIC0tdGhpbnBvb2wgJHZnL3Bvb2wKKworbHZjaGFuZ2UgLWF5ICR2Zy9yZXBhaXIKKworIworIyBUbyBjb250aW51ZSB0aGlzIHRlc3QgLSB3ZSBuZWVkIHJlYWwgdG9vbHMgYXZhaWxhYmxlCisjIFdoZW4gdGhleSBhcmUgbm90IHByZXNlbnQgbWFyayB0ZXN0IGFzIHNraXBwZWQsIGJ1dCBzdGlsbAorIyBsZXQgcHJvY2VlZCBpbml0aWFsIHBhcnQgd2hpY2ggc2hvdWxkIHdvcmsgZXZlbiB3aXRob3V0IHRvb2xzCisjCithdXggaGF2ZV90b29sX2F0X2xlYXN0ICIkTFZNX1RFU1RfVEhJTl9DSEVDS19DTUQiIDAgMyAxIHx8IHNraXAKK2F1eCBoYXZlX3Rvb2xfYXRfbGVhc3QgIiRMVk1fVEVTVF9USElOX0RVTVBfQ01EIiAwIDMgMSB8fCBza2lwCithdXggaGF2ZV90b29sX2F0X2xlYXN0ICIkTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EIiAwIDMgMSB8fCBza2lwCisKKyMgTWFrZSBzb21lICdyZXBhaXJhYmxlJyBkYW1hZ2U/PworZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi8kdmcvcmVwYWlyIiBicz0xIHNlZWs9NDA5NjAgY291bnQ9MQorCitub3QgIiRMVk1fVEVTVF9USElOX0NIRUNLX0NNRCIgIiRETV9ERVZfRElSLyR2Zy9yZXBhaXIiCisKK25vdCAiJExWTV9URVNUX1RISU5fRFVNUF9DTUQiICIkRE1fREVWX0RJUi8kdmcvcmVwYWlyIiB8IHRlZSBkdW1wCisKKyIkTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EIiAtaSAiJERNX0RFVl9ESVIvJHZnL3JlcGFpciIgLW8gIiRETV9ERVZfRElSLyR2Zy9maXhlZCIKKworIiRMVk1fVEVTVF9USElOX0RVTVBfQ01EIiAtLXJlcGFpciAiJERNX0RFVl9ESVIvJHZnL3JlcGFpciIgfCB0ZWUgcmVwYWlyZWRfeG1sCisKKyIkTFZNX1RFU1RfVEhJTl9DSEVDS19DTUQiICIkRE1fREVWX0RJUi8kdmcvZml4ZWQiCisKK2x2Y2hhbmdlIC1hbiAkdmcKKworIyBTd2FwIHJlcGFpcmVkIG1ldGFkYXRhIGJhY2sKK2x2Y29udmVydCAteSAtZiAtLXBvb2xtZXRhZGF0YSAkdmcvZml4ZWQgLS10aGlucG9vbCAkdmcvcG9vbAorCisjIENoZWNrIHBvb2wgc3RpbGwgcHJlc2VydmVzIGl0cyBvcmlnaW5hbCBzZXR0aW5ncworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgY2h1bmtzaXplICIxMjguMDBrIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgZGlzY2FyZHMgImlnbm9yZSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIHplcm8gInplcm8iCisKKyMgQWN0aXZhdGUgcG9vbCAtIHRoaXMgc2hvdWxkIG5vdyB3b3JrCit2Z2NoYW5nZSAtYXkgJHZnCisKK3ZnY2hhbmdlIC1hbiAkdmcKKworIyBQdXQgYmFjayAnYnJva2VuJyBtZXRhZGF0YQorbHZjb252ZXJ0IC15IC1mIC0tcG9vbG1ldGFkYXRhICR2Zy9yZXBhaXIgLS10aGlucG9vbCAkdmcvcG9vbAorCisjIENoZWNrIC0tcmVwYWlyIHVzYWdlCitsdmNvbnZlcnQgLXYgLS1yZXBhaXIgJHZnL3Bvb2wKKworIyBDaGVjayByZXBhaXJlZCBwb29sIGNvdWxkIGJlIGFjdGl2YXRlZAorbHZjaGFuZ2UgLWF5ICR2Zy9wb29sCisKK3ZnY2hhbmdlIC1hbiAkdmcKKworIyBSZXN0b3JlIGRhbWFnZWQgbWV0YWRhdGEKK2x2Y29udmVydCAteSAtZiAtLXBvb2xtZXRhZGF0YSAkdmcvcG9vbF9tZXRhMCAtLXRoaW5wb29sICR2Zy9wb29sCisKKyMgQ2hlY2sgbHZyZW1vdmUgLWZmIHdvcmtzIGV2ZW4gd2l0aCBkYW1hZ2VkIHBvb2wKK2x2cmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci10cmFuc2llbnQtZG1ldmVudGQuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItdHJhbnNpZW50LWRtZXZlbnRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Yzc2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC1yZXBhaXItdHJhbnNpZW50LWRtZXZlbnRkLnNoCkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZG1ldmVudGQKK2F1eCBtaXJyb3JfcmVjb3Zlcnlfd29ya3MgfHwgc2tpcAorYXV4IHByZXBhcmVfdmcgNQorCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMyAtLWlnbm9yZW1vbml0b3JpbmcgLUwgMSAtbiA0d2F5ICR2ZworbHZjaGFuZ2UgLS1tb25pdG9yIHkgJHZnLzR3YXkKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiICIkZGV2NCIKK21rZnMuZXh0MyAiJERNX0RFVl9ESVIvJHZnLzR3YXkiCithdXggZW5hYmxlX2RldiAiJGRldjIiICIkZGV2NCIKK3NsZWVwIDMKK2x2cyAtYSAtbyArZGV2aWNlcyAkdmcgfCB0ZWUgb3V0Citub3QgZ3JlcCB1bmtub3duIG91dAorY2hlY2sgbWlycm9yICR2ZyA0d2F5CitjaGVjayBtaXJyb3JfbGVncyAkdmcgNHdheSAyCitsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgdGVlIG91dAorbm90IGdyZXAgbWltYWdlXzEgb3V0CitsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgdGVlIG91dAorbm90IGdyZXAgbWltYWdlXzMgb3V0CisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLXRyYW5zaWVudC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci10cmFuc2llbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3YWU0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci10cmFuc2llbnQuc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggbWlycm9yX3JlY292ZXJ5X3dvcmtzIHx8IHNraXAKK2F1eCBwcmVwYXJlX3ZnIDUKKworIyBvcmRpbmFyeSBtaXJyb3JzCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAzIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIDR3YXkgJHZnCithdXggd2FpdF9mb3Jfc3luYyAkdmcgNHdheQorYXV4IGRpc2FibGVfZGV2IC0tZXJyb3IgLS1zaWxlbnQgIiRkZXYyIiAiJGRldjQiCitta2ZzLmV4dDMgIiRETV9ERVZfRElSLyR2Zy80d2F5IiAmCitzbGVlcCAxCitkbXNldHVwIHN0YXR1cworZWNobyBuIHwgbHZjb252ZXJ0IC0tcmVwYWlyICR2Zy80d2F5IDI+JjEgfCB0ZWUgNHdheS5vdXQKK2F1eCBlbmFibGVfZGV2IC0tc2lsZW50ICIkZGV2MiIgIiRkZXY0IgorCitsdnMgLWEgLW8gK2RldmljZXMgJHZnIHwgdGVlIG91dAorbm90IGdyZXAgdW5rbm93biBvdXQKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2NoZWNrIG1pcnJvciAkdmcgNHdheQorbHZjaGFuZ2UgLWEgbiAkdmcvNHdheQord2FpdAorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXJlcGFpci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E3ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtcmVwYWlyLnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCityZWNyZWF0ZV92Z18oKQoreworCXZncmVtb3ZlIC1mZiAkdmcKKwl2Z2NyZWF0ZSAkdmcgIiRAIiAkKGNhdCBERVZJQ0VTKQorfQorCitfY2hlY2tfbWxvZygpCit7CisJbHZzIC1hIC1vICtkZXZpY2VzICR2ZyB8IHRlZSBvdXQKKwlub3QgZ3JlcCB1bmtub3duIG91dAorCW5vdCBncmVwIG1sb2cgb3V0CisJZG1zZXR1cCBscyB8IGdyZXAgJFBSRUZJWCB8IHRlZSBvdXQKKwlub3QgZ3JlcCBtbG9nIG91dAorfQorCithdXggbHZtY29uZiAiYWxsb2NhdGlvbi9tYXhpbWlzZV9jbGluZyA9IDAiIFwKKwkgICAgImFsbG9jYXRpb24vbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMgPSAxIgorCisjIGZhaWwgbXVsdGlwbGUgZGV2aWNlcworCisjIDQtd2F5LCBkaXNrIGxvZyA9PiAyLXdheSwgZGlzayBsb2cKK2F1eCBwcmVwYXJlX3ZnIDgKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAzIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIDR3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IjowCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIiAiJGRldjQiCitlY2hvIG4gfCBsdmNvbnZlcnQgLS1yZXBhaXIgJHZnLzR3YXkgMj4mMSB8IHRlZSA0d2F5Lm91dAorbHZzIC1hIC1vICtkZXZpY2VzICR2ZyB8IG5vdCBncmVwIHVua25vd24KK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIgIiRkZXY0IgorY2hlY2sgbWlycm9yICR2ZyA0d2F5ICIkZGV2NSIKKworIyAzLXdheSwgZGlzayBsb2cgPT4gbGluZWFyCityZWNyZWF0ZV92Z18KK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAyIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIDN3YXkgJHZnCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIiAiJGRldjIiCitlY2hvIG4gfCBsdmNvbnZlcnQgLS1yZXBhaXIgJHZnLzN3YXkKK2NoZWNrIGxpbmVhciAkdmcgM3dheQorX2NoZWNrX21sb2cKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgbGluZWFyICR2ZyAzd2F5CisKKyMgZmFpbCBqdXN0IGxvZyBhbmQgZ2V0IGl0IHJlbW92ZWQKKworIyAzLXdheSwgZGlzayBsb2cgPT4gMy13YXksIGNvcmUgbG9nCityZWNyZWF0ZV92Z18KK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAyIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIDN3YXkgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCI6MAorYXV4IGRpc2FibGVfZGV2ICIkZGV2NCIKK2VjaG8gbiB8IGx2Y29udmVydCAtLXJlcGFpciAkdmcvM3dheQorY2hlY2sgbWlycm9yICR2ZyAzd2F5IGNvcmUKK19jaGVja19tbG9nCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCithdXggZW5hYmxlX2RldiAiJGRldjQiCisKKyMgMy13YXksIG1pcnJvcmVkIGxvZyA9PiAzLXdheSwgY29yZSBsb2cKK3JlY3JlYXRlX3ZnXyAtYyBuCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMiAtLW1pcnJvcmxvZyBtaXJyb3JlZCAtLWlnbm9yZW1vbml0b3JpbmcgLUwgMSAtbiAzd2F5ICR2ZyBcCisgICAgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IjowICIkZGV2NSI6MAorYXV4IGRpc2FibGVfZGV2ICIkZGV2NCIgIiRkZXY1IgorZWNobyBuIHwgbHZjb252ZXJ0IC0tcmVwYWlyICR2Zy8zd2F5CitjaGVjayBtaXJyb3IgJHZnIDN3YXkgY29yZQorX2NoZWNrX21sb2cKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2NCIgIiRkZXY1IgorCisjIDItd2F5LCBkaXNrIGxvZyA9PiAyLXdheSwgY29yZSBsb2cKK3JlY3JlYXRlX3ZnXworbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tIDEgLS1pZ25vcmVtb25pdG9yaW5nIC1MIDEgLW4gMndheSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyI6MAorYXV4IGRpc2FibGVfZGV2ICIkZGV2MyIKK2VjaG8gbiB8IGx2Y29udmVydCAtLXJlcGFpciAkdmcvMndheQorY2hlY2sgbWlycm9yICR2ZyAyd2F5IGNvcmUKK19jaGVja19tbG9nCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCithdXggZW5hYmxlX2RldiAiJGRldjMiCisKKyMgZmFpbCBzaW5nbGUgZGV2aWNlcworCityZWNyZWF0ZV92Z18KK3ZncmVkdWNlICR2ZyAiJGRldjQiCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC0taWdub3JlbW9uaXRvcmluZyAtTCAxIC1uIG1pcnJvciAkdmcKK2x2Y2hhbmdlIC1hIG4gJHZnL21pcnJvcgordmdleHRlbmQgJHZnICIkZGV2NCIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitsdmNoYW5nZSAtLXBhcnRpYWwgLWFleSAkdmcvbWlycm9yCisKK25vdCB2Z3JlZHVjZSAtdiAtLXJlbW92ZW1pc3NpbmcgJHZnCitsdmNvbnZlcnQgLXkgLS1yZXBhaXIgJHZnL21pcnJvcgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworCithdXggZW5hYmxlX2RldiAiJGRldjEiCit2Z2V4dGVuZCAkdmcgIiRkZXYxIgorYXV4IGRpc2FibGVfZGV2ICIkZGV2MiIKK2x2Y29udmVydCAteSAtLXJlcGFpciAkdmcvbWlycm9yCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCisKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIKK3ZnZXh0ZW5kICR2ZyAiJGRldjIiCithdXggZGlzYWJsZV9kZXYgIiRkZXYzIgorbHZjb252ZXJ0IC15IC0tcmVwYWlyICR2Zy9taXJyb3IKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAkdmcKK2F1eCBlbmFibGVfZGV2ICIkZGV2MyIKK3ZnZXh0ZW5kICR2ZyAiJGRldjMiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXNuYXBzaG90LnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtc25hcHNob3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MzU2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXNuYXBzaG90LnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgVGVzdCB2YXJpb3VzIHN1cHBvcnRlZCBjb252ZXJzaW9uIG9mIHNuYXBzaG90CisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMQorCit2Z2NyZWF0ZSAtcyAxayAkdmcgJChjYXQgREVWSUNFUykKKworbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1WNTAgLUwxIC1uICRsdjEgLXMgJHZnCisKK2x2Y3JlYXRlIC1hZXkgLUwxIC1uICRsdjIgJHZnCitsdmNyZWF0ZSAtTDEgLXMgLW4gJGx2MyAkdmcvJGx2MgorCitsdmNyZWF0ZSAtbDEgLW4gJGx2NCAkdmcKK2x2Y3JlYXRlIC1MMSAtbiAkbHY1ICR2ZworbHZjcmVhdGUgLUwxIC1uICRsdjYgJHZnCisKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjEgJHZnL25vdF9leGlzdAorCisjIENhbid0IGNvbnZlcnQgdG8gc25hcHNob3Qgb2Ygb3JpZ2luCitub3QgbHZjb252ZXJ0IC1zICR2Zy8kbHYxICR2Zy8kbHYyCitub3QgbHZjb252ZXJ0IC1zICR2Zy8kbHYyICR2Zy8kbHYxCitub3QgbHZjb252ZXJ0IC1zICR2Zy8kbHY1ICR2Zy8kbHYxCisKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjUgJHZnLyRsdjIKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjUgJHZnLyRsdjMKKworIyBDYW4ndCBiZSBpdHNlbGYKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjEgJHZnLyRsdjEKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjIgJHZnLyRsdjIKKworIyBDYW4ndCBjb252ZXJ0IHNuYXBzaG90IHRvIHNuYXBzaG90Citub3QgbHZjb252ZXJ0IC1zICR2Zy8kbHYxICR2Zy8kbHYzCitub3QgbHZjb252ZXJ0IC1zICR2Zy8kbHYyICR2Zy8kbHYzCisKKyMgQ2FuJ3QgbWFrZSBhIHJlYWwgTFYgc25hcHNob3Qgb2YgdmlydHVhbCAnemVybycgc25hcHNob3QKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjEgJHZnLyRsdjQKKworIyBDaGVjayBtaW5pbXVtIHNpemUKK25vdCBsdmNvbnZlcnQgLXMgJHZnLyRsdjIgJHZnLyRsdjQgMj4mMSB8IHRlZSBlcnIKK2dyZXAgInNtYWxsZXIiIGVycgorCisjIFRoaXMgc2hvdWxkIHBhc3MKK2x2Y29udmVydCAtLXllcyAtcyAkdmcvJGx2MiAkdmcvJGx2NQorbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBzbmFwc2hvdCAkdmcvJGx2MiAkdmcvJGx2NgorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXRoaW4tZXh0ZXJuYWwuc2ggYi90ZXN0L3NoZWxsL2x2Y29udmVydC10aGluLWV4dGVybmFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC10aGluLWV4dGVybmFsLnNoCkBAIC0wLDAgKzEsMTc5IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgY29udmVyc2lvbiB0byB0aGluIGV4dGVybmFsIG9yaWdpbgorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBta2ZzLmV4dDIgfHwgc2tpcAord2hpY2ggZnNjayB8fCBza2lwCisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDUgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyIDY0CisKK3ZnY3JlYXRlICR2ZyAtLW1ldGFkYXRhc2l6ZSAxMjhLIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCitpZiB0ZXN0IDAgLWVxIDEgOyB0aGVuCisjIEZJWE1FOiBuZWVkcyBwYXRjaCB0byBhbGxvdyBpbmFjdGl2ZSBvbGQtc25hcCBjcmVhdGlvbgorbHZjcmVhdGUgLWwxMCAtVCAkdmcvcG9vbAorbHZjcmVhdGUgLWFuIC1wciAtLXplcm8gbiAtbDEwIC0tbmFtZSAkbHYxICR2ZworbHZjcmVhdGUgLXMgJHZnLyRsdjEgLS1uYW1lICRsdjIgLS10aGlucG9vbCAkdmcvcG9vbAordmdjaGFuZ2UgLWFuICR2ZworIyBvbGRzdHlsZSByZWFkLW9ubHkgaW5hY3RpdmUgc25hcHNob3QKK2x2Y3JlYXRlIC1hbiAtcyAkdmcvJGx2MiAtbDEwIC1wIHIgLS1uYW1lICRsdjMKKworbHZjcmVhdGUgLXMgJHZnLyRsdjMgLS1uYW1lICRsdjQgLS10aGlucG9vbCAkdmcvcG9vbAorbHZyZW1vdmUgLWZmICR2Zy8kbHYzCisKK2x2cmVtb3ZlIC1mZiAkdmcKK2ZpCisKKyNsdmNyZWF0ZSAtTDIwTSAtLW5hbWUgb3JpZyAkdmcKKyNsdmNvbnZlcnQgLVQgIC0tdGhpbnBvb2wgJHZnL3Bvb2wgJHZnL29yaWcKKyNsdmNyZWF0ZSAtcyAtYWV5IC1MMTBNICR2Zy9vcmlnCisjbHZyZW1vdmUgLWYgJHZnCisjZXhpdCAwCisKK2x2Y3JlYXRlIC1sMTAgLVQgJHZnL3Bvb2wKKyMgQ2FuJ3QgY29udmVydCBwb29sIHRvIGV4dGVybmFsIG9yaWdpbgorbHZjcmVhdGUgLWwxMCAtVCAkdmcvcG9vbDEgLWMgMTkyaworbm90IGx2Y29udmVydCAtVCAtLXRoaW5wb29sICR2Zy9wb29sMSAkdmcvcG9vbCAtLW9yaWdpbm5hbWUgb3JpZ2luCisjIENyZWF0ZSBwb29sMSBjaHVua19zaXplIHVuYWxpZ25lZCBMViBhbmQgY2hlY2sgZmFpbGluZyBjb252ZXJzaW9uCitsdmNyZWF0ZSAtbDIgLW4gJGx2MSAkdmcKKyMgTmV3ZXIgdGhpbi1wb29sIHRhcmdldCAoPj0gMS4xMykgc3VwcG9ydHMgdW5hbGlnbmVkIGV4dGVybmFsIG9yaWdpbgorYXV4IGx2bWNvbmYgJ2dsb2JhbC90aGluX2Rpc2FibGVkX2ZlYXR1cmVzID0gWyAiZXh0ZXJuYWxfb3JpZ2luX2V4dGVuZCIgXScKK25vdCBsdmNvbnZlcnQgLVQgLS10aGlucG9vbCAkdmcvcG9vbDEgJHZnLyRsdjEKKworbHZyZW1vdmUgLWYgJHZnL3Bvb2wxICR2Zy8kbHYxCisKKyMgY3JlYXRlIHBsYWluIExWICh3aWxsIGJlIHVzZWQgZm9yIGV4dGVybmFsIG9yaWdpbikKK2x2Y3JlYXRlIC1MOE0gLW4gJGx2MSAkdmcKKworIyBDYW4ndCBjb252ZXJ0IHNhbWUgTFYgdG8gdGhlIHRoaW4gcG9vbCBhbmQgdGhpbiB2b2x1bWUKK25vdCBsdmNvbnZlcnQgLS10aGlucG9vbCAkdmcvJGx2MSAtVCAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgc2VndHlwZSBsaW5lYXIKKworbWtmcy5leHQyICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK21rZGlyIG1udAorbW91bnQgIiRETV9ERVZfRElSLyR2Zy8kbHYxIiBtbnQKKworZGQgaWY9L2Rldi96ZXJvIG9mPW1udC90ZXN0MSBicz0xTSBjb3VudD0xCisKKyMgY29udmVydCBwbGFpbiBMViBpbnRvIHRoaW4gZXh0ZXJuYWwgc25hcHNob3Qgdm9sdW1lCisjIGR1cmluZyBjb252ZXJzaW9uIGRkIGFib3ZlIGNvdWxkIGJlIHN0aWxsIGZsdXNoZWQKKworbHZjb252ZXJ0IC1UIC0tb3JpZ2lubmFtZSBleHRvcmcgLS10aGlucG9vbCAkdmcvcG9vbCAkdmcvJGx2MQorCitjaGVjayBhY3RpdmUgJHZnICRsdjEKKyMgRklYTUUgIGhhbmRsaW5nIGF0dHIgaXMgLi4uCitnZXQgbHZfZmllbGQgJHZnL2V4dG9yZyBhdHRyIHwgZ3JlcCAiXm9yaSIKK2NoZWNrIGluYWN0aXZlICR2ZyBleHRvcmcKKwordG91Y2ggbW50L3Rlc3QKK3Vtb3VudCBtbnQKKworIyBjaGVjayBmcyBpcyB3aXRob3V0IGVycm9ycworZnNjayAtbiAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCisKK2x2Y2hhbmdlIC1hZXkgJHZnL2V4dG9yZworbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCisKK2NoZWNrIGFjdGl2ZSAkdmcgZXh0b3JnCitjaGVjayBpbmFjdGl2ZSAkdmcgJGx2MQorCisjIGZzY2sgaW4gcmVhZC1vbmx5IG1vZGUKK2ZzY2sgLW4gIiRETV9ERVZfRElSLyR2Zy9leHRvcmciCisKK25vdCBsdnJlc2l6ZSAtbCs4ICR2Zy9leHRvcmcKK25vdCBsdnJlc2l6ZSAtbC00ICR2Zy9leHRvcmcKK25vdCBsdmNoYW5nZSAtcCBydyAkdmcvZXh0b3JnCisKKyNsdnJlc2l6ZSAtTCs4TSAkdmcvJGx2MQorI2x2cmVzaXplIC1MLTRNICR2Zy8kbHYxCisjbHZjaGFuZ2UgLXAgciAkdmcvJGx2MQorI2x2Y2hhbmdlIC1wIHJ3ICR2Zy8kbHYxCisKK2x2Y2hhbmdlIC1hZXkgJHZnCisKK2x2cyAtYSAtbytvcmlnaW5fc2l6ZSxzZWdfc2l6ZSAkdmcKKworIyBDaGFpbiBleHRlcm5hbCBvcmlnaW5zCitsdmNvbnZlcnQgLS10eXBlIHRoaW4gLS1vcmlnaW5uYW1lIGV4dG9yZzEgLS10aGlucG9vbCAkdmcvcG9vbCAkdmcvZXh0b3JnCitjaGVjayBpbmFjdGl2ZSAkdmcgZXh0b3JnMQorCitsdmNvbnZlcnQgLS1vcmlnaW5uYW1lIGV4dG9yZzIgLS10aGlucG9vbCAkdmcvcG9vbCAtVCAkdmcvZXh0b3JnMQorY2hlY2sgaW5hY3RpdmUgJHZnIGV4dG9yZzEKK2NoZWNrIGluYWN0aXZlICR2ZyBleHRvcmcyCisKK2x2Y2hhbmdlIC1hbiAkdmcvZXh0b3JnCitsdmNoYW5nZSAtYXkgJHZnL2V4dG9yZzEKKworbHZjcmVhdGUgLWw0IC1zICR2Zy8kbHYxICAtbiAkbHYyCitsdmNyZWF0ZSAtbDggLXMgJHZnL2V4dG9yZyAtbiAkbHYzCitsdmNyZWF0ZSAtbDEyIC1zICR2Zy9leHRvcmcxIC1uICRsdjQKK2x2Y3JlYXRlIC1sMTYgLXMgJHZnL2V4dG9yZzIgLW4gJGx2NQorI3ZnY2hhbmdlIC1hZXkgJHZnCisjbHZyZW1vdmUgLWYgJHZnL2V4dG9yZzIKKyNleGl0IDAKKyMgQ29udmVydGluZyBvbGQtc25hcHNob3QgaW50byBleHRlcm5hbCBvcmlnaW4gaXMgbm90IHN1cHBvcnRlZAorbm90IGx2Y29udmVydCAtVCAtLXRoaW5wb29sICR2Zy9wb29sIC0tb3JpZ2lubmFtZSBsdjVvcmlnaW4gJHZnLyRsdjQKKworbHZzIC1hIC1vICtzZWd0eXBlICR2ZworCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlIHRoaW4KK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIHNlZ3R5cGUgbGluZWFyCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MyBzZWd0eXBlIGxpbmVhcgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjQgc2VndHlwZSBsaW5lYXIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHY1IHNlZ3R5cGUgbGluZWFyCitjaGVjayBsdl9maWVsZCAkdmcvZXh0b3JnIHNlZ3R5cGUgdGhpbgorY2hlY2sgbHZfZmllbGQgJHZnL2V4dG9yZzEgc2VndHlwZSB0aGluCitjaGVjayBsdl9maWVsZCAkdmcvZXh0b3JnMiBzZWd0eXBlIGxpbmVhcgorCit2Z2NoYW5nZSAtYXkgJHZnCisKK2x2cyAtYSAtbytvcmlnaW5fc2l6ZSxzZWdfc2l6ZSAkdmcKKworbHZjaGFuZ2UgLWFuICR2Zy9leHRvcmcyCitjaGVjayBpbmFjdGl2ZSAkdmcgZXh0b3JnMgorCisjIFJlbW92ZSBhbGwgdm9sdW1lcyBkZXBlbmRlbnQgb24gZXh0ZXJuYWwgb3JpZ2luCitsdnMgLWEgLW8rb3JpZ2luX3NpemUsc2VnX3NpemUsc2VndHlwZSAkdmcKK2x2cmVtb3ZlIC1mICR2Zy9leHRvcmcyCisjIE9ubHkgcG9vbCBpcyBsZWZ0CitjaGVjayB2Z19maWVsZCAkdmcgbHZfY291bnQgMQorbHZyZW1vdmUgLWZmICR2ZworCisjIFRlc3QgY29udmVyc2lvbiB0byB0aGUgcG9vbCBhbmQgdGhpbiBleHRlcm5hbCBhdCB0aGUgc2FtZSB0aW1lIChyaGJ6ICMxMDAzNDYxKQorbHZjcmVhdGUgLWw1MCAtbiBwb29sICR2ZworbHZjcmVhdGUgLWwxMDAgLW4gdGhpbiAkdmcKK2x2Y29udmVydCAtLXllcyAtLXRoaW4gLS10aGlucG9vbCAkdmcvcG9vbCAkdmcvdGhpbiAtLW9yaWdpbm5hbWUgdGhpbi1vcmlnaW4KK2NoZWNrIGx2X2ZpZWxkICR2Zy90aGluIHNlZ3R5cGUgdGhpbgorY2hlY2sgbHZfZmllbGQgJHZnL3RoaW4tb3JpZ2luIHNlZ3R5cGUgbGluZWFyCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgVGVzdCBjb252ZXJzaW9uIHdpdGggbm9uLXplcm9pbmcgdGhpbi1wb29sLCBzaG91bGQgbm90IFdBUk4gYWJvdXQgemVyb2luZworbHZjcmVhdGUgLWw1MCAtbiBwb29sICR2ZworbHZjcmVhdGUgLWwxMDAgLW4gdGhpbiAkdmcKK2x2Y29udmVydCAtLXllcyAtLXRoaW4gLS10aGlucG9vbCAkdmcvcG9vbCAkdmcvdGhpbiAtLXplcm8gbiAtLW9yaWdpbm5hbWUgdGhpbi1vcmlnaW4gMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICJub3QgemVyb2VkIiBvdXQKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIHplcm8gIiIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtdGhpbi1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmNvbnZlcnQtdGhpbi1yYWlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTg3MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y29udmVydC10aGluLXJhaWQuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKK2F1eCBoYXZlX3JhaWQgMSA0IDAgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyA0CisKKyMgY3JlYXRlIFJBSUQgTFZzIGZvciBkYXRhIGFuZCBtZXRhZGF0YSB2b2x1bWVzCitsdmNyZWF0ZSAtYWV5IC1MMTBNIC0tdHlwZSByYWlkMSAtbTMgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1hZXkgLUw4TSAtLXR5cGUgcmFpZDEgLW0zIC1uICRsdjIgJHZnCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjIKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisjIGNvbnZlcnNpb24gZmFpbHMgZm9yIGludGVybmFsIHZvbHVtZXMKK2ludmFsaWQgbHZjb252ZXJ0IC0tdGhpbnBvb2wgJHZnLyR7bHYxfV9yaW1hZ2VfMAoraW52YWxpZCBsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJHtsdjJ9X3JpbWFnZV8wCisKK2x2Y29udmVydCAtLXllcyAtLXRoaW5wb29sICR2Zy8kbHYxIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyCisKK2x2Y2hhbmdlIC1heSAkdmcKKworbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIDEgLS1uYW1lIGRhdGEyICR2Zy8ke2x2MX1fdGRhdGEgIiRkZXYyIgorbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIDEgLS1uYW1lIGRhdGEzICR2Zy8ke2x2MX1fdGRhdGEgIiRkZXYzIgorbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIDEgLS10cmFja2NoYW5nZXMgJHZnLyR7bHYxfV90ZGF0YSAiJGRldjQiCisKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC0tbmFtZSBtZXRhMSAkdmcvJHtsdjF9X3RtZXRhICIkZGV2MSIKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC0tbmFtZSBtZXRhMiAkdmcvJHtsdjF9X3RtZXRhICIkZGV2MiIKK2x2Y29udmVydCAtLXNwbGl0bWlycm9ycyAxIC0tdHJhY2tjaGFuZ2VzICR2Zy8ke2x2MX1fdG1ldGEgIiRkZXY0IgorCitsdnJlbW92ZSAtZmYgJHZnL2RhdGEyICR2Zy9kYXRhMyAkdmcvbWV0YTEgJHZnL21ldGEyCisKK2x2Y29udmVydCAtLW1lcmdlICR2Zy8ke2x2MX1fdGRhdGFfcmltYWdlXzEKK2x2Y29udmVydCAtLW1lcmdlICR2Zy8ke2x2MX1fdG1ldGFfcmltYWdlXzEKKworbHZjb252ZXJ0IC1tKzEgJHZnLyR7bHYxfV90ZGF0YSAiJGRldjIiCitsdmNvbnZlcnQgLW0rMSAkdmcvJHtsdjF9X3RtZXRhICIkZGV2MSIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtdGhpbi5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXRoaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5OWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXRoaW4uc2gKQEAgLTAsMCArMSwxNTQgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK3ByZXBhcmVfbHZzKCkgeworCWx2cmVtb3ZlIC1mICR2ZworCWx2Y3JlYXRlIC1MMTBNIC1uICRsdjEgJHZnCisJbHZjcmVhdGUgLUw4TSAtbiAkbHYyICR2ZworfQorCisjCisjIE1haW4KKyMKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgNCA2NAorCisjIGJ1aWxkIG9uZSBsYXJnZSBQVgordmdjcmVhdGUgJHZnMSAkKGhlYWQgLW4gMyBERVZJQ0VTKQorCisjIDMyYml0IGxpbnV4IGtlcm5lbHMgYXJlIGZyYWdpbGxlIHdpdGggZGV2aWNlIHNpemUgPj0gMTZUCisjIG1heWJlICB1bmFtZSAtbSAgICBbIHg4Nl82NCB8IGk2ODYgXQorVFNJWkU9NjRUCithdXggY2FuX3VzZV8xNlQgfHwgVFNJWkU9MTVUCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLWwgMTAwJUZSRUUgLW4gJGx2ICR2ZzEgLS12aXJ0dWFsc2l6ZSAkVFNJWkUKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKKworcHZjcmVhdGUgIiRETV9ERVZfRElSLyR2ZzEvJGx2IgordmdjcmVhdGUgJHZnIC1zIDY0SyAkKHRhaWwgLW4rNCBERVZJQ0VTKSAiJERNX0RFVl9ESVIvJHZnMS8kbHYiCisKK2x2Y3JlYXRlIC1MMVQgLW4gJGx2MSAkdmcKK2ludmFsaWQgbHZjb252ZXJ0IC0teWVzIC1jIDhNIC0tdHlwZSB0aGluIC0tcG9vbG1ldGFkYXRhc2l6ZSAxRyAkdmcvJGx2MQorCisjIG5lZWRzIHNvbWUgLS1jYWNoZXBvb2wgb3IgLS10aGlucG9vbAoraW52YWxpZCBsdmNvbnZlcnQgLS15ZXMgLS1wb29sbWV0YWRhdGFzaXplIDFHICR2Zy8kbHYxCitsdnJlbW92ZSAtZiAkdmcKKworIyBjcmVhdGUgbWlycm9yZWQgTFZzIGZvciBkYXRhIGFuZCBtZXRhZGF0YSB2b2x1bWVzCitsdmNyZWF0ZSAtYWV5IC1MMTBNIC0tdHlwZSBtaXJyb3IgLW0xIC0tbWlycm9ybG9nIGNvcmUgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1hZXkgLUwxME0gLW4gJGx2MiAkdmcKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisjIGNvbnZlcnNpb24gZmFpbHMgZm9yIG1pcnJvciBzZWdtZW50IHR5cGUKK2ZhaWwgbHZjb252ZXJ0IC0tdGhpbnBvb2wgJHZnLyRsdjEKKyMgY2Fubm90IHVzZSBzYW1lIExWCitpbnZhbGlkIGx2Y29udmVydCAtLXllcyAtLXRoaW5wb29sICR2Zy8kbHYyIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyCisKK3ByZXBhcmVfbHZzCisKKyMgY29udmVyc2lvbiBmYWlscyBmb3IgaW50ZXJuYWwgdm9sdW1lcworIyBjYW4ndCB1c2UgLS1yZWFkYWhlYWQgd2l0aCAtLXBvb2xtZXRhZGF0YQoraW52YWxpZCBsdmNvbnZlcnQgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MiAtLXJlYWRhaGVhZCA1MTIKK2x2Y29udmVydCAtLXllcyAtLXRoaW5wb29sICR2Zy8kbHYxIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyCisKK3ByZXBhcmVfbHZzCitsdmNvbnZlcnQgLS15ZXMgLWMgNjQgLS1zdHJpcGVzIDIgLS10aGlucG9vbCAkdmcvJGx2MSAtLXJlYWRhaGVhZCA0OAorbHZyZW1vdmUgLWYgJHZnCisKKworIyBTd2FwaW5nIG9mIG1ldGFkYXRhIHZvbHVtZQorbHZjcmVhdGUgLUwxVCAtbiAkbHYxICR2ZworbHZjcmVhdGUgLUwzMiAtbiAkbHYyICR2ZworbHZjb252ZXJ0IC0teWVzIC1jIDhNIC0tdHlwZSB0aGluLXBvb2wgJHZnLyRsdjEgMj4mMSB8IHRlZSBlcnIKKyMgQ2hlY2sgdHRoZXIgaXMgd2FybmluZyBmb3IgbGFyZ2UgY2h1bmsgc2l6ZSBhbmQgemVyb2luZyBlbmFibGVkCitncmVwICJQb29sIHplcm9pbmcgYW5kIGxhcmdlIiBlcnIKK1VVSUQ9JChnZXQgbHZfZmllbGQgJHZnLyRsdjIgdXVpZCkKKyMgRmFpbCBpcyBwb29sIGlzIGFjdGl2ZQorIyBUT0RPICBtYXliZSBkZXRlY3QgaW5hY3RpdmUgcG9vbCBhbmQgZGVhY3RpdmF0ZQorZmFpbCBsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkbHYyCitsdmNoYW5nZSAtYW4gJHZnCitsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkbHYyCitjaGVjayBsdl9maWVsZCAkdmcvJHtsdjF9X3RtZXRhIHV1aWQgIiRVVUlEIgorbHZyZW1vdmUgLWYgJHZnCisKKworIyB0ZXN0IHdpdGggYmlnZ2VyIHNpemVzCitsdmNyZWF0ZSAtTDFUIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtTDhNIC1uICRsdjIgJHZnCitsdmNyZWF0ZSAtTDFNIC1uICRsdjMgJHZnCisKKyMgY2h1bmsgc2l6ZSBpcyBiaWdnZXIgdGhlbiBzaXplIG9mIHRoaW4gcG9vbCBkYXRhCitmYWlsIGx2Y29udmVydCAtLXllcyAtYyAxRyAtLXRoaW5wb29sICR2Zy8kbHYzCisjIHN0cmlwZXMgY2FuJ3QgYmUgdXNlZCB3aXRoIHBvb2xtZXRhZGF0YQoraW52YWxpZCBsdmNvbnZlcnQgLS1zdHJpcGVzIDIgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MgorIyB0b28gc21hbGwgbWV0YWRhdGEgKDwyTSkKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC1jIDY0IC0tdGhpbnBvb2wgJHZnLyRsdjEgLS1wb29sbWV0YWRhdGEgJHZnLyRsdjMKKyMgdG9vIHNtYWxsIGNodW5rIHNpemUgZmFpbHMKK2ludmFsaWQgbHZjb252ZXJ0IC1jIDQgLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MgorIyB0b28gYmlnIGNodW5rIHNpemUgZmFpbHMKK2ludmFsaWQgbHZjb252ZXJ0IC1jIDJHIC0tdGhpbnBvb2wgJHZnLyRsdjEgLS1wb29sbWV0YWRhdGEgJHZnLyRsdjIKKyMgbmVnYXRpdmUgY2h1bmsgc2l6ZSBmYWlscworaW52YWxpZCBsdmNvbnZlcnQgLWMgLTI1NiAtLXRoaW5wb29sICR2Zy8kbHYxIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyCisjIG5vbiBtdWx0aXBsZSBvZiA2NEtpQiBmYWlscworaW52YWxpZCBsdmNvbnZlcnQgLWMgODggLS10aGlucG9vbCAkdmcvJGx2MSAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MgorCisjIGNhbm5vdCB1c2Ugc2FtZSBMViBmb3IgcG9vbCBhbmQgY29udmVydGlvbgoraW52YWxpZCBsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvJGx2MyAtVCAkdmcvJGx2MworCisjIFdhcm5pbmcgYWJvdXQgc21hbGxlciB0aGVuIHN1Z2dlc3RlZAorbHZjb252ZXJ0IC0teWVzIC1jIDI1NiAtLXRoaW5wb29sICR2Zy8kbHYxIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyIDI+JjEgfCB0ZWUgZXJyCitncmVwICJXQVJOSU5HOiBDaHVuayBzaXplIGlzIHNtYWxsZXIiIGVycgorbHZyZW1vdmUgLWYgJHZnCisKKworbHZjcmVhdGUgLUwxVCAtbiAkbHYxICR2ZworbHZjcmVhdGUgLUwzMkcgLW4gJGx2MiAkdmcKKyMgV2FybmluZyBhYm91dCBiaWdnZXIgdGhlbiBuZWVkZWQKK2x2Y29udmVydCAtLXllcyAtLXRoaW5wb29sICR2Zy8kbHYxIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYyIDI+JjEgfCB0ZWUgZXJyCitncmVwICJXQVJOSU5HOiBNYXhpbXVtIiBlcnIKK2x2cmVtb3ZlIC1mICR2ZworCisKK2lmIHRlc3QgIiRUU0laRSIgPSA2NFQ7IHRoZW4KK2x2Y3JlYXRlIC1MMjRUIC1uICRsdjEgJHZnCisjIFdhcm5pbmcgYWJvdXQgYmlnZ2VyIHRoZW4gbmVlZGVkICgyNFQgZGF0YSBhbmQgMTZHIC0+IDEyOEsgY2h1bmspCitsdmNvbnZlcnQgLS15ZXMgLWMgNjQgLS10aGlucG9vbCAkdmcvJGx2MSAyPiYxIHwgdGVlIGVycgorZ3JlcCAiV0FSTklORzogQ2h1bmsgc2l6ZSBpcyB0b28gc21hbGwiIGVycgorbHZyZW1vdmUgLWYgJHZnCitmaQorCisjbHZzIC1hIC1vK2NodW5rX3NpemUsc3RyaXBlX3NpemUsc2VnX3BlX3JhbmdlcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUHJvaGliaXRlcyB0aGluIHBvb2wgY29udmVyc2lvbnMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtTDMyIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtTDE2IC1uICRsdjIgJHZnCitsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvJGx2MQorCitub3QgYXV4IGhhdmVfY2FjaGUgMSAzIDAgfHwgZmFpbCBsdmNvbnZlcnQgLS15ZXMgLS10eXBlIGNhY2hlLXBvb2wgJHZnLyRsdjEKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBtaXJyb3IgLW0xICR2Zy8kbHYxCitub3QgYXV4IGhhdmVfcmFpZCAxIDAgMCB8fCBmYWlsIGx2Y29udmVydCAtLXllcyAtLXR5cGUgcmFpZDEgLW0xICR2Zy8kbHYxCitmYWlsIGx2Y29udmVydCAtLXllcyAtLXR5cGUgc25hcHNob3QgJHZnLyRsdjEgJHZnLyRsdjIKK2ZhaWwgbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBzbmFwc2hvdCAkdmcvJGx2MiAkdmcvJGx2MQorZmFpbCBsdmNvbnZlcnQgLS15ZXMgLS10eXBlIHRoaW4tcG9vbCAkdmcvJGx2MQorCitsdnJlbW92ZSAtZiAkdmcKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNvbnZlcnQtdHdvc3RlcC5zaCBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXR3b3N0ZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwMmFlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjb252ZXJ0LXR3b3N0ZXAuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDQKKworbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tIDEgLS1taXJyb3Jsb2cgZGlzayAtLWlnbm9yZW1vbml0b3JpbmcgLUwgMSAtbiBtaXJyb3IgJHZnCitub3QgbHZjb252ZXJ0IC1tIDIgLS1taXJyb3Jsb2cgY29yZSAkdmcvbWlycm9yICIkZGV2MyIgMj4mMSB8IHRlZSBlcnJzCitncmVwICJ0d28gc3RlcHMiIGVycnMKKworbHZjb252ZXJ0IC1tIDIgJHZnL21pcnJvciAiJGRldjMiCitsdmNvbnZlcnQgLS1taXJyb3Jsb2cgY29yZSAkdmcvbWlycm9yCitub3QgbHZjb252ZXJ0IC1tIDEgLS1taXJyb3Jsb2cgZGlzayAkdmcvbWlycm9yICIkZGV2MyIgMj4mMSB8IHRlZSBlcnJzCitncmVwICJ0d28gc3RlcHMiIGVycnMKKwordGVzdCAtZSBMT0NBTF9DTFZNRCAmJiBleGl0IDAKKyMgRklYTUUgIG1pcnJvcmVkIHVuc3VwcG9ydGVkIGluIGNsdXN0ZXIKK25vdCBsdmNvbnZlcnQgLW0gMSAtLW1pcnJvcmxvZyBtaXJyb3JlZCAkdmcvbWlycm9yICIkZGV2MyIgIiRkZXY0IiAyPiYxIHwgdGVlIGVycnMKK2dyZXAgInR3byBzdGVwcyIgZXJycworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLWNhY2hlLWZhaWwuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLWNhY2hlLWZhaWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmNDg2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtY2FjaGUtZmFpbC5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSBjcmVhdGlvbiBvZiBjYWNoZSBhbmQgY2FjaGUgcG9vbCB2b2x1bWVzIGFuZCBmYWlsdXJlIHBhdGgKKyMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzEzNTU5MjMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX2NhY2hlIDEgMyAwIHx8IHNraXAKKworI2F1eCBwcmVwYXJlX3B2cyAxIDQ3MDc5NTAKKyN2Z2NyZWF0ZSAkdmcgIiRkZXYxIgorI2x2Y3JlYXRlIC1MNFQgLW4gJGx2MSAkdmcKKyNsdmNyZWF0ZSAtSCAtTDUwMEcgLW4gY2FjaGUgJHZnLyRsdjEKKyNmYWlsIGx2Y3JlYXRlIC1IIC1sIDEyNzk5OSAtbiBjYWNoZSAkdmcvJGx2MQorCithdXggcHJlcGFyZV92ZyAxIDIwCitsdmNyZWF0ZSAtTDEwIC1uICRsdjEgJHZnCitmYWlsIGx2Y3JlYXRlIC1IIC1MMiAtbiBjYWNoZSAkdmcvJGx2MQorCitsdnMgLWEgJHZnCit2Z3MgJHZnCitsdmRpc3BsYXkgJHZnCisKKyNkbXNldHVwIHRhYmxlCisjZG1zZXR1cCBzdGF0dXMKKyN0aW1lIGRtc2V0dXAgc3VzcGVuZCAke3ZnfS0ke2x2MX0KKyN0aW1lIGRtc2V0dXAgcmVzdW1lICR7dmd9LSR7bHYxfQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLWNhY2hlLXJhaWQuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLWNhY2hlLXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3YmU2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtY2FjaGUtcmFpZC5zaApAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSBjcmVhdGlvbiBvZiBjYWNoZSBhbmQgcmFpZHMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX2NhY2hlIDEgMyAwIHx8IHNraXAKK2F1eCBoYXZlX3JhaWQgMSAwIDAgfHwgc2tpcAorCisjIEZJWE1FOiBwYXJhbGxlbCBjYWNoZSBtZXRhZGF0YSBhbGxvY2F0b3IgaXMgY3Jhc2hpbmcgd2hlbiB1c2VkIHZhbHVlIDgwMDAhCithdXggcHJlcGFyZV92ZyA1IDgwMDAwCisKK2F1eCBsdm1jb25mICdnbG9iYWwvY2FjaGVfZGlzYWJsZWRfZmVhdHVyZXMgPSBbICJwb2xpY3lfc21xIiBdJworCisjIEJ1ZyAxMTEwMDI2ICYgQnVnIDEwOTU4NDMKKyMgQ3JlYXRlIFJBSUQxIG9yaWdpbiwgdGhlbiBjYWNoZSBwb29sIGFuZCBjYWNoZQorbHZjcmVhdGUgLWFleSAtbCAyIC0tdHlwZSByYWlkMSAtbTEgLW4gJGx2MiAkdmcKK2x2Y3JlYXRlIC0tY2FjaGUgLWwgMSAkdmcvJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2Zy8ke2x2Mn1fY29yaWdfcmltYWdlXzAJIyBlbnN1cmUgaW1hZ2VzIGFyZSBwcm9wZXJseSByZW5hbWVkCitjaGVjayBhY3RpdmUgJHZnICR7bHYyfV9jb3JpZworZG1zZXR1cCB0YWJsZSAke3ZnfS0kbHYyIHwgZ3JlcCBjYWNoZQkJIyBlbnN1cmUgaXQgaXMgbG9hZGVkIGluIGtlcm5lbAorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLWNhY2hlLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1jYWNoZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmVhNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1jYWNoZS5zaApAQCAtMCwwICsxLDI2NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgRXhlcmNpc2UgY3JlYXRpb24gb2YgY2FjaGUgYW5kIGNhY2hlIHBvb2wgdm9sdW1lcworCisjIEZ1bGwgQ0xJIHVzZXMgIC0tdHlwZQorIyBTaG9ydGhhbmQgQ0xJIHVzZXMgLUggfCAtLWNhY2hlCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV9jYWNoZSAxIDMgMCB8fCBza2lwCisKKyMgRklYTUU6IHBhcmFsbGVsIGNhY2hlIG1ldGFkYXRhIGFsbG9jYXRvciBpcyBjcmFzaGluZyB3aGVuIHVzZWQgdmFsdWUgODAwMCEKK2F1eCBwcmVwYXJlX3ZnIDUgODAwMDAKKworYXV4IGx2bWNvbmYgJ2dsb2JhbC9jYWNoZV9kaXNhYmxlZF9mZWF0dXJlcyA9IFsgInBvbGljeV9zbXEiIF0nCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENhY2hlX1Bvb2wgY3JlYXRpb24gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVE9ETzogVW5zdXBwb3J0ZWQgeWV0IGNyZWF0aW9uIG9mIGNhY2hlIHBvb2wgYW5kIGNhY2hlZCB2b2x1bWUgYXQgb25jZQorIyBUT0RPOiBJbnRyb2R1Y2UgIC0tcG9vbGRhdGFzaXplCisjIFRPRE86IFBvbGljeSB0byBkZXRlcm1pbmUgY2FjaGUgcG9vbCBzaXplIGFuZCBjYWNoZSBwb29sIG5hbWUKK2ludmFsaWQgbHZjcmVhdGUgLUggLWwgMSAkdmcKK2ludmFsaWQgbHZjcmVhdGUgLUggLWwgMSAtLW5hbWUgJGx2MSAkdmcKK2ludmFsaWQgbHZjcmVhdGUgLWwgMSAtLWNhY2hlICR2ZworIyBPbmx5IGNhY2hlZCB2b2x1bWUgY291bGQgYmUgY3JlYXRlZAoraW52YWxpZCBsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZSAkdmcKKyMgU3RyaXBpbmcgaXMgbm90IHN1cHBvcnRlZCB3aXRoIGNhY2hlLXBvb2wgY3JlYXRpb24KK2ludmFsaWQgbHZjcmVhdGUgLWwgMSAtaSAyIC0tdHlwZSBjYWNoZS1wb29sICR2ZworIyBGYWlscyBhcyBpdCBuZWVkcyB0byBzZWUgVkcgY29udGVudAorZmFpbCBsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZSAtLWNhY2hlcG9vbCAkdmcvcG9vbDEKK2ZhaWwgbHZjcmVhdGUgLWwgMSAtLXR5cGUgY2FjaGUgLS1jYWNoZXBvb2wgcG9vbDIgJHZnCitmYWlsIGx2Y3JlYXRlIC1sIDEgLS1jYWNoZSAkdmcvcG9vbDMKK2ZhaWwgbHZjcmVhdGUgLWwgMSAtSCAtLWNhY2hlcG9vbCBwb29sNCAkdmcKK2ZhaWwgbHZjcmVhdGUgLWwgMSAtSCAtLW5hbWUgJGx2MiAkdmcvcG9vbDUKK2ZhaWwgbHZjcmVhdGUgLWwgMSAtSCAtLW5hbWUgJGx2MyAtLWNhY2hlcG9vbCAkdmcvcG9vbDYKK2ZhaWwgbHZjcmVhdGUgLWwgMSAtSCAtLW5hbWUgJHZnLyRsdjQgLS1jYWNoZXBvb2wgcG9vbDcKKworIyBVbmxpa2UgaW4gdGhpbiBwb29sIGNhc2UgLSBjYWNoZSBwb29sIGFuZCBjYWNoZSB2b2x1bWUgYm90aCBuZWVkIHNpemUgYXJnLgorIyBTbyB3ZSByZXF1aXJlIGNhY2hlIHBvb2wgdG8gZXhpc3QgYW5kIG5lZWQgdG8gZmFpbCB3aGVuIGl0J3MgbWlzc2luZy4KKyMKKyMgLS1jYWNoZXBvb2wgZ2l2ZXMgaW1wbGljaXQgLS1jYWNoZQorZmFpbCBsdmNyZWF0ZSAtbCAxIC0tY2FjaGVwb29sIHBvb2w4ICR2ZworCisjIG5vIHNpemUgc3BlY2lmaWVkCitpbnZhbGlkIGx2Y3JlYXRlIC0tY2FjaGVwb29sIHBvb2wgJHZnIDI+JjEgfCB0ZWUgZXJyCitncmVwICJzcGVjaWZ5IGVpdGhlciBzaXplIG9yIGV4dGVudHMiIGVycgorCisjIENoZWNrIG5vdGhpbmcgaGFzIGJlZW4gY3JlYXRlZCB5ZXQKK2NoZWNrIHZnX2ZpZWxkICR2ZyBsdl9jb3VudCAwCisKKworIyBXaXRoIC0tdHlwZSBjYWNoZS1wb29sIHdlIGFyZSBjbGVhciB3aGljaCBzZWd0eXBlIGhhcyB0byBiZSBjcmVhdGVkCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sICR2Zy9wb29sMQorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wxIHNlZ3R5cGUgImNhY2hlLXBvb2wiCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tbmFtZSAkdmcvcG9vbDIgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbDIgc2VndHlwZSAiY2FjaGUtcG9vbCIKK2x2Y3JlYXRlIC1sIDEgLS10eXBlIGNhY2hlLXBvb2wgLS1jYWNoZXBvb2wgJHZnL3Bvb2wzICR2ZworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wzIHNlZ3R5cGUgImNhY2hlLXBvb2wiCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tY2FjaGVwb29sICR2Zy9wb29sNAorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2w0IHNlZ3R5cGUgImNhY2hlLXBvb2wiCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tY2FjaGVwb29sIHBvb2w1ICR2ZworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2w1IHNlZ3R5cGUgImNhY2hlLXBvb2wiCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tbmFtZSBwb29sNiAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sNiBzZWd0eXBlICJjYWNoZS1wb29sIgorbHZjcmVhdGUgLWwgMSAtLXR5cGUgY2FjaGUtcG9vbCAtLW5hbWUgJHZnL3Bvb2w3CitjaGVjayBsdl9maWVsZCAkdmcvcG9vbDcgc2VndHlwZSAiY2FjaGUtcG9vbCIKKworbHZyZW1vdmUgLWYgJHZnCisKKworIyBWYWxpZGF0ZSBhbWJpZ3VvdXMgcG9vbCBuYW1lIGlzIGRldGVjdGVkCitpbnZhbGlkIGx2Y3JlYXRlIC1sIDEgLS10eXBlIGNhY2hlLXBvb2wgLS1jYWNoZXBvb2wgcG9vbDEgJHZnL3Bvb2wyCitpbnZhbGlkIGx2Y3JlYXRlIC1sIDEgLS10eXBlIGNhY2hlLXBvb2wgLS1uYW1lIHBvb2wzIC0tY2FjaGVwb29sIHBvb2w0ICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tbmFtZSBwb29sNiAtLWNhY2hlcG9vbCBwb29sNiAkdmcvcG9vbDcKK2ludmFsaWQgbHZjcmVhdGUgLWwgMSAtLXR5cGUgY2FjaGUtcG9vbCAtLW5hbWUgcG9vbDggJHZnL3Bvb2w5CisKKyMgVW5zdXBwb3J0ZWQgd2l0aCBjYWNoZSAmIGNhY2hlIHBvb2wKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLS1kaXNjYXJkcyBwYXNzZG93biAtbDEgJHZnCitpbnZhbGlkIGx2Y3JlYXRlIC1IIC0tZGlzY2FyZHMgcGFzc2Rvd24gLWwxICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtLXZpcnR1YWxzaXplIDFUIC1sMSAkdmcKK2ludmFsaWQgbHZjcmVhdGUgLUggLS12aXJ0dWFsc2l6ZSAxVCAtbDEgJHZnCisKK2NoZWNrIHZnX2ZpZWxkICR2ZyBsdl9jb3VudCAwCisKKworZm9yIG1vZGUgaW4gIiIgIi0tY2FjaGVtb2RlIHdyaXRldGhyb3VnaCIKK2RvCisKKyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2FjaGUgY3JlYXRpb24KKyMgQ3JlYXRpbmcgYSBjYWNoZSBpcyBhIHR3byBwaGFzZSBwcm9jZXNzCisjIC0gZmlyc3QsIGNhY2hlX3Bvb2wgKG9yIG9yaWdpbikKKyMgLSB0aGVuLCB0aGUgY2FjaGUgTFYgKGx2Y3JlYXRlIGRpc3Rpbmd1aXNoZXMgc3VwcGxpZWQgb3JpZ2luIHZzIGNhY2hlX3Bvb2wpCisjIyMjIyMjIyMjIyMjIyMjCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1sIDEgLW4gcG9vbCAkdmcgJG1vZGUKKyMgU2VsZWN0IGF1dG9tYXRpYyBuYW1lIGZvciBjYWNoZWQgTFYKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZSAtbDEgJHZnL3Bvb2wKKworbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLWwgMSAtbiBwb29sMSAkdmcgJG1vZGUKK2x2Y3JlYXRlIC0tY2FjaGUgLWwxIC1uICRsdjEgLS1jYWNoZXBvb2wgJHZnL3Bvb2wxCitkbXNldHVwIHRhYmxlICR7dmd9LSRsdjEgfCBncmVwIGNhY2hlICAjIGVuc3VyZSBpdCBpcyBsb2FkZWQgaW4ga2VybmVsCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1sIDEgLW4gcG9vbDIgJHZnICRtb2RlCitsdmNyZWF0ZSAtSCAtbDEgLW4gJGx2MiAtLWNhY2hlcG9vbCBwb29sMiAkdmcKKworIworIyBOb3cgY2hlY2sgcmVtb3ZhbHMKKyMKKworIyBSZW1vdmFsIG9mIGNhY2hlZCBMViByZW1vdmVzIGV2ZXJ5IHJlbGF0ZWQgTFYKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHNlZ3R5cGUgImNhY2hlIgorbHZyZW1vdmUgLWYgJHZnLyRsdjEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnICRsdjEgcG9vbDEgcG9vbDFfY2RhdGEgcG9vbDFfY21ldGEKKyMgdG8gcHJlc2VydmUgY2FjaGVwb29sIHVzZSAgbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSAkdmcvJGx2MQorCisjIFJlbW92YWwgb2YgY2FjaGUgcG9vbCBsZWF2ZXMgb3JpZ2luIHVuY2FjaGVkCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBzZWd0eXBlICJjYWNoZSIKK2x2cmVtb3ZlIC1mICR2Zy9wb29sMgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgcG9vbDIgcG9vbDJfY2RhdGEgcG9vbDJfY21ldGEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIHNlZ3R5cGUgImxpbmVhciIKKworbHZyZW1vdmUgLWYgJHZnCisKK2RvbmUKKworCisjIENvbnZlcnNpb24gdGhyb3VnaCBsdmNyZWF0ZSBjYXNlCisjIEJ1ZyAxMTEwMDI2CisjIENyZWF0ZSBvcmlnaW4sIHRoZW4gY2FjaGUgcG9vbCBhbmQgY2FjaGUgdGhlIG9yaWdpbgorbHZjcmVhdGUgLWFleSAtbCAyIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgMSAkdmcvJGx2MQorZG1zZXR1cCB0YWJsZSAke3ZnfS0kbHYxIHwgZ3JlcCBjYWNoZSAgIyBlbnN1cmUgaXQgaXMgbG9hZGVkIGluIGtlcm5lbAorCitsdnJlbW92ZSAtZiAkdmcKKworCisjIENoZWNrIG1pbmltdW0gY2FjaGUgcG9vbCBtZXRhZGF0YSBzaXplCitsdmNyZWF0ZSAtbCAxIC0tdHlwZSBjYWNoZS1wb29sIC0tcG9vbG1ldGFkYXRhc2l6ZSAxICR2ZyAyPm91dAorZ3JlcCAiV0FSTklORzogTWluaW11bSIgb3V0CisKKyMgRklYTUU6IFRoaXMgdGVzdCBpcyBmYWlsaW5nIGluIGFsbG9jYXRvciB3aXRoIHNtYWxsZXIgVkcgc2l6ZXMKK2x2Y3JlYXRlIC1sIDEgLS10eXBlIGNhY2hlLXBvb2wgLS1wb29sbWV0YWRhdGFzaXplIDE3RyAkdmcgMj5vdXQKK2dyZXAgIldBUk5JTkc6IE1heGltdW0iIG91dAorCitsdnJlbW92ZSAtZiAkdmcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDYWNoZSBjb252ZXJzaW9uIGFuZCByL3cgcGVybWlzc2lvbnMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHdyaXRlYWJsZSBvcmlnaW4gYW5kICdkZWZhdWx0JyA9PiB3cml0YWJsZSBjYWNoZSArIG9yaWdpbgorbHZjcmVhdGUgLWFuIC1sMSAtbiAkdmcvJGx2MQorIyBkbyBub3QgYWxsb3cgc3RyaXBwaW5nIGZvciBjYWNoZS1wb29sCitmYWlsIGx2Y3JlYXRlIC1IIC1pIDIgLWwxIC1uIGNwb29sMSAkdmcvJGx2MQorbHZjcmVhdGUgLUggLWwxIC1uIGNwb29sMSAkdmcvJGx2MQorY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvY3Bvb2wxICJ3IgorY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvJHtsdjF9X2NvcmlnICJ3IgorY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvJGx2MSAidyIKKworIyB3cml0ZWFibGUgb3JpZ2luIGFuZCAtcHIgPT4gY29udmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkCitsdmNyZWF0ZSAtYW4gLWwxIC1uICR2Zy8kbHYyCitmYWlsIGx2Y3JlYXRlIC1IIC1sMSAtcHIgLW4gY3Bvb2wyICR2Zy8kbHYyCisKKyMgcmVhZC1vbmx5IG9yaWdpbiBhbmQgLXByID0+IHJlYWQtb25seSBjYWNoZSArIG9yaWdpbgorbHZjcmVhdGUgLWFuIC1wciAtbDEgLW4gJHZnLyRsdjMKK2x2Y3JlYXRlIC1hbiAtSCAtbDEgLXByIC1uIGNwb29sMyAkdmcvJGx2MworY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvY3Bvb2wzICJ3IgorY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvJHtsdjN9X2NvcmlnICJyIgorY2hlY2sgbHZfYXR0cl9iaXQgcGVybSAkdmcvJGx2MyAiciIKK2NoZWNrIGluYWN0aXZlICR2ZyAkbHYzCitjaGVjayBpbmFjdGl2ZSAkdmcgY3Bvb2wzCisKKyMgcmVhZC1vbmx5IG9yaWdpbiBhbmQgJ2RlZmF1bHQnID0+IHJlYWQtb25seSBjYWNoZSArIG9yaWdpbgorbHZjcmVhdGUgLWFuIC1wciAtbDEgLW4gJHZnLyRsdjQKK2x2Y3JlYXRlIC1IIC1sMSAtbiBjcG9vbDQgJHZnLyRsdjQKK2NoZWNrIGx2X2F0dHJfYml0IHBlcm0gJHZnL2Nwb29sNCAidyIKK2NoZWNrIGx2X2F0dHJfYml0IHBlcm0gJHZnLyR7bHY0fV9jb3JpZyAiciIKK2NoZWNrIGx2X2F0dHJfYml0IHBlcm0gJHZnLyRsdjQgInIiCisKKyMgcmVhZC1vbmx5IG9yaWdpbiBhbmQgLXBydyA9PiBjb252ZXJzaW9uIHVuc3VwcG9ydGVkCitsdmNyZWF0ZSAtYW4gLXByIC1sMSAtbiAkdmcvJGx2NQorZmFpbCBsdmNyZWF0ZSAtSCAtbDEgLXBydyAtbiBjcG9vbDUgJHZnLyRsdjUKKworIyBjYWNoZWQgdm9sdW1lIHJlc3BlY3RzIHBlcm1pc3Npb25zCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtbDEgLW4gJHZnL2Nwb29sCitsdmNyZWF0ZSAtSCAtbDEgLXByIC1uICRsdjYgJHZnL2Nwb29sCitjaGVjayBsdl9hdHRyX2JpdCBwZXJtICR2Zy9jcG9vbCAidyIKK2NoZWNrIGx2X2F0dHJfYml0IHBlcm0gJHZnLyRsdjYgInIiCisKK2x2cmVtb3ZlIC1mICR2ZworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZhbGlkYXRlIGFyZ3MgYXJlIHByb3Blcmx5IHByZXNlcnZlZCAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtTDEwIC0tY2h1bmtzaXplIDI1NiAtLWNhY2hlbW9kZSB3cml0ZWJhY2sgJHZnL2Nwb29sMQorY2hlY2sgbHZfZmllbGQgJHZnL2Nwb29sMSBjaHVua3NpemUgIjI1Ni4wMGsiCitjaGVjayBsdl9maWVsZCAkdmcvY3Bvb2wxIGNhY2hlbW9kZSAid3JpdGViYWNrIgorIyBjaGVjayBzdHJpcGluZyBpcyBzdXBwb3J0ZWQgd2hlbiBjcmVhdGluZyBhIGNhY2hlZCBMVgorbHZjcmVhdGUgLUggLUwxMCAtaSAyIC1uICRsdjEgJHZnL2Nwb29sMQorY2hlY2sgbHZfZmllbGQgJHZnLyR7bHYxfV9jb3JpZyBzdHJpcGVzICIyIiAtYQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgY2h1bmtzaXplICIyNTYuMDBrIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgY2FjaGVtb2RlICJ3cml0ZWJhY2siCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgLS1jaHVua3NpemUgMjU2IC0tY2FjaGVtb2RlIHdyaXRldGhyb3VnaCAkdmcvY3Bvb2wyCitsdmNyZWF0ZSAtSCAtTDEwIC0tY2h1bmtzaXplIDUxMiAtLWNhY2hlbW9kZSB3cml0ZWJhY2sgLW4gJGx2MiAkdmcvY3Bvb2wyCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBjaHVua3NpemUgIjUxMi4wMGsiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBjYWNoZW1vZGUgIndyaXRlYmFjayIKKworIyBDaHVuayBiaWdnZXIgdGhlbiBwb29sIHNpemUKK2ZhaWwgbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLWwxIC0tY2h1bmtzaXplIDFHICR2Zy9jcG9vbDMKKworbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLUwxMCAkdmcvY3Bvb2w0CitmYWlsIGx2Y3JlYXRlIC1IIC1MMTAgLS1jaHVua3NpemUgMTZNICR2Zy9jcG9vbDQKKworbHZyZW1vdmUgLWYgJHZnCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgJHZnL2Nwb29sCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgMSAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wgLW4gY29yaWdpbiAkdmcgLS1jYWNoZXNldHRpbmdzIG1pZ3JhdGlvbl90aHJlc2hvbGQ9MjMzCitkbXNldHVwIHN0YXR1cyB8IGdyZXAgJHZnCitkbXNldHVwIHN0YXR1cyB8IGdyZXAgJHZnLWNvcmlnaW4gfCBncmVwICdtaWdyYXRpb25fdGhyZXNob2xkIDIzMycKK2x2Y2hhbmdlIC1hbiAkdmcKK2x2Y2hhbmdlIC1heSAkdmcKK2Rtc2V0dXAgc3RhdHVzIHwgZ3JlcCAkdmctY29yaWdpbiB8IGdyZXAgJ21pZ3JhdGlvbl90aHJlc2hvbGQgMjMzJworCitsdnJlbW92ZSAtZiAkdmcKKworbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLUwxMCAtLWNhY2hlcG9saWN5IG1xIC0tY2FjaGVzZXR0aW5ncyBtaWdyYXRpb25fdGhyZXNob2xkPTIzMyAkdmcvY3Bvb2wKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZSAtbCAxIC0tY2FjaGVwb29sICR2Zy9jcG9vbCAtbiBjb3JpZ2luICR2ZworZG1zZXR1cCBzdGF0dXMgfCBncmVwICR2ZworZG1zZXR1cCBzdGF0dXMgfCBncmVwICR2Zy1jb3JpZ2luIHwgZ3JlcCAnbWlncmF0aW9uX3RocmVzaG9sZCAyMzMnCisKK2x2cmVtb3ZlIC1mICR2ZworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUZXN0IHRoaW5ncyB0aGF0IHNob3VsZCBmYWlsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDcmVhdGlvbiBvZiByZWFkLW9ubHkgY2FjaGUgcG9vbCBpcyBub3Qgc3VwcG9ydGVkCitpbnZhbGlkIGx2Y3JlYXRlIC1wciAtLXR5cGUgY2FjaGUtcG9vbCAtbDEgLW4gJHZnL2Nwb29sCisKKyMgQXRlbXB0IHRvIHVzZSBiaWdnZXIgY2h1bmsgc2l6ZSB0aGVuIGNhY2hlIHBvb2wgZGF0YSBzaXplCitmYWlsIGx2Y3JlYXRlIC1sIDEgLS10eXBlIGNhY2hlLXBvb2wgLS1jaHVua3NpemUgMTZNICR2ZyAyPm91dAorZ3JlcCAiY2h1bmsgc2l6ZSIgb3V0CisKKyMgT3B0aW9uIHRlc3RpbmcKKyMgLS1jaHVua3NpemUKKyMgLS1jYWNoZXBvbGljeQorIyAtLXBvb2xtZXRhZGF0YXNpemUKKyMgLS1wb29sbWV0YWRhdGFzcGFyZQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLWxhcmdlLXJhaWQuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLWxhcmdlLXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZTUxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbGFyZ2UtcmFpZC5zaApAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyAnRXhlcmNpc2Ugc29tZSBsdmNyZWF0ZSBkaWFnbm9zdGljcycKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgRklYTUUgIHVwZGF0ZSB0ZXN0IHRvIG1ha2Ugc29tZXRoaW5nIHVzZWZ1bCBvbiA8MTZUCithdXggY2FuX3VzZV8xNlQgfHwgc2tpcAorCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgNQorCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLWwgMjAlRlJFRSAtbiAkbHYxICR2ZyAtLXZpcnR1YWxzaXplIDI1NlQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtbCAyMCVGUkVFIC1uICRsdjIgJHZnIC0tdmlydHVhbHNpemUgMjU2VAorbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1zIC1sIDIwJUZSRUUgLW4gJGx2MyAkdmcgLS12aXJ0dWFsc2l6ZSAyNTZUCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLWwgMjAlRlJFRSAtbiAkbHY0ICR2ZyAtLXZpcnR1YWxzaXplIDI1NlQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtbCAyMCVGUkVFIC1uICRsdjUgJHZnIC0tdmlydHVhbHNpemUgMjU2VAorCisjRklYTUUgdGhpcyBzaG91bGQgYmUgMTAyNFQKKyNjaGVjayBsdl9maWVsZCAkdmcvJGx2IHNpemUgIjEyOC4wMG0iCisKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKKworcHZjcmVhdGUgIiRETV9ERVZfRElSIi8kdmcvJGx2WzEyMzQ1XQordmdjcmVhdGUgJHZnMSAiJERNX0RFVl9ESVIiLyR2Zy8kbHZbMTIzNDVdCisKKyMgYno4Mzc5MjcgU1RBUlQKKworIworIyBDcmVhdGUgbGFyZ2UgUkFJRCBMVnMKKyMKKyMgV2UgbmVlZCAnLS1ub3N5bmMnIG9yIG91ciB2aXJ0dWFsIGRldmljZXMgd29uJ3Qgd29yaworbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLUwgMjAwVCAtbiAkbHYxICR2ZzEgLS1ub3N5bmMKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICIyMDAuMDB0IgorbHZyZW1vdmUgLWZmICR2ZzEKKworZm9yIHNlZ3R5cGUgaW4gcmFpZDQgcmFpZDUgcmFpZDY7IGRvCisgICAgICAgIGx2Y3JlYXRlIC0tdHlwZSAkc2VndHlwZSAtaSAzIC1MIDc1MFQgLW4gJGx2MSAkdmcxIC0tbm9zeW5jCisgICAgICAgIGNoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICI3NTAuMDB0IgorICAgICAgICBsdnJlbW92ZSAtZmYgJHZnMQorZG9uZQorCisjCisjIENvbnZlcnQgbGFyZ2UgbGluZWFyIHRvIFJBSUQxIChiZWxvbmcgaW4gZGlmZmVyZW50IHRlc3Qgc2NyaXB0PykKKyMKK2x2Y3JlYXRlIC1hZXkgLUwgMjAwVCAtbiAkbHYxICR2ZzEKKyMgTmVlZCB0byBkZWFjdGl2YXRlIG9yIHRoZSB1cC1jb252ZXJ0IHdpbGwgc3RhcnQgc3luYydpbmcKK2x2Y2hhbmdlIC1hbiAkdmcxLyRsdjEKK2x2Y29udmVydCAtLXR5cGUgcmFpZDEgLW0gMSAkdmcxLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICIyMDAuMDB0IgorbHZyZW1vdmUgLWZmICR2ZzEKKworIworIyBFeHRlbmRpbmcgbGFyZ2UgUkFJRCBMViAoYmVsb25nIGluIGRpZmZlcmVudCBzY3JpcHQ/KQorIworbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLUwgMjAwVCAtbiAkbHYxICR2ZzEgLS1ub3N5bmMKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICIyMDAuMDB0IgorbHZleHRlbmQgLUwgKzIwMFQgJHZnMS8kbHYxCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjEgc2l6ZSAiNDAwLjAwdCIKK2x2cmVtb3ZlIC1mZiAkdmcxCisKKyMgYno4Mzc5MjcgRU5ECisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbGFyZ2UtcmFpZDEwLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1sYXJnZS1yYWlkMTAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0OWU3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbGFyZ2UtcmFpZDEwLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdFeGVyY2lzZSBzb21lIGx2Y3JlYXRlIGRpYWdub3N0aWNzJworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBGSVhNRSAgdXBkYXRlIHRlc3QgdG8gbWFrZSBzb21ldGhpbmcgdXNlZnVsIG9uIDwxNlQKK2F1eCBjYW5fdXNlXzE2VCB8fCBza2lwCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgNQorCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLWwgMjAlRlJFRSAtbiAkbHYxICR2ZyAtLXZpcnR1YWxzaXplIDI1NlQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtbCAyMCVGUkVFIC1uICRsdjIgJHZnIC0tdmlydHVhbHNpemUgMjU2VAorbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1zIC1sIDIwJUZSRUUgLW4gJGx2MyAkdmcgLS12aXJ0dWFsc2l6ZSAyNTZUCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLWwgMjAlRlJFRSAtbiAkbHY0ICR2ZyAtLXZpcnR1YWxzaXplIDI1NlQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtbCAyMCVGUkVFIC1uICRsdjUgJHZnIC0tdmlydHVhbHNpemUgMjU2VAorCithdXggZXh0ZW5kX2ZpbHRlcl9MVk1URVNUCisKK3B2Y3JlYXRlICIkRE1fREVWX0RJUiIvJHZnLyRsdlsxMjM0NV0KK3ZnY3JlYXRlICR2ZzEgIiRETV9ERVZfRElSIi8kdmcvJGx2WzEyMzQ1XQorCisjCisjIENyZWF0ZSBsYXJnZSBSQUlEIExWcworIworIyBXZSBuZWVkICctLW5vc3luYycgb3Igb3VyIHZpcnR1YWwgZGV2aWNlcyB3b24ndCB3b3JrCisKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMTAgLW0gMSAtaSAyIC1MIDIwMFQgLW4gJGx2MSAkdmcxIC0tbm9zeW5jCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjEgc2l6ZSAiMjAwLjAwdCIKK3ZncmVtb3ZlIC1mZiAkdmcxCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbGFyZ2Uuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLWxhcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzYxMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLWxhcmdlLnNoCkBAIC0wLDAgKzEsNDggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdFeGVyY2lzZSBzb21lIGx2Y3JlYXRlIGRpYWdub3N0aWNzJworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBGSVhNRSAgdXBkYXRlIHRlc3QgdG8gbWFrZSBzb21ldGhpbmcgdXNlZnVsIG9uIDwxNlQKK2F1eCBjYW5fdXNlXzE2VCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDQKKworbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1zIC1sIDEwMCVGUkVFIC1uICRsdiAkdmcgLS12aXJ0dWFsc2l6ZSAxMDI0VAorCisjRklYTUUgdGhpcyBzaG91bGQgYmUgMTAyNFQKKyNjaGVjayBsdl9maWVsZCAkdmcvJGx2IHNpemUgIjEyOC4wMG0iCisKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKKworcHZjcmVhdGUgIiRETV9ERVZfRElSLyR2Zy8kbHYiCit2Z2NyZWF0ZSAkdmcxICIkRE1fREVWX0RJUi8kdmcvJGx2IgorCitsdmNyZWF0ZSAtbCAxMDAlRlJFRSAtbiAkbHYxICR2ZzEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICIxMDI0LjAwdCIKK2x2cmVzaXplIC1mIC1sIDcyJVZHICR2ZzEvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIHNpemUgIjczNy4yOHQiCitsdnJlbW92ZSAtZmYgJHZnMS8kbHYxCisKK2x2Y3JlYXRlIC1sIDEwMCVWRyAtbiAkbHYxICR2ZzEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBzaXplICIxMDI0LjAwdCIKK2x2cmVzaXplIC1mIC1sIDcyJVZHICR2ZzEvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIHNpemUgIjczNy4yOHQiCitsdnJlbW92ZSAtZmYgJHZnMS8kbHYxCisKK2x2cmVtb3ZlIC1mZiAkdmcvJGx2CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbWlycm9yLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1taXJyb3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5YmQyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbWlycm9yLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNSA4MAorYXV4IGx2bWNvbmYgJ2FsbG9jYXRpb24vbWF4aW1pc2VfY2xpbmcgPSAwJyBcCisJICAgICdhbGxvY2F0aW9uL21pcnJvcl9sb2dzX3JlcXVpcmVfc2VwYXJhdGVfcHZzID0gMScKKworIyAyLXdheSBtaXJyb3Igd2l0aCBjb3JlbG9nLCAyIFBWcworbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIKK2NoZWNrIG1pcnJvcl9pbWFnZXNfcmVkdW5kYW50ICR2ZyAkbHYxCisKKyMgMi13YXkgbWlycm9yIHdpdGggZGlza2xvZywgMyBQVnMKKyMgbHZjcmVhdGUgLS1ub3N5bmMgaXMgaW4gMTAwJSBzeW5jIGFmdGVyIGNyZWF0aW9uIChiejQyOTM0MikKK2x2Y3JlYXRlIC1hZXkgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC0tbm9zeW5jIC1uICRsdjIgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiOjAtMSAyPiYxIHwgdGVlIG91dAorZ3JlcCAiTmV3IG1pcnJvciB3b24ndCBiZSBzeW5jaHJvbmlzZWQuIiBvdXQKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIGNvcHlfcGVyY2VudCAiMTAwLjAwIgorY2hlY2sgbWlycm9yX2ltYWdlc19yZWR1bmRhbnQgJHZnICRsdjIKK2NoZWNrIG1pcnJvcl9sb2dfb24gJHZnICRsdjIgIiRkZXYzIgorCisjIDMtd2F5IG1pcnJvciB3aXRoIGRpc2tsb2csIDQgUFZzCitsdmNyZWF0ZSAtYWV5IC1sMiAtLXR5cGUgbWlycm9yIC1tMiAtLW5vc3luYyAtLW1pcnJvcmxvZyBkaXNrIC1uICRsdjMgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjQiICIkZGV2MyI6MC0xCitjaGVjayBtaXJyb3JfaW1hZ2VzX3JlZHVuZGFudCAkdmcgJGx2MworY2hlY2sgbWlycm9yX2xvZ19vbiAkdmcgJGx2MyAiJGRldjMiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgY3JlYXRpbmcgMi13YXkgbWlycm9yIHdpdGggZGlza2xvZyBmcm9tIDIgUFZzIGZhaWxzCitub3QgbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbWlzc2luZy5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtbWlzc2luZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFkZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1taXNzaW5nLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMgorCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorCitub3QgbHZjcmVhdGUgLW4gImZvbyIgJHZnIC1sIDEKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLW9wZXJhdGlvbi5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtb3BlcmF0aW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjJkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLW9wZXJhdGlvbi5zaApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyAnRXhlcmNpc2Ugc29tZSBsdmNyZWF0ZSBkaWFnbm9zdGljcycKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2NsZWFudXBfbHZzKCkgeworCWx2cmVtb3ZlIC1mZiAkdmcKKwkoZG1fdGFibGUgfCBub3QgZ3JlcCAkdmcpIHx8IFwKKwkJZGllICJFUlJPUjogbHZyZW1vdmUgZGlkIGxlYXZlIHNvbWUgc29tZSBtYXBwaW5ncyBpbiBETSBiZWhpbmQhIgorfQorCithdXggcHJlcGFyZV9wdnMgMgorYXV4IHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiCithdXggdmdjcmVhdGUgJHZnICQoY2F0IERFVklDRVMpCisKKyMgLS0tCisjIENyZWF0ZSBzbmFwc2hvdHMgb2YgTFZzIG9uIC0tbWV0YWRhdGFjb3BpZXMgMCBQViAoYno0NTA2NTEpCitsdmNyZWF0ZSAtYWV5IC1uJGx2MSAtbDQgJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1uJGx2MiAtbDQgLXMgJHZnLyRsdjEKK2x2Y3JlYXRlIC1uJGx2MyAtbDQgLS1wZXJtaXNzaW9uIHIgLXMgJHZnLyRsdjEKK2NsZWFudXBfbHZzCisKKyMgU2tpcCB0aGUgcmVzdCBmb3IgY2x1c3RlcgordGVzdCAtZSBMT0NBTF9DTFZNRCAmJiBleGl0IDAKKworIyAtLS0KKyMgQ3JlYXRlIG1pcnJvciBvbiB0d28gZGV2aWNlcyB3aXRoIG1pcnJvcmVkIGxvZyB1c2luZyAtLWFsbG9jIGFueXdoZXJlCitsdmNyZWF0ZSAtLXR5cGUgbWlycm9yIC1tIDEgLWw0IC1uICRsdjEgLS1taXJyb3Jsb2cgbWlycm9yZWQgJHZnIC0tYWxsb2MgYW55d2hlcmUgIiRkZXYxIiAiJGRldjIiCitjbGVhbnVwX2x2cworCisjIC0tCisjIENyZWF0ZSBtaXJyb3Igb24gb25lIGRldiB3aXRoIG1pcnJvcmVkIGxvZyB1c2luZyAtLWFsbG9jIGFueXdoZXJlLCBzaG91bGQgZmFpbAorbm90IGx2Y3JlYXRlIC0tdHlwZSBtaXJyb3IgLW0gMSAtbDQgLW4gJGx2MSAtLW1pcnJvcmxvZyBtaXJyb3JlZCAkdmcgLS1hbGxvYyBhbnl3aGVyZSAiJGRldjEiCitjbGVhbnVwX2x2cworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXB2dGFncy5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtcHZ0YWdzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzJkNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXB2dGFncy5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyAzCithdXggbHZtY29uZiAnYWxsb2NhdGlvbi9tYXhpbWlzZV9jbGluZyA9IDAnIFwKKwkgICAgJ2FsbG9jYXRpb24vbWlycm9yX2xvZ3NfcmVxdWlyZV9zZXBhcmF0ZV9wdnMgPSAxJworCisjIG5vdCByZXF1aXJlZCwganVzdCB0ZXN0aW5nCithdXggcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MSIKKwordmdjcmVhdGUgJHZnICQoY2F0IERFVklDRVMpCitwdmNoYW5nZSAtLWFkZHRhZyBmYXN0ICQoY2F0IERFVklDRVMpCisKKyMgMyBzdHJpcGVzIHdpdGggMyBQVnMgKHNlbGVjdGVkIGJ5IHRhZywgQGZhc3QpIGlzIGZpbmUKK2x2Y3JlYXRlIC1sMyAtaTMgJHZnIEBmYXN0CisKKyMgdG9vIG1hbnkgc3RyaXBlcyg0KSBmb3IgMyBQVnMKK25vdCBsdmNyZWF0ZSAtbDQgLWk0ICR2ZyBAZmFzdAorCisjIDIgc3RyaXBlcyBpcyB0b28gbWFueSB3aXRoIGp1c3Qgb25lIFBWCitub3QgbHZjcmVhdGUgLWwyIC1pMiAkdmcgIiRETV9ERVZfRElSL21hcHBlci9wdjEiCisKKyMgbHZjcmVhdGUgbWlycm9yCitsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMSAtLW5vc3luYyAkdmcgQGZhc3QKKworIyBsdmNyZWF0ZSBtaXJyb3Igdy9jb3JlbG9nCitsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMiAtLWNvcmVsb2cgLS1ub3N5bmMgJHZnIEBmYXN0CisKKyMgbHZjcmVhdGUgbWlycm9yIHcvbm8gZnJlZSBQVnMKK25vdCBsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMiAkdmcgQGZhc3QKKworIyBsdmNyZWF0ZSBtaXJyb3IgKGNvcmVsb2csIHcvbm8gZnJlZSBQVnMpCitub3QgbHZjcmVhdGUgLWFleSAtbDEgLS10eXBlIG1pcnJvciAtbTMgLS1jb3JlbG9nICR2ZyBAZmFzdAorCisjIGx2Y3JlYXRlIG1pcnJvciB3aXRoIGEgc2luZ2xlIFBWIGFyZworbm90IGx2Y3JlYXRlIC1hZXkgLWwxIC0tdHlwZSBtaXJyb3IgLW0xIC0tY29yZWxvZyAkdmcgIiRkZXYxIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXJhaWQuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0MzRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtcmFpZC5zaApAQCAtMCwwICsxLDIwNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2x2X2RldmljZXMoKSB7CisJdGVzdCAkMyAtZXEgJChnZXQgbHZfZGV2aWNlcyAkMS8kMiB8IHdjIC13KQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNQUlOCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYXV4IGhhdmVfcmFpZCAxIDMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyA2IDIwICAjIDYgZGV2aWNlcyBmb3IgUkFJRDEwICgyLW1pcnJvciwzLXN0cmlwZSkgdGVzdAordmdjcmVhdGUgLXMgNTEyayAkdmcgJChjYXQgREVWSUNFUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcmVhdGUsIHdhaXQgZm9yIHN5bmMsIHJlbW92ZSB0ZXN0cworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcmVhdGUgUkFJRDEgKGltcGxpY2l0IDItd2F5KQorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1sIDIgLW4gJGx2MSAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgQ3JlYXRlIFJBSUQxIChleHBsaWNpdCAyLXdheSkKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDIgLW4gJGx2MSAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgQ3JlYXRlIFJBSUQxIChleHBsaWNpdCAzLXdheSkKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAyIC1sIDIgLW4gJGx2MSAkdmcKK2F1eCB3YWl0X2Zvcl9zeW5jICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgQ3JlYXRlIFJBSUQxIChleHBsaWNpdCAzLXdheSkgLSBTZXQgbWluL21heCByZWNvdmVyeSByYXRlCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMiAtbCAyIFwKKwktLW1pbnJlY292ZXJ5cmF0ZSA1MCAtLW1heHJlY292ZXJ5cmF0ZSAxTSBcCisJLW4gJGx2MSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHJhaWRfbWluX3JlY292ZXJ5X3JhdGUgNTAKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHJhaWRfbWF4X3JlY292ZXJ5X3JhdGUgMTAyNAorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBDcmVhdGUgUkFJRCA0LzUvNiAoZXhwbGljaXQgMy1zdHJpcGUgKyBwYXJpdHkgZGV2cykKK2ZvciBpIGluIHJhaWQ0IFwKKwlyYWlkNSByYWlkNV9scyByYWlkNV9sYSByYWlkNV9ycyByYWlkNV9yYSBcCisJcmFpZDYgcmFpZDZfenIgcmFpZDZfbnIgcmFpZDZfbmM7IGRvCisKKwlsdmNyZWF0ZSAtLXR5cGUgJGkgLWwgMyAtaSAzIC1uICRsdjEgJHZnCisJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKwlsdnJlbW92ZSAtZmYgJHZnCitkb25lCisKKyMgQ3JlYXRlIFJBSUQgNC81LzYgKGV4cGxpY2l0IDMtc3RyaXBlICsgcGFyaXR5IGRldnMpIC0gU2V0IG1pbi9tYXggcmVjb3ZlcnkKK2ZvciBpIGluIHJhaWQ0IFwKKwlyYWlkNSByYWlkNV9scyByYWlkNV9sYSByYWlkNV9ycyByYWlkNV9yYSBcCisJcmFpZDYgcmFpZDZfenIgcmFpZDZfbnIgcmFpZDZfbmM7IGRvCisKKwlsdmNyZWF0ZSAtLXR5cGUgJGkgLWwgMyAtaSAzIFwKKwkJLS1taW5yZWNvdmVyeXJhdGUgNTAgLS1tYXhyZWNvdmVyeXJhdGUgMU0gXAorCQktbiAkbHYxICR2ZworCWNoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHJhaWRfbWluX3JlY292ZXJ5X3JhdGUgNTAKKwljaGVjayBsdl9maWVsZCAkdmcvJGx2MSByYWlkX21heF9yZWNvdmVyeV9yYXRlIDEwMjQKKwlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorCWx2cmVtb3ZlIC1mZiAkdmcKK2RvbmUKKworIyBDcmVhdGUgUkFJRCB1c2luZyAxMDAlRlJFRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyA2IFBWcyB3aXRoIDE5bSBpbiBlYWNoIFBWLgorIyAxIG1ldGFkYXRhIExWID0gMSBleHRlbnQgICA9IC41bQorIyAxIGltYWdlID0gMzcrMzgrMzggZXh0ZW50cyA9IDU2LjUwbSA9IGx2X3NpemUKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDEwMCVGUkVFIC1hbiAtWm4gLW4gcmFpZDEgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvcmFpZDEgc2l6ZSAiNTYuNTBtIgorbHZyZW1vdmUgLWZmICR2ZworCisjIDEgbWV0YWRhdGEgTFYgPSAxIGV4dGVudAorIyAxIGltYWdlID0gMzcgZXh0ZW50cyAgID0gMTguNW0KKyMgNSBpbWFnZXMgPSAxODUgZXh0ZW50cyA9IDkyLjVtID0gbHZfc2l6ZQorbHZzIC1hICAkdmcKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNSAtaSA1IC1sIDEwMCVGUkVFIC1hbiAtWm4gLW4gcmFpZDUgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvcmFpZDUgc2l6ZSAiOTIuNTBtIgorbHZyZW1vdmUgLWZmICR2ZworCisjIDEgaW1hZ2UgPSAzNyszOCBleHRlbnRzCisjIDIgaW1hZ2VzID0gMTUwIGV4dGVudHMgPSA3NS4wMG0gPSBsdl9zaXplCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDUgLWkgMiAtbCAxMDAlRlJFRSAtYW4gLVpuIC1uIHJhaWQ1ICR2ZworY2hlY2sgbHZfZmllbGQgJHZnL3JhaWQ1IHNpemUgIjc1LjAwbSIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyAxIGltYWdlID0gMzcgZXh0ZW50cworIyA0IGltYWdlcyA9IDE0OCBleHRlbnRzID0gNzQuMDBtID0gbHZfc2l6ZQorbHZjcmVhdGUgLS10eXBlIHJhaWQ2IC1pIDQgLWwgMTAwJUZSRUUgLWFuIC1abiAtbiByYWlkNiAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy9yYWlkNiBzaXplICI3NC4wMG0iCitsdnJlbW92ZSAtZmYgJHZnCisKKyMjIworIyBGb3IgZm9sbG93aW5nIHRlc3RzIGVhdCAxOCBvZiAzNyBleHRlbnRzIGZyb20gZGV2MSwgbGVhdmluZyAxOQorbHZjcmVhdGUgLWwgMTggLWFuIC1abiAtbiBlYXRfc3BhY2UgJHZnICIkZGV2MSIKK0VBVF9TSVpFPSQoZ2V0IGx2X2ZpZWxkICR2Zy9lYXRfc3BhY2Ugc2l6ZSkKKworIyBVc2luZyAxMDAlIGZyZWUgc2hvdWxkIHRha2UgdGhlIHJlc3Qgb2YgZGV2MSBhbmQgZXF1YWwgZnJvbSBkZXYyCisjIDEgbWV0YSB0YWtlcyAxIGV4dGVudAorIyAxIGltYWdlID0gMTkgZXh0ZW50cyA9IDkuNTBtID0gbHZfc2l6ZQorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLWwgMTAwJUZSRUUgLWFuIC1abiAtbiByYWlkMSAkdmcgIiRkZXYxIiAiJGRldjIiCitjaGVjayBsdl9maWVsZCAkdmcvcmFpZDEgc2l6ZSAiOS41MG0iCisjIEVuc3VyZSBpbWFnZSBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBSQUlEMSBzaXplCitjaGVjayBsdl9maWVsZCAkdmcvcmFpZDEgc2l6ZSAkKGdldCBsdl9maWVsZCAkdmcvcmFpZDFfcmltYWdlXzAgc2l6ZSAtYSkKKyMgQW1vdW50IHJlbWFpbmluZyBpbiBkZXYyIHNob3VsZCBlcXVhbCB0aGUgYW1vdW50IHRha2VuIGJ5ICdsdicgaW4gZGV2MQorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9mcmVlICIkRUFUX1NJWkUiCitsdnJlbW92ZSAtZmYgJHZnL3JhaWQxCisKKyMgVXNpbmcgMTAwJSBmcmVlIHNob3VsZCB0YWtlIHRoZSByZXN0IG9mIGRldjEgYW5kIGVxdWFsIGFtb3VudCBmcm9tIHRoZSByZXN0CisjIDEgbWV0YSB0YWtlcyAxIGV4dGVudAorIyAxIGltYWdlID0gMTkgZXh0ZW50cyA9IDkuNTBtCisjIDUgaW1hZ2VzID0gOTUgZXh0ZW50cyA9IDQ3LjUwbSA9IGx2X3NpemUKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNSAtaSA1IC1sIDEwMCVGUkVFIC1hbiAtWm4gLW4gcmFpZDUgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvcmFpZDUgc2l6ZSAiNDcuNTBtIgorIyBBbW91bnQgcmVtYWluaW5nIGluIGRldjYgc2hvdWxkIGVxdWFsIHRoZSBhbW91bnQgdGFrZW4gYnkgJ2x2JyBpbiBkZXYxCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X2ZyZWUgIiRFQVRfU0laRSIKK2x2cmVtb3ZlIC1mZiAkdmcvcmFpZDUKKworIyBVc2luZyAxMDAlIGZyZWUgc2hvdWxkIHRha2UgdGhlIHJlc3Qgb2YgZGV2MSwgYW4gZXF1YWwgYW1vdW50CisjIGZyb20gMiBtb3JlIGRldnMsIGFuZCBhbGwgZXh0ZW50cyBmcm9tIDMgYWRkaXRpb25hbCBkZXZzCisjIDEgbWV0YSB0YWtlcyAxIGV4dGVudAorIyAxIGltYWdlID0gMTkrMzkgZXh0ZW50cworIyAyIGltYWdlcyA9IDExNCBleHRlbnRzID0gNTcuMDBtID0gbHZfc2l6ZQorbHZjcmVhdGUgLS10eXBlIHJhaWQ1IC1pIDIgLWwgMTAwJUZSRUUgLWFuIC1abiAtbiByYWlkNSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy9yYWlkNSBzaXplICI1Ny4wMG0iCitsdnJlbW92ZSAtZmYgJHZnL3JhaWQ1CisKKyMgTGV0J3MgZG8gc29tZSBzdHJpcGUgdGVzdHMgdG9vCisjIFVzaW5nIDEwMCUgZnJlZSBzaG91bGQgdGFrZSB0aGUgcmVzdCBvZiBkZXYxIGFuZCBhbiBlcXVhbCBhbW91bnQgZnJvbSByZXN0CisjIDEgaW1hZ2UgPSAyMCBleHRlbnRzCisjIDYgaW1hZ2VzID0gMTIwIGV4dGVudHMgPSA2MC4wMG0gPSBsdl9zaXplCitsdmNyZWF0ZSAtaSA2IC1sIDEwMCVGUkVFIC1hbiAtWm4gLW4gc3RyaXBlICR2ZworY2hlY2sgbHZfZmllbGQgJHZnL3N0cmlwZSBzaXplICI2MC4wMG0iCitsdnJlbW92ZSAtZmYgJHZnL3N0cmlwZQorCisjIFVzaW5nIDEwMCUgZnJlZSBzaG91bGQgdGFrZSB0aGUgcmVzdCBvZiBkZXYxLCBhbiBlcXVhbCBhbW91bnQgZnJvbQorIyAgb25lIG1vcmUgZGV2LCBhbmQgYWxsIG9mIHRoZSByZW1haW5pbmcgNAorIyAxIGltYWdlID0gMjArMzgrMzggZXh0ZW50cworIyAyIGltYWdlcyA9IDE5MiBleHRlbnRzID0gOTYuMDBtID0gbHZfc2l6ZQorbHZjcmVhdGUgLWkgMiAtbCAxMDAlRlJFRSAtYW4gLVpuIC1uIHN0cmlwZSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy9zdHJpcGUgc2l6ZSAiOTYuMDBtIgorCitsdnJlbW92ZSAtZmYgJHZnCisjIGVuZCBvZiB1c2Ugb2YgJyR2Zy9lYXRfc3BhY2UnCisjIyMKKworIyBDcmVhdGUgUkFJRCAoaW1wbGljaXQgc3RyaXBlIGNvdW50IGJhc2VkIG9uIFBWIGNvdW50KQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vdCBlbm91Z2ggZHJpdmVzCitub3QgbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1sMSAkdmcgIiRkZXYxIgorbm90IGx2Y3JlYXRlIC0tdHlwZSByYWlkNSAtbDIgJHZnICIkZGV2MSIgIiRkZXYyIgorbm90IGx2Y3JlYXRlIC0tdHlwZSByYWlkNiAtbDMgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKworIyBJbXBsaWNpdCBjb3VudCBjb21lcyBmcm9tICNQVnMgZ2l2ZW4gKGFsd2F5cyAyIGZvciBtaXJyb3IgdGhvdWdoKQorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1sMSAtYW4gLVpuIC1uIHJhaWQxICR2ZyAiJGRldjEiICIkZGV2MiIKK2x2X2RldmljZXMgJHZnIHJhaWQxIDIKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNSAtbDIgLWFuIC1abiAtbiByYWlkNSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2x2X2RldmljZXMgJHZnIHJhaWQ1IDMKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNiAtbDMgLWFuIC1abiAtbiByYWlkNiAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCitsdl9kZXZpY2VzICR2ZyByYWlkNiA1CitsdnJlbW92ZSAtZmYgJHZnCisKKyMgSW1wbGljaXQgY291bnQgY29tZXMgZnJvbSB0b3RhbCAjUFZzIGluIFZHIChhbHdheXMgMiBmb3IgbWlycm9yIHRob3VnaCkKKyMgRGVmYXVsdHMgLWkyIGV2ZW4gdGhvdWdoIG1vcmUgUFZzIGxpc3RlZAorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1sMSAtYW4gLVpuIC1uIHJhaWQxICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDEgMgorbHZjcmVhdGUgLS10eXBlIHJhaWQ1IC1sMiAtYW4gLVpuIC1uIHJhaWQ1ICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDUgMworbHZjcmVhdGUgLS10eXBlIHJhaWQ2IC1sMyAtYW4gLVpuIC1uIHJhaWQ2ICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDYgNQorbHZyZW1vdmUgLWZmICR2ZworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRyeSBhZ2FpbiB3aXRoIGJhY2t3YXJkIGNvbXBhdGlibGUgb2xkIGxvZ2ljIGFwcGxpZWQgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2F1eCBsdm1jb25mICdhbGxvY2F0aW9uL3JhaWRfc3RyaXBlX2FsbF9kZXZpY2VzID0gMScKKworIyBJbXBsaWNpdCBjb3VudCBjb21lcyBmcm9tIHRvdGFsICNQVnMgaW4gVkcgKGFsd2F5cyAyIGZvciBtaXJyb3IgdGhvdWdoKQorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1sMSAtYW4gLVpuIC1uIHJhaWQxICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDEgMgorbHZjcmVhdGUgLS10eXBlIHJhaWQ1IC1sMiAtYW4gLVpuIC1uIHJhaWQ1ICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDUgNgorbHZjcmVhdGUgLS10eXBlIHJhaWQ2IC1sMyAtYW4gLVpuIC1uIHJhaWQ2ICR2ZworbHZfZGV2aWNlcyAkdmcgcmFpZDYgNgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXJhaWQxMC5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtcmFpZDEwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmUyMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXJhaWQxMC5zaApAQCAtMCwwICsxLDk4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworbHZfZGV2aWNlcygpIHsKKwl0ZXN0ICQzIC1lcSAkKGdldCBsdl9kZXZpY2VzICQxLyQyIHwgd2MgLXcpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1BSU4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithdXggaGF2ZV9yYWlkIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDYgMjAgICMgNiBkZXZpY2VzIGZvciBSQUlEMTAgKDItbWlycm9yLDMtc3RyaXBlKSB0ZXN0Cit2Z2NyZWF0ZSAtcyA1MTJrICR2ZyAkKGNhdCBERVZJQ0VTKQorCisjCisjIENyZWF0ZSBSQUlEMTA6CisjCisKKyMgU2hvdWxkIG5vdCBhbGxvdyBtb3JlIHRoYW4gMi13YXkgbWlycm9yCitub3QgbHZjcmVhdGUgLS10eXBlIHJhaWQxMCAtbSAyIC1pIDIgLWwgMiAtbiAkbHYxICR2ZworCisjIDItd2F5IG1pcnJvciwgMi1zdHJpcGVzCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tIDEgLWkgMiAtbCAyIC1uICRsdjEgJHZnCithdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2Zy8kbHYxCisKKyMgMi13YXkgbWlycm9yLCAyLXN0cmlwZXMgLSBTZXQgbWluL21heCByZWNvdmVyeSByYXRlCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tIDEgLWkgMiAtbCAyIFwKKwktLW1pbnJlY292ZXJ5cmF0ZSA1MCAtLW1heHJlY292ZXJ5cmF0ZSAxTSBcCisJLW4gJGx2MSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHJhaWRfbWluX3JlY292ZXJ5X3JhdGUgNTAKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIHJhaWRfbWF4X3JlY292ZXJ5X3JhdGUgMTAyNAorYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjEKKworIyAyLXdheSBtaXJyb3IsIDMtc3RyaXBlcworbHZjcmVhdGUgLS10eXBlIHJhaWQxMCAtbSAxIC1pIDMgLWwgMyAtbiAkbHYyICR2ZworYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjIKKworbHZyZW1vdmUgLWZmICR2ZworCisjIFRlc3QgMTAwJUZSRUUgb3B0aW9uCisjIDM4IGV4dGVudHMgLyBkZXZpY2UKKyMgMSBpbWFnZSA9IDM3IGV4dGVudHMgKDEgZm9yIG1ldGEpCisjIDMgaW1hZ2VzID0gMTExIGV4dGVudHMgPSA1NS41MG0KK2x2Y3JlYXRlIC0tdHlwZSByYWlkMTAgLWkgMyAtbCAxMDAlRlJFRSAtYW4gLVpuIC1uIHJhaWQxMCAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy9yYWlkMTAgc2l6ZSAiNTUuNTBtIgorbHZyZW1vdmUgLWZmICR2ZworCisjIENyZWF0ZSBSQUlEIChpbXBsaWNpdCBzdHJpcGUgY291bnQgYmFzZWQgb24gUFYgY291bnQpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTm90IGVub3VnaCBkcml2ZXMKK25vdCBsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1sMiAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKworIyBJbXBsaWNpdCBjb3VudCBjb21lcyBmcm9tICNQVnMgZ2l2ZW4gKGFsd2F5cyAyLXdheSBtaXJyb3IpCisjIERlZmF1bHRzIC1pMiwgd2hpY2ggd29ya3Mgd2l0aCA0IFBWcyBsaXN0ZWQKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMTAgLWwyIC1hbiAtWm4gLW4gcmFpZDEwICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdl9kZXZpY2VzICR2ZyByYWlkMTAgNAorCisjIERlZmF1bHRzIC1pMiBldmVuIHRob3VnaCBtb3JlIFBWcyBsaXN0ZWQKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMTAgLWwyIC1hbiAtWm4gLW4gcmFpZDEwXzYgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiCitsdl9kZXZpY2VzICR2ZyByYWlkMTBfNiA0CisKK2x2cmVtb3ZlIC1mZiAkdmcKKworIworIyBGSVhNRTogQWRkIHRlc3RzIHRoYXQgc3BlY2lmeSBwYXJ0aWN1bGFyIFBWcyB0byB1c2UgZm9yIGNyZWF0aW9uCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJ5IGFnYWluIHdpdGggYmFja3dhcmQgY29tcGF0aWJsZSBvbGQgbG9naWMgYXBwbGllZCAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYXV4IGx2bWNvbmYgJ2FsbG9jYXRpb24vcmFpZF9zdHJpcGVfYWxsX2RldmljZXMgPSAxJworCisjIEltcGxpY2l0IGNvdW50IGNvbWVzIGZyb20gI1BWcyBnaXZlbiAoYWx3YXlzIDItd2F5IG1pcnJvcikKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMTAgLWwyIC1hbiAtWm4gLW4gcmFpZDEwICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdl9kZXZpY2VzICR2ZyByYWlkMTAgNAorCisjIEltcGxpY2l0IGNvdW50IGNvbWVzIGZyb20gdG90YWwgI1BWcyBpbiBWRyAoYWx3YXlzIDIgZm9yIG1pcnJvciB0aG91Z2gpCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1sMiAtYW4gLVpuIC1uIHJhaWQxMF92ZyAkdmcKK2x2X2RldmljZXMgJHZnIHJhaWQxMF92ZyA2CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtcmVwYWlyLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1yZXBhaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtcmVwYWlyLnNoCkBAIC0wLDAgKzEsMTAyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMworCisjIGZhaWwgbXVsdGlwbGUgZGV2aWNlcworZm9yIGkgaW4gIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgOyBkbworCWZvciBqIGluICIkZGV2MiIgIiRkZXYzIiA7IGRvCisJCWlmIHRlc3QgIiRpIiA9ICIkaiIgOyB0aGVuIGNvbnRpbnVlIDsgZmkKKworCQl2Z3JlbW92ZSAtZmYgJHZnCisJCXZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCQkjIGV4aXQgMQorCisJCWx2Y3JlYXRlIC1sMSAtbiAkbHYxICR2ZyAiJGRldjEiCisKKwkJYXV4IGRpc2FibGVfZGV2ICIkaSIgIiRqIgorCisJCXZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworCisJCSMgY2hlY2sgaWYgcmVkdWNlZCBkZXZpY2Ugd2FzIHJlbW92ZWQKKwkJdGVzdCAiJGkiID0gIiRkZXYxIiAmJiBkbV90YWJsZSB8IG5vdCBlZ3JlcCAiJHZnLSRsdjE6ICpbXiBdKyIKKworCQlsdmNyZWF0ZSAtbDEgLW4gJGx2MiAkdmcKKworCQl0ZXN0ICIkaSIgIT0gIiRkZXYxIiAmJiBjaGVjayBsdl9leGlzdHMgJHZnICRsdjEKKwkJY2hlY2sgbHZfZXhpc3RzICR2ZyAkbHYyCisKKwkJYXV4IGVuYWJsZV9kZXYgIiRpIiAiJGoiCisJCXZnc2NhbgorCisJCXRlc3QgIiRpIiAhPSAiJGRldjEiICYmIGNoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MQorCQljaGVjayBsdl9leGlzdHMgJHZnICRsdjIKKwlkb25lCitkb25lCisKK3ZncmVtb3ZlIC1mZiAkdmcKK3ZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCisjIHVzZSB0cmlja3kgJ2RkJworZm9yIGkgaW4gIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgOyBkbworCWZvciBqIGluICIkZGV2MiIgIiRkZXYzIiA7IGRvCisKKwkJaWYgdGVzdCAiJGkiID0gIiRqIiA7IHRoZW4gY29udGludWUgOyBmaQorCisJCWRkIGlmPSIkaSIgb2Y9YmFja3VwX2kgYnM9MjU2SyBjb3VudD0xCisJCWRkIGlmPSIkaiIgb2Y9YmFja3VwX2ogYnM9MjU2SyBjb3VudD0xCisKKwkJbHZjcmVhdGUgLWwxIC1uICRsdjEgJHZnICIkZGV2MSIKKworCQlkZCBpZj1iYWNrdXBfaiBvZj0iJGoiIGJzPTI1NksgY291bnQ9MQorCQlkZCBpZj1iYWNrdXBfaSBvZj0iJGkiIGJzPTI1NksgY291bnQ9MQorCisJCWNoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MQorCQkjIG1kYSBzaG91bGQgYmUgbm93IGNvbnNpc3RlbnQKKwkJbHZyZW1vdmUgLWYgJHZnLyRsdjEKKwlkb25lCitkb25lCisKKworIyBjb25mdXNlIGx2bSB3aXRoIGFjdGl2ZSBMViBsZWZ0IGJlaGluZAorZGQgaWY9IiRkZXYxIiBvZj1iYWNrdXBfaSBicz0yNTZLIGNvdW50PTEKK2RkIGlmPSIkZGV2MiIgb2Y9YmFja3VwX2ogYnM9MjU2SyBjb3VudD0xCisKK2x2Y3JlYXRlIC1sMSAkdmcgIiRkZXYxIgorCitkZCBpZj1iYWNrdXBfaiBvZj0iJGRldjIiIGJzPTI1NksgY291bnQ9MQorZGQgaWY9YmFja3VwX2kgb2Y9IiRkZXYxIiBicz0yNTZLIGNvdW50PTEKKworIyBDSEVDS01FOiBmb2xsb3dpbmcgY29tbWFuZCB3cml0ZXMgaGVyZToKKyMgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCisjCisjIFdBUk5JTkc6IEluY29uc2lzdGVudCBtZXRhZGF0YSBmb3VuZCBmb3IgVkcgTFZNVEVTVHZnIC0gdXBkYXRpbmcgdG8gdXNlIHZlcnNpb24gMgorIyBWb2x1bWUgZ3JvdXAgIkxWTVRFU1R2ZyIgaXMgYWxyZWFkeSBjb25zaXN0ZW50CisKKyMgZGlydHkgZ2FtZQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2MyIgYnM9MjU2SyBjb3VudD0xCithdXggbm90aWZ5X2x2bWV0YWQgIiRkZXYzIiAjIHVkZXYgYmUgd2F0Y2hpbmcgeW91CisKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworCisjIEZJWE1FOiBoZXJlIGlzIExWMSBsZWZ0IGFjdGl2ZSAtIGJ1dCBtZXRhZGF0YSBkb2VzIG5vdCBrbm93IGFib3V0IGl0CisjIGFuZCBsdmNyZWF0ZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHN1Y2ggZGV2aWNlIGV4aXN0cyBpbiB0aGUgdGFibGUKKyMgc28gaXQgZW5kcyB3aXRoOiAKKyMKKyMgZGV2aWNlLW1hcHBlcjogY3JlYXRlIGlvY3RsIGZhaWxlZDogRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kKKyMgRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyBMVi4KKworc2hvdWxkIGx2Y3JlYXRlIC1sMSAkdmcgIiRkZXYxIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNyZWF0ZS1zaWduYXR1cmUtd2lwaW5nLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS1zaWduYXR1cmUtd2lwaW5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTk4MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXNpZ25hdHVyZS13aXBpbmcuc2gKQEAgLTAsMCArMSwxMTcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdFeGVyY2lzZSBzaWduYXR1cmUgd2lwaW5nIGR1cmluZyBsdmNyZWF0ZScKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2luaXRfbHZfKCkgeworCW1rc3dhcCAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCit9CisKK3Rlc3RfYmxraWRfKCkgeworCWxvY2FsIHR5cGUKKwl0eXBlPSQoYmxraWQgLXMgVFlQRSAtbyB2YWx1ZSAtYyAvZGV2L251bGwgIiRETV9ERVZfRElSLyR2Zy8kbHYxIikKKwl0ZXN0ICIkdHlwZSIgPSAic3dhcCIKK30KKwordGVzdF9tc2dfKCkgeworCWdyZXAgIldpcGluZyBzd2FwIHNpZ25hdHVyZSIgb3V0Cit9CisKK2F1eCBwcmVwYXJlX3ZnCisKKyMgbHZjcmVhdGUgd2lwZXMgc2lnbmF0dXJlcyB3aGVuIGZvdW5kIG9uIG5ld2x5IGNyZWF0ZWQgTFYgLSB0ZXN0IHRoaXMgb24gInN3YXAiLgorIyBUZXN0IGFsbCBjb21iaW5hdGlvcyB3aXRoIC1ae3l8bn0gYW5kIC1Xe3l8bn0gYW5kIHJlbGF0ZWQgbHZtLmNvbmYgc2V0dGluZ3MuCisKK2x2Y3JlYXRlIC1sMSAtbiAkbHYxICR2ZworaW5pdF9sdl8KKyMgVGhpcyBzeXN0ZW0gaGFzIHVudXNhYmxlIGJsa2lkIChkb2VzIG5vdCByZWNvZ25pemUgc21hbGwgc3dhcCwgbmVlZHMgZml4Li4uKQordGVzdF9ibGtpZF8gfHwgc2tpcAorbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworYXV4IGx2bWNvbmYgImFsbG9jYXRpb24vd2lwZV9zaWduYXR1cmVzX3doZW5femVyb2luZ19uZXdfbHZzID0gMCIKKworbHZjcmVhdGUgLXkgLVpuIC1sMSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIG91dAorbm90IHRlc3RfbXNnXwordGVzdF9ibGtpZF8KK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKK2x2Y3JlYXRlIC15IC1abiAtV24gLWwxIC1uICRsdjEgJHZnIDI+JjEgfCB0ZWUgb3V0Citub3QgdGVzdF9tc2dfCit0ZXN0X2Jsa2lkXworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVpuIC1XeSAtbDEgLW4gJGx2MSAkdmcgMj4mMSB8IHRlZSBvdXQKK3Rlc3RfbXNnXworbm90IHRlc3RfYmxraWRfCitpbml0X2x2XworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVp5IC1sMSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIG91dAorbm90IHRlc3RfbXNnXworbm90IHRlc3RfYmxraWRfCitpbml0X2x2XworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVp5IC1XbiAtbDEgLW4gJGx2MSAkdmcgMj4mMSB8IHRlZSBvdXQKK25vdCB0ZXN0X21zZ18KK25vdCB0ZXN0X2Jsa2lkXworaW5pdF9sdl8KK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKK2x2Y3JlYXRlIC15IC1aeSAtV3kgLWwxIC1uICRsdjEgJHZnIDI+JjEgfCB0ZWUgb3V0Cit0ZXN0X21zZ18KK25vdCB0ZXN0X2Jsa2lkXworaW5pdF9sdl8KK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKKworYXV4IGx2bWNvbmYgImFsbG9jYXRpb24vd2lwZV9zaWduYXR1cmVzX3doZW5femVyb2luZ19uZXdfbHZzID0gMSIKKworbHZjcmVhdGUgLXkgLVpuIC1sMSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIG91dAorbm90IHRlc3RfbXNnXwordGVzdF9ibGtpZF8KK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKK2x2Y3JlYXRlIC15IC1abiAtV24gLWwxIC1uICRsdjEgJHZnIDI+JjEgfCB0ZWUgb3V0Citub3QgdGVzdF9tc2dfCit0ZXN0X2Jsa2lkXworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVpuIC1XeSAtbDEgLW4gJGx2MSAkdmcgMj4mMSB8IHRlZSBvdXQKK3Rlc3RfbXNnXworbm90IHRlc3RfYmxraWRfCitpbml0X2x2XworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVp5IC1sMSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIG91dAordGVzdF9tc2dfCitub3QgdGVzdF9ibGtpZF8KK2luaXRfbHZfCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCitsdmNyZWF0ZSAteSAtWnkgLVduIC1sMSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIG91dAorbm90IHRlc3RfbXNnXworbm90IHRlc3RfYmxraWRfCitpbml0X2x2XworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworbHZjcmVhdGUgLXkgLVp5IC1XeSAtbDEgLW4gJGx2MSAkdmcgMj4mMSB8IHRlZSBvdXQKK3Rlc3RfbXNnXworbm90IHRlc3RfYmxraWRfCitpbml0X2x2XworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXNtYWxsLXNuYXAuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXNtYWxsLXNuYXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MjRkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtc21hbGwtc25hcC5zaApAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzCisKK3ZnY3JlYXRlIC1zIDFrICR2ZyAkKGNhdCBERVZJQ0VTKQorCisjIDMgQ2h1bmtzCitsdmNyZWF0ZSAtYWV5IC1uIG9uZSAtbCAxMCAkdmcKK2x2Y3JlYXRlIC1zIC1sIDEyIC1uIHNuYXBBICR2Zy9vbmUKK2x2Y3JlYXRlIC1zIC1jIDRrIC1sIDEyIC1uIHNuYXBYMSAkdmcvb25lCitsdmNyZWF0ZSAtcyAtYyA4ayAtbCAyNCAtbiBzbmFwWDIgJHZnL29uZQorCisjIENoZWNrIHRoYXQgc25hcHNob3RzIHRoYXQgYXJlIHRvbyBzbWFsbCBhcmUgY2F1Z2h0IHdpdGggY29ycmVjdCBlcnJvci4KK25vdCBsdmNyZWF0ZSAtcyAtYyA4ayAtbCA4IC1uIHNuYXBYMyAkdmcvb25lIDI+JjEgfCB0ZWUgbHZjcmVhdGUub3V0Citub3QgZ3JlcCAic3VzcGVuZCBvcmlnaW4gb25lIiBsdmNyZWF0ZS5vdXQKK2dyZXAgInNtYWxsZXIiIGx2Y3JlYXRlLm91dAorCitub3QgbHZjcmVhdGUgLXMgLWwgNCAtbiBzbmFwQiAkdmcvb25lIDI+JjEgfCB0ZWUgbHZjcmVhdGUub3V0Citub3QgZ3JlcCAic3VzcGVuZCBvcmlnaW4gb25lIiBsdmNyZWF0ZS5vdXQKK2dyZXAgInNtYWxsZXIiIGx2Y3JlYXRlLm91dApkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNyZWF0ZS1zdHJpcGVkLW1pcnJvci5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtc3RyaXBlZC1taXJyb3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkOGIwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtc3RyaXBlZC1taXJyb3Iuc2gKQEAgLTAsMCArMSw1OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyA5CisKK2x2Y3JlYXRlIC1hZXkgLS1ub3N5bmMgLWkyIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW1pcnJvcmxvZyBjb3JlIC1uICRsdjEgJHZnIDI+JjEgfCB0ZWUgbG9nCitub3QgZ3JlcCAiUm91bmRpbmciIGxvZworY2hlY2sgbWlycm9yX2ltYWdlc19yZWR1bmRhbnQgJHZnICRsdjEKKworbHZjcmVhdGUgLWFleSAtLW5vc3luYyAtaTIgLWw0IC0tdHlwZSBtaXJyb3IgLW0xIC0tbWlycm9ybG9nIGNvcmUgLW4gJGx2MiAkdmcgMj4mMSB8IHRlZSBsb2cKK25vdCBncmVwICJSb3VuZGluZyIgbG9nCitjaGVjayBtaXJyb3JfaW1hZ2VzX3JlZHVuZGFudCAkdmcgJGx2MgorCitsdmNyZWF0ZSAtYWV5IC0tbm9zeW5jIC1pMyAtbDMgLS10eXBlIG1pcnJvciAtbTEgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYzICR2ZyAyPiYxIHwgdGVlIGxvZworbm90IGdyZXAgIlJvdW5kaW5nIiBsb2cKK2NoZWNrIG1pcnJvcl9pbWFnZXNfcmVkdW5kYW50ICR2ZyAkbHYzCisKK2x2Y3JlYXRlIC1hZXkgLS1ub3N5bmMgLWk0IC1sNCAtLXR5cGUgbWlycm9yIC1tMSAtLW1pcnJvcmxvZyBjb3JlIC1uICRsdjQgJHZnIDI+JjEgfCB0ZWUgbG9nCitub3QgZ3JlcCAiUm91bmRpbmciIGxvZworY2hlY2sgbWlycm9yX2ltYWdlc19yZWR1bmRhbnQgJHZnICRsdjQKKworbHZjcmVhdGUgLWFleSAtLW5vc3luYyAtaTIgLWwyIC0tdHlwZSBtaXJyb3IgLW0yIC0tbWlycm9ybG9nIGNvcmUgLW4gJGx2NSAkdmcgMj4mMSB8IHRlZSBsb2cKK25vdCBncmVwICJSb3VuZGluZyIgbG9nCitjaGVjayBtaXJyb3JfaW1hZ2VzX3JlZHVuZGFudCAkdmcgJGx2NQorCitsdmNyZWF0ZSAtYWV5IC0tbm9zeW5jIC1pMyAtbDMgLS10eXBlIG1pcnJvciAtbTIgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHY2ICR2ZyAyPiYxIHwgdGVlIGxvZworbm90IGdyZXAgIlJvdW5kaW5nIiBsb2cKK2NoZWNrIG1pcnJvcl9pbWFnZXNfcmVkdW5kYW50ICR2ZyAkbHY2CisKK2x2Y3JlYXRlIC1hZXkgLS1ub3N5bmMgLWkyIC1sMiAtLXR5cGUgbWlycm9yIC1tMyAtLW1pcnJvcmxvZyBjb3JlIC1uICRsdjcgJHZnIDI+JjEgfCB0ZWUgbG9nCitub3QgZ3JlcCAiUm91bmRpbmciIGxvZworY2hlY2sgbWlycm9yX2ltYWdlc19yZWR1bmRhbnQgJHZnICRsdjcKKworbHZyZW1vdmUgLWZmICR2ZworCitsdmNyZWF0ZSAtYWV5IC0tbm9zeW5jIC1pMyAtbDQgLS10eXBlIG1pcnJvciAtbTEgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYxICR2ZyAyPiYxIHwgdGVlIGxvZworZ3JlcCAiUm91bmRpbmcgc2l6ZSAuKig0IGV4dGVudHMpIHVwIHRvIC4qKDYgZXh0ZW50cykiIGxvZworCitsdmNyZWF0ZSAtYWV5IC0tbm9zeW5jIC1pMyAtbDQgLS10eXBlIG1pcnJvciAtbTIgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYyICR2ZyAyPiYxIHwgdGVlIGxvZworZ3JlcCAiUm91bmRpbmcgc2l6ZSAuKig0IGV4dGVudHMpIHVwIHRvIC4qKDYgZXh0ZW50cykiIGxvZworCitsdmNyZWF0ZSAtYWV5IC0tbm9zeW5jIC1pMyAtbDIgLS10eXBlIG1pcnJvciAtbTIgLS1taXJyb3Jsb2cgY29yZSAtbiAkbHYzICR2ZyAyPiYxIHwgdGVlIGxvZworZ3JlcCAiUm91bmRpbmcgc2l6ZSAuKigyIGV4dGVudHMpIHVwIHRvIC4qKDMgZXh0ZW50cykiIGxvZworCitsdnJlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tYmlnLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS10aGluLWJpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWJjMWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS10aGluLWJpZy5zaApAQCAtMCwwICsxLDY4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIHRlc3QgY3VycmVudGx5IG5lZWRzIHRvIGRyb3AKKyMgJ3JldHVybiBOVUxMJyBpbiBfbHZfY3JlYXRlX2FuX2x2IGFmdGVyIGxvZ19lcnJvcigiQ2FuJ3QgY3JlYXRlICVzIHdpdGhvdXQgdXNpbmcgIgorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKKworIyBUZXN0IC0tcG9vbG1ldGFkYXRhc2l6ZSByYW5nZQorIyBhbGxvY2F0aW5nIGxhcmdlIGRldmljZXMgZm9yIHRlc3RpbmcKK2F1eCBwcmVwYXJlX3B2cyAxMCAxNjUwMAordmdjcmVhdGUgJHZnIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCisjIFNpemUgMCBpcyBub3QgdmFsaWQKK2ludmFsaWQgbHZjcmVhdGUgLUw0TSAtLWNodW5rc2l6ZSAxMjggLS1wb29sbWV0YWRhdGFzaXplIDAgLVQgJHZnL3Bvb2wxIDI+b3V0CitsdmNyZWF0ZSAtTDRNIC0tY2h1bmtzaXplIDEyOCAtLXBvb2xtZXRhZGF0YXNpemUgMTZrIC1UICR2Zy9wb29sMSAyPm91dAorZ3JlcCAiV0FSTklORzogTWluaW11bSIgb3V0CisjIEZJWE1FOiBtZXRhZGF0YSBhbGxvY2F0aW9uIGZhaWxzLCBpZiBQViBkb2Vzbid0IGhhdmUgYXQgbGVhc3QgMTZHQgorIyBpLmUuIHBvb2wgbWV0YWRhdGEgZGV2aWNlIGNhbm5vdCBiZSBtdWx0aXNlZ21lbnQKK2x2Y3JlYXRlIC1MNE0gLS1jaHVua3NpemUgNjRrIC0tcG9vbG1ldGFkYXRhc2l6ZSAxN0cgLVQgJHZnL3Bvb2wyIDI+b3V0CitncmVwICJXQVJOSU5HOiBNYXhpbXVtIiBvdXQKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMV90bWV0YSBzaXplICIyLjAwbSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMl90bWV0YSBzaXplICIxNi4wMGciCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgVGVzdCBhdXRvbWF0aWMgY2FsY3VsYXRpb24gb2YgcG9vbCBtZXRhZGF0YSBzaXplCitsdmNyZWF0ZSAtTDE2MEcgLVQgJHZnL3Bvb2wKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIGx2X21ldGFkYXRhX3NpemUgIjgwLjAwbSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIGNodW5rc2l6ZSAgICAgICAgIjEyOC4wMGsiCitsdnJlbW92ZSAtZmYgJHZnL3Bvb2wKKworbHZjcmVhdGUgLUwxMEcgLS1jaHVua3NpemUgMjU2IC1UICR2Zy9wb29sMQorbHZjcmVhdGUgLUw2MEcgLS1jaHVua3NpemUgMTAyNCAtVCAkdmcvcG9vbDIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMV90bWV0YSBzaXplICIyLjUwbSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMl90bWV0YSBzaXplICIzLjc1bSIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBCbG9jayBzaXplIG9mIG11bHRpcGxlIDY0S0IgbmVlZHMgPj0gMS40CitpZiBhdXggaGF2ZV90aGluIDEgNCAwIDsgdGhlbgorIyBUZXN0IGNodW5rIHNpemUgaXMgcm91bmRlZCB0byA2NEtCIGJvdW5kYXJ5CitsdmNyZWF0ZSAtTDEwRyAtLXBvb2xtZXRhZGF0YXNpemUgNE0gLVQgJHZnL3Bvb2wKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIGNodW5rX3NpemUgIjE5Mi4wMGsiCitmaQorIyBPbGQgdGhpbnBvb2wgdGFyZ2V0IHJlcXVpcmVkIHJvdW5kaW5nIHRvIHBvd2VyIG9mIDIKK2F1eCBsdm1jb25mICJnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcyA9IFsgXCJibG9ja19zaXplXCIgXSIKK2x2Y3JlYXRlIC1MMTBHIC0tcG9vbG1ldGFkYXRhc2l6ZSA0TSAtVCAkdmcvcG9vbF9vbGQKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX29sZCBjaHVua19zaXplICIyNTYuMDBrIgorbHZyZW1vdmUgLWZmICR2ZworIyByZXNldAorI2F1eCBsdm1jb25mICJnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcyA9IFtdIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tZXh0ZXJuYWwtc2l6ZS5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdGhpbi1leHRlcm5hbC1zaXplLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjg1OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tZXh0ZXJuYWwtc2l6ZS5zaApAQCAtMCwwICsxLDkzIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgdW5hbGlnbmVkIHNpemUgb2YgZXh0ZXJuYWwgb3JpZ2luIGFuZCB0aGluIHBvb2wgY2h1bmsgc2l6ZQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBjbXAgfHwgc2tpcAorCisjCisjIE1haW4KKyMKKworIyBUZXN0IG5lZWRzIHRoaW4tcG9vbCB0YXJnZXQgd2l0aCB1bmFsaWduZWQgZXh0LW9yaWcgc2l6ZSBzdXBwb3J0CithdXggaGF2ZV90aGluIDEgMTMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyIDY0MAorCisjIFVzZSA4SyBleHRlbnQgc2l6ZQordmdjcmVhdGUgJHZnIC1zIDhLICQoY2F0IERFVklDRVMpCisKKyMgUHJlcGFyZSBzb21lIG51bWVyaWMgcGF0dGVybiB3aXRoIH42NEsgc2l6ZQorc2VxIC1zICcgJyAtdyAwIDEwOTIyID4gNjRLCisKK2QxPSIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK2QyPSIkRE1fREVWX0RJUi8kdmcvJGx2MiIKKworIyBQcmVwYXJlIGV4dGVybmFsIG9yaWdpbiBMViB3aXRoIHNpemUgbm90IGJlaW5nIGEgbXVsdGlwbGUgb2YgdGhpbiBwb29sIGNodW5rIHNpemUKK2x2Y3JlYXRlIC1sNDcgLW4gJGx2MSAkdmcKKworIyBGaWxsIGVuZCB3aXRoIHBhdHRlcm4KK2RkIGlmPTY0SyBvZj0iJGQxIiBicz04MTkyIHNlZWs9NDUgY291bnQ9MiBjb252PWZkYXRhc3luYworCisjIFN3aXRjaCB0byByZWFkLW9ubHkgdm9sdW1lCitsdmNoYW5nZSAtYW4gJHZnLyRsdjEKK2x2Y2hhbmdlIC1wciAkdmcvJGx2MQorCitsdmNyZWF0ZSAtTDJNIC1UICR2Zy9wb29sIC1jIDE5MksKK2x2Y3JlYXRlIC1zICR2Zy8kbHYxIC0tbmFtZSAkbHYyIC0tdGhpbnBvb2wgJHZnL3Bvb2wKKworIyBDaGVjayB0aGUgdGFpbCBvZiAkbHYyIG1hdGNoZXMgJGx2MQorZGQgaWY9IiRkMiIgb2Y9MTZLIGJzPTgxOTIgc2tpcD00NSBjb3VudD0yCitjbXAgLW4gMTYzODQgLWwgNjRLIDE2SworCisjIE5vdyBleHRlbmQgYW5kIHJld3JpdGUKK2x2ZXh0ZW5kIC1sKzIgJHZnLyRsdjIKKworZGQgaWY9NjRLIG9mPSIkZDIiIGJzPTgxOTIgc2Vlaz00NiBjb3VudD0zIGNvbnY9ZmRhdGFzeW5jCitkZCBpZj0iJGQyIiBvZj0yNEsgYnM9ODE5MiBza2lwPTQ2IGNvdW50PTMgaWZsYWc9ZGlyZWN0CitjbXAgLW4gMjQ1NzYgLWwgNjRLIDI0SworCisjIENvbnN1bWVzIDIgMTkySyBjaHVua3MgLT4gNjYuNjclCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBkYXRhX3BlcmNlbnQgIjY2LjY3IgorCitsdnJlZHVjZSAtZiAtbC0yNCAkdmcvJGx2MgorCitkZCBpZj02NEsgb2Y9IiRkMiIgYnM9ODE5MiBzZWVrPTI0IGNvdW50PTEgY29udj1mZGF0YXN5bmMKK2RkIGlmPSIkZDIiIG9mPThLIGJzPTgxOTIgc2tpcD0yNCBjb3VudD0xIGlmbGFnPWRpcmVjdAorY21wIC1uIDgxOTIgLWwgNjRLIDhLCisKKyMgQ2hlY2sgZXh0ZW5zaW9uIHN0aWxsIHdvcmtzCitsdmV4dGVuZCAtbCsyICR2Zy8kbHYyCisKK2x2cmVtb3ZlIC1mICR2Zy9wb29sCisKK2x2Y3JlYXRlIC1MMjU2TSAtVCAkdmcvcG9vbCAtYyA2NE0KK2x2Y3JlYXRlIC1zICR2Zy8kbHYxIC0tbmFtZSAkbHYyIC0tdGhpbnBvb2wgJHZnL3Bvb2wKK2x2ZXh0ZW5kIC1sKzIgJHZnLyRsdjIKKworZGQgaWY9NjRLIG9mPSIkZDIiIGJzPTgxOTIgc2Vlaz00NSBjb3VudD00IGNvbnY9ZmRhdGFzeW5jCitkZCBpZj0iJGQyIiBvZj0zMksgYnM9ODE5MiBza2lwPTQ1IGNvdW50PTQgaWZsYWc9ZGlyZWN0CitjbXAgLW4gMzI3NjggLWwgNjRLIDMySworCitsdmV4dGVuZCAtTCs2NE0gJHZnLyRsdjIKKworIyBDb25zdW1lcyA2NE0gY2h1bmsgLT4gNTAlCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBkYXRhX3BlcmNlbnQgIjUwLjAwIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tZXh0ZXJuYWwuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tZXh0ZXJuYWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExMGMxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdGhpbi1leHRlcm5hbC5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgY3JlYXRpb24gb2YgdGhpbiBzbmFwc2hvdHMgdXNpbmcgZXh0ZXJuYWwgb3JpZ2luCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MiB8fCBza2lwCit3aGljaCBmc2NrIHx8IHNraXAKKworIworIyBNYWluCisjCithdXggaGF2ZV90aGluIDEgMyAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDIgNjQKKwordmdjcmVhdGUgJHZnIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCisjIE5ld2VyIHRoaW4tcG9vbCB0YXJnZXQgKD49IDEuMTMpIHN1cHBvcnRzIHVuYWxpZ25lZCBleHRlcm5hbCBvcmlnaW4KKyMgQnV0IHRoaXMgdGVzdCBpcyB3cml0dGVuIHRvIHRlc3QgYW5kIGV4cGVjdCBvbGRlciBiZWhhdmlvcgorYXV4IGx2bWNvbmYgJ2dsb2JhbC90aGluX2Rpc2FibGVkX2ZlYXR1cmVzID0gWyAiZXh0ZXJuYWxfb3JpZ2luX2V4dGVuZCIgXScKKworIyBUZXN0IHZhbGlkYXRpb24gZm9yIGV4dGVybmFsIG9yaWdpbiBiZWluZyBtdWx0aXBsZSBvZiB0aGluIHBvb2wgY2h1bmsgc2l6ZQorbHZjcmVhdGUgLUwxME0gLVQgJHZnL3Bvb2wxOTIgLWMgMTkyaworbHZjcmVhdGUgLWFuIC1wciAtWm4gLWwxIC1uICRsdjEgJHZnCitub3QgbHZjcmVhdGUgLXMgJHZnLyRsdjEgLS10aGlucG9vbCAkdmcvcG9vbDE5MgorCitsdmNyZWF0ZSAtYW4gLXByIC1abiAtbDUgLW4gJGx2MiAkdmcKK25vdCBsdmNyZWF0ZSAtcyAkdmcvJGx2MiAtLXRoaW5wb29sICR2Zy9wb29sMTkyCitsdnJlbW92ZSAtZiAkdmcKKworIyBQcmVwYXJlIHBvb2wgYW5kIGV4dGVybmFsIG9yaWdpbiB3aXRoIGZpbGVzeXN0ZW0KK2x2Y3JlYXRlIC1MMTBNIC1WMTBNIC1UICR2Zy9wb29sIC0tbmFtZSAkbHYxCitta2ZzLmV4dDIgIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorCitsdmNyZWF0ZSAtTDRNIC1uICRsdjIgJHZnCitta2ZzLmV4dDIgIiRETV9ERVZfRElSLyR2Zy8kbHYyIgorCisjIEZhaWwgdG8gY3JlYXRlIGV4dGVybmFsIG9yaWdpbiBzbmFwc2hvdCBvZiBydyBMVgorbm90IGx2Y3JlYXRlIC1zICR2Zy8kbHYyIC0tdGhpbnBvb2wgJHZnL3Bvb2wKKworbHZjaGFuZ2UgLXAgciAkdmcvJGx2MgorCisjIEZhaWwgdG8gY3JlYXRlIHNuYXBzaG90IG9mIGFjdGl2ZSByIExWCisjIEZJWE1FOiBrZXJuZWwgdXBkYXRlIG5lZWRlZAorbm90IGx2Y3JlYXRlIC1zICR2Zy8kbHYyIC0tdGhpbnBvb2wgJHZnL3Bvb2wKKworIyBEZWFjdGl2YXRlIExWIHdlIHdhbnQgdG8gdXNlIGFzIGV4dGVybmFsIG9yaWdpbgorIyBvbmNlIGtlcm5lbCB3aWxsIGVuc3VyZSByZWFkLW9ubHkgdGhpcyBjb25kaXRpb24gbWF5IGdvIGF3YXkKK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MgorCitsdmNyZWF0ZSAtcyAkdmcvJGx2MiAtLXRoaW5wb29sICR2Zy9wb29sCisKKyMgRmFpbCB3aXRoIC0tdGhpbiBhbmQgLS1zbmFwc2hvdAorbm90IGx2Y3JlYXRlIC1zICR2Zy8kbHY1IC0tbmFtZSAkdmcvJGx2NyAtVCAkdmcvbmV3cG9vbAorCisjIENhbm5vdCBzcGVjaWZ5IHNpemUgYW5kIHRoaW4gcG9vbC4KKyMgVE9ETzogbWF5YmUgd2l0aCAtLXBvb2xzaXplCitpbnZhbGlkIGx2Y3JlYXRlIC1zICR2Zy8kbHYyIC1MMTAgLS10aGlucG9vbCAkdmcvcG9vbAoraW52YWxpZCBsdmNyZWF0ZSAtcyAtSyAkdmcvJGx2MiAtLW5hbWUgJHZnLyRsdjMgLUwyMCAtLWNodW5rc2l6ZSAxMjggLS10aGlucG9vbCAkdmcvbmV3cG9vbAorCitub3QgbHZjcmVhdGUgLXMgJHZnLyRsdjIgLS1jaHVua3NpemUgNjQgLS10aGlucG9vbCAkdmcvcG9vbAorbm90IGx2Y3JlYXRlIC1zICR2Zy8kbHYyIC0temVybyB5IC0tdGhpbnBvb2wgJHZnL3Bvb2wKK25vdCBsdmNyZWF0ZSAtcyAkdmcvJGx2MiAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MSAtLXRoaW5wb29sICR2Zy9wb29sCisKKyMgRmFpbCB3aXRoIG5vbmV4aXN0ZW50IHBvb2wKK25vdCBsdmNyZWF0ZSAtcyAkdmcvJGx2MiAtLXRoaW5wb29sICR2Zy9uZXdwb29sCisKKyMgQ3JlYXRlIHBvb2wgYW5kIHNuYXAKK2x2Y3JlYXRlIC1UIC0tbmFtZSAkdmcvJGx2MyAtVjEwIC1MMjAgLS1jaHVua3NpemUgMTI4IC0tdGhpbnBvb2wgJHZnL25ld3Bvb2wKK2x2Y3JlYXRlIC1zIC1LICR2Zy8kbHYzIC0tbmFtZSAkdmcvJGx2NAorbHZjcmVhdGUgLXMgLUsgJHZnLyRsdjIgLS1uYW1lICR2Zy8kbHY1IC0tdGhpbnBvb2wgJHZnL25ld3Bvb2wKKyMgTWFrZSBub3JtYWwgdGhpbiBzbmFwc2hvdAorbHZjcmVhdGUgLXMgLUsgJHZnLyRsdjUgLS1uYW1lICR2Zy8kbHY2CisjIFdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgdGhpbnBvb2wgd2hlbiBkb2luZyB0aGluIHNuYXAsIGJ1dCBpdCBzaG91bGQgd29yaworbHZjcmVhdGUgLXMgLUsgJHZnLyRsdjUgLS1uYW1lICR2Zy8kbHY3IC0tdGhpbnBvb2wgJHZnL25ld3Bvb2wKKworY2hlY2sgaW5hY3RpdmUgJHZnICRsdjIKK2x2Y2hhbmdlIC1heSAkdmcvJGx2MgorbHZjcmVhdGUgLXMgLUsgJHZnLyRsdjIgLS1uYW1lICR2Zy8kbHY4IC0tdGhpbnBvb2wgJHZnL25ld3Bvb2wKKworbHZzIC1vK2NodW5rc2l6ZSAkdmcKKworY2hlY2sgYWN0aXZlICR2ZyAkbHYzCitjaGVjayBhY3RpdmUgJHZnICRsdjQKK2NoZWNrIGFjdGl2ZSAkdmcgJGx2NQorY2hlY2sgYWN0aXZlICR2ZyAkbHY2CitjaGVjayBhY3RpdmUgJHZnICRsdjcKKworZnNjayAtbiAiJERNX0RFVl9ESVIvJHZnLyRsdjEiCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcvJGx2NyIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNyZWF0ZS10aGluLXBvd2VyMi5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdGhpbi1wb3dlcjIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3YmNlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdGhpbi1wb3dlcjIuc2gKQEAgLTAsMCArMSw0NSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgdGVzdCBzdXBwb3J0IGZvciBub24tcG93ZXItb2YtMiB0aGluIGNodW5rIHNpemUKKyMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworLiBsaWIvaW5pdHRlc3QKKworIworIyBNYWluCisjCithdXggaGF2ZV90aGluIDEgNCAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDIgNjQKKwordmdjcmVhdGUgJHZnIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCisjIGNyZWF0ZSBub24tcG93ZXItb2YtMiBwb29sCitsdmNyZWF0ZSAtbDEwMCAtYyAxOTIgLVQgJHZnL3Bvb2wKKworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgZGlzY2FyZHMgInBhc3Nkb3duIgorCisjIGNoZWNrIHdlIGNhbm5vdCBjaGFuZ2UgZGlzY2FyZHMgc2V0dGluZ3MKK25vdCBsdmNoYW5nZSAtLWRpc2NhcmQgaWdub3JlICR2Zy9wb29sCitsdmNoYW5nZSAtLWRpc2NhcmQgbm9wYXNzZG93biAkdmcvcG9vbAorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgZGlzY2FyZHMgIm5vcGFzc2Rvd24iCisKKyMgbXVzdCBiZSBtdWx0aXBsZSBvZiA2NEtCCitub3QgbHZjcmVhdGUgLWwxMDAgLWMgMTY4IC1UICR2Zy9wb29sMQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tc25hcC5zaCBiL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdGhpbi1zbmFwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGUxMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4tc25hcC5zaApAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCitjaGVja19sdl9maWVsZF9tb2R1bGVzXygpCit7CisJbW9kPSQxCisJc2hpZnQKKworCWZvciBkIGluICQqOyBkbworCQljaGVjayBsdl9maWVsZCAkdmcvJGQgbW9kdWxlcyAkbW9kCisJZG9uZQorfQorCisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCit3aGljaCBta2ZzLmV4dDQgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgMiA2NAorCit2Z2NyZWF0ZSAkdmcgLXMgNjRLICQoY2F0IERFVklDRVMpCisKK2x2Y3JlYXRlIC1MMTBNIC1WMTBNIC1UICR2Zy9wb29sIC0tbmFtZSAkbHYxCitta2ZzLmV4dDQgIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorIyBjcmVhdGUgcmVhZC1vbmx5IHRoaW4gc25hcHNob3Qgb2YgdGhpbiBMVgorbHZjcmVhdGUgLUsgLXMgJHZnLyRsdjEgLXByIC0tbmFtZSBzbmFwCisjIGNoZWNrIHNuYXBzaG90IGZpbGVzeXN0ZW0gd2FzIHByb3Blcmx5IGZyb3plbiBiZWZvcmUgc25hcHBpbmcKK2ZzY2sgLW4gIiRETV9ERVZfRElSLyR2Zy9zbmFwIgorbHZjcmVhdGUgLUsgLXMgJHZnLyRsdjEgLS1uYW1lICRsdjIKK2x2Y3JlYXRlIC1LIC1zICR2Zy8kbHYxIC0tbmFtZSAkdmcvJGx2MworIyBvbGQtc25hcHNob3Qgd2l0aG91dCBrbm93biBzaXplIGlzIGludmFsaWQKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90ICR2Zy8kbHYxCitpbnZhbGlkIGx2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAkdmcvJGx2MSAtLW5hbWUgJGx2NAoraW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgJHZnLyRsdjEgLS1uYW1lICR2Zy8kbHY1CisjIHNvbWUgb3RoZXIgd2F5cyBob3cgdG8gdGFrZSBhIHRoaW4gc25hcHNob3QKK2x2Y3JlYXRlIC1UICR2Zy8kbHYxCitsdmNyZWF0ZSAtLXRoaW4gJHZnLyRsdjEgLS1uYW1lICRsdjQKK2x2Y3JlYXRlIC0tdHlwZSB0aGluICR2Zy8kbHYxIC0tbmFtZSAkdmcvJGx2NQorIyB2aXJ0dWFsIHNpemUgbmVlZHMgdGhpbiBwb29sCitmYWlsIGx2Y3JlYXRlIC0tdHlwZSB0aGluICR2Zy8kbHYxIC1WMjAKKworIyBjcmVhdGUgb2xkLXN0eWxlIHNuYXBzaG90CitsdmNyZWF0ZSAtcyAtTDEwTSAtLW5hbWUgb2xkc25hcDEgJHZnLyRsdjIKK2x2Y3JlYXRlIC1zIC1MMTBNIC0tbmFtZSBvbGRzbmFwMiAkdmcvJGx2MgorCisjIHRoaW4gc25hcCBvZiBzbmFwIG9mIHNuYXAuLi4KK2x2Y3JlYXRlIC1LIC1zIC0tbmFtZSBzbjEgJHZnLyRsdjIKK2x2Y3JlYXRlIC1LIC1zIC0tbmFtZSBzbjIgJHZnL3NuMQorbHZjcmVhdGUgLUsgLXMgLS1uYW1lIHNuMyAkdmcvc24yCitsdmNyZWF0ZSAtSyAtcyAtLW5hbWUgc240ICR2Zy9zbjMKKworbHZyZW1vdmUgLWZmICR2ZworCitsdmNyZWF0ZSAtTDEwTSAtLXplcm8gbiAtVCAkdmcvcG9vbCAtVjEwTSAtLW5hbWUgJGx2MQorbWtmcy5leHQ0ICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK2x2Y3JlYXRlIC1LIC1zICR2Zy8kbHYxIC0tbmFtZSBzbmFwCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcvc25hcCIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmNyZWF0ZS10aGluLnNoIGIvdGVzdC9zaGVsbC9sdmNyZWF0ZS10aGluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjFlNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXRoaW4uc2gKQEAgLTAsMCArMSwyMzkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyB0ZXN0IGN1cnJlbnRseSBuZWVkcyB0byBkcm9wCisjICdyZXR1cm4gTlVMTCcgaW4gX2x2X2NyZWF0ZV9hbl9sdiBhZnRlciBsb2dfZXJyb3IoIkNhbid0IGNyZWF0ZSAlcyB3aXRob3V0IHVzaW5nICIKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworLiBsaWIvaW5pdHRlc3QKKworY2hlY2tfbHZfZmllbGRfbW9kdWxlc18oKQoreworCW1vZD0kMQorCXNoaWZ0CisKKwlmb3IgZCBpbiAkKjsgZG8KKwkJY2hlY2sgbHZfZmllbGQgJHZnLyRkIG1vZHVsZXMgJG1vZAorCWRvbmUKK30KKworIworIyBNYWluCisjCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKK3doaWNoIG1rZnMuZXh0NCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyIDY0CisKK3ZnY3JlYXRlICR2ZyAtcyA2NEsgJChjYXQgREVWSUNFUykKKworIyBDcmVhdGUgbmFtZWQgcG9vbCBvbmx5CitsdmNyZWF0ZSAtbDEgLVQgJHZnL3Bvb2wxCitsdmNyZWF0ZSAtbDEgLVQgLS10aGlucG9vbCAkdmcvcG9vbDIKK2x2Y3JlYXRlIC1sMSAtVCAtLXRoaW5wb29sIHBvb2wzICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtbDEgLS10eXBlIHRoaW4gJHZnL3Bvb2w0CitpbnZhbGlkIGx2Y3JlYXRlIC1sMSAtLXR5cGUgdGhpbiAtLXRoaW5wb29sICR2Zy9wb29sNQoraW52YWxpZCBsdmNyZWF0ZSAtbDEgLS10eXBlIHRoaW4gLS10aGlucG9vbCBwb29sNiAkdmcKK2x2Y3JlYXRlIC1sMSAtLXR5cGUgdGhpbi1wb29sICR2Zy9wb29sNworbHZjcmVhdGUgLWwxIC0tdHlwZSB0aGluLXBvb2wgLS10aGlucG9vbCAkdmcvcG9vbDgKK2x2Y3JlYXRlIC1sMSAtLXR5cGUgdGhpbi1wb29sIC0tdGhpbnBvb2wgcG9vbDkgJHZnCisKK2x2cmVtb3ZlIC1mZiAkdmcvcG9vbDEgJHZnL3Bvb2wyICR2Zy9wb29sMyAkdmcvcG9vbDcgJHZnL3Bvb2w4ICR2Zy9wb29sOQorY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50IDAKKworCisjIExldCdzIHByZXRlbmQgcG9vbCBpcyBsaWtlIG5vcm1hbCBMViB3aGVuIHVzaW5nIC0tdHlwZSB0aGluLXBvb2wgc3VwcG9ydCAtLW5hbWUKKyMgUmVqZWN0IGFtYmlndW91cyB0aGluIHBvb2wgbmFtZXMKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIHRoaW4tcG9vbCAtbDEgLS1uYW1lIHBvb2wxICR2Zy9wb29sMgoraW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgdGhpbi1wb29sIC1sMSAtLW5hbWUgcG9vbDMgLS10aGlucG9vbCBwb29sNCAkdmcKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIHRoaW4tcG9vbCAtbDEgLS1uYW1lIHBvb2w1IC0tdGhpbnBvb2wgcG9vbDYgJHZnL3Bvb2w3CitpbnZhbGlkIGx2Y3JlYXRlIC0tdHlwZSB0aGluLXBvb2wgLWwxIC0tbmFtZSBwb29sOCAtLXRoaW5wb29sIHBvb2w4ICR2Zy9wb29sOQorCisjIG5vIHNpemUgc3BlY2lmaWVkIGFuZCBubyBvcmlnaW4gbmFtZSBnaXZlIGZvciBzbmFwc2hvdAoraW52YWxpZCBsdmNyZWF0ZSAtLXRoaW5wb29sIHBvb2wgJHZnCisKK2NoZWNrIHZnX2ZpZWxkICR2ZyBsdl9jb3VudCAwCisKK2x2Y3JlYXRlIC0tdHlwZSB0aGluLXBvb2wgLWwxIC0tbmFtZSBwb29sMSAkdmcKK2x2Y3JlYXRlIC0tdHlwZSB0aGluLXBvb2wgLWwxIC0tbmFtZSAkdmcvcG9vbDIKKyMgSWYgdGhlIHRoaW4gcG9vbCBuYW1lIGlzIHVuYW1iaWd1b3VzIGxldCBpdCBwcm9jZWVkCitsdmNyZWF0ZSAtLXR5cGUgdGhpbi1wb29sIC1sMSAtLW5hbWUgcG9vbDMgJHZnL3Bvb2wzCitsdmNyZWF0ZSAtLXR5cGUgdGhpbi1wb29sIC1sMSAtLW5hbWUgcG9vbDQgLS10aGlucG9vbCAkdmcvcG9vbDQKK2x2Y3JlYXRlIC0tdHlwZSB0aGluLXBvb2wgLWwxIC0tbmFtZSBwb29sNSAtLXRoaW5wb29sICR2Zy9wb29sNSAkdmcvcG9vbDUKKworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wxIHNlZ3R5cGUgInRoaW4tcG9vbCIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMiBzZWd0eXBlICJ0aGluLXBvb2wiCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbDMgc2VndHlwZSAidGhpbi1wb29sIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2w0IHNlZ3R5cGUgInRoaW4tcG9vbCIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sNSBzZWd0eXBlICJ0aGluLXBvb2wiCisKK2x2cmVtb3ZlIC1mZiAkdmcKKworCisjIENyZWF0ZSBkZWZhdWx0IHBvb2wgbmFtZQorbHZjcmVhdGUgLWwxIC1UICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtbDEgLS10eXBlIHRoaW4gJHZnCitsdmNyZWF0ZSAtbDEgLS10eXBlIHRoaW4tcG9vbCAkdmcKKworbHZyZW1vdmUgLWZmICR2ZworY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50IDAKKworCisjIENyZWF0ZSBkZWZhdWx0IHBvb2wgYW5kIGRlZmF1bHQgdGhpbiBMVgorbHZjcmVhdGUgLWwxIC1WMkcgLVQgJHZnCitsdmNyZWF0ZSAtbDEgLVYyRyAtLXR5cGUgdGhpbiAkdmcKKworbHZyZW1vdmUgLWZmICR2ZworCisKKyMgQ3JlYXRlIG5hbWVkIHBvb2wgYW5kIGRlZmF1bHQgdGhpbiBMVgorbHZjcmVhdGUgLUw0TSAtVjJHIC0tbmFtZSBsdm8xIC1UICR2Zy9wb29sMQorbHZjcmVhdGUgLUw0TSAtVjJHIC0tbmFtZSBsdm8yIC1UIC0tdGhpbnBvb2wgJHZnL3Bvb2wyCitsdmNyZWF0ZSAtTDRNIC1WMkcgLS1uYW1lIGx2bzMgLVQgLS10aGlucG9vbCBwb29sMyAkdmcKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtLW5hbWUgbHZvNCAtLXR5cGUgdGhpbiAkdmcvcG9vbDQKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtLW5hbWUgbHZvNSAtLXR5cGUgdGhpbiAtLXRoaW5wb29sICR2Zy9wb29sNQorbHZjcmVhdGUgLUw0TSAtVjJHIC0tbmFtZSBsdm82IC0tdHlwZSB0aGluIC0tdGhpbnBvb2wgcG9vbDYgJHZnCisKK2NoZWNrIGx2X2V4aXN0cyAkdmcgbHZvMSBsdm8yIGx2bzMKK2x2cmVtb3ZlIC1mZiAkdmcKKworCisjIENyZWF0ZSBuYW1lZCBwb29sIGFuZCBuYW1lZCB0aGluIExWCitsdmNyZWF0ZSAtTDRNIC1WMkcgLVQgJHZnL3Bvb2wxIC0tbmFtZSBsdjEKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtVCAkdmcvcG9vbDIgLS1uYW1lICR2Zy9sdjIKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtVCAtLXRoaW5wb29sICR2Zy9wb29sMyAtLW5hbWUgbHYzCitsdmNyZWF0ZSAtTDRNIC1WMkcgLVQgLS10aGlucG9vbCAkdmcvcG9vbDQgLS1uYW1lICR2Zy9sdjQKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtVCAtLXRoaW5wb29sIHBvb2w1IC0tbmFtZSBsdjUgJHZnCitsdmNyZWF0ZSAtTDRNIC1WMkcgLVQgLS10aGlucG9vbCBwb29sNiAtLW5hbWUgJHZnL2x2NiAkdmcKKworY2hlY2sgbHZfZXhpc3RzICR2ZyBsdjEgbHYyIGx2MyBsdjQgbHY1IGx2NgorbHZyZW1vdmUgLWZmICR2ZworCisKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtLXR5cGUgdGhpbiAkdmcvcG9vbDEgLS1uYW1lIGx2MQorbHZjcmVhdGUgLUw0TSAtVjJHIC0tdHlwZSB0aGluICR2Zy9wb29sMiAtLW5hbWUgJHZnL2x2MgorbHZjcmVhdGUgLUw0TSAtVjJHIC0tdHlwZSB0aGluIC0tdGhpbnBvb2wgJHZnL3Bvb2wzIC0tbmFtZSBsdjMKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtLXR5cGUgdGhpbiAtLXRoaW5wb29sICR2Zy9wb29sNCAtLW5hbWUgJHZnL2x2NAorbHZjcmVhdGUgLUw0TSAtVjJHIC0tdHlwZSB0aGluIC0tdGhpbnBvb2wgcG9vbDUgLS1uYW1lIGx2NSAkdmcKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtLXR5cGUgdGhpbiAtLXRoaW5wb29sIHBvb2w2IC0tbmFtZSAkdmcvbHY2ICR2ZworCitjaGVjayBsdl9leGlzdHMgJHZnIGx2MSBsdjIgbHYzIGx2NCBsdjUgbHY2CitsdnJlbW92ZSAtZmYgJHZnCisKKworIyBDcmVhdGUgZGVmYXVsdCB0aGluIExWIGluIGV4aXN0aW5nIHBvb2wKK2x2Y3JlYXRlIC1MNE0gLVQgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1WMkcgLS1uYW1lIGx2bzAgLVQgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1WMkcgLS1uYW1lIGx2bzEgLVQgLS10aGlucG9vbCAkdmcvcG9vbAorbHZjcmVhdGUgLVYyRyAtLW5hbWUgbHZvMiAtVCAtLXRoaW5wb29sIHBvb2wgJHZnCitsdmNyZWF0ZSAtVjJHIC0tbmFtZSBsdm8zIC0tdHlwZSB0aGluICR2Zy9wb29sCitsdmNyZWF0ZSAtVjJHIC0tbmFtZSBsdm80IC0tdHlwZSB0aGluIC0tdGhpbnBvb2wgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1WMkcgLS1uYW1lIGx2bzUgLS10eXBlIHRoaW4gLS10aGlucG9vbCBwb29sICR2ZworCitjaGVjayBsdl9leGlzdHMgJHZnIGx2bzAgbHZvMSBsdm8yIGx2bzMgbHZvNCBsdm81CisKKworIyBDcmVhdGUgbmFtZWQgdGhpbiBMViBpbiBleGlzdGluZyBwb29sCitsdmNyZWF0ZSAtVjJHIC1UICR2Zy9wb29sIC0tbmFtZSBsdjEKK2x2Y3JlYXRlIC1WMkcgLVQgJHZnL3Bvb2wgLS1uYW1lICR2Zy9sdjIKK2x2Y3JlYXRlIC1WMkcgLVQgLS10aGlucG9vbCAkdmcvcG9vbCAtLW5hbWUgbHYzCitsdmNyZWF0ZSAtVjJHIC1UIC0tdGhpbnBvb2wgJHZnL3Bvb2wgLS1uYW1lICR2Zy9sdjQKK2x2Y3JlYXRlIC1WMkcgLVQgLS10aGlucG9vbCBwb29sIC0tbmFtZSBsdjUgJHZnCitsdmNyZWF0ZSAtVjJHIC1UIC0tdGhpbnBvb2wgcG9vbCAtLW5hbWUgJHZnL2x2NiAkdmcKK2x2Y3JlYXRlIC1WMkcgLS10eXBlIHRoaW4gJHZnL3Bvb2wgLS1uYW1lIGx2NworbHZjcmVhdGUgLVYyRyAtLXR5cGUgdGhpbiAkdmcvcG9vbCAtLW5hbWUgJHZnL2x2OAorbHZjcmVhdGUgLVYyRyAtLXR5cGUgdGhpbiAtLXRoaW5wb29sICR2Zy9wb29sIC0tbmFtZSBsdjkKK2x2Y3JlYXRlIC1WMkcgLS10eXBlIHRoaW4gLS10aGlucG9vbCAkdmcvcG9vbCAtLW5hbWUgJHZnL2x2MTAKK2x2Y3JlYXRlIC1WMkcgLS10eXBlIHRoaW4gLS10aGlucG9vbCBwb29sIC0tbmFtZSBsdjExICR2ZworbHZjcmVhdGUgLVYyRyAtLXR5cGUgdGhpbiAtLXRoaW5wb29sIHBvb2wgLS1uYW1lICR2Zy9sdjEyICR2ZworCitjaGVjayBsdl9leGlzdHMgJHZnIGx2MSBsdjIgbHYzIGx2NCBsdjUgbHY2IGx2NyBsdjggbHY5IGx2MTAgbHYxMSBsdjEyCitjaGVjayB2Z19maWVsZCAkdmcgbHZfY291bnQgMTkKK2NoZWNrIGx2X2ZpZWxkICR2Zy9sdjEgdGhpbl9pZCA3CisKK2x2cmVtb3ZlIC1mZiAkdmcKK2NoZWNrIHZnX2ZpZWxkICR2ZyBsdl9jb3VudCAwCisKKyMgQ3JlYXRlIHRoaW4gc25hcHNob3Qgb2YgdGhpbkxWCitsdmNyZWF0ZSAtTDEwTSAtSTQgLWkyIC1WMTBNIC1UICR2Zy9wb29sIC0tbmFtZSBsdjEKK21rZnMuZXh0NCAiJERNX0RFVl9ESVIvJHZnL2x2MSIKK2x2Y3JlYXRlIC1LIC1zICR2Zy9sdjEgLS1uYW1lIHNuYXBfbHYxCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcvc25hcF9sdjEiCitsdmNyZWF0ZSAtcyAkdmcvbHYxIC0tbmFtZSBsdjIKK2x2Y3JlYXRlIC1zICR2Zy9sdjEgLS1uYW1lICR2Zy9sdjMKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90ICR2Zy9sdjEgLS1uYW1lIGx2NgoraW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgJHZnL2x2MSAtLW5hbWUgbHY0CitpbnZhbGlkIGx2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAkdmcvbHYxIC0tbmFtZSAkdmcvbHY1CisKK2x2ZGlzcGxheSAtLW1hcHMgJHZnCitjaGVja19sdl9maWVsZF9tb2R1bGVzXyB0aGluLHRoaW4tcG9vbCBsdjEgc25hcF9sdjEgbHYyIGx2MworY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50IDUKKworbHZyZW1vdmUgLWZmICR2ZworCisKKyMgTm9ybWFsIFNuYXBzaG90cyBvZiB0aGluTFYKK2x2Y3JlYXRlIC1MNE0gLVYyRyAtVCAkdmcvcG9vbCAtLW5hbWUgbHYxCitsdmNyZWF0ZSAtcyAkdmcvbHYxIC1sMSAtLW5hbWUgc25hcF9sdjEKK2x2Y3JlYXRlIC1zICR2Zy9sdjEgLWwxIC0tbmFtZSBsdjIKK2x2Y3JlYXRlIC1zICR2Zy9sdjEgLWwxIC0tbmFtZSAkdmcvbHYzCitsdmNyZWF0ZSAtcyBsdjEgLUw0TSAtLW5hbWUgJHZnL2x2NAorCitjaGVja19sdl9maWVsZF9tb2R1bGVzXyBzbmFwc2hvdCBzbmFwX2x2MSBsdjIgbHYzIGx2NAorY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50IDYKKworbHZyZW1vdmUgLWZmICR2ZworY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50IDAKKworIyBGYWlsIGNhc2VzCisjIFRvbyBzbWFsbCBwb29sIHNpemUgKDEgZXh0ZW50IDY0S0IpIGZvciBnaXZlbiBjaHVuayBzaXplCitub3QgbHZjcmVhdGUgLS1jaHVua3NpemUgMjU2IC1sMSAtVCAkdmcvcG9vbDEKKyMgVG9vIHNtYWxsIGNodW5rIHNpemUgKG1pbiBpcyA2NEtCIC0gIDEyOCBzZWN0b3JzKQorbm90IGx2Y3JlYXRlIC0tY2h1bmtzaXplIDMyIC1sMSAtVCAkdmcvcG9vbDEKKyMgVG9vIGxhcmdlIGNodW5rIHNpemUgKG1heCBpcyAxR0IpCitub3QgbHZjcmVhdGUgLUw0TSAtLWNodW5rc2l6ZSAyRyAtVCAkdmcvcG9vbDEKKyMgQ2Fubm90IHNwZWNpZnkgLS1taW5vciB3aXRoIHBvb2wKK2ZhaWwgbHZjcmVhdGUgLUwxME0gLS1taW5vciAxMDAgLVQgJHZnL3Bvb2xfbWlub3IKKworIyBGSVhNRTogQ3VycmVudGx5IGFtYmlnb3VzIC0gaXMgaXQgZm9yIHRoaW4sIHRoaW4tcG9vbCwgYm90aCA/CitmYWlsIGx2Y3JlYXRlIC1MNE0gLU1uIC1tMCAtVCAtLXJlYWRhaGVhZCAzMiAtVjIwIC1uICRsdiAkdmcvcG9vbF9ub3JtYWwKKworIyBDaGVjayByZWFkLWFoZWFkIHNldHRpbmcgd2lsbCBhbHNvIHBhc3Mgd2l0aCAtTW4gLW0wCitsdmNyZWF0ZSAtTDRNIC1NbiAtbTAgLVQgLS1yZWFkYWhlYWQgNjRrICR2Zy9wb29sX3JlYWRhaGVhZAorbHZjcmVhdGUgLVYyME0gLU1uIC1tMCAtVCAtLXJlYWRhaGVhZCAxMjhrIC1uIHRoaW5fcmVhZGFoZWFkICR2Zy9wb29sX3JlYWRhaGVhZAorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfcmVhZGFoZWFkIGx2X3JlYWRfYWhlYWQgIjY0LjAwayIKK2NoZWNrIGx2X2ZpZWxkICR2Zy90aGluX3JlYWRhaGVhZCBsdl9yZWFkX2FoZWFkICIxMjguMDBrIgorCitpZiB0ZXN0ICEgLWQgL3N5cy9ibG9jay9kbS0yMzQ1OyB0aGVuCisjIENoZWNrIHNvbWUgdW51c2VkIG1pbm9yIGFuZCBzdXBwb3J0IGZvciAtLW1pbm9yIHdpdGggdGhpbnMKKwlsdmNyZWF0ZSAtLW1pbm9yIDIzNDUgLVQgLVYyME0gLW4gdGhpbl9taW5vciAkdmcvcG9vbF9yZWFkYWhlYWQKKwljaGVjayBsdl9maWVsZCAkdmcvdGhpbl9taW5vciBsdl9taW5vciAiMjM0NSIKK2ZpCisKKyMgVGVzdCBjcmVhdGlvbiBvZiBpbmFjdGl2ZSBwb29sCitsdmNyZWF0ZSAtYW4gLUw0TSAtVCAkdmcvcG9vbDEKK2x2Y3JlYXRlIC1WMkcgLS1uYW1lIGx2MSAtVCAkdmcvcG9vbDEKKyMgQ2hlY2sgd2UgYXJlIGFibGUgcmVtb3ZlIHNwYXJlIHZvbHVtZSBpZiB3ZSB3YW50IHRvCitsdnJlbW92ZSAtZiAkdmcvbHZvbDBfcG1zcGFyZQorCisjIE9yaWdpbiBuYW1lIGlzIG5vdCBhY2NlcHRlZAorbm90IGx2Y3JlYXRlIC1zICR2Zy9sdjEgLUw0TSAtVjJHIC0tbmFtZSAkdmcvbHY0CisKKyMgQ2hlY2sgd2UgY2Fubm90IGNyZWF0ZSBtaXJyb3IvcmFpZDEgYW5kIHRoaW4gb3IgdGhpbnBvb2wgdG9nZXRoZXIKK25vdCBsdmNyZWF0ZSAtVCBtaXJwb29sIC1MNE0gLS1hbGxvYyBhbnl3aGVyZSAtbTEgJHZnCitub3QgbHZjcmVhdGUgLS10aGlucG9vbCBtaXJwb29sIC1MNE0gLS1hbGxvYyBhbnl3aGVyZSAtbTEgJHZnCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZjcmVhdGUtdXNhZ2Uuc2ggYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXVzYWdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjQ3MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2Y3JlYXRlLXVzYWdlLnNoCkBAIC0wLDAgKzEsMjA3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdFeGVyY2lzZSBzb21lIGx2Y3JlYXRlIGRpYWdub3N0aWNzJworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgNAorYXV4IHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiCit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKKworaW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgZnJlZSAtbDEgLW4gJGx2MSAkdmcgMj5lcnIKK2dyZXAgIkludmFsaWQgYXJndW1lbnQgZm9yIC0tdHlwZSIgZXJyCitpbnZhbGlkIGx2Y3JlYXRlIC0tdHlwZSAkUkFORE9NIC1sMSAtbiAkbHYxICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtLXR5cGUgdW5rbm93biAtbDEgLW4gJGx2MSAkdmcKKworbHZjcmVhdGUgLS10eXBlIGxpbmVhciAtYWV5IC1tMCAtbDEgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtbDEgLW4gJGx2MiAkdmcvJGx2MQorCisjIFJlamVjdCByZXBlYXRlZCBpbnZvY2F0aW9uIChydW4gMiB0aW1lcykgKGJ6MTc4MjE2KQorbHZjcmVhdGUgLW4gJGx2IC1sIDQgJHZnCitub3QgbHZjcmVhdGUgLW4gJGx2IC1sIDQgJHZnCitsdnJlbW92ZSAtZmYgJHZnLyRsdgorIyBUcnkgdG8gcmVtb3ZlIGl0IGFnYWluIC0gc2hvdWxkIGZhaWwgKGJ1dCBub3Qgc2VnZmF1bHQpCitub3QgbHZyZW1vdmUgLWZmICR2Zy8kbHYKKworIyBSZWplY3QgYSBuZWdhdGl2ZSBzdHJpcGVfc2l6ZQoraW52YWxpZCBsdmNyZWF0ZSAtTCA2NG0gLW4gJGx2IC1pMiAtLXN0cmlwZXNpemUgLTQgJHZnIDI+ZXJyOworZ3JlcCAibWF5IG5vdCBiZSBuZWdhdGl2ZSIgZXJyCisKKyMgUmVqZWN0IGEgdG9vLWxhcmdlIHN0cmlwZXNpemUKK2ludmFsaWQgbHZjcmVhdGUgLUwgNjRtIC1uICRsdiAtaTIgLS1zdHJpcGVzaXplIDQyOTQ5NjcyOTEgJHZnIDI+ZXJyCitncmVwICJTdHJpcGUgc2l6ZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4iIGVycgorCisjIHcvc2luZ2xlIHN0cmlwZSBzdWNjZWVkcyB3aXRoIGRpYWdub3N0aWNzIHRvIHN0ZG91dAorbHZjcmVhdGUgLUwgNjRtIC1uICRsdiAtaTEgLS1zdHJpcGVzaXplIDQgJHZnIDI+IGVyciB8IHRlZSBvdXQKK2dyZXAgIklnbm9yaW5nIHN0cmlwZXNpemUgYXJndW1lbnQgd2l0aCBzaW5nbGUgc3RyaXBlIiBvdXQKK2x2ZGlzcGxheSAkdmcKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyB3L2RlZmF1bHQgKDY0S0IpIHN0cmlwZSBzaXplIHN1Y2NlZWRzIHdpdGggZGlhZ25vc3RpY3MgdG8gc3Rkb3V0CitsdmNyZWF0ZSAtTCA2NG0gLW4gJGx2IC1pMiAkdmcgPiBvdXQKK2dyZXAgIlVzaW5nIGRlZmF1bHQgc3RyaXBlc2l6ZSIgb3V0CitsdmRpc3BsYXkgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2IHN0cmlwZXNpemUgIjY0LjAwayIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBSZWplY3QgYW4gaW52YWxpZCBudW1iZXIgb2Ygc3RyaXBlcworaW52YWxpZCBsdmNyZWF0ZSAtTCA2NG0gLW4gJGx2IC1pMTI5ICR2ZyAyPmVycgorZ3JlcCAiTnVtYmVyIG9mIHN0cmlwZXMgKDEyOSkgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOCIgZXJyCisKKyMgUmVqZWN0IGFuIGludmFsaWQgc3RyaXBlIHNpemUKK2ludmFsaWQgbHZjcmVhdGUgLUwgNjRtIC1uICRsdiAtaTIgLS1zdHJpcGVzaXplIDMgJHZnIDI+ZXJyCitncmVwICJJbnZhbGlkIHN0cmlwZSBzaXplIiBlcnIKKyMgVmVyaWZ5IHRoYXQgdGhlIExWIHdhcyBub3QgY3JlYXRlZCB2aWEgbHZkaXNwbGF5IGVtcHR5IG91dHB1dAordGVzdCAteiAiJChsdmRpc3BsYXkgJHZnKSIKKworIyBTZXR0aW5nIG1heF9sdiB3b3Jrcy4gKGJ6NDkwMjk4KQorY2hlY2sgdmdfZmllbGQgJHZnIG1heF9sdiAiMCIKK3ZnY2hhbmdlIC1sIDMgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgbWF4X2x2ICIzIgorbHZjcmVhdGUgLWFleSAtbDEgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1sMSAtcyAtbiAkbHYyICR2Zy8kbHYxCitsdmNyZWF0ZSAtbDEgLW4gJGx2MyAkdmcKK2ZhaWwgbHZjcmVhdGUgLWwxIC1uICRsdjQgJHZnCitsdnJlbW92ZSAtZmYgJHZnLyRsdjMKKworIyBDaGVjayBzbmFwc2hvdCBvZiBpbmFjdGl2ZSBvcmlnaW4KK2x2Y2hhbmdlIC1hbiAkdmcvJGx2MQorbHZjcmVhdGUgLWwxIC1zIC1uICRsdjMgJHZnLyRsdjEKK2ZhaWwgbHZjcmVhdGUgLWwxIC1uICRsdjQgJHZnCitmYWlsIGx2Y3JlYXRlIC1sMSAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHY0ICR2ZworCitsdnJlbW92ZSAtZmYgJHZnLyRsdjMKK2x2Y3JlYXRlIC1hZXkgLWwxIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjMgJHZnCitub3QgbHZjcmVhdGUgLWwxIC1uICRsdjQgJHZnCitub3QgbHZjcmVhdGUgLWwxIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjQgJHZnCisKK2x2Y29udmVydCAtbTAgJHZnLyRsdjMKK2x2Y29udmVydCAtbTIgLS10eXBlIG1pcnJvciAtaSAxICR2Zy8kbHYzCitsdmNvbnZlcnQgLW0xICR2Zy8kbHYzCisKK2ZhaWwgdmdjaGFuZ2UgLWwgMgorY2hlY2sgdmdfZmllbGQgJHZnIG1heF9sdiAiMyIKK3ZnY2hhbmdlIC1sIDQKK2NoZWNrIHZnX2ZpZWxkICR2ZyBtYXhfbHYgIjQiCisKK2x2cmVtb3ZlIC1mZiAkdmcKK3ZnY2hhbmdlIC1sIDAgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgbWF4X2x2ICIwIgorCisjIFJlamVjdHMgaW52YWxpZCBjaHVua3NpemUsIGFjY2VwdHMgYmV0d2VlbiA0SyBhbmQgNTEySworIyBhbmQgdmFsaWRhdGUgb3JpZ2luX3NpemUKK2x2Y3JlYXRlIC1hZXkgLUwgMzJtIC1uICRsdjEgJHZnCitub3QgbHZjcmVhdGUgLUwgOG0gLW4gJGx2MiAtcyAtLWNodW5rc2l6ZSAzayAkdmcvJGx2MQorbm90IGx2Y3JlYXRlIC1MIDhtIC1uICRsdjIgLXMgLS1jaHVua3NpemUgMTAyNGsgJHZnLyRsdjEKK2x2Y3JlYXRlIC1MIDhtIC1uICRsdjIgLXMgLS1jaHVua3NpemUgNGsgJHZnLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIGNodW5rX3NpemUgIjQuMDBrIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjIgb3JpZ2luX3NpemUgIjMyLjAwbSIKK2x2Y3JlYXRlIC1MIDhtIC1uICRsdjMgLXMgLS1jaHVua3NpemUgNTEyayAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjMgY2h1bmtfc2l6ZSAiNTEyLjAwayIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYzIG9yaWdpbl9zaXplICIzMi4wMG0iCitsdnJlbW92ZSAtZiAkdmcKKworIyBNaXJyb3IgcmVnaW9uc2l6ZSBtdXN0IGJlCisjIC0gbm9uemVybyAoYnoxODYwMTMpCisjIC0gYSBwb3dlciBvZiAyIGFuZCBhIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZQorIyAtIDw9IHNpemUgb2YgTFYKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIG1pcnJvciAtbSAxIC1MIDMybSAtbiAkbHYgLVIgMCAkdmcgMj5lcnIKK2dyZXAgIm1heSBub3QgYmUgemVybyIgZXJyCitpbnZhbGlkIGx2Y3JlYXRlIC0tdHlwZSBtaXJyb3IgLW0gMSAtTCAzMm0gLW4gJGx2IC1SIDExayAkdmcKK2ludmFsaWQgbHZjcmVhdGUgLS10eXBlIG1pcnJvciAtbSAxIC1MIDMybSAtbiAkbHYgLVIgMWsgJHZnCitsdmNyZWF0ZSAtYWV5IC1MIDMybSAtbiAkbHYgLS1yZWdpb25zaXplIDEyOG0gIC0tdHlwZSBtaXJyb3IgLW0gMSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmVnaW9uc2l6ZSAiMzIuMDBtIgorbHZyZW1vdmUgLWYgJHZnCitsdmNyZWF0ZSAtYWV5IC1MIDMybSAtbiAkbHYgLS1yZWdpb25zaXplIDRtIC0tdHlwZSBtaXJyb3IgLW0gMSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgcmVnaW9uc2l6ZSAiNC4wMG0iCisKKyMgLW0wIGlzIGNyZWF0aW5nIG5vbi1taXJyb3JlZCBzZWdtZW50IGFuZCBnaXZlIGluZm8gYWJvdXQgcmVkdW5kYW50IG9wdGlvbgorbHZjcmVhdGUgLW0gMCAtbDEgLW4gJGx2MSAkdmcgMj4mMSB8IHRlZSBlcnIKK2dyZXAgIlJlZHVuZGFudCIgZXJyCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlICJsaW5lYXIiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgT2xkIC0tdHlwZSBzbmFwc2hvdCB3b3JrcyB3aXRoIC1zCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLVY2NCAtTDMyIC1uICRsdjEgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlICJsaW5lYXIiCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLVY2NCAtTDMyIC1uICRsdjIgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBzZWd0eXBlICJsaW5lYXIiCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgLS12aXJ0dWFsb3JpZ2luc2l6ZSAgYWx3YXlzIG1ha2VzIG9sZCBzbmFwc2hvdAorbHZjcmVhdGUgLXMgLS12aXJ0dWFsb3JpZ2luc2l6ZSA2NG0gLUwgMzJtIC1uICRsdjEgJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlICJsaW5lYXIiCitsdnJlbmFtZSAkdmcvJGx2MSAkdmcvJGx2MgorbHZjcmVhdGUgLXMgLS12aXJ0dWFsb3JpZ2luc2l6ZSA2NG0gLUwgMzJtIC1uICRsdjEgJHZnCitsdmNoYW5nZSAtYSBuICR2Zy8kbHYxCitsdnJlbW92ZSAtZmYgJHZnLyRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyByZWFkYWhlYWQgZGVmYXVsdCAoYXV0byksIG5vbmUsICMsIGF1dG8KK2x2Y3JlYXRlIC1MIDggLW4gJGx2MSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGx2X3JlYWRfYWhlYWQgImF1dG8iCitsdmNyZWF0ZSAtTCA4IC1uICRsdjIgLS1yZWFkYWhlYWQgbm9uZSAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIGx2X3JlYWRfYWhlYWQgIjAiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBsdl9rZXJuZWxfcmVhZF9haGVhZCAiMCIKK2x2Y3JlYXRlIC1MIDggLW4gJGx2MyAtLXJlYWRhaGVhZCA4ayAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYzIGx2X3JlYWRfYWhlYWQgIjguMDBrIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjMgbHZfa2VybmVsX3JlYWRfYWhlYWQgIjguMDBrIgorbHZjcmVhdGUgLUwgOCAtbiAkbHY0IC0tcmVhZGFoZWFkIGF1dG8gJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2NCBsdl9yZWFkX2FoZWFkICJhdXRvIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjQgbHZfa2VybmVsX3JlYWRfYWhlYWQgIjEyOC4wMGsiCitsdmNyZWF0ZSAtTCA4IC1uICRsdjUgLWkyIC0tc3RyaXBlc2l6ZSAxNmsgLS1yZWFkYWhlYWQgYXV0byAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHY1IGx2X3JlYWRfYWhlYWQgImF1dG8iCitjaGVjayBsdl9maWVsZCAkdmcvJGx2NSBsdl9rZXJuZWxfcmVhZF9haGVhZCAiMTI4LjAwayIKK2x2Y3JlYXRlIC1MIDggLW4gJGx2NiAtaTIgLS1zdHJpcGVzaXplIDEyOGsgLS1yZWFkYWhlYWQgYXV0byAkdmcKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHY2IGx2X3JlYWRfYWhlYWQgImF1dG8iCitjaGVjayBsdl9maWVsZCAkdmcvJGx2NiBsdl9rZXJuZWxfcmVhZF9haGVhZCAiNTEyLjAwayIKK2x2cmVtb3ZlIC1mZiAkdmcKKworIworIyBWYWxpZGF0ZSAtLW1ham9yIC0tbWlub3IsICB3ZSBuZWVkIHRvIGtub3cgVkcsIHRodXMgZmFpbGluZworIworZmFpbCBsdmNyZWF0ZSAtTXkgLS1tYWpvciAyMzQgLWwxICR2ZworIyBjYW5ub3Qgc3BlY2lmeSAtLW1ham9yIG9yIC0tbWlub3Igd2l0aCAtTW4KK2ZhaWwgbHZjcmVhdGUgLU1uIC0tbWFqb3IgMjM0IC1sMSAkdmcKK2ZhaWwgbHZjcmVhdGUgLS1wZXJzaXN0ZW50IG4gLS1taW5vciAyMzQgLWwxICR2ZworIyBvdXQtb2YtcmFuZ2UgbWlub3IgdmFsdWUKK2ZhaWwgbHZjcmVhdGUgLS1taW5vciA5OTk5OTk5IC1sMSAkdmcKK2lmIGF1eCBrZXJuZWxfYXRfbGVhc3QgMiA0IDA7IHRoZW4KKyMgT24gPjIuNCB3ZSBpZ25vcmUgLS1tYWpvcgorbHZjcmVhdGUgLS1tYWpvciAyMzQgLWwxICR2ZyAyPiYxIHwgdGVlIGVycjsKK2dyZXAgIklnbm9yaW5nIiBlcnIKKyMgVHJ5IHNvbWUgYmlnZ2VyIHBvc3NpYmx5IHVudXNlZCBtaW5vcgoraWYgdGVzdCAhIC1kIC9zeXMvYmxvY2svZG0tMjM0NTsgdGhlbgorCWx2Y3JlYXRlIC0tbWlub3IgMjM0NSAtbDEgLW4gJGx2MSAkdmcKKwljaGVjayBsdl9maWVsZCAkdmcvJGx2MSBsdl9rZXJuZWxfbWlub3IgIjIzNDUiCitmaQoraWYgdGVzdCAhIC1kIC9zeXMvYmxvY2svZG0tMjM0NTY7IHRoZW4KKwlsdmNyZWF0ZSAtTXkgLS1taW5vciAyMzQ1NiAtaiAxMjIgLWwxIC1uICRsdjIgJHZnCisJY2hlY2sgbHZfZmllbGQgJHZnLyRsdjIgbHZfa2VybmVsX21pbm9yICIyMzQ1NiIKK2ZpCitmaSAjIDIuNAorbHZyZW1vdmUgLWYgJHZnCisKKyMgcHJvaGliaXRlZCBuYW1lcworZm9yIGkgaW4gcHZtb3ZlIHNuYXBzaG90IDsgZG8KKwlpbnZhbGlkIGx2Y3JlYXRlIC1sMSAtbiAke2l9MSAkdmcKK2RvbmUKK2ZvciBpIGluIF9jZGF0YSBfY21ldGEgX21pbWFnZSBfbWxvZyBfcG1zcGFyZSBfdGRhdGEgX3RtZXRhIF92b3JpZ2luIDsgZG8KKwlpbnZhbGlkIGx2Y3JlYXRlIC1sMSAtbiBzXyR7aX1fMSAkdmcKK2RvbmUKKworIyBDaGVjayBpbnZhbGlkIGVycm9yIGZvciBwb29sLW9ubHkgb3B0aW9ucworaW52YWxpZCBsdmNyZWF0ZSAtLXBvb2xtZXRhZGF0YXNwYXJlIHkgLWwxICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtLXBvb2xtZXRhZGF0YXNpemUgMTAgLWwxICR2ZworaW52YWxpZCBsdmNyZWF0ZSAtLWRpc2NhcmRzIHBhc3Nkb3duIC1sMSAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZleHRlbmQtcGVyY2VudC1leHRlbnRzLnNoIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC1wZXJjZW50LWV4dGVudHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjMzZiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtcGVyY2VudC1leHRlbnRzLnNoCkBAIC0wLDAgKzEsMTEwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdDaGVjayBleHRlbnRzIHBlcmNlbnRhZ2UgYXJndW1lbnRzJworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIgMTI4Cit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKKworbHZjcmVhdGUgLUw2NCAtbiAkbHYgJHZnCisKKyMgJ2x2ZXh0ZW5kIHJlamVjdHMgYm90aCBzaXplIGFuZCBleHRlbnRzIHdpdGhvdXQgUFZzJworbm90IGx2ZXh0ZW5kIC1sIDEwIC1MIDY0bSAkdmcvJGx2IDI+ZXJyCitncmVwICJQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgc2l6ZSBvciBleHRlbnRzIGJ1dCBub3QgYm90aC4iIGVycgorCisjICdsdmV4dGVuZCByZWplY3RzIGJvdGggc2l6ZSBhbmQgZXh0ZW50cyB3aXRoIFBWcycKK25vdCBsdmV4dGVuZCAtbCAxMCAtTCA2NG0gJHZnLyRsdiAiJGRldjEiIDI+ZXJyCitncmVwICJQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgc2l6ZSBvciBleHRlbnRzIGJ1dCBub3QgYm90aC4iIGVycgorCisjICdsdmV4dGVuZCBhY2NlcHRzIG5vIHNpemUgb3IgZXh0ZW50cyBidXQgb25lIFBWIC0gYnoxNTQ2OTEnCitsdmV4dGVuZCAkdmcvJGx2ICIkZGV2MSIgfCB0ZWUgb3V0CitncmVwICJMb2dpY2FsIHZvbHVtZSAkdmcvJGx2IHN1Y2Nlc3NmdWxseSByZXNpemVkIiBvdXQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfZnJlZSAiMCIKKworbHZyZW1vdmUgLWYgJHZnLyRsdgorCisjICdsdmV4dGVuZCBjb21wdXRlcyBuZWNlc3NhcnkgZnJlZSBzcGFjZSBjb3JyZWN0bHkgLSBiejIxMzU1MicKK3Znc2l6ZT0kKGdldCB2Z19maWVsZCAkdmcgdmdfZXh0ZW50X2NvdW50KQorbHZjcmVhdGUgLWwgJHZnc2l6ZSAgLW4gJGx2ICR2ZworbHZyZWR1Y2UgLWYgLWwgJCgoICR2Z3NpemUgLyAyICkpICR2Zy8kbHYKK2x2ZXh0ZW5kIC1sICR2Z3NpemUgJHZnLyRsdgorCisjICdSZXNldCBMViB0byBvcmlnaW5hbCBzaXplJworbHZyZW1vdmUgLWYgJHZnLyRsdgorbHZjcmVhdGUgLUwgNjRtIC1uICRsdiAkdmcKKworIyAnbHZleHRlbmQgYWNjZXB0cyBubyBzaXplIGJ1dCBleHRlbnRzIDEwMCVQVlMgYW5kIHR3byBQVnMgLSBiejE1NDY5MScKK2x2ZXh0ZW5kIC1sICsxMDAlUFZTICR2Zy8kbHYgIiRkZXYxIiAiJGRldjIiIHwgdGVlIG91dAorZ3JlcCAiTG9naWNhbCB2b2x1bWUgJHZnLyRsdiBzdWNjZXNzZnVsbHkgcmVzaXplZCIgb3V0CitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X2ZyZWUgIjAiCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2ZyZWUgIjAiCisKKyMgRXhlcmNpc2UgdGhlIHJhbmdlIG92ZXJsYXAgY29kZS4gIEFsbG9jYXRlIGV2ZXJ5IDIgZXh0ZW50cy4KKyMKKyMgICAgICBQaHlzaWNhbCBFeHRlbnRzCisjICAgICAgICAgIDEgICAgICAgICAyCisjMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCisjCisjYWFYWGFhWFhhYVhYYWFYWGFhWFhhYVhYIC0gKGEpbGxvY2F0ZWQKKyNycnJYWFhycnJYWFhycnJYWFhycnJYWFggLSAocilhbmdlIG9uIGNtZGxpbmUKKyNvb1hYWFhYWG9YWFhvb1hYWFhYWG9YWFggLSAobyl2ZXJsYXAgb2YgcmFuZ2UgYW5kIGFsbG9jYXRlZAorIworIyBLZXk6IGEgLSBhbGxvY2F0ZWQKKyMgICAgICBGIC0gZnJlZQorIyAgICAgIHIgLSBwYXJ0IG9mIGEgcmFuZ2Ugb24gdGhlIGNtZGxpbmUKKyMgICAgICBOIC0gbm90IG9uIGNtZGxpbmUKKyMKKyMgQ3JlYXRlIHRoZSBMViB3aXRoIDEyIGV4dGVudHMsIGFsbG9jYXRlZCBldmVyeSBvdGhlciAyIGV4dGVudHMuCisjIFRoZW4gZXh0ZW5kIGl0LCB3aXRoIGEgcmFuZ2Ugb2YgUFZzIG9uIHRoZSBjbWRsaW5lIG9mIGV2ZXJ5IG90aGVyIDMgZXh0ZW50cy4KKyMgVG90YWwgbnVtYmVyIG9mIGV4dGVudHMgc2hvdWxkIGJlIDEyICsgb3ZlcmxhcCA9IDEyICsgNiA9IDE4LgorIyBUaHVzLCB0b3RhbCBzaXplIGZvciB0aGUgTFYgc2hvdWxkIGJlIDE4ICogNE0gPSA3Mk0KKyMKKyMgJ1Jlc2V0IExWIHRvIDEyIGV4dGVudHMsIGFsbG9jYXRlIGV2ZXJ5IG90aGVyIDIgZXh0ZW50cycKK2NyZWF0ZV9wdnM9JChmb3IgaSBpbiAkKHNlcSAwIDQgMjApOyBkbyBlY2hvIC1uICIkZGV2MTokaS0kKCgkaSArIDEpKSAiOyBkb25lKQorbHZyZW1vdmUgLWYgJHZnLyRsdgorbHZjcmVhdGUgLWwgMTIgLW4gJGx2ICR2ZyAkY3JlYXRlX3B2cworY2hlY2sgbHZfZmllbGQgJHZnLyRsdiBsdl9zaXplICI0OC4wMG0iCisKKyMgJ2x2ZXh0ZW5kIHdpdGggcGFydGlhbGx5IGFsbG9jYXRlZCBQVnMgYW5kIGV4dGVudHMgMTAwJVBWUyB3aXRoIFBFIHJhbmdlcycKK2V4dGVuZF9wdnM9JChmb3IgaSBpbiAkKHNlcSAwIDYgMTgpOyBkbyBlY2hvIC1uICIkZGV2MTokaS0kKCgkaSArIDIpKSAiOyBkb25lKQorbHZleHRlbmQgLWwgKzEwMCVQVlMgJHZnLyRsdiAkZXh0ZW5kX3B2cyB8IHRlZSBvdXQKK2dyZXAgIkxvZ2ljYWwgdm9sdW1lICR2Zy8kbHYgc3VjY2Vzc2Z1bGx5IHJlc2l6ZWQiIG91dAorY2hlY2sgbHZfZmllbGQgJHZnLyRsdiBsdl9zaXplICI3Mi4wMG0iCisKKyMgU2ltcGxlIHNlZ19jb3VudCB2YWxpZGF0aW9uOyBpbml0aWFsbHkgY3JlYXRlIHRoZSBMViB3aXRoIGhhbGYgdGhlICMgb2YKKyMgZXh0ZW50cyAoc2hvdWxkIGJlIDEgbHYgc2VnbWVudCksIGV4dGVuZCBpdCAoc2hvdWxkIGdvIHRvIDIgc2VnbWVudHMpLAorIyB0aGVuIHJlZHVjZSAoc2hvdWxkIGJlIGJhY2sgdG8gMSkKKyMgRklYTUU6IHRlc3Qgb3RoZXIgc2VnbWVudCBmaWVsZHMgc3VjaCBhcyBzZWdfc2l6ZSwgcHZzZWdfc3RhcnQsIHB2c2VnX3NpemUKK2x2cmVtb3ZlIC1mICR2Zy8kbHYKK3BlX2NvdW50PSQoZ2V0IHB2X2ZpZWxkICIkZGV2MSIgcHZfcGVfY291bnQpCitwZTE9JCgoICRwZV9jb3VudCAvIDIgKSkKK2x2Y3JlYXRlIC1sICRwZTEgLW4gJGx2ICR2ZworcGVzaXplPSQoZ2V0IGx2X2ZpZWxkICR2Zy8kbHYgdmdfZXh0ZW50X3NpemUgLS11bml0cyBiIC0tbm9zdWZmaXgpCitzZWdzaXplPSQoKCAkcGUxICogJHBlc2l6ZSAvIDEwMjQgLyAxMDI0ICkpbQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdiBzZWdfY291bnQgIjEiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2IHNlZ19zdGFydCAiMCIKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgc2VnX3N0YXJ0X3BlICIwIgorI2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgc2VnX3NpemUgJHNlZ3NpemUKK2x2ZXh0ZW5kIC1sICskKCggJHBlX2NvdW50ICogMSApKSAkdmcvJGx2CitjaGVjayBsdl9maWVsZCAkdmcvJGx2IHNlZ19jb3VudCAiMiIKK2x2cmVkdWNlIC1mIC1sIC0kKCggJHBlX2NvdW50ICogMSApKSAkdmcvJGx2CitjaGVjayBsdl9maWVsZCAkdmcvJGx2IHNlZ19jb3VudCAiMSIKKworIyBkbyBub3QgcmVkdWNlIHRvIDAgZXh0ZW50cworbHZyZW1vdmUgLWYgJHZnLyRsdgorbHZjcmVhdGUgLWkyIC1JIDY0ayAtbDEwIC1uICRsdiAkdmcKK2x2cmVkdWNlIC1mIC1sMSAkdmcvJGx2CitjaGVjayBsdl9maWVsZCAkdmcvJGx2IGx2X3NpemUgIjguMDBtIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmV4dGVuZC1zbmFwc2hvdC1kbWV2ZW50ZC5zaCBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtc25hcHNob3QtZG1ldmVudGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtc25hcHNob3QtZG1ldmVudGQuc2gKQEAgLTAsMCArMSw3MCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2V4dGVuZCgpIHsKKwlsdmV4dGVuZCAtLXVzZS1wb2xpY2llcyAtLWNvbmZpZyAiYWN0aXZhdGlvbiB7IHNuYXBzaG90X2F1dG9leHRlbmRfdGhyZXNob2xkID0gJDEgfSIgJHZnL3NuYXAKK30KKword3JpdGVfKCkgeworCWRkIGlmPS9kZXYvemVybyBvZj0iJERNX0RFVl9ESVIvJHZnL3NuYXAiIGJzPTFrIGNvdW50PSQyIHNlZWs9JDEgb2ZsYWc9ZGlyZWN0Cit9CisKK3BlcmNlbnRfKCkgeworCWdldCBsdl9maWVsZCAkdmcvc25hcCBzbmFwX3BlcmNlbnQgfCBjdXQgLWQuIC1mMQorfQorCit3YWl0X2Zvcl9jaGFuZ2VfKCkgeworCSMgZG1ldmVudGQgb25seSBjaGVja3MgZXZlcnkgMTAgc2Vjb25kcyA6KAorCWZvciBpIGluICQoc2VxIDEgMjUpIDsgZG8KKwkJdGVzdCAiJChwZXJjZW50XykiICE9ICIkMSIgJiYgcmV0dXJuCisJCXNsZWVwIDEKKwlkb25lCisKKwlyZXR1cm4gMSAgIyB0aW1lb3V0Cit9CisKK2F1eCBwcmVwYXJlX2RtZXZlbnRkCithdXggcHJlcGFyZV92ZyAyCisKK2x2Y3JlYXRlIC1hZXkgLUwxNk0gLW4gYmFzZSAkdmcKK2x2Y3JlYXRlIC1zIC1MNE0gLW4gc25hcCAkdmcvYmFzZQorCit3cml0ZV8gMCAxMDAwCit0ZXN0IDI0IC1lcSAkKHBlcmNlbnRfKQorCitsdmNoYW5nZSAtLW1vbml0b3IgeSAkdmcvc25hcAorCit3cml0ZV8gMTAwMCAxNzAwCitwcmU9JChwZXJjZW50XykKKyMgTm9ybWFsbHkgdGhlIHVzYWdlIHNob3VsZCBiZSB+NjYlIGhlcmUsIGhvd2V2ZXIgb24gc2xvd2VyIHN5c3RlbXMKKyMgZG1ldmVudGQgY291bGQgYmUgYWN0dWFsbHkgJ2Zhc3QnIGVub3VnaCB0byBoYXZlIENPVyBhbHJlYWR5IHJlc2l6ZWQgbm93CisjIHNvIG1hcmsgdGVzdCBza2lwcGVkIGlmIHdlIGFyZSBiZWxvdyA1MCUgYnkgbm93Cit0ZXN0ICRwcmUgLWd0IDUwIHx8IHNraXAKK3dhaXRfZm9yX2NoYW5nZV8gJHByZQordGVzdCAkcHJlIC1ndCAkKHBlcmNlbnRfKQorCisjIGNoZWNrIHRoYXQgYSBzZWNvbmQgZXh0ZW5zaW9uIGhhcHBlbnM7IHdlIHVzZWQgdG8gZmFpbCB0byBleHRlbmQgd2hlbiB0aGUKKyMgdXRpbGlzYXRpb24gZW5kZWQgdXAgYmV0d2VlbiBUSFJFU0ggYW5kIChUSFJFU0ggKyAxMCkuLi4gc2VlIFJIQlogNzU0MTk4CisjICh0aGUgdXRpbGlzYXRpb24gYWZ0ZXIgdGhlIHdyaXRlIHNob3VsZCBiZSA1NyAlKQorCit3cml0ZV8gMjcwMCAyMDAwCitwcmU9JChwZXJjZW50XykKKyMgTWFyayB0ZXN0IGFzIHNraXBwZWQgaWYgYWxyZWFkeSByZXNpemVkLi4uCit0ZXN0ICRwcmUgLWd0IDcwIHx8IHNraXAKK3dhaXRfZm9yX2NoYW5nZV8gJHByZQordGVzdCAkcHJlIC1ndCAkKHBlcmNlbnRfKQorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZleHRlbmQtc25hcHNob3QtcG9saWN5LnNoIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC1zbmFwc2hvdC1wb2xpY3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4YzQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtc25hcHNob3QtcG9saWN5LnNoCkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKword2hpY2ggbWtmcy5leHQyIHx8IHNraXAKKworZXh0ZW5kKCkgeworCWx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzIC0tY29uZmlnICJhY3RpdmF0aW9uIHsgc25hcHNob3RfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSAkMSB9IiAkdmcvc25hcAorfQorCit3cml0ZSgpIHsKKwltb3VudCAiJERNX0RFVl9ESVIvJHZnL3NuYXAiIG1udAorCWRkIGlmPS9kZXYvemVybyBvZj0ibW50L2ZpbGUkMSIgYnM9MWsgY291bnQ9JDIKKwl1bW91bnQgbW50Cit9CisKK3BlcmNlbnQoKSB7CisJZ2V0IGx2X2ZpZWxkICR2Zy9zbmFwIHNuYXBfcGVyY2VudCB8IGN1dCAtZC4gLWYxCit9CisKKyMgbm8gZG1ldmVudGQgcnVubmluZyBpbiB0aGlzIHRlc3QsIHRlc3RpbmcgLS11c2UtcG9saWNpZXMKK2F1eCBwcmVwYXJlX3ZnIDIKKworbHZjcmVhdGUgLWFleSAtTDI0IC1uIGJhc2UgJHZnCitta2ZzLmV4dDIgIiRETV9ERVZfRElSLyR2Zy9iYXNlIgorCitsdmNyZWF0ZSAtcyAtTDE2IC1uIHNuYXAgJHZnL2Jhc2UKK21rZGlyIG1udAorCit3cml0ZSAxIDQwOTYKK3ByZT0kKHBlcmNlbnQpCitleHRlbmQgNTAKK3Rlc3QgJHByZSAtZXEgJChwZXJjZW50KQorCit3cml0ZSAyIDQwOTYKK3ByZT0kKHBlcmNlbnQpCitleHRlbmQgNTAKK3Rlc3QgJHByZSAtZ3QgJChwZXJjZW50KQorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi1kYXRhLWRtZXZlbnRkLnNoIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC10aGluLWRhdGEtZG1ldmVudGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViOTA4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi1kYXRhLWRtZXZlbnRkLnNoCkBAIC0wLDAgKzEsNjMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgYXV0b2V4dGVuc2lvbiBvZiB0aGluIGRhdGEgdm9sdW1lCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKKyMgQXMgd2UgY2hlY2sgZm9yICdpbnN0YW50JyByZWFjdGlvbgorIyByZXRyeSBvbmx5IGZldyB0aW1lcwordGVzdF9lcXVhbF8oKSB7CisJZm9yIGkgaW4gJChzZXEgMSA0KSA7IGRvCisJCXRlc3QgIiQoZ2V0IGx2X2ZpZWxkICR2Zy9wb29sIGRhdGFfcGVyY2VudCkiID0gIiQxIiB8fCByZXR1cm4KKwkJc2xlZXAgMQorCWRvbmUKK30KKworYXV4IGhhdmVfdGhpbiAxIDEwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9kbWV2ZW50ZAorCithdXggbHZtY29uZiAiYWN0aXZhdGlvbi90aGluX3Bvb2xfYXV0b2V4dGVuZF9wZXJjZW50ID0gMTAiIFwKKwkgICAgImFjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkID0gNzUiCisKK2F1eCBwcmVwYXJlX3B2cyAzIDI1NgorCit2Z2NyZWF0ZSAtcyAyNTZLICR2ZyAkKGNhdCBERVZJQ0VTKQorCitsdmNyZWF0ZSAtTDFNIC1jIDY0ayAtVCAkdmcvcG9vbAorbHZjcmVhdGUgLVYxTSAkdmcvcG9vbCAtbiAkbHYxCisKKyMgRmlsbCBleGFjdGx5IDc1JQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiIGJzPTc4NjQzMmMgY291bnQ9MSBjb252PWZkYXRhc3luYworCisjIHdoZW4gZXZlcnl0aGluZyBjYWxjcyBjb3JyZWN0bHkgdGhpbi1wb29sIHNob3VsZCBiZSBleGFjdGx5IDc1JSBmdWxsIG5vdworIyBhbmQgdGhlIHNpemUgc2hvdWxkIG5vdCBoYXZlIGNoYW5nZWQKK3ByZT0iNzUuMDAiCit0ZXN0X2VxdWFsXyAkcHJlIHx8IGRpZSAiRGF0YSBwZXJjZW50YWdlIGhhcyBjaGFuZ2VkISIKKworCisjIE5vdyB0cmlnZXIgYWxsb2NhdGlvbiBvZiAxIGV4dHJhIHBvb2wgY2h1bmsKK2RkIGlmPS9kZXYvemVybyBvZj0iJERNX0RFVl9ESVIvbWFwcGVyLyR2Zy0kbHYxIiBicz0xYyBjb3VudD0xIHNlZWs9Nzg2NDMzIGNvbnY9ZmRhdGFzeW5jCisKK2x2cyAtYSAtbytjaHVua3NpemUgJHZnCitkbXNldHVwIHRhYmxlCitkbXNldHVwIHN0YXR1cworCisjIElmIHRoZSB3YXRlcm1hcmsgd29ya3Mgd2VsbCAtIGRtZXZlbnRkIHNob3VsZCBoYXZlIGFscmVhZHkgcmVzaXplZCBkYXRhIExWCit0ZXN0X2VxdWFsXyAkcHJlICYmIGRpZSAiRGF0YSBwZXJjZW50YWdlIGhhcyBOT1QgY2hhbmdlZCEiCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdmV4dGVuZC10aGluLWZ1bGwuc2ggYi90ZXN0L3NoZWxsL2x2ZXh0ZW5kLXRoaW4tZnVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM4OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC10aGluLWZ1bGwuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMKKyMgcGxheSB3aXRoIHRoaW4tcG9vbCByZXNpemUgaW4gY29ybmVyIGNhc2VzCisjCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCit0ZXN0IC1uICIkTFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRCIgfHwgTFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRD0kKHdoaWNoIHRoaW5fcmVzdG9yZSkgfHwgc2tpcAorIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtViB8fCBza2lwCisKK2F1eCBoYXZlX3RoaW4gMSAxMCAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDMgMjU2CisKK3ZnY3JlYXRlIC1zIDFNICR2ZyAkKGNhdCBERVZJQ0VTKQorCithdXggbHZtY29uZiAnYWN0aXZhdGlvbi90aGluX3Bvb2xfYXV0b2V4dGVuZF9wZXJjZW50ID0gMzAnIFwKKwkgICAgJ2FjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfdGhyZXNob2xkID0gNzAnCisKK2F1eCBwcmVwYXJlX3RoaW5fbWV0YWRhdGEgNDAwIDAgfCB0ZWUgZGF0YQorbHZjcmVhdGUgLUwyMDAgLVQgJHZnL3Bvb2wKK2x2Y2hhbmdlIC1hbiAkdmcKKworbHZjcmVhdGUgLUwyTSAtbiAkbHYxICR2ZworIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtaSBkYXRhIC1vICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiCitsdmNvbnZlcnQgLXkgLS10aGlucG9vbCAkdmcvcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MQorCisjIENhbm5vdCByZXNpemUgaWYgc2V0IHRvIDAlCitub3QgbHZleHRlbmQgLS11c2UtcG9saWNpZXMgLS1jb25maWcgJ2FjdGl2YXRpb257dGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCA9IDB9JyAkdmcvcG9vbCAyPiYxIHwgdGVlIGVycgorZ3JlcCAiMCUiIGVycgorCisjIExvY2FsbHkgYWN0aXZlIExWIGlzIG5lZWRlZAorbm90IGx2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzICR2Zy9wb29sIDI+JjEgfCB0ZWUgZXJyCitncmVwICJsb2NhbGx5IiBlcnIKKworbHZjaGFuZ2UgLWF5ICR2ZworCisjIENyZWF0aW9uIG9mIG5ldyBMViBpcyBub3QgYWxsb3dlZCB3aGVuIHRoaW5wb29sIGlzIG92ZXIgdGhyZXNob2xkCitub3QgbHZjcmVhdGUgLVYxMCAkdmcvcG9vbAorCisKK2x2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzICR2Zy9wb29sICIkZGV2MiIgIiRkZXYzIgorI3Nob3VsZCBsdmV4dGVuZCAtbCsxMDAlRlJFRSAkdmcvcG9vbDIKKworbHZzIC1hICR2ZworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2ZXh0ZW5kLXRoaW4tbWV0YWRhdGEtZG1ldmVudGQuc2ggYi90ZXN0L3NoZWxsL2x2ZXh0ZW5kLXRoaW4tbWV0YWRhdGEtZG1ldmVudGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5MmJkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi1tZXRhZGF0YS1kbWV2ZW50ZC5zaApAQCAtMCwwICsxLDEzMCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgVGVzdCBhdXRvZXh0ZW5zaW9uIG9mIHRoaW4gbWV0YWRhdGEgdm9sdW1lCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK21ldGFfcGVyY2VudF8oKSB7CisJZ2V0IGx2X2ZpZWxkICR2Zy9wb29sIG1ldGFkYXRhX3BlcmNlbnQgfCBjdXQgLWQuIC1mMQorfQorCit3YWl0X2Zvcl9jaGFuZ2VfKCkgeworCSMgZG1ldmVudGQgb25seSBjaGVja3MgZXZlcnkgMTAgc2Vjb25kcyA6KAorCWZvciBpIGluICQoc2VxIDEgMTIpIDsgZG8KKwkJdGVzdCAiJChtZXRhX3BlcmNlbnRfKSIgLWx0ICIkMSIgJiYgcmV0dXJuCisJCXNsZWVwIDEKKwlkb25lCisKKwlyZXR1cm4gMSAgIyB0aW1lb3V0Cit9CisKKyMKKyMgVGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGNyZWF0ZSBzb21lIG9jY3VwaWVkIHRoaW4gbWV0YWRhdGEKKyMgVGhpcyBoZWF2aWx5IGRlcGVuZHMgb24gdGhpbiBtZXRhZGF0YSBvdXRwdXQgZm9ybWF0IHRvIHN0YXkgYXMgaXMuCisjIEN1cnJlbnRseSBpdCBleHBlY3RzIDJNQiB0aGluIG1ldGFkYXRhIGFuZCAyMDBNQiBkYXRhIHZvbHVtZSBzaXplCisjIEFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBkZXZpY2VzIHNob3VsZCBiZSBjcmVhdGVkLgorZmFrZV9tZXRhZGF0YV8oKSB7CisJZWNobyAnPHN1cGVyYmxvY2sgdXVpZD0iIiB0aW1lPSIwIiB0cmFuc2FjdGlvbj0iJyQyJyIgZGF0YV9ibG9ja19zaXplPSIxMjgiIG5yX2RhdGFfYmxvY2tzPSIzMjAwIj4nCisJZWNobyAnIDxkZXZpY2UgZGV2X2lkPSIxIiBtYXBwZWRfYmxvY2tzPSIwIiB0cmFuc2FjdGlvbj0iMCIgY3JlYXRpb25fdGltZT0iMCIgc25hcF90aW1lPSIwIj4nCisJZWNobyAnIDwvZGV2aWNlPicKKwllY2hvICcgPGRldmljZSBkZXZfaWQ9IjIiIG1hcHBlZF9ibG9ja3M9IjAiIHRyYW5zYWN0aW9uPSIwIiBjcmVhdGlvbl90aW1lPSIwIiBzbmFwX3RpbWU9IjAiPicKKwllY2hvICcgPC9kZXZpY2U+JworCWZvciBpIGluICQoc2VxIDEwICQxKQorCWRvCisJCWVjaG8gJyA8ZGV2aWNlIGRldl9pZD0iJyRpJyIgbWFwcGVkX2Jsb2Nrcz0iMzAiIHRyYW5zYWN0aW9uPSIwIiBjcmVhdGlvbl90aW1lPSIwIiBzbmFwX3RpbWU9IjAiPicKKwkJZWNobyAnICA8cmFuZ2VfbWFwcGluZyBvcmlnaW5fYmVnaW49IjAiIGRhdGFfYmVnaW49IjAiIGxlbmd0aD0iMjkiIHRpbWU9IjAiLz4nCisJCWVjaG8gJyA8L2RldmljZT4nCisJCXNldCAreAorCWRvbmUKKwllY2hvICI8L3N1cGVyYmxvY2s+IgorCXNldCAteAorfQorCit0ZXN0IC1uICIkTFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRCIgfHwgTFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRD0kKHdoaWNoIHRoaW5fcmVzdG9yZSkgfHwgc2tpcAorIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtViB8fCBza2lwCithdXggaGF2ZV90aGluIDEgMTAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX2RtZXZlbnRkCisKK2F1eCBsdm1jb25mICJhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQgPSAxMCIgXAorCSAgICAiYWN0aXZhdGlvbi90aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSA3MCIKKworYXV4IHByZXBhcmVfcHZzIDMgMjU2CisKK3ZnY3JlYXRlIC1zIDFNICR2ZyAkKGNhdCBERVZJQ0VTKQorCisjIFRlc3RpbmcgZG1ldmVudGQgYXV0b3Jlc2l6ZQorbHZjcmVhdGUgLUwyMDBNIC1WNTAwTSAtbiB0aGluIC1UICR2Zy9wb29sIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAiV0FSTklORzogU3VtIiBvdXQKK2x2Y3JlYXRlIC1WMk0gLW4gdGhpbjIgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1MMk0gLW4gJGx2MSAkdmcKK2x2Y2hhbmdlIC1hbiAkdmcvdGhpbiAkdmcvdGhpbjIgJHZnL3Bvb2wKKworIyBQcmVwYXJlIHNvbWUgZmFrZSBtZXRhZGF0YSB3aXRoIHVubWF0Y2hpbmcgaWQKKyMgVHJhbnNhY3Rpb25faWQgaXMgbG93ZXIgYnkgMSBhbmQgdGhlcmUgYXJlIG5vIG1lc3NhZ2VzIC0+IEVSUk9SCitmYWtlX21ldGFkYXRhXyAxMCAwID5kYXRhCisiJExWTV9URVNUX1RISU5fUkVTVE9SRV9DTUQiIC1pIGRhdGEgLW8gIiRETV9ERVZfRElSL21hcHBlci8kdmctJGx2MSIKK2x2Y29udmVydCAteSAtLXRoaW5wb29sICR2Zy9wb29sIC0tcG9vbG1ldGFkYXRhICR2Zy8kbHYxCitub3QgdmdjaGFuZ2UgLWF5ICR2ZyAyPiYxIHwgdGVlIG91dAorZ3JlcCBleHBlY3RlZCBvdXQKKworY2hlY2sgaW5hY3RpdmUgJHZnIHBvb2xfdG1ldGEKKworIyBUcmFuc2FjdGlvbl9pZCBpcyBoaWdoZXIgYnkgMQorZmFrZV9tZXRhZGF0YV8gMTAgMyA+ZGF0YQorIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtaSBkYXRhIC1vICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiCitsdmNvbnZlcnQgLXkgLS10aGlucG9vbCAkdmcvcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MQorbm90IHZnY2hhbmdlIC1heSAkdmcgMj4mMSB8IHRlZSBvdXQKK2dyZXAgZXhwZWN0ZWQgb3V0CisKK2NoZWNrIGluYWN0aXZlICR2ZyBwb29sX3RtZXRhCisKKyMgUHJlcGFyZSBzb21lIGZha2UgbWV0YWRhdGEgcHJlZmlsbGVkIHRvIH44MSUgKD43MCUpCitmYWtlX21ldGFkYXRhXyA0MDAgMiA+ZGF0YQorIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtaSBkYXRhIC1vICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiCisKKyMgU3dhcCB2b2x1bWUgd2l0aCByZXN0b3JlZCBmYWtlIG1ldGFkYXRhCitsdmNvbnZlcnQgLXkgLS1jaHVua3NpemUgNjRrIC0tdGhpbnBvb2wgJHZnL3Bvb2wgLS1wb29sbWV0YWRhdGEgJHZnLyRsdjEKKwordmdjaGFuZ2UgLWF5ICR2ZworCisjIENoZWNrIGRtZXZlbnRkIHJlc2l6ZXMgbWV0YWRhdGEgdmlhIHRpbWVvdXQgKG5vdGhpbmcgaXMgd3JpdHRlbiB0byBwb29sKQorcHJlPSQobWV0YV9wZXJjZW50XykKK3dhaXRfZm9yX2NoYW5nZV8gJHByZQorCitsdmNoYW5nZSAtYW4gJHZnCisKKyMKK2Zha2VfbWV0YWRhdGFfIDM1MCAyID5kYXRhCitsdmNoYW5nZSAtYXkgJHZnLyRsdjEKKyIkTFZNX1RFU1RfVEhJTl9SRVNUT1JFX0NNRCIgLWkgZGF0YSAtbyAiJERNX0RFVl9ESVIvbWFwcGVyLyR2Zy0kbHYxIgorCitsdmNvbnZlcnQgLXkgLS1jaHVua3NpemUgNjRrIC0tdGhpbnBvb2wgJHZnL3Bvb2wgLS1wb29sbWV0YWRhdGEgJHZnLyRsdjEKK2x2Y2hhbmdlIC1heSAkdmcvcG9vbCAgJHZnLyRsdjEKK2x2cyAtYSAkdmcKKworbHZjcmVhdGUgLXMgLUt5IC1uICRsdjIgJHZnL3RoaW4KK3ByZT0kKG1ldGFfcGVyY2VudF8pCisKKyMgZ28gb3ZlciB0aGluIG1ldGFkYXRhIHRocmVzaG9sZAorZWNobyAyID4iJERNX0RFVl9ESVIvbWFwcGVyLyR2Zy0kbHYyIgorCit3YWl0X2Zvcl9jaGFuZ2VfICRwcmUKKworbHZzIC1hICR2ZworCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi1yYWlkLnNoIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC10aGluLXJhaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4OGZmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi1yYWlkLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKK2F1eCBoYXZlX3JhaWQgMSAzIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyA2CisKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbDIgLS1ub3N5bmMgLW4gcG9vbCAkdmcKK2x2Y29udmVydCAtLXllcyAtLXRoaW5wb29sICR2Zy9wb29sICIkZGV2MyIKKworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgc2VnX3NpemVfcGUgIjIiCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF90ZGF0YSBzZWdfc2l6ZV9wZSAiMiIgLWEKKworbHZleHRlbmQgLWwrMyAkdmcvcG9vbAorCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbCBzZWdfc2l6ZV9wZSAiNSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3RkYXRhIHNlZ19zaXplX3BlICI1IiAtYQorCitsdnJlbW92ZSAtZiAkdmcKKworIyBjaGVjayAncmFpZDEwJyByZXNpemUgd29ya3MgZm9yIHBvb2wgbWV0YWRhdGEgcmVzaXplCisjIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS8xMDc1NjQ0CitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tMSAtTDUgLWkzIC0tbm9zeW5jIC1uIHBvb2wgJHZnCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tMSAtTDMgLWkzIC0tbm9zeW5jIC1uIG1ldGEgJHZnCitsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvbWV0YQorCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF90ZGF0YSBsdl9zaXplICI2LjAwbSIgLWEKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3RtZXRhIGx2X3NpemUgIjMuMDBtIiAtYQorCitsdmV4dGVuZCAtLXBvb2xtZXRhZGF0YXNpemUgKzEgLS1zaXplICsxICR2Zy9wb29sCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3RkYXRhIGx2X3NpemUgIjcuNTBtIiAtYQorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfdG1ldGEgbHZfc2l6ZSAiNC41MG0iIC1hCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi5zaCBiL3Rlc3Qvc2hlbGwvbHZleHRlbmQtdGhpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJiMmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdmV4dGVuZC10aGluLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgMworbHZjcmVhdGUgLWkyIC1sMiAtVCAkdmcvcG9vbDIKK2x2ZXh0ZW5kIC1sKzIgJHZnL3Bvb2wyICIkZGV2MiIgIiRkZXYzIgorc2hvdWxkIGx2ZXh0ZW5kIC1sKzEwMCVGUkVFICR2Zy9wb29sMgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2bS1pbml0LnNoIGIvdGVzdC9zaGVsbC9sdm0taW5pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQzNWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdm0taW5pdC5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIworIyB0ZXN0cyBsdm0gaW5pdGlhbGl6YXRpb24sIGFuZCBlc3BlY2lhbGx5IG5lZ2F0aXZlIHRlc3RzIG9mIGVycm9yIHBhdGhzCisjCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDUKKworIyBpbnZhbGlkIHVuaXRzCitub3QgcHZzIC0tY29uZmlnICdnbG9iYWwgeyB1bml0cyA9ICI8IiB9JwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm0xLWJhc2ljLnNoIGIvdGVzdC9zaGVsbC9sdm0xLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODRiYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bTEtYmFzaWMuc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKK3B2Y3JlYXRlIC0tbWV0YWRhdGF0eXBlIDEgIiRkZXYxIgorcHZzIHwgdGVlIG91dAorZ3JlcCAiJGRldjEiIG91dAordmdjcmVhdGUgLS1tZXRhZGF0YXR5cGUgMSAkdmcxICIkZGV2MSIKK3ZncyB8IHRlZSBvdXQKK2dyZXAgJHZnMSBvdXQKK3B2cyB8IHRlZSBvdXQKK2dyZXAgIiRkZXYxIiBvdXQKKworIyBjaGVjayBmb3IgUkhCWiAxMDgwMTg5IC0tIFNFR1YgaW4gbHZyZW1vdmUvdmdyZW1vdmUKK3B2Y3JlYXRlIC1mZiAteSAtLW1ldGFkYXRhdHlwZSAxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgLS1tZXRhZGF0YXR5cGUgMSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLWwxICR2ZzEKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjIiCit2Z2NoYW5nZSAtYW4gJHZnMQorbm90IGx2cmVtb3ZlICR2ZzEKK25vdCB2Z3JlbW92ZSAtZmYgLXkgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1jYWNoZS1leGVyY2lzZS5zaCBiL3Rlc3Qvc2hlbGwvbHZtY2FjaGUtZXhlcmNpc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4NWI5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtY2FjaGUtZXhlcmNpc2Uuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA1CisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdjcmVhdGUgJHZnMiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorCitVVUlEMT0kKGdldCB2Z19maWVsZCAkdmcxIHV1aWQpCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitwdnNjYW4KKyMgZGV2MSBpcyBtaXNzaW5nCitmYWlsIHB2cyAkKGNhdCBERVZJQ0VTKQorCisjIGNyZWF0ZSBhIG5ldyB2ZzEgb24gZGV2MiwKKyMgc28gZGV2MSBhbmQgZGV2MiBoYXZlIGRpZmZlcmVudCBWR3Mgd2l0aCB0aGUgc2FtZSBuYW1lCit2Z2NyZWF0ZSAkdmcxICIkZGV2MiIKKworVVVJRDI9JChnZXQgdmdfZmllbGQgJHZnMSB1dWlkKQorCisjIE9uY2UgZGV2MSBpcyB2aXNpYmxlIGFnYWluLCBib3RoIFZHcyBuYW1lZCAidmcxIiBhcmUgdmlzaWJsZS4KK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKKworcHZzICIkZGV2MSIKKworIyByZWFwcGVhcmluZyBkZXZpY2UgKHJoYnogOTk1NDQwKQorbHZjcmVhdGUgLWFleSAtbTIgLS10eXBlIG1pcnJvciAtbDQgLS1hbGxvYyBhbnl3aGVyZSAtLWNvcmVsb2cgLW4gJGx2MSAkdmcyCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjMiCitsdmNvbnZlcnQgLS15ZXMgLS1yZXBhaXIgJHZnMi8kbHYxCithdXggZW5hYmxlX2RldiAiJGRldjMiCisKKyMgaGVyZSBpdCBzaG91bGQgZml4IGFueSByZWFwcGVhcmVkIGRldmljZXMKK2x2cworCitsdnMgLWEgJHZnMiAtbytkZXZpY2VzIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCByZWFwcGVhcmVkIG91dAorCisjIFRoaXMgcmVtb3ZlcyB0aGUgZmlyc3QgInZnMSIgdXNpbmcgaXRzIHV1aWQKK3ZncmVtb3ZlIC1mZiAtUyB2Z191dWlkPSRVVUlEMQorCisjIFRoaXMgcmVtb3ZlcyB0aGUgc2Vjb25kICJ2ZzEiIHVzaW5nIGl0cyBuYW1lLAorIyBub3cgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBWRyB3aXRoIHRoYXQgbmFtZS4KK3ZncmVtb3ZlIC1mZiAkdmcxICR2ZzIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLWFtYmlndW91cy5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1hbWJpZ3VvdXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmMjkyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1hbWJpZ3VvdXMuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMgorCisjIGZsaXAgdGhlIGRldmljZXMgYXJvdW5kCithdXggaW5pdF91ZGV2X3RyYW5zYWN0aW9uCitkbXNldHVwIHJlbW92ZSAtZiAiJGRldjEiCitkbXNldHVwIHJlbW92ZSAtZiAiJGRldjIiCitkbXNldHVwIGNyZWF0ZSAtdSBURVNULSR7UFJFRklYfXB2MiAke1BSRUZJWH1wdjIgJHtQUkVGSVh9cHYyLnRhYmxlCitkbXNldHVwIGNyZWF0ZSAtdSBURVNULSR7UFJFRklYfXB2MSAke1BSRUZJWH1wdjEgJHtQUkVGSVh9cHYxLnRhYmxlCithdXggZmluaXNoX3VkZXZfdHJhbnNhY3Rpb24KKworIyByZS1zY2FuIHRoZW0KK3B2c2NhbiAtLWNhY2hlICIkZGV2MSIgfHwgdHJ1ZQorcHZzY2FuIC0tY2FjaGUgIiRkZXYyIiB8fCB0cnVlCisKKyMgZXhwZWN0IGJvdGggdG8gYmUgdGhlcmUKK3B2cyAtYSAtbyBuYW1lIHwgdGVlIG91dAorZ3JlcCAiJGRldjEiIG91dAorZ3JlcCAiJGRldjIiIG91dAorCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2bWV0YWQtYXV0b3NodXRkb3duLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLWF1dG9zaHV0ZG93bi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTEwYmYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdm1ldGFkLWF1dG9zaHV0ZG93bi5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSE9VVF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2tpbGwgLTAgJCg8IExPQ0FMX0xWTUVUQUQpIHx8IGRpZSAibHZtZXRhZCBpcyBhbHJlYWR5IGRlYWQiCisKK2x2bWV0YWRfdGltZW91dD0zCisKK2F1eCBwcmVwYXJlX3B2cyAxCisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorCitraWxsICQoPCBMT0NBTF9MVk1FVEFEKQorYXV4IHByZXBhcmVfbHZtZXRhZCAtdCAkbHZtZXRhZF90aW1lb3V0CisKK3NsZWVwICRsdm1ldGFkX3RpbWVvdXQKKworIyBsdm1ldGFkIHNob3VsZCBkaWUgYWZ0ZXIgdGltZW91dCwgYnV0IGdpdmUgaXQgc29tZSB0aW1lIHRvIGRvIHNvCitpPTAKK3doaWxlIGtpbGwgLTAgJCg8IExPQ0FMX0xWTUVUQUQpIDI+L2Rldi9udWxsOyBkbworCXRlc3QgJGkgLWdlICQoKGx2bWV0YWRfdGltZW91dCoxMCkpICYmIGRpZSAibHZtZXRhZCBkaWRuJ3Qgc2h1dGRvd24gd2l0aCBvcHRpb25hbCB0aW1lb3V0OiAkbHZtZXRhZF90aW1lb3V0IHNlY29uZHMiCisJc2xlZXAgLjEKKwlpPSQoKGkrMSkpCitkb25lCisKK2F1eCBwcmVwYXJlX2x2bWV0YWQgLXQgMAorc2xlZXAgMQorIyBsdm1ldGFkIG11c3Qgbm90IGRpZSB3aXRoIC10IDAgb3B0aW9uCitraWxsIC0wICQoPCBMT0NBTF9MVk1FVEFEKSB8fCBkaWUgImx2bWV0YWQgZGllZCIKKwora2lsbCAkKDwgTE9DQUxfTFZNRVRBRCkKK2F1eCBwcmVwYXJlX2x2bWV0YWQgLXQgJGx2bWV0YWRfdGltZW91dAorCitzbGVlcCAxCit2Z3MKK3NsZWVwIDEKK3Zncworc2xlZXAgMQordmdzCisKKyMgY2hlY2sgdGhhdCBjb25uZWN0aW9uIHRvIGx2bWV0YWQgcmVzZXRzIHRoZSB0aW1lb3V0CitraWxsIC0wICQoPCBMT0NBTF9MVk1FVEFEKSB8fCBkaWUgImx2bWV0YWQgZGllZCB0b28gc29vbiIKKwordmdyZW1vdmUgLWZmICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1jbGllbnQtZmlsdGVyLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLWNsaWVudC1maWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkMjVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1jbGllbnQtZmlsdGVyLnNoCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIT1VUX0xWTUVUQUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIKKworcHZzIC0tY29uZmlnICdkZXZpY2VzIHsgZmlsdGVyID0gWyAiciUuKiUiIF0gfScgMj4mMSB8IGdyZXAgcmVqZWN0ZWQKK3B2cyAtLWNvbmZpZyAnZGV2aWNlcyB7IGZpbHRlciA9IFsgInIlLiolIiBdIH0nIDI+JjEgfCBub3QgZ3JlcCAnTm8gZGV2aWNlIGZvdW5kJwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLWRpc2FibGVkLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLWRpc2FibGVkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjExMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtZGlzYWJsZWQuc2gKQEAgLTAsMCArMSw4OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKKwora2lsbCAkKDwgTE9DQUxfTFZNRVRBRCkKK3doaWxlIHRlc3QgLWUgIiRURVNURElSL2x2bWV0YWQuc29ja2V0IjsgZG8gZWNobyAtbiAuOyBzbGVlcCAuMTsgZG9uZSAjIHdhaXQgZm9yIHRoZSBzb2NrZXQgY2xvc2UKK3Rlc3QgISAtZSAiJExWTV9MVk1FVEFEX1BJREZJTEUiCisKK2F1eCBsdm1jb25mICJnbG9iYWwvdXNlX2x2bWV0YWQgPSAwIgorCitwdmNyZWF0ZSAtLW1ldGFkYXRhdHlwZSAxICIkZGV2MSIKK3B2Y3JlYXRlICIkZGV2MiIKK3ZnY3JlYXRlIC1NMSAkdmcxICIkZGV2MSIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIgorCitwdnMgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIiRkZXYxIiBvdXQKK2dyZXAgIiRkZXYyIiBvdXQKKwordmdzIDI+JjEgfCB0ZWUgb3V0CitncmVwICR2ZzEgb3V0CitncmVwICR2ZzIgb3V0CisKK2F1eCBsdm1jb25mICJnbG9iYWwvdXNlX2x2bWV0YWQgPSAxIgorbHZtZXRhZAord2hpbGUgISB0ZXN0IC1lICIkVEVTVERJUi9sdm1ldGFkLnNvY2tldCI7IGRvIGVjaG8gLW4gLjsgc2xlZXAgLjE7IGRvbmUgIyB3YWl0IGZvciB0aGUgc29ja2V0Cit0ZXN0IC1lICIkTFZNX0xWTUVUQURfUElERklMRSIKK2NwICIkTFZNX0xWTUVUQURfUElERklMRSIgTE9DQUxfTFZNRVRBRAorCitwdnNjYW4gLS1jYWNoZSAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogRGlzYWJsaW5nIGx2bWV0YWQgY2FjaGUiIG91dAorCitwdnMgIDI+JjEgfCB0ZWUgb3V0CitncmVwICIkZGV2MSIgb3V0CitncmVwICIkZGV2MiIgb3V0CitncmVwICJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCIgb3V0CisKK3ZncyAgMj4mMSB8IHRlZSBvdXQKK2dyZXAgJHZnMSBvdXQKK2dyZXAgJHZnMiBvdXQKK2dyZXAgIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIiBvdXQKKwordmdyZW1vdmUgJHZnMSAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQiIG91dAorCitwdnJlbW92ZSAiJGRldjEiIDI+JjEgfCB0ZWUgb3V0CitncmVwICJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCIgb3V0CisKK3B2c2NhbiAtLWNhY2hlICAyPiYxIHwgdGVlIG91dAorbm90IGdyZXAgIldBUk5JTkc6IERpc2FibGluZyBsdm1ldGFkIGNhY2hlIiBvdXQKKworcHZzIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAiJGRldjEiIG91dAorZ3JlcCAiJGRldjIiIG91dAorbm90IGdyZXAgIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIiBvdXQKKwordmdzIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAkdmcxIG91dAorZ3JlcCAkdmcyIG91dAorbm90IGdyZXAgIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIiBvdXQKKworcHZzIC0tY29uZmlnICdnbG9iYWwvdXNlX2x2bWV0YWQ9MCcgMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICIkZGV2MSIgb3V0CitncmVwICIkZGV2MiIgb3V0CitncmVwICJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCIgb3V0CitncmVwICJ1c2VfbHZtZXRhZD0wIiBvdXQKKwordmdzIC0tY29uZmlnICdnbG9iYWwvdXNlX2x2bWV0YWQ9MCcgMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICR2ZzEgb3V0CitncmVwICR2ZzIgb3V0CitncmVwICJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCIgb3V0CitncmVwICJ1c2VfbHZtZXRhZD0wIiBvdXQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLWR1bXAuc2ggYi90ZXN0L3NoZWxsL2x2bWV0YWQtZHVtcC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VhMDFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdm1ldGFkLWR1bXAuc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMgordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1uIGJhciAtbCAxICR2ZzEKKworKGVjaG8gfCBhdXggbHZtZXRhZF90YWxrKSB8fCBza2lwCithdXggbHZtZXRhZF9kdW1wIHwgdGVlIGx2bWV0YWQudHh0CisKK2dyZXAgJHZnMSBsdm1ldGFkLnR4dAorCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLWx2c2Nhbi1jYWNoZS5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1sdnNjYW4tY2FjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2NTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1sdnNjYW4tY2FjaGUuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMgorCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLW4gdGVzdGx2IC0tdHlwZSBtaXJyb3IgLW0gMSAtbCAxICR2ZzEKK3ZncyB8IGdyZXAgJHZnMQorCitsdnNjYW4gLS1jYWNoZSAkdmcxL3Rlc3RsdgorCit2Z3MgfCBncmVwICR2ZzEKKworYXV4IGRpc2FibGVfZGV2ICIkZGV2MiIKKworIyBwdnNjYW4gLS1jYWNoZSBhbHJlYWR5IHJhbiBmb3IgdGhlIGRpc2FibGVkIGRldmljZSBhYm92ZSwgdGhpcyBzaG91bGQgYmUgYQorIyBuby1vcCAoYnV0IHNob3VsZCBub3Qgc2VnZmF1bHQhKQorbHZzY2FuIC0tY2FjaGUgJHZnMS90ZXN0bHYKKwordmdyZW1vdmUgLWZmICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1uby1jbHVzdGVyLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLW5vLWNsdXN0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5NDExNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1uby1jbHVzdGVyLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIT1VUX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDIKK2F1eCBwcmVwYXJlX2x2bWV0YWQKK3ZncyAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSBsb2NraW5nX3R5cGUgaXMgMyIgb3V0CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1vdmVycmlkZS5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1vdmVycmlkZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJmN2JhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdm1ldGFkLW92ZXJyaWRlLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIT1VUX0xWTUVUQUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIKKwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1hbiAtbDEgLS16ZXJvIG4gLW4gJGx2MSAkdmcxCisKK2x2Y2hhbmdlIC1heSAkdmcxIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiIG91dAorY2hlY2sgYWN0aXZlICR2ZzEgJGx2MQorbHZjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIGluYWN0aXZlICR2ZzEgJGx2MQorCitraWxsICQoPCBMT0NBTF9MVk1FVEFEKQorCitsdmNoYW5nZSAtYXkgJHZnMSAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiIG91dAorY2hlY2sgYWN0aXZlICR2ZzEgJGx2MQorbHZjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIGluYWN0aXZlICR2ZzEgJGx2MQorCitsdmNoYW5nZSAtYXkgLS1jb25maWcgZ2xvYmFsL3VzZV9sdm1ldGFkPTAgJHZnMSAyPiYxIHwgdGVlIG91dAorIyBGSVhNRTogdGhpcyB3YXJuaW5nIGFwcGVhcnMgd2hlbiB0aGUgY29tbWFuZCB0cmllcyB0byBjb25uZWN0IHRvCisjIGx2bWV0YWQgZHVyaW5nIHJlZnJlc2ggYXQgdGhlIGVuZCBhZnRlciB0aGUgLS1jb25maWcgaXMgY2xlYXJlZC4KK3Nob3VsZCBub3QgZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiIG91dAorY2hlY2sgYWN0aXZlICR2ZzEgJGx2MQorbHZjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIGluYWN0aXZlICR2ZzEgJGx2MQorCithdXggbHZtY29uZiAiZ2xvYmFsL3VzZV9sdm1ldGFkID0gMCIKKworbHZjaGFuZ2UgLWF5IC0tY29uZmlnIGdsb2JhbC91c2VfbHZtZXRhZD0xICR2ZzEgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIldBUk5JTkc6IEZhaWxlZCB0byBjb25uZWN0IiBvdXQKK2NoZWNrIGFjdGl2ZSAkdmcxICRsdjEKK2x2Y2hhbmdlIC1hbiAkdmcxCitjaGVjayBpbmFjdGl2ZSAkdmcxICRsdjEKKwordmdyZW1vdmUgLWZmICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnMuc2ggYi90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTE5NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzLnNoCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDEgMjAwMDAKK3B2cyAkKGNhdCBERVZJQ0VTKSB8IGdyZXAgIiRkZXYxIgorCisjIGNoZWNrIGZvciBQViBzaXplIG92ZXJmbG93cworcHZzICQoY2F0IERFVklDRVMpIHwgZ3JlcCAxOS41M2cKK3B2cyAkKGNhdCBERVZJQ0VTKSB8IG5vdCBncmVwIDE2LjAwZQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1hdXRvYWN0aXZhdGlvbi1wb2xsaW5nLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1hdXRvYWN0aXZhdGlvbi1wb2xsaW5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTM5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzY2FuLWF1dG9hY3RpdmF0aW9uLXBvbGxpbmcuc2gKQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgdGVzdCBpZiBzbmFwc2hvdC1tZXJnZSB0YXJnZXQgaXMgYXZhaWxhYmxlCithdXggdGFyZ2V0X2F0X2xlYXN0IGRtLXNuYXBzaG90LW1lcmdlIDEgMCAwIHx8IHNraXAKKword2hpY2ggbWtmcy5leHQzIHx8IHNraXAKKworbHZkZXZfKCkgeworICAgIGVjaG8gIiRETV9ERVZfRElSLyQxLyQyIgorfQorCitzbmFwX2x2X25hbWVfKCkgeworICAgIGVjaG8gJHsxfV9zbmFwCit9CisKK3NldHVwX21lcmdlXygpIHsKKyAgICBsb2NhbCBWR19OQU1FPSQxCisgICAgbG9jYWwgTFZfTkFNRT0kMgorICAgIGxvY2FsIE5VTV9FWFRSQV9TTkFQUz0kezM6LTB9CisgICAgbG9jYWwgQkFTRV9TTkFQX0xWX05BTUUKKworICAgIEJBU0VfU05BUF9MVl9OQU1FPSQoc25hcF9sdl9uYW1lXyAkTFZfTkFNRSkKKworICAgIGx2Y3JlYXRlIC1hZXkgLW4gJExWX05BTUUgLWwgNTAlRlJFRSAkVkdfTkFNRQorICAgIGx2cworICAgIGx2Y3JlYXRlIC1zIC1uICRCQVNFX1NOQVBfTFZfTkFNRSAtbCAyMCVGUkVFICR7VkdfTkFNRX0vJHtMVl9OQU1FfQorICAgIG1rZnMuZXh0MyAiJChsdmRldl8gJFZHX05BTUUgJExWX05BTUUpIgorCisgICAgaWYgWyAkTlVNX0VYVFJBX1NOQVBTIC1ndCAwIF07IHRoZW4KKwlmb3IgaSBpbiAkKHNlcSAxICROVU1fRVhUUkFfU05BUFMpOyBkbworCSAgICBsdmNyZWF0ZSAtcyAtbiAke0JBU0VfU05BUF9MVl9OQU1FfV8ke2l9IC1sIDIwJU9SSUdJTiAke1ZHX05BTUV9LyR7TFZfTkFNRX0KKwlkb25lCisgICAgZmkKK30KKworYXV4IHByZXBhcmVfcHZzIDEgNTAKKwordmdjcmVhdGUgJHZnMSAiJGRldjEiCitta2RpciB0ZXN0X21udAorCitzZXR1cF9tZXJnZV8gJHZnMSAkbHYxCittb3VudCAiJChsdmRldl8gJHZnMSAkbHYxKSIgdGVzdF9tbnQKK2x2Y29udmVydCAtLW1lcmdlICR2ZzEvJChzbmFwX2x2X25hbWVfICRsdjEpCit1bW91bnQgdGVzdF9tbnQKK3ZnY2hhbmdlIC1hbiAkdmcxCisKKyMgY2hlY2sgc25hcHNob3QgZ2V0IHJlbW92ZWQgb24gYXV0b2FjdGl2YXRpb24KK3B2c2NhbiAtLWNhY2hlIC1hYXkgIiRkZXYxIgorCitjaGVjayBhY3RpdmUgJHZnMSAkbHYxCitpPTEwMAord2hpbGUgISBjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzEvJChzbmFwX2x2X25hbWVfICRsdjEpOyBkbworCXRlc3QgJGkgLWx0IDAgJiYgZmFpbCAiQmFja2dyb3VuZCBwb2xsaW5nIGZhaWxlZCB0byByZW1vdmUgbWVyZ2VkIHNuYXBzaG90IExWIgorCXNsZWVwIC4xCisJaT0kKChpLTEpKQorZG9uZQorCisjIFRPRE86IGFkZCBzaW1pbGFyIHNpbXBsZSB0ZXN0cyBmb3Igb3RoZXIgaW50ZXJydXB0ZWQvdW5maW5pc2hlZCBwb2xsaW5nIG9wZXJhdGlvbgorCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1jYWNoZS5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tY2FjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxZWVjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tY2FjaGUuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMgorCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdzIHwgZ3JlcCAkdmcxCisKK3B2c2NhbiAtLWNhY2hlCisKK3ZncyB8IGdyZXAgJHZnMQorCisjIFdoZW4gTURBIGlzIGlnbm9yZWQgb24gUFYsIGRvIG5vdCByZWFkIGFueSBWRworIyBtZXRhZGF0YSBmcm9tIHN1Y2ggUFYgYXMgaXQgbWF5IGNvbnRhaW4gb2xkCisjIG1ldGFkYXRhIHdoaWNoIGhhc24ndCBiZWVuIHVwZGF0ZWQgZm9yIHNvbWUKKyMgdGltZSBhbmQgYWxzbyBzaW5jZSB0aGUgTURBIGlzIG1hcmtlZCBhcyBpZ25vcmVkLAorIyBpdCBzaG91bGQgcmVhbGx5IGJlICppZ25vcmVkKiEKK3B2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgeSAiJGRldjEiCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorcHZzY2FuIC0tY2FjaGUKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgdmdfbmFtZSAiW3Vua25vd25dIgorYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorcHZzY2FuIC0tY2FjaGUKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgdmdfbmFtZSAiJHZnMSIKKwordmdyZW1vdmUgLWZmICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tZmlsdGVyLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1maWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzZmNkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tZmlsdGVyLnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIT1VUX0xWTUVUQUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIKKworbWFqPSQoKCQoc3RhdCAtTCAtLXByaW50Zj0weCV0ICIkZGV2MiIpKSkKK21pbj0kKCgkKHN0YXQgLUwgLS1wcmludGY9MHglVCAiJGRldjIiKSkpCisKKyMgRmlsdGVyIG91dCBkZXZpY2UsIHB2c2NhbiBzaG91bGQgdHJpZ2dlcgorIyBjbGVhcmluZyBvZiB0aGUgZGV2aWNlIGZyb20gbHZtZXRhZCBjYWNoZS4KKworIyBXZSBjYW4ndCB1c2UgYXV4IGhpZGVfZGV2IGhlcmUgYmVjYXVzZSB0aGF0CisjIGNoYW5nZXMgdGhlIGdsb2JhbF9maWx0ZXIgd2hpY2ggdHJpZ2dlcnMgYQorIyB0b2tlbiBtaXNtYXRjaCByZXNjYW4gYnkgc3Vic2VxdWVudCBwdnNjYW4KKyMgY29tbWFuZHMgaW5zdGVhZCBvZiB0aGUgc2luZ2xlLWRldiBzY2FucworIyB0aGF0IGFyZSB0ZXN0aW5nIGhlcmUuCisKK212ICIkZGV2MiIgIiRkZXYyLUhJRERFTiIKKworcHZzY2FuIC0tY2FjaGUgIiRkZXYyIiAyPiYxIHwgdGVlIG91dCB8fCB0cnVlCitncmVwICJub3QgZm91bmQiIG91dAorCisjIHB2c2NhbiB3aXRoIC0tbWFqb3IvLS1taW5vciBkb2VzIG5vdCBmYWlsOiBsdm1ldGFkIG5lZWRzIHRvCisjIGJlIG5vdGlmaWVkIGFib3V0IGRldmljZSByZW1vdmFsIG9uIFJFTU9WRSB1ZXZlbnQsIGhlbmNlCisjIHRoaXMgc2hvdWxkIG5vdCBmYWlsIHNvIHVkZXYgZG9lcyBub3QgZ3JhYiBhICJmYWlsZWQiIHN0YXRlCisjIGluY29ycmVjdGx5LiBXZSBub3RpZnkgZGV2aWNlIGFkZGl0aW9uIGFuZCByZW1vdmFsIHdpdGgKKyMgZXhhY3RseSB0aGUgc2FtZSBjb21tYW5kICJwdnNjYW4gLS1jYWNoZSIgLSBpbiBjYXNlIG9mIHJlbW92YWwsCisjIHRoaXMgaXMgZGV0ZWN0ZWQgYnkgbm9uZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgaXRzZWxmLgorCitwdnNjYW4gLS1jYWNoZSAtLW1ham9yICRtYWogLS1taW5vciAkbWluIDI+JjEgfCB0ZWUgb3V0IHx8IHRydWUKK2dyZXAgIm5vdCBmb3VuZCIgb3V0CisKKyMgYXV4IHVuaGlkZV9kZXYgIiRkZXYyIgorbXYgIiRkZXYyLUhJRERFTiIgIiRkZXYyIgorCitwdnNjYW4gLS1jYWNoZSAiJGRldjIiIDI+JjEgfCB0ZWUgb3V0IHx8IHRydWUKK25vdCBncmVwICJub3QgZm91bmQiIG91dAorCitwdnNjYW4gLS1jYWNoZSAtLW1ham9yICRtYWogLS1taW5vciAkbWluIDI+JjEgfCB0ZWUgb3V0IHx8IHRydWUKK25vdCBncmVwICJub3QgZm91bmQiIG91dAorCitwdnMgfCBncmVwICIkZGV2MiIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tbWQuc2ggYi90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzY2FuLW1kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjkxZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzY2FuLW1kLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCit0ZXN0IC1mIC9wcm9jL21kc3RhdCAmJiBncmVwIC1xIHJhaWQwIC9wcm9jL21kc3RhdCB8fCBcCisJbW9kcHJvYmUgcmFpZDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9kZXZzIDIKKworIyBjcmVhdGUgMiBkaXNrIE1EIHJhaWQwIGFycmF5IChzdHJpcGVfd2lkdGg9MTI4SykKK2F1eCBwcmVwYXJlX21kX2RldiAwIDY0IDIgIiRkZXYxIiAiJGRldjIiCisKK2F1eCBsdm1jb25mICdkZXZpY2VzL21kX2NvbXBvbmVudF9kZXRlY3Rpb24gPSAxJworYXV4IGV4dGVuZF9maWx0ZXJfTFZNVEVTVAorYXV4IGV4dGVuZF9maWx0ZXIgImF8L2Rldi9tZC4qfCIKKworcHZkZXY9JCg8IE1EX0RFVl9QVikKKworcHZjcmVhdGUgIiRwdmRldiIKKworIyBlbnN1cmUgdGhhdCBsdm1ldGFkIGNhbiBvbmx5IHNlZSB0aGUgdG9wbGV2ZWwgTUQgZGV2aWNlCitwdnMgfCB0ZWUgb3V0CitncmVwICIkcHZkZXYiIG91dAorbm90IGdyZXAgIiRkZXYxIiBvdXQKK25vdCBncmVwICIkZGV2MiIgb3V0CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2bWV0YWQtcHZzY2FuLW5vbWRhLWJnLnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1ub21kYS1iZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMyNWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1ub21kYS1iZy5zaApAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSE9VVF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2tpbGwgJCg8IExPQ0FMX0xWTUVUQUQpCitybSBMT0NBTF9MVk1FVEFECisKK2F1eCBwcmVwYXJlX2RldnMgMgorCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAxICIkZGV2MiIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtbiBmb28gLWwgMSAtYW4gLS16ZXJvIG4gJHZnMQorCisjIHN0YXJ0IGx2bWV0YWQgYnV0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGtub3cgYWJvdXQgJGRldjEgb3IgJGRldjIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiICIkZGV2MiIKK2F1eCBwcmVwYXJlX2x2bWV0YWQKK2x2cworbXYgTE9DQUxfTFZNRVRBRCBYWFgKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIgIiRkZXYxIgorbXYgWFhYIExPQ0FMX0xWTUVUQUQKKworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDAnCitjaGVjayBpbmFjdGl2ZSAkdmcxIGZvbworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDEnCisKK3B2c2NhbiAtLWNhY2hlIC0tYmFja2dyb3VuZCAiJGRldjIiIC1hYXkKKworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDAnCisjIEZJWE1FOiBpbmNvbmNsdXNpdmUuIG1heSBiZSBhIHRpbWluZyBpc3N1ZQorY2hlY2sgaW5hY3RpdmUgJHZnMSBmb28KK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAxJworCitwdnNjYW4gLS1jYWNoZSAtLWJhY2tncm91bmQgIiRkZXYxIiAtYWF5CisKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAwJworaT0xMDAKK3doaWxlICEgY2hlY2sgYWN0aXZlICR2ZzEgZm9vOyBkbworCXRlc3QgJGkgLWx0IDAgJiYgZmFpbCAiRmFpbGVkIHRvIGF1dG9hY3RpdmF0ZSIKKwlzbGVlcCAuMQorCWk9JCgoaS0xKSkKK2RvbmUKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAxJworCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1ldGFkLXB2c2Nhbi1ub21kYS5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tbm9tZGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiMjA2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1wdnNjYW4tbm9tZGEuc2gKQEAgLTAsMCArMSw1OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhPVVRfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitraWxsICQoPCBMT0NBTF9MVk1FVEFEKQorcm0gTE9DQUxfTFZNRVRBRAorCithdXggcHJlcGFyZV9kZXZzIDIKKworcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MSIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMSAiJGRldjIiCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLW4gZm9vIC1sIDEgLWFuIC0temVybyBuICR2ZzEKKworIyBzdGFydCBsdm1ldGFkIGJ1dCBtYWtlIHN1cmUgaXQgZG9lc24ndCBrbm93IGFib3V0ICRkZXYxIG9yICRkZXYyCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIiAiJGRldjIiCithdXggcHJlcGFyZV9sdm1ldGFkCitsdnMKK212IExPQ0FMX0xWTUVUQUQgWFhYCithdXggZW5hYmxlX2RldiAiJGRldjIiICIkZGV2MSIKK212IFhYWCBMT0NBTF9MVk1FVEFECisKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAwJworY2hlY2sgaW5hY3RpdmUgJHZnMSBmb28KK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAxJworCisjIFRlbGwgbHZtZXRhZCBhYm91dCBkZXYyLCBidXQgdGhlIFZHIGlzIG5vdCBjb21wbGV0ZSB3aXRoCisjIG9ubHkgZGV2Miwgc28gdGhlIC1hYXkgc2hvdWxkIG5vdCB5ZXQgYWN0aXZhdGUgdGhlIExWLgorCitwdnNjYW4gLS1jYWNoZSAtYWF5ICIkZGV2MiIKKworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDAnCitjaGVjayBpbmFjdGl2ZSAkdmcxIGZvbworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDEnCisKKyMgVGVsbCBsdm1ldGFkIGFib3V0IGRldjEsIG5vdyB0aGUgVkcgaXMgY29tcGxldGUgd2l0aAorIyBib3RoIGRldnMsIHNvIHRoZSAtYWF5IHNob3VsZCBhY3RpdmF0ZSB0aGUgTFYuCisKK3B2c2NhbiAtLWNhY2hlIC1hYXkgIiRkZXYxIgorCithdXggbHZtY29uZiAnZ2xvYmFsL3VzZV9sdm1ldGFkID0gMCcKK2NoZWNrIGFjdGl2ZSAkdmcxIGZvbworYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDEnCisKK3ZncmVtb3ZlIC1mZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2bWV0YWQtcmVzdGFydC5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1yZXN0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MGFkMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtcmVzdGFydC5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSE9VVF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyAyCisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z3MgfCBncmVwICR2ZzEKKwora2lsbCAkKDwgTE9DQUxfTFZNRVRBRCkKK2F1eCBwcmVwYXJlX2x2bWV0YWQKKwordmdzIHwgZ3JlcCAkdmcxCisKK3ZncmVtb3ZlIC1mZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2bWV0YWQtc3lzaW5pdC5zaCBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC1zeXNpbml0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmY3MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWV0YWQtc3lzaW5pdC5zaApAQCAtMCwwICsxLDkxIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSE9VVF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyAyCisKKyMKKyMgbHZjaGFuZ2UvdmdjaGFuZ2UgLWFheSAtLXN5c2luaXQgc2hvdWxkIG5vdCBhY3RpdmF0ZSBMVnMKKyMgaWYgbHZtZXRhZCBpcyBjb25maWd1cmVkIGFuZCBydW5uaW5nLgorIworCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLWFuIC1sMSAtLXplcm8gbiAtbiAkbHYxICR2ZzEKKworIworIyBsdm1ldGFkIGlzIGNvbmZpZ3VyZWQgYW5kIHJ1bm5pbmcKKyMKKworbHZjaGFuZ2UgLWF5ICR2ZzEgMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICJXQVJOSU5HOiBGYWlsZWQgdG8gY29ubmVjdCIgb3V0Citub3QgZ3JlcCAiV0FSTklORzogbHZtZXRhZCBpcyBhY3RpdmUsIHNraXBwaW5nIGRpcmVjdCBhY3RpdmF0aW9uIGR1cmluZyBzeXNpbml0IiBvdXQKK2NoZWNrIGFjdGl2ZSAkdmcxICRsdjEKK2x2Y2hhbmdlIC1hbiAkdmcxCitjaGVjayBpbmFjdGl2ZSAkdmcxICRsdjEKKworbHZjaGFuZ2UgLWFheSAtLXN5c2luaXQgJHZnMSAyPiYxIHwgdGVlIG91dAorbm90IGdyZXAgIldBUk5JTkc6IEZhaWxlZCB0byBjb25uZWN0IiBvdXQKK2dyZXAgIldBUk5JTkc6IGx2bWV0YWQgaXMgYWN0aXZlLCBza2lwcGluZyBkaXJlY3QgYWN0aXZhdGlvbiBkdXJpbmcgc3lzaW5pdCIgb3V0CitjaGVjayBpbmFjdGl2ZSAkdmcxICRsdjEKKworbHZjaGFuZ2UgLWF5IC0tc3lzaW5pdCAkdmcxIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiIG91dAorbm90IGdyZXAgIldBUk5JTkc6IGx2bWV0YWQgaXMgYWN0aXZlLCBza2lwcGluZyBkaXJlY3QgYWN0aXZhdGlvbiBkdXJpbmcgc3lzaW5pdCIgb3V0CitjaGVjayBhY3RpdmUgJHZnMSAkbHYxCitsdmNoYW5nZSAtYW4gJHZnMQorY2hlY2sgaW5hY3RpdmUgJHZnMSAkbHYxCisKKyMKKyMgbHZtZXRhZCBpcyBjb25maWd1cmVkIGFuZCBub3QgcnVubmluZworIworCitraWxsICQoPCBMT0NBTF9MVk1FVEFEKQorCitsdmNoYW5nZSAtYXkgJHZnMSAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiIG91dAorbm90IGdyZXAgIldBUk5JTkc6IGx2bWV0YWQgaXMgYWN0aXZlLCBza2lwcGluZyBkaXJlY3QgYWN0aXZhdGlvbiBkdXJpbmcgc3lzaW5pdCIgb3V0CitjaGVjayBhY3RpdmUgJHZnMSAkbHYxCitsdmNoYW5nZSAtYW4gJHZnMQorY2hlY2sgaW5hY3RpdmUgJHZnMSAkbHYxCisKK2x2Y2hhbmdlIC1hYXkgLS1zeXNpbml0ICR2ZzEgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIldBUk5JTkc6IEZhaWxlZCB0byBjb25uZWN0IiBvdXQKK25vdCBncmVwICJXQVJOSU5HOiBsdm1ldGFkIGlzIGFjdGl2ZSwgc2tpcHBpbmcgZGlyZWN0IGFjdGl2YXRpb24gZHVyaW5nIHN5c2luaXQiIG91dAorY2hlY2sgYWN0aXZlICR2ZzEgJGx2MQorbHZjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIGluYWN0aXZlICR2ZzEgJGx2MQorCisjCisjIGx2bWV0YWQgaXMgbm90IGNvbmZpZ3VyZWQgYW5kIG5vdCBydW5uaW5nCisjCisKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAwJworCitsdmNoYW5nZSAtYXkgJHZnMSAyPiYxIHwgdGVlIG91dAorbm90IGdyZXAgIldBUk5JTkc6IEZhaWxlZCB0byBjb25uZWN0IiBvdXQKK25vdCBncmVwICJXQVJOSU5HOiBsdm1ldGFkIGlzIGFjdGl2ZSwgc2tpcHBpbmcgZGlyZWN0IGFjdGl2YXRpb24gZHVyaW5nIHN5c2luaXQiIG91dAorY2hlY2sgYWN0aXZlICR2ZzEgJGx2MQorbHZjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIGluYWN0aXZlICR2ZzEgJGx2MQorCitsdmNoYW5nZSAtYWF5ICR2ZzEgLS1zeXNpbml0IDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QiCitub3QgZ3JlcCAiV0FSTklORzogbHZtZXRhZCBpcyBhY3RpdmUsIHNraXBwaW5nIGRpcmVjdCBhY3RpdmF0aW9uIGR1cmluZyBzeXNpbml0IiBvdXQKK2NoZWNrIGFjdGl2ZSAkdmcxICRsdjEKK2x2Y2hhbmdlIC1hbiAkdmcxCitjaGVjayBpbmFjdGl2ZSAkdmcxICRsdjEKKwordmdyZW1vdmUgLWZmICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtZXRhZC10ZXN0LnNoIGIvdGVzdC9zaGVsbC9sdm1ldGFkLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlMDZiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtZXRhZC10ZXN0LnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIKKwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIgLS10ZXN0Cit2Z3MgfCBub3QgZ3JlcCAkdmcxCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdzIHwgZ3JlcCAkdmcxCisKK2x2Y3JlYXRlIC1uIGJhciAtbCAxICR2ZzEgLS10ZXN0CitsdnMgfCBub3QgZ3JlcCBiYXIKK2x2Y3JlYXRlIC1uIGJhciAtbCAxICR2ZzEKK2x2cyB8IGdyZXAgYmFyCisKK2x2cmVtb3ZlICR2ZzEvYmFyIC1mIC0tdGVzdAorbHZzIHwgZ3JlcCBiYXIKK2x2cmVtb3ZlICR2ZzEvYmFyIC1mCitsdnMgfCBub3QgZ3JlcCBiYXIKKwordmdyZW1vdmUgJHZnMSAtLXRlc3QKK3ZncyB8IGdyZXAgJHZnMQordmdyZW1vdmUgJHZnMQordmdzIHwgbm90IGdyZXAgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdm1sb2NrZC1oZWxsby13b3JsZC5zaCBiL3Rlc3Qvc2hlbGwvbHZtbG9ja2QtaGVsbG8td29ybGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMWM1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZtbG9ja2QtaGVsbG8td29ybGQuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0nSGVsbG8gd29ybGQgZm9yIHZnY3JlYXRlIHdpdGggbHZtbG9ja2QgYW5kIHNhbmxvY2snCisKKy4gbGliL2luaXR0ZXN0CisKK1sgLXogIiRMVk1fVEVTVF9MVk1MT0NLRCIgXSAmJiBza2lwOworCithdXggcHJlcGFyZV9wdnMgMQorCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZyAiJGRldjEiCisKK3ZncyAtbytsb2NrdHlwZSxsb2NrYXJncyAkdmcKKwordmdyZW1vdmUgJHZnCisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZtbG9ja2QtbHYtdHlwZXMuc2ggYi90ZXN0L3NoZWxsL2x2bWxvY2tkLWx2LXR5cGVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTI3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2bWxvY2tkLWx2LXR5cGVzLnNoCkBAIC0wLDAgKzEsMTcwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdDaGVjayBsdm1sb2NrZCBsb2NrX2FyZ3MgZm9yIGRpZmZlcmVudCBMViB0eXBlcycKKworLiBsaWIvaW5pdHRlc3QKKworWyAteiAiJExWTV9URVNUX0xWTUxPQ0tEIiBdICYmIHNraXA7CisKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9MT0NLX1RZUEVfU0FOTE9DSyIgOyB0aGVuCitMT0NLQVJHUzE9IjEuMC4wOjcwMjU0NTkyIgorTE9DS0FSR1MyPSIxLjAuMDo3MTMwMzE2OCIKK0xPQ0tBUkdTMz0iMS4wLjA6NzIzNTE3NDQiCitmaQorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTE9DS19UWVBFX0RMTSIgOyB0aGVuCitMT0NLQVJHUzE9ImRsbSIKK0xPQ0tBUkdTMj0iZGxtIgorTE9DS0FSR1MzPSJkbG0iCitmaQorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNTE9DS0RfVEVTVCIgOyB0aGVuCitMT0NLQVJHUzE9ImRsbSIKK0xPQ0tBUkdTMj0iZGxtIgorTE9DS0FSR1MzPSJkbG0iCitmaQorCithdXggcHJlcGFyZV9kZXZzIDUKKwordmdjcmVhdGUgLS1zaGFyZWQgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorCisjCisjIHRoaW4gcG9vbCwgdGhpbiBsdiwgdGhpbiBzbmFwCisjCisKK2x2Y3JlYXRlIC1MIDhNIC1uIHBvb2wxICR2ZworY2hlY2sgbHZhX2ZpZWxkICR2Zy9wb29sMSBsb2NrYXJncyAkTE9DS0FSR1MxCisKK2x2Y3JlYXRlIC1MIDhNIC1uIHBvb2wxX21ldGEgJHZnCitjaGVjayBsdmFfZmllbGQgJHZnL3Bvb2wxX21ldGEgbG9ja2FyZ3MgJExPQ0tBUkdTMgorCitsdmNvbnZlcnQgLXkgLS10eXBlIHRoaW4tcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvcG9vbDFfbWV0YSAkdmcvcG9vbDEKK2NoZWNrIGx2YV9maWVsZCAkdmcvcG9vbDEgbG9ja2FyZ3MgJExPQ0tBUkdTMworY2hlY2sgbHZhX2ZpZWxkICR2Zy9wb29sMV90ZGF0YSBsb2NrYXJncyAiIgorY2hlY2sgbHZhX2ZpZWxkICR2Zy9wb29sMV90bWV0YSBsb2NrYXJncyAiIgorCitsdmNyZWF0ZSAtbiB0aGluMSAtViAxRyAtLXRoaW5wb29sICR2Zy9wb29sMQorY2hlY2sgbHZhX2ZpZWxkICR2Zy90aGluMSBsb2NrYXJncyAiIgorCitsdmNyZWF0ZSAtcyAtbiBzbmFwMSAkdmcvdGhpbjEKK2NoZWNrIGx2YV9maWVsZCAkdmcvc25hcDEgbG9ja2FyZ3MgIiIKKworbHZjaGFuZ2UgLWF5IC1LICR2Zy9zbmFwMQorCitsdmNoYW5nZSAtYW4gJHZnL3NuYXAxCitsdmNoYW5nZSAtYW4gJHZnL3RoaW4xCitsdmNoYW5nZSAtYW4gJHZnL3Bvb2wxCitsdnJlbW92ZSAkdmcvc25hcDEKK2x2cmVtb3ZlICR2Zy90aGluMQorbHZyZW1vdmUgJHZnL3Bvb2wxCisKKyMgdGhlIGZpcnN0IHNhbmxvY2sgbG9jayBzaG91bGQgYmUgZm91bmQgYW5kIHJldXNlZAorbHZjcmVhdGUgLUwgOE0gLW4gbHYxICR2ZworY2hlY2sgbHZhX2ZpZWxkICR2Zy9sdjEgbG9ja2FyZ3MgJExPQ0tBUkdTMQorCitsdmNoYW5nZSAtYW4gJHZnL2x2MQorbHZyZW1vdmUgJHZnL2x2MQorCisKKyMKKyMgd2l0aCBhdXRvbWF0aWMgbWV0YWRhdGEgbHYKKyMKKworbHZjcmVhdGUgLUwgOE0gLW4gcG9vbDIgJHZnCitjaGVjayBsdmFfZmllbGQgJHZnL3Bvb2wyIGxvY2thcmdzICRMT0NLQVJHUzEKKworbHZjb252ZXJ0IC15IC0tdHlwZSB0aGluLXBvb2wgJHZnL3Bvb2wyCitjaGVjayBsdmFfZmllbGQgJHZnL3Bvb2wyIGxvY2thcmdzICRMT0NLQVJHUzIKK2NoZWNrIGx2YV9maWVsZCAkdmcvcG9vbDJfdGRhdGEgbG9ja2FyZ3MgIiIKK2NoZWNrIGx2YV9maWVsZCAkdmcvcG9vbDJfdG1ldGEgbG9ja2FyZ3MgIiIKKworbHZjcmVhdGUgLW4gdGhpbjIgLVYgMUcgLS10aGlucG9vbCAkdmcvcG9vbDIKK2NoZWNrIGx2YV9maWVsZCAkdmcvdGhpbjIgbG9ja2FyZ3MgIiIKKworbHZjaGFuZ2UgLWFuICR2Zy90aGluMgorbHZjaGFuZ2UgLWFuICR2Zy9wb29sMgorbHZyZW1vdmUgJHZnL3RoaW4yCitsdnJlbW92ZSAkdmcvcG9vbDIKKworCisjCisjIGNhY2hlIHBvb2wsIGNhY2hlIGx2CisjCisKK2x2Y3JlYXRlIC1MIDhNIC1uIGNhY2hlMSAkdmcKK2NoZWNrIGx2YV9maWVsZCAkdmcvY2FjaGUxIGxvY2thcmdzICRMT0NLQVJHUzEKKworbHZjcmVhdGUgLUwgOE0gLW4gY2FjaGUxX21ldGEgJHZnCitjaGVjayBsdmFfZmllbGQgJHZnL2NhY2hlMV9tZXRhIGxvY2thcmdzICRMT0NLQVJHUzIKKworbHZjb252ZXJ0IC15IC0tdHlwZSBjYWNoZS1wb29sIC0tcG9vbG1ldGFkYXRhICR2Zy9jYWNoZTFfbWV0YSAkdmcvY2FjaGUxCitjaGVjayBsdmFfZmllbGQgJHZnL2NhY2hlMSBsb2NrYXJncyAiIgorY2hlY2sgbHZhX2ZpZWxkICR2Zy9jYWNoZTFfY2RhdGEgbG9ja2FyZ3MgIiIKK2NoZWNrIGx2YV9maWVsZCAkdmcvY2FjaGUxX2NtZXRhIGxvY2thcmdzICIiCisKK2x2Y3JlYXRlIC1uIGx2MSAtTCA4TSAkdmcKK2NoZWNrIGx2YV9maWVsZCAkdmcvbHYxIGxvY2thcmdzICRMT0NLQVJHUzEKKworbHZjb252ZXJ0IC15IC0tdHlwZSBjYWNoZSAtLWNhY2hlcG9vbCAkdmcvY2FjaGUxICR2Zy9sdjEKK2NoZWNrIGx2YV9maWVsZCAkdmcvbHYxIGxvY2thcmdzICRMT0NLQVJHUzEKK2NoZWNrIGx2YV9maWVsZCAkdmcvY2FjaGUxIGxvY2thcmdzICIiCitjaGVjayBsdmFfZmllbGQgJHZnL2NhY2hlMV9jZGF0YSBsb2NrYXJncyAiIgorY2hlY2sgbHZhX2ZpZWxkICR2Zy9jYWNoZTFfY21ldGEgbG9ja2FyZ3MgIiIKKworbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSAkdmcvbHYxCitjaGVjayBsdmFfZmllbGQgJHZnL2x2MSBsb2NrYXJncyAkTE9DS0FSR1MxCitjaGVjayBsdmFfZmllbGQgJHZnL2NhY2hlMSBsb2NrYXJncyAiIgorY2hlY2sgbHZhX2ZpZWxkICR2Zy9jYWNoZTFfY2RhdGEgbG9ja2FyZ3MgIiIKK2NoZWNrIGx2YV9maWVsZCAkdmcvY2FjaGUxX2NtZXRhIGxvY2thcmdzICIiCisKK2x2Y2hhbmdlIC1hbiAkdmcvY2FjaGUxCitsdmNoYW5nZSAtYW4gJHZnL2x2MQorbHZyZW1vdmUgJHZnL2NhY2hlMQorbHZyZW1vdmUgJHZnL2x2MQorCisjCisjIGNvdyBzbmFwCisjCisKK2x2Y3JlYXRlIC1uIGx2MiAtTCA4TSAkdmcKK2NoZWNrIGx2YV9maWVsZCAkdmcvbHYyIGxvY2thcmdzICRMT0NLQVJHUzEKKworbHZjcmVhdGUgLXMgLW4gbHYyc25hcCAtTCA4TSAkdmcvbHYyCitjaGVjayBsdmFfZmllbGQgJHZnL2x2MiBsb2NrYXJncyAkTE9DS0FSR1MxCitjaGVjayBsdmFfZmllbGQgJHZnL2x2MnNuYXAgbG9ja2FyZ3MgIiIKKworbHZjaGFuZ2UgLXkgLWFuICR2Zy9sdjIKK2x2cmVtb3ZlICR2Zy9sdjJzbmFwCitsdnJlbW92ZSAkdmcvbHYyCisKKyMKKyMgbWlycm9yCisjCisKK2x2Y3JlYXRlIC0tdHlwZSBtaXJyb3IgLW0gMSAtbiBsdjMgLUwgOE0gJHZnCitjaGVjayBsdmFfZmllbGQgJHZnL2x2MyBsb2NrYXJncyAkTE9DS0FSR1MxCisKK2x2Y2hhbmdlIC1hbiAkdmcvbHYzCitsdnJlbW92ZSAkdmcvbHYzCisKKyMKKyMgcmFpZDEKKyMKKworbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLW4gbHY0IC1MIDhNICR2ZworY2hlY2sgbHZhX2ZpZWxkICR2Zy9sdjQgbG9ja2FyZ3MgJExPQ0tBUkdTMQorCitsdmNoYW5nZSAtYW4gJHZnL2x2NAorbHZyZW1vdmUgJHZnL2x2NAorCit2Z3JlbW92ZSAkdmcKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdnJlbmFtZS1jYWNoZS10aGluLnNoIGIvdGVzdC9zaGVsbC9sdnJlbmFtZS1jYWNoZS10aGluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDBlMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2cmVuYW1lLWNhY2hlLXRoaW4uc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgQ2hlY2sgcmVuYW1lIG9mIHN0YWNrZWQgIHRoaW4gb3ZlciBjYWNoZWQgTFYKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX2NhY2hlIDEgMyAwIHx8IHNraXAKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyAxIDgwCisKK2x2Y3JlYXRlIC1MMTAgLW4gY3Bvb2wgJHZnCitsdmNyZWF0ZSAtTDEwIC1uIHRwb29sICR2ZworbHZjcmVhdGUgLUwxMCAtbiAkbHYxICR2ZworCitsdmNvbnZlcnQgLS15ZXMgLS1jYWNoZSAtLWNhY2hlcG9vbCBjcG9vbCAkdmcvdHBvb2wKKworIyBjdXJyZW50bHkgdGhlIG9ubHkgYWxsb3dlZCBzdGFja2luZyBpcyBjYWNoZSB0aGluIGRhdGEgdm9sdW1lCitsdmNvbnZlcnQgLS15ZXMgLS10eXBlIHRoaW4tcG9vbCAkdmcvdHBvb2wKKworbHZjcmVhdGUgLVYxMCAkdmcvdHBvb2wKKworIyBjaGVjayBjYWNoZSBwb29sIHJlbWFpbnMgc2FtZSBhZnRlciB0aGluLXBvb2wgcmVuYW1lCitsdnJlbmFtZSAkdmcvdHBvb2wgICR2Zy9uZXdwb29sCisKK2NoZWNrIGx2X2V4aXN0cyAkdmcgbmV3cG9vbCBjcG9vbAorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgdHBvb2wKKworIyBhbGxvd2luZyByZW5hbWUgb2YgaW50ZXJuYWwgY2FjaGUgcG9vbAorbHZyZW5hbWUgJHZnL2Nwb29sICAkdmcvY2FjaGVwb29sCisKK2NoZWNrIGx2X2V4aXN0cyAkdmcgY2FjaGVwb29sCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZyBjcG9vbAorCitsdnMgLWEgJHZnCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdnJlc2l6ZS1mdWxsLnNoIGIvdGVzdC9zaGVsbC9sdnJlc2l6ZS1mdWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWU2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2cmVzaXplLWZ1bGwuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgRXhjZXJzaXplIHJlc2l6ZSBvZiBmaWxlc3lzdGVtIHdoZW4gc2l6ZSBvZiBMViBhbHJlYWR5IG1hdGNoZXMKKyMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzEzNTQzOTYKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK0ZTQ0s9JHtGU0NLLWZzY2t9CitNS0ZTPSR7TUtGUy1ta2ZzLmV4dDN9CitSRVNJWkVGUz0ke1JFU0laRUZTLXJlc2l6ZTJmc30KKword2hpY2ggJEZTQ0sgfHwgc2tpcAord2hpY2ggJE1LRlMgfHwgc2tpcAord2hpY2ggJFJFU0laRUZTIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgMiAyMAorCitsdmNyZWF0ZSAtbDEwMCVGUkVFIC1uICRsdjEgJHZnCisKK2x2ZGV2PSIkRE1fREVWX0RJUi8kdmcvJGx2MSIKKworbHZzIC1hICR2ZworCisiJE1LRlMiICIkbHZkZXYiCisKKyMgdGhpcyBzaG91bGQgcmVzb2x2ZSB0byByZXNpemUgdG8gc2FtZSBhY3R1YWwgc2l6ZQorbHZyZWR1Y2UgLXIgLWYgLWwtMTAwJUZSRUUgJHZnLyRsdjEKKyIkRlNDSyIgLW4gIiRsdmRldiIKKworIyBzaXplIHNob3VsZCByZW1haW4gdGhlIHNhbWUKK2x2ZXh0ZW5kIC1yIC1mIC1sKzEwMCVGUkVFICR2Zy8kbHYxCisiJEZTQ0siIC1uICIkbHZkZXYiCisKKyNsdmNoYW5nZSAtYW4gJHZnLyRsdjEKK2x2cmVzaXplIC1yIC1mIC1sKzEwMCVGUkVFICR2Zy8kbHYxCisiJEZTQ0siIC1uICIkbHZkZXYiCisKKyMgQ2hlY2sgdGhlcmUgaXMgcmVhbGx5IGZpbGUgc3lzdGVtIHJlc2l6ZSBoYXBwZW5pbmcKKyMgZXZlbiB3aGVuIExWIGl0c2VsZiBoYXMgc3RpbGwgdGhlIHNhbWUgc2l6ZQorIiRSRVNJWkVGUyIgLWYgIiRsdmRldiIgMjAwMDAKKyIkRlNDSyIgLW4gIiRsdmRldiIgfCB0ZWUgb3V0CitncmVwICIyMDAwMCBibG9ja3MiIG91dAorCitTSVpFPSQoZ2V0IGx2X2ZpZWxkICR2Zy8kbHYxIHNpemUpCitsdnJlc2l6ZSAtciAtZiAtbC0xMDAlRlJFRSAkdmcvJGx2MQordGVzdCAiJFNJWkUiID0gIiQoZ2V0IGx2X2ZpZWxkICR2Zy8kbHYxIHNpemUpIgorCisiJEZTQ0siIC1uICIkbHZkZXYiIHwgdGVlIG91dAorZ3JlcCAtdiAiMjAwMDAgYmxvY2tzIiBvdXQKKworCisjIEFsc28gY2hlY2sgaXQgZmFpbHMgd2hlbiB0aGUgdXNlciAncmVzaXplJyB2b2x1bWUgd2l0aG91dAorIyByZXNpemluZyBmcyBhbmQgdGhlbiByZXRyaWVzIHdpdGggJy1yJy4KK2x2cmVkdWNlIC1mIC1sNTAlVkcgJHZnLyRsdjEKK2ZhaWwgbHZyZXNpemUgLXIgLWYgLWw1MCVWRyAkdmcvJGx2MQorCitsdnJlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2cmVzaXplLW1pcnJvci5zaCBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtbWlycm9yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODZhMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2cmVzaXplLW1pcnJvci5zaApAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDUKKworZm9yIGRlYWN0aXZhdGUgaW4gdHJ1ZSBmYWxzZTsgZG8KKworIyBleHRlbmQgMi13YXkgbWlycm9yCisJbHZjcmVhdGUgLWF5ZSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyI6MC0xCisKKwl0ZXN0ICRkZWFjdGl2YXRlICYmIGx2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisJbHZleHRlbmQgLWwrMiAkdmcvJGx2MQorCWNoZWNrIG1pcnJvciAkdmcgJGx2MSAiJGRldjMiCisJY2hlY2sgbWlycm9yX2ltYWdlc19jb250aWd1b3VzICR2ZyAkbHYxCisKKyMgcmVkdWNlIDItd2F5IG1pcnJvcgorCWx2cmVkdWNlIC1mIC1sLTIgJHZnLyRsdjEKKwljaGVjayBtaXJyb3IgJHZnICRsdjEgIiRkZXYzIgorCisjIGV4dGVuZCAyLXdheSBtaXJyb3IgKGNsaW5nIGlmIG5vdCBjb250aWd1b3VzKQorCWx2Y3JlYXRlIC1heWUgLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjIgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiOjAtMQorCWx2Y3JlYXRlIC1sMSAtbiAkbHYzICR2ZyAiJGRldjEiCisJbHZjcmVhdGUgLWwxIC1uICRsdjQgJHZnICIkZGV2MiIKKworCXRlc3QgJGRlYWN0aXZhdGUgJiYgbHZjaGFuZ2UgLWFuICR2Zy8kbHYyCisKKwlsdmV4dGVuZCAtbCsyICR2Zy8kbHYyCisJY2hlY2sgbWlycm9yICR2ZyAkbHYyICIkZGV2MyIKKwljaGVjayBtaXJyb3JfaW1hZ2VzX2NsdW5nICR2ZyAkbHYyCisKKwlsdnJlbW92ZSAtZmYgJHZnCitkb25lCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZyZXNpemUtcmFpZC5zaCBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtcmFpZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGVlZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9sdnJlc2l6ZS1yYWlkLnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfcmFpZCAxIDMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyA2IDgwCisKK3ZnY3JlYXRlIC1zIDI1NksgJHZnICQoY2F0IERFVklDRVMpCisKK2ZvciBkZWFjdGl2YXRlIGluIHRydWUgZmFsc2U7IGRvCisKKyMgRXh0ZW5kIGFuZCByZWR1Y2UgYSAyLXdheSBSQUlEMQorCWx2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDIgLW4gJGx2MSAkdmcKKworCXRlc3QgJGRlYWN0aXZhdGUgJiYgeworCQlhdXggd2FpdF9mb3Jfc3luYyAkdmcgJGx2MQorCQlsdmNoYW5nZSAtYW4gJHZnLyRsdjEKKwl9CisKKwlsdnJlc2l6ZSAtbCArMiAkdmcvJGx2MQorCisJc2hvdWxkIGx2cmVzaXplIC15IC1sIC0yICR2Zy8kbHYxCisKKwkjY2hlY2sgcmFpZF9pbWFnZXNfY29udGlndW91cyAkdmcgJGx2MQorCisjIEV4dGVuZCBhbmQgcmVkdWNlIDMtc3RyaXBlZCBSQUlEIDQvNS82CisJZm9yIGkgaW4gNCA1IDYgOyBkbworCQlsdmNyZWF0ZSAtLXR5cGUgcmFpZCRpIC1pIDMgLWwgMyAtbiAkbHYyICR2ZworCisJCXRlc3QgJGRlYWN0aXZhdGUgJiYgeworCQkJYXV4IHdhaXRfZm9yX3N5bmMgJHZnICRsdjIKKwkJCWx2Y2hhbmdlIC1hbiAkdmcvJGx2MgorCQl9CisKKwkJbHZyZXNpemUgLWwgKzMgJHZnLyRsdjIKKworCQkjY2hlY2sgcmFpZF9pbWFnZXNfY29udGlndW91cyAkdmcgJGx2MQorCisJCXNob3VsZCBsdnJlc2l6ZSAteSAtbCAtMyAkdmcvJGx2MgorCisJCSNjaGVjayByYWlkX2ltYWdlc19jb250aWd1b3VzICR2ZyAkbHYxCisKKwkJbHZyZW1vdmUgLWZmICR2ZworCWRvbmUKK2RvbmUKKworIyBCdWcgMTAwNTQzNAorIyBFbnN1cmUgZXh0ZW5kIGlzIGNvbnRpZ3VvdXMKK2x2Y3JlYXRlIC0tdHlwZSByYWlkNCAtbCAyIC1pIDIgLW4gJGx2MSAkdmcgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIKK2x2ZXh0ZW5kIC1sICsyIC0tYWxsb2MgY29udGlndW91cyAkdmcvJGx2MQorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjQiICIkZGV2NSIgIiRkZXY2IgorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZyZXNpemUtcmFpZDEwLnNoIGIvdGVzdC9zaGVsbC9sdnJlc2l6ZS1yYWlkMTAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2ZTJmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtcmFpZDEwLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfcmFpZCAxIDMgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDUKKworZm9yIGRlYWN0aXZhdGUgaW4gdHJ1ZSBmYWxzZTsgZG8KKyMgRXh0ZW5kIFJBSUQxMCAoMi1zdHJpcGVzLCAyLW1pcnJvcikKKwlsdmNyZWF0ZSAtLXR5cGUgcmFpZDEwIC1tIDEgLWkgMiAtbCAyIC1uICRsdjEgJHZnCisKKwl0ZXN0ICRkZWFjdGl2YXRlICYmIGx2Y2hhbmdlIC1hbiAkdmcvJGx2MQorCisJbHZyZXNpemUgLWwgKzIgJHZnLyRsdjEKKworCSNjaGVjayByYWlkX2ltYWdlc19jb250aWd1b3VzICR2ZyAkbHYxCisKKyMgUmVkdWNlIFJBSUQxMCAoMi1zdHJpcGVzLCAyLW1pcnJvcikKKworCXNob3VsZCBsdnJlc2l6ZSAteSAtbCAtMiAkdmcvJGx2MQorCisJI2NoZWNrIHJhaWRfaW1hZ2VzX2NvbnRpZ3VvdXMgJHZnICRsdjEKKworCWx2cmVtb3ZlIC1mZiAkdmcKK2RvbmUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZyZXNpemUtcm91bmRpbmcuc2ggYi90ZXN0L3NoZWxsL2x2cmVzaXplLXJvdW5kaW5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMThlZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2cmVzaXplLXJvdW5kaW5nLnNoCkBAIC0wLDAgKzEsOTAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMyAyMgorCit2Z2NyZWF0ZSAtcyAzMksgJHZnICQoY2F0IERFVklDRVMpCisKK2x2Y3JlYXRlIC1hbiAtWm4gLWw0IC1pMyAtSTY0ICR2ZworCitsdmNyZWF0ZSAtYW4gLVpuIC1sOCAtaTIgLUk2NCAkdmcKKworbHZjcmVhdGUgLWFuIC1abiAtbDE2ICR2ZworCitsdmNyZWF0ZSAtYW4gLVpuIC1sMzIgLWkzIC1JNjQgLW4gJGx2MSAkdmcKKworbHZyZXNpemUgLWwrNjQgLWkzIC1JNjQgJHZnLyRsdjEKKworbHZyZXNpemUgLWwrNjQgLWkzIC1JMTI4ICR2Zy8kbHYxCisKKyNsdmNyZWF0ZSAtbDEwMCVGUkVFIC1pMyAtSTY0IC0tYWxsb2MgYW55d2hlcmUgJHZnCit2Z3JlbW92ZSAtZiAkdmcKKworIyAxNSBleHRlbnRzCitMVk1fVEVTVF9BVVhfVFJBQ0U9eWVzCithdXggcHJlcGFyZV92ZyAzIDIyCit1bnNldCBMVk1fVEVTVF9BVVhfVFJBQ0UKKworIyBCbG9jayBzb21lIGV4dGVudHMKK2x2Y3JlYXRlIC1hbiAtWm4gLWw0IC1pMyAkdmcKK2x2Y3JlYXRlIC1hbiAtWm4gLWwxICR2ZworCitsdmNyZWF0ZSAtYW4gLVpuIC1sMTAwJUZSRUUgLW4gJGx2MSAtaTMgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgdmdfZnJlZV9jb3VudCAyCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCitsdmNyZWF0ZSAtYW4gLVpuIC1sMSAtbiAkbHYxIC1pMyAkdmcKK2x2ZXh0ZW5kIC1sKzEwMCVGUkVFIC1pMyAkdmcvJGx2MQorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMgorCitsdnJlZHVjZSAtZiAtbDUwJUxWICR2Zy8kbHYxCit2Z3JlbW92ZSAtZiAkdmcKKwordmdjcmVhdGUgLXMgNE0gJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisKKyMgRXhwZWN0IHRvIHBsYXkgd2l0aCAxNSBleHRlbnRzCitjaGVjayB2Z19maWVsZCAkdmcgdmdfZnJlZV9jb3VudCAxNQorCisjIFNob3VsZCBiZSByb3VuZGVkIHRvIDEyIGV4dGVudHMKK2x2Y3JlYXRlIC1hbiAtWm4gLWwxMCAtbiBsdiAtaTMgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgdmdfZnJlZV9jb3VudCAzCisKKyMgU2hvdWxkIHdhbnQgMTYgZXh0ZW50cworbm90IGx2ZXh0ZW5kIC1sKzQgJHZnL2x2CisKKyMgUm91bmQgdXAgdG8gd2hvbGUgZnJlZSBzcGFjZQorbHZleHRlbmQgLWwrMTAwJUZSRUUgJHZnL2x2CitjaGVjayB2Z19maWVsZCAkdmcgdmdfZnJlZV9jb3VudCAwCisKKyMgUm91bmRzIHVwIGFuZCBzaG91bGQgcmVkdWNlIGp1c3QgYnkgMyBleHRlbnRzCitsdnJlZHVjZSAtZiAtbC00ICR2Zy9sdgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMworCisjIFNob3VsZCByb3VuZCB1cCB0byAxNSBleHRlbnRzCitsdmV4dGVuZCAtZiAtbCsxICR2Zy9sdgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMAorCitsdnJlZHVjZSAtZiAtbC00ICR2Zy9sdgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMworCitsdmV4dGVuZCAtbDkwJVZHICR2Zy9sdgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMAorCitub3QgbHZyZWR1Y2UgLWYgLWwtMTAlTFYgJHZnL2x2CitjaGVjayB2Z19maWVsZCAkdmcgdmdfZnJlZV9jb3VudCAwCisKK2x2cmVkdWNlIC1mIC1sLTIwJUxWICR2Zy9sdgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2ZyZWVfY291bnQgMwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9sdnJlc2l6ZS10aGluLWV4dGVybmFsLW9yaWdpbi5zaCBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtdGhpbi1leHRlcm5hbC1vcmlnaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NGI4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtdGhpbi1leHRlcm5hbC1vcmlnaW4uc2gKQEAgLTAsMCArMSw1MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgVGVzdCByZXNpemUgb2YgdGhpbiB2b2x1bWUgd2l0aCBleHRlcm5hbCBvcmlnaW4KKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfdGhpbiAxIDIgMCB8fCBza2lwCisKKyMgUHJldGVuZCB3ZSBtaXNzIHRoZSBleHRlcm5hbF9vcmlnaW5fZXh0ZW5kIGZlYXR1cmUKK2F1eCBsdm1jb25mICdnbG9iYWwvdGhpbl9kaXNhYmxlZF9mZWF0dXJlcyA9IFsgImV4dGVybmFsX29yaWdpbl9leHRlbmQiIF0nCisKK2F1eCBwcmVwYXJlX3B2cyAyCisKK3ZnY3JlYXRlIC1zIDFNICR2ZyAkKGNhdCBERVZJQ0VTKQorCitsdmNyZWF0ZSAtTDEwIC1uICRsdjEgJHZnCisKKyMgUHJlcGFyZSB0aGluIHBvb2wKK2x2Y3JlYXRlIC1MMjAgLVQgJHZnL3Bvb2wKKworIyBDb252ZXJ0ICRsdjEgaW50byB0aGluIExWIHdpdGggZXh0ZXJuYWwgb3JpZ2luCitsdmNvbnZlcnQgLVQgJHZnLyRsdjEgLS10aGlucG9vbCAkdmcvcG9vbCAtLW9yaWdpbm5hbWUgZXh0CisKK2x2cyAtYSAkdmcKKworIyBCaWdnZXIgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgZmVhdHVyZSBleHRlcm5hbF9vcmlnaW5fZXh0ZW5kCitub3QgbHZyZXNpemUgLUwrMTAgJHZnLyRsdjEKKworIyBCdXQgcmVkdWN0aW9uIHdvcmtzCitsdnJlc2l6ZSAtTC01IC1mICR2Zy8kbHYxCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBsdl9zaXplICI1LjAwIiAtLXVuaXRzIG0gLS1ub3N1ZmZpeAorCitub3QgbHZyZXNpemUgLUwrMTUgLXkgJHZnLyRsdjEKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGx2X3NpemUgIjUuMDAiIC0tdW5pdHMgbSAtLW5vc3VmZml4CisKKyMgVHJ5IHRvIHJlc2l6ZSBhZ2FpbiBiYWNrIHVwIHRvIHRoZSBzaXplIG9mIGV4dGVybmFsIG9yaWdpbgorbHZyZXNpemUgLUwrNSAtZiAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgbHZfc2l6ZSAiMTAuMDAiIC0tdW5pdHMgbSAtLW5vc3VmZml4CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL2x2cmVzaXplLXRoaW4tbWV0YWRhdGEuc2ggYi90ZXN0L3NoZWxsL2x2cmVzaXplLXRoaW4tbWV0YWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmNGZjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZyZXNpemUtdGhpbi1tZXRhZGF0YS5zaApAQCAtMCwwICsxLDUwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMTAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAzIDEyNTYKKwordmdjcmVhdGUgLXMgMU0gJHZnICQoY2F0IERFVklDRVMpCisKK2ZvciBkZWFjdGl2YXRlIGluIHRydWUgZmFsc2U7IGRvCisjIENyZWF0ZSBzb21lIHRoaW4gdm9sdW1lcworCWx2Y3JlYXRlIC1MMjAgLVYzMCAtbiAkbHYxIC1UICR2Zy9wb29sCisJbHZjcmVhdGUgLXMgJHZnLyRsdjEKKyMgQ29uZmlybSB3ZSBoYXZlIGJhc2ljIDJNIG1ldGFkYXRhCisJY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfdG1ldGEgc2l6ZSAiMi4wMG0iCisKKwl0ZXN0ICRkZWFjdGl2YXRlICYmIGx2Y2hhbmdlIC1hbiAkdmcKKworCWx2cmVzaXplIC0tcG9vbG1ldGFkYXRhc2l6ZSArMk0gJHZnL3Bvb2wKKyMgVGVzdCBpdCdzIGJlZW4gcmVzaXplZCB0byA0TQorCWNoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3RtZXRhIHNpemUgIjQuMDBtIgorCisJbHZyZXNpemUgLS1wb29sbWV0YWRhdGFzaXplICsyNTZNICR2Zy9wb29sCisJY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfdG1ldGEgc2l6ZSAiMjYwLjAwbSIKKworCWx2cmVzaXplIC0tcG9vbG1ldGFkYXRhc2l6ZSArM0cgJHZnL3Bvb2wKKwljaGVjayBsdl9maWVsZCAkdmcvcG9vbF90bWV0YSBzaXplICIzLjI1ZyIKKworCXZnY2hhbmdlIC1hbiAkdmcKKwl2Z2NoYW5nZSAtYXkgJHZnCisKKyMgVE9ETzogQWRkIG1vcmUgdGVzdHMKKworCWx2cmVtb3ZlIC1mZiAkdmcKK2RvbmUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZyZXNpemUtdXNhZ2Uuc2ggYi90ZXN0L3NoZWxsL2x2cmVzaXplLXVzYWdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzYxNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL2x2cmVzaXplLXVzYWdlLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAyIDgwCisKK2x2Y3JlYXRlIC1MIDEwTSAtbiBsdiAtaTIgJHZnCitsdnJlc2l6ZSAtbCArNCAkdmcvbHYKK25vdCBsdmV4dGVuZCAtTCswICR2Zy9sdgorbm90IGx2ZXh0ZW5kIC1sKzAgJHZnL2x2CitsdnJlbW92ZSAtZmYgJHZnCisKK2x2Y3JlYXRlIC1MIDY0TSAtbiAkbHYgLWkyICR2Zworbm90IGx2cmVzaXplIC12IC1sICs0IHh4eC8kbHYKKworIyBDaGVjayBzdHJpcGUgc2l6ZSBpcyByZWR1Y2VkIHRvIGV4dGVudCBzaXplIHdoZW4gaXQncyBiaWdnZXIKK0VTSVpFPSQoZ2V0IHZnX2ZpZWxkICR2ZyB2Z19leHRlbnRfc2l6ZSAtLXVuaXRzIGIpCitsdmV4dGVuZCAtTCs2NG0gLWkgMiAtSSQoKCAke0VTSVpFJSVCfSAqIDIgKSlCICR2Zy8kbHYgMj4mMSB8IHRlZSBlcnIKK2dyZXAgIlJlZHVjaW5nIHN0cmlwZSBzaXplIiBlcnIKKworbHZyZW1vdmUgLWZmICR2ZworCitsdmNyZWF0ZSAtTCAxME0gLW4gbHYgJHZnICIkZGV2MSIKK2x2ZXh0ZW5kIC1MICsxME0gJHZnL2x2ICIkZGV2MiIKKworIyBBdHRlbXB0IHRvIHJlZHVjZSB3aXRoIGx2ZXh0ZW5kIGFuZCB2aWNlIHZlcnNhOgorbm90IGx2ZXh0ZW5kIC1MIDE2TSAkdmcvbHYKK25vdCBsdnJlZHVjZSAtTCAzMk0gJHZnL2x2CisKK2x2cmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbHZzLWNhY2hlLnNoIGIvdGVzdC9zaGVsbC9sdnMtY2FjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2YTAyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbHZzLWNhY2hlLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIEV4ZXJjaXNlIGNyZWF0aW9uIG9mIGNhY2hlIGFuZCBjYWNoZSBwb29sIHZvbHVtZXMKKworIyBGdWxsIENMSSB1c2VzICAtLXR5cGUKKyMgU2hvcnRoYW5kIENMSSB1c2VzIC1IIHwgLS1jYWNoZQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGhhdmVfY2FjaGUgMSAzIDAgfHwgc2tpcAorYXV4IHByZXBhcmVfdmcgNSA4MDAwCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgJHZnL2Nwb29sCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgMSAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wgLW4gY29yaWdpbiAkdmcKK2x2cyAtbyBsdl9uYW1lLGNhY2hlX3BvbGljeQorbHZzIC1vIGx2X25hbWUsY2FjaGVfc2V0dGluZ3MKKworbHZyZW1vdmUgLWYgJHZnCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgJHZnL2Nwb29sCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgMSAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wgLW4gY29yaWdpbiAkdmcgLS1jYWNoZXBvbGljeSBtcSBcCisJIC0tY2FjaGVzZXR0aW5ncyBtaWdyYXRpb25fdGhyZXNob2xkPTIzMworbHZzIC1vIGx2X25hbWUsY2FjaGVfcG9saWN5ICAgfCBncmVwIG1xCitsdnMgLW8gbHZfbmFtZSxjYWNoZV9zZXR0aW5ncyB8IGdyZXAgbWlncmF0aW9uX3RocmVzaG9sZD0yMzMKKworbHZyZW1vdmUgLWYgJHZnCisKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sIC1MMTAgLS1jYWNoZXBvbGljeSBtcSAtLWNhY2hlc2V0dGluZ3MgbWlncmF0aW9uX3RocmVzaG9sZD0yMzMgJHZnL2Nwb29sCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgMSAtLWNhY2hlcG9vbCAkdmcvY3Bvb2wgLW4gY29yaWdpbiAkdmcKK2x2cyAtbyBsdl9uYW1lLGNhY2hlX3BvbGljeSAgIHwgZ3JlcCBtcQorbHZzIC1vIGx2X25hbWUsY2FjaGVfc2V0dGluZ3MgfCBncmVwIG1pZ3JhdGlvbl90aHJlc2hvbGQ9MjMzCisKK2x2cmVtb3ZlIC1mICR2ZworCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUtcG9vbCAtTDEwIC0tY2FjaGVwb2xpY3kgbXEgLS1jYWNoZXNldHRpbmdzIG1pZ3JhdGlvbl90aHJlc2hvbGQ9MjMzIC0tY2FjaGVzZXR0aW5ncyBzZXF1ZW50aWFsX3RocmVzaG9sZD0xMyAkdmcvY3Bvb2wKK2x2Y3JlYXRlIC0tdHlwZSBjYWNoZSAtbCAxIC0tY2FjaGVwb29sICR2Zy9jcG9vbCAtbiBjb3JpZ2luICR2ZworbHZzIC1vIGx2X25hbWUsY2FjaGVfcG9saWN5ICAgfCBncmVwIG1xCitsdnMgLWEgLW8gbHZfbmFtZSxjYWNoZV9wb2xpY3kgLVMgJ2NhY2hlX3BvbGljeT1tcScgfCBncmVwIGNvcmlnaW4KK2x2cyAtbyBsdl9uYW1lLGNhY2hlX3NldHRpbmdzIHwgZ3JlcCBtaWdyYXRpb25fdGhyZXNob2xkPTIzMworbHZzIC1vIGx2X25hbWUsY2FjaGVfc2V0dGluZ3MgfCBncmVwIHNlcXVlbnRpYWxfdGhyZXNob2xkPTEzCisKK2x2Y3JlYXRlIC1uIGZvbyAtbCAxICR2ZworbHZzIC1TICdjYWNoZV9wb2xpY3k9bXEnIHwgZ3JlcCBjb3JpZ2luCitsdnMgLVMgJ2NhY2hlX3BvbGljeT1tcScgfCBub3QgZ3JlcCBmb28KK2x2cyAtUyAnY2FjaGVfcG9saWN5PXVuZGVmaW5lZCcgfCBub3QgZ3JlcCBjb3JpZ2luCitsdnMgLVMgJ2NhY2hlX3BvbGljeT11bmRlZmluZWQnIHwgZ3JlcCBmb28KK2x2cyAtbyArY2FjaGVfcG9saWN5IC1TICdjYWNoZV9wb2xpY3k9bXEnIHwgZ3JlcCBjb3JpZ2luCitsdnMgLW8gK2NhY2hlX3BvbGljeSAtUyAnY2FjaGVfcG9saWN5PW1xJyB8IG5vdCBncmVwIGZvbworbHZzIC1vICtjYWNoZV9wb2xpY3kgLVMgJ2NhY2hlX3BvbGljeT11bmRlZmluZWQnIHwgbm90IGdyZXAgY29yaWdpbgorbHZzIC1vICtjYWNoZV9wb2xpY3kgLVMgJ2NhY2hlX3BvbGljeT11bmRlZmluZWQnIHwgZ3JlcCBmb28KK2x2cyAtbyArY2FjaGVfcG9saWN5IC1PIGNhY2hlX3BvbGljeQorbHZzIC1vICtjYWNoZV9zZXR0aW5ncyAtUyAnY2FjaGVfc2V0dGluZ3M9e21pZ3JhdGlvbl90aHJlc2hvbGQ9MjMzfScgfCBncmVwIGNvcmlnaW4KK2x2cyAtbyArY2FjaGVfc2V0dGluZ3MgLVMgJ2NhY2hlX3NldHRpbmdzIT17bWlncmF0aW9uX3RocmVzaG9sZD0yMzN9JyB8IGdyZXAgZm9vCitsdnMgLW8gK2NhY2hlX3BvbGljeSAtTyBjYWNoZV9zZXR0aW5ncworCitsdnJlbW92ZSAtZiAkdmcKKworbHZjcmVhdGUgLW4gZm9vIC1sIDEgJHZnCitsdnMgLWEgLVMgJ2NhY2hlX3BvbGljeT11bmRlZmluZWQnIHwgZ3JlcCBmb28KZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbWRhLXJvbGxiYWNrLnNoIGIvdGVzdC9zaGVsbC9tZGEtcm9sbGJhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMDk1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbWRhLXJvbGxiYWNrLnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyAzCisKK3ZnY3JlYXRlIC0tbWV0YWRhdGFzaXplIDEyOGsgJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCit2Z3JlZHVjZSAkdmcxICIkZGV2MSIKK2RkIGlmPSIkZGV2MSIgb2Y9YmFkbWRhIGJzPTI1NksgY291bnQ9MQordmdleHRlbmQgJHZnMSAiJGRldjEiCisKK2RkIGlmPWJhZG1kYSBvZj0iJGRldjEiIGJzPTI1NksgY291bnQ9MQorCisjIGRldjEgaXMgcGFydCBvZiB2ZzEgKGFzIHdpdG5lc3NlZCBieSBtZXRhZGF0YSBvbiBkZXYyIGFuZCBkZXYzKSwgYnV0IGl0cyBtZGEKKyMgd2FzIGNvcnJ1cHQgKHdyaXR0ZW4gb3ZlciBieSBhIGJhY2t1cCBmcm9tIHRpbWUgZGV2MSB3YXMgYW4gb3JwaGFuKQorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiB2Z19uYW1lICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbWRhdGEtc3RyaW5ncy5zaCBiL3Rlc3Qvc2hlbGwvbWRhdGEtc3RyaW5ncy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2U4MzFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9tZGF0YS1zdHJpbmdzLnNoCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgJ1Rlc3QgZm9yIHByb3BlciBlc2NhcGluZyBvZiBzdHJpbmdzIGluIG1ldGFkYXRhIChiejQzMTQ3NCknCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIEZvciB1ZGV2IGltcG9zc2libGUgdG8gY3JlYXRlCit0ZXN0ICIkTFZNX1RFU1RfREVWRElSIiA9ICIvZGV2IiAmJiBza2lwCisKK2F1eCBwcmVwYXJlX2RldnMgMgorYXV4IGV4dGVuZF9maWx0ZXJfTFZNVEVTVAorCisjIFNldHVwIG1hbmdsaW5nIHRvICdub25lJyBnbG9iYWx5IGZvciBhbGwgbGliZG0gdXNlcnMKK2V4cG9ydCBETV9ERUZBVUxUX05BTUVfTUFOR0xJTkdfTU9ERT1ub25lCisKK3B2X3VnbHk9Il9fXCIhQCNcJCVeJiosKCl8QHx8J1xcXCJfX3B2MSIKKworIyAnc2V0IHVwIHRlbXAgZmlsZXMsIGxvb3BiYWNrIGRldmljZXMnCituYW1lPSQoYmFzZW5hbWUgIiRkZXYxIikKK2Rtc2V0dXAgcmVuYW1lICIkbmFtZSIgIiRQUkVGSVgkcHZfdWdseSIKK2RldjE9JChkaXJuYW1lICIkZGV2MSIpLyIkUFJFRklYJHB2X3VnbHkiCisKK2RtX3RhYmxlIHwgZ3JlcCAtRiAiJHB2X3VnbHkiCisKKyMgJ3B2Y3JlYXRlLCB2Z2NyZWF0ZSBvbiBmaWxlbmFtZSB3aXRoIGJhY2tzbGFzaGVkIGNoYXJzJworY3JlYXRlZD0iJGRldjEiCisjIHdoZW4gdXNlZCB3aXRoIHJlYWwgdWRldiB3aXRob3V0IGZhbGxiYWNrLCBpdCB3aWxsIGZhaWwgaGVyZQorcHZjcmVhdGUgIiRkZXYxIiB8fCBjcmVhdGVkPSIkZGV2MiIKK3B2ZGlzcGxheSAyPiYxIHwgdGVlIGVycgorc2hvdWxkIGdyZXAgLUYgIiRwdl91Z2x5IiBlcnIKK3Nob3VsZCBjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X25hbWUgIiRkZXYxIgordmdjcmVhdGUgJHZnICIkY3JlYXRlZCIKKyMgJ25vIHBhcnNlIGVycm9ycyBhbmQgVkcgcmVhbGx5IGV4aXN0cycKK3ZncyAkdmcgMj5lcnIKK25vdCBncmVwICJQYXJzZSBlcnJvciIgZXJyCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL21ldGFkYXRhLWJhbGFuY2Uuc2ggYi90ZXN0L3NoZWxsL21ldGFkYXRhLWJhbGFuY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllOTEzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbWV0YWRhdGEtYmFsYW5jZS5zaApAQCAtMCwwICsxLDIzNSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDYKKworZWNobyBNYWtlIHN1cmUgd2UgY2FuIGlnbm9yZSAvIHVuLWlnbm9yZSBtZGFzIG9uIGEgcGVyLVBWIGJhc2lzCitmb3IgcHZfaW5fdmcgaW4gMSAwOyBkbworZm9yIG1kYWNwIGluIDEgMjsgZG8KKwlwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzICRtZGFjcCAiJGRldjEiICIkZGV2MiIKKyAgICAgICAgcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIKKwlpZiBbICRwdl9pbl92ZyA9IDEgXTsgdGhlbgorCQl2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwlmaQorCXB2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgeSAiJGRldjEiCisJY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfY291bnQgJG1kYWNwCisJY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfdXNlZF9jb3VudCAwCisJY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9tZGFfY291bnQgJG1kYWNwCisJY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9tZGFfdXNlZF9jb3VudCAkbWRhY3AKKwlpZiBbICRwdl9pbl92ZyA9IDEgXTsgdGhlbgorCQljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50ICQoKCRtZGFjcCAqIDIpKQorCQljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX3VzZWRfY291bnQgJG1kYWNwCisJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCWZpCisJcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSBuICIkZGV2MSIKKwljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV9jb3VudCAkbWRhY3AKKwljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCWlmIFsgJHB2X2luX3ZnID0gMSBdOyB0aGVuCisJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY291bnQgJCgoJG1kYWNwICogMikpCisJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAyKSkKKwkJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgdW5tYW5hZ2VkCisJCXZncmVtb3ZlIC1mICR2ZworCWZpCitkb25lCitkb25lCisKKyMgQ2hlY2sgaWYgYSBQViBoYXMgdW5pZ25vcmVkICh1c2VkKSBtZGFzLCBhbmQgaWYgc28sIGlnbm9yZQorcHZpZ25vcmVfICgpIHsKKwlwdl9tZGFfdXNlZF9jb3VudD0kKGdldCBwdl9maWVsZCAiJDEiIHB2X21kYV91c2VkX2NvdW50KQorCWlmIFsgJHB2X21kYV91c2VkX2NvdW50IC1uZSAwIF07IHRoZW4KKwkgICAgcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSB5ICQxCisJZmkKK30KKworIyBDaGVjayBpZiBhIFBWIGhhcyBpZ25vcmVkIG1kYXMsIGFuZCBpZiBzbywgdW5pZ25vcmUgKG1ha2UgdXNlZCkKK3B2dW5pZ25vcmVfICgpIHsKKwlwdl9tZGFfY291bnQ9JChnZXQgcHZfZmllbGQgIiQxIiBwdl9tZGFfY291bnQpCisJcHZfbWRhX3VzZWRfY291bnQ9JChnZXQgcHZfZmllbGQgIiQxIiBwdl9tZGFfdXNlZF9jb3VudCkKKwlpZiBbICRwdl9tZGFfY291bnQgLWd0ICRwdl9tZGFfdXNlZF9jb3VudCBdOyB0aGVuCisJICAgIHB2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgbiAkMQorCWZpCit9CisKK2VjaG8gVGVzdCBvZiB2Z21ldGFkYXRhY29waWVzIHdpdGggdmdjcmVhdGUgYW5kIHZnY2hhbmdlCitmb3IgbWRhY3AgaW4gMSAyOyBkbworCXB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwICIkZGV2MSIgIiRkZXYyIiAiJGRldjQiICIkZGV2NSIKKwljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX3VzZWRfY291bnQgJG1kYWNwCisJY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9tZGFfdXNlZF9jb3VudCAkbWRhY3AKKwljaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCXB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjMiCisJdmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgdW5tYW5hZ2VkCisJZWNobyBlbnN1cmUgYm90aCAtLXZnbWV0YWRhdGFjb3BpZXMgYW5kIC0tbWV0YWRhdGFjb3BpZXMgYWNjZXB0ZWQKKwl2Z2NoYW5nZSAtLW1ldGFkYXRhY29waWVzICQoKCRtZGFjcCAqIDEpKSAkdmcKKwllY2hvIC0tdmdtZXRhZGF0YWNvcGllcyBpcyBwZXJzaXN0ZW50IG9uIGRpc2sKKwllY2hvIC0tdmdtZXRhZGF0YWNvcGllcyBhZmZlY3RzIHVuZGVybHlpbmcgcHYgbWRhIGlnbm9yZQorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzICQoKCRtZGFjcCAqIDEpKQorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAxKSkKKwl2Z2NoYW5nZSAtLXZnbWV0YWRhdGFjb3BpZXMgJCgoJG1kYWNwICogMikpICR2ZworCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzICQoKCRtZGFjcCAqIDIpKQorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAyKSkKKwllY2hvIGFsbG93IHNldHRpbmcgbWV0YWRhdGFjb3BpZXMgbGFyZ2VyIHRoYW4gbnVtYmVyIG9mIFBWcworCXZnY2hhbmdlIC0tdmdtZXRhZGF0YWNvcGllcyAkKCgkbWRhY3AgKiA1KSkgJHZnCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgJCgoJG1kYWNwICogNSkpCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV91c2VkX2NvdW50ICQoKCRtZGFjcCAqIDIpKQorCWVjaG8gc2V0dGluZyB0byAwIGRpc2FibGVzIGF1dG9tYXRpYyBiYWxhbmNpbmcKKwl2Z2NoYW5nZSAtLXZnbWV0YWRhdGFjb3BpZXMgdW5tYW5hZ2VkICR2ZworCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCXZncmVtb3ZlIC1mICR2ZworCWVjaG8gdmdjcmVhdGUgc3VjY2VlZHMgZXZlbiB3aGVuIGNyZWF0aW5nIGEgVkcgdy9hbGwgaWdub3JlZCBtZGFzCisJcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2MSIgIiRkZXYyIgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50ICRtZGFjcAorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX3VzZWRfY291bnQgMAorCXZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyB1bm1hbmFnZWQKKwl2Z3JlbW92ZSAtZiAkdmcKKwllY2hvIHZnY3JlYXRlIHN1Y2NlZWRzIHdpdGggYSBzcGVjaWZpYyBudW1iZXIgb2YgbWV0YWRhdGEgY29waWVzCisJdmdjcmVhdGUgLS12Z21ldGFkYXRhY29waWVzICQoKCRtZGFjcCAqIDIpKSAkdmcgIiRkZXYxIiAiJGRldjIiCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgJCgoJG1kYWNwICogMikpCisJdmdyZW1vdmUgLWYgJHZnCisJdmdjcmVhdGUgLS12Z21ldGFkYXRhY29waWVzICQoKCRtZGFjcCAqIDEpKSAkdmcgIiRkZXYxIiAiJGRldjIiCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgJCgoJG1kYWNwICogMSkpCisJdmdyZW1vdmUgLWYgJHZnCisJZWNobyB2Z2NyZWF0ZSBzdWNjZWVkcyB3aXRoIGEgbGFyZ2VyIHZhbHVlIHRoYW4gdG90YWwgbWV0YWRhdGFjb3BpZXMKKwl2Z2NyZWF0ZSAtLXZnbWV0YWRhdGFjb3BpZXMgJCgoJG1kYWNwICogNSkpICR2ZyAiJGRldjEiICIkZGV2MiIKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyAkKCgkbWRhY3AgKiA1KSkKKwl2Z3JlbW92ZSAtZiAkdmcKKwllY2hvIHZnY3JlYXRlIHN1Y2NlZWRzIHdpdGggLS12Z21ldGFkYXRhY29waWVzIHVubWFuYWdlZAorCXZnY3JlYXRlIC0tdmdtZXRhZGF0YWNvcGllcyB1bm1hbmFnZWQgJHZnICIkZGV2MSIgIiRkZXYyIgorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCXZncmVtb3ZlIC1mICR2ZworCXB2dW5pZ25vcmVfICIkZGV2MSIKKwlwdnVuaWdub3JlXyAiJGRldjIiCisJcHZ1bmlnbm9yZV8gIiRkZXY0IgorCXB2dW5pZ25vcmVfICIkZGV2NSIKKwllY2hvIHZnY3JlYXRlIHN1Y2NlZHMgd2l0aCBzbWFsbCB2YWx1ZSBvZiAtLW1ldGFkYXRhY29waWVzLCBpZ25vcmVzIG1kYXMKKwl2Z2NyZWF0ZSAtLXZnbWV0YWRhdGFjb3BpZXMgMSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2NCIgIiRkZXY1IgorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIDEKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50ICQoKCRtZGFjcCAqIDQpKQorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAxCisJZWNobyBTZXR0aW5nIGEgbGFyZ2VyIHZhbHVlIHNob3VsZCB0cmlnZ2VyIG5vbi1pZ25vcmUgb2YgbWRhcworCXZnY2hhbmdlIC0tbWV0YWRhdGFjb3BpZXMgMyAkdmcKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyAzCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV91c2VkX2NvdW50IDMKKwllY2hvIFNldHRpbmcgYWxsIHNob3VsZCB0cmlnZ2VyIHVuaWdub3JlIG9mIGFsbCBtZGFzCisJdmdjaGFuZ2UgLS12Z21ldGFkYXRhY29waWVzIGFsbCAkdmcKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50ICQoKCRtZGFjcCAqIDQpKQorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiA0KSkKKwllY2hvIC0tdmdtZXRhZGF0YWNvcGllcyAwIHNob3VsZCBiZSB1bm1hbmFnZWQgZm9yIHZnY2hhbmdlIGFuZCB2Z2NyZWF0ZQorCXZnY2hhbmdlIC0tdmdtZXRhZGF0YWNvcGllcyAwICR2ZworCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCXZncmVtb3ZlIC1mICR2ZworCXZnY3JlYXRlIC0tdmdtZXRhZGF0YWNvcGllcyAwICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXY0IiAiJGRldjUiCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3BpZXMgdW5tYW5hZ2VkCisJdmdyZW1vdmUgLWYgJHZnCitkb25lCisKK2VjaG8gVGVzdCB2Z2V4dGVuZCAvIHZncmVkdWNlIHdpdGggdmdtZXRhZGF0YWNvcGllcworZm9yIG1kYWNwIGluIDEgMjsgZG8KKwlwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzICRtZGFjcCAiJGRldjEiICIkZGV2MiIgIiRkZXY0IiAiJGRldjUiCisJcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIKKwllY2hvIFNldCBhIGxhcmdlIHZhbHVlIG9mIHZnbWV0YWRhdGFjb3BpZXMKKwl2Z2NyZWF0ZSAtLXZnbWV0YWRhdGFjb3BpZXMgJCgoJG1kYWNwICogNSkpICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzICQoKCRtZGFjcCAqIDUpKQorCWVjaG8gSWdub3JlIG1kYXMgb24gZGV2aWNlcyB0byBiZSB1c2VkIGZvciB2Z2V4dGVuZAorCWVjaG8gTGFyZ2UgdmFsdWUgb2YgdmdldGFkYXRhY29waWVzIHNob3VsZCBhdXRvbWF0aWNhbGx5IHVuLWlnbm9yZSBtZGFzCisJcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2NCIgIiRkZXY1IgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfbWRhX3VzZWRfY291bnQgMAorCXZnZXh0ZW5kICR2ZyAiJGRldjQiICIkZGV2NSIKKwljaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfbWRhX3VzZWRfY291bnQgJG1kYWNwCisJdmdyZW1vdmUgLWYgJHZnCisJZWNobyBTZXQgYSBzbWFsbCB2YWx1ZSBvZiB2Z21ldGFkYXRhY29waWVzCisJdmdjcmVhdGUgLS12Z21ldGFkYXRhY29waWVzICQoKCRtZGFjcCAqIDEpKSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyAkKCgkbWRhY3AgKiAxKSkKKwllY2hvIElnbm9yZSBtZGFzIG9uIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdmdleHRlbmQKKwllY2hvIFNtYWxsIHZhbHVlIG9mIHZnZXRhZGF0YWNvcGllcyBzaG91bGQgbGVhdmUgbWRhcyBhcyBpZ25vcmVkCisJcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2NCIgIiRkZXY1IgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfbWRhX3VzZWRfY291bnQgMAorCXZnZXh0ZW5kICR2ZyAiJGRldjQiICIkZGV2NSIKKwljaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X21kYV91c2VkX2NvdW50IDAKKwljaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X21kYV91c2VkX2NvdW50IDAKKwllY2hvIHZncmVkdWNlIG9mIGlnbm9yZWQgcHYgdy9tZGEgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBjaGFuZ2UgdG8gaWdub3JlIGJpdHMKKwl2Z3JlZHVjZSAkdmcgIiRkZXY0IgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfbWRhX3VzZWRfY291bnQgMAorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfbWRhX3VzZWRfY291bnQgMAorCWVjaG8gdmdyZWR1Y2Ugb2YgdW4taWdub3JlZCBwdiB3L21kYSBzaG91bGQgdHJpZ2dlciB1bi1pZ25vcmUgb24gYW4gbWRhCisJdmdyZWR1Y2UgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisJY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9tZGFfdXNlZF9jb3VudCAkbWRhY3AKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyAkKCgkbWRhY3AgKiAxKSkKKwlwdnVuaWdub3JlXyAiJGRldjEiCisJcHZ1bmlnbm9yZV8gIiRkZXYyIgorCWVjaG8gc2V0dGluZyB2Z21ldGFkYXRhY29waWVzIHRvIHVubWFuYWdlZCBzaG91bGQgYWxsb3cgdmdleHRlbmQgdG8gYWRkIHcvb3V0IGJhbGFuY2luZworCXZnY2hhbmdlIC0tdmdtZXRhZGF0YWNvcGllcyB1bm1hbmFnZWQgJHZnCisJdmdleHRlbmQgJHZnICIkZGV2MSIgIiRkZXYyIgorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY29waWVzIHVubWFuYWdlZAorCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY291bnQgJCgoJG1kYWNwICogMykpCisJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV91c2VkX2NvdW50ICQoKG1kYWNwICogMykpCisJY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfdXNlZF9jb3VudCAkbWRhY3AKKwljaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCXZncmVtb3ZlIC1mICR2ZworZG9uZQorCitlY2hvIFRlc3Qgc3BlY2lhbCBzaXR1YXRpb25zLCB2Z3NwbGl0LCB2Z21lcmdlLCBldGMKK2ZvciBtZGFjcCBpbiAxIDI7IGRvCisJcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAkbWRhY3AgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCisJdmdjcmVhdGUgLS12Z21ldGFkYXRhY29waWVzIDIgJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCXZnY3JlYXRlIC0tdmdtZXRhZGF0YWNvcGllcyAkKCgkbWRhY3AgKiAxKSkgJHZnMiAiJGRldjQiICIkZGV2NSIKKwllY2hvIHZnc3BsaXQvdmdtZXJnZSBwcmVzZXJ2ZXMgdmFsdWUgb2YgbWV0YWRhdGEgY29waWVzCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfY29waWVzIDIKKwljaGVjayB2Z19maWVsZCAkdmcyIHZnX21kYV9jb3BpZXMgJCgoJG1kYWNwICogMSkpCisJdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIgorCWNoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfbWRhX2NvcGllcyAkKCgkbWRhY3AgKiAxKSkKKwl2Z21lcmdlICR2ZzEgJHZnMgorCWNoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfbWRhX2NvcGllcyAyCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfY291bnQgJCgoJG1kYWNwICogNSkpCisJZWNobyB2Z3NwbGl0IGludG8gbmV3IHZnIHNldHMgcHJvcGVyIHZhbHVlIG9mIHZnbWV0YWRhdGFjb3BpZXMKKwl2Z3NwbGl0IC0tdmdtZXRhZGF0YWNvcGllcyAkKCgkbWRhY3AgKiAyKSkgJHZnMSAkdmcyICIkZGV2MSIgIiRkZXYyIgorCWNoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfbWRhX2NvcGllcyAkKCgkbWRhY3AgKiAyKSkKKwllY2hvIHZnY2hhbmdlIGZhaWxzIGlmIGdpdmVuIGJvdGggdmdtZXRhZGF0YWNvcGllcyBhbmQgbWV0YWRhdGFjb3BpZXMKKwlub3QgdmdjaGFuZ2UgLS12Z21ldGFkYXRhY29waWVzIDUgLS1tZXRhZGF0YWNvcGllcyA3ICR2ZzIKKwl2Z3JlbW92ZSAtZiAkdmcxICR2ZzIKK2RvbmUKKworZWNobyBUZXN0IGNvbWJpbmF0aW9uIG9mIC0tdmdtZXRhZGF0YWNvcGllcyBhbmQgcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZQorZm9yIG1kYWNwIGluIDEgMjsgZG8KKwlwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzICRtZGFjcCAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKKwl2Z2NyZWF0ZSAtLXZnbWV0YWRhdGFjb3BpZXMgJCgoJG1kYWNwICogMSkpICR2ZzEgIiRkZXYxIiAiJGRldjIiCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfY29waWVzICQoKCRtZGFjcCAqIDEpKQorCWNoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfbWRhX3VzZWRfY291bnQgJCgoJG1kYWNwICogMSkpCisJcHZpZ25vcmVfICIkZGV2MyIKKwllY2hvIEVuc3VyZSB2Z2V4dGVuZCBvZiBQVnMgd2l0aCBpZ25vcmVkIE1EQXMgZG9lcyBub3QgYWRkIHRvIHZnX21kYV91c2VkX2NvdW50CisJdmdleHRlbmQgJHZnMSAiJGRldjMiCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAxKSkKKwllY2hvIFVzaW5nIHB2Y2hhbmdlIHRvIHVuaWdub3JlIHNob3VsZCB1cGRhdGUgdmdfbWRhX3VzZWRfY291bnQKKwlwdmNoYW5nZSAtZiAtLW1ldGFkYXRhaWdub3JlIG4gIiRkZXYzIgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfbWRhX3VzZWRfY291bnQgJG1kYWNwCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAyKSkKKwllY2hvIFNldCB1bm1hbmFnZWQgb24gdGhlIHZnIHNob3VsZCBrZWVwIGlnbm9yZSBiaXRzIHRoZSBzYW1lIGR1cmluZyB2Z2V4dGVuZAorCXZnY2hhbmdlIC0tdmdtZXRhZGF0YWNvcGllcyB1bm1hbmFnZWQgJHZnMQorCWNoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfbWRhX3VzZWRfY291bnQgJCgoJG1kYWNwICogMikpCisJcHZ1bmlnbm9yZV8gIiRkZXY0IgorCXZnZXh0ZW5kICR2ZzEgIiRkZXY0IgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfbWRhX3VzZWRfY291bnQgJG1kYWNwCisJY2hlY2sgdmdfZmllbGQgJHZnMSB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAzKSkKKwllY2hvIFVzaW5nIHB2Y2hhbmdlIHRvIGlnbm9yZSBzaG91bGQgdXBkYXRlIHZnX21kYV91c2VkX2NvdW50CisJcHZjaGFuZ2UgLWYgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2NCIKKwljaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X21kYV91c2VkX2NvdW50IDAKKwljaGVjayB2Z19maWVsZCAkdmcxIHZnX21kYV91c2VkX2NvdW50ICQoKCRtZGFjcCAqIDIpKQorCXZncmVtb3ZlIC1mICR2ZzEKK2RvbmUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbWV0YWRhdGEtZGlycy5zaCBiL3Rlc3Qvc2hlbGwvbWV0YWRhdGEtZGlycy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVmNzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9tZXRhZGF0YS1kaXJzLnNoCkBAIC0wLDAgKzEsNDYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyAzCisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAkKGNhdCBERVZJQ0VTKQorbm90IHZnY3JlYXRlICR2ZyAkKGNhdCBERVZJQ0VTKQorCithdXggbHZtY29uZiAibWV0YWRhdGEvZGlycyA9IFsgXCIkVEVTVERJUi9tZGFcIiBdIgorCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3VudCAxCit2Z3JlbW92ZSAtZmYgJHZnCisKK3ZnY3JlYXRlICR2ZyAkKGNhdCBERVZJQ0VTKQorY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV9jb3VudCAxCit2Z3JlbW92ZSAtZmYgJHZnCisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMSAtLW1ldGFkYXRhaWdub3JlIHkgIiRkZXYxIgordmdjcmVhdGUgJHZnICQoY2F0IERFVklDRVMpCitjaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50IDIKK3ZncmVtb3ZlIC1mZiAkdmcKKworcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAxIC0tbWV0YWRhdGFpZ25vcmUgbiAiJGRldjEiCit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKK2NoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY291bnQgMgordmdyZW1vdmUgLWZmICR2ZworCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYxIgorYXV4IGx2bWNvbmYgIm1ldGFkYXRhL2RpcnMgPSBbIFwiJFRFU1RESVIvbWRhXCIsIFwiJFRFU1RESVIvbWRhMlwiIF0iCit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKK2NoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY291bnQgMgordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9tZXRhZGF0YS5zaCBiL3Rlc3Qvc2hlbGwvbWV0YWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZTJkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbWV0YWRhdGEuc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDUKKworcHZjcmVhdGUgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MiIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjMiCitwdmNyZWF0ZSAiJGRldjQiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXY1IgorCit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKK2x2Y3JlYXRlIC1uICRsdiAtbCAxIC1pNSAtSTI1NiAkdmcKKworcHZjaGFuZ2UgLXggbiAiJGRldjEiCitwdmNoYW5nZSAteCB5ICIkZGV2MSIKK3ZnY2hhbmdlIC1hIG4gJHZnCitwdmNoYW5nZSAtLXV1aWQgIiRkZXYxIgorcHZjaGFuZ2UgLS11dWlkICIkZGV2MiIKK3ZncmVtb3ZlIC1mICR2ZworCisjIGNoZWNrIHRoYXQgUFZzIHdpdGhvdXQgbWV0YWRhdGEgZG9uJ3QgY2F1c2UgdG9vIG1hbnkgZnVsbCBkZXZpY2UgcmVzY2FucyAoYno0NTI2MDYpCitmb3IgbWRhY3AgaW4gMSAwOyBkbworCXB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwICQoY2F0IERFVklDRVMpCisJcHZjcmVhdGUgIiRkZXYxIgorCXZnY3JlYXRlICR2ZyAkKGNhdCBERVZJQ0VTKQorCWx2Y3JlYXRlIC1uICRsdjEgLWwgMiAtaTUgLUkyNTYgJHZnCisJbHZjcmVhdGUgLWFleSAtbiAkbHYyIC0tdHlwZSBtaXJyb3IgLW0yIC1sIDIgICR2ZworCWx2Y2hhbmdlIC1hbiAkdmcvJGx2MSAkdmcvJGx2MgorCXZnY2hhbmdlIC1hZXkgJHZnCisJbHZjaGFuZ2UgLWFuICR2Zy8kbHYxICR2Zy8kbHYyCisJdmdyZW1vdmUgLWYgJHZnCitkb25lCitub3QgZ3JlcCAiQ2FjaGVkIFZHIC4qIGluY29ycmVjdCBQViBsaXN0IiBvdXQwCisKKyMgYmVnaW4gTTEgbWV0YWRhdGEgdGVzdHMKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk0xIiA7IHRoZW4KKworcHZjcmVhdGUgLU0xICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitwdjNfdXVpZD0kKGdldCBwdl9maWVsZCAiJGRldjMiIHB2X3V1aWQpCit2Z2NyZWF0ZSAtTTEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitwdmNoYW5nZSAtLXV1aWQgIiRkZXYxIgorCisjIHZlcmlmeSBwZV9zdGFydCBvZiBhbGwgTTEgUFZzCitwdl9hbGlnbj0iMTI4LjAwayIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgJHB2X2FsaWduCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHBlX3N0YXJ0ICRwdl9hbGlnbgorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwZV9zdGFydCAkcHZfYWxpZ24KKworcHZzIC0tdW5pdHMgayAtbyBuYW1lLHBlX3N0YXJ0LHZnX21kYV9zaXplLHZnX25hbWUgJChjYXQgREVWSUNFUykKKworIyB1cGdyYWRlIGZyb20gdjEgdG8gdjIgbWV0YWRhdGEKK3ZnY29udmVydCAtTTIgJHZnCisKKyMgdmVyaWZ5IHBlX3N0YXJ0IG9mIGFsbCBNMiBQVnMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgJHB2X2FsaWduCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHBlX3N0YXJ0ICRwdl9hbGlnbgorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwZV9zdGFydCAkcHZfYWxpZ24KKworcHZzIC0tdW5pdHMgayAtbyBuYW1lLHBlX3N0YXJ0LHZnX21kYV9zaXplLHZnX25hbWUgJChjYXQgREVWSUNFUykKKworIyBjcmVhdGUgYmFja3VwIGFuZCB0aGVuIHJlc3RvcmUgJGRldjMKK3ZnY2ZnYmFja3VwIC1mICRURVNURElSL2Jhay0lcyAkdmcKK3B2Y3JlYXRlIC1mZiAteSAtLXJlc3RvcmVmaWxlICRURVNURElSL2Jhay0kdmcgLS11dWlkICRwdjNfdXVpZCAiJGRldjMiCit2Z2NmZ3Jlc3RvcmUgLWYgJFRFU1RESVIvYmFrLSR2ZyAkdmcKKworIyB2ZXJpZnkgcGVfc3RhcnQgb2YgJGRldjMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcGVfc3RhcnQgJHB2X2FsaWduCisKK2ZpCisjIGVuZCBNMSBtZXRhZGF0YSB0ZXN0cworCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL21pcnJvci1uYW1lcy5zaCBiL3Rlc3Qvc2hlbGwvbWlycm9yLW5hbWVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OWNiZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL21pcnJvci1uYW1lcy5zaApAQCAtMCwwICsxLDE1NCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTkVDIENvcnBvcmF0aW9uCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249ImNoZWNrIG5hbWluZ3Mgb2YgbWlycm9yZWQgTFYiCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFV0aWxpdGllcworCitsdl9kZXZpY2VzXygpIHsKKwlsb2NhbCBkCisJbG9jYWwgbHY9JDEKKwlzaGlmdAorCWxvY2FsIGRldmljZXM9JEAKKwlsb2NhbCBkZXZzCisKKwlkZXZzPSQoZ2V0IGx2X2RldmljZXMgIiRsdiIpCisKKwlmb3IgZCBpbiAkZGV2czsgZG8KKwkJKGVjaG8gIiRkZXZpY2VzIiB8IGdyZXAgIiRkIikgfHwgcmV0dXJuIDEKKwkJZGV2aWNlcz0kKGVjaG8gIiRkZXZpY2VzIiB8IHNlZCAicy8kZC8vIikKKwlkb25lCisKKwl0ZXN0IC16ICIkKGVjaG8gJGRldmljZXMgfCBzZWQgJ3MvIC8vZycpIgorfQorCitsdl9taXJyb3JfbG9nXygpIHsKKwlnZXQgbHZfZmllbGQgJDEgbWlycm9yX2xvZyB8IHRyIC1kIFtdCit9CisKK2x2X2NvbnZlcnRfbHZfKCkgeworCWdldCBsdl9maWVsZCAkMSBjb252ZXJ0X2x2IHwgdHIgLWQgW10KK30KKworZW5hYmxlX2RldnMoKSB7CisJYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCWF1eCBlbmFibGVfZGV2ICIkZGV2MiIKKwlhdXggZW5hYmxlX2RldiAiJGRldjMiCisJYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorCWF1eCBlbmFibGVfZGV2ICIkZGV2NSIKK30KKworZGVsYXlfZGV2cygpIHsKKwlhdXggZGVsYXlfZGV2ICIkZGV2MSIgMCAxMDAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYxIik6CisJYXV4IGRlbGF5X2RldiAiJGRldjIiIDAgMTAwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MiIpOgorCWF1eCBkZWxheV9kZXYgIiRkZXYzIiAwIDEwMDAgJChnZXQgZmlyc3RfZXh0ZW50X3NlY3RvciAiJGRldjMiKToKKwlhdXggZGVsYXlfZGV2ICIkZGV2NCIgMCAxMDAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXY0Iik6CisJYXV4IGRlbGF5X2RldiAiJGRldjUiIDAgMTAwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2NSIpOgorfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21tb24gZW52aXJvbm1lbnQgc2V0dXAvY2xlYW51cCBmb3IgZWFjaCBzdWIgdGVzdGNhc2VzCisKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18oKSB7CisJbHZzIC1hIC1vK2RldmljZXMgJHZnCisJbHZyZW1vdmUgLWZmICR2ZworCShkbV90YWJsZSB8IG5vdCBncmVwICR2ZykgfHwgXAorCQlkaWUgIkVSUk9SOiBsdnJlbW92ZSBkaWQgbGVhdmUgc29tZSBzb21lIG1hcHBpbmdzIGluIERNIGJlaGluZCEiCit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluaXRpYWxpemUgUFZzIGFuZCBWR3MKKworYXV4IHByZXBhcmVfdmcgNSA4MAorCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGJhc2ljCisKKyNDT01NICJpbml0OiBsdmNyZWF0ZSIKKworI0NPTU0gIm1pcnJvciBpbWFnZXMgYXJlICR7bHYxfV9taW1hZ2VfeCIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnCitsdl9kZXZpY2VzXyAkdmcvJGx2MSAke2x2MX1fbWltYWdlXzAgJHtsdjF9X21pbWFnZV8xCisKKyNDT01NICJtaXJyb3IgbG9nIGlzICR7bHYxfV9tbG9nIgordGVzdCAkKGx2X21pcnJvcl9sb2dfICR2Zy8kbHYxKSA9ICR7bHYxfV9tbG9nCisKKyMgImNsZWFudXAiCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICJtaXJyb3Igd2l0aCBuYW1lIGxvbmdlciB0aGFuIDIyIGNoYXJhY3RlcnMgKGJ6MjIxMzIyKSIKK25hbWU9IkxWd2l0aGFuYW1lbG9nZXJ0aGFuMjJjaGFyYWN0ZXJzX2J1dGlkb250d29udHRvY291bnRoZW0iCitsdmNyZWF0ZSAtYW4gLVpuIC0tdHlwZSBtaXJyb3IgLW0xIC1sMiAtbiAkbmFtZSAkdmcKK2x2cyAkdmcvJG5hbWUKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbHZyZW5hbWUKKworI0NPTU0gImluaXQ6IGx2cmVuYW1lIgorCisjQ09NTSAicmVuYW1lZCBtaXJyb3IgbmFtZXM6ICRsdjEgdG8gJGx2MiIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnCitsdnJlbmFtZSAkdmcvJGx2MSAkdmcvJGx2MgorbHZfZGV2aWNlc18gJHZnLyRsdjIgJHtsdjJ9X21pbWFnZV8wICR7bHYyfV9taW1hZ2VfMQorbHZfbWlycm9yX2xvZ18gJHZnLyRsdjIgJHtsdjJ9X21sb2cKKworI0NPTU0gImNsZWFudXAiCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGx2Y29udmVydAorCisjQ09NTSAiaW5pdDogbHZjb252ZXJ0IgorCisjQ09NTSAiY29udmVydGluZyBtaXJyb3IgbmFtZXMgaXMgJHtsdjF9X21pbWFnZXRtcF8yIgorbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcKK2RlbGF5X2RldnMKK0xWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBsdmNvbnZlcnQgLW0rMSAtaSs0MCAtYiAkdmcvJGx2MQorY29udmx2PSQobHZfY29udmVydF9sdl8gJHZnLyRsdjEpCit0ZXN0ICRjb252bHYgPSAke2x2MX1fbWltYWdldG1wXzIKK2x2X2RldmljZXNfICR2Zy8kbHYxICRjb252bHYgJHtsdjF9X21pbWFnZV8yCitsdl9kZXZpY2VzXyAkdmcvJGNvbnZsdiAke2x2MX1fbWltYWdlXzAgJHtsdjF9X21pbWFnZV8xCitsdl9taXJyb3JfbG9nXyAkdmcvJGNvbnZsdiAke2x2MX1fbWxvZworZW5hYmxlX2RldnMKKworI0NPTU0gIm1pcnJvciBsb2cgbmFtZSBhZnRlciByZS1hZGRpbmcgaXMgJHtsdjF9X21sb2ciIFwKK2x2Y29udmVydCAtZiAtLW1pcnJvcmxvZyBjb3JlICR2Zy8kbHYxCitsdmNvbnZlcnQgLS1taXJyb3Jsb2cgZGlzayAkdmcvJGx2MQorY29udmx2PSQobHZfY29udmVydF9sdl8gJHZnLyRsdjEpCitsdl9kZXZpY2VzXyAkdmcvJGx2MSAkY29udmx2ICR7bHYxfV9taW1hZ2VfMgorbHZfZGV2aWNlc18gJHZnLyRjb252bHYgJHtsdjF9X21pbWFnZV8wICR7bHYxfV9taW1hZ2VfMQorbHZfbWlycm9yX2xvZ18gJHZnLyRjb252bHYgJHtsdjF9X21sb2cKKworI0NPTU0gInJlbmFtZWQgY29udmVydGluZyBtaXJyb3IgbmFtZXM6ICRsdjEgdG8gJGx2MiIgXAorbHZyZW5hbWUgJHZnLyRsdjEgJHZnLyRsdjIKK2NvbnZsdj0kKGx2X2NvbnZlcnRfbHZfICR2Zy8kbHYyKQorbHZfZGV2aWNlc18gJHZnLyRsdjIgJGNvbnZsdiAke2x2Mn1fbWltYWdlXzIKK2x2X2RldmljZXNfICR2Zy8kY29udmx2ICR7bHYyfV9taW1hZ2VfMCAke2x2Mn1fbWltYWdlXzEKK2x2X21pcnJvcl9sb2dfICR2Zy8kY29udmx2ICR7bHYyfV9tbG9nCisKKyNDT01NICJjbGVhbnVwIgorY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjIFRlbXBvcmFyeSBtaXJyb3IgbG9nIHNob3VsZCBoYXZlICJfbWxvZ3RtcF88bj4iIHN1ZmZpeAorIyBidXQgY3VycmVudGx5IGx2Y29udmVydCBkb2Vzbid0IGhhdmUgYW4gb3B0aW9uIHRvIGFkZCB0aGUgbG9nLgorIyBJZiBzdWNoIGZlYXR1cmUgaXMgYWRkZWQgaW4gZnV0dXJlLCBhIHRlc3QgZm9yIHRoYXQgc2hvdWxkCisjIGJlIGFkZGVkLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9taXJyb3ItdmdyZWR1Y2UtcmVtb3ZlbWlzc2luZy5zaCBiL3Rlc3Qvc2hlbGwvbWlycm9yLXZncmVkdWNlLXJlbW92ZW1pc3Npbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1MWFmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbWlycm9yLXZncmVkdWNlLXJlbW92ZW1pc3Npbmcuc2gKQEAgLTAsMCArMSw0MDggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNyBORUMgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0iZW5zdXJlIHRoYXQgJ3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZycgd29ya3Mgb24gbWlycm9yZWQgTFYiCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworIyBkaXNhYmxlIGx2bWV0YWQgbG9nZ2luZyBhcyBpdCBib2dzIGRvd24gdGVzdCBzeXN0ZW1zCitleHBvcnQgTFZNX1RFU1RfTFZNRVRBRF9ERUJVR19PUFRTPSR7TFZNX1RFU1RfTFZNRVRBRF9ERUJVR19PUFRTLX0KKworLiBsaWIvaW5pdHRlc3QKKworbHZfaXNfb25fICgpCit7CisJbG9jYWwgbHY9JHZnLyQxCisJc2hpZnQKKwlsb2NhbCBwdnM9JEAKKworCWVjaG8gIkNoZWNrIGlmICRsdiBpcyBleGFjdGx5IG9uIFBWcyAkcHZzIgorCXJtIC1mIG91dDEgb3V0MgorCWVjaG8gJHB2cyB8IHNlZCAncy8gL1xuL2cnIHwgc29ydCB8IHVuaXEgPiBvdXQxCisKKwlsdnMgLWEgLW8rZGV2aWNlcyAkbHYKKwlnZXQgbHZfZGV2aWNlcyAkbHYgfCBzZWQgJ3MvIC9cbi9nJyB8IHNvcnQgfCB1bmlxID4gb3V0MiB8fCB0cnVlCisKKwlkaWZmIC0taWdub3JlLWJsYW5rLWxpbmVzIG91dDEgb3V0MgorfQorCittaW1hZ2VzX2FyZV9vbl8gKCkKK3sKKwlsb2NhbCBsdj0kMQorCXNoaWZ0CisJbG9jYWwgcHZzPSRACisJbG9jYWwgbWltYWdlcworCWxvY2FsIGkKKworCWVjaG8gIkNoZWNrIGlmIG1pcnJvciBpbWFnZXMgb2YgJGx2IGFyZSBvbiBQVnMgJHB2cyIKKwlybSAtZiBvdXQxIG91dDIKKwllY2hvICRwdnMgfCBzZWQgJ3MvIC9cbi9nJyB8IHNvcnQgfCB1bmlxID4gb3V0MQorCWx2cyAtLW5vaGVhZGluZ3MgLWEgLW8gbHZfbmFtZSAkdmcgfCB0ZWUgbHZzX2xvZworCW1pbWFnZXM9JChncmVwICIke2x2fV9taW1hZ2VfIiBsdnNfbG9nIHwgXAorCQlzZWQgJ3MvXFsvL2c7IHMvXF0vL2cnIHx8IHRydWUpCisKKwlmb3IgaSBpbiAkbWltYWdlczsgZG8KKwkJZWNobyAiQ2hlY2tpbmcgJHZnLyRpIgorCQlsdnMgLWEgLW8rZGV2aWNlcyAkdmcvJGkKKwkJbHZzIC1hIC1vZGV2aWNlcyAtLW5vaGVhZGluZ3MgJHZnLyRpIHwgdGVlIGx2c19sb2cKKwkJc2VkICdzLyhbXildKikvL2c7IHMvIC8vZzsgcy8sLyAvZycgbHZzX2xvZyB8IHNvcnQgfCB1bmlxID4+IG91dDIgfHwgdHJ1ZQorCWRvbmUKKworCWRpZmYgLS1pZ25vcmUtYmxhbmstbGluZXMgb3V0MSBvdXQyCit9CisKK21pcnJvcmxvZ19pc19vbl8oKQoreworCWxvY2FsIGx2PSR7MX1fbWxvZworCXNoaWZ0CisJbHZfaXNfb25fICRsdiAiJEAiCit9CisKK2x2X2lzX2xpbmVhcl8oKQoreworCWVjaG8gIkNoZWNrIGlmICQxIGlzIGxpbmVhciBMViAoaS5lLiBub3QgYSBtaXJyb3IpIgorCWdldCBsdl9maWVsZCAkdmcvJDEgInN0cmlwZXMsYXR0ciIgfCB0ZWUgb3V0CisJZ3JlcCAiXjEgLSIgb3V0ID4vZGV2L251bGwKK30KKworcmVzdF9wdnNfKCkKK3sKKwlsb2NhbCBpbmRleD0kMQorCWxvY2FsIG51bT0kMgorCWxvY2FsIHJlbT0KKwlsb2NhbCBuCisJbG9jYWwgZGV2CisKKwlmb3IgbiBpbiAkKHNlcSAxICQoKCRpbmRleCAtIDEpKSkgJChzZXEgJCgoJGluZGV4ICsgMSkpICRudW0pOyBkbworCQlldmFsIGRldj0kXGRldiRuCisJCXJlbT0iJHJlbSAkZGV2IgorCWRvbmUKKworCWVjaG8gIiRyZW0iCit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluaXRpYWxpemUgUFZzIGFuZCBWR3MKKworYXV4IHByZXBhcmVfcHZzIDUgODAKKwordmdjcmVhdGUgLXMgNjRrICR2ZyAkKGNhdCBERVZJQ0VTKQorQkxPQ0tTPTAtNworQkxPQ0tTMT04LTE1CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21tb24gZW52aXJvbm1lbnQgc2V0dXAvY2xlYW51cCBmb3IgZWFjaCBzdWIgdGVzdGNhc2VzCisKK3ByZXBhcmVfbHZzXygpCit7CisJbHZyZW1vdmUgLWZmICR2ZworCShkbV90YWJsZSB8IG5vdCBncmVwICR2ZykgfHwgXAorCQlkaWUgIkVSUk9SOiBsdnJlbW92ZSBkaWQgbGVhdmUgc29tZSBzb21lIG1hcHBpbmdzIGluIERNIGJlaGluZCEiCit9CisKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18oKQoreworCWx2cyAtYSAtbytkZXZpY2VzICR2ZworCXByZXBhcmVfbHZzXworfQorCityZWNvdmVyX3ZnXygpCit7CisJYXV4IGVuYWJsZV9kZXYgIiRAIgorCXB2Y3JlYXRlIC1mZiAiJEAiCisJdmdleHRlbmQgJHZnICIkQCIKKwljaGVja19hbmRfY2xlYW51cF9sdnNfCit9CisKKyNDT01NICJjaGVjayBlbnZpcm9ubWVudCBzZXR1cC9jbGVhbnVwIgorcHJlcGFyZV9sdnNfCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG9uZSBvZiBtaXJyb3IgaW1hZ2VzIGhhcyBmYWlsZWQKKworI0NPTU0gImJhc2ljOiBmYWlsIHRoZSAybmQgbWlycm9yIGltYWdlIG9mIDItd2F5IG1pcnJvcmVkIExWIgorcHJlcGFyZV9sdnNfCitsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW5vc3luYyAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIjokQkxPQ0tTCittaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIKK21pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjMiCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCitsdl9pc19saW5lYXJfICRsdjEKK2x2X2lzX29uXyAkbHYxICIkZGV2MSIKKworIyAiY2xlYW51cCIKK3JlY292ZXJfdmdfICIkZGV2MiIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTFYgaGFzIDMgaW1hZ2VzIGluIGZsYXQsCisjIDEgb3V0IG9mIDMgaW1hZ2VzIGZhaWxzCisKKyNDT01NIHRlc3RfM3dheV9taXJyb3JfZmFpbF8xXyA8UFYjIHRvIGZhaWw+Cit0ZXN0XzN3YXlfbWlycm9yX2ZhaWxfMV8oKQoreworCWxvY2FsIGluZGV4PSQxCisKKwlsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMiAtLW5vc3luYyAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiOiRCTE9DS1MKKwltaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCW1pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjQiCisJZXZhbCBhdXggZGlzYWJsZV9kZXYgXCRkZXYkaW5kZXgKKwl2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSAkdmcKKwltaW1hZ2VzX2FyZV9vbl8gJGx2MSAkKHJlc3RfcHZzXyAkaW5kZXggMykKKwltaXJyb3Jsb2dfaXNfb25fICRsdjEgIiRkZXY0IgorfQorCitmb3IgbiBpbiAkKHNlcSAxIDMpOyBkbworCSNDT01NIGZhaWwgbWlycm9yIGltYWdlICQoKCRuIC0gMSkpIG9mIDMtd2F5IG1pcnJvcmVkIExWIgorCXByZXBhcmVfbHZzXworCXRlc3RfM3dheV9taXJyb3JfZmFpbF8xXyAkbgorCWV2YWwgcmVjb3Zlcl92Z18gXCRkZXYkbgorZG9uZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMViBoYXMgMyBpbWFnZXMgaW4gZmxhdCwKKyMgMiBvdXQgb2YgMyBpbWFnZXMgZmFpbAorCisjQ09NTSB0ZXN0XzN3YXlfbWlycm9yX2ZhaWxfMl8gPFBWIyBOT1QgdG8gZmFpbD4KK3Rlc3RfM3dheV9taXJyb3JfZmFpbF8yXygpCit7CisJbG9jYWwgaW5kZXg9JDEKKworCWx2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0yIC0tbm9zeW5jIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCI6JEJMT0NLUworCW1pbWFnZXNfYXJlX29uXyAkbHYxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisJbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NCIKKwlyZXN0X3B2c18gJGluZGV4IDMKKwlhdXggZGlzYWJsZV9kZXYgJChyZXN0X3B2c18gJGluZGV4IDMpCisJdmdyZWR1Y2UgLS1mb3JjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCisJbHZfaXNfbGluZWFyXyAkbHYxCisJZXZhbCBsdl9pc19vbl8gJGx2MSBcJGRldiRuCit9CisKK2ZvciBuIGluICQoc2VxIDEgMyk7IGRvCisJI0NPTU0gZmFpbCBtaXJyb3IgaW1hZ2VzIG90aGVyIHRoYW4gbWlycm9yIGltYWdlICQoKCRuIC0gMSkpIG9mIDMtd2F5IG1pcnJvcmVkIExWCisJcHJlcGFyZV9sdnNfCisJdGVzdF8zd2F5X21pcnJvcl9mYWlsXzJfICRuCisJcmVjb3Zlcl92Z18gJChyZXN0X3B2c18gJG4gMykKK2RvbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTFYgaGFzIDQgaW1hZ2VzLCAxIG9mIHRoZW0gaXMgaW4gdGhlIHRlbXBvcmFyeSBtaXJyb3IgZm9yIHN5bmNpbmcuCisjIDEgb3V0IG9mIDQgaW1hZ2VzIGZhaWxzCisKKyNDT01NIHRlc3RfM3dheV9taXJyb3JfcGx1c18xX2ZhaWxfMV8gPFBWIyB0byBmYWlsPgordGVzdF8zd2F5X21pcnJvcl9wbHVzXzFfZmFpbF8xXygpCit7CisJbG9jYWwgaW5kZXg9JDEKKworCWx2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0yIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NSI6JEJMT0NLUworCWx2Y29udmVydCAtbSsxICR2Zy8kbHYxICIkZGV2NCIKKwljaGVjayBtaXJyb3JfaW1hZ2VzX29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKwljaGVjayBtaXJyb3JfbG9nX29uICR2ZyAkbHYxICIkZGV2NSIKKwlldmFsIGF1eCBkaXNhYmxlX2RldiBcJGRldiRpbmRleAorICAgICAgICBsdnMgLWEgLW8gK2RldmljZXMKKwl2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSAkdmcKKwlsdnMgLWEgLW8rZGV2aWNlcyAjICR2ZworCWNoZWNrIG1pcnJvcl9pbWFnZXNfb24gJHZnICRsdjEgIiRkZXY1IiAjICQocmVzdF9wdnNfICRpbmRleCA0KQorCWNoZWNrIG1pcnJvcl9sb2dfb24gJHZnICRsdjEgIiRkZXY1IgorfQorCitmb3IgbiBpbiAkKHNlcSAxIDQpOyBkbworCSNDT01NICJmYWlsIG1pcnJvciBpbWFnZSAkKCgkbiAtIDEpKSBvZiA0LXdheSAoMSBjb252ZXJ0aW5nKSBtaXJyb3JlZCBMViIKKwlwcmVwYXJlX2x2c18KKwl0ZXN0XzN3YXlfbWlycm9yX3BsdXNfMV9mYWlsXzFfICRuCisJZXZhbCByZWNvdmVyX3ZnXyBcJGRldiRuCitkb25lCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExWIGhhcyA0IGltYWdlcywgMSBvZiB0aGVtIGlzIGluIHRoZSB0ZW1wb3JhcnkgbWlycm9yIGZvciBzeW5jaW5nLgorIyAzIG91dCBvZiA0IGltYWdlcyBmYWlsCisKKyNDT01NIHRlc3RfM3dheV9taXJyb3JfcGx1c18xX2ZhaWxfM18gPFBWIyBOT1QgdG8gZmFpbD4KK3Rlc3RfM3dheV9taXJyb3JfcGx1c18xX2ZhaWxfM18oKQoreworCWxvY2FsIGluZGV4PSQxCisJbG9jYWwgZGV2CisKKwlsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMiAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjUiOiRCTE9DS1MKKwlsdmNvbnZlcnQgLW0rMSAkdmcvJGx2MSAiJGRldjQiCisJY2hlY2sgbWlycm9yX2ltYWdlc19vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisJY2hlY2sgbWlycm9yX2xvZ19vbiAkdmcgJGx2MSAiJGRldjUiCisJbHZzIC1hIC1vK2RldmljZXMgJHZnCisJYXV4IGRpc2FibGVfZGV2ICQocmVzdF9wdnNfICRpbmRleCA0KQorCXZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworCWx2cyAtYSAtbytkZXZpY2VzICR2ZworCWV2YWwgZGV2PVwkZGV2JG4KKwljaGVjayBsaW5lYXIgJHZnICRsdjEKKwljaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldiIKK30KKworZm9yIG4gaW4gJChzZXEgMSA0KTsgZG8KKwkjQ09NTSAiZmFpbCBtaXJyb3IgaW1hZ2VzIG90aGVyIHRoYW4gbWlycm9yIGltYWdlICQoKCRuIC0gMSkpIG9mIDQtd2F5ICgxIGNvbnZlcnRpbmcpIG1pcnJvcmVkIExWIgorCXByZXBhcmVfbHZzXworCXRlc3RfM3dheV9taXJyb3JfcGx1c18xX2ZhaWxfM18gJG4KKwlyZWNvdmVyX3ZnXyAkKHJlc3RfcHZzXyAkbiA0KQorZG9uZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMViBoYXMgNCBpbWFnZXMsIDIgb2YgdGhlbSBhcmUgaW4gdGhlIHRlbXBvcmFyeSBtaXJyb3IgZm9yIHN5bmNpbmcuCisjIDEgb3V0IG9mIDQgaW1hZ2VzIGZhaWwKKworIyB0ZXN0XzJ3YXlfbWlycm9yX3BsdXNfMl9mYWlsXzFfIDxQViMgdG8gZmFpbD4KK3Rlc3RfMndheV9taXJyb3JfcGx1c18yX2ZhaWxfMV8oKQoreworCWxvY2FsIGluZGV4PSQxCisKKwlsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXY1IjokQkxPQ0tTCisJbHZjb252ZXJ0IC1tKzIgJHZnLyRsdjEgIiRkZXYzIiAiJGRldjQiCisJbWltYWdlc19hcmVfb25fICRsdjEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorCW1pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCisJZXZhbCBhdXggZGlzYWJsZV9kZXYgXCRkZXYkbgorCXZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworCW1pbWFnZXNfYXJlX29uXyAkbHYxICQocmVzdF9wdnNfICRpbmRleCA0KQorCW1pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCit9CisKK2ZvciBuIGluICQoc2VxIDEgNCk7IGRvCisJI0NPTU0gImZhaWwgbWlycm9yIGltYWdlICQoKCRuIC0gMSkpIG9mIDQtd2F5ICgyIGNvbnZlcnRpbmcpIG1pcnJvcmVkIExWIgorCXByZXBhcmVfbHZzXworCXRlc3RfMndheV9taXJyb3JfcGx1c18yX2ZhaWxfMV8gJG4KKwlldmFsIHJlY292ZXJfdmdfIFwkZGV2JG4KK2RvbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTFYgaGFzIDQgaW1hZ2VzLCAyIG9mIHRoZW0gYXJlIGluIHRoZSB0ZW1wb3JhcnkgbWlycm9yIGZvciBzeW5jaW5nLgorIyAzIG91dCBvZiA0IGltYWdlcyBmYWlsCisKKyMgdGVzdF8yd2F5X21pcnJvcl9wbHVzXzJfZmFpbF8zXyA8UFYjIE5PVCB0byBmYWlsPgordGVzdF8yd2F5X21pcnJvcl9wbHVzXzJfZmFpbF8zXygpCit7CisJbG9jYWwgaW5kZXg9JDEKKwlsb2NhbCBkZXYKKworCWx2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjUiOiRCTE9DS1MKKwlsdmNvbnZlcnQgLW0rMiAkdmcvJGx2MSAiJGRldjMiICIkZGV2NCIKKwltaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisJbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKKwlhdXggZGlzYWJsZV9kZXYgJChyZXN0X3B2c18gJGluZGV4IDQpCisJdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCisJbHZzIC1hIC1vK2RldmljZXMgJHZnCisJZXZhbCBkZXY9XCRkZXYkbgorCW1pbWFnZXNfYXJlX29uXyAkbHYxICIkZGV2IiB8fCBsdl9pc19vbl8gJGx2MSAiJGRldiIKKwlub3QgbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKK30KKworZm9yIG4gaW4gJChzZXEgMSA0KTsgZG8KKwkjQ09NTSAiZmFpbCBtaXJyb3IgaW1hZ2VzIG90aGVyIHRoYW4gbWlycm9yIGltYWdlICQoKCRuIC0gMSkpIG9mIDQtd2F5ICgyIGNvbnZlcnRpbmcpIG1pcnJvcmVkIExWIgorCXByZXBhcmVfbHZzXworCXRlc3RfMndheV9taXJyb3JfcGx1c18yX2ZhaWxfM18gJG4KKwlyZWNvdmVyX3ZnXyAkKHJlc3RfcHZzXyAkbiA0KQorZG9uZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsb2cgZGV2aWNlIGlzIGdvbmUgKGZsYXQgbWlycm9yIGFuZCBzdGFja2VkIG1pcnJvcikKKworI0NPTU0gImZhaWwgbWlycm9yIGxvZyBvZiAyLXdheSBtaXJyb3JlZCBMViIKK3ByZXBhcmVfbHZzXworbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2NSI6JEJMT0NLUworbWltYWdlc19hcmVfb25fICRsdjEgIiRkZXYxIiAiJGRldjIiCittaXJyb3Jsb2dfaXNfb25fICRsdjEgIiRkZXY1IgorYXV4IGRpc2FibGVfZGV2ICIkZGV2NSIKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworbWltYWdlc19hcmVfb25fICRsdjEgIiRkZXYxIiAiJGRldjIiCitub3QgbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKK3JlY292ZXJfdmdfICIkZGV2NSIKKworI0NPTU0gImZhaWwgbWlycm9yIGxvZyBvZiAzLXdheSAoMSBjb252ZXJ0aW5nKSBtaXJyb3JlZCBMViIKK3ByZXBhcmVfbHZzXworbHZjcmVhdGUgLWFleSAtbDIgLS10eXBlIG1pcnJvciAtbTEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2NSI6JEJMT0NLUworbHZjb252ZXJ0IC1tKzEgJHZnLyRsdjEgIiRkZXYzIgorbWltYWdlc19hcmVfb25fICRsdjEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK21pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCithdXggZGlzYWJsZV9kZXYgIiRkZXY1IgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCittaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorbm90IG1pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCityZWNvdmVyX3ZnXyAiJGRldjUiCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFsbCBpbWFnZXMgYXJlIGdvbmUgKGZsYXQgbWlycm9yIGFuZCBzdGFja2VkIG1pcnJvcikKKworI0NPTU0gImZhaWwgYWxsIG1pcnJvciBpbWFnZXMgb2YgMi13YXkgbWlycm9yZWQgTFYiCitwcmVwYXJlX2x2c18KK2x2Y3JlYXRlIC1hbiAtWm4gLWwyIC0tdHlwZSBtaXJyb3IgLW0xIC0tbm9zeW5jIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjUiOiRCTE9DS1MKK21pbWFnZXNfYXJlX29uXyAkbHYxICIkZGV2MSIgIiRkZXYyIgorbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiICIkZGV2MiIKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2Zworbm90IGx2cyAkdmcvJGx2MQorcmVjb3Zlcl92Z18gIiRkZXYxIiAiJGRldjIiCisKKyNDT01NICJmYWlsIGFsbCBtaXJyb3IgaW1hZ2VzIG9mIDMtd2F5ICgxIGNvbnZlcnRpbmcpIG1pcnJvcmVkIExWIgorcHJlcGFyZV9sdnNfCitsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXY1IjokQkxPQ0tTCitsdmNvbnZlcnQgLW0rMSAkdmcvJGx2MSAiJGRldjMiCittaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCitub3QgbHZzICR2Zy8kbHYxCityZWNvdmVyX3ZnXyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNdWx0aXBsZSBMVnMKKworI0NPTU0gImZhaWwgYSBtaXJyb3IgaW1hZ2Ugb2Ygb25lIG9mIG1pcnJvcmVkIExWIgorcHJlcGFyZV9sdnNfCitsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW5vc3luYyAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXY1IjokQkxPQ0tTCitsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW5vc3luYyAtbiAkbHYyICR2ZyAiJGRldjMiICIkZGV2NCIgIiRkZXY1IjokQkxPQ0tTMQorbWltYWdlc19hcmVfb25fICRsdjEgIiRkZXYxIiAiJGRldjIiCittaW1hZ2VzX2FyZV9vbl8gJGx2MiAiJGRldjMiICIkZGV2NCIKK21pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCittaXJyb3Jsb2dfaXNfb25fICRsdjIgIiRkZXY1IgorYXV4IGRpc2FibGVfZGV2ICIkZGV2MiIKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworbWltYWdlc19hcmVfb25fICRsdjIgIiRkZXYzIiAiJGRldjQiCittaXJyb3Jsb2dfaXNfb25fICRsdjIgIiRkZXY1IgorbHZfaXNfbGluZWFyXyAkbHYxCitsdl9pc19vbl8gJGx2MSAiJGRldjEiCityZWNvdmVyX3ZnXyAiJGRldjIiCisKKyNDT01NICJmYWlsIG1pcnJvciBpbWFnZXMsIG9uZSBmb3IgZWFjaCBtaXJyb3JlZCBMViIKK3ByZXBhcmVfbHZzXworbHZjcmVhdGUgLWFuIC1abiAtbDIgLS10eXBlIG1pcnJvciAtbTEgLS1ub3N5bmMgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2NSI6JEJMT0NLUworbHZjcmVhdGUgLWFuIC1abiAtbDIgLS10eXBlIG1pcnJvciAtbTEgLS1ub3N5bmMgLW4gJGx2MiAkdmcgIiRkZXYzIiAiJGRldjQiICIkZGV2NSI6JEJMT0NLUzEKK21pbWFnZXNfYXJlX29uXyAkbHYxICIkZGV2MSIgIiRkZXYyIgorbWltYWdlc19hcmVfb25fICRsdjIgIiRkZXYzIiAiJGRldjQiCittaXJyb3Jsb2dfaXNfb25fICRsdjEgIiRkZXY1IgorbWlycm9ybG9nX2lzX29uXyAkbHYyICIkZGV2NSIKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiCithdXggZGlzYWJsZV9kZXYgIiRkZXY0IgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgJHZnCitsdl9pc19saW5lYXJfICRsdjEKK2x2X2lzX29uXyAkbHYxICIkZGV2MSIKK2x2X2lzX2xpbmVhcl8gJGx2MgorbHZfaXNfb25fICRsdjIgIiRkZXYzIgorcmVjb3Zlcl92Z18gIiRkZXYyIiAiJGRldjQiCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG5vIGZhaWx1cmUKKworI0NPTU0gIm5vIGZhaWx1cmVzIgorcHJlcGFyZV9sdnNfCitsdmNyZWF0ZSAtYW4gLVpuIC1sMiAtLXR5cGUgbWlycm9yIC1tMSAtLW5vc3luYyAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXY1IjokQkxPQ0tTCittaW1hZ2VzX2FyZV9vbl8gJGx2MSAiJGRldjEiICIkZGV2MiIKK21pcnJvcmxvZ19pc19vbl8gJGx2MSAiJGRldjUiCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSAkdmcKK21pbWFnZXNfYXJlX29uXyAkbHYxICIkZGV2MSIgIiRkZXYyIgorbWlycm9ybG9nX2lzX29uXyAkbHYxICIkZGV2NSIKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbmFtZS1tYW5nbGluZy5zaCBiL3Rlc3Qvc2hlbGwvbmFtZS1tYW5nbGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkwNjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9uYW1lLW1hbmdsaW5nLnNoCkBAIC0wLDAgKzEsMjYwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUaGlzIHRlc3QgaXMgbm90IHVzaW5nIGFueSBsdm0gY29tbWFuZAorIyBzbyBza2lwIGR1cGxpY2F0ZSBDTE1WRCBhbmQgbHZtZXRhZCB0ZXN0CitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1FVEFEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK0NIQVJBQ1RFUl9XSElURUxJU1Q9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IystLjo9QF8iCitGQUlMX01JWEVEX1NUUj0iY29udGFpbnMgbWl4ZWQgbWFuZ2xlZCBhbmQgdW5tYW5nbGVkIGNoYXJhY3RlcnMiCitGQUlMX01VTFRJX1NUUj0ic2VlbXMgdG8gYmUgbWFuZ2xlZCBtb3JlIHRoYW4gb25jZSIKK0ZBSUxfQkxBQ0tfU1RSPSJzaG91bGQgYmUgbWFuZ2xlZCBidXQgaXQgY29udGFpbnMgYmxhY2tsaXN0ZWQgY2hhcmFjdGVycyIKK0NPUlJFQ1RfRk9STV9TVFI9ImFscmVhZHkgaW4gY29ycmVjdCBmb3JtIgorUkVOQU1JTkdfU1RSPSJyZW5hbWluZyB0byIKKworZnVuY3Rpb24gY3JlYXRlX2RtX2RldigpCit7CisJbG9jYWwgbW9kZT0kMQorCWxvY2FsIG5hbWU9JDI7CisKKwlpZiBbICRtb2RlID0gIm5vbmUiIF07IHRoZW4KKwkJIyB0aGVyZSdzIG5vIG1hbmdsaW5nIGRvbmUgLSB3ZSBtdXN0IHVzZSAtLXZlcmlmeXVkZXYgaGVyZSBpbgorCQkjIGNhc2Ugd2UncmUgdGVzdGluZyB3aXRoIHVkZXYgc28gd2UgaGF2ZSB0aGUgbm9kZXMgaW4gcGxhY2UsCisJCSMgdWRldiB3b3VsZCBub3QgY3JlYXRlIHRoZW0gLSBpdCBjYW4ndCBoYW5kbGUgdW5tYW5nbGVkIG5hbWVzCisJCXZlcmlmeV91ZGV2PSItLXZlcmlmeXVkZXYiCisJZWxzZQorCQl2ZXJpZnlfdWRldj0iIgorCWZpCisKKwlhdXggZG1zZXR1cCBjcmVhdGUgIiR7UFJFRklYfSRuYW1lIiAkdmVyaWZ5X3VkZXYgLS1tYW5nbGVuYW1lICRtb2RlIC0tdGFibGUgIjAgMSB6ZXJvIgorfQorCitmdW5jdGlvbiByZW1vdmVfZG1fZGV2KCkKK3sKKwlsb2NhbCBtb2RlPSQxCisJbG9jYWwgbmFtZT0kMgorCisJaWYgWyAkbW9kZSA9ICJub25lIiBdOyB0aGVuCisJCXZlcmlmeV91ZGV2PSItLXZlcmlmeXVkZXYiCisJZWxzZQorCQl2ZXJpZnlfdWRldj0iIgorCWZpCisKKwlhdXggZG1zZXR1cCByZW1vdmUgJHZlcmlmeV91ZGV2IC0tbWFuZ2xlbmFtZSAkbW9kZSAiJHtQUkVGSVh9JG5hbWUiCit9CisKK2Z1bmN0aW9uIGNoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlKCkKK3sKKwlsb2NhbCBtb2RlPSQxCisJbG9jYWwgaW5wdXRfbmFtZT0kMgorCWxvY2FsIGRtX25hbWU9JDMKKwlsb2NhbCByPTAKKworCWlmIFsgJG1vZGUgPSAibm9uZSIgXTsgdGhlbgorCQl2ZXJpZnlfdWRldj0iLS12ZXJpZnl1ZGV2IgorCWVsc2UKKwkJdmVyaWZ5X3VkZXY9IiIKKwlmaQorCisJYXV4IGRtc2V0dXAgY3JlYXRlICIke1BSRUZJWH0kaW5wdXRfbmFtZSIgJHZlcmlmeV91ZGV2IC0tbWFuZ2xlbmFtZSAkbW9kZSAtLXRhYmxlICIwIDEgemVybyIgMj5lcnIgJiYgXAorCXRlc3QgLWIgIiRETV9ERVZfRElSL21hcHBlci8ke1BSRUZJWH0kZG1fbmFtZSIgJiYgXAorCWF1eCBkbXNldHVwIHJlbW92ZSAiJHtQUkVGSVh9JGlucHV0X25hbWUiICR2ZXJpZnlfdWRldiAtLW1hbmdsZW5hbWUgJG1vZGUgfHwgcj0xCisKKwlpZiBbICIkZG1fbmFtZSIgPSAiRkFJTF9NSVhFRCIgXTsgdGhlbgorCQlyPTAKKwkJZ3JlcCAiJEZBSUxFRF9NSVhFRF9TVFIiIGVyciB8fCByPTEKKwllbGlmIFsgIiRkbV9uYW1lIiA9ICJGQUlMX01VTFRJIiBdOyB0aGVuCisJCXI9MAorCQlncmVwICIkRkFJTEVEX01VTFRJX1NUUiIgZXJyIHx8IHI9MQorCWVsaWYgWyAiJGRtX25hbWUiID0gIkZBSUxfQkxBQ0siIF07IHRoZW4KKwkJcj0wCisJCWdyZXAgIiRGQUlMRURfQkxBQ0tfU1RSIiBlcnIgfHwgcj0xCisJZmkKKworCXJldHVybiAkcgorfQorCitmdW5jdGlvbiBjaGVja19kbV9maWVsZCgpCit7CisJbG9jYWwgbW9kZT0kMQorCWxvY2FsIGRtX25hbWU9JDIKKwlsb2NhbCBmaWVsZD0kMworCWxvY2FsIGV4cGVjdGVkPSQ0CisKKwl2YWx1ZT0kKGRtc2V0dXAgaW5mbyAtLXJvd3MgLS1ub2hlYWRpbmdzIC0tbWFuZ2xlbmFtZSAkbW9kZSAtYyAtbyAkZmllbGQgIiR7RE1fREVWX0RJUn0vbWFwcGVyLyR7UFJFRklYfSRkbV9uYW1lIiAyPiBlcnIgfHwgdHJ1ZSkKKworCWlmIFsgIiRleHBlY3RlZCIgPSAiRkFJTF9NSVhFRCIgXTsgdGhlbgorCQlncmVwICIkRkFJTF9NSVhFRF9TVFIiIGVycgorCWVsaWYgWyAiJGV4cGVjdGVkIiA9ICJGQUlMX01VTFRJIiBdOyB0aGVuCisJCWdyZXAgIiRGQUlMX01VTFRJX1NUUiIgZXJyCisJZWxpZiBbICIkZXhwZWN0ZWQiID0gIkZBSUxfQkxBQ0siIF07IHRoZW4KKwkJZ3JlcCAiJEZBSUxfQkxBQ0tfU1RSIiBlcnIKKwllbHNlCisJCXRlc3QgIiR2YWx1ZSIgPSAiJHtQUkVGSVh9JGV4cGVjdGVkIgorCWZpCit9CisKK2Z1bmN0aW9uIGNoZWNrX2V4cGVjdGVkX25hbWVzKCkKK3sKKwlsb2NhbCBtb2RlPSQxCisJbG9jYWwgZG1fbmFtZT0kMgorCWxvY2FsIHI9MAorCisJY3JlYXRlX2RtX2RldiBub25lICIkZG1fbmFtZSIKKworCXRlc3QgLWIgIiRETV9ERVZfRElSL21hcHBlci8ke1BSRUZJWH0kZG1fbmFtZSIgJiYgXAorCWNoZWNrX2RtX2ZpZWxkIG5vbmUgIiRkbV9uYW1lIiBuYW1lICIkZG1fbmFtZSIgJiYgXAorCWNoZWNrX2RtX2ZpZWxkICRtb2RlICIkZG1fbmFtZSIgbmFtZSAiJDMiICYmIFwKKwljaGVja19kbV9maWVsZCAkbW9kZSAiJGRtX25hbWUiIG1hbmdsZWRfbmFtZSAiJDQiICYmIFwKKwljaGVja19kbV9maWVsZCAkbW9kZSAiJGRtX25hbWUiIHVubWFuZ2xlZF9uYW1lICIkNSIgfHwgcj0xCisKKwlyZW1vdmVfZG1fZGV2IG5vbmUgIiRkbV9uYW1lIgorCisJcmV0dXJuICRyCit9CisKK2Z1bmN0aW9uIGNoZWNrX21hbmdsZV9jbWQoKQoreworCWxvY2FsIG1vZGU9JDEKKwlsb2NhbCBkbV9uYW1lPSQyCisJbG9jYWwgZXhwZWN0ZWQ9JDMKKwlsb2NhbCByZW5hbWVfZXhwZWN0ZWQ9MAorCWxvY2FsIHI9MAorCisJY3JlYXRlX2RtX2RldiBub25lICIkZG1fbmFtZSIKKworCWRtc2V0dXAgbWFuZ2xlIC0tbWFuZ2xlbmFtZSAkbW9kZSAtLXZlcmlmeXVkZXYgIiR7UFJFRklYfSRkbV9uYW1lIiAxPm91dCAyPmVyciB8fCB0cnVlOworCisJaWYgWyAiJGV4cGVjdGVkIiA9ICJPSyIgXTsgdGhlbgorCQlncmVwICIkQ09SUkVDVF9GT1JNX1NUUiIgb3V0IHx8IHI9MQorCWVsaWYgWyAiJGV4cGVjdGVkIiA9ICJGQUlMX01JWEVEIiBdOyB0aGVuCisJCWdyZXAgIiRGQUlMX01JWEVEX1NUUiIgZXJyIHx8IHI9MQorCWVsaWYgWyAiJGV4cGVjdGVkIiA9ICJGQUlMX01VTFRJIiBdOyB0aGVuCisJCWdyZXAgIiRGQUlMX01VTFRJX1NUUiIgZXJyIHx8IHI9MQorCWVsc2UKKwkJcmVuYW1lX2V4cGVjdGVkPTEKKwkJaWYgZ3JlcCAtRiAiJFJFTkFNSU5HX1NUUiAke1BSRUZJWH0kZXhwZWN0ZWQiIG91dDsgdGhlbgorCQkJIyBDaGVjayB0aGUgb2xkIG5vZGUgaXMgcmVhbGx5IHJlbmFtZWQuCisJCQl0ZXN0IC1iICIkRE1fREVWX0RJUi9tYXBwZXIvJHtQUkVGSVh9JGRtX25hbWUiICYmIHI9MQorCQkJIyBGSVhNRTogd2hlbiByZW5hbWluZyB0byBtb2RlPW5vbmUgd2l0aCB1ZGV2LCB1ZGV2IHdpbGwKKwkJCSMgICAgICAgIHJlbW92ZSB0aGUgb2xkX25vZGUsIGJ1dCBmYWlscyB0byBwcm9wZXJseSByZW5hbWUKKwkJCSMgICAgICAgIHRvIG5ld19ub2RlLiBUaGUgbGliZGV2bWFwcGVyIGNvZGUgdHJpZXMgdG8gY2FsbAorCQkJIyAgICAgICAgcmVuYW1lKG9sZF9ub2RlLG5ld19ub2RlKSwgYnV0IHRoYXQgd29uJ3QgZG8gYW55dGhpbmcKKwkJCSMgICAgICAgIHNpbmNlIHRoZSBvbGQgbm9kZSBpcyBhbHJlYWR5IHJlbW92ZWQgYnkgdWRldi4KKwkJCSMgICAgICAgIEZvciBleGFtcGxlIHJlbmFtaW5nICdhXHgyMGInIHRvICdhIGInOgorCQkJIyAgICAgICAgICAtIHVkZXYgcmVtb3ZlcyAnYVx4MjBiJworCQkJIyAgICAgICAgICAtIHVkZXYgY3JlYXRlcyAnYScgYW5kICdiJyAoc2luY2UgaXQgY29uc2lkZXJzIHRoZSAnICcgYXMgYSBkZWxpbWl0ZXIpCisJCQkjICAgICAgICAgIC0gbGliZGV2bWFwcGVyIGNoZWNrcyB1ZGV2IGhhcyBkb25lIHRoZSByZW5hbWUgcHJvcGVybHkKKwkJCSMgICAgICAgICAgLSBsaWJkZXZtYXBwZXIgY2FsbHMgc3RhdChuZXdfbm9kZSkgYW5kIGl0IGRvZXMgbm90IHNlZSBpdAorCQkJIyAgICAgICAgICAtIGxpYmRldm1hcHBlciBjYWxscyByZW5hbWUob2xkX25vZGUsbmV3X25vZGUpCisJCQkjICAgICAgICAgIC0gdGhlIHJlbmFtZSBpcyBhIE5PUCBzaW5jZSB0aGUgb2xkX25vZGUgZG9lcyBub3QgZXhpc3QgYW55bW9yZQorCQkJIworCQkJIyBSZW1vdmUgdGhpcyBjb25kaXRpb24gb25jZSB0aGUgcHJvYmxlbSBpcyBmaXhlZCBpbiBsaWJkZXZtYXBwZXIuCisJCQkjCisJCQlpZiBbICIkbW9kZSIgIT0gIm5vbmUiIF07IHRoZW4KKwkJCQl0ZXN0IC1iICIkRE1fREVWX0RJUi9tYXBwZXIvJHtQUkVGSVh9JGV4cGVjdGVkIiB8fCByPTEKKwkJCWZpCisJCWVsc2UKKwkJCXI9MQorCQlmaQorCWZpCisKKwlpZiBbICRyID0gMCAtYSAkcmVuYW1lX2V4cGVjdGVkID0gMSBdOyB0aGVuCisJCSMgc3VjY2Vzc2Z1bHkgcmVuYW1lZCB0byBleHBlY3RlZCBuYW1lCisJCXJlbW92ZV9kbV9kZXYgbm9uZSAiJGV4cGVjdGVkIgorCWVsaWYgWyAkciA9IDEgXTsgdGhlbgorCQkjIGZhaWxlZCB0byByZW5hbWUgdG8gZXhwZWN0ZWQgb3IgcmVuYW1lZCB3aGVuIGl0IHNob3VsZCBub3QgLSBmaW5kIHRoZSBuZXcgbmFtZQorCQluZXdfbmFtZT0kKHNlZCAtZSAicy8uKjogJFJFTkFNSU5HX1NUUiAvL2ciIG91dCkKKwkJIyB0cnkgdG8gcmVtb3ZlIGFueSBvZiB0aGUgZm9ybSAtIGZhbGxpbmcgYmFjayB0byBsZXNzIHByb2JhYmxlIGVycm9yIHNjZW5hcmlvCisJCXJlbW92ZV9kbV9kZXYgbm9uZSAiJG5ld19uYW1lIiB8fCBcCisJCXJlbW92ZV9kbV9kZXYgbm9uZSAiJGRtX25hbWUiIHx8IHJlbW92ZV9kbV9kZXYgbm9uZSAiJGV4cGVjdGVkIgorCWVsc2UKKwkJIyBzdWNjZXNzZnVseSBkb25lIG5vdGhpbmcKKwkJcmVtb3ZlX2RtX2RldiBub25lICIkZG1fbmFtZSIKKwlmaQorCisJcmV0dXJuICRyCit9CisKKyMgY2hlY2sgZG1zZXR1cCBjYW4gcHJvY2VzcyBwYXRoIHdoZXJlIHRoZSBsYXN0IGNvbXBvbmVudCBpcyBub3QgZXF1YWwgZG0gbmFtZSAocmhieiAjNzk3MzIyKQorcj0wCitjcmVhdGVfZG1fZGV2IGF1dG8gImFiYyIKK2xuIC1zICIkRE1fREVWX0RJUi9tYXBwZXIvJHtQUkVGSVh9YWJjIiAiJERNX0RFVl9ESVIvJHtQUkVGSVh9eHl6IgorYXV4IGRtc2V0dXAgc3RhdHVzICIkRE1fREVWX0RJUi8ke1BSRUZJWH14eXoiIHx8IHI9MQorcm0gLWYgIiRETV9ERVZfRElSLyR7UFJFRklYfXh5eiIKK3JlbW92ZV9kbV9kZXYgYXV0byAiYWJjIgoraWYgWyByID0gMSBdOyB0aGVuCisJZXhpdCAxCitmaQorCisjIyMgQUxMIFdISVRFTElTVEVEIENIQVJBQ1RFUlMgIyMjCisjIG5vbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIG1hbmdsZWQgaW4gYW55IG1vZGUKK25hbWU9IiRDSEFSQUNURVJfV0hJVEVMSVNUIgorZm9yIG1vZGUgaW4gYXV0byBoZXggbm9uZTsgZG8KKwljaGVja19leHBlY3RlZF9uYW1lcyAkbW9kZSAiJG5hbWUiICIkbmFtZSIgIiRuYW1lIiAiJG5hbWUiCisJY2hlY2tfbWFuZ2xlX2NtZCAkbW9kZSAiJG5hbWUiICJPSyIKK2RvbmUKKworCisjIyMjIE5PTkUgTUFOR0xJTkcgTU9ERSAjIyMKK2NoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlIG5vbmUgJ2EgYicgJ2EgYicKK2NoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlIG5vbmUgJ2FceDIwYicgJ2FceDIwYicKK2NoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlIG5vbmUgJ2EgYlx4MjBjJyAnYSBiXHgyMGMnCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBub25lICdhXHg1Y3gyMGInICdhXHg1Y3gyMGInCisKK2NoZWNrX2V4cGVjdGVkX25hbWVzIG5vbmUgJ2EgYicgJ2EgYicgJ2FceDIwYicgJ2EgYicKK2NoZWNrX2V4cGVjdGVkX25hbWVzIG5vbmUgJ2FceDIwYicgJ2FceDIwYicgJ2FceDIwYicgJ2EgYicKK2NoZWNrX2V4cGVjdGVkX25hbWVzIG5vbmUgJ2EgYlx4MjBjJyAnYSBiXHgyMGMnICdGQUlMX01JWEVEJyAnYSBiIGMnCitjaGVja19leHBlY3RlZF9uYW1lcyBub25lICdhXHg1Y3gyMGInICdhXHg1Y3gyMGInICdhXHg1Y3gyMGInICdhXHgyMGInCisKK2NoZWNrX21hbmdsZV9jbWQgbm9uZSAnYSBiJyAnT0snCitjaGVja19tYW5nbGVfY21kIG5vbmUgJ2FceDIwYicgJ2EgYicKK2NoZWNrX21hbmdsZV9jbWQgbm9uZSAnYSBiXHgyMGMnICdhIGIgYycKK2NoZWNrX21hbmdsZV9jbWQgbm9uZSAnYVx4NWN4MjBiJyAnYVx4MjBiJworCisKKyMjIyBBVVRPIE1BTkdMSU5HIE1PREUgIyMjCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBhdXRvICdhIGInICdhXHgyMGInCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBhdXRvICdhXHgyMGInICdhXHgyMGInCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBhdXRvICdhIGJceDIwYycgJ0ZBSUxfTUlYRUQnCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBhdXRvICdhXHg1Y3gyMGInICdGQUlMX01VTFRJJworCitjaGVja19leHBlY3RlZF9uYW1lcyBhdXRvICdhIGInICdGQUlMX0JMQUNLJyAnRkFJTF9CTEFDSycgJ0ZBSUxfQkxBQ0snCitjaGVja19leHBlY3RlZF9uYW1lcyBhdXRvICdhXHgyMGInICdhIGInICdhXHgyMGInICdhIGInCitjaGVja19leHBlY3RlZF9uYW1lcyBhdXRvICdhIGJceDIwYycgJ0ZBSUxfQkxBQ0snICdGQUlMX0JMQUNLJyAnRkFJTF9CTEFDSycKK2NoZWNrX2V4cGVjdGVkX25hbWVzIGF1dG8gJ2FceDVjeDIwYicgJ0ZBSUxfTVVMVEknICdGQUlMX01VTFRJJyAnRkFJTF9NVUxUSScKKworY2hlY2tfbWFuZ2xlX2NtZCBhdXRvICdhIGInICdhXHgyMGInCitjaGVja19tYW5nbGVfY21kIGF1dG8gJ2FceDIwYicgJ09LJworY2hlY2tfbWFuZ2xlX2NtZCBhdXRvICdhIGJceDIwYycgJ0ZBSUxfTUlYRUQnCitjaGVja19tYW5nbGVfY21kIGF1dG8gJ2FceDVjeDIwYicgJ0ZBSUxfTVVMVEknCisKKworIyMjIEhFWCBNQU5HTElORyBNT0RFICMjIworY2hlY2tfY3JlYXRlX2FuZF9yZW1vdmUgaGV4ICdhIGInICdhXHgyMGInCitjaGVja19jcmVhdGVfYW5kX3JlbW92ZSBoZXggJ2FceDIwYicgJ2FceDVjeDIwYicKK2NoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlIGhleCAnYSBiXHgyMGMnICdhXHgyMGJceDVjeDIwYycKK2NoZWNrX2NyZWF0ZV9hbmRfcmVtb3ZlIGhleCAnYVx4NWN4MjBiJyAnYVx4NWN4NWN4MjBiJworCitjaGVja19leHBlY3RlZF9uYW1lcyBoZXggJ2EgYicgJ0ZBSUxfQkxBQ0snICdGQUlMX0JMQUNLJyAnRkFJTF9CTEFDSycKK2NoZWNrX2V4cGVjdGVkX25hbWVzIGhleCAnYVx4MjBiJyAnYSBiJyAnYVx4MjBiJyAnYSBiJworY2hlY2tfZXhwZWN0ZWRfbmFtZXMgaGV4ICdhIGJceDIwYycgJ0ZBSUxfQkxBQ0snICdGQUlMX0JMQUNLJyAnRkFJTF9CTEFDSycKK2NoZWNrX2V4cGVjdGVkX25hbWVzIGhleCAnYVx4NWN4MjBiJyAnYVx4MjBiJyAnYVx4NWN4MjBiJyAnYVx4MjBiJworCitjaGVja19tYW5nbGVfY21kIGhleCAnYSBiJyAnYVx4MjBiJworY2hlY2tfbWFuZ2xlX2NtZCBoZXggJ2FceDIwYicgJ09LJworY2hlY2tfbWFuZ2xlX2NtZCBoZXggJ2EgYlx4MjBjJyAnRkFJTF9NSVhFRCcKK2NoZWNrX21hbmdsZV9jbWQgaGV4ICdhXHg1Y3gyMGInICdPSycKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvbm9tZGEtbWlzc2luZy5zaCBiL3Rlc3Qvc2hlbGwvbm9tZGEtbWlzc2luZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWMzOTRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9ub21kYS1taXNzaW5nLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDQKK3B2Y3JlYXRlICIkZGV2MSIgIiRkZXYyIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIgIiRkZXY0IgordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKworbHZjcmVhdGUgLWwxIC1uIGxpbmVhcjEgJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1sMSAtbiBsaW5lYXIyICR2ZyAiJGRldjIiCitsdmNyZWF0ZSAtbDIgLW4gbGluZWFyMTIgJHZnICIkZGV2MSI6NCAiJGRldjIiOjQKKworbHZjcmVhdGUgLWFleSAtbDEgLW4gb3JpZ2luMSAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLXMgJHZnL29yaWdpbjEgLWwxIC1uIHNfbmFwc2hvdDIgIiRkZXYyIgorCitsdmNyZWF0ZSAtYWV5IC1sMSAtLXR5cGUgbWlycm9yIC1tMSAtbiBtaXJyb3IxMiAtLW1pcnJvcmxvZyBjb3JlICR2ZyAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1hZXkgLWwxIC0tdHlwZSBtaXJyb3IgLW0xIC1uIG1pcnJvcjEyMyAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwordmdjaGFuZ2UgLWEgbiAkdmcKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitub3QgdmdjaGFuZ2UgLWFleSAkdmcKK25vdCB2Z2NrICR2ZworCitjaGVjayBpbmFjdGl2ZSAkdmcgbGluZWFyMQorY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIyCitjaGVjayBpbmFjdGl2ZSAkdmcgb3JpZ2luMQorY2hlY2sgaW5hY3RpdmUgJHZnIHNfbmFwc2hvdDIKK2NoZWNrIGluYWN0aXZlICR2ZyBsaW5lYXIxMgorY2hlY2sgaW5hY3RpdmUgJHZnIG1pcnJvcjEyCitjaGVjayBpbmFjdGl2ZSAkdmcgbWlycm9yMTIzCisKK3ZnY2hhbmdlIC1hIG4gJHZnCithdXggZW5hYmxlX2RldiAiJGRldjEiCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorbm90IHZnY2hhbmdlIC1hZXkgJHZnCitub3QgdmdjayAkdmcKKworY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIxCitjaGVjayBpbmFjdGl2ZSAkdmcgbGluZWFyMgorY2hlY2sgaW5hY3RpdmUgJHZnIGxpbmVhcjEyCitjaGVjayBpbmFjdGl2ZSAkdmcgb3JpZ2luMQorY2hlY2sgaW5hY3RpdmUgJHZnIHNfbmFwc2hvdDIKK2NoZWNrIGluYWN0aXZlICR2ZyBtaXJyb3IxMgorY2hlY2sgaW5hY3RpdmUgJHZnIG1pcnJvcjEyMworCit2Z2NoYW5nZSAtYSBuICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorYXV4IGRpc2FibGVfZGV2ICIkZGV2MyIKK25vdCB2Z2NoYW5nZSAtYWV5ICR2Zworbm90IHZnY2sgJHZnCisKK2NoZWNrIGFjdGl2ZSAkdmcgb3JpZ2luMQorY2hlY2sgYWN0aXZlICR2ZyBzX25hcHNob3QyCitjaGVjayBhY3RpdmUgJHZnIGxpbmVhcjEKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMgorY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIxMgorY2hlY2sgaW5hY3RpdmUgJHZnIG1pcnJvcjEyMworY2hlY2sgYWN0aXZlICR2ZyBtaXJyb3IxMgorCit2Z2NoYW5nZSAtYSBuICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYzIgorYXV4IGRpc2FibGVfZGV2ICIkZGV2NCIKK3ZnY2hhbmdlIC1hZXkgJHZnCitub3QgdmdjayAkdmcKKworY2hlY2sgYWN0aXZlICR2ZyBvcmlnaW4xCitjaGVjayBhY3RpdmUgJHZnIHNfbmFwc2hvdDIKK2NoZWNrIGFjdGl2ZSAkdmcgbGluZWFyMQorY2hlY2sgYWN0aXZlICR2ZyBsaW5lYXIyCitjaGVjayBhY3RpdmUgJHZnIGxpbmVhcjEyCitjaGVjayBhY3RpdmUgJHZnIG1pcnJvcjEyCitjaGVjayBhY3RpdmUgJHZnIG1pcnJvcjEyMwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9ub21kYS1yZXN0b3JlbWlzc2luZy5zaCBiL3Rlc3Qvc2hlbGwvbm9tZGEtcmVzdG9yZW1pc3Npbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkMWRhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvbm9tZGEtcmVzdG9yZW1pc3Npbmcuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAzCisKK3B2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgeSAiJGRldjEiCisKK2x2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC1sIDEgLW4gbWlycm9yICR2ZworbHZjaGFuZ2UgLWEgbiAkdmcvbWlycm9yCitsdmNyZWF0ZSAtbCAxIC1uIGx2MSAkdmcgIiRkZXYxIgorCisjIHRyeSB0byBqdXN0IGNoYW5nZSBtZXRhZGF0YTsgd2UgZXhwZWN0IHRoZSBuZXcgdmVyc2lvbiAod2l0aCBNSVNTSU5HX1BWIHNldAorIyBvbiB0aGUgcmVhcHBlYXJlZCB2b2x1bWUpIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBwcmV2aW91c2x5IG1pc3NpbmcgUFYKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitsdnJlbW92ZSAkdmcvbWlycm9yCitub3QgdmdjayAkdmcgMj4mMSB8IHRlZSBsb2cKK2dyZXAgIm1pc3NpbmcgMSBwaHlzaWNhbCB2b2x1bWUiIGxvZworbm90IGx2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC1sIDEgLW4gbWlycm9yICR2ZyAjIHdyaXRlIG9wZXJhdGlvbnMgZmFpbAorYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorbHZjcmVhdGUgLWFleSAtLXR5cGUgbWlycm9yIC1tIDEgLWwgMSAtbiBtaXJyb3IgJHZnICMgbm8gTURBID0+IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQKK3ZnY2sgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL29ycGhhbi1vbmRpc2suc2ggYi90ZXN0L3NoZWxsL29ycGhhbi1vbmRpc2suc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NmNkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvb3JwaGFuLW9uZGlzay5zaApAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDIKK3ZncmVkdWNlICR2ZyAiJGRldjEiIDI+JjEgfCBub3QgZ3JlcCAtaSAncGFyc2UgZXJyb3InCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Bvb2wtbGFiZWxzLnNoIGIvdGVzdC9zaGVsbC9wb29sLWxhYmVscy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY1ZmVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wb29sLWxhYmVscy5zaApAQCAtMCwwICsxLDQ3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBsdm1ldGFkIGRvZXMgbm90IGhhbmRsZSBwb29sIGxhYmVscyBzbyBza2lwIHRlc3QuCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTUVUQUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworZW52IHByaW50ZiAiIiB8fCBza2lwICMgc2tpcCBpZiBwcmludGYgaXMgbm90IGF2YWlsYWJsZQorCisjIGNyZWF0ZSB0aGUgb2xkIEdGUyBwb29sIGxhYmVsZWQgbGluZWFyIGRldmljZXMKK2NyZWF0ZV9wb29sX2xhYmVsXygpCit7CisgICMgRklYTUUKKyAgIyBlY2hvIC1lIGlzIGJhc2hpc20sIGRhc2ggYnVpbHRpbiBzaCBkb2Vzbid0IGRvIFx4Tk4gaW4gcHJpbnRmIGVpdGhlcgorICAjIHByaW50ZiBjb21lcyBmcm9tIGNvcmV1dGlscywgYW5kIGlzIHByb2JhYmx5IG5vdCBwb3NpeCBlaXRoZXIKKyAgZW52IHByaW50ZiAiXHgwMVx4MTZceDcwXHgwNlx4NWZceGNmXHhmZlx4YjlceGY4XHgyNFx4OGFwb29sMSIgfCBkZCBvZj0iJDIiIGJzPTUgc2Vlaz0xIGNvbnY9bm90cnVuYworICBlbnYgcHJpbnRmICJceDA0XHgwMVx4MDNceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAkMVx4NjhceDAxXHgxNlx4NzBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDZceDVmXHhkMCIgfCBkZCBvZj0kMiBicz0yNzMgc2Vlaz0xIGNvbnY9bm90cnVuYworICBhdXggbm90aWZ5X2x2bWV0YWQgIiQyIgorfQorCisKK2F1eCBwcmVwYXJlX2RldnMgMgorCitjcmVhdGVfcG9vbF9sYWJlbF8gMCAiJGRldjEiCitjcmVhdGVfcG9vbF9sYWJlbF8gMSAiJGRldjIiCisKKyMgY2hlY2sgdGhhdCBwdmNyZWF0ZSBmYWlscyB3aXRob3V0IC1mZiBvbiB0aGUgcG9vbCBkZXZpY2UKK25vdCBwdmNyZWF0ZSAiJGRldjEiCisKKyMgY2hlY2sgdGhhdCB2Z2Rpc3BsYXkgYW5kIHB2Y3JlYXRlIC1mZiB3b3JrcyB3aXRoIHRoZSBwb29sIGRldmljZQordmdkaXNwbGF5IC0tY29uZmlnICdnbG9iYWwgeyBsb2NraW5nX3R5cGUgPSAwIH0nCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorIyBGSVhNRSEgc2luY2UgcG9vbDEgY2Fubm90IGJlIG9wZW5lZCwgdmdkaXNwbGF5IGdpdmVzIGVycm9yLi4uIHNob3VsZCB3ZSBzYXkKKyMgIm5vdCIgdGhlcmUgaW5zdGVhZCwgY2hlY2tpbmcgdGhhdCBpdCBpbmRlZWQgZG9lcyBmYWlsPwordmdkaXNwbGF5IC0tY29uZmlnICdnbG9iYWwgeyBsb2NraW5nX3R5cGUgPSAwIH0nIHx8IHRydWUKK3B2Y3JlYXRlIC1mZiAteSAiJGRldjEiCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1kdXBsaWNhdGUtcHZzLnNoIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtZHVwbGljYXRlLXB2cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI5OGRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtZHVwbGljYXRlLXB2cy5zaApAQCAtMCwwICsxLDUwNSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZHVwbGljYXRlIFBWcycKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDYgMTYKKworIyBUaGUgTFYtdXNpbmctUFYgdGVzdHMgKERFVl9VU0VEX0ZPUl9MViwgd2hlcmUgYSBQViBpcworIyBwcmVmZXJyZWQgaWYgYW4gYWN0aXZlIExWIGlzIHVzaW5nIGl0KSBkZXBlbmQgb24gc3lzZnMKKyMgaW5mbyB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gUkhFTDUga2VybmVscy4KK2F1eCBkcml2ZXJfYXRfbGVhc3QgNCAxNSB8fCBza2lwCisKK2F1eCBsdm1jb25mICdkZXZpY2VzL2FsbG93X2NoYW5nZXNfd2l0aF9kdXBsaWNhdGVfcHZzID0gMCcKKworcHZjcmVhdGUgIiRkZXYxIgorcHZjcmVhdGUgIiRkZXYyIgordmdjcmVhdGUgJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkdmcyICIkZGV2MiIKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDhtICIkZGV2MiIKK2x2Y3JlYXRlIC1hbiAtbDEgLW4gJGx2MSAkdmcxCisKKyMgQm90aCBkZXZzIGFyZSBzaG93biBhbmQgdXNlZCBieSB0aGUgVkcKKworcHZzIDI+JjEgfCB0ZWUgb3V0CisKK2dyZXAgIiRkZXYxIiBvdXQKK2dyZXAgIiRkZXYyIiBvdXQKK2dyZXAgIiRkZXYxIiBvdXQgfCBncmVwICR2ZzEKK2dyZXAgIiRkZXYyIiBvdXQgfCBncmVwICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfYWxsb2NhdGFibGUgImFsbG9jYXRhYmxlIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9hbGxvY2F0YWJsZSAiYWxsb2NhdGFibGUiCitub3QgZ3JlcCBXQVJOSU5HIG91dAorCitVVUlEMT0kKHB2cyAtLW5vaGVhZGluZ3MgLW8gdXVpZCAkZGV2MSB8IHhhcmdzKQorVVVJRDI9JChwdnMgLS1ub2hlYWRpbmdzIC1vIHV1aWQgJGRldjIgfCB4YXJncykKKworU0laRTE9JChwdnMgLS1ub2hlYWRpbmdzIC1vIGRldl9zaXplICRkZXYxKQorU0laRTI9JChwdnMgLS1ub2hlYWRpbmdzIC1vIGRldl9zaXplICRkZXYyKQorCitNSU5PUjE9JChwdnMgLS1ub2hlYWRpbmdzIC1vIG1pbm9yICRkZXYxKQorTUlOT1IyPSQocHZzIC0tbm9oZWFkaW5ncyAtbyBtaW5vciAkZGV2MikKKworY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBkZXZfc2l6ZSAkU0laRTEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgZGV2X3NpemUgJFNJWkUyCisKKyMgQ29weSBkZXYxIG92ZXIgZGV2Mi4KK2RkIGlmPSIkZGV2MSIgb2Y9IiRkZXYyIiBicz0xTSBpZmxhZz1kaXJlY3Qgb2ZsYWc9ZGlyZWN0LHN5bmMKK3B2c2NhbiAtLWNhY2hlCisKKyMgVGhlIHNpbmdsZSBwcmVmZXJyZWQgZGV2IGlzIHNob3duIGZyb20gJ3B2cycuCitwdnMgLW8rdXVpZCxkdXBsaWNhdGUgMj4mMSB8IHRlZSBvdXQKKworcm0gd2FybiBtYWluIHx8IHRydWUKK2dyZXAgICAgV0FSTklORyBvdXQgPiB3YXJuIHx8IHRydWUKK2dyZXAgLXYgV0FSTklORyBvdXQgPiBtYWluIHx8IHRydWUKKworIyBEb24ndCBrbm93IHlldCBpZiBkZXYxIG9yIGRldjIgaXMgcHJlZmVycmVkLCBzbyBjb3VudCBqdXN0IG9uZSBpcy4KK3Rlc3QgJChncmVwICR2ZzEgbWFpbiB8IHdjIC1sKSAtZXEgMQordGVzdCAkKGdyZXAgJFVVSUQxIG1haW4gfCB3YyAtbCkgLWVxIDEKK25vdCBncmVwIGR1cGxpY2F0ZSBtYWluCitub3QgZ3JlcCAkdmcyIG1haW4KK25vdCBncmVwICRVVUlEMiBtYWluCisKK2dyZXAgIndhcyBhbHJlYWR5IGZvdW5kIG9uIiB3YXJuCitncmVwICJwcmVmZXJzIGRldmljZSIgd2FybgorCisjIEZpbmQgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBkZXYgYW5kIHdoaWNoIGlzIHRoZSBkdXBsaWNhdGUuCitQVj0kKHB2cyAtLW5vaGVhZGluZ3MgLW8gbmFtZSAtUyB1dWlkPSRVVUlEMSkKK2lmIFsgJFBWID09ICIkZGV2MSIgXTsgdGhlbgorCURVUD0kZGV2MgorZWxzZQorCURVUD0kZGV2MQorZmkKKworZWNobyBQViBpcyAkUFYKK2VjaG8gRFVQIGlzICREVVAKKworZ3JlcCAkUFYgbWFpbgorbm90IGdyZXAgJERVUCBtYWluCisKKyMgUmVwZWF0IGFib3ZlIGNoZWNraW5nIHByZWZlcnJlZC9kdXAgaW4gb3V0cHV0CitwdnMgMj4mMSB8IHRlZSBvdXQKKworcm0gd2FybiBtYWluIHx8IHRydWUKK2dyZXAgICAgV0FSTklORyBvdXQgPiB3YXJuIHx8IHRydWUKK2dyZXAgLXYgV0FSTklORyBvdXQgPiBtYWluIHx8IHRydWUKKworZ3JlcCAkUFYgbWFpbgorbm90IGdyZXAgJERVUCBtYWluCisKKyMgVGhlIGR1cGxpY2F0ZSBkZXYgaXMgaW5jbHVkZWQgaW4gJ3B2cyAtYScKK3B2cyAtYSAtbyt1dWlkLGR1cGxpY2F0ZSAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICIkZGV2MSIgbWFpbgorZ3JlcCAiJGRldjIiIG1haW4KK2dyZXAgJFBWIG1haW4KK2dyZXAgJERVUCBtYWluCit0ZXN0ICQoZ3JlcCBkdXBsaWNhdGUgbWFpbiB8IHdjIC1sKSAtZXEgMQorZ3JlcCAkRFVQIG1haW4gfCBncmVwIGR1cGxpY2F0ZQorbm90IGdyZXAgJHZnMiBtYWluCitub3QgZ3JlcCAkVVVJRDIgbWFpbgorZ3JlcCAiJGRldjEiIG1haW4gfCBncmVwICR2ZzEKK2dyZXAgIiRkZXYyIiBtYWluIHwgZ3JlcCAkdmcxCitncmVwICIkZGV2MSIgbWFpbiB8IGdyZXAgJFVVSUQxCitncmVwICIkZGV2MiIgbWFpbiB8IGdyZXAgJFVVSUQxCisKK2dyZXAgIndhcyBhbHJlYWR5IGZvdW5kIG9uIiB3YXJuCitncmVwICJwcmVmZXJzIGRldmljZSIgd2FybgorCisjCisjIFBhc3NpbmcgYSBkZXYgbmFtZSBhcmcgYWx3YXlzIGluY2x1ZGVzIHRoYXQgZGV2LgorIworCitwdnMgLW8rdXVpZCAiJGRldjEiIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK2dyZXAgIiRkZXYxIiBtYWluCitub3QgZ3JlcCAiJGRldjIiIG1haW4KK2dyZXAgJFVVSUQxIG1haW4KK2dyZXAgJHZnMSBtYWluCitncmVwICJ3YXMgYWxyZWFkeSBmb3VuZCBvbiIgd2FybgorZ3JlcCAicHJlZmVycyBkZXZpY2UiIHdhcm4KKworcHZzIC1vK3V1aWQgIiRkZXYyIiAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICIkZGV2MiIgbWFpbgorbm90IGdyZXAgIiRkZXYxIiBtYWluCitncmVwICRVVUlEMSBtYWluCitncmVwICR2ZzEgbWFpbgorZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK2dyZXAgInByZWZlcnMgZGV2aWNlIiB3YXJuCisKK3B2cyAtbyt1dWlkLGR1cGxpY2F0ZSAiJGRldjEiICIkZGV2MiIgMj4mMSB8IHRlZSBvdXQKKworcm0gd2FybiBtYWluIHx8IHRydWUKK2dyZXAgICAgV0FSTklORyBvdXQgPiB3YXJuIHx8IHRydWUKK2dyZXAgLXYgV0FSTklORyBvdXQgPiBtYWluIHx8IHRydWUKKworZ3JlcCAiJGRldjEiIG1haW4KK2dyZXAgIiRkZXYyIiBtYWluCitncmVwICIkZGV2MSIgbWFpbiB8IGdyZXAgJHZnMQorZ3JlcCAiJGRldjIiIG1haW4gfCBncmVwICR2ZzEKK2dyZXAgIiRkZXYxIiBtYWluIHwgZ3JlcCAkVVVJRDEKK2dyZXAgIiRkZXYyIiBtYWluIHwgZ3JlcCAkVVVJRDEKK3Rlc3QgJChncmVwIGR1cGxpY2F0ZSBtYWluIHwgd2MgLWwpIC1lcSAxCitncmVwICREVVAgbWFpbiB8IGdyZXAgZHVwbGljYXRlCisKKyMKKyMgVGVzdCBzcGVjaWZpYyByZXBvcnQgZmllbGRzIGZvciBlYWNoIGRldi4KKyMKKworcHZzIC0tbm9oZWFkaW5ncyAtbyB2Z19uYW1lLHZnX3V1aWQgIiRkZXYxIiAyPiYxIHwgdGVlIG91dDEKK3B2cyAtLW5vaGVhZGluZ3MgLW8gdmdfbmFtZSx2Z191dWlkICIkZGV2MiIgMj4mMSB8IHRlZSBvdXQyCisKK2dyZXAgLXYgV0FSTklORyBvdXQxID4gbWFpbjEgfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dDIgPiBtYWluMiB8fCB0cnVlCitkaWZmIG1haW4xIG1haW4yCitybSBvdXQxIG91dDIgbWFpbjEgbWFpbjIgfHwgdHJ1ZQorCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X2luX3VzZSAidXNlZCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfaW5fdXNlICJ1c2VkIgorCitjaGVjayBwdl9maWVsZCAkUFYgIHB2X2FsbG9jYXRhYmxlICJhbGxvY2F0YWJsZSIKK2NoZWNrIHB2X2ZpZWxkICREVVAgcHZfYWxsb2NhdGFibGUgIiIKKworY2hlY2sgcHZfZmllbGQgJFBWICBwdl9kdXBsaWNhdGUgIiIKK2NoZWNrIHB2X2ZpZWxkICREVVAgcHZfZHVwbGljYXRlICJkdXBsaWNhdGUiCisKK3B2cyAtLW5vaGVhZGluZ3MgLW8gbmFtZSxwdl9hbGxvY2F0YWJsZSAiJGRldjEiICIkZGV2MiIgMj4mMSB8IHRlZSBvdXQKKworcm0gd2FybiBtYWluIHx8IHRydWUKK2dyZXAgICAgV0FSTklORyBvdXQgPiB3YXJuIHx8IHRydWUKK2dyZXAgLXYgV0FSTklORyBvdXQgPiBtYWluIHx8IHRydWUKKworZ3JlcCAkUFYgbWFpbgorZ3JlcCAkRFVQIG1haW4KK2dyZXAgJGRldjEgbWFpbgorZ3JlcCAkZGV2MiBtYWluCit0ZXN0ICQoZ3JlcCBhbGxvY2F0YWJsZSBtYWluIHwgd2MgLWwpIC1lcSAxCisKK3B2cyAtLW5vaGVhZGluZ3MgLW8gbmFtZSxwdl9kdXBsaWNhdGUgIiRkZXYxIiAiJGRldjIiIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK2dyZXAgJFBWIG1haW4KK2dyZXAgJERVUCBtYWluCitncmVwICRkZXYxIG1haW4KK2dyZXAgJGRldjIgbWFpbgordGVzdCAkKGdyZXAgZHVwbGljYXRlIG1haW4gfCB3YyAtbCkgLWVxIDEKKworIworIyBBIGZpbHRlciBjYW4gYmUgdXNlZCB0byBzaG93IG9ubHkgb25lLgorIworCitwdnMgLS1jb25maWcgImRldmljZXMgeyBmaWx0ZXI9WyBcImF8JGRldjJ8XCIsIFwicnwuKnxcIiBdIH0iIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK25vdCBncmVwICRkZXYxIG1haW4KK2dyZXAgJGRldjIgbWFpbgorCitub3QgZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK25vdCBncmVwICJwcmVmZXJzIGRldmljZSIgd2FybgorCisKK3B2cyAtLWNvbmZpZyAiZGV2aWNlcyB7IGZpbHRlcj1bIFwiYXwkZGV2MXxcIiwgXCJyfC4qfFwiXSB9IiAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICRkZXYxIG1haW4KK25vdCBncmVwICRkZXYyIG1haW4KKworbm90IGdyZXAgIndhcyBhbHJlYWR5IGZvdW5kIG9uIiB3YXJuCitub3QgZ3JlcCAicHJlZmVycyBkZXZpY2UiIHdhcm4KKworIyBQViBzaXplIGFuZCBtaW5vciBpcyBzdGlsbCByZXBvcnRlZCBjb3JyZWN0bHkgZm9yIGVhY2guCisKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgZGV2X3NpemUgJFNJWkUxCitjaGVjayBwdl9maWVsZCAiJGRldjIiIGRldl9zaXplICRTSVpFMgorCitjaGVjayBwdl9maWVsZCAiJGRldjEiIG1pbm9yICRNSU5PUjEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgbWlub3IgJE1JTk9SMgorCisjIFdpdGggYWxsb3dfY2hhbmdlc193aXRoX2R1cGxpY2F0ZV9wdnM9MCwgYSBWRyB3aXRoIGR1cGxpY2F0ZSBkZXZzCisjIGNhbm5vdCBiZSBtb2RpZmllZCBvciBhY3RpdmF0ZWQuCisKK25vdCBsdmNyZWF0ZSAtYW4gLWwxIC1uICRsdjIgJHZnMQorbm90IGx2cmVtb3ZlICR2ZzEvJGx2MQorbm90IGx2Y2hhbmdlIC1heSAkdmcxLyRsdjEKK25vdCB2Z3JlbW92ZSAkdmcxCisKKworIyBXaXRoIGFsbG93X2NoYW5nZXNfd2l0aF9kdXBsaWNhdGVfcHZzPTEsIGNoYW5nZXMgYWJvdmUgYXJlIHBlcm1pdHRlZC4KKworYXV4IGx2bWNvbmYgJ2RldmljZXMvYWxsb3dfY2hhbmdlc193aXRoX2R1cGxpY2F0ZV9wdnMgPSAxJworCitsdmNyZWF0ZSAtYW4gLWwxIC1uICRsdjIgJHZnMQorbHZyZW1vdmUgJHZnMS8kbHYxCitsdmNoYW5nZSAtYXkgJHZnMS8kbHYyCitsdmNoYW5nZSAtYW4gJHZnMS8kbHYyCitsdnJlbW92ZSAkdmcxLyRsdjIKK3ZncmVtb3ZlIC1mICR2ZzEKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjEiCitwdnJlbW92ZSAtZmYgLXkgIiRkZXYyIgorCisKKyMgZGV2MyBhbmQgZGV2NCBhcmUgY29waWVzLCBvcnBoYW5zCisKK3B2Y3JlYXRlICIkZGV2MyIKK3B2Y3JlYXRlICIkZGV2NCIKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDhtICIkZGV2NCIKKworVVVJRDM9JChwdnMgLS1ub2hlYWRpbmdzIC1vIHV1aWQgJGRldjMgfCB4YXJncykKK1VVSUQ0PSQocHZzIC0tbm9oZWFkaW5ncyAtbyB1dWlkICRkZXY0IHwgeGFyZ3MpCisKK1NJWkUzPSQocHZzIC0tbm9oZWFkaW5ncyAtbyBkZXZfc2l6ZSAkZGV2MykKK1NJWkU0PSQocHZzIC0tbm9oZWFkaW5ncyAtbyBkZXZfc2l6ZSAkZGV2NCkKKworY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBkZXZfc2l6ZSAkU0laRTMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgZGV2X3NpemUgJFNJWkU0CisKK3B2cyAyPiYxIHwgdGVlIG91dAorCitncmVwICIkZGV2MyIgb3V0CitncmVwICIkZGV2NCIgb3V0CisKK2RkIGlmPSIkZGV2MyIgb2Y9IiRkZXY0IiBicz0xTSBpZmxhZz1kaXJlY3Qgb2ZsYWc9ZGlyZWN0LHN5bmMKK3B2c2NhbiAtLWNhY2hlCisKKyMgT25lIGFwcGVhcnMgd2l0aCAncHZzJworCitwdnMgLW8rdXVpZCAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCit0ZXN0ICQoZ3JlcCAkVVVJRDMgbWFpbiB8IHdjIC1sKSAtZXEgMQorbm90IGdyZXAgJFVVSUQ0IG1haW4KKworZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK2dyZXAgInByZWZlcnMgZGV2aWNlIiB3YXJuCisKKyMgQm90aCBhcHBlYXIgd2l0aCAncHZzIC1hJworCitwdnMgLWEgLW8rdXVpZCAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCit0ZXN0ICQoZ3JlcCAkVVVJRDMgbWFpbiB8IHdjIC1sKSAtZXEgMgorCitncmVwICIkZGV2MyIgbWFpbgorZ3JlcCAiJGRldjQiIG1haW4KKworZ3JlcCAkVVVJRDMgbWFpbgorbm90IGdyZXAgJFVVSUQ0IG1haW4KKworZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK2dyZXAgInByZWZlcnMgZGV2aWNlIiB3YXJuCisKKyMgU2hvdyBlYWNoIGRldiBpbmRpdmlkdWFsbHkgYW5kIGJvdGggdG9nZXRoZXIKKworcHZzIC1vK3V1aWQgIiRkZXYzIiAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICIkZGV2MyIgbWFpbgorbm90IGdyZXAgIiRkZXY0IiBtYWluCisKK2dyZXAgIndhcyBhbHJlYWR5IGZvdW5kIG9uIiB3YXJuCitncmVwICJwcmVmZXJzIGRldmljZSIgd2FybgorCitwdnMgLW8rdXVpZCAiJGRldjQiIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK25vdCBncmVwICIkZGV2MyIgbWFpbgorZ3JlcCAiJGRldjQiIG1haW4KKworZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK2dyZXAgInByZWZlcnMgZGV2aWNlIiB3YXJuCisKK3B2cyAtbyt1dWlkICIkZGV2MyIgIiRkZXY0IiAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICIkZGV2MyIgbWFpbgorZ3JlcCAiJGRldjQiIG1haW4KKworZ3JlcCAid2FzIGFscmVhZHkgZm91bmQgb24iIHdhcm4KK2dyZXAgInByZWZlcnMgZGV2aWNlIiB3YXJuCisKKyMgU2FtZSBzaXplcyBzaG93bi4KKworY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBkZXZfc2l6ZSAkU0laRTMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgZGV2X3NpemUgJFNJWkU0CisKKyMgVmVyaWZ5IHRoYXQgZGV2cyBiZWluZyB1c2VkIGJ5IGFuIGFjdGl2ZSBMViBhcmUKKyMgcHJlZmVycmVkIG92ZXIgZHVwbGljYXRlcyB0aGF0IGFyZSBub3QgdXNlZCBieSBhbiBMVi4KKworZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2MyIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2NCIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorcHZzY2FuIC0tY2FjaGUKKwordmdjcmVhdGUgJHZnMiAkZGV2MyAkZGV2NAorbHZjcmVhdGUgLWwxIC1uICRsdjEgJHZnMiAiJGRldjMiCitsdmNyZWF0ZSAtbDEgLW4gJGx2MiAkdmcyICIkZGV2NCIKKworZGQgaWY9IiRkZXYzIiBvZj0iJGRldjUiIGJzPTFNIGlmbGFnPWRpcmVjdCBvZmxhZz1kaXJlY3Qsc3luYworZGQgaWY9IiRkZXY0IiBvZj0iJGRldjYiIGJzPTFNIGlmbGFnPWRpcmVjdCBvZmxhZz1kaXJlY3Qsc3luYworcHZzY2FuIC0tY2FjaGUKKworcHZzIC1vK3V1aWQsZHVwbGljYXRlIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK2dyZXAgIiRkZXYzIiBtYWluCitncmVwICIkZGV2NCIgbWFpbgorbm90IGdyZXAgZHVwbGljYXRlIG1haW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfZHVwbGljYXRlICIiCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X2R1cGxpY2F0ZSAiIgorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9kdXBsaWNhdGUgImR1cGxpY2F0ZSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfZHVwbGljYXRlICJkdXBsaWNhdGUiCisKK2dyZXAgInByZWZlcnMgZGV2aWNlICRkZXYzIiB3YXJuCitncmVwICJwcmVmZXJzIGRldmljZSAkZGV2NCIgd2Fybgorbm90IGdyZXAgInByZWZlcnMgZGV2aWNlICRkZXY1IiB3YXJuCitub3QgZ3JlcCAicHJlZmVycyBkZXZpY2UgJGRldjYiIHdhcm4KKworcHZzIC1hIC1vK3V1aWQsZHVwbGljYXRlIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK3Rlc3QgJChncmVwIGR1cGxpY2F0ZSBtYWluIHwgd2MgLWwpIC1lcSAyCitncmVwICIkZGV2MyIgbWFpbgorZ3JlcCAiJGRldjQiIG1haW4KK2dyZXAgIiRkZXY1IiBtYWluCitncmVwICIkZGV2NiIgbWFpbgorCitncmVwICJwcmVmZXJzIGRldmljZSAkZGV2MyIgd2FybgorZ3JlcCAicHJlZmVycyBkZXZpY2UgJGRldjQiIHdhcm4KK25vdCBncmVwICJwcmVmZXJzIGRldmljZSAkZGV2NSIgd2Fybgorbm90IGdyZXAgInByZWZlcnMgZGV2aWNlICRkZXY2IiB3YXJuCisKK3B2cyAtbyt1dWlkLGR1cGxpY2F0ZSAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK3Rlc3QgJChncmVwIGR1cGxpY2F0ZSBtYWluIHwgd2MgLWwpIC1lcSAyCitncmVwICIkZGV2MyIgbWFpbgorZ3JlcCAiJGRldjQiIG1haW4KK2dyZXAgIiRkZXY1IiBtYWluCitncmVwICIkZGV2NiIgbWFpbgorCitncmVwICJwcmVmZXJzIGRldmljZSAkZGV2MyIgd2FybgorZ3JlcCAicHJlZmVycyBkZXZpY2UgJGRldjQiIHdhcm4KK25vdCBncmVwICJwcmVmZXJzIGRldmljZSAkZGV2NSIgd2Fybgorbm90IGdyZXAgInByZWZlcnMgZGV2aWNlICRkZXY2IiB3YXJuCisKKworZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2NSIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2NiIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorcHZzY2FuIC0tY2FjaGUKKworbHZyZW1vdmUgLXkgJHZnMi8kbHYxCitsdnJlbW92ZSAteSAkdmcyLyRsdjIKK3ZncmVtb3ZlICR2ZzIKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjMiCitwdnJlbW92ZSAtZmYgLXkgIiRkZXY0IgorCitkZCBpZj0vZGV2L3plcm8gb2Y9IiRkZXYzIiBicz0xTSBvZmxhZz1kaXJlY3Qsc3luYyB8fCB0cnVlCitkZCBpZj0vZGV2L3plcm8gb2Y9IiRkZXY0IiBicz0xTSBvZmxhZz1kaXJlY3Qsc3luYyB8fCB0cnVlCitwdnNjYW4gLS1jYWNoZQorCisjIFJldmVyc2UgZGV2cyBpbiB0aGUgcHJldmlvdXMgaW4gY2FzZSBkZXYzL2RldjQgd291bGQgYmUKKyMgcHJlZmVycmVkIGV2ZW4gd2l0aG91dCBhbiBhY3RpdmUgTFYgdXNpbmcgdGhlbS4KKwordmdjcmVhdGUgJHZnMiAiJGRldjUiICIkZGV2NiIKK2x2Y3JlYXRlIC1sMSAtbiAkbHYxICR2ZzIgIiRkZXY1IgorbHZjcmVhdGUgLWwxIC1uICRsdjIgJHZnMiAiJGRldjYiCisKK2RkIGlmPSIkZGV2NSIgb2Y9IiRkZXYzIiBicz0xTSBpZmxhZz1kaXJlY3Qgb2ZsYWc9ZGlyZWN0LHN5bmMKK2RkIGlmPSIkZGV2NiIgb2Y9IiRkZXY0IiBicz0xTSBpZmxhZz1kaXJlY3Qgb2ZsYWc9ZGlyZWN0LHN5bmMKK3B2c2NhbiAtLWNhY2hlCisKK3B2cyAtbyt1dWlkLGR1cGxpY2F0ZSAyPiYxIHwgdGVlIG91dAorCitybSB3YXJuIG1haW4gfHwgdHJ1ZQorZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCitncmVwICIkZGV2NSIgbWFpbgorZ3JlcCAiJGRldjYiIG1haW4KK25vdCBncmVwIGR1cGxpY2F0ZSBtYWluCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X2R1cGxpY2F0ZSAiIgorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9kdXBsaWNhdGUgIiIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfZHVwbGljYXRlICJkdXBsaWNhdGUiCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X2R1cGxpY2F0ZSAiZHVwbGljYXRlIgorCitwdnMgLWEgLW8rdXVpZCxkdXBsaWNhdGUgMj4mMSB8IHRlZSBvdXQKKworcm0gd2FybiBtYWluIHx8IHRydWUKK2dyZXAgICAgV0FSTklORyBvdXQgPiB3YXJuIHx8IHRydWUKK2dyZXAgLXYgV0FSTklORyBvdXQgPiBtYWluIHx8IHRydWUKKwordGVzdCAkKGdyZXAgZHVwbGljYXRlIG1haW4gfCB3YyAtbCkgLWVxIDIKK2dyZXAgIiRkZXYzIiBtYWluCitncmVwICIkZGV2NCIgbWFpbgorZ3JlcCAiJGRldjUiIG1haW4KK2dyZXAgIiRkZXY2IiBtYWluCisKK2dyZXAgInByZWZlcnMgZGV2aWNlICRkZXY1IiB3YXJuCitncmVwICJwcmVmZXJzIGRldmljZSAkZGV2NiIgd2Fybgorbm90IGdyZXAgInByZWZlcnMgZGV2aWNlICRkZXYzIiB3YXJuCitub3QgZ3JlcCAicHJlZmVycyBkZXZpY2UgJGRldjQiIHdhcm4KKworZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2MyIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkZGV2NCIgYnM9MU0gb2ZsYWc9ZGlyZWN0LHN5bmMgfHwgdHJ1ZQorcHZzY2FuIC0tY2FjaGUKKworbHZyZW1vdmUgLXkgJHZnMi8kbHYxCitsdnJlbW92ZSAteSAkdmcyLyRsdjIKK3ZncmVtb3ZlICR2ZzIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtZHVwbGljYXRlLXZnbmFtZXMuc2ggYi90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1kdXBsaWNhdGUtdmduYW1lcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzJjNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtZHVwbGljYXRlLXZnbmFtZXMuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgdmdzIHdpdGggZHVwbGljYXRlIHZnIG5hbWVzJworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMgorCitwdmNyZWF0ZSAiJGRldjEiCitwdmNyZWF0ZSAiJGRldjIiCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiICIkZGV2MiIKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgordmdzY2FuCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK1VVSUQxPSQodmdzIC0tbm9oZWFkaW5nIC1vIHZnX3V1aWQgJHZnMSkKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCisKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIKK3Znc2NhbgordmdjcmVhdGUgJHZnMSAiJGRldjIiCitVVUlEMj0kKHZncyAtLW5vaGVhZGluZyAtbyB2Z191dWlkICR2ZzEpCisKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKKyMgbmVlZCB2Z3NjYW4gYWZ0ZXIgZW5hYmxpbmcvZGlzYWJsaW5nIGRldnMKKyMgc28gdGhhdCB0aGUgbmV4dCBjb21tYW5kcyBwcm9wZXJseSBzZWUgdGhlbQordmdzY2FuCitwdnMgIiRkZXYxIgorcHZzICIkZGV2MiIKKwordmdzIC1vK3ZnX3V1aWQgfCB0ZWUgZXJyCitncmVwICRVVUlEMSBlcnIKK2dyZXAgJFVVSUQyIGVycgorCisjIHNob3VsZCB3ZSBzcGVjaWZ5IGFuZCB0ZXN0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQ/CisjIHZncyAtLW5vaGVhZGluZyAtbyB2Z191dWlkICR2ZzEgPmVycgorIyBncmVwICRVVUlEMSBlcnIKKworYXV4IGRpc2FibGVfZGV2ICIkZGV2MiIKK3ZncyAtbyt2Z191dWlkIHwgdGVlIGVycgorZ3JlcCAkVVVJRDEgZXJyCitub3QgZ3JlcCAkVVVJRDIgZXJyCithdXggZW5hYmxlX2RldiAiJGRldjIiCit2Z3NjYW4KKworYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK3ZncyAtbyt2Z191dWlkIHwgdGVlIGVycgorZ3JlcCAkVVVJRDIgZXJyCitub3QgZ3JlcCAkVVVJRDEgZXJyCithdXggZW5hYmxlX2RldiAiJGRldjEiCit2Z3NjYW4KZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLWx2LnNoIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtbHYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMDhiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLWx2LnNoCkBAIC0wLDAgKzEsNjU5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdFeGVyY2lzZSB0b29sbGliIHByb2Nlc3NfZWFjaF9sdicKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKyMgZGlzYWJsZSBsdm1ldGFkIGxvZ2dpbmcgYXMgaXQgYm9ncyBkb3duIHRlc3Qgc3lzdGVtcworZXhwb3J0IExWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUz0ke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy19CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMTAKKworIworIyBwcm9jZXNzX2VhY2hfbHYgaXMgdXNlZCBieSBhIG51bWJlciBvZiBsdiBjb21tYW5kczoKKyMgbHZjb252ZXJ0IGx2ICAgICAgKG5vbmUgaXMgZXJyb3IpCisjIGx2Y2hhbmdlICB2Z3xsdiAgIChub25lIGlzIGVycm9yKQorIyBsdnJlbW92ZSAgdmd8bHYgICAobm9uZSBpcyBlcnJvcikKKyMgbHZkaXNwbGF5IFt2Z3xsdl0gKG5vbmUgaXMgYWxsKQorIyB2Z21rbm9kZXMgW3ZnfGx2XSAobm9uZSBpcyBhbGwpCisjIGx2cyAgICAgICBbdmd8bHZdIChub25lIGlzIGFsbCkKKyMgbHZzY2FuICAgICAgICAgICAgKG5vbmUgaXMgYWxsKQorIworIyAobHYgY2FuIGFsc28gYmUgYSB0YWcgbWF0Y2hpbmcgYW4gbHYgdGFnLCBhbmQKKyMgIHZnIGNhbiBhbHNvIGJlIGEgdGFnIG1hdGNoaW5nIGEgdmcgdGFnLikKKyMKKyMgVGhlIGxvZ2ljIGluIHByb2Nlc3NfZWFjaF92bCBpcyBtYWlubHkgcmVsYXRlZCB0bworIyBzZWxlY3Rpbmcgd2hpY2ggdmdzL2x2cyB0byBwcm9jZXNzLgorIworCisjCisjIHRlc3QgbHZyZW1vdmUgdmd8bHYgbmFtZXMKKyMKKworcHJlcGFyZV92Z3NfKCkgeworCSMgc2V0IHVwIHZncy9sdnMgdGhhdCB3ZSB3aWxsIHJlbW92ZQorCXZnY3JlYXRlICRTSEFSRUQgJHZnMSAiJGRldjEiICIkZGV2MiIKKwl2Z2NyZWF0ZSAkU0hBUkVEICR2ZzIgIiRkZXYzIiAiJGRldjQiCisJdmdjcmVhdGUgJFNIQVJFRCAkdmczICIkZGV2NSIgIiRkZXY2IgorCXZnY3JlYXRlICRTSEFSRUQgJHZnNCAiJGRldjciICIkZGV2OCIKKwl2Z2NyZWF0ZSAkU0hBUkVEICR2ZzUgIiRkZXY5IiAiJGRldjEwIgorCWx2Y3JlYXRlIC1abiAtYW4gLWwgMiAtbiAkbHYxICR2ZzEKKwlsdmNyZWF0ZSAtWm4gLWFuIC1sIDIgLW4gJGx2MSAkdmcyCisJbHZjcmVhdGUgLVpuIC1hbiAtbCAyIC1uICRsdjIgJHZnMgorCWx2Y3JlYXRlIC1abiAtYW4gLWwgMiAtbiAkbHYxICR2ZzMKKwlsdmNyZWF0ZSAtWm4gLWFuIC1sIDIgLW4gJGx2MiAkdmczCisJbHZjcmVhdGUgLVpuIC1hbiAtbCAyIC1uICRsdjMgJHZnMworCWx2Y3JlYXRlIC1abiAtYW4gLWwgMiAtbiAkbHYxICR2ZzUKKwlsdmNyZWF0ZSAtWm4gLWFuIC1sIDIgLW4gJGx2MiAkdmc1CisJbHZjcmVhdGUgLVpuIC1hbiAtbCAyIC1uICRsdjMgJHZnNQorCWx2Y3JlYXRlIC1abiAtYW4gLWwgMiAtbiAkbHY0ICR2ZzUKKwlsdmNyZWF0ZSAtWm4gLWFuIC1sIDIgLW4gJGx2NSAkdmc1Cit9CisKKyMKKyMKKyMKK3ByZXBhcmVfdmdzXworCitub3QgbHZyZW1vdmUKK25vdCBsdnJlbW92ZSBnYXJiYWdlCitub3QgbHZyZW1vdmUgJHZnMS9nYXJiYWdlCisKK2x2cmVtb3ZlICR2ZzEKK2NoZWNrIGx2X2V4aXN0cyAkdmcxCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzEgJGx2MQordmdyZW1vdmUgJHZnMQorCitsdnJlbW92ZSAkdmcyCitjaGVjayBsdl9leGlzdHMgJHZnMgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcyICRsdjEgJGx2MgordmdyZW1vdmUgJHZnMgorCitsdnJlbW92ZSAkdmczLyRsdjEKK2x2cmVtb3ZlICR2ZzMvJGx2MiAkdmczLyRsdjMKK2NoZWNrIGx2X2V4aXN0cyAkdmczCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MSAkbHYyICRsdjMKK3ZncmVtb3ZlICR2ZzMKKworbHZyZW1vdmUgJHZnNAorY2hlY2sgbHZfZXhpc3RzICR2ZzQKK3ZncmVtb3ZlICR2ZzQKKworbHZyZW1vdmUgJHZnNS8kbHYxICR2ZzUgJHZnNS8kbHYzCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzUgJGx2MSAkbHYyICRsdjMgJGx2NCAkbHY1Cit2Z3JlbW92ZSAkdmc1CisKKworIworIyB0ZXN0IGx2cmVtb3ZlIHZnfGx2IG5hbWVzIGZyb20gbXVsdGlwbGUgdmdzCisjCitwcmVwYXJlX3Znc18KKworbHZyZW1vdmUgJHZnMiAkdmczLyRsdjMgJHZnNS8kbHYxCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzIgJGx2MSAkbHYyCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MworY2hlY2sgbHZfbm90X2V4aXN0cyAkdmc1ICRsdjEKKworbHZyZW1vdmUgJHZnMiAkdmcxCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzEgJGx2MQorCitsdnJlbW92ZSAkdmczLyRsdjEgJHZnMyAkdmc0ICR2ZzUvJGx2MgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmczICRsdjEgJGx2MgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmc1ICRsdjIKKworbHZyZW1vdmUgJHZnNSAkdmcxICR2ZzUvJGx2MworY2hlY2sgbHZfbm90X2V4aXN0cyAkdmc1ICRsdjMgJGx2NCAkbHY1CisKK3ZncmVtb3ZlICR2ZzEgJHZnMiAkdmczICR2ZzQgJHZnNQorCisKKyMKKyMgdGVzdCBsdnJlbW92ZSBAbHZ0YWdzCisjCitwcmVwYXJlX3Znc18KKworbHZjaGFuZ2UgLS1hZGR0YWcgVjFMMSAkdmcxLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyTDEgJHZnMi8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMkwyICR2ZzIvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmcyLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMi8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzMvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmczLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wyICR2ZzMvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjNMM0EgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wzQiAkdmczLyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDEgICAkdmc1LyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjQKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDUgICAkdmc1LyRsdjUKK3ZnY2hhbmdlIC1hbiAkdmcxICR2ZzIgJHZnMyAkdmc0ICR2ZzUKKworIyB2ZXJpZnkgYWxsIGV4aXN0CitjaGVjayBsdl9leGlzdHMgJHZnMSAkbHYxCitjaGVjayBsdl9leGlzdHMgJHZnMiAkbHYxICRsdjIKK2NoZWNrIGx2X2V4aXN0cyAkdmczICRsdjEgJGx2MiAkbHYzCitjaGVjayBsdl9leGlzdHMgJHZnNSAkbHYxICRsdjIgJGx2MyAkbHY0ICRsdjUKKworbHZyZW1vdmUgQGdhcmJhZ2UKKworbHZyZW1vdmUgQFYzTDNBCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MworIyB2ZXJpZnkgdW5yZW1vdmVkIHN0aWxsIGV4aXN0CitjaGVjayBsdl9leGlzdHMgJHZnMSAkbHYxCitjaGVjayBsdl9leGlzdHMgJHZnMiAkbHYxICRsdjIKK2NoZWNrIGx2X2V4aXN0cyAkdmczICRsdjEgJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2ZzUgJGx2MSAkbHYyICRsdjMgJGx2NCAkbHY1CisKK2x2cmVtb3ZlIEBWNUwyMzQKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnNSAkbHYyICRsdjMgJGx2NAorIyB2ZXJpZnkgdW5yZW1vdmVkIHN0aWxsIGV4aXN0CitjaGVjayBsdl9leGlzdHMgJHZnMSAkbHYxCitjaGVjayBsdl9leGlzdHMgJHZnMiAkbHYxICRsdjIKK2NoZWNrIGx2X2V4aXN0cyAkdmczICRsdjEgJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2ZzUgJGx2MSAkbHY1CisKK2x2cmVtb3ZlIEBWNUwxIEBWNUw1CitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzUgJGx2MSAkbHY1CisjIHZlcmlmeSB1bnJlbW92ZWQgc3RpbGwgZXhpc3QKK2NoZWNrIGx2X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcyICRsdjEgJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2ZzMgJGx2MSAkbHYyCisKK2x2cmVtb3ZlIEBWMjMgQFYxTDEgQFYzTDIKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMSAkbHYxCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzIgJGx2MSAkbHYyCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MSAkbHYyCisKK3ZncmVtb3ZlICR2ZzEgJHZnMiAkdmczICR2ZzQgJHZnNQorCisKKyMKKyMgdGVzdCBsdnJlbW92ZSBAdmd0YWdzCisjCitwcmVwYXJlX3Znc18KKwordmdjaGFuZ2UgLS1hZGR0YWcgVjEgICR2ZzEKK3ZnY2hhbmdlIC0tYWRkdGFnIFYyMyAkdmcyCit2Z2NoYW5nZSAtLWFkZHRhZyBWMjMgJHZnMwordmdjaGFuZ2UgLS1hZGR0YWcgVjM1ICR2ZzMKK3ZnY2hhbmdlIC0tYWRkdGFnIFY0ICAkdmc0Cit2Z2NoYW5nZSAtLWFkZHRhZyBWMzUgJHZnNQordmdjaGFuZ2UgLS1hZGR0YWcgVjUgICR2ZzUKK3ZnY2hhbmdlIC1hbiAkdmcxICR2ZzIgJHZnMyAkdmc0ICR2ZzUKKworbHZyZW1vdmUgQFY0CisjIHZlcmlmeSB1bnJlbW92ZWQgZXhpc3QKK2NoZWNrIGx2X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcyICRsdjEgJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2ZzMgJGx2MSAkbHYyICRsdjMKK2NoZWNrIGx2X2V4aXN0cyAkdmc1ICRsdjEgJGx2MiAkbHYzICRsdjQgJGx2NQorCitsdnJlbW92ZSBAVjUKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnNSAkbHYxICRsdjIgJGx2MyAkbHY0ICRsdjUKKyMgdmVyaWZ5IHVucmVtb3ZlZCBleGlzdAorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorY2hlY2sgbHZfZXhpc3RzICR2ZzIgJGx2MSAkbHYyCitjaGVjayBsdl9leGlzdHMgJHZnMyAkbHYxICRsdjIgJGx2MworCitsdnJlbW92ZSBAVjEgQFYyMworY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMiAkbHYxICRsdjIKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMyAkbHYxICRsdjIgJGx2MworCit2Z3JlbW92ZSAkdmcxICR2ZzIgJHZnMyAkdmc0ICR2ZzUKKworIworIworIworcHJlcGFyZV92Z3NfCisKK3ZnY2hhbmdlIC0tYWRkdGFnIFYxICAkdmcxCit2Z2NoYW5nZSAtLWFkZHRhZyBWMjMgJHZnMgordmdjaGFuZ2UgLS1hZGR0YWcgVjIzICR2ZzMKK3ZnY2hhbmdlIC0tYWRkdGFnIFYzNSAkdmczCit2Z2NoYW5nZSAtLWFkZHRhZyBWNCAgJHZnNAordmdjaGFuZ2UgLS1hZGR0YWcgVjM1ICR2ZzUKK3ZnY2hhbmdlIC0tYWRkdGFnIFY1ICAkdmc1CisKK2x2cmVtb3ZlIEBWMzUgQFY1CitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MSAkbHYyIC8kbHYzCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzUgJGx2MSAkbHYyICRsdjMgJGx2NCAkbHY1CisjIHZlcmlmeSB1bnJlbW92ZWQgZXhpc3QKK2NoZWNrIGx2X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcyICRsdjEgJGx2MgorCitsdnJlbW92ZSBAVjEgQFYyMworY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMiAkbHYxICRsdjIKKwordmdyZW1vdmUgJHZnMSAkdmcyICR2ZzMgJHZnNCAkdmc1CisKKworIworIyB0ZXN0IGx2cmVtb3ZlIHZnfGx2IG5hbWVzIGFuZCBAbHZ0YWdzCisjCitwcmVwYXJlX3Znc18KKworbHZjaGFuZ2UgLS1hZGR0YWcgVjFMMSAkdmcxLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyTDEgJHZnMi8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMkwyICR2ZzIvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmcyLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMi8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzMvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmczLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wyICR2ZzMvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjNMM0EgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wzQiAkdmczLyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDEgICAkdmc1LyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjQKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDUgICAkdmc1LyRsdjUKK3ZnY2hhbmdlIC1hbiAkdmcxICR2ZzIgJHZnMyAkdmc0ICR2ZzUKKworbHZyZW1vdmUgJHZnMS8kbHYxIEBWM0wyIEBWNUwyMzQKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMSAkbHYxCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmc1ICRsdjIgJGx2MyAkbHY0CisjIHZlcmlmeSB1bnJlbW92ZWQgZXhpc3QKK2NoZWNrIGx2X2V4aXN0cyAkdmcyICRsdjEgJGx2MgorY2hlY2sgbHZfZXhpc3RzICR2ZzMgJGx2MSAkbHYzCitjaGVjayBsdl9leGlzdHMgJHZnNSAkbHYxICRsdjUKKworbHZyZW1vdmUgJHZnMi8kbHYxIEBWMjMgJHZnNS8kbHYxIEBWNUw1CisKK3ZncmVtb3ZlICR2ZzEgJHZnMiAkdmczICR2ZzQgJHZnNQorCisKKyMKKyMgdGVzdCBsdnJlbW92ZSB2Z3xsdiBuYW1lcyBhbmQgQHZndGFncworIworcHJlcGFyZV92Z3NfCisKK3ZnY2hhbmdlIC0tYWRkdGFnIFYxICAkdmcxCit2Z2NoYW5nZSAtLWFkZHRhZyBWMjMgJHZnMgordmdjaGFuZ2UgLS1hZGR0YWcgVjIzICR2ZzMKK3ZnY2hhbmdlIC0tYWRkdGFnIFYzNSAkdmczCit2Z2NoYW5nZSAtLWFkZHRhZyBWNCAgJHZnNAordmdjaGFuZ2UgLS1hZGR0YWcgVjM1ICR2ZzUKK3ZnY2hhbmdlIC0tYWRkdGFnIFY1ICAkdmc1CisKK2x2cmVtb3ZlICR2ZzEvJGx2MSBAVjM1CitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzEgJGx2MQorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmczICRsdjEgJGx2MiAkbHYzCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzUgJGx2MSAkbHYyICRsdjNub3QgJGx2NCAkbHY1CisjIHZlcmlmeSB1bnJlbW92ZWQgZXhpc3QKK2NoZWNrIGx2X2V4aXN0cyAkdmcyICRsdjEgJGx2MgorCitsdnJlbW92ZSAkdmcyLyRsdjEgQFYyMyAkdmcyLyRsdjIKKwordmdyZW1vdmUgJHZnMSAkdmcyICR2ZzMgJHZnNCAkdmc1CisKKworIworIyB0ZXN0IGx2cmVtb3ZlIEBsdnRhZ3MgYW5kIEB2Z3RhZ3MKKyMKK3ByZXBhcmVfdmdzXworCitsdmNoYW5nZSAtLWFkZHRhZyBWMUwxICR2ZzEvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjJMMSAkdmcyLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyTDIgJHZnMi8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzIvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmcyLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMy8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzMvJGx2MgorIyB0byBjaGVjayB0aGF0IHZnIHRhZyBAVjIzIGluY2x1ZGVzIHRoaXMKKyMgbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmczLyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFYzTDIgJHZnMy8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wzQSAkdmczLyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFYzTDNCICR2ZzMvJGx2MworbHZjaGFuZ2UgLS1hZGR0YWcgVjVMMSAgICR2ZzUvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjVMMjM0ICR2ZzUvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjVMMjM0ICR2ZzUvJGx2MworbHZjaGFuZ2UgLS1hZGR0YWcgVjVMMjM0ICR2ZzUvJGx2NAorbHZjaGFuZ2UgLS1hZGR0YWcgVjVMNSAgICR2ZzUvJGx2NQordmdjaGFuZ2UgLS1hZGR0YWcgVjEgICR2ZzEKK3ZnY2hhbmdlIC0tYWRkdGFnIFYyMyAkdmcyCit2Z2NoYW5nZSAtLWFkZHRhZyBWMjMgJHZnMwordmdjaGFuZ2UgLS1hZGR0YWcgVjM1ICR2ZzMKK3ZnY2hhbmdlIC0tYWRkdGFnIFY0ICAkdmc0Cit2Z2NoYW5nZSAtLWFkZHRhZyBWMzUgJHZnNQordmdjaGFuZ2UgLS1hZGR0YWcgVjUgICR2ZzUKKworbHZyZW1vdmUgQFYyMyBAVjM1CitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzIgJGx2MSAkbHYyCitjaGVjayBsdl9ub3RfZXhpc3RzICR2ZzMgJGx2MSAkbHYyICRsdjMKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnNSAkbHYxICRsdjIgJGx2MyAkbHY0ICRsdjUKKyMgdmVyaWZ5IHVucmVtb3ZlZCBleGlzdAorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorCitsdnJlbW92ZSBAVjEgQFYxTDEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMSAkbHYxCisKK3ZncmVtb3ZlICR2ZzEgJHZnMiAkdmczICR2ZzQgJHZnNQorCisKKyMKKyMgdGVzdCBsdnJlbW92ZSB2Z3xsdiBuYW1lcyBhbmQgQGx2dGFncyBhbmQgQHZndGFncworIworcHJlcGFyZV92Z3NfCisKK2x2Y2hhbmdlIC0tYWRkdGFnIFYxTDEgJHZnMS8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMkwxICR2ZzIvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjJMMiAkdmcyLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMi8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzIvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmczLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMy8kbHYyCisjIHRvIGNoZWNrIHRoYXQgdmcgdGFnIEBWMjMgaW5jbHVkZXMgdGhpcworIyBsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzMvJGx2MworbHZjaGFuZ2UgLS1hZGR0YWcgVjNMMiAkdmczLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYzTDNBICR2ZzMvJGx2MworbHZjaGFuZ2UgLS1hZGR0YWcgVjNMM0IgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWNUwxICAgJHZnNS8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWNUwyMzQgJHZnNS8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWNUwyMzQgJHZnNS8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWNUwyMzQgJHZnNS8kbHY0CitsdmNoYW5nZSAtLWFkZHRhZyBWNUw1ICAgJHZnNS8kbHY1Cit2Z2NoYW5nZSAtLWFkZHRhZyBWMSAgJHZnMQordmdjaGFuZ2UgLS1hZGR0YWcgVjIzICR2ZzIKK3ZnY2hhbmdlIC0tYWRkdGFnIFYyMyAkdmczCit2Z2NoYW5nZSAtLWFkZHRhZyBWMzUgJHZnMwordmdjaGFuZ2UgLS1hZGR0YWcgVjQgICR2ZzQKK3ZnY2hhbmdlIC0tYWRkdGFnIFYzNSAkdmc1Cit2Z2NoYW5nZSAtLWFkZHRhZyBWNSAgJHZnNQorCitsdnJlbW92ZSAkdmcxLyRsdjEgQFYyMyBAVjVMNQorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcxICRsdjEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMiAkbHYxICRsdjIKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMyAkbHYxICRsdjIgJGx2MworY2hlY2sgbHZfbm90X2V4aXN0cyAkdmc1ICRsdjUKKyMgdmVyaWZ5IHVucmVtb3ZlZCBleGlzdAorY2hlY2sgbHZfZXhpc3RzICR2ZzUgJGx2MSAkbHYyICRsdjMgJGx2NAorCitsdnJlbW92ZSAkdmc1LyRsdjIgQFY1TDIzNCBAVjUKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnNSAkbHYxICRsdjIgJGx2MyAkbHY0CisKK3ZncmVtb3ZlICR2ZzEgJHZnMiAkdmczICR2ZzQgJHZnNQorCisKKyMKKyMgdGVzdCBsdnM6IGVtcHR5LCB2ZyhzKSwgbHYocyksIHZndGFnKHMpLCBsdnRhZyhzKSwgZ2FyYmFnZSwgY29tYmluYXRpb25zCisjCitwcmVwYXJlX3Znc18KKworbHZjaGFuZ2UgLS1hZGR0YWcgVjFMMSAkdmcxLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyTDEgJHZnMi8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBWMkwyICR2ZzIvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmcyLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMi8kbHYyCitsdmNoYW5nZSAtLWFkZHRhZyBWMjMgICR2ZzMvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgVjIzICAkdmczLyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFYyMyAgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wyICR2ZzMvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgVjNMM0EgJHZnMy8kbHYzCitsdmNoYW5nZSAtLWFkZHRhZyBWM0wzQiAkdmczLyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDEgICAkdmc1LyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjMKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDIzNCAkdmc1LyRsdjQKK2x2Y2hhbmdlIC0tYWRkdGFnIFY1TDUgICAkdmc1LyRsdjUKK3ZnY2hhbmdlIC0tYWRkdGFnIFYxICAkdmcxCit2Z2NoYW5nZSAtLWFkZHRhZyBWMjMgJHZnMgordmdjaGFuZ2UgLS1hZGR0YWcgVjIzICR2ZzMKK3ZnY2hhbmdlIC0tYWRkdGFnIFYzNSAkdmczCit2Z2NoYW5nZSAtLWFkZHRhZyBWNCAgJHZnNAordmdjaGFuZ2UgLS1hZGR0YWcgVjM1ICR2ZzUKK3ZnY2hhbmdlIC0tYWRkdGFnIFY1ICAkdmc1CisKKyMgZW1wdHkKK2x2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nID5lcnIKK2dyZXAgJHZnMS0kbHYxIGVycgorZ3JlcCAkdmcyLSRsdjEgZXJyCitncmVwICR2ZzItJGx2MiBlcnIKK2dyZXAgJHZnMy0kbHYxIGVycgorZ3JlcCAkdmczLSRsdjIgZXJyCitncmVwICR2ZzMtJGx2MyBlcnIKK2dyZXAgJHZnNS0kbHYxIGVycgorZ3JlcCAkdmc1LSRsdjIgZXJyCitncmVwICR2ZzUtJGx2MyBlcnIKK2dyZXAgJHZnNS0kbHY0IGVycgorZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgdmcKK2x2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nICR2ZzEgPmVycgorZ3JlcCAkdmcxLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgdmdzCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyAkdmcxICR2ZzIgPmVycgorZ3JlcCAkdmcxLSRsdjEgZXJyCitncmVwICR2ZzItJGx2MSBlcnIKK2dyZXAgJHZnMi0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYxIGVycgorbm90IGdyZXAgJHZnMy0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHYxIGVycgorbm90IGdyZXAgJHZnNS0kbHYyIGVycgorbm90IGdyZXAgJHZnNS0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHY0IGVycgorbm90IGdyZXAgJHZnNS0kbHY1IGVycgorCisjIGx2CitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyAkdmcxLyRsdjEgPmVycgorZ3JlcCAkdmcxLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgbHZzCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyAkdmcxLyRsdjEgJHZnMi8kbHYxICR2ZzIvJGx2MiA+ZXJyCitncmVwICR2ZzEtJGx2MSBlcnIKK2dyZXAgJHZnMi0kbHYxIGVycgorZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgdmd0YWcKK2x2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nIEBWMSA+ZXJyCitncmVwICR2ZzEtJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MSBlcnIKK25vdCBncmVwICR2ZzMtJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2MSBlcnIKK25vdCBncmVwICR2ZzUtJGx2MiBlcnIKK25vdCBncmVwICR2ZzUtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2NCBlcnIKK25vdCBncmVwICR2ZzUtJGx2NSBlcnIKKworIyB2Z3RhZ3MKK2x2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nIEBWMSBAVjM1ID5lcnIKK2dyZXAgJHZnMS0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYyIGVycgorZ3JlcCAkdmczLSRsdjEgZXJyCitncmVwICR2ZzMtJGx2MiBlcnIKK2dyZXAgJHZnMy0kbHYzIGVycgorZ3JlcCAkdmc1LSRsdjEgZXJyCitncmVwICR2ZzUtJGx2MiBlcnIKK2dyZXAgJHZnNS0kbHYzIGVycgorZ3JlcCAkdmc1LSRsdjQgZXJyCitncmVwICR2ZzUtJGx2NSBlcnIKKworIyBsdnRhZworbHZzIC1vIHZnX25hbWUsbHZfbmFtZSAtLXNlcGFyYXRvciAnLScgQFYxTDEgPmVycgorZ3JlcCAkdmcxLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgbHZ0YWdzCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyBAVjFMMSBAVjVMMjM0ID5lcnIKK2dyZXAgJHZnMS0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYxIGVycgorbm90IGdyZXAgJHZnMy0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHYxIGVycgorZ3JlcCAkdmc1LSRsdjIgZXJyCitncmVwICR2ZzUtJGx2MyBlcnIKK2dyZXAgJHZnNS0kbHY0IGVycgorbm90IGdyZXAgJHZnNS0kbHY1IGVycgorCisjIHZnIGFuZCBsdiBhbmQgdmd0YWcgYW5kIGx2dGFnCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyAkdmcyICR2ZzUvJGx2NSBAVjEgQFY1TDIzNCA+ZXJyCitncmVwICR2ZzEtJGx2MSBlcnIKK2dyZXAgJHZnMi0kbHYxIGVycgorZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitncmVwICR2ZzUtJGx2MiBlcnIKK2dyZXAgJHZnNS0kbHYzIGVycgorZ3JlcCAkdmc1LSRsdjQgZXJyCitncmVwICR2ZzUtJGx2NSBlcnIKKworIyBnYXJiYWdlIG5hbWUgZ2l2ZXMgYW4gZXJyb3IgaWYgdXNlZCB3aXRob3V0IGEgdGFnCisKK25vdCBsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyBnYXJiYWdlID5lcnIKK25vdCBncmVwICR2ZzEtJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MSBlcnIKK25vdCBncmVwICR2ZzMtJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2MSBlcnIKK25vdCBncmVwICR2ZzUtJGx2MiBlcnIKK25vdCBncmVwICR2ZzUtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2NCBlcnIKK25vdCBncmVwICR2ZzUtJGx2NSBlcnIKKworbm90IGx2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nICR2ZzEvJGx2MSBnYXJiYWdlID5lcnIKK2dyZXAgJHZnMS0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYxIGVycgorbm90IGdyZXAgJHZnMy0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHYxIGVycgorbm90IGdyZXAgJHZnNS0kbHYyIGVycgorbm90IGdyZXAgJHZnNS0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHY0IGVycgorbm90IGdyZXAgJHZnNS0kbHY1IGVycgorCisjIGdhcmJhZ2UgbmFtZSBkb2VzIG5vdCBnaXZlIGFuIGVycm9yIGlmIHVzZWQgd2l0aCBhIHRhZworCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyBAVjEgZ2FyYmFnZSA+ZXJyCitncmVwICR2ZzEtJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MSBlcnIKK25vdCBncmVwICR2ZzMtJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2MSBlcnIKK25vdCBncmVwICR2ZzUtJGx2MiBlcnIKK25vdCBncmVwICR2ZzUtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2NCBlcnIKK25vdCBncmVwICR2ZzUtJGx2NSBlcnIKKworbHZzIC1vIHZnX25hbWUsbHZfbmFtZSAtLXNlcGFyYXRvciAnLScgQGdhcmJhZ2UgZ2FyYmFnZSA+ZXJyCitub3QgZ3JlcCAkdmcxLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKKyMgZ2FyYmFnZSB0YWcgbmV2ZXIgZ2l2ZXMgYW4gZXJyb3IKKworbHZzIC1vIHZnX25hbWUsbHZfbmFtZSAtLXNlcGFyYXRvciAnLScgQFYxIEBnYXJiYWdlID5lcnIKK2dyZXAgJHZnMS0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYxIGVycgorbm90IGdyZXAgJHZnMi0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYxIGVycgorbm90IGdyZXAgJHZnMy0kbHYyIGVycgorbm90IGdyZXAgJHZnMy0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHYxIGVycgorbm90IGdyZXAgJHZnNS0kbHYyIGVycgorbm90IGdyZXAgJHZnNS0kbHYzIGVycgorbm90IGdyZXAgJHZnNS0kbHY0IGVycgorbm90IGdyZXAgJHZnNS0kbHY1IGVycgorCitsdnMgLW8gdmdfbmFtZSxsdl9uYW1lIC0tc2VwYXJhdG9yICctJyAkdmcxLyRsdjEgQGdhcmJhZ2UgPmVycgorZ3JlcCAkdmcxLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjEgZXJyCitub3QgZ3JlcCAkdmcyLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjEgZXJyCitub3QgZ3JlcCAkdmczLSRsdjIgZXJyCitub3QgZ3JlcCAkdmczLSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjEgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjIgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjMgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjQgZXJyCitub3QgZ3JlcCAkdmc1LSRsdjUgZXJyCisKK2x2cyAtbyB2Z19uYW1lLGx2X25hbWUgLS1zZXBhcmF0b3IgJy0nIEBnYXJiYWdlID5lcnIKK25vdCBncmVwICR2ZzEtJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MSBlcnIKK25vdCBncmVwICR2ZzItJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MSBlcnIKK25vdCBncmVwICR2ZzMtJGx2MiBlcnIKK25vdCBncmVwICR2ZzMtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2MSBlcnIKK25vdCBncmVwICR2ZzUtJGx2MiBlcnIKK25vdCBncmVwICR2ZzUtJGx2MyBlcnIKK25vdCBncmVwICR2ZzUtJGx2NCBlcnIKK25vdCBncmVwICR2ZzUtJGx2NSBlcnIKKwordmdyZW1vdmUgLWYgJHZnMSAkdmcyICR2ZzMgJHZnNCAkdmc1CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdi1ub21kYS1hbGwuc2ggYi90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdi1ub21kYS1hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5Y2MxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXB2LW5vbWRhLWFsbC5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHByb2Nlc3NfZWFjaF9wdiB3aXRoIHplcm8gbWRhJworU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyAxNAorCisjIGZvciB2ZzEKK3B2Y3JlYXRlICIkZGV2MTAiCisKKyMgZm9yIHZnMgorcHZjcmVhdGUgIiRkZXYyIiAtLW1ldGFkYXRhY29waWVzIDAKK3B2Y3JlYXRlICIkZGV2MyIKK3B2Y3JlYXRlICIkZGV2NCIKK3B2Y3JlYXRlICIkZGV2NSIKKworIyBmb3IgdmczCitwdmNyZWF0ZSAiJGRldjYiIC0tbWV0YWRhdGFjb3BpZXMgMAorcHZjcmVhdGUgIiRkZXY3IiAtLW1ldGFkYXRhY29waWVzIDAKK3B2Y3JlYXRlICIkZGV2OCIgLS1tZXRhZGF0YWNvcGllcyAwCitwdmNyZWF0ZSAiJGRldjkiCisKKyMgb3JwaGFuIHdpdGggbWRhCitwdmNyZWF0ZSAiJGRldjExIgorIyBvcnBoYW4gd2l0aG91dCBtZGEKK3B2Y3JlYXRlICIkZGV2MTQiIC0tbWV0YWRhdGFjb3BpZXMgMAorCisjIG5vbi1wdiBkZXZzCisjIGRldjEyCisjIGRldjEzCisKK3ZnY3JlYXRlICRTSEFSRUQgJHZnMSAiJGRldjEwIgordmdjcmVhdGUgJFNIQVJFRCAkdmcyICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKK3ZnY3JlYXRlICRTSEFSRUQgJHZnMyAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKK3B2cyAtYSB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitncmVwICIkZGV2NCIgZXJyCitncmVwICIkZGV2NSIgZXJyCitncmVwICIkZGV2NiIgZXJyCitncmVwICIkZGV2NyIgZXJyCitncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorZ3JlcCAiJGRldjEyIiBlcnIKK2dyZXAgIiRkZXYxMyIgZXJyCitncmVwICIkZGV2MTQiIGVycgorCit2Z3JlbW92ZSAkdmcxICR2ZzIgJHZnMwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtcHYtbm9tZGEuc2ggYi90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdi1ub21kYS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhkYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtcHYtbm9tZGEuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgcHJvY2Vzc19lYWNoX3B2IHdpdGggemVybyBtZGEnCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyAyCisKK3B2Y3JlYXRlICIkZGV2MSIgLS1tZXRhZGF0YWNvcGllcyAwCitwdmNyZWF0ZSAiJGRldjIiCisKK3ZnY3JlYXRlICRTSEFSRUQgJHZnMSAiJGRldjEiICIkZGV2MiIKKworcHZkaXNwbGF5IC1hIC1DIHwgdGVlIGVycgorZ3JlcCAiJGRldjEiIGVycgorZ3JlcCAiJGRldjIiIGVycgorCit2Z3JlbW92ZSAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdi5zaCBiL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXB2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDI5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdi5zaApAQCAtMCwwICsxLDEwNjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdFeGVyY2lzZSB0b29sbGliIHByb2Nlc3NfZWFjaF9wdicKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMTQKKworIworIyBwcm9jZXNzX2VhY2hfcHYgaXMgdXNlZCBieSBhIG51bWJlciBvZiBwdiBjb21tYW5kczoKKyMgcHZkaXNwbGF5CisjIHB2cmVzaXplCisjIHB2cworIworIyBwcm9jZXNzLWVhY2gtcHZyZXNpemUuc2ggY292ZXJzIHB2cmVzaXplLgorIyBwcm9jZXNzLWVhY2gtdmdyZWR1Y2Uuc2ggY292ZXJzIHZncmVkdWNlLgorIworCisKKyMKKyMgc2V0IHVwCisjCisjIHVzZSB1c2UgZGV2MTAgaW5zdGVhZCBvZiBkZXYxIGJlY2F1c2Ugc2ltcGxlIGdyZXAgZm9yCisjIGRldjEgbWF0Y2hpbmVzIGRldjEwLGRldjExLGV0YworIworCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzEgIiRkZXYxMCIKK3ZnY3JlYXRlICRTSEFSRUQgJHZnMiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzMgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQzICIkZGV2MyIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENSAiJGRldjUiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjUiCisKK3B2Y2hhbmdlIC0tYWRkdGFnIFYzICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYzRDkgIiRkZXY5IgorCisjIG9ycGhhbgorcHZjcmVhdGUgIiRkZXYxMSIKKworIyBkZXYgKGEgbm9uLXB2IGRldmljZSkKK3B2Y3JlYXRlICIkZGV2MTIiCitwdnJlbW92ZSAiJGRldjEyIgorCisjIGRldjEzIGlzIGludGVudGlvbmFsbHkgdW50b3VjaGVkIHNvIHdlIGNhbgorIyB0ZXN0IHRoYXQgaXQgaXMgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGFzIGEgbm9uLXB2CisKKyMgb3JwaGFuCitwdmNyZWF0ZSAiJGRldjE0IgorCisKKyMKKyMgdGVzdCBwdmRpc3BsYXkKKyMKKworIyBwdiBpbiB2ZworcHZkaXNwbGF5IC1zICIkZGV2MTAiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgcHYgbm90IGluIHZnIChvbmUgb3JwaGFuKQorcHZkaXNwbGF5IC1zICIkZGV2MTEiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgZGV2IGlzIG5vdCBhIHB2Citub3QgcHZkaXNwbGF5IC1zICIkZGV2MTIiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHR3byBwdnMgaW4gZGlmZmVyZW50IHZncworcHZkaXNwbGF5IC1zICIkZGV2MTAiICIkZGV2MiIgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIC1hIGlzIGludmFsaWQgd2hlbiB1c2VkIGFsb25lCitub3QgcHZkaXNwbGF5IC1hIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9uZSBwdiBhbmQgb25lIG9ycGhhbgorcHZkaXNwbGF5IC1zICIkZGV2MTAiICIkZGV2MTEiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvbmUgcHYgYW5kIG9uZSBkZXYgKGRldiByZWZlcnMgdG8gYSBub24tcHYgZGV2aWNlKQorbm90IHB2ZGlzcGxheSAtcyAiJGRldjEwIiAiJGRldjEyIiB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9uZSBvcnBoYW4gYW5kIG9uZSBkZXYKK25vdCBwdmRpc3BsYXkgLXMgIiRkZXYxMSIgIiRkZXYxMiIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBhbGwgcHZzIChwdnMgaW4gdmdzIGFuZCBvcnBoYW4gcHZzKQorcHZkaXNwbGF5IC1zIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK2dyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK2dyZXAgIiRkZXY0IiBlcnIKK2dyZXAgIiRkZXY1IiBlcnIKK2dyZXAgIiRkZXY2IiBlcnIKK2dyZXAgIiRkZXY3IiBlcnIKK2dyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorZ3JlcCAiJGRldjE0IiBlcnIKKworIyBhbGwgZGV2cyAocHZzIGluIHZncywgb3JwaGFuIHB2cywgYW5kIGRldnMpCitwdmRpc3BsYXkgLWEgLUMgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorZ3JlcCAiJGRldjQiIGVycgorZ3JlcCAiJGRldjUiIGVycgorZ3JlcCAiJGRldjYiIGVycgorZ3JlcCAiJGRldjciIGVycgorZ3JlcCAiJGRldjgiIGVycgorZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK2dyZXAgIiRkZXYxMiIgZXJyCitncmVwICIkZGV2MTMiIGVycgorZ3JlcCAiJGRldjE0IiBlcnIKKworIyBwdiBhbmQgb3JwaGFuIGFuZCBkZXYKK25vdCBwdmRpc3BsYXkgLXMgIiRkZXY5IiAiJGRldjExIiAiJGRldjEyIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgLXMgb3B0aW9uIG5vdCBhbGxvd2VkIHdpdGggLWEgLUMKK25vdCBwdmRpc3BsYXkgLXMgLWEgLUMgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgcHYgYW5kIGFsbCAoYWxsIGlnbm9yZWQpCitwdmRpc3BsYXkgLWEgLUMgIiRkZXY5IiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9ycGhhbiBhbmQgYWxsIChhbGwgaWdub3JlZCkKK3B2ZGlzcGxheSAtYSAtQyAiJGRldjExIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9uZSB0YWcKK3B2ZGlzcGxheSAtcyBAVjJEMyB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHR3byB0YWdzCitwdmRpc3BsYXkgLXMgQFYyRDMgQFYyRDQ1IHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorZ3JlcCAiJGRldjQiIGVycgorZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHRhZyBhbmQgcHYKK3B2ZGlzcGxheSAtcyBAVjJEMyAiJGRldjQiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgYW5kIG9ycGhhbgorcHZkaXNwbGF5IC1zIEBWMkQzICIkZGV2MTEiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgYW5kIGRldgorbm90IHB2ZGlzcGxheSAtcyBAVjJEMyAiJGRldjEyIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHRhZyBhbmQgYWxsIChhbGwgaWdub3JlZCkKK3B2ZGlzcGxheSBAVjJEMyAtYSAtQyB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHRhZyBhbmQgcHYgcmVkdW5kYW50CitwdmRpc3BsYXkgLXMgQFYyRDMgIiRkZXYzIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisKKyMKKyMgdGVzdCBwdnMKKyMKKworIyBwdiBpbiB2ZworcHZzICIkZGV2MTAiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgcHYgbm90IGluIHZnIChvbmUgb3JwaGFuKQorcHZzICIkZGV2MTEiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgZGV2IGlzIG5vdCBhIHB2Citub3QgcHZzICIkZGV2MTIiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHR3byBwdnMgaW4gZGlmZmVyZW50IHZncworcHZzICIkZGV2MTAiICIkZGV2MiIgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9uZSBwdiBhbmQgb25lIG9ycGhhbgorcHZzICIkZGV2MTAiICIkZGV2MTEiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvbmUgcHYgYW5kIG9uZSBkZXYKK25vdCBwdnMgIiRkZXYxMCIgIiRkZXYxMiIgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvbmUgb3JwaGFuIGFuZCBvbmUgZGV2Citub3QgcHZzICIkZGV2MTEiICIkZGV2MTIiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgYWxsIHB2cyAocHZzIGluIHZncyBhbmQgb3JwaGFuIHB2cykKK3B2cyB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitncmVwICIkZGV2NCIgZXJyCitncmVwICIkZGV2NSIgZXJyCitncmVwICIkZGV2NiIgZXJyCitncmVwICIkZGV2NyIgZXJyCitncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK2dyZXAgIiRkZXYxNCIgZXJyCisKKyMgYWxsIGRldnMgKHB2cyBpbiB2Z3MsIG9ycGhhbiBwdnMsIGFuZCBkZXZzKQorcHZzIC1hIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK2dyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK2dyZXAgIiRkZXY0IiBlcnIKK2dyZXAgIiRkZXY1IiBlcnIKK2dyZXAgIiRkZXY2IiBlcnIKK2dyZXAgIiRkZXY3IiBlcnIKK2dyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitncmVwICIkZGV2MTIiIGVycgorZ3JlcCAiJGRldjEzIiBlcnIKK2dyZXAgIiRkZXYxNCIgZXJyCisKKyMgcHYgYW5kIG9ycGhhbiBhbmQgZGV2Citub3QgcHZzICIkZGV2OSIgIiRkZXYxMSIgIiRkZXYxMiIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHB2IGFuZCBhbGwgKGFsbCBpZ25vcmVkKQorcHZzIC1hICIkZGV2OSIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvcnBoYW4gYW5kIGFsbCAoYWxsIGlnbm9yZWQpCitwdnMgLWEgIiRkZXYxMSIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvbmUgdGFnCitwdnMgQFYyRDMgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0d28gdGFncworcHZzIEBWMkQzIEBWMkQ0NSB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK2dyZXAgIiRkZXY0IiBlcnIKK2dyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgYW5kIHB2CitwdnMgQFYyRDMgIiRkZXY0IiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK2dyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgdGFnIGFuZCBvcnBoYW4KK3B2cyBAVjJEMyAiJGRldjExIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgdGFnIGFuZCBkZXYKK25vdCBwdnMgQFYyRDMgIiRkZXYxMiIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgYW5kIGFsbCAoYWxsIGlnbm9yZWQpCitwdnMgQFYyRDMgLWEgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgYW5kIHB2IHJlZHVuZGFudAorcHZzIEBWMkQzICIkZGV2MyIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworCisjCisjIHRlc3RzIGluY2x1ZGluZyBwdnMgd2l0aG91dCBtZGFzCisjCisKKyMgcmVtb3ZlIG9sZCBjb25maWcKK3ZncmVtb3ZlICR2ZzEKK3ZncmVtb3ZlICR2ZzIKK3ZncmVtb3ZlICR2ZzMKK3B2cmVtb3ZlICIkZGV2MTEiCitwdnJlbW92ZSAiJGRldjE0IgorCisjIG5ldyBjb25maWcgd2l0aCBzb21lIHB2cyB0aGF0IGhhdmUgemVybyBtZGFzCisKKyMgZm9yIHZnMQorcHZjcmVhdGUgIiRkZXYxMCIKKworIyBmb3IgdmcyCitwdmNyZWF0ZSAiJGRldjIiIC0tbWV0YWRhdGFjb3BpZXMgMAorcHZjcmVhdGUgIiRkZXYzIgorcHZjcmVhdGUgIiRkZXY0IgorcHZjcmVhdGUgIiRkZXY1IgorCisjIGZvciB2ZzMKK3B2Y3JlYXRlICIkZGV2NiIgLS1tZXRhZGF0YWNvcGllcyAwCitwdmNyZWF0ZSAiJGRldjciIC0tbWV0YWRhdGFjb3BpZXMgMAorcHZjcmVhdGUgIiRkZXY4IiAtLW1ldGFkYXRhY29waWVzIDAKK3B2Y3JlYXRlICIkZGV2OSIKKworIyBvcnBoYW4gd2l0aCBtZGEKK3B2Y3JlYXRlICIkZGV2MTEiCisjIG9ycGhhbiB3aXRob3V0IG1kYQorcHZjcmVhdGUgIiRkZXYxNCIgLS1tZXRhZGF0YWNvcGllcyAwCisKKyMgbm9uLXB2IGRldnMKKyMgZGV2MTIKKyMgZGV2MTMKKwordmdjcmVhdGUgJFNIQVJFRCAkdmcxICIkZGV2MTAiCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgordmdjcmVhdGUgJFNIQVJFRCAkdmczICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKKworcHZjaGFuZ2UgLS1hZGR0YWcgVjJEMyAiJGRldjMiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0ICIkZGV2NCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQ1ICIkZGV2NCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDUgIiRkZXY1IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY1IgorCitwdmNoYW5nZSAtLWFkZHRhZyBWMyAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdmNoYW5nZSAtLWFkZHRhZyBWM0Q4ICIkZGV2OCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYzRDkgIiRkZXY5IgorCisKKyMKKyMgcHZkaXNwbGF5IGluY2x1ZGluZyBwdnMgd2l0aG91dCBtZGFzCisjCisKKyMgcHYgd2l0aCBtZGEKK3B2ZGlzcGxheSAtcyAiJGRldjEwIiB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHB2IHdpdGhvdXQgbWRhCitwdmRpc3BsYXkgLXMgIiRkZXYyIiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIG9ycGhhbiB3aXRoIG1kYQorcHZkaXNwbGF5IC1zICIkZGV2MTEiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitub3QgZ3JlcCAiJGRldjIiIGVycgorbm90IGdyZXAgIiRkZXYzIiBlcnIKK25vdCBncmVwICIkZGV2NCIgZXJyCitub3QgZ3JlcCAiJGRldjUiIGVycgorbm90IGdyZXAgIiRkZXY2IiBlcnIKK25vdCBncmVwICIkZGV2NyIgZXJyCitub3QgZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgb3JwaGFuIHdpdGhvdXQgbWRhCitwdmRpc3BsYXkgLXMgIiRkZXYxNCIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorZ3JlcCAiJGRldjE0IiBlcnIKKworIyBwdiB3aXRoIG1kYSwgcHYgd2l0aG91dCBtZGEsIG9ycGhhbiB3aXRoIG1kYSwgb3JwaGFuIHdpdGhvdXQgbWRhCitwdmRpc3BsYXkgLXMgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjExIiAiJGRldjE0IiB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitncmVwICIkZGV2MTQiIGVycgorCisjIHRhZyByZWZlcmluZyB0byBwdiB3aXRoIG1kYSBhbmQgcHYgd2l0aG91dCBtZGEKK3B2ZGlzcGxheSAtcyBAVjMgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitncmVwICIkZGV2NiIgZXJyCitncmVwICIkZGV2NyIgZXJyCitncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyB0YWcgcmVmZXJpbmcgdG8gb25lIHB2IHdpdGhvdXQgbWRhCitwdmRpc3BsYXkgLXMgQFYzRDggfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK2dyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBhbGwgcHZzIChwdnMgaW4gdmdzIGFuZCBvcnBoYW4gcHZzKQorcHZkaXNwbGF5IC1zIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK2dyZXAgIiRkZXYyIiBlcnIKK2dyZXAgIiRkZXYzIiBlcnIKK2dyZXAgIiRkZXY0IiBlcnIKK2dyZXAgIiRkZXY1IiBlcnIKK2dyZXAgIiRkZXY2IiBlcnIKK2dyZXAgIiRkZXY3IiBlcnIKK2dyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK2dyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorZ3JlcCAiJGRldjE0IiBlcnIKKworIyBhbGwgZGV2cyAocHZzIGluIHZncywgb3JwaGFuIHB2cywgYW5kIGRldnMpCitwdmRpc3BsYXkgLWEgLUMgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorZ3JlcCAiJGRldjQiIGVycgorZ3JlcCAiJGRldjUiIGVycgorZ3JlcCAiJGRldjYiIGVycgorZ3JlcCAiJGRldjciIGVycgorZ3JlcCAiJGRldjgiIGVycgorZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK2dyZXAgIiRkZXYxMiIgZXJyCitncmVwICIkZGV2MTMiIGVycgorZ3JlcCAiJGRldjE0IiBlcnIKKworIworIyBwdnMgaW5jbHVkaW5nIHB2cyB3aXRob3V0IG1kYXMKKyMKKworIyBwdiB3aXRoIG1kYQorcHZzICIkZGV2MTAiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgcHYgd2l0aG91dCBtZGEKK3B2cyAiJGRldjIiIHwgdGVlIGVycgorbm90IGdyZXAgIiRkZXYxMCIgZXJyCitncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorbm90IGdyZXAgIiRkZXYxMSIgZXJyCitub3QgZ3JlcCAiJGRldjEyIiBlcnIKK25vdCBncmVwICIkZGV2MTMiIGVycgorbm90IGdyZXAgIiRkZXYxNCIgZXJyCisKKyMgb3JwaGFuIHdpdGggbWRhCitwdnMgIiRkZXYxMSIgfCB0ZWUgZXJyCitub3QgZ3JlcCAiJGRldjEwIiBlcnIKK25vdCBncmVwICIkZGV2MiIgZXJyCitub3QgZ3JlcCAiJGRldjMiIGVycgorbm90IGdyZXAgIiRkZXY0IiBlcnIKK25vdCBncmVwICIkZGV2NSIgZXJyCitub3QgZ3JlcCAiJGRldjYiIGVycgorbm90IGdyZXAgIiRkZXY3IiBlcnIKK25vdCBncmVwICIkZGV2OCIgZXJyCitub3QgZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitub3QgZ3JlcCAiJGRldjE0IiBlcnIKKworIyBvcnBoYW4gd2l0aG91dCBtZGEKK3B2cyAiJGRldjE0IiB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitub3QgZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitncmVwICIkZGV2MTQiIGVycgorCisjIHB2IHdpdGggbWRhLCBwdiB3aXRob3V0IG1kYSwgb3JwaGFuIHdpdGggbWRhLCBvcnBoYW4gd2l0aG91dCBtZGEKK3B2cyAiJGRldjEwIiAiJGRldjIiICIkZGV2MTEiICIkZGV2MTQiIHwgdGVlIGVycgorZ3JlcCAiJGRldjEwIiBlcnIKK2dyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorbm90IGdyZXAgIiRkZXY4IiBlcnIKK25vdCBncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK2dyZXAgIiRkZXYxNCIgZXJyCisKKyMgdGFnIHJlZmVyaW5nIHRvIHB2IHdpdGggbWRhIGFuZCBwdiB3aXRob3V0IG1kYQorcHZzIEBWMyB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK2dyZXAgIiRkZXY2IiBlcnIKK2dyZXAgIiRkZXY3IiBlcnIKK2dyZXAgIiRkZXY4IiBlcnIKK2dyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIHRhZyByZWZlcmluZyB0byBvbmUgcHYgd2l0aG91dCBtZGEKK3B2cyBAVjNEOCB8IHRlZSBlcnIKK25vdCBncmVwICIkZGV2MTAiIGVycgorbm90IGdyZXAgIiRkZXYyIiBlcnIKK25vdCBncmVwICIkZGV2MyIgZXJyCitub3QgZ3JlcCAiJGRldjQiIGVycgorbm90IGdyZXAgIiRkZXY1IiBlcnIKK25vdCBncmVwICIkZGV2NiIgZXJyCitub3QgZ3JlcCAiJGRldjciIGVycgorZ3JlcCAiJGRldjgiIGVycgorbm90IGdyZXAgIiRkZXY5IiBlcnIKK25vdCBncmVwICIkZGV2MTEiIGVycgorbm90IGdyZXAgIiRkZXYxMiIgZXJyCitub3QgZ3JlcCAiJGRldjEzIiBlcnIKK25vdCBncmVwICIkZGV2MTQiIGVycgorCisjIGFsbCBwdnMgKHB2cyBpbiB2Z3MgYW5kIG9ycGhhbiBwdnMpCitwdnMgfCB0ZWUgZXJyCitncmVwICIkZGV2MTAiIGVycgorZ3JlcCAiJGRldjIiIGVycgorZ3JlcCAiJGRldjMiIGVycgorZ3JlcCAiJGRldjQiIGVycgorZ3JlcCAiJGRldjUiIGVycgorZ3JlcCAiJGRldjYiIGVycgorZ3JlcCAiJGRldjciIGVycgorZ3JlcCAiJGRldjgiIGVycgorZ3JlcCAiJGRldjkiIGVycgorZ3JlcCAiJGRldjExIiBlcnIKK25vdCBncmVwICIkZGV2MTIiIGVycgorbm90IGdyZXAgIiRkZXYxMyIgZXJyCitncmVwICIkZGV2MTQiIGVycgorCisjIGFsbCBkZXZzIChwdnMgaW4gdmdzLCBvcnBoYW4gcHZzLCBhbmQgZGV2cykKK3B2cyAtYSB8IHRlZSBlcnIKK2dyZXAgIiRkZXYxMCIgZXJyCitncmVwICIkZGV2MiIgZXJyCitncmVwICIkZGV2MyIgZXJyCitncmVwICIkZGV2NCIgZXJyCitncmVwICIkZGV2NSIgZXJyCitncmVwICIkZGV2NiIgZXJyCitncmVwICIkZGV2NyIgZXJyCitncmVwICIkZGV2OCIgZXJyCitncmVwICIkZGV2OSIgZXJyCitncmVwICIkZGV2MTEiIGVycgorZ3JlcCAiJGRldjEyIiBlcnIKK2dyZXAgIiRkZXYxMyIgZXJyCitncmVwICIkZGV2MTQiIGVycgorCit2Z3JlbW92ZSAkdmcxICR2ZzIgJHZnMwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtcHZyZXNpemUuc2ggYi90ZXN0L3NoZWxsL3Byb2Nlc3MtZWFjaC1wdnJlc2l6ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmMyYTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtcHZyZXNpemUuc2gKQEAgLTAsMCArMSw1NjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249J0V4ZXJjaXNlIHRvb2xsaWIgcHJvY2Vzc19lYWNoX3B2JworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMTQKKworIworIyBwcm9jZXNzX2VhY2hfcHYgaXMgdXNlZCBieSBhIG51bWJlciBvZiBwdiBjb21tYW5kczoKKyMgcHZkaXNwbGF5CisjIHB2cmVzaXplCisjIHB2cworIyB2Z3JlZHVjZQorIworCisKKyMKKyMgc2V0IHVwCisjCisjIHVzZSB1c2UgZGV2MTAgaW5zdGVhZCBvZiBkZXYxIGJlY2F1c2Ugc2ltcGxlIGdyZXAgZm9yCisjIGRldjEgbWF0Y2hpbmVzIGRldjEwLGRldjExLGV0YworIworCit2Z2NyZWF0ZSAkdmcxICIkZGV2MTAiCit2Z2NyZWF0ZSAkdmcyICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKK3ZnY3JlYXRlICR2ZzMgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQzICIkZGV2MyIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENSAiJGRldjUiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjUiCisKK3B2Y2hhbmdlIC0tYWRkdGFnIFYzICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYzRDkgIiRkZXY5IgorCisjIG9ycGhhbgorcHZjcmVhdGUgIiRkZXYxMSIKKworIyBkZXYgKGEgbm9uLXB2IGRldmljZSkKK3B2Y3JlYXRlICIkZGV2MTIiCitwdnJlbW92ZSAiJGRldjEyIgorCisjIGRldjEzIGlzIGludGVudGlvbmFsbHkgdW50b3VjaGVkIHNvIHdlIGNhbgorIyB0ZXN0IHRoYXQgaXQgaXMgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGFzIGEgbm9uLXB2CisKKyMgb3JwaGFuCitwdmNyZWF0ZSAiJGRldjE0IgorCisjCisjIHRlc3QgcHZyZXNpemUgd2l0aG91dCBvcnBoYW5zIGFuZCBhbmQgd2l0aG91dCBub24tcHYgZGV2cworIworCisjIEZvciBwdnMgaW4gdmdzLCBwdnJlc2l6ZSBzZXRwaHlzaWNhbHZvbHVtZXNpemUgZG9lcyBub3QgZ2l2ZSB1cworIyB0aGUgc2l6ZSByZXF1ZXN0ZWQsIGJ1dCByZWR1Y2VzIHRoZSByZXF1ZXN0ZWQgc2l6ZSBieSBzb21lIHRoZQorIyBhbW91bnQgZm9yIGFsaWdubWVudCwgbWV0YWRhdGEgYXJlYXMgYW5kIHB2IGhlYWRlcnMuICBTbywgd2hlbiB3ZSByZXNpemUKKyMgdG8gMzBNLCB0aGUgcmVzdWx0IGlzIDI4TSwgYW5kIHdoZW4gd2UgcmVzaXplIHRvIDIwTSwgdGhlIHJlc3VsdCBpcyAxNk0uCisjIEZvciBvcnBoYW5zLCB0aGUgcmVzdWx0aW5nIHNpemUgaXMgdGhlIHNhbWUgYXMgcmVxdWVzdGVkLgorIyBJdCBzdXNwZWN0IHRoYXQgdGhlc2UgcmVkdWN0aW9uIGFtb3VudHMgbWlnaHQgYmUgaW5jb25zaXN0ZW50LCBhbmQKKyMgZGVwZW5kIG9uIG90aGVyIGNoYW5naW5nIGZhY3RvcnMsIHNvIGl0IG1heSBiZSB0aGF0IHdlIGV2ZW50dWFsbHkKKyMgd2FudCB0byBnaXZlIHVwIGNoZWNraW5nIHRoZSBleGFjdCByZXN1bHRpbmcgc2l6ZSwgYnV0IGp1c3QgY2hlY2sKKyMgdGhhdCB0aGUgcmVzdWx0IGlzIGxlc3MgdGhhbiB0aGUgb3JpZ2luYWwgc2l6ZS4KKworb2xkX3JlcXVlc3Q9IjMwLjAwbSIKK29sZF9yZWR1Y2VkPSIyOC4wMG0iCituZXdfcmVxdWVzdD0iMjAuMDBtIgorbmV3X3JlZHVjZWQ9IjE2LjAwbSIKKworcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKKworIyBvbmUgcHYKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCAiJGRldjEwIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKKworIyB0d28gcHZzIGluIHNlcGFyYXRlIHZncworcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2MiIgIiRkZXY2IgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRuZXdfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRuZXdfcmVkdWNlZAorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKKworIyBvbmUgdGFnIG9uIG9uZSBwdgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0IEBWMkQ0CitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG5ld19yZWR1Y2VkCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorCisjIG9uZSB0YWcgb24gYWxsIHB2cyBpbiBvbmUgdmcKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCBAVjMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKKyMgb25lIHRhZyBvbiBzb21lIHB2cyBpbiBvbmUgdmcKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCBAVjJENDUKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKKyMgb25lIHRhZyBvbiBtdWx0aXBsZSBwdnMgaW4gc2VwYXJhdGUgdmdzCitwdmNoYW5nZSAtLWFkZHRhZyBWMTIgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0IEBWMTIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG5ld19yZWR1Y2VkCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKKyMgb25lIHB2IGFuZCBvbmUgdGFnIG9uIGRpZmZlcmVudCBwdgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2MTAiIEBWM0Q5CitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRuZXdfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRuZXdfcmVkdWNlZAorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorCisjIHJlZHVuZGFudCBwdiBhbmQgdGFnCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXY5IiBAVjNEOQorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRuZXdfcmVkdWNlZAorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKKworIyB0d28gdGFncyBvbiBwdnMgaW4gc2VwYXJhdGUgdmdzCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgQFYzRDkgQFYyRDMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKKworIworIyB0ZXN0IHB2cmVzaXplIHdpdGggb3JwaGFucworIworCitvbGRfcmVxdWVzdD0iMzAuMDBtIgorb2xkX3JlZHVjZWQ9IjI4LjAwbSIKK29sZF9vcnBoYW49IjMwLjAwbSIKK25ld19yZXF1ZXN0PSIyMC4wMG0iCituZXdfcmVkdWNlZD0iMTYuMDBtIgorbmV3X29ycGhhbj0iMjAuMDBtIgorCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjExIiBwdl9zaXplICRvbGRfb3JwaGFuCitjaGVjayBwdl9maWVsZCAiJGRldjE0IiBwdl9zaXplICRvbGRfb3JwaGFuCisKKyMgb25lIG9ycGhhbgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2MTEiCitjaGVjayBwdl9maWVsZCAiJGRldjExIiBwdl9zaXplICRuZXdfb3JwaGFuCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKyMgdHdvIG9ycGhhbnMKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCAiJGRldjExIiAiJGRldjE0IgorY2hlY2sgcHZfZmllbGQgIiRkZXYxMSIgcHZfc2l6ZSAkbmV3X29ycGhhbgorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkbmV3X29ycGhhbgorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjExIiAiJGRldjE0IgorCisjIG9uZSBvcnBoYW4sIG9uZSB0YWcKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCBAVjNEOSAiJGRldjE0IgorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRuZXdfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkbmV3X29ycGhhbgorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjExIiBwdl9zaXplICRvbGRfb3JwaGFuCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjExIiAiJGRldjE0IgorCisjIG9uZSBwdiwgb25lIG9ycGhhbiwgb25lIHRhZworcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0IEBWM0Q5ICIkZGV2MTQiICIkZGV2MTAiCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRuZXdfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkbmV3X29ycGhhbgorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKworIworIyB0ZXN0IHB2cmVzaXplIHdpdGggbm9uLXB2IGRldnMKKyMKKworIyBvbmUgZGV2IChub24tcHYpCitub3QgcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2MTMiCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG9sZF9vcnBoYW4KKworIyBvbmUgb3JwaGFuIGFuZCBvbmUgZGV2IChub24tcHYpCitub3QgcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2MTQiICIkZGV2MTMiCitjaGVjayBwdl9maWVsZCAiJGRldjE0IiBwdl9zaXplICRuZXdfb3JwaGFuCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKyMgb25lIHB2IGFuZCBvbmUgZGV2IChub24tcHYpCitub3QgcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0ICIkZGV2OSIgIiRkZXYxMyIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMSIgcHZfc2l6ZSAkb2xkX29ycGhhbgorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkb2xkX29ycGhhbgorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKKworIyBvbmUgdGFnIGFuZCBvbmUgZGV2IChub24tcHYpCitub3QgcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0IEBWM0Q5ICIkZGV2MTMiCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG5ld19yZWR1Y2VkCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKyMgb25lIHB2LCBvbmUgb3JwaGFuLCBvbmUgdGFnLCBvbmUgZGV2Citub3QgcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG5ld19yZXF1ZXN0IEBWM0Q5ICIkZGV2MTMiICIkZGV2MTQiICIkZGV2MTAiCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRuZXdfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkbmV3X29ycGhhbgorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKworIworIyBwdnJlc2l6ZSBpbmNsdWRpbmcgcHZzIHdpdGhvdXQgbWRhcworIworCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjExIiBwdl9zaXplICRvbGRfb3JwaGFuCitjaGVjayBwdl9maWVsZCAiJGRldjE0IiBwdl9zaXplICRvbGRfb3JwaGFuCisKKyMgb25lIHB2IHdpdGhvdXQgbWRhCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXYyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRuZXdfcmVkdWNlZAorIyB1bmNoYW5nZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTAiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHB2X3NpemUgJG9sZF9yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjExIiBwdl9zaXplICRvbGRfb3JwaGFuCitjaGVjayBwdl9maWVsZCAiJGRldjE0IiBwdl9zaXplICRvbGRfb3JwaGFuCisjIHJlc2V0IGJhY2sgdG8gb2xkIHNpemUKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjEwIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICIkZGV2NiIgIiRkZXY3IiAiJGRldjgiICIkZGV2OSIKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRvbGRfcmVxdWVzdCAiJGRldjExIiAiJGRldjE0IgorCisjIHR3byBwdnMgd2l0aG91dCBtZGFzCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXY2IiAiJGRldjciCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHB2X3NpemUgJG5ld19yZWR1Y2VkCitjaGVjayBwdl9maWVsZCAiJGRldjciIHB2X3NpemUgJG5ld19yZWR1Y2VkCisjIHVuY2hhbmdlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkb2xkX3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG9sZF9vcnBoYW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG9sZF9vcnBoYW4KKyMgcmVzZXQgYmFjayB0byBvbGQgc2l6ZQorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTAiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZyZXNpemUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgJG9sZF9yZXF1ZXN0ICIkZGV2MTEiICIkZGV2MTQiCisKKyMgb25lIHB2IHdpdGggbWRhIGFuZCBvbmUgcHYgd2l0aG91dCBtZGEKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCAiJGRldjgiICIkZGV2OSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMSIgcHZfc2l6ZSAkb2xkX29ycGhhbgorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkb2xkX29ycGhhbgorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKKworIyBvbmUgb3JwaGFuIHdpdGggbWRhCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXYxMSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG5ld19vcnBoYW4KKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxNCIgcHZfc2l6ZSAkb2xkX29ycGhhbgorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKKworIyBvbmUgb3JwaGFuIHdpdGhvdXQgbWRhCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXYxNCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG5ld19vcnBoYW4KKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYxMSIgcHZfc2l6ZSAkb2xkX29ycGhhbgorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKKworIyBvbmUgb3JwaGFuIHdpdGggbWRhIGFuZCBvbmUgb3JwaGFuIHdpdGhvdXQgbWRhCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkbmV3X3JlcXVlc3QgIiRkZXYxNCIgIiRkZXYxMSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG5ld19vcnBoYW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG5ld19vcnBoYW4KKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY4IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY5IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKKworIyBvbmUgcHYgd2l0aCBtZGEgYW5kIG9uZSBwdiB3aXRob3V0IG1kYSwgYW5kCisjIG9uZSBvcnBoYW4gd2l0aCBtZGEgYW5kIG9uZSBvcnBoYW4gd2l0aG91dCBtZGEKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplICRuZXdfcmVxdWVzdCAiJGRldjgiICIkZGV2OSIgIiRkZXYxNCIgIiRkZXYxMSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgcHZfc2l6ZSAkbmV3X3JlZHVjZWQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTEiIHB2X3NpemUgJG5ld19vcnBoYW4KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MTQiIHB2X3NpemUgJG5ld19vcnBoYW4KKyMgdW5jaGFuZ2VkCitjaGVjayBwdl9maWVsZCAiJGRldjEwIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiBwdl9zaXplICRvbGRfcmVkdWNlZAorY2hlY2sgcHZfZmllbGQgIiRkZXY3IiBwdl9zaXplICRvbGRfcmVkdWNlZAorIyByZXNldCBiYWNrIHRvIG9sZCBzaXplCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMCIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCitwdnJlc2l6ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAkb2xkX3JlcXVlc3QgIiRkZXYxMSIgIiRkZXYxNCIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXZnLnNoIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtdmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3YjcxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXZnLnNoCkBAIC0wLDAgKzEsMjY4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdFeGVyY2lzZSB0b29sbGliIHByb2Nlc3NfZWFjaF92ZycKKworU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyA2CisKKyMKKyMgcHJvY2Vzc19lYWNoX3ZnIGlzIHVzZWQgYnkgYSBudW1iZXIgb2YgdmcgY29tbWFuZHM7CisjIHVzZSAndmdyZW1vdmUnIGFuZCAndmdzJyB0byB0ZXN0IGl0LgorIworIyBUaGUgbG9naWMgaW4gcHJvY2Vzc19lYWNoX3ZnIGlzIG1haW5seSByZWxhdGVkIHRvCisjIHNlbGVjdGluZyB3aGljaCB2ZydzIHRvIHByb2Nlc3MuCisjCisKKyMKKyMgc2V0IHVwIGZvdXIgdmdzIHRoYXQgd2Ugd2lsbCByZW1vdmUKKyMKK3ZnY3JlYXRlICRTSEFSRUQgJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzIgIiRkZXYyIgordmdjcmVhdGUgJFNIQVJFRCAkdmczICIkZGV2MyIKK3ZnY3JlYXRlICRTSEFSRUQgJHZnNCAiJGRldjQiCisKKyMgdGhlc2UgdHdvIHZncyB3aWxsIG5vdCBiZSByZW1vdmVkCit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzUgIiRkZXY1IgordmdjaGFuZ2UgLS1hZGR0YWcgdGFndmc1ICR2ZzUKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MSAkdmc1Cit2Z2NyZWF0ZSAkU0hBUkVEICR2ZzYgIiRkZXY2IgorbHZjcmVhdGUgLWwgNCAtbiAkbHYyICR2ZzYKKworIyBzaG91bGQgZmFpbCB3aXRob3V0IGFueSBhcmcKK25vdCB2Z3JlbW92ZQorCisjIHNob3VsZCBzdWNjZWVkCit2Z3JlbW92ZSAkdmcxCit2Z3JlbW92ZSAkdmcyICR2ZzMgJHZnNAorCisjIHRoZXNlIHNob3VsZCBmYWlsIGJlY2F1c2UgdGhleSBhcmUgYWxyZWFkeSByZW1vdmVkCitub3QgdmdyZW1vdmUgJHZnMQorbm90IHZncmVtb3ZlICR2ZzIKK25vdCB2Z3JlbW92ZSAkdmczCitub3QgdmdyZW1vdmUgJHZnNAorCisjIHRoZXNlIHNob3VsZCBmYWlsIGJlY2F1c2UgdGhleSBoYXZlIGx2cyBpbiB0aGVtCitub3QgdmdyZW1vdmUgJHZnNQorbm90IHZncmVtb3ZlICR2ZzYKKworIyBjaGVjayB0aGF0IHRoZSB2Z3Mgd2UgcmVtb3ZlZCBhcmUgZ29uZQorbm90IHZncyAkdmcxCitub3QgdmdzICR2ZzIKK25vdCB2Z3MgJHZnMworbm90IHZncyAkdmc0CisKKworIworIyBzZXQgdXAgZm91ciB2Z3MgdGhhdCB3ZSB3aWxsIHJlbW92ZQorIwordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbyAkdmcyICIkZGV2MiIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vMiAkdmczICIkZGV2MyIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnYmFyICR2ZzQgIiRkZXY0IgordmdjaGFuZ2UgLS1hZGR0YWcgZm9vICR2ZzQKKworIyBzaG91bGQgZG8gbm90aGluZyBhbmQgZmFpbAorbm90IHZncmVtb3ZlIGdhcmJhZ2UKKworIyBzaG91bGQgZmluZCBub3RoaW5nIHRvIHJlbW92ZQordmdyZW1vdmUgQGdhcmJhZ2UKKworIyBzaG91bGQgZmluZCBub3RoaW5nIHRvIHJlbW92ZQordmdyZW1vdmUgQCR2ZzEKKworIyBzaG91bGQgc3VjY2VlZAordmdyZW1vdmUgJHZnMQorbm90IHZncyAkdmcxCisKK3ZncmVtb3ZlICR2ZzIgJHZnMyAkdmc0Citub3QgdmdzICR2ZzIKK25vdCB2Z3MgJHZnMworbm90IHZncyAkdmc0CisKKworIworIyBzZXQgdXAgZm91ciB2Z3MgdGhhdCB3ZSB3aWxsIHJlbW92ZQorIwordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbyAkdmcyICIkZGV2MiIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vMiAkdmczICIkZGV2MyIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnYmFyICR2ZzQgIiRkZXY0IgordmdjaGFuZ2UgLS1hZGR0YWcgZm9vICR2ZzQKKwordmdyZW1vdmUgQHRhZ2Zvbworbm90IHZncyAkdmcxCitub3QgdmdzICR2ZzIKKwordmdyZW1vdmUgQHRhZ2ZvbzIgQHRhZ2Jhcgorbm90IHZncyAkdmczCitub3QgdmdzICR2ZzQKKworCisjCisjIHNldCB1cCBmb3VyIHZncyB0aGF0IHdlIHdpbGwgcmVtb3ZlCisjCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbyAkdmcxICIkZGV2MSIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vICR2ZzIgIiRkZXYyIgordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28yICR2ZzMgIiRkZXYzIgordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdiYXIgJHZnNCAiJGRldjQiCit2Z2NoYW5nZSAtLWFkZHRhZyBmb28gJHZnNAorCit2Z3JlbW92ZSAkdmcxIEB0YWdmb28yCitub3QgdmdzICR2ZzEKK25vdCB2Z3MgJHZnMworCit2Z3JlbW92ZSBAdGFnYmFyICR2ZzIKK25vdCB2Z3MgJHZnMgorbm90IHZncyAkdmc0CisKKworIworIyBzZXQgdXAgZm91ciB2Z3MgdGhhdCB3ZSB3aWxsIHJlbW92ZQorIwordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbyAkdmcyICIkZGV2MiIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vMiAkdmczICIkZGV2MyIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnYmFyICR2ZzQgIiRkZXY0IgordmdjaGFuZ2UgLS1hZGR0YWcgZm9vICR2ZzQKKwordmdyZW1vdmUgQGZvbyBAdGFnZm9vMiAkdmcxICR2ZzIKK25vdCB2Z3MgJHZnMQorbm90IHZncyAkdmcyCitub3QgdmdzICR2ZzMKK25vdCB2Z3MgJHZnNAorCisKKyMKKyMgc2V0IHVwIGZvdXIgdmdzIHRoYXQgd2Ugd2lsbCByZW1vdmUKKyMKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vICR2ZzEgIiRkZXYxIgordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMiAiJGRldjIiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbzIgJHZnMyAiJGRldjMiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2JhciAkdmc0ICIkZGV2NCIKK3ZnY2hhbmdlIC0tYWRkdGFnIGZvbyAkdmc0CisKK3ZncmVtb3ZlIEB0YWdmb28gJHZnMSBAdGFnZm9vIEB0YWdmb28yICR2ZzMgQHRhZ2Jhcgorbm90IHZncyAkdmcxCitub3QgdmdzICR2ZzIKK25vdCB2Z3MgJHZnMworbm90IHZncyAkdmc0CisKKworIworIyBzZXQgdXAgZm91ciB2Z3MgdGhhdCB3ZSB3aWxsIHJlbW92ZQorIwordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMSAiJGRldjEiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbyAkdmcyICIkZGV2MiIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vMiAkdmczICIkZGV2MyIKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnYmFyICR2ZzQgIiRkZXY0IgordmdjaGFuZ2UgLS1hZGR0YWcgZm9vICR2ZzQKKworbm90IHZncmVtb3ZlIGdhcmJhZ2UgJHZnMQorbm90IHZncyAkdmcxCisKK25vdCB2Z3JlbW92ZSAkdmcyIGdhcmJhZ2UKK25vdCB2Z3MgJHZnMgorCit2Z3JlbW92ZSAkdmczIEBnYXJiYWdlCitub3QgdmdzICR2ZzMKKwordmdyZW1vdmUgQGdhcmJhZ2UgJHZnNAorbm90IHZncyAkdmc0CisKKworIworIyBlbmQgdmdyZW1vdmUgdGVzdHMKKyMgY2hlY2sgdGhhdCB0aGUgdHdvIHZncyB3ZSBkaWQgbm90IGludGVuZCB0byByZW1vdmUKKyMgYXJlIHN0aWxsIHRoZXJlLCBhbmQgdGhlbiByZW1vdmUgdGhlbQorIwordmdzICR2ZzUKK3ZncyAkdmc2Cit2Z3JlbW92ZSAtZiAkdmc1Cit2Z3JlbW92ZSAtZiAkdmc2Citub3QgdmdzICR2ZzUKK25vdCB2Z3MgJHZnNgorCisKKyMKKyMgc2V0IHVwIGZvdXIgdmdzIHRoYXQgd2Ugd2lsbCByZXBvcnQKKyMKK3ZnY3JlYXRlICRTSEFSRUQgLS1hZGR0YWcgdGFnZm9vICR2ZzEgIiRkZXYxIgordmdjcmVhdGUgJFNIQVJFRCAtLWFkZHRhZyB0YWdmb28gJHZnMiAiJGRldjIiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2ZvbzIgJHZnMyAiJGRldjMiCit2Z2NyZWF0ZSAkU0hBUkVEIC0tYWRkdGFnIHRhZ2JhciAkdmc0ICIkZGV2NCIKK3ZnY2hhbmdlIC0tYWRkdGFnIGZvbyAkdmc0CisKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICR2ZzIgZXJyCitncmVwICR2ZzMgZXJyCitncmVwICR2ZzQgZXJyCisKK3ZncyAkdmcxICR2ZzIgPmVycgorZ3JlcCAkdmcxIGVycgorZ3JlcCAkdmcyIGVycgorbm90IGdyZXAgJHZnMyBlcnIKK25vdCBncmVwICR2ZzQgZXJyCisKK3ZncyBAdGFnZm9vID5lcnIKK2dyZXAgJHZnMSBlcnIKK2dyZXAgJHZnMiBlcnIKK25vdCBncmVwICR2ZzMgZXJyCitub3QgZ3JlcCAkdmc0IGVycgorCit2Z3MgQHRhZ2ZvbzIgPmVycgorZ3JlcCAkdmczIGVycgorbm90IGdyZXAgJHZnMSBlcnIKK25vdCBncmVwICR2ZzIgZXJyCitub3QgZ3JlcCAkdmc0IGVycgorCit2Z3MgQHRhZ2ZvbzIgQHRhZ2JhciA+ZXJyCitncmVwICR2ZzMgZXJyCitncmVwICR2ZzQgZXJyCitub3QgZ3JlcCAkdmcxIGVycgorbm90IGdyZXAgJHZnMiBlcnIKKwordmdzICR2ZzEgQHRhZ2JhciA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICR2ZzQgZXJyCitub3QgZ3JlcCAkdmcyIGVycgorbm90IGdyZXAgJHZnMyBlcnIKKwordmdzICR2ZzEgQHRhZ2ZvbyA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICR2ZzIgZXJyCitub3QgZ3JlcCAkdmczIGVycgorbm90IGdyZXAgJHZnNCBlcnIKKworbm90IHZncyBnYXJiYWdlID5lcnIKK25vdCBncmVwICR2ZzEgZXJyCitub3QgZ3JlcCAkdmcyIGVycgorbm90IGdyZXAgJHZnMyBlcnIKK25vdCBncmVwICR2ZzQgZXJyCisKK25vdCB2Z3MgZ2FyYmFnZSAkdmcxID5lcnIKK2dyZXAgJHZnMSBlcnIKK25vdCBncmVwICR2ZzIgZXJyCitub3QgZ3JlcCAkdmczIGVycgorbm90IGdyZXAgJHZnNCBlcnIKKwordmdzIEBnYXJiYWdlIEBmb28gPmVycgorZ3JlcCAkdmc0IGVycgorbm90IGdyZXAgJHZnMSBlcnIKK25vdCBncmVwICR2ZzIgZXJyCitub3QgZ3JlcCAkdmczIGVycgorCit2Z3JlbW92ZSAtZiAkdmcxICR2ZzIgJHZnMyAkdmc0CisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXZncmVkdWNlLnNoIGIvdGVzdC9zaGVsbC9wcm9jZXNzLWVhY2gtdmdyZWR1Y2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMDI0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHJvY2Vzcy1lYWNoLXZncmVkdWNlLnNoCkBAIC0wLDAgKzEsMzMwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0nRXhlcmNpc2UgdG9vbGxpYiBwcm9jZXNzX2VhY2hfcHYgd2l0aCB2Z3JlZHVjZScKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMTQKKworIworIyBzZXQgdXAKKyMKKyMgRklYTUU6IHNvbWUgb2YgdGhlIHNldHVwIG1heSBub3QgYmUgdXNlZCBieSB0aGUgdGVzdHMKKyMgc2luY2UgdGhpcyB3YXMgc3BsaXQgb3V0IGZyb20gcHJvY2Vzcy1lYWNoLXB2LCB3aGVyZQorIyBzb21lIG9mIHRoZSBzZXR1cCB3YXMgdXNlZCBieSBvdGhlciB0ZXN0cyB0aGF0IG9ubHkKKyMgcmVtYWluIGluIHByb2Nlc3MtZWFjaC1wdi4KKyMKKyMgdXNlIHVzZSBkZXYxMCBpbnN0ZWFkIG9mIGRldjEgYmVjYXVzZSBzaW1wbGUgZ3JlcCBmb3IKKyMgZGV2MSBtYXRjaGluZXMgZGV2MTAsZGV2MTEsZXRjCisjCisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxMCIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgordmdjcmVhdGUgJHZnMyAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDMgIiRkZXYzIgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENCAiJGRldjQiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjQiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ1ICIkZGV2NSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQ1ICIkZGV2NSIKKworcHZjaGFuZ2UgLS1hZGR0YWcgVjMgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjNEOSAiJGRldjkiCisKKyMgb3JwaGFuCitwdmNyZWF0ZSAiJGRldjExIgorCisjIGRldiAoYSBub24tcHYgZGV2aWNlKQorcHZjcmVhdGUgIiRkZXYxMiIKK3B2cmVtb3ZlICIkZGV2MTIiCisKKyMgZGV2MTMgaXMgaW50ZW50aW9uYWxseSB1bnRvdWNoZWQgc28gd2UgY2FuCisjIHRlc3QgdGhhdCBpdCBpcyBoYW5kbGVkIGFwcHJvcHJpYXRlbHkgYXMgYSBub24tcHYKKworIyBvcnBoYW4KK3B2Y3JlYXRlICIkZGV2MTQiCisKKworIyBmYWlsIHdpdGhvdXQgZGV2Citub3QgdmdyZWR1Y2UgJHZnMgorCisKKyMgZmFpbCB3aXRoIGRldiBhbmQgLWEKK25vdCB2Z3JlZHVjZSAkdmcyICIkZGV2MiIgLWEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjMiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY3IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworCisKKyMgcmVtb3ZlIG9uZSBwdgordmdyZWR1Y2UgJHZnMiAiJGRldjIiCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjciIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY4IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgdmdfbmFtZSAkdmczCisjIHJlc2V0Cit2Z2V4dGVuZCAkdmcyICIkZGV2MiIKKworCisjIHJlbW92ZSB0d28gcHZzCit2Z3JlZHVjZSAkdmcyICIkZGV2MiIgIiRkZXYzIgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY5IiB2Z19uYW1lICR2ZzMKKyMgcmVzZXQKK3ZnZXh0ZW5kICR2ZzIgIiRkZXYyIiAiJGRldjMiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQzICIkZGV2MyIKKworCisjIHJlbW92ZSBvbmUgcHYgd2l0aCB0YWcKK3ZncmVkdWNlICR2ZzIgQFYyRDMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY5IiB2Z19uYW1lICR2ZzMKKyMgcmVzZXQKK3ZnZXh0ZW5kICR2ZzIgIiRkZXYzIgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJEMyAiJGRldjMiCisKKworIyByZW1vdmUgdHdvIHB2cywgZWFjaCB3aXRoIGRpZmZlcmVudCB0YWcKK3ZncmVkdWNlICR2ZzIgQFYyRDMgQFYyRDQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjciIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY4IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgdmdfbmFtZSAkdmczCisjIHJlc2V0Cit2Z2V4dGVuZCAkdmcyICIkZGV2MyIgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJEMyAiJGRldjMiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0ICIkZGV2NCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQ1ICIkZGV2NCIKKworCisjIHJlbW92ZSB0d28gcHZzLCBib3RoIHdpdGggc2FtZSB0YWcKK3ZncmVkdWNlICR2ZzIgQFYyRDQ1CitjaGVjayBwdl9maWVsZCAiJGRldjIiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2NSIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY3IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworIyByZXNldAordmdleHRlbmQgJHZnMiAiJGRldjQiICIkZGV2NSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENSAiJGRldjUiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjUiCisKKworIyByZW1vdmUgdHdvIHB2cywgb25lIGJ5IG5hbWUsIG9uZSBieSB0YWcKK3ZncmVkdWNlICR2ZzIgIiRkZXYyIiBAVjJEMworbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY5IiB2Z19uYW1lICR2ZzMKKyMgcmVzZXQKK3ZnZXh0ZW5kICR2ZzIgIiRkZXYyIiAiJGRldjMiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQzICIkZGV2MyIKKworCisjIHJlbW92ZSBvbmUgcHYgYnkgdGFnLCB3aGVyZSBhbm90aGVyIHZnIGhhcyBhIHB2IHdpdGggc2FtZSB0YWcKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDVWM0Q5ICIkZGV2NSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDVWM0Q5ICIkZGV2OSIKK3ZncmVkdWNlICR2ZzIgQFYyRDVWM0Q5CitjaGVjayBwdl9maWVsZCAiJGRldjIiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXY1IiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjciIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY4IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OSIgdmdfbmFtZSAkdmczCisjIHJlc2V0Cit2Z2V4dGVuZCAkdmcyICIkZGV2NSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDUgIiRkZXY1IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY1IgorCisKKyMgZmFpbCB0byByZW1vdmUgbGFzdCBwdiAoZG9uJ3Qga25vdyB3aGljaCB3aWxsIGJlIGxhc3QpCitub3QgdmdyZWR1Y2UgLWEgJHZnMgorIyByZXNldAordmdyZW1vdmUgJHZnMgordmdjcmVhdGUgJHZnMiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQzICIkZGV2MyIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY0IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENSAiJGRldjUiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjUiCisKKworIyBsdmNyZWF0ZSBvbiBvbmUgcHYgdG8gbWFrZSBpdCB1c2VkCisjIHJlbW92ZSBhbGwgdW51c2VkIHB2cworbHZjcmVhdGUgLW4gJGx2MSAtbCAyICR2ZzIgIiRkZXYyIgorbm90IHZncmVkdWNlIC1hICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSAkdmcyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2NSIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY3IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworIyByZXNldAordmdleHRlbmQgJHZnMiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJEMyAiJGRldjMiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0ICIkZGV2NCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQ1ICIkZGV2NCIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDUgIiRkZXY1IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENDUgIiRkZXY1IgorbHZjaGFuZ2UgLWFuICR2ZzIvJGx2MQorbHZyZW1vdmUgJHZnMi8kbHYxCisKKworIworIyB0ZXN0cyBpbmNsdWRpbmcgcHZzIHdpdGhvdXQgbWRhcworIworCisjIHJlbW92ZSBvbGQgY29uZmlnCit2Z3JlbW92ZSAkdmcxCit2Z3JlbW92ZSAkdmcyCit2Z3JlbW92ZSAkdmczCitwdnJlbW92ZSAiJGRldjExIgorcHZyZW1vdmUgIiRkZXYxNCIKKworIyBuZXcgY29uZmlnIHdpdGggc29tZSBwdnMgdGhhdCBoYXZlIHplcm8gbWRhcworCisjIGZvciB2ZzEKK3B2Y3JlYXRlICIkZGV2MTAiCisKKyMgZm9yIHZnMgorcHZjcmVhdGUgIiRkZXYyIiAtLW1ldGFkYXRhY29waWVzIDAKK3B2Y3JlYXRlICIkZGV2MyIKK3B2Y3JlYXRlICIkZGV2NCIKK3B2Y3JlYXRlICIkZGV2NSIKKworIyBmb3IgdmczCitwdmNyZWF0ZSAiJGRldjYiIC0tbWV0YWRhdGFjb3BpZXMgMAorcHZjcmVhdGUgIiRkZXY3IiAtLW1ldGFkYXRhY29waWVzIDAKK3B2Y3JlYXRlICIkZGV2OCIgLS1tZXRhZGF0YWNvcGllcyAwCitwdmNyZWF0ZSAiJGRldjkiCisKKyMgb3JwaGFuIHdpdGggbWRhCitwdmNyZWF0ZSAiJGRldjExIgorIyBvcnBoYW4gd2l0aG91dCBtZGEKK3B2Y3JlYXRlICIkZGV2MTQiIC0tbWV0YWRhdGFjb3BpZXMgMAorCisjIG5vbi1wdiBkZXZzCisjIGRldjEyCisjIGRldjEzCisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxMCIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgordmdjcmVhdGUgJHZnMyAiJGRldjYiICIkZGV2NyIgIiRkZXY4IiAiJGRldjkiCisKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDMgIiRkZXYzIgorcHZjaGFuZ2UgLS1hZGR0YWcgVjJENCAiJGRldjQiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ0NSAiJGRldjQiCitwdmNoYW5nZSAtLWFkZHRhZyBWMkQ1ICIkZGV2NSIKK3B2Y2hhbmdlIC0tYWRkdGFnIFYyRDQ1ICIkZGV2NSIKKworcHZjaGFuZ2UgLS1hZGR0YWcgVjMgIiRkZXY2IiAiJGRldjciICIkZGV2OCIgIiRkZXY5IgorcHZjaGFuZ2UgLS1hZGR0YWcgVjNEOCAiJGRldjgiCitwdmNoYW5nZSAtLWFkZHRhZyBWM0Q5ICIkZGV2OSIKKworCisjCisjIHZncmVkdWNlIGluY2x1ZGluZyBwdnMgd2l0aG91dCBtZGFzCisjCisKKyMgcmVtb3ZlIHB2IHdpdGhvdXQgbWRhCit2Z3JlZHVjZSAkdmcyICIkZGV2MiIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjIiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NCIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjUiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY2IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NyIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjgiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY5IiB2Z19uYW1lICR2ZzMKKyMgcmVzZXQKK3ZnZXh0ZW5kICR2ZzIgIiRkZXYyIgorCisjIHJlbW92ZSBwdiB3aXRoIG1kYSBhbmQgcHYgd2l0aG91dCBtZGEKK3ZncmVkdWNlICR2ZzIgIiRkZXYyIiAiJGRldjMiCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjMiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY0IiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NSIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY3IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworIyByZXNldAordmdleHRlbmQgJHZnMiAiJGRldjIiCit2Z2V4dGVuZCAkdmcyICIkZGV2MyIKKworIyBmYWlsIHRvIHJlbW92ZSBvbmx5IHB2IHdpdGggbWRhCitub3QgdmdyZWR1Y2UgJHZnMyAiJGRldjkiCitjaGVjayBwdl9maWVsZCAiJGRldjYiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXY3IiB2Z19uYW1lICR2ZzMKK2NoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiB2Z19uYW1lICR2ZzIKKworIyByZW1vdmUgYnkgdGFnIGEgcHYgd2l0aG91dCBtZGEKK3ZncmVkdWNlICR2ZzMgQFYzRDgKK2NoZWNrIHB2X2ZpZWxkICIkZGV2NiIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjciIHZnX25hbWUgJHZnMworbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2OCIgdmdfbmFtZSAkdmczCitjaGVjayBwdl9maWVsZCAiJGRldjkiIHZnX25hbWUgJHZnMworY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgdmdfbmFtZSAkdmcyCitjaGVjayBwdl9maWVsZCAiJGRldjQiIHZnX25hbWUgJHZnMgorY2hlY2sgcHZfZmllbGQgIiRkZXY1IiB2Z19uYW1lICR2ZzIKKyMgcmVzZXQKK3ZnZXh0ZW5kICR2ZzMgIiRkZXY4IgorCit2Z3JlbW92ZSAkdmcxICR2ZzIgJHZnMwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wcm9maWxlcy10aGluLnNoIGIvdGVzdC9zaGVsbC9wcm9maWxlcy10aGluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGJjNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3Byb2ZpbGVzLXRoaW4uc2gKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgdGVzdCB0aGluIHByb2ZpbGUgZnVuY3Rpb25hbGl0eQorIworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCitERVZfU0laRT0zMgorCisjIGNoZWNrIHdlIGhhdmUgdGhpbnAgc3VwcG9ydCBjb21waWxlZCBpbgorYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3Byb2ZpbGVzICJ0aGluLXBlcmZvcm1hbmNlIgorCisjIENyZWF0ZSBzY3NpIGRlYnVnIGRldiB3aXRoIHNlY3RvciBzaXplIG9mIDQwOTZCIGFuZCAxTWlCIG9wdGltYWxfaW9fc2l6ZQorYXV4IHByZXBhcmVfc2NzaV9kZWJ1Z19kZXYgJERFVl9TSVpFIHNlY3Rvcl9zaXplPTQwOTYgb3B0X2Jsa3M9MjU2IHx8IHNraXAKK0VYUEVDVD0xMDQ4NTc2CitjaGVjayBzeXNmcyAiJCg8IFNDU0lfREVCVUdfREVWKSIgcXVldWUvb3B0aW1hbF9pb19zaXplICIkRVhQRUNUIgorYXV4IHByZXBhcmVfcHZzIDEgJERFVl9TSVpFCisKKyMgQ2hlY2sgd2UgYXJlIG5vdCBydW5uaW5nIG9uIGJ1Z2d5IGtlcm5lbCAoYnJva2VuIGxjbSgpKQorIyBJZiBzbywgdHVybiBjaHVua19zaXplIHRlc3QgaW50byAgJ3Nob3VsZCcKK2NoZWNrIHN5c2ZzICIkZGV2MSIgcXVldWUvb3B0aW1hbF9pb19zaXplICIkRVhQRUNUIiB8fCBTSE9VTEQ9c2hvdWxkCisKK3ZnY3JlYXRlICR2ZyAiJGRldjEiCisKKyMgQnkgZGVmYXVsdCwgImdlbmVyaWMiIHBvbGljeSBpcyB1c2VkIHRvCisjIGNhbGN1bGF0ZSBjaHVuayBzaXplIHdoaWNoIGlzIDY0S2lCIGJ5IGRlZmF1bHQKKyMgb3IgbWluaW11bV9pb19zaXplIGlmIGl0J3MgaGlnaGVyLiBBbHNvLCB6ZXJvaW5nIGlzIHVzZWQKKyMgdW5kZXIgZGVmYXVsdCBvcGVyYXRpb24uCitsdmNyZWF0ZSAtTDhtIC1UICR2Zy9wb29sX2dlbmVyaWMKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX2dlbmVyaWMgcHJvZmlsZSAiIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfZ2VuZXJpYyBjaHVua19zaXplIDY0LjAwaworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2xfZ2VuZXJpYyB6ZXJvICJ6ZXJvIgorCisjIElmICJ0aGluLXBlcmZvcm1hbmNlIiBwcm9maWxlIGlzIHVzZWQsIHRoZSAicGVyZm9ybWFuY2UiCisjIHBvbGljeSBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBjaHVuayBzaXplIHdoaWNoIGlzIDUxMktpQgorIyBvciBvcHRpbWFsX2lvX3N1aXplIGlmIGl0J3MgaGlnaGVyLiBPdXIgdGVzdCBkZXZpY2UgaGFzCisjIDFNaUIsIHNvIHRoYXQgc2hvdWxkIGJlIHVzZWQuIEFsc28sIHplcm9pbmcgaXMgbm90IHVzZWQKKyMgdW5kZXIgInRoaW4tcGVyZm9yYW5jZSIgcHJvZmlsZS4KK2x2Y3JlYXRlIC0tcHJvZmlsZSB0aGluLXBlcmZvcm1hbmNlIC1MOG0gLVQgJHZnL3Bvb2xfcGVyZm9ybWFuY2UKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3BlcmZvcm1hbmNlIHByb2ZpbGUgInRoaW4tcGVyZm9ybWFuY2UiCiskU0hPVUxEIGNoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3BlcmZvcm1hbmNlIGNodW5rX3NpemUgMS4wMG0KK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3BlcmZvcm1hbmNlIHplcm8gIiIKKwordmdyZW1vdmUgLWZmICR2ZworCitpZiB0ZXN0IC1kICIkRE1fREVWX0RJUi8kdmciIDsgdGhlbgorCXNob3VsZCBub3QgZWNobyAiVWRldiBoYXMgbGVmdCBcIiRETV9ERVZfRElSLyR2Z1wiISIKKwlybSAtcmYgIiRETV9ERVZfRElSLyR2ZyIKK2ZpCisKKyMgVGhlIHByb2ZpbGUgbXVzdCBiZSBhbHNvIGFwcGxpZWQgaWYgdXNpbmcgdGhlIHByb2ZpbGUKKyMgZm9yIHRoZSB3aG9sZSBWRyAtIGFueSBMVnMgaW5oZXJpdCB0aGlzIHByb2ZpbGUgdGhlbi4KK3ZnY3JlYXRlIC0tcHJvZmlsZSB0aGluLXBlcmZvcm1hbmNlICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtTDhtIC1UICR2Zy9wb29sX3BlcmZvcm1hbmNlX2luaGVyaXRlZAorIyAuLi50aGUgTFYgZG9lcyBub3QgaGF2ZSB0aGUgcHJvZmlsZSBhdHRhY2hlZCwgYnV0IFZHIGRvZXMhCitjaGVjayB2Z19maWVsZCAkdmcgcHJvZmlsZSAidGhpbi1wZXJmb3JtYW5jZSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3BlcmZvcm1hbmNlX2luaGVyaXRlZCBwcm9maWxlICIiCiskU0hPVUxEIGNoZWNrIGx2X2ZpZWxkICR2Zy9wb29sX3BlcmZvcm1hbmNlX2luaGVyaXRlZCBjaHVua19zaXplIDEuMDBtCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbF9wZXJmb3JtYW5jZV9pbmhlcml0ZWQgemVybyAiIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wcm9maWxlcy5zaCBiL3Rlc3Qvc2hlbGwvcHJvZmlsZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3YjMwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHJvZmlsZXMuc2gKQEAgLTAsMCArMSwxMzMgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjCisjIHRlc3QgYmFzaWMgcHJvZmlsZSBmdW5jdGlvbmFsaXR5CisjCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitNU0dfRkFJTEVEX1RPX0FQUExZX0NNRF9QUk9GSUxFPSJGYWlsZWQgdG8gYXBwbHkgY29tbWFuZCBwcm9maWxlIgorTVNHX0lHTk9SSU5HX0lOVkFMSURfQ01EX1BST0ZJTEU9Iklnbm9yaW5nIGludmFsaWQgY29tbWFuZCBwcm9maWxlIgorTVNHX0ZBSUxFRF9UT19BUFBMWV9NREFfUFJPRklMRT0iRmFpbGVkIHRvIGFwcGx5IG1ldGFkYXRhIHByb2ZpbGUiCitNU0dfSUdOT1JJTkdfSU5WQUxJRF9NREFfUFJPRklMRT0iSWdub3JpbmcgaW52YWxpZCBtZXRhZGF0YSBwcm9maWxlIgorTVNHX05PVF9QUk9GSUxBQkxFPSJub3QgY3VzdG9taXphYmxlIGJ5IGEgcHJvZmlsZSIKK01TR19DTURfUFJPRklMQUJMRV9PTkxZPSJjdXN0b21pemFibGUgYnkgY29tbWFuZCBwcm9maWxlIG9ubHksIG5vdCBtZXRhZGF0YSBwcm9maWxlIgorTVNHX01EQV9QUk9GSUxBQkxFX09OTFk9ImN1c3RvbWl6YWJsZSBieSBtZXRhZGF0YSBwcm9maWxlIG9ubHksIG5vdCBjb21tYW5kIHByb2ZpbGUiCisKKyMgZmFpbCBpZiB0aGUgcHJvZmlsZSByZXF1ZXN0ZWQgYnkgLS1wcm9maWxlIGNtZGxpbmUgb3B0aW9uIGlzIG5vdCBwcmVzZW50Citub3QgcHZzIC0tcHJvZmlsZSBub25leGlzdGVudCAyPiYxIHwgZ3JlcCAiJE1TR19GQUlMRURfVE9fQVBQTFlfQ01EX1BST0ZJTEUiCisKKyMgY29uZmlnL2NoZWNrcz0xOiB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgc2V0dGluZyBub3QgYmVpbmcgcHJvZmlsYWJsZSArCisjICAgICAgICAgICAgICAgICAgc3VtbWFyeSBlcnJvciBtZXNzYWdlIGFib3V0IGludmFsaWQgcHJvZmlsZQorIyBjb25maWcvY2hlY2tzPTA6IGp1c3Qgc3VtbWFyeSBlcnJvciBtZXNzYWdlIGFib3V0IGludmFsaWQgcHJvZmlsZQorYXV4IHByb2ZpbGVjb25mIGludmFsaWQgJ2xvZy9wcmVmaXg9IiAiJworCithdXggbHZtY29uZiAnY29uZmlnL2NoZWNrcyA9IDAnCitub3QgcHZzIC0tcHJvZmlsZSBpbnZhbGlkIDI+bXNnCitub3QgZ3JlcCAiJE1TR19OT1RfUFJPRklMQUJMRSIgbXNnCitncmVwICIkTVNHX0lHTk9SSU5HX0lOVkFMSURfQ01EX1BST0ZJTEUiIG1zZworZ3JlcCAiJE1TR19GQUlMRURfVE9fQVBQTFlfQ01EX1BST0ZJTEUiIG1zZworCithdXggbHZtY29uZiAnY29uZmlnL2NoZWNrcyA9IDEnCitub3QgcHZzIC0tcHJvZmlsZSBpbnZhbGlkIDI+bXNnCitncmVwICIkTVNHX05PVF9QUk9GSUxBQkxFIiBtc2cKK2dyZXAgIiRNU0dfSUdOT1JJTkdfSU5WQUxJRF9DTURfUFJPRklMRSIgbXNnCitncmVwICIkTVNHX0ZBSUxFRF9UT19BUFBMWV9DTURfUFJPRklMRSIgbXNnCisKK2F1eCBsdm1jb25mICdhbGxvY2F0aW9uL3RoaW5fcG9vbF96ZXJvID0gMScKKworIyBhbGwgcHJvZmlsYWJsZSBpdGVtcyBsaXN0ZWQgaGVyZSAtIHNob3VsZCBwYXNzCithdXggcHJvZmlsZWNvbmYgdmFsaWRfY21kX3Byb2ZpbGUgJ2dsb2JhbC91bml0cyA9ICJoIicgXAorCQkJCSAgJ2dsb2JhbC9zaV91bml0X2NvbnNpc3RlbmN5ID0gMScgXAorCQkJCSAgJ2dsb2JhbC9zdWZmaXggPSAxJyBcCisJCQkJICAnZ2xvYmFsL2x2ZGlzcGxheV9zaG93c19mdWxsX2RldmljZV9wYXRoID0gMCcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvYWxpZ25lZCA9IDEnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L2J1ZmZlcmVkID0gMScgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvaGVhZGluZ3MgPSAxJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC9zZXBhcmF0b3IgPSAiICInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L3ByZWZpeGVzID0gMCcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvcXVvdGVkID0gMScgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvY29sdW1zX2FzX3Jvd3MgPSAwJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC9kZXZ0eXBlc19zb3J0ID0gImRldnR5cGVfbmFtZSInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L2RldnR5cGVzX2NvbHMgPSAiZGV2dHlwZV9uYW1lLGRldnR5cGVfbWF4X3BhcnRpdGlvbnMsZGV2dHlwZV9kZXNjcmlwdGlvbiInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L2RldnR5cGVzX2NvbHNfdmVyYm9zZSA9ICJkZXZ0eXBlX25hbWUsZGV2dHlwZV9tYXhfcGFydGl0aW9ucyxkZXZ0eXBlX2Rlc2NyaXB0aW9uIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvbHZzX3NvcnQgPSAidmdfbmFtZSxsdl9uYW1lIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvbHZzX2NvbHMgPSAibHZfbmFtZSx2Z19uYW1lLGx2X2F0dHIsbHZfc2l6ZSxwb29sX2x2LG9yaWdpbixkYXRhX3BlcmNlbnQsbW92ZV9wdixtaXJyb3JfbG9nLGNvcHlfcGVyY2VudCxjb252ZXJ0X2x2IicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvbHZzX2NvbHNfdmVyYm9zZSA9ICJsdl9uYW1lLHZnX25hbWUsc2VnX2NvdW50LGx2X2F0dHIsbHZfc2l6ZSxsdl9tYWpvcixsdl9taW5vcixsdl9rZXJuZWxfbWFqb3IsbHZfa2VybmVsX21pbm9yLHBvb2xfbHYsb3JpZ2luLGRhdGFfcGVyY2VudCxtZXRhZGF0YV9wZXJjZW50LG1vdmVfcHYsY29weV9wZXJjZW50LG1pcnJvcl9sb2csY29udmVydF9sdixsdl91dWlkLGx2X3Byb2ZpbGUiJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC92Z3Nfc29ydCA9ICJ2Z19uYW1lIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvdmdzX2NvbHMgPSAidmdfbmFtZSxwdl9jb3VudCxsdl9jb3VudCxzbmFwX2NvdW50LHZnX2F0dHIsdmdfc2l6ZSx2Z19mcmVlIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvdmdzX2NvbHNfdmVyYm9zZSA9ICJ2Z19uYW1lLHZnX2F0dHIsdmdfZXh0ZW50X3NpemUscHZfY291bnQsbHZfY291bnQsc25hcF9jb3VudCx2Z19zaXplLHZnX2ZyZWUsdmdfdXVpZCx2Z19wcm9maWxlIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvcHZzX3NvcnQgPSAicHZfbmFtZSInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L3B2c19jb2xzID0gInB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUiJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC9wdnNfY29sc192ZXJib3NlID0gInB2X25hbWUsdmdfbmFtZSxwdl9mbXQscHZfYXR0cixwdl9zaXplLHB2X2ZyZWUsZGV2X3NpemUscHZfdXVpZCInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L3NlZ3Nfc29ydCA9ICJ2Z19uYW1lLGx2X25hbWUsc2VnX3N0YXJ0IicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvc2Vnc19jb2xzID0gImx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLHN0cmlwZXMsc2VndHlwZSxzZWdfc2l6ZSInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3J0L3NlZ3NfY29sc192ZXJib3NlID0gImx2X25hbWUsdmdfbmFtZSxsdl9hdHRyLHNlZ19zdGFydCxzZWdfc2l6ZSxzdHJpcGVzLHNlZ3R5cGUsc3RyaXBlc2l6ZSxjaHVua3NpemUiJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9ydC9wdnNlZ3Nfc29ydCA9ICJwdl9uYW1lLHB2c2VnX3N0YXJ0IicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvcHZzZWdzX2NvbHMgPSAicHZfbmFtZSx2Z19uYW1lLHB2X2ZtdCxwdl9hdHRyLHB2X3NpemUscHZfZnJlZSxwdnNlZ19zdGFydCxwdnNlZ19zaXplIicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvcnQvcHZzZWdzX2NvbHNfdmVyYm9zZSA9ICJwdl9uYW1lLHZnX25hbWUscHZfZm10LHB2X2F0dHIscHZfc2l6ZSxwdl9mcmVlLHB2c2VnX3N0YXJ0LHB2c2VnX3NpemUsbHZfbmFtZSxzZWdfc3RhcnRfcGUsc2VndHlwZSxzZWdfcGVfcmFuZ2VzIicKKworYXV4IHByb2ZpbGVjb25mIHZhbGlkX21kYV9wcm9maWxlICdhbGxvY2F0aW9uL3RoaW5fcG9vbF96ZXJvID0gMCcgXAorCQkJCSAgJ2FsbG9jYXRpb24vdGhpbl9wb29sX2Rpc2NhcmRzID0gInBhc3Nkb3duIicgXAorCQkJCSAgJ2FsbG9jYXRpb24vdGhpbl9wb29sX2NodW5rX3NpemUgPSA2NCdcCisJCQkJICAnYWN0aXZhdGlvbi90aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSAxMDAnIFwKKwkJCQkgICdhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQgPSAyMCcgXAorCisKK2F1eCBwcm9maWxlY29uZiBleHRyYV9tZGFfcHJvZmlsZSAnYWxsb2NhdGlvbi90aGluX3Bvb2xfY2h1bmtfc2l6ZSA9IDEyOCcKKworcHZzIC0tcHJvZmlsZSB2YWxpZF9jbWRfcHJvZmlsZSAyPm1zZworbm90IGdyZXAgIiRNU0dfTk9UX1BST0ZJTEFCTEUiIG1zZworbm90IGdyZXAgIiRNU0dfSUdOT1JJTkdfSU5WQUxJRF9DTURfUFJPRklMRSIgbXNnCitub3QgZ3JlcCAiJE1TR19JR05PUklOR19JTlZBTElEX01EQV9QUk9GSUxFIiBtc2cKKworbm90IHB2cyAtLXByb2ZpbGUgdmFsaWRfbWRhX3Byb2ZpbGUgMj5tc2cKK2dyZXAgIiRNU0dfTURBX1BST0ZJTEFCTEVfT05MWSIgbXNnCitncmVwICIkTVNHX0lHTk9SSU5HX0lOVkFMSURfQ01EX1BST0ZJTEUiIG1zZworbm90IGdyZXAgIiRNU0dfSUdOT1JJTkdfSU5WQUxJRF9NREFfUFJPRklMRSIgbXNnCisKKyMgYXR0YWNoaW5nL2RldGFjaGluZyBwcm9maWxlcyB0byBWRy9MVgorYXV4IHByZXBhcmVfcHZzIDEgOAorcHZjcmVhdGUgIiRkZXYxIgordmdjcmVhdGUgJHZnMSAiJGRldjEiCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3Byb2ZpbGUgIiIKK2x2Y3JlYXRlIC1sIDEgLW4gJGx2MSAkdmcxCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjEgbHZfcHJvZmlsZSAiIgordmdjaGFuZ2UgLS1wcm9maWxlIHZhbGlkX21kYV9wcm9maWxlICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfcHJvZmlsZSB2YWxpZF9tZGFfcHJvZmlsZQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIGx2X3Byb2ZpbGUgIiIKK2x2Y2hhbmdlIC0tcHJvZmlsZSBleHRyYV9tZGFfcHJvZmlsZSAkdmcxLyRsdjEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfcHJvZmlsZSB2YWxpZF9tZGFfcHJvZmlsZQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIGx2X3Byb2ZpbGUgZXh0cmFfbWRhX3Byb2ZpbGUKK3ZnY2hhbmdlIC0tZGV0YWNocHJvZmlsZSAkdmcxCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3Byb2ZpbGUgIiIKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBsdl9wcm9maWxlIGV4dHJhX21kYV9wcm9maWxlCitsdmNoYW5nZSAtLWRldGFjaHByb2ZpbGUgJHZnMS8kbHYxCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3Byb2ZpbGUgIiIKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBsdl9wcm9maWxlICIiCisKKyMgZHVtcGNvbmZpZyBhbmQgbWVyZ2VkIGx2bS5jb25mICsgcHJvZmlsZQorYXV4IGx2bWNvbmYgJ2dsb2JhbC91bml0cz0ibSInCithdXggcHJvZmlsZWNvbmYgZXh0cmFfY21kX3Byb2ZpbGUgJ2dsb2JhbC91bml0cz0iaCInCitsdm0gZHVtcGNvbmZpZyAmPm91dAorZ3JlcCAndW5pdHM9Im0iJyBvdXQKK2x2bSBkdW1wY29uZmlnIC0tcHJvZmlsZSBleHRyYV9jbWRfcHJvZmlsZSAtLW1lcmdlZGNvbmZpZyA+b3V0CitncmVwICd1bml0cz0iaCInIG91dAorCisjIGR1bXBjb25maWcgLS1wcm9maWxhYmxlIG91dHB1dCBtdXN0IGJlIHVzYWJsZSBhcyBhIHByb2ZpbGUKK2x2bSBkdW1wY29uZmlnIC0tdHlwZSBwcm9maWxhYmxlLWNvbW1hbmQgLS1maWxlIGV0Yy9wcm9maWxlL2dlbmVyYXRlZC5wcm9maWxlCitwdnMgLS1wcm9maWxlIGdlbmVyYXRlZCAmPiBtc2cKK25vdCBncmVwICIkTVNHX05PVF9QUk9GSUxBQkxFIiBtc2cKK25vdCBncmVwICIkTVNHX0lHTk9SSU5HX0lOVkFMSURfQ01EX1BST0ZJTEUiIG1zZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdi1jaGVjay1kZXYtc2l6ZS5zaCBiL3Rlc3Qvc2hlbGwvcHYtY2hlY2stZGV2LXNpemUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkMWI1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHYtY2hlY2stZGV2LXNpemUuc2gKQEAgLTAsMCArMSw0NSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMSA4CisKK2F1eCBsdm1jb25mICdtZXRhZGF0YS9jaGVja19wdl9kZXZpY2Vfc2l6ZXMgPSAxJworCitDSEVDS19NU0c9InNtYWxsZXIgdGhhbiBjb3JyZXNwb25kaW5nIFBWIHNpemUiCisKK3ZnY3JlYXRlICR2ZyAkZGV2MSAyPmVycgorbm90IGdyZXAgIiRDSEVDS19NU0ciIGVycgorcHZzIDI+ZXJyCitub3QgZ3JlcCAiJENIRUNLX01TRyIgZXJyCit2Z3JlbW92ZSAtZmYgJHZnCisKKyMgc2V0IFBWIHNpemUgdG8gMnggZGV2IHNpemUKK3B2Y3JlYXRlIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDE2bSAkZGV2MQordmdjcmVhdGUgJHZnICRkZXYxIDI+ZXJyCitncmVwICIkQ0hFQ0tfTVNHIiBlcnIKK3B2cyAyPmVycgorZ3JlcCAiJENIRUNLX01TRyIgZXJyCit2Z3JlbW92ZSAtZmYgJHZnCisKKyMgc2hvdWxkIGJlIHF1aWV0IGlmIHJlcXVlc3RlZAorYXV4IGx2bWNvbmYgJ21ldGFkYXRhL2NoZWNrX3B2X2RldmljZV9zaXplcyA9IDAnCitwdmNyZWF0ZSAtLXNldHBoeXNpY2Fsdm9sdW1lc2l6ZSAxNm0gJGRldjEKK3ZnY3JlYXRlICR2ZyAkZGV2MSAyPmVycgorbm90IGdyZXAgIiRDSEVDS19NU0ciIGVycgorcHZzIDI+ZXJyCitub3QgZ3JlcCAiJENIRUNLX01TRyIgZXJyCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHYtZHVwbGljYXRlLXV1aWQuc2ggYi90ZXN0L3NoZWxsL3B2LWR1cGxpY2F0ZS11dWlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDZhNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2LWR1cGxpY2F0ZS11dWlkLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgJ0ZvdW5kIGR1cGxpY2F0ZScgaXMgc2hvd24KK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDMKKworcHZjcmVhdGUgIiRkZXYxIgorVVVJRDE9JChnZXQgcHZfZmllbGQgIiRkZXYxIiB1dWlkKQorcHZjcmVhdGUgLS1jb25maWcgImRldmljZXN7ZmlsdGVyPVtcImF8JGRldjJ8XCIsXCJyfC4qfFwiXX0gZ2xvYmFsL3VzZV9sdm1ldGFkPTAiIC11ICIkVVVJRDEiIC0tbm9yZXN0b3JlZmlsZSAiJGRldjIiCitwdmNyZWF0ZSAtLWNvbmZpZyAiZGV2aWNlc3tmaWx0ZXI9W1wiYXwkZGV2M3xcIixcInJ8Lip8XCJdfSBnbG9iYWwvdXNlX2x2bWV0YWQ9MCIgLXUgIiRVVUlEMSIgLS1ub3Jlc3RvcmVmaWxlICIkZGV2MyIKKworcHZzY2FuIC0tY2FjaGUgMj4mMSB8IHRlZSBvdXQKKworaWYgdGVzdCAtZSBMT0NBTF9MVk1FVEFEOyB0aGVuCisJZ3JlcCAid2FzIGFscmVhZHkgZm91bmQiIG91dAorCWdyZXAgIldBUk5JTkc6IERpc2FibGluZyBsdm1ldGFkIGNhY2hlIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgZHVwbGljYXRlIFBWcy4iIG91dAorZmkKKworcHZzIC1vK3V1aWQgMj4mMSB8IHRlZSBvdXQKKworZ3JlcCAgICBXQVJOSU5HIG91dCA+IHdhcm4gfHwgdHJ1ZQorZ3JlcCAtdiBXQVJOSU5HIG91dCA+IG1haW4gfHwgdHJ1ZQorCit0ZXN0ICQoZ3JlcCAkVVVJRDEgbWFpbiB8IHdjIC1sKSAtZXEgMQorCitDT1VOVD0kKGdyZXAgLS1jb3VudCAid2FzIGFscmVhZHkgZm91bmQiIHdhcm4pCitbICIkQ09VTlQiIC1lcSAyIF0KKworcHZzIC1vK3V1aWQgLS1jb25maWcgImRldmljZXN7ZmlsdGVyPVtcImF8JGRldjJ8XCIsXCJyfC4qfFwiXX0iIDI+JjEgfCB0ZWUgb3V0CisKK3JtIHdhcm4gbWFpbiB8fCB0cnVlCitncmVwICAgIFdBUk5JTkcgb3V0ID4gd2FybiB8fCB0cnVlCitncmVwIC12IFdBUk5JTkcgb3V0ID4gbWFpbiB8fCB0cnVlCisKK25vdCBncmVwICIkZGV2MSIgbWFpbgorZ3JlcCAiJGRldjIiIG1haW4KK25vdCBncmVwICIkZGV2MyIgbWFpbgorCitub3QgZ3JlcCAid2FzIGFscmVhZHkgZm91bmQiIHdhcm4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdi1kdXBsaWNhdGUuc2ggYi90ZXN0L3NoZWxsL3B2LWR1cGxpY2F0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc4YWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdi1kdXBsaWNhdGUuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyAnRXhlcmNpc2UgZHVwbGljYXRlIG1ldGFkYXRhIGRpYWdub3N0aWNzJworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyAzCisKK3B2Y3JlYXRlICIkZGV2MSIKKworZGQgaWY9IiRkZXYxIiBvZj1iYWNrdXBfZGV2MSBicz0yNTZLIGNvdW50PTEKKwordmdjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayAkdmcxICIkZGV2MSIKKworIyBjb3B5IG1kYQorZGQgaWY9IiRkZXYxIiBvZj0iJGRldjIiIGJzPTI1NksgY291bnQ9MQorZGQgaWY9IiRkZXYxIiBvZj0iJGRldjMiIGJzPTI1NksgY291bnQ9MQorCitwdnMgIiRkZXYzIiAtbyBwdl91dWlkCisKK3ZncyAkdmcxCisKK2RkIGlmPWJhY2t1cF9kZXYxIG9mPSIkZGV2MyIgYnM9MjU2SyBjb3VudD0xCitwdnMKKyMtdnZ2dgorIyBUT0RPOiBTdXJlbHkgbmVlZHMgbW9yZSBpbnNwZWNpdGlvbiBhYm91dCBjb3JyZWN0CisjICAgICAgIGJlaGF2aW9yIGZvciBzdWNoIGNhc2UKKyMgdmdzICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHYtZXh0LWZsYWdzLnNoIGIvdGVzdC9zaGVsbC9wdi1leHQtZmxhZ3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2NTQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHYtZXh0LWZsYWdzLnNoCkBAIC0wLDAgKzEsMTY0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMgorCisjIFBWX0VYVF9VU0VEIGZsYWcKK01BUktFRF9BU19VU0VEX01TRz0iaXMgdXNlZCBieSBhIFZHIGJ1dCBpdHMgbWV0YWRhdGEgaXMgbWlzc2luZyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBDSEVDSyBQViBXSVRIIDAgTUVUQURBVEEgQVJFQVMgIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwdmNyZWF0ZSAtZmYgLXkgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MSIKK3B2Y3JlYXRlIC1mZiAteSAtLW1ldGFkYXRhY29waWVzIDEgIiRkZXYyIgorCisjICRkZXYxIGFuZCAkZGV2MiBub3QgaW4gYW55IFZHIC0gcHZfaW5fdXNlIGZpZWxkIHNob3VsZCBiZSBibGFuaworY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9pbl91c2UgIiIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfaW5fdXNlICIiCisKKyMgJGRldjEgYW5kICRkZXYgbm93IGluIGEgVkcgLSBwdl9pbl91c2Ugc2hvdWxkIGRpc3BsYXkgInVzZWQiCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9pbl91c2UgInVzZWQiCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2luX3VzZSAidXNlZCIKKworIyBkaXNhYmxlICRkZXYyIGFuZCBkZXYxIHdpdGggMCBNREFzIHJlbWFpbnMsIGJ1dCBzdGlsbAorIyBtYXJrZWQgYXMgdXNlZCwgc28gcHZjcmVhdGUvdmdjcmVhdGUvcHZyZW1vdmUgc2hvdWxkIGZhaWwKK2F1eCBkaXNhYmxlX2RldiAiJGRldjIiCitwdnNjYW4gLS1jYWNoZQorCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X2luX3VzZSAidXNlZCIKK25vdCBwdmNyZWF0ZSAiJGRldjEiIDI+ZXJyCitjYXQgZXJyCitncmVwICIkTUFSS0VEX0FTX1VTRURfTVNHIiBlcnIKK25vdCBwdmNoYW5nZSAtdSAiJGRldjEiIDI+ZXJyCitncmVwICIkTUFSS0VEX0FTX1VTRURfTVNHIiBlcnIKK25vdCB2Z2NyZWF0ZSAkdmcyICIkZGV2MSIgMj5lcnIKK2dyZXAgIiRNQVJLRURfQVNfVVNFRCIgZXJyCitub3QgcHZyZW1vdmUgIiRkZXYxIiAyPmVycgorZ3JlcCAiJE1BUktFRF9BU19VU0VEX01TRyIgZXJyCisKKyMgc2F2ZSBQViBzaWduYXR1cmUgZnJvbSBkZXYxIGZvciByZXVzZSBsYXRlciBvbiBpbiB0aGlzCisjIHRlc3Qgc28gd2UgZG9uJ3QgbmVlZCB0byBpbml0aWFsaXplIGFsbCB0aGUgVkcgc3R1ZmYgYWdhaW4KK2RkIGlmPSIkZGV2MSIgb2Y9ZGV2MV9iYWNrdXAgYnM9MU0KKworIyBwdmNyZWF0ZSBhbmQgcHZyZW1vdmUgY2FuIGJlIGZvcmNlZCBldmVuIGlmIHRoZSBQViBpcyBtYXJrZWQgYXMgdXNlZAorcHZyZW1vdmUgLWZmIC15ICIkZGV2MSIKK2RkIGlmPWRldjFfYmFja3VwIG9mPSIkZGV2MSIgYnM9MU0KK3B2Y3JlYXRlIC1mZiAteSAiJGRldjEiCitkZCBpZj1kZXYxX2JhY2t1cCBvZj0iJGRldjEiIGJzPTFNCisKKyMgcHJlcGFyZSBhIFZHIHdpdGggJGRldjEgYW5kICRkZXYgYm90aCBoYXZpbmcgMSBNREEKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIKK3ZncmVtb3ZlIC1mZiAkdmcxCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDEgIiRkZXYxIgordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKKworIyBkaXNhYmxlICRkZXYxLCB0aGVuIHJlcGFpciB0aGUgVkcgLSAkZGV2MSBpcyByZW1vdmVkIGZyb20gVkcKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnMQorIyBub3csIGVuYWJsZSAkZGV2MSwgYXV0b21hdGljIHJlcGFpciB3aWxsIGhhcHBlbiBvbiBwdnMgY2FsbAorIyAob3IgYW55IG90aGVyIGx2bSBjb21tYW5kIHRoYXQgZG9lcyB2Z19yZWFkIHdpdGggcmVwYWlyIGluc2lkZSkKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKKworIyBGSVhNRTogb25jZSBwZXJzaXN0ZW50IGNhY2hlIGRvZXMgbm90IGNhdXNlIHJhY2VzIHdpdGggdGltZXN0YW1wcworIyAgICAgICAgY2F1c2luZyBMVk0gdG9vbHMgdG8gbm90IHNlZSB0aGUgVkcgaW5jb25zaXN0ZW5jeSBhbmQgb25jZQorIyAgICAgICAgVkcgcmVwYWlyIGlzIGFsd2F5cyBkb25lLCBkZWxldGUgdGhpcyBsaW5lIHdoaWNoIHJlbW92ZXMKKyMgICAgICAgIHBlcnNpc3RlbnQgLmNhY2hlIGFzIGEgd29ya2Fyb3VuZAorcm0gLWYgJFRFU1RESVIvZXRjLy5jYWNoZQorCit2Z2NrICR2ZzEKKyMgY2hlY2sgJGRldjEgZG9lcyBub3QgY29udGFpbiB0aGUgUFZfRVhUX0ZMQUcgYW55bW9yZSAtIGl0CisjIHNob3VsZCBiZSByZW1vdmVkIGFzIHBhcnQgb2YgdGhlIHJlcGFpZCBkdXJpbmcgdmdfcmVhZCBzaW5jZQorIyAkZGV2MSBpcyBub3QgcGFydCBvZiAkdmcxIGFueW1vcmUKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfaW5fdXNlICIiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIENIRUNLIFBWIFdJVEggRElTQUJMRUQgTUVUQURBVEEgQVJFQVMgIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcHZjcmVhdGUgLWZmIC15IC0tbWV0YWRhdGFjb3BpZXMgMSAiJGRldjEiCitwdmNyZWF0ZSAtZmYgLXkgLS1tZXRhZGF0YWNvcGllcyAxICIkZGV2MiIKKworIyAkZGV2MSBhbmQgJGRldjIgbm90IGluIGFueSBWRyAtIHB2X2luX3VzZSBmaWVsZCBzaG91bGQgYmUgYmxhbmsKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfaW5fdXNlICIiCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2luX3VzZSAiIgorCisjICRkZXYxIGFuZCAkZGV2IG5vdyBpbiBhIFZHIC0gcHZfaW5fdXNlIHNob3VsZCBkaXNwbGF5ICJ1c2VkIgordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfaW5fdXNlICJ1c2VkIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9pbl91c2UgInVzZWQiCisKK3B2Y2hhbmdlIC0tbWV0YWRhdGFpZ25vcmUgeSAiJGRldjEiCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIgorcHZzY2FuIC0tY2FjaGUKKworY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9pbl91c2UgInVzZWQiCitub3QgcHZjcmVhdGUgIiRkZXYxIiAyPmVycgorZ3JlcCAiJE1BUktFRF9BU19VU0VEX01TRyIgZXJyCitub3QgcHZjaGFuZ2UgLXUgIiRkZXYxIiAyPmVycgorZ3JlcCAiJE1BUktFRF9BU19VU0VEX01TRyIgZXJyCitub3QgdmdjcmVhdGUgJHZnMiAiJGRldjEiIDI+ZXJyCitncmVwICIkTUFSS0VEX0FTX1VTRUQiIGVycgorbm90IHB2cmVtb3ZlICIkZGV2MSIgMj5lcnIKK2dyZXAgIiRNQVJLRURfQVNfVVNFRF9NU0ciIGVycgorCisjIHNhdmUgUFYgc2lnbmF0dXJlIGZyb20gZGV2MSBmb3IgcmV1c2UgbGF0ZXIgb24gaW4gdGhpcworIyB0ZXN0IHNvIHdlIGRvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIFZHIHN0dWZmIGFnYWluCitkZCBpZj0iJGRldjEiIG9mPWRldjFfYmFja3VwIGJzPTFNCisKKyMgcHZjcmVhdGUgYW5kIHB2cmVtb3ZlIGNhbiBiZSBmb3JjZWQgZXZlbiBpZiB0aGUgUFYgaXMgbWFya2VkIGFzIHVzZWQKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjEiCitkZCBpZj1kZXYxX2JhY2t1cCBvZj0iJGRldjEiIGJzPTFNCitwdmNyZWF0ZSAtZmYgLXkgIiRkZXYxIgorZGQgaWY9ZGV2MV9iYWNrdXAgb2Y9IiRkZXYxIiBicz0xTQorCisjIHByZXBhcmUgYSBWRyB3aXRoICRkZXYxIGFuZCAkZGV2IGJvdGggaGF2aW5nIDEgTURBCithdXggZW5hYmxlX2RldiAiJGRldjIiCit2Z3JlbW92ZSAtZmYgJHZnMQorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAxICIkZGV2MSIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCisKKyMgZGlzYWJsZSAkZGV2MSwgdGhlbiByZXBhaXIgdGhlIFZHIC0gJGRldjEgaXMgcmVtb3ZlZCBmcm9tIFZHCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgordmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZzEKKyMgbm93LCBlbmFibGUgJGRldjEsIGF1dG9tYXRpYyByZXBhaXIgd2lsbCBoYXBwZW4gb24gcHZzIGNhbGwKKyMgKG9yIGFueSBvdGhlciBsdm0gY29tbWFuZCB0aGF0IGRvZXMgdmdfcmVhZCB3aXRoIHJlcGFpciBpbnNpZGUpCithdXggZW5hYmxlX2RldiAiJGRldjEiCisKKyMgRklYTUU6IG9uY2UgcGVyc2lzdGVudCBjYWNoZSBkb2VzIG5vdCBjYXVzZSByYWNlcyB3aXRoIHRpbWVzdGFtcHMKKyMgICAgICAgIGNhdXNpbmcgTFZNIHRvb2xzIHRvIG5vdCBzZWUgdGhlIFZHIGluY29uc2lzdGVuY3kgYW5kIG9uY2UKKyMgICAgICAgIFZHIHJlcGFpciBpcyBhbHdheXMgZG9uZSwgZGVsZXRlIHRoaXMgbGluZSB3aGljaCByZW1vdmVzCisjICAgICAgICBwZXJzaXN0ZW50IC5jYWNoZSBhcyBhIHdvcmthcm91bmQKK3JtIC1mICRURVNURElSL2V0Yy8uY2FjaGUKKwordmdjayAkdmcxCisjIGNoZWNrICRkZXYxIGRvZXMgbm90IGNvbnRhaW4gdGhlIFBWX0VYVF9GTEFHIGFueW1vcmUgLSBpdAorIyBzaG91bGQgYmUgcmVtb3ZlZCBhcyBwYXJ0IG9mIHRoZSByZXBhaWQgZHVyaW5nIHZnX3JlYWQgc2luY2UKKyMgJGRldjEgaXMgbm90IHBhcnQgb2YgJHZnMSBhbnltb3JlCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X2luX3VzZSAiIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT1RIRVIgUFYtUkVMQVRFRCBDSEVDS1MgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgdmdjZmdyZXN0b3JlIHNob3VsZCBhbHNvIHNldCBQVl9FWFRfRkxBRyBvbiBQVnMgd2hlcmUgVkcgaXMgcmVzdG9yZWQKK3ZnY2ZnYmFja3VwIC1mIHZnX2JhY2t1cCAkdmcxCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2luX3VzZSAidXNlZCIKK3ZncmVtb3ZlIC1mZiAkdmcxCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2luX3VzZSAiIgordmdjZmdyZXN0b3JlIC1mIHZnX2JhY2t1cCAkdmcxCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X2luX3VzZSAidXNlZCIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHYtZXh0LXVwZGF0ZS5zaCBiL3Rlc3Qvc2hlbGwvcHYtZXh0LXVwZGF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRlN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdi1leHQtdXBkYXRlLnNoCkBAIC0wLDAgKzEsMTg2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBsdm1ldGFkIGRvZXMgbm90IGhhbmRsZSBwb29sIGxhYmVscyBzbyBza2lwIHRlc3QuCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitlbnYgcHJpbnRmICIiIHx8IHNraXAgIyBza2lwIGlmIHByaW50ZiBpcyBub3QgYXZhaWxhYmxlCisKKyMgY3JlYXRlIHRoZSBQViB3aXRoIFBWIGV4dCB2c24gMSBhbmQgYSB2ZworY3JlYXRlX3B2X3dpdGhfZXh0X3ZzbjFfYW5kX3ZnKCkKK3sKKyAgVkdfTkFNRT0iTFZNVEVTVDEyMzQ1cHZleHR1cGRhdGV2ZyIKKyAgTFZfTkFNRT0ibHZvbDAiCisKKyAgIyBGSVhNRQorICAjIGVjaG8gLWUgaXMgYmFzaGlzbSwgZGFzaCBidWlsdGluIHNoIGRvZXNuJ3QgZG8gXHhOTiBpbiBwcmludGYgZWl0aGVyCisgICMgcHJpbnRmIGNvbWVzIGZyb20gY29yZXV0aWxzLCBhbmQgaXMgcHJvYmFibHkgbm90IHBvc2l4IGVpdGhlcgorCisgICMgUFYgaGVhZGVyIHdpdGggUFYgZXh0ZW5zaW9uIHZlcnNpb24gMQorICBlbnYgcHJpbnRmIFwKKyJceDRjXHg0MVx4NDJceDQ1XHg0Y1x4NGZceDRlXHg0NVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDc4XHgxY1x4MTJceDQzXHgyMFx4MDBceDAwXHgwMFx4NGNceDU2XHg0ZFx4MzJceDIwXHgzMFx4MzBceDMxIlwKKyJceDY0XHgzNVx4NTZceDMzXHgzOFx4NWFceDU3XHg0OVx4NjNceDdhXHg2NFx4NjNceDM0XHgzOFx4MzdceDY3IlwKKyJceDRkXHg3OVx4NDZceDRiXHg2Y1x4NmRceDY4XHgzOVx4NGVceDczXHgzNFx4NmZceDc4XHg2MVx4NmJceDUxIlwKKyJceDAwXHgwMFx4ODBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDEwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDAwXHhmMFx4MGZceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIlwKKyJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiB8IGRkIG9mPSIkMSIgYnM9NTEyIHNlZWs9MSBjb252PW5vdHJ1bmMKKworICAjIE1EQSBoZWFkZXIKKyAgZW52IHByaW50ZiBcCisiXHhkOFx4MzZceDJjXHhmNlx4MjBceDRjXHg1Nlx4NGRceDMyXHgyMFx4NzhceDViXHgzNVx4NDFceDI1XHg3MiJcCisiXHgzMFx4NGVceDJhXHgzZVx4MDFceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCJcCisiXHgwMFx4ZjBceDBmXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwNlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCJcCisiXHgwNlx4MDRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDA3XHgzZFx4MDZceDI4XHgwMFx4MDBceDAwXHgwMCJcCisiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIgfCBkZCBvZj0iJDEiIGJzPTQwOTYgc2Vlaz0xIGNvbnY9bm90cnVuYworCisgICMgVkcgbWV0YWRhdGEKKyAgZW52IHByaW50ZiBcCisiXHg0Y1x4NTZceDRkXHg1NFx4NDVceDUzXHg1NFx4MzFceDMyXHgzM1x4MzRceDM1XHg3MFx4NzZceDY1XHg3OCJcCisiXHg3NFx4NzVceDcwXHg2NFx4NjFceDc0XHg2NVx4NzZceDY3XHgyMFx4N2JceDBhXHg2OVx4NjRceDIwXHgzZCJcCisiXHgyMFx4MjJceDQyXHg3Mlx4NDdceDZmXHgzNFx4MzNceDJkXHgzNlx4MzVceDYyXHg0OFx4MmRceDQxXHg1NSJcCisiXHg2ZFx4NDNceDJkXHg3N1x4NTZceDc0XHg3MVx4MmRceDUxXHg1M1x4NjNceDY2XHgyZFx4NmJceDVhXHg1MSJcCisiXHg0NVx4MmRceDU4XHg1MVx4NmVceDc5XHgzMVx4NDRceDIyXHgwYVx4NzNceDY1XHg3MVx4NmVceDZmXHgyMCJcCisiXHgzZFx4MjBceDMxXHgwYVx4NjZceDZmXHg3Mlx4NmRceDYxXHg3NFx4MjBceDNkXHgyMFx4MjJceDZjXHg3NiJcCisiXHg2ZFx4MzJceDIyXHgwYVx4NzNceDc0XHg2MVx4NzRceDc1XHg3M1x4MjBceDNkXHgyMFx4NWJceDIyXHg1MiJcCisiXHg0NVx4NTNceDQ5XHg1YVx4NDVceDQxXHg0Mlx4NGNceDQ1XHgyMlx4MmNceDIwXHgyMlx4NTJceDQ1XHg0MSJcCisiXHg0NFx4MjJceDJjXHgyMFx4MjJceDU3XHg1Mlx4NDlceDU0XHg0NVx4MjJceDVkXHgwYVx4NjZceDZjXHg2MSJcCisiXHg2N1x4NzNceDIwXHgzZFx4MjBceDViXHg1ZFx4MGFceDY1XHg3OFx4NzRceDY1XHg2ZVx4NzRceDVmXHg3MyJcCisiXHg2OVx4N2FceDY1XHgyMFx4M2RceDIwXHgzOFx4MzFceDM5XHgzMlx4MGFceDZkXHg2MVx4NzhceDVmXHg2YyJcCisiXHg3Nlx4MjBceDNkXHgyMFx4MzBceDBhXHg2ZFx4NjFceDc4XHg1Zlx4NzBceDc2XHgyMFx4M2RceDIwXHgzMCJcCisiXHgwYVx4NmRceDY1XHg3NFx4NjFceDY0XHg2MVx4NzRceDYxXHg1Zlx4NjNceDZmXHg3MFx4NjlceDY1XHg3MyJcCisiXHgyMFx4M2RceDIwXHgzMFx4MGFceDBhXHg3MFx4NjhceDc5XHg3M1x4NjlceDYzXHg2MVx4NmNceDVmXHg3NiJcCisiXHg2Zlx4NmNceDc1XHg2ZFx4NjVceDczXHgyMFx4N2JceDBhXHgwYVx4NzBceDc2XHgzMFx4MjBceDdiXHgwYSJcCisiXHg2OVx4NjRceDIwXHgzZFx4MjBceDIyXHg2NFx4MzVceDU2XHgzM1x4MzhceDVhXHgyZFx4NTdceDQ5XHg2MyJcCisiXHg3YVx4MmRceDY0XHg2M1x4MzRceDM4XHgyZFx4MzdceDY3XHg0ZFx4NzlceDJkXHg0Nlx4NGJceDZjXHg2ZCJcCisiXHgyZFx4NjhceDM5XHg0ZVx4NzNceDJkXHgzNFx4NmZceDc4XHg2MVx4NmJceDUxXHgyMlx4MGFceDY0XHg2NSJcCisiXHg3Nlx4NjlceDYzXHg2NVx4MjBceDNkXHgyMFx4MjJceDJmXHg2NFx4NjVceDc2XHgyZlx4NmNceDZmXHg2ZiJcCisiXHg3MFx4MzBceDIyXHgwYVx4MGFceDczXHg3NFx4NjFceDc0XHg3NVx4NzNceDIwXHgzZFx4MjBceDViXHgyMiJcCisiXHg0MVx4NGNceDRjXHg0Zlx4NDNceDQxXHg1NFx4NDFceDQyXHg0Y1x4NDVceDIyXHg1ZFx4MGFceDY2XHg2YyJcCisiXHg2MVx4NjdceDczXHgyMFx4M2RceDIwXHg1Ylx4NWRceDBhXHg2NFx4NjVceDc2XHg1Zlx4NzNceDY5XHg3YSJcCisiXHg2NVx4MjBceDNkXHgyMFx4MzFceDM2XHgzM1x4MzhceDM0XHgwYVx4NzBceDY1XHg1Zlx4NzNceDc0XHg2MSJcCisiXHg3Mlx4NzRceDIwXHgzZFx4MjBceDMyXHgzMFx4MzRceDM4XHgwYVx4NzBceDY1XHg1Zlx4NjNceDZmXHg3NSJcCisiXHg2ZVx4NzRceDIwXHgzZFx4MjBceDMxXHgwYVx4N2RceDBhXHg3ZFx4MGFceDBhXHg3ZFx4MGFceDIzXHgyMCJcCisiXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg3NFx4NjVceDY0XHgyMFx4NjJceDc5XHgyMFx4NGNceDU2XHg0ZCJcCisiXHgzMlx4MjBceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlXHgyMFx4MzJceDJlXHgzMFx4MzJceDJlXHgzMSJcCisiXHgzNFx4MzJceDI4XHgzMlx4MjlceDJkXHg2N1x4NjlceDc0XHgyMFx4MjhceDMyXHgzMFx4MzFceDM2XHgyZCJcCisiXHgzMFx4MzJceDJkXHgzMVx4MzVceDI5XHgzYVx4MjBceDU3XHg2NVx4NjRceDIwXHg0YVx4NzVceDZjXHgyMCJcCisiXHgzMlx4MzdceDIwXHgzMVx4MzFceDNhXHgzMlx4MzVceDNhXHgzMFx4MzdceDIwXHgzMlx4MzBceDMxXHgzNiJcCisiXHgwYVx4MGFceDYzXHg2Zlx4NmVceDc0XHg2NVx4NmVceDc0XHg3M1x4MjBceDNkXHgyMFx4MjJceDU0XHg2NSJcCisiXHg3OFx4NzRceDIwXHg0Nlx4NmZceDcyXHg2ZFx4NjFceDc0XHgyMFx4NTZceDZmXHg2Y1x4NzVceDZkXHg2NSJcCisiXHgyMFx4NDdceDcyXHg2Zlx4NzVceDcwXHgyMlx4MGFceDc2XHg2NVx4NzJceDczXHg2OVx4NmZceDZlXHgyMCJcCisiXHgzZFx4MjBceDMxXHgwYVx4MGFceDY0XHg2NVx4NzNceDYzXHg3Mlx4NjlceDcwXHg3NFx4NjlceDZmXHg2ZSJcCisiXHgyMFx4M2RceDIwXHgyMlx4MjJceDBhXHgwYVx4NjNceDcyXHg2NVx4NjFceDc0XHg2OVx4NmZceDZlXHg1ZiJcCisiXHg2OFx4NmZceDczXHg3NFx4MjBceDNkXHgyMFx4MjJceDY2XHg2NVx4NjRceDZmXHg3Mlx4NjFceDJlXHg3NiJcCisiXHg2OVx4NzJceDc0XHgyMlx4MDlceDIzXHgyMFx4NGNceDY5XHg2ZVx4NzVceDc4XHgyMFx4NjZceDY1XHg2NCJcCisiXHg2Zlx4NzJceDYxXHgyZVx4NzZceDY5XHg3Mlx4NzRceDIwXHgzNFx4MmVceDM2XHgyZVx4MzRceDJkXHgzMyJcCisiXHgzMFx4MzFceDJlXHg2Nlx4NjNceDMyXHgzNFx4MmVceDc4XHgzOFx4MzZceDVmXHgzNlx4MzRceDIwXHgyMyJcCisiXHgzMVx4MjBceDUzXHg0ZFx4NTBceDIwXHg1NFx4NzVceDY1XHgyMFx4NGFceDc1XHg2Y1x4MjBceDMxXHgzMiJcCisiXHgyMFx4MzFceDMxXHgzYVx4MzVceDMwXHgzYVx4MzBceDMwXHgyMFx4NTVceDU0XHg0M1x4MjBceDMyXHgzMCJcCisiXHgzMVx4MzZceDIwXHg3OFx4MzhceDM2XHg1Zlx4MzZceDM0XHgwYVx4NjNceDcyXHg2NVx4NjFceDc0XHg2OSJcCisiXHg2Zlx4NmVceDVmXHg3NFx4NjlceDZkXHg2NVx4MjBceDNkXHgyMFx4MzFceDM0XHgzNlx4MzlceDM2XHgzMSJcCisiXHgzMVx4MzVceDMwXHgzN1x4MDlceDIzXHgyMFx4NTdceDY1XHg2NFx4MjBceDRhXHg3NVx4NmNceDIwXHgzMiJcCisiXHgzN1x4MjBceDMxXHgzMVx4M2FceDMyXHgzNVx4M2FceDMwXHgzN1x4MjBceDMyXHgzMFx4MzFceDM2XHgwYSJcCisiXHgwYVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCJcCisiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIgfCBkZCBvZj0iJDEiIGJzPTQ2MDggc2Vlaz0xIGNvbnY9bm90cnVuYworCisgIGVudiBwcmludGYgXAorIlx4NGNceDU2XHg0ZFx4NTRceDQ1XHg1M1x4NTRceDMxXHgzMlx4MzNceDM0XHgzNVx4NzBceDc2XHg2NVx4NzgiXAorIlx4NzRceDc1XHg3MFx4NjRceDYxXHg3NFx4NjVceDc2XHg2N1x4MjBceDdiXHgwYVx4NjlceDY0XHgyMFx4M2QiXAorIlx4MjBceDIyXHg0Mlx4NzJceDQ3XHg2Zlx4MzRceDMzXHgyZFx4MzZceDM1XHg2Mlx4NDhceDJkXHg0MVx4NTUiXAorIlx4NmRceDQzXHgyZFx4NzdceDU2XHg3NFx4NzFceDJkXHg1MVx4NTNceDYzXHg2Nlx4MmRceDZiXHg1YVx4NTEiXAorIlx4NDVceDJkXHg1OFx4NTFceDZlXHg3OVx4MzFceDQ0XHgyMlx4MGFceDczXHg2NVx4NzFceDZlXHg2Zlx4MjAiXAorIlx4M2RceDIwXHgzMlx4MGFceDY2XHg2Zlx4NzJceDZkXHg2MVx4NzRceDIwXHgzZFx4MjBceDIyXHg2Y1x4NzYiXAorIlx4NmRceDMyXHgyMlx4MGFceDczXHg3NFx4NjFceDc0XHg3NVx4NzNceDIwXHgzZFx4MjBceDViXHgyMlx4NTIiXAorIlx4NDVceDUzXHg0OVx4NWFceDQ1XHg0MVx4NDJceDRjXHg0NVx4MjJceDJjXHgyMFx4MjJceDUyXHg0NVx4NDEiXAorIlx4NDRceDIyXHgyY1x4MjBceDIyXHg1N1x4NTJceDQ5XHg1NFx4NDVceDIyXHg1ZFx4MGFceDY2XHg2Y1x4NjEiXAorIlx4NjdceDczXHgyMFx4M2RceDIwXHg1Ylx4NWRceDBhXHg2NVx4NzhceDc0XHg2NVx4NmVceDc0XHg1Zlx4NzMiXAorIlx4NjlceDdhXHg2NVx4MjBceDNkXHgyMFx4MzhceDMxXHgzOVx4MzJceDBhXHg2ZFx4NjFceDc4XHg1Zlx4NmMiXAorIlx4NzZceDIwXHgzZFx4MjBceDMwXHgwYVx4NmRceDYxXHg3OFx4NWZceDcwXHg3Nlx4MjBceDNkXHgyMFx4MzAiXAorIlx4MGFceDZkXHg2NVx4NzRceDYxXHg2NFx4NjFceDc0XHg2MVx4NWZceDYzXHg2Zlx4NzBceDY5XHg2NVx4NzMiXAorIlx4MjBceDNkXHgyMFx4MzBceDBhXHgwYVx4NzBceDY4XHg3OVx4NzNceDY5XHg2M1x4NjFceDZjXHg1Zlx4NzYiXAorIlx4NmZceDZjXHg3NVx4NmRceDY1XHg3M1x4MjBceDdiXHgwYVx4MGFceDcwXHg3Nlx4MzBceDIwXHg3Ylx4MGEiXAorIlx4NjlceDY0XHgyMFx4M2RceDIwXHgyMlx4NjRceDM1XHg1Nlx4MzNceDM4XHg1YVx4MmRceDU3XHg0OVx4NjMiXAorIlx4N2FceDJkXHg2NFx4NjNceDM0XHgzOFx4MmRceDM3XHg2N1x4NGRceDc5XHgyZFx4NDZceDRiXHg2Y1x4NmQiXAorIlx4MmRceDY4XHgzOVx4NGVceDczXHgyZFx4MzRceDZmXHg3OFx4NjFceDZiXHg1MVx4MjJceDBhXHg2NFx4NjUiXAorIlx4NzZceDY5XHg2M1x4NjVceDIwXHgzZFx4MjBceDIyXHgyZlx4NjRceDY1XHg3Nlx4MmZceDZjXHg2Zlx4NmYiXAorIlx4NzBceDMwXHgyMlx4MGFceDBhXHg3M1x4NzRceDYxXHg3NFx4NzVceDczXHgyMFx4M2RceDIwXHg1Ylx4MjIiXAorIlx4NDFceDRjXHg0Y1x4NGZceDQzXHg0MVx4NTRceDQxXHg0Mlx4NGNceDQ1XHgyMlx4NWRceDBhXHg2Nlx4NmMiXAorIlx4NjFceDY3XHg3M1x4MjBceDNkXHgyMFx4NWJceDVkXHgwYVx4NjRceDY1XHg3Nlx4NWZceDczXHg2OVx4N2EiXAorIlx4NjVceDIwXHgzZFx4MjBceDMxXHgzNlx4MzNceDM4XHgzNFx4MGFceDcwXHg2NVx4NWZceDczXHg3NFx4NjEiXAorIlx4NzJceDc0XHgyMFx4M2RceDIwXHgzMlx4MzBceDM0XHgzOFx4MGFceDcwXHg2NVx4NWZceDYzXHg2Zlx4NzUiXAorIlx4NmVceDc0XHgyMFx4M2RceDIwXHgzMVx4MGFceDdkXHgwYVx4N2RceDBhXHgwYVx4NmNceDZmXHg2N1x4NjkiXAorIlx4NjNceDYxXHg2Y1x4NWZceDc2XHg2Zlx4NmNceDc1XHg2ZFx4NjVceDczXHgyMFx4N2JceDBhXHgwYVx4NmMiXAorIlx4NzZceDZmXHg2Y1x4MzBceDIwXHg3Ylx4MGFceDY5XHg2NFx4MjBceDNkXHgyMFx4MjJceDQ2XHg3M1x4MzYiXAorIlx4NmNceDZhXHg2Ylx4MmRceDRhXHg2NVx4NWFceDM1XHgyZFx4NTVceDRlXHg3NVx4MzdceDJkXHgzMlx4NDEiXAorIlx4MzNceDUwXHgyZFx4NzZceDMwXHg0MVx4NDNceDJkXHg2NFx4NjNceDY0XHgzNlx4MmRceDMyXHgzM1x4MzgiXAorIlx4MzlceDRkXHg3Nlx4MjJceDBhXHg3M1x4NzRceDYxXHg3NFx4NzVceDczXHgyMFx4M2RceDIwXHg1Ylx4MjIiXAorIlx4NTJceDQ1XHg0MVx4NDRceDIyXHgyY1x4MjBceDIyXHg1N1x4NTJceDQ5XHg1NFx4NDVceDIyXHgyY1x4MjAiXAorIlx4MjJceDU2XHg0OVx4NTNceDQ5XHg0Mlx4NGNceDQ1XHgyMlx4NWRceDBhXHg2Nlx4NmNceDYxXHg2N1x4NzMiXAorIlx4MjBceDNkXHgyMFx4NWJceDVkXHgwYVx4NjNceDcyXHg2NVx4NjFceDc0XHg2OVx4NmZceDZlXHg1Zlx4NjgiXAorIlx4NmZceDczXHg3NFx4MjBceDNkXHgyMFx4MjJceDY2XHg2NVx4NjRceDZmXHg3Mlx4NjFceDJlXHg3Nlx4NjkiXAorIlx4NzJceDc0XHgyMlx4MGFceDYzXHg3Mlx4NjVceDYxXHg3NFx4NjlceDZmXHg2ZVx4NWZceDc0XHg2OVx4NmQiXAorIlx4NjVceDIwXHgzZFx4MjBceDMxXHgzNFx4MzZceDM5XHgzNlx4MzFceDMxXHgzNVx4MzFceDMwXHgwYVx4NzMiXAorIlx4NjVceDY3XHg2ZFx4NjVceDZlXHg3NFx4NWZceDYzXHg2Zlx4NzVceDZlXHg3NFx4MjBceDNkXHgyMFx4MzEiXAorIlx4MGFceDBhXHg3M1x4NjVceDY3XHg2ZFx4NjVceDZlXHg3NFx4MzFceDIwXHg3Ylx4MGFceDczXHg3NFx4NjEiXAorIlx4NzJceDc0XHg1Zlx4NjVceDc4XHg3NFx4NjVceDZlXHg3NFx4MjBceDNkXHgyMFx4MzBceDBhXHg2NVx4NzgiXAorIlx4NzRceDY1XHg2ZVx4NzRceDVmXHg2M1x4NmZceDc1XHg2ZVx4NzRceDIwXHgzZFx4MjBceDMxXHgwYVx4MGEiXAorIlx4NzRceDc5XHg3MFx4NjVceDIwXHgzZFx4MjBceDIyXHg3M1x4NzRceDcyXHg2OVx4NzBceDY1XHg2NFx4MjIiXAorIlx4MGFceDczXHg3NFx4NzJceDY5XHg3MFx4NjVceDVmXHg2M1x4NmZceDc1XHg2ZVx4NzRceDIwXHgzZFx4MjAiXAorIlx4MzFceDBhXHgwYVx4NzNceDc0XHg3Mlx4NjlceDcwXHg2NVx4NzNceDIwXHgzZFx4MjBceDViXHgwYVx4MjIiXAorIlx4NzBceDc2XHgzMFx4MjJceDJjXHgyMFx4MzBceDBhXHg1ZFx4MGFceDdkXHgwYVx4N2RceDBhXHg3ZFx4MGEiXAorIlx4N2RceDBhXHgyM1x4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDc0XHg2NVx4NjRceDIwXHg2Mlx4NzkiXAorIlx4MjBceDRjXHg1Nlx4NGRceDMyXHgyMFx4NzZceDY1XHg3Mlx4NzNceDY5XHg2Zlx4NmVceDIwXHgzMlx4MmUiXAorIlx4MzBceDMyXHgyZVx4MzFceDM0XHgzMlx4MjhceDMyXHgyOVx4MmRceDY3XHg2OVx4NzRceDIwXHgyOFx4MzIiXAorIlx4MzBceDMxXHgzNlx4MmRceDMwXHgzMlx4MmRceDMxXHgzNVx4MjlceDNhXHgyMFx4NTdceDY1XHg2NFx4MjAiXAorIlx4NGFceDc1XHg2Y1x4MjBceDMyXHgzN1x4MjBceDMxXHgzMVx4M2FceDMyXHgzNVx4M2FceDMxXHgzMFx4MjAiXAorIlx4MzJceDMwXHgzMVx4MzZceDBhXHgwYVx4NjNceDZmXHg2ZVx4NzRceDY1XHg2ZVx4NzRceDczXHgyMFx4M2QiXAorIlx4MjBceDIyXHg1NFx4NjVceDc4XHg3NFx4MjBceDQ2XHg2Zlx4NzJceDZkXHg2MVx4NzRceDIwXHg1Nlx4NmYiXAorIlx4NmNceDc1XHg2ZFx4NjVceDIwXHg0N1x4NzJceDZmXHg3NVx4NzBceDIyXHgwYVx4NzZceDY1XHg3Mlx4NzMiXAorIlx4NjlceDZmXHg2ZVx4MjBceDNkXHgyMFx4MzFceDBhXHgwYVx4NjRceDY1XHg3M1x4NjNceDcyXHg2OVx4NzAiXAorIlx4NzRceDY5XHg2Zlx4NmVceDIwXHgzZFx4MjBceDIyXHgyMlx4MGFceDBhXHg2M1x4NzJceDY1XHg2MVx4NzQiXAorIlx4NjlceDZmXHg2ZVx4NWZceDY4XHg2Zlx4NzNceDc0XHgyMFx4M2RceDIwXHgyMlx4NjZceDY1XHg2NFx4NmYiXAorIlx4NzJceDYxXHgyZVx4NzZceDY5XHg3Mlx4NzRceDIyXHgwOVx4MjNceDIwXHg0Y1x4NjlceDZlXHg3NVx4NzgiXAorIlx4MjBceDY2XHg2NVx4NjRceDZmXHg3Mlx4NjFceDJlXHg3Nlx4NjlceDcyXHg3NFx4MjBceDM0XHgyZVx4MzYiXAorIlx4MmVceDM0XHgyZFx4MzNceDMwXHgzMVx4MmVceDY2XHg2M1x4MzJceDM0XHgyZVx4NzhceDM4XHgzNlx4NWYiXAorIlx4MzZceDM0XHgyMFx4MjNceDMxXHgyMFx4NTNceDRkXHg1MFx4MjBceDU0XHg3NVx4NjVceDIwXHg0YVx4NzUiXAorIlx4NmNceDIwXHgzMVx4MzJceDIwXHgzMVx4MzFceDNhXHgzNVx4MzBceDNhXHgzMFx4MzBceDIwXHg1NVx4NTQiXAorIlx4NDNceDIwXHgzMlx4MzBceDMxXHgzNlx4MjBceDc4XHgzOFx4MzZceDVmXHgzNlx4MzRceDBhXHg2M1x4NzIiXAorIlx4NjVceDYxXHg3NFx4NjlceDZmXHg2ZVx4NWZceDc0XHg2OVx4NmRceDY1XHgyMFx4M2RceDIwXHgzMVx4MzQiXAorIlx4MzZceDM5XHgzNlx4MzFceDMxXHgzNVx4MzFceDMwXHgwOVx4MjNceDIwXHg1N1x4NjVceDY0XHgyMFx4NGEiXAorIlx4NzVceDZjXHgyMFx4MzJceDM3XHgyMFx4MzFceDMxXHgzYVx4MzJceDM1XHgzYVx4MzFceDMwXHgyMFx4MzIiXAorIlx4MzBceDMxXHgzNlx4MGFceDBhXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiXAorIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiIHwgZGQgb2Y9IiQxIiBicz01NjMyIHNlZWs9MSBjb252PW5vdHJ1bmMKKworICBhdXggbm90aWZ5X2x2bWV0YWQgIiQxIgorfQorCithdXggcHJlcGFyZV9kZXZzIDEgOAorCitjcmVhdGVfcHZfd2l0aF9leHRfdnNuMV9hbmRfdmcgIiRkZXYxIgorCisjIHB2cyBkb2Vzbid0IHVwZGF0ZSBQViBoZWFkZXIgYmVjYXVzZSBpdCBob2xkcyBvbmx5IFZHIHJlYWQgbG9jaworY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9leHRfdnNuIDEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfaW5fdXNlICJ1c2VkIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiB2Z19uYW1lICIkVkdfTkFNRSIKK2x2cyAiJFZHX05BTUUiLyIkTFZfTkFNRSIKKworIyBhbiBMVk0gY29tbWFuZCB0YWtpbmcgVkcgd3JpdGUgbG9jayB3aWxsIGFsc28gY2F1c2UgUFYgaGVhZGVyIHVwZGF0ZSB0byByZWNlbnQgdmVyc2lvbgordmdjaGFuZ2UgLS1hZGR0YWcgdGVzdCAkVkdfTkFNRQorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9leHRfdnNuIDIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfaW5fdXNlICJ1c2VkIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiB2Z19uYW1lICIkVkdfTkFNRSIKK2x2cyAiJFZHX05BTUUiLyIkTFZfTkFNRSIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHYtbWluLXNpemUuc2ggYi90ZXN0L3NoZWxsL3B2LW1pbi1zaXplLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMWZiM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2LW1pbi1zaXplLnNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyB1c2Ugc21hbGwgZGVmYXVsdCBzaXplICAtIDUxMktCCithdXggbHZtY29uZiAnZGV2aWNlcy9wdl9taW5fc2l6ZSA9IDUxMicKKworYXV4IHByZXBhcmVfcHZzIDEgOAorCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X25hbWUgIiRkZXYxIgorCisjIGluY3JlYXNlIG1pbiBzaXplIGJleW9uZCBjcmVhdGVkIFBWIHNpemUgMTBNQgorYXV4IGx2bWNvbmYgJ2RldmljZXMvcHZfbWluX3NpemUgPSAxMDI0MCcKKworIyBhbmQgdGVzdCBkZXZpY2UgaXMgbm90IHZpc2libGUKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X25hbWUgIiRkZXYxIgorCisjIHNldCB0b28gbG93IHZhbHVlIGVycm9ybm91cyB2YWx1ZQorYXV4IGx2bWNvbmYgJ2RldmljZXMvcHZfbWluX3NpemUgPSAtMTAwJworCisjIGNoZWNrIHRoZSBpbmNvcnJlY3QgdmFsdWUgaXMgcHJpbnRlZAorcHZzICIkZGV2MSIgMj4mMSB8IGdyZXAgLS0gLTEwMApkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdi1yYW5nZS1vdmVyZmxvdy5zaCBiL3Rlc3Qvc2hlbGwvcHYtcmFuZ2Utb3ZlcmZsb3cuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZDY1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHYtcmFuZ2Utb3ZlcmZsb3cuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyAnRW5zdXJlIHRoYXQgcHZtb3ZlIGRpYWdub3NlcyBQRS1yYW5nZSB2YWx1ZXMgMl4zMiBhbmQgbGFyZ2VyLicKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMgorCitsdmNyZWF0ZSAtTDQgLW4gJGx2ICR2ZworCisjIFRlc3QgZm9yIHRoZSBib2d1cyBkaWFnbm9zdGljIHJlcG9ydGVkIGluIEJaIDI4NDc3MQorIyBodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS8yODQ3NzEuCisjICdydW4gcHZtb3ZlIHdpdGggYW4gdW5yZWNvZ25pemVkIExWIG5hbWUgdG8gc2hvdyBiYWQgZGlhZ25vc3RpYycKK25vdCBwdm1vdmUgLXYgLW5ib2d1cyAiJGRldjEiICIkZGV2MiIgMj4gZXJyCitncmVwICJMb2dpY2FsIHZvbHVtZSBib2d1cyBub3QgZm91bmQuIiBlcnIKKworIyBXaXRoIGx2bS0yLjAyLjI4IGFuZCBlYXJsaWVyLCBvbiBhIHN5c3RlbSB3aXRoIDY0LWJpdCAibG9uZyBpbnQiLAorIyB0aGUgUEUgcmFuZ2UgcGFyc2luZyBjb2RlIHdvdWxkIGFjY2VwdCB2YWx1ZXMgdXAgdG8gMl42NC0xLCBidXQgd291bGQKKyMgc2lsZW50bHkgdHJ1bmNhdGUgdGhlbSB0byBpbnQzMl90LiAgSS5lLiwgJGRldjE6JChlY2hvIDJeMzJ8YmMpIHdvdWxkIGJlCisjIHRyZWF0ZWQganVzdCBsaWtlICRkZXYxOjAuCisjICdydW4gdGhlIG9mZmVuZGluZyBwdm1vdmUgY29tbWFuZCcKK25vdCBwdm1vdmUgLXYgLW4kbHYgIiRkZXYxIjo0Mjk0OTY3Mjk2ICIkZGV2MiIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdmNoYW5nZS11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvcHZjaGFuZ2UtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwYTljMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHZjaGFuZ2UtdXNhZ2Uuc2gKQEAgLTAsMCArMSwxMjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjICdUZXN0IHB2Y2hhbmdlIG9wdGlvbiB2YWx1ZXMnCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitjaGVja19jaGFuZ2VkX3V1aWRfKCkgeworCXRlc3QgIiQxIiAhPSAiJChnZXQgcHZfZmllbGQgIiQyIiB1dWlkKSIgfHwgZGllICJVVUlEIGhhcyBub3QgY2hhbmdlZCEiCit9CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKKyMgY2hlY2sgJ2FsbG9jYXRhYmxlJyBwdiBhdHRyaWJ1dGUKK3B2Y3JlYXRlICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfYXR0ciAtLS0KK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9hdHRyIGEtLQorcHZjaGFuZ2UgLS1hbGxvY2F0YWJsZSBuICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfYXR0ciB1LS0KK3ZncmVtb3ZlIC1mZiAkdmcxCitub3QgcHZjaGFuZ2UgLS1hbGxvY2F0YWJsZSB5ICIkZGV2MSIKK3B2cmVtb3ZlIC1mZiAiJGRldjEiCisKK2ZvciBtZGEgaW4gMCAxIDIKK2RvCisjICJzZXR1cCBwdiB3aXRoIG1ldGFkYXRhY29waWVzID0gJG1kYSIKKwlwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzICRtZGEgIiRkZXYxIgorIyBjYW5ub3QgY2hhbmdlIGFsbG9jYXRhYmlsaXR5IGZvciBvcnBoYW4gUFZzCisJZmFpbCBwdmNoYW5nZSAiJGRldjEiIC14IHkKKwlmYWlsIHB2Y2hhbmdlICIkZGV2MSIgLXggbgorCXZnY3JlYXRlICR2ZzEgIiRkZXY0IiAiJGRldjEiCisKKyMgInB2Y2hhbmdlIGFkZHMvZGVscyB0YWcgdG8gcHZzIHdpdGggbWV0YWRhdGFjb3BpZXMgPSAkbWRhICIKKwlwdmNoYW5nZSAiJGRldjEiIC0tYWRkdGFnIHRlc3QkbWRhCisJY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl90YWdzIHRlc3QkbWRhCisJcHZjaGFuZ2UgIiRkZXYxIiAtLWRlbHRhZyB0ZXN0JG1kYQorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAiIgorCisjICJ2Z2NoYW5nZSBkaXNhYmxlL2VuYWJsZSBhbGxvY2F0aW9uIGZvciBwdnMgd2l0aCBtZXRhZGF0YWNvcGllcyA9ICRtZGEgKGJ6NDUyOTgyKSIKKwlwdmNoYW5nZSAiJGRldjEiIC14IG4KKwlwdmNoYW5nZSAiJGRldjEiIC14IG4gICAjIGFscmVhZHkgZGlzYWJsZWQKKwljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X2F0dHIgIHUtLQorCXB2Y2hhbmdlICIkZGV2MSIgLXggeQorCXB2Y2hhbmdlICIkZGV2MSIgLXggeSAgICMgYWxyZWFkeSBlbmFibGVkCisJY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9hdHRyICBhLS0KKworIyBjaGVjayB3ZSBhcmUgYWJsZSB0byBjaGFuZ2UgbnVtYmVyIG9mIG1hbmFnZWQgbWV0YWRhdGEgYXJlYXMKKwlpZiB0ZXN0ICRtZGEgLWd0IDAgOyB0aGVuCisJCXB2Y2hhbmdlIC0tZm9yY2UgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2MSIKKwllbHNlCisJCSMgYWxyZWFkeSBpZ25vcmVkCisJCWZhaWwgcHZjaGFuZ2UgLS1tZXRhZGF0YWlnbm9yZSB5ICIkZGV2MSIKKwlmaQorIyAncmVtb3ZlIHB2JworCXZncmVtb3ZlICR2ZzEKKwlwdnJlbW92ZSAiJGRldjEiCitkb25lCisKKyMgInB2Y2hhbmdlIHV1aWQiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAyICIkZGV2MiIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCisKKyMgQ2hlY2tpbmcgZm9yIGRpZmZlcmVudCBVVUlEIGFmdGVyIHB2Y2hhbmdlCitVVUlEMT0kKGdldCBwdl9maWVsZCAiJGRldjEiIHV1aWQpCitwdmNoYW5nZSAtdSAiJGRldjEiCitjaGVja19jaGFuZ2VkX3V1aWRfICIkVVVJRDEiICIkZGV2MSIKKworVVVJRDI9JChnZXQgcHZfZmllbGQgIiRkZXYyIiB1dWlkKQorcHZjaGFuZ2UgLXUgIiRkZXYyIgorY2hlY2tfY2hhbmdlZF91dWlkXyAiJFVVSUQyIiAiJGRldjIiCisKK1VVSUQxPSQoZ2V0IHB2X2ZpZWxkICIkZGV2MSIgdXVpZCkKK1VVSUQyPSQoZ2V0IHB2X2ZpZWxkICIkZGV2MiIgdXVpZCkKK3B2Y2hhbmdlIC11IC0tYWxsCitjaGVja19jaGFuZ2VkX3V1aWRfICIkVVVJRDEiICIkZGV2MSIKK2NoZWNrX2NoYW5nZWRfdXVpZF8gIiRVVUlEMiIgIiRkZXYyIgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAyIDAgMAorCisjIHNvbWUgYXJncyBhcmUgbmVlZGVkCitpbnZhbGlkIHB2Y2hhbmdlCisjIHNvbWUgUFYgbmVlZGVkCitpbnZhbGlkIHB2Y2hhbmdlIC0tYWRkdGFnIHRhZworaW52YWxpZCBwdmNoYW5nZSAtLWRlbHRhZyB0YWcKKyMgc29tZSAtLWFsbCAmIFBWIGNhbiBnbyB0b2dldGhlcgoraW52YWxpZCBwdmNoYW5nZSAtYSAiJGRldjEiIC0tYWRkdGFnIHRhZworIyAnLWEnIG5lZWRzIG1vcmUgcGFyYW1zCitpbnZhbGlkIHB2Y2hhbmdlIC1hCisjICctYScgaXMgc2VhcmNoaW5nIGZvciBkZXZzLCBzbyBzcGVjaWZ5aW5nIGRldmljZSBpcyBpbnZhbGlkCitpbnZhbGlkIHB2Y2hhbmdlIC1hICIkZGV2MSIKK2ZhaWwgcHZjaGFuZ2UgLXUgIiRkZXYxLW5vdGZvdW5kIgorCisjIHB2Y2hhbmdlIHJlamVjdHMgdXVpZCBjaGFuZ2UgdW5kZXIgYW4gYWN0aXZlIGx2CitsdmNyZWF0ZSAtbCAxNiAtaSAyIC1uICRsdiAtLWFsbG9jIGFueXdoZXJlICR2ZzEKK2NoZWNrIHB2bHZfY291bnRzICR2ZzEgMiAxIDAKK25vdCBwdmNoYW5nZSAtdSAiJGRldjEiCisKK3ZncmVtb3ZlIC1mICR2ZzEKKworIyBjYW5ub3QgY2hhbmdlIFBWIHRhZyB0byBQViB0aGF0IGlzIG5vdCBpbiBWRyIKK2ZhaWwgcHZjaGFuZ2UgIiRkZXYxIiAtLWFkZHRhZyB0ZXN0CitmYWlsIHB2Y2hhbmdlICIkZGV2MSIgLS1kZWx0YWcgdGVzdAorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNMSIgOyB0aGVuCisjIGNhbm5vdCBhZGQgUFYgdGFnIHRvIGx2bTEgZm9ybWF0CitwdmNyZWF0ZSAtTTEgIiRkZXYxIgordmdjcmVhdGUgLU0xICR2ZzEgIiRkZXYxIgorZmFpbCBwdmNoYW5nZSAiJGRldjEiIC0tYWRkdGFnIHRlc3QKK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZjcmVhdGUtYm9vdGxvYWRlcmFyZWEuc2ggYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLWJvb3Rsb2FkZXJhcmVhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjQ3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLWJvb3Rsb2FkZXJhcmVhLnNoCkBAIC0wLDAgKzEsNjAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHB2Y3JlYXRlIGJvb3Rsb2FkZXIgYXJlYSBzdXBwb3J0JworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMQorYXV4IGx2bWNvbmYgJ2dsb2JhbC9zdWZmaXg9MCcgJ2dsb2JhbC91bml0cz0iYiInCisKKyNDT01NICdwdmNyZWF0ZSBzZXRzL2FsaWducyBib290bG9hZGVyIGFyZWEgY29ycmVjdGx5JworcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50IDI2MjE0NGIgLS1ib290bG9hZGVyYXJlYXNpemUgNjE0NDAwYiAiJGRldjEiCisjIGJhX3N0YXJ0IG11c3QgYmUgYWxpZ25lZCBiYXNlZCBvbiBkYXRhYWxpZ25tZW50CisjIHBlX3N0YXJ0IHN0YXJ0cyBhdCBuZXh0IGRhdGFhbGlnbm1lbnQgbXVsdGlwbGUKKyMgYmFfc2l6ZSBpcyB0aGUgd2hvbGUgc3BhY2UgaW4gYmV0d2VlbiBiYV9zdGFydCBhbmQgcGVfc3RhcnQKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgYmFfc3RhcnQgIjI2MjE0NCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgYmFfc2l6ZSAiNzg2NDMyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAiMTA0ODU3NiIKKworI0NPTU0gJ3B2Y3JlYXRlIHdpdGggYm9vbG9hZGVyIGFyZWEgc2l6ZSAtIHRlc3QgY29ybmVyIGNhc2VzJworZGV2X3NpemU9JChwdnMgLW8gcHZfc2l6ZSAtLW5vaGVhZGluZ3MgIiRkZXYxIikKK3B2X3NpemU9JFtkZXZfc2l6ZSAtIDEwNDg1NzZdICMgZGV2aWNlIHNpemUgLSAxbSBwZV9zdGFydCA9IGFyZWEgZm9yIGRhdGEKKworIyB0cnkgdG8gdXNlIHRoZSB3aG9sZSBkYXRhIGFyZWEgZm9yIGJvb3Rsb2FkZXIgYXJlYSwgcmVtYWluaW5nIGRhdGEgYXJlYSBpcyB6ZXJvIHRoZW4gKHBlX3N0YXJ0ID0gcHZfc2l6ZSkKK3B2Y3JlYXRlIC0tYm9vdGxvYWRlcmFyZWFzaXplICR7cHZfc2l6ZX1iIC0tZGF0YWFsaWdubWVudCAxMDQ4NTc2YiAiJGRldjEiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHBlX3N0YXJ0ICRkZXZfc2l6ZQorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBiYV9zdGFydCAxMDQ4NTc2CitjaGVjayBwdl9maWVsZCAiJGRldjEiIGJhX3NpemUgJHB2X3NpemUKKworIyB0cnkgdG8gdXNlIHRoZSB3aG9sZSBkYXRhIGFyZWEgZm9yIGJvb3Rsb2FkZXIgYXJlYSBvbmx5IGFuZCBhZGQgb25lIG1vcmUgYnl0ZSAtIHRoaXMgbXVzdCBlcnJvciBvdXQKK25vdCBwdmNyZWF0ZSAtLWJvb3Rsb2FkZXJhcmVhc2l6ZSAkW3B2X3NpemUgKyAxXSAtLWRhdGFhbGlnbm1lbnQgMTA0ODU3NmIgIiRkZXYxIiAyPmVycgorZ3JlcCAiQm9vdGxvYWRlciBhcmVhIHdpdGggZGF0YS1hbGlnbmVkIHN0YXJ0IG11c3Qgbm90IGV4Y2VlZCBkZXZpY2Ugc2l6ZSIgZXJyCisKKyMgcmVzdG9yaW5nIHRoZSBQViBzaG91bGQgYWxzbyByZXN0b3JlIHRoZSBib290bG9hZGVyIGFyZWEgY29ycmVjdGx5CitwdnJlbW92ZSAtZmYgIiRkZXYxIgorcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50IDI1NmsgLS1ib290bG9hZGVyYXJlYXNpemUgNjAwayAiJGRldjEiCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIgordmdjZmdiYWNrdXAgLWYgJFRFU1RESVIvdmdfd2l0aF9iYV9iYWNrdXAgJHZnCitwdl91dWlkPSQoZ2V0IHB2X2ZpZWxkICIkZGV2MSIgcHZfdXVpZCkKK3ZncmVtb3ZlIC1mZiAkdmcKK3B2cmVtb3ZlIC1mZiAiJGRldjEiCitwdmNyZWF0ZSAtLWRhdGFhbGlnbm1lbnQgMjU2ayAtLXJlc3RvcmVmaWxlICRURVNURElSL3ZnX3dpdGhfYmFfYmFja3VwIC0tdXVpZCAiJHB2X3V1aWQiICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgYmFfc3RhcnQgIjI2MjE0NCIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgYmFfc2l6ZSAiNzg2NDMyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAiMTA0ODU3NiIKKworIyBlcnJvciBvdXQgd2hlbiByZXN0b3JpbmcgdGhlIFBWIGFuZCB0cnlpbmcgdG8gdXNlIG92ZXJsYXBwaW5nIGJvb3Rsb2FkZXIgYXJlYQorcHZyZW1vdmUgLWZmICIkZGV2MSIKK25vdCBwdmNyZWF0ZSAtLXJlc3RvcmVmaWxlICRURVNURElSL3ZnX3dpdGhfYmFfYmFja3VwIC0tdXVpZCAiJHB2X3V1aWQiIC0tYm9vdGxvYWRlcmFyZWFzaXplIDFtICIkZGV2MSIgMj5lcnIKK2dyZXAgIkJvb3Rsb2FkZXIgYXJlYSB3b3VsZCBvdmVybGFwIGRhdGEgYXJlYSIgZXJyCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2Y3JlYXRlLWZmLnNoIGIvdGVzdC9zaGVsbC9wdmNyZWF0ZS1mZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU5ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdmNyZWF0ZS1mZi5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMgorcHZjcmVhdGUgIiRkZXYxIgordmdjcmVhdGUgZm9vICIkZGV2MSIKK3B2Y3JlYXRlIC1mZiAteSAiJGRldjEiCit2Z3MKK3ZnY3JlYXRlIGZvbyAiJGRldjEiCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2Y3JlYXRlLW1ldGFkYXRhMC5zaCBiL3Rlc3Qvc2hlbGwvcHZjcmVhdGUtbWV0YWRhdGEwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTk4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLW1ldGFkYXRhMC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIworIyBUZXN0Y2FzZSBmb3IgYnVnemlsbGEgIzQ1MDY1MQorIyBhbHNvIGNoZWNrcyB0aGF0IHZncmVtb3ZlIHByb3Blcmx5IHJlbW92ZXMgYWxsIGx2IGRldmljZXMgaW4gdGhlIHJpZ2h0IG9yZGVyCisjCisjICdUZXN0IHB2Y3JlYXRlIHdpdGhvdXQgbWV0YWRhdGEgb24gYWxsIHB2cycKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMiAxMjgKKworI2x2X3NuYXA9JGx2MgorcHZjcmVhdGUgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MiIKKworIyAiY2hlY2sgbHYgc25hcHNob3QiCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtYWV5IC1uICRsdiAtbCA2MCVGUkVFICR2ZworbHZjcmVhdGUgLXMgLW4gJGx2MiAtbCAxMCVGUkVFICR2Zy8kbHYKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdmNyZWF0ZS1vcGVyYXRpb24tbWQuc2ggYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLW9wZXJhdGlvbi1tZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc4MzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdmNyZWF0ZS1vcGVyYXRpb24tbWQuc2gKQEAgLTAsMCArMSwxMjIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIHNraXAgdGhpcyB0ZXN0IGlmIG1kYWRtIG9yIHNmZGlzayAob3Igb3RoZXJzKSBhcmVuJ3QgYXZhaWxhYmxlCit3aGljaCBzZmRpc2sgfHwgc2tpcAorCit0ZXN0IC1mIC9wcm9jL21kc3RhdCAmJiBncmVwIC1xIHJhaWQwIC9wcm9jL21kc3RhdCB8fCBcCisJbW9kcHJvYmUgcmFpZDAgfHwgc2tpcAorCithdXggbHZtY29uZiAnZGV2aWNlcy9tZF9jb21wb25lbnRfZGV0ZWN0aW9uID0gMScKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKK2F1eCBleHRlbmRfZmlsdGVyICJhfC9kZXYvbWQuKnwiCisKK2F1eCBwcmVwYXJlX2RldnMgMgorCisjIGNyZWF0ZSAyIGRpc2sgTUQgcmFpZDAgYXJyYXkgKHN0cmlwZV93aWR0aD0xMjhLKQorYXV4IHByZXBhcmVfbWRfZGV2IDAgNjQgMiAiJGRldjEiICIkZGV2MiIKKworbWRkZXY9JCg8IE1EX0RFVikKK3B2ZGV2PSQoPCBNRF9ERVZfUFYpCisKKyMgVGVzdCBhbGlnbm1lbnQgb2YgUFYgb24gTUQgd2l0aG91dCBhbnkgTUQtYXdhcmUgb3IgdG9wb2xvZ3ktYXdhcmUgZGV0ZWN0aW9uCisjIC0gc2hvdWxkIHRyZWF0ICRtZGRldiBqdXN0IGxpa2UgYW55IG90aGVyIGJsb2NrIGRldmljZQorcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayBcCisgICAgLS1jb25maWcgJ2RldmljZXMge21kX2NodW5rX2FsaWdubWVudD0wIGRhdGFfYWxpZ25tZW50X2RldGVjdGlvbj0wIGRhdGFfYWxpZ25tZW50X29mZnNldF9kZXRlY3Rpb249MH0nIFwKKyAgICAiJHB2ZGV2IgorCitjaGVjayBwdl9maWVsZCAiJHB2ZGV2IiBwZV9zdGFydCAiMS4wMG0iCisKKyMgVGVzdCBtZF9jaHVua19hbGlnbm1lbnQgaW5kZXBlbmRlbnQgb2YgdG9wb2xvZ3ktYXdhcmUgZGV0ZWN0aW9uCitwdmNyZWF0ZSAtLW1ldGFkYXRhc2l6ZSAxMjhrIFwKKyAgICAtLWNvbmZpZyAnZGV2aWNlcyB7ZGF0YV9hbGlnbm1lbnRfZGV0ZWN0aW9uPTAgZGF0YV9hbGlnbm1lbnRfb2Zmc2V0X2RldGVjdGlvbj0wfScgXAorICAgICIkcHZkZXYiCitjaGVjayBwdl9maWVsZCAiJHB2ZGV2IiBwZV9zdGFydCAiMS4wMG0iCisKKyMgVGVzdCBuZXdlciB0b3BvbG9neS1hd2FyZSBhbGlnbm1lbnQgZGV0ZWN0aW9uCisjIC0gZmlyc3QgYWRkZWQgdG8gMi42LjMxIGJ1dCBub3QgInJlbGlhYmxlIiB1bnRpbCAyLjYuMzMKK2lmIGF1eCBrZXJuZWxfYXRfbGVhc3QgMiA2IDMzIDsgdGhlbgorICAgICMgb3B0aW1hbF9pb19zaXplPTEzMTA3MiwgbWluaW11bV9pb19zaXplPTY1NTM2CisgICAgcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayBcCisJLS1jb25maWcgJ2RldmljZXMgeyBtZF9jaHVua19hbGlnbm1lbnQ9MCB9JyAiJHB2ZGV2IgorICAgIGNoZWNrIHB2X2ZpZWxkICIkcHZkZXYiIHBlX3N0YXJ0ICIxLjAwbSIKKyAgICBwdnJlbW92ZSAiJHB2ZGV2IgorZmkKKworIyBwYXJ0aXRpb24gTUQgYXJyYXkgZGlyZWN0bHksIGRlcGVuZHMgb24gYmxrZXh0IGluIExpbnV4ID49IDIuNi4yOAoraWYgYXV4IGtlcm5lbF9hdF9sZWFzdCAyIDYgMjggOyB0aGVuCisgICAgIyBjcmVhdGUgb25lIHBhcnRpdGlvbgorICAgIHNmZGlzayAiJG1kZGV2IiA8PEVPRgorLCw4MworRU9GCisgICAgIyBXYWl0IHRpbGwgYWxsIHBhcnRpdGlvbiBsaW5rcyBpbiB1ZGV2IGFyZSBjcmVhdGVkCisgICAgYXV4IHVkZXZfd2FpdAorCisgICAgIyBTa2lwIHRlc3QgaWYgdWRldiBydWxlIGhhcyBub3QgY3JlYXRlZCBwcm9wZXIgbGlua3MgZm9yIHBhcnRpdGlvbnMKKyAgICB0ZXN0IC1iICIke21kZGV2fXAxIiB8fCB7IGxzIC1sYVIgL2RldiA7IHNraXAgIk1pc3NpbmcgcGFydGl0aW9uIGxpbmsiIDsgfQorCisgICAgcHZzY2FuCisgICAgIyBtYWtlIHN1cmUgcGFydGl0aW9uIG9uIE1EIGlzIF9ub3RfIHJlbW92ZWQKKyAgICAjIC0gdGVzdHMgcGFydGl0aW9uIC0+IHBhcmVudCBsb29rdXAgdmlhIHN5c2ZzIHBhdGhzCisgICAgbm90IHB2Y3JlYXRlIC0tbWV0YWRhdGFzaXplIDEyOGsgIiRwdmRldiIKKworICAgICMgdmVyaWZ5IGFsaWdubWVudF9vZmZzZXQgaXMgYWNjb3VudGVkIGZvciBpbiBwZV9zdGFydAorICAgICMgLSB0b3BvbG9neSBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUgaW4gTGludXggPj0gMi42LjMxCisgICAgIyAtIGFsc28gdGVzdHMgcGFydGl0aW9uIC0+IHBhcmVudCBsb29rdXAgdmlhIHN5c2ZzIHBhdGhzCisKKyAgICAjIENoZWNraW5nIGZvciAnYWxpZ25tZW50X29mZnNldCcgaW4gc3lzZnMgaW1wbGllcyBMaW51eCA+PSAyLjYuMzEKKyAgICAjIGJ1dCByZWxpYWJsZSBhbGlnbm1lbnRfb2Zmc2V0IHN1cHBvcnQgcmVxdWlyZXMga2VybmVsLm9yZyBMaW51eCA+PSAyLjYuMzMKKyAgICBpZiBhdXgga2VybmVsX2F0X2xlYXN0IDIgNiAzMyA7IHRoZW4KKwkjIGluIGNhc2UgdGhlIHN5c3RlbSBpcyBydW5uaW5nIHdpdGhvdXQgZGV2dG1wZnMgL2RldgorCSMgd2FpdCBoZXJlIGZvciBjcmVhdGVkIGRldmljZSBub2RlIG9uIHRtcGZzCisJdGVzdCAiJERNX0RFVl9ESVIiICE9ICIvZGV2IiAmJiBjcCAtTFIgIiR7bWRkZXZ9cDEiICIkRE1fREVWX0RJUiIKKworCXB2Y3JlYXRlIC0tbWV0YWRhdGFzaXplIDEyOGsgIiR7cHZkZXZ9cDEiCisKKwltYWo9JCgoJChzdGF0IC1MIC0tcHJpbnRmPTB4JXQgIiR7bWRkZXZ9cDEiKSkpCisJbWluPSQoKCQoc3RhdCAtTCAtLXByaW50Zj0weCVUICIke21kZGV2fXAxIikpKQorCisJc3lzZnNfYWxpZ25tZW50X29mZnNldD0iL3N5cy9kZXYvYmxvY2svJG1hajokbWluL2FsaWdubWVudF9vZmZzZXQiCisJWyAtZiAiJHN5c2ZzX2FsaWdubWVudF9vZmZzZXQiIF0gJiYgXAorCQlhbGlnbm1lbnRfb2Zmc2V0PSQoPCAiJHN5c2ZzX2FsaWdubWVudF9vZmZzZXQiKSB8fCBcCisJCWFsaWdubWVudF9vZmZzZXQ9MAorCisJIyBkZWZhdWx0IGFsaWdubWVudCBpcyAxTSwgYWRkIGFsaWdubWVudF9vZmZzZXQKKwlwdl9hbGlnbj0kKCgxMDQ4NTc2KyRhbGlnbm1lbnRfb2Zmc2V0KSkKKwljaGVjayBwdl9maWVsZCAiJHtwdmRldn1wMSIgcGVfc3RhcnQgJHB2X2FsaWduIC0tdW5pdHMgYiAtLW5vc3VmZml4CisKKwlwdnJlbW92ZSAiJHtwdmRldn1wMSIKKwl0ZXN0ICIkRE1fREVWX0RJUiIgIT0gIi9kZXYiICYmIHJtIC1mICIkRE1fREVWX0RJUi8ke21kZGV2fXAxIgorICAgIGZpCitmaQorCisjIFRlc3QgbmV3ZXIgdG9wb2xvZ3ktYXdhcmUgYWxpZ25tZW50IGRldGVjdGlvbiB3LyAtLWRhdGFhbGlnbm1lbnQgb3ZlcnJpZGUKK2lmIGF1eCBrZXJuZWxfYXRfbGVhc3QgMiA2IDMzIDsgdGhlbgorICAgICMgbWFrZSBzdXJlIHdlJ3JlIGNsZWFuIGZvciBhbm90aGVyIHRlc3QKKyAgICBkZCBpZj0vZGV2L3plcm8gb2Y9IiRtZGRldiIgYnM9NTEyIGNvdW50PTEKKyAgICBhdXggcHJlcGFyZV9tZF9kZXYgMCAxMDI0IDIgIiRkZXYxIiAiJGRldjIiCisgICAgcHZkZXY9JCg8IE1EX0RFVl9QVikKKworICAgICMgb3B0aW1hbF9pb19zaXplPTIwOTcxNTIsIG1pbmltdW1faW9fc2l6ZT0xMDQ4NTc2CisgICAgcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayBcCisJLS1jb25maWcgJ2RldmljZXMgeyBtZF9jaHVua19hbGlnbm1lbnQ9MCB9JyAiJHB2ZGV2IgorICAgIGNoZWNrIHB2X2ZpZWxkICIkcHZkZXYiIHBlX3N0YXJ0ICIyLjAwbSIKKworICAgICMgbm93IHZlcmlmeSBwZV9zdGFydCBhbGlnbm1lbnQgb3ZlcnJpZGUgdXNpbmcgLS1kYXRhYWxpZ25tZW50CisgICAgcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50IDY0ayAtLW1ldGFkYXRhc2l6ZSAxMjhrIFwKKwktLWNvbmZpZyAnZGV2aWNlcyB7IG1kX2NodW5rX2FsaWdubWVudD0wIH0nICIkcHZkZXYiCisgICAgY2hlY2sgcHZfZmllbGQgIiRwdmRldiIgcGVfc3RhcnQgIjE5Mi4wMGsiCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdmNyZWF0ZS1vcGVyYXRpb24uc2ggYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLW9wZXJhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMwNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdmNyZWF0ZS1vcGVyYXRpb24uc2gKQEAgLTAsMCArMSwxNjcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IGx2bWNvbmYgJ2RldmljZXMvbWRfY29tcG9uZW50X2RldGVjdGlvbiA9IDEnCisKK2F1eCBwcmVwYXJlX2RldnMgNAorCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNMSIgOyB0aGVuCittZGF0eXBlcz0nMSAyJworZWxzZQorbWRhdHlwZXM9JzInCitmaQorCitmb3IgbWRhdHlwZSBpbiAkbWRhdHlwZXMKK2RvCisjIHB2Y3JlYXRlIChsdm0kbWRhdHlwZSkgcmVmdXNlcyB0byBvdmVyd3JpdGUgYW4gbW91bnRlZCBmaWxlc3lzdGVtIChiejE2ODMzMCkKKwl0ZXN0ICEgLWQgbW50ICYmIG1rZGlyIG1udAorCWlmIG1rZTJmcyAiJGRldjEiOyB0aGVuCisJCW1vdW50ICIkZGV2MSIgbW50CisJCW5vdCBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIgMj5lcnIKKwkJZ3JlcCAiQ2FuJ3Qgb3BlbiAkZGV2MSBleGNsdXNpdmVseS4gIE1vdW50ZWQgZmlsZXN5c3RlbT8iIGVycgorCQl1bW91bnQgIiRkZXYxIgorCQkjIHdpcGUgdGhlIGZpbGVzeXN0ZW0gc2lnbmF0dXJlIGZvciBuZXh0CisJCSMgcHZjcmVhdGUgdG8gbm90IGlzc3VlIGFueSBwcm9tcHRzCisJCWRkIGlmPS9kZXYvemVybyBvZj0iJGRldjEiIGJzPTFLIGNvdW50PTIKKwlmaQorCisjIHB2Y3JlYXRlIChsdm0kbWRhdHlwZSkgc3VjY2VlZHMgd2hlbiBydW4gcmVwZWF0ZWRseSAocHYgbm90IGluIGEgdmcpIChiejE3ODIxNikKKyAgICBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIKKyAgICBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIKKyAgICBwdnJlbW92ZSAtZiAiJGRldjEiCisKKyMgcHZjcmVhdGUgKGx2bSRtZGF0eXBlKSBmYWlscyB3aGVuIFBWIGJlbG9uZ3MgdG8gVkcKKyMgICBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIKKyAgICB2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIgorICAgIG5vdCBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIKKworICAgIHZncmVtb3ZlIC1mICR2ZzEKKyAgICBwdnJlbW92ZSAtZiAiJGRldjEiCisKKyMgcHZjcmVhdGUgKGx2bSRtZGF0eXBlKSBmYWlscyB3aGVuIFBWMSBkb2VzIGFuZCBQVjIgZG9lcyBub3QgYmVsb25nIHRvIFZHCisgICAgcHZjcmVhdGUgLU0kbWRhdHlwZSAiJGRldjEiCisgICAgcHZjcmVhdGUgLU0kbWRhdHlwZSAiJGRldjIiCisgICAgdmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIKKworIyBwdmNyZWF0ZSBhIHNlY29uZCB0aW1lIG9uICRkZXYyIGFuZCAkZGV2MQorICAgIG5vdCBwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MiIgIiRkZXYxIgorCisgICAgdmdyZW1vdmUgLWYgJHZnMQorICAgIHB2cmVtb3ZlIC1mICIkZGV2MiIgIiRkZXYxIgorCisjIE5PVEU6IEZvcmNlIHB2Y3JlYXRlIGFmdGVyIHRlc3QgY29tcGxldGlvbiB0byBlbnN1cmUgY2xlYW4gZGV2aWNlCisjdGVzdF9leHBlY3Rfc3VjY2VzcworIyAgInB2Y3JlYXRlIChsdm0kbWRhdHlwZSkgZmFpbHMgb24gbWQgY29tcG9uZW50IGRldmljZSIKKyMgICdtZGFkbSAtQyAtbCByYWlkMCAtbiAyIC9kZXYvbWQwICIkZGV2MSIgIiRkZXYyIiAmJgorIyAgIHB2Y3JlYXRlIC1NJG1kYXR5cGUgIiRkZXYxIjsKKyMgICBzdGF0dXM9JD87IGVjaG8gc3RhdHVzPSRzdGF0dXM7IHRlc3QgJHN0YXR1cyAhPSAwICYmCisjICAgbWRhZG0gLS1zdG9wIC9kZXYvbWQwICYmCisjICAgcHZjcmVhdGUgLWZmIC15IC1NJG1kYXR5cGUgIiRkZXYxIiAiJGRldjIiICYmCisjICAgcHZyZW1vdmUgLWYgIiRkZXYxIiAiJGRldjIiJworZG9uZQorCisjIHB2Y3JlYXRlIChsdm0yKSBmYWlscyB3aXRob3V0IC1mZiB3aGVuIFBWIHdpdGggbWV0YWRhdGFjb3BpZXM9MCBiZWxvbmdzIHRvIFZHCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAxICIkZGV2MiIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCitub3QgcHZjcmVhdGUgIiRkZXYxIgordmdyZW1vdmUgLWYgJHZnMQorcHZyZW1vdmUgLWYgIiRkZXYyIiAiJGRldjEiCisKKyMgcHZjcmVhdGUgKGx2bTIpIHN1Y2NlZWRzIHdpdGggLWZmIHdoZW4gUFYgd2l0aCBtZXRhZGF0YWNvcGllcz0wIGJlbG9uZ3MgdG8gVkcKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDEgIiRkZXYyIgordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK3B2Y3JlYXRlIC1mZiAteSAiJGRldjEiCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnMQordmdyZW1vdmUgLWZmICR2ZzEKK3B2cmVtb3ZlIC1mICIkZGV2MiIgIiRkZXYxIgorCitmb3IgaSBpbiAwIDEgMiAzCitkbworIyBwdmNyZWF0ZSAobHZtMikgc3VjY2VlZHMgd3JpdGluZyBMVk0gbGFiZWwgYXQgc2VjdG9yICRpCisgICAgcHZjcmVhdGUgLS1sYWJlbHNlY3RvciAkaSAiJGRldjEiCisgICAgZGQgaWY9IiRkZXYxIiBicz01MTIgc2tpcD0kaSBjb3VudD0xIDI+L2Rldi9udWxsIHwgc3RyaW5ncyB8IGdyZXAgTEFCRUxPTkUgPi9kZXYvbnVsbAorICAgIHB2cmVtb3ZlIC1mICIkZGV2MSIKK2RvbmUKKworIyBwdmNyZWF0ZSAobHZtMikgZmFpbHMgd3JpdGluZyBMVk0gbGFiZWwgYXQgc2VjdG9yIDQKK25vdCBwdmNyZWF0ZSAtLWxhYmVsc2VjdG9yIDQgIiRkZXYxIgorCitiYWNrdXBmaWxlPSRQUkVGSVgubXliYWNrdXBmaWxlCit1dWlkMT1mcmVkZHktZnJlZC1mcmVkLWZyZWQtZnJlZC1mcmVkLWZyZWRkeQordXVpZDI9ZnJlZGR5LWZyZWQtZnJlZC1mcmVkLWZyZWQtZnJlZC1mcmVkaWUKK2JvZ3VzdXVpZD1mcmVkCisKKyMgcHZjcmVhdGUgcmVqZWN0cyB1dWlkIG9wdGlvbiB3aXRoIGxlc3MgdGhhbiAzMiBjaGFyYWN0ZXJzCitub3QgcHZjcmVhdGUgLS1ub3Jlc3RvcmVmaWxlIC0tdXVpZCAkYm9ndXN1dWlkICIkZGV2MSIKKworIyBwdmNyZWF0ZSByZWplY3RzIHV1aWQgb3B0aW9uIHdpdGhvdXQgcmVzdG9yZWZpbGUKK25vdCBwdmNyZWF0ZSAtLXV1aWQgJHV1aWQxICIkZGV2MSIKKworIyBwdmNyZWF0ZSByZWplY3RzIHV1aWQgYWxyZWFkeSBpbiB1c2UKK3B2Y3JlYXRlIC0tbm9yZXN0b3JlZmlsZSAtLXV1aWQgJHV1aWQxICIkZGV2MSIKK25vdCBwdmNyZWF0ZSAtLW5vcmVzdG9yZWZpbGUgLS11dWlkICR1dWlkMSAiJGRldjIiCisKKyMgcHZjcmVhdGUgcmVqZWN0cyBub24tZXhpc3RlbnQgZmlsZSBnaXZlbiB3aXRoIHJlc3RvcmVmaWxlCitub3QgcHZjcmVhdGUgLS11dWlkICR1dWlkMSAtLXJlc3RvcmVmaWxlICRiYWNrdXBmaWxlICIkZGV2MSIKKworIyBwdmNyZWF0ZSByZWplY3RzIHJlc3RvcmVmaWxlIHdpdGggdXVpZCBub3QgZm91bmQgaW4gZmlsZQorcHZjcmVhdGUgLS1ub3Jlc3RvcmVmaWxlIC0tdXVpZCAkdXVpZDEgIiRkZXYxIgordmdjZmdiYWNrdXAgLWYgJGJhY2t1cGZpbGUKK25vdCBwdmNyZWF0ZSAtLXV1aWQgJHV1aWQyIC0tcmVzdG9yZWZpbGUgJGJhY2t1cGZpbGUgIiRkZXYyIgorCisjIHZnY2ZncmVzdG9yZSBvZiBhIFZHIGNvbnRhaW5pbmcgYSBQViB3aXRoIHplcm8gUEVzIChieiAjODIwMTE2KQorIyAodXNlIGNhc2U6IG9uZSBQViBpbiBhIFZHIHVzZWQgc29sZWx5IHRvIGtlZXAgbWV0YWRhdGEpCitzaXplX21iPSQoKCQoYmxvY2tkZXYgLS1nZXRzeiAiJGRldjEiKSAvIDIwNDgpKQorcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgJHNpemVfbWIgIiRkZXYxIgordmdjcmVhdGUgJHZnMSAiJGRldjEiCit2Z2NmZ2JhY2t1cCAtZiAkYmFja3VwZmlsZQordmdjZmdyZXN0b3JlIC1mICRiYWNrdXBmaWxlICR2ZzEKK3ZncmVtb3ZlIC1mICR2ZzEKK3B2cmVtb3ZlIC1mICIkZGV2MSIKKworIyBwdmNyZWF0ZSAtLXJlc3RvcmVmaWxlIHNob3VsZCBoYW5kbGUgLS1kYXRhYWxpZ25tZW50IGFuZCAtLWRhdGFhbGlnbm1lbnRvZmZzZXQKKyMgYW5kIGNoZWNrIGl0J3MgY29tcGF0aWJsZSB3aXRoIHBlX3N0YXJ0IHZhbHVlIGJlaW5nIHJlc3RvcmVkCisjIFggKiBkYXRhYWxpZ25tZW50ICsgZGF0YWFsaWdubWVudG9mZnNldCA9PSBwZV9zdGFydAorcHZjcmVhdGUgLS1ub3Jlc3RvcmVmaWxlIC0tdXVpZCAkdXVpZDEgLS1kYXRhYWxpZ25tZW50IDYwMGsgLS1kYXRhYWxpZ25tZW50b2Zmc2V0IDMyayAiJGRldjEiCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK3ZnY2ZnYmFja3VwIC1mICRiYWNrdXBmaWxlICR2ZzEKK3ZncmVtb3ZlIC1mZiAkdmcxCitwdnJlbW92ZSAtZmYgIiRkZXYxIgorIyB0aGUgZGF0YWFsaWdubWVudCBhbmQgZGF0YWFsaWdubWVudG9mZnNldCBpcyBpZ25vcmVkIGhlcmUgc2luY2UgdGhleSdyZSBpbmNvbXBhdGlibGUgd2l0aCBwZV9zdGFydAorcHZjcmVhdGUgLS1yZXN0b3JlZmlsZSAkYmFja3VwZmlsZSAtLXV1aWQgJHV1aWQxIC0tZGF0YWFsaWdubWVudCA1MDBrIC0tZGF0YWFsaWdubWVudG9mZnNldCAxMGsgIiRkZXYxIiAyPiBlcnIKK2dyZXAgImluY29tcGF0aWJsZSB3aXRoIHJlc3RvcmVkIHBlX3N0YXJ0IHZhbHVlIiBlcnIKKyMgMzAwayBpcyBtdWx0aXBsZSBvZiA2MDBrIHNvIHRoaXMgc2hvdWxkIHBhc3MKK3B2Y3JlYXRlIC0tcmVzdG9yZWZpbGUgJGJhY2t1cGZpbGUgLS11dWkgJHV1aWQxIC0tZGF0YWFsaWdubWVudCAzMDBrIC0tZGF0YWFsaWdubWVudG9mZnNldCAzMmsgIiRkZXYxIiAyPiBlcnIKK25vdCBncmVwICJpbmNvbXBhdGlibGUgd2l0aCByZXN0b3JlZCBwZV9zdGFydCB2YWx1ZSIgZXJyCitybSAtZiAkYmFja3VwZmlsZQorCisjIHB2Y3JlYXRlIHJlamVjdHMgbm9uLWV4aXN0ZW50IHV1aWQgZ2l2ZW4gd2l0aCByZXN0b3JlZmlsZQorbm90IHB2Y3JlYXRlIC0tdXVpZCAkdXVpZDEgLS1yZXN0b3JlZmlsZSAkYmFja3VwZmlsZSAiJGRldjEiCisKKyMgcHZjcmVhdGUgcmVqZWN0cyByZXN0b3JlZmlsZSB3aXRob3V0IHV1aWQKK25vdCBwdmNyZWF0ZSAtLXJlc3RvcmVmaWxlICRiYWNrdXBmaWxlICIkZGV2MSIKKworIyBwdmNyZWF0ZSByZWplY3RzIHV1aWQgcmVzdG9yZSB3aXRoIG11bHRpcGxlIHZvbHVtZXMgc3BlY2lmaWVkCitub3QgcHZjcmVhdGUgLS11dWlkICR1dWlkMSAtLXJlc3RvcmVmaWxlICRiYWNrdXBmaWxlICIkZGV2MSIgIiRkZXYyIgorCisjIHB2Y3JlYXRlIHdpcGVzIHN3YXAgc2lnbmF0dXJlIHdoZW4gZm9yY2VkCitkZCBpZj0vZGV2L3plcm8gb2Y9IiRkZXYxIiBicz0xMDI0IGNvdW50PTY0Citta3N3YXAgIiRkZXYxIgorYmxraWQgLWMgL2Rldi9udWxsICIkZGV2MSIgfCBncmVwICJzd2FwIgorcHZjcmVhdGUgLWYgIiRkZXYxIgorIyBibGtpZCBjYW5ub3QgbWFrZSB1cCBpdHMgbWluZCB3aGV0aGVyIG5vdCBmaW5kaW5nIGFueXRoaW5nIGl0IGtub3dzIGlzIGEgZmFpbHVyZSBvciBub3QKKyhibGtpZCAtYyAvZGV2L251bGwgIiRkZXYxIiB8fCB0cnVlKSB8IG5vdCBncmVwICJzd2FwIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdmNyZWF0ZS1yZXN0b3JlLnNoIGIvdGVzdC9zaGVsbC9wdmNyZWF0ZS1yZXN0b3JlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGE1N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2Y3JlYXRlLXJlc3RvcmUuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyA0CisKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtTDEwIC1uICRsdjEgJHZnIC0tdmlydHVhbHNpemUgMlQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtTDEwIC1uICRsdjIgJHZnIC0tdmlydHVhbHNpemUgNFQKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtTDEwIC1uICRsdjMgJHZnIC0tdmlydHVhbHNpemUgNDE5NDMwME0KKworYXV4IGV4dGVuZF9maWx0ZXJfTFZNVEVTVAorCit2Z2NyZWF0ZSAkdmcxICIkRE1fREVWX0RJUi8kdmcvJGx2MiIKKwordmdjZmdiYWNrdXAgLWYgdmdiYWNrICR2ZzEKKworVVVJRD0kKGdldCBwdl9maWVsZCAiJERNX0RFVl9ESVIvJHZnLyRsdjIiIHV1aWQpCitwdnJlbW92ZSAtZmYgLXkgIiRETV9ERVZfRElSLyR2Zy8kbHYyIgorCisjIHRvbyBzbWFsbCB0byBmaXQKK2ZhaWwgcHZjcmVhdGUgLS1yZXN0b3JlZmlsZSB2Z2JhY2sgLS11dWlkICRVVUlEICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKKworIyBzdGlsbCBkb2VzIG5vdCBmaXQKK2ZhaWwgcHZjcmVhdGUgLS1yZXN0b3JlZmlsZSB2Z2JhY2sgLS11dWlkICRVVUlEICIkRE1fREVWX0RJUi8kdmcvJGx2MyIKKworcHZjcmVhdGUgLS1yZXN0b3JlZmlsZSB2Z2JhY2sgLS11dWlkICRVVUlEICIkRE1fREVWX0RJUi8kdmcvJGx2MiIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdmNyZWF0ZS11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvcHZjcmVhdGUtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MTNkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHZjcmVhdGUtdXNhZ2Uuc2gKQEAgLTAsMCArMSwyMDYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHB2Y3JlYXRlIG9wdGlvbiB2YWx1ZXMnCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKK1BBR0VTSVpFPSQoZ2V0Y29uZiBQQUdFU0laRSkKKyMgTURBX1NJWkVfTUlOIGRlZmluZWQgaW4gbGliL2Zvcm1hdF90ZXh0L2xheW91dC5oCitNREFfU0laRV9NSU49JCgoOCokUEFHRVNJWkUpKQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDQKKworI0NPTU0gJ3B2Y3JlYXRlIHJlamVjdHMgbmVnYXRpdmUgc2V0cGh5c2ljYWx2b2x1bWVzaXplJworbm90IHB2Y3JlYXRlIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIC0xMDI0ICIkZGV2MSIKKworI0NPTU0gJ3B2Y3JlYXRlIHJlamVjdHMgbmVnYXRpdmUgbWV0YWRhdGFzaXplJworbm90IHB2Y3JlYXRlIC0tbWV0YWRhdGFzaXplIC0xMDI0ICIkZGV2MSIKKworI0NPTU0gJ3B2Y3JlYXRlIHJlamVjdHMgbWV0YWRhdGFzaXplIHRoYXQgaXMgbGVzcyB0aGFuIG1pbmltdW0gc2l6ZScKK25vdCBwdmNyZWF0ZSAtLWRhdGFhbGlnbm1lbnQgJCgoJHtNREFfU0laRV9NSU59LzIpKWIgLS1tZXRhZGF0YXNpemUgJCgoJHtNREFfU0laRV9NSU59LzIpKWIgIiRkZXYxIiAyPmVycgorZ3JlcCAiTWV0YWRhdGEgYXJlYSBzaXplIHRvbyBzbWFsbCIgZXJyCisKKyNDT01NICdwdmNyZWF0ZSBhY2NlcHRzIG1ldGFkYXRhc2l6ZSB0aGF0IGlzIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHNpemUnCitwdmNyZWF0ZSAtLWRhdGFhbGlnbm1lbnQgJHtNREFfU0laRV9NSU59YiAtLW1ldGFkYXRhc2l6ZSAke01EQV9TSVpFX01JTn1iICIkZGV2MSIKKworIyB4LiBtZXRhZGF0YXNpemUgMCwgZGVmYXVsdHMgdG8gMjU1CisjIEZJWE1FOiB1bmFibGUgdG8gY2hlY2sgZGVmYXVsdCB2YWx1ZSwgbm90IGluIHJlcG9ydGluZyBjbWRzCisjIHNob3VsZCBkZWZhdWx0IHRvIDI1NSBhY2NvcmRpbmcgdG8gY29kZQorIyAgIGNoZWNrIHB2X2ZpZWxkIHB2X21kYV9zaXplIDI1NSAKKyNDT01NICdwdmNyZWF0ZSBhY2NlcHRzIG1ldGFkYXRhc2l6ZSAwJworcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMCAiJGRldjEiCitwdnJlbW92ZSAiJGRldjEiCisKKyNWZXJpZnkgdmdfbWRhX3NpemUgaXMgc21hbGxlciBwdl9tZGFfc2l6ZQorcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgNTEyayAiJGRldjEiCitwdmNyZWF0ZSAtLW1ldGFkYXRhc2l6ZSA5NmsgIiRkZXYyIgordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIgorcHZzIC1vICtwdl9tZGFfc2l6ZQorY2hlY2sgY29tcGFyZV9maWVsZHMgdmdzICR2ZyB2Z19tZGFfc2l6ZSBwdnMgIiRkZXYyIiBwdl9tZGFfc2l6ZQordmdyZW1vdmUgJHZnCisKKyMgeC4gbWV0YWRhdGFzaXplIHRvbyBsYXJnZQorIyBGb3Igc29tZSByZWFzb24gd2UgYWxsb3cgdGhpcywgZXZlbiB0aG91Z2ggdGhlcmUncyBubyByb29tIGZvciBkYXRhPworIyNDT01NICAncHZjcmVhdGUgcmVqZWN0cyBtZXRhZGF0YXNpemUgdG9vIGxhcmdlJyAKKyNub3QgcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTAwMDAwMDAwMDAwMDAwICIkZGV2MSIKKworI0NPTU0gJ3B2Y3JlYXRlIHJlamVjdHMgbWV0YWRhdGFjb3BpZXMgPCAwJworbm90IHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgLTEgIiRkZXYxIgorCisjQ09NTSAncHZjcmVhdGUgYWNjZXB0cyBtZXRhZGF0YWNvcGllcyA9IDAsIDEsIDInCitmb3IgaiBpbiBtZXRhZGF0YWNvcGllcyBwdm1ldGFkYXRhY29waWVzCitkbworcHZjcmVhdGUgLS0kaiAwICIkZGV2MSIKK3B2Y3JlYXRlIC0tJGogMSAiJGRldjIiCitwdmNyZWF0ZSAtLSRqIDIgIiRkZXYzIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfY291bnQgMAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9tZGFfY291bnQgMQorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl9tZGFfY291bnQgMgorcHZyZW1vdmUgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2RvbmUKKworI0NPTU0gJ3B2Y3JlYXRlIHJlamVjdHMgbWV0YWRhdGFjb3BpZXMgPiAyJworbm90IHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMyAiJGRldjEiCisKKyNDT01NICdwdmNyZWF0ZSByZWplY3RzIGludmFsaWQgZGV2aWNlJworbm90IHB2Y3JlYXRlICIkZGV2MSJib2d1cworCisjQ09NTSAncHZjcmVhdGUgcmVqZWN0cyBsYWJlbHNlY3RvciA8IDAnCitub3QgcHZjcmVhdGUgLS1sYWJlbHNlY3RvciAtMSAiJGRldjEiCisKKyNDT01NICdwdmNyZWF0ZSByZWplY3RzIGxhYmVsc2VjdG9yID4gMTAwMDAwMDAwMDAwMCcKK25vdCBwdmNyZWF0ZSAtLWxhYmVsc2VjdG9yIDEwMDAwMDAwMDAwMDAgIiRkZXYxIgorCisjIG90aGVyIHBvc3NpYmlsaXRlcyBiYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24gKG5vdCBzdXJlIGhvdyBoYXJkKQorIyB4LiBkZXZpY2UgdG9vIHNtYWxsIChtaW4gb2YgNTEyICogMTAyNCBLQikKKyMgeC4gZGV2aWNlIGZpbHRlcmVkIG91dAorIyB4LiB1bmFibGUgdG8gb3BlbiAvZGV2L3VyYW5kb20gUkRPTkxZCisjIHguIGRldmljZSB0b28gbGFyZ2UgKHBlX2NvdW50ID4gVUlOVDMyX01BWCkKKyMgeC4gZGV2aWNlIHJlYWQtb25seQorIyB4LiB1bmFibGUgdG8gb3BlbiBkZXZpY2UgcmVhZG9ubHkKKyMgeC4gQkxLR0VUU0laRTY0IGZhaWxzCisjIHguIHNldCBzaXplIHRvIHZhbHVlIGluY29uc2lzdGVudCB3aXRoIGRldmljZSAvIFBFIHNpemUKKworI0NPTU0gJ3B2Y3JlYXRlIGJhc2ljIGRhdGFhbGlnbm1lbnQgc2FuaXR5IGNoZWNrcycKK25vdCBwdmNyZWF0ZSAtLWRhdGFhbGlnbm1lbnQgLTEgIiRkZXYxIgorbm90IHB2Y3JlYXRlIC0tZGF0YWFsaWdubWVudCAxZSAiJGRldjEiCitpZiB0ZXN0IC1uICIkTFZNX1RFU1RfTFZNMSIgOyB0aGVuCitub3QgcHZjcmVhdGUgLU0xIC0tZGF0YWFsaWdubWVudCAxICIkZGV2MSIKK2ZpCisKKyNDT01NICdwdmNyZWF0ZSBhbHdheXMgcm91bmRlZCB1cCB0byBwYWdlIHNpemUgZm9yIHN0YXJ0IG9mIGRldmljZScKKyNwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgLS1kYXRhYWxpZ25tZW50IDEgIiRkZXYxIgorIyBhbXVzZSBzaGVsbCBleHBlcnRzCisjY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAkKCgkKGdldGNvbmYgUEFHRVNJWkUpLzEwMjQpKSIuMDBrIgorCisjQ09NTSAncHZjcmVhdGUgc2V0cyBkYXRhIG9mZnNldCBkaXJlY3RseScKK3B2Y3JlYXRlIC0tZGF0YWFsaWdubWVudCA1MTJrICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgIjUxMi4wMGsiCisKKyNDT01NICd2Z2NyZWF0ZS92Z3JlbW92ZSBkbyBub3QgbW9kaWZ5IGRhdGEgb2Zmc2V0IG9mIGV4aXN0aW5nIFBWJwordmdjcmVhdGUgJHZnICIkZGV2MSIgIC0tY29uZmlnICdkZXZpY2VzIHsgZGF0YV9hbGlnbm1lbnQgPSAxMDI0IH0nCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHBlX3N0YXJ0ICI1MTIuMDBrIgordmdyZW1vdmUgJHZnIC0tY29uZmlnICdkZXZpY2VzIHsgZGF0YV9hbGlnbm1lbnQgPSAxMDI0IH0nCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHBlX3N0YXJ0ICI1MTIuMDBrIgorCisjQ09NTSAncHZjcmVhdGUgc2V0cyBkYXRhIG9mZnNldCBuZXh0IHRvIG1kYSBhcmVhJworcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTAwayAtLWRhdGFhbGlnbm1lbnQgMTAwayAiJGRldjEiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHBlX3N0YXJ0ICIyMDAuMDBrIgorCisjIG1ldGFkYXRhIGFyZWEgc3RhcnQgaXMgYWxpZ25lZCBhY2NvcmRpbmcgdG8gcGFnZXNpemUKK2Nhc2UgIiRQQUdFU0laRSIgaW4KKyA2NTUzNikgcHZfYWxpZ249IjE5Mi41MGsiIDs7CisgODE5MikJcHZfYWxpZ249IjEzNi41MGsiIDs7CisgKikJcHZfYWxpZ249IjEzMy4wMGsiIDs7Citlc2FjCisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFzaXplIDEyOGsgLS1kYXRhYWxpZ25tZW50IDMuNWsgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAkcHZfYWxpZ24KKworcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayAtLW1ldGFkYXRhY29waWVzIDIgLS1kYXRhYWxpZ25tZW50IDMuNWsgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAkcHZfYWxpZ24KKworIyBkYXRhIGFyZWEgaXMgYWxpZ25lZCB0byAxTSBieSBkZWZhdWx0LAorIyBkYXRhIGFyZWEgc3RhcnQgaXMgc2hpZnRlZCBieSB0aGUgc3BlY2lmaWVkIGFsaWdubWVudF9vZmZzZXQKK3B2X2FsaWduPTEwNTIxNjBCICMgMTA0ODU3NiArICg3KjUxMikKK3B2Y3JlYXRlIC0tbWV0YWRhdGFzaXplIDEyOGsgLS1kYXRhYWxpZ25tZW50b2Zmc2V0IDdzICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgJHB2X2FsaWduIC0tdW5pdHMgYgorCisjIDJuZCBtZXRhZGF0YSBhcmVhIGlzIGNyZWF0ZWQgd2l0aG91dCBwcm9ibGVtcyB3aGVuCisjIGRhdGEgYXJlYSBzdGFydCBpcyBzaGlmdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50X29mZnNldAorcHZjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayAtLW1ldGFkYXRhY29waWVzIDIgLS1kYXRhYWxpZ25tZW50b2Zmc2V0IDdzICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50IDIKKyMgRklYTUU6IGNvbXBhcmUgc3RhcnQgb2YgMm5kIG1kYSB3aXRoIGFuZCB3aXRob3V0IC0tZGF0YWFsaWdubWVudG9mZnNldAorCisjQ09NTSAncHYgd2l0aCBMVk0xIGNvbXBhdGlibGUgZGF0YSBhbGlnbm1lbnQgY2FuIGJlIGNvbnZlcmV0ZWQnCisjY29tcGF0aWJsZSA9PSBMVk0xX1BFX0FMSUdOID09IDY0aworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTTEiIDsgdGhlbgorcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50IDI1NmsgIiRkZXYxIgordmdjcmVhdGUgLXMgMW0gJHZnICIkZGV2MSIKK3ZnY29udmVydCAtTTEgJHZnCit2Z2NvbnZlcnQgLU0yICR2ZworY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAyNTYuMDBrCit2Z3JlbW92ZSAkdmcKK2ZpCisKKyNDT01NICdwdiB3aXRoIExWTTEgaW5jb21wYXRpYmxlIGRhdGEgYWxpZ25tZW50IGNhbm5vdCBiZSBjb252ZXJldGVkJworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTTEiIDsgdGhlbgorcHZjcmVhdGUgLS1kYXRhYWxpZ25tZW50IDEwayAiJGRldjEiCit2Z2NyZWF0ZSAtcyAxbSAkdmcgIiRkZXYxIgorbm90IHZnY29udmVydCAtTTEgJHZnCit2Z3JlbW92ZSAkdmcKK2ZpCisKKyNDT01NICd2Z2NmZ3Jlc3RvcmUgYWxsb3dzIHBlX3N0YXJ0PTAnCisjYmFzaWNhbGx5IGl0IHByb2R1Y2VzIG5vbnNlbnNlLCBidXQgaXQgdGVzdHMgdmdjZmdyZXN0b3JlLAorI25vdCB0aGF0IGZpbmFsIGNmZyBpcyB1c2FibGUuLi4KK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiCitwdmNyZWF0ZSAiJGRldjIiCit2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiCit2Z2NmZ2JhY2t1cCAtZiBiYWNrdXAuJCQgJHZnCitzZWQgJ3MvcGVfc3RhcnQgPSBbMC05XSovcGVfc3RhcnQgPSAwLycgYmFja3VwLiQkID4gYmFja3VwLiQkMQordmdjZmdyZXN0b3JlIC1mIGJhY2t1cC4kJDEgJHZnCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHBlX3N0YXJ0ICIwIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwZV9zdGFydCAiMCIKK3ZncmVtb3ZlICR2ZworCitlY2hvICJ0ZXN0IHB2Y3JlYXRlIC0tbWV0YWRhdGFpZ25vcmUiCitmb3IgcHZfaW5fdmcgaW4gMSAwOyBkbworZm9yIG1kYWNwIGluIDEgMjsgZG8KK2ZvciBpZ25vcmUgaW4geSBuOyBkbworCWVjaG8gInB2Y3JlYXRlIC0tbWV0YWRhdGFpZ25vcmUgaGFzIHByb3BlciBtZGFfY291bnQgYW5kIG1kYV91c2VkX2NvdW50IgorCXB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwIC0tbWV0YWRhdGFpZ25vcmUgJGlnbm9yZSAiJGRldjEiICIkZGV2MiIKKwljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV9jb3VudCAiJG1kYWNwIgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX2NvdW50ICIkbWRhY3AiCisJaWYgWyAkaWdub3JlID0geSBdOyB0aGVuCisJCWNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX3VzZWRfY291bnQgIjAiCisJCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX3VzZWRfY291bnQgIjAiCisJZWxzZQorCQljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV91c2VkX2NvdW50ICIkbWRhY3AiCisJCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX3VzZWRfY291bnQgIiRtZGFjcCIKKwlmaQorCWVjaG8gInZnY3JlYXRlIGhhcyBwcm9wZXIgdmdfbWRhX2NvdW50IGFuZCB2Z19tZGFfdXNlZF9jb3VudCIKKwlpZiBbICRwdl9pbl92ZyA9IDEgXTsgdGhlbgorCQl2Z2NyZWF0ZSAkdmcgIiRkZXYxIiAiJGRldjIiCisJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfY291bnQgIiQoKCRtZGFjcCAqIDIpKSIKKwkJaWYgWyAkaWdub3JlID0geSBdOyB0aGVuCisJCQljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX3VzZWRfY291bnQgIjEiCisJCWVsc2UKKwkJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAiJCgoJG1kYWNwICogMikpIgorCQlmaQorCQljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyAidW5tYW5hZ2VkIgorCQl2Z3JlbW92ZSAkdmcKKwlmaQorZG9uZQorZG9uZQorZG9uZQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdm1vdmUtYWJvcnQtYWxsLnNoIGIvdGVzdC9zaGVsbC9wdm1vdmUtYWJvcnQtYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGI4NjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1hYm9ydC1hbGwuc2gKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgQ2hlY2sgcHZtb3ZlIC0tYWJvcnQgYmVoYXZpb3VyIGZvciBhbGwgVkdzIGFuZCBQVnMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworIyBJZ25vcmUga25vd24gZmFpbHVyZSB3aGVuIGNsdm1kIGlzIHByb2Nlc3Npbmcgc2VxdWVuY2VzIG9mIGNvbW1hbmRzIGZvciB0d28gVkdzIGluIHBhcmFsbGVsIC0gMjAxNS8wNy8xNyBhZ2sKKyMgQ0xWTUQ6IGlvY3RsL2xpYmRtLWlmYWNlLmM6MTk0MCAgIEludGVybmFsIGVycm9yOiBQZXJmb3JtaW5nIHVuc2FmZSB0YWJsZSBsb2FkIHdoaWxlIDMgZGV2aWNlKHMpIGFyZSBrbm93biB0byBiZSBzdXNwZW5kZWQ6ICAoMjUzOjE5KSAKK2V4cG9ydCBETV9BQk9SVF9PTl9JTlRFUk5BTF9FUlJPUlM9MAorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgNiA2MAorCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZyAiJGRldjEiICIkZGV2MiIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjMiCit2Z2V4dGVuZCAkdmcgIiRkZXYzIgordmdjcmVhdGUgLXMgMTI4ayAkdmcxICIkZGV2NCIgIiRkZXY1IgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2NiIKK3ZnZXh0ZW5kICR2ZzEgIiRkZXY2IgorCisjIFNsb3dkb3duIHdyaXRlcworYXV4IGRlbGF5X2RldiAiJGRldjMiIDAgODAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYzIik6CithdXggZGVsYXlfZGV2ICIkZGV2NiIgMCA4MDAgJChnZXQgZmlyc3RfZXh0ZW50X3NlY3RvciAiJGRldjYiKToKKworZm9yIG1vZGUgaW4gIi0tYXRvbWljIiAiIiA7CitkbworZm9yIGJhY2tncm91bmRhcmcgaW4gIi1iIiAiIiA7CitkbworCisjIENyZWF0ZSBtdWx0aXNlZ21lbnQgTFYKK2x2Y3JlYXRlIC1hbiAtWm4gLWwzMCAtbiAkbHYxICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtYW4gLVpuIC1sMzAgLW4gJGx2MiAkdmcgIiRkZXYyIgorbHZjcmVhdGUgLWFuIC1abiAtbDMwIC1uICRsdjEgJHZnMSAiJGRldjQiCitsdmV4dGVuZCAtbCszMCAtbiAkdmcxLyRsdjEgIiRkZXY1IgorCitjbWQxPShwdm1vdmUgLWkxICRiYWNrZ3JvdW5kYXJnICRtb2RlICIkZGV2MSIgIiRkZXYzIikKK2NtZDI9KHB2bW92ZSAtaTEgJGJhY2tncm91bmRhcmcgJG1vZGUgIiRkZXYyIiAiJGRldjMiKQorY21kMz0ocHZtb3ZlIC1pMSAkYmFja2dyb3VuZGFyZyAkbW9kZSAtbiAkdmcxLyRsdjEgIiRkZXY0IiAiJGRldjYiKQorCitpZiB0ZXN0IC1lIEhBVkVfRE1fREVMQVk7IHRoZW4KKworaWYgdGVzdCAteiAiJGJhY2tncm91bmRhcmciIDsgdGhlbgorCSIke2NtZDFbQF19IiAmCisJYXV4IHdhaXRfcHZtb3ZlX2x2X3JlYWR5ICIkdmctcHZtb3ZlMCIKKwkiJHtjbWQyW0BdfSIgJgorCWF1eCB3YWl0X3B2bW92ZV9sdl9yZWFkeSAiJHZnLXB2bW92ZTEiCisJIiR7Y21kM1tAXX0iICYKKwlhdXggd2FpdF9wdm1vdmVfbHZfcmVhZHkgIiR2ZzEtcHZtb3ZlMCIKKyAgICAgICAgbHZzIC1hICR2ZyAkdmcxCitlbHNlCisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiICIke2NtZDFbQF19IgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiAiJHtjbWQyW0BdfSIKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgIiR7Y21kM1tAXX0iCitmaQorCitmaQorCisjIHRlc3QgcmVtb3ZhbCBvZiBhbGwgcHZtb3ZlIExWcworcHZtb3ZlIC0tYWJvcnQKKworIyBjaGVjayBpZiBwcm9wZXIgcHZtb3ZlIHdhcyBjYW5jZWxlZAorZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgdGVlIG91dAorbm90IGdyZXAgIl5cW3B2bW92ZSIgb3V0CitnZXQgbHZfZmllbGQgJHZnMSBuYW1lIC1hIHwgdGVlIG91dAorbm90IGdyZXAgIl5cW3B2bW92ZSIgb3V0CisKK2x2cmVtb3ZlIC1mZiAkdmcgJHZnMQorCit3YWl0CithdXgga2lsbF90YWdnZWRfcHJvY2Vzc2VzCitkb25lCitkb25lCisKKyMgUmVzdG9yZSBkZWxheWVkIGRldmljZSBiYWNrCithdXggZW5hYmxlX2RldiAiJGRldjMiICIkZGV2NiIKKwordmdyZW1vdmUgLWZmICR2ZyAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2bW92ZS1hYm9ydC5zaCBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLWFib3J0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1hYm9ydC5zaApAQCAtMCwwICsxLDc0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBDaGVjayBwdm1vdmUgLS1hYm9ydCBiZWhhdmlvdXIgd2hlbiBzcGVjaWZpYyBkZXZpY2UgaXMgcmVxdWVzdGVkCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyAzIDYwCisKK3ZnY3JlYXRlIC1zIDEyOGsgJHZnICIkZGV2MSIgIiRkZXYyIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIKK3ZnZXh0ZW5kICR2ZyAiJGRldjMiCisKKyMgU2xvd2Rvd24gcmVhZC93cml0ZXMKK2F1eCBkZWxheV9kZXYgIiRkZXYzIiAwIDgwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MyIpOgorCitmb3IgbW9kZSBpbiAiLS1hdG9taWMiICIiIDsKK2RvCitmb3IgYmFja2dyb3VuZGFyZyBpbiAiLWIiICIiIDsKK2RvCisKKyMgQ3JlYXRlIG11bHRpc2VnbWVudCBMVgorbHZjcmVhdGUgLWFuIC1abiAtbDMwIC1uICRsdjEgJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwzMCAtbiAkbHYyICR2ZyAiJGRldjIiCisKK2NtZDE9KHB2bW92ZSAtaTEgJGJhY2tncm91bmRhcmcgJG1vZGUgIiRkZXYxIiAiJGRldjMiKQorY21kMj0ocHZtb3ZlIC1pMSAkYmFja2dyb3VuZGFyZyAkbW9kZSAiJGRldjIiICIkZGV2MyIpCisKK2lmIHRlc3QgLWUgSEFWRV9ETV9ERUxBWTsgdGhlbgorCitpZiB0ZXN0IC16ICIkYmFja2dyb3VuZGFyZyIgOyB0aGVuCisJIiR7Y21kMVtAXX0iICYKKwlhdXggd2FpdF9wdm1vdmVfbHZfcmVhZHkgIiR2Zy1wdm1vdmUwIgorCSIke2NtZDJbQF19IiAmCisJYXV4IHdhaXRfcHZtb3ZlX2x2X3JlYWR5ICIkdmctcHZtb3ZlMSIKK2Vsc2UKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgIiR7Y21kMVtAXX0iCisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiICIke2NtZDJbQF19IgorZmkKKworIyByZW1vdmUgc3BlY2lmaWMgZGV2aWNlCitwdm1vdmUgLS1hYm9ydCAiJGRldjEiCisKKyMgY2hlY2sgaWYgcHJvcGVyIHB2bW92ZSB3YXMgY2FuY2VsZWQKK2dldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IHRlZSBvdXQKK25vdCBlZ3JlcCAiXlxbP3B2bW92ZTAiIG91dAorZWdyZXAgIl5cWz9wdm1vdmUxIiBvdXQKKworZmkKKworIyByZW1vdmUgYW55IHJlbWFpbmluZyBwdm1vdmVzIGluIHByb2dyZXNzCitwdm1vdmUgLS1hYm9ydAorCitsdnJlbW92ZSAtZmYgJHZnCisKK3dhaXQKK2F1eCBraWxsX3RhZ2dlZF9wcm9jZXNzZXMKK2RvbmUKK2RvbmUKKworIyBSZXN0b3JlIGRlbGF5ZWQgZGV2aWNlIGJhY2sKK2F1eCBlbmFibGVfZGV2ICIkZGV2MyIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdm1vdmUtYWxsLXNlZ3R5cGVzLnNoIGIvdGVzdC9zaGVsbC9wdm1vdmUtYWxsLXNlZ3R5cGVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZjNiNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1hbGwtc2VndHlwZXMuc2gKQEAgLTAsMCArMSwxMDEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSJlbnN1cmUgcHZtb3ZlIHdvcmtzIHdpdGggYWxsIGNvbW1vbiBzZWdtZW50IHR5cGVzIgorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBtZDVzdW0gfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgNSAyMAordmdjcmVhdGUgLXMgMjU2ayAkdmcgJChjYXQgREVWSUNFUykKKworIyBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgZG9lczoKKyMgMSkgQ3JlYXRlIHR3byBMVnMgLSBvbmUgbGluZWFyIGFuZCBvbmUgb3RoZXIgc2VnbWVudCB0eXBlCisjICAgIFRoZSB0d28gTFZzIHdpbGwgc2hhcmUgYSBQVi4KKyMgMikgTW92ZSBib3RoIExWcyB0b2dldGhlcgorIyAzKSBNb3ZlIG9ubHkgdGhlIHNlY29uZCBMViBieSBuYW1lCisKKyMgVGVzdGluZyBwdm1vdmUgb2YgbGluZWFyIExWCitsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWFleSAtbCAyIC1uICRsdjEgJHZnICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjEiCithdXggbWtkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgIiRkZXYxIiAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlIC1uICRsdjEgIiRkZXY1IiAiJGRldjQiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCisjIFRlc3RpbmcgcHZtb3ZlIG9mIHN0cmlwZSBMVgorbHZjcmVhdGUgLWFleSAtbCAyIC1uICR7bHYxfV9mb28gJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1hZXkgLWwgNCAtaSAyIC1uICRsdjEgJHZnICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjEiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXYyIgorYXV4IG1rZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlICIkZGV2MSIgIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2MiIgIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlIC1uICRsdjEgIiRkZXY1IiAiJGRldjQiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2MiIgIiRkZXY0IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKK2lmIHRlc3QgLWUgTE9DQUxfQ0xWTUQgOyB0aGVuCisjRklYTUUgdGhlc2UgdGVzdHMgY3VycmVudGx5IGZhaWwgZW5kIHJlcXVpcmUgY21pcnJvcmQKK2VjaG8gIiQoc2hvdWxkIGZhbHNlKUZJWE1FISEhIHB2bW92ZSBpbiBjbHVzdGVyZWQgVkcgbm90IGZ1bGx5IHN1cHBvcnRlZCEiCitlbHNlCisKKyMgVGVzdGluZyBwdm1vdmUgb2YgbWlycm9yIExWCitsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWFleSAtbCAyIC0tdHlwZSBtaXJyb3IgLW0gMSAtbiAkbHYxICR2ZyAiJGRldjEiICIkZGV2MiIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIKK2F1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAiJGRldjEiICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjIiICIkZGV2NSIKK2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAtbiAkbHYxICIkZGV2NSIgIiRkZXY0IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjIiICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCisjIER1bW15IExWIGFuZCBzbmFwIHNoYXJlIGRldjEsIHdoaWxlIG9yaWdpbiBpcyBvbiBkZXYyCisjIFRlc3RpbmcgcHZtb3ZlIG9mIHNuYXBzaG90IExWCitsdmNyZWF0ZSAtYWV5IC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWFleSAtbCAyIC1uICRsdjEgJHZnICIkZGV2MiIKK2x2Y3JlYXRlIC1zICR2Zy8kbHYxIC1sIDIgLW4gc25hcCAiJGRldjEiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnIHNuYXAgIiRkZXYxIgorYXV4IG1rZGV2X21kNXN1bSAkdmcgc25hcAorcHZtb3ZlICIkZGV2MSIgIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyBzbmFwICIkZGV2NSIKK2NoZWNrIGRldl9tZDVzdW0gJHZnIHNuYXAKK3B2bW92ZSAtbiBzbmFwICIkZGV2NSIgIiRkZXY0IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgc25hcCAiJGRldjQiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKK2NoZWNrIGRldl9tZDVzdW0gJHZnIHNuYXAKK2x2cmVtb3ZlIC1mZiAkdmcKK2ZpCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZtb3ZlLWJhY2tncm91bmQuc2ggYi90ZXN0L3NoZWxsL3B2bW92ZS1iYWNrZ3JvdW5kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTcwZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1iYWNrZ3JvdW5kLnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIENoZWNrIHB2bW92ZSBiZWhhdmlvciB3aGVuIGl0J3MgcHJvZ3Jlc3MgYW5kIG1hY2hpbmUgaXMgcmVib290ZWQKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMworCitmb3IgbW9kZSBpbiAiLS1hdG9taWMiICIiCitkbworbHZjcmVhdGUgLWFleSAtbDEgLW4gJGx2MSAkdmcgIiRkZXYxIgorCitsdnMgLW8gK2RldmljZXMgfCB0ZWUgb3V0CitncmVwICIkZGV2MSIgb3V0CisKK0xWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBwdm1vdmUgJG1vZGUgLWkgMSAtYiAiJGRldjEiICIkZGV2MiIKK3NsZWVwIDUgIyBhcmJpdHJhcnkuLi4KK2x2cyAtbyArZGV2aWNlcyB8IHRlZSBvdXQKK25vdCBncmVwICJwdm1vdmUiIG91dAorbHZzIC1vICtkZXZpY2VzIHwgdGVlIG91dAorZ3JlcCAiJGRldjIiIG91dAorCitsdnJlbW92ZSAtZmYgJHZnCitkb25lCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2bW92ZS1iYXNpYy5zaCBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjhiMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1iYXNpYy5zaApAQCAtMCwwICsxLDM2MyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IE5FQyBDb3Jwb3JhdGlvbgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSJlbnN1cmUgdGhhdCBwdm1vdmUgd29ya3Mgd2l0aCBiYXNpYyBvcHRpb25zIgorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisjIGRpc2FibGUgbHZtZXRhZCBsb2dnaW5nIGFzIGl0IGJvZ3MgZG93biB0ZXN0IHN5c3RlbXMKK2V4cG9ydCBMVk1fVEVTVF9MVk1FVEFEX0RFQlVHX09QVFM9JHtMVk1fVEVTVF9MVk1FVEFEX0RFQlVHX09QVFMtfQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBtZDVzdW0gfHwgc2tpcAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVdGlsaXRpZXMKKworY3JlYXRlX3ZnXygpIHsKKwl2Z2NyZWF0ZSAtYyBuIC1zIDEyOGsgJHZnICQoY2F0IERFVklDRVMpCit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbW1vbiBlbnZpcm9ubWVudCBzZXR1cC9jbGVhbnVwIGZvciBlYWNoIHN1YiB0ZXN0Y2FzZXMKK3ByZXBhcmVfbHZzXygpIHsKKwlsdmNyZWF0ZSAtbDIgLW4gJGx2MSAkdmcgIiRkZXYxIgorCWNoZWNrIGx2X29uICR2ZyAkbHYxICIkZGV2MSIKKwlsdmNyZWF0ZSAtbDkgLWkzIC1uICRsdjIgJHZnICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisJY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKwlsdmV4dGVuZCAtbCsyICR2Zy8kbHYxICIkZGV2MiIKKwljaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIKKwlsdmV4dGVuZCAtbCsyICR2Zy8kbHYxICIkZGV2MyIKKwlsdmV4dGVuZCAtbCsyICR2Zy8kbHYxICIkZGV2MSIKKwljaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCWx2Y3JlYXRlIC1sMSAtbiAkbHYzICR2ZyAiJGRldjIiCisJY2hlY2sgbHZfb24gJHZnICRsdjMgIiRkZXYyIgorCWF1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKKwlhdXggbWtkZXZfbWQ1c3VtICR2ZyAkbHYyCisJYXV4IG1rZGV2X21kNXN1bSAkdmcgJGx2MworCWdldCBsdl9kZXZpY2VzICIkdmcvJGx2MSIgPiAiJHtsdjF9X2RldnMiCisJZ2V0IGx2X2RldmljZXMgIiR2Zy8kbHYyIiA+ICIke2x2Mn1fZGV2cyIKKwlnZXQgbHZfZGV2aWNlcyAiJHZnLyRsdjMiID4gIiR7bHYzfV9kZXZzIgorCWx2cyAtYSAtbyBuYW1lLHNpemUsc2VnX3BlX3JhbmdlcyAkdmcKKwl2Z2NmZ2JhY2t1cCAtZiBiYWstJCQgJHZnCit9CisKKyMgUmVzdG9yZSBtZXRhZGF0YSBjb250ZW50LCBzaW5jZSBkYXRhIGFyZSBwdm1vdmUtZWQKKyMgb3JpZ2luYWwgY29udGVudCBzaG91bGQgYmUgcHJlc2VydmVkCityZXN0b3JlX2x2c18oKSB7CisJdmdjZmdyZXN0b3JlIC1mIGJhay0kJCAkdmcKKwl2Z2NoYW5nZSAtYXkgJHZnCit9CisKK2x2c19ub3RfY2hhbmdlZF8oKSB7CisJZm9yIGkgaW4gIiR7QH0iOyBkbworCQlnZXQgbHZfZGV2aWNlcyAiJHZnLyRpIiB8IHRlZSBvdXQKKwkJZGlmZiAiJHtpfV9kZXZzIiBvdXQgfHwgXAorCQkJKGNhdCAiJHtpfV9kZXZzIjsgZGllICJEZXZpY2VzIGZvciBMViAkdmcvJGkgZGlmZmVycyEiKQorCWRvbmUKK30KKworY2hlY2tfYW5kX2NsZWFudXBfbHZzXygpIHsKKwljaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCisJY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MgorCWNoZWNrIGRldl9tZDVzdW0gJHZnICRsdjMKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgPm91dAorCW5vdCBncmVwICJeXFtwdm1vdmUiIG91dAorCXZnY2hhbmdlIC1hbiAkdmcKKwlsdnJlbW92ZSAtZmYgJHZnCisJKGRtX3RhYmxlIHwgbm90IGdyZXAgJHZnKSB8fCBcCisJICAgICAgZGllICJFUlJPUjogbHZyZW1vdmUgZGlkIGxlYXZlIHNvbWUgbWFwcGluZ3MgaW4gRE0gYmVoaW5kISIKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW5pdGlhbGl6ZSBQVnMgYW5kIFZHcworCithdXggcHJlcGFyZV9wdnMgNSA1CitjcmVhdGVfdmdfCisKK2ZvciBtb2RlIGluICItLWF0b21pYyIgIiIKK2RvCisKKyNDT01NICJjaGVjayBlbnZpcm9ubWVudCBzZXR1cC9jbGVhbnVwIgorcHJlcGFyZV9sdnNfCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHB2bW92ZSB0ZXN0cworCisjIC0tLQorIyBmaWx0ZXIgYnkgTFYKKworI0NPTU0gIm9ubHkgc3BlY2lmaWVkIExWIGlzIG1vdmVkOiBmcm9tIHB2MiB0byBwdjUgb25seSBmb3IgbHYxIgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkxIC1uICR2Zy8kbHYxICIkZGV2MiIgIiRkZXY1IgorY2hlY2sgbHZfb24gJHZnICRsdjEgIiRkZXYxIiAiJGRldjUiICIkZGV2MyIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MiAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tCisjIHNlZ21lbnRzIGluIGEgTFYKKworI0NPTU0gInRoZSAxc3Qgc2VnIG9mIDMtc2VncyBMViBpcyBtb3ZlZDogZnJvbSBwdjEgb2YgbHYxIHRvIHB2NCIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAtbiAkdmcvJGx2MSAiJGRldjEiICIkZGV2NCIKK2NoZWNrIGx2X29uICR2ZyAkbHYxICIkZGV2NCIgIiRkZXYyIiAiJGRldjMiCitsdnNfbm90X2NoYW5nZWRfICRsdjIgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAidGhlIDJuZCBzZWcgb2YgMy1zZWdzIExWIGlzIG1vdmVkOiBmcm9tIHB2MiBvZiBsdjEgdG8gcHY0IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwIC1uICR2Zy8kbHYxICIkZGV2MiIgIiRkZXY0IgorY2hlY2sgbHZfb24gJHZnICRsdjEgIiRkZXYxIiAiJGRldjQiICIkZGV2MyIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MiAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICJ0aGUgM3JkIHNlZyBvZiAzLXNlZ3MgTFYgaXMgbW92ZWQ6IGZyb20gcHYzIG9mIGx2MSB0byBwdjQiCityZXN0b3JlX2x2c18KK3B2bW92ZSAkbW9kZSAtaTAgLW4gJHZnLyRsdjEgIiRkZXYzIiAiJGRldjQiCitjaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXY0IgorbHZzX25vdF9jaGFuZ2VkXyAkbHYyICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworIyAtLS0KKyMgbXVsdGlwbGUgTFZzIG1hdGNoaW5nCisKKyNDT01NICIxIG91dCBvZiAzIExWcyBpcyBtb3ZlZDogZnJvbSBwdjQgdG8gcHY1IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwICIkZGV2NCIgIiRkZXY1IgorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXYyIiAiJGRldjMiICIkZGV2NSIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICIyIG91dCBvZiAzIExWcyBhcmUgbW92ZWQ6IGZyb20gcHYzIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjMiICIkZGV2NSIKK2NoZWNrIGx2X29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXYyIiAiJGRldjUiCitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjIiICIkZGV2NSIgIiRkZXY0IgorbHZzX25vdF9jaGFuZ2VkXyAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICIzIG91dCBvZiAzIExWcyBhcmUgbW92ZWQ6IGZyb20gcHYyIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjIiICIkZGV2NSIKK2NoZWNrIGx2X29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXY1IiAiJGRldjMiCitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjUiICIkZGV2MyIgIiRkZXY0IgorY2hlY2sgbHZfb24gJHZnICRsdjMgIiRkZXY1IgorY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjIC0tLQorIyBhcmVhcyBvZiBzdHJpcGluZworCisjQ09NTSAibW92ZSB0aGUgMXN0IHN0cmlwZTogZnJvbSBwdjIgb2YgbHYyIHRvIHB2MSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAtbiAkdmcvJGx2MiAiJGRldjIiICIkZGV2MSIKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2MSIgIiRkZXYzIiAiJGRldjQiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAibW92ZSB0aGUgMm5kIHN0cmlwZTogZnJvbSBwdjMgb2YgbHYyIHRvIHB2MSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAtbiAkdmcvJGx2MiAiJGRldjMiICIkZGV2MSIKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2MiIgIiRkZXYxIiAiJGRldjQiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAibW92ZSB0aGUgM3JkIHN0cmlwZTogZnJvbSBwdjQgb2YgbHYyIHRvIHB2MSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAtbiAkdmcvJGx2MiAiJGRldjQiICIkZGV2MSIKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2MiIgIiRkZXYzIiAiJGRldjEiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjIC0tLQorIyBwYXJ0aWFsIHNlZ21lbnQgbWF0Y2ggKHNvdXJjZSBzZWdtZW50IHNwbGl0dGVkKQorCisjQ09NTSAibWF0Y2ggdG8gdGhlIHN0YXJ0IG9mIHNlZ21lbnQ6ZnJvbSBwdjI6MC0wIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjIiOjAtMCAiJGRldjUiCitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjUiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworI2V4aXQgMAorI0NPTU0gIm1hdGNoIHRvIHRoZSBtaWRkbGUgb2Ygc2VnbWVudDogZnJvbSBwdjI6MS0xIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjIiOjEtMSAiJGRldjUiCitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAibWF0Y2ggdG8gdGhlIGVuZCBvZiBzZWdtZW50OiBmcm9tIHB2MjoyLTIgdG8gcHY1IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwICIkZGV2MiI6Mi0yICIkZGV2NSIKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2MiIgIiRkZXY1IiAiJGRldjMiICIkZGV2NCIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tCisjIGRlc3RpbmF0aW9uIHNlZ21lbnQgc3BsaXR0ZWQKKworI0NPTU0gIm5vIGRlc3RpbmF0aW9uIHNwbGl0OiBmcm9tIHB2MjowLTIgdG8gcHY1IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwICIkZGV2MiI6MC0yICIkZGV2NSIKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2NSIgIiRkZXYzIiAiJGRldjQiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAiZGVzdGluYXRpb24gc3BsaXQgaW50byAyOiBmcm9tIHB2MjowLTIgdG8gcHY1OjUtNSBhbmQgcHY0OjUtNiIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAtLWFsbG9jIGFueXdoZXJlICIkZGV2MiI6MC0yICIkZGV2NSI6NS01ICIkZGV2NCI6NS02CitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjUiICIkZGV2NCIgIiRkZXYzIgorbHZzX25vdF9jaGFuZ2VkXyAkbHYxICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworI0NPTU0gImRlc3RpbmF0aW9uIHNwbGl0IGludG8gMzogZnJvbSBwdjI6MC0yIHRvIHtwdjMsNCw1fTo1LTUiCityZXN0b3JlX2x2c18KK3B2bW92ZSAkbW9kZSAtaTAgLS1hbGxvYyBhbnl3aGVyZSAiJGRldjIiOjAtMiAiJGRldjMiOjUtNSAiJGRldjQiOjUtNSAiJGRldjUiOjUtNQorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tCisjIGFsbG9jIHBvbGljeSAoYW55d2hlcmUsIGNvbnRpZ3VvdXMpIHdpdGggYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIGNhc2VzCisKKyNDT01NICJhbGxvYyBub3JtYWwgb24gc2FtZSBQViBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbjogZnJvbSBwdjM6MC0yIHRvIHB2Mzo1LTciCityZXN0b3JlX2x2c18KK25vdCBwdm1vdmUgJG1vZGUgLWkwICIkZGV2MyI6MC0yICIkZGV2MyI6NS03CisjICIoY2xlYW51cCBwcmV2aW91cyB0ZXN0KSIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYyICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworI0NPTU0gImFsbG9jIGFueXdoZXJlIG9uIHNhbWUgUFYgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb246IGZyb20gcHYzOjAtMiB0byBwdjM6NS03IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwIC0tYWxsb2MgYW55d2hlcmUgIiRkZXYzIjowLTIgIiRkZXYzIjo1LTcKK2NoZWNrIGx2X29uICR2ZyAkbHYyICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAiYWxsb2MgYW55d2hlcmUgYnV0IGJldHRlciBhcmVhIGF2YWlsYWJsZTogZnJvbSBwdjM6MC0yIHRvIHB2Mzo1LTcgb3IgcHY1OjUtNixwdjQ6NS01IgorcmVzdG9yZV9sdnNfCisjbHZzIC1hIC1vIG5hbWUsc2l6ZSxzZWdfcGVfcmFuZ2VzICR2ZworI0xWMiAgICAxLjEybSBAVEVTVERJUkAvZGV2L21hcHBlci9AUFJFRklYQHB2MjowLTIgQFRFU1RESVJAL2Rldi9tYXBwZXIvQFBSRUZJWEBwdjM6MC0yIEBURVNURElSQC9kZXYvbWFwcGVyL0BQUkVGSVhAcHY0OjAtMgorCitwdm1vdmUgJG1vZGUgLWkwIC0tYWxsb2MgYW55d2hlcmUgIiRkZXYzIjowLTIgIiRkZXYzIjo1LTcgIiRkZXY1Ijo1LTYgIiRkZXY0Ijo1LTUKKworI2x2cyAtYSAtbyBuYW1lLHNpemUsc2VnX3BlX3JhbmdlcyAkdmcKKyMgSG1tIGlzIHRoaXMgY29ycmVjdCA/IC0gd2h5IHB2MiBpcyBzcGxpdAorI0xWMiAgICAxLjEybSBAVEVTVERJUkAvZGV2L21hcHBlci9AUFJFRklYQHB2MjowLTEgQFRFU1RESVJAL2Rldi9tYXBwZXIvQFBSRUZJWEBwdjU6NS02IEBURVNURElSQC9kZXYvbWFwcGVyL0BQUkVGSVhAcHY0OjAtMQorI0xWMiAgICAxLjEybSBAVEVTVERJUkAvZGV2L21hcHBlci9AUFJFRklYQHB2MjoyLTIgQFRFU1RESVJAL2Rldi9tYXBwZXIvQFBSRUZJWEBwdjM6NS01IEBURVNURElSQC9kZXYvbWFwcGVyL0BQUkVGSVhAcHY0OjItMgorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgorbHZzX25vdF9jaGFuZ2VkXyAkbHYxICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworI0NPTU0gImFsbG9jIGNvbnRpZ3VvdXMgYnV0IGFyZWEgbm90IGF2YWlsYWJsZTogZnJvbSBwdjI6MC0yIHRvIHB2NTo1LTUgYW5kIHB2NDo1LTYiCityZXN0b3JlX2x2c18KK25vdCBwdm1vdmUgJG1vZGUgLWkwIC0tYWxsb2MgY29udGlndW91cyAiJGRldjIiOjAtMiAiJGRldjUiOjUtNSAiJGRldjQiOjUtNgorIyAiKGNsZWFudXAgcHJldmlvdXMgdGVzdCkiCitsdnNfbm90X2NoYW5nZWRfICRsdjEgJGx2MiAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICJhbGxvYyBjb250aWd1b3VzIGFuZCBjb250aWd1b3VzIGFyZWEgYXZhaWxhYmxlOiBmcm9tIHB2MjowLTIgdG8gcHY1OjAtMCxwdjU6My01IGFuZCBwdjQ6NS02IgorcmVzdG9yZV9sdnNfCitwdm1vdmUgJG1vZGUgLWkwIC0tYWxsb2MgY29udGlndW91cyAiJGRldjIiOjAtMiAiJGRldjUiOjAtMCAiJGRldjUiOjMtNSAiJGRldjQiOjUtNgorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXY1IiAiJGRldjMiICIkZGV2NCIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tCisjIG11bHRpcGxlIHNlZ21lbnRzIGluIGEgTFYKKworI0NPTU0gIm11bHRpcGxlIHNvdXJjZSBMVnM6IGZyb20gcHYzIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjMiICIkZGV2NSIKK2NoZWNrIGx2X29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXYyIiAiJGRldjUiCitjaGVjayBsdl9vbiAkdmcgJGx2MiAiJGRldjIiICIkZGV2NSIgIiRkZXY0IgorbHZzX25vdF9jaGFuZ2VkXyAkbHYzCitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyMgLS0tCisjIG1vdmUgaW5hY3RpdmUgTFYKKworI0NPTU0gIm1vdmUgaW5hY3RpdmUgTFY6IGZyb20gcHYyIHRvIHB2NSIKK3Jlc3RvcmVfbHZzXworbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCitsdmNoYW5nZSAtYW4gJHZnLyRsdjMKK3B2bW92ZSAkbW9kZSAtaTAgIiRkZXYyIiAiJGRldjUiCitjaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2NSIgIiRkZXYzIgorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXY1IiAiJGRldjMiICIkZGV2NCIKK2NoZWNrIGx2X29uICR2ZyAkbHYzICIkZGV2NSIKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworIyAtLS0KKyMgb3RoZXIgZmFpbHVyZSBjYXNlcworCisjQ09NTSAibm8gUEVzIHRvIG1vdmU6IGZyb20gcHYzIHRvIHB2MSIKK3Jlc3RvcmVfbHZzXworcHZtb3ZlICRtb2RlIC1pMCAiJGRldjMiICIkZGV2MSIKK25vdCBwdm1vdmUgJG1vZGUgLWkwICIkZGV2MyIgIiRkZXYxIgorIyAiKGNsZWFudXAgcHJldmlvdXMgdGVzdCkiCitjaGVjayBsdl9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYxIgorY2hlY2sgbHZfb24gJHZnICRsdjIgIiRkZXYyIiAiJGRldjEiICIkZGV2NCIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAibm8gc3BhY2UgYXZhaWxhYmxlOiBmcm9tIHB2MjowLTAgdG8gcHYxOjAtMCIKK3Jlc3RvcmVfbHZzXworbm90IHB2bW92ZSAkbW9kZSAtaTAgIiRkZXYyIjowLTAgIiRkZXYxIjowLTAKKyMgIihjbGVhbnVwIHByZXZpb3VzIHRlc3QpIgorbHZzX25vdF9jaGFuZ2VkXyAkbHYxICRsdjIgJGx2MworY2hlY2tfYW5kX2NsZWFudXBfbHZzXworCisjQ09NTSAnc2FtZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOiBmcm9tIHB2MSB0byBwdjEnCityZXN0b3JlX2x2c18KK25vdCBwdm1vdmUgJG1vZGUgLWkwICIkZGV2MSIgIiRkZXYxIgorIyIoY2xlYW51cCBwcmV2aW91cyB0ZXN0KSIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYyICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworI0NPTU0gInN1bSBvZiBzcGVjaWZpZWQgZGVzdGluYXRpb24gUEVzIGlzIGxhcmdlIGVub3VnaCwgYnV0IGl0IGluY2x1ZGVzIHNvdXJjZSBQRXMgYW5kIHRoZSBmcmVlIFBFcyBhcmUgbm90IGVub3VnaCIKK3Jlc3RvcmVfbHZzXworbm90IHB2bW92ZSAkbW9kZSAtLWFsbG9jIGFueXdoZXJlICIkZGV2MSI6MC0yICIkZGV2MSI6MC0yICIkZGV2NSI6MC0wIDI+IGVycgorIyIoY2xlYW51cCBwcmV2aW91cyB0ZXN0KSIKK2dyZXAgIkluc3VmZmljaWVudCBmcmVlIHNwYWNlIiBlcnIKK2x2c19ub3RfY2hhbmdlZF8gJGx2MSAkbHYyICRsdjMKK2NoZWNrX2FuZF9jbGVhbnVwX2x2c18KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI0NPTU0gInB2bW92ZSBhYm9ydCIKK3Jlc3RvcmVfbHZzXworTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHB2bW92ZSAkbW9kZSAtaTEwMCAtYiAiJGRldjEiICIkZGV2MyIKK3B2bW92ZSAtLWFib3J0CitjaGVja19hbmRfY2xlYW51cF9sdnNfCisKKyNDT01NICJwdm1vdmUgb3V0IG9mIC0tbWV0YWRhdGFjb3BpZXMgMCBQViAoYnoyNTIxNTApIgordmdyZW1vdmUgLWZmICR2ZworcHZjcmVhdGUgJChjYXQgREVWSUNFUykKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiICIkZGV2MiIKK2NyZWF0ZV92Z18KK2x2Y3JlYXRlIC1sNCAtbiAkbHYxICR2ZyAiJGRldjEiCitwdm1vdmUgJG1vZGUgIiRkZXYxIgorCisjQ09NTSAicHZtb3ZlIGZhaWxzIGFjdGl2YXRpbmcgbWlycm9yLCBwcm9wZXJseSByZXN0b3JlcyBzdGF0ZSBiZWZvcmUgcHZtb3ZlIgorZG1zZXR1cCBjcmVhdGUgJHZnLXB2bW92ZTAgLS1ub3RhYmxlCitub3QgcHZtb3ZlICRtb2RlIC1pIDEgIiRkZXYyIgorZG1zZXR1cCBpbmZvIC0tbm9oZWFkaW5ncyAtYyAtbyBzdXNwZW5kZWQgJHZnLSRsdjEKK3Rlc3QgJChkbXNldHVwIGluZm8gLS1ub2hlYWRpbmdzIC1jIC1vIHN1c3BlbmRlZCAkdmctJGx2MSkgPSAiQWN0aXZlIgoraWYgZG1zZXR1cCBpbmZvICR2Zy1wdm1vdmUwX21pbWFnZV8wID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGRtc2V0dXAgcmVtb3ZlICR2Zy1wdm1vdmUwICR2Zy1wdm1vdmUwX21pbWFnZV8wICR2Zy1wdm1vdmUwX21pbWFnZV8xCitlbHNlCisgICAgICAgIGRtc2V0dXAgcmVtb3ZlICR2Zy1wdm1vdmUwCitmaQorCitsdnJlbW92ZSAtZmYgJHZnCitkb25lCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2bW92ZS1jYWNoZS1zZWd0eXBlcy5zaCBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLWNhY2hlLXNlZ3R5cGVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjI0YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1jYWNoZS1zZWd0eXBlcy5zaApAQCAtMCwwICsxLDE4NyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK3Rlc3RfZGVzY3JpcHRpb249ImVuc3VyZSBwdm1vdmUgd29ya3Mgd2l0aCB0aGUgY2FjaGUgc2VnbWVudCB0eXBlcyIKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIHB2bW92ZSBmYWlscyB3aGVuIGEgUkFJRCBMViBpcyB0aGUgb3JpZ2luIG9mIGEgY2FjaGUgTFYKKyMgcHZtb3ZpbmcgY2FjaGUgdHlwZXMgaXMgY3VycmVudGx5IGRpc2FibGVkIGluIHRvb2xzL3B2bW92ZS5jCisjIFNvLCBmb3Igbm93IHdlIHNldCBldmVyeXRoaW5nIHVwIGFuZCBtYWtlIHN1cmUgcHZtb3ZlIC9pc24ndC8gYWxsb3dlZC4KKyMgVGhpcyBhbGxvd3MgdXMgdG8gZW5zdXJlIHRoYXQgaXQgaXMgZGlzYWxsb3dlZCBldmVuIHdoZW4gdGhlcmUgYXJlCisjIHN0YWNraW5nIGNvbXBsaWNhdGlvbnMgdG8gY29uc2lkZXIuCisKK3doaWNoIG1kNXN1bSB8fCBza2lwCisKK2F1eCBoYXZlX2NhY2hlIDEgMyAwIHx8IHNraXAKKyMgZm9yIHN0YWNraW5nCithdXggaGF2ZV90aGluIDEgOCAwIHx8IHNraXAKK2F1eCBoYXZlX3JhaWQgMSA0IDIgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyA1IDgwCisKK2ZvciBtb2RlIGluICItLWF0b21pYyIgIiIKK2RvCisjIEVhY2ggb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBkb2VzOgorIyAxKSBDcmVhdGUgdHdvIExWcyAtIG9uZSBsaW5lYXIgYW5kIG9uZSBvdGhlciBzZWdtZW50IHR5cGUKKyMgICAgVGhlIHR3byBMVnMgd2lsbCBzaGFyZSBhIFBWLgorIyAyKSBNb3ZlIGJvdGggTFZzIHRvZ2V0aGVyCisjIDMpIE1vdmUgb25seSB0aGUgc2Vjb25kIExWIGJ5IG5hbWUKKworIyBUZXN0aW5nIHB2bW92ZSBvZiBjYWNoZS1wb29sIExWIChjYW4ndCBjaGVjayBjb250ZW50cyB0aG91Z2gpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2x2Y3JlYXRlIC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLW4gJHtsdjF9X3Bvb2wgLWwgNCAkdmcgIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjEiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjEiCisKK3B2bW92ZSAkbW9kZSAiJGRldjEiICIkZGV2NSIgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIlNraXBwaW5nIGNhY2hlLXBvb2wgTFYsICR7bHYxfV9wb29sIiBvdXQKK2dyZXAgIlNraXBwaW5nIGNhY2hlLXJlbGF0ZWQgTFYsICR7bHYxfV9wb29sX2NtZXRhIiBvdXQKK2dyZXAgIlNraXBwaW5nIGNhY2hlLXJlbGF0ZWQgTFYsICR7bHYxfV9wb29sX2NkYXRhIiBvdXQKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1Igorbm90IGNoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9wb29sICIkZGV2NSIKKworI3B2bW92ZSAkbW9kZSAtbiAke2x2MX1fcG9vbCAiJGRldjUiICIkZGV2NCIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjQiCisjY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCisKK2x2cmVtb3ZlIC1mZiAkdmcKK2Rtc2V0dXAgaW5mbyAtYyB8IG5vdCBncmVwICR2ZworCisjIFRlc3RpbmcgcHZtb3ZlIG9mIG9yaWdpbiBMVgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2x2Y3JlYXRlIC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLS10eXBlIGNhY2hlLXBvb2wgLW4gJHtsdjF9X3Bvb2wgLWwgNCAkdmcgIiRkZXY1IgorbHZjcmVhdGUgLS10eXBlIGNhY2hlIC1uICRsdjEgLWwgOCAkdmcvJHtsdjF9X3Bvb2wgIiRkZXYxIgorCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9wb29sICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjEiCisKK2F1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAkbW9kZSAiJGRldjEiICIkZGV2MyIgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIlNraXBwaW5nIGNhY2hlIExWLCAke2x2MX0iIG91dAorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjMiCisjY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X3Bvb2wgIiRkZXY1IgorbHZzIC1hIC1vIG5hbWUsYXR0cixkZXZpY2VzICR2Zworbm90IGNoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjMiCisjY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorCisjcHZtb3ZlICRtb2RlIC1uICRsdjEgIiRkZXYzIiAiJGRldjEiCisjY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjMiCisjY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X3Bvb2wgIiRkZXY1IgorI2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjEiCisjY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworZG1zZXR1cCBpbmZvIC1jIHwgbm90IGdyZXAgJHZnCisKKyMgVGVzdGluZyBwdm1vdmUgb2YgYSBSQUlEIG9yaWdpbiBMVgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtbCAyIC1uICR7bHYxfV9mb28gJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1sIDggLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtLXR5cGUgY2FjaGUgLWwgNCAtbiAke2x2MX1fcG9vbCAkdmcvJGx2MSAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjEiICIkZGV2MiIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9wb29sICIkZGV2NSIKKworYXV4IG1rZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlICRtb2RlICIkZGV2MSIgIiRkZXYzIiAyPiYxIHwgdGVlIG91dAorZ3JlcCAiU2tpcHBpbmcgY2FjaGUgTFYsICR7bHYxfSIgb3V0CitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MyIKK25vdCBjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX0gIiRkZXYyIiAiJGRldjMiCisjY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X3Bvb2wgIiRkZXY1IgorI2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEgLS0gVEhJUyBJUyBXSEVSRSBUSElOR1MgRkFJTCBJRiBQVk1PVkUgTk9UIERJU0FMTE9XRUQKKworI3B2bW92ZSAkbW9kZSAtbiAkbHYxICIkZGV2MyIgIiRkZXYxIgorI2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYzIgorI2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjEiICIkZGV2MiIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjUiCisjY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworZG1zZXR1cCBpbmZvIC1jIHwgbm90IGdyZXAgJHZnCisKKyMgVGVzdGluZyBwdm1vdmUgb2YgYSBSQUlEIGNhY2hlcG9vbCAobWV0YWRhdGEgYW5kIGRhdGEpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbHZjcmVhdGUgLWwgMiAtbiAke2x2MX1fZm9vICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLUwgNk0gLW4gbWV0YSAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLUwgNE0gLW4gJHtsdjF9X3Bvb2wgJHZnICIkZGV2MSIgIiRkZXYyIgorbHZjb252ZXJ0IC0teWVzIC0tdHlwZSBjYWNoZS1wb29sICR2Zy8ke2x2MX1fcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvbWV0YQorbHZjcmVhdGUgLS10eXBlIGNhY2hlIC1uICRsdjEgLUwgOE0gJHZnLyR7bHYxfV9wb29sICIkZGV2NSIKKworY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjEiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjEiICIkZGV2MiIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfSAiJGRldjUiCisKK2F1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKKyMgVGhpcyB3aWxsIG1vdmUgJHtsdjF9X2ZvbyBhbmQgdGhlIGNhY2hlLXBvb2wgZGF0YSAmIG1ldGEKKyMgIExWcywgYm90aCBvZiB3aGljaCBjb250YWluIGEgUkFJRDEgX3JpbWFnZSAmIF9ybWV0YSBMViAtIDUgdG90YWwgTFZzCitwdm1vdmUgJG1vZGUgIiRkZXYxIiAiJGRldjMiIDI+JjEgfCB0ZWUgb3V0CitncmVwICJTa2lwcGluZyBjYWNoZS1wb29sIExWLCAke2x2MX1fcG9vbCIgb3V0CitncmVwICJTa2lwcGluZyBjYWNoZS1yZWxhdGVkIExWLCAke2x2MX1fcG9vbF9jbWV0YSIgb3V0CitncmVwICJTa2lwcGluZyBjYWNoZS1yZWxhdGVkIExWLCAke2x2MX1fcG9vbF9jZGF0YSIgb3V0CitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MyIKK25vdCBjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjIiICIkZGV2MyIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX0gIiRkZXY1IgorI2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEKKworI3B2bW92ZSAkbW9kZSAtbiAke2x2MX1fcG9vbCAiJGRldjMiICIkZGV2MSIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MyIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fcG9vbCAiJGRldjEiICIkZGV2MiIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX0gIiRkZXY1IgorI2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKK2Rtc2V0dXAgaW5mbyAtYyB8IG5vdCBncmVwICR2ZworCisjIFRlc3RpbmcgcHZtb3ZlIG9mIFRoaW4tcG9vbCBvbiBjYWNoZSBMViBvbiBSQUlECisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsdmNyZWF0ZSAtbCAyIC1uICR7bHYxfV9mb28gJHZnICIkZGV2MSIKKyMgUkFJRCBmb3IgY2FjaGVwb29sCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtTCA2TSAtbiBtZXRhICR2ZyAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1MIDRNIC1uIGNhY2hlcG9vbCAkdmcgIiRkZXYxIiAiJGRldjIiCitsdmNvbnZlcnQgLS15ZXMgLS10eXBlIGNhY2hlLXBvb2wgJHZnL2NhY2hlcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvbWV0YQorIyBSQUlEIGZvciB0aGluIHBvb2wgZGF0YSBMVgorbHZjcmVhdGUgLS10eXBlIHJhaWQxIC1tIDEgLUwgOCAtbiB0aGlucG9vbCAkdmcgIiRkZXYzIiAiJGRldjQiCisjIENvbnZlcnQgdGhpbiBwb29sIGRhdGEgdG8gYSBjYWNoZWQgTFYKK2x2Y29udmVydCAtLXR5cGUgY2FjaGUgLVp5ICR2Zy90aGlucG9vbCAtLWNhY2hlcG9vbCAkdmcvY2FjaGVwb29sCisjIENyZWF0ZSBzaW1wbGUgdGhpbiBwb29sIG1ldGEKK2x2Y3JlYXRlIC1MIDJNIC1uIG1ldGEgJHZnICIkZGV2MSIKKyMgVXNlIHRoaW4gcG9vbCBkYXRhIExWIHRvIGJ1aWxkIGEgdGhpbiBwb29sCitsdmNvbnZlcnQgLS15ZXMgLS10aGlucG9vbCAkdmcvdGhpbnBvb2wgLS1wb29sbWV0YWRhdGEgJHZnL21ldGEKKyMgQ3JlYXRlIGEgdGhpbiBsdiBmb3IgZnVuCitsdmNyZWF0ZSAtVCAkdmcvdGhpbnBvb2wgLVYgMjAgLW4gdGhpbl9sdgorCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnIGNhY2hlcG9vbCAiJGRldjEiICIkZGV2MiIKK2NoZWNrIGx2X3RyZWVfb24gJHZnIHRoaW5wb29sICIkZGV2MSIgIiRkZXYzIiAiJGRldjQiCisKK2F1eCBta2Rldl9tZDVzdW0gJHZnIHRoaW5fbHYKK2x2cyAtYSAtbyBuYW1lLGF0dHIsZGV2aWNlcyAkdmcKKyMgU2hvdWxkIG1vdmUgJHtsdjF9X2ZvbyBhbmQgdGhpbnBvb2xfdG1ldGEgZnJvbSBkZXYxIHRvIGRldjUKK3B2bW92ZSAkbW9kZSAiJGRldjEiICIkZGV2NSIgMj4mMSB8IHRlZSBvdXQKK2x2cyAtYSAtbyBuYW1lLGF0dHIsZGV2aWNlcyAkdmcKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1Igorbm90IGNoZWNrIGx2X3RyZWVfb24gJHZnIGNhY2hlcG9vbCAiJGRldjUiICIkZGV2MiIKK2NoZWNrIGx2X3RyZWVfb24gJHZnIHRoaW5wb29sICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiICMgTW92ZSBub24tY2FjaGUgdG1ldGEKKyNjaGVjayBkZXZfbWQ1c3VtICR2Zy90aGluX2x2CisKKyNwdm1vdmUgJG1vZGUgLW4gJHZnL2NhY2hlcG9vbCAiJGRldjUiICIkZGV2MSIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKKyNjaGVjayBsdl90cmVlX29uICR2ZyAkdmcvY2FjaGVwb29sICIkZGV2MSIgIiRkZXYyIgorI2NoZWNrIGx2X3RyZWVfb24gJHZnICR2Zy90aGlucG9vbCAiJGRldjMiICIkZGV2NCIKKyNjaGVjayBkZXZfbWQ1c3VtICR2Zy90aGluX2x2CisKK2x2cmVtb3ZlIC1mZiAkdmcKK2Rtc2V0dXAgaW5mbyAtYyB8IG5vdCBncmVwICR2ZworCitkb25lCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2bW92ZS1yYWlkLXNlZ3R5cGVzLnNoIGIvdGVzdC9zaGVsbC9wdm1vdmUtcmFpZC1zZWd0eXBlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY1ZjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdm1vdmUtcmFpZC1zZWd0eXBlcy5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0iZW5zdXJlIHB2bW92ZSB3b3JrcyB3aXRoIHJhaWQgc2VnbWVudCB0eXBlcyIKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBtZDVzdW0gfHwgc2tpcAorCithdXggaGF2ZV9yYWlkIDEgMyA1IHx8IHNraXAKKworYXV4IHByZXBhcmVfcHZzIDUgMjAKK3ZnY3JlYXRlIC1jIG4gLXMgMTI4ayAkdmcgJChjYXQgREVWSUNFUykKKworZm9yIG1vZGUgaW4gIi0tYXRvbWljIiAiIgorZG8KKyMgRWFjaCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGRvZXM6CisjIDEpIENyZWF0ZSB0d28gTFZzIC0gb25lIGxpbmVhciBhbmQgb25lIG90aGVyIHNlZ21lbnQgdHlwZQorIyAgICBUaGUgdHdvIExWcyB3aWxsIHNoYXJlIGEgUFYuCisjIDIpIE1vdmUgYm90aCBMVnMgdG9nZXRoZXIKKyMgMykgTW92ZSBvbmx5IHRoZSBzZWNvbmQgTFYgYnkgbmFtZQorCisjIFRlc3RpbmcgcHZtb3ZlIG9mIFJBSUQxIExWCitsdmNyZWF0ZSAtbCAyIC1uICR7bHYxfV9mb28gJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1sIDIgLS10eXBlIHJhaWQxIC1tIDEgLW4gJGx2MSAkdmcgIiRkZXYxIiAiJGRldjIiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXYxIiAiJGRldjIiCithdXggbWtkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgJG1vZGUgIiRkZXYxIiAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXYyIiAiJGRldjUiCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgJG1vZGUgLW4gJGx2MSAiJGRldjUiICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXYyIiAiJGRldjQiCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKK2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBUZXN0aW5nIHB2bW92ZSBvZiBSQUlEMTAgTFYKK2x2Y3JlYXRlIC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWwgNCAtLXR5cGUgcmFpZDEwIC1pIDIgLW0gMSAtbiAkbHYxICR2ZyBcCisgICAgICAgICAgICAgICAgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjEiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2F1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAkbW9kZSAiJGRldjEiICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgJG1vZGUgLW4gJGx2MSAiJGRldjUiICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCitsdnJlbW92ZSAtZmYgJHZnCisKKyMgVGVzdGluZyBwdm1vdmUgb2YgUkFJRDUgTFYKK2x2Y3JlYXRlIC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWwgNCAtLXR5cGUgcmFpZDUgLWkgMiAtbiAkbHYxICR2ZyBcCisgICAgICAgICAgICAgICAgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorYXV4IG1rZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlICRtb2RlICIkZGV2MSIgIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJHtsdjF9X2ZvbyAiJGRldjUiCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2MiIgIiRkZXYzIiAiJGRldjUiCitjaGVjayBkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgJG1vZGUgLW4gJGx2MSAiJGRldjUiICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorCitsdnJlbW92ZSAtZmYgJHZnCitkb25lCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3RhcnQuc2ggYi90ZXN0L3NoZWxsL3B2bW92ZS1yZXN0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmNhN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1yZXN0YXJ0LnNoCkBAIC0wLDAgKzEsMTA3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIENoZWNrIHB2bW92ZSBiZWhhdmlvciB3aGVuIGl0J3MgcHJvZ3Jlc3MgYW5kIG1hY2hpbmUgaXMgcmVib290ZWQKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDMgNjAKKwordmdjcmVhdGUgLXMgMTI4ayAkdmcgIiRkZXYxIiAiJGRldjIiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYzIgordmdleHRlbmQgJHZnICIkZGV2MyIKKworIyBTbG93ZG93biB3cml0ZXMKKyMgKEZJWE1FOiBnZW5lcmF0ZXMgaW50ZXJlc3RpbmcgcmFjZSB3aGVuIG5vdCB1c2VkKQorYXV4IGRlbGF5X2RldiAiJGRldjMiIDAgODAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYzIik6Cit0ZXN0IC1lIEhBVkVfRE1fREVMQVkgfHwgc2tpcAorCitmb3IgbW9kZSBpbiAiLS1hdG9taWMiICIiCitkbworCisjIENyZWF0ZSBtdWx0aXNlZ21lbnQgTFYKK2x2Y3JlYXRlIC1hbiAtWm4gLWw1IC1uICRsdjEgJHZnICIkZGV2MSIKK2x2ZXh0ZW5kIC1sKzEwICR2Zy8kbHYxICIkZGV2MiIKK2x2ZXh0ZW5kIC1sKzUgJHZnLyRsdjEgIiRkZXYxIgorbHZleHRlbmQgLWwrMTAgJHZnLyRsdjEgIiRkZXYyIgorCitwdm1vdmUgLWkxMCAtbiAkdmcvJGx2MSAiJGRldjEiICIkZGV2MyIgJG1vZGUgJgorUFZNT1ZFPSQhCisjIExldCdzIHdhaXQgYSBiaXQgdGlsbCBwdm1vdmUgc3RhcnRzIGFuZCBraWxsIGl0CithdXggd2FpdF9wdm1vdmVfbHZfcmVhZHkgIiR2Zy1wdm1vdmUwIgora2lsbCAtOSAkUFZNT1ZFCisKK2lmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwlhdXggcHJlcGFyZV9sdm1wb2xsZAorZmkKKword2FpdAorCisjIFNpbXVsYXRlIHJlYm9vdCAtIGZvcmNpYmx5IHJlbW92ZSByZWxhdGVkIGRldmljZXMKKworIyBGaXJzdCB0YWtlIGRvd24gJGx2MSB0aGVuIGl0J3MgcHZtb3ZlMAoraj0wCitmb3IgaSBpbiAkbHYxIHB2bW92ZTAgcHZtb3ZlMF9taW1hZ2VfMCBwdm1vdmUwX21pbWFnZV8xIDsgZG8KKwl3aGlsZSBkbXNldHVwIHN0YXR1cyAiJHZnLSRpIjsgZG8KKwkJZG1zZXR1cCByZW1vdmUgIiR2Zy0kaSIgfHwgeworCQkJaj0kKCgkaiArIDEpKQorCQkJdGVzdCAkaiAtbGUgMTAwIHx8IGRpZSAiQ2Fubm90IHRha2UgZG93biBkZXZpY2VzLiIKKwkJCXNsZWVwIC4xOworCQl9CisJZG9uZQorZG9uZQorZG1zZXR1cCB0YWJsZSB8IGdyZXAgJFBSRUZJWAorCisjIENoZWNrIHdlIHJlYWxseSBoYXZlIHB2bW92ZSB2b2x1bWUKK2NoZWNrIGx2X2F0dHJfYml0IHR5cGUgJHZnL3B2bW92ZTAgInAiCisKK2lmIHRlc3QgLWUgTE9DQUxfQ0xWTUQgOyB0aGVuCisJIyBnaXZldXAgYWxsIGNsdm1kIGxvY2tzIChmYXN0ZXIgdGhlbiByZXN0YXJ0aW5nIGNsdm1kKQorCSMgbm8gZGVhY3RpdmF0aW9uIGhhcHBlbiwgbm9kZXMgYXJlIGFscmVhZHkgcmVtb3ZlZAorCSN2Z2NoYW5nZSAtYW4gJHZnCisJIyBGSVhNRTogSG93ZXZlciBhYm92ZSBzb2x1dGlvbiBoYXMgb25lIGJpZyBwcm9ibGVtCisJIyBhcyBjbHZtZCBzdGFydHMgdG8gYWJvcnQgb24gaW50ZXJuYWwgZXJyb3JzIG9uIHZhcmlvdXMKKwkjIGVycm9ycywgYmFzZWQgb24gdGhlIGZhY3QgcHZtb3ZlIGlzIGtpbGxlZCAtOQorCSMgUmVzdGFydCBjbHZtZAorCWtpbGwgJCg8IExPQ0FMX0NMVk1EKQorCWZvciBpIGluICQoc2VxIDEgMTAwKSA7IGRvCisJCXRlc3QgJGkgLWVxIDEwMCAmJiBkaWUgIlNodXRkb3duIG9mIGNsdm1kIGlzIHRvbyBzbG93LiIKKwkJcGdyZXAgY2x2bWQgfHwgYnJlYWsKKwkJc2xlZXAgLjEKKwlkb25lICMgd2FpdCBmb3IgdGhlIHBpZCByZW1vdmFsCisJYXV4IHByZXBhcmVfY2x2bWQKK2ZpCisKK2F1eCBub3RpZnlfbHZtZXRhZCAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCisjIE9ubHkgUFZzIHNob3VsZCBiZSBsZWZ0IGluIHRhYmxlLi4uCitkbXNldHVwIHRhYmxlCisKKyMgUmVzdGFydCBwdm1vdmUKKyMgdXNlIGV4Y2x1c2l2ZSBhY3RpdmF0aW9uIHRvIGhhdmUgdXNhYmxlIHB2bW92ZSB3aXRob3V0IGNtaXJyb3JkCitMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgJHZnCithdXggd2FpdF9wdm1vdmVfbHZfcmVhZHkgIiR2Zy1wdm1vdmUwIgorZG1zZXR1cCB0YWJsZQorCitwdm1vdmUgLS1hYm9ydAorCitsdnMgLWEgLW8rZGV2aWNlcyAkdmcKKworbHZyZW1vdmUgLWZmICR2ZworYXV4IGtpbGxfdGFnZ2VkX3Byb2Nlc3NlcworZG9uZQorCisjIFJlc3RvcmUgZGVsYXllZCBkZXZpY2UgYmFjaworYXV4IGRlbGF5X2RldiAiJGRldjMiCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3VtZS0xLnNoIGIvdGVzdC9zaGVsbC9wdm1vdmUtcmVzdW1lLTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2N2RhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3VtZS0xLnNoCkBAIC0wLDAgKzEsMjYxIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBDaGVjayB3aGV0aGVyIGFsbCBhdmFpbGFibGUgcHZtb3ZlIHJlc3VtZSBtZXRob2RzIHdvcmtzIGFzIGV4cGVjdGVkLgorIyBsdmNoYW5nZSBpcyBhYmxlIHRvIHJlc3VtZSBwdm1vdmVzIGluIHByb2dyZXNzLgorCisjIDIgcHZtb3ZlIExWcyBpbiAyIFZHcyAoMSBwZXIgVkcpCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgNCAzMAorCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZyAiJGRldjEiCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZzEgIiRkZXYyIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjQiCit2Z2V4dGVuZCAkdmcgIiRkZXYzIgordmdleHRlbmQgJHZnMSAiJGRldjQiCisKKyMgJDEgcmVzdW1lIGZuCit0ZXN0X3B2bW92ZV9yZXN1bWUoKSB7CisJbHZjcmVhdGUgLWFuIC1abiAtbDMwIC1uICRsdjEgJHZnCisJbHZjcmVhdGUgLWFuIC1abiAtbDMwIC1uICRsdjEgJHZnMQorCisJYXV4IGRlbGF5X2RldiAiJGRldjMiIDAgMTAwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MyIpOgorCXRlc3QgLWUgSEFWRV9ETV9ERUxBWSB8fCB7IGx2cmVtb3ZlIC1mICR2ZyAkdmcxOyByZXR1cm4gMDsgfQorCWF1eCBkZWxheV9kZXYgIiRkZXY0IiAwIDEwMDAgJChnZXQgZmlyc3RfZXh0ZW50X3NlY3RvciAiJGRldjQiKToKKworCXB2bW92ZSAtaTUgIiRkZXYxIiAmCisJUFZNT1ZFPSQhCisJYXV4IHdhaXRfcHZtb3ZlX2x2X3JlYWR5ICIkdmctcHZtb3ZlMCIgMzAwCisJa2lsbCAtOSAkUFZNT1ZFCisKKwlwdm1vdmUgLWk1ICIkZGV2MiIgJgorCVBWTU9WRT0kIQorCWF1eCB3YWl0X3B2bW92ZV9sdl9yZWFkeSAiJHZnMS1wdm1vdmUwIiAzMDAKKwlraWxsIC05ICRQVk1PVkUKKworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQgOyB0aGVuCisJCWF1eCBwcmVwYXJlX2x2bXBvbGxkCisJZmkKKworCXdhaXQKKworCXdoaWxlIGRtc2V0dXAgc3RhdHVzICIkdmctJGx2MSI7IGRvIGRtc2V0dXAgcmVtb3ZlICIkdmctJGx2MSIgfHwgdHJ1ZTsgZG9uZQorCXdoaWxlIGRtc2V0dXAgc3RhdHVzICIkdmcxLSRsdjEiOyBkbyBkbXNldHVwIHJlbW92ZSAiJHZnMS0kbHYxIiB8fCB0cnVlOyBkb25lCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2Zy1wdm1vdmUwIjsgZG8gZG1zZXR1cCByZW1vdmUgIiR2Zy1wdm1vdmUwIiB8fCB0cnVlOyBkb25lCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2ZzEtcHZtb3ZlMCI7IGRvIGRtc2V0dXAgcmVtb3ZlICIkdmcxLXB2bW92ZTAiIHx8IHRydWU7IGRvbmUKKworCWNoZWNrIGx2X2F0dHJfYml0IHR5cGUgJHZnL3B2bW92ZTAgInAiCisJY2hlY2sgbHZfYXR0cl9iaXQgdHlwZSAkdmcxL3B2bW92ZTAgInAiCisKKwlpZiB0ZXN0IC1lIExPQ0FMX0NMVk1EIDsgdGhlbgorCQkjIGdpdmV1cCBhbGwgY2x2bWQgbG9ja3MgKGZhc3RlciB0aGVuIHJlc3RhcnRpbmcgY2x2bWQpCisJCSMgbm8gZGVhY3RpdmF0aW9uIGhhcHBlbiwgbm9kZXMgYXJlIGFscmVhZHkgcmVtb3ZlZAorCQkjdmdjaGFuZ2UgLWFuICR2ZworCQkjIEZJWE1FOiBIb3dldmVyIGFib3ZlIHNvbHV0aW9uIGhhcyBvbmUgYmlnIHByb2JsZW0KKwkJIyBhcyBjbHZtZCBzdGFydHMgdG8gYWJvcnQgb24gaW50ZXJuYWwgZXJyb3JzIG9uIHZhcmlvdXMKKwkJIyBlcnJvcnMsIGJhc2VkIG9uIHRoZSBmYWN0IHB2bW92ZSBpcyBraWxsZWQgLTkKKwkJIyBSZXN0YXJ0IGNsdm1kCisJCWtpbGwgJCg8IExPQ0FMX0NMVk1EKQorCQlmb3IgaSBpbiAkKHNlcSAxIDEwMCkgOyBkbworCQkJdGVzdCAkaSAtZXEgMTAwICYmIGRpZSAiU2h1dGRvd24gb2YgY2x2bWQgaXMgdG9vIHNsb3cuIgorCQkJdGVzdCAtZSAiJENMVk1EX1BJREZJTEUiIHx8IGJyZWFrCisJCQlzbGVlcCAuMQorCQlkb25lICMgd2FpdCBmb3IgdGhlIHBpZCByZW1vdmFsCisJCWF1eCBwcmVwYXJlX2Nsdm1kCisJZmkKKworCWF1eCBub3RpZnlfbHZtZXRhZCAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisKKwkjIGNhbGwgcmVzdW1lIGZ1bmN0aW9uIChzZWUgYmVsb3cpCisJIyB3aXRoIGV4cGVjdGVkIG51bWJlciBvZiBzcGF3bmVkCisJIyBiZyBwb2xsaW5nIGFzIHBhcmFtZXRlcgorCSQxIDIKKworCWF1eCBlbmFibGVfZGV2ICIkZGV2MyIKKwlhdXggZW5hYmxlX2RldiAiJGRldjQiCisKKwlpPTAKKwl3aGlsZSBnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZSI7IGRvCisJCSMgd2FpdCBmb3IgMzAgc2VjcyBhdCBtYXgKKwkJdGVzdCAkaSAtZ2UgMzAwICYmIGRpZSAiUHZtb3ZlIGlzIHRvbyBzbG93IG9yIGRvZXMgbm90IHByb2dyZXNzLiIKKwkJc2xlZXAgLjEKKwkJaT0kKChpICsgMSkpCisJZG9uZQorCXdoaWxlIGdldCBsdl9maWVsZCAkdmcxIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZSI7IGRvCisJCSMgd2FpdCBmb3IgMzAgc2VjcyBhdCBtYXgKKwkJdGVzdCAkaSAtZ2UgMzAwICYmIGRpZSAiUHZtb3ZlIGlzIHRvbyBzbG93IG9yIGRvZXMgbm90IHByb2dyZXNzLiIKKwkJc2xlZXAgLjEKKwkJaT0kKChpICsgMSkpCisJZG9uZQorCisJYXV4IGtpbGxfdGFnZ2VkX3Byb2Nlc3NlcworCisJbHZyZW1vdmUgLWZmICR2ZyAkdmcxCit9CisKK2x2Y2hhbmdlX3NpbmdsZSgpIHsKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MQorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBsdmNoYW5nZSAtYWV5ICR2ZzEvJGx2MQorCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAxICIkdmcvcHZtb3ZlMCIKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnMS9wdm1vdmUwIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAkMQorCWZpCit9CisKK2x2Y2hhbmdlX2FsbCgpIHsKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MSAkdmcxLyRsdjEKKworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDEgIiR2ZzEvcHZtb3ZlMCIKKwllbHNlCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgJDEKKwlmaQorfQorCit2Z2NoYW5nZV9zaW5nbGUoKSB7CisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHZnY2hhbmdlIC1hZXkgJHZnCisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHZnY2hhbmdlIC1hZXkgJHZnMQorCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAxICIkdmcvcHZtb3ZlMCIKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnMS9wdm1vdmUwIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAkMQorCWZpCit9CisKK3ZnY2hhbmdlX2FsbCgpICB7CisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHZnY2hhbmdlIC1hZXkgJHZnICR2ZzEKKworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDEgIiR2ZzEvcHZtb3ZlMCIKKwllbHNlCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgJDEKKwlmaQorfQorCitwdm1vdmVfZmcoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnICR2ZzEKKworCSMgLi4uYWxzbyB2Z2NoYW5nZSAtLXBvbGwgbiBtdXN0IG5vdCBzcGF3biBhbnkgYmcgcHJvY2Vzc2VzLi4uCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcvcHZtb3ZlMCIKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnMS9wdm1vdmUwIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAwCisJZmkKKworCSMgLi4udGh1cyBmaW5pc2ggcG9sbGluZworCWdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMCIKKwlnZXQgbHZfZmllbGQgJHZnMSBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCisJIyBkaXNhYmxlIGRlbGF5IGRldmljZQorCSMgZmcgcHZtb3ZlIHdvdWxkIHRha2UgYWdlcyB0byBjb21wbGV0ZSBvdGhlcndpc2UKKwlhdXggZW5hYmxlX2RldiAiJGRldjMiCisJYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorCisJcHZtb3ZlCit9CisKK3B2bW92ZV9iZygpIHsKKwkjIHB2bW92ZSByZXN1bWUgcmVxdWlyZXMgTFZzIGFjdGl2ZS4uLgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiB2Z2NoYW5nZSAtLWNvbmZpZyAnYWN0aXZhdGlvbntwb2xsaW5nX2ludGVydmFsPTEwfScgLWFleSAtLXBvbGwgbiAkdmcgJHZnMQorCisJIyAuLi5hbHNvIHZnY2hhbmdlIC0tcG9sbCBuIG11c3Qgbm90IHNwYXduIGFueSBiZyBwcm9jZXNzZXMuLi4KKwlpZiB0ZXN0IC1lIExPQ0FMX0xWTVBPTExEOyB0aGVuCisJCWF1eCBsdm1wb2xsZF9kdW1wIHwgdGVlIGx2bXBvbGxkX2R1bXAudHh0CisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2Zy9wdm1vdmUwIgorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcxL3B2bW92ZTAiCisJZWxzZQorCQl0ZXN0ICQoYXV4IGNvdW50X3Byb2Nlc3Nlc193aXRoX3RhZykgLWVxIDAKKwlmaQorCisJIyAuLi50aHVzIGZpbmlzaCBwb2xsaW5nCisJZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCWdldCBsdl9maWVsZCAkdmcxIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTAiCisKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iIC1pMAorfQorCitwdm1vdmVfZmdfc2luZ2xlKCkgeworCSMgcHZtb3ZlIHJlc3VtZSByZXF1aXJlcyBMVnMgYWN0aXZlLi4uCisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHZnY2hhbmdlIC0tY29uZmlnICdhY3RpdmF0aW9ue3BvbGxpbmdfaW50ZXJ2YWw9MTB9JyAtYWV5IC0tcG9sbCBuICR2ZworCisJIyAuLi5hbHNvIHZnY2hhbmdlIC0tcG9sbCBuIG11c3Qgbm90IHNwYXduIGFueSBiZyBwcm9jZXNzZXMuLi4KKwlpZiB0ZXN0IC1lIExPQ0FMX0xWTVBPTExEOyB0aGVuCisJCWF1eCBsdm1wb2xsZF9kdW1wIHwgdGVlIGx2bXBvbGxkX2R1bXAudHh0CisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2Zy9wdm1vdmUwIgorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcxL3B2bW92ZTAiCisJZWxzZQorCQl0ZXN0ICQoYXV4IGNvdW50X3Byb2Nlc3Nlc193aXRoX3RhZykgLWVxIDAKKwlmaQorCisJIyAuLi50aHVzIGZpbmlzaCBwb2xsaW5nCisJZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCWdldCBsdl9maWVsZCAkdmcxIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTAiCisKKwkjIGRpc2FibGUgZGVsYXkgZGV2aWNlCisJIyBmZyBwdm1vdmUgd291bGQgdGFrZSBhZ2VzIHRvIGNvbXBsZXRlIG90aGVyd2lzZQorCWF1eCBlbmFibGVfZGV2ICIkZGV2MyIKKwlhdXggZW5hYmxlX2RldiAiJGRldjQiCisKKwlwdm1vdmUgIiRkZXYxIgorCXB2bW92ZSAiJGRldjIiCit9CisKK3B2bW92ZV9iZ19zaW5nbGUoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3Nlcy4uLgorCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2ZzEvcHZtb3ZlMCIKKwllbHNlCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgMAorCWZpCisKKwkjIC4uLnRodXMgZmluaXNoIHBvbGxpbmcKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTAiCisJZ2V0IGx2X2ZpZWxkICR2ZzEgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMCIKKworCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBwdm1vdmUgLWIgIiRkZXYxIgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBwdm1vdmUgLWIgIiRkZXYyIgorfQorCit0ZXN0X3B2bW92ZV9yZXN1bWUgbHZjaGFuZ2Vfc2luZ2xlCit0ZXN0X3B2bW92ZV9yZXN1bWUgbHZjaGFuZ2VfYWxsCit0ZXN0X3B2bW92ZV9yZXN1bWUgdmdjaGFuZ2Vfc2luZ2xlCit0ZXN0X3B2bW92ZV9yZXN1bWUgdmdjaGFuZ2VfYWxsCit0ZXN0X3B2bW92ZV9yZXN1bWUgcHZtb3ZlX2ZnCit0ZXN0X3B2bW92ZV9yZXN1bWUgcHZtb3ZlX2ZnX3NpbmdsZQordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9iZwordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9iZ19zaW5nbGUKKwordmdyZW1vdmUgLWZmICR2ZyAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2bW92ZS1yZXN1bWUtMi5zaCBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3VtZS0yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS1yZXN1bWUtMi5zaApAQCAtMCwwICsxLDIwMyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgQ2hlY2sgd2hldGhlciBhbGwgYXZhaWxhYmxlIHB2bW92ZSByZXN1bWUgbWV0aG9kcyB3b3JrcyBhcyBleHBlY3RlZC4KKyMgbHZjaGFuZ2UgaXMgYWJsZSB0byByZXN1bWUgcHZtb3ZlcyBpbiBwcm9ncmVzcy4KKworIyBNb3ZpbmcgMiBMVnMgaW4gVkcgdmFyaWFudAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDIgMzAKKwordmdjcmVhdGUgLXMgMTI4ayAkdmcgIiRkZXYxIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MiIKK3ZnZXh0ZW5kICR2ZyAiJGRldjIiCisKK3Rlc3RfcHZtb3ZlX3Jlc3VtZSgpIHsKKwkjIDIgTFZzIG9uIHNhbWUgZGV2aWNlCisJbHZjcmVhdGUgLWFuIC1abiAtbDE1IC1uICRsdjEgJHZnICIkZGV2MSIKKwlsdmNyZWF0ZSAtYW4gLVpuIC1sMTUgLW4gJGx2MiAkdmcgIiRkZXYxIgorCisJYXV4IGRlbGF5X2RldiAiJGRldjIiIDAgMTAwMCAkKGdldCBmaXJzdF9leHRlbnRfc2VjdG9yICIkZGV2MiIpOgorCisJcHZtb3ZlIC1pNSAiJGRldjEiICYKKwlQVk1PVkU9JCEKKwlhdXggd2FpdF9wdm1vdmVfbHZfcmVhZHkgIiR2Zy1wdm1vdmUwIiAzMDAKKwlraWxsIC05ICRQVk1PVkUKKworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQgOyB0aGVuCisJCWF1eCBwcmVwYXJlX2x2bXBvbGxkCisJZmkKKworCXdhaXQKKworCXdoaWxlIGRtc2V0dXAgc3RhdHVzICIkdmctJGx2MSI7IGRvIGRtc2V0dXAgcmVtb3ZlICIkdmctJGx2MSIgfHwgdHJ1ZTsgZG9uZQorCXdoaWxlIGRtc2V0dXAgc3RhdHVzICIkdmctJGx2MiI7IGRvIGRtc2V0dXAgcmVtb3ZlICIkdmctJGx2MiIgfHwgdHJ1ZTsgZG9uZQorCXdoaWxlIGRtc2V0dXAgc3RhdHVzICIkdmctcHZtb3ZlMCI7IGRvIGRtc2V0dXAgcmVtb3ZlICIkdmctcHZtb3ZlMCIgfHwgdHJ1ZTsgZG9uZQorCisJY2hlY2sgbHZfYXR0cl9iaXQgdHlwZSAkdmcvcHZtb3ZlMCAicCIKKworCWlmIHRlc3QgLWUgTE9DQUxfQ0xWTUQgOyB0aGVuCisJCSMgZ2l2ZXVwIGFsbCBjbHZtZCBsb2NrcyAoZmFzdGVyIHRoZW4gcmVzdGFydGluZyBjbHZtZCkKKwkJIyBubyBkZWFjdGl2YXRpb24gaGFwcGVuLCBub2RlcyBhcmUgYWxyZWFkeSByZW1vdmVkCisJCSN2Z2NoYW5nZSAtYW4gJHZnCisJCSMgRklYTUU6IEhvd2V2ZXIgYWJvdmUgc29sdXRpb24gaGFzIG9uZSBiaWcgcHJvYmxlbQorCQkjIGFzIGNsdm1kIHN0YXJ0cyB0byBhYm9ydCBvbiBpbnRlcm5hbCBlcnJvcnMgb24gdmFyaW91cworCQkjIGVycm9ycywgYmFzZWQgb24gdGhlIGZhY3QgcHZtb3ZlIGlzIGtpbGxlZCAtOQorCQkjIFJlc3RhcnQgY2x2bWQKKwkJa2lsbCAkKDwgTE9DQUxfQ0xWTUQpCisJCWZvciBpIGluICQoc2VxIDEgMTAwKSA7IGRvCisJCQl0ZXN0ICRpIC1lcSAxMDAgJiYgZGllICJTaHV0ZG93biBvZiBjbHZtZCBpcyB0b28gc2xvdy4iCisJCQl0ZXN0IC1lICIkQ0xWTURfUElERklMRSIgfHwgYnJlYWsKKwkJCXNsZWVwIC4xCisJCWRvbmUgIyB3YWl0IGZvciB0aGUgcGlkIHJlbW92YWwKKwkJYXV4IHByZXBhcmVfY2x2bWQKKwlmaQorCisJYXV4IG5vdGlmeV9sdm1ldGFkICIkZGV2MSIgIiRkZXYyIgorCisJIyBjYWxsIHJlc3VtZSBmdW5jdGlvbiAoc2VlIGJlbG93KQorCSMgd2l0aCBleHBlY3RlZCBudW1iZXIgb2Ygc3Bhd25lZAorCSMgYmcgcG9sbGluZyBhcyBwYXJhbWV0ZXIKKwkkMSAxCisKKwlhdXggZW5hYmxlX2RldiAiJGRldjIiCisKKwlpPTAKKwl3aGlsZSBnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBncmVwICJecHZtb3ZlIjsgZG8KKwkJIyB3YWl0IGZvciAzMCBzZWNzIGF0IG1heAorCQl0ZXN0ICRpIC1nZSAzMDAgJiYgZGllICJQdm1vdmUgaXMgdG9vIHNsb3cgb3IgZG9lcyBub3QgcHJvZ3Jlc3MuIgorCQlzbGVlcCAuMQorCQlpPSQoKGkgKyAxKSkKKwlkb25lCisKKwlhdXgga2lsbF90YWdnZWRfcHJvY2Vzc2VzCisKKwlsdnJlbW92ZSAtZmYgJHZnCit9CisKK2x2Y2hhbmdlX3NpbmdsZSgpIHsKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MQorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiBsdmNoYW5nZSAtYWV5ICR2Zy8kbHYyCit9CisKK2x2Y2hhbmdlX2FsbCgpIHsKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MSAkdmcvJGx2MgorCisJIyB3ZSBkb24ndCB3YW50IHRvIHNwYXduIG1vcmUgdGhhbiAkMSBiYWNrZ3JvdW5kIHBvbGxpbmdzCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAxICIkdmcvcHZtb3ZlMCIgfHwgc2hvdWxkIGZhbHNlCisJZWxpZiB0ZXN0IC1lIEhBVkVfRE1fREVMQVk7IHRoZW4KKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAkMSB8fCBzaG91bGQgZmFsc2UKKwlmaQorfQorCit2Z2NoYW5nZV9zaW5nbGUoKSB7CisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIHZnY2hhbmdlIC1hZXkgJHZnCisKKwlpZiB0ZXN0IC1lIExPQ0FMX0xWTVBPTExEOyB0aGVuCisJCWF1eCBsdm1wb2xsZF9kdW1wIHwgdGVlIGx2bXBvbGxkX2R1bXAudHh0CisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDEgIiR2Zy9wdm1vdmUwIgorCWVsaWYgdGVzdCAtZSBIQVZFX0RNX0RFTEFZOyB0aGVuCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgJDEKKwlmaQorfQorCitwdm1vdmVfZmcoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3NlcworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJZWxzZQorCQl0ZXN0ICQoYXV4IGNvdW50X3Byb2Nlc3Nlc193aXRoX3RhZykgLWVxIDAKKwlmaQorCisJIyAuLi50aHVzIGZpbmlzaCBwb2xsaW5nCisJZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCisJYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorCisJcHZtb3ZlCit9CisKK3B2bW92ZV9iZygpIHsKKwkjIHB2bW92ZSByZXN1bWUgcmVxdWlyZXMgTFZzIGFjdGl2ZS4uLgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiB2Z2NoYW5nZSAtLWNvbmZpZyAnYWN0aXZhdGlvbntwb2xsaW5nX2ludGVydmFsPTEwfScgLWFleSAtLXBvbGwgbiAkdmcKKworCSMgLi4uYWxzbyB2Z2NoYW5nZSAtLXBvbGwgbiBtdXN0IG5vdCBzcGF3biBhbnkgYmcgcHJvY2Vzc2VzCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcvcHZtb3ZlMCIKKwllbHNlCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgMAorCWZpCisKKwkjIC4uLnRodXMgZmluaXNoIHBvbGxpbmcKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTAiCisKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iCit9CisKK3B2bW92ZV9mZ19zaW5nbGUoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3NlcworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJZWxzZQorCQl0ZXN0ICQoYXV4IGNvdW50X3Byb2Nlc3Nlc193aXRoX3RhZykgLWVxIDAKKwlmaQorCisJIyAuLi50aHVzIGZpbmlzaCBwb2xsaW5nCisJZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCisJYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorCisJcHZtb3ZlICIkZGV2MSIKK30KKworcHZtb3ZlX2JnX3NpbmdsZSgpIHsKKwkjIHB2bW92ZSByZXN1bWUgcmVxdWlyZXMgTFZzIGFjdGl2ZS4uLgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiB2Z2NoYW5nZSAtLWNvbmZpZyAnYWN0aXZhdGlvbntwb2xsaW5nX2ludGVydmFsPTEwfScgLWFleSAtLXBvbGwgbiAkdmcKKworCSMgLi4uYWxzbyB2Z2NoYW5nZSAtLXBvbGwgbiBtdXN0IG5vdCBzcGF3biBhbnkgYmcgcHJvY2Vzc2VzLi4uCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcvcHZtb3ZlMCIKKwllbHNlCisJCXRlc3QgJChhdXggY291bnRfcHJvY2Vzc2VzX3dpdGhfdGFnKSAtZXEgMAorCWZpCisKKwkjIC4uLnRodXMgZmluaXNoIHBvbGxpbmcKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTAiCisKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iICIkZGV2MSIKK30KKwordGVzdF9wdm1vdmVfcmVzdW1lIGx2Y2hhbmdlX3NpbmdsZQordGVzdF9wdm1vdmVfcmVzdW1lIGx2Y2hhbmdlX2FsbAordGVzdF9wdm1vdmVfcmVzdW1lIHZnY2hhbmdlX3NpbmdsZQordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9mZwordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9mZ19zaW5nbGUKK3Rlc3RfcHZtb3ZlX3Jlc3VtZSBwdm1vdmVfYmcKK3Rlc3RfcHZtb3ZlX3Jlc3VtZSBwdm1vdmVfYmdfc2luZ2xlCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3VtZS1tdWx0aXNlZy5zaCBiL3Rlc3Qvc2hlbGwvcHZtb3ZlLXJlc3VtZS1tdWx0aXNlZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI3NzBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdm1vdmUtcmVzdW1lLW11bHRpc2VnLnNoCkBAIC0wLDAgKzEsMjM2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBDaGVjayB3aGV0aGVyIGFsbCBhdmFpbGFibGUgcHZtb3ZlIHJlc3VtZSBtZXRob2RzIHdvcmtzIGFzIGV4cGVjdGVkLgorIyBsdmNoYW5nZSBpcyBhYmxlIHRvIHJlc3VtZSBwdm1vdmVzIGluIHByb2dyZXNzLgorCisjIE11bHRpc2VnbWVudCB2YXJpYW50IHcvIDIgcHZtb3ZlcyBMVnMgcGVyIFZHCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgNSAzMAorCit2Z2NyZWF0ZSAtcyAxMjhrICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2NCIgIiRkZXY1IgordmdleHRlbmQgJHZnICIkZGV2NCIgIiRkZXY1IgorCisjICQxIHJlc3VtZSBmbgordGVzdF9wdm1vdmVfcmVzdW1lKCkgeworCSMgQ3JlYXRlIG11bHRpc2VnbWVudCBMVgorCWx2Y3JlYXRlIC1hbiAtWm4gLWwzMCAtbiAkbHYxICR2ZyAiJGRldjEiCisJbHZleHRlbmQgLWwrMzAgJHZnLyRsdjEgIiRkZXYyIgorCSMgbmV4dCBMViBvbiBzYW1lIFZHIGFuZCBkaWZmZXJldG50IFBWICh3ZSB3YW50IHRvIHRlc3QgMiBwdm1vdmVzIHBlciBWRykKKwlsdmNyZWF0ZSAtYW4gLVpuIC1sMzAgLW4gJGx2MiAkdmcgIiRkZXYzIgorCisJYXV4IGRlbGF5X2RldiAiJGRldjQiIDAgMjUwCisJdGVzdCAtZSBIQVZFX0RNX0RFTEFZIHx8IHsgbHZyZW1vdmUgLWYgJHZnOyByZXR1cm4gMDsgfQorCWF1eCBkZWxheV9kZXYgIiRkZXY1IiAwIDI1MAorCisJcHZtb3ZlIC1pNSAiJGRldjEiICIkZGV2NCIgJgorCVBWTU9WRT0kIQorCWF1eCB3YWl0X3B2bW92ZV9sdl9yZWFkeSAiJHZnLXB2bW92ZTAiIDMwMAorCWtpbGwgLTkgJFBWTU9WRQorCisJcHZtb3ZlIC1pNSAtbiAkdmcvJGx2MiAiJGRldjMiICIkZGV2NSIgJgorCVBWTU9WRT0kIQorCWF1eCB3YWl0X3B2bW92ZV9sdl9yZWFkeSAiJHZnLXB2bW92ZTEiIDMwMAorCWtpbGwgLTkgJFBWTU9WRQorCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRCA7IHRoZW4KKwkJYXV4IHByZXBhcmVfbHZtcG9sbGQKKwlmaQorCisJd2FpdAorCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2Zy0kbHYxIjsgZG8gZG1zZXR1cCByZW1vdmUgIiR2Zy0kbHYxIiB8fCB0cnVlOyBkb25lCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2Zy0kbHYyIjsgZG8gZG1zZXR1cCByZW1vdmUgIiR2Zy0kbHYyIiB8fCB0cnVlOyBkb25lCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2Zy1wdm1vdmUwIjsgZG8gZG1zZXR1cCByZW1vdmUgIiR2Zy1wdm1vdmUwIiB8fCB0cnVlOyBkb25lCisJd2hpbGUgZG1zZXR1cCBzdGF0dXMgIiR2Zy1wdm1vdmUxIjsgZG8gZG1zZXR1cCByZW1vdmUgIiR2Zy1wdm1vdmUxIiB8fCB0cnVlOyBkb25lCisKKwljaGVjayBsdl9hdHRyX2JpdCB0eXBlICR2Zy9wdm1vdmUwICJwIgorCWNoZWNrIGx2X2F0dHJfYml0IHR5cGUgJHZnL3B2bW92ZTEgInAiCisKKwlpZiB0ZXN0IC1lIExPQ0FMX0NMVk1EIDsgdGhlbgorCQkjIGdpdmV1cCBhbGwgY2x2bWQgbG9ja3MgKGZhc3RlciB0aGVuIHJlc3RhcnRpbmcgY2x2bWQpCisJCSMgbm8gZGVhY3RpdmF0aW9uIGhhcHBlbiwgbm9kZXMgYXJlIGFscmVhZHkgcmVtb3ZlZAorCQkjdmdjaGFuZ2UgLWFuICR2ZworCQkjIEZJWE1FOiBIb3dldmVyIGFib3ZlIHNvbHV0aW9uIGhhcyBvbmUgYmlnIHByb2JsZW0KKwkJIyBhcyBjbHZtZCBzdGFydHMgdG8gYWJvcnQgb24gaW50ZXJuYWwgZXJyb3JzIG9uIHZhcmlvdXMKKwkJIyBlcnJvcnMsIGJhc2VkIG9uIHRoZSBmYWN0IHB2bW92ZSBpcyBraWxsZWQgLTkKKwkJIyBSZXN0YXJ0IGNsdm1kCisJCWtpbGwgJCg8IExPQ0FMX0NMVk1EKQorCQlmb3IgaSBpbiAkKHNlcSAxIDEwMCkgOyBkbworCQkJdGVzdCAkaSAtZXEgMTAwICYmIGRpZSAiU2h1dGRvd24gb2YgY2x2bWQgaXMgdG9vIHNsb3cuIgorCQkJdGVzdCAtZSAiJENMVk1EX1BJREZJTEUiIHx8IGJyZWFrCisJCQlzbGVlcCAuMQorCQlkb25lICMgd2FpdCBmb3IgdGhlIHBpZCByZW1vdmFsCisJCWF1eCBwcmVwYXJlX2Nsdm1kCisJZmkKKworCWF1eCBub3RpZnlfbHZtZXRhZCAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKKworCSMgY2FsbCByZXN1bWUgZnVuY3Rpb24gKHNlZSBiZWxvdykKKwkjIHdpdGggZXhwZWN0ZWQgbnVtYmVyIG9mIHNwYXduZWQKKwkjIGJnIHBvbGxpbmcgYXMgcGFyYW1ldGVyCisJJDEgMgorCisJYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorCWF1eCBlbmFibGVfZGV2ICIkZGV2NSIKKworCWk9MAorCXdoaWxlIGdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGdyZXAgIl5cWz9wdm1vdmUiOyBkbworCQkjIHdhaXQgZm9yIDMwIHNlY3MgYXQgbWF4CisJCXRlc3QgJGkgLWdlIDMwMCAmJiBkaWUgIlB2bW92ZSBpcyB0b28gc2xvdyBvciBkb2VzIG5vdCBwcm9ncmVzcy4iCisJCXNsZWVwIC4xCisJCWk9JCgoaSArIDEpKQorCWRvbmUKKworCWF1eCBraWxsX3RhZ2dlZF9wcm9jZXNzZXMKKworCWx2cmVtb3ZlIC1mZiAkdmcKKwkjIGRyb3AgZGVidWcgbG9ncyBmcm9tIGtpbGxlZCBsdm0yIGNvbW1hbmRzCisJcm0gLWYgZGVidWcubG9nX0RFQlVHKgorfQorCitsdmNoYW5nZV9zaW5nbGUoKSB7CisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIGx2Y2hhbmdlIC1hZXkgJHZnLyRsdjEKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MgorfQorCitsdmNoYW5nZV9hbGwoKSB7CisJTFZNX1RFU1RfVEFHPSJraWxsX21lXyRQUkVGSVgiIGx2Y2hhbmdlIC1hZXkgJHZnLyRsdjEgJHZnLyRsdjIKKworCSMgd2UgZG9uJ3Qgd2FudCB0byBzcGF3biBtb3JlIHRoYW4gJDEgYmFja2dyb3VuZCBwb2xsaW5ncworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDEgIiR2Zy9wdm1vdmUxIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAkMQorCWZpCit9CisKK3ZnY2hhbmdlX3NpbmdsZSgpIHsKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLWFleSAkdmcKKworCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMSAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDEgIiR2Zy9wdm1vdmUxIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAkMQorCWZpCit9CisKK3B2bW92ZV9mZygpIHsKKwkjIHB2bW92ZSByZXN1bWUgcmVxdWlyZXMgTFZzIGFjdGl2ZS4uLgorCUxWTV9URVNUX1RBRz0ia2lsbF9tZV8kUFJFRklYIiB2Z2NoYW5nZSAtLWNvbmZpZyAnYWN0aXZhdGlvbntwb2xsaW5nX2ludGVydmFsPTEwfScgLWFleSAtLXBvbGwgbiAkdmcKKworCSMgLi4uYWxzbyB2Z2NoYW5nZSAtLXBvbGwgbiBtdXN0IG5vdCBzcGF3biBhbnkgYmcgcHJvY2Vzc2VzLi4uCisJaWYgdGVzdCAtZSBMT0NBTF9MVk1QT0xMRDsgdGhlbgorCQlhdXggbHZtcG9sbGRfZHVtcCB8IHRlZSBsdm1wb2xsZF9kdW1wLnR4dAorCQlhdXggY2hlY2tfbHZtcG9sbGRfaW5pdF9ycV9jb3VudCAwICIkdmcvcHZtb3ZlMCIKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTEiCisJZWxzZQorCQl0ZXN0ICQoYXV4IGNvdW50X3Byb2Nlc3Nlc193aXRoX3RhZykgLWVxIDAKKwlmaQorCisJIyAuLi50aHVzIGZpbmlzaCBwb2xsaW5nCisJZ2V0IGx2X2ZpZWxkICR2ZyBuYW1lIC1hIHwgZWdyZXAgIl5cWz9wdm1vdmUwIgorCWdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMSIKKworCSMgZGlzYWJsZSBkZWxheSBkZXZpY2UKKwkjIGZnIHB2bW92ZSB3b3VsZCB0YWtlIGFnZXMgdG8gY29tcGxldGUgb3RoZXJ3aXNlCisJYXV4IGVuYWJsZV9kZXYgIiRkZXY0IgorCWF1eCBlbmFibGVfZGV2ICIkZGV2NSIKKworCXB2bW92ZQorfQorCitwdm1vdmVfYmcoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3Nlcy4uLgorCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2Zy9wdm1vdmUxIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAwCisJZmkKKworCSMgLi4udGh1cyBmaW5pc2ggcG9sbGluZworCWdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMCIKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTEiCisKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iCit9CisKK3B2bW92ZV9mZ19zaW5nbGUoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3Nlcy4uLgorCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2Zy9wdm1vdmUxIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAwCisJZmkKKworCSMgLi4udGh1cyBmaW5pc2ggcG9sbGluZworCWdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMCIKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTEiCisKKwkjIGRpc2FibGUgZGVsYXkgZGV2aWNlCisJIyBmZyBwdm1vdmUgd291bGQgdGFrZSBhZ2VzIHRvIGNvbXBsZXRlIG90aGVyd2lzZQorCWF1eCBlbmFibGVfZGV2ICIkZGV2NCIKKwlhdXggZW5hYmxlX2RldiAiJGRldjUiCisKKwlwdm1vdmUgIiRkZXYxIgorCXB2bW92ZSAiJGRldjMiCit9CisKK3B2bW92ZV9iZ19zaW5nbGUoKSB7CisJIyBwdm1vdmUgcmVzdW1lIHJlcXVpcmVzIExWcyBhY3RpdmUuLi4KKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgdmdjaGFuZ2UgLS1jb25maWcgJ2FjdGl2YXRpb257cG9sbGluZ19pbnRlcnZhbD0xMH0nIC1hZXkgLS1wb2xsIG4gJHZnCisKKwkjIC4uLmFsc28gdmdjaGFuZ2UgLS1wb2xsIG4gbXVzdCBub3Qgc3Bhd24gYW55IGJnIHByb2Nlc3Nlcy4uLgorCWlmIHRlc3QgLWUgTE9DQUxfTFZNUE9MTEQ7IHRoZW4KKwkJYXV4IGx2bXBvbGxkX2R1bXAgfCB0ZWUgbHZtcG9sbGRfZHVtcC50eHQKKwkJYXV4IGNoZWNrX2x2bXBvbGxkX2luaXRfcnFfY291bnQgMCAiJHZnL3B2bW92ZTAiCisJCWF1eCBjaGVja19sdm1wb2xsZF9pbml0X3JxX2NvdW50IDAgIiR2Zy9wdm1vdmUxIgorCWVsc2UKKwkJdGVzdCAkKGF1eCBjb3VudF9wcm9jZXNzZXNfd2l0aF90YWcpIC1lcSAwCisJZmkKKworCSMgLi4udGh1cyBmaW5pc2ggcG9sbGluZworCWdldCBsdl9maWVsZCAkdmcgbmFtZSAtYSB8IGVncmVwICJeXFs/cHZtb3ZlMCIKKwlnZXQgbHZfZmllbGQgJHZnIG5hbWUgLWEgfCBlZ3JlcCAiXlxbP3B2bW92ZTEiCisKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iICIkZGV2MSIKKwlMVk1fVEVTVF9UQUc9ImtpbGxfbWVfJFBSRUZJWCIgcHZtb3ZlIC1iICIkZGV2MyIKK30KKwordGVzdF9wdm1vdmVfcmVzdW1lIGx2Y2hhbmdlX3NpbmdsZQordGVzdF9wdm1vdmVfcmVzdW1lIGx2Y2hhbmdlX2FsbAordGVzdF9wdm1vdmVfcmVzdW1lIHZnY2hhbmdlX3NpbmdsZQordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9mZwordGVzdF9wdm1vdmVfcmVzdW1lIHB2bW92ZV9mZ19zaW5nbGUKK3Rlc3RfcHZtb3ZlX3Jlc3VtZSBwdm1vdmVfYmcKK3Rlc3RfcHZtb3ZlX3Jlc3VtZSBwdm1vdmVfYmdfc2luZ2xlCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZtb3ZlLXRoaW4tc2VndHlwZXMuc2ggYi90ZXN0L3NoZWxsL3B2bW92ZS10aGluLXNlZ3R5cGVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmEyNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3B2bW92ZS10aGluLXNlZ3R5cGVzLnNoCkBAIC0wLDAgKzEsNzUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSJlbnN1cmUgcHZtb3ZlIHdvcmtzIHdpdGggdGhpbiBzZWdtZW50IHR5cGVzIgorU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9DTFZNRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1kNXN1bSB8fCBza2lwCisKK2F1eCBoYXZlX3RoaW4gMSA4IDAgfHwgc2tpcAorIyBmb3Igc3RhY2tpbmcKK2F1eCBoYXZlX3JhaWQgMSAzIDUgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgNSAyMAordmdjcmVhdGUgLWMgbiAtcyAxMjhrICR2ZyAkKGNhdCBERVZJQ0VTKQorCitmb3IgbW9kZSBpbiAiLS1hdG9taWMiICIiCitkbworCisjIEVhY2ggb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBkb2VzOgorIyAxKSBDcmVhdGUgdHdvIExWcyAtIG9uZSBsaW5lYXIgYW5kIG9uZSBvdGhlciBzZWdtZW50IHR5cGUKKyMgICAgVGhlIHR3byBMVnMgd2lsbCBzaGFyZSBhIFBWLgorIyAyKSBNb3ZlIGJvdGggTFZzIHRvZ2V0aGVyCisjIDMpIE1vdmUgb25seSB0aGUgc2Vjb25kIExWIGJ5IG5hbWUKKworCisjIFRlc3RpbmcgcHZtb3ZlIG9mIHRoaW4gTFYKK2x2Y3JlYXRlIC1sIDIgLW4gJHtsdjF9X2ZvbyAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLVQgJHZnLyR7bHYxfV9wb29sIC1sIDQgLVYgOCAtbiAkbHYxICIkZGV2MSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjEiCithdXggbWtkZXZfbWQ1c3VtICR2ZyAkbHYxCitwdm1vdmUgIiRkZXYxIiAiJGRldjUiICRtb2RlCitjaGVjayBsdl90cmVlX29uICR2ZyAke2x2MX1fZm9vICIkZGV2NSIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICRsdjEgIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorcHZtb3ZlIC1uICRsdjEgIiRkZXY1IiAiJGRldjQiICRtb2RlCitjaGVjayBsdl90cmVlX29uICR2ZyAkbHYxICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCisjIFRlc3RpbmcgcHZtb3ZlIG9mIHRoaW4gTFYgb24gUkFJRAorbHZjcmVhdGUgLWwgMiAtbiAke2x2MX1fZm9vICR2ZyAiJGRldjEiCitsdmNyZWF0ZSAtLXR5cGUgcmFpZDEgLW0gMSAtbCA0IC1uICR7bHYxfV9yYWlkMV9wb29sICR2ZyAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC0tdHlwZSByYWlkMSAtbSAxIC1MIDIgLW4gJHtsdjF9X3JhaWQxX21ldGEgJHZnICIkZGV2MSIgIiRkZXYyIgorbHZjb252ZXJ0IC0teWVzIC0tdGhpbnBvb2wgJHZnLyR7bHYxfV9yYWlkMV9wb29sIFwKKyAgICAgICAgLS1wb29sbWV0YWRhdGEgJHtsdjF9X3JhaWQxX21ldGEKK2x2Y3JlYXRlIC1UICR2Zy8ke2x2MX1fcmFpZDFfcG9vbCAtViA4IC1uICRsdjEKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXYxIgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjEiICIkZGV2MiIKK2F1eCBta2Rldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAiJGRldjEiICIkZGV2NSIgJG1vZGUKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjIiICIkZGV2NSIKK2NoZWNrIGRldl9tZDVzdW0gJHZnICRsdjEKK3B2bW92ZSAtbiAkbHYxICIkZGV2NSIgIiRkZXY0IiAkbW9kZQorY2hlY2sgbHZfdHJlZV9vbiAkdmcgJGx2MSAiJGRldjIiICIkZGV2NCIKK2NoZWNrIGx2X3RyZWVfb24gJHZnICR7bHYxfV9mb28gIiRkZXY1IgorY2hlY2sgZGV2X21kNXN1bSAkdmcgJGx2MQorbHZyZW1vdmUgLWZmICR2ZworCitkb25lCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcHZyZW1vdmUtdGhpbi5zaCBiL3Rlc3Qvc2hlbGwvcHZyZW1vdmUtdGhpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWUwZTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdnJlbW92ZS10aGluLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIENoZWNrcyB3ZSBhcmUgbm90IHJlYWRpbmcgb3VyIG93biBkZXZpY2VzCisjIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTA2NDM3NAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcKKworYXV4IGhhdmVfdGhpbiAxIDggMCB8fCBza2lwCisKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKKworbHZjcmVhdGUgLUwxMCAtVjEwIC1uICRsdjEgLVQgJHZnL3Bvb2wxCisKK3B2Y3JlYXRlICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK3B2cmVtb3ZlICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9wdnJlbW92ZS11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvcHZyZW1vdmUtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNTFiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHZyZW1vdmUtdXNhZ2Uuc2gKQEAgLTAsMCArMSw4MyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDMKK3B2Y3JlYXRlICIkZGV2MSIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjIiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDIgIiRkZXYzIgorCisjIEZhaWxzIHdpdGhvdXQgZ2l2ZSBhcmd1bWVudAorbm90IHB2cmVtb3ZlCitwdnJlbW92ZSAiJGRldjIiCisKKyMgZmFpbGluZywgYnV0IHN0aWxsIHJlbW92aW5nIGV2ZXJ5dGhpbmcgd2hhdCBjYW4gYmUgcmVtb3ZlZAorIyBpcyBzb21ld2hhdCBvZGQgYXMgZGVmYXVsdCwgd2hhdCBkbyB3ZSBoYXZlIC1mIGZvcj8KK3B2cyB8IG5vdCBncmVwICIkZGV2MiIKK3B2cyAtYSB8IGdyZXAgIiRkZXYyIgorIyBiejExMDgzOTQgbm8gY3Jhc2ggb24gbm9uUFYgbGFiZWwgbGlzdGluZworcHZzIC1hIC1vK2RldmljZXMKKworcHZjcmVhdGUgIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjIiCisKKyMgY2hlY2sgcHZyZW1vdmUgcmVmdXNlcyB0byByZW1vdmUgcHYgaW4gYSB2ZwordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIgorbm90IHB2cmVtb3ZlICIkZGV2MiIgIiRkZXYzIgorCitmb3IgbWRhY3AgaW4gMCAxIDI7IGRvCisgICAgIyBjaGVjayBwdnJlbW92ZSB0cnVseSB3aXBlcyB0aGUgbGFiZWwgKHB2c2NhbiB3b250IGZpbmQpICgtLS1tZXRhZGF0YWNvcGllcyAkbWRhY3ApCisgICAgcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAkbWRhY3AgIiRkZXYzIgorICAgIHB2cmVtb3ZlICIkZGV2MyIKKyAgICAjIHRyeSB0byByZW1vdmUgYWdhaWwgLSBzaG91bGQgZmFpbCBjbGVhbmx5CisgICAgbm90IHB2cmVtb3ZlICIkZGV2MyIKKyAgICBwdnNjYW4gfCBub3QgZ3JlcCAiJGRldjMiCisKKwkjIGJ6MTc5NDczIHJlZnVzZSB0byB3aXBlIG5vbi1QViBkZXZpY2Ugd2l0aG91dCAtZgorICAgIG5vdCBwdnJlbW92ZSAiJGRldjMiCisgICAgcHZyZW1vdmUgLWYgIiRkZXYzIgorCisgICAgIyByZXNldCBzZXR1cAorICAgIHZncmVtb3ZlIC1mZiAkdmcKKyAgICBwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzICRtZGFjcCAiJGRldjEiCisgICAgcHZjcmVhdGUgIiRkZXYyIgorICAgIHZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIKKworICAgICMgcHZyZW1vdmUgLWYgZmFpbHMgd2hlbiBwdiBpbiBhIHZnICgtLS1tZXRhZGF0YWNvcGllcyAkbWRhY3ApCisgICAgbm90IHB2cmVtb3ZlIC1mICIkZGV2MSIgMj4mMSB8IHRlZSBvdXQKKyAgICBncmVwICJpcyB1c2VkIiBvdXQKKyAgICBwdnMgIiRkZXYxIgorCisgICAgIyBwdnJlbW92ZSAtZmYgZmFpbHMgd2l0aG91dCBjb25maXJtYXRpb24gd2hlbiBwdiBpbiBhIHZnICgtLS1tZXRhZGF0YWNvcGllcyAkbWRhY3ApCisgICAgbm90IHB2cmVtb3ZlIC1mZiAiJGRldjEiIDI+JjEgfCB0ZWUgb3V0CisgICAgZ3JlcCAiaXMgdXNlZCIgb3V0CisKKyAgICAjIHB2cmVtb3ZlIC1mZiBzdWNjZWRzIHdpdGggY29uZmlybWF0aW9uIHdoZW4gcHYgaW4gYSB2ZyAoLS0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwKQorICAgIHB2cmVtb3ZlIC1mZnkgIiRkZXYxIiAyPiYxIHwgdGVlIG91dAorICAgIGdyZXAgImlzIHVzZWQiIG91dAorICAgIG5vdCBwdnMgIiRkZXYxIgorCisgICAgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworICAgIHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwICIkZGV2MSIKKyAgICB2Z2V4dGVuZCAkdmcgIiRkZXYxIgorCisgICAgIyBwdnJlbW92ZSAtZmYgLXkgaXMgc3VmZmljaWVudCB3aGVuIHB2IGluIGEgdmcgKC0tLW1ldGFkYXRhY29waWVzICRtZGFjcCkiICcKKyAgICBwdnJlbW92ZSAtZmYgLXkgIiRkZXYxIgorCisgICAgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nICR2ZworICAgIHB2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgJG1kYWNwICIkZGV2MSIKKyAgICB2Z2V4dGVuZCAkdmcgIiRkZXYxIgorZG9uZQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2cmVtb3ZlLXdhcm5pbmdzLnNoIGIvdGVzdC9zaGVsbC9wdnJlbW92ZS13YXJuaW5ncy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI1ZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9wdnJlbW92ZS13YXJuaW5ncy5zaApAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKK3B2Y3JlYXRlICIkZGV2MSIgIiRkZXYyIgorcHZyZW1vdmUgIiRkZXYxIiAiJGRldjIiIDI+JjEgfCB0ZWUgcHZyZW1vdmUudHh0Citub3QgZ3JlcCAiTm8gcGh5c2ljYWwiIHB2cmVtb3ZlLnR4dAorCitwdmNyZWF0ZSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIGJsYSAiJGRldjEiICIkZGV2MiIKK3B2cmVtb3ZlIC1mZiAteSAiJGRldjEiICIkZGV2MiIgMj4mMSB8IHRlZSBwdnJlbW92ZS50eHQKK25vdCBncmVwICJkZXZpY2UgbWlzc2luZyIgcHZyZW1vdmUudHh0CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3B2cmVzaXplLW1kYXMuc2ggYi90ZXN0L3NoZWxsL3B2cmVzaXplLW1kYXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmZGZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvcHZyZXNpemUtbWRhcy5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgMSA4CisKK3B2Y3JlYXRlIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDhtIC0tbWV0YWRhdGFjb3BpZXMgMiAiJGRldjEiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X3NpemUgOC4wMG0KK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50IDIKK3B2cyAiJGRldjEiCisKK3B2cmVzaXplIC0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIDRtICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfc2l6ZSA0LjAwbQorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfY291bnQgMgorcHZzICIkZGV2MSIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvcmVhZC1haGVhZC5zaCBiL3Rlc3Qvc2hlbGwvcmVhZC1haGVhZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRiZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9yZWFkLWFoZWFkLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjCisjIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgcmVhZC1haGVhZCBhbmQgcmEgcmVncmVzc2lvbnMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCByZWFkLWFoZWFkIGZ1bmN0aW9uYWxpdHknCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNQorCisjQ09NTSAidGVzdCB2YXJpb3VzIHJlYWQgYWhlYWQgc2V0dGluZ3MgKGJ6NDUwOTIyKSIKK2x2Y3JlYXRlIC1sIDEwMCVGUkVFIC1pNSAtSTUxMiAtbiAkbHYgJHZnCityYT0kKGdldCBsdl9maWVsZCAkdmcvJGx2IGx2X2tlcm5lbF9yZWFkX2FoZWFkIC0tdW5pdHMgcyAtLW5vc3VmZml4KQordGVzdCAkKCggKCAkcmEgLyA1ICkgKiA1ICkpIC1sZSAkcmEKK25vdCBsdmNoYW5nZSAtciBhdXRvICR2Zy8kbHYgMj4mMSB8IGdyZXAgYXV0bworY2hlY2sgbHZfZmllbGQgJHZnLyRsdiBsdl9yZWFkX2FoZWFkIGF1dG8KK2x2Y2hhbmdlIC1yIDY0MCAkdmcvJGx2CitjaGVjayBsdl9maWVsZCAkdmcvJGx2IGx2X3JlYWRfYWhlYWQgNjQwIC0tdW5pdHMgcyAtLW5vc3VmZml4CitsdnJlbW92ZSAtZmYgJHZnCisKKyNDT01NICJyZWFkIGFoZWFkIGlzIHByb3Blcmx5IGluaGVyaXRlZCBmcm9tIHVuZGVybHlpbmcgUFYiCitibG9ja2RldiAtLXNldHJhIDc2OCAiJGRldjEiCit2Z3NjYW4KK2x2Y3JlYXRlIC1uICRsdiAtTDRtICR2ZyAiJGRldjEiCit0ZXN0ICQoYmxvY2tkZXYgLS1nZXRyYSAiJERNX0RFVl9ESVIvJHZnLyRsdiIpIC1lcSA3NjgKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBDaGVjayBkZWZhdWx0LCBhY3RpdmUvaW5hY3RpdmUgdmFsdWVzIGZvciByZWFkX2FoZWFkIC8ga2VybmVsX3JlYWRfYWhlYWQKK2x2Y3JlYXRlIC1uICRsdiAtbCA1MCVGUkVFICR2ZworbHZjaGFuZ2UgLWFuICR2Zy8kbHYKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgbHZfcmVhZF9haGVhZCBhdXRvCitjaGVjayBsdl9maWVsZCAkdmcvJGx2IGx2X2tlcm5lbF9yZWFkX2FoZWFkIC0xCitsdmNoYW5nZSAtciA1MTIgJHZnLyRsdgorbHZjaGFuZ2UgLWF5ICR2Zy8kbHYKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYgbHZfcmVhZF9haGVhZCAyNTYuMDBrCitjaGVjayBsdl9maWVsZCAkdmcvJGx2IGx2X2tlcm5lbF9yZWFkX2FoZWFkIDI1Ni4wMGsKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9yZXBvcnQtZmllbGRzLnNoIGIvdGVzdC9zaGVsbC9yZXBvcnQtZmllbGRzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDExOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3JlcG9ydC1maWVsZHMuc2gKQEAgLTAsMCArMSw5MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorU0tJUF9XSVRIX0NMVk1EPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBUZXN0IG9ubHkgdGhhdCB0aGVyZSdzIGNvcnJlY3Qgc2V0IG9mIGZpZWxkcyBkaXNwbGF5ZWQgb24gb3V0cHV0LgorCithdXggcHJlcGFyZV9wdnMgMQorCitPUFRTPSItLW5hbWVwcmVmaXhlcyAtLW5vaGVhZGluZ3MgLS1yb3dzIgorCithdXggbHZtY29uZiAncmVwb3J0L3B2c19jb2xzPSJwdl9uYW1lLHB2X3NpemUiJworYXV4IGx2bWNvbmYgJ3JlcG9ydC9jb21wYWN0X291dHB1dD0wJworYXV4IGx2bWNvbmYgJ3JlcG9ydC9jb21wYWN0X291dHB1dF9jb2xzPSIiJworCitwdnMgJE9QVFMgPiBvdXQKK2dyZXAgTFZNMl9QVl9OQU1FIG91dAorZ3JlcCBMVk0yX1BWX1NJWkUgb3V0CisKK3B2cyAkT1BUUyAtbyBwdl9hdHRyID4gb3V0CitncmVwIExWTTJfUFZfQVRUUiBvdXQKK25vdCBncmVwIC12IExWTTJfUFZfQVRUUiBvdXQKKworcHZzICRPUFRTIC1vK3B2X2F0dHIgPiBvdXQKK2dyZXAgTFZNMl9QVl9OQU1FIG91dAorZ3JlcCBMVk0yX1BWX1NJWkUgb3V0CitncmVwIExWTTJfUFZfQVRUUiBvdXQKKworcHZzICRPUFRTIC1vLXB2X25hbWUgPiBvdXQKK25vdCBncmVwIExWTTJfUFZfTkFNRSBvdXQKK2dyZXAgTFZNMl9QVl9TSVpFIG91dAorCitwdnMgJE9QVFMgLW8rcHZfYXR0ciAtby1wdl9hdHRyID4gb3V0CitncmVwIExWTTJfUFZfTkFNRSBvdXQKK2dyZXAgTFZNMl9QVl9TSVpFIG91dAorbm90IGdyZXAgTFZNMl9QVl9BVFRSIG91dAorCitwdnMgJE9QVFMgLW8tcHZfYXR0ciAtbytwdl9hdHRyID4gb3V0CitncmVwIExWTTJfUFZfTkFNRSBvdXQKK2dyZXAgTFZNMl9QVl9TSVpFIG91dAorZ3JlcCBMVk0yX1BWX0FUVFIgb3V0CisKK3B2cyAkT1BUUyAtbytwdl9hdHRyIC1vLXB2X2F0dHIgLW8gcHZfYXR0ciA+IG91dAorZ3JlcCBMVk0yX1BWX0FUVFIgb3V0Citub3QgZ3JlcCAtdiBMVk0yX1BWX0FUVFIgb3V0CisKKyMgLW8tc2l6ZSBpcyB0aGUgc2FtZSBhcyAtby1wdl9zaXplIC0gdGhlIHByZWZpeCBpcyByZWNvZ25pemVkCitwdnMgJE9QVFMgLW8tc2l6ZSA+IG91dAorbm90IGdyZXAgTFZNMl9QVl9TSVpFIG91dAorCisjIFBWIGRvZXMgbm90IGhhdmUgdGFncyBub3IgaXMgaXQgZXhwb3J0ZWQgaWYgd2UgaGF2ZW4ndCBkb25lIHRoYXQgZXhwbGljaXRseS4KKyMgQ2hlY2sgY29tcGFjdGlvbiBwZXIgZmllbGQgaXMgZG9uZSBjb3JyZWN0bHkuCitwdnMgJE9QVFMgLW8gcHZfbmFtZSxwdl9leHBvcnRlZCxwdl90YWdzIC1vI3B2X3RhZ3MgPiBvdXQKK2dyZXAgTFZNMl9QVl9OQU1FIG91dAorZ3JlcCBMVk0yX1BWX0VYUE9SVEVEIG91dAorbm90IGdyZXAgTFZNMl9QVl9UQUdTIG91dAorCithdXggbHZtY29uZiAncmVwb3J0L2NvbXBhY3Rfb3V0cHV0X2NvbHM9InB2X3RhZ3MiJworCitwdnMgJE9QVFMgLW8gcHZfbmFtZSxwdl9leHBvcnRlZCxwdl90YWdzID4gb3V0CitncmVwIExWTTJfUFZfTkFNRSBvdXQKK2dyZXAgTFZNMl9QVl9FWFBPUlRFRCBvdXQKK25vdCBncmVwIExWTTJfUFZfVEFHUyBvdXQKKworcHZzICRPUFRTIC1vIHB2X25hbWUscHZfZXhwb3J0ZWQscHZfdGFncyAtbyNwdl9leHBvcnRlZCA+IG91dAorZ3JlcCBMVk0yX1BWX05BTUUgb3V0Citub3QgZ3JlcCBMVk0yX1BWX0VYUE9SVEVEIG91dAorZ3JlcCBMVk0yX1BWX1RBR1Mgb3V0CisKK2F1eCBsdm1jb25mICdyZXBvcnQvY29tcGFjdF9vdXRwdXQ9MScKK3B2cyAkT1BUUyAtbyBwdl9uYW1lLHB2X2V4cG9ydGVkLHB2X3RhZ3MgPiBvdXQKK2dyZXAgTFZNMl9QVl9OQU1FIG91dAorbm90IGdyZXAgTFZNMl9QVl9FWFBPUlRFRCBvdXQKK25vdCBncmVwIExWTTJfUFZfVEFHUyBvdXQKKworcHZzICRPUFRTIC1vIHB2X25hbWUscHZfZXhwb3J0ZWQscHZfdGFncyAtbyNwdl9leHBvcnRlZCA+IG91dAorZ3JlcCBMVk0yX1BWX05BTUUgb3V0Citub3QgZ3JlcCBMVk0yX1BWX0VYUE9SVEVEIG91dAorbm90IGdyZXAgTFZNMl9QVl9UQUdTIG91dApkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9yZXBvcnQtaGlkZGVuLnNoIGIvdGVzdC9zaGVsbC9yZXBvcnQtaGlkZGVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDc0NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3JlcG9ydC1oaWRkZW4uc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNRVRBRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMQorbHZjcmVhdGUgLS10eXBlIG1pcnJvciAtbTEgLWwxIC0tYWxsb2MgYW55d2hlcmUgLW4gJGx2MSAkdmcKKworYXV4IGx2bWNvbmYgJ2xvZy9wcmVmaXg9IiInCisKK2F1eCBsdm1jb25mICJyZXBvcnQvbWFya19oaWRkZW5fZGV2aWNlcyA9IDAiCitsdnMgLS1ub2hlYWRpbmdzIC1hIC1vIG5hbWUgJHZnID4gb3V0CitncmVwICJeJHtsdjF9X21pbWFnZV8wIiBvdXQKK25vdCBncmVwICJeXFske2x2MX1fbWltYWdlXzBcXSIgb3V0CisKK2F1eCBsdm1jb25mICJyZXBvcnQvbWFya19oaWRkZW5fZGV2aWNlcyA9IDEiCitsdnMgLS1ub2hlYWRpbmdzIC1hIC1vIG5hbWUgJHZnID4gb3V0CitncmVwICJeXFske2x2MX1fbWltYWdlXzBcXSIgb3V0Citub3QgZ3JlcCAiXiR7bHYxfV9taW1hZ2VfMCIgb3V0CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvc2VsZWN0LXJlcG9ydC5zaCBiL3Rlc3Qvc2hlbGwvc2VsZWN0LXJlcG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzljZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zZWxlY3QtcmVwb3J0LnNoCkBAIC0wLDAgKzEsMjIwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDYgMTYKKworIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorIyBNQUtFIFNVUkUgQUxMIFBWLCBWRyBBTkQgTFYgTkFNRVMgQ1JFQVRFRCBJTgorIyBUSElTIFRFU1QgQVJFIFVOSVFVRSAtIFRISVMgU0lNUExJRklFUyBURVNUSU5HCisjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyMgY3JlYXRlICRWR1Mgd2l0aCBhc3NvcnRlZCB0YWdzCit2Z2NyZWF0ZSAkdmcxIC0tdmdtZXRhZGF0YWNvcGllcyAyIC0tYWRkdGFnICJ2Z190YWczIiAtLWFkZHRhZyAidmdfdGFnMiIgLXMgNG0gIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK3ZnY3JlYXRlICR2ZzIgLS1hZGR0YWcgInZnX3RhZzIiIC1zIDRtICIkZGV2NCIgIiRkZXY1IgordmdjcmVhdGUgJHZnMyAtLWFkZHRhZyAidmdfdGFnMSIgLXMgNG0gIiRkZXY2IgorCisjIGFkZCBQViBhc3NvcnRlZCB0YWdzCitwdmNoYW5nZSAtLWFkZHRhZyAicHZfdGFnMyIgLS1hZGR0YWcgInB2X3RhZzEiIC0tYWRkdGFnICJwdl90YWcyIiAiJGRldjEiCitwdmNoYW5nZSAtLWFkZHRhZyAicHZfdGFnMSIgLS1hZGR0YWcgInB2X3RhZzQiICIkZGV2NiIKKworIyBjcmVhdGUgJExWUyB3aXRoIGFzc29ydGVkIHRhZ3MgYW5kIHZhcmlvdXMgc2l6ZXMKK2x2Y3JlYXRlIC0tYWRkdGFnICdsdl90YWcyLi0rLz0hOiYjJyAtLWFkZHRhZyAibHZfdGFnMSIgLUw4bSAtbiAidm9sMSIgJHZnMQorbHZjcmVhdGUgLS1hZGR0YWcgImx2X3RhZzEiIC1MNG0gLW4gInZvbDIiICR2ZzEKK2x2Y3JlYXRlIC0tcmVhZGFoZWFkIDUxMiAtLWFkZHRhZyAibHZfdGFnMSIgLUwxNm0gLW4gImFiYyIgJHZnMgorbHZjcmVhdGUgLS1yZWFkYWhlYWQgNTEyIC1NeSAtLW1pbm9yIDI1NCAtTDRtIC1uICJ4eXoiICR2ZzMKK2x2Y3JlYXRlIC1MNG0gLWFleSAtbiAib3JpZyIgJHZnMworbHZjcmVhdGUgLUw0bSAtcyAiJHZnMy9vcmlnIiAtbiAic25hcCIKKworT1VUX0xPR19GSUxFPSJvdXQiCitFUlJfTE9HX0ZJTEU9ImVyciIKKworc2VsKCkgeworCWxvY2FsIGl0ZW1zX2ZvdW5kCisKKwkkezF9cyAtLW5vaGVhZGluZ3MgLW8gJHsxfV9uYW1lIC0tc2VsZWN0ICIkMiIgMj4iJEVSUl9MT0dfRklMRSIgfCB0ZWUgIiRPVVRfTE9HX0ZJTEUiCisgICAgICAgIHNoaWZ0IDIKKworCXRlc3QgLWYgIiRPVVRfTE9HX0ZJTEUiIHx8IHsKKwkJZWNobyAiICA+Pj4gTWlzc2luZyBsb2cgZmlsZSB0byBjaGVjayEiCisJCXJldHVybiAxCisJfQorCisJIyB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IHNlbGVjdGlvbiBzeW50YXggZXJyb3IKKwlncmVwICJTZWxlY3Rpb24gc3ludGF4IGVycm9yIGF0IiAiJEVSUl9MT0dfRklMRSIgPi9kZXYvbnVsbCAmJiB7CisJCWVjaG8gIiAgPj4+IFNlbGVjdGlvbiBzeW50YXggZXJyb3IgaGl0ISIKKwkJcmV0dXJuIDEKKwl9CisKKwlpdGVtc19mb3VuZD0kKHdjIC1sICIkT1VUX0xPR19GSUxFIiB8IGN1dCAtZiAxIC1kICcgJykKKworCSMgdGhlIG51bWJlciBvZiBsaW5lcyBvbiBvdXRwdXQgbXVzdCBtYXRjaAorCXRlc3QgIiRpdGVtc19mb3VuZCIgLWVxICQjIHx8IHsKKwkJZWNobyAiICA+Pj4gTlVNQkVSIE9GIElURU1TIEVYUEVDVEVEOiAkIyAoJEApIgorCQllY2hvICIgID4+PiBOVU1CRVIgT0YgSVRFTVMgRk9VTkQ6ICRpdGVtc19mb3VuZCAoJCg8ICRPVVRfTE9HX0ZJTEUpKSIKKwkJcmV0dXJuIDEKKwl9CisKKwkjIHRoZSBuYW1lcyBzZWxlY3RlZCBtdXN0IGJlIGNvcnJlY3QKKwkjIGVhY2ggcHYsIHZnIGFuZCBsdiBuYW1lIGlzIHVuaXF1ZSBzbyBqdXN0IGNoZWNrCisJIyB0aGUgcHJlc2VuY2Ugb2YgdGhlIG5hbWVzIGdpdmVuIGFzIGFyZworCWZvciBuYW1lIGluICIkQCIgOyBkbworCQlncmVwICIkbmFtZSIgIiRPVVRfTE9HX0ZJTEUiID4vZGV2L251bGwgfHwgeworCQkJZWNobyAiICA+Pj4gJG5hbWUgbm90IGZvdW5kIGluIHRoZSBvdXRwdXQgbG9nIgorCQkJcmV0dXJuIDEKKwkJfQorCWRvbmUKKworCXJtIC1mICIkT1VUX0xPR19GSUxFIiAiJEVSUl9MT0dfRklMRSIKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU1RSSU5HIEZJRUxEIFNFTEVDVElPTiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyRMVlMgJ2x2X25hbWU9InZvbDEiJyAmJiByZXN1bHQgdm9sMQorc2VsIGx2ICdsdl9uYW1lPSJ2b2wxIicgdm9sMQorIyRMVlMgJ2x2X25hbWUhPSJ2b2wxIicgJiYgcmVzdWx0IHZvbDIgYWJjIHh5egorc2VsIGx2ICdsdl9uYW1lIT0idm9sMSInIHZvbDIgYWJjIHh5eiBvcmlnIHNuYXAKKyMgY2hlY2sgc3RyaW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQgd2l0aG91dCBxdW90ZXMgdG9vCitzZWwgbHYgJ2x2X25hbWU9dm9sMScgdm9sMQorIyBjaGVjayBzaW5nbGUgcXVvdGVzIGFyZSBhbHNvIGFjY2VwdGVkIGluc3RlYWQgb2YgZG91YmxlIHF1b3Rlcworc2VsIGx2ICJsdl9uYW1lPSd2b2wxJyIgdm9sMQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNUUklORyBMSVNUIEZJRUxEIFNFTEVDVElPTiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzZWwgcHYgJ3RhZ3M9WyJwdl90YWcxIl0nCisjIGZvciBvbmUgaXRlbSwgbm8gbmVlZCB0byB1c2UgW10KK3NlbCBwdiAndGFncz0icHZfdGFnMSInICIkZGV2MSIgIiRkZXY2IgorIyBubyBtYXRjaAorc2VsIHB2ICd0YWdzPVsicHZfdGFnMSIgJiYgInB2X3RhZzIiXScKK3NlbCBwdiAndGFncz1bInB2X3RhZzEiICYmICJwdl90YWcyIiAmJiAicHZfdGFnMyJdJyAiJGRldjEiCisjIGNoZWNrIHRoZSBvcmRlciBoYXMgbm8gZWZmZWN0IG9uIHNlbGVjdGlvbiByZXN1bHQKK3NlbCBwdiAndGFncz1bInB2X3RhZzMiICYmICJwdl90YWcyIiAmJiAicHZfdGFnMSJdJyAiJGRldjEiCitzZWwgcHYgJ3RhZ3M9WyJwdl90YWc0IiB8fCAicHZfdGFnMyJdJyAiJGRldjEiICIkZGV2NiIKK3NlbCBwdiAndGFncyE9WyJwdl90YWcxIl0nICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IiAiJGRldjYiCisjIGNoZWNrIG1peHR1cmUgb2YgJiYgYW5kIHx8IC0gdGhpcyBpcyBub3QgYWxsb3dlZAorbm90IHNlbCBwdiAndGFncz1bInB2X3RhZzEiICYmICJwdl90YWcyIiB8fCAicHZfdGFnMyJdJworIyBjaGVjayBzZWxlY3Rpb24gd2l0aCBibGFuayB2YWx1ZQorc2VsIGx2ICd0YWdzPSIiJyB4eXogb3JpZyBzbmFwCitzZWwgbHYgJ3RhZ3M9e30nIHh5eiBvcmlnIHNuYXAKK3NlbCBsdiAndGFncz1bXScgeHl6IG9yaWcgc25hcAorIyBjaGVjayBzdWJzZXQgc2VsZWN0aW9uCitzZWwgcHYgJ3RhZ3M9eyJwdl90YWcxIn0nICIkZGV2MSIgIiRkZXY2Igorc2VsIHB2ICd0YWdzPXsicHZfdGFnMSIgJiYgInB2X3RhZzIifScgIiRkZXYxIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOVU1CRVIgRklFTEQgU0VMRUNUSU9OICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzZWwgdmcgJ3B2X2NvdW50PTMnICR2ZzEKK3NlbCB2ZyAncHZfY291bnQhPTMnICR2ZzMgJHZnMgorc2VsIHZnICdwdl9jb3VudDwyJyAkdmczCitzZWwgdmcgJ3B2X2NvdW50PD0yJyAkdmczICR2ZzIKK3NlbCB2ZyAncHZfY291bnQ+MicgJHZnMQorc2VsIHZnICdwdl9jb3VudD49MicgJHZnMSAkdmcyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTSVpFIEZJRUxEIFNFTEVDVElPTiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2hlY2sgc2l6ZSB1bml0cyBhcmUgYWNjZXB0ZWQgYXMgd2VsbCBhcyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGZvciBzaXplcworc2VsIGx2ICdzaXplPTgzODg2MDhiJyB2b2wxCitzZWwgbHYgJ3NpemU9ODE5MmsnIHZvbDEKK3NlbCBsdiAnc2l6ZT04bScgdm9sMQorc2VsIGx2ICdzaXplPTguMDBtJyB2b2wxCitzZWwgbHYgJ3NpemU9MC4wMDc4MTI1Zycgdm9sMQorc2VsIGx2ICdzaXplPTAuMDAwMDA3NjI5Mzk0NTMxMjV0JyB2b2wxCitzZWwgbHYgJ3NpemU9MC4wMDAwMDAwMDc0NTA1ODA1OTY5MjM4MjgxMjVwJyB2b2wxCitzZWwgbHYgJ3NpemU9MC4wMDAwMDAwMDAwMDcyNzU5NTc2MTQxODM0MjU5MDMzMjAzMTI1ZScgdm9sMQorCitzZWwgbHYgJ3NpemU+OG0nIGFiYworc2VsIGx2ICdzaXplPj04bScgYWJjIHZvbDEKK3NlbCBsdiAnc2l6ZTw4bScgdm9sMiB4eXogb3JpZyBzbmFwCitzZWwgbHYgJ3NpemU8PThtJyB2b2wyIHh5eiB2b2wxIG9yaWcgc25hcAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUEVSQ0VOVCBGSUVMRCBTRUxFQ1RJT04gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiBhdXggdGFyZ2V0X2F0X2xlYXN0IGRtLXNuYXBzaG90IDEgMTAgMDsgdGhlbgorCSMgVGVzdCB6ZXJvIHBlcmNlbnQgb25seSBpZiBzbmFwc2hvdCBjYW4gYmUgemVyby4KKwkjIEJlZm9yZSAxLjEwLjAsIHRoZSBzbmFwIHBlcmNlbnQgaW5jbHVkZWQgbWV0YWRhdGEgc2l6ZS4KKwlzZWwgbHYgJ3NuYXBfcGVyY2VudD0wJyBzbmFwCitmaQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi8kdmczL3NuYXAiIGJzPTFNIGNvdW50PTEgY29udj1mZGF0YXN5bmMKK3NlbCBsdiAnc25hcF9wZXJjZW50PDUwJyBzbmFwCitzZWwgbHYgJ3NuYXBfcGVyY2VudD41MCcKKyMgb3ZlcmZsb3cgc25hcHNob3QgLT4gaW52YWxpZGF0ZWQsIGJ1dCBzdGlsbCBzaG93aW5nIDEwMCUKK25vdCBkZCBpZj0vZGV2L3plcm8gb2Y9IiRETV9ERVZfRElSLyR2ZzMvc25hcCIgYnM9MU0gY291bnQ9NCBjb252PWZkYXRhc3luYworc2VsIGx2ICdzbmFwX3BlcmNlbnQ9MTAwJyBzbmFwCisjICUgY2hhciBpcyBhY2NlcHRlZCBhcyBzdWZmaXggZm9yIHBlcmNlbnQgdmFsdWVzCitzZWwgbHYgJ3NuYXBfcGVyY2VudD0xMDAlJyBzbmFwCisjIHBlcmNlbnQgdmFsdWVzIG92ZXIgMTAwJSBhcmUgbm90IGFjY2VwdGVkCitub3Qgc2VsIGx2ICdzbmFwX3BlcmNlbnQ9MTAxJScKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSRUdFWCBGSUVMRCBTRUxFQ1RJT04gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc2VsIGx2ICdsdl9uYW1lPX4iXnZvbFsxMl0iJyB2b2wxIHZvbDIKK3NlbCBsdiAnbHZfbmFtZSF+Il52b2xbMTJdIicgYWJjIHh5eiBvcmlnIHNuYXAKKyMgY2hlY2sgcmVnZXggaXMgYWNjZXB0ZWQgd2l0aG91dCBxdW90ZXMgdG9vCitzZWwgbHYgJ2x2X25hbWU9fl52b2xbMTJdJyB2b2wxIHZvbDIKKworIyMjIyMjIyMjIyMKKyMgR0VORVJJQyAjCisjIyMjIyMjIyMjIworIyBjaGVjayBwcmVmaXggd29ya3MgZm9yIHNlbGVjdGlvbiB0b28KK3NlbCBsdiAnbHZfbmFtZT0idm9sMSInIHZvbDEKK3NlbCBsdiAnbmFtZT0idm9sMSInIHZvbDEKKworIyBjaGVjayByZXNlcnZlZCB2YWx1ZXMgYXJlIGFjY2VwdGVkIGZvciBjZXJ0YWluIGZpZWxkcyBhcyB3ZWxsIGFzIHVzdWFsIHZhbHVlcworc2VsIHZnICd2Z19tZGFfY29waWVzPXVubWFuYWdlZCcgJHZnMiAkdmczCitzZWwgdmcgJ3ZnX21kYV9jb3BpZXM9MicgJHZnMQorIyBhbHNvLCB3ZSBtdXN0IG1hdGNoIG9ubHkgdmcxLCBub3QgaW5jbHVkaW5nIHZnMiBhbmQgdmczCisjIHdoZW4gY29tcGFyaW5nIHJhbmdlcyAtIHVuYW1hbmdlZCBpcyBtYXBwZWQgb250byAyXjY0IC0gMSBpbnRlcm5hbGx5LAorIyBzbyB3ZSBuZWVkIHRvIHNraXAgdGhpcyBpbnRlcm5hbCB2YWx1ZSBpZiBpdCBtYXRjaGVzIHdpdGggc2VsZWN0aW9uIGNyaXRlcmlhIQorc2VsIHZnICd2Z19tZGFfY29waWVzPj0yJyAkdmcxCitub3Qgc2VsIHZnICd2Z19tZGFfY29waWVzPTE4NDQ2NzQ0MDczNzA5NTUxNjE1JworCitzZWwgbHYgJ2x2X3JlYWRfYWhlYWQ9YXV0bycgdm9sMSB2b2wyIG9yaWcgc25hcAorc2VsIGx2ICdsdl9yZWFkX2FoZWFkPTI1NmsnIGFiYyB4eXoKKworc2VsIGx2ICdsdl9taW5vcj0tMScgdm9sMSB2b2wyIGFiYyBvcmlnIHNuYXAKK3NlbCBsdiAnbHZfbWlub3I9dW5kZWZpbmVkJyB2b2wxIHZvbDIgYWJjIG9yaWcgc25hcAorc2VsIGx2ICdsdl9taW5vcj11bmRlZicgdm9sMSB2b2wyIGFiYyBvcmlnIHNuYXAKK3NlbCBsdiAnbHZfbWlub3I9dW5rbm93bicgdm9sMSB2b2wyIGFiYyBvcmlnIHNuYXAKK3NlbCBsdiAnbHZfbWlub3I9MjU0JyB4eXoKKyMgYWxzbyB0ZXN0IHN5bm9ueW0gZm9yIHN0cmluZyBmaWVsZCB0eXBlCitzZWwgbHYgJ3NlZ19tb25pdG9yPXVuZGVmaW5lZCcgdm9sMSB2b2wyIGFiYyBhYmMgb3JpZyBzbmFwIHh5egorCisjIGlmIHNpemUgdW5pdCBub3Qgc3BlZmllZCwgdGhlICdtJyAoTWlCKSB1bml0IGlzIHVzZWQgYnkgZGVmYXVsdAorc2VsIGx2ICdsdl9zaXplPTgnIHZvbDEKKworIyBubyBuZWVkIHRvIHVzZSBxdW90ZXMgZm9yIHRoZSB3aG9sZSBzZWxlY3Rpb24gc3RyaW5nIGlmIGl0IGRvZXMgbm90IGNsYXNoIHdpdGggc2hlbGwKK3NlbCBsdiBuYW1lPXZvbDEgdm9sMQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRk9STUlORyBNT1JFIENPTVBMRVggU0VMRUNUSU9OIENMQVVTRVMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFORCBjbGF1c2UKK3NlbCBsdiAnbHZfdGFncz1sdl90YWcxICYmIGx2X3NpemU9NG0nIHZvbDIKKyMgT1IgY2xhdXNlCitzZWwgbHYgJ2x2X25hbWU9dm9sMSB8fCBsdl9uYW1lPXZvbDInIHZvbDEgdm9sMgorIyBncm91cGluZyBieSB1c2luZyAoICkKK3NlbCBsdiAnKGx2X25hbWU9dm9sMSB8fCBsdl9uYW1lPXZvbDIpIHx8IHZnX3RhZ3M9dmdfdGFnMScgdm9sMSB2b2wyIG9yaWcgc25hcCB4eXoKK3NlbCBsdiAnKGx2X25hbWU9dm9sMSAmJiBsdl9zaXplPTEwMG0pIHx8IHZnX3RhZ3M9dmdfdGFnMScgeHl6IG9yaWcgc25hcAorc2VsIGx2ICcobHZfbmFtZT12b2wxIHx8IGx2X25hbWU9dm9sMikgJiYgdmdfdGFncz12Z190YWcxJworc2VsIGx2ICcobHZfbmFtZT12b2wxIHx8IGx2X25hbWU9dm9sMikgJiYgbHZfc2l6ZSA8IDhtJyB2b2wyCitzZWwgbHYgJyhsdl9uYW1lPXZvbDEgJiYgbHZfc2l6ZT04bSkgJiYgdmdfdGFncz12Z190YWcyJyB2b2wxCisjIG5lZ2F0aW9uIG9mIGNsYXVzZSBncm91cGVkIGJ5ICggKQorc2VsIGx2ICchKGx2X25hbWU9dm9sMSB8fCBsdl9uYW1lPXZvbDIpJyBhYmMgeHl6IG9yaWcgc25hcApkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zZWxlY3QtdG9vbHMtdGhpbi5zaCBiL3Rlc3Qvc2hlbGwvc2VsZWN0LXRvb2xzLXRoaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3MDE5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc2VsZWN0LXRvb2xzLXRoaW4uc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgMSAxNgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNwZWNpYWwgY2FzZXMgdG8gdGVzdCAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgaWYgY2FsbGluZyBsdnJlbW92ZSBhbmQgYW4gTFYgaXMgcmVtb3ZlZCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3RoZXIgTFYKKyMgYW5kIHdlJ3JlIGRvaW5nIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGlzIHJlbGF0aW9uLCBjaGVjayBpZiB3ZSdyZQorIyBzZWxlY3Rpbmcgb24gaW5pdGlhbCBzdGF0ZSAoaGVyZSwgdGhpbiBvcmlnaW4gTFYgdGhpbl9vcmlnIGlzIHJlbW92ZWQKKyMgZmlyc3QsIGJ1dCB0aGluIHNuYXAgc2hvdWxkIGJlIHN0aWxsIHNlbGVjdGFibGUgYmFzZWQgb24gb3JpZ2luPXRoaW5fb3JpZworIyBjb25kaXRpb24gZXZlbiB0aG91Z2ggdGhpbl9vcmlnIGhhcyBqdXN0IGJlZW4gcmVtb3ZlZCkKK3ZnY3JlYXRlIC1zIDRtICR2ZzEgIiRkZXYxIgorbHZjcmVhdGUgLWwxMDAlRlJFRSAtVCAkdmcxL3Bvb2wKK2x2Y3JlYXRlIC1WNG0gLVQgJHZnMS9wb29sIC1uIHRoaW5fb3JpZworbHZjcmVhdGUgLXMgJHZnMS90aGluX29yaWcgLW4gdGhpbl9zbmFwCitsdnJlbW92ZSAtZmYgLVMgJ2x2X25hbWU9dGhpbl9vcmlnIHx8IG9yaWdpbj10aGluX29yaWcnID4gb3V0CitncmVwICJMb2dpY2FsIHZvbHVtZSBcInRoaW5fb3JpZ1wiIHN1Y2Nlc3NmdWxseSByZW1vdmVkIiBvdXQKK2dyZXAgIkxvZ2ljYWwgdm9sdW1lIFwidGhpbl9zbmFwXCIgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQiIG91dAorbm90IGx2cyAkdmcxL3RoaW5fb3JpZworbm90IGx2cyAkdmcxL3RoaW5fc25hcAorCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zZWxlY3QtdG9vbHMuc2ggYi90ZXN0L3NoZWxsL3NlbGVjdC10b29scy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg1Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zZWxlY3QtdG9vbHMuc2gKQEAgLTAsMCArMSwyNzkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfcHZzIDQgMTIKKwordmdjcmVhdGUgLXMgNG0gJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1zIDRtICR2ZzIgIiRkZXYzIiAiJGRldjQiCisKKyMgdmcxL2x2MSBtYXBwZWQgb250byBkZXYxCitsdmNyZWF0ZSAtbDEgLW4gImx2MSIgJHZnMSAiJGRldjEiCisKKyMgdmcxL2x2MiBtYXBwZWQgb250byBkZXYxIGFuZCBkZXYyICgyIHNlZ21lbnRzKQorbHZjcmVhdGUgLWwzIC1uICJsdjIiICR2ZzEgIiRkZXYxIiAiJGRldjIiCisKKyMgdmcyL2x2MyBtYXBwZWQgb250byBkZXYzCitsdmNyZWF0ZSAtbDEgLW4gImx2MyIgJHZnMiAiJGRldjMiCisKKyMgdmcyL2x2NCBtYXBwZWQgb250byBkZXYzCitsdmNyZWF0ZSAtbDEgLW4gImx2NCIgJHZnMiAiJGRldjMiICIkZGV2NCIKKworIyB2ZzIvbHYxIG1hcHBlZCBvbnRvICIkZGV2NCIgKHNhbWUgTFYgbmFtZSBhcyB2ZzEvbHYxKQorbHZjcmVhdGUgLWwxIC1uICJsdjEiICR2ZzIgIiRkZXY0IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGV4ZXJjaXNlIHByb2Nlc3NfZWFjaF92ZyB3aXRoIHNlbGVjdGlvbiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgc2VsZWN0IGNvbnRhaW5zIFZHUyBmaWVsZAorIyBkaXJlY3QgdmcgbmFtZSBtYXRjaAordmdjaGFuZ2UgLS1hZGR0YWcgMTAxIC1TICJ2Z19uYW1lPSR2ZzEiCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgMTAxCitub3QgY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzIDEwMQordmdjaGFuZ2UgLS1kZWx0YWcgMTAxCisKKyMgc2VsZWN0IGNvbnRhaW5zIExWUyBmaWVscwordmdjaGFuZ2UgLS1hZGR0YWcgMTAyIC1TICJsdl9uYW1lPWx2MiIKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfdGFncyAxMDIKK25vdCBjaGVjayB2Z19maWVsZCAkdmcyIHZnX3RhZ3MgMTAyCit2Z2NoYW5nZSAtLWRlbHRhZyAxMDIKK3ZnY2hhbmdlIC0tYWRkdGFnIDEwMyAtUyAibHZfbmFtZT1sdjEiCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgMTAzCitjaGVjayB2Z19maWVsZCAkdmcyIHZnX3RhZ3MgMTAzCit2Z2NoYW5nZSAtLWRlbHRhZyAxMDMKKworIyBzZWxlY3QgY29udGFpbnMgU0VHUyBmaWVsZAordmdjaGFuZ2UgLS1hZGR0YWcgMTA0IC1TICdzZWdfc3RhcnQ9OG0nCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgMTA0Citub3QgY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzIDEwNAordmdjaGFuZ2UgLS1kZWx0YWcgMTA0Cit2Z2NoYW5nZSAtLWFkZHRhZyAxMDUgLVMgInNlZ19zdGFydD0wbSIKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfdGFncyAxMDUKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfdGFncyAxMDUKK3ZnY2hhbmdlIC0tZGVsdGFnIDEwNQorCisjIHNlbGVjdCBjb250YWlucyBQVlMgZmllbGQKK3ZnY2hhbmdlIC0tYWRkdGFnIDEwNiAtUyAicHZfbmFtZT0iJGRldjEiIgorY2hlY2sgdmdfZmllbGQgJHZnMSB2Z190YWdzIDEwNgorbm90IGNoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfdGFncyAxMDYKK3ZnY2hhbmdlIC0tZGVsdGFnIDEwNgordmdjaGFuZ2UgLS1hZGR0YWcgMTA3IC1TICJwdl9zaXplPjBtIgorY2hlY2sgdmdfZmllbGQgJHZnMSB2Z190YWdzIDEwNworY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzIDEwNwordmdjaGFuZ2UgLS1kZWx0YWcgMTA3CisKKyMgc2VsZWN0IGNvbnRhaW5zIFBWU0VHUyBmaWVsZAordmdjaGFuZ2UgLS1hZGR0YWcgMTA4IC1TICJwdnNlZ19zaXplPTIiCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgMTA4Citub3QgY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzIDEwOAordmdjaGFuZ2UgLS1kZWx0YWcgMTA4Cit2Z2NoYW5nZSAtLWFkZHRhZyAxMDkgLVMgInB2c2VnX3NpemU9MSIKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfdGFncyAxMDkKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfdGFncyAxMDkKK3ZnY2hhbmdlIC0tZGVsdGFnIDEwOQorCisjIGlmIFZHIG5hbWUgb3IgdGFnIGlzIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggdGhlCisjIHNlbGVjdGlvbiwgdGhlIHJlc3VsdCBpcyBhbiBpbnRlcnNlY3Rpb24gb2YgYm90aAordmdjaGFuZ2UgLS1hZGR0YWcgMTEwIC1TICJ2Z19uYW1lPSR2ZzEiICR2ZzIKK25vdCBjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgMTEwCitub3QgY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzIDExMAordmdjaGFuZ2UgLS1kZWx0YWcgMTEwCit2Z2NoYW5nZSAtLWFkZHRhZyAxMTEgLVMgInZnX25hbWU9JHZnMSIgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSB2Z190YWdzIDExMQorbm90IGNoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfdGFncyAxMTEKK3ZnY2hhbmdlIC0tZGVsdGFnIDExMQordmdjaGFuZ2UgLS1hZGR0YWcgInRhZyIgJHZnMQordmdjaGFuZ2UgLS1hZGR0YWcgMTEyIC1TICJ2Z19uYW1lPSR2ZzIiIEB0YWcKK25vdCBjaGVjayB2Z19maWVsZCAkdmcxIHZnX3RhZ3MgInRhZywxMTIiCitub3QgY2hlY2sgdmdfZmllbGQgJHZnMiB2Z190YWdzICJ0YWcsMTEyIgordmdjaGFuZ2UgLS1kZWx0YWcgMTEyCit2Z2NoYW5nZSAtLWFkZHRhZyAxMTMgLVMgInZnX25hbWU9JHZnMSIgQHRhZworY2hlY2sgdmdfZmllbGQgJHZnMSB2Z190YWdzICIxMTMsdGFnIgorbm90IGNoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfdGFncyAiMTEzLHRhZyIKK3ZnY2hhbmdlIC0tZGVsdGFnIDExMyAtLWRlbHRhZyB0YWcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBleGVyY2lzZSBwcm9jZXNzX2VhY2hfbHYgd2l0aCBzZWxlY3Rpb24gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNlbGVjdCBjb250YWlucyBWR1MgZmllbGQKK2x2Y2hhbmdlIC0tYWRkdGFnIDIwMSAtUyAidmdfbmFtZT0kdmcxIgorY2hlY2sgbHZfZmllbGQgJHZnMS9sdjEgbHZfdGFncyAyMDEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvbHYyIGx2X3RhZ3MgMjAxCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjMgbHZfdGFncyAyMDEKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2NCBsdl90YWdzIDIwMQorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHYxIGx2X3RhZ3MgMjAxCitsdmNoYW5nZSAtLWRlbHRhZyAyMDEgJHZnMSAkdmcyCisKKyMgc2VsZWN0IGNvbnRhaW5zIExWUyBmaWVscworbHZjaGFuZ2UgLS1hZGR0YWcgMjAyIC1TICJsdl9uYW1lPWx2MiIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcxL2x2MSBsdl90YWdzIDIwMgorY2hlY2sgbHZfZmllbGQgJHZnMS9sdjIgbHZfdGFncyAyMDIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2MyBsdl90YWdzIDIwMgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHY0IGx2X3RhZ3MgMjAyCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjEgbHZfdGFncyAyMDIKK2x2Y2hhbmdlIC0tZGVsdGFnIDIwMiAkdmcxICR2ZzIKK2x2Y2hhbmdlIC0tYWRkdGFnIDIwMyAtUyAibHZfbmFtZT1sdjEiCitjaGVjayBsdl9maWVsZCAkdmcxL2x2MSBsdl90YWdzIDIwMworbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzEvbHYyIGx2X3RhZ3MgMjAzCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjMgbHZfdGFncyAyMDMKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2NCBsdl90YWdzIDIwMworY2hlY2sgbHZfZmllbGQgJHZnMi9sdjEgbHZfdGFncyAyMDMKK2x2Y2hhbmdlIC0tZGVsdGFnIDIwMyAkdmcxICR2ZzIKKworIyBzZWxlY3QgY29udGFpbnMgU0VHUyBmaWVsZAorbHZjaGFuZ2UgLS1hZGR0YWcgMjA0IC1TICJzZWdfc3RhcnQ9OG0iCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMS9sdjEgbHZfdGFncyAyMDQKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvbHYyIGx2X3RhZ3MgMjA0Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjMgbHZfdGFncyAyMDQKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2NCBsdl90YWdzIDIwNAorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHYxIGx2X3RhZ3MgMjA0CitsdmNoYW5nZSAtLWRlbHRhZyAyMDQgJHZnMSAkdmcyCisKKyMgc2VsZWN0IGNvbnRhaW5zIFBWUyBmaWVsZCAtIENPTUJJTkFUSU9OIE5PVCBBTExPV0VEIQorbHZjaGFuZ2UgLS1hZGR0YWcgMjA1IC1TIHB2X25hbWU9IiRkZXYxIiAyPmVycgorZ3JlcCAiQ2FuJ3QgcmVwb3J0IExWIGFuZCBQViBmaWVsZHMgYXQgdGhlIHNhbWUgdGltZSIgZXJyCitncmVwICJTZWxlY3Rpb24gZmFpbGVkIGZvciBMViIgZXJyCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMS9sdjEgbHZfdGFncyAyMDUKK25vdCBjaGVjayBsdl9maWVsZCAkdmcxL2x2MiBsdl90YWdzIDIwNQorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHYzIGx2X3RhZ3MgMjA1Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjQgbHZfdGFncyAyMDUKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2MSBsdl90YWdzIDIwNQorCisjIHNlbGVjdCBjb250YWlucyBQVlNFR1MgZmllbGQgLSBDT01CSU5BVElPTiBOT1QgQUxMT1dFRCEKK2x2Y2hhbmdlIC0tYWRkdGFnIDIwNiAtUyAicHZzZWdfc3RhcnQ+PTAiIDI+ZXJyCitncmVwICJDYW4ndCByZXBvcnQgTFYgYW5kIFBWIGZpZWxkcyBhdCB0aGUgc2FtZSB0aW1lIiBlcnIKK2dyZXAgIlNlbGVjdGlvbiBmYWlsZWQgZm9yIExWIiBlcnIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcxL2x2MSBsdl90YWdzIDIwNgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzEvbHYyIGx2X3RhZ3MgMjA2Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjMgbHZfdGFncyAyMDYKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2NCBsdl90YWdzIDIwNgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHYxIGx2X3RhZ3MgMjA2CisKKyMgaWYgTFYgbmFtZSBvciB0YWcgaXMgc3VwcGxpZWQgdG9nZXRoZXIgd2l0aCB0aGUKKyMgc2VsZWN0aW9uLCB0aGUgcmVzdWx0IGlzIGFuIGludGVyc2VjdGlvbiBvZiBib3RoCitsdmNoYW5nZSAtLWFkZHRhZyAyMDcgLVMgImx2X25hbWU9bHYyIiAkdmcxL2x2MQorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzEvbHYxIGx2X3RhZ3MgMjA3Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMS9sdjIgbHZfdGFncyAyMDcKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2MyBsdl90YWdzIDIwNworbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHY0IGx2X3RhZ3MgMjA3Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjEgbHZfdGFncyAyMDcKK2x2Y2hhbmdlIC0tZGVsdGFnIDIwNyAkdmcxICR2ZzIKK2x2Y2hhbmdlIC0tYWRkdGFnIDIwOCAtUyAibHZfbmFtZT1sdjIiICR2ZzEvbHYyCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMS9sdjEgbHZfdGFncyAyMDgKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvbHYyIGx2X3RhZ3MgMjA4Citub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjMgbHZfdGFncyAyMDgKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2NCBsdl90YWdzIDIwOAorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHYxIGx2X3RhZ3MgMjA4CitsdmNoYW5nZSAtLWRlbHRhZyAyMDggJHZnMSAkdmcyCitsdmNoYW5nZSAtLWFkZHRhZyAidGFnIiAkdmcxL2x2MgorbHZjaGFuZ2UgLS1hZGR0YWcgMjA5IC1TICJsdl9uYW1lPWx2MyIgQHRhZworbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzEvbHYxIGx2X3RhZ3MgIjIwOSx0YWciCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMS9sdjIgbHZfdGFncyAiMjA5LHRhZyIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2MyBsdl90YWdzICIyMDksdGFnIgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHY0IGx2X3RhZ3MgIjIwOSx0YWciCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjEgbHZfdGFncyAiMjA5LHRhZyIKK2x2Y2hhbmdlIC0tZGVsdGFnIDIwOSAkdmcxICR2ZzIKK2x2Y2hhbmdlIC0tYWRkdGFnIDIxMCAtUyAibHZfbmFtZT1sdjIiIEB0YWcKK25vdCBjaGVjayBsdl9maWVsZCAkdmcxL2x2MSBsdl90YWdzICIyMTAsdGFnIgorY2hlY2sgbHZfZmllbGQgJHZnMS9sdjIgbHZfdGFncyAiMjEwLHRhZyIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcyL2x2MyBsdl90YWdzICIyMTAsdGFnIgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzIvbHY0IGx2X3RhZ3MgIjIxMCx0YWciCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMi9sdjEgbHZfdGFncyAiMjEwLHRhZyIKK2x2Y2hhbmdlIC0tZGVsdGFnIDIxMCAtLWRlbHRhZyB0YWcgJHZnMSAkdmcyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZXhlcmNpc2UgcHJvY2Vzc19lYWNoX3B2IHdpdGggc2VsZWN0aW9uICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBzZWxlY3QgY29udGFpbnMgVkdTIGZpZWxkCitwdmNoYW5nZSAtLWFkZHRhZyAzMDEgLVMgInZnX25hbWU9JHZnMSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAzMDEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfdGFncyAzMDEKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3RhZ3MgMzAxCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl90YWdzIDMwMQorcHZjaGFuZ2UgLWEgLS1kZWx0YWcgMzAxCisKKyMgc2VsZWN0IGNvbnRhaW5zIExWUyBmaWVsZAorcHZjaGFuZ2UgLS1hZGR0YWcgMzAyIC1TICJsdl9uYW1lPWx2MiIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAzMDIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfdGFncyAzMDIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3RhZ3MgMzAyCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl90YWdzIDMwMgorcHZjaGFuZ2UgLWEgLS1kZWx0YWcgMzAyCisKKyMgc2VsZWN0IGNvbnRhaW5zIFNFR1MgZmllbGQKK3B2Y2hhbmdlIC0tYWRkdGFnIDMwMyAtUyAic2VnX3N0YXJ0PThtIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl90YWdzIDMwMworbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfdGFncyAzMDMKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3RhZ3MgMzAzCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl90YWdzIDMwMworcHZjaGFuZ2UgLWEgLS1kZWx0YWcgMzAzCisKKyMgc2VsZWN0IGNvbnRhaW5zIFBWUyBmaWVsZAorcHZjaGFuZ2UgLS1hZGR0YWcgMzA0IC1TIHB2X25hbWU9IiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl90YWdzIDMwNAorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfdGFncyAzMDQKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjMiIHB2X3RhZ3MgMzA0Citub3QgY2hlY2sgcHZfZmllbGQgIiRkZXY0IiBwdl90YWdzIDMwNAorcHZjaGFuZ2UgLWEgLS1kZWx0YWcgMzA0CisKKyMgc2VsZWN0IGNvbnRhaW5zIFBWU0VHUyBmaWVsZAorcHZjaGFuZ2UgLS1hZGR0YWcgMzA1IC1TICJwdnNlZ19zaXplPTIiCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl90YWdzIDMwNQorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl90YWdzIDMwNQorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfdGFncyAzMDUKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3RhZ3MgMzA1CitwdmNoYW5nZSAtYSAtLWRlbHRhZyAzMDUKKworIyBpZiBQViBuYW1lIG9yIHRhZyBpcyBzdXBwbGllZCB0b2dldGhlciB3aXRoIHRoZQorIyBzZWxlY3Rpb24sIHRoZSByZXN1bHQgaXMgYW4gaW50ZXJzZWN0aW9uIG9mIGJvdGgKK3B2Y2hhbmdlIC0tYWRkdGFnIDMwNiAtUyBwdl9uYW1lPSIkZGV2MSIgIiRkZXYyIgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAzMDYKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3RhZ3MgMzA2Citub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl90YWdzIDMwNgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfdGFncyAzMDYKK3B2Y2hhbmdlIC1hIC0tZGVsdGFnIDMwNgorcHZjaGFuZ2UgLS1hZGR0YWcgMzA3IC1TIHB2X25hbWU9IiRkZXYxIiAiJGRldjEiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X3RhZ3MgMzA3Citub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl90YWdzIDMwNworbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MyIgcHZfdGFncyAzMDcKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjQiIHB2X3RhZ3MgMzA3CitwdmNoYW5nZSAtYSAtLWRlbHRhZyAzMDcKK3B2Y2hhbmdlIC0tYWRkdGFnICJ0YWciICIkZGV2MSIKK3B2Y2hhbmdlIC0tYWRkdGFnIDMwOCAtUyBwdl9uYW1lPSIkZGV2MiIgQHRhZworbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAiMzA4LHRhZyIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3RhZ3MgIjMwOCx0YWciCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl90YWdzICIzMDgsdGFnIgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfdGFncyAiMzA4LHRhZyIKK3B2Y2hhbmdlIC0tZGVsdGFnIDMwOCAiJGRldjEiCitwdmNoYW5nZSAtLWFkZHRhZyAzMDkgLVMgcHZfbmFtZT0iJGRldjEiIEB0YWcKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfdGFncyAiMzA5LHRhZyIKK25vdCBjaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X3RhZ3MgIjMwOSx0YWciCitub3QgY2hlY2sgcHZfZmllbGQgIiRkZXYzIiBwdl90YWdzICIzMDksdGFnIgorbm90IGNoZWNrIHB2X2ZpZWxkICIkZGV2NCIgcHZfdGFncyAiMzA5LHRhZyIKK3B2Y2hhbmdlIC1hIC0tZGVsdGFnIDMwOSAtLWRlbHRhZyB0YWcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzcGVjaWFsIGNhc2VzIHRvIHRlc3QgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGlmIGNhbGxpbmcgdmdyZW1vdmUsIG1ha2Ugc3VyZSB3ZSdyZSBkb2luZyBzZWxlY3Rpb24gcGVyLVZHLCBub3QgcGVyLUxWCisjICh2Z3JlbW92ZSBjYWxscyBwcm9jZXNzX2VhY2hfdmcgd2l0aCB2Z3JlbW92ZV9zaW5nbGUgd2hpY2ggaXRzZWxmCisjIGl0ZXJhdGVzIG92ZXIgTFZzIHdpdGggcHJvY2Vzc19lYWNoX2x2X2luX3ZnIC0gc28gaW50ZXJuYWxseSBpdCBhY3R1YWxseQorIyBvcGVyYXRlcyBwZXItTFYsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRoZSBzZWxlY3Rpb24gdG8gYmUgZG9uZSBwZXItVkcpCit2Z3JlbW92ZSAtLXllcyAtUyAnbHZfbmFtZT1sdjInICMgc2hvdWxkIHJlbW92ZSB3aG9sZSB2ZzEsIG5vdCBqdXN0IHRoZSBsdjIKK3ZncmVtb3ZlIC0teWVzICR2ZzIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvc25hcHNob3QtYXV0b3Vtb3VudC1kbWV2ZW50ZC5zaCBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtYXV0b3Vtb3VudC1kbWV2ZW50ZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY3ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zbmFwc2hvdC1hdXRvdW1vdW50LWRtZXZlbnRkLnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBubyBhdXRvbWF0aWMgZXh0ZW5zaW9ucyBwbGVhc2UKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MiB8fCBza2lwCisKK2F1eCBsdm1jb25mICJhY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudCA9IDAiIFwKKyAgICAgICAgICAgICJhY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfdGhyZXNob2xkID0gMTAwIgorCithdXggcHJlcGFyZV9kbWV2ZW50ZAorYXV4IHByZXBhcmVfdmcgMgorbW50ZGlyPSIke1BSRUZJWH1tbnQiCisKK2x2Y3JlYXRlIC1hZXkgLUw4IC1uIGJhc2UgJHZnCitta2ZzLmV4dDIgIiRETV9ERVZfRElSLyR2Zy9iYXNlIgorCitsdmNyZWF0ZSAtcyAtTDQgLW4gc25hcCAkdmcvYmFzZQorbHZjaGFuZ2UgLS1tb25pdG9yIHkgJHZnL3NuYXAKKworbWtkaXIgIiRtbnRkaXIiCisjIFVzZSByZW1vdW50LXJvICB0byBhdm9pZCBsb2dnaW5nIGtlcm5lbCBXQVJOSU5HCittb3VudCAtbyBlcnJvcnM9cmVtb3VudC1ybyAiJERNX0RFVl9ESVIvbWFwcGVyLyR2Zy1zbmFwIiAiJG1udGRpciIKKwordGVzdCAkKGRtc2V0dXAgaW5mbyAtYyAtLW5vaGVhZGluZ3MgLW8gb3BlbiAkdmctc25hcCkgLWVxIDEKKworY2F0IC9wcm9jL21vdW50cyB8IGdyZXAgIiRtbnRkaXIiCisKKyMgb3ZlcmZpbGwgNE0gc25hcHNob3QgKHdpdGggbWV0YWRhdGEpCitub3QgZGQgaWY9L2Rldi96ZXJvIG9mPSIkbW50ZGlyL2ZpbGUkMSIgYnM9MU0gY291bnQ9NCBjb252PWZkYXRhc3luYworCisjIFNob3VsZCBiZSBuZWFybHkgaW5zdGFudCBjaGVjayBvZiBkbWV2ZW50ZCBmb3IgaW52YWxpZCBzbmFwc2hvdC4KKyMgV2FpdCBoZXJlIGZvciB1bW91bnQgYW5kIG9wZW5fY291bnQgZHJvcHMgdG8gMCBhcyBpdCBtYXkKKyMgdGFrZSBhIHdoaWxlIHRvIGZpbmFsaXplIHVtb3VudCBvcGVyYXRpb24gKGl0IG1pZ2h0IGJlIGFscmVhZHkKKyMgcmVtb3ZlZCBmcm9tIC9wcm9jL21vdW50cywgYnV0IHN0aWxsIG9wZW5lZCkuCitmb3IgaSBpbiB7MS4uMTAwfTsgZG8KKwlzbGVlcCAuMQorCXRlc3QgJChkbXNldHVwIGluZm8gLWMgLS1ub2hlYWRpbmdzIC1vIG9wZW4gJHZnLXNuYXApIC1lcSAwICYmIGJyZWFrCitkb25lCisKK2NhdCAvcHJvYy9tb3VudHMgfCBub3QgZ3JlcCAiJG1udGRpciIKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90LWNsdXN0ZXIuc2ggYi90ZXN0L3NoZWxsL3NuYXBzaG90LWNsdXN0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkNWZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtY2x1c3Rlci5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0aW5nIHJlbmFtaW5nIHNuYXBzaG90cyBpbiBjbHVzdGVyCisjIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTEzNjkyNQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMQorCitsdmNyZWF0ZSAtYWV5IC1MMSAtbiAkbHYxICR2ZworbHZjcmVhdGUgLXMgLUwxIC1uICRsdjIgJHZnLyRsdjEKK2x2cmVuYW1lICAkdmcvJGx2MiAkdmcvJGx2MworbHZyZW1vdmUgLWYgJHZnLyRsdjEKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90LWx2bTEuc2ggYi90ZXN0L3NoZWxsL3NuYXBzaG90LWx2bTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxMjExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtbHZtMS5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyByZWdyZXNzaW9uIHRlc3QgZm9yIGx2bWV0YWQgcmVwb3J0aW5nIGVycm9yOgorIyBJbnRlcm5hbCBlcnJvcjogTFYgc25hcF93aXRoX2x2bTFfbWV0YSAoMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpIG1pc3NpbmcgZnJvbSBwcmVsb2FkIG1ldGFkYXRhCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKKwordmdjcmVhdGUgLS1tZXRhZGF0YXR5cGUgMSAkdmcgJChjYXQgREVWSUNFUykKKworIyBNYWtlIG9yaWdpbiB2b2x1bWUKK2x2Y3JlYXRlIC1hZSAtbDUgJHZnIC1uIG9yaWdpbgorCisjIENyZWF0ZSBhIHNuYXAgb2Ygb3JpZ2luCitsdmNyZWF0ZSAtcyAkdmcvb3JpZ2luIC1uIHNuYXBfd2l0aF9sdm0xX21ldGEgLWw0CisKKyMgUmVtb3ZlIHZvbHVtZSBzbmFwcGVyL3NuYXBfd2l0aF9sdm0xX21ldGEKK2x2cmVtb3ZlIC1mICR2Zy9zbmFwX3dpdGhfbHZtMV9tZXRhCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvc25hcHNob3QtbWF4c2l6ZS5zaCBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtbWF4c2l6ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUwOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zbmFwc2hvdC1tYXhzaXplLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3RpbmcgY2FsY3VsYXRpb24gb2Ygc25hcHNob3Qgc3BhY2UKKyMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMDM1ODcxCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgMQorCit2Z2NyZWF0ZSAtcyAxSyAkdmcgJChjYXQgREVWSUNFUykKKworbHZjcmVhdGUgLWFleSAtTDEgLW4gJGx2MSAkdmcKKyMgU25hcHNob3Qgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0byBoYW5kbGUgYW55IHdyaXRlcworbHZjcmVhdGUgLUwyIC1zICR2Zy8kbHYxIC1uICRsdjIKKworZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi8kdmcvJGx2MiIgYnM9MU0gY291bnQ9MSBjb252PWZkYXRhc3luYworCisjIFNuYXBzaG90IG11c3Qgbm90IGJlICdJJ252YWxpZCBoZXJlCitjaGVjayBsdl9hdHRyX2JpdCBzdGF0ZSAkdmcvJGx2MiAiYSIKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90LW1lcmdlLXN0YWNrLnNoIGIvdGVzdC9zaGVsbC9zbmFwc2hvdC1tZXJnZS1zdGFjay5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ5Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zbmFwc2hvdC1tZXJnZS1zdGFjay5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBFeGVyY2lzZSBzbmFwc2hvdCBtZXJnZSBhbHNvIHdoZW4gc3RhY2tlZAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBta2ZzLmV4dDMgfHwgc2tpcAorCithdXggdGFyZ2V0X2F0X2xlYXN0IGRtLXNuYXBzaG90LW1lcmdlIDEgMCAwIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgMiAxMDAKKworc25hcF9hbmRfbWVyZ2UoKSB7CisJbHZjcmVhdGUgLXMgLW4gJGx2MiAtTDIwICR2Zy8kbHYxICIkZGV2MiIKKwkjZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi8kdmcvJGx2MSIgYnM9MU0gY291bnQ9MTAgY29udj1mZGF0YXN5bmMKKwlta2ZzLmV4dDMgIiRETV9ERVZfRElSLyR2Zy8kbHYyIgorCXN5bmMKKwlsdnMgLWEgJHZnCisKKwkjIGtlZXAgZGV2aWNlIG9wZW4gdG8gcHJldmVudCBpbnN0YW50IG1lcmdlCisJc2xlZXAgMjAgPCAiJERNX0RFVl9ESVIvJHZnLyRsdjEiICYKKwlTTEVFUF9QSUQ9JCEKKworCSMgaW5pdGlhdGUgYmFja2dyb3VuZCBtZXJnZQorCWx2Y29udmVydCAtYiAtLW1lcmdlICR2Zy8kbHYyCisKKwlsdnMgLWEgLW8rbHZfbWVyZ2luZyxsdl9tZXJnZV9mYWlsZWQgJHZnCisJa2lsbCAkU0xFRVBfUElECisKKwlhdXggZGVsYXlfZGV2ICIkZGV2MSIgIDAgMjAwICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYxIik6CisJbHZjaGFuZ2UgLS1yZWZyZXNoICR2Zy8kbHYxCisJZG1zZXR1cCB0YWJsZQorCWx2cyAtYSAtbytsdl9tZXJnaW5nLGx2X21lcmdlX2ZhaWxlZCAkdmcKKwlzbGVlcCAxCisJY2hlY2sgbHZfYXR0cl9iaXQgc3RhdGUgJHZnLyRsdjEgImEiCisJY2hlY2sgbHZfYXR0cl9iaXQgc3RhdGUgJHZnLyRsdjIgImEiCisJYXV4IGVycm9yX2RldiAiJGRldjIiICQoZ2V0IGZpcnN0X2V4dGVudF9zZWN0b3IgIiRkZXYyIik6CisJIyBkZWxheSB0byBsZXQgc25hcHNob3QgbWVyZ2UgJ2Rpc2NvdmVyJyBmYWlsaW5nIENPVyBkZXZpY2UKKwlzbGVlcCAxCisJc3luYworCWRtc2V0dXAgc3RhdHVzCisJbHZzIC1hIC1vK2x2X21lcmdpbmcsbHZfbWVyZ2VfZmFpbGVkICR2ZworCWNoZWNrIGx2X2F0dHJfYml0IHN0YXRlICR2Zy8kbHYxICJtIgorCWNoZWNrIGx2X2F0dHJfYml0IHN0YXRlICR2Zy8kbHYyICJtIgorCisJIyBkZXZpY2UgT0sgYW5kIHJ1bm5pbmcgaW4gZnVsbCBzcGVlZAorCWF1eCBlbmFibGVfZGV2ICIkZGV2MSIgIiRkZXYyIgorCisJIyByZWFjdGl2YXRlIHNvIG1lcmdlIGNhbiBmaW5pc2gKKwlsdmNoYW5nZSAtYW4gJHZnCisJbHZjaGFuZ2UgLWF5ICR2ZworCXNsZWVwIDEKKwlsdnMgLWEgLW8rbHZfbWVyZ2luZyxsdl9tZXJnZV9mYWlsZWQgJHZnCisJY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgJGx2MgorCWZzY2sgLW4gIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorCisJbHZyZW1vdmUgLWYgJHZnCit9CisKKworIyBGaXJzdCBjaGVjayBtZXJnZSBvbiBwbGFpbiBsaW5lYXIgTFYKK2x2Y3JlYXRlIC1hZXkgLUw1MCAtbiAkbHYxICR2ZyAiJGRldjEiCitzbmFwX2FuZF9tZXJnZQorCisjIFdoZW4gYXZhaWxhYmxlIGNoZWNrIG1lcmdlIG9mIG9sZCBzbmFwc2hvdCB3aXRoIFRoaW4gTFYgYmVpbmcgb3JpZ2luCitpZiBhdXggaGF2ZV90aGluIDEgMCAwIDsgdGhlbgorCWx2Y3JlYXRlIC1UIC1MMTAgLVY1MCAtbiAkbHYxICR2Zy9wb29sICIkZGV2MSIKKwlzbmFwX2FuZF9tZXJnZQorZmkKKworIyBUT0RPIHNuYXBzaG90IG1lcmdlIHdpdGggTWlycm9yLCBSYWlkLCBDYWNoZS4uLgorCit2Z3JlbW92ZSAtZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvc25hcHNob3QtbWVyZ2Uuc2ggYi90ZXN0L3NoZWxsL3NuYXBzaG90LW1lcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDFkMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3NuYXBzaG90LW1lcmdlLnNoCkBAIC0wLDAgKzEsMTI2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCisuIGxpYi9pbml0dGVzdAorCisjIHRlc3QgaWYgc25hcHNob3QtbWVyZ2UgdGFyZ2V0IGlzIGF2YWlsYWJsZQorYXV4IHRhcmdldF9hdF9sZWFzdCBkbS1zbmFwc2hvdC1tZXJnZSAxIDAgMCB8fCBza2lwCisKK3doaWNoIG1rZnMuZXh0MyB8fCBza2lwCisKK2x2ZGV2XygpIHsKKyAgICBlY2hvICIkRE1fREVWX0RJUi8kMS8kMiIKK30KKworc25hcF9sdl9uYW1lXygpIHsKKyAgICBlY2hvICR7MX1fc25hcAorfQorCitzZXR1cF9tZXJnZV8oKSB7CisgICAgbG9jYWwgVkdfTkFNRT0kMQorICAgIGxvY2FsIExWX05BTUU9JDIKKyAgICBsb2NhbCBOVU1fRVhUUkFfU05BUFM9JHszOi0wfQorICAgIGxvY2FsIEJBU0VfU05BUF9MVl9OQU1FCisKKyAgICBCQVNFX1NOQVBfTFZfTkFNRT0kKHNuYXBfbHZfbmFtZV8gJExWX05BTUUpCisKKyAgICBsdmNyZWF0ZSAtYWV5IC1uICRMVl9OQU1FIC1sIDUwJUZSRUUgJFZHX05BTUUKKyAgICBsdmNyZWF0ZSAtcyAtbiAkQkFTRV9TTkFQX0xWX05BTUUgLWwgMjAlRlJFRSAke1ZHX05BTUV9LyR7TFZfTkFNRX0KKyAgICBta2ZzLmV4dDMgIiQobHZkZXZfICRWR19OQU1FICRMVl9OQU1FKSIKKworICAgIGlmIFsgJE5VTV9FWFRSQV9TTkFQUyAtZ3QgMCBdOyB0aGVuCisJZm9yIGkgaW4gJChzZXEgMSAkTlVNX0VYVFJBX1NOQVBTKTsgZG8KKwkgICAgbHZjcmVhdGUgLXMgLW4gJHtCQVNFX1NOQVBfTFZfTkFNRX1fJHtpfSAtbCAyMCVPUklHSU4gJHtWR19OQU1FfS8ke0xWX05BTUV9CisJZG9uZQorICAgIGZpCit9CisKK2F1eCBwcmVwYXJlX3ZnIDEgMTAwCitta2RpciB0ZXN0X21udAorCisjIHRlc3QgZnVsbCBtZXJnZSBvZiBhIHNpbmdsZSBMVgorc2V0dXBfbWVyZ2VfICR2ZyAkbHYxCisKKyMgbWFrZSBzdXJlIGx2Y29udmVydCAtLW1lcmdlIHJlcXVpcmVzIGV4cGxpY2l0IExWIGxpc3RpbmcKK25vdCBsdmNvbnZlcnQgLS1tZXJnZQorbHZjb252ZXJ0IC0tbWVyZ2UgJHZnLyQoc25hcF9sdl9uYW1lXyAkbHYxKQorbHZyZW1vdmUgLWYgJHZnLyRsdjEKKworCisjIHRlc3QgdGhhdCBhbiBhY3RpdmVseSBtZXJnaW5nIHNuYXBzaG90IG1heSBub3QgYmUgcmVtb3ZlZAorc2V0dXBfbWVyZ2VfICR2ZyAkbHYxCitsdmNvbnZlcnQgLWkrMTAwIC0tbWVyZ2UgLS1iYWNrZ3JvdW5kICR2Zy8kKHNuYXBfbHZfbmFtZV8gJGx2MSkKK25vdCBsdnJlbW92ZSAtZiAkdmcvJChzbmFwX2x2X25hbWVfICRsdjEpCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCisKKyMgIm9uYWN0aXZhdGUgbWVyZ2UiIHRlc3QKK3NldHVwX21lcmdlXyAkdmcgJGx2MQorbW91bnQgIiQobHZkZXZfICR2ZyAkbHYxKSIgdGVzdF9tbnQKK2x2Y29udmVydCAtLW1lcmdlICR2Zy8kKHNuYXBfbHZfbmFtZV8gJGx2MSkKKyMgLS0gcmVmcmVzaCBMViB3aGlsZSBGUyBpcyBzdGlsbCBtb3VudGVkIChtZXJnZSBtdXN0IG5vdCBzdGFydCksCisjICAgIHZlcmlmeSAnc25hcHNob3Qtb3JpZ2luJyB0YXJnZXQgaXMgc3RpbGwgYmVpbmcgdXNlZAorbHZjaGFuZ2UgLS1yZWZyZXNoICR2Zy8kbHYxCit1bW91bnQgdGVzdF9tbnQKK2RtX3RhYmxlICR2Zy0kbHYxIHwgZ3JlcCAiIHNuYXBzaG90LW9yaWdpbiAiCisKKyMgLS0gcmVmcmVzaCBMViB0byBzdGFydCBtZXJnZSAobm93IHRoYXQgRlMgaXMgdW5tb3VudGVkKSwKKyMgICAgYW4gYWN0aXZlIG1lcmdlIHVzZXMgdGhlICdzbmFwc2hvdC1tZXJnZScgdGFyZ2V0CitsdmNoYW5nZSAtLXJlZnJlc2ggJHZnLyRsdjEKKyMgY2hlY2sgd2hldGhlciBpdCdzIHN0aWxsIG1lcmdpbmcgLSBvciBtYXliZSBnb3QgYWxyZWFkeSBtZXJnZWQgKHNsb3cgdGVzdCkKK2RtX3RhYmxlICR2Zy0kbHYxIHwgZ3JlcCAiIHNuYXBzaG90LW1lcmdlICIgfHwgZG1fdGFibGUgJHZnLSRsdjEgfCBncmVwICIgbGluZWFyICIKKyMgLS0gZG9uJ3QgY2FyZSBpZiBtZXJnZSBpcyBzdGlsbCBhY3RpdmU7IGx2cmVtb3ZlIGF0IHRoaXMgcG9pbnQKKyMgICAgbWF5IHRlc3Qgc3RvcHBpbmcgYW4gYWN0aXZlIG1lcmdlCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCisjICJvbmFjdGl2YXRlIG1lcmdlIiB0ZXN0CisjIC0tIGRlYWN0aXZhdGUvcmVtb3ZlIGFmdGVyIGRpc2FsbG93ZWQgbWVyZ2UgYXR0ZW1wdCwgdGVzdHMKKyMgICAgdG8gbWFrZSBzdXJlIHByZWxvYWQgb2Ygb3JpZ2luJ3MgbWV0YWRhdGEgaXMgX25vdF8gcGVyZm9ybWVkCitzZXR1cF9tZXJnZV8gJHZnICRsdjEKK21vdW50ICIkKGx2ZGV2XyAkdmcgJGx2MSkiIHRlc3RfbW50CitsdmNvbnZlcnQgLS1tZXJnZSAkdmcvJChzbmFwX2x2X25hbWVfICRsdjEpCisjIC0tIHJlZnJlc2ggTFYgd2hpbGUgRlMgaXMgc3RpbGwgbW91bnRlZCAobWVyZ2UgbXVzdCBub3Qgc3RhcnQpLAorIyAgICB2ZXJpZnkgJ3NuYXBzaG90LW9yaWdpbicgdGFyZ2V0IGlzIHN0aWxsIGJlaW5nIHVzZWQKK2x2Y2hhbmdlIC0tcmVmcmVzaCAkdmcvJGx2MQordW1vdW50IHRlc3RfbW50CitkbV90YWJsZSAkdmctJGx2MSB8IGdyZXAgIiBzbmFwc2hvdC1vcmlnaW4gIiA+L2Rldi9udWxsCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCisKKyMgdGVzdCBtdWx0aXBsZSBzbmFwc2hvdCBtZXJnZTsgdGVzdHMgY29weSBvdXQgdGhhdCBpcyBkcml2ZW4gYnkgbWVyZ2UKK3NldHVwX21lcmdlXyAkdmcgJGx2MSAxCitsdmNvbnZlcnQgLS1tZXJnZSAkdmcvJChzbmFwX2x2X25hbWVfICRsdjEpCitsdnJlbW92ZSAtZiAkdmcvJGx2MQorCisKKyMgdGVzdCBtZXJnaW5nIG11bHRpcGxlIHNuYXBzaG90cyB0aGF0IHNoYXJlIHRoZSBzYW1lIHRhZworc2V0dXBfbWVyZ2VfICR2ZyAkbHYxCitzZXR1cF9tZXJnZV8gJHZnICRsdjIKK2x2Y2hhbmdlIC0tYWRkdGFnIHRoaXNfaXNfYV90ZXN0ICR2Zy8kKHNuYXBfbHZfbmFtZV8gJGx2MSkKK2x2Y2hhbmdlIC0tYWRkdGFnIHRoaXNfaXNfYV90ZXN0ICR2Zy8kKHNuYXBfbHZfbmFtZV8gJGx2MikKK2x2Y29udmVydCAtLW1lcmdlIEB0aGlzX2lzX2FfdGVzdAorbHZzICR2ZyB8IHRlZSBvdXQKK25vdCBncmVwICQoc25hcF9sdl9uYW1lXyAkbHYxKSBvdXQKK25vdCBncmVwICQoc25hcF9sdl9uYW1lXyAkbHYyKSBvdXQKK2x2cmVtb3ZlIC1mICR2Zy8kbHYxICR2Zy8kbHYyCisKKyMgRklYTUUgZm9sbG93aW5nIHRlc3RzIHdvdWxkIG5lZWQgdG8gcG9sbCBtZXJnZSBwcm9ncmVzcywgdmlhIHBlcmlvZGljIGx2cz8KKyMgQmFja2dyb3VuZCBwcm9jZXNzZXMgZG9uJ3QgbGVuZCB0aGVtc2VsdmVzIHRvIGx2bSB0ZXN0c3VpdGUuLi4KKworIyB0ZXN0OiBvbmFjdGl2YXRlIG1lcmdlIG9mIGEgc2luZ2xlIGx2CisKKyMgdGVzdDogZG8gb25hY3RpdmF0ZSwgZGVhY3RpdmF0ZSB0aGUgb3JpZ2luIExWLCByZWFjdGl2YXRlIHRoZSBMViwgbWVyZ2Ugc2hvdWxkIHJlc3VtZQorCisjIHRlc3Q6IG11bHRpcGxlIG9uYWN0aXZhdGUgbWVyZ2UKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90LXJlYWN0aXZhdGUuc2ggYi90ZXN0L3NoZWxsL3NuYXBzaG90LXJlYWN0aXZhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkZjFmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtcmVhY3RpdmF0ZS5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIworIyBDaGVja2luZyBjb25zaXN0ZW5jeSBvZiBvbGQtc25hcHNob3QgbWV0YWRhdGEgYWZ0ZXIgZGUvYWN0aXZhdGlvbgorIyBWYWxpZGF0ZXMgcmVjZW50IHNuYXBzaG90IHRhcmdldCBrZXJuZWwgdXBkYXRlcyBhbmQgZXJyb3IKKyMgaXMgdHJpZ2dlcmVkIGJ5IGtlcm5lbCAzLjE0LXJjWzEuLjVdCisjIGh0dHA6Ly93d3cucmVkaGF0LmNvbS9hcmNoaXZlcy9kbS1kZXZlbC8yMDE0LU1hcmNoL21zZzAwMDA1Lmh0bWwKKyMKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKKyMgU25hcHNob3Qgc2hvdWxkIHJlbWFpbiB1bm1vZGlmaWVkCitjaGVja19zXygpIHsKKwljaGVjayBkZXZfbWQ1c3VtICR2ZyBzCisJI2RpZmYgZGF0YSAiJERNX0RFVl9ESVIvJHZnL3MiCit9CisKK3doaWNoIG1kNXN1bSB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnCisKKyMgOE0gZmlsZSB3aXRoIHNvbWUgcmFuZG9tIGRhdGEKK2RkIGlmPS9kZXYvdXJhbmRvbSBvZj1kYXRhIGJzPTFNIGNvdW50PTEgY29udj1mZGF0YXN5bmMKK2RkIGlmPWRhdGEgb2Y9ZGF0YSBicz0xTSBjb3VudD03IHNlZWs9MSBjb252PWZkYXRhc3luYworZWNobyAiJChtZDVzdW0gZGF0YSB8IGN1dCAtZCcgJyAtZjEpICAkRE1fREVWX0RJUi8kdmcvcyIgPm1kNS4ke3ZnfS1zCisKK2x2Y3JlYXRlIC1hZXkgLUwgOE0gLW4gbyAkdmcKK2RkIGlmPWRhdGEgb2Y9IiRETV9ERVZfRElSLyR2Zy9vIiBicz0xTSBjb252PWZkYXRhc3luYworCitsdmNyZWF0ZSAtTCA4TSAtcyAtbiBzICR2Zy9vCitjaGVja19zXworCitkZCBpZj1kYXRhIG9mPSIkRE1fREVWX0RJUi8kdmcvbyIgYnM9MTIzNDU2NyBjb3VudD0xIHNraXA9MSBjb252PWZkYXRhc3luYworY2hlY2tfc18KK2x2Y2hhbmdlIC1hbiAkdmcKKworbHZjaGFuZ2UgLWF5ICR2ZworY2hlY2tfc18KKworZGQgaWY9ZGF0YSBvZj0iJERNX0RFVl9ESVIvJHZnL28iIGJzPTEyMzQ1NjcgY291bnQ9MiBza2lwPTEgY29udj1mZGF0YXN5bmMKK2NoZWNrX3NfCisKK2x2Y2hhbmdlIC1hbiAkdmcKK2x2Y2hhbmdlIC1heSAkdmcKK2NoZWNrX3NfCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zbmFwc2hvdC1yZW1vdmUtZG1zZXR1cC5zaCBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtcmVtb3ZlLWRtc2V0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5ZGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtcmVtb3ZlLWRtc2V0dXAuc2gKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgY2hlY2sgaWYgJ2Rtc2V0dXAgLS1ub2ZsdXNoJyB3aWxsIHdvcmsgcHJvcGVybHkgZm9yIG1vdW50ZWQgc25hcHNob3QKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9DTFZNRD0xCitTS0lQX1dJVEhfTFZNRVRBRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCit3aGljaCBta2ZzLmV4dDIgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyA1CisKKyMgQ3JlYXRlIHN0YWNrZWQgZGV2aWNlCitsdmNyZWF0ZSAtLXR5cGUgc25hcHNob3QgLXMgLUwxMCAtbiAkbHYxICR2ZyAtLXZpcnR1YWxzaXplIDEwME0KK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKK3ZnY3JlYXRlICR2ZzEgIiRETV9ERVZfRElSIi8kdmcvJGx2MQorCisKK2x2Y3JlYXRlIC1MMjAgLW4gJGx2MSAkdmcxCitsdmNyZWF0ZSAtTDEwIC1uIHNuYXAgLXMgJHZnMS8kbHYxCisKK21rZnMuZXh0MiAiJERNX0RFVl9ESVIvJHZnMS9zbmFwIgorbWtkaXIgbW50Cittb3VudCAtbyBlcnJvcnM9cmVtb3VudC1ybyAiJERNX0RFVl9ESVIvJHZnMS9zbmFwIiBtbnQKKworc3luYworCisjIGludGVudGlvbmFsbHkgc3VzcGVuZCBsYXllciBiZWxvdworZG1zZXR1cCBzdXNwZW5kICR2Zy0kbHYxCisKKyMgbm93IHRoaXMgc2hvdWxkIHBhc3Mgd2l0aG91dCBibG9ja2luZworZG1zZXR1cCBzdXNwZW5kIC0tbm9mbHVzaCAtLW5vbG9ja2ZzICR2ZzEtc25hcCAmCisjZG1zZXR1cCBzdXNwZW5kICR2ZzEtc25hcCAmCisKK3NsZWVwIC41CisKK2Rtc2V0dXAgaW5mbyAtLW5vaGVhZGluZ3MgLWMgLW8gc3VzcGVuZGVkICR2ZzEtc25hcCB8IHRlZSBvdXQKK3Nob3VsZCBncmVwIC1pIHN1c3BlbmQgb3V0CisKKyMgdW5sb2NrIGRldmljZSBiZWxvdworZG1zZXR1cCByZXN1bWUgJHZnLSRsdjEKKyMgc28gdGhpcyB3aWxsIHBhc3Mgd2l0aG91dCBibG9ja2luZyBvbiB1ZGV2CisjIG90aGVyd2lzZSAtLW5vdWRldnN5bmMgd291bGQgYmUgbmVlZGVkCitkbXNldHVwIHJlc3VtZSAkdmcxLXNuYXAKKworCisjIFRyeSBob3cgZm9yY2UgcmVtb3ZhbCB3b3JrcworZG1zZXR1cCBzdXNwZW5kICR2Zy0kbHYxCisjIG5lZWRzIHRvIGZhaWwgYXMgZGV2aWNlIGlzIHN0aWxsIG9wZW4KK25vdCBkbXNldHVwIHJlbW92ZSAtLWZvcmNlICR2ZzEtc25hcCAmCisKK3NsZWVwIC41CisKK2Rtc2V0dXAgdGFibGUgJHZnMS1zbmFwIHwgdGVlIG91dAorc2hvdWxkIGdyZXAgLWkgZXJyb3Igb3V0CisKK2Rtc2V0dXAgcmVzdW1lICR2Zy0kbHYxCisKK3dhaXQKKworIyBjaGVjayBpdCByZWFsbHkgaXMgbm93ICdlcnJvcicgdGFyZ2V0CitkbXNldHVwIHRhYmxlICR2ZzEtc25hcCB8IHRlZSBvdXQKK2dyZXAgZXJyb3Igb3V0CisKK3Vtb3VudCBtbnQgfHwgdHJ1ZQorCitsdnJlbW92ZSAtZiAkdmcxCisKK3ZncmVtb3ZlIC1mZiAkdmcxCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90LXJlbmFtZS5zaCBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGRlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3NuYXBzaG90LXJlbmFtZS5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0aW5nIHJlbmFtaW5nIHNuYXBzaG90cyAoaGFkIHByb2JsZW0gaW4gY2x1c3RlcikKKyMgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMTM2OTI1CisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAxCisKK2x2Y3JlYXRlIC1hZXkgLUwxIC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtcyAtTDEgLW4gJGx2MiAkdmcvJGx2MQorbHZyZW5hbWUgJHZnLyRsdjIgJHZnLyRsdjMKK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zbmFwc2hvdC11c2FnZS1leGEuc2ggYi90ZXN0L3NoZWxsL3NuYXBzaG90LXVzYWdlLWV4YS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGMxZTUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zbmFwc2hvdC11c2FnZS1leGEuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBDaGVjayB2ZXJ5IGxhcmdlIGRldmljZSBzaXplICh1cHRvIDE1RXhhIGJ5dGVzKQorIyB0aGlzIG5lZWRzIDY0Yml0IGFyY2gKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBjYW5fdXNlXzE2VCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAxCisKKyMgUHJlcGFyZSBsYXJnZSBlbm91Z2ggYmFja2VuZCBkZXZpY2UKK3ZnY3JlYXRlIC1zIDRNICR2ZyAkKGNhdCBERVZJQ0VTKQorbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1zIC1sIDEwMCVGUkVFIC1uICRsdiAkdmcgLS12aXJ0dWFsc2l6ZSAxNVAKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKKworIyBDaGVjayB1c2FiaWxpdHkgd2l0aCBsYXJnZXN0IGV4dGVudCBzaXplCitwdmNyZWF0ZSAiJERNX0RFVl9ESVIvJHZnLyRsdiIKK3ZnY3JlYXRlIC1zIDRHICR2ZzEgIiRETV9ERVZfRElSLyR2Zy8kbHYiCisKK2x2Y3JlYXRlIC1hbiAtWm4gLWw1MCVGUkVFIC1uICRsdjEgJHZnMQorbHZjcmVhdGUgLXMgLWwxMDAlRlJFRSAtbiAkbHYyICR2ZzEvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYyIHNpemUgIjcuNTBwIgorbHZyZW1vdmUgLWZmICR2ZzEKKworbHZjcmVhdGUgLS10eXBlIHNuYXBzaG90IC1WMTVFIC1sMSAtbiAkbHYxIC1zICR2ZzEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBvcmlnaW5fc2l6ZSAiMTUuMDBlIgorCit2Z3JlbW92ZSAtZmYgJHZnMQordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zbmFwc2hvdC11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyYjRiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc25hcHNob3QtdXNhZ2Uuc2gKQEAgLTAsMCArMSwyMTMgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgbm8gYXV0b21hdGljIGV4dGVuc2lvbnMgcGxlYXNlCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCitNS0ZTPW1rZnMuZXh0Mgord2hpY2ggJE1LRlMgfHwgc2tpcAorCitmaWxsKCkgeworCWRkIGlmPS9kZXYvemVybyBvZj0iJERNX0RFVl9ESVIvJHsyOi0kdmcxL2x2b2wwfSIgYnM9JDEgY291bnQ9MSBvZmxhZz1kaXJlY3QgfHwgXAorCQlkaWUgIlNuYXBzaG90IGRvZXMgbm90IGZpdCAkMSIKK30KKworIyBXYWl0IHVudGlsIGRldmljZSBpcyBvcGVuZWQKK3dhaXRfZm9yX29wZW5fKCkgeworCWZvciBpIGluICQoc2VxIDEgNTApIDsgZG8KKwkJdGVzdCAkKGRtc2V0dXAgaW5mbyAtLW5vaGVhZGluZ3MgLWMgLW8gb3BlbiAkMSkgLW5lIDAgJiYgcmV0dXJuCisJCXNsZWVwIDAuMQorCWRvbmUKKworCWRpZSAiJDEgZXhwZWN0ZWQgdG8gYmUgb3Blbm5lZCwgYnV0IGl0J3Mgbm90ISIKK30KKworY2xlYW51cF90YWlsKCkKK3sKKwl0ZXN0IC16ICIkU0xFRVBfUElEIiB8fCBraWxsICRTTEVFUF9QSUQgfHwgdHJ1ZQorCXdhaXQKKwl2Z3JlbW92ZSAtZmYgJHZnMSB8fCB0cnVlCisJdmdyZW1vdmUgLWZmICR2ZworCWF1eCB0ZWFyZG93bgorfQorCitUU0laRT0xNVAKK2F1eCBjYW5fdXNlXzE2VCB8fCBUU0laRT0xNVQKKworIyBXaXRoIGRpZmZlcmVudCBzbmFwc2hvdCB0YXJnZXQgZHJpdmVyIHdlIG1heSBvYnRhaW4gZGlmZmVyZW50IHJlc3VsdHMuCisjIE9sZGVyIHRhcmdldHMgaGF2ZSBtZXRhZGF0YSBsZWFrIGJ1ZyB3aGljaCBuZWVkcyBleHRyYSBjb21wZW5zdGlvbi4KKyMgQW5jaWVudCB0YXJnZXRzIGRvIG5vdCBldmVuIHByb3ZpZGUgc2VwYXJhdGUgaW5mbyBmb3IgbWV0YWRhdGEuCitFWFBFQ1QxPSIxNi4wMGsiCitFWFBFQ1QyPSI1MTIuMDBrIgorRVhQRUNUMz0iMzIuMDBrIgorRVhQRUNUND0iNjYuNjciCitpZiBhdXggdGFyZ2V0X2F0X2xlYXN0IGRtLXNuYXBzaG90IDEgMTAgMCA7IHRoZW4KKwkjIEV4dHJhIG1ldGFkYXRhIHNpemUKKwlFWFBFQ1Q0PSIwLjAwIgorCisJaWYgYXV4IHRhcmdldF9hdF9sZWFzdCBkbS1zbmFwc2hvdCAxIDEyIDAgOyB0aGVuCisJCSMgV2hlbiBmaXhlZCBsZWFrLCBleHBlY3Qgc21hbGxlciBzaXplcworCQlFWFBFQ1QxPSIxMi4wMGsiCisJCUVYUEVDVDI9IjM4NC4wMGsiCisJCUVYUEVDVDM9IjI4LjAwayIKKwlmaQorZmkKKworYXV4IHByZXBhcmVfcHZzIDEKK3ZnY3JlYXRlIC1zIDRNICR2ZyAkKGNhdCBERVZJQ0VTKQorCisjIFBsYXkgd2l0aCAxIGV4dGVudAorbHZjcmVhdGUgLWFleSAtbDEgLW4gJGx2ICR2ZworIyAxMDAlTFYgaXMgbm90IHN1cHBvcnRlZCBmb3Igc25hcHNob3QKK2ZhaWwgbHZjcmVhdGUgLXMgLWwgMTAwJUxWIC1uIHNuYXAgJHZnLyRsdiAyPiYxIHwgdGVlIG91dAorZ3JlcCAnUGxlYXNlIGV4cHJlc3Mgc2l6ZSBhcyAlRlJFRSwgJU9SSUdJTiwgJVBWUyBvciAlVkcnIG91dAorIyAxMDAlT1JJR0lOIG5lZWRzIHRvIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhbGwgZGF0YSBhbmQgbmVlZHMgdG8gcm91bmQtdXAKK2x2Y3JlYXRlIC1zIC1sIDEwMCVPUklHSU4gLW4gJGx2MSAkdmcvJGx2CisjIGV2ZXJ5dGhpbmcgbmVlZHMgdG8gZml0CitmaWxsIDRNICR2Zy8kbHYxCitsdnJlbW92ZSAtZiAkdmcKKworCisjIEF1dG9tYXRpY2FsbHkgYWN0aXZhdGVzIGV4Y2x1c2l2ZWx5IGluIGNsdXN0ZXIKK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtcyAtbCAxMDAlRlJFRSAtbiAkbHYgJHZnIC0tdmlydHVhbHNpemUgJFRTSVpFCisKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKK2F1eCBsdm1jb25mICJhY3RpdmF0aW9uL3NuYXBzaG90X2F1dG9leHRlbmRfcGVyY2VudCA9IDIwIiBcCisgICAgICAgICAgICAiYWN0aXZhdGlvbi9zbmFwc2hvdF9hdXRvZXh0ZW5kX3RocmVzaG9sZCA9IDUwIgorCisjIENoZWNrIHVzYWJpbGl0eSB3aXRoIHNtYWxsZXN0ICgxaykgZXh0ZW50IHNpemUgKCRsdiBoYXMgMTVQKQorcHZjcmVhdGUgLS1zZXRwaHlzaWNhbHZvbHVtZXNpemUgNFQgIiRETV9ERVZfRElSLyR2Zy8kbHYiCit0cmFwICdjbGVhbnVwX3RhaWwnIEVYSVQKK3ZnY3JlYXRlIC1zIDFLICR2ZzEgIiRETV9ERVZfRElSLyR2Zy8kbHYiCisKKworIyBQbGF5IHdpdGggc21hbGwgMWsgMTI4IGV4dGVudHMKK2x2Y3JlYXRlIC1hZXkgLUwxMjhLIC1uICRsdiAkdmcxCisjIDEwMCVPUklHSU4gbmVlZHMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBkYXRhCitsdmNyZWF0ZSAtcyAtbCAxMDAlT1JJR0lOIC1uIHNuYXAxMDAgJHZnMS8kbHYKKyMgZXZlcnl0aGluZyBuZWVkcyB0byBmaXQKK2ZpbGwgMTI4ayAkdmcxL3NuYXAxMDAKKworIyA1MCVPUklHSU4gbmVlZHMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIDUwJSBvZiBkYXRhCitsdmNyZWF0ZSAtcyAtbCA1MCVPUklHSU4gLW4gc25hcDUwICR2ZzEvJGx2CitmaWxsIDY0ayAkdmcxL3NuYXA1MAorCitsdmNyZWF0ZSAtcyAtbCAyNSVPUklHSU4gLW4gc25hcDI1ICR2ZzEvJGx2CitmaWxsIDMyayAkdmcxL3NuYXAyNQorCisjIENoZWNrIHdlIGRvIG5vdCBwcm92aWRlIHRvbyBtdWNoIGV4dHJhIHNwYWNlCitub3QgZmlsbCAzM2sgJHZnMS9zbmFwMjUKKworbHZzIC1hICR2ZzEKK2x2cmVtb3ZlIC1mICR2ZzEKKworIyBUZXN0IHZpcnR1YWwgc25hcHNob3Qgb3ZlciAvZGV2L3plcm8KK2x2Y3JlYXRlIC0tdHlwZSBzbmFwc2hvdCAtVjUwIC1MMTAgLW4gJGx2MSAtcyAkdmcxCitDSEVDS19BQ1RJVkU9ImFjdGl2ZSIKK3Rlc3QgISAtZSBMT0NBTF9DTFZNRCB8fCBDSEVDS19BQ1RJVkU9ImxvY2FsIGV4Y2x1c2l2ZSIKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBsdl9hY3RpdmUgIiRDSEVDS19BQ1RJVkUiCitsdmNoYW5nZSAtYW4gJHZnMQorCisjIE9uIGNsdXN0ZXIgc25hcHNob3QgZ2V0cyBleGNsdXNpdmUgYWN0aXZhdGlvbgorbHZjaGFuZ2UgLWF5ICR2ZzEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSBsdl9hY3RpdmUgIiRDSEVDS19BQ1RJVkUiCisKKyMgVGVzdCByZW1vdmFsIG9mIG9wZW5lZCAoYnV0IHVubW91bnRlZCkgc25hcHNob3QgKGRldmljZSBidXN5KSBmb3IgYSB3aGlsZQorc2xlZXAgMTIwIDwgIiRETV9ERVZfRElSLyR2ZzEvJGx2MSIgJgorU0xFRVBfUElEPSQhCisKK3dhaXRfZm9yX29wZW5fICIkdmcxLSRsdjEiCisKKyMgT3BlbmVkIHZpcnR1YWwgc25hcHNob3QgZGV2aWNlIGlzIG5vdCByZW1vdmFibGUKKyMgaXQgc2hvdWxkIHJldHJ5IGRldmljZSByZW1vdmFsIGZvciBhIGZldyBzZWNvbmRzCitub3QgbHZyZW1vdmUgLWYgJHZnMS8kbHYxCisKK2tpbGwgJFNMRUVQX1BJRAorU0xFRVBfUElEPQorIyBXYWl0IGZvciBraWxsZWQgdGFzaywgc28gdGhlcmUgaXMgbm8gZGV2aWNlIGhvbGRlcgord2FpdAorCitsdnJlbW92ZSAtZiAkdmcxLyRsdjEKK2NoZWNrIGx2X25vdF9leGlzdHMgJHZnMSAkbHYxCisKKyMgQ2hlY2sgYm9yZGVyIHNpemUKK2x2Y3JlYXRlIC1hZXkgLUw0MDk1RyAkdmcxCitsdmNyZWF0ZSAtcyAtTDEwMEsgJHZnMS9sdm9sMAorZmlsbCAxSworY2hlY2sgbHZfZmllbGQgJHZnMS9sdm9sMSBkYXRhX3BlcmNlbnQgIjEyLjAwIgorCitsdnJlbW92ZSAtZmYgJHZnMQorCisjIENyZWF0ZSAxS0Igc25hcHNob3QsIGRvZXMgbm90IG5lZWQgdG8gYmUgYWN0aXZlIGhlcmUKK2x2Y3JlYXRlIC1hbiAtWm4gLWwxIC1uICRsdjEgJHZnMQorbm90IGx2Y3JlYXRlIC1zIC1sMSAkdmcxLyRsdjEKK25vdCBsdmNyZWF0ZSAtcyAtbDMgJHZnMS8kbHYxCitsdmNyZWF0ZSAtcyAtbDMwIC1uICRsdjIgJHZnMS8kbHYxCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjIgc2l6ZSAiJEVYUEVDVDEiCisKK25vdCBsdmNyZWF0ZSAtcyAtYzUxMiAtbDUxMiAkdmcxLyRsdjEKK2x2Y3JlYXRlIC1zIC1jMTI4IC1sMTcwMCAtbiAkbHYzICR2ZzEvJGx2MQorIyAzICogMTI4CitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjMgc2l6ZSAiJEVYUEVDVDIiCitsdnJlbW92ZSAtZmYgJHZnMQorCitsdmNyZWF0ZSAtYWV5IC1sMjAgJHZnMQorbHZjcmVhdGUgLXMgLWwxMiAkdmcxL2x2b2wwCisKKyMgRmlsbCAxS0IgLT4gMTAwJSBzbmFwc2hvdCAoMXggNEtCIGNodW5rKQorZmlsbCAxSworY2hlY2sgbHZfZmllbGQgJHZnMS9sdm9sMSBkYXRhX3BlcmNlbnQgIjEwMC4wMCIKKworIyBDaGVjayBpdCByZXNpemVzIDEwMCUgZnVsbCB2YWxpZCBzbmFwc2hvdCB0byBmaXQgdGhyZXNob2xkCitsdmV4dGVuZCAtLXVzZS1wb2xpY2llcyAkdmcxL2x2b2wxCitjaGVjayBsdl9maWVsZCAkdmcxL2x2b2wxIGRhdGFfcGVyY2VudCAiNTAuMDAiCisKK2ZpbGwgNEsKK2x2ZXh0ZW5kIC0tdXNlLXBvbGljaWVzICR2ZzEvbHZvbDEKK2NoZWNrIGx2X2ZpZWxkICR2ZzEvbHZvbDEgc2l6ZSAiMjQuMDBrIgorCitsdmV4dGVuZCAtbCszMyAkdmcxL2x2b2wxCitjaGVjayBsdl9maWVsZCAkdmcxL2x2b2wxIHNpemUgIiRFWFBFQ1QzIgorCitmaWxsIDIwSworCitsdnJlbW92ZSAtZiAkdmcxCisKKyMgQ2hlY2sgc25hcHNob3QgcmVhbGx5IGRlbGV0ZXMgQ09XIGhlYWRlciBmb3IgcmVhZC1vbmx5IHNuYXBzaG90CisjIFRlc3QgbmVlZHMgc3BlY2lhbCByZWxhdGlvbiBiZXR3ZWVuIGNodW5rIHNpemUgYW5kIGV4dGVudCBzaXplCisjIFRoaXMgdGVzdCBleHBlY3RzIGV4dGVudCBzaXplIDFLCithdXggbHZtY29uZiAiYWxsb2NhdGlvbi93aXBlX3NpZ25hdHVyZXNfd2hlbl96ZXJvaW5nX25ld19sdnMgPSAxIgorbHZjcmVhdGUgLWFleSAtTDQgLW4gJGx2ICR2ZzEKK2x2Y3JlYXRlIC1jIDggLXMgLUwxIC1uIHNuYXAgJHZnMS8kbHYKKyMgUG9wdWxhdGUgc25hcHNob3QKKyNkZCBpZj0vZGV2L3VyYW5kb20gb2Y9IiRETV9ERVZfRElSLyR2ZzEvJGx2IiBicz00MDk2IGNvdW50PTEwCiskTUtGUyAiJERNX0RFVl9ESVIvJHZnMS8kbHYiCitsdnJlbW92ZSAtZiAkdmcxL3NuYXAKKworIyBVbmRlbGV0ZWQgaGVhZGVyIHdvdWxkIHRyaWdnZXIgYXR0ZW1wdCB0byBhY2Nlc3MKKyMgYmV5b25kIGVuZCBvZiBDT1cgZGV2aWNlCisjIEZhaWxzIHRvIGNyZWF0ZSB3aGVuIGNodW5rIHNpemUgaXMgZGlmZmVyZW50CitsdmNyZWF0ZSAtcyAtcHIgLWwxMiAtbiBzbmFwICR2ZzEvJGx2CisKKyMgV2hlbiBoZWFkZXIgaXMgdW5kZWxldGUsIGZhaWxzIHRvIHJlYWQgc25hcHNob3Qgd2l0aG91dCByZWFkIGVycm9ycworI2RkIGlmPSIkRE1fREVWX0RJUi8kdmcxL3NuYXAiIG9mPS9kZXYvbnVsbCBicz0xTSBjb3VudD0yCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcxL3NuYXAiCisKKyMgVGhpcyB0ZXN0IHdvdWxkIHRyaWdnZXIgcmVhZCBvZiB3ZWlyZCBwZXJjZW50YWdlIGZvciB1bmRlbGV0ZWQgaGVhZGVyCisjIEFuZCBzaW5jZSBvbGRlciBzbmFwc2hvdCB0YXJnZXQgY291bnRzIHdpdGggbWV0YWRhdGEgc2VjdG9ycworIyB3ZSBoYXZlIDIgdmFsaWQgcmVzdWx0cyAgKHVuc3VyZSBhYm91dCBjb3JyZWN0IHZlcnNpb24gbnVtYmVyKQorY2hlY2sgbHZfZmllbGQgJHZnMS9zbmFwIGRhdGFfcGVyY2VudCAiJEVYUEVDVDQiCisKK3ZncmVtb3ZlIC1mZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3NuYXBzaG90cy1vZi1taXJyb3JzLnNoIGIvdGVzdC9zaGVsbC9zbmFwc2hvdHMtb2YtbWlycm9ycy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWNkNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zbmFwc2hvdHMtb2YtbWlycm9ycy5zaApAQCAtMCwwICsxLDUwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNAorCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0gMSAtTCAxME0gLS1ub3N5bmMgLW4gbHYgJHZnCisKKyMgQ3JlYXRlIHNuYXBzaG90IG9mIGEgbWlycm9yIG9yaWdpbgorbHZjcmVhdGUgLXMgJHZnL2x2IC1MIDEwTSAtbiBzbmFwCisKKyMgRG93bi1jb252ZXJ0IChtaXJyb3IgLT4gbGluZWFyKSB1bmRlciBhIHNuYXBzaG90CitsdmNvbnZlcnQgLW0wICR2Zy9sdgorCisjIFVwLWNvbnZlcnQgKGxpbmVhciAtPiBtaXJyb3IpCitsdmNvbnZlcnQgLS10eXBlIG1pcnJvciAtbTIgJHZnL2x2CisKKyMgRG93bi1jb252ZXJ0IChtaXJyb3IgLT4gbWlycm9yKQorbHZjb252ZXJ0IC1tIDEgJHZnL2x2CisKKyMgVXAtY29udmVydCAobWlycm9yIC0+IG1pcnJvcikgLS0gTm90IHN1cHBvcnRlZCEKK25vdCBsdmNvbnZlcnQgLW0yICR2Zy9sdgorCisjIExvZyBjb252ZXJzaW9uIChkaXNrIC0+IGNvcmUpCitsdmNvbnZlcnQgLS1taXJyb3Jsb2cgY29yZSAkdmcvbHYKKworIyBMb2cgY29udmVyc2lvbiAoY29yZSAtPiBtaXJyb3JlZCkKKyMgRklYTUUgb24gY2x1c3RlcgordGVzdCAtZSBMT0NBTF9DTFZNRCAmJiBTSE9VTEQ9c2hvdWxkCiskU0hPVUxEIGx2Y29udmVydCAtLW1pcnJvcmxvZyBtaXJyb3JlZCAkdmcvbHYKKworIyBMb2cgY29udmVyc2lvbiAobWlycm9yZWQgLT4gY29yZSkKK2x2Y29udmVydCAtLW1pcnJvcmxvZyBjb3JlICR2Zy9sdgorCisjIExvZyBjb252ZXJzaW9uIChjb3JlIC0+IGRpc2spCitsdmNvbnZlcnQgLS1taXJyb3Jsb2cgZGlzayAkdmcvbHYKKworIyMgQ2xlYW4tdXAKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zdHJheS1kZXZpY2Utbm9kZS5zaCBiL3Rlc3Qvc2hlbGwvc3RyYXktZGV2aWNlLW5vZGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkOTc0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvc3RyYXktZGV2aWNlLW5vZGUuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDMKK2NwIC1yICIkZGV2MSIgIiRETV9ERVZfRElSL3N0cmF5IgorCit2Z2NyZWF0ZSAkdmcgJChjYXQgREVWSUNFUykKK2x2Y3JlYXRlIC1hbiAtWm4gLS10eXBlIG1pcnJvciAtbSAxIC1sIDEgLW4gbWlycm9yICR2ZworYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKKyMgRklYTUU6CisjIGZvciB0aGUgLmNhY2hlIHVzZSBjYXNlIHdlIG5lZWQgdG8gcnVuIHB2c2NhbgorIyB0byBrZWVwIGNsdm1kIGluIHN5bmMuCitwdnNjYW4KK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC9zeXN0ZW1faWQuc2ggYi90ZXN0L3NoZWxsL3N5c3RlbV9pZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEzNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC9zeXN0ZW1faWQuc2gKQEAgLTAsMCArMSw4ODYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHN5c3RlbV9pZCcKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDEKKworIyB3aXRoIGNsdm0gZW5hYmxlZCwgdmdjcmVhdGUgd2l0aCBubyAtYyBvcHRpb24gY3JlYXRlcyBhIGNsdXN0ZXJlZCB2ZywKKyMgd2hpY2ggc2hvdWxkIGhhdmUgbm8gc3lzdGVtIGlkCisKK2lmIFsgLWUgTE9DQUxfQ0xWTUQgXTsgdGhlbgorU0lEMT1zaWRmb29sb2NhbAorU0lEMj0iIgorTFZNTE9DQUw9ZXRjL2x2bWxvY2FsLmNvbmYKK3JtIC1mICRMVk1MT0NBTAorZWNobyAibG9jYWwgeyIgPiAkTFZNTE9DQUwKK2VjaG8gIiAgc3lzdGVtX2lkID0gJFNJRDEiID4+ICRMVk1MT0NBTAorZWNobyAifSIgPj4gJExWTUxPQ0FMCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBsdm1sb2NhbCIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdzIC1vK3N5c3RlbWlkICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgc3lzdGVtaWQgJFNJRDIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRMVk1MT0NBTAorZXhpdCAwCitmaQorCisjIGNyZWF0ZSB2ZyB3aXRoIHN5c3RlbV9pZCB1c2luZyBlYWNoIHNvdXJjZQorCisjIyBub25lCisKK1NJRD0iIgorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gbm9uZSIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECit2Z3JlbW92ZSAkdmcxCisKKyMgRklYTUUgLSBwcmludCAnbGlmZScgY29uZmlnIGRhdGEKK2V2YWwgJChsdm1jb25maWcgZ2xvYmFsL2V0YyAyPi9kZXYvbnVsbCB8fCBsdm1jb25maWcgLS10eXBlIGRlZmF1bHQgZ2xvYmFsL2V0YykKKworIyMgbWFjaGluZWlkCitpZiBbIC1lICRldGMvbWFjaGluZS1pZCBdOyB0aGVuCitTSUQ9JChjYXQgJGV0Yy9tYWNoaW5lLWlkKQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gbWFjaGluZWlkIgordmdjcmVhdGUgJHZnMSAiJGRldjEiCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECit2Z3JlbW92ZSAkdmcxCitmaQorCisjIyB1bmFtZQorCitTSUQxPSQodW5hbWUgLW4pCitpZiBbIC1uICRTSUQxIF07IHRoZW4KK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IHVuYW1lIgorU0lEMj0kKGx2bSBzeXN0ZW1pZCB8IGF3ayAneyBwcmludCAkMyB9JykKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdzIC1vK3N5c3RlbWlkICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgc3lzdGVtaWQgJFNJRDIKK3ZncmVtb3ZlICR2ZzEKK2ZpCisKKyMjIGx2bWxvY2FsCisKK1NJRD1zaWRmb29sb2NhbAorTFZNTE9DQUw9ZXRjL2x2bWxvY2FsLmNvbmYKK3JtIC1mICRMVk1MT0NBTAorZWNobyAibG9jYWwgeyIgPiAkTFZNTE9DQUwKK2VjaG8gIiAgc3lzdGVtX2lkID0gJFNJRCIgPj4gJExWTUxPQ0FMCitlY2hvICJ9IiA+PiAkTFZNTE9DQUwKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGx2bWxvY2FsIgordmdjcmVhdGUgJHZnMSAiJGRldjEiCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECit2Z3JlbW92ZSAkdmcxCitybSAtZiAkTFZNTE9DQUwKKworIyMgZmlsZQorCitTSUQ9c2lkZm9vZmlsZQorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdzIC1vK3N5c3RlbWlkICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgc3lzdGVtaWQgJFNJRAordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBvdmVycmlkZSBzeXN0ZW1faWQgdG8gY3JlYXRlIGEgZm9yZWlnbiB2ZywgdGhlbiBmYWlsIHRvIHVzZSB0aGUgdmcKKworU0lEMT1zaWRmb29maWxlMQorU0lEMj1zaWRmb29maWxlMgorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnLCBvdmVycmlkaW5nIHRoZSBsb2NhbCBzeXN0ZW1faWQgc28gdGhlIHZnIGxvb2tzIGZvcmVpZ24KK3ZnY3JlYXRlIC0tc3lzdGVtaWQgJFNJRDIgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3MgaXMgbm90IGFuIGVycm9yIGFuZCBkb2VzIG5vdCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdmdzIG9uIHRoZSBmb3JlaWduIHZnIGlzIGFuIGVycm9yIGFuZCBub3QgZGlzcGxheWVkCitub3QgdmdzICR2ZzEgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgZmFpbCB0byByZW1vdmUgZm9yZWlnbiB2Zworbm90IHZncmVtb3ZlICR2ZzEKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBzZWUgZm9yZWlnbiB2ZwordmdzIC0tZm9yZWlnbiA+ZXJyCitncmVwICR2ZzEgZXJyCit2Z3MgLS1mb3JlaWduICR2ZzEgPmVycgorZ3JlcCAkdmcxIGVycgorIyBjaGFuZ2UgdGhlIGxvY2FsIHN5c3RlbV9pZCB0byB0aGUgc2Vjb25kIHZhbHVlLCBtYWtpbmcgdGhlIHZnIG5vdCBmb3JlaWduCitlY2hvICIkU0lEMiIgPiAkU0lERklMRQorIyB3ZSBjYW4gbm93IHNlZSBhbmQgcmVtb3ZlIHRoZSB2ZwordmdzICR2ZzEgPmVycgorZ3JlcCAkdmcxIGVycgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBjcmVhdGUgYSB2ZywgdGhlbiBjaGFuZ2UgdGhlIGxvY2FsIHN5c3RlbV9pZCwgbWFraW5nIHRoZSB2ZyBmb3JlaWduCisKK1NJRDE9c2lkZm9vZmlsZTEKK1NJRDI9c2lkZm9vZmlsZTIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkLCBtYWtpbmcgdGhlIHZnIGZvcmVpZ24KK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCisjIG5vcm1hbCB2Z3MgZG9lc24ndCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBzZWUgdGhlIHZnCit2Z3MgLS1mb3JlaWduID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgY2hhbmdlIHRoZSBsb2NhbCBzeXN0ZW1faWQgYmFjayB0byB0aGUgZmlyc3QgdmFsdWUsIG1ha2luZyB0aGUgdmcgbm90IGZvcmVpZ24KK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBjcmVhdGUgYSB2ZywgdGhlbiBjaGFuZ2UgdGhlIHZnJ3Mgc3lzdGVtX2lkLCBtYWtpbmcgaXQgZm9yZWlnbgorCitTSUQxPXNpZGZvb2ZpbGUxCitTSUQyPXNpZGZvb2ZpbGUyCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnCit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgorIyBjaGFuZ2UgdGhlIHZnJ3Mgc3lzdGVtX2lkLCBtYWtpbmcgdGhlIHZnIGZvcmVpZ24KK2VjaG8gInkiIHwgdmdjaGFuZ2UgLS1zeXN0ZW1pZCAkU0lEMiAkdmcxCisjIG5vcm1hbCB2Z3MgZG9lc24ndCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBzZWUgdGhlIHZnCit2Z3MgLS1mb3JlaWduID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgY2hhbmdlIHRoZSBsb2NhbCBzeXN0ZW1faWQgdG8gdGhlIHNlY29uZCBzeXN0ZW1faWQgc28gd2UgY2FuIHJlbW92ZSB0aGUgdmcKK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBjcmVhdGUgYSB2ZywgY3JlYXRlIGFjdGl2ZSBsdnMgaW4gaXQsIGNoYW5nZSBvdXIgc3lzdGVtX2lkLCBtYWtpbmcKKyMgdGhlIFZHIGZvcmVpZ24sIHZlcmlmeSB0aGF0IHdlIGNhbiBzdGlsbCBzZWUgdGhlIGZvcmVpZ24gVkcsCisjIGFuZCBjYW4gZGVhY3RpdmF0ZSB0aGUgTFZzCisKK1NJRDE9c2lkZm9vZmlsZTEKK1NJRDI9c2lkZm9vZmlsZTIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCitsdmNyZWF0ZSAtbiAkbHYxIC1sIDIgJHZnMQorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnIGFuZCBsdgordmdzID5lcnIKK2dyZXAgJHZnMSBlcnIKK2NoZWNrIGx2X2V4aXN0cyAkdmcxICRsdjEKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQsIG1ha2luZyB0aGUgdmcgZm9yZWlnbiwgYnV0IGFjY2Vzc2libGUKK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorIyBjYW4gZGVhY3RpdmF0ZSB0aGUgbHYKK2x2Y2hhbmdlIC1hbiAkdmcxLyRsdjEKKyMgbm93IHRoYXQgdGhlIGZvcmVpZ24gdmcgaGFzIG5vIGFjdGl2ZSBsdnMsIHdlIGNhbid0IGFjY2VzcyBpdAorbm90IGx2cmVtb3ZlICR2ZzEvJGx2MQorbm90IHZncmVtb3ZlICR2ZzEKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQgYmFjayB0byBtYXRjaCB0aGUgdmcgc28gaXQncyBub3QgZm9yZWlnbgorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCitsdnJlbW92ZSAkdmcxLyRsdjEKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgbG9jYWwgc3lzdGVtIGhhcyBubyBzeXN0ZW1faWQsIHNvIGl0IGNhbid0IGFjY2VzcyBhIHZnIHdpdGggYSBzeXN0ZW1faWQKKworU0lEMT1zaWRmb29maWxlMQorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IG5vbmUiCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKK25vdCB2Z3MgJHZnMSA+ZXJyCitub3QgZ3JlcCAkdmcxIGVycgorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIGxvY2FsIHN5c3RlbSBoYXMgYSBzeXN0ZW1faWQsIGFuZCBjYW4gdXNlIGEgdmcgd2l0aG91dCBhIHN5c3RlbV9pZAorCitTSUQxPXNpZGZvb2ZpbGUxCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkU0lERklMRQorIyBjcmVhdGUgYSB2ZyB3aXRoIG5vIHN5c3RlbV9pZAorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gbm9uZSIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAiIgorIyBzZXQgYSBsb2NhbCBzeXN0ZW1faWQKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNoZWNrIHdlIGNhbiBzZWUgYW5kIHVzZSB0aGUgdmcgd2l0aCBubyBzeXN0ZW1faWQKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCit2Z3MgJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIHZnZXhwb3J0IGNsZWFycyBzeXN0ZW1faWQsIHZnaW1wb3J0IHNldHMgc3lzdGVtX2lkCisKK1NJRDE9c2lkZm9vZmlsZTEKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyAtbytzeXN0ZW1pZCA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRTSUQxIGVycgorIyBhZnRlciB2Z2V4cG9ydCB0aGVyZSBpcyBubyBzeXN0ZW1pZAordmdleHBvcnQgJHZnMQordmdzIC1vK3N5c3RlbWlkID5lcnIKK2dyZXAgJHZnMSBlcnIKK25vdCBncmVwICRTSUQxIGVycgorIyBhZnRlciB2Z2ltcG9ydCB0aGVyZSBpcyBhIHN5c3RlbWlkCit2Z2ltcG9ydCAkdmcxCit2Z3MgLW8rc3lzdGVtaWQgPmVycgorZ3JlcCAkdmcxIGVycgorZ3JlcCAkU0lEMSBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgdmdjaGFuZ2UgLWN5IGNsZWFycyBzeXN0ZW1faWQsIHZnY2hhbmdlIC1jbiBzZXRzIHN5c3RlbV9pZAorCitTSUQxPXNpZGZvb2ZpbGUxCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnCit2Z3MgLW8rc3lzdGVtaWQgPmVycgorZ3JlcCAkdmcxIGVycgorZ3JlcCAkU0lEMSBlcnIKKyMgYWZ0ZXIgdmdjaGFuZ2UgLWN5IHRoZXJlIGlzIG5vIHN5c3RlbWlkCitlY2hvICJ5IiB8IHZnY2hhbmdlIC1jeSAkdmcxCit2Z3MgLS1jb25maWcgJ2dsb2JhbCB7IGxvY2tpbmdfdHlwZT0wIH0nIC1vK3N5c3RlbWlkICR2ZzEgPmVycgorZ3JlcCAkdmcxIGVycgorbm90IGdyZXAgJFNJRDEgZXJyCisjIGFmdGVyIHZnY2hhbmdlIC1jbiB0aGVyZSBpcyBhIHN5c3RlbWlkCit2Z2NoYW5nZSAtLWNvbmZpZyAnZ2xvYmFsIHsgbG9ja2luZ190eXBlPTAgfScgLWNuICR2ZzEKK3ZncyAtbytzeXN0ZW1pZCA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRTSUQxIGVycgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBUZXN0IG1heCBzeXN0ZW1faWQgbGVuZ3RoICgxMjgpIGFuZCBpbnZhbGlkIHN5c3RlbV9pZCBjaGFyYWN0ZXJzLgorIyBUaGUgMTI4IGxlbmd0aCBsaW1pdCBpcyBpbXBvc2VkIGJlZm9yZSBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIG9taXR0ZWQuCisKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKKworIyAxMjAgbnVtYmVycyBmb2xsb3dlZCBieSA4IGxldHRlcnMgKG1heCBsZW4pCitTSUQxPTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OWFiY2RlZmdoCisjIDEyMCBudW1iZXJzIGZvbGxvd2VkIGJ5IDkgbGV0dGVycyAodG9vIGxvbmcgYnkgMSBjaGFyYWN0ZXIsIHRoZSBsYXN0IGlzIG9taXR0ZWQpCitTSUQyPTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OWFiY2RlZmdoaQorCisjIG1heCBsZW4gc3lzdGVtX2lkIHNob3VsZCBhcHBlYXIgbm9ybWFsbHkKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyAtbytzeXN0ZW1pZCAkdmcxID5lcnIKK2dyZXAgJHZnMSBlcnIKK2dyZXAgJFNJRDEgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIG1heCsxIGxlbiBzeXN0ZW1faWQgc2hvdWxkIGJlIG1pc3NpbmcgdGhlIGxhc3QgY2hhcmFjdGVyCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDIiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnCit2Z3MgLW8rc3lzdGVtaWQgJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRTSUQxIGVycgorbm90IGdyZXAgJFNJRDIgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIG1heCBsZW4gc3lzdGVtX2lkIGNvbnRhaW5pbmcgYW4gaW52YWxpZCBjaGFyYWN0ZXIgc2hvdWxkIGFwcGVhciB3aXRob3V0CisjIHRoZSBpbnZhbGlkIGNoYXJhY3RlcgorIyAxMjAgbnVtYmVycyBmb2xsb3dlZCBieSBpbnZhbGlkICclJyBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgOCBsZXR0ZXJzICh0b28gbG9uZyBieSAxIGNoYXJhY3RlcikKK1NJRDE9MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5JWFiY2RlZmdoCisjIEFmdGVyIHRoZSBpbnZhbGlkIGNoYXJhY3RlciBpcyBvbWl0dGVkIGZyb20gU0lEMQorIyBUaGUgc3RyaW5nIGlzIHRydW5jYXRlZCB0byBtYXggbGVuZ3RoICgxMjgpIGJlZm9yZSB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgaXMgb21pdHRlZAorU0lEMj0wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlhYmNkZWZnCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnCit2Z3MgLW8rc3lzdGVtaWQgJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCitub3QgZ3JlcCAkU0lEMSBlcnIKK2dyZXAgJFNJRDIgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIGNvbnRhaW5zIGEgYnVuY2ggb2YgaW52YWxpZCBjaGFyYWN0ZXJzCitTSUQxPSI/JSQmQS5AMV0iCisjIFNJRDEgd2l0aG91dCB0aGUgaW52YWxpZCBjaGFyYWN0ZXJzCitTSUQyPUEuMQorCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnCit2Z3MgLW8rc3lzdGVtaWQgJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCitub3QgZ3JlcCAkU0lEMSBlcnIKK2dyZXAgJFNJRDIgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisKKyMgcHZzOiBwdiBpbiBhIGZvcmVpZ24gdmcgbm90IHJlcG9ydGVkCisjIHB2cyAtLWZvcmVpZ246IHB2IGluIGEgZm9yZWlnbiB2ZyBpcyByZXBvcnRlZAorCitTSUQxPXNpZGZvb2ZpbGUxCitTSUQyPXNpZGZvb2ZpbGUyCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkU0lERklMRQorZWNobyAiJFNJRDEiID4gJFNJREZJTEUKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGZpbGUiIFwKKwkgICAgImdsb2JhbC9zeXN0ZW1faWRfZmlsZSA9IFwiJFNJREZJTEVcIiIKKyMgY3JlYXRlIGEgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorIyBub3JtYWwgcHZzIHNlZXMgdGhlIHZnIGFuZCBwdgorcHZzID5lcnIKK2dyZXAgJHZnMSBlcnIKK2dyZXAgIiRkZXYxIiBlcnIKKyMgY2hhbmdlIHRoZSBsb2NhbCBzeXN0ZW1faWQsIG1ha2luZyB0aGUgdmcgZm9yZWlnbgorZWNobyAiJFNJRDIiID4gJFNJREZJTEUKKyMgbm9ybWFsIHB2cyBkb2VzIG5vdCBzZWUgdGhlIHZnIG9yIHB2CitwdnMgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKK25vdCBncmVwICIkZGV2MSIgZXJyCisjIHB2cyAtLWZvcmVpZ24gZG9lcyBzZWUgdGhlIHZnIGFuZCBwdgorcHZzIC0tZm9yZWlnbiA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICIkZGV2MSIgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkIGJhY2sgc28gdGhlIHZnIGNhbiBiZSByZW1vdmVkCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyBsdnM6IGx2cyBpbiBhIGZvcmVpZ24gdmcgbm90IHJlcG9ydGVkCisjIGx2cyAtLWZvcmVpZ246IGx2cyBpbiBhIGZvcmVpZ24gdmcgYXJlIHJlcG9ydGVkCisKK1NJRDE9c2lkZm9vZmlsZTEKK1NJRDI9c2lkZm9vZmlsZTIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCitsdmNyZWF0ZSAtbiAkbHYxIC1sIDIgJHZnMQorbHZjaGFuZ2UgLWFuICR2ZzEvJGx2MQorIyBub3JtYWwgbHZzIHNlZXMgdGhlIHZnIGFuZCBsdgorbHZzID5lcnIKK2dyZXAgJHZnMSBlcnIKK2dyZXAgJGx2MSBlcnIKKyMgY2hhbmdlIHRoZSBsb2NhbCBzeXN0ZW1faWQsIG1ha2luZyB0aGUgdmcgZm9yZWlnbgorZWNobyAiJFNJRDIiID4gJFNJREZJTEUKKyMgbm9ybWFsIGx2cyBkb2VzIG5vdCBzZWUgdGhlIHZnIG9yIGx2CitsdnMgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKK25vdCBncmVwICRsdjEgZXJyCisjIGx2cyAtLWZvcmVpZ24gZG9lcyBzZWUgdGhlIHZnIGFuZCBsdgorbHZzIC0tZm9yZWlnbiA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRsdjEgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkIGJhY2sgc28gdGhlIHZnIGNhbiBiZSByZW1vdmVkCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorbHZyZW1vdmUgJHZnMS8kbHYxCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIHVzZSBleHRyYV9zeXN0ZW1faWRzIHRvIHJlYWQgYSBmb3JlaWduIFZHCisKK1NJRDE9c2lkZm9vZmlsZTEKK1NJRDI9c2lkZm9vZmlsZTIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK0xWTUxPQ0FMPWV0Yy9sdm1sb2NhbC5jb25mCitybSAtZiAkTFZNTE9DQUwKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkLCBtYWtpbmcgdGhlIHZnIGZvcmVpZ24KK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCisjIG5vcm1hbCB2Z3MgZG9lc24ndCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBzZWUgdGhlIHZnCit2Z3MgLS1mb3JlaWduID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgYWRkIHRoZSBmaXJzdCBzeXN0ZW1faWQgdG8gZXh0cmFfc3lzdGVtX2lkcyBzbyB3ZSBjYW4gc2VlIHRoZSB2ZworZWNobyAibG9jYWwgeyIgPiAkTFZNTE9DQUwKK2VjaG8gIiAgZXh0cmFfc3lzdGVtX2lkcyA9IFsgJFNJRDEiIF0gPj4gJExWTUxPQ0FMCitlY2hvICJ9IiA+PiAkTFZNTE9DQUwKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorcm0gLWYgJExWTUxPQ0FMCisKKyMgdmdjcmVhdGUgLS1zeXN0ZW1pZCAiIiBjcmVhdGVzIGEgdmcgd2l0aG91dCBhIHN5c3RlbV9pZCBldmVuIGlmIHNvdXJjZSBpcyBzZXQKK1NJRDE9c2lkZm9vZmlsZTEKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgLS1zeXN0ZW1pZCAiIiAkdmcxICIkZGV2MSIKKyMgbm9ybWFsIHZncyBzZWVzIHRoZSB2ZwordmdzID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgb3VyIHN5c3RlbV9pZCBpcyBub3QgZGlzcGxheWVkIGZvciB0aGUgdmcKK3ZncyAtbytzeXN0ZW1pZCA+ZXJyCitub3QgZ3JlcCAkU0lEMSBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgdmdjaGFuZ2UgLS1zeXN0ZW1pZCAiIiBjbGVhcnMgdGhlIHN5c3RlbV9pZCBvbiBvd25lZCB2ZworU0lEMT1zaWRmb29maWxlMQorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKKyMgbm9ybWFsIHZncyBzZWVzIHRoZSB2ZwordmdzID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgdGhlIHZnIGhhcyBvdXIgc3lzdGVtX2lkCit2Z3MgLW8rc3lzdGVtaWQgPmVycgorZ3JlcCAkU0lEMSBlcnIKKyMgY2xlYXIgdGhlIHN5c3RlbV9pZAordmdjaGFuZ2UgLS15ZXMgLS1zeXN0ZW1pZCAiIiAkdmcxCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCisjIHRoZSB2ZyBkb2VzIG5vdCBoYXZlIG91ciBzeXN0ZW1faWQKK3ZncyAtbytzeXN0ZW1pZCA+ZXJyCitub3QgZ3JlcCAkU0lEMSBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgdmdjaGFuZ2UgLS1zeXN0ZW1pZCBkb2VzIG5vdCBzZXQgdGhlIHN5c3RlbV9pZCBvbiBmb3JlaWduIHZnCitTSUQxPXNpZGZvb2ZpbGUxCitTSUQyPXNpZGZvb2ZpbGUyCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkTFZNTE9DQUwKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkLCBtYWtpbmcgdGhlIHZnIGZvcmVpZ24KK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCisjIG5vcm1hbCB2Z3MgZG9lc24ndCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBzZWUgdGhlIHZnCit2Z3MgLS1mb3JlaWduID5lcnIKK2dyZXAgJHZnMSBlcnIKKyMgY2Fubm90IGNsZWFyIHRoZSBzeXN0ZW1faWQgb2YgdGhlIGZvcmVpZ24gdmcKK25vdCB2Z2NoYW5nZSAtLXllcyAtLXN5c3RlbWlkICIiICR2ZzEKKyMgY2Fubm90IHNldCB0aGUgc3lzdGVtX2lkIG9mIHRoZSBmb3JlaWduIHZnCitub3QgdmdjaGFuZ2UgLS15ZXMgLS1zeXN0ZW1pZCBmb28gJHZnMQorIyBjaGFuZ2Ugb3VyIHN5c3RlbV9pZCBiYWNrIHNvIHdlIGNhbiByZW1vdmUgdGhlIHZnCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyB2Z2NmZ2JhY2t1cCBiYWNrcyB1cCBmb3JlaWduIHZnIHdpdGggLS1mb3JlaWduCitTSUQxPXNpZGZvb2ZpbGUxCitTSUQyPXNpZGZvb2ZpbGUyCitTSURGSUxFPWV0Yy9sdm1fdGVzdC5jb25mCitybSAtZiAkTFZNTE9DQUwKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcKK3ZncyA+ZXJyCitncmVwICR2ZzEgZXJyCisjIGNoYW5nZSB0aGUgbG9jYWwgc3lzdGVtX2lkLCBtYWtpbmcgdGhlIHZnIGZvcmVpZ24KK2VjaG8gIiRTSUQyIiA+ICRTSURGSUxFCisjIG5vcm1hbCB2Z3MgZG9lc24ndCBzZWUgdGhlIHZnCit2Z3MgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgdXNpbmcgLS1mb3JlaWduIHdlIGNhbiBiYWNrIHVwIHRoZSB2Zworbm90IHZnY2ZnYmFja3VwICR2ZzEKK3ZnY2ZnYmFja3VwIC0tZm9yZWlnbiAkdmcxCisjIGNoYW5nZSBvdXIgc3lzdGVtX2lkIGJhY2sgc28gd2UgY2FuIHJlbW92ZSB0aGUgdmcKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisKKworIyBUZXN0IGhhbmRsaW5nIG9mIGJhZCBzeXN0ZW1faWQgc291cmNlIGNvbmZpZ3VyYXRpb25zCisjIFRoZSBjb21tYW5kcyBzaG91bGQgcHJvY2VlZCB3aXRob3V0IGEgc3lzdGVtX2lkLgorIyBMb29rIGF0IHRoZSB3YXJuaW5nL2Vycm9yIG1lc3NhZ2VzLgorCisjIHZnY3JlYXRlIHdpdGggc291cmNlIG1hY2hpbmVpZCwgd2hlcmUgbm8gJGV0Yy9tYWNoaW5lLWlkIGZpbGUgZXhpc3RzCitpZiBbICEgLWUgJGV0Yy9tYWNoaW5lLWlkIF07IHRoZW4KK1NJRD0iIgorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gbWFjaGluZWlkIgordmdjcmVhdGUgJHZnMSAiJGRldjEiIDI+JjEgfCB0ZWUgZXJyCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECitncmVwICJObyBzeXN0ZW0gSUQgZm91bmQgZnJvbSBzeXN0ZW1faWRfc291cmNlIiBlcnIKK3ZncmVtb3ZlICR2ZzEKK2ZpCisKKyMgdmdjcmVhdGUgd2l0aCBzb3VyY2UgdW5hbWUsIGJ1dCB1bmFtZSBpcyBsb2NhbGhvc3QKKyMgVE9ETzogZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGhvc3RuYW1lIG9uIHRoZSB0ZXN0IG1hY2hpbmUuLi4KKworIyB2Z2NyZWF0ZSB3aXRoIHNvdXJjZSBsdm1sb2NhbCwgYnV0IG5vIGx2bWxvY2FsLmNvbmYgZmlsZQorU0lEPSIiCitybSAtZiAkTFZNTE9DQUwKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGx2bWxvY2FsIgordmdjcmVhdGUgJHZnMSAiJGRldjEiIDI+JjEgfCB0ZWUgZXJyCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECitncmVwICJObyBzeXN0ZW0gSUQgZm91bmQgZnJvbSBzeXN0ZW1faWRfc291cmNlIiBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRMVk1MT0NBTAorCisjIHZnY3JlYXRlIHdpdGggc291cmNlIGx2bWxvY2FsLCBidXQgbm8gc3lzdGVtX2lkID0gIngiIGVudHJ5CitTSUQ9IiIKK0xWTUxPQ0FMPWV0Yy9sdm1sb2NhbC5jb25mCitybSAtZiAkTFZNTE9DQUwKK2VjaG8gImxvY2FsIHsiID4gJExWTUxPQ0FMCisjIGVjaG8gIiAgc3lzdGVtX2lkID0gJFNJRCIgPj4gJExWTUxPQ0FMCitlY2hvICJ9IiA+PiAkTFZNTE9DQUwKK2F1eCBsdm1jb25mICJnbG9iYWwvc3lzdGVtX2lkX3NvdXJjZSA9IGx2bWxvY2FsIgordmdjcmVhdGUgJHZnMSAiJGRldjEiIDI+JjEgfCB0ZWUgZXJyCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECitncmVwICJObyBzeXN0ZW0gSUQgZm91bmQgZnJvbSBzeXN0ZW1faWRfc291cmNlIiBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRMVk1MT0NBTAorCisjIHZnY3JlYXRlIHdpdGggc291cmNlIGx2bWxvY2FsLCBhbmQgZW1wdHkgc3RyaW5nIHN5c3RlbV9pZCA9ICIiCitTSUQ9IiIKK0xWTUxPQ0FMPWV0Yy9sdm1sb2NhbC5jb25mCitybSAtZiAkTFZNTE9DQUwKK2VjaG8gImxvY2FsIHsiID4gJExWTUxPQ0FMCitlY2hvICIgIHN5c3RlbV9pZCA9IFwiXCIiID4+ICRMVk1MT0NBTAorZWNobyAifSIgPj4gJExWTUxPQ0FMCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBsdm1sb2NhbCIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAyPiYxIHwgdGVlIGVycgordmdzIC1vK3N5c3RlbWlkICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgc3lzdGVtaWQgJFNJRAorZ3JlcCAiTm8gc3lzdGVtIElEIGZvdW5kIGZyb20gc3lzdGVtX2lkX3NvdXJjZSIgZXJyCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkTFZNTE9DQUwKKworIyB2Z2NyZWF0ZSB3aXRoIHNvdXJjZSBmaWxlLCBidXQgbm8gc3lzdGVtX2lkX2ZpbGUgY29uZmlnCitTSUQ9IiIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIgordmdjcmVhdGUgJHZnMSAiJGRldjEiIDI+JjEgfCB0ZWUgZXJyCit2Z3MgLW8rc3lzdGVtaWQgJHZnMQorY2hlY2sgdmdfZmllbGQgJHZnMSBzeXN0ZW1pZCAkU0lECitncmVwICJObyBzeXN0ZW0gSUQgZm91bmQgZnJvbSBzeXN0ZW1faWRfc291cmNlIiBlcnIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgdmdjcmVhdGUgd2l0aCBzb3VyY2UgZmlsZSwgYnV0IHN5c3RlbV9pZF9maWxlIGRvZXMgbm90IGV4aXN0CitTSUQ9IiIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgMj4mMSB8IHRlZSBlcnIKK3ZncyAtbytzeXN0ZW1pZCAkdmcxCitjaGVjayB2Z19maWVsZCAkdmcxIHN5c3RlbWlkICRTSUQKK2dyZXAgIk5vIHN5c3RlbSBJRCBmb3VuZCBmcm9tIHN5c3RlbV9pZF9zb3VyY2UiIGVycgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworCisjIFRlc3QgY2FzZXMgd2hlcmUgbHZtZXRhZCBjYWNoZSBvZiBhIGZvcmVpZ24gVkcgYXJlIG91dCBvZiBkYXRlCisjIGJlY2F1c2UgdGhlIGZvcmVpZ24gb3duZXIgaGFzIGNoYW5nZWQgdGhlIFZHLgorCit0ZXN0ICEgLWUgTE9DQUxfTFZNRVRBRCAmJiBleGl0IDAKKworIyBXaGVuIGEgZm9yZWlnbiB2ZyBpcyBuZXdlciBvbiBkaXNrIHRoYW4gaW4gbHZtZXRhZCwgdXNpbmcgLS1mb3JlaWduCisjIHNob3VsZCBmaW5kIHRoZSBuZXdlciB2ZXJzaW9uLiAgVGhpcyBzaW11bGF0ZXMgYSBmb3JlaWduIGhvc3QgY2hhbmdpbmcKKyMgZm9yZWlnbiB2ZyBieSB0dXJuaW5nIG9mZiBsdm1ldGFkIHdoZW4gd2UgY3JlYXRlIGFuIGx2IGluIHRoZSB2Zy4KK1NJRDE9c2lkZm9vZmlsZTEKK1NJRDI9c2lkZm9vZmlsZTIKK1NJREZJTEU9ZXRjL2x2bV90ZXN0LmNvbmYKK3JtIC1mICRTSURGSUxFCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQorYXV4IGx2bWNvbmYgImdsb2JhbC9zeXN0ZW1faWRfc291cmNlID0gZmlsZSIgXAorCSAgICAiZ2xvYmFsL3N5c3RlbV9pZF9maWxlID0gXCIkU0lERklMRVwiIgorIyBjcmVhdGUgYSB2ZyB3aXRoIGFuIGx2Cit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK2x2Y3JlYXRlIC1uICRsdjEgLWwgMiAtYW4gJHZnMQorIyBub3JtYWwgdmdzIHNlZXMgdGhlIHZnIGFuZCBsdgordmdzID5lcnIKK2dyZXAgJHZnMSBlcnIKK2NoZWNrIGx2X2V4aXN0cyAkdmcxICRsdjEKKyMgZ28gYXJvdW5kIGx2bWV0YWQgdG8gY3JlYXRlIGFub3RoZXIgbHYgaW4gdGhlIHZnLAorIyBmb3JjaW5nIHRoZSBsdm1ldGFkIGNvcHkgdG8gYmUgb2xkZXIgdGhhbiBvbiBkaXNrLgorYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDAnCitsdmNyZWF0ZSAtbiAkbHYyIC1sIDIgLWFuICR2ZzEKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAxJworIyB2ZXJpZnkgdGhhdCB0aGUgc2Vjb25kIGx2IGlzIG5vdCBpbiBsdm1ldGFkCitsdnMgJHZnMSA+ZXJyCitncmVwICRsdjEgZXJyCitub3QgZ3JlcCAkbHYyIGVycgorIyBjaGFuZ2Ugb3VyIHN5c3RlbV9pZCwgbWFraW5nIHRoZSB2ZyBmb3JlaWduCitlY2hvICIkU0lEMiIgPiAkU0lERklMRQordmdzID5lcnIKK25vdCBncmVwICR2ZzEgZXJyCisjIHVzaW5nIC0tZm9yZWlnbiwgd2Ugd2lsbCBnZXQgdGhlIGxhdGVzdCB2ZyBmcm9tIGRpc2sKK2x2cyAtLWZvcmVpZ24gJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRsdjEgZXJyCitncmVwICRsdjIgZXJyCisjIGNoYW5nZSBvdXIgc3lzdGVtX2lkIGJhY2sgdG8gbWF0Y2ggdGhlIHZnIHNvIGl0J3Mgbm90IGZvcmVpZ24KK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCitsdnJlbW92ZSAkdmcxLyRsdjEKK2x2cmVtb3ZlICR2ZzEvJGx2MgordmdyZW1vdmUgJHZnMQorcm0gLWYgJFNJREZJTEUKKworIyB2Z2ltcG9ydCBzaG91bGQgZmluZCB0aGUgZXhwb3J0ZWQgdmcgb24gZGlzayBldmVuIHRob3VnaAorIyBsdm1ldGFkJ3MgY29weSBvZiB0aGUgdmcgc2hvd3MgaXQncyBmb3JlaWduLgorU0lEMT1zaWRmb29maWxlMQorU0lEMj1zaWRmb29maWxlMgorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnIHdpdGggYW4gbHYKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorbHZjcmVhdGUgLW4gJGx2MSAtbCAyIC1hbiAkdmcxCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcgYW5kIGx2Cit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorIyBnbyBhcm91bmQgbHZtZXRhZCB0byBleHBvcnQgdGhlIHZnIHNvIHRoYXQgbHZtZXRhZCBzdGlsbAorIyBoYXMgdGhlIG9yaWdpbmFsIHZnIG93bmVkIGJ5IFNJRDEgaW4gaXRzIGNhY2hlCithdXggbHZtY29uZiAnZ2xvYmFsL3VzZV9sdm1ldGFkID0gMCcKK3ZnZXhwb3J0ICR2ZzEKK2F1eCBsdm1jb25mICdnbG9iYWwvdXNlX2x2bWV0YWQgPSAxJworIyBjaGFuZ2UgdGhlIGxvY2FsIHN5c3RlbV9pZCBzbyB0aGUgbHZtZXRhZCBjb3B5IG9mIHRoZSB2ZyBpcyBmb3JlaWduCitlY2hvICIkU0lEMiIgPiAkU0lERklMRQorIyB2ZXJpZnkgdGhhdCBsdm1ldGFkIHRoaW5rcyB0aGUgdmcgaXMgZm9yZWlnbgorIyAoZG9uJ3QgdXNlIC0tZm9yZWlnbiB0byB2ZXJpZnkgdGhpcyBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZQorIyB0aGUgbHZtZXRhZCBjYWNoZSB0byBiZSB1cGRhdGVkLCB3aGljaCB3ZSBkb24ndCB3YW50IHlldCkKK25vdCB2Z3MgJHZnMQorIyBhdHRlbXB0IHRvIGltcG9ydCB0aGUgdmcgdGhhdCBoYXMgYmVlbiBleHBvcnRlZCwgYnV0CisjIHdoaWNoIGx2bWV0YWQgdGhpbmtzIGlzIGZvcmVpZ24KK3ZnaW1wb3J0ICR2ZzEKKyMgdmVyaWZ5IHRoYXQgdGhlIGltcG9ydGVkIHZnIGhhcyBvdXIgc3lzdGVtX2lkCit2Z3MgLW8rc3lzdGVtaWQgJHZnMSA+ZXJyCitncmVwICR2ZzEgZXJyCitncmVwICRTSUQyIGVycgorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorbHZyZW1vdmUgJHZnMS8kbHYxCit2Z3JlbW92ZSAkdmcxCitybSAtZiAkU0lERklMRQorCisjIHB2c2NhbiAtLWNhY2hlIHNob3VsZCBjYXVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBmb3JlaWduIFZHIHRvIGJlCisjIGNhY2hlZCBpbiBsdm1ldGFkLiAgV2l0aG91dCB0aGUgLS1jYWNoZSBvcHRpb24sIHB2c2NhbiB3aWxsIHNlZSB0aGUgb2xkCisjIHZlcnNpb24gb2YgdGhlIFZHLgorU0lEMT1zaWRmb29maWxlMQorU0lEMj1zaWRmb29maWxlMgorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnIHdpdGggYW4gbHYKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorbHZjcmVhdGUgLW4gJGx2MSAtbCAyIC1hbiAkdmcxCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcgYW5kIGx2Cit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorIyBnbyBhcm91bmQgbHZtZXRhZCB0byBjcmVhdGUgYW5vdGhlciBsdiBpbiB0aGUgdmcsCisjIGZvcmNpbmcgdGhlIGx2bWV0YWQgY29weSB0byBiZSBvbGRlciB0aGFuIG9uIGRpc2suCithdXggbHZtY29uZiAnZ2xvYmFsL3VzZV9sdm1ldGFkID0gMCcKK2x2Y3JlYXRlIC1uICRsdjIgLWwgMiAtYW4gJHZnMQorYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDEnCisjIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgbHYgaXMgbm90IGluIGx2bWV0YWQKK2x2cyAkdmcxID5lcnIKK2dyZXAgJGx2MSBlcnIKK25vdCBncmVwICRsdjIgZXJyCisjIHZlcmlmeSB0aGF0IGFmdGVyIHB2c2NhbiB3aXRob3V0IC0tY2FjaGUsIGx2bWV0YWQgc3RpbGwKKyMgcmVwb3J0cyB0aGUgb2xkIHZlcnNpb24KK3B2c2NhbgorbHZzICR2ZzEgPmVycgorZ3JlcCAkbHYxIGVycgorbm90IGdyZXAgJGx2MiBlcnIKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQsIG1ha2luZyB0aGUgdmcgZm9yZWlnbgorZWNobyAiJFNJRDIiID4gJFNJREZJTEUKK25vdCB2Z3MgJHZnMSA+ZXJyCitub3QgZ3JlcCAkdmcxIGVycgorIyB1c2UgcHZzY2FuIC0tY2FjaGUgdG8gdXBkYXRlIHRoZSBmb3JlaWduIHZnIGluIGx2bWV0YWQKK3B2c2NhbiAtLWNhY2hlCitub3QgdmdzICR2ZzEgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQgYmFjayB0byBTSUQxIHNvIHdlIGNhbiBjaGVjayB0aGF0CisjIGx2bWV0YWQgaGFzIHRoZSBsYXRlc3QgY29weSBvZiB0aGUgdmcgKHdpdGhvdXQgaGF2aW5nCisjIHRvIHVzZSAtLWZvcmVpZ24gdG8gY2hlY2spCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQordmdzICR2ZzEgPmVycgorZ3JlcCAkdmcxIGVycgorbHZzICR2ZzEgPmVycgorZ3JlcCAkbHYxIGVycgorZ3JlcCAkbHYyIGVycgorbHZyZW1vdmUgJHZnMS8kbHYxCitsdnJlbW92ZSAkdmcxLyRsdjIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKyMgcmVwZWF0IHRoZSBzYW1lIHRlc3QgZm9yIHZnc2NhbiBpbnN0ZWFkIG9mIHB2c2NhbgorU0lEMT1zaWRmb29maWxlMQorU0lEMj1zaWRmb29maWxlMgorU0lERklMRT1ldGMvbHZtX3Rlc3QuY29uZgorcm0gLWYgJFNJREZJTEUKK2VjaG8gIiRTSUQxIiA+ICRTSURGSUxFCithdXggbHZtY29uZiAiZ2xvYmFsL3N5c3RlbV9pZF9zb3VyY2UgPSBmaWxlIiBcCisJICAgICJnbG9iYWwvc3lzdGVtX2lkX2ZpbGUgPSBcIiRTSURGSUxFXCIiCisjIGNyZWF0ZSBhIHZnIHdpdGggYW4gbHYKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgorbHZjcmVhdGUgLW4gJGx2MSAtbCAyIC1hbiAkdmcxCisjIG5vcm1hbCB2Z3Mgc2VlcyB0aGUgdmcgYW5kIGx2Cit2Z3MgPmVycgorZ3JlcCAkdmcxIGVycgorY2hlY2sgbHZfZXhpc3RzICR2ZzEgJGx2MQorIyBnbyBhcm91bmQgbHZtZXRhZCB0byBjcmVhdGUgYW5vdGhlciBsdiBpbiB0aGUgdmcsCisjIGZvcmNpbmcgdGhlIGx2bWV0YWQgY29weSB0byBiZSBvbGRlciB0aGFuIG9uIGRpc2suCithdXggbHZtY29uZiAnZ2xvYmFsL3VzZV9sdm1ldGFkID0gMCcKK2x2Y3JlYXRlIC1uICRsdjIgLWwgMiAtYW4gJHZnMQorYXV4IGx2bWNvbmYgJ2dsb2JhbC91c2VfbHZtZXRhZCA9IDEnCisjIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgbHYgaXMgbm90IGluIGx2bWV0YWQKK2x2cyAkdmcxID5lcnIKK2dyZXAgJGx2MSBlcnIKK25vdCBncmVwICRsdjIgZXJyCisjIHZlcmlmeSB0aGF0IGFmdGVyIHZnc2NhbiB3aXRob3V0IC0tY2FjaGUsIGx2bWV0YWQgc3RpbGwKKyMgcmVwb3J0cyB0aGUgb2xkIHZlcnNpb24KK3Znc2NhbgorbHZzICR2ZzEgPmVycgorZ3JlcCAkbHYxIGVycgorbm90IGdyZXAgJGx2MiBlcnIKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQsIG1ha2luZyB0aGUgdmcgZm9yZWlnbgorZWNobyAiJFNJRDIiID4gJFNJREZJTEUKK25vdCB2Z3MgJHZnMSA+ZXJyCitub3QgZ3JlcCAkdmcxIGVycgorIyB1c2UgdmdzY2FuIC0tY2FjaGUgdG8gdXBkYXRlIHRoZSBmb3JlaWduIHZnIGluIGx2bWV0YWQKK3Znc2NhbiAtLWNhY2hlCitub3QgdmdzICR2ZzEgPmVycgorbm90IGdyZXAgJHZnMSBlcnIKKyMgY2hhbmdlIG91ciBzeXN0ZW1faWQgYmFjayB0byBTSUQxIHNvIHdlIGNhbiBjaGVjayB0aGF0CisjIGx2bWV0YWQgaGFzIHRoZSBsYXRlc3QgY29weSBvZiB0aGUgdmcgKHdpdGhvdXQgaGF2aW5nCisjIHRvIHVzZSAtLWZvcmVpZ24gdG8gY2hlY2spCitlY2hvICIkU0lEMSIgPiAkU0lERklMRQordmdzICR2ZzEgPmVycgorZ3JlcCAkdmcxIGVycgorbHZzICR2ZzEgPmVycgorZ3JlcCAkbHYxIGVycgorZ3JlcCAkbHYyIGVycgorbHZyZW1vdmUgJHZnMS8kbHYxCitsdnJlbW92ZSAkdmcxLyRsdjIKK3ZncmVtb3ZlICR2ZzEKK3JtIC1mICRTSURGSUxFCisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90YWdzLnNoIGIvdGVzdC9zaGVsbC90YWdzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmY4NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3RhZ3Muc2gKQEAgLTAsMCArMSw3OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKKyMgdmdjcmVhdGUgd2l0aCAtLWFkZHRhZwordmdjcmVhdGUgLS1hZGR0YWcgZmlyc3R2ZyAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgLS1hZGR0YWcgc2Vjb25kdmcgJHZnMiAiJGRldjMiICIkZGV2NCIKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdGFncyAiZmlyc3R2ZyIKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgdGFncyAic2Vjb25kdmciCit2Z3JlbW92ZSAtZiAkdmcxICR2ZzIKKworIyB2Z2NoYW5nZSB3aXRoIC0tYWRkdGFnIGFuZCAtLWRlbHRhZwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYzIiAiJGRldjQiCit2Z2NoYW5nZSAtLWFkZHRhZyBmaXJzdHZndGFnMSAkdmcxCisjIGFkZGluZyBhIHRhZyBtdWx0aXBsZSB0aW1lcyBpcyBub3QgYW4gZXJyb3IKK3ZnY2hhbmdlIC0tYWRkdGFnIGZpcnN0dmd0YWcyICR2ZzEKK3ZnY2hhbmdlIC0tYWRkdGFnIGZpcnN0dmd0YWcyICR2ZzEKK3ZnY2hhbmdlIC0tYWRkdGFnIGZpcnN0dmd0YWczICR2ZzEKK3ZnY2hhbmdlIC0tYWRkdGFnIHNlY29uZHZndGFnMSAkdmcyCit2Z2NoYW5nZSAtLWFkZHRhZyBzZWNvbmR2Z3RhZzIgJHZnMgordmdjaGFuZ2UgLS1hZGR0YWcgc2Vjb25kdmd0YWczICR2ZzIKK2NoZWNrIHZnX2ZpZWxkIEBmaXJzdHZndGFnMiB0YWdzICJmaXJzdHZndGFnMSxmaXJzdHZndGFnMixmaXJzdHZndGFnMyIKK2NoZWNrIHZnX2ZpZWxkIEBzZWNvbmR2Z3RhZzEgdGFncyAic2Vjb25kdmd0YWcxLHNlY29uZHZndGFnMixzZWNvbmR2Z3RhZzMiCit2Z2NoYW5nZSAtLWRlbHRhZyBmaXJzdHZndGFnMiAkdmcxCitjaGVjayB2Z19maWVsZCBAZmlyc3R2Z3RhZzEgdGFncyAiZmlyc3R2Z3RhZzEsZmlyc3R2Z3RhZzMiCisjIGRlbGV0aW5nIGEgdGFnIG11bHRpcGxlIHRpbWVzIGlzIG5vdCBhbiBlcnJvcgordmdjaGFuZ2UgLS1kZWx0YWcgZmlyc3R2Z3RhZzIgJHZnMQordmdjaGFuZ2UgLS1kZWx0YWcgZmlyc3R2Z3RhZzEgJHZnMgordmdyZW1vdmUgLWYgJHZnMSAkdmcyCisKKyMgbHZjcmVhdGUgd2l0aCAtLWFkZHRhZwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC0tYWRkdGFnIGZpcnN0bHZ0YWcxIC1sIDQgLW4gJGx2MSAkdmcxCitsdmNyZWF0ZSAtLWFkZHRhZyBzZWNvbmRsdnRhZzEgLWwgNCAtbiAkbHYyICR2ZzEKK2NoZWNrIGx2X2ZpZWxkIEBmaXJzdGx2dGFnMSB0YWdzICJmaXJzdGx2dGFnMSIKK25vdCBjaGVjayBsdl9maWVsZCBAc2Vjb25kbHZ0YWcxIHRhZ3MgImZpcnN0bHZ0YWcxIgorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYyIHRhZ3MgInNlY29uZGx2dGFnMSIKK25vdCBjaGVjayBsdl9maWVsZCAkdmcxLyRsdjEgdGFncyAic2Vjb25kbHZ0YWcxIgordmdyZW1vdmUgLWYgJHZnMQorCisjIGx2Y2hhbmdlIHdpdGggLS1hZGR0YWcgYW5kIC0tZGVsdGFnCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLWwgNCAtbiAkbHYxICR2ZzEKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MiAkdmcxCitsdmNoYW5nZSAtLWFkZHRhZyBmaXJzdGx2dGFnMSAkdmcxLyRsdjEKKyMgYWRkaW5nIGEgdGFnIG11bHRpcGxlIHRpbWVzIGlzIG5vdCBhbiBlcnJvcgorbHZjaGFuZ2UgLS1hZGR0YWcgZmlyc3RsdnRhZzIgJHZnMS8kbHYxCitsdmNoYW5nZSAtLWFkZHRhZyBmaXJzdGx2dGFnMiAkdmcxLyRsdjEKK2x2Y2hhbmdlIC0tYWRkdGFnIGZpcnN0bHZ0YWczICR2ZzEvJGx2MQorbHZjaGFuZ2UgLS1hZGR0YWcgc2Vjb25kbHZ0YWcxICR2ZzEvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgc2Vjb25kbHZ0YWcyICR2ZzEvJGx2MgorbHZjaGFuZ2UgLS1hZGR0YWcgc2Vjb25kbHZ0YWczICR2ZzEvJGx2MgorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIHRhZ3MgImZpcnN0bHZ0YWcxLGZpcnN0bHZ0YWcyLGZpcnN0bHZ0YWczIgorbm90IGNoZWNrIGx2X2ZpZWxkICR2ZzEvJGx2MSB0YWdzICJzZWNvbmRsdnRhZzEiCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjIgdGFncyAic2Vjb25kbHZ0YWcxLHNlY29uZGx2dGFnMixzZWNvbmRsdnRhZzMiCitub3QgY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIHRhZ3MgInNlY29uZGx2dGFnMSIKKyMgZGVsZXRpbmcgYSB0YWcgbXVsdGlwbGUgdGltZXMgaXMgbm90IGFuIGVycm9yCitsdmNoYW5nZSAtLWRlbHRhZyBmaXJzdGx2dGFnMiAkdmcxLyRsdjEKK2x2Y2hhbmdlIC0tZGVsdGFnIGZpcnN0bHZ0YWcyICR2ZzEvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYxIHRhZ3MgImZpcnN0bHZ0YWcxLGZpcnN0bHZ0YWczIgorY2hlY2sgbHZfZmllbGQgJHZnMS8kbHYyIHRhZ3MgInNlY29uZGx2dGFnMSxzZWNvbmRsdnRhZzIsc2Vjb25kbHZ0YWczIgorCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90ZXN0LXBhcnRpdGlvbi5zaCBiL3Rlc3Qvc2hlbGwvdGVzdC1wYXJ0aXRpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MzY2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdGVzdC1wYXJ0aXRpb24uc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMKKyMgVGVzdGNhc2UgZm9yIGJ1Z3ppbGxhICM2MjExNzMgCisjIGV4Y2VyY2lzZXMgcGFydGl0aW9uIHRhYmxlIHNjYW5uaW5nIGNvZGUgcGF0aAorIworCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitMVk1fVEVTVF9DT05GSUdfREVWSUNFUz0idHlwZXMgPSBbXCJkZXZpY2UtbWFwcGVyXCIsIDE0Ml0iCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIHNmZGlzayB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAxIDMwCisKK3B2cyAiJGRldjEiCisKKyMgY3JlYXRlIHNtYWxsIHBhcnRpdGlvbiB0YWJsZQorZWNobyAiMSAyIiB8IHNmZGlzayAtLWZvcmNlICIkZGV2MSIKKworYXV4IG5vdGlmeV9sdm1ldGFkICIkZGV2MSIKK25vdCBwdnMgIiRkZXYxIgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90aGluLWF1dG91bW91bnQtZG1ldmVudGQuc2ggYi90ZXN0L3NoZWxsL3RoaW4tYXV0b3Vtb3VudC1kbWV2ZW50ZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI5ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC90aGluLWF1dG91bW91bnQtZG1ldmVudGQuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBubyBhdXRvbWF0aWMgZXh0ZW5zaW9ucywganVzdCB1bW91bnQKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKK2V4cG9ydCBMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQ9JHtMVk1fVEVTVF9USElOX1JFUEFJUl9DTUQtL2Jpbi9mYWxzZX0KKworbW50ZGlyPSIke1BSRUZJWH1tbnQgd2l0aCBzcGFjZSIKK21udHVzZWRpcj0iJHtQUkVGSVh9bW50dXNlIgorCitjbGVhbnVwX21vdW50ZWRfYW5kX3RlYXJkb3duKCkKK3sKKwl1bW91bnQgIiRtbnRkaXIiIDI+L2Rldi9udWxsIHx8IHRydWUKKwl1bW91bnQgIiRtbnR1c2VkaXIiIDI+L2Rldi9udWxsIHx8IHRydWUKKwl2Z3JlbW92ZSAtZmYgJHZnCisJYXV4IHRlYXJkb3duCit9CisKK2lzX2x2X29wZW5lZF8oKQoreworCXRlc3QgJChnZXQgbHZfZmllbGQgIiQxIiBsdl9kZXZpY2Vfb3BlbiAtLWJpbmFyeSkgPSAiMSIKK30KKworLiBsaWIvaW5pdHRlc3QKKworIworIyBNYWluCisjCit3aGljaCBta2ZzLmV4dDQgfHwgc2tpcAorZXhwb3J0IE1LRTJGU19DT05GSUc9IiRURVNURElSL2xpYi9ta2UyZnMuY29uZiIKKworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX2RtZXZlbnRkCisKKyMgVXNlIGF1dG9leHRlbmQgcGVyY2VudCAwIC0gc28gZXh0ZW5zaW9uIGZhaWxzIGFuZCB0cmlnZ2VycyB1bW91bnQuLi4KK2F1eCBsdm1jb25mICJhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3BlcmNlbnQgPSAwIiBcCisgICAgICAgICAgICAiYWN0aXZhdGlvbi90aGluX3Bvb2xfYXV0b2V4dGVuZF90aHJlc2hvbGQgPSA3MCIKKworYXV4IHByZXBhcmVfdmcgMgorCisKK2x2Y3JlYXRlIC1MOE0gLVY4TSAtbiAkbHYxIC1UICR2Zy9wb29sCitsdmNyZWF0ZSAtVjhNIC1uICRsdjIgLVQgJHZnL3Bvb2wKKworbWtmcy5leHQ0ICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK21rZnMuZXh0NCAiJERNX0RFVl9ESVIvJHZnLyRsdjIiCisKK2x2Y2hhbmdlIC0tbW9uaXRvciB5ICR2Zy9wb29sCisKK21rZGlyICIkbW50ZGlyIiAiJG1udHVzZWRpciIKK3RyYXAgJ2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24nIEVYSVQKK21vdW50ICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiICIkbW50ZGlyIgorbW91bnQgIiRETV9ERVZfRElSL21hcHBlci8kdmctJGx2MiIgIiRtbnR1c2VkaXIiCisKKyMgQ2hlY2sgYm90aCBMVnMgYXJlIG9wZW5lZCAofm1vdW50ZWQpCitpc19sdl9vcGVuZWRfICIkdmcvJGx2MSIKK2lzX2x2X29wZW5lZF8gIiR2Zy8kbHYyIgorCit0b3VjaCAiJG1udHVzZWRpci9maWxlJCQiCitzeW5jCisKKyMgUnVubmluZyAna2VlcGVyJyBwcm9jZXNzIHNsZWVwIGhvbGRzIHRoZSBibG9jayBkZXZpY2Ugc3RpbGwgaW4gdXNlCitzbGVlcCA2MCA8ICIkbW50dXNlZGlyL2ZpbGUkJCIgJgorUElEX1NMRUVQPSQhCisKK2x2cyAtYSAkdmcKKyMgRmlsbCBwb29sIGFib3ZlIDk1JSAgKHRvIGNhdXNlICdmb3JjZWQgbGF6eSB1bW91bnQpCitkZCBpZj0vZGV2L3plcm8gb2Y9IiRtbnRkaXIvZmlsZSQkIiBicz0yNTZLIGNvdW50PTIwIGNvbnY9ZmRhdGFzeW5jCitzeW5jCitsdnMgLWEgJHZnCisKKyMgQ291bGQgbG9vcCBoZXJlIGZvciBhIGZldyBzZWNzIHNvIGRtZXZlbnRkIGNhbiBkbyBzb21lIHdvcmsKKyMgSW4gdGhlIHdvcnN0IGNhc2UgY2hlY2sgb25seSBoYXBwZW5zIGV2ZXJ5IDEwIHNlY29uZHMgOigKKyMgV2l0aCBsb3cgd2F0ZXIgbWFyayBpdCBzaG91bGQgcmVhY3Qgd2F5IGZhc3RlcgorZm9yIGkgaW4gJChzZXEgMSAxMikgOyBkbworCWlzX2x2X29wZW5lZF8gIiR2Zy8kbHYxIiB8fCBicmVhaworCXRlc3QgJGkgLWx0IDEyIHx8IGRpZSAiJG1udGRpciBzaG91bGQgaGF2ZSBiZWVuIHVubW91bnRlZCBieSBkbWV2ZW50ZCEiCisJc2xlZXAgMQorZG9uZQorCitsdnMgLWEgJHZnCisKK2lzX2x2X29wZW5lZF8gIiR2Zy8kbHYyIiB8fCBcCisJZGllICIkbW50dXNlZGlyIGlzIG5vdCBtb3VudGVkIGhlcmUgKHNsZWVwIGFscmVhZHkgZXhwaXJlZD8/KSIKKworIyBLaWxsIGRldmljZSBob2xkaW5nIHByb2Nlc3MKK2tpbGwgJFBJRF9TTEVFUAord2FpdAorCitub3QgaXNfbHZfb3BlbmVkXyAiJHZnLyRsdjIiIHx8IHsKKwltb3VudAorCWRpZSAiJG1udHVzZWRpciBzaG91bGQgaGF2ZSBiZWVuIHVubW91bnRlZCBieSBkbWV2ZW50ZCEiCit9CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3RoaW4tZGVmYXVsdHMuc2ggYi90ZXN0L3NoZWxsL3RoaW4tZGVmYXVsdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyNmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdGhpbi1kZWZhdWx0cy5zaApAQCAtMCwwICsxLDQwIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIHRlc3QgZGVmYXVsdHMgZW50ZXJlZCB0aHJvdWdoIGx2bS5jb25mCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDIKKworbHZjcmVhdGUgLVQgLUw4TSAkdmcvcG9vbDAKKworYXV4IGx2bWNvbmYgImFsbG9jYXRpb24vdGhpbl9wb29sX2NodW5rX3NpemUgPSAxMjgiIFwKKwkgICAgImFsbG9jYXRpb24vdGhpbl9wb29sX2Rpc2NhcmRzID0gXCJpZ25vcmVcIiIgXAorCSAgICAiYWxsb2NhdGlvbi90aGluX3Bvb2xfemVybyA9IDAiCisKK2x2Y3JlYXRlIC1UIC1MOE0gJHZnL3Bvb2wxCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMSBjaHVua3NpemUgIjEyOC4wMGsiCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbDEgZGlzY2FyZHMgImlnbm9yZSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sMSB6ZXJvICIiCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90aGluLWZsYWdzLnNoIGIvdGVzdC9zaGVsbC90aGluLWZsYWdzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODc1NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3RoaW4tZmxhZ3Muc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgdGVzdCBwcmVzZW5jZSBvZiB2YXJpb3VzIHRoaW4tcG9vbC90aGluIGZsYWdzCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDMgMCB8fCBza2lwCithdXggdGhpbl9wb29sX2Vycm9yX3dvcmtzXzMyIHx8IHNraXAKKworYXV4IHByZXBhcmVfdmcgMiAyNTYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRlc3RpbmcgZmFpbGluZyB0aGluLXBvb2wgbWV0YWRhdGEgZGV2aWNlICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitsdmNyZWF0ZSAtVCAtTDFNIC0tZXJyb3J3aGVuZnVsbCB5ICR2Zy9wb29sCitsdmNyZWF0ZSAtVjIgLW4gJGx2MiAkdmcvcG9vbAorCithdXggZXJyb3JfZGV2ICAiJGRldjIiIDIwNTQ6MgorIyBDaGVjayBvdXIgJ2x2cycgaXMgbm90IGZsdXNoaW5nIHBvb2wgLSBzaG91bGQgYmUgc3RpbGwgT0sKK2NoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvcG9vbCAiLSIKKyMgRW5mb3JjZSBmbHVzaCBvbiB0aGluIHBvb2wgZGV2aWNlIHRvIG5vdGljZSBlcnJvciBkZXZpY2UuCitkbXNldHVwIHN0YXR1cyAkdmctcG9vbC10cG9vbAorY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy9wb29sICJGIgorY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy8kbHYyICJGIgorYXV4IGVuYWJsZV9kZXYgIiRkZXYyIgorCitsdmNoYW5nZSAtYW4gJHZnCisKKyMgT3ZlcmZpbGwgZGF0YSBhcmVhCitsdmNoYW5nZSAtYXkgJHZnCitkZCBpZj0vZGV2L3plcm8gb2Y9IiRETV9ERVZfRElSL21hcHBlci8kdmctJGx2MiIgYnM9MU0gY291bnQ9MgorY2hlY2sgbHZfYXR0cl9iaXQgaGVhbHRoICR2Zy9wb29sICJEIgorIyBUT0RPIHVzZSBzcGFjZXMgPz8KK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIGx2X2hlYWx0aF9zdGF0dXMgIm91dF9vZl9kYXRhIgorCitsdnJlbW92ZSAtZmYgJHZnCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGVzdGluZyB3aGF0IGhhcHBlbnMgb24gc3lzdGVtIHdpdGhvdXQgdGhpbi1jaGVjayAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitsdmNyZWF0ZSAtTDIwME0gLS1lcnJvcndoZW5mdWxsIHkgLVQgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1WMiAtbiAkbHYyICR2Zy9wb29sCitsdmNoYW5nZSAtYW4gJHZnCisKKyMgRHJvcCB1c2FnZSBvZiAgdGhpbl9jaGVjaworYXV4IGx2bWNvbmYgJ2dsb2JhbC90aGluX2NoZWNrX2V4ZWN1dGFibGUgPSAiIicKKworIyBQcmVwYXJlIHNvbWUgZmFrZSBtZXRhZGF0YSBwcmVmaWxsZWQgdG8gfjEwMCUKK2x2Y3JlYXRlIC1MMiAtbiAkbHYxICR2ZyAjIHRtcCBmb3IgbWV0YWRhdGEKK2F1eCBwcmVwYXJlX3RoaW5fbWV0YWRhdGEgNDkwIDEgfCB0ZWUgZGF0YQorIiRMVk1fVEVTVF9USElOX1JFU1RPUkVfQ01EIiAtaSBkYXRhIC1vICIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiCisKKyMgU3dhcCB2b2x1bWUgd2l0aCByZXN0b3JlZCBmYWtlIG1ldGFkYXRhCitsdmNvbnZlcnQgLXkgLS10aGlucG9vbCAkdmcvcG9vbCAtLXBvb2xtZXRhZGF0YSAkdmcvJGx2MQorCitsdmNoYW5nZSAtYXkgJHZnCisKK2x2Y2hhbmdlIC1heSAkdmcvJGx2MgorIyBQcm92aXNpb25nIGFuZCBsYXN0IGZyZWUgYml0cyBpbiBtZXRhZGF0YQorZGQgaWY9L2Rldi96ZXJvIG9mPSIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjIiIGJzPTMySyBjb3VudD0xCisKK2NoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvcG9vbCAiTSIKKyMgVE9ETyAtIHVzZSBzcGFjZXMgPz8KK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIGx2X2hlYWx0aF9zdGF0dXMgIm1ldGFkYXRhX3JlYWRfb25seSIKK2NoZWNrIGx2X2F0dHJfYml0IGhlYWx0aCAkdmcvJGx2MiAiLSIKKworIyBuZWVkc19jaGVjayBuZWVkcyBuZXdlciB2ZXJzaW9uCitpZiBhdXggaGF2ZV90aGluIDEgMTYgMCA7IHRoZW4KKwljaGVjayBsdl9hdHRyX2JpdCBzdGF0ZSAkdmcvcG9vbCAiYyIKKwljaGVjayBsdl9maWVsZCAkdmcvcG9vbCBsdl9jaGVja19uZWVkZWQgImNoZWNrIG5lZWRlZCIKKworCWRtc2V0dXAgc3VzcGVuZCAkdmctcG9vbC10cG9vbAorCisJIyBzdXNwZW5kZWQgIHRoaW4tcG9vbCB3aXRoIENhcGl0YWwgJ2MnCisJY2hlY2sgbHZfYXR0cl9iaXQgc3RhdGUgJHZnL3Bvb2wgIkMiCisKKwlkbXNldHVwIHJlc3VtZSAkdmctcG9vbC10cG9vbAorCisJbHZyZXNpemUgLUwrMk0gJHZnL3Bvb2xfdG1ldGEKKworCSMgc3RpbGwgcmVxdWlyZSB0aGluX2NoZWNrCisJY2hlY2sgbHZfYXR0cl9iaXQgc3RhdGUgJHZnL3Bvb2wgImMiCitmaQorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3RoaW4tZm9yZWlnbi1kbWV2ZW50ZC5zaCBiL3Rlc3Qvc2hlbGwvdGhpbi1mb3JlaWduLWRtZXZlbnRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzQ4OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3RoaW4tZm9yZWlnbi1kbWV2ZW50ZC5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyB0ZXN0IGZvcmVpbmcgdXNlciBvZiB0aGluLXBvb2wKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK01PVU5UX0RJUj1tbnQKKworY2xlYW51cF9tb3VudGVkX2FuZF90ZWFyZG93bigpCit7CisJdW1vdW50ICIkTU9VTlRfRElSIiB8fCB0cnVlCisJZG1zZXR1cCByZW1vdmUgJFRISU4KKwl2Z3JlbW92ZSAtZmYgJHZnCisJYXV4IHRlYXJkb3duCit9CisKK3BlcmNlbnRfKCkgeworCWdldCBsdl9maWVsZCAkdmcvcG9vbCBkYXRhX3BlcmNlbnQgfCBjdXQgLWQuIC1mMQorfQorCisjCisjIE1haW4KKyMKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAord2hpY2ggbWtmcy5leHQ0IHx8IHNraXAKKworIyBVc2Ugb3VyIG1rZnMgY29uZmlnIGZpbGUgdG8gZ2V0IGFwcHJveGltYXRlbHkgc2FtZSByZXN1bHRzCisjIFRPRE86IG1heWJlIHVzZSBpdCBmb3IgYWxsIHRlc3QgdmlhIHNvbWUgJ3ByZXBhcmUnIGZ1bmN0aW9uCitleHBvcnQgTUtFMkZTX0NPTkZJRz0iJFRFU1RESVIvbGliL21rZTJmcy5jb25mIgorCithdXggcHJlcGFyZV9kbWV2ZW50ZAorYXV4IHByZXBhcmVfcHZzIDIgNjQKKwordmdjcmVhdGUgJHZnIC1zIDY0SyAkKGNhdCBERVZJQ0VTKQorCisjIENyZWF0ZSBuYW1lZCBwb29sIG9ubHkKK2x2Y3JlYXRlIC0tZXJyb3J3aGVuZnVsbCB5IC1MMiAtVCAkdmcvcG9vbAorCitQT09MPSIkdmctcG9vbCIKK1RISU49IiR7UFJFRklYfV90aGluIgorCisjIEZvcmVpbmcgdXNlciBpcyB1c2luZyBvd24gaW9jdGwgY29tbWFuZCB0byBjcmVhdGUgdGhpbiBkZXZpY2VzCitkbXNldHVwIG1lc3NhZ2UgJFBPT0wgMCAiY3JlYXRlX3RoaW4gMCIKK2Rtc2V0dXAgbWVzc2FnZSAkUE9PTCAwICJzZXRfdHJhbnNhY3Rpb25faWQgMCAxIgorCitkbXNldHVwIHN0YXR1cworIyBPbmNlIHRoZSB0cmFuc2FjdGlvbiBpZCBoYXMgY2hhbmdlZCwgbHZtMiBzaGFsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgdGhpbkxWCitmYWlsIGx2Y3JlYXRlIC1WMTAgJHZnL3Bvb2wKKwordHJhcCAnY2xlYW51cF9tb3VudGVkX2FuZF90ZWFyZG93bicgRVhJVAorCisjIDIwTSB0aGluIGRldmljZQorZG1zZXR1cCBjcmVhdGUgJFRISU4gLS10YWJsZSAiMCA0MDk2MCB0aGluICRETV9ERVZfRElSL21hcHBlci8kUE9PTCAwIgorCitkbXNldHVwIHRhYmxlCitkbXNldHVwIGluZm8gLWMKKworbWtkaXIgIiRNT1VOVF9ESVIiCisjIFRoaXMgbWtmcyBzaG91bGQgZmlsbCAyTUIgcG9vbCBvdmVyIDk1JQorIyBubyBhdXRvcmVzaXplIGlzIGNvbmZpZ3VyZWQKK21rZnMuZXh0NCAiJERNX0RFVl9ESVIvbWFwcGVyLyRUSElOIgordGVzdCAkKHBlcmNlbnRfKSAtZ3QgOTUKK21vdW50ICIkRE1fREVWX0RJUi9tYXBwZXIvJFRISU4iICIkTU9VTlRfRElSIgorCitwdmNoYW5nZSAteCBuICIkZGV2MSIgIiRkZXYyIgorCit0ZXN0ICQocGVyY2VudF8pIC1ndCA5NQorIyBDb25maWd1cmUgYXV0b3Jlc2l6ZQorYXV4IGx2bWNvbmYgJ2FjdGl2YXRpb24vdGhpbl9wb29sX2F1dG9leHRlbmRfcGVyY2VudCA9IDEwJyBcCisJICAgICdhY3RpdmF0aW9uL3RoaW5fcG9vbF9hdXRvZXh0ZW5kX3RocmVzaG9sZCA9IDc1JworCisjIEdpdmUgaXQgc29tZSB0aW1lIHRvIGxlZnQgZG1ldmVudGQgZG8gc29tZSAoZmFpbGluZyB0byByZXNpemUpIHdvcmsKK3NsZWVwIDIwCisKKyMgQW5kIGNoZWNrIGZvcmVpZ24gdGhpbiBkZXZpY2UgaXMgc3RpbGwgbW91bnRlZAorbW91bnQgfCBncmVwICIkTU9VTlRfRElSIiB8IGdyZXAgIiRUSElOIgordGVzdCAkKHBlcmNlbnRfKSAtZ3QgOTUKKworcHZjaGFuZ2UgLXggeSAiJGRldjEiICIkZGV2MiIKKworIyBGSVhNRTogQVRNIHRlbGwgZG1ldmVudGQgZXhwbGljaXRlbHkgd2UndmUgY2hhbmdlZCBtZXRhZGF0YQorIyAgICAgICAgaG93ZXZlciBkbWV2ZW50ZCBzaGFsbCBiZSBhd2FyZSBvZiBhbnkgbWV0YWRhdGEgY2hhbmdlCisjICAgICAgICBhbmQgYXV0b21hZ2ljYWxseSByZXRyeSByZXNpemUgb3BlcmF0aW9uIGFmdGVyIHRoYXQuCitsdmNoYW5nZSAtLXJlZnJlc2ggJHZnL3Bvb2wKKworIyBHaXZlIGl0IHNvbWUgdGltZSBhbmQgbGV0IGRtZXZlbnRkIGRvIHNvbWUgd29yaworZm9yIGkgaW4gJChzZXEgMSAxNSkgOyBkbworCXRlc3QgJChwZXJjZW50XykgLWdlIDc1IHx8IGJyZWFrCisJc2xlZXAgMQorZG9uZQorCit0ZXN0ICQocGVyY2VudF8pIC1sdCA3NQorCisjIEFuZCBjaGVjayBmb3JlaWduIHRoaW4gZGV2aWNlIGlzIHN0aWxsIG1vdW50ZWQKK21vdW50IHwgZ3JlcCAiJE1PVU5UX0RJUiIgfCBncmVwICIkVEhJTiIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdGhpbi1tZXJnZS5zaCBiL3Rlc3Qvc2hlbGwvdGhpbi1tZXJnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ0ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC90aGluLW1lcmdlLnNoCkBAIC0wLDAgKzEsMTEzIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIHRlc3QgbWVyZ2Ugb2YgdGhpbiBzbmFwc2hvdAorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK01LRlM9bWtmcy5leHQyCit3aGljaCAkTUtGUyAgfHwgc2tpcAord2hpY2ggZnNjayB8fCBza2lwCisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDIKKworbHZjcmVhdGUgLVQgLUw4TSAkdmcvcG9vbCAtVjEwTSAtbiAkbHYxCitsdmNoYW5nZSAtLWFkZHRhZyB0YWdMICR2Zy8kbHYxCisKK21rZGlyIG1udAorJE1LRlMgIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorbW91bnQgIiRETV9ERVZfRElSLyR2Zy8kbHYxIiBtbnQKK3RvdWNoIG1udC90ZXN0CisKK2x2Y3JlYXRlIC1LIC1zIC1uIHNuYXAgLS1hZGR0YWcgdGFnUyAkdmcvJGx2MQorbWtkaXIgbW50c25hcAorJE1LRlMgIiRETV9ERVZfRElSLyR2Zy9zbmFwIgorbW91bnQgIiRETV9ERVZfRElSLyR2Zy9zbmFwIiBtbnRzbmFwCit0b3VjaCBtbnRzbmFwL3Rlc3Rfc25hcAorCitsdnMgLW8rdGFncyx0aGluX2lkICR2ZworCitsdmNvbnZlcnQgLS1tZXJnZSAkdmcvc25hcAorCit1bW91bnQgbW50CisKKyMgTWVyZ2UgY2Fubm90IGhhcHBlbgorbHZjaGFuZ2UgLS1yZWZyZXNoICR2Zy8kbHYxCitjaGVjayBsdl9maWVsZCAgJHZnLyRsdjEgdGhpbl9pZCAiMSIKKworIyBGYWlscyBzaW5jZSBpdCBjYW5ub3QgZGVhY3RpdmF0ZSBib3RoCitub3QgbHZjaGFuZ2UgLWFuICR2Zy8kbHYxCisKKyMgQnV0IHRlc3QgJGx2MSBpcyBub3QgYWN0aXZlCitjaGVjayBpbmFjdGl2ZSAkdmcgJGx2MQorCisjIEFsc28gc3RpbGwgY2Fubm90IHJlYWN0aXZhdGUgJGx2MQorbm90IGx2Y2hhbmdlIC1heSAkdmcvJGx2MQorCit1bW91bnQgbW50c25hcAorCitsdmRpc3BsYXkgLWEgJHZnIHwgdGVlIG91dAorZ3JlcCAibWVyZ2VkIHdpdGgiIG91dAorZ3JlcCAibWVyZ2luZyB0byIgb3V0CisKKyMgQ2hlY2sgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgbWFuaXB1bGF0aW9uIHdpdGggaGlkZGVuICdzbmFwJworbm90IGx2Y2hhbmdlIC0tcmVmcmVzaCAkdmcvc25hcAorbm90IGx2Y2hhbmdlIC1hbiAkdmcvc25hcAorbm90IGx2cmVtb3ZlICR2Zy9zbmFwCisKKworIyBGaW5hbGx5IGRlYWN0aXZhdGUgJ3NuYXAnIGFnYWluIHZpYSAkbHYxCitsdmNoYW5nZSAtYW4gJHZnLyRsdjEKKworIyBTdGlsbCBtdXN0IG5vdCBiZSBhY3RpdmFibGUKK25vdCBsdmNoYW5nZSAtSyAtYXkgJHZnL3NuYXAKKworbHZzIC1hIC1vICt0YWdzLHRoaW5faWQgJHZnCisKKyMgVGVzdCBpZiBtZXJnZSBoYXBwZW5zCitsdmNoYW5nZSAtYXkgJHZnLyRsdjEKK2NoZWNrIGx2X2V4aXN0cyAkdmcgJGx2MQorY2hlY2sgbHZfZmllbGQgICR2Zy8kbHYxIHRoaW5faWQgIjIiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSB0YWdzICJ0YWdMIgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgc25hcAorCitmc2NrIC1uICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK21vdW50ICIkRE1fREVWX0RJUi8kdmcvJGx2MSIgbW50Cit0ZXN0IC1lIG1udC90ZXN0X3NuYXAKK3Vtb3VudCBtbnQKKworCisjIHRlc3QgaWYgdGhpbiBzbmFwc2hvdCBoYXMgYWxzbyAnb2xkLXNuYXBzaG90JworCitsdmNyZWF0ZSAtcyAtbiBzbmFwICR2Zy8kbHYxCisKKyMgQWxzbyBhZGQgb2xkIHNuYXBzaG90IHRvIHRoaW4gb3JpZ2luCitsdmNyZWF0ZSAtcyAtTDEwIC1uIG9sZHNuYXBvZl8ke2x2MX0gJHZnLyRsdjEKK25vdCBsdmNvbnZlcnQgLS1tZXJnZSAkdmcvc25hcAorJE1LRlMgIiRETV9ERVZfRElSLyR2Zy9vbGRzbmFwb2ZfJHtsdjF9IgorbHZjb252ZXJ0IC0tbWVyZ2UgJHZnL29sZHNuYXBvZl8ke2x2MX0KK2ZzY2sgLW4gIiRETV9ERVZfRElSLyR2Zy8kbHYxIgorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcgb2xkc25hcG9mXyR7bHYxfQorIyBBZGQgb2xkIHNuYXBzaG90IHRvIHRoaW4gc25hcHNob3QKK2x2Y3JlYXRlIC1zIC1MMTAgLW4gb2xkc25hcG9mX3NuYXAgJHZnL3NuYXAKK2x2Y29udmVydCAtLW1lcmdlICR2Zy9zbmFwCitsdnJlbW92ZSAtZiAkdmcvb2xkc25hcG9mX3NuYXAKKwordmdyZW1vdmUgLWZmICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90aGluLW92ZXJwcm92aXNpb25pbmcuc2ggYi90ZXN0L3NoZWxsL3RoaW4tb3ZlcnByb3Zpc2lvbmluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M3NGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC90aGluLW92ZXJwcm92aXNpb25pbmcuc2gKQEAgLTAsMCArMSw3OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgVGVzdCB3YXJucyB3aGVuIHRoaW4gcG9vbCBpcyBvdmVycHJvdmlzaW9uZworCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCithdXggaGF2ZV90aGluIDEgMyAwIHx8IHNraXAKKworIyAyUFZzIGJ5IDMyTQorYXV4IHByZXBhcmVfdmcgMiAzMworCitsdmNyZWF0ZSAtTDMyIC1UICR2Zy9wb29sCisjIGNoZWNrIHRoZXJlIGlzIGxpbmsgbm9kZSBmb3IgVU5VU0VEIHRoaW4tcG9vbAordGVzdCAtZSAiJERNX0RFVl9ESVIvJHZnL3Bvb2wiCisKKyMgbGVhdmUgMTJNIGZyZWUgc3BhY2UKK2x2Y3JlYXRlIC1hbiAtbiAkbHYxIC1MMTYgJHZnIDI+JjEgfCB0ZWUgb3V0Cit2Z3MgJHZnCisKK2x2Y3JlYXRlIC1uIHRoaW4xIC1WMzAgJHZnL3Bvb2wgMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICJXQVJOSU5HOiBTdW0iIG91dAorIyBjaGVjayBhZ2FpbiBsaW5rIG5vZGUgaXMgbm93IGdvbmUgZm9yIGEgVVNFRCB0aGluLXBvb2wKK3Rlc3QgISAtZSAiJERNX0RFVl9ESVIvJHZnL3Bvb2wiCisKKyMgUG9vbCBnZXRzIG92ZXJwcm92aXNpb25lZAorbHZjcmVhdGUgLWFuIC1uIHRoaW4yIC1WNCAkdmcvcG9vbCAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogU3VtIiBvdXQKK2dyZXAgImFtb3VudCBvZiBmcmVlIHNwYWNlIGluIHZvbHVtZSBncm91cCAoMTIuMDAgTWlCKSIgb3V0CisKKyMgRWF0IGFsbCBzcGFjZSBpbiBWRworbHZjcmVhdGUgLWFuIC1uICRsdjIgLUwxMiAkdmcgMj4mMSB8IHRlZSBvdXQKK2dyZXAgIldBUk5JTkc6IFN1bSIgb3V0CitncmVwICJubyBmcmVlIHNwYWNlIGluIHZvbHVtZSBncm91cCIgb3V0CisKK2x2Y3JlYXRlIC1hbiAtbiB0aGluMyAtVjFHICR2Zy9wb29sIDI+JjEgfCB0ZWUgb3V0CitncmVwICJXQVJOSU5HOiBTdW0iIG91dAorZ3JlcCAidGhlIHNpemUgb2Ygd2hvbGUgdm9sdW1lIGdyb3VwIiBvdXQKKworbHZyZW1vdmUgLWZmICR2Zy90aGluMiAkdmcvdGhpbjMgJHZnLyRsdjIKKworIyBDcmVhdGUgMm5kIHRoaW4gcG9vbCBpbiBhIFZHCisKK2x2Y3JlYXRlIC1MNCAtVCAkdmcvcG9vbDIKK2x2Y3JlYXRlIC1WNCAtbiB0aGluMiAkdmcvcG9vbDIgMj4mMSB8IHRlZSBvdXQKK25vdCBncmVwICJXQVJOSU5HOiBTdW0iIG91dAorCitsdmNyZWF0ZSAtYW4gLVY0IC1uIHRoaW4zICR2Zy9wb29sMiAyPiYxIHwgdGVlIG91dAorZ3JlcCAiV0FSTklORzogU3VtIG9mIGFsbCB0aGluIHZvbHVtZSBzaXplcyAoMzguMDAgTWlCKSIgb3V0CitncmVwICJmcmVlIHNwYWNlIGluIHZvbHVtZSBncm91cCAoNi4wMCBNaUIpIiBvdXQKKworbHZjcmVhdGUgLWFuIC1MNiAtbiAkbHYzICR2ZyAyPiYxIHwgdGVlIG91dAorZ3JlcCAibm8gZnJlZSBzcGFjZSBpbiB2b2x1bWUgZ3JvdXAiIG91dAorCitsdnJlbW92ZSAtZmYgJHZnL3RoaW4yICR2Zy90aGluMworCitsdmNyZWF0ZSAtYW4gLVY0IC1uIHRoaW4yICR2Zy9wb29sMiAyPiYxIHwgdGVlIG91dAorbm90IGdyZXAgIldBUk5JTkc6IFN1bSIgb3V0CisKKyMgQ2hlY2sgaWYgcmVzaXplIG5vdGljZXMgcHJvYmxlbQorbHZleHRlbmQgLUwrOCAkdmcvdGhpbjIKKwordmdzICR2ZworCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3RoaW4tcmVzaXplLW1hdGNoLnNoIGIvdGVzdC9zaGVsbC90aGluLXJlc2l6ZS1tYXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcyMjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC90aGluLXJlc2l6ZS1tYXRjaC5zaApAQCAtMCwwICsxLDg2IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIGVuc3VyZSB0aGVyZSBpcyBubyBkYXRhIGxvc3MgZHVyaW5nIHRoaW4tcG9vbCByZXNpemUKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCit0ZXN0IC1lIExPQ0FMX0xWTVBPTExEICYmIHNraXAKKword2hpY2ggbWQ1c3VtIHx8IHNraXAKKworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyIDIwCisKK3ZnY3JlYXRlIC1zIDUxMksgJHZnICQoPCBERVZJQ0VTKQorCitsdmNyZWF0ZSAtTDFNIC1WMk0gLW4gJGx2MSAtVCAkdmcvcG9vbAorCisjIGp1c3QgZW5zdXJlIHdlIGNoZWNrIHdoYXQgd2UgbmVlZCB0byBjaGVjaworY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgc2l6ZSAiMS4wMG0iCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzaXplICIyLjAwbSIKKworIyBwcmVwYXJlIDIwOTcxNTIgIGZpbGUgY29udGVudAorc2VxIDAgMzE1NDY1ID4gMk0KK21kNXN1bSAyTSB8IGN1dCAtZiAxIC1kICcgJyB8IHRlZSBNRDUKK2RkIGlmPTJNIG9mPSIkRE1fREVWX0RJUi9tYXBwZXIvJHZnLSRsdjEiIGJzPTUxMksgY29udj1mZGF0YXN5bmMgPmxvZyAyPiYxICYKKyNkZCBpZj0yTSBvZj0iJERNX0RFVl9ESVIvbWFwcGVyLyR2Zy0kbHYxIiBicz0yTSBvZmxhZz1kaXJlY3QgJgorCisjIGdpdmUgaXQgc29tZSB0aW1lIHRvIGZpbGwgdGhpbi12b2x1bWUKKyMgZXZlbnR1YWxseSBsb29wIHRvIHdhaXQgZm9yIDEwMCUgZnVsbCBwb29sLi4uCitzbGVlcCAuMQorbHZzIC1hICR2ZworCisjIHRoaXMgbXVzdCBub3QgJ2Jsb2NrICYgd2FpdCcgb24gc3VzcGVuZGluZyBmbHVzaAorIyBpZiBpdCB3YWl0cyBvbiB0aGluLXBvb2wncyB0YXJnZXQgdGltZW91dAorIyBpdCB3aWxsIGhhcm0gcXVldWVkIGRhdGEKK2x2ZXh0ZW5kIC1MKzUxMmsgJHZnL3Bvb2wKK2x2ZXh0ZW5kIC1MKzUxMmsgJHZnL3Bvb2wKKworIyBjb2xsZWN0ICdkZCcgcmVzdWx0Cit3YWl0CitjYXQgbG9nCisKK2x2cyAtYSAkdmcKKworZGQgaWY9IiRETV9ERVZfRElSL21hcHBlci8kdmctJGx2MSIgb2Y9Mk0tMiBpZmxhZz1kaXJlY3QKK21kNXN1bSAyTS0yIHwgY3V0IC1mIDEgLWQgJyAnICB8IHRlZSBNRDUtMgorCisjIHRoZXNlIDIgYXJlIHN1cHBvc2VkIHRvIG1hdGNoCitkaWZmIE1ENSAgTUQ1LTIKKworCisjIERvIG5vdCB3YW50IHRvIHNlZSBMaXZlICYgSW5hY3RpdmUgdGFibGUgZW50cnkKK2VjaG8gJChkbV9pbmZvIGF0dHIsbmFtZSkgfCBub3QgZ3JlcCAiTEktLioke1BSRUZJWH0iIHx8IHsKKyAgICAgICAgZG1zZXR1cCB0YWJsZSAtLWluYWN0aXZlIHwgZ3JlcCAke1BSRUZJWH0KKwlkaWUgIkZvdW5kIGRldmljZSB3aXRoIEluYWN0aXZlIHRhYmxlIgorfQorCisjIENoZWNrIHdyYXBwaW5nIGFjdGl2ZSB0aGluLXBvb2wgbGluZWFyIG1hcHBpbmcgaGFzIG1hdGNoaW5nIHNpemUKK1BPT0xTWj0kKGRtc2V0dXAgdGFibGUgJHt2Z30tcG9vbC10cG9vbCB8IGN1dCAtZCAnICcgLWYgMikKK1dSQVBTWj0kKGRtc2V0dXAgdGFibGUgJHt2Z30tcG9vbCB8IGN1dCAtZCAnICcgLWYgMikKKworIworIyBGSVhNRTogY3VycmVudGx5IHJlcXVpcmVzIHRvIHVwZGF0ZSAyIGRlcGVuZGVudCB0YXJnZXRzIGluIG9uZSAncHJlbG9hZCcKKyMgICAgICAgIGx2bTIgY2Fubm90IGhhbmRsZSB0aGlzIGFuZCB3b3VsZCBuZWVkIG9uZSBleHRyYSAtLXJlZnJlc2ggcGFzcy4KKyMgICAgICAgIE9uY2UgcmVzb2x2ZWQgLSBlbmFibGVkIHRoaXMgdGVzdC4KKyMgICAgICAgIE1heWJlIG90aGVyIHNvbHV0aW9uIHdpdGhvdXQgZmFrZSBsaW5lYXIgbWFwcGluZyBjb3VsZCBiZSBmb3VuZC4KKyMgICAgICAgIEV2ZW50dWFsbHkgc3RyaWN0bHkgbWFwIGp1c3Qgc2luZ2xlIHNlY3RvciBhcyBpdCBoYXMgbm8gcmVhbCB1c2U/CisjCisjc2hvdWxkIHRlc3QgIiR7UE9PTFNafSIgPSAiJHtXUkFQU1p9IiB8fCBcCisjICAgICAgICBkaWUgIldyYXBwaW5nIHBvb2wgZGV2aWNlIHNpemUgZG9lcyBub3QgbWF0Y2ggcmVhbCBwb29sIHNpemUiCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90aGluLXJlc3RvcmUuc2ggYi90ZXN0L3NoZWxsL3RoaW4tcmVzdG9yZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBiYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC90aGluLXJlc3RvcmUuc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyB0ZXN0IHJlc3RvcmUgb3BlcmF0aW9uIG9mIHRoaW4gcG9vbCBtZXRhZGF0YQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCisjCisjIE1haW4KKyMKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV92ZyAyCisKK2x2Y3JlYXRlIC1UIC1MOE0gJHZnL3Bvb2wgLVYxME0gLW4gJGx2MQorCit2Z2NmZ2JhY2t1cCAtZiBiYWNrdXAgJHZnCisKKyMgdXNlIG9mIC0tZm9yY2UgaXMgbWFuZGF0b3J5Citub3QgdmdjZmdyZXN0b3JlIC1mIGJhY2t1cCAkdmcKKwordmdjZmdyZXN0b3JlIC1mIGJhY2t1cCAtLWZvcmNlICR2ZworCitjaGVjayBsdl9maWVsZCAkdmcvcG9vbCB0cmFuc2FjdGlvbl9pZCAxCisKK3ZncmVtb3ZlIC1mICR2ZwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC90aGluLXZnbG9jay5zaCBiL3Rlc3Qvc2hlbGwvdGhpbi12Z2xvY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5NjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdGhpbi12Z2xvY2suc2gKQEAgLTAsMCArMSw1NSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgVGVzdCBsb2NraW5nIHdvcmtzIGFuZCBkb2Vzbid0IHVwZGF0ZSBtZXRhZGF0YQorIyBSSEJaOiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTEwNjM1NDIKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKKworZXhwb3J0IExWTV9URVNUX1RISU5fUkVQQUlSX0NNRD0ke0xWTV9URVNUX1RISU5fUkVQQUlSX0NNRC0vYmluL2ZhbHNlfQorCisuIGxpYi9pbml0dGVzdAorCitNS0ZTPW1rZnMuZXh0Mgord2hpY2ggJE1LRlMgfHwgc2tpcAorCithdXggaGF2ZV90aGluIDEgMCAwIHx8IHNraXAKK2F1eCBwcmVwYXJlX3ZnCisKK2x2Y3JlYXRlIC1MMTAgLVQgLVY1IC1uICRsdjEgJHZnL3Bvb2wKK2x2Y3JlYXRlIC1hbiAtVjEwIC1UICR2Zy9wb29sCisKKyRNS0ZTICIkRE1fREVWX0RJUi8kdmcvJGx2MSIKK21rZGlyIG1udAorbW91bnQgIiRETV9ERVZfRElSLyR2Zy8kbHYxIiBtbnQKKworbHZjcmVhdGUgLXMgLW4gc25hcCAkdmcvJGx2MQorY2hlY2sgbHZfZmllbGQgJHZnL3NuYXAgdGhpbl9pZCAiMyIKKworbHZjb252ZXJ0IC0tbWVyZ2UgJHZnL3NuYXAKKwordW1vdW50IG1udAordmdjaGFuZ2UgLWFuICR2ZworCisjIENoZWNrIHJlYm9vdCBjYXNlCit2Z2NoYW5nZSAtYXkgLS1zeXNpbml0ICR2ZworIyBNZXRhZGF0YSBhcmUgc3RpbGwgbm90IHVwZGF0ZWQgKC0tcG9sbCBuKQorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgdGhpbl9pZCAiMSIKK2NoZWNrIGx2X2ZpZWxkICR2Zy9wb29sIHRyYW5zYWN0aW9uX2lkICIzIgorCisjIENoZWNrIHRoZSBtZXRhZGF0YSBhcmUgdXBkYXRlZCBhZnRlciByZWZyZXNoCit2Z2NoYW5nZSAtLXJlZnJlc2ggJHZnCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSB0aGluX2lkICIzIgorY2hlY2sgbHZfZmllbGQgJHZnL3Bvb2wgdHJhbnNhY3Rpb25faWQgIjQiCisKKyNsdnMgLWEgLW8rdHJhbnNhY3Rpb25faWQsdGhpbl9pZCAkdmcKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3RoaW4tdm9sdW1lLWxpc3Quc2ggYi90ZXN0L3NoZWxsL3RoaW4tdm9sdW1lLWxpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1MzUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdGhpbi12b2x1bWUtbGlzdC5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIHRlc3QgcG9vbCBiZWhhdmlvdXIgd2hlbiB2b2x1bWVfbGlzdCBtYXNrcyBhY3RpdmF0aW9uCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKKyMKKyMgTWFpbgorIworYXV4IGhhdmVfdGhpbiAxIDAgMCB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3ZnIDIKKworbHZjcmVhdGUgLVQgLUw4TSAkdmcvcG9vbCAtVjEwTSAtbiAkbHYxCisKKyMgc2tpcCAkdmcgZnJvbSBhY3RpdmF0aW9uCithdXggbHZtY29uZiAiYWN0aXZhdGlvbi92b2x1bWVfbGlzdCA9IFsgXCIkdmcxXCIgXSIKKworIyBXZSBzdGlsbCBjb3VsZCBwYXNzIC0gc2luY2UgcG9vbCBpcyBzdGlsbCBhY3RpdmUKK2x2Y3JlYXRlIC1WMTAgLW4gJGx2MiAtVCAkdmcvcG9vbAorCisjIGJ1dCAkbHYyIGlzIG5vdCBhY3RpdmUKK2NoZWNrIGluYWN0aXZlICR2ZyAkbHYyCisKK3ZnY2hhbmdlIC1hbiAkdmcKKworIyBQb29sIGlzIG5vdCBhY3RpdmUgLSBzbyBpdCBjYW5ub3QgY3JlYXRlIHRoaW4gdm9sdW1lCitub3QgbHZjcmVhdGUgLVYxMCAtVCAkdmcvcG9vbAorCisjIENhbm5vdCBjcmVhdGUgZXZlbiBuZXcgcG9vbAorIyBjaGVjayB0aGVyZSBhcmUgbm90IGxlZnQgZGV2aWNlcyAoUkhCWiAjMTE0MDEyOCkKK25vdCBsdmNyZWF0ZSAtTDEwIC1UICR2Zy9uZXdfcG9vbAorY2hlY2sgbHZfbm90X2V4aXN0cyAkdmcvbmV3X3Bvb2wKKworYXV4IGx2bWNvbmYgImFjdGl2YXRpb24vdm9sdW1lX2xpc3QgPSBbIFwiJHZnXCIgXSIKKworbHZjcmVhdGUgLVYxMCAtVCAkdmcvcG9vbAorCitsdnMgLW8gK3RyYW5zYWN0aW9uX2lkLHRoaW5faWQgJHZnCisKK2x2cmVtb3ZlIC1mZiAkdmcKKworY2hlY2sgdmdfZmllbGQgJHZnIGx2X2NvdW50ICIwIgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3RvcG9sb2d5LXN1cHBvcnQuc2ggYi90ZXN0L3NoZWxsL3RvcG9sb2d5LXN1cHBvcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiMWVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdG9wb2xvZ3ktc3VwcG9ydC5zaApAQCAtMCwwICsxLDEyMSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MyB8fCBza2lwCisKK2x2ZGV2XygpIHsKKyAgICBlY2hvICIkRE1fREVWX0RJUi8kMS8kMiIKK30KKwordGVzdF9zbmFwc2hvdF9tb3VudCgpIHsKKyAgICBsdmNyZWF0ZSAtYWV5IC1MNE0gLW4gJGx2MSAkdmcgIiRkZXYxIgorICAgIG1rZnMuZXh0MyAkKGx2ZGV2XyAkdmcgJGx2MSkKKyAgICBta2RpciB0ZXN0X21udAorICAgIG1vdW50ICIkKGx2ZGV2XyAkdmcgJGx2MSkiIHRlc3RfbW50CisgICAgbHZjcmVhdGUgLUw0TSAtbiAkbHYyIC1zICR2Zy8kbHYxCisgICAgdW1vdW50IHRlc3RfbW50CisgICAgYXV4IHVkZXZfd2FpdAorICAgICMgbW91bnQgdGhlIG9yaWdpbgorICAgIG1vdW50ICIkKGx2ZGV2XyAkdmcgJGx2MSkiIHRlc3RfbW50CisgICAgdW1vdW50IHRlc3RfbW50CisgICAgYXV4IHVkZXZfd2FpdAorICAgICMgbW91bnQgdGhlIHNuYXBzaG90CisgICAgbW91bnQgIiQobHZkZXZfICR2ZyAkbHYyKSIgdGVzdF9tbnQKKyAgICB1bW91bnQgdGVzdF9tbnQKKyAgICBybSAtciB0ZXN0X21udAorICAgIHZnY2hhbmdlIC1hbiAkdmcKKyAgICBsdnJlbW92ZSAtZiAkdmcvJGx2MQorfQorCisjIEZJWE1FIGFkZCBtb3JlIHRvcG9sb2d5LXNwZWNpZmljIHRlc3RzIGFuZCB2YWxpZGF0aW9uIChzdHJpcGVkIExWcywgZXRjKQorCitOVU1fREVWUz0xCitQRVJfREVWX1NJWkU9MzQKK0RFVl9TSVpFPSQoKCROVU1fREVWUyokUEVSX0RFVl9TSVpFKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICJkZXNrdG9wLWNsYXNzIiA0SyBkcml2ZQorIyAobG9naWNhbF9ibG9ja19zaXplPTUxMiwgcGh5c2ljYWxfYmxvY2tfc2l6ZT00MDk2LCBhbGlnbm1lbnRfb2Zmc2V0PTApOgorTE9HSUNBTF9CTE9DS19TSVpFPTUxMgorYXV4IHByZXBhcmVfc2NzaV9kZWJ1Z19kZXYgJERFVl9TSVpFIFwKKyAgICBzZWN0b3Jfc2l6ZT0kTE9HSUNBTF9CTE9DS19TSVpFIHBoeXNibGtfZXhwPTMKKyMgVGVzdCB0aGF0IGtlcm5lbCBzdXBwb3J0cyB0b3BvbG9neQoraWYgWyAhIC1lIC9zeXMvYmxvY2svJChiYXNlbmFtZSAkKDwgU0NTSV9ERUJVR19ERVYpKS9hbGlnbm1lbnRfb2Zmc2V0IF0gOyB0aGVuCisJYXV4IGNsZWFudXBfc2NzaV9kZWJ1Z19kZXYKKwlza2lwCitmaQorY2hlY2sgc3lzZnMgIiQoPCBTQ1NJX0RFQlVHX0RFVikiIHF1ZXVlL2xvZ2ljYWxfYmxvY2tfc2l6ZSAkTE9HSUNBTF9CTE9DS19TSVpFCithdXggcHJlcGFyZV9wdnMgJE5VTV9ERVZTICRQRVJfREVWX1NJWkUKK2dldF9kZXZzCisKK3ZnY3JlYXRlICR2ZyAiJHtERVZJQ0VTW0BdfSIKK3Rlc3Rfc25hcHNob3RfbW91bnQKK3ZncmVtb3ZlICR2ZworCithdXggY2xlYW51cF9zY3NpX2RlYnVnX2RldgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgImRlc2t0b3AtY2xhc3MiIDRLIGRyaXZlIHcvIDYzLXNlY3RvciBET1MgcGFydGl0aW9uIGNvbXBlbnNhdGlvbgorIyAobG9naWNhbF9ibG9ja19zaXplPTUxMiwgcGh5c2ljYWxfYmxvY2tfc2l6ZT00MDk2LCBhbGlnbm1lbnRfb2Zmc2V0PTM1ODQpOgorTE9HSUNBTF9CTE9DS19TSVpFPTUxMgorYXV4IHByZXBhcmVfc2NzaV9kZWJ1Z19kZXYgJERFVl9TSVpFIFwKKyAgICBzZWN0b3Jfc2l6ZT0kTE9HSUNBTF9CTE9DS19TSVpFIHBoeXNibGtfZXhwPTMgbG93ZXN0X2FsaWduZWQ9NworY2hlY2sgc3lzZnMgIiQoPCBTQ1NJX0RFQlVHX0RFVikiIHF1ZXVlL2xvZ2ljYWxfYmxvY2tfc2l6ZSAkTE9HSUNBTF9CTE9DS19TSVpFCisKK2F1eCBwcmVwYXJlX3B2cyAkTlVNX0RFVlMgJFBFUl9ERVZfU0laRQordmdjcmVhdGUgJHZnICIke0RFVklDRVNbQF19IgordGVzdF9zbmFwc2hvdF9tb3VudAordmdyZW1vdmUgJHZnCisKK2F1eCBjbGVhbnVwX3Njc2lfZGVidWdfZGV2CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiZW50ZXJwcmlzZS1jbGFzcyIgNEsgZHJpdmUKKyMgKGxvZ2ljYWxfYmxvY2tfc2l6ZT00MDk2LCBwaHlzaWNhbF9ibG9ja19zaXplPTQwOTYsIGFsaWdubWVudF9vZmZzZXQ9MCk6CitMT0dJQ0FMX0JMT0NLX1NJWkU9NDA5NgorYXV4IHByZXBhcmVfc2NzaV9kZWJ1Z19kZXYgJERFVl9TSVpFIFwKKyAgICBzZWN0b3Jfc2l6ZT0kTE9HSUNBTF9CTE9DS19TSVpFCitjaGVjayBzeXNmcyAiJCg8IFNDU0lfREVCVUdfREVWKSIgcXVldWUvbG9naWNhbF9ibG9ja19zaXplICRMT0dJQ0FMX0JMT0NLX1NJWkUKKworYXV4IHByZXBhcmVfcHZzICROVU1fREVWUyAkUEVSX0RFVl9TSVpFCit2Z2NyZWF0ZSAkdmcgIiR7REVWSUNFU1tAXX0iCit0ZXN0X3NuYXBzaG90X21vdW50Cit2Z3JlbW92ZSAkdmcKKworYXV4IGNsZWFudXBfc2NzaV9kZWJ1Z19kZXYKKworIyBzY3NpX2RlYnVnIG9wdGlvbiBvcHRfYmxrcyBhcHBlYXJlZCBpbiBPY3QgMjAxMAorYXV4IGtlcm5lbF9hdF9sZWFzdCAyIDYgMzcgfHwgZXhpdCAwCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiZW50ZXJwcmlzZS1jbGFzcyIgNTEyIGRyaXZlIHcvIEhXIHJhaWQgc3RyaXBlX3NpemUgPSA3NjhLCisjIChsb2dpY2FsX2Jsb2NrX3NpemU9NTEyLCBwaHlzaWNhbF9ibG9ja19zaXplPTUxMiwgYWxpZ25tZW50X29mZnNldD0wKToKKyMgLSB0ZXN0cyBjYXNlIHdoZXJlIG9wdGltYWxfaW9fc2l6ZT03NjhrIDwgZGVmYXVsdCBQRSBhbGlnbm1lbnQ9MU1CCitMT0dJQ0FMX0JMT0NLX1NJWkU9NTEyCithdXggcHJlcGFyZV9zY3NpX2RlYnVnX2RldiAkREVWX1NJWkUgXAorICAgIHNlY3Rvcl9zaXplPSRMT0dJQ0FMX0JMT0NLX1NJWkUgb3B0X2Jsa3M9MTUzNgorCitjaGVjayBzeXNmcyAiJCg8IFNDU0lfREVCVUdfREVWKSIgcXVldWUvbG9naWNhbF9ibG9ja19zaXplICRMT0dJQ0FMX0JMT0NLX1NJWkUKK2NoZWNrIHN5c2ZzICIkKDwgU0NTSV9ERUJVR19ERVYpIiBxdWV1ZS9vcHRpbWFsX2lvX3NpemUgNzg2NDMyCisKK2F1eCBwcmVwYXJlX3B2cyAxICRQRVJfREVWX1NJWkUKKworIyBLZXJuZWwgKDMuMTkpIGNvdWxkIHByb3ZpZGUgd3JvbmcgcmVzdWx0cyAtIGluIHRoaXMgY2FzZSBza2lwCisjIHRlc3Qgd2l0aCBpbmNvcnJlY3QgcmVzdWx0IC0gbHZtMiBjYW4ndCBmaWd1cmUgb3V0IGdvb2QgdmFsdWVzLgorY2hlY2sgc3lzZnMgIiRkZXYxIiBxdWV1ZS9vcHRpbWFsX2lvX3NpemUgNzg2NDMyIHx8IFNIT1VMRD1zaG91bGQKKyRTSE9VTEQgY2hlY2sgcHZfZmllbGQgIiR7REVWSUNFU1tAXX0iIHBlX3N0YXJ0IDc2OC4wMGsKKworYXV4IGNsZWFudXBfc2NzaV9kZWJ1Z19kZXYKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdW5rbm93bi1zZWdtZW50LnNoIGIvdGVzdC9zaGVsbC91bmtub3duLXNlZ21lbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjZWE4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdW5rbm93bi1zZWdtZW50LnNoCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgNAorCitsdmNyZWF0ZSAtYW4gLVpuIC1sIDEgLW4gJGx2MSAkdmcKK2x2Y3JlYXRlIC1hbiAtWm4gLWwgMiAtLXR5cGUgbWlycm9yIC1tIDEgLW4gJGx2MiAkdmcKKwordmdjZmdiYWNrdXAgLWYgYmFrMCAkdmcKK3NlZCAtZSAncyxzdHJpcGVkLHVuc3RyaXBlZCw7cyxtaXJyb3IsdW5taXJyb3IsJyAtaS5vcmlnIGJhazAKK3ZnY2ZncmVzdG9yZSAtZiBiYWswICR2ZworCisjIHdlIGhhdmUgb24tZGlzayBtZXRhZGF0YSB3aXRoIHVua25vd24gc2VnbWVudHMgbm93Citub3QgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MSAjIGNoZWNrIHRoYXQgYWN0aXZhdGlvbiBpcyByZWZ1c2VkCisKKyMgdHJ5IG9uY2UgbW9yZSB0byBjYXRjaCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Mgd2l0aCB2YWxncmluZAorIyB3aGVuIGNsdm1kIGZsdXNoZXMgY21kIG1lbSBwb29sCitub3QgbHZjaGFuZ2UgLWFleSAkdmcvJGx2MSAjIGNoZWNrIHRoYXQgYWN0aXZhdGlvbiBpcyByZWZ1c2VkCisKK3ZnY2ZnYmFja3VwIC1mIGJhazEgJHZnCitjYXQgYmFrMQorc2VkIC1lICdzLHVuc3RyaXBlZCxzdHJpcGVkLDtzLHVubWlycm9yLG1pcnJvciwnIC1pLm9yaWcgYmFrMQordmdjZmdyZXN0b3JlIC1mIGJhazEgJHZnCit2Z2NmZ2JhY2t1cCAtZiBiYWsyICR2ZworCitlZ3JlcCAtdiAnZGVzY3JpcHRpb258c2Vxbm98Y3JlYXRpb25fdGltZXxHZW5lcmF0ZWQnIDwgYmFrMC5vcmlnID4gYQorZWdyZXAgLXYgJ2Rlc2NyaXB0aW9ufHNlcW5vfGNyZWF0aW9uX3RpbWV8R2VuZXJhdGVkJyA8IGJhazIgPiBiCitkaWZmIC11IGEgYgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3VubG9zdC1wdi5zaCBiL3Rlc3Qvc2hlbGwvdW5sb3N0LXB2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2IwMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3VubG9zdC1wdi5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2NoZWNrXygpIHsKKwkjIHZnc2NhbiBuZWVkcyAtLWNhY2hlIG9wdGlvbiBmb3IgZGlyZWN0IHNjYW4gaWYgbHZtZXRhZCBpcyB1c2VkCisJdGVzdCAtZSBMT0NBTF9MVk1FVEFEICYmIGNhY2hlPSItLWNhY2hlIgorCXZnc2NhbiAkY2FjaGUgMj4mMSB8IHRlZSB2Z3NjYW4ub3V0CisJJDEgZ3JlcCAiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAkdmciIHZnc2Nhbi5vdXQKK30KKworYXV4IHByZXBhcmVfdmcgMworCitsdmNyZWF0ZSAtYW4gLVpuIC0tdHlwZSBtaXJyb3IgLW0gMSAtbCAxIC1uIG1pcnJvciAkdmcKKyNsdmNoYW5nZSAtYSBuICR2ZworCisjIHRyeSBvcnBoYW5pbmcgYSBtaXNzaW5nIFBWIChiejQ1ODY3KQorYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCitjaGVja18KK3Rlc3QgLWUgTE9DQUxfTFZNRVRBRCAmJiBwdmNyZWF0ZSAtZiAiJGRldjEiCitjaGVja18gbm90CisKKyMgdHJ5IHRvIGp1c3QgY2hhbmdlIG1ldGFkYXRhOyB3ZSBleHBlY3QgdGhlIG5ldyB2ZXJzaW9uICh3aXRoIE1JU1NJTkdfUFYgc2V0CisjIG9uIHRoZSByZWFwcGVhcmVkIHZvbHVtZSkgdG8gYmUgd3JpdHRlbiBvdXQgdG8gdGhlIHByZXZpb3VzbHkgbWlzc2luZyBQVgordmdleHRlbmQgJHZnICIkZGV2MSIKK2x2Y3JlYXRlIC1sIDEgLW4gYm9vIC1hIG4gLS16ZXJvIG4gJHZnCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorbHZyZW1vdmUgJHZnL21pcnJvcgorYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorY2hlY2tfCit0ZXN0IC1lIExPQ0FMX0xWTUVUQUQgJiYgbHZyZW1vdmUgJHZnL2JvbyAjIEZJWE1FIHRyaWdnZXIgYSB3cml0ZSA6LSgKK2NoZWNrXyBub3QKKworYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKK3ZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlICR2ZworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCit2Z3NjYW4gMj4mMSB8IHRlZSBvdXQKK2dyZXAgJ1JlbW92aW5nIFBWJyBvdXQKKwordmdzIDI+JjEgfCB0ZWUgb3V0Citub3QgZ3JlcCAnUmVtb3ZpbmcgUFYnIG91dAorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZnLWNoZWNrLWRldnMtdXNlZC5zaCBiL3Rlc3Qvc2hlbGwvdmctY2hlY2stZGV2cy11c2VkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmE2OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnLWNoZWNrLWRldnMtdXNlZC5zaApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIyBXZSBuZWVkICJkbSIgZGlyZWN0b3J5IGZvciBkbSBkZXZpY2VzIGluIHN5c2ZzLgorYXV4IGRyaXZlcl9hdF9sZWFzdCA0IDE1IHx8IHNraXAKKworYXV4IHByZXBhcmVfZGV2cyAzIDgKKwordmdjcmVhdGUgJHZnICRkZXYxICRkZXYyCitsdmNyZWF0ZSAtbDEwMCVGUkVFIC1uICRsdiAkdmcKK2RkIGlmPSIkZGV2MSIgb2Y9IiRkZXYzIiBicz0xTQorcHZzIC0tY29uZmlnICJkZXZpY2VzL2dsb2JhbF9maWx0ZXIgPSBbIFwiYXwkZGV2MnxcIiwgXCJhfCRkZXYzfFwiLCBcInJ8Lip8XCIgXSIgMj5lcnIKK2dyZXAgIldBUk5JTkc6IERldmljZSBtaXNtYXRjaCBkZXRlY3RlZCBmb3IgJHZnLyRsdiB3aGljaCBpcyBhY2Nlc3NpbmcgJGRldjEgaW5zdGVhZCBvZiAkZGV2MyIgZXJyCisKK2RkIGlmPS9kZXYvemVybyBvZj0iJGRldjMiIGJzPTFNIGNvdW50PTgKK2x2cmVtb3ZlIC1mZiAkdmcKKworIyBBbHNvIHRlc3QgaWYgc3ViIExWcyB3aXRoIHN1ZmZpeGVzIGFyZSBjb3JyZWN0bHkgcHJvY2Vzc2VkLgorIyBDaGVjayB3aXRoIHRoaWNrIHNuYXBzaG90IHdoaWNoIGhhcyBzdWIgTFZzIHdpdGggLXJlYWwgYW5kIC1jb3cgc3VmZml4IGluIFVVSUQuCitsdmNyZWF0ZSAtbDEgLWFleSAtbiAkbHYgJHZnCitsdmNyZWF0ZSAtbDEgLWFleSAtcyAkdmcvJGx2CitwdnMgMj5lcnIKK25vdCBncmVwICJXQVJOSU5HOiBEZXZpY2UgbWlzbWF0Y2ggZGV0ZWN0ZWQgZm9yICR2Zy8kbHYiIGVycgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZnLW5hbWUtZnJvbS1lbnYuc2ggYi90ZXN0L3NoZWxsL3ZnLW5hbWUtZnJvbS1lbnYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NDQwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmctbmFtZS1mcm9tLWVudi5zaApAQCAtMCwwICsxLDEwNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgdGhlIHZnIG5hbWUgZm9yIGFuIGx2IGZyb20gZW52IHZhcicKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKKworcHZjcmVhdGUgIiRkZXYxIgorcHZjcmVhdGUgIiRkZXYyIgorCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIgorCitleHBvcnQgTFZNX1ZHX05BTUU9JHZnMQorCisjIHNob3VsZCB1c2UgZW52CitsdmNyZWF0ZSAtbiAkbHYxIC1sIDIKK2x2Y3JlYXRlIC1uICRsdjMgLWwgMgorCitsdmNyZWF0ZSAtbiAkbHYyIC1sIDIgJHZnMgorbHZjcmVhdGUgLW4gJGx2NCAtbCAyICR2ZzIKKworbHZzID5lcnIKK2dyZXAgJGx2MSBlcnIKK2dyZXAgJGx2MyBlcnIKK2dyZXAgJGx2MiBlcnIKK2dyZXAgJGx2NCBlcnIKKworbm90IGx2cyAkdmcxID5lcnIKK25vdCBncmVwICRsdjEgZXJyCitub3QgZ3JlcCAkbHYzIGVycgorbm90IGdyZXAgJGx2MiBlcnIKK25vdCBncmVwICRsdjQgZXJyCisKK25vdCBsdnMgJHZnMiA+ZXJyCitub3QgZ3JlcCAkbHYxIGVycgorbm90IGdyZXAgJGx2MyBlcnIKK25vdCBncmVwICRsdjIgZXJyCitub3QgZ3JlcCAkbHY0IGVycgorCitsdnMgJGx2MSA+ZXJyCitncmVwICRsdjEgZXJyCitub3QgZ3JlcCAkbHYzIGVycgorbm90IGdyZXAgJGx2MiBlcnIKK25vdCBncmVwICRsdjQgZXJyCisKK2x2cyAkbHYxICRsdjMgPmVycgorZ3JlcCAkbHYxIGVycgorZ3JlcCAkbHYzIGVycgorbm90IGdyZXAgJGx2MiBlcnIKK25vdCBncmVwICRsdjQgZXJyCisKKyMgc2hvdWxkIHVzZSBlbnYgYW5kIGZhaWwgdG8gZmluZSBsdjQgaW4gdmcxCitub3QgbHZzICRsdjQgPmVycgorbm90IGdyZXAgJGx2MSBlcnIKK25vdCBncmVwICRsdjMgZXJyCitub3QgZ3JlcCAkbHYyIGVycgorbm90IGdyZXAgJGx2NCBlcnIKKworbHZzICR2ZzIvJGx2NCA+ZXJyCitub3QgZ3JlcCAkbHYxIGVycgorbm90IGdyZXAgJGx2MyBlcnIKK25vdCBncmVwICRsdjIgZXJyCitncmVwICRsdjQgZXJyCisKK2x2cyAkdmcyLyRsdjIgJHZnMi8kbHY0ID5lcnIKK25vdCBncmVwICRsdjEgZXJyCitub3QgZ3JlcCAkbHYzIGVycgorZ3JlcCAkbHYyIGVycgorZ3JlcCAkbHY0IGVycgorCisjIHNob3VsZCB1c2UgZW52CitsdmNoYW5nZSAtYW4gJGx2MworbHZyZW1vdmUgJGx2Mworbm90IGx2cmVtb3ZlICRsdjQKKworbHZzID5lcnIKK2dyZXAgJGx2MSBlcnIKK25vdCBncmVwICRsdjMgZXJyCitncmVwICRsdjIgZXJyCitncmVwICRsdjQgZXJyCisKKyMgc2hvdWxkIHVzZSBlbnYKK2x2Y3JlYXRlIC1uICRsdjMgLWwgMgorbHZjaGFuZ2UgLS1hZGR0YWcgZm9vICRsdjMKK2x2Y2hhbmdlIC1hbiAkbHYzCisKKyMgbHZyZW1vdmUgYnkgdGFnIHNob3VsZCBhcHBseSB0byBhbGwgdmdzLCBub3QgZW52IHZnCitsdmNoYW5nZSAtLWFkZHRhZyBmb28gJHZnMi8kbHY0CitsdmNoYW5nZSAtYW4gJHZnMi8kbHY0CitsdnJlbW92ZSBAZm9vCisKK2x2cyA+ZXJyCitncmVwICRsdjEgZXJyCitub3QgZ3JlcCAkbHYzIGVycgorZ3JlcCAkbHYyIGVycgorbm90IGdyZXAgJGx2NCBlcnIKKwordmdyZW1vdmUgLWZmICR2ZzEgJHZnMgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z2NmZ2JhY2t1cC1sdm0xLnNoIGIvdGVzdC9zaGVsbC92Z2NmZ2JhY2t1cC1sdm0xLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhN2YzMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnY2ZnYmFja3VwLWx2bTEuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk0xIiA7IHRoZW4KKworcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2NCIKKworIyBObyBhdXRvbWF0aWMgYmFja3VwCithdXggbHZtY29uZiAiYmFja3VwL2JhY2t1cCA9IDAiCisKKyMgdmdjZmdiYWNrdXAgY29ycmVjdGx5IHN0b3JlcyBtZXRhZGF0YSBMVk0xIHdpdGggbWlzc2luZyBQVnMKKworcHZjcmVhdGUgLU0xICQoY2F0IERFVklDRVMpCit2Z2NyZWF0ZSAtTTEgLWMgbiAkdmcgJChjYXQgREVWSUNFUykKK2x2Y3JlYXRlIC1sMSAtbiAkbHYxICR2ZyAiJGRldjEiCitwdnJlbW92ZSAtZmYgLXkgIiRkZXYyIgorbm90IGx2Y3JlYXRlIC1sMSAtbiAkbHYxICR2ZyAiJGRldjMiCit2Z2NmZ2JhY2t1cCAtZiAiYmFja3VwLiQkIiAkdmcKKworZmkKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z2NmZ2JhY2t1cC11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvdmdjZmdiYWNrdXAtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyMzA0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdjZmdiYWNrdXAtdXNhZ2Uuc2gKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjQiCisKKyMgTm8gYXV0b21hdGljIGJhY2t1cAorYXV4IGx2bWNvbmYgImJhY2t1cC9iYWNrdXAgPSAwIgorCisjIHZnY2ZnYmFja3VwIGhhbmRsZXMgc2ltaWxhciBWRyBuYW1lcyAoYno0NTg5NDEpCit2ZzE9JHtQUkVGSVh9dmcwMAordmcyPSR7UFJFRklYfXZnMDEKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdjcmVhdGUgJHZnMiAiJGRldjIiCisKKyMgRW5mb3JjZXMgc3lzdGVtIGJhY2t1cAordGVzdCAhIC1lIGV0Yy9iYWNrdXAvJHZnMQordGVzdCAhIC1lIGV0Yy9iYWNrdXAvJHZnMgordmdjZmdiYWNrdXAKK3Rlc3QgLWUgZXRjL2JhY2t1cC8kdmcxCit0ZXN0IC1lIGV0Yy9iYWNrdXAvJHZnMgorCithdXggbHZtY29uZiAiYmFja3VwL2FyY2hpdmUgPSAxIgorCit2Z2NmZ2JhY2t1cCAtZiAiYmFrLSVzIiA+b3V0CitncmVwICJWb2x1bWUgZ3JvdXAgXCIkdmcxXCIgc3VjY2Vzc2Z1bGx5IGJhY2tlZCB1cC4iIG91dAorZ3JlcCAiVm9sdW1lIGdyb3VwIFwiJHZnMlwiIHN1Y2Nlc3NmdWxseSBiYWNrZWQgdXAuIiBvdXQKKyMgaW5jcmVhc2Ugc2Vxbm8KK2x2Y3JlYXRlIC1hbiAtWm4gLWwxICR2ZzEKKworaW52YWxpZCB2Z2NmZ3Jlc3RvcmUgLWYgImJhay0kdmcxIiAkdmcxLWludkBsaWQKK2ludmFsaWQgdmdjZmdyZXN0b3JlIC1mICJiYWstJHZnMSIgJHZnMSAkdmcyCisKK3ZnY2ZncmVzdG9yZSAtbCAkdmcxIHwgdGVlIG91dAordGVzdCAkKGdyZXAgRGVzY3JpcHRpb24gb3V0IHwgd2MgLWwpIC1lcSAyCisKK3ZnY2ZncmVzdG9yZSAtbCAtZiAiYmFrLSR2ZzEiICR2ZzEKKwordmdyZW1vdmUgLWZmICR2ZzEgJHZnMgorCisjIHZnY2ZnYmFja3VwIGNvcnJlY3RseSBzdG9yZXMgbWV0YWRhdGEgd2l0aCBtaXNzaW5nIFBWcworIyBhbmQgdmdjZmdyZXN0b3JlIGFibGUgdG8gcmVzdG9yZSB0aGVtIHdoZW4gZGV2aWNlIHJlYXBwZWFycworcHYxX3V1aWQ9JChnZXQgcHZfZmllbGQgIiRkZXYxIiBwdl91dWlkKQorcHYyX3V1aWQ9JChnZXQgcHZfZmllbGQgIiRkZXYyIiBwdl91dWlkKQordmdjcmVhdGUgJHZnICQoY2F0IERFVklDRVMpCitsdmNyZWF0ZSAtbDEgLW4gJGx2MSAkdmcgIiRkZXYxIgorbHZjcmVhdGUgLWwxIC1uICRsdjIgJHZnICIkZGV2MiIKK2x2Y3JlYXRlIC1sMSAtbiAkbHYzICR2ZyAiJGRldjMiCit2Z2NoYW5nZSAtYSBuICR2ZworcHZjcmVhdGUgLWZmIC15ICIkZGV2MSIKK3B2Y3JlYXRlIC1mZiAteSAiJGRldjIiCit2Z2NmZ2JhY2t1cCAtZiAiYmFja3VwLiQkIiAkdmcKK3NlZCAncy9mbGFncyA9IFxbXCJNSVNTSU5HXCJcXS9mbGFncyA9IFxbXF0vJyAiYmFja3VwLiQkIiA+ICJiYWNrdXAuJCQxIgorcHZjcmVhdGUgLWZmIC15IC0tbm9yZXN0b3JlZmlsZSAtdSAkcHYxX3V1aWQgIiRkZXYxIgorcHZjcmVhdGUgLWZmIC15IC0tbm9yZXN0b3JlZmlsZSAtdSAkcHYyX3V1aWQgIiRkZXYyIgorCisjIFRyeSB0byByZWNvdmVyIG5vbmV4aXN0aW5nIHZnbmFtZQorbm90IHZnY2ZncmVzdG9yZSAtZiAiYmFja3VwLiQkMSIgJHt2Z31fbm9uZXhpc3RlbnQKK3ZnY2ZncmVzdG9yZSAtZiAiYmFja3VwLiQkMSIgJHZnCit2Z2NoYW5nZSAtYW4gJHZnCit2Z3JlbW92ZSAtZiAkdmcKKwpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z2NoYW5nZS1tYW55LnNoIGIvdGVzdC9zaGVsbC92Z2NoYW5nZS1tYW55LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnY2hhbmdlLW1hbnkuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgQ2hlY2sgcGVyZm9tYW5jZSBvZiBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24KK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCisjIEZJWE1FOiBsdm1ldGFkIGZhaWxzIHdpdGggaS5lLiAxNTAwIGRldmljZSBvbiBtZW1vcnkgZmFpbHVyZS4uLgorCisjIE51bWJlciBvZiBMVnMgdG8gY3JlYXRlCitERVZJQ0VTPTEwMDAKKyMgT24gbG93LW1lbW9yeSBib3hlcyBsZXQncyBub3Qgc3RyZXNzIHRvbyBtdWNoCit0ZXN0ICIkKGF1eCB0b3RhbF9tZW0pIiAtZ3QgNTI0Mjg4IHx8IERFVklDRVM9MjU2CisKK2F1eCBwcmVwYXJlX3B2cyAxIDQwMAorCit2Z2NyZWF0ZSAtcyAxMjhLICR2ZyAkKGNhdCBERVZJQ0VTKQorCit2Z2NmZ2JhY2t1cCAtZiBkYXRhICR2ZworCisjIEdlbmVyYXRlIGEgbG90IG9mIGRldmljZXMgKHNpemUgb2YgMSBleHRlbnQpCithd2sgLXYgREVWSUNFUz0kREVWSUNFUyAnL15cdFx9LyB7IFwKKyAgICBwcmludGYoIlx0fVxuXHRsb2dpY2FsX3ZvbHVtZXMge1xuIik7XAorICAgIGNudD0wOworICAgIGZvciAoaSA9IDA7IGkgPCBERVZJQ0VTOyBpKyspIHsgXAorCXByaW50ZigiXHRcdGx2b2wlMDZkICB7XG4iLCBpKTtcCisJcHJpbnRmKCJcdFx0XHRpZCA9IFwiJTA2ZC0xMTExLTIyMjItMzMzMy0yMjIyLTExMTEtJTA2ZFwiXG4iLCBpLCBpKTsgXAorCXByaW50ICJcdFx0XHRzdGF0dXMgPSBbXCJSRUFEXCIsIFwiV1JJVEVcIiwgXCJWSVNJQkxFXCJdIjsgXAorCXByaW50ICJcdFx0XHRzZWdtZW50X2NvdW50ID0gMSI7IFwKKwlwcmludCAiXHRcdFx0c2VnbWVudDEgeyI7IFwKKwlwcmludCAiXHRcdFx0XHRzdGFydF9leHRlbnQgPSAwIjsgXAorCXByaW50ICJcdFx0XHRcdGV4dGVudF9jb3VudCA9IDEiOyBcCisJcHJpbnQgIlx0XHRcdFx0dHlwZSA9IFwic3RyaXBlZFwiIjsgXAorCXByaW50ICJcdFx0XHRcdHN0cmlwZV9jb3VudCA9IDEiOyBcCisJcHJpbnQgIlx0XHRcdFx0c3RyaXBlcyA9IFsiOyBcCisJcHJpbnQgIlx0XHRcdFx0XHRcInB2MFwiLCAiIGNudCsrOyBcCisJcHJpbnRmKCJcdFx0XHRcdF1cblx0XHRcdH1cblx0XHR9XG4iKTsgXAorICAgICAgfSBcCisgIH0KKyAge3ByaW50fQorJyBkYXRhID5kYXRhX25ldworCit2Z2NmZ3Jlc3RvcmUgLWYgZGF0YV9uZXcgJHZnCisKKyMgQWN0aXZhdGUgYW5kIGRlYWN0aXZhdGUgYWxsIG9mIHRoZW0KK3ZnY2hhbmdlIC1heSAkdmcKK3ZnY2hhbmdlIC1hbiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdjaGFuZ2UtbWF4bHYuc2ggYi90ZXN0L3NoZWxsL3ZnY2hhbmdlLW1heGx2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDk0NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnY2hhbmdlLW1heGx2LnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZG1ldmVudGQKK2F1eCBwcmVwYXJlX3B2cyAzCisKK3ZnY3JlYXRlIC1sIDIgJHZnICQoY2F0IERFVklDRVMpCitsdmNyZWF0ZSAtYWV5IC1uIG9uZSAtbCAxICR2ZworbHZjcmVhdGUgLW4gdHdvIC1sIDEgJHZnCitub3QgbHZjcmVhdGUgLW4gdGhyZWUgLWwgMSAkdmcKK3ZncmVtb3ZlIC1mZiAkdmcKKwordmdjcmVhdGUgLWwgMyAkdmcgJChjYXQgREVWSUNFUykKK2x2Y3JlYXRlIC1hZXkgLW4gb25lIC1sIDEgJHZnCitsdmNyZWF0ZSAtbiBzbmFwIC1zIC1sIDEgJHZnL29uZQorbHZjcmVhdGUgLW4gdHdvIC1sIDEgJHZnCitub3QgbHZjcmVhdGUgLW4gdGhyZWUgLWwgMSAkdmcKK3ZnY2hhbmdlIC0tbW9uaXRvciB5ICR2ZwordmdjaGFuZ2UgLWFuICR2ZyAyPiYxIHwgdGVlIHZnY2hhbmdlLm91dAorbm90IGdyZXAgImV2ZW50IHNlcnZlciIgdmdjaGFuZ2Uub3V0CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdjaGFuZ2UtcGFydGlhbC5zaCBiL3Rlc3Qvc2hlbGwvdmdjaGFuZ2UtcGFydGlhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzExYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2NoYW5nZS1wYXJ0aWFsLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV92ZyAyCisKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCisKKyMKKyMgVGVzdCBmb3IgYWxsb3dhYmxlIG1ldGFkYXRhIGNoYW5nZXMKKyMgYWRkdGFnX0FSRworIyBkZWx0YWdfQVJHCit2Z2NoYW5nZSAtLWFkZHRhZyBmb28gJHZnCit2Z2NoYW5nZSAtLWRlbHRhZyBmb28gJHZnCisKKyMKKyMgVGVzdCBmb3IgZGlzYWxsb3dlZCBtZXRhZGF0YSBjaGFuZ2VzCisjCisjIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcKK25vdCB2Z2NoYW5nZSAtcCAxMCAkdmcKKworIyByZXNpemVhYmxlX0FSRworbm90IHZnY2hhbmdlIC14IG4gJHZnCisKKyMgdXVpZF9BUkcKK25vdCB2Z2NoYW5nZSAtdSAkdmcKKworIyBwaHlzaWNhbGV4dGVudHNpemVfQVJHCitub3QgdmdjaGFuZ2UgLXMgMk0gJHZnCisKKyMgY2x1c3RlcmVkX0FSRworbm90IHZnY2hhbmdlIC1jIHkgJHZnCisKKyMgYWxsb2NfQVJHCitub3QgdmdjaGFuZ2UgLS1hbGxvYyBhbnl3aGVyZSAkdmcKKworIyB2Z21ldGFkYXRhY29waWVzX0FSRworbm90IHZnY2hhbmdlIC0tdmdtZXRhZGF0YWNvcGllcyAyICR2ZworCisjCisjIEVuc3VyZSB0aGF0IGFsbG93ZWQgYXJncyBkb24ndCBjYXVzZSBkaXNhbGxvd2VkIGFyZ3MgdG8gZ2V0IHRocm91Z2gKKyMKK25vdCB2Z2NoYW5nZSAtcCAxMCAtLWFkZHRhZyBmb28gJHZnCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdjaGFuZ2Utc3lzaW5pdC5zaCBiL3Rlc3Qvc2hlbGwvdmdjaGFuZ2Utc3lzaW5pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQxZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2NoYW5nZS1zeXNpbml0LnNoCkBAIC0wLDAgKzEsNTkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0NMVk1EPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1rZnMuZXh0MyB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAyIDgKKwordmFyX2xvY2s9IiRETV9ERVZfRElSLyR2ZzEvJGx2MSIKKyMga2VlcCBpbiBzeW5jIHdpdGggYXV4IGNvbmZpZ3VyZWQgbG9ja2luZ2RpcgorbW91bnRfZGlyPSJ2YXIvbG9jay9sdm0iCisKK2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24oKQoreworCXVtb3VudCAiJG1vdW50X2RpciIgfHwgdHJ1ZQorCWF1eCB0ZWFyZG93bgorfQorCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIgorCitsdmNyZWF0ZSAtbCAxIC1uICRsdjIgJHZnMgordmdjaGFuZ2UgLWFuICR2ZzIKKworbHZjcmVhdGUgLW4gJGx2MSAtbCAxMDAlRlJFRSAkdmcxCitta2ZzLmV4dDMgLWI0MDk2IC1qICIkdmFyX2xvY2siCisKK3RyYXAgJ2NsZWFudXBfbW91bnRlZF9hbmRfdGVhcmRvd24nIEVYSVQKK21vdW50IC1uIC1yICIkdmFyX2xvY2siICIkbW91bnRfZGlyIgorCisjIGxvY2tpbmcgbXVzdCBmYWlsIG9uIHJlYWQtb25seSBmaWxlc3lzdGVtCitub3QgdmdjaGFuZ2UgLWF5ICR2ZzIKKworIyBuby1sb2NraW5nIHdpdGggLS1zeXNpbml0Cit2Z2NoYW5nZSAtLXN5c2luaXQgLWF5ICR2ZzIKK3Rlc3QgLWIgIiRETV9ERVZfRElSLyR2ZzIvJGx2MiIKKwordmdjaGFuZ2UgLS1zeXNpbml0IC1hbiAkdmcyCit0ZXN0ICEgLWIgIiRETV9ERVZfRElSLyR2ZzIvJGx2MiIKKwordmdjaGFuZ2UgLS1pZ25vcmVsb2NraW5nZmFpbHVyZSAtYXkgJHZnMgorCisjIFRPRE8gbWF5YmUgYWxzbyBzdXBwb3J0IC0taWdub3JlbG9ja2luZ2ZhaWx1cmUgPz8KK3ZncmVtb3ZlIC0tY29uZmlnICdnbG9iYWx7bG9ja2luZ190eXBlPTB9JyAtZmYgJHZnMgordW1vdW50ICIkbW91bnRfZGlyIiB8fCB0cnVlCit2Z3JlbW92ZSAtZmYgJHZnMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z2NoYW5nZS11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvdmdjaGFuZ2UtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2Mzc0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdjaGFuZ2UtdXNhZ2Uuc2gKQEAgLTAsMCArMSwxMjcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdFeGVyY2lzZSBzb21lIHZnY2hhbmdlIGRpYWdub3N0aWNzJworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjEiCit2Z2NyZWF0ZSAtcyA0TSAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKworIyBjYW5ub3QgY2hhbmdlIGFueXRoaW5nIGluIGV4cG9ydGVkIHZnCit2Z2V4cG9ydCAkdmcKK2ZhaWwgdmdjaGFuZ2UgLWF5ICR2ZworZmFpbCB2Z2NoYW5nZSAtcCA4ICR2ZworZmFpbCB2Z2NoYW5nZSAteCBuICR2ZworZmFpbCB2Z2NoYW5nZSAtLWFkZHRhZyB0YWcgJHZnCitmYWlsIHZnY2hhbmdlIC0tZGVsdGFnIHRhZyAkdmcKK2ZhaWwgdmdjaGFuZ2UgLXMgNGsgJHZnCitmYWlsIHZnY2hhbmdlIC0tdXVpZCAkdmcKK2ZhaWwgdmdjaGFuZ2UgLS1hbGxvYyBhbnl3aGVyZSAkdmcKK2ZhaWwgdmdjaGFuZ2UgLWMgeSAkdmcKK3ZnaW1wb3J0ICR2ZworCisjIHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9ucyBvZiBvcHRpb25zLi4uCitpbnZhbGlkIHZnY2hhbmdlIC0taWdub3JlbG9ja2luZ2ZhaWx1cmUgLS11dWlkICR2ZworaW52YWxpZCB2Z2NoYW5nZSAtLXN5c2luaXQgLS1hbGxvYyBub3JtYWwgJHZnCitpbnZhbGlkIHZnY2hhbmdlIC0tc3lzaW5pdCAtLXBvbGwgeSAkdmcKK2ludmFsaWQgdmdjaGFuZ2UgLWFuIC0tcG9sbCB5ICR2ZworaW52YWxpZCB2Z2NoYW5nZSAtYW4gLS1tb25pdG9yIHkgJHZnCitpbnZhbGlkIHZnY2hhbmdlIC1heSAtLXJlZnJlc2ggJHZnCisKK3ZnZGlzcGxheSAkdmcKKworIyB2Z2NoYW5nZSAtcCBNYXhQaHlzaWNhbFZvbHVtZXMgKGJ6MjAyMjMyKQorY2hlY2sgdmdfZmllbGQgJHZnIG1heF9wdiAwCit2Z2NoYW5nZSAtcCAxMjggJHZnCitjaGVjayB2Z19maWVsZCAkdmcgbWF4X3B2IDEyOAorCitwdl9jb3VudD0kKGdldCB2Z19maWVsZCAkdmcgcHZfY291bnQpCitub3QgdmdjaGFuZ2UgLXAgMiAkdmcgMj5lcnIKK2dyZXAgIk1heFBoeXNpY2FsVm9sdW1lcyBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyICRwdl9jb3VudCBvZiBQVnMgZm9yIiBlcnIKK2NoZWNrIHZnX2ZpZWxkICR2ZyBtYXhfcHYgMTI4CisKKyMgdmdjaGFuZ2UgLWwgTWF4TG9naWNhbFZvbHVtZXMKK2NoZWNrIHZnX2ZpZWxkICR2ZyBtYXhfbHYgMAoraW52YWxpZCB2Z2NoYW5nZSAtbCAtMTI4ICR2ZwordmdjaGFuZ2UgLWwgMTI4ICR2ZworY2hlY2sgdmdfZmllbGQgJHZnIG1heF9sdiAxMjgKKworIyB2Z2NoYW5nZSAtcworbHZjcmVhdGUgLWw0IC1uICRsdjEgJHZnCitsdmNyZWF0ZSAtbDQgLW4gJGx2MiAkdmcKK1NJWkVMVjI9JChnZXQgbHZfZmllbGQgJHZnLyRsdjIgc2l6ZSkKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYyIHNlZ19zaXplX3BlICI0IgordmdjaGFuZ2UgLXMgNEsgJHZnCitjaGVjayB2Z19maWVsZCAkdmcgdmdfZXh0ZW50X3NpemUgIjQuMDBrIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjIgc2l6ZSAiJFNJWkVMVjIiCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MiBzZWdfc2l6ZV9wZSAiNDA5NiIKKworCitsdl9jb3VudD0kKGdldCB2Z19maWVsZCAkdmcgbHZfY291bnQpCitub3QgdmdjaGFuZ2UgLWwgMSAkdmcgMj5lcnIKK2dyZXAgIk1heExvZ2ljYWxWb2x1bWUgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG51bWJlciAkbHZfY291bnQgb2YgTFZzIGZvciIgIGVycgorY2hlY2sgdmdfZmllbGQgJHZnIG1heF9sdiAxMjgKKworIyBjaGVjayBub24tcmVzaXplYmlsaXR5CitmYWlsIHZnY2hhbmdlIC14IHkgJHZnCitjaGVjayB2Z19hdHRyX2JpdCByZXNpemVhYmxlICR2ZyAieiIKK3ZnY2hhbmdlIC14IG4gJHZnCitjaGVjayB2Z19hdHRyX2JpdCByZXNpemVhYmxlICR2ZyAiLSIKK2ZhaWwgdmdjaGFuZ2UgLXggbiAkdmcKK2ZhaWwgdmdleHRlbmQgJHZnICIkZGV2NCIKK3ZncmVtb3ZlIC1mZiAkdmcKKworIyBzZXQgY2x1c3RlciBiaXQKK3ZnY3JlYXRlIC1jbiAkdmcgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKyMgY2hlY2sgcHJvbXB0IHRvIGNoYW5nZSBjbHVzdGVyIGJpdCB3aXRob3V0IGdpdmluZyBleHBsaWNpdCB2ZyBuYW1lCitmYWlsIHZnY2hhbmdlIC1jeSAyPiYxIHwgdGVlIG91dAorZ3JlcCAieS9uIiBvdXQKK2NoZWNrIHZnX2F0dHJfYml0IGNsdXN0ZXIgJHZnICItIgorCitsdmNyZWF0ZSAtbDEgLW4gJGx2MSAkdmcKKworIyBjaGVjayBvbiBjbHVzdGVyCisjIGVpdGhlciBza2lwcGVkIGFzIGNsdXN0ZXJlZCAobm9uLWNsdXN0ZXIpLCBvciBhbHJlYWR5IGNsdXN0ZXJlZCAob24gY2x1c3RlcikKK2lmIHRlc3QgLWUgTE9DQUxfQ0xWTUQgOyB0aGVuCisJIyBjYW4gc3dpdGNoIHdpdGggYWN0aXZlIExWCisJdmdjaGFuZ2UgLWN5ICR2ZworCWZhaWwgdmdjaGFuZ2UgLWN5ICR2ZworCSMgY2hlY2sgdm9sdW1lIGlzIGFjdGl2ZSBsb2NhbGx5IGV4Y2x1c2l2ZWx5CisJY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgbHZfYWN0aXZlICJsb2NhbCBleGNsdXNpdmUiCisJY2hlY2sgdmdfYXR0cl9iaXQgY2x1c3RlciAkdmcgImMiCisJIyBjaGVjayB3ZSBkbyBub3Qgc3VwcG9ydCBjb252ZXJzaW9uIG9mIGp1c3QgbG9jYWxseSBhY3RpdmUgTFZzCisJbHZjaGFuZ2UgLWFuICR2ZworCWx2Y2hhbmdlIC1heSAkdmcKKwlub3QgdmdjaGFuZ2UgLWNuICR2ZworCWx2Y2hhbmdlIC1hbiAkdmcKKwlsdmNoYW5nZSAtYWV5ICR2ZworCXZnY2hhbmdlIC1jbiAkdmcKK2Vsc2UKKwkjIG5vIGNsdm1kIGlzIHJ1bm5pbmcKKwlmYWlsIHZnY2hhbmdlIC1jeSAkdmcKKwkjIGNhbid0IHN3aXRjaCB3aXRoIGFjdGl2ZSBMVgorCXZnY2hhbmdlIC0teWVzIC1jeSAkdmcKKwlmYWlsIHZnY2hhbmdlIC0teWVzIC1jeSAkdmcKKwlmYWlsIHZncyAkdmcgMj4mMSB8IHRlZSBvdXQKKwlncmVwICJTa2lwcGluZyBjbHVzdGVyZWQgdm9sdW1lIGdyb3VwIiBvdXQKKwl2Z3MgLS1pZ25vcmVza2lwcGVkY2x1c3RlciAkdmcgMj4mMSB8IHRlZSBvdXQKKwlub3QgZ3JlcCAiU2tpcHBpbmcgY2x1c3RlcmVkIHZvbHVtZSBncm91cCIgb3V0CisJIyByZXNldCBiYWNrIHRvIG5vbi1jbHVzdGVyZWQgVkcgd2l0aCBkaXNhYmxlZCBsb2NraW5nCisJdmdjaGFuZ2UgLWNuICR2ZyAtLWNvbmZpZyAnZ2xvYmFse2xvY2tpbmdfdHlwZT0wfScgJHZnCitmaQorY2hlY2sgdmdfYXR0cl9iaXQgY2x1c3RlciAkdmcgIi0iCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdjay5zaCBiL3Rlc3Qvc2hlbGwvdmdjay5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDkyZjEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2NrLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfdmcgMworbHZjcmVhdGUgLW4gYmxhYmxhIC1MIDEgJHZnCisKK2RkIGlmPS9kZXYvdXJhbmRvbSBicz01MTIgc2Vlaz0yIGNvdW50PTMyIG9mPSIkZGV2MiIKKworIyBUT0RPOiBhdXggbHZtY29uZiAiZ2xvYmFsL2xvY2tpbmdfdHlwZSA9IDQiCisKK3Znc2NhbiAyPiYxIHwgdGVlIHZnc2Nhbi5vdXQKKworaWYgdGVzdCAtZSBMT0NBTF9MVk1FVEFEOyB0aGVuCisgICAgbm90IGdyZXAgIkluY29uc2lzdGVudCBtZXRhZGF0YSBmb3VuZCBmb3IgVkcgJHZnIiB2Z3NjYW4ub3V0CitlbHNlCisgICAgZ3JlcCAiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGZvdW5kIGZvciBWRyAkdmciIHZnc2Nhbi5vdXQKK2ZpCisKK2RkIGlmPS9kZXYvdXJhbmRvbSBicz01MTIgc2Vlaz0yIGNvdW50PTMyIG9mPSIkZGV2MiIKK2F1eCBub3RpZnlfbHZtZXRhZCAiJGRldjIiCisKK3ZnY2sgJHZnIDI+JjEgfCB0ZWUgdmdjay5vdXQKK2dyZXAgSW5jb3JyZWN0IHZnY2sub3V0CisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdjcmVhdGUtbWFueS1wdnMuc2ggYi90ZXN0L3NoZWxsL3ZnY3JlYXRlLW1hbnktcHZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTIyMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnY3JlYXRlLW1hbnktcHZzLnNoCkBAIC0wLDAgKzEsNjUgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIworIyBUZXN0IHRvIGV4ZXJjaXNlIGxhcmdlciBudW1iZXIgb2YgUFZzIGluIGEgVkcKKyMgUmVsYXRlZCB0byBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTczNjAyNworIyAKKyMgT3JpZ2luYWwgbWVhc3VyZWQgdGltZXMgb2YgdGhlIHdob2xlIHRlc3QgY2FzZSBiZWZvcmUgCisjIGFuZCB3aXRoIHRoZSBhY2NlbGVyYXRpb24gcGF0Y2ggZnJvbSBteSBiYXJlIG1ldGFsIGh3CisjIChMZW5vdm8gVDYxLCAyLjJHSHosIDRHIFJBTSwgcmF3aGlkZSAyMDE1LTAzLTA2IHdpdGggbmRlYnVnIGtlcm5lbCk6CisjCisjIGV4cG9ydCBMVk1fVEVTVF9QVlM9MzAwCisjCisjIG1ha2UgY2hlY2tfbG9jYWwgICB+NTJzZWMgIChVOjI5cywgUzoxM3MpCisjIG1ha2UgY2hlY2tfbHZtZXRhZCB+MjBzZWMgIChVOiA0cywgUzogNXMpCisjCisjIFdpdGggcGF0Y2ggZnJvbSAyMDE1LTAzLTA2OgorIworIyBtYWtlIGNoZWNrX2xvY2FsICAgfjMwc2VjICAoVToxMHMsIFM6MTJzKQorIyBtYWtlIGNoZWNrX2x2bWV0YWQgfjIwc2VjICAoVTogNHMsIFM6IDVzKQorIworCisjIFRPRE86IGV4dGVuZCB0ZXN0IHN1aXRlIHRvIG1vbml0b3IgcGVyZm9ybWFuY2UgYW5kIHJlcG9ydCByZWdyZXNzaW9ucy4uLgorCisjIFVzZSBqdXN0IDEwMCB0byBnZXQgJ2RlY2VudCcgc3BlZWQgb24gc2xvdyBib3hlcworTFZNX1RFU1RfUFZTPSR7TFZNX1RFU1RfUFZTOi0xMDB9CisKKyNhdXggcHJlcGFyZV9kZXZzICRMVk1fVEVTVF9QVlMgOAorI3ZnY3JlYXRlICR2ZyAkKDwgREVWSUNFUykKKworIyBwcmVwYXJlX3ZnIGlzIG5vdyBkaXJlY3RseSB1c2luZyBzdGVwcyBhYm92ZQorYXV4IHByZXBhcmVfdmcgJExWTV9URVNUX1BWUworCisjIENoZWNrIHdlIGhhdmUgZGVjZW50IHNwZWVkIHdpdGggdHlwaWNhbCBjb21tYW5kcwordmdzCisKK2x2cworCitwdnMKKworbHZjcmVhdGUgLWwxIC1uICRsdjEgJHZnCisKK2x2cmVtb3ZlIC1mICR2Zy8kbHYxCisKK3ZncmVtb3ZlIC1mZiAkdmcKKworIyAKKyMgVE9ETyBUdXJuIHRoaXMgaW50byBhbm90aGVyIHRlc3QgY2FzZToKKyMKKyNmb3IgaSBpbiAkKHNlcSAxICRMVk1fVEVTVF9QVlMpOyBkbworIwl2Z2NyZWF0ZSAke3ZnfSRpICIkRE1fREVWX0RJUi9tYXBwZXIvJHtQUkVGSVh9cHYkaSIKKyNkb25lCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZnY3JlYXRlLXVzYWdlLnNoIGIvdGVzdC9zaGVsbC92Z2NyZWF0ZS11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTYxMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2NyZWF0ZS11c2FnZS5zaApAQCAtMCwwICsxLDE3MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0nRXhlcmNpc2Ugc29tZSB2Z2NyZWF0ZSBkaWFnbm9zdGljcycKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDMKK3B2Y3JlYXRlICIkZGV2MSIgIiRkZXYyIgorcHZjcmVhdGUgLS1tZXRhZGF0YWNvcGllcyAwICIkZGV2MyIKKwordmc9JHtQUkVGSVh9dmcKKworI0NPTU0gJ3ZnY3JlYXRlIGFjY2VwdHMgOC4wMG0gcGh5c2ljYWxleHRlbnRzaXplIGZvciBWRycKK3ZnY3JlYXRlICR2ZyAtLXBoeXNpY2FsZXh0ZW50c2l6ZSA4LjAwbSAiJGRldjEiICIkZGV2MiIKK2NoZWNrIHZnX2ZpZWxkICAkdmcgdmdfZXh0ZW50X3NpemUgOC4wMG0KK3ZncmVtb3ZlICR2ZworIyB0cnkgdmdjayBhbmQgdG8gcmVtb3ZlIGl0IGFnYWluIC0gc2hvdWxkIGZhaWwgKGJ1dCBub3Qgc2VnZmF1bHQpCitub3QgdmdyZW1vdmUgJHZnCitub3QgdmdjayAkdmcKKworI0NPTU0gJ3ZnY3JlYXRlIGFjY2VwdHMgc21hbGxlciAoMTI4KSBtYXhsb2dpY2Fsdm9sdW1lcyBmb3IgVkcnCit2Z2NyZWF0ZSAkdmcgLS1tYXhsb2dpY2Fsdm9sdW1lcyAxMjggIiRkZXYxIiAiJGRldjIiCitjaGVjayB2Z19maWVsZCAkdmcgbWF4X2x2IDEyOCAKK3ZncmVtb3ZlICR2ZworCisjQ09NTSAndmdjcmVhdGUgYWNjZXB0cyBzbWFsbGVyICgxMjgpIG1heHBoeXNpY2Fsdm9sdW1lcyBmb3IgVkcnCit2Z2NyZWF0ZSAkdmcgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMTI4ICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgdmdfZmllbGQgJHZnIG1heF9wdiAxMjgKK3ZncmVtb3ZlICR2ZworCisjQ09NTSAndmdjcmVhdGUgcmVqZWN0cyBhIHplcm8gcGh5c2ljYWwgZXh0ZW50IHNpemUnCitub3QgdmdjcmVhdGUgLS1waHlzaWNhbGV4dGVudHNpemUgMCAkdmcgIiRkZXYxIiAiJGRldjIiIDI+ZXJyCitncmVwICJQaHlzaWNhbCBleHRlbnQgc2l6ZSBtYXkgbm90IGJlIHplcm8iIGVycgorCisjQ09NTSAndmdjcmVhdGUgcmVqZWN0cyAiaW5oZXJpdCIgYWxsb2NhdGlvbiBwb2xpY3knCitub3QgdmdjcmVhdGUgLS1hbGxvYyBpbmhlcml0ICR2ZyAiJGRldjEiICIkZGV2MiIgMj5lcnIKK2dyZXAgIlZvbHVtZSBHcm91cCBhbGxvY2F0aW9uIHBvbGljeSBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIiBlcnIKKworI0NPTU0gJ3ZnY3JlYXRlIHJlamVjdHMgdmduYW1lICIuIicKK3ZnaW52YWxpZD0uOyAKK25vdCB2Z2NyZWF0ZSAkdmdpbnZhbGlkICIkZGV2MSIgIiRkZXYyIiAyPmVycgorZ3JlcCAiTmV3IHZvbHVtZSBncm91cCBuYW1lIFwiJHZnaW52YWxpZFwiIGlzIGludmFsaWQiIGVycgorCisjQ09NTSAndmdjcmVhdGUgcmVqZWN0cyB2Z25hbWUgZ3JlYXRlciB0aGFuIDEyOCBjaGFyYWN0ZXJzJwordmdpbnZhbGlkPXRoaXNuYW1laXNyaWRpY3Vsb3VzbHlsb25ndG90ZXN0dmFsaWRhdGlvbmNvZGVjaGVja2luZ21heGltdW1zaXpldGhpc2lzd2hhdGhhcHBlbnN3aGVucHJvZ3JhbW1lcnNnZXRib3JlZGFuZG9yYXJlbm90Y3JlYXRpdmVkb250dHJ5dGhpc2F0aG9tZQorbm90IHZnY3JlYXRlICR2Z2ludmFsaWQgIiRkZXYxIiAiJGRldjIiIDI+ZXJyCitncmVwICJOZXcgdm9sdW1lIGdyb3VwIG5hbWUgXCIkdmdpbnZhbGlkXCIgaXMgaW52YWxpZCIgZXJyCisKKyNDT01NICd2Z2NyZWF0ZSByZWplY3RzIGFscmVhZHkgZXhpc3RpbmcgdmduYW1lICIvdG1wLyR2ZyInCisjdG91Y2ggL3RtcC8kdmcKKyNub3QgdmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIiAyPmVycgorI2dyZXAgIk5ldyB2b2x1bWUgZ3JvdXAgbmFtZSBcIiR2Z1wiIGlzIGludmFsaWRcJCIgZXJyCisKKyNDT01NICJ2Z2NyZWF0ZSByZWplY3RzIHJlcGVhdGVkIGludm9jYXRpb24gKHJ1biAyIHRpbWVzKSAoYnoxNzgyMTYpIgordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIgorbm90IHZnY3JlYXRlICR2ZyAiJGRldjEiICIkZGV2MiIKK3ZncmVtb3ZlIC1mZiAkdmcKKworI0NPTU0gJ3ZnY3JlYXRlIHJlamVjdHMgTWF4TG9naWNhbFZvbHVtZXMgPiAyNTUnCitub3QgdmdjcmVhdGUgLS1tZXRhZGF0YXR5cGUgMSAtLW1heGxvZ2ljYWx2b2x1bWVzIDEwMjQgJHZnICIkZGV2MSIgIiRkZXYyIiAyPmVycgorZ3JlcCAiTnVtYmVyIG9mIHZvbHVtZXMgbWF5IG5vdCBleGNlZWQgMjU1IiBlcnIKKworI0NPTU0gInZnY3JlYXRlIGZhaWxzIHdoZW4gdGhlIG9ubHkgcHYgaGFzIC0tbWV0YWRhdGFjb3BpZXMgMCIKK25vdCB2Z2NyZWF0ZSAkdmcgIiRkZXYzIgorCisjIFRlc3QgZGVmYXVsdCAoNE1CKSB2Z19leHRlbnRfc2l6ZSBhcyB3ZWxsIGFzIGxpbWl0cyBvZiBleHRlbnRfc2l6ZQorbm90IHZnY3JlYXRlIC0tcGh5c2ljYWxleHRlbnRzaXplIDBrICR2ZyAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC0tcGh5c2ljYWxleHRlbnRzaXplIDFrICR2ZyAiJGRldjEiICIkZGV2MiIKK2NoZWNrIHZnX2ZpZWxkICR2ZyB2Z19leHRlbnRfc2l6ZSAxLjAwawordmdyZW1vdmUgLWZmICR2Zworbm90IHZnY3JlYXRlIC0tcGh5c2ljYWxleHRlbnRzaXplIDNLICR2ZyAiJGRldjEiICIkZGV2MiIKK25vdCB2Z2NyZWF0ZSAtLXBoeXNpY2FsZXh0ZW50c2l6ZSAxMDI0dCAkdmcgIiRkZXYxIiAiJGRldjIiCisjbm90IHZnY3JlYXRlIC0tcGh5c2ljYWxleHRlbnRzaXplIDFUICR2ZyAiJGRldjEiICIkZGV2MiIKKyMgRklYTUU6IHZnY3JlYXRlIGFsbG93cyBwaHlzaWNhbGV4dGVudHNpemUgbGFyZ2VyIHRoYW4gcHYgc2l6ZSEKKworIyBUZXN0IGRlZmF1bHQgbWF4X2x2LCBtYXhfcHYsIGV4dGVudF9zaXplLCBhbGxvY19wb2xpY3ksIGNsdXN0ZXJlZAordmdjcmVhdGUgJHZnICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgdmdfZmllbGQgJHZnIHZnX2V4dGVudF9zaXplIDQuMDBtCitjaGVjayB2Z19maWVsZCAkdmcgbWF4X2x2IDAKK2NoZWNrIHZnX2ZpZWxkICR2ZyBtYXhfcHYgMAorQVRUUlM9Ind6LS1uLSIKK3Rlc3QgLWUgTE9DQUxfQ0xWTUQgJiYgQVRUUlM9Ind6LS1uYyIKK2NoZWNrIHZnX2ZpZWxkICR2ZyB2Z19hdHRyICRBVFRSUwordmdyZW1vdmUgLWZmICR2ZworCisjIEltcGxpY2l0IHB2Y3JlYXRlIHRlc3RzLCB0ZXN0IHB2Y3JlYXRlIG9wdGlvbnMgb24gdmdjcmVhdGUKKyMgLS1mb3JjZSwgLS15ZXMsIC0tbWV0YWRhdGF7c2l6ZXxjb3BpZXN8dHlwZX0sIC0temVybworIyAtLWRhdGFhbGlnbm1lbnRbb2Zmc2V0XQorcHZyZW1vdmUgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAtLWZvcmNlIC0teWVzIC0temVybyB5ICR2ZyAiJGRldjEiICIkZGV2MiIKK3ZncmVtb3ZlIC1mICR2ZworcHZyZW1vdmUgLWYgIiRkZXYxIgorCitmb3IgaSBpbiAwIDEgMiAzCitkbworIyB2Z2NyZWF0ZSAobHZtMikgc3VjY2VlZHMgd3JpdGluZyBMVk0gbGFiZWwgYXQgc2VjdG9yICRpCisgICAgdmdjcmVhdGUgLS1sYWJlbHNlY3RvciAkaSAkdmcgIiRkZXYxIgorICAgIGRkIGlmPSIkZGV2MSIgYnM9NTEyIHNraXA9JGkgY291bnQ9MSAyPi9kZXYvbnVsbCB8IHN0cmluZ3MgfCBncmVwIExBQkVMT05FID4vZGV2L251bGwKKyAgICB2Z3JlbW92ZSAtZiAkdmcKKyAgICBwdnJlbW92ZSAtZiAiJGRldjEiCitkb25lCisKKyMgcHZtZXRhZGF0YWNvcGllcworZm9yIGkgaW4gMSAyCitkbworICAgIHZnY3JlYXRlIC0tcHZtZXRhZGF0YWNvcGllcyAkaSAkdmcgIiRkZXYxIgorICAgIGNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50ICRpCisgICAgdmdyZW1vdmUgLWYgJHZnCisgICAgcHZyZW1vdmUgLWYgIiRkZXYxIgorZG9uZQorbm90IHZnY3JlYXRlIC0tcHZtZXRhZGF0YWNvcGllcyAwICR2ZyAiJGRldjEiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDEgIiRkZXYyIgordmdjcmVhdGUgLS1wdm1ldGFkYXRhY29waWVzIDAgJHZnICIkZGV2MSIgIiRkZXYyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwdl9tZGFfY291bnQgMAorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9tZGFfY291bnQgMQordmdyZW1vdmUgLWYgJHZnCitwdnJlbW92ZSAtZiAiJGRldjEiCisKKyMgbWV0YWRhdGFzaXplLCBkYXRhYWxpZ25tZW50LCBkYXRhYWxpZ25tZW50b2Zmc2V0CisjQ09NTSAncHZjcmVhdGUgc2V0cyBkYXRhIG9mZnNldCBuZXh0IHRvIG1kYSBhcmVhJwordmdjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTAwayAtLWRhdGFhbGlnbm1lbnQgMTAwayAkdmcgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAyMDAuMDBrCit2Z3JlbW92ZSAtZiAkdmcKK3B2cmVtb3ZlIC1mICIkZGV2MSIKKworIyBkYXRhIGFyZWEgaXMgYWxpZ25lZCB0byAxTSBieSBkZWZhdWx0LAorIyBkYXRhIGFyZWEgc3RhcnQgaXMgc2hpZnRlZCBieSB0aGUgc3BlY2lmaWVkIGFsaWdubWVudF9vZmZzZXQKK3B2X2FsaWduPTEwNTIxNjAgIyAxMDQ4NTc2ICsgKDcqNTEyKQordmdjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayAtLWRhdGFhbGlnbm1lbnRvZmZzZXQgN3MgJHZnICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgJHtwdl9hbGlnbn1CIC0tdW5pdHMgYgordmdyZW1vdmUgLWYgJHZnCitwdnJlbW92ZSAtZiAiJGRldjEiCisKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk0xIiA7IHRoZW4KK21kYXR5cGVzPScxIDInCitlbHNlCittZGF0eXBlcz0nMicKK2ZpCisKKyMgbWV0YWRhdGF0eXBlCitmb3IgaSBpbiAkbWRhdHlwZXMKK2RvCisgICAgdmdjcmVhdGUgLU0gJGkgJHZnICIkZGV2MSIKKyAgICBjaGVjayB2Z19maWVsZCAkdmcgdmdfZm10IGx2bSRpCisgICAgdmdyZW1vdmUgLWYgJHZnCisgICAgcHZyZW1vdmUgLWYgIiRkZXYxIgorZG9uZQorCisjIHZnY3JlYXRlIGZhaWxzIGlmIHB2IGJlbG9uZ3MgdG8gZXhpc3RpbmcgdmcKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCitub3QgdmdjcmVhdGUgJHZnMiAiJGRldjIiCit2Z3JlbW92ZSAtZiAkdmcxCitwdnJlbW92ZSAtZiAiJGRldjEiICIkZGV2MiIKKworIyBhbGwgUFZzIGV4aXN0IGluIHRoZSBWRyBhZnRlciBjcmVhdGVkCitwdmNyZWF0ZSAiJGRldjEiCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHZnX25hbWUgJHZnMQorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzEKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MyIgdmdfbmFtZSAkdmcxCit2Z3JlbW92ZSAtZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZnZXh0ZW5kLXJlc3RvcmVtaXNzaW5nLnNoIGIvdGVzdC9zaGVsbC92Z2V4dGVuZC1yZXN0b3JlbWlzc2luZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ2NTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2V4dGVuZC1yZXN0b3JlbWlzc2luZy5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDMKKworbHZjcmVhdGUgLWFuIC1abiAtLXR5cGUgbWlycm9yIC1tIDEgLWwgMSAtbiBtaXJyb3IgJHZnCitsdmNyZWF0ZSAtbCAxIC1uIGx2MSAkdmcgIiRkZXYxIgorCisjIHZnZXh0ZW5kIHJlcXVpcmUgdmduYW1lCitpbnZhbGlkIHZnZXh0ZW5kCisjIC0tbWV0YWRhdGFjb3BpZXMgPT4gdXNlIC0tcHZtZXRhZGF0YWNvcGllcworaW52YWxpZCB2Z2V4dGVuZCAtLW1ldGFkYXRhY29waWVzIDMgJHZnICIkZGV2MSIgMj4mMSB8IHRlZSBvdXQKK2dyZXAgLS0gInVzZSAtLXB2bWV0YWRhdGFjb3BpZXMiIG91dAorCisjIFZHIG5hbWUgc2hvdWxkIGV4aXN0CitmYWlsIHZnZXh0ZW5kIC0tcmVzdG9yZW1pc3NpbmcgJHZnLWludmFsaWQgIiRkZXYxIgorCisjIHRyeSB0byBqdXN0IGNoYW5nZSBtZXRhZGF0YTsgd2UgZXhwZWN0IHRoZSBuZXcgdmVyc2lvbiAod2l0aCBNSVNTSU5HX1BWIHNldAorIyBvbiB0aGUgcmVhcHBlYXJlZCB2b2x1bWUpIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBwcmV2aW91c2x5IG1pc3NpbmcgUFYKK2F1eCBkaXNhYmxlX2RldiAiJGRldjEiCitsdnJlbW92ZSAkdmcvbWlycm9yCisjIHRyeSByZXN0b3JlIHRoZSBzdGlsbCBleGlzdGluZyBkZXZpY2UKK2ZhaWwgdmdleHRlbmQgLS1yZXN0b3JlICR2ZyAiJGRldjEiCithdXggZW5hYmxlX2RldiAiJGRldjEiCitub3QgdmdjayAkdmcgMj4mMSB8IHRlZSBsb2cKK2dyZXAgIm1pc3NpbmcgMSBwaHlzaWNhbCB2b2x1bWUiIGxvZworbm90IGx2Y3JlYXRlIC1hZXkgLS10eXBlIG1pcnJvciAtbSAxIC1sIDEgLW4gbWlycm9yICR2ZyAjIHdyaXRlIG9wZXJhdGlvbnMgZmFpbAorIyB0cnkgcmVzdG9yZSB0aGUgbm9uLW1pc3NpbmcgZGV2aWNlCitmYWlsIHZnZXh0ZW5kIC0tcmVzdG9yZSAkdmcgIiRkZXYyIgorIyB0cnkgcmVzdG9yZSB0aGUgbm9uLWV4aXN0aW5nIGRldmljZQorZmFpbCB2Z2V4dGVuZCAtLXJlc3RvcmUgJHZnICIkZGV2Mi1pbnZhbGlkIgorIyByZXN0b3JlIHRoZSBtaXNzaW5nIGRldmljZQordmdleHRlbmQgLS1yZXN0b3JlICR2ZyAiJGRldjEiCisKK3ZncmVkdWNlICAkdmcgIiRkZXYzIgordmdjaGFuZ2UgLS1tZXRhZGF0YWNvcGllcyAxICR2ZworIyAnbicgZmFpbGluZyB0byBjaGFuZ2Ugdm9sdW1lIGdyb3VwCitmYWlsIHZnZXh0ZW5kIC0tbWV0YWRhdGFpZ25vcmUgeSAtLXB2bWV0YWRhdGFjb3BpZXMgMiAkdmcgIiRkZXYzIgordmdleHRlbmQgLS15ZXMgLS1tZXRhZGF0YWlnbm9yZSB5IC0tcHZtZXRhZGF0YWNvcGllcyAyICR2ZyAiJGRldjMiCit2Z2NrICR2ZworbHZjcmVhdGUgLWFuIC1abiAtLXR5cGUgbWlycm9yIC1tIDEgLWwgMSAtbiBtaXJyb3IgJHZnCisKK3ZncmVtb3ZlIC1mZiAkdmcKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdleHRlbmQtdXNhZ2Uuc2ggYi90ZXN0L3NoZWxsL3ZnZXh0ZW5kLXVzYWdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzBmNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZnZXh0ZW5kLXVzYWdlLnNoCkBAIC0wLDAgKzEsMTM5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIworIyBFeGVyY2lzZSB2YXJpb3VzIHZnZXh0ZW5kIGNvbW1hbmRzCisjCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDUKKworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTTEiIDsgdGhlbgorbWRhdHlwZXM9JzEgMicKK2Vsc2UKK21kYXR5cGVzPScyJworZmkKKworZm9yIG1kYXR5cGUgaW4gJG1kYXR5cGVzCitkbworCisjIEV4cGxpY2l0IHB2Y3JlYXRlCitwdmNyZWF0ZSAtTSRtZGF0eXBlICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgordmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdleHRlbmQgJHZnMSAiJGRldjMiICIkZGV2NCIgIiRkZXY1IgordmdyZW1vdmUgLWZmICR2ZzEKKworIyBJbXBsaWNpdCBwdmNyZWF0ZQorcHZyZW1vdmUgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IiAiJGRldjUiCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2V4dGVuZCAtTSRtZGF0eXBlICR2ZzEgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKK3ZncmVtb3ZlIC1mZiAkdmcxCitwdnJlbW92ZSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSIKKworZG9uZQorCisjIEltcGxpY2l0IHB2Y3JlYXRlIHRlc3RzLCB0ZXN0IHB2Y3JlYXRlIG9wdGlvbnMgb24gdmdjcmVhdGUKKyMgLS1mb3JjZSwgLS15ZXMsIC0tbWV0YWRhdGF7c2l6ZXxjb3BpZXN8dHlwZX0sIC0temVybworIyAtLWRhdGFhbGlnbm1lbnRbb2Zmc2V0XQordmdjcmVhdGUgJHZnICIkZGV2MiIKK3ZnZXh0ZW5kIC0tZm9yY2UgLS15ZXMgLS16ZXJvIHkgJHZnICIkZGV2MSIKK3ZncmVkdWNlICR2ZyAiJGRldjEiCitwdnJlbW92ZSAtZiAiJGRldjEiCisKK2ZvciBpIGluIDAgMSAyIDMKK2RvCisjIHZnY3JlYXRlIChsdm0yKSBzdWNjZWVkcyB3cml0aW5nIExWTSBsYWJlbCBhdCBzZWN0b3IgJGkKKyAgICB2Z2V4dGVuZCAtLWxhYmVsc2VjdG9yICRpICR2ZyAiJGRldjEiCisgICAgZGQgaWY9IiRkZXYxIiBicz01MTIgc2tpcD0kaSBjb3VudD0xIDI+L2Rldi9udWxsIHwgc3RyaW5ncyB8IGdyZXAgTEFCRUxPTkUgPi9kZXYvbnVsbAorICAgIHZncmVkdWNlICR2ZyAiJGRldjEiCisgICAgcHZyZW1vdmUgLWYgIiRkZXYxIgorZG9uZQorCisjIHB2bWV0YWRhdGFjb3BpZXMKK2ZvciBpIGluIDAgMSAyCitkbworICAgIHZnZXh0ZW5kIC0tcHZtZXRhZGF0YWNvcGllcyAkaSAkdmcgIiRkZXYxIgorICAgIGNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50ICRpCisgICAgdmdyZWR1Y2UgJHZnICIkZGV2MSIKKyAgICBwdnJlbW92ZSAtZiAiJGRldjEiCitkb25lCisKKyMgbWV0YWRhdGFzaXplLCBkYXRhYWxpZ25tZW50LCBkYXRhYWxpZ25tZW50b2Zmc2V0CisjQ09NTSAncHZjcmVhdGUgc2V0cyBkYXRhIG9mZnNldCBuZXh0IHRvIG1kYSBhcmVhJwordmdleHRlbmQgLS1tZXRhZGF0YXNpemUgMTAwayAtLWRhdGFhbGlnbm1lbnQgMTAwayAkdmcgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYxIiBwZV9zdGFydCAyMDAuMDBrCit2Z3JlZHVjZSAkdmcgIiRkZXYxIgorcHZyZW1vdmUgLWYgIiRkZXYxIgorCisjIGRhdGEgYXJlYSBpcyBhbGlnbmVkIHRvIDFNIGJ5IGRlZmF1bHQsCisjIGRhdGEgYXJlYSBzdGFydCBpcyBzaGlmdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50X29mZnNldAorcHZfYWxpZ249MTA1MjE2MEIgIyAxMDQ4NTc2ICsgKDcqNTEyKQordmdleHRlbmQgLS1tZXRhZGF0YXNpemUgMTI4ayAtLWRhdGFhbGlnbm1lbnRvZmZzZXQgN3MgJHZnICIkZGV2MSIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcGVfc3RhcnQgJHB2X2FsaWduIC0tdW5pdHMgYgordmdyZW1vdmUgLWYgJHZnCitwdnJlbW92ZSAtZiAiJGRldjEiCisKKyMgdmdleHRlbmQgZmFpbHMgaWYgcHYgYmVsb25ncyB0byBleGlzdGluZyB2ZwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MyIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYyIgorbm90IHZnZXh0ZW5kICR2ZzIgIiRkZXYzIgordmdyZW1vdmUgLWYgJHZnMQordmdyZW1vdmUgLWYgJHZnMgorcHZyZW1vdmUgLWYgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKworI3ZnZXh0ZW5kIGZhaWxzIGlmIHZnIGlzIG5vdCByZXNpemVhYmxlCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjaGFuZ2UgLS1yZXNpemVhYmxlIG4gJHZnMQorbm90IHZnZXh0ZW5kICR2ZzEgIiRkZXYzIgordmdyZW1vdmUgLWYgJHZnMQorcHZyZW1vdmUgLWYgIiRkZXYxIiAiJGRldjIiCisKKyMgYWxsIFBWcyBleGlzdCBpbiB0aGUgVkcgYWZ0ZXIgZXh0ZW5kZWQKK3B2Y3JlYXRlICIkZGV2MSIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYyIgordmdleHRlbmQgJHZnMSAiJGRldjEiICIkZGV2MyIKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MSIgdmdfbmFtZSAkdmcxCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHZnX25hbWUgJHZnMQorY2hlY2sgcHZfZmllbGQgIiRkZXYzIiB2Z19uYW1lICR2ZzEKK3ZncmVtb3ZlIC1mICR2ZzEKK3B2cmVtb3ZlIC1mICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCisKK2VjaG8gdGVzdCB2Z2V4dGVuZCAtLW1ldGFkYXRhaWdub3JlCitmb3IgbWRhY3AgaW4gMSAyOyBkbworZm9yIGlnbm9yZSBpbiB5IG47IGRvCisJZWNobyB2Z2V4dGVuZCAtLW1ldGFkYXRhaWdub3JlIGhhcyBwcm9wZXIgbWRhX2NvdW50IGFuZCBtZGFfdXNlZF9jb3VudAorCXZnY3JlYXRlICR2ZyAiJGRldjMiCisJdmdleHRlbmQgLS1tZXRhZGF0YWlnbm9yZSAkaWdub3JlIC0tcHZtZXRhZGF0YWNvcGllcyAkbWRhY3AgJHZnICIkZGV2MSIgIiRkZXYyIgorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MSIgcHZfbWRhX2NvdW50ICRtZGFjcAorCWNoZWNrIHB2X2ZpZWxkICIkZGV2MiIgcHZfbWRhX2NvdW50ICRtZGFjcAorCWlmIFsgJGlnbm9yZSA9IHkgXTsgdGhlbgorCQljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV91c2VkX2NvdW50IDAKKwkJY2hlY2sgcHZfZmllbGQgIiRkZXYyIiBwdl9tZGFfdXNlZF9jb3VudCAwCisJZWxzZQorCQljaGVjayBwdl9maWVsZCAiJGRldjEiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCQljaGVjayBwdl9maWVsZCAiJGRldjIiIHB2X21kYV91c2VkX2NvdW50ICRtZGFjcAorCWZpCisJZWNobyB2ZyBoYXMgcHJvcGVyIHZnX21kYV9jb3VudCBhbmQgdmdfbWRhX3VzZWRfY291bnQKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvdW50ICQoKCRtZGFjcCAqIDIgKyAxKSkKKwlpZiBbICRpZ25vcmUgPSB5IF07IHRoZW4KKwkJY2hlY2sgdmdfZmllbGQgJHZnIHZnX21kYV91c2VkX2NvdW50IDEKKwllbHNlCisJCWNoZWNrIHZnX2ZpZWxkICR2ZyB2Z19tZGFfdXNlZF9jb3VudCAkKCgkbWRhY3AgKiAyICsgMSkpCisJZmkKKwljaGVjayB2Z19maWVsZCAkdmcgdmdfbWRhX2NvcGllcyB1bm1hbmFnZWQKKwl2Z3JlbW92ZSAkdmcKKwlwdnJlbW92ZSAtZmYgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2RvbmUKK2RvbmUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdpbXBvcnRjbG9uZS5zaCBiL3Rlc3Qvc2hlbGwvdmdpbXBvcnRjbG9uZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc5ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z2ltcG9ydGNsb25lLnNoCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDIKKwordmdjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayAkdmcxICIkZGV2MSIKK2x2Y3JlYXRlIC1sMTAwJUZSRUUgLW4gJGx2MSAkdmcxCisKKyMgVGVzdCBwbGFpbiB2Z2V4cG9ydCB2Z2ltcG9ydCB0b29scworCisjIEFyZ3VtZW50IGlzIG5lZWRlZAoraW52YWxpZCB2Z2V4cG9ydAoraW52YWxpZCB2Z2ltcG9ydAorIyBDYW5ub3QgY29tYmluZSAtYSBhbmQgVkcgbmFtZQoraW52YWxpZCB2Z2V4cG9ydCAtYSAkdmcKK2ludmFsaWQgdmdpbXBvcnQgLWEgJHZnMQorIyBDYW5ub3QgZXhwb3J0IHVua25vbncgVkcKK2ZhaWwgdmdleHBvcnQgJHt2ZzF9LW5vbgorZmFpbCB2Z2ltcG9ydCAke3ZnMX0tbm9uCisjIENhbm5vdCBleHBvcnQgVkcgd2l0aCBhY3RpdmUgdm9sdW1lcworZmFpbCB2Z2V4cG9ydCAkdmcxCisKK3ZnY2hhbmdlIC1hbiAkdmcxCit2Z2V4cG9ydCAkdmcxCisjIEFscmVhZHkgZXhwb3J0ZWQKK2ZhaWwgdmdleHBvcnQgJHZnMQorCit2Z2ltcG9ydCAkdmcxCisjIEFscmVhZHkgaW1wb3J0ZWQKK2ZhaWwgdmdpbXBvcnQgJHZnMQordmdjaGFuZ2UgLWF5ICR2ZzEKKworIyBDbG9uZSB0aGUgTFVOCitkZCBpZj0iJGRldjEiIG9mPSIkZGV2MiIgYnM9MjU2SyBjb3VudD0xCithdXggbm90aWZ5X2x2bWV0YWQgIiRkZXYyIgorCisjIFZlcmlmeSBwdnMgd29ya3Mgb24gZWFjaCBkZXZpY2UgdG8gZ2l2ZSB1cyB2Z25hbWUKK2F1eCBoaWRlX2RldiAiJGRldjIiCitjaGVjayBwdl9maWVsZCAiJGRldjEiIHZnX25hbWUgJHZnMQorYXV4IHVuaGlkZV9kZXYgIiRkZXYyIgorCithdXggaGlkZV9kZXYgIiRkZXYxIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzEKK2F1eCB1bmhpZGVfZGV2ICIkZGV2MSIKKworIyBJbXBvcnQgdGhlIGNsb25lZCBQViB0byBhIG5ldyBWRwordmdpbXBvcnRjbG9uZSAtLWJhc2V2Z25hbWUgJHZnMiAiJGRldjIiCisKKyMgV2UgbmVlZCB0byByZS1zY2FuICpib3RoKiAkZGV2MSBhbmQgJGRldjIgc2luY2UgYSBQViwgYXMgZmFyIGFzIGx2bWV0YWQgaXMKKyMgY29uY2VybmVkLCBjYW4gb25seSBsaXZlIG9uIGEgc2luZ2xlIGRldmljZS4gV2l0aCB0aGUgbGFzdCBwdnNjYW4sIHdlIHRvbGQgaXQKKyMgdGhhdCBQViBmcm9tICRkZXYxIG5vdyBsaXZlcyBvbiAkZGV2MiwgYnV0IGluIGZhY3QgdGhpcyBpcyBub3QgdHJ1ZSBhbnltb3JlLAorIyBzaW5jZSB3ZSB3cm90ZSBhIGRpZmZlcmVudCBQViBvdmVyICRkZXYyLgorcm0gLWYgJFRFU1RESVIvZXRjLy5jYWNoZQorYXV4IG5vdGlmeV9sdm1ldGFkICIkZGV2MiIKK2F1eCBub3RpZnlfbHZtZXRhZCAiJGRldjEiCisKKyMgVmVyaWZ5IHdlIGNhbiBhY3RpdmF0ZSAvIGRlYWN0aXZhdGUgdGhlIExWIGZyb20gYm90aCBWR3MKK2x2Y2hhbmdlIC1heSAkdmcxLyRsdjEgJHZnMi8kbHYxCit2Z2NoYW5nZSAtYW4gJHZnMSAkdmcyCisKK3ZncmVtb3ZlIC1mZiAkdmcxICR2ZzIKKworIyBWZXJpZnkgdGhhdCBpZiB3ZSBwcm92aWRlIHRoZSAtbnwtLWJhc2V2Z25hbWUsCisjIHRoZSBudW1iZXIgc3VmZml4IGlzIG5vdCBhZGRlZCB1bm5lY2Vzc2FyaWx5LgordmdjcmVhdGUgLS1tZXRhZGF0YXNpemUgMTI4ayBBJHt2ZzF9QiAiJGRldjEiCisKKyMgdmcxQiBpcyBub3QgdGhlIHNhbWUgYXMgQXZnMUIgLSB3ZSBkb24ndCBuZWVkIG51bWJlciBzdWZmaXgKK2RkIGlmPSIkZGV2MSIgb2Y9IiRkZXYyIiBicz0yNTZLIGNvdW50PTEKK2F1eCBub3RpZnlfbHZtZXRhZCAiJGRldjIiCit2Z2ltcG9ydGNsb25lIC1uICR7dmcxfUIgIiRkZXYyIgorY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR7dmcxfUIKKworIyBBdmcxIGlzIG5vdCB0aGUgc2FtZSBhcyBBdmcxQiAtIHdlIGRvbid0IG5lZWQgbnVtYmVyIHN1ZmZpeAorZGQgaWY9IiRkZXYxIiBvZj0iJGRldjIiIGJzPTI1NksgY291bnQ9MQorYXV4IG5vdGlmeV9sdm1ldGFkICIkZGV2MiIKK3ZnaW1wb3J0Y2xvbmUgLW4gQSR7dmcxfSAiJGRldjIiCitjaGVjayBwdl9maWVsZCAiJGRldjIiIHZnX25hbWUgQSR7dmcxfQorCisjIEF2ZzFCIGlzIHRoZSBzYW1lIGFzIEF2ZzFCIC0gd2UgbmVlZCB0byBhZGQgdGhlIG51bWJlciBzdWZmaXgKK2RkIGlmPSIkZGV2MSIgb2Y9IiRkZXYyIiBicz0yNTZLIGNvdW50PTEKK2F1eCBub3RpZnlfbHZtZXRhZCAiJGRldjIiCit2Z2ltcG9ydGNsb25lIC1uIEEke3ZnMX1CICIkZGV2MiIKK2F1eCB2Z3MKK2NoZWNrIHB2X2ZpZWxkICIkZGV2MiIgdmdfbmFtZSBBJHt2ZzF9QjEKKwordmdyZW1vdmUgLWZmIEEke3ZnMX1CIEEke3ZnMX1CMQpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z21lcmdlLW9wZXJhdGlvbi5zaCBiL3Rlc3Qvc2hlbGwvdmdtZXJnZS1vcGVyYXRpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1ZDJjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdtZXJnZS1vcGVyYXRpb24uc2gKQEAgLTAsMCArMSw4MSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCB2Z21lcmdlIG9wZXJhdGlvbicKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9wdnMgNCA2NAorCisjICd2Z21lcmdlIHN1Y2NlZWRzIHdpdGggc2luZ2xlIGxpbmVhciBMViBpbiBzb3VyY2UgVkcnCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgJHZnMiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MSAkdmcxICIkZGV2MSIKK3ZnY2hhbmdlIC1hbiAkdmcxCitjaGVjayBwdmx2X2NvdW50cyAkdmcxIDIgMSAwCitjaGVjayBwdmx2X2NvdW50cyAkdmcyIDIgMCAwCit2Z21lcmdlICR2ZzIgJHZnMQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiA0IDEgMAordmdyZW1vdmUgLWYgJHZnMgorCisjICd2Z21lcmdlIHN1Y2NlZWRzIHdpdGggc2luZ2xlIGxpbmVhciBMViBpbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIFZHJwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlICR2ZzIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMQorbHZjcmVhdGUgLWwgNCAtbiAkbHYyICR2ZzIKK3ZnY2hhbmdlIC1hbiAkdmcxCit2Z2NoYW5nZSAtYW4gJHZnMgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAyIDEgMAorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAyIDEgMAordmdtZXJnZSAkdmcyICR2ZzEKK2NoZWNrIHB2bHZfY291bnRzICR2ZzIgNCAyIDAKK3ZncmVtb3ZlIC1mICR2ZzIKKworIyAndmdtZXJnZSBzdWNjZWVkcyB3aXRoIGxpbmVhciBMViArIHNuYXBzaG90cyBpbiBzb3VyY2UgVkcnCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgJHZnMiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1hZXkgLWwgMTYgLW4gJGx2MSAkdmcxCitsdmNyZWF0ZSAtbCA0IC1zIC1uICRsdjIgJHZnMS8kbHYxCit2Z2NoYW5nZSAtYW4gJHZnMQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAyIDIgMQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAyIDAgMAordmdtZXJnZSAkdmcyICR2ZzEKK2NoZWNrIHB2bHZfY291bnRzICR2ZzIgNCAyIDEKK2x2cmVtb3ZlIC1mICR2ZzIvJGx2MgordmdyZW1vdmUgLWYgJHZnMgorCisjICd2Z21lcmdlIHN1Y2NlZWRzIHdpdGggbWlycm9yZWQgTFYgaW4gc291cmNlIFZHJwordmdjcmVhdGUgJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgordmdjcmVhdGUgJHZnMiAiJGRldjQiCitsdmNyZWF0ZSAtYWV5IC1sIDQgLW4gJGx2MSAtLXR5cGUgbWlycm9yIC1tMSAkdmcxCit2Z2NoYW5nZSAtYW4gJHZnMQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAzIDEgMAorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAxIDAgMAordmdtZXJnZSAkdmcyICR2ZzEKK2NoZWNrIHB2bHZfY291bnRzICR2ZzIgNCAxIDAKK2x2cmVtb3ZlIC1mICR2ZzIvJGx2MQordmdyZW1vdmUgLWYgJHZnMgorCisjICd2Z21lcmdlIHJlamVjdHMgTFYgbmFtZSBjb2xsaXNpb24nCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgJHZnMiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MSAkdmcxCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMgordmdjaGFuZ2UgLWFuICR2ZzEKK2NoZWNrIHB2bHZfY291bnRzICR2ZzEgMiAxIDAKK2NoZWNrIHB2bHZfY291bnRzICR2ZzIgMiAxIDAKK25vdCB2Z21lcmdlICR2ZzIgJHZnMSAyPmVycgorZ3JlcCAiRHVwbGljYXRlIGxvZ2ljYWwgdm9sdW1lIG5hbWUgXCIkbHYxXCIgaW4gXCIkdmcyXCIgYW5kIFwiJHZnMSIgZXJyCitjaGVjayBwdmx2X2NvdW50cyAkdmcxIDIgMSAwCitjaGVjayBwdmx2X2NvdW50cyAkdmcyIDIgMSAwCit2Z3JlbW92ZSAtZiAkdmcxICR2ZzIKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdtZXJnZS11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvdmdtZXJnZS11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzY5YWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z21lcmdlLXVzYWdlLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgJ1Rlc3QgdmdtZXJnZSBjb21tYW5kIG9wdGlvbnMgZm9yIHZhbGlkaXR5JworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3B2cyA0CisKKyMgJ3ZnbWVyZ2Ugbm9ybWFsIG9wZXJhdGlvbicKKyMgZW5zdXJlIG9yZGVyaW5nIGRvZXMgbm90IG1hdHRlcgordmdjcmVhdGUgICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAgJHZnMiAiJGRldjMiICIkZGV2NCIKK3ZnbWVyZ2UgJHZnMSAkdmcyCit2Z3JlbW92ZSAkdmcxCit2Z2NyZWF0ZSAkdmcyICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgJHZnMSAiJGRldjMiICIkZGV2NCIKK3ZnbWVyZ2UgJHZnMiAkdmcxCit2Z3JlbW92ZSAkdmcyCisKKyMgJ3ZnbWVyZ2UgcmVqZWN0cyBkdXBsaWNhdGUgdmcgbmFtZScKK3ZnY3JlYXRlICAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgICR2ZzIgIiRkZXYzIiAiJGRldjQiCitub3QgdmdtZXJnZSAkdmcxICR2ZzEgMj5lcnIKK2dyZXAgIkR1cGxpY2F0ZSB2b2x1bWUgZ3JvdXAgbmFtZSBcIiR2ZzFcIlwkIiBlcnIKK3ZncmVtb3ZlICR2ZzEgJHZnMgorCisjICd2Z21lcmdlIHJlamVjdHMgdmdzIHdpdGggaW5jb21wYXRpYmxlIGV4dGVudF9zaXplJwordmdjcmVhdGUgIC0tcGh5c2ljYWxleHRlbnRzaXplIDRNICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAgLS1waHlzaWNhbGV4dGVudHNpemUgOE0gJHZnMiAiJGRldjMiICIkZGV2NCIKK25vdCB2Z21lcmdlICR2ZzEgJHZnMiAyPmVycgorZ3JlcCAiRXh0ZW50IHNpemVzIGRpZmZlciIgZXJyCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyAndmdtZXJnZSByZWplY3RzIHZnbWVyZ2UgYmVjYXVzZSBtYXhfcHYgaXMgZXhjZWVkZWQnCit2Z2NyZWF0ZSAgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMiAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgIC0tbWF4cGh5c2ljYWx2b2x1bWVzIDIgJHZnMiAiJGRldjMiICIkZGV2NCIKK25vdCB2Z21lcmdlICR2ZzEgJHZnMiAyPmVycgorZ3JlcCAiTWF4aW11bSBudW1iZXIgb2YgcGh5c2ljYWwgdm9sdW1lcyAoMikgZXhjZWVkZWQiIGVycgordmdyZW1vdmUgJHZnMSAkdmcyCisKKyMgJ3ZnbWVyZ2UgcmVqZWN0cyB2ZyB3aXRoIGFjdGl2ZSBsdicKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAkdmcyICIkZGV2MyIgIiRkZXY0IgorbHZjcmVhdGUgLWwgNCAtbiBsdjEgJHZnMgorbm90IHZnbWVyZ2UgJHZnMSAkdmcyIDI+ZXJyCitncmVwICJMb2dpY2FsIHZvbHVtZXMgaW4gXCIkdmcyXCIgbXVzdCBiZSBpbmFjdGl2ZSIgZXJyCit2Z3JlbW92ZSAtZiAkdmcxICR2ZzIKKworIyAndmdtZXJnZSByZWplY3RzIHZnbWVyZ2UgYmVjYXVzZSBtYXhfbHYgaXMgZXhjZWVkZWQnCit2Z2NyZWF0ZSAtLW1heGxvZ2ljYWx2b2x1bWVzIDIgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC0tbWF4bG9naWNhbHZvbHVtZXMgMiAkdmcyICIkZGV2MyIgIiRkZXY0IgorbHZjcmVhdGUgLWwgNCAtbiBsdjEgJHZnMQorbHZjcmVhdGUgLWwgNCAtbiBsdjIgJHZnMQorbHZjcmVhdGUgLWwgNCAtbiBsdjMgJHZnMgordmdjaGFuZ2UgLWFuICR2ZzEgJHZnMgorbm90IHZnbWVyZ2UgJHZnMSAkdmcyIDI+ZXJyCitncmVwICJNYXhpbXVtIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgKDIpIGV4Y2VlZGVkIiBlcnIKK3ZncmVtb3ZlIC1mICR2ZzEgJHZnMgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z3JlZHVjZS1yZW1vdmVtaXNzaW5nLXNuYXBzaG90LnNoIGIvdGVzdC9zaGVsbC92Z3JlZHVjZS1yZW1vdmVtaXNzaW5nLXNuYXBzaG90LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjYwYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3ZncmVkdWNlLXJlbW92ZW1pc3Npbmctc25hcHNob3Quc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfQ0xWTUQ9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworIworIyBTbmFwc2hvdHMgb2YgJ21pcnJvcnMnIGFyZSBub3Qgc3VwcG9ydGVkLiAgVGhleSBjYW4gbm8gbG9uZ2VyIGJlIGNyZWF0ZWQuCisjIFRoaXMgZmlsZSBjb3VsZCBiZSB1c2VkIHRvIHRlc3Qgc29tZSBhc3BlY3Qgb2YgdmdyZWR1Y2UsIHNuYXBzaG90LCBhbmQKKyMgUkFJRCBhdCBzb21lIHBvaW50IHRob3VnaC4uLgorIworCithdXggcHJlcGFyZV92ZyA1CisKK2x2Y3JlYXRlIC0tdHlwZSBtaXJyb3IgLW0gMyAtTCAyTSAtbiA0d2F5ICR2ZyAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiICIkZGV2NSI6MAorbHZjcmVhdGUgLXMgJHZnLzR3YXkgLUwgMk0gLW4gc25hcAorbHZjcmVhdGUgLWkgMiAtTCAyTSAkdmcgIiRkZXYxIiAiJGRldjIiIC1uIHN0cmlwZQorCithdXggZGlzYWJsZV9kZXYgIiRkZXYyIiAiJGRldjQiCitlY2hvIG4gfCBsdmNvbnZlcnQgLS1yZXBhaXIgJHZnLzR3YXkKK2F1eCBlbmFibGVfZGV2ICIkZGV2MiIgIiRkZXY0IgorI25vdCB2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgJHZnCit2Z3JlZHVjZSAtdiAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSAkdmcgIyAiJGRldjIiICIkZGV2NCIKK2x2cyAtYSAtbyArZGV2aWNlcyAkdmcgfCBub3QgZ3JlcCB1bmtub3duCitsdnMgLWEgLW8gK2RldmljZXMgJHZnCitjaGVjayBtaXJyb3IgJHZnIDR3YXkgIiRkZXY1IgorCit2Z3JlbW92ZSAtZmYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZncmVkdWNlLXVzYWdlLnNoIGIvdGVzdC9zaGVsbC92Z3JlZHVjZS11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2EyN2EwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z3JlZHVjZS11c2FnZS5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCisuIGxpYi9pbml0dGVzdAorCithdXggcHJlcGFyZV9kZXZzIDQKKworaWYgdGVzdCAtbiAiJExWTV9URVNUX0xWTTEiIDsgdGhlbgorbWRhdHlwZXM9JzEgMicKK2Vsc2UKK21kYXR5cGVzPScyJworZmkKKworZm9yIG1kYXR5cGUgaW4gJG1kYXR5cGVzCitkbworICAgICMgc2V0dXAgUFZzCisgICAgcHZjcmVhdGUgLU0kbWRhdHlwZSAiJGRldjEiICIkZGV2MiIKKworICAgICMgKGx2bSRtZGF0eXBlKSB2Z3JlZHVjZSByZW1vdmVzIG9ubHkgdGhlIHNwZWNpZmllZCBwdiBmcm9tIHZnIChiejQyNzM4MikiICcKKyAgICB2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCisgICAgdmdyZWR1Y2UgJHZnMSAiJGRldjEiCisgICAgY2hlY2sgcHZfZmllbGQgIiRkZXYyIiB2Z19uYW1lICR2ZzEKKyAgICB2Z3JlbW92ZSAtZiAkdmcxCisKKyAgICAjIChsdm0kbWRhdHlwZSkgdmdyZWR1Y2UgcmVqZWN0cyByZW1vdmluZyB0aGUgbGFzdCBwdiAoLS1hbGwpCisgICAgdmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorICAgIG5vdCB2Z3JlZHVjZSAtLWFsbCAkdmcxCisgICAgdmdyZW1vdmUgLWYgJHZnMQorCisgICAgIyAobHZtJG1kYXR5cGUpIHZncmVkdWNlIHJlamVjdHMgcmVtb3ZpbmcgdGhlIGxhc3QgcHYKKyAgICB2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCisgICAgbm90IHZncmVkdWNlICR2ZzEgIiRkZXYxIiAiJGRldjIiCisgICAgdmdyZW1vdmUgLWYgJHZnMQorCisgICAgcHZyZW1vdmUgLWZmICIkZGV2MSIgIiRkZXYyIgorZG9uZQorCittZGF0eXBlPTIgIyB3ZSBvbmx5IGV4cGVjdCB0aGUgZm9sbG93aW5nIHRvIHdvcmsgZm9yIGx2bTIgbWV0YWRhdGEKKworIyAobHZtJG1kYXR5cGUpIHNldHVwIFBWcyAoLS1tZXRhZGF0YWNvcGllcyAwKQorcHZjcmVhdGUgLU0kbWRhdHlwZSAiJGRldjEiICIkZGV2MiIKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAtTSRtZGF0eXBlICIkZGV2MyIgIiRkZXY0IgorCisjIChsdm0kbWRhdHlwZSkgdmdyZWR1Y2UgcmVqZWN0cyByZW1vdmluZyBwdiB3aXRoIHRoZSBsYXN0IG1kYSBjb3B5IChiejI0NzQ0OCkKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMSAiJGRldjEiICIkZGV2MyIKK25vdCB2Z3JlZHVjZSAkdmcxICIkZGV2MSIKK3ZncmVtb3ZlIC1mICR2ZzEKKworI0NPTU0gIihsdm0kbWRhdHlwZSkgdmdyZWR1Y2UgLS1yZW1vdmVtaXNzaW5nIC0tZm9yY2UgcmVwYXJlcyB0byBsaW5lYXIgKGJ6MjIxOTIxKSIKKyMgKGx2bSRtZGF0eXBlKSBzZXR1cDogY3JlYXRlIG1pcnJvciAmIGRhbWFnZSBvbmUgcHYKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorbHZjcmVhdGUgLWFleSAtbiAkbHYxIC0tdHlwZSBtaXJyb3IgLW0xIC1sIDQgJHZnMQorbHZjcmVhdGUgLW4gJGx2MiAgLWwgNCAkdmcxICIkZGV2MiIKK2x2Y3JlYXRlIC1uICRsdjMgLWwgNCAkdmcxICIkZGV2MyIKK3ZnY2hhbmdlIC1hbiAkdmcxCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgorIyAobHZtJG1kYXR5cGUpIHZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlIHJlcGFyZXMgdG8gbGluZWFyCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1mb3JjZSAkdmcxCitjaGVjayBsdl9maWVsZCAkdmcxLyRsdjEgc2VndHlwZSBsaW5lYXIKK2NoZWNrIHB2bHZfY291bnRzICR2ZzEgMiAzIDAKKyMgY2xlYW51cAorYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorcHZzY2FuCit2Z3JlbW92ZSAtZiAkdmcxCitub3QgdmdzICR2ZzEgIyBqdXN0IGRvdWJsZS1jaGVjayBpdCdzIHJlYWxseSBnb25lCisKKyNDT01NICJ2Z3JlZHVjZSByZWplY3RzIC0tcmVtb3ZlbWlzc2luZyAtLW1pcnJvcnNvbmx5IC0tZm9yY2Ugd2hlbiBub25taXJyb3IgbHYgbG9zdCB0b28iCisjIChsdm0kbWRhdHlwZSkgc2V0dXA6IGNyZWF0ZSBtaXJyb3IgKyBsaW5lYXIgbHZzCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgJChjYXQgREVWSUNFUykKK2x2Y3JlYXRlIC1uICRsdjIgLWwgNCAkdmcxCitsdmNyZWF0ZSAtYWV5IC0tdHlwZSBtaXJyb3IgLW0xIC1uICRsdjEgLWwgNCAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitsdmNyZWF0ZSAtbiAkbHYzIC1sIDQgJHZnMSAiJGRldjMiCitwdnMgLS1zZWdtZW50cyAtbyArbHZfbmFtZSAkKGNhdCBERVZJQ0VTKSAjIGZvciByZWNvcmQgb25seQorIyAobHZtJG1kYXR5cGUpIHNldHVwOiBkYW1hZ2Ugb25lIHB2Cit2Z2NoYW5nZSAtYW4gJHZnMQorYXV4IGRpc2FibGVfZGV2ICIkZGV2MSIKKyNwdmNyZWF0ZSAtZmYgLXkgIiRkZXYxIgorIyB2Z3JlZHVjZSByZWplY3RzIC0tcmVtb3ZlbWlzc2luZyAtLW1pcnJvcnNvbmx5IC0tZm9yY2Ugd2hlbiBub25taXJyb3IgbHYgbG9zdCB0b28KKyNub3QgdmdyZWR1Y2UgLWMgbiAtLXJlbW92ZW1pc3NpbmcgLS1taXJyb3Jzb25seSAtLWZvcmNlICR2ZzEKKyMgQ0hFQ0tNRSAtIGNvbW1hbmQgYWJvdmUgd2FzIHJlamVjdGVkIGJlY3Vhc2Ugb2YgJy1jIG4nCit2Z3JlZHVjZSAtLXJlbW92ZW1pc3NpbmcgLS1taXJyb3Jzb25seSAtLWZvcmNlICR2ZzEKKworYXV4IGVuYWJsZV9kZXYgIiRkZXYxIgorCitwdnMgLVAgJChjYXQgREVWSUNFUykgIyBmb3IgcmVjb3JkCitsdnMgLVAgJHZnMSAgICAgICAgICAgIyBmb3IgcmVjb3JkCit2Z3MgLVAgJHZnMSAgICAgICAgICAgIyBmb3IgcmVjb3JkCisKK3ZncmVtb3ZlIC1mZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZncmVtb3ZlLWNvcnJ1cHQtdmcuc2ggYi90ZXN0L3NoZWxsL3ZncmVtb3ZlLWNvcnJ1cHQtdmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMjVkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdyZW1vdmUtY29ycnVwdC12Zy5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX3ZnIDMKK2x2Y3JlYXRlIC1uIGJsYWJsYSAtTCAxICR2ZyAtYW4gLS16ZXJvIG4KKworZGQgaWY9L2Rldi91cmFuZG9tIGJzPTUxMiBzZWVrPTIgY291bnQ9MzIgb2Y9IiRkZXYyIgorYXV4IG5vdGlmeV9sdm1ldGFkICIkZGV2MiIKKwordmdyZW1vdmUgLWYgJHZnCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3ZncmVuYW1lLXVzYWdlLnNoIGIvdGVzdC9zaGVsbC92Z3JlbmFtZS11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUyZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC92Z3JlbmFtZS11c2FnZS5zaApAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBwcmVwYXJlX2RldnMgNAorcHZjcmVhdGUgIiRkZXYxIiAiJGRldjIiCitwdmNyZWF0ZSAtLW1ldGFkYXRhY29waWVzIDAgIiRkZXYzIiAiJGRldjQiCisKKyMgdmdyZW5hbWUgbm9ybWFsIG9wZXJhdGlvbiAtIHJlbmFtZSB2ZzEgdG8gdmcyCisjIHZncmVuYW1lIG5vcm1hbCBvcGVyYXRpb24gLSByZW5hbWUgdmcyIHRvIHZnMQorIyBlbnN1cmUgbmFtZSBvcmRlcmluZyBkb2VzIG5vdCBtYXR0ZXIKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z3JlbmFtZSAkdmcxICR2ZzIKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfbmFtZSAkdmcyCit2Z3JlbmFtZSAkdmcyICR2ZzEKK2NoZWNrIHZnX2ZpZWxkICR2ZzEgdmdfbmFtZSAkdmcxCit2Z3JlbW92ZSAkdmcxCisKKyMgdmdyZW5hbWUgYnkgdXVpZCAoYnoyMzExODcpCit2Z2NyZWF0ZSAkdmcxICIkZGV2MSIgIiRkZXYzIgorVVVJRD0kKHZncyAtLW5vaGVhZGluZyAtbyB2Z191dWlkICR2ZzEpCitjaGVjayB2Z19maWVsZCAkdmcxIHZnX3V1aWQgJFVVSUQKK3ZncmVuYW1lICRVVUlEICR2ZzIKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgdmdfbmFtZSAkdmcyCit2Z3JlbW92ZSAkdmcyCisKKyMgdmdyZW5hbWUgZmFpbHMgLSBuZXcgdmcgYWxyZWFkeSBleGlzdHMKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIgordmdjcmVhdGUgJHZnMiAiJGRldjIiCitub3QgdmdyZW5hbWUgJHZnMSAkdmcyCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3JlbmFtZSBkdXBsaWNhdGUgbmFtZQordmdjcmVhdGUgJHZnMSAiJGRldjEiCithdXggZGlzYWJsZV9kZXYgIiRkZXYxIgordmdjcmVhdGUgJHZnMSAiJGRldjIiCitVVUlEPSQodmdzIC0tbm9oZWFkaW5nIC1vIHZnX3V1aWQgJHZnMSkKK2F1eCBlbmFibGVfZGV2ICIkZGV2MSIKKworbm90IHZncmVuYW1lICR2ZzEgJHZnMgordmdyZW5hbWUgJFVVSUQgJHZnMgorbm90IHZncmVuYW1lICRVVUlEICR2ZzEKKwordmdzCisKK3ZncmVtb3ZlICR2ZzEgJHZnMgpkaWZmIC0tZ2l0IGEvdGVzdC9zaGVsbC92Z3NwbGl0LW9wZXJhdGlvbi5zaCBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC1vcGVyYXRpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjODFkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC1vcGVyYXRpb24uc2gKQEAgLTAsMCArMSwzNDQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgdmdzcGxpdCBvcGVyYXRpb24sIGluY2x1ZGluZyBkaWZmZXJlbnQgTFYgdHlwZXMKKworIyBkaXNhYmxlIGx2bWV0YWQgbG9nZ2luZyBhcyBpdCBib2dzIGRvd24gdGVzdCBzeXN0ZW1zCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworZXhwb3J0IExWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUz0ke0xWTV9URVNUX0xWTUVUQURfREVCVUdfT1BUUy19CisKKy4gbGliL2luaXR0ZXN0CisKK0NPTU0oKSB7CisJTEFTVF9URVNUPSIkQCIKK30KKworY3JlYXRlX3ZnXygpIHsKKwl2Z2NyZWF0ZSAtcyA2NGsgIiRAIgorfQorCithdXggcHJlcGFyZV9wdnMgNSAxMAorIyBGSVhNRTogcGFyYW1hdGVyaXplIGx2bTEgdnMgbHZtMiBtZXRhZGF0YTsgbW9zdCBvZiB0aGVzZSB0ZXN0cyBzaG91bGQgcnVuCisjIGZpbmUgd2l0aCBsdm0xIG1ldGFkYXRhIGFzIHdlbGw7IGZvciBub3csIGp1c3QgYWRkIGRpc2tzIDUgYW5kIDYgYXMgbHZtMQorIyBtZXRhZGF0YQorCisjCisjIHZnc3BsaXQgY2FuIGJlIGRvbmUgaW50byBhIG5ldyBvciBleGlzdGluZyBWRworIworZm9yIGkgaW4gbmV3IGV4aXN0aW5nCitkbworCSMKKwkjIFdlIGNhbiBoYXZlIFBWcyBvciBMVnMgb24gdGhlIGNtZGxpbmUKKwkjCisJZm9yIGogaW4gUFYgTFYKKwlkbworQ09NTSAidmdzcGxpdCBjb3JyZWN0bHkgc3BsaXRzIHNpbmdsZSBsaW5lYXIgTFYgaW50byAkaSBWRyAoJGogYXJncykiCisJCWNyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjMiICIkZGV2NCIKKworCQlsdmNyZWF0ZSAtYW4gLVpuIC1sIDQgLW4gJGx2MSAkdmcxICIkZGV2MSIKKwkJaWYgWyAkaiA9IFBWIF07IHRoZW4KKwkJICB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyCisJCWZpCisJCWNoZWNrIHB2bHZfY291bnRzICR2ZzEgMSAwIDAKKwkJaWYgWyAkaSA9IGV4aXN0aW5nIF07IHRoZW4KKwkJICAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAzIDEgMAorCQllbHNlCisJCSAgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMSAxIDAKKwkJZmkKKwkJbHZyZW1vdmUgLWYgJHZnMi8kbHYxCisJCXZncmVtb3ZlIC1mICR2ZzIgJHZnMQorCitDT01NICJ2Z3NwbGl0IGNvcnJlY3RseSBzcGxpdHMgc2luZ2xlIHN0cmlwZWQgTFYgaW50byAkaSBWRyAoJGogYXJncykiCisJCWNyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjMiICIkZGV2NCIKKworCQlsdmNyZWF0ZSAtYW4gLVpuIC1sIDQgLWkgMiAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiCisJCWlmIFsgJGogPSBQViBdOyB0aGVuCisJCSAgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyCisJCWZpCisJCWlmIFsgJGkgPSBleGlzdGluZyBdOyB0aGVuCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiA0IDEgMAorCQllbHNlCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAyIDEgMAorCQlmaQorCQlsdnJlbW92ZSAtZiAkdmcyLyRsdjEKKwkJdmdyZW1vdmUgLWYgJHZnMgorCitDT01NICJ2Z3NwbGl0IGNvcnJlY3RseSBzcGxpdHMgbWlycm9yIExWIGludG8gJGkgVkcgKCRqIGFyZ3MpIgorCQljcmVhdGVfdmdfICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjQiCisKKwkJbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJaWYgWyAkaiA9IFBWIF07IHRoZW4KKwkJICAjIEZJWE1FOiBOb3QgYW4gZXhoYXVzdGl2ZSBjaGVjayBvZiBwb3NzaWJsZSBiYWQgY29tYmluYXRpb25zCisJCSAgbm90IHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgIiRkZXYyIgorCQkgIG5vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiICIkZGV2MyIKKwkJICBub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYyIiAiJGRldjMiCisJCSAgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJZWxzZQorCQkgIHZnc3BsaXQgLW4gJGx2MSAkdmcxICR2ZzIKKwkJZmkKKwkJaWYgWyAkaSA9IGV4aXN0aW5nIF07IHRoZW4KKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcyIDQgMSAwCisJCWVsc2UKKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcyIDMgMSAwCisJCWZpCisJCWx2cmVtb3ZlIC1mICR2ZzIvJGx2MQorCQl2Z3JlbW92ZSAtZiAkdmcyCisKKyMgUkhCWiA4NzU5MDMKK0NPTU0gInZnc3BsaXQgY29ycmVjdGx5IHNwbGl0cyBtaXJyb3IgKGxvZytsZWcgb24gc2FtZSBkZXYpIGludG8gJGkgVkcgKCRqIGFyZ3MpIgorCQljcmVhdGVfdmdfICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjQiCisKKwkJbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiCisJCWlmIFsgJGogPSBQViBdOyB0aGVuCisJCSAgbm90IHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIKKwkJICBub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYyIgorCQkgIHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgIiRkZXYyIgorCQllbHNlCisJCSAgdmdzcGxpdCAtbiAkbHYxICR2ZzEgJHZnMgorCQlmaQorCQlpZiBbICRpID0gZXhpc3RpbmcgXTsgdGhlbgorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMyAxIDAKKwkJZWxzZQorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMiAxIDAKKwkJZmkKKwkJbHZyZW1vdmUgLWYgJHZnMi8kbHYxCisJCXZncmVtb3ZlIC1mICR2ZzEgJHZnMgorCisjIENhbid0IHVzZSBtaXJyb3JlZCBsb2cgd2l0aG91dCBjbWlycm9yZAorIyBUT0RPOiBTaG91bGQgd29yayBmb3IgaW5hY3RpdmUgZGV2aWNlLCBuZWVkcyBzb21lIGZpeGVzLi4uLgoraWYgdGVzdCAhIC1lIExPQ0FMX0NMVk1EIDsgdGhlbgorQ09NTSAidmdzcGxpdCBjb3JyZWN0bHkgc3BsaXRzIG1pcnJvciBMViB3aXRoIG1pcnJvcmVkIGxvZyBpbnRvICRpIFZHICgkaiBhcmdzKSIKKwkJY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjUiCisKKwkJbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtLW1pcnJvcmxvZyBtaXJyb3JlZCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZzEgXAorCQkgICAgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorCisJCWlmIFsgJGogPSBQViBdOyB0aGVuCisJCSAgIyBGSVhNRTogTm90IGFuIGV4aGF1c3RpdmUgY2hlY2sgb2YgcG9zc2libGUgYmFkIGNvbWJpbmF0aW9ucworCQkgIG5vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiICIkZGV2MiIKKwkJICBub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYzIiAiJGRldjQiCisJCSAgbm90IHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgIiRkZXYzIgorCQkgIG5vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjIiICIkZGV2NCIKKwkJICB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyCisJCWZpCisJCWlmIFsgJGkgPSBleGlzdGluZyBdOyB0aGVuCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiA1IDEgMAorCQllbHNlCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiA0IDEgMAorCQlmaQorCQlsdnJlbW92ZSAtZiAkdmcyLyRsdjEKKwkJdmdyZW1vdmUgLWYgJHZnMgorCisjIFJIQlogODc1OTAzCitDT01NICJ2Z3NwbGl0IGNvcnJlY3RseSBzcGxpdHMgbWlycm9yIExWIHdpdGggbWlycm9yZWQgbG9nIG9uIHNhbWUgZGV2cyBpbnRvICRpIFZHICgkaiBhcmdzKSIKKwkJY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjUiCisKKwkJbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtLW1pcnJvcmxvZyBtaXJyb3JlZCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZzEgXAorCQkgICAgIiRkZXYxIiAiJGRldjIiCisKKwkJaWYgWyAkaiA9IFBWIF07IHRoZW4KKwkJICBub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIgorCQkgIG5vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjIiCisJCSAgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyCisJCWZpCisJCWlmIFsgJGkgPSBleGlzdGluZyBdOyB0aGVuCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAzIDEgMAorCQllbHNlCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAyIDEgMAorCQlmaQorCQlsdnJlbW92ZSAtZiAkdmcyLyRsdjEKKwkJdmdyZW1vdmUgLWYgJHZnMSAkdmcyCitmaQorCitDT01NICJ2Z3NwbGl0IGNvcnJlY3RseSBzcGxpdHMgb3JpZ2luIGFuZCBzbmFwc2hvdCBMViBpbnRvICRpIFZHICgkaiBhcmdzKSIKKwkJY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIgorCQl0ZXN0ICRpID0gZXhpc3RpbmcgJiYgY3JlYXRlX3ZnXyAkdmcyICIkZGV2MyIgIiRkZXY0IgorCisJCWx2Y3JlYXRlIC1hZXkgLWwgNjQgLWkgMiAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiCisJCWx2Y3JlYXRlIC1sIDQgLWkgMiAtcyAtbiAkbHYyICR2ZzEvJGx2MQorCQl2Z2NoYW5nZSAtYW4gJHZnMQorCQlpZiBbICRqID0gUFYgXTsgdGhlbgorCQkgIHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgIiRkZXYyIgorCQllbHNlCisJCSAgdmdzcGxpdCAtbiAkbHYxICR2ZzEgJHZnMgorCQlmaQorCQlpZiBbICRpID0gZXhpc3RpbmcgXTsgdGhlbgorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgNCAyIDEKKwkJZWxzZQorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMiAyIDEKKwkJZmkKKwkJbHZyZW1vdmUgLWYgJHZnMi8kbHYyCisJCWx2cmVtb3ZlIC1mICR2ZzIvJGx2MQorCQl2Z3JlbW92ZSAtZiAkdmcyCisKK0NPTU0gInZnc3BsaXQgY29ycmVjdGx5IHNwbGl0cyBsaW5lYXIgTFYgYnV0IG5vdCBzbmFwK29yaWdpbiBMViBpbnRvICRpIFZHICgkaiBhcmdzKSIKKwkJY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIgorCQl0ZXN0ICRpID0gZXhpc3RpbmcgJiYgY3JlYXRlX3ZnXyAkdmcyICIkZGV2MyIKKworCQlsdmNyZWF0ZSAtYWV5IC1sIDY0IC1pIDIgLW4gJGx2MSAkdmcxCisJCWx2Y3JlYXRlIC1sIDQgLWkgMiAtcyAtbiAkbHYyICR2ZzEvJGx2MQorCQl2Z2V4dGVuZCAkdmcxICIkZGV2NCIKKwkJbHZjcmVhdGUgLWwgNjQgLW4gJGx2MyAkdmcxICIkZGV2NCIKKwkJdmdjaGFuZ2UgLWFuICR2ZzEKKwkJaWYgWyAkaiA9IFBWIF07IHRoZW4KKwkJICB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjQiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjMgJHZnMSAkdmcyCisJCWZpCisJCWlmIFsgJGkgPSBleGlzdGluZyBdOyB0aGVuCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAyIDEgMAorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzEgMiAyIDEKKwkJZWxzZQorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMSAxIDAKKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcxIDIgMiAxCisJCWZpCisJCWx2cmVtb3ZlIC1mICR2ZzEvJGx2MgorCQlsdnJlbW92ZSAtZiAkdmcxLyRsdjEgJHZnMi8kbHYzCisJCXZncmVtb3ZlIC1mICR2ZzEgJHZnMgorCitDT01NICJ2Z3NwbGl0IGNvcnJlY3RseSBzcGxpdHMgbGluZWFyIExWIGJ1dCBub3QgbWlycm9yIExWIGludG8gJGkgVkcgKCRqIGFyZ3MpIgorCQljcmVhdGVfdmdfICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJdGVzdCAkaSA9IGV4aXN0aW5nICYmIGNyZWF0ZV92Z18gJHZnMiAiJGRldjUiCisKKwkJbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtLXR5cGUgbWlycm9yIC1tMSAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJdmdleHRlbmQgJHZnMSAiJGRldjQiCisJCWx2Y3JlYXRlIC1hbiAtWm4gLWwgNjQgLW4gJGx2MiAkdmcxICIkZGV2NCIKKwkJaWYgWyAkaiA9IFBWIF07IHRoZW4KKwkJICB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjQiCisJCWVsc2UKKwkJICB2Z3NwbGl0IC1uICRsdjIgJHZnMSAkdmcyCisJCWZpCisJCWlmIFsgJGkgPSBleGlzdGluZyBdOyB0aGVuCisJCSAgY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAzIDEgMAorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzIgMiAxIDAKKwkJZWxzZQorCQkgIGNoZWNrIHB2bHZfY291bnRzICR2ZzEgMyAxIDAKKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcyIDEgMSAwCisJCWZpCisJCXZncmVtb3ZlIC1mICR2ZzEgJHZnMgorCWRvbmUKK2RvbmUKKworIworIyBUZXN0IG1vcmUgY29tcGxleCBzZXR1cHMgd2hlcmUgdGhlIGNvZGUgaGFzIHRvIGZpbmQgYXNzb2NpYXRlZCBQVnMgYW5kCisjIExWcyB0byBzcGxpdCB0aGUgVkcgY29ycmVjdGx5CisjCitDT01NICJ2Z3NwbGl0IGZhaWxzIHNwbGl0dGluZyAzIHN0cmlwZWQgTFZzIGludG8gVkcgd2hlbiBvbmx5IDEgTFYgc3BlY2lmaWVkIgorY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwgNCAtbiAkbHYxIC1pIDIgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwgNCAtbiAkbHYyIC1pIDIgJHZnMSAiJGRldjIiICIkZGV2MyIKK2x2Y3JlYXRlIC1hbiAtWm4gLWwgNCAtbiAkbHYzIC1pIDIgJHZnMSAiJGRldjMiICIkZGV2NCIKK25vdCB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyCit2Z3JlbW92ZSAtZiAkdmcxCisKK0NPTU0gInZnc3BsaXQgZmFpbHMgc3BsaXR0aW5nIG9uZSBMViB3aXRoIDIgc25hcHNob3RzLCBvbmx5IG9yaWdpbiBMViBzcGVjaWZpZWQiCitjcmVhdGVfdmdfICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorbHZjcmVhdGUgLWFleSAtbCAxNiAtbiAkbHYxICR2ZzEgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjIgLXMgJHZnMS8kbHYxICIkZGV2MyIKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MyAtcyAkdmcxLyRsdjEgIiRkZXY0IgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSA0IDMgMgordmdjaGFuZ2UgLWFuICR2ZzEKK25vdCB2Z3NwbGl0IC1uICRsdjEgJHZnMSAkdmcyOworbHZyZW1vdmUgLWYgJHZnMS8kbHYyICR2ZzEvJGx2MworbHZyZW1vdmUgLWYgJHZnMS8kbHYxCit2Z3JlbW92ZSAtZiAkdmcxCisKK0NPTU0gInZnc3BsaXQgZmFpbHMgc3BsaXR0aW5nIG9uZSBMViB3aXRoIDIgc25hcHNob3RzLCBvbmx5IHNuYXBzaG90IExWIHNwZWNpZmllZCIKK2NyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtYWV5IC1sIDE2IC1uICRsdjEgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MiAtcyAkdmcxLyRsdjEgIiRkZXYzIgorbHZjcmVhdGUgLWwgNCAtbiAkbHYzIC1zICR2ZzEvJGx2MSAiJGRldjQiCitjaGVjayBwdmx2X2NvdW50cyAkdmcxIDQgMyAyCit2Z2NoYW5nZSAtYW4gJHZnMQorbm90IHZnc3BsaXQgLW4gJGx2MiAkdmcxICR2ZzIKK2x2cmVtb3ZlIC1mICR2ZzEvJGx2MiAkdmcxLyRsdjMKK2x2cmVtb3ZlIC1mICR2ZzEvJGx2MQordmdyZW1vdmUgLWYgJHZnMQorCitDT01NICJ2Z3NwbGl0IGZhaWxzIHNwbGl0dGluZyBvbmUgbWlycm9yIExWLCBvbmx5IG9uZSBQViBzcGVjaWZpZWQiCitjcmVhdGVfdmdfICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIgIiRkZXY0IgorbHZjcmVhdGUgLWFuIC1abiAtbCAxNiAtbiAkbHYxIC0tdHlwZSBtaXJyb3IgLW0xICR2ZzEgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKK2NoZWNrIHB2bHZfY291bnRzICR2ZzEgNCAxIDAKK25vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjIiCit2Z3JlbW92ZSAtZmYgJHZnMQorCitDT01NICJ2Z3NwbGl0IGZhaWxzIHNwbGl0dGluZyAxIG1pcnJvciArIDEgc3RyaXBlZCBMViwgb25seSBzdHJpcGVkIExWIHNwZWNpZmllZCIKK2NyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtYW4gLVpuIC1sIDE2IC1uICRsdjEgLS10eXBlIG1pcnJvciAtLW5vc3luYyAtbTEgJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorbHZjcmVhdGUgLWFuIC1abiAtbCAxNiAtbiAkbHYyIC1pIDIgJHZnMSAiJGRldjMiICIkZGV2NCIKK2NoZWNrIHB2bHZfY291bnRzICR2ZzEgNCAyIDAKK25vdCB2Z3NwbGl0IC1uICRsdjIgJHZnMSAkdmcyIDI+ZXJyCit2Z3JlbW92ZSAtZiAkdmcxCisKKyMKKyMgVmVyaWZ5IHZnc3BsaXQgcmVqZWN0cyBhY3RpdmUgTFZzIG9ubHkgd2hlbiBhY3RpdmUgTFZzIGludm9sdmVkIGluIHNwbGl0CisjCitDT01NICJ2Z3NwbGl0IGZhaWxzLCBhY3RpdmUgbWlycm9yIGludm9sdmVkIGluIHNwbGl0IgorY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1hZXkgLWwgMTYgLW4gJGx2MSAtLXR5cGUgbWlycm9yIC0tbm9zeW5jIC1tMSAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitsdmNyZWF0ZSAtbCAxNiAtbiAkbHYyICR2ZzEgIiRkZXY0IgorbHZjaGFuZ2UgLWFuICR2ZzEvJGx2MgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSA0IDIgMAorbm90IHZnc3BsaXQgLW4gJGx2MSAkdmcxICR2ZzI7CitjaGVjayBwdmx2X2NvdW50cyAkdmcxIDQgMiAwCit2Z3JlbW92ZSAtZiAkdmcxCisKK0NPTU0gInZnc3BsaXQgc3VjY2VlZHMsIGFjdGl2ZSBtaXJyb3Igbm90IGludm9sdmVkIGluIHNwbGl0IgorY3JlYXRlX3ZnXyAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiICIkZGV2NCIKK2x2Y3JlYXRlIC1hZXkgLWwgMTYgLW4gJGx2MSAtLXR5cGUgbWlycm9yIC0tbm9zeW5jIC1tMSAkdmcxICIkZGV2MSIgIiRkZXYyIiAiJGRldjMiCitsdmNyZWF0ZSAtbCAxNiAtbiAkbHYyICR2ZzEgIiRkZXY0IgorbHZjaGFuZ2UgLWFuICR2ZzEvJGx2MgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSA0IDIgMAordmdzcGxpdCAtbiAkbHYyICR2ZzEgJHZnMgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAzIDEgMAorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAxIDEgMAordmdyZW1vdmUgLWYgJHZnMSAkdmcyCisKK0NPTU0gInZnc3BsaXQgZmFpbHMsIGFjdGl2ZSBzbmFwc2hvdCBpbnZvbHZlZCBpbiBzcGxpdCIKK2NyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtYWV5IC1sIDY0IC1pIDIgLW4gJGx2MSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLWwgNCAtaSAyIC1zIC1uICRsdjIgJHZnMS8kbHYxCitsdmNyZWF0ZSAtYW4gLVpuIC1sIDY0IC1pIDIgLW4gJGx2MyAkdmcxICIkZGV2MyIgIiRkZXY0IgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSA0IDMgMQorbm90IHZnc3BsaXQgLW4gJGx2MiAkdmcxICR2ZzI7CitjaGVjayBwdmx2X2NvdW50cyAkdmcxIDQgMyAxCitsdnJlbW92ZSAtZiAkdmcxLyRsdjIKK3ZncmVtb3ZlIC1mICR2ZzEKKworQ09NTSAidmdzcGxpdCBzdWNjZWVkcywgYWN0aXZlIHNuYXBzaG90IG5vdCBpbnZvbHZlZCBpbiBzcGxpdCIKK2NyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorbHZjcmVhdGUgLWFleSAtbCA2NCAtaSAyIC1uICRsdjEgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1sIDQgLXMgLW4gJGx2MiAkdmcxLyRsdjEKK3ZnZXh0ZW5kICR2ZzEgIiRkZXY0IgorbHZjcmVhdGUgLWFuIC1abiAtbCA2NCAtbiAkbHYzICR2ZzEgIiRkZXY0IgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSA0IDMgMQordmdzcGxpdCAtbiAkbHYzICR2ZzEgJHZnMgorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAzIDIgMQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMiAxIDEgMAordmdjaGFuZ2UgLWFuICR2ZzEKK2x2cmVtb3ZlIC1mICR2ZzEvJGx2MgordmdyZW1vdmUgLWYgJHZnMSAkdmcyCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Znc3BsaXQtcmFpZC5zaCBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC1yYWlkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjMwN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3Znc3BsaXQtcmFpZC5zaApAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0IHZnc3BsaXQgb3BlcmF0aW9uLCBpbmNsdWRpbmcgZGlmZmVyZW50IExWIHR5cGVzCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworQ09NTSgpIHsKKwlMQVNUX1RFU1Q9IiRAIgorfQorCitjcmVhdGVfdmdfKCkgeworCXZnY3JlYXRlIC1zIDY0ayAiJEAiCit9CisKK2F1eCBoYXZlX3JhaWQgMSAzIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9wdnMgNSAxMAorCisjCisjIHZnc3BsaXQgY2FuIGJlIGRvbmUgaW50byBhIG5ldyBvciBleGlzdGluZyBWRworIworZm9yIGkgaW4gbmV3IGV4aXN0aW5nCitkbworCSMKKwkjIFdlIGNhbiBoYXZlIFBWcyBvciBMVnMgb24gdGhlIGNtZGxpbmUKKwkjCisJZm9yIGogaW4gUFYgTFYKKwlkbworQ09NTSAidmdzcGxpdCBjb3JyZWN0bHkgc3BsaXRzIFJBSUQgTFYgaW50byAkaSBWRyAoJGogYXJncykiCisJCWNyZWF0ZV92Z18gJHZnMSAiJGRldjEiICIkZGV2MiIgIiRkZXYzIgorCQl0ZXN0ICRpID0gZXhpc3RpbmcgJiYgY3JlYXRlX3ZnXyAkdmcyICIkZGV2NSIKKworCQlsdmNyZWF0ZSAtYW4gLVpuIC1sIDY0IC0tdHlwZSByYWlkNSAtaSAyIC1uICRsdjEgJHZnMQorCQlpZiBbICRqID0gUFYgXTsgdGhlbgorCQkgIG5vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiCisJCSAgbm90IHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MiIKKwkJICBub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiCisJCSAgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiICIkZGV2MyIKKwkJZWxzZQorCQkgIHZnc3BsaXQgLW4gJGx2MSAkdmcxICR2ZzIKKwkJZmkKKwkJaWYgWyAkaSA9IGV4aXN0aW5nIF07IHRoZW4KKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcyIDQgMSAwCisJCWVsc2UKKwkJICBjaGVjayBwdmx2X2NvdW50cyAkdmcyIDMgMSAwCisJCWZpCisJCXZncmVtb3ZlIC1mICR2ZzIKKwlkb25lCitkb25lCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Znc3BsaXQtc3RhY2tlZC5zaCBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC1zdGFja2VkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWUzMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsL3Znc3BsaXQtc3RhY2tlZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBleHRlbmRfZmlsdGVyX0xWTVRFU1QKK2F1eCBwcmVwYXJlX3B2cyAzCisKK3ZnY3JlYXRlICR2ZzEgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtbiAkbHYxIC1sIDEwMCVGUkVFICR2ZzEKKworI3RvcCBWRworcHZjcmVhdGUgIiRETV9ERVZfRElSLyR2ZzEvJGx2MSIKK3ZnY3JlYXRlICR2ZyAiJERNX0RFVl9ESVIvJHZnMS8kbHYxIiAiJGRldjMiCisKK3ZnY2hhbmdlIC1hIG4gJHZnICR2ZzEKKworIyB0aGlzIHNob3VsZCBmYWlsIGJ1dCBub3Qgc2VnZmF1bHQsIFJIQlogNDgxNzkzLgorbm90IHZnc3BsaXQgJHZnICR2ZzEgIiRkZXYzIgorCit2Z3JlbW92ZSAtZmYgJHZnICR2ZzEKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvdmdzcGxpdC10aGluLnNoIGIvdGVzdC9zaGVsbC92Z3NwbGl0LXRoaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjODI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC10aGluLnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCisjIFRlc3QgdmdzcGxpdCBjb21tYW5kIG9wdGlvbnMgZm9yIHZhbGlkaXR5CisKK1NLSVBfV0lUSF9MVk1MT0NLRD0xCitTS0lQX1dJVEhfTFZNUE9MTEQ9MQorCitleHBvcnQgTFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01EPSR7TFZNX1RFU1RfVEhJTl9SRVBBSVJfQ01ELS9iaW4vZmFsc2V9CisKKy4gbGliL2luaXR0ZXN0CisKK2F1eCBoYXZlX3RoaW4gMSAwIDAgfHwgc2tpcAorCithdXggcHJlcGFyZV9kZXZzIDUKKwordmdjcmVhdGUgJHZnMSAkKGNhdCBERVZJQ0VTKQorbHZjcmVhdGUgLVQgLUw4TSAkdmcxL3Bvb2wxIC1WMTBNIC1uICRsdjEgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtVCAtTDhNICR2ZzEvcG9vbDIgLVYxME0gLW4gJGx2MiAiJGRldjMiICIkZGV2NCIKKworIyBUZXN0IHdpdGggZXh0ZXJuYWwgb3JpZ2luIGlmIGF2YWlsYWJsZQorbHZjcmVhdGUgLWwxIC1hbiAtcHIgLS16ZXJvIG4gLW4gZW9yaWdpbiAkdmcxICIkZGV2NSIKK2F1eCBoYXZlX3RoaW4gMSA1IDAgJiYgbHZjcmVhdGUgLWFuIC1zICR2ZzEvZW9yaWdpbiAtbiAkbHYzIC0tdGhpbnBvb2wgJHZnMS9wb29sMQorCisjIENhbm5vdCBtb3ZlIGFjdGl2ZSB0aGluCitub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAiJGRldjIiICIkZGV2NSIKKwordmdjaGFuZ2UgLWFuICR2ZzEKK25vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiCitub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYyIiAiJGRldjMiCit2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiICIkZGV2MiIgIiRkZXY1IgorbHZzIC1hIC1vK2RldmljZXMgJHZnMSAkdmcyCisKK3ZnbWVyZ2UgJHZnMSAkdmcyCisKK3ZncmVtb3ZlIC1mZiAkdmcxCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3Znc3BsaXQtdXNhZ2Uuc2ggYi90ZXN0L3NoZWxsL3Znc3BsaXQtdXNhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwNGE1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvdmdzcGxpdC11c2FnZS5zaApAQCAtMCwwICsxLDE5MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworIyBUZXN0IHZnc3BsaXQgY29tbWFuZCBvcHRpb25zIGZvciB2YWxpZGl0eQorCitTS0lQX1dJVEhfTFZNTE9DS0Q9MQorU0tJUF9XSVRIX0xWTVBPTExEPTEKKworLiBsaWIvaW5pdHRlc3QKKworYXV4IHByZXBhcmVfZGV2cyA1CisKK2lmIHRlc3QgLW4gIiRMVk1fVEVTVF9MVk0xIiA7IHRoZW4KK21kYXR5cGVzPScxIDInCitlbHNlCittZGF0eXBlcz0nMicKK2ZpCisKK2ZvciBtZGF0eXBlIGluICRtZGF0eXBlcworZG8KKworcHZjcmVhdGUgLU0kbWRhdHlwZSAkKGNhdCBERVZJQ0VTKQorCisjIGVuc3VyZSBuYW1lIG9yZGVyIGRvZXMgbm90IG1hdHRlcgorIyBOT1RFOiBpZiB3ZSdyZSB1c2luZyBsdm0xLCB3ZSBtdXN0IHVzZSAtTSBvbiB2Z3NwbGl0Cit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgJChjYXQgREVWSUNFUykKK3Znc3BsaXQgLU0kbWRhdHlwZSAkdmcxICR2ZzIgIiRkZXYxIgordmdyZW1vdmUgJHZnMSAkdmcyCisKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMiAkKGNhdCBERVZJQ0VTKQordmdzcGxpdCAtTSRtZGF0eXBlICR2ZzIgJHZnMSAiJGRldjEiCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IGFjY2VwdHMgbmV3IHZnIGFzIGRlc3RpbmF0aW9uIG9mIHNwbGl0CisjIGx2bTEgLS0gYnoyNDQ3OTIKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMSAkKGNhdCBERVZJQ0VTKQordmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAxPmVycgorZ3JlcCAiTmV3IHZvbHVtZSBncm91cCBcIiR2ZzJcIiBzdWNjZXNzZnVsbHkgc3BsaXQgZnJvbSBcIiR2ZzFcIiIgZXJyCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IGFjY2VwdHMgZXhpc3RpbmcgdmcgYXMgZGVzdGluYXRpb24gb2Ygc3BsaXQKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMiAiJGRldjMiICIkZGV2NCIKK3Znc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgMT5lcnIKK2dyZXAgIkV4aXN0aW5nIHZvbHVtZSBncm91cCBcIiR2ZzJcIiBzdWNjZXNzZnVsbHkgc3BsaXQgZnJvbSBcIiR2ZzFcIiIgZXJyCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IGFjY2VwdHMgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMTI4IG9uIG5ldyBWRwordmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdzcGxpdCAtLW1heHBoeXNpY2Fsdm9sdW1lcyAxMjggJHZnMSAkdmcyICIkZGV2MSIKK2NoZWNrIHZnX2ZpZWxkICR2ZzIgbWF4X3B2IDEyOAordmdyZW1vdmUgJHZnMSAkdmcyCisKKyMgdmdzcGxpdCBhY2NlcHRzIC0tbWF4bG9naWNhbHZvbHVtZXMgMTI4IG9uIG5ldyBWRwordmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdzcGxpdCAtLW1heGxvZ2ljYWx2b2x1bWVzIDEyOCAkdmcxICR2ZzIgIiRkZXYxIgorY2hlY2sgdmdfZmllbGQgJHZnMiBtYXhfbHYgMTI4Cit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IHJlamVjdHMgc3BsaXQgYmVjYXVzZSBtYXhfcHYgb2YgZGVzdGluYXRpb24gd291bGQgYmUgZXhjZWVkZWQKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMiAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgLU0kbWRhdHlwZSAtLW1heHBoeXNpY2Fsdm9sdW1lcyAyICR2ZzIgIiRkZXYzIiAiJGRldjQiCitub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAyPmVycjsKK2dyZXAgIk1heGltdW0gbnVtYmVyIG9mIHBoeXNpY2FsIHZvbHVtZXMgKDIpIGV4Y2VlZGVkIiBlcnIKK3ZncmVtb3ZlICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgcmVqZWN0cyBzcGxpdCBiZWNhdXNlIG1heHBoeXNpY2Fsdm9sdW1lcyBnaXZlbiB3aXRoIGV4aXN0aW5nIHZnCit2Z2NyZWF0ZSAtTSRtZGF0eXBlIC0tbWF4cGh5c2ljYWx2b2x1bWVzIDIgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMiAkdmcyICIkZGV2MyIgIiRkZXY0Igorbm90IHZnc3BsaXQgLS1tYXhwaHlzaWNhbHZvbHVtZXMgMiAkdmcxICR2ZzIgIiRkZXYxIiAyPmVycjsKK2dyZXAgIlZvbHVtZSBncm91cCBcIiR2ZzJcIiBleGlzdHMsIGJ1dCBuZXcgVkcgb3B0aW9uIHNwZWNpZmllZCIgZXJyCit2Z3JlbW92ZSAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IHJlamVjdHMgc3BsaXQgYmVjYXVzZSBtYXhsb2dpY2Fsdm9sdW1lcyBnaXZlbiB3aXRoIGV4aXN0aW5nIHZnCit2Z2NyZWF0ZSAtTSRtZGF0eXBlIC0tbWF4bG9naWNhbHZvbHVtZXMgMiAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgLU0kbWRhdHlwZSAtLW1heGxvZ2ljYWx2b2x1bWVzIDIgJHZnMiAiJGRldjMiICIkZGV2NCIKK25vdCB2Z3NwbGl0IC0tbWF4bG9naWNhbHZvbHVtZXMgMiAkdmcxICR2ZzIgIiRkZXYxIiAyPmVycgorZ3JlcCAiVm9sdW1lIGdyb3VwIFwiJHZnMlwiIGV4aXN0cywgYnV0IG5ldyBWRyBvcHRpb24gc3BlY2lmaWVkIiBlcnIKK3ZncmVtb3ZlICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgcmVqZWN0cyBzcGxpdCBiZWNhdXNlIGFsbG9jIGdpdmVuIHdpdGggZXhpc3RpbmcgdmcKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgLS1hbGxvYyBjbGluZyAkdmcxICIkZGV2MSIgIiRkZXYyIgordmdjcmVhdGUgLU0kbWRhdHlwZSAtLWFsbG9jIGNsaW5nICR2ZzIgIiRkZXYzIiAiJGRldjQiCitub3QgdmdzcGxpdCAtLWFsbG9jIGNsaW5nICR2ZzEgJHZnMiAiJGRldjEiIDI+ZXJyOworZ3JlcCAiVm9sdW1lIGdyb3VwIFwiJHZnMlwiIGV4aXN0cywgYnV0IG5ldyBWRyBvcHRpb24gc3BlY2lmaWVkIiBlcnIKK3ZncmVtb3ZlICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgcmVqZWN0cyBzcGxpdCBiZWNhdXNlIGNsdXN0ZXJlZCBnaXZlbiB3aXRoIGV4aXN0aW5nIHZnCit2Z2NyZWF0ZSAtTSRtZGF0eXBlIC0tY2x1c3RlcmVkIG4gJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgLS1jbHVzdGVyZWQgbiAkdmcyICIkZGV2MyIgIiRkZXY0Igorbm90IHZnc3BsaXQgLS1jbHVzdGVyZWQgbiAkdmcxICR2ZzIgIiRkZXYxIiAyPmVycgorZ3JlcCAiVm9sdW1lIGdyb3VwIFwiJHZnMlwiIGV4aXN0cywgYnV0IG5ldyBWRyBvcHRpb24gc3BlY2lmaWVkIiBlcnIKK3ZncmVtb3ZlICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgcmVqZWN0cyB2ZyB3aXRoIGFjdGl2ZSBsdgorcHZjcmVhdGUgLU0kbWRhdHlwZSAtZmYgIiRkZXYzIiAiJGRldjQiCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMQorbm90IHZnc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIgMj5lcnI7CitncmVwICJMb2dpY2FsIHZvbHVtZXMgaW4gXCIkdmcxXCIgbXVzdCBiZSBpbmFjdGl2ZVwkIiBlcnIKK3ZncmVtb3ZlIC1mICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgcmVqZWN0cyBzcGxpdCBiZWNhdXNlIG1heF9sdiBpcyBleGNlZWRlZAordmdjcmVhdGUgLU0kbWRhdHlwZSAtLW1heGxvZ2ljYWx2b2x1bWVzIDIgJHZnMSAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgLS1tYXhsb2dpY2Fsdm9sdW1lcyAyICR2ZzIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMQorbHZjcmVhdGUgLWwgNCAtbiAkbHYyICR2ZzEKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MyAkdmcyCit2Z2NoYW5nZSAtYW4gJHZnMSAkdmcyCitub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIiAyPmVycjsKK2dyZXAgIk1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAoMikgZXhjZWVkZWQiIGVycgordmdyZW1vdmUgLWYgJHZnMSAkdmcyCisKKyMgdmdzcGxpdCB2ZXJpZnkgZGVmYXVsdCAtIG1heF9sdiBhdHRyaWJ1dGUgZnJvbSBuZXcgVkcgaXMgc2FtZSBhcyBzb3VyY2UgVkciIFwKK3ZnY3JlYXRlIC1NJG1kYXR5cGUgJHZnMSAiJGRldjEiICIkZGV2MiIKK2x2Y3JlYXRlIC1sIDQgLW4gJGx2MSAkdmcxCit2Z2NoYW5nZSAtYW4gJHZnMQordmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYxIgorY2hlY2sgY29tcGFyZV92Z19maWVsZCAkdmcxICR2ZzIgbWF4X2x2Cit2Z3JlbW92ZSAtZiAkdmcxICR2ZzIKKworIyB2Z3NwbGl0IHZlcmlmeSBkZWZhdWx0IC0gbWF4X3B2IGF0dHJpYnV0ZSBmcm9tIG5ldyBWRyBpcyBzYW1lIGFzIHNvdXJjZSBWRyIgXAordmdjcmVhdGUgLU0kbWRhdHlwZSAkdmcxICIkZGV2MSIgIiRkZXYyIgorbHZjcmVhdGUgLWwgNCAtbiAkbHYxICR2ZzEKK3ZnY2hhbmdlIC1hbiAkdmcxCit2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjEiCitjaGVjayBjb21wYXJlX3ZnX2ZpZWxkICR2ZzEgJHZnMiBtYXhfcHYKK3ZncmVtb3ZlIC1mICR2ZzEgJHZnMgorCisjIHZnc3BsaXQgdmVyaWZ5IGRlZmF1bHQgLSB2Z19mbXQgYXR0cmlidXRlIGZyb20gbmV3IFZHIGlzIHNhbWUgYXMgc291cmNlIFZHIiBcCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMQordmdjaGFuZ2UgLWFuICR2ZzEKK3Znc3BsaXQgJHZnMSAkdmcyICIkZGV2MSIKK2NoZWNrIGNvbXBhcmVfdmdfZmllbGQgJHZnMSAkdmcyIHZnX2ZtdAordmdyZW1vdmUgLWYgJHZnMiAkdmcxCisKKyMgdmdzcGxpdCByZWplY3RzIHNwbGl0IGJlY2F1c2UgUFYgbm90IGluIFZHCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzEgIiRkZXYxIiAiJGRldjIiCit2Z2NyZWF0ZSAtTSRtZGF0eXBlICR2ZzIgIiRkZXYzIiAiJGRldjQiCitsdmNyZWF0ZSAtbCA0IC1uICRsdjEgJHZnMQorbHZjcmVhdGUgLWwgNCAtbiAkbHYyICR2ZzEKK3ZnY2hhbmdlIC1hbiAkdmcxCitub3QgdmdzcGxpdCAkdmcxICR2ZzIgIiRkZXYzIiAyPmVycjsKK3ZncmVtb3ZlIC1mICR2ZzIgJHZnMQorCisjIFJlc3RhcnQgY2x2bSBiZWNhdXNlIHVzaW5nIHRoZSBzYW1lCisjIGRldnMgYXMgbHZtMSBhbmQgdGhlbiBsdm0yIGNhdXNlcyBwcm9ibGVtcy4KK2lmIHRlc3QgLWUgTE9DQUxfQ0xWTUQgOyB0aGVuCisJa2lsbCAkKDwgTE9DQUxfQ0xWTUQpCisJZm9yIGkgaW4gJChzZXEgMSAxMDApIDsgZG8KKwkJdGVzdCAkaSAtZXEgMTAwICYmIGRpZSAiU2h1dGRvd24gb2YgY2x2bWQgaXMgdG9vIHNsb3cuIgorCQlwZ3JlcCBjbHZtZCB8fCBicmVhaworCQlzbGVlcCAuMQorCWRvbmUgIyB3YWl0IGZvciB0aGUgcGlkIHJlbW92YWwKKwlhdXggcHJlcGFyZV9jbHZtZAorZmkKKworZG9uZQorCitpZiB0ZXN0IC16ICIkTFZNX1RFU1RfTFZNMSIgOyB0aGVuCisjIE9OTFkgTFZNMiBtZXRhZGF0YQorIyBzZXR1cCBQVnMiICcKK3B2Y3JlYXRlIC0tbWV0YWRhdGFjb3BpZXMgMCAiJGRldjUiCisKKyMgdmdzcGxpdCByZWplY3RzIHRvIGdpdmUgYXdheSBwdiB3aXRoIHRoZSBsYXN0IG1kYSBjb3B5Cit2Z2NyZWF0ZSAkdmcxICIkZGV2NSIgIiRkZXYyIgorbHZjcmVhdGUgLWwgMTAgLW4gJGx2MSAgJHZnMQorbHZjaGFuZ2UgLWFuICR2ZzEvJGx2MQorY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAyIDEgMAorbm90IHZnc3BsaXQgICR2ZzEgJHZnMiAiJGRldjUiOworY2hlY2sgcHZsdl9jb3VudHMgJHZnMSAyIDEgMAordmdyZW1vdmUgLWYgJHZnMQorCisjIHZnc3BsaXQgcmVqZWN0cyBzcGxpdCBiZWNhdXNlIG1ldGFkYXRhIHR5cGVzIGRpZmZlcgorcHZjcmVhdGUgLWZmIC1NMSAiJGRldjMiICIkZGV2NCIKK3B2Y3JlYXRlIC1mZiAiJGRldjEiICIkZGV2MiIKK3ZnY3JlYXRlIC1NMSAkdmcxICIkZGV2MyIgIiRkZXY0IgordmdjcmVhdGUgJHZnMiAiJGRldjEiICIkZGV2MiIKK25vdCB2Z3NwbGl0ICR2ZzEgJHZnMiAiJGRldjMiIDI+ZXJyOworZ3JlcCAiTWV0YWRhdGEgdHlwZXMgZGlmZmVyIiBlcnIKK3ZncmVtb3ZlIC1mICR2ZzEgJHZnMgorZmkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2hlbGwvemVyby11c2FnZS5zaCBiL3Rlc3Qvc2hlbGwvemVyby11c2FnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTkxYmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC96ZXJvLXVzYWdlLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorIyBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisKKyMgQmFzaWMgdXNhZ2Ugb2YgemVybyB0YXJnZXQKKworU0tJUF9XSVRIX0xWTUxPQ0tEPTEKK1NLSVBfV0lUSF9MVk1QT0xMRD0xCisKKy4gbGliL2luaXR0ZXN0CisKK3doaWNoIG1kNXN1bSB8fCBza2lwCisKK2F1eCBwcmVwYXJlX3B2cyAxCisKK3ZnY3JlYXRlIC1zIDI1NmsgJHZnICQoY2F0IERFVklDRVMpCisKK2x2Y3JlYXRlIC0tdHlwZSB6ZXJvIC1MMSAtbiAkbHYxICR2ZworbHZleHRlbmQgLUwrMSAkdmcvJGx2MQorCitzdW0xPSQoZGQgaWY9L2Rldi96ZXJvIGJzPTJNIGNvdW50PTEgfCBtZDVzdW0gfCBjdXQgLWYxIC1kJyAnKQorc3VtMj0kKGRkIGlmPSIkRE1fREVWX0RJUi8kdmcvJGx2MSIgYnM9Mk0gY291bnQ9MSB8IG1kNXN1bSB8IGN1dCAtZjEgLWQnICcpCisKKyMgaGFzIHRvIG1hdGNoCit0ZXN0ICIkc3VtMSIgPSAiJHN1bTIiCisKK2NoZWNrIGx2X2ZpZWxkICR2Zy8kbHYxIGx2X21vZHVsZXMgInplcm8iCitjaGVjayBsdl9maWVsZCAkdmcvJGx2MSBzZWd0eXBlICJ6ZXJvIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgc2VnX2NvdW50ICIxIgorY2hlY2sgbHZfZmllbGQgJHZnLyRsdjEgc2VnX3NpemVfcGUgIjgiICAgIyA4ICogMjU2CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3p6LWx2bWxvY2tkLWRsbS1yZW1vdmUuc2ggYi90ZXN0L3NoZWxsL3p6LWx2bWxvY2tkLWRsbS1yZW1vdmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyNjMxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2hlbGwvenotbHZtbG9ja2QtZGxtLXJlbW92ZS5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZW1vdmUgdGhlIGRsbSB0ZXN0IHNldHVwJworCisuIGxpYi9pbml0dGVzdAorCitbIC16ICIkTFZNX1RFU1RfTE9DS19UWVBFX0RMTSIgXSAmJiBza2lwOworCisjIEZJWE1FOiBjb2xsZWN0IGRlYnVnIGxvZ3MgKG9ubHkgaWYgYSB0ZXN0IGZhaWxlZD8pCisjIGx2bWxvY2tjdGwgLWQgPiBsdm1sb2NrZC1kZWJ1Zy50eHQKKyMgZGxtX3Rvb2wgZHVtcCA+IGRsbS1kZWJ1Zy50eHQKKworbHZtbG9ja2N0bCAtLXN0b3AtbG9ja3NwYWNlcworc2xlZXAgMQora2lsbGFsbCBsdm1sb2NrZAorc2xlZXAgMQora2lsbGFsbCBsdm1sb2NrZCB8fCB0cnVlCitzbGVlcCAxCitzeXN0ZW1jdGwgc3RvcCBkbG0KK3N5c3RlbWN0bCBzdG9wIGNvcm9zeW5jCmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsL3p6LWx2bWxvY2tkLXNhbmxvY2stcmVtb3ZlLnNoIGIvdGVzdC9zaGVsbC96ei1sdm1sb2NrZC1zYW5sb2NrLXJlbW92ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDE5NTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaGVsbC96ei1sdm1sb2NrZC1zYW5sb2NrLXJlbW92ZS5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZW1vdmUgdGhlIHNhbmxvY2sgdGVzdCBzZXR1cCcKKworLiBsaWIvaW5pdHRlc3QKKworWyAteiAiJExWTV9URVNUX0xPQ0tfVFlQRV9TQU5MT0NLIiBdICYmIHNraXA7CisKKyMgRklNWE1FOiBnZXQgdGhpcyB0byBydW4gYWZ0ZXIgYSB0ZXN0IGZhaWxzCisKKyMgUmVtb3ZlcyB0aGUgVkcgd2l0aCB0aGUgZ2xvYmFsIGxvY2sgdGhhdCB3YXMgY3JlYXRlZCBieQorIyB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGUgc2NyaXB0LgorCit2Z3JlbW92ZSAtLWNvbmZpZyAnZGV2aWNlcyB7IGdsb2JhbF9maWx0ZXI9WyJhfEdMX0RFVnwiLCAicnwuKnwiXSBmaWx0ZXI9WyJhfEdMX0RFVnwiLCAicnwuKnwiXX0nIGdsdmcKKworIyBGSVhNRTogY29sbGVjdCBkZWJ1ZyBsb2dzIChvbmx5IGlmIGEgdGVzdCBmYWlsZWQ/KQorIyBsdm1sb2NrY3RsIC1kID4gbHZtbG9ja2QtZGVidWcudHh0CisjIHNhbmxvY2sgbG9nX2R1bXAgPiBzYW5sb2NrLWRlYnVnLnR4dAorCitsdm1sb2NrY3RsIC0tc3RvcC1sb2Nrc3BhY2VzCitzbGVlcCAxCitraWxsYWxsIGx2bWxvY2tkCitzbGVlcCAxCitraWxsYWxsIGx2bWxvY2tkIHx8IHRydWUKK3NsZWVwIDEKK2tpbGxhbGwgc2FubG9jaworc2xlZXAgMQora2lsbGFsbCAtOSBsdm1sb2NrZCB8fCB0cnVlCitraWxsYWxsIC05IHNhbmxvY2sgfHwgdHJ1ZQorCisjIEZJWE1FOiBkbXNldHVwIHJlbW92ZSBMVk1URVNUKi1sdm1sb2NrCisKK2Rtc2V0dXAgcmVtb3ZlIGdsdmctbHZtbG9jayB8fCB0cnVlCitkbXNldHVwIHJlbW92ZSBHTF9ERVYgfHwgdHJ1ZQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvTWFrZWZpbGUuaW4gYi90ZXN0L3VuaXQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiN2U3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1ZQQVRIID0gJChzcmNkaXIpCitVTklUUyA9IFwKKwliaXRzZXRfdC5jXAorCWNvbmZpZ190LmNcCisJZG1saXN0X3QuY1wKKwlkbXN0YXR1c190LmNcCisJbWF0Y2hlcl90LmNcCisJc3RyaW5nX3QuY1wKKwlydW4uYworCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLGRpc3RjbGVhbikKK1NPVVJDRVMgPSAkKFVOSVRTKQorZW5kaWYKKworaWZlcSAoIiQoVEVTVElORykiLCAieWVzIikKK1NPVVJDRVMgPSAkKFVOSVRTKQorVEFSR0VUUyA9IHJ1bgorZW5kaWYKKworaWZlcSAoIiQoVEVTVElORykiLCAieWVzIikKK0xETElCUyArPSAtbGRldm1hcHBlciBAQ1VOSVRfTElCU0AKK0NGTEFHUyArPSBAQ1VOSVRfQ0ZMQUdTQAorCitjaGVjazogdW5pdAorCiskKFRBUkdFVFMpOiAkKE9CSkVDVFMpICQodG9wX2J1aWxkZGlyKS9saWJkbS9saWJkZXZtYXBwZXIuJChMSUJfU1VGRklYKQorCit1bml0OiAkKFRBUkdFVFMpCisJQGVjaG8gUnVubmluZyB1bml0IHRlc3RzCisJTERfTElCUkFSWV9QQVRIPSQodG9wX2J1aWxkZGlyKS9saWJkbSAuLyQoVEFSR0VUUykKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvYml0c2V0X3QuYyBiL3Rlc3QvdW5pdC9iaXRzZXRfdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGI5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvYml0c2V0X3QuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ1bml0cy5oIgorCitlbnVtIHsKKyAgICAgICAgTlJfQklUUyA9IDEzNworfTsKKworc3RhdGljIHN0cnVjdCBkbV9wb29sICptZW07CisKK2ludCBiaXRzZXRfaW5pdCh2b2lkKSB7CisJbWVtID0gZG1fcG9vbF9jcmVhdGUoImJpdHNldCB0ZXN0IiwgMTAyNCk7CisJcmV0dXJuIG1lbSA9PSBOVUxMOworfQorCitpbnQgYml0c2V0X2Zpbmkodm9pZCkgeworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2dldF9uZXh0KHZvaWQpCit7CisgICAgICAgIGludCBpLCBqLCBsYXN0ID0gMCwgZmlyc3Q7CisgICAgICAgIGRtX2JpdHNldF90IGJzID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIE5SX0JJVFMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9CSVRTOyBpKyspCisgICAgICAgICAgICAgICAgQ1VfQVNTRVJUKCFkbV9iaXQoYnMsIGkpKTsKKworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IE5SX0JJVFM7IGkgKz0gaiwgaisrKQorICAgICAgICAgICAgICAgIGRtX2JpdF9zZXQoYnMsIGkpOworCisgICAgICAgIGZpcnN0ID0gMTsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBOUl9CSVRTOyBpICs9IGosIGorKykgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRtX2JpdF9nZXRfZmlyc3QoYnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRtX2JpdF9nZXRfbmV4dChicywgbGFzdCk7CisKKyAgICAgICAgICAgICAgICBDVV9BU1NFUlQobGFzdCA9PSBpKTsKKyAgICAgICAgfQorCisgICAgICAgIENVX0FTU0VSVChkbV9iaXRfZ2V0X25leHQoYnMsIGxhc3QpID09IC0xKTsKK30KKworc3RhdGljIHZvaWQgYml0X2ZsaXAoZG1fYml0c2V0X3QgYnMsIGludCBiaXQpCit7CisgICAgICAgIGludCBvbGQgPSBkbV9iaXQoYnMsIGJpdCk7CisgICAgICAgIGlmIChvbGQpCisgICAgICAgICAgICAgICAgZG1fYml0X2NsZWFyKGJzLCBiaXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG1fYml0X3NldChicywgYml0KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9lcXVhbCh2b2lkKQoreworICAgICAgICBkbV9iaXRzZXRfdCBiczEgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgTlJfQklUUyk7CisgICAgICAgIGRtX2JpdHNldF90IGJzMiA9IGRtX2JpdHNldF9jcmVhdGUobWVtLCBOUl9CSVRTKTsKKworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBOUl9CSVRTOyBpICs9IGosIGorKykgeworICAgICAgICAgICAgICAgIGRtX2JpdF9zZXQoYnMxLCBpKTsKKyAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBDVV9BU1NFUlQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMyKSk7CisgICAgICAgIENVX0FTU0VSVChkbV9iaXRzZXRfZXF1YWwoYnMyLCBiczEpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQklUUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYml0X2ZsaXAoYnMxLCBpKTsKKyAgICAgICAgICAgICAgICBDVV9BU1NFUlQoIWRtX2JpdHNldF9lcXVhbChiczEsIGJzMikpOworICAgICAgICAgICAgICAgIENVX0FTU0VSVCghZG1fYml0c2V0X2VxdWFsKGJzMiwgYnMxKSk7CisKKyAgICAgICAgICAgICAgICBDVV9BU1NFUlQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMxKSk7IC8qIGNvbXBhcmluZyB3aXRoIHNlbGYgKi8KKyAgICAgICAgICAgICAgICBiaXRfZmxpcChiczEsIGkpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYW5kKHZvaWQpCit7CisgICAgICAgIGRtX2JpdHNldF90IGJzMSA9IGRtX2JpdHNldF9jcmVhdGUobWVtLCBOUl9CSVRTKTsKKyAgICAgICAgZG1fYml0c2V0X3QgYnMyID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIE5SX0JJVFMpOworICAgICAgICBkbV9iaXRzZXRfdCBiczMgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgTlJfQklUUyk7CisKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgTlJfQklUUzsgaSArPSBqLCBqKyspIHsKKyAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMSwgaSk7CisgICAgICAgICAgICAgICAgZG1fYml0X3NldChiczIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgZG1fYml0X2FuZChiczMsIGJzMSwgYnMyKTsKKworICAgICAgICBDVV9BU1NFUlQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMyKSk7CisgICAgICAgIENVX0FTU0VSVChkbV9iaXRzZXRfZXF1YWwoYnMxLCBiczMpKTsKKyAgICAgICAgQ1VfQVNTRVJUKGRtX2JpdHNldF9lcXVhbChiczIsIGJzMykpOworCisgICAgICAgIGRtX2JpdF9jbGVhcl9hbGwoYnMxKTsKKyAgICAgICAgZG1fYml0X2NsZWFyX2FsbChiczIpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9CSVRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAlIDIpCisgICAgICAgICAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMSwgaSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZG1fYml0X3NldChiczIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgZG1fYml0X2FuZChiczMsIGJzMSwgYnMyKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5SX0JJVFM7IGkrKykKKyAgICAgICAgICAgICAgICBDVV9BU1NFUlQoIWRtX2JpdChiczMsIGkpKTsKK30KKworQ1VfVGVzdEluZm8gYml0c2V0X2xpc3RbXSA9IHsKKwl7IChjaGFyKikiZ2V0X25leHQiLCB0ZXN0X2dldF9uZXh0IH0sCisJeyAoY2hhciopImVxdWFsIiwgdGVzdF9lcXVhbCB9LAorCXsgKGNoYXIqKSJhbmQiLCB0ZXN0X2FuZCB9LAorCUNVX1RFU1RfSU5GT19OVUxMCit9OwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2NvbmZpZ190LmMgYi90ZXN0L3VuaXQvY29uZmlnX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI2NjdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2NvbmZpZ190LmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidW5pdHMuaCIKKworc3RhdGljIHN0cnVjdCBkbV9wb29sICptZW07CisKK2ludCBjb25maWdfaW5pdCh2b2lkKSB7CisJbWVtID0gZG1fcG9vbF9jcmVhdGUoImNvbmZpZyB0ZXN0IiwgMTAyNCk7CisJcmV0dXJuIG1lbSA9PSBOVUxMOworfQorCitpbnQgY29uZmlnX2Zpbmkodm9pZCkgeworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uZiA9CisJImlkID0gXCJ5YWRhLXlhZGFcIlxuIgorCSJzZXFubyA9IDE1XG4iCisJInN0YXR1cyA9IFtcIlJFQURcIiwgXCJXUklURVwiXVxuIgorCSJmbGFncyA9IFtdXG4iCisJImV4dGVudF9zaXplID0gODE5MlxuIgorCSJwaHlzaWNhbF92b2x1bWVzIHtcbiIKKwkiICAgIHB2MCB7XG4iCisJIiAgICAgICAgaWQgPSBcImFiY2QtZWZnaFwiXG4iCisJIiAgICB9XG4iCisJIiAgICBwdjEge1xuIgorCSIgICAgICAgIGlkID0gXCJiYmNkLWVmZ2hcIlxuIgorCSIgICAgfVxuIgorCSIgICAgcHYyIHtcbiIKKwkiICAgICAgICBpZCA9IFwiY2JjZC1lZmdoXCJcbiIKKwkiICAgIH1cbiIKKwkifVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKm92ZXJsYXkgPQorCSJpZCA9IFwieW9kYS1zb2RhXCJcbiIKKwkiZmxhZ3MgPSBbXCJGT09cIl1cbiIKKwkicGh5c2ljYWxfdm9sdW1lcyB7XG4iCisJIiAgICBwdjEge1xuIgorCSIgICAgICAgIGlkID0gXCJoZ2ZlLWRjYmFcIlxuIgorCSIgICAgfVxuIgorCSIgICAgcHYzIHtcbiIKKwkiICAgICAgICBpZCA9IFwiZGJjZC1lZmdoXCJcbiIKKwkiICAgIH1cbiIKKwkifVxuIjsKKworc3RhdGljIHZvaWQgdGVzdF9wYXJzZSh2b2lkKQoreworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqdHJlZSA9IGRtX2NvbmZpZ19mcm9tX3N0cmluZyhjb25mKTsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICp2YWx1ZTsKKworCUNVX0FTU0VSVCgobG9uZykgdHJlZSk7CisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19oYXNfbm9kZSh0cmVlLT5yb290LCAiaWQiKSk7CisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19oYXNfbm9kZSh0cmVlLT5yb290LCAicGh5c2ljYWxfdm9sdW1lcyIpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2hhc19ub2RlKHRyZWUtPnJvb3QsICJwaHlzaWNhbF92b2x1bWVzL3B2MCIpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2hhc19ub2RlKHRyZWUtPnJvb3QsICJwaHlzaWNhbF92b2x1bWVzL3B2MC9pZCIpKTsKKworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ19maW5kX3N0cih0cmVlLT5yb290LCAiaWQiLCAiZm9vIiksICJ5YWRhLXlhZGEiKSk7CisJQ1VfQVNTRVJUKCFzdHJjbXAoZG1fY29uZmlnX2ZpbmRfc3RyKHRyZWUtPnJvb3QsICJpZHQiLCAiZm9vIiksICJmb28iKSk7CisKKwlDVV9BU1NFUlQoIXN0cmNtcChkbV9jb25maWdfZmluZF9zdHIodHJlZS0+cm9vdCwgInBoeXNpY2FsX3ZvbHVtZXMvcHYwL2JiIiwgImZvbyIpLCAiZm9vIikpOworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ19maW5kX3N0cih0cmVlLT5yb290LCAicGh5c2ljYWxfdm9sdW1lcy9wdjAvaWQiLCAiZm9vIiksICJhYmNkLWVmZ2giKSk7CisKKwlDVV9BU1NFUlQoIWRtX2NvbmZpZ19nZXRfdWludDMyKHRyZWUtPnJvb3QsICJpZCIsIE5VTEwpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2dldF91aW50MzIodHJlZS0+cm9vdCwgImV4dGVudF9zaXplIiwgTlVMTCkpOworCisJLyogRklYTUU6IEN1cnJlbnRseSBldmVyeXRoaW5nIHBhcnNlcyBhcyBhIGxpc3QsIGV2ZW4gaWYgaXQncyBub3QgKi8KKwkvLyBDVV9BU1NFUlQoIWRtX2NvbmZpZ19nZXRfbGlzdCh0cmVlLT5yb290LCAiaWQiLCBOVUxMKSk7CisJLy8gQ1VfQVNTRVJUKCFkbV9jb25maWdfZ2V0X2xpc3QodHJlZS0+cm9vdCwgImV4dGVudF9zaXplIiwgTlVMTCkpOworCisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19nZXRfbGlzdCh0cmVlLT5yb290LCAiZmxhZ3MiLCAmdmFsdWUpKTsKKwlDVV9BU1NFUlQodmFsdWUtPm5leHQgPT0gTlVMTCk7IC8qIGFuIGVtcHR5IGxpc3QgKi8KKwlDVV9BU1NFUlQoZG1fY29uZmlnX2dldF9saXN0KHRyZWUtPnJvb3QsICJzdGF0dXMiLCAmdmFsdWUpKTsKKwlDVV9BU1NFUlQodmFsdWUtPm5leHQgIT0gTlVMTCk7IC8qIGEgbm9uLWVtcHR5IGxpc3QgKi8KKworCWRtX2NvbmZpZ19kZXN0cm95KHRyZWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Nsb25lKHZvaWQpCit7CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICp0cmVlID0gZG1fY29uZmlnX2Zyb21fc3RyaW5nKGNvbmYpOworCXN0cnVjdCBkbV9jb25maWdfbm9kZSAqbiA9IGRtX2NvbmZpZ19jbG9uZV9ub2RlKHRyZWUsIHRyZWUtPnJvb3QsIDEpOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKnZhbHVlOworCisJLyogQ2hlY2sgdGhhdCB0aGUgbm9kZXMgYXJlIGFjdHVhbGx5IGRpc3RpbmN0LiAqLworCUNVX0FTU0VSVChuICE9IHRyZWUtPnJvb3QpOworCUNVX0FTU0VSVChuLT5zaWIgIT0gdHJlZS0+cm9vdC0+c2liKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2ZpbmRfbm9kZShuLCAicGh5c2ljYWxfdm9sdW1lcyIpICE9IE5VTEwpOworCUNVX0FTU0VSVChkbV9jb25maWdfZmluZF9ub2RlKHRyZWUtPnJvb3QsICJwaHlzaWNhbF92b2x1bWVzIikgIT0gTlVMTCk7CisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19maW5kX25vZGUobiwgInBoeXNpY2FsX3ZvbHVtZXMiKSAhPSBkbV9jb25maWdfZmluZF9ub2RlKHRyZWUtPnJvb3QsICJwaHlzaWNhbF92b2x1bWVzIikpOworCisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19oYXNfbm9kZShuLCAiaWQiKSk7CisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19oYXNfbm9kZShuLCAicGh5c2ljYWxfdm9sdW1lcyIpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2hhc19ub2RlKG4sICJwaHlzaWNhbF92b2x1bWVzL3B2MCIpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2hhc19ub2RlKG4sICJwaHlzaWNhbF92b2x1bWVzL3B2MC9pZCIpKTsKKworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ19maW5kX3N0cihuLCAiaWQiLCAiZm9vIiksICJ5YWRhLXlhZGEiKSk7CisJQ1VfQVNTRVJUKCFzdHJjbXAoZG1fY29uZmlnX2ZpbmRfc3RyKG4sICJpZHQiLCAiZm9vIiksICJmb28iKSk7CisKKwlDVV9BU1NFUlQoIXN0cmNtcChkbV9jb25maWdfZmluZF9zdHIobiwgInBoeXNpY2FsX3ZvbHVtZXMvcHYwL2JiIiwgImZvbyIpLCAiZm9vIikpOworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ19maW5kX3N0cihuLCAicGh5c2ljYWxfdm9sdW1lcy9wdjAvaWQiLCAiZm9vIiksICJhYmNkLWVmZ2giKSk7CisKKwlDVV9BU1NFUlQoIWRtX2NvbmZpZ19nZXRfdWludDMyKG4sICJpZCIsIE5VTEwpKTsKKwlDVV9BU1NFUlQoZG1fY29uZmlnX2dldF91aW50MzIobiwgImV4dGVudF9zaXplIiwgTlVMTCkpOworCisJLyogRklYTUU6IEN1cnJlbnRseSBldmVyeXRoaW5nIHBhcnNlcyBhcyBhIGxpc3QsIGV2ZW4gaWYgaXQncyBub3QgKi8KKwkvLyBDVV9BU1NFUlQoIWRtX2NvbmZpZ19nZXRfbGlzdCh0cmVlLT5yb290LCAiaWQiLCBOVUxMKSk7CisJLy8gQ1VfQVNTRVJUKCFkbV9jb25maWdfZ2V0X2xpc3QodHJlZS0+cm9vdCwgImV4dGVudF9zaXplIiwgTlVMTCkpOworCisJQ1VfQVNTRVJUKGRtX2NvbmZpZ19nZXRfbGlzdChuLCAiZmxhZ3MiLCAmdmFsdWUpKTsKKwlDVV9BU1NFUlQodmFsdWUtPm5leHQgPT0gTlVMTCk7IC8qIGFuIGVtcHR5IGxpc3QgKi8KKwlDVV9BU1NFUlQoZG1fY29uZmlnX2dldF9saXN0KG4sICJzdGF0dXMiLCAmdmFsdWUpKTsKKwlDVV9BU1NFUlQodmFsdWUtPm5leHQgIT0gTlVMTCk7IC8qIGEgbm9uLWVtcHR5IGxpc3QgKi8KKworCWRtX2NvbmZpZ19kZXN0cm95KHRyZWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Nhc2NhZGUodm9pZCkKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnQxID0gZG1fY29uZmlnX2Zyb21fc3RyaW5nKGNvbmYpLAorCQkgICAgICAgICAgICAgICp0MiA9IGRtX2NvbmZpZ19mcm9tX3N0cmluZyhvdmVybGF5KSwKKwkJICAgICAgICAgICAgICAqdHJlZSA9IGRtX2NvbmZpZ19pbnNlcnRfY2FzY2FkZWRfdHJlZSh0MiwgdDEpOworCisJQ1VfQVNTRVJUKCFzdHJjbXAoZG1fY29uZmlnX3RyZWVfZmluZF9zdHIodHJlZSwgImlkIiwgImZvbyIpLCAieW9kYS1zb2RhIikpOworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyKHRyZWUsICJpZHQiLCAiZm9vIiksICJmb28iKSk7CisKKwlDVV9BU1NFUlQoIXN0cmNtcChkbV9jb25maWdfdHJlZV9maW5kX3N0cih0cmVlLCAicGh5c2ljYWxfdm9sdW1lcy9wdjAvYmIiLCAiZm9vIiksICJmb28iKSk7CisJQ1VfQVNTRVJUKCFzdHJjbXAoZG1fY29uZmlnX3RyZWVfZmluZF9zdHIodHJlZSwgInBoeXNpY2FsX3ZvbHVtZXMvcHYxL2lkIiwgImZvbyIpLCAiaGdmZS1kY2JhIikpOworCUNVX0FTU0VSVCghc3RyY21wKGRtX2NvbmZpZ190cmVlX2ZpbmRfc3RyKHRyZWUsICJwaHlzaWNhbF92b2x1bWVzL3B2My9pZCIsICJmb28iKSwgImRiY2QtZWZnaCIpKTsKKworCWRtX2NvbmZpZ19kZXN0cm95KHQxKTsKKwlkbV9jb25maWdfZGVzdHJveSh0Mik7Cit9CisKK0NVX1Rlc3RJbmZvIGNvbmZpZ19saXN0W10gPSB7CisJeyAoY2hhciopInBhcnNlIiwgdGVzdF9wYXJzZSB9LAorCXsgKGNoYXIqKSJjbG9uZSIsIHRlc3RfY2xvbmUgfSwKKwl7IChjaGFyKikiY2FzY2FkZSIsIHRlc3RfY2FzY2FkZSB9LAorCUNVX1RFU1RfSU5GT19OVUxMCit9OwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L2RtbGlzdF90LmMgYi90ZXN0L3VuaXQvZG1saXN0X3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTgyZTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L2RtbGlzdF90LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ1bml0cy5oIgorCitpbnQgZG1saXN0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGRtbGlzdF9maW5pKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZG1saXN0X3NwbGljZSh2b2lkKQoreworCXN0cnVjdCBkbV9saXN0IGFbMTBdOworCXN0cnVjdCBkbV9saXN0IGxpc3QxOworCXN0cnVjdCBkbV9saXN0IGxpc3QyOworCXVuc2lnbmVkIGk7CisKKwlkbV9saXN0X2luaXQoJmxpc3QxKTsKKwlkbV9saXN0X2luaXQoJmxpc3QyKTsKKworCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKGEpOyBpKyspCisJCWRtX2xpc3RfYWRkKCZsaXN0MSwgJmFbaV0pOworCisJZG1fbGlzdF9zcGxpY2UoJmxpc3QyLCAmbGlzdDEpOworCUNVX0FTU0VSVF9FUVVBTChkbV9saXN0X3NpemUoJmxpc3QxKSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKGRtX2xpc3Rfc2l6ZSgmbGlzdDIpLCAxMCk7Cit9CisKK0NVX1Rlc3RJbmZvIGRtbGlzdF9saXN0W10gPSB7CisJeyAoY2hhciopImRtbGlzdF9zcGxpY2UiLCB0ZXN0X2RtbGlzdF9zcGxpY2UgfSwKKwkvL3sgKGNoYXIqKSJkbWxpc3QiLCB0ZXN0X3N0cm5jcHkgfSwKKwlDVV9URVNUX0lORk9fTlVMTAorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9kbXN0YXR1c190LmMgYi90ZXN0L3VuaXQvZG1zdGF0dXNfdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvZG1zdGF0dXNfdC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidW5pdHMuaCIKKworc3RhdGljIHN0cnVjdCBkbV9wb29sICpfbWVtOworCitpbnQgZG1zdGF0dXNfaW5pdCh2b2lkKQoreworCV9tZW0gPSBkbV9wb29sX2NyZWF0ZSgiZG1zdGF0dXMgdGVzdCIsIDEwMjQpOworCXJldHVybiAoX21lbSA9PSBOVUxMKTsKK30KKworaW50IGRtc3RhdHVzX2Zpbmkodm9pZCkKK3sKKwlkbV9wb29sX2Rlc3Ryb3koX21lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF90ZXN0X21pcnJvcl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3QgZG1fc3RhdHVzX21pcnJvciAqcyA9IE5VTEw7CisKKwlDVV9BU1NFUlQoZG1fZ2V0X3N0YXR1c19taXJyb3IoX21lbSwKKwkJCQkgICAgICAgIjIgMjUzOjEgMjUzOjIgODAvODEgMSBBRCAzIGRpc2sgMjUzOjAgQSIsCisJCQkJICAgICAgICZzKSk7CisJaWYgKHMpIHsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPnRvdGFsX3JlZ2lvbnMsIDgxKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPmluc3luY19yZWdpb25zLCA4MCk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5kZXZfY291bnQsIDIpOworCQlDVV9BU1NFUlRfRVFVQUwocy0+ZGV2c1swXS5oZWFsdGgsICdBJyk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5kZXZzWzBdLm1ham9yLCAyNTMpOworCQlDVV9BU1NFUlRfRVFVQUwocy0+ZGV2c1swXS5taW5vciwgMSk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5kZXZzWzFdLmhlYWx0aCwgJ0QnKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPmRldnNbMV0ubWFqb3IsIDI1Myk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5kZXZzWzFdLm1pbm9yLCAyKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPmxvZ19jb3VudCwgMSk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5sb2dzWzBdLm1ham9yLCAyNTMpOworCQlDVV9BU1NFUlRfRVFVQUwocy0+bG9nc1swXS5taW5vciwgMCk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5sb2dzWzBdLmhlYWx0aCwgJ0EnKTsKKwkJQ1VfQVNTRVJUKCFzdHJjbXAocy0+bG9nX3R5cGUsICJkaXNrIikpOworCX0KKworCUNVX0FTU0VSVChkbV9nZXRfc3RhdHVzX21pcnJvcihfbWVtLAorCQkJCSAgICAgICAiNCAyNTM6MSAyNTM6MiAyNTM6MyAyNTM6NCAxMC8xMCAxIEFERkYgMSBjb3JlIiwKKwkJCQkgICAgICAgJnMpKTsKKwlpZiAocykgeworCQlDVV9BU1NFUlRfRVFVQUwocy0+dG90YWxfcmVnaW9ucywgMTApOworCQlDVV9BU1NFUlRfRVFVQUwocy0+aW5zeW5jX3JlZ2lvbnMsIDEwKTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPmRldl9jb3VudCwgNCk7CisJCUNVX0FTU0VSVF9FUVVBTChzLT5kZXZzWzNdLm1pbm9yLCA0KTsKKwkJQ1VfQVNTRVJUX0VRVUFMKHMtPmRldnNbM10uaGVhbHRoLCAnRicpOworCQlDVV9BU1NFUlRfRVFVQUwocy0+bG9nX2NvdW50LCAwKTsKKwkJQ1VfQVNTRVJUKCFzdHJjbXAocy0+bG9nX3R5cGUsICJjb3JlIikpOworCX0KK30KKworQ1VfVGVzdEluZm8gZG1zdGF0dXNfbGlzdFtdID0geworCXsgKGNoYXIqKSJtaXJyb3Jfc3RhdHVzIiwgX3Rlc3RfbWlycm9yX3N0YXR1cyB9LAorCUNVX1RFU1RfSU5GT19OVUxMCit9OwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L21hdGNoZXJfZGF0YS5oIGIvdGVzdC91bml0L21hdGNoZXJfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGJiZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvbWF0Y2hlcl9kYXRhLmgKQEAgLTAsMCArMSwxMDEzIEBACitzdHJ1Y3QgY2hlY2tfaXRlbSB7CisJY29uc3QgY2hhciAqc3RyOworCWludCBleHBlY3RlZDsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZfcGF0dGVybnNbXSA9IHsKKwkibG9vcC9bMC05XSsiLAorCSJoZFthLWRdWzAtNV0rIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbm9ucHJpbnRfcGF0dGVybnNbXSA9IHsKKwkiZm9vXHg4MCIgImJhciIsCisJImZvb1x4YzIiICJiIiwKKwkiXHg4MCIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaGVja19pdGVtIG5vbnByaW50W10gPSB7CisJeyAiZm9vXHgyZSIgImJhciIsIDAgfSwKKwl7ICJmb29ceDgwIiAiYmFyIiwgMyB9LAorCXsgImZvb1x4YzIiICJiIiwgMiB9LAorCXsgIlx4ODAiLCAzIH0sCisJeyBOVUxMLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpyYW5kb21fcGF0dGVybnNbXSA9IHsKKwkiKCgoYT8pKChbVWJdKil8eikpKCgoW3FyXXxYKSspKFtRbl0qKSkpKyIsCisJIltIWmVqdHV3XSoiLAorCSIoKEJ8cykqKXwoKCgoW0Z2XWwpKE4rKSkoKFtlbF18QykodEopKSk/KSIsCisJIigoKFtNYV0/KXwodCopKSopfCgoKFtjbV1FKXwoTT8pKXwoKFtCRV1bRVZdKXwoW1FqXVtNaF0pKSkiLAorCSIoKCgoW2J3XSopfChbSU9dKikpKCh6SykqKSl8KCgocFUpfChpfHEpKXwoKHo/KXwoW0hMXT8pKSkpKiIsCisJIigoKFtQdF0/KXxbVHJdKT8pKChIcSkqKSIsCisJIltIT1hjZmdpa29zdnd4el0iLAorCSJbQkNFRkdITlBUVVdmamxwcnN5XSIsCisJIigoKChhRCkqKXwoW1hvXSspKSspKChbSEtuXSgoW0VxXXxbSlFdKShJKikpKSopIiwKKwkiKFtMTldZZWdodl18ZSkqIiwKKwkiKCgoeShMKikpKil8KCgoW0VQXSspKFcrKSkqKSkqIiwKKwkiVSoiLAorCSIoKCgoUispKFd8W1FyXSkpfChbcHldKykpKykoW0xNXSopIiwKKwkiKChbRE9qeF0oRChiPykpKXwoW0tlXSopKSoiLAorCSIoKChbbHNdKGN8W0ZUXSkpKikoW0pTXSopKSoiLAorCSIoKGw/KXwoKFtHel0rKXwoRCopKSkqIiwKKwkiW0FCZ2puXSIsCisJIigoKHF8W2RnXSk/KXwoW1VrXSopKSgoKFtGbF0/KXwoW1J5XSspKXwoKFtJUl18Yyl8KFQ/KSkpIiwKKwkiKCgoW2FuXXxQKXxbSnddKSgoYSopfChtKikpKSoiLAorCSIoKCgoUltodF0pKGgrKSk/KXwoKFtwel0obj8pKSspKSsiLAorCSIoKCgoW0RjXWIpKFtTcF1bSWldKSl8KChrfEYpKikpfFtVaW92el0pKiIsCisJIltSZXNdKiIsCisJIltabF18YSIsCisJIl5bQU5aZGZdJCIsCisJIltFbl18KCgoUSspKFUrKSkoW3B0XSopKSIsCisJIltBREVJTVFVV1haaGtscnN2el0iLAorCSIoKChTKHkqKSkqKXwoaiopKSoiLAorCSJuKiIsCisJIltOVWF1XSoiLAorCSIoKCgoWiopKER8W05kXSkpfCgoW25wXXxCKSspKXwoKFtYeV1bRmldKSopKSsiLAorCSIoKChbRVpdPyl8KGRbSFJdKSkqKSgoKFtIZ118cSkoUCspKSopIiwKKwkicSIsCisJIigobSopfChwfEIpKXwoKCgoeD8pfCh0KykpKChbU2JdW1BYXSkoT3xbSE1dKSkpKykiLAorCSIoKCgoQSopKHpbUlNdKSkqKXwoKCh6KykoUSopKSspKSoiLAorCSIoKChNKikoW1V1XSopKSspfFtVa10iLAorCSJbaW12XSIsCisJIltHTFNjaHR3XSgoW1l3XSgoRltEZF0pfChbVHddKykpKT8pIiwKKwkiKFtNT1pqXSopKFN8W1drbnJdKSIsCisJIigoR3xxKSopW0JIS05dIiwKKwkiKCgoKE5XKXwoW0FvXT8pKXwoKGx8W1VWXSkrKSkrKXwoKGl8KHoqKSkqKSIsCisJIigoKChaKyl8KFtJUl0/KSl8KEwqKSl8KFtKS1FdKykpKyIsCisJIihbQmRpbl0oUyopKSsiLAorCSJbSExOU1RwXSoiLAorCSIoKChKKikoW0JxXXxbWXVdKSkqKXwoW0t2XSopIiwKKwkiKCgoKFtCSl18W1p5XSkod0kpKSopKHkqKSkrIiwKKwkiKCgoaEYpKyl8KEgqKSkqIiwKKwkiKCgoW1FVXVtQal0pKFtHUV0/KSkrKXxbUFdvXSIsCisJIigoKChbY3FdW0JYXSk/KXwoKGZbREldKSopKSopKChbR01dKilbU1ZZcl0pIiwKKwkiKChbWnRdKil8KChxeCl8KChbQlZdKykoZj8pKSkpKiIsCisJIltJTFdZaHN4XSoiLAorCSIoKFtVeV0qKXxbc3ZdKXwoW05TY10qKSIsCisJIigoYyopfChbSlVmaHldPykpKyIsCisJIigoKHEqKShbU29dKikpKCgoZ1tqcV0pKGo/KSkrKSkqIiwKKwkiKChiKyl8KCgoVCspKFtmd11UKSk/KSkqIiwKKwkiKCgoW0RTXT8pfChbVGhdfHUpKShRKikpKiIsCisJIltGS0xYXXwoKChbZnddKEw/KSkoKFtncV0qKXwoTz8pKSk/KSIsCisJIigoKFtIWl0rKXUpKil8W0FQV2lqbl0iLAorCSIoZSopfCgoKHY/KXwoKEorKShIYikpKT8pIiwKKwkiKGV8KCh3KylmKSkqIiwKKwkiW0JFSEtQUVZkZWxucXldIiwKKwkiKCgoKEJ8TikocyopKXxbUnJdKSgoKGc/KXwoW3J2XSspKSspKSsiLAorCSIoKChzKil8KEsqKSkoW0FQXUcpKSoiLAorCSJbQ0VMVHBdIiwKKwkiKChbRnFdPyl8KFtBbF0rKSkqIiwKKwkiKCgoKHI/KXwoeVtqeF0pKXwoW21wXSopKSspfCgoQihTKikpKikiLAorCSIoKChbRXFdKyl8KFlbZHNdKSl8KHh8KGl8W0t1XSkpKVtJSk5ydnldIiwKKwkiKCgoW05PXSopW0l4XSkrKShbSmVucV0rKSIsCisJIigoKChbSFBdKikoanx5KSkqKVtZbHF2eV0pKiIsCisJIltQVHZdKyIsCisJIltBSU5TWmhweF18KFtFT1laXSopIiwKKwkiKFtBQkNGUXZdKikoKChbWnhdfGgpKyl8KFtlal0qKSkiLAorCSIoKChbcHJdKil8KChbRHFdfHApfChIPykpKT8pKFtOUlVYbW9xXSopIiwKKwkiKChbZXJdKil8KFtteF0qKSkoKChuVikoW2FtXT8pKSspIiwKKwkiW0JIUFJscHVdIiwKKwkiKCgoKFtBaF18W3R4XSl8KGV8W3V5XSkpPykoKChbZmxdKykoW1Z6XXx2KSkqKSkqIiwKKwkiW0FHZG1dIiwKKwkiKCgoSyopXihPKikkKXwoQj8pKSoiLAorCSIoKChbS3NdfFtLYV0pKil8KFtGU1RhYl0/KSk/IiwKKwkiKChba3ddKylbZWldKSgoW0h5XSopKChbTWNdKil8KEd8ZikpKSIsCisJIigoKChlKil8KFpmKSl8KFJ8W25xXSkpKCgoW0p6XXYpKFtSal0rKSkrKSkqIiwKKwkiKCgoYT8pfChlPykpKChbVWNdKikoUyspKSkqIiwKKwkiKCgoKEUrKShbTVpdPykpKyl8KCgoc3xbQXpdKXx6KSopKT8iLAorCSIoKCgoaVtNT10pKil8KChMSCkqKSl8KCgoQkEpfChbQUldKykpfFtVZ10pKSoiLAorCSJbRUdISUxjaG9dKiIsCisJIigoKFpbdnddKT8pKCh6fGcpKykpKCgoSHxVKShbaXZdUSkpfChbcXddPykpIiwKKwkiKChbZWhtcl18KChMW1V3XSkqKSkrKSgoYSspSSkiLAorCSJbRUtOU1dZYWdqXSgoKHZ8W1RYXSl8KFtVa10rKSkqKSIsCisJIigoKFJbTW9dKXwoTyopKXwoW0ZtXXwoW3F3XSopKSkoKG0qKXwoKFN8W0tpXSk/KSkiLAorCSIoKCgoa1ApfGMpPykoKChbZG9dKyl8KFtHaV0/KSkqKSkqIiwKKwkiKCheKEJ8VykkfChbV3ddKykpKFtub10qKSl8KCgoW2l2XT8pfChNKikpfCgoeHxMKT8pKSIsCisJIltBRUdQUlNiY2Zoc3ldIiwKKwkiW1diY2ZdfCgoKFtNT10/KXwoW05UXXxtKSkoKFtPb10/KShbV2ddKikpKSIsCisJIigoKFlaKSopW1BRVmVpXSkqIiwKKwkiW0dKS1l0XVtBRUdXZGVnbW50XSIsCisJIl5bQ0RFR0pLTlVWWVphZ2t2XSQiLAorCSIoW0RQV2J4XSopfCgoKHF8Qil8KFB8dSkpKChNW0JxXSkqKSkiLAorCSJbRkhJSlJUVllaZGlvcnN1dnpdKiIsCisJIihbTVdvcXZ6XSopfF4obCopIiwKKwkiKCgoSXxbUnhdKSopKChYW01mXSkoW1hhXUwpKSkoW0hhXXwoW0hZXSopKSIsCisJIigoKGx8W1NkXSkqKSgoKFtJeF0rKXwoW1hZXT8pKShaKikpKSsiLAorCU5VTEwKK307CisKK3N0cnVjdCBjaGVja19pdGVtIGRldmljZXNbXSA9IHsKKwl7ICIvZGV2IiwgMCB9LAorCXsgIi9kZXYvLmRldmZzZCIsIDAgfSwKKwl7ICIvZGV2L2NwdSIsIDAgfSwKKwl7ICIvZGV2L2NwdS9tdHJyIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluayIsIDAgfSwKKwl7ICIvZGV2L25ldGxpbmsvcm91dGUiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL3NraXAiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL1VTRVJTT0NLIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay9md21vbml0b3IiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL0FSUEQiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL1JPVVRFNiIsIDAgfSwKKwl7ICIvZGV2L25ldGxpbmsvSVA2X0ZXIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAwIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAxIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAyIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAzIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA0IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA1IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA2IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA3IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA4IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXA5IiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAxMCIsIDAgfSwKKwl7ICIvZGV2L25ldGxpbmsvdGFwMTEiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL3RhcDEyIiwgMCB9LAorCXsgIi9kZXYvbmV0bGluay90YXAxMyIsIDAgfSwKKwl7ICIvZGV2L25ldGxpbmsvdGFwMTQiLCAwIH0sCisJeyAiL2Rldi9uZXRsaW5rL3RhcDE1IiwgMCB9LAorCXsgIi9kZXYvc2htIiwgMCB9LAorCXsgIi9kZXYvbWVtIiwgMCB9LAorCXsgIi9kZXYva21lbSIsIDAgfSwKKwl7ICIvZGV2L251bGwiLCAwIH0sCisJeyAiL2Rldi9wb3J0IiwgMCB9LAorCXsgIi9kZXYvemVybyIsIDAgfSwKKwl7ICIvZGV2L2Z1bGwiLCAwIH0sCisJeyAiL2Rldi9yYW5kb20iLCAwIH0sCisJeyAiL2Rldi91cmFuZG9tIiwgMCB9LAorCXsgIi9kZXYvdHR5IiwgMCB9LAorCXsgIi9kZXYvY29uc29sZSIsIDAgfSwKKwl7ICIvZGV2L3ZjIiwgMCB9LAorCXsgIi9kZXYvdmMvMSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzIiLCAwIH0sCisJeyAiL2Rldi92Yy8zIiwgMCB9LAorCXsgIi9kZXYvdmMvNCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzUiLCAwIH0sCisJeyAiL2Rldi92Yy82IiwgMCB9LAorCXsgIi9kZXYvdmMvNyIsIDAgfSwKKwl7ICIvZGV2L3ZjLzgiLCAwIH0sCisJeyAiL2Rldi92Yy85IiwgMCB9LAorCXsgIi9kZXYvdmMvMTAiLCAwIH0sCisJeyAiL2Rldi92Yy8xMSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzEyIiwgMCB9LAorCXsgIi9kZXYvdmMvMTMiLCAwIH0sCisJeyAiL2Rldi92Yy8xNCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzE1IiwgMCB9LAorCXsgIi9kZXYvdmMvMTYiLCAwIH0sCisJeyAiL2Rldi92Yy8xNyIsIDAgfSwKKwl7ICIvZGV2L3ZjLzE4IiwgMCB9LAorCXsgIi9kZXYvdmMvMTkiLCAwIH0sCisJeyAiL2Rldi92Yy8yMCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzIxIiwgMCB9LAorCXsgIi9kZXYvdmMvMjIiLCAwIH0sCisJeyAiL2Rldi92Yy8yMyIsIDAgfSwKKwl7ICIvZGV2L3ZjLzI0IiwgMCB9LAorCXsgIi9kZXYvdmMvMjUiLCAwIH0sCisJeyAiL2Rldi92Yy8yNiIsIDAgfSwKKwl7ICIvZGV2L3ZjLzI3IiwgMCB9LAorCXsgIi9kZXYvdmMvMjgiLCAwIH0sCisJeyAiL2Rldi92Yy8yOSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzMwIiwgMCB9LAorCXsgIi9kZXYvdmMvMzEiLCAwIH0sCisJeyAiL2Rldi92Yy8zMiIsIDAgfSwKKwl7ICIvZGV2L3ZjLzMzIiwgMCB9LAorCXsgIi9kZXYvdmMvMzQiLCAwIH0sCisJeyAiL2Rldi92Yy8zNSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzM2IiwgMCB9LAorCXsgIi9kZXYvdmMvMzciLCAwIH0sCisJeyAiL2Rldi92Yy8zOCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzM5IiwgMCB9LAorCXsgIi9kZXYvdmMvNDAiLCAwIH0sCisJeyAiL2Rldi92Yy80MSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzQyIiwgMCB9LAorCXsgIi9kZXYvdmMvNDMiLCAwIH0sCisJeyAiL2Rldi92Yy80NCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzQ1IiwgMCB9LAorCXsgIi9kZXYvdmMvNDYiLCAwIH0sCisJeyAiL2Rldi92Yy80NyIsIDAgfSwKKwl7ICIvZGV2L3ZjLzQ4IiwgMCB9LAorCXsgIi9kZXYvdmMvNDkiLCAwIH0sCisJeyAiL2Rldi92Yy81MCIsIDAgfSwKKwl7ICIvZGV2L3ZjLzUxIiwgMCB9LAorCXsgIi9kZXYvdmMvNTIiLCAwIH0sCisJeyAiL2Rldi92Yy81MyIsIDAgfSwKKwl7ICIvZGV2L3ZjLzU0IiwgMCB9LAorCXsgIi9kZXYvdmMvNTUiLCAwIH0sCisJeyAiL2Rldi92Yy81NiIsIDAgfSwKKwl7ICIvZGV2L3ZjLzU3IiwgMCB9LAorCXsgIi9kZXYvdmMvNTgiLCAwIH0sCisJeyAiL2Rldi92Yy81OSIsIDAgfSwKKwl7ICIvZGV2L3ZjLzYwIiwgMCB9LAorCXsgIi9kZXYvdmMvNjEiLCAwIH0sCisJeyAiL2Rldi92Yy82MiIsIDAgfSwKKwl7ICIvZGV2L3ZjLzYzIiwgMCB9LAorCXsgIi9kZXYvdmMvMCIsIDAgfSwKKwl7ICIvZGV2L3B0bXgiLCAwIH0sCisJeyAiL2Rldi9taXNjIiwgMCB9LAorCXsgIi9kZXYvbWlzYy9wc2F1eCIsIDAgfSwKKwl7ICIvZGV2L3B0eSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tOCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tOSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTExIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xOCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20zMCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMzEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTMyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20zMyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMzQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTM1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20zNiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMzciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTM4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20zOSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNDAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTQxIiwgMCB9LAorCXsgIi9kZXYvcHR5L200MiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNDMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTQ0IiwgMCB9LAorCXsgIi9kZXYvcHR5L200NSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNDYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTQ3IiwgMCB9LAorCXsgIi9kZXYvcHR5L200OCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNDkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTUwIiwgMCB9LAorCXsgIi9kZXYvcHR5L201MSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNTIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTUzIiwgMCB9LAorCXsgIi9kZXYvcHR5L201NCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNTUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTU2IiwgMCB9LAorCXsgIi9kZXYvcHR5L201NyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNTgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTU5IiwgMCB9LAorCXsgIi9kZXYvcHR5L202MCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNjEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTYyIiwgMCB9LAorCXsgIi9kZXYvcHR5L202MyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNjQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTY1IiwgMCB9LAorCXsgIi9kZXYvcHR5L202NiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNjciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTY4IiwgMCB9LAorCXsgIi9kZXYvcHR5L202OSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNzAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTcxIiwgMCB9LAorCXsgIi9kZXYvcHR5L203MiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNzMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTc0IiwgMCB9LAorCXsgIi9kZXYvcHR5L203NSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNzYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTc3IiwgMCB9LAorCXsgIi9kZXYvcHR5L203OCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tNzkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTgwIiwgMCB9LAorCXsgIi9kZXYvcHR5L204MSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tODIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTgzIiwgMCB9LAorCXsgIi9kZXYvcHR5L204NCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tODUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTg2IiwgMCB9LAorCXsgIi9kZXYvcHR5L204NyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tODgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTg5IiwgMCB9LAorCXsgIi9kZXYvcHR5L205MCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tOTEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTkyIiwgMCB9LAorCXsgIi9kZXYvcHR5L205MyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tOTQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTk1IiwgMCB9LAorCXsgIi9kZXYvcHR5L205NiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tOTciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTk4IiwgMCB9LAorCXsgIi9kZXYvcHR5L205OSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTAwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMDEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEwMiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTAzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMDQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEwNSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTA2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMDciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEwOCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTA5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMTAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTExMSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTEyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMTMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTExNCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTE1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMTYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTExNyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTE4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMTkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEyMCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTIxIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMjIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEyMyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTI0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMjUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEyNiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTI3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMjgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEyOSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTMwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMzEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEzMiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTMzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMzQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEzNSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTM2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xMzciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTEzOCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTM5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNDAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE0MSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTQyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNDMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE0NCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTQ1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNDYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE0NyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTQ4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNDkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE1MCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTUxIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNTIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE1MyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTU0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNTUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE1NiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTU3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNTgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE1OSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTYwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNjEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE2MiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTYzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNjQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE2NSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTY2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNjciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE2OCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTY5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNzAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE3MSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTcyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNzMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE3NCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTc1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNzYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE3NyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTc4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xNzkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE4MCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTgxIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xODIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE4MyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTg0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xODUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE4NiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTg3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xODgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE4OSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTkwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xOTEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE5MiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTkzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20xOTQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE5NSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTk2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20xOTciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTE5OCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMTk5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMDAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIwMSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjAyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMDMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIwNCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjA1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMDYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIwNyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjA4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMDkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIxMCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjExIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMTIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIxMyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjE0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMTUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIxNiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjE3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMTgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIxOSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjIwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMjEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIyMiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjIzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMjQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIyNSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjI2IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMjciLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIyOCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjI5IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMzAiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIzMSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjMyIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMzMiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIzNCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjM1IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMzYiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTIzNyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjM4IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yMzkiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI0MCIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjQxIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNDIiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI0MyIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjQ0IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNDUiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI0NiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjQ3IiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNDgiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI0OSIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjUwIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNTEiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI1MiIsIDAgfSwKKwl7ICIvZGV2L3B0eS9tMjUzIiwgMCB9LAorCXsgIi9kZXYvcHR5L20yNTQiLCAwIH0sCisJeyAiL2Rldi9wdHkvbTI1NSIsIDAgfSwKKwl7ICIvZGV2L3B0cyIsIDAgfSwKKwl7ICIvZGV2L3B0cy8wIiwgMCB9LAorCXsgIi9kZXYvcHRzLzEiLCAwIH0sCisJeyAiL2Rldi9wdHMvMiIsIDAgfSwKKwl7ICIvZGV2L3B0cy8zIiwgMCB9LAorCXsgIi9kZXYvcHRzLzQiLCAwIH0sCisJeyAiL2Rldi9wdHMvNSIsIDAgfSwKKwl7ICIvZGV2L3B0cy82IiwgMCB9LAorCXsgIi9kZXYvcHRzLzciLCAwIH0sCisJeyAiL2Rldi92Y2MiLCAwIH0sCisJeyAiL2Rldi92Y2MvMCIsIDAgfSwKKwl7ICIvZGV2L3ZjYy9hIiwgMCB9LAorCXsgIi9kZXYvdmNjLzEiLCAwIH0sCisJeyAiL2Rldi92Y2MvYTEiLCAwIH0sCisJeyAiL2Rldi92Y2MvMiIsIDAgfSwKKwl7ICIvZGV2L3ZjYy9hMiIsIDAgfSwKKwl7ICIvZGV2L3ZjYy8zIiwgMCB9LAorCXsgIi9kZXYvdmNjL2EzIiwgMCB9LAorCXsgIi9kZXYvdmNjLzUiLCAwIH0sCisJeyAiL2Rldi92Y2MvYTUiLCAwIH0sCisJeyAiL2Rldi92Y2MvNCIsIDAgfSwKKwl7ICIvZGV2L3ZjYy9hNCIsIDAgfSwKKwl7ICIvZGV2L3ZjYy82IiwgMCB9LAorCXsgIi9kZXYvdmNjL2E2IiwgMCB9LAorCXsgIi9kZXYvdmNjLzciLCAwIH0sCisJeyAiL2Rldi92Y2MvYTciLCAwIH0sCisJeyAiL2Rldi90dHMiLCAwIH0sCisJeyAiL2Rldi90dHMvMCIsIDAgfSwKKwl7ICIvZGV2L2N1YSIsIDAgfSwKKwl7ICIvZGV2L2N1YS8wIiwgMCB9LAorCXsgIi9kZXYvaWRlIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwL2J1czAiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wL2Rpc2MiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDEiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDIiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDMiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDQiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDUiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDYiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDciLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDgiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQxIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MS9sdW4wIiwgMCB9LAorCXsgIi9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MS9sdW4wL2Rpc2MiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQxL2x1bjAvcGFydDEiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMSIsIDAgfSwKKwl7ICIvZGV2L2lkZS9ob3N0MC9idXMxL3RhcmdldDAiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMS90YXJnZXQwL2x1bjAiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMS90YXJnZXQwL2x1bjAvZGlzYyIsIDAgfSwKKwl7ICIvZGV2L2lkZS9ob3N0MC9idXMxL3RhcmdldDAvbHVuMC9wYXJ0MSIsIDAgfSwKKwl7ICIvZGV2L2lkZS9ob3N0MC9idXMxL3RhcmdldDEiLCAwIH0sCisJeyAiL2Rldi9pZGUvaG9zdDAvYnVzMS90YXJnZXQxL2x1bjAiLCAwIH0sCisJeyAiL2Rldi9kaXNjcyIsIDAgfSwKKwl7ICIvZGV2L2Rpc2NzL2Rpc2MwIiwgMCB9LAorCXsgIi9kZXYvZGlzY3MvZGlzYzEiLCAwIH0sCisJeyAiL2Rldi9kaXNjcy9kaXNjMiIsIDAgfSwKKwl7ICIvZGV2L2Zsb3BweSIsIDAgfSwKKwl7ICIvZGV2L2Zsb3BweS8wdTE0NDAiLCAwIH0sCisJeyAiL2Rldi9mbG9wcHkvMHUxNjgwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1MTcyMiIsIDAgfSwKKwl7ICIvZGV2L2Zsb3BweS8wdTE3NDMiLCAwIH0sCisJeyAiL2Rldi9mbG9wcHkvMHUxNzYwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1MTkyMCIsIDAgfSwKKwl7ICIvZGV2L2Zsb3BweS8wdTE4NDAiLCAwIH0sCisJeyAiL2Rldi9mbG9wcHkvMHUxNjAwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1MzYwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1NzIwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1ODIwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1ODMwIiwgMCB9LAorCXsgIi9kZXYvZmxvcHB5LzB1MTA0MCIsIDAgfSwKKwl7ICIvZGV2L2Zsb3BweS8wdTExMjAiLCAwIH0sCisJeyAiL2Rldi9mbG9wcHkvMHU4MDAiLCAwIH0sCisJeyAiL2Rldi9mbG9wcHkvMCIsIDAgfSwKKwl7ICIvZGV2L2xvb3AiLCAwIH0sCisJeyAiL2Rldi9sb29wLzAiLCAxIH0sCisJeyAiL2Rldi9sb29wLzEiLCAxIH0sCisJeyAiL2Rldi9sb29wLzIiLCAxIH0sCisJeyAiL2Rldi9sb29wLzMiLCAxIH0sCisJeyAiL2Rldi9sb29wLzQiLCAxIH0sCisJeyAiL2Rldi9sb29wLzUiLCAxIH0sCisJeyAiL2Rldi9sb29wLzYiLCAxIH0sCisJeyAiL2Rldi9sb29wLzciLCAxIH0sCisJeyAiL2Rldi9jZHJvbXMiLCAwIH0sCisJeyAiL2Rldi9zb3VuZCIsIDAgfSwKKwl7ICIvZGV2L3NvdW5kL2RzcCIsIDAgfSwKKwl7ICIvZGV2L3NvdW5kL2RzcDEiLCAwIH0sCisJeyAiL2Rldi9zb3VuZC9taXhlciIsIDAgfSwKKwl7ICIvZGV2L3NvdW5kL21pZGkiLCAwIH0sCisJeyAiL2Rldi91c2IiLCAwIH0sCisJeyAiL2Rldi9yb290IiwgMCB9LAorCXsgIi9kZXYvaW5pdGN0bCIsIDAgfSwKKwl7ICIvZGV2L3hjb25zb2xlIiwgMCB9LAorCXsgIi9kZXYvZmQiLCAwIH0sCisJeyAiL2Rldi9zdGRpbiIsIDAgfSwKKwl7ICIvZGV2L3N0ZG91dCIsIDAgfSwKKwl7ICIvZGV2L3N0ZGVyciIsIDAgfSwKKwl7ICIvZGV2L3JvdXRlIiwgMCB9LAorCXsgIi9kZXYvc2tpcCIsIDAgfSwKKwl7ICIvZGV2L1VTRVJTT0NLIiwgMCB9LAorCXsgIi9kZXYvZndtb25pdG9yIiwgMCB9LAorCXsgIi9kZXYvQVJQRCIsIDAgfSwKKwl7ICIvZGV2L1JPVVRFNiIsIDAgfSwKKwl7ICIvZGV2L0lQNl9GVyIsIDAgfSwKKwl7ICIvZGV2L3RhcDAiLCAwIH0sCisJeyAiL2Rldi90YXAxIiwgMCB9LAorCXsgIi9kZXYvdGFwMiIsIDAgfSwKKwl7ICIvZGV2L3RhcDMiLCAwIH0sCisJeyAiL2Rldi90YXA0IiwgMCB9LAorCXsgIi9kZXYvdGFwNSIsIDAgfSwKKwl7ICIvZGV2L3RhcDYiLCAwIH0sCisJeyAiL2Rldi90YXA3IiwgMCB9LAorCXsgIi9kZXYvdGFwOCIsIDAgfSwKKwl7ICIvZGV2L3RhcDkiLCAwIH0sCisJeyAiL2Rldi90YXAxMCIsIDAgfSwKKwl7ICIvZGV2L3RhcDExIiwgMCB9LAorCXsgIi9kZXYvdGFwMTIiLCAwIH0sCisJeyAiL2Rldi90YXAxMyIsIDAgfSwKKwl7ICIvZGV2L3RhcDE0IiwgMCB9LAorCXsgIi9kZXYvdGFwMTUiLCAwIH0sCisJeyAiL2Rldi90dHkxIiwgMCB9LAorCXsgIi9kZXYvdHR5MiIsIDAgfSwKKwl7ICIvZGV2L3R0eTMiLCAwIH0sCisJeyAiL2Rldi90dHk0IiwgMCB9LAorCXsgIi9kZXYvdHR5NSIsIDAgfSwKKwl7ICIvZGV2L3R0eTYiLCAwIH0sCisJeyAiL2Rldi90dHk3IiwgMCB9LAorCXsgIi9kZXYvdHR5OCIsIDAgfSwKKwl7ICIvZGV2L3R0eTkiLCAwIH0sCisJeyAiL2Rldi90dHkxMCIsIDAgfSwKKwl7ICIvZGV2L3R0eTExIiwgMCB9LAorCXsgIi9kZXYvdHR5MTIiLCAwIH0sCisJeyAiL2Rldi90dHkxMyIsIDAgfSwKKwl7ICIvZGV2L3R0eTE0IiwgMCB9LAorCXsgIi9kZXYvdHR5MTUiLCAwIH0sCisJeyAiL2Rldi90dHkxNiIsIDAgfSwKKwl7ICIvZGV2L3R0eTE3IiwgMCB9LAorCXsgIi9kZXYvdHR5MTgiLCAwIH0sCisJeyAiL2Rldi90dHkxOSIsIDAgfSwKKwl7ICIvZGV2L3R0eTIwIiwgMCB9LAorCXsgIi9kZXYvdHR5MjEiLCAwIH0sCisJeyAiL2Rldi90dHkyMiIsIDAgfSwKKwl7ICIvZGV2L3R0eTIzIiwgMCB9LAorCXsgIi9kZXYvdHR5MjQiLCAwIH0sCisJeyAiL2Rldi90dHkyNSIsIDAgfSwKKwl7ICIvZGV2L3R0eTI2IiwgMCB9LAorCXsgIi9kZXYvdHR5MjciLCAwIH0sCisJeyAiL2Rldi90dHkyOCIsIDAgfSwKKwl7ICIvZGV2L3R0eTI5IiwgMCB9LAorCXsgIi9kZXYvdHR5MzAiLCAwIH0sCisJeyAiL2Rldi90dHkzMSIsIDAgfSwKKwl7ICIvZGV2L3R0eTMyIiwgMCB9LAorCXsgIi9kZXYvdHR5MzMiLCAwIH0sCisJeyAiL2Rldi90dHkzNCIsIDAgfSwKKwl7ICIvZGV2L3R0eTM1IiwgMCB9LAorCXsgIi9kZXYvdHR5MzYiLCAwIH0sCisJeyAiL2Rldi90dHkzNyIsIDAgfSwKKwl7ICIvZGV2L3R0eTM4IiwgMCB9LAorCXsgIi9kZXYvdHR5MzkiLCAwIH0sCisJeyAiL2Rldi90dHk0MCIsIDAgfSwKKwl7ICIvZGV2L3R0eTQxIiwgMCB9LAorCXsgIi9kZXYvdHR5NDIiLCAwIH0sCisJeyAiL2Rldi90dHk0MyIsIDAgfSwKKwl7ICIvZGV2L3R0eTQ0IiwgMCB9LAorCXsgIi9kZXYvdHR5NDUiLCAwIH0sCisJeyAiL2Rldi90dHk0NiIsIDAgfSwKKwl7ICIvZGV2L3R0eTQ3IiwgMCB9LAorCXsgIi9kZXYvdHR5NDgiLCAwIH0sCisJeyAiL2Rldi90dHk0OSIsIDAgfSwKKwl7ICIvZGV2L3R0eTUwIiwgMCB9LAorCXsgIi9kZXYvdHR5NTEiLCAwIH0sCisJeyAiL2Rldi90dHk1MiIsIDAgfSwKKwl7ICIvZGV2L3R0eTUzIiwgMCB9LAorCXsgIi9kZXYvdHR5NTQiLCAwIH0sCisJeyAiL2Rldi90dHk1NSIsIDAgfSwKKwl7ICIvZGV2L3R0eTU2IiwgMCB9LAorCXsgIi9kZXYvdHR5NTciLCAwIH0sCisJeyAiL2Rldi90dHk1OCIsIDAgfSwKKwl7ICIvZGV2L3R0eTU5IiwgMCB9LAorCXsgIi9kZXYvdHR5NjAiLCAwIH0sCisJeyAiL2Rldi90dHk2MSIsIDAgfSwKKwl7ICIvZGV2L3R0eTYyIiwgMCB9LAorCXsgIi9kZXYvdHR5NjMiLCAwIH0sCisJeyAiL2Rldi90dHkwIiwgMCB9LAorCXsgIi9kZXYvcHNhdXgiLCAwIH0sCisJeyAiL2Rldi9wdHlwMCIsIDAgfSwKKwl7ICIvZGV2L3B0eXAxIiwgMCB9LAorCXsgIi9kZXYvcHR5cDIiLCAwIH0sCisJeyAiL2Rldi9wdHlwMyIsIDAgfSwKKwl7ICIvZGV2L3B0eXA0IiwgMCB9LAorCXsgIi9kZXYvcHR5cDUiLCAwIH0sCisJeyAiL2Rldi9wdHlwNiIsIDAgfSwKKwl7ICIvZGV2L3B0eXA3IiwgMCB9LAorCXsgIi9kZXYvcHR5cDgiLCAwIH0sCisJeyAiL2Rldi9wdHlwOSIsIDAgfSwKKwl7ICIvZGV2L3B0eXBhIiwgMCB9LAorCXsgIi9kZXYvcHR5cGIiLCAwIH0sCisJeyAiL2Rldi9wdHlwYyIsIDAgfSwKKwl7ICIvZGV2L3B0eXBkIiwgMCB9LAorCXsgIi9kZXYvcHR5cGUiLCAwIH0sCisJeyAiL2Rldi9wdHlwZiIsIDAgfSwKKwl7ICIvZGV2L3B0eXEwIiwgMCB9LAorCXsgIi9kZXYvcHR5cTEiLCAwIH0sCisJeyAiL2Rldi9wdHlxMiIsIDAgfSwKKwl7ICIvZGV2L3B0eXEzIiwgMCB9LAorCXsgIi9kZXYvcHR5cTQiLCAwIH0sCisJeyAiL2Rldi9wdHlxNSIsIDAgfSwKKwl7ICIvZGV2L3B0eXE2IiwgMCB9LAorCXsgIi9kZXYvcHR5cTciLCAwIH0sCisJeyAiL2Rldi9wdHlxOCIsIDAgfSwKKwl7ICIvZGV2L3B0eXE5IiwgMCB9LAorCXsgIi9kZXYvcHR5cWEiLCAwIH0sCisJeyAiL2Rldi9wdHlxYiIsIDAgfSwKKwl7ICIvZGV2L3B0eXFjIiwgMCB9LAorCXsgIi9kZXYvcHR5cWQiLCAwIH0sCisJeyAiL2Rldi9wdHlxZSIsIDAgfSwKKwl7ICIvZGV2L3B0eXFmIiwgMCB9LAorCXsgIi9kZXYvcHR5cjAiLCAwIH0sCisJeyAiL2Rldi9wdHlyMSIsIDAgfSwKKwl7ICIvZGV2L3B0eXIyIiwgMCB9LAorCXsgIi9kZXYvcHR5cjMiLCAwIH0sCisJeyAiL2Rldi9wdHlyNCIsIDAgfSwKKwl7ICIvZGV2L3B0eXI1IiwgMCB9LAorCXsgIi9kZXYvcHR5cjYiLCAwIH0sCisJeyAiL2Rldi9wdHlyNyIsIDAgfSwKKwl7ICIvZGV2L3B0eXI4IiwgMCB9LAorCXsgIi9kZXYvcHR5cjkiLCAwIH0sCisJeyAiL2Rldi9wdHlyYSIsIDAgfSwKKwl7ICIvZGV2L3B0eXJiIiwgMCB9LAorCXsgIi9kZXYvcHR5cmMiLCAwIH0sCisJeyAiL2Rldi9wdHlyZCIsIDAgfSwKKwl7ICIvZGV2L3B0eXJlIiwgMCB9LAorCXsgIi9kZXYvcHR5cmYiLCAwIH0sCisJeyAiL2Rldi9wdHlzMCIsIDAgfSwKKwl7ICIvZGV2L3B0eXMxIiwgMCB9LAorCXsgIi9kZXYvcHR5czIiLCAwIH0sCisJeyAiL2Rldi9wdHlzMyIsIDAgfSwKKwl7ICIvZGV2L3B0eXM0IiwgMCB9LAorCXsgIi9kZXYvcHR5czUiLCAwIH0sCisJeyAiL2Rldi9wdHlzNiIsIDAgfSwKKwl7ICIvZGV2L3B0eXM3IiwgMCB9LAorCXsgIi9kZXYvcHR5czgiLCAwIH0sCisJeyAiL2Rldi9wdHlzOSIsIDAgfSwKKwl7ICIvZGV2L3B0eXNhIiwgMCB9LAorCXsgIi9kZXYvcHR5c2IiLCAwIH0sCisJeyAiL2Rldi9wdHlzYyIsIDAgfSwKKwl7ICIvZGV2L3B0eXNkIiwgMCB9LAorCXsgIi9kZXYvcHR5c2UiLCAwIH0sCisJeyAiL2Rldi9wdHlzZiIsIDAgfSwKKwl7ICIvZGV2L3B0eXQwIiwgMCB9LAorCXsgIi9kZXYvcHR5dDEiLCAwIH0sCisJeyAiL2Rldi9wdHl0MiIsIDAgfSwKKwl7ICIvZGV2L3B0eXQzIiwgMCB9LAorCXsgIi9kZXYvcHR5dDQiLCAwIH0sCisJeyAiL2Rldi9wdHl0NSIsIDAgfSwKKwl7ICIvZGV2L3B0eXQ2IiwgMCB9LAorCXsgIi9kZXYvcHR5dDciLCAwIH0sCisJeyAiL2Rldi9wdHl0OCIsIDAgfSwKKwl7ICIvZGV2L3B0eXQ5IiwgMCB9LAorCXsgIi9kZXYvcHR5dGEiLCAwIH0sCisJeyAiL2Rldi9wdHl0YiIsIDAgfSwKKwl7ICIvZGV2L3B0eXRjIiwgMCB9LAorCXsgIi9kZXYvcHR5dGQiLCAwIH0sCisJeyAiL2Rldi9wdHl0ZSIsIDAgfSwKKwl7ICIvZGV2L3B0eXRmIiwgMCB9LAorCXsgIi9kZXYvcHR5dTAiLCAwIH0sCisJeyAiL2Rldi9wdHl1MSIsIDAgfSwKKwl7ICIvZGV2L3B0eXUyIiwgMCB9LAorCXsgIi9kZXYvcHR5dTMiLCAwIH0sCisJeyAiL2Rldi9wdHl1NCIsIDAgfSwKKwl7ICIvZGV2L3B0eXU1IiwgMCB9LAorCXsgIi9kZXYvcHR5dTYiLCAwIH0sCisJeyAiL2Rldi9wdHl1NyIsIDAgfSwKKwl7ICIvZGV2L3B0eXU4IiwgMCB9LAorCXsgIi9kZXYvcHR5dTkiLCAwIH0sCisJeyAiL2Rldi9wdHl1YSIsIDAgfSwKKwl7ICIvZGV2L3B0eXViIiwgMCB9LAorCXsgIi9kZXYvcHR5dWMiLCAwIH0sCisJeyAiL2Rldi9wdHl1ZCIsIDAgfSwKKwl7ICIvZGV2L3B0eXVlIiwgMCB9LAorCXsgIi9kZXYvcHR5dWYiLCAwIH0sCisJeyAiL2Rldi9wdHl2MCIsIDAgfSwKKwl7ICIvZGV2L3B0eXYxIiwgMCB9LAorCXsgIi9kZXYvcHR5djIiLCAwIH0sCisJeyAiL2Rldi9wdHl2MyIsIDAgfSwKKwl7ICIvZGV2L3B0eXY0IiwgMCB9LAorCXsgIi9kZXYvcHR5djUiLCAwIH0sCisJeyAiL2Rldi9wdHl2NiIsIDAgfSwKKwl7ICIvZGV2L3B0eXY3IiwgMCB9LAorCXsgIi9kZXYvcHR5djgiLCAwIH0sCisJeyAiL2Rldi9wdHl2OSIsIDAgfSwKKwl7ICIvZGV2L3B0eXZhIiwgMCB9LAorCXsgIi9kZXYvcHR5dmIiLCAwIH0sCisJeyAiL2Rldi9wdHl2YyIsIDAgfSwKKwl7ICIvZGV2L3B0eXZkIiwgMCB9LAorCXsgIi9kZXYvcHR5dmUiLCAwIH0sCisJeyAiL2Rldi9wdHl2ZiIsIDAgfSwKKwl7ICIvZGV2L3B0eXcwIiwgMCB9LAorCXsgIi9kZXYvcHR5dzEiLCAwIH0sCisJeyAiL2Rldi9wdHl3MiIsIDAgfSwKKwl7ICIvZGV2L3B0eXczIiwgMCB9LAorCXsgIi9kZXYvcHR5dzQiLCAwIH0sCisJeyAiL2Rldi9wdHl3NSIsIDAgfSwKKwl7ICIvZGV2L3B0eXc2IiwgMCB9LAorCXsgIi9kZXYvcHR5dzciLCAwIH0sCisJeyAiL2Rldi9wdHl3OCIsIDAgfSwKKwl7ICIvZGV2L3B0eXc5IiwgMCB9LAorCXsgIi9kZXYvcHR5d2EiLCAwIH0sCisJeyAiL2Rldi9wdHl3YiIsIDAgfSwKKwl7ICIvZGV2L3B0eXdjIiwgMCB9LAorCXsgIi9kZXYvcHR5d2QiLCAwIH0sCisJeyAiL2Rldi9wdHl3ZSIsIDAgfSwKKwl7ICIvZGV2L3B0eXdmIiwgMCB9LAorCXsgIi9kZXYvcHR5eDAiLCAwIH0sCisJeyAiL2Rldi9wdHl4MSIsIDAgfSwKKwl7ICIvZGV2L3B0eXgyIiwgMCB9LAorCXsgIi9kZXYvcHR5eDMiLCAwIH0sCisJeyAiL2Rldi9wdHl4NCIsIDAgfSwKKwl7ICIvZGV2L3B0eXg1IiwgMCB9LAorCXsgIi9kZXYvcHR5eDYiLCAwIH0sCisJeyAiL2Rldi9wdHl4NyIsIDAgfSwKKwl7ICIvZGV2L3B0eXg4IiwgMCB9LAorCXsgIi9kZXYvcHR5eDkiLCAwIH0sCisJeyAiL2Rldi9wdHl4YSIsIDAgfSwKKwl7ICIvZGV2L3B0eXhiIiwgMCB9LAorCXsgIi9kZXYvcHR5eGMiLCAwIH0sCisJeyAiL2Rldi9wdHl4ZCIsIDAgfSwKKwl7ICIvZGV2L3B0eXhlIiwgMCB9LAorCXsgIi9kZXYvcHR5eGYiLCAwIH0sCisJeyAiL2Rldi9wdHl5MCIsIDAgfSwKKwl7ICIvZGV2L3B0eXkxIiwgMCB9LAorCXsgIi9kZXYvcHR5eTIiLCAwIH0sCisJeyAiL2Rldi9wdHl5MyIsIDAgfSwKKwl7ICIvZGV2L3B0eXk0IiwgMCB9LAorCXsgIi9kZXYvcHR5eTUiLCAwIH0sCisJeyAiL2Rldi9wdHl5NiIsIDAgfSwKKwl7ICIvZGV2L3B0eXk3IiwgMCB9LAorCXsgIi9kZXYvcHR5eTgiLCAwIH0sCisJeyAiL2Rldi9wdHl5OSIsIDAgfSwKKwl7ICIvZGV2L3B0eXlhIiwgMCB9LAorCXsgIi9kZXYvcHR5eWIiLCAwIH0sCisJeyAiL2Rldi9wdHl5YyIsIDAgfSwKKwl7ICIvZGV2L3B0eXlkIiwgMCB9LAorCXsgIi9kZXYvcHR5eWUiLCAwIH0sCisJeyAiL2Rldi9wdHl5ZiIsIDAgfSwKKwl7ICIvZGV2L3B0eXowIiwgMCB9LAorCXsgIi9kZXYvcHR5ejEiLCAwIH0sCisJeyAiL2Rldi9wdHl6MiIsIDAgfSwKKwl7ICIvZGV2L3B0eXozIiwgMCB9LAorCXsgIi9kZXYvcHR5ejQiLCAwIH0sCisJeyAiL2Rldi9wdHl6NSIsIDAgfSwKKwl7ICIvZGV2L3B0eXo2IiwgMCB9LAorCXsgIi9kZXYvcHR5ejciLCAwIH0sCisJeyAiL2Rldi9wdHl6OCIsIDAgfSwKKwl7ICIvZGV2L3B0eXo5IiwgMCB9LAorCXsgIi9kZXYvcHR5emEiLCAwIH0sCisJeyAiL2Rldi9wdHl6YiIsIDAgfSwKKwl7ICIvZGV2L3B0eXpjIiwgMCB9LAorCXsgIi9kZXYvcHR5emQiLCAwIH0sCisJeyAiL2Rldi9wdHl6ZSIsIDAgfSwKKwl7ICIvZGV2L3B0eXpmIiwgMCB9LAorCXsgIi9kZXYvcHR5YTAiLCAwIH0sCisJeyAiL2Rldi9wdHlhMSIsIDAgfSwKKwl7ICIvZGV2L3B0eWEyIiwgMCB9LAorCXsgIi9kZXYvcHR5YTMiLCAwIH0sCisJeyAiL2Rldi9wdHlhNCIsIDAgfSwKKwl7ICIvZGV2L3B0eWE1IiwgMCB9LAorCXsgIi9kZXYvcHR5YTYiLCAwIH0sCisJeyAiL2Rldi9wdHlhNyIsIDAgfSwKKwl7ICIvZGV2L3B0eWE4IiwgMCB9LAorCXsgIi9kZXYvcHR5YTkiLCAwIH0sCisJeyAiL2Rldi9wdHlhYSIsIDAgfSwKKwl7ICIvZGV2L3B0eWFiIiwgMCB9LAorCXsgIi9kZXYvcHR5YWMiLCAwIH0sCisJeyAiL2Rldi9wdHlhZCIsIDAgfSwKKwl7ICIvZGV2L3B0eWFlIiwgMCB9LAorCXsgIi9kZXYvcHR5YWYiLCAwIH0sCisJeyAiL2Rldi9wdHliMCIsIDAgfSwKKwl7ICIvZGV2L3B0eWIxIiwgMCB9LAorCXsgIi9kZXYvcHR5YjIiLCAwIH0sCisJeyAiL2Rldi9wdHliMyIsIDAgfSwKKwl7ICIvZGV2L3B0eWI0IiwgMCB9LAorCXsgIi9kZXYvcHR5YjUiLCAwIH0sCisJeyAiL2Rldi9wdHliNiIsIDAgfSwKKwl7ICIvZGV2L3B0eWI3IiwgMCB9LAorCXsgIi9kZXYvcHR5YjgiLCAwIH0sCisJeyAiL2Rldi9wdHliOSIsIDAgfSwKKwl7ICIvZGV2L3B0eWJhIiwgMCB9LAorCXsgIi9kZXYvcHR5YmIiLCAwIH0sCisJeyAiL2Rldi9wdHliYyIsIDAgfSwKKwl7ICIvZGV2L3B0eWJkIiwgMCB9LAorCXsgIi9kZXYvcHR5YmUiLCAwIH0sCisJeyAiL2Rldi9wdHliZiIsIDAgfSwKKwl7ICIvZGV2L3B0eWMwIiwgMCB9LAorCXsgIi9kZXYvcHR5YzEiLCAwIH0sCisJeyAiL2Rldi9wdHljMiIsIDAgfSwKKwl7ICIvZGV2L3B0eWMzIiwgMCB9LAorCXsgIi9kZXYvcHR5YzQiLCAwIH0sCisJeyAiL2Rldi9wdHljNSIsIDAgfSwKKwl7ICIvZGV2L3B0eWM2IiwgMCB9LAorCXsgIi9kZXYvcHR5YzciLCAwIH0sCisJeyAiL2Rldi9wdHljOCIsIDAgfSwKKwl7ICIvZGV2L3B0eWM5IiwgMCB9LAorCXsgIi9kZXYvcHR5Y2EiLCAwIH0sCisJeyAiL2Rldi9wdHljYiIsIDAgfSwKKwl7ICIvZGV2L3B0eWNjIiwgMCB9LAorCXsgIi9kZXYvcHR5Y2QiLCAwIH0sCisJeyAiL2Rldi9wdHljZSIsIDAgfSwKKwl7ICIvZGV2L3B0eWNmIiwgMCB9LAorCXsgIi9kZXYvcHR5ZDAiLCAwIH0sCisJeyAiL2Rldi9wdHlkMSIsIDAgfSwKKwl7ICIvZGV2L3B0eWQyIiwgMCB9LAorCXsgIi9kZXYvcHR5ZDMiLCAwIH0sCisJeyAiL2Rldi9wdHlkNCIsIDAgfSwKKwl7ICIvZGV2L3B0eWQ1IiwgMCB9LAorCXsgIi9kZXYvcHR5ZDYiLCAwIH0sCisJeyAiL2Rldi9wdHlkNyIsIDAgfSwKKwl7ICIvZGV2L3B0eWQ4IiwgMCB9LAorCXsgIi9kZXYvcHR5ZDkiLCAwIH0sCisJeyAiL2Rldi9wdHlkYSIsIDAgfSwKKwl7ICIvZGV2L3B0eWRiIiwgMCB9LAorCXsgIi9kZXYvcHR5ZGMiLCAwIH0sCisJeyAiL2Rldi9wdHlkZCIsIDAgfSwKKwl7ICIvZGV2L3B0eWRlIiwgMCB9LAorCXsgIi9kZXYvcHR5ZGYiLCAwIH0sCisJeyAiL2Rldi9wdHllMCIsIDAgfSwKKwl7ICIvZGV2L3B0eWUxIiwgMCB9LAorCXsgIi9kZXYvcHR5ZTIiLCAwIH0sCisJeyAiL2Rldi9wdHllMyIsIDAgfSwKKwl7ICIvZGV2L3B0eWU0IiwgMCB9LAorCXsgIi9kZXYvcHR5ZTUiLCAwIH0sCisJeyAiL2Rldi9wdHllNiIsIDAgfSwKKwl7ICIvZGV2L3B0eWU3IiwgMCB9LAorCXsgIi9kZXYvcHR5ZTgiLCAwIH0sCisJeyAiL2Rldi9wdHllOSIsIDAgfSwKKwl7ICIvZGV2L3B0eWVhIiwgMCB9LAorCXsgIi9kZXYvcHR5ZWIiLCAwIH0sCisJeyAiL2Rldi9wdHllYyIsIDAgfSwKKwl7ICIvZGV2L3B0eWVkIiwgMCB9LAorCXsgIi9kZXYvcHR5ZWUiLCAwIH0sCisJeyAiL2Rldi9wdHllZiIsIDAgfSwKKwl7ICIvZGV2L3ZjcyIsIDAgfSwKKwl7ICIvZGV2L3Zjc2EiLCAwIH0sCisJeyAiL2Rldi92Y3MxIiwgMCB9LAorCXsgIi9kZXYvdmNzYTEiLCAwIH0sCisJeyAiL2Rldi90dHlTMCIsIDAgfSwKKwl7ICIvZGV2L2N1YTAiLCAwIH0sCisJeyAiL2Rldi9oZGEiLCAwIH0sCisJeyAiL2Rldi9oZGExIiwgMiB9LAorCXsgIi9kZXYvaGRhMiIsIDIgfSwKKwl7ICIvZGV2L2hkYTMiLCAyIH0sCisJeyAiL2Rldi9oZGE0IiwgMiB9LAorCXsgIi9kZXYvaGRhNSIsIDIgfSwKKwl7ICIvZGV2L2hkYTYiLCAwIH0sCisJeyAiL2Rldi9oZGE3IiwgMCB9LAorCXsgIi9kZXYvaGRhOCIsIDAgfSwKKwl7ICIvZGV2L2hkYiIsIDAgfSwKKwl7ICIvZGV2L2hkYjEiLCAyIH0sCisJeyAiL2Rldi9oZGMiLCAwIH0sCisJeyAiL2Rldi9oZGMxIiwgMiB9LAorCXsgIi9kZXYvZmQwdTE0NDAiLCAwIH0sCisJeyAiL2Rldi9mZDB1MTY4MCIsIDAgfSwKKwl7ICIvZGV2L2ZkMHUxNzIyIiwgMCB9LAorCXsgIi9kZXYvZmQwdTE3NDMiLCAwIH0sCisJeyAiL2Rldi9mZDB1MTc2MCIsIDAgfSwKKwl7ICIvZGV2L2ZkMHUxOTIwIiwgMCB9LAorCXsgIi9kZXYvZmQwdTE4NDAiLCAwIH0sCisJeyAiL2Rldi9mZDB1MTYwMCIsIDAgfSwKKwl7ICIvZGV2L2ZkMHUzNjAiLCAwIH0sCisJeyAiL2Rldi9mZDB1NzIwIiwgMCB9LAorCXsgIi9kZXYvZmQwdTgyMCIsIDAgfSwKKwl7ICIvZGV2L2ZkMHU4MzAiLCAwIH0sCisJeyAiL2Rldi9mZDB1MTA0MCIsIDAgfSwKKwl7ICIvZGV2L2ZkMHUxMTIwIiwgMCB9LAorCXsgIi9kZXYvZmQwdTgwMCIsIDAgfSwKKwl7ICIvZGV2L2ZkMCIsIDAgfSwKKwl7ICIvZGV2L2xvb3AwIiwgMCB9LAorCXsgIi9kZXYvbG9vcDEiLCAwIH0sCisJeyAiL2Rldi9sb29wMiIsIDAgfSwKKwl7ICIvZGV2L2xvb3AzIiwgMCB9LAorCXsgIi9kZXYvbG9vcDQiLCAwIH0sCisJeyAiL2Rldi9sb29wNSIsIDAgfSwKKwl7ICIvZGV2L2xvb3A2IiwgMCB9LAorCXsgIi9kZXYvbG9vcDciLCAwIH0sCisJeyAiL2Rldi9kc3AiLCAwIH0sCisJeyAiL2Rldi9kc3AxIiwgMCB9LAorCXsgIi9kZXYvbWl4ZXIiLCAwIH0sCisJeyAiL2Rldi9taWRpIiwgMCB9LAorCXsgIi9kZXYvbHZtIiwgMCB9LAorCXsgIi9kZXYvdmcwIiwgMCB9LAorCXsgIi9kZXYvdmcwL2dyb3VwIiwgMCB9LAorCXsgIi9kZXYvdmcwL3BhY2thZ2VzIiwgMCB9LAorCXsgIi9kZXYvdmcwL3Bob3RvcyIsIDAgfSwKKwl7ICIvZGV2L3ZnMC9tdXNpYyIsIDAgfSwKKwl7ICIvZGV2L2xvZyIsIDAgfSwKKwl7ICIvZGV2L01BS0VERVYiLCAwIH0sCisJeyAiL2Rldi9wcmludGVyIiwgMCB9LAorCXsgIi9kZXYvdmNzMiIsIDAgfSwKKwl7ICIvZGV2L3Zjc2EyIiwgMCB9LAorCXsgIi9kZXYvdmNzMyIsIDAgfSwKKwl7ICIvZGV2L3Zjc2EzIiwgMCB9LAorCXsgIi9kZXYvdmNzNSIsIDAgfSwKKwl7ICIvZGV2L3Zjc2E1IiwgMCB9LAorCXsgIi9kZXYvdmNzNCIsIDAgfSwKKwl7ICIvZGV2L3Zjc2E0IiwgMCB9LAorCXsgIi9kZXYvdmNzNiIsIDAgfSwKKwl7ICIvZGV2L3Zjc2E2IiwgMCB9LAorCXsgIi9kZXYvbnZpZGlhMCIsIDAgfSwKKwl7ICIvZGV2L252aWRpYTEiLCAwIH0sCisJeyAiL2Rldi9udmlkaWEyIiwgMCB9LAorCXsgIi9kZXYvbnZpZGlhMyIsIDAgfSwKKwl7ICIvZGV2L252aWRpYWN0bCIsIDAgfSwKKwl7ICIvZGV2L3ZjczciLCAwIH0sCisJeyAiL2Rldi92Y3NhNyIsIDAgfSwKKwl7IE5VTEwsIDAgfQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9tYXRjaGVyX3QuYyBiL3Rlc3QvdW5pdC9tYXRjaGVyX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ZhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L21hdGNoZXJfdC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ1bml0cy5oIgorCisjaW5jbHVkZSAibWF0Y2hlcl9kYXRhLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gTlVMTDsKKworaW50IHJlZ2V4X2luaXQodm9pZCkgeworCW1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJiaXRzZXQgdGVzdCIsIDEwMjQpOworCXJldHVybiBtZW0gPT0gTlVMTDsKK30KKworaW50IHJlZ2V4X2Zpbmkodm9pZCkgeworCWRtX3Bvb2xfZGVzdHJveShtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtX3JlZ2V4ICptYWtlX3NjYW5uZXIoY29uc3QgY2hhciAqKnJ4KQoreworCXN0cnVjdCBkbV9yZWdleCAqc2Nhbm5lcjsKKwlpbnQgbnJ4ID0gMDsKKwlmb3IgKDsgcnhbbnJ4XTsgKytucngpOworCisJc2Nhbm5lciA9IGRtX3JlZ2V4X2NyZWF0ZShtZW0sIHJ4LCBucngpOworCUNVX0FTU0VSVF9GQVRBTChzY2FubmVyICE9IE5VTEwpOworCXJldHVybiBzY2FubmVyOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2ZpbmdlcnByaW50cyh2b2lkKSB7CisJc3RydWN0IGRtX3JlZ2V4ICpzY2FubmVyOworCisJc2Nhbm5lciA9IG1ha2Vfc2Nhbm5lcihkZXZfcGF0dGVybnMpOworCUNVX0FTU0VSVF9FUVVBTChkbV9yZWdleF9maW5nZXJwcmludChzY2FubmVyKSwgMHg3ZjU1NmMwOSk7CisKKwlzY2FubmVyID0gbWFrZV9zY2FubmVyKHJhbmRvbV9wYXR0ZXJucyk7CisJQ1VfQVNTRVJUX0VRVUFMKGRtX3JlZ2V4X2ZpbmdlcnByaW50KHNjYW5uZXIpLCAweDlmMTEwNzZjKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYXRjaGluZyh2b2lkKSB7CisJc3RydWN0IGRtX3JlZ2V4ICpzY2FubmVyOworCWludCBpOworCisJc2Nhbm5lciA9IG1ha2Vfc2Nhbm5lcihkZXZfcGF0dGVybnMpOworCWZvciAoaSA9IDA7IGRldmljZXNbaV0uc3RyOyArK2kpCisJCUNVX0FTU0VSVF9FUVVBTChkbV9yZWdleF9tYXRjaChzY2FubmVyLCBkZXZpY2VzW2ldLnN0ciksIGRldmljZXNbaV0uZXhwZWN0ZWQgLSAxKTsKKworCXNjYW5uZXIgPSBtYWtlX3NjYW5uZXIobm9ucHJpbnRfcGF0dGVybnMpOworCWZvciAoaSA9IDA7IG5vbnByaW50W2ldLnN0cjsgKytpKQorCQlDVV9BU1NFUlRfRVFVQUwoZG1fcmVnZXhfbWF0Y2goc2Nhbm5lciwgbm9ucHJpbnRbaV0uc3RyKSwgbm9ucHJpbnRbaV0uZXhwZWN0ZWQgLSAxKTsKK30KKworQ1VfVGVzdEluZm8gcmVnZXhfbGlzdFtdID0geworCXsgKGNoYXIqKSJmaW5nZXJwcmludHMiLCB0ZXN0X2ZpbmdlcnByaW50cyB9LAorCXsgKGNoYXIqKSJtYXRjaGluZyIsIHRlc3RfbWF0Y2hpbmcgfSwKKwlDVV9URVNUX0lORk9fTlVMTAorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9ydW4uYyBiL3Rlc3QvdW5pdC9ydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY0MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L3J1bi5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlICJ1bml0cy5oIgorI2luY2x1ZGUgPENVbml0L0Jhc2ljLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBTZXR1cCBTdWl0ZUluZm8gc3RydWN0IGluIGEgIGNvbXBhdGlibGUgd2F5IGFjcm9zcyBkaWZmZXJlbnQgQ1VuaXQgdmVyc2lvbnMgKi8KKy8qIG9sZCB2ZXJzaW9uIG9mIENVbml0IGhhcyB1c2VkIGNoYXIqIGZvciAucE5hbWUsIHNvIHVzaW5nIGNhc3QgaGVyZSAqLworI2RlZmluZSBVU0UobikgeyBcCisJLnBOYW1lID0gKGNoYXIqKSAjbiwgXAorCS5wSW5pdEZ1bmMgPSBuIyNfaW5pdCwgXAorCS5wQ2xlYW51cEZ1bmMgPSBuIyNfZmluaSwgXAorCS5wVGVzdHMgPSBuIyNfbGlzdCB9CisKK0NVX1N1aXRlSW5mbyBzdWl0ZXNbXSA9IHsKKwlVU0UoYml0c2V0KSwKKwlVU0UoY29uZmlnKSwKKwlVU0UoZG1saXN0KSwKKwlVU0UoZG1zdGF0dXMpLAorCVVTRShyZWdleCksCisJVVNFKHN0cmluZyksCisJQ1VfU1VJVEVfSU5GT19OVUxMCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwlpZiAoQ1VfaW5pdGlhbGl6ZV9yZWdpc3RyeSgpICE9IENVRV9TVUNDRVNTKSB7CisJCXByaW50ZigiSW5pdGlhbGl6YXRpb24gb2YgVGVzdCBSZWdpc3RyeSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIENVX2dldF9lcnJvcigpOworCX0KKworCUNVX3JlZ2lzdGVyX3N1aXRlcyhzdWl0ZXMpOworCUNVX2Jhc2ljX3NldF9tb2RlKENVX0JSTV9WRVJCT1NFKTsKKwlDVV9iYXNpY19ydW5fdGVzdHMoKTsKKwlDVV9jbGVhbnVwX3JlZ2lzdHJ5KCk7CisKKwlyZXR1cm4gKENVX2dldF9udW1iZXJfb2ZfZmFpbHVyZXMoKSAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9zdHJpbmdfdC5jIGIvdGVzdC91bml0L3N0cmluZ190LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMzljNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9zdHJpbmdfdC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidW5pdHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gTlVMTDsKKworaW50IHN0cmluZ19pbml0KHZvaWQpCit7CisJbWVtID0gZG1fcG9vbF9jcmVhdGUoInN0cmluZyB0ZXN0IiwgMTAyNCk7CisKKwlyZXR1cm4gKG1lbSA9PSBOVUxMKTsKK30KKworaW50IHN0cmluZ19maW5pKHZvaWQpCit7CisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogQWRkIG1vcmUgc3RyaW5nIHVuaXQgdGVzdHMgaGVyZSAqLworCitzdGF0aWMgdm9pZCB0ZXN0X3N0cm5jcHkodm9pZCkKK3sKKwljb25zdCBjaGFyIHN0W10gPSAiMTIzNDU2Nzg5MCI7CisJY2hhciBidWZbc2l6ZW9mKHN0KV07CisKKwlDVV9BU1NFUlRfRVFVQUwoZG1fc3RybmNweShidWYsIHN0LCBzaXplb2YoYnVmKSksIDEpOworCUNVX0FTU0VSVF9FUVVBTChzdHJjbXAoYnVmLCBzdCksIDApOworCisJQ1VfQVNTRVJUX0VRVUFMKGRtX3N0cm5jcHkoYnVmLCBzdCwgc2l6ZW9mKGJ1ZikgLSAxKSwgMCk7CisJQ1VfQVNTRVJUX0VRVUFMKHN0cmxlbihidWYpICsgMSwgc2l6ZW9mKGJ1ZikgLSAxKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9hc3ByaW50KHZvaWQpCit7CisJY29uc3QgY2hhciBzdDBbXSA9ICIiOworCWNvbnN0IGNoYXIgc3QxW10gPSAiMTIzNDU2Nzg5MDEiOworCWNvbnN0IGNoYXIgc3QyW10gPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NyI7CisJY2hhciAqYnVmOworCWludCBhOworCisJYSA9IGRtX2FzcHJpbnRmKCZidWYsICIlcyIsIHN0MCk7CisJQ1VfQVNTRVJUX0VRVUFMKHN0cmNtcChidWYsIHN0MCksIDApOworCUNVX0FTU0VSVF9FUVVBTChhLCBzaXplb2Yoc3QwKSk7CisJZnJlZShidWYpOworCisJYSA9IGRtX2FzcHJpbnRmKCZidWYsICIlcyIsIHN0MSk7CisJQ1VfQVNTRVJUX0VRVUFMKHN0cmNtcChidWYsIHN0MSksIDApOworCUNVX0FTU0VSVF9FUVVBTChhLCBzaXplb2Yoc3QxKSk7CisJZnJlZShidWYpOworCisJYSA9IGRtX2FzcHJpbnRmKCZidWYsICIlcyIsIHN0Mik7CisJQ1VfQVNTRVJUX0VRVUFMKGEsIHNpemVvZihzdDIpKTsKKwlDVV9BU1NFUlRfRVFVQUwoc3RyY21wKGJ1Ziwgc3QyKSwgMCk7CisJZnJlZShidWYpOworfQorCitDVV9UZXN0SW5mbyBzdHJpbmdfbGlzdFtdID0geworCXsgKGNoYXIqKSJhc3ByaW50IiwgdGVzdF9hc3ByaW50IH0sCisJeyAoY2hhciopInN0cm5jcHkiLCB0ZXN0X3N0cm5jcHkgfSwKKwlDVV9URVNUX0lORk9fTlVMTAorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC91bml0cy5oIGIvdGVzdC91bml0L3VuaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4ZmY3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC91bml0cy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9VTklUU19ICisjZGVmaW5lIF9VTklUU19ICisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKyNpbmNsdWRlIDxDVW5pdC9DVW5pdC5oPgorCisjZGVmaW5lIERFQ0wobikgXAorCWV4dGVybiBDVV9UZXN0SW5mbyBuICMjIF9saXN0W107XAorCWludCBuICMjIF9pbml0KHZvaWQpOyBcCisJaW50IG4gIyMgX2Zpbmkodm9pZCk7CisKK0RFQ0woYml0c2V0KTsKK0RFQ0woY29uZmlnKTsKK0RFQ0woZG1saXN0KTsKK0RFQ0woZG1zdGF0dXMpOworREVDTChyZWdleCk7CitERUNMKHN0cmluZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvLmV4cG9ydGVkX3N5bWJvbHMgYi90b29scy8uZXhwb3J0ZWRfc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvLmV4cG9ydGVkX3N5bWJvbHMKZGlmZiAtLWdpdCBhL3Rvb2xzLy5naXRpZ25vcmUgYi90b29scy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2IzMzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorLmNvbW1hbmRzCitkbXNldHVwCitkbXN0YXRzCitsdm0KZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmluIGIvdG9vbHMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYzMxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjE4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUyA9XAorCWR1bXBjb25maWcuYyBcCisJZm9ybWF0cy5jIFwKKwlsdmNoYW5nZS5jIFwKKwlsdmNvbnZlcnQuYyBcCisJbHZjb252ZXJ0X3BvbGwuYyBcCisJbHZjcmVhdGUuYyBcCisJbHZkaXNwbGF5LmMgXAorCWx2ZXh0ZW5kLmMgXAorCWx2bWNoYW5nZS5jIFwKKwlsdm1jbWRsaW5lLmMgXAorCWx2bWRpc2tzY2FuLmMgXAorCWx2cmVkdWNlLmMgXAorCWx2cmVtb3ZlLmMgXAorCWx2cmVuYW1lLmMgXAorCWx2cmVzaXplLmMgXAorCWx2c2Nhbi5jIFwKKwlwb2xsZGFlbW9uLmMgXAorCXB2Y2hhbmdlLmMgXAorCXB2Y2suYyBcCisJcHZjcmVhdGUuYyBcCisJcHZkaXNwbGF5LmMgXAorCXB2bW92ZS5jIFwKKwlwdm1vdmVfcG9sbC5jIFwKKwlwdnJlbW92ZS5jIFwKKwlwdnJlc2l6ZS5jIFwKKwlwdnNjYW4uYyBcCisJcmVwb3J0ZXIuYyBcCisJc2VndHlwZXMuYyBcCisJdGFncy5jIFwKKwl0b29sbGliLmMgXAorCXZnY2ZnYmFja3VwLmMgXAorCXZnY2ZncmVzdG9yZS5jIFwKKwl2Z2NoYW5nZS5jIFwKKwl2Z2NrLmMgXAorCXZnY3JlYXRlLmMgXAorCXZnY29udmVydC5jIFwKKwl2Z2Rpc3BsYXkuYyBcCisJdmdleHBvcnQuYyBcCisJdmdleHRlbmQuYyBcCisJdmdpbXBvcnQuYyBcCisJdmdtZXJnZS5jIFwKKwl2Z21rbm9kZXMuYyBcCisJbHZwb2xsLmMgXAorCXZnaW1wb3J0Y2xvbmUuYyBcCisJdmdyZWR1Y2UuYyBcCisJdmdyZW1vdmUuYyBcCisJdmdyZW5hbWUuYyBcCisJdmdzY2FuLmMgXAorCXZnc3BsaXQuYworCitTT1VSQ0VTMiA9XAorCWRtc2V0dXAuYyBcCisJbHZtLmMgXAorCWx2bTJjbWQtc3RhdGljLmMgXAorCWx2bTJjbWQuYyBcCisJbHZtY21kbGliLmMKKworVEFSR0VUUyA9XAorCS5jb21tYW5kcyBcCisJbGlibHZtMmNtZC5hIFwKKwlsdm0KKworVEFSR0VUU19ETSA9IGRtc2V0dXAKKworSU5TVEFMTF9MVk1fVEFSR0VUUyA9IGluc3RhbGxfdG9vbHNfZHluYW1pYworSU5TVEFMTF9ETVNFVFVQX1RBUkdFVFMgPSBpbnN0YWxsX2Rtc2V0dXBfZHluYW1pYworSU5TVEFMTF9DTURMSUJfVEFSR0VUUyA9IGluc3RhbGxfY21kbGliX2R5bmFtaWMgaW5zdGFsbF9jbWRsaWJfaW5jbHVkZSAKKworaWZlcSAoIkBTVEFUSUNfTElOS0AiLCAieWVzIikKKyAgVEFSR0VUUyArPSBsdm0uc3RhdGljCisgIFRBUkdFVFNfRE0gKz0gZG1zZXR1cC5zdGF0aWMKKyAgSU5TVEFMTF9MVk1fVEFSR0VUUyArPSBpbnN0YWxsX3Rvb2xzX3N0YXRpYworICBJTlNUQUxMX0RNU0VUVVBfVEFSR0VUUyArPSBpbnN0YWxsX2Rtc2V0dXBfc3RhdGljCisgIElOU1RBTExfQ01ETElCX1RBUkdFVFMgKz0gaW5zdGFsbF9jbWRsaWJfc3RhdGljCitlbmRpZgorCitMVk1MSUJTID0gJChMVk1JTlRFUk5BTF9MSUJTKQorTElCX1ZFUlNJT04gPSAkKExJQl9WRVJTSU9OX0xWTSkKKworQ0xFQU5fVEFSR0VUUyA9IGxpYmx2bTJjbWQuJChMSUJfU1VGRklYKSAkKFRBUkdFVFNfRE0pIFwKKwlsaWJsdm0yY21kLiQoTElCX1NVRkZJWCkuJChMSUJfVkVSU0lPTikgbHZtLXN0YXRpYy5vIFwKKwlsaWJsdm0yY21kLXN0YXRpYy5hIGRtc2V0dXAuc3RhdGljIGx2bS5zdGF0aWMgXAorCSQoTERERVBTKSAuZXhwb3J0ZWRfc3ltYm9sc19nZW5lcmF0ZWQKKworaWZlcSAoIkBDTURMSUJAIiwgInllcyIpCisJVEFSR0VUUyArPSBsaWJsdm0yY21kLiQoTElCX1NVRkZJWCkuJChMSUJfVkVSU0lPTikKKwlJTlNUQUxMX0xWTV9UQVJHRVRTICs9ICQoSU5TVEFMTF9DTURMSUJfVEFSR0VUUykKK2VuZGlmCisKK2lmZXEgKCJARE1FVkVOVERAIiwgInllcyIpCisJTFZNTElCUyArPSAtbGRldm1hcHBlci1ldmVudAorZW5kaWYKKworTFZNTElCUyArPSAtbGRldm1hcHBlcgorCitFWFBPUlRFRF9IRUFERVIgPSAkKHNyY2RpcikvbHZtMmNtZC5oCitFWFBPUlRFRF9GTl9QUkVGSVggPSBsdm0yCisKK0NGTE9XX0xJU1QgPSBsdm1jbWRsaWIuYyBsdm0yY21kLmMKK0NGTE9XX0xJU1RfVEFSR0VUID0gbGlibHZtMmNtZC5jZmxvdworQ0ZMT1dfVEFSR0VUID0gbHZtCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitkZXZpY2UtbWFwcGVyOiAkKFRBUkdFVFNfRE0pCisKK0NGTEFHU19kbXNldHVwLm8gKz0gJChVREVWX0NGTEFHUykgJChFWFRSQV9FWEVDX0NGTEFHUykKKworZG1zZXR1cDogZG1zZXR1cC5vICQodG9wX2J1aWxkZGlyKS9saWJkbS9saWJkZXZtYXBwZXIuJChMSUJfU1VGRklYKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQoRVhUUkFfRVhFQ19MREZMQUdTKSAtTCQodG9wX2J1aWxkZGlyKS9saWJkbSBcCisJICAgICAgLW8gJEAgZG1zZXR1cC5vIC1sZGV2bWFwcGVyICQoTElCUykKKworZG1zZXR1cC5zdGF0aWM6IGRtc2V0dXAubyAkKGludGVyZmFjZWJ1aWxkZGlyKS9saWJkZXZtYXBwZXIuYQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1zdGF0aWMgLUwkKGludGVyZmFjZWJ1aWxkZGlyKSBcCisJICAgICAgLW8gJEAgZG1zZXR1cC5vIC1sZGV2bWFwcGVyICQoTV9MSUJTKSAkKFBUSFJFQURfTElCUykgJChTVEFUSUNfTElCUykgJChMSUJTKQorCithbGw6IGRldmljZS1tYXBwZXIKKworQ0ZMQUdTX2x2bS5vICs9ICQoRVhUUkFfRVhFQ19DRkxBR1MpCitDRkxBR1NfbHZtY21kbGluZS5vICs9ICQoVkFMR1JJTkRfQ0ZMQUdTKQorCitsdm06ICQoT0JKRUNUUykgbHZtLm8gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJsdm0taW50ZXJuYWwuYQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQoRVhUUkFfRVhFQ19MREZMQUdTKSAkKEVMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpIGx2bS5vIFwKKwkJJChMVk1MSUJTKSAkKFJFQURMSU5FX0xJQlMpICQoTElCUykgLXJkeW5hbWljCisKK2lmZXEgKCJAQlVJTERfTFZNRVRBREAiLCAieWVzIikKK2x2bTogJCh0b3BfYnVpbGRkaXIpL2xpYmRhZW1vbi9jbGllbnQvbGliZGFlbW9uY2xpZW50LmEKK2VuZGlmCisKK2x2bS5zdGF0aWM6ICQoT0JKRUNUUykgbHZtLXN0YXRpYy5vICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEgICQoaW50ZXJmYWNlYnVpbGRkaXIpL2xpYmRldm1hcHBlci5hCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLXN0YXRpYyAtTCQoaW50ZXJmYWNlYnVpbGRkaXIpIC1vICRAIFwKKwkgICAgICAkKE9CSkVDVFMpIGx2bS1zdGF0aWMubyAkKExWTUxJQlMpICQoU1RBVElDX0xJQlMpICQoTElCUykKKworbGlibHZtMmNtZC5hOiAkKHRvcF9idWlsZGRpcikvbGliL2xpYmx2bS1pbnRlcm5hbC5hICQoT0JKRUNUUykgbHZtY21kbGliLm8gbHZtMmNtZC5vCisJY2F0ICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEgPiAkQAorCSQoQVIpIHJzICRAICQoT0JKRUNUUykgbHZtY21kbGliLm8gbHZtMmNtZC5vCisKK2xpYmx2bTJjbWQtc3RhdGljLmE6ICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEgJChPQkpFQ1RTKSBsdm1jbWRsaWIubyBsdm0yY21kLXN0YXRpYy5vCisJY2F0ICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmEgPiAkQAorCSQoQVIpIHJzICRAICQoT0JKRUNUUykgbHZtY21kbGliLm8gbHZtMmNtZC1zdGF0aWMubworCitsaWJsdm0yY21kLiQoTElCX1NVRkZJWCk6IGxpYmx2bTJjbWQuYSAkKExEREVQUykKKwkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLCRALiQoTElCX1ZFUlNJT04pIFwKKwkJJChDRkxBR1MpICQoQ0xERkxBR1MpIC1vICRAIFwKKwkJQENMRFdIT0xFQVJDSElWRUAgbGlibHZtMmNtZC5hIEBDTEROT1dIT0xFQVJDSElWRUAgXAorCQkkKExWTUxJQlMpICQoTElCUykKKworbGlibHZtMmNtZC4kKExJQl9TVUZGSVgpLiQoTElCX1ZFUlNJT04pOiBsaWJsdm0yY21kLiQoTElCX1NVRkZJWCkKKwkkKExOX1MpIC1mICQ8ICRACisKKy5jb21tYW5kczogJChzcmNkaXIpL2NvbW1hbmRzLmggJChzcmNkaXIpL2NtZG5hbWVzLmggTWFrZWZpbGUKKwkkKENDKSAtRSAtUCAkKHNyY2RpcikvY21kbmFtZXMuaCAyPiAvZGV2L251bGwgfCBcCisJCWVncmVwIC12ICdeICoofCMuKnxjb25maWd8ZGV2dHlwZXN8ZHVtcGNvbmZpZ3xmb3JtYXRzfGZ1bGxyZXBvcnR8aGVscHxsYXN0bG9nfGx2cG9sbHxwdmRhdGF8c2VndHlwZXN8c3lzdGVtaWR8dGFnc3x2ZXJzaW9uKSAqJCQnID4gLmNvbW1hbmRzCisKK2lmbmVxICgiJChDRkxPV19DTUQpIiwgIiIpCitDRkxPV19TT1VSQ0VTID0gJChhZGRwcmVmaXggJChzcmNkaXIpLywgJChTT1VSQ0VTKSkKKy1pbmNsdWRlICQodG9wX2J1aWxkZGlyKS9saWJkbS9saWJkZXZtYXBwZXIuY2Zsb3cKKy1pbmNsdWRlICQodG9wX2J1aWxkZGlyKS9saWIvbGlibHZtLWludGVybmFsLmNmbG93CitlbmRpZgorCisuUEhPTlk6IGluc3RhbGxfY21kbGliX2R5bmFtaWMgaW5zdGFsbF9jbWRsaWJfc3RhdGljIGluc3RhbGxfY21kbGliX2luY2x1ZGUgXAorCWluc3RhbGxfdG9vbHNfZHluYW1pYyBpbnN0YWxsX3Rvb2xzX3N0YXRpYyBcCisJaW5zdGFsbF9kbXNldHVwX2R5bmFtaWMgaW5zdGFsbF9kbXNldHVwX3N0YXRpYworCitpbnN0YWxsX2NtZGxpYl9pbmNsdWRlOiAkKHNyY2RpcikvbHZtMmNtZC5oCisJJChJTlNUQUxMX0RBVEEpIC1EICQ8ICQoaW5jbHVkZWRpcikvJCg8RikKKworaW5zdGFsbF9jbWRsaWJfZHluYW1pYzogbGlibHZtMmNtZC4kKExJQl9TVUZGSVgpCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQobGliZGlyKS8kKDxGKS4kKExJQl9WRVJTSU9OKQorCSQoSU5TVEFMTF9ESVIpICQodXNybGliZGlyKQorCSQoTE5fUykgLWYgJChVU1JMSUJfUkVMUEFUSCkkKDxGKS4kKExJQl9WRVJTSU9OKSAkKHVzcmxpYmRpcikvJCg8RikKKworaW5zdGFsbF9jbWRsaWJfc3RhdGljOiBsaWJsdm0yY21kLXN0YXRpYy5hCisJJChJTlNUQUxMX0RBVEEpIC1EICQ8ICQodXNybGliZGlyKS9saWJsdm0yY21kLmEKKworaW5zdGFsbF90b29sc19keW5hbWljOiBsdm0gLmNvbW1hbmRzCisJJChJTlNUQUxMX1BST0dSQU0pIC1EIGx2bSAkKHNiaW5kaXIpL2x2bQorCUBlY2hvIENyZWF0aW5nIHN5bWJvbGljIGxpbmtzIGZvciBpbmRpdmlkdWFsIGNvbW1hbmRzIGluICQoc2JpbmRpcikKKwlAZm9yIHYgaW4gYGNhdCAuY29tbWFuZHNgOyBkbyBcCisJCWVjaG8gIiQoTE5fUykgLWYgbHZtICQoc2JpbmRpcikvJCR2IjsgXAorCQkkKExOX1MpIC1mIGx2bSAkKHNiaW5kaXIpLyQkdjsgXAorCWRvbmU7CisKK2luc3RhbGxfdG9vbHNfc3RhdGljOiBsdm0uc3RhdGljCisJJChJTlNUQUxMX1BST0dSQU0pIC1EICQ8ICQoc3RhdGljZGlyKS8kKDxGKQorCitpbnN0YWxsX2Rtc2V0dXBfZHluYW1pYzogZG1zZXR1cAorCSQoSU5TVEFMTF9QUk9HUkFNKSAtRCAkPCAkKHNiaW5kaXIpLyQoPEYpCisJJChMTl9TKSAtZiAkKDxGKSAkKHNiaW5kaXIpL2Rtc3RhdHMKKworaW5zdGFsbF9kbXNldHVwX3N0YXRpYzogZG1zZXR1cC5zdGF0aWMKKwkkKElOU1RBTExfUFJPR1JBTSkgLUQgJDwgJChzdGF0aWNkaXIpLyQoPEYpCisJJChMTl9TKSAtZiAkKDxGKSAkKHNiaW5kaXIpL2Rtc3RhdHMKKworaW5zdGFsbF9kZXZpY2UtbWFwcGVyOiAkKElOU1RBTExfRE1TRVRVUF9UQVJHRVRTKQorCitpbnN0YWxsX2x2bTI6ICQoSU5TVEFMTF9MVk1fVEFSR0VUUykKKworaW5zdGFsbDogaW5zdGFsbF9sdm0yIGluc3RhbGxfZGV2aWNlLW1hcHBlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJncy5oIGIvdG9vbHMvYXJncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDI1MTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmdzLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogUHV0IGFsbCBsb25nIGFyZ3MgdGhhdCBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBzaG9ydCBvcHRpb24gZmlyc3QuCisgKi8KKy8qICpJTkRFTlQtT0ZGKiAqLworYXJnKGFib3J0X0FSRywgJ1wwJywgImFib3J0IiwgTlVMTCwgMCwgMCkKK2FyZyhhY3RpdmF0aW9ubW9kZV9BUkcsICdcMCcsICJhY3RpdmF0aW9ubW9kZSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoYWRkdGFnX0FSRywgJ1wwJywgImFkZHRhZyIsIHRhZ19hcmcsIEFSR19HUk9VUEFCTEUsIDApCithcmcoYWxpZ25lZF9BUkcsICdcMCcsICJhbGlnbmVkIiwgTlVMTCwgMCwgMCkKK2FyZyhhbGxvY19BUkcsICdcMCcsICJhbGxvYyIsIGFsbG9jX2FyZywgMCwgMCkKK2FyZyhhdG9taWNfQVJHLCAnXDAnLCAiYXRvbWljIiwgTlVMTCwgMCwgMCkKK2FyZyhhdHZlcnNpb25fQVJHLCAnXDAnLCAiYXR2ZXJzaW9uIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhiaW5hcnlfQVJHLCAnXDAnLCAiYmluYXJ5IiwgTlVMTCwgMCwgMCkKK2FyZyhib290bG9hZGVyYXJlYXNpemVfQVJHLCAnXDAnLCAiYm9vdGxvYWRlcmFyZWFzaXplIiwgc2l6ZV9tYl9hcmcsIDAsIDApCithcmcoY2FjaGVfbG9uZ19BUkcsICdcMCcsICJjYWNoZSIsIE5VTEwsIDAsIDApCithcmcoY2FjaGVtb2RlX0FSRywgJ1wwJywgImNhY2hlbW9kZSIsIGNhY2hlbW9kZV9hcmcsIDAsIDApCithcmcoY2FjaGVwb29sX0FSRywgJ1wwJywgImNhY2hlcG9vbCIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoY29tbWFuZHByb2ZpbGVfQVJHLCAnXDAnLCAiY29tbWFuZHByb2ZpbGUiLCBzdHJpbmdfYXJnLCAwLCAwKQorYXJnKGNvbmZpZ19BUkcsICdcMCcsICJjb25maWciLCBzdHJpbmdfYXJnLCAwLCAwKQorYXJnKGNvbmZpZ3JlcG9ydF9BUkcsICdcMCcsICJjb25maWdyZXBvcnQiLCBzdHJpbmdfYXJnLCBBUkdfR1JPVVBBQkxFLCAxKQorYXJnKGNvbmZpZ3R5cGVfQVJHLCAnXDAnLCAidHlwZSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoY29yZWxvZ19BUkcsICdcMCcsICJjb3JlbG9nIiwgTlVMTCwgMCwgMCkKK2FyZyhkYXRhYWxpZ25tZW50X0FSRywgJ1wwJywgImRhdGFhbGlnbm1lbnQiLCBzaXplX2tiX2FyZywgMCwgMCkKK2FyZyhkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRywgJ1wwJywgImRhdGFhbGlnbm1lbnRvZmZzZXQiLCBzaXplX2tiX2FyZywgMCwgMCkKK2FyZyhkZWx0YWdfQVJHLCAnXDAnLCAiZGVsdGFnIiwgdGFnX2FyZywgQVJHX0dST1VQQUJMRSwgMCkKK2FyZyhkZXRhY2hwcm9maWxlX0FSRywgJ1wwJywgImRldGFjaHByb2ZpbGUiLCBOVUxMLCAwLCAwKQorYXJnKGRpc2NhcmRzX0FSRywgJ1wwJywgImRpc2NhcmRzIiwgZGlzY2FyZHNfYXJnLCAwLCAwKQorYXJnKGRyaXZlcmxvYWRlZF9BUkcsICdcMCcsICJkcml2ZXJsb2FkZWQiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKGVycm9yd2hlbmZ1bGxfQVJHLCAnXDAnLCAiZXJyb3J3aGVuZnVsbCIsIHllc19ub19hcmcsIDAsIDApCithcmcoZm9yY2VfbG9uZ19BUkcsICdcMCcsICJmb3JjZSIsIE5VTEwsIEFSR19DT1VOVEFCTEUsIDApCithcmcoZm9yZWlnbl9BUkcsICdcMCcsICJmb3JlaWduIiwgTlVMTCwgMCwgMCkKK2FyZyhoYW5kbGVtaXNzaW5ncHZzX0FSRywgJ1wwJywgImhhbmRsZW1pc3NpbmdwdnMiLCBOVUxMLCAwLCAwKQorYXJnKGlnbm9yZWFkdmFuY2VkX0FSRywgJ1wwJywgImlnbm9yZWFkdmFuY2VkIiwgTlVMTCwgMCwgMCkKK2FyZyhpZ25vcmVsb2NhbF9BUkcsICdcMCcsICJpZ25vcmVsb2NhbCIsIE5VTEwsIDAsIDApCithcmcoaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCAnXDAnLCAiaWdub3JlbG9ja2luZ2ZhaWx1cmUiLCBOVUxMLCAwLCAwKQorYXJnKGlnbm9yZW1vbml0b3JpbmdfQVJHLCAnXDAnLCAiaWdub3JlbW9uaXRvcmluZyIsIE5VTEwsIDAsIDApCithcmcoaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCAnXDAnLCAiaWdub3Jlc2tpcHBlZGNsdXN0ZXIiLCBOVUxMLCAwLCAwKQorYXJnKGlnbm9yZXVuc3VwcG9ydGVkX0FSRywgJ1wwJywgImlnbm9yZXVuc3VwcG9ydGVkIiwgTlVMTCwgMCwgMCkKK2FyZyhsYWJlbHNlY3Rvcl9BUkcsICdcMCcsICJsYWJlbHNlY3RvciIsIGludF9hcmcsIDAsIDApCithcmcobG9ja29wdF9BUkcsICdcMCcsICJsb2Nrb3B0Iiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhsb2Nrc3RhcnRfQVJHLCAnXDAnLCAibG9ja3N0YXJ0IiwgTlVMTCwgMCwgMCkKK2FyZyhsb2Nrc3RvcF9BUkcsICdcMCcsICJsb2Nrc3RvcCIsIE5VTEwsIDAsIDApCithcmcobG9ja3R5cGVfQVJHLCAnXDAnLCAibG9ja3R5cGUiLCBsb2NrdHlwZV9hcmcsIDAsIDApCithcmcobG9nb25seV9BUkcsICdcMCcsICJsb2dvbmx5IiwgTlVMTCwgMCwgMCkKK2FyZyhtYXhyZWNvdmVyeXJhdGVfQVJHLCAnXDAnLCAibWF4cmVjb3ZlcnlyYXRlIiwgc2l6ZV9rYl9hcmcsIDAsIDApCithcmcobWVyZ2VfQVJHLCAnXDAnLCAibWVyZ2UiLCBOVUxMLCAwLCAwKQorYXJnKG1lcmdlZGNvbmZpZ19BUkcsICdcMCcsICJtZXJnZWRjb25maWciLCBOVUxMLCAwLCAwKQorYXJnKG1ldGFkYXRhY29waWVzX0FSRywgJ1wwJywgIm1ldGFkYXRhY29waWVzIiwgbWV0YWRhdGFjb3BpZXNfYXJnLCAwLCAwKQorYXJnKG1ldGFkYXRhaWdub3JlX0FSRywgJ1wwJywgIm1ldGFkYXRhaWdub3JlIiwgeWVzX25vX2FyZywgMCwgMCkKK2FyZyhtZXRhZGF0YXByb2ZpbGVfQVJHLCAnXDAnLCAibWV0YWRhdGFwcm9maWxlIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhtZXRhZGF0YXNpemVfQVJHLCAnXDAnLCAibWV0YWRhdGFzaXplIiwgc2l6ZV9tYl9hcmcsIDAsIDApCithcmcobWlub3JfQVJHLCAnXDAnLCAibWlub3IiLCBpbnRfYXJnLCBBUkdfR1JPVVBBQkxFLCAwKQorYXJnKG1pbnJlY292ZXJ5cmF0ZV9BUkcsICdcMCcsICJtaW5yZWNvdmVyeXJhdGUiLCBzaXplX2tiX2FyZywgMCwgMCkKK2FyZyhtaXJyb3Jsb2dfQVJHLCAnXDAnLCAibWlycm9ybG9nIiwgbWlycm9ybG9nX2FyZywgMCwgMCkKK2FyZyhtaXJyb3Jzb25seV9BUkcsICdcMCcsICJtaXJyb3Jzb25seSIsIE5VTEwsIDAsIDApCithcmcobWtub2Rlc19BUkcsICdcMCcsICJta25vZGVzIiwgTlVMTCwgMCwgMCkKK2FyZyhtb25pdG9yX0FSRywgJ1wwJywgIm1vbml0b3IiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKG5hbWVwcmVmaXhlc19BUkcsICdcMCcsICJuYW1lcHJlZml4ZXMiLCBOVUxMLCAwLCAwKQorYXJnKG5vaGVhZGluZ3NfQVJHLCAnXDAnLCAibm9oZWFkaW5ncyIsIE5VTEwsIDAsIDApCithcmcobm9oaXN0b3J5X0FSRywgJ1wwJywgIm5vaGlzdG9yeSIsIE5VTEwsIDAsIDApCithcmcobm9sb2NraW5nX0FSRywgJ1wwJywgIm5vbG9ja2luZyIsIE5VTEwsIDAsIDApCithcmcobm9yZXN0b3JlZmlsZV9BUkcsICdcMCcsICJub3Jlc3RvcmVmaWxlIiwgTlVMTCwgMCwgMCkKK2FyZyhub3N1ZmZpeF9BUkcsICdcMCcsICJub3N1ZmZpeCIsIE5VTEwsIDAsIDApCithcmcobm9zeW5jX0FSRywgJ1wwJywgIm5vc3luYyIsIE5VTEwsIDAsIDApCithcmcobm90aWZ5ZGJ1c19BUkcsICdcMCcsICJub3RpZnlkYnVzIiwgTlVMTCwgMCwgMCkKK2FyZyhub3VkZXZzeW5jX0FSRywgJ1wwJywgIm5vdWRldnN5bmMiLCBOVUxMLCAwLCAwKQorYXJnKG9yaWdpbm5hbWVfQVJHLCAnXDAnLCAib3JpZ2lubmFtZSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcocGh5c2ljYWx2b2x1bWVzaXplX0FSRywgJ1wwJywgInNldHBoeXNpY2Fsdm9sdW1lc2l6ZSIsIHNpemVfbWJfYXJnLCAwLCAwKQorYXJnKHBvbGxfQVJHLCAnXDAnLCAicG9sbCIsIHllc19ub19hcmcsIDAsIDApCithcmcocG9sbG9wZXJhdGlvbl9BUkcsICdcMCcsICJwb2xsb3BlcmF0aW9uIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhwb29sZGF0YXNpemVfQVJHLCAnXDAnLCAicG9vbGRhdGFzaXplIiwgc2l6ZV9tYl9hcmcsIDAsIDApCithcmcocG9vbG1ldGFkYXRhX0FSRywgJ1wwJywgInBvb2xtZXRhZGF0YSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcocG9vbG1ldGFkYXRhc2l6ZV9BUkcsICdcMCcsICJwb29sbWV0YWRhdGFzaXplIiwgc2l6ZV9tYl9hcmcsIDAsIDApCithcmcocG9vbG1ldGFkYXRhc3BhcmVfQVJHLCAnXDAnLCAicG9vbG1ldGFkYXRhc3BhcmUiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKHByb2ZpbGVfQVJHLCAnXDAnLCAicHJvZmlsZSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcocHZtZXRhZGF0YWNvcGllc19BUkcsICdcMCcsICJwdm1ldGFkYXRhY29waWVzIiwgaW50X2FyZywgMCwgMCkKK2FyZyhyYWlkbWF4cmVjb3ZlcnlyYXRlX0FSRywgJ1wwJywgInJhaWRtYXhyZWNvdmVyeXJhdGUiLCBzaXplX2tiX2FyZywgMCwgMCkKK2FyZyhyYWlkbWlucmVjb3ZlcnlyYXRlX0FSRywgJ1wwJywgInJhaWRtaW5yZWNvdmVyeXJhdGUiLCBzaXplX2tiX2FyZywgMCwgMCkKK2FyZyhyYWlkc3luY2FjdGlvbl9BUkcsICdcMCcsICJyYWlkc3luY2FjdGlvbiIsIHN0cmluZ19hcmcsIDAsIDApCithcmcocmFpZHdyaXRlYmVoaW5kX0FSRywgJ1wwJywgInJhaWR3cml0ZWJlaGluZCIsIGludF9hcmcsIDAsIDApCithcmcocmFpZHdyaXRlbW9zdGx5X0FSRywgJ1wwJywgInJhaWR3cml0ZW1vc3RseSIsIHN0cmluZ19hcmcsIEFSR19HUk9VUEFCTEUsIDApCithcmcocmVhZG9ubHlfQVJHLCAnXDAnLCAicmVhZG9ubHkiLCBOVUxMLCAwLCAwKQorYXJnKHJlZnJlc2hfQVJHLCAnXDAnLCAicmVmcmVzaCIsIE5VTEwsIDAsIDApCithcmcocmVtb3ZlbWlzc2luZ19BUkcsICdcMCcsICJyZW1vdmVtaXNzaW5nIiwgTlVMTCwgMCwgMCkKK2FyZyhyZXBhaXJfQVJHLCAnXDAnLCAicmVwYWlyIiwgTlVMTCwgMCwgMCkKK2FyZyhyZXBsYWNlX0FSRywgJ1wwJywgInJlcGxhY2UiLCBzdHJpbmdfYXJnLCBBUkdfR1JPVVBBQkxFLCAwKQorYXJnKHJlcG9ydGZvcm1hdF9BUkcsICdcMCcsICJyZXBvcnRmb3JtYXQiLCBzdHJpbmdfYXJnLCAwLCAwKQorYXJnKHJlc3RvcmVmaWxlX0FSRywgJ1wwJywgInJlc3RvcmVmaWxlIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhyZXN0b3JlbWlzc2luZ19BUkcsICdcMCcsICJyZXN0b3JlbWlzc2luZyIsIE5VTEwsIDAsIDApCithcmcocmVzeW5jX0FSRywgJ1wwJywgInJlc3luYyIsIE5VTEwsIDAsIDApCithcmcocm93c19BUkcsICdcMCcsICJyb3dzIiwgTlVMTCwgMCwgMCkKK2FyZyhzZWdtZW50c19BUkcsICdcMCcsICJzZWdtZW50cyIsIE5VTEwsIDAsIDApCithcmcoc2VwYXJhdG9yX0FSRywgJ1wwJywgInNlcGFyYXRvciIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoc2hhcmVkX0FSRywgJ1wwJywgInNoYXJlZCIsIE5VTEwsIDAsIDApCithcmcoc2luY2V2ZXJzaW9uX0FSRywgJ1wwJywgInNpbmNldmVyc2lvbiIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoc3BsaXRfQVJHLCAnXDAnLCAic3BsaXQiLCBOVUxMLCAwLCAwKQorYXJnKHNwbGl0Y2FjaGVfQVJHLCAnXDAnLCAic3BsaXRjYWNoZSIsIE5VTEwsIDAsIDApCithcmcoc3BsaXRtaXJyb3JzX0FSRywgJ1wwJywgInNwbGl0bWlycm9ycyIsIGludF9hcmcsIDAsIDApCithcmcoc3BsaXRzbmFwc2hvdF9BUkcsICdcMCcsICJzcGxpdHNuYXBzaG90IiwgTlVMTCwgMCwgMCkKK2FyZyhzaG93ZGVwcmVjYXRlZF9BUkcsICdcMCcsICJzaG93ZGVwcmVjYXRlZCIsIE5VTEwsIDAsIDApCithcmcoc2hvd3Vuc3VwcG9ydGVkX0FSRywgJ1wwJywgInNob3d1bnN1cHBvcnRlZCIsIE5VTEwsIDAsIDApCithcmcoc3RyaXBlc19sb25nX0FSRywgJ1wwJywgInN0cmlwZXMiLCBpbnRfYXJnLCAwLCAwKQorYXJnKHN5bmNhY3Rpb25fQVJHLCAnXDAnLCAic3luY2FjdGlvbiIsIHN0cmluZ19hcmcsIDAsIDApCS8qIEZJWE1FIFVzZSBjdXN0b20gdmFsaWRhdGlvbiBmbiAqLworYXJnKHN5c2luaXRfQVJHLCAnXDAnLCAic3lzaW5pdCIsIE5VTEwsIDAsIDApCithcmcoc3lzdGVtaWRfQVJHLCAnXDAnLCAic3lzdGVtaWQiLCBzdHJpbmdfYXJnLCAwLCAwKQorYXJnKHRoaW5wb29sX0FSRywgJ1wwJywgInRoaW5wb29sIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyh0cmFja2NoYW5nZXNfQVJHLCAnXDAnLCAidHJhY2tjaGFuZ2VzIiwgTlVMTCwgMCwgMCkKK2FyZyh0cnVzdGNhY2hlX0FSRywgJ1wwJywgInRydXN0Y2FjaGUiLCBOVUxMLCAwLCAwKQorYXJnKHR5cGVfQVJHLCAnXDAnLCAidHlwZSIsIHNlZ3R5cGVfYXJnLCAwLCAwKQorYXJnKHVuYnVmZmVyZWRfQVJHLCAnXDAnLCAidW5idWZmZXJlZCIsIE5VTEwsIDAsIDApCithcmcodW5jYWNoZV9BUkcsICdcMCcsICJ1bmNhY2hlIiwgTlVMTCwgMCwgMCkKK2FyZyhjYWNoZXBvbGljeV9BUkcsICdcMCcsICJjYWNoZXBvbGljeSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoY2FjaGVzZXR0aW5nc19BUkcsICdcMCcsICJjYWNoZXNldHRpbmdzIiwgc3RyaW5nX2FyZywgQVJHX0dST1VQQUJMRSwgMCkKK2FyZyh1bmNvbmZpZ3VyZWRfQVJHLCAnXDAnLCAidW5jb25maWd1cmVkIiwgTlVMTCwgMCwgMCkKK2FyZyh1bml0c19BUkcsICdcMCcsICJ1bml0cyIsIHN0cmluZ19hcmcsIDAsIDApCithcmcodW5xdW90ZWRfQVJHLCAnXDAnLCAidW5xdW90ZWQiLCBOVUxMLCAwLCAwKQorYXJnKHVzZXBvbGljaWVzX0FSRywgJ1wwJywgInVzZXBvbGljaWVzIiwgTlVMTCwgMCwgMCkKK2FyZyh2YWxpZGF0ZV9BUkcsICdcMCcsICJ2YWxpZGF0ZSIsIE5VTEwsIDAsIDApCithcmcodmVyc2lvbl9BUkcsICdcMCcsICJ2ZXJzaW9uIiwgTlVMTCwgMCwgMCkKK2FyZyh2Z21ldGFkYXRhY29waWVzX0FSRywgJ1wwJywgInZnbWV0YWRhdGFjb3BpZXMiLCBtZXRhZGF0YWNvcGllc19hcmcsIDAsIDApCithcmcodmlydHVhbG9yaWdpbnNpemVfQVJHLCAnXDAnLCAidmlydHVhbG9yaWdpbnNpemUiLCBzaXplX21iX2FyZywgMCwgMCkKK2FyZyh3aXRoc3VtbWFyeV9BUkcsICdcMCcsICJ3aXRoc3VtbWFyeSIsIE5VTEwsIDAsIDApCithcmcod2l0aGNvbW1lbnRzX0FSRywgJ1wwJywgIndpdGhjb21tZW50cyIsIE5VTEwsIDAsIDApCithcmcod2l0aHNwYWNlc19BUkcsICdcMCcsICJ3aXRoc3BhY2VzIiwgTlVMTCwgMCwgMCkKK2FyZyh3aXRodmVyc2lvbnNfQVJHLCAnXDAnLCAid2l0aHZlcnNpb25zIiwgTlVMTCwgMCwgMCkKK2FyZyh3cml0ZWJlaGluZF9BUkcsICdcMCcsICJ3cml0ZWJlaGluZCIsIGludF9hcmcsIDAsIDApCithcmcod3JpdGVtb3N0bHlfQVJHLCAnXDAnLCAid3JpdGVtb3N0bHkiLCBzdHJpbmdfYXJnLCBBUkdfR1JPVVBBQkxFLCAwKQorCisvKiBBbGxvdyBzb21lIHZhcmlhdGlvbnMgKi8KK2FyZyhhbGxvY2F0aW9uX0FSRywgJ1wwJywgImFsbG9jYXRpb24iLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKGF2YWlsYWJsZV9BUkcsICdcMCcsICJhdmFpbGFibGUiLCBhY3RpdmF0aW9uX2FyZywgMCwgMCkKK2FyZyhyZXNpemFibGVfQVJHLCAnXDAnLCAicmVzaXphYmxlIiwgeWVzX25vX2FyZywgMCwgMCkKKworLyoKKyAqIC4uLiBhbmQgbm93IHRoZSBzaG9ydCBhcmdzLgorICovCithcmcoYWN0aXZhdGVfQVJHLCAnYScsICJhY3RpdmF0ZSIsIGFjdGl2YXRpb25fYXJnLCAwLCAwKQorYXJnKGFsbF9BUkcsICdhJywgImFsbCIsIE5VTEwsIDAsIDApCithcmcoYXV0b2JhY2t1cF9BUkcsICdBJywgImF1dG9iYWNrdXAiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKGFjdGl2ZXZvbHVtZWdyb3Vwc19BUkcsICdBJywgImFjdGl2ZXZvbHVtZWdyb3VwcyIsIE5VTEwsIDAsIDApCithcmcoYmFja2dyb3VuZF9BUkcsICdiJywgImJhY2tncm91bmQiLCBOVUxMLCAwLCAwKQorYXJnKGJhY2tncm91bmRmb3JrX0FSRywgJ2InLCAiYmFja2dyb3VuZCIsIE5VTEwsIDAsIDApCithcmcoYmFzZXZnbmFtZV9BUkcsICduJywgImJhc2V2Z25hbWUiLCBzdHJpbmdfYXJnLCAwLCAwKQorYXJnKGJsb2NrZGV2aWNlX0FSRywgJ2InLCAiYmxvY2tkZXZpY2UiLCBOVUxMLCAwLCAwKQorYXJnKGNodW5rc2l6ZV9BUkcsICdjJywgImNodW5rc2l6ZSIsIHNpemVfa2JfYXJnLCAwLCAwKQorYXJnKGNsdXN0ZXJlZF9BUkcsICdjJywgImNsdXN0ZXJlZCIsIHllc19ub19hcmcsIDAsIDApCithcmcoY29sb25fQVJHLCAnYycsICJjb2xvbiIsIE5VTEwsIDAsIDApCithcmcoY29sdW1uc19BUkcsICdDJywgImNvbHVtbnMiLCBOVUxMLCAwLCAwKQorYXJnKGNvbnRpZ3VvdXNfQVJHLCAnQycsICJjb250aWd1b3VzIiwgeWVzX25vX2FyZywgMCwgMCkKK2FyZyhkZWJ1Z19BUkcsICdkJywgImRlYnVnIiwgTlVMTCwgQVJHX0NPVU5UQUJMRSwgMCkKK2FyZyhleHBvcnRlZF9BUkcsICdlJywgImV4cG9ydGVkIiwgTlVMTCwgMCwgMCkKK2FyZyhwaHlzaWNhbGV4dGVudF9BUkcsICdFJywgInBoeXNpY2FsZXh0ZW50IiwgTlVMTCwgMCwgMCkKK2FyZyhmaWxlX0FSRywgJ2YnLCAiZmlsZSIsIHN0cmluZ19hcmcsIDAsIDApCithcmcoZm9yY2VfQVJHLCAnZicsICJmb3JjZSIsIE5VTEwsIEFSR19DT1VOVEFCTEUsIDApCithcmcoZnVsbF9BUkcsICdmJywgImZ1bGwiLCBOVUxMLCAwLCAwKQorYXJnKGhlbHBfQVJHLCAnaCcsICJoZWxwIiwgTlVMTCwgMCwgMCkKK2FyZyhjYWNoZV9BUkcsICdIJywgImNhY2hlIiwgTlVMTCwgMCwgMCkKK2FyZyhoaXN0b3J5X0FSRywgJ0gnLCAiaGlzdG9yeSIsIE5VTEwsIDAsIDApCithcmcoaGVscDJfQVJHLCAnPycsICIiLCBOVUxMLCAwLCAwKQorYXJnKGltcG9ydF9BUkcsICdpJywgImltcG9ydCIsIE5VTEwsIDAsIDApCithcmcoaW50ZXJ2YWxfQVJHLCAnaScsICJpbnRlcnZhbCIsIGludF9hcmcsIDAsIDApCithcmcoaW9wX3ZlcnNpb25fQVJHLCAnaScsICJpb3BfdmVyc2lvbiIsIE5VTEwsIDAsIDApCithcmcoc3RyaXBlc19BUkcsICdpJywgInN0cmlwZXMiLCBpbnRfYXJnLCAwLCAwKQorYXJnKHN0cmlwZXNpemVfQVJHLCAnSScsICJzdHJpcGVzaXplIiwgc2l6ZV9rYl9hcmcsIDAsIDApCithcmcobG9naWNhbHZvbHVtZV9BUkcsICdsJywgImxvZ2ljYWx2b2x1bWUiLCBpbnRfYXJnLCAwLCAwKQorYXJnKG1heGxvZ2ljYWx2b2x1bWVzX0FSRywgJ2wnLCAibWF4bG9naWNhbHZvbHVtZXMiLCBpbnRfYXJnLCAwLCAwKQorYXJnKGV4dGVudHNfQVJHLCAnbCcsICJleHRlbnRzIiwgaW50X2FyZ193aXRoX3NpZ25fYW5kX3BlcmNlbnQsIDAsIDApCithcmcobGlzdF9BUkcsICdsJywgImxpc3QiLCBOVUxMLCAwLCAwKQorYXJnKGx2bXBhcnRpdGlvbl9BUkcsICdsJywgImx2bXBhcnRpdGlvbiIsIE5VTEwsIDAsIDApCithcmcobG9naWNhbGV4dGVudF9BUkcsICdMJywgImxvZ2ljYWxleHRlbnQiLCBpbnRfYXJnX3dpdGhfc2lnbiwgMCwgMCkKK2FyZyhzaXplX0FSRywgJ0wnLCAic2l6ZSIsIHNpemVfbWJfYXJnLCAwLCAwKQorYXJnKHBlcnNpc3RlbnRfQVJHLCAnTScsICJwZXJzaXN0ZW50IiwgeWVzX25vX2FyZywgMCwgMCkKK2FyZyhtYWpvcl9BUkcsICdqJywgIm1ham9yIiwgaW50X2FyZywgQVJHX0dST1VQQUJMRSwgMCkKK2FyZyhzZXRhY3RpdmF0aW9uc2tpcF9BUkcsICdrJywgInNldGFjdGl2YXRpb25za2lwIiwgeWVzX25vX2FyZywgMCwgMCkKK2FyZyhpZ25vcmVhY3RpdmF0aW9uc2tpcF9BUkcsICdLJywgImlnbm9yZWFjdGl2YXRpb25za2lwIiwgTlVMTCwgMCwgMCkKK2FyZyhtYXBzX0FSRywgJ20nLCAibWFwcyIsIE5VTEwsIDAsIDApCithcmcobWlycm9yc19BUkcsICdtJywgIm1pcnJvcnMiLCBpbnRfYXJnX3dpdGhfc2lnbiwgMCwgMCkKK2FyZyhtZXRhZGF0YXR5cGVfQVJHLCAnTScsICJtZXRhZGF0YXR5cGUiLCBtZXRhZGF0YXR5cGVfYXJnLCAwLCAwKQorYXJnKG5hbWVfQVJHLCAnbicsICJuYW1lIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyhub2ZzY2tfQVJHLCAnbicsICJub2ZzY2siLCBOVUxMLCAwLCAwKQorYXJnKG5vdm9sdW1lZ3JvdXBfQVJHLCAnbicsICJub3ZvbHVtZWdyb3VwIiwgTlVMTCwgMCwgMCkKK2FyZyhvbGRwYXRoX0FSRywgJ24nLCAib2xkcGF0aCIsIE5VTEwsIDAsIDApCithcmcob3B0aW9uc19BUkcsICdvJywgIm9wdGlvbnMiLCBzdHJpbmdfYXJnLCBBUkdfR1JPVVBBQkxFLCAwKQorYXJnKHNvcnRfQVJHLCAnTycsICJzb3J0Iiwgc3RyaW5nX2FyZywgQVJHX0dST1VQQUJMRSwgMCkKK2FyZyhtYXhwaHlzaWNhbHZvbHVtZXNfQVJHLCAncCcsICJtYXhwaHlzaWNhbHZvbHVtZXMiLCBpbnRfYXJnLCAwLCAwKQorYXJnKHBlcm1pc3Npb25fQVJHLCAncCcsICJwZXJtaXNzaW9uIiwgcGVybWlzc2lvbl9hcmcsIDAsIDApCithcmcocGFydGlhbF9BUkcsICdQJywgInBhcnRpYWwiLCBOVUxMLCAwLCAwKQorYXJnKHBoeXNpY2Fsdm9sdW1lX0FSRywgJ1AnLCAicGh5c2ljYWx2b2x1bWUiLCBOVUxMLCAwLCAwKQorYXJnKHF1aWV0X0FSRywgJ3EnLCAicXVpZXQiLCBOVUxMLCBBUkdfQ09VTlRBQkxFLCAwKQorYXJnKHJlYWRhaGVhZF9BUkcsICdyJywgInJlYWRhaGVhZCIsIHJlYWRhaGVhZF9hcmcsIDAsIDApCithcmcocmVzaXplZnNfQVJHLCAncicsICJyZXNpemVmcyIsIE5VTEwsIDAsIDApCithcmcocmVzZXRfQVJHLCAnUicsICJyZXNldCIsIE5VTEwsIDAsIDApCithcmcocmVnaW9uc2l6ZV9BUkcsICdSJywgInJlZ2lvbnNpemUiLCBzaXplX21iX2FyZywgMCwgMCkKK2FyZyhwaHlzaWNhbGV4dGVudHNpemVfQVJHLCAncycsICJwaHlzaWNhbGV4dGVudHNpemUiLCBzaXplX21iX2FyZywgMCwgMCkKK2FyZyhzbmFwc2hvdF9BUkcsICdzJywgInNuYXBzaG90IiwgTlVMTCwgMCwgMCkKK2FyZyhzaG9ydF9BUkcsICdzJywgInNob3J0IiwgTlVMTCwgMCwgMCkKK2FyZyhzdGRpbl9BUkcsICdzJywgInN0ZGluIiwgTlVMTCwgMCwgMCkKK2FyZyhzZWxlY3RfQVJHLCAnUycsICJzZWxlY3QiLCBzdHJpbmdfYXJnLCBBUkdfR1JPVVBBQkxFLCAwKQorYXJnKHRlc3RfQVJHLCAndCcsICJ0ZXN0IiwgTlVMTCwgMCwgMCkKK2FyZyh0aGluX0FSRywgJ1QnLCAidGhpbiIsIE5VTEwsIDAsIDApCithcmcodXVpZF9BUkcsICd1JywgInV1aWQiLCBOVUxMLCAwLCAwKQorYXJnKHV1aWRzdHJfQVJHLCAndScsICJ1dWlkIiwgc3RyaW5nX2FyZywgMCwgMCkKK2FyZyh1dWlkbGlzdF9BUkcsICdVJywgInV1aWRsaXN0IiwgTlVMTCwgMCwgMCkKK2FyZyh2ZXJib3NlX0FSRywgJ3YnLCAidmVyYm9zZSIsIE5VTEwsIEFSR19DT1VOVEFCTEUsIDApCithcmcodm9sdW1lZ3JvdXBfQVJHLCAnVicsICJ2b2x1bWVncm91cCIsIE5VTEwsIDAsIDApCithcmcodmlydHVhbHNpemVfQVJHLCAnVicsICJ2aXJ0dWFsc2l6ZSIsIHNpemVfbWJfYXJnLCAwLCAwKQorYXJnKHdpcGVzaWduYXR1cmVzX0FSRywgJ1cnLCAid2lwZXNpZ25hdHVyZXMiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKGFsbG9jYXRhYmxlX0FSRywgJ3gnLCAiYWxsb2NhdGFibGUiLCB5ZXNfbm9fYXJnLCAwLCAwKQorYXJnKHJlc2l6ZWFibGVfQVJHLCAneCcsICJyZXNpemVhYmxlIiwgeWVzX25vX2FyZywgMCwgMCkKK2FyZyh5ZXNfQVJHLCAneScsICJ5ZXMiLCBOVUxMLCAwLCAwKQorYXJnKHplcm9fQVJHLCAnWicsICJ6ZXJvIiwgeWVzX25vX2FyZywgMCwgMCkKKworLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIGxhc3QgKi8KK2FyZyhBUkdfQ09VTlQsICctJywgIiIsIE5VTEwsIDAsIDApCisvKiAqSU5ERU5ULU9OKiAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvY21kbmFtZXMuaCBiL3Rvb2xzL2NtZG5hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiODc2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NtZG5hbWVzLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgeHgoYSwgYiwgYy4uLikgYQorCisjaW5jbHVkZSAiY29tbWFuZHMuaCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbW1hbmRzLmggYi90b29scy9jb21tYW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDg3NTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jb21tYW5kcy5oCkBAIC0wLDAgKzEsMTU1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKioqKioqKioqKiAgUmVwbGFjZSB3aXRoIHNjcmlwdD8KK3h4KGUyZnNhZG0sCisgICAiUmVzaXplIGxvZ2ljYWwgdm9sdW1lIGFuZCBleHQyIGZpbGVzeXN0ZW0iLAorICAgImUyZnNhZG0gIgorICAgIlstZHwtLWRlYnVnXSAiICJbLWh8LS1oZWxwXSAiICJbLW58LS1ub2ZzY2tdXG4iCisgICAiXHR7Wy1sfC0tZXh0ZW50c10gWyt8LV1Mb2dpY2FsRXh0ZW50c051bWJlciB8XG4iCisgICAiXHQgWy1MfC0tc2l6ZV0gWyt8LV1Mb2dpY2FsVm9sdW1lU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXX1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdExvZ2ljYWxWb2x1bWVQYXRoXG4iLAorCisgICAgZXh0ZW50c19BUkcsIHNpemVfQVJHLCBub2ZzY2tfQVJHLCB0ZXN0X0FSRykKKyoqKioqKioqKi8KKworeHgoY29uZmlnLAorICAgIkRpc3BsYXkgYW5kIG1hbmlwdWxhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJjb25maWdcbiIKKyAgICJcdFstZnwtLWZpbGUgZmlsZW5hbWVdXG4iCisgICAiXHRbLS10eXBlIHtjdXJyZW50fGRlZmF1bHR8ZGlmZnxmdWxsfGxpc3R8bWlzc2luZ3xuZXd8cHJvZmlsYWJsZXxwcm9maWxhYmxlLWNvbW1hbmR8cHJvZmlsYWJsZS1tZXRhZGF0YX1dXG4iCisgICAiXHRbLS1hdHZlcnNpb24gdmVyc2lvbl1cbiIKKyAgICJcdFstLWlnbm9yZWFkdmFuY2VkXVxuIgorICAgIlx0Wy0taWdub3JldW5zdXBwb3J0ZWRdXG4iCisgICAiXHRbLS1pZ25vcmVsb2NhbF1cbiIKKyAgICJcdFstbHwtLWxpc3RdXG4iCisgICAiXHRbLS1jb25maWcgQ29uZmlndXJhdGlvblN0cmluZ11cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstLW1ldGFkYXRhcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstLW1lcmdlZGNvbmZpZ11cbiIKKyAgICJcdFstLXNpbmNldmVyc2lvbiB2ZXJzaW9uXVxuIgorICAgIlx0Wy0tc2hvd2RlcHJlY2F0ZWRdXG4iCisgICAiXHRbLS1zaG93dW5zdXBwb3J0ZWRdXG4iCisgICAiXHRbLS12YWxpZGF0ZV1cbiIKKyAgICJcdFstLXdpdGhzdW1tYXJ5XVxuIgorICAgIlx0Wy0td2l0aGNvbW1lbnRzXVxuIgorICAgIlx0Wy0td2l0aHNwYWNlc11cbiIKKyAgICJcdFstLXVuY29uZmlndXJlZF1cbiIKKyAgICJcdFstLXdpdGh2ZXJzaW9uc11cbiIKKyAgICJcdFtDb25maWd1cmF0aW9uTm9kZS4uLl1cbiIsCisgICBhdHZlcnNpb25fQVJHLCBjb25maWd0eXBlX0FSRywgZmlsZV9BUkcsIGlnbm9yZWFkdmFuY2VkX0FSRywKKyAgIGlnbm9yZXVuc3VwcG9ydGVkX0FSRywgaWdub3JlbG9jYWxfQVJHLCBsaXN0X0FSRywgbWVyZ2VkY29uZmlnX0FSRywgbWV0YWRhdGFwcm9maWxlX0FSRywKKyAgIHNpbmNldmVyc2lvbl9BUkcsIHNob3dkZXByZWNhdGVkX0FSRywgc2hvd3Vuc3VwcG9ydGVkX0FSRywgdmFsaWRhdGVfQVJHLCB3aXRoc3VtbWFyeV9BUkcsCisgICB3aXRoY29tbWVudHNfQVJHLCB3aXRoc3BhY2VzX0FSRywgdW5jb25maWd1cmVkX0FSRywgd2l0aHZlcnNpb25zX0FSRykKKworeHgoZGV2dHlwZXMsCisgICAiRGlzcGxheSByZWNvZ25pc2VkIGJ1aWx0LWluIGJsb2NrIGRldmljZSB0eXBlcyIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJkZXZ0eXBlc1xuIgorICAgIlx0Wy0tYWxpZ25lZF1cbiIKKyAgICJcdFstLWJpbmFyeV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0tbmFtZXByZWZpeGVzXVxuIgorICAgIlx0Wy0tbm9oZWFkaW5nc11cbiIKKyAgICJcdFstLW5vc3VmZml4XVxuIgorICAgIlx0Wy1vfC0tb3B0aW9ucyBbK3wtfCNdRmllbGRbLEZpZWxkXV1cbiIKKyAgICJcdFstT3wtLXNvcnQgWyt8LV1rZXkxWyxbK3wtXWtleTJbLC4uLl1dXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstLXJvd3NdXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy0tc2VwYXJhdG9yIFNlcGFyYXRvcl1cbiIKKyAgICJcdFstLXVuYnVmZmVyZWRdXG4iCisgICAiXHRbLS11bnF1b3RlZF1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iLAorCisgICBhbGlnbmVkX0FSRywgYmluYXJ5X0FSRywgbmFtZXByZWZpeGVzX0FSRywgbm9oZWFkaW5nc19BUkcsCisgICBub3N1ZmZpeF9BUkcsIG9wdGlvbnNfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCByb3dzX0FSRywKKyAgIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsIHNvcnRfQVJHLCB1bmJ1ZmZlcmVkX0FSRywgdW5xdW90ZWRfQVJHKQorCit4eChkdW1wY29uZmlnLAorICAgIkRpc3BsYXkgYW5kIG1hbmlwdWxhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJkdW1wY29uZmlnXG4iCisgICAiXHRbLWZ8LS1maWxlIGZpbGVuYW1lXVxuIgorICAgIlx0Wy0tdHlwZSB7Y3VycmVudHxkZWZhdWx0fGRpZmZ8ZnVsbHxsaXN0fG1pc3Npbmd8bmV3fHByb2ZpbGFibGV8cHJvZmlsYWJsZS1jb21tYW5kfHByb2ZpbGFibGUtbWV0YWRhdGF9XVxuIgorICAgIlx0Wy0tYXR2ZXJzaW9uIHZlcnNpb25dXG4iCisgICAiXHRbLS1pZ25vcmVhZHZhbmNlZF1cbiIKKyAgICJcdFstLWlnbm9yZXVuc3VwcG9ydGVkXVxuIgorICAgIlx0Wy0taWdub3JlbG9jYWxdXG4iCisgICAiXHRbLWx8LS1saXN0XVxuIgorICAgIlx0Wy0tY29uZmlnIENvbmZpZ3VyYXRpb25TdHJpbmddXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstLXByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLS1tZXRhZGF0YXByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLS1tZXJnZWRjb25maWddXG4iCisgICAiXHRbLS1zaW5jZXZlcnNpb24gdmVyc2lvbl1cbiIKKyAgICJcdFstLXNob3dkZXByZWNhdGVkXVxuIgorICAgIlx0Wy0tc2hvd3Vuc3VwcG9ydGVkXVxuIgorICAgIlx0Wy0tdmFsaWRhdGVdXG4iCisgICAiXHRbLS13aXRoc3VtbWFyeV1cbiIKKyAgICJcdFstLXdpdGhjb21tZW50c11cbiIKKyAgICJcdFstLXdpdGhzcGFjZXNdXG4iCisgICAiXHRbLS11bmNvbmZpZ3VyZWRdXG4iCisgICAiXHRbLS13aXRodmVyc2lvbnNdXG4iCisgICAiXHRbQ29uZmlndXJhdGlvbk5vZGUuLi5dXG4iLAorICAgYXR2ZXJzaW9uX0FSRywgY29uZmlndHlwZV9BUkcsIGZpbGVfQVJHLCBpZ25vcmVhZHZhbmNlZF9BUkcsCisgICBpZ25vcmV1bnN1cHBvcnRlZF9BUkcsIGlnbm9yZWxvY2FsX0FSRywgbGlzdF9BUkcsIG1lcmdlZGNvbmZpZ19BUkcsIG1ldGFkYXRhcHJvZmlsZV9BUkcsCisgICBzaW5jZXZlcnNpb25fQVJHLCBzaG93ZGVwcmVjYXRlZF9BUkcsIHNob3d1bnN1cHBvcnRlZF9BUkcsIHZhbGlkYXRlX0FSRywgd2l0aHN1bW1hcnlfQVJHLAorICAgd2l0aGNvbW1lbnRzX0FSRywgd2l0aHNwYWNlc19BUkcsIHVuY29uZmlndXJlZF9BUkcsIHdpdGh2ZXJzaW9uc19BUkcpCisKK3h4KGZvcm1hdHMsCisgICAiTGlzdCBhdmFpbGFibGUgbWV0YWRhdGEgZm9ybWF0cyIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJmb3JtYXRzXG4iKQorCit4eChoZWxwLAorICAgIkRpc3BsYXkgaGVscCBmb3IgY29tbWFuZHMiLAorICAgUEVSTUlUVEVEX1JFQURfT05MWSB8IE5PX01FVEFEQVRBX1BST0NFU1NJTkcsCisgICAiaGVscCA8Y29tbWFuZD5cbiIpCisKKy8qKioqKioqKioKK3h4KGx2YWN0aXZhdGUsCisgICAiQWN0aXZhdGUgbG9naWNhbCB2b2x1bWUgb24gZ2l2ZW4gcGFydGl0aW9uKHMpIiwKKyAgICJsdmFjdGl2YXRlICIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiTG9naWNhbCBWb2x1bWUocylcbiIpCisqKioqKioqKioqKi8KKworeHgoZnVsbHJlcG9ydCwKKyAgICJEaXNwbGF5IGZ1bGwgcmVwb3J0IiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBBTExfVkdTX0lTX0RFRkFVTFQgfCBMT0NLRF9WR19TSCwKKyAgICJmdWxscmVwb3J0XG4iCisgICAiXHRbLS1hbGlnbmVkXVxuIgorICAgIlx0Wy0tYmluYXJ5XVxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLS1jb25maWdyZXBvcnQgUmVwb3J0TmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy0tZm9yZWlnbl1cbiIKKyAgICJcdFstaHwtLWhlbHBdXG4iCisgICAiXHRbLS1pZ25vcmVsb2NraW5nZmFpbHVyZV1cbiIKKyAgICJcdFstLWlnbm9yZXNraXBwZWRjbHVzdGVyXVxuIgorICAgIlx0Wy0tbG9nb25seV1cbiIKKyAgICJcdFstLW5hbWVwcmVmaXhlc11cbiIKKyAgICJcdFstLW5vaGVhZGluZ3NdXG4iCisgICAiXHRbLS1ub3N1ZmZpeF1cbiIKKyAgICJcdFstb3wtLW9wdGlvbnMgWyt8LXwjXUZpZWxkWyxGaWVsZF1dXG4iCisgICAiXHRbLU98LS1zb3J0IFsrfC1da2V5MVssWyt8LV1rZXkyWywuLi5dXV1cbiIKKyAgICJcdFstUHwtLXBhcnRpYWxdXG4iCisgICAiXHRbLS1yZWFkb25seV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLS1yb3dzXVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstLXNlcGFyYXRvciBTZXBhcmF0b3JdXG4iCisgICAiXHRbLS10cnVzdGNhY2hlXVxuIgorICAgIlx0Wy0tdW5idWZmZXJlZF1cbiIKKyAgICJcdFstLXVuaXRzIGhIYkJzU2tLbU1nR3RUcFBlRV1cbiIKKyAgICJcdFstLXVucXVvdGVkXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbVm9sdW1lR3JvdXBOYW1lIFtWb2x1bWVHcm91cE5hbWUuLi5dXVxuIiwKKworICAgYWxpZ25lZF9BUkcsIGFsbF9BUkcsIGJpbmFyeV9BUkcsIGNvbmZpZ3JlcG9ydF9BUkcsIGZvcmVpZ25fQVJHLAorICAgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCBpZ25vcmVza2lwcGVkY2x1c3Rlcl9BUkcsIGxvZ29ubHlfQVJHLAorICAgbmFtZXByZWZpeGVzX0FSRywgbm9oZWFkaW5nc19BUkcsIG5vbG9ja2luZ19BUkcsIG5vc3VmZml4X0FSRywKKyAgIG9wdGlvbnNfQVJHLCBwYXJ0aWFsX0FSRywgcmVhZG9ubHlfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCByb3dzX0FSRywKKyAgIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsIHNoYXJlZF9BUkcsIHNvcnRfQVJHLCB0cnVzdGNhY2hlX0FSRywKKyAgIHVuYnVmZmVyZWRfQVJHLCB1bml0c19BUkcsIHVucXVvdGVkX0FSRykKKworeHgobGFzdGxvZywKKyAgICJEaXNwbGF5IGxhc3QgY29tbWFuZCdzIGxvZyByZXBvcnQiLAorICAgUEVSTUlUVEVEX1JFQURfT05MWSB8IE5PX01FVEFEQVRBX1BST0NFU1NJTkcsCisgICAibG9nXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIsCisKKyAgIHJlcG9ydGZvcm1hdF9BUkcsIHNlbGVjdF9BUkcpCisKK3h4KGx2Y2hhbmdlLAorICAgIkNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiBsb2dpY2FsIHZvbHVtZShzKSIsCisgICBDQUNIRV9WR01FVEFEQVRBIHwgUEVSTUlUVEVEX1JFQURfT05MWSwKKyAgICJsdmNoYW5nZVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB7eXxufV1cbiIKKyAgICJcdFstYXwtLWFjdGl2YXRlIFthXVtlfHN8bF17eXxufV1cbiIKKyAgICJcdFstLWFjdGl2YXRpb25tb2RlIHtjb21wbGV0ZXxkZWdyYWRlZHxwYXJ0aWFsfSIKKyAgICJcdFstLWFkZHRhZyA8VGFnPl1cbiIKKyAgICJcdFstLWFsbG9jIDxBbGxvY2F0aW9uUG9saWN5Pl1cbiIKKyAgICJcdFstQ3wtLWNvbnRpZ3VvdXMge3l8bn1dXG4iCisgICAiXHRbLS1jYWNoZW1vZGUgPENhY2hlTW9kZT5dXG4iCisgICAiXHRbLS1jYWNoZXBvbGljeSA8cG9saWN5bmFtZT5dIFstLWNhY2hlc2V0dGluZ3MgPHBhcmFtZXRlcj12YWx1ZT5dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSA8UHJvZmlsZU5hbWU+XVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1kZWx0YWcgPFRhZz5dXG4iCisgICAiXHRbLS1kZXRhY2hwcm9maWxlXVxuIgorICAgIlx0Wy0tZXJyb3J3aGVuZnVsbCB7eXxufV1cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWRpc2NhcmRzIHtpZ25vcmV8bm9wYXNzZG93bnxwYXNzZG93bn1dXG4iCisgICAiXHRbLS1pZ25vcmVsb2NraW5nZmFpbHVyZV1cbiIKKyAgICJcdFstLWlnbm9yZW1vbml0b3JpbmddXG4iCisgICAiXHRbLS1pZ25vcmVza2lwcGVkY2x1c3Rlcl1cbiIKKyAgICJcdFsta3wtLXNldGFjdGl2YXRpb25za2lwIHt5fG59XVxuIgorICAgIlx0Wy1LfC0taWdub3JlYWN0aXZhdGlvbnNraXBdXG4iCisgICAiXHRbLS1tb25pdG9yIHt5fG59XVxuIgorICAgIlx0Wy0tcG9sbCB7eXxufV1cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLU18LS1wZXJzaXN0ZW50IHt5fG59XSBbLWp8LS1tYWpvciA8bWFqb3I+XSBbLS1taW5vciA8bWlub3I+XVxuIgorICAgIlx0Wy0tbWV0YWRhdGFwcm9maWxlIDxQcm9maWxlTmFtZT5dXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy1wfC0tcGVybWlzc2lvbiB7cnxyd31dXG4iCisgICAiXHRbLS1bcmFpZF1taW5yZWNvdmVyeXJhdGUgPFJhdGU+XVxuIgorICAgIlx0Wy0tW3JhaWRdbWF4cmVjb3ZlcnlyYXRlIDxSYXRlPl1cbiIKKyAgICJcdFstLVtyYWlkXXN5bmNhY3Rpb24ge2NoZWNrfHJlcGFpcn1cbiIKKyAgICJcdFstLVtyYWlkXXdyaXRlYmVoaW5kIDxJT0NvdW50Pl1cbiIKKyAgICJcdFstLVtyYWlkXXdyaXRlbW9zdGx5IDxQaHlzaWNhbFZvbHVtZT5bOnt0fG58eX1dXVxuIgorICAgIlx0Wy1yfC0tcmVhZGFoZWFkIDxSZWFkQWhlYWRTZWN0b3JzPnxhdXRvfG5vbmVdXG4iCisgICAiXHRbLS1yZWZyZXNoXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstLXJlc3luY11cbiIKKyAgICJcdFstU3wtLXNlbGVjdCBTZWxlY3Rpb25dXG4iCisgICAiXHRbLS1zeXNpbml0XVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0Wy15fC0teWVzXVxuIgorICAgIlx0Wy1afC0temVybyB7eXxufV1cbiIKKyAgICJcdDxMb2dpY2FsVm9sdW1lW1BhdGhdPiBbPExvZ2ljYWxWb2x1bWVbUGF0aF0+Li4uXVxuIiwKKworICAgYWN0aXZhdGlvbm1vZGVfQVJHLCBhZGR0YWdfQVJHLCBhbGxvY19BUkcsIGF1dG9iYWNrdXBfQVJHLCBhY3RpdmF0ZV9BUkcsCisgICBhdmFpbGFibGVfQVJHLCBjYWNoZW1vZGVfQVJHLCBjYWNoZXBvbGljeV9BUkcsIGNhY2hlc2V0dGluZ3NfQVJHLAorICAgY29udGlndW91c19BUkcsIGRlbHRhZ19BUkcsCisgICBkaXNjYXJkc19BUkcsIGRldGFjaHByb2ZpbGVfQVJHLCBlcnJvcndoZW5mdWxsX0FSRywgZm9yY2VfQVJHLAorICAgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCBpZ25vcmVtb25pdG9yaW5nX0FSRywgaWdub3JlYWN0aXZhdGlvbnNraXBfQVJHLAorICAgaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCBtYWpvcl9BUkcsIG1ldGFkYXRhcHJvZmlsZV9BUkcsIG1pbm9yX0FSRywKKyAgIG1vbml0b3JfQVJHLCBtaW5yZWNvdmVyeXJhdGVfQVJHLCBtYXhyZWNvdmVyeXJhdGVfQVJHLCBub3VkZXZzeW5jX0FSRywKKyAgIHBhcnRpYWxfQVJHLCBwZXJtaXNzaW9uX0FSRywgcGVyc2lzdGVudF9BUkcsIHBvbGxfQVJHLAorICAgcmFpZG1pbnJlY292ZXJ5cmF0ZV9BUkcsIHJhaWRtYXhyZWNvdmVyeXJhdGVfQVJHLCByYWlkc3luY2FjdGlvbl9BUkcsCisgICByYWlkd3JpdGViZWhpbmRfQVJHLCByYWlkd3JpdGVtb3N0bHlfQVJHLCByZWFkYWhlYWRfQVJHLCByZXBvcnRmb3JtYXRfQVJHLAorICAgcmVzeW5jX0FSRywgcmVmcmVzaF9BUkcsIHNlbGVjdF9BUkcsIHNldGFjdGl2YXRpb25za2lwX0FSRywgc3luY2FjdGlvbl9BUkcsCisgICBzeXNpbml0X0FSRywgdGVzdF9BUkcsIHdyaXRlYmVoaW5kX0FSRywgd3JpdGVtb3N0bHlfQVJHLCB6ZXJvX0FSRykKKworI2RlZmluZSBDT01NT05fT1BUUyBcCisJIlx0Wy0tY29tbWFuZHByb2ZpbGUgPFByb2ZpbGVOYW1lPl0gWy1kfC0tZGVidWddIFstaHwtP3wtLWhlbHBdXG4iIFwKKwkiXHRbLS1ub3VkZXZzeW5jXSBbLXR8LS10ZXN0XSBbLXZ8LS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLXl8LS15ZXNdXG4iCisKK3h4KGx2Y29udmVydCwKKyAgICJDaGFuZ2UgbG9naWNhbCB2b2x1bWUgbGF5b3V0IiwKKyAgIDAsCisgICAibHZjb252ZXJ0ICIKKyAgICJbLW18LS1taXJyb3JzIDxNaXJyb3JzPiBbLS1taXJyb3Jsb2cge2Rpc2t8Y29yZXxtaXJyb3JlZH18LS1jb3JlbG9nXV1cbiIKKyAgICJcdFstLXR5cGUgPFNlZ21lbnRUeXBlPl1cbiIKKyAgICJcdFstLXJlcGFpciBbLS11c2UtcG9saWNpZXNdXVxuIgorICAgIlx0Wy0tcmVwbGFjZSBQaHlzaWNhbFZvbHVtZV1cbiIKKyAgICJcdFstUnwtLXJlZ2lvbnNpemUgPE1pcnJvckxvZ1JlZ2lvblNpemU+XVxuIgorICAgIlx0Wy0tYWxsb2MgPEFsbG9jYXRpb25Qb2xpY3k+XVxuIgorICAgIlx0Wy1ifC0tYmFja2dyb3VuZF1cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1pfC0taW50ZXJ2YWwgPFNlY29uZHM+XVxuIgorICAgIlx0Wy0tc3RyaXBlcyA8U3RyaXBlcz4gWy1JfC0tc3RyaXBlc2l6ZSA8U3RyaXBlU2l6ZT5dXVxuIgorICAgQ09NTU9OX09QVFMKKyAgICJcdExvZ2ljYWxWb2x1bWVbUGF0aF0gW1BoeXNpY2FsVm9sdW1lW1BhdGhdLi4uXVxuXG4iCisKKyAgICJsdmNvbnZlcnQgIgorICAgIlstLXNwbGl0bWlycm9ycyA8SW1hZ2VzPiAtLXRyYWNrY2hhbmdlc11cbiIKKyAgICJcdFstLXNwbGl0bWlycm9ycyBJbWFnZXMgLS1uYW1lIFNwbGl0TG9naWNhbFZvbHVtZU5hbWVdXG4iCisgICBDT01NT05fT1BUUworICAgIlx0TG9naWNhbFZvbHVtZVtQYXRoXSBbU3BsaXR0YWJsZVBoeXNpY2FsVm9sdW1lW1BhdGhdLi4uXVxuXG4iCisKKyAgICJsdmNvbnZlcnQgIgorICAgIi0tc3BsaXRzbmFwc2hvdFxuIgorICAgQ09NTU9OX09QVFMKKyAgICJcdFNuYXBzaG90TG9naWNhbFZvbHVtZVtQYXRoXVxuXG4iCisKKyAgICJsdmNvbnZlcnQgIgorICAgIi0tc3BsaXRjYWNoZVxuIgorICAgQ09NTU9OX09QVFMKKyAgICJcdENhY2hlTG9naWNhbFZvbHVtZVtQYXRoXVxuXG4iCisKKyAgICJsdmNvbnZlcnQgIgorICAgIi0tc3BsaXRcbiIKKyAgICJcdFstLW5hbWUgU3BsaXRMb2dpY2FsVm9sdW1lTmFtZV1cbiIKKyAgIENPTU1PTl9PUFRTCisgICAiXHRTcGxpdGFibGVMb2dpY2FsVm9sdW1lW1BhdGhdXG5cbiIKKworICAgImx2Y29udmVydCAiCisgICAiLS11bmNhY2hlXG4iCisgICBDT01NT05fT1BUUworICAgIlx0Q2FjaGVMb2dpY2FsVm9sdW1lW1BhdGhdXG5cbiIKKworICAgImx2Y29udmVydCAiCisgICAiWy0tdHlwZSBzbmFwc2hvdHwtc3wtLXNuYXBzaG90XVxuIgorICAgIlx0Wy1jfC0tY2h1bmtzaXplIDxDaHVua1NpemU+XVxuIgorICAgIlx0Wy1afC0temVybyB7eXxufV1cbiIKKyAgIENPTU1PTl9PUFRTCisgICAiXHRPcmlnaW5hbExvZ2ljYWxWb2x1bWVbUGF0aF0gU25hcHNob3RMb2dpY2FsVm9sdW1lW1BhdGhdXG5cbiIKKworICAgImx2Y29udmVydCAiCisgICAiLS1tZXJnZVxuIgorICAgIlx0Wy1ifC0tYmFja2dyb3VuZF1cbiIKKyAgICJcdFstaXwtLWludGVydmFsIDxTZWNvbmRzPl1cbiIKKyAgIENPTU1PTl9PUFRTCisgICAiXHRMb2dpY2FsVm9sdW1lW1BhdGhdXG5cbiIKKworICAgImx2Y29udmVydCAiCisgICAiWy0tdHlwZSB0aGluWy1wb29sXXwtVHwtLXRoaW5dXG4iCisgICAiXHRbLS10aGlucG9vbCBUaGluUG9vbExvZ2ljYWxWb2x1bWVbUGF0aF1dXG4iCisgICAiXHRbLS1jaHVua3NpemUgPENodW5rU2l6ZT5dXG4iCisgICAiXHRbLS1kaXNjYXJkcyB7aWdub3JlfG5vcGFzc2Rvd258cGFzc2Rvd259XVxuIgorICAgIlx0Wy0tcG9vbG1ldGFkYXRhc3BhcmUge3l8bn1dXG4iCisgICAiXHRbLS1wb29sbWV0YWRhdGEgVGhpbk1ldGFkYXRhTG9naWNhbFZvbHVtZVtQYXRoXSB8XG4iCisgICAiXHQgLS1wb29sbWV0YWRhdGFzaXplIDxNZXRhZGF0YVNpemU+XVxuIgorICAgIlx0Wy1yfC0tcmVhZGFoZWFkIDxSZWFkQWhlYWRTZWN0b3JzPnxhdXRvfG5vbmVdXG4iCisgICAiXHRbLS1zdHJpcGVzIDxTdHJpcGVzPiBbLUl8LS1zdHJpcGVzaXplIDxTdHJpcGVTaXplPl1dXVxuIgorICAgIlx0Wy0tb3JpZ2lubmFtZSBOZXdFeHRlcm5hbE9yaWdpblZvbHVtZU5hbWVdXVxuIgorICAgIlx0Wy1afC0temVybyB7eXxufV1cbiIKKyAgIENPTU1PTl9PUFRTCisgICAiXHRbRXh0ZXJuYWxPcmlnaW58VGhpbkRhdGFQb29sXUxvZ2ljYWxWb2x1bWVbUGF0aF0gW1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1cblxuIgorCisgICAibHZjb252ZXJ0ICIKKyAgICJbLS10eXBlIGNhY2hlWy1wb29sXXwtSHwtLWNhY2hlXVxuIgorICAgIlx0Wy0tY2FjaGVwb29sIENhY2hlRGF0YUxvZ2ljYWxWb2x1bWVbUGF0aF1dXG4iCisgICAiXHRbLS1jYWNoZW1vZGUgPENhY2hlTW9kZT5dXG4iCisgICAiXHRbLS1jYWNoZXBvbGljeSA8Q2FjaGVQb2xpY3k+XVxuIgorICAgIlx0Wy0tY2FjaGVzZXR0aW5ncyA8S2V5Pj08VmFsdWU+XVxuIgorICAgIlx0Wy0tY2h1bmtzaXplIDxDaHVua1NpemU+XVxuIgorICAgIlx0Wy0tcG9vbG1ldGFkYXRhIENhY2hlTWV0YWRhdGFMb2dpY2FsVm9sdW1lW1BhdGhdIHxcbiIKKyAgICJcdCAtLXBvb2xtZXRhZGF0YXNpemUgPE1ldGFkYXRhU2l6ZT5dXG4iCisgICAiXHRbLS1wb29sbWV0YWRhdGFzcGFyZSB7eXxufV1dXG4iCisgICBDT01NT05fT1BUUworICAgIlx0W0NhY2hlfENhY2hlRGF0YVBvb2xdTG9naWNhbFZvbHVtZVtQYXRoXSBbUGh5c2ljYWxWb2x1bWVQYXRoLi4uXVxuXG4iLAorCisgICBhbGxvY19BUkcsIGJhY2tncm91bmRfQVJHLCBjYWNoZV9BUkcsIGNhY2hlbW9kZV9BUkcsCisgICBjYWNoZXBvb2xfQVJHLCBjYWNoZXBvbGljeV9BUkcsIGNhY2hlc2V0dGluZ3NfQVJHLCBjaHVua3NpemVfQVJHLAorICAgY29yZWxvZ19BUkcsIGRpc2NhcmRzX0FSRywgZm9yY2VfQVJHLCBpbnRlcnZhbF9BUkcsIG1lcmdlX0FSRywgbWlycm9ybG9nX0FSRywKKyAgIG1pcnJvcnNfQVJHLCBuYW1lX0FSRywgbm91ZGV2c3luY19BUkcsIG9yaWdpbm5hbWVfQVJHLCBwb29sbWV0YWRhdGFfQVJHLAorICAgcG9vbG1ldGFkYXRhc2l6ZV9BUkcsIHBvb2xtZXRhZGF0YXNwYXJlX0FSRywgcmVhZGFoZWFkX0FSRywgcmVnaW9uc2l6ZV9BUkcsCisgICByZXBhaXJfQVJHLCByZXBsYWNlX0FSRywgc25hcHNob3RfQVJHLAorICAgc3BsaXRfQVJHLCBzcGxpdGNhY2hlX0FSRywgc3BsaXRtaXJyb3JzX0FSRywgc3BsaXRzbmFwc2hvdF9BUkcsCisgICBzdHJpcGVzX2xvbmdfQVJHLCBzdHJpcGVzaXplX0FSRywgdGVzdF9BUkcsIHRoaW5fQVJHLCB0aGlucG9vbF9BUkcsCisgICB0cmFja2NoYW5nZXNfQVJHLCB0eXBlX0FSRywgdW5jYWNoZV9BUkcsIHVzZXBvbGljaWVzX0FSRywgemVyb19BUkcpCisKK3h4KGx2Y3JlYXRlLAorICAgIkNyZWF0ZSBhIGxvZ2ljYWwgdm9sdW1lIiwKKyAgIDAsCisgICAibHZjcmVhdGVcbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAge3l8bn1dXG4iCisgICAiXHRbLWF8LS1hY3RpdmF0ZSBbYXxlfGxde3l8bn1dXG4iCisgICAiXHRbLS1hZGR0YWcgVGFnXVxuIgorICAgIlx0Wy0tYWxsb2MgQWxsb2NhdGlvblBvbGljeV1cbiIKKyAgICJcdFstSHwtLWNhY2hlXG4iCisgICAiXHQgIFstLWNhY2hlbW9kZSB7d3JpdGViYWNrfHdyaXRldGhyb3VnaH1dXG4iCisgICAiXHQgIFstLWNhY2hlcG9saWN5IHBvbGljeV1cbiIKKyAgICJcdCAgWy0tY2FjaGVzZXR0aW5ncyBrZXk9dmFsdWVdXG4iCisgICAiXHRbLS1jYWNoZXBvb2wgQ2FjaGVQb29sTG9naWNhbFZvbHVtZXtOYW1lfFBhdGh9XVxuIgorICAgIlx0Wy1jfC0tY2h1bmtzaXplIENodW5rU2l6ZV1cbiIKKyAgICJcdFstQ3wtLWNvbnRpZ3VvdXMge3l8bn1dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0/fC0taGVscF1cbiIKKyAgICJcdFstLWVycm9yd2hlbmZ1bGwge3l8bn1dXG4iCisgICAiXHRbLS1pZ25vcmVtb25pdG9yaW5nXVxuIgorICAgIlx0Wy0tbW9uaXRvciB7eXxufV1cbiIKKyAgICJcdFstaXwtLXN0cmlwZXMgU3RyaXBlcyBbLUl8LS1zdHJpcGVzaXplIFN0cmlwZVNpemVdXVxuIgorICAgIlx0Wy1rfC0tc2V0YWN0aXZhdGlvbnNraXAge3l8bn1dXG4iCisgICAiXHRbLUt8LS1pZ25vcmVhY3RpdmF0aW9uc2tpcF1cbiIKKyAgICJcdHstbHwtLWV4dGVudHMgTG9naWNhbEV4dGVudHNOdW1iZXJbJXtWR3xQVlN8RlJFRX1dIHxcbiIKKyAgICJcdCAtTHwtLXNpemUgTG9naWNhbFZvbHVtZVNpemVbYkJzU2tLbU1nR3RUcFBlRV19XG4iCisgICAiXHRbLU18LS1wZXJzaXN0ZW50IHt5fG59XSBbLWp8LS1tYWpvciBtYWpvcl0gWy0tbWlub3IgbWlub3JdXG4iCisgICAiXHRbLS1tZXRhZGF0YXByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLW18LS1taXJyb3JzIE1pcnJvcnMgWy0tbm9zeW5jXVxuIgorICAgIlx0ICBbey0tbWlycm9ybG9nIHtkaXNrfGNvcmV8bWlycm9yZWR9fC0tY29yZWxvZ31dXVxuIgorICAgIlx0Wy1ufC0tbmFtZSBMb2dpY2FsVm9sdW1lTmFtZV1cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLXB8LS1wZXJtaXNzaW9uIHtyfHJ3fV1cbiIKKyAgIC8vIlx0Wy0tcG9vbGRhdGFzaXplIERhdGFTaXplW2JCc1NrS21NZ0d0VHBQZUVdXVxuIgorICAgIlx0Wy0tcG9vbG1ldGFkYXRhc2l6ZSBNZXRhZGF0YVNpemVbYkJzU2tLbU1nR11dXG4iCisgICAiXHRbLS1wb29sbWV0YWRhdGFzcGFyZSB7eXxufV1dXG4iCisgICAiXHRbLS1bcmFpZF1taW5yZWNvdmVyeXJhdGUgUmF0ZV1cbiIKKyAgICJcdFstLVtyYWlkXW1heHJlY292ZXJ5cmF0ZSBSYXRlXVxuIgorICAgIlx0Wy1yfC0tcmVhZGFoZWFkIHtSZWFkQWhlYWRTZWN0b3JzfGF1dG98bm9uZX1dXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1SfC0tcmVnaW9uc2l6ZSBNaXJyb3JMb2dSZWdpb25TaXplXVxuIgorICAgIlx0Wy1UfC0tdGhpblxuIgorICAgIlx0ICBbLS1kaXNjYXJkcyB7aWdub3JlfG5vcGFzc2Rvd258cGFzc2Rvd259XVxuIgorICAgIlx0Wy0tdGhpbnBvb2wgVGhpblBvb2xMb2dpY2FsVm9sdW1le05hbWV8UGF0aH1dXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0Wy0tdHlwZSBWb2x1bWVUeXBlXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstV3wtLXdpcGVzaWduYXR1cmVzIHt5fG59XVxuIgorICAgIlx0Wy1afC0temVybyB7eXxufV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRWb2x1bWVHcm91cE5hbWUgW1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1cblxuIgorCisgICAibHZjcmVhdGVcbiIKKyAgICJcdHsgey1zfC0tc25hcHNob3R9IE9yaWdpbmFsTG9naWNhbFZvbHVtZVtQYXRoXSB8XG4iCisgICAiXHQgIFstc3wtLXNuYXBzaG90XSBWb2x1bWVHcm91cE5hbWVbUGF0aF0gLVZ8LS12aXJ0dWFsc2l6ZSBWaXJ0dWFsU2l6ZX1cbiIKKyAgICJcdCAgey1IfC0tY2FjaGV9IFZvbHVtZUdyb3VwTmFtZVtQYXRoXVsvT3JpZ2luYWxMb2dpY2FsVm9sdW1lXVxuIgorICAgIlx0ICB7LVR8LS10aGlufSBWb2x1bWVHcm91cE5hbWVbUGF0aF1bL1Bvb2xMb2dpY2FsVm9sdW1lXVxuIgorICAgIlx0ICAgICAgICAgICAgICAtVnwtLXZpcnR1YWxzaXplIFZpcnR1YWxTaXplfVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB7eXxufV1cbiIKKyAgICJcdFstLWFkZHRhZyBUYWddXG4iCisgICAiXHRbLS1hbGxvYyBBbGxvY2F0aW9uUG9saWN5XVxuIgorICAgIlx0Wy0tY2FjaGVwb2xpY3kgUG9saWN5XSBbLS1jYWNoZXNldHRpbmdzIEtleT1WYWx1ZV1cbiIKKyAgICJcdFstY3wtLWNodW5rc2l6ZV1cbiIKKyAgICJcdFstQ3wtLWNvbnRpZ3VvdXMge3l8bn1dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy0tZGlzY2FyZHMge2lnbm9yZXxub3Bhc3Nkb3dufHBhc3Nkb3dufV1cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1pZ25vcmVtb25pdG9yaW5nXVxuIgorICAgIlx0Wy0tbW9uaXRvciB7eXxufV1cbiIKKyAgICJcdFstaXwtLXN0cmlwZXMgU3RyaXBlcyBbLUl8LS1zdHJpcGVzaXplIFN0cmlwZVNpemVdXVxuIgorICAgIlx0Wy1rfC0tc2V0YWN0aXZhdGlvbnNraXAge3l8bn1dXG4iCisgICAiXHRbLUt8LS1pZ25vcmVhY3RpdmF0aW9uc2tpcF1cbiIKKyAgICJcdHstbHwtLWV4dGVudHMgTG9naWNhbEV4dGVudHNOdW1iZXJbJXtWR3xGUkVFfE9SSUdJTn1dIHxcbiIKKyAgICJcdCAtTHwtLXNpemUgTG9naWNhbFZvbHVtZVNpemVbYkJzU2tLbU1nR3RUcFBlRV19XG4iCisgICAvLyJcdFstLXBvb2xkYXRhc2l6ZSBEYXRhVm9sdW1lU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXV1cbiIKKyAgICJcdFstLXBvb2xtZXRhZGF0YXNpemUgTWV0YWRhdGFWb2x1bWVTaXplW2JCc1NrS21NZ0ddXVxuIgorICAgIlx0Wy1NfC0tcGVyc2lzdGVudCB7eXxufV0gWy1qfC0tbWFqb3IgbWFqb3JdIFstLW1pbm9yIG1pbm9yXVxuIgorICAgIlx0Wy0tbWV0YWRhdGFwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1ufC0tbmFtZSBMb2dpY2FsVm9sdW1lTmFtZV1cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLXB8LS1wZXJtaXNzaW9uIHtyfHJ3fV1cbiIKKyAgICJcdFstcnwtLXJlYWRhaGVhZCBSZWFkQWhlYWRTZWN0b3JzfGF1dG98bm9uZV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0W3stLXRoaW5wb29sIFRoaW5Qb29sTG9naWNhbFZvbHVtZVtQYXRoXSB8XG4iCisgICAiXHQgIC0tY2FjaGVwb29sIENhY2hlUG9vbExvZ2ljYWxWb2x1bWVbUGF0aF19XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbUGh5c2ljYWxWb2x1bWVQYXRoLi4uXVxuXG4iLAorCisgICBhZGR0YWdfQVJHLCBhbGxvY19BUkcsIGF1dG9iYWNrdXBfQVJHLCBhY3RpdmF0ZV9BUkcsIGF2YWlsYWJsZV9BUkcsCisgICBjYWNoZV9BUkcsIGNhY2hlbW9kZV9BUkcsIGNhY2hlcG9vbF9BUkcsIGNhY2hlcG9saWN5X0FSRywgY2FjaGVzZXR0aW5nc19BUkcsCisgICBjaHVua3NpemVfQVJHLCBjb250aWd1b3VzX0FSRywgY29yZWxvZ19BUkcsIGRpc2NhcmRzX0FSRywgZXJyb3J3aGVuZnVsbF9BUkcsCisgICBleHRlbnRzX0FSRywgaWdub3JlYWN0aXZhdGlvbnNraXBfQVJHLCBpZ25vcmVtb25pdG9yaW5nX0FSRywgbWFqb3JfQVJHLAorICAgbWV0YWRhdGFwcm9maWxlX0FSRywgbWlub3JfQVJHLCBtaXJyb3Jsb2dfQVJHLCBtaXJyb3JzX0FSRywgbW9uaXRvcl9BUkcsCisgICBtaW5yZWNvdmVyeXJhdGVfQVJHLCBtYXhyZWNvdmVyeXJhdGVfQVJHLCBuYW1lX0FSRywgbm9zeW5jX0FSRywKKyAgIG5vdWRldnN5bmNfQVJHLCBwZXJtaXNzaW9uX0FSRywgcGVyc2lzdGVudF9BUkcsCisgICAvL3Bvb2xkYXRhc2l6ZV9BUkcsCisgICBwb29sbWV0YWRhdGFzaXplX0FSRywgcG9vbG1ldGFkYXRhc3BhcmVfQVJHLAorICAgcmFpZG1pbnJlY292ZXJ5cmF0ZV9BUkcsIHJhaWRtYXhyZWNvdmVyeXJhdGVfQVJHLAorICAgcmVhZGFoZWFkX0FSRywgcmVnaW9uc2l6ZV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHNldGFjdGl2YXRpb25za2lwX0FSRywKKyAgIHNpemVfQVJHLCBzbmFwc2hvdF9BUkcsIHN0cmlwZXNfQVJHLCBzdHJpcGVzaXplX0FSRywgdGVzdF9BUkcsIHRoaW5fQVJHLAorICAgdGhpbnBvb2xfQVJHLCB0eXBlX0FSRywgdmlydHVhbG9yaWdpbnNpemVfQVJHLCB2aXJ0dWFsc2l6ZV9BUkcsCisgICB3aXBlc2lnbmF0dXJlc19BUkcsIHplcm9fQVJHKQorCit4eChsdmRpc3BsYXksCisgICAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgdm9sdW1lIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBBTExfVkdTX0lTX0RFRkFVTFQgfCBMT0NLRF9WR19TSCwKKyAgICJsdmRpc3BsYXlcbiIKKyAgICJcdFstYXwtLWFsbF1cbiIKKyAgICJcdFstY3wtLWNvbG9uXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1IfC0taGlzdG9yeV1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLW18LS1tYXBzXVxuIgorICAgIlx0Wy0tbm9zdWZmaXhdXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstLXVuaXRzIGhIYkJzU2tLbU1nR3RUcFBlRV1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0W0xvZ2ljYWxWb2x1bWVbUGF0aF0gW0xvZ2ljYWxWb2x1bWVbUGF0aF0uLi5dXVxuIgorICAgIlxuIgorICAgImx2ZGlzcGxheSAtLWNvbHVtbnN8LUNcbiIKKyAgICJcdFstLWFsaWduZWRdXG4iCisgICAiXHRbLWF8LS1hbGxdXG4iCisgICAiXHRbLS1iaW5hcnldXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstLWNvbmZpZ3JlcG9ydCBSZXBvcnROYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1mb3JlaWduXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstSHwtLWhpc3RvcnldXG4iCisgICAiXHRbLS1pZ25vcmVsb2NraW5nZmFpbHVyZV1cbiIKKyAgICJcdFstLWlnbm9yZXNraXBwZWRjbHVzdGVyXVxuIgorICAgIlx0Wy0tbG9nb25seV1cbiIKKyAgICJcdFstLW5vaGVhZGluZ3NdXG4iCisgICAiXHRbLS1ub3N1ZmZpeF1cbiIKKyAgICJcdFstb3wtLW9wdGlvbnMgWyt8LXwjXUZpZWxkWyxGaWVsZF1dXG4iCisgICAiXHRbLU98LS1zb3J0IFsrfC1da2V5MVssWyt8LV1rZXkyWywuLi5dXV1cbiIKKyAgICJcdFstU3wtLXNlbGVjdCBTZWxlY3Rpb25dXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy0tc2VnbWVudHNdXG4iCisgICAiXHRbLS1zZXBhcmF0b3IgU2VwYXJhdG9yXVxuIgorICAgIlx0Wy0tdW5idWZmZXJlZF1cbiIKKyAgICJcdFstLXVuaXRzIGhIYkJzU2tLbU1nR3RUcFBlRV1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0W0xvZ2ljYWxWb2x1bWVbUGF0aF0gW0xvZ2ljYWxWb2x1bWVbUGF0aF0uLi5dXVxuIiwKKworICAgIGFsaWduZWRfQVJHLCBhbGxfQVJHLCBiaW5hcnlfQVJHLCBjb2xvbl9BUkcsIGNvbHVtbnNfQVJHLAorICAgIGNvbmZpZ3JlcG9ydF9BUkcsIGZvcmVpZ25fQVJHLCBoaXN0b3J5X0FSRywgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLAorICAgIGlnbm9yZXNraXBwZWRjbHVzdGVyX0FSRywgbG9nb25seV9BUkcsIG1hcHNfQVJHLCBub2hlYWRpbmdzX0FSRywKKyAgICBub3N1ZmZpeF9BUkcsIG9wdGlvbnNfQVJHLCBzb3J0X0FSRywgcGFydGlhbF9BUkcsIHJlYWRvbmx5X0FSRywKKyAgICByZXBvcnRmb3JtYXRfQVJHLCBzZWdtZW50c19BUkcsIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsCisgICAgc2hhcmVkX0FSRywgdW5idWZmZXJlZF9BUkcsIHVuaXRzX0FSRykKKworeHgobHZleHRlbmQsCisgICAiQWRkIHNwYWNlIHRvIGEgbG9naWNhbCB2b2x1bWUiLAorICAgMCwKKyAgICJsdmV4dGVuZFxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB5fG5dXG4iCisgICAiXHRbLS1hbGxvYyBBbGxvY2F0aW9uUG9saWN5XVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstaXwtLXN0cmlwZXMgU3RyaXBlcyBbLUl8LS1zdHJpcGVzaXplIFN0cmlwZVNpemVdXVxuIgorICAgIlx0ey1sfC0tZXh0ZW50cyBbK11Mb2dpY2FsRXh0ZW50c051bWJlclsle1ZHfExWfFBWU3xGUkVFfE9SSUdJTn1dIHxcbiIKKyAgICJcdCAtTHwtLXNpemUgWytdTG9naWNhbFZvbHVtZVNpemVbYkJzU2tLbU1nR3RUcFBlRV19XG4iCisgICAiXHQgLS1wb29sbWV0YWRhdGFzaXplIFsrXU1ldGFkYXRhVm9sdW1lU2l6ZVtiQnNTa0ttTWdHXX1cbiIKKyAgICJcdFstbXwtLW1pcnJvcnMgTWlycm9yc11cbiIKKyAgICJcdFstLW5vc3luY11cbiIKKyAgICJcdFstLXVzZS1wb2xpY2llc11cbiIKKyAgICJcdFstbnwtLW5vZnNja11cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1yfC0tcmVzaXplZnNdXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0Wy0tdHlwZSBWb2x1bWVUeXBlXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRMb2dpY2FsVm9sdW1lW1BhdGhdIFsgUGh5c2ljYWxWb2x1bWVQYXRoLi4uIF1cbiIsCisKKyAgIGFsbG9jX0FSRywgYXV0b2JhY2t1cF9BUkcsIGV4dGVudHNfQVJHLCBmb3JjZV9BUkcsIG1pcnJvcnNfQVJHLAorICAgbm9mc2NrX0FSRywgbm9zeW5jX0FSRywgbm91ZGV2c3luY19BUkcsIHBvb2xtZXRhZGF0YXNpemVfQVJHLAorICAgcmVwb3J0Zm9ybWF0X0FSRywgcmVzaXplZnNfQVJHLCBzaXplX0FSRywgc3RyaXBlc19BUkcsIHN0cmlwZXNpemVfQVJHLAorICAgdGVzdF9BUkcsIHR5cGVfQVJHLCB1c2Vwb2xpY2llc19BUkcpCisKK3h4KGx2bWNoYW5nZSwKKyAgICJXaXRoIHRoZSBkZXZpY2UgbWFwcGVyLCB0aGlzIGlzIG9ic29sZXRlIGFuZCBkb2VzIG5vdGhpbmcuIiwKKyAgIDAsCisgICAibHZtY2hhbmdlXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstUnwtLXJlc2V0XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iLAorCisgICAgcmVzZXRfQVJHKQorCit4eChsdm1jb25maWcsCisgICAiRGlzcGxheSBhbmQgbWFuaXB1bGF0ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBOT19NRVRBREFUQV9QUk9DRVNTSU5HLAorICAgImx2bWNvbmZpZ1xuIgorICAgIlx0Wy1mfC0tZmlsZSBmaWxlbmFtZV1cbiIKKyAgICJcdFstLXR5cGUge2N1cnJlbnR8ZGVmYXVsdHxkaWZmfGZ1bGx8bGlzdHxtaXNzaW5nfG5ld3xwcm9maWxhYmxlfHByb2ZpbGFibGUtY29tbWFuZHxwcm9maWxhYmxlLW1ldGFkYXRhfV1cbiIKKyAgICJcdFstLWF0dmVyc2lvbiB2ZXJzaW9uXVxuIgorICAgIlx0Wy0taWdub3JlYWR2YW5jZWRdXG4iCisgICAiXHRbLS1pZ25vcmV1bnN1cHBvcnRlZF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2FsXVxuIgorICAgIlx0Wy1sfC0tbGlzdF1cbiIKKyAgICJcdFstLWNvbmZpZyBDb25maWd1cmF0aW9uU3RyaW5nXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLS1wcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tbWV0YWRhdGFwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tbWVyZ2VkY29uZmlnXVxuIgorICAgIlx0Wy0tc2luY2V2ZXJzaW9uIHZlcnNpb25dXG4iCisgICAiXHRbLS1zaG93ZGVwcmVjYXRlZF1cbiIKKyAgICJcdFstLXNob3d1bnN1cHBvcnRlZF1cbiIKKyAgICJcdFstLXZhbGlkYXRlXVxuIgorICAgIlx0Wy0td2l0aHN1bW1hcnldXG4iCisgICAiXHRbLS13aXRoY29tbWVudHNdXG4iCisgICAiXHRbLS13aXRoc3BhY2VzXVxuIgorICAgIlx0Wy0tdW5jb25maWd1cmVkXVxuIgorICAgIlx0Wy0td2l0aHZlcnNpb25zXVxuIgorICAgIlx0W0NvbmZpZ3VyYXRpb25Ob2RlLi4uXVxuIiwKKyAgIGF0dmVyc2lvbl9BUkcsIGNvbmZpZ3R5cGVfQVJHLCBmaWxlX0FSRywgaWdub3JlYWR2YW5jZWRfQVJHLAorICAgaWdub3JldW5zdXBwb3J0ZWRfQVJHLCBpZ25vcmVsb2NhbF9BUkcsIGxpc3RfQVJHLCBtZXJnZWRjb25maWdfQVJHLCBtZXRhZGF0YXByb2ZpbGVfQVJHLAorICAgc2luY2V2ZXJzaW9uX0FSRywgc2hvd2RlcHJlY2F0ZWRfQVJHLCBzaG93dW5zdXBwb3J0ZWRfQVJHLCB2YWxpZGF0ZV9BUkcsIHdpdGhzdW1tYXJ5X0FSRywKKyAgIHdpdGhjb21tZW50c19BUkcsIHdpdGhzcGFjZXNfQVJHLCB1bmNvbmZpZ3VyZWRfQVJHLCB3aXRodmVyc2lvbnNfQVJHKQorCit4eChsdm1kaXNrc2NhbiwKKyAgICJMaXN0IGRldmljZXMgdGhhdCBtYXkgYmUgdXNlZCBhcyBwaHlzaWNhbCB2b2x1bWVzIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBFTkFCTEVfQUxMX0RFVlMsCisgICAibHZtZGlza3NjYW5cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1sfC0tbHZtcGFydGl0aW9uXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIiwKKworICAgbHZtcGFydGl0aW9uX0FSRywgcmVhZG9ubHlfQVJHKQorCit4eChsdm1zYWRjLAorICAgIkNvbGxlY3QgYWN0aXZpdHkgZGF0YSIsCisgICAwLAorICAgImx2bXNhZGNcbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbTG9nRmlsZVBhdGhdXG4iKQorCit4eChsdm1zYXIsCisgICAiQ3JlYXRlIGFjdGl2aXR5IHJlcG9ydCIsCisgICAwLAorICAgImx2bXNhclxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZ1bGxdXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1zfC0tc3RkaW5dXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdExvZ0ZpbGVQYXRoXG4iLAorCisgICBmdWxsX0FSRywgc3RkaW5fQVJHKQorCit4eChsdnJlZHVjZSwKKyAgICJSZWR1Y2UgdGhlIHNpemUgb2YgYSBsb2dpY2FsIHZvbHVtZSIsCisgICAwLAorICAgImx2cmVkdWNlXG4iCisgICAiXHRbLUF8LS1hdXRvYmFja3VwIHl8bl1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWZ8LS1mb3JjZV1cbiIKKyAgICJcdFstaHwtLWhlbHBdXG4iCisgICAiXHR7LWx8LS1leHRlbnRzIFstXUxvZ2ljYWxFeHRlbnRzTnVtYmVyWyV7Vkd8TFZ8RlJFRXxPUklHSU59XSB8XG4iCisgICAiXHQgLUx8LS1zaXplIFstXUxvZ2ljYWxWb2x1bWVTaXplW2JCc1NrS21NZ0d0VHBQZUVdfVxuIgorICAgIlx0Wy1ufC0tbm9mc2NrXVxuIgorICAgIlx0Wy0tbm91ZGV2c3luY11cbiIKKyAgICJcdFstcnwtLXJlc2l6ZWZzXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFsteXwtLXllc11cbiIKKyAgICJcdExvZ2ljYWxWb2x1bWVbUGF0aF1cbiIsCisKKyAgIGF1dG9iYWNrdXBfQVJHLCBmb3JjZV9BUkcsICBleHRlbnRzX0FSRywgbm9mc2NrX0FSRywgbm91ZGV2c3luY19BUkcsCisgICByZXBvcnRmb3JtYXRfQVJHLCByZXNpemVmc19BUkcsIHNpemVfQVJHLCB0ZXN0X0FSRykKKworeHgobHZyZW1vdmUsCisgICAiUmVtb3ZlIGxvZ2ljYWwgdm9sdW1lKHMpIGZyb20gdGhlIHN5c3RlbSIsCisgICBBTExfVkdTX0lTX0RFRkFVTFQsIC8qIGFsbCBWR3Mgb25seSB3aXRoIC0tc2VsZWN0ICovCisgICAibHZyZW1vdmVcbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAgeXxuXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLW5vaGlzdG9yeV1cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdExvZ2ljYWxWb2x1bWVbUGF0aF0gW0xvZ2ljYWxWb2x1bWVbUGF0aF0uLi5dXG4iLAorCisgICBhdXRvYmFja3VwX0FSRywgZm9yY2VfQVJHLCBub2hpc3RvcnlfQVJHLCBub3VkZXZzeW5jX0FSRywKKyAgIHJlcG9ydGZvcm1hdF9BUkcsIHNlbGVjdF9BUkcsIHRlc3RfQVJHKQorCit4eChsdnJlbmFtZSwKKyAgICJSZW5hbWUgYSBsb2dpY2FsIHZvbHVtZSIsCisgICAwLAorICAgImx2cmVuYW1lXG4iCisgICAiXHRbLUF8LS1hdXRvYmFja3VwIHt5fG59XVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1ub3VkZXZzeW5jXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdHsgT2xkTG9naWNhbFZvbHVtZVBhdGggTmV3TG9naWNhbFZvbHVtZVBhdGggfFxuIgorICAgIlx0ICBWb2x1bWVHcm91cE5hbWUgT2xkTG9naWNhbFZvbHVtZU5hbWUgTmV3TG9naWNhbFZvbHVtZU5hbWUgfVxuIiwKKworICAgYXV0b2JhY2t1cF9BUkcsIG5vdWRldnN5bmNfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCB0ZXN0X0FSRykKKworeHgobHZyZXNpemUsCisgICAiUmVzaXplIGEgbG9naWNhbCB2b2x1bWUiLAorICAgMCwKKyAgICJsdnJlc2l6ZVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB5fG5dXG4iCisgICAiXHRbLS1hbGxvYyBBbGxvY2F0aW9uUG9saWN5XVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstaXwtLXN0cmlwZXMgU3RyaXBlcyBbLUl8LS1zdHJpcGVzaXplIFN0cmlwZVNpemVdXVxuIgorICAgIlx0ey1sfC0tZXh0ZW50cyBbK3wtXUxvZ2ljYWxFeHRlbnRzTnVtYmVyWyV7Vkd8TFZ8UFZTfEZSRUV8T1JJR0lOfV0gfFxuIgorICAgIlx0IC1MfC0tc2l6ZSBbK3wtXUxvZ2ljYWxWb2x1bWVTaXplW2JCc1NrS21NZ0d0VHBQZUVdfVxuIgorICAgIlx0IC0tcG9vbG1ldGFkYXRhc2l6ZSBbK11NZXRhZGF0YVZvbHVtZVNpemVbYkJzU2tLbU1nR119XG4iCisgICAiXHRbLW58LS1ub2ZzY2tdXG4iCisgICAiXHRbLS1ub3VkZXZzeW5jXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstcnwtLXJlc2l6ZWZzXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstLXR5cGUgVm9sdW1lVHlwZV1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0TG9naWNhbFZvbHVtZVtQYXRoXSBbIFBoeXNpY2FsVm9sdW1lUGF0aC4uLiBdXG4iLAorCisgICBhbGxvY19BUkcsIGF1dG9iYWNrdXBfQVJHLCBleHRlbnRzX0FSRywgZm9yY2VfQVJHLCBub2ZzY2tfQVJHLAorICAgbm91ZGV2c3luY19BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHJlc2l6ZWZzX0FSRywKKyAgIHBvb2xtZXRhZGF0YXNpemVfQVJHLCBzaXplX0FSRywgc3RyaXBlc19BUkcsIHN0cmlwZXNpemVfQVJHLAorICAgdGVzdF9BUkcsIHR5cGVfQVJHKQorCit4eChsdnMsCisgICAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBsb2dpY2FsIHZvbHVtZXMiLAorICAgUEVSTUlUVEVEX1JFQURfT05MWSB8IEFMTF9WR1NfSVNfREVGQVVMVCB8IExPQ0tEX1ZHX1NILAorICAgImx2c1xuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy0tYWxpZ25lZF1cbiIKKyAgICJcdFstLWJpbmFyeV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tY29uZmlncmVwb3J0IFJlcG9ydE5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1IfC0taGlzdG9yeV1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLS1sb2dvbmx5XVxuIgorICAgIlx0Wy0tbmFtZXByZWZpeGVzXVxuIgorICAgIlx0Wy0tbm9oZWFkaW5nc11cbiIKKyAgICJcdFstLW5vc3VmZml4XVxuIgorICAgIlx0Wy1vfC0tb3B0aW9ucyBbK3wtfCNdRmllbGRbLEZpZWxkXV1cbiIKKyAgICJcdFstT3wtLXNvcnQgWyt8LV1rZXkxWyxbK3wtXWtleTJbLC4uLl1dXVxuIgorICAgIlx0Wy1QfC0tcGFydGlhbF1cbiIKKyAgICJcdFstLXJlYWRvbmx5XVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstLXJvd3NdXG4iCisgICAiXHRbLS1zZWdtZW50c11cbiIKKyAgICJcdFstU3wtLXNlbGVjdCBTZWxlY3Rpb25dXG4iCisgICAiXHRbLS1zZXBhcmF0b3IgU2VwYXJhdG9yXVxuIgorICAgIlx0Wy0tdHJ1c3RjYWNoZV1cbiIKKyAgICJcdFstLXVuYnVmZmVyZWRdXG4iCisgICAiXHRbLS11bml0cyBoSGJCc1NrS21NZ0d0VHBQZUVdXG4iCisgICAiXHRbLS11bnF1b3RlZF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0W0xvZ2ljYWxWb2x1bWVbUGF0aF0gW0xvZ2ljYWxWb2x1bWVbUGF0aF0uLi5dXVxuIiwKKworICAgYWxpZ25lZF9BUkcsIGFsbF9BUkcsIGJpbmFyeV9BUkcsIGNvbmZpZ3JlcG9ydF9BUkcsIGZvcmVpZ25fQVJHLCBoaXN0b3J5X0FSRywKKyAgIGlnbm9yZWxvY2tpbmdmYWlsdXJlX0FSRywgaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCBsb2dvbmx5X0FSRywKKyAgIG5hbWVwcmVmaXhlc19BUkcsIG5vaGVhZGluZ3NfQVJHLCBub2xvY2tpbmdfQVJHLCBub3N1ZmZpeF9BUkcsCisgICBvcHRpb25zX0FSRywgcGFydGlhbF9BUkcsIHJlYWRvbmx5X0FSRywgcmVwb3J0Zm9ybWF0X0FSRywgcm93c19BUkcsCisgICBzZWdtZW50c19BUkcsIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsIHNoYXJlZF9BUkcsIHNvcnRfQVJHLAorICAgdHJ1c3RjYWNoZV9BUkcsIHVuYnVmZmVyZWRfQVJHLCB1bml0c19BUkcsIHVucXVvdGVkX0FSRykKKworeHgobHZzY2FuLAorICAgIkxpc3QgYWxsIGxvZ2ljYWwgdm9sdW1lcyBpbiBhbGwgdm9sdW1lIGdyb3VwcyIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgQUxMX1ZHU19JU19ERUZBVUxUIHwgTE9DS0RfVkdfU0ggfCBOT19MVk1FVEFEX0FVVE9TQ0FOLAorICAgImx2c2NhblxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy1ifC0tYmxvY2tkZXZpY2VdXG4iCisgICAiXHRbLS1jYWNoZV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LT98LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iLAorCisgICBhbGxfQVJHLCBibG9ja2RldmljZV9BUkcsIGlnbm9yZWxvY2tpbmdmYWlsdXJlX0FSRywgcGFydGlhbF9BUkcsCisgICByZWFkb25seV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIGNhY2hlX2xvbmdfQVJHKQorCit4eChwdmNoYW5nZSwKKyAgICJDaGFuZ2UgYXR0cmlidXRlcyBvZiBwaHlzaWNhbCB2b2x1bWUocykiLAorICAgMCwKKyAgICJwdmNoYW5nZVxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB5fG5dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1mfC0tZm9yY2VdXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLS1tZXRhZGF0YWlnbm9yZSB5fG5dXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXV8LS11dWlkXVxuIgorICAgIlx0Wy14fC0tYWxsb2NhdGFibGUgeXxuXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLWFkZHRhZyBUYWddXG4iCisgICAiXHRbLS1kZWx0YWcgVGFnXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtQaHlzaWNhbFZvbHVtZVBhdGguLi5dXG4iLAorCisgICBhbGxfQVJHLCBhbGxvY2F0YWJsZV9BUkcsIGFsbG9jYXRpb25fQVJHLCBhdXRvYmFja3VwX0FSRywgZGVsdGFnX0FSRywKKyAgIGFkZHRhZ19BUkcsIGZvcmNlX0FSRywgaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCBtZXRhZGF0YWlnbm9yZV9BUkcsCisgICByZXBvcnRmb3JtYXRfQVJHLCBzZWxlY3RfQVJHLCB0ZXN0X0FSRywgdXVpZF9BUkcpCisKK3h4KHB2cmVzaXplLAorICAgIlJlc2l6ZSBwaHlzaWNhbCB2b2x1bWUocykiLAorICAgMCwKKyAgICJwdnJlc2l6ZVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIFBoeXNpY2FsVm9sdW1lU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0UGh5c2ljYWxWb2x1bWUgW1BoeXNpY2FsVm9sdW1lLi4uXVxuIiwKKworICAgcGh5c2ljYWx2b2x1bWVzaXplX0FSRywgcmVwb3J0Zm9ybWF0X0FSRywgdGVzdF9BUkcpCisKK3h4KHB2Y2ssCisgICAiQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHBoeXNpY2FsIHZvbHVtZShzKSIsCisgICBMT0NLRF9WR19TSCwKKyAgICJwdmNrICIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0tbGFiZWxzZWN0b3Igc2VjdG9yXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRQaHlzaWNhbFZvbHVtZSBbUGh5c2ljYWxWb2x1bWUuLi5dXG4iLAorCisgICBsYWJlbHNlY3Rvcl9BUkcpCisKK3h4KHB2Y3JlYXRlLAorICAgIkluaXRpYWxpemUgcGh5c2ljYWwgdm9sdW1lKHMpIGZvciB1c2UgYnkgTFZNIiwKKyAgIEVOQUJMRV9BTExfREVWUywKKyAgICJwdmNyZWF0ZVxuIgorICAgIlx0Wy0tbm9yZXN0b3JlZmlsZV1cbiIKKyAgICJcdFstLXJlc3RvcmVmaWxlIGZpbGVdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZltmXXwtLWZvcmNlIFstLWZvcmNlXV1cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1sYWJlbHNlY3RvciBzZWN0b3JdXG4iCisgICAiXHRbLU18LS1tZXRhZGF0YXR5cGUgMXwyXVxuIgorICAgIlx0Wy0tcHZtZXRhZGF0YWNvcGllcyAjY29waWVzXVxuIgorICAgIlx0Wy0tYm9vdGxvYWRlcmFyZWFzaXplIEJvb3RMb2FkZXJBcmVhU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXV1cbiIKKyAgICJcdFstLW1ldGFkYXRhc2l6ZSBNZXRhZGF0YVNpemVbYkJzU2tLbU1nR3RUcFBlRV1dXG4iCisgICAiXHRbLS1kYXRhYWxpZ25tZW50IEFsaWdubWVudFtiQnNTa0ttTWdHdFRwUGVFXV1cbiIKKyAgICJcdFstLWRhdGFhbGlnbm1lbnRvZmZzZXQgQWxpZ25tZW50T2Zmc2V0W2JCc1NrS21NZ0d0VHBQZUVdXVxuIgorICAgIlx0Wy0tc2V0cGh5c2ljYWx2b2x1bWVzaXplIFBoeXNpY2FsVm9sdW1lU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdXwtLXV1aWQgdXVpZF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLXl8LS15ZXNdXG4iCisgICAiXHRbLVp8LS16ZXJvIHt5fG59XVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFBoeXNpY2FsVm9sdW1lIFtQaHlzaWNhbFZvbHVtZS4uLl1cbiIsCisKKyAgIGRhdGFhbGlnbm1lbnRfQVJHLCBkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRywgYm9vdGxvYWRlcmFyZWFzaXplX0FSRywKKyAgIGZvcmNlX0FSRywgdGVzdF9BUkcsIGxhYmVsc2VjdG9yX0FSRywgbWV0YWRhdGF0eXBlX0FSRywKKyAgIG1ldGFkYXRhY29waWVzX0FSRywgbWV0YWRhdGFzaXplX0FSRywgbWV0YWRhdGFpZ25vcmVfQVJHLAorICAgbm9yZXN0b3JlZmlsZV9BUkcsIHBoeXNpY2Fsdm9sdW1lc2l6ZV9BUkcsIHB2bWV0YWRhdGFjb3BpZXNfQVJHLAorICAgcmVwb3J0Zm9ybWF0X0FSRywgcmVzdG9yZWZpbGVfQVJHLCB1dWlkc3RyX0FSRywgemVyb19BUkcpCisKK3h4KHB2ZGF0YSwKKyAgICJEaXNwbGF5IHRoZSBvbi1kaXNrIG1ldGFkYXRhIGZvciBwaHlzaWNhbCB2b2x1bWUocykiLAorICAgMCwKKyAgICJwdmRhdGFcbiIKKyAgICJcdFstYXwtLWFsbF1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLUV8LS1waHlzaWNhbGV4dGVudF1cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLUx8LS1sb2dpY2Fsdm9sdW1lXVxuIgorICAgIlx0Wy1QW1BdfC0tcGh5c2ljYWx2b2x1bWUgWy0tcGh5c2ljYWx2b2x1bWVdXVxuIgorICAgIlx0Wy1VfC0tdXVpZGxpc3RdXG4iCisgICAiXHRbLXZbdl18LS12ZXJib3NlIFstLXZlcmJvc2VdXVxuIgorICAgIlx0Wy1WfC0tdm9sdW1lZ3JvdXBdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0UGh5c2ljYWxWb2x1bWUgW1BoeXNpY2FsVm9sdW1lLi4uXVxuIiwKKworICAgYWxsX0FSRywgIGxvZ2ljYWxleHRlbnRfQVJHLCBwaHlzaWNhbGV4dGVudF9BUkcsCisgICBwaHlzaWNhbHZvbHVtZV9BUkcsIHV1aWRsaXN0X0FSRywgdm9sdW1lZ3JvdXBfQVJHKQorCit4eChwdmRpc3BsYXksCisgICAiRGlzcGxheSB2YXJpb3VzIGF0dHJpYnV0ZXMgb2YgcGh5c2ljYWwgdm9sdW1lKHMpIiwKKyAgIENBQ0hFX1ZHTUVUQURBVEEgfCBQRVJNSVRURURfUkVBRF9PTkxZIHwgRU5BQkxFX0FMTF9ERVZTIHwgRU5BQkxFX0RVUExJQ0FURV9ERVZTIHwgTE9DS0RfVkdfU0gsCisgICAicHZkaXNwbGF5XG4iCisgICAiXHRbLWN8LS1jb2xvbl1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1mb3JlaWduXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLW18LS1tYXBzXVxuIgorICAgIlx0Wy0tbm9zdWZmaXhdXG4iCisgICAiXHRbLS1yZWFkb25seV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy1zfC0tc2hvcnRdXG4iCisgICAiXHRbLS11bml0cyBoSGJCc1NrS21NZ0d0VHBQZUVdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtQaHlzaWNhbFZvbHVtZVBhdGggW1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1dXG4iCisgICAiXG4iCisgICAicHZkaXNwbGF5IC0tY29sdW1uc3wtQ1xuIgorICAgIlx0Wy0tYWxpZ25lZF1cbiIKKyAgICJcdFstYXwtLWFsbF1cbiIKKyAgICJcdFstLWJpbmFyeV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tY29uZmlncmVwb3J0IFJlcG9ydE5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLS1pZ25vcmVza2lwcGVkY2x1c3Rlcl1cbiIKKyAgICJcdFstLWxvZ29ubHldXG4iCisgICAiXHRbLS1ub2hlYWRpbmdzXVxuIgorICAgIlx0Wy0tbm9zdWZmaXhdXG4iCisgICAiXHRbLW98LS1vcHRpb25zIFsrfC18I11GaWVsZFssRmllbGRdXVxuIgorICAgIlx0Wy1PfC0tc29ydCBbK3wtXWtleTFbLFsrfC1da2V5MlssLi4uXV1dXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstLXJlYWRvbmx5XVxuIgorICAgIlx0Wy0tc2VwYXJhdG9yIFNlcGFyYXRvcl1cbiIKKyAgICJcdFstLXVuYnVmZmVyZWRdXG4iCisgICAiXHRbLS11bml0cyBoSGJCc1NrS21NZ0d0VHBQZUVdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtQaHlzaWNhbFZvbHVtZVBhdGggW1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1dXG4iLAorCisgICBhbGlnbmVkX0FSRywgYWxsX0FSRywgYmluYXJ5X0FSRywgY29sb25fQVJHLCBjb2x1bW5zX0FSRywgY29uZmlncmVwb3J0X0FSRywKKyAgIGZvcmVpZ25fQVJHLCBpZ25vcmVsb2NraW5nZmFpbHVyZV9BUkcsIGlnbm9yZXNraXBwZWRjbHVzdGVyX0FSRywKKyAgIGxvZ29ubHlfQVJHLCBtYXBzX0FSRywgbm9oZWFkaW5nc19BUkcsIG5vc3VmZml4X0FSRywgb3B0aW9uc19BUkcsCisgICByZWFkb25seV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsIHNoYXJlZF9BUkcsCisgICBzaG9ydF9BUkcsIHNvcnRfQVJHLCB1bmJ1ZmZlcmVkX0FSRywgdW5pdHNfQVJHKQorCisvKiBBTExfVkdTX0lTX0RFRkFVTFQgaXMgZm9yIHBvbGxkYWVtb24gdG8gZmluZCBwdm1vdmVzIGluLXByb2dyZXNzIHVzaW5nIHByb2Nlc3NfZWFjaF92Zy4gKi8KKworeHgocHZtb3ZlLAorICAgIk1vdmUgZXh0ZW50cyBmcm9tIG9uZSBwaHlzaWNhbCB2b2x1bWUgdG8gYW5vdGhlciIsCisgICBBTExfVkdTX0lTX0RFRkFVTFQgfCBESVNBTExPV19UQUdfQVJHUywKKyAgICJwdm1vdmVcbiIKKyAgICJcdFstLWFib3J0XVxuIgorICAgIlx0Wy0tYWxsb2MgQWxsb2NhdGlvblBvbGljeV1cbiIKKyAgICJcdFstLWF0b21pY11cbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAge3l8bn1dXG4iCisgICAiXHRbLWJ8LS1iYWNrZ3JvdW5kXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiAiCisgICAiXHRbLWh8LT98LS1oZWxwXVxuIgorICAgIlx0Wy1pfC0taW50ZXJ2YWwgc2Vjb25kc11cbiIKKyAgICJcdFstLW5vdWRldnN5bmNdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiAiCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuICIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbey1ufC0tbmFtZX0gTG9naWNhbFZvbHVtZV1cbiIKKy8qICJcdFt7LW58LS1uYW1lfSBMb2dpY2FsVm9sdW1lWzpMb2dpY2FsRXh0ZW50Wy1Mb2dpY2FsRXh0ZW50XS4uLl1dXG4iICovCisgICAiXHRTb3VyY2VQaHlzaWNhbFZvbHVtZVs6UGh5c2ljYWxFeHRlbnRbLVBoeXNpY2FsRXh0ZW50XS4uLl19XG4iCisgICAiXHRbRGVzdGluYXRpb25QaHlzaWNhbFZvbHVtZVs6UGh5c2ljYWxFeHRlbnRbLVBoeXNpY2FsRXh0ZW50XS4uLl0uLi5dXG4iLAorCisgICBhYm9ydF9BUkcsIGFsbG9jX0FSRywgYXRvbWljX0FSRywgYXV0b2JhY2t1cF9BUkcsIGJhY2tncm91bmRfQVJHLAorICAgaW50ZXJ2YWxfQVJHLCBuYW1lX0FSRywgbm91ZGV2c3luY19BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHRlc3RfQVJHKQorCit4eChsdnBvbGwsCisgICAiQ29udGludWUgYWxyZWFkeSBpbml0aWF0ZWQgcG9sbCBvcGVyYXRpb24gb24gYSBsb2dpY2FsIHZvbHVtZSIsCisgICAwLAorICAgIlx0Wy0tYWJvcnRdXG4iCisgICAiXHRbLUF8LS1hdXRvYmFja3VwIHt5fG59XVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiAiCisgICAiXHRbLWh8LT98LS1oZWxwXVxuIgorICAgIlx0Wy0taGFuZGxlbWlzc2luZ3B2c11cbiIKKyAgICJcdFstaXwtLWludGVydmFsIHNlY29uZHNdXG4iCisgICAiXHRbLS1wb2xsb3BlcmF0aW9uXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiAiCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuICIKKyAgICJcdFstLXZlcnNpb25dXG4iLAorCisgICBhYm9ydF9BUkcsIGF1dG9iYWNrdXBfQVJHLCBoYW5kbGVtaXNzaW5ncHZzX0FSRywgaW50ZXJ2YWxfQVJHLCBwb2xsb3BlcmF0aW9uX0FSRywKKyAgIHRlc3RfQVJHKQorCit4eChwdnJlbW92ZSwKKyAgICJSZW1vdmUgTFZNIGxhYmVsKHMpIGZyb20gcGh5c2ljYWwgdm9sdW1lKHMpIiwKKyAgIEVOQUJMRV9BTExfREVWUywKKyAgICJwdnJlbW92ZVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZltmXXwtLWZvcmNlIFstLWZvcmNlXV1cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0Wy15fC0teWVzXVxuIgorICAgIlx0UGh5c2ljYWxWb2x1bWUgW1BoeXNpY2FsVm9sdW1lLi4uXVxuIiwKKworICAgZm9yY2VfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCB0ZXN0X0FSRykKKworeHgocHZzLAorICAgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGh5c2ljYWwgdm9sdW1lcyIsCisgICBDQUNIRV9WR01FVEFEQVRBIHwgUEVSTUlUVEVEX1JFQURfT05MWSB8IEFMTF9WR1NfSVNfREVGQVVMVCB8IEVOQUJMRV9BTExfREVWUyB8IEVOQUJMRV9EVVBMSUNBVEVfREVWUyB8IExPQ0tEX1ZHX1NILAorICAgInB2c1xuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy0tYWxpZ25lZF1cbiIKKyAgICJcdFstLWJpbmFyeV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tY29uZmlncmVwb3J0IFJlcG9ydE5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LT98LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLS1pZ25vcmVza2lwcGVkY2x1c3Rlcl1cbiIKKyAgICJcdFstLWxvZ29ubHldXG4iCisgICAiXHRbLS1uYW1lcHJlZml4ZXNdXG4iCisgICAiXHRbLS1ub2hlYWRpbmdzXVxuIgorICAgIlx0Wy0tbm9zdWZmaXhdXG4iCisgICAiXHRbLW98LS1vcHRpb25zIFsrfC18I11GaWVsZFssRmllbGRdXVxuIgorICAgIlx0Wy1PfC0tc29ydCBbK3wtXWtleTFbLFsrfC1da2V5MlssLi4uXV1dXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy0tcm93c11cbiIKKyAgICJcdFstLXNlZ21lbnRzXVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstLXNlcGFyYXRvciBTZXBhcmF0b3JdXG4iCisgICAiXHRbLS10cnVzdGNhY2hlXVxuIgorICAgIlx0Wy0tdW5idWZmZXJlZF1cbiIKKyAgICJcdFstLXVuaXRzIGhIYkJzU2tLbU1nR3RUcFBlRV1cbiIKKyAgICJcdFstLXVucXVvdGVkXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbUGh5c2ljYWxWb2x1bWUgW1BoeXNpY2FsVm9sdW1lLi4uXV1cbiIsCisKKyAgIGFsaWduZWRfQVJHLCBhbGxfQVJHLCBiaW5hcnlfQVJHLCBjb25maWdyZXBvcnRfQVJHLCBmb3JlaWduX0FSRywKKyAgIGlnbm9yZWxvY2tpbmdmYWlsdXJlX0FSRywgaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCBsb2dvbmx5X0FSRywKKyAgIG5hbWVwcmVmaXhlc19BUkcsIG5vaGVhZGluZ3NfQVJHLCBub2xvY2tpbmdfQVJHLCBub3N1ZmZpeF9BUkcsCisgICBvcHRpb25zX0FSRywgcGFydGlhbF9BUkcsIHJlYWRvbmx5X0FSRywgcmVwb3J0Zm9ybWF0X0FSRywgcm93c19BUkcsCisgICBzZWdtZW50c19BUkcsIHNlbGVjdF9BUkcsIHNlcGFyYXRvcl9BUkcsIHNoYXJlZF9BUkcsIHNvcnRfQVJHLAorICAgdHJ1c3RjYWNoZV9BUkcsIHVuYnVmZmVyZWRfQVJHLCB1bml0c19BUkcsIHVucXVvdGVkX0FSRykKKworeHgocHZzY2FuLAorICAgIkxpc3QgYWxsIHBoeXNpY2FsIHZvbHVtZXMiLAorICAgUEVSTUlUVEVEX1JFQURfT05MWSB8IExPQ0tEX1ZHX1NIIHwgTk9fTFZNRVRBRF9BVVRPU0NBTiwKKyAgICJwdnNjYW5cbiIKKyAgICJcdFstYnwtLWJhY2tncm91bmRdXG4iCisgICAiXHRbLS1jYWNoZSBbLWF8LS1hY3RpdmF0ZSBheV0gWyBEZXZpY2VQYXRoIHwgLWp8LS1tYWpvciBtYWpvciAtLW1pbm9yIG1pbm9yXS4uLl1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHR7LWV8LS1leHBvcnRlZCB8IC1ufC0tbm92b2x1bWVncm91cH1cbiIKKyAgICJcdFstaHwtP3wtLWhlbHBdXG4iCisgICAiXHRbLS1pZ25vcmVsb2NraW5nZmFpbHVyZV1cbiIKKyAgICJcdFstUHwtLXBhcnRpYWxdXG4iCisgICAiXHRbLS1yZWFkb25seV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLXN8LS1zaG9ydF1cbiIKKyAgICJcdFstdXwtLXV1aWRdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIsCisKKyAgIGFjdGl2YXRlX0FSRywgYXZhaWxhYmxlX0FSRywgYmFja2dyb3VuZGZvcmtfQVJHLCBjYWNoZV9sb25nX0FSRywKKyAgIGV4cG9ydGVkX0FSRywgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCBtYWpvcl9BUkcsIG1pbm9yX0FSRywKKyAgIG5vdm9sdW1lZ3JvdXBfQVJHLCBwYXJ0aWFsX0FSRywgcmVhZG9ubHlfQVJHLCByZXBvcnRmb3JtYXRfQVJHLAorICAgc2hvcnRfQVJHLCB1dWlkX0FSRykKKworeHgoc2VndHlwZXMsCisgICAiTGlzdCBhdmFpbGFibGUgc2VnbWVudCB0eXBlcyIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJzZWd0eXBlc1xuIikKKworeHgoc3lzdGVtaWQsCisgICAiRGlzcGxheSB0aGUgc3lzdGVtIElELCBpZiBhbnksIGN1cnJlbnRseSBzZXQgb24gdGhpcyBob3N0IiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBOT19NRVRBREFUQV9QUk9DRVNTSU5HLAorICAgInN5c3RlbWlkXG4iKQorCit4eCh0YWdzLAorICAgIkxpc3QgdGFncyBkZWZpbmVkIG9uIHRoaXMgaG9zdCIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgTk9fTUVUQURBVEFfUFJPQ0VTU0lORywKKyAgICJ0YWdzXG4iKQorCit4eCh2Z2NmZ2JhY2t1cCwKKyAgICJCYWNrdXAgdm9sdW1lIGdyb3VwIGNvbmZpZ3VyYXRpb24ocykiLAorICAgUEVSTUlUVEVEX1JFQURfT05MWSB8IEFMTF9WR1NfSVNfREVGQVVMVCB8IExPQ0tEX1ZHX1NILAorICAgInZnY2ZnYmFja3VwXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1mfC0tZmlsZSBmaWxlbmFtZV1cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LT98LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVhZG9ubHldXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbVm9sdW1lR3JvdXBOYW1lLi4uXVxuIiwKKworICAgZmlsZV9BUkcsIGZvcmVpZ25fQVJHLCBpZ25vcmVsb2NraW5nZmFpbHVyZV9BUkcsIHBhcnRpYWxfQVJHLCByZWFkb25seV9BUkcsCisgICByZXBvcnRmb3JtYXRfQVJHKQorCit4eCh2Z2NmZ3Jlc3RvcmUsCisgICAiUmVzdG9yZSB2b2x1bWUgZ3JvdXAgY29uZmlndXJhdGlvbiIsCisgICAwLAorICAgInZnY2ZncmVzdG9yZVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZpbGUgZmlsZW5hbWVdXG4iCisgICAiXHRbLS1mb3JjZV1cbiIKKyAgICJcdFstbFtsXXwtLWxpc3QgWy0tbGlzdF1dXG4iCisgICAiXHRbLU18LS1tZXRhZGF0YXR5cGUgMXwyXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFZvbHVtZUdyb3VwTmFtZSIsCisKKyAgIGZpbGVfQVJHLCBmb3JjZV9sb25nX0FSRywgbGlzdF9BUkcsIG1ldGFkYXRhdHlwZV9BUkcsIHRlc3RfQVJHKQorCit4eCh2Z2NoYW5nZSwKKyAgICJDaGFuZ2Ugdm9sdW1lIGdyb3VwIGF0dHJpYnV0ZXMiLAorICAgQ0FDSEVfVkdNRVRBREFUQSB8IFBFUk1JVFRFRF9SRUFEX09OTFkgfCBBTExfVkdTX0lTX0RFRkFVTFQsCisgICAidmdjaGFuZ2VcbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAge3l8bn1dXG4iCisgICAiXHRbLS1hbGxvYyBBbGxvY2F0aW9uUG9saWN5XVxuIgorICAgIlx0Wy1QfC0tcGFydGlhbF1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1kZXRhY2hwcm9maWxlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3JlbW9uaXRvcmluZ11cbiIKKyAgICJcdFstLWlnbm9yZXNraXBwZWRjbHVzdGVyXVxuIgorICAgIlx0Wy1LfC0taWdub3JlYWN0aXZhdGlvbnNraXBdXG4iCisgICAiXHRbLS1tZXRhZGF0YXByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLS1tb25pdG9yIHt5fG59XVxuIgorICAgIlx0Wy0tW3ZnXW1ldGFkYXRhY29waWVzICNjb3BpZXNdXG4iCisgICAiXHRbLS1wb2xsIHt5fG59XVxuIgorICAgIlx0Wy0tbm91ZGV2c3luY11cbiIKKyAgICJcdFstLXJlZnJlc2hdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstLXN5c2luaXRdXG4iCisgICAiXHRbLS1zeXN0ZW1pZCBTeXN0ZW1JRF1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXV8LS11dWlkXVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHR7LWF8LS1hY3RpdmF0ZSBbYXxlfGxde3l8bn0gIHxcbiIKKyAgICJcdFstLWFjdGl2YXRpb25tb2RlIHtjb21wbGV0ZXxkZWdyYWRlZHxwYXJ0aWFsfV1cbiIKKyAgICJcdCAtY3wtLWNsdXN0ZXJlZCB7eXxufSB8XG4iCisgICAiXHQgLXh8LS1yZXNpemVhYmxlIHt5fG59IHxcbiIKKyAgICJcdCAtbHwtLWxvZ2ljYWx2b2x1bWUgTWF4TG9naWNhbFZvbHVtZXMgfFxuIgorICAgIlx0IC1wfC0tbWF4cGh5c2ljYWx2b2x1bWVzIE1heFBoeXNpY2FsVm9sdW1lcyB8XG4iCisgICAiXHQgLXN8LS1waHlzaWNhbGV4dGVudHNpemUgUGh5c2ljYWxFeHRlbnRTaXplW2JCc1NrS21NZ0d0VHBQZUVdIHxcbiIKKyAgICJcdCAtLWFkZHRhZyBUYWcgfFxuIgorICAgIlx0IC0tZGVsdGFnIFRhZ31cbiIKKyAgICJcdFtWb2x1bWVHcm91cE5hbWUuLi5dXG4iLAorCisgICBhY3RpdmF0aW9ubW9kZV9BUkcsIGFkZHRhZ19BUkcsIGFsbG9jX0FSRywgYWxsb2NhdGlvbl9BUkcsIGF1dG9iYWNrdXBfQVJHLAorICAgYWN0aXZhdGVfQVJHLCBhdmFpbGFibGVfQVJHLCBjbHVzdGVyZWRfQVJHLCBkZWx0YWdfQVJHLCBkZXRhY2hwcm9maWxlX0FSRywKKyAgIGlnbm9yZWFjdGl2YXRpb25za2lwX0FSRywgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCBpZ25vcmVtb25pdG9yaW5nX0FSRywKKyAgIGlnbm9yZXNraXBwZWRjbHVzdGVyX0FSRywgbG9naWNhbHZvbHVtZV9BUkcsIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcsCisgICBtZXRhZGF0YXByb2ZpbGVfQVJHLCBtb25pdG9yX0FSRywgbm91ZGV2c3luY19BUkcsIG1ldGFkYXRhY29waWVzX0FSRywKKyAgIHZnbWV0YWRhdGFjb3BpZXNfQVJHLCBwYXJ0aWFsX0FSRywgcGh5c2ljYWxleHRlbnRzaXplX0FSRywgcG9sbF9BUkcsCisgICByZWZyZXNoX0FSRywgcmVwb3J0Zm9ybWF0X0FSRywgcmVzaXplYWJsZV9BUkcsIHJlc2l6YWJsZV9BUkcsIHNlbGVjdF9BUkcsCisgICBzeXNpbml0X0FSRywgc3lzdGVtaWRfQVJHLCB0ZXN0X0FSRywgdXVpZF9BUkcsIGxvY2tzdGFydF9BUkcsIGxvY2tzdG9wX0FSRywKKyAgIGxvY2t0eXBlX0FSRywgbG9ja29wdF9BUkcsIGZvcmNlX0FSRykKKworeHgodmdjaywKKyAgICJDaGVjayB0aGUgY29uc2lzdGVuY3kgb2Ygdm9sdW1lIGdyb3VwKHMpIiwKKyAgIEFMTF9WR1NfSVNfREVGQVVMVCB8IExPQ0tEX1ZHX1NILAorICAgInZnY2sgIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstaHwtLWhlbHBdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbVm9sdW1lR3JvdXBOYW1lLi4uXVxuIiwKKworICAgcmVwb3J0Zm9ybWF0X0FSRykKKworeHgodmdjb252ZXJ0LAorICAgIkNoYW5nZSB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEgZm9ybWF0IiwKKyAgIDAsCisgICAidmdjb252ZXJ0XG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWxhYmVsc2VjdG9yIHNlY3Rvcl1cbiIKKyAgICJcdFstTXwtLW1ldGFkYXRhdHlwZSAxfDJdXG4iCisgICAiXHRbLS1wdm1ldGFkYXRhY29waWVzICNjb3BpZXNdXG4iCisgICAiXHRbLS1tZXRhZGF0YXNpemUgTWV0YWRhdGFTaXplW2JCc1NrS21NZ0d0VHBQZUVdXVxuIgorICAgIlx0Wy0tYm9vdGxvYWRlcmFyZWFzaXplIEJvb3RMb2FkZXJBcmVhU2l6ZVtiQnNTa0ttTWdHdFRwUGVFXV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRWb2x1bWVHcm91cE5hbWUgW1ZvbHVtZUdyb3VwTmFtZS4uLl1cbiIsCisKKyAgIGZvcmNlX0FSRywgdGVzdF9BUkcsIGxhYmVsc2VjdG9yX0FSRywgYm9vdGxvYWRlcmFyZWFzaXplX0FSRywKKyAgIG1ldGFkYXRhdHlwZV9BUkcsIG1ldGFkYXRhY29waWVzX0FSRywgcHZtZXRhZGF0YWNvcGllc19BUkcsCisgICBtZXRhZGF0YXNpemVfQVJHLCByZXBvcnRmb3JtYXRfQVJHKQorCit4eCh2Z2NyZWF0ZSwKKyAgICJDcmVhdGUgYSB2b2x1bWUgZ3JvdXAiLAorICAgTVVTVF9VU0VfQUxMX0FSR1MgfCBFTkFCTEVfQUxMX0RFVlMsCisgICAidmdjcmVhdGVcbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAge3l8bn1dXG4iCisgICAiXHRbLS1hZGR0YWcgVGFnXVxuIgorICAgIlx0Wy0tYWxsb2MgQWxsb2NhdGlvblBvbGljeV1cbiIKKyAgICJcdFstY3wtLWNsdXN0ZXJlZCB7eXxufV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1sfC0tbWF4bG9naWNhbHZvbHVtZXMgTWF4TG9naWNhbFZvbHVtZXNdXG4iCisgICAiXHRbLS1tZXRhZGF0YXByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLU18LS1tZXRhZGF0YXR5cGUgMXwyXVxuIgorICAgIlx0Wy0tW3ZnXW1ldGFkYXRhY29waWVzICNjb3BpZXNdXG4iCisgICAiXHRbLXB8LS1tYXhwaHlzaWNhbHZvbHVtZXMgTWF4UGh5c2ljYWxWb2x1bWVzXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstc3wtLXBoeXNpY2FsZXh0ZW50c2l6ZSBQaHlzaWNhbEV4dGVudFNpemVbYkJzU2tLbU1nR3RUcFBlRV1dXG4iCisgICAiXHRbLS1zeXN0ZW1pZCBTeXN0ZW1JRF1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFsteXwtLXllc11cbiIKKyAgICJcdFsgUEhZU0lDQUwgREVWSUNFIE9QVElPTlMgXVxuIgorICAgIlx0Vm9sdW1lR3JvdXBOYW1lIFBoeXNpY2FsRGV2aWNlUGF0aCBbUGh5c2ljYWxEZXZpY2VQYXRoLi4uXVxuIiwKKworICAgYWRkdGFnX0FSRywgYWxsb2NfQVJHLCBhdXRvYmFja3VwX0FSRywgY2x1c3RlcmVkX0FSRywgbWF4bG9naWNhbHZvbHVtZXNfQVJHLAorICAgbWF4cGh5c2ljYWx2b2x1bWVzX0FSRywgbWV0YWRhdGFwcm9maWxlX0FSRywgbWV0YWRhdGF0eXBlX0FSRywKKyAgIHBoeXNpY2FsZXh0ZW50c2l6ZV9BUkcsIHRlc3RfQVJHLCBmb3JjZV9BUkcsIHplcm9fQVJHLCBsYWJlbHNlY3Rvcl9BUkcsCisgICBtZXRhZGF0YXNpemVfQVJHLCBwdm1ldGFkYXRhY29waWVzX0FSRywgcmVwb3J0Zm9ybWF0X0FSRywgbWV0YWRhdGFjb3BpZXNfQVJHLAorICAgdmdtZXRhZGF0YWNvcGllc19BUkcsIGRhdGFhbGlnbm1lbnRfQVJHLCBkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRywKKyAgIHNoYXJlZF9BUkcsIHN5c3RlbWlkX0FSRywgbG9ja3R5cGVfQVJHLCBsb2Nrb3B0X0FSRykKKworeHgodmdkaXNwbGF5LAorICAgIkRpc3BsYXkgdm9sdW1lIGdyb3VwIGluZm9ybWF0aW9uIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBBTExfVkdTX0lTX0RFRkFVTFQgfCBMT0NLRF9WR19TSCwKKyAgICJ2Z2Rpc3BsYXlcbiIKKyAgICJcdFstQXwtLWFjdGl2ZXZvbHVtZWdyb3Vwc11cbiIKKyAgICJcdFstY3wtLWNvbG9uIHwgLXN8LS1zaG9ydCB8IC12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1mb3JlaWduXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLS1ub3N1ZmZpeF1cbiIKKyAgICJcdFstUHwtLXBhcnRpYWxdXG4iCisgICAiXHRbLS1yZWFkb25seV1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy0tdW5pdHMgaEhiQnNTa0ttTWdHdFRwUGVFXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtWb2x1bWVHcm91cE5hbWUgW1ZvbHVtZUdyb3VwTmFtZS4uLl1dXG4iCisgICAiXG4iCisgICAidmdkaXNwbGF5IC0tY29sdW1uc3wtQ1xuIgorICAgIlx0Wy0tYWxpZ25lZF1cbiIKKyAgICJcdFstLWJpbmFyeV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy0tY29uZmlncmVwb3J0IFJlcG9ydE5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstLWZvcmVpZ25dXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLS1pZ25vcmVza2lwcGVkY2x1c3Rlcl1cbiIKKyAgICJcdFstLWxvZ29ubHldXG4iCisgICAiXHRbLS1ub2hlYWRpbmdzXVxuIgorICAgIlx0Wy0tbm9zdWZmaXhdXG4iCisgICAiXHRbLW98LS1vcHRpb25zIFsrfC18I11GaWVsZFssRmllbGRdXVxuIgorICAgIlx0Wy1PfC0tc29ydCBbK3wtXWtleTFbLFsrfC1da2V5MlssLi4uXV1dXG4iCisgICAiXHRbLVB8LS1wYXJ0aWFsXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstU3wtLXNlbGVjdCBTZWxlY3Rpb25dXG4iCisgICAiXHRbLS1yZWFkb25seV1cbiIKKyAgICJcdFstLXNlcGFyYXRvciBTZXBhcmF0b3JdXG4iCisgICAiXHRbLS11bmJ1ZmZlcmVkXVxuIgorICAgIlx0Wy0tdW5pdHMgaEhiQnNTa0ttTWdHdFRwUGVFXVxuIgorICAgIlx0Wy0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbVm9sdW1lR3JvdXBOYW1lIFtWb2x1bWVHcm91cE5hbWUuLi5dXVxuIiwKKworICAgYWN0aXZldm9sdW1lZ3JvdXBzX0FSRywgYWxpZ25lZF9BUkcsIGJpbmFyeV9BUkcsIGNvbG9uX0FSRywgY29sdW1uc19BUkcsCisgICBjb25maWdyZXBvcnRfQVJHLCBmb3JlaWduX0FSRywgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLAorICAgaWdub3Jlc2tpcHBlZGNsdXN0ZXJfQVJHLCBsb2dvbmx5X0FSRywgbm9oZWFkaW5nc19BUkcsIG5vc3VmZml4X0FSRywKKyAgIG9wdGlvbnNfQVJHLCBwYXJ0aWFsX0FSRywgcmVhZG9ubHlfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCBzZWxlY3RfQVJHLAorICAgc2hhcmVkX0FSRywgc2hvcnRfQVJHLCBzZXBhcmF0b3JfQVJHLCBzb3J0X0FSRywgdW5idWZmZXJlZF9BUkcsIHVuaXRzX0FSRykKKworeHgodmdleHBvcnQsCisgICAiVW5yZWdpc3RlciB2b2x1bWUgZ3JvdXAocykgZnJvbSB0aGUgc3lzdGVtIiwKKyAgIEFMTF9WR1NfSVNfREVGQVVMVCwKKyAgICJ2Z2V4cG9ydFxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstaHwtLWhlbHBdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy1TfC0tc2VsZWN0IFNlbGVjdGlvbl1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0Vm9sdW1lR3JvdXBOYW1lIFtWb2x1bWVHcm91cE5hbWUuLi5dXG4iLAorCisgICBhbGxfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCBzZWxlY3RfQVJHLCB0ZXN0X0FSRykKKworeHgodmdleHRlbmQsCisgICAiQWRkIHBoeXNpY2FsIHZvbHVtZXMgdG8gYSB2b2x1bWUgZ3JvdXAiLAorICAgTVVTVF9VU0VfQUxMX0FSR1MgfCBFTkFCTEVfQUxMX0RFVlMsCisgICAidmdleHRlbmRcbiIKKyAgICJcdFstQXwtLWF1dG9iYWNrdXAgeXxuXVxuIgorICAgIlx0Wy0tcmVzdG9yZW1pc3NpbmddXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1mfC0tZm9yY2VdXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFsteXwtLXllc11cbiIKKyAgICJcdFsgUEhZU0lDQUwgREVWSUNFIE9QVElPTlMgXVxuIgorICAgIlx0Vm9sdW1lR3JvdXBOYW1lIFBoeXNpY2FsRGV2aWNlUGF0aCBbUGh5c2ljYWxEZXZpY2VQYXRoLi4uXVxuIiwKKworICAgYXV0b2JhY2t1cF9BUkcsIHRlc3RfQVJHLAorICAgZm9yY2VfQVJHLCB6ZXJvX0FSRywgbGFiZWxzZWN0b3JfQVJHLCBtZXRhZGF0YXR5cGVfQVJHLAorICAgbWV0YWRhdGFzaXplX0FSRywgcHZtZXRhZGF0YWNvcGllc19BUkcsIG1ldGFkYXRhY29waWVzX0FSRywKKyAgIG1ldGFkYXRhaWdub3JlX0FSRywgZGF0YWFsaWdubWVudF9BUkcsIGRhdGFhbGlnbm1lbnRvZmZzZXRfQVJHLAorICAgcmVwb3J0Zm9ybWF0X0FSRywgcmVzdG9yZW1pc3NpbmdfQVJHKQorCit4eCh2Z2ltcG9ydCwKKyAgICJSZWdpc3RlciBleHBvcnRlZCB2b2x1bWUgZ3JvdXAgd2l0aCBzeXN0ZW0iLAorICAgQUxMX1ZHU19JU19ERUZBVUxUIHwgTk9fTFZNRVRBRF9BVVRPU0NBTiwKKyAgICJ2Z2ltcG9ydFxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy0tY29tbWFuZHByb2ZpbGUgUHJvZmlsZU5hbWVdXG4iCisgICAiXHRbLWR8LS1kZWJ1Z11cbiIKKyAgICJcdFstZnwtLWZvcmNlXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0Vm9sdW1lR3JvdXBOYW1lLi4uXG4iLAorCisgICBhbGxfQVJHLCBmb3JjZV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHNlbGVjdF9BUkcsIHRlc3RfQVJHKQorCit4eCh2Z2ltcG9ydGNsb25lLAorICAgIkltcG9ydCBhIFZHIGZyb20gY2xvbmVkIFBWcyIsCisgICBOT19MVk1FVEFEX0FVVE9TQ0FOLAorICAgInZnaW1wb3J0Y2xvbmVcbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstaXwtLWltcG9ydF1cbiIKKyAgICJcdFstbnwtLWJhc2V2Z25hbWVdXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRbUGh5c2ljYWxWb2x1bWVQYXRoLi4uXVxuIiwKKworICAgYmFzZXZnbmFtZV9BUkcsIHRlc3RfQVJHLCBpbXBvcnRfQVJHKQorCit4eCh2Z21lcmdlLAorICAgIk1lcmdlIHZvbHVtZSBncm91cHMiLAorICAgMCwKKyAgICJ2Z21lcmdlXG4iCisgICAiXHRbLUF8LS1hdXRvYmFja3VwIHl8bl1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1sfC0tbGlzdF1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdERlc3RpbmF0aW9uVm9sdW1lR3JvdXBOYW1lIFNvdXJjZVZvbHVtZUdyb3VwTmFtZVxuIiwKKworICAgYXV0b2JhY2t1cF9BUkcsIGxpc3RfQVJHLCB0ZXN0X0FSRykKKworeHgodmdta25vZGVzLAorICAgIkNyZWF0ZSB0aGUgc3BlY2lhbCBmaWxlcyBmb3Igdm9sdW1lIGdyb3VwIGRldmljZXMgaW4gL2RldiIsCisgICBBTExfVkdTX0lTX0RFRkFVTFQsCisgICAidmdta25vZGVzXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0tcmVmcmVzaF1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtWb2x1bWVHcm91cE5hbWUuLi5dXG4iLAorCisgICBpZ25vcmVsb2NraW5nZmFpbHVyZV9BUkcsIHJlZnJlc2hfQVJHLCByZXBvcnRmb3JtYXRfQVJHKQorCit4eCh2Z3JlZHVjZSwKKyAgICJSZW1vdmUgcGh5c2ljYWwgdm9sdW1lKHMpIGZyb20gYSB2b2x1bWUgZ3JvdXAiLAorICAgMCwKKyAgICJ2Z3JlZHVjZVxuIgorICAgIlx0Wy1hfC0tYWxsXVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB5fG5dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLW1pcnJvcnNvbmx5XVxuIgorICAgIlx0Wy0tcmVtb3ZlbWlzc2luZ11cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLWZ8LS1mb3JjZV1cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFZvbHVtZUdyb3VwTmFtZVxuIgorICAgIlx0W1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1cbiIsCisKKyAgIGFsbF9BUkcsIGF1dG9iYWNrdXBfQVJHLCBmb3JjZV9BUkcsIG1pcnJvcnNvbmx5X0FSRywgcmVtb3ZlbWlzc2luZ19BUkcsCisgICByZXBvcnRmb3JtYXRfQVJHLCB0ZXN0X0FSRykKKworeHgodmdyZW1vdmUsCisgICAiUmVtb3ZlIHZvbHVtZSBncm91cChzKSIsCisgICBBTExfVkdTX0lTX0RFRkFVTFQsIC8qIGFsbCBWR3Mgb25seSB3aXRoIHNlbGVjdCAqLworICAgInZncmVtb3ZlXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1mfC0tZm9yY2VdXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0tbm91ZGV2c3luY11cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy10fC0tdGVzdF1cbiIKKyAgICJcdFstdnwtLXZlcmJvc2VdXG4iCisgICAiXHRbLS12ZXJzaW9uXVxuIgorICAgIlx0Vm9sdW1lR3JvdXBOYW1lIFtWb2x1bWVHcm91cE5hbWUuLi5dXG4iLAorCisgICBmb3JjZV9BUkcsIG5vdWRldnN5bmNfQVJHLCByZXBvcnRmb3JtYXRfQVJHLCBzZWxlY3RfQVJHLCB0ZXN0X0FSRykKKworeHgodmdyZW5hbWUsCisgICAiUmVuYW1lIGEgdm9sdW1lIGdyb3VwIiwKKyAgIEFMTE9XX1VVSURfQVNfTkFNRSB8IFJFUVVJUkVTX0ZVTExfTEFCRUxfU0NBTiwKKyAgICJ2Z3JlbmFtZVxuIgorICAgIlx0Wy1BfC0tYXV0b2JhY2t1cCB5fG5dXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstZHwtLWRlYnVnXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLXJlcG9ydGZvcm1hdCB7YmFzaWN8anNvbn1dXG4iCisgICAiXHRbLXR8LS10ZXN0XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iCisgICAiXHRPbGRWb2x1bWVHcm91cFBhdGggTmV3Vm9sdW1lR3JvdXBQYXRoIHxcbiIKKyAgICJcdE9sZFZvbHVtZUdyb3VwTmFtZSBOZXdWb2x1bWVHcm91cE5hbWVcbiIsCisKKyAgIGF1dG9iYWNrdXBfQVJHLCBmb3JjZV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHRlc3RfQVJHKQorCit4eCh2Z3MsCisgICAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB2b2x1bWUgZ3JvdXBzIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBBTExfVkdTX0lTX0RFRkFVTFQgfCBMT0NLRF9WR19TSCwKKyAgICJ2Z3NcbiIKKyAgICJcdFstLWFsaWduZWRdXG4iCisgICAiXHRbLS1iaW5hcnldXG4iCisgICAiXHRbLWF8LS1hbGxdXG4iCisgICAiXHRbLS1jb21tYW5kcHJvZmlsZSBQcm9maWxlTmFtZV1cbiIKKyAgICJcdFstLWNvbmZpZ3JlcG9ydCBSZXBvcnROYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLS1mb3JlaWduXVxuIgorICAgIlx0Wy1ofC0taGVscF1cbiIKKyAgICJcdFstLWlnbm9yZWxvY2tpbmdmYWlsdXJlXVxuIgorICAgIlx0Wy0taWdub3Jlc2tpcHBlZGNsdXN0ZXJdXG4iCisgICAiXHRbLS1sb2dvbmx5XVxuIgorICAgIlx0Wy0tbmFtZXByZWZpeGVzXVxuIgorICAgIlx0Wy0tbm9oZWFkaW5nc11cbiIKKyAgICJcdFstLW5vc3VmZml4XVxuIgorICAgIlx0Wy1vfC0tb3B0aW9ucyBbK3wtfCNdRmllbGRbLEZpZWxkXV1cbiIKKyAgICJcdFstT3wtLXNvcnQgWyt8LV1rZXkxWyxbK3wtXWtleTJbLC4uLl1dXVxuIgorICAgIlx0Wy1QfC0tcGFydGlhbF1cbiIKKyAgICJcdFstLXJlYWRvbmx5XVxuIgorICAgIlx0Wy0tcmVwb3J0Zm9ybWF0IHtiYXNpY3xqc29ufV1cbiIKKyAgICJcdFstLXJvd3NdXG4iCisgICAiXHRbLVN8LS1zZWxlY3QgU2VsZWN0aW9uXVxuIgorICAgIlx0Wy0tc2VwYXJhdG9yIFNlcGFyYXRvcl1cbiIKKyAgICJcdFstLXRydXN0Y2FjaGVdXG4iCisgICAiXHRbLS11bmJ1ZmZlcmVkXVxuIgorICAgIlx0Wy0tdW5pdHMgaEhiQnNTa0ttTWdHdFRwUGVFXVxuIgorICAgIlx0Wy0tdW5xdW90ZWRdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFtWb2x1bWVHcm91cE5hbWUgW1ZvbHVtZUdyb3VwTmFtZS4uLl1dXG4iLAorCisgICBhbGlnbmVkX0FSRywgYWxsX0FSRywgYmluYXJ5X0FSRywgY29uZmlncmVwb3J0X0FSRywgZm9yZWlnbl9BUkcsCisgICBpZ25vcmVsb2NraW5nZmFpbHVyZV9BUkcsIGlnbm9yZXNraXBwZWRjbHVzdGVyX0FSRywgbG9nb25seV9BUkcsCisgICBuYW1lcHJlZml4ZXNfQVJHLCBub2hlYWRpbmdzX0FSRywgbm9sb2NraW5nX0FSRywgbm9zdWZmaXhfQVJHLAorICAgb3B0aW9uc19BUkcsIHBhcnRpYWxfQVJHLCByZWFkb25seV9BUkcsIHJlcG9ydGZvcm1hdF9BUkcsIHJvd3NfQVJHLAorICAgc2VsZWN0X0FSRywgc2VwYXJhdG9yX0FSRywgc2hhcmVkX0FSRywgc29ydF9BUkcsIHRydXN0Y2FjaGVfQVJHLAorICAgdW5idWZmZXJlZF9BUkcsIHVuaXRzX0FSRywgdW5xdW90ZWRfQVJHKQorCit4eCh2Z3NjYW4sCisgICAiU2VhcmNoIGZvciBhbGwgdm9sdW1lIGdyb3VwcyIsCisgICBQRVJNSVRURURfUkVBRF9PTkxZIHwgQUxMX1ZHU19JU19ERUZBVUxUIHwgTE9DS0RfVkdfU0ggfCBOT19MVk1FVEFEX0FVVE9TQ0FOLAorICAgInZnc2NhbiAiCisgICAiXHRbLS1jYWNoZV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy0taWdub3JlbG9ja2luZ2ZhaWx1cmVdXG4iCisgICAiXHRbLS1ta25vZGVzXVxuIgorICAgIlx0Wy0tbm90aWZ5ZGJ1c11cbiIKKyAgICJcdFstUHwtLXBhcnRpYWxdXG4iCisgICAiXHRbLS1yZXBvcnRmb3JtYXQge2Jhc2ljfGpzb259XVxuIgorICAgIlx0Wy12fC0tdmVyYm9zZV1cbiIKKyAgICJcdFstLXZlcnNpb25dXG4iLAorCisgICBjYWNoZV9sb25nX0FSRywgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHLCBta25vZGVzX0FSRywgbm90aWZ5ZGJ1c19BUkcsCisgICBwYXJ0aWFsX0FSRywgcmVwb3J0Zm9ybWF0X0FSRykKKworeHgodmdzcGxpdCwKKyAgICJNb3ZlIHBoeXNpY2FsIHZvbHVtZXMgaW50byBhIG5ldyBvciBleGlzdGluZyB2b2x1bWUgZ3JvdXAiLAorICAgMCwKKyAgICJ2Z3NwbGl0XG4iCisgICAiXHRbLUF8LS1hdXRvYmFja3VwIHt5fG59XVxuIgorICAgIlx0Wy0tYWxsb2MgQWxsb2NhdGlvblBvbGljeV1cbiIKKyAgICJcdFstY3wtLWNsdXN0ZXJlZCB7eXxufV1cbiIKKyAgICJcdFstLWNvbW1hbmRwcm9maWxlIFByb2ZpbGVOYW1lXVxuIgorICAgIlx0Wy1kfC0tZGVidWddXG4iCisgICAiXHRbLWh8LS1oZWxwXVxuIgorICAgIlx0Wy1sfC0tbWF4bG9naWNhbHZvbHVtZXMgTWF4TG9naWNhbFZvbHVtZXNdXG4iCisgICAiXHRbLU18LS1tZXRhZGF0YXR5cGUgMXwyXVxuIgorICAgIlx0Wy0tW3ZnXW1ldGFkYXRhY29waWVzICNjb3BpZXNdXG4iCisgICAiXHRbLW58LS1uYW1lIExvZ2ljYWxWb2x1bWVOYW1lXVxuIgorICAgIlx0Wy1wfC0tbWF4cGh5c2ljYWx2b2x1bWVzIE1heFBoeXNpY2FsVm9sdW1lc11cbiIKKyAgICJcdFstdHwtLXRlc3RdXG4iCisgICAiXHRbLXZ8LS12ZXJib3NlXVxuIgorICAgIlx0Wy0tdmVyc2lvbl1cbiIKKyAgICJcdFNvdXJjZVZvbHVtZUdyb3VwTmFtZSBEZXN0aW5hdGlvblZvbHVtZUdyb3VwTmFtZVxuIgorICAgIlx0W1BoeXNpY2FsVm9sdW1lUGF0aC4uLl1cbiIsCisKKyAgIGFsbG9jX0FSRywgYXV0b2JhY2t1cF9BUkcsIGNsdXN0ZXJlZF9BUkcsCisgICBtYXhsb2dpY2Fsdm9sdW1lc19BUkcsIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcsCisgICBtZXRhZGF0YXR5cGVfQVJHLCB2Z21ldGFkYXRhY29waWVzX0FSRywgbmFtZV9BUkcsIHRlc3RfQVJHKQorCit4eCh2ZXJzaW9uLAorICAgIkRpc3BsYXkgc29mdHdhcmUgYW5kIGRyaXZlciB2ZXJzaW9uIGluZm9ybWF0aW9uIiwKKyAgIFBFUk1JVFRFRF9SRUFEX09OTFkgfCBOT19NRVRBREFUQV9QUk9DRVNTSU5HLAorICAgInZlcnNpb25cbiIpCmRpZmYgLS1naXQgYS90b29scy9kbXNldHVwLmMgYi90b29scy9kbXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Rtc2V0dXAuYwpAQCAtMCwwICsxLDY4NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBORUMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZGV2aWNlLW1hcHBlciB1c2Vyc3BhY2UgdG9vbHMuCisgKgorICogSXQgaW5jbHVkZXMgdHJlZSBkcmF3aW5nIGNvZGUgYmFzZWQgb24gcHN0cmVlOiBodHRwOi8vcHNtaXNjLnNvdXJjZWZvcmdlLm5ldC8KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAidG9vbC5oIgorCisjaW5jbHVkZSAiZG0tbG9nZ2luZy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPGxhbmdpbmZvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgVURFVl9TWU5DX1NVUFBPUlQKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaW5jbHVkZSA8c3lzL2lwYy5oPgorIyAgaW5jbHVkZSA8c3lzL3NlbS5oPgorIyAgaW5jbHVkZSA8bGlidWRldi5oPgorI2VuZGlmCisKKy8qIEZJWE1FIFVudXNlZCBzbyBmYXIgKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUVkZTX0gKKworI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorIyAgaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RJTUVSRkRfSAorIyBpbmNsdWRlIDxzeXMvdGltZXJmZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorIyAgaW5jbHVkZSA8dGVybWlvcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dFVE9QVExPTkcKKyMgIGluY2x1ZGUgPGdldG9wdC5oPgorIyAgZGVmaW5lIEdFVE9QVExPTkdfRk4oYSwgYiwgYywgZCwgZSkgZ2V0b3B0X2xvbmcoKGEpLCAoYiksIChjKSwgKGQpLCAoZSkpCisjICBkZWZpbmUgT1BUSU5EX0lOSVQgMAorI2Vsc2UKK3N0cnVjdCBvcHRpb24geworfTsKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKyMgIGRlZmluZSBHRVRPUFRMT05HX0ZOKGEsIGIsIGMsIGQsIGUpIGdldG9wdCgoYSksIChiKSwgKGMpKQorIyAgZGVmaW5lIE9QVElORF9JTklUIDEKKyNlbmRpZgorCisjaWZuZGVmIFRFTVBfRkFJTFVSRV9SRVRSWQorIyBkZWZpbmUgVEVNUF9GQUlMVVJFX1JFVFJZKGV4cHJlc3Npb24pIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCVwKKyAgICAoeyBsb25nIGludCBfX3Jlc3VsdDsJCQkJXAorICAgICAgIGRvIF9fcmVzdWx0ID0gKGxvbmcgaW50KSAoZXhwcmVzc2lvbik7CQlcCisgICAgICAgd2hpbGUgKF9fcmVzdWx0ID09IC0xTCAmJiBlcnJubyA9PSBFSU5UUik7CVwKKyAgICAgICBfX3Jlc3VsdDsgfSkpCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworIyAgaW5jbHVkZSAia2Rldl90LmgiCisjZWxzZQorIyAgZGVmaW5lIE1BSk9SKHgpIG1ham9yKCh4KSkKKyMgIGRlZmluZSBNSU5PUih4KSBtaW5vcigoeCkpCisjICBkZWZpbmUgTUtERVYoeCx5KSBtYWtlZGV2KCh4KSwoeSkpCisjZW5kaWYKKworI2RlZmluZSBMSU5FX1NJWkUgNDA5NgorI2RlZmluZSBBUkdTX01BWCAyNTYKKyNkZWZpbmUgTE9PUF9UQUJMRV9TSVpFIChQQVRIX01BWCArIDI1NSkKKworI2RlZmluZSBERUZBVUxUX0RNX0RFVl9ESVIgIi9kZXYvIgorCisjZGVmaW5lIERNX0RFVl9ESVJfRU5WX1ZBUl9OQU1FICJETV9ERVZfRElSIgorI2RlZmluZSBETV9VREVWX0NPT0tJRV9FTlZfVkFSX05BTUUgIkRNX1VERVZfQ09PS0lFIgorCisvKiBGSVhNRSBTaG91bGQgYmUgaW1wb3J0ZWQgKi8KKyNpZm5kZWYgRE1fTUFYX1RZUEVfTkFNRQorIyAgZGVmaW5lIERNX01BWF9UWVBFX05BTUUgMTYKKyNlbmRpZgorCisvKiBGSVhNRSBTaG91bGQgYmUgZWxzZXdoZXJlICovCisjZGVmaW5lIFNFQ1RPUl9TSElGVCA5TAorCisjZGVmaW5lIGVycihtc2csIHguLi4pIGZwcmludGYoc3RkZXJyLCBtc2cgIlxuIiwgIyN4KQorCisvKiBwcm9ncmFtX2lkIHVzZWQgZm9yIGRtc3RhdHMtbWFuYWdlZCBzdGF0aXN0aWNzIHJlZ2lvbnMgKi8KKyNkZWZpbmUgRE1fU1RBVFNfUFJPR1JBTV9JRCAiZG1zdGF0cyIKKworLyoKKyAqIEJhc2ljIGNvbW1hbmRzIHRoaXMgY29kZSBpbXBsbWVudHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRE1TRVRVUF9DTUQgPSAwLAorCUxPU0VUVVBfQ01EID0gMSwKKwlETUxPU0VUVVBfQ01EID0gMiwKKwlETVNUQVRTX0NNRCA9IDMsCisJRE1TRVRVUF9TVEFUU19DTUQgPSA0LAorCURFVk1BUF9OQU1FX0NNRCA9IDUKK30gY21kX25hbWVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlETVNFVFVQX1RZUEUgPSAwLAorCUxPU0VUVVBfVFlQRSA9IDEsCisJU1RBVFNfVFlQRSA9IDIsCisJREVWTUFQX05BTUVfVFlQRSA9IDMKK30gY21kX3R5cGVfdDsKKworI2RlZmluZSBETVNFVFVQX0NNRF9OQU1FICJkbXNldHVwIgorI2RlZmluZSBMT1NFVFVQX0NNRF9OQU1FICJsb3NldHVwIgorI2RlZmluZSBETUxPU0VUVVBfQ01EX05BTUUgImRtbG9zZXR1cCIKKyNkZWZpbmUgRE1TVEFUU19DTURfTkFNRSAiZG1zdGF0cyIKKyNkZWZpbmUgRE1TRVRVUF9TVEFUU19DTURfTkFNRSAiZG1zZXR1cCBzdGF0cyIKKyNkZWZpbmUgREVWTUFQX05BTUVfQ01EX05BTUUgImRldm1hcF9uYW1lIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljbWRfbmFtZV90IGNvbW1hbmQ7CisJY29uc3QgY2hhciBuYW1lWzE0XTsKKwljbWRfdHlwZV90IHR5cGU7Cit9IF9iYXNlX2NvbW1hbmRzW10gPSB7CisJeyBETVNFVFVQX0NNRCwgRE1TRVRVUF9DTURfTkFNRSwgRE1TRVRVUF9UWVBFIH0sCisJeyBMT1NFVFVQX0NNRCwgTE9TRVRVUF9DTURfTkFNRSwgTE9TRVRVUF9UWVBFIH0sCisJeyBETUxPU0VUVVBfQ01ELCBETUxPU0VUVVBfQ01EX05BTUUsIExPU0VUVVBfVFlQRSB9LAorCXsgRE1TVEFUU19DTUQsIERNU1RBVFNfQ01EX05BTUUsIFNUQVRTX1RZUEUgfSwKKwl7IERNU0VUVVBfU1RBVFNfQ01ELCBETVNFVFVQX1NUQVRTX0NNRF9OQU1FLCBTVEFUU19UWVBFIH0sCisJeyBERVZNQVBfTkFNRV9DTUQsIERFVk1BUF9OQU1FX0NNRF9OQU1FLCBERVZNQVBfTkFNRV9UWVBFIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50IF9udW1fYmFzZV9jb21tYW5kcyA9IERNX0FSUkFZX1NJWkUoX2Jhc2VfY29tbWFuZHMpOworCisvKgorICogV2UgaGF2ZSBvbmx5IHZlcnkgc2ltcGxlIHN3aXRjaGVzIEFUTS4KKyAqLworZW51bSB7CisJUkVBRF9PTkxZID0gMCwKKwlBRERfTk9ERV9PTl9DUkVBVEVfQVJHLAorCUFERF9OT0RFX09OX1JFU1VNRV9BUkcsCisJQUxJQVNfQVJHLAorCUFMTF9ERVZJQ0VTX0FSRywKKwlBTExfUFJPR1JBTVNfQVJHLAorCUFMTF9SRUdJT05TX0FSRywKKwlBUkVBX0FSRywKKwlBUkVBU19BUkcsCisJQVJFQV9TSVpFX0FSRywKKwlCT1VORFNfQVJHLAorCUNIRUNLU19BUkcsCisJQ0xFQVJfQVJHLAorCUNPTFNfQVJHLAorCUNPVU5UX0FSRywKKwlERUZFUlJFRF9BUkcsCisJU0VMRUNUX0FSRywKKwlFWEVDX0FSRywKKwlGSUxFTUFQX0FSRywKKwlGT1JDRV9BUkcsCisJR0lEX0FSRywKKwlHUk9VUF9BUkcsCisJR1JPVVBfSURfQVJHLAorCUhFTFBfQVJHLAorCUhJU1RPR1JBTV9BUkcsCisJSU5BQ1RJVkVfQVJHLAorCUlOVEVSVkFMX0FSRywKKwlMRU5HVEhfQVJHLAorCU1BTkdMRU5BTUVfQVJHLAorCU1BSk9SX0FSRywKKwlSRUdJT05TX0FSRywKKwlNSU5PUl9BUkcsCisJTU9ERV9BUkcsCisJTkFNRVBSRUZJWEVTX0FSRywKKwlOT0ZMVVNIX0FSRywKKwlOT0dST1VQX0FSRywKKwlOT0hFQURJTkdTX0FSRywKKwlOT0xPQ0tGU19BUkcsCisJTk9PUEVOQ09VTlRfQVJHLAorCU5PU1VGRklYX0FSRywKKwlOT1RBQkxFX0FSRywKKwlOT1RJTUVTVUZGSVhfQVJHLAorCVVERVZDT09LSUVfQVJHLAorCU5PVURFVlJVTEVTX0FSRywKKwlOT1VERVZTWU5DX0FSRywKKwlPUFRJT05TX0FSRywKKwlQUkVDSVNFX0FSRywKKwlQUk9HUkFNX0lEX0FSRywKKwlSQVdfQVJHLAorCVJFQURBSEVBRF9BUkcsCisJUkVHSU9OX0FSRywKKwlSRUdJT05fSURfQVJHLAorCVJFTEFUSVZFX0FSRywKKwlSRVRSWV9BUkcsCisJUk9XU19BUkcsCisJU0VQQVJBVE9SX0FSRywKKwlTRVRVVUlEX0FSRywKKwlTSE9XS0VZU19BUkcsCisJU09SVF9BUkcsCisJU1RBUlRfQVJHLAorCVRBQkxFX0FSRywKKwlUQVJHRVRfQVJHLAorCVNFR01FTlRTX0FSRywKKwlUUkVFX0FSRywKKwlVSURfQVJHLAorCVVOQlVGRkVSRURfQVJHLAorCVVOSVRTX0FSRywKKwlVTlFVT1RFRF9BUkcsCisJVVNFUl9EQVRBX0FSRywKKwlVVUlEX0FSRywKKwlWRVJCT1NFX0FSRywKKwlWRVJJRllVREVWX0FSRywKKwlWRVJTSU9OX0FSRywKKwlZRVNfQVJHLAorCU5VTV9TV0lUQ0hFUworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlEUl9UQVNLID0gMSwKKwlEUl9JTkZPID0gMiwKKwlEUl9ERVBTID0gNCwKKwlEUl9UUkVFID0gOCwJLyogQ29tcGxldGUgZGVwZW5kZW5jeSB0cmVlIHJlcXVpcmVkICovCisJRFJfTkFNRSA9IDE2LAorCURSX1NUQVRTID0gMzIsICAvKiBSZXF1aXJlcyBwb3B1bGF0ZWQgc3RhdHMgaGFuZGxlLiAqLworCURSX1NUQVRTX01FVEEgPSA2NCwgLyogUmVxdWlyZXMgbGlzdGVkIHN0YXRzIGhhbmRsZS4gKi8KK30gcmVwb3J0X3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlETl9ERVZOTywJLyogTWFqb3IgYW5kIG1pbm9yIG51bWJlciBwYWlyICovCisJRE5fQkxLLAkJLyogQmxvY2sgZGV2aWNlIG5hbWUgKGUuZy4gZG0tMCkgKi8KKwlETl9NQVAJCS8qIE1hcCBuYW1lIChmb3IgZG0gZGV2aWNlcyBvbmx5LCBlcXVhbCB0byBETl9CTEsgb3RoZXJ3aXNlKSAqLworfSBkZXZfbmFtZV90OworCitzdGF0aWMgY21kX25hbWVfdCBfYmFzZV9jb21tYW5kID0gRE1TRVRVUF9DTUQ7CS8qIERlZmF1bHQgY29tbWFuZCBpcyAnZG1zZXR1cCcgKi8KK3N0YXRpYyBjbWRfdHlwZV90IF9iYXNlX2NvbW1hbmRfdHlwZSA9IERNU0VUVVBfVFlQRTsKK3N0YXRpYyBpbnQgX3N3aXRjaGVzW05VTV9TV0lUQ0hFU107CitzdGF0aWMgaW50IF9pbnRfYXJnc1tOVU1fU1dJVENIRVNdOworc3RhdGljIGNoYXIgKl9zdHJpbmdfYXJnc1tOVU1fU1dJVENIRVNdOworc3RhdGljIGludCBfbnVtX2RldmljZXM7CitzdGF0aWMgY2hhciAqX3V1aWQ7CitzdGF0aWMgY2hhciAqX3RhYmxlOworc3RhdGljIGNoYXIgKl90YXJnZXQ7CitzdGF0aWMgY2hhciAqX2NvbW1hbmRfdG9fZXhlYzsJCS8qIC0tZXhlYyA8Y29tbWFuZD4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfY29tbWFuZDsJCS8qIGRtc2V0dXAgPGNvbW1hbmQ+ICovCitzdGF0aWMgdWludDMyX3QgX3JlYWRfYWhlYWRfZmxhZ3M7CitzdGF0aWMgdWludDMyX3QgX3VkZXZfY29va2llOworc3RhdGljIGludCBfdWRldl9vbmx5Oworc3RhdGljIHN0cnVjdCBkbV90cmVlICpfZHRyZWU7CitzdGF0aWMgc3RydWN0IGRtX3JlcG9ydCAqX3JlcG9ydDsKK3N0YXRpYyByZXBvcnRfdHlwZV90IF9yZXBvcnRfdHlwZTsKK3N0YXRpYyBkZXZfbmFtZV90IF9kZXZfbmFtZV90eXBlOworc3RhdGljIHVpbnQzMl90IF9jb3VudCA9IDE7IC8qIGNvdW50IG9mIHJlcGVhdGluZyByZXBvcnRzICovCitzdGF0aWMgc3RydWN0IGRtX3RpbWVzdGFtcCAqX2luaXRpYWxfdGltZXN0YW1wID0gTlVMTDsKK3N0YXRpYyB1aW50NjRfdCBfZGlzcF9mYWN0b3IgPSA1MTI7IC8qIGRpc3BsYXkgc2l6ZXMgaW4gc2VjdG9ycyAqLworc3RhdGljIGNoYXIgX2Rpc3BfdW5pdHMgPSAncyc7Citjb25zdCBjaGFyICpfcHJvZ3JhbV9pZCA9IERNX1NUQVRTX1BST0dSQU1fSUQ7IC8qIHByb2dyYW1faWQgdXNlZCBmb3IgcmVwb3J0cy4gKi8KK3N0YXRpYyB1aW50NjRfdCBfc3RhdHN0eXBlID0gMDsgLyogc3RhdHMgb2JqZWN0cyB0byByZXBvcnQgKi8KKworLyogc3RyaW5nIG5hbWVzIGZvciBzdGF0cyBvYmplY3QgdHlwZXMgKi8KK2NvbnN0IGNoYXIgKl9zdGF0c190eXBlc1tdID0geworCSJhbGwiLAorCSJhcmVhIiwKKwkicmVnaW9uIiwKKwkiZ3JvdXAiLAorCU5VTEwKK307CisKKy8qIHJlcG9ydCB0aW1la2VlcGluZyAqLworc3RhdGljIHN0cnVjdCBkbV90aW1lc3RhbXAgKl9jeWNsZV90aW1lc3RhbXAgPSBOVUxMOworc3RhdGljIHVpbnQ2NF90IF9pbnRlcnZhbCA9IDA7IC8qIGNvbmZpZ3VyZWQgaW50ZXJ2YWwgaW4gbnNlY3MgKi8KK3N0YXRpYyB1aW50NjRfdCBfbmV3X2ludGVydmFsID0gMDsgLyogZmxhZyB0b3Atb2YtaW50ZXJ2YWwgKi8KK3N0YXRpYyB1aW50NjRfdCBfbGFzdF9pbnRlcnZhbCA9IDA7IC8qIGFwcHJveC4gbWVhc3VyZWQgaW50ZXJ2YWwgaW4gbnNlY3MgKi8KK3N0YXRpYyBpbnQgX3RpbWVyX2ZkID0gLTE7IC8qIHRpbWVyZmQgZmlsZSBkZXNjcmlwdG9yLiAqLworCisvKiBJbnZhbGlkIGZkIHZhbHVlIHVzZWQgdG8gc2lnbmFsIGVuZC1vZi1yZXBvcnRpbmcuICovCisjZGVmaW5lIFRJTUVSX1NUT1BQRUQgLTIKKworI2RlZmluZSBOU0VDX1BFUl9VU0VDCVVJTlQ2NF9DKDEwMDApCisjZGVmaW5lIE5TRUNfUEVSX01TRUMJVUlOVDY0X0MoMTAwMDAwMCkKKyNkZWZpbmUgTlNFQ19QRVJfU0VDCVVJTlQ2NF9DKDEwMDAwMDAwMDApCisKKy8qCisgKiBDb21tYW5kcworICovCisKK3N0cnVjdCBjb21tYW5kOworI2RlZmluZSBDTURfQVJHUyBjb25zdCBzdHJ1Y3QgY29tbWFuZCAqY21kLCBjb25zdCBjaGFyICpzdWJjb21tYW5kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBkbV9uYW1lcyAqbmFtZXMsIGludCBtdWx0aXBsZV9kZXZpY2VzCit0eXBlZGVmIGludCAoKmNvbW1hbmRfZm4pIChDTURfQVJHUyk7CisKK3N0cnVjdCBjb21tYW5kIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmhlbHA7CisJaW50IG1pbl9hcmdzOworCWludCBtYXhfYXJnczsKKwlpbnQgcmVwZWF0YWJsZV9jbWQ7CS8qIFJlcGVhdCB0byBwcm9jZXNzIGRldmljZSBsaXN0PyAqLworCWludCBoYXNfc3ViY29tbWFuZHM7CS8qIENvbW1hbmQgaW1wbGVtZW50cyBzdWItY29tbWFuZHMuICovCisJY29tbWFuZF9mbiBmbjsKK307CisKK3N0YXRpYyBpbnQgX3BhcnNlX2xpbmUoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmaWxlLAorCQkgICAgICAgaW50IGxpbmUpCit7CisJY2hhciB0dHlwZVtMSU5FX1NJWkVdLCAqcHRyLCAqY29tbWVudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIHNpemU7CisJaW50IG47CisKKwkvKiB0cmltIHRyYWlsaW5nIHNwYWNlICovCisJZm9yIChwdHIgPSBidWZmZXIgKyBzdHJsZW4oYnVmZmVyKSAtIDE7IHB0ciA+PSBidWZmZXI7IHB0ci0tKQorCQlpZiAoIWlzc3BhY2UoKGludCkgKnB0cikpCisJCQlicmVhazsKKwlwdHIrKzsKKwkqcHRyID0gJ1wwJzsKKworCS8qIHRyaW0gbGVhZGluZyBzcGFjZSAqLworCWZvciAocHRyID0gYnVmZmVyOyAqcHRyICYmIGlzc3BhY2UoKGludCkgKnB0cik7IHB0cisrKQorCQk7CisKKwlpZiAoISpwdHIgfHwgKnB0ciA9PSAnIycpCisJCXJldHVybiAxOworCisJaWYgKHNzY2FuZihwdHIsICIlbGx1ICVsbHUgJXMgJW4iLAorCQkgICAmc3RhcnQsICZzaXplLCB0dHlwZSwgJm4pIDwgMykgeworCQllcnIoIkludmFsaWQgZm9ybWF0IG9uIGxpbmUgJWQgb2YgdGFibGUgJXMiLCBsaW5lLCBmaWxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHRyICs9IG47CisJaWYgKChjb21tZW50ID0gc3RyY2hyKHB0ciwgKGludCkgJyMnKSkpCisJCSpjb21tZW50ID0gJ1wwJzsKKworCWlmICghZG1fdGFza19hZGRfdGFyZ2V0KGRtdCwgc3RhcnQsIHNpemUsIHR0eXBlLCBwdHIpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wYXJzZV9maWxlKHN0cnVjdCBkbV90YXNrICpkbXQsIGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqYnVmZmVyID0gTlVMTDsKKwlzaXplX3QgYnVmZmVyX3NpemUgPSAwOworCUZJTEUgKmZwOworCWludCByID0gMCwgbGluZSA9IDA7CisKKwkvKiBvbmUtbGluZSB0YWJsZSBvbiBjbWRsaW5lICovCisJaWYgKF90YWJsZSkKKwkJcmV0dXJuIF9wYXJzZV9saW5lKGRtdCwgX3RhYmxlLCAiIiwgKytsaW5lKTsKKworCS8qIE9LIGZvciBlbXB0eSBzdGRpbiAqLworCWlmIChmaWxlKSB7CisJCWlmICghKGZwID0gZm9wZW4oZmlsZSwgInIiKSkpIHsKKwkJCWVycigiQ291bGRuJ3Qgb3BlbiAnJXMnIGZvciByZWFkaW5nIiwgZmlsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlmcCA9IHN0ZGluOworCisjaWZuZGVmIEhBVkVfR0VUTElORQorCWJ1ZmZlcl9zaXplID0gTElORV9TSVpFOworCWlmICghKGJ1ZmZlciA9IGRtX21hbGxvYyhidWZmZXJfc2l6ZSkpKSB7CisJCWVycigiRmFpbGVkIHRvIG1hbGxvYyBsaW5lIGJ1ZmZlci4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgKGludCkgYnVmZmVyX3NpemUsIGZwKSkKKyNlbHNlCisJd2hpbGUgKGdldGxpbmUoJmJ1ZmZlciwgJmJ1ZmZlcl9zaXplLCBmcCkgPiAwKQorI2VuZGlmCisJCWlmICghX3BhcnNlX2xpbmUoZG10LCBidWZmZXIsIGZpbGUgPyA6ICJvbiBzdGRpbiIsICsrbGluZSkpCisJCQlnb3RvX291dDsKKworCXIgPSAxOworCitvdXQ6CisJbWVtc2V0KGJ1ZmZlciwgMCwgYnVmZmVyX3NpemUpOworI2lmbmRlZiBIQVZFX0dFVExJTkUKKwlkbV9mcmVlKGJ1ZmZlcik7CisjZWxzZQorCWZyZWUoYnVmZmVyKTsKKyNlbmRpZgorCWlmIChmaWxlICYmIGZjbG9zZShmcCkpCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGZjbG9zZSBmYWlsZWQ6ICVzIiwgZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiByOworfQorCitzdHJ1Y3QgZG1fc3BsaXRfbmFtZSB7CisJY2hhciAqc3Vic3lzdGVtOworCWNoYXIgKnZnX25hbWU7CisJY2hhciAqbHZfbmFtZTsKKwljaGFyICpsdl9sYXllcjsKK307CisKK3N0cnVjdCBkbXNldHVwX3JlcG9ydF9vYmogeworCXN0cnVjdCBkbV90YXNrICp0YXNrOworCXN0cnVjdCBkbV9pbmZvICppbmZvOworCXN0cnVjdCBkbV90YXNrICpkZXBzX3Rhc2s7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqdHJlZV9ub2RlOworCXN0cnVjdCBkbV9zcGxpdF9uYW1lICpzcGxpdF9uYW1lOworCXN0cnVjdCBkbV9zdGF0cyAqc3RhdHM7Cit9OworCitzdGF0aWMgaW50IF90YXNrX3J1bihzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWludCByOworCXVpbnQ2NF90IGRlbHRhOworCXN0cnVjdCBkbV90aW1lc3RhbXAgKnRzOworCisJaWYgKF9pbml0aWFsX3RpbWVzdGFtcCkKKwkJZG1fdGFza19zZXRfcmVjb3JkX3RpbWVzdGFtcChkbXQpOworCisJciA9IGRtX3Rhc2tfcnVuKGRtdCk7CisKKwlpZiAoX2luaXRpYWxfdGltZXN0YW1wICYmCisJICAgICh0cyA9IGRtX3Rhc2tfZ2V0X2lvY3RsX3RpbWVzdGFtcChkbXQpKSkgeworCQlkZWx0YSA9IGRtX3RpbWVzdGFtcF9kZWx0YSh0cywgX2luaXRpYWxfdGltZXN0YW1wKTsKKwkJbG9nX2RlYnVnKCJUaW1lc3RhbXA6ICU3IiBQUkl1NjQgIi4lMDkiIFBSSXU2NCAiIHNlY29uZHMiLAorCQkJICBkZWx0YSAvIE5TRUNfUEVSX1NFQywgZGVsdGEgJSBOU0VDX1BFUl9TRUMpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGRtX3Rhc2sgKl9nZXRfZGVwc190YXNrKGludCBtYWpvciwgaW50IG1pbm9yKQoreworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9ERVBTKSkpCisJCXJldHVybl9OVUxMOworCisJaWYgKCFkbV90YXNrX3NldF9tYWpvcihkbXQsIG1ham9yKSB8fAorCSAgICAhZG1fdGFza19zZXRfbWlub3IoZG10LCBtaW5vcikpCisJCWdvdG9fYmFkOworCisJaWYgKF9zd2l0Y2hlc1tOT09QRU5DT1VOVF9BUkddICYmICFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJZ290b19iYWQ7CisKKwlpZiAoX3N3aXRjaGVzW0lOQUNUSVZFX0FSR10gJiYgIWRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoZG10KSkKKwkJZ290b19iYWQ7CisKKwlpZiAoX3N3aXRjaGVzW0NIRUNLU19BUkddICYmICFkbV90YXNrX2VuYWJsZV9jaGVja3MoZG10KSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIV90YXNrX3J1bihkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoIWluZm8uZXhpc3RzKQorCQlnb3RvX2JhZDsKKworCXJldHVybiBkbXQ7CisKK2JhZDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKl9leHRyYWN0X3V1aWRfcHJlZml4KGNvbnN0IGNoYXIgKnV1aWQsIGNvbnN0IGludCBzZXBhcmF0b3IpCit7CisJY2hhciAqcHRyID0gTlVMTDsKKwljaGFyICp1dWlkX3ByZWZpeCA9IE5VTEw7CisJc2l6ZV90IGxlbjsKKworCWlmICh1dWlkKQorCQlwdHIgPSBzdHJjaHIodXVpZCwgc2VwYXJhdG9yKTsKKworCWxlbiA9IHB0ciA/IHB0ciAtIHV1aWQgOiAwOworCWlmICghKHV1aWRfcHJlZml4ID0gZG1fbWFsbG9jKGxlbiArIDEpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gZXh0cmFjdCB1dWlkIHByZWZpeC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHV1aWQpCisJCW1lbWNweSh1dWlkX3ByZWZpeCwgdXVpZCwgbGVuKTsKKworCXV1aWRfcHJlZml4W2xlbl0gPSAnXDAnOworCisJcmV0dXJuIHV1aWRfcHJlZml4OworfQorCitzdGF0aWMgc3RydWN0IGRtX3NwbGl0X25hbWUgKl9nZXRfc3BsaXRfbmFtZShjb25zdCBjaGFyICp1dWlkLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgIGludCBzZXBhcmF0b3IpCit7CisJc3RydWN0IGRtX3NwbGl0X25hbWUgKnNwbGl0X25hbWU7CisKKwlpZiAoIShzcGxpdF9uYW1lID0gZG1fbWFsbG9jKHNpemVvZigqc3BsaXRfbmFtZSkpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3BsaXQgZGV2aWNlIG5hbWUgIgorCQkJICAiaW50byBjb21wb25lbnRzLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShzcGxpdF9uYW1lLT5zdWJzeXN0ZW0gPSBfZXh0cmFjdF91dWlkX3ByZWZpeCh1dWlkLCBzZXBhcmF0b3IpKSkgeworCQlkbV9mcmVlKHNwbGl0X25hbWUpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlzcGxpdF9uYW1lLT52Z19uYW1lID0gc3BsaXRfbmFtZS0+bHZfbmFtZSA9CisJICAgIHNwbGl0X25hbWUtPmx2X2xheWVyID0gKGNoYXIgKikgIiI7CisKKwlpZiAoIXN0cmNtcChzcGxpdF9uYW1lLT5zdWJzeXN0ZW0sICJMVk0iKSAmJgorCSAgICAoIShzcGxpdF9uYW1lLT52Z19uYW1lID0gZG1fc3RyZHVwKG5hbWUpKSB8fAorCSAgICAgIWRtX3NwbGl0X2x2bV9uYW1lKE5VTEwsIE5VTEwsICZzcGxpdF9uYW1lLT52Z19uYW1lLAorCQkJCSZzcGxpdF9uYW1lLT5sdl9uYW1lLCAmc3BsaXRfbmFtZS0+bHZfbGF5ZXIpKSkKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHNwbGl0IExWTSBuYW1lICIKKwkJCSAgImludG8gY29tcG9uZW50cy4iKTsKKworCXJldHVybiBzcGxpdF9uYW1lOworfQorCitzdGF0aWMgdm9pZCBfZGVzdHJveV9zcGxpdF9uYW1lKHN0cnVjdCBkbV9zcGxpdF9uYW1lICpzcGxpdF9uYW1lKQoreworCS8qCisJICogbHZfbmFtZSBhbmQgbHZfbGF5ZXIgYXJlIGFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUgYmxvY2sKKwkgKiBvZiBtZW1vcnkgYXMgdmdfbmFtZSBzbyBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIHNlcGFyYXRlbHkuCisJICovCisJaWYgKCFzdHJjbXAoc3BsaXRfbmFtZS0+c3Vic3lzdGVtLCAiTFZNIikpCisJCWRtX2ZyZWUoc3BsaXRfbmFtZS0+dmdfbmFtZSk7CisKKwlkbV9mcmVlKHNwbGl0X25hbWUtPnN1YnN5c3RlbSk7CisJZG1fZnJlZShzcGxpdF9uYW1lKTsKK30KKworLyoKKyAqIFN0YXRzIGNsb2NrOgorICoKKyAqIFVzZSBlaXRoZXIgTGludXggdGltZXJmZHMgb3IgdXNsZWVwIHRvIGltcGxlbWVudCB0aGUgcmVwb3J0aW5nCisgKiBpbnRlcnZhbCB3YWl0LgorICoKKyAqICBfc3RhcnRfdGltZXIoKSAgIC0gU3RhcnQgdGhlIHRpbWVyIHJ1bm5pbmcuCisgKiAgX2RvX3RpbWVyX3dhaXQoKSAtIFdhaXQgdW50aWwgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpbnRlcnZhbC4KKyAqCisgKiAgX3VwZGF0ZV9pbnRlcnZhbF90aW1lcygpIC0gVXBkYXRlIHRpbWVzdGFtcHMgYW5kIGludGVydmFsIGVzdGltYXRlLgorICovCisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgaW50ZXJ2YWwgbnVtYmVyIGNvdW50aW5nIHVwd2FyZHMgZnJvbSBvbmUuCisgKi8KK3N0YXRpYyB1aW50NjRfdCBfaW50ZXJ2YWxfbnVtKHZvaWQpCit7CisJcmV0dXJuIDEgKyAodWludDY0X3QpIF9pbnRfYXJnc1tDT1VOVF9BUkddIC0gX2NvdW50OworfQorCisjaWZkZWYgSEFWRV9TWVNfVElNRVJGRF9ICitzdGF0aWMgaW50IF9zdGFydF90aW1lcmZkX3RpbWVyKHZvaWQpCit7CisJc3RydWN0IGl0aW1lcnNwZWMgaW50ZXJ2YWxfdGltZXI7CisJdGltZV90IHNlY3M7CisJbG9uZyBuc2VjczsKKworCWxvZ19kZWJ1ZygiVXNpbmcgdGltZXJmZCBmb3IgaW50ZXJ2YWwgdGltZWtlZXBpbmcuIik7CisKKwkvKiB0aW1lciBydW5uaW5nPyAqLworCWlmIChfdGltZXJfZmQgIT0gLTEpCisJCXJldHVybiAxOworCisJbWVtc2V0KCZpbnRlcnZhbF90aW1lciwgMCwgc2l6ZW9mKGludGVydmFsX3RpbWVyKSk7CisKKwkvKiBVc2UgQ0xPQ0tfTU9OT1RPTklDIHRvIGF2b2lkIHdhcnAgb24gUlRDIGFkanVzdG1lbnRzLiAqLworCWlmICgoX3RpbWVyX2ZkID0gdGltZXJmZF9jcmVhdGUoQ0xPQ0tfTU9OT1RPTklDLCBURkRfQ0xPRVhFQykpIDwgMCkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgdGltZXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VjcyA9ICh0aW1lX3QpIF9pbnRlcnZhbCAvIE5TRUNfUEVSX1NFQzsKKwluc2VjcyA9IChsb25nKSBfaW50ZXJ2YWwgJSBOU0VDX1BFUl9TRUM7CisKKwkvKiBNdXN0IHNldCBpbnRlcnZhbCBhbmQgdmFsdWUgdG8gY3JlYXRlIGFuIGFybWVkIHBlcmlvZGljIHRpbWVyLiAqLworCWludGVydmFsX3RpbWVyLml0X2ludGVydmFsLnR2X3NlYyA9IHNlY3M7CisJaW50ZXJ2YWxfdGltZXIuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IG5zZWNzOworCWludGVydmFsX3RpbWVyLml0X3ZhbHVlLnR2X3NlYyA9IHNlY3M7CisJaW50ZXJ2YWxfdGltZXIuaXRfdmFsdWUudHZfbnNlYyA9IG5zZWNzOworCisJbG9nX2RlYnVnKCJTZXR0aW5nIGludGVydmFsIHRpbWVyIHRvOiAiIEZNVHU2NCAicyAlbGRucyIsICh1aW50NjRfdClzZWNzLCBuc2Vjcyk7CisJaWYgKHRpbWVyZmRfc2V0dGltZShfdGltZXJfZmQsIDAsICZpbnRlcnZhbF90aW1lciwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3Qgc2V0IGludGVydmFsIHRpbWVyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG9fdGltZXJmZF93YWl0KHZvaWQpCit7CisJdWludDY0X3QgZXhwaXJlZDsKKwlzc2l6ZV90IGJ5dGVzOworCisJaWYgKF90aW1lcl9mZCA8IDApCisJCXJldHVybl8wOworCisJLyogcmVhZCBvbiB0aW1lcmZkIHJldHVybnMgYSB1aW50NjRfdCBpbiBob3N0IGJ5dGUgb3JkZXIuICovCisJYnl0ZXMgPSByZWFkKF90aW1lcl9mZCwgJmV4cGlyZWQsIHNpemVvZihleHBpcmVkKSk7CisKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCS8qIEVCQURGIGZyb20gaW52YWxpZCB0aW1lcmZkIG9yIEVJTlZBTCBmcm9tIHRvbyBzbWFsbCBidWZmZXIuICovCisJCWxvZ19lcnJvcigiSW50ZXJ2YWwgdGltZXIgd2FpdCBmYWlsZWQ6ICVzIiwKKwkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcmVhZCgyKSBvbiBhIHRpbWVyZmQgZGVzY3JpcHRvciBpcyBndWFyYW50ZWVkIHRvIHJldHVybiA4IGJ5dGVzLiAqLworCWlmIChieXRlcyAhPSA4KQorCQlsb2dfZXJyb3IoIlVuZXhwZWN0ZWQgYnl0ZSBjb3VudCBvbiB0aW1lcmZkIHJlYWQ6ICIgRk1Uc3NpemVfdCwgYnl0ZXMpOworCisJLyogRklYTUU6IGF0dGVtcHQgdG8gcmViYXNlIGNsb2NrPyAqLworCWlmIChleHBpcmVkID4gMSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFRyeSBpbmNyZWFzaW5nIC0taW50ZXJ2YWwgKCJGTVR1NjQKKwkJCSAiIG1pc3NlZCB0aW1lciBldmVudHMpLiIsIGV4cGlyZWQgLSAxKTsKKworCS8qIFNpZ25hbCB0aGF0IGEgbmV3IGludGVydmFsIGhhcyBiZWd1bi4gKi8KKwlfbmV3X2ludGVydmFsID0gMTsKKworCS8qIEZpbmFsIGludGVydmFsPyAqLworCWlmIChfY291bnQgPT0gMikgeworCQlpZiAoY2xvc2UoX3RpbWVyX2ZkKSkKKwkJCXN0YWNrOworCQkvKiBUZWxsIF91cGRhdGVfaW50ZXJ2YWxfdGltZXMoKSB0byBzaHV0IGRvd24uICovCisJCV90aW1lcl9mZCA9IFRJTUVSX1NUT1BQRUQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXJ0X3RpbWVyKHZvaWQpCit7CisJcmV0dXJuIF9zdGFydF90aW1lcmZkX3RpbWVyKCk7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3RpbWVyX3dhaXQodm9pZCkKK3sKKwlyZXR1cm4gX2RvX3RpbWVyZmRfd2FpdCgpOworfQorCisjZWxzZSAvKiAhSEFWRV9TWVNfVElNRVJGRF9IICovCitzdGF0aWMgaW50IF9zdGFydF91c2xlZXBfdGltZXIodm9pZCkKK3sKKwlsb2dfZGVidWcoIlVzaW5nIHVzbGVlcCBmb3IgaW50ZXJ2YWwgdGltZWtlZXBpbmcuIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3VzbGVlcF93YWl0KHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBkbV90aW1lc3RhbXAgKl9sYXN0X3NsZWVwLCAqX25vdyA9IE5VTEw7CisJdWludDY0X3QgdGhpc19pbnRlcnZhbDsKKwlpbnQ2NF90IGRlbHRhX3Q7CisKKwkvKgorCSAqIFJlcG9ydCBjbG9jazogY29tcGVuc2F0ZSBmb3IgdGltZSBzcGVudCBpbiB1c2Vyc3BhY2UgYW5kIHN0YXRzCisJICogbWVzc2FnZSBpb2N0bHMgYnkga2VlcGluZyB0cmFjayBvZiB0aGUgbGFzdCB3YWtlIHRpbWUgYW5kCisJICogYWRqdXN0aW5nIHRoZSBzbGVlcCBpbnRlcnZhbCBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAoIV9sYXN0X3NsZWVwICYmICFfbm93KSB7CisJCWlmICghKF9sYXN0X3NsZWVwID0gZG1fdGltZXN0YW1wX2FsbG9jKCkpKQorCQkJcmV0dXJuXzA7CisJCWlmICghKF9ub3cgPSBkbV90aW1lc3RhbXBfYWxsb2MoKSkpCisJCQlyZXR1cm5fMDsKKwkJZG1fdGltZXN0YW1wX2dldChfbm93KTsKKwkJdGhpc19pbnRlcnZhbCA9IF9pbnRlcnZhbDsKKwkJbG9nX2Vycm9yKCJVc2luZyAiRk1UdTY0IiBhcyBmaXJzdCBpbnRlcnZhbC4iLCB0aGlzX2ludGVydmFsKTsKKwl9IGVsc2UgeworCQlkbV90aW1lc3RhbXBfZ2V0KF9ub3cpOworCQlkZWx0YV90ID0gZG1fdGltZXN0YW1wX2RlbHRhKF9ub3csIF9sYXN0X3NsZWVwKTsKKwkJbG9nX2RlYnVnKCJJbnRlcnZhbCB0aW1lciBkZWx0YV90OiAiRk1UaTY0LCBkZWx0YV90KTsKKworCQkvKiBGSVhNRTogdXNsZWVwIHRpbWVyIGRyaWZ0IG92ZXIgbGFyZ2UgY291bnRzLiAqLworCisJCS8qIGFkanVzdCBmb3IgdGltZSBzcGVudCBwb3B1bGF0aW5nIGFuZCByZXBvcnRpbmcgKi8KKwkJdGhpc19pbnRlcnZhbCA9IDIgKiBfaW50ZXJ2YWwgLSBkZWx0YV90OworCQlsb2dfZGVidWcoIlVzaW5nICJGTVR1NjQiIGFzIGludGVydmFsLiIsIHRoaXNfaW50ZXJ2YWwpOworCX0KKworCS8qIFNpZ25hbCB0aGF0IGEgbmV3IGludGVydmFsIGhhcyBiZWd1bi4gKi8KKwlfbmV3X2ludGVydmFsID0gMTsKKwlkbV90aW1lc3RhbXBfY29weShfbGFzdF9zbGVlcCwgX25vdyk7CisKKwlpZiAodXNsZWVwKHRoaXNfaW50ZXJ2YWwgLyBOU0VDX1BFUl9VU0VDKSkgeworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQlsb2dfZXJyb3IoIlJlcG9ydCBpbnRlcnZhbCBpbnRlcnJ1cHRlZCBieSBzaWduYWwuIik7CisJCWlmIChlcnJubyA9PSBFSU5WQUwpCisJCQlsb2dfZXJyb3IoIlJlcG9ydCBpbnRlcnZhbCB0b28gc2hvcnQuIik7CisJCXJldHVybl8wOworCX0KKworCWlmIChfY291bnQgPT0gMikgeworCQlkbV90aW1lc3RhbXBfZGVzdHJveShfbGFzdF9zbGVlcCk7CisJCWRtX3RpbWVzdGFtcF9kZXN0cm95KF9ub3cpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGFydF90aW1lcih2b2lkKQoreworCXJldHVybiBfc3RhcnRfdXNsZWVwX3RpbWVyKCk7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3RpbWVyX3dhaXQodm9pZCkKK3sKKwlyZXR1cm4gX2RvX3VzbGVlcF93YWl0KCk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1NZU19USU1FUkZEX0ggKi8KKworc3RhdGljIGludCBfdXBkYXRlX2ludGVydmFsX3RpbWVzKHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBkbV90aW1lc3RhbXAgKnRoaXNfdGltZXN0YW1wID0gTlVMTDsKKwl1aW50NjRfdCBkZWx0YV90LCBpbnRlcnZhbF9udW0gPSBfaW50ZXJ2YWxfbnVtKCk7CisJaW50IHIgPSAxOworCisJLyoKKwkgKiBDbG9jayBzaHV0ZG93biBmb3IgZXhpdCAtIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKChfdGltZXJfZmQgPT0gVElNRVJfU1RPUFBFRCkgJiYgIV9jeWNsZV90aW1lc3RhbXApCisJCWdvdG8gb3V0OworCisJLyogY2xvY2sgaXMgcnVubmluZyAqLworCXIgPSAwOworCisJLyoKKyAgICAgICAgICogQ3VycmVudCB0aW1lc3RhbXAuIElmIF9uZXdfaW50ZXJ2YWwgaXMgc2V0IHRoaXMgaXMgdXNlZCBhcworICAgICAgICAgKiB0aGUgbmV3IGN5Y2xlIHN0YXJ0IHRpbWVzdGFtcC4KKwkgKi8KKwlpZiAoIXRoaXNfdGltZXN0YW1wKSB7CisJCWlmICghKHRoaXNfdGltZXN0YW1wID0gZG1fdGltZXN0YW1wX2FsbG9jKCkpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyoKKwkgKiBUYWtlIGN5Y2xlIHRpbXN0YW1wIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIGlvY3RsIHJldHVybi4KKwkgKgorCSAqIEZJWE1FOiB1c2UgcGVyLXJlZ2lvbiB0aW1lc3RhbXAgZGVsdGFzIGZvciBpbnRlcnZhbCBlc3RpbWF0ZS4KKwkgKi8KKwlpZiAoIWRtX3RpbWVzdGFtcF9nZXQodGhpc190aW1lc3RhbXApKQorCQlnb3RvX291dDsKKworCS8qCisJICogU3RhdHMgY2xvY2s6IG1haW50YWluIGEgc2luZ2xlIHRpbWVzdGFtcCB0YWtlbiBqdXN0IGFmdGVyIHRoZQorCSAqIGNhbGwgdG8gZG1fc3RhdHNfcG9wdWxhdGUoKSBhbmQgdGFrZSBhIGRlbHRhIGJldHdlZW4gdGhlIGN1cnJlbnQKKwkgKiBhbmQgbGFzdCB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHNhbXBsaW5nIGludGVydmFsLgorCSAqCisJICogQSBuZXcgaW50ZXJ2YWwgaXMgc3RhcnRlZCB3aGVuIHRoZSBfbmV3X2ludGVydmFsIGZsYWcgaXMgc2V0CisJICogb24gcmV0dXJuIGZyb20gX2RvX3JlcG9ydF93YWl0KCkuCisJICoKKwkgKiBUaGUgZmlyc3QgaW50ZXJ2YWwgaXMgdHJlYXRlZCBhcyBhIHNwZWNpYWwgY2FzZTogc2luY2UgdGhlCisJICogdGltZSBzaW5jZSB0aGUgbGFzdCBjbGVhciBvZiB0aGUgY291bnRlcnMgaXMgdW5rbm93biAobm8KKwkgKiBwcmV2aW91cyB0aW1lc3RhbXAgZXhpc3RzKSB0aGUgZHVyYXRpb24gaXMgYXNzdW1lZCB0byBiZSB0aGUKKwkgKiBjb25maWd1cmVkIHZhbHVlLgorCSAqLworCWlmIChfY3ljbGVfdGltZXN0YW1wKQorCQkvKiBDdXJyZW50IGRlbHRhX3Q6IHRpbWUgZnJvbSBzdGFydCBvZiBjeWNsZSB0byBub3cuICovCisJCWRlbHRhX3QgPSBkbV90aW1lc3RhbXBfZGVsdGEodGhpc190aW1lc3RhbXAsIF9jeWNsZV90aW1lc3RhbXApOworCWVsc2UgeworCQlfY3ljbGVfdGltZXN0YW1wID0gZG1fdGltZXN0YW1wX2FsbG9jKCk7CisJCWlmICghX2N5Y2xlX3RpbWVzdGFtcCkgeworCQkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgdGltZXN0YW1wIG9iamVjdC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogUHJldGVuZCB3ZSBoYXZlIHRoZSBjb25maWd1cmVkIGludGVydmFsLiAqLworCQlkZWx0YV90ID0gX2ludGVydmFsOworCisJCS8qIHN0YXJ0IHRoZSBmaXJzdCBjeWNsZSAqLworCQlsb2dfZGVidWcoIkJlZ2lubmluZyBmaXJzdCBpbnRlcnZhbCIpOworCQlfbmV3X2ludGVydmFsID0gMTsKKwl9CisKKwlsb2dfZGVidWcoIkludGVydmFsICAgICAjJS00IlBSSXU2NCIgICAgIHRpbWUgZGVsdGE6ICUxMiIKKwkJICBQUkl1NjQibnMiLCBpbnRlcnZhbF9udW0sIGRlbHRhX3QpOworCisJaWYgKF9uZXdfaW50ZXJ2YWwpIHsKKwkJLyogVXBkYXRlIHRpbWVzdGFtcCBhbmQgaW50ZXJ2YWwgYW5kIGNsZWFyIF9uZXdfaW50ZXJ2YWwgKi8KKwkJZG1fdGltZXN0YW1wX2NvcHkoX2N5Y2xlX3RpbWVzdGFtcCwgdGhpc190aW1lc3RhbXApOworCQlfbGFzdF9pbnRlcnZhbCA9IGRlbHRhX3Q7CisJCV9uZXdfaW50ZXJ2YWwgPSAwOworCisJCS8qCisJCSAqIExvZyBpbnRlcnZhbCBkdXJhdGlvbiBhbmQgY3VycmVudCBlcnJvci4KKwkJICovCisJCWxvZ19kZWJ1ZygiSW50ZXJ2YWwgICAgICMlLTUiUFJJdTY0IiAgIGN1cnJlbnQgZXJyOiAlMTIiUFJJaTY0Im5zIiwKKwkJCSAgaW50ZXJ2YWxfbnVtLCAoKGludDY0X3QpX2xhc3RfaW50ZXJ2YWwgLSAoaW50NjRfdClfaW50ZXJ2YWwpKTsKKwkJbG9nX2RlYnVnKCJFbmQgaW50ZXJ2YWwgIyUtOSJQUkl1NjQiICBkdXJhdGlvbjogJTEyIlBSSXU2NCJucyIsCisJCQkgIGludGVydmFsX251bSwgX2xhc3RfaW50ZXJ2YWwpOworCX0KKworCXIgPSAxOworCitvdXQ6CisJLyogdGltZXIgc3RvcHBlZCBvciBuZXZlciBzdGFydGVkICovCisJaWYgKCFyIHx8IF90aW1lcl9mZCA8IDApIHsKKwkJLyogVGhlIF9jeWNsZV90aW1lc3RhbXAgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQgaWYgd2UKKwkJICogZmFpbCB0byBvYnRhaW4gdGhpc190aW1lc3RhbXAgb24gdGhlIGZpcnN0IGludGVydmFsLgorCQkgKi8KKwkJaWYgKF9jeWNsZV90aW1lc3RhbXApCisJCQlkbV90aW1lc3RhbXBfZGVzdHJveShfY3ljbGVfdGltZXN0YW1wKTsKKwkJZG1fdGltZXN0YW1wX2Rlc3Ryb3kodGhpc190aW1lc3RhbXApOworCisJCS8qIENsZWFyIHRpbWVzdGFtcCBwb2ludGVycyB0byBzaWduYWwgc2h1dGRvd24uICovCisJCV9jeWNsZV90aW1lc3RhbXAgPSB0aGlzX3RpbWVzdGFtcCA9IE5VTEw7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9kaXNwbGF5X2luZm9fY29scyhzdHJ1Y3QgZG1fdGFzayAqZG10LCBzdHJ1Y3QgZG1faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZG1zZXR1cF9yZXBvcnRfb2JqIG9iajsKKwl1aW50NjRfdCB3YWxrX2ZsYWdzID0gX3N0YXRzdHlwZTsKKwlpbnQgciA9IDA7CisKKwlpZiAoIWluZm8tPmV4aXN0cykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRldmljZSBkb2VzIG5vdCBleGlzdC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlvYmoudGFzayA9IGRtdDsKKwlvYmouaW5mbyA9IGluZm87CisJb2JqLmRlcHNfdGFzayA9IE5VTEw7CisJb2JqLnNwbGl0X25hbWUgPSBOVUxMOworCW9iai5zdGF0cyA9IE5VTEw7CisKKwlpZiAoX3JlcG9ydF90eXBlICYgRFJfVFJFRSkKKwkJaWYgKCEob2JqLnRyZWVfbm9kZSA9IGRtX3RyZWVfZmluZF9ub2RlKF9kdHJlZSwgaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKSkpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGZpbmQgbm9kZSAlZDolZC4iLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCQkJZ290byBvdXQ7CisJCX0KKworCWlmIChfcmVwb3J0X3R5cGUgJiBEUl9ERVBTKQorCQlpZiAoIShvYmouZGVwc190YXNrID0gX2dldF9kZXBzX3Rhc2soaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKSkpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGdldCBkZXBzIGZvciAlZDolZC4iLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCQkJZ290byBvdXQ7CisJCX0KKworCWlmIChfcmVwb3J0X3R5cGUgJiBEUl9OQU1FKQorCQlpZiAoIShvYmouc3BsaXRfbmFtZSA9IF9nZXRfc3BsaXRfbmFtZShkbV90YXNrX2dldF91dWlkKGRtdCksCisJCQkJCQkgICAgICAgZG1fdGFza19nZXRfbmFtZShkbXQpLCAnLScpKSkKKwkJCWdvdG9fb3V0OworCisJaWYgKCEoX3JlcG9ydF90eXBlICYgKERSX1NUQVRTIHwgRFJfU1RBVFNfTUVUQSkpKSB7CisJCWlmICghZG1fcmVwb3J0X29iamVjdChfcmVwb3J0LCAmb2JqKSkKKwkJCWdvdG9fb3V0OworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBPYnRhaW4gc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgcmVwb3J0aW5nIG9iamVjdCBhbmQgc2V0CisJICogdGhlIGludGVydmFsIGVzdGltYXRlIHVzZWQgZm9yIHN0YXRzIHJhdGUgY29udmVyc2lvbi4KKwkgKi8KKwlpZiAoX3JlcG9ydF90eXBlICYgRFJfU1RBVFMpIHsKKwkJaWYgKCEob2JqLnN0YXRzID0gZG1fc3RhdHNfY3JlYXRlKERNX1NUQVRTX1BST0dSQU1fSUQpKSkKKwkJCWdvdG9fb3V0OworCisJCWRtX3N0YXRzX2JpbmRfZGV2bm8ob2JqLnN0YXRzLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCisJCWlmICghZG1fc3RhdHNfcG9wdWxhdGUob2JqLnN0YXRzLCBfcHJvZ3JhbV9pZCwgRE1fU1RBVFNfUkVHSU9OU19BTEwpKQorCQkJZ290b19vdXQ7CisKKwkJLyogVXBkYXRlIHRpbWVzdGFtcHMgYW5kIGhhbmRsZSBlbmQtb2YtaW50ZXJ2YWwgYWNjb3VudGluZy4gKi8KKwkJX3VwZGF0ZV9pbnRlcnZhbF90aW1lcygpOworCisJCWxvZ19kZWJ1ZygiQWRqdXN0ZWQgc2FtcGxlIGludGVydmFsIGR1cmF0aW9uOiAlMTIiUFJJdTY0Im5zIiwgX2xhc3RfaW50ZXJ2YWwpOworCQkvKiB1c2UgbWVhc3VyZWQgYXBwcm94aW1hdGlvbiBmb3IgY2FsY3VsYXRpb25zICovCisJCWRtX3N0YXRzX3NldF9zYW1wbGluZ19pbnRlcnZhbF9ucyhvYmouc3RhdHMsIF9sYXN0X2ludGVydmFsKTsKKwl9IGVsc2UgaWYgKCFvYmouc3RhdHMgJiYgKF9yZXBvcnRfdHlwZSAmIERSX1NUQVRTX01FVEEpCisJCS8qIE9ubHkgYSBkbV9zdGF0c19saXN0IGlzIG5lZWRlZCBmb3IgRFJfU1RBVFNfTUVUQSByZXBvcnRzLiAqLworCQkgICAgJiYgIShfcmVwb3J0X3R5cGUgJiBEUl9TVEFUUykpIHsKKwkJaWYgKCEob2JqLnN0YXRzID0gZG1fc3RhdHNfY3JlYXRlKERNX1NUQVRTX1BST0dSQU1fSUQpKSkKKwkJCWdvdG9fb3V0OworCisJCWRtX3N0YXRzX2JpbmRfZGV2bm8ob2JqLnN0YXRzLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCisJCWlmICghZG1fc3RhdHNfbGlzdChvYmouc3RhdHMsIF9wcm9ncmFtX2lkKSkKKwkJCWdvdG9fb3V0OworCisJCS8qIE5vIHJlZ2lvbnMgdG8gcmVwb3J0IGlzIG5vdCBhbiBlcnJvciAqLworCQlpZiAoIWRtX3N0YXRzX2dldF9ucl9yZWdpb25zKG9iai5zdGF0cykpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBncm91cCByZXBvcnQgd2l0aCBubyBncm91cHM/ICovCisJaWYgKCh3YWxrX2ZsYWdzID09IERNX1NUQVRTX1dBTEtfR1JPVVApCisJICAgICYmICFkbV9zdGF0c19nZXRfbnJfZ3JvdXBzKG9iai5zdGF0cykpCisJCWdvdG8gb3V0OworCisJZG1fc3RhdHNfd2Fsa19pbml0KG9iai5zdGF0cywgd2Fsa19mbGFncyk7CisJZG1fc3RhdHNfd2Fsa19kbyhvYmouc3RhdHMpIHsKKwkJaWYgKCFkbV9yZXBvcnRfb2JqZWN0KF9yZXBvcnQsICZvYmopKQorCQkJZ290b19vdXQ7CisJCWRtX3N0YXRzX3dhbGtfbmV4dChvYmouc3RhdHMpOworCX0gZG1fc3RhdHNfd2Fsa193aGlsZShvYmouc3RhdHMpOworCisJciA9IDE7CisKK291dDoKKwlpZiAob2JqLmRlcHNfdGFzaykKKwkJZG1fdGFza19kZXN0cm95KG9iai5kZXBzX3Rhc2spOworCWlmIChvYmouc3BsaXRfbmFtZSkKKwkJX2Rlc3Ryb3lfc3BsaXRfbmFtZShvYmouc3BsaXRfbmFtZSk7CisJaWYgKG9iai5zdGF0cykKKwkJZG1fc3RhdHNfZGVzdHJveShvYmouc3RhdHMpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfZGlzcGxheV9pbmZvX2xvbmcoc3RydWN0IGRtX3Rhc2sgKmRtdCwgc3RydWN0IGRtX2luZm8gKmluZm8pCit7CisJY29uc3QgY2hhciAqdXVpZDsKKwl1aW50MzJfdCByZWFkX2FoZWFkOworCisJaWYgKCFpbmZvLT5leGlzdHMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJEZXZpY2UgZG9lcyBub3QgZXhpc3QuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiTmFtZTogICAgICAgICAgICAgICVzXG4iLCBkbV90YXNrX2dldF9uYW1lKGRtdCkpOworCisJcHJpbnRmKCJTdGF0ZTogICAgICAgICAgICAgJXMlcyVzXG4iLAorCSAgICAgICBpbmZvLT5zdXNwZW5kZWQgPyAiU1VTUEVOREVEIiA6ICJBQ1RJVkUiLAorCSAgICAgICBpbmZvLT5yZWFkX29ubHkgPyAiIChSRUFELU9OTFkpIiA6ICIiLAorCSAgICAgICBpbmZvLT5kZWZlcnJlZF9yZW1vdmUgPyAiIChERUZFUlJFRCBSRU1PVkUpIiA6ICIiKTsKKworCS8qIEZJWE1FIE9sZCB2YWx1ZSBpcyBiZWluZyBwcmludGVkIHdoZW4gaXQncyBiZWluZyBjaGFuZ2VkLiAqLworCWlmIChkbV90YXNrX2dldF9yZWFkX2FoZWFkKGRtdCwgJnJlYWRfYWhlYWQpKQorCQlwcmludGYoIlJlYWQgQWhlYWQ6ICAgICAgICAlIiBQUkl1MzIgIlxuIiwgcmVhZF9haGVhZCk7CisKKwlpZiAoIWluZm8tPmxpdmVfdGFibGUgJiYgIWluZm8tPmluYWN0aXZlX3RhYmxlKQorCQlwcmludGYoIlRhYmxlcyBwcmVzZW50OiAgICBOb25lXG4iKTsKKwllbHNlCisJCXByaW50ZigiVGFibGVzIHByZXNlbnQ6ICAgICVzJXMlc1xuIiwKKwkJICAgICAgIGluZm8tPmxpdmVfdGFibGUgPyAiTElWRSIgOiAiIiwKKwkJICAgICAgIGluZm8tPmxpdmVfdGFibGUgJiYgaW5mby0+aW5hY3RpdmVfdGFibGUgPyAiICYgIiA6ICIiLAorCQkgICAgICAgaW5mby0+aW5hY3RpdmVfdGFibGUgPyAiSU5BQ1RJVkUiIDogIiIpOworCisJaWYgKGluZm8tPm9wZW5fY291bnQgIT0gLTEpCisJCXByaW50ZigiT3BlbiBjb3VudDogICAgICAgICVkXG4iLCBpbmZvLT5vcGVuX2NvdW50KTsKKworCXByaW50ZigiRXZlbnQgbnVtYmVyOiAgICAgICUiIFBSSXUzMiAiXG4iLCBpbmZvLT5ldmVudF9ucik7CisJcHJpbnRmKCJNYWpvciwgbWlub3I6ICAgICAgJWQsICVkXG4iLCBpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpOworCisJaWYgKGluZm8tPnRhcmdldF9jb3VudCAhPSAtMSkKKwkJcHJpbnRmKCJOdW1iZXIgb2YgdGFyZ2V0czogJWRcbiIsIGluZm8tPnRhcmdldF9jb3VudCk7CisKKwlpZiAoKHV1aWQgPSBkbV90YXNrX2dldF91dWlkKGRtdCkpICYmICp1dWlkKQorCQlwcmludGYoIlVVSUQ6ICVzXG4iLCB1dWlkKTsKKworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBfZGlzcGxheV9pbmZvKHN0cnVjdCBkbV90YXNrICpkbXQpCit7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKworCWlmICghZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9zd2l0Y2hlc1tDT0xTX0FSR10pCisJCV9kaXNwbGF5X2luZm9fbG9uZyhkbXQsICZpbmZvKTsKKwllbHNlCisJCS8qIEZJWE1FIHJldHVybiBjb2RlICovCisJCV9kaXNwbGF5X2luZm9fY29scyhkbXQsICZpbmZvKTsKKworCXJldHVybiBpbmZvLmV4aXN0cyA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IF9zZXRfdGFza19kZXZpY2Uoc3RydWN0IGRtX3Rhc2sgKmRtdCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9wdGlvbmFsKQoreworCWlmIChuYW1lKSB7CisJCWlmICghZG1fdGFza19zZXRfbmFtZShkbXQsIG5hbWUpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmIChfc3dpdGNoZXNbVVVJRF9BUkddKSB7CisJCWlmICghZG1fdGFza19zZXRfdXVpZChkbXQsIF91dWlkKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSBpZiAoX3N3aXRjaGVzW01BSk9SX0FSR10gJiYgX3N3aXRjaGVzW01JTk9SX0FSR10pIHsKKwkJaWYgKCFkbV90YXNrX3NldF9tYWpvcihkbXQsIF9pbnRfYXJnc1tNQUpPUl9BUkddKSB8fAorCQkgICAgIWRtX3Rhc2tfc2V0X21pbm9yKGRtdCwgX2ludF9hcmdzW01JTk9SX0FSR10pKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmICghb3B0aW9uYWwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBkZXZpY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zZXRfdGFza19hZGRfbm9kZShzdHJ1Y3QgZG1fdGFzayAqZG10KQoreworCWlmICghZG1fdGFza19zZXRfYWRkX25vZGUoZG10LCBERUZBVUxUX0RNX0FERF9OT0RFKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoX3N3aXRjaGVzW0FERF9OT0RFX09OX1JFU1VNRV9BUkddICYmCisJICAgICFkbV90YXNrX3NldF9hZGRfbm9kZShkbXQsIERNX0FERF9OT0RFX09OX1JFU1VNRSkpCisJCXJldHVybl8wOworCisJaWYgKF9zd2l0Y2hlc1tBRERfTk9ERV9PTl9DUkVBVEVfQVJHXSAmJgorCSAgICAhZG1fdGFza19zZXRfYWRkX25vZGUoZG10LCBETV9BRERfTk9ERV9PTl9DUkVBVEUpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sb2FkKENNRF9BUkdTKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCWNvbnN0IGNoYXIgKmZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisJaWYgKF9zd2l0Y2hlc1tOT1RBQkxFX0FSR10pIHsKKwkJZXJyKCItLW5vdGFibGUgb25seSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZyBuZXcgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfc3dpdGNoZXNbVVVJRF9BUkddICYmICFfc3dpdGNoZXNbTUFKT1JfQVJHXSkgeworCQlpZiAoIWFyZ2MpIHsKKwkJCWVycigiUGxlYXNlIHNwZWNpZnkgZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQluYW1lID0gYXJndlswXTsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfSBlbHNlIGlmIChhcmdjID4gMSkgeworCQllcnIoIlRvbyBtYW55IGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ2MgPT0gMSkKKwkJZmlsZSA9IGFyZ3ZbMF07CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfUkVMT0FEKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgbmFtZSwgMCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfc3dpdGNoZXNbTk9UQUJMRV9BUkddICYmICFfcGFyc2VfZmlsZShkbXQsIGZpbGUpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbUkVBRF9PTkxZXSAmJiAhZG1fdGFza19zZXRfcm8oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10gJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJciA9IDE7CisKKwlpZiAoX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJciA9IF9kaXNwbGF5X2luZm8oZG10KTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZShDTURfQVJHUykKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljb25zdCBjaGFyICpmaWxlID0gTlVMTDsKKwl1aW50MzJfdCBjb29raWUgPSAwOworCXVpbnQxNl90IHVkZXZfZmxhZ3MgPSAwOworCisJaWYgKGFyZ2MgPT0gMikKKwkJZmlsZSA9IGFyZ3ZbMV07CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfQ1JFQVRFKSkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV90YXNrX3NldF9uYW1lKGRtdCwgYXJndlswXSkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIWRtX3Rhc2tfc2V0X3V1aWQoZG10LCBfdXVpZCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfc3dpdGNoZXNbTk9UQUJMRV9BUkddICYmICFfcGFyc2VfZmlsZShkbXQsIGZpbGUpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbUkVBRF9PTkxZXSAmJiAhZG1fdGFza19zZXRfcm8oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW01BSk9SX0FSR10gJiYgIWRtX3Rhc2tfc2V0X21ham9yKGRtdCwgX2ludF9hcmdzW01BSk9SX0FSR10pKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTUlOT1JfQVJHXSAmJiAhZG1fdGFza19zZXRfbWlub3IoZG10LCBfaW50X2FyZ3NbTUlOT1JfQVJHXSkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tVSURfQVJHXSAmJiAhZG1fdGFza19zZXRfdWlkKGRtdCwgX2ludF9hcmdzW1VJRF9BUkddKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0dJRF9BUkddICYmICFkbV90YXNrX3NldF9naWQoZG10LCBfaW50X2FyZ3NbR0lEX0FSR10pKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTU9ERV9BUkddICYmICFkbV90YXNrX3NldF9tb2RlKGRtdCwgX2ludF9hcmdzW01PREVfQVJHXSkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT09QRU5DT1VOVF9BUkddICYmICFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0lOQUNUSVZFX0FSR10gJiYgIWRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW1JFQURBSEVBRF9BUkddICYmCisJICAgICFkbV90YXNrX3NldF9yZWFkX2FoZWFkKGRtdCwgX2ludF9hcmdzW1JFQURBSEVBRF9BUkddLAorCQkJCSAgICBfcmVhZF9haGVhZF9mbGFncykpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT1RBQkxFX0FSR10pCisJCWRtX3VkZXZfc2V0X3N5bmNfc3VwcG9ydCgwKTsKKworCWlmIChfc3dpdGNoZXNbTk9VREVWUlVMRVNfQVJHXSkKKwkJdWRldl9mbGFncyB8PSBETV9VREVWX0RJU0FCTEVfRE1fUlVMRVNfRkxBRyB8CisJCQkgICAgICBETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUc7CisKKwlpZiAoX3N3aXRjaGVzW0NIRUNLU19BUkddICYmICFkbV90YXNrX2VuYWJsZV9jaGVja3MoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9zZXRfdGFza19hZGRfbm9kZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfdWRldl9jb29raWUpCisJCWNvb2tpZSA9IF91ZGV2X2Nvb2tpZTsKKworCWlmIChfdWRldl9vbmx5KQorCQl1ZGV2X2ZsYWdzIHw9IERNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLOworCisJaWYgKCFkbV90YXNrX3NldF9jb29raWUoZG10LCAmY29va2llLCB1ZGV2X2ZsYWdzKSB8fAorCSAgICAhX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJciA9IDE7CisKK291dDoKKwlpZiAoIV91ZGV2X2Nvb2tpZSkKKwkJKHZvaWQpIGRtX3VkZXZfd2FpdChjb29raWUpOworCisJaWYgKHIgJiYgX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJciA9IF9kaXNwbGF5X2luZm8oZG10KTsKKworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3JlbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpuZXdfbmFtZSwgY29uc3QgY2hhciAqbmV3X3V1aWQpIHsKKwlpbnQgciA9IDA7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwl1aW50MzJfdCBjb29raWUgPSAwOworCXVpbnQxNl90IHVkZXZfZmxhZ3MgPSAwOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX1JFTkFNRSkpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FIEtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgdXVpZCBvciBkZXZpY2UgbnVtYmVyIGhlcmUgeWV0ICovCisJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgbmFtZSwgMCkpCisJCWdvdG9fb3V0OworCisJaWYgKG5ld191dWlkKSB7CisJCWlmICghZG1fdGFza19zZXRfbmV3dXVpZChkbXQsIG5ld191dWlkKSkKKwkJCWdvdG9fb3V0OworCX0gZWxzZSBpZiAoIW5ld19uYW1lIHx8ICFkbV90YXNrX3NldF9uZXduYW1lKGRtdCwgbmV3X25hbWUpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTk9PUEVOQ09VTlRfQVJHXSAmJiAhZG1fdGFza19ub19vcGVuX2NvdW50KGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tJTkFDVElWRV9BUkddICYmICFkbV90YXNrX3F1ZXJ5X2luYWN0aXZlX3RhYmxlKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tDSEVDS1NfQVJHXSAmJiAhZG1fdGFza19lbmFibGVfY2hlY2tzKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT1VERVZSVUxFU19BUkddKQorCQl1ZGV2X2ZsYWdzIHw9IERNX1VERVZfRElTQUJMRV9ETV9SVUxFU19GTEFHIHwKKwkJCSAgICAgIERNX1VERVZfRElTQUJMRV9TVUJTWVNURU1fUlVMRVNfRkxBRzsKKworCWlmIChfdWRldl9jb29raWUpCisJCWNvb2tpZSA9IF91ZGV2X2Nvb2tpZTsKKworCWlmIChfdWRldl9vbmx5KQorCQl1ZGV2X2ZsYWdzIHw9IERNX1VERVZfRElTQUJMRV9MSUJSQVJZX0ZBTExCQUNLOworCisJaWYgKCFkbV90YXNrX3NldF9jb29raWUoZG10LCAmY29va2llLCB1ZGV2X2ZsYWdzKSB8fAorCSAgICAhX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJciA9IDE7CisKK291dDoKKwlpZiAoIV91ZGV2X2Nvb2tpZSkKKwkJKHZvaWQpIGRtX3VkZXZfd2FpdChjb29raWUpOworCisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcmVuYW1lKENNRF9BUkdTKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSAoYXJnYyA9PSAyKSA/IGFyZ3ZbMF0gOiBOVUxMOworCisJcmV0dXJuIF9zd2l0Y2hlc1tTRVRVVUlEX0FSR10gPyBfZG9fcmVuYW1lKG5hbWUsIE5VTEwsIGFyZ3ZbYXJnYyAtIDFdKSA6CisJCQkJCV9kb19yZW5hbWUobmFtZSwgYXJndlthcmdjIC0gMV0sIE5VTEwpOworCit9CisKK3N0YXRpYyBpbnQgX21lc3NhZ2UoQ01EX0FSR1MpCit7CisJaW50IHIgPSAwLCBpOworCXNpemVfdCBzeiA9IDE7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljaGFyICpzdHI7CisJY29uc3QgY2hhciAqcmVzcG9uc2U7CisJdWludDY0X3Qgc2VjdG9yOworCWNoYXIgKmVuZHB0cjsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9UQVJHRVRfTVNHKSkpCisJCXJldHVybl8wOworCisJaWYgKF9zd2l0Y2hlc1tVVUlEX0FSR10gfHwgX3N3aXRjaGVzW01BSk9SX0FSR10pIHsKKwkJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgTlVMTCwgMCkpCisJCQlnb3RvX291dDsKKwl9IGVsc2UgeworCQlpZiAoIV9zZXRfdGFza19kZXZpY2UoZG10LCBhcmd2WzBdLCAwKSkKKwkJCWdvdG9fb3V0OworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlzZWN0b3IgPSBzdHJ0b3VsbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgfHwgZW5kcHRyID09IGFyZ3ZbMF0pIHsKKwkJZXJyKCJpbnZhbGlkIHNlY3RvciIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFkbV90YXNrX3NldF9zZWN0b3IoZG10LCBzZWN0b3IpKQorCQlnb3RvX291dDsKKworCWFyZ2MtLTsKKwlhcmd2Kys7CisKKwlpZiAoYXJnYyA8PSAwKQorCQllcnIoIk5vIG1lc3NhZ2Ugc3VwcGxpZWQuXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCXN6ICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CisKKwlpZiAoIShzdHIgPSBkbV96YWxsb2Moc3opKSkgeworCQllcnIoIm1lc3NhZ2Ugc3RyaW5nIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKGkpCisJCQlzdHJjYXQoc3RyLCAiICIpOworCQlzdHJjYXQoc3RyLCBhcmd2W2ldKTsKKwl9CisKKwlpID0gZG1fdGFza19zZXRfbWVzc2FnZShkbXQsIHN0cik7CisKKwlkbV9mcmVlKHN0cik7CisKKwlpZiAoIWkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT09QRU5DT1VOVF9BUkddICYmICFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0lOQUNUSVZFX0FSR10gJiYgIWRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0NIRUNLU19BUkddICYmICFkbV90YXNrX2VuYWJsZV9jaGVja3MoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCWlmICgocmVzcG9uc2UgPSBkbV90YXNrX2dldF9tZXNzYWdlX3Jlc3BvbnNlKGRtdCkpKSB7CisJCWlmICghKnJlc3BvbnNlIHx8IHJlc3BvbnNlW3N0cmxlbihyZXNwb25zZSkgLSAxXSA9PSAnXG4nKQorCQkJZnB1dHMocmVzcG9uc2UsIHN0ZG91dCk7CisJCWVsc2UKKwkJCXB1dHMocmVzcG9uc2UpOworCX0KKworCXIgPSAxOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfc2V0Z2VvbWV0cnkoQ01EX0FSR1MpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfU0VUX0dFT01FVFJZKSkpCisJCXJldHVybl8wOworCisJaWYgKF9zd2l0Y2hlc1tVVUlEX0FSR10gfHwgX3N3aXRjaGVzW01BSk9SX0FSR10pIHsKKwkJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgTlVMTCwgMCkpCisJCQlnb3RvX291dDsKKwl9IGVsc2UgeworCQlpZiAoIV9zZXRfdGFza19kZXZpY2UoZG10LCBhcmd2WzBdLCAwKSkKKwkJCWdvdG9fb3V0OworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoIWRtX3Rhc2tfc2V0X2dlb21ldHJ5KGRtdCwgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT09QRU5DT1VOVF9BUkddICYmICFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0lOQUNUSVZFX0FSR10gJiYgIWRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0NIRUNLU19BUkddICYmICFkbV90YXNrX2VuYWJsZV9jaGVja3MoZG10KSkKKwkJZ290b19vdXQ7CisKKwkvKiBydW4gdGhlIHRhc2sgKi8KKwlpZiAoIV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCXIgPSAxOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfc3BsaXRuYW1lKENNRF9BUkdTKQoreworCXN0cnVjdCBkbXNldHVwX3JlcG9ydF9vYmogb2JqID0geyBOVUxMIH07CisJaW50IHI7CisKKwlpZiAoIShvYmouc3BsaXRfbmFtZSA9IF9nZXRfc3BsaXRfbmFtZSgoYXJnYyA9PSAyKSA/IGFyZ3ZbMV0gOiAiTFZNIiwKKwkJCQkJICAgICAgIGFyZ3ZbMF0sICdcMCcpKSkKKwkJcmV0dXJuXzA7CisKKwlyID0gZG1fcmVwb3J0X29iamVjdChfcmVwb3J0LCAmb2JqKTsKKwlfZGVzdHJveV9zcGxpdF9uYW1lKG9iai5zcGxpdF9uYW1lKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdWludDMyX3QgX2dldF9jb29raWVfdmFsdWUoY29uc3QgY2hhciAqc3RyX3ZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgaW50IHZhbHVlOworCWNoYXIgKnA7CisKKwllcnJubyA9IDA7CisJaWYgKCEodmFsdWUgPSBzdHJ0b3VsKHN0cl92YWx1ZSwgJnAsIDApKSB8fAorCSAgICAqcCB8fAorCSAgICAodmFsdWUgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkgfHwKKwkgICAgdmFsdWUgPiAweEZGRkZGRkZGKSB7CisJCWVycigiSW5jb3JyZWN0IGNvb2tpZSB2YWx1ZSIpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCQlyZXR1cm4gKHVpbnQzMl90KSB2YWx1ZTsKK30KKworc3RhdGljIGludCBfdWRldmZsYWdzKENNRF9BUkdTKQoreworCXVpbnQzMl90IGNvb2tpZTsKKwl1aW50MTZfdCBmbGFnczsKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgY2hhciAqZG1fZmxhZ19uYW1lc1tdID0geyJESVNBQkxFX0RNX1JVTEVTIiwKKwkJCQkJICAgICAgIkRJU0FCTEVfU1VCU1lTVEVNX1JVTEVTIiwKKwkJCQkJICAgICAgIkRJU0FCTEVfRElTS19SVUxFUyIsCisJCQkJCSAgICAgICJESVNBQkxFX09USEVSX1JVTEVTIiwKKwkJCQkJICAgICAgIkxPV19QUklPUklUWSIsCisJCQkJCSAgICAgICJESVNBQkxFX0xJQlJBUllfRkFMTEJBQ0siLAorCQkJCQkgICAgICAiUFJJTUFSWV9TT1VSQ0UiLAorCQkJCQkgICAgICAgMH07CisKKwlpZiAoIShjb29raWUgPSBfZ2V0X2Nvb2tpZV92YWx1ZShhcmd2WzBdKSkpCisJCXJldHVybl8wOworCisJZmxhZ3MgPSBjb29raWUgPj4gRE1fVURFVl9GTEFHU19TSElGVDsKKworCWZvciAoaSA9IDA7IGkgPCBETV9VREVWX0ZMQUdTX1NISUZUOyBpKyspCisJCWlmICgxIDw8IGkgJiBmbGFncykgeworCQkJaWYgKGkgPCBETV9VREVWX0ZMQUdTX1NISUZUIC8gMiAmJiBkbV9mbGFnX25hbWVzW2ldKQorCQkJCXByaW50ZigiRE1fVURFVl8lc19GTEFHPScxJ1xuIiwgZG1fZmxhZ19uYW1lc1tpXSk7CisJCQllbHNlIGlmIChpIDwgRE1fVURFVl9GTEFHU19TSElGVCAvIDIpCisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIGp1c3QgYSBmYWxsYmFjay4gRWFjaCBuZXcgRE0gZmxhZworCQkJCSAqIHNob3VsZCBoYXZlIGl0cyBzeW1ib2xpYyBuYW1lIGFzc2lnbmVkLgorCQkJCSAqLworCQkJCXByaW50ZigiRE1fVURFVl9GTEFHJWQ9JzEnXG4iLCBpKTsKKwkJCWVsc2UKKwkJCQkvKgorCQkJCSAqIFdlIGNhbid0IGFzc2lnbiBzeW1ib2xpYyBuYW1lcyB0byBzdWJzeXN0ZW0KKwkJCQkgKiBmbGFncy4gVGhlaXIgc2VtYW50aWNzIHZhcnkgYmFzZWQgb24gdGhlCisJCQkJICogc3Vic3lzdGVtIHRoYXQgaXMgY3VycmVudGx5IHVzZWQuCisJCQkJICovCisJCQkJcHJpbnRmKCJETV9TVUJTWVNURU1fVURFVl9GTEFHJWQ9JzEnXG4iLAorCQkJCQlpIC0gRE1fVURFVl9GTEFHU19TSElGVCAvIDIpOworCQl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdWRldmNvbXBsZXRlKENNRF9BUkdTKQoreworCXVpbnQzMl90IGNvb2tpZTsKKworCWlmICghKGNvb2tpZSA9IF9nZXRfY29va2llX3ZhbHVlKGFyZ3ZbMF0pKSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIFN0cmlwIGZsYWdzIGZyb20gdGhlIGNvb2tpZSBhbmQgdXNlIGNvb2tpZSBtYWdpYyBpbnN0ZWFkLgorCSAqIElmIHRoZSBjb29raWUgaGFzIG5vbi16ZXJvIHByZWZpeCBhbmQgdGhlIGJhc2UgaXMgemVybyB0aGVuCisJICogdGhpcyBvbmUgY2FycmllcyBmbGFncyB0byBjb250cm9sIHVkZXYgcnVsZXMgb25seSBhbmQgaXQgaXMKKwkgKiBub3QgbWVhbnQgdG8gYmUgZm9yIG5vdGlmaWNhdGlvbi4gUmV0dXJuIHdpdGggc3VjY2VzcyBpbiB0aGlzCisJICogc2l0dWF0aW9uLgorCSAqLworCWlmICghKGNvb2tpZSAmPSB+RE1fVURFVl9GTEFHU19NQVNLKSkKKwkJcmV0dXJuIDE7CisKKwljb29raWUgfD0gRE1fQ09PS0lFX01BR0lDIDw8IERNX1VERVZfRkxBR1NfU0hJRlQ7CisKKwlyZXR1cm4gZG1fdWRldl9jb21wbGV0ZShjb29raWUpOworfQorCisjaWZuZGVmIFVERVZfU1lOQ19TVVBQT1JUCitzdGF0aWMgY29uc3QgY2hhciBfY21kX25vdF9zdXBwb3J0ZWRbXSA9ICJDb21tYW5kIG5vdCBzdXBwb3J0ZWQuIFJlY29tcGlsZSB3aXRoIFwiLS1lbmFibGUtdWRldl9zeW5jXCIgdG8gZW5hYmxlLiI7CisKK3N0YXRpYyBpbnQgX3VkZXZjcmVhdGVjb29raWUoQ01EX0FSR1MpCit7CisJbG9nX2Vycm9yKF9jbWRfbm90X3N1cHBvcnRlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfdWRldnJlbGVhc2Vjb29raWUoQ01EX0FSR1MpCit7CisJbG9nX2Vycm9yKF9jbWRfbm90X3N1cHBvcnRlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfdWRldmNvbXBsZXRlX2FsbChDTURfQVJHUykKK3sKKwlsb2dfZXJyb3IoX2NtZF9ub3Rfc3VwcG9ydGVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF91ZGV2Y29va2llcyhDTURfQVJHUykKK3sKKwlsb2dfZXJyb3IoX2NtZF9ub3Rfc3VwcG9ydGVkKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQkvKiBVREVWX1NZTkNfU1VQUE9SVCAqLworc3RhdGljIGludCBfc2V0X3VwX3VkZXZfc3VwcG9ydChjb25zdCBjaGFyICpkZXZfZGlyKQoreworCWludCBkaXJzX2RpZmY7CisJY29uc3QgY2hhciAqZW52OworCXNpemVfdCBsZW4gPSBzdHJsZW4oZGV2X2RpciksIHVkZXZfZGlyX2xlbiA9IHN0cmxlbihETV9VREVWX0RFVl9ESVIpOworCisJaWYgKF9zd2l0Y2hlc1tOT1VERVZTWU5DX0FSR10pCisJCWRtX3VkZXZfc2V0X3N5bmNfc3VwcG9ydCgwKTsKKworCWlmICghX3VkZXZfY29va2llKSB7CisJCWVudiA9IGdldGVudihETV9VREVWX0NPT0tJRV9FTlZfVkFSX05BTUUpOworCQlpZiAoZW52ICYmICplbnYgJiYgKF91ZGV2X2Nvb2tpZSA9IF9nZXRfY29va2llX3ZhbHVlKGVudikpKQorCQkJbG9nX2RlYnVnKCJVc2luZyB1ZGV2IHRyYW5zYWN0aW9uIDB4JTA4IiBQUklYMzIKKwkJCQkgICIgZGVmaW5lZCBieSAlcyBlbnZpcm9ubWVudCB2YXJpYWJsZS4iLAorCQkJCSAgIF91ZGV2X2Nvb2tpZSwKKwkJCQkgICBETV9VREVWX0NPT0tJRV9FTlZfVkFSX05BTUUpOworCX0KKwllbHNlIGlmIChfc3dpdGNoZXNbVURFVkNPT0tJRV9BUkddKQorCQlsb2dfZGVidWcoIlVzaW5nIHVkZXYgdHJhbnNhY3Rpb24gMHglMDgiIFBSSVgzMgorCQkJICAiIGRlZmluZWQgYnkgLS11ZGV2Y29va2llIG9wdGlvbi4iLAorCQkJICBfdWRldl9jb29raWUpOworCisJLyoKKwkgKiBOb3JtYWxseSwgdGhlcmUncyBhbHdheXMgYSBmYWxsYmFjayBhY3Rpb24gYnkgbGliZGV2bWFwcGVyIGlmIHVkZXYKKwkgKiBoYXMgbm90IGRvbmUgaXRzIGpvYiBjb3JyZWN0bHksIGUuZy4gdGhlIG5vZGVzIHdlcmUgbm90IGNyZWF0ZWQuCisJICogSWYgdXNpbmcgdWRldiB0cmFuc2FjdGlvbnMgYnkgc3BlY2lmeWluZyBleGlzdGluZyBjb29raWUgdmFsdWUsCisJICogd2UgbmVlZCB0byBkaXNhYmxlIG5vZGUgY3JlYXRpb24gYnkgbGliZGV2bWFwcGVyIGNvbXBsZXRlbHksCisJICogZGlzYWJsaW5nIGFueSBmYWxsYmFjayBhY3Rpb25zLCBzaW5jZSBhbnkgc3luY2hyb25pc2F0aW9uIGhhcHBlbnMKKwkgKiBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiBvbmx5LiBXZSBuZWVkIHRvIGRvIHRoaXMgdG8gcHJldmVudAorCSAqIHJhY2VzIGJldHdlZW4gdWRldiBhbmQgbGliZGV2bWFwcGVyIGJ1dCBvbmx5IGluIGNhc2UgdWRldiAiZGV2IHBhdGgiCisJICogaXMgdGhlIHNhbWUgYXMgImRldiBwYXRoIiB1c2VkIGJ5IGxpYmRldm1hcHBlci4KKwkgKi8KKworCisJLyoKKwkgKiBETV9VREVWX0RFVl9ESVIgYWx3YXlzIGhhcyAnLycgYXQgaXRzIGVuZC4KKwkgKiBJZiB0aGUgZGV2X2RpciBkb2VzIG5vdCBoYXZlIGl0LCBiZSBzdXJlCisJICogdG8gbWFrZSB0aGUgcmlnaHQgY29tcGFyaXNvbiB3aXRob3V0IHRoZSAnLycgY2hhciEKKwkgKi8KKwlpZiAoZGV2X2RpcltsZW4gLSAxXSAhPSAnLycpCisJCXVkZXZfZGlyX2xlbi0tOworCisJZGlyc19kaWZmID0gdWRldl9kaXJfbGVuICE9IGxlbiB8fAorCQkgICAgc3RybmNtcChETV9VREVWX0RFVl9ESVIsIGRldl9kaXIsIGxlbik7CisJX3VkZXZfb25seSA9ICFkaXJzX2RpZmYgJiYgKF91ZGV2X2Nvb2tpZSB8fCAhX3N3aXRjaGVzW1ZFUklGWVVERVZfQVJHXSk7CisKKwlpZiAoZGlyc19kaWZmKSB7CisJCWxvZ19kZWJ1ZygiVGhlIHBhdGggJXMgdXNlZCBmb3IgY3JlYXRpbmcgZGV2aWNlIG5vZGVzIHRoYXQgaXMgIgorCQkJICAic2V0IHZpYSBETV9ERVZfRElSIGVudmlyb25tZW50IHZhcmlhYmxlIGRpZmZlcnMgZnJvbSAiCisJCQkgICJ0aGUgcGF0aCAlcyB0aGF0IGlzIHVzZWQgYnkgdWRldi4gQWxsIHdhcm5pbmdzICIKKwkJCSAgImFib3V0IHVkZXYgbm90IHdvcmtpbmcgY29ycmVjdGx5IHdoaWxlIHByb2Nlc3NpbmcgIgorCQkJICAicGFydGljdWxhciBub2RlcyB3aWxsIGJlIHN1cHByZXNzZWQuIFRoZXNlIG5vZGVzICIKKwkJCSAgImFuZCBzeW1saW5rcyB3aWxsIGJlIG1hbmFnZWQgaW4gZWFjaCBkaXJlY3RvcnkgIgorCQkJICAic2VwYXJhdGVseS4iLCBkZXZfZGlyLCBETV9VREVWX0RFVl9ESVIpOworCQlkbV91ZGV2X3NldF9jaGVja2luZygwKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdWRldmNyZWF0ZWNvb2tpZShDTURfQVJHUykKK3sKKwl1aW50MzJfdCBjb29raWU7CisKKwlpZiAoIWRtX3VkZXZfY3JlYXRlX2Nvb2tpZSgmY29va2llKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoY29va2llKQorCQlwcmludGYoIjB4JTA4IiBQUklYMzIgIlxuIiwgY29va2llKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF91ZGV2cmVsZWFzZWNvb2tpZShDTURfQVJHUykKK3sKKwlpZiAoYXJndlswXSAmJiAhKF91ZGV2X2Nvb2tpZSA9IF9nZXRfY29va2llX3ZhbHVlKGFyZ3ZbMF0pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV91ZGV2X2Nvb2tpZSkgeworCQlsb2dfZXJyb3IoIk5vIHVkZXYgdHJhbnNhY3Rpb24gY29va2llIGdpdmVuLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZG1fdWRldl93YWl0KF91ZGV2X2Nvb2tpZSk7Cit9CisKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKK3N0YXRpYyBjaGFyIF95ZXNfbm9fcHJvbXB0KGNvbnN0IGNoYXIgKnByb21wdCwgLi4uKQoreworCWludCBjID0gMCwgcmV0ID0gMDsKKwl2YV9saXN0IGFwOworCisJZG8geworCQlpZiAoYyA9PSAnXG4nIHx8ICFjKSB7CisJCQl2YV9zdGFydChhcCwgcHJvbXB0KTsKKwkJCXZwcmludGYocHJvbXB0LCBhcCk7CisJCQl2YV9lbmQoYXApOworCQl9CisKKwkJaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpIHsKKwkJCXJldCA9ICduJzsKKwkJCWJyZWFrOworCQl9CisKKwkJYyA9IHRvbG93ZXIoYyk7CisJCWlmICgoYyA9PSAneScpIHx8IChjID09ICduJykpCisJCQlyZXQgPSBjOworCX0gd2hpbGUgKCFyZXQgfHwgYyAhPSAnXG4nKTsKKworCWlmIChjICE9ICdcbicpCisJCXByaW50ZigiXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3VkZXZjb21wbGV0ZV9hbGwoQ01EX0FSR1MpCit7CisJaW50IG1heF9pZCwgaWQsIHNpZDsKKwlzdHJ1Y3Qgc2VtaW5mbyBzaW5mbzsKKwlzdHJ1Y3Qgc2VtaWRfZHMgc2RhdGE7CisJaW50IGNvdW50ZXIgPSAwOworCWludCBza2lwcGVkID0gMDsKKwl1bnNpZ25lZCBhZ2UgPSAwOworCXRpbWVfdCB0OworCisJaWYgKGFyZ2MgPT0gMSAmJiAoc3NjYW5mKGFyZ3ZbMF0sICIldSIsICZhZ2UpICE9IDEpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlYWQgYWdlX2luX21pbnV0ZXMgcGFyYW1ldGVyLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIV9zd2l0Y2hlc1tZRVNfQVJHXSkgeworCQlsb2dfd2FybigiVGhpcyBvcGVyYXRpb24gd2lsbCBkZXN0cm95IGFsbCBzZW1hcGhvcmVzICVzJS4wZCVzd2l0aCBrZXlzICIKKwkJCSAidGhhdCBoYXZlIGEgcHJlZml4ICUiIFBSSXUxNiAiICgweCUiIFBSSXgxNiAiKS4iLAorCQkJIGFnZSA/ICJvbGRlciB0aGFuICIgOiAiIiwgYWdlLCBhZ2UgPyAiIG1pbnV0ZXMgIiA6ICIiLAorCQkJIERNX0NPT0tJRV9NQUdJQywgRE1fQ09PS0lFX01BR0lDKTsKKworCQlpZiAoX3llc19ub19wcm9tcHQoIkRvIHlvdSByZWFsbHkgd2FudCB0byBjb250aW51ZT8gW3kvbl06ICIpID09ICduJykgeworCQkJbG9nX3ByaW50KCJTZW1hcGhvcmVzIHdpdGgga2V5cyBwcmVmaXhlZCBieSAlIiBQUkl1MTYKKwkJCQkgICIgKDB4JSIgUFJJeDE2ICIpIE5PVCBkZXN0cm95ZWQuIiwKKwkJCQkgIERNX0NPT0tJRV9NQUdJQywgRE1fQ09PS0lFX01BR0lDKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKChtYXhfaWQgPSBzZW1jdGwoMCwgMCwgU0VNX0lORk8sICZzaW5mbykpIDwgMCkgeworCQlsb2dfc3lzX2Vycm9yKCJzZW1jdGwiLCAiU0VNX0lORk8iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heF9pZDsgaWQrKykgeworCQlpZiAoKHNpZCA9IHNlbWN0bChpZCwgMCwgU0VNX1NUQVQsICZzZGF0YSkpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZGF0YS5zZW1fcGVybS5fX2tleSA+PiAxNiA9PSBETV9DT09LSUVfTUFHSUMpIHsKKwkJCXQgPSB0aW1lKE5VTEwpOworCisJCQlpZiAoc2RhdGEuc2VtX2N0aW1lICsgYWdlICogNjAgPiB0IHx8CisJCQkgICAgc2RhdGEuc2VtX290aW1lICsgYWdlICogNjAgPiB0KSB7CisJCQkJc2tpcHBlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNlbWN0bChzaWQsIDAsIElQQ19STUlELCAwKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBjbGVhbnVwIG5vdGlmaWNhdGlvbiBzZW1hcGhvcmUgIgorCQkJCQkgICJ3aXRoIHNlbWlkICVkIGFuZCBjb29raWUgdmFsdWUgIgorCQkJCQkgIEZNVHUzMiAiICgweCIgRk1UeDMyICIpIiwgc2lkLAorCQkJCQkgIHNkYXRhLnNlbV9wZXJtLl9fa2V5LCBzZGF0YS5zZW1fcGVybS5fX2tleSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWNvdW50ZXIrKzsKKwkJfQorCX0KKworCWxvZ19wcmludCgiJWQgc2VtYXBob3JlcyB3aXRoIGtleXMgcHJlZml4ZWQgYnkgIgorCQkgIEZNVHUxNiAiICgweCIgRk1UeDE2ICIpIGRlc3Ryb3llZC4gJWQgc2tpcHBlZC4iLAorCQkgIGNvdW50ZXIsIERNX0NPT0tJRV9NQUdJQywgRE1fQ09PS0lFX01BR0lDLCBza2lwcGVkKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF91ZGV2Y29va2llcyhDTURfQVJHUykKK3sKKwlpbnQgbWF4X2lkLCBpZCwgc2lkOworCXN0cnVjdCBzZW1pbmZvIHNpbmZvOworCXN0cnVjdCBzZW1pZF9kcyBzZGF0YTsKKwlpbnQgdmFsOworCWNoYXIgb3RpbWVfc3RyWzI2XSwgY3RpbWVfc3RyWzI2XTsKKwljaGFyICpvdGltZXMsICpjdGltZXM7CisKKwlpZiAoKG1heF9pZCA9IHNlbWN0bCgwLCAwLCBTRU1fSU5GTywgJnNpbmZvKSkgPCAwKSB7CisJCWxvZ19zeXNfZXJyb3IoInNlbV9jdGwiLCAiU0VNX0lORk8iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRmKCJDb29raWUgICAgICAgU2VtaWQgICAgICBWYWx1ZSAgICAgIExhc3Qgc2Vtb3AgdGltZSAgICAgICAgICAgTGFzdCBjaGFuZ2UgdGltZVxuIik7CisKKwlmb3IgKGlkID0gMDsgaWQgPD0gbWF4X2lkOyBpZCsrKSB7CisJCWlmICgoc2lkID0gc2VtY3RsKGlkLCAwLCBTRU1fU1RBVCwgJnNkYXRhKSkgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHNkYXRhLnNlbV9wZXJtLl9fa2V5ID4+IDE2ID09IERNX0NPT0tJRV9NQUdJQykgeworCQkJaWYgKCh2YWwgPSBzZW1jdGwoc2lkLCAwLCBHRVRWQUwpKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoInNlbWlkICVkOiBzZW1fY3RsIGZhaWxlZCBmb3IgIgorCQkJCQkgICJjb29raWUgMHglIiBQUkl4MzIgIjogJXMiLAorCQkJCQkgIHNpZCwgc2RhdGEuc2VtX3Blcm0uX19rZXksCisJCQkJCSAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKChvdGltZXMgPSBjdGltZV9yKChjb25zdCB0aW1lX3QgKikgJnNkYXRhLnNlbV9vdGltZSwgKGNoYXIgKikmb3RpbWVfc3RyKSkpCisJCQkJb3RpbWVfc3RyW3N0cmxlbihvdGltZXMpLTFdID0gJ1wwJzsKKwkJCWlmICgoY3RpbWVzID0gY3RpbWVfcigoY29uc3QgdGltZV90ICopICZzZGF0YS5zZW1fY3RpbWUsIChjaGFyICopJmN0aW1lX3N0cikpKQorCQkJCWN0aW1lX3N0cltzdHJsZW4oY3RpbWVzKS0xXSA9ICdcMCc7CisKKwkJCXByaW50ZigiMHglLTEweCAlLTEwZCAlLTEwZCAlcyAgJXNcbiIsIHNkYXRhLnNlbV9wZXJtLl9fa2V5LAorCQkJCXNpZCwgdmFsLCBvdGltZXMgPyA6ICJ1bmtub3duIiwKKwkJCQljdGltZXM/IDogInVua25vd24iKTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorI2VuZGlmCS8qIFVERVZfU1lOQ19TVVBQT1JUICovCisKK3N0YXRpYyBpbnQgX3ZlcnNpb24oQ01EX0FSR1MpCit7CisJY2hhciB2ZXJzaW9uWzgwXTsKKworCWlmIChkbV9nZXRfbGlicmFyeV92ZXJzaW9uKHZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCisJCXByaW50ZigiTGlicmFyeSB2ZXJzaW9uOiAgICVzXG4iLCB2ZXJzaW9uKTsKKworCWlmICghZG1fZHJpdmVyX3ZlcnNpb24odmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSkKKwkJcmV0dXJuXzA7CisKKwlwcmludGYoIkRyaXZlciB2ZXJzaW9uOiAgICAlc1xuIiwgdmVyc2lvbik7CisKKwkvKiBkb24ndCBvdXRwdXQgY29sdW1uIGhlYWRpbmdzIGZvciAnZG1zdGF0cyB2ZXJzaW9uJy4gKi8KKwlpZiAoX3JlcG9ydCkgeworCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKwkJX3JlcG9ydCA9IE5VTEw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3NpbXBsZShpbnQgdGFzaywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZXZlbnRfbnIsIGludCBkaXNwbGF5KQoreworCXVpbnQzMl90IGNvb2tpZSA9IDA7CisJdWludDE2X3QgdWRldl9mbGFncyA9IDA7CisJaW50IHVkZXZfd2FpdF9mbGFnID0gdGFzayA9PSBETV9ERVZJQ0VfUkVTVU1FIHx8CisJCQkgICAgIHRhc2sgPT0gRE1fREVWSUNFX1JFTU9WRTsKKwlpbnQgciA9IDA7CisKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUodGFzaykpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3NldF90YXNrX2RldmljZShkbXQsIG5hbWUsIDApKQorCQlnb3RvX291dDsKKworCWlmIChldmVudF9uciAmJiAhZG1fdGFza19zZXRfZXZlbnRfbnIoZG10LCBldmVudF9ucikpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT0ZMVVNIX0FSR10gJiYgIWRtX3Rhc2tfbm9fZmx1c2goZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10gJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTk9MT0NLRlNfQVJHXSAmJiAhZG1fdGFza19za2lwX2xvY2tmcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCS8qIEZJWE1FOiBuZWVkcyB0byBjb3BlcmF0ZSB3aXRoIHVkZXYgKi8KKwlpZiAoIV9zZXRfdGFza19hZGRfbm9kZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbUkVBREFIRUFEX0FSR10gJiYKKwkgICAgIWRtX3Rhc2tfc2V0X3JlYWRfYWhlYWQoZG10LCBfaW50X2FyZ3NbUkVBREFIRUFEX0FSR10sCisJCQkJICAgIF9yZWFkX2FoZWFkX2ZsYWdzKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW05PVURFVlJVTEVTX0FSR10pCisJCXVkZXZfZmxhZ3MgfD0gRE1fVURFVl9ESVNBQkxFX0RNX1JVTEVTX0ZMQUcgfAorCQkJICAgICAgRE1fVURFVl9ESVNBQkxFX1NVQlNZU1RFTV9SVUxFU19GTEFHOworCisJaWYgKF91ZGV2X2Nvb2tpZSkKKwkJY29va2llID0gX3VkZXZfY29va2llOworCisJaWYgKF91ZGV2X29ubHkpCisJCXVkZXZfZmxhZ3MgfD0gRE1fVURFVl9ESVNBQkxFX0xJQlJBUllfRkFMTEJBQ0s7CisKKwlpZiAodWRldl93YWl0X2ZsYWcgJiYgIWRtX3Rhc2tfc2V0X2Nvb2tpZShkbXQsICZjb29raWUsIHVkZXZfZmxhZ3MpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbUkVUUllfQVJHXSAmJiB0YXNrID09IERNX0RFVklDRV9SRU1PVkUpCisJCWRtX3Rhc2tfcmV0cnlfcmVtb3ZlKGRtdCk7CisKKwlpZiAoX3N3aXRjaGVzW0RFRkVSUkVEX0FSR10gJiYgKHRhc2sgPT0gRE1fREVWSUNFX1JFTU9WRSB8fCB0YXNrID09IERNX0RFVklDRV9SRU1PVkVfQUxMKSkKKwkJZG1fdGFza19kZWZlcnJlZF9yZW1vdmUoZG10KTsKKworCXIgPSBfdGFza19ydW4oZG10KTsKKworb3V0OgorCWlmICghX3VkZXZfY29va2llICYmIHVkZXZfd2FpdF9mbGFnKQorCQkodm9pZCkgZG1fdWRldl93YWl0KGNvb2tpZSk7CisKKwlpZiAociAmJiBkaXNwbGF5ICYmIF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10pCisJCXIgPSBfZGlzcGxheV9pbmZvKGRtdCk7CisKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zdXNwZW5kKENNRF9BUkdTKQoreworCXJldHVybiBfc2ltcGxlKERNX0RFVklDRV9TVVNQRU5ELCBhcmdjID8gYXJndlswXSA6IE5VTEwsIDAsIDEpOworfQorCitzdGF0aWMgaW50IF9yZXN1bWUoQ01EX0FSR1MpCit7CisJcmV0dXJuIF9zaW1wbGUoRE1fREVWSUNFX1JFU1VNRSwgYXJnYyA/IGFyZ3ZbMF0gOiBOVUxMLCAwLCAxKTsKK30KKworc3RhdGljIGludCBfY2xlYXIoQ01EX0FSR1MpCit7CisJcmV0dXJuIF9zaW1wbGUoRE1fREVWSUNFX0NMRUFSLCBhcmdjID8gYXJndlswXSA6IE5VTEwsIDAsIDEpOworfQorCitzdGF0aWMgaW50IF93YWl0KENNRF9BUkdTKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisJaWYgKCFfc3dpdGNoZXNbVVVJRF9BUkddICYmICFfc3dpdGNoZXNbTUFKT1JfQVJHXSkgeworCQlpZiAoIWFyZ2MpIHsKKwkJCWVycigiTm8gZGV2aWNlIHNwZWNpZmllZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCW5hbWUgPSBhcmd2WzBdOworCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gX3NpbXBsZShETV9ERVZJQ0VfV0FJVEVWRU5ULCBuYW1lLAorCQkgICAgICAgKGFyZ2MpID8gKHVpbnQzMl90KSBhdG9pKGFyZ3ZbYXJnYyAtIDFdKSA6IDAsIDEpOworfQorCitzdGF0aWMgaW50IF9wcm9jZXNzX2FsbChjb25zdCBzdHJ1Y3QgY29tbWFuZCAqY21kLCBjb25zdCBjaGFyICpzdWJjb21tYW5kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBzaWxlbnQsCisJCQlpbnQgKCpmbikgKENNRF9BUkdTKSkKK3sKKwlpbnQgciA9IDE7CisJc3RydWN0IGRtX25hbWVzICpuYW1lczsKKwl1bnNpZ25lZCBuZXh0ID0gMDsKKworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfTElTVCkpKQorCQlyZXR1cm5fMDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpIHsKKwkJciA9IDA7CisJCWdvdG9fb3V0OworCX0KKworCWlmICghKG5hbWVzID0gZG1fdGFza19nZXRfbmFtZXMoZG10KSkpIHsKKwkJciA9IDA7CisJCWdvdG9fb3V0OworCX0KKworCWlmICghbmFtZXMtPmRldikgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ZigiTm8gZGV2aWNlcyBmb3VuZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWRvIHsKKwkJbmFtZXMgPSAoc3RydWN0IGRtX25hbWVzICopKChjaGFyICopIG5hbWVzICsgbmV4dCk7CisJCWlmICghZm4oY21kLCBzdWJjb21tYW5kLCBhcmdjLCBhcmd2LCBuYW1lcywgMSkpCisJCQlyID0gMDsKKwkJbmV4dCA9IG5hbWVzLT5uZXh0OworCX0gd2hpbGUgKG5leHQpOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBfZ2V0X2RldmljZV9zaXplKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdWludDY0X3Qgc3RhcnQsIGxlbmd0aCwgc2l6ZSA9IFVJTlQ2NF9DKDApOworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJY2hhciAqdGFyZ2V0X3R5cGUsICpwYXJhbXM7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9UQUJMRSkpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3NldF90YXNrX2RldmljZShkbXQsIG5hbWUsIDApKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTk9PUEVOQ09VTlRfQVJHXSAmJiAhZG1fdGFza19ub19vcGVuX2NvdW50KGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tJTkFDVElWRV9BUkddICYmICFkbV90YXNrX3F1ZXJ5X2luYWN0aXZlX3RhYmxlKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tDSEVDS1NfQVJHXSAmJiAhZG1fdGFza19lbmFibGVfY2hlY2tzKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwKKwkJCQkJICAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCQlzaXplICs9IGxlbmd0aDsKKwl9IHdoaWxlIChuZXh0KTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IF9lcnJvcl9kZXZpY2UoQ01EX0FSR1MpCit7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljb25zdCBjaGFyICpuYW1lOworCXVpbnQ2NF90IHNpemU7CisJaW50IHIgPSAwOworCisJbmFtZSA9IG5hbWVzID8gbmFtZXMtPm5hbWUgOiBhcmd2WzBdOworCisJc2l6ZSA9IF9nZXRfZGV2aWNlX3NpemUobmFtZSk7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfUkVMT0FEKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgbmFtZSwgMCkpCisJCWdvdG9fYmFkOworCisJaWYgKCFkbV90YXNrX2FkZF90YXJnZXQoZG10LCBVSU5UNjRfQygwKSwgc2l6ZSwgImVycm9yIiwgIiIpKQorCQlnb3RvX2JhZDsKKworCWlmIChfc3dpdGNoZXNbUkVBRF9PTkxZXSAmJiAhZG1fdGFza19zZXRfcm8oZG10KSkKKwkJZ290b19iYWQ7CisKKwlpZiAoX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10gJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmIChfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZShkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX2JhZDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fYmFkOworCisJaWYgKF9zd2l0Y2hlc1tGT1JDRV9BUkddKQorCQkvKiBBdm9pZCBoYW5nIG9uIGZsdXNoaW5nIHdpdGggLS1mb3JjZSAqLworCQlfc3dpdGNoZXNbTk9MT0NLRlNfQVJHXSA9IF9zd2l0Y2hlc1tOT0ZMVVNIX0FSR10gPSAxOworCisJaWYgKCFfc2ltcGxlKERNX0RFVklDRV9SRVNVTUUsIG5hbWUsIDAsIDApKSB7CisJCV9zaW1wbGUoRE1fREVWSUNFX0NMRUFSLCBuYW1lLCAwLCAwKTsKKwkJZ290b19iYWQ7CisJfQorCisJciA9IDE7CisKK2JhZDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcmVtb3ZlKENNRF9BUkdTKQoreworCWlmIChfc3dpdGNoZXNbRk9SQ0VfQVJHXSAmJiBhcmdjKSB7CisJCS8qCisJCSAqICdyZW1vdmUgLS1mb3JjZScgb3B0aW9uIGlzIGRvaW5nIDIgb3BlcmF0aW9ucyBvbiB0aGUgc2FtZSBkZXZpY2UKKwkJICogdGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB1c2Ugb2YgLS11ZGV2Y29va2llL0RNX1VERVZfQ09PS0lFLgorCQkgKiBVZGV2ZCBjb2xsaXNpb24gY291bGQgYmUgcGFydGlhbGx5IGF2b2lkZWQgd2l0aCAtLXJldHJ5LgorCQkgKi8KKwkJaWYgKF91ZGV2X2Nvb2tpZSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBVc2Ugb2YgY29va2llIGFuZCAtLWZvcmNlIGlzIG5vdCBjb21wYXRpYmxlLiIpOworCQkodm9pZCkgX2Vycm9yX2RldmljZShjbWQsIE5VTEwsIGFyZ2MsIGFyZ3YsIE5VTEwsIDApOworCX0KKworCXJldHVybiBfc2ltcGxlKERNX0RFVklDRV9SRU1PVkUsIGFyZ2MgPyBhcmd2WzBdIDogTlVMTCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX2NvdW50X2RldmljZXMoQ01EX0FSR1MpCit7CisJX251bV9kZXZpY2VzKys7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVtb3ZlX2FsbChDTURfQVJHUykKK3sKKwlpbnQgcjsKKworCS8qIFJlbW92ZSBhbGwgY2xvc2VkIGRldmljZXMgKi8KKwlyID0gIF9zaW1wbGUoRE1fREVWSUNFX1JFTU9WRV9BTEwsICIiLCAwLCAwKSB8IGRtX21rbm9kZXMoTlVMTCk7CisKKwlpZiAoIV9zd2l0Y2hlc1tGT1JDRV9BUkddKQorCQlyZXR1cm4gcjsKKworCV9udW1fZGV2aWNlcyA9IDA7CisJciB8PSBfcHJvY2Vzc19hbGwoY21kLCBOVUxMLCBhcmdjLCBhcmd2LCAxLCBfY291bnRfZGV2aWNlcyk7CisKKwkvKiBObyBkZXZpY2VzIGxlZnQ/ICovCisJaWYgKCFfbnVtX2RldmljZXMpCisJCXJldHVybiByOworCisJciB8PSBfcHJvY2Vzc19hbGwoY21kLCBOVUxMLCBhcmdjLCBhcmd2LCAxLCBfZXJyb3JfZGV2aWNlKTsKKwlyIHw9IF9zaW1wbGUoRE1fREVWSUNFX1JFTU9WRV9BTEwsICIiLCAwLCAwKSB8IGRtX21rbm9kZXMoTlVMTCk7CisKKwlfbnVtX2RldmljZXMgPSAwOworCXIgfD0gX3Byb2Nlc3NfYWxsKGNtZCwgTlVMTCwgYXJnYywgYXJndiwgMSwgX2NvdW50X2RldmljZXMpOworCWlmICghX251bV9kZXZpY2VzKQorCQlyZXR1cm4gcjsKKworCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHJlbW92ZSAlZCBkZXZpY2UocykuXG4iLCBfbnVtX2RldmljZXMpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwbGF5X2RldihzdHJ1Y3QgZG1fdGFzayAqZG10LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkbV9pbmZvIGluZm87CisKKwlpZiAoZG1fdGFza19nZXRfaW5mbyhkbXQsICZpbmZvKSkKKwkJcHJpbnRmKCIlc1x0KCV1LCAldSlcbiIsIG5hbWUsIGluZm8ubWFqb3IsIGluZm8ubWlub3IpOworfQorCitzdGF0aWMgaW50IF9ta25vZGVzKENNRF9BUkdTKQoreworCXJldHVybiBkbV9ta25vZGVzKGFyZ2MgPyBhcmd2WzBdIDogTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX2V4ZWNfY29tbWFuZChjb25zdCBjaGFyICpuYW1lKQoreworCWludCBuOworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCXN0YXRpYyBjaGFyICphcmdzW0FSR1NfTUFYICsgMV07CisJc3RhdGljIGludCBhcmdjID0gMDsKKwljaGFyICpjOworCXBpZF90IHBpZDsKKworCWlmIChhcmdjIDwgMCkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX21rbm9kZXMobmFtZSkpCisJCXJldHVybl8wOworCisJbiA9IHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzIiwgZG1fZGlyKCksIG5hbWUpOworCWlmIChuIDwgMCB8fCBuID4gKGludCkgc2l6ZW9mKHBhdGgpIC0gMSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWFyZ2MpIHsKKwkJYyA9IF9jb21tYW5kX3RvX2V4ZWM7CisJCXdoaWxlIChhcmdjIDwgQVJHU19NQVgpIHsKKwkJCXdoaWxlICgqYyAmJiBpc3NwYWNlKCpjKSkKKwkJCQljKys7CisJCQlpZiAoISpjKQorCQkJCWJyZWFrOworCQkJYXJnc1thcmdjKytdID0gYzsKKwkJCXdoaWxlICgqYyAmJiAhaXNzcGFjZSgqYykpCisJCQkJYysrOworCQkJaWYgKCpjKQorCQkJCSpjKysgPSAnXDAnOworCQl9CisKKwkJaWYgKCFhcmdjKSB7CisJCQlhcmdjID0gLTE7CisJCQlyZXR1cm5fMDsKKwkJfQorCisJCWlmIChhcmdjID09IEFSR1NfTUFYKSB7CisJCQllcnIoIlRvbyBtYW55IGFyZ3MgdG8gLS1leGVjXG4iKTsKKwkJCWFyZ2MgPSAtMTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYXJnc1thcmdjKytdID0gcGF0aDsKKwkJYXJnc1thcmdjXSA9IE5VTEw7CisJfQorCisJaWYgKCEocGlkID0gZm9yaygpKSkgeworCQlleGVjdnAoYXJnc1swXSwgYXJncyk7CisJCV9leGl0KDEyNyk7CisJfSBlbHNlIGlmIChwaWQgPCAocGlkX3QpIDApCisJCXJldHVybiAwOworCisJVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQocGlkLCBOVUxMLCAwKSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc3RhdHVzKENNRF9BUkdTKQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXZvaWQgKm5leHQgPSBOVUxMOworCXVpbnQ2NF90IHN0YXJ0LCBsZW5ndGg7CisJY2hhciAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCWNoYXIgKnBhcmFtcywgKmM7CisJaW50IGNtZG5vOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCBtYXRjaGVkID0gMDsKKwlpbnQgbHNfb25seSA9IDA7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKworCWlmIChuYW1lcykKKwkJbmFtZSA9IG5hbWVzLT5uYW1lOworCWVsc2UgeworCQlpZiAoIWFyZ2MgJiYgIV9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIV9zd2l0Y2hlc1tNQUpPUl9BUkddKQorCQkJcmV0dXJuIF9wcm9jZXNzX2FsbChjbWQsIE5VTEwsIGFyZ2MsIGFyZ3YsIDAsIF9zdGF0dXMpOworCQluYW1lID0gYXJndlswXTsKKwl9CisKKwlpZiAoIXN0cmNtcChjbWQtPm5hbWUsICJ0YWJsZSIpKQorCQljbWRubyA9IERNX0RFVklDRV9UQUJMRTsKKwllbHNlCisJCWNtZG5vID0gRE1fREVWSUNFX1NUQVRVUzsKKworCWlmICghc3RyY21wKGNtZC0+bmFtZSwgImxzIikpCisJCWxzX29ubHkgPSAxOworCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoY21kbm8pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9zZXRfdGFza19kZXZpY2UoZG10LCBuYW1lLCAwKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10gJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbTk9GTFVTSF9BUkddICYmICFkbV90YXNrX25vX2ZsdXNoKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9IGRtX3Rhc2tfZ2V0X25hbWUoZG10KTsKKworCS8qIEZldGNoIHRhcmdldHMgYW5kIHByaW50ICdlbSAqLworCWRvIHsKKwkJbmV4dCA9IGRtX2dldF9uZXh0X3RhcmdldChkbXQsIG5leHQsICZzdGFydCwgJmxlbmd0aCwKKwkJCQkJICAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCQkvKiBTa2lwIGlmIHRhcmdldCB0eXBlIGRvZXNuJ3QgbWF0Y2ggKi8KKwkJaWYgKF9zd2l0Y2hlc1tUQVJHRVRfQVJHXSAmJgorCQkgICAgKCF0YXJnZXRfdHlwZSB8fCBzdHJjbXAodGFyZ2V0X3R5cGUsIF90YXJnZXQpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobHNfb25seSkgeworCQkJaWYgKCFfc3dpdGNoZXNbRVhFQ19BUkddIHx8ICFfY29tbWFuZF90b19leGVjIHx8CisJCQkgICAgX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJCQlfZGlzcGxheV9kZXYoZG10LCBuYW1lKTsKKwkJCW5leHQgPSBOVUxMOworCQl9IGVsc2UgaWYgKCFfc3dpdGNoZXNbRVhFQ19BUkddIHx8ICFfY29tbWFuZF90b19leGVjIHx8CisJCQkgICBfc3dpdGNoZXNbVkVSQk9TRV9BUkddKSB7CisJCQlpZiAoIW1hdGNoZWQgJiYgX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJCQlfZGlzcGxheV9pbmZvKGRtdCk7CisJCQlpZiAobXVsdGlwbGVfZGV2aWNlcyAmJiAhX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJCQlwcmludGYoIiVzOiAiLCBuYW1lKTsKKwkJCWlmICh0YXJnZXRfdHlwZSkgeworCQkJCS8qIFN1cHByZXNzIGVuY3J5cHRpb24ga2V5ICovCisJCQkJaWYgKCFfc3dpdGNoZXNbU0hPV0tFWVNfQVJHXSAmJgorCQkJCSAgICBjbWRubyA9PSBETV9ERVZJQ0VfVEFCTEUgJiYKKwkJCQkgICAgIXN0cmNtcCh0YXJnZXRfdHlwZSwgImNyeXB0IikpIHsKKwkJCQkJYyA9IHBhcmFtczsKKwkJCQkJd2hpbGUgKCpjICYmICpjICE9ICcgJykKKwkJCQkJCWMrKzsKKwkJCQkJaWYgKCpjKQorCQkJCQkJYysrOworCQkJCQl3aGlsZSAoKmMgJiYgKmMgIT0gJyAnKQorCQkJCQkJKmMrKyA9ICcwJzsKKwkJCQl9CisJCQkJcHJpbnRmKEZNVHU2NCAiICIgRk1UdTY0ICIgJXMgJXMiLAorCQkJCSAgICAgICBzdGFydCwgbGVuZ3RoLCB0YXJnZXRfdHlwZSwgcGFyYW1zKTsKKwkJCX0KKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQltYXRjaGVkID0gMTsKKwl9IHdoaWxlIChuZXh0KTsKKworCWlmIChtdWx0aXBsZV9kZXZpY2VzICYmIF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10gJiYgbWF0Y2hlZCAmJiAhbHNfb25seSkKKwkJcHJpbnRmKCJcbiIpOworCisJaWYgKG1hdGNoZWQgJiYgX3N3aXRjaGVzW0VYRUNfQVJHXSAmJiBfY29tbWFuZF90b19leGVjICYmICFfZXhlY19jb21tYW5kKG5hbWUpKQorCQlnb3RvX291dDsKKworCXIgPSAxOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKKy8qIFNob3cgdGFyZ2V0IG5hbWVzIGFuZCB0aGVpciB2ZXJzaW9uIG51bWJlcnMgKi8KK3N0YXRpYyBpbnQgX3RhcmdldHMoQ01EX0FSR1MpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX3ZlcnNpb25zICp0YXJnZXQ7CisJc3RydWN0IGRtX3ZlcnNpb25zICpsYXN0X3RhcmdldDsKKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9MSVNUX1ZFUlNJT05TKSkpCisJCXJldHVybl8wOworCisJaWYgKF9zd2l0Y2hlc1tDSEVDS1NfQVJHXSAmJiAhZG1fdGFza19lbmFibGVfY2hlY2tzKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwl0YXJnZXQgPSBkbV90YXNrX2dldF92ZXJzaW9ucyhkbXQpOworCisJLyogRmV0Y2ggdGFyZ2V0cyBhbmQgcHJpbnQgJ2VtICovCisJZG8geworCQlsYXN0X3RhcmdldCA9IHRhcmdldDsKKworCQlwcmludGYoIiUtMTZzIHYlZC4lZC4lZFxuIiwgdGFyZ2V0LT5uYW1lLCB0YXJnZXQtPnZlcnNpb25bMF0sCisJCSAgICAgICB0YXJnZXQtPnZlcnNpb25bMV0sIHRhcmdldC0+dmVyc2lvblsyXSk7CisKKwkJdGFyZ2V0ID0gKHN0cnVjdCBkbV92ZXJzaW9ucyAqKSgoY2hhciAqKSB0YXJnZXQgKyB0YXJnZXQtPm5leHQpOworCX0gd2hpbGUgKGxhc3RfdGFyZ2V0ICE9IHRhcmdldCk7CisKKwlyID0gMTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9pbmZvKENNRF9BUkdTKQoreworCWludCByID0gMDsKKworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlpZiAobmFtZXMpCisJCW5hbWUgPSBuYW1lcy0+bmFtZTsKKwllbHNlIHsKKwkJaWYgKCFhcmdjICYmICFfc3dpdGNoZXNbVVVJRF9BUkddICYmICFfc3dpdGNoZXNbTUFKT1JfQVJHXSkKKwkJCXJldHVybiBfcHJvY2Vzc19hbGwoY21kLCBOVUxMLCBhcmdjLCBhcmd2LCAwLCBfaW5mbyk7CisJCW5hbWUgPSBhcmd2WzBdOworCX0KKworCWlmICghKGRtdCA9IGRtX3Rhc2tfY3JlYXRlKERNX0RFVklDRV9JTkZPKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfc2V0X3Rhc2tfZGV2aWNlKGRtdCwgbmFtZSwgMCkpCisJCWdvdG9fb3V0OworCisJaWYgKF9zd2l0Y2hlc1tOT09QRU5DT1VOVF9BUkddICYmICFkbV90YXNrX25vX29wZW5fY291bnQoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0lOQUNUSVZFX0FSR10gJiYgIWRtX3Rhc2tfcXVlcnlfaW5hY3RpdmVfdGFibGUoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0NIRUNLU19BUkddICYmICFkbV90YXNrX2VuYWJsZV9jaGVja3MoZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV90YXNrX3J1bihkbXQpKQorCQlnb3RvX291dDsKKworCXIgPSBfZGlzcGxheV9pbmZvKGRtdCk7CisKK291dDoKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZGVwcyhDTURfQVJHUykKK3sKKwlpbnQgciA9IDA7CisJdWludDMyX3QgaTsKKwlzdHJ1Y3QgZG1fZGVwcyAqZGVwczsKKwlzdHJ1Y3QgZG1fdGFzayAqZG10OworCXN0cnVjdCBkbV9pbmZvIGluZm87CisJY2hhciAqbmFtZSA9IE5VTEw7CisJY2hhciBkZXZfbmFtZVtQQVRIX01BWF07CisJaW50IG1ham9yLCBtaW5vcjsKKworCWlmIChuYW1lcykKKwkJbmFtZSA9IG5hbWVzLT5uYW1lOworCWVsc2UgeworCQlpZiAoIWFyZ2MgJiYgIV9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIV9zd2l0Y2hlc1tNQUpPUl9BUkddKQorCQkJcmV0dXJuIF9wcm9jZXNzX2FsbChjbWQsIE5VTEwsIGFyZ2MsIGFyZ3YsIDAsIF9kZXBzKTsKKwkJbmFtZSA9IGFyZ3ZbMF07CisJfQorCisJaWYgKCEoZG10ID0gZG1fdGFza19jcmVhdGUoRE1fREVWSUNFX0RFUFMpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9zZXRfdGFza19kZXZpY2UoZG10LCBuYW1lLCAwKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10gJiYgIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSAmJiAhZG1fdGFza19xdWVyeV9pbmFjdGl2ZV90YWJsZShkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pKQorCQlnb3RvX291dDsKKworCWlmICghKGRlcHMgPSBkbV90YXNrX2dldF9kZXBzKGRtdCkpKQorCQlnb3RvX291dDsKKworCWlmICghaW5mby5leGlzdHMpIHsKKwkJcHJpbnRmKCJEZXZpY2UgZG9lcyBub3QgZXhpc3QuXG4iKTsKKwkJciA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChfc3dpdGNoZXNbVkVSQk9TRV9BUkddKQorCQlfZGlzcGxheV9pbmZvKGRtdCk7CisKKwlpZiAobXVsdGlwbGVfZGV2aWNlcyAmJiAhX3N3aXRjaGVzW1ZFUkJPU0VfQVJHXSkKKwkJcHJpbnRmKCIlczogIiwgbmFtZSk7CisJcHJpbnRmKCIlZCBkZXBlbmRlbmNpZXNcdDoiLCBkZXBzLT5jb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVwcy0+Y291bnQ7IGkrKykgeworCQltYWpvciA9IChpbnQpIE1BSk9SKGRlcHMtPmRldmljZVtpXSk7CisJCW1pbm9yID0gKGludCkgTUlOT1IoZGVwcy0+ZGV2aWNlW2ldKTsKKworCQlpZiAoKF9kZXZfbmFtZV90eXBlID09IEROX0JMSyB8fCBfZGV2X25hbWVfdHlwZSA9PSBETl9NQVApICYmCisJCSAgICBkbV9kZXZpY2VfZ2V0X25hbWUobWFqb3IsIG1pbm9yLCBfZGV2X25hbWVfdHlwZSA9PSBETl9CTEssCisJCQkJICAgICAgIGRldl9uYW1lLCBQQVRIX01BWCkpCisJCQlwcmludGYoIiAoJXMpIiwgZGV2X25hbWUpOworCQllbHNlCisJCQlwcmludGYoIiAoJWQsICVkKSIsIG1ham9yLCBtaW5vcik7CisJfQorCXByaW50ZigiXG4iKTsKKworCWlmIChtdWx0aXBsZV9kZXZpY2VzICYmIF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10pCisJCXByaW50ZigiXG4iKTsKKworCXIgPSAxOworCitvdXQ6CisJZG1fdGFza19kZXN0cm95KGRtdCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2Rpc3BsYXlfbmFtZShDTURfQVJHUykKK3sKKwljaGFyIGRldl9uYW1lW1BBVEhfTUFYXTsKKworCWlmICghbmFtZXMpCisJCXJldHVybiAxOworCisJaWYgKChfZGV2X25hbWVfdHlwZSA9PSBETl9CTEsgfHwgX2Rldl9uYW1lX3R5cGUgPT0gRE5fTUFQKSAmJgorCSAgICBkbV9kZXZpY2VfZ2V0X25hbWUoKGludCkgTUFKT1IobmFtZXMtPmRldiksIChpbnQpIE1JTk9SKG5hbWVzLT5kZXYpLAorCQkJICAgICAgIF9kZXZfbmFtZV90eXBlID09IEROX0JMSywgZGV2X25hbWUsIFBBVEhfTUFYKSkKKwkJcHJpbnRmKCIlc1x0KCVzKVxuIiwgbmFtZXMtPm5hbWUsIGRldl9uYW1lKTsKKwllbHNlCisJCXByaW50ZigiJXNcdCglZDolZClcbiIsIG5hbWVzLT5uYW1lLAorCQkJCQkoaW50KSBNQUpPUihuYW1lcy0+ZGV2KSwKKwkJCQkJKGludCkgTUlOT1IobmFtZXMtPmRldikpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUcmVlIGRyYXdpbmcgY29kZQorICovCisKK2VudW0geworCVRSX0RFVklDRT0wLAkvKiBkaXNwbGF5IGRldmljZSBtYWpvcjptaW5vciBudW1iZXIgKi8KKwlUUl9CTEtERVZOQU1FLAkvKiBkaXNwbGF5IGRldmljZSBrZXJuZWwgbmFtZSAqLworCVRSX1RBQkxFLAorCVRSX1NUQVRVUywKKwlUUl9BQ1RJVkUsCisJVFJfUlcsCisJVFJfT1BFTkNPVU5ULAorCVRSX1VVSUQsCisJVFJfQ09NUEFDVCwKKwlUUl9UUlVOQ0FURSwKKwlUUl9CT1RUT01VUCwKKwlOVU1fVFJFRU1PREUsCit9OworCitzdGF0aWMgaW50IF90cmVlX3N3aXRjaGVzW05VTV9UUkVFTU9ERV07CisKKyNkZWZpbmUgVFJfUFJJTlRfQVRUUklCVVRFICggX3RyZWVfc3dpdGNoZXNbVFJfQUNUSVZFXSB8fCBcCisJCQkgICAgIF90cmVlX3N3aXRjaGVzW1RSX1JXXSB8fCBcCisJCQkgICAgIF90cmVlX3N3aXRjaGVzW1RSX09QRU5DT1VOVF0gfHwgXAorCQkJICAgICBfdHJlZV9zd2l0Y2hlc1tUUl9VVUlEXSApCisKKyNkZWZpbmUgVFJfUFJJTlRfVEFSR0VUUyAoIF90cmVlX3N3aXRjaGVzW1RSX1RBQkxFXSB8fCBcCisJCQkgICBfdHJlZV9zd2l0Y2hlc1tUUl9TVEFUVVNdICkKKworLyogQ29tcGFjdCAtIGZld2VyIG5ld2xpbmVzICovCisjZGVmaW5lIFRSX1BSSU5UX0NPTVBBQ1QgKF90cmVlX3N3aXRjaGVzW1RSX0NPTVBBQ1RdICYmIFwKKwkJCSAgIVRSX1BSSU5UX0FUVFJJQlVURSAmJiBcCisJCQkgICFUUl9QUklOVF9UQVJHRVRTKQorCisvKiBGSVhNRSBHZXQgcmlkIG9mIHRoaXMgKi8KKyNkZWZpbmUgTUFYX0RFUFRIIDEwMAorCisvKiBEcmF3aW5nIGNoYXJhY3RlciBkZWZpbml0aW9uIGZyb20gcHN0cmVlICovCisvKiBbcHN0cmVlIGNvbW1lbnRdIFVURi04IGRlZmluZXMgYnkgSm9oYW4gTXlyZWVuLCB1cGRhdGVkIGJ5IEJlbiBXaW5zbG93ICovCisjZGVmaW5lIFVURl9WCSJcMzQyXDIyNFwyMDIiCS8qIFUrMjUwMiwgVmVydGljYWwgbGluZSBkcmF3aW5nIGNoYXIgKi8KKyNkZWZpbmUgVVRGX1ZSCSJcMzQyXDIyNFwyMzQiCS8qIFUrMjUxQywgVmVydGljYWwgYW5kIHJpZ2h0ICovCisjZGVmaW5lIFVURl9ICSJcMzQyXDIyNFwyMDAiCS8qIFUrMjUwMCwgSG9yaXpvbnRhbCAqLworI2RlZmluZSBVVEZfVVIJIlwzNDJcMjI0XDIyNCIJLyogVSsyNTE0LCBVcCBhbmQgcmlnaHQgKi8KKyNkZWZpbmUgVVRGX0hECSJcMzQyXDIyNFwyNTQiCS8qIFUrMjUyQywgSG9yaXpvbnRhbCBhbmQgZG93biAqLworCisjZGVmaW5lIFZUX0JFRwkiXDAzMygwXDAxNyIJLyogdXNlIGdyYXBoaWMgY2hhcnMgKi8KKyNkZWZpbmUgVlRfRU5ECSJcMDMzKEIiCS8qIGJhY2sgdG8gbm9ybWFsIGNoYXIgc2V0ICovCisjZGVmaW5lIFZUX1YJIngiCQkvKiBzZWUgVVRGIGRlZmluaXRpb25zIGFib3ZlICovCisjZGVmaW5lIFZUX1ZSCSJ0IgorI2RlZmluZSBWVF9ICSJxIgorI2RlZmluZSBWVF9VUgkibSIKKyNkZWZpbmUgVlRfSEQJInciCisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKmVtcHR5XzI7CS8qICAgICovCisJY29uc3QgY2hhciAqYnJhbmNoXzI7CS8qIHwtICovCisJY29uc3QgY2hhciAqdmVydF8yOwkvKiB8ICAqLworCWNvbnN0IGNoYXIgKmxhc3RfMjsJLyogYC0gKi8KKwljb25zdCBjaGFyICpzaW5nbGVfMzsJLyogLS0tICovCisJY29uc3QgY2hhciAqZmlyc3RfMzsJLyogLSstICovCit9CitfdHN5bV9hc2NpaSA9IHsKKwkiICAiLAorCSJ8LSIsCisJInwgIiwKKwkiYC0iLAorCSItLS0iLAorCSItKy0iCit9LAorX3RzeW1fdXRmID0geworCSIgICIsCisJVVRGX1ZSIFVURl9ILAorCVVURl9WICIgIiwKKwlVVEZfVVIgVVRGX0gsCisJVVRGX0ggVVRGX0ggVVRGX0gsCisJVVRGX0ggVVRGX0hEIFVURl9ICit9LAorX3RzeW1fdnQxMDAgPSB7CisJIiAgIiwKKwlWVF9CRUcgVlRfVlIgVlRfSCBWVF9FTkQsCisJVlRfQkVHIFZUX1YgVlRfRU5EICIgIiwKKwlWVF9CRUcgVlRfVVIgVlRfSCBWVF9FTkQsCisJVlRfQkVHIFZUX0ggVlRfSCBWVF9IIFZUX0VORCwKKwlWVF9CRUcgVlRfSCBWVF9IRCBWVF9IIFZUX0VORAorfSwKKypfdHN5bSA9ICZfdHN5bV9hc2NpaTsKKworLyoKKyAqIFRyZWUgZHJhd2luZyBmdW5jdGlvbnMuCisgKi8KKy8qIEZJWE1FIEdldCByaWQgb2YgdGhlc2Ugc3RhdGljcyAtIHVzZSBkeW5hbWljIHN0cnVjdCAqLworLyogRklYTUUgRXhwbGFpbiB3aGF0IHRoZXNlIHZhcnMgYXJlIGZvciAqLworc3RhdGljIGludCBfdHJlZV93aWR0aFtNQVhfREVQVEhdLCBfdHJlZV9tb3JlW01BWF9ERVBUSF07CitzdGF0aWMgaW50IF90ZXJtd2lkdGggPSA4MDsJLyogTWF4aW11bSBvdXRwdXQgd2lkdGggKi8KK3N0YXRpYyBpbnQgX2N1cl94ID0gMTsJCS8qIEN1cnJlbnQgaG9yaXpvbnRhbCBvdXRwdXQgcG9zaXRpb24gKi8KK3N0YXRpYyBjaGFyIF9sYXN0X2NoYXIgPSAwOworCitzdGF0aWMgdm9pZCBfb3V0X2NoYXIoY29uc3QgdW5zaWduZWQgYykKK3sKKwkvKiBPbmx5IGZpcnN0IFVURi04IGNoYXIgY291bnRzICovCisJX2N1cl94ICs9ICgoYyAmIDB4YzApICE9IDB4ODApOworCisJaWYgKCFfdHJlZV9zd2l0Y2hlc1tUUl9UUlVOQ0FURV0pIHsKKwkJcHV0Y2hhcigoaW50KSBjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRydW5jYXRpb24/ICovCisJaWYgKF9jdXJfeCA8PSBfdGVybXdpZHRoKQorCQlwdXRjaGFyKChpbnQpIGMpOworCisJaWYgKF9jdXJfeCA9PSBfdGVybXdpZHRoICsgMSAmJiAoKGMgJiAweGMwKSAhPSAweDgwKSkgeworCQlpZiAoX2xhc3RfY2hhciB8fCAoYyAmIDB4ODApKSB7CisJCQlwdXRjaGFyKCcuJyk7CisJCQlwdXRjaGFyKCcuJyk7CisJCQlwdXRjaGFyKCcuJyk7CisJCX0gZWxzZSB7CisJCQlfbGFzdF9jaGFyID0gYzsKKwkJCV9jdXJfeC0tOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3V0X3N0cmluZyhjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKCpzdHIpCisJCV9vdXRfY2hhcigodW5zaWduZWQgY2hhcikgKnN0cisrKTsKK30KKworLyogbm9uLW5lZ2F0aXZlIGludGVnZXJzIG9ubHkgKi8KK3N0YXRpYyB1bnNpZ25lZCBfb3V0X2ludCh1bnNpZ25lZCBudW0pCit7CisJdW5zaWduZWQgZGlnaXRzID0gMDsKKwl1bnNpZ25lZCBkaXZpOworCisJaWYgKCFudW0pIHsKKwkJX291dF9jaGFyKCcwJyk7CisJCXJldHVybiAxOworCX0KKworCS8qIG5vbiB6ZXJvIGNhc2UgKi8KKwlmb3IgKGRpdmkgPSAxOyBudW0gLyBkaXZpOyBkaXZpICo9IDEwKQorCQlkaWdpdHMrKzsKKworCWZvciAoZGl2aSAvPSAxMDsgZGl2aTsgZGl2aSAvPSAxMCkKKwkJX291dF9jaGFyKCcwJyArIChudW0gLyBkaXZpKSAlIDEwKTsKKworCXJldHVybiBkaWdpdHM7Cit9CisKK3N0YXRpYyB2b2lkIF9vdXRfbmV3bGluZSh2b2lkKQoreworCWlmIChfbGFzdF9jaGFyICYmIF9jdXJfeCA9PSBfdGVybXdpZHRoKQorCQlwdXRjaGFyKF9sYXN0X2NoYXIpOworCV9sYXN0X2NoYXIgPSAwOworCXB1dGNoYXIoJ1xuJyk7CisJX2N1cl94ID0gMTsKK30KKworc3RhdGljIHZvaWQgX291dF9wcmVmaXgodW5zaWduZWQgZGVwdGgpCit7CisJdW5zaWduZWQgeCwgZDsKKworCWZvciAoZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7CisJCWZvciAoeCA9IF90cmVlX3dpZHRoW2RdICsgMTsgeCA+IDA7IHgtLSkKKwkJCV9vdXRfY2hhcignICcpOworCisJCV9vdXRfc3RyaW5nKGQgPT0gZGVwdGggLSAxID8KKwkJCQkhX3RyZWVfbW9yZVtkZXB0aF0gPyBfdHN5bS0+bGFzdF8yIDogX3RzeW0tPmJyYW5jaF8yCisJCQkgICA6IF90cmVlX21vcmVbZCArIDFdID8KKwkJCQlfdHN5bS0+dmVydF8yIDogX3RzeW0tPmVtcHR5XzIpOworCX0KK30KKworLyoKKyAqIERpc3BsYXkgdHJlZQorICovCitzdGF0aWMgdm9pZCBfZGlzcGxheV90cmVlX2F0dHJpYnV0ZXMoc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSkKK3sKKwlpbnQgYXR0ciA9IDA7CisJY29uc3QgY2hhciAqdXVpZDsKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqaW5mbzsKKworCXV1aWQgPSBkbV90cmVlX25vZGVfZ2V0X3V1aWQobm9kZSk7CisJaW5mbyA9IGRtX3RyZWVfbm9kZV9nZXRfaW5mbyhub2RlKTsKKworCWlmICghaW5mby0+ZXhpc3RzKQorCQlyZXR1cm47CisKKwlpZiAoX3RyZWVfc3dpdGNoZXNbVFJfQUNUSVZFXSkgeworCQlfb3V0X3N0cmluZyhhdHRyKysgPyAiLCAiIDogIiBbIik7CisJCV9vdXRfc3RyaW5nKGluZm8tPnN1c3BlbmRlZCA/ICJTVVNQRU5ERUQiIDogIkFDVElWRSIpOworCX0KKworCWlmIChfdHJlZV9zd2l0Y2hlc1tUUl9SV10pIHsKKwkJX291dF9zdHJpbmcoYXR0cisrID8gIiwgIiA6ICIgWyIpOworCQlfb3V0X3N0cmluZyhpbmZvLT5yZWFkX29ubHkgPyAiUk8iIDogIlJXIik7CisJfQorCisJaWYgKF90cmVlX3N3aXRjaGVzW1RSX09QRU5DT1VOVF0pIHsKKwkJX291dF9zdHJpbmcoYXR0cisrID8gIiwgIiA6ICIgWyIpOworCQkodm9pZCkgX291dF9pbnQoKHVuc2lnbmVkKSBpbmZvLT5vcGVuX2NvdW50KTsKKwl9CisKKwlpZiAoX3RyZWVfc3dpdGNoZXNbVFJfVVVJRF0pIHsKKwkJX291dF9zdHJpbmcoYXR0cisrID8gIiwgIiA6ICIgWyIpOworCQlfb3V0X3N0cmluZyh1dWlkICYmICp1dWlkID8gdXVpZCA6ICIiKTsKKwl9CisKKwlpZiAoYXR0cikKKwkJX291dF9jaGFyKCddJyk7Cit9CisKKy8qIEZJWE1FIERpc3BsYXkgdGFibGUgb3Igc3RhdHVzIGxpbmUuIChEaXNhbGxvdyBib3RoPykgKi8KK3N0YXRpYyB2b2lkIF9kaXNwbGF5X3RyZWVfdGFyZ2V0cyhzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBkZXB0aCkKK3sKK30KKworc3RhdGljIHZvaWQgX2Rpc3BsYXlfdHJlZV9ub2RlKHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGRlcHRoLAorCQkJICAgICAgIHVuc2lnbmVkIGZpcnN0X2NoaWxkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgIHVuc2lnbmVkIGxhc3RfY2hpbGQsIHVuc2lnbmVkIGhhc19jaGlsZHJlbikKK3sKKwlpbnQgb2Zmc2V0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmluZm87CisJaW50IGZpcnN0X29uX2xpbmUgPSAwOworCWNoYXIgZGV2X25hbWVbUEFUSF9NQVhdOworCisJLyogU3ViLXRyZWUgZm9yIHRhcmdldHMgaGFzIDIgbW9yZSBkZXB0aCAqLworCWlmIChkZXB0aCArIDIgPiBNQVhfREVQVEgpCisJCXJldHVybjsKKworCW5hbWUgPSBkbV90cmVlX25vZGVfZ2V0X25hbWUobm9kZSk7CisKKwlpZiAoKCFuYW1lIHx8ICEqbmFtZSkgJiYKKwkgICAgKCFfdHJlZV9zd2l0Y2hlc1tUUl9ERVZJQ0VdICYmICFfdHJlZV9zd2l0Y2hlc1tUUl9CTEtERVZOQU1FXSkpCisJCXJldHVybjsKKworCS8qIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgbm9kZXMgYXQgdGhpcyBkZXB0aCAqLworCV90cmVlX21vcmVbZGVwdGhdID0gIWxhc3RfY2hpbGQ7CisJX3RyZWVfd2lkdGhbZGVwdGhdID0gMDsKKworCWlmIChfY3VyX3ggPT0gMSkKKwkJZmlyc3Rfb25fbGluZSA9IDE7CisKKwlpZiAoIVRSX1BSSU5UX0NPTVBBQ1QgfHwgZmlyc3Rfb25fbGluZSkKKwkJX291dF9wcmVmaXgoZGVwdGgpOworCisJLyogUmVtZW1iZXIgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBjb21wYWN0ICovCisJb2Zmc2V0ID0gX2N1cl94OworCisJaWYgKFRSX1BSSU5UX0NPTVBBQ1QgJiYgIWZpcnN0X29uX2xpbmUpCisJCV9vdXRfc3RyaW5nKF90cmVlX21vcmVbZGVwdGhdID8gX3RzeW0tPmZpcnN0XzMgOiBfdHN5bS0+c2luZ2xlXzMpOworCisJLyogZGlzcGxheSBub2RlICovCisJaWYgKG5hbWUpCisJCV9vdXRfc3RyaW5nKG5hbWUpOworCisJaW5mbyA9IGRtX3RyZWVfbm9kZV9nZXRfaW5mbyhub2RlKTsKKworCWlmIChfdHJlZV9zd2l0Y2hlc1tUUl9CTEtERVZOQU1FXSAmJgorCSAgICBkbV9kZXZpY2VfZ2V0X25hbWUoaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yLCAxLCBkZXZfbmFtZSwgUEFUSF9NQVgpKSB7CisJCV9vdXRfc3RyaW5nKG5hbWUgPyAiIDwiIDogIjwiKTsKKwkJX291dF9zdHJpbmcoZGV2X25hbWUpOworCQlfb3V0X2NoYXIoJz4nKTsKKwl9CisKKwlpZiAoX3RyZWVfc3dpdGNoZXNbVFJfREVWSUNFXSkgeworCQlfb3V0X3N0cmluZyhuYW1lID8gIiAoIiA6ICIoIik7CisJCSh2b2lkKSBfb3V0X2ludChpbmZvLT5tYWpvcik7CisJCV9vdXRfY2hhcignOicpOworCQkodm9pZCkgX291dF9pbnQoaW5mby0+bWlub3IpOworCQlfb3V0X2NoYXIoJyknKTsKKwl9CisKKwkvKiBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbyAqLworCWlmIChUUl9QUklOVF9BVFRSSUJVVEUpCisJCV9kaXNwbGF5X3RyZWVfYXR0cmlidXRlcyhub2RlKTsKKworCWlmIChUUl9QUklOVF9DT01QQUNUKQorCQlfdHJlZV93aWR0aFtkZXB0aF0gPSBfY3VyX3ggLSBvZmZzZXQ7CisKKwlpZiAoIVRSX1BSSU5UX0NPTVBBQ1QgfHwgIWhhc19jaGlsZHJlbikKKwkJX291dF9uZXdsaW5lKCk7CisKKwlpZiAoVFJfUFJJTlRfVEFSR0VUUykgeworCQlfdHJlZV9tb3JlW2RlcHRoICsgMV0gPSBoYXNfY2hpbGRyZW47CisJCV9kaXNwbGF5X3RyZWVfdGFyZ2V0cyhub2RlLCBkZXB0aCArIDIpOworCX0KK30KKworLyoKKyAqIFdhbGsgdGhlIGRlcGVuZGVuY3kgdHJlZQorICovCitzdGF0aWMgdm9pZCBfZGlzcGxheV90cmVlX3dhbGtfY2hpbGRyZW4oc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJdW5zaWduZWQgZGVwdGgpCit7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqY2hpbGQsICpuZXh0X2NoaWxkOworCXZvaWQgKmhhbmRsZSA9IE5VTEw7CisJdWludDMyX3QgaW52ZXJ0ZWQgPSBfdHJlZV9zd2l0Y2hlc1tUUl9CT1RUT01VUF07CisJdW5zaWduZWQgZmlyc3RfY2hpbGQgPSAxOworCXVuc2lnbmVkIGhhc19jaGlsZHJlbjsKKworCW5leHRfY2hpbGQgPSBkbV90cmVlX25leHRfY2hpbGQoJmhhbmRsZSwgbm9kZSwgaW52ZXJ0ZWQpOworCisJd2hpbGUgKChjaGlsZCA9IG5leHRfY2hpbGQpKSB7CisJCW5leHRfY2hpbGQgPSBkbV90cmVlX25leHRfY2hpbGQoJmhhbmRsZSwgbm9kZSwgaW52ZXJ0ZWQpOworCQloYXNfY2hpbGRyZW4gPQorCQkgICAgZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihjaGlsZCwgaW52ZXJ0ZWQpID8gMSA6IDA7CisKKwkJX2Rpc3BsYXlfdHJlZV9ub2RlKGNoaWxkLCBkZXB0aCwgZmlyc3RfY2hpbGQsCisJCQkJICAgbmV4dF9jaGlsZCA/IDBVIDogMVUsIGhhc19jaGlsZHJlbik7CisKKwkJaWYgKGhhc19jaGlsZHJlbikKKwkJCV9kaXNwbGF5X3RyZWVfd2Fsa19jaGlsZHJlbihjaGlsZCwgZGVwdGggKyAxKTsKKworCQlmaXJzdF9jaGlsZCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IF9hZGRfZGVwKENNRF9BUkdTKQoreworCWlmIChuYW1lcyAmJgorCSAgICAhZG1fdHJlZV9hZGRfZGV2KF9kdHJlZSwgKHVuc2lnbmVkKSBNQUpPUihuYW1lcy0+ZGV2KSwgKHVuc2lnbmVkKSBNSU5PUihuYW1lcy0+ZGV2KSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDcmVhdGUgYW5kIHdhbGsgZGVwZW5kZW5jeSB0cmVlCisgKi8KK3N0YXRpYyBpbnQgX2J1aWxkX3dob2xlX2RlcHRyZWUoY29uc3Qgc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwlpZiAoX2R0cmVlKQorCQlyZXR1cm4gMTsKKworCWlmICghKF9kdHJlZSA9IGRtX3RyZWVfY3JlYXRlKCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3Byb2Nlc3NfYWxsKGNtZCwgTlVMTCwgMCwgTlVMTCwgMCwgX2FkZF9kZXApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kaXNwbGF5X3RyZWUoQ01EX0FSR1MpCit7CisJaWYgKCFfYnVpbGRfd2hvbGVfZGVwdHJlZShjbWQpKQorCQlyZXR1cm5fMDsKKworCV9kaXNwbGF5X3RyZWVfd2Fsa19jaGlsZHJlbihkbV90cmVlX2ZpbmRfbm9kZShfZHRyZWUsIDAsIDApLCAwKTsKKworCXJldHVybiAxOworfQorCisvKgorICogUmVwb3J0IGRldmljZSBpbmZvcm1hdGlvbgorICovCisKKy8qIGRtIHNwZWNpZmljIGRpc3BsYXkgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgX2ludDMyX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCSAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IGludDMyX3QgdmFsdWUgPSAqKGNvbnN0IGludDMyX3QgKilkYXRhOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9pbnQzMihyaCwgZmllbGQsICZ2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3VpbnQzMl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCB1aW50MzJfdCB2YWx1ZSA9ICooY29uc3QgaW50MzJfdCAqKWRhdGE7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3VpbnQzMihyaCwgZmllbGQsICZ2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3dfdW5pdHModm9pZCkKK3sKKwkvKiAtLW5vc3VmZml4IG92ZXJyaWRlcyAtLXVuaXRzICovCisJaWYgKF9zd2l0Y2hlc1tOT1NVRkZJWF9BUkddKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAoX2ludF9hcmdzW1VOSVRTX0FSR10pID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX2RtX25hbWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRtX3Rhc2tfZ2V0X25hbWUoKGNvbnN0IHN0cnVjdCBkbV90YXNrICopIGRhdGEpOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX21hbmdsZWRfbmFtZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyICpuYW1lOworCWludCByID0gMDsKKworCWlmICgobmFtZSA9IGRtX3Rhc2tfZ2V0X25hbWVfbWFuZ2xlZCgoY29uc3Qgc3RydWN0IGRtX3Rhc2sgKikgZGF0YSkpKSB7CisJCXIgPSBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSAmbmFtZSk7CisJCWRtX2ZyZWUobmFtZSk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3VubWFuZ2xlZF9uYW1lX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNoYXIgKm5hbWU7CisJaW50IHIgPSAwOworCisJaWYgKChuYW1lID0gZG1fdGFza19nZXRfbmFtZV91bm1hbmdsZWQoKGNvbnN0IHN0cnVjdCBkbV90YXNrICopIGRhdGEpKSkgeworCQlyID0gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgJm5hbWUpOworCQlkbV9mcmVlKG5hbWUpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9kbV91dWlkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCSBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IGNoYXIgKnV1aWQgPSBkbV90YXNrX2dldF91dWlkKChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqKSBkYXRhKTsKKworCWlmICghdXVpZCB8fCAhKnV1aWQpCisJCXV1aWQgPSAiIjsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgJnV1aWQpOworfQorCitzdGF0aWMgaW50IF9kbV9tYW5nbGVkX3V1aWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY2hhciAqdXVpZDsKKwlpbnQgciA9IDA7CisKKwlpZiAoKHV1aWQgPSBkbV90YXNrX2dldF91dWlkX21hbmdsZWQoKGNvbnN0IHN0cnVjdCBkbV90YXNrICopIGRhdGEpKSkgeworCQlyID0gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgJnV1aWQpOworCQlkbV9mcmVlKHV1aWQpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9kbV91bm1hbmdsZWRfdXVpZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyICp1dWlkOworCWludCByID0gMDsKKworCWlmICgodXVpZCA9IGRtX3Rhc2tfZ2V0X3V1aWRfdW5tYW5nbGVkKChjb25zdCBzdHJ1Y3QgZG1fdGFzayAqKSBkYXRhKSkpIHsKKwkJciA9IGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAoY29uc3QgY2hhciAqIGNvbnN0ICopICZ1dWlkKTsKKwkJZG1fZnJlZSh1dWlkKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZG1fcmVhZF9haGVhZF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwl1aW50MzJfdCB2YWx1ZTsKKworCWlmICghZG1fdGFza19nZXRfcmVhZF9haGVhZCgoY29uc3Qgc3RydWN0IGRtX3Rhc2sgKikgZGF0YSwgJnZhbHVlKSkKKwkJdmFsdWUgPSAwOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50MzIocmgsIGZpZWxkLCAmdmFsdWUpOworfQorCitzdGF0aWMgaW50IF9kbV9ibGtfbmFtZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyIGRldl9uYW1lW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpzID0gZGV2X25hbWU7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmluZm8gPSBkYXRhOworCisJaWYgKCFkbV9kZXZpY2VfZ2V0X25hbWUoaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yLCAxLCBkZXZfbmFtZSwgUEFUSF9NQVgpKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IHJlc29sdmUgYmxvY2sgZGV2aWNlIG5hbWUgZm9yICVkOiVkLiIsCisJCQkgIGluZm8tPm1ham9yLCBpbmZvLT5taW5vcik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgJnMpOworfQorCitzdGF0aWMgaW50IF9kbV9pbmZvX3N0YXR1c19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCXN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyIGJ1Zls1XTsKKwljb25zdCBjaGFyICpzID0gYnVmOworCWNvbnN0IHN0cnVjdCBkbV9pbmZvICppbmZvID0gZGF0YTsKKworCWJ1ZlswXSA9IGluZm8tPmxpdmVfdGFibGUgPyAnTCcgOiAnLSc7CisJYnVmWzFdID0gaW5mby0+aW5hY3RpdmVfdGFibGUgPyAnSScgOiAnLSc7CisJYnVmWzJdID0gaW5mby0+c3VzcGVuZGVkID8gJ3MnIDogJy0nOworCWJ1ZlszXSA9IGluZm8tPnJlYWRfb25seSA/ICdyJyA6ICd3JzsKKwlidWZbNF0gPSAnXDAnOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAmcyk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX2luZm9fdGFibGVfbG9hZGVkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmluZm8gPSBkYXRhOworCisJaWYgKGluZm8tPmxpdmVfdGFibGUpIHsKKwkJaWYgKGluZm8tPmluYWN0aXZlX3RhYmxlKQorCQkJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIkJvdGgiLCBOVUxMKTsKKwkJZWxzZQorCQkJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgIkxpdmUiLCBOVUxMKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGluZm8tPmluYWN0aXZlX3RhYmxlKQorCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiSW5hY3RpdmUiLCBOVUxMKTsKKwllbHNlCisJCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICJOb25lIiwgTlVMTCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1faW5mb19zdXNwZW5kZWRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqaW5mbyA9IGRhdGE7CisKKwlpZiAoaW5mby0+c3VzcGVuZGVkKQorCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiU3VzcGVuZGVkIiwgTlVMTCk7CisJZWxzZQorCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiQWN0aXZlIiwgTlVMTCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1faW5mb19yZWFkX29ubHlfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1faW5mbyAqaW5mbyA9IGRhdGE7CisKKwlpZiAoaW5mby0+cmVhZF9vbmx5KQorCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiUmVhZC1vbmx5IiwgTlVMTCk7CisJZWxzZQorCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCAiV3JpdGVhYmxlIiwgTlVMTCk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IF9kbV9pbmZvX2Rldm5vX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWF0sICpyZXBzdHI7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmluZm8gPSBkYXRhOworCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDgpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9iZWdpbl9vYmplY3QgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcml2YXRlKSB7CisJCWlmICghZG1fZGV2aWNlX2dldF9uYW1lKGluZm8tPm1ham9yLCBpbmZvLT5taW5vciwKKwkJCQkJMSwgYnVmLCBQQVRIX01BWCkpIHsKKwkJCXN0YWNrOworCQkJZ290byBvdXRfYWJhbmRvbjsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZDolZCIsCisJCQkJaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiZG1fcG9vbF9hbGxvYyBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0X2FiYW5kb247CisJCX0KKwl9CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBidWYsIHN0cmxlbihidWYpICsgMSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQlnb3RvIG91dF9hYmFuZG9uOworCX0KKworCXJlcHN0ciA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgcmVwc3RyKTsKKwlyZXR1cm4gMTsKKworICAgICAgb3V0X2FiYW5kb246CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kbV90cmVlX25hbWVzKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgdm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaW52ZXJ0ZWQpCit7CisJY29uc3Qgc3RydWN0IGRtX3RyZWVfbm9kZSAqbm9kZSA9IGRhdGE7CisJc3RydWN0IGRtX3RyZWVfbm9kZSAqcGFyZW50OworCXZvaWQgKnQgPSBOVUxMOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGZpcnN0X25vZGUgPSAxOworCWNoYXIgKnJlcHN0cjsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAxNikpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChwYXJlbnQgPSBkbV90cmVlX25leHRfY2hpbGQoJnQsIG5vZGUsIGludmVydGVkKSkpIHsKKwkJbmFtZSA9IGRtX3RyZWVfbm9kZV9nZXRfbmFtZShwYXJlbnQpOworCQlpZiAoIW5hbWUgfHwgISpuYW1lKQorCQkJY29udGludWU7CisJCWlmICghZmlyc3Rfbm9kZSAmJiAhZG1fcG9vbF9ncm93X29iamVjdChtZW0sICIsIiwgMSkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0X2FiYW5kb247CisJCX0KKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgbmFtZSwgMCkpIHsKKwkJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0X2FiYW5kb247CisJCX0KKwkJaWYgKGZpcnN0X25vZGUpCisJCQlmaXJzdF9ub2RlID0gMDsKKwl9CisKKwlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiXDAiLCAxKSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIik7CisJCWdvdG8gb3V0X2FiYW5kb247CisJfQorCisJcmVwc3RyID0gZG1fcG9vbF9lbmRfb2JqZWN0KG1lbSk7CisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCByZXBzdHIpOworCXJldHVybiAxOworCisgICAgICBvdXRfYWJhbmRvbjoKKwlkbV9wb29sX2FiYW5kb25fb2JqZWN0KG1lbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2RtX2RlcHNfbmFtZXNfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJcmV0dXJuIF9kbV90cmVlX25hbWVzKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAwKTsKK30KKworc3RhdGljIGludCBfZG1fdHJlZV9wYXJlbnRzX25hbWVzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCXJldHVybiBfZG1fdHJlZV9uYW1lcyhyaCwgbWVtLCBmaWVsZCwgZGF0YSwgcHJpdmF0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3RyZWVfcGFyZW50c19kZXZzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fdHJlZV9ub2RlICpub2RlID0gZGF0YTsKKwlzdHJ1Y3QgZG1fdHJlZV9ub2RlICpwYXJlbnQ7CisJdm9pZCAqdCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGRtX2luZm8gKmluZm87CisJaW50IGZpcnN0X25vZGUgPSAxOworCWNoYXIgYnVmW0RNX01BWF9UWVBFX05BTUVdLCAqcmVwc3RyOworCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChtZW0sIDE2KSkgeworCQlsb2dfZXJyb3IoImRtX3Bvb2xfYmVnaW5fb2JqZWN0IGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKHBhcmVudCA9IGRtX3RyZWVfbmV4dF9jaGlsZCgmdCwgbm9kZSwgMSkpKSB7CisJCWluZm8gPSBkbV90cmVlX25vZGVfZ2V0X2luZm8ocGFyZW50KTsKKwkJaWYgKCFpbmZvLT5tYWpvciAmJiAhaW5mby0+bWlub3IpCisJCQljb250aW51ZTsKKwkJaWYgKCFmaXJzdF9ub2RlICYmICFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIiwiLCAxKSkgeworCQkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQkJZ290byBvdXRfYWJhbmRvbjsKKwkJfQorCQlpZiAoZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkOiVkIiwKKwkJCQlpbmZvLT5tYWpvciwgaW5mby0+bWlub3IpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJkbV9zbnByaW50ZiBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0X2FiYW5kb247CisJCX0KKwkJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgYnVmLCAwKSkgeworCQkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQkJZ290byBvdXRfYWJhbmRvbjsKKwkJfQorCQlpZiAoZmlyc3Rfbm9kZSkKKwkJCWZpcnN0X25vZGUgPSAwOworCX0KKworCWlmICghZG1fcG9vbF9ncm93X29iamVjdChtZW0sICJcMCIsIDEpKSB7CisJCWxvZ19lcnJvcigiZG1fcG9vbF9ncm93X29iamVjdCBmYWlsZWQiKTsKKwkJZ290byBvdXRfYWJhbmRvbjsKKwl9CisKKwlyZXBzdHIgPSBkbV9wb29sX2VuZF9vYmplY3QobWVtKTsKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHJlcHN0cik7CisJcmV0dXJuIDE7CisKKyAgICAgIG91dF9hYmFuZG9uOgorCWRtX3Bvb2xfYWJhbmRvbl9vYmplY3QobWVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZG1fdHJlZV9wYXJlbnRzX2NvdW50X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlKQoreworCWNvbnN0IHN0cnVjdCBkbV90cmVlX25vZGUgKm5vZGUgPSBkYXRhOworCWludCBudW1fcGFyZW50ID0gZG1fdHJlZV9ub2RlX251bV9jaGlsZHJlbihub2RlLCAxKTsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50KHJoLCBmaWVsZCwgJm51bV9wYXJlbnQpOworfQorCitzdGF0aWMgaW50IF9kbV9kZXBzX2Rpc3BfY29tbW9uKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCptZW0sCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJdm9pZCAqcHJpdmF0ZSwgaW50IGRpc3BfYmxrX2Rldl9uYW1lcykKK3sKKwljb25zdCBzdHJ1Y3QgZG1fZGVwcyAqZGVwcyA9IGRhdGE7CisJY2hhciBidWZbUEFUSF9NQVhdLCAqcmVwc3RyOworCWludCBtYWpvciwgbWlub3I7CisJdW5zaWduZWQgaTsKKworCWlmICghZG1fcG9vbF9iZWdpbl9vYmplY3QobWVtLCAxNikpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2JlZ2luX29iamVjdCBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRlcHMtPmNvdW50OyBpKyspIHsKKwkJbWFqb3IgPSAoaW50KSBNQUpPUihkZXBzLT5kZXZpY2VbaV0pOworCQltaW5vciA9IChpbnQpIE1JTk9SKGRlcHMtPmRldmljZVtpXSk7CisKKwkJaWYgKGRpc3BfYmxrX2Rldl9uYW1lcykgeworCQkJaWYgKCFkbV9kZXZpY2VfZ2V0X25hbWUobWFqb3IsIG1pbm9yLCAxLCBidWYsIFBBVEhfTUFYKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGQgbm90IHJlc29sdmUgYmxvY2sgZGV2aWNlICIKKwkJCQkJICAibmFtZSBmb3IgJWQ6JWQuIiwgbWFqb3IsIG1pbm9yKTsKKwkJCQlnb3RvIG91dF9hYmFuZG9uOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZDolZCIsCisJCQkJICAgICBtYWpvciwgbWlub3IpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJkbV9zbnByaW50ZiBmYWlsZWQiKTsKKwkJCWdvdG8gb3V0X2FiYW5kb247CisJCX0KKworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCBidWYsIDApKSB7CisJCQlsb2dfZXJyb3IoImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIik7CisJCQlnb3RvIG91dF9hYmFuZG9uOworCQl9CisKKwkJaWYgKGkgKyAxIDwgZGVwcy0+Y291bnQgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QobWVtLCAiLCIsIDEpKSB7CisJCQlsb2dfZXJyb3IoImRtX3Bvb2xfZ3Jvd19vYmplY3QgZmFpbGVkIik7CisJCQlnb3RvIG91dF9hYmFuZG9uOworCQl9CisJfQorCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KG1lbSwgIlwwIiwgMSkpIHsKKwkJbG9nX2Vycm9yKCJkbV9wb29sX2dyb3dfb2JqZWN0IGZhaWxlZCIpOworCQlnb3RvIG91dF9hYmFuZG9uOworCX0KKworCXJlcHN0ciA9IGRtX3Bvb2xfZW5kX29iamVjdChtZW0pOworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgcmVwc3RyKTsKKwlyZXR1cm4gMTsKKworICAgICAgb3V0X2FiYW5kb246CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChtZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kbV9kZXBzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsIHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgdm9pZCAqcHJpdmF0ZSkKK3sKKwlyZXR1cm4gX2RtX2RlcHNfZGlzcF9jb21tb24ocmgsIG1lbSwgZmllbGQsIGRhdGEsIHByaXZhdGUsIDApOworfQorCitzdGF0aWMgaW50IF9kbV9kZXBzX2Jsa19uYW1lc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLCBzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCSAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLAorCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpCit7CisJcmV0dXJuIF9kbV9kZXBzX2Rpc3BfY29tbW9uKHJoLCBtZW0sIGZpZWxkLCBkYXRhLCBwcml2YXRlLCAxKTsKK30KKworc3RhdGljIGludCBfZG1fc3Vic3lzdGVtX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgKGNvbnN0IGNoYXIgKmNvbnN0ICopIGRhdGEpOworfQorCitzdGF0aWMgaW50IF9kbV92Z19uYW1lX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAoY29uc3QgY2hhciAqY29uc3QgKikgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX2x2X25hbWVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCisKK3sKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICpjb25zdCAqKSBkYXRhKTsKK30KKworc3RhdGljIGludCBfZG1fbHZfbGF5ZXJfbmFtZV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKKworeworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgKGNvbnN0IGNoYXIgKmNvbnN0ICopIGRhdGEpOworfQorCisvKioKKyAqIEFsbCBfZG1fc3RhdHNfKl9kaXNwIGZ1bmN0aW9ucyBmb3IgYmFzaWMgY291bnRlcnMgYXJlIGlkZW50aWNhbDoKKyAqIG9idGFpbiB0aGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHJlZ2lvbiBhbmQgYXJlYSBhbmQgcGFzcyBpdCB0bworICogZG1fcmVwb3J0X2ZpZWxkX3VpbnQ2NCgpLgorICovCisjZGVmaW5lIE1LX1NUQVRTX0NPVU5URVJfRElTUF9GTihjb3VudGVyKQkJCQkJICBcCitzdGF0aWMgaW50IF9kbV9zdGF0c18gIyMgY291bnRlciAjIyBfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwJCQkgIFwKKwkJCQkgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwJICBcCisJCQkJIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLCBcCisJCQkJIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCQkgIFwKK3sJCQkJCQkJCQkJICBcCisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CQkgIFwKKwl1aW50NjRfdCB2YWx1ZSA9IGRtX3N0YXRzX2dldF8gIyMgY291bnRlcihkbXMsIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULCAgIFwKKwkJCQkJCSAgRE1fU1RBVFNfQVJFQV9DVVJSRU5UKTsgICAgICAgICBcCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50NjQocmgsIGZpZWxkLCAmdmFsdWUpOwkJCSAgXAorfQorCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4ocmVhZHMpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4ocmVhZHNfbWVyZ2VkKQorTUtfU1RBVFNfQ09VTlRFUl9ESVNQX0ZOKHJlYWRfc2VjdG9ycykKK01LX1NUQVRTX0NPVU5URVJfRElTUF9GTihyZWFkX25zZWNzKQorTUtfU1RBVFNfQ09VTlRFUl9ESVNQX0ZOKHdyaXRlcykKK01LX1NUQVRTX0NPVU5URVJfRElTUF9GTih3cml0ZXNfbWVyZ2VkKQorTUtfU1RBVFNfQ09VTlRFUl9ESVNQX0ZOKHdyaXRlX3NlY3RvcnMpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4od3JpdGVfbnNlY3MpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4oaW9faW5fcHJvZ3Jlc3MpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4oaW9fbnNlY3MpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4od2VpZ2h0ZWRfaW9fbnNlY3MpCitNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4odG90YWxfcmVhZF9uc2VjcykKK01LX1NUQVRTX0NPVU5URVJfRElTUF9GTih0b3RhbF93cml0ZV9uc2VjcykKKyN1bmRlZiBNS19TVEFUU19DT1VOVEVSX0RJU1BfRk4KKworc3RhdGljIGludCBfZG1fc3RhdHNfcmVnaW9uX2lkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGdyb3VwX2lkLCByZWdpb25faWQgPSBkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb24oZG1zKTsKKwljaGFyICpncm91cF9idWYgPSBOVUxMLCAqcmVwc3RyOworCisJaWYgKGRtX3N0YXRzX2N1cnJlbnRfb2JqZWN0X3R5cGUoZG1zKSA9PSBETV9TVEFUU19PQkpFQ1RfVFlQRV9HUk9VUCkgeworCQlncm91cF9pZCA9IGRtX3N0YXRzX2dldF9ncm91cF9pZChkbXMsIGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihkbXMpKTsKKwkJaWYgKCFkbV9zdGF0c19nZXRfZ3JvdXBfZGVzY3JpcHRvcihkbXMsIGdyb3VwX2lkLCAmZ3JvdXBfYnVmKSkKKwkJCXJldHVybiAwOworCQkvKiBncm91cF9idWYgd2lsbCBkaXNhcHBlYXIgd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgKi8KKwkJcmVwc3RyID0gZG1fcG9vbF9zdHJkdXAobWVtLCBncm91cF9idWYpOworCQlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsICZncm91cF9pZCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDY0KHJoLCBmaWVsZCwgJnJlZ2lvbl9pZCk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3JlZ2lvbl9zdGFydF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwl1aW50NjRfdCByZWdpb25fc3RhcnQ7CisJY29uc3QgY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbDsKKwljaGFyIHVuaXRzID0gX2Rpc3BfdW5pdHM7CisJdWludDY0X3QgZmFjdG9yID0gX2Rpc3BfZmFjdG9yOworCisJaWYgKCFkbV9zdGF0c19nZXRfY3VycmVudF9yZWdpb25fc3RhcnQoZG1zLCAmcmVnaW9uX3N0YXJ0KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9zaXplX3RvX3N0cmluZyhtZW0sIHJlZ2lvbl9zdGFydCwgdW5pdHMsIDEsIGZhY3RvciwKKwkJCQkJIF9zaG93X3VuaXRzKCksIERNX1NJWkVfVU5JVCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gKGRvdWJsZSkgcmVnaW9uX3N0YXJ0OworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfcmVnaW9uX2xlbl9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQlzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwl1aW50NjRfdCByZWdpb25fbGVuZ3RoOworCWNvbnN0IGNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWw7CisJY2hhciB1bml0cyA9IF9kaXNwX3VuaXRzOworCXVpbnQ2NF90IGZhY3RvciA9IF9kaXNwX2ZhY3RvcjsKKworCWlmICghZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uX2xlbihkbXMsICZyZWdpb25fbGVuZ3RoKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9zaXplX3RvX3N0cmluZyhtZW0sIHJlZ2lvbl9sZW5ndGgsIHVuaXRzLCAxLCBmYWN0b3IsCisJCQkJCSBfc2hvd191bml0cygpLCBETV9TSVpFX1VOSVQpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IChkb3VibGUpIHJlZ2lvbl9sZW5ndGg7CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19hcmVhX2lkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGFyZWFfaWQgPSBkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhKGRtcyk7CisKKwlpZiAoZG1fc3RhdHNfY3VycmVudF9vYmplY3RfdHlwZShkbXMpID09IERNX1NUQVRTX09CSkVDVF9UWVBFX0dST1VQKQorCQlhcmVhX2lkID0gMDsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfdWludDY0KHJoLCBmaWVsZCwgJmFyZWFfaWQpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19hcmVhX3N0YXJ0X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGFyZWFfc3RhcnQ7CisJY29uc3QgY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbDsKKwljaGFyIHVuaXRzID0gX2Rpc3BfdW5pdHM7CisJdWludDY0X3QgZmFjdG9yID0gX2Rpc3BfZmFjdG9yOworCisJaWYgKCFkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhX3N0YXJ0KGRtcywgJmFyZWFfc3RhcnQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3NpemVfdG9fc3RyaW5nKG1lbSwgYXJlYV9zdGFydCwgdW5pdHMsIDEsIGZhY3RvciwKKwkJCQkJIF9zaG93X3VuaXRzKCksIERNX1NJWkVfVU5JVCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gKGRvdWJsZSkgYXJlYV9zdGFydDsKKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX2FyZWFfb2Zmc2V0X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGFyZWFfb2Zmc2V0OworCWNvbnN0IGNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWw7CisJY2hhciB1bml0cyA9IF9kaXNwX3VuaXRzOworCXVpbnQ2NF90IGZhY3RvciA9IF9kaXNwX2ZhY3RvcjsKKworCWlmICghZG1fc3RhdHNfZ2V0X2N1cnJlbnRfYXJlYV9vZmZzZXQoZG1zLCAmYXJlYV9vZmZzZXQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3NpemVfdG9fc3RyaW5nKG1lbSwgYXJlYV9vZmZzZXQsIHVuaXRzLCAxLCBmYWN0b3IsCisJCQkJCSBfc2hvd191bml0cygpLCBETV9TSVpFX1VOSVQpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IChkb3VibGUpIGFyZWFfb2Zmc2V0OworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfYXJlYV9sZW5fZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJdWludDY0X3QgYXJlYV9sZW47CisJY29uc3QgY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbDsKKwljaGFyIHVuaXRzID0gX2Rpc3BfdW5pdHM7CisJdWludDY0X3QgZmFjdG9yID0gX2Rpc3BfZmFjdG9yOworCisJaWYgKCFkbV9zdGF0c19nZXRfY3VycmVudF9hcmVhX2xlbihkbXMsICZhcmVhX2xlbikpCisJCXJldHVybl8wOworCisJaWYgKCEocmVwc3RyID0gZG1fc2l6ZV90b19zdHJpbmcobWVtLCBhcmVhX2xlbiwgdW5pdHMsIDEsIGZhY3RvciwKKwkJCQkJIF9zaG93X3VuaXRzKCksIERNX1NJWkVfVU5JVCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gKGRvdWJsZSkgYXJlYV9sZW47CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19hcmVhX2NvdW50X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGFyZWFfY291bnQsIHJlZ2lvbjsKKworCXJlZ2lvbiA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihkbXMpOworCWlmICghKGFyZWFfY291bnQgPSBkbV9zdGF0c19nZXRfcmVnaW9uX25yX2FyZWFzKGRtcywgcmVnaW9uKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50NjQocmgsIGZpZWxkLCAmYXJlYV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX2dyb3VwX2lkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCXVpbnQ2NF90IGdyb3VwX2lkOworCisJZ3JvdXBfaWQgPSBkbV9zdGF0c19nZXRfZ3JvdXBfaWQoZG1zLAorCQkJCQkgZG1fc3RhdHNfZ2V0X2N1cnJlbnRfcmVnaW9uKGRtcykpOworCisJaWYgKCFkbV9zdGF0c19ncm91cF9wcmVzZW50KGRtcywgZ3JvdXBfaWQpKSB7CisJCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsICItIiwgJmdyb3VwX2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50NjQocmgsIGZpZWxkLCAmZ3JvdXBfaWQpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19wcm9ncmFtX2lkX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNvbnN0IGNoYXIgKnByb2dyYW1faWQ7CisJaWYgKCEocHJvZ3JhbV9pZCA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9wcm9ncmFtX2lkKGRtcykpKQorCQlyZXR1cm5fMDsKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgJnByb2dyYW1faWQpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c191c2VyX2RhdGFfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY29uc3QgY2hhciAqdXNlcl9kYXRhOworCWlmICghKHVzZXJfZGF0YSA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9hdXhfZGF0YShkbXMpKSkKKwkJcmV0dXJuXzA7CisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAoY29uc3QgY2hhciAqIGNvbnN0ICopICZ1c2VyX2RhdGEpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19uYW1lX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkgICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNvbnN0IGNoYXIgKnN0YXRzX25hbWU7CisJaWYgKCEoc3RhdHNfbmFtZSA9IGRtX3N0YXRzX2dldF9hbGlhcyhkbXMsIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5UKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAoY29uc3QgY2hhciAqIGNvbnN0ICopICZzdGF0c19uYW1lKTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfb2JqZWN0X3R5cGVfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJaW50IHR5cGUgPSBkbV9zdGF0c19jdXJyZW50X29iamVjdF90eXBlKGRtcyk7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgJl9zdGF0c190eXBlc1t0eXBlXSk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3ByZWNpc2VfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJaW50IHByZWNpc2U7CisJcHJlY2lzZSA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbl9wcmVjaXNlX3RpbWVzdGFtcHMoZG1zKTsKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX2ludChyaCwgZmllbGQsIChjb25zdCBpbnQgKikgJnByZWNpc2UpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9oaXN0b2dyYW1fc3RyaW5nKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zLCBpbnQgcmVsLAorCQkJCQkgaW50IHZhbHMsIGludCBib3VuZHMpCit7CisJY29uc3Qgc3RydWN0IGRtX2hpc3RvZ3JhbSAqZG1oOworCWludCBmbGFncyA9IDAsIHdpZHRoID0gKF9zd2l0Y2hlc1tOT0hFQURJTkdTX0FSR10pID8gLTEgOiAwOworCisJaWYgKCEoZG1oID0gZG1fc3RhdHNfZ2V0X2hpc3RvZ3JhbShkbXMsIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCQkgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKSkKKwkJcmV0dXJuICIiOyAvKiBObyBoaXN0b2dyYW0uICovCisKKwlmbGFncyB8PSAodmFscykgPyBETV9ISVNUT0dSQU1fVkFMVUVTCisJCQk6IDA7CisKKwlmbGFncyB8PSBib3VuZHM7CisKKwlmbGFncyB8PSAocmVsKSA/IERNX0hJU1RPR1JBTV9QRVJDRU5UCisJCQk6IDA7CisKKwlmbGFncyB8PSAoX3N3aXRjaGVzW05PVElNRVNVRkZJWF9BUkddKSA/IDAgOiBETV9ISVNUT0dSQU1fU1VGRklYOworCisJLyogRklYTUU6IG1ha2UgdW5pdCBjb252ZXJzaW9uIG9wdGlvbmFsLiAqLworCXJldHVybiBkbV9oaXN0b2dyYW1fdG9fc3RyaW5nKGRtaCwgLTEsIHdpZHRoLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX2hpc3RfY291bnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgaW50IGJvdW5kcykKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljb25zdCBjaGFyICpoaXN0b2dyYW07CisKKwloaXN0b2dyYW0gPSBfZ2V0X2hpc3RvZ3JhbV9zdHJpbmcoZG1zLCAwLCAxLCBib3VuZHMpOyAvKiBjb3VudHMgKi8KKworCWlmICghaGlzdG9ncmFtKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfc3RyaW5nKHJoLCBmaWVsZCwgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSAmaGlzdG9ncmFtKTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfaGlzdF9jb3VudF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX3N0YXRzX2hpc3RfY291bnRfZGlzcChyaCwgZmllbGQsIGRhdGEsIDApOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19oaXN0X2NvdW50X2JvdW5kc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQkgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX3N0YXRzX2hpc3RfY291bnRfZGlzcChyaCwgZmllbGQsIGRhdGEsIERNX0hJU1RPR1JBTV9CT1VORFNfTE9XRVIpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19oaXN0X2NvdW50X3Jhbmdlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQkgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkJICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX3N0YXRzX2hpc3RfY291bnRfZGlzcChyaCwgZmllbGQsIGRhdGEsIERNX0hJU1RPR1JBTV9CT1VORFNfUkFOR0UpOworfQorCitzdGF0aWMgaW50IF9zdGF0c19oaXN0X3BlcmNlbnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgIGludCBib3VuZHMpCit7CisKKwkvKiBGSVhNRTogY29uZmlndXJhYmxlIHRvLXN0cmluZyBvcHRpb25zLiAqLworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNvbnN0IGNoYXIgKmhpc3RvZ3JhbTsKKworCWhpc3RvZ3JhbSA9IF9nZXRfaGlzdG9ncmFtX3N0cmluZyhkbXMsIDEsIDEsIGJvdW5kcyk7IC8qIHJlbGF0aXZlIHZhbHVlcyAqLworCisJaWYgKCFoaXN0b2dyYW0pCisJCXJldHVybl8wOworCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF9zdHJpbmcocmgsIGZpZWxkLCAoY29uc3QgY2hhciAqIGNvbnN0ICopICZoaXN0b2dyYW0pOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19oaXN0X3BlcmNlbnRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIF9zdGF0c19oaXN0X3BlcmNlbnRfZGlzcChyaCwgZmllbGQsIGRhdGEsIDApOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19oaXN0X3BlcmNlbnRfYm91bmRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJCSAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBfc3RhdHNfaGlzdF9wZXJjZW50X2Rpc3AocmgsIGZpZWxkLCBkYXRhLCBETV9ISVNUT0dSQU1fQk9VTkRTX0xPV0VSKTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfaGlzdF9wZXJjZW50X3Jhbmdlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQkgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX3N0YXRzX2hpc3RfcGVyY2VudF9kaXNwKHJoLCBmaWVsZCwgZGF0YSwgRE1fSElTVE9HUkFNX0JPVU5EU19SQU5HRSk7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX2hpc3RfYm91bmRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgaW50IGJvdW5kcykKK3sKKwkvKiBGSVhNRTogY29uZmlndXJhYmxlIHRvLXN0cmluZyBvcHRpb25zLiAqLworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNvbnN0IGNoYXIgKmhpc3RvZ3JhbTsKKworCWhpc3RvZ3JhbSA9IF9nZXRfaGlzdG9ncmFtX3N0cmluZyhkbXMsIDAsIDAsIGJvdW5kcyk7CisKKwlpZiAoIWhpc3RvZ3JhbSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gZG1fcmVwb3J0X2ZpZWxkX3N0cmluZyhyaCwgZmllbGQsIChjb25zdCBjaGFyICogY29uc3QgKikgJmhpc3RvZ3JhbSk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX2hpc3RfYm91bmRzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXJldHVybiBfc3RhdHNfaGlzdF9ib3VuZHNfZGlzcChyaCwgZmllbGQsIGRhdGEsIERNX0hJU1RPR1JBTV9CT1VORFNfTE9XRVIpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19oaXN0X3Jhbmdlc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gX3N0YXRzX2hpc3RfYm91bmRzX2Rpc3AocmgsIGZpZWxkLCBkYXRhLCBETV9ISVNUT0dSQU1fQk9VTkRTX1JBTkdFKTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfaGlzdF9iaW5zX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWludCBiaW5zOworCWJpbnMgPSBkbV9zdGF0c19nZXRfcmVnaW9uX25yX2hpc3RvZ3JhbV9iaW5zKGRtcywgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQpOworCXJldHVybiBkbV9yZXBvcnRfZmllbGRfaW50KHJoLCBmaWVsZCwgKGNvbnN0IGludCAqKSAmYmlucyk7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3JycW1fZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY2hhciBidWZbNjRdOworCWNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWwsIHJycW07CisKKwlpZiAoIWRtX3N0YXRzX2dldF9yZF9tZXJnZXNfcGVyX3NlYyhkbXMsICZycnFtLAorCQkJCQkgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJCSAgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCWlmICghZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMmYiLCBycnFtKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3N0cmR1cChtZW0sIGJ1ZikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gcnJxbTsKKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfd3JxbV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgd3JxbTsKKworCWlmICghZG1fc3RhdHNfZ2V0X3dyX21lcmdlc19wZXJfc2VjKGRtcywgJndycW0sCisJCQkJCSAgICBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCwKKwkJCQkJICAgIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHdycW0pKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgYnVmKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSB3cnFtOworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19yc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgcnM7CisKKwlpZiAoIWRtX3N0YXRzX2dldF9yZWFkc19wZXJfc2VjKGRtcywgJnJzLAorCQkJCQlETV9TVEFUU19SRUdJT05fQ1VSUkVOVCwKKwkJCQkJRE1fU1RBVFNfQVJFQV9DVVJSRU5UKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjJmIiwgcnMpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgYnVmKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSByczsKKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfd3NfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgICAgc3RydWN0IGRtX3Bvb2wgKm1lbSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY2hhciBidWZbNjRdOworCWNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWwsIHdzOworCisJaWYgKCFkbV9zdGF0c19nZXRfd3JpdGVzX3Blcl9zZWMoZG1zLCAmd3MsCisJCQkJCSBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCwKKwkJCQkJIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHdzKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3N0cmR1cChtZW0sIGJ1ZikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gd3M7CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3JlYWRfc2Vjc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCSAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljb25zdCBjaGFyICpyZXBzdHI7CisJZG91YmxlICpzb3J0dmFsLCByc2VjOworCWNoYXIgdW5pdHMgPSBfZGlzcF91bml0czsKKwl1aW50NjRfdCBmYWN0b3IgPSBfZGlzcF9mYWN0b3I7CisKKwlpZiAoIWRtX3N0YXRzX2dldF9yZWFkX3NlY3RvcnNfcGVyX3NlYyhkbXMsICZyc2VjLAorCQkJCQkgICAgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJCSAgICAgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3NpemVfdG9fc3RyaW5nKG1lbSwgKHVpbnQ2NF90KSByc2VjLCB1bml0cywgMSwKKwkJCQkJIGZhY3RvciwgX3Nob3dfdW5pdHMoKSwgRE1fU0laRV9VTklUKSkpCisKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IHJzZWM7CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c193cml0ZV9zZWNzX2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNvbnN0IGNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWwsIHdzZWM7CisJY2hhciB1bml0cyA9IF9kaXNwX3VuaXRzOworCXVpbnQ2NF90IGZhY3RvciA9IF9kaXNwX2ZhY3RvcjsKKworCWlmICghZG1fc3RhdHNfZ2V0X3dyaXRlX3NlY3RvcnNfcGVyX3NlYyhkbXMsICZ3c2VjLAorCQkJCQkJRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJCQlETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3NpemVfdG9fc3RyaW5nKG1lbSwgKHVpbnQ2NF90KSB3c2VjLCB1bml0cywgMSwKKwkJCQkJIGZhY3RvciwgX3Nob3dfdW5pdHMoKSwgRE1fU0laRV9VTklUKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSB3c2VjOworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfYXJxc3pfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCXZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY29uc3QgY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgYXJxc3o7CisJY2hhciB1bml0cyA9IF9kaXNwX3VuaXRzOworCXVpbnQ2NF90IGZhY3RvciA9IF9kaXNwX2ZhY3RvcjsKKworCWlmICghZG1fc3RhdHNfZ2V0X2F2ZXJhZ2VfcmVxdWVzdF9zaXplKGRtcywgJmFycXN6LAorCQkJCQkgICAgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJCSAgICAgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCisJaWYgKCEocmVwc3RyID0gZG1fc2l6ZV90b19zdHJpbmcobWVtLCAodWludDY0X3QpIGFycXN6LCB1bml0cywgMSwKKwkJCQkJIGZhY3RvciwgX3Nob3dfdW5pdHMoKSwgRE1fU0laRV9VTklUKSkpCisKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IGFycXN6OworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfcXVzel9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgcXVzejsKKworCWlmICghZG1fc3RhdHNfZ2V0X2F2ZXJhZ2VfcXVldWVfc2l6ZShkbXMsICZxdXN6LAorCQkJCQkgICAgIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCQkgICAgIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCkpCisJCXJldHVybl8wOworCisJaWYgKCFkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHF1c3opKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgYnVmKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSBxdXN6OworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfYXdhaXRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQlzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCXN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCXZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY2hhciBidWZbNjRdOworCWNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWwsIGF3YWl0OworCisJaWYgKCFkbV9zdGF0c19nZXRfYXZlcmFnZV93YWl0X3RpbWUoZG1zLCAmYXdhaXQsCisJCQkJCSAgICBETV9TVEFUU19SRUdJT05fQ1VSUkVOVCwKKwkJCQkJICAgIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCkpCisJCXJldHVybl8wOworCisJLyogRklYTUU6IG1ha2Ugc2NhbGUgY29uZmlndXJhYmxlICovCisJLyogZGlzcGxheSBpbiBtc2VjcyAqLworCWF3YWl0IC89IE5TRUNfUEVSX01TRUM7CisKKwlpZiAoIWRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjJmIiwgYXdhaXQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgYnVmKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSBhd2FpdDsKKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3JfYXdhaXRfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkICpmaWVsZCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJY2hhciBidWZbNjRdOworCWNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWwsIHJfYXdhaXQ7CisKKwlpZiAoIWRtX3N0YXRzX2dldF9hdmVyYWdlX3JkX3dhaXRfdGltZShkbXMsICZyX2F3YWl0LAorCQkJCQkgICAgICAgRE1fU1RBVFNfUkVHSU9OX0NVUlJFTlQsCisJCQkJCSAgICAgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FOiBtYWtlIHNjYWxlIGNvbmZpZ3VyYWJsZSAqLworCS8qIGRpc3BsYXkgaW4gbXNlY3MgKi8KKwlyX2F3YWl0IC89IE5TRUNfUEVSX01TRUM7CisKKwlpZiAoIWRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjJmIiwgcl9hd2FpdCkpCisJCXJldHVybl8wOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF9zdHJkdXAobWVtLCBidWYpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IHJfYXdhaXQ7CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c193X2F3YWl0X2Rpc3Aoc3RydWN0IGRtX3JlcG9ydCAqcmgsCisJCQkJICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCSAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICB2b2lkICpwcml2YXRlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqZG1zID0gKGNvbnN0IHN0cnVjdCBkbV9zdGF0cyAqKSBkYXRhOworCWNoYXIgYnVmWzY0XTsKKwljaGFyICpyZXBzdHI7CisJZG91YmxlICpzb3J0dmFsLCB3X2F3YWl0OworCisJaWYgKCFkbV9zdGF0c19nZXRfYXZlcmFnZV93cl93YWl0X3RpbWUoZG1zLCAmd19hd2FpdCwKKwkJCQkJICAgICAgIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCQkgICAgICAgRE1fU1RBVFNfQVJFQV9DVVJSRU5UKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBGSVhNRTogbWFrZSBzY2FsZSBjb25maWd1cmFibGUgKi8KKwkvKiBkaXNwbGF5IGluIG1zZWNzICovCisJd19hd2FpdCAvPSBOU0VDX1BFUl9NU0VDOworCisJaWYgKCFkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHdfYXdhaXQpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHJlcHN0ciA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgYnVmKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoc29ydHZhbCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YodWludDY0X3QpKSkpCisJCXJldHVybl8wOworCisJKnNvcnR2YWwgPSB3X2F3YWl0OworCisJZG1fcmVwb3J0X2ZpZWxkX3NldF92YWx1ZShmaWVsZCwgcmVwc3RyLCBzb3J0dmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG1fc3RhdHNfdHB1dF9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJICAgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgdHB1dDsKKworCWlmICghZG1fc3RhdHNfZ2V0X3Rocm91Z2hwdXQoZG1zLCAmdHB1dCwKKwkJCQkgICAgIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCSAgICAgRE1fU1RBVFNfQVJFQV9DVVJSRU5UKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjJmIiwgdHB1dCkpCisJCXJldHVybl8wOworCisJaWYgKCEocmVwc3RyID0gZG1fcG9vbF9zdHJkdXAobWVtLCBidWYpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZih1aW50NjRfdCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IHRwdXQ7CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19zdmN0bV9kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCXN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKmRtcyA9IChjb25zdCBzdHJ1Y3QgZG1fc3RhdHMgKikgZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJY2hhciAqcmVwc3RyOworCWRvdWJsZSAqc29ydHZhbCwgc3ZjdG07CisKKwlpZiAoIWRtX3N0YXRzX2dldF9zZXJ2aWNlX3RpbWUoZG1zLCAmc3ZjdG0sCisJCQkJICAgICAgIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCSAgICAgICBETV9TVEFUU19BUkVBX0NVUlJFTlQpKQorCQlyZXR1cm5fMDsKKworCS8qIEZJWE1FOiBtYWtlIHNjYWxlIGNvbmZpZ3VyYWJsZSAqLworCS8qIGRpc3BsYXkgaW4gbXNlY3MgKi8KKwlzdmN0bSAvPSBOU0VDX1BFUl9NU0VDOworCisJaWYgKCFkbV9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHN2Y3RtKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3N0cmR1cChtZW0sIGJ1ZikpKQorCQlyZXR1cm5fMDsKKworCWlmICghKHNvcnR2YWwgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKHVpbnQ2NF90KSkpKQorCQlyZXR1cm5fMDsKKworCSpzb3J0dmFsID0gc3ZjdG07CisKKwlkbV9yZXBvcnRfZmllbGRfc2V0X3ZhbHVlKGZpZWxkLCByZXBzdHIsIHNvcnR2YWwpOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3V0aWxfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY29uc3Qgc3RydWN0IGRtX3N0YXRzICpkbXMgPSAoY29uc3Qgc3RydWN0IGRtX3N0YXRzICopIGRhdGE7CisJZG1fcGVyY2VudF90IHV0aWw7CisKKwlpZiAoIWRtX3N0YXRzX2dldF91dGlsaXphdGlvbihkbXMsICZ1dGlsLAorCQkJCSAgICAgIERNX1NUQVRTX1JFR0lPTl9DVVJSRU5ULAorCQkJCSAgICAgIERNX1NUQVRTX0FSRUFfQ1VSUkVOVCkpCisJCXJldHVybl8wOworCisJZG1fcmVwb3J0X2ZpZWxkX3BlcmNlbnQocmgsIGZpZWxkLCAmdXRpbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RtX3N0YXRzX3NhbXBsZV9pbnRlcnZhbF9uc19kaXNwKHN0cnVjdCBkbV9yZXBvcnQgKnJoLAorCQkJCQkgICAgIHN0cnVjdCBkbV9wb29sICptZW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSAgICAgc3RydWN0IGRtX3JlcG9ydF9maWVsZCAqZmllbGQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgdm9pZCAqcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwkvKiBGSVhNRTogdXNlIGludGVybmFsIGludGVydmFsIGVzdGltYXRlIHdoZW4gc3VwcG9ydGVkIGJ5IGxpYmRtICovCisJcmV0dXJuIGRtX3JlcG9ydF9maWVsZF91aW50NjQocmgsIGZpZWxkLCAmX2xhc3RfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgaW50IF9kbV9zdGF0c19zYW1wbGVfaW50ZXJ2YWxfZGlzcChzdHJ1Y3QgZG1fcmVwb3J0ICpyaCwKKwkJCQkJICBzdHJ1Y3QgZG1fcG9vbCAqbWVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgIHN0cnVjdCBkbV9yZXBvcnRfZmllbGQgKmZpZWxkLCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgIHZvaWQgKnByaXZhdGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY2hhciBidWZbNjRdOworCWNoYXIgKnJlcHN0cjsKKwlkb3VibGUgKnNvcnR2YWw7CisKKwlpZiAoIShzb3J0dmFsID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqc29ydHZhbCkpKSkKKwkJcmV0dXJuXzA7CisKKwkqc29ydHZhbCA9IChkb3VibGUpX2xhc3RfaW50ZXJ2YWwgLyAoZG91YmxlKSBOU0VDX1BFUl9TRUM7CisKKwlpZiAoIWRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMi42ZiIsICpzb3J0dmFsKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShyZXBzdHIgPSBkbV9wb29sX3N0cmR1cChtZW0sIGJ1ZikpKQorCQlyZXR1cm5fMDsKKworCWRtX3JlcG9ydF9maWVsZF9zZXRfdmFsdWUoZmllbGQsIHJlcHN0ciwgc29ydHZhbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkICpfdGFza19nZXRfb2JqKHZvaWQgKm9iaikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgZG1zZXR1cF9yZXBvcnRfb2JqICopb2JqKS0+dGFzazsKK30KKworc3RhdGljIHZvaWQgKl9pbmZvX2dldF9vYmoodm9pZCAqb2JqKQoreworCXJldHVybiAoKHN0cnVjdCBkbXNldHVwX3JlcG9ydF9vYmogKilvYmopLT5pbmZvOworfQorCitzdGF0aWMgdm9pZCAqX2RlcHNfZ2V0X29iaih2b2lkICpvYmopCit7CisJcmV0dXJuIGRtX3Rhc2tfZ2V0X2RlcHMoKChzdHJ1Y3QgZG1zZXR1cF9yZXBvcnRfb2JqICopb2JqKS0+ZGVwc190YXNrKTsKK30KKworc3RhdGljIHZvaWQgKl90cmVlX2dldF9vYmoodm9pZCAqb2JqKQoreworCXJldHVybiAoKHN0cnVjdCBkbXNldHVwX3JlcG9ydF9vYmogKilvYmopLT50cmVlX25vZGU7Cit9CisKK3N0YXRpYyB2b2lkICpfc3BsaXRfbmFtZV9nZXRfb2JqKHZvaWQgKm9iaikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgZG1zZXR1cF9yZXBvcnRfb2JqICopb2JqKS0+c3BsaXRfbmFtZTsKK30KKworc3RhdGljIHZvaWQgKl9zdGF0c19nZXRfb2JqKHZvaWQgKm9iaikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgZG1zZXR1cF9yZXBvcnRfb2JqICopb2JqKS0+c3RhdHM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X29iamVjdF90eXBlIF9yZXBvcnRfdHlwZXNbXSA9IHsKKwl7IERSX1RBU0ssICJNYXBwZWQgRGV2aWNlIE5hbWUiLCAibmFtZV8iLCBfdGFza19nZXRfb2JqIH0sCisJeyBEUl9JTkZPLCAiTWFwcGVkIERldmljZSBJbmZvcm1hdGlvbiIsICJpbmZvXyIsIF9pbmZvX2dldF9vYmogfSwKKwl7IERSX0RFUFMsICJNYXBwZWQgRGV2aWNlIFJlbGF0aW9uc2hpcCBJbmZvcm1hdGlvbiIsICJkZXBzXyIsIF9kZXBzX2dldF9vYmogfSwKKwl7IERSX1RSRUUsICJNYXBwZWQgRGV2aWNlIFJlbGF0aW9uc2hpcCBJbmZvcm1hdGlvbiIsICJ0cmVlXyIsIF90cmVlX2dldF9vYmogfSwKKwl7IERSX05BTUUsICJNYXBwZWQgRGV2aWNlIE5hbWUgQ29tcG9uZW50cyIsICJzcGxpdG5hbWVfIiwgX3NwbGl0X25hbWVfZ2V0X29iaiB9LAorCXsgRFJfU1RBVFMsICJNYXBwZWQgRGV2aWNlIFN0YXRpc3RpY3MiLCJzdGF0c18iLCBfc3RhdHNfZ2V0X29iaiB9LAorCXsgRFJfU1RBVFNfTUVUQSwgIk1hcHBlZCBEZXZpY2UgU3RhdGlzdGljcyBSZWdpb24gSW5mb3JtYXRpb24iLCJyZWdpb25fIiwgX3N0YXRzX2dldF9vYmogfSwKKwl7IDAsICIiLCAiIiwgTlVMTCB9Cit9OworCisvKiBDb2x1bW4gZGVmaW5pdGlvbnMgKi8KKy8qIE4uQi4gRmllbGQgbmFtZXMgbXVzdCBub3QgY29udGFpbiB0aGUgc3Vic3RyaW5nICdoZWxwJyBhcyB0aGlzIHdpbGwgZGlzYWJsZSAtLWNvdW50LiAqLworI2RlZmluZSBPRkZTRVRfT0Yoc3RyY3QsIGZpZWxkKSAoKChjaGFyKikmKChzdHJ1Y3Qgc3RyY3QqKTApLT5maWVsZCkgLSAoY2hhciopMCkKKyNkZWZpbmUgU1RSIChETV9SRVBPUlRfRklFTERfVFlQRV9TVFJJTkcpCisjZGVmaW5lIE5VTSAoRE1fUkVQT1JUX0ZJRUxEX1RZUEVfTlVNQkVSKQorI2RlZmluZSBTSVogKERNX1JFUE9SVF9GSUVMRF9UWVBFX1NJWkUpCisjZGVmaW5lIFRJTSAoRE1fUkVQT1JUX0ZJRUxEX1RZUEVfVElNRSkKKyNkZWZpbmUgRklFTERfTyh0eXBlLCBzdHJjdCwgc29ydHR5cGUsIGhlYWQsIGZpZWxkLCB3aWR0aCwgZnVuYywgaWQsIGRlc2MpIHtEUl8gIyMgdHlwZSwgc29ydHR5cGUsIE9GRlNFVF9PRihzdHJjdCwgZmllbGQpLCB3aWR0aCwgaWQsIGhlYWQsICZfICMjIGZ1bmMgIyMgX2Rpc3AsIGRlc2N9LAorI2RlZmluZSBGSUVMRF9GKHR5cGUsIHNvcnR0eXBlLCBoZWFkLCB3aWR0aCwgZnVuYywgaWQsIGRlc2MpIHtEUl8gIyMgdHlwZSwgc29ydHR5cGUsIDAsIHdpZHRoLCBpZCwgaGVhZCwgJl8gIyMgZnVuYyAjIyBfZGlzcCwgZGVzY30sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1fcmVwb3J0X2ZpZWxkX3R5cGUgX3JlcG9ydF9maWVsZHNbXSA9IHsKKy8qICpJTkRFTlQtT0ZGKiAqLworRklFTERfRihUQVNLLCBTVFIsICJOYW1lIiwgMTYsIGRtX25hbWUsICJuYW1lIiwgIk5hbWUgb2YgbWFwcGVkIGRldmljZS4iKQorRklFTERfRihUQVNLLCBTVFIsICJNYW5nbGVkTmFtZSIsIDE2LCBkbV9tYW5nbGVkX25hbWUsICJtYW5nbGVkX25hbWUiLCAiTWFuZ2xlZCBuYW1lIG9mIG1hcHBlZCBkZXZpY2UuIikKK0ZJRUxEX0YoVEFTSywgU1RSLCAiVW5tYW5nbGVkTmFtZSIsIDE2LCBkbV91bm1hbmdsZWRfbmFtZSwgInVubWFuZ2xlZF9uYW1lIiwgIlVubWFuZ2xlZCBuYW1lIG9mIG1hcHBlZCBkZXZpY2UuIikKK0ZJRUxEX0YoVEFTSywgU1RSLCAiVVVJRCIsIDMyLCBkbV91dWlkLCAidXVpZCIsICJVbmlxdWUgKG9wdGlvbmFsKSBpZGVudGlmaWVyIGZvciBtYXBwZWQgZGV2aWNlLiIpCitGSUVMRF9GKFRBU0ssIFNUUiwgIk1hbmdsZWRVVUlEIiwgMzIsIGRtX21hbmdsZWRfdXVpZCwgIm1hbmdsZWRfdXVpZCIsICJNYW5nbGVkIHVuaXF1ZSAob3B0aW9uYWwpIGlkZW50aWZpZXIgZm9yIG1hcHBlZCBkZXZpY2UuIikKK0ZJRUxEX0YoVEFTSywgU1RSLCAiVW5tYW5nbGVkVVVJRCIsIDMyLCBkbV91bm1hbmdsZWRfdXVpZCwgInVubWFuZ2xlZF91dWlkIiwgIlVubWFuZ2xlZCB1bmlxdWUgKG9wdGlvbmFsKSBpZGVudGlmaWVyIGZvciBtYXBwZWQgZGV2aWNlLiIpCisKKy8qIEZJWE1FIE5leHQgb25lIHNob3VsZCBiZSBJTkZPICovCitGSUVMRF9GKFRBU0ssIE5VTSwgIlJBaGVhZCIsIDYsIGRtX3JlYWRfYWhlYWQsICJyZWFkX2FoZWFkIiwgIlJlYWQgYWhlYWQgdmFsdWUuIikKKworRklFTERfRihJTkZPLCBTVFIsICJCbGtEZXZOYW1lIiwgMTYsIGRtX2Jsa19uYW1lLCAiYmxrZGV2bmFtZSIsICJOYW1lIG9mIGJsb2NrIGRldmljZS4iKQorRklFTERfRihJTkZPLCBTVFIsICJTdGF0IiwgNCwgZG1faW5mb19zdGF0dXMsICJhdHRyIiwgIihMKWl2ZSwgKEkpbmFjdGl2ZSwgKHMpdXNwZW5kZWQsIChyKWVhZC1vbmx5LCByZWFkLSh3KXJpdGUuIikKK0ZJRUxEX0YoSU5GTywgU1RSLCAiVGFibGVzIiwgNiwgZG1faW5mb190YWJsZV9sb2FkZWQsICJ0YWJsZXNfbG9hZGVkIiwgIldoaWNoIG9mIHRoZSBsaXZlIGFuZCBpbmFjdGl2ZSB0YWJsZSBzbG90cyBhcmUgZmlsbGVkLiIpCitGSUVMRF9GKElORk8sIFNUUiwgIlN1c3BlbmRlZCIsIDksIGRtX2luZm9fc3VzcGVuZGVkLCAic3VzcGVuZGVkIiwgIldoZXRoZXIgdGhlIGRldmljZSBpcyBzdXNwZW5kZWQuIikKK0ZJRUxEX0YoSU5GTywgU1RSLCAiUmVhZC1vbmx5IiwgOSwgZG1faW5mb19yZWFkX29ubHksICJyZWFkb25seSIsICJXaGV0aGVyIHRoZSBkZXZpY2UgaXMgcmVhZC1vbmx5IG9yIHdyaXRlYWJsZS4iKQorRklFTERfRihJTkZPLCBTVFIsICJEZXZObyIsIDUsIGRtX2luZm9fZGV2bm8sICJkZXZubyIsICJEZXZpY2UgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMiKQorRklFTERfTyhJTkZPLCBkbV9pbmZvLCBOVU0sICJNYWoiLCBtYWpvciwgMywgaW50MzIsICJtYWpvciIsICJCbG9jayBkZXZpY2UgbWFqb3IgbnVtYmVyLiIpCitGSUVMRF9PKElORk8sIGRtX2luZm8sIE5VTSwgIk1pbiIsIG1pbm9yLCAzLCBpbnQzMiwgIm1pbm9yIiwgIkJsb2NrIGRldmljZSBtaW5vciBudW1iZXIuIikKK0ZJRUxEX08oSU5GTywgZG1faW5mbywgTlVNLCAiT3BlbiIsIG9wZW5fY291bnQsIDQsIGludDMyLCAib3BlbiIsICJOdW1iZXIgb2YgcmVmZXJlbmNlcyB0byBvcGVuIGRldmljZSwgaWYgcmVxdWVzdGVkLiIpCitGSUVMRF9PKElORk8sIGRtX2luZm8sIE5VTSwgIlRhcmciLCB0YXJnZXRfY291bnQsIDQsIGludDMyLCAic2VnbWVudHMiLCAiTnVtYmVyIG9mIHNlZ21lbnRzIGluIGxpdmUgdGFibGUsIGlmIHByZXNlbnQuIikKK0ZJRUxEX08oSU5GTywgZG1faW5mbywgTlVNLCAiRXZlbnQiLCBldmVudF9uciwgNiwgdWludDMyLCAiZXZlbnRzIiwgIk51bWJlciBvZiBtb3N0IHJlY2VudCBldmVudC4iKQorCitGSUVMRF9PKERFUFMsIGRtX2RlcHMsIE5VTSwgIiNEZXZzIiwgY291bnQsIDUsIGludDMyLCAiZGV2aWNlX2NvdW50IiwgIk51bWJlciBvZiBkZXZpY2VzIHVzZWQgYnkgdGhpcyBvbmUuIikKK0ZJRUxEX0YoVFJFRSwgU1RSLCAiRGV2TmFtZXNVc2VkIiwgMTYsIGRtX2RlcHNfbmFtZXMsICJkZXZzX3VzZWQiLCAiTGlzdCBvZiBuYW1lcyBvZiBtYXBwZWQgZGV2aWNlcyB1c2VkIGJ5IHRoaXMgb25lLiIpCitGSUVMRF9GKERFUFMsIFNUUiwgIkRldk5vc1VzZWQiLCAxNiwgZG1fZGVwcywgImRldm5vc191c2VkIiwgIkxpc3Qgb2YgZGV2aWNlIG51bWJlcnMgb2YgZGV2aWNlcyB1c2VkIGJ5IHRoaXMgb25lLiIpCitGSUVMRF9GKERFUFMsIFNUUiwgIkJsa0Rldk5hbWVzVXNlZCIsIDE2LCBkbV9kZXBzX2Jsa19uYW1lcywgImJsa2RldnNfdXNlZCIsICJMaXN0IG9mIG5hbWVzIG9mIGJsb2NrIGRldmljZXMgdXNlZCBieSB0aGlzIG9uZS4iKQorCitGSUVMRF9GKFRSRUUsIE5VTSwgIiNSZWZzIiwgNSwgZG1fdHJlZV9wYXJlbnRzX2NvdW50LCAiZGV2aWNlX3JlZl9jb3VudCIsICJOdW1iZXIgb2YgbWFwcGVkIGRldmljZXMgcmVmZXJlbmNpbmcgdGhpcyBvbmUuIikKK0ZJRUxEX0YoVFJFRSwgU1RSLCAiUmVmTmFtZXMiLCA4LCBkbV90cmVlX3BhcmVudHNfbmFtZXMsICJuYW1lc191c2luZ19kZXYiLCAiTGlzdCBvZiBuYW1lcyBvZiBtYXBwZWQgZGV2aWNlcyB1c2luZyB0aGlzIG9uZS4iKQorRklFTERfRihUUkVFLCBTVFIsICJSZWZEZXZOb3MiLCA5LCBkbV90cmVlX3BhcmVudHNfZGV2cywgImRldm5vc191c2luZ19kZXYiLCAiTGlzdCBvZiBkZXZpY2UgbnVtYmVycyBvZiBtYXBwZWQgZGV2aWNlcyB1c2luZyB0aGlzIG9uZS4iKQorCitGSUVMRF9PKE5BTUUsIGRtX3NwbGl0X25hbWUsIFNUUiwgIlN1YnN5cyIsIHN1YnN5c3RlbSwgNiwgZG1fc3Vic3lzdGVtLCAic3Vic3lzdGVtIiwgIlVzZXJzcGFjZSBzdWJzeXN0ZW0gcmVzcG9uc2libGUgZm9yIHRoaXMgZGV2aWNlLiIpCitGSUVMRF9PKE5BTUUsIGRtX3NwbGl0X25hbWUsIFNUUiwgIlZHIiwgdmdfbmFtZSwgNCwgZG1fdmdfbmFtZSwgInZnX25hbWUiLCAiTFZNIFZvbHVtZSBHcm91cCBuYW1lLiIpCitGSUVMRF9PKE5BTUUsIGRtX3NwbGl0X25hbWUsIFNUUiwgIkxWIiwgbHZfbmFtZSwgNCwgZG1fbHZfbmFtZSwgImx2X25hbWUiLCAiTFZNIExvZ2ljYWwgVm9sdW1lIG5hbWUuIikKK0ZJRUxEX08oTkFNRSwgZG1fc3BsaXRfbmFtZSwgU1RSLCAiTFZMYXllciIsIGx2X2xheWVyLCA3LCBkbV9sdl9sYXllcl9uYW1lLCAibHZfbGF5ZXIiLCAiTFZNIGRldmljZSBsYXllci4iKQorCisvKiBiYXNpYyBzdGF0cyBjb3VudGVycyAqLworRklFTERfRihTVEFUUywgTlVNLCAiI1JlYWRzIiwgNiwgZG1fc3RhdHNfcmVhZHMsICJyZWFkX2NvdW50IiwgIkNvdW50IG9mIHJlYWRzIGNvbXBsZXRlZC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiI1JkTXJncyIsIDcsIGRtX3N0YXRzX3JlYWRzX21lcmdlZCwgInJlYWRzX21lcmdlZF9jb3VudCIsICJDb3VudCBvZiByZWFkIHJlcXVlc3RzIG1lcmdlZC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiI1JkU2VjdG9ycyIsIDEwLCBkbV9zdGF0c19yZWFkX3NlY3RvcnMsICJyZWFkX3NlY3Rvcl9jb3VudCIsICJDb3VudCBvZiBzZWN0b3JzIHJlYWQuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIkFjY1JkVGltZSIsIDExLCBkbV9zdGF0c19yZWFkX25zZWNzLCAicmVhZF90aW1lIiwgIkFjY3VtdWxhdGVkIGR1cmF0aW9uIG9mIGFsbCByZWFkIHJlcXVlc3RzIChucykuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIiNXcml0ZXMiLCA3LCBkbV9zdGF0c193cml0ZXMsICJ3cml0ZV9jb3VudCIsICJDb3VudCBvZiB3cml0ZXMgY29tcGxldGVkLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICIjV3JNcmdzIiwgNywgZG1fc3RhdHNfd3JpdGVzX21lcmdlZCwgIndyaXRlc19tZXJnZWRfY291bnQiLCAiQ291bnQgb2Ygd3JpdGUgcmVxdWVzdHMgbWVyZ2VkLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICIjV3JTZWN0b3JzIiwgMTAsIGRtX3N0YXRzX3dyaXRlX3NlY3RvcnMsICJ3cml0ZV9zZWN0b3JfY291bnQiLCAiQ291bnQgb2Ygc2VjdG9ycyB3cml0dGVuLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICJBY2NXclRpbWUiLCAxMSwgZG1fc3RhdHNfd3JpdGVfbnNlY3MsICJ3cml0ZV90aW1lIiwgIkFjY3VtdWxhdGVkIGR1cmF0aW9uIG9mIGFsbCB3cml0ZXMgKG5zKS4iKQorRklFTERfRihTVEFUUywgTlVNLCAiI0luUHJvZyIsIDcsIGRtX3N0YXRzX2lvX2luX3Byb2dyZXNzLCAiaW5fcHJvZ3Jlc3NfY291bnQiLCAiQ291bnQgb2YgcmVxdWVzdHMgY3VycmVudGx5IGluIHByb2dyZXNzLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICJJb1RpY2tzIiwgNywgZG1fc3RhdHNfaW9fbnNlY3MsICJpb190aWNrcyIsICJOYW5vc2Vjb25kcyBzcGVudCBzZXJ2aWNpbmcgcmVxdWVzdHMuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIlF1ZXVlVGlja3MiLCAxMCwgZG1fc3RhdHNfd2VpZ2h0ZWRfaW9fbnNlY3MsICJxdWV1ZV90aWNrcyIsICJUb3RhbCBuYW5vc2Vjb25kcyBzcGVudCBpbiBxdWV1ZS4iKQorRklFTERfRihTVEFUUywgTlVNLCAiUmRUaWNrcyIsIDcsIGRtX3N0YXRzX3RvdGFsX3JlYWRfbnNlY3MsICJyZWFkX3RpY2tzIiwgIk5hbm9zZWNvbmRzIHNwZW50IHNlcnZpY2luZyByZWFkcy4iKQorRklFTERfRihTVEFUUywgTlVNLCAiV3JUaWNrcyIsIDcsIGRtX3N0YXRzX3RvdGFsX3dyaXRlX25zZWNzLCAid3JpdGVfdGlja3MiLCAiTmFub3NlY29uZHMgc3BlbnQgc2VydmljaW5nIHdyaXRlcy4iKQorCisvKiBTdGF0cyBkZXJpdmVkIG1ldHJpY3MgKi8KK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIlJNcmcvcyIsIDYsIGRtX3N0YXRzX3JycW0sICJyZWFkc19tZXJnZWRfcGVyX3NlYyIsICJSZWFkIHJlcXVlc3RzIG1lcmdlZCBwZXIgc2Vjb25kLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICJXTXJnL3MiLCA2LCBkbV9zdGF0c193cnFtLCAid3JpdGVzX21lcmdlZF9wZXJfc2VjIiwgIldyaXRlIHJlcXVlc3RzIG1lcmdlZCBwZXIgc2Vjb25kLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICJSL3MiLCAzLCBkbV9zdGF0c19ycywgInJlYWRzX3Blcl9zZWMiLCAiUmVhZHMgcGVyIHNlY29uZC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiVy9zIiwgMywgZG1fc3RhdHNfd3MsICJ3cml0ZXNfcGVyX3NlYyIsICJXcml0ZXMgcGVyIHNlY29uZC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiUlN6L3MiLCA1LCBkbV9zdGF0c19yZWFkX3NlY3MsICJyZWFkX3NpemVfcGVyX3NlYyIsICJTaXplIG9mIGRhdGEgcmVhZCBwZXIgc2Vjb25kLiIpCitGSUVMRF9GKFNUQVRTLCBOVU0sICJXU3ovcyIsIDUsIGRtX3N0YXRzX3dyaXRlX3NlY3MsICJ3cml0ZV9zaXplX3Blcl9zZWMiLCAiU2l6ZSBvZiBkYXRhIHdyaXR0ZW4gcGVyIHNlY29uZC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiQXZnUnFTeiIsIDcsIGRtX3N0YXRzX2FycXN6LCAiYXZnX3JlcXVlc3Rfc2l6ZSIsICJBdmVyYWdlIHJlcXVlc3Qgc2l6ZS4iKQorRklFTERfRihTVEFUUywgTlVNLCAiUVNpemUiLCA1LCBkbV9zdGF0c19xdXN6LCAicXVldWVfc2l6ZSIsICJBdmVyYWdlIHF1ZXVlIHNpemUuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIkFXYWl0IiwgNSwgZG1fc3RhdHNfYXdhaXQsICJhd2FpdCIsICJBdmVyYXRlIHdhaXQgdGltZS4iKQorRklFTERfRihTVEFUUywgTlVNLCAiUmRBV2FpdCIsIDcsIGRtX3N0YXRzX3JfYXdhaXQsICJyZWFkX2F3YWl0IiwgIkF2ZXJhdGUgcmVhZCB3YWl0IHRpbWUuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIldyQVdhaXQiLCA3LCBkbV9zdGF0c193X2F3YWl0LCAid3JpdGVfYXdhaXQiLCAiQXZlcmF0ZSB3cml0ZSB3YWl0IHRpbWUuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIlRocm91Z2hwdXQiLCAxMCwgZG1fc3RhdHNfdHB1dCwgInRocm91Z2hwdXQiLCAiVGhyb3VnaHB1dC4iKQorRklFTERfRihTVEFUUywgTlVNLCAiU3ZjVG0iLCA1LCBkbV9zdGF0c19zdmN0bSwgInNlcnZpY2VfdGltZSIsICJTZXJ2aWNlIHRpbWUuIikKK0ZJRUxEX0YoU1RBVFMsIE5VTSwgIlV0aWwlIiwgNSwgZG1fc3RhdHNfdXRpbCwgInV0aWwiLCAiVXRpbGl6YXRpb24uIikKKworLyogSGlzdG9ncmFtIGZpZWxkcyAqLworRklFTERfRihTVEFUUywgU1RSLCAiSGlzdG9ncmFtIENvdW50cyIsIDE2LCBkbV9zdGF0c19oaXN0X2NvdW50LCAiaGlzdF9jb3VudCIsICJMYXRlbmN5IGhpc3RvZ3JhbSBjb3VudHMuIikKK0ZJRUxEX0YoU1RBVFMsIFNUUiwgIkhpc3RvZ3JhbSBDb3VudHMiLCAxNiwgZG1fc3RhdHNfaGlzdF9jb3VudF9ib3VuZHMsICJoaXN0X2NvdW50X2JvdW5kcyIsICJMYXRlbmN5IGhpc3RvZ3JhbSBjb3VudHMgd2l0aCBiaW4gYm91bmRhcmllcy4iKQorRklFTERfRihTVEFUUywgU1RSLCAiSGlzdG9ncmFtIENvdW50cyIsIDE2LCBkbV9zdGF0c19oaXN0X2NvdW50X3JhbmdlcywgImhpc3RfY291bnRfcmFuZ2VzIiwgIkxhdGVuY3kgaGlzdG9ncmFtIGNvdW50cyB3aXRoIGJpbiByYW5nZXMuIikKK0ZJRUxEX0YoU1RBVFMsIFNUUiwgIkhpc3RvZ3JhbSUiLCAxMCwgZG1fc3RhdHNfaGlzdF9wZXJjZW50LCAiaGlzdF9wZXJjZW50IiwgIlJlbGF0aXZlIGxhdGVuY3kgaGlzdG9ncmFtLiIpCitGSUVMRF9GKFNUQVRTLCBTVFIsICJIaXN0b2dyYW0lIiwgMTAsIGRtX3N0YXRzX2hpc3RfcGVyY2VudF9ib3VuZHMsICJoaXN0X3BlcmNlbnRfYm91bmRzIiwgIlJlbGF0aXZlIGxhdGVuY3kgaGlzdG9ncmFtIHdpdGggYmluIGJvdW5kYXJpZXMuIikKK0ZJRUxEX0YoU1RBVFMsIFNUUiwgIkhpc3RvZ3JhbSUiLCAxMCwgZG1fc3RhdHNfaGlzdF9wZXJjZW50X3JhbmdlcywgImhpc3RfcGVyY2VudF9yYW5nZXMiLCAiUmVsYXRpdmUgbGF0ZW5jeSBoaXN0b2dyYW0gd2l0aCBiaW4gcmFuZ2VzLiIpCisKKy8qIFN0YXRzIGludGVydmFsIGR1cmF0aW9uIGVzdGltYXRlcyAqLworRklFTERfRihTVEFUUywgTlVNLCAiSW50ZXJ2YWxOcyIsIDEwLCBkbV9zdGF0c19zYW1wbGVfaW50ZXJ2YWxfbnMsICJpbnRlcnZhbF9ucyIsICJTYW1wbGluZyBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcy4iKQorRklFTERfRihTVEFUUywgTlVNLCAiSW50ZXJ2YWwiLCA4LCBkbV9zdGF0c19zYW1wbGVfaW50ZXJ2YWwsICJpbnRlcnZhbCIsICJTYW1wbGluZyBpbnRlcnZhbC4iKQorCisvKiBTdGF0cyByZXBvcnQgbWV0YS1maWVsZHMgKi8KK0ZJRUxEX0YoU1RBVFNfTUVUQSwgTlVNLCAiUmdJRCIsIDQsIGRtX3N0YXRzX3JlZ2lvbl9pZCwgInJlZ2lvbl9pZCIsICJSZWdpb24gSUQuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU0laLCAiUmdTdGFydCIsIDcsIGRtX3N0YXRzX3JlZ2lvbl9zdGFydCwgInJlZ2lvbl9zdGFydCIsICJSZWdpb24gc3RhcnQuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU0laLCAiUmdTaXplIiwgNiwgZG1fc3RhdHNfcmVnaW9uX2xlbiwgInJlZ2lvbl9sZW4iLCAiUmVnaW9uIGxlbmd0aC4iKQorRklFTERfRihTVEFUU19NRVRBLCBOVU0sICJBcklEIiwgNCwgZG1fc3RhdHNfYXJlYV9pZCwgImFyZWFfaWQiLCAiQXJlYSBJRC4iKQorRklFTERfRihTVEFUU19NRVRBLCBTSVosICJBclN0YXJ0IiwgNywgZG1fc3RhdHNfYXJlYV9zdGFydCwgImFyZWFfc3RhcnQiLCAiQXJlYSBvZmZzZXQgZnJvbSBzdGFydCBvZiBkZXZpY2UuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU0laLCAiQXJTaXplIiwgNiwgZG1fc3RhdHNfYXJlYV9sZW4sICJhcmVhX2xlbiIsICJBcmVhIGxlbmd0aC4iKQorRklFTERfRihTVEFUU19NRVRBLCBTSVosICJBck9mZiIsIDUsIGRtX3N0YXRzX2FyZWFfb2Zmc2V0LCAiYXJlYV9vZmZzZXQiLCAiQXJlYSBvZmZzZXQgZnJvbSBzdGFydCBvZiByZWdpb24uIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgTlVNLCAiI0FyZWFzIiwgNiwgZG1fc3RhdHNfYXJlYV9jb3VudCwgImFyZWFfY291bnQiLCAiQXJlYSBjb3VudC4iKQorRklFTERfRihTVEFUU19NRVRBLCBOVU0sICJHcnBJRCIsIDUsIGRtX3N0YXRzX2dyb3VwX2lkLCAiZ3JvdXBfaWQiLCAiR3JvdXAgSUQuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU1RSLCAiUHJvZ0lEIiwgNiwgZG1fc3RhdHNfcHJvZ3JhbV9pZCwgInByb2dyYW1faWQiLCAiUHJvZ3JhbSBJRC4iKQorRklFTERfRihTVEFUU19NRVRBLCBTVFIsICJVc2VyRGF0YSIsIDgsIGRtX3N0YXRzX3VzZXJfZGF0YSwgInVzZXJfZGF0YSIsICJBdXhpbGlhcnkgZGF0YS4iKQorRklFTERfRihTVEFUU19NRVRBLCBTVFIsICJQcmVjaXNlIiwgNywgZG1fc3RhdHNfcHJlY2lzZSwgInByZWNpc2UiLCAiU2V0IGlmIG5hbm9zZWNvbmQgcHJlY2lzaW9uIGNvdW50ZXJzIGFyZSBlbmFibGVkLiIpCitGSUVMRF9GKFNUQVRTX01FVEEsIFNUUiwgIiNCaW5zIiwgOSwgZG1fc3RhdHNfaGlzdF9iaW5zLCAiaGlzdF9iaW5zIiwgIlRoZSBudW1iZXIgb2YgaGlzdG9ncmFtIGJpbnMgY29uZmlndXJlZC4iKQorRklFTERfRihTVEFUU19NRVRBLCBTVFIsICJIaXN0b2dyYW0gQm91bmRzIiwgMTYsIGRtX3N0YXRzX2hpc3RfYm91bmRzLCAiaGlzdF9ib3VuZHMiLCAiTGF0ZW5jeSBoaXN0b2dyYW0gYmluIGJvdW5kYXJpZXMuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU1RSLCAiSGlzdG9ncmFtIFJhbmdlcyIsIDE2LCBkbV9zdGF0c19oaXN0X3JhbmdlcywgImhpc3RfcmFuZ2VzIiwgIkxhdGVuY3kgaGlzdG9ncmFtIGJpbiByYW5nZXMuIikKK0ZJRUxEX0YoU1RBVFNfTUVUQSwgU1RSLCAiTmFtZSIsIDE2LCBkbV9zdGF0c19uYW1lLCAic3RhdHNfbmFtZSIsICJTdGF0cyBuYW1lIG9mIGN1cnJlbnQgb2JqZWN0LiIpCitGSUVMRF9GKFNUQVRTX01FVEEsIFNUUiwgIk9ialR5cGUiLCA3LCBkbV9zdGF0c19vYmplY3RfdHlwZSwgIm9ial90eXBlIiwgIlR5cGUgb2Ygc3RhdHMgb2JqZWN0IGJlaW5nIHJlcG9ydGVkLiIpCit7MCwgMCwgMCwgMCwgIiIsICIiLCBOVUxMLCBOVUxMfSwKKy8qICpJTkRFTlQtT04qICovCit9OworCisjdW5kZWYgRklFTERfTworI3VuZGVmIEZJRUxEX0YKKworI3VuZGVmIFNUUgorI3VuZGVmIE5VTQorI3VuZGVmIFNJWgorCitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9yZXBvcnRfb3B0aW9ucyA9ICJuYW1lLG1ham9yLG1pbm9yLGF0dHIsb3BlbixzZWdtZW50cyxldmVudHMsdXVpZCI7CitzdGF0aWMgY29uc3QgY2hhciAqc3BsaXRuYW1lX3JlcG9ydF9vcHRpb25zID0gInZnX25hbWUsbHZfbmFtZSxsdl9sYXllciI7CisKKy8qIFN0YXRzIGNvdW50ZXJzICYgZGVyaXZlZCBtZXRyaWNzLiAqLworI2RlZmluZSBSRF9DT1VOVEVSUyAicmVhZF9jb3VudCxyZWFkc19tZXJnZWRfY291bnQscmVhZF9zZWN0b3JfY291bnQscmVhZF90aW1lLHJlYWRfdGlja3MiCisjZGVmaW5lIFdSX0NPVU5URVJTICJ3cml0ZV9jb3VudCx3cml0ZXNfbWVyZ2VkX2NvdW50LHdyaXRlX3NlY3Rvcl9jb3VudCx3cml0ZV90aW1lLHdyaXRlX3RpY2tzIgorI2RlZmluZSBJT19DT1VOVEVSUyAiaW5fcHJvZ3Jlc3NfY291bnQsaW9fdGlja3MscXVldWVfdGlja3MiCisjZGVmaW5lIENPVU5URVJTIFJEX0NPVU5URVJTICIsIiBXUl9DT1VOVEVSUyAiLCIgSU9fQ09VTlRFUlMKKworI2RlZmluZSBNRVRSSUNTICJyZWFkc19tZXJnZWRfcGVyX3NlYyx3cml0ZXNfbWVyZ2VkX3Blcl9zZWMsIglcCisJCSJyZWFkc19wZXJfc2VjLHdyaXRlc19wZXJfc2VjLCIJCQlcCisJCSJyZWFkX3NpemVfcGVyX3NlYyx3cml0ZV9zaXplX3Blcl9zZWMsIgkJXAorCQkiYXZnX3JlcXVlc3Rfc2l6ZSxxdWV1ZV9zaXplLHV0aWwsIgkJXAorCQkiYXdhaXQscmVhZF9hd2FpdCx3cml0ZV9hd2FpdCIKKworLyogRGV2aWNlLCByZWdpb24gYW5kIGFyZWEgbWV0YWRhdGEuICovCisjZGVmaW5lIFNUQVRTX0RFVl9JTkZPICJzdGF0c25hbWUsZ3JvdXBfaWQscmVnaW9uX2lkLG9ial90eXBlIgorI2RlZmluZSBTVEFUU19BUkVBX0lORk8gImFyZWFfaWQsYXJlYV9zdGFydCxhcmVhX2xlbiIKKyNkZWZpbmUgU1RBVFNfQVJFQV9JTkZPX0ZVTEwgU1RBVFNfREVWX0lORk8gIixyZWdpb25fc3RhcnQscmVnaW9uX2xlbixhcmVhX2NvdW50LGFyZWFfaWQsYXJlYV9zdGFydCxhcmVhX2xlbiIKKyNkZWZpbmUgU1RBVFNfUkVHSU9OX0lORk8gU1RBVFNfREVWX0lORk8gIixyZWdpb25fc3RhcnQscmVnaW9uX2xlbixhcmVhX2NvdW50LGFyZWFfbGVuIgorCisvKiBNaW5pbWFsIHNldCBvZiBmaWVsZHMgZm9yIGhpc3RvZ3JhbSByZXBvcnQuICovCisjZGVmaW5lIFNUQVRTX0hJU1QgU1RBVFNfUkVHSU9OX0lORk8gIix1dGlsLGF3YWl0IgorCisvKiBEZWZhdWx0IHN0YXRzIHJlcG9ydCBvcHRpb25zLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKl9zdGF0c19kZWZhdWx0X3JlcG9ydF9vcHRpb25zID0gU1RBVFNfREVWX0lORk8gIiwiIFNUQVRTX0FSRUFfSU5GTyAiLCIgTUVUUklDUzsKK3N0YXRpYyBjb25zdCBjaGFyICpfc3RhdHNfcmF3X3JlcG9ydF9vcHRpb25zID0gU1RBVFNfREVWX0lORk8gIiwiIFNUQVRTX0FSRUFfSU5GTyAiLCIgQ09VTlRFUlM7CitzdGF0aWMgY29uc3QgY2hhciAqX3N0YXRzX2xpc3Rfb3B0aW9ucyA9IFNUQVRTX1JFR0lPTl9JTkZPICIscHJvZ3JhbV9pZCI7CitzdGF0aWMgY29uc3QgY2hhciAqX3N0YXRzX2FyZWFfbGlzdF9vcHRpb25zID0gU1RBVFNfQVJFQV9JTkZPX0ZVTEwgIixwcm9ncmFtX2lkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpfc3RhdHNfaGlzdF9saXN0X29wdGlvbnMgPSBTVEFUU19SRUdJT05fSU5GTyAiLGhpc3RfYmlucyxoaXN0X2JvdW5kcyI7CitzdGF0aWMgY29uc3QgY2hhciAqX3N0YXRzX2hpc3RfYXJlYV9saXN0X29wdGlvbnMgPSBTVEFUU19BUkVBX0lORk9fRlVMTCAiLGhpc3RfYmlucyxoaXN0X2JvdW5kcyI7CitzdGF0aWMgY29uc3QgY2hhciAqX3N0YXRzX2hpc3Rfb3B0aW9ucyA9IFNUQVRTX0hJU1QgIixoaXN0X2NvdW50X2JvdW5kcyI7CitzdGF0aWMgY29uc3QgY2hhciAqX3N0YXRzX2hpc3RfcmVsYXRpdmVfb3B0aW9ucyA9IFNUQVRTX0hJU1QgIixoaXN0X3BlcmNlbnRfYm91bmRzIjsKKworc3RhdGljIGludCBfcmVwb3J0X2luaXQoY29uc3Qgc3RydWN0IGNvbW1hbmQgKmNtZCwgY29uc3QgY2hhciAqc3ViY29tbWFuZCkKK3sKKwljaGFyICpvcHRpb25zID0gKGNoYXIgKikgZGVmYXVsdF9yZXBvcnRfb3B0aW9uczsKKwljaGFyICpvcHRfZmllbGRzID0gTlVMTDsgLyogb3B0aW9uYWwgZmllbGRzIGZyb20gY29tbWFuZCBsaW5lICovCisJY29uc3QgY2hhciAqa2V5cyA9ICIiOworCWNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICIgIjsKKwljb25zdCBjaGFyICpzZWxlY3Rpb24gPSBOVUxMOworCWludCBhbGlnbmVkID0gMSwgaGVhZGluZ3MgPSAxLCBidWZmZXJlZCA9IDEsIGZpZWxkX3ByZWZpeGVzID0gMDsKKwlpbnQgcXVvdGVkID0gMSwgY29sdW1uc19hc19yb3dzID0gMDsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJc2l6ZV90IGxlbiA9IDA7CisJaW50IHIgPSAwOworCisJaWYgKGNtZCAmJiAhc3RyY21wKGNtZC0+bmFtZSwgInNwbGl0bmFtZSIpKSB7CisJCW9wdGlvbnMgPSAoY2hhciAqKSBzcGxpdG5hbWVfcmVwb3J0X29wdGlvbnM7CisJCV9yZXBvcnRfdHlwZSB8PSBEUl9OQU1FOworCX0KKworCWlmIChjbWQgJiYgIXN0cmNtcChjbWQtPm5hbWUsICJzdGF0cyIpKSB7CisJCV9yZXBvcnRfdHlwZSB8PSBEUl9TVEFUU19NRVRBOworCQlpZiAoIXN0cmNtcChzdWJjb21tYW5kLCAibGlzdCIpKSB7CisJCQlpZiAoIV9zd2l0Y2hlc1tISVNUT0dSQU1fQVJHXSkKKwkJCQlvcHRpb25zID0gKGNoYXIgKikgKChfc3dpdGNoZXNbVkVSQk9TRV9BUkddKQorCQkJCQkJICAgID8gX3N0YXRzX2FyZWFfbGlzdF9vcHRpb25zCisJCQkJCQkgICAgOiBfc3RhdHNfbGlzdF9vcHRpb25zKTsKKwkJCWVsc2UKKwkJCQlvcHRpb25zID0gKGNoYXIgKikgKChfc3dpdGNoZXNbVkVSQk9TRV9BUkddKQorCQkJCQkJICAgID8gX3N0YXRzX2hpc3RfYXJlYV9saXN0X29wdGlvbnMKKwkJCQkJCSAgICA6IF9zdGF0c19oaXN0X2xpc3Rfb3B0aW9ucyk7CisJCX0gZWxzZSB7CisJCQlpZiAoX3N3aXRjaGVzW0hJU1RPR1JBTV9BUkddKQorCQkJCW9wdGlvbnMgPSAoY2hhciAqKSAoKF9zd2l0Y2hlc1tSRUxBVElWRV9BUkddKQorCQkJCQkJICAgID8gX3N0YXRzX2hpc3RfcmVsYXRpdmVfb3B0aW9ucworCQkJCQkJICAgIDogX3N0YXRzX2hpc3Rfb3B0aW9ucyk7CisJCQllbHNlCisJCQkJb3B0aW9ucyA9IChjaGFyICopICgoIV9zd2l0Y2hlc1tSQVdfQVJHXSkKKwkJCQkJCSAgICA/IF9zdGF0c19kZWZhdWx0X3JlcG9ydF9vcHRpb25zCisJCQkJCQkgICAgOiBfc3RhdHNfcmF3X3JlcG9ydF9vcHRpb25zKTsKKwkJCV9yZXBvcnRfdHlwZSB8PSBEUl9TVEFUUzsKKwkJfQorCX0KKworCWlmIChjbWQgJiYgIXN0cmNtcChjbWQtPm5hbWUsICJsaXN0IikpIHsKKwkJb3B0aW9ucyA9IChjaGFyICopIF9zdGF0c19saXN0X29wdGlvbnM7CisJCV9yZXBvcnRfdHlwZSB8PSBEUl9TVEFUU19NRVRBOworCX0KKworCS8qIGVtdWxhdGUgb2xkIGRtc2V0dXAgYmVoYXZpb3VyICovCisJaWYgKF9zd2l0Y2hlc1tOT0hFQURJTkdTX0FSR10pIHsKKwkJc2VwYXJhdG9yID0gIjoiOworCQlhbGlnbmVkID0gMDsKKwkJaGVhZGluZ3MgPSAwOworCX0KKworCWlmIChfc3dpdGNoZXNbVU5CVUZGRVJFRF9BUkddKQorCQlidWZmZXJlZCA9IDA7CisKKwlpZiAoX3N3aXRjaGVzW1JPV1NfQVJHXSkKKwkJY29sdW1uc19hc19yb3dzID0gMTsKKworCWlmIChfc3dpdGNoZXNbVU5RVU9URURfQVJHXSkKKwkJcXVvdGVkID0gMDsKKworCWlmIChfc3dpdGNoZXNbTkFNRVBSRUZJWEVTX0FSR10pIHsKKwkJYWxpZ25lZCA9IDA7CisJCWZpZWxkX3ByZWZpeGVzID0gMTsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW09QVElPTlNfQVJHXSAmJiBfc3RyaW5nX2FyZ3NbT1BUSU9OU19BUkddKSB7CisJCS8qIENvdW50ICYgaW50ZXJ2YWwgZm9yYmlkZGVuIGZvciBoZWxwLiAqLworCQkvKiBGSVhNRSBEZXRlY3QgImhlbHAiIGNvcnJlY3RseSBhbmQgZXhpdCAqLworCQlpZiAoc3Ryc3RyKF9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR10sICJoZWxwIikpIHsKKwkJCV9zd2l0Y2hlc1tDT1VOVF9BUkddID0gMDsKKwkJCV9jb3VudCA9IDE7CisJCQlfc3dpdGNoZXNbSU5URVJWQUxfQVJHXSA9IDA7CisJCQloZWFkaW5ncyA9IDA7CisJCX0KKworCQlpZiAoKl9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR10gIT0gJysnKQorCQkJb3B0aW9ucyA9IF9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR107CisJCWVsc2UgeworCQkJY2hhciAqdG1wb3B0czsKKwkJCW9wdF9maWVsZHMgPSBfc3RyaW5nX2FyZ3NbT1BUSU9OU19BUkddICsgMTsKKwkJCWxlbiA9IHN0cmxlbihvcHRpb25zKSArIHN0cmxlbihvcHRfZmllbGRzKSArIDI7CisJCQlpZiAoISh0bXBvcHRzID0gZG1fbWFsbG9jKGxlbikpKSB7CisJCQkJZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgb3B0aW9uIHN0cmluZy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChkbV9zbnByaW50Zih0bXBvcHRzLCBsZW4sICIlcywlcyIsCisJCQkJCW9wdGlvbnMsIG9wdF9maWVsZHMpIDwgMCkgeworCQkJCWRtX2ZyZWUodG1wb3B0cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlvcHRpb25zID0gdG1wb3B0czsKKwkJfQorCX0KKworCWlmIChfc3dpdGNoZXNbU09SVF9BUkddICYmIF9zdHJpbmdfYXJnc1tTT1JUX0FSR10pIHsKKwkJa2V5cyA9IF9zdHJpbmdfYXJnc1tTT1JUX0FSR107CisJCWJ1ZmZlcmVkID0gMTsKKwkJaWYgKGNtZCAmJiAoIXN0cmNtcChjbWQtPm5hbWUsICJzdGF0dXMiKSB8fCAhc3RyY21wKGNtZC0+bmFtZSwgInRhYmxlIikpKSB7CisJCQllcnIoIi0tc29ydCBpcyBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIHN0YXR1cyBhbmQgdGFibGUiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKF9zd2l0Y2hlc1tTRVBBUkFUT1JfQVJHXSAmJiBfc3RyaW5nX2FyZ3NbU0VQQVJBVE9SX0FSR10pIHsKKwkJc2VwYXJhdG9yID0gX3N0cmluZ19hcmdzW1NFUEFSQVRPUl9BUkddOworCQlhbGlnbmVkID0gMDsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW1NFTEVDVF9BUkddICYmIF9zdHJpbmdfYXJnc1tTRUxFQ1RfQVJHXSkKKwkJc2VsZWN0aW9uID0gX3N0cmluZ19hcmdzW1NFTEVDVF9BUkddOworCisJaWYgKGFsaWduZWQpCisJCWZsYWdzIHw9IERNX1JFUE9SVF9PVVRQVVRfQUxJR05FRDsKKworCWlmIChidWZmZXJlZCkKKwkJZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9CVUZGRVJFRDsKKworCWlmIChoZWFkaW5ncykKKwkJZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9IRUFESU5HUzsKKworCWlmIChmaWVsZF9wcmVmaXhlcykKKwkJZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9GSUVMRF9OQU1FX1BSRUZJWDsKKworCWlmICghcXVvdGVkKQorCQlmbGFncyB8PSBETV9SRVBPUlRfT1VUUFVUX0ZJRUxEX1VOUVVPVEVEOworCisJaWYgKGNvbHVtbnNfYXNfcm93cykKKwkJZmxhZ3MgfD0gRE1fUkVQT1JUX09VVFBVVF9DT0xVTU5TX0FTX1JPV1M7CisKKwlpZiAoIShfcmVwb3J0ID0gZG1fcmVwb3J0X2luaXRfd2l0aF9zZWxlY3Rpb24oJl9yZXBvcnRfdHlwZSwgX3JlcG9ydF90eXBlcywKKwkJCQlfcmVwb3J0X2ZpZWxkcywgb3B0aW9ucywgc2VwYXJhdG9yLCBmbGFncywga2V5cywKKwkJCQlzZWxlY3Rpb24sIE5VTEwsIE5VTEwpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoKF9yZXBvcnRfdHlwZSAmIERSX1RSRUUpICYmIGNtZCAmJiAhX2J1aWxkX3dob2xlX2RlcHRyZWUoY21kKSkgeworCQllcnIoIkludGVybmFsIGRldmljZSBkZXBlbmRlbmN5IHRyZWUgY3JlYXRpb24gZmFpbGVkLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIV9zd2l0Y2hlc1tJTlRFUlZBTF9BUkddKQorCQlfaW50X2FyZ3NbSU5URVJWQUxfQVJHXSA9IDE7IC8qIDFzIGRlZmF1bHQuICovCisKKwlfaW50ZXJ2YWwgPSBOU0VDX1BFUl9TRUMgKiAodWludDY0X3QpIF9pbnRfYXJnc1tJTlRFUlZBTF9BUkddOworCisJaWYgKGZpZWxkX3ByZWZpeGVzKQorCQlkbV9yZXBvcnRfc2V0X291dHB1dF9maWVsZF9uYW1lX3ByZWZpeChfcmVwb3J0LCAiZG1fIik7CisKKwlyID0gMTsKKworb3V0OgorCWlmIChsZW4pCisJCWRtX2ZyZWUob3B0aW9ucyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIExpc3QgZGV2aWNlcworICovCitzdGF0aWMgaW50IF9scyhDTURfQVJHUykKK3sKKwlpZiAoKF9zd2l0Y2hlc1tUQVJHRVRfQVJHXSAmJiBfdGFyZ2V0KSB8fAorCSAgICAoX3N3aXRjaGVzW0VYRUNfQVJHXSAmJiBfY29tbWFuZF90b19leGVjKSkKKwkJcmV0dXJuIF9zdGF0dXMoY21kLCBOVUxMLCBhcmdjLCBhcmd2LCBOVUxMLCAwKTsKKwllbHNlIGlmICgoX3N3aXRjaGVzW1RSRUVfQVJHXSkpCisJCXJldHVybiBfZGlzcGxheV90cmVlKGNtZCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgMCk7CisJZWxzZQorCQlyZXR1cm4gX3Byb2Nlc3NfYWxsKGNtZCwgTlVMTCwgYXJnYywgYXJndiwgMCwgX2Rpc3BsYXlfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX21hbmdsZShDTURfQVJHUykKK3sKKwljb25zdCBjaGFyICpuYW1lLCAqdXVpZDsKKwljaGFyICpuZXdfbmFtZSA9IE5VTEwsICpuZXdfdXVpZCA9IE5VTEw7CisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwlzdHJ1Y3QgZG1faW5mbyBpbmZvOworCWludCByID0gMDsKKwlpbnQgdGFyZ2V0X2Zvcm1hdDsKKworCWlmIChuYW1lcykKKwkJbmFtZSA9IG5hbWVzLT5uYW1lOworCWVsc2UgeworCQlpZiAoIWFyZ2MgJiYgIV9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIV9zd2l0Y2hlc1tNQUpPUl9BUkddKQorCQkJcmV0dXJuIF9wcm9jZXNzX2FsbChjbWQsIE5VTEwsIGFyZ2MsIGFyZ3YsIDAsIF9tYW5nbGUpOworCQluYW1lID0gYXJndlswXTsKKwl9CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfU1RBVFVTKSkpCisJCXJldHVybl8wOworCisJaWYgKCEoX3NldF90YXNrX2RldmljZShkbXQsIG5hbWUsIDApKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIV9zd2l0Y2hlc1tDSEVDS1NfQVJHXSAmJiAhZG1fdGFza19lbmFibGVfY2hlY2tzKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfdGFza19ydW4oZG10KSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfZ2V0X2luZm8oZG10LCAmaW5mbykgfHwgIWluZm8uZXhpc3RzKQorCQlnb3RvX291dDsKKworCXV1aWQgPSBkbV90YXNrX2dldF91dWlkKGRtdCk7CisKKwl0YXJnZXRfZm9ybWF0ID0gX3N3aXRjaGVzW01BTkdMRU5BTUVfQVJHXSA/IF9pbnRfYXJnc1tNQU5HTEVOQU1FX0FSR10KKwkJCQkJCSAgOiBERUZBVUxUX0RNX05BTUVfTUFOR0xJTkc7CisKKwlpZiAodGFyZ2V0X2Zvcm1hdCA9PSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTykgeworCQlpZiAoc3Ryc3RyKG5hbWUsICJcXHg1Y3giKSkgeworCQkJbG9nX2Vycm9yKCJUaGUgbmFtZSBcIiVzXCIgc2VlbXMgdG8gYmUgbWFuZ2xlZCBtb3JlIHRoYW4gb25jZS4gIgorCQkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQgdG8gcmVuYW1lIHRoZSBkZXZpY2UuIiwgbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc3Ryc3RyKHV1aWQsICJcXHg1Y3giKSkgeworCQkJbG9nX2Vycm9yKCJUaGUgVVVJRCBcIiVzXCIgc2VlbXMgdG8gYmUgbWFuZ2xlZCBtb3JlIHRoYW4gb25jZS4gIgorCQkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQgdG8gY29ycmVjdCB0aGUgZGV2aWNlIFVVSUQuIiwgdXVpZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh0YXJnZXRfZm9ybWF0ID09IERNX1NUUklOR19NQU5HTElOR19OT05FKSB7CisJCWlmICghKG5ld19uYW1lID0gZG1fdGFza19nZXRfbmFtZV91bm1hbmdsZWQoZG10KSkpCisJCQlnb3RvX291dDsKKwkJaWYgKCEobmV3X3V1aWQgPSBkbV90YXNrX2dldF91dWlkX3VubWFuZ2xlZChkbXQpKSkKKwkJCWdvdG9fb3V0OworCX0KKwllbHNlIHsKKwkJaWYgKCEobmV3X25hbWUgPSBkbV90YXNrX2dldF9uYW1lX21hbmdsZWQoZG10KSkpCisJCQlnb3RvX291dDsKKwkJaWYgKCEobmV3X3V1aWQgPSBkbV90YXNrX2dldF91dWlkX21hbmdsZWQoZG10KSkpCisJCQlnb3RvX291dDsKKwl9CisKKwkvKiBXZSBjYW4ndCByZW5hbWUgdGhlIFVVSUQsIHRoZSBkZXZpY2UgbXVzdCBiZSByZWFjdGl2YXRlZCBtYW51YWxseS4gKi8KKwlpZiAoc3RyY21wKHV1aWQsIG5ld191dWlkKSkgeworCQlsb2dfZXJyb3IoIiVzOiAlczogVVVJRCBpbiBpbmNvcnJlY3QgZm9ybS4gIiwgbmFtZSwgdXVpZCk7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNoYW5nZSBkZXZpY2UgVVVJRC4gVGhlIGRldmljZSBtdXN0IGJlIGRlYWN0aXZhdGVkIGZpcnN0LiIpOworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm90aGluZyB0byBkbyBpZiB0aGUgbmFtZSBpcyBpbiBjb3JyZWN0IGZvcm0gYWxyZWFkeS4gKi8KKwlpZiAoIXN0cmNtcChuYW1lLCBuZXdfbmFtZSkpIHsKKwkJbG9nX3ByaW50KCIlczogJXM6IG5hbWUgJXNhbHJlYWR5IGluIGNvcnJlY3QgZm9ybSIsIG5hbWUsCisJCQkgICp1dWlkID8gdXVpZCA6ICJbbm8gVVVJRF0iLCAqdXVpZCA/ICJhbmQgVVVJRCAiIDogIiIpOworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCWVsc2UKKwkJbG9nX3ByaW50KCIlczogcmVuYW1pbmcgdG8gJXMiLCBuYW1lLCBuZXdfbmFtZSk7CisKKwkvKiBSZW5hbWUgdG8gY29ycmVjdCBmb3JtIG9mIHRoZSBuYW1lLiAqLworCXIgPSBfZG9fcmVuYW1lKG5hbWUsIG5ld19uYW1lLCBOVUxMKTsKKworb3V0OgorCWRtX2ZyZWUobmV3X25hbWUpOworCWRtX2ZyZWUobmV3X3V1aWQpOworCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zdGF0cyhDTURfQVJHUyk7CitzdGF0aWMgaW50IF9iaW5kX3N0YXRzX2RldmljZShzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAobmFtZSAmJiAhZG1fc3RhdHNfYmluZF9uYW1lKGRtcywgbmFtZSkpCisJCXJldHVybl8wOworCWVsc2UgaWYgKF9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIWRtX3N0YXRzX2JpbmRfdXVpZChkbXMsIF91dWlkKSkKKwkJcmV0dXJuXzA7CisJZWxzZSBpZiAoX3N3aXRjaGVzW01BSk9SX0FSR10gJiYgX3N3aXRjaGVzW01JTk9SX0FSR10KKwkJICYmICFkbV9zdGF0c19iaW5kX2Rldm5vKGRtcywgX2ludF9hcmdzW01BSk9SX0FSR10sCisJCQkJCSBfaW50X2FyZ3NbTUlOT1JfQVJHXSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2JpbmRfc3RhdHNfZnJvbV9mZChzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgaW50IGZkKQoreworCWludCBtYWpvciwgbWlub3I7CisJc3RydWN0IHN0YXQgYnVmOworCisJaWYgKGZzdGF0KGZkLCAmYnVmKSkgeworCQlsb2dfZXJyb3IoImZzdGF0IGZhaWxlZCBmb3IgZmQgJWQuIiwgZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwltYWpvciA9IChpbnQpIE1BSk9SKGJ1Zi5zdF9kZXYpOworCW1pbm9yID0gKGludCkgTUlOT1IoYnVmLnN0X2Rldik7CisKKwlpZiAoIWRtX3N0YXRzX2JpbmRfZGV2bm8oZG1zLCBtYWpvciwgbWlub3IpKQorCQlyZXR1cm5fMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc3RhdHNfY2xlYXJfb25lX3JlZ2lvbihzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKQoreworCisJaWYgKCFkbV9zdGF0c19yZWdpb25fcHJlc2VudChkbXMsIHJlZ2lvbl9pZCkpIHsKKwkJbG9nX2Vycm9yKCJObyBzdWNoIHJlZ2lvbjogJSJQUkl1NjQiLiIsIHJlZ2lvbl9pZCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIWRtX3N0YXRzX2NsZWFyX3JlZ2lvbihkbXMsIHJlZ2lvbl9pZCkpIHsKKwkJbG9nX2Vycm9yKCJDbGVhcmluZyBzdGF0aXN0aWNzIHJlZ2lvbiAlIlBSSXU2NCIgZmFpbGVkLiIsCisJCQkgIHJlZ2lvbl9pZCk7CisJCXJldHVybiAwOworCX0KKwlsb2dfaW5mbygiQ2xlYXJlZCBzdGF0aXN0aWNzIHJlZ2lvbiAlIlBSSXU2NCIuIiwgcmVnaW9uX2lkKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc3RhdHNfY2xlYXJfcmVnaW9ucyhzdHJ1Y3QgZG1fc3RhdHMgKmRtcywgdWludDY0X3QgcmVnaW9uX2lkKQoreworCWludCBhbGxyZWdpb25zID0gKHJlZ2lvbl9pZCA9PSBETV9TVEFUU19SRUdJT05TX0FMTCk7CisKKwlpZiAoIWRtX3N0YXRzX2xpc3QoZG1zLCBOVUxMKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWRtX3N0YXRzX2dldF9ucl9yZWdpb25zKGRtcykpCisJCXJldHVybiAxOworCisJaWYgKCFhbGxyZWdpb25zKQorCQlyZXR1cm4gX3N0YXRzX2NsZWFyX29uZV9yZWdpb24oZG1zLCByZWdpb25faWQpOworCisJZG1fc3RhdHNfZm9yZWFjaF9yZWdpb24oZG1zKSB7CisJCXJlZ2lvbl9pZCA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihkbXMpOworCQlpZiAoIV9zdGF0c19jbGVhcl9vbmVfcmVnaW9uKGRtcywgcmVnaW9uX2lkKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGF0c19jbGVhcihDTURfQVJHUykKK3sKKwlzdHJ1Y3QgZG1fc3RhdHMgKmRtczsKKwl1aW50NjRfdCByZWdpb25faWQ7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IGFsbHJlZ2lvbnMgPSBfc3dpdGNoZXNbQUxMX1JFR0lPTlNfQVJHXTsKKworCS8qIGNsZWFyIGRvZXMgbm90IHVzZSBhIHJlcG9ydCAqLworCWlmIChfcmVwb3J0KSB7CisJCWRtX3JlcG9ydF9mcmVlKF9yZXBvcnQpOworCQlfcmVwb3J0ID0gTlVMTDsKKwl9CisKKwlpZiAoIV9zd2l0Y2hlc1tSRUdJT05fSURfQVJHXSAmJiAhX3N3aXRjaGVzW0FMTF9SRUdJT05TX0FSR10pIHsKKwkJZXJyKCJQbGVhc2Ugc3BlY2lmeSBhIC0tcmVnaW9uaWQgb3IgdXNlIC0tYWxscmVnaW9ucy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5hbWVzKQorCQluYW1lID0gbmFtZXMtPm5hbWU7CisJZWxzZSB7CisJCWlmICghYXJnYyAmJiAhX3N3aXRjaGVzW1VVSURfQVJHXSAmJiAhX3N3aXRjaGVzW01BSk9SX0FSR10pCisJCQlyZXR1cm4gX3Byb2Nlc3NfYWxsKGNtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwgMCwgX3N0YXRzX2NsZWFyKTsKKwkJbmFtZSA9IGFyZ3ZbMF07CisJfQorCisJcmVnaW9uX2lkID0gKGFsbHJlZ2lvbnMpID8gRE1fU1RBVFNfUkVHSU9OU19BTEwKKwkJICAgICA6ICh1aW50NjRfdCkgX2ludF9hcmdzW1JFR0lPTl9JRF9BUkddOworCisJaWYgKCEoZG1zID0gZG1fc3RhdHNfY3JlYXRlKERNX1NUQVRTX1BST0dSQU1fSUQpKSkKKyAgICAgICAgICAgICAgICByZXR1cm5fMDsKKworCWlmICghX2JpbmRfc3RhdHNfZGV2aWNlKGRtcywgbmFtZSkpCisJCWdvdG9fb3V0OworCisJaWYgKCFfc3RhdHNfY2xlYXJfcmVnaW9ucyhkbXMsIHJlZ2lvbl9pZCkpCisJCWdvdG9fb3V0OworCisJZG1fc3RhdHNfZGVzdHJveShkbXMpOworCXJldHVybiAxOworCitvdXQ6CisJZG1fc3RhdHNfZGVzdHJveShkbXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDY0X3QgX2ZhY3Rvcl9mcm9tX3VuaXRzKGNoYXIgKmFyZ3B0ciwgY2hhciAqdW5pdF90eXBlKQoreworCXJldHVybiBkbV91bml0c190b19mYWN0b3IoYXJncHRyLCB1bml0X3R5cGUsIDAsIE5VTEwpOworfQorCisvKioKKyAqIFBhcnNlIGEgc3RhcnQsIGxlbmd0aCwgb3IgYXJlYSBzaXplIGFyZ3VtZW50IGluIGJ5dGVzIGZyb20gYSBzdHJpbmcKKyAqIHVzaW5nIG9wdGlvbmFsIHVuaXRzIGFzIHN1cHBvcnRlZCBieSBfZmFjdG9yX2Zyb21fdW5pdHMoKS4KKyAqLworc3RhdGljIGludCBfc2l6ZV9mcm9tX3N0cmluZyhjaGFyICphcmdwdHIsIHVpbnQ2NF90ICpzaXplLCBjb25zdCBjaGFyICpuYW1lKQoreworCXVpbnQ2NF90IGZhY3RvcjsKKwljaGFyICplbmRwdHIgPSBOVUxMLCB1bml0X3R5cGU7CisJaWYgKCFhcmdwdHIpCisJCXJldHVybl8wOworCisJKnNpemUgPSBzdHJ0b3VsbChhcmdwdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyID09IGFyZ3B0cikgeworCQkqc2l6ZSA9IDA7CisJCWxvZ19lcnJvcigiSW52YWxpZCAlcyBhcmd1bWVudDogXCIlc1wiIiwKKwkJCSAgbmFtZSwgKCphcmdwdHIpID8gYXJncHRyIDogIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKmVuZHB0ciA9PSAnXDAnKSB7CisJCSpzaXplICo9IDUxMjsKKwkJcmV0dXJuIDE7CisJfQorCisJZmFjdG9yID0gX2ZhY3Rvcl9mcm9tX3VuaXRzKGVuZHB0ciwgJnVuaXRfdHlwZSk7CisJaWYgKGZhY3RvcikKKwkJKnNpemUgKj0gZmFjdG9yOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGSVhNRTogZXhwb3NlIHRoaXMgZnJvbSBsaWJkbS1zdGF0cworICovCitzdGF0aWMgdWludDY0X3QgX25yX2FyZWFzX2Zyb21fc3RlcCh1aW50NjRfdCBsZW4sIGludDY0X3Qgc3RlcCkKK3sKKwkvKiBEZWZhdWx0IGlzIG9uZSBhcmVhLiAqLworCWlmICghc3RlcCB8fCAhbGVuKQorCQlyZXR1cm4gMTsKKworCS8qIC0tYXJlYXMgKi8KKwlpZiAoc3RlcCA8IDApCisJCXJldHVybiAodWludDY0X3QpKC1zdGVwKTsKKworCS8qIC0tYXJlYXNpemUgLSBjYXN0IHN0ZXAgdG8gdW5zaWduZWQgYXMgaXQgY2Fubm90IGJlIC12ZSBoZXJlLiAqLworCXJldHVybiAobGVuIC8gc3RlcCkgKyAhIShsZW4gJSAodWludDY0X3QpIHN0ZXApOworfQorCisvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyICovCisjZGVmaW5lIG1heF9pbnRfc3RybGVuKGkpIChzdHJsZW4oI2kpKQorI2RlZmluZSBNQVhfVUlOVDY0X1NUUkxFTiBtYXhfaW50X3N0cmxlbihVSU5UNjRfTUFYKQorc3RhdGljIGludCBfc3RhdHNfZ3JvdXBfc2VnbWVudHMoc3RydWN0IGRtX3N0YXRzICpkbXMsIHVpbnQ2NF90ICpyZWdpb25faWRzLAorCQkJCSBpbnQgY291bnQsIGNvbnN0IGNoYXIgKmFsaWFzKQoreworCS8qIE5VTEwsIGNvbW1hcywgYW5kIGNvdW50ICogcmVnaW9uX2lkICovCisJc2l6ZV90IGJ1ZnNpemUgPSAxICsgY291bnQgKyBjb3VudCAqIE1BWF9VSU5UNjRfU1RSTEVOOworCWNoYXIgKnRoaXNfcmVnaW9uLCAqcmVnaW9ucyA9IE5VTEw7CisJdWludDY0X3QgZ3JvdXBfaWQ7CisJaW50IHIsIGk7CisKKwl0aGlzX3JlZ2lvbiA9IHJlZ2lvbnMgPSBkbV9tYWxsb2MoYnVmc2l6ZSk7CisKKwlpZiAoIXJlZ2lvbnMpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWdpb25faWQgdGFibGUuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qCisJCSAqIFdlIGRvbid0IGV4cGVjdCBsYXJnZSBudW1iZXJzIG9mIHNlZ21lbnRzIChjb21wYXJlZCB0byBlLmcuCisJCSAqIC0tZmlsZW1hcCk6IHVzZSBhIGZpeGVkLXNpemUgYnVmZmVyIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YKKwkJICogIHJlZ2lvbiBpZGVudGlmaWVycyBhbmQgZG8gbm90IGNvbGxhcHNlIGNvbnRpbnVvdXMgcmFuZ2VzCisJCSAqICBvZiBpZGVudGlmaWVycyBpbiB0aGUgZ3JvdXAgZGVzY3JpcHRvciBhcmd1bWVudC4KKwkJICovCisJCXIgPSBkbV9zbnByaW50Zih0aGlzX3JlZ2lvbiwgYnVmc2l6ZSwgRk1UdTY0ICIlcyIsIHJlZ2lvbl9pZHNbaV0sCisJCQkJKGkgPCAoY291bnQgLSAxKSkgPyAiLCIgOiAiIik7CisJCWlmIChyIDwgMCkKKwkJCWdvdG9fYmFkOworCQl0aGlzX3JlZ2lvbiArPSByOworCQlidWZzaXplIC09IHI7CisJfQorCisJLyogcmVmcmVzaCBoYW5kbGUgKi8KKwlpZiAoIShyID0gZG1fc3RhdHNfbGlzdChkbXMsIE5VTEwpKSkKKwkJZ290byBiYWQ7CisKKwlpZiAoKHIgPSBkbV9zdGF0c19jcmVhdGVfZ3JvdXAoZG1zLCByZWdpb25zLCBhbGlhcywgJmdyb3VwX2lkKSkpCisJCXByaW50ZigiR3JvdXBlZCByZWdpb25zICVzIGFzIGdyb3VwIElEICIgRk1UdTY0ICIlcyVzXG4iLAorCQkgICAgICAgcmVnaW9ucywgZ3JvdXBfaWQsIChhbGlhcykgPyAiIHdpdGggYWxpYXMgIiA6ICIiLAorCQkgICAgICAgKGFsaWFzKSA/IDogIiIpOworCWVsc2UKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciByZWdpb25zICVzIiwgcmVnaW9ucyk7CisKK2JhZDoKKwlkbV9mcmVlKHJlZ2lvbnMpOworCXJldHVybiByOworfQorCisvKgorICogQ3JlYXRlIGEgc2luZ2xlIHJlZ2lvbiBzdGFydGluZyBhdCBzdGFydCBhbmQgc3Bhbm5pbmcgbGVuIHNlY3RvcnMsCisgKiBvciwgaWYgdGhlIHNlZ21lbnRzIGFyZ3VtZW50IGlzIG5vLXplcm8gY3JlYXRlIG9uZSByZWdpb24gZm9yIGVhY2gKKyAqIHNlZ21lbnQgcHJlc2VudCBpbiB0aGUgbWFwcGVkIGRldmljZS4gUGFzc2luZyB6ZXJvIGZvciBzZWdtZW50cywKKyAqIHN0YXJ0LCBhbmQgbGVuZ3RoIHdpbGwgY3JlYXRlIGEgc2luZ2xlIHNlZ21lbnQgc3Bhbm5pbmcgdGhlIHdob2xlCisgKiBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgX2RvX3N0YXRzX2NyZWF0ZV9yZWdpb25zKHN0cnVjdCBkbV9zdGF0cyAqZG1zLAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBzdGFydCwKKwkJCQkgICAgdWludDY0X3QgbGVuLCBpbnQ2NF90IHN0ZXAsCisJCQkJICAgIGludCBzZWdtZW50cywKKwkJCQkgICAgY29uc3QgY2hhciAqcHJvZ3JhbV9pZCwKKwkJCQkgICAgY29uc3QgY2hhciAqdXNlcl9kYXRhKQoreworCXVpbnQ2NF90IHRoaXNfc3RhcnQgPSAwLCB0aGlzX2xlbiA9IGxlbiwgcmVnaW9uX2lkID0gVUlOVDY0X0MoMCk7CisJY29uc3QgY2hhciAqZGV2bmFtZSA9IE5VTEwsICpoaXN0b2dyYW0gPSBfc3RyaW5nX2FyZ3NbQk9VTkRTX0FSR107CisJaW50IHIgPSAwLCBjb3VudCA9IDAsIHByZWNpc2UgPSBfc3dpdGNoZXNbUFJFQ0lTRV9BUkddOworCXN0cnVjdCBkbV9oaXN0b2dyYW0gKmJvdW5kcyA9IE5VTEw7IC8qIGhpc3RvZ3JhbSBib3VuZHMgKi8KKwl1aW50NjRfdCAqcmVnaW9uX2lkcyA9IE5VTEw7IC8qIHNlZ21lbnRzICovCisJY2hhciAqdGFyZ2V0X3R5cGUsICpwYXJhbXM7IC8qIHVudXNlZCAqLworCXN0cnVjdCBkbV90YXNrICpkbXQ7CisJc3RydWN0IGRtX2luZm8gaW5mbzsKKwl2b2lkICpuZXh0ID0gTlVMTDsKKworCWlmIChfc3dpdGNoZXNbQUxJQVNfQVJHXSAmJiBfc3dpdGNoZXNbTk9HUk9VUF9BUkddKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHNldCBhbGlhcyB3aXRoIC0tbm9ncm91cC4iKTsKKwkJZG1fc3RhdHNfZGVzdHJveShkbXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGlzdG9ncmFtICYmICEoYm91bmRzID0gZG1faGlzdG9ncmFtX2JvdW5kc19mcm9tX3N0cmluZyhoaXN0b2dyYW0pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfVEFCTEUpKSkgeworCQlkbV9oaXN0b2dyYW1fYm91bmRzX2Rlc3Ryb3koYm91bmRzKTsKKwkJZG1fc3RhdHNfZGVzdHJveShkbXMpOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoIV9zZXRfdGFza19kZXZpY2UoZG10LCBuYW1lLCAwKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3Rhc2tfbm9fb3Blbl9jb3VudChkbXQpKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJaWYgKCFkbV90YXNrX2dldF9pbmZvKGRtdCwgJmluZm8pIHx8ICFpbmZvLmV4aXN0cykKKwkJZ290b19vdXQ7CisKKwlpZiAoIShkZXZuYW1lID0gZG1fdGFza19nZXRfbmFtZShkbXQpKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIXNlZ21lbnRzIHx8IChpbmZvLnRhcmdldF9jb3VudCA9PSAxKSkKKwkJcmVnaW9uX2lkcyA9ICZyZWdpb25faWQ7CisJZWxzZQorCQlyZWdpb25faWRzID0gZG1fbWFsbG9jKGluZm8udGFyZ2V0X2NvdW50ICogc2l6ZW9mKCpyZWdpb25faWRzKSk7CisKKwlkbyB7CisJCXVpbnQ2NF90IHNlZ21lbnRfc3RhcnQsIHNlZ21lbnRfbGVuOworCQluZXh0ID0gZG1fZ2V0X25leHRfdGFyZ2V0KGRtdCwgbmV4dCwgJnNlZ21lbnRfc3RhcnQsICZzZWdtZW50X2xlbiwKKwkJCQkJICAmdGFyZ2V0X3R5cGUsICZwYXJhbXMpOworCisJCS8qIEFjY3VtdWxhdGUgd2hvbGUtZGV2aWNlIHNpemUgZm9yIG5yX2FyZWFzIGNhbGN1bGF0aW9uLiAqLworCQlpZiAoIXNlZ21lbnRzICYmICFsZW4pCisJCQl0aGlzX2xlbiArPSBzZWdtZW50X2xlbjsKKworCQkvKiBTZWdtZW50cyBvciB3aG9sZS1kZXZpY2UuICovCisJCWlmIChzZWdtZW50cyB8fCAhbmV4dCkgeworCQkJLyoKKwkJCSAqIHRoaXNfc3RhcnQgYW5kIHRoaXNfbGVuIGhvbGQgdGhlIHN0YXJ0IGFuZCBsZW5ndGggaW4KKwkJCSAqIHNlY3RvcnMgb2YgdGhlIHRvLWJlLWNyZWF0ZWQgcmVnaW9uOiB0aGlzIGlzIGVpdGhlciB0aGUKKwkJCSAqIHNlZ21lbnQgc3RhcnQvbGVuIChmb3IgLS1zZWdtZW50cyksIHRoZSB2YWx1ZSBvZiB0aGUKKwkJCSAqIC0tc3RhcnQvLS1sZW5ndGggYXJndW1lbnRzLCBvciAwLzAgZm9yIGEgZGVmYXVsdAorCQkJICogIHdob2xlLWRldmljZSByZWdpb24pLgorCQkJICovCisJCQl0aGlzX3N0YXJ0ID0gKHNlZ21lbnRzKSA/IHNlZ21lbnRfc3RhcnQgOiBzdGFydDsKKwkJCXRoaXNfbGVuID0gKHNlZ21lbnRzKSA/IHNlZ21lbnRfbGVuIDogdGhpc19sZW47CisJCQlpZiAoIShyID0gZG1fc3RhdHNfY3JlYXRlX3JlZ2lvbihkbXMsICZyZWdpb25faWRzW2NvdW50XSwKKwkJCQkJCQkgdGhpc19zdGFydCwgdGhpc19sZW4sIHN0ZXAsCisJCQkJCQkJIHByZWNpc2UsIGJvdW5kcywKKwkJCQkJCQkgcHJvZ3JhbV9pZCwgdXNlcl9kYXRhKSkpIHsKKwkJCQlsb2dfZXJyb3IoIiVzOiBDb3VsZCBub3QgY3JlYXRlIHN0YXRpc3RpY3MgcmVnaW9uLiIsCisJCQkJCSAgZGV2bmFtZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXByaW50ZigiJXM6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoICJGTVR1NjQiIGFyZWEocykgYXMgIgorCQkJICAgICAgICJyZWdpb24gSUQgIkZNVHU2NCJcbiIsIGRldm5hbWUsCisJCQkgICAgICAgX25yX2FyZWFzX2Zyb21fc3RlcCh0aGlzX2xlbiwgc3RlcCksCisJCQkgICAgICAgcmVnaW9uX2lkc1tjb3VudCsrXSk7CisJCX0KKwl9IHdoaWxlIChuZXh0KTsKKworCWlmICghX3N3aXRjaGVzW05PR1JPVVBfQVJHXSAmJiBzZWdtZW50cykKKwkJciA9IF9zdGF0c19ncm91cF9zZWdtZW50cyhkbXMsIHJlZ2lvbl9pZHMsIGNvdW50LAorCQkJCQkgIF9zdHJpbmdfYXJnc1tBTElBU19BUkddKTsKKworb3V0OgorCWlmIChyZWdpb25faWRzICE9ICZyZWdpb25faWQpCisJCWRtX2ZyZWUocmVnaW9uX2lkcyk7CisKKwlkbV90YXNrX2Rlc3Ryb3koZG10KTsKKwlkbV9zdGF0c19kZXN0cm95KGRtcyk7CisJZG1faGlzdG9ncmFtX2JvdW5kc19kZXN0cm95KGJvdW5kcyk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBmdWxsIGFic29sdXRlIHBhdGgsIG9yIE5VTEwgaWYgdGhlIHBhdGggY291bGQKKyAqIG5vdCBiZSByZXNvbHZlZC4KKyAqLworc3RhdGljIGNoYXIgKl9nZXRfYWJzcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgKl9wYXRoOworCisjaWZkZWYgSEFWRV9DQU5PTklDQUxJWkVfRklMRV9OQU1FCisJX3BhdGggPSBjYW5vbmljYWxpemVfZmlsZV9uYW1lKHBhdGgpOworI2Vsc2UKKwkvKiBGSVhNRSBQcm92aWRlIGFsdGVybmF0aXZlICovCisJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJVbmltcGxlbWVudGVkIF9nZXRfYWJzcGF0aC4iKTsKKwlfcGF0aCA9IE5VTEw7CisjZW5kaWYKKwlyZXR1cm4gX3BhdGg7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX2NyZWF0ZV9maWxlKENNRF9BUkdTKQoreworCWNvbnN0IGNoYXIgKmFsaWFzLCAqcHJvZ3JhbV9pZCA9IERNX1NUQVRTX1BST0dSQU1fSUQ7CisJY29uc3QgY2hhciAqaGlzdG9ncmFtID0gX3N0cmluZ19hcmdzW0JPVU5EU19BUkddOworCXVpbnQ2NF90ICpyZWdpb25zLCAqcmVnaW9uLCBjb3VudCA9IDA7CisJc3RydWN0IGRtX2hpc3RvZ3JhbSAqYm91bmRzID0gTlVMTDsKKwljaGFyICpwYXRoLCAqYWJzcGF0aCA9IE5VTEw7CisJaW50IGdyb3VwLCBmZCwgcHJlY2lzZTsKKwlzdHJ1Y3QgZG1fc3RhdHMgKmRtczsKKworCWlmIChfc3dpdGNoZXNbQVJFQVNfQVJHXSB8fCBfc3dpdGNoZXNbQVJFQV9TSVpFX0FSR10pIHsKKwkJbG9nX2Vycm9yKCItLWZpbGVtYXAgaXMgaW5jb21wYXRpYmxlIHdpdGggLS1hcmVhcyBhbmQgLS1hcmVhLXNpemUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChfc3dpdGNoZXNbU1RBUlRfQVJHXSB8fCBfc3dpdGNoZXNbTEVOR1RIX0FSR10pIHsKKwkJbG9nX2Vycm9yKCItLWZpbGVtYXAgaXMgaW5jb21wYXRpYmxlIHdpdGggLS1zdGFydCBhbmQgLS1sZW5ndGguIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChfc3dpdGNoZXNbU0VHTUVOVFNfQVJHXSkgeworCQlsb2dfZXJyb3IoIi0tZmlsZW1hcCBhbmQgLS1zZWdtZW50cyBhcmUgaW5jb21wYXRpYmxlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW1VTRVJfREFUQV9BUkddKSB7CisJCWxvZ19lcnJvcigiLS11c2VyZGF0YSBpcyBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIC0tZmlsZW1hcC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tVVUlEX0FSR10gfHwgX3N3aXRjaGVzW01BSk9SX0FSR10pIHsKKwkJbG9nX2Vycm9yKCItLXV1aWQgYW5kIC0tbWFqb3IgYXJlIGluY29tcGF0aWJsZSB3aXRoIC0tZmlsZW1hcC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tBTExfREVWSUNFU19BUkddKSB7CisJCWxvZ19lcnJvcigiLS1hbGxkZXZpY2VzIGlzIGluY29tcGF0aWJsZSB3aXRoIC0tZmlsZW1hcC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogX3N0YXRzX2NyZWF0ZV9maWxlIGRvZXMgbm90IHVzZSBfcHJvY2Vzc19hbGwoKSAqLworCWlmICghYXJnYykgeworCQlsb2dfZXJyb3IoIi0tZmlsZW1hcCByZXF1aXJlcyBhIGZpbGUgcGF0aCBhcmd1bWVudCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXRoID0gYXJndlswXTsKKworCWlmIChfc3dpdGNoZXNbUFJFQ0lTRV9BUkddKSB7CisJCWlmICghZG1fc3RhdHNfZHJpdmVyX3N1cHBvcnRzX3ByZWNpc2UoKSkgeworCQkJbG9nX2Vycm9yKCJVc2luZyAtLXByZWNpc2UgcmVxdWlyZXMgZHJpdmVyIHZlcnNpb24gIgorCQkJCSAgIjQuMzIuMCBvciBsYXRlci4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKF9zd2l0Y2hlc1tCT1VORFNfQVJHXSkgeworCQlpZiAoIWRtX3N0YXRzX2RyaXZlcl9zdXBwb3J0c19oaXN0b2dyYW0oKSkgeworCQkJbG9nX2Vycm9yKCJVc2luZyAtLWJvdW5kcyByZXF1aXJlcyBkcml2ZXIgdmVyc2lvbiAiCisJCQkJICAiNC4zMi4wIG9yIGxhdGVyLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIShhYnNwYXRoID0gX2dldF9hYnNwYXRoKHBhdGgpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBjYW5vbmljYWxpemUgZmlsZSBuYW1lOiAlcyIsIHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGlzdG9ncmFtICYmICEoYm91bmRzID0gZG1faGlzdG9ncmFtX2JvdW5kc19mcm9tX3N0cmluZyhoaXN0b2dyYW0pKSkgeworCQlkbV9mcmVlKGFic3BhdGgpOworCQlyZXR1cm5fMDsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW1BST0dSQU1fSURfQVJHXSkKKwkJcHJvZ3JhbV9pZCA9IF9zdHJpbmdfYXJnc1tQUk9HUkFNX0lEX0FSR107CisJaWYgKCFzdHJsZW4ocHJvZ3JhbV9pZCkgJiYgIV9zd2l0Y2hlc1tGT1JDRV9BUkddKQorCQlwcm9ncmFtX2lkID0gRE1fU1RBVFNfUFJPR1JBTV9JRDsKKworCXByZWNpc2UgPSBfaW50X2FyZ3NbUFJFQ0lTRV9BUkddOworCWdyb3VwID0gIV9zd2l0Y2hlc1tOT0dST1VQX0FSR107CisKKwlpZiAoIShkbXMgPSBkbV9zdGF0c19jcmVhdGUoRE1fU1RBVFNfUFJPR1JBTV9JRCkpKQorCQlyZXR1cm5fMDsKKworCWZkID0gb3BlbihhYnNwYXRoLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKSB7CisJCWxvZ19lcnJvcigiQ291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmciLCBhYnNwYXRoKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFfYmluZF9zdGF0c19mcm9tX2ZkKGRtcywgZmQpKQorCQlnb3RvX2JhZDsKKworCWlmICghc3RybGVuKHByb2dyYW1faWQpKQorCQkvKiBmb3JjZSBjcmVhdGlvbiBvZiBhIHJlZ2lvbiB3aXRoIG5vIGlkICovCisJCWRtX3N0YXRzX3NldF9wcm9ncmFtX2lkKGRtcywgMSwgTlVMTCk7CisKKwlpZiAoZ3JvdXAgJiYgIV9zd2l0Y2hlc1tBTElBU19BUkddKQorCQlhbGlhcyA9IGRtX2Jhc2VuYW1lKGFic3BhdGgpOworCWVsc2UgaWYgKGdyb3VwKQorCQlhbGlhcyA9IF9zdHJpbmdfYXJnc1tBTElBU19BUkddOworCWVsc2UgaWYgKCFfc3dpdGNoZXNbQUxJQVNfQVJHXSkKKwkJYWxpYXMgPSBOVUxMOworCWVsc2UgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBzZXQgYWxpYXMgd2l0aCAtLW5vZ3JvdXAuIik7CisJCWdvdG8gYmFkOworCX0KKworCXJlZ2lvbnMgPSBkbV9zdGF0c19jcmVhdGVfcmVnaW9uc19mcm9tX2ZkKGRtcywgZmQsIGdyb3VwLCBwcmVjaXNlLAorCQkJCQkJICBib3VuZHMsIGFsaWFzKTsKKworCWlmIChjbG9zZShmZCkpCisJCWxvZ19lcnJvcigiRXJyb3IgY2xvc2luZyAlcyIsIGFic3BhdGgpOworCisJZmQgPSAtMTsKKworCWlmICghcmVnaW9ucykgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgcmVnaW9ucyBmcm9tIGZpbGUgJXMiLCBhYnNwYXRoKTsKKwkJZ290byBiYWQ7CisJfQorCisJZm9yIChyZWdpb24gPSByZWdpb25zOyAqcmVnaW9uICE9IERNX1NUQVRTX1JFR0lPTlNfQUxMOyByZWdpb24rKykKKwkJY291bnQrKzsKKworCWlmIChncm91cCkgeworCQlwcmludGYoIiVzOiBDcmVhdGVkIG5ldyBncm91cCB3aXRoICJGTVR1NjQiIHJlZ2lvbihzKSBhcyAiCisJCSAgICAgICAiZ3JvdXAgSUQgIkZNVHU2NCIuXG4iLCBwYXRoLCBjb3VudCwgcmVnaW9uc1swXSk7CisJfSBlbHNlIHsKKwkJcmVnaW9uID0gcmVnaW9uczsKKwkJZG8KKwkJCXByaW50ZigiJXM6IENyZWF0ZWQgbmV3IHJlZ2lvbiB3aXRoIDEgYXJlYSBhcyAiCisJCQkgICAgICAgInJlZ2lvbiBJRCAiRk1UdTY0Ii5cbiIsIHBhdGgsICpyZWdpb24pOworCQl3aGlsZSAoKigrK3JlZ2lvbikgIT0gRE1fU1RBVFNfUkVHSU9OU19BTEwpOworCX0KKworCWRtX2ZyZWUocmVnaW9ucyk7CisJZG1fZnJlZShhYnNwYXRoKTsKKwlkbV9zdGF0c19kZXN0cm95KGRtcyk7CisJcmV0dXJuIDE7CisKK2JhZDoKKwlkbV9mcmVlKGFic3BhdGgpOworCisJaWYgKChmZCA+IC0xKSAmJiBjbG9zZShmZCkpCisJCWxvZ19lcnJvcigiRXJyb3IgY2xvc2luZyAlcyIsIHBhdGgpOworCisJZG1fc3RhdHNfZGVzdHJveShkbXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zdGF0c19jcmVhdGUoQ01EX0FSR1MpCit7CisJc3RydWN0IGRtX3N0YXRzICpkbXM7CisJY29uc3QgY2hhciAqbmFtZSwgKnVzZXJfZGF0YSA9ICIiLCAqcHJvZ3JhbV9pZCA9IERNX1NUQVRTX1BST0dSQU1fSUQ7CisJdWludDY0X3Qgc3RhcnQgPSAwLCBsZW4gPSAwLCBhcmVhcyA9IDAsIGFyZWFfc2l6ZSA9IDA7CisJaW50NjRfdCBzdGVwID0gMDsKKworCS8qIGNyZWF0ZSBkb2VzIG5vdCB1c2UgYSByZXBvcnQgKi8KKwlpZiAoX3JlcG9ydCkgeworCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKwkJX3JlcG9ydCA9IE5VTEw7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tBTExfUkVHSU9OU19BUkddKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSAtLWFsbHJlZ2lvbnMgd2l0aCBjcmVhdGUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChfc3dpdGNoZXNbQUxMX1BST0dSQU1TX0FSR10pIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdXNlIC0tYWxscHJvZ3JhbXMgd2l0aCBjcmVhdGUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChfc3dpdGNoZXNbQVJFQVNfQVJHXSAmJiBfc3dpdGNoZXNbQVJFQV9TSVpFX0FSR10pIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBvbmUgb2YgLS1hcmVhcyBhbmQgLS1hcmVhc2l6ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tQUk9HUkFNX0lEX0FSR10KKwkgICAgJiYgIXN0cmxlbihfc3RyaW5nX2FyZ3NbUFJPR1JBTV9JRF9BUkddKSAmJiAhX3N3aXRjaGVzW0ZPUkNFX0FSR10pIHsKKwkJbG9nX2Vycm9yKCJDcmVhdGluZyBhIHJlZ2lvbiB3aXRoIG5vIHByb2dyYW0gIgorCQkJICAiaWQgcmVxdWlyZXMgLS1mb3JjZS4iKTsKKwkJCXJldHVybiAwOworCX0KKworCWlmIChfc3dpdGNoZXNbRklMRU1BUF9BUkddKQorCQlyZXR1cm4gX3N0YXRzX2NyZWF0ZV9maWxlKGNtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwKKwkJCQkJICBuYW1lcywgbXVsdGlwbGVfZGV2aWNlcyk7CisKKwlpZiAobmFtZXMpCisJCW5hbWUgPSBuYW1lcy0+bmFtZTsKKwllbHNlIHsKKwkJaWYgKCFhcmdjICYmICFfc3dpdGNoZXNbVVVJRF9BUkddICYmICFfc3dpdGNoZXNbTUFKT1JfQVJHXSkgeworCQkJaWYgKCFfc3dpdGNoZXNbQUxMX0RFVklDRVNfQVJHXSkgeworCQkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgZGV2aWNlKHMpIG9yIHVzZSAiCisJCQkJCSAgIi0tYWxsZGV2aWNlcy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBfcHJvY2Vzc19hbGwoY21kLCBzdWJjb21tYW5kLCBhcmdjLCBhcmd2LCAwLCBfc3RhdHNfY3JlYXRlKTsKKwkJfQorCQluYW1lID0gYXJndlswXTsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW0FSRUFTX0FSR10pCisJCWFyZWFzID0gKHVpbnQ2NF90KSBfaW50X2FyZ3NbQVJFQVNfQVJHXTsKKworCWlmIChfc3dpdGNoZXNbQVJFQV9TSVpFX0FSR10pCisJCWlmICghX3NpemVfZnJvbV9zdHJpbmcoX3N0cmluZ19hcmdzW0FSRUFfU0laRV9BUkddLAorCQkJCSAgICAgICAmYXJlYV9zaXplLCAiYXJlYXNpemUiKSkKKwkJCXJldHVybl8wOworCisJYXJlYXMgPSAoYXJlYXMpID8gYXJlYXMgOiAxOworCS8qIGJ5dGVzIHRvIHNlY3RvcnMgb3IgLShhcmVhcyk6IHByb21vdGUgdG8gc2lnbmVkIGJlZm9yZSBjb252ZXJzaW9uICovCisJc3RlcCA9IChhcmVhX3NpemUpID8gKChpbnQ2NF90KSBhcmVhX3NpemUgLyA1MTIpIDogLSgoaW50NjRfdCkgYXJlYXMpOworCisJaWYgKF9zd2l0Y2hlc1tTVEFSVF9BUkddKSB7CisJCWlmICghX3NpemVfZnJvbV9zdHJpbmcoX3N0cmluZ19hcmdzW1NUQVJUX0FSR10sCisJCQkJICAgICAgICZzdGFydCwgInN0YXJ0IikpCisJCQlyZXR1cm5fMDsKKwl9CisKKwkvKiBieXRlcyB0byBzZWN0b3JzICovCisJc3RhcnQgLz0gNTEyOworCisJaWYgKF9zd2l0Y2hlc1tMRU5HVEhfQVJHXSkgeworCQlpZiAoIV9zaXplX2Zyb21fc3RyaW5nKF9zdHJpbmdfYXJnc1tMRU5HVEhfQVJHXSwKKwkJCQkgICAgICAgJmxlbiwgImxlbmd0aCIpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogYnl0ZXMgdG8gc2VjdG9ycyAqLworCWxlbiAvPSA1MTI7CisKKwlpZiAoX3N3aXRjaGVzW1BST0dSQU1fSURfQVJHXSkKKwkJcHJvZ3JhbV9pZCA9IF9zdHJpbmdfYXJnc1tQUk9HUkFNX0lEX0FSR107CisJaWYgKCFzdHJsZW4ocHJvZ3JhbV9pZCkgJiYgIV9zd2l0Y2hlc1tGT1JDRV9BUkddKQorCQlwcm9ncmFtX2lkID0gRE1fU1RBVFNfUFJPR1JBTV9JRDsKKworCWlmIChfc3dpdGNoZXNbVVNFUl9EQVRBX0FSR10pCisJCXVzZXJfZGF0YSA9IF9zdHJpbmdfYXJnc1tVU0VSX0RBVEFfQVJHXTsKKworCWlmICghKGRtcyA9IGRtX3N0YXRzX2NyZWF0ZShETV9TVEFUU19QUk9HUkFNX0lEKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfYmluZF9zdGF0c19kZXZpY2UoZG1zLCBuYW1lKSkKKwkJZ290b19iYWQ7CisKKwlpZiAoX3N3aXRjaGVzW1BSRUNJU0VfQVJHXSkgeworCQlpZiAoIWRtX3N0YXRzX2RyaXZlcl9zdXBwb3J0c19wcmVjaXNlKCkpIHsKKwkJCWxvZ19lcnJvcigiVXNpbmcgLS1wcmVjaXNlIHJlcXVpcmVzIGRyaXZlciB2ZXJzaW9uICIKKwkJCQkgICI0LjMyLjAgb3IgbGF0ZXIuIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCWlmIChfc3dpdGNoZXNbQk9VTkRTX0FSR10pIHsKKwkJaWYgKCFkbV9zdGF0c19kcml2ZXJfc3VwcG9ydHNfaGlzdG9ncmFtKCkpIHsKKwkJCWxvZ19lcnJvcigiVXNpbmcgLS1ib3VuZHMgcmVxdWlyZXMgZHJpdmVyIHZlcnNpb24gIgorCQkJCSAgIjQuMzIuMCBvciBsYXRlci4iKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJaWYgKCFzdHJsZW4ocHJvZ3JhbV9pZCkpCisJCS8qIGZvcmNlIGNyZWF0aW9uIG9mIGEgcmVnaW9uIHdpdGggbm8gaWQgKi8KKwkJZG1fc3RhdHNfc2V0X3Byb2dyYW1faWQoZG1zLCAxLCBOVUxMKTsKKworCXJldHVybiBfZG9fc3RhdHNfY3JlYXRlX3JlZ2lvbnMoZG1zLCBuYW1lLCBzdGFydCwgbGVuLCBzdGVwLAorCQkJCQlfc3dpdGNoZXNbU0VHTUVOVFNfQVJHXSwKKwkJCQkJcHJvZ3JhbV9pZCwgdXNlcl9kYXRhKTsKKworYmFkOgorCWRtX3N0YXRzX2Rlc3Ryb3koZG1zKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc3RhdHNfZGVsZXRlKENNRF9BUkdTKQoreworCXN0cnVjdCBkbV9zdGF0cyAqZG1zOworCXVpbnQ2NF90IHJlZ2lvbl9pZCwgZ3JvdXBfaWQ7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJvZ3JhbV9pZCA9IERNX1NUQVRTX1BST0dSQU1fSUQ7CisJaW50IGFsbHJlZ2lvbnMgPSBfc3dpdGNoZXNbQUxMX1JFR0lPTlNfQVJHXTsKKwlpbnQgciA9IDA7CisKKwkvKiBkZWxldGUgZG9lcyBub3QgdXNlIGEgcmVwb3J0ICovCisJaWYgKF9yZXBvcnQpIHsKKwkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCV9yZXBvcnQgPSBOVUxMOworCX0KKworCWlmIChfc3dpdGNoZXNbUkVHSU9OX0lEX0FSR10gJiYgX3N3aXRjaGVzW0dST1VQX0lEX0FSR10pIHsKKwkJZXJyKCJQbGVhc2UgdXNlIG9uZSBvZiAtLXJlZ2lvbmlkIGFuZCAtLWdyb3VwaWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3N3aXRjaGVzW1JFR0lPTl9JRF9BUkddICYmICFhbGxyZWdpb25zICYmICFfc3dpdGNoZXNbR1JPVVBfSURfQVJHXSkgeworCQllcnIoIlBsZWFzZSBzcGVjaWZ5IGEgLS1yZWdpb25pZCBvciAtLWdyb3VwaWQsIG9yIHVzZSAtLWFsbHJlZ2lvbnMuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChuYW1lcykKKwkJbmFtZSA9IG5hbWVzLT5uYW1lOworCWVsc2UgeworCQlpZiAoIWFyZ2MgJiYgIV9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIV9zd2l0Y2hlc1tNQUpPUl9BUkddKSB7CisJCQlpZiAoIV9zd2l0Y2hlc1tBTExfREVWSUNFU19BUkddKSB7CisJCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBkZXZpY2Uocykgb3IgdXNlICIKKwkJCQkJICAiLS1hbGxkZXZpY2VzLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIF9wcm9jZXNzX2FsbChjbWQsIHN1YmNvbW1hbmQsIGFyZ2MsIGFyZ3YsIDAsIF9zdGF0c19kZWxldGUpOworCQl9CisJCW5hbWUgPSBhcmd2WzBdOworCX0KKworCWlmIChfc3dpdGNoZXNbQUxMX1BST0dSQU1TX0FSR10pCisJCXByb2dyYW1faWQgPSBETV9TVEFUU19BTExfUFJPR1JBTVM7CisKKwlyZWdpb25faWQgPSAodWludDY0X3QpIF9pbnRfYXJnc1tSRUdJT05fSURfQVJHXTsKKwlncm91cF9pZCA9ICh1aW50NjRfdCkgX2ludF9hcmdzW0dST1VQX0lEX0FSR107CisKKwlpZiAoIShkbXMgPSBkbV9zdGF0c19jcmVhdGUocHJvZ3JhbV9pZCkpKQorCQlyZXR1cm5fMDsKKworCWlmICghX2JpbmRfc3RhdHNfZGV2aWNlKGRtcywgbmFtZSkpCisJCWdvdG9fb3V0OworCisJLyogYWxscmVnaW9ucyBhbmQgZ3JvdXAgZGVsZXRlIHJlcXVpcmUgYSBsaXN0ZWQgaGFuZGxlICovCisJaWYgKChhbGxyZWdpb25zIHx8IF9zd2l0Y2hlc1tHUk9VUF9JRF9BUkddKQorCSAgICAmJiAhZG1fc3RhdHNfbGlzdChkbXMsIHByb2dyYW1faWQpKQorCQlnb3RvX291dDsKKworCWlmIChhbGxyZWdpb25zICYmICFkbV9zdGF0c19nZXRfbnJfcmVnaW9ucyhkbXMpKSB7CisJCS8qIG5vIHJlZ2lvbnMgcHJlc2VudCAqLworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tHUk9VUF9JRF9BUkddKSB7CisJCWlmICghZG1fc3RhdHNfZGVsZXRlX2dyb3VwKGRtcywgZ3JvdXBfaWQsIDEpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBkZWxldGUgc3RhdGlzdGljcyBncm91cC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByaW50ZigiRGVsZXRlZCBzdGF0aXN0aWNzIGdyb3VwICIgRk1UdTY0ICIuXG4iLCBncm91cF9pZCk7CisJfSBlbHNlIGlmIChfc3dpdGNoZXNbQUxMX1JFR0lPTlNfQVJHXSkgeworCQlkbV9zdGF0c19mb3JlYWNoX3JlZ2lvbihkbXMpIHsKKwkJCXJlZ2lvbl9pZCA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihkbXMpOworCQkJaWYgKCFkbV9zdGF0c19kZWxldGVfcmVnaW9uKGRtcywgcmVnaW9uX2lkKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGQgbm90IGRlbGV0ZSBzdGF0aXN0aWNzIHJlZ2lvbi4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWxvZ19pbmZvKCJEZWxldGVkIHN0YXRpc3RpY3MgcmVnaW9uICUiIFBSSXU2NCwgcmVnaW9uX2lkKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZG1fc3RhdHNfZGVsZXRlX3JlZ2lvbihkbXMsIHJlZ2lvbl9pZCkpIHsKKwkJCWxvZ19lcnJvcigiQ291bGQgbm90IGRlbGV0ZSBzdGF0aXN0aWNzIHJlZ2lvbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJbG9nX2luZm8oIkRlbGV0ZWQgc3RhdGlzdGljcyByZWdpb24gIiBGTVR1NjQgIi5cbiIsIHJlZ2lvbl9pZCk7CisJfQorCisJciA9IDE7CisKK291dDoKKwlkbV9zdGF0c19kZXN0cm95KGRtcyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX3ByaW50X29uZV9yZWdpb24oc3RydWN0IGRtX3N0YXRzICpkbXMsIGludCBjbGVhciwKKwkJCQkgICB1aW50NjRfdCByZWdpb25faWQpCit7CisJY2hhciAqc3RidWZmID0gTlVMTDsKKworCS8qRklYTUU6IGxpbmUgY29udHJvbCBmb3IgbGFyZ2UgcmVnaW9ucyAqLworCWlmICghKHN0YnVmZiA9IGRtX3N0YXRzX3ByaW50X3JlZ2lvbihkbXMsIHJlZ2lvbl9pZCwgMCwgMCwgY2xlYXIpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwcmludCBzdGF0aXN0aWNzIHJlZ2lvbi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRmKCIlcyIsIHN0YnVmZik7CisJZG1fc3RhdHNfYnVmZmVyX2Rlc3Ryb3koZG1zLCBzdGJ1ZmYpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX3ByaW50KENNRF9BUkdTKQoreworCXN0cnVjdCBkbV9zdGF0cyAqZG1zOworCWNoYXIgKm5hbWUsICpzdGJ1ZmYgPSBOVUxMOworCXVpbnQ2NF90IHJlZ2lvbl9pZDsKKwl1bnNpZ25lZCBjbGVhciA9ICh1bnNpZ25lZCkgX3N3aXRjaGVzW0NMRUFSX0FSR107CisJaW50IGFsbHJlZ2lvbnMgPSBfc3dpdGNoZXNbQUxMX1JFR0lPTlNfQVJHXTsKKwlpbnQgciA9IDA7CisKKwkvKiBwcmludCBkb2VzIG5vdCB1c2UgYSByZXBvcnQgKi8KKwlpZiAoX3JlcG9ydCkgeworCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKwkJX3JlcG9ydCA9IE5VTEw7CisJfQorCisJaWYgKCFfc3dpdGNoZXNbUkVHSU9OX0lEX0FSR10gJiYgIWFsbHJlZ2lvbnMpIHsKKwkJZXJyKCJQbGVhc2Ugc3BlY2lmeSBhIC0tcmVnaW9uaWQgb3IgdXNlIC0tYWxscmVnaW9ucy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5hbWVzKQorCQluYW1lID0gbmFtZXMtPm5hbWU7CisJZWxzZSB7CisJCWlmICghYXJnYyAmJiAhX3N3aXRjaGVzW1VVSURfQVJHXSAmJiAhX3N3aXRjaGVzW01BSk9SX0FSR10pCisJCQlyZXR1cm4gX3Byb2Nlc3NfYWxsKGNtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwgMCwgX3N0YXRzX3ByaW50KTsKKwkJbmFtZSA9IGFyZ3ZbMF07CisJfQorCisJaWYgKCEoZG1zID0gZG1fc3RhdHNfY3JlYXRlKERNX1NUQVRTX1BST0dSQU1fSUQpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9iaW5kX3N0YXRzX2RldmljZShkbXMsIG5hbWUpKQorCQlnb3RvX291dDsKKworCWlmICghZG1fc3RhdHNfbGlzdChkbXMsIE5VTEwpKQorCQlnb3RvX291dDsKKworCWlmIChhbGxyZWdpb25zICYmICFkbV9zdGF0c19nZXRfbnJfcmVnaW9ucyhkbXMpKSB7CisJCXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWFsbHJlZ2lvbnMpIHsKKwkJcmVnaW9uX2lkID0gKHVpbnQ2NF90KSBfaW50X2FyZ3NbUkVHSU9OX0lEX0FSR107CisJCWlmICghX3N0YXRzX3ByaW50X29uZV9yZWdpb24oZG1zLCBjbGVhciwgcmVnaW9uX2lkKSkKKwkJCWdvdG9fb3V0OworCQlyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZG1fc3RhdHNfZm9yZWFjaF9yZWdpb24oZG1zKSB7CisJCXJlZ2lvbl9pZCA9IGRtX3N0YXRzX2dldF9jdXJyZW50X3JlZ2lvbihkbXMpOworCQlpZiAoIV9zdGF0c19wcmludF9vbmVfcmVnaW9uKGRtcywgY2xlYXIsIHJlZ2lvbl9pZCkpCisJCQlnb3RvX291dDsKKworCQkvKkZJWE1FOiBsaW5lIGNvbnRyb2wgZm9yIGxhcmdlIHJlZ2lvbnMgKi8KKwkJaWYgKCEoc3RidWZmID0gZG1fc3RhdHNfcHJpbnRfcmVnaW9uKGRtcywgcmVnaW9uX2lkLCAwLCAwLCBjbGVhcikpKSB7CisJCQlsb2dfZXJyb3IoIkNvdWxkIG5vdCBwcmludCBzdGF0aXN0aWNzIHJlZ2lvbi4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcHJpbnRmKCIlcyIsIHN0YnVmZik7CisJCWRtX3N0YXRzX2J1ZmZlcl9kZXN0cm95KGRtcywgc3RidWZmKTsKKwl9CisKKwlyID0gMTsKKworb3V0OgorCWRtX3N0YXRzX2Rlc3Ryb3koZG1zKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfc3RhdHNfcmVwb3J0KENNRF9BUkdTKQoreworCWludCByID0gMCwgb2JqdHlwZV9hcmdzOworCisJc3RydWN0IGRtX3Rhc2sgKmRtdDsKKwljaGFyICpuYW1lID0gTlVMTDsKKworCW9ianR5cGVfYXJncyA9IChfc3dpdGNoZXNbQVJFQV9BUkddCisJCQl8fCBfc3dpdGNoZXNbUkVHSU9OX0FSR10KKwkJCXx8IF9zd2l0Y2hlc1tHUk9VUF9BUkddKTsKKworCWlmIChfc3dpdGNoZXNbUFJPR1JBTV9JRF9BUkddKQorCQlfcHJvZ3JhbV9pZCA9IF9zdHJpbmdfYXJnc1tQUk9HUkFNX0lEX0FSR107CisKKwlpZiAoX3N3aXRjaGVzW0FMTF9QUk9HUkFNU19BUkddKQorCQlfcHJvZ3JhbV9pZCA9ICIiOworCisJaWYgKF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10gJiYgIXN0cmNtcChzdWJjb21tYW5kLCAibGlzdCIpKQorCQlfc3RhdHN0eXBlIHw9IChETV9TVEFUU19XQUxLX0FMTAorCQkJICAgICAgIHwgRE1fU1RBVFNfV0FMS19TS0lQX1NJTkdMRV9BUkVBKTsKKworCS8qIHN1cHByZXNzIGR1cGxpY2F0ZXMgdW5sZXNzIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYWxsIHJlZ2lvbnMgKi8KKwlpZiAoIXN0cmNtcChzdWJjb21tYW5kLCAicmVwb3J0IikgJiYgIW9ianR5cGVfYXJncykKKwkJLyogc3VwcHJlc3MgZHVwbGljYXRlIHJvd3Mgb2Ygb3V0cHV0ICovCisJCV9zdGF0c3R5cGUgfD0gKERNX1NUQVRTX1dBTEtfQUxMCisJCQkgICAgICAgfCBETV9TVEFUU19XQUxLX1NLSVBfU0lOR0xFX0FSRUEpOworCisJaWYgKG5hbWVzKQorCQluYW1lID0gbmFtZXMtPm5hbWU7CisJZWxzZSB7CisJCWlmICghYXJnYyAmJiAhX3N3aXRjaGVzW1VVSURfQVJHXSAmJiAhX3N3aXRjaGVzW01BSk9SX0FSR10pCisJCQlyZXR1cm4gX3Byb2Nlc3NfYWxsKGNtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwgMCwgX2luZm8pOworCQluYW1lID0gYXJndlswXTsKKwl9CisKKwlpZiAoIShkbXQgPSBkbV90YXNrX2NyZWF0ZShETV9ERVZJQ0VfSU5GTykpKQorCQlyZXR1cm5fMDsKKworCWlmICghX3NldF90YXNrX2RldmljZShkbXQsIG5hbWUsIDApKQorCQlnb3RvX291dDsKKworCWlmIChfc3dpdGNoZXNbQ0hFQ0tTX0FSR10gJiYgIWRtX3Rhc2tfZW5hYmxlX2NoZWNrcyhkbXQpKQorCQlnb3RvX291dDsKKworCWlmICghX3Rhc2tfcnVuKGRtdCkpCisJCWdvdG9fb3V0OworCisJciA9IF9kaXNwbGF5X2luZm8oZG10KTsKKworb3V0OgorCWRtX3Rhc2tfZGVzdHJveShkbXQpOworCisJaWYgKCFyICYmIF9yZXBvcnQpIHsKKwkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCV9yZXBvcnQgPSBOVUxMOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zdGF0c19ncm91cChDTURfQVJHUykKK3sKKwljaGFyICpuYW1lLCAqYWxpYXMgPSBOVUxMLCAqcmVnaW9ucyA9IE5VTEw7CisJc3RydWN0IGRtX3N0YXRzICpkbXM7CisJdWludDY0X3QgZ3JvdXBfaWQ7CisJaW50IHIgPSAwOworCisJLyogZ3JvdXAgZG9lcyBub3QgdXNlIGEgcmVwb3J0ICovCisJaWYgKF9yZXBvcnQpIHsKKwkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCV9yZXBvcnQgPSBOVUxMOworCX0KKworCWlmICghX3N3aXRjaGVzW1JFR0lPTlNfQVJHXSkgeworCQllcnIoIkdyb3VwIHJlcXVpcmVzIC0tcmVnaW9ucy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVnaW9ucyA9IF9zdHJpbmdfYXJnc1tSRUdJT05TX0FSR107CisKKwlpZiAobmFtZXMpCisJCW5hbWUgPSBuYW1lcy0+bmFtZTsKKwllbHNlIHsKKwkJaWYgKCFhcmdjICYmICFfc3dpdGNoZXNbVVVJRF9BUkddICYmICFfc3dpdGNoZXNbTUFKT1JfQVJHXSkgeworCQkJaWYgKCFfc3dpdGNoZXNbQUxMX0RFVklDRVNfQVJHXSkgeworCQkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgZGV2aWNlKHMpIG9yIHVzZSAiCisJCQkJCSAgIi0tYWxsZGV2aWNlcy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBfcHJvY2Vzc19hbGwoY21kLCBzdWJjb21tYW5kLCBhcmdjLCBhcmd2LCAwLCBfc3RhdHNfZ3JvdXApOworCQl9CisJCW5hbWUgPSBhcmd2WzBdOworCX0KKworCWlmIChfc3dpdGNoZXNbQUxJQVNfQVJHXSkKKwkJYWxpYXMgPSBfc3RyaW5nX2FyZ3NbQUxJQVNfQVJHXTsKKworCWlmICghKGRtcyA9IGRtX3N0YXRzX2NyZWF0ZShETV9TVEFUU19QUk9HUkFNX0lEKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfYmluZF9zdGF0c19kZXZpY2UoZG1zLCBuYW1lKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3N0YXRzX2xpc3QoZG1zLCBOVUxMKSkKKwkJZ290b19vdXQ7CisKKwlpZighZG1fc3RhdHNfY3JlYXRlX2dyb3VwKGRtcywgcmVnaW9ucywgYWxpYXMsICZncm91cF9pZCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIGdyb3VwIG9uICVzOiAlcyIsIG5hbWUsIHJlZ2lvbnMpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGYoIkdyb3VwZWQgcmVnaW9ucyAlcyBhcyBncm91cCBJRCAiIEZNVHU2NCAiIG9uICVzXG4iLAorCSAgICAgICByZWdpb25zLCBncm91cF9pZCwgbmFtZSk7CisKKwlyID0gMTsKKworb3V0OgorCWRtX3N0YXRzX2Rlc3Ryb3koZG1zKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfc3RhdHNfdW5ncm91cChDTURfQVJHUykKK3sKKwlzdHJ1Y3QgZG1fc3RhdHMgKmRtczsKKwl1aW50NjRfdCBncm91cF9pZDsKKwljaGFyICpuYW1lOworCWludCByID0gMDsKKworCS8qIHVuZ3JvdXAgZG9lcyBub3QgdXNlIGEgcmVwb3J0ICovCisJaWYgKF9yZXBvcnQpIHsKKwkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCV9yZXBvcnQgPSBOVUxMOworCX0KKworCWlmICghX3N3aXRjaGVzW0dST1VQX0lEX0FSR10pIHsKKwkJZXJyKCJQbGVhc2Ugc3BlY2lmeSBncm91cCBpZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ3JvdXBfaWQgPSAodWludDY0X3QpIF9pbnRfYXJnc1tHUk9VUF9JRF9BUkddOworCisJaWYgKG5hbWVzKQorCQluYW1lID0gbmFtZXMtPm5hbWU7CisJZWxzZSB7CisJCWlmICghYXJnYyAmJiAhX3N3aXRjaGVzW1VVSURfQVJHXSAmJiAhX3N3aXRjaGVzW01BSk9SX0FSR10pIHsKKwkJCWlmICghX3N3aXRjaGVzW0FMTF9ERVZJQ0VTX0FSR10pIHsKKwkJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGRldmljZShzKSBvciB1c2UgIgorCQkJCQkgICItLWFsbGRldmljZXMuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gX3Byb2Nlc3NfYWxsKGNtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwgMCwgX3N0YXRzX3VuZ3JvdXApOworCQl9CisJCW5hbWUgPSBhcmd2WzBdOworCX0KKworCWlmICghKGRtcyA9IGRtX3N0YXRzX2NyZWF0ZShETV9TVEFUU19QUk9HUkFNX0lEKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfYmluZF9zdGF0c19kZXZpY2UoZG1zLCBuYW1lKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3N0YXRzX2xpc3QoZG1zLCBOVUxMKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIShyID0gZG1fc3RhdHNfZGVsZXRlX2dyb3VwKGRtcywgZ3JvdXBfaWQsIDApKSkKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgZGVsZXRlIGdyb3VwICIgRk1UdTY0ICIgb24gJXMuIiwKKwkJCSAgZ3JvdXBfaWQsIG5hbWUpOworCisJcHJpbnRmKCJSZW1vdmVkIGdyb3VwIElEICJGTVR1NjQiIG9uICVzXG4iLCBncm91cF9pZCwgbmFtZSk7CisKK291dDoKKwlkbV9zdGF0c19kZXN0cm95KGRtcyk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDb21tYW5kIGRpc3BhdGNoIHRhYmxlcyBhbmQgdXNhZ2UuCisgKi8KK3N0YXRpYyBpbnQgX3N0YXRzX2hlbHAoQ01EX0FSR1MpOworCisvKgorICogZG1zZXR1cCBzdGF0cyA8Y21kPiBbb3B0aW9uc10gW2RldmljZV9uYW1lXQorICogZG1zdGF0cyA8Y21kPiBbb3B0aW9uc10gW2RldmljZV9uYW1lXQorICoKKyAqICAgIGNsZWFyIFstLXJlZ2lvbmlkIGlkXSA8ZGV2aWNlX25hbWU+CisgKiAgICBjcmVhdGUgWy0tYXJlYXMgbnJfYXJlYXNdIFstLWFyZWFzaXplIHNpemVdCisgKiAgICAgICAgICAgWyBbLS1zdGFydCBzdGFydF0gWy0tbGVuZ3RoIGxlbl0gfCBbLS1zZWdtZW50c11dCisgKiAgICAgICAgICAgWy0tdXNlcmRhdGEgZGF0YV0gWy0tcHJvZ3JhbWlkIGlkXSBbPGRldmljZV9uYW1lPl0KKyAqICAgIGRlbGV0ZSBbLS1yZWdpb25pZF0gPGRldmljZV9uYW1lPgorICogICAgZGVsZXRlX2FsbCBbLS1wcm9ncmFtaWQgaWRdCisgKiAgICBncm91cCBbLS1hbGlhcyBuYW1lXSBbLS1hbGxkZXZpY2VzXSBbLS1yZWdpb25zIDxyZWdpb25zPl0gWzxkZXZpY2VfbmFtZT5dCisgKiAgICBsaXN0IFstLXByb2dyYW1pZCBpZF0gWzxkZXZpY2VfbmFtZT5dCisgKiAgICBwcmludCBbLS1jbGVhcl0gWy0tcHJvZ3JhbWlkIGlkXSBbLS1yZWdpb25pZCBpZF0gWzxkZXZpY2VfbmFtZT5dCisgKiAgICByZXBvcnQgWy0taW50ZXJ2YWwgc2Vjb25kc10gWy0tY291bnQgY291bnRdIFstLXVuaXRzIHVuaXRzXSBbLS1yZWdpb25pZCBpZF0KKyAqICAgICAgICAgICBbLS1wcm9ncmFtaWQgaWRdIFs8ZGV2aWNlPl0KKyAqICAgIHVuZ3JvdXAgWy0tYWxsZGV2aWNlc10gWy0tZ3JvdXBpZCBpZF0gWzxkZXZpY2VfbmFtZT5dCisgKi8KKworI2RlZmluZSBBUkVBX09QVFMgIlstLWFyZWFzIDxucl9hcmVhcz5dIFstLWFyZWFzaXplIDxzaXplPl0gIgorI2RlZmluZSBDUkVBVEVfT1BUUyAiWy0tc3RhcnQgPHN0YXJ0PiBbLS1sZW5ndGggPGxlbj5dXVxuXHRcdCIgQVJFQV9PUFRTCisjZGVmaW5lIElEX09QVFMgIlstLXByb2dyYW1pZCA8aWQ+XSBbLS11c2VyZGF0YSA8ZGF0YT4gXSAiCisjZGVmaW5lIFNFTEVDVF9PUFRTICJbLS1wcm9ncmFtaWQgPGlkPl0gWy0tcmVnaW9uaWQgPGlkPl0gIgorI2RlZmluZSBQUklOVF9PUFRTICJbLS1jbGVhcl0gIiBTRUxFQ1RfT1BUUworI2RlZmluZSBSRVBPUlRfT1BUUyAiWy0taW50ZXJ2YWwgPHNlY29uZHM+XSBbLS1jb3VudCA8Y250Pl1cblx0XHRbLS11bml0cyA8dT5dIiBTRUxFQ1RfT1BUUworI2RlZmluZSBHUk9VUF9PUFRTICJbLS1hbGlhcyBOQU1FXSAtLXJlZ2lvbnMgPHJlZ2lvbnM+IgorCitzdGF0aWMgc3RydWN0IGNvbW1hbmQgX3N0YXRzX3N1YmNvbW1hbmRzW10gPSB7CisJeyJoZWxwIiwgIiIsIDAsIDAsIDAsIDAsIF9zdGF0c19oZWxwfSwKKwl7ImNsZWFyIiwgIi0tcmVnaW9uaWQgPGlkPiBbPGRldmljZT5dIiwgMCwgLTEsIDEsIDAsIF9zdGF0c19jbGVhcn0sCisJeyJjcmVhdGUiLCBDUkVBVEVfT1BUUyAiXG5cdFx0IiBJRF9PUFRTICJbPGRldmljZT5dIiwgMCwgLTEsIDEsIDAsIF9zdGF0c19jcmVhdGV9LAorCXsiZGVsZXRlIiwgIi0tcmVnaW9uaWQgPGlkPiA8ZGV2aWNlPiIsIDEsIC0xLCAxLCAwLCBfc3RhdHNfZGVsZXRlfSwKKwl7Imdyb3VwIiwgR1JPVVBfT1BUUywgMSwgLTEsIDEsIDAsIF9zdGF0c19ncm91cH0sCisJeyJsaXN0IiwgIlstLXByb2dyYW1pZCA8aWQ+XSBbPGRldmljZT5dIiwgMCwgLTEsIDEsIDAsIF9zdGF0c19yZXBvcnR9LAorCXsicHJpbnQiLCBQUklOVF9PUFRTICJbPGRldmljZT5dIiwgMCwgLTEsIDEsIDAsIF9zdGF0c19wcmludH0sCisJeyJyZXBvcnQiLCBSRVBPUlRfT1BUUyAiWzxkZXZpY2U+XSIsIDAsIC0xLCAxLCAwLCBfc3RhdHNfcmVwb3J0fSwKKwl7InVuZ3JvdXAiLCAiLS1ncm91cGlkIDxpZD4gW2RldmljZV0iLCAxLCAtMSwgMSwgMCwgX3N0YXRzX3VuZ3JvdXB9LAorCXsidmVyc2lvbiIsICIiLCAwLCAtMSwgMSwgMCwgX3ZlcnNpb259LAorCXtOVUxMLCBOVUxMLCAwLCAwLCAwLCAwLCBOVUxMfQorfTsKKworI3VuZGVmIEFSRUFfT1BUUworI3VuZGVmIENSRUFURV9PUFRTCisjdW5kZWYgSURfT1BUUworI3VuZGVmIFBSSU5UX09QVFMKKyN1bmRlZiBSRVBPUlRfT1BUUworI3VuZGVmIFNFTEVDVF9PUFRTCisKK3N0YXRpYyBpbnQgX2Rtc2V0dXBfaGVscChDTURfQVJHUyk7CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWFuZCBfZG1zZXR1cF9jb21tYW5kc1tdID0geworCXsiaGVscCIsICJbLWN8LUN8LS1jb2x1bW5zXSIsIDAsIDAsIDAsIDAsIF9kbXNldHVwX2hlbHB9LAorCXsiY3JlYXRlIiwgIjxkZXZfbmFtZT5cbiIKKwkgICJcdCAgICBbLWp8LS1tYWpvciA8bWFqb3I+IC1tfC0tbWlub3IgPG1pbm9yPl1cbiIKKwkgICJcdCAgICBbLVV8LS11aWQgPHVpZD5dIFstR3wtLWdpZCA8Z2lkPl0gWy1NfC0tbW9kZSA8b2N0YWxfbW9kZT5dXG4iCisJICAiXHQgICAgWy11fHV1aWQgPHV1aWQ+XSBbLS1hZGRub2Rlb25yZXN1bWV8LS1hZGRub2Rlb25jcmVhdGVdXG4iCisJICAiXHQgICAgWy0tcmVhZGFoZWFkIHtbK108c2VjdG9ycz58YXV0b3xub25lfV1cbiIKKwkgICJcdCAgICBbLW58LS1ub3RhYmxlfC0tdGFibGUgezx0YWJsZT58PHRhYmxlX2ZpbGU+fV0iLCAxLCAyLCAwLCAwLCBfY3JlYXRlfSwKKwl7InJlbW92ZSIsICJbLS1kZWZlcnJlZF0gWy1mfC0tZm9yY2VdIFstLXJldHJ5XSA8ZGV2aWNlPiIsIDAsIC0xLCAxLCAwLCBfcmVtb3ZlfSwKKwl7InJlbW92ZV9hbGwiLCAiWy1mfC0tZm9yY2VdIiwgMCwgMCwgMCwgMCwgX3JlbW92ZV9hbGx9LAorCXsic3VzcGVuZCIsICJbLS1ub2ZsdXNoXSBbLS1ub2xvY2tmc10gPGRldmljZT4iLCAwLCAtMSwgMSwgMCwgX3N1c3BlbmR9LAorCXsicmVzdW1lIiwgIlstLW5vZmx1c2hdIFstLW5vbG9ja2ZzXSA8ZGV2aWNlPlxuIgorCSAgIlx0ICAgICAgIFstLWFkZG5vZGVvbnJlc3VtZXwtLWFkZG5vZGVvbmNyZWF0ZV1cbiIKKwkgICJcdCAgICAgICBbLS1yZWFkYWhlYWQge1srXTxzZWN0b3JzPnxhdXRvfG5vbmV9XSIsIDAsIC0xLCAxLCAwLCBfcmVzdW1lfSwKKwkgIHsibG9hZCIsICI8ZGV2aWNlPiBbPHRhYmxlPnw8dGFibGVfZmlsZT5dIiwgMCwgMiwgMCwgMCwgX2xvYWR9LAorCXsiY2xlYXIiLCAiPGRldmljZT4iLCAwLCAtMSwgMSwgMCwgX2NsZWFyfSwKKwl7InJlbG9hZCIsICI8ZGV2aWNlPiBbPHRhYmxlPnw8dGFibGVfZmlsZT5dIiwgMCwgMiwgMCwgMCwgX2xvYWR9LAorCXsid2lwZV90YWJsZSIsICJbLWZ8LS1mb3JjZV0gWy0tbm9mbHVzaF0gWy0tbm9sb2NrZnNdIDxkZXZpY2U+IiwgMSwgLTEsIDEsIDAsIF9lcnJvcl9kZXZpY2V9LAorCXsicmVuYW1lIiwgIjxkZXZpY2U+IFstLXNldHV1aWRdIDxuZXdfbmFtZV9vcl91dWlkPiIsIDEsIDIsIDAsIDAsIF9yZW5hbWV9LAorCXsibWVzc2FnZSIsICI8ZGV2aWNlPiA8c2VjdG9yPiA8bWVzc2FnZT4iLCAyLCAtMSwgMCwgMCwgX21lc3NhZ2V9LAorCXsibHMiLCAiWy0tdGFyZ2V0IDx0YXJnZXRfdHlwZT5dIFstLWV4ZWMgPGNvbW1hbmQ+XSBbLW8gPG9wdGlvbnM+XSBbLS10cmVlXSIsIDAsIDAsIDAsIDAsIF9sc30sCisJeyJpbmZvIiwgIls8ZGV2aWNlPl0iLCAwLCAtMSwgMSwgMCwgX2luZm99LAorCXsiZGVwcyIsICJbLW8gPG9wdGlvbnM+XSBbPGRldmljZT5dIiwgMCwgLTEsIDEsIDAsIF9kZXBzfSwKKwl7InN0YXRzIiwgIjxjb21tYW5kPiBbPG9wdGlvbnM+XSBbPGRldmljZXM+XSIsIDEsIC0xLCAxLCAxLCBfc3RhdHN9LAorCXsic3RhdHVzIiwgIls8ZGV2aWNlPl0gWy0tbm9mbHVzaF0gWy0tdGFyZ2V0IDx0YXJnZXRfdHlwZT5dIiwgMCwgLTEsIDEsIDAsIF9zdGF0dXN9LAorCXsidGFibGUiLCAiWzxkZXZpY2U+XSBbLS10YXJnZXQgPHRhcmdldF90eXBlPl0gWy0tc2hvd2tleXNdIiwgMCwgLTEsIDEsIDAsIF9zdGF0dXN9LAorCXsid2FpdCIsICI8ZGV2aWNlPiBbPGV2ZW50X25yPl0gWy0tbm9mbHVzaF0iLCAwLCAyLCAwLCAwLCBfd2FpdH0sCisJeyJta25vZGVzIiwgIls8ZGV2aWNlPl0iLCAwLCAtMSwgMSwgMCwgX21rbm9kZXN9LAorCXsibWFuZ2xlIiwgIls8ZGV2aWNlPl0iLCAwLCAtMSwgMSwgMCwgX21hbmdsZX0sCisJeyJ1ZGV2Y3JlYXRlY29va2llIiwgIiIsIDAsIDAsIDAsIDAsIF91ZGV2Y3JlYXRlY29va2llfSwKKwl7InVkZXZyZWxlYXNlY29va2llIiwgIls8Y29va2llPl0iLCAwLCAxLCAwLCAwLCBfdWRldnJlbGVhc2Vjb29raWV9LAorCXsidWRldmZsYWdzIiwgIjxjb29raWU+IiwgMSwgMSwgMCwgMCwgX3VkZXZmbGFnc30sCisJeyJ1ZGV2Y29tcGxldGUiLCAiPGNvb2tpZT4iLCAxLCAxLCAwLCAwLCBfdWRldmNvbXBsZXRlfSwKKwl7InVkZXZjb21wbGV0ZV9hbGwiLCAiWzxhZ2VfaW5fbWludXRlcz5dIiwgMCwgMSwgMCwgMCwgX3VkZXZjb21wbGV0ZV9hbGx9LAorCXsidWRldmNvb2tpZXMiLCAiIiwgMCwgMCwgMCwgMCwgX3VkZXZjb29raWVzfSwKKwl7InRhcmdldHMiLCAiIiwgMCwgMCwgMCwgMCwgX3RhcmdldHN9LAorCXsidmVyc2lvbiIsICIiLCAwLCAwLCAwLCAwLCBfdmVyc2lvbn0sCisJeyJzZXRnZW9tZXRyeSIsICI8ZGV2aWNlPiA8Y3lsPiA8aGVhZD4gPHNlY3Q+IDxzdGFydD4iLCA1LCA1LCAwLCAwLCBfc2V0Z2VvbWV0cnl9LAorCXsic3BsaXRuYW1lIiwgIjxkZXZpY2U+IFs8c3Vic3lzdGVtPl0iLCAxLCAyLCAwLCAwLCBfc3BsaXRuYW1lfSwKKwl7TlVMTCwgTlVMTCwgMCwgMCwgMCwgMCwgTlVMTH0KK307CisKKy8qCisgKiBVc2FnZSBhbmQgaGVscCB0ZXh0LgorICovCisKK3N0YXRpYyB2b2lkIF9kZXZtYXBfbmFtZV91c2FnZShGSUxFICpvdXQpCit7CisJZnByaW50ZihvdXQsICJVc2FnZTogIiBERVZNQVBfTkFNRV9DTURfTkFNRSAiIDxtYWpvcj4gPG1pbm9yPlxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgX3N0YXRzX3VzYWdlKEZJTEUgKm91dCkKK3sKKwlpbnQgaTsKKworCWZwcmludGYob3V0LCAiVXNhZ2U6XG5cbiIpOworCWZwcmludGYob3V0LCAiJXNcbiIsIF9iYXNlX2NvbW1hbmRzW19iYXNlX2NvbW1hbmRdLm5hbWUpOworCWZwcmludGYob3V0LCAiICAgICAgICBbLWh8LS1oZWxwXVxuIik7CisJZnByaW50ZihvdXQsICIgICAgICAgIFstdnwtLXZlcmJvc2UgWy12fC0tdmVyYm9zZSAuLi5dXVxuIik7CisJZnByaW50ZihvdXQsICIgICAgICAgIFstLWFyZWFzIDxucl9hcmVhcz5dIFstLWFyZWFzaXplIDxzaXplPl1cbiIpOworCWZwcmludGYob3V0LCAiICAgICAgICBbLS11c2VyZGF0YSA8ZGF0YT5dIFstLWNsZWFyXVxuIik7CisJZnByaW50ZihvdXQsICIgICAgICAgIFstLWNvdW50IDxjb3VudD5dIFstLWludGVydmFsIDxzZWNvbmRzPl1cbiIpOworCWZwcmludGYob3V0LCAiICAgICAgICBbLW8gPGZpZWxkcz5dIFstT3wtLXNvcnQgPHNvcnRfZmllbGRzPl1cbiIpOworCWZwcmludGYob3V0LCAiCSAgICAgIFstLXByb2dyYW1pZCA8aWQ+XVxuIik7CisJZnByaW50ZihvdXQsICIgICAgICAgIFstLXN0YXJ0IDxzdGFydD5dIFstLWxlbmd0aCA8bGVuZ3RoPl1cbiIpOworCWZwcmludGYob3V0LCAiICAgICAgICBbLS1zZWdtZW50c10gWy0tdW5pdHMgPHVuaXRzPl1cblxuIik7CisKKwlmb3IgKGkgPSAwOyBfc3RhdHNfc3ViY29tbWFuZHNbaV0ubmFtZTsgaSsrKQorCQlmcHJpbnRmKG91dCwgIlx0JXMgJXNcbiIsIF9zdGF0c19zdWJjb21tYW5kc1tpXS5uYW1lLCBfc3RhdHNfc3ViY29tbWFuZHNbaV0uaGVscCk7CisKKwlmcHJpbnRmKG91dCwgIjxkZXZpY2U+IG1heSBiZSBkZXZpY2UgbmFtZSBvciAtdSA8dXVpZD4gb3IgIgorCQkgICAgICItaiA8bWFqb3I+IC1tIDxtaW5vcj5cbiIpOworCWZwcmludGYob3V0LCAiPGZpZWxkcz4gYXJlIGNvbW1hLXNlcGFyYXRlZC4gIFVzZSAnaGVscCAtYycgZm9yIGxpc3QuXG4iKTsKKwlmcHJpbnRmKG91dCwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9kbXNldHVwX3VzYWdlKEZJTEUgKm91dCkKK3sKKwlpbnQgaTsKKworCWZwcmludGYob3V0LCAiVXNhZ2U6XG5cbiIpOworCWZwcmludGYob3V0LCAiJXNcbiIKKwkJIiAgICAgICAgWy0tdmVyc2lvbl0gWy1ofC0taGVscCBbLWN8LUN8LS1jb2x1bW5zXV1cbiIKKwkJIiAgICAgICAgWy12fC0tdmVyYm9zZSBbLXZ8LS12ZXJib3NlIC4uLl1dIFstZnwtLWZvcmNlXVxuIgorCQkiICAgICAgICBbLS1jaGVja3NdIFstLW1hbmdsZW5hbWUge25vbmV8aGV4fGF1dG99XVxuIgorCQkiICAgICAgICBbLXJ8LS1yZWFkb25seV0gWy0tbm9vcGVuY291bnRdIFstLW5vZmx1c2hdIFstLW5vbG9ja2ZzXSBbLS1pbmFjdGl2ZV1cbiIKKwkJIiAgICAgICAgWy0tdWRldmNvb2tpZSA8Y29va2llPl0gWy0tbm91ZGV2cnVsZXNdIFstLW5vdWRldnN5bmNdIFstLXZlcmlmeXVkZXZdXG4iCisJCSIgICAgICAgIFsteXwtLXllc10gWy0tcmVhZGFoZWFkIHtbK108c2VjdG9ycz58YXV0b3xub25lfV0gWy0tcmV0cnldXG4iCisJCSIgICAgICAgIFstY3wtQ3wtLWNvbHVtbnNdIFstbyA8ZmllbGRzPl0gWy1PfC0tc29ydCA8c29ydF9maWVsZHM+XVxuIgorCQkiICAgICAgICBbLVN8LS1zZWxlY3QgPHNlbGVjdGlvbj5dIFstLW5hbWVwcmVmaXhlc10gWy0tbm9oZWFkaW5nc11cbiIKKwkJIiAgICAgICAgWy0tc2VwYXJhdG9yIDxzZXBhcmF0b3I+XVxuXG4iLAorCQlfYmFzZV9jb21tYW5kc1tfYmFzZV9jb21tYW5kXS5uYW1lKTsKKworCWZvciAoaSA9IDA7IF9kbXNldHVwX2NvbW1hbmRzW2ldLm5hbWU7IGkrKykKKwkJZnByaW50ZihvdXQsICJcdCVzICVzXG4iLCBfZG1zZXR1cF9jb21tYW5kc1tpXS5uYW1lLCBfZG1zZXR1cF9jb21tYW5kc1tpXS5oZWxwKTsKKworCWZwcmludGYob3V0LCAiXG48ZGV2aWNlPiBtYXkgYmUgZGV2aWNlIG5hbWUgb3IgLXUgPHV1aWQ+IG9yICIKKwkJICAgICAiLWogPG1ham9yPiAtbSA8bWlub3I+XG4iKTsKKwlmcHJpbnRmKG91dCwgIjxtYW5nbGluZ19tb2RlPiBpcyBvbmUgb2YgJ25vbmUnLCAnYXV0bycgYW5kICdoZXgnLlxuIik7CisJZnByaW50ZihvdXQsICI8ZmllbGRzPiBhcmUgY29tbWEtc2VwYXJhdGVkLiAgVXNlICdoZWxwIC1jJyBmb3IgbGlzdC5cbiIpOworCWZwcmludGYob3V0LCAiVGFibGVfZmlsZSBjb250ZW50cyBtYXkgYmUgc3VwcGxpZWQgb24gc3RkaW4uXG4iKTsKKwlmcHJpbnRmKG91dCwgIk9wdGlvbnMgYXJlOiBkZXZubywgZGV2bmFtZSwgYmxrZGV2bmFtZS5cbiIpOworCWZwcmludGYob3V0LCAiVHJlZSBzcGVjaWZpYyBvcHRpb25zIGFyZTogYXNjaWksIHV0ZiwgdnQxMDA7IGNvbXBhY3QsIGludmVydGVkLCBub3RydW5jO1xuIgorCQkgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtkZXZuYW1lLCBbbm9dZGV2aWNlLCBhY3RpdmUsIG9wZW4sIHJ3IGFuZCB1dWlkLlxuIik7CisJZnByaW50ZihvdXQsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCBfbG9zZXR1cF91c2FnZShGSUxFICpvdXQpCit7CisJZnByaW50ZihvdXQsICJVc2FnZTpcblxuIik7CisJZnByaW50ZihvdXQsICIlcyBbLWR8LWFdIFstZSBlbmNyeXB0aW9uXSAiCisJCSAgICAgIlstbyBvZmZzZXRdIFstZnxsb29wX2RldmljZV0gW2ZpbGVdXG5cbiIsCisJCSAgICAgX2Jhc2VfY29tbWFuZHNbX2Jhc2VfY29tbWFuZF0ubmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF91c2FnZShGSUxFICpvdXQpCit7CisJc3dpdGNoIChfYmFzZV9jb21tYW5kc1tfYmFzZV9jb21tYW5kXS50eXBlKSB7CisJY2FzZSBETVNFVFVQX1RZUEU6CisJCXJldHVybiBfZG1zZXR1cF91c2FnZShvdXQpOworCWNhc2UgTE9TRVRVUF9UWVBFOgorCQlyZXR1cm4gX2xvc2V0dXBfdXNhZ2Uob3V0KTsKKwljYXNlIFNUQVRTX1RZUEU6CisJCXJldHVybiBfc3RhdHNfdXNhZ2Uob3V0KTsKKwljYXNlIERFVk1BUF9OQU1FX1RZUEU6CisJCXJldHVybiBfZGV2bWFwX25hbWVfdXNhZ2Uob3V0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzX2hlbHAoQ01EX0FSR1MpCit7CisJX3VzYWdlKHN0ZGVycik7CisKKwlpZiAoX3N3aXRjaGVzW0NPTFNfQVJHXSB8fCAoYXJnYyAmJiAhc3RyY21wKGFyZ3ZbMF0sICJyZXBvcnQiKSkpIHsKKwkJX3N3aXRjaGVzW09QVElPTlNfQVJHXSA9IDE7CisJCV9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR10gPSAoY2hhciAqKSAiaGVscCI7CisJCV9zd2l0Y2hlc1tTT1JUX0FSR10gPSAwOworCisJCWlmIChfcmVwb3J0KSB7CisJCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKwkJCV9yZXBvcnQgPSBOVUxMOworCQl9CisKKwkJKHZvaWQpIF9yZXBvcnRfaW5pdChjbWQsICJoZWxwIik7CisJCWlmIChfcmVwb3J0KSB7CisJCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKwkJCV9yZXBvcnQgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2Rtc2V0dXBfaGVscChDTURfQVJHUykKK3sKKwlfdXNhZ2Uoc3RkZXJyKTsKKworCWlmIChfc3dpdGNoZXNbQ09MU19BUkddKSB7CisJCV9zd2l0Y2hlc1tPUFRJT05TX0FSR10gPSAxOworCQlfc3RyaW5nX2FyZ3NbT1BUSU9OU19BUkddID0gKGNoYXIgKikgImhlbHAiOworCQlfc3dpdGNoZXNbU09SVF9BUkddID0gMDsKKworCQlpZiAoX3JlcG9ydCkgeworCQkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCQlfcmVwb3J0ID0gTlVMTDsKKwkJfQorCQkodm9pZCkgX3JlcG9ydF9pbml0KGNtZCwgIiIpOworCQlpZiAoX3JlcG9ydCkgeworCQkJZG1fcmVwb3J0X2ZyZWUoX3JlcG9ydCk7CisJCQlfcmVwb3J0ID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbW1hbmQgKl9maW5kX2NvbW1hbmQoY29uc3Qgc3RydWN0IGNvbW1hbmQgKmNvbW1hbmRzLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgY29tbWFuZHNbaV0ubmFtZTsgaSsrKQorCQlpZiAoIXN0cmNtcChjb21tYW5kc1tpXS5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBjb21tYW5kcyArIGk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21tYW5kICpfZmluZF9kbXNldHVwX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gX2ZpbmRfY29tbWFuZChfZG1zZXR1cF9jb21tYW5kcywgbmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tbWFuZCAqX2ZpbmRfc3RhdHNfc3ViY29tbWFuZChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBfZmluZF9jb21tYW5kKF9zdGF0c19zdWJjb21tYW5kcywgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX3N0YXRzKENNRF9BUkdTKQoreworCWNvbnN0IHN0cnVjdCBjb21tYW5kICpzdGF0c19jbWQ7CisKKwlpZiAoX3N3aXRjaGVzW0FSRUFfQVJHXSB8fCBfc3dpdGNoZXNbUkVHSU9OX0FSR10gfHwgX3N3aXRjaGVzW0dST1VQX0FSR10pCisJCV9zdGF0c3R5cGUgPSAwOyAvKiBzd2l0Y2hlcyB3aWxsIE9SIGZsYWdzIGluICovCisJZWxzZQorCQlfc3RhdHN0eXBlID0gRE1fU1RBVFNfV0FMS19SRUdJT04gfCBETV9TVEFUU19XQUxLX0dST1VQOworCisJaWYgKF9zd2l0Y2hlc1tBUkVBX0FSR10pCisJCV9zdGF0c3R5cGUgfD0gRE1fU1RBVFNfV0FMS19BUkVBOworCWlmIChfc3dpdGNoZXNbUkVHSU9OX0FSR10pCisJCV9zdGF0c3R5cGUgfD0gRE1fU1RBVFNfV0FMS19SRUdJT047CisJaWYgKF9zd2l0Y2hlc1tHUk9VUF9BUkddKQorCQlfc3RhdHN0eXBlIHw9IERNX1NUQVRTX1dBTEtfR1JPVVA7CisKKwlpZiAoIShzdGF0c19jbWQgPSBfZmluZF9zdGF0c19zdWJjb21tYW5kKHN1YmNvbW1hbmQpKSkgeworCQlsb2dfZXJyb3IoIlVua25vd24gc3RhdHMgY29tbWFuZC4iKTsKKwkJX3N0YXRzX2hlbHAoc3RhdHNfY21kLCBOVUxMLCBhcmdjLCBhcmd2LCBOVUxMLCBtdWx0aXBsZV9kZXZpY2VzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tBTExfUFJPR1JBTVNfQVJHXSAmJiBfc3dpdGNoZXNbUFJPR1JBTV9JRF9BUkddKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHN1cHBseSBvbmUgb2YgLS1hbGxwcm9ncmFtcyBhbmQgLS1wcm9ncmFtaWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tBTExfUkVHSU9OU19BUkddICYmIF9zd2l0Y2hlc1tSRUdJT05fSURfQVJHXSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBzdXBwbHkgb25lIG9mIC0tYWxscmVnaW9ucyBhbmQgLS1yZWdpb25pZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFBhc3MgdGhlIHN1Yi1jb21tYW5kIHRocm91Z2ggdG8gYWxsb3cgYSBzaW5nbGUgZnVuY3Rpb24gdG8gYmUKKwkgKiB1c2VkIHRvIGltcGxlbWVudCBzZXZlcmFsIGRpc3RpbmN0IHN1Yi1jb21tYW5kcyAoZS5nLiAncmVwb3J0JworCSAqIGFuZCAnbGlzdCcgc2hhcmUgYSBzaW5nbGUgaW1wbGVtZW50YXRpb24uCisJICovCisJaWYgKCFzdGF0c19jbWQtPmZuKHN0YXRzX2NtZCwgc3ViY29tbWFuZCwgYXJnYywgYXJndiwgTlVMTCwKKwkJCSAgIG11bHRpcGxlX2RldmljZXMpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wcm9jZXNzX3RyZWVfb3B0aW9ucyhjb25zdCBjaGFyICpvcHRpb25zKQoreworCWNvbnN0IGNoYXIgKnMsICplbmQ7CisJc3RydWN0IHdpbnNpemUgd2luc3o7CisJc2l6ZV90IGxlbjsKKworCS8qIFN5bWJvbCBzZXQgZGVmYXVsdCAqLworCWlmICghc3RyY21wKG5sX2xhbmdpbmZvKENPREVTRVQpLCAiVVRGLTgiKSkKKwkJX3RzeW0gPSAmX3RzeW1fdXRmOworCWVsc2UKKwkJX3RzeW0gPSAmX3RzeW1fYXNjaWk7CisKKwkvKiBEZWZhdWx0ICovCisJX3RyZWVfc3dpdGNoZXNbVFJfREVWSUNFXSA9IDE7CisJX3RyZWVfc3dpdGNoZXNbVFJfVFJVTkNBVEVdID0gMTsKKworCS8qIHBhcnNlICovCisJZm9yIChzID0gb3B0aW9uczsgcyAmJiAqczsgcysrKSB7CisJCWxlbiA9IDA7CisJCWZvciAoZW5kID0gczsgKmVuZCAmJiAqZW5kICE9ICcsJzsgZW5kKyssIGxlbisrKQorCQkJOworCQlpZiAoIXN0cm5jbXAocywgImRldmljZSIsIGxlbikpCisJCQlfdHJlZV9zd2l0Y2hlc1tUUl9ERVZJQ0VdID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgImJsa2Rldm5hbWUiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfQkxLREVWTkFNRV0gPSAxOworCQllbHNlIGlmICghc3RybmNtcChzLCAibm9kZXZpY2UiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfREVWSUNFXSA9IDA7CisJCWVsc2UgaWYgKCFzdHJuY21wKHMsICJzdGF0dXMiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfU1RBVFVTXSA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKHMsICJ0YWJsZSIsIGxlbikpCisJCQlfdHJlZV9zd2l0Y2hlc1tUUl9UQUJMRV0gPSAxOworCQllbHNlIGlmICghc3RybmNtcChzLCAiYWN0aXZlIiwgbGVuKSkKKwkJCV90cmVlX3N3aXRjaGVzW1RSX0FDVElWRV0gPSAxOworCQllbHNlIGlmICghc3RybmNtcChzLCAib3BlbiIsIGxlbikpCisJCQlfdHJlZV9zd2l0Y2hlc1tUUl9PUEVOQ09VTlRdID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgInV1aWQiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfVVVJRF0gPSAxOworCQllbHNlIGlmICghc3RybmNtcChzLCAicnciLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfUlddID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgInV0ZiIsIGxlbikpCisJCQlfdHN5bSA9ICZfdHN5bV91dGY7CisJCWVsc2UgaWYgKCFzdHJuY21wKHMsICJ2dDEwMCIsIGxlbikpCisJCQlfdHN5bSA9ICZfdHN5bV92dDEwMDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgImFzY2lpIiwgbGVuKSkKKwkJCV90c3ltID0gJl90c3ltX2FzY2lpOworCQllbHNlIGlmICghc3RybmNtcChzLCAiaW52ZXJ0ZWQiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfQk9UVE9NVVBdID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgImNvbXBhY3QiLCBsZW4pKQorCQkJX3RyZWVfc3dpdGNoZXNbVFJfQ09NUEFDVF0gPSAxOworCQllbHNlIGlmICghc3RybmNtcChzLCAibm90cnVuYyIsIGxlbikpCisJCQlfdHJlZV9zd2l0Y2hlc1tUUl9UUlVOQ0FURV0gPSAwOworCQllbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVHJlZSBvcHRpb25zIG5vdCByZWNvZ25pc2VkOiAlc1xuIiwgcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoISplbmQpCisJCQlicmVhazsKKwkJcyA9IGVuZDsKKwl9CisKKwkvKiBUcnVuY2F0aW9uIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggdnQxMDAgZHJhd2luZyBjaGFyICovCisJaWYgKF90c3ltICE9ICZfdHN5bV92dDEwMCkKKwkJaWYgKGlvY3RsKDEsICh1bnNpZ25lZCBsb25nKSBUSU9DR1dJTlNaLCAmd2luc3opID49IDAgJiYgd2luc3oud3NfY29sID4gMykKKwkJCV90ZXJtd2lkdGggPSB3aW5zei53c19jb2wgLSAzOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICpwYXJzZV9sb29wX2RldmljZV9uYW1lKGNvbnN0IGNoYXIgKmRldiwgY29uc3QgY2hhciAqZGV2X2RpcikKK3sKKwljaGFyICpidWY7CisJY2hhciAqZGV2aWNlID0gTlVMTDsKKworCWlmICghKGJ1ZiA9IGRtX21hbGxvYyhQQVRIX01BWCkpKQorCQlyZXR1cm5fTlVMTDsKKworCWlmIChkZXZbMF0gPT0gJy8nKSB7CisJCWlmICghKGRldmljZSA9IF9nZXRfYWJzcGF0aChkZXYpKSkKKwkJCWdvdG9fYmFkOworCisJCWlmIChzdHJuY21wKGRldmljZSwgZGV2X2Rpciwgc3RybGVuKGRldl9kaXIpKSkKKwkJCWdvdG9fYmFkOworCisJCS8qIElmIGRldl9kaXIgZG9lcyBub3QgZW5kIGluIGEgc2xhc2gsIGVuc3VyZSB0aGF0IHRoZQorCQkgICBmb2xsb3dpbmcgYnl0ZSBpbiB0aGUgZGV2aWNlIHN0cmluZyBpcyAiLyIuICAqLworCQlpZiAoZGV2X2RpcltzdHJsZW4oZGV2X2RpcikgLSAxXSAhPSAnLycgJiYKKwkJICAgIGRldmljZVtzdHJsZW4oZGV2X2RpcildICE9ICcvJykKKwkJCWdvdG9fYmFkOworCisJCWlmICghZG1fc3RybmNweShidWYsIHN0cnJjaHIoZGV2aWNlLCAnLycpICsgMSwgUEFUSF9NQVgpKQorCQkJZ290b19iYWQ7CisJCWRtX2ZyZWUoZGV2aWNlKTsKKwl9IGVsc2UgeworCQkvKiBjaGVjayBmb3IgZGV2aWNlIG51bWJlciAqLworCQlpZiAoc3RybmNtcChkZXYsICJsb29wIiwgc2l6ZW9mKCJsb29wIikgLSAxKSkKKwkJCWdvdG9fYmFkOworCisJCWlmICghZG1fc3RybmNweShidWYsIGRldiwgUEFUSF9NQVgpKQorCQkJZ290b19iYWQ7CisJfQorCisJcmV0dXJuIGJ1ZjsKK2JhZDoKKwlkbV9mcmVlKGRldmljZSk7CisJZG1fZnJlZShidWYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgY3JlYXRlIGEgdGFibGUgZm9yIGEgbWFwcGVkIGRldmljZSB1c2luZyB0aGUgbG9vcCB0YXJnZXQuCisgKi8KK3N0YXRpYyBpbnQgX2xvb3BfdGFibGUoY2hhciAqdGFibGUsIHNpemVfdCB0bGVuLCBjaGFyICpmaWxlLAorCQkgICAgICAgY2hhciAqZGV2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBvZmZfdCBvZmYpCit7CisJc3RydWN0IHN0YXQgZmJ1ZjsKKwlvZmZfdCBzaXplLCBzZWN0b3JzOworCWludCBmZCA9IC0xOworI2lmZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorCXN0cnVjdCBzdGF0dmZzIGZzYnVmOworCW9mZl90IGJsa3NpemU7CisjZW5kaWYKKworCWlmICghX3N3aXRjaGVzW1JFQURfT05MWV0pCisJCWZkID0gb3BlbihmaWxlLCBPX1JEV1IpOworCisJaWYgKGZkIDwgMCkgeworCQlfc3dpdGNoZXNbUkVBRF9PTkxZXSsrOworCQlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworCX0KKworCWlmIChmZCA8IDApCisJCWdvdG9fYmFkOworCisJaWYgKGZzdGF0KGZkLCAmZmJ1ZikpCisJCWdvdG9fYmFkOworCisJc2l6ZSA9IChmYnVmLnN0X3NpemUgLSBvZmYpOworCXNlY3RvcnMgPSBzaXplID4+IFNFQ1RPUl9TSElGVDsKKworCWlmIChfc3dpdGNoZXNbVkVSQk9TRV9BUkddKQorCQlmcHJpbnRmKHN0ZGVyciwgTE9TRVRVUF9DTURfTkFNRSAiOiBzZXQgbG9vcCBzaXplIHRvICVsbHVrQiAiCisJCQkiKCVsbHUgc2VjdG9ycylcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpIHNlY3RvcnMgPj4gMSwKKwkJCShsb25nIGxvbmcgdW5zaWduZWQpIHNlY3RvcnMpOworCisjaWZkZWYgSEFWRV9TWVNfU1RBVFZGU19ICisJaWYgKGZzdGF0dmZzKGZkLCAmZnNidWYpKQorCQlnb3RvX2JhZDsKKworCS8qIEZJWE1FIEZyYWdtZW50IHNpemUgY3VycmVudGx5IHVudXNlZCAqLworCWJsa3NpemUgPSBmc2J1Zi5mX2Zyc2l6ZTsKKyNlbmRpZgorCisJaWYgKGNsb3NlKGZkKSkKKwkJbG9nX3N5c19lcnJvcigiY2xvc2UiLCBmaWxlKTsKKworCWlmIChkbV9zbnByaW50Zih0YWJsZSwgdGxlbiwgIiVsbHUgJWxsdSBsb29wICVzICVsbHVcbiIsIDBVTEwsCisJCQkobG9uZyBsb25nIHVuc2lnbmVkKXNlY3RvcnMsIGZpbGUsIChsb25nIGxvbmcgdW5zaWduZWQpb2ZmKSA8IDApCisJCXJldHVybl8wOworCisJaWYgKF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10gPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgIlRhYmxlOiAlc1xuIiwgdGFibGUpOworCisJcmV0dXJuIDE7CisKK2JhZDoKKwlpZiAoZmQgPiAtMSAmJiBjbG9zZShmZCkpCisJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgZmlsZSk7CisKKwlyZXR1cm5fMDsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19sb3NldHVwX3N3aXRjaGVzKGNvbnN0IGNoYXIgKmJhc2UsIGludCAqYXJnY3AsIGNoYXIgKioqYXJndnAsCisJCQkJICAgICBjb25zdCBjaGFyICpkZXZfZGlyKQoreworCWludCBjOworCWludCBlbmNyeXB0X2xvb3AgPSAwLCBkZWxldGUgPSAwLCBmaW5kID0gMCwgc2hvd19hbGwgPSAwOworCWNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKKwljaGFyICpsb29wX2ZpbGUgPSBOVUxMOworCW9mZl90IG9mZnNldCA9IDA7CisKKyNpZmRlZiBIQVZFX0dFVE9QVExPTkcKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJezAsIDAsIDAsIDB9CisJfTsKKyNlbmRpZgorCisJb3B0YXJnID0gMDsKKwlvcHRpbmQgPSBPUFRJTkRfSU5JVDsKKwl3aGlsZSAoKGMgPSBHRVRPUFRMT05HX0ZOKCphcmdjcCwgKmFyZ3ZwLCAiYWRlOmZvOnYiLAorCQkJCSAgbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEgKSB7CisJCWlmIChjID09ICc6JyB8fCBjID09ICc/JykKKwkJCXJldHVybl8wOworCQlpZiAoYyA9PSAnYScpCisJCQlzaG93X2FsbCsrOworCQlpZiAoYyA9PSAnZCcpCisJCQlkZWxldGUrKzsKKwkJaWYgKGMgPT0gJ2UnKQorCQkJZW5jcnlwdF9sb29wKys7CisJCWlmIChjID09ICdmJykKKwkJCWZpbmQrKzsKKwkJaWYgKGMgPT0gJ28nKQorCQkJb2Zmc2V0ID0gYXRvaShvcHRhcmcpOworCQlpZiAoYyA9PSAndicpCisJCQlfc3dpdGNoZXNbVkVSQk9TRV9BUkddKys7CisJfQorCisJKmFyZ3ZwICs9IG9wdGluZCA7CisJKmFyZ2NwIC09IG9wdGluZCA7CisKKwlpZiAoZW5jcnlwdF9sb29wKXsKKwkJZnByaW50ZihzdGRlcnIsICIlczogU29ycnksIGNyeXB0b2xvb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAiCisJCQkJImluIHRoaXMgdmVyc2lvbi5cbiIsIGJhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2hvd19hbGwpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogU29ycnksIHNob3cgYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgIgorCQkJCSJpbiB0aGlzIHZlcnNpb24uXG4iLCBiYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZpbmQpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogU29ycnksIGZpbmQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAiCisJCQkJImluIHRoaXMgdmVyc2lvbi5cbiIsIGJhc2UpOworCQlpZiAoISphcmdjcCkKKwkJCXJldHVybiAwOworCX0KKworCWlmICghKmFyZ2NwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFBsZWFzZSBzcGVjaWZ5IGxvb3BfZGV2aWNlLlxuIiwgYmFzZSk7CisJCV91c2FnZShzdGRlcnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShkZXZpY2VfbmFtZSA9IHBhcnNlX2xvb3BfZGV2aWNlX25hbWUoKCphcmd2cClbMF0sIGRldl9kaXIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgcGFyc2UgbG9vcF9kZXZpY2UgJXNcbiIsCisJCQliYXNlLCAoKmFyZ3ZwKVswXSk7CisJCV91c2FnZShzdGRlcnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGVsZXRlKSB7CisJCSphcmdjcCA9IDE7CisKKwkJKCphcmd2cClbMF0gPSBkZXZpY2VfbmFtZTsKKwkJX2NvbW1hbmQgPSAicmVtb3ZlIjsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKmFyZ2NwICE9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogVG9vIGZldyBhcmd1bWVudHNcbiIsIGJhc2UpOworCQlfdXNhZ2Uoc3RkZXJyKTsKKwkJZG1fZnJlZShkZXZpY2VfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZJWE1FIG1vdmUgdGhlc2UgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSB0byBuYXRpdmUgZG1zZXR1cCAqLworCWlmICghKGxvb3BfZmlsZSA9IF9nZXRfYWJzcGF0aCgoKmFyZ3ZwKVsoZmluZCkgPyAwIDogMV0pKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgcGFyc2UgbG9vcCBmaWxlIG5hbWUgJXNcbiIsCisJCQliYXNlLCAoKmFyZ3ZwKVsxXSk7CisJCV91c2FnZShzdGRlcnIpOworCQlkbV9mcmVlKGRldmljZV9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX3RhYmxlID0gZG1fbWFsbG9jKExPT1BfVEFCTEVfU0laRSk7CisJaWYgKCFfdGFibGUgfHwKKwkgICAgIV9sb29wX3RhYmxlKF90YWJsZSwgKHNpemVfdCkgTE9PUF9UQUJMRV9TSVpFLCBsb29wX2ZpbGUsIGRldmljZV9uYW1lLCBvZmZzZXQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGJ1aWxkIGRldmljZS1tYXBwZXIgdGFibGUgZm9yICVzXG4iLCAoKmFyZ3ZwKVswXSk7CisJCWRtX2ZyZWUoZGV2aWNlX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJX3N3aXRjaGVzW1RBQkxFX0FSR10rKzsKKworCV9jb21tYW5kID0gImNyZWF0ZSI7CisJKCphcmd2cClbMF0gPSBkZXZpY2VfbmFtZSA7CisJKmFyZ2NwID0gMTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wcm9jZXNzX29wdGlvbnMoY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKwljb25zdCBjaGFyICpzLCAqZW5kOworCXNpemVfdCBsZW47CisKKwkvKiBUcmVlIG9wdGlvbnMgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5LiAqLworCWlmIChfc3dpdGNoZXNbVFJFRV9BUkddKQorCQlyZXR1cm4gX3Byb2Nlc3NfdHJlZV9vcHRpb25zKF9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR10pOworCisJLyogQ29sdW1uIG9wdGlvbnMgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5IGJ5IF9yZXBvcnRfaW5pdCAoY2FsbGVkIGxhdGVyKS4gKi8KKwlpZiAoX3N3aXRjaGVzW0NPTFNfQVJHXSkKKwkJcmV0dXJuIDE7CisKKwkvKiBObyBvcHRpb25zIHNwZWNpZmllZC4gKi8KKwlpZiAoIV9zd2l0Y2hlc1tPUFRJT05TX0FSR10pCisJCXJldHVybiAxOworCisJLyogU2V0IGRlZmF1bHRzLiAqLworCV9kZXZfbmFtZV90eXBlID0gRE5fREVWTk87CisKKwkvKiBQYXJzZS4gKi8KKwlmb3IgKHMgPSBvcHRpb25zOyBzICYmICpzOyBzKyspIHsKKwkJbGVuID0gMDsKKwkJZm9yIChlbmQgPSBzOyAqZW5kICYmICplbmQgIT0gJywnOyBlbmQrKywgbGVuKyspCisJCQk7CisJCWlmICghc3RybmNtcChzLCAiZGV2bm8iLCBsZW4pKQorCQkJX2Rldl9uYW1lX3R5cGUgPSBETl9ERVZOTzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocywgImJsa2Rldm5hbWUiLCBsZW4pKQorCQkJX2Rldl9uYW1lX3R5cGUgPSBETl9CTEs7CisJCWVsc2UgaWYgKCFzdHJuY21wKHMsICJkZXZuYW1lIiwgbGVuKSkKKwkJCV9kZXZfbmFtZV90eXBlID0gRE5fTUFQOworCQllbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiT3B0aW9uIG5vdCByZWNvZ25pc2VkOiAlc1xuIiwgcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghKmVuZCkKKwkJCWJyZWFrOworCQlzID0gZW5kOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wcm9jZXNzX3N3aXRjaGVzKGludCAqYXJnY3AsIGNoYXIgKioqYXJndnAsIGNvbnN0IGNoYXIgKmRldl9kaXIpCit7CisJY29uc3QgY2hhciAqYmFzZTsKKwljaGFyICpuYW1lYmFzZSwgKnM7CisJc3RhdGljIGludCBpbmQ7CisJaW50IGMsIHIsIGk7CisKKyNpZmRlZiBIQVZFX0dFVE9QVExPTkcKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyJyZWFkb25seSIsIDAsICZpbmQsIFJFQURfT05MWX0sCisJCXsiYWxpYXMiLCAxLCAmaW5kLCBBTElBU19BUkd9LAorCQl7ImFsbGRldmljZXMiLCAwLCAmaW5kLCBBTExfREVWSUNFU19BUkd9LAorCQl7ImFsbHByb2dyYW1zIiwgMCwgJmluZCwgQUxMX1BST0dSQU1TX0FSR30sCisJCXsiYWxscmVnaW9ucyIsIDAsICZpbmQsIEFMTF9SRUdJT05TX0FSR30sCisJCXsiYXJlYSIsIDAsICZpbmQsIEFSRUFfQVJHfSwKKwkJeyJhcmVhcyIsIDEsICZpbmQsIEFSRUFTX0FSR30sCisJCXsiYXJlYXNpemUiLCAxLCAmaW5kLCBBUkVBX1NJWkVfQVJHfSwKKwkJeyJib3VuZHMiLCAxLCAmaW5kLCBCT1VORFNfQVJHfSwKKwkJeyJjaGVja3MiLCAwLCAmaW5kLCBDSEVDS1NfQVJHfSwKKwkJeyJjbGVhciIsIDAsICZpbmQsIENMRUFSX0FSR30sCisJCXsiY29sdW1ucyIsIDAsICZpbmQsIENPTFNfQVJHfSwKKwkJeyJjb3VudCIsIDEsICZpbmQsIENPVU5UX0FSR30sCisJCXsiZGVmZXJyZWQiLCAwLCAmaW5kLCBERUZFUlJFRF9BUkd9LAorCQl7InNlbGVjdCIsIDEsICZpbmQsIFNFTEVDVF9BUkd9LAorCQl7ImV4ZWMiLCAxLCAmaW5kLCBFWEVDX0FSR30sCisJCXsiZmlsZW1hcCIsIDAsICZpbmQsIEZJTEVNQVBfQVJHfSwKKwkJeyJmb3JjZSIsIDAsICZpbmQsIEZPUkNFX0FSR30sCisJCXsiZ2lkIiwgMSwgJmluZCwgR0lEX0FSR30sCisJCXsiZ3JvdXAiLCAwLCAmaW5kLCBHUk9VUF9BUkd9LAorCQl7Imdyb3VwaWQiLCAxLCAmaW5kLCBHUk9VUF9JRF9BUkd9LAorCQl7ImhlbHAiLCAwLCAmaW5kLCBIRUxQX0FSR30sCisJCXsiaGlzdG9ncmFtIiwgMCwgJmluZCwgSElTVE9HUkFNX0FSR30sCisJCXsiaW5hY3RpdmUiLCAwLCAmaW5kLCBJTkFDVElWRV9BUkd9LAorCQl7ImludGVydmFsIiwgMSwgJmluZCwgSU5URVJWQUxfQVJHfSwKKwkJeyJsZW5ndGgiLCAxLCAmaW5kLCBMRU5HVEhfQVJHfSwKKwkJeyJtYW5nbGVuYW1lIiwgMSwgJmluZCwgTUFOR0xFTkFNRV9BUkd9LAorCQl7Im1ham9yIiwgMSwgJmluZCwgTUFKT1JfQVJHfSwKKwkJeyJtaW5vciIsIDEsICZpbmQsIE1JTk9SX0FSR30sCisJCXsibW9kZSIsIDEsICZpbmQsIE1PREVfQVJHfSwKKwkJeyJuYW1lcHJlZml4ZXMiLCAwLCAmaW5kLCBOQU1FUFJFRklYRVNfQVJHfSwKKwkJeyJub2dyb3VwIiwgMCwgJmluZCwgTk9HUk9VUF9BUkd9LAorCQl7Im5vZmx1c2giLCAwLCAmaW5kLCBOT0ZMVVNIX0FSR30sCisJCXsibm9oZWFkaW5ncyIsIDAsICZpbmQsIE5PSEVBRElOR1NfQVJHfSwKKwkJeyJub2xvY2tmcyIsIDAsICZpbmQsIE5PTE9DS0ZTX0FSR30sCisJCXsibm9vcGVuY291bnQiLCAwLCAmaW5kLCBOT09QRU5DT1VOVF9BUkd9LAorCQl7Im5vc3VmZml4IiwgMCwgJmluZCwgTk9TVUZGSVhfQVJHfSwKKwkJeyJub3RhYmxlIiwgMCwgJmluZCwgTk9UQUJMRV9BUkd9LAorCQl7Im5vdGltZXN1ZmZpeCIsIDAsICZpbmQsIE5PVElNRVNVRkZJWF9BUkd9LAorCQl7InVkZXZjb29raWUiLCAxLCAmaW5kLCBVREVWQ09PS0lFX0FSR30sCisJCXsibm91ZGV2cnVsZXMiLCAwLCAmaW5kLCBOT1VERVZSVUxFU19BUkd9LAorCQl7Im5vdWRldnN5bmMiLCAwLCAmaW5kLCBOT1VERVZTWU5DX0FSR30sCisJCXsib3B0aW9ucyIsIDEsICZpbmQsIE9QVElPTlNfQVJHfSwKKwkJeyJwcmVjaXNlIiwgMCwgJmluZCwgUFJFQ0lTRV9BUkd9LAorCQl7InByb2dyYW1pZCIsIDEsICZpbmQsIFBST0dSQU1fSURfQVJHfSwKKwkJeyJyYXciLCAwLCAmaW5kLCBSQVdfQVJHfSwKKwkJeyJyZWFkYWhlYWQiLCAxLCAmaW5kLCBSRUFEQUhFQURfQVJHfSwKKwkJeyJyZWdpb24iLCAwLCAmaW5kLCBSRUdJT05fQVJHfSwKKwkJeyJyZWdpb25zIiwgMSwgJmluZCwgUkVHSU9OU19BUkd9LAorCQl7InJlZ2lvbmlkIiwgMSwgJmluZCwgUkVHSU9OX0lEX0FSR30sCisJCXsicmVsYXRpdmUiLCAwLCAmaW5kLCBSRUxBVElWRV9BUkd9LAorCQl7InJldHJ5IiwgMCwgJmluZCwgUkVUUllfQVJHfSwKKwkJeyJyb3dzIiwgMCwgJmluZCwgUk9XU19BUkd9LAorCQl7InNlZ21lbnRzIiwgMCwgJmluZCwgU0VHTUVOVFNfQVJHfSwKKwkJeyJzZXBhcmF0b3IiLCAxLCAmaW5kLCBTRVBBUkFUT1JfQVJHfSwKKwkJeyJzZXR1dWlkIiwgMCwgJmluZCwgU0VUVVVJRF9BUkd9LAorCQl7InNob3drZXlzIiwgMCwgJmluZCwgU0hPV0tFWVNfQVJHfSwKKwkJeyJzb3J0IiwgMSwgJmluZCwgU09SVF9BUkd9LAorCQl7InN0YXJ0IiwgMSwgJmluZCwgU1RBUlRfQVJHfSwKKwkJeyJ0YWJsZSIsIDEsICZpbmQsIFRBQkxFX0FSR30sCisJCXsidGFyZ2V0IiwgMSwgJmluZCwgVEFSR0VUX0FSR30sCisJCXsidHJlZSIsIDAsICZpbmQsIFRSRUVfQVJHfSwKKwkJeyJ1aWQiLCAxLCAmaW5kLCBVSURfQVJHfSwKKwkJeyJ1bml0cyIsIDEsICZpbmQsIFVOSVRTX0FSR30sCisJCXsidXVpZCIsIDEsICZpbmQsIFVVSURfQVJHfSwKKwkJeyJ1bmJ1ZmZlcmVkIiwgMCwgJmluZCwgVU5CVUZGRVJFRF9BUkd9LAorCQl7InVucXVvdGVkIiwgMCwgJmluZCwgVU5RVU9URURfQVJHfSwKKwkJeyJ1c2VyZGF0YSIsIDEsICZpbmQsIFVTRVJfREFUQV9BUkd9LAorCQl7InZlcmJvc2UiLCAxLCAmaW5kLCBWRVJCT1NFX0FSR30sCisJCXsidmVyaWZ5dWRldiIsIDAsICZpbmQsIFZFUklGWVVERVZfQVJHfSwKKwkJeyJ2ZXJzaW9uIiwgMCwgJmluZCwgVkVSU0lPTl9BUkd9LAorCQl7InllcyIsIDAsICZpbmQsIFlFU19BUkd9LAorCQl7ImFkZG5vZGVvbnJlc3VtZSIsIDAsICZpbmQsIEFERF9OT0RFX09OX1JFU1VNRV9BUkd9LAorCQl7ImFkZG5vZGVvbmNyZWF0ZSIsIDAsICZpbmQsIEFERF9OT0RFX09OX0NSRUFURV9BUkd9LAorCQl7MCwgMCwgMCwgMH0KKwl9OworI2Vsc2UKKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uczsKKyNlbmRpZgorCisJLyoKKwkgKiBaZXJvIGFsbCB0aGUgaW5kZXggY291bnRzLgorCSAqLworCW1lbXNldCgmX3N3aXRjaGVzLCAwLCBzaXplb2YoX3N3aXRjaGVzKSk7CisJbWVtc2V0KCZfaW50X2FyZ3MsIDAsIHNpemVvZihfaW50X2FyZ3MpKTsKKwlfcmVhZF9haGVhZF9mbGFncyA9IDA7CisKKwlpZiAoIShuYW1lYmFzZSA9IHN0cmR1cCgoKmFyZ3ZwKVswXSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGR1cGxpY2F0ZSBuYW1lLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWJhc2UgPSBkbV9iYXNlbmFtZShuYW1lYmFzZSk7CisKKwlpID0gMDsKKwlkbyB7CisJCWlmICghc3RyY21wKGJhc2UsIF9iYXNlX2NvbW1hbmRzW2ldLm5hbWUpKSB7CisJCQlfYmFzZV9jb21tYW5kID0gX2Jhc2VfY29tbWFuZHNbaV0uY29tbWFuZDsKKwkJCV9iYXNlX2NvbW1hbmRfdHlwZSA9IF9iYXNlX2NvbW1hbmRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCsraSA8IF9udW1fYmFzZV9jb21tYW5kcyk7CisKKwlmcmVlKG5hbWViYXNlKTsKKworCWlmIChfYmFzZV9jb21tYW5kX3R5cGUgPT0gREVWTUFQX05BTUVfVFlQRSkgeworCQlfc3dpdGNoZXNbQ09MU19BUkddKys7CisJCV9zd2l0Y2hlc1tOT0hFQURJTkdTX0FSR10rKzsKKwkJX3N3aXRjaGVzW09QVElPTlNfQVJHXSsrOworCQlfc3dpdGNoZXNbTUFKT1JfQVJHXSsrOworCQlfc3dpdGNoZXNbTUlOT1JfQVJHXSsrOworCQlfc3RyaW5nX2FyZ3NbT1BUSU9OU19BUkddID0gKGNoYXIgKikgIm5hbWUiOworCisJCWlmICgqYXJnY3AgPT0gMykgeworCQkJX2ludF9hcmdzW01BSk9SX0FSR10gPSBhdG9pKCgqYXJndnApWzFdKTsKKwkJCV9pbnRfYXJnc1tNSU5PUl9BUkddID0gYXRvaSgoKmFyZ3ZwKVsyXSk7CisJCQkqYXJnY3AgLT0gMjsKKwkJCSphcmd2cCArPSAyOworCQl9IGVsc2UgaWYgKCgqYXJnY3AgPT0gMikgJiYKKwkJCSAgICgyID09IHNzY2FuZigoKmFyZ3ZwKVsxXSwgIiVpOiVpIiwKKwkJCQkJJl9pbnRfYXJnc1tNQUpPUl9BUkddLAorCQkJCQkmX2ludF9hcmdzW01JTk9SX0FSR10pKSkgeworCQkJKmFyZ2NwIC09IDE7CisJCQkqYXJndnAgKz0gMTsKKwkJfSBlbHNlIHsKKwkJCV91c2FnZShzdGRlcnIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlfY29tbWFuZCA9ICJpbmZvIjsKKwkJKCphcmd2cCkrKzsKKwkJKCphcmdjcCktLTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoX2Jhc2VfY29tbWFuZF90eXBlID09IExPU0VUVVBfVFlQRSkgeworCQlyID0gX3Byb2Nlc3NfbG9zZXR1cF9zd2l0Y2hlcyhfYmFzZV9jb21tYW5kc1tfYmFzZV9jb21tYW5kXS5uYW1lLCBhcmdjcCwgYXJndnAsIGRldl9kaXIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlvcHRhcmcgPSAwOworCW9wdGluZCA9IE9QVElORF9JTklUOworCXdoaWxlICgoaW5kID0gLTEsIGMgPSBHRVRPUFRMT05HX0ZOKCphcmdjcCwgKmFyZ3ZwLCAiY0NmRzpoajptOk06bm86TzpyUzp1OlU6dnkiLAorCQkJCQkgICAgbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKwkJaWYgKGluZCA9PSBBTElBU19BUkcpIHsKKwkJCV9zd2l0Y2hlc1tBTElBU19BUkddKys7CisJCQlfc3RyaW5nX2FyZ3NbQUxJQVNfQVJHXSA9IG9wdGFyZzsKKwkJfQorCQlpZiAoaW5kID09IEFMTF9ERVZJQ0VTX0FSRykKKwkJCV9zd2l0Y2hlc1tBTExfREVWSUNFU19BUkddKys7CisJCWlmIChpbmQgPT0gQUxMX1BST0dSQU1TX0FSRykKKwkJCV9zd2l0Y2hlc1tBTExfUFJPR1JBTVNfQVJHXSsrOworCQlpZiAoaW5kID09IEFMTF9SRUdJT05TX0FSRykKKwkJCV9zd2l0Y2hlc1tBTExfUkVHSU9OU19BUkddKys7CisJCWlmIChpbmQgPT0gQVJFQV9BUkcpCisJCQlfc3dpdGNoZXNbQVJFQV9BUkddKys7CisJCWlmIChpbmQgPT0gQVJFQVNfQVJHKSB7CisJCQlfc3dpdGNoZXNbQVJFQVNfQVJHXSsrOworCQkJX2ludF9hcmdzW0FSRUFTX0FSR10gPSBhdG9pKG9wdGFyZyk7CisJCX0KKwkJaWYgKGluZCA9PSBBUkVBX1NJWkVfQVJHKSB7CisJCQlfc3dpdGNoZXNbQVJFQV9TSVpFX0FSR10rKzsKKwkJCV9zdHJpbmdfYXJnc1tBUkVBX1NJWkVfQVJHXSA9IG9wdGFyZzsKKwkJfQorCQlpZiAoaW5kID09IFVTRVJfREFUQV9BUkcpIHsKKwkJCV9zd2l0Y2hlc1tVU0VSX0RBVEFfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1VTRVJfREFUQV9BUkddID0gb3B0YXJnOworCQl9CisJCWlmIChjID09ICc6JyB8fCBjID09ICc/JykKKwkJCXJldHVybl8wOworCQlpZiAoYyA9PSAnaCcgfHwgaW5kID09IEhFTFBfQVJHKQorCQkJX3N3aXRjaGVzW0hFTFBfQVJHXSsrOworCQlpZiAoaW5kID09IEJPVU5EU19BUkcpIHsKKwkJCV9zd2l0Y2hlc1tCT1VORFNfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW0JPVU5EU19BUkddID0gb3B0YXJnOworCQl9CisJCWlmIChpbmQgPT0gQ0xFQVJfQVJHKQorCQkJX3N3aXRjaGVzW0NMRUFSX0FSR10rKzsKKwkJaWYgKGMgPT0gJ2MnIHx8IGMgPT0gJ0MnIHx8IGluZCA9PSBDT0xTX0FSRykKKwkJCV9zd2l0Y2hlc1tDT0xTX0FSR10rKzsKKwkJaWYgKGluZCA9PSBGSUxFTUFQX0FSRykKKwkJCV9zd2l0Y2hlc1tGSUxFTUFQX0FSR10rKzsKKwkJaWYgKGMgPT0gJ2YnIHx8IGluZCA9PSBGT1JDRV9BUkcpCisJCQlfc3dpdGNoZXNbRk9SQ0VfQVJHXSsrOworCQlpZiAoYyA9PSAncicgfHwgaW5kID09IFJFQURfT05MWSkKKwkJCV9zd2l0Y2hlc1tSRUFEX09OTFldKys7CisJCWlmIChpbmQgPT0gSElTVE9HUkFNX0FSRykKKwkJCV9zd2l0Y2hlc1tISVNUT0dSQU1fQVJHXSsrOworCQlpZiAoaW5kID09IExFTkdUSF9BUkcpIHsKKwkJCV9zd2l0Y2hlc1tMRU5HVEhfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW0xFTkdUSF9BUkddID0gb3B0YXJnOworCQl9CisJCWlmIChjID09ICdqJyB8fCBpbmQgPT0gTUFKT1JfQVJHKSB7CisJCQlfc3dpdGNoZXNbTUFKT1JfQVJHXSsrOworCQkJX2ludF9hcmdzW01BSk9SX0FSR10gPSBhdG9pKG9wdGFyZyk7CisJCX0KKwkJaWYgKGluZCA9PSBSRUdJT05TX0FSRykgeworCQkJX3N3aXRjaGVzW1JFR0lPTlNfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1JFR0lPTlNfQVJHXSA9IG9wdGFyZzsKKwkJfQorCQlpZiAoYyA9PSAnbScgfHwgaW5kID09IE1JTk9SX0FSRykgeworCQkJX3N3aXRjaGVzW01JTk9SX0FSR10rKzsKKwkJCV9pbnRfYXJnc1tNSU5PUl9BUkddID0gYXRvaShvcHRhcmcpOworCQl9CisJCWlmIChpbmQgPT0gTk9TVUZGSVhfQVJHKQorCQkJX3N3aXRjaGVzW05PU1VGRklYX0FSR10rKzsKKwkJaWYgKGMgPT0gJ24nIHx8IGluZCA9PSBOT1RBQkxFX0FSRykKKwkJCV9zd2l0Y2hlc1tOT1RBQkxFX0FSR10rKzsKKwkJaWYgKGluZCA9PSBOT1RJTUVTVUZGSVhfQVJHKQorCQkJX3N3aXRjaGVzW05PVElNRVNVRkZJWF9BUkddKys7CisJCWlmIChjID09ICdvJyB8fCBpbmQgPT0gT1BUSU9OU19BUkcpIHsKKwkJCV9zd2l0Y2hlc1tPUFRJT05TX0FSR10rKzsKKwkJCV9zdHJpbmdfYXJnc1tPUFRJT05TX0FSR10gPSBvcHRhcmc7CisJCX0KKwkJaWYgKGluZCA9PSBQUk9HUkFNX0lEX0FSRykgeworCQkJX3N3aXRjaGVzW1BST0dSQU1fSURfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1BST0dSQU1fSURfQVJHXSA9IG9wdGFyZzsKKwkJfQorCQlpZiAoaW5kID09IFBSRUNJU0VfQVJHKQorCQkJX3N3aXRjaGVzW1BSRUNJU0VfQVJHXSsrOworCQlpZiAoaW5kID09IFJBV19BUkcpCisJCQlfc3dpdGNoZXNbUkFXX0FSR10rKzsKKwkJaWYgKGluZCA9PSBSRUdJT05fQVJHKQorCQkJX3N3aXRjaGVzW1JFR0lPTl9BUkddKys7CisJCWlmIChpbmQgPT0gUkVHSU9OX0lEX0FSRykgeworCQkJX3N3aXRjaGVzW1JFR0lPTl9JRF9BUkddKys7CisJCQlfaW50X2FyZ3NbUkVHSU9OX0lEX0FSR10gPSBhdG9pKG9wdGFyZyk7CisJCX0KKwkJaWYgKGluZCA9PSBSRUxBVElWRV9BUkcpCisJCQlfc3dpdGNoZXNbUkVMQVRJVkVfQVJHXSsrOworCQlpZiAoaW5kID09IFNFUEFSQVRPUl9BUkcpIHsKKwkJCV9zd2l0Y2hlc1tTRVBBUkFUT1JfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1NFUEFSQVRPUl9BUkddID0gb3B0YXJnOworCQl9CisJCWlmIChpbmQgPT0gVU5JVFNfQVJHKSB7CisJCQlfc3dpdGNoZXNbVU5JVFNfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1VOSVRTX0FSR10gPSBvcHRhcmc7CisJCX0KKwkJaWYgKGMgPT0gJ08nIHx8IGluZCA9PSBTT1JUX0FSRykgeworCQkJX3N3aXRjaGVzW1NPUlRfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1NPUlRfQVJHXSA9IG9wdGFyZzsKKwkJfQorCQlpZiAoYyA9PSAnUycgfHwgaW5kID09IFNFTEVDVF9BUkcpIHsKKwkJCV9zd2l0Y2hlc1tTRUxFQ1RfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1NFTEVDVF9BUkddID0gb3B0YXJnOworCQl9CisJCWlmIChpbmQgPT0gU1RBUlRfQVJHKSB7CisJCQlfc3dpdGNoZXNbU1RBUlRfQVJHXSsrOworCQkJX3N0cmluZ19hcmdzW1NUQVJUX0FSR10gPSBvcHRhcmc7CisJCX0KKwkJaWYgKGMgPT0gJ3YnIHx8IGluZCA9PSBWRVJCT1NFX0FSRykKKwkJCV9zd2l0Y2hlc1tWRVJCT1NFX0FSR10rKzsKKwkJaWYgKGMgPT0gJ3UnIHx8IGluZCA9PSBVVUlEX0FSRykgeworCQkJX3N3aXRjaGVzW1VVSURfQVJHXSsrOworCQkJX3V1aWQgPSBvcHRhcmc7CisJCX0KKwkJaWYgKGMgPT0gJ3knIHx8IGluZCA9PSBZRVNfQVJHKQorCQkJX3N3aXRjaGVzW1lFU19BUkddKys7CisJCWlmIChpbmQgPT0gQUREX05PREVfT05fUkVTVU1FX0FSRykKKwkJCV9zd2l0Y2hlc1tBRERfTk9ERV9PTl9SRVNVTUVfQVJHXSsrOworCQlpZiAoaW5kID09IEFERF9OT0RFX09OX0NSRUFURV9BUkcpCisJCQlfc3dpdGNoZXNbQUREX05PREVfT05fQ1JFQVRFX0FSR10rKzsKKwkJaWYgKGluZCA9PSBDSEVDS1NfQVJHKQorCQkJX3N3aXRjaGVzW0NIRUNLU19BUkddKys7CisJCWlmIChpbmQgPT0gQ09VTlRfQVJHKSB7CisJCQlfc3dpdGNoZXNbQ09VTlRfQVJHXSsrOworCQkJX2ludF9hcmdzW0NPVU5UX0FSR10gPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoX2ludF9hcmdzW0NPVU5UX0FSR10gPCAwKSB7CisJCQkJbG9nX2Vycm9yKCJDb3VudCBtdXN0IGJlIHplcm8gb3IgZ3JlYXRlci4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAoaW5kID09IFVERVZDT09LSUVfQVJHKSB7CisJCQlfc3dpdGNoZXNbVURFVkNPT0tJRV9BUkddKys7CisJCQlfdWRldl9jb29raWUgPSBfZ2V0X2Nvb2tpZV92YWx1ZShvcHRhcmcpOworCQl9CisJCWlmIChpbmQgPT0gTk9VREVWUlVMRVNfQVJHKQorCQkJX3N3aXRjaGVzW05PVURFVlJVTEVTX0FSR10rKzsKKwkJaWYgKGluZCA9PSBOT1VERVZTWU5DX0FSRykKKwkJCV9zd2l0Y2hlc1tOT1VERVZTWU5DX0FSR10rKzsKKwkJaWYgKGluZCA9PSBWRVJJRllVREVWX0FSRykKKwkJCV9zd2l0Y2hlc1tWRVJJRllVREVWX0FSR10rKzsKKwkJaWYgKGMgPT0gJ0cnIHx8IGluZCA9PSBHSURfQVJHKSB7CisJCQlfc3dpdGNoZXNbR0lEX0FSR10rKzsKKwkJCV9pbnRfYXJnc1tHSURfQVJHXSA9IGF0b2kob3B0YXJnKTsKKwkJfQorCQlpZiAoaW5kID09IEdST1VQX0FSRykKKwkJCV9zd2l0Y2hlc1tHUk9VUF9BUkddKys7CisJCWlmIChpbmQgPT0gR1JPVVBfSURfQVJHKSB7CisJCQlfc3dpdGNoZXNbR1JPVVBfSURfQVJHXSsrOworCQkJX2ludF9hcmdzW0dST1VQX0lEX0FSR10gPSBhdG9pKG9wdGFyZyk7CisJCX0KKwkJaWYgKGMgPT0gJ1UnIHx8IGluZCA9PSBVSURfQVJHKSB7CisJCQlfc3dpdGNoZXNbVUlEX0FSR10rKzsKKwkJCV9pbnRfYXJnc1tVSURfQVJHXSA9IGF0b2kob3B0YXJnKTsKKwkJfQorCQlpZiAoYyA9PSAnTScgfHwgaW5kID09IE1PREVfQVJHKSB7CisJCQlfc3dpdGNoZXNbTU9ERV9BUkddKys7CisJCQkvKiBGSVhNRSBBY2NlcHQgbW9kZXMgYXMgcGVyIGNobW9kICovCisJCQlfaW50X2FyZ3NbTU9ERV9BUkddID0gKGludCkgc3RydG9sKG9wdGFyZywgTlVMTCwgOCk7CisJCX0KKwkJaWYgKGluZCA9PSBERUZFUlJFRF9BUkcpCisJCQlfc3dpdGNoZXNbREVGRVJSRURfQVJHXSsrOworCQlpZiAoaW5kID09IEVYRUNfQVJHKSB7CisJCQlfc3dpdGNoZXNbRVhFQ19BUkddKys7CisJCQlfY29tbWFuZF90b19leGVjID0gb3B0YXJnOworCQl9CisJCWlmIChpbmQgPT0gVEFSR0VUX0FSRykgeworCQkJX3N3aXRjaGVzW1RBUkdFVF9BUkddKys7CisJCQlfdGFyZ2V0ID0gb3B0YXJnOworCQl9CisJCWlmIChpbmQgPT0gU0VHTUVOVFNfQVJHKQorCQkJX3N3aXRjaGVzW1NFR01FTlRTX0FSR10rKzsKKwkJaWYgKGluZCA9PSBJTkFDVElWRV9BUkcpCisJCSAgICAgICBfc3dpdGNoZXNbSU5BQ1RJVkVfQVJHXSsrOworCQlpZiAoaW5kID09IElOVEVSVkFMX0FSRykgeworCQkJX3N3aXRjaGVzW0lOVEVSVkFMX0FSR10rKzsKKwkJCV9pbnRfYXJnc1tJTlRFUlZBTF9BUkddID0gYXRvaShvcHRhcmcpOworCQkJaWYgKF9pbnRfYXJnc1tJTlRFUlZBTF9BUkddIDw9IDApIHsKKwkJCQlsb2dfZXJyb3IoIkludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWlmIChpbmQgPT0gTUFOR0xFTkFNRV9BUkcpIHsKKwkJCV9zd2l0Y2hlc1tNQU5HTEVOQU1FX0FSR10rKzsKKwkJCWlmICghc3RyY2FzZWNtcChvcHRhcmcsICJub25lIikpCisJCQkJX2ludF9hcmdzW01BTkdMRU5BTUVfQVJHXSA9IERNX1NUUklOR19NQU5HTElOR19OT05FOworCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAob3B0YXJnLCAiYXV0byIpKQorCQkJCV9pbnRfYXJnc1tNQU5HTEVOQU1FX0FSR10gPSBETV9TVFJJTkdfTUFOR0xJTkdfQVVUTzsKKwkJCWVsc2UgaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgImhleCIpKQorCQkJCV9pbnRfYXJnc1tNQU5HTEVOQU1FX0FSR10gPSBETV9TVFJJTkdfTUFOR0xJTkdfSEVYOworCQkJZWxzZSB7CisJCQkJbG9nX2Vycm9yKCJVbmtub3duIG5hbWUgbWFuZ2xpbmcgbW9kZSIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZG1fc2V0X25hbWVfbWFuZ2xpbmdfbW9kZSgoZG1fc3RyaW5nX21hbmdsaW5nX3QpIF9pbnRfYXJnc1tNQU5HTEVOQU1FX0FSR10pOworCQl9CisJCWlmIChpbmQgPT0gTkFNRVBSRUZJWEVTX0FSRykKKwkJCV9zd2l0Y2hlc1tOQU1FUFJFRklYRVNfQVJHXSsrOworCQlpZiAoaW5kID09IE5PRkxVU0hfQVJHKQorCQkJX3N3aXRjaGVzW05PRkxVU0hfQVJHXSsrOworCQlpZiAoaW5kID09IE5PR1JPVVBfQVJHKQorCQkJX3N3aXRjaGVzW05PR1JPVVBfQVJHXSsrOworCQlpZiAoaW5kID09IE5PSEVBRElOR1NfQVJHKQorCQkJX3N3aXRjaGVzW05PSEVBRElOR1NfQVJHXSsrOworCQlpZiAoaW5kID09IE5PTE9DS0ZTX0FSRykKKwkJCV9zd2l0Y2hlc1tOT0xPQ0tGU19BUkddKys7CisJCWlmIChpbmQgPT0gTk9PUEVOQ09VTlRfQVJHKQorCQkJX3N3aXRjaGVzW05PT1BFTkNPVU5UX0FSR10rKzsKKwkJaWYgKGluZCA9PSBSRUFEQUhFQURfQVJHKSB7CisJCQlfc3dpdGNoZXNbUkVBREFIRUFEX0FSR10rKzsKKwkJCWlmICghc3RyY2FzZWNtcChvcHRhcmcsICJhdXRvIikpCisJCQkJX2ludF9hcmdzW1JFQURBSEVBRF9BUkddID0gRE1fUkVBRF9BSEVBRF9BVVRPOworCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAob3B0YXJnLCAibm9uZSIpKQorCQkJCV9pbnRfYXJnc1tSRUFEQUhFQURfQVJHXSA9IERNX1JFQURfQUhFQURfTk9ORTsKKwkJCWVsc2UgeworCQkJCWZvciAocyA9IG9wdGFyZzsgaXNzcGFjZSgqcyk7IHMrKykKKwkJCQkJOworCQkJCWlmICgqcyA9PSAnKycpCisJCQkJCV9yZWFkX2FoZWFkX2ZsYWdzID0gRE1fUkVBRF9BSEVBRF9NSU5JTVVNX0ZMQUc7CisJCQkJX2ludF9hcmdzW1JFQURBSEVBRF9BUkddID0gYXRvaShvcHRhcmcpOworCQkJCWlmIChfaW50X2FyZ3NbUkVBREFIRUFEX0FSR10gPCAtMSkgeworCQkJCQlsb2dfZXJyb3IoIk5lZ2F0aXZlIHJlYWQgYWhlYWQgdmFsdWUgIgorCQkJCQkJICAiKCVkKSBpcyBub3QgdW5kZXJzdG9vZC4iLAorCQkJCQkJICBfaW50X2FyZ3NbUkVBREFIRUFEX0FSR10pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGluZCA9PSBSRVRSWV9BUkcpCisJCQlfc3dpdGNoZXNbUkVUUllfQVJHXSsrOworCQlpZiAoaW5kID09IFJPV1NfQVJHKQorCQkJX3N3aXRjaGVzW1JPV1NfQVJHXSsrOworCQlpZiAoaW5kID09IFNFVFVVSURfQVJHKQorCQkJX3N3aXRjaGVzW1NFVFVVSURfQVJHXSsrOworCQlpZiAoaW5kID09IFNIT1dLRVlTX0FSRykKKwkJCV9zd2l0Y2hlc1tTSE9XS0VZU19BUkddKys7CisJCWlmIChpbmQgPT0gVEFCTEVfQVJHKSB7CisJCQlfc3dpdGNoZXNbVEFCTEVfQVJHXSsrOworCQkJaWYgKCEoX3RhYmxlID0gZG1fc3RyZHVwKG9wdGFyZykpKSB7CisJCQkJbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0YWJsZSBzdHJpbmcuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKGluZCA9PSBUUkVFX0FSRykKKwkJCV9zd2l0Y2hlc1tUUkVFX0FSR10rKzsKKwkJaWYgKGluZCA9PSBVTlFVT1RFRF9BUkcpCisJCQlfc3dpdGNoZXNbVU5RVU9URURfQVJHXSsrOworCQlpZiAoaW5kID09IFZFUlNJT05fQVJHKQorCQkJX3N3aXRjaGVzW1ZFUlNJT05fQVJHXSsrOworCX0KKworCWlmIChfc3dpdGNoZXNbVkVSQk9TRV9BUkddID4gMSkgeworCQlkbV9sb2dfaW5pdF92ZXJib3NlKF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10gLSAxKTsKKwkJaWYgKF9zd2l0Y2hlc1tWRVJCT1NFX0FSR10gPiAyKSB7CisJCQlpZiAoIShfaW5pdGlhbF90aW1lc3RhbXAgPSBkbV90aW1lc3RhbXBfYWxsb2MoKSkpCisJCQkJc3RhY2s7CisJCQllbHNlIGlmICghZG1fdGltZXN0YW1wX2dldChfaW5pdGlhbF90aW1lc3RhbXApKQorCQkJCXN0YWNrOworCQkJZWxzZQorCQkJCWxvZ19kZWJ1ZygiVGltZXN0YW1wOiAgICAgICAwLjAwMDAwMDAwMCBzZWNvbmRzIik7CisJCX0KKwl9CisKKwlpZiAoKF9zd2l0Y2hlc1tNQUpPUl9BUkddICYmICFfc3dpdGNoZXNbTUlOT1JfQVJHXSkgfHwKKwkgICAgKCFfc3dpdGNoZXNbTUFKT1JfQVJHXSAmJiBfc3dpdGNoZXNbTUlOT1JfQVJHXSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJQbGVhc2Ugc3BlY2lmeSBib3RoIG1ham9yIG51bWJlciBhbmQgIgorCQkJCSJtaW5vciBudW1iZXIuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKF9zd2l0Y2hlc1tUQUJMRV9BUkddICYmIF9zd2l0Y2hlc1tOT1RBQkxFX0FSR10pIHsKKwkJZnByaW50ZihzdGRlcnIsICItLXRhYmxlIGFuZCAtLW5vdGFibGUgYXJlIGluY29tcGF0aWJsZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW0FERF9OT0RFX09OX1JFU1VNRV9BUkddICYmIF9zd2l0Y2hlc1tBRERfTk9ERV9PTl9DUkVBVEVfQVJHXSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIi0tYWRkbm9kZW9ucmVzdW1lIGFuZCAtLWFkZG5vZGVvbmNyZWF0ZSBhcmUgaW5jb21wYXRpYmxlLlxuIik7CisJCXJldHVybiAwOworCX0KKworCSphcmd2cCArPSBvcHRpbmQ7CisJKmFyZ2NwIC09IG9wdGluZDsKKworCWlmICghKmFyZ2NwKQorCQlfY29tbWFuZCA9IE5VTEw7CisJZWxzZSBpZiAoIXN0cmNtcCgoKmFyZ3ZwKVswXSwgInN0YXRzIikpIHsKKwkJX2Jhc2VfY29tbWFuZCA9IERNU0VUVVBfU1RBVFNfQ01EOworCQlfYmFzZV9jb21tYW5kX3R5cGUgPSBTVEFUU19UWVBFOworCQlfY29tbWFuZCA9ICJzdGF0cyI7CisJCSgqYXJndnApKys7CisJCSgqYXJnY3ApLS07CisJfSBlbHNlIGlmIChfYmFzZV9jb21tYW5kID09IERNU1RBVFNfQ01EKSB7CisJCV9jb21tYW5kID0gInN0YXRzIjsKKwl9IGVsc2UgaWYgKCphcmdjcCkgeworCQlfY29tbWFuZCA9ICgqYXJndnApWzBdOworCQkoKmFyZ3ZwKSsrOworCQkoKmFyZ2NwKS0tOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wZXJmb3JtX2NvbW1hbmRfZm9yX2FsbF9yZXBlYXRhYmxlX2FyZ3MoQ01EX0FSR1MpCit7CisJZG8geworCQlpZiAoIWNtZC0+Zm4oY21kLCBzdWJjb21tYW5kLCBhcmdjLCBhcmd2KyssIE5VTEwsIG11bHRpcGxlX2RldmljZXMpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAoY21kLT5yZXBlYXRhYmxlX2NtZCAmJiBhcmdjLS0gPiAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9kb19yZXBvcnRfd2FpdCh2b2lkKQoreworCXJldHVybiBfZG9fdGltZXJfd2FpdCgpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldCA9IDEsIHI7CisJY29uc3QgY2hhciAqZGV2X2RpcjsKKwljb25zdCBzdHJ1Y3QgY29tbWFuZCAqY21kOworCWNvbnN0IGNoYXIgKnN1YmNvbW1hbmQgPSAiIjsKKwlpbnQgbXVsdGlwbGVfZGV2aWNlczsKKworCSh2b2lkKSBzZXRsb2NhbGUoTENfQUxMLCAiIik7CisKKwlkZXZfZGlyID0gZ2V0ZW52IChETV9ERVZfRElSX0VOVl9WQVJfTkFNRSk7CisJaWYgKGRldl9kaXIgJiYgKmRldl9kaXIpIHsKKwkJaWYgKCFkbV9zZXRfZGV2X2RpcihkZXZfZGlyKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIERNX0RFVl9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUuXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlCisJCWRldl9kaXIgPSBERUZBVUxUX0RNX0RFVl9ESVI7CisKKwlpZiAoIV9wcm9jZXNzX3N3aXRjaGVzKCZhcmdjLCAmYXJndiwgZGV2X2RpcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoX3N3aXRjaGVzW0hFTFBfQVJHXSkgeworCQlzd2l0Y2ggKF9iYXNlX2NvbW1hbmRfdHlwZSkgeworCQljYXNlIFNUQVRTX1RZUEU6CisJCQlpZiAoKGNtZCA9IF9maW5kX3N0YXRzX3N1YmNvbW1hbmQoImhlbHAiKSkpCisJCQkJZ290byBkb2l0OworCQkJZ290byB1bmtub3duOworCQlkZWZhdWx0OgorCQkJaWYgKChjbWQgPSBfZmluZF9kbXNldHVwX2NvbW1hbmQoImhlbHAiKSkpCisJCQkJZ290byBkb2l0OworCQkJZ290byB1bmtub3duOworCQl9CisJfQorCisJaWYgKF9zd2l0Y2hlc1tWRVJTSU9OX0FSR10pIHsKKwkJc3dpdGNoIChfYmFzZV9jb21tYW5kX3R5cGUpIHsKKwkJY2FzZSBTVEFUU19UWVBFOgorCQkJaWYgKChjbWQgPSBfZmluZF9zdGF0c19zdWJjb21tYW5kKCJ2ZXJzaW9uIikpKQorCQkJCWdvdG8gZG9pdDsKKwkJCWdvdG8gdW5rbm93bjsKKwkJZGVmYXVsdDoKKwkJCWlmICgoY21kID0gX2ZpbmRfZG1zZXR1cF9jb21tYW5kKCJ2ZXJzaW9uIikpKQorCQkJCWdvdG8gZG9pdDsKKwkJCWdvdG8gdW5rbm93bjsKKwkJfQorCX0KKworCWlmICghX2NvbW1hbmQpIHsKKwkJX3VzYWdlKHN0ZGVycik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKGNtZCA9IF9maW5kX2Rtc2V0dXBfY29tbWFuZChfY29tbWFuZCkpKSB7Cit1bmtub3duOgorCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY29tbWFuZFxuIik7CisJCV91c2FnZShzdGRlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXJnYyA8IGNtZC0+bWluX2FyZ3MgfHwKKwkgICAgKGNtZC0+bWF4X2FyZ3MgPj0gMCAmJiBhcmdjID4gY21kLT5tYXhfYXJncykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50c1xuIik7CisJCV91c2FnZShzdGRlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIV9zd2l0Y2hlc1tDT0xTX0FSR10gJiYgIXN0cmNtcChjbWQtPm5hbWUsICJzcGxpdG5hbWUiKSkKKwkJX3N3aXRjaGVzW0NPTFNfQVJHXSsrOworCisJaWYgKCFzdHJjbXAoY21kLT5uYW1lLCAic3RhdHMiKSkgeworCQlfc3dpdGNoZXNbQ09MU19BUkddKys7CisJCWlmICghX3N3aXRjaGVzW1VOSVRTX0FSR10pIHsKKwkJCV9zd2l0Y2hlc1tVTklUU19BUkddKys7CisJCQlfc3RyaW5nX2FyZ3NbVU5JVFNfQVJHXSA9IChjaGFyICopICJoIjsKKwkJfQorCX0KKworCWlmICghc3RyY21wKGNtZC0+bmFtZSwgIm1hbmdsZSIpKQorCQlkbV9zZXRfbmFtZV9tYW5nbGluZ19tb2RlKERNX1NUUklOR19NQU5HTElOR19OT05FKTsKKworCWlmICghX3Byb2Nlc3Nfb3B0aW9ucyhfc3RyaW5nX2FyZ3NbT1BUSU9OU19BUkddKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IHByb2Nlc3MgY29tbWFuZCBsaW5lLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIFVERVZfU1lOQ19TVVBQT1JUCisJaWYgKCFfc2V0X3VwX3VkZXZfc3VwcG9ydChkZXZfZGlyKSkKKwkJZ290b19vdXQ7CisjZW5kaWYKKworCS8qCisJICogRXh0cmFjdCBzdWJjb21tYW5kPworCSAqIGRtc2V0dXAgPGNvbW1hbmQ+IDxzdWJjb21tYW5kPiBbYXJncy4uLl0KKwkgKi8KKwlpZiAoY21kLT5oYXNfc3ViY29tbWFuZHMpIHsKKwkJc3ViY29tbWFuZCA9IGFyZ3ZbMF07CisJCWFyZ2MtLSwgYXJndisrOworCX0KKworCWlmIChfc3dpdGNoZXNbQ09MU19BUkddICYmICFfcmVwb3J0X2luaXQoY21kLCBzdWJjb21tYW5kKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoX3N3aXRjaGVzW0NPVU5UX0FSR10pCisJCV9jb3VudCA9ICgodWludDMyX3QpX2ludF9hcmdzW0NPVU5UX0FSR10pID8gOiBVSU5UMzJfTUFYOworCWVsc2UgaWYgKF9zd2l0Y2hlc1tJTlRFUlZBTF9BUkddKQorCQlfY291bnQgPSBVSU5UMzJfTUFYOworCisJaWYgKF9zd2l0Y2hlc1tVTklUU19BUkddKSB7CisJCV9kaXNwX2ZhY3RvciA9IF9mYWN0b3JfZnJvbV91bml0cyhfc3RyaW5nX2FyZ3NbVU5JVFNfQVJHXSwKKwkJCQkJCSAgJl9kaXNwX3VuaXRzKTsKKwkJaWYgKCFfZGlzcF9mYWN0b3IpIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCAtLXVuaXRzIGFyZ3VtZW50LiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBTdGFydCBpbnRlcnZhbCB0aW1lci4gKi8KKwlpZiAoX2NvdW50ID4gMSkKKwkJaWYgKCFfc3RhcnRfdGltZXIoKSkKKwkJCWdvdG9fb3V0OworCitkb2l0OgorCW11bHRpcGxlX2RldmljZXMgPSAoY21kLT5yZXBlYXRhYmxlX2NtZCAmJiBhcmdjICE9IDEgJiYKKwkJCSAgICAoYXJnYyB8fCAoIV9zd2l0Y2hlc1tVVUlEX0FSR10gJiYgIV9zd2l0Y2hlc1tNQUpPUl9BUkddKSkpOworCisJZG8geworCQlyID0gX3BlcmZvcm1fY29tbWFuZF9mb3JfYWxsX3JlcGVhdGFibGVfYXJncyhjbWQsIHN1YmNvbW1hbmQsIGFyZ2MsIGFyZ3YsIE5VTEwsIG11bHRpcGxlX2RldmljZXMpOworCQlpZiAoX3JlcG9ydCkgeworCQkJLyogb25seSBvdXRwdXQgaGVhZGluZ3MgZm9yIHJlcGVhdGluZyByZXBvcnRzICovCisJCQlpZiAoX2ludF9hcmdzW0NPVU5UX0FSR10gIT0gMSAmJiAhZG1fcmVwb3J0X2lzX2VtcHR5KF9yZXBvcnQpKQorCQkJCWRtX3JlcG9ydF9jb2x1bW5faGVhZGluZ3MoX3JlcG9ydCk7CisJCQlkbV9yZXBvcnRfb3V0cHV0KF9yZXBvcnQpOworCisJCQlpZiAoX2NvdW50ID4gMSAmJiByKSB7CisJCQkJcHJpbnRmKCJcbiIpOworCQkJCS8qIHdhaXQgZm9yIC0taW50ZXJ2YWwgYW5kIHVwZGF0ZSB0aW1lc3RhbXBzICovCisJCQkJaWYgKCFfZG9fcmVwb3J0X3dhaXQoKSkKKwkJCQkJZ290b19vdXQ7CisJCQl9CisJCX0KKworCQlpZiAoIXIpCisJCQlnb3RvX291dDsKKwl9IHdoaWxlICgtLV9jb3VudCk7CisKKwkvKiBTdWNjZXNzICovCisJcmV0ID0gMDsKKworb3V0OgorCWlmIChfcmVwb3J0KQorCQlkbV9yZXBvcnRfZnJlZShfcmVwb3J0KTsKKworCWlmIChfZHRyZWUpCisJCWRtX3RyZWVfZnJlZShfZHRyZWUpOworCisJZG1fZnJlZShfdGFibGUpOworCisJaWYgKF9pbml0aWFsX3RpbWVzdGFtcCkKKwkJZG1fdGltZXN0YW1wX2Rlc3Ryb3koX2luaXRpYWxfdGltZXN0YW1wKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9kdW1wY29uZmlnLmMgYi90b29scy9kdW1wY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4N2U2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2R1bXBjb25maWcuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IF9nZXRfdnNuKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1aW50MTZfdCAqdmVyc2lvbl9pbnQpCit7CisJY29uc3QgY2hhciAqdnNuOworCXVuc2lnbmVkIGludCBtYWpvciwgbWlub3IsIHBhdGNobGV2ZWw7CisKKwlpZiAoISh2c24gPSBhcmdfc3RyX3ZhbHVlKGNtZCwgYXR2ZXJzaW9uX0FSRywgTlVMTCkpICYmCisJICAgICEodnNuID0gYXJnX3N0cl92YWx1ZShjbWQsIHNpbmNldmVyc2lvbl9BUkcsIE5VTEwpKSkKKwkJdnNuID0gTFZNX1ZFUlNJT047CisKKwlpZiAoc3NjYW5mKHZzbiwgIiV1LiV1LiV1IiwgJm1ham9yLCAmbWlub3IsICZwYXRjaGxldmVsKSAhPSAzKSB7CisJCWxvZ19lcnJvcigiSW5jb3JyZWN0IHZlcnNpb24gZm9ybWF0LiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqdmVyc2lvbl9pbnQgPSB2c24obWFqb3IsIG1pbm9yLCBwYXRjaGxldmVsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZG9fZGVmX2NoZWNrKHN0cnVjdCBjb25maWdfZGVmX3RyZWVfc3BlYyAqc3BlYywKKwkJCSBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdCwKKwkJCSBzdHJ1Y3QgY2Z0X2NoZWNrX2hhbmRsZSAqKmNmdF9jaGVja19oYW5kbGUpCit7CisJc3RydWN0IGNmdF9jaGVja19oYW5kbGUgKmhhbmRsZTsKKworCWlmICghKGhhbmRsZSA9IGdldF9jb25maWdfdHJlZV9jaGVja19oYW5kbGUoc3BlYy0+Y21kLCBjZnQpKSkKKwkJcmV0dXJuIDA7CisKKwloYW5kbGUtPmZvcmNlX2NoZWNrID0gMTsKKwloYW5kbGUtPnN1cHByZXNzX21lc3NhZ2VzID0gMTsKKworCWlmIChzcGVjLT50eXBlID09IENGR19ERUZfVFJFRV9ESUZGKSB7CisJCWlmICghaGFuZGxlLT5jaGVja19kaWZmKQorCQkJaGFuZGxlLT5za2lwX2lmX2NoZWNrZWQgPSAwOworCQloYW5kbGUtPmNoZWNrX2RpZmYgPSAxOworCX0gZWxzZSB7CisJCWhhbmRsZS0+c2tpcF9pZl9jaGVja2VkID0gMTsKKwkJaGFuZGxlLT5jaGVja19kaWZmID0gMDsKKwl9CisKKwloYW5kbGUtPmlnbm9yZXVuc3VwcG9ydGVkID0gc3BlYy0+aWdub3JldW5zdXBwb3J0ZWQ7CisJaGFuZGxlLT5pZ25vcmVhZHZhbmNlZCA9IHNwZWMtPmlnbm9yZWFkdmFuY2VkOworCisJY29uZmlnX2RlZl9jaGVjayhoYW5kbGUpOworCSpjZnRfY2hlY2tfaGFuZGxlID0gaGFuZGxlOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX21lcmdlX2NvbmZpZ19jYXNjYWRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNmdF9jYXNjYWRlZCwKKwkJCQkgc3RydWN0IGRtX2NvbmZpZ190cmVlICoqY2Z0X21lcmdlZCkKK3sKKwlpZiAoIWNmdF9jYXNjYWRlZCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoISpjZnRfbWVyZ2VkICYmICEoKmNmdF9tZXJnZWQgPSBjb25maWdfb3BlbihDT05GSUdfTUVSR0VEX0ZJTEVTLCBOVUxMLCAwKSkpCisJCXJldHVybl8wOworCisJaWYgKCFfbWVyZ2VfY29uZmlnX2Nhc2NhZGUoY21kLCBjZnRfY2FzY2FkZWQtPmNhc2NhZGUsIGNmdF9tZXJnZWQpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiBtZXJnZV9jb25maWdfdHJlZShjbWQsICpjZnRfbWVyZ2VkLCBjZnRfY2FzY2FkZWQsIENPTkZJR19NRVJHRV9UWVBFX1JBVyk7Cit9CisKK3N0YXRpYyBpbnQgX2NvbmZpZ192YWxpZGF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQpCit7CisJc3RydWN0IGNmdF9jaGVja19oYW5kbGUgKmhhbmRsZTsKKworCWlmICghKGhhbmRsZSA9IGdldF9jb25maWdfdHJlZV9jaGVja19oYW5kbGUoY21kLCBjZnQpKSkKKwkJcmV0dXJuIDE7CisKKwloYW5kbGUtPmZvcmNlX2NoZWNrID0gMTsKKwloYW5kbGUtPnNraXBfaWZfY2hlY2tlZCA9IDE7CisJaGFuZGxlLT5zdXBwcmVzc19tZXNzYWdlcyA9IDA7CisKKwlyZXR1cm4gY29uZmlnX2RlZl9jaGVjayhoYW5kbGUpOworfQorCitpbnQgZHVtcGNvbmZpZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmZpbGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgZmlsZV9BUkcsIE5VTEwpOworCWNvbnN0IGNoYXIgKnR5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgY29uZmlndHlwZV9BUkcsIGFyZ19pc19zZXQoY21kLCBsaXN0X0FSRykgPyAibGlzdCIgOiAiY3VycmVudCIpOworCXN0cnVjdCBjb25maWdfZGVmX3RyZWVfc3BlYyB0cmVlX3NwZWMgPSB7MH07CisJc3RydWN0IGRtX2NvbmZpZ190cmVlICpjZnQgPSBOVUxMOworCXN0cnVjdCBjZnRfY2hlY2tfaGFuZGxlICpjZnRfY2hlY2tfaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSA9IE5VTEw7CisJaW50IHIgPSBFQ01EX1BST0NFU1NFRDsKKworCXRyZWVfc3BlYy5jbWQgPSBjbWQ7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNvbmZpZ3R5cGVfQVJHKSAmJiBhcmdfaXNfc2V0KGNtZCwgdmFsaWRhdGVfQVJHKSkgeworCQlsb2dfZXJyb3IoIk9ubHkgb25lIG9mIC0tdHlwZSBhbmQgLS12YWxpZGF0ZSBwZXJtaXR0ZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNvbmZpZ3R5cGVfQVJHKSAmJiBhcmdfaXNfc2V0KGNtZCwgbGlzdF9BUkcpKSB7CisJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLS10eXBlIGFuZCAtLWxpc3QgcGVybWl0dGVkLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBhdHZlcnNpb25fQVJHKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIHNpbmNldmVyc2lvbl9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIk9ubHkgb25lIG9mIC0tYXR2ZXJzaW9uIGFuZCAtLXNpbmNldmVyc2lvbiBwZXJtaXR0ZWQuIik7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKworCQlpZiAoIWFyZ19pc19zZXQoY21kLCBjb25maWd0eXBlX0FSRykgJiYgIWFyZ19pc19zZXQoY21kLCBsaXN0X0FSRykpIHsKKwkJCWxvZ19lcnJvcigiLS1hdHZlcnNpb24gcmVxdWlyZXMgLS10eXBlIG9yIC0tbGlzdCIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgc2luY2V2ZXJzaW9uX0FSRykpIHsKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgY29uZmlndHlwZV9BUkcpIHx8IHN0cmNtcCh0eXBlLCAibmV3IikpIHsKKwkJCWxvZ19lcnJvcigiLS1zaW5jZXZlcnNpb24gcmVxdWlyZXMgLS10eXBlIG5ldyIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBpZ25vcmVhZHZhbmNlZF9BUkcpKQorCQl0cmVlX3NwZWMuaWdub3JlYWR2YW5jZWQgPSAxOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBpZ25vcmV1bnN1cHBvcnRlZF9BUkcpKSB7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgc2hvd3Vuc3VwcG9ydGVkX0FSRykpIHsKKwkJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLS1pZ25vcmV1bnN1cHBvcnRlZCBhbmQgLS1zaG93dW5zdXBwb3J0ZWQgcGVybWl0dGVkLiIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJCXRyZWVfc3BlYy5pZ25vcmV1bnN1cHBvcnRlZCA9IDE7CisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgc2hvd3Vuc3VwcG9ydGVkX0FSRykpIHsKKwkJdHJlZV9zcGVjLmlnbm9yZXVuc3VwcG9ydGVkID0gMDsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiY3VycmVudCIpICYmIHN0cmNtcCh0eXBlLCAiZGlmZiIpKSB7CisJCS8qCisJCSAqIEJ5IGRlZmF1bHQgaGlkZSB1bnN1cHBvcnRlZCBzZXR0aW5ncworCQkgKiBmb3IgYWxsIGRpc3BsYXkgdHlwZXMgZXhjZXB0ICJjdXJyZW50IgorCQkgKiBhbmQgImRpZmYiLgorCQkgKi8KKwkJdHJlZV9zcGVjLmlnbm9yZXVuc3VwcG9ydGVkID0gMTsKKwl9CisKKwlpZiAoc3RyY21wKHR5cGUsICJjdXJyZW50IikgJiYgc3RyY21wKHR5cGUsICJkaWZmIikpIHsKKwkJLyoKKwkJICogQnkgZGVmYXVsdCBoaWRlIGRlcHJlY2F0ZWQgc2V0dGluZ3MKKwkJICogZm9yIGFsbCBkaXNwbGF5IHR5cGVzIGV4Y2VwdCAiY3VycmVudCIKKwkJICogYW5kICJkaWZmIiB1bmxlc3MgLS1zaG93ZGVwcmVjYXRlZCBpcyBzZXQuCisJCSAqCisJCSAqIE4uQi4gRGVwcmVjYXRlZCBzZXR0aW5ncyBhcmUgdmlzaWJsZSBpZgorCQkgKiAtLWF0dmVyc2lvbiBpcyB1c2VkIHdpdGggYSB2ZXJzaW9uIHRoYXQKKwkJICogaXMgbG93ZXIgdGhhbiB0aGUgdmVyc2lvbiBpbiB3aGljaCB0aGUKKwkJICogc2V0dGluZyB3YXMgZGVwcmVjYXRlZC4KKwkJICovCisJCWlmICghYXJnX2lzX3NldChjbWQsIHNob3dkZXByZWNhdGVkX0FSRykpCisJCQl0cmVlX3NwZWMuaWdub3JlZGVwcmVjYXRlZCA9IDE7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBpZ25vcmVsb2NhbF9BUkcpKQorCQl0cmVlX3NwZWMuaWdub3JlbG9jYWwgPSAxOworCisJaWYgKCFzdHJjbXAodHlwZSwgImN1cnJlbnQiKSB8fCAhc3RyY21wKHR5cGUsICJmdWxsIikpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBhdHZlcnNpb25fQVJHKSkgeworCQkJbG9nX2Vycm9yKCItLWF0dmVyc2lvbiBoYXMgbm8gZWZmZWN0IHdpdGggLS10eXBlICVzIiwgdHlwZSk7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKworCQlpZiAoKGFyZ19pc19zZXQoY21kLCBpZ25vcmV1bnN1cHBvcnRlZF9BUkcpIHx8CisJCSAgICBhcmdfaXNfc2V0KGNtZCwgaWdub3JlYWR2YW5jZWRfQVJHKSkgJiYKKwkJICAgICFzdHJjbXAodHlwZSwgImN1cnJlbnQiKSkgeworCQkJLyogRklYTUU6IGFsbG93IHRoZXNlIGV2ZW4gZm9yIC0tdHlwZSBjdXJyZW50ICovCisJCQlsb2dfZXJyb3IoIi0taWdub3JlYWR2YW5jZWQgYW5kIC0taWdub3JldW5zdXBwb3J0ZWQgaGFzICIKKwkJCQkgICJubyBlZmZlY3Qgd2l0aCAtLXR5cGUgY3VycmVudCIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgbWVyZ2VkY29uZmlnX0FSRykpIHsKKwkJbG9nX2Vycm9yKCItLW1lcmdlZGNvbmZpZyBoYXMgbm8gZWZmZWN0IHdpdGhvdXQgLS10eXBlIGN1cnJlbnQgb3IgLS10eXBlIGZ1bGwiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghX2dldF92c24oY21kLCAmdHJlZV9zcGVjLnZlcnNpb24pKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwkvKgorCSAqIFRoZSBwcm9maWxlIHNwZWNpZmllZCBieSAtLXByb2ZpbGUgY21kIGFyZyBpcyBsaWtlIC0tY29tbWFuZHByb2ZpbGUsCisJICogYnV0IGl0IGlzIHVzZWQganVzdCBmb3IgZHVtcGluZyB0aGUgcHJvZmlsZSBjb250ZW50IGFuZCBub3QgZm9yCisJICogYXBwbGljYXRpb24uCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBwcm9maWxlX0FSRykgJiYKKwkgICAgKCEocHJvZmlsZSA9IGFkZF9wcm9maWxlKGNtZCwgYXJnX3N0cl92YWx1ZShjbWQsIHByb2ZpbGVfQVJHLCBOVUxMKSwgQ09ORklHX1BST0ZJTEVfQ09NTUFORCkpIHx8CisJICAgICFvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3Byb2ZpbGUoY21kLCBwcm9maWxlKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gbG9hZCBwcm9maWxlICVzLiIsIGFyZ19zdHJfdmFsdWUoY21kLCBwcm9maWxlX0FSRywgTlVMTCkpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlICdjZnQnIHRvIHdvcmsgd2l0aCBiYXNlZCBvbiB3aGV0aGVyIHdlIG5lZWQgdGhlIHBsYWluCisJICogY29uZmlnIHRyZWUgb3IgbWVyZ2VkIGNvbmZpZyB0cmVlIGNhc2NhZGUgaWYgLS1tZXJnZWRjb25maWcgaXMgdXNlZC4KKwkgKi8KKwlpZiAoKGFyZ19pc19zZXQoY21kLCBtZXJnZWRjb25maWdfQVJHKSB8fCAhc3RyY21wKHR5cGUsICJmdWxsIikgfHwgIXN0cmNtcCh0eXBlLCAiZGlmZiIpKSAmJiBjbWQtPmNmdC0+Y2FzY2FkZSkgeworCQlpZiAoIV9tZXJnZV9jb25maWdfY2FzY2FkZShjbWQsIGNtZC0+Y2Z0LCAmY2Z0KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gbWVyZ2UgY29uZmlndXJhdGlvbi4iKTsKKwkJCXIgPSBFQ01EX0ZBSUxFRDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlCisJCWNmdCA9IGNtZC0+Y2Z0OworCXRyZWVfc3BlYy5jdXJyZW50X2NmdCA9IGNmdDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgdmFsaWRhdGVfQVJHKSkgeworCQlpZiAoX2NvbmZpZ192YWxpZGF0ZShjbWQsIGNmdCkpIHsKKwkJCWxvZ19wcmludCgiTFZNIGNvbmZpZ3VyYXRpb24gdmFsaWQuIik7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiTFZNIGNvbmZpZ3VyYXRpb24gaW52YWxpZC4iKTsKKwkJCXIgPSBFQ01EX0ZBSUxFRDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFzdHJjbXAodHlwZSwgImxpc3QiKSB8fCBhcmdfaXNfc2V0KGNtZCwgbGlzdF9BUkcpKSB7CisJCXRyZWVfc3BlYy50eXBlID0gQ0ZHX0RFRl9UUkVFX0xJU1Q7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgd2l0aGNvbW1lbnRzX0FSRykpIHsKKwkJCWxvZ19lcnJvcigiLS13aXRoY29tbWVudHMgaGFzIG5vIGVmZmVjdCB3aXRoIC0tdHlwZSBsaXN0Iik7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKwkJLyogbGlzdCB0eXBlIGRvZXMgbm90IHJlcXVpcmUgc3RhdHVzIGNoZWNrICovCisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsICJmdWxsIikpIHsKKwkJdHJlZV9zcGVjLnR5cGUgPSBDRkdfREVGX1RSRUVfRlVMTDsKKwkJaWYgKCFfZG9fZGVmX2NoZWNrKCZ0cmVlX3NwZWMsIGNmdCwgJmNmdF9jaGVja19oYW5kbGUpKSB7CisJCQlyID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvX291dDsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiY3VycmVudCIpKSB7CisJCXRyZWVfc3BlYy50eXBlID0gQ0ZHX0RFRl9UUkVFX0NVUlJFTlQ7CisJCWlmICghX2RvX2RlZl9jaGVjaygmdHJlZV9zcGVjLCBjZnQsICZjZnRfY2hlY2tfaGFuZGxlKSkgeworCQkJciA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAibWlzc2luZyIpKSB7CisJCXRyZWVfc3BlYy50eXBlID0gQ0ZHX0RFRl9UUkVFX01JU1NJTkc7CisJCWlmICghX2RvX2RlZl9jaGVjaygmdHJlZV9zcGVjLCBjZnQsICZjZnRfY2hlY2tfaGFuZGxlKSkgeworCQkJciA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiZGVmYXVsdCIpKSB7CisJCXRyZWVfc3BlYy50eXBlID0gQ0ZHX0RFRl9UUkVFX0RFRkFVTFQ7CisJCS8qIGRlZmF1bHQgdHlwZSBkb2VzIG5vdCByZXF1aXJlIGNoZWNrIHN0YXR1cyAqLworCX0KKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJkaWZmIikpIHsKKwkJdHJlZV9zcGVjLnR5cGUgPSBDRkdfREVGX1RSRUVfRElGRjsKKwkJaWYgKCFfZG9fZGVmX2NoZWNrKCZ0cmVlX3NwZWMsIGNmdCwgJmNmdF9jaGVja19oYW5kbGUpKSB7CisJCQlyID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvX291dDsKKwkJfQorCX0KKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJuZXciKSkgeworCQl0cmVlX3NwZWMudHlwZSA9IGFyZ19pc19zZXQoY21kLCBzaW5jZXZlcnNpb25fQVJHKSA/IENGR19ERUZfVFJFRV9ORVdfU0lOQ0UKKwkJCQkJCQkJICA6IENGR19ERUZfVFJFRV9ORVc7CisJCS8qIG5ldyB0eXBlIGRvZXMgbm90IHJlcXVpcmUgY2hlY2sgc3RhdHVzICovCisJfQorCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgInByb2ZpbGFibGUiKSkgeworCQl0cmVlX3NwZWMudHlwZSA9IENGR19ERUZfVFJFRV9QUk9GSUxBQkxFOworCQkvKiBwcm9maWxhYmxlIHR5cGUgZG9lcyBub3QgcmVxdWlyZSBjaGVjayBzdGF0dXMgKi8KKwl9CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAicHJvZmlsYWJsZS1jb21tYW5kIikpIHsKKwkJdHJlZV9zcGVjLnR5cGUgPSBDRkdfREVGX1RSRUVfUFJPRklMQUJMRV9DTUQ7CisJCS8qIHByb2ZpbGFibGUtY29tbWFuZCB0eXBlIGRvZXMgbm90IHJlcXVpcmUgY2hlY2sgc3RhdHVzICovCisJfQorCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgInByb2ZpbGFibGUtbWV0YWRhdGEiKSkgeworCQl0cmVlX3NwZWMudHlwZSA9IENGR19ERUZfVFJFRV9QUk9GSUxBQkxFX01EQTsKKwkJLyogcHJvZmlsYWJsZS1tZXRhZGF0YSAgdHlwZSBkb2VzIG5vdCByZXF1aXJlIGNoZWNrIHN0YXR1cyAqLworCX0KKwllbHNlIHsKKwkJbG9nX2Vycm9yKCJJbmNvcnJlY3QgdHlwZSBvZiBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIgorCQkJICAiRXhwZWN0ZWQgb25lIG9mOiBjdXJyZW50LCBkZWZhdWx0LCBkaWZmLCBmdWxsLCBsaXN0LCBtaXNzaW5nLCAiCisJCQkgICJuZXcsIHByb2ZpbGFibGUsIHByb2ZpbGFibGUtY29tbWFuZCwgcHJvZmlsYWJsZS1tZXRhZGF0YS4iKTsKKwkJciA9IEVJTlZBTElEX0NNRF9MSU5FOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHdpdGhzdW1tYXJ5X0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGxpc3RfQVJHKSkKKwkJdHJlZV9zcGVjLndpdGhzdW1tYXJ5ID0gMTsKKwlpZiAoYXJnX2lzX3NldChjbWQsIHdpdGhjb21tZW50c19BUkcpKQorCQl0cmVlX3NwZWMud2l0aGNvbW1lbnRzID0gMTsKKwlpZiAoYXJnX2lzX3NldChjbWQsIHVuY29uZmlndXJlZF9BUkcpKQorCQl0cmVlX3NwZWMudW5jb25maWd1cmVkID0gMTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgd2l0aHZlcnNpb25zX0FSRykpCisJCXRyZWVfc3BlYy53aXRodmVyc2lvbnMgPSAxOworCisJaWYgKGFyZ19pc19zZXQoY21kLCB3aXRoc3BhY2VzX0FSRykpCisJCXRyZWVfc3BlYy53aXRoc3BhY2VzID0gMTsKKworCWlmIChjZnRfY2hlY2tfaGFuZGxlKQorCQl0cmVlX3NwZWMuY2hlY2tfc3RhdHVzID0gY2Z0X2NoZWNrX2hhbmRsZS0+c3RhdHVzOworCisJaWYgKCh0cmVlX3NwZWMudHlwZSAhPSBDRkdfREVGX1RSRUVfQ1VSUkVOVCkgJiYKKwkgICAgKHRyZWVfc3BlYy50eXBlICE9IENGR19ERUZfVFJFRV9ESUZGKSAmJgorCSAgICAhKGNmdCA9IGNvbmZpZ19kZWZfY3JlYXRlX3RyZWUoJnRyZWVfc3BlYykpKSB7CisJCXIgPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKCFjb25maWdfd3JpdGUoY2Z0LCAmdHJlZV9zcGVjLCBmaWxlLCBhcmdjLCBhcmd2KSkgeworCQlzdGFjazsKKwkJciA9IEVDTURfRkFJTEVEOworCX0KK291dDoKKwlpZiAodHJlZV9zcGVjLmN1cnJlbnRfY2Z0ICYmICh0cmVlX3NwZWMuY3VycmVudF9jZnQgIT0gY2Z0KSAmJgorCSAgICAodHJlZV9zcGVjLmN1cnJlbnRfY2Z0ICE9IGNtZC0+Y2Z0KSkKKwkJLyoKKwkJICogVGhpcyBoYXBwZW5zIGluIGNhc2Ugb2YgQ0ZHX0RFRl9UUkVFX0ZVTEwgd2hlcmUgd2UKKwkJICogaGF2ZSBtZXJnZWQgZXhwbGljaXRseSBkZWZpbmVkIGNvbmZpZyB0cmVlcyBhbmQgYWxzbworCQkgKiB3ZSBoYXZlIHVzZWQgZGVmYXVsdCB0cmVlLgorCQkgKi8KKwkJZG1fY29uZmlnX2Rlc3Ryb3kodHJlZV9zcGVjLmN1cnJlbnRfY2Z0KTsKKworCWlmIChjZnQgJiYgKGNmdCAhPSBjbWQtPmNmdCkpCisJCWRtX2NvbmZpZ19kZXN0cm95KGNmdCk7CisJZWxzZSBpZiAocHJvZmlsZSkKKwkJcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIENPTkZJR19QUk9GSUxFX0NPTU1BTkQpOworCisJLyoKKwkgKiBUaGUgY21kLT5jZnQgKHRoZSAiY3VycmVudCIgdHJlZSkgaXMgZGVzdHJveWVkCisJICogdG9nZXRoZXIgd2l0aCBjbWQgY29udGV4dCBkZXN0cm95Li4uCisJICovCisKKwlyZXR1cm4gcjsKK30KKworaW50IGNvbmZpZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJldHVybiBkdW1wY29uZmlnKGNtZCwgYXJnYywgYXJndik7Cit9CisKK2ludCBsdm1jb25maWcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gZHVtcGNvbmZpZyhjbWQsIGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZXJyb3JzLmggYi90b29scy9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMwNDYxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZXJyb3JzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9FUlJPUlNfSAorI2RlZmluZSBfTFZNX0VSUk9SU19ICisKKyNkZWZpbmUgRUNNRF9QUk9DRVNTRUQJCTEKKyNkZWZpbmUgRU5PX1NVQ0hfQ01ECQkyCisjZGVmaW5lIEVJTlZBTElEX0NNRF9MSU5FCTMKKyNkZWZpbmUgRUNNRF9GQUlMRUQJCTUKKworLyogRklYTUUgQWxzbyByZXR1cm5lZCBieSBjbWRsaWIuICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvZm9ybWF0cy5jIGIvdG9vbHMvZm9ybWF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmNhMjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mb3JtYXRzLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitpbnQgZm9ybWF0cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWRpc3BsYXlfZm9ybWF0cyhjbWQpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZjaGFuZ2UuYyBiL3Rvb2xzL2x2Y2hhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NGNkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2Y2hhbmdlLmMKQEAgLTAsMCArMSwxMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJtZW1sb2NrLmgiCisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3Blcm1pc3Npb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwl1aW50MzJfdCBsdl9hY2Nlc3M7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCisJbHZfYWNjZXNzID0gYXJnX3VpbnRfdmFsdWUoY21kLCBwZXJtaXNzaW9uX0FSRywgMCk7CisKKwlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGx2KSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgZXh0ZXJuYWwgb3JpZ2luICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGx2X2FjY2VzcyAmIExWTV9XUklURSkgJiYgIShsdi0+c3RhdHVzICYgTFZNX1dSSVRFKSkgeworCQkvKiBSZWZyZXNoIGlmIGl0J3MgcmVhZC1vbmx5IGluIG1ldGFkYXRhIGJ1dCByZWFkLXdyaXRlIGluIGtlcm5lbCAqLworCQlpZiAobHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkgJiYgaW5mby5leGlzdHMgJiYgIWluZm8ucmVhZF9vbmx5KSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgaXMgYWxyZWFkeSByZWFkLW9ubHkuICBSZWZyZXNoaW5nIGtlcm5lbCBzdGF0ZS4iLAorCQkJCQkJZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiBsdl9yZWZyZXNoKGNtZCwgbHYpOworCQl9CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgXCIlc1wiIGlzIGFscmVhZHkgcmVhZCBvbmx5LiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgobHZfYWNjZXNzICYgTFZNX1dSSVRFKSAmJiAobHYtPnN0YXR1cyAmIExWTV9XUklURSkpIHsKKwkJLyogUmVmcmVzaCBpZiBpdCdzIHJlYWQtd3JpdGUgaW4gbWV0YWRhdGEgYnV0IHJlYWQtb25seSBpbiBrZXJuZWwgKi8KKwkJaWYgKGx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDAsIDApICYmIGluZm8uZXhpc3RzICYmIGluZm8ucmVhZF9vbmx5KSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgaXMgYWxyZWFkeSB3cml0YWJsZS4gIFJlZnJlc2hpbmcga2VybmVsIHN0YXRlLiIsCisJCQkJCQlkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIGx2X3JlZnJlc2goY21kLCBsdik7CisJCX0KKworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIGFscmVhZHkgd3JpdGFibGUuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX21pcnJvcmVkKGx2KSAmJiB2Z19pc19jbHVzdGVyZWQobHYtPnZnKSAmJgorCSAgICBsdl9pbmZvKGNtZCwgbHYsIDAsICZpbmZvLCAwLCAwKSAmJiBpbmZvLmV4aXN0cykgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgbWlycm9yICVzIHdoaWxlIGFjdGl2ZS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3QgYWxsb3dlZCB0byBjaGFuZ2UgcGVybWlzc2lvbnMgb24gUkFJRCBzdWItTFZzIGRpcmVjdGx5ICovCisJaWYgKGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpIHx8IGx2X2lzX3JhaWRfaW1hZ2UobHYpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBSQUlEICVzICVzLiIsCisJCQkgIGx2X2lzX3JhaWRfaW1hZ2UobHYpID8gImltYWdlIiA6ICJtZXRhZGF0YSBhcmVhIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEobHZfYWNjZXNzICYgTFZNX1dSSVRFKSAmJiBsdl9pc190aGluX3Bvb2wobHYpKSB7CisJCWxvZ19lcnJvcigiQ2hhbmdlIHBlcm1pc3Npb25zIG9mIHRoaW4gcG9vbCAlcyBub3QgeWV0IHN1cHBvcnRlZC4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfYWNjZXNzICYgTFZNX1dSSVRFKSB7CisJCWx2LT5zdGF0dXMgfD0gTFZNX1dSSVRFOworCQlsb2dfdmVyYm9zZSgiU2V0dGluZyBsb2dpY2FsIHZvbHVtZSAlcyByZWFkL3dyaXRlLiIsCisJCQkgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwl9IGVsc2UgeworCQlsdi0+c3RhdHVzICY9IH5MVk1fV1JJVEU7CisJCWxvZ192ZXJib3NlKCJTZXR0aW5nIGxvZ2ljYWwgdm9sdW1lICVzIHJlYWQtb25seS4iLAorCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJfQorCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3Bvb2xfdXBkYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWludCB1cGRhdGUgPSAwOworCXVuc2lnbmVkIHZhbDsKKwl0aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7CisKKwlpZiAoIWx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBpcyBub3QgYSB0aGluIHBvb2wuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBkaXNjYXJkc19BUkcpKSB7CisJCWRpc2NhcmRzID0gKHRoaW5fZGlzY2FyZHNfdCkgYXJnX3VpbnRfdmFsdWUoY21kLCBkaXNjYXJkc19BUkcsIFRISU5fRElTQ0FSRFNfSUdOT1JFKTsKKwkJaWYgKGRpc2NhcmRzICE9IGZpcnN0X3NlZyhsdiktPmRpc2NhcmRzKSB7CisJCQlpZiAoKChkaXNjYXJkcyA9PSBUSElOX0RJU0NBUkRTX0lHTk9SRSkgfHwKKwkJCSAgICAgKGZpcnN0X3NlZyhsdiktPmRpc2NhcmRzID09IFRISU5fRElTQ0FSRFNfSUdOT1JFKSkgJiYKKwkJCSAgICBwb29sX2lzX2FjdGl2ZShsdikpCisJCQkJbG9nX2Vycm9yKCJDYW5ub3QgY2hhbmdlIHN1cHBvcnQgZm9yIGRpc2NhcmRzIHdoaWxlIHBvb2wgdm9sdW1lICVzIGlzIGFjdGl2ZS4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQllbHNlIHsKKwkJCQlmaXJzdF9zZWcobHYpLT5kaXNjYXJkcyA9IGRpc2NhcmRzOworCQkJCXVwZGF0ZSsrOworCQkJfQorCQl9IGVsc2UKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgYWxyZWFkeSB1c2VzIC0tZGlzY2FyZHMgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgZ2V0X3Bvb2xfZGlzY2FyZHNfbmFtZShkaXNjYXJkcykpOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgemVyb19BUkcpKSB7CisJCXZhbCA9IGFyZ191aW50X3ZhbHVlKGNtZCwgemVyb19BUkcsIDEpOworCQlpZiAodmFsICE9IGZpcnN0X3NlZyhsdiktPnplcm9fbmV3X2Jsb2NrcykgeworCQkJZmlyc3Rfc2VnKGx2KS0+emVyb19uZXdfYmxvY2tzID0gdmFsOworCQkJdXBkYXRlKys7CisJCX0gZWxzZQorCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBhbHJlYWR5ICVzemVybyBuZXcgYmxvY2tzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdiksIHZhbCA/ICIiIDogImRvZXMgbm90ICIpOworCX0KKworCWlmICghdXBkYXRlKQorCQlyZXR1cm4gMDsKKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWRfb3JpZ2luKGx2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfbW9uaXRvcmluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdmluZm8gaW5mbzsKKworCWlmICghbHZfaW5mbyhjbWQsIGx2LCBsdl9pc190aGluX3Bvb2wobHYpID8gMSA6IDAsCisJCSAgICAgJmluZm8sIDAsIDApIHx8ICFpbmZvLmV4aXN0cykgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIG5vdCBhY3RpdmUuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZG8gbm90IG1vbml0b3IgcHZtb3ZlIGx2J3MgKi8KKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGRtZXZlbnRkX21vbml0b3JfbW9kZSgpICE9IERNRVZFTlREX01PTklUT1JfSUdOT1JFKSAmJgorCSAgICAhbW9uaXRvcl9kZXZfZm9yX2V2ZW50cyhjbWQsIGx2LCAwLCBkbWV2ZW50ZF9tb25pdG9yX21vZGUoKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX2JhY2tncm91bmRfcG9sbGluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisKKwlpZiAoIWx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDAsIDApIHx8ICFpbmZvLmV4aXN0cykgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIG5vdCBhY3RpdmUuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGJhY2tncm91bmRfcG9sbGluZygpKQorCQlsdl9zcGF3bl9iYWNrZ3JvdW5kX3BvbGxpbmcoY21kLCBsdik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfYWN0aXZhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJYWN0aXZhdGlvbl9jaGFuZ2VfdCBhY3RpdmF0ZTsKKworCWFjdGl2YXRlID0gKGFjdGl2YXRpb25fY2hhbmdlX3QpIGFyZ191aW50X3ZhbHVlKGNtZCwgYWN0aXZhdGVfQVJHLCBDSEFOR0VfQVkpOworCisJLyoKKwkgKiBXZSBjYW4gZ2V0IGhlcmUgaW4gdGhlIG9kZCBjYXNlIHdoZXJlIGFuIExWIGlzIGFscmVhZHkgYWN0aXZlIGluCisJICogYSBmb3JlaWduIFZHLCB3aGljaCBhbGxvd3MgdGhlIFZHIHRvIGJlIGFjY2Vzc2VkIGJ5IGx2Y2hhbmdlIC1hCisJICogc28gdGhlIExWIGNhbiBiZSBkZWFjdGl2YXRlZC4KKwkgKi8KKwlpZiAobHYtPnZnLT5zeXN0ZW1faWQgJiYgbHYtPnZnLT5zeXN0ZW1faWRbMF0gJiYKKwkgICAgY21kLT5zeXN0ZW1faWQgJiYgY21kLT5zeXN0ZW1faWRbMF0gJiYKKwkgICAgc3RyY21wKGx2LT52Zy0+c3lzdGVtX2lkLCBjbWQtPnN5c3RlbV9pZCkgJiYKKwkgICAgaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGUpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIExWcyBpbiBhIGZvcmVpZ24gVkcuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZfYWN0aXZhdGlvbl9za2lwKGx2LCBhY3RpdmF0ZSwgYXJnX2lzX3NldChjbWQsIGlnbm9yZWFjdGl2YXRpb25za2lwX0FSRykpKQorCQlyZXR1cm4gMTsKKworCWlmIChsdl9pc19jb3cobHYpICYmICFsdl9pc192aXJ0dWFsX29yaWdpbihvcmlnaW5fZnJvbV9jb3cobHYpKSkKKwkJbHYgPSBvcmlnaW5fZnJvbV9jb3cobHYpOworCisJaWYgKChhY3RpdmF0ZSA9PSBDSEFOR0VfQUFZKSAmJgorCSAgICAhbHZfcGFzc2VzX2F1dG9fYWN0aXZhdGlvbl9maWx0ZXIoY21kLCBsdikpCisJCXJldHVybiAxOworCisJaWYgKCFsdl9jaGFuZ2VfYWN0aXZhdGUoY21kLCBsdiwgYWN0aXZhdGUpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogRklYTUU6IGx2Y2hhbmdlIHNob3VsZCBkZWZlciBiYWNrZ3JvdW5kIHBvbGxpbmcgaW4gYSBzaW1pbGFyCisJICogCSAgd2F5IGFzIHZnY2hhbmdlIGRvZXMuIEZpcnN0IGFjdGl2YXRlIGFsbCByZWxldmFudCBMVnMKKwkgKiAJICBpbml0YXRlIGJhY2tncm91bmQgcG9sbGluZyBsYXRlciAoZm9yIGFsbCBhY3R1YWxseQorCSAqIAkgIGFjdGl2YXRlZCBMVnMpLiBTbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRlIGJhY2tncm91bmQKKwkgKiAJICBwb2xsaW5nIGZvciBwdm1vdmUgKDIgb3IgbW9yZSBsb2NrZWQgTFZzIG9uIHNpbmdsZSBwdm1vdmUKKwkgKiAJICBMVikKKwkgKi8KKwlpZiAoYmFja2dyb3VuZF9wb2xsaW5nKCkgJiYgaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGUpICYmCisJICAgIChsdl9pc19wdm1vdmUobHYpIHx8IGx2X2lzX2xvY2tlZChsdikgfHwgbHZfaXNfY29udmVydGluZyhsdikgfHwKKwkgICAgIGx2X2lzX21lcmdpbmcobHYpKSkKKwkJbHZfc3Bhd25fYmFja2dyb3VuZF9wb2xsaW5nKGNtZCwgbHYpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGV0YWNoX21ldGFkYXRhX2RldmljZXMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGRtX2xpc3QgKmxpc3QpCit7CisJdWludDMyX3QgczsKKwl1aW50MzJfdCBudW1fbWV0YV9sdnM7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCW51bV9tZXRhX2x2cyA9IHNlZ19pc19yYWlkKHNlZykgPyBzZWctPmFyZWFfY291bnQgOiAhIXNlZy0+bG9nX2x2OworCisJaWYgKCFudW1fbWV0YV9sdnMpCisJCXJldHVybl8wOworCisJaWYgKCEobHZsID0gZG1fcG9vbF9hbGxvYyhzZWctPmx2LT52Zy0+dmdtZW0sIHNpemVvZigqbHZsKSAqIG51bV9tZXRhX2x2cykpKQorCQlyZXR1cm5fMDsKKworCWlmIChzZWdfaXNfcmFpZF93aXRoX21ldGEoc2VnKSkgeworCQlmb3IgKHMgPSAwOyBzIDwgc2VnLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJCWlmICghc2VnX21ldGFsdihzZWcsIHMpKQorCQkJCXJldHVybl8wOyAvKiBUcmFwIHRoaXMgZnV0dXJlIHBvc3NpYmlsaXR5ICovCisKKwkJCWx2bFtzXS5sdiA9IHNlZ19tZXRhbHYoc2VnLCBzKTsKKwkJCWx2X3NldF92aXNpYmxlKGx2bFtzXS5sdik7CisKKwkJCWRtX2xpc3RfYWRkKGxpc3QsICZsdmxbc10ubGlzdCk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJbHZsWzBdLmx2ID0gZGV0YWNoX21pcnJvcl9sb2coc2VnKTsKKwlkbV9saXN0X2FkZChsaXN0LCAmbHZsWzBdLmxpc3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXR0YWNoX21ldGFkYXRhX2RldmljZXMoc3RydWN0IGx2X3NlZ21lbnQgKnNlZywgc3RydWN0IGRtX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWlmIChzZWdfaXNfcmFpZChzZWcpKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsIGxpc3QpCisJCQlsdl9zZXRfaGlkZGVuKGx2bC0+bHYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCBsaXN0KQorCQlicmVhazsgIC8qIGdldCBmaXJzdCBpdGVtICovCisKKwlpZiAoIWF0dGFjaF9taXJyb3JfbG9nKHNlZywgbHZsLT5sdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBsdmNoYW5nZV9yZWZyZXNoCisgKiBAY21kCisgKiBAbHYKKyAqCisgKiBTdXNwZW5kIGFuZCByZXN1bWUgYSBsb2dpY2FsIHZvbHVtZS4KKyAqLworc3RhdGljIGludCBfbHZjaGFuZ2VfcmVmcmVzaChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlsb2dfdmVyYm9zZSgiUmVmcmVzaGluZyBsb2dpY2FsIHZvbHVtZSAlcyAoaWYgYWN0aXZlKS4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJcmV0dXJuIGx2X3JlZnJlc2goY21kLCBsdik7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWN0aXZhdGVfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgaW50IGFjdGl2ZSwgaW50IGV4Y2x1c2l2ZSkKK3sKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IGx2LT52Zy0+Y21kOworCisJaWYgKCFhY3RpdmUpCisJCXJldHVybiAxOworCisJaWYgKGV4Y2x1c2l2ZSkKKwkJcmV0dXJuIGFjdGl2YXRlX2x2X2V4Y2xfbG9jYWwoY21kLCBsdik7CisKKwlyZXR1cm4gYWN0aXZhdGVfbHYoY21kLCBsdik7Cit9CisKKy8qCisgKiBsdmNoYW5nZV9yZXN5bmMKKyAqIEBjbWQKKyAqIEBsdgorICoKKyAqIEZvcmNlIGEgbWlycm9yIG9yIFJBSUQgYXJyYXkgdG8gdW5kZXJnbyBhIGNvbXBsZXRlIGluaXRpYWxpemluZyByZXN5bmMuCisgKi8KK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3Jlc3luYyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgYWN0aXZlID0gMDsKKwlpbnQgZXhjbHVzaXZlID0gMDsKKwlpbnQgbW9uaXRvcmVkOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cnVjdCBkbV9saXN0IGRldmljZV9saXN0OworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlkbV9saXN0X2luaXQoJmRldmljZV9saXN0KTsKKworCWlmIChzZWdfaXNfYW55X3JhaWQwKHNlZykgfHwKKwkgICAgKCFzZWdfaXNfbWlycm9yKHNlZykgJiYgIXNlZ19pc19yYWlkKHNlZykpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlc3luYyAlcy4gIEl0IGlzIG5vdCBSQUlENC81LzYvMTAgb3IgbWlycm9yZWQuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3B2bW92ZShsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVzeW5jIHB2bW92ZSB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2xvY2tlZChsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVzeW5jIGxvY2tlZCB2b2x1bWUgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQlpZiAoIWx2X2NoZWNrX25vdF9pbl91c2UobHYsIDEpKSB7CisJCQlsb2dfZXJyb3IoIkNhbid0IHJlc3luYyBvcGVuIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWFyZ19pc19zZXQoY21kLCB5ZXNfQVJHKSAmJgorCQkgICAgeWVzX25vX3Byb21wdCgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlYWN0aXZhdGUgIgorCQkJCSAgImxvZ2ljYWwgdm9sdW1lICVzIHRvIHJlc3luYyBpdD8gW3kvbl06ICIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpID09ICduJykgeworCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBub3QgcmVzeW5jZWQuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWFjdGl2ZSA9IDE7CisJCWlmIChsdl9pc19hY3RpdmVfZXhjbHVzaXZlX2xvY2FsbHkobHYpKQorCQkJZXhjbHVzaXZlID0gMTsKKwl9CisKKwlpZiAoc2VnX2lzX3JhaWQoc2VnKSAmJiBhY3RpdmUgJiYgIWV4Y2x1c2l2ZSkgeworCQlsb2dfZXJyb3IoIlJBSUQgbG9naWNhbCB2b2x1bWUgJXMgY2Fubm90IGJlIGFjdGl2ZSByZW1vdGVseS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBY3RpdmF0ZSBleGNsdXNpdmVseSB0byBlbnN1cmUgbm8gbm9kZXMgc3RpbGwgaGF2ZSBMViBhY3RpdmUgKi8KKwltb25pdG9yZWQgPSBkbWV2ZW50ZF9tb25pdG9yX21vZGUoKTsKKwlpZiAobW9uaXRvcmVkICE9IERNRVZFTlREX01PTklUT1JfSUdOT1JFKQorCQlpbml0X2RtZXZlbnRkX21vbml0b3IoMCk7CisKKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGVhY3RpdmF0ZSAlcyBmb3IgcmVzeW5jLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSAmJiBsdl9pc19hY3RpdmUobHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgZ2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gY2x1c3RlcmVkIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobW9uaXRvcmVkICE9IERNRVZFTlREX01PTklUT1JfSUdOT1JFKQorCQlpbml0X2RtZXZlbnRkX21vbml0b3IobW9uaXRvcmVkKTsKKwlpbml0X21pcnJvcl9pbl9zeW5jKDApOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiU3RhcnRpbmcgcmVzeW5jIG9mICVzJXMlcyVzICVzLiIsCisJCQkgKGFjdGl2ZSkgPyAiYWN0aXZlICIgOiAiIiwKKwkJCSB2Z19pc19jbHVzdGVyZWQobHYtPnZnKSA/ICJjbHVzdGVyZWQgIiA6ICIiLAorCQkJIChzZWctPmxvZ19sdikgPyAiZGlzay1sb2dnZWQgIiA6CisJCQkgc2VnX2lzX3JhaWQoc2VnKSA/ICIiIDogImNvcmUtbG9nZ2VkICIsCisJCQkgbHZzZWdfbmFtZShzZWcpLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJLyoKKwkgKiBJZiB0aGlzIG1pcnJvciBoYXMgYSBjb3JlIGxvZyAoaS5lLiAhc2VnLT5sb2dfbHYpLAorCSAqIHRoZW4gc2ltcGx5IGRlYWN0aXZhdGluZy9hY3RpdmF0aW5nIHdpbGwgY2F1c2UKKwkgKiBpdCB0byByZXNldCB0aGUgc3luYyBzdGF0dXMuICBXZSBvbmx5IG5lZWQgdG8KKwkgKiB3b3JyeSBhYm91dCBwZXJzaXN0ZW50IGxvZ3MuCisJICovCisJaWYgKCFzZWdfaXNfcmFpZChzZWcpICYmICFzZWctPmxvZ19sdikgeworCQlpZiAobHZfaXNfbm90X3N5bmNlZChsdikpIHsKKwkJCWx2LT5zdGF0dXMgJj0gfkxWX05PVFNZTkNFRDsKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIlVwZGF0aW5nIGxvZ2ljYWwgdm9sdW1lICVzIG9uIGRpc2socykuIiwKKwkJCQkJIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdXBkYXRlIG1ldGFkYXRhIG9uIGRpc2suIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpZiAoIV9yZWFjdGl2YXRlX2x2KGx2LCBhY3RpdmUsIGV4Y2x1c2l2ZSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlYWN0aXZhdGUgJXMgdG8gcmVzeW5jaHJvbml6ZSBtaXJyb3IuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiAxOworCX0KKworCS8qCisJICogTm93IHdlIGhhbmRsZSBtaXJyb3JzIHdpdGggbG9nIGRldmljZXMKKwkgKi8KKwlsdi0+c3RhdHVzICY9IH5MVl9OT1RTWU5DRUQ7CisKKwkvKiBTZXBhcmF0ZSBtaXJyb3IgbG9nIG9yIG1ldGFkYXRhIGRldmljZXMgc28gd2UgY2FuIGNsZWFyIHRoZW0gKi8KKwlpZiAoIWRldGFjaF9tZXRhZGF0YV9kZXZpY2VzKHNlZywgJmRldmljZV9saXN0KSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbGVhciAlcyAlcyBmb3IgJXMuIiwKKwkJCSAgc2VnLT5zZWd0eXBlLT5uYW1lLCBzZWdfaXNfcmFpZChzZWcpID8KKwkJCSAgIm1ldGFkYXRhIGFyZWEiIDogIm1pcnJvciBsb2ciLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBpbnRlcm1lZGlhdGUgVkcgbWV0YWRhdGEgb24gZGlzay4iKTsKKwkJaWYgKCFfcmVhY3RpdmF0ZV9sdihsdiwgYWN0aXZlLCBleGNsdXNpdmUpKQorCQkJc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vIGJhY2t1cCBmb3IgaW50ZXJtZWRpYXRlIG1ldGFkYXRhLCBzbyBqdXN0IHVubG9jayBtZW1vcnkgKi8KKwltZW1sb2NrX3VubG9jayhsdi0+dmctPmNtZCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmZGV2aWNlX2xpc3QpIHsKKwkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGNtZCwgbHZsLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFjdGl2YXRlICVzIGZvciAlcyBjbGVhcmluZy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHZsLT5sdiksIChzZWdfaXNfcmFpZChzZWcpKSA/CisJCQkJICAibWV0YWRhdGEgYXJlYSIgOiAibWlycm9yIGxvZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXdpcGVfbHYobHZsLT5sdiwgKHN0cnVjdCB3aXBlX3BhcmFtcykKKwkJCSAgICAgeyAuZG9femVybyA9IDEsIC56ZXJvX3NlY3RvcnMgPSBsdmwtPmx2LT5zaXplIH0pKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZXNldCBzeW5jIHN0YXR1cyBmb3IgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdmwtPmx2KSkKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlIGxvZyBMViBhZnRlciAiCisJCQkJCSAgIndpcGluZyBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbHZsLT5sdikpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGRlYWN0aXZhdGUgJXMgTFYgJXMgIgorCQkJCSAgImFmdGVyIHdpcGluZyBmb3IgcmVzeW5jLiIsCisJCQkJICAoc2VnX2lzX3JhaWQoc2VnKSkgPyAibWV0YWRhdGEiIDogImxvZyIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdmwtPmx2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIFdhaXQgdW50aWwgZGV2aWNlcyBhcmUgYXdheSAqLworCWlmICghc3luY19sb2NhbF9kZXZfbmFtZXMobHYtPnZnLT5jbWQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN5bmMgbG9jYWwgZGV2aWNlcyBhZnRlciB1cGRhdGluZyAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBQdXQgbWV0YWRhdGEgc3ViLUxWcyBiYWNrIGluIHBsYWNlICovCisJaWYgKCFhdHRhY2hfbWV0YWRhdGFfZGV2aWNlcyhzZWcsICZkZXZpY2VfbGlzdCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVhdHRhY2ggJXMgZGV2aWNlIGFmdGVyIGNsZWFyaW5nLiIsCisJCQkgIChzZWdfaXNfcmFpZChzZWcpKSA/ICJtZXRhZGF0YSIgOiAibG9nIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmdfd3JpdGUobHYtPnZnKSB8fCAhdmdfY29tbWl0KGx2LT52ZykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gdXBkYXRlIG1ldGFkYXRhIG9uIGRpc2sgZm9yICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX3JlYWN0aXZhdGVfbHYobHYsIGFjdGl2ZSwgZXhjbHVzaXZlKSkgeworCQliYWNrdXAobHYtPnZnKTsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVhY3RpdmF0ZSAlcyBhZnRlciByZXN5bmMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmFja3VwKGx2LT52Zyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfYWxsb2Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHdhbnRfY29udGlndW91cyA9IGFyZ19pbnRfdmFsdWUoY21kLCBjb250aWd1b3VzX0FSRywgMCk7CisJYWxsb2NfcG9saWN5X3QgYWxsb2MgPSAoYWxsb2NfcG9saWN5X3QpCisJCWFyZ191aW50X3ZhbHVlKGNtZCwgYWxsb2NfQVJHLCAod2FudF9jb250aWd1b3VzKQorCQkJICAgICAgID8gQUxMT0NfQ09OVElHVU9VUyA6IEFMTE9DX0lOSEVSSVQpOworCisJaWYgKGFsbG9jID09IGx2LT5hbGxvYykgeworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gcG9saWN5IG9mIGxvZ2ljYWwgdm9sdW1lICVzIGlzIGFscmVhZHkgJXMuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBnZXRfYWxsb2Nfc3RyaW5nKGFsbG9jKSk7CisJCXJldHVybiAwOworCX0KKworCWx2LT5hbGxvYyA9IGFsbG9jOworCisJLyogRklYTUUgSWYgY29udGlndW91cywgY2hlY2sgZXhpc3RpbmcgZXh0ZW50cyBhbHJlYWR5IGFyZSAqLworCisJbG9nX3ZlcmJvc2UoIlNldHRpbmcgY29udGlndW91cyBhbGxvY2F0aW9uIHBvbGljeSBmb3IgJXMgdG8gJXMuIiwKKwkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgZ2V0X2FsbG9jX3N0cmluZyhhbGxvYykpOworCisJbG9nX3ZlcnlfdmVyYm9zZSgiVXBkYXRpbmcgbG9naWNhbCB2b2x1bWUgJXMgb24gZGlzayhzKS4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJLyogTm8gbmVlZCB0byBzdXNwZW5kIExWIGZvciB0aGlzIGNoYW5nZSAqLworCWlmICghdmdfd3JpdGUobHYtPnZnKSB8fCAhdmdfY29tbWl0KGx2LT52ZykpCisJCXJldHVybl8wOworCisJYmFja3VwKGx2LT52Zyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfZXJyb3J3aGVuZnVsbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVuc2lnbmVkIGV3ZiA9IGFyZ19pbnRfdmFsdWUoY21kLCBlcnJvcndoZW5mdWxsX0FSRywgMCk7CisKKwlpZiAoZXdmID09IGx2X2lzX2Vycm9yX3doZW5fZnVsbChsdikpIHsKKwkJbG9nX2Vycm9yKCJFcnJvciB3aGVuIGZ1bGwgaXMgYWxyZWFkeSAlc3NldCBmb3IgJXMuIiwKKwkJCSAgKGV3ZikgPyAiIiA6ICJ1biIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChld2YpCisJCWx2LT5zdGF0dXMgfD0gTFZfRVJST1JfV0hFTl9GVUxMOworCWVsc2UKKwkJbHYtPnN0YXR1cyAmPSB+TFZfRVJST1JfV0hFTl9GVUxMOworCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3JlYWRhaGVhZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXVuc2lnbmVkIHJlYWRfYWhlYWQgPSAwOworCXVuc2lnbmVkIHBhZ2VzaXplID0gKHVuc2lnbmVkKSBsdm1fZ2V0cGFnZXNpemUoKSA+PiBTRUNUT1JfU0hJRlQ7CisKKwlyZWFkX2FoZWFkID0gYXJnX3VpbnRfdmFsdWUoY21kLCByZWFkYWhlYWRfQVJHLCAwKTsKKworCWlmIChyZWFkX2FoZWFkICE9IERNX1JFQURfQUhFQURfQVVUTyAmJgorCSAgICAobHYtPnZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfUkVTVFJJQ1RFRF9SRUFEQUhFQUQpICYmCisJICAgIChyZWFkX2FoZWFkIDwgMiB8fCByZWFkX2FoZWFkID4gMTIwKSkgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIG9ubHkgc3VwcG9ydHMgcmVhZGFoZWFkIHZhbHVlcyBiZXR3ZWVuIDIgYW5kIDEyMC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlYWRfYWhlYWQgIT0gRE1fUkVBRF9BSEVBRF9BVVRPICYmCisJICAgIHJlYWRfYWhlYWQgIT0gRE1fUkVBRF9BSEVBRF9OT05FICYmIHJlYWRfYWhlYWQgJSBwYWdlc2l6ZSkgeworCQlpZiAocmVhZF9haGVhZCA8IHBhZ2VzaXplKQorCQkJcmVhZF9haGVhZCA9IHBhZ2VzaXplOworCQllbHNlCisJCQlyZWFkX2FoZWFkID0gKHJlYWRfYWhlYWQgLyBwYWdlc2l6ZSkgKiBwYWdlc2l6ZTsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IE92ZXJyaWRpbmcgcmVhZGFoZWFkIHRvICV1IHNlY3RvcnMsIGEgbXVsdGlwbGUgIgorCQkJICAgICJvZiAldUsgcGFnZSBzaXplLiIsIHJlYWRfYWhlYWQsIHBhZ2VzaXplID4+IDEpOworCX0KKworCWlmIChsdi0+cmVhZF9haGVhZCA9PSByZWFkX2FoZWFkKSB7CisJCWlmIChyZWFkX2FoZWFkID09IERNX1JFQURfQUhFQURfQVVUTykKKwkJCWxvZ19lcnJvcigiUmVhZCBhaGVhZCBpcyBhbHJlYWR5IGF1dG8gZm9yICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIlJlYWQgYWhlYWQgaXMgYWxyZWFkeSAldSBmb3IgJXMuIiwKKwkJCQkgIHJlYWRfYWhlYWQsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWx2LT5yZWFkX2FoZWFkID0gcmVhZF9haGVhZDsKKworCWxvZ192ZXJib3NlKCJTZXR0aW5nIHJlYWQgYWhlYWQgdG8gJXUgZm9yICVzLiIsCisJCSAgICByZWFkX2FoZWFkLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3BlcnNpc3RlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwllbnVtIGFjdGl2YXRpb25fY2hhbmdlIGFjdGl2YXRlID0gQ0hBTkdFX0FOOworCisJLyogVGhlIExWIGxvY2sgaW4gbHZtbG9ja2Qgc2hvdWxkIHJlbWFpbiBhcyBpdCBpcy4gKi8KKwljbWQtPmxvY2tkX2x2X2Rpc2FibGUgPSAxOworCisJaWYgKCFnZXRfYW5kX3ZhbGlkYXRlX21ham9yX21pbm9yKGNtZCwgbHYtPnZnLT5maWQtPmZtdCwKKwkJCQkJICAmbHYtPm1ham9yLCAmbHYtPm1pbm9yKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHYtPm1pbm9yID09IC0xKSB7CisJCWlmICghKGx2LT5zdGF0dXMgJiBGSVhFRF9NSU5PUikpIHsKKwkJCWxvZ19lcnJvcigiTWlub3IgbnVtYmVyIGlzIGFscmVhZHkgbm90IHBlcnNpc3RlbnQgZm9yICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHYtPnN0YXR1cyAmPSB+RklYRURfTUlOT1I7CisJCWxvZ192ZXJib3NlKCJEaXNhYmxpbmcgcGVyc2lzdGVudCBkZXZpY2UgbnVtYmVyIGZvciAlcy4iLAorCQkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJfSBlbHNlIHsKKwkJaWYgKGx2X2lzX2FjdGl2ZShsdikpIHsKKwkJCWlmICghYXJnX2lzX3NldChjbWQsIGZvcmNlX0FSRykgJiYKKwkJCSAgICAhYXJnX2lzX3NldChjbWQsIHllc19BUkcpICYmCisJCQkgICAgeWVzX25vX3Byb21wdCgiTG9naWNhbCB2b2x1bWUgJXMgd2lsbCBiZSAiCisJCQkJCSAgImRlYWN0aXZhdGVkIHRlbXBvcmFyaWx5LiAiCisJCQkJCSAgIkNvbnRpbnVlPyBbeS9uXTogIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiJXMgZGV2aWNlIG51bWJlciBub3QgY2hhbmdlZC4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWFjdGl2YXRlID0gQ0hBTkdFX0FFWTsKKwkJCWlmICh2Z19pc19jbHVzdGVyZWQobHYtPnZnKSAmJgorCQkJICAgIGxvY2tpbmdfaXNfY2x1c3RlcmVkKCkgJiYKKwkJCSAgICBsb2NraW5nX3N1cHBvcnRzX3JlbW90ZV9xdWVyaWVzKCkgJiYKKwkJCSAgICAhbHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9sb2NhbGx5KGx2KSkgeworCQkJCS8qIFJlbGlhYmxlIHJlYWN0aXZhdGUgb25seSBsb2NhbGx5ICovCisJCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlbW90ZWx5IGFjdGl2ZSBMViAlcyBuZWVkcyAiCisJCQkJCQkJImluZGl2aWR1YWwgcmVhY3RpdmF0aW9uLiIsCisJCQkJCQkJZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlhY3RpdmF0ZSA9IENIQU5HRV9BTFk7CisJCQl9CisJCX0KKworCQkvKiBFbnN1cmluZyBMViBpcyBub3QgYWN0aXZlICovCisJCWlmICghZGVhY3RpdmF0ZV9sdihjbWQsIGx2KSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgZGVhY3RpdmF0ZSAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHYtPnN0YXR1cyB8PSBGSVhFRF9NSU5PUjsKKwkJbG9nX3ZlcmJvc2UoIlNldHRpbmcgcGVyc2lzdGVudCBkZXZpY2UgbnVtYmVyIHRvICglZCwgJWQpIGZvciAlcy4iLAorCQkJICAgIGx2LT5tYWpvciwgbHYtPm1pbm9yLCBkaXNwbGF5X2x2bmFtZShsdikpOworCX0KKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlVwZGF0aW5nIGxvZ2ljYWwgdm9sdW1lICVzIG9uIGRpc2socykuIiwKKwkJCSBkaXNwbGF5X2x2bmFtZShsdikpOworCisJaWYgKCF2Z193cml0ZShsdi0+dmcpIHx8ICF2Z19jb21taXQobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoYWN0aXZhdGUgIT0gQ0hBTkdFX0FOKSB7CisJCWxvZ192ZXJib3NlKCJSZS1hY3RpdmF0aW5nIGxvZ2ljYWwgdm9sdW1lICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWlmICghbHZfYWN0aXZlX2NoYW5nZShjbWQsIGx2LCBhY3RpdmF0ZSwgMCkpIHsKKwkJCWxvZ19lcnJvcigiJXM6IHJlYWN0aXZhdGlvbiBmYWlsZWQuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWJhY2t1cChsdi0+dmcpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwliYWNrdXAobHYtPnZnKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNoYW5nZV9jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwljYWNoZV9tb2RlX3QgbW9kZTsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqc2V0dGluZ3MgPSBOVUxMOworCXN0cnVjdCBsdl9zZWdtZW50ICpwb29sX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJaW50IHIgPSAwLCBpc19jbGVhbjsKKworCWlmIChsdl9pc19jYWNoZShsdikpCisJCXBvb2xfc2VnID0gZmlyc3Rfc2VnKHBvb2xfc2VnLT5wb29sX2x2KTsKKyAgICAgICAgZWxzZSBpZiAoIWx2X2lzX2NhY2hlX3Bvb2wobHYpKSB7CisJCWxvZ19lcnJvcigiTFYgJXMgaXMgbm90IGEgY2FjaGUgTFYuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJKHZvaWQpIGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHN1cHBvcnRlZCBvbmx5IHdpdGggY2FjaGUgb3IgY2FjaGUgcG9vbCBMVnMiLAorCQkJCQkgICAgY2FjaGVtb2RlX0FSRywKKwkJCQkJICAgIGNhY2hlcG9saWN5X0FSRywKKwkJCQkJICAgIGNhY2hlc2V0dGluZ3NfQVJHLAorCQkJCQkgICAgLTEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWdldF9jYWNoZV9wYXJhbXMoY21kLCAmbW9kZSwgJm5hbWUsICZzZXR0aW5ncykpCisJCWdvdG9fb3V0OworCisJaWYgKChtb2RlICE9IENBQ0hFX01PREVfVU5ERUZJTkVEKSAmJgorCSAgICAobW9kZSAhPSBwb29sX3NlZy0+Y2FjaGVfbW9kZSkgJiYKKwkgICAgbHZfaXNfY2FjaGUobHYpKSB7CisJCWlmICghbHZfY2FjaGVfd2FpdF9mb3JfY2xlYW4obHYsICZpc19jbGVhbikpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCFpc19jbGVhbikgeworCQkJbG9nX2Vycm9yKCJDYWNoZSAlcyBpcyBub3QgY2xlYW4sIHJlZnVzaW5nIHRvIHN3aXRjaCBjYWNoZSBtb2RlLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobW9kZSAmJiAhY2FjaGVfc2V0X2NhY2hlX21vZGUoZmlyc3Rfc2VnKGx2KSwgbW9kZSkpCisJCWdvdG9fb3V0OworCisJaWYgKChuYW1lIHx8IHNldHRpbmdzKSAmJgorCSAgICAhY2FjaGVfc2V0X3BvbGljeShmaXJzdF9zZWcobHYpLCBuYW1lLCBzZXR0aW5ncykpCisJCWdvdG9fb3V0OworCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCWdvdG9fb3V0OworCisJciA9IDE7CitvdXQ6CisJaWYgKHNldHRpbmdzKQorCQlkbV9jb25maWdfZGVzdHJveShzZXR0aW5ncyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfdGFnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgYXJnKQoreworCWlmICghY2hhbmdlX3RhZyhjbWQsIE5VTEwsIGx2LCBOVUxMLCBhcmcpKQorCQlyZXR1cm5fMDsKKworCWxvZ192ZXJ5X3ZlcmJvc2UoIlVwZGF0aW5nIGxvZ2ljYWwgdm9sdW1lICVzIG9uIGRpc2socykuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCS8qIE5vIG5lZWQgdG8gc3VzcGVuZCBMViBmb3IgdGhpcyBjaGFuZ2UgKi8KKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWJhY2t1cChsdi0+dmcpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX3dyaXRlbW9zdGx5KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHMsIHB2X2NvdW50LCBpID0gMDsKKwljaGFyICoqcHZfbmFtZXM7CisJY29uc3QgY2hhciAqdG1wX3N0cjsKKwlzaXplX3QgdG1wX3N0cl9sZW47CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmdyb3VwOworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gbHYtPnZnLT5jbWQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnJhaWRfc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCWlmICghc2VnX2lzX3JhaWQxKHJhaWRfc2VnKSkgeworCQlsb2dfZXJyb3IoIi0td3JpdGUlcyBjYW4gb25seSBiZSB1c2VkIHdpdGggJ3JhaWQxJyBzZWdtZW50IHR5cGUuIiwKKwkJCSAgYXJnX2lzX3NldChjbWQsIHdyaXRlbW9zdGx5X0FSRykgPyAibW9zdGx5IiA6ICJiZWhpbmQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCB3cml0ZWJlaGluZF9BUkcpKQorCQlyYWlkX3NlZy0+d3JpdGViZWhpbmQgPSBhcmdfdWludF92YWx1ZShjbWQsIHdyaXRlYmVoaW5kX0FSRywgMCk7CisKKwlpZiAoKHB2X2NvdW50ID0gYXJnX2NvdW50KGNtZCwgd3JpdGVtb3N0bHlfQVJHKSkpIHsKKwkJLyogd3JpdGVtb3N0bHkgY2FuIGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSAqLworCQlwdl9uYW1lcyA9IGRtX3Bvb2xfYWxsb2MobHYtPnZnLT52Z21lbSwgc2l6ZW9mKGNoYXIgKikgKiBwdl9jb3VudCk7CisJCWlmICghcHZfbmFtZXMpCisJCQlyZXR1cm5fMDsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJCWlmICghZ3JvdXBlZF9hcmdfaXNfc2V0KGdyb3VwLT5hcmdfdmFsdWVzLAorCQkJCQkJd3JpdGVtb3N0bHlfQVJHKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEodG1wX3N0ciA9IGdyb3VwZWRfYXJnX3N0cl92YWx1ZShncm91cC0+YXJnX3ZhbHVlcywKKwkJCQkJCQkgICAgICB3cml0ZW1vc3RseV9BUkcsCisJCQkJCQkJICAgICAgTlVMTCkpKQorCQkJCXJldHVybl8wOworCisJCQkvKgorCQkJICogV3JpdGVtb3N0bHkgUFYgc3BlY2lmaWNhdGlvbnMgY2FuIGJlOgorCQkJICogICA8UFY+ICAgLSBUdXJuIG9uIHdyaXRlbW9zdGx5CisJCQkgKiAgIDxQVj46dCAtIFRvZ2dsZSB3cml0ZW1vc3RseQorCQkJICogICA8UFY+Om4gLSBUdXJuIG9mZiB3cml0ZW1vc3RseQorCQkJICogICA8UFY+OnkgLSBUdXJuIG9uIHdyaXRlbW9zdGx5CisJCQkgKgorCQkJICogV2UgYWxsb2NhdGUgc3RybGVuICsgMyB0byBhZGQgb3VyIG93biAnOnt0fG58eX0nIGlmCisJCQkgKiBub3QgcHJlc2VudCBwbHVzIHRoZSB0cmFpbGluZyAnXDAnLgorCQkJICovCisJCQl0bXBfc3RyX2xlbiA9IHN0cmxlbih0bXBfc3RyKTsKKwkJCWlmICghKHB2X25hbWVzW2ldID0gZG1fcG9vbF96YWxsb2MobHYtPnZnLT52Z21lbSwgdG1wX3N0cl9sZW4gKyAzKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICgodG1wX3N0cl9sZW4gPCAzKSB8fAorCQkJICAgICh0bXBfc3RyW3RtcF9zdHJfbGVuIC0gMl0gIT0gJzonKSkKKwkJCQkvKiBEZWZhdWx0IHRvICd5JyBpZiBubyBtb2RlIHNwZWNpZmllZCAqLworCQkJCXNwcmludGYocHZfbmFtZXNbaV0sICIlczp5IiwgdG1wX3N0cik7CisJCQllbHNlCisJCQkJc3ByaW50Zihwdl9uYW1lc1tpXSwgIiVzIiwgdG1wX3N0cik7CisJCQlpKys7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcHZfY291bnQ7IGkrKykKKwkJCXB2X25hbWVzW2ldW3N0cmxlbihwdl9uYW1lc1tpXSkgLSAyXSA9ICdcMCc7CisKKwkJZm9yIChpID0gMDsgaSA8IHB2X2NvdW50OyBpKyspIHsKKwkJCWlmICghKHB2bCA9IGZpbmRfcHZfaW5fdmcobHYtPnZnLCBwdl9uYW1lc1tpXSkpKSB7CisJCQkJbG9nX2Vycm9yKCIlcyBub3QgZm91bmQgaW4gdm9sdW1lIGdyb3VwLCAlcyIsCisJCQkJCSAgcHZfbmFtZXNbaV0sIGx2LT52Zy0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWZvciAocyA9IDA7IHMgPCAoaW50KSByYWlkX3NlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIG1ldGFkYXRhIGFyZWEsCisJCQkJICogc2luY2Ugd3JpdGVtb3N0bHkgb25seSBhZmZlY3RzIHRoZSBkYXRhIGFyZWFzLgorCQkJCSAqLworCQkJCWlmIChzZWdfdHlwZShyYWlkX3NlZywgcykgPT0gQVJFQV9VTkFTU0lHTkVEKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChsdl9pc19vbl9wdihzZWdfbHYocmFpZF9zZWcsIHMpLCBwdmwtPnB2KSkgeworCQkJCQlpZiAocHZfbmFtZXNbaV1bc3RybGVuKHB2X25hbWVzW2ldKSArIDFdID09ICd5JykKKwkJCQkJCXNlZ19sdihyYWlkX3NlZywgcyktPnN0YXR1cyB8PQorCQkJCQkJCUxWX1dSSVRFTU9TVExZOworCQkJCQllbHNlIGlmIChwdl9uYW1lc1tpXVtzdHJsZW4ocHZfbmFtZXNbaV0pICsgMV0gPT0gJ24nKQorCQkJCQkJc2VnX2x2KHJhaWRfc2VnLCBzKS0+c3RhdHVzICY9CisJCQkJCQkJfkxWX1dSSVRFTU9TVExZOworCQkJCQllbHNlIGlmIChwdl9uYW1lc1tpXVtzdHJsZW4ocHZfbmFtZXNbaV0pICsgMV0gPT0gJ3QnKQorCQkJCQkJc2VnX2x2KHJhaWRfc2VnLCBzKS0+c3RhdHVzIF49CisJCQkJCQkJTFZfV1JJVEVNT1NUTFk7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybl8wOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNoYW5nZV9yZWNvdmVyeV9yYXRlKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSBsdi0+dmctPmNtZDsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqcmFpZF9zZWcgPSBmaXJzdF9zZWcobHYpOworCisJaWYgKCFzZWdfaXNfcmFpZChyYWlkX3NlZykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY2hhbmdlIHRoZSByZWNvdmVyeSByYXRlIG9mIG5vbi1SQUlEICIKKwkJCSAgImxvZ2ljYWwgdm9sdW1lICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlucmVjb3ZlcnlyYXRlX0FSRykpCisJCXJhaWRfc2VnLT5taW5fcmVjb3ZlcnlfcmF0ZSA9CisJCQlhcmdfdWludF92YWx1ZShjbWQsIG1pbnJlY292ZXJ5cmF0ZV9BUkcsIDApIC8gMjsKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1heHJlY292ZXJ5cmF0ZV9BUkcpKQorCQlyYWlkX3NlZy0+bWF4X3JlY292ZXJ5X3JhdGUgPQorCQkJYXJnX3VpbnRfdmFsdWUoY21kLCBtYXhyZWNvdmVyeXJhdGVfQVJHLCAwKSAvIDI7CisKKwlpZiAocmFpZF9zZWctPm1heF9yZWNvdmVyeV9yYXRlICYmCisJICAgIChyYWlkX3NlZy0+bWF4X3JlY292ZXJ5X3JhdGUgPCByYWlkX3NlZy0+bWluX3JlY292ZXJ5X3JhdGUpKSB7CisJCWxvZ19lcnJvcigiTWluaW11bSByZWNvdmVyeSByYXRlIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiBtYXhpbXVtLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKGx2KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjaGFuZ2VfcHJvZmlsZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNvbnN0IGNoYXIgKm9sZF9wcm9maWxlX25hbWUsICpuZXdfcHJvZmlsZV9uYW1lOworCXN0cnVjdCBwcm9maWxlICpuZXdfcHJvZmlsZTsKKworCW9sZF9wcm9maWxlX25hbWUgPSBsdi0+cHJvZmlsZSA/IGx2LT5wcm9maWxlLT5uYW1lIDogIihpbmhlcml0ZWQpIjsKKworCWlmIChhcmdfaXNfc2V0KGx2LT52Zy0+Y21kLCBkZXRhY2hwcm9maWxlX0FSRykpIHsKKwkJbmV3X3Byb2ZpbGVfbmFtZSA9ICIoaW5oZXJpdGVkKSI7CisJCWx2LT5wcm9maWxlID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAoYXJnX2lzX3NldChsdi0+dmctPmNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykpCisJCQluZXdfcHJvZmlsZV9uYW1lID0gYXJnX3N0cl92YWx1ZShsdi0+dmctPmNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRywgTlVMTCk7CisJCWVsc2UKKwkJCW5ld19wcm9maWxlX25hbWUgPSBhcmdfc3RyX3ZhbHVlKGx2LT52Zy0+Y21kLCBwcm9maWxlX0FSRywgTlVMTCk7CisJCWlmICghKG5ld19wcm9maWxlID0gYWRkX3Byb2ZpbGUobHYtPnZnLT5jbWQsIG5ld19wcm9maWxlX25hbWUsIENPTkZJR19QUk9GSUxFX01FVEFEQVRBKSkpCisJCQlyZXR1cm5fMDsKKwkJbHYtPnByb2ZpbGUgPSBuZXdfcHJvZmlsZTsKKwl9CisKKwlsb2dfdmVyYm9zZSgiQ2hhbmdpbmcgY29uZmlndXJhdGlvbiBwcm9maWxlIGZvciBMViAlczogJXMgLT4gJXMuIiwKKwkJICAgIGRpc3BsYXlfbHZuYW1lKGx2KSwgb2xkX3Byb2ZpbGVfbmFtZSwgbmV3X3Byb2ZpbGVfbmFtZSk7CisKKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWJhY2t1cChsdi0+dmcpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y2hhbmdlX2FjdGl2YXRpb25fc2tpcChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWludCBza2lwID0gYXJnX2ludF92YWx1ZShsdi0+dmctPmNtZCwgc2V0YWN0aXZhdGlvbnNraXBfQVJHLCAwKTsKKworCWx2X3NldF9hY3RpdmF0aW9uX3NraXAobHYsIDEsIHNraXApOworCisJbG9nX3ZlcmJvc2UoIkNoYW5naW5nIGFjdGl2YXRpb24gc2tpcCBmbGFnIHRvICVzIGZvciBMViAlcy4iLAorCQkgICAgZGlzcGxheV9sdm5hbWUobHYpLCBza2lwID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWJhY2t1cChsdi0+dmcpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfbHZjaGFuZ2Vfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWludCBkb2l0ID0gMCwgZG9jbWRzID0gMDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbjsKKwljaGFyIHNuYXBzX21zZ1sxMjhdOworCisJaWYgKHNpZ2ludF9jYXVnaHQoKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCEobHYtPnZnLT5zdGF0dXMgJiBMVk1fV1JJVEUpICYmCisJICAgIGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgTlVMTCwKKwkJCQkgYWxsb2NfQVJHLAorCQkJCSBjb250aWd1b3VzX0FSRywKKwkJCQkgZGlzY2FyZHNfQVJHLAorCQkJCSBtZXRhZGF0YXByb2ZpbGVfQVJHLAorCQkJCSBwZXJtaXNzaW9uX0FSRywKKwkJCQkgcGVyc2lzdGVudF9BUkcsCisJCQkJIHByb2ZpbGVfQVJHLAorCQkJCSByZWFkYWhlYWRfQVJHLAorCQkJCSB6ZXJvX0FSRywKKwkJCQkgLTEpKSB7CisJCWxvZ19lcnJvcigiT25seSAtYSBwZXJtaXR0ZWQgd2l0aCByZWFkLW9ubHkgdm9sdW1lIGdyb3VwICVzLiIsCisJCQkgIGx2LT52Zy0+bmFtZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZfaXNfb3JpZ2luKGx2KSAmJiAhbHZfaXNfdGhpbl92b2x1bWUobHYpICYmCisJICAgIGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgTlVMTCwKKwkJCQkgYWxsb2NfQVJHLAorCQkJCSBjb250aWd1b3VzX0FSRywKKwkJCQkgbWV0YWRhdGFwcm9maWxlX0FSRywKKwkJCQkgcGVybWlzc2lvbl9BUkcsCisJCQkJIHBlcnNpc3RlbnRfQVJHLAorCQkJCSBwcm9maWxlX0FSRywKKwkJCQkgcmVhZGFoZWFkX0FSRywKKwkJCQkgLTEpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgY2hhbmdlIGxvZ2ljYWwgdm9sdW1lICVzIHVuZGVyIHNuYXBzaG90LiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjaGFuZ2UgcHZtb3ZlIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSkKKwkJCWxvZ19lcnJvcigiVXNlICdwdm1vdmUgLS1hYm9ydCcgdG8gYWJhbmRvbiBhIHB2bW92ZSIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKGx2X2lzX21pcnJvcl9sb2cobHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNoYW5nZSBtaXJyb3IgbG9nIExWICVzIGRpcmVjdGx5LiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZfaXNfbWlycm9yX2ltYWdlKGx2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjaGFuZ2UgbWlycm9yIGltYWdlIExWICVzIGRpcmVjdGx5LiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKiBJZiBMViBpcyBzcGFyc2UsIGFjdGl2YXRlIG9yaWdpbiBpbnN0ZWFkICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpICYmIGx2X2lzX2NvdyhsdikgJiYKKwkgICAgbHZfaXNfdmlydHVhbF9vcmlnaW4ob3JpZ2luID0gb3JpZ2luX2Zyb21fY293KGx2KSkpCisJCWx2ID0gb3JpZ2luOworCisJaWYgKChsdl9pc190aGluX3Bvb2xfZGF0YShsdikgfHwgbHZfaXNfdGhpbl9wb29sX21ldGFkYXRhKGx2KSB8fAorCSAgICAgbHZfaXNfY2FjaGVfcG9vbF9kYXRhKGx2KSB8fCBsdl9pc19jYWNoZV9wb29sX21ldGFkYXRhKGx2KSkgJiYKKwkgICAgIWFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpICYmCisJICAgICFhcmdfaXNfc2V0KGNtZCwgcGVybWlzc2lvbl9BUkcpICYmCisJICAgICFhcmdfaXNfc2V0KGNtZCwgc2V0YWN0aXZhdGlvbnNraXBfQVJHKSkKKwkgICAgLyogUmVzdCBjYW4gYmUgY2hhbmdlZCBmb3Igc3RhY2tlZCB0aGluIHBvb2wgbWV0YS9kYXRhIHZvbHVtZXMgKi8KKwkgICAgOworCWVsc2UgaWYgKCFsdl9pc192aXNpYmxlKGx2KSAmJiAhbHZfaXNfdmlydHVhbF9vcmlnaW4obHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNoYW5nZSBpbnRlcm5hbCBMViAlcyBkaXJlY3RseS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKGx2X2lzX2NvdyhsdikgJiYgYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykpIHsKKwkJb3JpZ2luID0gb3JpZ2luX2Zyb21fY293KGx2KTsKKwkJaWYgKG9yaWdpbi0+b3JpZ2luX2NvdW50IDwgMikKKwkJCXNuYXBzX21zZ1swXSA9ICdcMCc7CisJCWVsc2UgaWYgKGRtX3NucHJpbnRmKHNuYXBzX21zZywgc2l6ZW9mKHNuYXBzX21zZyksCisJCQkJICAgICAiIGFuZCAldSBvdGhlciBzbmFwc2hvdChzKSIsCisJCQkJICAgICBvcmlnaW4tPm9yaWdpbl9jb3VudCAtIDEpIDwgMCkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcHJlcGFyZSBtZXNzYWdlLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgeWVzX0FSRykgJiYKKwkJICAgICh5ZXNfbm9fcHJvbXB0KCJDaGFuZ2Ugb2Ygc25hcHNob3QgJXMgd2lsbCBhbHNvIGNoYW5nZSBpdHMgIgorCQkJCSAgICJvcmlnaW4gJXMlcy4gUHJvY2VlZD8gW3kvbl06ICIsCisJCQkJICAgZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShvcmlnaW4pLAorCQkJCSAgIHNuYXBzX21zZykgPT0gJ24nKSkgeworCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBub3QgY2hhbmdlZC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBlcnJvcndoZW5mdWxsX0FSRykgJiYgIWx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJbG9nX2Vycm9yKCJPcHRpb24gLS1lcnJvcndoZW5mdWxsIGlzIG9ubHkgc3VwcG9ydGVkIHdpdGggdGhpbiBwb29scy4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcGVyc2lzdGVudF9BUkcpICYmIGx2X2lzX3Bvb2wobHYpKSB7CisJCWxvZ19lcnJvcigiUGVyc2lzdGVudCBtYWpvciBhbmQgbWlub3IgbnVtYmVycyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHBvb2xzLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSAmJiAhYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKSkgeworCQkvKgorCQkgKiBJZiBhIHBlcnNpc3RlbnQgbHYgbG9jayBhbHJlYWR5IGV4aXN0cyBmcm9tIGFjdGl2YXRpb24KKwkJICogKHdpdGggdGhlIG5lZWRlZCBtb2RlIG9yIGhpZ2hlciksIHRoaXMgd2lsbCBiZSBhIG5vLW9wLgorCQkgKiBPdGhlcndpc2UsIHRoZSBsdiBsb2NrIHdpbGwgYmUgdGFrZW4gYXMgbm9uLXBlcnNpc3RlbnQKKwkJICogYW5kIHJlbGVhc2VkIHdoZW4gdGhpcyBjb21tYW5kIGV4aXRzLgorCQkgKgorCQkgKiBGSVhNRTogdXNlICJzaCIgaWYgdGhlIG9wdGlvbnMgaW1wbHkgdGhhdCB0aGUgbHZjaGFuZ2UKKwkJICogb3BlcmF0aW9uIGRvZXMgbm90IG1vZGlmeSB0aGUgTFYuCisJCSAqLworCQlpZiAoIWxvY2tkX2x2KGNtZCwgbHYsICJleCIsIDApKSB7CisJCQlzdGFjazsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCX0KKworCS8qCisJICogRklYTUU6IERFRkFVTFRfQkFDS0dST1VORF9QT0xMSU5HIHNob3VsZCBiZSAidW5zcGVjaWZpZWQiLgorCSAqIElmIC0tcG9sbCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIHVzZSBpdDsgb3RoZXJ3aXNlIHBvbGxpbmcKKwkgKiBzaG91bGQgb25seSBiZSBzdGFydGVkIGlmIHRoZSBMViBpcyBub3QgYWxyZWFkeSBhY3RpdmUuIFNvOgorCSAqIDEpIGNoYW5nZSB0aGUgYWN0aXZhdGlvbiBjb2RlIHRvIHNheSBpZiB0aGUgTFYgd2FzIGFjdHVhbGx5IGFjdGl2YXRlZAorCSAqIDIpIG1ha2UgcG9sbGluZyBvZiBhbiBMViB0aWdodGx5IGNvdXBsZWQgd2l0aCBMViBhY3RpdmF0aW9uCisJICoKKwkgKiBEbyBub3QgaW5pdGlhdGUgYW55IHBvbGxpbmcgaWYgLS1zeXNpbml0IG9wdGlvbiBpcyB1c2VkLgorCSAqLworCWluaXRfYmFja2dyb3VuZF9wb2xsaW5nKGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykgPyAwIDoKKwkJCQkJCWFyZ19pbnRfdmFsdWUoY21kLCBwb2xsX0FSRywKKwkJCQkJCURFRkFVTFRfQkFDS0dST1VORF9QT0xMSU5HKSk7CisKKwkvKiBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIHBlcm1pc3Npb25fQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2VfcGVybWlzc2lvbihjbWQsIGx2KTsKKwkJZG9jbWRzKys7CisJfQorCisJLyogYWxsb2NhdGlvbiBwb2xpY3kgY2hhbmdlICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb250aWd1b3VzX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGFsbG9jX0FSRykpIHsKKwkJaWYgKCFhcmNoaXZlKGx2LT52ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCWRvaXQgKz0gX2x2Y2hhbmdlX2FsbG9jKGNtZCwgbHYpOworCQlkb2NtZHMrKzsKKwl9CisKKwkvKiBlcnJvciB3aGVuIGZ1bGwgY2hhbmdlICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBlcnJvcndoZW5mdWxsX0FSRykpIHsKKwkJaWYgKCFhcmNoaXZlKGx2LT52ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCWRvaXQgKz0gX2x2Y2hhbmdlX2Vycm9yd2hlbmZ1bGwoY21kLCBsdik7CisJCWRvY21kcysrOworCX0KKworCS8qIHJlYWQgYWhlYWQgc2VjdG9yIGNoYW5nZSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgcmVhZGFoZWFkX0FSRykpIHsKKwkJaWYgKCFhcmNoaXZlKGx2LT52ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCWRvaXQgKz0gX2x2Y2hhbmdlX3JlYWRhaGVhZChjbWQsIGx2KTsKKwkJZG9jbWRzKys7CisJfQorCisJLyogcGVyc2lzdGVudCBkZXZpY2UgbnVtYmVyIGNoYW5nZSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgcGVyc2lzdGVudF9BUkcpKSB7CisJCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQlkb2l0ICs9IF9sdmNoYW5nZV9wZXJzaXN0ZW50KGNtZCwgbHYpOworCQlkb2NtZHMrKzsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGRpc2NhcmRzX0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIHplcm9fQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2VfcG9vbF91cGRhdGUoY21kLCBsdik7CisJCWRvY21kcysrOworCX0KKworCS8qIGFkZCB0YWcgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIGFkZHRhZ19BUkcpKSB7CisJCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQlkb2l0ICs9IF9sdmNoYW5nZV90YWcoY21kLCBsdiwgYWRkdGFnX0FSRyk7CisJCWRvY21kcysrOworCX0KKworCS8qIGRlbCB0YWcgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIGRlbHRhZ19BUkcpKSB7CisJCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQlkb2l0ICs9IF9sdmNoYW5nZV90YWcoY21kLCBsdiwgZGVsdGFnX0FSRyk7CisJCWRvY21kcysrOworCX0KKworCS8qIGNoYW5nZSB3cml0ZW1vc3RseS93cml0ZWJlaGluZCAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgd3JpdGVtb3N0bHlfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgd3JpdGViZWhpbmRfQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2Vfd3JpdGVtb3N0bHkobHYpOworCQlkb2NtZHMrKzsKKwl9CisKKwkvKiBjaGFuZ2UgW21pbnxtYXhdX3JlY292ZXJ5X3JhdGUgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIG1pbnJlY292ZXJ5cmF0ZV9BUkcpIHx8CisJICAgIGFyZ19pc19zZXQoY21kLCBtYXhyZWNvdmVyeXJhdGVfQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2VfcmVjb3ZlcnlfcmF0ZShsdik7CisJCWRvY21kcysrOworCX0KKworCS8qIGNoYW5nZSBjb25maWd1cmF0aW9uIHByb2ZpbGUgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIHByb2ZpbGVfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIGRldGFjaHByb2ZpbGVfQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2VfcHJvZmlsZShsdik7CisJCWRvY21kcysrOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc2V0YWN0aXZhdGlvbnNraXBfQVJHKSkgeworCQlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJZG9pdCArPSBfbHZjaGFuZ2VfYWN0aXZhdGlvbl9za2lwKGx2KTsKKwkJZG9jbWRzKys7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBjYWNoZW1vZGVfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgY2FjaGVwb2xpY3lfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgY2FjaGVzZXR0aW5nc19BUkcpKSB7CisJCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQlkb2l0ICs9IF9sdmNoYW5nZV9jYWNoZShjbWQsIGx2KTsKKwkJZG9jbWRzKys7CisJfQorCisJaWYgKGRvaXQpCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJMb2dpY2FsIHZvbHVtZSAlcyBjaGFuZ2VkLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHJlc3luY19BUkcpICYmCisJICAgICFfbHZjaGFuZ2VfcmVzeW5jKGNtZCwgbHYpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHN5bmNhY3Rpb25fQVJHKSkgeworCQlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCQlpZiAoc2VnX2lzX2FueV9yYWlkMChzZWcpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzeW5jIHJhaWQwIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCX0KKwkJCisJCWlmICghbHZfcmFpZF9tZXNzYWdlKGx2LCBhcmdfc3RyX3ZhbHVlKGNtZCwgc3luY2FjdGlvbl9BUkcsIE5VTEwpKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwl9CisKKwkvKiBhY3RpdmF0aW9uIGNoYW5nZSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSkgeworCQlpZiAoIV9sdmNoYW5nZV9hY3RpdmF0ZShjbWQsIGx2KSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwl9IGVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCByZWZyZXNoX0FSRykpIHsKKwkJaWYgKCFfbHZjaGFuZ2VfcmVmcmVzaChjbWQsIGx2KSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwl9IGVsc2UgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIG1vbml0b3JfQVJHKSAmJgorCQkgICAgIV9sdmNoYW5nZV9tb25pdG9yaW5nKGNtZCwgbHYpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgcG9sbF9BUkcpICYmCisJCSAgICAhX2x2Y2hhbmdlX2JhY2tncm91bmRfcG9sbGluZyhjbWQsIGx2KSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoZG9pdCAhPSBkb2NtZHMpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworaW50IGx2Y2hhbmdlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyoKKwkgKiBPcHRpb25zIHRoYXQgdXBkYXRlIG1ldGFkYXRhIHNob3VsZCBiZSBsaXN0ZWQgaW4gb25lIG9mCisJICogdGhlIHR3byBsaXN0cyBiZWxvdyAoaS5lLiBvcHRpb25zIG90aGVyIHRoYW4gLWEsIC0tcmVmcmVzaCwKKwkgKiAtLW1vbml0b3Igb3IgLS1wb2xsKS4KKwkgKi8KKwlpbnQgdXBkYXRlX3BhcnRpYWxfc2FmZSA9IC8qIG9wdGlvbnMgc2FmZSB0byB1cGRhdGUgaWYgcGFydGlhbCAqLworCQlhcmdfZnJvbV9saXN0X2lzX3NldChjbWQsIE5VTEwsCisJCQkJICAgICBhZGR0YWdfQVJHLAorCQkJCSAgICAgY29udGlndW91c19BUkcsCisJCQkJICAgICBkZWx0YWdfQVJHLAorCQkJCSAgICAgZGV0YWNocHJvZmlsZV9BUkcsCisJCQkJICAgICBtZXRhZGF0YXByb2ZpbGVfQVJHLAorCQkJCSAgICAgcGVybWlzc2lvbl9BUkcsCisJCQkJICAgICBwZXJzaXN0ZW50X0FSRywKKwkJCQkgICAgIHByb2ZpbGVfQVJHLAorCQkJCSAgICAgcmVhZGFoZWFkX0FSRywKKwkJCQkgICAgIHNldGFjdGl2YXRpb25za2lwX0FSRywKKwkJCQkgICAgIC0xKTsKKwlpbnQgdXBkYXRlX3BhcnRpYWxfdW5zYWZlID0KKwkJYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCBOVUxMLAorCQkJCSAgICAgYWxsb2NfQVJHLAorCQkJCSAgICAgY2FjaGVtb2RlX0FSRywKKwkJCQkgICAgIGNhY2hlcG9saWN5X0FSRywKKwkJCQkgICAgIGNhY2hlc2V0dGluZ3NfQVJHLAorCQkJCSAgICAgZGlzY2FyZHNfQVJHLAorCQkJCSAgICAgZXJyb3J3aGVuZnVsbF9BUkcsCisJCQkJICAgICBtYXhyZWNvdmVyeXJhdGVfQVJHLAorCQkJCSAgICAgbWlucmVjb3ZlcnlyYXRlX0FSRywKKwkJCQkgICAgIHJlc3luY19BUkcsCisJCQkJICAgICBzeW5jYWN0aW9uX0FSRywKKwkJCQkgICAgIHdyaXRlYmVoaW5kX0FSRywKKwkJCQkgICAgIHdyaXRlbW9zdGx5X0FSRywKKwkJCQkgICAgIHplcm9fQVJHLAorCQkJCSAgICAgLTEpOworCWludCB1cGRhdGUgPSB1cGRhdGVfcGFydGlhbF9zYWZlIHx8IHVwZGF0ZV9wYXJ0aWFsX3Vuc2FmZTsKKworCWlmICghdXBkYXRlICYmCisJICAgICFhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSAmJiAhYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKSAmJgorCSAgICAhYXJnX2lzX3NldChjbWQsIG1vbml0b3JfQVJHKSAmJiAhYXJnX2lzX3NldChjbWQsIHBvbGxfQVJHKSkgeworCQlsb2dfZXJyb3IoIk5lZWQgMSBvciBtb3JlIG9mIC1hLCAtQywgLU0sIC1wLCAtciwgLVosICIKKwkJCSAgIi0tcmVzeW5jLCAtLXJlZnJlc2gsIC0tYWxsb2MsIC0tYWRkdGFnLCAtLWRlbHRhZywgIgorCQkJICAiLS1tb25pdG9yLCAtLXBvbGwgb3IgLS1kaXNjYXJkcyIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKChhcmdfaXNfc2V0KGNtZCwgcHJvZmlsZV9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBtZXRhZGF0YXByb2ZpbGVfQVJHKSkgJiYKKwkgICAgIGFyZ19pc19zZXQoY21kLCBkZXRhY2hwcm9maWxlX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IG9uZSBvZiAtLW1ldGFkYXRhcHJvZmlsZSBhbmQgLS1kZXRhY2hwcm9maWxlIHBlcm1pdHRlZC4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSAmJiBhcmdfaXNfc2V0KGNtZCwgcmVmcmVzaF9BUkcpKSB7CisJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLWEgYW5kIC0tcmVmcmVzaCBwZXJtaXR0ZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoKGFyZ19pc19zZXQoY21kLCBpZ25vcmVsb2NraW5nZmFpbHVyZV9BUkcpIHx8CisJICAgICBhcmdfaXNfc2V0KGNtZCwgc3lzaW5pdF9BUkcpKSAmJiB1cGRhdGUpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IC1hIHBlcm1pdHRlZCB3aXRoIC0taWdub3JlbG9ja2luZ2ZhaWx1cmUgYW5kIC0tc3lzaW5pdCIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKCF1cGRhdGUgfHwgIXVwZGF0ZV9wYXJ0aWFsX3Vuc2FmZSkKKwkJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKworCWlmICghYXJnYyAmJiAhYXJnX2lzX3NldChjbWQsIHNlbGVjdF9BUkcpKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGdpdmUgbG9naWNhbCB2b2x1bWUgcGF0aChzKSBvciB1c2UgLS1zZWxlY3QgZm9yIHNlbGVjdGlvbi4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICgoYXJnX2lzX3NldChjbWQsIG1pbm9yX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIG1ham9yX0FSRykpICYmCisJICAgICFhcmdfaXNfc2V0KGNtZCwgcGVyc2lzdGVudF9BUkcpKSB7CisJCWxvZ19lcnJvcigiLS1tYWpvciBhbmQgLS1taW5vciByZXF1aXJlIC1NeS4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlub3JfQVJHKSAmJiBhcmdjICE9IDEpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IGdpdmUgb25lIGxvZ2ljYWwgdm9sdW1lIHdoZW4gc3BlY2lmeWluZyBtaW5vci4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29udGlndW91c19BUkcpICYmIGFyZ19pc19zZXQoY21kLCBhbGxvY19BUkcpKSB7CisJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLS1hbGxvYyBhbmQgLS1jb250aWd1b3VzIHBlcm1pdHRlZC4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcG9sbF9BUkcpICYmIGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IG9uZSBvZiAtLXBvbGwgYW5kIC0tc3lzaW5pdCBwZXJtaXR0ZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwkvKgorCSAqIElmIC0tc3lzaW5pdCAtYWF5IGlzIHVzZWQgYW5kIGF0IHRoZSBzYW1lIHRpbWUgbHZtZXRhZCBpcyB1c2VkLAorCSAqIHdlIHdhbnQgdG8gcmVseSBvbiBhdXRvYWN0aXZhdGlvbiB0byB0YWtlIHBsYWNlLiBBbHNvLCB3ZQorCSAqIG5lZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgaGVyZSBhcyBsdm1ldGFkIHNlcnZpY2UgZG9lcworCSAqIG5vdCBuZWV0IHRvIGJlIHJ1bm5pbmcgYXQgdGhpcyBtb21lbnQgeWV0IC0gaXQgY291bGQgYmUKKwkgKiBqdXN0IHRvbyBlYXJseSBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uIHRpbWUuCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykgJiYgKGFyZ191aW50X3ZhbHVlKGNtZCwgYWN0aXZhdGVfQVJHLCAwKSA9PSBDSEFOR0VfQUFZKSkgeworCQlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIGlzIGFjdGl2ZSwgc2tpcHBpbmcgZGlyZWN0IGFjdGl2YXRpb24gZHVyaW5nIHN5c2luaXQuIik7CisJCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEluY2x1ZGUgZm9yZWlnbiBWR3MgdGhhdCBjb250YWluIGFjdGl2ZSBMVnMuCisJICogVGhhdCBzaG91bGRuJ3QgaGFwcGVuIGluIGdlbmVyYWwsIGJ1dCBpZiBpdCBkb2VzIGJ5IHNvbWUKKwkgKiBtaXN0YWtlLCB0aGVuIHdlIHdhbnQgdG8gYWxsb3cgdGhvc2UgTFZzIHRvIGJlIGRlYWN0aXZhdGVkLgorCSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSkKKwkJY21kLT5pbmNsdWRlX2FjdGl2ZV9mb3JlaWduX3ZncyA9IDE7CisKKwkvKgorCSAqIFRoZSBkZWZhdWx0IHZnIGxvY2sgbW9kZSBmb3IgbHZjaGFuZ2UgaXMgZXgsIGJ1dCB0aGVzZSBvcHRpb25zCisJICogYXJlIGNhc2VzIHdoZXJlIGx2Y2hhbmdlIGRvZXMgbm90IG1vZGlmeSB0aGUgdmcsIHNvIHRoZXkgY2FuIHVzZQorCSAqIHRoZSBzaCBsb2NrIG1vZGUuCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCByZWZyZXNoX0FSRykpIHsKKwkJY21kLT5sb2NrZF92Z19kZWZhdWx0X3NoID0gMTsKKwkJLyogQWxsb3cgZGVhY3RpdmF0aW5nIGlmIGxvY2tzIGZhaWwuICovCisJCWlmIChpc19jaGFuZ2VfYWN0aXZhdGluZygoYWN0aXZhdGlvbl9jaGFuZ2VfdClhcmdfdWludF92YWx1ZShjbWQsIGFjdGl2YXRlX0FSRywgQ0hBTkdFX0FZKSkpCisJCQljbWQtPmxvY2tkX3ZnX2VuZm9yY2Vfc2ggPSAxOworCX0KKworCXJldHVybiBwcm9jZXNzX2VhY2hfbHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLAorCQkJICAgICAgIHVwZGF0ZSA/IFJFQURfRk9SX1VQREFURSA6IDAsIE5VTEwsCisJCQkgICAgICAgJl9sdmNoYW5nZV9zaW5nbGUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZjb252ZXJ0LmMgYi90b29scy9sdmNvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHZjb252ZXJ0LmMKQEAgLTAsMCArMSw0NjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJwb2xsZGFlbW9uLmgiCisjaW5jbHVkZSAibHZfYWxsb2MuaCIKKyNpbmNsdWRlICJsdmNvbnZlcnRfcG9sbC5oIgorCisvKgorICogR3VpZGVsaW5lcyBmb3IgbWFwcGluZyBvcHRpb25zIHRvIG9wZXJhdGlvbnMuCisgKgorICogVGhlcmUgc2hvdWxkIGJlIGEgY2xlYXIgYW5kIHVuaXF1ZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGFuIG9wdGlvbgorICogbmFtZSBhbmQgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgKgorICogQW4gb3B0aW9uIHdpdGggYSBnaXZlbiBuYW1lIHNob3VsZCBhbHdheXMgcGVyZm9ybSB0aGUgc2FtZSBvcGVyYXRpb24uCisgKiBJZiB0aGUgc2FtZSBvcGVyYXRpb24gYXBwbGllcyB0byB0d28gdHlwZXMgb2YgTFYsIHRoZW4gdGhlIHNhbWUgb3B0aW9uCisgKiBuYW1lIGNhbiBiZSB1c2VkIHdpdGggYm90aCBMViB0eXBlcy4gIEJ1dCwgYSBnaXZlbiBvcHRpb24gbmFtZSBzaG91bGQKKyAqIG5vdCBiZSB1c2VkIHRvIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBMViB0eXBlIGl0CisgKiBpcyB1c2VkIHdpdGguCisgKgorICogLS1tZXJnZSBhbmQgLS1zcGxpdCBhcmUgZXhhbXBsZXMgd2hlcmUgYSBzaW5nbGUgb3B0aW9uIG5hbWUgaGFzIGJlZW4KKyAqIG92ZXJsb2FkZWQgd2l0aCBkaWZmZXJlbnQgb3BlcmF0aW9ucy4gIFRoZSBjYXNlIG9mIC0tc3BsaXQgaGFzIGJlZW4KKyAqIGNvcnJlY3RlZCB3aXRoIHRoZSBjbGVhciBhbmQgdW5pcXVlIHZhcmlhdGlvbnMgLS1zcGxpdGNhY2hlLAorICogLS1zcGxpdHNuYXBzaG90LCAtLXNwbGl0bWlycm9yLCB3aGljaCBzaG91bGQgYWxsb3cgLS1zcGxpdCB0byBiZQorICogZGVwcmVjYXRlZC4gIChUaGUgc2FtZSBpcyBzdGlsbCBuZWVkZWQgZm9yIC0tbWVyZ2UuKQorICovCisKK3N0cnVjdCBsdmNvbnZlcnRfcGFyYW1zIHsKKwkvKiBFeGFjdGx5IG9uZSBvZiB0aGVzZSBvcHRpb25zIGlzIGNob3NlbiAqLworCWludCBtZXJnZTsJCS8qIEVpdGhlciBtZXJnZV9zbmFwc2hvdCBvciBtZXJnZV9taXJyb3IgaXMgYWxzbyBzZXQgKi8KKwlpbnQgY2FjaGU7CisJaW50IGNvcmVsb2c7CisJaW50IG1pcnJvcmxvZzsKKwlpbnQgbWlycm9yc19zdXBwbGllZDsJLyogV2hlbiB0eXBlX3N0ciBpcyBub3Qgc2V0LCB0aGlzIG1heSBiZSBzZXQgd2l0aCBrZWVwX21pbWFnZXMgZm9yIC0tc3BsaXRtaXJyb3JzICovCisJaW50IHJlcGFpcjsKKwlpbnQgcmVwbGFjZTsKKwlpbnQgc25hcHNob3Q7CisJaW50IHNwbGl0OworCWludCBzcGxpdGNhY2hlOworCWludCBzcGxpdHNuYXBzaG90OworCWludCB0aGluOworCWludCB1bmNhY2hlOworCWNvbnN0IGNoYXIgKnR5cGVfc3RyOwkvKiBXaGVuIHRoaXMgaXMgc2V0LCBtaXJyb3JzX3N1cHBsaWVkIG1heSBvcHRpb25hbGx5IGFsc28gYmUgc2V0ICovCisJCQkJLyogSG9sZHMgd2hhdCB5b3UgYXNrZWQgZm9yIGJhc2VkIG9uIC0tdHlwZSBvciBvdGhlciBhcmd1bWVudHMsIGVsc2UgIiIgKi8KKworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CS8qIEhvbGRzIHdoYXQgc2VnbWVudCB0eXBlIHlvdSB3aWxsIGdldCAqLworCisJaW50IG1lcmdlX3NuYXBzaG90OwkvKiBtZXJnZSBpcyBhbHNvIHNldCAqLworCWludCBtZXJnZV9taXJyb3I7CS8qIG1lcmdlIGlzIGFsc28gc2V0ICovCisKKwlpbnQgdHJhY2tfY2hhbmdlczsJLyoga2VlcF9taW1hZ2VzIGlzIGFsc28gc2V0ICgtLXNwbGl0bWlycm9ycykgKi8KKworCWludCBwb29sbWV0YWRhdGFzcGFyZTsKKwlpbnQgZm9yY2U7CisJaW50IHllczsKKwlpbnQgemVybzsKKworCWNvbnN0IGNoYXIgKmx2X25hbWU7CisJY29uc3QgY2hhciAqbHZfc3BsaXRfbmFtZTsKKwljb25zdCBjaGFyICpsdl9uYW1lX2Z1bGw7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwlpbnQgd2FpdF9jb21wbGV0aW9uOworCWludCBuZWVkX3BvbGxpbmc7CisKKwlpbnQgdGhpbl9jaHVua19zaXplX2NhbGNfcG9saWN5OworCXVpbnQzMl90IGNodW5rX3NpemU7CisJdWludDMyX3QgcmVnaW9uX3NpemU7CisKKwl1aW50MzJfdCBtaXJyb3JzOworCXNpZ25fdCBtaXJyb3JzX3NpZ247CisJdWludDMyX3Qga2VlcF9taW1hZ2VzOwkvKiAtLXNwbGl0bWlycm9ycyAqLworCXVpbnQzMl90IHN0cmlwZXM7CisJdWludDMyX3Qgc3RyaXBlX3NpemU7CisJdWludDMyX3QgcmVhZF9haGVhZDsKKwljYWNoZV9tb2RlX3QgY2FjaGVfbW9kZTsgLyogY2FjaGUgKi8KKwljb25zdCBjaGFyICpwb2xpY3lfbmFtZTsgLyogY2FjaGUgKi8KKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKnBvbGljeV9zZXR0aW5nczsgLyogY2FjaGUgKi8KKworCXVuc2lnbmVkIHRhcmdldF9hdHRyOworCisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CisKKwlpbnQgcHZfY291bnQ7CisJY2hhciAqKnB2czsKKwlzdHJ1Y3QgZG1fbGlzdCAqcHZoOworCisJaW50IHJlcGxhY2VfcHZfY291bnQ7CisJY2hhciAqKnJlcGxhY2VfcHZzOworCXN0cnVjdCBkbV9saXN0ICpyZXBsYWNlX3B2aDsKKworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfdG9fcG9sbDsKKwlzdHJ1Y3QgZG1fbGlzdCBpZGxzOworCisJdWludDMyX3QgcG9vbF9tZXRhZGF0YV9leHRlbnRzOworCWludCBwYXNzZWRfYXJnczsKKwl1aW50NjRfdCBwb29sX21ldGFkYXRhX3NpemU7CisJY29uc3QgY2hhciAqb3JpZ2luX25hbWU7CisJY29uc3QgY2hhciAqcG9vbF9kYXRhX25hbWU7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2RhdGFfbHY7CisJY29uc3QgY2hhciAqcG9vbF9tZXRhZGF0YV9uYW1lOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9tZXRhZGF0YV9sdjsKKwl0aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7Cit9OworCitzdHJ1Y3QgY29udmVydF9wb2xsX2lkX2xpc3QgeworCXN0cnVjdCBkbV9saXN0IGxpc3Q7CisJc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZDsKKwl1bnNpZ25lZCBpc19tZXJnaW5nX29yaWdpbjoxOworCXVuc2lnbmVkIGlzX21lcmdpbmdfb3JpZ2luX3RoaW46MTsKK307CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF92YWxpZGF0ZV9uYW1lcyhzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJdW5zaWduZWQgaSwgajsKKwljb25zdCBjaGFyICpuYW1lc1tdID0geworCQkobHAtPmx2X25hbWUgPT0gbHAtPnBvb2xfZGF0YV9uYW1lKSA/IE5VTEwgOiBscC0+bHZfbmFtZSwgImNvbnZlcnRlZCIsCisJCWxwLT5wb29sX2RhdGFfbmFtZSwgInBvb2wiLAorCQlscC0+cG9vbF9tZXRhZGF0YV9uYW1lLCAicG9vbCBtZXRhZGF0YSIsCisJCWxwLT5vcmlnaW5fbmFtZSwgIm9yaWdpbiIsCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBETV9BUlJBWV9TSVpFKG5hbWVzKTsgaSArPSAyKQorCQlpZiAobmFtZXNbaV0pCisJCQlmb3IgKGogPSBpICsgMjsgaiA8IERNX0FSUkFZX1NJWkUobmFtZXMpOyBqICs9IDIpCisJCQkJaWYgKG5hbWVzW2pdICYmICFzdHJjbXAobmFtZXNbaV0sIG5hbWVzW2pdKSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbid0IHVzZSBzYW1lIG5hbWUgJXMgZm9yICVzIGFuZCAlcyB2b2x1bWUuIiwKKwkJCQkJCSAgbmFtZXNbaV0sIG5hbWVzW2kgKyAxXSwgbmFtZXNbaiArIDFdKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF9uYW1lX3BhcmFtcyhzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHAsCisJCQkJICBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIGludCAqcGFyZ2MsIGNoYXIgKioqcGFyZ3YpCit7CisJaWYgKGxwLT5tZXJnZSkgeworCQkvKiBGSVhNRSBNdWx0aXBsZSBhcmd1bWVudHMgdGhhdCBtaXggc25hcCBhbmQgbWlycm9yPyAqLworCQlpZiAoISpwYXJnYykgeworCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBhIGxvZ2ljYWwgdm9sdW1lIHBhdGguIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc3Ryc3RyKCgqcGFyZ3YpWzBdLCAiX3JpbWFnZV8iKSkgewkvKiBTbmFwc2hvdCAqLworCQkJaWYgKCEobHAtPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfU05BUFNIT1QpKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWxwLT5tZXJnZV9zbmFwc2hvdCA9IDE7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIE1pcnJvciAqLworCQlscC0+bWVyZ2VfbWlycm9yID0gMTsKKwl9CisKKwlpZiAoISpwYXJnYykgeworCQlpZiAobHAtPmNhY2hlKSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIG5hbWUgZm9yIGNhY2hpbmcgaXMgbWlzc2luZy4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChscC0+dGhpbikgeworCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBhIGxvZ2ljYWwgdm9sdW1lIHRvIGFjdCBhcyAiCisJCQkJICAidGhlIGV4dGVybmFsIG9yaWdpbi4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChscC0+c25hcHNob3QpIHsKKwkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgYSBsb2dpY2FsIHZvbHVtZSB0byBhY3QgYXMgIgorCQkJCSAgInRoZSBzbmFwc2hvdCBleGNlcHRpb24gc3RvcmUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobHAtPnNwbGl0KSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIGZvciBzcGxpdCBpcyBtaXNzaW5nLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxwLT5zcGxpdGNhY2hlKSB7CisJCQlsb2dfZXJyb3IoIkNhY2hlIGxvZ2ljYWwgdm9sdW1lIGZvciBzcGxpdCBpcyBtaXNzaW5nLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxwLT51bmNhY2hlKSB7CisJCQlsb2dfZXJyb3IoIkNhY2hlIGxvZ2ljYWwgdm9sdW1lIGZvciB1bmNhY2hlIGlzIG1pc3NpbmcuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWxwLT5sdl9uYW1lX2Z1bGwpIHsKKwkJCWxvZ19lcnJvcigiUGxlYXNlIHByb3ZpZGUgbG9naWNhbCB2b2x1bWUgcGF0aC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmICghbHAtPmx2X25hbWVfZnVsbCkgeworCQlscC0+bHZfbmFtZV9mdWxsID0gKCpwYXJndilbMF07CisJCSgqcGFyZ3YpKyssICgqcGFyZ2MpLS07CisJfQorCisJaWYgKCF2YWxpZGF0ZV9yZXN0cmljdGVkX2x2bmFtZV9wYXJhbShjbWQsICZscC0+dmdfbmFtZSwgJmxwLT5wb29sX21ldGFkYXRhX25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmFsaWRhdGVfcmVzdHJpY3RlZF9sdm5hbWVfcGFyYW0oY21kLCAmbHAtPnZnX25hbWUsICZscC0+cG9vbF9kYXRhX25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmFsaWRhdGVfcmVzdHJpY3RlZF9sdm5hbWVfcGFyYW0oY21kLCAmbHAtPnZnX25hbWUsICZscC0+b3JpZ2luX25hbWUpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmFsaWRhdGVfcmVzdHJpY3RlZF9sdm5hbWVfcGFyYW0oY21kLCAmbHAtPnZnX25hbWUsICZscC0+bHZfc3BsaXRfbmFtZSkpCisJCXJldHVybl8wOworCisJaWYgKCFscC0+dmdfbmFtZSAmJiAhc3RyY2hyKGxwLT5sdl9uYW1lX2Z1bGwsICcvJykpIHsKKwkJLyogQ2hlY2sgZm9yICRMVk1fVkdfTkFNRSAqLworCQlpZiAoIShscC0+dmdfbmFtZSA9IGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGEgbG9naWNhbCB2b2x1bWUgcGF0aC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCF2YWxpZGF0ZV9sdm5hbWVfcGFyYW0oY21kLCAmbHAtPnZnX25hbWUsICZscC0+bHZfbmFtZV9mdWxsKSkKKwkJcmV0dXJuXzA7CisKKwlscC0+bHZfbmFtZSA9IGxwLT5sdl9uYW1lX2Z1bGw7CisKKwlpZiAoIXZhbGlkYXRlX25hbWUobHAtPnZnX25hbWUpKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB2b2x1bWUgZ3JvdXAgbmFtZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWxwLT5tZXJnZV9taXJyb3IgJiYKKwkgICAgIWxwLT5yZXBhaXIgJiYKKwkgICAgIWxwLT5rZWVwX21pbWFnZXMgJiYKKwkgICAgIXN0cnN0cihscC0+bHZfbmFtZSwgIl90ZGF0YSIpICYmCisJICAgICFzdHJzdHIobHAtPmx2X25hbWUsICJfdG1ldGEiKSAmJgorCSAgICAhc3Ryc3RyKGxwLT5sdl9uYW1lLCAiX2NkYXRhIikgJiYKKwkgICAgIXN0cnN0cihscC0+bHZfbmFtZSwgIl9jbWV0YSIpICYmCisJICAgICFhcHBseV9sdm5hbWVfcmVzdHJpY3Rpb25zKGxwLT5sdl9uYW1lKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoKnBhcmdjKSB7CisJCWlmIChscC0+c25hcHNob3QpIHsKKwkJCWxvZ19lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIGZvciBzbmFwc2hvdHMuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobHAtPnNwbGl0c25hcHNob3QpIHsKKwkJCWxvZ19lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIHdpdGggLS1zcGxpdHNuYXBzaG90LiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxwLT5zcGxpdGNhY2hlKSB7CisJCQlsb2dfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyBwcm92aWRlZCB3aXRoIC0tc3BsaXRjYWNoZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChscC0+c3BsaXQpIHsKKwkJCWxvZ19lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIHdpdGggLS1zcGxpdC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChscC0+dW5jYWNoZSkgeworCQkJbG9nX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgcHJvdmlkZWQgd2l0aCAtLXVuY2FjaGUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobHAtPnBvb2xfZGF0YV9uYW1lICYmIGxwLT5wb29sX21ldGFkYXRhX25hbWUpIHsKKwkJCWxvZ19lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIGZvciBwb29sLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIV9sdmNvbnZlcnRfdmFsaWRhdGVfbmFtZXMobHApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKiAtcy8tLXNuYXBzaG90IGFuZCAtLXR5cGUgc25hcHNob3QgYXJlIHN5bm9ueW1zICovCitzdGF0aWMgaW50IF9zbmFwc2hvdF90eXBlX3JlcXVlc3RlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdHlwZV9zdHIpCit7CisJcmV0dXJuIChhcmdfaXNfc2V0KGNtZCwgc25hcHNob3RfQVJHKSB8fCAhc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX1NOQVBTSE9UKSk7Cit9CisKK3N0YXRpYyBpbnQgX3JhaWQwX3R5cGVfcmVxdWVzdGVkKGNvbnN0IGNoYXIgKnR5cGVfc3RyKQoreworCXJldHVybiAoIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9SQUlEMCkgfHwgIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9SQUlEMF9NRVRBKSk7Cit9CisKKy8qIG1pcnJvci9yYWlkKiAoMSwxMCw0LDUsNiBhbmQgdGhlaXIgdmFyaWFudHMpIHJlc2hhcGUgKi8KK3N0YXRpYyBpbnQgX21pcnJvcl9vcl9yYWlkX3R5cGVfcmVxdWVzdGVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp0eXBlX3N0cikKK3sKKwlyZXR1cm4gKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykgfHwgIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9NSVJST1IpIHx8CisJCSghc3RybmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9SQUlELCA0KSAmJiAhX3JhaWQwX3R5cGVfcmVxdWVzdGVkKHR5cGVfc3RyKSkpOworfQorCitzdGF0aWMgaW50IF9saW5lYXJfdHlwZV9yZXF1ZXN0ZWQoY29uc3QgY2hhciAqdHlwZV9zdHIpCit7CisJcmV0dXJuICghc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpOworfQorCitzdGF0aWMgaW50IF9zdHJpcGVkX3R5cGVfcmVxdWVzdGVkKGNvbnN0IGNoYXIgKnR5cGVfc3RyKQoreworCXJldHVybiAoIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSB8fCBfbGluZWFyX3R5cGVfcmVxdWVzdGVkKHR5cGVfc3RyKSk7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX2NvbnZlcnNpb25fdHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdHlwZV9zdHIpCit7CisJaWYgKCF0eXBlX3N0ciB8fCAhKnR5cGVfc3RyKQorCQlyZXR1cm4gMTsKKworCWlmICghc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX01JUlJPUikpIHsKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgbWlycm9yc19BUkcpKSB7CisJCQlsb2dfZXJyb3IoIkNvbnZlcnNpb25zIHRvIC0tdHlwZSBtaXJyb3IgcmVxdWlyZSAtbS8tLW1pcnJvcnMiKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKworCS8qIEZJWE1FOiBDaGVjayB0aGluLXBvb2wgYW5kIHRoaW4gbW9yZSB0aG9yb3VnaGx5ISAqLworCWlmICghc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX1NOQVBTSE9UKSB8fCBfc3RyaXBlZF90eXBlX3JlcXVlc3RlZCh0eXBlX3N0cikgfHwKKwkgICAgIXN0cm5jbXAodHlwZV9zdHIsIFNFR19UWVBFX05BTUVfUkFJRCwgNCkgfHwKKwkgICAgIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9DQUNIRV9QT09MKSB8fCAhc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKSB8fAorCSAgICAhc3RyY21wKHR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX1RISU5fUE9PTCkgfHwgIXN0cmNtcCh0eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9USElOKSkKKwkJcmV0dXJuIDE7CisKKwlsb2dfZXJyb3IoIkNvbnZlcnNpb24gdXNpbmcgLS10eXBlICVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgdHlwZV9zdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9yZWFkX3Bvb2xfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgKnBhcmdjLCBjaGFyICoqKnBhcmd2LAorCQkJICAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJaW50IGNhY2hlcG9vbCA9IDA7CisJaW50IHRoaW5wb29sID0gMDsKKworCWlmICgobHAtPnBvb2xfZGF0YV9uYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIGNhY2hlcG9vbF9BUkcsIE5VTEwpKSkgeworCQlpZiAobHAtPnR5cGVfc3RyWzBdICYmCisJCSAgICBzdHJjbXAobHAtPnR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKSAmJgorCQkgICAgc3RyY21wKGxwLT50eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9DQUNIRV9QT09MKSkgeworCQkJbG9nX2Vycm9yKCItLWNhY2hlcG9vbCBhcmd1bWVudCBpcyBvbmx5IHZhbGlkIHdpdGggIgorCQkJCSAgInRoZSBjYWNoZSBvciBjYWNoZS1wb29sIHNlZ21lbnQgdHlwZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhY2hlcG9vbCA9IDE7CisJCWxwLT50eXBlX3N0ciA9IFNFR19UWVBFX05BTUVfQ0FDSEVfUE9PTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobHAtPnR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX0NBQ0hFX1BPT0wpKQorCQljYWNoZXBvb2wgPSAxOworCWVsc2UgaWYgKChscC0+cG9vbF9kYXRhX25hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdGhpbnBvb2xfQVJHLCBOVUxMKSkpIHsKKwkJaWYgKGxwLT50eXBlX3N0clswXSAmJgorCQkgICAgc3RyY21wKGxwLT50eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9USElOKSAmJgorCQkgICAgc3RyY21wKGxwLT50eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9USElOX1BPT0wpKSB7CisJCQlsb2dfZXJyb3IoIi0tdGhpbnBvb2wgYXJndW1lbnQgaXMgb25seSB2YWxpZCB3aXRoICIKKwkJCQkgICJ0aGUgdGhpbiBvciB0aGluLXBvb2wgc2VnbWVudCB0eXBlLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdGhpbnBvb2wgPSAxOworCQlscC0+dHlwZV9zdHIgPSBTRUdfVFlQRV9OQU1FX1RISU5fUE9PTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobHAtPnR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX1RISU5fUE9PTCkpCisJCXRoaW5wb29sID0gMTsKKworCWlmIChscC0+Y2FjaGUgJiYgIWNhY2hlcG9vbCkgeworCQlsb2dfZXJyb3IoIi0tY2FjaGUgcmVxdWlyZXMgLS1jYWNoZXBvb2wuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgobHAtPmNhY2hlIHx8IGNhY2hlcG9vbCkgJiYKKwkgICAgIWdldF9jYWNoZV9wYXJhbXMoY21kLCAmbHAtPmNhY2hlX21vZGUsICZscC0+cG9saWN5X25hbWUsICZscC0+cG9saWN5X3NldHRpbmdzKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBjYWNoZSBwb2xpY3kgYW5kL29yIHNldHRpbmdzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGhpbnBvb2wpIHsKKwkJbHAtPmRpc2NhcmRzID0gKHRoaW5fZGlzY2FyZHNfdCkgYXJnX3VpbnRfdmFsdWUoY21kLCBkaXNjYXJkc19BUkcsIFRISU5fRElTQ0FSRFNfUEFTU0RPV04pOworCQlscC0+b3JpZ2luX25hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgb3JpZ2lubmFtZV9BUkcsIE5VTEwpOworCX0gZWxzZSB7CisJCWlmIChhcmdfZnJvbV9saXN0X2lzX3NldChjbWQsICJpcyB2YWxpZCBvbmx5IHdpdGggdGhpbiBwb29scyIsCisJCQkJCSBkaXNjYXJkc19BUkcsIG9yaWdpbm5hbWVfQVJHLCB0aGlucG9vbF9BUkcsCisJCQkJCSAtMSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKGxwLT50aGluKSB7CisJCQlsb2dfZXJyb3IoIi0tdGhpbiByZXF1aXJlcyAtLXRoaW5wb29sLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAodGhpbnBvb2wgfHwgY2FjaGVwb29sKSB7CisJCWlmIChhcmdfZnJvbV9saXN0X2lzX3NldChjbWQsICJpcyBpbnZhbGlkIHdpdGggcG9vbHMiLAorCQkJCQkgbWVyZ2VfQVJHLCBtaXJyb3JzX0FSRywgcmVwYWlyX0FSRywgc25hcHNob3RfQVJHLAorCQkJCQkgc3BsaXRtaXJyb3JzX0FSRywgc3BsaXRzbmFwc2hvdF9BUkcsIC0xKSkKKwkJCXJldHVybl8wOworCisJCWlmICghKGxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBscC0+dHlwZV9zdHIpKSkKKwkJCXJldHVybl8wOworCisJCWlmICghZ2V0X3Bvb2xfcGFyYW1zKGNtZCwgbHAtPnNlZ3R5cGUsICZscC0+cGFzc2VkX2FyZ3MsCisJCQkJICAgICAmbHAtPnBvb2xfbWV0YWRhdGFfc2l6ZSwKKwkJCQkgICAgICZscC0+cG9vbG1ldGFkYXRhc3BhcmUsCisJCQkJICAgICAmbHAtPmNodW5rX3NpemUsICZscC0+ZGlzY2FyZHMsCisJCQkJICAgICAmbHAtPnplcm8pKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKChscC0+cG9vbF9tZXRhZGF0YV9uYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIHBvb2xtZXRhZGF0YV9BUkcsIE5VTEwpKSAmJgorCQkgICAgYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgaW52YWxpZCB3aXRoIC0tcG9vbG1ldGFkYXRhIiwKKwkJCQkJIHN0cmlwZXNpemVfQVJHLCBzdHJpcGVzX2xvbmdfQVJHLAorCQkJCQkgcmVhZGFoZWFkX0FSRywgLTEpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFscC0+cG9vbF9kYXRhX25hbWUpIHsKKwkJCWlmICghKnBhcmdjKSB7CisJCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSB0aGUgcG9vbCBkYXRhIExWLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHAtPnBvb2xfZGF0YV9uYW1lID0gKCpwYXJndilbMF07CisJCQkoKnBhcmd2KSsrLCAoKnBhcmdjKS0tOworCQl9CisKKwkJaWYgKCFscC0+dGhpbiAmJiAhbHAtPmNhY2hlKQorCQkJbHAtPmx2X25hbWVfZnVsbCA9IGxwLT5wb29sX2RhdGFfbmFtZTsKKworCQkvKiBIbW0gX3JlYWRfYWN0aXZhdGlvbl9wYXJhbXMgKi8KKwkJbHAtPnJlYWRfYWhlYWQgPSBhcmdfdWludF92YWx1ZShjbWQsIHJlYWRhaGVhZF9BUkcsCisJCQkJCQljbWQtPmRlZmF1bHRfc2V0dGluZ3MucmVhZF9haGVhZCk7CisKKwl9IGVsc2UgaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHZhbGlkIG9ubHkgd2l0aCBwb29scyIsCisJCQkJCXBvb2xtZXRhZGF0YXNpemVfQVJHLCBwb29sbWV0YWRhdGFzcGFyZV9BUkcsCisJCQkJCXplcm9fQVJHLAorCQkJCQktMSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlYWRfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQlzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqdG1wX3N0cjsKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmdyb3VwOworCWludCByZWdpb25fc2l6ZTsKKwlpbnQgcGFnZXNpemUgPSBsdm1fZ2V0cGFnZXNpemUoKTsKKworCWxwLT50eXBlX3N0ciA9IGFyZ19zdHJfdmFsdWUoY21kLCB0eXBlX0FSRywgIiIpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCB0eXBlX0FSRykgJiYgIV9jaGVja19jb252ZXJzaW9uX3R5cGUoY21kLCBscC0+dHlwZV9zdHIpKQorCQlyZXR1cm5fMDsKKworCS8qIElmIC0tcmVwYWlyLCBjaGVjayBmb3IgaW5jb21wYXRpYmxlIGFyZ3MuICovCisJaWYgKGFyZ19pc19zZXQoY21kLCByZXBhaXJfQVJHKSkgeworCQlpZiAoYXJnX291dHNpZGVfbGlzdF9pc19zZXQoY21kLCAiY2Fubm90IGJlIHVzZWQgd2l0aCAtLXJlcGFpciIsCisJCQkJCSAgICByZXBhaXJfQVJHLAorCQkJCQkgICAgYWxsb2NfQVJHLCB1c2Vwb2xpY2llc19BUkcsCisJCQkJCSAgICBzdHJpcGVzX2xvbmdfQVJHLCBzdHJpcGVzaXplX0FSRywKKwkJCQkJICAgIGZvcmNlX0FSRywgbm91ZGV2c3luY19BUkcsIHRlc3RfQVJHLAorCQkJCQkgICAgLTEpKQorCQkJcmV0dXJuXzA7CisJCWxwLT5yZXBhaXIgPSAxOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlycm9ybG9nX0FSRykpCisJCWxwLT5taXJyb3Jsb2cgPSAxOworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29yZWxvZ19BUkcpKQorCQlscC0+Y29yZWxvZyA9IDE7CisKKwlpZiAobHAtPm1pcnJvcmxvZyAmJiBscC0+Y29yZWxvZykgeworCQlsb2dfZXJyb3IoIi0tbWlycm9ybG9nIGFuZCAtLWNvcmVsb2cgYXJlIGluY29tcGF0aWJsZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBzcGxpdF9BUkcpKSB7CisJCWlmIChhcmdfb3V0c2lkZV9saXN0X2lzX3NldChjbWQsICJjYW5ub3QgYmUgdXNlZCB3aXRoIC0tc3BsaXQiLAorCQkJCQkgICAgc3BsaXRfQVJHLAorCQkJCQkgICAgbmFtZV9BUkcsCisJCQkJCSAgICBmb3JjZV9BUkcsIG5vdWRldnN5bmNfQVJHLCB0ZXN0X0FSRywKKwkJCQkJICAgIC0xKSkKKwkJCXJldHVybl8wOworCQlscC0+c3BsaXQgPSAxOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRjYWNoZV9BUkcpKSB7CisJCWlmIChhcmdfb3V0c2lkZV9saXN0X2lzX3NldChjbWQsICJjYW5ub3QgYmUgdXNlZCB3aXRoIC0tc3BsaXRjYWNoZSIsCisJCQkJCSAgICBzcGxpdGNhY2hlX0FSRywKKwkJCQkJICAgIGZvcmNlX0FSRywgbm91ZGV2c3luY19BUkcsIHRlc3RfQVJHLAorCQkJCQkgICAgLTEpKQorCQkJcmV0dXJuXzA7CisJCWxwLT5zcGxpdGNhY2hlID0gMTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHNwbGl0c25hcHNob3RfQVJHKSkgeworCQlpZiAoYXJnX291dHNpZGVfbGlzdF9pc19zZXQoY21kLCAiY2Fubm90IGJlIHVzZWQgd2l0aCAtLXNwbGl0c25hcHNob3QiLAorCQkJCQkgICAgc3BsaXRzbmFwc2hvdF9BUkcsCisJCQkJCSAgICBmb3JjZV9BUkcsIG5vdWRldnN5bmNfQVJHLCB0ZXN0X0FSRywKKwkJCQkJICAgIC0xKSkKKwkJCXJldHVybl8wOworCQlscC0+c3BsaXRzbmFwc2hvdCA9IDE7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCB1bmNhY2hlX0FSRykpIHsKKwkJaWYgKGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNtZCwgImNhbm5vdCBiZSB1c2VkIHdpdGggLS11bmNhY2hlIiwKKwkJCQkJICAgIHVuY2FjaGVfQVJHLAorCQkJCQkgICAgZm9yY2VfQVJHLCBub3VkZXZzeW5jX0FSRywgdGVzdF9BUkcsCisJCQkJCSAgICAtMSkpCisJCQlyZXR1cm5fMDsKKwkJbHAtPnVuY2FjaGUgPSAxOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY2FjaGVfQVJHKSkKKwkJbHAtPmNhY2hlID0gMTsKKworCWlmICghc3RyY21wKGxwLT50eXBlX3N0ciwgU0VHX1RZUEVfTkFNRV9DQUNIRSkpCisJCWxwLT5jYWNoZSA9IDE7CisJZWxzZSBpZiAobHAtPmNhY2hlKSB7CisJCWlmIChscC0+dHlwZV9zdHJbMF0pIHsKKwkJCWxvZ19lcnJvcigiLS1jYWNoZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAtLXR5cGUgJXMiLCBscC0+dHlwZV9zdHIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHAtPnR5cGVfc3RyID0gU0VHX1RZUEVfTkFNRV9DQUNIRTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHRoaW5fQVJHKSkKKwkJbHAtPnRoaW4gPSAxOworCisJaWYgKCFzdHJjbXAobHAtPnR5cGVfc3RyLCBTRUdfVFlQRV9OQU1FX1RISU4pKQorCQlscC0+dGhpbiA9IDE7CisJZWxzZSBpZiAobHAtPnRoaW4pIHsKKwkJaWYgKGxwLT50eXBlX3N0clswXSkgeworCQkJbG9nX2Vycm9yKCItLXRoaW4gaXMgaW5jb21wYXRpYmxlIHdpdGggLS10eXBlICVzIiwgbHAtPnR5cGVfc3RyKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxwLT50eXBlX3N0ciA9IFNFR19UWVBFX05BTUVfVEhJTjsKKwl9CisKKwkvKiBNYXkgc2V0IGxwLT5zZWd0eXBlICovCisJaWYgKCFfcmVhZF9wb29sX3BhcmFtcyhjbWQsICZhcmdjLCAmYXJndiwgbHApKQorCQlyZXR1cm5fMDsKKworCWlmICghYXJnX2lzX3NldChjbWQsIGJhY2tncm91bmRfQVJHKSkKKwkJbHAtPndhaXRfY29tcGxldGlvbiA9IDE7CisKKwlpZiAoX3NuYXBzaG90X3R5cGVfcmVxdWVzdGVkKGNtZCwgbHAtPnR5cGVfc3RyKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIG1lcmdlX0FSRykpIHsKKwkJCWxvZ19lcnJvcigiLS1zbmFwc2hvdCBhbmQgLS1tZXJnZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlscC0+c25hcHNob3QgPSAxOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgdHJhY2tjaGFuZ2VzX0FSRykpCisJCWxwLT50cmFja19jaGFuZ2VzID0gMTsKKworCWlmIChscC0+c3BsaXQpIHsKKwkJbHAtPmx2X3NwbGl0X25hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgbmFtZV9BUkcsIE5VTEwpOworCisJLyoKKwkgKiBUaGUgJy0tc3BsaXRtaXJyb3JzIG4nIGFyZ3VtZW50IGlzIGVxdWl2YWxlbnQgdG8gJy0tbWlycm9ycyAtbicKKwkgKiAobm90ZSB0aGUgbWludXMgc2lnbiksIGV4Y2VwdCB0aGF0IGl0IHNpZ25pZmllcyB0aGUgYWRkaXRpb25hbAorCSAqIGludGVudCB0byBrZWVwIHRoZSBtaW1hZ2UgdGhhdCBpcyBkZXRhY2hlZCwgcmF0aGVyIHRoYW4KKwkgKiBkaXNjYXJkaW5nIGl0LgorCSAqLworCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHNwbGl0bWlycm9yc19BUkcpKSB7CisJCWlmIChfbWlycm9yX29yX3JhaWRfdHlwZV9yZXF1ZXN0ZWQoY21kLCBscC0+dHlwZV9zdHIpKSB7CisJCQlsb2dfZXJyb3IoIi0tbWlycm9ycy8tLXR5cGUgbWlycm9yLy0tdHlwZSByYWlkKiBhbmQgLS1zcGxpdG1pcnJvcnMgYXJlICIKKwkJCQkgICJtdXR1YWxseSBleGNsdXNpdmUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghYXJnX2lzX3NldChjbWQsIG5hbWVfQVJHKSAmJiAhbHAtPnRyYWNrX2NoYW5nZXMpIHsKKwkJCWxvZ19lcnJvcigiUGxlYXNlIG5hbWUgdGhlIG5ldyBsb2dpY2FsIHZvbHVtZSB1c2luZyAnLS1uYW1lJyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlscC0+bHZfc3BsaXRfbmFtZSA9IGFyZ19zdHJfdmFsdWUoY21kLCBuYW1lX0FSRywgTlVMTCk7CisJCWxwLT5rZWVwX21pbWFnZXMgPSAxOworCQlscC0+bWlycm9ycyA9IGFyZ191aW50X3ZhbHVlKGNtZCwgc3BsaXRtaXJyb3JzX0FSRywgMCk7CisJCWxwLT5taXJyb3JzX3NpZ24gPSBTSUdOX01JTlVTOworCX0gZWxzZSB7CisJCWlmIChscC0+dHJhY2tfY2hhbmdlcykgeworCQkJbG9nX2Vycm9yKCItLXRyYWNrY2hhbmdlcyBpcyBvbmx5IHZhbGlkIHdpdGggLS1zcGxpdG1pcnJvcnMuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoYXJnX2lzX3NldChjbWQsIG5hbWVfQVJHKSkgeworCQkJbG9nX2Vycm9yKCJUaGUgJ25hbWUnIGFyZ3VtZW50IGlzIG9ubHkgdmFsaWQgd2l0aCAtLXNwbGl0bWlycm9ycyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1lcmdlX0FSRykpCisJCWxwLT5tZXJnZSA9IDE7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHJlcGxhY2VfQVJHKSkKKwkJbHAtPnJlcGxhY2UgPSAxOworCisJLyogSWYgbm8gb3RoZXIgY2FzZSB3YXMgaWRlbnRpZmllZCwgdGhlbiB1c2Ugb2YgLS1zdHJpcGVzIG1lYW5zIC0tdHlwZSBzdHJpcGVkICovCisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgdHlwZV9BUkcpICYmICEqbHAtPnR5cGVfc3RyICYmICFscC0+bWVyZ2UgJiYgIWxwLT5zcGxpdHNuYXBzaG90ICYmCisJICAgICFscC0+c3BsaXRjYWNoZSAmJiAhbHAtPnNwbGl0ICYmICFscC0+c25hcHNob3QgJiYgIWxwLT51bmNhY2hlICYmICFscC0+Y2FjaGUgJiYgIWxwLT50aGluICYmCisJICAgICFscC0+cmVwbGFjZSAmJiAhbHAtPnJlcGFpciAmJiAhbHAtPm1pcnJvcmxvZyAmJiAhbHAtPmNvcmVsb2cgJiYKKwkgICAgKGFyZ19pc19zZXQoY21kLCBzdHJpcGVzX2xvbmdfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgc3RyaXBlc2l6ZV9BUkcpKSkKKwkJbHAtPnR5cGVfc3RyID0gU0VHX1RZUEVfTkFNRV9TVFJJUEVEOworCisJaWYgKChfc25hcHNob3RfdHlwZV9yZXF1ZXN0ZWQoY21kLCBscC0+dHlwZV9zdHIpIHx8IGxwLT5tZXJnZSkgJiYKKwkgICAgKGxwLT5taXJyb3Jsb2cgfHwgX21pcnJvcl9vcl9yYWlkX3R5cGVfcmVxdWVzdGVkKGNtZCwgbHAtPnR5cGVfc3RyKSB8fAorCSAgICAgbHAtPnJlcGFpciB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbnBvb2xfQVJHKSB8fCBfcmFpZDBfdHlwZV9yZXF1ZXN0ZWQobHAtPnR5cGVfc3RyKSB8fAorCSAgICAgX3N0cmlwZWRfdHlwZV9yZXF1ZXN0ZWQobHAtPnR5cGVfc3RyKSkpIHsKKwkJbG9nX2Vycm9yKCItLXNuYXBzaG90Ly0tdHlwZSBzbmFwc2hvdCBvciAtLW1lcmdlIGFyZ3VtZW50ICIKKwkJCSAgImNhbm5vdCBiZSBtaXhlZCB3aXRoIC0tbWlycm9ycy8tLXR5cGUgbWlycm9yLy0tdHlwZSByYWlkKi8tLXN0cmlwZXMvLS10eXBlIHN0cmlwZWQvLS10eXBlIGxpbmVhciwgIgorCQkJICAiLS1taXJyb3Jsb2csIC0tcmVwYWlyIG9yIC0tdGhpbnBvb2wuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoYXJnX2lzX3NldChjbWQsIHN0cmlwZXNfbG9uZ19BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBzdHJpcGVzaXplX0FSRykpICYmCisJICAgICEoX21pcnJvcl9vcl9yYWlkX3R5cGVfcmVxdWVzdGVkKGNtZCwgbHAtPnR5cGVfc3RyKSB8fCBfc3RyaXBlZF90eXBlX3JlcXVlc3RlZChscC0+dHlwZV9zdHIpIHx8CisJICAgICAgX3JhaWQwX3R5cGVfcmVxdWVzdGVkKGxwLT50eXBlX3N0cikgfHwgbHAtPnJlcGFpciB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbnBvb2xfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCItLXN0cmlwZXMgb3IgLS1zdHJpcGVzaXplIGFyZ3VtZW50IGlzIG9ubHkgdmFsaWQgIgorCQkJICAid2l0aCAtLW1pcnJvcnMvLS10eXBlIG1pcnJvci8tLXR5cGUgcmFpZCovLS10eXBlIHN0cmlwZWQvLS10eXBlIGxpbmVhciwgLS1yZXBhaXIgYW5kIC0tdGhpbnBvb2wiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykpIHsKKwkJLyoKKwkJICogLS1zcGxpdG1pcnJvcnMgaXMgdGhlIG1lY2hhbmlzbSBmb3IgZGV0YWNoaW5nIGFuZCBrZWVwaW5nIGEgbWltYWdlCisJCSAqLworCQlscC0+bWlycm9yc19zdXBwbGllZCA9IDE7CisJCWxwLT5taXJyb3JzID0gYXJnX3VpbnRfdmFsdWUoY21kLCBtaXJyb3JzX0FSRywgMCk7CisJCWxwLT5taXJyb3JzX3NpZ24gPSBhcmdfc2lnbl92YWx1ZShjbWQsIG1pcnJvcnNfQVJHLCBTSUdOX05PTkUpOworCX0KKworCWxwLT5hbGxvYyA9IChhbGxvY19wb2xpY3lfdCkgYXJnX3VpbnRfdmFsdWUoY21kLCBhbGxvY19BUkcsIEFMTE9DX0lOSEVSSVQpOworCisJLyoKKwkgKiBGaW5hbCBjaGVja2luZyBvZiBlYWNoIGNhc2U6CisJICogICBscC0+bWVyZ2UKKwkgKiAgIGxwLT5zcGxpdHNuYXBzaG90CisJICogICBscC0+c3BsaXRjYWNoZQorCSAqICAgbHAtPnNwbGl0CisJICogICBscC0+dW5jYWNoZQorCSAqICAgbHAtPmNhY2hlCisJICogICBscC0+dGhpbgorCSAqICAgbHAtPnNuYXBzaG90CisJICogICBscC0+cmVwbGFjZQorCSAqICAgLS10eXBlIG1pcnJvcnxyYWlkICBscC0+cmVwYWlyIGxwLT5taXJyb3Jsb2cgbHAtPmNvcmVsb2cKKwkgKiAgIC0tdHlwZSByYWlkMHxzdHJpcGVkCisJICovCisJaWYgKGxwLT5tZXJnZSkgewkvKiBTbmFwc2hvdCBvciBtaXJyb3IgbWVyZ2UgKi8KKwkJaWYgKGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNtZCwgImNhbm5vdCBiZSB1c2VkIHdpdGggLS1tZXJnZSIsCisJCQkJCSAgICBtZXJnZV9BUkcsCisJCQkJCSAgICBiYWNrZ3JvdW5kX0FSRywgaW50ZXJ2YWxfQVJHLAorCQkJCQkgICAgZm9yY2VfQVJHLCBub3VkZXZzeW5jX0FSRywgdGVzdF9BUkcsCisJCQkJCSAgICAtMSkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKGxwLT5zcGxpdHNuYXBzaG90KQkvKiBEZXN0cm95IHNuYXBzaG90IHJldGFpbmluZyBjb3cgYXMgc2VwYXJhdGUgTFYgKi8KKwkJOworCWVsc2UgaWYgKGxwLT5zcGxpdGNhY2hlKQorCQk7CisJZWxzZSBpZiAobHAtPnNwbGl0KQorCQk7CisJZWxzZSBpZiAobHAtPnVuY2FjaGUpCisJCTsKKwllbHNlIGlmIChscC0+Y2FjaGUpCisJCTsKKwllbHNlIGlmIChscC0+dGhpbikKKwkJOworCWVsc2UgaWYgKGxwLT5rZWVwX21pbWFnZXMpCS8qIC0tc3BsaXRtaXJyb3JzICovCisJCTsKKwllbHNlIGlmIChscC0+c25hcHNob3QpIHsJLyogU25hcHNob3QgY3JlYXRpb24gZnJvbSBwcmUtZXhpc3RpbmcgY293ICovCisJCWlmICghYXJnYykgeworCQkJbG9nX2Vycm9yKCJQbGVhc2UgcHJvdmlkZSBsb2dpY2FsIHZvbHVtZSBwYXRoIGZvciBzbmFwc2hvdCBvcmlnaW4uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlscC0+b3JpZ2luX25hbWUgPSBhcmd2WzBdOworCQlhcmd2KyssIGFyZ2MtLTsKKworCQlpZiAoYXJnX2lzX3NldChjbWQsIHJlZ2lvbnNpemVfQVJHKSkgeworCQkJbG9nX2Vycm9yKCItLXJlZ2lvbnNpemUgaXMgb25seSBhdmFpbGFibGUgd2l0aCBtaXJyb3JzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgc3RyaXBlc2l6ZV9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBzdHJpcGVzX2xvbmdfQVJHKSkgeworCQkJbG9nX2Vycm9yKCItLXN0cmlwZXMgYW5kIC0tc3RyaXBlc2l6ZSBhcmUgb25seSBhdmFpbGFibGUgd2l0aCBzdHJpcGVkIG1pcnJvcnMiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBjaHVua3NpemVfQVJHKSAmJgorCQkgICAgKGFyZ19zaWduX3ZhbHVlKGNtZCwgY2h1bmtzaXplX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSkgeworCQkJbG9nX2Vycm9yKCJOZWdhdGl2ZSBjaHVuayBzaXplIGlzIGludmFsaWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwLT5jaHVua19zaXplID0gYXJnX3VpbnRfdmFsdWUoY21kLCBjaHVua3NpemVfQVJHLCA4KTsKKwkJaWYgKGxwLT5jaHVua19zaXplIDwgOCB8fCBscC0+Y2h1bmtfc2l6ZSA+IDEwMjQgfHwKKwkJICAgICFpc19wb3dlcl9vZl8yKGxwLT5jaHVua19zaXplKSkgeworCQkJbG9nX2Vycm9yKCJDaHVuayBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyIGluIHRoZSAiCisJCQkJICAicmFuZ2UgNEsgdG8gNTEySyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX3ZlcmJvc2UoIlNldHRpbmcgY2h1bmsgc2l6ZSB0byAlcy4iLCBkaXNwbGF5X3NpemUoY21kLCBscC0+Y2h1bmtfc2l6ZSkpOworCisJCWlmICghKGxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX1NOQVBTSE9UKSkpCisJCQlyZXR1cm5fMDsKKworCQlscC0+emVybyA9IChscC0+c2VndHlwZS0+ZmxhZ3MgJiBTRUdfQ0FOTk9UX0JFX1pFUk9FRCkKKwkJCT8gMCA6IGFyZ19pbnRfdmFsdWUoY21kLCB6ZXJvX0FSRywgMSk7CisKKwl9IGVsc2UgaWYgKGxwLT5yZXBsYWNlKSB7IC8qIFJBSUQgZGV2aWNlIHJlcGxhY2VtZW50ICovCisJCWxwLT5yZXBsYWNlX3B2X2NvdW50ID0gYXJnX2NvdW50KGNtZCwgcmVwbGFjZV9BUkcpOworCQlscC0+cmVwbGFjZV9wdnMgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoY2hhciAqKSAqIGxwLT5yZXBsYWNlX3B2X2NvdW50KTsKKwkJaWYgKCFscC0+cmVwbGFjZV9wdnMpCisJCQlyZXR1cm5fMDsKKworCQlpID0gMDsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdyb3VwLCAmY21kLT5hcmdfdmFsdWVfZ3JvdXBzKSB7CisJCQlpZiAoIWdyb3VwZWRfYXJnX2lzX3NldChncm91cC0+YXJnX3ZhbHVlcywgcmVwbGFjZV9BUkcpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEodG1wX3N0ciA9IGdyb3VwZWRfYXJnX3N0cl92YWx1ZShncm91cC0+YXJnX3ZhbHVlcywKKwkJCQkJCQkgICAgICByZXBsYWNlX0FSRywKKwkJCQkJCQkgICAgICBOVUxMKSkpIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZXQgJy0tcmVwbGFjZScgYXJndW1lbnQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghKGxwLT5yZXBsYWNlX3B2c1tpKytdID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sCisJCQkJCQkJCSAgICB0bXBfc3RyKSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9IGVsc2UgaWYgKF9taXJyb3Jfb3JfcmFpZF90eXBlX3JlcXVlc3RlZChjbWQsIGxwLT50eXBlX3N0cikgfHwKKwkJICAgbHAtPnJlcGFpciB8fCBscC0+bWlycm9ybG9nIHx8IGxwLT5jb3JlbG9nKSB7IC8qIE1pcnJvcnMgKGFuZCBzb21lIFJBSUQgZnVuY3Rpb25zKSAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIGNodW5rc2l6ZV9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIi0tY2h1bmtzaXplIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggc25hcHNob3RzIG9yIHBvb2xzLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoYXJnX2lzX3NldChjbWQsIHplcm9fQVJHKSkgeworCQkJbG9nX2Vycm9yKCItLXplcm8gaXMgb25seSBhdmFpbGFibGUgd2l0aCBzbmFwc2hvdHMgb3IgdGhpbiBwb29scy4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogLS1yZWdpb25zaXplIGlzIG9ubHkgdmFsaWQgaWYgY29udmVydGluZyBhbiBMViBpbnRvIGEgbWlycm9yLgorCQkgKiBDaGVja2VkIHdoZW4gd2Uga25vdyB0aGUgc3RhdGUgb2YgdGhlIExWIGJlaW5nIGNvbnZlcnRlZC4KKwkJICovCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgcmVnaW9uc2l6ZV9BUkcpKSB7CisJCQlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCByZWdpb25zaXplX0FSRywgU0lHTl9OT05FKSA9PQorCQkJCSAgICBTSUdOX01JTlVTKSB7CisJCQkJbG9nX2Vycm9yKCJOZWdhdGl2ZSByZWdpb25zaXplIGlzIGludmFsaWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlscC0+cmVnaW9uX3NpemUgPSBhcmdfdWludF92YWx1ZShjbWQsIHJlZ2lvbnNpemVfQVJHLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ2lvbl9zaXplID0gZ2V0X2RlZmF1bHRfcmVnaW9uX3NpemUoY21kKTsKKwkJCWlmIChyZWdpb25fc2l6ZSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoIk5lZ2F0aXZlIHJlZ2lvbnNpemUgaW4gIgorCQkJCQkgICJjb25maWd1cmF0aW9uIGZpbGUgaXMgaW52YWxpZC4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWxwLT5yZWdpb25fc2l6ZSA9IHJlZ2lvbl9zaXplOworCQl9CisKKwkJaWYgKGxwLT5yZWdpb25fc2l6ZSAlIChwYWdlc2l6ZSA+PiBTRUNUT1JfU0hJRlQpKSB7CisJCQlsb2dfZXJyb3IoIlJlZ2lvbiBzaXplICglIiBQUkl1MzIgIikgbXVzdCBiZSAiCisJCQkJICAiYSBtdWx0aXBsZSBvZiBtYWNoaW5lIG1lbW9yeSAiCisJCQkJICAicGFnZSBzaXplICglZCkuIiwKKwkJCQkgIGxwLT5yZWdpb25fc2l6ZSwgcGFnZXNpemUgPj4gU0VDVE9SX1NISUZUKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFpc19wb3dlcl9vZl8yKGxwLT5yZWdpb25fc2l6ZSkpIHsKKwkJCWxvZ19lcnJvcigiUmVnaW9uIHNpemUgKCUiIFBSSXUzMgorCQkJCSAgIikgbXVzdCBiZSBhIHBvd2VyIG9mIDIuIiwgbHAtPnJlZ2lvbl9zaXplKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFscC0+cmVnaW9uX3NpemUpIHsKKwkJCWxvZ19lcnJvcigiTm9uLXplcm8gcmVnaW9uIHNpemUgbXVzdCBiZSBzdXBwbGllZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRGVmYXVsdCBpcyBuZXZlciBzdHJpcGVkLCByZWdhcmRsZXNzIG9mIGV4aXN0aW5nIExWIGNvbmZpZ3VyYXRpb24uICovCisJCWlmICghZ2V0X3N0cmlwZV9wYXJhbXMoY21kLCAmbHAtPnN0cmlwZXMsICZscC0+c3RyaXBlX3NpemUpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogRklYTUUgbWFuIHBhZ2Ugc2F5cyBpbiBvbmUgcGxhY2UgdGhhdCAtLXR5cGUgYW5kIC0tbWlycm9ycyBjYW4ndCBiZSBtaXhlZCAqLworCQlpZiAobHAtPm1pcnJvcnNfc3VwcGxpZWQgJiYgIWxwLT5taXJyb3JzKSB7CisJCQkvKiBkb3duLWNvbnZlcnRpbmcgdG8gbGluZWFyL3N0cmlwZT8gKi8KKwkJCWlmICghKGxwLT5zZWd0eXBlID0KKwkJCSAgICAgIGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgU0VHX1RZUEVfTkFNRV9TVFJJUEVEKSkpCisJCQkJcmV0dXJuXzA7CisJCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHR5cGVfQVJHKSkgeworCQkJLyogY2hhbmdpbmcgbWlycm9yIHR5cGU/ICovCisJCQlpZiAoIShscC0+c2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgYXJnX3N0cl92YWx1ZShjbWQsIHR5cGVfQVJHLCBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9taXJyb3Jfc2VndHlwZV9kZWZhdWx0X0NGRywgTlVMTCkpKSkpCisJCQkJcmV0dXJuXzA7CisJCX0KKwl9IGVsc2UgaWYgKF9yYWlkMF90eXBlX3JlcXVlc3RlZChscC0+dHlwZV9zdHIpIHx8IF9zdHJpcGVkX3R5cGVfcmVxdWVzdGVkKGxwLT50eXBlX3N0cikpIHsgLyogc3RyaXBlZCBvciBsaW5lYXIgb3IgcmFpZDAgKi8KKwkJaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImNhbm5vdCBiZSB1c2VkIHdpdGggLS10eXBlIHJhaWQwIG9yIC0tdHlwZSBzdHJpcGVkIG9yIC0tdHlwZSBsaW5lYXIiLAorCQkJCQkgY2h1bmtzaXplX0FSRywgY29yZWxvZ19BUkcsIG1pcnJvcnNfQVJHLCBtaXJyb3Jsb2dfQVJHLCByZWdpb25zaXplX0FSRywgemVyb19BUkcsCisJCQkJCSAtMSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIWdldF9zdHJpcGVfcGFyYW1zKGNtZCwgJmxwLT5zdHJpcGVzLCAmbHAtPnN0cmlwZV9zaXplKSkKKwkJCXJldHVybl8wOworCisJCS8qIEZJWE1FIFNob3VsZG4ndCBuZWVkIHRvIG92ZXJyaWRlIGdldF9zdHJpcGVfcGFyYW1zIHdoaWNoIGRlZmF1bHRzIHRvIDEgc3RyaXBlIChpLmUuIGxpbmVhcikhICovCisJCS8qIFRoZSBkZWZhdWx0IGtlZXBzIGV4aXN0aW5nIG51bWJlciBvZiBzdHJpcGVzLCBoYW5kbGVkIGluc2lkZSB0aGUgbGlicmFyeSBjb2RlICovCisJCWlmICghYXJnX2lzX3NldChjbWQsIHN0cmlwZXNfbG9uZ19BUkcpICYmICFfbGluZWFyX3R5cGVfcmVxdWVzdGVkKGxwLT50eXBlX3N0cikpCisJCQlscC0+c3RyaXBlcyA9IDA7CisKKwkJaWYgKCEobHAtPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIGxwLT50eXBlX3N0cikpKQorCQkJcmV0dXJuXzA7CisJfSAvKiBlbHNlIHNlZ3R5cGUgd2lsbCBkZWZhdWx0IHRvIGN1cnJlbnQgdHlwZSAqLworCisJbHAtPmZvcmNlID0gYXJnX2NvdW50KGNtZCwgZm9yY2VfQVJHKTsKKwlscC0+eWVzID0gYXJnX2NvdW50KGNtZCwgeWVzX0FSRyk7CisKKwlpZiAoYWN0aXZhdGlvbigpICYmIGxwLT5zZWd0eXBlICYmIGxwLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50ICYmCisJICAgICFscC0+c2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudChjbWQsIE5VTEwsICZscC0+dGFyZ2V0X2F0dHIpKSB7CisJCWxvZ19lcnJvcigiJXM6IFJlcXVpcmVkIGRldmljZS1tYXBwZXIgdGFyZ2V0KHMpIG5vdCAiCisJCQkgICJkZXRlY3RlZCBpbiB5b3VyIGtlcm5lbC4iLCBscC0+c2VndHlwZS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghX2x2Y29udmVydF9uYW1lX3BhcmFtcyhscCwgY21kLCAmYXJnYywgJmFyZ3YpKQorCQlyZXR1cm5fMDsKKworCWxwLT5wdl9jb3VudCA9IGFyZ2M7CisJbHAtPnB2cyA9IGFyZ3Y7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwb2xsX2Z1bmN0aW9ucyBfbHZjb252ZXJ0X21pcnJvcl9mbnMgPSB7CisJLnBvbGxfcHJvZ3Jlc3MgPSBwb2xsX21pcnJvcl9wcm9ncmVzcywKKwkuZmluaXNoX2NvcHkgPSBsdmNvbnZlcnRfbWlycm9yX2ZpbmlzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgX2x2Y29udmVydF9tZXJnZV9mbnMgPSB7CisJLnBvbGxfcHJvZ3Jlc3MgPSBwb2xsX21lcmdlX3Byb2dyZXNzLAorCS5maW5pc2hfY29weSA9IGx2Y29udmVydF9tZXJnZV9maW5pc2gsCit9OworCitzdGF0aWMgc3RydWN0IHBvbGxfZnVuY3Rpb25zIF9sdmNvbnZlcnRfdGhpbl9tZXJnZV9mbnMgPSB7CisJLnBvbGxfcHJvZ3Jlc3MgPSBwb2xsX3RoaW5fbWVyZ2VfcHJvZ3Jlc3MsCisJLmZpbmlzaF9jb3B5ID0gbHZjb252ZXJ0X21lcmdlX2ZpbmlzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKl9jcmVhdGVfaWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJCQkgICAgY29uc3QgY2hhciAqbHZfbmFtZSwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKnV1aWQpCit7CisJc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZDsKKwljaGFyIGx2X2Z1bGxfbmFtZVtOQU1FX0xFTl07CisKKwlpZiAoIXZnX25hbWUgfHwgIWx2X25hbWUgfHwgIXV1aWQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJXcm9uZyBwYXJhbXMgZm9yIGx2Y29udmVydCBfY3JlYXRlX2lkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZG1fc25wcmludGYobHZfZnVsbF9uYW1lLCBzaXplb2YobHZfZnVsbF9uYW1lKSwgIiVzLyVzIiwgdmdfbmFtZSwgbHZfbmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiTmFtZSBcIiVzLyVzXCIgaXMgdG9vIGxvbmcuIiwgdmdfbmFtZSwgbHZfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGlkID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCppZCkpKSkgeworCQlsb2dfZXJyb3IoIlBvbGwgb3BlcmF0aW9uIElEIGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShpZC0+ZGlzcGxheV9uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGx2X2Z1bGxfbmFtZSkpIHx8CisJICAgICEoaWQtPmx2X25hbWUgPSBzdHJjaHIoaWQtPmRpc3BsYXlfbmFtZSwgJy8nKSkgfHwKKwkgICAgIShpZC0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z19uYW1lKSkgfHwKKwkgICAgIShpZC0+dXVpZCA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB1dWlkKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY29weSBvbmUgb3IgbW9yZSBwb2xsIG9wZXJhdGlvbiBJRCBtZW1iZXJzLiIpOworCQlkbV9wb29sX2ZyZWUoY21kLT5tZW0sIGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWQtPmx2X25hbWUrKzsgLyogc2tpcCBvdmVyICcvJyAqLworCisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfcG9sbF9ieV9pZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCwKKwkJCQkgdW5zaWduZWQgYmFja2dyb3VuZCwKKwkJCQkgaW50IGlzX21lcmdpbmdfb3JpZ2luLAorCQkJCSBpbnQgaXNfbWVyZ2luZ19vcmlnaW5fdGhpbikKK3sKKwlpZiAodGVzdF9tb2RlKCkpCisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKworCWlmIChpc19tZXJnaW5nX29yaWdpbikKKwkJcmV0dXJuIHBvbGxfZGFlbW9uKGNtZCwgYmFja2dyb3VuZCwKKwkJCQkoTUVSR0lORyB8IChpc19tZXJnaW5nX29yaWdpbl90aGluID8gVEhJTl9WT0xVTUUgOiBTTkFQU0hPVCkpLAorCQkJCWlzX21lcmdpbmdfb3JpZ2luX3RoaW4gPyAmX2x2Y29udmVydF90aGluX21lcmdlX2ZucyA6ICZfbHZjb252ZXJ0X21lcmdlX2ZucywKKwkJCQkiTWVyZ2VkIiwgaWQpOworCWVsc2UKKwkJcmV0dXJuIHBvbGxfZGFlbW9uKGNtZCwgYmFja2dyb3VuZCwgQ09OVkVSVElORywKKwkJCQkmX2x2Y29udmVydF9taXJyb3JfZm5zLCAiQ29udmVydGVkIiwgaWQpOworfQorCitpbnQgbHZjb252ZXJ0X3BvbGwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgIHVuc2lnbmVkIGJhY2tncm91bmQpCit7CisJaW50IHI7CisJc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCA9IF9jcmVhdGVfaWQoY21kLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLCBsdi0+bHZpZC5zKTsKKwlpbnQgaXNfbWVyZ2luZ19vcmlnaW4gPSAwOworCWludCBpc19tZXJnaW5nX29yaWdpbl90aGluID0gMDsKKworCWlmICghaWQpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgcG9sbCBpZGVudGlmaWVyIGZvciBsdmNvbnZlcnQuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgdGhpcyBpbiBwb2xsaW5nIGluc3RlYWQgKi8KKwlpZiAobHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpKSB7CisJCWlzX21lcmdpbmdfb3JpZ2luID0gMTsKKwkJaXNfbWVyZ2luZ19vcmlnaW5fdGhpbiA9IHNlZ19pc190aGluX3ZvbHVtZShmaW5kX3NuYXBzaG90KGx2KSk7CisJfQorCisJciA9IF9sdmNvbnZlcnRfcG9sbF9ieV9pZChjbWQsIGlkLCBiYWNrZ3JvdW5kLCBpc19tZXJnaW5nX29yaWdpbiwgaXNfbWVyZ2luZ19vcmlnaW5fdGhpbik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfaW5zZXJ0X2x2Y29udmVydF9sYXllcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCWNoYXIgZm9ybWF0W05BTUVfTEVOXSwgbGF5ZXJfbmFtZVtOQU1FX0xFTl07CisJaW50IGk7CisKKwkvKgorCSAqIFdlIHdvdWxkIGxpa2UgdG8gZ2l2ZSB0aGUgc2FtZSBudW1iZXIgZm9yIHRoaXMgbGF5ZXIKKwkgKiBhbmQgdGhlIG5ld2x5IGFkZGVkIG1pbWFnZS4KKwkgKiBIb3dldmVyLCBMViBuYW1lIG9mIG5ld2x5IGFkZGVkIG1pbWFnZSBpcyBkZXRlcm1pbmVkICphZnRlcioKKwkgKiB0aGUgTFYgbmFtZSBvZiB0aGlzIGxheWVyIGlzIGRldGVybWluZWQuCisJICoKKwkgKiBTbywgdXNlIGdlbmVyYXRlX2x2X25hbWUoKSB0byBnZW5lcmF0ZSBtaW1hZ2UgbmFtZSBmaXJzdAorCSAqIGFuZCB0YWtlIHRoZSBudW1iZXIgZnJvbSBpdC4KKwkgKi8KKworCWlmIChkbV9zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJXNfbWltYWdlXyUlZCIsIGx2LT5uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJsdmNvbnZlcnQ6IGxheWVyIG5hbWUgY3JlYXRpb24gZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWdlbmVyYXRlX2x2X25hbWUobHYtPnZnLCBmb3JtYXQsIGxheWVyX25hbWUsIHNpemVvZihsYXllcl9uYW1lKSkgfHwKKwkgICAgc3NjYW5mKGxheWVyX25hbWUsIGZvcm1hdCwgJmkpICE9IDEpIHsKKwkJbG9nX2Vycm9yKCJsdmNvbnZlcnQ6IGxheWVyIG5hbWUgZ2VuZXJhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbV9zbnByaW50ZihsYXllcl9uYW1lLCBzaXplb2YobGF5ZXJfbmFtZSksIE1JUlJPUl9TWU5DX0xBWUVSICJfJWQiLCBpKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJsYXllciBuYW1lIGNyZWF0aW9uIGZhaWxlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFpbnNlcnRfbGF5ZXJfZm9yX2x2KGNtZCwgbHYsIDAsIGxheWVyX25hbWUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluc2VydCByZXN5bmMgbGF5ZXIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2ZhaWxlZF9taXJyb3JzX2NvdW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKmx2c2VnOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIHM7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZzZWcsICZsdi0+c2VnbWVudHMpIHsKKwkJaWYgKCFzZWdfaXNfbWlycm9yZWQobHZzZWcpKQorCQkJcmV0dXJuIC0xOworCQlmb3IgKHMgPSAwOyBzIDwgbHZzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJaWYgKHNlZ190eXBlKGx2c2VnLCBzKSA9PSBBUkVBX0xWKSB7CisJCQkJaWYgKGlzX3RlbXBvcmFyeV9taXJyb3JfbGF5ZXIoc2VnX2x2KGx2c2VnLCBzKSkpCisJCQkJCXJldCArPSBfZmFpbGVkX21pcnJvcnNfY291bnQoc2VnX2x2KGx2c2VnLCBzKSk7CisJCQkJZWxzZSBpZiAobHZfaXNfcGFydGlhbChzZWdfbHYobHZzZWcsIHMpKSkKKwkJCQkJKysgcmV0OworCQkJfQorCQkJZWxzZSBpZiAoc2VnX3R5cGUobHZzZWcsIHMpID09IEFSRUFfUFYgJiYKKwkJCQkgaXNfbWlzc2luZ19wdihzZWdfcHYobHZzZWcsIHMpKSkKKwkJCQkrK3JldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX2ZhaWxlZF9sb2dzX2NvdW50KHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgczsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxvZ19sdiA9IGZpcnN0X3NlZyhsdiktPmxvZ19sdjsKKwlpZiAobG9nX2x2ICYmIGx2X2lzX3BhcnRpYWwobG9nX2x2KSkgeworCQlpZiAobHZfaXNfbWlycm9yZWQobG9nX2x2KSkKKwkJCXJldCArPSBfZmFpbGVkX21pcnJvcnNfY291bnQobG9nX2x2KTsKKwkJZWxzZQorCQkJcmV0ICs9IDE7CisJfQorCWZvciAocyA9IDA7IHMgPCBmaXJzdF9zZWcobHYpLT5hcmVhX2NvdW50OyBzKyspIHsKKwkJaWYgKHNlZ190eXBlKGZpcnN0X3NlZyhsdiksIHMpID09IEFSRUFfTFYgJiYKKwkJICAgIGlzX3RlbXBvcmFyeV9taXJyb3JfbGF5ZXIoc2VnX2x2KGZpcnN0X3NlZyhsdiksIHMpKSkKKwkJCXJldCArPSBfZmFpbGVkX2xvZ3NfY291bnQoc2VnX2x2KGZpcnN0X3NlZyhsdiksIHMpKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9mYWlsZWRfcHZfbGlzdChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqZmFpbGVkX3B2czsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqbmV3X3B2bDsKKworCWlmICghKGZhaWxlZF9wdnMgPSBkbV9wb29sX2FsbG9jKHZnLT52Z21lbSwgc2l6ZW9mKCpmYWlsZWRfcHZzKSkpKSB7CisJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBsaXN0IG9mIGZhaWxlZF9wdnMgZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbV9saXN0X2luaXQoZmFpbGVkX3B2cyk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlpZiAoIWlzX21pc3NpbmdfcHYocHZsLT5wdikpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGaW5hbGx5LCAtLXJlcGFpciB3aWxsIHJlbW92ZSBlbXB0eSBQVnMuCisJCSAqIEJ1dCB3ZSBvbmx5IHdhbnQgcmVtb3ZlIHRoZXNlIHdoaWNoIGFyZSBvdXRwdXQgb2YgcmVwYWlyLAorCQkgKiBEbyBub3QgY291bnQgdGhlc2Ugd2hpY2ggYXJlIGFscmVhZHkgZW1wdHkgaGVyZS4KKwkJICogRklYTUU6IGNvZGUgc2hvdWxkIHRyYXZlcnNlIFBWIGluIExWIG5vdCBpbiB3aG9sZSBWRy4KKwkJICogRklYTUU6IGxheWVyIHZpb2xhdGlvbj8gc2hvdWxkIGl0IGRlcGVuZCBvbiB2Z3JlZHVjZSAtLXJlbW92ZW1pc2luZz8KKwkJICovCisJCWlmIChwdmwtPnB2LT5wZV9hbGxvY19jb3VudCA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKCEobmV3X3B2bCA9IGRtX3Bvb2xfYWxsb2ModmctPnZnbWVtLCBzaXplb2YoKm5ld19wdmwpKSkpIHsKKwkJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBmYWlsZWRfcHZzIGxpc3QgZW50cnkgZmFpbGVkLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbmV3X3B2bC0+cHYgPSBwdmwtPnB2OworCQlkbV9saXN0X2FkZChmYWlsZWRfcHZzLCAmbmV3X3B2bC0+bGlzdCk7CisJfQorCisJcmV0dXJuIGZhaWxlZF9wdnM7Cit9CisKK3N0YXRpYyBpbnQgX2lzX3BhcnRpYWxfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgdm9pZCAqYmF0b24gX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIGx2X2lzX3BhcnRpYWwobHYpOworfQorCisvKgorICogV2FsayBkb3duIHRoZSBzdGFja2VkIG1pcnJvciBMViB0byB0aGUgb3JpZ2luYWwgbWlycm9yIExWLgorICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpfb3JpZ2luYWxfbHYoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm5leHRfbHYgPSBsdiwgKnRtcF9sdjsKKworCXdoaWxlICgodG1wX2x2ID0gZmluZF90ZW1wb3JhcnlfbWlycm9yKG5leHRfbHYpKSkKKwkJbmV4dF9sdiA9IHRtcF9sdjsKKworCXJldHVybiBuZXh0X2x2OworfQorCitzdGF0aWMgdm9pZCBfbHZjb252ZXJ0X21pcnJvcnNfcmVwYWlyX2FzayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICBpbnQgZmFpbGVkX2xvZywgaW50IGZhaWxlZF9taXJyb3JzLAorCQkJCQkgIGludCAqcmVwbGFjZV9sb2csIGludCAqcmVwbGFjZV9taXJyb3JzKQoreworCWNvbnN0IGNoYXIgKmxlZ19wb2xpY3ksICpsb2dfcG9saWN5OworCWludCBmb3JjZSA9IGFyZ19jb3VudChjbWQsIGZvcmNlX0FSRyk7CisJaW50IHllcyA9IGFyZ19jb3VudChjbWQsIHllc19BUkcpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCB1c2Vwb2xpY2llc19BUkcpKSB7CisJCWxlZ19wb2xpY3kgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGFjdGl2YXRpb25fbWlycm9yX2ltYWdlX2ZhdWx0X3BvbGljeV9DRkcsIE5VTEwpOworCQlsb2dfcG9saWN5ID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBhY3RpdmF0aW9uX21pcnJvcl9sb2dfZmF1bHRfcG9saWN5X0NGRywgTlVMTCk7CisJCSpyZXBsYWNlX21pcnJvcnMgPSBzdHJjbXAobGVnX3BvbGljeSwgInJlbW92ZSIpOworCQkqcmVwbGFjZV9sb2cgPSBzdHJjbXAobG9nX3BvbGljeSwgInJlbW92ZSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZvcmNlICE9IFBST01QVCkgeworCQkqcmVwbGFjZV9sb2cgPSAqcmVwbGFjZV9taXJyb3JzID0gMDsKKwkJcmV0dXJuOworCX0KKworCSpyZXBsYWNlX2xvZyA9ICpyZXBsYWNlX21pcnJvcnMgPSAxOworCisJaWYgKHllcykKKwkJcmV0dXJuOworCisJaWYgKGZhaWxlZF9sb2cgJiYKKwkgICAgeWVzX25vX3Byb21wdCgiQXR0ZW1wdCB0byByZXBsYWNlIGZhaWxlZCBtaXJyb3IgbG9nPyBbeS9uXTogIikgPT0gJ24nKQorCQkqcmVwbGFjZV9sb2cgPSAwOworCisJaWYgKGZhaWxlZF9taXJyb3JzICYmCisJICAgIHllc19ub19wcm9tcHQoIkF0dGVtcHQgdG8gcmVwbGFjZSBmYWlsZWQgbWlycm9yIGltYWdlcyAiCisJCQkgICIocmVxdWlyZXMgZnVsbCBkZXZpY2UgcmVzeW5jKT8gW3kvbl06ICIpID09ICduJykKKwkJKnJlcGxhY2VfbWlycm9ycyA9IDA7Cit9CisKKy8qCisgKiBfZ2V0X2xvZ19jb3VudAorICogQGx2OiB0aGUgbWlycm9yIExWCisgKgorICogR2V0IHRoZSBudW1iZXIgb2Ygb24tZGlzayBjb3BpZXMgb2YgdGhlIGxvZy4KKyAqICAwICA9ICdjb3JlJworICogIDEgID0gJ2Rpc2snCisgKiAgMisgPSAnbWlycm9yZWQnCisgKi8KK3N0YXRpYyB1aW50MzJfdCBfZ2V0X2xvZ19jb3VudChzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2OworCisJbG9nX2x2ID0gZmlyc3Rfc2VnKF9vcmlnaW5hbF9sdihsdikpLT5sb2dfbHY7CisJaWYgKGxvZ19sdikKKwkJcmV0dXJuIGx2X21pcnJvcl9jb3VudChsb2dfbHYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2x2X3VwZGF0ZV9taXJyb3JlZF9sb2coc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqb3BlcmFibGVfcHZzLAorCQkJCSAgIGludCBsb2dfY291bnQpCit7CisJaW50IG9sZF9sb2dfY291bnQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsb2dfbHY7CisKKwkvKgorCSAqIFdoZW4gbG9nX2NvdW50IGlzIDAsIG1pcnJvcmVkIGxvZyBkb2Vzbid0IG5lZWQgdG8gYmUKKwkgKiB1cGRhdGVkIGhlcmUgYnV0IGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4KKwkgKi8KKwlpZiAoIWxvZ19jb3VudCkKKwkJcmV0dXJuIDE7CisKKwlsb2dfbHYgPSBmaXJzdF9zZWcoX29yaWdpbmFsX2x2KGx2KSktPmxvZ19sdjsKKwlpZiAoIWxvZ19sdiB8fCAhbHZfaXNfbWlycm9yZWQobG9nX2x2KSkKKwkJcmV0dXJuIDE7CisKKwlvbGRfbG9nX2NvdW50ID0gX2dldF9sb2dfY291bnQobHYpOworCWlmIChvbGRfbG9nX2NvdW50ID09IGxvZ19jb3VudCkKKwkJcmV0dXJuIDE7CisKKwkvKiBSZWR1Y2luZyByZWR1bmRhbmN5IG9mIHRoZSBsb2cgKi8KKwlyZXR1cm4gcmVtb3ZlX21pcnJvcl9pbWFnZXMobG9nX2x2LCBsb2dfY291bnQsCisJCQkJICAgIGlzX21pcnJvcl9pbWFnZV9yZW1vdmFibGUsCisJCQkJICAgIG9wZXJhYmxlX3B2cywgMFUpOworfQorCitzdGF0aWMgaW50IF9sdl91cGRhdGVfbG9nX3R5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwLAorCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKm9wZXJhYmxlX3B2cywKKwkJCSAgICAgICBpbnQgbG9nX2NvdW50KQoreworCWludCBvbGRfbG9nX2NvdW50OworCXVpbnQzMl90IHJlZ2lvbl9zaXplID0gKGxwKSA/IGxwLT5yZWdpb25fc2l6ZSA6CisJCWZpcnN0X3NlZyhsdiktPnJlZ2lvbl9zaXplOworCWFsbG9jX3BvbGljeV90IGFsbG9jID0gKGxwKSA/IGxwLT5hbGxvYyA6IGx2LT5hbGxvYzsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbmFsX2x2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbG9nX2x2OworCisJb2xkX2xvZ19jb3VudCA9IF9nZXRfbG9nX2NvdW50KGx2KTsKKwlpZiAob2xkX2xvZ19jb3VudCA9PSBsb2dfY291bnQpCisJCXJldHVybiAxOworCisJb3JpZ2luYWxfbHYgPSBfb3JpZ2luYWxfbHYobHYpOworCS8qIFJlbW92ZSBhbiBleGlzdGluZyBsb2cgY29tcGxldGVseSAqLworCWlmICghbG9nX2NvdW50KSB7CisJCWlmICghcmVtb3ZlX21pcnJvcl9sb2coY21kLCBvcmlnaW5hbF9sdiwgb3BlcmFibGVfcHZzLAorCQkJCSAgICAgICBhcmdfY291bnQoY21kLCB5ZXNfQVJHKSB8fAorCQkJCSAgICAgICBhcmdfY291bnQoY21kLCBmb3JjZV9BUkcpKSkKKwkJCXJldHVybl8wOworCQlyZXR1cm4gMTsKKwl9CisKKwlsb2dfbHYgPSBmaXJzdF9zZWcob3JpZ2luYWxfbHYpLT5sb2dfbHY7CisKKwkvKiBBZGRpbmcgcmVkdW5kYW5jeSB0byB0aGUgbG9nICovCisJaWYgKG9sZF9sb2dfY291bnQgPCBsb2dfY291bnQpIHsKKwkJcmVnaW9uX3NpemUgPSBhZGp1c3RlZF9taXJyb3JfcmVnaW9uX3NpemUobHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkJCQkgIGx2LT5sZV9jb3VudCwKKwkJCQkJCQkgIHJlZ2lvbl9zaXplLCAwLAorCQkJCQkJCSAgdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpOworCisJCWlmICghYWRkX21pcnJvcl9sb2coY21kLCBvcmlnaW5hbF9sdiwgbG9nX2NvdW50LAorCQkJCSAgICByZWdpb25fc2l6ZSwgb3BlcmFibGVfcHZzLCBhbGxvYykpCisJCQlyZXR1cm5fMDsKKwkJLyoKKwkJICogRklYTUU6IFRoaXMgc2ltcGxlIGFwcHJvYWNoIHdvbid0IHdvcmsgaW4gY2x1c3RlciBtaXJyb3JzLAorCQkgKgkgIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQKKwkJICoJICBtaXJyb3JlZCBsb2dzIGluIGNsdXN0ZXIgbWlycm9ycy4KKwkJICovCisJCWlmIChvbGRfbG9nX2NvdW50ICYmCisJCSAgICAhbHZfdXBkYXRlX2FuZF9yZWxvYWQobG9nX2x2KSkKKwkJCXJldHVybl8wOworCisJCXJldHVybiAxOworCX0KKworCS8qIFJlZHVjaW5nIHJlZHVuZGFuY3kgb2YgdGhlIGxvZyAqLworCXJldHVybiByZW1vdmVfbWlycm9yX2ltYWdlcyhsb2dfbHYsIGxvZ19jb3VudCwKKwkJCQkgICAgaXNfbWlycm9yX2ltYWdlX3JlbW92YWJsZSwgb3BlcmFibGVfcHZzLCAxVSk7Cit9CisKKy8qCisgKiBSZW9tb3ZlIG1pc3NpbmcgYW5kIGVtcHR5IFBWcyBmcm9tIFZHLCBpZiBhcmUgYWxzbyBpbiBwcm92aWRlZCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIF9yZW1vdmVfbWlzc2luZ19lbXB0eV9wdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGRtX2xpc3QgKnJlbW92ZV9wdnMpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnB2bF92ZywgKnB2bHQ7CisJaW50IHJlbW92ZWQgPSAwOworCisJaWYgKCFyZW1vdmVfcHZzKQorCQlyZXR1cm47CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCByZW1vdmVfcHZzKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHB2bF92ZywgcHZsdCwgJnZnLT5wdnMpIHsKKwkJCWlmICghaWRfZXF1YWwoJnB2bC0+cHYtPmlkLCAmcHZsX3ZnLT5wdi0+aWQpIHx8CisJCQkgICAgIWlzX21pc3NpbmdfcHYocHZsX3ZnLT5wdikgfHwKKwkJCSAgICBwdmxfdmctPnB2LT5wZV9hbGxvY19jb3VudCAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBGSVhNRTogZHVwbGljYXRpb24gb2YgdmdyZWR1Y2UgY29kZSwgbW92ZSB0aGlzIHRvIGxpYnJhcnkgKi8KKwkJCXZnLT5mcmVlX2NvdW50IC09IHB2bF92Zy0+cHYtPnBlX2NvdW50OworCQkJdmctPmV4dGVudF9jb3VudCAtPSBwdmxfdmctPnB2LT5wZV9jb3VudDsKKwkJCWRlbF9wdmxfZnJvbV92Z3ModmcsIHB2bF92Zyk7CisJCQlmcmVlX3B2X2ZpZChwdmxfdmctPnB2KTsKKworCQkJcmVtb3ZlZCsrOworCQl9CisJfQorCisJaWYgKHJlbW92ZWQpIHsKKwkJaWYgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpIHsKKwkJCXN0YWNrOworCQkJcmV0dXJuOworCQl9CisJCWxvZ193YXJuKCIlZCBtaXNzaW5nIGFuZCBub3cgdW5hbGxvY2F0ZWQgUGh5c2ljYWwgVm9sdW1lcyByZW1vdmVkIGZyb20gVkcuIiwgcmVtb3ZlZCk7CisJfQorfQorCisvKgorICogX2x2Y29udmVydF9taXJyb3JzX3BhcnNlX3BhcmFtcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZvbGxvd2luZzoKKyAqICAxKSBHZXRzIHRoZSBvbGQgdmFsdWVzIG9mIG1pbWFnZSBhbmQgbG9nIGNvdW50cworICogIDIpIFBhcnNlcyB0aGUgQ0xJIGFyZ3MgdG8gZmluZCB0aGUgbmV3IGRlc2lyZWQgdmFsdWVzCisgKiAgMykgQWRqdXN0cyAnbHAtPm1pcnJvcnMnIHRvIHRoZSBhcHByb3ByaWF0ZSBhYnNvbHV0ZSB2YWx1ZS4KKyAqICAgICAoUmVtZW1iZXIsICdscC0+bWlycm9ycycgaXMgc3BlY2lmaWVkIGluIHRlcm1zIG9mIHRoZSBudW1iZXIgb2YgImNvcGllcyIKKyAqICAgICB2cy4gdGhlIG51bWJlciBvZiBtaW1hZ2VzLiAgSXQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSB2YWx1ZS4pCisgKiAgNCkgU2V0cyAnbHAtPm5lZWRfcG9sbGluZycgaWYgY29sbGFwc2luZworICogIDUpIFZhbGlkYXRlcyBvdGhlciBtaXJyb3IgcGFyYW1zCisgKgorICogUmV0dXJuczogMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX2x2Y29udmVydF9taXJyb3JzX3BhcnNlX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwLAorCQkJCQkgICB1aW50MzJfdCAqb2xkX21pbWFnZV9jb3VudCwKKwkJCQkJICAgdWludDMyX3QgKm9sZF9sb2dfY291bnQsCisJCQkJCSAgIHVpbnQzMl90ICpuZXdfbWltYWdlX2NvdW50LAorCQkJCQkgICB1aW50MzJfdCAqbmV3X2xvZ19jb3VudCkKK3sKKwkqb2xkX21pbWFnZV9jb3VudCA9IGx2X21pcnJvcl9jb3VudChsdik7CisJKm9sZF9sb2dfY291bnQgPSBfZ2V0X2xvZ19jb3VudChsdik7CisKKwlpZiAoaXNfbG9ja2RfdHlwZShsdi0+dmctPmxvY2tfdHlwZSkgJiYgbHAtPmtlZXBfbWltYWdlcykgeworCQkvKiBGSVhNRTogd2UgbmVlZCB0byBjcmVhdGUgYSBsb2NrIGZvciB0aGUgbmV3IExWLiAqLworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzcGxpdCBtaXJyb3JzIGluIFZHIHdpdGggbG9ja190eXBlICVzIiwgbHYtPnZnLT5sb2NrX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENvbGxhcHNpbmcgYSBzdGFjayBvZiBtaXJyb3JzOgorCSAqCisJICogSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQsIHRyeSBjb2xsYXBzaW5nIHRoZSByZXN5bmMgbGF5ZXJzCisJICovCisJaWYgKCFscC0+bWlycm9yc19zdXBwbGllZCAmJiAhbHAtPm1pcnJvcmxvZyAmJgorCSAgICAhbHAtPmNvcmVsb2cgJiYgIWFyZ19pc19zZXQoY21kLCByZWdpb25zaXplX0FSRykgJiYKKwkgICAgIWxwLT5rZWVwX21pbWFnZXMgJiYgIWxwLT5yZXBhaXIpIHsKKwkJKm5ld19taW1hZ2VfY291bnQgPSAqb2xkX21pbWFnZV9jb3VudDsKKwkJKm5ld19sb2dfY291bnQgPSAqb2xkX2xvZ19jb3VudDsKKworCQlpZiAoZmluZF90ZW1wb3JhcnlfbWlycm9yKGx2KSB8fCBsdl9pc19jb252ZXJ0aW5nKGx2KSkKKwkJCWxwLT5uZWVkX3BvbGxpbmcgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEFkanVzdGluZyBtaW1hZ2UgY291bnQ/CisJICovCisJaWYgKCFscC0+bWlycm9yc19zdXBwbGllZCAmJiAhbHAtPmtlZXBfbWltYWdlcykKKwkJbHAtPm1pcnJvcnMgPSAqb2xkX21pbWFnZV9jb3VudDsKKwllbHNlIGlmIChscC0+bWlycm9yc19zaWduID09IFNJR05fUExVUykKKwkJbHAtPm1pcnJvcnMgPSAqb2xkX21pbWFnZV9jb3VudCArIGxwLT5taXJyb3JzOworCWVsc2UgaWYgKGxwLT5taXJyb3JzX3NpZ24gPT0gU0lHTl9NSU5VUykKKwkJbHAtPm1pcnJvcnMgPSAoKm9sZF9taW1hZ2VfY291bnQgPiBscC0+bWlycm9ycykgPworCQkJKm9sZF9taW1hZ2VfY291bnQgLSBscC0+bWlycm9yczogMDsKKwllbHNlCisJCWxwLT5taXJyb3JzICs9IDE7CisKKwkqbmV3X21pbWFnZV9jb3VudCA9IGxwLT5taXJyb3JzOworCisJLyogVG9vIG1hbnkgbWltYWdlcz8gKi8KKwlpZiAobHAtPm1pcnJvcnMgPiBERUZBVUxUX01JUlJPUl9NQVhfSU1BR0VTKSB7CisJCWxvZ19lcnJvcigiT25seSB1cCB0byAlZCBpbWFnZXMgaW4gbWlycm9yIHN1cHBvcnRlZCBjdXJyZW50bHkuIiwKKwkJCSAgREVGQVVMVF9NSVJST1JfTUFYX0lNQUdFUyk7CisJCXJldHVybiAwOworCX0KKworCS8qIERpZCB0aGUgdXNlciB0cnkgdG8gc3VidHJhY3QgbW9yZSBsZWdzIHRoYW4gYXZhaWxhYmxlPyAqLworCWlmIChscC0+bWlycm9ycyA8IDEpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVkdWNlIGltYWdlcyBieSBzcGVjaWZpZWQgYW1vdW50IC0gb25seSAlZCBpbiAlcyIsCisJCQkgICpvbGRfbWltYWdlX2NvdW50LCBsdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogRklYTUU6IEl0IHdvdWxkIGJlIG5pY2UgdG8gc2F5IHdoYXQgd2UgYXJlIGFkanVzdGluZyB0bywgYnV0CisJICogSSByZWFsbHkgZG9uJ3Qga25vdyB3aGV0aGVyIHRvIHNwZWNpZnkgdGhlICMgb2YgY29waWVzIG9yIG1pbWFnZXMuCisJICovCisJaWYgKCpvbGRfbWltYWdlX2NvdW50ICE9ICpuZXdfbWltYWdlX2NvdW50KQorCQlsb2dfdmVyYm9zZSgiQWRqdXN0aW5nIG1pcnJvciBpbWFnZSBjb3VudCBvZiAlcyIsIGx2LT5uYW1lKTsKKworCS8qCisJICogQWRqdXN0IGxvZyB0eXBlCisJICoKKwkgKiBJZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIGEgbWlycm9yIHRvIGFub3RoZXIgbWlycm9yIG9yIHNpbXBseQorCSAqIGNoYW5naW5nIHRoZSBsb2cgdHlwZSwgd2Ugc3RhcnQgYnkgYXNzdW1pbmcgdGhleSB3YW50IHRoZSBsb2cKKwkgKiB0eXBlIHRoZSBzYW1lIGFuZCB0aGVuIHBhcnNlIHRoZSBnaXZlbiBhcmdzLiAgT1RPSCwgSWYgd2UgYXJlCisJICogY29udmVydGluZyBmcm9tIGxpbmVhciB0byBtaXJyb3IsIHRoZW4gd2Ugc3RhcnQgZnJvbSB0aGUgZGVmYXVsdAorCSAqIHBvc2l0aW9uIHRoYXQgdGhlIHVzZXIgd291bGQgbGlrZSBhICdkaXNrJyBsb2cuCisJICovCisJKm5ld19sb2dfY291bnQgPSAoKm9sZF9taW1hZ2VfY291bnQgPiAxKSA/ICpvbGRfbG9nX2NvdW50IDogMTsKKwlpZiAoIWxwLT5jb3JlbG9nICYmICFscC0+bWlycm9ybG9nKQorCQlyZXR1cm4gMTsKKworCSpuZXdfbG9nX2NvdW50ID0gYXJnX2ludF92YWx1ZShjbWQsIG1pcnJvcmxvZ19BUkcsIGxwLT5jb3JlbG9nID8gTUlSUk9SX0xPR19DT1JFIDogREVGQVVMVF9NSVJST1JMT0cpOworCisJLyoKKwkgKiBObyBtaXJyb3JlZCBsb2dzIGZvciBjbHVzdGVyIG1pcnJvcnMgdW50aWwKKwkgKiBsb2cgZGFlbW9uIGlzIG11bHRpLXRocmVhZGVkLgorCSAqLworCWlmICgoKm5ld19sb2dfY291bnQgPT0gTUlSUk9SX0xPR19NSVJST1JFRCkgJiYgdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykpIHsKKwkJbG9nX2Vycm9yKCJMb2cgdHlwZSwgXCJtaXJyb3JlZFwiLCBpcyB1bmF2YWlsYWJsZSB0byBjbHVzdGVyIG1pcnJvcnMuIik7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJib3NlKCJTZXR0aW5nIGxvZ2dpbmcgdHlwZSB0byAlcy4iLCBnZXRfbWlycm9yX2xvZ19uYW1lKCpuZXdfbG9nX2NvdW50KSk7CisKKwkvKgorCSAqIFJlZ2lvbiBzaXplIG11c3Qgbm90IGNoYW5nZSBvbiBleGlzdGluZyBtaXJyb3JzCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCByZWdpb25zaXplX0FSRykgJiYgbHZfaXNfbWlycm9yZWQobHYpICYmCisJICAgIChscC0+cmVnaW9uX3NpemUgIT0gZmlyc3Rfc2VnKGx2KS0+cmVnaW9uX3NpemUpKSB7CisJCWxvZ19lcnJvcigiTWlycm9yIGxvZyByZWdpb24gc2l6ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiAiCisJCQkgICJhbiBleGlzdGluZyBtaXJyb3IuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogRm9yIHRoZSBtb3N0IHBhcnQsIHdlIGNhbm5vdCBoYW5kbGUgbXVsdGktc2VnbWVudCBtaXJyb3JzLiBCYWlsIG91dAorCSAqIGVhcmx5IGlmIHdlIGhhdmUgZW5jb3VudGVyZWQgb25lLgorCSAqLworCWlmIChsdl9pc19taXJyb3JlZChsdikgJiYgZG1fbGlzdF9zaXplKCZsdi0+c2VnbWVudHMpICE9IDEpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBoYXMgbXVsdGlwbGUgIgorCQkJICAibWlycm9yIHNlZ21lbnRzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogX2x2Y29udmVydF9taXJyb3JzX2F1eAorICoKKyAqIEFkZC9yZW1vdmUgbWlycm9yIGltYWdlcyBhbmQgYWRqdXN0IGxvZyB0eXBlLiAgJ29wZXJhYmxlX3B2cycKKyAqIGFyZSB0aGUgc2V0IG9mIFBWcyBvcGVuIHRvIHJlbW92YWwgb3IgYWxsb2NhdGlvbiAtIGRlcGVuZGluZworICogb24gdGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuCisgKi8KK3N0YXRpYyBpbnQgX2x2Y29udmVydF9taXJyb3JzX2F1eChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHAsCisJCQkJICBzdHJ1Y3QgZG1fbGlzdCAqb3BlcmFibGVfcHZzLAorCQkJCSAgdWludDMyX3QgbmV3X21pbWFnZV9jb3VudCwKKwkJCQkgIHVpbnQzMl90IG5ld19sb2dfY291bnQpCit7CisJdWludDMyX3QgcmVnaW9uX3NpemU7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmxheWVyX2x2OworCXVpbnQzMl90IG9sZF9taW1hZ2VfY291bnQgPSBsdl9taXJyb3JfY291bnQobHYpOworCXVpbnQzMl90IG9sZF9sb2dfY291bnQgPSBfZ2V0X2xvZ19jb3VudChsdik7CisKKwlpZiAoKGxwLT5taXJyb3JzID09IDEpICYmICFsdl9pc19taXJyb3JlZChsdikpIHsKKwkJbG9nX3dhcm4oIkxvZ2ljYWwgdm9sdW1lICVzIGlzIGFscmVhZHkgbm90IG1pcnJvcmVkLiIsCisJCQkgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVnaW9uX3NpemUgPSBhZGp1c3RlZF9taXJyb3JfcmVnaW9uX3NpemUobHYtPnZnLT5leHRlbnRfc2l6ZSwKKwkJCQkJCSAgbHYtPmxlX2NvdW50LAorCQkJCQkJICBscC0+cmVnaW9uX3NpemUsIDAsCisJCQkJCQkgIHZnX2lzX2NsdXN0ZXJlZChsdi0+dmcpKTsKKworCWlmICghb3BlcmFibGVfcHZzKQorCQlvcGVyYWJsZV9wdnMgPSBscC0+cHZoOworCisJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCS8qCisJICogVXAtY29udmVydCBmcm9tIGxpbmVhciB0byBtaXJyb3IKKwkgKi8KKwlpZiAoIWx2X2lzX21pcnJvcmVkKGx2KSkgeworCQkvKiBGSVhNRSBTaGFyZSBjb2RlIHdpdGggbHZjcmVhdGUgKi8KKworCQkvKgorCQkgKiBGSVhNRSBzaG91bGQgd2UgZ2l2ZSBub3Qgb25seSBscC0+cHZoLCBidXQgYWxzbyBhbGwgUFZzCisJCSAqIGN1cnJlbnRseSB0YWtlbiBieSB0aGUgbWlycm9yPyBXb3VsZCBtYWtlIG1vcmUgc2Vuc2UgZnJvbQorCQkgKiB1c2VyIHBlcnNwZWN0aXZlLgorCQkgKi8KKwkJaWYgKCFsdl9hZGRfbWlycm9ycyhjbWQsIGx2LCBuZXdfbWltYWdlX2NvdW50IC0gMSwgbHAtPnN0cmlwZXMsCisJCQkJICAgIGxwLT5zdHJpcGVfc2l6ZSwgcmVnaW9uX3NpemUsIG5ld19sb2dfY291bnQsIG9wZXJhYmxlX3B2cywKKwkJCQkgICAgbHAtPmFsbG9jLCBNSVJST1JfQllfTFYpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKGxwLT53YWl0X2NvbXBsZXRpb24pCisJCQlscC0+bmVlZF9wb2xsaW5nID0gMTsKKworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFVwLWNvbnZlcnQgbS13YXkgbWlycm9yIHRvIG4td2F5IG1pcnJvcgorCSAqLworCWlmIChuZXdfbWltYWdlX2NvdW50ID4gb2xkX21pbWFnZV9jb3VudCkgeworCQlpZiAobHZfaXNfbm90X3N5bmNlZChsdikpIHsKKwkJCWxvZ19lcnJvcigiQ2FuJ3QgYWRkIG1pcnJvciB0byBvdXQtb2Ytc3luYyBtaXJyb3JlZCAiCisJCQkJICAiTFY6IHVzZSBsdmNoYW5nZSAtLXJlc3luYyBmaXJzdC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogV2UgYWxsb3cgc25hcHNob3RzIG9mIG1pcnJvcnMsIGJ1dCBmb3Igbm93LCB3ZQorCQkgKiBkbyBub3QgYWxsb3cgdXAgY29udmVydGluZyBtaXJyb3JzIHRoYXQgYXJlIHVuZGVyCisJCSAqIHNuYXBzaG90cy4gIFRoZSBsYXllcmluZyBsb2dpYyBpcyBzb21ld2hhdCBjb21wbGV4LAorCQkgKiBhbmQgcHJlbGltaW5hcnkgdGVzdCBzaG93IHRoYXQgdGhlIGNvbnZlcnNpb24gY2FuJ3QKKwkJICogc2VlbSB0byBnZXQgdGhlIGNvcnJlY3QgJSdhZ2Ugb2YgY29tcGxldGlvbi4KKwkJICovCisJCWlmIChsdl9pc19vcmlnaW4obHYpKSB7CisJCQlsb2dfZXJyb3IoIkNhbid0IGFkZCBhZGRpdGlvbmFsIG1pcnJvciBpbWFnZXMgdG8gIgorCQkJCSAgIm1pcnJvcnMgdGhhdCBhcmUgdW5kZXIgc25hcHNob3RzLCIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBJcyB0aGVyZSBhbHJlYWR5IGEgY29udmVydCBpbiBwcm9ncmVzcz8gIFdlIGRvIG5vdAorCQkgKiBjdXJyZW50bHkgYWxsb3cgbW9yZSB0aGFuIG9uZS4KKwkJICovCisJCWlmIChmaW5kX3RlbXBvcmFyeV9taXJyb3IobHYpIHx8IGx2X2lzX2NvbnZlcnRpbmcobHYpKSB7CisJCQlsb2dfZXJyb3IoIiVzIGlzIGFscmVhZHkgYmVpbmcgY29udmVydGVkLiAgVW5hYmxlIHRvIHN0YXJ0IGFub3RoZXIgY29udmVyc2lvbi4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogTG9nIGFkZGl0aW9uL3JlbW92YWwgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHRoZSBsYXllcgorCQkgKiBpbnNlcnRpb24gdG8gbWFrZSB0aGUgZW5kIHJlc3VsdCBjb25zaXN0ZW50IHdpdGgKKwkJICogbGluZWFyLXRvLW1pcnJvciBjb252ZXJzaW9uLgorCQkgKi8KKwkJaWYgKCFfbHZfdXBkYXRlX2xvZ190eXBlKGNtZCwgbHAsIGx2LAorCQkJCQkgb3BlcmFibGVfcHZzLCBuZXdfbG9nX2NvdW50KSkKKwkJCXJldHVybl8wOworCisJCS8qIEluc2VydCBhIHRlbXBvcmFyeSBsYXllciBmb3Igc3luY2luZywKKwkJICogb25seSBpZiB0aGUgb3JpZ2luYWwgbHYgaXMgdXNpbmcgZGlzayBsb2cuICovCisJCWlmIChzZWctPmxvZ19sdiAmJiAhX2luc2VydF9sdmNvbnZlcnRfbGF5ZXIoY21kLCBsdikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluc2VydCByZXN5bmMgbGF5ZXIuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEZJWE1FOiBjYW4ndCBoYXZlIG11bHRpcGxlIG1sb2dzLiBmb3JjZSBjb3JlbG9nLiAqLworCQlpZiAoIWx2X2FkZF9taXJyb3JzKGNtZCwgbHYsCisJCQkJICAgIG5ld19taW1hZ2VfY291bnQgLSBvbGRfbWltYWdlX2NvdW50LAorCQkJCSAgICBscC0+c3RyaXBlcywgbHAtPnN0cmlwZV9zaXplLAorCQkJCSAgICByZWdpb25fc2l6ZSwgMFUsIG9wZXJhYmxlX3B2cywgbHAtPmFsbG9jLAorCQkJCSAgICBNSVJST1JfQllfTFYpKSB7CisJCQlsYXllcl9sdiA9IHNlZ19sdihmaXJzdF9zZWcobHYpLCAwKTsKKwkJCWlmICghcmVtb3ZlX2xheWVyX2Zyb21fbHYobHYsIGxheWVyX2x2KSB8fAorCQkJICAgIChsdl9pc19hY3RpdmUobGF5ZXJfbHYpICYmCisJCQkgICAgICFkZWFjdGl2YXRlX2x2KGNtZCwgbGF5ZXJfbHYpKSB8fAorCQkJICAgICFsdl9yZW1vdmUobGF5ZXJfbHYpIHx8ICF2Z193cml0ZShsdi0+dmcpIHx8CisJCQkgICAgIXZnX2NvbW1pdChsdi0+dmcpKSB7CisJCQkJbG9nX2Vycm9yKCJBQk9SVElORzogRmFpbGVkIHRvIHJlbW92ZSAiCisJCQkJCSAgInRlbXBvcmFyeSBtaXJyb3IgbGF5ZXIgJXMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsYXllcl9sdikpOworCQkJCWxvZ19lcnJvcigiTWFudWFsIGNsZWFudXAgd2l0aCB2Z2NmZ3Jlc3RvcmUgIgorCQkJCQkgICJhbmQgZG1zZXR1cCBtYXkgYmUgcmVxdWlyZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXJldHVybl8wOworCQl9CisJCWlmIChzZWctPmxvZ19sdikKKwkJCWx2LT5zdGF0dXMgfD0gQ09OVkVSVElORzsKKwkJbHAtPm5lZWRfcG9sbGluZyA9IDE7CisKKwkJZ290byBvdXRfc2tpcF9sb2dfY29udmVydDsKKwl9CisKKwkvKgorCSAqIERvd24tY29udmVydCAocmVkdWNlICMgb2YgbWltYWdlcykuCisJICovCisJaWYgKG5ld19taW1hZ2VfY291bnQgPCBvbGRfbWltYWdlX2NvdW50KSB7CisJCXVpbnQzMl90IG5tYyA9IG9sZF9taW1hZ2VfY291bnQgLSBuZXdfbWltYWdlX2NvdW50OworCQl1aW50MzJfdCBubGMgPSAoIW5ld19sb2dfY291bnQgfHwgbHAtPm1pcnJvcnMgPT0gMSkgPyAxVSA6IDBVOworCisJCS8qIEZJWE1FOiBXaHkgZGlkIG5sYyB1c2VkIHRvIGJlIGNhbGN1bGF0ZWQgdGhhdCB3YXk/ICovCisKKwkJLyogUmVkdWNlIG51bWJlciBvZiBtaXJyb3JzICovCisJCWlmIChscC0+a2VlcF9taW1hZ2VzKSB7CisJCQlpZiAobHAtPnRyYWNrX2NoYW5nZXMpIHsKKwkJCQlsb2dfZXJyb3IoIi0tdHJhY2tjaGFuZ2VzIGlzIG5vdCBhdmFpbGFibGUgIgorCQkJCQkgICJ0byAnbWlycm9yJyBzZWdtZW50IHR5cGUuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIWx2X3NwbGl0X21pcnJvcl9pbWFnZXMobHYsIGxwLT5sdl9zcGxpdF9uYW1lLAorCQkJCQkJICAgIG5tYywgb3BlcmFibGVfcHZzKSkKKwkJCQlyZXR1cm5fMDsKKwkJfSBlbHNlIGlmICghbHZfcmVtb3ZlX21pcnJvcnMoY21kLCBsdiwgbm1jLCBubGMsCisJCQkJCSAgICAgIGlzX21pcnJvcl9pbWFnZV9yZW1vdmFibGUsIG9wZXJhYmxlX3B2cywgMCkpCisJCQlyZXR1cm5fMDsKKworCQlnb3RvIG91dDsgLyogSnVzdCBpbiBjYXNlIHNvbWVvbmUgcHV0cyBjb2RlIGJldHdlZW4gKi8KKwl9CisKK291dDoKKwkvKgorCSAqIENvbnZlcnRpbmcgdGhlIGxvZyB0eXBlCisJICovCisJaWYgKGx2X2lzX21pcnJvcmVkKGx2KSAmJiAob2xkX2xvZ19jb3VudCAhPSBuZXdfbG9nX2NvdW50KSkgeworCQlpZiAoIV9sdl91cGRhdGVfbG9nX3R5cGUoY21kLCBscCwgbHYsCisJCQkJCSBvcGVyYWJsZV9wdnMsIG5ld19sb2dfY291bnQpKQorCQkJcmV0dXJuXzA7CisJfQorCitvdXRfc2tpcF9sb2dfY29udmVydDoKKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitpbnQgbWlycm9yX3JlbW92ZV9taXNzaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGRtX2xpc3QgKmZhaWxlZF9wdnM7CisJaW50IGxvZ19jb3VudCA9IF9nZXRfbG9nX2NvdW50KGx2KSAtIF9mYWlsZWRfbG9nc19jb3VudChsdik7CisKKwlpZiAoIShmYWlsZWRfcHZzID0gX2ZhaWxlZF9wdl9saXN0KGx2LT52ZykpKQorCQlyZXR1cm5fMDsKKworCWlmIChmb3JjZSAmJiBfZmFpbGVkX21pcnJvcnNfY291bnQobHYpID09IChpbnQpbHZfbWlycm9yX2NvdW50KGx2KSkgeworCQlsb2dfZXJyb3IoIk5vIHVzYWJsZSBpbWFnZXMgbGVmdCBpbiAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gbHZfcmVtb3ZlX3dpdGhfZGVwZW5kZW5jaWVzKGNtZCwgbHYsIERPTlRfUFJPTVBULCAwKTsKKwl9CisKKwkvKgorCSAqIFdlIG11c3QgYWRqdXN0IHRoZSBsb2cgZmlyc3QsIG9yIHRoZSBlbnRpcmUgbWlycm9yCisJICogd2lsbCBnZXQgc3R1Y2sgZHVyaW5nIGEgc3VzcGVuZC4KKwkgKi8KKwlpZiAoIV9sdl91cGRhdGVfbWlycm9yZWRfbG9nKGx2LCBmYWlsZWRfcHZzLCBsb2dfY291bnQpKQorCQlyZXR1cm5fMDsKKworCWlmIChfZmFpbGVkX21pcnJvcnNfY291bnQobHYpID4gMCAmJgorCSAgICAhbHZfcmVtb3ZlX21pcnJvcnMoY21kLCBsdiwgX2ZhaWxlZF9taXJyb3JzX2NvdW50KGx2KSwKKwkJCSAgICAgICBsb2dfY291bnQgPyAwVSA6IDFVLAorCQkJICAgICAgIF9pc19wYXJ0aWFsX2x2LCBOVUxMLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfaXNfbWlycm9yZWQobHYpICYmCisJICAgICFfbHZfdXBkYXRlX2xvZ190eXBlKGNtZCwgTlVMTCwgbHYsIGZhaWxlZF9wdnMsIGxvZ19jb3VudCkpCisJCXJldHVybl8wOworCisJaWYgKCFsdl91cGRhdGVfYW5kX3JlbG9hZChsdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfbHZjb252ZXJ0X21pcnJvcnNfcmVwYWlyCisgKgorICogVGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBpbiB0d28gcGhhc2VzLiAgRmlyc3QsIGFsbCBvZiB0aGUgYmFkCisgKiBkZXZpY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIG1pcnJvci4gIFRoZW4sIGlmIGRlc2lyZWQgYnkgdGhlCisgKiB1c2VyLCB0aGUgZGV2aWNlcyBhcmUgcmVwbGFjZWQuCisgKgorICogJ29sZF9taW1hZ2VfY291bnQnIGFuZCAnb2xkX2xvZ19jb3VudCcgYXJlIHRoZXJlIHNvIHdlIGtub3cKKyAqIHdoYXQgdG8gY29udmVydCB0byBhZnRlciB0aGUgcmVtb3ZhbCBvZiBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfbWlycm9yc19yZXBhaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWludCBmYWlsZWRfbG9nczsKKwlpbnQgZmFpbGVkX21pbWFnZXM7CisJaW50IHJlcGxhY2VfbG9ncyA9IDA7CisJaW50IHJlcGxhY2VfbWltYWdlcyA9IDA7CisJdWludDMyX3QgbG9nX2NvdW50OworCisJdWludDMyX3Qgb3JpZ2luYWxfbWltYWdlcyA9IGx2X21pcnJvcl9jb3VudChsdik7CisJdWludDMyX3Qgb3JpZ2luYWxfbG9ncyA9IF9nZXRfbG9nX2NvdW50KGx2KTsKKworCWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IDE7CisJY21kLT5wYXJ0aWFsX2FjdGl2YXRpb24gPSAxOworCWxwLT5uZWVkX3BvbGxpbmcgPSAwOworCisJbHZfY2hlY2tfdHJhbnNpZW50KGx2KTsgLyogVE9ETyBjaGVjayB0aGlzIGluIGxpYiBmb3IgYWxsIGNvbW1hbmRzPyAqLworCisJaWYgKCFsdl9pc19wYXJ0aWFsKGx2KSkgeworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVm9sdW1lICVzIGlzIGNvbnNpc3RlbnQuIE5vdGhpbmcgdG8gcmVwYWlyLiIsCisJCQkJCWRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAxOworCX0KKworCWZhaWxlZF9taW1hZ2VzID0gX2ZhaWxlZF9taXJyb3JzX2NvdW50KGx2KTsKKwlmYWlsZWRfbG9ncyA9IF9mYWlsZWRfbG9nc19jb3VudChsdik7CisKKwlpZiAoIW1pcnJvcl9yZW1vdmVfbWlzc2luZyhjbWQsIGx2LCAwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoZmFpbGVkX21pbWFnZXMpCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJNaXJyb3Igc3RhdHVzOiAlZCBvZiAlZCBpbWFnZXMgZmFpbGVkLiIsCisJCQkJCWZhaWxlZF9taW1hZ2VzLCBvcmlnaW5hbF9taW1hZ2VzKTsKKworCS8qCisJICogQ291bnQgdGhlIGZhaWxlZCBsb2cgZGV2aWNlcworCSAqLworCWlmIChmYWlsZWRfbG9ncykKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIk1pcnJvciBsb2cgc3RhdHVzOiAlZCBvZiAlZCBpbWFnZXMgZmFpbGVkLiIsCisJCQkJCWZhaWxlZF9sb2dzLCBvcmlnaW5hbF9sb2dzKTsKKworCS8qCisJICogRmluZCBvdXQgb3VyIHBvbGljaWVzCisJICovCisJX2x2Y29udmVydF9taXJyb3JzX3JlcGFpcl9hc2soY21kLCBmYWlsZWRfbG9ncywgZmFpbGVkX21pbWFnZXMsCisJCQkJICAgICAgJnJlcGxhY2VfbG9ncywgJnJlcGxhY2VfbWltYWdlcyk7CisKKwkvKgorCSAqIFNlY29uZCBwaGFzZSAtIHJlcGxhY2UgZmF1bHR5IGRldmljZXMKKwkgKi8KKwlscC0+bWlycm9ycyA9IHJlcGxhY2VfbWltYWdlcyA/IG9yaWdpbmFsX21pbWFnZXMgOiAob3JpZ2luYWxfbWltYWdlcyAtIGZhaWxlZF9taW1hZ2VzKTsKKworCS8qCisJICogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byByZXBsYWNlIHRoZSBsb2cgaWYgdGhlIHZvbHVtZSBpcyBubyBsb25nZXIKKwkgKiBhIG1pcnJvci4KKwkgKi8KKwlpZiAobHAtPm1pcnJvcnMgPT0gMSkKKwkJcmVwbGFjZV9sb2dzID0gMDsKKworCWxvZ19jb3VudCA9IHJlcGxhY2VfbG9ncyA/IG9yaWdpbmFsX2xvZ3MgOiAob3JpZ2luYWxfbG9ncyAtIGZhaWxlZF9sb2dzKTsKKworCXdoaWxlIChyZXBsYWNlX21pbWFnZXMgfHwgcmVwbGFjZV9sb2dzKSB7CisJCWxvZ193YXJuKCJUcnlpbmcgdG8gdXAtY29udmVydCB0byAlZCBpbWFnZXMsICVkIGxvZ3MuIiwgbHAtPm1pcnJvcnMsIGxvZ19jb3VudCk7CisJCWlmIChfbHZjb252ZXJ0X21pcnJvcnNfYXV4KGNtZCwgbHYsIGxwLCBOVUxMLAorCQkJCQkgICBscC0+bWlycm9ycywgbG9nX2NvdW50KSkKKwkJCWJyZWFrOworCQlpZiAobHAtPm1pcnJvcnMgPiAyKQorCQkJLS1scC0+bWlycm9yczsKKwkJZWxzZSBpZiAobG9nX2NvdW50ID4gMCkKKwkJCS0tbG9nX2NvdW50OworCQllbHNlCisJCQlicmVhazsgLyogbm93aGVyZSB0byBnbywgYW55bW9yZS4uLiAqLworCX0KKworCWlmIChyZXBsYWNlX21pbWFnZXMgJiYgbHZfbWlycm9yX2NvdW50KGx2KSAhPSBvcmlnaW5hbF9taW1hZ2VzKQorCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHJlcGxhY2UgJWQgb2YgJWQgaW1hZ2VzIGluIHZvbHVtZSAlcy4iLAorCQkJIG9yaWdpbmFsX21pbWFnZXMgLSBsdl9taXJyb3JfY291bnQobHYpLCBvcmlnaW5hbF9taW1hZ2VzLAorCQkJIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJaWYgKHJlcGxhY2VfbG9ncyAmJiBfZ2V0X2xvZ19jb3VudChsdikgIT0gb3JpZ2luYWxfbG9ncykKKwkJbG9nX3dhcm4oIldBUk5JTkc6IEZhaWxlZCB0byByZXBsYWNlICVkIG9mICVkIGxvZ3MgaW4gdm9sdW1lICVzLiIsCisJCQkgb3JpZ2luYWxfbG9ncyAtIF9nZXRfbG9nX2NvdW50KGx2KSwgb3JpZ2luYWxfbG9ncywKKwkJCSBkaXNwbGF5X2x2bmFtZShsdikpOworCisJLyogaWYgKCFhcmdfaXNfc2V0KGNtZCwgdXNlX3BvbGljaWVzX0FSRykgJiYgKGxwLT5taXJyb3JzICE9IG9sZF9taW1hZ2VfY291bnQKKwkJCQkJCSAgfHwgbG9nX2NvdW50ICE9IG9sZF9sb2dfY291bnQpKQorCQkJCQkJICByZXR1cm4gMDsgKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfdmFsaWRhdGVfdGhpbihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJaWYgKCFsdl9pc190aGluX3Bvb2wobHYpICYmICFsdl9pc190aGluX3ZvbHVtZShsdikpCisJCXJldHVybiAxOworCisJbG9nX2Vycm9yKCJDb252ZXJ0aW5nIHRoaW4lcyBzZWdtZW50IHR5cGUgZm9yICVzIHRvICVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwKKwkJICBsdl9pc190aGluX3Bvb2wobHYpID8gIiBwb29sIiA6ICIiLAorCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHAtPnNlZ3R5cGUtPm5hbWUpOworCisJaWYgKGx2X2lzX3RoaW5fdm9sdW1lKGx2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBHaXZlIGFkdmljZSBmb3IgdGhpbiBwb29sIGNvbnZlcnNpb24gKi8KKwlsb2dfZXJyb3IoIkZvciBwb29sIGRhdGEgdm9sdW1lIGNvbnZlcnNpb24gdXNlICVzLiIsCisJCSAgZGlzcGxheV9sdm5hbWUoc2VnX2x2KGZpcnN0X3NlZyhsdiksIDApKSk7CisJbG9nX2Vycm9yKCJGb3IgcG9vbCBtZXRhZGF0YSB2b2x1bWUgY29udmVyc2lvbiB1c2UgJXMuIiwKKwkJICBkaXNwbGF5X2x2bmFtZShmaXJzdF9zZWcobHYpLT5tZXRhZGF0YV9sdikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBfbHZjb252ZXJ0X21pcnJvcnMKKyAqCisgKiBEZXRlcm1pbmUgd2hhdCBpcyBiZWluZyBkb25lLiAgQXJlIHdlIGRvaW5nIGEgY29udmVyc2lvbiwgcmVwYWlyLCBvcgorICogY29sbGFwc2luZyBhIHN0YWNrPyAgT25jZSBkZXRlcm1pbmVkLCBjYWxsIGhlbHBlciBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgX2x2Y29udmVydF9taXJyb3JzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwljb25zdCBjaGFyICpuZXdfdHlwZTsKKwl1aW50MzJfdCBvbGRfbWltYWdlX2NvdW50OworCXVpbnQzMl90IG9sZF9sb2dfY291bnQ7CisJdWludDMyX3QgbmV3X21pbWFnZV9jb3VudDsKKwl1aW50MzJfdCBuZXdfbG9nX2NvdW50OworCisJaWYgKGxwLT5tZXJnZV9taXJyb3IpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gbWVyZ2UgbWlycm9yIGltYWdlcyIKKwkJCSAgIm9mIHNlZ21lbnQgdHlwZSAnbWlycm9yJy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfbHZjb252ZXJ0X3ZhbGlkYXRlX3RoaW4obHYsIGxwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfaXNfdGhpbl90eXBlKGx2KSkgeworCQlsb2dfZXJyb3IoIk1pcnJvciBzZWdtZW50IHR5cGUgY2Fubm90IGJlIHVzZWQgZm9yIHRoaW5wb29sJXMuXG4iCisJCQkgICJUcnkgXCIlc1wiIHNlZ21lbnQgdHlwZSBpbnN0ZWFkLiIsCisJCQkgIGx2X2lzX3RoaW5fcG9vbF9kYXRhKGx2KSA/ICJzIiA6ICIgbWV0YWRhdGEiLAorCQkJICBTRUdfVFlQRV9OQU1FX1JBSUQxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2NhY2hlX3R5cGUobHYpKSB7CisJCWxvZ19lcnJvcigiTWlycm9ycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgb24gY2FjaGUgTFZzICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgobmV3X3R5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpKSAmJgorCSAgICAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykgJiYgKGFyZ191aW50X3ZhbHVlKGNtZCwgbWlycm9yc19BUkcsIDApICE9IDApKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IG1pcnJvcnMgd2l0aCBsaW5lYXIgdHlwZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxwLT5taXJyb3JzX3N1cHBsaWVkID0gMTsKKwkJbHAtPm1pcnJvcnMgPSAwOworCX0KKworCS8qIEFkanVzdCBtaW1hZ2UgYW5kL29yIGxvZyBjb3VudCAqLworCWlmICghX2x2Y29udmVydF9taXJyb3JzX3BhcnNlX3BhcmFtcyhjbWQsIGx2LCBscCwKKwkJCQkJICAgICAmb2xkX21pbWFnZV9jb3VudCwgJm9sZF9sb2dfY291bnQsCisJCQkJCSAgICAgJm5ld19taW1hZ2VfY291bnQsICZuZXdfbG9nX2NvdW50KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKChvbGRfbWltYWdlX2NvdW50IDwgbmV3X21pbWFnZV9jb3VudCAmJiBvbGRfbG9nX2NvdW50ID4gbmV3X2xvZ19jb3VudCkgfHwKKwkgICAgIChvbGRfbWltYWdlX2NvdW50ID4gbmV3X21pbWFnZV9jb3VudCAmJiBvbGRfbG9nX2NvdW50IDwgbmV3X2xvZ19jb3VudCkpICYmCisJICAgIGxwLT5wdl9jb3VudCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBib3RoIGFsbG9jYXRlIGFuZCBmcmVlIGV4dGVudHMgd2hlbiAiCisJCQkgICJzcGVjaWZ5aW5nIHBoeXNpY2FsIHZvbHVtZXMgdG8gdXNlLiIpOworCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IHRoZSBvcGVyYXRpb24gaW4gdHdvIHN0ZXBzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3RoaW5nIHRvIGRvPyAgKFByb2JhYmx5IGZpbmlzaGluZyBjb2xsYXBzZS4pICovCisJaWYgKChvbGRfbWltYWdlX2NvdW50ID09IG5ld19taW1hZ2VfY291bnQpICYmCisJICAgIChvbGRfbG9nX2NvdW50ID09IG5ld19sb2dfY291bnQpICYmICFscC0+cmVwYWlyKQorCQlyZXR1cm4gMTsKKworCWlmIChscC0+cmVwYWlyKQorCQlyZXR1cm4gX2x2Y29udmVydF9taXJyb3JzX3JlcGFpcihjbWQsIGx2LCBscCk7CisKKwlpZiAoIV9sdmNvbnZlcnRfbWlycm9yc19hdXgoY21kLCBsdiwgbHAsIE5VTEwsCisJCQkJICAgIG5ld19taW1hZ2VfY291bnQsIG5ld19sb2dfY291bnQpKQorCQlyZXR1cm4gMDsKKworCWlmICghbHAtPm5lZWRfcG9sbGluZykKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkxvZ2ljYWwgdm9sdW1lICVzIGNvbnZlcnRlZC4iLAorCQkJCQlkaXNwbGF5X2x2bmFtZShsdikpOworCisJYmFja3VwKGx2LT52Zyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaXNfdmFsaWRfcmFpZF9jb252ZXJzaW9uKGNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKmZyb21fc2VndHlwZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqdG9fc2VndHlwZSkKK3sKKwlpZiAoZnJvbV9zZWd0eXBlID09IHRvX3NlZ3R5cGUpCisJCXJldHVybiAxOworCisJLyogU3VwcG9ydCByYWlkMCA8LT4gc3RyaXBlZCBjb252ZXJzaW9ucyAqLworCWlmIChzZWd0eXBlX2lzX3N0cmlwZWQoZnJvbV9zZWd0eXBlKSAmJiBzZWd0eXBlX2lzX3N0cmlwZWQodG9fc2VndHlwZSkpCisJCXJldHVybiAxOworCisJaWYgKCFzZWd0eXBlX2lzX3JhaWQoZnJvbV9zZWd0eXBlKSAmJiAhc2VndHlwZV9pc19yYWlkKHRvX3NlZ3R5cGUpKQorCQlyZXR1cm5fMDsgIC8qIE5vdCBjb252ZXJ0aW5nIHRvIG9yIGZyb20gUkFJRD8gKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfbHZjb252ZXJ0X3JhaWRfcmVwYWlyX2FzayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwLAorCQkJCSAgICAgICBpbnQgKnJlcGxhY2VfZGV2KQoreworCWNvbnN0IGNoYXIgKmRldl9wb2xpY3k7CisKKwkqcmVwbGFjZV9kZXYgPSAxOworCisJaWYgKGFyZ19pc19zZXQoY21kLCB1c2Vwb2xpY2llc19BUkcpKSB7CisJCWRldl9wb2xpY3kgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGFjdGl2YXRpb25fcmFpZF9mYXVsdF9wb2xpY3lfQ0ZHLCBOVUxMKTsKKworCQlpZiAoIXN0cmNtcChkZXZfcG9saWN5LCAiYWxsb2NhdGUiKSB8fAorCQkgICAgIXN0cmNtcChkZXZfcG9saWN5LCAicmVwbGFjZSIpKQorCQkJcmV0dXJuOworCisJCS8qIGVsc2UgaWYgKCFzdHJjbXAoZGV2X3BvbGljeSwgImFueXRoaW5nX2Vsc2UiKSkgLS0gbm8gcmVwbGFjZSAqLworCQkqcmVwbGFjZV9kZXYgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKCFscC0+eWVzICYmCisJICAgIHllc19ub19wcm9tcHQoIkF0dGVtcHQgdG8gcmVwbGFjZSBmYWlsZWQgUkFJRCBpbWFnZXMgIgorCQkJICAiKHJlcXVpcmVzIGZ1bGwgZGV2aWNlIHJlc3luYyk/IFt5L25dOiAiKSA9PSAnbicpIHsKKwkJKnJlcGxhY2VfZGV2ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF9yYWlkKHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwljb25zdCBjaGFyICpuZXdfdHlwZTsKKwlpbnQgcmVwbGFjZSA9IDAsIGltYWdlX2NvdW50ID0gMDsKKwlzdHJ1Y3QgZG1fbGlzdCAqZmFpbGVkX3B2czsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IGx2LT52Zy0+Y21kOworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCWRtX3BlcmNlbnRfdCBzeW5jX3BlcmNlbnQ7CisKKwlpZiAoIWxwLT5zZWd0eXBlKQorCQlscC0+c2VndHlwZSA9IHNlZy0+c2VndHlwZTsKKworCWlmICgobmV3X3R5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpKSAmJgorCSAgICAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykgJiYgKGFyZ191aW50X3ZhbHVlKGNtZCwgbWlycm9yc19BUkcsIDApICE9IDApKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IG1pcnJvcnMgd2l0aCBsaW5lYXIgdHlwZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxwLT5taXJyb3JzX3N1cHBsaWVkID0gMTsKKwkJbHAtPm1pcnJvcnMgPSAwOworCX0KKworCS8qIENhbiBvbmx5IGNoYW5nZSBpbWFnZSBjb3VudCBmb3IgcmFpZDEgYW5kIGxpbmVhciAqLworCWlmIChscC0+bWlycm9yc19zdXBwbGllZCAmJiAhc2VnX2lzX21pcnJvcmVkKHNlZykgJiYgIXNlZ19pc19saW5lYXIoc2VnKSkgeworCQlsb2dfZXJyb3IoIictLW1pcnJvcnMvLW0nIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggJXMuIiwKKwkJCSAgbHZzZWdfbmFtZShzZWcpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfbHZjb252ZXJ0X3ZhbGlkYXRlX3RoaW4obHYsIGxwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIV9pc192YWxpZF9yYWlkX2NvbnZlcnNpb24oc2VnLT5zZWd0eXBlLCBscC0+c2VndHlwZSkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY29udmVydCAlcyBmcm9tICVzIHRvICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgbHZzZWdfbmFtZShzZWcpLAorCQkJICBscC0+c2VndHlwZS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWdfaXNfbGluZWFyKHNlZykgJiYgIWxwLT5tZXJnZV9taXJyb3IgJiYgIWxwLT5taXJyb3JzX3N1cHBsaWVkKSB7CisJCWxvZ19lcnJvcigiUmFpZCBjb252ZXJzaW9ucyByZXF1aXJlIC1tLy0tbWlycm9ycy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hhbmdlIG51bWJlciBvZiBSQUlEMSBpbWFnZXMgKi8KKwlpZiAobHAtPm1pcnJvcnNfc3VwcGxpZWQgfHwgbHAtPmtlZXBfbWltYWdlcykgeworCQlpbWFnZV9jb3VudCA9IGx2X3JhaWRfaW1hZ2VfY291bnQobHYpOworCQlpZiAobHAtPm1pcnJvcnNfc2lnbiA9PSBTSUdOX1BMVVMpCisJCQlpbWFnZV9jb3VudCArPSBscC0+bWlycm9yczsKKwkJZWxzZSBpZiAobHAtPm1pcnJvcnNfc2lnbiA9PSBTSUdOX01JTlVTKQorCQkJaW1hZ2VfY291bnQgLT0gbHAtPm1pcnJvcnM7CisJCWVsc2UKKwkJCWltYWdlX2NvdW50ID0gbHAtPm1pcnJvcnMgKyAxOworCisJCWlmIChpbWFnZV9jb3VudCA8IDEpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvICVzIGltYWdlcyBieSBzcGVjaWZpZWQgYW1vdW50LiIsCisJCQkJICBscC0+a2VlcF9taW1hZ2VzID8gInNwbGl0IiA6ICJyZWR1Y2UiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogLS10cmFja2NoYW5nZXMgcmVxdWlyZXMgLS1zcGxpdG1pcnJvcnMgd2hpY2ggYWx3YXlzIGhhcyBTSUdOX01JTlVTICovCisJCWlmIChscC0+dHJhY2tfY2hhbmdlcyAmJiBscC0+bWlycm9ycyAhPSAxKSB7CisJCQlsb2dfZXJyb3IoIkV4YWN0bHkgb25lIGltYWdlIG11c3QgYmUgc3BsaXQgb2ZmIGZyb20gJXMgd2hlbiB0cmFja2luZyBjaGFuZ2VzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAobHAtPm1lcmdlX21pcnJvcikKKwkJcmV0dXJuIGx2X3JhaWRfbWVyZ2UobHYpOworCisJaWYgKGxwLT50cmFja19jaGFuZ2VzKQorCQlyZXR1cm4gbHZfcmFpZF9zcGxpdF9hbmRfdHJhY2sobHYsIGxwLT5wdmgpOworCisJaWYgKGxwLT5rZWVwX21pbWFnZXMpCisJCXJldHVybiBsdl9yYWlkX3NwbGl0KGx2LCBscC0+bHZfc3BsaXRfbmFtZSwgaW1hZ2VfY291bnQsIGxwLT5wdmgpOworCisJaWYgKGxwLT5taXJyb3JzX3N1cHBsaWVkKQorCQlyZXR1cm4gbHZfcmFpZF9jaGFuZ2VfaW1hZ2VfY291bnQobHYsIGltYWdlX2NvdW50LCBscC0+cHZoKTsKKworCWlmICgoc2VnX2lzX2xpbmVhcihzZWcpIHx8IHNlZ19pc19zdHJpcGVkKHNlZykgfHwgc2VnX2lzX21pcnJvcmVkKHNlZykgfHwgbHZfaXNfcmFpZChsdikpICYmCisJICAgIChscC0+dHlwZV9zdHIgJiYgbHAtPnR5cGVfc3RyWzBdKSkgeworCQlpZiAoc2VndHlwZV9pc19hbnlfcmFpZDAobHAtPnNlZ3R5cGUpICYmCisJCSAgICAhKGxwLT50YXJnZXRfYXR0ciAmIFJBSURfRkVBVFVSRV9SQUlEMCkpIHsKKwkJCWxvZ19lcnJvcigiUkFJRCBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBSQUlEMC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghbHZfcmFpZF9jb252ZXJ0KGx2LCBscC0+c2VndHlwZSwgbHAtPnllcywgbHAtPmZvcmNlLCBscC0+c3RyaXBlcywgbHAtPnN0cmlwZV9zaXplLCBscC0+cHZoKSkKKwkJCXJldHVybl8wOworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZC4iLAorCQkJCQlkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobHAtPnJlcGxhY2UpCisJCXJldHVybiBsdl9yYWlkX3JlcGxhY2UobHYsIGxwLT5yZXBsYWNlX3B2aCwgbHAtPnB2aCk7CisKKwlpZiAobHAtPnJlcGFpcikgeworCQlpZiAoIWx2X2lzX2FjdGl2ZV9leGNsdXNpdmVfbG9jYWxseShsdl9sb2NrX2hvbGRlcihsdikpKSB7CisJCQlsb2dfZXJyb3IoIiVzIG11c3QgYmUgYWN0aXZlICVzdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbi4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpLAorCQkJCSAgdmdfaXNfY2x1c3RlcmVkKGx2LT52ZykgPworCQkJCSAgImV4Y2x1c2l2ZSBsb2NhbGx5ICIgOiAiIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc2VnX2lzX3N0cmlwZWQoc2VnKSAmJiAhc2VnX2lzX2FueV9yYWlkMChzZWcpICYmCisJCSAgICAhbHZfcmFpZF9wZXJjZW50KGx2LCAmc3luY19wZXJjZW50KSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHN5bmMgc3RhdHVzIG9mICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoc3luY19wZXJjZW50ICE9IERNX1BFUkNFTlRfMTAwKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogJXMgaXMgbm90IGluLXN5bmMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBQb3J0aW9ucyBvZiB0aGUgYXJyYXkgbWF5IGJlIHVucmVjb3ZlcmFibGUuIik7CisKKwkJCS8qCisJCQkgKiBUaGUga2VybmVsIHdpbGwgbm90IGFsbG93IGEgZGV2aWNlIHRvIGJlIHJlcGxhY2VkCisJCQkgKiBpbiBhbiBhcnJheSB0aGF0IGlzIG5vdCBpbi1zeW5jIHVubGVzcyB3ZSBvdmVycmlkZQorCQkJICogYnkgZm9yY2luZyB0aGUgYXJyYXkgdG8gYmUgY29uc2lkZXJlZCAiaW4tc3luYyIuCisJCQkgKi8KKwkJCWluaXRfbWlycm9yX2luX3N5bmMoMSk7CisJCX0KKworCQlfbHZjb252ZXJ0X3JhaWRfcmVwYWlyX2FzayhjbWQsIGxwLCAmcmVwbGFjZSk7CisKKwkJaWYgKHJlcGxhY2UpIHsKKwkJCWlmICghKGZhaWxlZF9wdnMgPSBfZmFpbGVkX3B2X2xpc3QobHYtPnZnKSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmICghbHZfcmFpZF9yZXBsYWNlKGx2LCBmYWlsZWRfcHZzLCBscC0+cHZoKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlcGxhY2UgZmF1bHR5IGRldmljZXMgaW4gJXMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiRmF1bHR5IGRldmljZXMgaW4gJXMgc3VjY2Vzc2Z1bGx5IHJlcGxhY2VkLiIsCisJCQkJCQlkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiAid2FybiIgaWYgcG9saWN5IG5vdCBzZXQgdG8gcmVwbGFjZSAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIHVzZXBvbGljaWVzX0FSRykpCisJCQlsb2dfd2FybigiVXNlICdsdmNvbnZlcnQgLS1yZXBhaXIgJXMnIHRvIHJlcGxhY2UgIgorCQkJCSAiZmFpbGVkIGRldmljZS4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlsb2dfZXJyb3IoIkNvbnZlcnNpb24gb3BlcmF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF9zcGxpdHNuYXBzaG90KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmNvdywKKwkJCQkgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gY293LT52ZzsKKwljb25zdCBjaGFyICpjb3dfbmFtZSA9IGRpc3BsYXlfbHZuYW1lKGNvdyk7CisKKwlpZiAoIWx2X2lzX2Nvdyhjb3cpKSB7CisJCWxvZ19lcnJvcigiJXMgaXMgbm90IGEgc25hcHNob3QuIiwgY293X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfb3JpZ2luKGNvdykgfHwgbHZfaXNfZXh0ZXJuYWxfb3JpZ2luKGNvdykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgTFYgJXMgdGhhdCBpcyBhIHNuYXBzaG90IG9yaWdpbi4iLCBjb3dfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19tZXJnaW5nX2Nvdyhjb3cpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNwbGl0IG9mZiBzbmFwc2hvdCAlcyBiZWluZyBtZXJnZWQgaW50byBpdHMgb3JpZ2luLiIsIGNvd19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3ZpcnR1YWxfb3JpZ2luKG9yaWdpbl9mcm9tX2Nvdyhjb3cpKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBzcGxpdCBvZmYgc25hcHNob3QgJXMgd2l0aCB2aXJ0dWFsIG9yaWdpbi4iLCBjb3dfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc190aGluX3Bvb2woY293KSB8fCBsdl9pc19wb29sX21ldGFkYXRhX3NwYXJlKGNvdykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgb2ZmIExWICVzIG5lZWRlZCBieSB0aGluIHZvbHVtZShzKS4iLCBjb3dfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfTURBUykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgb2ZmIHNuYXBzaG90ICVzIHVzaW5nIG9sZCBMVk0xLXN0eWxlIG1ldGFkYXRhLiIsIGNvd19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJLyogRklYTUU6IHdlIG5lZWQgdG8gY3JlYXRlIGEgbG9jayBmb3IgdGhlIG5ldyBMVi4gKi8KKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgc25hcHNob3RzIGluIFZHIHdpdGggbG9ja190eXBlICVzLiIsIHZnLT5sb2NrX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZnX2NoZWNrX3N0YXR1cyh2ZywgTFZNX1dSSVRFKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfaXNfcHZtb3ZlKGNvdykgfHwgbHZfaXNfbWlycm9yX3R5cGUoY293KSB8fCBsdl9pc19yYWlkX3R5cGUoY293KSB8fCBsdl9pc190aGluX3R5cGUoY293KSkgeworCQlsb2dfZXJyb3IoIkxWICVzIHR5cGUgaXMgdW5zdXBwb3J0ZWQgd2l0aCAtLXNwbGl0c25hcHNob3QuIiwgY293X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfYWN0aXZlX2xvY2FsbHkoY293KSkgeworCQlpZiAoIWx2X2NoZWNrX25vdF9pbl91c2UoY293LCAxKSkKKwkJCXJldHVybl8wOworCisJCWlmICgobHAtPmZvcmNlID09IFBST01QVCkgJiYgIWxwLT55ZXMgJiYKKwkJICAgIGx2X2lzX3Zpc2libGUoY293KSAmJgorCQkgICAgbHZfaXNfYWN0aXZlKGNvdykpIHsKKwkJCWlmICh5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gc3BsaXQgb2ZmIGFjdGl2ZSAiCisJCQkJCSAgImxvZ2ljYWwgdm9sdW1lICVzPyBbeS9uXTogIiwgY293X25hbWUpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgbm90IHNwbGl0LiIsIGNvd19uYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmICghYXJjaGl2ZSh2ZykpCisJCXJldHVybl8wOworCisJbG9nX3ZlcmJvc2UoIlNwbGl0dGluZyBzbmFwc2hvdCAlcyBmcm9tIGl0cyBvcmlnaW4uIiwgY293X25hbWUpOworCisJaWYgKCF2Z19yZW1vdmVfc25hcHNob3QoY293KSkKKwkJcmV0dXJuXzA7CisKKwliYWNrdXAodmcpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkxvZ2ljYWwgVm9sdW1lICVzIHNwbGl0IGZyb20gaXRzIG9yaWdpbi4iLCBjb3dfbmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfc3BsaXRfY2FjaGVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpjYWNoZV9wb29sX2x2ID0gZmlyc3Rfc2VnKGx2KS0+cG9vbF9sdjsKKworCWxvZ19kZWJ1ZygiRGV0YWNoaW5nIGNhY2hlIHBvb2wgJXMgZnJvbSBjYWNoZWQgTFYgJXMuIiwKKwkJICBkaXNwbGF5X2x2bmFtZShjYWNoZV9wb29sX2x2KSwgZGlzcGxheV9sdm5hbWUobHYpKTsKKworCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWlmICghbHZfY2FjaGVfcmVtb3ZlKGx2KSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXZnX3dyaXRlKGx2LT52ZykgfHwgIXZnX2NvbW1pdChsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWJhY2t1cChsdi0+dmcpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIG5vdCBjYWNoZWQgYW5kIGNhY2hlIHBvb2wgJXMgaXMgdW51c2VkLiIsCisJCQkJZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShjYWNoZV9wb29sX2x2KSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjb252ZXJ0X3VuY2FjaGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpyZW1vdmVfbHY7CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKGx2KSkKKwkJbHYgPSBzZWdfbHYoZmlyc3Rfc2VnKGx2KSwgMCk7IC8qIGNhY2hlZCBfdGRhdGEgPyAqLworCisJaWYgKCFsdl9pc19jYWNoZShsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgdW5jYWNoZSBub24tY2FjaGVkIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCXNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwlpZiAobHZfaXNfcGFydGlhbChzZWdfbHYoc2VnLCAwKSkpIHsKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENhY2hlIG9yaWdpbiBsb2dpY2FsIHZvbHVtZSAlcyBpcyBtaXNzaW5nLiIsCisJCQkgZGlzcGxheV9sdm5hbWUoc2VnX2x2KHNlZywgMCkpKTsKKwkJcmVtb3ZlX2x2ID0gbHY7IC8qIFdoZW4gb3JpZ2luIGlzIG1pc3NpbmcsIGRyb3AgZXZlcnl0aGluZyAqLworCX0gZWxzZQorCQlyZW1vdmVfbHYgPSBzZWctPnBvb2xfbHY7CisKKwlpZiAobHZfaXNfcGFydGlhbChzZWdfbHYoZmlyc3Rfc2VnKHNlZy0+cG9vbF9sdiksIDApKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENhY2hlIHBvb2wgZGF0YSBsb2dpY2FsIHZvbHVtZSAlcyBpcyBtaXNzaW5nLiIsCisJCQkgZGlzcGxheV9sdm5hbWUoc2VnX2x2KGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpLCAwKSkpOworCisJaWYgKGx2X2lzX3BhcnRpYWwoZmlyc3Rfc2VnKHNlZy0+cG9vbF9sdiktPm1ldGFkYXRhX2x2KSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENhY2hlIHBvb2wgbWV0YWRhdGEgbG9naWNhbCB2b2x1bWUgJXMgaXMgbWlzc2luZy4iLAorCQkJIGRpc3BsYXlfbHZuYW1lKGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpLT5tZXRhZGF0YV9sdikpOworCisJLyogVE9ETzogQ2hlY2sgZm9yIGZhaWxlZCBjYWNoZSBhcyB3ZWxsIHRvIGdldCBwcm9tcHRpbmc/ICovCisJaWYgKGx2X2lzX3BhcnRpYWwobHYpKSB7CisJCWlmIChmaXJzdF9zZWcoc2VnLT5wb29sX2x2KS0+Y2FjaGVfbW9kZSAhPSBDQUNIRV9NT0RFX1dSSVRFVEhST1VHSCkgeworCQkJaWYgKCFscC0+Zm9yY2UpIHsKKwkJCQlsb2dfZXJyb3IoIkNvbnZlcnNpb24gYWJvcnRlZC4iKTsKKwkJCQlsb2dfZXJyb3IoIkNhbm5vdCB1bmNhY2hlIHdyaXRldGhyb3VnaCBjYWNoZSB2b2x1bWUgJXMgd2l0aG91dCAtLWZvcmNlLiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBVbmNhY2hpbmcgb2YgcGFydGlhbGx5IG1pc3Npbmcgd3JpdGV0aHJvdWdoIGNhY2hlIHZvbHVtZSAlcyBtaWdodCBkZXN0cm95IHlvdXIgZGF0YS4iLAorCQkJCSBkaXNwbGF5X2x2bmFtZShsdikpOworCQl9CisKKwkJaWYgKCFscC0+eWVzICYmCisJCSAgICB5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gdW5jYWNoZSAlcyB3aXRoIG1pc3NpbmcgTFZzPyBbeS9uXTogIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkNvbnZlcnNpb24gYWJvcnRlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IDE7CisJCWNtZC0+cGFydGlhbF9hY3RpdmF0aW9uID0gMTsKKwl9CisKKwlpZiAobHZyZW1vdmVfc2luZ2xlKGNtZCwgcmVtb3ZlX2x2LCBOVUxMKSAhPSBFQ01EX1BST0NFU1NFRCkKKwkJcmV0dXJuXzA7CisKKwlpZiAocmVtb3ZlX2x2ICE9IGx2KQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm90IGNhY2hlZC4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF9zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yZzsKKwljb25zdCBjaGFyICpzbmFwX25hbWUgPSBkaXNwbGF5X2x2bmFtZShsdik7CisKKwlpZiAobHZfaXNfY2FjaGVfdHlwZShsdikpIHsKKwkJbG9nX2Vycm9yKCJTbmFwc2hvdHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIHdpdGggY2FjaGUgdHlwZSBMVnMgJXMuIiwKKwkJCSAgc25hcF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX21pcnJvcmVkKGx2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0IG1pcnJvcmVkIExWICVzIGludG8gYSBzbmFwc2hvdC4iLCBzbmFwX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfb3JpZ2luKGx2KSkgeworCQkvKiBVbnN1cHBvcnRlZCBzdGFjayAqLworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0IG9yaWdpbiAlcyBpbnRvIGEgc25hcHNob3QuIiwgc25hcF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3Bvb2wobHYpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgcG9vbCBMVnMgJXMgaW50byBhIHNuYXBzaG90LiIsIHNuYXBfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKG9yZyA9IGZpbmRfbHYobHYtPnZnLCBscC0+b3JpZ2luX25hbWUpKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGZpbmQgb3JpZ2luIHZvbHVtZSAlcyBpbiBWb2x1bWUgZ3JvdXAgJXMuIiwKKwkJCSAgbHAtPm9yaWdpbl9uYW1lLCBsdi0+dmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3JnID09IGx2KSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHVzZSAlcyBhcyBib3RoIHNuYXBzaG90IGFuZCBvcmlnaW4uIiwgc25hcF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFjb3dfaGFzX21pbl9jaHVua3MobHYtPnZnLCBsdi0+bGVfY291bnQsIGxwLT5jaHVua19zaXplKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfaXNfbG9ja2VkKG9yZykgfHwKKwkgICAgbHZfaXNfY2FjaGVfdHlwZShvcmcpIHx8CisJICAgIGx2X2lzX3RoaW5fdHlwZShvcmcpIHx8CisJICAgIGx2X2lzX3B2bW92ZShvcmcpIHx8CisJICAgIGx2X2lzX21pcnJvcmVkKG9yZykgfHwKKwkgICAgbHZfaXNfY293KG9yZykpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gY29udmVydCBhbiBMViBpbnRvIGEgc25hcHNob3Qgb2YgYSAlcyBMVi4iLAorCQkJICBsdl9pc19sb2NrZWQob3JnKSA/ICJsb2NrZWQiIDoKKwkJCSAgbHZfaXNfY2FjaGVfdHlwZShvcmcpID8gImNhY2hlIHR5cGUiIDoKKwkJCSAgbHZfaXNfdGhpbl90eXBlKG9yZykgPyAidGhpbiB0eXBlIiA6CisJCQkgIGx2X2lzX3B2bW92ZShvcmcpID8gInB2bW92ZSIgOgorCQkJICBsdl9pc19taXJyb3JlZChvcmcpID8gIm1pcnJvcmVkIiA6CisJCQkgICJzbmFwc2hvdCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfd2FybigiV0FSTklORzogQ29udmVydGluZyBsb2dpY2FsIHZvbHVtZSAlcyB0byBzbmFwc2hvdCBleGNlcHRpb24gc3RvcmUuIiwKKwkJIHNuYXBfbmFtZSk7CisJbG9nX3dhcm4oIlRISVMgV0lMTCBERVNUUk9ZIENPTlRFTlQgT0YgTE9HSUNBTCBWT0xVTUUgKGZpbGVzeXN0ZW0gZXRjLikiKTsKKworCWlmICghbHAtPnllcyAmJgorCSAgICB5ZXNfbm9fcHJvbXB0KCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udmVydCAlcz8gW3kvbl06ICIsCisJCQkgIHNuYXBfbmFtZSkgPT0gJ24nKSB7CisJCWxvZ19lcnJvcigiQ29udmVyc2lvbiBhYm9ydGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdikpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBkZWFjdGl2YXRlIGxvZ2ljYWwgdm9sdW1lICVzLiIsIHNuYXBfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHAtPnplcm8gfHwgIShsdi0+c3RhdHVzICYgTFZNX1dSSVRFKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6ICVzIG5vdCB6ZXJvZWQuIiwgc25hcF9uYW1lKTsKKwllbHNlIHsKKwkJbHYtPnN0YXR1cyB8PSBMVl9URU1QT1JBUlk7CisJCWlmICghYWN0aXZhdGVfbHZfbG9jYWwoY21kLCBsdikgfHwKKwkJICAgICF3aXBlX2x2KGx2LCAoc3RydWN0IHdpcGVfcGFyYW1zKSB7IC5kb196ZXJvID0gMSB9KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgc25hcHNob3QgZXhjZXB0aW9uIHN0b3JlLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbHYtPnN0YXR1cyAmPSB+TFZfVEVNUE9SQVJZOworCQkvKiBEZWFjdGl2YXRlcyBjbGVhcmVkIG1ldGFkYXRhIExWICovCisJCWlmICghZGVhY3RpdmF0ZV9sdl9sb2NhbChsdi0+dmctPmNtZCwgbHYpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlIHplcm9lZCBzbmFwc2hvdCBleGNlcHRpb24gc3RvcmUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghYXJjaGl2ZShsdi0+dmcpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmdfYWRkX3NuYXBzaG90KG9yZywgbHYsIE5VTEwsIG9yZy0+bGVfY291bnQsIGxwLT5jaHVua19zaXplKSkgeworCQlsb2dfZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBzbmFwc2hvdC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc3RvcmUgdmcgb24gZGlzayhzKSAqLworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQob3JnKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgY29udmVydGVkIHRvIHNuYXBzaG90LiIsIHNuYXBfbmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbHZjb252ZXJ0X21lcmdlX29sZF9zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJaW50IG1lcmdlX29uX2FjdGl2YXRlID0gMDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbiA9IG9yaWdpbl9mcm9tX2Nvdyhsdik7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNuYXBfc2VnID0gZmluZF9zbmFwc2hvdChsdik7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCWRtX3BlcmNlbnRfdCBzbmFwX3BlcmNlbnQ7CisKKwkvKiBDaGVjayBpZiBtZXJnZSBpcyBwb3NzaWJsZSAqLworCWlmICghbHZfaXNfY293KGx2KSkgeworCQlsb2dfZXJyb3IoIlwiJXNcIiBpcyBub3QgYSBtZXJnZWFibGUgbG9naWNhbCB2b2x1bWUuIiwKKwkJCSAgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbWVyZ2luZ19jb3cobHYpKSB7CisJCWxvZ19lcnJvcigiU25hcHNob3QgJXMgaXMgYWxyZWFkeSBtZXJnaW5nLiIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX21lcmdpbmdfb3JpZ2luKG9yaWdpbikpIHsKKwkJbG9nX2Vycm9yKCJTbmFwc2hvdCAlcyBpcyBhbHJlYWR5IG1lcmdpbmcgaW50byB0aGUgb3JpZ2luLiIsCisJCQkgIGZpbmRfc25hcHNob3Qob3JpZ2luKS0+Y293LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX3ZpcnR1YWxfb3JpZ2luKG9yaWdpbikpIHsKKwkJbG9nX2Vycm9yKCJTbmFwc2hvdCAlcyBoYXMgdmlydHVhbCBvcmlnaW4uIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKG9yaWdpbl9mcm9tX2NvdyhsdikpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IG1lcmdlIHNuYXBzaG90IFwiJXNcIiBpbnRvICIKKwkJCSAgInRoZSByZWFkLW9ubHkgZXh0ZXJuYWwgb3JpZ2luIFwiJXNcIi4iLAorCQkJICBsdi0+bmFtZSwgb3JpZ2luX2Zyb21fY293KGx2KS0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZJWE1FOiB0ZXN0IHdoZW4gc25hcHNob3QgaXMgcmVtb3RlbHkgYWN0aXZlICovCisJaWYgKGx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDEsIDApCisJICAgICYmIGluZm8uZXhpc3RzICYmIGluZm8ubGl2ZV90YWJsZSAmJgorCSAgICAoIWx2X3NuYXBzaG90X3BlcmNlbnQobHYsICZzbmFwX3BlcmNlbnQpIHx8CisJICAgICBzbmFwX3BlcmNlbnQgPT0gRE1fUEVSQ0VOVF9JTlZBTElEKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBtZXJnZSBpbnZhbGlkYXRlZCBzbmFwc2hvdCBMViBcIiVzXCIuIiwKKwkJCSAgbHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc25hcF9zZWctPnNlZ3R5cGUtPm9wcy0+dGFyZ2V0X3ByZXNlbnQgJiYKKwkgICAgIXNuYXBfc2VnLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KGNtZCwgc25hcF9zZWcsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzbmFwc2hvdCBtZXJnZS4gIgorCQkJICAiTWlzc2luZyBzdXBwb3J0IGluIGtlcm5lbD8iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFhcmNoaXZlKGx2LT52ZykpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBQcmV2ZW50IG1lcmdlIHdpdGggb3BlbiBkZXZpY2UocykgYXMgaXQgd291bGQgbGlrZWx5IGxlYWQKKwkgKiB0byBhcHBsaWNhdGlvbi9maWxlc3lzdGVtIGZhaWx1cmUuICBNZXJnZSBvbiBvcmlnaW4ncyBuZXh0CisJICogYWN0aXZhdGlvbiBpZiBlaXRoZXIgdGhlIG9yaWdpbiBvciBzbmFwc2hvdCBMViBhcmUgY3VycmVudGx5CisJICogb3Blbi4KKwkgKgorCSAqIEZJWE1FIHRlc3Rpbmcgb3Blbl9jb3VudCBpcyByYWNleTsgc25hcHNob3QtbWVyZ2UgdGFyZ2V0J3MKKwkgKiBjb25zdHJ1Y3RvciBhbmQgRE0gc2hvdWxkIHByZXZlbnQgYXBwcm9wcmlhdGUgZGV2aWNlcyBmcm9tCisJICogYmVpbmcgb3Blbi4KKwkgKi8KKwlpZiAobHZfaXNfYWN0aXZlX2xvY2FsbHkob3JpZ2luKSkgeworCQlpZiAoIWx2X2NoZWNrX25vdF9pbl91c2Uob3JpZ2luLCAwKSkgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkNhbid0IG1lcmdlIHVudGlsIG9yaWdpbiB2b2x1bWUgaXMgY2xvc2VkLiIpOworCQkJbWVyZ2Vfb25fYWN0aXZhdGUgPSAxOworCQl9IGVsc2UgaWYgKCFsdl9jaGVja19ub3RfaW5fdXNlKGx2LCAwKSkgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkNhbid0IG1lcmdlIHVudGlsIHNuYXBzaG90IGlzIGNsb3NlZC4iKTsKKwkJCW1lcmdlX29uX2FjdGl2YXRlID0gMTsKKwkJfQorCX0gZWxzZSBpZiAodmdfaXNfY2x1c3RlcmVkKG9yaWdpbi0+dmcpICYmIGx2X2lzX2FjdGl2ZShvcmlnaW4pKSB7CisJCS8qIFdoZW4gaXQncyBhY3RpdmUgc29tZXdoZXJlIGVsc2UgKi8KKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkNhbid0IGNoZWNrIHdoZXRoZXIgcmVtb3RlbHkgYWN0aXZlIHNuYXBzaG90IGlzIG9wZW4uIik7CisJCW1lcmdlX29uX2FjdGl2YXRlID0gMTsKKwl9CisKKwlpbml0X3NuYXBzaG90X21lcmdlKHNuYXBfc2VnLCBvcmlnaW4pOworCisJaWYgKG1lcmdlX29uX2FjdGl2YXRlKSB7CisJCS8qIFN0b3JlIGFuZCBjb21taXQgdmcgYnV0IHNraXAgc3RhcnRpbmcgdGhlIG1lcmdlICovCisJCWlmICghdmdfd3JpdGUobHYtPnZnKSB8fCAhdmdfY29tbWl0KGx2LT52ZykpCisJCQlyZXR1cm5fMDsKKwkJYmFja3VwKGx2LT52Zyk7CisJfSBlbHNlIHsKKwkJLyogUGVyZm9ybSBtZXJnZSAqLworCQlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKG9yaWdpbikpCisJCQlyZXR1cm5fMDsKKworCQlscC0+bmVlZF9wb2xsaW5nID0gMTsKKwkJbHAtPmx2X3RvX3BvbGwgPSBvcmlnaW47CisJfQorCisJaWYgKG1lcmdlX29uX2FjdGl2YXRlKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTWVyZ2luZyBvZiBzbmFwc2hvdCAlcyB3aWxsIG9jY3VyIG9uICIKKwkJCQkJIm5leHQgYWN0aXZhdGlvbiBvZiAlcy4iLAorCQkJCQlkaXNwbGF5X2x2bmFtZShsdiksIGRpc3BsYXlfbHZuYW1lKG9yaWdpbikpOworCWVsc2UKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIk1lcmdpbmcgb2Ygdm9sdW1lICVzIHN0YXJ0ZWQuIiwKKwkJCQkJZGlzcGxheV9sdm5hbWUobHYpKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfbWVyZ2VfdGhpbl9zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlpbnQgb3JpZ2luX2lzX2FjdGl2ZSA9IDAsIHIgPSAwOworCXN0cnVjdCBsdl9zZWdtZW50ICpzbmFwX3NlZyA9IGZpcnN0X3NlZyhsdik7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpvcmlnaW4gPSBzbmFwX3NlZy0+b3JpZ2luOworCisJaWYgKCFvcmlnaW4pIHsKKwkJbG9nX2Vycm9yKCIlcyBpcyBub3QgYSBtZXJnZWFibGUgbG9naWNhbCB2b2x1bWUuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgbWVyZ2UgaXMgcG9zc2libGUgKi8KKwlpZiAobHZfaXNfbWVyZ2luZ19vcmlnaW4ob3JpZ2luKSkgeworCQlsb2dfZXJyb3IoIlNuYXBzaG90ICVzIGlzIGFscmVhZHkgbWVyZ2luZyBpbnRvIHRoZSBvcmlnaW4uIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUoZmluZF9zbmFwc2hvdChvcmlnaW4pLT5sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfZXh0ZXJuYWxfb3JpZ2luKG9yaWdpbikpIHsKKwkJaWYgKCEob3JpZ2luID0gb3JpZ2luX2Zyb21fY293KGx2KSkpCisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIiVzIGlzIG1pc3Npbmcgb3JpZ2luLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIiVzIGlzIHJlYWQtb25seSBleHRlcm5hbCBvcmlnaW4gJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSwgZGlzcGxheV9sdm5hbWUob3JpZ2luKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19vcmlnaW4ob3JpZ2luKSkgeworCQlsb2dfZXJyb3IoIk1lcmdpbmcgaW50byB0aGUgb2xkIHNuYXBzaG90IG9yaWdpbiAlcyBpcyBub3Qgc3VwcG9ydGVkLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKG9yaWdpbikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyY2hpdmUobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwkvLyBGSVhNRTogYWxsb3cgb3JpZ2luIHRvIGJlIHNwZWNpZmllZAorCS8vIEZJWE1FOiB2ZXJpZnkgc25hcHNob3QgaXMgZGVzY2VuZGFudCBvZiBzcGVjaWZpZWQgb3JpZ2luCisKKwkvKgorCSAqIFByZXZlbnQgbWVyZ2Ugd2l0aCBvcGVuIGRldmljZShzKSBhcyBpdCB3b3VsZCBsaWtlbHkgbGVhZAorCSAqIHRvIGFwcGxpY2F0aW9uL2ZpbGVzeXN0ZW0gZmFpbHVyZS4gIE1lcmdlIG9uIG9yaWdpbidzIG5leHQKKwkgKiBhY3RpdmF0aW9uIGlmIGVpdGhlciB0aGUgb3JpZ2luIG9yIHNuYXBzaG90IExWIGNhbid0IGJlCisJICogZGVhY3RpdmF0ZWQuCisJICovCisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbHYpKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiRGVsYXlpbmcgbWVyZ2Ugc2luY2Ugc25hcHNob3QgaXMgb3Blbi4iKTsKKwllbHNlIGlmICgob3JpZ2luX2lzX2FjdGl2ZSA9IGx2X2lzX2FjdGl2ZShvcmlnaW4pKSAmJgorCQkgIWRlYWN0aXZhdGVfbHYoY21kLCBvcmlnaW4pKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiRGVsYXlpbmcgbWVyZ2Ugc2luY2Ugb3JpZ2luIHZvbHVtZSBpcyBvcGVuLiIpOworCWVsc2UgeworCQkvKgorCQkgKiBCb3RoIHRoaW4gc25hcHNob3QgYW5kIG9yaWdpbiBhcmUgaW5hY3RpdmUsCisJCSAqIHJlcGxhY2UgdGhlIG9yaWdpbiBMViB3aXRoIGl0cyBzbmFwc2hvdCBMVi4KKwkJICovCisJCWlmICghdGhpbl9tZXJnZV9maW5pc2goY21kLCBvcmlnaW4sIGx2KSkKKwkJCWdvdG9fb3V0OworCisJCWlmIChvcmlnaW5faXNfYWN0aXZlICYmICFhY3RpdmF0ZV9sdihjbWQsIGx2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVhY3RpdmF0ZSBvcmlnaW4gJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpbml0X3NuYXBzaG90X21lcmdlKHNuYXBfc2VnLCBvcmlnaW4pOworCisJLyogQ29tbWl0IHZnLCBtZXJnZSB3aWxsIHN0YXJ0IHdpdGggbmV4dCBhY3RpdmF0aW9uICovCisJaWYgKCF2Z193cml0ZShsdi0+dmcpIHx8ICF2Z19jb21taXQobHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlyID0gMTsKK291dDoKKwliYWNrdXAobHYtPnZnKTsKKworCWlmIChyKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTWVyZ2luZyBvZiB0aGluIHNuYXBzaG90ICVzIHdpbGwgb2NjdXIgb24gIgorCQkJCQkibmV4dCBhY3RpdmF0aW9uIG9mICVzLiIsCisJCQkJCWRpc3BsYXlfbHZuYW1lKGx2KSwgZGlzcGxheV9sdm5hbWUob3JpZ2luKSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfbHZjb252ZXJ0X3RoaW5fcG9vbF9yZXBhaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9sdiwKKwkJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWNvbnN0IGNoYXIgKmRtZGlyID0gZG1fZGlyKCk7CisJY29uc3QgY2hhciAqdGhpbl9kdW1wID0KKwkJZmluZF9jb25maWdfdHJlZV9zdHJfYWxsb3dfZW1wdHkoY21kLCBnbG9iYWxfdGhpbl9kdW1wX2V4ZWN1dGFibGVfQ0ZHLCBOVUxMKTsKKwljb25zdCBjaGFyICp0aGluX3JlcGFpciA9CisJCWZpbmRfY29uZmlnX3RyZWVfc3RyX2FsbG93X2VtcHR5KGNtZCwgZ2xvYmFsX3RoaW5fcmVwYWlyX2V4ZWN1dGFibGVfQ0ZHLCBOVUxMKTsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX25vZGUgKmNuOworCWNvbnN0IHN0cnVjdCBkbV9jb25maWdfdmFsdWUgKmN2OworCWludCByZXQgPSAwLCBzdGF0dXM7CisJaW50IGFyZ3MgPSAwOworCWNvbnN0IGNoYXIgKmFyZ3ZbMTldOyAvKiBNYXggc3VwcG9ydGVkIDEwIGFyZ3MgKi8KKwljaGFyICpkbV9uYW1lLCAqdHJhbnNfaWRfc3RyOworCWNoYXIgbWV0YV9wYXRoW1BBVEhfTUFYXTsKKwljaGFyIHBtc19wYXRoW1BBVEhfTUFYXTsKKwl1aW50NjRfdCB0cmFuc19pZDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBtc2x2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWx2ID0gZmlyc3Rfc2VnKHBvb2xfbHYpLT5tZXRhZGF0YV9sdjsKKwlzdHJ1Y3QgcGlwZV9kYXRhIHBkYXRhOworCUZJTEUgKmY7CisKKwlpZiAoIXRoaW5fcmVwYWlyIHx8ICF0aGluX3JlcGFpclswXSkgeworCQlsb2dfZXJyb3IoIlRoaW4gcmVwYWlyIGNvbW1uYW5kIGlzIG5vdCBjb25maWd1cmVkLiBSZXBhaXIgaXMgZGlzYWJsZWQuIik7CisJCXJldHVybiAwOyAvKiBDaGVja2luZyBkaXNhYmxlZCAqLworCX0KKworCXBtc2x2ID0gcG9vbF9sdi0+dmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHY7CisKKwkvKiBDaGVjayB3ZSBoYXZlIHBvb2wgbWV0YWRhdGEgc3BhcmUgTFYgKi8KKwlpZiAoIWhhbmRsZV9wb29sX21ldGFkYXRhX3NwYXJlKHBvb2xfbHYtPnZnLCAwLCBscC0+cHZoLCAxKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAocG1zbHYgIT0gcG9vbF9sdi0+dmctPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYpIHsKKwkJaWYgKCF2Z193cml0ZShwb29sX2x2LT52ZykgfHwgIXZnX2NvbW1pdChwb29sX2x2LT52ZykpCisJCQlyZXR1cm5fMDsKKwkJcG1zbHYgPSBwb29sX2x2LT52Zy0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdjsKKwl9CisKKwlpZiAoIShkbV9uYW1lID0gZG1fYnVpbGRfZG1fbmFtZShjbWQtPm1lbSwgbWx2LT52Zy0+bmFtZSwKKwkJCQkJIG1sdi0+bmFtZSwgTlVMTCkpIHx8CisJICAgIChkbV9zbnByaW50ZihtZXRhX3BhdGgsIHNpemVvZihtZXRhX3BhdGgpLCAiJXMvJXMiLCBkbWRpciwgZG1fbmFtZSkgPCAwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBidWlsZCB0aGluIG1ldGFkYXRhIHBhdGguIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKGRtX25hbWUgPSBkbV9idWlsZF9kbV9uYW1lKGNtZC0+bWVtLCBwbXNsdi0+dmctPm5hbWUsCisJCQkJCSBwbXNsdi0+bmFtZSwgTlVMTCkpIHx8CisJICAgIChkbV9zbnByaW50ZihwbXNfcGF0aCwgc2l6ZW9mKHBtc19wYXRoKSwgIiVzLyVzIiwgZG1kaXIsIGRtX25hbWUpIDwgMCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYnVpbGQgcG9vbCBtZXRhZGF0YSBzcGFyZSBwYXRoLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShjbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBnbG9iYWxfdGhpbl9yZXBhaXJfb3B0aW9uc19DRkcsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuYWJsZSB0byBmaW5kIGNvbmZpZ3VyYXRpb24gZm9yIGdsb2JhbC90aGluX3JlcGFpcl9vcHRpb25zIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoY3YgPSBjbi0+djsgY3YgJiYgYXJncyA8IDE2OyBjdiA9IGN2LT5uZXh0KSB7CisJCWlmIChjdi0+dHlwZSAhPSBETV9DRkdfU1RSSU5HKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgc3RyaW5nIGluIGNvbmZpZyBmaWxlOiAiCisJCQkJICAiZ2xvYmFsL3RoaW5fcmVwYWlyX29wdGlvbnMiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWFyZ3ZbKythcmdzXSA9IGN2LT52LnN0cjsKKwl9CisKKwlpZiAoYXJncyA9PSAxMCkgeworCQlsb2dfZXJyb3IoIlRvbyBtYW55IG9wdGlvbnMgZm9yIHRoaW4gcmVwYWlyIGNvbW1hbmQuIik7CisJCXJldHVybiAwOworCX0KKworCWFyZ3ZbMF0gPSB0aGluX3JlcGFpcjsKKwlhcmd2WysrYXJnc10gPSAiLWkiOworCWFyZ3ZbKythcmdzXSA9IG1ldGFfcGF0aDsKKwlhcmd2WysrYXJnc10gPSAiLW8iOworCWFyZ3ZbKythcmdzXSA9IHBtc19wYXRoOworCWFyZ3ZbKythcmdzXSA9IE5VTEw7CisKKwlpZiAocG9vbF9pc19hY3RpdmUocG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IGluYWN0aXZlIHBvb2wgY2FuIGJlIHJlcGFpcmVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFjdGl2YXRlX2x2X2xvY2FsKGNtZCwgcG1zbHYpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIHBvb2wgbWV0YWRhdGEgc3BhcmUgdm9sdW1lICVzLiIsCisJCQkgIHBtc2x2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFhY3RpdmF0ZV9sdl9sb2NhbChjbWQsIG1sdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgYWN0aXZhdGUgdGhpbiBwb29sIG1ldGFkYXRhIHZvbHVtZSAlcy4iLAorCQkJICBtbHYtPm5hbWUpOworCQlnb3RvIGRlYWN0aXZhdGVfcG1zbHY7CisJfQorCisJaWYgKCEocmV0ID0gZXhlY19jbWQoY21kLCAoY29uc3QgY2hhciAqIGNvbnN0ICopYXJndiwgJnN0YXR1cywgMSkpKSB7CisJCWxvZ19lcnJvcigiUmVwYWlyIG9mIHRoaW4gbWV0YWRhdGEgdm9sdW1lIG9mIHRoaW4gcG9vbCAlcyBmYWlsZWQgKHN0YXR1czolZCkuICIKKwkJCSAgIk1hbnVhbCByZXBhaXIgcmVxdWlyZWQhIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdiksIHN0YXR1cyk7CisJCWdvdG8gZGVhY3RpdmF0ZV9tbHY7CisJfQorCisJaWYgKHRoaW5fZHVtcFswXSkgeworCQlhcmd2WzBdID0gdGhpbl9kdW1wOworCQlhcmd2WzFdID0gcG1zX3BhdGg7CisJCWFyZ3ZbMl0gPSBOVUxMOworCisJCWlmICghKGYgPSBwaXBlX29wZW4oY21kLCBhcmd2LCAwLCAmcGRhdGEpKSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBDYW5ub3QgcmVhZCBvdXRwdXQgZnJvbSAlcyAlcy4iLCB0aGluX2R1bXAsIHBtc19wYXRoKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogU2NhbiBvbmx5IHRoZSAxc3QuIGxpbmUgZm9yIHRyYW5zYXRpb24gaWQuCisJCQkgKiBXYXRjaCBvdXQsIGlmIHRoZSB0aGluX2R1bXAgZm9ybWF0IGNoYW5nZXMKKwkJCSAqLworCQkJaWYgKGZnZXRzKG1ldGFfcGF0aCwgc2l6ZW9mKG1ldGFfcGF0aCksIGYpICYmCisJCQkgICAgKHRyYW5zX2lkX3N0ciA9IHN0cnN0cihtZXRhX3BhdGgsICJ0cmFuc2FjdGlvbj1cIiIpKSAmJgorCQkJICAgIChzc2NhbmYodHJhbnNfaWRfc3RyICsgMTMsIEZNVHU2NCwgJnRyYW5zX2lkKSA9PSAxKSAmJgorCQkJICAgICh0cmFuc19pZCAhPSBmaXJzdF9zZWcocG9vbF9sdiktPnRyYW5zYWN0aW9uX2lkKSAmJgorCQkJICAgICgodHJhbnNfaWQgLSAxKSAhPSBmaXJzdF9zZWcocG9vbF9sdiktPnRyYW5zYWN0aW9uX2lkKSkKKwkJCQlsb2dfZXJyb3IoIlRyYW5zYWN0aW9uIGlkICIgRk1UdTY0ICIgZnJvbSBwb29sIFwiJXMvJXNcIiAiCisJCQkJCSAgImRvZXMgbm90IG1hdGNoIHJlcGFpcmVkIHRyYW5zYWN0aW9uIGlkICIKKwkJCQkJICBGTVR1NjQgIiBmcm9tICVzLiIsCisJCQkJCSAgZmlyc3Rfc2VnKHBvb2xfbHYpLT50cmFuc2FjdGlvbl9pZCwKKwkJCQkJICBwb29sX2x2LT52Zy0+bmFtZSwgcG9vbF9sdi0+bmFtZSwgdHJhbnNfaWQsCisJCQkJCSAgcG1zX3BhdGgpOworCisJCQkodm9pZCkgcGlwZV9jbG9zZSgmcGRhdGEpOyAvKiBraWxsaW5nIHBpcGUgKi8KKwkJfQorCX0KKworZGVhY3RpdmF0ZV9tbHY6CisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgbWx2KSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBkZWFjdGl2YXRlIHRoaW4gcG9vbCBtZXRhZGF0YSB2b2x1bWUgJXMuIiwKKwkJCSAgbWx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCitkZWFjdGl2YXRlX3Btc2x2OgorCWlmICghZGVhY3RpdmF0ZV9sdihjbWQsIHBtc2x2KSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBkZWFjdGl2YXRlIHRoaW4gcG9vbCBtZXRhZGF0YSB2b2x1bWUgJXMuIiwKKwkJCSAgbWx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJaWYgKHBtc2x2ID09IHBvb2xfbHYtPnZnLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2KSB7CisJCXBvb2xfbHYtPnZnLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2ID0gTlVMTDsKKwkJcG1zbHYtPnN0YXR1cyAmPSB+UE9PTF9NRVRBREFUQV9TUEFSRTsKKwkJbHZfc2V0X3Zpc2libGUocG1zbHYpOworCX0KKworCS8qIFRyeSB0byBhbGxvY2F0ZSBuZXcgcG9vbCBtZXRhZGF0YSBzcGFyZSBMViAqLworCWlmICghaGFuZGxlX3Bvb2xfbWV0YWRhdGFfc3BhcmUocG9vbF9sdi0+dmcsIDAsIGxwLT5wdmgsCisJCQkJCWxwLT5wb29sbWV0YWRhdGFzcGFyZSkpCisJCXN0YWNrOworCisJaWYgKGRtX3NucHJpbnRmKG1ldGFfcGF0aCwgc2l6ZW9mKG1ldGFfcGF0aCksICIlc19tZXRhJSVkIiwgcG9vbF9sdi0+bmFtZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgcHJlcGFyZSBuZXcgbWV0YWRhdGEgbmFtZSBmb3IgJXMuIiwgcG9vbF9sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2VuZXJhdGVfbHZfbmFtZShwb29sX2x2LT52ZywgbWV0YV9wYXRoLCBwbXNfcGF0aCwgc2l6ZW9mKHBtc19wYXRoKSkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZW5lcmF0ZSBuZXcgbmFtZSBmb3IgJXMuIiwgbWV0YV9wYXRoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFkZXRhY2hfcG9vbF9tZXRhZGF0YV9sdihmaXJzdF9zZWcocG9vbF9sdiksICZtbHYpKQorCQlyZXR1cm5fMDsKKworCS8qIFN3YXAgX3Btc3BhcmUgYW5kIF90bWV0YSBuYW1lICovCisJaWYgKCFzd2FwX2x2X2lkZW50aWZpZXJzKGNtZCwgbWx2LCBwbXNsdikpCisJCXJldHVybl8wOworCisJaWYgKCFhdHRhY2hfcG9vbF9tZXRhZGF0YV9sdihmaXJzdF9zZWcocG9vbF9sdiksIHBtc2x2KSkKKwkJcmV0dXJuXzA7CisKKwkvKiBVc2VkIF90bWV0YSAobm93IF9wbXNwYXJlKSBiZWNvbWVzIF9tZXRhJWQgKi8KKwlpZiAoIWx2X3JlbmFtZV91cGRhdGUoY21kLCBtbHYsIHBtc19wYXRoLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXZnX3dyaXRlKHBvb2xfbHYtPnZnKSB8fCAhdmdfY29tbWl0KHBvb2xfbHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfd2FybigiV0FSTklORzogSWYgZXZlcnl0aGluZyB3b3JrcywgcmVtb3ZlICVzIHZvbHVtZS4iLAorCQkgZGlzcGxheV9sdm5hbWUobWx2KSk7CisKKwlsb2dfd2FybigiV0FSTklORzogVXNlIHB2bW92ZSBjb21tYW5kIHRvIG1vdmUgJXMgb24gdGhlIGJlc3QgZml0dGluZyBQVi4iLAorCQkgZGlzcGxheV9sdm5hbWUoZmlyc3Rfc2VnKHBvb2xfbHYpLT5tZXRhZGF0YV9sdikpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEN1cnJlbnRseSBjb252ZXJ0cyBvbmx5IHRvIHRoaW4gdm9sdW1lIHdpdGggZXh0ZXJuYWwgb3JpZ2luICovCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfdGhpbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICp0b3JpZ2luX2x2LCAqcG9vbF9sdiA9IGxwLT5wb29sX2RhdGFfbHY7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBsdi0+dmc7CisJc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyBsdmMgPSB7CisJCS5hY3RpdmF0ZSA9IENIQU5HRV9BRVksCisJCS5hbGxvYyA9IEFMTE9DX0lOSEVSSVQsCisJCS5sdl9uYW1lID0gbHAtPm9yaWdpbl9uYW1lLAorCQkubWFqb3IgPSAtMSwKKwkJLm1pbm9yID0gLTEsCisJCS5zdXBwcmVzc196ZXJvX3dhcm4gPSAxLCAvKiBTdXBwcmVzcyB3YXJuaW5nIGZvciB0aGlzIHRoaW4gKi8KKwkJLnBlcm1pc3Npb24gPSBMVk1fUkVBRCwKKwkJLnBvb2xfbmFtZSA9IHBvb2xfbHYtPm5hbWUsCisJCS5wdmggPSAmdmctPnB2cywKKwkJLnJlYWRfYWhlYWQgPSBETV9SRUFEX0FIRUFEX0FVVE8sCisJCS5zdHJpcGVzID0gMSwKKwkJLnZpcnR1YWxfZXh0ZW50cyA9IGx2LT5sZV9jb3VudCwKKwl9OworCisJaWYgKGx2ID09IHBvb2xfbHYpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCB1c2Ugc2FtZSBMViAlcyBmb3IgdGhpbiBwb29sIGFuZCB0aGluIHZvbHVtZS4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19sb2NrZWQobHYpIHx8CisJICAgICFsdl9pc192aXNpYmxlKGx2KSB8fAorCSAgICBsdl9pc19jYWNoZV90eXBlKGx2KSB8fAorCSAgICBsdl9pc19jb3cobHYpIHx8CisJICAgIGx2X2lzX3Bvb2wobHYpIHx8CisJICAgIGx2X2lzX3Bvb2xfZGF0YShsdikgfHwKKwkgICAgbHZfaXNfcG9vbF9tZXRhZGF0YShsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCB1c2UlcyVzICVzICVzIGFzIGV4dGVybmFsIG9yaWdpbi4iLAorCQkJICBsdl9pc19sb2NrZWQobHYpID8gIiBsb2NrZWQiIDogIiIsCisJCQkgIGx2X2lzX3Zpc2libGUobHYpID8gIiIgOiAiIGhpZGRlbiIsCisJCQkgIGx2c2VnX25hbWUoZmlyc3Rfc2VnKGx2KSksCisJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpc19sb2NrZF90eXBlKGx2LT52Zy0+bG9ja190eXBlKSkgeworCQkvKgorCQkgKiBGSVhNRTogZXh0ZXJuYWwgb3JpZ2lucyBkb24ndCB3b3JrIGluIGxvY2tkIFZHcy4KKwkJICogUHJpb3IgdG8gdGhlIGx2Y29udmVydCwgdGhlcmUncyBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoCisJCSAqIHRoZSB1dWlkIG9mIHRoZSBleHRlcm5hbCBvcmlnaW4gTFYuICBBZnRlciB0aGUgY29udmVydCwKKwkJICogdGhhdCB1dWlkIGJlbG9uZ3MgdG8gdGhlIG5ldyB0aGluIExWLCBhbmQgYSBuZXcgTFYgd2l0aAorCQkgKiBhIG5ldyB1dWlkIGV4aXN0cyBhcyB0aGUgbm9uLXRoaW4sIHJlYWRvbmx5IGV4dGVybmFsIExWLgorCQkgKiBXZSdkIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NrIGZvciB0aGUgcHJldmlvdXMgdXVpZAorCQkgKiAodGhlIG5ldyB0aGluIExWIHdpbGwgaGF2ZSBubyBsb2NrKSwgYW5kIGNyZWF0ZSBhIG5ldworCQkgKiBsb2NrIGZvciB0aGUgbmV3IExWIHV1aWQgdXNlZCBieSB0aGUgZXh0ZXJuYWwgTFYuCisJCSAqLworCQlsb2dfZXJyb3IoIkNhbid0IHVzZSBsb2NrX3R5cGUgJXMgTFYgYXMgZXh0ZXJuYWwgb3JpZ2luLiIsCisJCQkgIGx2LT52Zy0+bG9ja190eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pbml0KCZsdmMudGFncyk7CisKKwlpZiAoIXBvb2xfc3VwcG9ydHNfZXh0ZXJuYWxfb3JpZ2luKGZpcnN0X3NlZyhwb29sX2x2KSwgbHYpKQorCQlyZXR1cm5fMDsKKworCWlmICghKGx2Yy5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBTRUdfVFlQRV9OQU1FX1RISU4pKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlyZXR1cm5fMDsKKworCS8qIE5ldyB0aGluIExWIG5lZWRzIHRvIGJlIGNyZWF0ZWQgKGFsbCBtZXNzYWdlcyBzZW50IHRvIHBvb2wpCisJICogSW4gdGhpcyBjYXNlIHRoaW4gdm9sdW1lIGlzIGNyZWF0ZWQgUkVBRC1PTkxZIGFuZAorCSAqIGFsc28gd2FybiBhYm91dCBub3QgemVyb2luZyBpcyBzdXBwcmVzc2VkLiAqLworCWlmICghKHRvcmlnaW5fbHYgPSBsdl9jcmVhdGVfc2luZ2xlKHZnLCAmbHZjKSkpCisJCXJldHVybl8wOworCisJLyogRGVhY3RpdmF0ZSBwcmVwYXJlZCBUaGluIExWICovCisJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgdG9yaWdpbl9sdikpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gVW5hYmxlIHRvIGRlYWN0aXZhdGUgbmV3IExWLiAiCisJCQkgICJNYW51YWwgaW50ZXJ2ZW50aW9uIHJlcXVpcmVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENyYXNoaW5nIHRpbGwgdGhpcyBwb2ludCB3aWxsIGxlYXZlIHBsYWluIHRoaW4gdm9sdW1lCisJICogd2hpY2ggY291bGQgYmUgZWFzaWx5IHJlbW92ZWQgYnkgdGhlIHVzZXIgYWZ0ZXIgaS5lLiBwb3dlci1vZmYKKwkgKi8KKworCWlmICghc3dhcF9sdl9pZGVudGlmaWVycyhjbWQsIHRvcmlnaW5fbHYsIGx2KSkgeworCQlzdGFjazsKKwkJZ290byByZXZlcnRfbmV3X2x2OworCX0KKworCS8qIFByZXNlcnZlIHJlYWQtd3JpdGUgc3RhdHVzIG9mIG9yaWdpbmFsIExWIGhlcmUgKi8KKwl0b3JpZ2luX2x2LT5zdGF0dXMgfD0gKGx2LT5zdGF0dXMgJiBMVk1fV1JJVEUpOworCisJaWYgKCFhdHRhY2hfdGhpbl9leHRlcm5hbF9vcmlnaW4oZmlyc3Rfc2VnKHRvcmlnaW5fbHYpLCBsdikpIHsKKwkJc3RhY2s7CisJCWdvdG8gcmV2ZXJ0X25ld19sdjsKKwl9CisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKHRvcmlnaW5fbHYpKSB7CisJCXN0YWNrOworCQlnb3RvIGRlYWN0aXZhdGVfYW5kX3JldmVydF9uZXdfbHY7CisJfQorCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkNvbnZlcnRlZCAlcyB0byB0aGluIHZvbHVtZSB3aXRoICIKKwkJCQkiZXh0ZXJuYWwgb3JpZ2luICVzLiIsCisJCQkJZGlzcGxheV9sdm5hbWUodG9yaWdpbl9sdiksCisJCQkJZGlzcGxheV9sdm5hbWUobHYpKTsKKworCXJldHVybiAxOworCitkZWFjdGl2YXRlX2FuZF9yZXZlcnRfbmV3X2x2OgorCWlmICghc3dhcF9sdl9pZGVudGlmaWVycyhjbWQsIHRvcmlnaW5fbHYsIGx2KSkKKwkJc3RhY2s7CisKKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCB0b3JpZ2luX2x2KSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBkZWFjdGl2YXRlIGZhaWxlZCBuZXcgTFYuICIKKwkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGV0YWNoX3RoaW5fZXh0ZXJuYWxfb3JpZ2luKGZpcnN0X3NlZyh0b3JpZ2luX2x2KSkpCisJCXJldHVybl8wOworCityZXZlcnRfbmV3X2x2OgorCS8qIEZJWE1FIEJldHRlciB0byByZXZlcnQgdG8gYmFja3VwIG9mIG1ldGFkYXRhPyAqLworCWlmICghbHZfcmVtb3ZlKHRvcmlnaW5fbHYpIHx8ICF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpCisJCWxvZ19lcnJvcigiTWFudWFsIGludGVydmVudGlvbiBtYXkgYmUgcmVxdWlyZWQgdG8gcmVtb3ZlICIKKwkJCSAgImFiYW5kb25lZCBMVihzKSBiZWZvcmUgcmV0cnlpbmcuIik7CisJZWxzZQorCQliYWNrdXAodmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2x2Y29udmVydF91cGRhdGVfcG9vbF9wYXJhbXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2LAorCQkJCQkgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWlmIChscC0+cG9vbF9tZXRhZGF0YV9zaXplICYmCisJICAgICEobHAtPnBvb2xfbWV0YWRhdGFfZXh0ZW50cyA9CisJICAgICAgZXh0ZW50c19mcm9tX3NpemUocG9vbF9sdi0+dmctPmNtZCwgbHAtPnBvb2xfbWV0YWRhdGFfc2l6ZSwgcG9vbF9sdi0+dmctPmV4dGVudF9zaXplKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIHVwZGF0ZV9wb29sX3BhcmFtcyhscC0+c2VndHlwZSwKKwkJCQkgIHBvb2xfbHYtPnZnLAorCQkJCSAgbHAtPnRhcmdldF9hdHRyLAorCQkJCSAgbHAtPnBhc3NlZF9hcmdzLAorCQkJCSAgcG9vbF9sdi0+bGVfY291bnQsCisJCQkJICAmbHAtPnBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJCQkgICZscC0+dGhpbl9jaHVua19zaXplX2NhbGNfcG9saWN5LAorCQkJCSAgJmxwLT5jaHVua19zaXplLAorCQkJCSAgJmxwLT5kaXNjYXJkcywKKwkJCQkgICZscC0+emVybyk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhIGRhdGEgbHYgYW5kIGEgbWV0YWRhdGEgbHYgaW50byBhIHRoaW4gb3IgY2FjaGUgcG9vbCBsdi4KKyAqCisgKiBUaGluIGx2Y29udmVydCB2ZXJzaW9uIHdoaWNoCisgKiAgcmVuYW1lIG1ldGFkYXRhCisgKiAgY29udmVydC9sYXllcnMgdGhpbnBvb2wgb3ZlciBkYXRhCisgKiAgYXR0YWNoIG1ldGFkYXRhCisgKgorICogcG9vbF9sdiBtaWdodCBvciBtaWdodCBub3QgYWxyZWFkeSBiZSBhIHBvb2wuCisgKi8KK3N0YXRpYyBpbnQgX2x2Y29udmVydF9wb29sKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2LAorCQkJICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWludCByID0gMDsKKwljb25zdCBjaGFyICpvbGRfbmFtZTsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gcG9vbF9sdi0+dmc7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpkYXRhX2x2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbWV0YWRhdGFfbHYgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcG9vbF9tZXRhZGF0YV9sdjsKKwljaGFyICpsb2NrZF9kYXRhX2FyZ3MgPSBOVUxMOworCWNoYXIgKmxvY2tkX21ldGFfYXJncyA9IE5VTEw7CisJY2hhciAqbG9ja2RfZGF0YV9uYW1lID0gTlVMTDsKKwljaGFyICpsb2NrZF9tZXRhX25hbWUgPSBOVUxMOworCXN0cnVjdCBpZCBsb2NrZF9kYXRhX2lkOworCXN0cnVjdCBpZCBsb2NrZF9tZXRhX2lkOworCWNoYXIgbWV0YWRhdGFfbmFtZVtOQU1FX0xFTl0sIGRhdGFfbmFtZVtOQU1FX0xFTl07CisJaW50IHplcm9fbWV0YWRhdGEgPSAxOworCWludCBhY3RpdmF0ZV9wb29sOworCisJaWYgKGxwLT5wb29sX2RhdGFfbmFtZSkgeworCQlpZiAoKGxwLT50aGluIHx8IGxwLT5jYWNoZSkgJiYKKwkJICAgICFzdHJjbXAobHAtPnBvb2xfZGF0YV9uYW1lLCBwb29sX2x2LT5uYW1lKSkgeworCQkJbG9nX2Vycm9yKCJDb252ZXJ0ZWQgdm9sdW1lICVzIGFuZCBwb29sIHZvbHVtZSBtdXN0IGRpZmZlci4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCEocG9vbF9sdiA9IGZpbmRfbHYodmcsIGxwLT5wb29sX2RhdGFfbmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoIlVua25vd24gcG9vbCBkYXRhIExWICVzLiIsIGxwLT5wb29sX2RhdGFfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEFuIGV4aXN0aW5nIExWIG5lZWRzIHRvIGhhdmUgaXRzIGxvY2sgZnJlZWQgb25jZSBpdCBiZWNvbWVzIGEgZGF0YSBMVi4gKi8KKwlpZiAoaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSAmJiAhbHZfaXNfcG9vbChwb29sX2x2KSAmJiBwb29sX2x2LT5sb2NrX2FyZ3MpIHsKKwkJbG9ja2RfZGF0YV9hcmdzID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHBvb2xfbHYtPmxvY2tfYXJncyk7CisJCWxvY2tkX2RhdGFfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBwb29sX2x2LT5uYW1lKTsKKwkJbWVtY3B5KCZsb2NrZF9kYXRhX2lkLCAmcG9vbF9sdi0+bHZpZC5pZFsxXSwgc2l6ZW9mKHN0cnVjdCBpZCkpOworCX0KKworCWlmICghbHZfaXNfdmlzaWJsZShwb29sX2x2KSkgeworCQlsb2dfZXJyb3IoIkNhbid0IGNvbnZlcnQgaW50ZXJuYWwgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbG9ja2VkKHBvb2xfbHYpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgY29udmVydCBsb2NrZWQgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl9wb29sKHBvb2xfbHYpICYmIChzZWd0eXBlX2lzX2NhY2hlX3Bvb2wobHAtPnNlZ3R5cGUpIHx8IGxwLT5jYWNoZSkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBjb252ZXJ0IHRoaW4gcG9vbCBMViAlcy4iLCBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsdl9pc19jYWNoZShwb29sX2x2KSAmJiAhc2VndHlwZV9pc190aGluX3Bvb2wobHAtPnNlZ3R5cGUpKSB7CisJCWxvZ19lcnJvcigiQ2FjaGVkIExWICVzIGNvdWxkIGJlIG9ubHkgY29udmVydGVkIGludG8gYSB0aGluIHBvb2wgdm9sdW1lLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGx2X2lzX2NhY2hlX3Bvb2wocG9vbF9sdikgJiYgKHNlZ3R5cGVfaXNfdGhpbl9wb29sKGxwLT5zZWd0eXBlKSB8fCBscC0+dGhpbikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY29udmVydCBjYWNoZSBwb29sICVzIGFzIHBvb2wgZGF0YSB2b2x1bWUuIiwKKwkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHZfaXNfbWlycm9yKHBvb2xfbHYpKSB7CisJCWxvZ19lcnJvcigiTWlycm9yIGxvZ2ljYWwgdm9sdW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBwb29scy4iKTsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlRyeSBcIiVzXCIgc2VnbWVudCB0eXBlIGluc3RlYWQuIiwgU0VHX1RZUEVfTkFNRV9SQUlEMSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogT25seSBsaW5lYXIsIHN0cmlwZWQgYW5kIHJhaWQgc3VwcG9ydGVkLgorCSAqIEZJWE1FIFRpZHkgdXAgYWxsIHRoZXNlIHR5cGUgcmVzdHJpY3Rpb25zLgorCSAqLworCWlmICghbHZfaXNfcG9vbChwb29sX2x2KSAmJgorCSAgICAobHZfaXNfdGhpbl90eXBlKHBvb2xfbHYpIHx8CisJICAgICBsdl9pc19jb3cocG9vbF9sdikgfHwgbHZfaXNfbWVyZ2luZ19jb3cocG9vbF9sdikgfHwKKwkgICAgIGx2X2lzX29yaWdpbihwb29sX2x2KSB8fGx2X2lzX21lcmdpbmdfb3JpZ2luKHBvb2xfbHYpIHx8CisJICAgICBsdl9pc19leHRlcm5hbF9vcmlnaW4ocG9vbF9sdikgfHwKKwkgICAgIGx2X2lzX3ZpcnR1YWwocG9vbF9sdikpKSB7CisJCWxvZ19lcnJvcigiUG9vbCBkYXRhIExWICVzIGlzIG9mIGFuIHVuc3VwcG9ydGVkIHR5cGUuIiwgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHAtPnBvb2xfbWV0YWRhdGFfbmFtZSkgeworCQlpZiAoIShscC0+cG9vbF9tZXRhZGF0YV9sdiA9IGZpbmRfbHYodmcsIGxwLT5wb29sX21ldGFkYXRhX25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJVbmtub3duIHBvb2wgbWV0YWRhdGEgTFYgJXMuIiwgbHAtPnBvb2xfbWV0YWRhdGFfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlscC0+cG9vbF9tZXRhZGF0YV9leHRlbnRzID0gbHAtPnBvb2xfbWV0YWRhdGFfbHYtPmxlX2NvdW50OworCQltZXRhZGF0YV9sdiA9IGxwLT5wb29sX21ldGFkYXRhX2x2OworCisJCS8qIEFuIGV4aXN0aW5nIExWIG5lZWRzIHRvIGhhdmUgaXRzIGxvY2sgZnJlZWQgb25jZSBpdCBiZWNvbWVzIGEgbWV0YSBMVi4gKi8KKwkJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkgJiYgbWV0YWRhdGFfbHYtPmxvY2tfYXJncykgeworCQkJbG9ja2RfbWV0YV9hcmdzID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIG1ldGFkYXRhX2x2LT5sb2NrX2FyZ3MpOworCQkJbG9ja2RfbWV0YV9uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIG1ldGFkYXRhX2x2LT5uYW1lKTsKKwkJCW1lbWNweSgmbG9ja2RfbWV0YV9pZCwgJm1ldGFkYXRhX2x2LT5sdmlkLmlkWzFdLCBzaXplb2Yoc3RydWN0IGlkKSk7CisJCX0KKworCQlpZiAobWV0YWRhdGFfbHYgPT0gcG9vbF9sdikgeworCQkJbG9nX2Vycm9yKCJDYW4ndCB1c2Ugc2FtZSBMViBmb3IgcG9vbCBkYXRhIGFuZCBtZXRhZGF0YSBMViAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobWV0YWRhdGFfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFsdl9pc192aXNpYmxlKG1ldGFkYXRhX2x2KSkgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBjb252ZXJ0IGludGVybmFsIExWICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShtZXRhZGF0YV9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobHZfaXNfbG9ja2VkKG1ldGFkYXRhX2x2KSkgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBjb252ZXJ0IGxvY2tlZCBMViAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobWV0YWRhdGFfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGx2X2lzX21pcnJvcihtZXRhZGF0YV9sdikpIHsKKwkJCWxvZ19lcnJvcigiTWlycm9yIGxvZ2ljYWwgdm9sdW1lcyBjYW5ub3QgYmUgdXNlZCBmb3IgcG9vbCBtZXRhZGF0YS4iKTsKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJUcnkgXCIlc1wiIHNlZ21lbnQgdHlwZSBpbnN0ZWFkLiIsIFNFR19UWVBFX05BTUVfUkFJRDEpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBGSVhNRSBUaWR5IHVwIGFsbCB0aGVzZSB0eXBlIHJlc3RyaWN0aW9ucy4gKi8KKwkJaWYgKGx2X2lzX2NhY2hlX3R5cGUobWV0YWRhdGFfbHYpIHx8CisJCSAgICBsdl9pc190aGluX3R5cGUobWV0YWRhdGFfbHYpIHx8CisJCSAgICBsdl9pc19jb3cobWV0YWRhdGFfbHYpIHx8IGx2X2lzX21lcmdpbmdfY293KG1ldGFkYXRhX2x2KSB8fAorCQkgICAgbHZfaXNfb3JpZ2luKG1ldGFkYXRhX2x2KSB8fCBsdl9pc19tZXJnaW5nX29yaWdpbihtZXRhZGF0YV9sdikgfHwKKwkJICAgIGx2X2lzX2V4dGVybmFsX29yaWdpbihtZXRhZGF0YV9sdikgfHwKKwkJICAgIGx2X2lzX3ZpcnR1YWwobWV0YWRhdGFfbHYpKSB7CisJCQlsb2dfZXJyb3IoIlBvb2wgbWV0YWRhdGEgTFYgJXMgaXMgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobWV0YWRhdGFfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFsdl9pc19wb29sKHBvb2xfbHYpKSB7CisJCQlpZiAoIV9sdmNvbnZlcnRfdXBkYXRlX3Bvb2xfcGFyYW1zKHBvb2xfbHYsIGxwKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJaWYgKGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMgPiBtZXRhZGF0YV9sdi0+bGVfY291bnQpIHsKKwkJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIHRvbyBzbWFsbCBmb3IgbWV0YWRhdGEuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShtZXRhZGF0YV9sdikpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJaWYgKGx2X2lzX3Bvb2wocG9vbF9sdikpIHsKKwkJbHAtPnBvb2xfZGF0YV9sdiA9IHBvb2xfbHY7CisKKwkJaWYgKCFtZXRhZGF0YV9sdikgeworCQkJaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIGludmFsaWQgd2l0aCBleGlzdGluZyBwb29sIiwKKwkJCQkJCSBjaHVua3NpemVfQVJHLCBkaXNjYXJkc19BUkcsCisJCQkJCQkgcG9vbG1ldGFkYXRhc2l6ZV9BUkcsIC0xKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJaWYgKGxwLT50aGluICYmCisJCQkgICAgYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgaW52YWxpZCB3aXRoIGV4aXN0aW5nIHRoaW4gcG9vbCIsCisJCQkJCQkgemVyb19BUkcsIC0xKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJaWYgKGxwLT5jYWNoZSkgeworCQkJCS8qIENoZWNrIGlzIHVzZXIgcmVxdWVzdGVkIHplcm9pbmcgbG9naWMgdmlhIFstWiB5fG5dICovCisJCQkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgemVyb19BUkcpKSB7CisJCQkJCS8qIE5vdGU6IHJlcXVpcmVzIHJhdGhlciBkZWVwIGtub3ctaG93IHRvIHNraXAgemVyb2luZyAqLworCQkJCQlpZiAoIWxwLT55ZXMgJiYKKwkJCQkJICAgIHllc19ub19wcm9tcHQoIkRvIHlvdSB3YW50IHdpcGUgZXhpc3RpbmcgbWV0YWRhdGEgb2YgIgorCQkJCQkJCSAgImNhY2hlIHBvb2wgdm9sdW1lICVzPyBbeS9uXTogIiwKKwkJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKSA9PSAnbicpIHsKKwkJCQkJCWxvZ19lcnJvcigiQ29udmVyc2lvbiBhYm9ydGVkLiIpOworCQkJCQkJbG9nX2Vycm9yKCJUbyBwcmVzZXJ2ZSBjYWNoZSBtZXRhZGF0YSBhZGQgb3B0aW9uIFwiLS16ZXJvIG5cIi4iKTsKKwkJCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBSZXVzaW5nIG1pc21hdGNoZWQgY2FjaGUgcG9vbCBtZXRhZGF0YSAiCisJCQkJCQkJICJNQVkgREVTVFJPWSBZT1VSIERBVEEhIik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQkvKiBXaXBpbmcgY29uZmlybWVkLCBnbyBhaGVhZCAqLworCQkJCQlpZiAoIXdpcGVfY2FjaGVfcG9vbChwb29sX2x2KSkKKwkJCQkJCXJldHVybl8wOworCQkJCX0gZWxzZSBpZiAoYXJnX2ludF92YWx1ZShjbWQsIHplcm9fQVJHLCAwKSkgeworCQkJCQlpZiAoIXdpcGVfY2FjaGVfcG9vbChwb29sX2x2KSkgLyogV2lwZSBhY2NvcmRpbmcgdG8gLVogeXxuICovCisJCQkJCQlyZXR1cm5fMDsKKwkJCQl9IGVsc2UKKwkJCQkJbG9nX3dhcm4oIldBUk5JTkc6IFJldXNpbmcgY2FjaGUgcG9vbCBtZXRhZGF0YSAlcyAiCisJCQkJCQkgImZvciB2b2x1bWUgY2FjaGluZy4iLCBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQl9CisKKwkJCWlmIChscC0+dGhpbiB8fCBscC0+Y2FjaGUpCisJCQkJLyogYWxyZWFkeSBwb29sLCBjYW4gY29udGludWUgY29udmVydGluZyB2b2x1bWUgKi8KKwkJCQlyZXR1cm4gMTsKKworCQkJbG9nX2Vycm9yKCJMViAlcyBpcyBhbHJlYWR5IHBvb2wuIiwgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobHAtPnRoaW4gfHwgbHAtPmNhY2hlKSB7CisJCQlsb2dfZXJyb3IoIi0tJXMgYW5kIHBvb2wgbWV0YWRhdGEgc3dhcCBpcyBub3Qgc3VwcG9ydGVkLiIsCisJCQkJICBscC0+dGhpbiA/ICJ0aGluIiA6ICJjYWNoZSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBGSVhNRSBjYWNoZSBwb29sICovCisJCWlmIChsdl9pc190aGluX3Bvb2wocG9vbF9sdikgJiYgcG9vbF9pc19hY3RpdmUocG9vbF9sdikpIHsKKwkJCS8qIElmIGFueSB2b2x1bWUgcmVmZXJlbmNpbmcgcG9vbCBhY3RpdmUgLSBhYm9ydCBoZXJlICovCisJCQlsb2dfZXJyb3IoIkNhbm5vdCBjb252ZXJ0IHBvb2wgJXMgd2l0aCBhY3RpdmUgdm9sdW1lcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlscC0+cGFzc2VkX2FyZ3MgfD0gUEFTU19BUkdfQ0hVTktfU0laRSB8IFBBU1NfQVJHX0RJU0NBUkRTIHwgUEFTU19BUkdfWkVSTzsKKwkJc2VnID0gZmlyc3Rfc2VnKHBvb2xfbHYpOworCisJCS8qIE5vcm1hbGx5IGRvIE5PVCBjaGFuZ2UgY2h1bmsgc2l6ZSB3aGVuIHN3YXBwaW5nICovCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgY2h1bmtzaXplX0FSRykgJiYKKwkJICAgIChscC0+Y2h1bmtfc2l6ZSAhPSBzZWctPmNodW5rX3NpemUpICYmCisJCSAgICAhZG1fbGlzdF9lbXB0eSgmcG9vbF9sdi0+c2Vnc191c2luZ190aGlzX2x2KSkgeworCQkJaWYgKGxwLT5mb3JjZSA9PSBQUk9NUFQpIHsKKwkJCQlsb2dfZXJyb3IoIkNodW5rIHNpemUgY2FuIGJlIG9ubHkgY2hhbmdlZCB3aXRoIC0tZm9yY2UuIENvbnZlcnNpb24gYWJvcnRlZC4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBDaGFuZ2luZyBjaHVuayBzaXplICVzIHRvICIKKwkJCQkgIiVzIGZvciAlcyBwb29sIHZvbHVtZS4iLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBzZWctPmNodW5rX3NpemUpLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBscC0+Y2h1bmtfc2l6ZSksCisJCQkJIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCS8qIE9rLCB1c2VyIGhhcyBsaWtlbHkgc29tZSBzZXJpb3VzIHJlYXNvbiBmb3IgdGhpcyAqLworCQkJaWYgKCFscC0+eWVzICYmCisJCQkgICAgeWVzX25vX3Byb21wdCgiRG8geW91IHJlYWxseSB3YW50IHRvIGNoYW5nZSBjaHVuayBzaXplICIKKwkJCQkJICAiZm9yICVzIHBvb2wgdm9sdW1lPyBbeS9uXTogIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSkgPT0gJ24nKSB7CisJCQkJbG9nX2Vycm9yKCJDb252ZXJzaW9uIGFib3J0ZWQuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZQorCQkJbHAtPmNodW5rX3NpemUgPSBzZWctPmNodW5rX3NpemU7CisKKwkJaWYgKCFfbHZjb252ZXJ0X3VwZGF0ZV9wb29sX3BhcmFtcyhwb29sX2x2LCBscCkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAobWV0YWRhdGFfbHYtPmxlX2NvdW50IDwgbHAtPnBvb2xfbWV0YWRhdGFfZXh0ZW50cykKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJDb250aW51aW5nIHdpdGggc3dhcC4uLiIpOworCisJCWlmICghYXJnX2lzX3NldChjbWQsIGRpc2NhcmRzX0FSRykpCisJCQlscC0+ZGlzY2FyZHMgPSBzZWctPmRpc2NhcmRzOworCQlpZiAoIWFyZ19pc19zZXQoY21kLCB6ZXJvX0FSRykpCisJCQlscC0+emVybyA9IHNlZy0+emVyb19uZXdfYmxvY2tzOworCisJCWlmICghbHAtPnllcyAmJgorCQkgICAgeWVzX25vX3Byb21wdCgiRG8geW91IHdhbnQgdG8gc3dhcCBtZXRhZGF0YSBvZiAlcyAiCisJCQkJICAicG9vbCB3aXRoIG1ldGFkYXRhIHZvbHVtZSAlcz8gW3kvbl06ICIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKG1ldGFkYXRhX2x2KSkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkNvbnZlcnNpb24gYWJvcnRlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogT25seSBjYWNoZSBwb29sIGNvbnZlcnNpb24gbWF5IHN1cHByZXNzIG1ldGFkYXRhIHplcm9pbmcKKwkJICogVE9ETzogTWF5YmUgc2ltaWxhciBzdXBwb3J0IGNvdWxkIGJlIHVzZWZ1bCBmb3IgdGhpbi1wb29sLCBidXQgLS16ZXJvCisJCSAqIGlzIGFscmVhZHkgb3ZlcmxvYWRlIGFuZCB3ZSB3b3VsZCBhbHNvIG5lZWQgdG8gcG9zc2libHkgbWF0Y2ggdHJhbnNhY3Rpb24gSWQuICovCisJCWlmIChzZWd0eXBlX2lzX2NhY2hlX3Bvb2wobHAtPnNlZ3R5cGUpICYmIG1ldGFkYXRhX2x2KQorCQkJLyogQ2hlY2sgaXMgdXNlciByZXF1ZXN0ZWQgemVyb2luZyBsb2dpYyB2aWEgWy1aIHl8bl0gKGRlZmF1bHQgaXMgeWVzKSAqLworCQkJemVyb19tZXRhZGF0YSA9IGFyZ19pbnRfdmFsdWUoY21kLCB6ZXJvX0FSRywgMSk7CisKKwkJbG9nX3dhcm4oIldBUk5JTkc6IENvbnZlcnRpbmcgbG9naWNhbCB2b2x1bWUgJXMlcyVzIHRvICVzIHBvb2wncyBkYXRhJXMgJXMgbWV0YWRhdGEgd2lwaW5nLiIsCisJCQkgZGlzcGxheV9sdm5hbWUocG9vbF9sdiksCisJCQkgbWV0YWRhdGFfbHYgPyAiIGFuZCAiIDogIiIsCisJCQkgbWV0YWRhdGFfbHYgPyBkaXNwbGF5X2x2bmFtZShtZXRhZGF0YV9sdikgOiAiIiwKKwkJCSBzZWd0eXBlX2lzX2NhY2hlX3Bvb2wobHAtPnNlZ3R5cGUpID8gImNhY2hlIiA6ICJ0aGluIiwKKwkJCSBtZXRhZGF0YV9sdiA/ICIgYW5kIG1ldGFkYXRhIHZvbHVtZXMiIDogIiB2b2x1bWUiLAorCQkJIHplcm9fbWV0YWRhdGEgPyAid2l0aCIgOiAiV0lUSE9VVCIpOworCisJCWlmICh6ZXJvX21ldGFkYXRhKQorCQkJbG9nX3dhcm4oIlRISVMgV0lMTCBERVNUUk9ZIENPTlRFTlQgT0YgTE9HSUNBTCBWT0xVTUUgKGZpbGVzeXN0ZW0gZXRjLikiKTsKKwkJZWxzZSAvKiBBVE0gc3VwcG9ydGVkIG9ubHkgZm9yIGNhY2hlIHBvb2xzICovCisJCQlsb2dfd2FybigiV0FSTklORzogVXNpbmcgbWlzbWF0Y2hlZCBjYWNoZSBwb29sIG1ldGFkYXRhICIKKwkJCQkgIk1BWSBERVNUUk9ZIFlPVVIgREFUQSEiKTsKKworCQlpZiAoIWxwLT55ZXMgJiYKKwkJICAgIHllc19ub19wcm9tcHQoIkRvIHlvdSByZWFsbHkgd2FudCB0byBjb252ZXJ0ICVzJXMlcz8gW3kvbl06ICIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSwKKwkJCQkgIG1ldGFkYXRhX2x2ID8gIiBhbmQgIiA6ICIiLAorCQkJCSAgbWV0YWRhdGFfbHYgPyBkaXNwbGF5X2x2bmFtZShtZXRhZGF0YV9sdikgOiAiIikgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIkNvbnZlcnNpb24gYWJvcnRlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHNlZ3R5cGVfaXNfY2FjaGVfcG9vbChscC0+c2VndHlwZSkpCisJCWFjdGl2YXRlX3Bvb2wgPSAwOyAvKiBDYW5ub3QgYWN0aXZhdGUgY2FjaGUgcG9vbCAqLworCWVsc2UKKwkJLyogQWxsb3cgdG8gaGF2ZSBvbmx5IHRoaW5wb29sIGFjdGl2ZSBhbmQgcmVzdG9yZSBpdCdzIGFjdGl2ZSBzdGF0ZSAqLworCQlhY3RpdmF0ZV9wb29sID0gbHZfaXNfYWN0aXZlKHBvb2xfbHYpOworCisJaWYgKChkbV9zbnByaW50ZihtZXRhZGF0YV9uYW1lLCBzaXplb2YobWV0YWRhdGFfbmFtZSksICIlcyVzIiwKKwkJCSBwb29sX2x2LT5uYW1lLAorCQkJIChzZWd0eXBlX2lzX2NhY2hlX3Bvb2wobHAtPnNlZ3R5cGUpKSA/CisJCQkgICJfY21ldGEiIDogIl90bWV0YSIpIDwgMCkgfHwKKwkgICAgKGRtX3NucHJpbnRmKGRhdGFfbmFtZSwgc2l6ZW9mKGRhdGFfbmFtZSksICIlcyVzIiwKKwkJCSBwb29sX2x2LT5uYW1lLAorCQkJIChzZWd0eXBlX2lzX2NhY2hlX3Bvb2wobHAtPnNlZ3R5cGUpKSA/CisJCQkgIl9jZGF0YSIgOiAiX3RkYXRhIikgPCAwKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgaW50ZXJuYWwgbHYgbmFtZXMsICIKKwkJCSAgInBvb2wgbmFtZSBpcyB0b28gbG9uZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFtZXRhZGF0YV9sdikgeworCQlpZiAoIV9sdmNvbnZlcnRfdXBkYXRlX3Bvb2xfcGFyYW1zKHBvb2xfbHYsIGxwKSkKKwkJCXJldHVybl8wOworCisJCWlmICghZ2V0X3N0cmlwZV9wYXJhbXMoY21kLCAmbHAtPnN0cmlwZXMsICZscC0+c3RyaXBlX3NpemUpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFhcmNoaXZlKHZnKSkKKwkJCXJldHVybl8wOworCisJCWlmICghKG1ldGFkYXRhX2x2ID0gYWxsb2NfcG9vbF9tZXRhZGF0YShwb29sX2x2LCBtZXRhZGF0YV9uYW1lLAorCQkJCQkJCWxwLT5yZWFkX2FoZWFkLCBscC0+c3RyaXBlcywKKwkJCQkJCQlscC0+c3RyaXBlX3NpemUsCisJCQkJCQkJbHAtPnBvb2xfbWV0YWRhdGFfZXh0ZW50cywKKwkJCQkJCQlscC0+YWxsb2MsIGxwLT5wdmgpKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCWlmICghZGVhY3RpdmF0ZV9sdihjbWQsIG1ldGFkYXRhX2x2KSkgeworCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGRlYWN0aXZhdGUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKG1ldGFkYXRhX2x2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghYXJjaGl2ZSh2ZykpCisJCQlyZXR1cm5fMDsKKworCQkvKiBTd2FwIG5vcm1hbCBMViB3aXRoIHBvb2wncyBtZXRhZGF0YSBMViA/ICovCisJCWlmIChsdl9pc19wb29sKHBvb2xfbHYpKSB7CisJCQkvKiBTd2FwIG5hbWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgbWV0YWRhdGEgTFYgKi8KKwkJCXNlZyA9IGZpcnN0X3NlZyhwb29sX2x2KTsKKwkJCWlmICghZGV0YWNoX3Bvb2xfbWV0YWRhdGFfbHYoc2VnLCAmcG9vbF9tZXRhZGF0YV9sdikpCisJCQkJcmV0dXJuXzA7CisJCQlvbGRfbmFtZSA9IG1ldGFkYXRhX2x2LT5uYW1lOworCQkJaWYgKCFsdl9yZW5hbWVfdXBkYXRlKGNtZCwgbWV0YWRhdGFfbHYsICJwdm1vdmVfdG1ldGEiLCAwKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWlmICghbHZfcmVuYW1lX3VwZGF0ZShjbWQsIHBvb2xfbWV0YWRhdGFfbHYsIG9sZF9uYW1lLCAwKSkKKwkJCQlyZXR1cm5fMDsKKworCQkJZ290byBtZGFfd3JpdGU7CisJCX0KKworCQlpZiAoemVyb19tZXRhZGF0YSkgeworCQkJbWV0YWRhdGFfbHYtPnN0YXR1cyB8PSBMVl9URU1QT1JBUlk7CisJCQlpZiAoIWFjdGl2YXRlX2x2X2xvY2FsKGNtZCwgbWV0YWRhdGFfbHYpKSB7CisJCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGFjdGl2YXRlIG1ldGFkYXRhIGx2LiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoIXdpcGVfbHYobWV0YWRhdGFfbHYsIChzdHJ1Y3Qgd2lwZV9wYXJhbXMpIHsgLmRvX3plcm8gPSAxIH0pKSB7CisJCQkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIHdpcGUgbWV0YWRhdGEgbHYuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBhcmUgY2hhbmdpbmcgdGFyZ2V0IHR5cGUsIHNvIGRlYWN0aXZhdGUgZmlyc3QgKi8KKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBtZXRhZGF0YV9sdikpIHsKKwkJbG9nX2Vycm9yKCJBYm9ydGluZy4gRmFpbGVkIHRvIGRlYWN0aXZhdGUgbWV0YWRhdGEgbHYuICIKKwkJCSAgIk1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGVhY3RpdmF0ZV9sdihjbWQsIHBvb2xfbHYpKSB7CisJCWxvZ19lcnJvcigiQWJvcnRpbmcuIEZhaWxlZCB0byBkZWFjdGl2YXRlIGxvZ2ljYWwgdm9sdW1lICVzLiIsCisJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGF0YV9sdiA9IHBvb2xfbHY7CisJb2xkX25hbWUgPSBkYXRhX2x2LT5uYW1lOyAvKiBVc2UgZm9yIHBvb2wgbmFtZSAqLworCS8qCisJICogU2luY2Ugd2Ugd2lzaCB0byBoYXZlIHVuZGVybGF5aW5nIGRldnMgdG8gbWF0Y2ggX1tjdF1kYXRhCisJICogcmVuYW1lIGRhdGEgTFYgdG8gbWF0Y2ggcG9vbCBMViBzdWJ0cmVlIGZpcnN0LAorCSAqIGFsc28gY2hlY2tzIGZvciB2aXNpYmxlIExWLgorCSAqLworCS8qIEZJWE1FOiBhbnkgbW9yZSB0eXBlcyBwcm9oaWJpdGVkIGhlcmU/ICovCisJaWYgKCFsdl9yZW5hbWVfdXBkYXRlKGNtZCwgZGF0YV9sdiwgZGF0YV9uYW1lLCAwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShwb29sX2x2ID0gbHZfY3JlYXRlX2VtcHR5KG9sZF9uYW1lLCBOVUxMLAorCQkJCQkoKHNlZ3R5cGVfaXNfY2FjaGVfcG9vbChscC0+c2VndHlwZSkpID8KKwkJCQkJIENBQ0hFX1BPT0wgOiBUSElOX1BPT0wpIHwKKwkJCQkJVklTSUJMRV9MViB8IExWTV9SRUFEIHwgTFZNX1dSSVRFLAorCQkJCQlBTExPQ19JTkhFUklULCB2ZykpKSB7CisJCWxvZ19lcnJvcigiQ3JlYXRpb24gb2YgcG9vbCBMViBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IHBvb2wgc2VnbWVudCAqLworCWlmICghKHNlZyA9IGFsbG9jX2x2X3NlZ21lbnQobHAtPnNlZ3R5cGUsIHBvb2xfbHYsIDAsIGRhdGFfbHYtPmxlX2NvdW50LAorCQkJCSAgICAgcG9vbF9sdi0+c3RhdHVzLCAwLCBOVUxMLCAxLAorCQkJCSAgICAgZGF0YV9sdi0+bGVfY291bnQsIDAsIDAsIDAsIE5VTEwpKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBBZGQgdGhlIG5ldyBzZWdtZW50IHRvIHRoZSBsYXllciBMViAqLworCWRtX2xpc3RfYWRkKCZwb29sX2x2LT5zZWdtZW50cywgJnNlZy0+bGlzdCk7CisJcG9vbF9sdi0+bGVfY291bnQgPSBkYXRhX2x2LT5sZV9jb3VudDsKKwlwb29sX2x2LT5zaXplID0gZGF0YV9sdi0+c2l6ZTsKKworCWlmICghYXR0YWNoX3Bvb2xfZGF0YV9sdihzZWcsIGRhdGFfbHYpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogQ3JlYXRlIGEgbmV3IGxvY2sgZm9yIGEgdGhpbiBwb29sIExWLiAgQSBjYWNoZSBwb29sIExWIGhhcyBubyBsb2NrLgorCSAqIExvY2tzIGFyZSByZW1vdmVkIGZyb20gZXhpc3RpbmcgTFZzIHRoYXQgYXJlIGJlaW5nIGNvbnZlcnRlZCB0bworCSAqIGRhdGEgYW5kIG1ldGEgTFZzICh0aGV5IGFyZSB1bmxvY2tlZCBhbmQgZGVsZXRlZCBiZWxvdy4pCisJICovCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJaWYgKHNlZ3R5cGVfaXNfY2FjaGVfcG9vbChscC0+c2VndHlwZSkpIHsKKwkJCWRhdGFfbHYtPmxvY2tfYXJncyA9IE5VTEw7CisJCQltZXRhZGF0YV9sdi0+bG9ja19hcmdzID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWRhdGFfbHYtPmxvY2tfYXJncyA9IE5VTEw7CisJCQltZXRhZGF0YV9sdi0+bG9ja19hcmdzID0gTlVMTDsKKworCQkJaWYgKCFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkKKwkJCQlwb29sX2x2LT5sb2NrX2FyZ3MgPSAicGVuZGluZyI7CisJCQllbHNlIGlmICghc3RyY21wKHZnLT5sb2NrX3R5cGUsICJkbG0iKSkKKwkJCQlwb29sX2x2LT5sb2NrX2FyZ3MgPSAiZGxtIjsKKwkJCS8qIFRoZSBsb2NrX2FyZ3Mgd2lsbCBiZSBzZXQgaW4gdmdfd3JpdGUoKS4gKi8KKwkJfQorCX0KKworCS8qIEZJWE1FOiByZXZlcnQgcmVuYW1lZCBMVnMgaW4gZmFpbCBwYXRoPyAqLworCS8qIEZJWE1FOiBhbnkgY29tbW9uIGNvZGUgd2l0aCBtZXRhZGF0YS90aGluX21hbmlwLmMgIGV4dGVuZF9wb29sKCkgPyAqLworCisJc2VnLT50cmFuc2FjdGlvbl9pZCA9IDA7CisKK21kYV93cml0ZToKKwlzZWctPmNodW5rX3NpemUgPSBscC0+Y2h1bmtfc2l6ZTsKKwlzZWctPmRpc2NhcmRzID0gbHAtPmRpc2NhcmRzOworCXNlZy0+emVyb19uZXdfYmxvY2tzID0gbHAtPnplcm8gPyAxIDogMDsKKworCWlmIChscC0+Y2FjaGVfbW9kZSAmJgorCSAgICAhY2FjaGVfc2V0X2NhY2hlX21vZGUoc2VnLCBscC0+Y2FjaGVfbW9kZSkpCisJCXJldHVybl8wOworCisJaWYgKChscC0+cG9saWN5X25hbWUgfHwgbHAtPnBvbGljeV9zZXR0aW5ncykgJiYKKwkgICAgIWNhY2hlX3NldF9wb2xpY3koc2VnLCBscC0+cG9saWN5X25hbWUsIGxwLT5wb2xpY3lfc2V0dGluZ3MpKQorCQlyZXR1cm5fMDsKKworCS8qIFJlbmFtZSBkZWFjdGl2YXRlZCBtZXRhZGF0YSBMViB0byBoYXZlIF90bWV0YSBzdWZmaXggKi8KKwkvKiBJbXBsaWNpdCBjaGVja3MgaWYgbWV0YWRhdGFfbHYgaXMgdmlzaWJsZSAqLworCWlmIChscC0+cG9vbF9tZXRhZGF0YV9uYW1lICYmCisJICAgICFsdl9yZW5hbWVfdXBkYXRlKGNtZCwgbWV0YWRhdGFfbHYsIG1ldGFkYXRhX25hbWUsIDApKQorCQlyZXR1cm5fMDsKKworCWlmICghYXR0YWNoX3Bvb2xfbWV0YWRhdGFfbHYoc2VnLCBtZXRhZGF0YV9sdikpCisJCXJldHVybl8wOworCisJaWYgKCFoYW5kbGVfcG9vbF9tZXRhZGF0YV9zcGFyZSh2ZywgbWV0YWRhdGFfbHYtPmxlX2NvdW50LAorCQkJCQlscC0+cHZoLCBscC0+cG9vbG1ldGFkYXRhc3BhcmUpKQorCQlyZXR1cm5fMDsKKworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKQorCQlyZXR1cm5fMDsKKworCWlmIChzZWctPnplcm9fbmV3X2Jsb2NrcyAmJgorCSAgICBzZWctPmNodW5rX3NpemUgID49IERFRkFVTFRfVEhJTl9QT09MX0NIVU5LX1NJWkVfUEVSRk9STUFOQ0UgKiAyKQorCQlsb2dfd2FybigiV0FSTklORzogUG9vbCB6ZXJvaW5nIGFuZCBsYXJnZSAlcyBjaHVuayBzaXplIHNsb3dzIGRvd24gIgorCQkJICJwcm92aXNpb25pbmcuIiwgZGlzcGxheV9zaXplKGNtZCwgc2VnLT5jaHVua19zaXplKSk7CisKKwlpZiAoYWN0aXZhdGVfcG9vbCAmJiAhbG9ja2RfbHYoY21kLCBwb29sX2x2LCAiZXgiLCBMRExWX1BFUlNJU1RFTlQpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGxvY2sgcG9vbCBMViAlcy4iLCBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhY3RpdmF0ZV9wb29sICYmCisJICAgICFhY3RpdmF0ZV9sdl9leGNsKGNtZCwgcG9vbF9sdikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWN0aXZhdGUgcG9vbCBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCS8qIERlYWN0aXZhdGUgc3Vidm9sdW1lcyAqLworCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBzZWdfbHYoc2VnLCAwKSkpCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlIHBvb2wgZGF0YSBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUoc2VnX2x2KHNlZywgMCkpKTsKKwkJaWYgKCFkZWFjdGl2YXRlX2x2KGNtZCwgc2VnLT5tZXRhZGF0YV9sdikpCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBkZWFjdGl2YXRlIHBvb2wgbWV0YWRhdGEgbG9naWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHNlZy0+bWV0YWRhdGFfbHYpKTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IDE7CisJbHAtPnBvb2xfZGF0YV9sdiA9IHBvb2xfbHY7CisKK291dDoKKwliYWNrdXAodmcpOworCisJaWYgKHIpCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJDb252ZXJ0ZWQgJXMgdG8gJXMgcG9vbC4iLAorCQkJCQlkaXNwbGF5X2x2bmFtZShwb29sX2x2KSwKKwkJCQkJKHNlZ3R5cGVfaXNfY2FjaGVfcG9vbChscC0+c2VndHlwZSkpID8KKwkJCQkJImNhY2hlIiA6ICJ0aGluIik7CisKKwkvKgorCSAqIFVubG9jayBhbmQgZnJlZSB0aGUgbG9ja3MgZnJvbSBleGlzdGluZyBMVnMgdGhhdCBiZWNhbWUgcG9vbCBkYXRhCisJICogYW5kIG1ldGEgTFZzLgorCSAqLworCWlmIChsb2NrZF9kYXRhX25hbWUpIHsKKwkJaWYgKCFsb2NrZF9sdl9uYW1lKGNtZCwgdmcsIGxvY2tkX2RhdGFfbmFtZSwgJmxvY2tkX2RhdGFfaWQsIGxvY2tkX2RhdGFfYXJncywgInVuIiwgTERMVl9QRVJTSVNURU5UKSkKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVubG9jayBwb29sIGRhdGEgTFYgJXMvJXMiLCB2Zy0+bmFtZSwgbG9ja2RfZGF0YV9uYW1lKTsKKwkJbG9ja2RfZnJlZV9sdihjbWQsIHZnLCBsb2NrZF9kYXRhX25hbWUsICZsb2NrZF9kYXRhX2lkLCBsb2NrZF9kYXRhX2FyZ3MpOworCX0KKworCWlmIChsb2NrZF9tZXRhX25hbWUpIHsKKwkJaWYgKCFsb2NrZF9sdl9uYW1lKGNtZCwgdmcsIGxvY2tkX21ldGFfbmFtZSwgJmxvY2tkX21ldGFfaWQsIGxvY2tkX21ldGFfYXJncywgInVuIiwgTERMVl9QRVJTSVNURU5UKSkKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHVubG9jayBwb29sIG1ldGFkYXRhIExWICVzLyVzIiwgdmctPm5hbWUsIGxvY2tkX21ldGFfbmFtZSk7CisJCWxvY2tkX2ZyZWVfbHYoY21kLCB2ZywgbG9ja2RfbWV0YV9uYW1lLCAmbG9ja2RfbWV0YV9pZCwgbG9ja2RfbWV0YV9hcmdzKTsKKwl9CisKKwlyZXR1cm4gcjsKKyNpZiAwCityZXZlcnRfbmV3X2x2OgorCS8qIFRCRCAqLworCWlmICghbHAtPnBvb2xfbWV0YWRhdGFfbHZfbmFtZSkgeworCQlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBtZXRhZGF0YV9sdikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRlYWN0aXZhdGUgbWV0YWRhdGEgbHYuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWx2X3JlbW92ZShtZXRhZGF0YV9sdikgfHwgIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJCWxvZ19lcnJvcigiTWFudWFsIGludGVydmVudGlvbiBtYXkgYmUgcmVxdWlyZWQgdG8gcmVtb3ZlICIKKwkJCQkgICJhYmFuZG9uZWQgTFYocykgYmVmb3JlIHJldHJ5aW5nLiIpOworCQllbHNlCisJCQliYWNrdXAodmcpOworCX0KKworCXJldHVybiAwOworI2VuZGlmCit9CisKKy8qCisgKiBDb252ZXJ0IG9yaWdpbiBpbnRvIGEgY2FjaGUgTFYgYnkgYXR0YWNoaW5nIGEgY2FjaGUgcG9vbC4KKyAqLworc3RhdGljIGludCBfbHZjb252ZXJ0X2NhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqb3JpZ2luX2x2LAorCQkJICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnBvb2xfbHYgPSBscC0+cG9vbF9kYXRhX2x2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqY2FjaGVfbHY7CisKKwlpZiAoIXZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9wb29sKHBvb2xfbHYpKQorCQlyZXR1cm5fMDsKKworCWlmICghYXJjaGl2ZShvcmlnaW5fbHYtPnZnKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShjYWNoZV9sdiA9IGx2X2NhY2hlX2NyZWF0ZShwb29sX2x2LCBvcmlnaW5fbHYpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWNhY2hlX3NldF9jYWNoZV9tb2RlKGZpcnN0X3NlZyhjYWNoZV9sdiksIGxwLT5jYWNoZV9tb2RlKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWNhY2hlX3NldF9wb2xpY3koZmlyc3Rfc2VnKGNhY2hlX2x2KSwgbHAtPnBvbGljeV9uYW1lLCBscC0+cG9saWN5X3NldHRpbmdzKSkKKwkJcmV0dXJuXzA7CisKKwljYWNoZV9jaGVja19mb3Jfd2FybnMoZmlyc3Rfc2VnKGNhY2hlX2x2KSk7CisKKwlpZiAoIWx2X3VwZGF0ZV9hbmRfcmVsb2FkKGNhY2hlX2x2KSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm93IGNhY2hlZC4iLAorCQkJCWRpc3BsYXlfbHZuYW1lKGNhY2hlX2x2KSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyBjYWxsZWQgdG8gcGVyZm9ybSBhIHNwZWNpZmljIG9wZXJhdGlvbiBvbiBhIHNwZWNpZmljIExWIHR5cGUuCisgKgorICogX2NvbnZlcnRfPGx2dHlwZT5fPG9wZXJhdGlvbj4KKyAqCisgKiBGb3IgY2FzZXMgd2hlcmUgYW4gb3BlcmF0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBMViBpdHNlbGYsIGJ1dAorICogaXMgaW1wbGljaXRseSByZWRpcmVjdGVkIHRvIGEgc3ViLUxWLCB0aGVzZSBmdW5jdGlvbnMgbG9jYXRlIHRoZQorICogY29ycmVjdCBzdWItTFYgYW5kIGNhbGwgdGhlIG9wZXJhdGlvbiBvbiB0aGF0IHN1Yi1MVi4gIElmIGEgc3ViLUxWCisgKiBvZiB0aGUgcHJvcGVyIHR5cGUgaXMgbm90IGZvdW5kLCB0aGVzZSBmdW5jdGlvbnMgcmVwb3J0IHRoZSBlcnJvci4KKyAqCisgKiBGSVhNRTogdGhlIF9sdmNvbnZlcnRfZm9vKCkgZnVuY3Rpb25zIGNhbiBiZSBjbGVhbmVkIHVwIHNpbmNlIHRoZXkKKyAqIGFyZSBub3cgb25seSBjYWxsZWQgZm9yIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBMViB0eXBlIGFuZCBvcGVyYXRpb24uCisgKiBBZnRlciB0aGF0IGhhcHBlbnMsIHRoZSBjb2RlIHJlbWFpbmluZyBpbiB0aG9zZSBmdW5jdGlvbnMgY2FuIGJlCisgKiBtb3ZlZCBpbnRvIHRoZSBfY29udmVydF9sdnR5cGVfb3BlcmF0aW9uKCkgZnVuY3Rpb25zIGJlbG93LgorICovCisKKy8qCisgKiBTZXBhcmF0ZSBhIENPVyBzbmFwc2hvdCBMViBmcm9tIGl0cyBvcmlnaW4uCisgKiBsdmNvbnZlcnQgLS1zcGxpdHNuYXBzaG90IExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfY293X3NuYXBzaG90X3NwbGl0c25hcHNob3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgICAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfc3BsaXRzbmFwc2hvdChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBNZXJnZSBhIENPVyBzbmFwc2hvdCBMViBpbnRvIGl0cyBvcmlnaW4uCisgKiBsdmNvbnZlcnQgLS1tZXJnZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X2Nvd19zbmFwc2hvdF9tZXJnZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X21lcmdlX29sZF9zbmFwc2hvdChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBNZXJnZSBhIHNuYXBzaG90IHRoaW4gTFYgaW50byBpdHMgb3JpZ2luLgorICogbHZjb252ZXJ0IC0tbWVyZ2UgTFYKKyAqLworCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fdm9sdW1lX21lcmdlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9tZXJnZV90aGluX3NuYXBzaG90KGNtZCwgbHYsIGxwKTsKK30KKworLyoKKyAqIFNwbGl0IGFuZCBwcmVzZXJ2ZSBhIGNhY2hlIHBvb2wgZnJvbSB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgdGhpbiBwb29sIExWLgorICogbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fcG9vbF9zcGxpdGNhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc3VibHYxOworCisJc3VibHYxID0gc2VnX2x2KGZpcnN0X3NlZyhsdiksIDApOyAvKiBjYWNoZWQgX3RkYXRhID8gKi8KKworCWlmICghbHZfaXNfY2FjaGUoc3VibHYxKSkgeworCQlsb2dfZXJyb3IoIlN1YiBMViAlcyBtdXN0IGJlIGNhY2hlLiIsIGRpc3BsYXlfbHZuYW1lKHN1Ymx2MSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2x2Y29udmVydF9zcGxpdF9jYWNoZWQoY21kLCBzdWJsdjEpOworfQorCisvKgorICogU3BsaXQgYW5kIHJlbW92ZSBhIGNhY2hlIHBvb2wgZnJvbSB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgdGhpbiBwb29sIExWLgorICogbHZjb252ZXJ0IC0tdW5jYWNoZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fcG9vbF91bmNhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKnN1Ymx2MSA9IE5VTEw7CisKKwlzdWJsdjEgPSBzZWdfbHYoZmlyc3Rfc2VnKGx2KSwgMCk7IC8qIGNhY2hlZCBfdGRhdGEgPyAqLworCisJaWYgKCFsdl9pc19jYWNoZShzdWJsdjEpKSB7CisJCWxvZ19lcnJvcigiU3ViIExWICVzIG11c3QgYmUgY2FjaGUuIiwgZGlzcGxheV9sdm5hbWUoc3VibHYxKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfbHZjb252ZXJ0X3VuY2FjaGUoY21kLCBzdWJsdjEsIGxwKTsKK30KKworLyoKKyAqIFJlcGFpciBhIHRoaW4gcG9vbCBMVi4KKyAqIGx2Y29udmVydCAtLXJlcGFpciBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fcG9vbF9yZXBhaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfdGhpbl9wb29sX3JlcGFpcihjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBkYXRhIHBvcnRpb24gb2YgYSB0aGluIHBvb2wgTFYgdG8gYSBjYWNoZSBMVi4KKyAqIGx2Y29udmVydCAtLXR5cGUgY2FjaGUgTFYKKyAqCisgKiBSZXF1aXJlZCBvcHRpb25zOgorICogLS1jYWNoZXBvb2wgTFYKKyAqCisgKiBBdXhpbGlhcnkgb3BlcmF0aW9uOgorICogQ29udmVydHMgdGhlIC0tY2FjaGVwb29sIGFyZyB0byBhIGNhY2hlIHBvb2wgaWYgaXQgaXMgbm90IGFscmVhZHkuCisgKgorICogQWx0ZXJuYXRlIHN5bnRheDoKKyAqIGx2Y29udmVydCAtLWNhY2hlIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfdGhpbl9wb29sX2NhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJLyogbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSBpbmNsdWRlcyBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIHRoZSBjYWNoZXBvb2wgYXJnIHRvIHR5cGUgY2FjaGUtcG9vbC4gKi8KKwlpZiAoIV9sdmNvbnZlcnRfcG9vbChjbWQsIGx2LCBscCkpIHsKKwkJbG9nX2Vycm9yKCJJbXBsaWNpdCBjb252ZXJzaW9uIG9mIC0tY2FjaGVwb29sIGFyZyB0byB0eXBlIGNhY2hlLXBvb2wgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGdyYWIgdGhlIHRkYXRhIHN1YiBMViB0byBwYXNzIG9uPyAqLworCisJcmV0dXJuIF9sdmNvbnZlcnRfY2FjaGUoY21kLCBsdiwgbHApOworfQorCisvKgorICogUmVwbGFjZSB0aGUgbWV0YWRhdGEgTFYgaW4gYSB0aGluIHBvb2wgTFYuCisgKiBsdmNvbnZlcnQgLS1wb29sbWV0YWRhdGEgTmV3TFYgLS10aGlucG9vbCBMVgorICogRklYTUU6IHRoaXMgd2lsbCBjaGFuZ2Ugc28gLS1zd2FwLXBvb2xtZXRhZGF0YSBkZWZpbmVzIHRoZSBvcGVyYXRpb24uCisgKiBGSVhNRTogc2hvdWxkIGJlIGx2Y29udmVydCAtLXN3YXAtcG9vbG1ldGFkYXRhIE5ld0xWIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfdGhpbl9wb29sX3N3YXBtZXRhZGF0YShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3Bvb2woY21kLCBsdiwgbHApOworfQorCisvKgorICogU3BsaXQgYW5kIHByZXNlcnZlIGEgY2FjaGUgcG9vbCBmcm9tIGEgY2FjaGUgTFYuCisgKiBsdmNvbnZlcnQgLS1zcGxpdGNhY2hlIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfY2FjaGVfdm9sdW1lX3NwbGl0Y2FjaGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfc3BsaXRfY2FjaGVkKGNtZCwgbHYpOworfQorCisvKgorICogU3BsaXQgYW5kIHJlbW92ZSBhIGNhY2hlIHBvb2wgZnJvbSBhIGNhY2hlIExWLgorICogbHZjb252ZXJ0IC0tdW5jYWNoZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X2NhY2hlX3ZvbHVtZV91bmNhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3VuY2FjaGUoY21kLCBsdiwgbHApOworfQorCisvKgorICogU3BsaXQgaW1hZ2VzIGZyb20gdGhlIHJhaWQxfG1pcnJvciBvcmlnaW4gb2YgYSBjYWNoZSBMViBhbmQgdXNlIHRoZW0gdG8gY3JlYXRlIGEgbmV3IExWLgorICogbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIE51bWJlciBMVgorICoKKyAqIFJlcXVpcmVkIG9wdGlvbnM6CisgKiAtLXRyYWNrY2hhbmdlcyB8IC0tbmFtZSBOYW1lCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfY2FjaGVfdm9sdW1lX3NwbGl0bWlycm9ycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzdWJsdjE7CisKKwlzdWJsdjEgPSBzZWdfbHYoZmlyc3Rfc2VnKGx2KSwgMCk7CisKKwlpZiAobHZfaXNfcmFpZChzdWJsdjEpKQorCQlyZXR1cm4gX2x2Y29udmVydF9yYWlkKHN1Ymx2MSwgbHApOworCisJaWYgKGx2X2lzX21pcnJvcihzdWJsdjEpKQorCQlyZXR1cm4gX2x2Y29udmVydF9taXJyb3JzKGNtZCwgbHYsIGxwKTsKKworCWxvZ19lcnJvcigiU3ViIExWICVzIG11c3QgYmUgcmFpZCBvciBtaXJyb3IuIiwgZGlzcGxheV9sdm5hbWUoc3VibHYxKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgY2FjaGUgTFYgdG8gYSB0aGluIHBvb2wgKHVzaW5nIHRoZSBjYWNoZSBMViBmb3IgdGhpbiBwb29sIGRhdGEpLgorICogbHZjb252ZXJ0IC0tdHlwZSB0aGluLXBvb2wgTFYKKyAqCisgKiBBbHRlcm5hdGUgc3ludGF4OgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGFib3ZlLCBidXQgbm90IHByZWZlcnJlZCBiZWNhdXNlIGl0J3MgYW1iaWd1b3VzIGFuZCBpbmNvbnNpc3RlbnQuCisgKiBsdmNvbnZlcnQgLS10aGlucG9vbCBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X2NhY2hlX3ZvbHVtZV90aGluX3Bvb2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9wb29sKGNtZCwgbHYsIGxwKTsKK30KKworLyoKKyAqIFNwbGl0IGEgY2FjaGUgdm9sdW1lIGZyb20gYSBjYWNoZSBwb29sIExWLgorICogbHZjb252ZXJ0IC0tc3BsaXRjYWNoZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X2NhY2hlX3Bvb2xfc3BsaXRjYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzdWJsdjE7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKworCS8qIFdoZW4gcGFzc2VkIHVzZWQgY2FjaGUtcG9vbCBvZiB1c2VkIGNhY2hlZCBMViAtPiBzcGxpdCBjYWNoZWQgTFYgKi8KKworCWlmICgoZG1fbGlzdF9zaXplKCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSA9PSAxKSAmJgorCSAgICAoc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KGx2KSkgJiYKKwkgICAgc2VnX2lzX2NhY2hlKHNlZykpCisJCXN1Ymx2MSA9IHNlZy0+bHY7CisJZWxzZSB7CisJCWxvZ19lcnJvcigiU3ViIExWIG9mIGNhY2hlIHR5cGUgbm90IGZvdW5kLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2X2lzX2NhY2hlKHN1Ymx2MSkpIHsKKwkJbG9nX2Vycm9yKCJTdWIgTFYgJXMgbXVzdCBiZSBjYWNoZS4iLCBkaXNwbGF5X2x2bmFtZShzdWJsdjEpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIF9sdmNvbnZlcnRfc3BsaXRfY2FjaGVkKGNtZCwgc3VibHYxKTsKK30KKworLyoKKyAqIFJlcGxhY2UgdGhlIG1ldGFkYXRhIExWIGluIGEgY2FjaGUgcG9vbCBMVi4KKyAqIGx2Y29udmVydCAtLXBvb2xtZXRhZGF0YSBOZXdMViAtLWNhY2hlcG9vbCBMVgorICogRklYTUU6IHRoaXMgd2lsbCBjaGFuZ2Ugc28gLS1zd2FwLXBvb2xtZXRhZGF0YSBkZWZpbmVzIHRoZSBvcGVyYXRpb24uCisgKiBGSVhNRTogc2hvdWxkIGJlIGx2Y29udmVydCAtLXN3YXAtcG9vbG1ldGFkYXRhIE5ld0xWIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfY2FjaGVfcG9vbF9zd2FwbWV0YWRhdGEoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJCSAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfcG9vbChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIG51bWJlciBvZiBpbWFnZXMgaW4gYSBtaXJyb3IgTFYuCisgKiBsdmNvbnZlcnQgLS1taXJyb3JzIE51bWJlciBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X21pcnJvcl9udW1iZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfbWlycm9ycyhjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBTcGxpdCBpbWFnZXMgZnJvbSBhIG1pcnJvciBMViBhbmQgdXNlIHRoZW0gdG8gY3JlYXRlIGEgbmV3IExWLgorICogbHZjb252ZXJ0IC0tc3BsaXRtaXJyb3JzIE51bWJlciBMVgorICoKKyAqIFJlcXVpcmVkIG9wdGlvbnM6CisgKiAtLW5hbWUgTmFtZQorICovCisKK3N0YXRpYyBpbnQgX2NvbnZlcnRfbWlycm9yX3NwbGl0bWlycm9ycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X21pcnJvcnMoY21kLCBsdiwgbHApOworfQorCisvKgorICogQ2hhbmdlIHRoZSB0eXBlIG9mIGxvZyB1c2VkIGJ5IGEgbWlycm9yIExWLgorICogbHZjb252ZXJ0IC0tbWlycm9ybG9nIFR5cGUgTFYKKyAqLworc3RhdGljIGludCBfY29udmVydF9taXJyb3JfbG9nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X21pcnJvcnMoY21kLCBsdiwgbHApOworfQorCisvKgorICogUmVwbGFjZSBmYWlsZWQgUFZzIGluIGEgbWlycm9yIExWLgorICogbHZjb252ZXJ0IC0tcmVwYWlyIExWCisgKgorICogQXV4aWxpYXJ5IG9wZXJhdGlvbjoKKyAqIFJlbW92ZXMgbWlzc2luZywgZW1wdHkgUFZzIGZyb20gdGhlIFZHLCBsaWtlIHZncmVkdWNlLgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X21pcnJvcl9yZXBhaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJc3RydWN0IGRtX2xpc3QgKmZhaWxlZF9wdnM7CisJaW50IHJldDsKKworCXJldCA9IF9sdmNvbnZlcnRfbWlycm9yc19yZXBhaXIoY21kLCBsdiwgbHApOworCisJaWYgKHJldCAmJiBhcmdfaXNfc2V0KGNtZCwgdXNlcG9saWNpZXNfQVJHKSkgeworCQlpZiAoKGZhaWxlZF9wdnMgPSBfZmFpbGVkX3B2X2xpc3QobHYtPnZnKSkpCisJCQlfcmVtb3ZlX21pc3NpbmdfZW1wdHlfcHYobHYtPnZnLCBmYWlsZWRfcHZzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29udmVydCBtaXJyb3IgTFYgdG8gbGluZWFyIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSBsaW5lYXIgTFYKKyAqCisgKiBBbHRlcm5hdGUgc3ludGF4OgorICogbHZjb252ZXJ0IC0tbWlycm9ycyAwIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfbWlycm9yX2xpbmVhcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9taXJyb3JzKGNtZCwgbHYsIGxwKTsKK30KKworLyoKKyAqIENvbnZlcnQgbWlycm9yIExWIHRvIHJhaWQxIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSByYWlkMSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X21pcnJvcl9yYWlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCXN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9yYWlkKGx2LCBscCk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIG51bWJlciBvZiBpbWFnZXMgaW4gYSByYWlkMSBMVi4KKyAqIGx2Y29udmVydCAtLW1pcnJvcnMgTnVtYmVyIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfcmFpZF9udW1iZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3JhaWQobHYsIGxwKTsKK30KKworLyoKKyAqIFNwbGl0IGltYWdlcyBmcm9tIGEgcmFpZDEgTFYgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIG5ldyBMVi4KKyAqIGx2Y29udmVydCAtLXNwbGl0bWlycm9ycyBOdW1iZXIgTFYKKyAqCisgKiBSZXF1aXJlZCBvcHRpb25zOgorICogLS10cmFja2NoYW5nZXMgfCAtLW5hbWUgTmFtZQorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3JhaWRfc3BsaXRtaXJyb3JzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwkvKiBGSVhNRTogc3BsaXQgdGhlIHNwbGl0bWlycm9ycyBzZWN0aW9uIG91dCBvZiBfbHZjb252ZXJ0X3JhaWQgYW5kIGNhbGwgaXQgaGVyZS4gKi8KKwlyZXR1cm4gX2x2Y29udmVydF9yYWlkKGx2LCBscCk7Cit9CisKKy8qCisgKiBNZXJnZSBhIHJhaWQxIExWIGludG8gb3JpZ2luYWxMViBpZiB0aGUgcmFpZDEgTFYgd2FzCisgKiBwcmV2aW91c2x5IHNwbGl0IGZyb20gdGhlIG9yaWdpbmFsTFYgdXNpbmcgLS10cmFja2NoYW5nZXMuCisgKiBsdmNvbnZlcnQgLS1tZXJnZSBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3JhaWRfbWVyZ2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCS8qIEZJWE1FOiBzcGxpdCB0aGUgbWVyZ2Ugc2VjdGlvbiBvdXQgb2YgX2x2Y29udmVydF9yYWlkIGFuZCBjYWxsIGl0IGhlcmUuICovCisJcmV0dXJuIF9sdmNvbnZlcnRfcmFpZChsdiwgbHApOworfQorCisvKgorICogUmVwbGFjZSBmYWlsZWQgUFZzIGluIGEgcmFpZCogTFYuCisgKiBsdmNvbnZlcnQgLS1yZXBhaXIgTFYKKyAqCisgKiBBdXhpbGlhcnkgb3BlcmF0aW9uOgorICogUmVtb3ZlcyBtaXNzaW5nLCBlbXB0eSBQVnMgZnJvbSB0aGUgVkcsIGxpa2UgdmdyZWR1Y2UuCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfcmFpZF9yZXBhaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXN0cnVjdCBkbV9saXN0ICpmYWlsZWRfcHZzOworCWludCByZXQ7CisKKwkvKiBGSVhNRTogc3BsaXQgdGhlIHJlcGFpciBzZWN0aW9uIG91dCBvZiBfbHZjb252ZXJ0X3JhaWQgYW5kIGNhbGwgaXQgaGVyZS4gKi8KKwlyZXQgPSBfbHZjb252ZXJ0X3JhaWQobHYsIGxwKTsKKworCWlmIChyZXQgJiYgYXJnX2lzX3NldChjbWQsIHVzZXBvbGljaWVzX0FSRykpIHsKKwkJaWYgKChmYWlsZWRfcHZzID0gX2ZhaWxlZF9wdl9saXN0KGx2LT52ZykpKQorCQkJX3JlbW92ZV9taXNzaW5nX2VtcHR5X3B2KGx2LT52ZywgZmFpbGVkX3B2cyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlcGxhY2UgYSBzcGVjaWZpYyBQViBpbiBhIHJhaWQqIExWIHdpdGggYW5vdGhlciBQVi4KKyAqIGx2Y29udmVydCAtLXJlcGxhY2UgUFYgTFYKKyAqLworc3RhdGljIGludCBfY29udmVydF9yYWlkX3JlcGxhY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwkvKiBGSVhNRTogcmVtb3ZlIHRoZSByZXBsYWNlIHNlY3Rpb24gZnJvbSBfbHZjb252ZXJ0X3JhaWQgKi8KKwlyZXR1cm4gX2x2Y29udmVydF9yYWlkKGx2LCBscCk7Cit9CisKKy8qCisgKiBDb21iaW5lIGEgcmFpZCogTFYgd2l0aCBhIHNuYXBzaG90IExWIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqIHNwbGl0IGZyb20gdGhlIHJhaWQqIExWIHVzaW5nIC0tc3BsaXRzbmFwc2hvdC4KKyAqIGx2Y29udmVydCAtLXR5cGUgc25hcHNob3QgTFYgU25hcHNob3RMVgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBsdmNvbnZlcnQgLS1zbmFwc2hvdCBMViBTbmFwc2hvdExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfcmFpZF9zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9zbmFwc2hvdChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgcmFpZCogTFYgdG8gYSB0aGluIExWIHdpdGggYW4gZXh0ZXJuYWwgb3JpZ2luLgorICogbHZjb252ZXJ0IC0tdHlwZSB0aGluIExWCisgKgorICogUmVxdWlyZWQgb3B0aW9uczoKKyAqIC0tdGhpbnBvb2wgTFYKKyAqCisgKiBBdXhpbGlhcnkgb3BlcmF0aW9uOgorICogQ29udmVydHMgdGhlIC0tdGhpbnBvb2wgYXJnIHRvIGEgdGhpbiBwb29sIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBsdmNvbnZlcnQgLS10aGluIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfcmFpZF90aGluKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCS8qIGx2Y29udmVydCAtLXRoaW4gaW5jbHVkZXMgYW4gaW1wbGljaXQgY29udmVyc2lvbiBvZiB0aGUgdGhpbnBvb2wgYXJnIHRvIHR5cGUgdGhpbi1wb29sLiAqLworCWlmICghX2x2Y29udmVydF9wb29sKGNtZCwgbHYsIGxwKSkgeworCQlsb2dfZXJyb3IoIkltcGxpY2l0IGNvbnZlcnNpb24gb2YgLS10aGlucG9vbCBhcmcgdG8gdHlwZSB0aGluLXBvb2wgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2x2Y29udmVydF90aGluKGNtZCwgbHYsIGxwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSByYWlkKiBMViB0byBhIGNhY2hlIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSBjYWNoZSBMVgorICoKKyAqIFJlcXVpcmVkIG9wdGlvbnM6CisgKiAtLWNhY2hlcG9vbCBMVgorICoKKyAqIEF1eGlsaWFyeSBvcGVyYXRpb246CisgKiBDb252ZXJ0cyB0aGUgLS1jYWNoZXBvb2wgYXJnIHRvIGEgY2FjaGUgcG9vbCBpZiBpdCBpcyBub3QgYWxyZWFkeS4KKyAqCisgKiBBbHRlcm5hdGUgc3ludGF4OgorICogbHZjb252ZXJ0IC0tY2FjaGUgTFYKKyAqLworc3RhdGljIGludCBfY29udmVydF9yYWlkX2NhY2hlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwkvKiBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIGluY2x1ZGVzIGFuIGltcGxpY2l0IGNvbnZlcnNpb24gb2YgdGhlIGNhY2hlcG9vbCBhcmcgdG8gdHlwZSBjYWNoZS1wb29sLiAqLworCWlmICghX2x2Y29udmVydF9wb29sKGNtZCwgbHYsIGxwKSkgeworCQlsb2dfZXJyb3IoIkltcGxpY2l0IGNvbnZlcnNpb24gb2YgLS1jYWNoZXBvb2wgYXJnIHRvIHR5cGUgY2FjaGUtcG9vbCBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfbHZjb252ZXJ0X2NhY2hlKGNtZCwgbHYsIGxwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSByYWlkKiBMViB0byBhIHRoaW4tcG9vbCBMVi4KKyAqIGx2Y29udmVydCAtLXR5cGUgdGhpbi1wb29sIExWCisgKgorICogQWx0ZXJuYXRlIHN5bnRheDoKKyAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhYm92ZSwgYnV0IG5vdCBwcmVmZXJyZWQgYmVjYXVzZSBpdCdzIGFtYmlndW91cyBhbmQgaW5jb25zaXN0ZW50LgorICogbHZjb252ZXJ0IC0tdGhpbnBvb2wgTFYKKyAqLworc3RhdGljIGludCBfY29udmVydF9yYWlkX3RoaW5fcG9vbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfcG9vbChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgcmFpZCogTFYgdG8gY2FjaGUtcG9vbCBMVi4KKyAqIGx2Y29udmVydCAtLXR5cGUgY2FjaGUtcG9vbCBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3JhaWRfY2FjaGVfcG9vbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3Bvb2woY21kLCBsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHJhaWQqIExWIHRvIHVzZSBhIGRpZmZlcmVudCByYWlkIGxldmVsLgorICogbHZjb252ZXJ0IC0tdHlwZSByYWlkKiBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3JhaWRfcmFpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9yYWlkKGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgcmFpZCogTFYgdG8gYSBzdHJpcGVkIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSBzdHJpcGVkIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfcmFpZF9zdHJpcGVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfcmFpZChsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHJhaWQqIExWIHRvIGEgbGluZWFyIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSBsaW5lYXIgTFYKKyAqLworc3RhdGljIGludCBfY29udmVydF9yYWlkX2xpbmVhcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQlzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfcmFpZChsdiwgbHApOworfQorCisvKgorICogTWVyZ2UgYSBzdHJpcGVkL2xpbmVhciBMViBpbnRvIGEgcmFpZDEgTFYgaWYgdGhlIHN0cmlwZWQvbGluZWFyIExWIHdhcworICogcHJldmlvdXNseSBzcGxpdCBmcm9tIHRoZSByYWlkMSBMViB1c2luZyAtLXRyYWNrY2hhbmdlcy4KKyAqIGx2Y29udmVydCAtLW1lcmdlIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF9tZXJnZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9yYWlkKGx2LCBscCk7Cit9CisKKy8qCisgKiBDb21iaW5lIGEgbGluZWFyL3N0cmlwZWQgTFYgd2l0aCBhIHNuYXBzaG90IExWIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqIHNwbGl0IGZyb20gdGhlIGxpbmVhci9zdHJpcGVkIExWIHVzaW5nIC0tc3BsaXRzbmFwc2hvdC4KKyAqIGx2Y29udmVydCAtLXR5cGUgc25hcHNob3QgTFYgU25hcHNob3RMVgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBsdmNvbnZlcnQgLS1zbmFwc2hvdCBMViBTbmFwc2hvdExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF9zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwlyZXR1cm4gX2x2Y29udmVydF9zbmFwc2hvdChjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaXBlZC9saW5lYXIgTFYgdG8gYSB0aGluIExWIHdpdGggYW4gZXh0ZXJuYWwgb3JpZ2luLgorICogbHZjb252ZXJ0IC0tdHlwZSB0aGluIExWCisgKgorICogUmVxdWlyZWQgb3B0aW9uczoKKyAqIC0tdGhpbnBvb2wgTFYKKyAqCisgKiBBdXhpbGlhcnkgb3BlcmF0aW9uOgorICogQ29udmVydHMgdGhlIC0tdGhpbnBvb2wgYXJnIHRvIGEgdGhpbiBwb29sIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBsdmNvbnZlcnQgLS10aGluIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF90aGluKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJLyogbHZjb252ZXJ0IC0tdGhpbiBpbmNsdWRlcyBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIHRoZSB0aGlucG9vbCBhcmcgdG8gdHlwZSB0aGluLXBvb2wuICovCisJaWYgKCFfbHZjb252ZXJ0X3Bvb2woY21kLCBsdiwgbHApKSB7CisJCWxvZ19lcnJvcigiQ29udmVyc2lvbiBvZiAtLXRoaW5wb29sIGFyZyB0byB0eXBlIHRoaW4tcG9vbCBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfbHZjb252ZXJ0X3RoaW4oY21kLCBsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHN0cmlwZWQvbGluZWFyIExWIHRvIGEgY2FjaGUgTFYuCisgKiBsdmNvbnZlcnQgLS10eXBlIGNhY2hlIExWCisgKgorICogUmVxdWlyZWQgb3B0aW9uczoKKyAqIC0tY2FjaGVwb29sIExWCisgKgorICogQXV4aWxpYXJ5IG9wZXJhdGlvbjoKKyAqIENvbnZlcnRzIHRoZSAtLWNhY2hlcG9vbCBhcmcgdG8gYSBjYWNoZSBwb29sIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBsdmNvbnZlcnQgLS1jYWNoZSBMVgorICovCisKK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF9jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwkvKiBsdmNvbnZlcnQgLS1jYWNoZSBpbmNsdWRlcyBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIHRoZSBjYWNoZXBvb2wgYXJnIHRvIHR5cGUgY2FjaGUtcG9vbC4gKi8KKwlpZiAoIV9sdmNvbnZlcnRfcG9vbChjbWQsIGx2LCBscCkpIHsKKwkJbG9nX2Vycm9yKCJDb252ZXJzaW9uIG9mIC0tY2FjaGVwb29sIGFyZyB0byB0eXBlIGNhY2hlLXBvb2wgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX2x2Y29udmVydF9jYWNoZShjbWQsIGx2LCBscCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaXBlZC9saW5lYXIgTFYgdG8gYSB0aGluLXBvb2wgTFYuCisgKiBsdmNvbnZlcnQgLS10eXBlIHRoaW4tcG9vbCBMVgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYWJvdmUsIGJ1dCBub3QgcHJlZmVycmVkIGJlY2F1c2UgaXQncyBhbWJpZ3VvdXMgYW5kIGluY29uc2lzdGVudC4KKyAqIGx2Y29udmVydCAtLXRoaW5wb29sIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF90aGluX3Bvb2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3Bvb2woY21kLCBsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHN0cmlwZWQvbGluZWFyIExWIHRvIGEgY2FjaGUtcG9vbCBMVi4KKyAqIGx2Y29udmVydCAtLXR5cGUgY2FjaGUtcG9vbCBMVgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X3N0cmlwZWRfY2FjaGVfcG9vbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X3Bvb2woY21kLCBsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHN0cmlwZWQvbGluZWFyIExWIHRvIGEgbWlycm9yIExWLgorICogbHZjb252ZXJ0IC0tdHlwZSBtaXJyb3IgTFYKKyAqCisgKiBSZXF1aXJlZCBvcHRpb25zOgorICogLS1taXJyb3JzIE51bWJlcgorICoKKyAqIEFsdGVybmF0ZSBzeW50YXg6CisgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYWJvdmUgd2hlbiBnbG9iYWwvbWlycm9yX3NlZ3R5cGVfZGVmYXVsdD0ibWlycm9yIi4KKyAqIGx2Y29udmVydCAtLW1pcnJvcnMgTnVtYmVyIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF9taXJyb3Ioc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXJldHVybiBfbHZjb252ZXJ0X21pcnJvcnMoY21kLCBsdiwgbHApOworfQorCisvKgorICogQ29udmVydCBhIHN0cmlwZWQvbGluZWFyIExWIHRvIGEgcmFpZCogTFYuCisgKiBsdmNvbnZlcnQgLS10eXBlIHJhaWQqIExWCisgKgorICogUmVxdWlyZWQgb3B0aW9uczoKKyAqIC0tbWlycm9ycyBOdW1iZXIKKyAqCisgKiBBbHRlcm5hdGUgc3ludGF4OgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGFib3ZlIHdoZW4gZ2xvYmFsL21pcnJvcl9zZWd0eXBlX2RlZmF1bHQ9InJhaWQxIi4KKyAqIGx2Y29udmVydCAtLW1pcnJvcnMgTnVtYmVyIExWCisgKi8KK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZF9yYWlkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJcmV0dXJuIF9sdmNvbnZlcnRfcmFpZChsdiwgbHApOworfQorCisvKgorICogRnVuY3Rpb25zIGNhbGxlZCB0byBwZXJmb3JtIGFsbCB2YWxpZCBvcGVyYXRpb25zIG9uIGEgZ2l2ZW4gTFYgdHlwZS4KKyAqCisgKiBfY29udmVydF88bHZ0eXBlPgorICovCitzdGF0aWMgaW50IF9jb252ZXJ0X2Nvd19zbmFwc2hvdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRzbmFwc2hvdF9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfY293X3NuYXBzaG90X3NwbGl0c25hcHNob3QoY21kLCBsdiwgbHApOworCisJLyogRklYTUU6IGFkZCAtLW1lcmdlLXNuYXBzaG90IHRvIG1ha2UgdGhpcyBkaXN0aW5jdCBmcm9tIC0tbWVyZ2UtbWlycm9yLiAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWVyZ2VfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X2Nvd19zbmFwc2hvdF9tZXJnZShjbWQsIGx2LCBscCk7CisKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIENPVyBzbmFwc2hvdCBMViAlcy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCWxvZ19lcnJvcigiT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gYSBDT1cgc25hcHNob3QgTFYgYXJlOlxuIgorCQkgICIgIC0tc3BsaXRzbmFwc2hvdFxuIgorCQkgICIgIC0tbWVyZ2VcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fdm9sdW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCXN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwkvKiBGSVhNRTogYWRkIC0tbWVyZ2Utc25hcHNob3QgdG8gbWFrZSB0aGlzIGRpc3RpbmN0IGZyb20gLS1tZXJnZS1taXJyb3IuICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBtZXJnZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfdGhpbl92b2x1bWVfbWVyZ2UoY21kLCBsdiwgbHApOworCisJbG9nX2Vycm9yKCJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiB0aGluIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJbG9nX2Vycm9yKCJPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBhIHRoaW4gTFYgYXJlOlxuIgorCQkgICIgIC0tbWVyZ2VcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0X3RoaW5fcG9vbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwljb25zdCBjaGFyICpuZXdfdHlwZSA9IGFyZ19zdHJfdmFsdWUoY21kLCB0eXBlX0FSRywgTlVMTCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHNwbGl0Y2FjaGVfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3RoaW5fcG9vbF9zcGxpdGNhY2hlKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3RoaW5fcG9vbF9zcGxpdGNhY2hlKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgdW5jYWNoZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfdGhpbl9wb29sX3VuY2FjaGUoY21kLCBsdiwgbHApOworCisJaWYgKChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX0NBQ0hFKSkgfHwgYXJnX2lzX3NldChjbWQsIGNhY2hlX0FSRykpCisJCXJldHVybiBfY29udmVydF90aGluX3Bvb2xfY2FjaGUoY21kLCBsdiwgbHApOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZXBhaXJfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3RoaW5fcG9vbF9yZXBhaXIoY21kLCBsdiwgbHApOworCisJLyogRklYTUU6IHN3YXBwaW5nIHRoZSB0aGluIHBvb2wgbWV0YWRhdGEgTFYgbmVlZHMgYSBzcGVjaWZpYyBvcHRpb24gbGlrZSAtLXN3YXBtZXRhZGF0YSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgcG9vbG1ldGFkYXRhX0FSRykpCisJCXJldHVybiBfY29udmVydF90aGluX3Bvb2xfc3dhcG1ldGFkYXRhKGNtZCwgbHYsIGxwKTsKKworCS8qIEZJWE1FOiBhZGQgLS1zd2FwbWV0YWRhdGEgdG8gbGlzdCBvZiBwZXJtaXR0ZWQgb3BlcmF0aW9ucy4gKi8KKworCWxvZ19lcnJvcigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gdGhpbiBwb29sIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJbG9nX2Vycm9yKCJPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBhIHRoaW4gcG9vbCBMViBhcmU6XG4iCisJCSAgIiAgLS1zcGxpdGNhY2hlICAob3BlcmF0ZXMgb24gY2FjaGUgc3ViIExWKVxuIgorCQkgICIgIC0tdW5jYWNoZSAgICAgKG9wZXJhdGVzIG9uIGNhY2hlIHN1YiBMVilcbiIKKwkJICAiICAtLXR5cGUgY2FjaGUgIChvcGVyYXRlcyBvbiBkYXRhIHN1YiBMVilcbiIKKwkJICAiICAtLXJlcGFpclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnZlcnRfY2FjaGVfdm9sdW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJY29uc3QgY2hhciAqbmV3X3R5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBzcGxpdGNhY2hlX0FSRykpCisJCXJldHVybiBfY29udmVydF9jYWNoZV92b2x1bWVfc3BsaXRjYWNoZShjbWQsIGx2LCBscCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHNwbGl0X0FSRykpCisJCXJldHVybiBfY29udmVydF9jYWNoZV92b2x1bWVfc3BsaXRjYWNoZShjbWQsIGx2LCBscCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHVuY2FjaGVfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X2NhY2hlX3ZvbHVtZV91bmNhY2hlKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRtaXJyb3JzX0FSRykpCisJCXJldHVybiBfY29udmVydF9jYWNoZV92b2x1bWVfc3BsaXRtaXJyb3JzKGNtZCwgbHYsIGxwKTsKKworCS8qIFVzaW5nIC0tdGhpbnBvb2wgaXMgYW1iaWd1b3VzIGFuZCBub3QgcHJlZmVycmVkLiAqLworCisJaWYgKChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX1RISU5fUE9PTCkpIHx8IGFyZ19pc19zZXQoY21kLCB0aGlucG9vbF9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfY2FjaGVfdm9sdW1lX3RoaW5fcG9vbChjbWQsIGx2LCBscCk7CisKKwkvKiBUaGUgLS10aGlucG9vbCBhbHRlcm5hdGl2ZSBmb3IgLS10eXBlIHRoaW4tcG9vbCBpcyBub3QgcHJlZmVycmVkLCBzbyBub3Qgc2hvd24uICovCisKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIGNhY2hlIExWICVzLiIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJbG9nX2Vycm9yKCJPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBhIGNhY2hlIExWIGFyZTpcbiIKKwkJICAiICAtLXNwbGl0Y2FjaGVcbiIKKwkJICAiICAtLXVuY2FjaGVcbiIKKwkJICAiICAtLXNwbGl0bWlycm9ycyAob3BlcmF0ZXMgb24gbWlycm9yIG9yIHJhaWQgc3ViIExWKVxuIgorCQkgICIgIC0tdHlwZSB0aGluLXBvb2xcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0X2NhY2hlX3Bvb2woc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRjYWNoZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfY2FjaGVfcG9vbF9zcGxpdGNhY2hlKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X2NhY2hlX3Bvb2xfc3BsaXRjYWNoZShjbWQsIGx2LCBscCk7CisKKwkvKiBGSVhNRTogc3dhcHBpbmcgdGhlIGNhY2hlIHBvb2wgbWV0YWRhdGEgTFYgbmVlZHMgYSBzcGVjaWZpYyBvcHRpb24gbGlrZSAtLXN3YXBtZXRhZGF0YSAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgcG9vbG1ldGFkYXRhX0FSRykpCisJCXJldHVybiBfY29udmVydF9jYWNoZV9wb29sX3N3YXBtZXRhZGF0YShjbWQsIGx2LCBscCk7CisKKwkvKiBGSVhNRTogYWRkIC0tc3dhcG1ldGFkYXRhIHRvIGxpc3Qgb2YgcGVybWl0dGVkIG9wZXJhdGlvbnMuICovCisKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIGNhY2hlIHBvb2wgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIGEgY2FjaGUgcG9vbCBMViBhcmU6XG4iCisJCSAgIiAgLS1zcGxpdGNhY2hlICAgIChvcGVyYXRlcyBvbiBjYWNoZSBMVilcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0X21pcnJvcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgIHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCkKK3sKKwljb25zdCBjaGFyICpuZXdfdHlwZSA9IGFyZ19zdHJfdmFsdWUoY21kLCB0eXBlX0FSRywgTlVMTCk7CisJY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqbmV3X3NlZ3R5cGUgPSBOVUxMOworCisJaWYgKG5ld190eXBlKQorCQluZXdfc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgbmV3X3R5cGUpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykpCisJCXJldHVybiBfY29udmVydF9taXJyb3JfbnVtYmVyKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRtaXJyb3JzX0FSRykpCisJCXJldHVybiBfY29udmVydF9taXJyb3Jfc3BsaXRtaXJyb3JzKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlycm9ybG9nX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGNvcmVsb2dfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X21pcnJvcl9sb2coY21kLCBsdiwgbHApOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZXBhaXJfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X21pcnJvcl9yZXBhaXIoY21kLCBsdiwgbHApOworCisJaWYgKG5ld190eXBlICYmICFzdHJjbXAobmV3X3R5cGUsIFNFR19UWVBFX05BTUVfTElORUFSKSkKKwkJcmV0dXJuIF9jb252ZXJ0X21pcnJvcl9saW5lYXIoY21kLCBsdiwgbHApOworCisJaWYgKG5ld190eXBlICYmIG5ld19zZWd0eXBlICYmIHNlZ3R5cGVfaXNfcmFpZChuZXdfc2VndHlwZSkpCisJCXJldHVybiBfY29udmVydF9taXJyb3JfcmFpZChjbWQsIGx2LCBscCk7CisKKwkvKgorCSAqIEZJWE1FOiB0aGlzIGlzIGhlcmUgdG8gcHJlc2VydmUgb2xkIGJlaGF2aW9yLCBidXQgYW4KKwkgKiBleHBsaWNpdCBvcHRpb24gc2hvdWxkIGJlIGFkZGVkIHRvIGVuYWJsZSB0aGlzIGNhc2UsCisJICogcmF0aGVyIHRoYW4gbWFraW5nIGl0IHRoZSByZXN1bHQgb2YgYW4gYW1iaWd1b3VzCisJICogImx2Y29udmVydCB2Zy9sdiIgY29tbWFuZC4KKwkgKiBBZGQgJ2x2Y29udmVydCAtLXBvbGwtbWlycm9yIHZnL2x2JyBmb3IgdGhpcyBjYXNlLgorCSAqCisJICogT2xkIGJlaGF2aW9yIHdhcyBkZXNjcmliZWQgYXM6CisJICogICAiQ29sbGFwc2luZyBhIHN0YWNrIG9mIG1pcnJvcnMuCisJICogICAgSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQsIHRyeSBjb2xsYXBzaW5nIHRoZSByZXN5bmMgbGF5ZXJzIgorCSAqLworCWxvZ19kZWJ1ZygiQ2hlY2tpbmcgaWYgTFYgJXMgaXMgY29udmVydGluZy4iLCBkaXNwbGF5X2x2bmFtZShsdikpOworCWlmIChsdl9pc19jb252ZXJ0aW5nKGx2KSkgeworCQlscC0+bmVlZF9wb2xsaW5nID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJbG9nX2Vycm9yKCJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCBvbiBtaXJyb3IgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIGEgbWlycm9yIExWIGFyZTpcbiIKKwkJICAiICAtLW1pcnJvcnNcbiIKKwkJICAiICAtLXNwbGl0bWlycm9yc1xuIgorCQkgICIgIC0tbWlycm9ybG9nXG4iCisJCSAgIiAgLS1yZXBhaXJcbiIKKwkJICAiICAtLXR5cGUgbGluZWFyXG4iCisJCSAgIiAgLS10eXBlIHJhaWQqXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jb252ZXJ0X3JhaWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCWNvbnN0IGNoYXIgKm5ld190eXBlID0gYXJnX3N0cl92YWx1ZShjbWQsIHR5cGVfQVJHLCBOVUxMKTsKKwljb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpuZXdfc2VndHlwZSA9IE5VTEw7CisKKwlpZiAobmV3X3R5cGUpCisJCW5ld19zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBuZXdfdHlwZSk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1pcnJvcnNfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3JhaWRfbnVtYmVyKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3BsaXRtaXJyb3JzX0FSRykpCisJCXJldHVybiBfY29udmVydF9yYWlkX3NwbGl0bWlycm9ycyhjbWQsIGx2LCBscCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1lcmdlX0FSRykpCisJCXJldHVybiBfY29udmVydF9yYWlkX21lcmdlKGNtZCwgbHYsIGxwKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcmVwYWlyX0FSRykpCisJCXJldHVybiBfY29udmVydF9yYWlkX3JlcGFpcihjbWQsIGx2LCBscCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHJlcGxhY2VfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3JhaWRfcmVwbGFjZShjbWQsIGx2LCBscCk7CisKKwlpZiAoKG5ld190eXBlICYmICFzdHJjbXAobmV3X3R5cGUsIFNFR19UWVBFX05BTUVfU05BUFNIT1QpKSB8fCBhcmdfaXNfc2V0KGNtZCwgc25hcHNob3RfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3JhaWRfc25hcHNob3QoY21kLCBsdiwgbHApOworCisJaWYgKChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX1RISU4pKSB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbl9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfcmFpZF90aGluKGNtZCwgbHYsIGxwKTsKKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9DQUNIRSkpIHx8IGFyZ19pc19zZXQoY21kLCBjYWNoZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfcmFpZF9jYWNoZShjbWQsIGx2LCBscCk7CisKKwkvKiBVc2luZyAtLXRoaW5wb29sIGlzIGFtYmlndW91cyBhbmQgbm90IHByZWZlcnJlZC4gKi8KKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9USElOX1BPT0wpKSB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbnBvb2xfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3JhaWRfdGhpbl9wb29sKGNtZCwgbHYsIGxwKTsKKworCS8qIFVzaW5nIC0tY2FjaGVwb29sIGlzIGFtYmlndW91cyBhbmQgbm90IHByZWZlcnJlZC4gKi8KKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9DQUNIRV9QT09MKSkgfHwgYXJnX2lzX3NldChjbWQsIGNhY2hlcG9vbF9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfcmFpZF9jYWNoZV9wb29sKGNtZCwgbHYsIGxwKTsKKworCWlmIChuZXdfdHlwZSAmJiBuZXdfc2VndHlwZSAmJiBzZWd0eXBlX2lzX3JhaWQobmV3X3NlZ3R5cGUpKQorCQlyZXR1cm4gX2NvbnZlcnRfcmFpZF9yYWlkKGNtZCwgbHYsIGxwKTsKKworCWlmIChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX1NUUklQRUQpKQorCQlyZXR1cm4gX2NvbnZlcnRfcmFpZF9zdHJpcGVkKGNtZCwgbHYsIGxwKTsKKworCWlmIChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpCisJCXJldHVybiBfY29udmVydF9yYWlkX2xpbmVhcihjbWQsIGx2LCBscCk7CisKKwkvKiBUaGUgLS10aGlucG9vbCBhbHRlcm5hdGl2ZSBmb3IgLS10eXBlIHRoaW4tcG9vbCBpcyBub3QgcHJlZmVycmVkLCBzbyBub3Qgc2hvd24uICovCisKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIG9uIHJhaWQgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIGEgcmFpZCBMViBhcmU6XG4iCisJCSAgIiAgLS1taXJyb3JzXG4iCisJCSAgIiAgLS1zcGxpdG1pcnJvcnNcbiIKKwkJICAiICAtLW1lcmdlXG4iCisJCSAgIiAgLS1yZXBhaXJcbiIKKwkJICAiICAtLXJlcGxhY2VcbiIKKwkJICAiICAtLXR5cGUgc25hcHNob3RcbiIKKwkJICAiICAtLXR5cGUgdGhpblxuIgorCQkgICIgIC0tdHlwZSBjYWNoZVxuIgorCQkgICIgIC0tdHlwZSB0aGluLXBvb2xcbiIKKwkJICAiICAtLXR5cGUgY2FjaGUtcG9vbFxuIgorCQkgICIgIC0tdHlwZSByYWlkKlxuIgorCQkgICIgIC0tdHlwZSBzdHJpcGVkXG4iCisJCSAgIiAgLS10eXBlIGxpbmVhclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnZlcnRfc3RyaXBlZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqbHApCit7CisJY29uc3QgY2hhciAqbmV3X3R5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpOworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKm5ld19zZWd0eXBlID0gTlVMTDsKKwljb25zdCBjaGFyICptaXJyb3JzX3R5cGUgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIGdsb2JhbF9taXJyb3Jfc2VndHlwZV9kZWZhdWx0X0NGRywgTlVMTCk7CisKKwlpZiAobmV3X3R5cGUpCisJCW5ld19zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcoY21kLCBuZXdfdHlwZSk7CisKKwkvKiBGSVhNRTogYWRkIC0tbWVyZ2UtbWlycm9yIHRvIG1ha2UgdGhpcyBkaXN0aW5jdCBmcm9tIC0tbWVyZ2Utc25hcHNob3QuICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBtZXJnZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfc3RyaXBlZF9tZXJnZShjbWQsIGx2LCBscCk7CisKKwlpZiAoKG5ld190eXBlICYmICFzdHJjbXAobmV3X3R5cGUsIFNFR19UWVBFX05BTUVfU05BUFNIT1QpKSB8fCBhcmdfaXNfc2V0KGNtZCwgc25hcHNob3RfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3N0cmlwZWRfc25hcHNob3QoY21kLCBsdiwgbHApOworCisJaWYgKChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX1RISU4pKSB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbl9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfc3RyaXBlZF90aGluKGNtZCwgbHYsIGxwKTsKKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9DQUNIRSkpIHx8IGFyZ19pc19zZXQoY21kLCBjYWNoZV9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfc3RyaXBlZF9jYWNoZShjbWQsIGx2LCBscCk7CisKKwkvKiBVc2luZyAtLXRoaW5wb29sIGlzIGFtYmlndW91cyBhbmQgbm90IHByZWZlcnJlZC4gKi8KKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9USElOX1BPT0wpKSB8fCBhcmdfaXNfc2V0KGNtZCwgdGhpbnBvb2xfQVJHKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3N0cmlwZWRfdGhpbl9wb29sKGNtZCwgbHYsIGxwKTsKKworCS8qIFVzaW5nIC0tY2FjaGVwb29sIGlzIGFtYmlndW91cyBhbmQgbm90IHByZWZlcnJlZC4gKi8KKworCWlmICgobmV3X3R5cGUgJiYgIXN0cmNtcChuZXdfdHlwZSwgU0VHX1RZUEVfTkFNRV9DQUNIRV9QT09MKSkgfHwgYXJnX2lzX3NldChjbWQsIGNhY2hlcG9vbF9BUkcpKQorCQlyZXR1cm4gX2NvbnZlcnRfc3RyaXBlZF9jYWNoZV9wb29sKGNtZCwgbHYsIGxwKTsKKworCWlmIChuZXdfdHlwZSAmJiAhc3RyY21wKG5ld190eXBlLCBTRUdfVFlQRV9OQU1FX01JUlJPUikpCisJCXJldHVybiBfY29udmVydF9zdHJpcGVkX21pcnJvcihjbWQsIGx2LCBscCk7CisKKwlpZiAobmV3X3R5cGUgJiYgbmV3X3NlZ3R5cGUgJiYgc2VndHlwZV9pc19yYWlkKG5ld19zZWd0eXBlKSkKKwkJcmV0dXJuIF9jb252ZXJ0X3N0cmlwZWRfcmFpZChjbWQsIGx2LCBscCk7CisKKwkvKiAtLW1pcnJvcnMgY2FuIG1lYW4gLS10eXBlIG1pcnJvciBvciAtLXR5cGUgcmFpZDEgZGVwZW5kaW5nIG9uIGNvbmZpZyBzZXR0aW5nLiAqLworCisJaWYgKGFyZ19pc19zZXQoY21kLCBtaXJyb3JzX0FSRykgJiYgbWlycm9yc190eXBlICYmICFzdHJjbXAobWlycm9yc190eXBlLCBTRUdfVFlQRV9OQU1FX01JUlJPUikpCisJCXJldHVybiBfY29udmVydF9zdHJpcGVkX21pcnJvcihjbWQsIGx2LCBscCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1pcnJvcnNfQVJHKSAmJiBtaXJyb3JzX3R5cGUgJiYgIXN0cmNtcChtaXJyb3JzX3R5cGUsIFNFR19UWVBFX05BTUVfUkFJRDEpKQorCQlyZXR1cm4gX2NvbnZlcnRfc3RyaXBlZF9yYWlkKGNtZCwgbHYsIGxwKTsKKworCS8qIFRoZSAtLXRoaW5wb29sIGFsdGVybmF0aXZlIGZvciAtLXR5cGUgdGhpbi1wb29sIGlzIG5vdCBwcmVmZXJyZWQsIHNvIG5vdCBzaG93bi4gKi8KKworCWxvZ19lcnJvcigiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgb24gc3RyaXBlZCBvciBsaW5lYXIgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwlsb2dfZXJyb3IoIk9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIGEgc3RyaXBlZCBvciBsaW5lYXIgTFYgYXJlOlxuIgorCQkgICIgIC0tbWVyZ2VcbiIKKwkJICAiICAtLXR5cGUgc25hcHNob3RcbiIKKwkJICAiICAtLXR5cGUgdGhpblxuIgorCQkgICIgIC0tdHlwZSBjYWNoZVxuIgorCQkgICIgIC0tdHlwZSB0aGluLXBvb2xcbiIKKwkJICAiICAtLXR5cGUgY2FjaGUtcG9vbFxuIgorCQkgICIgIC0tdHlwZSBtaXJyb3JcbiIKKwkJICAiICAtLXR5cGUgcmFpZCpcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsdmNvbnZlcnQgcGVyZm9ybXMgYSBzcGVjaWZpYyA8b3BlcmF0aW9uPiBvbiBhIHNwZWNpZmljIDxsdl90eXBlPi4KKyAqCisgKiBUaGUgPG9wZXJhdGlvbj4gaXMgc3BlY2lmaWVkIGJ5IGNvbW1hbmQgbGluZSBhcmdzLgorICogVGhlIDxsdl90eXBlPiBpcyBmb3VuZCB1c2luZyBsdl9pc19mb28obHYpIGZ1bmN0aW9ucy4KKyAqCisgKiBmb3IgZWFjaCBsdnR5cGUsCisgKiAgICAgX2NvbnZlcnRfbHZ0eXBlKCk7CisgKgkgZm9yIGVhY2ggYXJnX2lzX3NldChvcGVyYXRpb24pCisgKgkgICAgIF9jb252ZXJ0X2x2dHlwZV9vcGVyYXRpb24oKTsKKyAqCisgKi8KK3N0YXRpYyBpbnQgX2x2Y29udmVydChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpsdl9zZWcgPSBmaXJzdF9zZWcobHYpOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBDaGVjayBzb21lIGNvbmRpdGlvbnMgdGhhdCBjYW4gbmV2ZXIgYmUgcHJvY2Vzc2VkLgorCSAqLworCisJaWYgKGx2X2lzX2xvY2tlZChsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY29udmVydCBsb2NrZWQgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGx2X2lzX3B2bW92ZShsdikpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgY29udmVydCBwdm1vdmUgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFsdl9pc192aXNpYmxlKGx2KSkgeworCQkvKgorCQkgKiBGSVhNRTogdGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyB0byB0aGUgcnVsZSBvZiBvbmx5CisJCSAqIG9wZXJhdGluZyBvbiB2aXNpYmxlIExWcy4gIFRoZXNlIHNob3VsZCBiZSBmaXhlZCBieSBydW5uaW5nCisJCSAqIHRoZSBjb21tYW5kIG9uIHRoZSB2aXNpYmxlIExWIHdpdGggYW4gb3B0aW9uIGluZGljYXRpbmcKKwkJICogd2hpY2ggc3ViIExWIGlzIGludGVuZGVkIHJhdGhlciB0aGFuIG5hbWluZyB0aGUgIXZpc2libGUgTFYuCisJCSAqLworCQlpZiAoIWx2X2lzX2NhY2hlX3Bvb2xfbWV0YWRhdGEobHYpICYmCisJCSAgICAhbHZfaXNfY2FjaGVfcG9vbF9kYXRhKGx2KSAmJgorCQkgICAgIWx2X2lzX3RoaW5fcG9vbF9tZXRhZGF0YShsdikgJiYKKwkJICAgICFsdl9pc190aGluX3Bvb2xfZGF0YShsdikgJiYKKwkJICAgICFsdl9pc191c2VkX2NhY2hlX3Bvb2wobHYpICYmCisJCSAgICAhbHZfaXNfcmFpZF9pbWFnZShsdikpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGNvbnZlcnQgaW50ZXJuYWwgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogRWFjaCBMViB0eXBlIHRoYXQgY2FuIGJlIGNvbnZlcnRlZC4KKwkgKiAoVGhlIGV4aXN0aW5nIHR5cGUgb2YgdGhlIExWLCBub3QgYSByZXF1ZXN0ZWQgdHlwZS4pCisJICovCisKKwlpZiAobHZfaXNfY293KGx2KSkgeworCQlyZXQgPSBfY29udmVydF9jb3dfc25hcHNob3QoY21kLCBsdiwgbHApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCXJldCA9IF9jb252ZXJ0X3RoaW5fdm9sdW1lKGNtZCwgbHYsIGxwKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJcmV0ID0gX2NvbnZlcnRfdGhpbl9wb29sKGNtZCwgbHYsIGxwKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGx2X2lzX2NhY2hlKGx2KSkgeworCQlyZXQgPSBfY29udmVydF9jYWNoZV92b2x1bWUoY21kLCBsdiwgbHApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHZfaXNfY2FjaGVfcG9vbChsdikpIHsKKwkJcmV0ID0gX2NvbnZlcnRfY2FjaGVfcG9vbChjbWQsIGx2LCBscCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsdl9pc19taXJyb3IobHYpKSB7CisJCXJldCA9IF9jb252ZXJ0X21pcnJvcihjbWQsIGx2LCBscCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsdl9pc19yYWlkKGx2KSkgeworCQlyZXQgPSBfY29udmVydF9yYWlkKGNtZCwgbHYsIGxwKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBGSVhNRTogYWRkIGx2X2lzX3N0cmlwZWQoKSBhbmQgbHZfaXNfbGluZWFyKCk/CisJICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJhaWQwLgorCSAqIElmIG9wZXJhdGlvbnMgZGlmZmVyIGJldHdlZW4gc3RyaXBlZCBhbmQgbGluZWFyLCBzcGxpdCB0aGlzIGNhc2UuCisJICovCisJaWYgKHNlZ3R5cGVfaXNfc3RyaXBlZChsdl9zZWctPnNlZ3R5cGUpIHx8IHNlZ3R5cGVfaXNfbGluZWFyKGx2X3NlZy0+c2VndHlwZSkpIHsKKwkJcmV0ID0gX2NvbnZlcnRfc3RyaXBlZChjbWQsIGx2LCBscCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGludGVudGlvbiBpcyB0byBleHBsaWNpdGx5IGNoZWNrIGFsbCBjYXNlcyBhYm92ZSBhbmQgbmV2ZXIKKwkgKiByZWFjaCBoZXJlLCBidXQgdGhpcyBjb3ZlcnMgYW55dGhpbmcgdGhhdCB3YXMgbWlzc2VkLgorCSAqLworCWxvZ19lcnJvcigiQ2Fubm90IGNvbnZlcnQgTFYgJXMuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwlyZXQgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldCA/IEVDTURfUFJPQ0VTU0VEIDogRUNNRF9GQUlMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29udmVydF9wb2xsX2lkX2xpc3QqIF9jb252ZXJ0X3BvbGxfaWRfbGlzdF9jcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCQkJCSBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBjb252ZXJ0X3BvbGxfaWRfbGlzdCAqaWRsID0gKHN0cnVjdCBjb252ZXJ0X3BvbGxfaWRfbGlzdCAqKSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2Yoc3RydWN0IGNvbnZlcnRfcG9sbF9pZF9saXN0KSk7CisKKwlpZiAoIWlkbCkgeworCQlsb2dfZXJyb3IoIkNvbnZlcnQgcG9sbCBJRCBsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIShpZGwtPmlkID0gX2NyZWF0ZV9pZChjbWQsIGx2LT52Zy0+bmFtZSwgbHYtPm5hbWUsIGx2LT5sdmlkLnMpKSkgeworCQlkbV9wb29sX2ZyZWUoY21kLT5tZW0sIGlkbCk7CisJCXJldHVybl9OVUxMOworCX0KKworCWlkbC0+aXNfbWVyZ2luZ19vcmlnaW4gPSBsdl9pc19tZXJnaW5nX29yaWdpbihsdik7CisJaWRsLT5pc19tZXJnaW5nX29yaWdpbl90aGluID0gaWRsLT5pc19tZXJnaW5nX29yaWdpbiAmJiBzZWdfaXNfdGhpbl92b2x1bWUoZmluZF9zbmFwc2hvdChsdikpOworCisJcmV0dXJuIGlkbDsKK30KKworc3RhdGljIGludCBfbHZjb252ZXJ0X2FuZF9hZGRfdG9fcG9sbF9saXN0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgICAgc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwLAorCQkJCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBsdmluZm8gaW5mbzsKKwlzdHJ1Y3QgY29udmVydF9wb2xsX2lkX2xpc3QgKmlkbDsKKworCS8qIF9sdmNvbnZlcnQoKSBjYWxsIG1heSBhbHRlciB0aGUgcmVmZXJlbmNlIGluIGxwLT5sdl90b19wb2xsICovCisJaWYgKChyZXQgPSBfbHZjb252ZXJ0KGNtZCwgbHYsIGxwKSkgIT0gRUNNRF9QUk9DRVNTRUQpCisJCXN0YWNrOworCWVsc2UgaWYgKGxwLT5uZWVkX3BvbGxpbmcpIHsKKwkJaWYgKCFsdl9pbmZvKGNtZCwgbHAtPmx2X3RvX3BvbGwsIDAsICZpbmZvLCAwLCAwKSB8fCAhaW5mby5leGlzdHMpCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiQ29udmVyc2lvbiBzdGFydHMgYWZ0ZXIgYWN0aXZhdGlvbi4iKTsKKwkJZWxzZSB7CisJCQlpZiAoIShpZGwgPSBfY29udmVydF9wb2xsX2lkX2xpc3RfY3JlYXRlKGNtZCwgbHAtPmx2X3RvX3BvbGwpKSkKKwkJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCQlkbV9saXN0X2FkZCgmbHAtPmlkbHMsICZpZGwtPmxpc3QpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfbHZjb252ZXJ0X3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IGx2Y29udmVydF9wYXJhbXMgKmxwID0gKHN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZyA9IGx2LT52ZzsKKworCWlmICh0ZXN0X21vZGUoKSAmJiBpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKSB7CisJCWxvZ19lcnJvcigiVGVzdCBtb2RlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHdpdGggbG9jayB0eXBlICVzLiIsCisJCQkgIHZnLT5sb2NrX3R5cGUpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBscC0+cHZoIGhvbGRzIHRoZSBsaXN0IG9mIFBWcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gb3IgcmVtb3ZhbAorCSAqLworCWlmIChscC0+cHZfY291bnQpIHsKKwkJaWYgKCEobHAtPnB2aCA9IGNyZWF0ZV9wdl9saXN0KGNtZC0+bWVtLCB2ZywgbHAtPnB2X2NvdW50LCBscC0+cHZzLCAwKSkpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJfSBlbHNlCisJCWxwLT5wdmggPSAmdmctPnB2czsKKworCWlmIChscC0+cmVwbGFjZV9wdl9jb3VudCAmJgorCSAgICAhKGxwLT5yZXBsYWNlX3B2aCA9IGNyZWF0ZV9wdl9saXN0KGNtZC0+bWVtLCB2ZywKKwkJCQkJICAgICAgIGxwLT5yZXBsYWNlX3B2X2NvdW50LAorCQkJCQkgICAgICAgbHAtPnJlcGxhY2VfcHZzLCAwKSkpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlscC0+bHZfdG9fcG9sbCA9IGx2OworCisJcmV0dXJuIF9sdmNvbnZlcnRfYW5kX2FkZF90b19wb2xsX2xpc3QoY21kLCBscCwgbHYpOworfQorCitzdGF0aWMgaW50IF9sdmNvbnZlcnRfbWVyZ2Vfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zICpscCA9IChzdHJ1Y3QgbHZjb252ZXJ0X3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisKKwlscC0+bHZfdG9fcG9sbCA9IGx2OworCisJcmV0dXJuIF9sdmNvbnZlcnRfYW5kX2FkZF90b19wb2xsX2xpc3QoY21kLCBscCwgbHYpOworfQorCitpbnQgbHZjb252ZXJ0KHN0cnVjdCBjbWRfY29udGV4dCAqIGNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBwb2xsX3JldCwgcmV0OworCXN0cnVjdCBjb252ZXJ0X3BvbGxfaWRfbGlzdCAqaWRsOworCXN0cnVjdCBsdmNvbnZlcnRfcGFyYW1zIGxwID0geworCQkudGFyZ2V0X2F0dHIgPSB+MCwKKwkJLmlkbHMgPSBETV9MSVNUX0hFQURfSU5JVChscC5pZGxzKSwKKwl9OworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpOworCisJaWYgKCFoYW5kbGUpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9ICZscDsKKworCWlmICghX3JlYWRfcGFyYW1zKGNtZCwgYXJnYywgYXJndiwgJmxwKSkgeworCQlyZXQgPSBFSU5WQUxJRF9DTURfTElORTsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKGxwLm1lcmdlKSB7CisJCXJldCA9IHByb2Nlc3NfZWFjaF9sdihjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsCisJCQkJICAgICAgUkVBRF9GT1JfVVBEQVRFLCBoYW5kbGUsICZfbHZjb252ZXJ0X21lcmdlX3NpbmdsZSk7CisJfSBlbHNlIHsKKwkJaW50IHNhdmVkX2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyA9IGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygpOworCisJCWlmIChscC5yZXBhaXIgfHwgbHAudW5jYWNoZSkgeworCQkJaW5pdF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMoMSk7CisJCQljbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMgPSAxOworCQl9CisKKwkJcmV0ID0gcHJvY2Vzc19lYWNoX2x2KGNtZCwgMCwgTlVMTCwgbHAudmdfbmFtZSwgbHAubHZfbmFtZSwKKwkJCQkgICAgICBSRUFEX0ZPUl9VUERBVEUsIGhhbmRsZSwgJl9sdmNvbnZlcnRfc2luZ2xlKTsKKworCQlpbml0X2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyhzYXZlZF9pZ25vcmVfc3VzcGVuZGVkX2RldmljZXMpOworCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhpZGwsICZscC5pZGxzKSB7CisJCXBvbGxfcmV0ID0gX2x2Y29udmVydF9wb2xsX2J5X2lkKGNtZCwgaWRsLT5pZCwKKwkJCQkJCSBscC53YWl0X2NvbXBsZXRpb24gPyAwIDogMVUsCisJCQkJCQkgaWRsLT5pc19tZXJnaW5nX29yaWdpbiwKKwkJCQkJCSBpZGwtPmlzX21lcmdpbmdfb3JpZ2luX3RoaW4pOworCQlpZiAocG9sbF9yZXQgPiByZXQpCisJCQlyZXQgPSBwb2xsX3JldDsKKwl9CisKK291dDoKKwlpZiAobHAucG9saWN5X3NldHRpbmdzKQorCQlkbV9jb25maWdfZGVzdHJveShscC5wb2xpY3lfc2V0dGluZ3MpOworCisJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZjb252ZXJ0X3BvbGwuYyBiL3Rvb2xzL2x2Y29udmVydF9wb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkYjFjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2Y29udmVydF9wb2xsLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworI2luY2x1ZGUgImx2Y29udmVydF9wb2xsLmgiCisKK2ludCBsdmNvbnZlcnRfbWlycm9yX2ZpbmlzaChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICpsdnNfY2hhbmdlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoIWx2X2lzX2NvbnZlcnRpbmcobHYpKQorCQlyZXR1cm4gMTsKKworCWlmICghY29sbGFwc2VfbWlycm9yZWRfbHYobHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSB0ZW1wb3Jhcnkgc3luYyBsYXllci4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHYtPnN0YXR1cyAmPSB+Q09OVkVSVElORzsKKworCWlmICghbHZfdXBkYXRlX2FuZF9yZWxvYWQobHYpKQorCQlyZXR1cm5fMDsKKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJMb2dpY2FsIHZvbHVtZSAlcyBjb252ZXJ0ZWQuIiwgbHYtPm5hbWUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFN3YXAgbHZpZCBhbmQgTFYgbmFtZXMgKi8KK2ludCBzd2FwX2x2X2lkZW50aWZpZXJzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICphLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmIpCit7CisJdW5pb24gbHZpZCBsdmlkOworCWNvbnN0IGNoYXIgKmFuYW1lID0gYS0+bmFtZSwgKmJuYW1lID0gYi0+bmFtZTsKKworCWx2aWQgPSBhLT5sdmlkOworCWEtPmx2aWQgPSBiLT5sdmlkOworCWItPmx2aWQgPSBsdmlkOworCisJLyogcmVuYW1lIHRlbXBvcmFyaWx5IHRvICd1bnVzZWQnIG5hbWUgKi8KKwlpZiAoIWx2X3JlbmFtZV91cGRhdGUoY21kLCBhLCAicG1vdmVfdG1ldGEiLCAwKSkKKwkJcmV0dXJuXzA7CisJLyogbmFtZSByZW5hbWUgJ2InIHRvIHVudXNlZCBuYW1lIG9mICdhJyAqLworCWlmICghbHZfcmVuYW1lX3VwZGF0ZShjbWQsIGIsIGFuYW1lLCAwKSkKKwkJcmV0dXJuXzA7CisJLyogZmluaXNoIG5hbWUgc3dhcHBpbmcgKi8KKwlpZiAoIWx2X3JlbmFtZV91cGRhdGUoY21kLCBhLCBibmFtZSwgMCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9tb3ZlX2x2X2F0dHJpYnV0ZXMoc3RydWN0IGxvZ2ljYWxfdm9sdW1lICp0bywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpmcm9tKQoreworCS8qIE1heWJlIG1vdmUgdGhpcyBjb2RlIGludG8gdGhpbl9tZXJnZV9maW5pc2goKSAqLworCXRvLT5zdGF0dXMgPSBmcm9tLT5zdGF0dXM7IC8vIEZJWE1FIG1heWJlIHNvbWUgbWFza2luZyA/CisJdG8tPmFsbG9jID0gZnJvbS0+YWxsb2M7CisJdG8tPnByb2ZpbGUgPSBmcm9tLT5wcm9maWxlOworCXRvLT5yZWFkX2FoZWFkID0gZnJvbS0+cmVhZF9haGVhZDsKKwl0by0+bWFqb3IgPSBmcm9tLT5tYWpvcjsKKwl0by0+bWlub3IgPSBmcm9tLT5taW5vcjsKKwl0by0+dGltZXN0YW1wID0gZnJvbS0+dGltZXN0YW1wOworCXRvLT5ob3N0bmFtZSA9IGZyb20tPmhvc3RuYW1lOworCisJLyogTW92ZSB0YWdzICovCisJZG1fbGlzdF9pbml0KCZ0by0+dGFncyk7CisJZG1fbGlzdF9zcGxpY2UoJnRvLT50YWdzLCAmZnJvbS0+dGFncyk7CisKKwkvKiBBbnl0aGluZyBlbHNlIHRvIHByZXNlcnZlPyAqLworfQorCisvKiBGaW5hbGlzZSBtZXJnaW5nIG9mIGx2IGludG8gbWVyZ2VfbHYgKi8KK2ludCB0aGluX21lcmdlX2ZpbmlzaChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICptZXJnZV9sdiwKKwkJICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpZiAoIXN3YXBfbHZfaWRlbnRpZmllcnMoY21kLCBtZXJnZV9sdiwgbHYpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN3YXAgJXMgd2l0aCBtZXJnaW5nICVzLiIsCisJCQkgIGx2LT5uYW1lLCBtZXJnZV9sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFByZXNlcnZlIG9yaWdpbnMnIGF0dHJpYnV0ZXMgKi8KKwlfbW92ZV9sdl9hdHRyaWJ1dGVzKGx2LCBtZXJnZV9sdik7CisKKwkvKiBSZW1vdmVkIExWIGhhcyB0byBiZSB2aXNpYmxlICovCisJaWYgKCFsdl9yZW1vdmVfc2luZ2xlKGNtZCwgbWVyZ2VfbHYsIERPTlRfUFJPTVBULCAxKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGx2Y29udmVydF9tZXJnZV9maW5pc2goc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNuYXBfc2VnID0gZmluZF9zbmFwc2hvdChsdik7CisKKwlpZiAoIWx2X2lzX21lcmdpbmdfb3JpZ2luKGx2KSkgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGhhcyBubyBtZXJnaW5nIHNuYXBzaG90LiIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIk1lcmdlIG9mIHNuYXBzaG90IGludG8gbG9naWNhbCB2b2x1bWUgJXMgaGFzIGZpbmlzaGVkLiIsIGx2LT5uYW1lKTsKKworCWlmIChzZWdfaXNfdGhpbl92b2x1bWUoc25hcF9zZWcpKSB7CisJCWNsZWFyX3NuYXBzaG90X21lcmdlKGx2KTsKKworCQlpZiAoIXRoaW5fbWVyZ2VfZmluaXNoKGNtZCwgbHYsIHNuYXBfc2VnLT5sdikpCisJCQlyZXR1cm5fMDsKKworCX0gZWxzZSBpZiAoIWx2X3JlbW92ZV9zaW5nbGUoY21kLCBzbmFwX3NlZy0+Y293LCBET05UX1BST01QVCwgMCkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZCBub3QgcmVtb3ZlIHNuYXBzaG90ICVzIG1lcmdlZCBpbnRvICVzLiIsCisJCQkgIHNuYXBfc2VnLT5jb3ctPm5hbWUsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3Byb2dyZXNzX3QgcG9sbF9tZXJnZV9wcm9ncmVzcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICAgICAgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpCit7CisJZG1fcGVyY2VudF90IHBlcmNlbnQgPSBETV9QRVJDRU5UXzA7CisKKwlpZiAoIWx2X2lzX21lcmdpbmdfb3JpZ2luKGx2KSB8fAorCSAgICAhbHZfc25hcHNob3RfcGVyY2VudChsdiwgJnBlcmNlbnQpKSB7CisJCWxvZ19lcnJvcigiJXM6IEZhaWxlZCBxdWVyeSBmb3IgbWVyZ2luZyBwZXJjZW50YWdlLiBBYm9ydGluZyBtZXJnZS4iLCBsdi0+bmFtZSk7CisJCXJldHVybiBQUk9HUkVTU19DSEVDS19GQUlMRUQ7CisJfSBlbHNlIGlmIChwZXJjZW50ID09IERNX1BFUkNFTlRfSU5WQUxJRCkgeworCQlsb2dfZXJyb3IoIiVzOiBNZXJnaW5nIHNuYXBzaG90IGludmFsaWRhdGVkLiBBYm9ydGluZyBtZXJnZS4iLCBsdi0+bmFtZSk7CisJCXJldHVybiBQUk9HUkVTU19DSEVDS19GQUlMRUQ7CisJfSBlbHNlIGlmIChwZXJjZW50ID09IExWTV9QRVJDRU5UX01FUkdFX0ZBSUxFRCkgeworCQlsb2dfZXJyb3IoIiVzOiBNZXJnZSBmYWlsZWQuIFJldHJ5IG1lcmdlIG9yIGluc3BlY3QgbWFudWFsbHkuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gUFJPR1JFU1NfQ0hFQ0tfRkFJTEVEOworCX0KKworCWlmIChwYXJtcy0+cHJvZ3Jlc3NfZGlzcGxheSkKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzOiAlczogJS4yZiUlIiwgbHYtPm5hbWUsIHBhcm1zLT5wcm9ncmVzc190aXRsZSwKKwkJCQkJZG1fcGVyY2VudF90b19mbG9hdChETV9QRVJDRU5UXzEwMCAtIHBlcmNlbnQpKTsKKwllbHNlCisJCWxvZ192ZXJib3NlKCIlczogJXM6ICUuMmYlJSIsIGx2LT5uYW1lLCBwYXJtcy0+cHJvZ3Jlc3NfdGl0bGUsCisJCQkgICAgZG1fcGVyY2VudF90b19mbG9hdChETV9QRVJDRU5UXzEwMCAtIHBlcmNlbnQpKTsKKworCWlmIChwZXJjZW50ID09IERNX1BFUkNFTlRfMCkKKwkJcmV0dXJuIFBST0dSRVNTX0ZJTklTSEVEX0FMTDsKKworCXJldHVybiBQUk9HUkVTU19VTkZJTklTSEVEOworfQorCitwcm9ncmVzc190IHBvbGxfdGhpbl9tZXJnZV9wcm9ncmVzcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgICAgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpCit7CisJdWludDMyX3QgZGV2aWNlX2lkOworCisJaWYgKCFsdl90aGluX2RldmljZV9pZChsdiwgJmRldmljZV9pZCkpIHsKKwkJc3RhY2s7CisJCXJldHVybiBQUk9HUkVTU19DSEVDS19GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHBvbGwgbW9yZSB0aGFuIG9uY2UsCisJICogYSB0aGluIHNuYXBzaG90IG1lcmdlIGlzIGltbWVkaWF0ZS4KKwkgKi8KKworCWlmIChkZXZpY2VfaWQgIT0gZmluZF9zbmFwc2hvdChsdiktPmRldmljZV9pZCkgeworCQlsb2dfZXJyb3IoIkxWICVzIGlzIG5vdCBtZXJnZWQuIiwgbHYtPm5hbWUpOworCQlyZXR1cm4gUFJPR1JFU1NfQ0hFQ0tfRkFJTEVEOworCX0KKworCXJldHVybiBQUk9HUkVTU19GSU5JU0hFRF9BTEw7IC8qIE1lcmdpbmcgaGFwcGVuZCAqLworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZjb252ZXJ0X3BvbGwuaCBiL3Rvb2xzL2x2Y29udmVydF9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkY2IxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2Y29udmVydF9wb2xsLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fTFZDT05WRVJUX0gKKyNkZWZpbmUgX0xWTV9MVkNPTlZFUlRfSAorCisjaW5jbHVkZSAicG9sbGRhZW1vbi5oIgorCitzdHJ1Y3QgY21kX2NvbnRleHQ7CitzdHJ1Y3QgbG9naWNhbF92b2x1bWU7CitzdHJ1Y3Qgdm9sdW1lX2dyb3VwOworCitpbnQgbHZjb252ZXJ0X21pcnJvcl9maW5pc2goc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpOworCitpbnQgc3dhcF9sdl9pZGVudGlmaWVycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqYSwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpiKTsKKworaW50IHRoaW5fbWVyZ2VfZmluaXNoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1lcmdlX2x2LAorCQkgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGx2Y29udmVydF9tZXJnZV9maW5pc2goc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpOworCitwcm9ncmVzc190IHBvbGxfbWVyZ2VfcHJvZ3Jlc3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgICAgIHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zKTsKKworcHJvZ3Jlc3NfdCBwb2xsX3RoaW5fbWVyZ2VfcHJvZ3Jlc3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgIHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zKTsKKworI2VuZGlmICAvKiBfTFZNX0xWQ09OVkVSVF9IICovCmRpZmYgLS1naXQgYS90b29scy9sdmNyZWF0ZS5jIGIvdG9vbHMvbHZjcmVhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTNkZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHZjcmVhdGUuYwpAQCAtMCwwICsxLDE2MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisKK3N0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyB7CisJcGVyY2VudF90eXBlX3QgcGVyY2VudDsKKwl1aW50NjRfdCBzaXplOworCXVpbnQ2NF90IHZpcnR1YWxfc2l6ZTsgLyogc25hcHNob3QsIHRoaW4gKi8KKwljaGFyICoqcHZzOworCXVpbnQzMl90IHB2X2NvdW50OworfTsKKworc3RydWN0IHByb2Nlc3NpbmdfcGFyYW1zIHsKKwlzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscDsKKwlzdHJ1Y3QgbHZjcmVhdGVfY21kbGluZV9wYXJhbXMgKmxjcDsKK307CisKK3N0YXRpYyBpbnQgX3NldF92Z19uYW1lKHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLCBjb25zdCBjaGFyICp2Z19uYW1lKQoreworCS8qIENhbid0IGRvIGFueXRoaW5nICovCisJaWYgKCF2Z19uYW1lKQorCQlyZXR1cm4gMTsKKworCS8qIElmIFZHIG5hbWUgYWxyZWFkeSBrbm93biwgZW5zdXJlIHRoaXMgMm5kIGNvcHkgaXMgaWRlbnRpY2FsICovCisJaWYgKGxwLT52Z19uYW1lICYmIHN0cmNtcChscC0+dmdfbmFtZSwgdmdfbmFtZSkpIHsKKwkJbG9nX2Vycm9yKCJJbmNvbnNpc3RlbnQgdm9sdW1lIGdyb3VwIG5hbWVzICIKKwkJCSAgImdpdmVuOiBcIiVzXCIgYW5kIFwiJXNcIiIsCisJCQkgIGxwLT52Z19uYW1lLCB2Z19uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWxwLT52Z19uYW1lID0gdmdfbmFtZTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNyZWF0ZV9uYW1lX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgaW50ICpwYXJnYywgY2hhciAqKipwYXJndiwKKwkJCQkgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHApCit7CisJaW50IGFyZ2MgPSAqcGFyZ2M7CisJY2hhciAqKmFyZ3YgPSAqcGFyZ3Y7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKworCWxwLT5sdl9uYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIG5hbWVfQVJHLCBOVUxMKTsKKwlpZiAoIXZhbGlkYXRlX3Jlc3RyaWN0ZWRfbHZuYW1lX3BhcmFtKGNtZCwgJmxwLT52Z19uYW1lLCAmbHAtPmx2X25hbWUpKQorCQlyZXR1cm5fMDsKKworCWxwLT5wb29sX25hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdGhpbnBvb2xfQVJHLCBOVUxMKQorCQk/IDogYXJnX3N0cl92YWx1ZShjbWQsIGNhY2hlcG9vbF9BUkcsIE5VTEwpOworCWlmICghdmFsaWRhdGVfbHZuYW1lX3BhcmFtKGNtZCwgJmxwLT52Z19uYW1lLCAmbHAtPnBvb2xfbmFtZSkpCisJCXJldHVybl8wOworCisJaWYgKHNlZ19pc19jYWNoZShscCkpIHsKKwkJLyoKKwkJICogMiB3YXlzIG9mIGNhY2hlIHVzYWdlIGZvciBsdmNyZWF0ZSAtSCAtbDEgdmcvbHYKKwkJICoKKwkJICogdmcvbHYgaXMgZXhpc3RpbmcgY2FjaGUgcG9vbDoKKwkJICogICAgICAgY2FjaGVkIExWIGlzIGNyZWF0ZWQgdXNpbmcgdGhpcyBjYWNoZSBwb29sCisJCSAqIHZnL2x2IGlzIG5vdCBjYWNoZSBwb29sIHNvIGl0IGlzIGNhY2hlIG9yaWdpbgorCQkgKiAgICAgICBvcmlnaW4gaXMgY2FjaGVkIHdpdGggY3JlYXRlZCBjYWNoZSBwb29sCisJCSAqCisJCSAqIFdlIGFyZSBsb29raW5nIGZvciB0aGUgdmduYW1lIG9yIGNhY2hlIHBvb2wgb3IgY2FjaGUgb3JpZ2luIExWLgorCQkgKgorCQkgKiBsdiBuYW1lIGlzIHN0b3JlZCBpbiBvcmlnaW5fbmFtZSBhbmQgcG9vbF9uYW1lIGFuZAorCQkgKiBsYXRlciB3aXRoIG9wZW5lZCBWRyBpdCdzIGRlY2lkZWQgd2hhdCBzaG91bGQgaGFwcGVuLgorCQkgKi8KKwkJaWYgKCFhcmdjKSB7CisJCQlpZiAoIWxwLT5wb29sX25hbWUpIHsKKwkJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGEgbG9naWNhbCB2b2x1bWUgdG8gYWN0IGFzIHRoZSBjYWNoZSBwb29sIG9yIG9yaWdpbi4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZnX25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCBhcmd2WzBdLCBOVUxMKTsKKwkJCWlmICghc3RyY2hyKHZnX25hbWUsICcvJykpIHsKKwkJCQkvKiBMdWNreSBwYXJ0IC0gb25seSB2Z25hbWUgaXMgaGVyZSAqLworCQkJCWlmICghX3NldF92Z19uYW1lKGxwLCB2Z19uYW1lKSkKKwkJCQkJcmV0dXJuXzA7CisJCQl9IGVsc2UgeworCQkJCS8qIEFzc3VtZSBpdCdzIGNhY2hlIG9yaWdpbiBmb3Igbm93ICovCisJCQkJbHAtPm9yaWdpbl9uYW1lID0gdmdfbmFtZTsKKwkJCQlpZiAoIXZhbGlkYXRlX2x2bmFtZV9wYXJhbShjbWQsICZscC0+dmdfbmFtZSwgJmxwLT5vcmlnaW5fbmFtZSkpCisJCQkJCXJldHVybl8wOworCisJCQkJaWYgKGxwLT5wb29sX25hbWUpIHsKKwkJCQkJaWYgKHN0cmNtcChscC0+cG9vbF9uYW1lLCBscC0+b3JpZ2luX25hbWUpKSB7CisJCQkJCQlsb2dfZXJyb3IoIlVuc3VwcG9ydGVkIHN5bnRheCwgY2Fubm90IHVzZSBjYWNoZSBvcmlnaW4gJXMgYW5kIC0tY2FjaGVwb29sICVzLiIsCisJCQkJCQkJICBscC0+b3JpZ2luX25hbWUsIGxwLT5wb29sX25hbWUpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJbHAtPm9yaWdpbl9uYW1lID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBHYW1ibGluZyBoZXJlLCBjb3VsZCBiZSBjYWNoZSBwb29sIG9yIGNhY2hlIG9yaWdpbiwKKwkJCQkJICogZGV0ZWN0aW9uIGlzIHBvc3NpYmxlIGFmdGVyIG9wZW5uaW5nIHZnLAorCQkJCQkgKiB5ZXQgd2UgbmVlZCB0byBwYXJzZSBwb29sIGFyZ3MKKwkJCQkJICovCisJCQkJCWxwLT5wb29sX25hbWUgPSBscC0+b3JpZ2luX25hbWU7CisJCQkJCWxwLT5jcmVhdGVfcG9vbCA9IDE7CisJCQkJfQorCQkJfQorCQkJKCpwYXJndikrKywgKCpwYXJnYyktLTsKKwkJfQorCisJCWlmICghbHAtPnZnX25hbWUgJiYKKwkJICAgICFfc2V0X3ZnX25hbWUobHAsIGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFscC0+dmdfbmFtZSkgeworCQkJbG9nX2Vycm9yKCJUaGUgY2FjaGUgcG9vbCBvciBjYWNoZSBvcmlnaW4gbmFtZSBzaG91bGQgIgorCQkJCSAgImluY2x1ZGUgdGhlIHZvbHVtZSBncm91cC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFscC0+cG9vbF9uYW1lKSB7CisJCQlsb2dfZXJyb3IoIkNyZWF0aW9uIG9mIGNhY2hlZCB2b2x1bWUgYW5kIGNhY2hlIHBvb2wgIgorCQkJCSAgImluIG9uZSBjb21tYW5kIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKGxwLT5zbmFwc2hvdCAmJiAhYXJnX2lzX3NldChjbWQsIHZpcnR1YWxzaXplX0FSRykpIHsKKwkJLyogYXJndlswXSBtaWdodCBiZSBbdmcvXW9yaWdpbiAqLworCQlpZiAoIWFyZ2MpIHsKKwkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgYSBsb2dpY2FsIHZvbHVtZSB0byBhY3QgYXMgIgorCQkJCSAgInRoZSBzbmFwc2hvdCBvcmlnaW4uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwLT5vcmlnaW5fbmFtZSA9IGFyZ3ZbMF07CisJCWlmICghdmFsaWRhdGVfbHZuYW1lX3BhcmFtKGNtZCwgJmxwLT52Z19uYW1lLCAmbHAtPm9yaWdpbl9uYW1lKSkKKwkJCXJldHVybl8wOworCisJCWlmICghbHAtPnZnX25hbWUgJiYKKwkJICAgICFfc2V0X3ZnX25hbWUobHAsIGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFscC0+dmdfbmFtZSkgeworCQkJbG9nX2Vycm9yKCJUaGUgb3JpZ2luIG5hbWUgc2hvdWxkIGluY2x1ZGUgdGhlICIKKwkJCQkgICJ2b2x1bWUgZ3JvdXAuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCSgqcGFyZ3YpKyssICgqcGFyZ2MpLS07CisJfSBlbHNlIGlmICgoc2VnX2lzX3RoaW4obHApIHx8IHNlZ19pc19wb29sKGxwKSkgJiYgYXJnYykgeworCQkvKiBhcmd2WzBdIG1pZ2h0IGJlIFsvZGV2Li4uL112ZyBvciBbL2Rldi4uL112Zy9wb29sICovCisKKwkJdmdfbmFtZSA9IHNraXBfZGV2X2RpcihjbWQsIGFyZ3ZbMF0sIE5VTEwpOworCQlpZiAoIXN0cmNocih2Z19uYW1lLCAnLycpKSB7CisJCQlpZiAobHAtPnNuYXBzaG90ICYmIGFyZ19pc19zZXQoY21kLCB2aXJ0dWFsc2l6ZV9BUkcpKQorCQkJCWxwLT5zbmFwc2hvdCA9IDAgOyAvKiBTcGFyc2Ugdm9sdW1lIHZpYSB0aGluLXBvb2wgKi8KKwkJCWlmICghX3NldF92Z19uYW1lKGxwLCB2Z19uYW1lKSkKKwkJCQlyZXR1cm5fMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghdmFsaWRhdGVfbHZuYW1lX3BhcmFtKGNtZCwgJmxwLT52Z19uYW1lLCAmdmdfbmFtZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCWlmIChscC0+cG9vbF9uYW1lICYmCisJCQkgICAgKHN0cmNtcCh2Z19uYW1lLCBscC0+cG9vbF9uYW1lKSAhPSAwKSkgeworCQkJCWxvZ19lcnJvcigiQW1iaWd1b3VzICVzIG5hbWUgc3BlY2lmaWVkLCAlcyBhbmQgJXMuIiwKKwkJCQkJICBscC0+c2VndHlwZS0+bmFtZSwgdmdfbmFtZSwgbHAtPnBvb2xfbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlscC0+cG9vbF9uYW1lID0gdmdfbmFtZTsKKworCQkJaWYgKCFscC0+dmdfbmFtZSAmJgorCQkJICAgICFfc2V0X3ZnX25hbWUobHAsIGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKQorCQkJCXJldHVybl8wOworCisJCQlpZiAoIWxwLT52Z19uYW1lKSB7CisJCQkJbG9nX2Vycm9yKCJUaGUgJXMgbmFtZSBzaG91bGQgaW5jbHVkZSB0aGUgIgorCQkJCQkgICJ2b2x1bWUgZ3JvdXAuIiwgbHAtPnNlZ3R5cGUtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCSgqcGFyZ3YpKyssICgqcGFyZ2MpLS07CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgVkcgbm90IG9uIGNvbW1hbmQgbGluZSwgdHJ5IGVudmlyb25tZW50IGRlZmF1bHQuCisJCSAqLworCQlpZiAoIWFyZ2MpIHsKKwkJCWlmICghbHAtPnZnX25hbWUgJiYgIShscC0+dmdfbmFtZSA9IGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKSB7CisJCQkJbG9nX2Vycm9yKCJQbGVhc2UgcHJvdmlkZSBhIHZvbHVtZSBncm91cCBuYW1lIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2Z19uYW1lID0gc2tpcF9kZXZfZGlyKGNtZCwgYXJndlswXSwgTlVMTCk7CisJCQlpZiAoc3RyY2hyKHZnX25hbWUsICcvJykpIHsKKwkJCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBuYW1lIGV4cGVjdGVkICIKKwkJCQkJICAiKG5vIHNsYXNoKSIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoIV9zZXRfdmdfbmFtZShscCwgdmdfbmFtZSkpCisJCQkJcmV0dXJuXzA7CisKKwkJCSgqcGFyZ3YpKyssICgqcGFyZ2MpLS07CisJCX0KKwl9CisKKwkvKiBzdXBwb3J0IC0tbmFtZSAmIC0tdHlwZSB7dGhpbnxjYWNoZX0tcG9vbCAqLworCWlmIChzZWdfaXNfcG9vbChscCkgJiYgbHAtPmx2X25hbWUpIHsKKwkJaWYgKGxwLT5wb29sX25hbWUgJiYgKHN0cmNtcChscC0+bHZfbmFtZSwgbHAtPnBvb2xfbmFtZSkgIT0gMCkpIHsKKwkJCWxvZ19lcnJvcigiQW1iaWd1b3VzICVzIG5hbWUgc3BlY2lmaWVkLCAlcyBhbmQgJXMuIiwKKwkJCQkgIGxwLT5zZWd0eXBlLT5uYW1lLCBscC0+bHZfbmFtZSwgbHAtPnBvb2xfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlscC0+cG9vbF9uYW1lID0gbHAtPmx2X25hbWU7CisJCWxwLT5sdl9uYW1lID0gTlVMTDsKKwl9CisKKwlpZiAobHAtPnBvb2xfbmFtZSAmJiBscC0+bHZfbmFtZSAmJiAhc3RyY21wKGxwLT5wb29sX25hbWUsIGxwLT5sdl9uYW1lKSkgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIG5hbWUgJXMgYW5kIHBvb2wgbmFtZSBtdXN0IGJlIGRpZmZlcmVudC4iLAorCQkJICBscC0+bHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmFsaWRhdGVfbmFtZShscC0+dmdfbmFtZSkpIHsKKwkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgbmFtZSAlcyBoYXMgaW52YWxpZCBjaGFyYWN0ZXJzIiwKKwkJCSAgbHAtPnZnX25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFVwZGF0ZSBleHRlbnRzIHBhcmFtZXRlcnMgYmFzZWQgb24gb3RoZXIgcGFyYW1ldGVycyB3aGljaCBhZmZlY3QgdGhlIHNpemUKKyAqIGNhbGN1bGF0aW9uLgorICogTk9URTogV2UgbXVzdCBkbyB0aGlzIGhlcmUgYmVjYXVzZSBvZiB0aGUgZG1fcGVyY2VudF90IHR5cGVkZWYgYW5kIGJlY2F1c2Ugd2UKKyAqIG5lZWQgdGhlIHZnLgorICovCitzdGF0aWMgaW50IF91cGRhdGVfZXh0ZW50c19wYXJhbXMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJICBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCwKKwkJCQkgIHN0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyAqbGNwKQoreworCXVpbnQzMl90IHB2X2V4dGVudF9jb3VudDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbl9sdiA9IE5VTEw7CisJdWludDMyX3Qgc2l6ZV9yZXN0OworCXVpbnQzMl90IHN0cmlwZXNpemVfZXh0ZW50czsKKwl1aW50MzJfdCBleHRlbnRzOworCisJaWYgKGxjcC0+c2l6ZSAmJgorCSAgICAhKGxwLT5leHRlbnRzID0gZXh0ZW50c19mcm9tX3NpemUodmctPmNtZCwgbGNwLT5zaXplLAorCQkJCQkgICAgICAgdmctPmV4dGVudF9zaXplKSkpCisJCXJldHVybl8wOworCisJaWYgKGxjcC0+dmlydHVhbF9zaXplICYmCisJICAgICEobHAtPnZpcnR1YWxfZXh0ZW50cyA9IGV4dGVudHNfZnJvbV9zaXplKHZnLT5jbWQsIGxjcC0+dmlydHVhbF9zaXplLAorCQkJCQkJICAgICAgdmctPmV4dGVudF9zaXplKSkpCisJCXJldHVybl8wOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIHB2IGxpc3QgYmVmb3JlIHdlIHBhcnNlIGxjcC0+cGVyY2VudCAtIG1pZ2h0IGJlCisJICogUEVSQ0VOVF9QVlNzCisJICovCisJaWYgKGxjcC0+cHZfY291bnQpIHsKKwkJaWYgKCEobHAtPnB2aCA9IGNyZWF0ZV9wdl9saXN0KHZnLT5jbWQtPm1lbSwgdmcsCisJCQkJCSAgICAgICBsY3AtPnB2X2NvdW50LCBsY3AtPnB2cywgMSkpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlCisJCWxwLT5wdmggPSAmdmctPnB2czsKKworCXN3aXRjaCAobGNwLT5wZXJjZW50KSB7CisJCWNhc2UgUEVSQ0VOVF9WRzoKKwkJCWV4dGVudHMgPSBwZXJjZW50X29mX2V4dGVudHMobHAtPmV4dGVudHMsIHZnLT5leHRlbnRfY291bnQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgUEVSQ0VOVF9GUkVFOgorCQkJZXh0ZW50cyA9IHBlcmNlbnRfb2ZfZXh0ZW50cyhscC0+ZXh0ZW50cywgdmctPmZyZWVfY291bnQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgUEVSQ0VOVF9QVlM6CisJCQlpZiAobGNwLT5wdl9jb3VudCkgeworCQkJCXB2X2V4dGVudF9jb3VudCA9IHB2X2xpc3RfZXh0ZW50c19mcmVlKGxwLT5wdmgpOworCQkJCWV4dGVudHMgPSBwZXJjZW50X29mX2V4dGVudHMobHAtPmV4dGVudHMsIHB2X2V4dGVudF9jb3VudCwgMCk7CisJCQl9IGVsc2UKKwkJCQlleHRlbnRzID0gcGVyY2VudF9vZl9leHRlbnRzKGxwLT5leHRlbnRzLCB2Zy0+ZXh0ZW50X2NvdW50LCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFBFUkNFTlRfTFY6CisJCQlsb2dfZXJyb3IoIlBsZWFzZSBleHByZXNzIHNpemUgYXMgJSVGUkVFJXMsICUlUFZTIG9yICUlVkcuIiwKKwkJCQkgIChscC0+c25hcHNob3QpID8gIiwgJU9SSUdJTiIgOiAiIik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBQRVJDRU5UX09SSUdJTjoKKwkJCWlmIChscC0+c25hcHNob3QgJiYgbHAtPm9yaWdpbl9uYW1lICYmCisJCQkgICAgIShvcmlnaW5fbHYgPSBmaW5kX2x2KHZnLCBscC0+b3JpZ2luX25hbWUpKSkgeworCQkJCWxvZ19lcnJvcigiQ291bGRuJ3QgZmluZCBvcmlnaW4gdm9sdW1lICclcycuIiwKKwkJCQkJICBscC0+b3JpZ2luX25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCFvcmlnaW5fbHYpIHsKKwkJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkNvdWxkbid0IGZpbmQgb3JpZ2luIHZvbHVtZS4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIEFkZCB3aG9sZSBtZXRhZGF0YSBzaXplIGVzdGltYXRpb24gKi8KKwkJCWV4dGVudHMgPSBjb3dfbWF4X2V4dGVudHMob3JpZ2luX2x2LCBscC0+Y2h1bmtfc2l6ZSkgLSBvcmlnaW5fbHYtPmxlX2NvdW50ICsKKwkJCQlwZXJjZW50X29mX2V4dGVudHMobHAtPmV4dGVudHMsIG9yaWdpbl9sdi0+bGVfY291bnQsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgUEVSQ0VOVF9OT05FOgorCQkJZXh0ZW50cyA9IGxwLT5leHRlbnRzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIlVuc3VwcG9ydGVkIHBlcmNlbnQgdHlwZSAldS4iLCBsY3AtPnBlcmNlbnQpOworCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxjcC0+cGVyY2VudCkgeworCQkvKiBGSVhNRSBEb24ndCBkbyB0aGUgYWRqdXN0bWVudCBmb3IgcGFyYWxsZWwgYWxsb2NhdGlvbiB3aXRoIFBFUkNFTlRfT1JJR0lOISAqLworCQlscC0+YXBwcm94X2FsbG9jID0gMTsKKwkJbG9nX3ZlcmJvc2UoIkNvbnZlcnRlZCAlIiBQUkl1MzIgIiUlJXMgaW50byAlIiBQUkl1MzIgIiBleHRlbnRzLiIsIGxwLT5leHRlbnRzLCBnZXRfcGVyY2VudF9zdHJpbmcobGNwLT5wZXJjZW50KSwgZXh0ZW50cyk7CisJCWxwLT5leHRlbnRzID0gZXh0ZW50czsKKwl9CisKKwlpZiAobHAtPnNuYXBzaG90ICYmIGxwLT5vcmlnaW5fbmFtZSAmJiBscC0+ZXh0ZW50cykgeworCQlpZiAoIWxwLT5jaHVua19zaXplKSB7CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIk1pc3Npbmcgc25hcHNob3QgY2h1bmsgc2l6ZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFvcmlnaW5fbHYgJiYgIShvcmlnaW5fbHYgPSBmaW5kX2x2KHZnLCBscC0+b3JpZ2luX25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJDb3VsZG4ndCBmaW5kIG9yaWdpbiB2b2x1bWUgJyVzJy4iLAorCQkJCSAgbHAtPm9yaWdpbl9uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZXh0ZW50cyA9IGNvd19tYXhfZXh0ZW50cyhvcmlnaW5fbHYsIGxwLT5jaHVua19zaXplKTsKKworCQlpZiAoZXh0ZW50cyA8IGxwLT5leHRlbnRzKSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUmVkdWNpbmcgQ09XIHNpemUgJXMgZG93biB0byBtYXhpbXVtIHVzYWJsZSBzaXplICVzLiIsCisJCQkJCQlkaXNwbGF5X3NpemUodmctPmNtZCwgKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X3NpemUgKiBscC0+ZXh0ZW50cyksCisJCQkJCQlkaXNwbGF5X3NpemUodmctPmNtZCwgKHVpbnQ2NF90KSB2Zy0+ZXh0ZW50X3NpemUgKiBleHRlbnRzKSk7CisJCQlscC0+ZXh0ZW50cyA9IGV4dGVudHM7CisJCX0KKwl9CisKKwlpZiAoIShzdHJpcGVzaXplX2V4dGVudHMgPSBscC0+c3RyaXBlX3NpemUgLyB2Zy0+ZXh0ZW50X3NpemUpKQorCQlzdHJpcGVzaXplX2V4dGVudHMgPSAxOworCisJaWYgKChsY3AtPnBlcmNlbnQgIT0gUEVSQ0VOVF9OT05FKSAmJiBscC0+c3RyaXBlcyAmJgorCSAgICAoc2l6ZV9yZXN0ID0gbHAtPmV4dGVudHMgJSAobHAtPnN0cmlwZXMgKiBzdHJpcGVzaXplX2V4dGVudHMpKSAmJgorCSAgICAodmctPmZyZWVfY291bnQgPCBscC0+ZXh0ZW50cyAtIHNpemVfcmVzdCArIChscC0+c3RyaXBlcyAqIHN0cmlwZXNpemVfZXh0ZW50cykpKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSb3VuZGluZyBzaXplICglZCBleHRlbnRzKSBkb3duIHRvIHN0cmlwZSBib3VuZGFyeSAiCisJCQkJCSJzaXplICglZCBleHRlbnRzKSIsIGxwLT5leHRlbnRzLAorCQkJCQlscC0+ZXh0ZW50cyAtIHNpemVfcmVzdCk7CisJCWxwLT5leHRlbnRzID0gbHAtPmV4dGVudHMgLSBzaXplX3Jlc3Q7CisJfQorCisJaWYgKGxwLT5jcmVhdGVfcG9vbCkgeworCQlpZiAobHAtPnBvb2xfbWV0YWRhdGFfc2l6ZSAmJgorCQkgICAgIShscC0+cG9vbF9tZXRhZGF0YV9leHRlbnRzID0KKwkJICAgICAgZXh0ZW50c19mcm9tX3NpemUodmctPmNtZCwgbHAtPnBvb2xfbWV0YWRhdGFfc2l6ZSwgdmctPmV4dGVudF9zaXplKSkpCisJCQlyZXR1cm5fMDsKKworCQlpZiAoIXVwZGF0ZV9wb29sX3BhcmFtcyhscC0+c2VndHlwZSwgdmcsIGxwLT50YXJnZXRfYXR0ciwKKwkJCQkJbHAtPnBhc3NlZF9hcmdzLCBscC0+ZXh0ZW50cywKKwkJCQkJJmxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMsCisJCQkJCSZscC0+dGhpbl9jaHVua19zaXplX2NhbGNfcG9saWN5LCAmbHAtPmNodW5rX3NpemUsCisJCQkJCSZscC0+ZGlzY2FyZHMsICZscC0+emVybykpCisJCQlyZXR1cm5fMDsKKworCQlpZiAobGNwLT5wZXJjZW50ID09IFBFUkNFTlRfRlJFRSB8fCBsY3AtPnBlcmNlbnQgPT0gUEVSQ0VOVF9QVlMpIHsKKwkJCWlmIChscC0+ZXh0ZW50cyA8PSAoMiAqIGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMpKSB7CisJCQkJbG9nX2Vycm9yKCJOb3QgZW5vdWdoIHNwYWNlIGZvciB0aGluIHBvb2wgY3JlYXRpb24uIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKiBGSVhNRTogcGVyc2lzdGVudCBoaWRkZW4gc3BhY2UgaW4gVkcgd2FudGVkICovCisJCQlscC0+ZXh0ZW50cyAtPSAoMiAqIGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMpOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB2YXJpb3VzIGNvbW1vbiBzaXplIGFyZ3VtZW50cworICoKKyAqIE5vdGU6IGF0IHRoaXMgcGxhY2UgYWxsIHZvbHVtZSB0eXBlcyBuZWVkcyB0byBiZSBhbHJlYWR5CisgKiAgICAgICBpZGVudGlmaWVkLCBkbyBub3QgY2hhbmdlIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIGludCBfcmVhZF9zaXplX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHAsCisJCQkgICAgIHN0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyAqbGNwKQoreworCWlmIChhcmdfZnJvbV9saXN0X2lzX25lZ2F0aXZlKGNtZCwgIm1heSBub3QgYmUgbmVnYXRpdmUiLAorCQkJCSAgICAgIGNodW5rc2l6ZV9BUkcsIGV4dGVudHNfQVJHLAorCQkJCSAgICAgIG1pcnJvcnNfQVJHLAorCQkJCSAgICAgIG1heHJlY292ZXJ5cmF0ZV9BUkcsCisJCQkJICAgICAgbWlucmVjb3ZlcnlyYXRlX0FSRywKKwkJCQkgICAgICByZWdpb25zaXplX0FSRywKKwkJCQkgICAgICBzaXplX0FSRywKKwkJCQkgICAgICBzdHJpcGVzX0FSRywgc3RyaXBlc2l6ZV9BUkcsCisJCQkJICAgICAgdmlydHVhbHNpemVfQVJHLAorCQkJCSAgICAgIC0xKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoYXJnX2Zyb21fbGlzdF9pc196ZXJvKGNtZCwgIm1heSBub3QgYmUgemVybyIsCisJCQkJICBjaHVua3NpemVfQVJHLCBleHRlbnRzX0FSRywKKwkJCQkgIHJlZ2lvbnNpemVfQVJHLAorCQkJCSAgc2l6ZV9BUkcsCisJCQkJICBzdHJpcGVzX0FSRywgc3RyaXBlc2l6ZV9BUkcsCisJCQkJICB2aXJ0dWFsc2l6ZV9BUkcsCisJCQkJICAtMSkpCisJCXJldHVybl8wOworCisJbGNwLT52aXJ0dWFsX3NpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgdmlydHVhbHNpemVfQVJHLCBVSU5UNjRfQygwKSk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGV4dGVudHNfQVJHKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIHNpemVfQVJHKSkgeworCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgc2l6ZSBvciBleHRlbnRzIChub3QgYm90aCkuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlscC0+ZXh0ZW50cyA9IGFyZ191aW50X3ZhbHVlKGNtZCwgZXh0ZW50c19BUkcsIDApOworCQlsY3AtPnBlcmNlbnQgPSBhcmdfcGVyY2VudF92YWx1ZShjbWQsIGV4dGVudHNfQVJHLCBQRVJDRU5UX05PTkUpOworCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHNpemVfQVJHKSkgeworCQlsY3AtPnNpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgc2l6ZV9BUkcsIFVJTlQ2NF9DKDApKTsKKwkJbGNwLT5wZXJjZW50ID0gUEVSQ0VOVF9OT05FOworCX0gZWxzZSBpZiAoIWxwLT5zbmFwc2hvdCAmJiAhc2VnX2lzX3RoaW5fdm9sdW1lKGxwKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGVpdGhlciBzaXplIG9yIGV4dGVudHMuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogUmVhZCBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gbWlycm9ycworICovCitzdGF0aWMgaW50IF9yZWFkX21pcnJvcl9wYXJhbXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHApCit7CisJaW50IGNvcmVsb2cgPSBhcmdfaXNfc2V0KGNtZCwgY29yZWxvZ19BUkcpOworCisJbHAtPmxvZ19jb3VudCA9IGFyZ19pbnRfdmFsdWUoY21kLCBtaXJyb3Jsb2dfQVJHLCBjb3JlbG9nID8gMCA6IERFRkFVTFRfTUlSUk9STE9HKTsKKworCWlmIChjb3JlbG9nICYmIChscC0+bG9nX2NvdW50ICE9IDApKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHVzZSBvbmx5IG9uZSBvZiAtLWNvcmVsb2cgb3IgLS1taXJyb3Jsb2cuIik7CisJCXJldHVybiAwOworCX0KKworCWxvZ192ZXJib3NlKCJTZXR0aW5nIGxvZ2dpbmcgdHlwZSB0byAlcyIsIGdldF9taXJyb3JfbG9nX25hbWUobHAtPmxvZ19jb3VudCkpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIHBhcmFtZXRlcnMgcmVsYXRlZCB0byByYWlkcworICovCitzdGF0aWMgaW50IF9yZWFkX3JhaWRfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCkKK3sKKwlpZiAoc2VnX2lzX21pcnJvcmVkKGxwKSkgeworCQlpZiAoc2VndHlwZV9pc19yYWlkMTAobHAtPnNlZ3R5cGUpKSB7CisJCQlpZiAobHAtPnN0cmlwZXMgPCAyKSB7CisJCQkJLyoKKwkJCQkgKiBSQUlEMTAgbmVlZHMgYXQgbGVhc3QgNCBzdHJpcGVzCisJCQkJICovCisJCQkJbG9nX3dhcm4oIkFkanVzdGluZyBzdHJpcGVzIHRvIHRoZSBtaW5pbXVtIG9mIDIgZm9yICVzLiIsCisJCQkJCSBscC0+c2VndHlwZS0+bmFtZSk7CisJCQkJbHAtPnN0cmlwZXMgPSAyOworCQkJfQorCisJCQkvKgorCQkJICogRklYTUU6IF9jaGVja19yYWlkX3BhcmFtZXRlcnMgZGV2aWRlcyBieSAyLCB3aGljaAorCQkJICoJICBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugc3RhcnQgc3VwcG9ydGluZworCQkJICoJICBvZGQgbnVtYmVycyBvZiBzdHJpcGVzIHdpdGggcmFpZDEwCisJCQkgKi8KKwkJCWxwLT5zdHJpcGVzICo9IDI7CisKKwkJfSBlbHNlIGlmIChscC0+c3RyaXBlcyA+IDEpIHsKKwkJCS8qCisJCQkgKiBSQUlEMSBkb2VzIG5vdCB0YWtlIGEgc3RyaXBlIGFyZworCQkJICovCisJCQlsb2dfZXJyb3IoIlN0cmlwZSBhcmd1bWVudCBjYW5ub3QgYmUgdXNlZCB3aXRoIHNlZ21lbnQgdHlwZSwgJXMiLAorCQkJCSAgbHAtPnNlZ3R5cGUtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0gZWxzZSBpZiAobHAtPnN0cmlwZXMgPCAyKQorCQkvKiBObyBzdHJpcGVzIGFyZ3VtZW50IHdhcyBnaXZlbiAqLworCQlscC0+c3RyaXBlcyA9IHNlZ19pc19hbnlfcmFpZDYobHApID8gMyA6IDI7CisKKwlpZiAoc2VnX2lzX3JhaWQxKGxwKSkgeworCQlpZiAobHAtPnN0cmlwZV9zaXplKSB7CisJCQlsb2dfZXJyb3IoIlN0cmlwZSBzaXplIGFyZ3VtZW50IGNhbm5vdCBiZSB1c2VkIHdpdGggc2VnbWVudCB0eXBlLCAlcyIsCisJCQkJICBscC0+c2VndHlwZS0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJfSBlbHNlIGlmICghbHAtPnN0cmlwZV9zaXplKQorCQlscC0+c3RyaXBlX3NpemUgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIG1ldGFkYXRhX3N0cmlwZXNpemVfQ0ZHLCBOVUxMKSAqIDI7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1pcnJvcnNfQVJHKSAmJiBzZWd0eXBlX2lzX3JhaWQobHAtPnNlZ3R5cGUpICYmCisJICAgICFzZWd0eXBlX2lzX3JhaWQxKGxwLT5zZWd0eXBlKSAmJiAhc2VndHlwZV9pc19yYWlkMTAobHAtPnNlZ3R5cGUpKSB7CisJCWxvZ19lcnJvcigiTWlycm9yIGFyZ3VtZW50IGNhbm5vdCBiZSB1c2VkIHdpdGggc2VnbWVudCB0eXBlLCAlcyIsCisJCQkgIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlZ19pc19hbnlfcmFpZDAobHApKQorCQlscC0+cmVnaW9uX3NpemUgPSAwOworCWVsc2UgeworCQkvKiBSYXRlcyBhcmUgcmVjb3JkZWQgaW4ga2lCL3NlYy9kaXNrLCBub3Qgc2VjdG9ycy9zZWMvZGlzayAqLworCQlscC0+bWluX3JlY292ZXJ5X3JhdGUgPSBhcmdfdWludF92YWx1ZShjbWQsIG1pbnJlY292ZXJ5cmF0ZV9BUkcsIDApIC8gMjsKKwkJbHAtPm1heF9yZWNvdmVyeV9yYXRlID0gYXJnX3VpbnRfdmFsdWUoY21kLCBtYXhyZWNvdmVyeXJhdGVfQVJHLCAwKSAvIDI7CisKKwkJaWYgKGxwLT5taW5fcmVjb3ZlcnlfcmF0ZSA+IGxwLT5tYXhfcmVjb3ZlcnlfcmF0ZSkgeworCQkJbG9nX2Vycm9yKCJNaW5pbXVtIHJlY292ZXJ5IHJhdGUgY2Fubm90IGJlIGhpZ2hlciB0aGFuIG1heGltdW0uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogUmVhZCBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gbWlycm9ycyBhbmQgcmFpZHMKKyAqLworc3RhdGljIGludCBfcmVhZF9taXJyb3JfYW5kX3JhaWRfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQlzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCkKK3sKKwlpbnQgcGFnZXNpemUgPSBsdm1fZ2V0cGFnZXNpemUoKTsKKwl1bnNpZ25lZCBtYXhfaW1hZ2VzID0gc2VndHlwZV9pc19yYWlkKGxwLT5zZWd0eXBlKSA/IERFRkFVTFRfUkFJRF9NQVhfSU1BR0VTIDoKKwkJCQkJCQkgICAgIERFRkFVTFRfTUlSUk9SX01BWF9JTUFHRVM7CisKKwkvKiBDb21tb24gbWlycm9yIGFuZCByYWlkIHBhcmFtcyAqLworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlycm9yc19BUkcpKSB7CisJCWxwLT5taXJyb3JzID0gYXJnX3VpbnRfdmFsdWUoY21kLCBtaXJyb3JzX0FSRywgMCkgKyAxOworCisJCWlmICgobHAtPm1pcnJvcnMgPiAyKSAmJiBzZWd0eXBlX2lzX3JhaWQxMChscC0+c2VndHlwZSkpIHsKKwkJCS8qCisJCQkgKiBGSVhNRTogV2hlbiBSQUlEMTAgaXMgbm8gbG9uZ2VyIGxpbWl0ZWQgdG8KKwkJCSAqICAgICAgICAyLXdheSBtaXJyb3IsICdsdl9taXJyb3JfY291bnQoKScKKwkJCSAqICAgICAgICBtdXN0IGFsc28gY2hhbmdlIGZvciBSQUlEMTAuCisJCQkgKi8KKwkJCWxvZ19lcnJvcigiUkFJRDEwIGN1cnJlbnRseSBzdXBwb3J0cyAiCisJCQkJICAib25seSAyLXdheSBtaXJyb3JpbmcgKGkuZS4gJy1tIDEnKSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobHAtPm1pcnJvcnMgPT0gMSkgeworCQkJaWYgKHNlZ19pc19taXJyb3JlZChscCkpIHsKKwkJCQlsb2dfZXJyb3IoIi0tbWlycm9ycyBtdXN0IGJlIGF0IGxlYXN0IDEgd2l0aCBzZWdtZW50IHR5cGUgJXMuIiwgbHAtPnNlZ3R5cGUtPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlZHVuZGFudCBtaXJyb3JzIGFyZ3VtZW50OiBkZWZhdWx0IGlzIDAiKTsKKwkJfQorCX0gZWxzZQorCQkvKiBEZWZhdWx0IHRvIDIgbWlycm9yZWQgYXJlYXMgaWYgJy0tdHlwZSBtaXJyb3J8cmFpZDF8cmFpZDEwJyAqLworCQlscC0+bWlycm9ycyA9IHNlZ19pc19taXJyb3JlZChscCkgPyAyIDogMTsKKworCWlmIChtYXgobHAtPm1pcnJvcnMsIGxwLT5zdHJpcGVzKSA+IG1heF9pbWFnZXMpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IHVwIHRvICV1IGltYWdlcyBpbiAlcyBzdXBwb3J0ZWQgY3VycmVudGx5LiIsCisJCQkgIG1heF9pbWFnZXMsIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHAtPm5vc3luYyA9IGFyZ19pc19zZXQoY21kLCBub3N5bmNfQVJHKTsKKworCWlmICghKGxwLT5yZWdpb25fc2l6ZSA9IGFyZ191aW50X3ZhbHVlKGNtZCwgcmVnaW9uc2l6ZV9BUkcsIDApKSAmJgorCSAgICAoKGxwLT5yZWdpb25fc2l6ZSA9IGdldF9kZWZhdWx0X3JlZ2lvbl9zaXplKGNtZCkpIDw9IDApKSB7CisJCWxvZ19lcnJvcigicmVnaW9uc2l6ZSBpbiBjb25maWd1cmF0aW9uIGZpbGUgaXMgaW52YWxpZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGSVhNRSBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGdldF9zdHJpcGVfcGFyYW1zKCkgd2hlcmUgCisJICogc3RyaXBlcyBpcyBpbmNvcnJlY3RseSBhc3N1bWVkIHRvIGJlIDEgd2hlbiBpdCBpcyBub3Qgc3VwcGxpZWQKKwkgKiBsZWFkaW5nIHRvIHRoZSBhY3R1YWwgdmFsdWUgb2Ygc3RyaXBlc2l6ZSBnZXR0aW5nIGxvc3QuCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBzdHJpcGVzaXplX0FSRykpCisJCWxwLT5zdHJpcGVfc2l6ZSA9IGFyZ191aW50X3ZhbHVlKGNtZCwgc3RyaXBlc2l6ZV9BUkcsIDApOworCisJaWYgKCFpc19wb3dlcl9vZl8yKGxwLT5yZWdpb25fc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJSZWdpb24gc2l6ZSAoJSIgUFJJdTMyICIpIG11c3QgYmUgYSBwb3dlciBvZiAyIiwKKwkJCSAgbHAtPnJlZ2lvbl9zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxwLT5yZWdpb25fc2l6ZSAlIChwYWdlc2l6ZSA+PiBTRUNUT1JfU0hJRlQpKSB7CisJCWxvZ19lcnJvcigiUmVnaW9uIHNpemUgKCUiIFBSSXUzMiAiKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgIgorCQkJICAibWFjaGluZSBtZW1vcnkgcGFnZSBzaXplICglZCkiLAorCQkJICBscC0+cmVnaW9uX3NpemUsIHBhZ2VzaXplID4+IFNFQ1RPUl9TSElGVCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWdfaXNfbWlycm9yKGxwKSAmJiAhX3JlYWRfbWlycm9yX3BhcmFtcyhjbWQsIGxwKSkKKyAgICAgICAgICAgICAgICByZXR1cm5fMDsKKworCWlmIChzZWdfaXNfcmFpZChscCkgJiYgIV9yZWFkX3JhaWRfcGFyYW1zKGNtZCwgbHApKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX2NhY2hlX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCWlmICghc2VnX2lzX2NhY2hlKGxwKSAmJiAhc2VnX2lzX2NhY2hlX3Bvb2wobHApKQorCQlyZXR1cm4gMTsKKworCWlmICghZ2V0X2NhY2hlX3BhcmFtcyhjbWQsCisJCQkgICAgICAmbHAtPmNhY2hlX21vZGUsCisJCQkgICAgICAmbHAtPnBvbGljeV9uYW1lLAorCQkJICAgICAgJmxwLT5wb2xpY3lfc2V0dGluZ3MpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZWFkX2FjdGl2YXRpb25fcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCXVuc2lnbmVkIHBhZ2VzaXplID0gbHZtX2dldHBhZ2VzaXplKCkgPj4gU0VDVE9SX1NISUZUOworCisJbHAtPmFjdGl2YXRlID0gKGFjdGl2YXRpb25fY2hhbmdlX3QpCisJCWFyZ191aW50X3ZhbHVlKGNtZCwgYWN0aXZhdGVfQVJHLCBDSEFOR0VfQVkpOworCisJLyogRXJyb3Igd2hlbiBmdWxsICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBlcnJvcndoZW5mdWxsX0FSRykpIHsKKwkJbHAtPmVycm9yX3doZW5fZnVsbCA9IGFyZ191aW50X3ZhbHVlKGNtZCwgZXJyb3J3aGVuZnVsbF9BUkcsIDApOworCX0gZWxzZQorCQlscC0+ZXJyb3Jfd2hlbl9mdWxsID0KKwkJCXNlZ19jYW5fZXJyb3Jfd2hlbl9mdWxsKGxwKSAmJgorCQkJZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgYWN0aXZhdGlvbl9lcnJvcl93aGVuX2Z1bGxfQ0ZHLCBOVUxMKTsKKworCS8qIFJlYWQgYWhlYWQgKi8KKwlscC0+cmVhZF9haGVhZCA9IGFyZ191aW50X3ZhbHVlKGNtZCwgcmVhZGFoZWFkX0FSRywKKwkJCQkJY21kLT5kZWZhdWx0X3NldHRpbmdzLnJlYWRfYWhlYWQpOworCWlmIChscC0+cmVhZF9haGVhZCAhPSBETV9SRUFEX0FIRUFEX0FVVE8gJiYKKwkgICAgbHAtPnJlYWRfYWhlYWQgIT0gRE1fUkVBRF9BSEVBRF9OT05FICYmCisJICAgIGxwLT5yZWFkX2FoZWFkICUgcGFnZXNpemUpIHsKKwkJaWYgKGxwLT5yZWFkX2FoZWFkIDwgcGFnZXNpemUpCisJCQlscC0+cmVhZF9haGVhZCA9IHBhZ2VzaXplOworCQllbHNlCisJCQlscC0+cmVhZF9haGVhZCA9IChscC0+cmVhZF9haGVhZCAvIHBhZ2VzaXplKSAqIHBhZ2VzaXplOworCQlsb2dfd2FybigiV0FSTklORzogT3ZlcnJpZGluZyByZWFkYWhlYWQgdG8gJXUgc2VjdG9ycywgYSBtdWx0aXBsZSAiCisJCQkgIm9mICV1SyBwYWdlIHNpemUuIiwgbHAtPnJlYWRfYWhlYWQsIHBhZ2VzaXplID4+IDEpOworCX0KKworCS8qIFBlcnNpc3RlbnQgbWlub3IgKGFuZCBtYWpvciksIGRlZmF1bHQgJ24nICovCisJaWYgKCFnZXRfYW5kX3ZhbGlkYXRlX21ham9yX21pbm9yKGNtZCwgdmctPmZpZC0+Zm10LCAmbHAtPm1ham9yLCAmbHAtPm1pbm9yKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHNldGFjdGl2YXRpb25za2lwX0FSRykpIHsKKwkJbHAtPmFjdGl2YXRpb25fc2tpcCB8PSBBQ1RJVkFUSU9OX1NLSVBfU0VUOworCQlpZiAoYXJnX2ludF92YWx1ZShjbWQsIHNldGFjdGl2YXRpb25za2lwX0FSRywgMCkpCisJCQlscC0+YWN0aXZhdGlvbl9za2lwIHw9IEFDVElWQVRJT05fU0tJUF9TRVRfRU5BQkxFRDsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGlnbm9yZWFjdGl2YXRpb25za2lwX0FSRykpCisJCWxwLT5hY3RpdmF0aW9uX3NraXAgfD0gQUNUSVZBVElPTl9TS0lQX0lHTk9SRTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9sdmNyZWF0ZV9wYXJhbXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLAorCQkJICAgIHN0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyAqbGNwKQoreworCWludCBjb250aWd1b3VzOworCXN0cnVjdCBhcmdfdmFsdWVfZ3JvdXBfbGlzdCAqY3VycmVudF9ncm91cDsKKwljb25zdCBjaGFyICpzZWd0eXBlX3N0cjsKKwljb25zdCBjaGFyICp0YWc7CisJaW50IG9ubHlfbGluZWFyID0gMDsKKwlpbnQgbWlycm9yX2RlZmF1bHRfY2ZnOworCisJZG1fbGlzdF9pbml0KCZscC0+dGFncyk7CisJbHAtPnRhcmdldF9hdHRyID0gfjA7CisJbHAtPnllcyA9IGFyZ19jb3VudChjbWQsIHllc19BUkcpOworCWxwLT5mb3JjZSA9IChmb3JjZV90KSBhcmdfY291bnQoY21kLCBmb3JjZV9BUkcpOworCWxwLT5wZXJtaXNzaW9uID0gYXJnX3VpbnRfdmFsdWUoY21kLCBwZXJtaXNzaW9uX0FSRywKKwkJCQkJTFZNX1JFQUQgfCBMVk1fV1JJVEUpOworCisJLyoKKwkgKiAtLXR5cGUgaXMgdGhlIHRvcCBtb3N0IHJ1bGUKKwkgKgorCSAqIE9yZGVyaW5nIG9mIGZvbGxvd2luZyB0eXBlIHRlc3RzIGlzIElNUE9SVEFOVAorCSAqLworCWlmICgoc2VndHlwZV9zdHIgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpKSkgeworCQlscC0+dHlwZSA9IDE7CisJCWlmICghc3RyY21wKHNlZ3R5cGVfc3RyLCAibGluZWFyIikpIHsKKwkJCXNlZ3R5cGVfc3RyID0gInN0cmlwZWQiOworCQkJb25seV9saW5lYXIgPSAxOyAvKiBVc2VyIHJlcXVlc3RlZCBsaW5lYXIgb25seSB0YXJnZXQgKi8KKwkJfQorCS8qIE1vcmUgZXN0aW1hdGlvbnMgZnJvbSBvcHRpb25zIGFmdGVyIHNob3J0Y3V0cyAqLworCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHNuYXBzaG90X0FSRykgJiYKKwkJICAgKGFyZ19pc19zZXQoY21kLCB2aXJ0dWFsb3JpZ2luc2l6ZV9BUkcpIHx8CisJCSAgICFhcmdfaXNfc2V0KGNtZCwgdmlydHVhbHNpemVfQVJHKSkpCisJCS8qIFNuYXBzaG90IGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhlbiB0aGluICovCisJCXNlZ3R5cGVfc3RyID0gU0VHX1RZUEVfTkFNRV9TTkFQU0hPVDsgLyogLS10aGlucG9vbCBtYWtlcyB0aGluIHZvbHVtZSAqLworCWVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCBjYWNoZV9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBjYWNoZXBvb2xfQVJHKSkKKwkJc2VndHlwZV9zdHIgPSBTRUdfVFlQRV9OQU1FX0NBQ0hFOworCWVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCB0aGluX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIHRoaW5wb29sX0FSRykpCisJCXNlZ3R5cGVfc3RyID0gU0VHX1RZUEVfTkFNRV9USElOOworCWVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCB2aXJ0dWFsc2l6ZV9BUkcpKSB7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgdmlydHVhbG9yaWdpbnNpemVfQVJHKSkKKwkJCXNlZ3R5cGVfc3RyID0gU0VHX1RZUEVfTkFNRV9TTkFQU0hPVDsgLyogLS12aXJ0dWFsb3JpZ2luc2l6ZSBpbmNvbXBhdGlibGUgd2l0aCBwb29scyAqLworCQllbHNlCisJCQlzZWd0eXBlX3N0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgZ2xvYmFsX3NwYXJzZV9zZWd0eXBlX2RlZmF1bHRfQ0ZHLCBOVUxMKTsKKwl9IGVsc2UgaWYgKGFyZ191aW50X3ZhbHVlKGNtZCwgbWlycm9yc19BUkcsIDApKSB7CisJCS8qIFJlbWVtYmVyLCAnLW0gMCcgaW1wbGllcyBzdHJpcGUgKi8KKwkJbWlycm9yX2RlZmF1bHRfY2ZnID0gKGFyZ191aW50X3ZhbHVlKGNtZCwgc3RyaXBlc19BUkcsIDEpID4gMSkKKwkJCT8gZ2xvYmFsX3JhaWQxMF9zZWd0eXBlX2RlZmF1bHRfQ0ZHIDogZ2xvYmFsX21pcnJvcl9zZWd0eXBlX2RlZmF1bHRfQ0ZHOworCQlzZWd0eXBlX3N0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgbWlycm9yX2RlZmF1bHRfY2ZnLCBOVUxMKTsKKwl9IGVsc2UKKwkJc2VndHlwZV9zdHIgPSBTRUdfVFlQRV9OQU1FX1NUUklQRUQ7CisKKwlpZiAoIShscC0+c2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgc2VndHlwZV9zdHIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoc2VnX3Vua25vd24obHApKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBMViB3aXRoIHVua25vd24gc2VnbWVudCB0eXBlICVzLiIsIHNlZ3R5cGVfc3RyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU3RhcnRzIGJhc2ljIG9wdGlvbiB2YWxpZGF0aW9uIGZvciBldmVyeSBzZWdtZW50IHR5cGUgKi8KKworCS8qIEZJWE1FIFVzZSB0aGVzZSBBUkdTIG1hY3JvcyBhbHNvIGluIGNvbW1hbmRzLmg/ICovCisJLyogQVJHUyBhcmUgZGlzam9pbnQhIHNldHMgb2Ygb3B0aW9ucyAqLworI2RlZmluZSBMVkNSRUFURV9BUkdTIFwKKwlhY3RpdmF0ZV9BUkcsXAorCWFkZHRhZ19BUkcsXAorCWFsbG9jX0FSRyxcCisJYXV0b2JhY2t1cF9BUkcsXAorCWF2YWlsYWJsZV9BUkcsXAorCWNvbnRpZ3VvdXNfQVJHLFwKKwlpZ25vcmVhY3RpdmF0aW9uc2tpcF9BUkcsXAorCWlnbm9yZW1vbml0b3JpbmdfQVJHLFwKKwltb25pdG9yX0FSRyxcCisJbWlycm9yc19BUkcsXAorCW5hbWVfQVJHLFwKKwlub3VkZXZzeW5jX0FSRyxcCisJcGVybWlzc2lvbl9BUkcsXAorCXBlcnNpc3RlbnRfQVJHLFwKKwlyZWFkYWhlYWRfQVJHLFwKKwlzZXRhY3RpdmF0aW9uc2tpcF9BUkcsXAorCXRlc3RfQVJHLFwKKwl0eXBlX0FSRworCisjZGVmaW5lIENBQ0hFX1BPT0xfQVJHUyBcCisJY2FjaGVtb2RlX0FSRyxcCisJY2FjaGVwb29sX0FSRyxcCisJY2FjaGVwb2xpY3lfQVJHLFwKKwljYWNoZXNldHRpbmdzX0FSRworCisjZGVmaW5lIE1JUlJPUl9BUkdTIFwKKwljb3JlbG9nX0FSRyxcCisJbWlycm9ybG9nX0FSRworCisjZGVmaW5lIE1JUlJPUl9SQUlEX0FSR1MgXAorCW5vc3luY19BUkcsXAorCXJlZ2lvbnNpemVfQVJHCisKKyNkZWZpbmUgUEVSU0lTVEVOVF9BUkdTIFwKKwltYWpvcl9BUkcsXAorCW1pbm9yX0FSRworCisjZGVmaW5lIFBPT0xfQVJHUyBcCisJcG9vbGRhdGFzaXplX0FSRyxcCisJcG9vbG1ldGFkYXRhc2l6ZV9BUkcsXAorCXBvb2xtZXRhZGF0YXNwYXJlX0FSRworCisjZGVmaW5lIFJBSURfQVJHUyBcCisJbWF4cmVjb3ZlcnlyYXRlX0FSRyxcCisJbWlucmVjb3ZlcnlyYXRlX0FSRyxcCisJcmFpZG1heHJlY292ZXJ5cmF0ZV9BUkcsXAorCXJhaWRtaW5yZWNvdmVyeXJhdGVfQVJHCisKKyNkZWZpbmUgU0laRV9BUkdTIFwKKwlleHRlbnRzX0FSRyxcCisJc2l6ZV9BUkcsXAorCXN0cmlwZXNfQVJHLFwKKwlzdHJpcGVzaXplX0FSRworCisjZGVmaW5lIFRISU5fUE9PTF9BUkdTIFwKKwlkaXNjYXJkc19BUkcsXAorCXRoaW5wb29sX0FSRworCisJLyogQ2FjaGUgYW5kIGNhY2hlLXBvb2wgc2VnbWVudCB0eXBlICovCisJaWYgKHNlZ19pc19jYWNoZShscCkpIHsKKwkJLyogT25seSBzdXBwb3J0ZWQgd2l0aCAtLXR5cGUgY2FjaGUsIC1ILCAtLWNhY2hlICovCisJCWlmIChhcmdfb3V0c2lkZV9saXN0X2lzX3NldChjbWQsICJpcyB1bnN1cHBvcnRlZCB3aXRoIGNhY2hlIiwKKwkJCQkJICAgIENBQ0hFX1BPT0xfQVJHUywKKwkJCQkJICAgIExWQ1JFQVRFX0FSR1MsCisJCQkJCSAgICBQRVJTSVNURU5UX0FSR1MsCisJCQkJCSAgICBQT09MX0FSR1MsCisJCQkJCSAgICBTSVpFX0FSR1MsCisJCQkJCSAgICBjYWNoZV9BUkcsCisJCQkJCSAgICBjaHVua3NpemVfQVJHLAorCQkJCQkgICAgd2lwZXNpZ25hdHVyZXNfQVJHLCB6ZXJvX0FSRywKKwkJCQkJICAgIC0xKSkKKwkJCXJldHVybl8wOworCQlscC0+Y3JlYXRlX3Bvb2wgPSAxOyAvKiBDb25maXJtZWQgd2hlbiBvcGVuZWQgVkcgKi8KKwl9IGVsc2UgaWYgKHNlZ19pc19jYWNoZV9wb29sKGxwKSkgeworCQlpZiAoYXJnX291dHNpZGVfbGlzdF9pc19zZXQoY21kLCAiaXMgdW5zdXBwb3J0ZWQgd2l0aCBjYWNoZSBwb29scyIsCisJCQkJCSAgICBDQUNIRV9QT09MX0FSR1MsCisJCQkJCSAgICBMVkNSRUFURV9BUkdTLAorCQkJCQkgICAgUE9PTF9BUkdTLAorCQkJCQkgICAgZXh0ZW50c19BUkcsCisJCQkJCSAgICBzaXplX0FSRywKKwkJCQkJICAgIGNhY2hlX0FSRywKKwkJCQkJICAgIGNodW5rc2l6ZV9BUkcsCisJCQkJCSAgICAtMSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCEobHAtPnBlcm1pc3Npb24gJiBMVk1fV1JJVEUpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBjcmVhdGUgcmVhZC1vbmx5IGNhY2hlIHBvb2wuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlscC0+Y3JlYXRlX3Bvb2wgPSAxOworCX0gZWxzZSBpZiAoYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCBjYWNoZSIsCisJCQkJCWNhY2hlX0FSRywgQ0FDSEVfUE9PTF9BUkdTLAorCQkJCQktMSkpCisJCXJldHVybl8wOworCisJLyogU25hcHNob3Qgc2VnbWVudCB0eXBlICovCisJaWYgKHNlZ19pc19zbmFwc2hvdChscCkpIHsKKwkJLyogT25seSBzdXBwb3J0ZWQgd2l0aCAtLXR5cGUgc25hcHNob3QsIC1zLCAtLXNuYXBzaG90ICovCisJCWlmIChhcmdfb3V0c2lkZV9saXN0X2lzX3NldChjbWQsICJpcyB1bnN1cHBvcnRlZCB3aXRoIHNuYXBzaG90cyIsCisJCQkJCSAgICBMVkNSRUFURV9BUkdTLAorCQkJCQkgICAgUEVSU0lTVEVOVF9BUkdTLAorCQkJCQkgICAgU0laRV9BUkdTLAorCQkJCQkgICAgY2h1bmtzaXplX0FSRywKKwkJCQkJICAgIHNuYXBzaG90X0FSRywKKwkJCQkJICAgIHRoaW5wb29sX0FSRywKKwkJCQkJICAgIHZpcnR1YWxvcmlnaW5zaXplX0FSRywKKwkJCQkJICAgIHZpcnR1YWxzaXplX0FSRywKKwkJCQkJICAgIC0xKSkKKwkJCXJldHVybl8wOworCisJCS8qIEZJWE1FIFJlc29sdmUgdGhpcyBhbWJpZ3VvdXMgY2FzZSB3aXRoIC0tcG9vbGRhdGFzaXplICAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIHRoaW5wb29sX0FSRykpIHsKKwkJCWlmIChscC0+dHlwZSkgeworCQkJCS8qIFVuc3VwcG9ydGVkIHdpdGggLS10eXBlIHNuYXBzaG90ICovCisJCQkJbG9nX2Vycm9yKCJTbmFwc2hvdCBzZWdtZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpbiBwb29scy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHVuc3VwcG9ydGVkIHdpdGggc25hcHNob3RzIGFuZCAtLXRoaW5wb29sIiwKKwkJCQkJCSBTSVpFX0FSR1MsCisJCQkJCQkgY2h1bmtzaXplX0FSRywKKwkJCQkJCSB2aXJ0dWFsb3JpZ2luc2l6ZV9BUkcsCisJCQkJCQkgdmlydHVhbHNpemVfQVJHLAorCQkJCQkJIC0xKSkKKwkJCQlyZXR1cm5fMDsKKwkJfQorCisJCS8qIFNuYXBzaG90IHNlZ21lbnQgdHlwZSBuZWVkcyBzaXplL2V4dGVudHMgKi8KKwkJaWYgKGxwLT50eXBlICYmICFhcmdfaXNfc2V0KGNtZCwgc2l6ZV9BUkcpICYmICFhcmdfaXNfc2V0KGNtZCwgZXh0ZW50c19BUkcpKSB7CisJCQlsb2dfZXJyb3IoIlNuYXBzaG90IHNlZ21lbnQgdHlwZSByZXF1aXJlcyBzaXplIG9yIGV4dGVudHMuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwLT5zbmFwc2hvdCA9IDE7IC8qIEZyZWUgYXJnIGlzIHNuYXBzaG90IG9yaWdpbiAqLworCX0gZWxzZSBpZiAoYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCBzcGFyc2Ugc25hcHNob3RzIiwKKwkJCQkJdmlydHVhbG9yaWdpbnNpemVfQVJHLAorCQkJCQktMSkpCisJCXJldHVybl8wOworCisJLyogTWlycm9yIHNlZ21lbnQgdHlwZSAqLworCWlmIChzZWdfaXNfbWlycm9yKGxwKSkgeworCQlpZiAoYXJnX291dHNpZGVfbGlzdF9pc19zZXQoY21kLCAiaXMgdW5zdXBwb3J0ZWQgd2l0aCBtaXJyb3JzIiwKKwkJCQkJICAgIExWQ1JFQVRFX0FSR1MsCisJCQkJCSAgICBNSVJST1JfQVJHUywKKwkJCQkJICAgIE1JUlJPUl9SQUlEX0FSR1MsCisJCQkJCSAgICBQRVJTSVNURU5UX0FSR1MsCisJCQkJCSAgICBTSVpFX0FSR1MsCisJCQkJCSAgICB3aXBlc2lnbmF0dXJlc19BUkcsIHplcm9fQVJHLAorCQkJCQkgICAgLTEpKQorCQkJcmV0dXJuXzA7CisJfSBlbHNlIGlmIChhcmdfZnJvbV9saXN0X2lzX3NldChjbWQsICJpcyBzdXBwb3J0ZWQgb25seSB3aXRoIG1pcnJvcnMiLAorCQkJCQlNSVJST1JfQVJHUywKKwkJCQkJLTEpKQorCQlyZXR1cm5fMDsKKworCS8qIFJhaWQgc2VnbWVudCB0eXBlICovCisJaWYgKHNlZ19pc19yYWlkKGxwKSkgeworCQlpZiAoYXJnX291dHNpZGVfbGlzdF9pc19zZXQoY21kLCAiaXMgdW5zdXBwb3J0ZWQgd2l0aCByYWlkcyIsCisJCQkJCSAgICBMVkNSRUFURV9BUkdTLAorCQkJCQkgICAgTUlSUk9SX1JBSURfQVJHUywKKwkJCQkJICAgIFBFUlNJU1RFTlRfQVJHUywKKwkJCQkJICAgIFJBSURfQVJHUywKKwkJCQkJICAgIFNJWkVfQVJHUywKKwkJCQkJICAgIHdpcGVzaWduYXR1cmVzX0FSRywgemVyb19BUkcsCisJCQkJCSAgICAtMSkpCisJCQlyZXR1cm5fMDsKKwl9IGVsc2UgaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHN1cHBvcnRlZCBvbmx5IHdpdGggcmFpZHMiLAorCQkJCQlSQUlEX0FSR1MsCisJCQkJCS0xKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBUaGluIGFuZCB0aGluLXBvb2wgc2VnbWVudCB0eXBlICovCisJaWYgKHNlZ19pc190aGluX3ZvbHVtZShscCkpIHsKKwkJLyogT25seSBzdXBwb3J0ZWQgd2l0aCAtLXR5cGUgdGhpbiwgLVQsIC0tdGhpbiwgLVYgKi8KKwkJaWYgKGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNtZCwgImlzIHVuc3VwcG9ydGVkIHdpdGggdGhpbnMiLAorCQkJCQkgICAgTFZDUkVBVEVfQVJHUywKKwkJCQkJICAgIFBFUlNJU1RFTlRfQVJHUywKKwkJCQkJICAgIFBPT0xfQVJHUywKKwkJCQkJICAgIFNJWkVfQVJHUywKKwkJCQkJICAgIFRISU5fUE9PTF9BUkdTLAorCQkJCQkgICAgY2h1bmtzaXplX0FSRywKKwkJCQkJICAgIGVycm9yd2hlbmZ1bGxfQVJHLAorCQkJCQkgICAgc25hcHNob3RfQVJHLAorCQkJCQkgICAgdGhpbl9BUkcsCisJCQkJCSAgICB2aXJ0dWFsc2l6ZV9BUkcsCisJCQkJCSAgICB3aXBlc2lnbmF0dXJlc19BUkcsIHplcm9fQVJHLAorCQkJCQkgICAgLTEpKQorCQkJcmV0dXJuXzA7CisKKwkJLyogSWYgc2l6ZS9leHRlbnRzIGdpdmVuIHdpdGggdGhpbiwgdGhlbiB3ZSBhcmUgYWxzbyBjcmVhdGluZyBhIHRoaW4tcG9vbCAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIHNpemVfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgZXh0ZW50c19BUkcpKSB7CisJCQlpZiAoYXJnX2lzX3NldChjbWQsIHBvb2xkYXRhc2l6ZV9BUkcpKSB7CisJCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgc2l6ZSBvciBwb29sZGF0YXNpemUuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlscC0+Y3JlYXRlX3Bvb2wgPSAxOworCQl9IGVsc2UgaWYgKGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHN1cHBvcnRlZCBvbmx5IHdpdGggdGhpbiBwb29sIGNyZWF0aW9uIiwKKwkJCQkJCVBPT0xfQVJHUywKKwkJCQkJCVNJWkVfQVJHUywKKwkJCQkJCWNodW5rc2l6ZV9BUkcsCisJCQkJCQlkaXNjYXJkc19BUkcsCisJCQkJCQllcnJvcndoZW5mdWxsX0FSRywKKwkJCQkJCXplcm9fQVJHLAorCQkJCQkJLTEpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgdmlydHVhbHNpemVfQVJHKSkgeworCQkJLyogV2l0aG91dCB2aXJ0dWFsIHNpemUgY291bGQgYmUgY3JlYXRpb24gb2YgdGhpbi1wb29sIG9yIHNuYXBzaG90ICovCisJCQlpZiAobHAtPmNyZWF0ZV9wb29sKSB7CisJCQkJaWYgKGxwLT50eXBlKSB7CisJCQkJCWxvZ19lcnJvcigiVGhpbiBzZWdtZW50IHR5cGUgcmVxdWlyZXMgLS12aXJ0dWFsc2l6ZS4iKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJbG9nX2RlYnVnX21ldGFkYXRhKCJTd2l0Y2hpbmcgZnJvbSB0aGluIHRvIHRoaW4gcG9vbCBzZWdtZW50IHR5cGUuIik7CisJCQkJaWYgKCEobHAtPnNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfVEhJTl9QT09MKSkpCisJCQkJCXJldHVybl8wOworCQkJfSBlbHNlCS8qIFBhcnNlIGZyZWUgYXJnIGFzIHNuYXBzaG90IG9yaWdpbiAqLworCQkJCWxwLT5zbmFwc2hvdCA9IDE7CisJCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHNuYXBzaG90X0FSRykpCisJCQlscC0+c25hcHNob3QgPSAxOworCX0gZWxzZSBpZiAoc2VnX2lzX3RoaW5fcG9vbChscCkpIHsKKwkJaWYgKGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNtZCwgImlzIHVuc3VwcG9ydGVkIHdpdGggdGhpbiBwb29scyIsCisJCQkJCSAgICBMVkNSRUFURV9BUkdTLAorCQkJCQkgICAgUE9PTF9BUkdTLAorCQkJCQkgICAgU0laRV9BUkdTLAorCQkJCQkgICAgVEhJTl9QT09MX0FSR1MsCisJCQkJCSAgICBjaHVua3NpemVfQVJHLAorCQkJCQkgICAgemVyb19BUkcsCisJCQkJCSAgICAtMSkpCisJCQlyZXR1cm5fMDsKKwkJaWYgKCEobHAtPnBlcm1pc3Npb24gJiBMVk1fV1JJVEUpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBjcmVhdGUgcmVhZC1vbmx5IHRoaW4gcG9vbC4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxwLT5jcmVhdGVfcG9vbCA9IDE7CisJfSBlbHNlIGlmICghbHAtPnNuYXBzaG90ICYmCisJCSAgIGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHN1cHBvcnRlZCBvbmx5IHdpdGggdGhpbnMiLAorCQkJCQl0aGluX0FSRywgVEhJTl9QT09MX0FSR1MsCisJCQkJCS0xKSkKKwkJcmV0dXJuXzA7CisKKwkvKiBDaGVjayBvcHRpb25zIHNoYXJlZCBiZXR3ZWVuIG1vcmUgc2VnbWVudCB0eXBlcyAqLworCWlmICghc2VnX2lzX21pcnJvcihscCkgJiYgIXNlZ19pc19yYWlkKGxwKSkgeworCQlpZiAoYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCBtaXJyb3JzIG9yIHJhaWRzIiwKKwkJCQkJIG5vc3luY19BUkcsCisJCQkJCSByZWdpb25zaXplX0FSRywKKwkJCQkJIC0xKSkKKwkJCXJldHVybl8wOworCQkvKiBMZXQgLW0wIHBhc3MgKi8KKwkJaWYgKGFyZ19pbnRfdmFsdWUoY21kLCBtaXJyb3JzX0FSRywgMCkpIHsKKwkJCWxvZ19lcnJvcigiLS1taXJyb3JzIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggbWlycm9ycyBvciByYWlkcyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWxwLT5jcmVhdGVfcG9vbCAmJiAhbHAtPnNuYXBzaG90ICYmCisJICAgIGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNtZCwgImlzIHN1cHBvcnRlZCBvbmx5IHdpdGggcG9vbHMgYW5kIHNuYXBzaG90cyIsCisJCQkJIGNodW5rc2l6ZV9BUkcsCisJCQkJIC0xKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIWxwLT5zbmFwc2hvdCAmJiAhc2VnX2lzX3RoaW5fdm9sdW1lKGxwKSAmJgorCSAgICBhcmdfZnJvbV9saXN0X2lzX3NldChjbWQsICJpcyBzdXBwb3J0ZWQgb25seSB3aXRoIHNwYXJzZSBzbmFwc2hvdHMgYW5kIHRoaW5zIiwKKwkJCQkgdmlydHVhbHNpemVfQVJHLAorCQkJCSAtMSkpCisJCXJldHVybl8wOworCisJaWYgKCFzZWdfY2FuX2Vycm9yX3doZW5fZnVsbChscCkgJiYgIWxwLT5jcmVhdGVfcG9vbCAmJgorCSAgICBhcmdfaXNfc2V0KGNtZCwgZXJyb3J3aGVuZnVsbF9BUkcpKSB7CisJCWxvZ19lcnJvcigiU2VnbWVudCB0eXBlICVzIGRvZXMgbm90IHN1cHBvcnQgLS1lcnJvcndoZW5mdWxsLiIsIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQmFzaWMgc2VnbWVudCB0eXBlIHZhbGlkYXRpb24gZmluaXNoZWQgaGVyZSAqLworCisJaWYgKGFjdGl2YXRpb24oKSAmJiBscC0+c2VndHlwZS0+b3BzLT50YXJnZXRfcHJlc2VudCkgeworCQlpZiAoIWxwLT5zZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KGNtZCwgTlVMTCwgJmxwLT50YXJnZXRfYXR0cikpIHsKKwkJCWxvZ19lcnJvcigiJXM6IFJlcXVpcmVkIGRldmljZS1tYXBwZXIgdGFyZ2V0KHMpIG5vdCBkZXRlY3RlZCBpbiB5b3VyIGtlcm5lbC4iLAorCQkJCSAgbHAtPnNlZ3R5cGUtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoc2VndHlwZV9pc19hbnlfcmFpZDAobHAtPnNlZ3R5cGUpICYmCisJCSAgICAhKGxwLT50YXJnZXRfYXR0ciAmIFJBSURfRkVBVFVSRV9SQUlEMCkpIHsKKwkJCWxvZ19lcnJvcigiUkFJRCBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBSQUlEMC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHNlZ3R5cGVfaXNfcmFpZDEwKGxwLT5zZWd0eXBlKSAmJiAhKGxwLT50YXJnZXRfYXR0ciAmIFJBSURfRkVBVFVSRV9SQUlEMTApKSB7CisJCQlsb2dfZXJyb3IoIlJBSUQgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUkFJRDEwLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBTaG91bGQgd2UgemVyby93aXBlIHNpZ25hdHVyZXMgb24gdGhlIGx2LCBkZWZhdWx0IHRvICd5JyAqLworCWxwLT56ZXJvID0gYXJnX2ludF92YWx1ZShjbWQsIHplcm9fQVJHLCAxKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgd2lwZXNpZ25hdHVyZXNfQVJHKSkgeworCQkvKiBJZiAtVy8tLXdpcGVzaWduYXR1cmVzIGlzIGdpdmVuIG9uIGNvbW1hbmQgbGluZSBkaXJlY3RseSwgcmVzcGVjdCBpdC4gKi8KKwkJbHAtPndpcGVfc2lnbmF0dXJlcyA9IGFyZ19pbnRfdmFsdWUoY21kLCB3aXBlc2lnbmF0dXJlc19BUkcsIDEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIC1XLy0td2lwZXNpZ25hdHVyZXMgaXMgbm90IGdpdmVuIG9uIGNvbW1hbmQgbGluZSwKKwkJICogbG9vayBhdCB0aGUgYWxsb2NhdGlvbi93aXBlX3NpZ25hdHVyZXNfd2hlbl96ZXJvaW5nX25ld19sdnMKKwkJICogdG8gZGVjaWRlIHdoYXQgc2hvdWxkIGJlIGRvbmUgZXhhY3RseS4KKwkJICovCisJCWlmIChmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBhbGxvY2F0aW9uX3dpcGVfc2lnbmF0dXJlc193aGVuX3plcm9pbmdfbmV3X2x2c19DRkcsIE5VTEwpKQorCQkJbHAtPndpcGVfc2lnbmF0dXJlcyA9IGxwLT56ZXJvOworCQllbHNlCisJCQlscC0+d2lwZV9zaWduYXR1cmVzID0gMDsKKwl9CisKKwlpZiAoIV9sdmNyZWF0ZV9uYW1lX3BhcmFtcyhjbWQsICZhcmdjLCAmYXJndiwgbHApIHx8CisJICAgICFfcmVhZF9zaXplX3BhcmFtcyhjbWQsIGxwLCBsY3ApIHx8CisJICAgICFnZXRfc3RyaXBlX3BhcmFtcyhjbWQsICZscC0+c3RyaXBlcywgJmxwLT5zdHJpcGVfc2l6ZSkgfHwKKwkgICAgKGxwLT5jcmVhdGVfcG9vbCAmJgorCSAgICAgIWdldF9wb29sX3BhcmFtcyhjbWQsIGxwLT5zZWd0eXBlLCAmbHAtPnBhc3NlZF9hcmdzLAorCQkJICAgICAgJmxwLT5wb29sX21ldGFkYXRhX3NpemUsICZscC0+cG9vbF9tZXRhZGF0YV9zcGFyZSwKKwkJCSAgICAgICZscC0+Y2h1bmtfc2l6ZSwgJmxwLT5kaXNjYXJkcywgJmxwLT56ZXJvKSkgfHwKKwkgICAgIV9yZWFkX2NhY2hlX3BhcmFtcyhjbWQsIGxwKSB8fAorCSAgICAhX3JlYWRfbWlycm9yX2FuZF9yYWlkX3BhcmFtcyhjbWQsIGxwKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAob25seV9saW5lYXIgJiYgbHAtPnN0cmlwZXMgPiAxKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSBzdHJpcGVzIHdpdGggbGluZWFyIHR5cGUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChscC0+c25hcHNob3QgJiYgKGxwLT5leHRlbnRzIHx8IGxjcC0+c2l6ZSkpIHsKKwkJbHAtPmNodW5rX3NpemUgPSBhcmdfdWludF92YWx1ZShjbWQsIGNodW5rc2l6ZV9BUkcsIDgpOworCQlpZiAobHAtPmNodW5rX3NpemUgPCA4IHx8IGxwLT5jaHVua19zaXplID4gMTAyNCB8fAorCQkgICAgIWlzX3Bvd2VyX29mXzIobHAtPmNodW5rX3NpemUpKSB7CisJCQlsb2dfZXJyb3IoIkNodW5rIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlICIKKwkJCQkgICJyYW5nZSA0SyB0byA1MTJLLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9nX3ZlcmJvc2UoIlNldHRpbmcgY2h1bmtzaXplIHRvICVzLiIsIGRpc3BsYXlfc2l6ZShjbWQsIGxwLT5jaHVua19zaXplKSk7CisJfQorCisJLyogQWxsb2NhdGlvbiBwYXJhbWV0ZXJzICovCisJY29udGlndW91cyA9IGFyZ19pbnRfdmFsdWUoY21kLCBjb250aWd1b3VzX0FSRywgMCk7CisJbHAtPmFsbG9jID0gY29udGlndW91cyA/IEFMTE9DX0NPTlRJR1VPVVMgOiBBTExPQ19JTkhFUklUOworCWxwLT5hbGxvYyA9IChhbGxvY19wb2xpY3lfdCkgYXJnX3VpbnRfdmFsdWUoY21kLCBhbGxvY19BUkcsIGxwLT5hbGxvYyk7CisKKwlpZiAoY29udGlndW91cyAmJiAobHAtPmFsbG9jICE9IEFMTE9DX0NPTlRJR1VPVVMpKSB7CisJCWxvZ19lcnJvcigiQ29uZmxpY3RpbmcgY29udGlndW91cyBhbmQgYWxsb2MgYXJndW1lbnRzLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoY3VycmVudF9ncm91cCwgJmNtZC0+YXJnX3ZhbHVlX2dyb3VwcykgeworCQlpZiAoIWdyb3VwZWRfYXJnX2lzX3NldChjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBhZGR0YWdfQVJHKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKHRhZyA9IGdyb3VwZWRfYXJnX3N0cl92YWx1ZShjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBhZGR0YWdfQVJHLCBOVUxMKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCB0YWcuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bWVtLCAmbHAtPnRhZ3MsIHRhZykpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGFnICVzLiIsIHRhZyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWxjcC0+cHZfY291bnQgPSBhcmdjOworCWxjcC0+cHZzID0gYXJndjsKKworCXJldHVybiAxOworfQorCisvKgorICogX2RldGVybWluZV9jYWNoZV9hcmd1bWVudAorICogQHZnCisgKiBAbHAKKyAqCisgKiAnbHAtPnBvb2xfbmFtZScgaXMgc2V0IHdpdGggYW4gTFYgdGhhdCBjb3VsZCBiZSBlaXRoZXIgdGhlIGNhY2hlX3Bvb2wgbmFtZQorICogb3IgdGhlIG9yaWdpbiBuYW1lIG9mIHRoZSBjYWNoZWQgTFYgd2hpY2ggaXMgYmVpbmcgY3JlYXRlZC4KKyAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGljaCBpdCBpcyBhbmQgc2V0cyAnbHAtPm9yaWdpbl9uYW1lJyBvcgorICogJ2xwLT5wb29sX25hbWUnIGFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyBpbnQgX2RldGVybWluZV9jYWNoZV9hcmd1bWVudChzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gdmctPmNtZDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCisJaWYgKCFscC0+cG9vbF9uYW1lKSB7CisJCWxwLT5wb29sX25hbWUgPSBscC0+bHZfbmFtZTsKKwl9IGVsc2UgaWYgKChsdiA9IGZpbmRfbHYodmcsIGxwLT5wb29sX25hbWUpKSAmJiBsdl9pc19jYWNoZV9wb29sKGx2KSkgeworCQlpZiAoIXZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9wb29sKGx2KSkKKwkJCXJldHVybl8wOworCQkvKiBQb29sIGV4aXN0cywgY3JlYXRlIGNhY2hlIHZvbHVtZSAqLworCQlscC0+Y3JlYXRlX3Bvb2wgPSAwOworCQlscC0+b3JpZ2luX25hbWUgPSBOVUxMOworCQkvKiBJZiBjYWNoZSBhcmdzIG5vdCBnaXZlbiwgdXNlIHRob3NlIGZyb20gY2FjaGUgcG9vbCAqLworCQlpZiAoIWFyZ19pc19zZXQoY21kLCBjaHVua3NpemVfQVJHKSkKKwkJCWxwLT5jaHVua19zaXplID0gZmlyc3Rfc2VnKGx2KS0+Y2h1bmtfc2l6ZTsKKwl9IGVsc2UgaWYgKGx2KSB7CisJCS8qIE9yaWdpbiBleGlzdHMsIGNyZWF0ZSBjYWNoZSBwb29sIHZvbHVtZSAqLworCQlpZiAoIXZhbGlkYXRlX2x2X2NhY2hlX2NyZWF0ZV9vcmlnaW4obHYpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBwZXJtaXNzaW9uX0FSRykgJiYKKwkJICAgICgobHAtPnBlcm1pc3Npb24gJiBMVk1fV1JJVEUpICE9IChsdi0+c3RhdHVzICYgTFZNX1dSSVRFKSkpIHsKKwkJCS8qIFJldmVydGluZyBwZXJtaXNzaW9ucyBvbiBhbGwgZXJyb3IgcGF0aCBpcyB2ZXJ5IGNvbXBsaWNhdGVkICovCisJCQlsb2dfZXJyb3IoIkNoYW5nZSBvZiB2b2x1bWUgcGVybWlzc2lvbiBpcyB1bnN1cHBvcnRlZCB3aXRoIGNhY2hlIGNvbnZlcnNpb24sIHVzZSBsdmNoYW5nZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEZJWE1FIEhvdyB0byBoYW5kbGUgc2tpcCBmbGFnPyAqLworCQlpZiAoYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgdW5zdXBwb3J0ZWQgd2l0aCBjYWNoZSBjb252ZXJzaW9uIiwKKwkJCQkJIHN0cmlwZXNfQVJHLAorCQkJCQkgc3RyaXBlc2l6ZV9BUkcsCisJCQkJCSBzZXRhY3RpdmF0aW9uc2tpcF9BUkcsCisJCQkJCSBpZ25vcmVhY3RpdmF0aW9uc2tpcF9BUkcsCisJCQkJCSAtMSkpCisJCQlyZXR1cm5fMDsgLyogRklYTUUgKi8KKworCQkvKiBQdXQgb3JpZ2luIGludG8gcmVzdWx0aW5nIGFjdGl2YXRpb24gc3RhdGUgZmlyc3QgKi8KKwkJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKGxwLT5hY3RpdmF0ZSkpIHsKKwkJCWlmICgobHAtPmFjdGl2YXRlID09IENIQU5HRV9BQVkpICYmCisJCQkgICAgIWx2X3Bhc3Nlc19hdXRvX2FjdGl2YXRpb25fZmlsdGVyKGNtZCwgbHYpKSB7CisJCQkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIGFjdGl2YXRpb24gb2YgY2FjaGUgb3JpZ2luICVzLiIsCisJCQkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmICghYWN0aXZhdGVfbHZfZXhjbF9sb2NhbChjbWQsIGx2KSkgeworCQkJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIGNhY2hlIG9yaWdpbiAlcy4iLAorCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSBpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdikpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IGRlYWN0aXZhdGUgYWN0aXZhdGUgY2FjaGUgb3JpZ2luICVzLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBscC0+b3JpZ2luX25hbWUgaXMgYWxyZWFkeSBlcXVhbCB0byBscC0+cG9vbF9uYW1lICovCisJCWxwLT5wb29sX25hbWUgPSBscC0+bHZfbmFtZTsgLyogLS1uYW1lIGlzIGNhY2hlIHBvb2wgbmFtZSAqLworCQkvKiAgTm8gemVyb2luZyBvZiBhbiBleGlzdGluZyBvcmlnaW4hICovCisJCWxwLT56ZXJvID0gbHAtPndpcGVfc2lnbmF0dXJlcyA9IDA7CisJfSBlbHNlIHsKKwkJLyogQ2FjaGUgcG9vbCBhbmQgY2FjaGUgdm9sdW1lIG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KKwkJbHAtPm9yaWdpbl9uYW1lID0gTlVMTDsKKwkJLyogLS1wb29sZGF0YXNpemUgaXMgbmVlZGVkIGhlcmUgKi8KKwkJbG9nX2Vycm9yKCJBbWJpZ3VvdXMgc3ludGF4LCBwbGVhc2UgY3JlYXRlIC0tdHlwZSBjYWNoZS1wb29sICVzIHNlcGFyYXRlbHkuIiwKKwkJCSAgbHAtPnBvb2xfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogTm9ybWFsIHNuYXBzaG90IG9yIHRoaW5seS1wcm92aXNpb25lZCBzbmFwc2hvdD8KKyAqLworc3RhdGljIGludCBfZGV0ZXJtaW5lX3NuYXBzaG90X3R5cGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJICAgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLAorCQkJCSAgICBzdHJ1Y3QgbHZjcmVhdGVfY21kbGluZV9wYXJhbXMgKmxjcCkKK3sKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm9yaWdpbl9sdiwgKnBvb2xfbHYgPSBOVUxMOworCisJaWYgKCEob3JpZ2luX2x2ID0gZmluZF9sdih2ZywgbHAtPm9yaWdpbl9uYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJTbmFwc2hvdCBvcmlnaW4gTFYgJXMgbm90IGZvdW5kIGluIFZvbHVtZSBncm91cCAlcy4iLAorCQkJICBscC0+b3JpZ2luX25hbWUsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChscC0+ZXh0ZW50cyB8fCBsY3AtPnNpemUpCisJCXJldHVybiAxOyAvKiBTaXplIHNwZWNpZmllZCAqLworCisJLyogQ2hlY2sgaWYgd2UgY291bGQgbWFrZSB0aGluIHNuYXBzaG90ICovCisJaWYgKGxwLT5wb29sX25hbWUpIHsKKwkJaWYgKCEocG9vbF9sdiA9IGZpbmRfbHYodmcsIGxwLT5wb29sX25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJUaGluIHBvb2wgdm9sdW1lICVzIG5vdCBmb3VuZCBpbiBWb2x1bWUgZ3JvdXAgJXMuIiwKKwkJCQkgIGxwLT5wb29sX25hbWUsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFsdl9pc190aGluX3Bvb2wocG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm90IGEgdGhpbiBwb29sIHZvbHVtZS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUocG9vbF9sdikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWx2X2lzX3RoaW5fdm9sdW1lKG9yaWdpbl9sdikpIHsKKwkJCWlmICghc2VnX2lzX3RoaW4obHApKQorCQkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHNpemUgb3IgZXh0ZW50cyB3aXRoIHNuYXBzaG90cy4iKTsKKwkJCWVsc2UKKwkJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIG5vdCBhIHRoaW4gdm9sdW1lLiAiCisJCQkJCSAgIlRoaW4gc25hcHNob3Qgc3VwcG9ydHMgb25seSB0aGluIG9yaWdpbnMuIiwKKwkJCQkJICBkaXNwbGF5X2x2bmFtZShvcmlnaW5fbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIE9yaWdpbiB0aGluIHZvbHVtZSB3aXRob3V0IHNpemUgbWFrZXMgdGhpbiBzZWdtZW50ICovCisJCWxwLT5wb29sX25hbWUgPSBmaXJzdF9zZWcob3JpZ2luX2x2KS0+cG9vbF9sdi0+bmFtZTsKKwl9CisKKwlsb2dfZGVidWdfbWV0YWRhdGEoIlN3aXRjaGluZyBmcm9tIHNuYXBzaG90IHRvIHRoaW4gc2VnbWVudCB0eXBlLiIpOworCWlmICghKGxwLT5zZWd0eXBlID0gZ2V0X3NlZ3R5cGVfZnJvbV9zdHJpbmcodmctPmNtZCwgU0VHX1RZUEVfTkFNRV9USElOKSkpCisJCXJldHVybl8wOworCWxwLT5zbmFwc2hvdCA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfcmFpZF9wYXJhbWV0ZXJzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgc3RydWN0IGx2Y3JlYXRlX3BhcmFtcyAqbHAsCisJCQkJICBzdHJ1Y3QgbHZjcmVhdGVfY21kbGluZV9wYXJhbXMgKmxjcCkKK3sKKwl1bnNpZ25lZCBkZXZzID0gbGNwLT5wdl9jb3VudCA/IDogZG1fbGlzdF9zaXplKCZ2Zy0+cHZzKTsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCA9IHZnLT5jbWQ7CisJaW50IG9sZF9zdHJpcGVzID0gIWFyZ19pc19zZXQoY21kLCBzdHJpcGVzX0FSRykgJiYKKwkJCSAgZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgYWxsb2NhdGlvbl9yYWlkX3N0cmlwZV9hbGxfZGV2aWNlc19DRkcsIE5VTEwpOworCisJLyoKKwkgKiBJZiB3ZSByZXF1ZXN0ZWQgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBieSBzZXR0aW5nCisJICogImFsbG9jYXRpb24vcmFpZF9zdHJpcGVfYWxsX2RldmljZXMgPSAxIiBhbmQgdGhlCisJICogbnVtYmVyIG9mIGRldmljZXMgd2FzIG5vdCBzdXBwbGllZCwgd2UgY2FuIGluZmVyCisJICogZnJvbSB0aGUgUFZzIGdpdmVuLgorCSAqLworCWlmIChvbGRfc3RyaXBlcyAmJiBzZWdfaXNfcmFpZChscCkgJiYgIXNlZ19pc19yYWlkMShscCkpCisJCWxwLT5zdHJpcGVzID0gZGV2czsKKworCWlmIChzZWdfaXNfcmFpZDEwKGxwKSkgeworCQlscC0+c3RyaXBlcyAvPSBscC0+bWlycm9yczsKKworCQlpZiAobHAtPnN0cmlwZXMgPCAyKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgUkFJRCgxKTAgTFY6ICIKKwkJCQkgICJpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGRldmljZXMuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJfSBlbHNlIGlmICghc2VnX2lzX21pcnJvcmVkKGxwKSkgeworCQlpZiAob2xkX3N0cmlwZXMgJiYKKwkJICAgIGxwLT5zZWd0eXBlLT5wYXJpdHlfZGV2cyAmJgorCQkgICAgZGV2cyA+IDIgKiBscC0+c2VndHlwZS0+cGFyaXR5X2RldnMpCisJCQlscC0+c3RyaXBlcyAtPSBscC0+c2VndHlwZS0+cGFyaXR5X2RldnM7CisKKwkJaWYgKHNlZ19pc19hbnlfcmFpZDAobHApKSB7CisJCQlpZiAobHAtPnN0cmlwZXMgPCAyKSB7CisJCQkJbG9nX2Vycm9yKCJTZWdtZW50IHR5cGUgJ3JhaWQwJyByZXF1aXJlcyAyIG9yIG1vcmUgc3RyaXBlcy4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChscC0+c3RyaXBlcyA8PSBscC0+c2VndHlwZS0+cGFyaXR5X2RldnMpIHsKKwkJCWxvZ19lcnJvcigiTnVtYmVyIG9mIHN0cmlwZXMgbXVzdCBiZSBhdCBsZWFzdCAlZCBmb3IgJXMiLAorCQkJCSAgbHAtPnNlZ3R5cGUtPnBhcml0eV9kZXZzICsgMSwKKwkJCQkgIGxwLT5zZWd0eXBlLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qICdtaXJyb3JzJyBkZWZhdWx0cyB0byAyIC0gbm90IHRoZSBudW1iZXIgb2YgUFZzIHN1cHBsaWVkICovCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY2hlY2tfdGhpbl9wYXJhbWV0ZXJzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCwKKwkJCQkgIHN0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyAqbGNwKQoreworCWlmIChzZWdfaXNfdGhpbl92b2x1bWUobHApICYmIGxwLT5zbmFwc2hvdCkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBlaXRoZXIgY3JlYXRlIHNuYXBzaG90IG9yIHRoaW4gdm9sdW1lLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXNlZ19pc190aGluX3ZvbHVtZShscCkgJiYgIWxwLT5zbmFwc2hvdCkgeworCQlpZiAoIWxwLT5jcmVhdGVfcG9vbCkgeworCQkJLyogTm90IGV2ZW4gY3JlYXRpbmcgdGhpbiBwb29sPyAqLworCQkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBkZXZpY2Ugc2l6ZShzKS4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmICghbHAtPmNyZWF0ZV9wb29sKSB7CisJCWlmIChhcmdfZnJvbV9saXN0X2lzX3NldCh2Zy0+Y21kLCAiaXMgb25seSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZyB0aGluIHBvb2wiLAorCQkJCQkgYWxsb2NfQVJHLAorCQkJCQkgY2h1bmtzaXplX0FSRywKKwkJCQkJIGNvbnRpZ3VvdXNfQVJHLAorCQkJCQkgc3RyaXBlc19BUkcsCisJCQkJCSB6ZXJvX0FSRywKKwkJCQkJIC0xKSkKKwkJCXJldHVybl8wOworCisJCWlmIChsY3AtPnB2X2NvdW50KSB7CisJCQlsb2dfZXJyb3IoIk9ubHkgc3BlY2lmeSBQaHlzaWNhbCB2b2x1bWVzIHdoZW4gYWxsb2NhdGluZyB0aGluIHBvb2wuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jaGVja19wb29sX3BhcmFtZXRlcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwLAorCQkJCSAgc3RydWN0IGx2Y3JlYXRlX2NtZGxpbmVfcGFyYW1zICpsY3ApCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpwb29sX2x2OworCisJaWYgKCFscC0+Y3JlYXRlX3Bvb2wgJiYKKwkgICAgYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCAiaXMgb25seSBhdmFpbGFibGUgd2l0aCBwb29scyIsCisJCQkJIFBPT0xfQVJHUywKKwkJCQkgZGlzY2FyZHNfQVJHLAorCQkJCSAtMSkpCisJCXJldHVybl8wOworCisJaWYgKCFzZWdfaXNfY2FjaGUobHApICYmCisJICAgICFzZWdfaXNfdGhpbl92b2x1bWUobHApICYmCisJICAgICFzZWdfaXNfcG9vbChscCkpIHsKKwkJaWYgKGxwLT5wb29sX25hbWUgJiYgIWxwLT5zbmFwc2hvdCkgeworCQkJbG9nX2Vycm9yKCJTZWdtZW50IHR5cGUgJXMgY2Fubm90IHVzZSBwb29sICVzLiIsCisJCQkJICBscC0+c2VndHlwZS0+bmFtZSwgbHAtPnBvb2xfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsgLyogUG9vbCB1bnJlbGF0ZWQgdHlwZXMgKi8KKwl9CisKKwlpZiAobHAtPmNyZWF0ZV9wb29sKSB7CisJCS8qIEdpdmVuIHBvb2wgbmFtZSBuZWVkcyB0byBmb2xsb3cgcmVzdHJpY3Rpb25zIGZvciBjcmVhdGVkIExWICovCisJCWlmIChscC0+cG9vbF9uYW1lKSB7CisJCQlpZiAoIWFwcGx5X2x2bmFtZV9yZXN0cmljdGlvbnMobHAtPnBvb2xfbmFtZSkpCisJCQkJcmV0dXJuXzA7CisJCQkvKiBXZSBjb3VsZCBjaGVjayBleGlzdGFuY2Ugb25seSB3aGVuIHdlIGhhdmUgdmcgKi8KKwkJCWlmICh2ZyAmJiBmaW5kX2x2KHZnLCBscC0+cG9vbF9uYW1lKSkgeworCQkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgYWxyZWFkeSBleGlzdHMgaW4gVm9sdW1lIGdyb3VwICVzLiIsCisJCQkJCSAgbHAtPnBvb2xfbmFtZSwgdmctPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWlmIChzZWdfaXNfcG9vbChscCkpIHsKKwkJCWlmIChscC0+bWFqb3IgIT0gLTEgfHwgbHAtPm1pbm9yICE9IC0xKSB7CisJCQkJbG9nX2Vycm9yKCJQZXJzaXN0ZW50IG1ham9yIGFuZCBtaW5vciBudW1iZXJzIGFyZSB1bnN1cHBvcnRlZCB3aXRoIHBvb2xzLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogV2hlbiBjcmVhdGluZyBqdXN0IHBvb2wgdGhlIHBvb2xfbmFtZSBuZWVkcyB0byBiZSBpbiBsdl9uYW1lICovCisJCQlscC0+bHZfbmFtZSA9IGxwLT5wb29sX25hbWU7CisJCX0gZWxzZSBpZiAodmcpIHsKKwkJCS8qIEZJWE1FOiB3aGF0IGJldHRlciB0byBkbyB3aXRoIC0tcmVhZGFoZWFkIGFuZCBwb29scz8gKi8KKwkJCWlmIChhcmdfaXNfc2V0KGNtZCwgcmVhZGFoZWFkX0FSRykpIHsKKwkJCQlsb2dfZXJyb3IoIkFtYmlnb3VzIC0tcmVhZGFoZWFkIHBhcmFtZXRlciBzcGVjaWZpZWQuIFBsZWFzZSB1c2UgZWl0aGVyIHdpdGggcG9vbCBvciB2b2x1bWUuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlyZXR1cm4gMTsKKwl9CisJLyogTm90IGNyZWF0aW5nIG5ldyBwb29sLCBidXQgZXhpc3RpbmcgcG9vbCBpcyBuZWVkZWQgKi8KKwlpZiAoIWxwLT5wb29sX25hbWUpIHsKKwkJaWYgKGxwLT5zbmFwc2hvdCkKKwkJCS8qIFRha2luZyBzbmFwc2hvdCB2aWEgJ2x2Y3JlYXRlIC1UIHZnL29yaWdpbicgKi8KKwkJCXJldHVybiAxOworCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IG5hbWUgb2YgZXhpc3RpbmcgcG9vbC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZnKSB7CisJCS8qIFZhbGlkYXRlIHBvb2wgaGFzIG1hdGNoaW5nIHR5cGUgKi8KKwkJaWYgKCEocG9vbF9sdiA9IGZpbmRfbHYodmcsIGxwLT5wb29sX25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJQb29sICVzIG5vdCBmb3VuZCBpbiBWb2x1bWUgZ3JvdXAgJXMuIiwKKwkJCQkgIGxwLT5wb29sX25hbWUsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzZWdfaXNfY2FjaGUobHApICYmICFsdl9pc19jYWNoZV9wb29sKHBvb2xfbHYpKSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIGlzIG5vdCBhIGNhY2hlIHBvb2wuIiwKKwkJCQkgIGRpc3BsYXlfbHZuYW1lKHBvb2xfbHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzZWdfaXNfdGhpbl92b2x1bWUobHApICYmICFsdl9pc190aGluX3Bvb2wocG9vbF9sdikpIHsKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgaXMgbm90IGEgdGhpbiBwb29sLiIsCisJCQkJICBkaXNwbGF5X2x2bmFtZShwb29sX2x2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgemVyb19BUkcgd2l0aCBkZWZhdWx0IHZhbHVlIHNldCB0byB2YWx1ZSBvZiB3aXBlc2lnbmF0dXJlc19BUkcKKyAqIHdpdGggaXRzIGRlZmF1bHQgc2V0IHRvICduJy4gU28gaWYgdXNlciBzcGVjaWZpZXMgb24gY29tbWFuZCBsaW5lIGVpdGhlcgorICogLVp5IG9yIC1XeSBpdCB3aWxsIGNoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucyB3aWxsIHJlcG9ydCBlcnJvciB0aGVuLgorICoKKyAqIENhdGNoaW5nIGNhc2VzIGxpa2Ugd2UgY2Fubm90IGZ1bGZpbGw6CisgKiAgIGx2Y3JlYXRlIFstYW5dWy1wcl1bLWFheV1bLWt5XSAgWy1aeV1bLVd5XQorICovCitzdGF0aWMgaW50IF9jaGVja196ZXJvX3BhcmFtZXRlcnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgKmxwKQoreworCWNoYXIgYnVmW05BTUVfTEVOICsgMTI4XTsKKworCS8qIC1aIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgdGhpbnMgKi8KKwlpZiAoc2VnX2lzX3RoaW4obHApKQorCQlyZXR1cm4gMTsKKworCS8qIElmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSwgYnVmZmVyIHdpbGwgbm90IGJlIGVtcHR5ICovCisJaWYgKGRtX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyVzJXMlcyVzJXMlcyIsCisJCQlscC0+b3JpZ2luX25hbWUgPyAib3JpZ2luICIgOiAiIiwKKwkJCWxwLT5vcmlnaW5fbmFtZSA/IDogIiIsCisJCQlscC0+b3JpZ2luX25hbWUgPyAiICIgOiAiIiwKKwkJCSEobHAtPnBlcm1pc3Npb24gJiBMVk1fV1JJVEUpID8gInJlYWQtb25seSAiIDogIiIsCisJCQkhaXNfY2hhbmdlX2FjdGl2YXRpbmcobHAtPmFjdGl2YXRlKSA/ICJpbmFjdGl2ZSAiIDogIiIsCisJCQkobHAtPmFjdGl2YXRlID09IENIQU5HRV9BQVkpID8gImF1dG8gYWN0aXZhdGVkICIgOiAiIiwKKwkJCSgobHAtPmFjdGl2YXRpb25fc2tpcCAmIEFDVElWQVRJT05fU0tJUF9TRVRfRU5BQkxFRCkgJiYKKwkJCSAhKGxwLT5hY3RpdmF0aW9uX3NraXAgJiBBQ1RJVkFUSU9OX1NLSVBfSUdOT1JFKSkKKwkJCT8gInNraXBwZWQgZnJvbSBhY3RpdmF0aW9uICIgOiAiIikgPCAwKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiQnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgZG1fc25wcmludGYoKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGJ1ZlswXSB8fCAobHAtPnNlZ3R5cGUtPmZsYWdzICYgU0VHX0NBTk5PVF9CRV9aRVJPRUQpKSB7CisJCS8qIEZvdW5kIGNvbmRpdGlvbiB0aGF0IHByZXZlbnRzIHplcm9pbmcgKi8KKwkJaWYgKGFyZ19pbnRfdmFsdWUoY21kLCB6ZXJvX0FSRywgYXJnX2ludF92YWx1ZShjbWQsIHdpcGVzaWduYXR1cmVzX0FSRywgMCkpKSB7CisJCQlpZiAoIShscC0+c2VndHlwZS0+ZmxhZ3MgJiBTRUdfQ0FOTk9UX0JFX1pFUk9FRCkpIHsKKwkJCQlsb2dfZXJyb3IoIkNhbm5vdCB6ZXJvICVzbG9naWNhbCB2b2x1bWUgd2l0aCBvcHRpb24gLVp5IG9yIC1XeS4iLCBidWYpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIklnbm9yaW5nIG9wdGlvbiAtWnkgb3IgLVd5IGZvciB1bnplcm9hYmxlICVzIHZvbHVtZS4iLAorCQkJCQkJbHAtPnNlZ3R5cGUtPm5hbWUpOworCQl9CisJCWxwLT56ZXJvID0gbHAtPndpcGVfc2lnbmF0dXJlcyA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEVuc3VyZSB0aGUgc2V0IG9mIHRoaW4gcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGlzIGNvbnNpc3RlbnQuCisgKi8KK3N0YXRpYyBpbnQgX3ZhbGlkYXRlX2ludGVybmFsX3RoaW5fcHJvY2Vzc2luZyhjb25zdCBzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCkKK3sKKwlpbnQgciA9IDE7CisKKwkvKgorCSAgIFRoZSBmaW5hbCBzdGF0ZSBzaG91bGQgYmUgb25lIG9mOgorCSAgIHRoaW4gIGNyZWF0ZV9wb29sICBzbmFwc2hvdCAgIG9yaWdpbiAgIHBvb2wKKwkgICAgIDEgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAwICAgICAgeS9uICAgIC0gY3JlYXRlIG5ldyBwb29sIGFuZCBhIHRoaW4gTFYgaW4gaXQKKwkgICAgIDEgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAwICAgICAgeSAgICAgIC0gY3JlYXRlIG5ldyB0aGluIExWIGluIGV4aXN0aW5nIHBvb2wKKwkgICAgIDAgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAwICAgICAgeS9uICAgIC0gY3JlYXRlIG5ldyBwb29sIG9ubHkKKwkgICAgIDEgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAxICAgICAgeSAgICAgIC0gY3JlYXRlIHRoaW4gc25hcHNob3Qgb2YgZXhpc3RpbmcgdGhpbiBMVgorCSovCisKKwlpZiAoIWxwLT5jcmVhdGVfcG9vbCAmJiAhbHAtPnBvb2xfbmFtZSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIi0tdGhpbnBvb2wgbm90IGlkZW50aWZpZWQuIik7CisJCXIgPSAwOworCX0KKworCWlmICgoIWxwLT5vcmlnaW5fbmFtZSAmJiBscC0+c25hcHNob3QpIHx8CisJICAgIChscC0+b3JpZ2luX25hbWUgJiYgIWxwLT5zbmFwc2hvdCAmJiAhc2VnX2lzX3RoaW5fdm9sdW1lKGxwKSkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJJbmNvbnNpc3RlbnQgc25hcHNob3QgYW5kIG9yaWdpbiBwYXJhbWV0ZXJzIGlkZW50aWZpZWQuIik7CisJCXIgPSAwOworCX0KKworCWlmICghbHAtPmNyZWF0ZV9wb29sICYmICFscC0+c25hcHNob3QgJiYgIXNlZ19pc190aGluX3ZvbHVtZShscCkpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJGYWlsZWQgdG8gaWRlbnRpZnkgd2hhdCB0eXBlIG9mIHRoaW4gdGFyZ2V0IHRvIHVzZS4iKTsKKwkJciA9IDA7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9kZXN0cm95X2x2Y3JlYXRlX3BhcmFtcyhzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCkKK3sKKwlpZiAobHAtPnBvbGljeV9zZXR0aW5ncykgeworCQlkbV9jb25maWdfZGVzdHJveShscC0+cG9saWN5X3NldHRpbmdzKTsKKwkJbHAtPnBvbGljeV9zZXR0aW5ncyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9sdmNyZWF0ZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBwcm9jZXNzaW5nX3BhcmFtcyAqcHAgPSAoc3RydWN0IHByb2Nlc3NpbmdfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlzdHJ1Y3QgbHZjcmVhdGVfcGFyYW1zICpscCA9IHBwLT5scDsKKwlzdHJ1Y3QgbHZjcmVhdGVfY21kbGluZV9wYXJhbXMgKmxjcCA9IHBwLT5sY3A7CisJaW50IHJldCA9IEVDTURfRkFJTEVEOworCisJaWYgKCFfcmVhZF9hY3RpdmF0aW9uX3BhcmFtcyhjbWQsIHZnLCBscCkpCisJCWdvdG9fb3V0OworCisJLyogUmVzb2x2ZSBzZWdtZW50IHR5cGVzIHdpdGggb3BlbmVkIFZHICovCisJaWYgKGxwLT5zbmFwc2hvdCAmJiBscC0+b3JpZ2luX25hbWUgJiYgIV9kZXRlcm1pbmVfc25hcHNob3RfdHlwZSh2ZywgbHAsIGxjcCkpCisJCWdvdG9fb3V0OworCisJaWYgKHNlZ19pc19jYWNoZShscCkgJiYgIV9kZXRlcm1pbmVfY2FjaGVfYXJndW1lbnQodmcsIGxwKSkKKwkJZ290b19vdXQ7CisKKwkvKiBBbGwgdHlwZXMgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludCwgbm93IG9ubHkgdmFsaWRhdGlvbiBzdGVwcyAqLworCWlmIChzZWdfaXNfcmFpZChscCkgJiYgIV9jaGVja19yYWlkX3BhcmFtZXRlcnModmcsIGxwLCBsY3ApKQorCQlnb3RvX291dDsKKworCWlmIChzZWdfaXNfdGhpbihscCkgJiYgIV9jaGVja190aGluX3BhcmFtZXRlcnModmcsIGxwLCBsY3ApKQorCQlnb3RvX291dDsKKworCWlmICghX2NoZWNrX3Bvb2xfcGFyYW1ldGVycyhjbWQsIHZnLCBscCwgbGNwKSkKKwkJZ290b19vdXQ7CisKKwkvKiBBbGwgdHlwZXMgYXJlIGNoZWNrZWQgKi8KKwlpZiAoIV9jaGVja196ZXJvX3BhcmFtZXRlcnMoY21kLCBscCkpCisJCXJldHVybl8wOworCisJaWYgKCFfdXBkYXRlX2V4dGVudHNfcGFyYW1zKHZnLCBscCwgbGNwKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoc2VnX2lzX3RoaW4obHApICYmICFfdmFsaWRhdGVfaW50ZXJuYWxfdGhpbl9wcm9jZXNzaW5nKGxwKSkKKwkJZ290b19vdXQ7CisKKwlpZiAobHAtPmNyZWF0ZV9wb29sKSB7CisJCWlmICghaGFuZGxlX3Bvb2xfbWV0YWRhdGFfc3BhcmUodmcsIGxwLT5wb29sX21ldGFkYXRhX2V4dGVudHMsCisJCQkJCQlscC0+cHZoLCBscC0+cG9vbF9tZXRhZGF0YV9zcGFyZSkpCisJCQlnb3RvX291dDsKKworCQlsb2dfdmVyYm9zZSgiTWFraW5nIHBvb2wgJXMgaW4gVkcgJXMgdXNpbmcgc2VndHlwZSAlcyIsCisJCQkgICAgbHAtPnBvb2xfbmFtZSA/IDogIndpdGggZ2VuZXJhdGVkIG5hbWUiLCBscC0+dmdfbmFtZSwgbHAtPnNlZ3R5cGUtPm5hbWUpOworCX0KKworCWlmICh2Zy0+bG9ja190eXBlICYmICFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkgeworCQlpZiAoIWhhbmRsZV9zYW5sb2NrX2x2KGNtZCwgdmcpKSB7CisJCQlsb2dfZXJyb3IoIk5vIHNwYWNlIGZvciBzYW5sb2NrIGxvY2ssIGV4dGVuZCB0aGUgaW50ZXJuYWwgbHZtbG9jayBMVi4iKTsKKwkJCWdvdG9fb3V0OworCQl9CisJfQorCisJaWYgKHNlZ19pc190aGluX3ZvbHVtZShscCkpCisJCWxvZ192ZXJib3NlKCJNYWtpbmcgdGhpbiBMViAlcyBpbiBwb29sICVzIGluIFZHICVzJXMlcyB1c2luZyBzZWd0eXBlICVzIiwKKwkJCSAgICBscC0+bHZfbmFtZSA/IDogIndpdGggZ2VuZXJhdGVkIG5hbWUiLAorCQkJICAgIGxwLT5wb29sX25hbWUgPyA6ICJ3aXRoIGdlbmVyYXRlZCBuYW1lIiwgbHAtPnZnX25hbWUsCisJCQkgICAgbHAtPnNuYXBzaG90ID8gIiBhcyBzbmFwc2hvdCBvZiAiIDogIiIsCisJCQkgICAgbHAtPnNuYXBzaG90ID8gbHAtPm9yaWdpbl9uYW1lIDogIiIsIGxwLT5zZWd0eXBlLT5uYW1lKTsKKworCWlmIChpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKQorCQlscC0+bmVlZHNfbG9ja2RfaW5pdCA9IDE7CisKKwlpZiAoIWx2X2NyZWF0ZV9zaW5nbGUodmcsIGxwKSkKKwkJZ290b19vdXQ7CisKKwlyZXQgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbHZjcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IHByb2Nlc3NpbmdfcGFyYW1zIHBwOworCXN0cnVjdCBsdmNyZWF0ZV9wYXJhbXMgbHAgPSB7CisJCS5tYWpvciA9IC0xLAorCQkubWlub3IgPSAtMSwKKwl9OworCXN0cnVjdCBsdmNyZWF0ZV9jbWRsaW5lX3BhcmFtcyBsY3AgPSB7IDAgfTsKKwlpbnQgcmV0OworCisJaWYgKCFfbHZjcmVhdGVfcGFyYW1zKGNtZCwgYXJnYywgYXJndiwgJmxwLCAmbGNwKSkgeworCQlzdGFjazsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghX2NoZWNrX3Bvb2xfcGFyYW1ldGVycyhjbWQsIE5VTEwsICZscCwgJmxjcCkpIHsKKwkJc3RhY2s7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlwcC5scCA9ICZscDsKKwlwcC5sY3AgPSAmbGNwOworCisgICAgICAgIGlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9ICZwcDsKKworCXJldCA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIDAsIE5VTEwsIGxwLnZnX25hbWUsIE5VTEwsIFJFQURfRk9SX1VQREFURSwgMCwgaGFuZGxlLAorCQkJICAgICAgJl9sdmNyZWF0ZV9zaW5nbGUpOworCisJX2Rlc3Ryb3lfbHZjcmVhdGVfcGFyYW1zKCZscCk7CisJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2ZGlzcGxheS5jIGIvdG9vbHMvbHZkaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwYjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2ZGlzcGxheS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIGludCBfbHZkaXNwbGF5X3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworCWlmICghYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpICYmICFsdl9pc192aXNpYmxlKGx2KSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb2xvbl9BUkcpKQorCQlsdmRpc3BsYXlfY29sb25zKGx2KTsKKwllbHNlIHsKKwkJbHZkaXNwbGF5X2Z1bGwoY21kLCBsdiwgTlVMTCk7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgbWFwc19BUkcpKQorCQkJbHZkaXNwbGF5X3NlZ21lbnRzKGx2KTsKKwl9CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCBsdmRpc3BsYXkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNvbHVtbnNfQVJHKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIGNvbG9uX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIG1hcHNfQVJHKSkgeworCQkJbG9nX2Vycm9yKCJJbmNvbXBhdGlibGUgb3B0aW9ucyBzZWxlY3RlZCIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJCXJldHVybiBsdnMoY21kLCBhcmdjLCBhcmd2KTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFsaWduZWRfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgYmluYXJ5X0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIG5vaGVhZGluZ3NfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgb3B0aW9uc19BUkcpIHx8CisJICAgIGFyZ19pc19zZXQoY21kLCBzZXBhcmF0b3JfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgc29ydF9BUkcpIHx8CisJICAgIGFyZ19pc19zZXQoY21kLCB1bmJ1ZmZlcmVkX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJJbmNvbXBhdGlibGUgb3B0aW9ucyBzZWxlY3RlZC4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29sb25fQVJHKSAmJiBhcmdfaXNfc2V0KGNtZCwgbWFwc19BUkcpKSB7CisJCWxvZ19lcnJvcigiT3B0aW9ucyAtYyBhbmQgLW0gYXJlIGluY29tcGF0aWJsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCXJldHVybiBwcm9jZXNzX2VhY2hfbHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLCAwLCBOVUxMLCAmX2x2ZGlzcGxheV9zaW5nbGUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZleHRlbmQuYyBiL3Rvb2xzL2x2ZXh0ZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YmI5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2ZXh0ZW5kLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworaW50IGx2ZXh0ZW5kKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGx2cmVzaXplKGNtZCwgYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS90b29scy9sdm0tc3RhdGljLmMgYi90b29scy9sdm0tc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1ZjJmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2bS1zdGF0aWMuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworI2luY2x1ZGUgImx2bTJjbWRsaW5lLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbml0X2lzX3N0YXRpYygxKTsKKwlyZXR1cm4gbHZtMl9tYWluKGFyZ2MsIGFyZ3YpOworfQorCitpbnQgbHZtX3NoZWxsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICAgIHN0cnVjdCBjbWRsaW5lX2NvbnRleHQgKmNtZGxpbmUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9sdm0uYyBiL3Rvb2xzL2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2MxNDEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdm0uYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJsdm0yY21kbGluZS5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGx2bTJfbWFpbihhcmdjLCBhcmd2KTsKK30KKworI2lmZGVmIFJFQURMSU5FX1NVUFBPUlQKKworIyAgaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyMgIGluY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKyMgIGlmbmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fTUFUQ0hFUworIyAgICBkZWZpbmUgcmxfY29tcGxldGlvbl9tYXRjaGVzKGEsIGIpIGNvbXBsZXRpb25fbWF0Y2hlcygoY2hhciAqKWEsIGIpCisjICAgIGRlZmluZSBybF9jb21wbGV0aW9uX2Z1bmNfdCBDUFBGdW5jdGlvbgorIyAgZW5kaWYKKworc3RhdGljIHN0cnVjdCBjbWRsaW5lX2NvbnRleHQgKl9jbWRsaW5lOworCisvKiBMaXN0IG1hdGNoaW5nIGNvbW1hbmRzICovCitzdGF0aWMgY2hhciAqX2xpc3RfY21kcyhjb25zdCBjaGFyICp0ZXh0LCBpbnQgc3RhdGUpCit7CisJc3RhdGljIGludCBpID0gMDsKKwlzdGF0aWMgc2l6ZV90IGxlbiA9IDA7CisKKwkvKiBJbml0aWFsaXNlIGlmIHRoaXMgaXMgYSBuZXcgY29tcGxldGlvbiBhdHRlbXB0ICovCisJaWYgKCFzdGF0ZSkgeworCQlpID0gMDsKKwkJbGVuID0gc3RybGVuKHRleHQpOworCX0KKworCXdoaWxlIChpIDwgX2NtZGxpbmUtPm51bV9jb21tYW5kcykKKwkJaWYgKCFzdHJuY21wKHRleHQsIF9jbWRsaW5lLT5jb21tYW5kc1tpKytdLm5hbWUsIGxlbikpCisJCQlyZXR1cm4gc3RyZHVwKF9jbWRsaW5lLT5jb21tYW5kc1tpIC0gMV0ubmFtZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogTGlzdCBtYXRjaGluZyBhcmd1bWVudHMgKi8KK3N0YXRpYyBjaGFyICpfbGlzdF9hcmdzKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGF0ZSkKK3sKKwlzdGF0aWMgaW50IG1hdGNoX25vID0gMDsKKwlzdGF0aWMgc2l6ZV90IGxlbiA9IDA7CisJc3RhdGljIHN0cnVjdCBjb21tYW5kICpjb207CisKKwkvKiBJbml0aWFsaXNlIGlmIHRoaXMgaXMgYSBuZXcgY29tcGxldGlvbiBhdHRlbXB0ICovCisJaWYgKCFzdGF0ZSkgeworCQljaGFyICpzID0gcmxfbGluZV9idWZmZXI7CisJCWludCBqOworCisJCW1hdGNoX25vID0gMDsKKwkJY29tID0gTlVMTDsKKwkJbGVuID0gc3RybGVuKHRleHQpOworCisJCS8qIEZpbmQgc3RhcnQgb2YgZmlyc3Qgd29yZCBpbiBsaW5lIGJ1ZmZlciAqLworCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQlzKys7CisKKwkJLyogTG9vayBmb3Igd29yZCBpbiBsaXN0IG9mIGNvbW1hbmRzICovCisJCWZvciAoaiA9IDA7IGogPCBfY21kbGluZS0+bnVtX2NvbW1hbmRzOyBqKyspIHsKKwkJCWNvbnN0IGNoYXIgKnA7CisJCQljaGFyICpxID0gczsKKworCQkJcCA9IF9jbWRsaW5lLT5jb21tYW5kc1tqXS5uYW1lOworCQkJd2hpbGUgKCpwID09ICpxKSB7CisJCQkJcCsrOworCQkJCXErKzsKKwkJCX0KKwkJCWlmICgoISpwKSAmJiAqcSA9PSAnICcpIHsKKwkJCQljb20gPSBfY21kbGluZS0+Y29tbWFuZHMgKyBqOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFjb20pCisJCXJldHVybiBOVUxMOworCisJLyogU2hvcnQgZm9ybSBhcmd1bWVudHMgKi8KKwlpZiAobGVuIDwgMykgeworCQl3aGlsZSAobWF0Y2hfbm8gPCBjb20tPm51bV9hcmdzKSB7CisJCQljaGFyIHNbM107CisJCQljaGFyIGM7CisJCQlpZiAoIShjID0gKF9jbWRsaW5lLT5hcmdfcHJvcHMgKworCQkJCSAgIGNvbS0+dmFsaWRfYXJnc1ttYXRjaF9ubysrXSktPnNob3J0X2FyZykpCisJCQkJY29udGludWU7CisKKwkJCXNwcmludGYocywgIi0lYyIsIGMpOworCQkJaWYgKCFzdHJuY21wKHRleHQsIHMsIGxlbikpCisJCQkJcmV0dXJuIHN0cmR1cChzKTsKKwkJfQorCX0KKworCS8qIExvbmcgZm9ybSBhcmd1bWVudHMgKi8KKwlpZiAobWF0Y2hfbm8gPCBjb20tPm51bV9hcmdzKQorCQltYXRjaF9ubyA9IGNvbS0+bnVtX2FyZ3M7CisKKwl3aGlsZSAobWF0Y2hfbm8gLSBjb20tPm51bV9hcmdzIDwgY29tLT5udW1fYXJncykgeworCQljb25zdCBjaGFyICpsOworCQlsID0gKF9jbWRsaW5lLT5hcmdfcHJvcHMgKworCQkgICAgIGNvbS0+dmFsaWRfYXJnc1ttYXRjaF9ubysrIC0gY29tLT5udW1fYXJnc10pLT5sb25nX2FyZzsKKwkJaWYgKCoobCArIDIpICYmICFzdHJuY21wKHRleHQsIGwsIGxlbikpCisJCQlyZXR1cm4gc3RyZHVwKGwpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBDdXN0b20gY29tcGxldGlvbiBmdW5jdGlvbiAqLworc3RhdGljIGNoYXIgKipfY29tcGxldGlvbihjb25zdCBjaGFyICp0ZXh0LCBpbnQgc3RhcnRfcG9zLAorCQkJICBpbnQgZW5kX3BvcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwljaGFyICoqbWF0Y2hfbGlzdCA9IE5VTEw7CisJaW50IHAgPSAwOworCisJd2hpbGUgKGlzc3BhY2UoKGludCkgKihybF9saW5lX2J1ZmZlciArIHApKSkKKwkJcCsrOworCisJLyogRmlyc3Qgd29yZCBzaG91bGQgYmUgb25lIG9mIG91ciBjb21tYW5kcyAqLworCWlmIChzdGFydF9wb3MgPT0gcCkKKwkJbWF0Y2hfbGlzdCA9IHJsX2NvbXBsZXRpb25fbWF0Y2hlcyh0ZXh0LCBfbGlzdF9jbWRzKTsKKworCWVsc2UgaWYgKCp0ZXh0ID09ICctJykKKwkJbWF0Y2hfbGlzdCA9IHJsX2NvbXBsZXRpb25fbWF0Y2hlcyh0ZXh0LCBfbGlzdF9hcmdzKTsKKwkvKiBlbHNlIG90aGVyIGFyZ3MgKi8KKworCS8qIE5vIGZ1cnRoZXIgY29tcGxldGlvbiAqLworCXJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX292ZXIgPSAxOworCXJldHVybiBtYXRjaF9saXN0OworfQorCitzdGF0aWMgaW50IF9oaXN0X2ZpbGUoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwljaGFyICplID0gZ2V0ZW52KCJIT01FIik7CisKKwlpZiAoZG1fc25wcmludGYoYnVmZmVyLCBzaXplLCAiJXMvLmx2bV9oaXN0b3J5IiwgZSkgPCAwKSB7CisJCWxvZ19lcnJvcigiJEhPTUUvLmx2bV9oaXN0b3J5OiBwYXRoIHRvbyBsb25nIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfcmVhZF9oaXN0b3J5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNoYXIgaGlzdF9maWxlW1BBVEhfTUFYXTsKKworCWlmICghX2hpc3RfZmlsZShoaXN0X2ZpbGUsIHNpemVvZihoaXN0X2ZpbGUpKSkKKwkJcmV0dXJuOworCisJaWYgKHJlYWRfaGlzdG9yeShoaXN0X2ZpbGUpKQorCQlsb2dfdmVyeV92ZXJib3NlKCJDb3VsZG4ndCByZWFkIGhpc3RvcnkgZnJvbSAlcy4iLCBoaXN0X2ZpbGUpOworCisJc3RpZmxlX2hpc3RvcnkoZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBzaGVsbF9oaXN0b3J5X3NpemVfQ0ZHLCBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkIF93cml0ZV9oaXN0b3J5KHZvaWQpCit7CisJY2hhciBoaXN0X2ZpbGVbUEFUSF9NQVhdOworCisJaWYgKCFfaGlzdF9maWxlKGhpc3RfZmlsZSwgc2l6ZW9mKGhpc3RfZmlsZSkpKQorCQlyZXR1cm47CisKKwlpZiAod3JpdGVfaGlzdG9yeShoaXN0X2ZpbGUpKQorCQlsb2dfdmVyeV92ZXJib3NlKCJDb3VsZG4ndCB3cml0ZSBoaXN0b3J5IHRvICVzLiIsIGhpc3RfZmlsZSk7Cit9CisKK2ludCBsdm1fc2hlbGwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBjbWRsaW5lX2NvbnRleHQgKmNtZGxpbmUpCit7CisJaW50IGFyZ2MsIHJldDsKKwljaGFyICppbnB1dCA9IE5VTEwsICphcmdzW01BWF9BUkdTXSwgKiphcmd2OworCisJcmxfcmVhZGxpbmVfbmFtZSA9ICJsdm0iOworCXJsX2F0dGVtcHRlZF9jb21wbGV0aW9uX2Z1bmN0aW9uID0gKHJsX2NvbXBsZXRpb25fZnVuY190ICopIF9jb21wbGV0aW9uOworCisJX3JlYWRfaGlzdG9yeShjbWQpOworCisJX2NtZGxpbmUgPSBjbWRsaW5lOworCisJY21kLT5pc19pbnRlcmFjdGl2ZSA9IDE7CisJd2hpbGUgKDEpIHsKKwkJZnJlZShpbnB1dCk7CisJCWlucHV0ID0gcmVhZGxpbmUoImx2bT4gIik7CisKKwkJLyogRU9GICovCisJCWlmICghaW5wdXQpIHsKKwkJCS8qIHJlYWRsaW5lIHNlbmRzIHByb21wdCB0byBzdGRvdXQgKi8KKwkJCXByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZW1wdHkgbGluZSAqLworCQlpZiAoISppbnB1dCkKKwkJCWNvbnRpbnVlOworCisJCWFkZF9oaXN0b3J5KGlucHV0KTsKKworCQlhcmd2ID0gYXJnczsKKworCQlpZiAobHZtX3NwbGl0KGlucHV0LCAmYXJnYywgYXJndiwgTUFYX0FSR1MpID09IE1BWF9BUkdTKSB7CisJCQlsb2dfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cywgc29ycnkuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghYXJnYykKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyY21wKGFyZ3ZbMF0sICJsdm0iKSkgeworCQkJYXJndisrOworCQkJYXJnYy0tOworCQl9CisKKwkJaWYgKCFhcmdjKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdHJjbXAoYXJndlswXSwgInF1aXQiKSB8fCAhc3RyY21wKGFyZ3ZbMF0sICJleGl0IikpIHsKKwkJCXJlbW92ZV9oaXN0b3J5KGhpc3RvcnlfbGVuZ3RoIC0gMSk7CisJCQlsb2dfZXJyb3IoIkV4aXRpbmcuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjbWQtPmxvZ19yaCAmJiBzdHJjbXAoYXJndlswXSwgImxhc3Rsb2ciKSkgeworCQkJLyogZHJvcCBvbGQgbG9nIHJlcG9ydCAqLworCQkJZG1fcmVwb3J0X2ZyZWUoY21kLT5sb2dfcmgpOworCQkJY21kLT5sb2dfcmggPSBOVUxMOworCQl9CisKKwkJcmV0ID0gbHZtX3J1bl9jb21tYW5kKGNtZCwgYXJnYywgYXJndik7CisJCWlmIChyZXQgPT0gRU5PX1NVQ0hfQ01EKQorCQkJbG9nX2Vycm9yKCJObyBzdWNoIGNvbW1hbmQgJyVzJy4gIFRyeSAnaGVscCcuIiwKKwkJCQkgIGFyZ3ZbMF0pOworCisgICAgICAgICAgICAgICAgaWYgKChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpICYmICFlcnJvcl9tZXNzYWdlX3Byb2R1Y2VkKCkpIHsKKwkJCWxvZ19kZWJ1ZyhJTlRFUk5BTF9FUlJPUiAiRmFpbGVkIGNvbW1hbmQgZGlkIG5vdCB1c2UgbG9nX2Vycm9yIik7CisJCQlsb2dfZXJyb3IoIkNvbW1hbmQgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJWQuIiwgcmV0KTsKKwkJfQorCQlfd3JpdGVfaGlzdG9yeSgpOworCX0KKwljbWQtPmlzX2ludGVyYWN0aXZlID0gMDsKKworCWZyZWUoaW5wdXQpOworCXJldHVybiAwOworfQorCisjZW5kaWYJLyogUkVBRExJTkVfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZtMmNtZC1zdGF0aWMuYyBiL3Rvb2xzL2x2bTJjbWQtc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMTA5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2bTJjbWQtc3RhdGljLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibHZtMmNtZGxpbmUuaCIKKyNpbmNsdWRlICJsdm0yY21kLmgiCisKK3ZvaWQgKmx2bTJfaW5pdCh2b2lkKQoreworCXJldHVybiBjbWRsaWJfbHZtMl9pbml0KDEpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZtMmNtZC5jIGIvdG9vbHMvbHZtMmNtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTU0MGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdm0yY21kLmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsdm0yY21kbGluZS5oIgorI2luY2x1ZGUgImx2bTJjbWQuaCIKKwordm9pZCAqbHZtMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNtZGxpYl9sdm0yX2luaXQoMCk7Cit9CisKK2ludCBsdm1fc2hlbGwoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgICAgc3RydWN0IGNtZGxpbmVfY29udGV4dCAqY21kbGluZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2bTJjbWQuaCBiL3Rvb2xzL2x2bTJjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY2ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHZtMmNtZC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fQ01ETElCX0gKKyNkZWZpbmUgX0xWTV9DTURMSUJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgX0xWTV9MT0dfSAordHlwZWRlZiB2b2lkICgqbHZtMl9sb2dfZm5fdCkgKGludCBsZXZlbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRtX2Vycm5vLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKworI2VuZGlmCisKKyNkZWZpbmUgTFZNMl9MT0dfU1VQUFJFU1MJMAorCisvKiBMb2dnaW5nIGxldmVscyAqLworI2RlZmluZSBMVk0yX0xPR19GQVRBTAkJMgorI2RlZmluZSBMVk0yX0xPR19FUlJPUgkJMworI2RlZmluZSBMVk0yX0xPR19QUklOVAkJNAorI2RlZmluZSBMVk0yX0xPR19WRVJCT1NFIAk1CisjZGVmaW5lIExWTTJfTE9HX1ZFUllfVkVSQk9TRQk2CisjZGVmaW5lIExWTTJfTE9HX0RFQlVHCQk3CisKKy8qIFJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgTFZNMl9DT01NQU5EX1NVQ0NFRURFRAkxCS8qIEVDTURfUFJPQ0VTU0VEICovCisjZGVmaW5lIExWTTJfTk9fU1VDSF9DT01NQU5ECTIJLyogRU5PX1NVQ0hfQ01EICovCisjZGVmaW5lIExWTTJfSU5WQUxJRF9QQVJBTUVURVJTCTMJLyogRUlOVkFMSURfQ01EX0xJTkUgKi8KKyNkZWZpbmUgTFZNMl9QUk9DRVNTSU5HX0ZBSUxFRAk1CS8qIEVDTURfRkFJTEVEICovCisKKy8qCisgKiBEZWZpbmUgZXh0ZXJuYWwgZnVuY3Rpb24gdG8gcmVwbGFjZSB0aGUgYnVpbHQtaW4gbG9nZ2luZyBmdW5jdGlvbi4KKyAqIEl0IHJlY2VpdmVzIG91dHB1dCBsaW5lLWJ5LWxpbmUuCisgKgorICogbGV2ZWwgaXMgdGhlIGxvZ2dpbmcgbGV2ZWwgKHNlZSBhYm92ZSkKKyAqIGZpbGUgJiBsaW5lIHJlZmVyIHRvIHRoZSBzb3VyY2UgY29kZSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVzLgorICovCit2b2lkIGx2bTJfbG9nX2ZuKGx2bTJfbG9nX2ZuX3QgbG9nX2ZuKTsKKworLyoKKyAqIEluaXRpYWxpc2UgbGlicmFyeS4KKyAqIFJldHVybnMgYSBoYW5kbGUgc28gcmVwZWF0ZWQgdXNlIG9mIGx2bTJfcnVuIGlzIG1vcmUgZWZmaWNpZW50LgorICovIAordm9pZCAqbHZtMl9pbml0KHZvaWQpOworCisvKgorICogRGlzYWJsZSBhbnkgZG1ldmVudGQgY2FsbHMgdGhhdCB0aGUgbGlicmFyeSBtYXkgb3RoZXJ3aXNlIGRvLiBVc2VmdWwgdG8gYXZvaWQKKyAqIHJlY3Vyc2l2ZSBjYWxscyBmcm9tIGRtZXZlbnRkIHRvIGl0c2VsZi4KKyAqLwordm9pZCBsdm0yX2Rpc2FibGVfZG1ldmVudGRfbW9uaXRvcmluZyh2b2lkICpoYW5kbGUpOworCisvKgorICogU2V0IGxvZyBsZXZlbCAoYXMgYWJvdmUpIGlmIHVzaW5nIGJ1aWx0LWluIGxvZ2dpbmcgZnVuY3Rpb24uIAorICogRGVmYXVsdCBpcyBMVk0yX0xPR19QUklOVC4gIFVzZSBMVk0yX0xPR19TVVBQUkVTUyB0byBzdXBwcmVzcyBvdXRwdXQuCisgKi8KK3ZvaWQgbHZtMl9sb2dfbGV2ZWwodm9pZCAqaGFuZGxlLCBpbnQgbGV2ZWwpOworCisvKgorICogUnVuIGFuIExWTTIgY29tbWFuZC4gCisgKiBVc2UgTlVMTCBoYW5kbGUgaWYgdGhlIGNhbGwgaXMgYSBvbmUtb2ZmIGFuZCB5b3UgZG9uJ3Qgd2FudCB0byBib3RoZXIgCisgKiBjYWxsaW5nIGx2bTJfaW5pdC9sdm0yX2V4aXQuCisgKi8KK2ludCBsdm0yX3J1bih2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKmNtZGxpbmUpOworCisvKiBSZWxlYXNlIGhhbmRsZSAqLwordm9pZCBsdm0yX2V4aXQodm9pZCAqaGFuZGxlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZtMmNtZGxpbmUuaCBiL3Rvb2xzL2x2bTJjbWRsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiZDAzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2bTJjbWRsaW5lLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfTFZNX0NNRExJTkVfSAorI2RlZmluZSBfTFZNX0NNRExJTkVfSAorCitzdHJ1Y3QgY21kX2NvbnRleHQ7CisKK3N0cnVjdCBjbWRsaW5lX2NvbnRleHQgeworICAgICAgICBzdHJ1Y3QgYXJnX3Byb3BzICphcmdfcHJvcHM7CisgICAgICAgIHN0cnVjdCBjb21tYW5kICpjb21tYW5kczsKKyAgICAgICAgaW50IG51bV9jb21tYW5kczsKKyAgICAgICAgaW50IGNvbW1hbmRzX3NpemU7Cit9OworCitpbnQgbHZtMl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK3ZvaWQgKmNtZGxpYl9sdm0yX2luaXQodW5zaWduZWQgc3RhdGljX2NvbXBpbGUpOwordm9pZCBsdm1fZmluKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworc3RydWN0IGNtZF9jb250ZXh0ICppbml0X2x2bSh1bnNpZ25lZCBzZXRfY29ubmVjdGlvbnMsIHVuc2lnbmVkIHNldF9maWx0ZXJzKTsKK3ZvaWQgbHZtX3JlZ2lzdGVyX2NvbW1hbmRzKHZvaWQpOworaW50IGx2bV9zcGxpdChjaGFyICpzdHIsIGludCAqYXJnYywgY2hhciAqKmFyZ3YsIGludCBtYXgpOworaW50IGx2bV9ydW5fY29tbWFuZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBsdm1fcmV0dXJuX2NvZGUoaW50IHJldCk7CitpbnQgbHZtX3NoZWxsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgY21kbGluZV9jb250ZXh0ICpjbWRsaW5lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9sdm1jaGFuZ2UuYyBiL3Rvb2xzL2x2bWNoYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmNlOTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdm1jaGFuZ2UuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK2ludCBsdm1jaGFuZ2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgICAgaW50IGFyZ2MgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWxvZ19lcnJvcigiV2l0aCBMVk0yIGFuZCB0aGUgZGV2aWNlIG1hcHBlciwgdGhpcyBwcm9ncmFtIGlzIG9ic29sZXRlLiIpOworCXJldHVybiBFQ01EX0ZBSUxFRDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2bWNtZGxpYi5jIGIvdG9vbHMvbHZtY21kbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2YzhiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2bWNtZGxpYi5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJsdm0yY21kbGluZS5oIgorI2luY2x1ZGUgImxhYmVsLmgiCisjaW5jbHVkZSAibWVtbG9jay5oIgorCisjaW5jbHVkZSAibHZtMmNtZC5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKK3ZvaWQgKmNtZGxpYl9sdm0yX2luaXQodW5zaWduZWQgc3RhdGljX2NvbXBpbGUpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CisKKwlsdm1fcmVnaXN0ZXJfY29tbWFuZHMoKTsKKworCWluaXRfaXNfc3RhdGljKHN0YXRpY19jb21waWxlKTsKKwlpZiAoIShjbWQgPSBpbml0X2x2bSgxLCAxKSkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICh2b2lkICopIGNtZDsKK30KKworaW50IGx2bTJfcnVuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqY21kbGluZSkKK3sKKwlpbnQgYXJnYywgcmV0LCBvbmVvZmYgPSAwOworCWNoYXIgKmFyZ3NbTUFYX0FSR1NdLCAqKmFyZ3YsICpjbWRjb3B5ID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZDsKKworCWFyZ3YgPSBhcmdzOworCisJaWYgKCFoYW5kbGUpIHsKKwkJb25lb2ZmID0gMTsKKwkJaWYgKCEoaGFuZGxlID0gbHZtMl9pbml0KCkpKSB7CisJCQlsb2dfZXJyb3IoIkhhbmRsZSBpbml0aWFsaXNhdGlvbiBmYWlsZWQuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKwl9CisKKwljbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopIGhhbmRsZTsKKworCWNtZC0+YXJndiA9IGFyZ3Y7CisKKwlpZiAoIShjbWRjb3B5ID0gZG1fc3RyZHVwKGNtZGxpbmUpKSkgeworCQlsb2dfZXJyb3IoIkNtZGxpbmUgY29weSBmYWlsZWQuIik7CisJCXJldCA9IEVDTURfRkFJTEVEOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHZtX3NwbGl0KGNtZGNvcHksICZhcmdjLCBhcmd2LCBNQVhfQVJHUykgPT0gTUFYX0FSR1MpIHsKKwkJbG9nX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMuICBMaW1pdCBpcyAlZC4iLCBNQVhfQVJHUyk7CisJCXJldCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWFyZ2MpIHsKKwkJbG9nX2Vycm9yKCJObyBjb21tYW5kIHN1cHBsaWVkIik7CisJCXJldCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGSVhNRSBUZW1wb3JhcnkgLSBtb3ZlIHRvIGxpYmRldm1hcHBlciAqLworCXJldCA9IEVDTURfUFJPQ0VTU0VEOworCWlmICghc3RyY21wKGNtZGxpbmUsICJfbWVtbG9ja19pbmMiKSkgeworCQltZW1sb2NrX2luY19kYWVtb24oY21kKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoY21kbGluZSwgIl9tZW1sb2NrX2RlYyIpKQorCQltZW1sb2NrX2RlY19kYWVtb24oY21kKTsKKwllbHNlCisJCXJldCA9IGx2bV9ydW5fY29tbWFuZChjbWQsIGFyZ2MsIGFyZ3YpOworCisgICAgICBvdXQ6CisJZG1fZnJlZShjbWRjb3B5KTsKKworCWlmIChvbmVvZmYpCisJCWx2bTJfZXhpdChoYW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBsdm0yX2Rpc2FibGVfZG1ldmVudGRfbW9uaXRvcmluZyh2b2lkICpoYW5kbGUpIHsKKwlpbml0X2RtZXZlbnRkX21vbml0b3IoRE1FVkVOVERfTU9OSVRPUl9JR05PUkUpOworCWluaXRfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKDEpOworCWluaXRfZGlzYWJsZV9kbWV2ZW50ZF9tb25pdG9yaW5nKDEpOyAvKiBMb2NrIHNldHRpbmdzICovCit9CisKK3ZvaWQgbHZtMl9sb2dfbGV2ZWwodm9pZCAqaGFuZGxlLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgPSAoc3RydWN0IGNtZF9jb250ZXh0ICopIGhhbmRsZTsKKworCWNtZC0+ZGVmYXVsdF9zZXR0aW5ncy52ZXJib3NlID0gbGV2ZWwgLSBWRVJCT1NFX0JBU0VfTEVWRUw7Cit9CisKK3ZvaWQgbHZtMl9sb2dfZm4obHZtMl9sb2dfZm5fdCBsb2dfZm4pCit7CisJaW5pdF9sb2dfZm4obG9nX2ZuKTsKK30KKwordm9pZCBsdm0yX2V4aXQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBjbWRfY29udGV4dCAqY21kID0gKHN0cnVjdCBjbWRfY29udGV4dCAqKSBoYW5kbGU7CisKKwlsdm1fZmluKGNtZCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9sdm1jbWRsaW5lLmMgYi90b29scy9sdm1jbWRsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMGNlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2bWNtZGxpbmUuYwpAQCAtMCwwICsxLDIxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworI2luY2x1ZGUgImx2bTJjbWRsaW5lLmgiCisjaW5jbHVkZSAibGFiZWwuaCIKKyNpbmNsdWRlICJsdm0tdmVyc2lvbi5oIgorI2luY2x1ZGUgImx2bWxvY2tkLmgiCisKKyNpbmNsdWRlICJzdHViLmgiCisjaW5jbHVkZSAibGFzdC1wYXRoLWNvbXBvbmVudC5oIgorI2luY2x1ZGUgImZvcm1hdDEuaCIKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisjaW5jbHVkZSA8dmFsZ3JpbmQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HRVRPUFRMT05HCisjICBpbmNsdWRlIDxnZXRvcHQuaD4KKyMgIGRlZmluZSBHRVRPUFRMT05HX0ZOKGEsIGIsIGMsIGQsIGUpIGdldG9wdF9sb25nKChhKSwgKGIpLCAoYyksIChkKSwgKGUpKQorIyAgZGVmaW5lIE9QVElORF9JTklUIDAKKyNlbHNlCitzdHJ1Y3Qgb3B0aW9uIHsKK307CitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBjaGFyICpvcHRhcmc7CisjICBkZWZpbmUgR0VUT1BUTE9OR19GTihhLCBiLCBjLCBkLCBlKSBnZXRvcHQoKGEpLCAoYiksIChjKSkKKyMgIGRlZmluZSBPUFRJTkRfSU5JVCAxCisjZW5kaWYKKworLyoKKyAqIFRhYmxlIG9mIHZhbGlkIHN3aXRjaGVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJnX3Byb3BzIF9hcmdfcHJvcHNbQVJHX0NPVU5UICsgMV0gPSB7CisjZGVmaW5lIGFyZyhhLCBiLCBjLCBkLCBlLCBmKSB7YiwgIiIsICItLSIgYywgZCwgZSwgZn0sCisjaW5jbHVkZSAiYXJncy5oIgorI3VuZGVmIGFyZworfTsKKworc3RhdGljIHN0cnVjdCBjbWRsaW5lX2NvbnRleHQgX2NtZGxpbmU7CisKKy8qIENvbW1hbmQgbGluZSBhcmdzICovCit1bnNpZ25lZCBhcmdfY291bnQoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhKQoreworCXJldHVybiBjbWQtPmFyZ192YWx1ZXNbYV0uY291bnQ7Cit9CisKK3Vuc2lnbmVkIGdyb3VwZWRfYXJnX2NvdW50KGNvbnN0IHN0cnVjdCBhcmdfdmFsdWVzICphdiwgaW50IGEpCit7CisJcmV0dXJuIGF2W2FdLmNvdW50OworfQorCit1bnNpZ25lZCBhcmdfaXNfc2V0KGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSkKK3sKKwlyZXR1cm4gYXJnX2NvdW50KGNtZCwgYSkgPyAxIDogMDsKK30KKworaW50IGFyZ19mcm9tX2xpc3RfaXNfc2V0KGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICplcnJfZm91bmQsIC4uLikKK3sKKwlpbnQgYXJnOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZXJyX2ZvdW5kKTsKKwl3aGlsZSAoKGFyZyA9IHZhX2FyZyhhcCwgaW50KSkgIT0gLTEgJiYgIWFyZ19pc19zZXQoY21kLCBhcmcpKQorCQkvKiBlbXB0eSAqLzsKKwl2YV9lbmQoYXApOworCisJaWYgKGFyZyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZXJyX2ZvdW5kKQorCQlsb2dfZXJyb3IoIiVzICVzLiIsIGFyZ19sb25nX29wdGlvbl9uYW1lKGFyZyksIGVycl9mb3VuZCk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICplcnJfZm91bmQsIC4uLikKK3sKKwlpbnQgaSwgYXJnOworCXZhX2xpc3QgYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJHX0NPVU5UOyArK2kpIHsKKwkJc3dpdGNoIChpKSB7CisJCS8qIHNraXAgY29tbW9uIG9wdGlvbnMgKi8KKwkJY2FzZSBjb21tYW5kcHJvZmlsZV9BUkc6CisJCWNhc2UgY29uZmlnX0FSRzoKKwkJY2FzZSBkZWJ1Z19BUkc6CisJCWNhc2UgZHJpdmVybG9hZGVkX0FSRzoKKwkJY2FzZSBoZWxwMl9BUkc6CisJCWNhc2UgaGVscF9BUkc6CisJCWNhc2UgcHJvZmlsZV9BUkc6CisJCWNhc2UgcXVpZXRfQVJHOgorCQljYXNlIHZlcmJvc2VfQVJHOgorCQljYXNlIHZlcnNpb25fQVJHOgorCQljYXNlIHllc19BUkc6CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWFyZ19pc19zZXQoY21kLCBpKSkKKwkJCWNvbnRpbnVlOyAvKiB1bnNldCAqLworCQl2YV9zdGFydChhcCwgZXJyX2ZvdW5kKTsKKwkJd2hpbGUgKCgoYXJnID0gdmFfYXJnKGFwLCBpbnQpKSAhPSAtMSkgJiYgKGFyZyAhPSBpKSkKKwkJCS8qIGVtcHR5ICovOworCQl2YV9lbmQoYXApOworCisJCWlmIChhcmcgPT0gaSkKKwkJCWNvbnRpbnVlOyAvKiBzZXQgYW5kIGluIGxpc3QgKi8KKworCQlpZiAoZXJyX2ZvdW5kKQorCQkJbG9nX2Vycm9yKCJPcHRpb24gJXMgJXMuIiwgYXJnX2xvbmdfb3B0aW9uX25hbWUoaSksIGVycl9mb3VuZCk7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBhcmdfZnJvbV9saXN0X2lzX25lZ2F0aXZlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICplcnJfZm91bmQsIC4uLikKK3sKKwlpbnQgYXJnLCByZXQgPSAwOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZXJyX2ZvdW5kKTsKKwl3aGlsZSAoKGFyZyA9IHZhX2FyZyhhcCwgaW50KSkgIT0gLTEpCisJCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIGFyZywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCQlpZiAoZXJyX2ZvdW5kKQorCQkJCWxvZ19lcnJvcigiJXMgJXMuIiwgYXJnX2xvbmdfb3B0aW9uX25hbWUoYXJnKSwgZXJyX2ZvdW5kKTsKKwkJCXJldCA9IDE7CisJCX0KKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFyZ19mcm9tX2xpc3RfaXNfemVybyhjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZXJyX2ZvdW5kLCAuLi4pCit7CisJaW50IGFyZywgcmV0ID0gMDsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGVycl9mb3VuZCk7CisJd2hpbGUgKChhcmcgPSB2YV9hcmcoYXAsIGludCkpICE9IC0xKQorCQlpZiAoYXJnX2lzX3NldChjbWQsIGFyZykgJiYKKwkJICAgICFhcmdfaW50X3ZhbHVlKGNtZCwgYXJnLCAwKSkgeworCQkJaWYgKGVycl9mb3VuZCkKKwkJCQlsb2dfZXJyb3IoIiVzICVzLiIsIGFyZ19sb25nX29wdGlvbl9uYW1lKGFyZyksIGVycl9mb3VuZCk7CisJCQlyZXQgPSAxOworCQl9CisJdmFfZW5kKGFwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGdyb3VwZWRfYXJnX2lzX3NldChjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhKQoreworCXJldHVybiBncm91cGVkX2FyZ19jb3VudChhdiwgYSkgPyAxIDogMDsKK30KKworY29uc3QgY2hhciAqYXJnX2xvbmdfb3B0aW9uX25hbWUoaW50IGEpCit7CisJcmV0dXJuIF9jbWRsaW5lLmFyZ19wcm9wc1thXS5sb25nX2FyZzsKK30KKworY29uc3QgY2hhciAqYXJnX3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSkKK3sKKwlyZXR1cm4gY21kLT5hcmdfdmFsdWVzW2FdLnZhbHVlOworfQorCitjb25zdCBjaGFyICphcmdfc3RyX3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgY2hhciAqZGVmKQoreworCXJldHVybiBhcmdfaXNfc2V0KGNtZCwgYSkgPyBjbWQtPmFyZ192YWx1ZXNbYV0udmFsdWUgOiBkZWY7Cit9CisKK2NvbnN0IGNoYXIgKmdyb3VwZWRfYXJnX3N0cl92YWx1ZShjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhLCBjb25zdCBjaGFyICpkZWYpCit7CisJcmV0dXJuIGdyb3VwZWRfYXJnX2NvdW50KGF2LCBhKSA/IGF2W2FdLnZhbHVlIDogZGVmOworfQorCitpbnQzMl90IGdyb3VwZWRfYXJnX2ludF92YWx1ZShjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhLCBjb25zdCBpbnQzMl90IGRlZikKK3sKKwlyZXR1cm4gZ3JvdXBlZF9hcmdfY291bnQoYXYsIGEpID8gYXZbYV0uaV92YWx1ZSA6IGRlZjsKK30KKworaW50MzJfdCBmaXJzdF9ncm91cGVkX2FyZ19pbnRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCBpbnQzMl90IGRlZikKK3sKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmN1cnJlbnRfZ3JvdXA7CisJc3RydWN0IGFyZ192YWx1ZXMgKmF2OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN1cnJlbnRfZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJYXYgPSBjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzOworCQlpZiAoZ3JvdXBlZF9hcmdfY291bnQoYXYsIGEpKQorCQkJcmV0dXJuIGdyb3VwZWRfYXJnX2ludF92YWx1ZShhdiwgYSwgZGVmKTsKKwl9CisKKwlyZXR1cm4gZGVmOworfQorCitpbnQzMl90IGFyZ19pbnRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCBpbnQzMl90IGRlZikKK3sKKwlyZXR1cm4gKF9jbWRsaW5lLmFyZ19wcm9wc1thXS5mbGFncyAmIEFSR19HUk9VUEFCTEUpID8KKwkJZmlyc3RfZ3JvdXBlZF9hcmdfaW50X3ZhbHVlKGNtZCwgYSwgZGVmKSA6IChhcmdfaXNfc2V0KGNtZCwgYSkgPyBjbWQtPmFyZ192YWx1ZXNbYV0uaV92YWx1ZSA6IGRlZik7Cit9CisKK3VpbnQzMl90IGFyZ191aW50X3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgdWludDMyX3QgZGVmKQoreworCXJldHVybiBhcmdfaXNfc2V0KGNtZCwgYSkgPyBjbWQtPmFyZ192YWx1ZXNbYV0udWlfdmFsdWUgOiBkZWY7Cit9CisKK2ludDY0X3QgYXJnX2ludDY0X3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgaW50NjRfdCBkZWYpCit7CisJcmV0dXJuIGFyZ19pc19zZXQoY21kLCBhKSA/IGNtZC0+YXJnX3ZhbHVlc1thXS5pNjRfdmFsdWUgOiBkZWY7Cit9CisKK3VpbnQ2NF90IGFyZ191aW50NjRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCB1aW50NjRfdCBkZWYpCit7CisJcmV0dXJuIGFyZ19pc19zZXQoY21kLCBhKSA/IGNtZC0+YXJnX3ZhbHVlc1thXS51aTY0X3ZhbHVlIDogZGVmOworfQorCisvKiBObyBsb25nZXIgdXNlZC4KK2NvbnN0IHZvaWQgKmFyZ19wdHJfdmFsdWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCB2b2lkICpkZWYpCit7CisJcmV0dXJuIGFyZ19pc19zZXQoY21kLCBhKSA/IGNtZC0+YXJnX3ZhbHVlc1thXS5wdHIgOiBkZWY7Cit9CisqLworCitzaWduX3QgYXJnX3NpZ25fdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCBzaWduX3QgZGVmKQoreworCXJldHVybiBhcmdfaXNfc2V0KGNtZCwgYSkgPyBjbWQtPmFyZ192YWx1ZXNbYV0uc2lnbiA6IGRlZjsKK30KKworcGVyY2VudF90eXBlX3QgYXJnX3BlcmNlbnRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCBwZXJjZW50X3R5cGVfdCBkZWYpCit7CisJcmV0dXJuIGFyZ19pc19zZXQoY21kLCBhKSA/IGNtZC0+YXJnX3ZhbHVlc1thXS5wZXJjZW50IDogZGVmOworfQorCitpbnQgYXJnX2NvdW50X2luY3JlbWVudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGEpCit7CisJcmV0dXJuIGNtZC0+YXJnX3ZhbHVlc1thXS5jb3VudCsrOworfQorCitpbnQgeWVzX25vX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWF2LT5zaWduID0gU0lHTl9OT05FOworCWF2LT5wZXJjZW50ID0gUEVSQ0VOVF9OT05FOworCisJaWYgKCFzdHJjbXAoYXYtPnZhbHVlLCAieSIpKSB7CisJCWF2LT5pX3ZhbHVlID0gMTsKKwkJYXYtPnVpX3ZhbHVlID0gMTsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGF2LT52YWx1ZSwgIm4iKSkgeworCQlhdi0+aV92YWx1ZSA9IDA7CisJCWF2LT51aV92YWx1ZSA9IDA7CisJfQorCisJZWxzZQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQgYWN0aXZhdGlvbl9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBhcmdfdmFsdWVzICphdikKK3sKKwlhdi0+c2lnbiA9IFNJR05fTk9ORTsKKwlhdi0+cGVyY2VudCA9IFBFUkNFTlRfTk9ORTsKKworCWlmICghc3RyY21wKGF2LT52YWx1ZSwgImUiKSB8fCAhc3RyY21wKGF2LT52YWx1ZSwgImV5IikgfHwKKwkgICAgIXN0cmNtcChhdi0+dmFsdWUsICJ5ZSIpKSB7CisJCWF2LT5pX3ZhbHVlID0gQ0hBTkdFX0FFWTsKKwkJYXYtPnVpX3ZhbHVlID0gQ0hBTkdFX0FFWTsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGF2LT52YWx1ZSwgInMiKSB8fCAhc3RyY21wKGF2LT52YWx1ZSwgInN5IikgfHwKKwkJICFzdHJjbXAoYXYtPnZhbHVlLCAieXMiKSkgeworCQlhdi0+aV92YWx1ZSA9IENIQU5HRV9BU1k7CisJCWF2LT51aV92YWx1ZSA9IENIQU5HRV9BU1k7CisJfQorCisJZWxzZSBpZiAoIXN0cmNtcChhdi0+dmFsdWUsICJ5IikpIHsKKwkJYXYtPmlfdmFsdWUgPSBDSEFOR0VfQVk7CisJCWF2LT51aV92YWx1ZSA9IENIQU5HRV9BWTsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGF2LT52YWx1ZSwgImEiKSB8fCAhc3RyY21wKGF2LT52YWx1ZSwgImF5IikgfHwKKwkJICFzdHJjbXAoYXYtPnZhbHVlLCAieWEiKSkgeworCQlhdi0+aV92YWx1ZSA9IENIQU5HRV9BQVk7CisJCWF2LT51aV92YWx1ZSA9IENIQU5HRV9BQVk7CisJfQorCisJZWxzZSBpZiAoIXN0cmNtcChhdi0+dmFsdWUsICJuIikgfHwgIXN0cmNtcChhdi0+dmFsdWUsICJlbiIpIHx8CisJCSAhc3RyY21wKGF2LT52YWx1ZSwgIm5lIikpIHsKKwkJYXYtPmlfdmFsdWUgPSBDSEFOR0VfQU47CisJCWF2LT51aV92YWx1ZSA9IENIQU5HRV9BTjsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGF2LT52YWx1ZSwgImxuIikgfHwgIXN0cmNtcChhdi0+dmFsdWUsICJubCIpKSB7CisJCWF2LT5pX3ZhbHVlID0gQ0hBTkdFX0FMTjsKKwkJYXYtPnVpX3ZhbHVlID0gQ0hBTkdFX0FMTjsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGF2LT52YWx1ZSwgImx5IikgfHwgIXN0cmNtcChhdi0+dmFsdWUsICJ5bCIpKSB7CisJCWF2LT5pX3ZhbHVlID0gQ0hBTkdFX0FMWTsKKwkJYXYtPnVpX3ZhbHVlID0gQ0hBTkdFX0FMWTsKKwl9CisKKwllbHNlCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBjYWNoZW1vZGVfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJY2FjaGVfbW9kZV90IG1vZGU7CisKKwlpZiAoIXNldF9jYWNoZV9tb2RlKCZtb2RlLCBhdi0+dmFsdWUpKQorCQlyZXR1cm5fMDsKKworCWF2LT5pX3ZhbHVlID0gbW9kZTsKKwlhdi0+dWlfdmFsdWUgPSBtb2RlOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBkaXNjYXJkc19hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHN0cnVjdCBhcmdfdmFsdWVzICphdikKK3sKKwl0aGluX2Rpc2NhcmRzX3QgZGlzY2FyZHM7CisKKwlpZiAoIXNldF9wb29sX2Rpc2NhcmRzKCZkaXNjYXJkcywgYXYtPnZhbHVlKSkKKwkJcmV0dXJuXzA7CisKKwlhdi0+aV92YWx1ZSA9IGRpc2NhcmRzOworCWF2LT51aV92YWx1ZSA9IGRpc2NhcmRzOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBtaXJyb3Jsb2dfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJaW50IGxvZ19jb3VudDsKKworCWlmICghc2V0X21pcnJvcl9sb2dfY291bnQoJmxvZ19jb3VudCwgYXYtPnZhbHVlKSkKKwkJcmV0dXJuXzA7CisKKwlhdi0+aV92YWx1ZSA9IGxvZ19jb3VudDsKKwlhdi0+dWlfdmFsdWUgPSBsb2dfY291bnQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IG1ldGFkYXRhdHlwZV9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdikKK3sKKwlyZXR1cm4gZ2V0X2Zvcm1hdF9ieV9uYW1lKGNtZCwgYXYtPnZhbHVlKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IF9nZXRfaW50X2FyZyhzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGNoYXIgKipwdHIpCit7CisJY2hhciAqdmFsOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCisJYXYtPnBlcmNlbnQgPSBQRVJDRU5UX05PTkU7CisKKwl2YWwgPSBhdi0+dmFsdWU7CisJc3dpdGNoICgqdmFsKSB7CisJY2FzZSAnKyc6CisJCWF2LT5zaWduID0gU0lHTl9QTFVTOworCQl2YWwrKzsKKwkJYnJlYWs7CisJY2FzZSAnLSc6CisJCWF2LT5zaWduID0gU0lHTl9NSU5VUzsKKwkJdmFsKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF2LT5zaWduID0gU0lHTl9OT05FOworCX0KKworCWlmICghaXNkaWdpdCgqdmFsKSkKKwkJcmV0dXJuIDA7CisKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWxsKHZhbCwgcHRyLCAxMCk7CisKKwlpZiAoKnB0ciA9PSB2YWwgfHwgZXJybm8pCisJCXJldHVybiAwOworCisJYXYtPmlfdmFsdWUgPSAoaW50MzJfdCkgdjsKKwlhdi0+dWlfdmFsdWUgPSAodWludDMyX3QpIHY7CisJYXYtPmk2NF92YWx1ZSA9IChpbnQ2NF90KSB2OworCWF2LT51aTY0X3ZhbHVlID0gKHVpbnQ2NF90KSB2OworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9wZXJjZW50X2FyZyhzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGNvbnN0IGNoYXIgKnB0cikKK3sKKwlpZiAoIXN0cmNhc2VjbXAocHRyLCAiViIpIHx8ICFzdHJjYXNlY21wKHB0ciwgIlZHIikpCisJCWF2LT5wZXJjZW50ID0gUEVSQ0VOVF9WRzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChwdHIsICJMIikgfHwgIXN0cmNhc2VjbXAocHRyLCAiTFYiKSkKKwkJYXYtPnBlcmNlbnQgPSBQRVJDRU5UX0xWOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKHB0ciwgIlAiKSB8fCAhc3RyY2FzZWNtcChwdHIsICJQViIpIHx8CisJCSAhc3RyY2FzZWNtcChwdHIsICJQVlMiKSkKKwkJYXYtPnBlcmNlbnQgPSBQRVJDRU5UX1BWUzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChwdHIsICJGIikgfHwgIXN0cmNhc2VjbXAocHRyLCAiRlIiKSB8fAorCQkgIXN0cmNhc2VjbXAocHRyLCAiRlJFRSIpKQorCQlhdi0+cGVyY2VudCA9IFBFUkNFTlRfRlJFRTsKKwllbHNlIGlmICghc3RyY2FzZWNtcChwdHIsICJPIikgfHwgIXN0cmNhc2VjbXAocHRyLCAiT1IiKSB8fAorCQkgIXN0cmNhc2VjbXAocHRyLCAiT1JJR0lOIikpCisJCWF2LT5wZXJjZW50ID0gUEVSQ0VOVF9PUklHSU47CisJZWxzZSB7CisJCWxvZ19lcnJvcigiU3BlY2lmaWVkICUlJXMgaXMgdW5rbm93bi4iLCBwdHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogU2l6ZSBzdG9yZWQgaW4gc2VjdG9ycyAqLworc3RhdGljIGludCBfc2l6ZV9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgc3RydWN0IGFyZ192YWx1ZXMgKmF2LCBpbnQgZmFjdG9yLCBpbnQgcGVyY2VudCkKK3sKKwljaGFyICpwdHI7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN1ZmZpeGVzID0gImttZ3RwZWJzIjsKKwljaGFyICp2YWw7CisJZG91YmxlIHY7CisJdWludDY0X3Qgdl90bXAsIGFkanVzdG1lbnQ7CisKKwlhdi0+cGVyY2VudCA9IFBFUkNFTlRfTk9ORTsKKworCXZhbCA9IGF2LT52YWx1ZTsKKwlzd2l0Y2ggKCp2YWwpIHsKKwljYXNlICcrJzoKKwkJYXYtPnNpZ24gPSBTSUdOX1BMVVM7CisJCXZhbCsrOworCQlicmVhazsKKwljYXNlICctJzoKKwkJYXYtPnNpZ24gPSBTSUdOX01JTlVTOworCQl2YWwrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXYtPnNpZ24gPSBTSUdOX05PTkU7CisJfQorCisJaWYgKCFpc2RpZ2l0KCp2YWwpKQorCQlyZXR1cm4gMDsKKworCXYgPSBzdHJ0b2QodmFsLCAmcHRyKTsKKworCWlmICgqcHRyID09ICcuJykgeworCQkvKgorCQkgKiBNYXliZSB1c2VyIGhhcyBub24tQyBsb2NhbGUgd2l0aCBkaWZmZXJlbnQgZGVjaW1hbCBwb2ludCA/CisJCSAqIExldHMgYmUgdG9sZXJhbiBhbmQgcmV0cnkgd2l0aCBzdGFuZGFyZCBDIGxvY2FsZXMKKwkJICovCisJCWlmIChzZXRsb2NhbGUoTENfQUxMLCAiQyIpKSB7CisJCQl2ID0gc3RydG9kKHZhbCwgJnB0cik7CisJCQlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJCX0KKwl9CisKKwlpZiAocHRyID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGVyY2VudCAmJiAqcHRyID09ICclJykgeworCQlpZiAoIV9nZXRfcGVyY2VudF9hcmcoYXYsICsrcHRyKSkKKwkJCXJldHVybl8wOworCQlpZiAoKHVpbnQ2NF90KSB2ID49IFVJTlQzMl9NQVgpIHsKKwkJCWxvZ19lcnJvcigiUGVyY2VudGFnZSBpcyB0b28gYmlnICg+PSVkJSUpLiIsIFVJTlQzMl9NQVgpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKCpwdHIpIHsKKwkJZm9yIChpID0gc3RybGVuKHN1ZmZpeGVzKSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJaWYgKHN1ZmZpeGVzW2ldID09IHRvbG93ZXIoKGludCkgKnB0cikpCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPCAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChpID09IDcpIHsKKwkJCS8qIHYgaXMgYWxyZWFkeSBpbiBzZWN0b3JzICovCisJCQk7CisJCX0gZWxzZSBpZiAoaSA9PSA2KSB7CisJCQkvKiBieXRlcyAqLworCQkJdl90bXAgPSAodWludDY0X3QpIHY7CisJCQlhZGp1c3RtZW50ID0gdl90bXAgJSA1MTI7CisJCQlpZiAoYWRqdXN0bWVudCkgeworCQkJCXZfdG1wICs9ICg1MTIgLSBhZGp1c3RtZW50KTsKKwkJCQlsb2dfZXJyb3IoIlNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNTEyLiAiCisJCQkJCSAgIlRyeSB1c2luZyAlIlBSSXU2NCIgb3IgJSJQUkl1NjQiLiIsCisJCQkJCSAgdl90bXAgLSA1MTIsIHZfdG1wKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXYgLz0gNTEyOworCQl9IGVsc2UgeworCQkJLyogYWxsIG90aGVyIHVuaXRzOiBrbWd0cGUgKi8KKwkJCXdoaWxlIChpLS0gPiAwKQorCQkJCXYgKj0gMTAyNDsKKwkJCXYgKj0gMjsKKwkJfQorCX0gZWxzZQorCQl2ICo9IGZhY3RvcjsKKworCWlmICgodWludDY0X3QpIHYgPj0gKFVJTlQ2NF9NQVggPj4gU0VDVE9SX1NISUZUKSkgeworCQlsb2dfZXJyb3IoIlNpemUgaXMgdG9vIGJpZyAoPj0xNkVpQikuIik7CisJCXJldHVybiAwOworCX0KKwlhdi0+aV92YWx1ZSA9IChpbnQzMl90KSB2OworCWF2LT51aV92YWx1ZSA9ICh1aW50MzJfdCkgdjsKKwlhdi0+aTY0X3ZhbHVlID0gKGludDY0X3QpIHY7CisJYXYtPnVpNjRfdmFsdWUgPSAodWludDY0X3QpIHY7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHNpemVfa2JfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJcmV0dXJuIF9zaXplX2FyZyhjbWQsIGF2LCAyLCAwKTsKK30KKworaW50IHNpemVfbWJfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJcmV0dXJuIF9zaXplX2FyZyhjbWQsIGF2LCAyMDQ4LCAwKTsKK30KKworaW50IHNpemVfbWJfYXJnX3dpdGhfcGVyY2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCXJldHVybiBfc2l6ZV9hcmcoY21kLCBhdiwgMjA0OCwgMSk7Cit9CisKK2ludCBpbnRfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJY2hhciAqcHRyOworCisJaWYgKCFfZ2V0X2ludF9hcmcoYXYsICZwdHIpIHx8ICgqcHRyKSB8fCAoYXYtPnNpZ24gPT0gU0lHTl9NSU5VUykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBpbnRfYXJnX3dpdGhfc2lnbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWNoYXIgKnB0cjsKKworCWlmICghX2dldF9pbnRfYXJnKGF2LCAmcHRyKSB8fCAoKnB0cikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBpbnRfYXJnX3dpdGhfc2lnbl9hbmRfcGVyY2VudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCQkgIHN0cnVjdCBhcmdfdmFsdWVzICphdikKK3sKKwljaGFyICpwdHI7CisKKwlpZiAoIV9nZXRfaW50X2FyZyhhdiwgJnB0cikpCisJCXJldHVybiAwOworCisJaWYgKCEqcHRyKQorCQlyZXR1cm4gMTsKKworCWlmICgqcHRyKysgIT0gJyUnKQorCQlyZXR1cm4gMDsKKworCWlmICghX2dldF9wZXJjZW50X2FyZyhhdiwgcHRyKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoYXYtPnVpNjRfdmFsdWUgPj0gVUlOVDMyX01BWCkgeworCQlsb2dfZXJyb3IoIlBlcmNlbnRhZ2UgaXMgdG9vIGJpZyAoPj0lZCUlKS4iLCBVSU5UMzJfTUFYKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBzdHJpbmdfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICAgICBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDE7Cit9CisKK2ludCB0YWdfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJY2hhciAqcG9zID0gYXYtPnZhbHVlOworCisJaWYgKCpwb3MgPT0gJ0AnKQorCQlwb3MrKzsKKworCWlmICghdmFsaWRhdGVfdGFnKHBvcykpCisJCXJldHVybiAwOworCisJYXYtPnZhbHVlID0gcG9zOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBwZXJtaXNzaW9uX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWF2LT5zaWduID0gU0lHTl9OT05FOworCisJaWYgKCghc3RyY21wKGF2LT52YWx1ZSwgInJ3IikpIHx8ICghc3RyY21wKGF2LT52YWx1ZSwgIndyIikpKQorCQlhdi0+dWlfdmFsdWUgPSBMVk1fUkVBRCB8IExWTV9XUklURTsKKworCWVsc2UgaWYgKCFzdHJjbXAoYXYtPnZhbHVlLCAiciIpKQorCQlhdi0+dWlfdmFsdWUgPSBMVk1fUkVBRDsKKworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGFsbG9jX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWFsbG9jX3BvbGljeV90IGFsbG9jOworCisJYXYtPnNpZ24gPSBTSUdOX05PTkU7CisKKwlhbGxvYyA9IGdldF9hbGxvY19mcm9tX3N0cmluZyhhdi0+dmFsdWUpOworCWlmIChhbGxvYyA9PSBBTExPQ19JTlZBTElEKQorCQlyZXR1cm4gMDsKKworCWF2LT51aV92YWx1ZSA9ICh1aW50MzJfdCkgYWxsb2M7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGxvY2t0eXBlX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWxvY2tfdHlwZV90IGxvY2tfdHlwZTsKKworCWF2LT5zaWduID0gU0lHTl9OT05FOworCisJbG9ja190eXBlID0gZ2V0X2xvY2tfdHlwZV9mcm9tX3N0cmluZyhhdi0+dmFsdWUpOworCWlmIChsb2NrX3R5cGUgPT0gTE9DS19UWVBFX0lOVkFMSUQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZWd0eXBlX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCXN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJY29uc3QgY2hhciAqc3RyID0gKCFzdHJjbXAoYXYtPnZhbHVlLCBTRUdfVFlQRV9OQU1FX0xJTkVBUikpID8gU0VHX1RZUEVfTkFNRV9TVFJJUEVEIDogYXYtPnZhbHVlOworCisJaWYgKCEoc2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgc3RyKSkpCisJCXJldHVybl8wOworCisJcmV0dXJuICghc2VndHlwZV9pc191bmtub3duKHNlZ3R5cGUpKSA/IDEgOiAwOworfQorCisvKgorICogUG9zaXRpdmUgaW50ZWdlciwgemVybyBvciAiYXV0byIuCisgKi8KK2ludCByZWFkYWhlYWRfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpCit7CisJaWYgKCFzdHJjYXNlY21wKGF2LT52YWx1ZSwgImF1dG8iKSkgeworCQlhdi0+dWlfdmFsdWUgPSBETV9SRUFEX0FIRUFEX0FVVE87CisJCXJldHVybiAxOworCX0KKworCWlmICghc3RyY2FzZWNtcChhdi0+dmFsdWUsICJub25lIikpIHsKKwkJYXYtPnVpX3ZhbHVlID0gRE1fUkVBRF9BSEVBRF9OT05FOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIV9zaXplX2FyZyhjbWQsIGF2LCAxLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXYtPnNpZ24gPT0gU0lHTl9NSU5VUykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE5vbi16ZXJvLCBwb3NpdGl2ZSBpbnRlZ2VyLCAiYWxsIiwgb3IgInVubWFuYWdlZCIKKyAqLworaW50IG1ldGFkYXRhY29waWVzX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KQoreworCWlmICghc3RybmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJ2ZyIsIDIpKSB7CisJCWlmICghc3RyY2FzZWNtcChhdi0+dmFsdWUsICJhbGwiKSkgeworCQkJYXYtPnVpX3ZhbHVlID0gVkdNRVRBREFUQUNPUElFU19BTEw7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmICghc3RyY2FzZWNtcChhdi0+dmFsdWUsICJ1bm1hbmFnZWQiKSkgeworCQkJYXYtPnVpX3ZhbHVlID0gVkdNRVRBREFUQUNPUElFU19VTk1BTkFHRUQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiBpbnRfYXJnKGNtZCwgYXYpOworfQorCitzdGF0aWMgdm9pZCBfX2FsbG9jKGludCBzaXplKQoreworCWlmICghKF9jbWRsaW5lLmNvbW1hbmRzID0gZG1fcmVhbGxvYyhfY21kbGluZS5jb21tYW5kcywgc2l6ZW9mKCpfY21kbGluZS5jb21tYW5kcykgKiBzaXplKSkpIHsKKwkJbG9nX2ZhdGFsKCJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkuIik7CisJCWV4aXQoRUNNRF9GQUlMRUQpOworCX0KKworCV9jbWRsaW5lLmNvbW1hbmRzX3NpemUgPSBzaXplOworfQorCitzdGF0aWMgdm9pZCBfYWxsb2NfY29tbWFuZCh2b2lkKQoreworCWlmICghX2NtZGxpbmUuY29tbWFuZHNfc2l6ZSkKKwkJX19hbGxvYygzMik7CisKKwlpZiAoX2NtZGxpbmUuY29tbWFuZHNfc2l6ZSA8PSBfY21kbGluZS5udW1fY29tbWFuZHMpCisJCV9fYWxsb2MoMiAqIF9jbWRsaW5lLmNvbW1hbmRzX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBfY3JlYXRlX25ld19jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUsIGNvbW1hbmRfZm4gY29tbWFuZCwKKwkJCQl1bnNpZ25lZCBmbGFncywKKwkJCQljb25zdCBjaGFyICpkZXNjLCBjb25zdCBjaGFyICp1c2FnZXN0ciwKKwkJCQlpbnQgbmFyZ3MsIGludCAqYXJncykKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqbmM7CisKKwlfYWxsb2NfY29tbWFuZCgpOworCisJbmMgPSBfY21kbGluZS5jb21tYW5kcyArIF9jbWRsaW5lLm51bV9jb21tYW5kcysrOworCisJbmMtPm5hbWUgPSBuYW1lOworCW5jLT5kZXNjID0gZGVzYzsKKwluYy0+dXNhZ2UgPSB1c2FnZXN0cjsKKwluYy0+Zm4gPSBjb21tYW5kOworCW5jLT5mbGFncyA9IGZsYWdzOworCW5jLT5udW1fYXJncyA9IG5hcmdzOworCW5jLT52YWxpZF9hcmdzID0gYXJnczsKK30KKworc3RhdGljIHZvaWQgX3JlZ2lzdGVyX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSwgY29tbWFuZF9mbiBmbiwgY29uc3QgY2hhciAqZGVzYywKKwkJCSAgICAgIHVuc2lnbmVkIGZsYWdzLCBjb25zdCBjaGFyICp1c2FnZXN0ciwgLi4uKQoreworCWludCBuYXJncyA9IDAsIGk7CisJaW50ICphcmdzOworCXZhX2xpc3QgYXA7CisKKwkvKiBjb3VudCBob3cgbWFueSBhcmd1bWVudHMgd2UgaGF2ZSAqLworCXZhX3N0YXJ0KGFwLCB1c2FnZXN0cik7CisJd2hpbGUgKHZhX2FyZyhhcCwgaW50KSA+PSAwKQorCQkgbmFyZ3MrKzsKKwl2YV9lbmQoYXApOworCisJLyogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gKi8KKwlpZiAoIShhcmdzID0gZG1fbWFsbG9jKHNpemVvZigqYXJncykgKiBuYXJncykpKSB7CisJCWxvZ19mYXRhbCgiT3V0IG9mIG1lbW9yeS4iKTsKKwkJZXhpdChFQ01EX0ZBSUxFRCk7CisJfQorCisJLyogZmlsbCB0aGVtIGluICovCisJdmFfc3RhcnQoYXAsIHVzYWdlc3RyKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJnc1tpXSA9IHZhX2FyZyhhcCwgaW50KTsKKwl2YV9lbmQoYXApOworCisJLyogZW50ZXIgdGhlIGNvbW1hbmQgaW4gdGhlIHJlZ2lzdGVyICovCisJX2NyZWF0ZV9uZXdfY29tbWFuZChuYW1lLCBmbiwgZmxhZ3MsIGRlc2MsIHVzYWdlc3RyLCBuYXJncywgYXJncyk7Cit9CisKK3ZvaWQgbHZtX3JlZ2lzdGVyX2NvbW1hbmRzKHZvaWQpCit7CisjZGVmaW5lIHh4KGEsIGIsIGMsIGQuLi4pIF9yZWdpc3Rlcl9jb21tYW5kKCMgYSwgYSwgYiwgYywgIyMgZCwgXAorCQkJCQkgICAgZHJpdmVybG9hZGVkX0FSRywgXAorCQkJCQkgICAgZGVidWdfQVJHLCBoZWxwX0FSRywgaGVscDJfQVJHLCBcCisJCQkJCSAgICB2ZXJzaW9uX0FSRywgdmVyYm9zZV9BUkcsIFwKKwkJCQkJICAgIHllc19BUkcsIFwKKwkJCQkJICAgIHF1aWV0X0FSRywgY29uZmlnX0FSRywgXAorCQkJCQkgICAgY29tbWFuZHByb2ZpbGVfQVJHLCBcCisJCQkJCSAgICBwcm9maWxlX0FSRywgLTEpOworI2luY2x1ZGUgImNvbW1hbmRzLmgiCisjdW5kZWYgeHgKK30KKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpfZmluZF9jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqYmFzZTsKKworCWJhc2UgPSBsYXN0X3BhdGhfY29tcG9uZW50KG5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IF9jbWRsaW5lLm51bV9jb21tYW5kczsgaSsrKSB7CisJCWlmICghc3RyY21wKGJhc2UsIF9jbWRsaW5lLmNvbW1hbmRzW2ldLm5hbWUpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gX2NtZGxpbmUubnVtX2NvbW1hbmRzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBfY21kbGluZS5jb21tYW5kcyArIGk7Cit9CisKK3N0YXRpYyB2b2lkIF9zaG9ydF91c2FnZShjb25zdCBjaGFyICpuYW1lKQoreworCWxvZ19lcnJvcigiUnVuIGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIG5hbWUpOworfQorCitzdGF0aWMgaW50IF91c2FnZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjb21tYW5kICpjb20gPSBfZmluZF9jb21tYW5kKG5hbWUpOworCisJaWYgKCFjb20pIHsKKwkJbG9nX3ByaW50KCIlczogbm8gc3VjaCBjb21tYW5kLiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsb2dfcHJpbnQoIiVzOiAlc1xuXG4lcyIsIGNvbS0+bmFtZSwgY29tLT5kZXNjLCBjb20tPnVzYWdlKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFNldHMgdXAgdGhlIHNob3J0IGFuZCBsb25nIGFyZ3VtZW50LiAgSWYgdGhlcmUKKyAqIGlzIG5vIHNob3J0IGFyZ3VtZW50IHRoZW4gdGhlIGluZGV4IG9mIHRoZQorICogYXJndW1lbnQgaW4gdGhlIHRoZV9hcmdzIGFycmF5IGlzIHNldCBhcyB0aGUKKyAqIGxvbmcgb3B0IHZhbHVlLiAgWXVjay4gIE9mIGNvdXJzZSB0aGlzIG1lYW5zIHdlCisgKiBjYW4ndCBoYXZlIG1vcmUgdGhhbiAnYScgbG9uZyBhcmd1bWVudHMuCisgKi8KK3N0YXRpYyB2b2lkIF9hZGRfZ2V0b3B0X2FyZyhpbnQgYXJnLCBjaGFyICoqcHRyLCBzdHJ1Y3Qgb3B0aW9uICoqbykKK3sKKwlzdHJ1Y3QgYXJnX3Byb3BzICphID0gX2NtZGxpbmUuYXJnX3Byb3BzICsgYXJnOworCisJaWYgKGEtPnNob3J0X2FyZykgeworCQkqKCpwdHIpKysgPSBhLT5zaG9ydF9hcmc7CisKKwkJaWYgKGEtPmZuKQorCQkJKigqcHRyKSsrID0gJzonOworCX0KKyNpZmRlZiBIQVZFX0dFVE9QVExPTkcKKwlpZiAoKihhLT5sb25nX2FyZyArIDIpKSB7CisJCSgqbyktPm5hbWUgPSBhLT5sb25nX2FyZyArIDI7CisJCSgqbyktPmhhc19hcmcgPSBhLT5mbiA/IDEgOiAwOworCQkoKm8pLT5mbGFnID0gTlVMTDsKKwkJaWYgKGEtPnNob3J0X2FyZykKKwkJCSgqbyktPnZhbCA9IGEtPnNob3J0X2FyZzsKKwkJZWxzZQorCQkJKCpvKS0+dmFsID0gYXJnICsgMTI4OworCQkoKm8pKys7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX2ZpbmRfYXJnKHN0cnVjdCBjb21tYW5kICpjb20sIGludCBvcHQpCit7CisJc3RydWN0IGFyZ19wcm9wcyAqYTsKKwlpbnQgaSwgYXJnOworCisJZm9yIChpID0gMDsgaSA8IGNvbS0+bnVtX2FyZ3M7IGkrKykgeworCQlhcmcgPSBjb20tPnZhbGlkX2FyZ3NbaV07CisJCWEgPSBfY21kbGluZS5hcmdfcHJvcHMgKyBhcmc7CisKKwkJLyoKKwkJICogb3B0IHNob3VsZCBlcXVhbCBlaXRoZXIgdGhlCisJCSAqIHNob3J0IGFyZywgb3IgdGhlIGluZGV4IGludG8KKwkJICogdGhlX2FyZ3MuCisJCSAqLworCQlpZiAoKGEtPnNob3J0X2FyZyAmJiAob3B0ID09IGEtPnNob3J0X2FyZykpIHx8CisJCSAgICAoIWEtPnNob3J0X2FyZyAmJiAob3B0ID09IChhcmcgKyAxMjgpKSkpCisJCQlyZXR1cm4gYXJnOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19jb21tYW5kX2xpbmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCAqYXJnYywKKwkJCQkgY2hhciAqKiphcmd2KQoreworCWludCBpLCBvcHQsIGFyZzsKKwljaGFyIHN0clsoKEFSR19DT1VOVCArIDEpICogMikgKyAxXSwgKnB0ciA9IHN0cjsKKwlzdHJ1Y3Qgb3B0aW9uIG9wdHNbQVJHX0NPVU5UICsgMV0sICpvID0gb3B0czsKKwlzdHJ1Y3QgYXJnX3Byb3BzICphOworCXN0cnVjdCBhcmdfdmFsdWVzICphdjsKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmN1cnJlbnRfZ3JvdXAgPSBOVUxMOworCisJaWYgKCEoY21kLT5hcmdfdmFsdWVzID0gZG1fcG9vbF96YWxsb2MoY21kLT5tZW0sIHNpemVvZigqY21kLT5hcmdfdmFsdWVzKSAqIEFSR19DT1VOVCkpKSB7CisJCWxvZ19mYXRhbCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlsbCBpbiB0aGUgc2hvcnQgYW5kIGxvbmcgb3B0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNvbW1hbmQtPm51bV9hcmdzOyBpKyspCisJCV9hZGRfZ2V0b3B0X2FyZyhjbWQtPmNvbW1hbmQtPnZhbGlkX2FyZ3NbaV0sICZwdHIsICZvKTsKKworCSpwdHIgPSAnXDAnOworCW1lbXNldChvLCAwLCBzaXplb2YoKm8pKTsKKworCS8qIGluaXRpYWxpc2UgZ2V0b3B0X2xvbmcgJiBzY2FuIGZvciBjb21tYW5kIGxpbmUgc3dpdGNoZXMgKi8KKwlvcHRhcmcgPSAwOworCW9wdGluZCA9IE9QVElORF9JTklUOworCXdoaWxlICgob3B0ID0gR0VUT1BUTE9OR19GTigqYXJnYywgKmFyZ3YsIHN0ciwgb3B0cywgTlVMTCkpID49IDApIHsKKworCQlpZiAob3B0ID09ICc/JykKKwkJCXJldHVybiAwOworCisJCWlmICgoYXJnID0gX2ZpbmRfYXJnKGNtZC0+Y29tbWFuZCwgb3B0KSkgPCAwKSB7CisJCQlsb2dfZmF0YWwoIlVucmVjb2duaXNlZCBvcHRpb24uIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWEgPSBfY21kbGluZS5hcmdfcHJvcHMgKyBhcmc7CisKKwkJYXYgPSAmY21kLT5hcmdfdmFsdWVzW2FyZ107CisKKwkJaWYgKGEtPmZsYWdzICYgQVJHX0dST1VQQUJMRSkgeworCQkJLyoKKwkJCSAqIFN0YXJ0IGEgbmV3IGdyb3VwIG9mIGFyZ3VtZW50czoKKwkJCSAqICAgLSB0aGUgZmlyc3QgdGltZSwKKwkJCSAqICAgLSBvciBpZiBhIG5vbi1jb3VudGFibGUgYXJndW1lbnQgaXMgcmVwZWF0ZWQsCisJCQkgKiAgIC0gb3IgaWYgYXJndW1lbnQgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIGN1cnJlbnQgZ3JvdXAuCisJCQkgKi8KKwkJCWlmICghY3VycmVudF9ncm91cCB8fAorCQkJICAgIChjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzW2FyZ10uY291bnQgJiYgIShhLT5mbGFncyAmIEFSR19DT1VOVEFCTEUpKSB8fAorCQkJICAgIChjdXJyZW50X2dyb3VwLT5wcmlvIDwgYS0+cHJpbykpIHsKKwkJCQkvKiBGSVhNRSBSZWR1Y2Ugc2l6ZSBpbmNsdWRpbmcgb25seSBncm91cGFibGUgYXJncyAqLworCQkJCWlmICghKGN1cnJlbnRfZ3JvdXAgPSBkbV9wb29sX3phbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKHN0cnVjdCBhcmdfdmFsdWVfZ3JvdXBfbGlzdCkgKyBzaXplb2YoKmNtZC0+YXJnX3ZhbHVlcykgKiBBUkdfQ09VTlQpKSkgeworCQkJCQlsb2dfZmF0YWwoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWN1cnJlbnRfZ3JvdXAtPnByaW8gPSBhLT5wcmlvOworCQkJCWRtX2xpc3RfYWRkKCZjbWQtPmFyZ192YWx1ZV9ncm91cHMsICZjdXJyZW50X2dyb3VwLT5saXN0KTsKKwkJCX0KKwkJCS8qIE1haW50YWluIHRvdGFsIGFyZ3VtZW50IGNvdW50IGFzIHdlbGwgYXMgY291bnQgd2l0aGluIGVhY2ggZ3JvdXAgKi8KKwkJCWF2LT5jb3VudCsrOworCQkJYXYgPSAmY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlc1thcmddOworCQl9CisKKwkJaWYgKGF2LT5jb3VudCAmJiAhKGEtPmZsYWdzICYgQVJHX0NPVU5UQUJMRSkpIHsKKwkJCWxvZ19lcnJvcigiT3B0aW9uJXMlYyVzJXMgbWF5IG5vdCBiZSByZXBlYXRlZC4iLAorCQkJCSAgYS0+c2hvcnRfYXJnID8gIiAtIiA6ICIiLAorCQkJCSAgYS0+c2hvcnRfYXJnID8gOiAnICcsCisJCQkJICAoYS0+c2hvcnRfYXJnICYmIGEtPmxvbmdfYXJnKSA/CisJCQkJICAiLyIgOiAiIiwgYS0+bG9uZ19hcmcgPyA6ICIiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGEtPmZuKSB7CisJCQlpZiAoIW9wdGFyZykgeworCQkJCWxvZ19lcnJvcigiT3B0aW9uIHJlcXVpcmVzIGFyZ3VtZW50LiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlhdi0+dmFsdWUgPSBvcHRhcmc7CisKKwkJCWlmICghYS0+Zm4oY21kLCBhdikpIHsKKwkJCQlsb2dfZXJyb3IoIkludmFsaWQgYXJndW1lbnQgZm9yICVzOiAlcyIsIGEtPmxvbmdfYXJnLCBvcHRhcmcpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJYXYtPmNvdW50Kys7CisJfQorCisJKmFyZ2MgLT0gb3B0aW5kOworCSphcmd2ICs9IG9wdGluZDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX2NvcHlfYXJnX3ZhbHVlcyhzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBvbGRhcmcsIGludCBuZXdhcmcpCit7CisJY29uc3Qgc3RydWN0IGFyZ192YWx1ZXMgKm9sZCA9IGF2ICsgb2xkYXJnOworCXN0cnVjdCBhcmdfdmFsdWVzICpuZXcgPSBhdiArIG5ld2FyZzsKKworCW5ldy0+Y291bnQgPSBvbGQtPmNvdW50OworCW5ldy0+dmFsdWUgPSBvbGQtPnZhbHVlOworCW5ldy0+aV92YWx1ZSA9IG9sZC0+aV92YWx1ZTsKKwluZXctPnVpX3ZhbHVlID0gb2xkLT51aV92YWx1ZTsKKwluZXctPmk2NF92YWx1ZSA9IG9sZC0+aTY0X3ZhbHVlOworCW5ldy0+dWk2NF92YWx1ZSA9IG9sZC0+dWk2NF92YWx1ZTsKKwluZXctPnNpZ24gPSBvbGQtPnNpZ247Cit9CisKK3N0YXRpYyBpbnQgX21lcmdlX3N5bm9ueW0oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBvbGRhcmcsIGludCBuZXdhcmcpCit7CisJc3RydWN0IGFyZ192YWx1ZXMgKmF2OworCXN0cnVjdCBhcmdfdmFsdWVfZ3JvdXBfbGlzdCAqY3VycmVudF9ncm91cDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgb2xkYXJnKSAmJiBhcmdfaXNfc2V0KGNtZCwgbmV3YXJnKSkgeworCQlsb2dfZXJyb3IoIiVzIGFuZCAlcyBhcmUgc3lub255bXMuICBQbGVhc2Ugb25seSBzdXBwbHkgb25lLiIsCisJCQkgIF9jbWRsaW5lLmFyZ19wcm9wc1tvbGRhcmddLmxvbmdfYXJnLCBfY21kbGluZS5hcmdfcHJvcHNbbmV3YXJnXS5sb25nX2FyZyk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vdCBncm91cGFibGU/ICovCisJaWYgKCEoX2NtZGxpbmUuYXJnX3Byb3BzW29sZGFyZ10uZmxhZ3MgJiBBUkdfR1JPVVBBQkxFKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIG9sZGFyZykpCisJCQlfY29weV9hcmdfdmFsdWVzKGNtZC0+YXJnX3ZhbHVlcywgb2xkYXJnLCBuZXdhcmcpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG9sZGFyZykpCisJCWNtZC0+YXJnX3ZhbHVlc1tuZXdhcmddLmNvdW50ID0gY21kLT5hcmdfdmFsdWVzW29sZGFyZ10uY291bnQ7CisKKwkvKiBHcm91cGFibGUgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoY3VycmVudF9ncm91cCwgJmNtZC0+YXJnX3ZhbHVlX2dyb3VwcykgeworCQlhdiA9IGN1cnJlbnRfZ3JvdXAtPmFyZ192YWx1ZXM7CisJCWlmICghZ3JvdXBlZF9hcmdfY291bnQoYXYsIG9sZGFyZykpCisJCQljb250aW51ZTsKKwkJX2NvcHlfYXJnX3ZhbHVlcyhhdiwgb2xkYXJnLCBuZXdhcmcpOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgc3lzdGVtaWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgICBpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkgICAgIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWxvZ19wcmludCgic3lzdGVtIElEOiAlcyIsIGNtZC0+c3lzdGVtX2lkID8gOiAiIik7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCB2ZXJzaW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICBpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkgICAgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJY2hhciB2c25bODBdOworCisJbG9nX3ByaW50KCJMVk0gdmVyc2lvbjogICAgICVzIiwgTFZNX1ZFUlNJT04pOworCWlmIChsaWJyYXJ5X3ZlcnNpb24odnNuLCBzaXplb2YodnNuKSkpCisJCWxvZ19wcmludCgiTGlicmFyeSB2ZXJzaW9uOiAlcyIsIHZzbik7CisJaWYgKGRyaXZlcl92ZXJzaW9uKHZzbiwgc2l6ZW9mKHZzbikpKQorCQlsb2dfcHJpbnQoIkRyaXZlciB2ZXJzaW9uOiAgJXMiLCB2c24pOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitzdGF0aWMgaW50IF9nZXRfc2V0dGluZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJY29uc3QgY2hhciAqYWN0aXZhdGlvbl9tb2RlOworCisJY21kLT5jdXJyZW50X3NldHRpbmdzID0gY21kLT5kZWZhdWx0X3NldHRpbmdzOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBkZWJ1Z19BUkcpKQorCQljbWQtPmN1cnJlbnRfc2V0dGluZ3MuZGVidWcgPSBfTE9HX0ZBVEFMICsKKwkJICAgIChhcmdfY291bnQoY21kLCBkZWJ1Z19BUkcpIC0gMSk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHZlcmJvc2VfQVJHKSkKKwkJY21kLT5jdXJyZW50X3NldHRpbmdzLnZlcmJvc2UgPSBhcmdfY291bnQoY21kLCB2ZXJib3NlX0FSRyk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHF1aWV0X0FSRykpIHsKKwkJY21kLT5jdXJyZW50X3NldHRpbmdzLmRlYnVnID0gMDsKKwkJY21kLT5jdXJyZW50X3NldHRpbmdzLnZlcmJvc2UgPSAwOworCQljbWQtPmN1cnJlbnRfc2V0dGluZ3Muc2lsZW50ID0gKGFyZ19jb3VudChjbWQsIHF1aWV0X0FSRykgPiAxKSA/IDEgOiAwOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgdGVzdF9BUkcpKQorCQljbWQtPmN1cnJlbnRfc2V0dGluZ3MudGVzdCA9IGFyZ19pc19zZXQoY21kLCB0ZXN0X0FSRyk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGRyaXZlcmxvYWRlZF9BUkcpKSB7CisJCWNtZC0+Y3VycmVudF9zZXR0aW5ncy5hY3RpdmF0aW9uID0KKwkJICAgIGFyZ19pbnRfdmFsdWUoY21kLCBkcml2ZXJsb2FkZWRfQVJHLAorCQkJCSAgY21kLT5kZWZhdWx0X3NldHRpbmdzLmFjdGl2YXRpb24pOworCX0KKworCWNtZC0+Y3VycmVudF9zZXR0aW5ncy5hcmNoaXZlID0gYXJnX2ludF92YWx1ZShjbWQsIGF1dG9iYWNrdXBfQVJHLCBjbWQtPmN1cnJlbnRfc2V0dGluZ3MuYXJjaGl2ZSk7CisJY21kLT5jdXJyZW50X3NldHRpbmdzLmJhY2t1cCA9IGFyZ19pbnRfdmFsdWUoY21kLCBhdXRvYmFja3VwX0FSRywgY21kLT5jdXJyZW50X3NldHRpbmdzLmJhY2t1cCk7CisJY21kLT5jdXJyZW50X3NldHRpbmdzLmNhY2hlX3ZnbWV0YWRhdGEgPSBjbWQtPmNvbW1hbmQtPmZsYWdzICYgQ0FDSEVfVkdNRVRBREFUQSA/IDEgOiAwOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZWFkb25seV9BUkcpKSB7CisJCWNtZC0+Y3VycmVudF9zZXR0aW5ncy5hY3RpdmF0aW9uID0gMDsKKwkJY21kLT5jdXJyZW50X3NldHRpbmdzLmFyY2hpdmUgPSAwOworCQljbWQtPmN1cnJlbnRfc2V0dGluZ3MuYmFja3VwID0gMDsKKwl9CisKKwlpZiAoY21kLT5jb21tYW5kLT5mbGFncyAmIExPQ0tEX1ZHX1NIKQorCQljbWQtPmxvY2tkX3ZnX2RlZmF1bHRfc2ggPSAxOworCisJY21kLT5wYXJ0aWFsX2FjdGl2YXRpb24gPSAwOworCWNtZC0+ZGVncmFkZWRfYWN0aXZhdGlvbiA9IDA7CisJYWN0aXZhdGlvbl9tb2RlID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBhY3RpdmF0aW9uX21vZGVfQ0ZHLCBOVUxMKTsKKwlpZiAoIWFjdGl2YXRpb25fbW9kZSkKKwkJYWN0aXZhdGlvbl9tb2RlID0gREVGQVVMVF9BQ1RJVkFUSU9OX01PREU7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2YXRpb25tb2RlX0FSRykpIHsKKwkJYWN0aXZhdGlvbl9tb2RlID0gYXJnX3N0cl92YWx1ZShjbWQsIGFjdGl2YXRpb25tb2RlX0FSRywKKwkJCQkJCWFjdGl2YXRpb25fbW9kZSk7CisKKwkJLyogY29tcGxhaW4gb25seSBpZiB0aGUgdHdvIGFyZ3VtZW50cyBjb25mbGljdCAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIHBhcnRpYWxfQVJHKSAmJgorCQkgICAgc3RyY21wKGFjdGl2YXRpb25fbW9kZSwgInBhcnRpYWwiKSkgeworCQkJbG9nX2Vycm9yKCItLXBhcnRpYWwgYW5kIC0tYWN0aXZhdGlvbm1vZGUgYXJlIG11dHVhbGx5IgorCQkJCSAgIiBleGNsdXNpdmUgYXJndW1lbnRzIik7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKwl9IGVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCBwYXJ0aWFsX0FSRykpCisJCWFjdGl2YXRpb25fbW9kZSA9ICJwYXJ0aWFsIjsKKworCWlmICghc3RyY21wKGFjdGl2YXRpb25fbW9kZSwgInBhcnRpYWwiKSkgeworCQljbWQtPnBhcnRpYWxfYWN0aXZhdGlvbiA9IDE7CisJCWxvZ193YXJuKCJQQVJUSUFMIE1PREUuIEluY29tcGxldGUgbG9naWNhbCB2b2x1bWVzIHdpbGwgYmUgcHJvY2Vzc2VkLiIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChhY3RpdmF0aW9uX21vZGUsICJkZWdyYWRlZCIpKQorCQljbWQtPmRlZ3JhZGVkX2FjdGl2YXRpb24gPSAxOworCWVsc2UgaWYgKHN0cmNtcChhY3RpdmF0aW9uX21vZGUsICJjb21wbGV0ZSIpKSB7CisJCWxvZ19lcnJvcigiSW52YWxpZCBhY3RpdmF0aW9uIG1vZGUgZ2l2ZW4uIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGlnbm9yZWxvY2tpbmdmYWlsdXJlX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIHN5c2luaXRfQVJHKSkKKwkJaW5pdF9pZ25vcmVsb2NraW5nZmFpbHVyZSgxKTsKKwllbHNlCisJCWluaXRfaWdub3JlbG9ja2luZ2ZhaWx1cmUoMCk7CisKKwljbWQtPmlnbm9yZV9jbHVzdGVyZWRfdmdzID0gYXJnX2lzX3NldChjbWQsIGlnbm9yZXNraXBwZWRjbHVzdGVyX0FSRyk7CisJY21kLT5pbmNsdWRlX2ZvcmVpZ25fdmdzID0gYXJnX2lzX3NldChjbWQsIGZvcmVpZ25fQVJHKSA/IDEgOiAwOworCWNtZC0+aW5jbHVkZV9zaGFyZWRfdmdzID0gYXJnX2lzX3NldChjbWQsIHNoYXJlZF9BUkcpID8gMSA6IDA7CisJY21kLT5pbmNsdWRlX2hpc3RvcmljYWxfbHZzID0gYXJnX2lzX3NldChjbWQsIGhpc3RvcnlfQVJHKSA/IDEgOiAwOworCWNtZC0+cmVjb3JkX2hpc3RvcmljYWxfbHZzID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgbWV0YWRhdGFfcmVjb3JkX2x2c19oaXN0b3J5X0NGRywgTlVMTCkgPworCQkJCQkJCSAgKGFyZ19pc19zZXQoY21kLCBub2hpc3RvcnlfQVJHKSA/IDAgOiAxKSA6IDA7CisKKwkvKgorCSAqIFRoaXMgaXMgc2V0IHRvIHplcm8gYnkgcHJvY2Vzc19lYWNoIHdoaWNoIHdhbnRzIHRvIHByaW50IGVycm9ycworCSAqIGl0c2VsZiByYXRoZXIgdGhhbiBoYXZpbmcgdGhlbSBwcmludGVkIGluIHZnX3JlYWQuCisJICovCisJY21kLT52Z19yZWFkX3ByaW50X2FjY2Vzc19lcnJvciA9IDE7CisJCQorCWlmIChhcmdfaXNfc2V0KGNtZCwgbm9zdWZmaXhfQVJHKSkKKwkJY21kLT5jdXJyZW50X3NldHRpbmdzLnN1ZmZpeCA9IDA7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHVuaXRzX0FSRykpCisJCWlmICghKGNtZC0+Y3VycmVudF9zZXR0aW5ncy51bml0X2ZhY3RvciA9CisJCSAgICAgIGRtX3VuaXRzX3RvX2ZhY3Rvcihhcmdfc3RyX3ZhbHVlKGNtZCwgdW5pdHNfQVJHLCAiIiksCisJCQkJCSAmY21kLT5jdXJyZW50X3NldHRpbmdzLnVuaXRfdHlwZSwgMSwgTlVMTCkpKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgdW5pdHMgc3BlY2lmaWNhdGlvbiIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGJpbmFyeV9BUkcpKQorCQljbWQtPnJlcG9ydF9iaW5hcnlfdmFsdWVzX2FzX251bWVyaWMgPSAxOworCisJaWYgKGFyZ19pc19zZXQoY21kLCB0cnVzdGNhY2hlX0FSRykpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSkgeworCQkJbG9nX2Vycm9yKCItLXRydXN0Y2FjaGUgaXMgaW5jb21wYXRpYmxlIHdpdGggLS1hbGwiKTsKKwkJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwkJfQorCQlpbml0X3RydXN0X2NhY2hlKDEpOworCQlsb2dfd2FybigiV0FSTklORzogQ2FjaGUgZmlsZSBvZiBQVnMgd2lsbCBiZSB0cnVzdGVkLiAgIgorCQkJICAiTmV3IGRldmljZXMgaG9sZGluZyBQVnMgbWF5IGdldCBpZ25vcmVkLiIpOworCX0gZWxzZQorCQlpbml0X3RydXN0X2NhY2hlKDApOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBub3VkZXZzeW5jX0FSRykpCisJCWNtZC0+Y3VycmVudF9zZXR0aW5ncy51ZGV2X3N5bmMgPSAwOworCisJLyogSGFuZGxlIHN5bm9ueW1zICovCisJaWYgKCFfbWVyZ2Vfc3lub255bShjbWQsIHJlc2l6YWJsZV9BUkcsIHJlc2l6ZWFibGVfQVJHKSB8fAorCSAgICAhX21lcmdlX3N5bm9ueW0oY21kLCBhbGxvY2F0aW9uX0FSRywgYWxsb2NhdGFibGVfQVJHKSB8fAorCSAgICAhX21lcmdlX3N5bm9ueW0oY21kLCBhbGxvY2F0aW9uX0FSRywgcmVzaXplYWJsZV9BUkcpIHx8CisJICAgICFfbWVyZ2Vfc3lub255bShjbWQsIHZpcnR1YWxvcmlnaW5zaXplX0FSRywgdmlydHVhbHNpemVfQVJHKSB8fAorCSAgICAhX21lcmdlX3N5bm9ueW0oY21kLCBhdmFpbGFibGVfQVJHLCBhY3RpdmF0ZV9BUkcpIHx8CisJICAgICFfbWVyZ2Vfc3lub255bShjbWQsIHJhaWRzeW5jYWN0aW9uX0FSRywgc3luY2FjdGlvbl9BUkcpIHx8CisJICAgICFfbWVyZ2Vfc3lub255bShjbWQsIHJhaWR3cml0ZW1vc3RseV9BUkcsIHdyaXRlbW9zdGx5X0FSRykgfHwKKwkgICAgIV9tZXJnZV9zeW5vbnltKGNtZCwgcmFpZG1pbnJlY292ZXJ5cmF0ZV9BUkcsIG1pbnJlY292ZXJ5cmF0ZV9BUkcpIHx8CisJICAgICFfbWVyZ2Vfc3lub255bShjbWQsIHJhaWRtYXhyZWNvdmVyeXJhdGVfQVJHLCBtYXhyZWNvdmVyeXJhdGVfQVJHKSB8fAorCSAgICAhX21lcmdlX3N5bm9ueW0oY21kLCByYWlkd3JpdGViZWhpbmRfQVJHLCB3cml0ZWJlaGluZF9BUkcpKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlpZiAoKCFzdHJuY21wKGNtZC0+Y29tbWFuZC0+bmFtZSwgInB2IiwgMikgJiYKKwkgICAgIV9tZXJnZV9zeW5vbnltKGNtZCwgbWV0YWRhdGFjb3BpZXNfQVJHLCBwdm1ldGFkYXRhY29waWVzX0FSRykpIHx8CisJICAgICghc3RybmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJ2ZyIsIDIpICYmCisJICAgICAhX21lcmdlX3N5bm9ueW0oY21kLCBtZXRhZGF0YWNvcGllc19BUkcsIHZnbWV0YWRhdGFjb3BpZXNfQVJHKSkpCisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKworCS8qIFplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19jb21tb25fY29tbWFuZHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJaWYgKGFyZ19pc19zZXQoY21kLCBoZWxwX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGhlbHAyX0FSRykpIHsKKwkJX3VzYWdlKGNtZC0+Y29tbWFuZC0+bmFtZSk7CisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHZlcnNpb25fQVJHKSkgeworCQlyZXR1cm4gdmVyc2lvbihjbWQsIDAsIChjaGFyICoqKSBOVUxMKTsKKwl9CisKKwkvKiBaZXJvIGluZGljYXRlcyBpdCdzIE9LIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhpcyBjb21tYW5kICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9kaXNwbGF5X2hlbHAodm9pZCkKK3sKKwlpbnQgaTsKKworCWxvZ19lcnJvcigiQXZhaWxhYmxlIGx2bSBjb21tYW5kczoiKTsKKwlsb2dfZXJyb3IoIlVzZSAnbHZtIGhlbHAgPGNvbW1hbmQ+JyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIpOworCWxvZ19lcnJvcigiICIpOworCisJZm9yIChpID0gMDsgaSA8IF9jbWRsaW5lLm51bV9jb21tYW5kczsgaSsrKSB7CisJCXN0cnVjdCBjb21tYW5kICpjb20gPSBfY21kbGluZS5jb21tYW5kcyArIGk7CisKKwkJbG9nX2Vycm9yKCIlLTE2LjE2cyVzIiwgY29tLT5uYW1lLCBjb20tPmRlc2MpOworCX0KK30KKworaW50IGhlbHAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisKKwlpZiAoIWFyZ2MpCisJCV9kaXNwbGF5X2hlbHAoKTsKKwllbHNlIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCQlpZiAoIV91c2FnZShhcmd2W2ldKSkKKwkJCQlyZXQgPSBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfYXBwbHlfc2V0dGluZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJaW5pdF9kZWJ1ZyhjbWQtPmN1cnJlbnRfc2V0dGluZ3MuZGVidWcpOworCWluaXRfZGVidWdfY2xhc3Nlc19sb2dnZWQoY21kLT5kZWZhdWx0X3NldHRpbmdzLmRlYnVnX2NsYXNzZXMpOworCWluaXRfdmVyYm9zZShjbWQtPmN1cnJlbnRfc2V0dGluZ3MudmVyYm9zZSArIFZFUkJPU0VfQkFTRV9MRVZFTCk7CisJaW5pdF9zaWxlbnQoY21kLT5jdXJyZW50X3NldHRpbmdzLnNpbGVudCk7CisJaW5pdF90ZXN0KGNtZC0+Y3VycmVudF9zZXR0aW5ncy50ZXN0KTsKKwlpbml0X2Z1bGxfc2Nhbl9kb25lKDApOworCWluaXRfbWlycm9yX2luX3N5bmMoMCk7CisJaW5pdF9kbWV2ZW50ZF9tb25pdG9yKERFRkFVTFRfRE1FVkVOVERfTU9OSVRPUik7CisKKwlpbml0X21zZ19wcmVmaXgoY21kLT5kZWZhdWx0X3NldHRpbmdzLm1zZ19wcmVmaXgpOworCWluaXRfY21kX25hbWUoY21kLT5kZWZhdWx0X3NldHRpbmdzLmNtZF9uYW1lKTsKKworCWFyY2hpdmVfZW5hYmxlKGNtZCwgY21kLT5jdXJyZW50X3NldHRpbmdzLmFyY2hpdmUpOworCWJhY2t1cF9lbmFibGUoY21kLCBjbWQtPmN1cnJlbnRfc2V0dGluZ3MuYmFja3VwKTsKKworCXNldF9hY3RpdmF0aW9uKGNtZC0+Y3VycmVudF9zZXR0aW5ncy5hY3RpdmF0aW9uLCBjbWQtPm1ldGFkYXRhX3JlYWRfb25seSk7CisKKwljbWQtPmZtdCA9IGdldF9mb3JtYXRfYnlfbmFtZShjbWQsIGFyZ19zdHJfdmFsdWUoY21kLCBtZXRhZGF0YXR5cGVfQVJHLAorCQkJCSAgICAgIGNtZC0+Y3VycmVudF9zZXR0aW5ncy5mbXRfbmFtZSkpOworCisJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9jb3B5X2NvbW1hbmRfbGluZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBzcGFjZTsKKworCS8qCisJICogQnVpbGQgdXAgdGhlIGNvbXBsZXRlIGNvbW1hbmQgbGluZSwgdXNlZCBhcyBhCisJICogZGVzY3JpcHRpb24gZm9yIGJhY2t1cHMuCisJICovCisJaWYgKCFkbV9wb29sX2JlZ2luX29iamVjdChjbWQtPm1lbSwgMTI4KSkKKwkJZ290b19iYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCXNwYWNlID0gc3RyY2hyKGFyZ3ZbaV0sICcgJykgPyAxIDogMDsKKworCQlpZiAoc3BhY2UgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QoY21kLT5tZW0sICInIiwgMSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QoY21kLT5tZW0sIGFyZ3ZbaV0sIHN0cmxlbihhcmd2W2ldKSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoc3BhY2UgJiYgIWRtX3Bvb2xfZ3Jvd19vYmplY3QoY21kLT5tZW0sICInIiwgMSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoaSA8IChhcmdjIC0gMSkpCisJCQlpZiAoIWRtX3Bvb2xfZ3Jvd19vYmplY3QoY21kLT5tZW0sICIgIiwgMSkpCisJCQkJZ290b19iYWQ7CisJfQorCisJLyoKKwkgKiBUZXJtaW5hdGUuCisJICovCisJaWYgKCFkbV9wb29sX2dyb3dfb2JqZWN0KGNtZC0+bWVtLCAiXDAiLCAxKSkKKwkJZ290b19iYWQ7CisKKwlyZXR1cm4gZG1fcG9vbF9lbmRfb2JqZWN0KGNtZC0+bWVtKTsKKworICAgICAgYmFkOgorCWxvZ19lcnJvcigiQ291bGRuJ3QgY29weSBjb21tYW5kIGxpbmUuIik7CisJZG1fcG9vbF9hYmFuZG9uX29iamVjdChjbWQtPm1lbSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX3ByZXBhcmVfcHJvZmlsZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgQ09NTUFORF9QUk9GSUxFX0VOVl9WQVJfTkFNRVtdID0gIkxWTV9DT01NQU5EX1BST0ZJTEUiOworCXN0YXRpYyBjb25zdCBjaGFyIF9jbWRfcHJvZmlsZV9hcmdfcHJlZmVycmVkX292ZXJfZW52X3Zhcl9tc2dbXSA9ICJHaXZpbmcgIgorCQkJCSJwcmVmZXJlbmNlIHRvIGNvbW1hbmQgcHJvZmlsZSBzcGVjaWZpZWQgb24gY29tbWFuZCAiCisJCQkJImxpbmUgb3ZlciB0aGUgb25lIHNwZWNpZmllZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGUuIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfZmFpbGVkX3RvX2FkZF9wcm9maWxlX21zZ1tdID0gIkZhaWxlZCB0byBhZGQgJXMgJXMuIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfZmFpbGVkX3RvX2FwcGx5X3Byb2ZpbGVfbXNnW10gPSAiRmFpbGVkIHRvIGFwcGx5ICVzICVzLiI7CisJc3RhdGljIGNvbnN0IGNoYXIgX2NvbW1hbmRfcHJvZmlsZV9zb3VyY2VfbmFtZVtdID0gImNvbW1hbmQgcHJvZmlsZSI7CisJc3RhdGljIGNvbnN0IGNoYXIgX21ldGFkYXRhX3Byb2ZpbGVfc291cmNlX25hbWVbXSA9ICJtZXRhZGF0YSBwcm9maWxlIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfc2V0dGluZ19nbG9iYWxfcHJvZmlsZV9tc2dbXSA9ICJTZXR0aW5nIGdsb2JhbCAlcyBcIiVzXCIuIjsKKworCWNvbnN0IGNoYXIgKmVudl9jbWRfcHJvZmlsZV9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBwcm9maWxlICpwcm9maWxlOworCWNvbmZpZ19zb3VyY2VfdCBzb3VyY2U7CisJY29uc3QgY2hhciAqc291cmNlX25hbWU7CisKKwkvKiBDaGVjayB3aGV0aGVyIGRlZmF1bHQgZ2xvYmFsIGNvbW1hbmQgcHJvZmlsZSBpcyBzZXQgdmlhIGVudi4gdmFyLiAqLworCWlmICgoZW52X2NtZF9wcm9maWxlX25hbWUgPSBnZXRlbnYoQ09NTUFORF9QUk9GSUxFX0VOVl9WQVJfTkFNRSkpKSB7CisJCWlmICghKmVudl9jbWRfcHJvZmlsZV9uYW1lKQorCQkJZW52X2NtZF9wcm9maWxlX25hbWUgPSBOVUxMOworCQllbHNlCisJCQlsb2dfZGVidWcoIkNvbW1hbmQgcHJvZmlsZSAnJXMnIHJlcXVlc3RlZCB2aWEgIgorCQkJCSAgImVudmlyb25tZW50IHZhcmlhYmxlLiIsCisJCQkJICAgZW52X2NtZF9wcm9maWxlX25hbWUpOworCX0KKworCWlmICghYXJnX2lzX3NldChjbWQsIHByb2ZpbGVfQVJHKSAmJgorCSAgICAhYXJnX2lzX3NldChjbWQsIGNvbW1hbmRwcm9maWxlX0FSRykgJiYKKwkgICAgIWFyZ19pc19zZXQoY21kLCBtZXRhZGF0YXByb2ZpbGVfQVJHKSAmJgorCSAgICAhZW52X2NtZF9wcm9maWxlX25hbWUpCisJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJcmV0dXJuIDE7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHByb2ZpbGVfQVJHKSkgeworCQkvKgorCQkgKiBJZiAtLXByb2ZpbGUgaXMgdXNlZCB3aXRoIGR1bXBjb25maWcsIGl0J3MgdXNlZAorCQkgKiB0byBkdW1wIHRoZSBwcm9maWxlIHdpdGhvdXQgdGhlIHByb2ZpbGUgYmVpbmcgYXBwbGllZC4KKwkJICovCisJCWlmICghc3RyY21wKGNtZC0+Y29tbWFuZC0+bmFtZSwgImR1bXBjb25maWciKSB8fAorCQkgICAgIXN0cmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJsdm1jb25maWciKSB8fAorCQkgICAgIXN0cmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJjb25maWciKSkKKwkJCXJldHVybiAxOworCisJCS8qCisJCSAqIElmIC0tcHJvZmlsZSBpcyB1c2VkIHdpdGggbHZjcmVhdGUvbHZjaGFuZ2UvdmdjaGFuZ2UsCisJCSAqIGl0J3MgcmVjb2duaXplZCBhcyBzaG9ydGN1dCB0byAtLW1ldGFkYXRhcHJvZmlsZS4KKwkJICogVGhlIC0tY29tbWFuZHByb2ZpbGUgaXMgYXNzdW1lZCBvdGhlcndpc2UuCisJCSAqLworCQlpZiAoIXN0cmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJsdmNyZWF0ZSIpIHx8CisJCSAgICAhc3RyY21wKGNtZC0+Y29tbWFuZC0+bmFtZSwgInZnY3JlYXRlIikgfHwKKwkJICAgICFzdHJjbXAoY21kLT5jb21tYW5kLT5uYW1lLCAibHZjaGFuZ2UiKSB8fAorCQkgICAgIXN0cmNtcChjbWQtPmNvbW1hbmQtPm5hbWUsICJ2Z2NoYW5nZSIpKSB7CisJCQlpZiAoYXJnX2lzX3NldChjbWQsIG1ldGFkYXRhcHJvZmlsZV9BUkcpKSB7CisJCQkJbG9nX2Vycm9yKCJPbmx5IG9uZSBvZiAtLXByb2ZpbGUgb3IgIgorCQkJCQkgICIgLS1tZXRhZGF0YXByb2ZpbGUgYWxsb3dlZC4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNvdXJjZSA9IENPTkZJR19QUk9GSUxFX01FVEFEQVRBOworCQkJc291cmNlX25hbWUgPSBfbWV0YWRhdGFfcHJvZmlsZV9zb3VyY2VfbmFtZTsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChhcmdfaXNfc2V0KGNtZCwgY29tbWFuZHByb2ZpbGVfQVJHKSkgeworCQkJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLS1wcm9maWxlIG9yICIKKwkJCQkJICAiLS1jb21tYW5kcHJvZmlsZSBhbGxvd2VkLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIFByZWZlciBjb21tYW5kIHByb2ZpbGUgc3BlY2lmaWVkIG9uIGNvbW1hbmQKKwkJCSAqIGxpbmUgb3ZlciB0aGUgcHJvZmlsZSBzcGVjaWZpZWQgdmlhCisJCQkgKiBDT01NQU5EX1BST0ZJTEVfRU5WX1ZBUl9OQU1FIGVudi4gdmFyLgorCQkJICovCisJCQlpZiAoZW52X2NtZF9wcm9maWxlX25hbWUpIHsKKwkJCQlsb2dfZGVidWcoX2NtZF9wcm9maWxlX2FyZ19wcmVmZXJyZWRfb3Zlcl9lbnZfdmFyX21zZyk7CisJCQkJZW52X2NtZF9wcm9maWxlX25hbWUgPSBOVUxMOworCQkJfQorCQkJc291cmNlID0gQ09ORklHX1BST0ZJTEVfQ09NTUFORDsKKwkJCXNvdXJjZV9uYW1lID0gX2NvbW1hbmRfcHJvZmlsZV9zb3VyY2VfbmFtZTsKKwkJfQorCisJCW5hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgcHJvZmlsZV9BUkcsIE5VTEwpOworCisJCWlmICghKHByb2ZpbGUgPSBhZGRfcHJvZmlsZShjbWQsIG5hbWUsIHNvdXJjZSkpKSB7CisJCQlsb2dfZXJyb3IoX2ZhaWxlZF90b19hZGRfcHJvZmlsZV9tc2csIHNvdXJjZV9uYW1lLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHNvdXJjZSA9PSBDT05GSUdfUFJPRklMRV9DT01NQU5EKSB7CisJCQlsb2dfZGVidWcoX3NldHRpbmdfZ2xvYmFsX3Byb2ZpbGVfbXNnLCBfY29tbWFuZF9wcm9maWxlX3NvdXJjZV9uYW1lLCBwcm9maWxlLT5uYW1lKTsKKwkJCWNtZC0+cHJvZmlsZV9wYXJhbXMtPmdsb2JhbF9jb21tYW5kX3Byb2ZpbGUgPSBwcm9maWxlOworCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSBDT05GSUdfUFJPRklMRV9NRVRBREFUQSkgeworCQkJbG9nX2RlYnVnKF9zZXR0aW5nX2dsb2JhbF9wcm9maWxlX21zZywgX21ldGFkYXRhX3Byb2ZpbGVfc291cmNlX25hbWUsIHByb2ZpbGUtPm5hbWUpOworCQkJLyogVGhpcyBwcm9maWxlIHdpbGwgb3ZlcnJpZGUgYW55IFZHL0xWLWJhc2VkIHByb2ZpbGUgaWYgcHJlc2VudCAqLworCQkJY21kLT5wcm9maWxlX3BhcmFtcy0+Z2xvYmFsX21ldGFkYXRhX3Byb2ZpbGUgPSBwcm9maWxlOworCQl9CisKKwkJaWYgKCFvdmVycmlkZV9jb25maWdfdHJlZV9mcm9tX3Byb2ZpbGUoY21kLCBwcm9maWxlKSkgeworCQkJbG9nX2Vycm9yKF9mYWlsZWRfdG9fYXBwbHlfcHJvZmlsZV9tc2csIHNvdXJjZV9uYW1lLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNvbW1hbmRwcm9maWxlX0FSRykgfHwgZW52X2NtZF9wcm9maWxlX25hbWUpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBjb21tYW5kcHJvZmlsZV9BUkcpKSB7CisJCQkvKgorCQkJICogUHJlZmVyIGNvbW1hbmQgcHJvZmlsZSBzcGVjaWZpZWQgb24gY29tbWFuZAorCQkJICogbGluZSBvdmVyIHRoZSBwcm9maWxlIHNwZWNpZmllZCB2aWEKKwkJCSAqIENPTU1BTkRfUFJPRklMRV9FTlZfVkFSX05BTUUgZW52LiB2YXIuCisJCQkgKi8KKwkJCWlmIChlbnZfY21kX3Byb2ZpbGVfbmFtZSkKKwkJCQlsb2dfZGVidWcoX2NtZF9wcm9maWxlX2FyZ19wcmVmZXJyZWRfb3Zlcl9lbnZfdmFyX21zZyk7CisJCQluYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIGNvbW1hbmRwcm9maWxlX0FSRywgTlVMTCk7CisJCX0gZWxzZQorCQkJbmFtZSA9IGVudl9jbWRfcHJvZmlsZV9uYW1lOworCQlzb3VyY2VfbmFtZSA9IF9jb21tYW5kX3Byb2ZpbGVfc291cmNlX25hbWU7CisKKwkJaWYgKCEocHJvZmlsZSA9IGFkZF9wcm9maWxlKGNtZCwgbmFtZSwgQ09ORklHX1BST0ZJTEVfQ09NTUFORCkpKSB7CisJCQlsb2dfZXJyb3IoX2ZhaWxlZF90b19hZGRfcHJvZmlsZV9tc2csIHNvdXJjZV9uYW1lLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9wcm9maWxlKGNtZCwgcHJvZmlsZSkpIHsKKwkJCWxvZ19lcnJvcihfZmFpbGVkX3RvX2FwcGx5X3Byb2ZpbGVfbXNnLCBzb3VyY2VfbmFtZSwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxvZ19kZWJ1Zyhfc2V0dGluZ19nbG9iYWxfcHJvZmlsZV9tc2csIF9jb21tYW5kX3Byb2ZpbGVfc291cmNlX25hbWUsIHByb2ZpbGUtPm5hbWUpOworCQljbWQtPnByb2ZpbGVfcGFyYW1zLT5nbG9iYWxfY29tbWFuZF9wcm9maWxlID0gcHJvZmlsZTsKKwl9CisKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykpIHsKKwkJbmFtZSA9IGFyZ19zdHJfdmFsdWUoY21kLCBtZXRhZGF0YXByb2ZpbGVfQVJHLCBOVUxMKTsKKwkJc291cmNlX25hbWUgPSBfbWV0YWRhdGFfcHJvZmlsZV9zb3VyY2VfbmFtZTsKKworCQlpZiAoIShwcm9maWxlID0gYWRkX3Byb2ZpbGUoY21kLCBuYW1lLCBDT05GSUdfUFJPRklMRV9NRVRBREFUQSkpKSB7CisJCQlsb2dfZXJyb3IoX2ZhaWxlZF90b19hZGRfcHJvZmlsZV9tc2csIHNvdXJjZV9uYW1lLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9wcm9maWxlKGNtZCwgcHJvZmlsZSkpIHsKKwkJCWxvZ19lcnJvcihfZmFpbGVkX3RvX2FwcGx5X3Byb2ZpbGVfbXNnLCBzb3VyY2VfbmFtZSwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxvZ19kZWJ1Zyhfc2V0dGluZ19nbG9iYWxfcHJvZmlsZV9tc2csIF9tZXRhZGF0YV9wcm9maWxlX3NvdXJjZV9uYW1lLCBwcm9maWxlLT5uYW1lKTsKKwkJY21kLT5wcm9maWxlX3BhcmFtcy0+Z2xvYmFsX21ldGFkYXRhX3Byb2ZpbGUgPSBwcm9maWxlOworCX0KKworCWlmICghcHJvY2Vzc19wcm9maWxhYmxlX2NvbmZpZyhjbWQpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9pbml0X2x2bWxvY2tkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IGNoYXIgKmx2bWxvY2tkX3NvY2tldDsKKwlpbnQgdXNlX2x2bWxvY2tkID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZ2xvYmFsX3VzZV9sdm1sb2NrZF9DRkcsIE5VTEwpOworCisJaWYgKHVzZV9sdm1sb2NrZCAmJiBhcmdfaXNfc2V0KGNtZCwgbm9sb2NraW5nX0FSRykpIHsKKwkJLyogLS1ub2xvY2tpbmcgaXMgb25seSBhbGxvd2VkIHdpdGggdmdzL2x2cy9wdnMgY29tbWFuZHMgKi8KKwkJY21kLT5sb2NrZF9nbF9kaXNhYmxlID0gMTsKKwkJY21kLT5sb2NrZF92Z19kaXNhYmxlID0gMTsKKwkJY21kLT5sb2NrZF9sdl9kaXNhYmxlID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVzZV9sdm1sb2NrZCAmJiBsb2NraW5nX2lzX2NsdXN0ZXJlZCgpKSB7CisJCWxvZ19lcnJvcigiRVJST1I6IGNvbmZpZ3VyYXRpb24gc2V0dGluZyB1c2VfbHZtbG9ja2QgY2Fubm90IGJlIHVzZWQgd2l0aCBjbHVzdGVyZWQgbG9ja2luZ190eXBlIDMuIik7CisJCXJldHVybiAwOworCX0KKworCWx2bWxvY2tkX2Rpc2Nvbm5lY3QoKTsgLyogc3RhcnQgb3ZlciB3aGVuIHRvb2wgY29udGV4dCBpcyByZWZyZXNoZWQgKi8KKwlsdm1sb2NrZF9zb2NrZXQgPSBnZXRlbnYoIkxWTV9MVk1MT0NLRF9TT0NLRVQiKTsKKwlpZiAoIWx2bWxvY2tkX3NvY2tldCkKKwkJbHZtbG9ja2Rfc29ja2V0ID0gREVGQVVMVF9SVU5fRElSICIvbHZtbG9ja2Quc29ja2V0IjsKKworCWx2bWxvY2tkX3NldF9zb2NrZXQobHZtbG9ja2Rfc29ja2V0KTsKKwlsdm1sb2NrZF9zZXRfdXNlKHVzZV9sdm1sb2NrZCk7CisJaWYgKHVzZV9sdm1sb2NrZCkgeworCQlsdm1sb2NrZF9pbml0KGNtZCk7CisJCWx2bWxvY2tkX2Nvbm5lY3QoKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfY21kX25vX21ldGFfcHJvYyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwlyZXR1cm4gY21kLT5jb21tYW5kLT5mbGFncyAmIE5PX01FVEFEQVRBX1BST0NFU1NJTkc7Cit9CisKK2ludCBsdm1fcnVuX2NvbW1hbmQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZG1fY29uZmlnX3RyZWUgKmNvbmZpZ19zdHJpbmdfY2Z0LCAqY29uZmlnX3Byb2ZpbGVfY29tbWFuZF9jZnQsICpjb25maWdfcHJvZmlsZV9tZXRhZGF0YV9jZnQ7CisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbG9ja2luZ190eXBlOworCWludCBtb25pdG9yaW5nOworCWNoYXIgKmFyZ19uZXcsICphcmc7CisJaW50IGk7CisJaW50IHNraXBfaHlwaGVuczsKKwlpbnQgcmVmcmVzaF9kb25lID0gMDsKKworCWluaXRfZXJyb3JfbWVzc2FnZV9wcm9kdWNlZCgwKTsKKworCS8qIGVhY2ggY29tbWFuZCBzaG91bGQgc3RhcnQgb3V0IHdpdGggc2lnaW50IGZsYWcgY2xlYXJlZCAqLworCXNpZ2ludF9jbGVhcigpOworCisJLyogZWxpbWluYXRlICctJyBmcm9tIGFsbCBvcHRpb25zIHN0YXJ0aW5nIHdpdGggLS0gKi8KKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisKKwkJYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZysrICE9ICctJyB8fCAqYXJnKysgIT0gJy0nKQorCQkJY29udGludWU7CisKKwkJLyogSWYgd2UgcmVhY2ggIi0tIiB0aGVuIHN0b3AuICovCisJCWlmICghKmFyZykKKwkJCWJyZWFrOworCisJCWFyZ19uZXcgPSBhcmc7CisJCXNraXBfaHlwaGVucyA9IDE7CisJCXdoaWxlICgqYXJnKSB7CisJCQkvKiBJZiB3ZSBlbmNvdW50ZXIgJz0nLCBzdG9wIGFueSBmdXJ0aGVyIGh5cGhlbiByZW1vdmFsLiAqLworCQkJaWYgKCphcmcgPT0gJz0nKQorCQkJCXNraXBfaHlwaGVucyA9IDA7CisKKwkJCS8qIERvIHdlIG5lZWQgdG8ga2VlcCB0aGUgbmV4dCBjaGFyYWN0ZXI/ICovCisJCQlpZiAoKmFyZyAhPSAnLScgfHwgIXNraXBfaHlwaGVucykgeworCQkJCWlmIChhcmdfbmV3ICE9IGFyZykKKwkJCQkJKmFyZ19uZXcgPSAqYXJnOworCQkJCSsrYXJnX25ldzsKKwkJCX0KKwkJCWFyZysrOworCQl9CisKKwkJLyogVGVybWluYXRlIGEgc2hvcnRlbmVkIGFyZyAqLworCQlpZiAoYXJnX25ldyAhPSBhcmcpCisJCQkqYXJnX25ldyA9ICdcMCc7CisJfQorCisJaWYgKCEoY21kLT5jbWRfbGluZSA9IF9jb3B5X2NvbW1hbmRfbGluZShjbWQsIGFyZ2MsIGFyZ3YpKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJbG9nX2RlYnVnKCJQYXJzaW5nOiAlcyIsIGNtZC0+Y21kX2xpbmUpOworCisJaWYgKCEoY21kLT5jb21tYW5kID0gX2ZpbmRfY29tbWFuZChhcmd2WzBdKSkpCisJCXJldHVybiBFTk9fU1VDSF9DTUQ7CisKKwlpZiAoIV9wcm9jZXNzX2NvbW1hbmRfbGluZShjbWQsICZhcmdjLCAmYXJndikpIHsKKwkJbG9nX2Vycm9yKCJFcnJvciBkdXJpbmcgcGFyc2luZyBvZiBjb21tYW5kIGxpbmUuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlzZXRfY21kX25hbWUoY21kLT5jb21tYW5kLT5uYW1lKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYmFja2dyb3VuZGZvcmtfQVJHKSkgeworCQlpZiAoIWJlY29tZV9kYWVtb24oY21kLCAxKSkgeworCQkJLyogcGFyZW50IC0gcXVpdCBpbW1lZGlhdGVseSAqLworCQkJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29uZmlnX0FSRykpCisJCWlmICghb3ZlcnJpZGVfY29uZmlnX3RyZWVfZnJvbV9zdHJpbmcoY21kLCBhcmdfc3RyX3ZhbHVlKGNtZCwgY29uZmlnX0FSRywgIiIpKSkgeworCQkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQlnb3RvX291dDsKKwkJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb25maWdfQVJHKSB8fCAhY21kLT5pbml0aWFsaXplZC5jb25maWcgfHwgY29uZmlnX2ZpbGVzX2NoYW5nZWQoY21kKSkgeworCQkvKiBSZWluaXRpYWxpc2UgdmFyaW91cyBzZXR0aW5ncyBpbmMuIGxvZ2dpbmcsIGZpbHRlcnMgKi8KKwkJaWYgKCFyZWZyZXNoX3Rvb2xjb250ZXh0KGNtZCkpIHsKKwkJCWlmICgoY29uZmlnX3N0cmluZ19jZnQgPSByZW1vdmVfY29uZmlnX3RyZWVfYnlfc291cmNlKGNtZCwgQ09ORklHX1NUUklORykpKQorCQkJCWRtX2NvbmZpZ19kZXN0cm95KGNvbmZpZ19zdHJpbmdfY2Z0KTsKKwkJCWxvZ19lcnJvcigiVXBkYXRlZCBjb25maWcgZmlsZSBpbnZhbGlkLiBBYm9ydGluZy4iKTsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCQlyZWZyZXNoX2RvbmUgPSAxOworCX0KKworCWlmICghX3ByZXBhcmVfcHJvZmlsZXMoY21kKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCFjbWQtPmluaXRpYWxpemVkLmNvbm5lY3Rpb25zICYmICFfY21kX25vX21ldGFfcHJvYyhjbWQpICYmICFpbml0X2Nvbm5lY3Rpb25zKGNtZCkpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCS8qIE5vdGU6IExvYWQgcGVyc2lzdGVudCBjYWNoZSBvbmx5IGlmIHdlIGhhdmVuJ3QgcmVmcmVzaGVkIHRvb2xjb250ZXh0IQorCSAqICAgICAgIElmIHRvb2xjb250ZXh0IGhhcyBiZWVuIHJlZnJlc2hlZCwgaXQgbWVhbnMgY29uZmlnIGhhcyBjaGFuZ2VkCisJICogICAgICAgYW5kIHdlIGNhbid0IHJlbHkgb24gcGVyc2lzdGVudCBjYWNoZSBhbnltb3JlLgorCSAqLworCWlmICghY21kLT5pbml0aWFsaXplZC5maWx0ZXJzICYmICFfY21kX25vX21ldGFfcHJvYyhjbWQpICYmICFpbml0X2ZpbHRlcnMoY21kLCAhcmVmcmVzaF9kb25lKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZWFkb25seV9BUkcpKQorCQljbWQtPm1ldGFkYXRhX3JlYWRfb25seSA9IDE7CisKKwlpZiAoKHJldCA9IF9nZXRfc2V0dGluZ3MoY21kKSkpCisJCWdvdG9fb3V0OworCV9hcHBseV9zZXR0aW5ncyhjbWQpOworCWlmIChjbWQtPmRlZ3JhZGVkX2FjdGl2YXRpb24pCisJCWxvZ19kZWJ1ZygiREVHUkFERUQgTU9ERS4gSW5jb21wbGV0ZSBSQUlEIExWcyB3aWxsIGJlIHByb2Nlc3NlZC4iKTsKKworCWlmICghZ2V0X2FjdGl2YXRpb25fbW9uaXRvcmluZ19tb2RlKGNtZCwgJm1vbml0b3JpbmcpKQorCQlnb3RvX291dDsKKwlpbml0X2RtZXZlbnRkX21vbml0b3IobW9uaXRvcmluZyk7CisKKwlsb2dfZGVidWcoIlByb2Nlc3Npbmc6ICVzIiwgY21kLT5jbWRfbGluZSk7CisJbG9nX2RlYnVnKCJDb21tYW5kIHBpZDogJWQiLCBnZXRwaWQoKSk7CisJbG9nX2RlYnVnKCJzeXN0ZW0gSUQ6ICVzIiwgY21kLT5zeXN0ZW1faWQgPyA6ICIiKTsKKworI2lmZGVmIE9fRElSRUNUX1NVUFBPUlQKKwlsb2dfZGVidWcoIk9fRElSRUNUIHdpbGwgYmUgdXNlZCIpOworI2VuZGlmCisKKwlpZiAoKHJldCA9IF9wcm9jZXNzX2NvbW1vbl9jb21tYW5kcyhjbWQpKSkgeworCQlpZiAocmV0ICE9IEVDTURfUFJPQ0VTU0VEKQorCQkJc3RhY2s7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc3RyY21wKGNtZC0+Zm10LT5uYW1lLCBGTVRfTFZNMV9OQU1FKSAmJiBsdm1ldGFkX3VzZWQoKSkgeworCQlsb2dfd2FybigiV0FSTklORzogRGlzYWJsaW5nIGx2bWV0YWQgY2FjaGUgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBvYnNvbGV0ZSBtZXRhZGF0YS4iKTsKKwkJbHZtZXRhZF9zZXRfZGlzYWJsZWQoY21kLCAiTFZNMSIpOworCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSBsdm0xIGZvcm1hdCBpcyB1c2VkLiIpOworCQlsdm1ldGFkX21ha2VfdW51c2VkKGNtZCk7CisJfQorCisJaWYgKGNtZC0+bWV0YWRhdGFfcmVhZF9vbmx5ICYmCisJICAgICEoY21kLT5jb21tYW5kLT5mbGFncyAmIFBFUk1JVFRFRF9SRUFEX09OTFkpKSB7CisJCWxvZ19lcnJvcigiJXM6IENvbW1hbmQgbm90IHBlcm1pdHRlZCB3aGlsZSBnbG9iYWwvbWV0YWRhdGFfcmVhZF9vbmx5ICIKKwkJCSAgImlzIHNldC4iLCBjbWQtPmNtZF9saW5lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKF9jbWRfbm9fbWV0YV9wcm9jKGNtZCkpCisJCWxvY2tpbmdfdHlwZSA9IDA7CisJZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIHJlYWRvbmx5X0FSRykpIHsKKwkJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtbG9ja2RfQ0ZHLCBOVUxMKSkgeworCQkJLyoKKwkJCSAqIEZJWE1FOiB3ZSBjb3VsZCB1c2UgbG9ja2luZ190eXBlIDUgaGVyZSBpZiB0aGF0IGRpZG4ndAorCQkJICogY2F1c2UgQ0xVU1RFUkVEIHRvIGJlIHNldCwgd2hpY2ggY29uZmxpY3RzIHdpdGggdXNpbmcgbHZtbG9ja2QuCisJCQkgKi8KKwkJCWxvY2tpbmdfdHlwZSA9IDE7CisJCQljbWQtPmxvY2tkX2dsX2Rpc2FibGUgPSAxOworCQkJY21kLT5sb2NrZF92Z19kaXNhYmxlID0gMTsKKwkJCWNtZC0+bG9ja2RfbHZfZGlzYWJsZSA9IDE7CisJCX0gZWxzZSB7CisJCQlsb2NraW5nX3R5cGUgPSA1OworCQl9CisKKwkJaWYgKGx2bWV0YWRfdXNlZCgpKSB7CisJCQlsdm1ldGFkX21ha2VfdW51c2VkKGNtZCk7CisJCQlsb2dfdmVyYm9zZSgiTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSByZWFkLW9ubHkgaXMgc2V0LiIpOworCQl9CisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgbm9sb2NraW5nX0FSRykpCisJCWxvY2tpbmdfdHlwZSA9IDA7CisJZWxzZQorCQlsb2NraW5nX3R5cGUgPSAtMTsKKworCWlmICghaW5pdF9sb2NraW5nKGxvY2tpbmdfdHlwZSwgY21kLCBfY21kX25vX21ldGFfcHJvYyhjbWQpIHx8IGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykpKSB7CisJCXJldCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwlpZiAoIV9jbWRfbm9fbWV0YV9wcm9jKGNtZCkgJiYgIV9pbml0X2x2bWxvY2tkKGNtZCkpIHsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworCS8qCisJICogcHZzY2FuL3Znc2Nhbi9sdnNjYW4vdmdpbXBvcnQgd2FudCB0aGVpciBvd24gY29udHJvbCBvdmVyIHJlc2Nhbm5pbmcKKwkgKiB0byBwb3B1bGF0ZSBsdm1ldGFkIGFuZCBoYXZlIHNpbWlsYXIgY29kZSBvZiB0aGVpciBvd24uCisJICogT3RoZXIgY29tbWFuZHMgdXNlIHRoaXMgZ2VuZXJhbCBwb2xpY3kgZm9yIHVzaW5nIGx2bWV0YWQuCisJICoKKwkgKiBUaGUgbHZtZXRhZCBjYWNoZSBtYXkgbmVlZCB0byBiZSByZXBvcHVsYXRlZCBiZWZvcmUgd2UgdXNlIGl0IGJlY2F1c2U6CisJICogLSBXZSBhcmUgcmVhZGluZyBmb3JlaWduIFZHcyB3aGljaCBvdGhlcnMgaG9zdHMgbWF5IGhhdmUgY2hhbmdlZAorCSAqICAgd2hpY2ggb3VyIGx2bWV0YWQgd291bGQgbm90IGhhdmUgc2Vlbi4KKwkgKiAtIGx2bWV0YWQgbWF5IGhhdmUganVzdCBiZWVuIHN0YXJ0ZWQgYW5kIG5vIGNvbW1hbmQgaGFzIGJlZW4gcnVuCisJICogICB0byBwb3B1bGF0ZSBpdCB5ZXQgKGUuZy4gbm8gcHZzY2FuIC0tY2FjaGUgd2FzIHJ1bikuCisJICogLSBBbm90aGVyIGxvY2FsIGNvbW1hbmQgbWF5IGhhdmUgcnVuIHdpdGggYSBkaWZmZXJlbnQgZ2xvYmFsIGZpbHRlcgorCSAqICAgd2hpY2ggY2hhbmdlZCB0aGUgY29udGVudCBvZiBsdm1ldGFkIGZyb20gd2hhdCB3ZSB3YW50IChyZWNvZ25pemVkCisJICogICBieSBkaWZmZXJlbnQgdG9rZW4gdmFsdWVzLikKKwkgKgorCSAqIGx2bWV0YWQgbWF5IGhhdmUgYmVlbiBwcmV2aW91c2x5IGRpc2FibGVkIChvciBkaXNhYmxlZCBkdXJpbmcgdGhlCisJICogcmVzY2FuIGRvbmUgaGVyZSkgYmVjYXVzZSBkdXBsaWNhdGUgZGV2aWNlcyBvciBsdm0xIG1ldGFkYXRhIHdlcmUgc2Vlbi4KKwkgKiBJbiB0aGlzIGNhc2UsIGRpc2FibGUgdGhlICp1c2UqIG9mIGx2bWV0YWQgYnkgdGhpcyBjb21tYW5kLCByZXZlcnRpbmcgdG8KKwkgKiBkaXNrIHNjYW5uaW5nLgorCSAqLworCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAhKGNtZC0+Y29tbWFuZC0+ZmxhZ3MgJiBOT19MVk1FVEFEX0FVVE9TQ0FOKSkgeworCQlpZiAoY21kLT5pbmNsdWRlX2ZvcmVpZ25fdmdzIHx8ICFsdm1ldGFkX3Rva2VuX21hdGNoZXMoY21kKSkgeworCQkJaWYgKGx2bWV0YWRfdXNlZCgpICYmICFsdm1ldGFkX3B2c2Nhbl9hbGxfZGV2cyhjbWQsIGNtZC0+aW5jbHVkZV9mb3JlaWduX3ZncyA/IDEgOiAwKSkgeworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNhY2hlIHVwZGF0ZSBmYWlsZWQuIik7CisJCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQkJfQorCQl9CisKKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmIGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgJXMuIiwgcmVhc29uKTsKKwkJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKworCQkJaWYgKHN0cnN0cihyZWFzb24sICJkdXBsaWNhdGUiKSkgeworCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBVc2UgbXVsdGlwYXRoIG9yIHZnaW1wb3J0Y2xvbmUgdG8gcmVzb2x2ZSBkdXBsaWNhdGUgUFZzPyIpOworCQkJCWlmICghZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZGV2aWNlc19tdWx0aXBhdGhfY29tcG9uZW50X2RldGVjdGlvbl9DRkcsIE5VTEwpKQorCQkJCQlsb2dfd2FybigiV0FSTklORzogU2V0IG11bHRpcGF0aF9jb21wb25lbnRfZGV0ZWN0aW9uPTEgdG8gaGlkZSBtdWx0aXBhdGggZHVwbGljYXRlcy4iKTsKKwkJCQlsb2dfd2FybigiV0FSTklORzogQWZ0ZXIgZHVwbGljYXRlcyBhcmUgcmVzb2x2ZWQsIHJ1biBcInB2c2NhbiAtLWNhY2hlXCIgdG8gZW5hYmxlIGx2bWV0YWQuIik7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEZJWE1FIEJyZWFrIHVwIGludG8gbXVsdGlwbGUgZnVuY3Rpb25zLgorCSAqLworCXJldCA9IGNtZC0+Y29tbWFuZC0+Zm4oY21kLCBhcmdjLCBhcmd2KTsKKworCWx2bWxvY2tkX2Rpc2Nvbm5lY3QoKTsKKwlmaW5fbG9ja2luZygpOworCisJaWYgKCFfY21kX25vX21ldGFfcHJvYyhjbWQpICYmIGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9ub3RpZnlfZGJ1c19DRkcsIE5VTEwpKQorCQlsdm1ub3RpZnlfc2VuZChjbWQpOworCisgICAgICBvdXQ6CisJaWYgKHRlc3RfbW9kZSgpKSB7CisJCWxvZ192ZXJib3NlKCJUZXN0IG1vZGU6IFdpcGluZyBpbnRlcm5hbCBjYWNoZSIpOworCQlsdm1jYWNoZV9kZXN0cm95KGNtZCwgMSwgMCk7CisJfQorCisJaWYgKChjb25maWdfc3RyaW5nX2NmdCA9IHJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBDT05GSUdfU1RSSU5HKSkpCisJCWRtX2NvbmZpZ19kZXN0cm95KGNvbmZpZ19zdHJpbmdfY2Z0KTsKKworCWNvbmZpZ19wcm9maWxlX2NvbW1hbmRfY2Z0ID0gcmVtb3ZlX2NvbmZpZ190cmVlX2J5X3NvdXJjZShjbWQsIENPTkZJR19QUk9GSUxFX0NPTU1BTkQpOworCWNvbmZpZ19wcm9maWxlX21ldGFkYXRhX2NmdCA9IHJlbW92ZV9jb25maWdfdHJlZV9ieV9zb3VyY2UoY21kLCBDT05GSUdfUFJPRklMRV9NRVRBREFUQSk7CisJY21kLT5wcm9maWxlX3BhcmFtcy0+Z2xvYmFsX21ldGFkYXRhX3Byb2ZpbGUgPSBOVUxMOworCisJaWYgKGNvbmZpZ19zdHJpbmdfY2Z0IHx8IGNvbmZpZ19wcm9maWxlX2NvbW1hbmRfY2Z0IHx8IGNvbmZpZ19wcm9maWxlX21ldGFkYXRhX2NmdCkgeworCQkvKiBNb3ZlIHRoaXM/ICovCisJCWlmICghcmVmcmVzaF90b29sY29udGV4dChjbWQpKQorCQkJc3RhY2s7CisJfQorCisJaWYgKHJldCA9PSBFSU5WQUxJRF9DTURfTElORSAmJiAhY21kLT5pc19pbnRlcmFjdGl2ZSkKKwkJX3Nob3J0X3VzYWdlKGNtZC0+Y29tbWFuZC0+bmFtZSk7CisKKwlsb2dfZGVidWcoIkNvbXBsZXRlZDogJXMiLCBjbWQtPmNtZF9saW5lKTsKKworCWNtZC0+Y3VycmVudF9zZXR0aW5ncyA9IGNtZC0+ZGVmYXVsdF9zZXR0aW5nczsKKwlfYXBwbHlfc2V0dGluZ3MoY21kKTsKKworCS8qCisJICogZnJlZSBvZmYgYW55IG1lbW9yeSB0aGUgY29tbWFuZCB1c2VkLgorCSAqLworCWRtX2xpc3RfaW5pdCgmY21kLT5hcmdfdmFsdWVfZ3JvdXBzKTsKKwlkbV9wb29sX2VtcHR5KGNtZC0+bWVtKTsKKworCXJlc2V0X2x2bV9lcnJubygxKTsKKwlyZXNldF9sb2dfZHVwbGljYXRlZCgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGx2bV9yZXR1cm5fY29kZShpbnQgcmV0KQoreworCXVubGlua19sb2dfZmlsZShyZXQpOworCisJcmV0dXJuIChyZXQgPT0gRUNNRF9QUk9DRVNTRUQgPyAwIDogcmV0KTsKK30KKworaW50IGx2bV9zcGxpdChjaGFyICpzdHIsIGludCAqYXJnYywgY2hhciAqKmFyZ3YsIGludCBtYXgpCit7CisJY2hhciAqYiA9IHN0ciwgKmU7CisJY2hhciBxdW90ZSA9IDA7CisJKmFyZ2MgPSAwOworCisJd2hpbGUgKCpiKSB7CisJCXdoaWxlICgqYiAmJiBpc3NwYWNlKCpiKSkKKwkJCWIrKzsKKworCQlpZiAoKCEqYikgfHwgKCpiID09ICcjJykpCisJCQlicmVhazsKKworCQlpZiAoKmIgPT0gJ1wnJyB8fCAqYiA9PSAnIicpIHsKKwkJCXF1b3RlID0gKmI7CisJCQliKys7CisJCX0KKworCQllID0gYjsKKwkJd2hpbGUgKCplICYmIChxdW90ZSA/ICplICE9IHF1b3RlIDogIWlzc3BhY2UoKmUpKSkKKwkJCWUrKzsKKworCQlhcmd2WygqYXJnYykrK10gPSBiOworCQlpZiAoISplKQorCQkJYnJlYWs7CisJCSplKysgPSAnXDAnOworCQlxdW90ZSA9IDA7CisJCWIgPSBlOworCQlpZiAoKmFyZ2MgPT0gbWF4KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuICphcmdjOworfQorCisvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbHdheXMgdmFsaWQgZmlsZWRlc2NyaXB0b3JzIDAsMSwyICovCitzdGF0aWMgaW50IF9jaGVja19zdGFuZGFyZF9mZHModm9pZCkKK3sKKwlpbnQgZXJyID0gaXNfdmFsaWRfZmQoU1RERVJSX0ZJTEVOTyk7CisKKwlpZiAoIWlzX3ZhbGlkX2ZkKFNURElOX0ZJTEVOTykgJiYKKwkgICAgIShzdGRpbiA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJyIikpKSB7CisJCWlmIChlcnIpCisJCQlwZXJyb3IoInN0ZGluIHN0cmVhbSBvcGVuIik7CisJCWVsc2UKKwkJCXByaW50Zigic3RkaW4gc3RyZWFtIG9wZW46ICVzXG4iLAorCQkJICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaXNfdmFsaWRfZmQoU1RET1VUX0ZJTEVOTykgJiYKKwkgICAgIShzdGRvdXQgPSBmb3BlbihfUEFUSF9ERVZOVUxMLCAidyIpKSkgeworCQlpZiAoZXJyKQorCQkJcGVycm9yKCJzdGRvdXQgc3RyZWFtIG9wZW4iKTsKKwkJLyogZWxzZSBubyBzdGRvdXQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFpc192YWxpZF9mZChTVERFUlJfRklMRU5PKSAmJgorCSAgICAhKHN0ZGVyciA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJ3IikpKSB7CisJCXByaW50Zigic3RkZXJyIHN0cmVhbSBvcGVuOiAlc1xuIiwKKwkJICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2dldF9jbWRsaW5lKHBpZF90IHBpZCkKK3sKKwlzdGF0aWMgY2hhciBfcHJvY19jbWRsaW5lWzMyXTsKKwljaGFyIGJ1ZlsyNTZdOworCWludCBmZCwgbiA9IDA7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBERUZBVUxUX1BST0NfRElSICIvJXUvY21kbGluZSIsIHBpZCk7CisJLyogRklYTUUgVXNlIGdlbmVyaWMgcmVhZCBjb2RlLiAqLworCWlmICgoZmQgPSBvcGVuKGJ1ZiwgT19SRE9OTFkpKSA+PSAwKSB7CisJCWlmICgobiA9IHJlYWQoZmQsIF9wcm9jX2NtZGxpbmUsIHNpemVvZihfcHJvY19jbWRsaW5lKSAtIDEpKSA8IDApIHsKKwkJCWxvZ19zeXNfZXJyb3IoInJlYWQiLCBidWYpOworCQkJbiA9IDA7CisJCX0KKwkJaWYgKGNsb3NlKGZkKSkKKwkJCWxvZ19zeXNfZXJyb3IoImNsb3NlIiwgYnVmKTsKKwl9CisJX3Byb2NfY21kbGluZVtuXSA9ICdcMCc7CisKKwlyZXR1cm4gX3Byb2NfY21kbGluZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRfZmlsZW5hbWUoaW50IGZkKQoreworCXN0YXRpYyBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZlszMl07CS8qIEFzc3VtZXMgc2hvcnQgREVGQVVMVF9QUk9DX0RJUiAqLworCWludCBzaXplOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgREVGQVVMVF9QUk9DX0RJUiAiL3NlbGYvZmQvJXUiLCBmZCk7CisKKwlpZiAoKHNpemUgPSByZWFkbGluayhidWYsIGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpIC0gMSkpID09IC0xKQorCQlmaWxlbmFtZVswXSA9ICdcMCc7CisJZWxzZQorCQlmaWxlbmFtZVtzaXplXSA9ICdcMCc7CisKKwlyZXR1cm4gZmlsZW5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIF9jbG9zZV9kZXNjcmlwdG9yKGludCBmZCwgdW5zaWduZWQgc3VwcHJlc3Nfd2FybmluZ3MsCisJCQkgICAgICBjb25zdCBjaGFyICpjb21tYW5kLCBwaWRfdCBwcGlkLAorCQkJICAgICAgY29uc3QgY2hhciAqcGFyZW50X2NtZGxpbmUpCit7CisJaW50IHI7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKwkvKiBJZ25vcmUgYmFkIGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlpZiAoIWlzX3ZhbGlkX2ZkKGZkKSkKKwkJcmV0dXJuOworCisJaWYgKCFzdXBwcmVzc193YXJuaW5ncykKKwkJZmlsZW5hbWUgPSBfZ2V0X2ZpbGVuYW1lKGZkKTsKKworCXIgPSBjbG9zZShmZCk7CisJaWYgKHN1cHByZXNzX3dhcm5pbmdzKQorCQlyZXR1cm47CisKKwlpZiAoIXIpCisJCWZwcmludGYoc3RkZXJyLCAiRmlsZSBkZXNjcmlwdG9yICVkICglcykgbGVha2VkIG9uICIKKwkJCSIlcyBpbnZvY2F0aW9uLiIsIGZkLCBmaWxlbmFtZSwgY29tbWFuZCk7CisJZWxzZSBpZiAoZXJybm8gPT0gRUJBREYpCisJCXJldHVybjsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiQ2xvc2UgZmFpbGVkIG9uIHN0cmF5IGZpbGUgZGVzY3JpcHRvciAiCisJCQkiJWQgKCVzKTogJXMiLCBmZCwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiBQYXJlbnQgUElEICUiIFBSSXBpZF90ICI6ICVzXG4iLCBwcGlkLCBwYXJlbnRfY21kbGluZSk7Cit9CisKK3N0YXRpYyBpbnQgX2Nsb3NlX3N0cmF5X2Zkcyhjb25zdCBjaGFyICpjb21tYW5kKQoreworI2lmbmRlZiBWQUxHUklORF9QT09MCisJc3RydWN0IHJsaW1pdCBybGltOworCWludCBmZDsKKwl1bnNpZ25lZCBzdXBwcmVzc193YXJuaW5ncyA9IDA7CisJcGlkX3QgcHBpZCA9IGdldHBwaWQoKTsKKwljb25zdCBjaGFyICpwYXJlbnRfY21kbGluZSA9IF9nZXRfY21kbGluZShwcGlkKTsKKwlzdGF0aWMgY29uc3QgY2hhciBfZmRfZGlyW10gPSBERUZBVUxUX1BST0NfRElSICIvc2VsZi9mZCI7CisJc3RydWN0IGRpcmVudCAqZGlyZW50OworCURJUiAqZDsKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKwlpZiAoUlVOTklOR19PTl9WQUxHUklORCkgeworCQlsb2dfZGVidWcoIlNraXBwaW5nIGNsb3NlIG9mIGRlc2NyaXB0b3JzIHdpdGhpbiB2YWxncmluZCBleGVjdXRpb24uIik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJaWYgKGdldGVudigiTFZNX1NVUFBSRVNTX0ZEX1dBUk5JTkdTIikpCisJCXN1cHByZXNzX3dhcm5pbmdzID0gMTsKKworCWlmICghKGQgPSBvcGVuZGlyKF9mZF9kaXIpKSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQlsb2dfc3lzX2Vycm9yKCJvcGVuZGlyIiwgX2ZkX2Rpcik7CisJCQlyZXR1cm4gMDsgLyogYnJva2VuIHN5c3RlbSAqLworCQl9CisKKwkJLyogUGF0aCBkb2VzIG5vdCBleGlzdCwgdXNlIHRoZSBvbGQgd2F5ICovCisJCWlmIChnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW0pIDwgMCkgeworCQkJbG9nX3N5c19lcnJvcigiZ2V0cmxpbWl0IiwgIlJMSU1JVF9OT0ZJTEUiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZm9yIChmZCA9IDM7IGZkIDwgKGludClybGltLnJsaW1fY3VyOyBmZCsrKQorCQkJX2Nsb3NlX2Rlc2NyaXB0b3IoZmQsIHN1cHByZXNzX3dhcm5pbmdzLCBjb21tYW5kLCBwcGlkLAorCQkJCQkgIHBhcmVudF9jbWRsaW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKChkaXJlbnQgPSByZWFkZGlyKGQpKSkgeworCQlmZCA9IGF0b2koZGlyZW50LT5kX25hbWUpOworCQlpZiAoZmQgPiAyICYmIGZkICE9IGRpcmZkKGQpKQorCQkJX2Nsb3NlX2Rlc2NyaXB0b3IoZmQsIHN1cHByZXNzX3dhcm5pbmdzLAorCQkJCQkgIGNvbW1hbmQsIHBwaWQsIHBhcmVudF9jbWRsaW5lKTsKKwl9CisKKwlpZiAoY2xvc2VkaXIoZCkpCisJCWxvZ19zeXNfZXJyb3IoImNsb3NlZGlyIiwgX2ZkX2Rpcik7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgY21kX2NvbnRleHQgKmluaXRfbHZtKHVuc2lnbmVkIHNldF9jb25uZWN0aW9ucywgdW5zaWduZWQgc2V0X2ZpbHRlcnMpCit7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CisKKwlpZiAoIXVkZXZfaW5pdF9saWJyYXJ5X2NvbnRleHQoKSkKKwkJc3RhY2s7CisKKwkvKgorCSAqIEl0J3Mgbm90IG5lY2Vzc2FyeSB0byB1c2UgbmFtZSBtYW5nbGluZyBmb3IgTFZNOgorCSAqICAgLSB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGZvciBMViBuYW1lcyBpcyBzdWJzZXQgb2YgdWRldiBjaGFyYWN0ZXIgc2V0CisJICogICAtIHdoZW4gd2UgY2hlY2sgb3RoZXIgZGV2aWNlcyAoZS5nLiBkZXZpY2VfaXNfdXNhYmxlIGZuKSwgd2UgdXNlIG1ham9yOm1pbm9yLCBub3QgZG0gbmFtZXMKKwkgKi8KKwlkbV9zZXRfbmFtZV9tYW5nbGluZ19tb2RlKERNX1NUUklOR19NQU5HTElOR19OT05FKTsKKworCWlmICghKGNtZCA9IGNyZWF0ZV90b29sY29udGV4dCgwLCBOVUxMLCAxLCAwLAorCQkJc2V0X2Nvbm5lY3Rpb25zLCBzZXRfZmlsdGVycykpKSB7CisJCXVkZXZfZmluX2xpYnJhcnlfY29udGV4dCgpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlfY21kbGluZS5hcmdfcHJvcHMgPSAmX2FyZ19wcm9wc1swXTsKKworCWlmIChzdG9yZWRfZXJybm8oKSkgeworCQlkZXN0cm95X3Rvb2xjb250ZXh0KGNtZCk7CisJCXVkZXZfZmluX2xpYnJhcnlfY29udGV4dCgpOworCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgdm9pZCBfZmluX2NvbW1hbmRzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgX2NtZGxpbmUubnVtX2NvbW1hbmRzOyBpKyspCisJCWRtX2ZyZWUoX2NtZGxpbmUuY29tbWFuZHNbaV0udmFsaWRfYXJncyk7CisKKwlkbV9mcmVlKF9jbWRsaW5lLmNvbW1hbmRzKTsKKworCV9jbWRsaW5lLmNvbW1hbmRzID0gTlVMTDsKKwlfY21kbGluZS5udW1fY29tbWFuZHMgPSAwOworCV9jbWRsaW5lLmNvbW1hbmRzX3NpemUgPSAwOworfQorCit2b2lkIGx2bV9maW4oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJX2Zpbl9jb21tYW5kcygpOworCWRlc3Ryb3lfdG9vbGNvbnRleHQoY21kKTsKKwl1ZGV2X2Zpbl9saWJyYXJ5X2NvbnRleHQoKTsKK30KKworc3RhdGljIGludCBfcnVuX3NjcmlwdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUZJTEUgKnNjcmlwdDsKKworCWNoYXIgYnVmZmVyW0NNRF9MRU5dOworCWludCByZXQgPSAwOworCWludCBtYWdpY19udW1iZXIgPSAwOworCWNoYXIgKnNjcmlwdF9maWxlID0gYXJndlswXTsKKworCWlmICgoc2NyaXB0ID0gZm9wZW4oc2NyaXB0X2ZpbGUsICJyIikpID09IE5VTEwpCisJCXJldHVybiBFTk9fU1VDSF9DTUQ7CisKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc2NyaXB0KSAhPSBOVUxMKSB7CisJCWlmICghbWFnaWNfbnVtYmVyKSB7CisJCQlpZiAoYnVmZmVyWzBdID09ICcjJyAmJiBidWZmZXJbMV0gPT0gJyEnKQorCQkJCW1hZ2ljX251bWJlciA9IDE7CisJCQllbHNlIHsKKwkJCQlyZXQgPSBFTk9fU1VDSF9DTUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKChzdHJsZW4oYnVmZmVyKSA9PSBzaXplb2YoYnVmZmVyKSAtIDEpCisJCSAgICAmJiAoYnVmZmVyW3NpemVvZihidWZmZXIpIC0gMV0gLSAyICE9ICdcbicpKSB7CisJCQlidWZmZXJbNTBdID0gJ1wwJzsKKwkJCWxvZ19lcnJvcigiTGluZSB0b28gbG9uZyAobWF4IDI1NSkgYmVnaW5uaW5nOiAlcyIsCisJCQkJICBidWZmZXIpOworCQkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQlicmVhazsKKwkJfQorCQlpZiAobHZtX3NwbGl0KGJ1ZmZlciwgJmFyZ2MsIGFyZ3YsIE1BWF9BUkdTKSA9PSBNQVhfQVJHUykgeworCQkJYnVmZmVyWzUwXSA9ICdcMCc7CisJCQlsb2dfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50czogJXMiLCBidWZmZXIpOworCQkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWFyZ2MpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoYXJndlswXSwgInF1aXQiKSB8fCAhc3RyY21wKGFyZ3ZbMF0sICJleGl0IikpCisJCQlicmVhazsKKwkJcmV0ID0gbHZtX3J1bl9jb21tYW5kKGNtZCwgYXJnYywgYXJndik7CisJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpIHsKKwkJCWlmICghZXJyb3JfbWVzc2FnZV9wcm9kdWNlZCgpKSB7CisJCQkJbG9nX2RlYnVnKElOVEVSTkFMX0VSUk9SICJGYWlsZWQgY29tbWFuZCBkaWQgbm90IHVzZSBsb2dfZXJyb3IiKTsKKwkJCQlsb2dfZXJyb3IoIkNvbW1hbmQgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJWQuIiwgcmV0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZjbG9zZShzY3JpcHQpKQorCQlsb2dfc3lzX2Vycm9yKCJmY2xvc2UiLCBzY3JpcHRfZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGZhbGwgYmFjayBhbmQgZXhlYyB0aGUgZXF1aXZhbGVudCBMVk0xIHRvb2wKKyAqLworc3RhdGljIGludCBfbHZtMV9mYWxsYmFjayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCkKK3sKKwljaGFyIHZzbls4MF07CisJaW50IGRtX3ByZXNlbnQ7CisKKwlpZiAoIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF9mYWxsYmFja190b19sdm0xX0NGRywgTlVMTCkgfHwKKwkgICAgc3RybmNtcChjbWQtPmtlcm5lbF92c24sICIyLjQuIiwgNCkpCisJCXJldHVybiAwOworCisJbG9nX3N1cHByZXNzKDEpOworCWRtX3ByZXNlbnQgPSBkcml2ZXJfdmVyc2lvbih2c24sIHNpemVvZih2c24pKTsKKwlsb2dfc3VwcHJlc3MoMCk7CisKKwlpZiAoZG1fcHJlc2VudCB8fCAhbHZtMV9wcmVzZW50KGNtZCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9leGVjX2x2bTFfY29tbWFuZChjaGFyICoqYXJndikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKGRtX3NucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLmx2bTEiLCBhcmd2WzBdKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIExWTTEgdG9vbCBwYXRobmFtZSIpOworCQlyZXR1cm47CisJfQorCisJZXhlY3ZwKHBhdGgsIGFyZ3YpOworCWxvZ19zeXNfZXJyb3IoImV4ZWN2cCIsIHBhdGgpOworfQorCitzdGF0aWMgdm9pZCBfbm9ucm9vdF93YXJuaW5nKHZvaWQpCit7CisJaWYgKGdldHVpZCgpIHx8IGdldGV1aWQoKSkKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFJ1bm5pbmcgYXMgYSBub24tcm9vdCB1c2VyLiBGdW5jdGlvbmFsaXR5IG1heSBiZSB1bmF2YWlsYWJsZS4iKTsKK30KKworaW50IGx2bTJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqYmFzZTsKKwlpbnQgcmV0LCBhbGlhcyA9IDA7CisJc3RydWN0IGNtZF9jb250ZXh0ICpjbWQ7CisKKwlpZiAoIWFyZ3YpCisJCXJldHVybiAtMTsKKworCWJhc2UgPSBsYXN0X3BhdGhfY29tcG9uZW50KGFyZ3ZbMF0pOworCWlmIChzdHJjbXAoYmFzZSwgImx2bSIpICYmIHN0cmNtcChiYXNlLCAibHZtLnN0YXRpYyIpICYmCisJICAgIHN0cmNtcChiYXNlLCAiaW5pdHJkLWx2bSIpKQorCQlhbGlhcyA9IDE7CisKKwlpZiAoIV9jaGVja19zdGFuZGFyZF9mZHMoKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFfY2xvc2Vfc3RyYXlfZmRzKGJhc2UpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaXNfc3RhdGljKCkgJiYgc3RyY21wKGJhc2UsICJsdm0uc3RhdGljIikgJiYKKwkgICAgcGF0aF9leGlzdHMoTFZNX1BBVEgpICYmCisJICAgICFnZXRlbnYoIkxWTV9ESURfRVhFQyIpKSB7CisJCWlmIChzZXRlbnYoIkxWTV9ESURfRVhFQyIsIGJhc2UsIDEpKQorCQkJbG9nX3N5c19lcnJvcigic2V0ZW52IiwgIkxWTV9ESURfRVhFQyIpOworCQlpZiAoZXhlY3ZwKExWTV9QQVRILCBhcmd2KSA9PSAtMSkKKwkJCWxvZ19zeXNfZXJyb3IoImV4ZWN2cCIsIExWTV9QQVRIKTsKKwkJaWYgKHVuc2V0ZW52KCJMVk1fRElEX0VYRUMiKSkKKwkJCWxvZ19zeXNfZXJyb3IoInVuc2V0ZW52IiwgIkxWTV9ESURfRVhFQyIpOworCX0KKworCS8qICJ2ZXJzaW9uIiBjb21tYW5kIGlzIHNpbXBsZSBlbm91Z2ggc28gaXQgZG9lc24ndCBuZWVkIGFueSBjb21wbGV4IGluaXQgKi8KKwlpZiAoIWFsaWFzICYmIGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgInZlcnNpb24iKSkKKwkJcmV0dXJuIGx2bV9yZXR1cm5fY29kZSh2ZXJzaW9uKE5VTEwsIGFyZ2MsIGFyZ3YpKTsKKworCWlmICghKGNtZCA9IGluaXRfbHZtKDAsIDApKSkKKwkJcmV0dXJuIC0xOworCisJY21kLT5hcmd2ID0gYXJndjsKKwlsdm1fcmVnaXN0ZXJfY29tbWFuZHMoKTsKKworCWlmIChfbHZtMV9mYWxsYmFjayhjbWQpKSB7CisJCS8qIEF0dGVtcHQgdG8gcnVuIGVxdWl2YWxlbnQgTFZNMSB0b29sIGluc3RlYWQgKi8KKwkJaWYgKCFhbGlhcykgeworCQkJYXJndisrOworCQkJYXJnYy0tOworCQl9CisJCWlmICghYXJnYykgeworCQkJbG9nX2Vycm9yKCJGYWxsaW5nIGJhY2sgdG8gTFZNMSB0b29scywgYnV0IG5vICIKKwkJCQkgICJjb21tYW5kIHNwZWNpZmllZC4iKTsKKwkJCXJldCA9IEVDTURfRkFJTEVEOworCQkJZ290byBvdXQ7CisJCX0KKwkJX2V4ZWNfbHZtMV9jb21tYW5kKGFyZ3YpOworCQlyZXQgPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorI2lmZGVmIFJFQURMSU5FX1NVUFBPUlQKKwlpZiAoIWFsaWFzICYmIGFyZ2MgPT0gMSkgeworCQlfbm9ucm9vdF93YXJuaW5nKCk7CisJCXJldCA9IGx2bV9zaGVsbChjbWQsICZfY21kbGluZSk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCisJaWYgKCFhbGlhcykgeworCQlpZiAoYXJnYyA8IDIpIHsKKwkJCWxvZ19mYXRhbCgiUGxlYXNlIHN1cHBseSBhbiBMVk0gY29tbWFuZC4iKTsKKwkJCV9kaXNwbGF5X2hlbHAoKTsKKwkJCXJldCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQkJZ290byBvdXQ7CisJCX0KKworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlfbm9ucm9vdF93YXJuaW5nKCk7CisJcmV0ID0gbHZtX3J1bl9jb21tYW5kKGNtZCwgYXJnYywgYXJndik7CisJaWYgKChyZXQgPT0gRU5PX1NVQ0hfQ01EKSAmJiAoIWFsaWFzKSkKKwkJcmV0ID0gX3J1bl9zY3JpcHQoY21kLCBhcmdjLCBhcmd2KTsKKwlpZiAocmV0ID09IEVOT19TVUNIX0NNRCkKKwkJbG9nX2Vycm9yKCJObyBzdWNoIGNvbW1hbmQuICBUcnkgJ2hlbHAnLiIpOworCisJaWYgKChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpICYmICFlcnJvcl9tZXNzYWdlX3Byb2R1Y2VkKCkpIHsKKwkJbG9nX2RlYnVnKElOVEVSTkFMX0VSUk9SICJGYWlsZWQgY29tbWFuZCBkaWQgbm90IHVzZSBsb2dfZXJyb3IiKTsKKwkJbG9nX2Vycm9yKCJDb21tYW5kIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICVkLiIsIHJldCk7CisJfQorCisgICAgICBvdXQ6CisJbHZtX2ZpbihjbWQpOworCXJldHVybiBsdm1fcmV0dXJuX2NvZGUocmV0KTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2bWRpc2tzY2FuLmMgYi90b29scy9sdm1kaXNrc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGQ3MDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdm1kaXNrc2Nhbi5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIENoYW5nZWxvZworICoKKyAqICAgMDUvMDIvMjAwMiAtIEZpcnN0IGRyb3AgW0hNXQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitpbnQgZGlza3NfZm91bmQ7CitpbnQgcGFydHNfZm91bmQ7CitpbnQgcHZfZGlza3NfZm91bmQ7CitpbnQgcHZfcGFydHNfZm91bmQ7CitpbnQgbWF4X2xlbjsKKworc3RhdGljIGludCBfZ2V0X21heF9kZXZfbmFtZV9sZW4oc3RydWN0IGRldl9maWx0ZXIgKmZpbHRlcikKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgbWF4bGVuID0gMDsKKwlzdHJ1Y3QgZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKCEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShmaWx0ZXIsIDEpKSkgeworCQlsb2dfZXJyb3IoImRldl9pdGVyX2NyZWF0ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRG8gc2NhbiAqLworCWZvciAoZGV2ID0gZGV2X2l0ZXJfZ2V0KGl0ZXIpOyBkZXY7IGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkgeworCQlsZW4gPSBzdHJsZW4oZGV2X25hbWUoZGV2KSk7CisJCWlmIChsZW4gPiBtYXhsZW4pCisJCQltYXhsZW4gPSBsZW47CisJfQorCWRldl9pdGVyX2Rlc3Ryb3koaXRlcik7CisKKwlyZXR1cm4gbWF4bGVuOworfQorCitzdGF0aWMgdm9pZCBfY291bnQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgKmRpc2tzLCBpbnQgKnBhcnRzKQoreworCWludCBjID0gZGV2X25hbWUoZGV2KVtzdHJsZW4oZGV2X25hbWUoZGV2KSkgLSAxXTsKKworCWlmICghaXNkaWdpdChjKSkKKwkJKCpkaXNrcykrKzsKKwllbHNlCisJCSgqcGFydHMpKys7Cit9CisKK3N0YXRpYyB2b2lkIF9wcmludChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICB1aW50NjRfdCBzaXplLCBjb25zdCBjaGFyICp3aGF0KQoreworCWxvZ19wcmludCgiJS0qcyBbJTE1c10gJXMiLCBtYXhfbGVuLCBkZXZfbmFtZShkZXYpLAorCQkgIGRpc3BsYXlfc2l6ZShjbWQsIHNpemUpLCB3aGF0ID8gOiAiIik7Cit9CisKK3N0YXRpYyBpbnQgX2NoZWNrX2RldmljZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWNoYXIgYnVmZmVyOworCXVpbnQ2NF90IHNpemU7CisKKwlpZiAoIWRldl9vcGVuX3JlYWRvbmx5KGRldikpCisJCXJldHVybl8wOworCisJaWYgKCFkZXZfcmVhZChkZXYsIFVJTlQ2NF9DKDApLCAoc2l6ZV90KSAxLCAmYnVmZmVyKSkgeworCQlzdGFjazsKKwkJaWYgKCFkZXZfY2xvc2UoZGV2KSkKKwkJCXN0YWNrOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpIHsKKwkJbG9nX2Vycm9yKCJDb3VsZG4ndCBnZXQgc2l6ZSBvZiBcIiVzXCIiLCBkZXZfbmFtZShkZXYpKTsKKwkJc2l6ZSA9IDA7CisJfQorCV9wcmludChjbWQsIGRldiwgc2l6ZSwgTlVMTCk7CisJX2NvdW50KGRldiwgJmRpc2tzX2ZvdW5kLCAmcGFydHNfZm91bmQpOworCWlmICghZGV2X2Nsb3NlKGRldikpIHsKKwkJbG9nX2Vycm9yKCJkZXZfY2xvc2Ugb24gXCIlc1wiIGZhaWxlZCIsIGRldl9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBsdm1kaXNrc2NhbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCWNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXVpbnQ2NF90IHNpemU7CisJc3RydWN0IGRldl9pdGVyICppdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFiZWwgKmxhYmVsOworCisJLyogaW5pdGlhbGlzZSB0aGVzZSBoZXJlIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhlIGx2bSBzaGVsbCAqLworCWRpc2tzX2ZvdW5kID0gMDsKKwlwYXJ0c19mb3VuZCA9IDA7CisJcHZfZGlza3NfZm91bmQgPSAwOworCXB2X3BhcnRzX2ZvdW5kID0gMDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbHZtcGFydGl0aW9uX0FSRykpCisJCWxvZ193YXJuKCJXQVJOSU5HOiBvbmx5IGNvbnNpZGVyaW5nIExWTSBkZXZpY2VzIik7CisKKwltYXhfbGVuID0gX2dldF9tYXhfZGV2X25hbWVfbGVuKGNtZC0+ZnVsbF9maWx0ZXIpOworCisJaWYgKCEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShjbWQtPmZ1bGxfZmlsdGVyLCAwKSkpIHsKKwkJbG9nX2Vycm9yKCJkZXZfaXRlcl9jcmVhdGUgZmFpbGVkIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKiBEbyBzY2FuICovCisJZm9yIChkZXYgPSBkZXZfaXRlcl9nZXQoaXRlcik7IGRldjsgZGV2ID0gZGV2X2l0ZXJfZ2V0KGl0ZXIpKSB7CisJCS8qIFRyeSBpZiBpdCBpcyBhIFBWIGZpcnN0ICovCisJCWlmICgobGFiZWxfcmVhZChkZXYsICZsYWJlbCwgVUlOVDY0X0MoMCkpKSkgeworCQkJaWYgKCFkZXZfZ2V0X3NpemUoZGV2LCAmc2l6ZSkpIHsKKwkJCQlsb2dfZXJyb3IoIkNvdWxkbid0IGdldCBzaXplIG9mIFwiJXNcIiIsCisJCQkJCSAgZGV2X25hbWUoZGV2KSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlfcHJpbnQoY21kLCBkZXYsIHNpemUsICJMVk0gcGh5c2ljYWwgdm9sdW1lIik7CisJCQlfY291bnQoZGV2LCAmcHZfZGlza3NfZm91bmQsICZwdl9wYXJ0c19mb3VuZCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBJZiB1c2VyIGp1c3Qgd2FudHMgUFZzIHdlIGFyZSBkb25lICovCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgbHZtcGFydGl0aW9uX0FSRykpCisJCQljb250aW51ZTsKKworCQkvKiBXaGF0IG90aGVyIGRldmljZSBpcyBpdD8gKi8KKwkJaWYgKCFfY2hlY2tfZGV2aWNlKGNtZCwgZGV2KSkKKwkJCWNvbnRpbnVlOworCX0KKwlkZXZfaXRlcl9kZXN0cm95KGl0ZXIpOworCisJLyogRGlzcGxheSB0b3RhbHMgKi8KKwlpZiAoIWFyZ19pc19zZXQoY21kLCBsdm1wYXJ0aXRpb25fQVJHKSkgeworCQlsb2dfcHJpbnQoIiVkIGRpc2slcyIsCisJCQkgIGRpc2tzX2ZvdW5kLCBkaXNrc19mb3VuZCA9PSAxID8gIiIgOiAicyIpOworCQlsb2dfcHJpbnQoIiVkIHBhcnRpdGlvbiVzIiwKKwkJCSAgcGFydHNfZm91bmQsIHBhcnRzX2ZvdW5kID09IDEgPyAiIiA6ICJzIik7CisJfQorCWxvZ19wcmludCgiJWQgTFZNIHBoeXNpY2FsIHZvbHVtZSB3aG9sZSBkaXNrJXMiLAorCQkgIHB2X2Rpc2tzX2ZvdW5kLCBwdl9kaXNrc19mb3VuZCA9PSAxID8gIiIgOiAicyIpOworCWxvZ19wcmludCgiJWQgTFZNIHBoeXNpY2FsIHZvbHVtZSVzIiwKKwkJICBwdl9wYXJ0c19mb3VuZCwgcHZfcGFydHNfZm91bmQgPT0gMSA/ICIiIDogInMiKTsKKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2cG9sbC5jIGIvdG9vbHMvbHZwb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMzdkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2cG9sbC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJwb2xsZGFlbW9uLmgiCisjaW5jbHVkZSAicHZtb3ZlX3BvbGwuaCIKKyNpbmNsdWRlICJsdmNvbnZlcnRfcG9sbC5oIgorI2luY2x1ZGUgInBvbGxpbmdfb3BzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgX3B2bW92ZV9mbnMgPSB7CisJLnBvbGxfcHJvZ3Jlc3MgPSBwb2xsX21pcnJvcl9wcm9ncmVzcywKKwkudXBkYXRlX21ldGFkYXRhID0gcHZtb3ZlX3VwZGF0ZV9tZXRhZGF0YSwKKwkuZmluaXNoX2NvcHkgPSBwdm1vdmVfZmluaXNoCit9OworCitzdGF0aWMgc3RydWN0IHBvbGxfZnVuY3Rpb25zIF9jb252ZXJ0X2ZucyA9IHsKKwkucG9sbF9wcm9ncmVzcyA9IHBvbGxfbWlycm9yX3Byb2dyZXNzLAorCS5maW5pc2hfY29weSA9IGx2Y29udmVydF9taXJyb3JfZmluaXNoCit9OworCitzdGF0aWMgc3RydWN0IHBvbGxfZnVuY3Rpb25zIF9tZXJnZV9mbnMgPSB7CisJLnBvbGxfcHJvZ3Jlc3MgPSBwb2xsX21lcmdlX3Byb2dyZXNzLAorCS5maW5pc2hfY29weSA9IGx2Y29udmVydF9tZXJnZV9maW5pc2gKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9mdW5jdGlvbnMgX3RoaW5fbWVyZ2VfZm5zID0geworCS5wb2xsX3Byb2dyZXNzID0gcG9sbF90aGluX21lcmdlX3Byb2dyZXNzLAorCS5maW5pc2hfY29weSA9IGx2Y29udmVydF9tZXJnZV9maW5pc2gKK307CisKK3N0YXRpYyBpbnQgX3NldF9kYWVtb25fcGFybXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zKQoreworCWNvbnN0IGNoYXIgKnBvbGxfb3BlciA9IGFyZ19zdHJfdmFsdWUoY21kLCBwb2xsb3BlcmF0aW9uX0FSRywgIiIpOworCisJcGFybXMtPmludGVydmFsID0gYXJnX3VpbnRfdmFsdWUoY21kLCBpbnRlcnZhbF9BUkcsIDApOworCXBhcm1zLT5hYm9ydGluZyA9IGFyZ19pc19zZXQoY21kLCBhYm9ydF9BUkcpOworCXBhcm1zLT5wcm9ncmVzc19kaXNwbGF5ID0gMTsKKwlwYXJtcy0+d2FpdF9iZWZvcmVfdGVzdGluZyA9IChhcmdfc2lnbl92YWx1ZShjbWQsIGludGVydmFsX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX1BMVVMpOworCisJaWYgKCFzdHJjbXAocG9sbF9vcGVyLCBQVk1PVkVfUE9MTCkpIHsKKwkJcGFybXMtPnByb2dyZXNzX3RpdGxlID0gIk1vdmVkIjsKKwkJcGFybXMtPmx2X3R5cGUgPSBQVk1PVkU7CisJCXBhcm1zLT5wb2xsX2ZucyA9ICZfcHZtb3ZlX2ZuczsKKwl9IGVsc2UgaWYgKCFzdHJjbXAocG9sbF9vcGVyLCBDT05WRVJUX1BPTEwpKSB7CisJCXBhcm1zLT5wcm9ncmVzc190aXRsZSA9ICJDb252ZXJ0ZWQiOworCQlwYXJtcy0+cG9sbF9mbnMgPSAmX2NvbnZlcnRfZm5zOworCX0gZWxzZSBpZiAoIXN0cmNtcChwb2xsX29wZXIsIE1FUkdFX1BPTEwpKSB7CisJCXBhcm1zLT5wcm9ncmVzc190aXRsZSA9ICJNZXJnZWQiOworCQlwYXJtcy0+cG9sbF9mbnMgPSAmX21lcmdlX2ZuczsKKwl9IGVsc2UgaWYgKCFzdHJjbXAocG9sbF9vcGVyLCBNRVJHRV9USElOX1BPTEwpKSB7CisJCXBhcm1zLT5wcm9ncmVzc190aXRsZSA9ICJNZXJnZWQiOworCQlwYXJtcy0+cG9sbF9mbnMgPSAmX3RoaW5fbWVyZ2VfZm5zOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcigiVW5rbm93biBwb2xsaW5nIG9wZXJhdGlvbiAlcyIsIHBvbGxfb3Blcik7CisJCXJldHVybiAwOworCX0KKworCWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IGFyZ19pc19zZXQoY21kLCBoYW5kbGVtaXNzaW5ncHZzX0FSRyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwb2xsX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdl9uYW1lKQoreworCXN0cnVjdCBkYWVtb25fcGFybXMgcGFybXMgPSB7IDAgfTsKKwlzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgaWQgPSB7CisJCS5kaXNwbGF5X25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCBsdl9uYW1lLCBOVUxMKQorCX07CisKKwlpZiAoIWlkLmRpc3BsYXlfbmFtZSkKKwkJcmV0dXJuX0VJTlZBTElEX0NNRF9MSU5FOworCisJaWQubHZfbmFtZSA9IGlkLmRpc3BsYXlfbmFtZTsKKworCWlmICghdmFsaWRhdGVfbHZuYW1lX3BhcmFtKGNtZCwgJmlkLnZnX25hbWUsICZpZC5sdl9uYW1lKSkKKwkJcmV0dXJuX0VJTlZBTElEX0NNRF9MSU5FOworCisJaWYgKCFfc2V0X2RhZW1vbl9wYXJtcyhjbWQsICZwYXJtcykpCisJCXJldHVybl9FSU5WQUxJRF9DTURfTElORTsKKworCXJldHVybiB3YWl0X2Zvcl9zaW5nbGVfbHYoY21kLCAmaWQsICZwYXJtcykgPyBFQ01EX1BST0NFU1NFRCA6IEVDTURfRkFJTEVEOworfQorCitpbnQgbHZwb2xsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgcG9sbG9wZXJhdGlvbl9BUkcpKSB7CisJCWxvZ19lcnJvcigiLS1wb2xsb3BlcmF0aW9uIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIGludGVydmFsX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCWxvZ19lcnJvcigiQXJndW1lbnQgdG8gLS1pbnRlcnZhbCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghYXJnYykgeworCQlsb2dfZXJyb3IoIlByb3ZpZGUgTFYgbmFtZSIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJcmV0dXJuIHBvbGxfbHYoY21kLCBhcmd2WzBdKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2cmVkdWNlLmMgYi90b29scy9sdnJlZHVjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNWQxNTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdnJlZHVjZS5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK2ludCBsdnJlZHVjZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJldHVybiBsdnJlc2l6ZShjbWQsIGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbHZyZW1vdmUuYyBiL3Rvb2xzL2x2cmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwN2QwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2x2cmVtb3ZlLmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitpbnQgbHZyZW1vdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoIWFyZ2MgJiYgIWFyZ19pc19zZXQoY21kLCBzZWxlY3RfQVJHKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBlbnRlciBvbmUgb3IgbW9yZSBsb2dpY2FsIHZvbHVtZSBwYXRocyAiCisJCQkgICJvciB1c2UgLS1zZWxlY3QgZm9yIHNlbGVjdGlvbi4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IDE7CisJY21kLT5pbmNsdWRlX2hpc3RvcmljYWxfbHZzID0gMTsKKworCXJldHVybiBwcm9jZXNzX2VhY2hfbHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLCBSRUFEX0ZPUl9VUERBVEUsIE5VTEwsCisJCQkgICAgICAgJmx2cmVtb3ZlX3NpbmdsZSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9sdnJlbmFtZS5jIGIvdG9vbHMvbHZyZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI0OGVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHZyZW5hbWUuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdHJ1Y3QgbHZyZW5hbWVfcGFyYW1zIHsKKwlpbnQgaGlzdG9yaWNhbDsKKwljb25zdCBjaGFyICpsdl9uYW1lX29sZDsKKwljb25zdCBjaGFyICpsdl9uYW1lX25ldzsKK307CisKKy8qCisgKiBEdW1teSBMViB0byByZXByZXNlbnQgaGlzdG9yaWNhbCBMVi4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSBfaGlzdG9yaWNhbF9sdiA9IHsKKyAgICAgICAgLm5hbWUgPSAiIiwKKyAgICAgICAgLm1ham9yID0gLTEsCisgICAgICAgIC5taW5vciA9IC0xLAorICAgICAgICAuc25hcHNob3Rfc2VncyA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2LnNuYXBzaG90X3NlZ3MpLAorICAgICAgICAuc2VnbWVudHMgPSBETV9MSVNUX0hFQURfSU5JVChfaGlzdG9yaWNhbF9sdi5zZWdtZW50cyksCisgICAgICAgIC50YWdzID0gRE1fTElTVF9IRUFEX0lOSVQoX2hpc3RvcmljYWxfbHYudGFncyksCisgICAgICAgIC5zZWdzX3VzaW5nX3RoaXNfbHYgPSBETV9MSVNUX0hFQURfSU5JVChfaGlzdG9yaWNhbF9sdi5zZWdzX3VzaW5nX3RoaXNfbHYpLAorICAgICAgICAuaW5kaXJlY3RfZ2x2cyA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2LmluZGlyZWN0X2dsdnMpLAorICAgICAgICAuaG9zdG5hbWUgPSAiIiwKK307CisKK3N0YXRpYyBpbnQgX2x2cmVuYW1lX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IGx2cmVuYW1lX3BhcmFtcyAqbHAgPSAoc3RydWN0IGx2cmVuYW1lX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IGdlbmVyaWNfbG9naWNhbF92b2x1bWUgKmdsdjsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCWludCByZXQgPSBFQ01EX0ZBSUxFRDsKKworCWlmICghbHAtPmhpc3RvcmljYWwpIHsKKwkJaWYgKCEobHYgPSBmaW5kX2x2KHZnLCBscC0+bHZfbmFtZV9vbGQpKSkgeworCQkJbG9nX2Vycm9yKCJFeGlzdGluZyBsb2dpY2FsIHZvbHVtZSBcIiVzXCIgbm90IGZvdW5kIGluICIKKwkJCQkgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgbHAtPmx2X25hbWVfb2xkLCB2Z19uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKGx2X2lzX3JhaWRfaW1hZ2UobHYpIHx8IGx2X2lzX3JhaWRfbWV0YWRhdGEobHYpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCByZW5hbWUgYSBSQUlEICVzIGRpcmVjdGx5IiwKKwkJCQkgIGx2X2lzX3JhaWRfaW1hZ2UobHYpID8gImltYWdlIiA6CisJCQkJICAibWV0YWRhdGEgYXJlYSIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAobHZfaXNfcmFpZF93aXRoX3RyYWNraW5nKGx2KSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgcmVuYW1lICVzIHdoaWxlIGl0IGlzIHRyYWNraW5nIGEgc3BsaXQgaW1hZ2UiLAorCQkJCSAgbHYtPm5hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShnbHYgPSBmaW5kX2hpc3RvcmljYWxfZ2x2KHZnLCBscC0+bHZfbmFtZV9vbGQsIDAsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJFeGlzdGluZyBoaXN0b3JpY2FsIGxvZ2ljYWwgdm9sdW1lIFwiJXNcIiBub3QgZm91bmQgaW4gIgorCQkJCSAgInZvbHVtZSBncm91cCBcIiVzXCIiLCBscC0+bHZfbmFtZV9vbGQsIHZnX25hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlfaGlzdG9yaWNhbF9sdi52ZyA9IHZnOworCQlfaGlzdG9yaWNhbF9sdi5uYW1lID0gbHAtPmx2X25hbWVfb2xkOworCQlfaGlzdG9yaWNhbF9sdi50aGlzX2dsdiA9IGdsdjsKKwkJbHYgPSAmX2hpc3RvcmljYWxfbHY7CisJfQorCisJLyoKKwkgKiBUaGUgbHZtbG9ja2QgTFYgbG9jayBpcyBvbmx5IGFjcXVpcmVkIGhlcmUgdG8gZW5zdXJlIHRoZSBMViBpcyBub3QKKwkgKiBhY3RpdmUgb24gYW5vdGhlciBob3N0LiAgVGhpcyByZXF1ZXN0cyBhIHRyYW5zaWVudCBMViBsb2NrLgorCSAqIElmIHRoZSBMViBpcyBhY3RpdmUsIGEgcGVyc2lzdGVudCBMViBsb2NrIGFscmVhZHkgZXhpc3RzIGluCisJICogbHZtbG9ja2QsIGFuZCB0aGUgdHJhbnNpZW50IGxvY2sgcmVxdWVzdCBkb2VzIG5vdGhpbmcuCisJICogSWYgdGhlIExWIGlzIG5vdCBhY3RpdmUsIHRoZW4gbm8gTFYgbG9jayBleGlzdHMgYW5kIHRoZSB0cmFuc2llbnQKKwkgKiBsb2NrIHJlcXVlc3QgYWNxdWlyZXMgdGhlIExWIGxvY2sgKG9yIGZhaWxzKS4gIFRoZSB0cmFuc2llbnQgbG9jaworCSAqIGlzIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgd2hlbiB0aGUgY29tbWFuZCBleGl0cy4KKwkgKi8KKwlpZiAoIWxvY2tkX2x2KGNtZCwgbHYsICJleCIsIDApKQorCQlnb3RvX2JhZDsKKworCWlmICghbHZfcmVuYW1lKGNtZCwgbHYsIGxwLT5sdl9uYW1lX25ldykpCisJCWdvdG9fYmFkOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlbmFtZWQgXCIlcyVzXCIgdG8gXCIlcyVzXCIgaW4gdm9sdW1lIGdyb3VwIFwiJXNcIiIsCisJCQkJbHAtPmhpc3RvcmljYWwgPyBISVNUT1JJQ0FMX0xWX1BSRUZJWCA6ICIiLCBscC0+bHZfbmFtZV9vbGQsCisJCQkJbHAtPmhpc3RvcmljYWwgPyBISVNUT1JJQ0FMX0xWX1BSRUZJWCA6ICIiLCBscC0+bHZfbmFtZV9uZXcsCisJCQkJdmdfbmFtZSk7CisKKwlyZXQgPSBFQ01EX1BST0NFU1NFRDsKK2JhZDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbHZyZW5hbWUgY29tbWFuZCBpbXBsZW1lbnRhdGlvbi4KKyAqIENoZWNrIGFyZ3VtZW50cyBhbmQgY2FsbCBsdl9yZW5hbWUoKSB0byBleGVjdXRlIHRoZSByZXF1ZXN0LgorICovCitpbnQgbHZyZW5hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IGx2cmVuYW1lX3BhcmFtcyBscCA9IHsgMCB9OworCXNpemVfdCBtYXhsZW47CisJY2hhciAqbHZfbmFtZV9vbGQsICpsdl9uYW1lX25ldzsKKwljb25zdCBjaGFyICp2Z19uYW1lLCAqdmdfbmFtZV9uZXcsICp2Z19uYW1lX29sZDsKKwlpbnQgaGlzdG9yaWNhbCA9IDA7CisJY2hhciAqc3Q7CisJaW50IHJldDsKKworCWNtZC0+aW5jbHVkZV9oaXN0b3JpY2FsX2x2cyA9IDE7CisKKwlpZiAoYXJnYyA9PSAzKSB7CisJCXZnX25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCBhcmd2WzBdLCBOVUxMKTsKKwkJbHZfbmFtZV9vbGQgPSBhcmd2WzFdOworCQlsdl9uYW1lX25ldyA9IGFyZ3ZbMl07CisJCWlmIChzdHJjaHIobHZfbmFtZV9vbGQsICcvJykgJiYKKwkJICAgICh2Z19uYW1lX29sZCA9IGV4dHJhY3RfdmduYW1lKGNtZCwgbHZfbmFtZV9vbGQpKSAmJgorCQkgICAgc3RyY21wKHZnX25hbWVfb2xkLCB2Z19uYW1lKSkgeworCQkJbG9nX2Vycm9yKCJQbGVhc2UgdXNlIGEgc2luZ2xlIHZvbHVtZSBncm91cCBuYW1lICIKKwkJCQkgICIoXCIlc1wiIG9yIFwiJXNcIikiLCB2Z19uYW1lLCB2Z19uYW1lX29sZCk7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKwl9IGVsc2UgaWYgKGFyZ2MgPT0gMikgeworCQlsdl9uYW1lX29sZCA9IGFyZ3ZbMF07CisJCWx2X25hbWVfbmV3ID0gYXJndlsxXTsKKwkJdmdfbmFtZSA9IGV4dHJhY3RfdmduYW1lKGNtZCwgbHZfbmFtZV9vbGQpOworCX0gZWxzZSB7CisJCWxvZ19lcnJvcigiT2xkIGFuZCBuZXcgbG9naWNhbCB2b2x1bWUgbmFtZXMgcmVxdWlyZWQiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghdmFsaWRhdGVfbmFtZSh2Z19uYW1lKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdm9sdW1lIGdyb3VwIG5hbWUiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChzdHJjaHIobHZfbmFtZV9uZXcsICcvJykgJiYKKwkgICAgKHZnX25hbWVfbmV3ID0gZXh0cmFjdF92Z25hbWUoY21kLCBsdl9uYW1lX25ldykpICYmCisJICAgIHN0cmNtcCh2Z19uYW1lLCB2Z19uYW1lX25ldykpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSBuYW1lcyBtdXN0ICIKKwkJCSAgImhhdmUgdGhlIHNhbWUgdm9sdW1lIGdyb3VwIChcIiVzXCIgb3IgXCIlc1wiKSIsCisJCQkgIHZnX25hbWUsIHZnX25hbWVfbmV3KTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICgoc3QgPSBzdHJyY2hyKGx2X25hbWVfb2xkLCAnLycpKSkKKwkJbHZfbmFtZV9vbGQgPSBzdCArIDE7CisKKwlpZiAoKHN0ID0gc3RycmNocihsdl9uYW1lX25ldywgJy8nKSkpCisJCWx2X25hbWVfbmV3ID0gc3QgKyAxOworCisJaWYgKCFzdHJuY21wKGx2X25hbWVfb2xkLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgc3RybGVuKEhJU1RPUklDQUxfTFZfUFJFRklYKSkpIHsKKwkJbHZfbmFtZV9vbGQgPSBsdl9uYW1lX29sZCArIHN0cmxlbihISVNUT1JJQ0FMX0xWX1BSRUZJWCk7CisJCWhpc3RvcmljYWwgPSAxOworCX0KKworCWlmICghc3RybmNtcChsdl9uYW1lX25ldywgSElTVE9SSUNBTF9MVl9QUkVGSVgsIHN0cmxlbihISVNUT1JJQ0FMX0xWX1BSRUZJWCkpKSB7CisJCWlmIChoaXN0b3JpY2FsKQorCQkJbHZfbmFtZV9uZXcgPSBsdl9uYW1lX29sZCArIHN0cmxlbihISVNUT1JJQ0FMX0xWX1BSRUZJWCk7CisJCWVsc2UgeworCQkJbG9nX2Vycm9yKCJPbGQgbmFtZSByZWZlcmVuY2VzIGxpdmUgTFYgd2hpbGUgIgorCQkJCSAgIm5ldyBuYW1lIGlzIGZvciBoaXN0b3JpY2FsIExWLiIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJfQorCisJLyogQ2hlY2sgc2FuaXR5IG9mIG5ldyBuYW1lICovCisJbWF4bGVuID0gTkFNRV9MRU4gLSBzdHJsZW4odmdfbmFtZSkgLSAzOworCWlmIChzdHJsZW4obHZfbmFtZV9uZXcpID4gbWF4bGVuKSB7CisJCWxvZ19lcnJvcigiTmV3IGxvZ2ljYWwgdm9sdW1lIG5hbWUgXCIlc1wiIG1heSBub3QgZXhjZWVkICUiCisJCQkgIFBSSXNpemVfdCAiIGNoYXJhY3RlcnMuIiwgbHZfbmFtZV9uZXcsIG1heGxlbik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoISpsdl9uYW1lX25ldykgeworCQlsb2dfZXJyb3IoIk5ldyBsb2dpY2FsIHZvbHVtZSBuYW1lIG1heSBub3QgYmUgYmxhbmsiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghYXBwbHlfbHZuYW1lX3Jlc3RyaWN0aW9ucyhsdl9uYW1lX25ldykpIHsKKwkJc3RhY2s7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoIXZhbGlkYXRlX25hbWUobHZfbmFtZV9uZXcpKSB7CisJCWxvZ19lcnJvcigiTmV3IGxvZ2ljYWwgdm9sdW1lIG5hbWUgXCIlc1wiIGlzIGludmFsaWQiLAorCQkJICBsdl9uYW1lX25ldyk7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoIXN0cmNtcChsdl9uYW1lX29sZCwgbHZfbmFtZV9uZXcpKSB7CisJCWxvZ19lcnJvcigiT2xkIGFuZCBuZXcgbG9naWNhbCB2b2x1bWUgbmFtZXMgbXVzdCBkaWZmZXIiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWxwLmhpc3RvcmljYWwgPSBoaXN0b3JpY2FsOworCisJaWYgKCEobHAubHZfbmFtZV9vbGQgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgbHZfbmFtZV9vbGQpKSkKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCisJaWYgKCEobHAubHZfbmFtZV9uZXcgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgbHZfbmFtZV9uZXcpKSkKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCisJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb2Nlc3NpbmcgaGFuZGxlLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJmxwOworCisJcmV0ID0gcHJvY2Vzc19lYWNoX3ZnKGNtZCwgMCwgTlVMTCwgdmdfbmFtZSwgTlVMTCwgUkVBRF9GT1JfVVBEQVRFLCAwLCBoYW5kbGUsCisJCQkgICAgICBfbHZyZW5hbWVfc2luZ2xlKTsKKworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2x2cmVzaXplLmMgYi90b29scy9sdnJlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmQwZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdnJlc2l6ZS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0YXRpYyBpbnQgX2x2cmVzaXplX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBsdnJlc2l6ZV9wYXJhbXMgKmxwKQoreworCWNvbnN0IGNoYXIgKmNtZF9uYW1lID0gY29tbWFuZF9uYW1lKGNtZCk7CisJY29uc3QgY2hhciAqdHlwZV9zdHIgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgdHlwZV9BUkcsIE5VTEwpOworCisJaWYgKHR5cGVfc3RyICYmIChscC0+c2VndHlwZSA9IGdldF9zZWd0eXBlX2Zyb21fc3RyaW5nKGNtZCwgdHlwZV9zdHIpKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXN0cmNtcChjbWRfbmFtZSwgImx2cmVkdWNlIikpCisJCWxwLT5yZXNpemUgPSBMVl9SRURVQ0U7CisJZWxzZSBpZiAoIXN0cmNtcChjbWRfbmFtZSwgImx2ZXh0ZW5kIikpCisJCWxwLT5yZXNpemUgPSBMVl9FWFRFTkQ7CisJZWxzZQorCQlscC0+cmVzaXplID0gTFZfQU5ZOworCisJbHAtPnNpZ24gPSBscC0+cG9vbG1ldGFkYXRhX3NpZ24gPSBTSUdOX05PTkU7CisKKwlpZiAoKGxwLT51c2VfcG9saWNpZXMgPSBhcmdfaXNfc2V0KGNtZCwgdXNlcG9saWNpZXNfQVJHKSkpIHsKKwkJLyogZG8gbm90aGluZzsgbHZfcmVzaXplIHdpbGwgaGFuZGxlIC0tdXNlLXBvbGljaWVzIGl0c2VsZiAqLworCQlpZiAoYXJnX2Zyb21fbGlzdF9pc19zZXQoY21kLCBOVUxMLAorCQkJCQkgY2h1bmtzaXplX0FSRywgZXh0ZW50c19BUkcsCisJCQkJCSBwb29sbWV0YWRhdGFzaXplX0FSRywKKwkJCQkJIHJlZ2lvbnNpemVfQVJHLAorCQkJCQkgc2l6ZV9BUkcsCisJCQkJCSBzdHJpcGVzX0FSRywgc3RyaXBlc2l6ZV9BUkcsCisJCQkJCSAtMSkpCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiSWdub3Jpbmcgc2l6ZSBwYXJhbWV0ZXJzIHdpdGggLS11c2UtcG9saWNpZXMuIik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWxsb3cgb21pc3Npb24gb2YgZXh0ZW50cyBhbmQgc2l6ZSBpZiB0aGUgdXNlciBoYXMgZ2l2ZW4gdXMKKwkJICogb25lIG9yIG1vcmUgUFZzLiAgTW9zdCBsaWtlbHksIHRoZSBpbnRlbnQgd2FzICJyZXNpemUgdGhpcworCQkgKiBMViB0aGUgYmVzdCB5b3UgY2FuIHdpdGggdGhlc2UgUFZzIgorCQkgKiBJZiBvbmx5IC0tcG9vbG1ldGFkYXRhc2l6ZSBpcyBzcGVjaWZpZWQgd2l0aCBsaXN0IG9mIFBWcywKKwkJICogdGhlbiBtZXRhZGF0YSB3aWxsIGJlIGV4dGVuZGVkIHRoZXJlLgorCQkgKi8KKwkJaWYgKChscC0+ZXh0ZW50cyA9IGFyZ191aW50X3ZhbHVlKGNtZCwgZXh0ZW50c19BUkcsIDApKSkgeworCQkJbHAtPnNpZ24gPSBhcmdfc2lnbl92YWx1ZShjbWQsIGV4dGVudHNfQVJHLCBTSUdOX05PTkUpOworCQkJbHAtPnBlcmNlbnQgPSBhcmdfcGVyY2VudF92YWx1ZShjbWQsIGV4dGVudHNfQVJHLCBQRVJDRU5UX05PTkUpOworCQl9CisKKwkJaWYgKGFyZ19mcm9tX2xpc3RfaXNfemVybyhjbWQsICJtYXkgbm90IGJlIHplcm8iLAorCQkJCQkgIGNodW5rc2l6ZV9BUkcsIGV4dGVudHNfQVJHLAorCQkJCQkgIHBvb2xtZXRhZGF0YXNpemVfQVJHLAorCQkJCQkgIHJlZ2lvbnNpemVfQVJHLAorCQkJCQkgIHNpemVfQVJHLAorCQkJCQkgIHN0cmlwZXNfQVJHLCBzdHJpcGVzaXplX0FSRywKKwkJCQkJICB2aXJ0dWFsc2l6ZV9BUkcsCisJCQkJCSAgLTEpKQorCQkJcmV0dXJuXzA7CisKKwkJaWYgKChscC0+cG9vbG1ldGFkYXRhX3NpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgcG9vbG1ldGFkYXRhc2l6ZV9BUkcsIDApKSkgeworCQkJbHAtPnBvb2xtZXRhZGF0YV9zaWduID0gYXJnX3NpZ25fdmFsdWUoY21kLCBwb29sbWV0YWRhdGFzaXplX0FSRywgU0lHTl9OT05FKTsKKwkJCWlmIChscC0+cG9vbG1ldGFkYXRhX3NpZ24gPT0gU0lHTl9NSU5VUykgeworCQkJCWxvZ19lcnJvcigiQ2FuJ3QgcmVkdWNlIHBvb2wgbWV0YWRhdGEgc2l6ZS4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCWlmICgobHAtPnNpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgc2l6ZV9BUkcsIDApKSkgeworCQkJbHAtPnNpZ24gPSBhcmdfc2lnbl92YWx1ZShjbWQsIHNpemVfQVJHLCBTSUdOX05PTkUpOworCQkJbHAtPnBlcmNlbnQgPSBQRVJDRU5UX05PTkU7CisJCX0KKworCQlpZiAobHAtPnNpemUgJiYgbHAtPmV4dGVudHMpIHsKKwkJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHNpemUgb3IgZXh0ZW50cyBidXQgbm90IGJvdGguIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghbHAtPmV4dGVudHMgJiYKKwkJICAgICFscC0+c2l6ZSAmJgorCQkgICAgIWxwLT5wb29sbWV0YWRhdGFfc2l6ZSAmJgorCQkgICAgKGFyZ2MgPj0gMikpIHsKKwkJCWxwLT5leHRlbnRzID0gMTAwOworCQkJbHAtPnBlcmNlbnQgPSBQRVJDRU5UX1BWUzsKKwkJCWxwLT5zaWduID0gU0lHTl9QTFVTOworCQl9CisJfQorCisJaWYgKGxwLT5yZXNpemUgPT0gTFZfRVhURU5EICYmIGxwLT5zaWduID09IFNJR05fTUlOVVMpIHsKKwkJbG9nX2Vycm9yKCJOZWdhdGl2ZSBhcmd1bWVudCBub3QgcGVybWl0dGVkIC0gdXNlIGx2cmVkdWNlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHAtPnJlc2l6ZSA9PSBMVl9SRURVQ0UgJiYKKwkgICAgKChscC0+c2lnbiA9PSBTSUdOX1BMVVMpIHx8CisJICAgICAobHAtPnBvb2xtZXRhZGF0YV9zaWduID09IFNJR05fUExVUykpKSB7CisJCWxvZ19lcnJvcigiUG9zaXRpdmUgc2lnbiBub3QgcGVybWl0dGVkIC0gdXNlIGx2ZXh0ZW5kLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyZ2MpIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2UgcHJvdmlkZSB0aGUgbG9naWNhbCB2b2x1bWUgbmFtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbHAtPmx2X25hbWUgPSBhcmd2WzBdOworCisJaWYgKCF2YWxpZGF0ZV9sdm5hbWVfcGFyYW0oY21kLCAmbHAtPnZnX25hbWUsICZscC0+bHZfbmFtZSkpCisJCXJldHVybl8wOworCisJLyogQ2hlY2sgZm9yICRMVk1fVkdfTkFNRSAqLworCWlmICghbHAtPnZnX25hbWUgJiYgIShscC0+dmdfbmFtZSA9IGV4dHJhY3RfdmduYW1lKGNtZCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHNwZWNpZnkgYSBsb2dpY2FsIHZvbHVtZSBwYXRoLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGxwLT5taXJyb3JzID0gYXJnX2NvdW50KGNtZCwgbWlycm9yc19BUkcpKSAmJgorCSAgICAoYXJnX3NpZ25fdmFsdWUoY21kLCBtaXJyb3JzX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSkgeworCQlsb2dfZXJyb3IoIk1pcnJvcnMgYXJndW1lbnQgbWF5IG5vdCBiZSBzaWduZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgobHAtPnN0cmlwZXMgPSBhcmdfdWludF92YWx1ZShjbWQsIHN0cmlwZXNfQVJHLCAwKSkgJiYKKwkgICAgKGFyZ19zaWduX3ZhbHVlKGNtZCwgc3RyaXBlc19BUkcsIFNJR05fTk9ORSkgPT0gU0lHTl9NSU5VUykpIHsKKwkJbG9nX2Vycm9yKCJTdHJpcGVzIGFyZ3VtZW50IG1heSBub3QgYmUgbmVnYXRpdmUuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgobHAtPnN0cmlwZV9zaXplID0gYXJnX3VpbnQ2NF92YWx1ZShjbWQsIHN0cmlwZXNpemVfQVJHLCAwKSkgJiYKKwkgICAgKGFyZ19zaWduX3ZhbHVlKGNtZCwgc3RyaXBlc2l6ZV9BUkcsIFNJR05fTk9ORSkgPT0gU0lHTl9NSU5VUykpIHsKKwkJbG9nX2Vycm9yKCJTdHJpcGVzaXplIG1heSBub3QgYmUgbmVnYXRpdmUuIik7CisJCXJldHVybiAwOworCX0KKworCWxwLT5hcmdjID0gLS1hcmdjOworCWxwLT5hcmd2ID0gKythcmd2OworCisJbHAtPmFsbG9jID0gKGFsbG9jX3BvbGljeV90KSBhcmdfdWludF92YWx1ZShjbWQsIGFsbG9jX0FSRywgMCk7CisJbHAtPmZvcmNlID0gYXJnX2lzX3NldChjbWQsIGZvcmNlX0FSRyk7CisJbHAtPm5vZnNjayA9IGFyZ19pc19zZXQoY21kLCBub2ZzY2tfQVJHKTsKKwlscC0+bm9zeW5jID0gYXJnX2lzX3NldChjbWQsIG5vc3luY19BUkcpOworCWxwLT5yZXNpemVmcyA9IGFyZ19pc19zZXQoY21kLCByZXNpemVmc19BUkcpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2x2cmVzaXplX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqbHAgPSAoc3RydWN0IGx2cmVzaXplX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IGRtX2xpc3QgKnB2aDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCWludCByZXQgPSBFQ01EX0ZBSUxFRDsKKworCS8qIERvZXMgTFYgZXhpc3Q/ICovCisJaWYgKCEobHYgPSBmaW5kX2x2KHZnLCBscC0+bHZfbmFtZSkpKSB7CisJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgbm90IGZvdW5kIGluIHZvbHVtZSBncm91cCAlcy4iLAorCQkJICBscC0+bHZfbmFtZSwgdmctPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShwdmggPSBscC0+YXJnYyA/IGNyZWF0ZV9wdl9saXN0KGNtZC0+bWVtLCB2ZywgbHAtPmFyZ2MsIGxwLT5hcmd2LCAxKSA6ICZ2Zy0+cHZzKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWx2X3Jlc2l6ZShsdiwgbHAsIHB2aCkpCisJCWdvdG9fb3V0OworCisJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGx2cmVzaXplKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGU7CisJc3RydWN0IGx2cmVzaXplX3BhcmFtcyBscCA9IHsgMCB9OworCWludCByZXQ7CisKKwlpZiAoIV9sdnJlc2l6ZV9wYXJhbXMoY21kLCBhcmdjLCBhcmd2LCAmbHApKSB7CisJCXN0YWNrOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb2Nlc3NpbmcgaGFuZGxlLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJmxwOworCisJcmV0ID0gcHJvY2Vzc19lYWNoX3ZnKGNtZCwgMCwgTlVMTCwgbHAudmdfbmFtZSwgTlVMTCwgUkVBRF9GT1JfVVBEQVRFLCAwLCBoYW5kbGUsCisJCQkgICAgICAmX2x2cmVzaXplX3NpbmdsZSk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9sdnNjYW4uYyBiL3Rvb2xzL2x2c2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdnNjYW4uYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IF9sdnNjYW5fc2luZ2xlX2x2bWV0YWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgZG1fbGlzdCBhbGxfcHZzOworCWNoYXIgcHZpZF9zWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKKwlpZiAoIWx2bWV0YWRfdXNlZCgpKQorCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwlkbV9saXN0X2luaXQoJmFsbF9wdnMpOworCisJaWYgKCFnZXRfcHZfbGlzdF9mb3JfbHYobHYtPnZnLT52Z21lbSwgbHYsICZhbGxfcHZzKSkKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJmFsbF9wdnMpIHsKKwkJaWYgKCFwdmwtPnB2LT5kZXYpIHsKKwkJCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdmwtPnB2LT5pZCwgcHZpZF9zLCBzaXplb2YocHZpZF9zKSkpCisJCQkJc3RhY2s7CisJCQllbHNlCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IERldmljZSBmb3IgUFYgJXMgYWxyZWFkeSBtaXNzaW5nLCBza2lwcGluZy4iLAorCQkJCQkgcHZpZF9zKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbHZtZXRhZF9wdnNjYW5fc2luZ2xlKGNtZCwgcHZsLT5wdi0+ZGV2LCBOVUxMLCBOVUxMKSkKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgbHZzY2FuX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisJaW50IGlua2VybmVsLCBzbmFwX2FjdGl2ZSA9IDE7CisJZG1fcGVyY2VudF90IHNuYXBfcGVyY2VudDsgICAgIC8qIGZ1c2VkLCBmc2l6ZTsgKi8KKworCWNvbnN0IGNoYXIgKmFjdGl2ZV9zdHIsICpzbmFwc2hvdF9zdHI7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNhY2hlX2xvbmdfQVJHKSkKKwkJcmV0dXJuIF9sdnNjYW5fc2luZ2xlX2x2bWV0YWQoY21kLCBsdik7CisKKwlpZiAoIWFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSAmJiAhbHZfaXNfdmlzaWJsZShsdikpCisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKworCWlua2VybmVsID0gbHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkgJiYgaW5mby5leGlzdHM7CisJaWYgKGx2X2lzX2NvdyhsdikpIHsKKwkJaWYgKGlua2VybmVsICYmCisJCSAgICAoc25hcF9hY3RpdmUgPSBsdl9zbmFwc2hvdF9wZXJjZW50KGx2LCAmc25hcF9wZXJjZW50KSkpCisJCQlpZiAoc25hcF9wZXJjZW50ID09IERNX1BFUkNFTlRfSU5WQUxJRCkKKwkJCQlzbmFwX2FjdGl2ZSA9IDA7CisJfQorCisvKiBGSVhNRSBBZGQgLUQgYXJnIHRvIHNraXAgdGhpcyEgKi8KKwlpZiAoaW5rZXJuZWwgJiYgc25hcF9hY3RpdmUpCisJCWFjdGl2ZV9zdHIgPSAiQUNUSVZFICAgIjsKKwllbHNlCisJCWFjdGl2ZV9zdHIgPSAiaW5hY3RpdmUgIjsKKworCWlmIChsdl9pc19vcmlnaW4obHYpKQorCQlzbmFwc2hvdF9zdHIgPSAiT3JpZ2luYWwiOworCWVsc2UgaWYgKGx2X2lzX2NvdyhsdikpCisJCXNuYXBzaG90X3N0ciA9ICJTbmFwc2hvdCI7CisJZWxzZQorCQlzbmFwc2hvdF9zdHIgPSAiICAgICAgICAiOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzJXMgJyVzJXMvJXMnIFslc10gJXMiLCBhY3RpdmVfc3RyLCBzbmFwc2hvdF9zdHIsCisJCQkJY21kLT5kZXZfZGlyLCBsdi0+dmctPm5hbWUsIGx2LT5uYW1lLAorCQkJCWRpc3BsYXlfc2l6ZShjbWQsIGx2LT5zaXplKSwKKwkJCQlnZXRfYWxsb2Nfc3RyaW5nKGx2LT5hbGxvYykpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitpbnQgbHZzY2FuKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKworCWlmIChhcmdjICYmICFhcmdfaXNfc2V0KGNtZCwgY2FjaGVfbG9uZ19BUkcpKSB7CisJCWxvZ19lcnJvcigiTm8gYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFsbG93ZWQiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICghbHZtZXRhZF91c2VkKCkgJiYgYXJnX2lzX3NldChjbWQsIGNhY2hlX2xvbmdfQVJHKSkKKwkJbG9nX3ZlcmJvc2UoIklnbm9yaW5nIGx2c2NhbiAtLWNhY2hlIGJlY2F1c2UgbHZtZXRhZCBpcyBub3QgaW4gdXNlLiIpOworCisJLyogTmVlZGVkIGJlY2F1c2UgdGhpcyBjb21tYW5kIGhhcyBOT19MVk1FVEFEX0FVVE9TQ0FOLiAqLworCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAoIWx2bWV0YWRfdG9rZW5fbWF0Y2hlcyhjbWQpIHx8IGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkpIHsKKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmICFsdm1ldGFkX3B2c2Nhbl9hbGxfZGV2cyhjbWQsIDApKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSBjYWNoZSB1cGRhdGUgZmFpbGVkLiIpOworCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQl9CisKKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmIGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgJXMuIiwgcmVhc29uKTsKKwkJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJfQorCisJCS8qCisJCSAqIEZJWE1FOiBkb2luZyBsdnNjYW4gLS1jYWNoZSBhZnRlciBhIGZ1bGwgc2NhbiBpcyBwb2ludGxlc3MuCisJCSAqIFNob3VsZCB0aGUgY2FjaGUgY2FzZSBqdXN0IGV4aXQgaGVyZT8KKwkJICovCisJfQorCisJcmV0dXJuIHByb2Nlc3NfZWFjaF9sdihjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsIDAsIE5VTEwsICZsdnNjYW5fc2luZ2xlKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BvbGxkYWVtb24uYyBiL3Rvb2xzL3BvbGxkYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjY0YzRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG9sbGRhZW1vbi5jCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJwb2xsZGFlbW9uLmgiCisjaW5jbHVkZSAibHZtMmNtZGxpbmUuaCIKKyNpbmNsdWRlICJsdm1wb2xsZC1jbGllbnQuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2RlZmluZSBXQUlUX0FUX0xFQVNUX05BTk9TRUNTIDEwMDAwMAorCitwcm9ncmVzc190IHBvbGxfbWlycm9yX3Byb2dyZXNzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpCit7CisJZG1fcGVyY2VudF90IHNlZ21lbnRfcGVyY2VudCA9IERNX1BFUkNFTlRfMCwgb3ZlcmFsbF9wZXJjZW50ID0gRE1fUEVSQ0VOVF8wOworCXVpbnQzMl90IGV2ZW50X25yID0gMDsKKworCWlmICghbHZfaXNfbWlycm9yZWQobHYpIHx8CisJICAgICFsdl9taXJyb3JfcGVyY2VudChjbWQsIGx2LCAhcGFybXMtPmludGVydmFsLCAmc2VnbWVudF9wZXJjZW50LAorCQkJICAgICAgICZldmVudF9ucikgfHwKKwkgICAgKHNlZ21lbnRfcGVyY2VudCA9PSBETV9QRVJDRU5UX0lOVkFMSUQpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IE1pcnJvciBwZXJjZW50YWdlIGNoZWNrIGZhaWxlZC4iKTsKKwkJcmV0dXJuIFBST0dSRVNTX0NIRUNLX0ZBSUxFRDsKKwl9CisKKwlvdmVyYWxsX3BlcmNlbnQgPSBjb3B5X3BlcmNlbnQobHYpOworCWlmIChwYXJtcy0+cHJvZ3Jlc3NfZGlzcGxheSkKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzOiAlczogJS4yZiUlIiwgbmFtZSwgcGFybXMtPnByb2dyZXNzX3RpdGxlLAorCQkJCQlkbV9wZXJjZW50X3RvX2Zsb2F0KG92ZXJhbGxfcGVyY2VudCkpOworCWVsc2UKKwkJbG9nX3ZlcmJvc2UoIiVzOiAlczogJS4yZiUlIiwgbmFtZSwgcGFybXMtPnByb2dyZXNzX3RpdGxlLAorCQkJICAgIGRtX3BlcmNlbnRfdG9fZmxvYXQob3ZlcmFsbF9wZXJjZW50KSk7CisKKwlpZiAoc2VnbWVudF9wZXJjZW50ICE9IERNX1BFUkNFTlRfMTAwKQorCQlyZXR1cm4gUFJPR1JFU1NfVU5GSU5JU0hFRDsKKworCWlmIChvdmVyYWxsX3BlcmNlbnQgPT0gRE1fUEVSQ0VOVF8xMDApCisJCXJldHVybiBQUk9HUkVTU19GSU5JU0hFRF9BTEw7CisKKwlyZXR1cm4gUFJPR1JFU1NfRklOSVNIRURfU0VHTUVOVDsKK30KKworc3RhdGljIGludCBfY2hlY2tfbHZfc3RhdHVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMsCisJCQkgICAgaW50ICpmaW5pc2hlZCkKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQ7CisJcHJvZ3Jlc3NfdCBwcm9ncmVzczsKKworCS8qIEJ5IGRlZmF1bHQsIGNhbGxlciBzaG91bGQgbm90IHJldHJ5ICovCisJKmZpbmlzaGVkID0gMTsKKworCWlmIChwYXJtcy0+YWJvcnRpbmcpIHsKKwkJaWYgKCEobHZzX2NoYW5nZWQgPSBsdnNfdXNpbmdfbHYoY21kLCB2ZywgbHYpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgbGlzdCBvZiBjb3BpZWQgTFZzOiAiCisJCQkJICAiY2FuJ3QgYWJvcnQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXBhcm1zLT5wb2xsX2Zucy0+ZmluaXNoX2NvcHkoY21kLCB2ZywgbHYsIGx2c19jaGFuZ2VkKSkKKwkJCXJldHVybl8wOworCisJCXJldHVybiAxOworCX0KKworCXByb2dyZXNzID0gcGFybXMtPnBvbGxfZm5zLT5wb2xsX3Byb2dyZXNzKGNtZCwgbHYsIG5hbWUsIHBhcm1zKTsKKwlpZiAocHJvZ3Jlc3MgPT0gUFJPR1JFU1NfQ0hFQ0tfRkFJTEVEKQorCQlyZXR1cm5fMDsKKworCWlmIChwcm9ncmVzcyA9PSBQUk9HUkVTU19VTkZJTklTSEVEKSB7CisJCS8qIFRoZSBvbmx5IGNhc2UgdGhlIGNhbGxlciAqc2hvdWxkKiB0cnkgYWdhaW4gbGF0ZXIgKi8KKwkJKmZpbmlzaGVkID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCEobHZzX2NoYW5nZWQgPSBsdnNfdXNpbmdfbHYoY21kLCB2ZywgbHYpKSkgeworCQlsb2dfZXJyb3IoIkFCT1JUSU5HOiBGYWlsZWQgdG8gZ2VuZXJhdGUgbGlzdCBvZiBjb3BpZWQgTFZzIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmlzaGVkPyBPciBwcm9ncmVzcyB0byBuZXh0IHNlZ21lbnQ/ICovCisJaWYgKHByb2dyZXNzID09IFBST0dSRVNTX0ZJTklTSEVEX0FMTCkgeworCQlpZiAoIXBhcm1zLT5wb2xsX2Zucy0+ZmluaXNoX2NvcHkoY21kLCB2ZywgbHYsIGx2c19jaGFuZ2VkKSkKKwkJCXJldHVybl8wOworCX0gZWxzZSB7CisJCWlmIChwYXJtcy0+cG9sbF9mbnMtPnVwZGF0ZV9tZXRhZGF0YSAmJgorCQkgICAgIXBhcm1zLT5wb2xsX2Zucy0+dXBkYXRlX21ldGFkYXRhKGNtZCwgdmcsIGx2LCBsdnNfY2hhbmdlZCwgMCkpIHsKKwkJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFNlZ21lbnQgcHJvZ3Jlc3Npb24gZmFpbGVkLiIpOworCQkJcGFybXMtPnBvbGxfZm5zLT5maW5pc2hfY29weShjbWQsIHZnLCBsdiwgbHZzX2NoYW5nZWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmZpbmlzaGVkID0gMDsJLyogQW5vdGhlciBzZWdtZW50ICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9uYW5vc2xlZXAodW5zaWduZWQgc2VjcywgdW5zaWduZWQgYWxsb3dfemVyb190aW1lKQoreworCXN0cnVjdCB0aW1lc3BlYyB3dGltZSA9IHsKKwkJLnR2X3NlYyA9IHNlY3MsCisJfTsKKworCWlmICghc2VjcyAmJiAhYWxsb3dfemVyb190aW1lKQorCQl3dGltZS50dl9uc2VjID0gV0FJVF9BVF9MRUFTVF9OQU5PU0VDUzsKKworCXdoaWxlICghbmFub3NsZWVwKCZ3dGltZSwgJnd0aW1lKSAmJiBlcnJubyA9PSBFSU5UUikge30KK30KKworc3RhdGljIHZvaWQgX3NsZWVwX2FuZF9yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcykKK3sKKwlpZiAocGFybXMtPmludGVydmFsICYmICFwYXJtcy0+YWJvcnRpbmcpIHsKKwkJZGV2X2Nsb3NlX2FsbCgpOworCQlfbmFub3NsZWVwKHBhcm1zLT5pbnRlcnZhbCwgMSk7CisJCS8qIERldmljZXMgbWlnaHQgaGF2ZSBjaGFuZ2VkIHdoaWxlIHdlIHNsZXB0ICovCisJCWluaXRfZnVsbF9zY2FuX2RvbmUoMCk7CisJfQorfQorCitpbnQgd2FpdF9mb3Jfc2luZ2xlX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkLAorCQkgICAgICAgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMpCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmcgPSBOVUxMOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJaW50IGZpbmlzaGVkID0gMDsKKwl1aW50MzJfdCBsb2NrZF9zdGF0ZSA9IDA7CisJaW50IHJldDsKKworCS8qIFBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwl3aGlsZSAoIWZpbmlzaGVkKSB7CisJCWlmIChwYXJtcy0+d2FpdF9iZWZvcmVfdGVzdGluZykKKwkJCV9zbGVlcF9hbmRfcmVzY2FuX2RldmljZXMocGFybXMpOworCisJCS8qCisJCSAqIEFuIGV4IFZHIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGNoZWNrIGNhbiBjYWxsIGZpbmlzaF9jb3B5CisJCSAqIHdoaWNoIHdyaXRlcyB0aGUgVkcuCisJCSAqLworCQlpZiAoIWxvY2tkX3ZnKGNtZCwgaWQtPnZnX25hbWUsICJleCIsIDAsICZsb2NrZF9zdGF0ZSkpIHsKKwkJCWxvZ19lcnJvcigiQUJPUlRJTkc6IENhbid0IGxvY2sgVkcgZm9yICVzLiIsIGlkLT5kaXNwbGF5X25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBMb2NrcyB0aGUgKHBvc3NpYmx5IHJlbmFtZWQpIFZHIGFnYWluICovCisJCXZnID0gdmdfcmVhZChjbWQsIGlkLT52Z19uYW1lLCBOVUxMLCBSRUFEX0ZPUl9VUERBVEUsIGxvY2tkX3N0YXRlKTsKKwkJaWYgKHZnX3JlYWRfZXJyb3IodmcpKSB7CisJCQkvKiBXaGF0IG1vcmUgY291bGQgd2UgZG8gaGVyZT8gKi8KKwkJCWxvZ19lcnJvcigiQUJPUlRJTkc6IENhbid0IHJlcmVhZCBWRyBmb3IgJXMuIiwgaWQtPmRpc3BsYXlfbmFtZSk7CisJCQlyZWxlYXNlX3ZnKHZnKTsKKwkJCXZnID0gTlVMTDsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWx2ID0gZmluZF9sdih2ZywgaWQtPmx2X25hbWUpOworCisJCWlmIChsdiAmJiBpZC0+dXVpZCAmJiBzdHJjbXAoaWQtPnV1aWQsIChjaGFyICopJmx2LT5sdmlkKSkKKwkJCWx2ID0gTlVMTDsKKwkJaWYgKGx2ICYmIHBhcm1zLT5sdl90eXBlICYmICEobHYtPnN0YXR1cyAmIHBhcm1zLT5sdl90eXBlKSkKKwkJCWx2ID0gTlVMTDsKKworCQlpZiAoIWx2KSB7CisJCQlpZiAocGFybXMtPmx2X3R5cGUgPT0gUFZNT1ZFKQorCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCIlczogTm8gcHZtb3ZlIGluIHByb2dyZXNzIC0gYWxyZWFkeSBmaW5pc2hlZCBvciBhYm9ydGVkLiIsCisJCQkJCQkJaWQtPmRpc3BsYXlfbmFtZSk7CisJCQllbHNlCisJCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkNhbid0IGZpbmQgTFYgaW4gJXMgZm9yICVzLiIsCisJCQkJCQkJdmctPm5hbWUsIGlkLT5kaXNwbGF5X25hbWUpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIExWIGlzIG5vdCBhY3RpdmUgbG9jYWxseSwgdGhlIGtlcm5lbCBjYW5ub3QgYmUKKwkJICogcXVlcmllZCBmb3IgaXRzIHN0YXR1cy4gIFdlIG11c3QgZXhpdCBpbiB0aGlzIGNhc2UuCisJCSAqLworCQlpZiAoIWx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzOiBJbnRlcnJ1cHRlZDogTm8gbG9uZ2VyIGFjdGl2ZS4iLCBpZC0+ZGlzcGxheV9uYW1lKTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghX2NoZWNrX2x2X3N0YXR1cyhjbWQsIHZnLCBsdiwgaWQtPmRpc3BsYXlfbmFtZSwgcGFybXMsICZmaW5pc2hlZCkpIHsKKwkJCXJldCA9IDA7CisJCQlnb3RvX291dDsKKwkJfQorCisJCXVubG9ja19hbmRfcmVsZWFzZV92ZyhjbWQsIHZnLCB2Zy0+bmFtZSk7CisKKwkJaWYgKCFsb2NrZF92ZyhjbWQsIGlkLT52Z19uYW1lLCAidW4iLCAwLCAmbG9ja2Rfc3RhdGUpKQorCQkJc3RhY2s7CisKKwkJLyoKKwkJICogRklYTUUgU2xlZXBpbmcgYWZ0ZXIgdGVzdGluZywgd2hpbGUgcHJlZmVycmVkLCBhbHNvIHdvcmtzIGFyb3VuZAorCQkgKiB1bnJlbGlhYmxlICJmaW5pc2hlZCIgc3RhdGUgY2hlY2tpbmcgaW4gX3BlcmNlbnRfcnVuLiAgSWYgdGhlCisJCSAqIGFib3ZlIF9jaGVja19sdl9zdGF0dXMgaXMgZGVmZXJyZWQgdW50aWwgYWZ0ZXIgdGhlIGZpcnN0IHNsZWVwIGl0CisJCSAqIG1heSBiZSB0aGF0IGEgcG9sbGRhZW1vbiB3aWxsIHJ1biB3aXRob3V0IGV2ZXIgY29tcGxldGluZy4KKwkJICoKKwkJICogVGhpcyBoYXBwZW5zIHdoZW4gb25lIHNuYXBzaG90LW1lcmdlIHBvbGxkYWVtb24gaXMgcmFjaW5nIHdpdGgKKwkJICogYW5vdGhlciAocG9sbGluZyB0aGUgc2FtZSBMVikuICBUaGUgZmlyc3QgdG8gc2VlIHRoZSBMViBzdGF0dXMKKwkJICogcmVhY2ggdGhlICJmaW5pc2hlZCIgc3RhdGUgd2lsbCBhbHRlciB0aGUgTFYgdGhhdCB0aGUgb3RoZXIKKwkJICogcG9sbGRhZW1vbihzKSBhcmUgcG9sbGluZy4gIFRoZXNlIG90aGVyIHBvbGxkYWVtb24ocykgY2FuIHRoZW4KKwkJICogY29udGludWUgcG9sbGluZyBhbiBMViB0aGF0IGRvZXNuJ3QgaGF2ZSBhICJzdGF0dXMiLgorCQkgKi8KKwkJaWYgKCFwYXJtcy0+d2FpdF9iZWZvcmVfdGVzdGluZyAmJiAhZmluaXNoZWQpCisJCQlfc2xlZXBfYW5kX3Jlc2Nhbl9kZXZpY2VzKHBhcm1zKTsKKwl9CisKKwlyZXR1cm4gMTsKKworb3V0OgorCWlmICh2ZykKKwkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmcsIHZnLT5uYW1lKTsKKwlpZiAoIWxvY2tkX3ZnKGNtZCwgaWQtPnZnX25hbWUsICJ1biIsIDAsICZsb2NrZF9zdGF0ZSkpCisJCXN0YWNrOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBvbGxfaWRfbGlzdCB7CisJc3RydWN0IGRtX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkOworfTsKKworc3RhdGljIHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqY29weV9wb2xsX29wZXJhdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbCAqbWVtLAorCQkJCQkJCWNvbnN0IHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQpCit7CisJc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICpjb3B5OworCisJaWYgKCFpZCB8fCAhaWQtPnZnX25hbWUgfHwgIWlkLT5sdl9uYW1lIHx8ICFpZC0+ZGlzcGxheV9uYW1lIHx8ICFpZC0+dXVpZCkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIldyb25nIHBhcmFtcyBmb3IgY29weV9wb2xsX29wZXJhdGlvbl9pZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoY29weSA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKmNvcHkpKSkpIHsKKwkJbG9nX2Vycm9yKCJQb2xsIG9wZXJhdGlvbiBJRCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoY29weS0+ZGlzcGxheV9uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBpZC0+ZGlzcGxheV9uYW1lKSkgfHwKKwkgICAgIShjb3B5LT5sdl9uYW1lID0gZG1fcG9vbF9zdHJkdXAobWVtLCBpZC0+bHZfbmFtZSkpIHx8CisJICAgICEoY29weS0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKG1lbSwgaWQtPnZnX25hbWUpKSB8fAorCSAgICAhKGNvcHktPnV1aWQgPSBkbV9wb29sX3N0cmR1cChtZW0sIGlkLT51dWlkKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY29weSBvbmUgb3IgbW9yZSBwb2xsX29wZXJhdGlvbl9pZCBtZW1iZXJzLiIpOworCQlkbV9wb29sX2ZyZWUobWVtLCBjb3B5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGNvcHk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9pZF9saXN0KiBwb2xsX2lkX2xpc3RfY3JlYXRlKHN0cnVjdCBkbV9wb29sICptZW0sCisJCQkJCQljb25zdCBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkKQoreworCXN0cnVjdCBwb2xsX2lkX2xpc3QgKmlkbCA9IChzdHJ1Y3QgcG9sbF9pZF9saXN0ICopIGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2Yoc3RydWN0IHBvbGxfaWRfbGlzdCkpOworCisJaWYgKCFpZGwpIHsKKwkJbG9nX2Vycm9yKCJQb2xsIElEIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGlkbC0+aWQgPSBjb3B5X3BvbGxfb3BlcmF0aW9uX2lkKG1lbSwgaWQpKSkgeworCQlkbV9wb29sX2ZyZWUobWVtLCBpZGwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaWRsOworfQorCitzdGF0aWMgaW50IF9wb2xsX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z25hbWUsCisJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXM7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgZG1fbGlzdCBpZGxzOworCXN0cnVjdCBwb2xsX2lkX2xpc3QgKmlkbDsKKwlzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgaWQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlpbnQgZmluaXNoZWQ7CisKKwlpZiAoIWhhbmRsZSB8fCAhKHBhcm1zID0gKHN0cnVjdCBkYWVtb25fcGFybXMgKikgaGFuZGxlLT5jdXN0b21faGFuZGxlKSkgeworCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIkhhbmRsZSBpcyB1bmRlZmluZWQuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlkbV9saXN0X2luaXQoJmlkbHMpOworCisJLyoKKwkgKiBmaXJzdCBpdGVyYXRlIGFsbCBMVnMgaW4gYSBWRyBhbmQgY29sbGVjdCBMVnMgc3VpdGFibGUKKwkgKiBmb3IgcG9sbGluZyAob3IgYW4gYWJvcnQpIHdoaWNoIHRha2VzIHBsYWNlIGJlbG93CisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJbHYgPSBsdmwtPmx2OworCQlpZiAoIShsdi0+c3RhdHVzICYgcGFybXMtPmx2X3R5cGUpKQorCQkJY29udGludWU7CisJCWlkLmRpc3BsYXlfbmFtZSA9IHBhcm1zLT5wb2xsX2Zucy0+Z2V0X2NvcHlfbmFtZV9mcm9tX2x2KGx2KTsKKwkJaWYgKCFpZC5kaXNwbGF5X25hbWUgJiYgIXBhcm1zLT5hYm9ydGluZykKKwkJCWNvbnRpbnVlOworCisJCWlmICghaWQuZGlzcGxheV9uYW1lKSB7CisJCQlsb2dfZXJyb3IoIkRldmljZSBuYW1lIGZvciBMViAlcyBub3QgZm91bmQgaW4gbWV0YWRhdGEuICIKKwkJCQkgICIodW5maW5pc2hlZCBwdm1vdmUgbWlycm9yIHJlbW92YWw/KSIsIGRpc3BsYXlfbHZuYW1lKGx2KSk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIEZJWE1FIE5lZWQgdG8gZG8gdGhlIGFjdGl2YXRpb24gZnJvbSBfc2V0X3VwX3B2bW92ZSBoZXJlCisJCSAqICAgICAgIGlmIGl0J3Mgbm90IHJ1bm5pbmcgYW5kIHdlJ3JlIG5vdCBhYm9ydGluZy4gKi8KKwkJaWYgKCFsdl9pc19hY3RpdmUobHYpKSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiJXM6IFNraXBwaW5nIGluYWN0aXZlIExWLiBUcnkgbHZjaGFuZ2Ugb3IgdmdjaGFuZ2UuIiwgaWQuZGlzcGxheV9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWQubHZfbmFtZSA9IGx2LT5uYW1lOworCQlpZC52Z19uYW1lID0gdmctPm5hbWU7CisJCWlkLnV1aWQgPSBsdi0+bHZpZC5zOworCisJCWlkbCA9IHBvbGxfaWRfbGlzdF9jcmVhdGUoY21kLT5tZW0sICZpZCk7CisJCWlmICghaWRsKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgcG9sbF9pZF9saXN0LiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlkbV9saXN0X2FkZCgmaWRscywgJmlkbC0+bGlzdCk7CisJfQorCisJLyogcGVyZm9ybSB0aGUgcG9sbCBvcGVyYXRpb24gb24gTFZzIGNvbGxlY3RlZCBpbiBwcmV2aW91cyBjeWNsZSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhpZGwsICZpZGxzKSB7CisJCWlmICghKGx2ID0gZmluZF9sdih2ZywgaWRsLT5pZC0+bHZfbmFtZSkpKQorCQkJY29udGludWU7CisJCWlmIChpZGwtPmlkLT51dWlkICYmIHN0cmNtcChpZGwtPmlkLT51dWlkLCAoY2hhciAqKSZsdi0+bHZpZCkpCisJCQljb250aW51ZTsKKwkJaWYgKHBhcm1zLT5sdl90eXBlICYmICEobHYtPnN0YXR1cyAmIHBhcm1zLT5sdl90eXBlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoX2NoZWNrX2x2X3N0YXR1cyhjbWQsIHZnLCBsdiwgaWRsLT5pZC0+ZGlzcGxheV9uYW1lLCBwYXJtcywgJmZpbmlzaGVkKSAmJiAhZmluaXNoZWQpCisJCQlwYXJtcy0+b3V0c3RhbmRpbmdfY291bnQrKzsKKwl9CisKK2VycjoKKwlpZiAoIWRtX2xpc3RfZW1wdHkoJmlkbHMpKQorCQlkbV9wb29sX2ZyZWUoY21kLT5tZW0sIGRtX2xpc3RfaXRlbShkbV9saXN0X2ZpcnN0KCZpZGxzKSwgc3RydWN0IHBvbGxfaWRfbGlzdCkpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitzdGF0aWMgdm9pZCBfcG9sbF9mb3JfYWxsX3ZncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zID0gKHN0cnVjdCBkYWVtb25fcGFybXMgKikgaGFuZGxlLT5jdXN0b21faGFuZGxlOworCisJd2hpbGUgKDEpIHsKKwkJcGFybXMtPm91dHN0YW5kaW5nX2NvdW50ID0gMDsKKwkJcHJvY2Vzc19lYWNoX3ZnKGNtZCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgUkVBRF9GT1JfVVBEQVRFLCAwLCBoYW5kbGUsIF9wb2xsX3ZnKTsKKwkJaWYgKCFwYXJtcy0+b3V0c3RhbmRpbmdfY291bnQpCisJCQlicmVhazsKKwkJaWYgKHBhcm1zLT5pbnRlcnZhbCkKKwkJCWRldl9jbG9zZV9hbGwoKTsKKwkJX25hbm9zbGVlcChwYXJtcy0+aW50ZXJ2YWwsIDEpOworCX0KK30KKworI2lmZGVmIExWTVBPTExEX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtczsKKwlzdHJ1Y3QgZG1fbGlzdCBpZGxzOworfSBsdm1wb2xsZF9wYXJtc190OworCitzdGF0aWMgaW50IHJlcG9ydF9wcm9ncmVzcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCwKKwkJCSAgIHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJdWludDMyX3QgbG9ja2Rfc3RhdGUgPSAwOworCWludCByZXQ7CisKKwkvKgorCSAqIEl0J3MgcmVhc29uYWJsZSB0byBleHBlY3QgYSBsb2NrZF92Zygic2giKSBoZXJlLCBidXQgaXQgc2hvdWxkCisJICogbm90IGFjdHVhbGx5IGJlIG5lZWRlZCwgYmVjYXVzZSB3ZSBvbmx5IHJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb24KKwkgKiB0aGUgc2FtZSBob3N0IHdoZXJlIHRoZSBwdm1vdmUvbHZjb252ZXJ0IGlzIGhhcHBlbmluZy4gIFRoaXMgbWVhbnMKKwkgKiB0aGF0IHRoZSBsb2NhbCBwdm1vdmUvbHZjb252ZXJ0L2x2cG9sbCBjb21tYW5kcyBhcmUgdXBkYXRpbmcgdGhlCisJICogbG9jYWwgbHZtZXRhZCB3aXRoIHRoZSBsYXRlc3QgaW5mbyB0aGV5IGhhdmUsIGFuZCB3ZSBqdXN0IG5lZWQgdG8KKwkgKiByZWFkIHRoZSBsYXRlc3QgaW5mbyB0aGF0IHRoZXkgaGF2ZSBwdXQgaW50byBsdm1ldGFkIGFib3V0IHRoZWlyCisJICogcHJvZ3Jlc3MuICBObyBWRyBsb2NrIGlzIG5lZWRlZCB0byBwcm90ZWN0IGFueXRoaW5nIGhlcmUgKHdlJ3JlCisJICoganVzdCByZWFkaW5nIHRoZSBWRyksIGFuZCBubyBWRyBsb2NrIGlzIG5lZWRlZCB0byBmb3JjZSBhIFZHIHJlYWQKKwkgKiBmcm9tIGRpc2sgdG8gZ2V0IGNoYW5nZXMgZnJvbSBvdGhlciBob3N0cywgYmVjYXVzZSB0aGUgb25seSBjaGFuZ2UKKwkgKiB0byB0aGUgVkcgd2UncmUgaW50ZXJlc3RlZCBpbiBpcyB0aGUgY2hhbmdlIGRvbmUgbG9jYWxseS4KKwkgKi8KKworCXZnID0gdmdfcmVhZChjbWQsIGlkLT52Z19uYW1lLCBOVUxMLCAwLCBsb2NrZF9zdGF0ZSk7CisJaWYgKHZnX3JlYWRfZXJyb3IodmcpKSB7CisJCXJlbGVhc2VfdmcodmcpOworCQlsb2dfZXJyb3IoIkNhbid0IHJlcmVhZCBWRyBmb3IgJXMiLCBpZC0+ZGlzcGxheV9uYW1lKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXRfcmV0OworCX0KKworCWx2ID0gZmluZF9sdih2ZywgaWQtPmx2X25hbWUpOworCisJaWYgKGx2ICYmIGlkLT51dWlkICYmIHN0cmNtcChpZC0+dXVpZCwgKGNoYXIgKikmbHYtPmx2aWQpKQorCQlsdiA9IE5VTEw7CisKKwkvKgorCSAqIENPTlZFUlRJTkcgaXMgc2V0IG9ubHkgZHVyaW5nIG1pcnJvciB1cGNvbnZlcnNpb24gYnV0IHdlIG1heSBuZWVkIHRvCisJICogcmVhZCBMVidzIHByb2dyZXNzIGluZm8gZXZlbiB3aGVuIGl0J3Mgbm90IGNvbnZlcnRpbmcgKGxpbmVhci0+bWlycm9yKQorCSAqLworCWlmIChsdiAmJiAocGFybXMtPmx2X3R5cGUgXiBDT05WRVJUSU5HKSAmJiAhKGx2LT5zdGF0dXMgJiBwYXJtcy0+bHZfdHlwZSkpCisJCWx2ID0gTlVMTDsKKworCWlmICghbHYpIHsKKwkJaWYgKHBhcm1zLT5sdl90eXBlID09IFBWTU9WRSkKKwkJCWxvZ192ZXJib3NlKCIlczogTm8gcHZtb3ZlIGluIHByb2dyZXNzIC0gYWxyZWFkeSBmaW5pc2hlZCBvciBhYm9ydGVkLiIsCisJCQkJICAgIGlkLT5kaXNwbGF5X25hbWUpOworCQllbHNlCisJCQlsb2dfdmVyYm9zZSgiQ2FuJ3QgZmluZCBMViBpbiAlcyBmb3IgJXMuIEFscmVhZHkgZmluaXNoZWQgb3IgcmVtb3ZlZC4iLAorCQkJCSAgICB2Zy0+bmFtZSwgaWQtPmRpc3BsYXlfbmFtZSk7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbHZfaXNfYWN0aXZlX2xvY2FsbHkobHYpKSB7CisJCWxvZ192ZXJib3NlKCIlczogSW50ZXJydXB0ZWQ6IE5vIGxvbmdlciBhY3RpdmUuIiwgaWQtPmRpc3BsYXlfbmFtZSk7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwYXJtcy0+cG9sbF9mbnMtPnBvbGxfcHJvZ3Jlc3MoY21kLCBsdiwgaWQtPmRpc3BsYXlfbmFtZSwgcGFybXMpID09IFBST0dSRVNTX0NIRUNLX0ZBSUxFRCkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAxOworCitvdXQ6CisJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmcsIHZnLT5uYW1lKTsKK291dF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfbHZtcG9sbGRfaW5pdF9wb2xsX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z25hbWUsCisJCQkgICAgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWludCByOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlzdHJ1Y3QgcG9sbF9pZF9saXN0ICppZGw7CisJc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkIGlkOworCWx2bXBvbGxkX3Bhcm1zX3QgKmxwZHAgPSAobHZtcG9sbGRfcGFybXNfdCAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlsdiA9IGx2bC0+bHY7CisJCWlmICghKGx2LT5zdGF0dXMgJiBscGRwLT5wYXJtcy0+bHZfdHlwZSkpCisJCQljb250aW51ZTsKKworCQlpZC5kaXNwbGF5X25hbWUgPSBscGRwLT5wYXJtcy0+cG9sbF9mbnMtPmdldF9jb3B5X25hbWVfZnJvbV9sdihsdik7CisJCWlmICghaWQuZGlzcGxheV9uYW1lICYmICFscGRwLT5wYXJtcy0+YWJvcnRpbmcpCisJCQljb250aW51ZTsKKworCQlpZC52Z19uYW1lID0gbHYtPnZnLT5uYW1lOworCQlpZC5sdl9uYW1lID0gbHYtPm5hbWU7CisKKwkJaWYgKCEqbHYtPmx2aWQucykgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIk1pc3NpbmcgTFYgdXVpZCB3aXRoaW46ICVzLyVzIiwgaWQudmdfbmFtZSwgaWQubHZfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlkLnV1aWQgPSBsdi0+bHZpZC5zOworCisJCXIgPSBsdm1wb2xsZF9wb2xsX2luaXQoY21kLCAmaWQsIGxwZHAtPnBhcm1zKTsKKworCQlpZiAociAmJiAhbHBkcC0+cGFybXMtPmJhY2tncm91bmQpIHsKKwkJCWlmICghKGlkbCA9IHBvbGxfaWRfbGlzdF9jcmVhdGUoY21kLT5tZW0sICZpZCkpKQorCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKworCQkJZG1fbGlzdF9hZGQoJmxwZHAtPmlkbHMsICZpZGwtPmxpc3QpOworCQl9CisJfQorCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitzdGF0aWMgdm9pZCBfbHZtcG9sbGRfcG9sbF9mb3JfYWxsX3ZncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgICAgc3RydWN0IGRhZW1vbl9wYXJtcyAqcGFybXMsCisJCQkJICAgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWludCByOworCXN0cnVjdCBkbV9saXN0ICpmaXJzdDsKKwlzdHJ1Y3QgcG9sbF9pZF9saXN0ICppZGwsICp0bHY7CisJdW5zaWduZWQgZmluaXNoZWQ7CisJbHZtcG9sbGRfcGFybXNfdCBscGRwID0geworCQkucGFybXMgPSBwYXJtcworCX07CisKKwlkbV9saXN0X2luaXQoJmxwZHAuaWRscyk7CisKKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSAmbHBkcDsKKworCXByb2Nlc3NfZWFjaF92ZyhjbWQsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAsIGhhbmRsZSwgX2x2bXBvbGxkX2luaXRfcG9sbF92Zyk7CisKKwlmaXJzdCA9IGRtX2xpc3RfZmlyc3QoJmxwZHAuaWRscyk7CisKKwl3aGlsZSAoIWRtX2xpc3RfZW1wdHkoJmxwZHAuaWRscykpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoaWRsLCB0bHYsICZscGRwLmlkbHMpIHsKKwkJCXIgPSBsdm1wb2xsZF9yZXF1ZXN0X2luZm8oaWRsLT5pZCwgbHBkcC5wYXJtcywKKwkJCQkJCSAgJmZpbmlzaGVkKTsKKwkJCWlmICghciB8fCBmaW5pc2hlZCkKKwkJCQlkbV9saXN0X2RlbCgmaWRsLT5saXN0KTsKKwkJCWVsc2UgaWYgKCFwYXJtcy0+YWJvcnRpbmcpCisJCQkJcmVwb3J0X3Byb2dyZXNzKGNtZCwgaWRsLT5pZCwgbHBkcC5wYXJtcyk7CisJCX0KKworCQlpZiAobHBkcC5wYXJtcy0+aW50ZXJ2YWwpCisJCQlkZXZfY2xvc2VfYWxsKCk7CisKKwkJX25hbm9zbGVlcChscGRwLnBhcm1zLT5pbnRlcnZhbCwgMCk7CisJfQorCisJaWYgKGZpcnN0KQorCQlkbV9wb29sX2ZyZWUoY21kLT5tZW0sIGRtX2xpc3RfaXRlbShmaXJzdCwgc3RydWN0IHBvbGxfaWRfbGlzdCkpOworfQorCitzdGF0aWMgaW50IF9sdm1wb2xsX2RhZW1vbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHBvbGxfb3BlcmF0aW9uX2lkICppZCwKKwkJCSAgIHN0cnVjdCBkYWVtb25fcGFybXMgKnBhcm1zKQoreworCWludCByOworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwl1bnNpZ25lZCBmaW5pc2hlZCA9IDA7CisKKwlpZiAocGFybXMtPmFib3J0aW5nKQorCQlwYXJtcy0+aW50ZXJ2YWwgPSAwOworCisJaWYgKGlkKSB7CisJCXIgPSBsdm1wb2xsZF9wb2xsX2luaXQoY21kLCBpZCwgcGFybXMpOworCQlpZiAociAmJiAhcGFybXMtPmJhY2tncm91bmQpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCEociA9IGx2bXBvbGxkX3JlcXVlc3RfaW5mbyhpZCwgcGFybXMsICZmaW5pc2hlZCkpIHx8CisJCQkJICAgIGZpbmlzaGVkIHx8CisJCQkJICAgICghcGFybXMtPmFib3J0aW5nICYmICEociA9IHJlcG9ydF9wcm9ncmVzcyhjbWQsIGlkLCBwYXJtcykpKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlpZiAocGFybXMtPmludGVydmFsKQorCQkJCQlkZXZfY2xvc2VfYWxsKCk7CisKKwkJCQlfbmFub3NsZWVwKHBhcm1zLT5pbnRlcnZhbCwgMCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gciA/IEVDTURfUFJPQ0VTU0VEIDogRUNNRF9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJLyogcHJvY2VzcyBhbGwgaW4tZmxpZ2h0IG9wZXJhdGlvbnMgKi8KKwkJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCV9sdm1wb2xsZF9wb2xsX2Zvcl9hbGxfdmdzKGNtZCwgcGFybXMsIGhhbmRsZSk7CisJCQlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwkJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwkJfQorCX0KK30KKyNlbHNlCisjCWRlZmluZSBfbHZtcG9sbF9kYWVtb24oY21kLCBpZCwgcGFybXMpIChFQ01EX0ZBSUxFRCkKKyNlbmRpZiAvKiBMVk1QT0xMRF9TVVBQT1JUICovCisKKy8qCisgKiBPbmx5IGFsbG93ICpvbmUqIHJldHVybiBmcm9tIHBvbGxfZGFlbW9uKCkgKHRoZSBwYXJlbnQpLgorICogSWYgdGhlcmUgaXMgYSBjaGlsZCBpdCBtdXN0IGV4aXQgKGlnbm9yaW5nIHRoZSBtZW1vcnkgbGVhayBtZXNzYWdlcykuCisgKiAtICdiYWNrZ3JvdW5kJyBpcyBhZHZpc29yeSBzbyBhIGNoaWxkIHBvbGxkYWVtb24gbWF5IG5vdCBiZSB1c2VkIGV2ZW4KKyAqICAgaWYgaXQgd2FzIHJlcXVlc3RlZC4KKyAqLworc3RhdGljIGludCBfcG9sbF9kYWVtb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQsCisJCQlzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcykKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaW50IGRhZW1vbl9tb2RlID0gMDsKKwlpbnQgcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisKKwlpZiAocGFybXMtPmJhY2tncm91bmQpIHsKKwkJZGFlbW9uX21vZGUgPSBiZWNvbWVfZGFlbW9uKGNtZCwgMCk7CisJCWlmIChkYWVtb25fbW9kZSA9PSAwKQorCQkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOwkgICAgLyogUGFyZW50ICovCisJCWVsc2UgaWYgKGRhZW1vbl9tb2RlID09IDEpCisJCQlwYXJtcy0+cHJvZ3Jlc3NfZGlzcGxheSA9IDA7IC8qIENoaWxkICovCisJCS8qIEZJWE1FIFVzZSB3YWl0X2V2ZW50IChpLmUuIGludGVydmFsID0gMCkgYW5kICovCisJCS8qICAgICAgIGZvcmsgb25lIGRhZW1vbiBwZXIgY29weT8gKi8KKworCQlpZiAoKGRhZW1vbl9tb2RlID09IDEpICYmIGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtZXRhZF9DRkcsIE5VTEwpKSB7CisJCQlpZiAoIWx2bWV0YWRfY29ubmVjdChjbWQpKQorCQkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm0gcG9sbGluZyBwcm9jZXNzICVkIGNhbm5vdCBjb25uZWN0IHRvIGx2bWV0YWQuIiwgZ2V0cGlkKCkpOworCQl9CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIG9uZSBzcGVjaWZpYyB0YXNrIG9yIGFsbCBpbmNvbXBsZXRlIHRhc2tzPworCSAqLworCWlmIChpZCkgeworCQlpZiAoIXdhaXRfZm9yX3NpbmdsZV9sdihjbWQsIGlkLCBwYXJtcykpIHsKKwkJCXN0YWNrOworCQkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXBhcm1zLT5pbnRlcnZhbCkKKwkJCXBhcm1zLT5pbnRlcnZhbCA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgYWN0aXZhdGlvbl9wb2xsaW5nX2ludGVydmFsX0NGRywgTlVMTCk7CisJCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCQlyZXQgPSBFQ01EX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9IHBhcm1zOworCQkJX3BvbGxfZm9yX2FsbF92Z3MoY21kLCBoYW5kbGUpOworCQl9CisJfQorCisJaWYgKHBhcm1zLT5iYWNrZ3JvdW5kICYmIGRhZW1vbl9tb2RlID09IDEpIHsKKwkJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJCS8qCisJCSAqIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgZm9ya2VkOgorCQkgKiBiYWNrZ3JvdW5kIHBvbGxkYWVtb24gbXVzdCBub3QgcmV0dXJuIHRvIHRoZSBjYWxsZXIKKwkJICogYmVjYXVzZSBpdCB3aWxsIHJlZHVuZGFudGx5IGNvbnRpbnVlIHBlcmZvcm1pbmcgdGhlCisJCSAqIGNhbGxlcidzIHRhc2sgKHRoYXQgdGhlIHBhcmVudCBhbHJlYWR5IHBlcmZvcm1lZCkKKwkJICovCisJCS8qIEZJWE1FIEF0dGVtcHQgcHJvcGVyIGNsZWFudXAgKi8KKwkJX2V4aXQobHZtX3JldHVybl9jb2RlKHJldCkpOworCX0KKworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX2RhZW1vbl9wYXJtc19pbml0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgZGFlbW9uX3Bhcm1zICpwYXJtcywKKwkJCSAgICAgIHVuc2lnbmVkIGJhY2tncm91bmQsIHN0cnVjdCBwb2xsX2Z1bmN0aW9ucyAqcG9sbF9mbnMsCisJCQkgICAgICBjb25zdCBjaGFyICpwcm9ncmVzc190aXRsZSwgdWludDY0X3QgbHZfdHlwZSkKK3sKKwlzaWduX3QgaW50ZXJ2YWxfc2lnbjsKKworCXBhcm1zLT5hYm9ydGluZyA9IGFyZ19pc19zZXQoY21kLCBhYm9ydF9BUkcpOworCXBhcm1zLT5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKKwlpbnRlcnZhbF9zaWduID0gYXJnX3NpZ25fdmFsdWUoY21kLCBpbnRlcnZhbF9BUkcsIFNJR05fTk9ORSk7CisJaWYgKGludGVydmFsX3NpZ24gPT0gU0lHTl9NSU5VUykgeworCQlsb2dfZXJyb3IoIkFyZ3VtZW50IHRvIC0taW50ZXJ2YWwgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOworCQlyZXR1cm4gMDsKKwl9CisJcGFybXMtPmludGVydmFsID0gYXJnX3VpbnRfdmFsdWUoY21kLCBpbnRlcnZhbF9BUkcsCisJCQkJCSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGFjdGl2YXRpb25fcG9sbGluZ19pbnRlcnZhbF9DRkcsIE5VTEwpKTsKKwlwYXJtcy0+d2FpdF9iZWZvcmVfdGVzdGluZyA9IChpbnRlcnZhbF9zaWduID09IFNJR05fUExVUyk7CisJcGFybXMtPnByb2dyZXNzX3RpdGxlID0gcHJvZ3Jlc3NfdGl0bGU7CisJcGFybXMtPmx2X3R5cGUgPSBsdl90eXBlOworCXBhcm1zLT5wb2xsX2ZucyA9IHBvbGxfZm5zOworCisJaWYgKHBhcm1zLT5pbnRlcnZhbCAmJiAhcGFybXMtPmFib3J0aW5nKQorCQlsb2dfdmVyYm9zZSgiQ2hlY2tpbmcgcHJvZ3Jlc3MgJXMgd2FpdGluZyBldmVyeSAldSBzZWNvbmRzLiIsCisJCQkgICAgKHBhcm1zLT53YWl0X2JlZm9yZV90ZXN0aW5nID8gImFmdGVyIiA6ICJiZWZvcmUiKSwKKwkJCSAgICBwYXJtcy0+aW50ZXJ2YWwpOworCisJcGFybXMtPnByb2dyZXNzX2Rpc3BsYXkgPSBwYXJtcy0+aW50ZXJ2YWwgPyAxIDogMDsKKworCXJldHVybiAxOworfQorCitpbnQgcG9sbF9kYWVtb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVuc2lnbmVkIGJhY2tncm91bmQsCisJCXVpbnQ2NF90IGx2X3R5cGUsIHN0cnVjdCBwb2xsX2Z1bmN0aW9ucyAqcG9sbF9mbnMsCisJCWNvbnN0IGNoYXIgKnByb2dyZXNzX3RpdGxlLCBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkKQoreworCXN0cnVjdCBkYWVtb25fcGFybXMgcGFybXM7CisKKwlpZiAoIV9kYWVtb25fcGFybXNfaW5pdChjbWQsICZwYXJtcywgYmFja2dyb3VuZCwgcG9sbF9mbnMsIHByb2dyZXNzX3RpdGxlLCBsdl90eXBlKSkKKwkJcmV0dXJuX0VJTlZBTElEX0NNRF9MSU5FOworCisJaWYgKGx2bXBvbGxkX3VzZSgpKQorCQlyZXR1cm4gX2x2bXBvbGxfZGFlbW9uKGNtZCwgaWQsICZwYXJtcyk7CisJZWxzZSB7CisJCS8qIGNsYXNzaWNhbCBwb2xsaW5nIGFsbG93cyBvbmx5IFBNVk9WRSBvciAwIHZhbHVlcyAqLworCQlwYXJtcy5sdl90eXBlICY9IFBWTU9WRTsKKwkJcmV0dXJuIF9wb2xsX2RhZW1vbihjbWQsIGlkLCAmcGFybXMpOworCX0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3B2Y2hhbmdlLmMgYi90b29scy9wdmNoYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTkyNjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wdmNoYW5nZS5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0cnVjdCBwdmNoYW5nZV9wYXJhbXMgeworCXVuc2lnbmVkIGRvbmU7CisJdW5zaWduZWQgdG90YWw7Cit9OworCitzdGF0aWMgaW50IF9wdmNoYW5nZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcHZjaGFuZ2VfcGFyYW1zICpwYXJhbXMgPSAoc3RydWN0IHB2Y2hhbmdlX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJY29uc3QgY2hhciAqcHZfbmFtZSA9IHB2X2Rldl9uYW1lKHB2KTsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwl1bnNpZ25lZCBkb25lID0gMDsKKwlpbnQgdXNlZDsKKworCWludCBhbGxvY2F0YWJsZSA9IGFyZ19pbnRfdmFsdWUoY21kLCBhbGxvY2F0YWJsZV9BUkcsIDApOworCWludCBtZGFfaWdub3JlID0gYXJnX2ludF92YWx1ZShjbWQsIG1ldGFkYXRhaWdub3JlX0FSRywgMCk7CisJaW50IHRhZ2FyZ3MgPSBhcmdfaXNfc2V0KGNtZCwgYWRkdGFnX0FSRykgKyBhcmdfaXNfc2V0KGNtZCwgZGVsdGFnX0FSRyk7CisKKwlwYXJhbXMtPnRvdGFsKys7CisKKwlpZiAodmcgJiYgdmdfaXNfZXhwb3J0ZWQodmcpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwICVzIGlzIGV4cG9ydGVkIiwgdmctPm5hbWUpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIFRoZSBwcmltYXJ5IGxvY2F0aW9uIG9mIHRoaXMgY2hlY2sgaXMgaW4gdmdfd3JpdGUoKSwgYnV0IGl0IG5lZWRzCisJICogdG8gYmUgY29waWVkIGhlcmUgdG8gcHJldmVudCB0aGUgcHZfd3JpdGUoKSB3aGljaCBpcyBjYWxsZWQgYmVmb3JlCisJICogdGhlIHZnX3dyaXRlKCkuCisJICovCisJaWYgKHZnICYmIGx2bWNhY2hlX2ZvdW5kX2R1cGxpY2F0ZV9wdnMoKSAmJiB2Z19oYXNfZHVwbGljYXRlX3B2cyh2ZykpIHsKKwkgICAgCWlmICghZmluZF9jb25maWdfdHJlZV9ib29sKHZnLT5jbWQsIGRldmljZXNfYWxsb3dfY2hhbmdlc193aXRoX2R1cGxpY2F0ZV9wdnNfQ0ZHLCBOVUxMKSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgdXBkYXRlIHZvbHVtZSBncm91cCAlcyB3aXRoIGR1cGxpY2F0ZSBQViBkZXZpY2VzLiIsCisJCQkJICB2Zy0+bmFtZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoYXJnX2lzX3NldChjbWQsIHV1aWRfQVJHKSkgeworCQkJbG9nX2Vycm9yKCJSZXNvbHZlIGR1cGxpY2F0ZSBQViBVVUlEcyB3aXRoIHZnaW1wb3J0Y2xvbmUgKG9yIGZpbHRlcnMpLiIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwkvKiBJZiBpbiBhIFZHLCBtdXN0IGNoYW5nZSB1c2luZyB2b2x1bWUgZ3JvdXAuICovCisJaWYgKCFpc19vcnBoYW4ocHYpKSB7CisJCWlmICh0YWdhcmdzICYmICEodmctPmZpZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9UQUdTKSkgeworCQkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgY29udGFpbmluZyAlcyBkb2VzIG5vdCAiCisJCQkJICAic3VwcG9ydCB0YWdzIiwgcHZfbmFtZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoYXJnX2lzX3NldChjbWQsIHV1aWRfQVJHKSAmJiBsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgY29udGFpbmluZyAlcyBoYXMgYWN0aXZlICIKKwkJCQkgICJsb2dpY2FsIHZvbHVtZXMiLCBwdl9uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmICghYXJjaGl2ZSh2ZykpCisJCQlnb3RvX2JhZDsKKwl9IGVsc2UgeworCQlpZiAodGFnYXJncykgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBjaGFuZ2UgdGFnIG9uIFBoeXNpY2FsIFZvbHVtZSAlcyBub3QgIgorCQkJCSAgImluIHZvbHVtZSBncm91cCIsIHB2X25hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAoKHVzZWQgPSBpc191c2VkX3B2KHB2KSkgPCAwKQorCQkJZ290b19iYWQ7CisKKwkJaWYgKHVzZWQgJiYgKGFyZ19jb3VudChjbWQsIGZvcmNlX0FSRykgIT0gRE9OVF9QUk9NUFRfT1ZFUlJJREUpKSB7CisJCQlsb2dfZXJyb3IoIlBWICVzIGlzIHVzZWQgYnkgYSBWRyBidXQgaXRzIG1ldGFkYXRhIGlzIG1pc3NpbmcuIiwgcHZfbmFtZSk7CisJCQlsb2dfZXJyb3IoIkNhbid0IGNoYW5nZSBQViAnJXMnIHdpdGhvdXQgLWZmLiIsIHB2X25hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFsbG9jYXRhYmxlX0FSRykpIHsKKwkJaWYgKGlzX29ycGhhbihwdikgJiYKKwkJICAgICEocHYtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfT1JQSEFOX0FMTE9DQVRBQkxFKSkgeworCQkJbG9nX2Vycm9yKCJBbGxvY2F0YWJpbGl0eSBub3Qgc3VwcG9ydGVkIGJ5IG9ycGhhbiAiCisJCQkJICAiJXMgZm9ybWF0IFBWICVzIiwgcHYtPmZtdC0+bmFtZSwgcHZfbmFtZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCS8qIGNoYW5nZSBhbGxvY2F0YWJpbGl0eSBmb3IgYSBQViAqLworCQlpZiAoYWxsb2NhdGFibGUgJiYgKHB2X3N0YXR1cyhwdikgJiBBTExPQ0FUQUJMRV9QVikpIHsKKwkJCWxvZ193YXJuKCJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGlzIGFscmVhZHkgIgorCQkJCSAiYWxsb2NhdGFibGUuIiwgcHZfbmFtZSk7CisJCX0gZWxzZSBpZiAoIWFsbG9jYXRhYmxlICYmICEocHZfc3RhdHVzKHB2KSAmIEFMTE9DQVRBQkxFX1BWKSkgeworCQkJbG9nX3dhcm4oIlBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgaXMgYWxyZWFkeSAiCisJCQkJICJ1bmFsbG9jYXRhYmxlLiIsIHB2X25hbWUpOworCQl9IGVsc2UgaWYgKGFsbG9jYXRhYmxlKSB7CisJCQlsb2dfdmVyYm9zZSgiU2V0dGluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiICIKKwkJCQkgICAgImFsbG9jYXRhYmxlIiwgcHZfbmFtZSk7CisJCQlwdi0+c3RhdHVzIHw9IEFMTE9DQVRBQkxFX1BWOworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQlsb2dfdmVyYm9zZSgiU2V0dGluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIE5PVCAiCisJCQkJICAgICJhbGxvY2F0YWJsZSIsIHB2X25hbWUpOworCQkJcHYtPnN0YXR1cyAmPSB+QUxMT0NBVEFCTEVfUFY7CisJCQlkb25lID0gMTsKKwkJfQorCX0KKworCS8qCisJICogTmVlZGVkIHRvIGNoYW5nZSBhIHByb3BlcnR5IG9uIGFuIG9ycGhhbiBQVi4KKwkgKiBpLmUuIHRoZSBnbG9iYWwgbG9jayBpcyBvbmx5IG5lZWRlZCBmb3Igb3JwaGFucy4KKwkgKiBDb252ZXJ0IHNoIHRvIGV4LgorCSAqLworCWlmIChpc19vcnBoYW4ocHYpKSB7CisJCWlmICghbG9ja2RfZ2woY21kLCAiZXgiLCAwKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJY21kLT5sb2NrZF9nbF9kaXNhYmxlID0gMTsKKwl9CisKKwlpZiAodGFnYXJncykgeworCQkvKiB0YWcgb3IgZGVsdGFnICovCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgYWRkdGFnX0FSRykgJiYgIWNoYW5nZV90YWcoY21kLCBOVUxMLCBOVUxMLCBwdiwgYWRkdGFnX0FSRykpCisJCQlnb3RvX2JhZDsKKworCQlpZiAoYXJnX2lzX3NldChjbWQsIGRlbHRhZ19BUkcpICYmICFjaGFuZ2VfdGFnKGNtZCwgTlVMTCwgTlVMTCwgcHYsIGRlbHRhZ19BUkcpKQorCQkJZ290b19iYWQ7CisJCisJCWRvbmUgPSAxOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFpZ25vcmVfQVJHKSkgeworCQlpZiAoKHZnX21kYV9jb3BpZXModmcpICE9IFZHTUVUQURBVEFDT1BJRVNfVU5NQU5BR0VEKSAmJgorCQkgICAgKGFyZ19jb3VudChjbWQsIGZvcmNlX0FSRykgPT0gUFJPTVBUKSAmJgorCQkgICAgeWVzX25vX3Byb21wdCgiT3ZlcnJpZGUgcHJlZmVycmVkIG51bWJlciBvZiBjb3BpZXMgIgorCQkJCSAgIm9mIFZHICVzIG1ldGFkYXRhPyBbeS9uXTogIiwKKwkJCQkgIHB2X3ZnX25hbWUocHYpKSA9PSAnbicpCisJCQlnb3RvX2JhZDsKKwkJaWYgKCFwdl9jaGFuZ2VfbWV0YWRhdGFpZ25vcmUocHYsIG1kYV9pZ25vcmUpKQorCQkJZ290b19iYWQ7CisKKwkJZG9uZSA9IDE7CisJfSAKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgdXVpZF9BUkcpKSB7CisJCS8qIC0tdXVpZDogQ2hhbmdlIFBWIElEIHJhbmRvbWx5ICovCisJCW1lbWNweSgmcHYtPm9sZF9pZCwgJnB2LT5pZCwgc2l6ZW9mKHB2LT5pZCkpOworCQlpZiAoIWlkX2NyZWF0ZSgmcHYtPmlkKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgbmV3IHJhbmRvbSBVVUlEIGZvciAlcy4iLAorCQkJCSAgcHZfbmFtZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcHYtPmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQkJZ290b19iYWQ7CisJCWxvZ192ZXJib3NlKCJDaGFuZ2luZyB1dWlkIG9mICVzIHRvICVzLiIsIHB2X25hbWUsIHV1aWQpOworCQlpZiAoIWlzX29ycGhhbihwdikgJiYgKCFwdl93cml0ZShjbWQsIHB2LCAxKSkpIHsKKwkJCWxvZ19lcnJvcigicHZfd3JpdGUgd2l0aCBuZXcgdXVpZCBmYWlsZWQgIgorCQkJCSAgImZvciAlcy4iLCBwdl9uYW1lKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJZG9uZSA9IDE7CisJfQorCisJaWYgKCFkb25lKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJQaHlzaWNhbCB2b2x1bWUgJXMgbm90IGNoYW5nZWQiLCBwdl9uYW1lKTsKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCX0KKworCWxvZ192ZXJib3NlKCJVcGRhdGluZyBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIiwgcHZfbmFtZSk7CisJaWYgKCFpc19vcnBoYW4ocHYpKSB7CisJCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzdG9yZSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIGluICIKKwkJCQkgICJ2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgcHZfbmFtZSwgdmctPm5hbWUpOworCQkJZ290byBiYWQ7CisJCX0KKwkJYmFja3VwKHZnKTsKKwl9IGVsc2UgaWYgKCEocHZfd3JpdGUoY21kLCBwdiwgMCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHN0b3JlIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIiLAorCQkJICBwdl9uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgY2hhbmdlZCIsIHB2X25hbWUpOworCisJcGFyYW1zLT5kb25lKys7CisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCitiYWQ6CisJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgJXMgbm90IGNoYW5nZWQiLCBwdl9uYW1lKTsKKworCXJldHVybiBFQ01EX0ZBSUxFRDsKK30KKworaW50IHB2Y2hhbmdlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHB2Y2hhbmdlX3BhcmFtcyBwYXJhbXMgPSB7IDAgfTsKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmICghKGFyZ19pc19zZXQoY21kLCBhbGxvY2F0YWJsZV9BUkcpICsgYXJnX2lzX3NldChjbWQsIGFkZHRhZ19BUkcpICsKKwkgICAgYXJnX2lzX3NldChjbWQsIGRlbHRhZ19BUkcpICsgYXJnX2lzX3NldChjbWQsIHV1aWRfQVJHKSArCisJICAgIGFyZ19pc19zZXQoY21kLCBtZXRhZGF0YWlnbm9yZV9BUkcpKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBnaXZlIG9uZSBvciBtb3JlIG9mIC14LCAtdXVpZCwgIgorCQkJICAiLS1hZGR0YWcsIC0tZGVsdGFnIG9yIC0tbWV0YWRhdGFpZ25vcmUiKTsKKwkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9ICZwYXJhbXM7CisKKwlpZiAoIShhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykpICYmICFhcmdjICYmICFoYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0KSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGdpdmUgYSBwaHlzaWNhbCB2b2x1bWUgcGF0aCBvciB1c2UgLS1zZWxlY3QgZm9yIHNlbGVjdGlvbi4iKTsKKwkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykgJiYgYXJnYykgeworCQlsb2dfZXJyb3IoIk9wdGlvbiAtLWFsbCBhbmQgUGh5c2ljYWxWb2x1bWVQYXRoIGFyZSBleGNsdXNpdmUuIik7CisJCXJldCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWFyZ2MpIHsKKwkJLyoKKwkJICogVGFrZSB0aGUgZ2xvYmFsIGxvY2sgaGVyZSBzbyB0aGUgbHZtY2FjaGUgcmVtYWlucworCQkgKiBjb25zaXN0ZW50IGFjcm9zcyBvcnBoYW4vbm9uLW9ycGhhbiB2ZyBsb2Nrcy4gIElmIHdlIGRvbid0CisJCSAqIHRha2UgdGhlIGxvY2sgaGVyZSwgcHZzIHdpdGggMCBtZGFzIGluIGEgbm9uLW9ycGhhbiBWRyB3aWxsCisJCSAqIGJlIHByb2Nlc3NlZCB0d2ljZS4KKwkJICovCisJCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIG9idGFpbiBnbG9iYWwgbG9jay4iKTsKKwkJCXJldCA9IEVDTURfRkFJTEVEOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlzZXRfcHZfbm90aWZ5KGNtZCk7CisKKwlyZXQgPSBwcm9jZXNzX2VhY2hfcHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCAwLCBSRUFEX0ZPUl9VUERBVEUgfCBSRUFEX0FMTE9XX0VYUE9SVEVELCBoYW5kbGUsIF9wdmNoYW5nZV9zaW5nbGUpOworCisJaWYgKCFhcmdjKQorCQl1bmxvY2tfdmcoY21kLCBOVUxMLCBWR19HTE9CQUwpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVkIHBoeXNpY2FsIHZvbHVtZSVzIGNoYW5nZWQgLyAlZCBwaHlzaWNhbCB2b2x1bWUlcyBub3QgY2hhbmdlZCIsCisJCQkJcGFyYW1zLmRvbmUsIHBhcmFtcy5kb25lID09IDEgPyAiIiA6ICJzIiwKKwkJCQlwYXJhbXMudG90YWwgLSBwYXJhbXMuZG9uZSwgKHBhcmFtcy50b3RhbCAtIHBhcmFtcy5kb25lKSA9PSAxID8gIiIgOiAicyIpOworCitvdXQ6CisJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3B2Y2suYyBiL3Rvb2xzL3B2Y2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVkYjRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcHZjay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK2ludCBwdmNrKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKworCS8qIEZJWE1FOiB2YWxpZGF0ZSBjbWRsaW5lIG9wdGlvbnMgKi8KKwkvKiBGSVhNRTogd2hhdCBkb2VzIHRoZSBjbWRsaW5lIGxvb2sgbGlrZT8gKi8KKworCS8qCisJICogVXNlIHdoYXQncyBvbiB0aGUgY21kbGluZSBkaXJlY3RseSwgYW5kIGF2b2lkIGNhbGxpbmcgaW50bworCSAqIHNvbWUgb2YgdGhlIG90aGVyIGluZnJhc3RydWN0dXJlIGZ1bmN0aW9ucywgc28gYXMgdG8gYXZvaWQKKwkgKiBoaXR0aW5nIHNvbWUgb2YgdGhlIGx2bWNhY2hlIGJlaGF2aW9yLCBzY2FubmluZyBvdGhlciBkZXZpY2VzLAorCSAqIGV0Yy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCS8qIEZJWE1FOiB3YXJuaW5nIGFuZC9vciBjaGVjayBpZiBpbiB1c2U/ICovCisJCWxvZ192ZXJib3NlKCJTY2FubmluZyAlcyIsIGFyZ3ZbaV0pOworCisJCWRtX3VuZXNjYXBlX2NvbG9uc19hbmRfYXRfc2lnbnMoYXJndltpXSwgTlVMTCwgTlVMTCk7CisJCWlmICghcHZfYW5hbHl6ZShjbWQsIGFyZ3ZbaV0sCisJCQkJYXJnX3VpbnQ2NF92YWx1ZShjbWQsIGxhYmVsc2VjdG9yX0FSRywgVUlOVDY0X0MoMCkpKSkgeworCQkJc3RhY2s7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0X21heDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3B2Y3JlYXRlLmMgYi90b29scy9wdmNyZWF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWVlZDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wdmNyZWF0ZS5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKy8qCisgKiBJbnRpYWwgc2FuaXR5IGNoZWNraW5nIG9mIHJlY292ZXJ5LXJlbGF0ZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAqIFRoZXNlIGFyZ3MgYXJlOiAtLXJlc3RvcmVmaWxlLCAtLXV1aWQsIGFuZCAtLXBoeXNpY2Fsdm9sdW1lc2l6ZQorICoKKyAqIE91dHB1dCBhcmd1bWVudHM6CisgKiBwcDogc3RydWN0dXJlIGFsbG9jYXRlZCBieSBjYWxsZXIsIGZpZWxkcyB3cml0dGVuIC8gdmFsaWRhdGVkIGhlcmUKKyAqLworc3RhdGljIGludCBwdmNyZWF0ZV9yZXN0b3JlX3BhcmFtc19mcm9tX2FyZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLAorCQkJCQkgICAgIHN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnBwKQoreworCXBwLT5yZXN0b3JlZmlsZSA9IGFyZ19zdHJfdmFsdWUoY21kLCByZXN0b3JlZmlsZV9BUkcsIE5VTEwpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZXN0b3JlZmlsZV9BUkcpICYmICFhcmdfaXNfc2V0KGNtZCwgdXVpZHN0cl9BUkcpKSB7CisJCWxvZ19lcnJvcigiLS11dWlkIGlzIHJlcXVpcmVkIHdpdGggLS1yZXN0b3JlZmlsZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyZ19pc19zZXQoY21kLCByZXN0b3JlZmlsZV9BUkcpICYmIGFyZ19pc19zZXQoY21kLCB1dWlkc3RyX0FSRykpIHsKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgbm9yZXN0b3JlZmlsZV9BUkcpICYmCisJCSAgICBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBkZXZpY2VzX3JlcXVpcmVfcmVzdG9yZWZpbGVfd2l0aF91dWlkX0NGRywgTlVMTCkpIHsKKwkJCWxvZ19lcnJvcigiLS1yZXN0b3JlZmlsZSBpcyByZXF1aXJlZCB3aXRoIC0tdXVpZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHV1aWRzdHJfQVJHKSAmJiBhcmdjICE9IDEpIHsKKwkJbG9nX2Vycm9yKCJDYW4gb25seSBzZXQgdXVpZCBvbiBvbmUgdm9sdW1lIGF0IG9uY2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCB1dWlkc3RyX0FSRykpIHsKKwkJcHAtPnV1aWRfc3RyID0gYXJnX3N0cl92YWx1ZShjbWQsIHV1aWRzdHJfQVJHLCAiIik7CisJCWlmICghaWRfcmVhZF9mb3JtYXQoJnBwLT5wdmEuaWQsIHBwLT51dWlkX3N0cikpCisJCQlyZXR1cm4gMDsKKwkJcHAtPnB2YS5pZHAgPSAmcHAtPnB2YS5pZDsKKwl9CisKKwlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBwaHlzaWNhbHZvbHVtZXNpemVfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgc2l6ZSBtYXkgbm90IGJlIG5lZ2F0aXZlIik7CisJCXJldHVybiAwOworCX0KKwlwcC0+cHZhLnNpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgcGh5c2ljYWx2b2x1bWVzaXplX0FSRywgVUlOVDY0X0MoMCkpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCByZXN0b3JlZmlsZV9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCB1dWlkc3RyX0FSRykpCisJCXBwLT56ZXJvID0gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwdmNyZWF0ZV9yZXN0b3JlX3BhcmFtc19mcm9tX2JhY2t1cChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICAgICAgIHN0cnVjdCBwdmNyZWF0ZV9wYXJhbXMgKnBwKQoreworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCXN0cnVjdCBwdl9saXN0ICpleGlzdGluZ19wdmw7CisKKwkvKgorCSAqIFdoZW4gcmVzdG9yaW5nIGEgUFYsIHBhcmFtcyBuZWVkIHRvIGJlIHJlYWQgZnJvbSBhIGJhY2t1cCBmaWxlLgorCSAqLworCWlmICghcHAtPnJlc3RvcmVmaWxlKQorCQlyZXR1cm4gMTsKKworCWlmICghKHZnID0gYmFja3VwX3JlYWRfdmcoY21kLCBOVUxMLCBwcC0+cmVzdG9yZWZpbGUpKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZWFkIHZvbHVtZSBncm91cCBmcm9tICVzIiwgcHAtPnJlc3RvcmVmaWxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoZXhpc3RpbmdfcHZsID0gZmluZF9wdl9pbl92Z19ieV91dWlkKHZnLCAmcHAtPnB2YS5pZCkpKSB7CisJCXJlbGVhc2VfdmcodmcpOworCQlsb2dfZXJyb3IoIkNhbid0IGZpbmQgdXVpZCAlcyBpbiBiYWNrdXAgZmlsZSAlcyIsCisJCQkgIHBwLT51dWlkX3N0ciwgcHAtPnJlc3RvcmVmaWxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHAtPnB2YS5iYV9zdGFydCA9IHB2X2JhX3N0YXJ0KGV4aXN0aW5nX3B2bC0+cHYpOworCXBwLT5wdmEuYmFfc2l6ZSA9IHB2X2JhX3NpemUoZXhpc3RpbmdfcHZsLT5wdik7CisJcHAtPnB2YS5wZV9zdGFydCA9IHB2X3BlX3N0YXJ0KGV4aXN0aW5nX3B2bC0+cHYpOworCXBwLT5wdmEuZXh0ZW50X3NpemUgPSBwdl9wZV9zaXplKGV4aXN0aW5nX3B2bC0+cHYpOworCXBwLT5wdmEuZXh0ZW50X2NvdW50ID0gcHZfcGVfY291bnQoZXhpc3RpbmdfcHZsLT5wdik7CisKKwlyZWxlYXNlX3ZnKHZnKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHB2Y3JlYXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGU7CisJc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyBwcDsKKwlpbnQgcmV0OworCisJaWYgKCFhcmdjKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGVudGVyIGEgcGh5c2ljYWwgdm9sdW1lIHBhdGguIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogRGV2aWNlIGluZm8gbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGZvciByZWFkaW5nIHRoZSBWRyBiYWNrdXAgZmlsZSBpbgorCSAqIHB2Y3JlYXRlX3Jlc3RvcmVfcGFyYW1zX2Zyb21fYmFja3VwLgorCSAqLworCWx2bWNhY2hlX3NlZWRfaW5mb3NfZnJvbV9sdm1ldGFkKGNtZCk7CisKKwkvKgorCSAqIEZpdmUga2luZHMgb2YgcHZjcmVhdGUgcGFyYW0gdmFsdWVzOgorCSAqIDEuIGRlZmF1bHRzCisJICogMi4gcmVjb3ZlcnktcmVsYXRlZCBjb21tYW5kIGxpbmUgYXJncworCSAqIDMuIHJlY292ZXJ5LXJlbGF0ZWQgYXJncyBmcm9tIGJhY2t1cCBmaWxlCisJICogNC4gbm9ybWFsIGNvbW1hbmQgbGluZSBhcmdzCisJICogICAgKHRoaXMgYWxzbyBjaGVja3Mgc29tZSBzZXR0aW5ncyBmcm9tIDIgJiAzKQorCSAqIDUuIGFyZ2MvYXJndiBmcmVlIGFyZ3Mgc3BlY2lmeWluZyBkZXZpY2VzCisJICovCisKKwlwdmNyZWF0ZV9wYXJhbXNfc2V0X2RlZmF1bHRzKCZwcCk7CisKKwlpZiAoIXB2Y3JlYXRlX3Jlc3RvcmVfcGFyYW1zX2Zyb21fYXJncyhjbWQsIGFyZ2MsICZwcCkpCisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKworCWlmICghcHZjcmVhdGVfcmVzdG9yZV9wYXJhbXNfZnJvbV9iYWNrdXAoY21kLCAmcHApKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlpZiAoIXB2Y3JlYXRlX3BhcmFtc19mcm9tX2FyZ3MoY21kLCAmcHApKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlwcC5wdl9jb3VudCA9IGFyZ2M7CisJcHAucHZfbmFtZXMgPSBhcmd2OworCisJLyoKKwkgKiBOZWVkZWQgdG8gY2hhbmdlIHRoZSBzZXQgb2Ygb3JwaGFuIFBWcy4KKwkgKiAoZGlzYWJsZSBhZnRlcndhcmQgdG8gcHJldmVudCBwcm9jZXNzX2VhY2hfcHYgZnJvbSBkb2luZworCSAqIGEgc2hhcmVkIGdsb2JhbCBsb2NrIHNpbmNlIGl0J3MgYWxyZWFkeSBhY3F1aXJlZCBpdCBleC4pCisJICovCisJaWYgKCFsb2NrZF9nbChjbWQsICJleCIsIDApKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJY21kLT5sb2NrZF9nbF9kaXNhYmxlID0gMTsKKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWlmICghcHZjcmVhdGVfZWFjaF9kZXZpY2UoY21kLCBoYW5kbGUsICZwcCkpCisJCXJldCA9IEVDTURfRkFJTEVEOworCWVsc2UgeworCQkvKiBwdmNyZWF0ZV9lYWNoX2RldmljZSByZXR1cm5zIHdpdGggb3JwaGFucyBsb2NrZWQgKi8KKwkJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgVkdfT1JQSEFOUyk7CisJCXJldCA9IEVDTURfUFJPQ0VTU0VEOworCX0KKworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wdmRpc3BsYXkuYyBiL3Rvb2xzL3B2ZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDMzZjMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wdmRpc3BsYXkuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IF9wdmRpc3BsYXlfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWNvbnN0IGNoYXIgKnB2X25hbWUgPSBwdl9kZXZfbmFtZShwdik7CisJaW50IHJldCA9IEVDTURfUFJPQ0VTU0VEOworCXVpbnQ2NF90IHNpemU7CisKKwlpZiAoaXNfb3JwaGFuKHB2KSkKKwkJc2l6ZSA9IHB2X3NpemUocHYpOworCWVsc2UKKwkJc2l6ZSA9ICh1aW50NjRfdCkocHZfcGVfY291bnQocHYpIC0gcHZfcGVfYWxsb2NfY291bnQocHYpKSAqCisJCQlwdl9wZV9zaXplKHB2KTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc2hvcnRfQVJHKSkgeworCQlsb2dfcHJpbnQoIkRldmljZSBcIiVzXCIgaGFzIGEgY2FwYWNpdHkgb2YgJXMiLCBwdl9uYW1lLAorCQkJICBkaXNwbGF5X3NpemUoY21kLCBzaXplKSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwdl9zdGF0dXMocHYpICYgRVhQT1JURURfVkcpCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJQaHlzaWNhbCB2b2x1bWUgXCIlc1wiIG9mIHZvbHVtZSBncm91cCBcIiVzXCIgIgorCQkJCQkiaXMgZXhwb3J0ZWQiLCBwdl9uYW1lLCBwdl92Z19uYW1lKHB2KSk7CisKKwlpZiAoaXNfb3JwaGFuKHB2KSkKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlwiJXNcIiBpcyBhIG5ldyBwaHlzaWNhbCB2b2x1bWUgb2YgXCIlc1wiIiwKKwkJCQkJcHZfbmFtZSwgZGlzcGxheV9zaXplKGNtZCwgc2l6ZSkpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb2xvbl9BUkcpKSB7CisJCXB2ZGlzcGxheV9jb2xvbnMocHYpOworCQlnb3RvIG91dDsKKwl9CisKKwlwdmRpc3BsYXlfZnVsbChjbWQsIHB2LCBOVUxMKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWFwc19BUkcpKQorCQlwdmRpc3BsYXlfc2VnbWVudHMocHYpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IHB2ZGlzcGxheShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBsb2NrX2dsb2JhbCA9IDA7CisJaW50IHJldDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29sdW1uc19BUkcpKSB7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgY29sb25fQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgbWFwc19BUkcpIHx8CisJCSAgICBhcmdfaXNfc2V0KGNtZCwgc2hvcnRfQVJHKSkgeworCQkJbG9nX2Vycm9yKCJJbmNvbXBhdGlibGUgb3B0aW9ucyBzZWxlY3RlZCIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJCXJldHVybiBwdnMoY21kLCBhcmdjLCBhcmd2KTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFsaWduZWRfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIGJpbmFyeV9BUkcpIHx8CisJICAgIGFyZ19pc19zZXQoY21kLCBub2hlYWRpbmdzX0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIG9wdGlvbnNfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgc2VwYXJhdG9yX0FSRykgfHwKKwkgICAgYXJnX2lzX3NldChjbWQsIHNvcnRfQVJHKSB8fAorCSAgICBhcmdfaXNfc2V0KGNtZCwgdW5idWZmZXJlZF9BUkcpKSB7CisJCWxvZ19lcnJvcigiSW5jb21wYXRpYmxlIG9wdGlvbnMgc2VsZWN0ZWQiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY29sb25fQVJHKSAmJiBhcmdfaXNfc2V0KGNtZCwgbWFwc19BUkcpKSB7CisJCWxvZ19lcnJvcigiT3B0aW9uIC1jIG5vdCBhbGxvd2VkIHdpdGggb3B0aW9uIC1tIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGNvbG9uX0FSRykgJiYgYXJnX2lzX3NldChjbWQsIHNob3J0X0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPcHRpb24gLWMgaXMgbm90IGFsbG93ZWQgd2l0aCBvcHRpb24gLXMiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCS8qCisJICogSWYgdGhlIGxvY2tfdHlwZSBpcyBMQ0tfVkdfUkVBRCAodXNlZCBvbmx5IGluIHJlcG9ydGluZyBjb21tYW5kcyksCisJICogd2UgbG9jayBWR19HTE9CQUwgdG8gZW5hYmxlIHVzZSBvZiBtZXRhZGF0YSBjYWNoZS4KKwkgKiBUaGlzIGNhbiBwYXVzZSBhbG9uZ2lkZSBwdnNjYW4gb3IgdmdzY2FuIHByb2Nlc3MgZm9yIGEgd2hpbGUuCisJICovCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkgeworCQlsb2NrX2dsb2JhbCA9IDE7CisJCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19SRUFELCBOVUxMKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gb2J0YWluIGdsb2JhbCBsb2NrLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisJfQorCisJcmV0ID0gcHJvY2Vzc19lYWNoX3B2KGNtZCwgYXJnYywgYXJndiwgTlVMTCwKKwkJCSAgICAgIGFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSwgMCwKKwkJCSAgICAgIE5VTEwsIF9wdmRpc3BsYXlfc2luZ2xlKTsKKworCWlmIChsb2NrX2dsb2JhbCkKKwkJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgVkdfR0xPQkFMKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wdm1vdmUuYyBiL3Rvb2xzL3B2bW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzdjMTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wdm1vdmUuYwpAQCAtMCwwICsxLDkyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCisjaW5jbHVkZSAicG9sbGRhZW1vbi5oIgorI2luY2x1ZGUgImRpc3BsYXkuaCIKKyNpbmNsdWRlICJwdm1vdmVfcG9sbC5oIgorI2luY2x1ZGUgImx2bXBvbGxkLWNsaWVudC5oIgorCisjZGVmaW5lIFBWTU9WRV9GSVJTVF9USU1FICAgMHgwMDAwMDAwMSAgICAgIC8qIENhbGxlZCBmb3IgZmlyc3QgdGltZSAqLworCitzdHJ1Y3QgcHZtb3ZlX3BhcmFtcyB7CisJY2hhciAqcHZfbmFtZV9hcmc7IC8qIG9yaWdpbmFsIHVubW9kaWZpZWQgYXJnICovCisJY2hhciAqbHZfbmFtZV9hcmc7IC8qIG9yaWdpbmFsIHVubW9kaWZpZWQgYXJnICovCisJYWxsb2NfcG9saWN5X3QgYWxsb2M7CisJaW50IHB2X2NvdW50OworCWNoYXIgKipwdl9uYW1lczsKKworCXVuaW9uIGx2aWQgKmx2aWQ7CisJY2hhciAqaWRfdmdfbmFtZTsKKwljaGFyICppZF9sdl9uYW1lOworCXVuc2lnbmVkIGluX3Byb2dyZXNzOworCWludCBzZXR1cF9yZXN1bHQ7CisJaW50IGZvdW5kX3B2OworfTsKKworc3RhdGljIGludCBfcHZtb3ZlX3RhcmdldF9wcmVzZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgY2x1c3RlcmVkKQoreworCWNvbnN0IHN0cnVjdCBzZWdtZW50X3R5cGUgKnNlZ3R5cGU7CisJdW5zaWduZWQgYXR0ciA9IDA7CisJaW50IGZvdW5kID0gMTsKKwlzdGF0aWMgaW50IF9jbHVzdGVyZWRfZm91bmQgPSAtMTsKKworCWlmIChjbHVzdGVyZWQgJiYgX2NsdXN0ZXJlZF9mb3VuZCA+PSAwKQorCQlyZXR1cm4gX2NsdXN0ZXJlZF9mb3VuZDsKKworCWlmICghKHNlZ3R5cGUgPSBnZXRfc2VndHlwZV9mcm9tX3N0cmluZyhjbWQsIFNFR19UWVBFX05BTUVfTUlSUk9SKSkpCisJCXJldHVybl8wOworCisJaWYgKGFjdGl2YXRpb24oKSAmJiBzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50ICYmCisJICAgICFzZWd0eXBlLT5vcHMtPnRhcmdldF9wcmVzZW50KGNtZCwgTlVMTCwgY2x1c3RlcmVkID8gJmF0dHIgOiBOVUxMKSkKKwkJZm91bmQgPSAwOworCisJaWYgKGFjdGl2YXRpb24oKSAmJiBjbHVzdGVyZWQpIHsKKwkJaWYgKGZvdW5kICYmIChhdHRyICYgTUlSUk9SX0xPR19DTFVTVEVSRUQpKQorCQkJX2NsdXN0ZXJlZF9mb3VuZCA9IGZvdW5kID0gMTsKKwkJZWxzZQorCQkJX2NsdXN0ZXJlZF9mb3VuZCA9IGZvdW5kID0gMDsKKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBfcHZtb3ZlX2lzX2V4Y2x1c2l2ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWlmICh2Z19pc19jbHVzdGVyZWQodmcpKQorCQlpZiAoIV9wdm1vdmVfdGFyZ2V0X3ByZXNlbnQoY21kLCAxKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFsbG93IC9kZXYvdmduYW1lL2x2bmFtZSwgdmduYW1lL2x2bmFtZSBvciBsdm5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpfZXh0cmFjdF9sdm5hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnbmFtZSwKKwkJCQkgICBjb25zdCBjaGFyICphcmcpCit7CisJY29uc3QgY2hhciAqbHZuYW1lOworCisJLyogSXMgYW4gbHZuYW1lIHN1cHBsaWVkIGRpcmVjdGx5PyAqLworCWlmICghc3RyY2hyKGFyZywgJy8nKSkKKwkJcmV0dXJuIGFyZzsKKworCWx2bmFtZSA9IHNraXBfZGV2X2RpcihjbWQsIGFyZywgTlVMTCk7CisJd2hpbGUgKCpsdm5hbWUgPT0gJy8nKQorCQlsdm5hbWUrKzsKKwlpZiAoIXN0cmNocihsdm5hbWUsICcvJykpIHsKKwkJbG9nX2Vycm9yKCItLW5hbWUgdGFrZXMgYSBsb2dpY2FsIHZvbHVtZSBuYW1lIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RybmNtcCh2Z25hbWUsIGx2bmFtZSwgc3RybGVuKHZnbmFtZSkpIHx8CisJICAgIChsdm5hbWUgKz0gc3RybGVuKHZnbmFtZSksICpsdm5hbWUgIT0gJy8nKSkgeworCQlsb2dfZXJyb3IoIk5hbWVkIExWIGFuZCBvbGQgUFYgbXVzdCBiZSBpbiB0aGUgc2FtZSBWRyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJd2hpbGUgKCpsdm5hbWUgPT0gJy8nKQorCQlsdm5hbWUrKzsKKwlpZiAoISpsdm5hbWUpIHsKKwkJbG9nX2Vycm9yKCJJbmNvbXBsZXRlIExWIG5hbWUgc3VwcGxpZWQgd2l0aCAtLW5hbWUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBsdm5hbWU7Cit9CisKKy8qIENyZWF0ZSBsaXN0IG9mIFBWcyBmb3IgYWxsb2NhdGlvbiBvZiByZXBsYWNlbWVudCBleHRlbnRzICovCitzdGF0aWMgc3RydWN0IGRtX2xpc3QgKl9nZXRfYWxsb2NhdGFibGVfcHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywKKwkJCQkJIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCQkgYWxsb2NfcG9saWN5X3QgYWxsb2MpCit7CisJc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRhYmxlX3B2cywgKnB2aHQsICpwdmg7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWlmIChhcmdjKQorCQlhbGxvY2F0YWJsZV9wdnMgPSBjcmVhdGVfcHZfbGlzdChjbWQtPm1lbSwgdmcsIGFyZ2MsIGFyZ3YsIDEpOworCWVsc2UKKwkJYWxsb2NhdGFibGVfcHZzID0gY2xvbmVfcHZfbGlzdChjbWQtPm1lbSwgJnZnLT5wdnMpOworCisJaWYgKCFhbGxvY2F0YWJsZV9wdnMpCisJCXJldHVybl9OVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUocHZoLCBwdmh0LCBhbGxvY2F0YWJsZV9wdnMpIHsKKwkJcHZsID0gZG1fbGlzdF9pdGVtKHB2aCwgc3RydWN0IHB2X2xpc3QpOworCisJCS8qIERvbid0IGFsbG9jYXRlIG9udG8gdGhlIFBWIHdlJ3JlIGNsZWFyaW5nISAqLworCQlpZiAoKGFsbG9jICE9IEFMTE9DX0FOWVdIRVJFKSAmJiAocHZsLT5wdi0+ZGV2ID09IHB2X2RldihwdikpKSB7CisJCQlkbV9saXN0X2RlbCgmcHZsLT5saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmVtb3ZlIFBWIGlmIGZ1bGwgKi8KKwkJaWYgKHB2bC0+cHYtPnBlX2NvdW50ID09IHB2bC0+cHYtPnBlX2FsbG9jX2NvdW50KQorCQkJZG1fbGlzdF9kZWwoJnB2bC0+bGlzdCk7CisJfQorCisJaWYgKGRtX2xpc3RfZW1wdHkoYWxsb2NhdGFibGVfcHZzKSkgeworCQlsb2dfZXJyb3IoIk5vIGV4dGVudHMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhbGxvY2F0YWJsZV9wdnM7Cit9CisKKy8qCisgKiBfdHJpbV9hbGxvY2F0YWJsZV9wdnMKKyAqIEBhbGxvY19saXN0CisgKiBAdHJpbV9saXN0CisgKgorICogUmVtb3ZlIFBWcyBpbiAndHJpbV9saXN0JyBmcm9tICdhbGxvY19saXN0Jy4KKyAqCisgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfdHJpbV9hbGxvY2F0YWJsZV9wdnMoc3RydWN0IGRtX2xpc3QgKmFsbG9jX2xpc3QsCisJCQkJIHN0cnVjdCBkbV9saXN0ICp0cmltX2xpc3QsCisJCQkJIGFsbG9jX3BvbGljeV90IGFsbG9jKQoreworCXN0cnVjdCBkbV9saXN0ICpwdmh0LCAqcHZoLCAqdHJpbV9wdmg7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnRyaW1fcHZsOworCisJaWYgKCFhbGxvY19saXN0KSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiYWxsb2NfbGlzdCBpcyBOVUxMIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghdHJpbV9saXN0IHx8IGRtX2xpc3RfZW1wdHkodHJpbV9saXN0KSkKKwkJcmV0dXJuIDE7IC8qIGFsbG9jX2xpc3Qgc3RheXMgdGhlIHNhbWUgKi8KKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKHB2aCwgcHZodCwgYWxsb2NfbGlzdCkgeworCQlwdmwgPSBkbV9saXN0X2l0ZW0ocHZoLCBzdHJ1Y3QgcHZfbGlzdCk7CisKKwkJZG1fbGlzdF9pdGVyYXRlKHRyaW1fcHZoLCB0cmltX2xpc3QpIHsKKwkJCXRyaW1fcHZsID0gZG1fbGlzdF9pdGVtKHRyaW1fcHZoLCBzdHJ1Y3QgcHZfbGlzdCk7CisKKwkJCS8qIERvbid0IGFsbG9jYXRlIG9udG8gYSB0cmltIFBWICovCisJCQlpZiAoKGFsbG9jICE9IEFMTE9DX0FOWVdIRVJFKSAmJgorCQkJICAgIChwdmwtPnB2ID09IHRyaW1fcHZsLT5wdikpIHsKKwkJCQlkbV9saXN0X2RlbCgmcHZsLT5saXN0KTsKKwkJCQlicmVhazsgIC8qIGdvdG8gbmV4dCBpbiBhbGxvY19saXN0ICovCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXBsYWNlIGFueSBMViBzZWdtZW50cyBvbiBnaXZlbiBQViB3aXRoIHRlbXBvcmFyeSBtaXJyb3IuCisgKiBSZXR1cm5zIGxpc3Qgb2YgTFZzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQgX2luc2VydF9wdm1vdmVfbWlycm9ycyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlyciwKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICpzb3VyY2VfcHZsLAorCQkJCSAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICpsdnNfY2hhbmdlZCkKKworeworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJdWludDMyX3QgcHJldl9sZV9jb3VudDsKKworCS8qIE9ubHkgMSBQViBtYXkgZmVhdHVyZSBpbiBzb3VyY2VfcHZsICovCisJcHZsID0gZG1fbGlzdF9pdGVtKHNvdXJjZV9wdmwtPm4sIHN0cnVjdCBwdl9saXN0KTsKKworCXByZXZfbGVfY291bnQgPSBsdl9taXJyLT5sZV9jb3VudDsKKwlpZiAoIWluc2VydF9sYXllcl9mb3Jfc2VnbWVudHNfb25fcHYoY21kLCBsdiwgbHZfbWlyciwgUFZNT1ZFLAorCQkJCQkgICAgIHB2bCwgbHZzX2NoYW5nZWQpKQorCQlyZXR1cm5fMDsKKworCS8qIGNoZWNrIGlmIGxheWVyIHdhcyBpbnNlcnRlZCAqLworCWlmIChsdl9taXJyLT5sZV9jb3VudCAtIHByZXZfbGVfY291bnQpIHsKKwkJbHYtPnN0YXR1cyB8PSBMT0NLRUQ7CisKKwkJbG9nX3ZlcmJvc2UoIk1vdmluZyAldSBleHRlbnRzIG9mIGxvZ2ljYWwgdm9sdW1lICVzLyVzIiwKKwkJCSAgICBsdl9taXJyLT5sZV9jb3VudCAtIHByZXZfbGVfY291bnQsCisJCQkgICAgbHYtPnZnLT5uYW1lLCBsdi0+bmFtZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJcyAnbHYnIGEgc3ViX2x2IG9mIHRoZSBMViBieSB0aGUgbmFtZSBvZiAnbHZfbmFtZSc/CisgKgorICogUmV0dXJuczogMSBpZiB0cnVlLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHN1Yl9sdl9vZihzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBjaGFyICpsdl9uYW1lKQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwkvKiBTdWItTFZzIG9ubHkgZXZlciBoYXZlIG9uZSBzZWdtZW50IHVzaW5nIHRoZW0gKi8KKwlpZiAoZG1fbGlzdF9zaXplKCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmICghKHNlZyA9IGdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihsdikpKQorCQlyZXR1cm5fMDsKKworCWlmICghc3RyY21wKHNlZy0+bHYtPm5hbWUsIGx2X25hbWUpKQorCQlyZXR1cm4gMTsKKworCS8qIENvbnRpbnVlIHVwIHRoZSB0cmVlICovCisJcmV0dXJuIHN1Yl9sdl9vZihzZWctPmx2LCBsdl9uYW1lKTsKK30KKworLyoKKyAqIHBhcmVudF9sdl9pc19jYWNoZV90eXBlCisgKgorICogRklYTUU6IFRoaXMgZnVuY3Rpb24gY2FuIGJlIHJlbW92ZWQgd2hlbiAncHZtb3ZlJyBpcyBzdXBwb3J0ZWQgZm9yCisgKiAgICAgICAgY2FjaGUgdHlwZXMuCisgKgorICogSWYgdGhpcyBMViBpcyBiZWxvdyBhIGNhY2hlIExWIChhdCBhbnkgZGVwdGgpLCByZXR1cm4gMS4KKyAqLworc3RhdGljIGludCBwYXJlbnRfbHZfaXNfY2FjaGVfdHlwZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWc7CisKKwkvKiBTdWItTFZzIG9ubHkgZXZlciBoYXZlIG9uZSBzZWdtZW50IHVzaW5nIHRoZW0gKi8KKwlpZiAoZG1fbGlzdF9zaXplKCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmICghKHNlZyA9IGdldF9vbmx5X3NlZ21lbnRfdXNpbmdfdGhpc19sdihsdikpKQorCQlyZXR1cm5fMDsKKworCWlmIChsdl9pc19jYWNoZV90eXBlKHNlZy0+bHYpKQorCQlyZXR1cm4gMTsKKworCS8qIENvbnRpbnVlIHVwIHRoZSB0cmVlICovCisJcmV0dXJuIHBhcmVudF9sdl9pc19jYWNoZV90eXBlKHNlZy0+bHYpOworfQorCisvKiBDcmVhdGUgbmV3IExWIHdpdGggbWlycm9yIHNlZ21lbnRzIGZvciB0aGUgcmVxdWlyZWQgY29waWVzICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpfc2V0X3VwX3B2bW92ZV9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkJc3RydWN0IGRtX2xpc3QgKnNvdXJjZV9wdmwsCisJCQkJCQljb25zdCBjaGFyICpsdl9uYW1lLAorCQkJCQkJc3RydWN0IGRtX2xpc3QgKmFsbG9jYXRhYmxlX3B2cywKKwkJCQkJCWFsbG9jX3BvbGljeV90IGFsbG9jLAorCQkJCQkJc3RydWN0IGRtX2xpc3QgKipsdnNfY2hhbmdlZCwKKwkJCQkJCXVuc2lnbmVkICpleGNsdXNpdmUpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9taXJyLCAqbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBkbV9saXN0IHRyaW1fbGlzdDsKKwl1aW50MzJfdCBsb2dfY291bnQgPSAwOworCWludCBsdl9mb3VuZCA9IDA7CisJaW50IGx2X3NraXBwZWQgPSAwOworCWludCBsdl9hY3RpdmVfY291bnQgPSAwOworCWludCBsdl9leGNsdXNpdmVfY291bnQgPSAwOworCisJLyogRklYTUUgQ29wZSB3aXRoIG5vbi1jb250aWd1b3VzID0+IHNwbGl0dGluZyBleGlzdGluZyBzZWdtZW50cyAqLworCWlmICghKGx2X21pcnIgPSBsdl9jcmVhdGVfZW1wdHkoInB2bW92ZSVkIiwgTlVMTCwKKwkJCQkJTFZNX1JFQUQgfCBMVk1fV1JJVEUsCisJCQkJCUFMTE9DX0NPTlRJR1VPVVMsIHZnKSkpIHsKKwkJbG9nX2Vycm9yKCJDcmVhdGlvbiBvZiB0ZW1wb3JhcnkgcHZtb3ZlIExWIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsdl9taXJyLT5zdGF0dXMgfD0gKFBWTU9WRSB8IExPQ0tFRCk7CisKKwlpZiAoISgqbHZzX2NoYW5nZWQgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKipsdnNfY2hhbmdlZCkpKSkgeworCQlsb2dfZXJyb3IoImx2c19jaGFuZ2VkIGxpc3Qgc3RydWN0IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRtX2xpc3RfaW5pdCgqbHZzX2NoYW5nZWQpOworCisJLyoKKwkgKiBGaXJzdCwKKwkgKiB1c2UgdG9wLWxldmVsIFJBSUQgYW5kIG1pcnJvciBMVnMgdG8gYnVpbGQgYSBsaXN0IG9mIFBWcworCSAqIHRoYXQgbXVzdCBiZSBhdm9pZGVkIGR1cmluZyBhbGxvY2F0aW9uLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkgKiB0byBtYWludGFpbiByZWR1bmRhbmN5IG9mIHRob3NlIHRhcmdldHMsIGJ1dCBpdCBpcyBhbHNvCisJICogc3ViLW9wdGltYWwuICBBdm9pZGluZyBlbnRpcmUgUFZzIGluIHRoaXMgd2F5IGxpbWl0cyBvdXIKKwkgKiBhYmlsaXR5IHRvIGZpbmQgc3BhY2UgZm9yIG90aGVyIHNlZ21lbnQgdHlwZXMuICBJbiB0aGUKKwkgKiBtYWpvcml0eSBvZiBjYXNlcywgaG93ZXZlciwgdGhpcyBtZXRob2Qgd2lsbCBzdWZmaWNlIGFuZAorCSAqIGluIHRoZSBjYXNlcyB3aGVyZSBpdCBkb2VzIG5vdCwgdGhlIHVzZXIgY2FuIGlzc3VlIHRoZQorCSAqIHB2bW92ZSBvbiBhIHBlci1MViBiYXNpcy4KKwkgKgorCSAqIEZJWE1FOiBFbGltaW5hdGluZyBlbnRpcmUgUFZzIHBsYWNlcyB0b28gbWFueSByZXN0cmljdGlvbnMKKwkgKiAgICAgICAgb24gYWxsb2NhdGlvbi4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlsdiA9IGx2bC0+bHY7CisJCWlmIChsdiA9PSBsdl9taXJyKQorCQkJY29udGludWU7CisKKwkJaWYgKGx2X25hbWUgJiYgc3RyY21wKGx2LT5uYW1lLCBsdl9uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFJBSUQsIHRoaW4gYW5kIHNuYXBzaG90LXJlbGF0ZWQgTFZzIGFyZSBub3QKKwkJICogcHJvY2Vzc2VkIGluIGEgY2x1c3Rlciwgc28gd2UgZG9uJ3QgaGF2ZSB0bworCQkgKiB3b3JyeSBhYm91dCBhdm9pZGluZyBjZXJ0YWluIFBWcyBpbiB0aGF0IGNvbnRleHQuCisJCSAqCisJCSAqIEFsbG93IGNsdXN0ZXJlZCBtaXJyb3IsIGJ1dCBub3QgcmFpZCBtaXJyb3IuCisJCSAqLworCQlpZiAodmdfaXNfY2x1c3RlcmVkKGx2LT52ZykgJiYgIWx2X2lzX21pcnJvcl90eXBlKGx2KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbHZfaXNfb25fcHZzKGx2LCBzb3VyY2VfcHZsKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsdl9pc19jb252ZXJ0aW5nKGx2KSB8fCBsdl9pc19tZXJnaW5nKGx2KSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcHZtb3ZlIHdoZW4gJXMgdm9sdW1lcyBhcmUgcHJlc2VudCIsCisJCQkJICBsdl9pc19jb252ZXJ0aW5nKGx2KSA/CisJCQkJICAiY29udmVydGluZyIgOiAibWVyZ2luZyIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoc2VnX2lzX3JhaWQoZmlyc3Rfc2VnKGx2KSkgfHwKKwkJICAgIHNlZ19pc19taXJyb3JlZChmaXJzdF9zZWcobHYpKSkgeworCQkJZG1fbGlzdF9pbml0KCZ0cmltX2xpc3QpOworCisJCQlpZiAoIWdldF9wdl9saXN0X2Zvcl9sdihsdi0+dmctPmNtZC0+bWVtLAorCQkJCQkJbHYsICZ0cmltX2xpc3QpKQorCQkJCXJldHVybl9OVUxMOworCisJCQlpZiAoIV90cmltX2FsbG9jYXRhYmxlX3B2cyhhbGxvY2F0YWJsZV9wdnMsCisJCQkJCQkgICAmdHJpbV9saXN0LCBhbGxvYykpCisJCQkJcmV0dXJuX05VTEw7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlY29uZCwKKwkgKiB1c2UgYm90dG9tLWxldmVsIExWcyAobGlrZSAqX21pbWFnZV8qLCAqX21sb2csICpfcm1ldGFfKiwgZXRjKQorCSAqIHRvIGZpbmQgc2VnbWVudHMgdG8gYmUgbW92ZWQgYW5kIHRoZW4gc2V0IHVwIG1pcnJvcnMuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJbHYgPSBsdmwtPmx2OworCQlpZiAobHYgPT0gbHZfbWlycikKKwkJCWNvbnRpbnVlOworCQlpZiAobHZfbmFtZSkgeworCQkJaWYgKHN0cmNtcChsdi0+bmFtZSwgbHZfbmFtZSkgJiYgIXN1Yl9sdl9vZihsdiwgbHZfbmFtZSkpCisJCQkJY29udGludWU7CisJCQlsdl9mb3VuZCA9IDE7CisJCX0KKworCQlpZiAoIWx2X2lzX29uX3B2cyhsdiwgc291cmNlX3B2bCkpCisJCQljb250aW51ZTsKKworCQlpZiAobHZfaXNfY2FjaGVfdHlwZShsdikpIHsKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJTa2lwcGluZyAlcyBMViwgJXMiLAorCQkJCQkJbHZfaXNfY2FjaGUobHYpID8gImNhY2hlIiA6CisJCQkJCQlsdl9pc19jYWNoZV9wb29sKGx2KSA/CisJCQkJCQkiY2FjaGUtcG9vbCIgOiAiY2FjaGUtcmVsYXRlZCIsCisJCQkJCQlsdi0+bmFtZSk7CisJCQlsdl9za2lwcGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBhcmVudF9sdl9pc19jYWNoZV90eXBlKGx2KSkgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlNraXBwaW5nICVzIGJlY2F1c2UgYSBwYXJlbnQiCisJCQkJCQkiIGlzIG9mIGNhY2hlIHR5cGUiLCBsdi0+bmFtZSk7CisJCQlsdl9za2lwcGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIFZHIGlzIGNsdXN0ZXJlZCwgd2UgYXJlIHVuYWJsZSB0byBoYW5kbGUKKwkJICogc25hcHNob3RzLCBvcmlnaW5zLCB0aGluIHR5cGVzLCBSQUlEIG9yIG1pcnJvcgorCQkgKi8KKwkJaWYgKHZnX2lzX2NsdXN0ZXJlZCh2ZykgJiYKKwkJICAgIChsdl9pc19vcmlnaW4obHYpIHx8IGx2X2lzX2NvdyhsdikgfHwKKwkJICAgICBsdl9pc190aGluX3R5cGUobHYpIHx8IGx2X2lzX3JhaWRfdHlwZShsdikpKSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU2tpcHBpbmcgJXMgTFYgJXMiLAorCQkJCQkJbHZfaXNfb3JpZ2luKGx2KSA/ICJvcmlnaW4iIDoKKwkJCQkJCWx2X2lzX2NvdyhsdikgPworCQkJCQkJInNuYXBzaG90LXJlbGF0ZWQiIDoKKwkJCQkJCWx2X2lzX3RoaW5fdm9sdW1lKGx2KSA/ICJ0aGluIiA6CisJCQkJCQlsdl9pc190aGluX3Bvb2wobHYpID8KKwkJCQkJCSJ0aGluLXBvb2wiIDoKKwkJCQkJCWx2X2lzX3RoaW5fdHlwZShsdikgPworCQkJCQkJInRoaW4tcmVsYXRlZCIgOgorCQkJCQkJc2VnX2lzX3JhaWQoZmlyc3Rfc2VnKGx2KSkgPworCQkJCQkJIlJBSUQiIDoKKwkJCQkJCWx2X2lzX3JhaWRfdHlwZShsdikgPworCQkJCQkJIlJBSUQtcmVsYXRlZCIgOiAiIiwKKwkJCQkJCWx2LT5uYW1lKTsKKwkJCWx2X3NraXBwZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlzZWcgPSBmaXJzdF9zZWcobHYpOworCQlpZiAoc2VnX2lzX3JhaWQoc2VnKSB8fCBzZWdfaXNfbWlycm9yZWQoc2VnKSB8fAorCQkgICAgbHZfaXNfdGhpbl92b2x1bWUobHYpIHx8IGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJCS8qCisJCQkgKiBQYXNzIG92ZXIgdG9wLWxldmVsIExWcyAtIHRoZXkgd2VyZSBoYW5kbGVkLgorCQkJICogQWxsb3cgc3ViLUxWcyB0byBwcm9jZWVkLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsdl9pc19sb2NrZWQobHYpKSB7CisJCQlsdl9za2lwcGVkID0gMTsKKwkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJTa2lwcGluZyBsb2NrZWQgTFYgJXMiLCBsdi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2Z19pc19jbHVzdGVyZWQodmcpICYmCisJCSAgICBsdl9pc19hY3RpdmVfZXhjbHVzaXZlX3JlbW90ZWx5KGx2KSkgeworCQkJbHZfc2tpcHBlZCA9IDE7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU2tpcHBpbmcgTFYgJXMgd2hpY2ggaXMgYWN0aXZhdGVkICIKKwkJCQkJCSJleGNsdXNpdmVseSBvbiByZW1vdGUgbm9kZS4iLCBsdi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2Z19pc19jbHVzdGVyZWQodmcpKSB7CisJCQlpZiAobHZfaXNfYWN0aXZlX2V4Y2x1c2l2ZV9sb2NhbGx5KGx2KSkKKwkJCQlsdl9leGNsdXNpdmVfY291bnQrKzsKKwkJCWVsc2UgaWYgKGx2X2lzX2FjdGl2ZShsdikpCisJCQkJbHZfYWN0aXZlX2NvdW50Kys7CisJCX0KKworCQlpZiAoIV9pbnNlcnRfcHZtb3ZlX21pcnJvcnMoY21kLCBsdl9taXJyLCBzb3VyY2VfcHZsLCBsdiwKKwkJCQkJICAgICpsdnNfY2hhbmdlZCkpCisJCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlpZiAobHZfbmFtZSAmJiAhbHZfZm91bmQpIHsKKwkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBub3QgZm91bmQuIiwgbHZfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIElzIHRlbXBvcmFyeSBtaXJyb3IgZW1wdHk/ICovCisJaWYgKCFsdl9taXJyLT5sZV9jb3VudCkgeworCQlpZiAobHZfc2tpcHBlZCkKKwkJCWxvZ19lcnJvcigiQWxsIGRhdGEgb24gc291cmNlIFBWIHNraXBwZWQuICIKKwkJCQkgICJJdCBjb250YWlucyBsb2NrZWQsIGhpZGRlbiBvciAiCisJCQkJICAibm9uLXRvcCBsZXZlbCBMVnMgb25seS4iKTsKKwkJbG9nX2Vycm9yKCJObyBkYXRhIHRvIG1vdmUgZm9yICVzIiwgdmctPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSAmJiBsdl9hY3RpdmVfY291bnQgJiYgKmV4Y2x1c2l2ZSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBtb3ZlIGluIGNsdXN0ZXJlZCBWRyAlcywgIgorCQkJICAiY2x1c3RlcmVkIG1pcnJvciAoY21pcnJvcikgbm90IGRldGVjdGVkICIKKwkJCSAgImFuZCBMVnMgYXJlIGFjdGl2YXRlZCBub24tZXhjbHVzaXZlbHkuIiwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSAmJiBsdl9leGNsdXNpdmVfY291bnQpIHsKKwkJaWYgKGx2X2FjdGl2ZV9jb3VudCkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3QgbW92ZSBpbiBjbHVzdGVyZWQgVkcgJXMgIgorCQkJCSAgImlmIHNvbWUgTFZzIGFyZSBhY3RpdmF0ZWQgIgorCQkJCSAgImV4Y2x1c2l2ZWx5IHdoaWxlIG90aGVycyBkb24ndC4iLAorCQkJCSAgdmctPm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKmV4Y2x1c2l2ZSA9IDE7CisJfQorCisJaWYgKCFsdl9hZGRfbWlycm9ycyhjbWQsIGx2X21pcnIsIDEsIDEsIDAsIDAsIGxvZ19jb3VudCwKKwkJCSAgICBhbGxvY2F0YWJsZV9wdnMsIGFsbG9jLAorCQkJICAgIChhcmdfaXNfc2V0KGNtZCwgYXRvbWljX0FSRykpID8KKwkJCSAgICBNSVJST1JfQllfU0VHTUVOVEVEX0xWIDogTUlSUk9SX0JZX1NFRykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY29udmVydCBwdm1vdmUgTFYgdG8gbWlycm9yZWQiKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJaWYgKCFzcGxpdF9wYXJlbnRfc2VnbWVudHNfZm9yX2xheWVyKGNtZCwgbHZfbWlycikpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3BsaXQgc2VnbWVudHMgYmVpbmcgbW92ZWQiKTsKKwkJcmV0dXJuX05VTEw7CisJfQorCisJcmV0dXJuIGx2X21pcnI7Cit9CisKK3N0YXRpYyBpbnQgX2FjdGl2YXRlX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIsCisJCQl1bnNpZ25lZCBleGNsdXNpdmUpCit7CisJaW50IHIgPSAwOworCisJaWYgKGV4Y2x1c2l2ZSB8fCBsdl9pc19hY3RpdmVfZXhjbHVzaXZlKGx2X21pcnIpKQorCQlyID0gYWN0aXZhdGVfbHZfZXhjbChjbWQsIGx2X21pcnIpOworCWVsc2UKKwkJciA9IGFjdGl2YXRlX2x2KGNtZCwgbHZfbWlycik7CisKKwlpZiAoIXIpCisJCXN0YWNrOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gc2V0IHVwIGluaXRpYWwgcHZtb3ZlIExWIG9ubHkuCisgKiAoTm90IGNhbGxlZCBhZnRlciBmaXJzdCBvciBhbnkgb3RoZXIgc2VjdGlvbiBjb21wbGV0ZXMuKQorICovCitzdGF0aWMgaW50IF91cGRhdGVfbWV0YWRhdGEoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlyciwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQsIHVuc2lnbmVkIGV4Y2x1c2l2ZSkKK3sKKwlpbnQgciA9IDA7CisKKwlsb2dfdmVyYm9zZSgiU2V0dGluZyB1cCBwdm1vdmUgaW4gb24tZGlzayB2b2x1bWUgZ3JvdXAgbWV0YWRhdGEuIik7CisJaWYgKCF2Z193cml0ZSh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogVm9sdW1lIGdyb3VwIG1ldGFkYXRhIHVwZGF0ZSBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3VzcGVuZF9sdnMoY21kLCBsdnNfY2hhbmdlZCwgdmcpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFRlbXBvcmFyeSBwdm1vdmUgbWlycm9yIGFjdGl2YXRpb24gZmFpbGVkLiIpOworCQkvKiBGSVhNRSBBZGQgYSByZWNvdmVyeSBwYXRoIGZvciBmaXJzdCB0aW1lIHRvby4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29tbWl0IG9uLWRpc2sgbWV0YWRhdGEgKi8KKwlpZiAoIXZnX2NvbW1pdCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogVm9sdW1lIGdyb3VwIG1ldGFkYXRhIHVwZGF0ZSBmYWlsZWQuIik7CisJCWlmICghcmVzdW1lX2x2cyhjbWQsIGx2c19jaGFuZ2VkKSkKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlc3VtZSBsb2dpY2FsIHZvbHVtZXMuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEFjdGl2YXRlIHRoZSB0ZW1wb3JhcnkgbWlycm9yIExWICovCisJLyogT25seSB0aGUgZmlyc3QgbWlycm9yIHNlZ21lbnQgZ2V0cyBhY3RpdmF0ZWQgYXMgYSBtaXJyb3IgKi8KKwkvKiBGSVhNRTogQWRkIG9wdGlvbiB0byB1c2UgYSBsb2cgKi8KKwlpZiAoIWV4Y2x1c2l2ZSAmJiBfcHZtb3ZlX2lzX2V4Y2x1c2l2ZShjbWQsIHZnKSkKKwkJZXhjbHVzaXZlID0gMTsKKworCWlmICghX2FjdGl2YXRlX2x2KGNtZCwgbHZfbWlyciwgZXhjbHVzaXZlKSkgeworCQlpZiAodGVzdF9tb2RlKCkpIHsKKwkJCXIgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBGSVhNRSBSdW4gLS1hYm9ydCBpbnRlcm5hbGx5IGhlcmUuCisJCSAqLworCQlsb2dfZXJyb3IoIkFCT1JUSU5HOiBUZW1wb3JhcnkgcHZtb3ZlIG1pcnJvciBhY3RpdmF0aW9uIGZhaWxlZC4gUnVuIHB2bW92ZSAtLWFib3J0LiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyID0gMTsKKworb3V0OgorCWlmICghcmVzdW1lX2x2cyhjbWQsIGx2c19jaGFuZ2VkKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byByZXN1bWUgbG9naWNhbCB2b2x1bWVzLiIpOworCQlyID0gMDsKKwl9CisKKwlpZiAocikKKwkJYmFja3VwKHZnKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9jb3B5X2lkX2NvbXBvbmVudHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgY2hhciAqKnZnX25hbWUsCisJCQkgICAgICAgY2hhciAqKmx2X25hbWUsIHVuaW9uIGx2aWQgKmx2aWQpCit7CisJaWYgKCEoKnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgbHYtPnZnLT5uYW1lKSkgfHwKKwkgICAgISgqbHZfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBsdi0+bmFtZSkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNsb25lIFZHIG9yIExWIG5hbWUuIik7CisJCXJldHVybiAwOworCX0KKworCSpsdmlkID0gbHYtPmx2aWQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcHZtb3ZlX3NldHVwX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcHZtb3ZlX3BhcmFtcyAqcHAgPSAoc3RydWN0IHB2bW92ZV9wYXJhbXMgKikgaGFuZGxlLT5jdXN0b21faGFuZGxlOworCWNvbnN0IGNoYXIgKmx2X25hbWUgPSBOVUxMOworCXN0cnVjdCBkbV9saXN0ICpzb3VyY2VfcHZsOworCXN0cnVjdCBkbV9saXN0ICphbGxvY2F0YWJsZV9wdnM7CisJc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlycjsKKwljb25zdCBjaGFyICpwdl9uYW1lID0gcHZfZGV2X25hbWUocHYpOworCXVuc2lnbmVkIGZsYWdzID0gUFZNT1ZFX0ZJUlNUX1RJTUU7CisJdW5zaWduZWQgZXhjbHVzaXZlOworCWludCByID0gRUNNRF9GQUlMRUQ7CisKKwlwcC0+Zm91bmRfcHYgPSAxOworCXBwLT5zZXR1cF9yZXN1bHQgPSBFQ01EX0ZBSUxFRDsKKworCWlmIChwcC0+bHZfbmFtZV9hcmcpIHsKKwkJaWYgKCEobHZfbmFtZSA9IF9leHRyYWN0X2x2bmFtZShjbWQsIHZnLT5uYW1lLCBwcC0+bHZfbmFtZV9hcmcpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBhbiBMViBuYW1lLiIpOworCQkJcHAtPnNldHVwX3Jlc3VsdCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKCF2YWxpZGF0ZV9uYW1lKGx2X25hbWUpKSB7CisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIG5hbWUgJXMgaXMgaW52YWxpZCIsIGx2X25hbWUpOworCQkJcHAtPnNldHVwX3Jlc3VsdCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBjYW5ub3QgbW92ZSBibG9ja3MgZnJvbSB1bmRlciB0aGUgc2FubG9jayBsZWFzZXMsIHNvIGRpc2FsbG93CisJICogcHZtb3ZpbmcgYW55IFBWcyB1c2VkIGJ5IHRoZSBsdm1sb2NrIExWLgorCSAqLworCWlmICh2Zy0+bG9ja190eXBlICYmICFzdHJjbXAodmctPmxvY2tfdHlwZSwgInNhbmxvY2siKSkgeworCQlzdHJ1Y3QgbHZfc2VnbWVudCAqbHZzZWc7CisJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnNhbmxvY2tfcHY7CisJCXVuc2lnbmVkIHM7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2c2VnLCAmdmctPnNhbmxvY2tfbHYtPnNlZ21lbnRzKSB7CisJCQlmb3IgKHMgPSAwOyBzIDwgbHZzZWctPmFyZWFfY291bnQ7IHMrKykgeworCQkJCWlmIChzZWdfdHlwZShsdnNlZywgcykgPT0gQVJFQV9QVikgeworCQkJCQlzYW5sb2NrX3B2ID0gc2VnX3B2KGx2c2VnLCBzKTsKKwkJCQkJaWYgKHNhbmxvY2tfcHYtPmRldiA9PSBwdi0+ZGV2KSB7CisJCQkJCQlsb2dfZXJyb3IoIkNhbm5vdCBwdm1vdmUgZGV2aWNlICVzIHVzZWQgZm9yIHNhbmxvY2sgbGVhc2VzLiIsIHB2X25hbWUpOworCQkJCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJZXhjbHVzaXZlID0gX3B2bW92ZV9pc19leGNsdXNpdmUoY21kLCB2Zyk7CisKKwlpZiAoKGx2X21pcnIgPSBmaW5kX3B2bW92ZV9sdih2ZywgcHZfZGV2KHB2KSwgUFZNT1ZFKSkpIHsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkRldGVjdGVkIHB2bW92ZSBpbiBwcm9ncmVzcyBmb3IgJXMiLCBwdl9uYW1lKTsKKwkJaWYgKHBwLT5wdl9jb3VudCB8fCBsdl9uYW1lKQorCQkJbG9nX2Vycm9yKCJJZ25vcmluZyByZW1haW5pbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyIpOworCisJCWlmICghKGx2c19jaGFuZ2VkID0gbHZzX3VzaW5nX2x2KGNtZCwgdmcsIGx2X21pcnIpKSkgeworCQkJbG9nX2Vycm9yKCJBQk9SVElORzogRmFpbGVkIHRvIGdlbmVyYXRlIGxpc3Qgb2YgbW92aW5nIExWcyIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBFbnN1cmUgbWlycm9yIExWIGlzIGFjdGl2ZSAqLworCQlpZiAoIV9hY3RpdmF0ZV9sdihjbWQsIGx2X21pcnIsIGV4Y2x1c2l2ZSkpIHsKKwkJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFRlbXBvcmFyeSBtaXJyb3IgYWN0aXZhdGlvbiBmYWlsZWQuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZsYWdzICY9IH5QVk1PVkVfRklSU1RfVElNRTsKKwl9IGVsc2UgeworCQkvKiBEZXRlcm1pbmUgUEUgcmFuZ2VzIHRvIGJlIG1vdmVkICovCisJCWlmICghKHNvdXJjZV9wdmwgPSBjcmVhdGVfcHZfbGlzdChjbWQtPm1lbSwgdmcsIDEsCisJCQkJCQkgICZwcC0+cHZfbmFtZV9hcmcsIDApKSkKKwkJCWdvdG9fb3V0OworCisJCWlmIChwcC0+YWxsb2MgPT0gQUxMT0NfSU5IRVJJVCkKKwkJCXBwLT5hbGxvYyA9IHZnLT5hbGxvYzsKKworCQkvKiBHZXQgUFZzIHdlIGNhbiB1c2UgZm9yIGFsbG9jYXRpb24gKi8KKwkJaWYgKCEoYWxsb2NhdGFibGVfcHZzID0gX2dldF9hbGxvY2F0YWJsZV9wdnMoY21kLCBwcC0+cHZfY291bnQsIHBwLT5wdl9uYW1lcywKKwkJCQkJCQkgICAgIHZnLCBwdiwgcHAtPmFsbG9jKSkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWFyY2hpdmUodmcpKQorCQkJZ290b19vdXQ7CisKKwkJaWYgKCEobHZfbWlyciA9IF9zZXRfdXBfcHZtb3ZlX2x2KGNtZCwgdmcsIHNvdXJjZV9wdmwsIGx2X25hbWUsCisJCQkJCQkgIGFsbG9jYXRhYmxlX3B2cywgcHAtPmFsbG9jLAorCQkJCQkJICAmbHZzX2NoYW5nZWQsICZleGNsdXNpdmUpKSkKKwkJCWdvdG9fb3V0OworCX0KKworCS8qIExvY2sgbHZzX2NoYW5nZWQgYW5kIGFjdGl2YXRlICh3aXRoIG9sZCBtZXRhZGF0YSkgKi8KKwlpZiAoIWFjdGl2YXRlX2x2cyhjbWQsIGx2c19jaGFuZ2VkLCBleGNsdXNpdmUpKQorCQlnb3RvX291dDsKKworCS8qIEZJWE1FIFByZXNlbmNlIG9mIGEgbWlycm9yIG9uY2Ugc2V0IFBWTU9WRSAtIG5vdyByZW1vdmUgYXNzb2NpYXRlZCBsb2dpYyAqLworCS8qIGluaXRfcHZtb3ZlKDEpOyAqLworCS8qIHZnLT5zdGF0dXMgfD0gUFZNT1ZFOyAqLworCisJaWYgKCFfY29weV9pZF9jb21wb25lbnRzKGNtZCwgbHZfbWlyciwgJnBwLT5pZF92Z19uYW1lLCAmcHAtPmlkX2x2X25hbWUsIHBwLT5sdmlkKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoZmxhZ3MgJiBQVk1PVkVfRklSU1RfVElNRSkKKwkJaWYgKCFfdXBkYXRlX21ldGFkYXRhKGNtZCwgdmcsIGx2X21pcnIsIGx2c19jaGFuZ2VkLCBleGNsdXNpdmUpKQorCQkJZ290b19vdXQ7CisKKwkvKiBMVnMgYXJlIGFsbCBpbiBzdGF0dXMgTE9DS0VEICovCisJcHAtPnNldHVwX3Jlc3VsdCA9IEVDTURfUFJPQ0VTU0VEOworCXIgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcHZtb3ZlX3JlYWRfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBwdm1vdmVfcGFyYW1zICpwcCA9IChzdHJ1Y3QgcHZtb3ZlX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlpbnQgcmV0ID0gRUNNRF9GQUlMRUQ7CisKKwlwcC0+Zm91bmRfcHYgPSAxOworCisJaWYgKCEobHYgPSBmaW5kX3B2bW92ZV9sdih2ZywgcHZfZGV2KHB2KSwgUFZNT1ZFKSkpIHsKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzOiBObyBwdm1vdmUgaW4gcHJvZ3Jlc3MgLSBhbHJlYWR5IGZpbmlzaGVkIG9yIGFib3J0ZWQuIiwKKwkJCQkJcHZfZGV2X25hbWUocHYpKTsKKwkJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisJCXBwLT5pbl9wcm9ncmVzcyA9IDA7CisJfSBlbHNlIGlmIChfY29weV9pZF9jb21wb25lbnRzKGNtZCwgbHYsICZwcC0+aWRfdmdfbmFtZSwgJnBwLT5pZF9sdl9uYW1lLCBwcC0+bHZpZCkpIHsKKwkJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisJCXBwLT5pbl9wcm9ncmVzcyA9IDE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwb2xsX2Z1bmN0aW9ucyBfcHZtb3ZlX2ZucyA9IHsKKwkuZ2V0X2NvcHlfbmFtZV9mcm9tX2x2ID0gZ2V0X3B2bW92ZV9wdm5hbWVfZnJvbV9sdl9taXJyLAorCS5wb2xsX3Byb2dyZXNzID0gcG9sbF9taXJyb3JfcHJvZ3Jlc3MsCisJLnVwZGF0ZV9tZXRhZGF0YSA9IHB2bW92ZV91cGRhdGVfbWV0YWRhdGEsCisJLmZpbmlzaF9jb3B5ID0gcHZtb3ZlX2ZpbmlzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKl9wdm1vdmVfY3JlYXRlX2lkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICAgY29uc3QgY2hhciAqcHZfbmFtZSwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJCQkgICBjb25zdCBjaGFyICpsdl9uYW1lLAorCQkJCQkJICAgY29uc3QgY2hhciAqdXVpZCkKK3sKKwlzdHJ1Y3QgcG9sbF9vcGVyYXRpb25faWQgKmlkOworCisJaWYgKCF2Z19uYW1lIHx8ICFsdl9uYW1lIHx8ICFwdl9uYW1lIHx8ICF1dWlkKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiV3JvbmcgcGFyYW1zIGZvciBfcHZtb3ZlX2NyZWF0ZV9pZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoaWQgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKmlkKSkpKSB7CisJCWxvZ19lcnJvcigiUG9sbCBvcGVyYXRpb24gSUQgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghKGlkLT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnX25hbWUpKSB8fAorCSAgICAhKGlkLT5sdl9uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGx2X25hbWUpKSB8fAorCSAgICAhKGlkLT5kaXNwbGF5X25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgcHZfbmFtZSkpIHx8CisJICAgICEoaWQtPnV1aWQgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdXVpZCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvcHkgb25lIG9yIG1vcmUgcG9sbCBvcGVyYXRpb24gSUQgbWVtYmVycy4iKTsKKwkJZG1fcG9vbF9mcmVlKGNtZC0+bWVtLCBpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBpZDsKK30KKworaW50IHB2bW92ZV9wb2xsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpwdl9uYW1lLAorCQljb25zdCBjaGFyICp1dWlkLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQljb25zdCBjaGFyICpsdl9uYW1lLCB1bnNpZ25lZCBiYWNrZ3JvdW5kKQoreworCXN0cnVjdCBwb2xsX29wZXJhdGlvbl9pZCAqaWQgPSBOVUxMOworCisJaWYgKHV1aWQgJiYKKwkgICAgIShpZCA9IF9wdm1vdmVfY3JlYXRlX2lkKGNtZCwgcHZfbmFtZSwgdmdfbmFtZSwgbHZfbmFtZSwgdXVpZCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFsbG9jYXRlIHBvbGwgaWRlbnRpZmllciBmb3IgcHZtb3ZlLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKHRlc3RfbW9kZSgpKQorCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwlyZXR1cm4gcG9sbF9kYWVtb24oY21kLCBiYWNrZ3JvdW5kLCBQVk1PVkUsICZfcHZtb3ZlX2ZucywgIk1vdmVkIiwgaWQpOworfQorCitpbnQgcHZtb3ZlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHB2bW92ZV9wYXJhbXMgcHAgPSB7IDAgfTsKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJdW5pb24gbHZpZCAqbHZpZCA9IE5VTEw7CisJY2hhciAqcHZfbmFtZSA9IE5VTEw7CisJY2hhciAqY29sb247CisJdW5zaWduZWQgaXNfYWJvcnQgPSBhcmdfaXNfc2V0KGNtZCwgYWJvcnRfQVJHKTsKKworCS8qIGRtIHJhaWQxIHRhcmdldCBtdXN0IGJlIHByZXNlbnQgaW4gZXZlcnkgY2FzZSAqLworCWlmICghX3B2bW92ZV90YXJnZXRfcHJlc2VudChjbWQsIDApKSB7CisJCWxvZ19lcnJvcigiUmVxdWlyZWQgZGV2aWNlLW1hcHBlciB0YXJnZXQocykgbm90ICIKKwkJCSAgImRldGVjdGVkIGluIHlvdXIga2VybmVsIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZtbG9ja2RfdXNlKCkgJiYgIWx2bXBvbGxkX3VzZSgpKSB7CisJCS8qCisJCSAqIERvbid0IHdhbnQgdG8gc3BlbmQgdGhlIHRpbWUgbWFraW5nIGx2bWxvY2tkCisJCSAqIHdvcmsgd2l0aG91dCBsdm1wb2xsZC4KKwkJICovCisJCWxvZ19lcnJvcigiRW5hYmxlIGx2bXBvbGxkIHdoZW4gdXNpbmcgbHZtbG9ja2QuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAobHZtbG9ja2RfdXNlKCkgJiYgIWFyZ2MpIHsKKwkJLyoKKwkJICogRklYTUU6IG1vdmUgcHJvY2Vzc19lYWNoX3ZnIGZyb20gcG9sbGRhZW1vbiB1cCB0byBoZXJlLAorCQkgKiB0aGVuIHdlIGNhbiByZW1vdmUgdGhpcyBsaW1pdGF0aW9uLgorCQkgKi8KKwkJbG9nX2Vycm9yKCJTcGVjaWZ5IHB2bW92ZSBhcmdzIHdoZW4gdXNpbmcgbHZtbG9ja2QuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoYXJnYykgeworCQlpZiAoIShsdmlkID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpsdmlkKSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSBsdmlkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisJCXBwLmx2aWQgPSBsdmlkOworCisJCWlmICghKHBwLnB2X25hbWVfYXJnID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIGFyZ3ZbMF0pKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY2xvbmUgUFYgbmFtZS4iKTsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCisJCWlmICghKHB2X25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgYXJndlswXSkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbG9uZSBQViBuYW1lLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJZG1fdW5lc2NhcGVfY29sb25zX2FuZF9hdF9zaWducyhwdl9uYW1lLCAmY29sb24sIE5VTEwpOworCisJCS8qIERyb3AgYW55IFBFIGxpc3RzIGZyb20gUFYgbmFtZSAqLworCQlpZiAoY29sb24pCisJCQkqY29sb24gPSAnXDAnOworCisJCWFyZ2MtLTsKKwkJYXJndisrOworCisJCXBwLnB2X2NvdW50ID0gYXJnYzsKKwkJcHAucHZfbmFtZXMgPSBhcmd2OworCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgbmFtZV9BUkcpKSB7CisJCQlpZiAoIShwcC5sdl9uYW1lX2FyZyA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBhcmdfdmFsdWUoY21kLCBuYW1lX0FSRykpKSkgIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjbG9uZSBMViBuYW1lLiIpOworCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJCX0KKwkJfQorCisJCXBwLmFsbG9jID0gKGFsbG9jX3BvbGljeV90KSBhcmdfdWludF92YWx1ZShjbWQsIGFsbG9jX0FSRywgQUxMT0NfSU5IRVJJVCk7CisKKwkJcHAuaW5fcHJvZ3Jlc3MgPSAxOworCisJCS8qIE5vcm1hbCBwdm1vdmUgc2V0dXAgcmVxdWlyZXMgZXggbG9jayBmcm9tIGx2bWxvY2tkLiAqLworCQlpZiAoaXNfYWJvcnQpCisJCQljbWQtPmxvY2tkX3ZnX2RlZmF1bHRfc2ggPSAxOworCisJCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKworCQloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSAmcHA7CisKKwkJcHJvY2Vzc19lYWNoX3B2KGNtZCwgMSwgJnB2X25hbWUsIE5VTEwsIDAsCisJCQkJaXNfYWJvcnQgPyAwIDogUkVBRF9GT1JfVVBEQVRFLAorCQkJCWhhbmRsZSwKKwkJCQlpc19hYm9ydCA/ICZfcHZtb3ZlX3JlYWRfc2luZ2xlIDogJl9wdm1vdmVfc2V0dXBfc2luZ2xlKTsKKworCQlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKworCQlpZiAoIWlzX2Fib3J0KSB7CisJCQlpZiAoIXBwLmZvdW5kX3B2KSB7CisJCQkJc3RhY2s7CisJCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQkJfQorCisJCQlpZiAocHAuc2V0dXBfcmVzdWx0ICE9IEVDTURfUFJPQ0VTU0VEKSB7CisJCQkJc3RhY2s7CisJCQkJcmV0dXJuIHBwLnNldHVwX3Jlc3VsdDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghcHAuZm91bmRfcHYpCisJCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJCQlpZiAoIXBwLmluX3Byb2dyZXNzKQorCQkJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBjb21tYW5kIG1heSBzaXQgYW5kIHJlcG9ydCBwcm9ncmVzcyBmb3Igc29tZSB0aW1lLAorCQkgKiBhbmQgd2UgZG8gbm90IHdhbnQgb3IgbmVlZCB0aGUgbG9ja2QgbG9ja3MgaGVsZCBkdXJpbmcKKwkJICogdGhhdCB0aW1lLgorCQkgKi8KKwkJbG9ja2RfZ2woY21kLCAidW4iLCAwKTsKKwl9CisKKwlyZXR1cm4gcHZtb3ZlX3BvbGwoY21kLCBwdl9uYW1lLCBsdmlkID8gbHZpZC0+cyA6IE5VTEwsCisJCQkgICBwcC5pZF92Z19uYW1lLCBwcC5pZF9sdl9uYW1lLAorCQkJICAgYXJnX2lzX3NldChjbWQsIGJhY2tncm91bmRfQVJHKSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wdm1vdmVfcG9sbC5jIGIvdG9vbHMvcHZtb3ZlX3BvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRiZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcHZtb3ZlX3BvbGwuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCisjaW5jbHVkZSAicHZtb3ZlX3BvbGwuaCIKKworc3RhdGljIGludCBfaXNfcHZtb3ZlX2ltYWdlX3JlbW92YWJsZShzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKm1pbWFnZV9sdiwKKwkJCQkgICAgICB2b2lkICpiYXRvbikKK3sKKwl1aW50MzJfdCBtaW1hZ2VfdG9fcmVtb3ZlID0gKigodWludDMyX3QgKiliYXRvbik7CisJc3RydWN0IGx2X3NlZ21lbnQgKm1pcnJvcl9zZWc7CisKKwlpZiAoIShtaXJyb3Jfc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KG1pbWFnZV9sdikpKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgaXMgbm90IGEgcHJvcGVyIG1pcnJvciBpbWFnZSIsCisJCQkgIG1pbWFnZV9sdi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZWdfdHlwZShtaXJyb3Jfc2VnLCAwKSAhPSBBUkVBX0xWKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiJXMgaXMgbm90IGEgcHZtb3ZlIG1pcnJvciBvZiBMVi10eXBlIiwKKwkJCSAgbWlycm9yX3NlZy0+bHYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWltYWdlX3RvX3JlbW92ZSA+IG1pcnJvcl9zZWctPmFyZWFfY291bnQpIHsKKwkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJNaXJyb3IgaW1hZ2UgJSIgUFJJdTMyICIgbm90IGZvdW5kIGluIHNlZ21lbnQiLAorCQkJICBtaW1hZ2VfdG9fcmVtb3ZlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNlZ19sdihtaXJyb3Jfc2VnLCBtaW1hZ2VfdG9fcmVtb3ZlKSA9PSBtaW1hZ2VfbHYpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2RldGFjaF9wdm1vdmVfbWlycm9yKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIpCit7CisJdWludDMyX3QgbWltYWdlX3RvX3JlbW92ZSA9IDA7CisJc3RydWN0IGRtX2xpc3QgbHZzX2NvbXBsZXRlZDsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCisJLyogVXBkYXRlIG1ldGFkYXRhIHRvIHJlbW92ZSBtaXJyb3Igc2VnbWVudHMgYW5kIGJyZWFrIGRlcGVuZGVuY2llcyAqLworCWRtX2xpc3RfaW5pdCgmbHZzX2NvbXBsZXRlZCk7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFib3J0X0FSRykgJiYKKwkgICAgKHNlZ190eXBlKGZpcnN0X3NlZyhsdl9taXJyKSwgMCkgPT0gQVJFQV9MVikpCisJCW1pbWFnZV90b19yZW1vdmUgPSAxOyAvKiByZW1vdmUgdGhlIHNlY29uZCBtaXJyb3IgbGVnICovCisKKwlpZiAoIWx2X3JlbW92ZV9taXJyb3JzKGNtZCwgbHZfbWlyciwgMSwgMCwgX2lzX3B2bW92ZV9pbWFnZV9yZW1vdmFibGUsICZtaW1hZ2VfdG9fcmVtb3ZlLCBQVk1PVkUpIHx8CisJICAgICFyZW1vdmVfbGF5ZXJzX2Zvcl9zZWdtZW50c19hbGwoY21kLCBsdl9taXJyLCBQVk1PVkUsCisJCQkJCSAgICAmbHZzX2NvbXBsZXRlZCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJmx2c19jb21wbGV0ZWQpCisJCS8qIEZJWE1FIEFzc3VtZXMgb25seSBvbmUgcHZtb3ZlIGF0IGEgdGltZSEgKi8KKwkJbHZsLT5sdi0+c3RhdHVzICY9IH5MT0NLRUQ7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENhbGxlZCB0byBhZHZhbmNlIHRoZSBtaXJyb3IgdG8gc3VjY2Vzc2l2ZSBzZWN0aW9ucyBvZiBpdC4KKyAqIChOb3QgY2FsbGVkIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgdGhlIGxhc3Qgc2VjdGlvbiBjb21wbGV0ZXMuKQorICovCitpbnQgcHZtb3ZlX3VwZGF0ZV9tZXRhZGF0YShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIsCisJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqbHZzX2NoYW5nZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICB1bnNpZ25lZCBmbGFncyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlsb2dfdmVyYm9zZSgiVXBkYXRpbmcgdm9sdW1lIGdyb3VwIG1ldGFkYXRhLiIpOworCWlmICghdmdfd3JpdGUodmcpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFZvbHVtZSBncm91cCBtZXRhZGF0YSB1cGRhdGUgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN1c3BlbmRfbHYoY21kLCBsdl9taXJyKSkgeworCQl2Z19yZXZlcnQodmcpOworCQlsb2dfZXJyb3IoIkFCT1JUSU5HOiBUZW1wb3JhcnkgcHZtb3ZlIG1pcnJvciByZWxvYWQgZmFpbGVkLiIpOworCQlpZiAoIXJldmVydF9sdihjbWQsIGx2X21pcnIpKQorCQkJc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCS8qIENvbW1pdCBvbi1kaXNrIG1ldGFkYXRhICovCisJaWYgKCF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFZvbHVtZSBncm91cCBtZXRhZGF0YSB1cGRhdGUgZmFpbGVkLiIpOworCQlpZiAoIXJlc3VtZV9sdihjbWQsIGx2X21pcnIpKQorCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVhY3RpdmF0ZSBsb2dpY2FsIHZvbHVtZSBcIiVzXCIuIiwKKwkJCQkgIGx2X21pcnItPm5hbWUpOworCQlpZiAoIXJldmVydF9sdihjbWQsIGx2X21pcnIpKQorCQkJc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVzdW1lX2x2KGNtZCwgbHZfbWlycikpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gcmVhY3RpdmF0ZSBsb2dpY2FsIHZvbHVtZSBcIiVzXCIuIiwKKwkJCSAgbHZfbWlyci0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWJhY2t1cCh2Zyk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHB2bW92ZV9maW5pc2goc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlyciwgc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkKQoreworCWludCByID0gMTsKKworCWlmICghZG1fbGlzdF9lbXB0eShsdnNfY2hhbmdlZCkgJiYKKwkgICAgKCFfZGV0YWNoX3B2bW92ZV9taXJyb3IoY21kLCBsdl9taXJyKSB8fAorCSAgICAhcmVwbGFjZV9sdl93aXRoX2Vycm9yX3NlZ21lbnQobHZfbWlycikpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IFJlbW92YWwgb2YgdGVtcG9yYXJ5IG1pcnJvciBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU3RvcmUgbWV0YWRhdGEgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gbWlycm9yIHNlZ21lbnRzICovCisJaWYgKCF2Z193cml0ZSh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogRmFpbGVkIHRvIHdyaXRlIG5ldyBkYXRhIGxvY2F0aW9ucyAiCisJCQkgICJ0byBkaXNrLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdXNwZW5kIExWcyBjaGFuZ2VkIChpbXBsaWNpdGx5IHN1c3BlbmRzIGx2X21pcnIpICovCisJaWYgKCFzdXNwZW5kX2x2cyhjbWQsIGx2c19jaGFuZ2VkLCB2ZykpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogTG9ja2luZyBMVnMgdG8gcmVtb3ZlIHRlbXBvcmFyeSBtaXJyb3IgZmFpbGVkIik7CisJCWlmICghcmV2ZXJ0X2x2KGNtZCwgbHZfbWlycikpCisJCQlzdGFjazsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU3RvcmUgbWV0YWRhdGEgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gbWlycm9yIHNlZ21lbnRzICovCisJaWYgKCF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiQUJPUlRJTkc6IEZhaWxlZCB0byB3cml0ZSBuZXcgZGF0YSBsb2NhdGlvbnMgIgorCQkJICAidG8gZGlzay4iKTsKKwkJaWYgKCFyZXZlcnRfbHYoY21kLCBsdl9taXJyKSkKKwkJCXN0YWNrOworCQlpZiAoIXJldmVydF9sdnMoY21kLCBsdnNfY2hhbmdlZCkpCisJCQlzdGFjazsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVsZWFzZSBtaXJyb3IgTFYuICAoTm8gcGVuZGluZyBJL08gYmVjYXVzZSBpdCdzIGJlZW4gc3VzcGVuZGVkLikgKi8KKwlpZiAoIXJlc3VtZV9sdihjbWQsIGx2X21pcnIpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHJlYWN0aXZhdGUgbG9naWNhbCB2b2x1bWUgXCIlc1wiIiwKKwkJCSAgbHZfbWlyci0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCS8qIFVuc3VzcGVuZCBMVnMgKi8KKwlpZiAoIXJlc3VtZV9sdnMoY21kLCBsdnNfY2hhbmdlZCkpCisJCXN0YWNrOworCisJLyogRGVhY3RpdmF0ZSBtaXJyb3IgTFYgKi8KKwlpZiAoIWRlYWN0aXZhdGVfbHYoY21kLCBsdl9taXJyKSkgeworCQlsb2dfZXJyb3IoIkFCT1JUSU5HOiBVbmFibGUgdG8gZGVhY3RpdmF0ZSB0ZW1wb3JhcnkgbG9naWNhbCAiCisJCQkgICJ2b2x1bWUgXCIlc1wiIiwgbHZfbWlyci0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCWxvZ192ZXJib3NlKCJSZW1vdmluZyB0ZW1wb3JhcnkgcHZtb3ZlIExWIik7CisJaWYgKCFsdl9yZW1vdmUobHZfbWlycikpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogUmVtb3ZhbCBvZiB0ZW1wb3JhcnkgcHZtb3ZlIExWIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdG9yZSBpdCBvbiBkaXNrcyAqLworCWxvZ192ZXJib3NlKCJXcml0aW5nIG91dCBmaW5hbCB2b2x1bWUgZ3JvdXAgYWZ0ZXIgcHZtb3ZlIik7CisJaWYgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJBQk9SVElORzogRmFpbGVkIHRvIHdyaXRlIG5ldyBkYXRhIGxvY2F0aW9ucyAiCisJCQkgICJ0byBkaXNrLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGSVhNRSBiYWNrdXAgcG9zaXRpb25pbmcgKi8KKwliYWNrdXAodmcpOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wdm1vdmVfcG9sbC5oIGIvdG9vbHMvcHZtb3ZlX3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ4YWZmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcHZtb3ZlX3BvbGwuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX0xWTV9QVk1PVkVfSAorI2RlZmluZSBfTFZNX1BWTU9WRV9ICisKK3N0cnVjdCBjbWRfY29udGV4dDsKK3N0cnVjdCBkbV9saXN0Oworc3RydWN0IGxvZ2ljYWxfdm9sdW1lOworc3RydWN0IHZvbHVtZV9ncm91cDsKKworaW50IHB2bW92ZV91cGRhdGVfbWV0YWRhdGEoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdl9taXJyLAorCQkJICAgc3RydWN0IGRtX2xpc3QgKmx2c19jaGFuZ2VkLCB1bnNpZ25lZCBmbGFncyk7CisKK2ludCBwdm1vdmVfZmluaXNoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2X21pcnIsIHN0cnVjdCBkbV9saXN0ICpsdnNfY2hhbmdlZCk7CisKKyNlbmRpZiAgLyogX0xWTV9QVk1PVkVfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcHZyZW1vdmUuYyBiL3Rvb2xzL3B2cmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjN2I4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3B2cmVtb3ZlLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitpbnQgcHZyZW1vdmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZTsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zIHBwOworCWludCByZXQ7CisKKwlpZiAoIWFyZ2MpIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2UgZW50ZXIgYSBwaHlzaWNhbCB2b2x1bWUgcGF0aCIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJcHZjcmVhdGVfcGFyYW1zX3NldF9kZWZhdWx0cygmcHApOworCisJcHAuaXNfcmVtb3ZlID0gMTsKKwlwcC5mb3JjZSA9IGFyZ19jb3VudChjbWQsIGZvcmNlX0FSRyk7CisJcHAueWVzID0gYXJnX2NvdW50KGNtZCwgeWVzX0FSRyk7CisJcHAucHZfY291bnQgPSBhcmdjOworCXBwLnB2X25hbWVzID0gYXJndjsKKworCS8qCisJICogTmVlZGVkIHRvIGNoYW5nZSB0aGUgc2V0IG9mIG9ycGhhbiBQVnMuCisJICogKGRpc2FibGUgYWZ0ZXJ3YXJkIHRvIHByZXZlbnQgcHJvY2Vzc19lYWNoX3B2IGZyb20gZG9pbmcKKwkgKiBhIHNoYXJlZCBnbG9iYWwgbG9jayBzaW5jZSBpdCdzIGFscmVhZHkgYWNxdWlyZWQgaXQgZXguKQorCSAqLworCWlmICghbG9ja2RfZ2woY21kLCAiZXgiLCAwKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKgorCSAqIHB2cmVtb3ZlIHVzZXMgdGhlIHNhbWUgdG9vbGxpYiBmdW5jdGlvbiBhcyBwdmNyZWF0ZSwKKwkgKiBidXQgc2V0cyAiaXNfcmVtb3ZlIiB3aGljaCBjaGFuZ2VzIHRoZSBjaGVjayBmdW5jdGlvbiwKKwkgKiBhbmQgdGhlIGFjdHVhbCBjcmVhdGUgdnMgcmVtb3ZlIHN0ZXAuCisJICovCisKKwlpZiAoIXB2Y3JlYXRlX2VhY2hfZGV2aWNlKGNtZCwgaGFuZGxlLCAmcHApKQorCQlyZXQgPSBFQ01EX0ZBSUxFRDsKKwllbHNlIHsKKwkJLyogcHZjcmVhdGVfZWFjaF9kZXZpY2UgcmV0dXJucyB3aXRoIG9ycGhhbnMgbG9ja2VkICovCisJCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCQlyZXQgPSBFQ01EX1BST0NFU1NFRDsKKwl9CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcHZyZXNpemUuYyBiL3Rvb2xzL3B2cmVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmZjUyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3B2cmVzaXplLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgWmFrIEtpcGxpbmcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RydWN0IHB2cmVzaXplX3BhcmFtcyB7CisJdWludDY0X3QgbmV3X3NpemU7CisKKwl1bnNpZ25lZCBkb25lOworCXVuc2lnbmVkIHRvdGFsOworfTsKKworc3RhdGljIGludCBfcHZyZXNpemVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBwdnJlc2l6ZV9wYXJhbXMgKnBhcmFtcyA9IChzdHJ1Y3QgcHZyZXNpemVfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKworCWlmICghcGFyYW1zKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiSW52YWxpZCByZXNpemUgcGFyYW1zLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCXBhcmFtcy0+dG90YWwrKzsKKworCWlmICh2ZyAmJiB2Z19pc19leHBvcnRlZCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgJXMgaXMgZXhwb3J0ZWQiLCB2Zy0+bmFtZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKgorCSAqIE5lZWRlZCB0byBjaGFuZ2UgYSBwcm9wZXJ0eSBvbiBhbiBvcnBoYW4gUFYuCisJICogaS5lLiB0aGUgZ2xvYmFsIGxvY2sgaXMgb25seSBuZWVkZWQgZm9yIG9ycGhhbnMuCisJICogQ29udmVydCBzaCB0byBleC4KKwkgKi8KKwlpZiAoaXNfb3JwaGFuKHB2KSkgeworCQlpZiAoIWxvY2tkX2dsKGNtZCwgImV4IiwgMCkpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisJfQorCisJaWYgKCFwdl9yZXNpemVfc2luZ2xlKGNtZCwgdmcsIHB2LCBwYXJhbXMtPm5ld19zaXplKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJcGFyYW1zLT5kb25lKys7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCBwdnJlc2l6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBwdnJlc2l6ZV9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKCFhcmdjKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHN1cHBseSBwaHlzaWNhbCB2b2x1bWUocykiKTsKKwkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIHBoeXNpY2Fsdm9sdW1lc2l6ZV9BUkcsIFNJR05fTk9ORSkgPT0gU0lHTl9NSU5VUykgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSBzaXplIG1heSBub3QgYmUgbmVnYXRpdmUiKTsKKwkJcmV0ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCWdvdG8gb3V0OworCX0KKworCXBhcmFtcy5uZXdfc2l6ZSA9IGFyZ191aW50NjRfdmFsdWUoY21kLCBwaHlzaWNhbHZvbHVtZXNpemVfQVJHLAorCQkJCQkgICBVSU5UNjRfQygwKSk7CisKKwlwYXJhbXMuZG9uZSA9IDA7CisJcGFyYW1zLnRvdGFsID0gMDsKKworCXNldF9wdl9ub3RpZnkoY21kKTsKKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9ICZwYXJhbXM7CisKKwlyZXQgPSBwcm9jZXNzX2VhY2hfcHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCAwLCBSRUFEX0ZPUl9VUERBVEUgfCBSRUFEX0FMTE9XX0VYUE9SVEVELCBoYW5kbGUsIF9wdnJlc2l6ZV9zaW5nbGUpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVkIHBoeXNpY2FsIHZvbHVtZShzKSByZXNpemVkIC8gJWQgcGh5c2ljYWwgdm9sdW1lKHMpICIKKwkJCQkibm90IHJlc2l6ZWQiLCBwYXJhbXMuZG9uZSwgcGFyYW1zLnRvdGFsIC0gcGFyYW1zLmRvbmUpOworb3V0OgorCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wdnNjYW4uYyBiL3Rvb2xzL3B2c2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzY3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wdnNjYW4uYwpAQCAtMCwwICsxLDY2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCisjaW5jbHVkZSAibHZtZXRhZC5oIgorI2luY2x1ZGUgImx2bWNhY2hlLmgiCisKK3N0cnVjdCBwdnNjYW5fcGFyYW1zIHsKKwlpbnQgbmV3X3B2c19mb3VuZDsKKwlpbnQgcHZzX2ZvdW5kOworCXVpbnQ2NF90IHNpemVfdG90YWw7CisJdWludDY0X3Qgc2l6ZV9uZXc7CisJdW5zaWduZWQgcHZfbWF4X25hbWVfbGVuOworCXVuc2lnbmVkIHZnX21heF9uYW1lX2xlbjsKKwl1bnNpZ25lZCBwdl90bXBfbmFtZWxlbjsKKwljaGFyICpwdl90bXBfbmFtZTsKK307CisKK3N0cnVjdCBwdnNjYW5fYWFfcGFyYW1zIHsKKwlpbnQgcmVmcmVzaF9hbGw7CisJdW5zaWduZWQgaW50IGFjdGl2YXRlX2Vycm9yczsKKwlzdHJ1Y3QgZG1fbGlzdCBjaGFuZ2VkX3ZnbmFtZXM7Cit9OworCitzdGF0aWMgaW50IF9wdnNjYW5fZGlzcGxheV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkgIHN0cnVjdCBwdnNjYW5fcGFyYW1zICpwYXJhbXMpCit7CisJLyogWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFggKi8KKwljaGFyIHV1aWRbNDBdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwljb25zdCB1bnNpZ25lZCBzdWZmaXhfbGVuID0gc2l6ZW9mKHV1aWQpICsgMTA7CisJdW5zaWduZWQgcHZfbGVuOworCWNvbnN0IGNoYXIgKnB2ZGV2bmFtZSA9IHB2X2Rldl9uYW1lKHB2KTsKKworCS8qIHNob3J0IGxpc3Rpbmc/ICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBzaG9ydF9BUkcpKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCIlcyIsIHB2ZGV2bmFtZSk7CisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwl9CisKKwlpZiAoIXBhcmFtcy0+cHZfbWF4X25hbWVfbGVuKSB7CisJCWx2bWNhY2hlX2dldF9tYXhfbmFtZV9sZW5ndGhzKGNtZCwgJnBhcmFtcy0+cHZfbWF4X25hbWVfbGVuLCAmcGFyYW1zLT52Z19tYXhfbmFtZV9sZW4pOworCisJCXBhcmFtcy0+cHZfbWF4X25hbWVfbGVuICs9IDI7CisJCXBhcmFtcy0+dmdfbWF4X25hbWVfbGVuICs9IDI7CisJCXBhcmFtcy0+cHZfdG1wX25hbWVsZW4gPSBwYXJhbXMtPnB2X21heF9uYW1lX2xlbiArIHN1ZmZpeF9sZW47CisKKwkJaWYgKCEocGFyYW1zLT5wdl90bXBfbmFtZSA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHBhcmFtcy0+cHZfdG1wX25hbWVsZW4pKSkKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlwdl9sZW4gPSBwYXJhbXMtPnB2X21heF9uYW1lX2xlbjsKKwltZW1zZXQocGFyYW1zLT5wdl90bXBfbmFtZSwgMCwgcGFyYW1zLT5wdl90bXBfbmFtZWxlbik7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHV1aWRfQVJHKSkgeworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcHYtPmlkLCB1dWlkLCBzaXplb2YodXVpZCkpKSB7CisJCQlzdGFjazsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCisJCWlmIChkbV9zbnByaW50ZihwYXJhbXMtPnB2X3RtcF9uYW1lLCBwYXJhbXMtPnB2X3RtcF9uYW1lbGVuLCAiJS0qcyB3aXRoIFVVSUQgJXMiLAorCQkJCXBhcmFtcy0+cHZfbWF4X25hbWVfbGVuIC0gMiwgcHZkZXZuYW1lLCB1dWlkKSA8IDApIHsKKwkJCWxvZ19lcnJvcigiSW52YWxpZCBQViBuYW1lIHdpdGggdXVpZC4iKTsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCQlwdmRldm5hbWUgPSBwYXJhbXMtPnB2X3RtcF9uYW1lOworCQlwdl9sZW4gKz0gc3VmZml4X2xlbjsKKwl9CisKKwlpZiAoaXNfb3JwaGFuKHB2KSkKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlBWICUtKnMgICAgJS0qcyAlcyBbJXNdIiwKKwkJCQkJcHZfbGVuLCBwdmRldm5hbWUsCisJCQkJCXBhcmFtcy0+dmdfbWF4X25hbWVfbGVuLCAiICIsCisJCQkJCXB2LT5mbXQgPyBwdi0+Zm10LT5uYW1lIDogIiAgICAiLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCBwdl9zaXplKHB2KSkpOworCWVsc2UgaWYgKHB2X3N0YXR1cyhwdikgJiBFWFBPUlRFRF9WRykKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlBWICUtKnMgIGlzIGluIGV4cG9ydGVkIFZHICVzIFslcyAvICVzIGZyZWVdIiwKKwkJCQkJcHZfbGVuLCBwdmRldm5hbWUsIHB2X3ZnX25hbWUocHYpLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIHB2X3BlX2NvdW50KHB2KSAqIHB2X3BlX3NpemUocHYpKSwKKwkJCQkJZGlzcGxheV9zaXplKGNtZCwgKHVpbnQ2NF90KSAocHZfcGVfY291bnQocHYpIC0gcHZfcGVfYWxsb2NfY291bnQocHYpKSAqIHB2X3BlX3NpemUocHYpKSk7CisJZWxzZQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUFYgJS0qcyBWRyAlLSpzICVzIFslcyAvICVzIGZyZWVdIiwKKwkJCQkJcHZfbGVuLCBwdmRldm5hbWUsCisJCQkJCXBhcmFtcy0+dmdfbWF4X25hbWVfbGVuLCBwdl92Z19uYW1lKHB2KSwKKwkJCQkJcHYtPmZtdCA/IHB2LT5mbXQtPm5hbWUgOiAiICAgICIsCisJCQkJCWRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgcHZfcGVfY291bnQocHYpICogcHZfcGVfc2l6ZShwdikpLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIChwdl9wZV9jb3VudChwdikgLSBwdl9wZV9hbGxvY19jb3VudChwdikpICogcHZfcGVfc2l6ZShwdikpKTsKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX3B2c2Nhbl9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHB2c2Nhbl9wYXJhbXMgKnBhcmFtcyA9IChzdHJ1Y3QgcHZzY2FuX3BhcmFtcyAqKWhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKworCWlmICgoYXJnX2lzX3NldChjbWQsIGV4cG9ydGVkX0FSRykgJiYgIShwdl9zdGF0dXMocHYpICYgRVhQT1JURURfVkcpKSB8fAorCSAgICAoYXJnX2lzX3NldChjbWQsIG5vdm9sdW1lZ3JvdXBfQVJHKSAmJiAoIWlzX29ycGhhbihwdikpKSkgeworCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwl9CisKKwlwYXJhbXMtPnB2c19mb3VuZCsrOworCisJaWYgKGlzX29ycGhhbihwdikpIHsKKwkJcGFyYW1zLT5uZXdfcHZzX2ZvdW5kKys7CisJCXBhcmFtcy0+c2l6ZV9uZXcgKz0gcHZfc2l6ZShwdik7CisJCXBhcmFtcy0+c2l6ZV90b3RhbCArPSBwdl9zaXplKHB2KTsKKwl9IGVsc2UgeworCQlwYXJhbXMtPnNpemVfdG90YWwgKz0gKHVpbnQ2NF90KSBwdl9wZV9jb3VudChwdikgKiBwdl9wZV9zaXplKHB2KTsKKwl9CisKKwlfcHZzY2FuX2Rpc3BsYXlfc2luZ2xlKGNtZCwgcHYsIHBhcmFtcyk7CisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitzdGF0aWMgaW50IF9sdm1ldGFkX2NsZWFyX2RldihkZXZfdCBkZXZubywgaW50MzJfdCBtYWpvciwgaW50MzJfdCBtaW5vcikKK3sKKwljaGFyIGJ1ZlsyNF07CisKKwkodm9pZCkgZG1fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgRk1UaTMyICI6IiBGTVRpMzIsIG1ham9yLCBtaW5vcik7CisKKwlpZiAoIWx2bWV0YWRfcHZfZ29uZShkZXZubywgYnVmKSkKKwkJcmV0dXJuXzA7CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiRGV2aWNlICVzIG5vdCBmb3VuZC4gQ2xlYXJlZCBmcm9tIGx2bWV0YWQgY2FjaGUuIiwgYnVmKTsKKworCXJldHVybiAxOworfQorCisvKgorICogcHZzY2FuIC0tY2FjaGUgZG9lcyBub3QgcGVyZm9ybSBhbnkgbHZtbG9ja2QgbG9ja2luZywgYW5kCisgKiBwdnNjYW4gLS1jYWNoZSAtYWF5IHNraXBzIGF1dG9hY3RpdmF0aW9uIGluIGxvY2tkIFZHcy4KKyAqCisgKiBwdnNjYW4gLS1jYWNoZSBwb3B1bGF0ZXMgbHZtZXRhZCB3aXRoIFZHIG1ldGFkYXRhIGZyb20gZGlzay4KKyAqIE5vIGx2bWxvY2tkIGxvY2tpbmcgaXMgbmVlZGVkLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBsb2NrZCBWRworICogbWV0YWRhdGEgdGhhdCBpcyByZWFkIGJ5IHB2c2NhbiBhbmQgcG9wdWxhdGVkIGluIGx2bWV0YWQgbWF5CisgKiBiZSBpbW1lZGlhdGVseSBzdGFsZSBkdWUgdG8gY2hhbmdlcyB0byB0aGUgVkcgZnJvbSBvdGhlciBob3N0cworICogZHVyaW5nIG9yIGFmdGVyIHRoaXMgcHZzY2FuLiAgVGhpcyBpcyBub3JtYWwgYW5kIG5vdCBhIHByb2JsZW0uCisgKiBXaGVuIGEgc3Vic2VxdWVudCBsdm0gY29tbWFuZCB1c2VzIHRoZSBWRywgaXQgd2lsbCBsb2NrIHRoZSBWRworICogd2l0aCBsdm1sb2NrZCwgcmVhZCB0aGUgVkcgZnJvbSBsdm1ldGFkLCBhbmQgdXBkYXRlIHRoZSBjYWNoZWQKKyAqIGNvcHkgZnJvbSBkaXNrIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBwdnNjYW4gLS1jYWNoZSAtYWF5IGRvZXMgbm90IGFjdGl2YXRlIExWcyBpbiBsb2NrZCBWR3MgYmVjYXVzZQorICogYWN0aXZhdGlvbiByZXF1aXJlcyBsb2NraW5nLCBhbmQgYSBsb2NrLXN0YXJ0IG9wZXJhdGlvbiBpcyBuZWVkZWQKKyAqIG9uIGEgbG9ja2QgVkcgYmVmb3JlIGFueSBsb2NraW5nIGNhbiBiZSBwZXJmb3JtZWQgaW4gaXQuCisgKgorICogQW4gZXF1aXZhbGVudCBvZiBwdnNjYW4gLS1jYWNoZSAtYWF5IGZvciBsb2NrZCBWR3MgaXM6CisgKiAxLiBwdnNjYW4gLS1jYWNoZQorICogMi4gdmdjaGFuZ2UgLS1sb2NrLXN0YXJ0CisgKiAzLiB2Z2NoYW5nZSAtYWF5IC1TICdsb2NrdHlwZT1zYW5sb2NrIHx8IGxvY2t0eXBlPWRsbScKKyAqCisgKiBbV2UgY291bGQgZXZlbnR1YWxseSBhZGQgc3VwcG9ydCBmb3IgYXV0b2FjdGl2YXRpbmcgbG9ja2QgVkdzCisgKiB1c2luZyBwdnNjYW4gYnkgaW5jb3Jwb3JhdGluZyB0aGUgbG9jayBzdGFydCBzdGVwICh3aGljaCBjYW4KKyAqIHRha2UgYSBsb25nIHRpbWUpLCBidXQgdGhlcmUgbWF5IGJlIGEgYmV0dGVyIG9wdGlvbiB0aGFuCisgKiBjb250aW51aW5nIHRvIG92ZXJsb2FkIHB2c2Nhbi5dCisgKiAKKyAqIFN0YWdlcyBvZiBzdGFydGluZyBhIGxvY2tkIFZHOgorICoKKyAqIC4gcHZzY2FuIC0tY2FjaGUgcG9wdWxhdGVzIGxvY2tkIFZHcyBpbiBsdm1ldGFkIHdpdGhvdXQgbG9ja3MsCisgKiAgIGFuZCB0aGlzIGluaXRpYWwgY2FjaGVkIGNvcHkgbWF5IHF1aWNrbHkgYmVjb21lIHN0YWxlLgorICoKKyAqIC4gdmdjaGFuZ2UgLS1sb2NrLXN0YXJ0IFZHIHJlYWRzIHRoZSBWRyB3aXRob3V0IHRoZSBWRyBsb2NrCisgKiAgIGJlY2F1c2Ugbm8gbG9ja3MgYXJlIGF2YWlsYWJsZSB1bnRpbCB0aGUgbG9ja2luZyBpcyBzdGFydGVkLgorICogICBJdCBvbmx5IHVzZXMgdGhlIFZHIG5hbWUgYW5kIGxvY2tfdHlwZSBmcm9tIHRoZSBWRyBtZXRhZGF0YSwKKyAqICAgYW5kIHRoZW4gb25seSB1c2VzIGl0IHRvIHN0YXJ0IHRoZSBWRyBsb2Nrc3BhY2UgaW4gbHZtbG9ja2QuCisgKgorICogLiBGdXJ0aGVyIGx2bSBjb21tYW5kcywgZS5nLiBhY3RpdmF0aW9uLCBjYW4gdGhlbiBsb2NrIHRoZSBWRworICogICB3aXRoIGx2bWxvY2tkIGFuZCB1c2UgY3VycmVudCBWRyBtZXRkYXRhLgorICovCisKKyNkZWZpbmUgUkVGUkVTSF9CRUZPUkVfQVVUT0FDVElWQVRJT05fUkVUUklFUyA1CisjZGVmaW5lIFJFRlJFU0hfQkVGT1JFX0FVVE9BQ1RJVkFUSU9OX1JFVFJZX1VTTEVFUF9ERUxBWSAxMDAwMDAKKworc3RhdGljIGludCBfcHZzY2FuX2F1dG9hY3RpdmF0ZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcHZzY2FuX2FhX3BhcmFtcyAqcHAgPSAoc3RydWN0IHB2c2Nhbl9hYV9wYXJhbXMgKiloYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJdW5zaWduZWQgaW50IHJlZnJlc2hfcmV0cmllcyA9IFJFRlJFU0hfQkVGT1JFX0FVVE9BQ1RJVkFUSU9OX1JFVFJJRVM7CisJaW50IHJlZnJlc2hfZG9uZSA9IDA7CisKKwlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpCisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKworCWxvZ19kZWJ1ZygicHZzY2FuIGF1dG9hY3RpdmF0aW5nIFZHICVzLiIsIHZnX25hbWUpOworCisJLyoKKwkgKiBSZWZyZXNoIExWcyBpbiBhIFZHIHRoYXQgaGFzICJjaGFuZ2VkIiBmcm9tIGZpbmRpbmcgYSBQVi4KKwkgKiBUaGUgbWVhbmluZyBvZiAiY2hhbmdlZCIgaXMgZGV0ZXJtaW5lZCBpbiBsdm1ldGFkLCBhbmQgaXMKKwkgKiByZXR1cm5lZCB0byB0aGUgY29tbWFuZCBhcyBhIGZsYWcuCisJICoKKwkgKiBGSVhNRTogVGhlcmUncyBhIHRpbnkgcmFjZSB3aGVuIHN1c3BlbmRpbmcgdGhlIGRldmljZSB3aGljaCBpcyBwYXJ0CisJICogb2YgdGhlIHJlZnJlc2ggYmVjYXVzZSB3aGVuIHN1c3BlbmQgaW9jdGwgaXMgcGVyZm9ybWVkLCB0aGUgZG0KKwkgKiBrZXJuZWwgZHJpdmVyIGV4ZWN1dGVzIChkb19zdXNwZW5kIGFuZCBkbV9zdXNwZW5kIGtlcm5lbCBmbik6CisJICoKKwkgKiAgICAgICAgICBzdGVwIDE6IGEgY2hlY2sgd2hldGhlciB0aGUgZGV2IGlzIGFscmVhZHkgc3VzcGVuZGVkIGFuZAorCSAqICAgICAgICAgICAgICAgICAgaWYgeWVzIGl0IHJldHVybnMgc3VjY2VzcyBpbW1lZGlhdGVseSBhcyB0aGVyZSdzCisJICogICAgICAgICAgICAgICAgICBub3RoaW5nIHRvIGRvCisJICogICAgICAgICAgc3RlcCAyOiBpdCBncmFicyB0aGUgc3VzcGVuZCBsb2NrCisJICogICAgICAgICAgc3RlcCAzOiBhbm90aGVyIGNoZWNrIHdoZXRoZXIgdGhlIGRldiBpcyBhbHJlYWR5IHN1c3BlbmRlZAorCSAqICAgICAgICAgICAgICAgICAgYW5kIGlmIGZvdW5kIHN1c3BlbmRlZCwgaXQgZXhpdHMgd2l0aCAtRUlOVkFMIG5vdworCSAqCisJICogVGhlIHJhY2UgY2FuIG9jY3VyIGluIGJldHdlZW4gc3RlcCAxIGFuZCBzdGVwIDIuIFRvIHByZXZlbnQgcHJlbWF0dXJlCisJICogYXV0b2FjdGl2YXRpb24gZmFpbHVyZSwgd2UncmUgdXNpbmcgYSBzaW1wbGUgcmV0cnkgbG9naWMgaGVyZSBiZWZvcmUKKwkgKiB3ZSBmYWlsIGNvbXBsZXRlbHkuIEZvciBhIGNvbXBsZXRlIHNvbHV0aW9uLCB3ZSBuZWVkIHRvIGZpeCB0aGUKKwkgKiBsb2NraW5nIHNvIHRoZXJlJ3Mgbm8gcG9zc2liaWxpdHkgZm9yIHN1c3BlbmQgY2FsbHMgdG8gaW50ZXJsZWF2ZQorCSAqIGVhY2ggb3RoZXIgdG8gY2F1c2UgdGhpcyBraW5kIG9mIHJhY2UuCisJICoKKwkgKiBSZW1vdmUgdGhpcyB3b3JrYXJvdW5kIHdpdGggInJlZnJlc2hfcmV0cmllcyIgb25jZSB3ZSBoYXZlIHByb3BlciBsb2NraW5nIGluIQorCSAqLworCWlmIChwcC0+cmVmcmVzaF9hbGwgfHwgc3RyX2xpc3RfbWF0Y2hfaXRlbSgmcHAtPmNoYW5nZWRfdmduYW1lcywgdmdfbmFtZSkpIHsKKwkJd2hpbGUgKHJlZnJlc2hfcmV0cmllcy0tKSB7CisJCQlsb2dfZGVidWdfYWN0aXZhdGlvbigiUmVmcmVzaGluZyBWRyAlcyBiZWZvcmUgYXV0b2FjdGl2YXRpb24uIiwgdmdfbmFtZSk7CisJCQlpZiAodmdfcmVmcmVzaF92aXNpYmxlKGNtZCwgdmcpKSB7CisJCQkJcmVmcmVzaF9kb25lID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVzbGVlcChSRUZSRVNIX0JFRk9SRV9BVVRPQUNUSVZBVElPTl9SRVRSWV9VU0xFRVBfREVMQVkpOworCQl9CisKKwkJaWYgKCFyZWZyZXNoX2RvbmUpCisJCQlsb2dfd2FybigiJXM6IHJlZnJlc2ggYmVmb3JlIGF1dG9hY3RpdmF0aW9uIGZhaWxlZC4iLCB2Zy0+bmFtZSk7CisJfQorCisJbG9nX2RlYnVnX2FjdGl2YXRpb24oIkF1dG9hY3RpdmF0aW5nIFZHICVzLiIsIHZnX25hbWUpOworCisJaWYgKCF2Z2NoYW5nZV9hY3RpdmF0ZShjbWQsIHZnLCBDSEFOR0VfQUFZKSkgeworCQlsb2dfZXJyb3IoIiVzOiBhdXRvYWN0aXZhdGlvbiBmYWlsZWQuIiwgdmctPm5hbWUpOworCQlwcC0+YWN0aXZhdGVfZXJyb3JzKys7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQWZ0ZXIgc3VjZXNzZnVsbCBhY3RpdmF0aW9uIHdlIG5lZWQgdG8gaW5pdGlhbGlzZSBwb2xsaW5nCisJICogZm9yIGFsbCBhY3RpdmF0ZWQgTFZzIGluIGEgVkcuIFBvc3NpYmxlIGVuaGFuY2VtZW50IHdvdWxkCisJICogYmUgYWRkaW5nIC0tcG9sbCB5fG4gY21kbGluZSBvcHRpb24gZm9yIHB2c2NhbiBhbmQgY2FsbAorCSAqIGluaXRfYmFja2dyb3VuZF9wb2xsaW5nIHJvdXRpbmUgaW4gYXV0b2FjdGl2YXRpb24gaGFuZGxlci4KKwkgKi8KKwlsb2dfZGVidWdfYWN0aXZhdGlvbigiU3RhcnRpbmcgYmFja2dyb3VuZCBwb2xsaW5nIGZvciBWRyAlcy4iLCB2Z19uYW1lKTsKKworCWlmICghKHZnY2hhbmdlX2JhY2tncm91bmRfcG9sbGluZyhjbWQsIHZnKSkpCisJCWdvdG9fb3V0Oworb3V0OgorCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworc3RhdGljIGludCBfcHZzY2FuX2F1dG9hY3RpdmF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHB2c2Nhbl9hYV9wYXJhbXMgKnBwLAorCQkJCWludCBhbGxfdmdzLCBzdHJ1Y3QgZG1fbGlzdCAqdmduYW1lcykKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmICghYWxsX3ZncyAmJiBkbV9saXN0X2VtcHR5KHZnbmFtZXMpKSB7CisJCWxvZ19kZWJ1ZygiTm8gVkdzIHRvIGF1dG9hY3RpdmF0ZS4iKTsKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCX0KKworCWlmICghbHZtZXRhZF91c2VkKCkpCisJCWxvZ193YXJuKCJXQVJOSU5HOiBBdXRvYWN0aXZhdGlvbiByZWFkaW5nIGZyb20gZGlzayBpbnN0ZWFkIG9mIGx2bWV0YWQuIik7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSBwcDsKKworCWlmIChhbGxfdmdzKSB7CisJCWNtZC0+Y29tbWFuZC0+ZmxhZ3MgfD0gQUxMX1ZHU19JU19ERUZBVUxUOworCQlwcC0+cmVmcmVzaF9hbGwgPSAxOworCX0KKworCWRldl9jYWNoZV9mdWxsX3NjYW4oY21kLT5mdWxsX2ZpbHRlcik7CisKKwlyZXQgPSBwcm9jZXNzX2VhY2hfdmcoY21kLCAwLCBOVUxMLCBOVUxMLCB2Z25hbWVzLCAwLCAwLCBoYW5kbGUsIF9wdnNjYW5fYXV0b2FjdGl2YXRlX3NpbmdsZSk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3B2c2Nhbl9jYWNoZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBwdnNjYW5fYWFfcGFyYW1zIHBwID0geyAwIH07CisJc3RydWN0IGRtX2xpc3QgZm91bmRfdmduYW1lczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqcHZfbmFtZTsKKwljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworCWludDMyX3QgbWFqb3IgPSAtMTsKKwlpbnQzMl90IG1pbm9yID0gLTE7CisJaW50IGRldm5vX2FyZ3MgPSAwOworCXN0cnVjdCBhcmdfdmFsdWVfZ3JvdXBfbGlzdCAqY3VycmVudF9ncm91cDsKKwlkZXZfdCBkZXZubzsKKwlpbnQgZG9fYWN0aXZhdGU7CisJaW50IGFsbF92Z3MgPSAwOworCWludCByZW1vdmVfZXJyb3JzID0gMDsKKwlpbnQgYWRkX2Vycm9ycyA9IDA7CisJaW50IHJldCA9IEVDTURfUFJPQ0VTU0VEOworCisJZG1fbGlzdF9pbml0KCZmb3VuZF92Z25hbWVzKTsKKwlkbV9saXN0X2luaXQoJnBwLmNoYW5nZWRfdmduYW1lcyk7CisKKwlkb19hY3RpdmF0ZSA9IGFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpOworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSAmJiAhZG9fYWN0aXZhdGUpIHsKKwkJbG9nX3ZlcmJvc2UoIklnbm9yaW5nIHB2c2NhbiAtLWNhY2hlIGJlY2F1c2UgbHZtZXRhZCBpcyBub3QgaW4gdXNlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkb19hY3RpdmF0ZSAmJiAoYXJnX3VpbnRfdmFsdWUoY21kLCBhY3RpdmF0ZV9BUkcsIENIQU5HRV9BQVkpICE9IENIQU5HRV9BQVkpKSB7CisJCWxvZ19lcnJvcigiT25seSAtLWFjdGl2YXRlIGF5IGFsbG93ZWQgd2l0aCBwdnNjYW4uIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHZtZXRhZF91c2VkKCkgJiYgZG9fYWN0aXZhdGUgJiYgIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtZXRhZF9DRkcsIE5VTEwpKSB7CisJCWxvZ192ZXJib3NlKCJJZ25vcmluZyBwdnNjYW4gLS1jYWNoZSAtYWF5IGJlY2F1c2UgbHZtZXRhZCBpcyBub3QgaW4gdXNlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWFqb3JfQVJHKSArIGFyZ19pc19zZXQoY21kLCBtaW5vcl9BUkcpKQorCQlkZXZub19hcmdzID0gMTsKKworCWlmIChkZXZub19hcmdzICYmICghYXJnX2lzX3NldChjbWQsIG1ham9yX0FSRykgfHwgIWFyZ19pc19zZXQoY21kLCBtaW5vcl9BUkcpKSkgeworCQlsb2dfZXJyb3IoIkJvdGggLS1tYWpvciBhbmQgLS1taW5vciByZXF1aXJlZCB0byBpZGVudGlmeSBkZXZpY2VzLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCQorCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19SRUFELCBOVUxMKSkgeworCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBvYnRhaW4gZ2xvYmFsIGxvY2suIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKgorCSAqIFRoaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdXNlX2x2bWV0YWQ9MSBpbiBsdm0uY29uZiBidXQgcHZzY2FuCisJICogY2Fubm90IHVzZSBsdm1ldGFkIGZvciBzb21lIHJlYXNvbi4gIEluIHRoaXMgY2FzZSBwdnNjYW4gc2hvdWxkCisJICogc3RpbGwgYWN0aXZhdGUgTFZzIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHVwZGF0aW5nIHRoZSBjYWNoZS4KKwkgKi8KKwlpZiAoZG9fYWN0aXZhdGUgJiYgIWx2bWV0YWRfdXNlZCgpKSB7CisJCWxvZ192ZXJib3NlKCJBY3RpdmF0aW5nIGFsbCBWR3Mgd2l0aG91dCBsdm1ldGFkLiIpOworCQlhbGxfdmdzID0gMTsKKwkJZGV2bm9fYXJncyA9IDA7CisJCWdvdG8gYWN0aXZhdGU7CisJfQorCisJLyoKKwkgKiBTY2FuIGFsbCBkZXZpY2VzIHdoZW4gbm8gYXJncyBhcmUgZ2l2ZW4uCisJICovCisJaWYgKCFhcmdjICYmICFkZXZub19hcmdzKSB7CisJCWxvZ192ZXJib3NlKCJTY2FubmluZyBhbGwgZGV2aWNlcy4iKTsKKworCQlpZiAoIWx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKGNtZCwgMSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNhY2hlIHVwZGF0ZSBmYWlsZWQuIik7CisJCQlsdm1ldGFkX21ha2VfdW51c2VkKGNtZCk7CisJCX0KKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmIGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgJXMuIiwgcmVhc29uKTsKKwkJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJfQorCQlhbGxfdmdzID0gMTsKKwkJZ290byBhY3RpdmF0ZTsKKwl9CisgICAgICAgCisJLyoKKwkgKiBGSVhNRTogd2hlbiBzcGVjaWZpYyBkZXZzIGFyZSBuYW1lZCwgd2UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdG8gc2NhbgorCSAqIGFueSBvdGhlciBkZXZzLCBidXQgaWYgbHZtZXRhZCBpcyBub3QgeWV0IHBvcHVsYXRlZCwgdGhlIGZpcnN0CisJICogJ3B2c2NhbiAtLWNhY2hlIGRldicgZG9lcyBuZWVkIHRvIGRvIGEgZnVsbCBzY2FuLiAgV2Ugd2FudCB0byByZW1vdmUKKwkgKiB0aGUgbmVlZCBmb3IgdGhpcyBjYXNlIHNvIHRoYXQgJ3B2c2NhbiAtLWNhY2hlIGRldicgaXMgZ3VhcmFudGVlZCB0bworCSAqIG5ldmVyIHNjYW4gYW55IGRldmljZXMgb3RoZXIgdGhhbiB0aG9zZSBzcGVjaWZpZWQuCisJICovCisJaWYgKCFsdm1ldGFkX3Rva2VuX21hdGNoZXMoY21kKSkgeworCQlsb2dfdmVyYm9zZSgiU2Nhbm5pbmcgYWxsIGRldmljZXMgdG8gaW5pdGlhbGl6ZSBsdm1ldGFkLiIpOworCisJCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAhbHZtZXRhZF9wdnNjYW5fYWxsX2RldnMoY21kLCAwKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgY2FjaGUgdXBkYXRlIGZhaWxlZC4iKTsKKwkJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJfQorCQlpZiAobHZtZXRhZF91c2VkKCkgJiYgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSAlcy4iLCByZWFzb24pOworCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQl9CisJCWFsbF92Z3MgPSAxOworCQlnb3RvIGFjdGl2YXRlOworCX0KKworCS8qCisJICogV2hlbiBhcmdzIGFyZSBnaXZlbiwgc2NhbiBvbmx5IHRob3NlIGRldmljZXMuICBJZiBsdm1ldGFkIGlzIGFscmVhZHkKKwkgKiBkaXNhYmxlZCwgYSBmdWxsIHNjYW4gaXMgcmVxdWlyZWQgdG8gcmVlbmFibGUgaXQsIHNvIHRoZXJlJ3Mgbm8KKwkgKiBwb2ludCBpbiBkb2luZyBpbmRpdmlkdWFsIGRldmljZSBzY2Fucywgc28gZ28gZGlyZWN0bHkgdG8KKwkgKiBhdXRvYWN0aXZhdGlvbi4gIChGSVhNRTogU2hvdWxkIHdlIGFsc28gc2tpcCBhdXRvYWN0aXZhdGlvbiBpbiB0aGlzCisJICogY2FzZSBzaW5jZSB0aGF0IHdpbGwgcmVhZCBkaXNrcyB3aXRoIGx2bWV0YWQgZGlzYWJsZWQ/CisJICogaS5lLiBhdm9pZCBkaXNrIGFjY2VzcyBhbmQgbm90IGFjdGl2YXRlIExWcywgb3Igb3IgcmVhZCBmcm9tIGRpc2sKKwkgKiBhbmQgYWN0aXZhdGUgTFZzPykKKwkgKi8KKwlpZiAobHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlICVzLiIsIHJlYXNvbik7CisJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJYWxsX3ZncyA9IDE7CisJCWdvdG8gYWN0aXZhdGU7CisJfQorCisJLyoKKwkgKiBTdGVwIDE6IGZvciBlYWNoIGRldmljZSwgaWYgaXQncyBubyBsb25nZXIgZm91bmQsIHRoZW4gdGVsbCBsdm1ldGFkCisJICogdG8gZHJvcCBpdC4gIElmIHRoZSBkZXZpY2UgZXhpc3RzLCByZWFkIG1ldGFkYXRhIGZyb20gaXQgYW5kIHNlbmQKKwkgKiB0aGF0IHRvIGx2bWV0YWQuCisJICoKKwkgKiBXaGVuIGdpdmVuIGEgZGV2aWNlIG5hbWUsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgbm90IHZpc2libGUgdG8KKwkgKiBsdm1ldGFkLCBidXQgc3RpbGwgdmlzaWJsZSB0byB0aGUgc3lzdGVtLCBhbmQgaWYgc28sIHRlbGwgbHZtZXRhZCB0bworCSAqIGRyb3AgaXQgKHVzaW5nIHRoZSBtYWpvcjptaW5vciBmcm9tIHRoZSBzeXN0ZW0pLgorCSAqCisJICogV2hlbiBnaXZlbiBhIG1ham9yOm1pbm9yIHdoaWNoIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBzeXN0ZW0sIGp1c3QKKwkgKiB0ZWxsIGx2bWV0YWQgdG8gZHJvcCBpdCBkaXJlY3RseSB1c2luZyB0aGF0IG1ham9yOm1pbm9yLgorCSAqCisJICogV2hlbiBhIGRldmljZSBoYXMgbGVmdCB0aGUgc3lzdGVtLCBpdCBtdXN0IGJlIGRyb3BwZWQgdXNpbmcKKwkgKiAtLW1ham9yLy0tbWlub3IgYmVjYXVzZSB3ZSBjYW5ub3QgbWFwIHRoZSBkZXZpY2UgbmFtZSB0byBtYWpvcjptaW5vcgorCSAqICBhZnRlciB0aGUgZGV2aWNlIGhhcyBsZWZ0LiAgKEEgZnVsbCByZXNjYW4gY291bGQgb2YgY291cnNlIGJlIHVzZWQKKwkgKiAgdG8gZHJvcCBhbnkgZGV2aWNlcyB0aGF0IGhhdmUgbGVmdC4pCisJICovCisKKwlpZiAoYXJnYyB8fCBkZXZub19hcmdzKQorCQlsb2dfdmVyYm9zZSgiU2Nhbm5pbmcgZGV2aWNlcyBvbiBjb21tYW5kIGxpbmUuIik7CisKKwl3aGlsZSAoYXJnYy0tKSB7CisJCXB2X25hbWUgPSAqYXJndisrOworCQlpZiAocHZfbmFtZVswXSA9PSAnLycpIHsKKwkJCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXQocHZfbmFtZSwgY21kLT5sdm1ldGFkX2ZpbHRlcikpKSB7CisJCQkJLyogUmVtb3ZlIGRldmljZSBwYXRoIGZyb20gbHZtZXRhZC4gKi8KKwkJCQlsb2dfZGVidWcoIlJlbW92aW5nIGRldiAlcyBmcm9tIGx2bWV0YWQgY2FjaGUuIiwgcHZfbmFtZSk7CisJCQkJaWYgKChkZXYgPSBkZXZfY2FjaGVfZ2V0KHB2X25hbWUsIE5VTEwpKSkgeworCQkJCQlpZiAoIV9sdm1ldGFkX2NsZWFyX2RldihkZXYtPmRldiwgTUFKT1IoZGV2LT5kZXYpLCBNSU5PUihkZXYtPmRldikpKQorCQkJCQkJcmVtb3ZlX2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ19lcnJvcigiUGh5c2ljYWwgVm9sdW1lICVzIG5vdCBmb3VuZC4iLCBwdl9uYW1lKTsKKwkJCQkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBBZGQgZGV2aWNlIHBhdGggdG8gbHZtZXRhZC4gKi8KKwkJCQlsb2dfZGVidWcoIlNjYW5uaW5nIGRldiAlcyBmb3IgbHZtZXRhZCBjYWNoZS4iLCBwdl9uYW1lKTsKKwkJCQlpZiAoIWx2bWV0YWRfcHZzY2FuX3NpbmdsZShjbWQsIGRldiwgJmZvdW5kX3ZnbmFtZXMsICZwcC5jaGFuZ2VkX3ZnbmFtZXMpKQorCQkJCQlhZGRfZXJyb3JzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoc3NjYW5mKHB2X25hbWUsICIlZDolZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IEZhaWxlZCB0byBwYXJzZSBtYWpvcjptaW5vciBmcm9tICVzLCBza2lwcGluZy4iLCBwdl9uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRldm5vID0gTUtERVYoKGRldl90KW1ham9yLCAoZGV2X3QpbWlub3IpOworCisJCQlpZiAoIShkZXYgPSBkZXZfY2FjaGVfZ2V0X2J5X2RldnQoZGV2bm8sIGNtZC0+bHZtZXRhZF9maWx0ZXIpKSkgeworCQkJCS8qIFJlbW92ZSBtYWpvcjptaW5vciBmcm9tIGx2bWV0YWQuICovCisJCQkJbG9nX2RlYnVnKCJSZW1vdmluZyBkZXYgJWQ6JWQgZnJvbSBsdm1ldGFkIGNhY2hlLiIsIG1ham9yLCBtaW5vcik7CisJCQkJaWYgKCFfbHZtZXRhZF9jbGVhcl9kZXYoZGV2bm8sIG1ham9yLCBtaW5vcikpCisJCQkJCXJlbW92ZV9lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogQWRkIG1ham9yOm1pbm9yIHRvIGx2bWV0YWQuICovCisJCQkJbG9nX2RlYnVnKCJTY2FubmluZyBkZXYgJWQ6JWQgZm9yIGx2bWV0YWQgY2FjaGUuIiwgbWFqb3IsIG1pbm9yKTsKKwkJCQlpZiAoIWx2bWV0YWRfcHZzY2FuX3NpbmdsZShjbWQsIGRldiwgJmZvdW5kX3ZnbmFtZXMsICZwcC5jaGFuZ2VkX3ZnbmFtZXMpKQorCQkJCQlhZGRfZXJyb3JzKys7CisJCQl9CisJCX0KKworCQlpZiAoc2lnaW50X2NhdWdodCgpKSB7CisJCQlyZXQgPSBFQ01EX0ZBSUxFRDsKKwkJCWdvdG9fb3V0OworCQl9CisJfQorCisJaWYgKCFkZXZub19hcmdzKQorCQlnb3RvIGFjdGl2YXRlOworCisJLyogUHJvY2VzcyBhbnkgZ3JvdXBlZCAtLW1ham9yIC0tbWlub3IgYXJncyAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhjdXJyZW50X2dyb3VwLCAmY21kLT5hcmdfdmFsdWVfZ3JvdXBzKSB7CisJCW1ham9yID0gZ3JvdXBlZF9hcmdfaW50X3ZhbHVlKGN1cnJlbnRfZ3JvdXAtPmFyZ192YWx1ZXMsIG1ham9yX0FSRywgbWFqb3IpOworCQltaW5vciA9IGdyb3VwZWRfYXJnX2ludF92YWx1ZShjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBtaW5vcl9BUkcsIG1pbm9yKTsKKworCQlpZiAobWFqb3IgPCAwIHx8IG1pbm9yIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWRldm5vID0gTUtERVYoKGRldl90KW1ham9yLCAoZGV2X3QpbWlub3IpOworCisJCWlmICghKGRldiA9IGRldl9jYWNoZV9nZXRfYnlfZGV2dChkZXZubywgY21kLT5sdm1ldGFkX2ZpbHRlcikpKSB7CisJCQkvKiBSZW1vdmUgbWFqb3I6bWlub3IgZnJvbSBsdm1ldGFkLiAqLworCQkJbG9nX2RlYnVnKCJSZW1vdmluZyBkZXYgJWQ6JWQgZnJvbSBsdm1ldGFkIGNhY2hlLiIsIG1ham9yLCBtaW5vcik7CisJCQlpZiAoIV9sdm1ldGFkX2NsZWFyX2RldihkZXZubywgbWFqb3IsIG1pbm9yKSkKKwkJCQlyZW1vdmVfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQkvKiBBZGQgbWFqb3I6bWlub3IgdG8gbHZtZXRhZC4gKi8KKwkJCWxvZ19kZWJ1ZygiU2Nhbm5pbmcgZGV2ICVkOiVkIGZvciBsdm1ldGFkIGNhY2hlLiIsIG1ham9yLCBtaW5vcik7CisJCQlpZiAoIWx2bWV0YWRfcHZzY2FuX3NpbmdsZShjbWQsIGRldiwgJmZvdW5kX3ZnbmFtZXMsICZwcC5jaGFuZ2VkX3ZnbmFtZXMpKQorCQkJCWFkZF9lcnJvcnMrKzsKKwkJfQorCisJCWlmIChzaWdpbnRfY2F1Z2h0KCkpIHsKKwkJCXJldCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEluIHRoZSBwcm9jZXNzIG9mIHNjYW5uaW5nIGRldmljZXMsIGx2bWV0YWQgbWF5IGhhdmUgYmVjb21lCisJICogZGlzYWJsZWQuICBJZiBzbywgcmV2ZXJ0IHRvIHNjYW5uaW5nIGZvciB0aGUgYXV0b2FjdGl2YXRpb24gc3RlcC4KKwkgKiBPbmx5IGF1dG9hY3RpdmF0ZSB0aGUgVkdzIHRoYXQgd2VyZSBmb3VuZCBkdXJpbmcgdGhlIGRldiBzY2Fucy4KKwkgKi8KKwlpZiAobHZtZXRhZF91c2VkKCkgJiYgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlICVzLiIsIHJlYXNvbik7CisJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwl9CisKK2FjdGl2YXRlOgorCS8qCisJICogU3RlcCAyOiB3aGVuIHRoZSBQViB3YXMgc2VudCB0byBsdm1ldGFkLCB0aGUgbHZtZXRhZCByZXBseQorCSAqIGluZGljYXRlZCBpZiBhbGwgdGhlIFBWcyBmb3IgdGhlIFZHIGFyZSBub3cgZm91bmQuICBJZiBzbywKKwkgKiB0aGUgdmduYW1lIHdhcyBhZGRlZCB0byB0aGUgbGlzdCwgYW5kIHdlIGNhbiBhdHRlbXB0IHRvCisJICogYXV0b2FjdGl2YXRlIExWcyBpbiB0aGUgVkcuCisJICovCisJaWYgKGRvX2FjdGl2YXRlKQorCQlyZXQgPSBfcHZzY2FuX2F1dG9hY3RpdmF0ZShjbWQsICZwcCwgYWxsX3ZncywgJmZvdW5kX3ZnbmFtZXMpOworCitvdXQ6CisJaWYgKHJlbW92ZV9lcnJvcnMgfHwgYWRkX2Vycm9ycyB8fCBwcC5hY3RpdmF0ZV9lcnJvcnMpCisJCXJldCA9IEVDTURfRkFJTEVEOworCisJaWYgKCFzeW5jX2xvY2FsX2Rldl9uYW1lcyhjbWQpKQorCQlzdGFjazsKKwl1bmxvY2tfdmcoY21kLCBOVUxMLCBWR19HTE9CQUwpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaHJlZSBtYWluIHB2c2NhbiBjYXNlcyByZWxhdGVkIHRvIGx2bWV0YWQgdXNhZ2U6CisgKiAxLiBwdnNjYW4KKyAqIDIuIHB2c2NhbiAtLWNhY2hlCisgKiAzLiBwdnNjYW4gLS1jYWNoZSA8ZGV2PgorICoKKyAqIDEuIFRoZSAncHZzY2FuJyBjb21tYW5kICh3aXRob3V0IC0tY2FjaGUpIG1heSBvciBtYXkgbm90IGF0dGVtcHQgdG8KKyAqIHJlcG9wdWxhdGUgdGhlIGx2bWV0YWQgY2FjaGUsIGFuZCBtYXkgb3IgbWF5IG5vdCB1c2UgdGhlIGx2bWV0YWQKKyAqIGNhY2hlIHRvIGRpc3BsYXkgUFYgaW5mbzoKKyAqCisgKiBpLiBJZiBsdm1ldGFkIGlzIGJlaW5nIHVzZWQgYW5kIGlzIGluIGEgbm9ybWFsIHN0YXRlLCB0aGVuICdwdnNjYW4nCisgKiB3aWxsIHNpbXBseSByZWFkIGFuZCBkaXNwbGF5IFBWIGluZm8gZnJvbSB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqCisgKiBpaS4gSWYgbHZtZXRhZCBpcyBub3QgYmVpbmcgdXNlZCwgJ3B2c2Nhbicgd2lsbCByZWFkIGFsbCBkZXZpY2VzIHRvCisgKiBkaXNwbGF5IHRoZSBQViBpbmZvLgorICoKKyAqIGlpaS4gSWYgbHZtZXRhZCBpcyBiZWluZyB1c2VkLCBidXQgaGFzIGJlZW4gZGlzYWJsZWQgKGJlY2F1c2Ugb2YKKyAqIGR1cGxpY2F0ZSBkZXZzIG9yIGx2bTEgbWV0YWRhdGEpLCBvciBoYXMgYSBub24tbWF0Y2hpbmcgdG9rZW4KKyAqIChiZWNhdXNlIHRoZSBkZXZpY2UgZmlsdGVyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZXZpY2UgZmlsdGVyIGxhc3QKKyAqIHVzZWQgdG8gcG9wdWxhdGUgbHZtZXRhZCksIHRoZW4gJ3B2c2Nhbicgd2lsbCBiZWdpbiBieSByZXNjYW5uaW5nCisgKiBkZXZpY2VzIHRvIHJlcG9wdWxhdGUgbHZtZXRhZC4gIElmIGx2bWV0YWQgaXMgZW5hYmxlZCBhZnRlciB0aGUKKyAqIHJlc2NhbiwgdGhlbiAncHZzY2FuJyB3aWxsIHNpbXBseSByZWFkIGFuZCBkaXNwbGF5IFBWIGluZm8gZnJvbSB0aGUKKyAqIGx2bWV0YWQgY2FjaGUgKGxpa2UgY2FzZSBpKS4gIElmIGx2bWV0YWQgaXMgZGlzYWJsZWQgYWZ0ZXIgdGhlCisgKiByZXNjYW4sIHRoZW4gJ3B2c2Nhbicgd2lsbCByZWFkIGFsbCBkZXZpY2VzIHRvIGRpc3BsYXkgUFYgaW5mbworICogKGxpa2UgY2FzZSBpaSkuCisgKgorICogMi4gVGhlICdwdnNjYW4gLS1jYWNoZScgY29tbWFuZCAod2l0aG91dCBuYW1lZCBkZXZzKSB3aWxsIGFsd2F5cworICogYXR0ZW1wdCB0byByZXBvcHVsYXRlIHRoZSBsdm1ldGFkIGNhY2hlIGJ5IHJlc2Nhbm5pbmcgYWxsIGRldnMKKyAqIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgbHZtZXRhZCB3YXMgcHJldmlvdXNseSBkaXNhYmxlZCBvciBoYWQgYW4KKyAqIHVubWF0Y2hpbmcgdG9rZW4uKSAgbHZtZXRhZCBtYXkgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBhZnRlciB0aGUKKyAqIHJlc2NhbiAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgZHVwbGljYXRlIGRldnMgb3IgbHZtMSBtZXRhZGF0YSB3YXMKKyAqIGZvdW5kKS4KKyAqCisgKiAzLiBUaGUgJ3B2c2NhbiAtLWNhY2hlIDxkZXY+JyBjb21tYW5kIHdpbGwgYXR0ZW1wdCB0byByZXBvcHVsYXRlIHRoZQorICogbHZtZXRhZCBjYWNoZSBieSByZXNjYW5uaW5nIGFsbCBkZXZzIGlmIGx2bWV0YWQgaGFzIGEgbm9uLW1hdGNoaW5nCisgKiB0b2tlbiAoZS5nLiBiZWNhdXNlIGl0IGhhcyBub3QgeWV0IGJlZW4gcG9wdWxhdGVkLCBzZWUgRklYTUUgYWJvdmUpLgorICogT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCB3aWxsIG9ubHkgcmVzY2FuIHRoZSBuYW1lZCA8ZGV2PiBhbmQgc2VuZAorICogdGhlaXIgbWV0YWRhdGEgdG8gbHZtZXRhZC4KKyAqLworCitpbnQgcHZzY2FuKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHB2c2Nhbl9wYXJhbXMgcGFyYW1zID0geyAwIH07CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlYXNvbiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY2FjaGVfbG9uZ19BUkcpKQorCQlyZXR1cm4gX3B2c2Nhbl9jYWNoZShjbWQsIGFyZ2MsIGFyZ3YpOworCisJaWYgKGFyZ2MpIHsKKwkJbG9nX2Vycm9yKCJUb28gbWFueSBwYXJhbWV0ZXJzIG9uIGNvbW1hbmQgbGluZS4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSkgeworCQlsb2dfZXJyb3IoIi0tYWN0aXZhdGUgaXMgb25seSB2YWxpZCB3aXRoIC0tY2FjaGUuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1ham9yX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIG1pbm9yX0FSRykpIHsKKwkJbG9nX2Vycm9yKCItLW1ham9yIGFuZCAtLW1pbm9yIGFyZSBvbmx5IHZhbGlkIHdpdGggLS1jYWNoZS4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbm92b2x1bWVncm91cF9BUkcpICYmIGFyZ19pc19zZXQoY21kLCBleHBvcnRlZF9BUkcpKSB7CisJCWxvZ19lcnJvcigiT3B0aW9ucyAtZSBhbmQgLW4gYXJlIGluY29tcGF0aWJsZSIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBleHBvcnRlZF9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBub3ZvbHVtZWdyb3VwX0FSRykpCisJCWxvZ193YXJuKCJXQVJOSU5HOiBvbmx5IGNvbnNpZGVyaW5nIHBoeXNpY2FsIHZvbHVtZXMgJXMiLAorCQkJICBhcmdfaXNfc2V0KGNtZCwgZXhwb3J0ZWRfQVJHKSA/CisJCQkgICJvZiBleHBvcnRlZCB2b2x1bWUgZ3JvdXAocykiIDogImluIG5vIHZvbHVtZSBncm91cCIpOworCisJLyogTmVlZGVkIGJlY2F1c2UgdGhpcyBjb21tYW5kIGhhcyBOT19MVk1FVEFEX0FVVE9TQ0FOLiAqLworCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAoIWx2bWV0YWRfdG9rZW5fbWF0Y2hlcyhjbWQpIHx8IGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkpIHsKKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmICFsdm1ldGFkX3B2c2Nhbl9hbGxfZGV2cyhjbWQsIDApKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSBjYWNoZSB1cGRhdGUgZmFpbGVkLiIpOworCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQl9CisKKwkJaWYgKGx2bWV0YWRfdXNlZCgpICYmIGx2bWV0YWRfaXNfZGlzYWJsZWQoY21kLCAmcmVhc29uKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IE5vdCB1c2luZyBsdm1ldGFkIGJlY2F1c2UgJXMuIiwgcmVhc29uKTsKKwkJCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwkJfQorCX0KKworCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gb2J0YWluIGdsb2JhbCBsb2NrLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb2Nlc3NpbmcgaGFuZGxlLiIpOworCQlyZXQgPSBFQ01EX0ZBSUxFRDsKKwkJZ290byBvdXQ7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJnBhcmFtczsKKworCXJldCA9IHByb2Nlc3NfZWFjaF9wdihjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIDAsIDAsIGhhbmRsZSwgX3B2c2Nhbl9zaW5nbGUpOworCisJaWYgKCFwYXJhbXMucHZzX2ZvdW5kKQorCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTm8gbWF0Y2hpbmcgcGh5c2ljYWwgdm9sdW1lcyBmb3VuZCIpOworCWVsc2UKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlRvdGFsOiAlZCBbJXNdIC8gaW4gdXNlOiAlZCBbJXNdIC8gaW4gbm8gVkc6ICVkIFslc10iLAorCQkJCQlwYXJhbXMucHZzX2ZvdW5kLAorCQkJCQlkaXNwbGF5X3NpemUoY21kLCBwYXJhbXMuc2l6ZV90b3RhbCksCisJCQkJCXBhcmFtcy5wdnNfZm91bmQgLSBwYXJhbXMubmV3X3B2c19mb3VuZCwKKwkJCQkJZGlzcGxheV9zaXplKGNtZCwgKHBhcmFtcy5zaXplX3RvdGFsIC0gcGFyYW1zLnNpemVfbmV3KSksCisJCQkJCXBhcmFtcy5uZXdfcHZzX2ZvdW5kLCBkaXNwbGF5X3NpemUoY21kLCBwYXJhbXMuc2l6ZV9uZXcpKTsKKworb3V0OgorCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX0dMT0JBTCk7CisJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVwb3J0ZXIuYyBiL3Rvb2xzL3JlcG9ydGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwYTM1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlcG9ydGVyLmMKQEAgLTAsMCArMSwxNTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKKyNpbmNsdWRlICJyZXBvcnQuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlSRVBPUlRfSURYX05VTEwgPSAtMSwKKwlSRVBPUlRfSURYX1NJTkdMRSwKKwlSRVBPUlRfSURYX0xPRywKKwlSRVBPUlRfSURYX0ZVTExfVkdTLAorCVJFUE9SVF9JRFhfRlVMTF9MVlMsCisJUkVQT1JUX0lEWF9GVUxMX1BWUywKKwlSRVBPUlRfSURYX0ZVTExfUFZTRUdTLAorCVJFUE9SVF9JRFhfRlVMTF9TRUdTLAorCVJFUE9SVF9JRFhfQ09VTlQKK30gcmVwb3J0X2lkeF90OworCisjZGVmaW5lIFJFUE9SVF9JRFhfRlVMTF9TVEFSVCBSRVBPUlRfSURYX0ZVTExfVkdTCisKK3N0cnVjdCBzaW5nbGVfcmVwb3J0X2FyZ3MgeworCXJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGU7CisJY2hhciByZXBvcnRfcHJlZml4WzMyXTsKKwljb25zdCBjaGFyICpyZXBvcnRfbmFtZTsKKwlpbnQgYXJnc19hcmVfcHZzOworCWNvbnN0IGNoYXIgKmtleXM7CisJY29uc3QgY2hhciAqb3B0aW9uczsKKwljb25zdCBjaGFyICpmaWVsZHNfdG9fY29tcGFjdDsKKwljb25zdCBjaGFyICpzZWxlY3Rpb247Cit9OworCisvKiBUT0RPOiBjb25maWd1cmUgdGhlc2UgY29tbW9uIHJlcG9ydCBhcmdzIG9ubHkgb25jZSBwZXIgY21kICovCitzdHJ1Y3QgcmVwb3J0X2FyZ3MgeworCWludCBhcmdjOworCWNoYXIgKiphcmd2OworCWRtX3JlcG9ydF9ncm91cF90eXBlX3QgcmVwb3J0X2dyb3VwX3R5cGU7CisJcmVwb3J0X3R5cGVfdCByZXBvcnRfdHlwZTsKKwlpbnQgYWxpZ25lZDsKKwlpbnQgYnVmZmVyZWQ7CisJaW50IGhlYWRpbmdzOworCWludCBmaWVsZF9wcmVmaXhlczsKKwlpbnQgcXVvdGVkOworCWludCBjb2x1bW5zX2FzX3Jvd3M7CisJY29uc3QgY2hhciAqc2VwYXJhdG9yOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKmZ1bGxfcmVwb3J0X3ZnOworCWludCBsb2dfb25seTsKKwlzdHJ1Y3Qgc2luZ2xlX3JlcG9ydF9hcmdzIHNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfQ09VTlRdOworfTsKKworc3RhdGljIGludCBfcHJvY2Vzc19lYWNoX2RldnR5cGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLAorCQkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlpZiAoYXJnYykKKwkJbG9nX3dhcm4oIldBUk5JTkc6IGRldnR5cGVzIGN1cnJlbnRseSBpZ25vcmVzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIik7CisKKwlpZiAoIXJlcG9ydF9kZXZ0eXBlcyhoYW5kbGUtPmN1c3RvbV9oYW5kbGUpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX3Znc19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgICBjb25zdCBjaGFyICp2Z19uYW1lLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBzZWxlY3Rpb25faGFuZGxlICpzaCA9IGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZTsKKworCWlmICghcmVwb3J0X29iamVjdChzaCA/IDogaGFuZGxlLT5jdXN0b21faGFuZGxlLCBzaCAhPSBOVUxMLAorCQkJICAgdmcsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwljaGVja19jdXJyZW50X2JhY2t1cCh2Zyk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyB2b2lkIF9jaG9vc2VfbHZfc2VnbWVudF9mb3Jfc3RhdHVzX3JlcG9ydChjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBjb25zdCBzdHJ1Y3QgbHZfc2VnbWVudCAqKmx2X3NlZykKK3sKKwkvKgorCSAqIEJ5IGRlZmF1bHQsIHRha2UgdGhlIGZpcnN0IExWIHNlZ21lbnQgdG8gcmVwb3J0IHN0YXR1cyBmb3IuCisJICogSWYgdGhlcmUncyBhbnkgb3RoZXIgc3BlY2lmaWMgc2VnbWVudCB0aGF0IG5lZWRzIHRvIGJlCisJICogcmVwb3J0ZWQgaW5zdGVhZCBmb3IgdGhlIExWLCBjaG9vc2UgaXQgaGVyZSBhbmQgYXNzaWduIGl0CisJICogdG8gbHZkbS0+c2VnX3N0YXR1cy0+c2VnLiBUaGlzIGlzIHRoZSBzZWdtZW50IHdob3NlCisJICogc3RhdHVzIGxpbmUgd2lsbCBiZSB1c2VkIGZvciByZXBvcnQgZXhhY3RseS4KKwkgKi8KKwkqbHZfc2VnID0gZmlyc3Rfc2VnKGx2KTsKK30KKworc3RhdGljIGludCBfZG9faW5mb19hbmRfc3RhdHVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJY29uc3Qgc3RydWN0IGx2X3NlZ21lbnQgKmx2X3NlZywKKwkJCQlzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzICpzdGF0dXMsCisJCQkJaW50IGRvX2luZm8sIGludCBkb19zdGF0dXMpCit7CisJdW5zaWduZWQgdXNlX2xheWVyID0gbHZfaXNfdGhpbl9wb29sKGx2KSA/IDEgOiAwOworCisJc3RhdHVzLT5sdiA9IGx2OworCisJaWYgKGx2X2lzX2hpc3RvcmljYWwobHYpKQorCQlyZXR1cm4gMTsKKworCWlmIChkb19zdGF0dXMpIHsKKwkJaWYgKCEoc3RhdHVzLT5zZWdfc3RhdHVzLm1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJyZXBvcnRlcl9wb29sIiwgMTAyNCkpKQorCQkJcmV0dXJuXzA7CisJCWlmICghbHZfc2VnKQorCQkJX2Nob29zZV9sdl9zZWdtZW50X2Zvcl9zdGF0dXNfcmVwb3J0KGx2LCAmbHZfc2VnKTsKKwkJaWYgKGRvX2luZm8pIHsKKwkJCS8qIGJvdGggaW5mbyBhbmQgc3RhdHVzICovCisJCQlzdGF0dXMtPmluZm9fb2sgPSBsdl9pbmZvX3dpdGhfc2VnX3N0YXR1cyhjbWQsIGx2LCBsdl9zZWcsIHVzZV9sYXllciwgc3RhdHVzLCAxLCAxKTsKKwkJCS8qIGZvciBpbmFjdGl2ZSB0aGluLXBvb2xzIHJlc2V0IGx2IGluZm8gc3RydWN0ICovCisJCQlpZiAodXNlX2xheWVyICYmIHN0YXR1cy0+aW5mb19vayAmJgorCQkJICAgICFsdl9pbmZvKGNtZCwgbHYsIDAsIE5VTEwsIDAsIDApKQorCQkJCW1lbXNldCgmc3RhdHVzLT5pbmZvLCAgMCwgc2l6ZW9mKHN0YXR1cy0+aW5mbykpOworCQl9IGVsc2UKKwkJCS8qIHN0YXR1cyBvbmx5ICovCisJCQlzdGF0dXMtPmluZm9fb2sgPSBsdl9zdGF0dXMoY21kLCBsdl9zZWcsIHVzZV9sYXllciwgJnN0YXR1cy0+c2VnX3N0YXR1cyk7CisJfSBlbHNlIGlmIChkb19pbmZvKQorCQkvKiBpbmZvIG9ubHkgKi8KKwkJc3RhdHVzLT5pbmZvX29rID0gbHZfaW5mbyhjbWQsIGx2LCB1c2VfbGF5ZXIsICZzdGF0dXMtPmluZm8sIDEsIDEpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RvX2x2c193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgICAgaW50IGRvX2luZm8sIGludCBkb19zdGF0dXMsCisJCQkJCSAgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSAqc2ggPSBoYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGU7CisJc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyBzdGF0dXMgPSB7CisJCS5zZWdfc3RhdHVzLnR5cGUgPSBTRUdfU1RBVFVTX05PTkUKKwl9OworCWludCByID0gRUNNRF9GQUlMRUQ7CisKKwlpZiAoIV9kb19pbmZvX2FuZF9zdGF0dXMoY21kLCBsdiwgTlVMTCwgJnN0YXR1cywgZG9faW5mbywgZG9fc3RhdHVzKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIXJlcG9ydF9vYmplY3Qoc2ggPyA6IGhhbmRsZS0+Y3VzdG9tX2hhbmRsZSwgc2ggIT0gTlVMTCwKKwkJCSAgIGx2LT52ZywgbHYsIE5VTEwsIE5VTEwsIE5VTEwsICZzdGF0dXMsIE5VTEwpKQorCQlnb3RvIG91dDsKKworCXIgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlpZiAoc3RhdHVzLnNlZ19zdGF0dXMubWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLnNlZ19zdGF0dXMubWVtKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9sdnNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIF9kb19sdnNfd2l0aF9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlKGNtZCwgbHYsIDAsIDAsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c193aXRoX2luZm9fc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gX2RvX2x2c193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoY21kLCBsdiwgMSwgMCwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBfbHZzX3dpdGhfc3RhdHVzX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gX2RvX2x2c193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoY21kLCBsdiwgMCwgMSwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBfbHZzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBfZG9fbHZzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZShjbWQsIGx2LCAxLCAxLCBoYW5kbGUpOworfQorCitzdGF0aWMgaW50IF9kb19zZWdzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJCWNvbnN0IHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJCQlpbnQgZG9faW5mbywgaW50IGRvX3N0YXR1cywKKwkJCQkJCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBzZWxlY3Rpb25faGFuZGxlICpzaCA9IGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZTsKKwlzdHJ1Y3QgbHZfd2l0aF9pbmZvX2FuZF9zZWdfc3RhdHVzIHN0YXR1cyA9IHsKKwkJLnNlZ19zdGF0dXMudHlwZSA9IFNFR19TVEFUVVNfTk9ORQorCX07CisJaW50IHIgPSBFQ01EX0ZBSUxFRDsKKworCWlmICghX2RvX2luZm9fYW5kX3N0YXR1cyhjbWQsIHNlZy0+bHYsIHNlZywgJnN0YXR1cywgZG9faW5mbywgZG9fc3RhdHVzKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIXJlcG9ydF9vYmplY3Qoc2ggPyA6IGhhbmRsZS0+Y3VzdG9tX2hhbmRsZSwgc2ggIT0gTlVMTCwKKwkJCSAgIHNlZy0+bHYtPnZnLCBzZWctPmx2LCBOVUxMLCBzZWcsIE5VTEwsICZzdGF0dXMsIE5VTEwpKQorCWdvdG9fb3V0OworCisJciA9IEVDTURfUFJPQ0VTU0VEOworb3V0OgorCWlmIChzdGF0dXMuc2VnX3N0YXR1cy5tZW0pCisJCWRtX3Bvb2xfZGVzdHJveShzdGF0dXMuc2VnX3N0YXR1cy5tZW0pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3NlZ3Nfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIF9kb19zZWdzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZShjbWQsIHNlZywgMCwgMCwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBfc2Vnc193aXRoX2luZm9fc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCSAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIF9kb19zZWdzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZShjbWQsIHNlZywgMSwgMCwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBfc2Vnc193aXRoX3N0YXR1c19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsdl9zZWdtZW50ICpzZWcsCisJCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBfZG9fc2Vnc193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoY21kLCBzZWcsIDAsIDEsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgX3NlZ3Nfd2l0aF9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLAorCQkJCQkgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBfZG9fc2Vnc193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoY21kLCBzZWcsIDEsIDEsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c2Vnc19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWlmICghYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpICYmICFsdl9pc192aXNpYmxlKGx2KSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJcmV0dXJuIHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX2x2KGNtZCwgbHYsIGhhbmRsZSwgX3NlZ3Nfc2luZ2xlKTsKK30KKworc3RhdGljIGludCBfbHZzZWdzX3dpdGhfaW5mb19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWlmICghYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpICYmICFsdl9pc192aXNpYmxlKGx2KSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJcmV0dXJuIHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX2x2KGNtZCwgbHYsIGhhbmRsZSwgX3NlZ3Nfd2l0aF9pbmZvX3NpbmdsZSk7Cit9CisKK3N0YXRpYyBpbnQgX2x2c2Vnc193aXRoX3N0YXR1c19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykgJiYgIWx2X2lzX3Zpc2libGUobHYpKQorCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwlyZXR1cm4gcHJvY2Vzc19lYWNoX3NlZ21lbnRfaW5fbHYoY21kLCBsdiwgaGFuZGxlLCBfc2Vnc193aXRoX3N0YXR1c19zaW5nbGUpOworfQorCitzdGF0aWMgaW50IF9sdnNlZ3Nfd2l0aF9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykgJiYgIWx2X2lzX3Zpc2libGUobHYpKQorCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwlyZXR1cm4gcHJvY2Vzc19lYWNoX3NlZ21lbnRfaW5fbHYoY21kLCBsdiwgaGFuZGxlLCBfc2Vnc193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUpOworfQorCitzdGF0aWMgaW50IF9kb19wdnNlZ3Nfc3ViX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJIHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZywKKwkJCQkgaW50IGRvX2luZm8sCisJCQkJIGludCBkb19zdGF0dXMsCisJCQkJIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBzZWxlY3Rpb25faGFuZGxlICpzaCA9IGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZTsKKwlpbnQgcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZyA9IHB2c2VnLT5sdnNlZzsKKworCXN0cnVjdCBzZWdtZW50X3R5cGUgX2ZyZWVzZWdfdHlwZSA9IHsKKwkJLm5hbWUgPSAiZnJlZSIsCisJCS5mbGFncyA9IFNFR19WSVJUVUFMIHwgU0VHX0NBTk5PVF9CRV9aRVJPRUQsCisJfTsKKworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgX2ZyZWVfdmcgPSB7CisJCS5jbWQgPSBjbWQsCisJCS5uYW1lID0gIiIsCisJCS5wdnMgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV92Zy5wdnMpLAorCQkubHZzID0gRE1fTElTVF9IRUFEX0lOSVQoX2ZyZWVfdmcubHZzKSwKKwkJLmhpc3RvcmljYWxfbHZzID0gRE1fTElTVF9IRUFEX0lOSVQoX2ZyZWVfdmcuaGlzdG9yaWNhbF9sdnMpLAorCQkudGFncyA9IERNX0xJU1RfSEVBRF9JTklUKF9mcmVlX3ZnLnRhZ3MpLAorCX07CisKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgX2ZyZWVfbG9naWNhbF92b2x1bWUgPSB7CisJCS52ZyA9IHZnID86ICZfZnJlZV92ZywKKwkJLm5hbWUgPSAiIiwKKwkJLnN0YXR1cyA9IFZJU0lCTEVfTFYsCisJCS5tYWpvciA9IC0xLAorCQkubWlub3IgPSAtMSwKKwkJLnRhZ3MgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV9sb2dpY2FsX3ZvbHVtZS50YWdzKSwKKwkJLnNlZ21lbnRzID0gRE1fTElTVF9IRUFEX0lOSVQoX2ZyZWVfbG9naWNhbF92b2x1bWUuc2VnbWVudHMpLAorCQkuc2Vnc191c2luZ190aGlzX2x2ID0gRE1fTElTVF9IRUFEX0lOSVQoX2ZyZWVfbG9naWNhbF92b2x1bWUuc2Vnc191c2luZ190aGlzX2x2KSwKKwkJLmluZGlyZWN0X2dsdnMgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV9sb2dpY2FsX3ZvbHVtZS5pbmRpcmVjdF9nbHZzKSwKKwkJLnNuYXBzaG90X3NlZ3MgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV9sb2dpY2FsX3ZvbHVtZS5zbmFwc2hvdF9zZWdzKSwKKwl9OworCisJc3RydWN0IGx2X3NlZ21lbnQgX2ZyZWVfbHZfc2VnbWVudCA9IHsKKwkJLmx2ID0gJl9mcmVlX2xvZ2ljYWxfdm9sdW1lLAorCQkuc2VndHlwZSA9ICZfZnJlZXNlZ190eXBlLAorCQkubGVuID0gcHZzZWctPmxlbiwKKwkJLnRhZ3MgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV9sdl9zZWdtZW50LnRhZ3MpLAorCQkub3JpZ2luX2xpc3QgPSBETV9MSVNUX0hFQURfSU5JVChfZnJlZV9sdl9zZWdtZW50Lm9yaWdpbl9saXN0KSwKKwl9OworCisJc3RydWN0IGx2X3dpdGhfaW5mb19hbmRfc2VnX3N0YXR1cyBzdGF0dXMgPSB7CisJCS5zZWdfc3RhdHVzLnR5cGUgPSBTRUdfU1RBVFVTX05PTkUsCisJCS5sdiA9ICZfZnJlZV9sb2dpY2FsX3ZvbHVtZQorCX07CisKKwlpZiAoc2VnICYmICFfZG9faW5mb19hbmRfc3RhdHVzKGNtZCwgc2VnLT5sdiwgc2VnLCAmc3RhdHVzLCBkb19pbmZvLCBkb19zdGF0dXMpKQorCQlnb3RvX291dDsKKworCWlmICghcmVwb3J0X29iamVjdChzaCA/IDogaGFuZGxlLT5jdXN0b21faGFuZGxlLCBzaCAhPSBOVUxMLAorCQkJICAgdmcsIHNlZyA/IHNlZy0+bHYgOiAmX2ZyZWVfbG9naWNhbF92b2x1bWUsCisJCQkgICBwdnNlZy0+cHYsIHNlZyA/IDogJl9mcmVlX2x2X3NlZ21lbnQsIHB2c2VnLAorCQkJICAgJnN0YXR1cywgcHZfbGFiZWwocHZzZWctPnB2KSkpIHsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworIG91dDoKKwlpZiAoc3RhdHVzLnNlZ19zdGF0dXMubWVtKQorCQlkbV9wb29sX2Rlc3Ryb3koc3RhdHVzLnNlZ19zdGF0dXMubWVtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3B2c2Vnc19zdWJfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgICBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWcsCisJCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gX2RvX3B2c2Vnc19zdWJfc2luZ2xlKGNtZCwgdmcsIHB2c2VnLCAwLCAwLCBoYW5kbGUpOworfQorCitzdGF0aWMgaW50IF9wdnNlZ3Nfd2l0aF9sdl9pbmZvX3N1Yl9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICBzdHJ1Y3QgcHZfc2VnbWVudCAqcHZzZWcsCisJCQkJCSAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBfZG9fcHZzZWdzX3N1Yl9zaW5nbGUoY21kLCB2ZywgcHZzZWcsIDEsIDAsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2c2Vnc193aXRoX2x2X3N0YXR1c19zdWJfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkgICAgIHN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZywKKwkJCQkJICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gX2RvX3B2c2Vnc19zdWJfc2luZ2xlKGNtZCwgdmcsIHB2c2VnLCAwLCAxLCBoYW5kbGUpOworfQorCitzdGF0aWMgaW50IF9wdnNlZ3Nfd2l0aF9sdl9pbmZvX2FuZF9zdGF0dXNfc3ViX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCQkJICAgICAgc3RydWN0IHB2X3NlZ21lbnQgKnB2c2VnLAorCQkJCQkJICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIF9kb19wdnNlZ3Nfc3ViX3NpbmdsZShjbWQsIHZnLCBwdnNlZywgMSwgMSwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBfcHZzZWdzX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gcHJvY2Vzc19lYWNoX3NlZ21lbnRfaW5fcHYoY21kLCB2ZywgcHYsIGhhbmRsZSwgX3B2c2Vnc19zdWJfc2luZ2xlKTsKK30KKworc3RhdGljIGludCBfcHZzZWdzX3dpdGhfbHZfaW5mb19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX3B2KGNtZCwgdmcsIHB2LCBoYW5kbGUsIF9wdnNlZ3Nfd2l0aF9sdl9pbmZvX3N1Yl9zaW5nbGUpOworfQorCitzdGF0aWMgaW50IF9wdnNlZ3Nfd2l0aF9sdl9zdGF0dXNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJCSBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCQkJIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBwcm9jZXNzX2VhY2hfc2VnbWVudF9pbl9wdihjbWQsIHZnLCBwdiwgaGFuZGxlLCBfcHZzZWdzX3dpdGhfbHZfc3RhdHVzX3N1Yl9zaW5nbGUpOworfQorCitzdGF0aWMgaW50IF9wdnNlZ3Nfd2l0aF9sdl9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkJCSAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiBwcm9jZXNzX2VhY2hfc2VnbWVudF9pbl9wdihjbWQsIHZnLCBwdiwgaGFuZGxlLCBfcHZzZWdzX3dpdGhfbHZfaW5mb19hbmRfc3RhdHVzX3N1Yl9zaW5nbGUpOworfQorCitzdGF0aWMgaW50IF9wdnNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHNlbGVjdGlvbl9oYW5kbGUgKnNoID0gaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlOworCisJaWYgKCFyZXBvcnRfb2JqZWN0KHNoID8gOiBoYW5kbGUtPmN1c3RvbV9oYW5kbGUsIHNoICE9IE5VTEwsCisJCQkgICB2ZywgTlVMTCwgcHYsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX2xhYmVsX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxhYmVsICpsYWJlbCwKKwkJICAgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHNlbGVjdGlvbl9oYW5kbGUgKnNoID0gaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlOworCisJaWYgKCFyZXBvcnRfb2JqZWN0KHNoID8gOiBoYW5kbGUtPmN1c3RvbV9oYW5kbGUsIHNoICE9IE5VTEwsCisJCQkgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBsYWJlbCkpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworc3RhdGljIGludCBfcHZzX2luX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIHByb2Nlc3NfZWFjaF9wdl9pbl92ZyhjbWQsIHZnLCBoYW5kbGUsICZfcHZzX3NpbmdsZSk7Cit9CisKK3N0YXRpYyBpbnQgX3B2c2Vnc19pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gcHJvY2Vzc19lYWNoX3B2X2luX3ZnKGNtZCwgdmcsIGhhbmRsZSwgJl9wdnNlZ3Nfc2luZ2xlKTsKK30KKworc3RhdGljIGludCBfZ2V0X2ZpbmFsX3JlcG9ydF90eXBlKHN0cnVjdCByZXBvcnRfYXJncyAqYXJncywKKwkJCQkgIHN0cnVjdCBzaW5nbGVfcmVwb3J0X2FyZ3MgKnNpbmdsZV9hcmdzLAorCQkJCSAgcmVwb3J0X3R5cGVfdCByZXBvcnRfdHlwZSwKKwkJCQkgIGludCAqbHZfaW5mb19uZWVkZWQsCisJCQkJICBpbnQgKmx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCwKKwkJCQkgIHJlcG9ydF90eXBlX3QgKmZpbmFsX3JlcG9ydF90eXBlKQoreworCS8qIERvIHdlIG5lZWQgdG8gYWNxdWlyZSBMViBkZXZpY2UgaW5mbyBpbiBhZGRpdGlvbj8gKi8KKwkqbHZfaW5mb19uZWVkZWQgPSAocmVwb3J0X3R5cGUgJiAoTFZTSU5GTyB8IExWU0lORk9TVEFUVVMpKSA/IDEgOiAwOworCisJLyogRG8gd2UgbmVlZCB0byBhY3F1aXJlIExWIGRldmljZSBzdGF0dXMgaW4gYWRkaXRpb24/ICovCisJKmx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCA9IChyZXBvcnRfdHlwZSAmIChMVlNTVEFUVVMgfCBMVlNJTkZPU1RBVFVTKSkgPyAxIDogMDsKKworCS8qIEVuc3VyZSBvcHRpb25zIHNlbGVjdGVkIGFyZSBjb21wYXRpYmxlICovCisJaWYgKHJlcG9ydF90eXBlICYgU0VHUykKKwkJcmVwb3J0X3R5cGUgfD0gTFZTOworCWlmIChyZXBvcnRfdHlwZSAmIFBWU0VHUykKKwkJcmVwb3J0X3R5cGUgfD0gUFZTOworCWlmICgocmVwb3J0X3R5cGUgJiAoTFZTIHwgTFZTSU5GTyB8IExWU1NUQVRVUyB8IExWU0lORk9TVEFUVVMpKSAmJgorCSAgICAocmVwb3J0X3R5cGUgJiAoUFZTIHwgTEFCRUwpKSAmJiAhKHNpbmdsZV9hcmdzLT5hcmdzX2FyZV9wdnMgfHwgKGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnICYmIHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSA9PSBQVlNFR1MpKSkgeworCQlsb2dfZXJyb3IoIkNhbid0IHJlcG9ydCBMViBhbmQgUFYgZmllbGRzIGF0IHRoZSBzYW1lIHRpbWUgaW4gJXNyZXBvcnQgdHlwZSBcIiVzXCIlcyVzLiIsCisJCQkgIGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnID8gInN1YiIgOiAiIiAsIHNpbmdsZV9hcmdzLT5yZXBvcnRfcHJlZml4LAorCQkJICBhcmdzLT5mdWxsX3JlcG9ydF92ZyA/ICIgaW4gVkcgIiA6ICIiLAorCQkJICBhcmdzLT5mdWxsX3JlcG9ydF92ZyA/IGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnLT5uYW1lOiAiIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENoYW5nZSByZXBvcnQgdHlwZSBpZiBmaWVsZHMgc3BlY2lmaWVkIG1ha2VzIHRoaXMgbmVjZXNzYXJ5ICovCisJaWYgKHJlcG9ydF90eXBlICYgRlVMTCkKKwkJcmVwb3J0X3R5cGUgPSBGVUxMOworCWVsc2UgaWYgKChyZXBvcnRfdHlwZSAmIFBWU0VHUykgfHwKKwkJICgocmVwb3J0X3R5cGUgJiAoUFZTIHwgTEFCRUwpKSAmJiAocmVwb3J0X3R5cGUgJiAoTFZTIHwgTFZTSU5GTyB8IExWU1NUQVRVUyB8IExWU0lORk9TVEFUVVMpKSkpCisJCXJlcG9ydF90eXBlID0gUFZTRUdTOworCWVsc2UgaWYgKChyZXBvcnRfdHlwZSAmIFBWUykgfHwKKwkJICgocmVwb3J0X3R5cGUgJiBMQUJFTCkgJiYgKHJlcG9ydF90eXBlICYgVkdTKSkpCisJCXJlcG9ydF90eXBlID0gUFZTOworCWVsc2UgaWYgKHJlcG9ydF90eXBlICYgU0VHUykKKwkJcmVwb3J0X3R5cGUgPSBTRUdTOworCWVsc2UgaWYgKHJlcG9ydF90eXBlICYgKExWUyB8IExWU0lORk8gfCBMVlNTVEFUVVMgfCBMVlNJTkZPU1RBVFVTKSkKKwkJcmVwb3J0X3R5cGUgPSBMVlM7CisKKwlpZiAoYXJncy0+ZnVsbF9yZXBvcnRfdmcgJiYgKHJlcG9ydF90eXBlICE9IHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSkpIHsKKwkJLyogRklYTUU6IFRlbGwgdXNlciBhYm91dCB3aGljaCBjb2x1bW5zIGV4YWN0bHkgYXJlIGluY29ycmVjdGx5IHVzZWQgZm9yIHRoYXQgcmVwb3J0IHR5cGUuLi4gKi8KKwkJbG9nX2Vycm9yKCJTdWJyZXBvcnQgb2YgdHlwZSBcIiVzXCIgZm9yIFZHICVzIGNvbnRhaW5zIGNvbHVtbnMgd2hpY2ggbGVhZCB0byBjaGFuZ2Ugb2YgcmVwb3J0IHR5cGUuICIKKwkJCSAgIkFkZCB0aGVzZSBjb2x1bW5zIHRvIHByb3BlciBzdWJyZXBvcnQgdHlwZS4iLCBzaW5nbGVfYXJncy0+cmVwb3J0X3ByZWZpeCwgYXJncy0+ZnVsbF9yZXBvcnRfdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqZmluYWxfcmVwb3J0X3R5cGUgPSByZXBvcnRfdHlwZTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfcmVwb3J0X2FsbF9pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCByZXBvcnRfdHlwZV90IHR5cGUsCisJCQkgICAgIGludCBkb19sdl9pbmZvLCBpbnQgZG9fbHZfc2VnX3N0YXR1cykKK3sKKwlpbnQgciA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWR1M6CisJCQlyID0gX3Znc19zaW5nbGUoY21kLCB2Zy0+bmFtZSwgdmcsIGhhbmRsZSk7CisJCQlicmVhazsKKwkJY2FzZSBMVlM6CisJCQlyID0gcHJvY2Vzc19lYWNoX2x2X2luX3ZnKGNtZCwgdmcsIE5VTEwsIE5VTEwsIDAsIGhhbmRsZSwKKwkJCQkJCSAgZG9fbHZfaW5mbyAmJiAhZG9fbHZfc2VnX3N0YXR1cyA/ICZfbHZzX3dpdGhfaW5mb19zaW5nbGUgOgorCQkJCQkJICAhZG9fbHZfaW5mbyAmJiBkb19sdl9zZWdfc3RhdHVzID8gJl9sdnNfd2l0aF9zdGF0dXNfc2luZ2xlIDoKKwkJCQkJCSAgZG9fbHZfaW5mbyAmJiBkb19sdl9zZWdfc3RhdHVzID8gJl9sdnNfd2l0aF9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlIDoKKwkJCQkJCQkJCQkgICAmX2x2c19zaW5nbGUpOworCQkJYnJlYWs7CisJCWNhc2UgU0VHUzoKKwkJCXIgPSBwcm9jZXNzX2VhY2hfbHZfaW5fdmcoY21kLCB2ZywgTlVMTCwgTlVMTCwgMCwgaGFuZGxlLAorCQkJCQkJICBkb19sdl9pbmZvICYmICFkb19sdl9zZWdfc3RhdHVzID8gJl9sdnNlZ3Nfd2l0aF9pbmZvX3NpbmdsZSA6CisJCQkJCQkgICFkb19sdl9pbmZvICYmIGRvX2x2X3NlZ19zdGF0dXMgPyAmX2x2c2Vnc193aXRoX3N0YXR1c19zaW5nbGUgOgorCQkJCQkJICBkb19sdl9pbmZvICYmIGRvX2x2X3NlZ19zdGF0dXMgPyAmX2x2c2Vnc193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUgOgorCQkJCQkJCQkJCSAgICZfbHZzZWdzX3NpbmdsZSk7CisJCQlicmVhazsKKwkJY2FzZSBQVlM6CisJCQlyID0gcHJvY2Vzc19lYWNoX3B2X2luX3ZnKGNtZCwgdmcsIGhhbmRsZSwgJl9wdnNfc2luZ2xlKTsKKwkJCWJyZWFrOworCQljYXNlIFBWU0VHUzoKKwkJCXIgPSBwcm9jZXNzX2VhY2hfcHZfaW5fdmcoY21kLCB2ZywgaGFuZGxlLAorCQkJCQkJICBkb19sdl9pbmZvICYmICFkb19sdl9zZWdfc3RhdHVzID8gJl9wdnNlZ3Nfd2l0aF9sdl9pbmZvX3NpbmdsZSA6CisJCQkJCQkgICFkb19sdl9pbmZvICYmIGRvX2x2X3NlZ19zdGF0dXMgPyAmX3B2c2Vnc193aXRoX2x2X3N0YXR1c19zaW5nbGUgOgorCQkJCQkJICBkb19sdl9pbmZvICYmIGRvX2x2X3NlZ19zdGF0dXMgPyAmX3B2c2Vnc193aXRoX2x2X2luZm9fYW5kX3N0YXR1c19zaW5nbGUgOgorCQkJCQkJCQkJCSAgICZfcHZzZWdzX3NpbmdsZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX3JlcG9ydF9hbGxfaW5fdmc6IGluY29ycmVjdCByZXBvcnQgdHlwZSIpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydF9hbGxfaW5fbHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCByZXBvcnRfdHlwZV90IHR5cGUsCisJCQkgICAgIGludCBkb19sdl9pbmZvLCBpbnQgZG9fbHZfc2VnX3N0YXR1cykKK3sKKwlpbnQgciA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBMVlM6CisJCQlyID0gX2RvX2x2c193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUoY21kLCBsdiwgZG9fbHZfaW5mbywgZG9fbHZfc2VnX3N0YXR1cywgaGFuZGxlKTsKKwkJCWJyZWFrOworCQljYXNlIFNFR1M6CisJCQlyID0gcHJvY2Vzc19lYWNoX3NlZ21lbnRfaW5fbHYoY21kLCBsdiwgaGFuZGxlLAorCQkJCQkJICAgICAgIGRvX2x2X2luZm8gJiYgIWRvX2x2X3NlZ19zdGF0dXMgPyAmX3NlZ3Nfd2l0aF9pbmZvX3NpbmdsZSA6CisJCQkJCQkJICAgICAgICFkb19sdl9pbmZvICYmIGRvX2x2X3NlZ19zdGF0dXMgPyAmX3NlZ3Nfd2l0aF9zdGF0dXNfc2luZ2xlIDoKKwkJCQkJCQkgICAgICAgZG9fbHZfaW5mbyAmJiBkb19sdl9zZWdfc3RhdHVzID8gJl9zZWdzX3dpdGhfaW5mb19hbmRfc3RhdHVzX3NpbmdsZSA6CisJCQkJCQkJCQkJCQkmX3NlZ3Nfc2luZ2xlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfcmVwb3J0X2FsbF9pbl9sdjogaW5jb3JyZWN0IHJlcG9ydCB0eXBlIik7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfcmVwb3J0X2FsbF9pbl9wdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCByZXBvcnRfdHlwZV90IHR5cGUsCisJCQkgICAgIGludCBkb19sdl9pbmZvLCBpbnQgZG9fbHZfc2VnX3N0YXR1cykKK3sKKwlpbnQgciA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBQVlM6CisJCQlyID0gX3B2c19zaW5nbGUoY21kLCBwdi0+dmcsIHB2LCBoYW5kbGUpOworCQkJYnJlYWs7CisJCWNhc2UgUFZTRUdTOgorCQkJciA9IHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX3B2KGNtZCwgcHYtPnZnLCBwdiwgaGFuZGxlLAorCQkJCQkJICAgICAgIGRvX2x2X2luZm8gJiYgIWRvX2x2X3NlZ19zdGF0dXMgPyAmX3B2c2Vnc193aXRoX2x2X2luZm9fc3ViX3NpbmdsZSA6CisJCQkJCQkgICAgICAgIWRvX2x2X2luZm8gJiYgZG9fbHZfc2VnX3N0YXR1cyA/ICZfcHZzZWdzX3dpdGhfbHZfc3RhdHVzX3N1Yl9zaW5nbGUgOgorCQkJCQkJICAgICAgIGRvX2x2X2luZm8gJiYgZG9fbHZfc2VnX3N0YXR1cyA/ICZfcHZzZWdzX3dpdGhfbHZfaW5mb19hbmRfc3RhdHVzX3N1Yl9zaW5nbGUgOgorCQkJCQkJCQkJCQkmX3B2c2Vnc19zdWJfc2luZ2xlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9nX2Vycm9yKElOVEVSTkFMX0VSUk9SICJfcmVwb3J0X2FsbF9pbl9wdjogaW5jb3JyZWN0IHJlcG9ydCB0eXBlIik7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IHJlcG9ydF9mb3Jfc2VsZWN0aW9uKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqcGFyZW50X2hhbmRsZSwKKwkJCSBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KQoreworCXN0cnVjdCBzZWxlY3Rpb25faGFuZGxlICpzaCA9IHBhcmVudF9oYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGU7CisJc3RydWN0IHJlcG9ydF9hcmdzIGFyZ3MgPSB7MH07CisJc3RydWN0IHNpbmdsZV9yZXBvcnRfYXJncyAqc2luZ2xlX2FyZ3MgPSAmYXJncy5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX1NJTkdMRV07CisJaW50IGRvX2x2X2luZm8sIGRvX2x2X3NlZ19zdGF0dXM7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGU7CisJaW50IHIgPSAwOworCisJc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID0gc2gtPm9yaWdfcmVwb3J0X3R5cGUgfCBzaC0+cmVwb3J0X3R5cGU7CisJc2luZ2xlX2FyZ3MtPmFyZ3NfYXJlX3B2cyA9IHNoLT5vcmlnX3JlcG9ydF90eXBlID09IFBWUzsKKworCWlmICghX2dldF9maW5hbF9yZXBvcnRfdHlwZSgmYXJncywgc2luZ2xlX2FyZ3MsCisJCQkJICAgIHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSwKKwkJCQkgICAgJmRvX2x2X2luZm8sICZkb19sdl9zZWdfc3RhdHVzLAorCQkJCSAgICAmc2gtPnJlcG9ydF90eXBlKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgcGFyZW50X2hhbmRsZSkpKQorCQlyZXR1cm5fMDsKKworCS8qCisJICogV2UncmUgYWxyZWFkeSByZXBvcnRpbmcgZm9yIHNlbGVjdCBzbyBvdmVycmlkZQorCSAqIGludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0IHRvIDAgYXMgd2UgY2FuIGNhbGwKKwkgKiBwcm9jZXNzX2VhY2hfKiBmdW5jdGlvbnMgYWdhaW4gYW5kIHdlIGNvdWxkCisJICogZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AgaWYgd2UgZGlkbid0IHN0b3AKKwkgKiBpbnRlcm5hbCByZXBvcnRpbmcgZm9yIHNlbGVjdCByaWdodCBoZXJlLgorCSAqCisJICogU28gdGhlIG92ZXJhbGwgY2FsbCB0cmFjZSBmcm9tIHRvcCB0byBib3R0b20gbG9va3MgbGlrZSB0aGlzOgorCSAqCisJICogcHJvY2Vzc19lYWNoXyogKHRvcC1sZXZlbCBvbmUsIHVzaW5nIHByb2Nlc3NpbmdfaGFuZGxlIHdpdGggaW50ZXJuYWwgcmVwb3J0aW5nIGVuYWJsZWQgYW5kIHNlbGVjdGlvbl9oYW5kbGUpIC0+CisJICogICBzZWxlY3RfbWF0Y2hfKihwcm9jZXNzaW5nX2hhbmRsZSB3aXRoIHNlbGVjdGlvbl9oYW5kbGUpIC0+CisJICogICAgIHJlcG9ydCBmb3Igc2VsZWN0aW9uIC0+CisJICogICAgIAkgKGNyZWF0aW5nIG5ldyBwcm9jZXNzaW5nX2hhbmRsZSBoZXJlIHdpdGggaW50ZXJuYWwgcmVwb3J0aW5nIGRpc2FibGVkISEhKQorCSAqICAgICAgIHJlcG9ydGluZ19mbiBPUiBwcm9jZXNzX2VhY2hfKiAodXNpbmcgKm5ldyogcHJvY2Vzc2luZ19oYW5kbGUgd2l0aCBvcmlnaW5hbCBzZWxlY3Rpb25faGFuZGxlKSAKKwkgKgorCSAqIFRoZSBzZWxlY3Rpb25faGFuZGxlIGlzIHN0aWxsIHJldXNlZCBzbyB3ZSBjYW4gdHJhY2sKKwkgKiB3aGV0aGVyIGFueSBvZiB0aGUgaXRlbXMgdGhlIHRvcC1sZXZlbCBvbmUgaXMgY29tcG9zZWQKKwkgKiBvZiBhcmUgc3RpbGwgc2VsZWN0ZWQgb3Igbm90IHVuZXJuZWF0aC4gRG8gbm90IGRlc3Ryb3kKKwkgKiB0aGlzIHNlbGVjdGlvbiBoYW5kbGUgLSBpdCBuZWVkcyB0byBiZSBwYXNzZWQgdG8gdXBwZXIKKwkgKiBsYXllcnMgdG8gY2hlY2sgdGhlIG92ZXJhbGwgc2VsZWN0aW9uIHN0YXR1cy4KKwkgKi8KKwloYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0ID0gMDsKKwloYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUgPSBzaDsKKworCS8qCisJICogUmVtZW1iZXI6CisJICogICBzaC0+b3JpZ19yZXBvcnRfdHlwZSBpcyB0aGUgb3JpZ2luYWwgcmVwb3J0IHR5cGUgcmVxdWVzdGVkICh3aGF0IGFyZSB3ZSBzZWxlY3Rpbmc/IFBWL1ZHL0xWPykKKwkgKiAgIHNoLT5yZXBvcnRfdHlwZSBpcyB0aGUgcmVwb3J0IHR5cGUgYWN0dWFsbHkgdXNlZCAoaXQgY291bnRzIHdpdGggYWxsIHR5cGVzIG9mIGZpZWxkcyB1c2VkIGluIHNlbGVjdGlvbiBjcml0ZXJpYSkKKwkgKi8KKwlzd2l0Y2ggKHNoLT5vcmlnX3JlcG9ydF90eXBlKSB7CisJCWNhc2UgTFZTOgorCQkJciA9IF9yZXBvcnRfYWxsX2luX2x2KGNtZCwgaGFuZGxlLCBsdiwgc2gtPnJlcG9ydF90eXBlLCBkb19sdl9pbmZvLCBkb19sdl9zZWdfc3RhdHVzKTsKKwkJCWJyZWFrOworCQljYXNlIFZHUzoKKwkJCXIgPSBfcmVwb3J0X2FsbF9pbl92ZyhjbWQsIGhhbmRsZSwgdmcsIHNoLT5yZXBvcnRfdHlwZSwgZG9fbHZfaW5mbywgZG9fbHZfc2VnX3N0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBQVlM6CisJCQlyID0gX3JlcG9ydF9hbGxfaW5fcHYoY21kLCBoYW5kbGUsIHB2LCBzaC0+cmVwb3J0X3R5cGUsIGRvX2x2X2luZm8sIGRvX2x2X3NlZ19zdGF0dXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgInJlcG9ydF9mb3Jfc2VsZWN0aW9uOiBpbmNvcnJlY3QgcmVwb3J0IHR5cGUiKTsKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogS2VlcCB0aGUgc2VsZWN0aW9uIGhhbmRsZSBwcm92aWRlZCBmcm9tIHRoZSBjYWxsZXIgLQorCSAqIGRvIG5vdCBkZXN0cm95IGl0IC0gdGhlIGNhbGxlciB3aWxsIHN0aWxsIHVzZSBpdCB0bworCSAqIHBhc3MgdGhlIHJlc3VsdCB0aHJvdWdoIGl0IHRvIGxheWVycyBhYm92ZS4KKwkgKi8KKwloYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUgPSBOVUxMOworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfY2hlY2tfcHZfbGlzdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHJlcG9ydF9hcmdzICphcmdzLCBzdHJ1Y3Qgc2luZ2xlX3JlcG9ydF9hcmdzICpzaW5nbGVfYXJncykKK3sKKwl1bnNpZ25lZCBpOworCWludCByZXNjYW5fZG9uZSA9IDA7CisKKwlpZiAoIWFyZ3MtPmFyZ3YpCisJCXJldHVybjsKKworCXNpbmdsZV9hcmdzLT5hcmdzX2FyZV9wdnMgPSAoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID09IFBWUyB8fAorCQkJCSAgICAgc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID09IExBQkVMIHx8CisJCQkJICAgICBzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgPT0gUFZTRUdTKSA/IDEgOiAwOworCisJaWYgKHNpbmdsZV9hcmdzLT5hcmdzX2FyZV9wdnMgJiYgYXJncy0+YXJnYykgeworCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YXJnYzsgaSsrKSB7CisJCQlpZiAoIXJlc2Nhbl9kb25lICYmICFkZXZfY2FjaGVfZ2V0KGFyZ3MtPmFyZ3ZbaV0sIGNtZC0+ZnVsbF9maWx0ZXIpKSB7CisJCQkJY21kLT5maWx0ZXItPndpcGUoY21kLT5maWx0ZXIpOworCQkJCS8qIEZJWE1FIHNjYW4gb25seSBvbmUgZGV2aWNlICovCisJCQkJbHZtY2FjaGVfbGFiZWxfc2NhbihjbWQpOworCQkJCXJlc2Nhbl9kb25lID0gMTsKKwkJCX0KKwkJCWlmICgqYXJncy0+YXJndltpXSA9PSAnQCcpIHsKKwkJCQkvKgorCQkJCSAqIFRhZ3MgYXJlIG1ldGFkYXRhIHJlbGF0ZWQsIG5vdCBsYWJlbAorCQkJCSAqIHJlbGF0ZWQsIGNoYW5nZSByZXBvcnQgdHlwZSBhY2NvcmRpbmdseSEKKwkJCQkgKi8KKwkJCQlpZiAoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID09IExBQkVMKQorCQkJCQlzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgPSBQVlM7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBjaGFuZ2VkIHRoZSByZXBvcnRfdHlwZSBhbmQgd2UgZGlkIHJlc2NhbiwKKwkJCQkgKiBubyBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBkZXYgbGlzdCBmdXJ0aGVyIC0gbm90aGluZworCQkJCSAqIGVsc2Ugd291bGQgY2hhbmdlLgorCQkJCSAqLworCQkJCWlmIChyZXNjYW5fZG9uZSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9kZWxfb3B0aW9uX2Zyb21fbGlzdChzdHJ1Y3QgZG1fbGlzdCAqc2xsLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBzaXplX3QgcHJlZml4X2xlbiwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBkbV9saXN0ICpzbGg7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwljb25zdCBjaGFyICphID0gc3RyLCAqYjsKKworCWRtX2xpc3RfdW5pdGVyYXRlKHNsaCwgc2xsLCBzbGwpIHsKKwkJc2wgPSBkbV9saXN0X2l0ZW0oc2xoLCBzdHJ1Y3QgZG1fc3RyX2xpc3QpOworCisJCS8qIGV4YWN0IG1hdGNoICovCisJCWlmICghc3RyY21wKHN0ciwgc2wtPnN0cikpIHsKKwkJCWRtX2xpc3RfZGVsKHNsaCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBhbHNvIHRyeSB0byBtYXRjaCB3aXRoIGtub3duIHByZWZpeCAqLworCQliID0gc2wtPnN0cjsKKwkJaWYgKCFzdHJuY21wKHByZWZpeCwgYSwgcHJlZml4X2xlbikpIHsKKwkJCWEgKz0gcHJlZml4X2xlbjsKKwkJCWlmICgqYSA9PSAnXycpCisJCQkJYSsrOworCQl9CisJCWlmICghc3RybmNtcChwcmVmaXgsIGIsIHByZWZpeF9sZW4pKSB7CisJCQliICs9IHByZWZpeF9sZW47CisJCQlpZiAoKmIgPT0gJ18nKQorCQkJCWIrKzsKKwkJfQorCQlpZiAoIXN0cmNtcChhLCBiKSkgeworCQkJZG1fbGlzdF9kZWwoc2xoKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2RlZmluZSBfZ2V0X3JlcG9ydF9pZHgocmVwb3J0X3R5cGUsc2luZ2xlX3JlcG9ydF90eXBlKSBcCisJKCgocmVwb3J0X3R5cGUgIT0gRlVMTCkgJiYgKHJlcG9ydF90eXBlID09IHNpbmdsZV9yZXBvcnRfdHlwZSkpID8gUkVQT1JUX0lEWF9TSU5HTEUgOiBSRVBPUlRfSURYX0ZVTExfICMjIHNpbmdsZV9yZXBvcnRfdHlwZSkKKworc3RhdGljIHJlcG9ydF9pZHhfdCBfZ2V0X3JlcG9ydF9pZHhfZnJvbV9uYW1lKHJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVwb3J0X2lkeF90IGlkeDsKKworCWlmICghbmFtZSB8fCAhKm5hbWUpCisJCXJldHVybiBSRVBPUlRfSURYX05VTEw7CisKKwkvKiBDaGFuZ2UgdG8gYmFzaWMgcmVwb3J0IHR5cGUgZm9yIGNvbXBhcmlzb24uICovCisJaWYgKChyZXBvcnRfdHlwZSA9PSBMQUJFTCkgfHwgKHJlcG9ydF90eXBlID09IFBWU0VHUykpCisJCXJlcG9ydF90eXBlID0gUFZTOworCWVsc2UgaWYgKHJlcG9ydF90eXBlID09IFNFR1MpCisJCXJlcG9ydF90eXBlID0gTFZTOworCisJaWYgKCFzdHJjYXNlY21wKG5hbWUsICJsb2ciKSkKKwkJaWR4ID0gUkVQT1JUX0lEWF9MT0c7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgInZnIikpCisJCWlkeCA9IF9nZXRfcmVwb3J0X2lkeChyZXBvcnRfdHlwZSwgVkdTKTsKKwllbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAicHYiKSkKKwkJaWR4ID0gX2dldF9yZXBvcnRfaWR4KHJlcG9ydF90eXBlLCBQVlMpOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJsdiIpKQorCQlpZHggPSBfZ2V0X3JlcG9ydF9pZHgocmVwb3J0X3R5cGUsIExWUyk7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgInB2c2VnIikpIHsKKwkJaWR4ID0gKHJlcG9ydF90eXBlID09IEZVTEwpID8gX2dldF9yZXBvcnRfaWR4KHJlcG9ydF90eXBlLCBQVlNFR1MpCisJCQkJCSAgICA6IF9nZXRfcmVwb3J0X2lkeChyZXBvcnRfdHlwZSwgUFZTKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJzZWciKSkKKwkJaWR4ID0gKHJlcG9ydF90eXBlID09IEZVTEwpID8gX2dldF9yZXBvcnRfaWR4KHJlcG9ydF90eXBlLCBTRUdTKQorCQkJCQkgICAgOiBfZ2V0X3JlcG9ydF9pZHgocmVwb3J0X3R5cGUsIExWUyk7CisJZWxzZSB7CisJCWlkeCA9IFJFUE9SVF9JRFhfTlVMTDsKKwkJbG9nX2Vycm9yKCJVbmtub253biByZXBvcnQgc3BlY2lmaWVyIGluICIKKwkJCSAgInJlcG9ydCBvcHRpb24gbGlzdDogJXMuIiwgbmFtZSk7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBfc2hvdWxkX3Byb2Nlc3NfcmVwb3J0X2lkeChyZXBvcnRfdHlwZV90IHJlcG9ydF90eXBlLCBpbnQgYWxsb3dfc2luZ2xlLCByZXBvcnRfaWR4X3QgaWR4KQoreworCWlmICgoKGlkeCA9PSBSRVBPUlRfSURYX0xPRykgJiYgKHJlcG9ydF90eXBlICE9IENNRExPRykpIHx8CisJICAgICgoaWR4ID09IFJFUE9SVF9JRFhfU0lOR0xFKSAmJiAhYWxsb3dfc2luZ2xlKSB8fAorCSAgICAoKGlkeCA+PSBSRVBPUlRfSURYX0ZVTExfU1RBUlQpICYmIHJlcG9ydF90eXBlICE9IEZVTEwpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitlbnVtIG9wdHNfbGlzdF90eXBlIHsKKwlPUFRTX1JFUExBQ0UsCisJT1BUU19BREQsCisJT1BUU19SRU1PVkUsCisJT1BUU19DT01QQUNUCit9OworCitzdGF0aWMgaW50IF9nZXRfcmVwb3J0X29wdGlvbnMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IHJlcG9ydF9hcmdzICphcmdzLAorCQkJICAgICAgIHN0cnVjdCBzaW5nbGVfcmVwb3J0X2FyZ3MgKnNpbmdsZV9hcmdzKQoreworCWludCBhY3Rpb247CisJc3RydWN0IGFyZ192YWx1ZV9ncm91cF9saXN0ICpjdXJyZW50X2dyb3VwOworCXN0cnVjdCBkbV9saXN0ICpmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9DT1VOVF07CisJc3RydWN0IGRtX2xpc3QgKm9wdHNfbGlzdCA9IE5VTEw7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCWNvbnN0IGNoYXIgKnJlcG9ydF9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpvcHRzOworCXJlcG9ydF9pZHhfdCBpZHggPSBSRVBPUlRfSURYX1NJTkdMRTsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgb3B0aW9uc19BUkcpKQorCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKKwlpZiAoIShtZW0gPSBkbV9wb29sX2NyZWF0ZSgicmVwb3J0X29wdGlvbnMiLCAxMjgpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IG1lbXBvb2wgdG8gcHJvY2VzcyByZXBvcnQgb3B0aW9ucy4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWlmIChzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgPT0gQ01ETE9HKSB7CisJCWlmICghKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0xPR10gPSBzdHJfdG9fc3RyX2xpc3QobWVtLCBzaW5nbGVfYXJncy0+b3B0aW9ucywgIiwiLCAxKSkpCisJCQlnb3RvX291dDsKKwl9IGVsc2UgaWYgKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSA9PSBGVUxMKSB7CisJCWlmICghKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfVkdTXSA9IHN0cl90b19zdHJfbGlzdChtZW0sIGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9WR1NdLm9wdGlvbnMsICIsIiwgMSkpIHx8CisJCSAgICAhKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfUFZTXSA9IHN0cl90b19zdHJfbGlzdChtZW0sIGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9QVlNdLm9wdGlvbnMsICIsIiwgMSkpIHx8CisJCSAgICAhKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfTFZTXSA9IHN0cl90b19zdHJfbGlzdChtZW0sIGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9MVlNdLm9wdGlvbnMsICIsIiwgMSkpIHx8CisJCSAgICAhKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfUFZTRUdTXSA9IHN0cl90b19zdHJfbGlzdChtZW0sIGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9QVlNFR1NdLm9wdGlvbnMsICIsIiwgMSkpIHx8CisJCSAgICAhKGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfU0VHU10gPSBzdHJfdG9fc3RyX2xpc3QobWVtLCBhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfU0VHU10ub3B0aW9ucywgIiwiLCAxKSkpCisJCQlnb3RvX291dDsKKwl9IGVsc2UgeworCQlpZiAoIShmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9TSU5HTEVdID0gc3RyX3RvX3N0cl9saXN0KG1lbSwgc2luZ2xlX2FyZ3MtPm9wdGlvbnMsICIsIiwgMSkpKQorCQkJZ290b19vdXQ7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN1cnJlbnRfZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJaWYgKCFncm91cGVkX2FyZ19pc19zZXQoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgb3B0aW9uc19BUkcpKQorCQkJY29udGludWU7CisKKwkJaWYgKGdyb3VwZWRfYXJnX2lzX3NldChjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBjb25maWdyZXBvcnRfQVJHKSkgeworCQkJcmVwb3J0X25hbWUgPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgY29uZmlncmVwb3J0X0FSRywgTlVMTCk7CisJCQlpZiAoKGlkeCA9IF9nZXRfcmVwb3J0X2lkeF9mcm9tX25hbWUoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlLCByZXBvcnRfbmFtZSkpID09IFJFUE9SVF9JRFhfTlVMTCkKKwkJCQlnb3RvX291dDsKKwkJfQorCisJCW9wdHMgPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgb3B0aW9uc19BUkcsIE5VTEwpOworCQlpZiAoIW9wdHMgfHwgISpvcHRzKSB7CisJCQlsb2dfZXJyb3IoIkludmFsaWQgb3B0aW9ucyBzdHJpbmc6ICVzIiwgb3B0cyk7CisJCQlyID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN3aXRjaCAoKm9wdHMpIHsKKwkJCWNhc2UgJysnOgorCQkJCWFjdGlvbiA9IE9QVFNfQUREOworCQkJCW9wdHMrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCWFjdGlvbiA9IE9QVFNfUkVNT1ZFOworCQkJCW9wdHMrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyMnOgorCQkJCWFjdGlvbiA9IE9QVFNfQ09NUEFDVDsKKwkJCQlvcHRzKys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWFjdGlvbiA9IE9QVFNfUkVQTEFDRTsKKwkJfQorCisJCWlmICghX3Nob3VsZF9wcm9jZXNzX3JlcG9ydF9pZHgoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlLCAhKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSAmIChDTURMT0cgfCBGVUxMKSksIGlkeCkpCisJCQljb250aW51ZTsKKworCQlpZiAoKGFjdGlvbiAhPSBPUFRTX0NPTVBBQ1QpICYmCisJCSAgICAhKG9wdHNfbGlzdCA9IHN0cl90b19zdHJfbGlzdChtZW0sIG9wdHMsICIsIiwgMSkpKQorCQkJZ290b19vdXQ7CisKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCWNhc2UgT1BUU19BREQ6CisJCQkJZG1fbGlzdF9zcGxpY2UoZmluYWxfb3B0c19saXN0W2lkeF0sIG9wdHNfbGlzdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9QVFNfUkVNT1ZFOgorCQkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgb3B0c19saXN0KQorCQkJCQlfZGVsX29wdGlvbl9mcm9tX2xpc3QoZmluYWxfb3B0c19saXN0W2lkeF0sIGFyZ3MtPnNpbmdsZV9hcmdzW2lkeF0ucmVwb3J0X3ByZWZpeCwKKwkJCQkJCQkgICAgICBzdHJsZW4oYXJncy0+c2luZ2xlX2FyZ3NbaWR4XS5yZXBvcnRfcHJlZml4KSwgc2wtPnN0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9QVFNfQ09NUEFDVDoKKwkJCQlhcmdzLT5zaW5nbGVfYXJnc1tpZHhdLmZpZWxkc190b19jb21wYWN0ID0gb3B0czsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1BUU19SRVBMQUNFOgorCQkJCWZpbmFsX29wdHNfbGlzdFtpZHhdID0gb3B0c19saXN0OworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSA9PSBDTURMT0cpIHsKKwkJaWYgKCEoc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBzdHJfbGlzdF90b19zdHIoY21kLT5tZW0sIGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0xPR10sICIsIikpKQorCQkJZ290b19vdXQ7CisJfSBlbHNlIGlmIChzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgPT0gRlVMTCkgeworCQlpZiAoIShhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfVkdTXS5vcHRpb25zID0gc3RyX2xpc3RfdG9fc3RyKGNtZC0+bWVtLCBmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9GVUxMX1ZHU10sICIsIikpIHx8CisJCSAgICAhKGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9QVlNdLm9wdGlvbnMgPSBzdHJfbGlzdF90b19zdHIoY21kLT5tZW0sIGZpbmFsX29wdHNfbGlzdFtSRVBPUlRfSURYX0ZVTExfUFZTXSwgIiwiKSkgfHwKKwkJICAgICEoYXJncy0+c2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9GVUxMX0xWU10ub3B0aW9ucyA9IHN0cl9saXN0X3RvX3N0cihjbWQtPm1lbSwgZmluYWxfb3B0c19saXN0W1JFUE9SVF9JRFhfRlVMTF9MVlNdLCAiLCIpKSB8fAorCQkgICAgIShhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfUFZTRUdTXS5vcHRpb25zID0gc3RyX2xpc3RfdG9fc3RyKGNtZC0+bWVtLCBmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9GVUxMX1BWU0VHU10sICIsIikpIHx8CisJCSAgICAhKGFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9TRUdTXS5vcHRpb25zID0gc3RyX2xpc3RfdG9fc3RyKGNtZC0+bWVtLCBmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9GVUxMX1NFR1NdLCAiLCIpKSkKKwkJCWdvdG9fb3V0OworCX0gZWxzZSB7CisJCWlmICghKHNpbmdsZV9hcmdzLT5vcHRpb25zID0gc3RyX2xpc3RfdG9fc3RyKGNtZC0+bWVtLCBmaW5hbF9vcHRzX2xpc3RbUkVQT1JUX0lEWF9TSU5HTEVdLCAiLCIpKSkKKwkJCWdvdG9fb3V0OworCX0KKworCXIgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZ2V0X3JlcG9ydF9rZXlzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgIHN0cnVjdCByZXBvcnRfYXJncyAqYXJncywKKwkJCSAgICBzdHJ1Y3Qgc2luZ2xlX3JlcG9ydF9hcmdzICpzaW5nbGVfYXJncykKK3sKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmN1cnJlbnRfZ3JvdXA7CisJY29uc3QgY2hhciAqcmVwb3J0X25hbWUgPSBOVUxMOworCXJlcG9ydF9pZHhfdCBpZHggPSBSRVBPUlRfSURYX1NJTkdMRTsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN1cnJlbnRfZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJaWYgKCFncm91cGVkX2FyZ19pc19zZXQoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgc29ydF9BUkcpKQorCQkJY29udGludWU7CisKKwkJaWYgKGdyb3VwZWRfYXJnX2lzX3NldChjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBjb25maWdyZXBvcnRfQVJHKSkgeworCQkJcmVwb3J0X25hbWUgPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgY29uZmlncmVwb3J0X0FSRywgTlVMTCk7CisJCQlpZiAoKGlkeCA9IF9nZXRfcmVwb3J0X2lkeF9mcm9tX25hbWUoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlLCByZXBvcnRfbmFtZSkpID09IFJFUE9SVF9JRFhfTlVMTCkKKwkJCQlnb3RvX291dDsKKwkJfQorCisJCWlmICghX3Nob3VsZF9wcm9jZXNzX3JlcG9ydF9pZHgoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlLCAhKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSAmIChDTURMT0cgfCBGVUxMKSksIGlkeCkpCisJCQljb250aW51ZTsKKworCQlhcmdzLT5zaW5nbGVfYXJnc1tpZHhdLmtleXMgPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgc29ydF9BUkcsIE5VTEwpOworCX0KKworCXIgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfZG9fcmVwb3J0X2dldF9zZWxlY3Rpb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgIHJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGUsCisJCQkJICAgIGludCBhbGxvd19zaW5nbGUsCisJCQkJICAgIHN0cnVjdCByZXBvcnRfYXJncyAqYXJncywKKwkJCQkgICAgY29uc3QgY2hhciAqKmxhc3Rfc2VsZWN0aW9uKQoreworCXN0cnVjdCBhcmdfdmFsdWVfZ3JvdXBfbGlzdCAqY3VycmVudF9ncm91cDsKKwljb25zdCBjaGFyICpmaW5hbF9zZWxlY3Rpb24gPSBOVUxMLCAqc2VsZWN0aW9uID0gTlVMTDsKKwljb25zdCBjaGFyICpyZXBvcnRfbmFtZSA9IE5VTEw7CisJcmVwb3J0X2lkeF90IGlkeCA9IFJFUE9SVF9JRFhfU0lOR0xFOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN1cnJlbnRfZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJaWYgKCFncm91cGVkX2FyZ19pc19zZXQoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgc2VsZWN0X0FSRykpCisJCQljb250aW51ZTsKKworCQlpZiAoZ3JvdXBlZF9hcmdfaXNfc2V0KGN1cnJlbnRfZ3JvdXAtPmFyZ192YWx1ZXMsIGNvbmZpZ3JlcG9ydF9BUkcpKSB7CisJCQlyZXBvcnRfbmFtZSA9IGdyb3VwZWRfYXJnX3N0cl92YWx1ZShjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBjb25maWdyZXBvcnRfQVJHLCBOVUxMKTsKKwkJCWlmICgoaWR4ID0gX2dldF9yZXBvcnRfaWR4X2Zyb21fbmFtZShyZXBvcnRfdHlwZSwgcmVwb3J0X25hbWUpKSA9PSBSRVBPUlRfSURYX05VTEwpCisJCQkJcmV0dXJuXzA7CisJCX0KKworCQlzZWxlY3Rpb24gPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgc2VsZWN0X0FSRywgTlVMTCk7CisKKwkJaWYgKCFfc2hvdWxkX3Byb2Nlc3NfcmVwb3J0X2lkeChyZXBvcnRfdHlwZSwgYWxsb3dfc2luZ2xlLCBpZHgpKQorCQkJY29udGludWU7CisJCWlmIChhcmdzKQorCQkJYXJncy0+c2luZ2xlX2FyZ3NbaWR4XS5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJCWZpbmFsX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwl9CisKKwlpZiAobGFzdF9zZWxlY3Rpb24pCisJCSpsYXN0X3NlbGVjdGlvbiA9IGZpbmFsX3NlbGVjdGlvbjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9nZXRfcmVwb3J0X3NlbGVjdGlvbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgc3RydWN0IHJlcG9ydF9hcmdzICphcmdzLAorCQkJCSBzdHJ1Y3Qgc2luZ2xlX3JlcG9ydF9hcmdzICpzaW5nbGVfYXJncykKK3sKKwlyZXR1cm4gX2RvX3JlcG9ydF9nZXRfc2VsZWN0aW9uKGNtZCwgc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlLCAhKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSAmIChDTURMT0cgfCBGVUxMKSksCisJCQkJCWFyZ3MsIE5VTEwpID8gRUNNRF9QUk9DRVNTRUQgOiBFQ01EX0ZBSUxFRDsKK30KKworaW50IHJlcG9ydF9nZXRfc2luZ2xlX3NlbGVjdGlvbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgcmVwb3J0X3R5cGVfdCByZXBvcnRfdHlwZSwgY29uc3QgY2hhciAqKnNlbGVjdGlvbikKK3sKKwlyZXR1cm4gX2RvX3JlcG9ydF9nZXRfc2VsZWN0aW9uKGNtZCwgcmVwb3J0X3R5cGUsIDEsIE5VTEwsIHNlbGVjdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lKHN0cnVjdCByZXBvcnRfYXJncyAqYXJncywKKwkJCQkgICAgICAgc3RydWN0IHNpbmdsZV9yZXBvcnRfYXJncyAqc2luZ2xlX2FyZ3MpCit7CisJY29uc3QgY2hhciAqcmVwb3J0X3ByZWZpeCwgKnJlcG9ydF9kZXNjOworCXNpemVfdCBsZW47CisKKwlpZiAoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID09IEZVTEwpIHsKKwkJc2luZ2xlX2FyZ3MtPnJlcG9ydF9wcmVmaXhbMF0gPSAnXDAnOworCQlzaW5nbGVfYXJncy0+cmVwb3J0X25hbWUgPSBzaW5nbGVfYXJncy0+cmVwb3J0X3ByZWZpeDsKKwkJcmV0dXJuIDE7CisJfQorCisJKHZvaWQpIHJlcG9ydF9nZXRfcHJlZml4X2FuZF9kZXNjKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSwKKwkJCQkJICAmcmVwb3J0X3ByZWZpeCwgJnJlcG9ydF9kZXNjKTsKKwlsZW4gPSBzdHJsZW4ocmVwb3J0X3ByZWZpeCk7CisJaWYgKHJlcG9ydF9wcmVmaXhbbGVuIC0gMV0gPT0gJ18nKQorCQlsZW4tLTsKKworCWlmICghbGVuKSB7CisJCWxvZ19lcnJvcihJTlRFUk5BTF9FUlJPUiAiX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lOiBubyBwcmVmaXggIgorCQkJICAiZm91bmQgZm9yIHJlcG9ydCB0eXBlIDB4JXgiLCBzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRtX3N0cm5jcHkoc2luZ2xlX2FyZ3MtPnJlcG9ydF9wcmVmaXgsIHJlcG9ydF9wcmVmaXgsIHNpemVvZihzaW5nbGVfYXJncy0+cmVwb3J0X3ByZWZpeCkpKSB7CisJCWxvZ19lcnJvcigiX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lOiBkbV9zdHJuY3B5IGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisJc2luZ2xlX2FyZ3MtPnJlcG9ydF9wcmVmaXhbbGVuXSA9ICdcMCc7CisKKwlpZiAoYXJncy0+cmVwb3J0X2dyb3VwX3R5cGUgIT0gRE1fUkVQT1JUX0dST1VQX0JBU0lDKQorCQlzaW5nbGVfYXJncy0+cmVwb3J0X25hbWUgPSBzaW5nbGVfYXJncy0+cmVwb3J0X3ByZWZpeDsKKwllbHNlCisJCXNpbmdsZV9hcmdzLT5yZXBvcnRfbmFtZSA9IHJlcG9ydF9kZXNjOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2RvX3JlcG9ydChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgIHN0cnVjdCByZXBvcnRfYXJncyAqYXJncywgc3RydWN0IHNpbmdsZV9yZXBvcnRfYXJncyAqc2luZ2xlX2FyZ3MpCit7CisJdm9pZCAqb3JpZ19jdXN0b21faGFuZGxlID0gaGFuZGxlLT5jdXN0b21faGFuZGxlOworCXJlcG9ydF90eXBlX3QgcmVwb3J0X3R5cGUgPSBzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGU7CisJdm9pZCAqcmVwb3J0X2hhbmRsZSA9IE5VTEw7CisJaW50IGxvY2tfZ2xvYmFsID0gMDsKKwlpbnQgbHZfaW5mb19uZWVkZWQ7CisJaW50IGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZDsKKwlpbnQgcmVwb3J0X2luX2dyb3VwID0gMDsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCisJaWYgKCEocmVwb3J0X2hhbmRsZSA9IHJlcG9ydF9pbml0KGNtZCwgc2luZ2xlX2FyZ3MtPm9wdGlvbnMsIHNpbmdsZV9hcmdzLT5rZXlzLCAmcmVwb3J0X3R5cGUsCisJCQkJCSAgYXJncy0+c2VwYXJhdG9yLCBhcmdzLT5hbGlnbmVkLCBhcmdzLT5idWZmZXJlZCwKKwkJCQkJICBhcmdzLT5oZWFkaW5ncywgYXJncy0+ZmllbGRfcHJlZml4ZXMsIGFyZ3MtPnF1b3RlZCwKKwkJCQkJICBhcmdzLT5jb2x1bW5zX2FzX3Jvd3MsIHNpbmdsZV9hcmdzLT5zZWxlY3Rpb24sIDApKSkKKwkJZ290b19vdXQ7CisKKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSByZXBvcnRfaGFuZGxlOworCisJaWYgKCFfZ2V0X2ZpbmFsX3JlcG9ydF90eXBlKGFyZ3MsIHNpbmdsZV9hcmdzLCByZXBvcnRfdHlwZSwgJmx2X2luZm9fbmVlZGVkLAorCQkJCSAgICAmbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkLCAmcmVwb3J0X3R5cGUpKQorCQlnb3RvX291dDsKKworCWlmICghKGFyZ3MtPmxvZ19vbmx5ICYmIChzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgIT0gQ01ETE9HKSkpIHsKKwkJaWYgKCFkbV9yZXBvcnRfZ3JvdXBfcHVzaChoYW5kbGUtPnJlcG9ydF9ncm91cCwgcmVwb3J0X2hhbmRsZSwgKHZvaWQgKikgc2luZ2xlX2FyZ3MtPnJlcG9ydF9uYW1lKSkKKwkJCWdvdG9fb3V0OworCQlyZXBvcnRfaW5fZ3JvdXAgPSAxOworCX0KKworCS8qCisJICogV2UgbG9jayBWR19HTE9CQUwgdG8gZW5hYmxlIHVzZSBvZiBtZXRhZGF0YSBjYWNoZS4KKwkgKiBUaGlzIGNhbiBwYXVzZSBhbG9uZ2lkZSBwdnNjYW4gb3IgdmdzY2FuIHByb2Nlc3MgZm9yIGEgd2hpbGUuCisJICovCisJaWYgKHNpbmdsZV9hcmdzLT5hcmdzX2FyZV9wdnMgJiYgKHJlcG9ydF90eXBlID09IFBWUyB8fCByZXBvcnRfdHlwZSA9PSBQVlNFR1MpICYmCisJICAgICFsdm1ldGFkX3VzZWQoKSkgeworCQlsb2NrX2dsb2JhbCA9IDE7CisJCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19SRUFELCBOVUxMKSkgeworCQkJbG9nX2Vycm9yKCJVbmFibGUgdG8gb2J0YWluIGdsb2JhbCBsb2NrLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHJlcG9ydF90eXBlKSB7CisJCWNhc2UgREVWVFlQRVM6CisJCQlyID0gX3Byb2Nlc3NfZWFjaF9kZXZ0eXBlKGNtZCwgYXJncy0+YXJnYywgaGFuZGxlKTsKKwkJCWJyZWFrOworCQljYXNlIExWU0lORk86CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBMVlNTVEFUVVM6CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBMVlNJTkZPU1RBVFVTOgorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgTFZTOgorCQkJaWYgKGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnKQorCQkJCXIgPSBfcmVwb3J0X2FsbF9pbl92ZyhjbWQsIGhhbmRsZSwgYXJncy0+ZnVsbF9yZXBvcnRfdmcsIExWUywgbHZfaW5mb19uZWVkZWQsIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCk7CisJCQllbHNlCisJCQkJciA9IHByb2Nlc3NfZWFjaF9sdihjbWQsIGFyZ3MtPmFyZ2MsIGFyZ3MtPmFyZ3YsIE5VTEwsIE5VTEwsIDAsIGhhbmRsZSwKKwkJCQkJCSAgICBsdl9pbmZvX25lZWRlZCAmJiAhbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkID8gJl9sdnNfd2l0aF9pbmZvX3NpbmdsZSA6CisJCQkJCQkgICAgIWx2X2luZm9fbmVlZGVkICYmIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCA/ICZfbHZzX3dpdGhfc3RhdHVzX3NpbmdsZSA6CisJCQkJCQkgICAgbHZfaW5mb19uZWVkZWQgJiYgbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkID8gJl9sdnNfd2l0aF9pbmZvX2FuZF9zdGF0dXNfc2luZ2xlIDoKKwkJCQkJCQkJCQkJCSAmX2x2c19zaW5nbGUpOworCQkJYnJlYWs7CisJCWNhc2UgVkdTOgorCQkJaWYgKGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnKQorCQkJCXIgPSBfcmVwb3J0X2FsbF9pbl92ZyhjbWQsIGhhbmRsZSwgYXJncy0+ZnVsbF9yZXBvcnRfdmcsIFZHUywgbHZfaW5mb19uZWVkZWQsIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCk7CisJCQllbHNlCisJCQkJciA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ3MtPmFyZ2MsIGFyZ3MtPmFyZ3YsIE5VTEwsIE5VTEwsCisJCQkJCQkgICAgMCwgMCwgaGFuZGxlLCAmX3Znc19zaW5nbGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEFCRUw6CisJCQlyID0gcHJvY2Vzc19lYWNoX2xhYmVsKGNtZCwgYXJncy0+YXJnYywgYXJncy0+YXJndiwKKwkJCQkJICAgICAgIGhhbmRsZSwgJl9sYWJlbF9zaW5nbGUpOworCQkJYnJlYWs7CisJCWNhc2UgUFZTOgorCQkJaWYgKGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnKQorCQkJCXIgPSBfcmVwb3J0X2FsbF9pbl92ZyhjbWQsIGhhbmRsZSwgYXJncy0+ZnVsbF9yZXBvcnRfdmcsIFBWUywgbHZfaW5mb19uZWVkZWQsIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCk7CisJCQllbHNlIHsKKwkJCQlpZiAoc2luZ2xlX2FyZ3MtPmFyZ3NfYXJlX3B2cykKKwkJCQkJciA9IHByb2Nlc3NfZWFjaF9wdihjbWQsIGFyZ3MtPmFyZ2MsIGFyZ3MtPmFyZ3YsIE5VTEwsCisJCQkJCQkJICAgIGFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSwgMCwKKwkJCQkJCQkgICAgaGFuZGxlLCAmX3B2c19zaW5nbGUpOworCQkJCWVsc2UKKwkJCQkJciA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ3MtPmFyZ2MsIGFyZ3MtPmFyZ3YsIE5VTEwsIE5VTEwsCisJCQkJCQkJICAgIDAsIDAsIGhhbmRsZSwgJl9wdnNfaW5fdmcpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0VHUzoKKwkJCWlmIChhcmdzLT5mdWxsX3JlcG9ydF92ZykKKwkJCQlyID0gX3JlcG9ydF9hbGxfaW5fdmcoY21kLCBoYW5kbGUsIGFyZ3MtPmZ1bGxfcmVwb3J0X3ZnLCBTRUdTLCBsdl9pbmZvX25lZWRlZCwgbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkKTsKKwkJCWVsc2UKKwkJCQlyID0gcHJvY2Vzc19lYWNoX2x2KGNtZCwgYXJncy0+YXJnYywgYXJncy0+YXJndiwgTlVMTCwgTlVMTCwgMCwgaGFuZGxlLAorCQkJCQkJICAgIGx2X2luZm9fbmVlZGVkICYmICFsdl9zZWdtZW50X3N0YXR1c19uZWVkZWQgPyAmX2x2c2Vnc193aXRoX2luZm9fc2luZ2xlIDoKKwkJCQkJCSAgICAhbHZfaW5mb19uZWVkZWQgJiYgbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkID8gJl9sdnNlZ3Nfd2l0aF9zdGF0dXNfc2luZ2xlIDoKKwkJCQkJCSAgICBsdl9pbmZvX25lZWRlZCAmJiBsdl9zZWdtZW50X3N0YXR1c19uZWVkZWQgPyAmX2x2c2Vnc193aXRoX2luZm9fYW5kX3N0YXR1c19zaW5nbGUgOgorCQkJCQkJCQkJCQkJICZfbHZzZWdzX3NpbmdsZSk7CisJCQlicmVhazsKKwkJY2FzZSBQVlNFR1M6CisJCQlpZiAoYXJncy0+ZnVsbF9yZXBvcnRfdmcpCisJCQkJciA9IF9yZXBvcnRfYWxsX2luX3ZnKGNtZCwgaGFuZGxlLCBhcmdzLT5mdWxsX3JlcG9ydF92ZywgUFZTRUdTLCBsdl9pbmZvX25lZWRlZCwgbHZfc2VnbWVudF9zdGF0dXNfbmVlZGVkKTsKKwkJCWVsc2UgeworCQkJCWlmIChzaW5nbGVfYXJncy0+YXJnc19hcmVfcHZzKQorCQkJCQlyID0gcHJvY2Vzc19lYWNoX3B2KGNtZCwgYXJncy0+YXJnYywgYXJncy0+YXJndiwgTlVMTCwKKwkJCQkJCQkgICAgYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpLCAwLAorCQkJCQkJCSAgICBoYW5kbGUsCisJCQkJCQkJICAgIGx2X2luZm9fbmVlZGVkICYmICFsdl9zZWdtZW50X3N0YXR1c19uZWVkZWQgPyAmX3B2c2Vnc193aXRoX2x2X2luZm9fc2luZ2xlIDoKKwkJCQkJCQkgICAgIWx2X2luZm9fbmVlZGVkICYmIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCA/ICZfcHZzZWdzX3dpdGhfbHZfc3RhdHVzX3NpbmdsZSA6CisJCQkJCQkJICAgIGx2X2luZm9fbmVlZGVkICYmIGx2X3NlZ21lbnRfc3RhdHVzX25lZWRlZCA/ICZfcHZzZWdzX3dpdGhfbHZfaW5mb19hbmRfc3RhdHVzX3NpbmdsZSA6CisJCQkJCQkJCQkJCQkgJl9wdnNlZ3Nfc2luZ2xlKTsKKwkJCQllbHNlCisJCQkJCXIgPSBwcm9jZXNzX2VhY2hfdmcoY21kLCBhcmdzLT5hcmdjLCBhcmdzLT5hcmd2LCBOVUxMLCBOVUxMLAorCQkJCQkJCSAgICAwLCAwLCBoYW5kbGUsICZfcHZzZWdzX2luX3ZnKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZVTEw6CisJCQkvKgorCQkJICogRnVsbCByZXBvcnQncyBzdWJyZXBvcnRzIGFscmVhZHkgY292ZXJlZCBieSBjb21iaW5hdGlvbnMgYWJvdmUgd2l0aCBhcmdzLT5mdWxsX3JlcG9ydF92Zy4KKwkJCSAqIFdlIHNob3VsZG4ndCBzZWUgcmVwb3J0X3R5cGUgPT0gRlVMTCBpbiB0aGlzIGZ1bmN0aW9uLgorCQkJICovCisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9kb19yZXBvcnQ6IGZ1bGwgcmVwb3J0IHJlcXVlc3RlZCBhdCBpbmNvcnJlY3QgbGV2ZWwiKTsKKwkJCWJyZWFrOworCQljYXNlIENNRExPRzoKKwkJCS8qIExvZyBpcyByZXBvcnRlZCB0aHJvdWdob3V0IHRoZSBjb2RlIHZpYSByZXBvcnRfY21kbG9nIGNhbGxzLiAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9kb19yZXBvcnQ6IHVua25vd24gcmVwb3J0IHR5cGUuIik7CisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgcmVwb3J0X2NvbXBhY3Rfb3V0cHV0X0NGRywgTlVMTCkpIHsKKwkJaWYgKCFkbV9yZXBvcnRfY29tcGFjdF9maWVsZHMocmVwb3J0X2hhbmRsZSkpCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBjb21wYWN0IHJlcG9ydCBvdXRwdXQuIik7CisJfSBlbHNlIGlmIChzaW5nbGVfYXJncy0+ZmllbGRzX3RvX2NvbXBhY3QpIHsKKwkJaWYgKCFkbV9yZXBvcnRfY29tcGFjdF9naXZlbl9maWVsZHMocmVwb3J0X2hhbmRsZSwgc2luZ2xlX2FyZ3MtPmZpZWxkc190b19jb21wYWN0KSkKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNvbXBhY3QgZ2l2ZW4gY29sdW1ucyBpbiByZXBvcnQgb3V0cHV0LiIpOworCX0KKworCWlmICghKGFyZ3MtPmxvZ19vbmx5ICYmIChzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUgIT0gQ01ETE9HKSkpCisJCWRtX3JlcG9ydF9vdXRwdXQocmVwb3J0X2hhbmRsZSk7CisKKwlpZiAobG9ja19nbG9iYWwpCisJCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX0dMT0JBTCk7CitvdXQ6CisJaWYgKHJlcG9ydF9oYW5kbGUpIHsKKwkJaWYgKHJlcG9ydF9pbl9ncm91cCAmJiAhZG1fcmVwb3J0X2dyb3VwX3BvcChoYW5kbGUtPnJlcG9ydF9ncm91cCkpCisJCQlzdGFjazsKKwkJZG1fcmVwb3J0X2ZyZWUocmVwb3J0X2hhbmRsZSk7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gb3JpZ19jdXN0b21faGFuZGxlOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9mdWxsX3JlcG9ydF9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcmVwb3J0X2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHJlcG9ydF9hcmdzICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlpbnQgb3JwaGFuID0gaXNfb3JwaGFuX3ZnKHZnLT5uYW1lKTsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCisJaWYgKG9ycGhhbiAmJiAhZG1fbGlzdF9zaXplKCZ2Zy0+cHZzKSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJYXJncy0+ZnVsbF9yZXBvcnRfdmcgPSB2ZzsKKworCWlmICghYXJncy0+bG9nX29ubHkgJiYgIWRtX3JlcG9ydF9ncm91cF9wdXNoKGhhbmRsZS0+cmVwb3J0X2dyb3VwLCBOVUxMLCBOVUxMKSkKKwkJZ290byBvdXQ7CisKKwlpZiAob3JwaGFuKSB7CisJCWlmICgoKHIgPSBfZG9fcmVwb3J0KGNtZCwgaGFuZGxlLCBhcmdzLCAmYXJncy0+c2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9GVUxMX1BWU10pKSAhPSBFQ01EX1BST0NFU1NFRCkgfHwKKwkJICAgICgociA9IF9kb19yZXBvcnQoY21kLCBoYW5kbGUsIGFyZ3MsICZhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfUFZTRUdTXSkpICE9IEVDTURfUFJPQ0VTU0VEKSkKKwkJCXN0YWNrOworCX0gZWxzZSB7CisJCWlmICgoKHIgPSBfZG9fcmVwb3J0KGNtZCwgaGFuZGxlLCBhcmdzLCAmYXJncy0+c2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9GVUxMX1ZHU10pKSAhPSBFQ01EX1BST0NFU1NFRCkgfHwKKwkJICAgICgociA9IF9kb19yZXBvcnQoY21kLCBoYW5kbGUsIGFyZ3MsICZhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfUFZTXSkpICE9IEVDTURfUFJPQ0VTU0VEKSB8fAorCQkgICAgKChyID0gX2RvX3JlcG9ydChjbWQsIGhhbmRsZSwgYXJncywgJmFyZ3MtPnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfRlVMTF9MVlNdKSkgIT0gRUNNRF9QUk9DRVNTRUQpIHx8CisJCSAgICAoKHIgPSBfZG9fcmVwb3J0KGNtZCwgaGFuZGxlLCBhcmdzLCAmYXJncy0+c2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9GVUxMX1BWU0VHU10pKSAhPSBFQ01EX1BST0NFU1NFRCkgfHwKKwkJICAgICgociA9IF9kb19yZXBvcnQoY21kLCBoYW5kbGUsIGFyZ3MsICZhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfU0VHU10pKSAhPSBFQ01EX1BST0NFU1NFRCkpCisJCQlzdGFjazsKKwl9CisKKwlpZiAoIWFyZ3MtPmxvZ19vbmx5ICYmICFkbV9yZXBvcnRfZ3JvdXBfcG9wKGhhbmRsZS0+cmVwb3J0X2dyb3VwKSkKKwkJZ290b19vdXQ7CitvdXQ6CisJYXJncy0+ZnVsbF9yZXBvcnRfdmcgPSBOVUxMOworCXJldHVybiByOworfQorCisjZGVmaW5lIF9zZXRfZnVsbF9yZXBvcnRfc2luZ2xlKGNtZCxhcmdzLHR5cGUsbmFtZSkgXAorCWRvIHsgXAorCQlhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfICMjIHR5cGVdLnJlcG9ydF90eXBlID0gdHlwZTsgXAorCQlhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfICMjIHR5cGVdLmtleXMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF8gIyMgbmFtZSAjIyBfc29ydF9mdWxsX0NGRywgTlVMTCk7IFwKKwkJYXJncy0+c2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9GVUxMXyAjIyB0eXBlXS5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfICMjIG5hbWUgIyMgX2NvbHNfZnVsbF9DRkcsIE5VTEwpOyBcCisJCWlmICghX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lKGFyZ3MsICZhcmdzLT5zaW5nbGVfYXJnc1tSRVBPUlRfSURYX0ZVTExfICMjIHR5cGVdKSkgXAorCQkJcmV0dXJuXzA7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IF9jb25maWdfcmVwb3J0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcmVwb3J0X2FyZ3MgKmFyZ3MsIHN0cnVjdCBzaW5nbGVfcmVwb3J0X2FyZ3MgKnNpbmdsZV9hcmdzKQoreworCWFyZ3MtPmFsaWduZWQgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCByZXBvcnRfYWxpZ25lZF9DRkcsIE5VTEwpOworCWFyZ3MtPmJ1ZmZlcmVkID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgcmVwb3J0X2J1ZmZlcmVkX0NGRywgTlVMTCk7CisJYXJncy0+aGVhZGluZ3MgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCByZXBvcnRfaGVhZGluZ3NfQ0ZHLCBOVUxMKTsKKwlhcmdzLT5zZXBhcmF0b3IgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9zZXBhcmF0b3JfQ0ZHLCBOVUxMKTsKKwlhcmdzLT5maWVsZF9wcmVmaXhlcyA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIHJlcG9ydF9wcmVmaXhlc19DRkcsIE5VTEwpOworCWFyZ3MtPnF1b3RlZCA9IGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIHJlcG9ydF9xdW90ZWRfQ0ZHLCBOVUxMKTsKKwlhcmdzLT5jb2x1bW5zX2FzX3Jvd3MgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCByZXBvcnRfY29sdW1zX2FzX3Jvd3NfQ0ZHLCBOVUxMKTsKKworCS8qIENoZWNrIFBWIHNwZWNpZmljcyBhbmQgZG8gZXh0cmEgY2hhbmdlcy9hY3Rpb25zIGlmIG5lZWRlZC4gKi8KKwlfY2hlY2tfcHZfbGlzdChjbWQsIGFyZ3MsIHNpbmdsZV9hcmdzKTsKKworCWlmICghX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lKGFyZ3MsIHNpbmdsZV9hcmdzKSkKKwkJcmV0dXJuXzA7CisKKwlzd2l0Y2ggKHNpbmdsZV9hcmdzLT5yZXBvcnRfdHlwZSkgeworCQljYXNlIERFVlRZUEVTOgorCQkJc2luZ2xlX2FyZ3MtPmtleXMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9kZXZ0eXBlc19zb3J0X0NGRywgTlVMTCk7CisJCQlpZiAoIWFyZ19pc19zZXQoY21kLCB2ZXJib3NlX0FSRykpCisJCQkJc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9kZXZ0eXBlc19jb2xzX0NGRywgTlVMTCk7CisJCQllbHNlCisJCQkJc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9kZXZ0eXBlc19jb2xzX3ZlcmJvc2VfQ0ZHLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIExWUzoKKwkJCXNpbmdsZV9hcmdzLT5rZXlzID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfbHZzX3NvcnRfQ0ZHLCBOVUxMKTsKKwkJCWlmICghYXJnX2lzX3NldChjbWQsIHZlcmJvc2VfQVJHKSkKKwkJCQlzaW5nbGVfYXJncy0+b3B0aW9ucyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X2x2c19jb2xzX0NGRywgTlVMTCk7CisJCQllbHNlCisJCQkJc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9sdnNfY29sc192ZXJib3NlX0NGRywgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBWR1M6CisJCQlzaW5nbGVfYXJncy0+a2V5cyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X3Znc19zb3J0X0NGRywgTlVMTCk7CisJCQlpZiAoIWFyZ19pc19zZXQoY21kLCB2ZXJib3NlX0FSRykpCisJCQkJc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF92Z3NfY29sc19DRkcsIE5VTEwpOworCQkJZWxzZQorCQkJCXNpbmdsZV9hcmdzLT5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfdmdzX2NvbHNfdmVyYm9zZV9DRkcsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgTEFCRUw6CisJCWNhc2UgUFZTOgorCQkJc2luZ2xlX2FyZ3MtPmtleXMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9wdnNfc29ydF9DRkcsIE5VTEwpOworCQkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgdmVyYm9zZV9BUkcpKQorCQkJCXNpbmdsZV9hcmdzLT5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfcHZzX2NvbHNfQ0ZHLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlzaW5nbGVfYXJncy0+b3B0aW9ucyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X3B2c19jb2xzX3ZlcmJvc2VfQ0ZHLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIFNFR1M6CisJCQlzaW5nbGVfYXJncy0+a2V5cyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X3NlZ3Nfc29ydF9DRkcsIE5VTEwpOworCQkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgdmVyYm9zZV9BUkcpKQorCQkJCXNpbmdsZV9hcmdzLT5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfc2Vnc19jb2xzX0NGRywgTlVMTCk7CisJCQllbHNlCisJCQkJc2luZ2xlX2FyZ3MtPm9wdGlvbnMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9zZWdzX2NvbHNfdmVyYm9zZV9DRkcsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgUFZTRUdTOgorCQkJc2luZ2xlX2FyZ3MtPmtleXMgPSBmaW5kX2NvbmZpZ190cmVlX3N0cihjbWQsIHJlcG9ydF9wdnNlZ3Nfc29ydF9DRkcsIE5VTEwpOworCQkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgdmVyYm9zZV9BUkcpKQorCQkJCXNpbmdsZV9hcmdzLT5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCByZXBvcnRfcHZzZWdzX2NvbHNfQ0ZHLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlzaW5nbGVfYXJncy0+b3B0aW9ucyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X3B2c2Vnc19jb2xzX3ZlcmJvc2VfQ0ZHLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIEZVTEw6CisJCQlfc2V0X2Z1bGxfcmVwb3J0X3NpbmdsZShjbWQsIGFyZ3MsIFZHUywgdmdzKTsKKwkJCV9zZXRfZnVsbF9yZXBvcnRfc2luZ2xlKGNtZCwgYXJncywgTFZTLCBsdnMpOworCQkJX3NldF9mdWxsX3JlcG9ydF9zaW5nbGUoY21kLCBhcmdzLCBQVlMsIHB2cyk7CisJCQlfc2V0X2Z1bGxfcmVwb3J0X3NpbmdsZShjbWQsIGFyZ3MsIFBWU0VHUywgcHZzZWdzKTsKKwkJCV9zZXRfZnVsbF9yZXBvcnRfc2luZ2xlKGNtZCwgYXJncywgU0VHUywgc2Vncyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURMT0c6CisJCQlzaW5nbGVfYXJncy0+a2V5cyA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgbG9nX2NvbW1hbmRfbG9nX3NvcnRfQ0ZHLCBOVUxMKTsKKwkJCXNpbmdsZV9hcmdzLT5vcHRpb25zID0gZmluZF9jb25maWdfdHJlZV9zdHIoY21kLCBsb2dfY29tbWFuZF9sb2dfY29sc19DRkcsIE5VTEwpOworCQkJc2luZ2xlX2FyZ3MtPnNlbGVjdGlvbiA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgbG9nX2NvbW1hbmRfbG9nX3NlbGVjdGlvbl9DRkcsIE5VTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2dfZXJyb3IoSU5URVJOQUxfRVJST1IgIl9yZXBvcnQ6IHVua25vd24gcmVwb3J0IHR5cGUuIik7CisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlICE9IEZVTEwpCisJCXNpbmdsZV9hcmdzLT5maWVsZHNfdG9fY29tcGFjdCA9IGZpbmRfY29uZmlnX3RyZWVfc3RyX2FsbG93X2VtcHR5KGNtZCwgcmVwb3J0X2NvbXBhY3Rfb3V0cHV0X2NvbHNfQ0ZHLCBOVUxMKTsKKworCS8qIElmIC1vIHN1cHBsaWVkIHVzZSBpdCwgZWxzZSB1c2UgZGVmYXVsdCBmb3IgcmVwb3J0X3R5cGUgKi8KKwlpZiAoKF9nZXRfcmVwb3J0X29wdGlvbnMoY21kLCBhcmdzLCBzaW5nbGVfYXJncykgIT0gRUNNRF9QUk9DRVNTRUQpKQorCQlyZXR1cm5fMDsKKworCS8qIC1PIG92ZXJyaWRlcyBkZWZhdWx0IHNvcnQgc2V0dGluZ3MgKi8KKwlpZiAoKF9nZXRfcmVwb3J0X2tleXMoY21kLCBhcmdzLCBzaW5nbGVfYXJncykgIT0gRUNNRF9QUk9DRVNTRUQpKQorCQlyZXR1cm5fMDsKKworCWlmICgoX2dldF9yZXBvcnRfc2VsZWN0aW9uKGNtZCwgYXJncywgc2luZ2xlX2FyZ3MpICE9IEVDTURfUFJPQ0VTU0VEKSkKKwkJcmV0dXJuXzA7CisKKwlhcmdzLT5zZXBhcmF0b3IgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgc2VwYXJhdG9yX0FSRywgYXJncy0+c2VwYXJhdG9yKTsKKwlpZiAoYXJnX2lzX3NldChjbWQsIHNlcGFyYXRvcl9BUkcpKQorCQlhcmdzLT5hbGlnbmVkID0gMDsKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFsaWduZWRfQVJHKSkKKwkJYXJncy0+YWxpZ25lZCA9IDE7CisJaWYgKGFyZ19pc19zZXQoY21kLCB1bmJ1ZmZlcmVkX0FSRykgJiYgIWFyZ19pc19zZXQoY21kLCBzb3J0X0FSRykpCisJCWFyZ3MtPmJ1ZmZlcmVkID0gMDsKKwlpZiAoYXJnX2lzX3NldChjbWQsIG5vaGVhZGluZ3NfQVJHKSkKKwkJYXJncy0+aGVhZGluZ3MgPSAwOworCWlmIChhcmdfaXNfc2V0KGNtZCwgbmFtZXByZWZpeGVzX0FSRykpIHsKKwkJYXJncy0+YWxpZ25lZCA9IDA7CisJCWFyZ3MtPmZpZWxkX3ByZWZpeGVzID0gMTsKKwl9CisJaWYgKGFyZ19pc19zZXQoY21kLCB1bnF1b3RlZF9BUkcpKQorCQlhcmdzLT5xdW90ZWQgPSAwOworCWlmIChhcmdfaXNfc2V0KGNtZCwgcm93c19BUkcpKQorCQlhcmdzLT5jb2x1bW5zX2FzX3Jvd3MgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3JlcG9ydChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCByZXBvcnRfdHlwZV90IHJlcG9ydF90eXBlKQoreworCXN0cnVjdCByZXBvcnRfYXJncyBhcmdzID0gezB9OworCXN0cnVjdCBzaW5nbGVfcmVwb3J0X2FyZ3MgKnNpbmdsZV9hcmdzID0gJmFyZ3Muc2luZ2xlX2FyZ3NbUkVQT1JUX0lEWF9TSU5HTEVdOworCXN0YXRpYyBjaGFyIHJlcG9ydF9uYW1lW10gPSAicmVwb3J0IjsKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZTsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCisJLyoKKwkgKiBJbmNsdWRlIGZvcmVpZ24gVkdzIHRoYXQgY29udGFpbiBhY3RpdmUgTFZzLgorCSAqIFRoYXQgc2hvdWxkbid0IGhhcHBlbiBpbiBnZW5lcmFsLCBidXQgaWYgaXQgZG9lcyBieSBzb21lCisJICogbWlzdGFrZSwgdGhlbiB3ZSB3YW50IHRvIGRpc3BsYXkgdGhvc2UgVkdzIGFuZCBhbGxvdyB0aGUKKwkgKiBMVnMgdG8gYmUgZGVhY3RpdmF0ZWQuCisJICovCisJY21kLT5pbmNsdWRlX2FjdGl2ZV9mb3JlaWduX3ZncyA9IDE7CisKKwlhcmdzLmFyZ2MgPSBhcmdjOworCWFyZ3MuYXJndiA9IGFyZ3Y7CisJc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID0gcmVwb3J0X3R5cGU7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwloYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0ID0gMDsKKwloYW5kbGUtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnMgPSBjbWQtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnM7CisKKwlhcmdzLnJlcG9ydF9ncm91cF90eXBlID0gaGFuZGxlLT5yZXBvcnRfZ3JvdXBfdHlwZTsKKwlhcmdzLmxvZ19vbmx5ID0gaGFuZGxlLT5sb2dfb25seTsKKworCWlmICghX2NvbmZpZ19yZXBvcnQoY21kLCAmYXJncywgc2luZ2xlX2FyZ3MpKSB7CisJCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCFhcmdzLmxvZ19vbmx5ICYmICFkbV9yZXBvcnRfZ3JvdXBfcHVzaChoYW5kbGUtPnJlcG9ydF9ncm91cCwgTlVMTCwgcmVwb3J0X25hbWUpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGFkZCBtYWluIHJlcG9ydCBzZWN0aW9uIHRvIHJlcG9ydCBncm91cC4iKTsKKwkJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID09IEZVTEwpIHsKKwkJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJmFyZ3M7CisJCXIgPSBwcm9jZXNzX2VhY2hfdmcoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLCAwLCAxLCBoYW5kbGUsICZfZnVsbF9yZXBvcnRfc2luZ2xlKTsKKwl9IGVsc2UKKwkJciA9IF9kb19yZXBvcnQoY21kLCBoYW5kbGUsICZhcmdzLCBzaW5nbGVfYXJncyk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGx2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJlcG9ydF90eXBlX3QgdHlwZTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc2VnbWVudHNfQVJHKSkKKwkJdHlwZSA9IFNFR1M7CisJZWxzZQorCQl0eXBlID0gTFZTOworCisJcmV0dXJuIF9yZXBvcnQoY21kLCBhcmdjLCBhcmd2LCB0eXBlKTsKK30KKworaW50IHZncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJldHVybiBfcmVwb3J0KGNtZCwgYXJnYywgYXJndiwgVkdTKTsKK30KKworaW50IHB2cyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJlcG9ydF90eXBlX3QgdHlwZTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc2VnbWVudHNfQVJHKSkKKwkJdHlwZSA9IFBWU0VHUzsKKwllbHNlCisJCXR5cGUgPSBMQUJFTDsKKworCXJldHVybiBfcmVwb3J0KGNtZCwgYXJnYywgYXJndiwgdHlwZSk7Cit9CisKK2ludCBmdWxscmVwb3J0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIF9yZXBvcnQoY21kLCBhcmdjLCBhcmd2LCBGVUxMKTsKK30KKworaW50IGRldnR5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIF9yZXBvcnQoY21kLCBhcmdjLCBhcmd2LCBERVZUWVBFUyk7Cit9CisKKyNkZWZpbmUgUkVQT1JUX0ZPUk1BVF9OQU1FX0JBU0lDICJiYXNpYyIKKyNkZWZpbmUgUkVQT1JUX0ZPUk1BVF9OQU1FX0pTT04gImpzb24iCisKK2ludCByZXBvcnRfZm9ybWF0X2luaXQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGRtX3JlcG9ydF9ncm91cF90eXBlX3QgKnJlcG9ydF9ncm91cF90eXBlLAorCQkgICAgICAgc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqKnJlcG9ydF9ncm91cCwgc3RydWN0IGRtX3JlcG9ydCAqKmxvZ19yaCwKKwkJICAgICAgIGludCAqbG9nX29ubHksIGxvZ19yZXBvcnRfdCAqc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSkKK3sKKwlpbnQgY29uZmlnX3NldCA9IGZpbmRfY29uZmlnX3RyZWVfbm9kZShjbWQsIHJlcG9ydF9vdXRwdXRfZm9ybWF0X0NGRywgTlVMTCkgIT0gTlVMTDsKKwljb25zdCBjaGFyICpjb25maWdfZm9ybWF0X3N0ciA9IGZpbmRfY29uZmlnX3RyZWVfc3RyKGNtZCwgcmVwb3J0X291dHB1dF9mb3JtYXRfQ0ZHLCBOVUxMKTsKKwljb25zdCBjaGFyICpmb3JtYXRfc3RyID0gYXJnX3N0cl92YWx1ZShjbWQsIHJlcG9ydGZvcm1hdF9BUkcsIGNvbmZpZ19zZXQgPyBjb25maWdfZm9ybWF0X3N0ciA6IE5VTEwpOworCWludCByZXBvcnRfY29tbWFuZF9sb2c7CisJc3RydWN0IHJlcG9ydF9hcmdzIGFyZ3MgPSB7MH07CisJc3RydWN0IHNpbmdsZV9yZXBvcnRfYXJncyAqc2luZ2xlX2FyZ3M7CisJc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqbmV3X3JlcG9ydF9ncm91cDsKKwlzdHJ1Y3QgZG1fcmVwb3J0ICp0bXBfbG9nX3JoID0gTlVMTDsKKworCWFyZ3MubG9nX29ubHkgPSBhcmdfaXNfc2V0KGNtZCwgbG9nb25seV9BUkcpIHx8ICpsb2dfcmg7CisJcmVwb3J0X2NvbW1hbmRfbG9nID0gYXJncy5sb2dfb25seSB8fCBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBsb2dfcmVwb3J0X2NvbW1hbmRfbG9nX0NGRywgTlVMTCk7CisKKwlpZiAoIWZvcm1hdF9zdHIgfHwgIXN0cmNtcChmb3JtYXRfc3RyLCBSRVBPUlRfRk9STUFUX05BTUVfQkFTSUMpKSB7CisJCWFyZ3MucmVwb3J0X2dyb3VwX3R5cGUgPSAocmVwb3J0X2NvbW1hbmRfbG9nICYmICFhcmdzLmxvZ19vbmx5KSA/IERNX1JFUE9SVF9HUk9VUF9CQVNJQworCQkJCQkJCQkJCTogRE1fUkVQT1JUX0dST1VQX1NJTkdMRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoZm9ybWF0X3N0ciwgUkVQT1JUX0ZPUk1BVF9OQU1FX0pTT04pKSB7CisJCWFyZ3MucmVwb3J0X2dyb3VwX3R5cGUgPSBETV9SRVBPUlRfR1JPVVBfSlNPTjsKKwl9IGVsc2UgeworCQlsb2dfZXJyb3IoIiVzOiB1bmtub3duIHJlcG9ydCBmb3JtYXQuIiwgZm9ybWF0X3N0cik7CisJCWxvZ19lcnJvcigiU3VwcG9ydGVkIHJlcG9ydCBmb3JtYXRzOiAlcywgJXMuIiwKKwkJCSAgUkVQT1JUX0ZPUk1BVF9OQU1FX0JBU0lDLAorCQkJICBSRVBPUlRfRk9STUFUX05BTUVfSlNPTik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXBvcnRfZ3JvdXBfdHlwZSkKKwkJKnJlcG9ydF9ncm91cF90eXBlID0gYXJncy5yZXBvcnRfZ3JvdXBfdHlwZTsKKwlpZiAobG9nX29ubHkpCisJCSpsb2dfb25seSA9IGFyZ3MubG9nX29ubHk7CisKKwlpZiAoIShuZXdfcmVwb3J0X2dyb3VwID0gZG1fcmVwb3J0X2dyb3VwX2NyZWF0ZShhcmdzLnJlcG9ydF9ncm91cF90eXBlLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHJlcG9ydCBncm91cC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlcG9ydF9jb21tYW5kX2xvZykgeworCQlzaW5nbGVfYXJncyA9ICZhcmdzLnNpbmdsZV9hcmdzW1JFUE9SVF9JRFhfTE9HXTsKKwkJc2luZ2xlX2FyZ3MtPnJlcG9ydF90eXBlID0gQ01ETE9HOworCisJCWlmICghKmxvZ19yaCkgeworCQkJaWYgKCFfY29uZmlnX3JlcG9ydChjbWQsICZhcmdzLCBzaW5nbGVfYXJncykpCisJCQkJZ290b19iYWQ7CisKKwkJCWlmICghKHRtcF9sb2dfcmggPSByZXBvcnRfaW5pdChOVUxMLCBzaW5nbGVfYXJncy0+b3B0aW9ucywgc2luZ2xlX2FyZ3MtPmtleXMsICZzaW5nbGVfYXJncy0+cmVwb3J0X3R5cGUsCisJCQkJCQkJICBhcmdzLnNlcGFyYXRvciwgYXJncy5hbGlnbmVkLCBhcmdzLmJ1ZmZlcmVkLCBhcmdzLmhlYWRpbmdzLAorCQkJCQkJCSAgYXJncy5maWVsZF9wcmVmaXhlcywgYXJncy5xdW90ZWQsIGFyZ3MuY29sdW1uc19hc19yb3dzLAorCQkJCQkJCSAgc2luZ2xlX2FyZ3MtPnNlbGVjdGlvbiwgMSkpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxvZyByZXBvcnQuIik7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgcmV1c2luZyBleGlzdGluZyBsb2cgcmVwb3J0IGhhbmRsZS4KKwkJCSAqIEp1c3QgZ2V0IHJlcG9ydCdzIG5hbWUgYW5kIHByZWZpeCBub3cuCisJCQkgKi8KKwkJCWlmICghX3NldF9yZXBvcnRfcHJlZml4X2FuZF9uYW1lKCZhcmdzLCBzaW5nbGVfYXJncykpCisJCQkJZ290b19iYWQ7CisJCX0KKworCQlpZiAoIShkbV9yZXBvcnRfZ3JvdXBfcHVzaChuZXdfcmVwb3J0X2dyb3VwLCB0bXBfbG9nX3JoID8gOiAqbG9nX3JoLCAodm9pZCAqKSBzaW5nbGVfYXJncy0+cmVwb3J0X25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIGxvZyByZXBvcnQgdG8gcmVwb3J0IGdyb3VwLiIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwkqcmVwb3J0X2dyb3VwID0gbmV3X3JlcG9ydF9ncm91cDsKKwlpZiAodG1wX2xvZ19yaCkKKwkJKmxvZ19yaCA9IHRtcF9sb2dfcmg7CisKKwlpZiAoc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSkgeworCQkqc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisJCWxvZ19zZXRfcmVwb3J0KCpsb2dfcmgpOworCX0KKwlyZXR1cm4gMTsKK2JhZDoKKwlpZiAoIWRtX3JlcG9ydF9ncm91cF9kZXN0cm95KG5ld19yZXBvcnRfZ3JvdXApKQorCQlzdGFjazsKKwlpZiAodG1wX2xvZ19yaCkKKwkJZG1fcmVwb3J0X2ZyZWUodG1wX2xvZ19yaCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsYXN0bG9nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGRtX3JlcG9ydF9ncm91cCAqcmVwb3J0X2dyb3VwID0gTlVMTDsKKwljb25zdCBjaGFyICpzZWxlY3Rpb247CisJaW50IHIgPSBFQ01EX0ZBSUxFRDsKKworCWlmICghY21kLT5sb2dfcmgpIHsKKwkJbG9nX2Vycm9yKCJObyBsb2cgcmVwb3J0IHN0b3JlZC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFyZXBvcnRfZm9ybWF0X2luaXQoY21kLCBOVUxMLCAmcmVwb3J0X2dyb3VwLCAmY21kLT5sb2dfcmgsIE5VTEwsIE5VTEwpKQorCQlnb3RvX291dDsKKworCWlmICghX2RvX3JlcG9ydF9nZXRfc2VsZWN0aW9uKGNtZCwgQ01ETE9HLCAxLCBOVUxMLCAmc2VsZWN0aW9uKSkKKwkJZ290b19vdXQ7CisKKwlpZiAoIWRtX3JlcG9ydF9zZXRfc2VsZWN0aW9uKGNtZC0+bG9nX3JoLCBzZWxlY3Rpb24pKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHNldCBzZWxlY3Rpb24gZm9yIGxvZyByZXBvcnQuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1fcmVwb3J0X291dHB1dChjbWQtPmxvZ19yaCkgfHwKKwkgICAgIWRtX3JlcG9ydF9ncm91cF9wb3AocmVwb3J0X2dyb3VwKSkKKwkJZ290b19vdXQ7CisKKwlyID0gRUNNRF9QUk9DRVNTRUQ7CitvdXQ6CisJaWYgKCFkbV9yZXBvcnRfZ3JvdXBfZGVzdHJveShyZXBvcnRfZ3JvdXApKQorCQlzdGFjazsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3NlZ3R5cGVzLmMgYi90b29scy9zZWd0eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zZWd0eXBlcy5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworaW50IHNlZ3R5cGVzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkgICAgIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCWRpc3BsYXlfc2VndHlwZXMoY21kKTsKKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3N0dWIuaCBiL3Rvb2xzL3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJkMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc3R1Yi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgdW5pbXBsZW1lbnRlZCBcCisJbG9nX2Vycm9yKCJDb21tYW5kIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7IHJldHVybiBFQ01EX0ZBSUxFRAorCisvKmludCBlMmZzYWRtKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHVuaW1wbGVtZW50ZWQqLworaW50IGx2bXNhZGMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgIGludCBhcmdjIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwl1bmltcGxlbWVudGVkOworfQorCitpbnQgbHZtc2FyKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgIGludCBhcmdjIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXVuaW1wbGVtZW50ZWQ7Cit9CisKK2ludCBwdmRhdGEoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgaW50IGFyZ2MgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJICAgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJbG9nX2Vycm9yKCJUaGVyZSdzIG5vICdwdmRhdGEnIGNvbW1hbmQgaW4gTFZNMi4iKTsKKwlsb2dfZXJyb3IoIlVzZSBsdnMsIHB2cywgdmdzIGluc3RlYWQ7IG9yIHVzZSB2Z2NmZ2JhY2t1cCBhbmQgcmVhZCB0aGUgdGV4dCBmaWxlIGJhY2t1cC4iKTsKKwlsb2dfZXJyb3IoIk1ldGFkYXRhIGluIExWTTEgZm9ybWF0IGNhbiBzdGlsbCBiZSBkaXNwbGF5ZWQgdXNpbmcgTFZNMSdzIHB2ZGF0YSBjb21tYW5kLiIpOworCXJldHVybiBFQ01EX0ZBSUxFRDsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGFncy5jIGIvdG9vbHMvdGFncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjRhMzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90YWdzLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworaW50IHRhZ3Moc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCSAgICAgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJZGlzcGxheV90YWdzKGNtZCk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CmRpZmYgLS1naXQgYS90b29scy90b29sLmggYi90b29scy90b29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliMzBiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2wuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBNb3N0IHNvdXJjZSBmaWxlcyBzaG91bGQgaW5jbHVkZSB0aGlzIGZpbGUgb3IgbGliLmggb3IgZG1saWIuaCAqLworCisjaWZuZGVmIF9MVk1fVE9PTF9ICisjZGVmaW5lIF9MVk1fVE9PTF9ICisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKworI2luY2x1ZGUgImNvbmZpZ3VyZS5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNlbmRpZgkvKiBfTFZNX1RPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdG9vbGxpYi5jIGIvdG9vbHMvdG9vbGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sbGliLmMKQEAgLTAsMCArMSw0OTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisjaW5jbHVkZSAiZm9ybWF0MS5oIgorI2luY2x1ZGUgImZvcm1hdC10ZXh0LmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSByZXBvcnRfbG9nX3JldF9jb2RlKHJldF9jb2RlKSByZXBvcnRfY3VycmVudF9vYmplY3RfY21kbG9nKFJFUE9SVF9PQkpFQ1RfQ01ETE9HX05BTUUsIFwKKwkJCQkJcmV0X2NvZGUgPT0gRUNNRF9QUk9DRVNTRUQgPyBSRVBPUlRfT0JKRUNUX0NNRExPR19TVUNDRVNTIFwKKwkJCQkJCQkJICAgOiBSRVBPUlRfT0JKRUNUX0NNRExPR19GQUlMVVJFLCByZXRfY29kZSkKKworc3RydWN0IGRldmljZV9pZF9saXN0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljaGFyIHB2aWRbSURfTEVOICsgMV07Cit9OworCitjb25zdCBjaGFyICpjb21tYW5kX25hbWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQpCit7CisJcmV0dXJuIGNtZC0+Y29tbWFuZC0+bmFtZTsKK30KKworc3RhdGljIHZvaWQgX3NpZ2NobGRfaGFuZGxlcihpbnQgc2lnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXdoaWxlICh3YWl0NCgtMSwgTlVMTCwgV05PSEFORyB8IFdVTlRSQUNFRCwgTlVMTCkgPiAwKSA7Cit9CisKKy8qCisgKiByZXR1cm5zOgorICogLTEgaWYgdGhlIGZvcmsgZmFpbGVkCisgKiAgMCBpZiB0aGUgcGFyZW50CisgKiAgMSBpZiB0aGUgY2hpbGQKKyAqLworaW50IGJlY29tZV9kYWVtb24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBza2lwX2x2bSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBkZXZudWxsW10gPSAiL2Rldi9udWxsIjsKKwlpbnQgbnVsbF9mZDsKKwlwaWRfdCBwaWQ7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3QgPSB7CisJCXtfc2lnY2hsZF9oYW5kbGVyfSwKKwkJLnNhX2ZsYWdzID0gU0FfTk9DTERTVE9QLAorCX07CisKKwlsb2dfdmVyYm9zZSgiRm9ya2luZyBiYWNrZ3JvdW5kIHByb2Nlc3MgZnJvbSBjb21tYW5kOiAlcyIsIGNtZC0+Y21kX2xpbmUpOworCisJc2lnYWN0aW9uKFNJR0NITEQsICZhY3QsIE5VTEwpOworCisJaWYgKCFza2lwX2x2bSkKKwkJaWYgKCFzeW5jX2xvY2FsX2Rldl9uYW1lcyhjbWQpKSB7IC8qIEZsdXNoIG9wcyBhbmQgcmVzZXQgZG0gY29va2llICovCisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBzeW5jIGxvY2FsIGRldmljZXMgYmVmb3JlIGZvcmtpbmcuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCWlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgeworCQlsb2dfZXJyb3IoImZvcmsgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQYXJlbnQgKi8KKwlpZiAocGlkID4gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGlsZCAqLworCWlmIChzZXRzaWQoKSA9PSAtMSkKKwkJbG9nX2Vycm9yKCJCYWNrZ3JvdW5kIHByb2Nlc3MgZmFpbGVkIHRvIHNldHNpZDogJXMiLAorCQkJICBzdHJlcnJvcihlcnJubykpOworCisvKiBTZXQgdGhpcyB0byBhdm9pZCBkaXNjYXJkaW5nIG91dHB1dCBmcm9tIGJhY2tncm91bmQgcHJvY2VzcyAqLworLy8gI2RlZmluZSBERUJVR19DSElMRAorCisjaWZuZGVmIERFQlVHX0NISUxECisJaWYgKChudWxsX2ZkID0gb3BlbihkZXZudWxsLCBPX1JEV1IpKSA9PSAtMSkgeworCQlsb2dfc3lzX2Vycm9yKCJvcGVuIiwgZGV2bnVsbCk7CisJCV9leGl0KEVDTURfRkFJTEVEKTsKKwl9CisKKwlpZiAoKGR1cDIobnVsbF9mZCwgU1RESU5fRklMRU5PKSA8IDApICB8fCAvKiByZW9wZW4gc3RkaW4gKi8KKwkgICAgKGR1cDIobnVsbF9mZCwgU1RET1VUX0ZJTEVOTykgPCAwKSB8fCAvKiByZW9wZW4gc3Rkb3V0ICovCisJICAgIChkdXAyKG51bGxfZmQsIFNUREVSUl9GSUxFTk8pIDwgMCkpIHsgLyogcmVvcGVuIHN0ZGVyciAqLworCQlsb2dfc3lzX2Vycm9yKCJkdXAyIiwgInJlZGlyZWN0Iik7CisJCSh2b2lkKSBjbG9zZShudWxsX2ZkKTsKKwkJX2V4aXQoRUNNRF9GQUlMRUQpOworCX0KKworCWlmIChudWxsX2ZkID4gU1RERVJSX0ZJTEVOTykKKwkJKHZvaWQpIGNsb3NlKG51bGxfZmQpOworCisJaW5pdF92ZXJib3NlKFZFUkJPU0VfQkFTRV9MRVZFTCk7CisjZW5kaWYJLyogREVCVUdfQ0hJTEQgKi8KKworCXN0cm5jcHkoKmNtZC0+YXJndiwgIihsdm0yKSIsIHN0cmxlbigqY21kLT5hcmd2KSk7CisKKwlsdm1ldGFkX2Rpc2Nvbm5lY3QoKTsKKworCWlmICghc2tpcF9sdm0pIHsKKwkJcmVzZXRfbG9ja2luZygpOworCQlsdm1jYWNoZV9kZXN0cm95KGNtZCwgMSwgMSk7CisJCWlmICghbHZtY2FjaGVfaW5pdCgpKQorCQkJLyogRklYTUUgQ2xlYW4gdXAgcHJvcGVybHkgaGVyZSAqLworCQkJX2V4aXQoRUNNRF9GQUlMRUQpOworCX0KKwlkZXZfY2xvc2VfYWxsKCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFN0cmlwIGRldl9kaXIgaWYgcHJlc2VudAorICovCitjb25zdCBjaGFyICpza2lwX2Rldl9kaXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgdW5zaWduZWQgKmRldl9kaXJfZm91bmQpCit7CisJc2l6ZV90IGRldmRpcl9sZW4gPSBzdHJsZW4oY21kLT5kZXZfZGlyKTsKKwljb25zdCBjaGFyICpkbWRpciA9IGRtX2RpcigpICsgZGV2ZGlyX2xlbjsKKwlzaXplX3QgZG1kaXJfbGVuID0gc3RybGVuKGRtZGlyKSwgdmdsdl9zejsKKwljaGFyICp2Z25hbWUsICpsdm5hbWUsICpsYXllciwgKnZnbHY7CisKKwkvKiBGSVhNRSBEbyB0aGlzIHByb3Blcmx5ICovCisJaWYgKCp2Z19uYW1lID09ICcvJykKKwkJd2hpbGUgKHZnX25hbWVbMV0gPT0gJy8nKQorCQkJdmdfbmFtZSsrOworCisJaWYgKHN0cm5jbXAodmdfbmFtZSwgY21kLT5kZXZfZGlyLCBkZXZkaXJfbGVuKSkgeworCQlpZiAoZGV2X2Rpcl9mb3VuZCkKKwkJCSpkZXZfZGlyX2ZvdW5kID0gMDsKKwl9IGVsc2UgeworCQlpZiAoZGV2X2Rpcl9mb3VuZCkKKwkJCSpkZXZfZGlyX2ZvdW5kID0gMTsKKworCQl2Z19uYW1lICs9IGRldmRpcl9sZW47CisJCXdoaWxlICgqdmdfbmFtZSA9PSAnLycpCisJCQl2Z19uYW1lKys7CisKKwkJLyogUmVmb3JtYXQgc3RyaW5nIGlmIC9kZXYvbWFwcGVyIGZvdW5kICovCisJCWlmICghc3RybmNtcCh2Z19uYW1lLCBkbWRpciwgZG1kaXJfbGVuKSAmJiB2Z19uYW1lW2RtZGlyX2xlbl0gPT0gJy8nKSB7CisJCQl2Z19uYW1lICs9IGRtZGlyX2xlbiArIDE7CisJCQl3aGlsZSAoKnZnX25hbWUgPT0gJy8nKQorCQkJCXZnX25hbWUrKzsKKworCQkJaWYgKCFkbV9zcGxpdF9sdm1fbmFtZShjbWQtPm1lbSwgdmdfbmFtZSwgJnZnbmFtZSwgJmx2bmFtZSwgJmxheWVyKSB8fAorCQkJICAgICpsYXllcikgeworCQkJCWxvZ19lcnJvcigic2tpcF9kZXZfZGlyOiBDb3VsZG4ndCBzcGxpdCB1cCBkZXZpY2UgbmFtZSAlcy4iLAorCQkJCQkgIHZnX25hbWUpOworCQkJCXJldHVybiB2Z19uYW1lOworCQkJfQorCQkJdmdsdl9zeiA9IHN0cmxlbih2Z25hbWUpICsgc3RybGVuKGx2bmFtZSkgKyAyOworCQkJaWYgKCEodmdsdiA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHZnbHZfc3opKSB8fAorCQkJICAgIGRtX3NucHJpbnRmKHZnbHYsIHZnbHZfc3osICIlcyVzJXMiLCB2Z25hbWUsCisJCQkJCSpsdm5hbWUgPyAiLyIgOiAiIiwKKwkJCQkJbHZuYW1lKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoInZnL2x2IHN0cmluZyBhbGxvYyBmYWlsZWQuIik7CisJCQkJcmV0dXJuIHZnX25hbWU7CisJCQl9CisJCQlyZXR1cm4gdmdsdjsKKwkJfQorCX0KKworCXJldHVybiB2Z19uYW1lOworfQorCisvKgorICogVGhyZWUgcG9zc2libGUgcmVzdWx0czoKKyAqIGEpIHJldHVybiAwLCBza2lwIDA6IHRha2UgdGhlIFZHLCBhbmQgY21kIHdpbGwgZW5kIGluIHN1Y2Nlc3MKKyAqIGIpIHJldHVybiAwLCBza2lwIDE6IHNraXAgdGhlIFZHLCBhbmQgY21kIHdpbGwgZW5kIGluIHN1Y2Nlc3MKKyAqIGMpIHJldHVybiAxLCBza2lwICo6IHNraXAgdGhlIFZHLCBhbmQgY21kIHdpbGwgZW5kIGluIGZhaWx1cmUKKyAqCisgKiBDYXNlIGIgaXMgdGhlIHNwZWNpYWwgY2FzZSwgYW5kIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6CisgKiAuIFRoZSBWRyBpcyBpbmNvbnNpc3RlbnQsIGFuZCB0aGUgY29tbWFuZCBhbGxvd3MgZm9yIGluY29uc2lzdGVudCBWR3MuCisgKiAuIFRoZSBWRyBpcyBjbHVzdGVyZWQsIHRoZSBob3N0IGNhbm5vdCBhY2Nlc3MgY2x1c3RlcmVkIFZHJ3MsCisgKiAgIGFuZCB0aGUgY29tbWFuZCBvcHRpb24gaGFzIGJlZW4gdXNlZCB0byBpZ25vcmUgY2x1c3RlcmVkIHZncy4KKyAqCisgKiBDYXNlIGMgY292ZXJzIHRoZSBvdGhlciBlcnJvcnMgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBWRy4KKyAqICAgSWYgKnNraXAgaXMgMSwgaXQncyBPSyBmb3IgdGhlIGNhbGxlciB0byByZWFkIHRoZSBsaXN0IG9mIFBWcyBpbiB0aGUgVkcuCisgKi8KK3N0YXRpYyBpbnQgX2lnbm9yZV92ZyhzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ192Z25hbWVzLCB1aW50MzJfdCByZWFkX2ZsYWdzLAorCQkgICAgICBpbnQgKnNraXAsIGludCAqbm90Zm91bmQpCit7CisJdWludDMyX3QgcmVhZF9lcnJvciA9IHZnX3JlYWRfZXJyb3IodmcpOworCisJKnNraXAgPSAwOworCSpub3Rmb3VuZCA9IDA7CisKKwlpZiAoKHJlYWRfZXJyb3IgJiBGQUlMRURfTk9URk9VTkQpICYmIChyZWFkX2ZsYWdzICYgUkVBRF9PS19OT1RGT1VORCkpIHsKKwkJKm5vdGZvdW5kID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChyZWFkX2Vycm9yICYgRkFJTEVEX0lOQ09OU0lTVEVOVCkgJiYgKHJlYWRfZmxhZ3MgJiBSRUFEX0FMTE9XX0lOQ09OU0lTVEVOVCkpCisJCXJlYWRfZXJyb3IgJj0gfkZBSUxFRF9JTkNPTlNJU1RFTlQ7IC8qIENoZWNrIGZvciBvdGhlciBlcnJvcnMgKi8KKworCWlmICgocmVhZF9lcnJvciAmIEZBSUxFRF9DTFVTVEVSRUQpICYmIHZnLT5jbWQtPmlnbm9yZV9jbHVzdGVyZWRfdmdzKSB7CisJCXJlYWRfZXJyb3IgJj0gfkZBSUxFRF9DTFVTVEVSRUQ7IC8qIENoZWNrIGZvciBvdGhlciBlcnJvcnMgKi8KKwkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIHZvbHVtZSBncm91cCAlcyIsIHZnX25hbWUpOworCQkqc2tpcCA9IDE7CisJfQorCisJLyoKKwkgKiBDb21tYW5kcyB0aGF0IG9wZXJhdGUgb24gImFsbCB2Z3MiIHNob3VsZG4ndCBiZSBib3RoZXJlZCBieQorCSAqIHNraXBwaW5nIGEgZm9yZWlnbiBWRywgYW5kIHRoZSBjb21tYW5kIHNob3VsZG4ndCBmYWlsIHdoZW4KKwkgKiBvbmUgaXMgc2tpcHBlZC4gIEJ1dCwgaWYgdGhlIGNvbW1hbmQgZXhwbGljaXRseSBhc2tlZCB0bworCSAqIG9wZXJhdGUgb24gYSBmb3JlaWduIFZHIGFuZCBpdCdzIHNraXBwZWQsIHRoZW4gdGhlIGNvbW1hbmQKKwkgKiB3b3VsZCBleHBlY3QgdG8gZmFpbC4KKwkgKi8KKwlpZiAocmVhZF9lcnJvciAmIEZBSUxFRF9TWVNURU1JRCkgeworCQlpZiAoYXJnX3ZnbmFtZXMgJiYgc3RyX2xpc3RfbWF0Y2hfaXRlbShhcmdfdmduYW1lcywgdmctPm5hbWUpKSB7CisJCQlsb2dfZXJyb3IoIkNhbm5vdCBhY2Nlc3MgVkcgJXMgd2l0aCBzeXN0ZW0gSUQgJXMgd2l0aCAlc2xvY2FsIHN5c3RlbSBJRCVzJXMuIiwKKwkJCQkgIHZnLT5uYW1lLCB2Zy0+c3lzdGVtX2lkLCB2Zy0+Y21kLT5zeXN0ZW1faWQgPyAiIiA6ICJ1bmtub3duICIsCisJCQkJICB2Zy0+Y21kLT5zeXN0ZW1faWQgPyAiICIgOiAiIiwgdmctPmNtZC0+c3lzdGVtX2lkID8gdmctPmNtZC0+c3lzdGVtX2lkIDogIiIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlyZWFkX2Vycm9yICY9IH5GQUlMRURfU1lTVEVNSUQ7IC8qIENoZWNrIGZvciBvdGhlciBlcnJvcnMgKi8KKwkJCWxvZ192ZXJib3NlKCJTa2lwcGluZyBmb3JlaWduIHZvbHVtZSBncm91cCAlcyIsIHZnX25hbWUpOworCQkJKnNraXAgPSAxOworCQl9CisJfQorCisJLyoKKwkgKiBBY2Nlc3NpbmcgYSBsb2NrZCBWRyB3aGVuIGx2bWxvY2tkIGlzIG5vdCB1c2VkIGlzIHNpbWlsYXIKKwkgKiB0byBhY2Nlc3NpbmcgYSBmb3JlaWduIFZHLgorCSAqIFRoaXMgaXMgYWxzbyB0aGUgcG9pbnQgd2hlcmUgYSBjb21tYW5kIGZhaWxzIGlmIGl0IGZhaWxlZAorCSAqIHRvIGFjcXVpcmUgdGhlIG5lY2Vzc2FyeSBsb2NrIGZyb20gbHZtbG9ja2QuCisJICogVGhlIHR3byBjYXNlcyBhcmUgZGlzdGluZ3Vpc2hlZCBieSBGQUlMRURfTE9DS19UWVBFICh0aGUKKwkgKiBWRyBsb2NrX3R5cGUgcmVxdWlyZXMgbHZtbG9ja2QpLCBhbmQgRkFJTEVEX0xPQ0tfTU9ERSAodGhlCisJICogY29tbWFuZCBmYWlsZWQgdG8gYWNxdWlyZSB0aGUgbmVjZXNzYXJ5IGxvY2suKQorCSAqLworCWlmIChyZWFkX2Vycm9yICYgKEZBSUxFRF9MT0NLX1RZUEUgfCBGQUlMRURfTE9DS19NT0RFKSkgeworCQlpZiAoYXJnX3ZnbmFtZXMgJiYgc3RyX2xpc3RfbWF0Y2hfaXRlbShhcmdfdmduYW1lcywgdmctPm5hbWUpKSB7CisJCQlpZiAocmVhZF9lcnJvciAmIEZBSUxFRF9MT0NLX1RZUEUpCisJCQkJbG9nX2Vycm9yKCJDYW5ub3QgYWNjZXNzIFZHICVzIHdpdGggbG9jayB0eXBlICVzIHRoYXQgcmVxdWlyZXMgbHZtbG9ja2QuIiwKKwkJCQkJICB2Zy0+bmFtZSwgdmctPmxvY2tfdHlwZSk7CisJCQkvKiBGb3IgRkFJTEVEX0xPQ0tfTU9ERSwgdGhlIGVycm9yIGlzIHByaW50ZWQgaW4gdmdfcmVhZC4gKi8KKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJcmVhZF9lcnJvciAmPSB+RkFJTEVEX0xPQ0tfVFlQRTsgLyogQ2hlY2sgZm9yIG90aGVyIGVycm9ycyAqLworCQkJcmVhZF9lcnJvciAmPSB+RkFJTEVEX0xPQ0tfTU9ERTsKKwkJCWxvZ192ZXJib3NlKCJTa2lwcGluZyB2b2x1bWUgZ3JvdXAgJXMiLCB2Z19uYW1lKTsKKwkJCSpza2lwID0gMTsKKwkJfQorCX0KKworCWlmIChyZWFkX2Vycm9yID09IEZBSUxFRF9DTFVTVEVSRUQpIHsKKwkJKnNraXAgPSAxOworCQlzdGFjazsJLyogRXJyb3IgYWxyZWFkeSBsb2dnZWQgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHJlYWRfZXJyb3IgIT0gU1VDQ0VTUykgeworCQkqc2tpcCA9IDA7CisJCWlmIChpc19vcnBoYW5fdmcodmdfbmFtZSkpCisJCQlsb2dfZXJyb3IoIkNhbm5vdCBwcm9jZXNzIHN0YW5kYWxvbmUgcGh5c2ljYWwgdm9sdW1lcyIpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIkNhbm5vdCBwcm9jZXNzIHZvbHVtZSBncm91cCAlcyIsIHZnX25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb25hIHVwZGF0ZXMgdGhlICJzZWxlY3RlZCIgYXJnIG9ubHkgaWYgbGFzdCBpdGVtIHByb2Nlc3NlZAorICogaXMgc2VsZWN0ZWQgc28gdGhpcyBpbXBsZW1lbnRzIHRoZSAid2hvbGUgc3RydWN0dXJlIGlzIHNlbGVjdGVkIGlmCisgKiBhdCBsZWFzdCBvbmUgb2YgaXRzIGl0ZW1zIGlzIHNlbGVjdGVkIi4KKyAqLworc3RhdGljIHZvaWQgX3VwZGF0ZV9zZWxlY3Rpb25fcmVzdWx0KHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLCBpbnQgKnNlbGVjdGVkKQoreworCWlmICghaGFuZGxlIHx8ICFoYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUpCisJCXJldHVybjsKKworCWlmIChoYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUtPnNlbGVjdGVkKQorCQkqc2VsZWN0ZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBfc2V0X2ZpbmFsX3NlbGVjdGlvbl9yZXN1bHQoc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsIGludCBzZWxlY3RlZCkKK3sKKwlpZiAoIWhhbmRsZSB8fCAhaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlKQorCQlyZXR1cm47CisKKwloYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUtPnNlbGVjdGVkID0gc2VsZWN0ZWQ7Cit9CisKKy8qCisgKiBNZXRhZGF0YSBpdGVyYXRpb24gZnVuY3Rpb25zCisgKi8KK2ludCBwcm9jZXNzX2VhY2hfc2VnbWVudF9pbl9wdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgICBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwKKwkJCSAgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgICBwcm9jZXNzX3NpbmdsZV9wdnNlZ19mbl90IHByb2Nlc3Nfc2luZ2xlX3B2c2VnKQoreworCXN0cnVjdCBwdl9zZWdtZW50ICpwdnNlZzsKKwlpbnQgd2hvbGVfc2VsZWN0ZWQgPSAwOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgcHZfc2VnbWVudCBfZnJlZV9wdl9zZWdtZW50ID0geyAucHYgPSBwdiB9OworCisJaWYgKGRtX2xpc3RfZW1wdHkoJnB2LT5zZWdtZW50cykpIHsKKwkJcmV0ID0gcHJvY2Vzc19zaW5nbGVfcHZzZWcoY21kLCBOVUxMLCAmX2ZyZWVfcHZfc2VnbWVudCwgaGFuZGxlKTsKKwkJaWYgKHJldCAhPSBFQ01EX1BST0NFU1NFRCkKKwkJCXN0YWNrOworCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCXJldF9tYXggPSByZXQ7CisJfSBlbHNlIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2c2VnLCAmcHYtPnNlZ21lbnRzKSB7CisJCQlpZiAoc2lnaW50X2NhdWdodCgpKQorCQkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCQkJcmV0ID0gcHJvY2Vzc19zaW5nbGVfcHZzZWcoY21kLCB2ZywgcHZzZWcsIGhhbmRsZSk7CisJCQlfdXBkYXRlX3NlbGVjdGlvbl9yZXN1bHQoaGFuZGxlLCAmd2hvbGVfc2VsZWN0ZWQpOworCQkJaWYgKHJldCAhPSBFQ01EX1BST0NFU1NFRCkKKwkJCQlzdGFjazsKKwkJCWlmIChyZXQgPiByZXRfbWF4KQorCQkJCXJldF9tYXggPSByZXQ7CisJCX0KKwl9CisKKwkvKiB0aGUgUFYgaXMgc2VsZWN0ZWQgaWYgYXQgbGVhc3Qgb25lIFBWIHNlZ21lbnQgaXMgc2VsZWN0ZWQgKi8KKwlfc2V0X2ZpbmFsX3NlbGVjdGlvbl9yZXN1bHQoaGFuZGxlLCB3aG9sZV9zZWxlY3RlZCk7CisJcmV0dXJuIHJldF9tYXg7Cit9CisKK2ludCBwcm9jZXNzX2VhY2hfc2VnbWVudF9pbl9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgIHByb2Nlc3Nfc2luZ2xlX3NlZ19mbl90IHByb2Nlc3Nfc2luZ2xlX3NlZykKK3sKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCWludCB3aG9sZV9zZWxlY3RlZCA9IDA7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKwlpbnQgcmV0OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQlpZiAoc2lnaW50X2NhdWdodCgpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3NlZyhjbWQsIHNlZywgaGFuZGxlKTsKKwkJX3VwZGF0ZV9zZWxlY3Rpb25fcmVzdWx0KGhhbmRsZSwgJndob2xlX3NlbGVjdGVkKTsKKwkJaWYgKHJldCAhPSBFQ01EX1BST0NFU1NFRCkKKwkJCXN0YWNrOworCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCXJldF9tYXggPSByZXQ7CisJfQorCisJLyogdGhlIExWIGlzIHNlbGVjdGVkIGlmIGF0IGxlYXN0IG9uZSBMViBzZWdtZW50IGlzIHNlbGVjdGVkICovCisJX3NldF9maW5hbF9zZWxlY3Rpb25fcmVzdWx0KGhhbmRsZSwgd2hvbGVfc2VsZWN0ZWQpOworCXJldHVybiByZXRfbWF4OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX2V4dHJhY3RfdmduYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdl9uYW1lLAorCQkJCSAgIGNvbnN0IGNoYXIgKiphZnRlcikKK3sKKwljb25zdCBjaGFyICp2Z19uYW1lID0gbHZfbmFtZTsKKwljaGFyICpzdCwgKnBvczsKKworCS8qIFN0cmlwIGRldl9kaXIgKG9wdGlvbmFsKSAqLworCWlmICghKHZnX25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCB2Z19uYW1lLCBOVUxMKSkpCisJCXJldHVybl8wOworCisJLyogUmVxdWlyZSBleGFjdGx5IG9uZSBzZXQgb2YgY29uc2VjdXRpdmUgc2xhc2hlcyAqLworCWlmICgoc3QgPSBwb3MgPSBzdHJjaHIodmdfbmFtZSwgJy8nKSkpCisJCXdoaWxlICgqc3QgPT0gJy8nKQorCQkJc3QrKzsKKworCWlmICghc3QgfHwgc3RyY2hyKHN0LCAnLycpKSB7CisJCWxvZ19lcnJvcigiXCIlc1wiOiBJbnZhbGlkIHBhdGggZm9yIExvZ2ljYWwgVm9sdW1lLiIsCisJCQkgIGx2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISh2Z19uYW1lID0gZG1fcG9vbF9zdHJuZHVwKGNtZC0+bWVtLCB2Z19uYW1lLCBwb3MgLSB2Z19uYW1lKSkpIHsKKwkJbG9nX2Vycm9yKCJBbGxvY2F0aW9uIG9mIHZnX25hbWUgZmFpbGVkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYWZ0ZXIpCisJCSphZnRlciA9IHN0OworCisJcmV0dXJuIHZnX25hbWU7Cit9CisKKy8qCisgKiBFeHRyYWN0IGRlZmF1bHQgdm9sdW1lIGdyb3VwIG5hbWUgZnJvbSBlbnZpcm9ubWVudAorICovCitzdGF0aWMgY29uc3QgY2hhciAqX2RlZmF1bHRfdmduYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCWNvbnN0IGNoYXIgKnZnX3BhdGg7CisKKwkvKiBUYWtlIGRlZmF1bHQgVkcgZnJvbSBlbnZpcm9ubWVudD8gKi8KKwl2Z19wYXRoID0gZ2V0ZW52KCJMVk1fVkdfTkFNRSIpOworCWlmICghdmdfcGF0aCkKKwkJcmV0dXJuIDA7CisKKwl2Z19wYXRoID0gc2tpcF9kZXZfZGlyKGNtZCwgdmdfcGF0aCwgTlVMTCk7CisKKwlpZiAoc3RyY2hyKHZnX3BhdGgsICcvJykpIHsKKwkJbG9nX2Vycm9yKCJcIiVzXCI6IEludmFsaWQgZW52aXJvbm1lbnQgdmFyIExWTV9WR19OQU1FIHNldCBmb3IgVm9sdW1lIEdyb3VwLiIsCisJCQkgIHZnX3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnX3BhdGgpOworfQorCisvKgorICogRGV0ZXJtaW5lIHZvbHVtZSBncm91cCBuYW1lIGZyb20gYSBsb2dpY2FsIHZvbHVtZSBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKmV4dHJhY3RfdmduYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdl9uYW1lKQoreworCWNvbnN0IGNoYXIgKnZnX25hbWUgPSBsdl9uYW1lOworCisJLyogUGF0aCBzdXBwbGllZD8gKi8KKwlpZiAodmdfbmFtZSAmJiBzdHJjaHIodmdfbmFtZSwgJy8nKSkgeworCQlpZiAoISh2Z19uYW1lID0gX2V4dHJhY3RfdmduYW1lKGNtZCwgbHZfbmFtZSwgTlVMTCkpKQorCQkJcmV0dXJuX05VTEw7CisKKwkJcmV0dXJuIHZnX25hbWU7CisJfQorCisJaWYgKCEodmdfbmFtZSA9IF9kZWZhdWx0X3ZnbmFtZShjbWQpKSkgeworCQlpZiAobHZfbmFtZSkKKwkJCWxvZ19lcnJvcigiUGF0aCByZXF1aXJlZCBmb3IgTG9naWNhbCBWb2x1bWUgXCIlc1wiLiIsCisJCQkJICBsdl9uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHZnX25hbWU7Cit9CisKKy8qCisgKiBQcm9jZXNzIHBoeXNpY2FsIGV4dGVudCByYW5nZSBzcGVjaWZpZXJzCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9wZV9yYW5nZShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBjb25zdCBjaGFyICpwdm5hbWUsCisJCQkgc3RydWN0IGRtX2xpc3QgKnBlX3JhbmdlcywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCBwZV9yYW5nZSAqcGVyOworCisJbG9nX2RlYnVnKCJBZGRpbmcgUEUgcmFuZ2U6IHN0YXJ0IFBFICUiIFBSSXUzMiAiIGxlbmd0aCAlIiBQUkl1MzIKKwkJICAiIG9uICVzLiIsIHN0YXJ0LCBjb3VudCwgcHZuYW1lKTsKKworCS8qIEVuc3VyZSBubyBvdmVybGFwIHdpdGggZXhpc3RpbmcgYXJlYXMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGVyLCBwZV9yYW5nZXMpIHsKKwkJaWYgKCgoc3RhcnQgPCBwZXItPnN0YXJ0KSAmJiAoc3RhcnQgKyBjb3VudCAtIDEgPj0gcGVyLT5zdGFydCkpIHx8CisJCSAgICAoKHN0YXJ0ID49IHBlci0+c3RhcnQpICYmCisJCQkocGVyLT5zdGFydCArIHBlci0+Y291bnQgLSAxKSA+PSBzdGFydCkpIHsKKwkJCWxvZ19lcnJvcigiT3ZlcmxhcHBpbmcgUEUgcmFuZ2VzIHNwZWNpZmllZCAoJSIgUFJJdTMyCisJCQkJICAiLSUiIFBSSXUzMiAiLCAlIiBQUkl1MzIgIi0lIiBQUkl1MzIgIikiCisJCQkJICAiIG9uICVzLiIsCisJCQkJICBzdGFydCwgc3RhcnQgKyBjb3VudCAtIDEsIHBlci0+c3RhcnQsCisJCQkJICBwZXItPnN0YXJ0ICsgcGVyLT5jb3VudCAtIDEsIHB2bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghKHBlciA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKnBlcikpKSkgeworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgbGlzdCBmYWlsZWQuIik7CisJCXJldHVybiAwOworCX0KKworCXBlci0+c3RhcnQgPSBzdGFydDsKKwlwZXItPmNvdW50ID0gY291bnQ7CisJZG1fbGlzdF9hZGQocGVfcmFuZ2VzLCAmcGVyLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF94c3RydG91aW50MzIoY29uc3QgY2hhciAqcywgY2hhciAqKnAsIGludCBiYXNlLCB1aW50MzJfdCAqcmVzdWx0KQoreworCXVuc2lnbmVkIGxvbmcgdWw7CisKKwllcnJubyA9IDA7CisJdWwgPSBzdHJ0b3VsKHMsIHAsIGJhc2UpOworCisJaWYgKGVycm5vIHx8ICpwID09IHMgfHwgdWwgPiBVSU5UMzJfTUFYKQorCQlyZXR1cm4gMDsKKworCSpyZXN1bHQgPSB1bDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wYXJzZV9wZXMoc3RydWN0IGRtX3Bvb2wgKm1lbSwgY2hhciAqYywgc3RydWN0IGRtX2xpc3QgKnBlX3JhbmdlcywKKwkJICAgICAgY29uc3QgY2hhciAqcHZuYW1lLCB1aW50MzJfdCBzaXplKQoreworCWNoYXIgKmVuZHB0cjsKKwl1aW50MzJfdCBzdGFydCwgZW5kLCBsZW47CisKKwkvKiBEZWZhdWx0IHRvIHdob2xlIFBWICovCisJaWYgKCFjKSB7CisJCWlmICghX2FkZF9wZV9yYW5nZShtZW0sIHB2bmFtZSwgcGVfcmFuZ2VzLCBVSU5UMzJfQygwKSwgc2l6ZSkpCisJCQlyZXR1cm5fMDsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKCpjKSB7CisJCWlmICgqYyAhPSAnOicpCisJCQlnb3RvIGVycm9yOworCisJCWMrKzsKKworCQkvKiBEaXNhbGxvdyA6OiBhbmQgOlwwICovCisJCWlmICgqYyA9PSAnOicgfHwgISpjKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEZWZhdWx0IHRvIHdob2xlIHJhbmdlICovCisJCXN0YXJ0ID0gVUlOVDMyX0MoMCk7CisJCWVuZCA9IHNpemUgLSAxOworCisJCS8qIFN0YXJ0IGV4dGVudCBnaXZlbj8gKi8KKwkJaWYgKGlzZGlnaXQoKmMpKSB7CisJCQlpZiAoIV94c3RydG91aW50MzIoYywgJmVuZHB0ciwgMTAsICZzdGFydCkpCisJCQkJZ290byBlcnJvcjsKKwkJCWMgPSBlbmRwdHI7CisJCQkvKiBKdXN0IG9uZSBudW1iZXIgZ2l2ZW4/ICovCisJCQlpZiAoISpjIHx8ICpjID09ICc6JykKKwkJCQllbmQgPSBzdGFydDsKKwkJfQorCQkvKiBSYW5nZT8gKi8KKwkJaWYgKCpjID09ICctJykgeworCQkJYysrOworCQkJaWYgKGlzZGlnaXQoKmMpKSB7CisJCQkJaWYgKCFfeHN0cnRvdWludDMyKGMsICZlbmRwdHIsIDEwLCAmZW5kKSkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQljID0gZW5kcHRyOworCQkJfQorCQl9IGVsc2UgaWYgKCpjID09ICcrJykgewkvKiBMZW5ndGg/ICovCisJCQljKys7CisJCQlpZiAoaXNkaWdpdCgqYykpIHsKKwkJCQlpZiAoIV94c3RydG91aW50MzIoYywgJmVuZHB0ciwgMTAsICZsZW4pKQorCQkJCQlnb3RvIGVycm9yOworCQkJCWMgPSBlbmRwdHI7CisJCQkJZW5kID0gc3RhcnQgKyAobGVuID8gKGxlbiAtIDEpIDogMCk7CisJCQl9CisJCX0KKworCQlpZiAoKmMgJiYgKmMgIT0gJzonKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoKHN0YXJ0ID4gZW5kKSB8fCAoZW5kID4gc2l6ZSAtIDEpKSB7CisJCQlsb2dfZXJyb3IoIlBFIHJhbmdlIGVycm9yOiBzdGFydCBleHRlbnQgJSIgUFJJdTMyICIgdG8gIgorCQkJCSAgImVuZCBleHRlbnQgJSIgUFJJdTMyICIuIiwgc3RhcnQsIGVuZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghX2FkZF9wZV9yYW5nZShtZW0sIHB2bmFtZSwgcGVfcmFuZ2VzLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKSkKKwkJCXJldHVybl8wOworCisJfQorCisJcmV0dXJuIDE7CisKKyAgICAgIGVycm9yOgorCWxvZ19lcnJvcigiUGh5c2ljYWwgZXh0ZW50IHBhcnNpbmcgZXJyb3IgYXQgJXMuIiwgYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NyZWF0ZV9wdl9lbnRyeShzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgcHZfbGlzdCAqcHZsLAorCQkJICAgICBjaGFyICpjb2xvbiwgaW50IGFsbG9jYXRhYmxlX29ubHksIHN0cnVjdCBkbV9saXN0ICpyKQoreworCWNvbnN0IGNoYXIgKnB2bmFtZTsKKwlzdHJ1Y3QgcHZfbGlzdCAqbmV3X3B2bCA9IE5VTEwsICpwdmwyOworCXN0cnVjdCBkbV9saXN0ICpwZV9yYW5nZXM7CisKKwlwdm5hbWUgPSBwdl9kZXZfbmFtZShwdmwtPnB2KTsKKwlpZiAoYWxsb2NhdGFibGVfb25seSAmJiAhKHB2bC0+cHYtPnN0YXR1cyAmIEFMTE9DQVRBQkxFX1BWKSkgeworCQlsb2dfd2FybigiUGh5c2ljYWwgdm9sdW1lICVzIG5vdCBhbGxvY2F0YWJsZS4iLCBwdm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYWxsb2NhdGFibGVfb25seSAmJiBpc19taXNzaW5nX3B2KHB2bC0+cHYpKSB7CisJCWxvZ193YXJuKCJQaHlzaWNhbCB2b2x1bWUgJXMgaXMgbWlzc2luZy4iLCBwdm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYWxsb2NhdGFibGVfb25seSAmJgorCSAgICAocHZsLT5wdi0+cGVfY291bnQgPT0gcHZsLT5wdi0+cGVfYWxsb2NfY291bnQpKSB7CisJCWxvZ193YXJuKCJObyBmcmVlIGV4dGVudHMgb24gcGh5c2ljYWwgdm9sdW1lIFwiJXNcIi4iLCBwdm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsMiwgcikKKwkJaWYgKHB2bC0+cHYtPmRldiA9PSBwdmwyLT5wdi0+ZGV2KSB7CisJCQluZXdfcHZsID0gcHZsMjsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIW5ld19wdmwpIHsKKwkJaWYgKCEobmV3X3B2bCA9IGRtX3Bvb2xfYWxsb2MobWVtLCBzaXplb2YoKm5ld19wdmwpKSkpIHsKKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHBoeXNpY2FsIHZvbHVtZSBsaXN0LiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQltZW1jcHkobmV3X3B2bCwgcHZsLCBzaXplb2YoKm5ld19wdmwpKTsKKworCQlpZiAoIShwZV9yYW5nZXMgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKCpwZV9yYW5nZXMpKSkpIHsKKwkJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBwZV9yYW5nZXMgbGlzdCBmYWlsZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkbV9saXN0X2luaXQocGVfcmFuZ2VzKTsKKwkJbmV3X3B2bC0+cGVfcmFuZ2VzID0gcGVfcmFuZ2VzOworCQlkbV9saXN0X2FkZChyLCAmbmV3X3B2bC0+bGlzdCk7CisJfQorCisJLyogRGV0ZXJtaW5lIHNlbGVjdGVkIHBoeXNpY2FsIGV4dGVudHMgKi8KKwlpZiAoIV9wYXJzZV9wZXMobWVtLCBjb2xvbiwgbmV3X3B2bC0+cGVfcmFuZ2VzLCBwdl9kZXZfbmFtZShwdmwtPnB2KSwKKwkJCXB2bC0+cHYtPnBlX2NvdW50KSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGRtX2xpc3QgKmNyZWF0ZV9wdl9saXN0KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgYXJnYywKKwkJCSAgICBjaGFyICoqYXJndiwgaW50IGFsbG9jYXRhYmxlX29ubHkpCit7CisJc3RydWN0IGRtX2xpc3QgKnI7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgZG1fbGlzdCB0YWdzbCwgYXJnX3B2bmFtZXM7CisJY2hhciAqcHZuYW1lID0gTlVMTDsKKwljaGFyICpjb2xvbiwgKmF0X3NpZ24sICp0YWduYW1lOworCWludCBpOworCisJLyogQnVpbGQgdXAgbGlzdCBvZiBQVnMgKi8KKwlpZiAoIShyID0gZG1fcG9vbF9hbGxvYyhtZW0sIHNpemVvZigqcikpKSkgeworCQlsb2dfZXJyb3IoIkFsbG9jYXRpb24gb2YgbGlzdCBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRtX2xpc3RfaW5pdChyKTsKKworCWRtX2xpc3RfaW5pdCgmdGFnc2wpOworCWRtX2xpc3RfaW5pdCgmYXJnX3B2bmFtZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQlkbV91bmVzY2FwZV9jb2xvbnNfYW5kX2F0X3NpZ25zKGFyZ3ZbaV0sICZjb2xvbiwgJmF0X3NpZ24pOworCisJCWlmIChhdF9zaWduICYmIChhdF9zaWduID09IGFyZ3ZbaV0pKSB7CisJCQl0YWduYW1lID0gYXRfc2lnbiArIDE7CisJCQlpZiAoIXZhbGlkYXRlX3RhZyh0YWduYW1lKSkgeworCQkJCWxvZ19lcnJvcigiU2tpcHBpbmcgaW52YWxpZCB0YWcgJXMuIiwgdGFnbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQkJCWlmIChzdHJfbGlzdF9tYXRjaF9pdGVtKCZwdmwtPnB2LT50YWdzLAorCQkJCQkJCXRhZ25hbWUpKSB7CisJCQkJCWlmICghX2NyZWF0ZV9wdl9lbnRyeShtZW0sIHB2bCwgTlVMTCwKKwkJCQkJCQkgICAgICBhbGxvY2F0YWJsZV9vbmx5LAorCQkJCQkJCSAgICAgIHIpKQorCQkJCQkJcmV0dXJuX05VTEw7CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlwdm5hbWUgPSBhcmd2W2ldOworCisJCWlmIChjb2xvbiAmJiAhKHB2bmFtZSA9IGRtX3Bvb2xfc3RybmR1cChtZW0sIHB2bmFtZSwKKwkJCQkJKHVuc2lnbmVkKSAoY29sb24gLSBwdm5hbWUpKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGNsb25lIFBWIG5hbWUuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICghKHB2bCA9IGZpbmRfcHZfaW5fdmcodmcsIHB2bmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoIlBoeXNpY2FsIFZvbHVtZSBcIiVzXCIgbm90IGZvdW5kIGluICIKKwkJCQkgICJWb2x1bWUgR3JvdXAgXCIlc1wiLiIsIHB2bmFtZSwgdmctPm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKCFfY3JlYXRlX3B2X2VudHJ5KG1lbSwgcHZsLCBjb2xvbiwgYWxsb2NhdGFibGVfb25seSwgcikpCisJCQlyZXR1cm5fTlVMTDsKKwl9CisKKwlpZiAoZG1fbGlzdF9lbXB0eShyKSkKKwkJbG9nX2Vycm9yKCJObyBzcGVjaWZpZWQgUFZzIGhhdmUgc3BhY2UgYXZhaWxhYmxlLiIpOworCisJcmV0dXJuIGRtX2xpc3RfZW1wdHkocikgPyBOVUxMIDogcjsKK30KKworc3RydWN0IGRtX2xpc3QgKmNsb25lX3B2X2xpc3Qoc3RydWN0IGRtX3Bvb2wgKm1lbSwgc3RydWN0IGRtX2xpc3QgKnB2c2wpCit7CisJc3RydWN0IGRtX2xpc3QgKnI7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKm5ld19wdmw7CisKKwkvKiBCdWlsZCB1cCBsaXN0IG9mIFBWcyAqLworCWlmICghKHIgPSBkbV9wb29sX2FsbG9jKG1lbSwgc2l6ZW9mKCpyKSkpKSB7CisJCWxvZ19lcnJvcigiQWxsb2NhdGlvbiBvZiBsaXN0IGZhaWxlZC4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRtX2xpc3RfaW5pdChyKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsIHB2c2wpIHsKKwkJaWYgKCEobmV3X3B2bCA9IGRtX3Bvb2xfemFsbG9jKG1lbSwgc2l6ZW9mKCpuZXdfcHZsKSkpKSB7CisJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBwaHlzaWNhbCB2b2x1bWUgbGlzdC4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVtY3B5KG5ld19wdmwsIHB2bCwgc2l6ZW9mKCpuZXdfcHZsKSk7CisJCWRtX2xpc3RfYWRkKHIsICZuZXdfcHZsLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworY29uc3QgY2hhciBfcGVfc2l6ZV9tYXlfbm90X2JlX25lZ2F0aXZlX21zZ1tdID0gIlBoeXNpY2FsIGV4dGVudCBzaXplIG1heSBub3QgYmUgbmVnYXRpdmUuIjsKKworaW50IHZnY3JlYXRlX3BhcmFtc19zZXRfZGVmYXVsdHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIHN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgKnZwX2RlZiwKKwkJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaW50NjRfdCBleHRlbnRfc2l6ZTsKKworCS8qIE9ubHkgdmdzcGxpdCBzZXRzIHZnICovCisJaWYgKHZnKSB7CisJCXZwX2RlZi0+dmdfbmFtZSA9IE5VTEw7CisJCXZwX2RlZi0+ZXh0ZW50X3NpemUgPSB2Zy0+ZXh0ZW50X3NpemU7CisJCXZwX2RlZi0+bWF4X3B2ID0gdmctPm1heF9wdjsKKwkJdnBfZGVmLT5tYXhfbHYgPSB2Zy0+bWF4X2x2OworCQl2cF9kZWYtPmFsbG9jID0gdmctPmFsbG9jOworCQl2cF9kZWYtPmNsdXN0ZXJlZCA9IHZnX2lzX2NsdXN0ZXJlZCh2Zyk7CisJCXZwX2RlZi0+dmdtZXRhZGF0YWNvcGllcyA9IHZnLT5tZGFfY29waWVzOworCQl2cF9kZWYtPnN5c3RlbV9pZCA9IHZnLT5zeXN0ZW1faWQ7CS8qIE5vIG5lZWQgdG8gY2xvbmUgdGhpcyAqLworCX0gZWxzZSB7CisJCXZwX2RlZi0+dmdfbmFtZSA9IE5VTEw7CisJCWV4dGVudF9zaXplID0gZmluZF9jb25maWdfdHJlZV9pbnQ2NChjbWQsCisJCQkJYWxsb2NhdGlvbl9waHlzaWNhbF9leHRlbnRfc2l6ZV9DRkcsIE5VTEwpICogMjsKKwkJaWYgKGV4dGVudF9zaXplIDwgMCkgeworCQkJbG9nX2Vycm9yKF9wZV9zaXplX21heV9ub3RfYmVfbmVnYXRpdmVfbXNnKTsKKwkJCXJldHVybiAwOworCQl9CisJCXZwX2RlZi0+ZXh0ZW50X3NpemUgPSAodWludDMyX3QpIGV4dGVudF9zaXplOworCQl2cF9kZWYtPm1heF9wdiA9IERFRkFVTFRfTUFYX1BWOworCQl2cF9kZWYtPm1heF9sdiA9IERFRkFVTFRfTUFYX0xWOworCQl2cF9kZWYtPmFsbG9jID0gREVGQVVMVF9BTExPQ19QT0xJQ1k7CisJCXZwX2RlZi0+Y2x1c3RlcmVkID0gREVGQVVMVF9DTFVTVEVSRUQ7CisJCXZwX2RlZi0+dmdtZXRhZGF0YWNvcGllcyA9IERFRkFVTFRfVkdNRVRBREFUQUNPUElFUzsKKwkJdnBfZGVmLT5zeXN0ZW1faWQgPSBjbWQtPnN5c3RlbV9pZDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFNldCBtZW1iZXJzIG9mIHN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgZnJvbSBjbWRsaW5lIGFyZ3VtZW50cy4KKyAqIERvIHByZWxpbWluYXJ5IHZhbGlkYXRpb24gd2l0aCBhcmdfKigpIGludGVyZmFjZS4KKyAqIEZ1cnRoZXIsIG1vcmUgZ2VuZXJpYyB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdmFsaWRhdGVfdmdjcmVhdGVfcGFyYW1zKCkuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHJlbWFpbiBpbiB0b29scyBkaXJlY3RvcnkuCisgKi8KK2ludCB2Z2NyZWF0ZV9wYXJhbXNfc2V0X2Zyb21fYXJncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIHN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgKnZwX25ldywKKwkJCQkgIHN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgKnZwX2RlZikKK3sKKwljb25zdCBjaGFyICpzeXN0ZW1faWRfYXJnX3N0cjsKKwljb25zdCBjaGFyICpsb2NrX3R5cGUgPSBOVUxMOworCWludCBsb2NraW5nX3R5cGU7CisJaW50IHVzZV9sdm1sb2NrZDsKKwlpbnQgdXNlX2Nsdm1kOworCWxvY2tfdHlwZV90IGxvY2tfdHlwZV9udW07CisKKwl2cF9uZXctPnZnX25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCB2cF9kZWYtPnZnX25hbWUsIE5VTEwpOworCXZwX25ldy0+bWF4X2x2ID0gYXJnX3VpbnRfdmFsdWUoY21kLCBtYXhsb2dpY2Fsdm9sdW1lc19BUkcsCisJCQkJCXZwX2RlZi0+bWF4X2x2KTsKKwl2cF9uZXctPm1heF9wdiA9IGFyZ191aW50X3ZhbHVlKGNtZCwgbWF4cGh5c2ljYWx2b2x1bWVzX0FSRywKKwkJCQkJdnBfZGVmLT5tYXhfcHYpOworCXZwX25ldy0+YWxsb2MgPSAoYWxsb2NfcG9saWN5X3QpIGFyZ191aW50X3ZhbHVlKGNtZCwgYWxsb2NfQVJHLCB2cF9kZWYtPmFsbG9jKTsKKworCS8qIFVuaXRzIG9mIDUxMi1ieXRlIHNlY3RvcnMgKi8KKwl2cF9uZXctPmV4dGVudF9zaXplID0KKwkgICAgYXJnX3VpbnRfdmFsdWUoY21kLCBwaHlzaWNhbGV4dGVudHNpemVfQVJHLCB2cF9kZWYtPmV4dGVudF9zaXplKTsKKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIHBoeXNpY2FsZXh0ZW50c2l6ZV9BUkcsIFNJR05fTk9ORSkgPT0gU0lHTl9NSU5VUykgeworCQlsb2dfZXJyb3IoX3BlX3NpemVfbWF5X25vdF9iZV9uZWdhdGl2ZV9tc2cpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnX3VpbnQ2NF92YWx1ZShjbWQsIHBoeXNpY2FsZXh0ZW50c2l6ZV9BUkcsIDApID4gTUFYX0VYVEVOVF9TSVpFKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgZXh0ZW50IHNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gJXMuIiwKKwkJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgTUFYX0VYVEVOVF9TSVpFKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIG1heGxvZ2ljYWx2b2x1bWVzX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCWxvZ19lcnJvcigiTWF4IExvZ2ljYWwgVm9sdW1lcyBtYXkgbm90IGJlIG5lZ2F0aXZlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBtYXhwaHlzaWNhbHZvbHVtZXNfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJbG9nX2Vycm9yKCJNYXggUGh5c2ljYWwgVm9sdW1lcyBtYXkgbm90IGJlIG5lZ2F0aXZlLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1ldGFkYXRhY29waWVzX0FSRykpCisJCXZwX25ldy0+dmdtZXRhZGF0YWNvcGllcyA9IGFyZ19pbnRfdmFsdWUoY21kLCBtZXRhZGF0YWNvcGllc19BUkcsCisJCQkJCQkJREVGQVVMVF9WR01FVEFEQVRBQ09QSUVTKTsKKwllbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgdmdtZXRhZGF0YWNvcGllc19BUkcpKQorCQl2cF9uZXctPnZnbWV0YWRhdGFjb3BpZXMgPSBhcmdfaW50X3ZhbHVlKGNtZCwgdmdtZXRhZGF0YWNvcGllc19BUkcsCisJCQkJCQkJREVGQVVMVF9WR01FVEFEQVRBQ09QSUVTKTsKKwllbHNlCisJCXZwX25ldy0+dmdtZXRhZGF0YWNvcGllcyA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgbWV0YWRhdGFfdmdtZXRhZGF0YWNvcGllc19DRkcsIE5VTEwpOworCisJaWYgKCEoc3lzdGVtX2lkX2FyZ19zdHIgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgc3lzdGVtaWRfQVJHLCBOVUxMKSkpIHsKKwkJdnBfbmV3LT5zeXN0ZW1faWQgPSB2cF9kZWYtPnN5c3RlbV9pZDsKKwl9IGVsc2UgeworCQlpZiAoISh2cF9uZXctPnN5c3RlbV9pZCA9IHN5c3RlbV9pZF9mcm9tX3N0cmluZyhjbWQsIHN5c3RlbV9pZF9hcmdfc3RyKSkpCisJCQlyZXR1cm5fMDsKKworCQkvKiBGSVhNRSBUYWtlIGxvY2FsL2V4dHJhX3N5c3RlbV9pZHMgaW50byBhY2NvdW50ICovCisJCWlmICh2cF9uZXctPnN5c3RlbV9pZCAmJiBjbWQtPnN5c3RlbV9pZCAmJgorCQkgICAgc3RyY21wKHZwX25ldy0+c3lzdGVtX2lkLCBjbWQtPnN5c3RlbV9pZCkpIHsKKwkJCWlmICgqdnBfbmV3LT5zeXN0ZW1faWQpCisJCQkJbG9nX3dhcm4oIlZHIHdpdGggc3lzdGVtIElEICVzIG1pZ2h0IGJlY29tZSBpbmFjY2Vzc2libGUgYXMgbG9jYWwgc3lzdGVtIElEIGlzICVzIiwKKwkJCQkJIHZwX25ldy0+c3lzdGVtX2lkLCBjbWQtPnN5c3RlbV9pZCk7CisJCQllbHNlCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IEEgVkcgd2l0aG91dCBhIHN5c3RlbSBJRCBhbGxvd3MgdW5zYWZlIGFjY2VzcyBmcm9tIG90aGVyIGhvc3RzLiIpOworCQl9CisJfQorCisJaWYgKChzeXN0ZW1faWRfYXJnX3N0ciA9IGFyZ19zdHJfdmFsdWUoY21kLCBzeXN0ZW1pZF9BUkcsIE5VTEwpKSkgeworCQl2cF9uZXctPnN5c3RlbV9pZCA9IHN5c3RlbV9pZF9mcm9tX3N0cmluZyhjbWQsIHN5c3RlbV9pZF9hcmdfc3RyKTsKKwl9IGVsc2UgeworCQl2cF9uZXctPnN5c3RlbV9pZCA9IHZwX2RlZi0+c3lzdGVtX2lkOworCX0KKworCWlmIChzeXN0ZW1faWRfYXJnX3N0cikgeworCQlpZiAoIXZwX25ldy0+c3lzdGVtX2lkIHx8ICF2cF9uZXctPnN5c3RlbV9pZFswXSkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBBIFZHIHdpdGhvdXQgYSBzeXN0ZW0gSUQgYWxsb3dzIHVuc2FmZSBhY2Nlc3MgZnJvbSBvdGhlciBob3N0cy4iKTsKKworCQlpZiAodnBfbmV3LT5zeXN0ZW1faWQgJiYgY21kLT5zeXN0ZW1faWQgJiYKKwkJICAgIHN0cmNtcCh2cF9uZXctPnN5c3RlbV9pZCwgY21kLT5zeXN0ZW1faWQpKSB7CisJCQlsb2dfd2FybigiVkcgd2l0aCBzeXN0ZW0gSUQgJXMgbWlnaHQgYmVjb21lIGluYWNjZXNzaWJsZSBhcyBsb2NhbCBzeXN0ZW0gSUQgaXMgJXMiLAorCQkJCSB2cF9uZXctPnN5c3RlbV9pZCwgY21kLT5zeXN0ZW1faWQpOworCQl9CisJfQorCisJLyoKKwkgKiBMb2NraW5nOiB3aGF0IGtpbmQgb2YgbG9ja2luZyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisJICogbmV3IFZHLCBhbmQgaXMgaXQgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgbHZtLmNvbmYgc2V0dGluZ3MuCisJICoKKwkgKiBUaGUgZW5kIHJlc3VsdCBpcyB0byBzZXQgdnBfbmV3LT5sb2NrX3R5cGUgdG86CisJICogbm9uZSB8IGNsdm0gfCBkbG0gfCBzYW5sb2NrLgorCSAqCisJICogSWYgJ3ZnY3JlYXRlIC0tbG9jay10eXBlIDxhcmc+JyBpcyBzZXQsIHRoZSBhbnN3ZXIgaXMgZ2l2ZW4KKwkgKiBkaXJlY3RseSBieSA8YXJnPiB3aGljaCBpcyBvbmUgb2Ygbm9uZXxjbHZtfGRsbXxzYW5sb2NrLgorCSAqCisJICogJ3ZnY3JlYXRlIC0tY2x1c3RlcmVkIHknIGlzIHRoZSB3YXkgdG8gY3JlYXRlIGNsdm0gVkdzLgorCSAqCisJICogJ3ZnY3JlYXRlIC0tc2hhcmVkJyBpcyB0aGUgd2F5IHRvIGNyZWF0ZSBsb2NrZCBWR3MuCisJICogbG9ja190eXBlIG9mIHNhbmxvY2sgb3IgZGxtIGlzIHNlbGVjdGVkIGJhc2VkIG9uCisJICogd2hpY2ggbG9jayBtYW5hZ2VyIGlzIHJ1bm5pbmcuCisJICoKKwkgKgorCSAqIDEuIFVzaW5nIG5laXRoZXIgY2x2bWQgbm9yIGx2bWxvY2tkLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIGx2bS5jb25mOgorCSAqIGdsb2JhbC91c2VfbHZtbG9ja2QgPSAwCisJICogZ2xvYmFsL2xvY2tpbmdfdHlwZSA9IDEKKwkgKgorCSAqIC0gbm8gbG9ja2luZyBpcyBlbmFibGVkCisJICogLSBjbHZtZCBpcyBub3QgdXNlZAorCSAqIC0gbHZtbG9ja2QgaXMgbm90IHVzZWQKKwkgKiAtIFZHcyB3aXRoIENMVVNURVJFRCBzZXQgYXJlIGlnbm9yZWQgKHJlcXVpcmVzIGNsdm1kKQorCSAqIC0gVkdzIHdpdGggbG9ja2QgdHlwZSBhcmUgaWdub3JlZCAocmVxdWlyZXMgbHZtbG9ja2QpCisJICogLSB2Z2NyZWF0ZSBjYW4gY3JlYXRlIG5ldyBWR3Mgd2l0aCBsb2NrX3R5cGUgbm9uZQorCSAqIC0gJ3ZnY3JlYXRlIC0tY2x1c3RlcmVkIHknIGZhaWxzCisJICogLSAndmdjcmVhdGUgLS1zaGFyZWQnIGZhaWxzCisJICogLSAndmdjcmVhdGUnIChuZWl0aGVyIG9wdGlvbikgY3JlYXRlcyBhIGxvY2FsIFZHCisJICoKKwkgKiAyLiBVc2luZyBjbHZtZC4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBsdm0uY29uZjoKKwkgKiBnbG9iYWwvdXNlX2x2bWxvY2tkID0gMAorCSAqIGdsb2JhbC9sb2NraW5nX3R5cGUgPSAzCisJICoKKwkgKiAtIGxvY2tpbmcgdGhyb3VnaCBjbHZtZCBpcyBlbmFibGVkICh0cmFkaXRpb25hbCBjbHZtIGNvbmZpZykKKwkgKiAtIGNsdm1kIGlzIHVzZWQKKwkgKiAtIGx2bWxvY2tkIGlzIG5vdCB1c2VkCisJICogLSBWR3Mgd2l0aCBDTFVTVEVSRUQgc2V0IGNhbiBiZSB1c2VkCisJICogLSBWR3Mgd2l0aCBsb2NrZCB0eXBlIGFyZSBpZ25vcmVkIChyZXF1aXJlcyBsdm1sb2NrZCkKKwkgKiAtIHZnY3JlYXRlIGNhbiBjcmVhdGUgbmV3IFZHcyB3aXRoIENMVVNURVJFRCBzdGF0dXMgZmxhZworCSAqIC0gJ3ZnY3JlYXRlIC0tY2x1c3RlcmVkIHknIHdvcmtzCisJICogLSAndmdjcmVhdGUgLS1zaGFyZWQnIGZhaWxzCisJICogLSAndmdjcmVhdGUnIChuZWl0aGVyIG9wdGlvbikgY3JlYXRlcyBhIGNsdm0gVkcKKwkgKgorCSAqIDMuIFVzaW5nIGx2bWxvY2tkLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIGx2bS5jb25mOgorCSAqIGdsb2JhbC91c2VfbHZtbG9ja2QgPSAxCisJICogZ2xvYmFsL2xvY2tpbmdfdHlwZSA9IDEKKwkgKgorCSAqIC0gbG9ja2luZyB0aHJvdWdoIGx2bWxvY2tkIGlzIGVuYWJsZWQKKwkgKiAtIGNsdm1kIGlzIG5vdCB1c2VkCisJICogLSBsdm1sb2NrZCBpcyB1c2VkCisJICogLSBWR3Mgd2l0aCBDTFVTVEVSRUQgc2V0IGFyZSBpZ25vcmVkIChyZXF1aXJlcyBjbHZtZCkKKwkgKiAtIFZHcyB3aXRoIGxvY2tkIHR5cGUgY2FuIGJlIHVzZWQKKwkgKiAtIHZnY3JlYXRlIGNhbiBjcmVhdGUgbmV3IFZHcyB3aXRoIGxvY2tfdHlwZSBzYW5sb2NrIG9yIGRsbQorCSAqIC0gJ3ZnY3JlYXRlIC0tY2x1c3RlcmVkIHknIGZhaWxzCisJICogLSAndmdjcmVhdGUgLS1zaGFyZWQnIHdvcmtzCisJICogLSAndmdjcmVhdGUnIChuZWl0aGVyIG9wdGlvbikgY3JlYXRlcyBhIGxvY2FsIFZHCisJICovCisKKwlsb2NraW5nX3R5cGUgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIGdsb2JhbF9sb2NraW5nX3R5cGVfQ0ZHLCBOVUxMKTsKKwl1c2VfbHZtbG9ja2QgPSBmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfdXNlX2x2bWxvY2tkX0NGRywgTlVMTCk7CisJdXNlX2Nsdm1kID0gKGxvY2tpbmdfdHlwZSA9PSAzKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbG9ja3R5cGVfQVJHKSkgeworCQlpZiAoYXJnX2lzX3NldChjbWQsIGNsdXN0ZXJlZF9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIkEgbG9jayB0eXBlIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCAtLWNsdXN0ZXJlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbG9ja190eXBlID0gYXJnX3N0cl92YWx1ZShjbWQsIGxvY2t0eXBlX0FSRywgIiIpOworCisJCWlmIChhcmdfaXNfc2V0KGNtZCwgc2hhcmVkX0FSRykgJiYgIWlzX2xvY2tkX3R5cGUobG9ja190eXBlKSkgeworCQkJbG9nX2Vycm9yKCJUaGUgLS1zaGFyZWQgb3B0aW9uIHJlcXVpcmVzIGxvY2sgdHlwZSBzYW5sb2NrIG9yIGRsbS4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9IGVsc2UgaWYgKGFyZ19pc19zZXQoY21kLCBjbHVzdGVyZWRfQVJHKSkgeworCQljb25zdCBjaGFyICphcmdfc3RyID0gYXJnX3N0cl92YWx1ZShjbWQsIGNsdXN0ZXJlZF9BUkcsICIiKTsKKwkJaW50IGNsdXN0ZXJ5ID0gc3RyY21wKGFyZ19zdHIsICJ5IikgPyAwIDogMTsKKworCQlpZiAodXNlX2Nsdm1kKSB7CisJCQlsb2NrX3R5cGUgPSBjbHVzdGVyeSA/ICJjbHZtIiA6ICJub25lIjsKKworCQl9IGVsc2UgaWYgKHVzZV9sdm1sb2NrZCkgeworCQkJbG9nX2Vycm9yKCJsdm1sb2NrZCBpcyBjb25maWd1cmVkLCB1c2UgLS1zaGFyZWQgd2l0aCBsdm1sb2NrZCwgYW5kIC0tY2x1c3RlcmVkIHdpdGggY2x2bWQuIik7CisJCQlyZXR1cm4gMDsKKworCQl9IGVsc2UgeworCQkJaWYgKGNsdXN0ZXJ5KSB7CisJCQkJbG9nX2Vycm9yKCJUaGUgLS1jbHVzdGVyZWQgb3B0aW9uIHJlcXVpcmVzIGNsdm1kIChsb2NraW5nX3R5cGU9MykuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWxvY2tfdHlwZSA9ICJub25lIjsKKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgc2hhcmVkX0FSRykpIHsKKwkJaW50IGZvdW5kX211bHRpcGxlID0gMDsKKworCQlpZiAodXNlX2x2bWxvY2tkKSB7CisJCQlpZiAoIShsb2NrX3R5cGUgPSBsb2NrZF9ydW5uaW5nX2xvY2tfdHlwZShjbWQsICZmb3VuZF9tdWx0aXBsZSkpKSB7CisJCQkJaWYgKGZvdW5kX211bHRpcGxlKQorCQkJCQlsb2dfZXJyb3IoIkZvdW5kIG11bHRpcGxlIGxvY2sgbWFuYWdlcnMsIHNlbGVjdCBvbmUgd2l0aCAtLWxvY2stdHlwZS4iKTsKKwkJCQllbHNlCisJCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGRldGVjdCBhIHJ1bm5pbmcgbG9jayBtYW5hZ2VyIHRvIHNlbGVjdCBsb2NrIHR5cGUuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJfSBlbHNlIGlmICh1c2VfY2x2bWQpIHsKKwkJCWxvZ19lcnJvcigiVXNlIC0tc2hhcmVkIHdpdGggbHZtbG9ja2QsIGFuZCAtLWNsdXN0ZXJlZCB3aXRoIGNsdm1kLiIpOworCQkJcmV0dXJuIDA7CisKKwkJfSBlbHNlIHsKKwkJCWxvZ19lcnJvcigiVXNpbmcgYSBzaGFyZWQgbG9jayB0eXBlIHJlcXVpcmVzIGx2bWxvY2tkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0gZWxzZSB7CisJCWlmICh1c2VfY2x2bWQpCisJCQlsb2NrX3R5cGUgPSBsb2NraW5nX2lzX2NsdXN0ZXJlZCgpID8gImNsdm0iIDogIm5vbmUiOworCQllbHNlCisJCQlsb2NrX3R5cGUgPSAibm9uZSI7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBsb2NrX3R5cGUgaXMgcmVjb2duaXplZCwgYW5kIGlzIGJlaW5nCisJICogdXNlZCB3aXRoIHRoZSBjb3JyZWN0IGx2bS5jb25mIHNldHRpbmdzLgorCSAqLworCWxvY2tfdHlwZV9udW0gPSBnZXRfbG9ja190eXBlX2Zyb21fc3RyaW5nKGxvY2tfdHlwZSk7CisKKwlzd2l0Y2ggKGxvY2tfdHlwZV9udW0pIHsKKwljYXNlIExPQ0tfVFlQRV9JTlZBTElEOgorCQlsb2dfZXJyb3IoImxvY2tfdHlwZSAlcyBpcyBpbnZhbGlkIiwgbG9ja190eXBlKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIExPQ0tfVFlQRV9TQU5MT0NLOgorCWNhc2UgTE9DS19UWVBFX0RMTToKKwkJaWYgKCF1c2VfbHZtbG9ja2QpIHsKKwkJCWxvZ19lcnJvcigiVXNpbmcgYSBzaGFyZWQgbG9jayB0eXBlIHJlcXVpcmVzIGx2bWxvY2tkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMT0NLX1RZUEVfQ0xWTToKKwkJaWYgKCF1c2VfY2x2bWQpIHsKKwkJCWxvZ19lcnJvcigiVXNpbmcgY2x2bSByZXF1aXJlcyBsb2NraW5nX3R5cGUgMy4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgTE9DS19UWVBFX05PTkU6CisJCWJyZWFrOworCX07CisKKwkvKgorCSAqIFRoZSB2ZyBpcyBub3Qgb3duZWQgYnkgb25lIGhvc3Qvc3lzdGVtX2lkLgorCSAqIExvY2tpbmcgY29vcmRpbmF0ZXMgYWNjZXNzIGZyb20gbXVsdGlwbGUgaG9zdHMuCisJICovCisJaWYgKGxvY2tfdHlwZV9udW0gPT0gTE9DS19UWVBFX0RMTSB8fCBsb2NrX3R5cGVfbnVtID09IExPQ0tfVFlQRV9TQU5MT0NLIHx8IGxvY2tfdHlwZV9udW0gPT0gTE9DS19UWVBFX0NMVk0pCisJCXZwX25ldy0+c3lzdGVtX2lkID0gTlVMTDsKKworCXZwX25ldy0+bG9ja190eXBlID0gbG9ja190eXBlOworCisJaWYgKGxvY2tfdHlwZV9udW0gPT0gTE9DS19UWVBFX0NMVk0pCisJCXZwX25ldy0+Y2x1c3RlcmVkID0gMTsKKwllbHNlCisJCXZwX25ldy0+Y2x1c3RlcmVkID0gMDsKKworCWxvZ19kZWJ1ZygiU2V0dGluZyBsb2NrX3R5cGUgdG8gJXMiLCB2cF9uZXctPmxvY2tfdHlwZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFNoYXJlZCBjb2RlIGZvciBjaGFuZ2luZyBhY3RpdmF0aW9uIHN0YXRlIGZvciB2Z2NoYW5nZS9sdmNoYW5nZSAqLworaW50IGx2X2NoYW5nZV9hY3RpdmF0ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKwkJICAgICAgIGFjdGl2YXRpb25fY2hhbmdlX3QgYWN0aXZhdGUpCit7CisJaW50IHIgPSAxOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqc25hcHNob3RfbHY7CisKKwlpZiAobHZfaXNfY2FjaGVfcG9vbChsdikpIHsKKwkJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKGFjdGl2YXRlKSkgeworCQkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIGFjdGl2YXRpb24gb2YgY2FjaGUgcG9vbCAlcy4iLAorCQkJCSAgICBkaXNwbGF5X2x2bmFtZShsdikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKCFkbV9saXN0X2VtcHR5KCZsdi0+c2Vnc191c2luZ190aGlzX2x2KSkgeworCQkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIGRlYWN0aXZhdGlvbiBvZiB1c2VkIGNhY2hlIHBvb2wgJXMuIiwKKwkJCQkgICAgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qCisJCSAqIEFsbG93IHRvIHBhc3Mgb25seSBkZWFjdGl2YXRpb24gb2YgdW51c2VkIGNhY2hlIHBvb2wuCisJCSAqIFVzZWZ1bCBvbmx5IGZvciByZWNvdmVyeSBvZiBmYWlsZWQgemVyb2luZyBvZiBtZXRhZGF0YSBMVi4KKwkJICovCisJfQorCisJaWYgKGx2X2lzX21lcmdpbmdfb3JpZ2luKGx2KSkgeworCQkvKgorCQkgKiBGb3IgbWVyZ2luZyBvcmlnaW4sIGl0cyBzbmFwc2hvdCBtdXN0IGJlIGluYWN0aXZlLgorCQkgKiBJZiBpdCdzIHN0aWxsIGFjdGl2ZSBhbmQgY2Fubm90IGJlIGRlYWN0aXZhdGVkCisJCSAqIGFjdGl2YXRpb24gb3IgZGVhY3RpdmF0aW9uIG9mIG9yaWdpbiBmYWlscyEKKwkJICoKKwkJICogV2hlbiBvcmlnaW4gaXMgZGVhY3RpdmF0ZWQgYW5kIG1lcmdpbmcgc25hcHNob3QgaXMgdGhpbgorCQkgKiBpdCBhbGxvd3MgdG8gZGVhY3RpdmF0ZSBvcmlnaW4sIGJ1dCBzdGlsbCByZXBvcnQgZXJyb3IsCisJCSAqIHNpbmNlIHRoZSB0aGluIHNuYXBzaG90IHJlbWFpbnMgYWN0aXZlLgorCQkgKgorCQkgKiBVc2VyIGNvdWxkIHJldHJ5IHRvIGRlYWN0aXZhdGUgaXQgd2l0aCBhbm90aGVyCisJCSAqIGRlYWN0aXZhdGlvbiBvZiBvcmlnaW4sIHdoaWNoIGlzIHRoZSBvbmx5IHZpc2libGUgTFYKKwkJICovCisJCXNuYXBzaG90X2x2ID0gZmluZF9zbmFwc2hvdChsdiktPmx2OworCQlpZiAobHZfaXNfdGhpbl90eXBlKHNuYXBzaG90X2x2KSAmJiAhZGVhY3RpdmF0ZV9sdihjbWQsIHNuYXBzaG90X2x2KSkgeworCQkJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKGFjdGl2YXRlKSkgeworCQkJCWxvZ19lcnJvcigiUmVmdXNpbmcgdG8gYWN0aXZhdGUgbWVyZ2luZyB2b2x1bWUgJXMgd2hpbGUgIgorCQkJCQkgICJzbmFwc2hvdCB2b2x1bWUgJXMgaXMgc3RpbGwgYWN0aXZlLiIsCisJCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShzbmFwc2hvdF9sdikpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlsb2dfZXJyb3IoIkNhbm5vdCBmdWxseSBkZWFjdGl2YXRlIG1lcmdpbmcgb3JpZ2luIHZvbHVtZSAlcyB3aGlsZSAiCisJCQkJICAic25hcHNob3Qgdm9sdW1lICVzIGlzIHN0aWxsIGFjdGl2ZS4iLAorCQkJCSAgZGlzcGxheV9sdm5hbWUobHYpLCBkaXNwbGF5X2x2bmFtZShzbmFwc2hvdF9sdikpOworCQkJciA9IDA7IC8qIGFuZCBjb250aW51ZSB0byBkZWFjdGl2YXRlIG9yaWdpbi4uLiAqLworCQl9CisJfQorCisJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKGFjdGl2YXRlKSAmJgorCSAgICBsdm1jYWNoZV9mb3VuZF9kdXBsaWNhdGVfcHZzKCkgJiYKKwkgICAgdmdfaGFzX2R1cGxpY2F0ZV9wdnMobHYtPnZnKSAmJgorCSAgICAhZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgZGV2aWNlc19hbGxvd19jaGFuZ2VzX3dpdGhfZHVwbGljYXRlX3B2c19DRkcsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGFjdGl2YXRlIExWcyBpbiBWRyAlcyB3aGlsZSBQVnMgYXBwZWFyIG9uIGR1cGxpY2F0ZSBkZXZpY2VzLiIsCisJCQkgIGx2LT52Zy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbHZfYWN0aXZlX2NoYW5nZShjbWQsIGx2LCBhY3RpdmF0ZSwgMCkpCisJCXJldHVybl8wOworCisJc2V0X2x2X25vdGlmeShsdi0+dmctPmNtZCk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGx2X3JlZnJlc2goc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpzbmFwc2hvdF9sdjsKKworCWlmIChsdl9pc19tZXJnaW5nX29yaWdpbihsdikpIHsKKwkJc25hcHNob3RfbHYgPSBmaW5kX3NuYXBzaG90KGx2KS0+bHY7CisJCWlmIChsdl9pc190aGluX3R5cGUoc25hcHNob3RfbHYpICYmICFkZWFjdGl2YXRlX2x2KGNtZCwgc25hcHNob3RfbHYpKQorCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkRlbGF5aW5nIG1lcmdlIGZvciBvcmlnaW4gdm9sdW1lICVzIHNpbmNlICIKKwkJCQkJCSJzbmFwc2hvdCB2b2x1bWUgJXMgaXMgc3RpbGwgYWN0aXZlLiIsCisJCQkJCQlkaXNwbGF5X2x2bmFtZShsdiksIGRpc3BsYXlfbHZuYW1lKHNuYXBzaG90X2x2KSk7CisJfQorCisJaWYgKCFsdl9yZWZyZXNoX3N1c3BlbmRfcmVzdW1lKGx2KSkKKwkJcmV0dXJuXzA7CisKKwkvKgorCSAqIGNoZWNrIGlmIHNuYXBzaG90IG1lcmdlIHNob3VsZCBiZSBwb2xsZWQKKwkgKiAtIHVuZm9ydHVuYXRlbHk6IGV2ZW4gdGhvdWdoIHRoZSBkZXZfbWFuYWdlciB3aWxsIGNsZWFyCisJICogICB0aGUgbHYncyBtZXJnZSBhdHRyaWJ1dGVzIGlmIGEgbWVyZ2UgaXMgbm90IHBvc3NpYmxlOworCSAqICAgaXQgaXMgY2xlYXJpbmcgYSBkaWZmZXJlbnQgaW5zdGFuY2Ugb2YgdGhlIGx2IChhcworCSAqICAgcmV0cmlldmVkIHdpdGggbHZfZnJvbV9sdmlkKQorCSAqIC0gZm9ydHVuYXRlbHk6IHBvbGxkYWVtb24gd2lsbCBpbW1lZGlhdGVseSBzaHV0ZG93biBpZiB0aGUKKwkgKiAgIG9yaWdpbiBkb2Vzbid0IGhhdmUgYSBzdGF0dXMgd2l0aCBhIHNuYXBzaG90IHBlcmNlbnRhZ2UKKwkgKi8KKwlpZiAoYmFja2dyb3VuZF9wb2xsaW5nKCkgJiYgbHZfaXNfbWVyZ2luZ19vcmlnaW4obHYpICYmIGx2X2lzX2FjdGl2ZV9sb2NhbGx5KGx2KSkKKwkJbHZfc3Bhd25fYmFja2dyb3VuZF9wb2xsaW5nKGNtZCwgbHYpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z19yZWZyZXNoX3Zpc2libGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IHIgPSAxOworCisJc2lnaW50X2FsbG93KCk7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkgeworCQkJciA9IDA7CisJCQlzdGFjazsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGx2X2lzX3Zpc2libGUobHZsLT5sdikgJiYgIWx2X3JlZnJlc2goY21kLCBsdmwtPmx2KSkgeworCQkJciA9IDA7CisJCQlzdGFjazsKKwkJfQorCX0KKworCXNpZ2ludF9yZXN0b3JlKCk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBsdl9zcGF3bl9iYWNrZ3JvdW5kX3BvbGxpbmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJY29uc3QgY2hhciAqcHZuYW1lOworCWNvbnN0IHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHZfbWlyciA9IE5VTEw7CisKKwlpZiAobHZfaXNfcHZtb3ZlKGx2KSkKKwkJbHZfbWlyciA9IGx2OworCWVsc2UgaWYgKGx2X2lzX2xvY2tlZChsdikpCisJCWx2X21pcnIgPSBmaW5kX3B2bW92ZV9sdl9pbl9sdihsdik7CisKKwlpZiAobHZfbWlyciAmJgorCSAgICAocHZuYW1lID0gZ2V0X3B2bW92ZV9wdm5hbWVfZnJvbV9sdl9taXJyKGx2X21pcnIpKSkgeworCQlsb2dfdmVyYm9zZSgiU3Bhd25pbmcgYmFja2dyb3VuZCBwdm1vdmUgcHJvY2VzcyBmb3IgJXMuIiwKKwkJCSAgICBwdm5hbWUpOworCQlwdm1vdmVfcG9sbChjbWQsIHB2bmFtZSwgbHZfbWlyci0+bHZpZC5zLCBsdl9taXJyLT52Zy0+bmFtZSwgbHZfbWlyci0+bmFtZSwgMSk7CisJfQorCisJaWYgKGx2X2lzX2NvbnZlcnRpbmcobHYpIHx8IGx2X2lzX21lcmdpbmcobHYpKSB7CisJCWxvZ192ZXJib3NlKCJTcGF3bmluZyBiYWNrZ3JvdW5kIGx2Y29udmVydCBwcm9jZXNzIGZvciAlcy4iLAorCQkJICAgIGx2LT5uYW1lKTsKKwkJbHZjb252ZXJ0X3BvbGwoY21kLCBsdiwgMSk7CisJfQorfQorCitpbnQgZ2V0X2FjdGl2YXRpb25fbW9uaXRvcmluZ19tb2RlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgIGludCAqbW9uaXRvcmluZ19tb2RlKQoreworCSptb25pdG9yaW5nX21vZGUgPSBERUZBVUxUX0RNRVZFTlREX01PTklUT1I7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1vbml0b3JfQVJHKSAmJgorCSAgICAoYXJnX2lzX3NldChjbWQsIGlnbm9yZW1vbml0b3JpbmdfQVJHKSB8fAorCSAgICAgYXJnX2lzX3NldChjbWQsIHN5c2luaXRfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCItLWlnbm9yZW1vbml0b3Jpbmcgb3IgLS1zeXNpbml0IG9wdGlvbiBub3QgYWxsb3dlZCB3aXRoIC0tbW9uaXRvciBvcHRpb24uIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbW9uaXRvcl9BUkcpKQorCQkqbW9uaXRvcmluZ19tb2RlID0gYXJnX2ludF92YWx1ZShjbWQsIG1vbml0b3JfQVJHLAorCQkJCQkJIERFRkFVTFRfRE1FVkVOVERfTU9OSVRPUik7CisJZWxzZSBpZiAoaXNfc3RhdGljKCkgfHwgYXJnX2lzX3NldChjbWQsIGlnbm9yZW1vbml0b3JpbmdfQVJHKSB8fAorCQkgYXJnX2lzX3NldChjbWQsIHN5c2luaXRfQVJHKSB8fAorCQkgIWZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGFjdGl2YXRpb25fbW9uaXRvcmluZ19DRkcsIE5VTEwpKQorCQkqbW9uaXRvcmluZ19tb2RlID0gRE1FVkVOVERfTU9OSVRPUl9JR05PUkU7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlYWQgcG9vbCBvcHRpb25zIGZyb20gY21kbGluZQorICovCitpbnQgZ2V0X3Bvb2xfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfdHlwZSAqc2VndHlwZSwKKwkJICAgIGludCAqcGFzc2VkX2FyZ3MsCisJCSAgICB1aW50NjRfdCAqcG9vbF9tZXRhZGF0YV9zaXplLAorCQkgICAgaW50ICpwb29sX21ldGFkYXRhX3NwYXJlLAorCQkgICAgdWludDMyX3QgKmNodW5rX3NpemUsCisJCSAgICB0aGluX2Rpc2NhcmRzX3QgKmRpc2NhcmRzLAorCQkgICAgaW50ICp6ZXJvKQoreworCSpwYXNzZWRfYXJncyA9IDA7CisKKwlpZiAoc2VndHlwZV9pc190aGluX3Bvb2woc2VndHlwZSkgfHwgc2VndHlwZV9pc190aGluKHNlZ3R5cGUpKSB7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgemVyb19BUkcpKSB7CisJCQkqcGFzc2VkX2FyZ3MgfD0gUEFTU19BUkdfWkVSTzsKKwkJCSp6ZXJvID0gYXJnX2ludF92YWx1ZShjbWQsIHplcm9fQVJHLCAxKTsKKwkJCWxvZ192ZXJ5X3ZlcmJvc2UoIiVzIHBvb2wgemVyb2luZy4iLCAqemVybyA/ICJFbmFibGluZyIgOiAiRGlzYWJsaW5nIik7CisJCX0KKwkJaWYgKGFyZ19pc19zZXQoY21kLCBkaXNjYXJkc19BUkcpKSB7CisJCQkqcGFzc2VkX2FyZ3MgfD0gUEFTU19BUkdfRElTQ0FSRFM7CisJCQkqZGlzY2FyZHMgPSAodGhpbl9kaXNjYXJkc190KSBhcmdfdWludF92YWx1ZShjbWQsIGRpc2NhcmRzX0FSRywgMCk7CisJCQlsb2dfdmVyeV92ZXJib3NlKCJTZXR0aW5nIHBvb2wgZGlzY2FyZHMgdG8gJXMuIiwKKwkJCQkJIGdldF9wb29sX2Rpc2NhcmRzX25hbWUoKmRpc2NhcmRzKSk7CisJCX0KKwl9CisKKwlpZiAoYXJnX2Zyb21fbGlzdF9pc19uZWdhdGl2ZShjbWQsICJtYXkgbm90IGJlIG5lZ2F0aXZlIiwKKwkJCQkgICAgICBjaHVua3NpemVfQVJHLAorCQkJCSAgICAgIHBvb2xkYXRhc2l6ZV9BUkcsCisJCQkJICAgICAgcG9vbG1ldGFkYXRhc2l6ZV9BUkcsCisJCQkJICAgICAgLTEpKQorCQlyZXR1cm5fMDsKKworCWlmIChhcmdfZnJvbV9saXN0X2lzX3plcm8oY21kLCAibWF5IG5vdCBiZSB6ZXJvIiwKKwkJCQkgIGNodW5rc2l6ZV9BUkcsCisJCQkJICBwb29sZGF0YXNpemVfQVJHLAorCQkJCSAgcG9vbG1ldGFkYXRhc2l6ZV9BUkcsCisJCQkJICAtMSkpCisJCXJldHVybl8wOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBjaHVua3NpemVfQVJHKSkgeworCQkqcGFzc2VkX2FyZ3MgfD0gUEFTU19BUkdfQ0hVTktfU0laRTsKKwkJKmNodW5rX3NpemUgPSBhcmdfdWludF92YWx1ZShjbWQsIGNodW5rc2l6ZV9BUkcsIDApOworCisJCWlmICghdmFsaWRhdGVfcG9vbF9jaHVua19zaXplKGNtZCwgc2VndHlwZSwgKmNodW5rX3NpemUpKQorCQkJcmV0dXJuXzA7CisKKwkJbG9nX3ZlcnlfdmVyYm9zZSgiU2V0dGluZyBwb29sIGNodW5rIHNpemUgdG8gJXMuIiwKKwkJCQkgZGlzcGxheV9zaXplKGNtZCwgKmNodW5rX3NpemUpKTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHBvb2xtZXRhZGF0YXNpemVfQVJHKSkgeworCQlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBwb29sbWV0YWRhdGFzaXplX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCQlsb2dfZXJyb3IoIk5lZ2F0aXZlIHBvb2wgbWV0YWRhdGEgc2l6ZSBpcyBpbnZhbGlkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoYXJnX2lzX3NldChjbWQsIHBvb2xtZXRhZGF0YV9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGVpdGhlciBtZXRhZGF0YSBsb2dpY2FsIHZvbHVtZSBvciBpdHMgc2l6ZS4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJKnBhc3NlZF9hcmdzIHw9IFBBU1NfQVJHX1BPT0xfTUVUQURBVEFfU0laRTsKKwkJKnBvb2xfbWV0YWRhdGFfc2l6ZSA9IGFyZ191aW50NjRfdmFsdWUoY21kLCBwb29sbWV0YWRhdGFzaXplX0FSRywKKwkJCQkJCSAgICAgICBVSU5UNjRfQygwKSk7CisJfSBlbHNlIGlmIChhcmdfaXNfc2V0KGNtZCwgcG9vbG1ldGFkYXRhX0FSRykpCisJCSpwYXNzZWRfYXJncyB8PSBQQVNTX0FSR19QT09MX01FVEFEQVRBX1NJWkU7IC8qIGZpeGVkIHNpemUgKi8KKworCS8qIFRPRE86IGRlZmF1bHQgaW4gbHZtLmNvbmYgPyAqLworCSpwb29sX21ldGFkYXRhX3NwYXJlID0gYXJnX2ludF92YWx1ZShjbWQsIHBvb2xtZXRhZGF0YXNwYXJlX0FSRywKKwkJCQkJICAgICBERUZBVUxUX1BPT0xfTUVUQURBVEFfU1BBUkUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZW5lcmljIHN0cmlwZSBwYXJhbWV0ZXIgY2hlY2tzLgorICovCitzdGF0aWMgaW50IF92YWxpZGF0ZV9zdHJpcGVfcGFyYW1zKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1aW50MzJfdCAqc3RyaXBlcywKKwkJCQkgICB1aW50MzJfdCAqc3RyaXBlX3NpemUpCit7CisJaWYgKCpzdHJpcGVzID09IDEgJiYgKnN0cmlwZV9zaXplKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJZ25vcmluZyBzdHJpcGVzaXplIGFyZ3VtZW50IHdpdGggc2luZ2xlIHN0cmlwZS4iKTsKKwkJKnN0cmlwZV9zaXplID0gMDsKKwl9CisKKwlpZiAoKnN0cmlwZXMgPiAxICYmICEqc3RyaXBlX3NpemUpIHsKKwkJKnN0cmlwZV9zaXplID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBtZXRhZGF0YV9zdHJpcGVzaXplX0NGRywgTlVMTCkgKiAyOworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVXNpbmcgZGVmYXVsdCBzdHJpcGVzaXplICVzLiIsCisJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgKnN0cmlwZV9zaXplKSk7CisJfQorCisJaWYgKCpzdHJpcGVzIDwgMSB8fCAqc3RyaXBlcyA+IE1BWF9TVFJJUEVTKSB7CisJCWxvZ19lcnJvcigiTnVtYmVyIG9mIHN0cmlwZXMgKCVkKSBtdXN0IGJlIGJldHdlZW4gJWQgYW5kICVkLiIsCisJCQkgICpzdHJpcGVzLCAxLCBNQVhfU1RSSVBFUyk7CisJCXJldHVybiAwOworCX0KKworCWlmICgqc3RyaXBlcyA+IDEgJiYgKCpzdHJpcGVfc2l6ZSA8IFNUUklQRV9TSVpFX01JTiB8fAorCQkJICAgICAhaXNfcG93ZXJfb2ZfMigqc3RyaXBlX3NpemUpKSkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgc3RyaXBlIHNpemUgJXMuIiwKKwkJCSAgZGlzcGxheV9zaXplKGNtZCwgKHVpbnQ2NF90KSAqc3RyaXBlX3NpemUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgc3RyaXBlIHNpemUgaXMgbGltaXRlZCBieSB0aGUgc2l6ZSBvZiBhIHVpbnQzMl90LCBidXQgc2luY2UgdGhlCisgKiB2YWx1ZSBnaXZlbiBieSB0aGUgdXNlciBpcyBkb3VibGVkLCBhbmQgdGhlIGZpbmFsIHJlc3VsdCBtdXN0IGJlIGEKKyAqIHBvd2VyIG9mIDIsIHdlIG11c3QgZGl2aWRlIFVJTlRfTUFYIGJ5IGZvdXIgYW5kIGFkZCAxICh0byByb3VuZCBpdAorICogdXAgdG8gdGhlIHBvd2VyIG9mIDIpCisgKi8KK2ludCBnZXRfc3RyaXBlX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDMyX3QgKnN0cmlwZXMsIHVpbnQzMl90ICpzdHJpcGVfc2l6ZSkKK3sKKwkvKiBzdHJpcGVzX2xvbmdfQVJHIHRha2VzIHByZWNlZGVuY2UgKGZvciBsdmNvbnZlcnQpICovCisJKnN0cmlwZXMgPSBhcmdfdWludF92YWx1ZShjbWQsIGFyZ19pc19zZXQoY21kLCBzdHJpcGVzX2xvbmdfQVJHKSA/IHN0cmlwZXNfbG9uZ19BUkcgOiBzdHJpcGVzX0FSRywgMSk7CisKKwkqc3RyaXBlX3NpemUgPSBhcmdfdWludF92YWx1ZShjbWQsIHN0cmlwZXNpemVfQVJHLCAwKTsKKwlpZiAoKnN0cmlwZV9zaXplKSB7CisJCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIHN0cmlwZXNpemVfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJCWxvZ19lcnJvcigiTmVnYXRpdmUgc3RyaXBlc2l6ZSBpcyBpbnZhbGlkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoYXJnX3VpbnQ2NF92YWx1ZShjbWQsIHN0cmlwZXNpemVfQVJHLCAwKSA+IFNUUklQRV9TSVpFX0xJTUlUICogMikgeworCQkJbG9nX2Vycm9yKCJTdHJpcGUgc2l6ZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gJXMuIiwKKwkJCQkgIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgU1RSSVBFX1NJWkVfTElNSVQpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIF92YWxpZGF0ZV9zdHJpcGVfcGFyYW1zKGNtZCwgc3RyaXBlcywgc3RyaXBlX3NpemUpOworfQorCitzdGF0aWMgaW50IF92YWxpZGF0ZV9jYWNoZXBvb2xfcGFyYW1zKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGRtX2NvbmZpZ190cmVlICpzZXR0aW5ncykKK3sKKwlyZXR1cm4gMTsKK30KKworaW50IGdldF9jYWNoZV9wYXJhbXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICAgY2FjaGVfbW9kZV90ICpjYWNoZV9tb2RlLAorCQkgICAgIGNvbnN0IGNoYXIgKipuYW1lLAorCQkgICAgIHN0cnVjdCBkbV9jb25maWdfdHJlZSAqKnNldHRpbmdzKQoreworCWNvbnN0IGNoYXIgKnN0cjsKKwlzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgKmdyb3VwOworCXN0cnVjdCBkbV9jb25maWdfdHJlZSAqcmVzdWx0ID0gTlVMTCwgKnByZXYgPSBOVUxMLCAqY3VycmVudCA9IE5VTEw7CisJc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwlpbnQgb2sgPSAwOworCisJaWYgKGNhY2hlX21vZGUpCisJCSpjYWNoZV9tb2RlID0gKGNhY2hlX21vZGVfdCkgYXJnX3VpbnRfdmFsdWUoY21kLCBjYWNoZW1vZGVfQVJHLCBDQUNIRV9NT0RFX1VOREVGSU5FRCk7CisKKwlpZiAobmFtZSkKKwkJKm5hbWUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgY2FjaGVwb2xpY3lfQVJHLCBOVUxMKTsKKworCWlmICghc2V0dGluZ3MpCisJCXJldHVybiAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGdyb3VwLCAmY21kLT5hcmdfdmFsdWVfZ3JvdXBzKSB7CisJCWlmICghZ3JvdXBlZF9hcmdfaXNfc2V0KGdyb3VwLT5hcmdfdmFsdWVzLCBjYWNoZXNldHRpbmdzX0FSRykpCisJCQljb250aW51ZTsKKworCQlpZiAoIShjdXJyZW50ID0gZG1fY29uZmlnX2NyZWF0ZSgpKSkKKwkJCWdvdG9fb3V0OworCQlpZiAocHJldikKKwkJCWN1cnJlbnQtPmNhc2NhZGUgPSBwcmV2OworCQlwcmV2ID0gY3VycmVudDsKKworCQlpZiAoIShzdHIgPSBncm91cGVkX2FyZ19zdHJfdmFsdWUoZ3JvdXAtPmFyZ192YWx1ZXMsCisJCQkJCQkgIGNhY2hlc2V0dGluZ3NfQVJHLAorCQkJCQkJICBOVUxMKSkpCisJCQlnb3RvX291dDsKKworCQlpZiAoIWRtX2NvbmZpZ19wYXJzZShjdXJyZW50LCBzdHIsIHN0ciArIHN0cmxlbihzdHIpKSkKKwkJCWdvdG9fb3V0OworCX0KKworCWlmICghY3VycmVudCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShyZXN1bHQgPSBkbV9jb25maWdfZmxhdHRlbihjdXJyZW50KSkpCisJCWdvdG9fb3V0OworCisJaWYgKHJlc3VsdC0+cm9vdCkgeworCQlpZiAoIShjbiA9IGRtX2NvbmZpZ19jcmVhdGVfbm9kZShyZXN1bHQsICJwb2xpY3lfc2V0dGluZ3MiKSkpCisJCQlnb3RvX291dDsKKworCQljbi0+Y2hpbGQgPSByZXN1bHQtPnJvb3Q7CisJCXJlc3VsdC0+cm9vdCA9IGNuOworCX0KKworCWlmICghX3ZhbGlkYXRlX2NhY2hlcG9vbF9wYXJhbXMoKm5hbWUsIHJlc3VsdCkpCisJCWdvdG9fb3V0OworCisJb2sgPSAxOworb3V0OgorCWlmICghb2sgJiYgcmVzdWx0KSB7CisJCWRtX2NvbmZpZ19kZXN0cm95KHJlc3VsdCk7CisJCXJlc3VsdCA9IE5VTEw7CisJfQorCXdoaWxlIChwcmV2KSB7CisJCWN1cnJlbnQgPSBwcmV2LT5jYXNjYWRlOworCQlkbV9jb25maWdfZGVzdHJveShwcmV2KTsKKwkJcHJldiA9IGN1cnJlbnQ7CisJfQorCisJKnNldHRpbmdzID0gcmVzdWx0OworCisJcmV0dXJuIG9rOworfQorCisvKiBGSVhNRSBtb3ZlIHRvIGxpYiAqLworc3RhdGljIGludCBfcHZfY2hhbmdlX3RhZyhzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgY29uc3QgY2hhciAqdGFnLCBpbnQgYWRkdGFnKQoreworCWlmIChhZGR0YWcpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGQocHYtPmZtdC0+Y21kLT5tZW0sICZwdi0+dGFncywgdGFnKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWRkIHRhZyAlcyB0byBwaHlzaWNhbCB2b2x1bWUgJXMuIiwKKwkJCQkgIHRhZywgcHZfZGV2X25hbWUocHYpKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlCisJCXN0cl9saXN0X2RlbCgmcHYtPnRhZ3MsIHRhZyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogU2V0IGV4YWN0bHkgb25lIG9mIFZHLCBMViBvciBQViAqLworaW50IGNoYW5nZV90YWcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCSAgICAgICBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdiwgaW50IGFyZykKK3sKKwljb25zdCBjaGFyICp0YWc7CisJc3RydWN0IGFyZ192YWx1ZV9ncm91cF9saXN0ICpjdXJyZW50X2dyb3VwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGN1cnJlbnRfZ3JvdXAsICZjbWQtPmFyZ192YWx1ZV9ncm91cHMpIHsKKwkJaWYgKCFncm91cGVkX2FyZ19pc19zZXQoY3VycmVudF9ncm91cC0+YXJnX3ZhbHVlcywgYXJnKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKHRhZyA9IGdyb3VwZWRfYXJnX3N0cl92YWx1ZShjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBhcmcsIE5VTEwpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZ2V0IHRhZy4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHZnICYmICF2Z19jaGFuZ2VfdGFnKHZnLCB0YWcsIGFyZyA9PSBhZGR0YWdfQVJHKSkKKwkJCXJldHVybl8wOworCQllbHNlIGlmIChsdiAmJiAhbHZfY2hhbmdlX3RhZyhsdiwgdGFnLCBhcmcgPT0gYWRkdGFnX0FSRykpCisJCQlyZXR1cm5fMDsKKwkJZWxzZSBpZiAocHYgJiYgIV9wdl9jaGFuZ2VfdGFnKHB2LCB0YWcsIGFyZyA9PSBhZGR0YWdfQVJHKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgcHJvY2Vzc19lYWNoX2xhYmVsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCSAgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJICAgICAgIHByb2Nlc3Nfc2luZ2xlX2xhYmVsX2ZuX3QgcHJvY2Vzc19zaW5nbGVfbGFiZWwpCit7CisJbG9nX3JlcG9ydF90IHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUgPSBsb2dfZ2V0X3JlcG9ydF9zdGF0ZSgpOworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJc3RydWN0IGRldl9pdGVyICppdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldDsKKwlpbnQgb3B0ID0gMDsKKworCWxvZ19zZXRfcmVwb3J0X29iamVjdF90eXBlKExPR19SRVBPUlRfT0JKRUNUX1RZUEVfTEFCRUwpOworCisJaWYgKGFyZ2MpIHsKKwkJZm9yICg7IG9wdCA8IGFyZ2M7IG9wdCsrKSB7CisJCQlpZiAoIShkZXYgPSBkZXZfY2FjaGVfZ2V0KGFyZ3Zbb3B0XSwgY21kLT5mdWxsX2ZpbHRlcikpKSB7CisJCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBkZXZpY2UgIgorCQkJCQkgICJcIiVzXCIuIiwgYXJndltvcHRdKTsKKwkJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChkZXZfbmFtZShkZXYpLCBOVUxMKTsKKworCQkJaWYgKCFsYWJlbF9yZWFkKGRldiwgJmxhYmVsLCAwKSkgeworCQkJCWxvZ19lcnJvcigiTm8gcGh5c2ljYWwgdm9sdW1lIGxhYmVsIHJlYWQgZnJvbSAlcy4iLAorCQkJCQkgIGFyZ3Zbb3B0XSk7CisJCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZXQgPSBwcm9jZXNzX3NpbmdsZV9sYWJlbChjbWQsIGxhYmVsLCBoYW5kbGUpOworCQkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXQpOworCisJCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCQlyZXRfbWF4ID0gcmV0OworCisJCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQoTlVMTCwgTlVMTCk7CisKKwkJCWlmIChzaWdpbnRfY2F1Z2h0KCkpCisJCQkJYnJlYWs7CisJCX0KKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShpdGVyID0gZGV2X2l0ZXJfY3JlYXRlKGNtZC0+ZnVsbF9maWx0ZXIsIDEpKSkgeworCQlsb2dfZXJyb3IoImRldl9pdGVyIGNyZWF0aW9uIGZhaWxlZC4iKTsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpCisJeworCQlpZiAoIWxhYmVsX3JlYWQoZGV2LCAmbGFiZWwsIDApKQorCQkJY29udGludWU7CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKGRldl9uYW1lKGxhYmVsLT5kZXYpLCBOVUxMKTsKKworCQlyZXQgPSBwcm9jZXNzX3NpbmdsZV9sYWJlbChjbWQsIGxhYmVsLCBoYW5kbGUpOworCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldCk7CisKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCisJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChOVUxMLCBOVUxMKTsKKworCQlpZiAoc2lnaW50X2NhdWdodCgpKQorCQkJYnJlYWs7CisJfQorCisJZGV2X2l0ZXJfZGVzdHJveShpdGVyKTsKK291dDoKKwlsb2dfcmVzdG9yZV9yZXBvcnRfc3RhdGUoc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSk7CisJcmV0dXJuIHJldF9tYXg7Cit9CisKKy8qCisgKiBQYXJzZSBwZXJzaXN0ZW50IG1ham9yIG1pbm9yIHBhcmFtZXRlcnMuCisgKgorICogLS1wZXJzaXN0ZW50IGlzIHVuc3BlY2lmaWVkID0+IHN0YXRlIGlzIGRlZHVjZWQKKyAqIGZyb20gcHJlc2VuY2Ugb2Ygb3B0aW9ucyAtLW1pbm9yIG9yIC0tbWFqb3IuCisgKgorICogLU1uID0+IC0tbWlub3Igb3IgLS1tYWpvciBub3QgYWxsb3dlZC4KKyAqCisgKiAtTXkgPT4gLS1taW5vciBpcyByZXF1aXJlZCAoYW5kIGFsc28gLS1tYWpvciBvbiA8PTIuNCkKKyAqLworaW50IGdldF9hbmRfdmFsaWRhdGVfbWFqb3JfbWlub3IoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCSBpbnQzMl90ICptYWpvciwgaW50MzJfdCAqbWlub3IpCit7CisJaWYgKGFyZ19jb3VudChjbWQsIG1pbm9yX0FSRykgPiAxKSB7CisJCWxvZ19lcnJvcigiT3B0aW9uIC0tbWlub3IgbWF5IG5vdCBiZSByZXBlYXRlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19jb3VudChjbWQsIG1ham9yX0FSRykgPiAxKSB7CisJCWxvZ19lcnJvcigiT3B0aW9uIC1qfC0tbWFqb3IgbWF5IG5vdCBiZSByZXBlYXRlZC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgd2l0aCBkZWZhdWx0ICd5JyAqLworCWlmICghYXJnX2ludF92YWx1ZShjbWQsIHBlcnNpc3RlbnRfQVJHLCAxKSkgeyAvKiAtTW4gKi8KKwkJaWYgKGFyZ19pc19zZXQoY21kLCBtaW5vcl9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBtYWpvcl9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIk9wdGlvbnMgLS1tYWpvciBhbmQgLS1taW5vciBhcmUgaW5jb21wYXRpYmxlIHdpdGggLU1uLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKm1ham9yID0gKm1pbm9yID0gLTE7CisJCXJldHVybiAxOworCX0KKworCS8qIC0xIGNhbm5vdCBiZSBlbnRlcmVkIGFzIGFuIGFyZ3VtZW50IGZvciAtLW1ham9yLCAtLW1pbm9yICovCisJKm1ham9yID0gYXJnX2ludF92YWx1ZShjbWQsIG1ham9yX0FSRywgLTEpOworCSptaW5vciA9IGFyZ19pbnRfdmFsdWUoY21kLCBtaW5vcl9BUkcsIC0xKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcGVyc2lzdGVudF9BUkcpKSB7IC8qIC1NeSAqLworCQlpZiAoKm1pbm9yID09IC0xKSB7CisJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IG1pbm9yIG51bWJlciB3aXRoIC0tbWlub3Igd2hlbiB1c2luZyAtTXkuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghc3RybmNtcChjbWQtPmtlcm5lbF92c24sICIyLjQuIiwgNCkpIHsKKwkJLyogTWFqb3IgaXMgcmVxdWlyZWQgZm9yIDIuNCAqLworCQlpZiAoYXJnX2lzX3NldChjbWQsIHBlcnNpc3RlbnRfQVJHKSAmJiAqbWFqb3IgPCAwKSB7CisJCQlsb2dfZXJyb3IoIlBsZWFzZSBzcGVjaWZ5IG1ham9yIG51bWJlciB3aXRoIC0tbWFqb3Igd2hlbiB1c2luZyAtTXkuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgqbWFqb3IgIT0gLTEpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBzdXBwbGllZCBtYWpvciBudW1iZXIgJWQgLSAiCisJCQkJICJrZXJuZWwgYXNzaWducyBtYWpvciBudW1iZXJzIGR5bmFtaWNhbGx5LiAiCisJCQkJICJVc2luZyBtYWpvciBudW1iZXIgJWQgaW5zdGVhZC4iLAorCQkJCSAqbWFqb3IsIGNtZC0+ZGV2X3R5cGVzLT5kZXZpY2VfbWFwcGVyX21ham9yKTsKKwkJfQorCQkvKiBTdGF5IHdpdGggZHluYW1pYyBtYWpvcjptaW5vciBpZiBtaW5vciBpcyBub3Qgc3BlY2lmaWVkLiAqLworCQkqbWFqb3IgPSAoKm1pbm9yID09IC0xKSA/IC0xIDogY21kLT5kZXZfdHlwZXMtPmRldmljZV9tYXBwZXJfbWFqb3I7CisJfQorCisJaWYgKCgqbWlub3IgIT0gLTEpICYmICF2YWxpZGF0ZV9tYWpvcl9taW5vcihjbWQsIGZtdCwgKm1ham9yLCAqbWlub3IpKQorCQlyZXR1cm5fMDsKKworCXJldHVybiAxOworfQorCisvKgorICogVmFsaWRhdGUgbHZuYW1lIHBhcmFtZXRlcgorICoKKyAqIElmIGl0IGNvbnRhaW5zIHZnbmFtZSwgaXQgaXMgZXh0cmFjdGVkIGZyb20gbHZuYW1lLgorICogSWYgdGhlcmUgaXMgcGFzc2VkIHZnbmFtZSwgaXQgaXMgY29tcGFyZWQgd2hldGhlciBpdHMgdGhlIHNhbWUgbmFtZS4KKyAqLworaW50IHZhbGlkYXRlX2x2bmFtZV9wYXJhbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqKnZnX25hbWUsCisJCQkgIGNvbnN0IGNoYXIgKipsdl9uYW1lKQoreworCWNvbnN0IGNoYXIgKnZnbmFtZTsKKwljb25zdCBjaGFyICpsdm5hbWU7CisKKwlpZiAoIWx2X25hbWUgfHwgISpsdl9uYW1lKQorCQlyZXR1cm4gMTsgIC8qIE5VTEwgbHZuYW1lIGlzIG9rICovCisKKwkvKiBJZiBjb250YWlucyBWRyBuYW1lLCBleHRyYWN0IGl0LiAqLworCWlmIChzdHJjaHIoKmx2X25hbWUsIChpbnQpICcvJykpIHsKKwkJaWYgKCEodmduYW1lID0gX2V4dHJhY3RfdmduYW1lKGNtZCwgKmx2X25hbWUsICZsdm5hbWUpKSkKKwkJCXJldHVybl8wOworCisJCWlmICghKnZnX25hbWUpCisJCQkqdmdfbmFtZSA9IHZnbmFtZTsKKwkJZWxzZSBpZiAoc3RyY21wKHZnbmFtZSwgKnZnX25hbWUpKSB7CisJCQlsb2dfZXJyb3IoIlBsZWFzZSB1c2UgYSBzaW5nbGUgdm9sdW1lIGdyb3VwIG5hbWUgIgorCQkJCSAgIihcIiVzXCIgb3IgXCIlc1wiKS4iLCB2Z25hbWUsICp2Z19uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJKmx2X25hbWUgPSBsdm5hbWU7CisJfQorCisJaWYgKCF2YWxpZGF0ZV9uYW1lKCpsdl9uYW1lKSkgeworCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lIG5hbWUgXCIlc1wiIGlzIGludmFsaWQuIiwKKwkJCSAgKmx2X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFZhbGlkYXRlIGx2bmFtZSBwYXJhbWV0ZXIKKyAqIFRoaXMgbmFtZSBtdXN0IGZvbGxvdyByZXN0cmljdGlvbiBydWxlcyBvbiBwcmVmaXhlcyBhbmQgc3VmZml4ZXMuCisgKgorICogSWYgaXQgY29udGFpbnMgdmduYW1lLCBpdCBpcyBleHRyYWN0ZWQgZnJvbSBsdm5hbWUuCisgKiBJZiB0aGVyZSBpcyBwYXNzZWQgdmduYW1lLCBpdCBpcyBjb21wYXJlZCB3aGV0aGVyIGl0cyB0aGUgc2FtZSBuYW1lLgorICovCitpbnQgdmFsaWRhdGVfcmVzdHJpY3RlZF9sdm5hbWVfcGFyYW0oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKip2Z19uYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqKmx2X25hbWUpCit7CisJaWYgKCF2YWxpZGF0ZV9sdm5hbWVfcGFyYW0oY21kLCB2Z19uYW1lLCBsdl9uYW1lKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAobHZfbmFtZSAmJiAqbHZfbmFtZSAmJiAhYXBwbHlfbHZuYW1lX3Jlc3RyaWN0aW9ucygqbHZfbmFtZSkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBFeHRyYWN0IGxpc3Qgb2YgVkcgbmFtZXMgYW5kIGxpc3Qgb2YgdGFncyBmcm9tIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgKi8KK3N0YXRpYyBpbnQgX2dldF9hcmdfdmduYW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgY29uc3QgY2hhciAqb25lX3ZnbmFtZSwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqdXNlX3ZnbmFtZXMsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmFyZ192Z25hbWVzLAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICphcmdfdGFncykKK3sKKwlpbnQgb3B0ID0gMDsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWNvbnN0IGNoYXIgKnZnX25hbWU7CisKKwlpZiAob25lX3ZnbmFtZSkgeworCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgYXJnX3ZnbmFtZXMsCisJCQkJICBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgb25lX3ZnbmFtZSkpKSB7CisJCQlsb2dfZXJyb3IoInN0cmxpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKwkJcmV0dXJuIHJldF9tYXg7CisJfQorCisJaWYgKHVzZV92Z25hbWVzICYmICFkbV9saXN0X2VtcHR5KHVzZV92Z25hbWVzKSkgeworCQlkbV9saXN0X3NwbGljZShhcmdfdmduYW1lcywgdXNlX3ZnbmFtZXMpOworCQlyZXR1cm4gcmV0X21heDsKKwl9CisKKwlmb3IgKDsgb3B0IDwgYXJnYzsgb3B0KyspIHsKKwkJdmdfbmFtZSA9IGFyZ3Zbb3B0XTsKKworCQlpZiAoKnZnX25hbWUgPT0gJ0AnKSB7CisJCQlpZiAoIXZhbGlkYXRlX3RhZyh2Z19uYW1lICsgMSkpIHsKKwkJCQlsb2dfZXJyb3IoIlNraXBwaW5nIGludmFsaWQgdGFnOiAlcyIsIHZnX25hbWUpOworCQkJCWlmIChyZXRfbWF4IDwgRUlOVkFMSURfQ01EX0xJTkUpCisJCQkJCXJldF9tYXggPSBFSU5WQUxJRF9DTURfTElORTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ190YWdzLAorCQkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z19uYW1lICsgMSkpKSB7CisJCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQl2Z19uYW1lID0gc2tpcF9kZXZfZGlyKGNtZCwgdmdfbmFtZSwgTlVMTCk7CisJCWlmIChzdHJjaHIodmdfbmFtZSwgJy8nKSkgeworCQkJbG9nX2Vycm9yKCJJbnZhbGlkIHZvbHVtZSBncm91cCBuYW1lICVzLiIsIHZnX25hbWUpOworCQkJaWYgKHJldF9tYXggPCBFSU5WQUxJRF9DTURfTElORSkKKwkJCQlyZXRfbWF4ID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bWVtLCBhcmdfdmduYW1lcywKKwkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z19uYW1lKSkpIHsKKwkJCWxvZ19lcnJvcigic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfQorCX0KKworCXJldHVybiByZXRfbWF4OworfQorCitzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmluaXRfcHJvY2Vzc2luZ19oYW5kbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqcGFyZW50X2hhbmRsZSkKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZTsKKworCWlmICghKGhhbmRsZSA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bWVtLCBzaXplb2Yoc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlKSkpKSB7CisJCWxvZ19lcnJvcigiX2luaXRfcHJvY2Vzc2luZ19oYW5kbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByb2Nlc3NpbmcgaGFuZGxlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWhhbmRsZS0+cGFyZW50ID0gcGFyZW50X2hhbmRsZTsKKworCS8qCisJICogRm9yIGFueSByZXBvcnRpbmcgdG9vbCwgdGhlIGludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0IGlzIHJlc2V0IHRvIDAKKwkgKiBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgdGhlIGludGVybmFsIHJlcG9ydGluZy9zZWxlY3Rpb24gaXMgc2ltcGx5IG5vdAorCSAqIG5lZWRlZCAtIHRoZSByZXBvcnRpbmcvc2VsZWN0aW9uIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBjb2RlIHBhdGgKKwkgKiB1c2VkIHRoZXJlLgorCSAqCisJICogKlRoZSBpbnRlcm5hbCByZXBvcnQgZm9yIHNlbGVjdCBpcyBvbmx5IG5lZWRlZCBmb3Igbm9uLXJlcG9ydGluZyB0b29scyEqCisJICovCisJaGFuZGxlLT5pbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdCA9IGFyZ19pc19zZXQoY21kLCBzZWxlY3RfQVJHKTsKKwloYW5kbGUtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnMgPSBjbWQtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnM7CisKKwlpZiAoIXBhcmVudF9oYW5kbGUpIHsKKwkJaWYgKCFyZXBvcnRfZm9ybWF0X2luaXQoY21kLCAmaGFuZGxlLT5yZXBvcnRfZ3JvdXBfdHlwZSwgJmhhbmRsZS0+cmVwb3J0X2dyb3VwLAorCQkJCQkmaGFuZGxlLT5sb2dfcmgsICZoYW5kbGUtPmxvZ19vbmx5LAorCQkJCQkmaGFuZGxlLT5zYXZlZF9sb2dfcmVwb3J0X3N0YXRlKSkgeworCQkJZG1fcG9vbF9mcmVlKGNtZC0+bWVtLCBoYW5kbGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJaGFuZGxlLT5zYXZlZF9sb2dfcmVwb3J0X3N0YXRlID0gbG9nX2dldF9yZXBvcnRfc3RhdGUoKTsKKworCWxvZ19zZXRfcmVwb3J0X2NvbnRleHQoTE9HX1JFUE9SVF9DT05URVhUX1BST0NFU1NJTkcpOworCXJldHVybiBoYW5kbGU7Cit9CisKK2ludCBpbml0X3NlbGVjdGlvbl9oYW5kbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICByZXBvcnRfdHlwZV90IGluaXRpYWxfcmVwb3J0X3R5cGUpCit7CisJc3RydWN0IHNlbGVjdGlvbl9oYW5kbGUgKnNoOworCWNvbnN0IGNoYXIgKnNlbGVjdGlvbjsKKworCWlmICghKHNoID0gZG1fcG9vbF96YWxsb2MoY21kLT5tZW0sIHNpemVvZihzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSkpKSkgeworCQlsb2dfZXJyb3IoIl9pbml0X3NlbGVjdGlvbl9oYW5kbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNlbGVjdGlvbiBoYW5kbGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXBvcnRfZ2V0X3NpbmdsZV9zZWxlY3Rpb24oY21kLCBpbml0aWFsX3JlcG9ydF90eXBlLCAmc2VsZWN0aW9uKSkKKwkJcmV0dXJuXzA7CisKKwlzaC0+cmVwb3J0X3R5cGUgPSBpbml0aWFsX3JlcG9ydF90eXBlOworCWlmICghKHNoLT5zZWxlY3Rpb25fcmggPSByZXBvcnRfaW5pdF9mb3Jfc2VsZWN0aW9uKGNtZCwgJnNoLT5yZXBvcnRfdHlwZSwgc2VsZWN0aW9uKSkpIHsKKwkJZG1fcG9vbF9mcmVlKGNtZC0+bWVtLCBzaCk7CisJCXJldHVybl8wOworCX0KKworCWhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZSA9IHNoOworCXJldHVybiAxOworfQorCit2b2lkIGRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWlmIChoYW5kbGUpIHsKKwkJaWYgKGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZSAmJiBoYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUtPnNlbGVjdGlvbl9yaCkKKwkJCWRtX3JlcG9ydF9mcmVlKGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZS0+c2VsZWN0aW9uX3JoKTsKKworCQlsb2dfcmVzdG9yZV9yZXBvcnRfc3RhdGUoaGFuZGxlLT5zYXZlZF9sb2dfcmVwb3J0X3N0YXRlKTsKKworCQlpZiAoIWRtX3JlcG9ydF9ncm91cF9kZXN0cm95KGhhbmRsZS0+cmVwb3J0X2dyb3VwKSkKKwkJCXN0YWNrOworCQlpZiAoaGFuZGxlLT5sb2dfcmgpIHsKKwkJCWlmIChjbWQtPmlzX2ludGVyYWN0aXZlKSB7CisJCQkJLyoKKwkJCQkgKiBLZWVwIGxvZyByZXBvcnQgaWYgd2UncmUgaW50ZXJhY3RpdmUgc28KKwkJCQkgKiB3ZSBjYW4gZG8gZnVydGhlciBxdWVyaWVzIG9uIHRoaXMgcmVwb3J0LgorCQkJCSAqLworCQkJCWNtZC0+bG9nX3JoID0gaGFuZGxlLT5sb2dfcmg7CisJCQl9IGVsc2UKKwkJCQlkbV9yZXBvcnRfZnJlZShoYW5kbGUtPmxvZ19yaCk7CisJCX0KKwkJLyoKKwkJICogVE9ETzogdGhpbmsgYWJvdXQgYmV0dGVyIGFsdGVybmF0aXZlczoKKwkJICogaGFuZGxlIG1lbXBvb2wsIGRtX2FsbG9jIGZvciBoYW5kbGUgbWVtb3J5Li4uCisJCSAqLworCQltZW1zZXQoaGFuZGxlLCAwLCBzaXplb2YoKmhhbmRsZSkpOworCX0KK30KKworCitpbnQgc2VsZWN0X21hdGNoX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWludCByOworCisJaWYgKCFoYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0KQorCQlyZXR1cm4gMTsKKworCWhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZS0+b3JpZ19yZXBvcnRfdHlwZSA9IFZHUzsKKwlpZiAoIShyID0gcmVwb3J0X2Zvcl9zZWxlY3Rpb24oY21kLCBoYW5kbGUsIE5VTEwsIHZnLCBOVUxMKSkpCisJCWxvZ19lcnJvcigiU2VsZWN0aW9uIGZhaWxlZCBmb3IgVkcgJXMuIiwgdmctPm5hbWUpOworCWhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZS0+b3JpZ19yZXBvcnRfdHlwZSA9IDA7CisKKwlyZXR1cm4gcjsKK30KKworaW50IHNlbGVjdF9tYXRjaF9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdikKK3sKKwlpbnQgcjsKKworCWlmICghaGFuZGxlLT5pbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdCkKKwkJcmV0dXJuIDE7CisKKwloYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUtPm9yaWdfcmVwb3J0X3R5cGUgPSBMVlM7CisJaWYgKCEociA9IHJlcG9ydF9mb3Jfc2VsZWN0aW9uKGNtZCwgaGFuZGxlLCBOVUxMLCB2ZywgbHYpKSkKKwkJbG9nX2Vycm9yKCJTZWxlY3Rpb24gZmFpbGVkIGZvciBMViAlcy4iLCBsdi0+bmFtZSk7CisJaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlLT5vcmlnX3JlcG9ydF90eXBlID0gMDsKKworCXJldHVybiByOworfQorCitpbnQgc2VsZWN0X21hdGNoX3B2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdikKK3sKKwlpbnQgcjsKKworCWlmICghaGFuZGxlLT5pbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdCkKKwkJcmV0dXJuIDE7CisKKwloYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUtPm9yaWdfcmVwb3J0X3R5cGUgPSBQVlM7CisJaWYgKCEociA9IHJlcG9ydF9mb3Jfc2VsZWN0aW9uKGNtZCwgaGFuZGxlLCBwdiwgdmcsIE5VTEwpKSkKKwkJbG9nX2Vycm9yKCJTZWxlY3Rpb24gZmFpbGVkIGZvciBQViAlcy4iLCBkZXZfbmFtZShwdi0+ZGV2KSk7CisJaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlLT5vcmlnX3JlcG9ydF90eXBlID0gMDsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9zZWxlY3RfbWF0Y2hlcyhzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlpZiAoIWhhbmRsZS0+aW50ZXJuYWxfcmVwb3J0X2Zvcl9zZWxlY3QpCisJCXJldHVybiAxOworCisJcmV0dXJuIGhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZS0+c2VsZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfdmduYW1laWRfbGlzdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgdWludDMyX3QgcmVhZF9mbGFncywKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICp2Z25hbWVpZHNfdG9fcHJvY2VzcywKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICphcmdfdmduYW1lcywKKwkJCQkgIHN0cnVjdCBkbV9saXN0ICphcmdfdGFncywKKwkJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgcHJvY2Vzc19zaW5nbGVfdmdfZm5fdCBwcm9jZXNzX3NpbmdsZV92ZykKK3sKKwlsb2dfcmVwb3J0X3Qgc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJc3RydWN0IHZnbmFtZWlkX2xpc3QgKnZnbmw7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICp2Z191dWlkOworCXVpbnQzMl90IGxvY2tkX3N0YXRlID0gMDsKKwlpbnQgd2hvbGVfc2VsZWN0ZWQgPSAwOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldDsKKwlpbnQgc2tpcDsKKwlpbnQgbm90Zm91bmQ7CisJaW50IHByb2Nlc3NfYWxsID0gMDsKKwlpbnQgYWxyZWFkeV9sb2NrZWQ7CisJaW50IGRvX3JlcG9ydF9yZXRfY29kZSA9IDE7CisKKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfdHlwZShMT0dfUkVQT1JUX09CSkVDVF9UWVBFX1ZHKTsKKworCS8qCisJICogSWYgbm8gVkcgbmFtZXMgb3IgdGFncyB3ZXJlIHN1cHBsaWVkLCB0aGVuIHByb2Nlc3MgYWxsIFZHcy4KKwkgKi8KKwlpZiAoZG1fbGlzdF9lbXB0eShhcmdfdmduYW1lcykgJiYgZG1fbGlzdF9lbXB0eShhcmdfdGFncykpCisJCXByb2Nlc3NfYWxsID0gMTsKKworCS8qCisJICogRklYTUUgSWYgb25lX3ZnbmFtZSwgb25seSBwcm9jZWVkIGlmIGV4YWN0bHkgb25lIFZHIG1hdGNoZXMgdGFncyBvciBzZWxlY3Rpb24uCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZnbmwsIHZnbmFtZWlkc190b19wcm9jZXNzKSB7CisJCXZnX25hbWUgPSB2Z25sLT52Z19uYW1lOworCQl2Z191dWlkID0gdmdubC0+dmdpZDsKKwkJc2tpcCA9IDA7CisJCW5vdGZvdW5kID0gMDsKKworCQl1dWlkWzBdID0gJ1wwJzsKKwkJaWYgKGlzX29ycGhhbl92Zyh2Z19uYW1lKSkgeworCQkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X3R5cGUoTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9PUlBIQU4pOworCQkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKHZnX25hbWUgKyBzaXplb2YoVkdfT1JQSEFOUyksIHV1aWQpOworCQl9IGVsc2UgeworCQkJaWYgKHZnX3V1aWQgJiYgIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkKil2Z191dWlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQkJCXN0YWNrOworCQkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKHZnX25hbWUsIHV1aWQpOworCQl9CisKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKworCQlsb2dfdmVyeV92ZXJib3NlKCJQcm9jZXNzaW5nIFZHICVzICVzIiwgdmdfbmFtZSwgdXVpZCk7CisKKwkJaWYgKCFsb2NrZF92ZyhjbWQsIHZnX25hbWUsIE5VTEwsIDAsICZsb2NrZF9zdGF0ZSkpIHsKKwkJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0X21heCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWFscmVhZHlfbG9ja2VkID0gbHZtY2FjaGVfdmduYW1lX2lzX2xvY2tlZCh2Z19uYW1lKTsKKworCQl2ZyA9IHZnX3JlYWQoY21kLCB2Z19uYW1lLCB2Z191dWlkLCByZWFkX2ZsYWdzLCBsb2NrZF9zdGF0ZSk7CisJCWlmIChfaWdub3JlX3ZnKHZnLCB2Z19uYW1lLCBhcmdfdmduYW1lcywgcmVhZF9mbGFncywgJnNraXAsICZub3Rmb3VuZCkpIHsKKwkJCXN0YWNrOworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXRfbWF4KTsKKwkJCWdvdG8gZW5kdmc7CisJCX0KKwkJaWYgKHNraXAgfHwgbm90Zm91bmQpCisJCQlnb3RvIGVuZHZnOworCisJCS8qIFByb2Nlc3MgdGhpcyBWRz8gKi8KKwkJaWYgKChwcm9jZXNzX2FsbCB8fAorCQkgICAgKCFkbV9saXN0X2VtcHR5KGFyZ192Z25hbWVzKSAmJiBzdHJfbGlzdF9tYXRjaF9pdGVtKGFyZ192Z25hbWVzLCB2Z19uYW1lKSkgfHwKKwkJICAgICghZG1fbGlzdF9lbXB0eShhcmdfdGFncykgJiYgc3RyX2xpc3RfbWF0Y2hfbGlzdChhcmdfdGFncywgJnZnLT50YWdzLCBOVUxMKSkpICYmCisJCSAgICBzZWxlY3RfbWF0Y2hfdmcoY21kLCBoYW5kbGUsIHZnKSAmJiBfc2VsZWN0X21hdGNoZXMoaGFuZGxlKSkgeworCisJCQlsb2dfdmVyeV92ZXJib3NlKCJQcm9jZXNzIHNpbmdsZSBWRyAlcyIsIHZnX25hbWUpOworCisJCQlyZXQgPSBwcm9jZXNzX3NpbmdsZV92ZyhjbWQsIHZnX25hbWUsIHZnLCBoYW5kbGUpOworCQkJX3VwZGF0ZV9zZWxlY3Rpb25fcmVzdWx0KGhhbmRsZSwgJndob2xlX3NlbGVjdGVkKTsKKwkJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCQkJc3RhY2s7CisJCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldCk7CisJCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCQlyZXRfbWF4ID0gcmV0OworCQl9CisKKwkJaWYgKCF2Z19yZWFkX2Vycm9yKHZnKSAmJiAhYWxyZWFkeV9sb2NrZWQpCisJCQl1bmxvY2tfdmcoY21kLCB2ZywgdmdfbmFtZSk7CitlbmR2ZzoKKwkJcmVsZWFzZV92Zyh2Zyk7CisJCWlmICghbG9ja2RfdmcoY21kLCB2Z19uYW1lLCAidW4iLCAwLCAmbG9ja2Rfc3RhdGUpKQorCQkJc3RhY2s7CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKE5VTEwsIE5VTEwpOworCX0KKwkvKiB0aGUgVkcgaXMgc2VsZWN0ZWQgaWYgYXQgbGVhc3Qgb25lIExWIGlzIHNlbGVjdGVkICovCisJX3NldF9maW5hbF9zZWxlY3Rpb25fcmVzdWx0KGhhbmRsZSwgd2hvbGVfc2VsZWN0ZWQpOworCWRvX3JlcG9ydF9yZXRfY29kZSA9IDA7CitvdXQ6CisJaWYgKGRvX3JlcG9ydF9yZXRfY29kZSkKKwkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXRfbWF4KTsKKwlsb2dfcmVzdG9yZV9yZXBvcnRfc3RhdGUoc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSk7CisJcmV0dXJuIHJldF9tYXg7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhIGNvbW1hbmQgbGluZSBWRyBuYW1lIGlzIGFtYmlndW91cywgaS5lLiB0aGVyZSBhcmUgbXVsdGlwbGUgVkdzIG9uCisgKiB0aGUgc3lzdGVtIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gbmFtZS4gIElmICpvbmUqIFZHIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMKKyAqIGxvY2FsIGFuZCB0aGUgcmVzdCBhcmUgZm9yZWlnbiwgdGhlbiB1c2UgdGhlIGxvY2FsIFZHIChyZW1vdmluZyBmb3JlaWduIFZHcworICogd2l0aCB0aGUgc2FtZSBuYW1lIGZyb20gdGhlIHZnbmFtZWlkc19vbl9zeXN0ZW0gbGlzdCkuICBJZiBtdWx0aXBsZSBWR3Mgd2l0aAorICogdGhlIGdpdmVuIG5hbWUgYXJlIGxvY2FsLCB3ZSBkb24ndCBrbm93IHdoaWNoIFZHIGlzIGludGVuZGVkLCBzbyByZW1vdmUgdGhlCisgKiBhbWJpZ3VvdXMgbmFtZSBmcm9tIHRoZSBsaXN0IG9mIGFyZ3MuCisgKi8KK3N0YXRpYyBpbnQgX3Jlc29sdmVfZHVwbGljYXRlX3ZnbmFtZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ192Z25hbWVzLAorCQkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICp2Z25hbWVpZHNfb25fc3lzdGVtKQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2wsICpzbDI7CisJc3RydWN0IHZnbmFtZWlkX2xpc3QgKnZnbmwsICp2Z25sMjsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlpbnQgZm91bmQ7CisJaW50IHJldCA9IEVDTURfUFJPQ0VTU0VEOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoc2wsIHNsMiwgYXJnX3ZnbmFtZXMpIHsKKwkJZm91bmQgPSAwOworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXModmdubCwgdmduYW1laWRzX29uX3N5c3RlbSkgeworCQkJaWYgKHN0cmNtcChzbC0+c3RyLCB2Z25sLT52Z19uYW1lKSkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kKys7CisJCX0KKworCQlpZiAoZm91bmQgPCAyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTW9yZSB0aGFuIG9uZSBWRyBtYXRjaCB0aGUgZ2l2ZW4gbmFtZS4KKwkJICogSWYgb25seSBvbmUgaXMgbG9jYWwsIHVzZSB0aGF0IG9uZS4KKwkJICovCisKKwkJZm91bmQgPSAwOworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZSh2Z25sLCB2Z25sMiwgdmduYW1laWRzX29uX3N5c3RlbSkgeworCQkJaWYgKHN0cmNtcChzbC0+c3RyLCB2Z25sLT52Z19uYW1lKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIFdpdGhvdXQgbHZtZXRhZCwgYSBsYWJlbCBzY2FuIGhhcyBhbHJlYWR5IHBvcHVsYXRlZAorCQkJICogbHZtY2FjaGUgdmdpbmZvIHdpdGggdGhpcyBpbmZvcm1hdGlvbi4KKwkJCSAqIFdpdGggbHZtZXRhZCwgdGhpcyBmdW5jdGlvbiBkb2VzIHZnX2xvb2t1cCBvbiB0aGlzCisJCQkgKiBuYW1lL3ZnaWQgYW5kIGNoZWNrcyBzeXN0ZW1faWQgaW4gdGhlIG1ldGFkYXRhLgorCQkJICovCisJCQlpZiAobHZtY2FjaGVfdmdfaXNfZm9yZWlnbihjbWQsIHZnbmwtPnZnX25hbWUsIHZnbmwtPnZnaWQpKSB7CisJCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoKGNvbnN0IHN0cnVjdCBpZCopdmdubC0+dmdpZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJCQkJc3RhY2s7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IElnbm9yaW5nIGZvcmVpZ24gVkcgd2l0aCBtYXRjaGluZyBuYW1lICVzIFVVSUQgJXMuIiwKKwkJCQkJIHZnbmwtPnZnX25hbWUsIHV1aWQpOworCQkJCWRtX2xpc3RfZGVsKCZ2Z25sLT5saXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJZm91bmQrKzsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCA8IDIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBNb3JlIHRoYW4gb25lIFZHIHdpdGggdGhpcyBuYW1lIGlzIGxvY2FsIHNvIHRoZSBpbnRlbmRlZCBWRworCQkgKiBpcyB1bmtub3duLgorCQkgKi8KKwkJbG9nX2Vycm9yKCJNdWx0aXBsZSBWR3MgZm91bmQgd2l0aCB0aGUgc2FtZSBuYW1lOiBza2lwcGluZyAlcyIsIHNsLT5zdHIpOworCQlsb2dfZXJyb3IoIlVzZSAtLXNlbGVjdCB2Z191dWlkPTx1dWlkPiBpbiBwbGFjZSBvZiB0aGUgVkcgbmFtZS4iKTsKKwkJZG1fbGlzdF9kZWwoJnNsLT5saXN0KTsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZvciBlYWNoIGFyZ192Z25hbWUsIG1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgZnJvbQorICogdmduYW1laWRzX29uX3N5c3RlbSB0byB2Z25hbWVpZHNfdG9fcHJvY2Vzcy4gIElmIGFuCisgKiBpdGVtIGluIGFyZ192Z25hbWVzIGRvZXNuJ3QgZXhpc3QgaW4gdmduYW1laWRzX29uX3N5c3RlbSwKKyAqIHRoZW4gYWRkIGEgbmV3IGVudHJ5IGZvciBpdCB0byB2Z25hbWVpZHNfdG9fcHJvY2Vzcy4KKyAqLworc3RhdGljIHZvaWQgX2Nob29zZV92Z3NfdG9fcHJvY2VzcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX3ZnbmFtZXMsCisJCQkJICAgc3RydWN0IGRtX2xpc3QgKnZnbmFtZWlkc19vbl9zeXN0ZW0sCisJCQkJICAgc3RydWN0IGRtX2xpc3QgKnZnbmFtZWlkc190b19wcm9jZXNzKQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2wsICpzbDI7CisJc3RydWN0IHZnbmFtZWlkX2xpc3QgKnZnbmwsICp2Z25sMjsKKwlzdHJ1Y3QgaWQgaWQ7CisJaW50IGFyZ19pc191dWlkID0gMDsKKwlpbnQgZm91bmQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShzbCwgc2wyLCBhcmdfdmduYW1lcykgeworCQlmb3VuZCA9IDA7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHZnbmwsIHZnbmwyLCB2Z25hbWVpZHNfb25fc3lzdGVtKSB7CisJCQlpZiAoc3RyY21wKHNsLT5zdHIsIHZnbmwtPnZnX25hbWUpKQorCQkJCWNvbnRpbnVlOworCisJCQlkbV9saXN0X2RlbCgmdmdubC0+bGlzdCk7CisJCQlkbV9saXN0X2FkZCh2Z25hbWVpZHNfdG9fcHJvY2VzcywgJnZnbmwtPmxpc3QpOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgVkcgbmFtZSBhcmcgbG9va3MgbGlrZSBhIFVVSUQsIHRoZW4gY2hlY2sgaWYgaXQKKwkJICogbWF0Y2hlcyB0aGUgVVVJRCBvZiBhIFZHLiAgKC0tc2VsZWN0IHNob3VsZCBnZW5lcmFsbHkKKwkJICogYmUgdXNlZCB0byBzZWxlY3QgYSBWRyBieSB1dWlkIGluc3RlYWQuKQorCQkgKi8KKwkJaWYgKCFmb3VuZCAmJiAoY21kLT5jb21tYW5kLT5mbGFncyAmIEFMTE9XX1VVSURfQVNfTkFNRSkpCisJCQlhcmdfaXNfdXVpZCA9IGlkX3JlYWRfZm9ybWF0X3RyeSgmaWQsIHNsLT5zdHIpOworCisJCWlmICghZm91bmQgJiYgYXJnX2lzX3V1aWQpIHsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHZnbmwsIHZnbmwyLCB2Z25hbWVpZHNfb25fc3lzdGVtKSB7CisJCQkJaWYgKCEoaWRfd3JpdGVfZm9ybWF0KChjb25zdCBzdHJ1Y3QgaWQqKXZnbmwtPnZnaWQsIHV1aWQsIHNpemVvZih1dWlkKSkpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChzdHJjbXAoc2wtPnN0ciwgdXVpZCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJbG9nX3ByaW50KCJQcm9jZXNzaW5nIFZHICVzIGJlY2F1c2Ugb2YgbWF0Y2hpbmcgVVVJRCAlcyIsCisJCQkJCSAgdmdubC0+dmdfbmFtZSwgdXVpZCk7CisKKwkJCQlkbV9saXN0X2RlbCgmdmdubC0+bGlzdCk7CisJCQkJZG1fbGlzdF9hZGQodmduYW1laWRzX3RvX3Byb2Nlc3MsICZ2Z25sLT5saXN0KTsKKworCQkJCS8qIE1ha2UgdGhlIGFyZ192Z25hbWVzIGVudHJ5IHVzZSB0aGUgYWN0dWFsIFZHIG5hbWUuICovCisJCQkJc2wtPnN0ciA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z25sLT52Z19uYW1lKTsKKworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkKKwkJLyoKKwkJICogSWYgdGhlIG5hbWUgYXJnIHdhcyBub3QgZm91bmQgaW4gdGhlIGxpc3Qgb2YgYWxsIFZHcywgdGhlbgorCQkgKiBpdCBwcm9iYWJseSBkb2Vzbid0IGV4aXN0LCBidXQgd2Ugd2FudCB0aGUgIlZHIG5vdCBmb3VuZCIKKwkJICogZmFpbHVyZSB0byBiZSBoYW5kbGVkIGJ5IHRoZSBleGlzdGluZyB2Z19yZWFkKCkgY29kZSBmb3IKKwkJICogdGhhdCBlcnJvci4gIFNvLCBjcmVhdGUgYW4gZW50cnkgd2l0aCBqdXN0IHRoZSBWRyBuYW1lIHNvCisJCSAqIHRoYXQgdGhlIHByb2Nlc3NpbmcgbG9vcCB3aWxsIGF0dGVtcHQgdG8gcHJvY2VzcyBpdCBhbmQgdXNlCisJCSAqIHRoZSB2Z19yZWFkKCkgZXJyb3IgcGF0aC4KKwkJICovCisJCWlmICghZm91bmQpIHsKKwkJCWxvZ192ZXJib3NlKCJWRyBuYW1lIG9uIGNvbW1hbmQgbGluZSBub3QgZm91bmQgaW4gbGlzdCBvZiBWR3M6ICVzIiwgc2wtPnN0cik7CisKKwkJCWlmICghKHZnbmwgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnZnbmwpKSkpCisJCQkJY29udGludWU7CisKKwkJCXZnbmwtPnZnaWQgPSBOVUxMOworCisJCQlpZiAoISh2Z25sLT52Z19uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHNsLT5zdHIpKSkKKwkJCQljb250aW51ZTsKKworCQkJZG1fbGlzdF9hZGQodmduYW1laWRzX3RvX3Byb2Nlc3MsICZ2Z25sLT5saXN0KTsKKwkJfQorCX0KK30KKworLyoKKyAqIENhbGwgcHJvY2Vzc19zaW5nbGVfdmcoKSBmb3IgZWFjaCBWRyBzZWxlY3RlZCBieSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAqIElmIG9uZV92Z25hbWUgaXMgc2V0LCBwcm9jZXNzIG9ubHkgdGhhdCBWRyBhbmQgaWdub3JlIGFyZ2MvYXJndiAod2hpY2ggc2hvdWxkIGJlIDAvTlVMTCkuCisgKiBJZiBvbmVfdmduYW1lIGlzIG5vdCBzZXQsIGdldCBWRyBuYW1lcyB0byBwcm9jZXNzIGZyb20gYXJnYy9hcmd2LgorICovCitpbnQgcHJvY2Vzc19lYWNoX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkgICAgY29uc3QgY2hhciAqb25lX3ZnbmFtZSwKKwkJICAgIHN0cnVjdCBkbV9saXN0ICp1c2VfdmduYW1lcywKKwkJICAgIHVpbnQzMl90IHJlYWRfZmxhZ3MsCisJCSAgICBpbnQgaW5jbHVkZV9pbnRlcm5hbCwKKwkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgcHJvY2Vzc19zaW5nbGVfdmdfZm5fdCBwcm9jZXNzX3NpbmdsZV92ZykKK3sKKwlsb2dfcmVwb3J0X3Qgc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisJaW50IGhhbmRsZV9zdXBwbGllZCA9IGhhbmRsZSAhPSBOVUxMOworCXN0cnVjdCBkbV9saXN0IGFyZ190YWdzOwkJLyogc3RyX2xpc3QgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBhcmdfdmduYW1lczsJCS8qIHN0cl9saXN0ICovCisJc3RydWN0IGRtX2xpc3QgdmduYW1laWRzX29uX3N5c3RlbTsJLyogdmduYW1laWRfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IHZnbmFtZWlkc190b19wcm9jZXNzOwkvKiB2Z25hbWVpZF9saXN0ICovCisJaW50IGVuYWJsZV9hbGxfdmdzID0gKGNtZC0+Y29tbWFuZC0+ZmxhZ3MgJiBBTExfVkdTX0lTX0RFRkFVTFQpOworCWludCBwcm9jZXNzX2FsbF92Z3Nfb25fc3lzdGVtID0gMDsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWludCByZXQ7CisKKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfdHlwZShMT0dfUkVQT1JUX09CSkVDVF9UWVBFX1ZHKTsKKwlsb2dfZGVidWcoIlByb2Nlc3NpbmcgZWFjaCBWRyIpOworCisJLyogRGlzYWJsZSBlcnJvciBpbiB2Z19yZWFkIHNvIHdlIGNhbiBwcmludCBpdCBmcm9tIGlnbm9yZV92Zy4gKi8KKwljbWQtPnZnX3JlYWRfcHJpbnRfYWNjZXNzX2Vycm9yID0gMDsKKworCWRtX2xpc3RfaW5pdCgmYXJnX3RhZ3MpOworCWRtX2xpc3RfaW5pdCgmYXJnX3ZnbmFtZXMpOworCWRtX2xpc3RfaW5pdCgmdmduYW1laWRzX29uX3N5c3RlbSk7CisJZG1fbGlzdF9pbml0KCZ2Z25hbWVpZHNfdG9fcHJvY2Vzcyk7CisKKwkvKgorCSAqIEZpbmQgYW55IFZHcyBvciB0YWdzIGV4cGxpY2l0bHkgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKwkgKi8KKwlpZiAoKHJldCA9IF9nZXRfYXJnX3ZnbmFtZXMoY21kLCBhcmdjLCBhcmd2LCBvbmVfdmduYW1lLCB1c2VfdmduYW1lcywgJmFyZ192Z25hbWVzLCAmYXJnX3RhZ3MpKSAhPSBFQ01EX1BST0NFU1NFRCkgeworCQlyZXRfbWF4ID0gcmV0OworCQlnb3RvX291dDsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgYWxsIFZHcyBvbiB0aGUgc3lzdGVtIHdoZW46CisJICogLiB0YWdzIGFyZSBzcGVjaWZpZWQgYW5kIGFsbCBWR3MgbmVlZCB0byBiZSByZWFkIHRvCisJICogICBsb29rIGZvciBtYXRjaGluZyB0YWdzLgorCSAqIC4gbm8gVkcgbmFtZXMgYXJlIHNwZWNpZmllZCBhbmQgdGhlIGNvbW1hbmQgZGVmYXVsdHMKKwkgKiAgIHRvIHByb2Nlc3NpbmcgYWxsIFZHcyB3aGVuIG5vbmUgYXJlIHNwZWNpZmllZC4KKwkgKi8KKwlpZiAoKGRtX2xpc3RfZW1wdHkoJmFyZ192Z25hbWVzKSAmJiBlbmFibGVfYWxsX3ZncykgfHwgIWRtX2xpc3RfZW1wdHkoJmFyZ190YWdzKSkKKwkJcHJvY2Vzc19hbGxfdmdzX29uX3N5c3RlbSA9IDE7CisKKwkvKgorCSAqIE5lZWRlZCBmb3IgYSBjdXJyZW50IGxpc3Rpbmcgb2YgdGhlIGdsb2JhbCBWRyBuYW1lc3BhY2UuCisJICovCisJaWYgKHByb2Nlc3NfYWxsX3Znc19vbl9zeXN0ZW0gJiYgIWxvY2tkX2dsKGNtZCwgInNoIiwgMCkpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwkvKgorCSAqIEZpcnN0IHJlc2NhbiBmb3IgYXZhaWxhYmxlIGRldmljZXMsIHRoZW4gZm9yY2UgdGhlIG5leHQKKwkgKiBsYWJlbCBzY2FuIHRvIGJlIGRvbmUuICBnZXRfdmduYW1laWRzKCkgd2lsbCBzY2FuIGxhYmVscworCSAqICh3aGVuIG5vdCB1c2luZyBsdm1ldGFkKS4KKwkgKi8KKwlpZiAoY21kLT5jb21tYW5kLT5mbGFncyAmIFJFUVVJUkVTX0ZVTExfTEFCRUxfU0NBTikgeworCQlkZXZfY2FjaGVfZnVsbF9zY2FuKGNtZC0+ZnVsbF9maWx0ZXIpOworCQlsdm1jYWNoZV9mb3JjZV9uZXh0X2xhYmVsX3NjYW4oKTsKKwl9CisKKwkvKgorCSAqIEEgbGlzdCBvZiBhbGwgVkdzIG9uIHRoZSBzeXN0ZW0gaXMgbmVlZGVkIHdoZW46CisJICogLiBwcm9jZXNzaW5nIGFsbCBWR3Mgb24gdGhlIHN5c3RlbQorCSAqIC4gQSBWRyBuYW1lIGlzIHNwZWNpZmllZCB3aGljaCBtYXkgcmVmZXIgdG8gb25lCisJICogICBvZiBtdWx0aXBsZSBWR3Mgb24gdGhlIHN5c3RlbSB3aXRoIHRoYXQgbmFtZS4KKwkgKi8KKwlsb2dfZGVidWcoIkdldCBsaXN0IG9mIFZHcyBvbiBzeXN0ZW0iKTsKKworCWlmICghZ2V0X3ZnbmFtZWlkcyhjbWQsICZ2Z25hbWVpZHNfb25fc3lzdGVtLCBOVUxMLCBpbmNsdWRlX2ludGVybmFsKSkgeworCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworCWlmICghZG1fbGlzdF9lbXB0eSgmYXJnX3ZnbmFtZXMpKSB7CisJCS8qIFRoaXMgbWF5IHJlbW92ZSBlbnRyaWVzIGZyb20gYXJnX3ZnbmFtZXMgb3IgdmduYW1laWRzX29uX3N5c3RlbS4gKi8KKwkJcmV0ID0gX3Jlc29sdmVfZHVwbGljYXRlX3ZnbmFtZXMoY21kLCAmYXJnX3ZnbmFtZXMsICZ2Z25hbWVpZHNfb25fc3lzdGVtKTsKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCQlpZiAoZG1fbGlzdF9lbXB0eSgmYXJnX3ZnbmFtZXMpICYmIGRtX2xpc3RfZW1wdHkoJmFyZ190YWdzKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmYXJnX3ZnbmFtZXMpICYmIGRtX2xpc3RfZW1wdHkoJnZnbmFtZWlkc19vbl9zeXN0ZW0pKSB7CisJCS8qIEZJWE1FIFNob3VsZCBiZSBsb2dfcHJpbnQsIGJ1dCBzdXBwcmVzc2VkIGZvciByZXBvcnRpbmcgY21kcyAqLworCQlsb2dfdmVyYm9zZSgiTm8gdm9sdW1lIGdyb3VwcyBmb3VuZC4iKTsKKwkJcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmYXJnX3ZnbmFtZXMpKQorCQlyZWFkX2ZsYWdzIHw9IFJFQURfT0tfTk9URk9VTkQ7CisKKwkvKgorCSAqIFdoZW4gcHJvY2Vzc2luZyBhbGwgVkdzLCB2Z25hbWVpZHNfb25fc3lzdGVtIHNpbXBseSBiZWNvbWVzCisJICogdmduYW1laWRzX3RvX3Byb2Nlc3MuCisJICogV2hlbiBwcm9jZXNzaW5nIG9ubHkgc3BlY2lmaWVkIFZHcywgdGhlbiBmb3IgZWFjaCBpdGVtIGluCisJICogYXJnX3ZnbmFtZXMsIG1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgZnJvbQorCSAqIHZnbmFtZWlkc19vbl9zeXN0ZW0gdG8gdmduYW1laWRzX3RvX3Byb2Nlc3MuCisJICovCisJaWYgKHByb2Nlc3NfYWxsX3Znc19vbl9zeXN0ZW0pCisJCWRtX2xpc3Rfc3BsaWNlKCZ2Z25hbWVpZHNfdG9fcHJvY2VzcywgJnZnbmFtZWlkc19vbl9zeXN0ZW0pOworCWVsc2UKKwkJX2Nob29zZV92Z3NfdG9fcHJvY2VzcyhjbWQsICZhcmdfdmduYW1lcywgJnZnbmFtZWlkc19vbl9zeXN0ZW0sICZ2Z25hbWVpZHNfdG9fcHJvY2Vzcyk7CisKKwlpZiAoIWhhbmRsZSAmJiAhKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwlpZiAoaGFuZGxlLT5pbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdCAmJiAhaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlICYmCisJICAgICFpbml0X3NlbGVjdGlvbl9oYW5kbGUoY21kLCBoYW5kbGUsIFZHUykpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwlyZXQgPSBfcHJvY2Vzc192Z25hbWVpZF9saXN0KGNtZCwgcmVhZF9mbGFncywgJnZnbmFtZWlkc190b19wcm9jZXNzLAorCQkJCSAgICAgJmFyZ192Z25hbWVzLCAmYXJnX3RhZ3MsIGhhbmRsZSwgcHJvY2Vzc19zaW5nbGVfdmcpOworCWlmIChyZXQgPiByZXRfbWF4KQorCQlyZXRfbWF4ID0gcmV0Oworb3V0OgorCWlmICghaGFuZGxlX3N1cHBsaWVkKQorCQlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKworCWxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShzYXZlZF9sb2dfcmVwb3J0X3N0YXRlKTsKKwlyZXR1cm4gcmV0X21heDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9zdHJfbGlzdCAqX3N0cl9saXN0X21hdGNoX2l0ZW1fd2l0aF9wcmVmaXgoY29uc3Qgc3RydWN0IGRtX2xpc3QgKnNsbCwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwlzaXplX3QgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBzbGwpIHsKKwkJaWYgKCFzdHJuY21wKHByZWZpeCwgc2wtPnN0ciwgcHJlZml4X2xlbikgJiYKKwkJICAgICFzdHJjbXAoc2wtPnN0ciArIHByZWZpeF9sZW4sIHN0cikpCisJCQlyZXR1cm4gc2w7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBEdW1teSBMViwgc2VnbWVudCB0eXBlIGFuZCBzZWdtZW50IHRvIHJlcHJlc2VudCBhbGwgaGlzdG9yaWNhbCBMVnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgX2hpc3RvcmljYWxfbHYgPSB7CisJLm5hbWUgPSAiIiwKKwkubWFqb3IgPSAtMSwKKwkubWlub3IgPSAtMSwKKwkuc25hcHNob3Rfc2VncyA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2LnNuYXBzaG90X3NlZ3MpLAorCS5zZWdtZW50cyA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2LnNlZ21lbnRzKSwKKwkudGFncyA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2LnRhZ3MpLAorCS5zZWdzX3VzaW5nX3RoaXNfbHYgPSBETV9MSVNUX0hFQURfSU5JVChfaGlzdG9yaWNhbF9sdi5zZWdzX3VzaW5nX3RoaXNfbHYpLAorCS5pbmRpcmVjdF9nbHZzID0gRE1fTElTVF9IRUFEX0lOSVQoX2hpc3RvcmljYWxfbHYuaW5kaXJlY3RfZ2x2cyksCisJLmhvc3RuYW1lID0gIiIsCit9OworCitzdGF0aWMgc3RydWN0IHNlZ21lbnRfdHlwZSBfaGlzdG9yaWNhbF9zZWdtZW50X3R5cGUgPSB7CisJLm5hbWUgPSAiaGlzdG9yaWNhbCIsCisJLmZsYWdzID0gU0VHX1ZJUlRVQUwgfCBTRUdfQ0FOTk9UX0JFX1pFUk9FRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbHZfc2VnbWVudCBfaGlzdG9yaWNhbF9sdl9zZWdtZW50ID0geworCS5sdiA9ICZfaGlzdG9yaWNhbF9sdiwKKwkuc2VndHlwZSA9ICZfaGlzdG9yaWNhbF9zZWdtZW50X3R5cGUsCisJLmxlbiA9IDAsCisJLnRhZ3MgPSBETV9MSVNUX0hFQURfSU5JVChfaGlzdG9yaWNhbF9sdl9zZWdtZW50LnRhZ3MpLAorCS5vcmlnaW5fbGlzdCA9IERNX0xJU1RfSEVBRF9JTklUKF9oaXN0b3JpY2FsX2x2X3NlZ21lbnQub3JpZ2luX2xpc3QpLAorfTsKKworaW50IHByb2Nlc3NfZWFjaF9sdl9pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBkbV9saXN0ICphcmdfbHZuYW1lcywgY29uc3Qgc3RydWN0IGRtX2xpc3QgKnRhZ3NfaW4sCisJCQkgIGludCBzdG9wX29uX2Vycm9yLAorCQkJICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCSAgcHJvY2Vzc19zaW5nbGVfbHZfZm5fdCBwcm9jZXNzX3NpbmdsZV9sdikKK3sKKwlsb2dfcmVwb3J0X3Qgc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisJY2hhciBsdl91dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJY2hhciB2Z191dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd2hvbGVfc2VsZWN0ZWQgPSAwOworCWludCBoYW5kbGVfc3VwcGxpZWQgPSBoYW5kbGUgIT0gTlVMTDsKKwl1bnNpZ25lZCBwcm9jZXNzX2x2OworCXVuc2lnbmVkIHByb2Nlc3NfYWxsID0gMDsKKwl1bnNpZ25lZCB0YWdzX3N1cHBsaWVkID0gMDsKKwl1bnNpZ25lZCBsdmFyZ3Nfc3VwcGxpZWQgPSAwOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGRtX3N0cl9saXN0ICpzbDsKKwlzdHJ1Y3QgZG1fbGlzdCBmaW5hbF9sdnM7CisJc3RydWN0IGx2X2xpc3QgKmZpbmFsX2x2bDsKKwlzdHJ1Y3QgZ2x2X2xpc3QgKmdsdmwsICp0Z2x2bDsKKwlpbnQgZG9fcmVwb3J0X3JldF9jb2RlID0gMTsKKworCWxvZ19zZXRfcmVwb3J0X29iamVjdF90eXBlKExPR19SRVBPUlRfT0JKRUNUX1RZUEVfTFYpOworCisJdmdfdXVpZFswXSA9ICdcMCc7CisJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnZnLT5pZCwgdmdfdXVpZCwgc2l6ZW9mKHZnX3V1aWQpKSkKKwkJc3RhY2s7CisKKwlkbV9saXN0X2luaXQoJmZpbmFsX2x2cyk7CisKKwlpZiAoIXZnX2NoZWNrX3N0YXR1cyh2ZywgRVhQT1JURURfVkcpKSB7CisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKHRhZ3NfaW4gJiYgIWRtX2xpc3RfZW1wdHkodGFnc19pbikpCisJCXRhZ3Nfc3VwcGxpZWQgPSAxOworCisJaWYgKGFyZ19sdm5hbWVzICYmICFkbV9saXN0X2VtcHR5KGFyZ19sdm5hbWVzKSkKKwkJbHZhcmdzX3N1cHBsaWVkID0gMTsKKworCWlmICghaGFuZGxlICYmICEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworCWlmIChoYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0ICYmICFoYW5kbGUtPnNlbGVjdGlvbl9oYW5kbGUgJiYKKwkgICAgIWluaXRfc2VsZWN0aW9uX2hhbmRsZShjbWQsIGhhbmRsZSwgTFZTKSkgeworCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworCS8qIFByb2Nlc3MgYWxsIExWcyBpbiB0aGlzIFZHIGlmIG5vIHJlc3RyaWN0aW9ucyBnaXZlbiAKKwkgKiBvciBpZiBWRyB0YWdzIG1hdGNoLiAqLworCWlmICgoIXRhZ3Nfc3VwcGxpZWQgJiYgIWx2YXJnc19zdXBwbGllZCkgfHwKKwkgICAgKHRhZ3Nfc3VwcGxpZWQgJiYgc3RyX2xpc3RfbWF0Y2hfbGlzdCh0YWdzX2luLCAmdmctPnRhZ3MsIE5VTEwpKSkKKwkJcHJvY2Vzc19hbGwgPSAxOworCisJbG9nX3NldF9yZXBvcnRfb2JqZWN0X2dyb3VwX2FuZF9ncm91cF9pZCh2Zy0+bmFtZSwgdmdfdXVpZCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlsdl91dWlkWzBdID0gJ1wwJzsKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmx2bC0+bHYtPmx2aWQuaWRbMV0sIGx2X3V1aWQsIHNpemVvZihsdl91dWlkKSkpCisJCQlzdGFjazsKKworCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQobHZsLT5sdi0+bmFtZSwgbHZfdXVpZCk7CisKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKworCQlpZiAobHZsLT5sdi0+c3RhdHVzICYgU05BUFNIT1QpCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIGF2YWlsYWJpbGl0eSBjaGFuZ2UgZm9yIG5vbi12aXJ0IHNuYXBzIHdoZW4gcHJvY2Vzc2luZyBhbGwgTFZzICovCisJCS8qIEZJWE1FOiBwYXNzIHByb2Nlc3NfYWxsIHRvIHByb2Nlc3Nfc2luZ2xlX2x2KCkgKi8KKwkJaWYgKHByb2Nlc3NfYWxsICYmIGFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpICYmCisJCSAgICBsdl9pc19jb3cobHZsLT5sdikgJiYgIWx2X2lzX3ZpcnR1YWxfb3JpZ2luKG9yaWdpbl9mcm9tX2NvdyhsdmwtPmx2KSkpCisJCQljb250aW51ZTsKKworCQlpZiAobHZfaXNfdmlydHVhbF9vcmlnaW4obHZsLT5sdikgJiYgIWFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSkgeworCQkJaWYgKGx2YXJnc19zdXBwbGllZCAmJgorCQkJICAgIHN0cl9saXN0X21hdGNoX2l0ZW0oYXJnX2x2bmFtZXMsIGx2bC0+bHYtPm5hbWUpKQorCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJJZ25vcmluZyB2aXJ0dWFsIG9yaWdpbiBsb2dpY2FsIHZvbHVtZSAlcy4iLAorCQkJCQkJCWRpc3BsYXlfbHZuYW1lKGx2bC0+bHYpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogT25seSBsZXQgaGlkZGVuIExWcyB0aHJvdWdoIGlmIC0tYWxsIHdhcyB1c2VkIG9yIHRoZSBMVnMgCisJCSAqIHdlcmUgc3BlY2lmaWNhbGx5IG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJCSAqLworCQlpZiAoIWx2YXJnc19zdXBwbGllZCAmJiAhbHZfaXNfdmlzaWJsZShsdmwtPmx2KSAmJiAhYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogT25seSBsZXQgc2FubG9jayBMViB0aHJvdWdoIGlmIC0tYWxsIHdhcyB1c2VkIG9yIGlmCisJCSAqIGl0IGlzIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJCSAqLworCQlpZiAobHZfaXNfbG9ja2Rfc2FubG9ja19sdihsdmwtPmx2KSkgeworCQkJaWYgKGFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSB8fAorCQkJICAgIChsdmFyZ3Nfc3VwcGxpZWQgJiYgc3RyX2xpc3RfbWF0Y2hfaXRlbShhcmdfbHZuYW1lcywgbHZsLT5sdi0+bmFtZSkpKSB7CisJCQkJbG9nX3ZlcnlfdmVyYm9zZSgiUHJvY2Vzc2luZyBsb2NrZF9zYW5sb2NrX2x2ICVzLyVzLiIsIHZnLT5uYW1lLCBsdmwtPmx2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBwcm9jZXNzIHRoZSBMViBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkJICogLSBwcm9jZXNzX2FsbCBpcyBzZXQKKwkJICogLSBMViBuYW1lIG1hdGNoZXMgYSBzdXBwbGllZCBMViBuYW1lCisJCSAqIC0gTFYgdGFnIG1hdGNoZXMgYSBzdXBwbGllZCBMViB0YWcKKwkJICogLSBMViBtYXRjaGVzIHRoZSBzZWxlY3Rpb24KKwkJICovCisKKwkJcHJvY2Vzc19sdiA9IHByb2Nlc3NfYWxsOworCisJCWlmIChsdmFyZ3Nfc3VwcGxpZWQgJiYgc3RyX2xpc3RfbWF0Y2hfaXRlbShhcmdfbHZuYW1lcywgbHZsLT5sdi0+bmFtZSkpIHsKKwkJCS8qIFJlbW92ZSBMViBmcm9tIGxpc3Qgb2YgdW5wcm9jZXNzZWQgTFYgbmFtZXMgKi8KKwkJCXN0cl9saXN0X2RlbChhcmdfbHZuYW1lcywgbHZsLT5sdi0+bmFtZSk7CisJCQlwcm9jZXNzX2x2ID0gMTsKKwkJfQorCisJCWlmICghcHJvY2Vzc19sdiAmJiB0YWdzX3N1cHBsaWVkICYmIHN0cl9saXN0X21hdGNoX2xpc3QodGFnc19pbiwgJmx2bC0+bHYtPnRhZ3MsIE5VTEwpKQorCQkJcHJvY2Vzc19sdiA9IDE7CisKKwkJcHJvY2Vzc19sdiA9IHByb2Nlc3NfbHYgJiYgc2VsZWN0X21hdGNoX2x2KGNtZCwgaGFuZGxlLCB2ZywgbHZsLT5sdikgJiYgX3NlbGVjdF9tYXRjaGVzKGhhbmRsZSk7CisKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKworCQlpZiAoIXByb2Nlc3NfbHYpCisJCQljb250aW51ZTsKKworCQlsb2dfdmVyeV92ZXJib3NlKCJBZGRpbmcgJXMvJXMgdG8gdGhlIGxpc3Qgb2YgTFZzIHRvIGJlIHByb2Nlc3NlZC4iLCB2Zy0+bmFtZSwgbHZsLT5sdi0+bmFtZSk7CisKKwkJaWYgKCEoZmluYWxfbHZsID0gZG1fcG9vbF96YWxsb2MoY21kLT5tZW0sIHNpemVvZihzdHJ1Y3QgbHZfbGlzdCkpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZmluYWwgTFYgbGlzdCBpdGVtLiIpOworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKwkJZmluYWxfbHZsLT5sdiA9IGx2bC0+bHY7CisJCWRtX2xpc3RfYWRkKCZmaW5hbF9sdnMsICZmaW5hbF9sdmwtPmxpc3QpOworCX0KKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQoTlVMTCwgTlVMTCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmZmluYWxfbHZzKSB7CisJCWx2X3V1aWRbMF0gPSAnXDAnOworCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmbHZsLT5sdi0+bHZpZC5pZFsxXSwgbHZfdXVpZCwgc2l6ZW9mKGx2X3V1aWQpKSkKKwkJCXN0YWNrOworCisJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChsdmwtPmx2LT5uYW1lLCBsdl91dWlkKTsKKworCQlpZiAoc2lnaW50X2NhdWdodCgpKSB7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvX291dDsKKwkJfQorCQkvKgorCQkgKiAgRklYTUU6IE9uY2Ugd2UgaGF2ZSBpbmRleCBvdmVyIHZnLT5yZW1vdmVkX2x2cywgY2hlY2sgZGlyZWN0bHkKKwkJICogICAgICAgICBMViBwcmVzZW5jZSB0aGVyZSBhbmQgcmVtb3ZlIExWX1JFTU9WRSBmbGFnL2x2X2lzX3JlbW92ZWQgZm4KKwkJICogICAgICAgICBhcyB0aGV5IHdvbid0IGJlIG5lZWRlZCBhbnltb3JlLgorCQkgKi8KKwkJaWYgKGx2X2lzX3JlbW92ZWQobHZsLT5sdikpCisJCQljb250aW51ZTsKKworCQlsb2dfdmVyeV92ZXJib3NlKCJQcm9jZXNzaW5nIExWICVzIGluIFZHICVzLiIsIGx2bC0+bHYtPm5hbWUsIHZnLT5uYW1lKTsKKworCQlyZXQgPSBwcm9jZXNzX3NpbmdsZV9sdihjbWQsIGx2bC0+bHYsIGhhbmRsZSk7CisJCWlmIChoYW5kbGVfc3VwcGxpZWQpCisJCQlfdXBkYXRlX3NlbGVjdGlvbl9yZXN1bHQoaGFuZGxlLCAmd2hvbGVfc2VsZWN0ZWQpOworCQlpZiAocmV0ICE9IEVDTURfUFJPQ0VTU0VEKQorCQkJc3RhY2s7CisJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0KTsKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCisJCWlmIChzdG9wX29uX2Vycm9yICYmIHJldCAhPSBFQ01EX1BST0NFU1NFRCkgeworCQkJZG9fcmVwb3J0X3JldF9jb2RlID0gMDsKKwkJCWdvdG9fb3V0OworCQl9CisJfQorCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChOVUxMLCBOVUxMKTsKKworCWlmIChoYW5kbGUtPmluY2x1ZGVfaGlzdG9yaWNhbF9sdnMgJiYgIXRhZ3Nfc3VwcGxpZWQpIHsKKwkJaWYgKCFkbV9saXN0X3NpemUoJl9oaXN0b3JpY2FsX2x2LnNlZ21lbnRzKSkKKwkJCWRtX2xpc3RfYWRkKCZfaGlzdG9yaWNhbF9sdi5zZWdtZW50cywgJl9oaXN0b3JpY2FsX2x2X3NlZ21lbnQubGlzdCk7CisJCV9oaXN0b3JpY2FsX2x2LnZnID0gdmc7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUoZ2x2bCwgdGdsdmwsICZ2Zy0+aGlzdG9yaWNhbF9sdnMpIHsKKwkJCWx2X3V1aWRbMF0gPSAnXDAnOworCQkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJmdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bHZpZC5pZFsxXSwgbHZfdXVpZCwgc2l6ZW9mKGx2X3V1aWQpKSkKKwkJCQlzdGFjazsKKworCQkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSwgbHZfdXVpZCk7CisKKwkJCXByb2Nlc3NfbHYgPSBwcm9jZXNzX2FsbDsKKworCQkJaWYgKGx2YXJnc19zdXBwbGllZCAmJgorCQkJICAgIChzbCA9IF9zdHJfbGlzdF9tYXRjaF9pdGVtX3dpdGhfcHJlZml4KGFyZ19sdm5hbWVzLCBISVNUT1JJQ0FMX0xWX1BSRUZJWCwgZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT5uYW1lKSkpIHsKKwkJCQlzdHJfbGlzdF9kZWwoYXJnX2x2bmFtZXMsIGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSk7CisJCQkJZG1fbGlzdF9kZWwoJnNsLT5saXN0KTsKKwkJCQlwcm9jZXNzX2x2ID0gMTsKKwkJCX0KKworCQkJcHJvY2Vzc19sdiA9IHByb2Nlc3NfbHYgJiYgc2VsZWN0X21hdGNoX2x2KGNtZCwgaGFuZGxlLCB2ZywgbHZsLT5sdikgJiYgX3NlbGVjdF9tYXRjaGVzKGhhbmRsZSk7CisKKwkJCWlmIChzaWdpbnRfY2F1Z2h0KCkpIHsKKwkJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQkJZ290b19vdXQ7CisJCQl9CisKKwkJCWlmICghcHJvY2Vzc19sdikKKwkJCQljb250aW51ZTsKKworCQkJX2hpc3RvcmljYWxfbHYudGhpc19nbHYgPSBnbHZsLT5nbHY7CisJCQlfaGlzdG9yaWNhbF9sdi5uYW1lID0gZ2x2bC0+Z2x2LT5oaXN0b3JpY2FsLT5uYW1lOworCQkJbG9nX3ZlcnlfdmVyYm9zZSgiUHJvY2Vzc2luZyBoaXN0b3JpY2FsIExWICVzIGluIFZHICVzLiIsIGdsdmwtPmdsdi0+aGlzdG9yaWNhbC0+bmFtZSwgdmctPm5hbWUpOworCisJCQlyZXQgPSBwcm9jZXNzX3NpbmdsZV9sdihjbWQsICZfaGlzdG9yaWNhbF9sdiwgaGFuZGxlKTsKKwkJCWlmIChoYW5kbGVfc3VwcGxpZWQpCisJCQkJX3VwZGF0ZV9zZWxlY3Rpb25fcmVzdWx0KGhhbmRsZSwgJndob2xlX3NlbGVjdGVkKTsKKwkJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCQkJc3RhY2s7CisJCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldCk7CisJCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCQlyZXRfbWF4ID0gcmV0OworCisJCQlpZiAoc3RvcF9vbl9lcnJvciAmJiByZXQgIT0gRUNNRF9QUk9DRVNTRUQpIHsKKwkJCQlkb19yZXBvcnRfcmV0X2NvZGUgPSAwOworCQkJCWdvdG9fb3V0OworCQkJfQorCQl9CisJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChOVUxMLCBOVUxMKTsKKwl9CisKKwlpZiAobHZhcmdzX3N1cHBsaWVkKSB7CisJCS8qCisJCSAqIEZJWE1FOiBsdm0gc3VwcG9ydHMgcmVtb3ZhbCBvZiBMViB3aXRoIGFsbCBpdHMgZGVwZW5kZW5jaWVzCisJCSAqIHRoaXMgbGVhZHMgdG8gbWlzY2FsY3VsYXRpb24gdGhhdCBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiBhcmdzLgorCQkgKi8KKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNsLCBhcmdfbHZuYW1lcykgeworCQkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKHNsLT5zdHIsIE5VTEwpOworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBsb2dpY2FsIHZvbHVtZSBcIiVzLyVzXCIiLAorCQkJCSAgdmctPm5hbWUsIHNsLT5zdHIpOworCQkJaWYgKHJldF9tYXggPCBFQ01EX0ZBSUxFRCkKKwkJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldF9tYXgpOworCQl9CisJfQorCWRvX3JlcG9ydF9yZXRfY29kZSA9IDA7CitvdXQ6CisJaWYgKGRvX3JlcG9ydF9yZXRfY29kZSkKKwkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXRfbWF4KTsKKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQoTlVMTCwgTlVMTCk7CisJbG9nX3NldF9yZXBvcnRfb2JqZWN0X2dyb3VwX2FuZF9ncm91cF9pZChOVUxMLCBOVUxMKTsKKwlpZiAoIWhhbmRsZV9zdXBwbGllZCkKKwkJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJZWxzZQorCQlfc2V0X2ZpbmFsX3NlbGVjdGlvbl9yZXN1bHQoaGFuZGxlLCB3aG9sZV9zZWxlY3RlZCk7CisJbG9nX3Jlc3RvcmVfcmVwb3J0X3N0YXRlKHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUpOworCisJcmV0dXJuIHJldF9tYXg7Cit9CisKKy8qCisgKiBJZiBhcmcgaXMgdGFnLCBhZGQgaXQgdG8gYXJnX3RhZ3MKKyAqIGVsc2UgdGhlIGFyZyBpcyBlaXRoZXIgdmduYW1lIG9yIHZnbmFtZS9sdm5hbWU6CisgKiAtIGFkZCB0aGUgdmduYW1lIG9mIGVhY2ggYXJnIHRvIGFyZ192Z25hbWVzCisgKiAtIGlmIGFyZyBoYXMgbm8gbHZuYW1lLCBhZGQganVzdCB2Z25hbWUgYXJnX2x2bmFtZXMsCisgKiAgIGl0IHJlcHJlc2VudHMgYWxsIGx2cyBpbiB0aGUgdmcKKyAqIC0gaWYgYXJnIGhhcyBsdm5hbWUsIGFkZCB2Z25hbWUvbHZuYW1lIHRvIGFyZ19sdm5hbWVzCisgKi8KK3N0YXRpYyBpbnQgX2dldF9hcmdfbHZuYW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQkgICAgY29uc3QgY2hhciAqb25lX3ZnbmFtZSwgY29uc3QgY2hhciAqb25lX2x2bmFtZSwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX3ZnbmFtZXMsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmFyZ19sdm5hbWVzLAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICphcmdfdGFncykKK3sKKwlpbnQgb3B0ID0gMDsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWNoYXIgKnZnbHY7CisJc2l6ZV90IHZnbHZfc3o7CisJY29uc3QgY2hhciAqdmduYW1lOworCWNvbnN0IGNoYXIgKmx2X25hbWU7CisJY29uc3QgY2hhciAqdG1wX2x2X25hbWU7CisJY29uc3QgY2hhciAqdmduYW1lX2RlZjsKKwl1bnNpZ25lZCBkZXZfZGlyX2ZvdW5kOworCisJaWYgKG9uZV92Z25hbWUpIHsKKwkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ192Z25hbWVzLAorCQkJCSAgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIG9uZV92Z25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKCFvbmVfbHZuYW1lKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgYXJnX2x2bmFtZXMsCisJCQkJCSAgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIG9uZV92Z25hbWUpKSkgeworCQkJCWxvZ19lcnJvcigic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2Z2x2X3N6ID0gc3RybGVuKG9uZV92Z25hbWUpICsgc3RybGVuKG9uZV9sdm5hbWUpICsgMjsKKwkJCWlmICghKHZnbHYgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCB2Z2x2X3N6KSkgfHwKKwkJCSAgICBkbV9zbnByaW50Zih2Z2x2LCB2Z2x2X3N6LCAiJXMvJXMiLCBvbmVfdmduYW1lLCBvbmVfbHZuYW1lKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoInZnL2x2IHN0cmluZyBhbGxvYyBmYWlsZWQuIik7CisJCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQkJfQorCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ19sdm5hbWVzLCB2Z2x2KSkgeworCQkJCWxvZ19lcnJvcigic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldF9tYXg7CisJfQorCisJZm9yICg7IG9wdCA8IGFyZ2M7IG9wdCsrKSB7CisJCWx2X25hbWUgPSBhcmd2W29wdF07CisJCWRldl9kaXJfZm91bmQgPSAwOworCisJCS8qIERvIHdlIGhhdmUgYSB0YWcgb3IgdmduYW1lIG9yIGx2bmFtZT8gKi8KKwkJdmduYW1lID0gbHZfbmFtZTsKKworCQlpZiAoKnZnbmFtZSA9PSAnQCcpIHsKKwkJCWlmICghdmFsaWRhdGVfdGFnKHZnbmFtZSArIDEpKSB7CisJCQkJbG9nX2Vycm9yKCJTa2lwcGluZyBpbnZhbGlkIHRhZyAlcy4iLCB2Z25hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ190YWdzLAorCQkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z25hbWUgKyAxKSkpIHsKKwkJCQlsb2dfZXJyb3IoInN0cmxpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBGSVhNRSBKdW1ibGVkIHBhcnNpbmcgKi8KKwkJdmduYW1lID0gc2tpcF9kZXZfZGlyKGNtZCwgdmduYW1lLCAmZGV2X2Rpcl9mb3VuZCk7CisKKwkJaWYgKCp2Z25hbWUgPT0gJy8nKSB7CisJCQlsb2dfZXJyb3IoIlwiJXNcIjogSW52YWxpZCBwYXRoIGZvciBMb2dpY2FsIFZvbHVtZS4iLAorCQkJCSAgYXJndltvcHRdKTsKKwkJCWlmIChyZXRfbWF4IDwgRUNNRF9GQUlMRUQpCisJCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJY29udGludWU7CisJCX0KKwkJbHZfbmFtZSA9IHZnbmFtZTsKKwkJaWYgKCh0bXBfbHZfbmFtZSA9IHN0cmNocih2Z25hbWUsICcvJykpKSB7CisJCQkvKiBNdXN0IGJlIGFuIExWICovCisJCQlsdl9uYW1lID0gdG1wX2x2X25hbWU7CisJCQl3aGlsZSAoKmx2X25hbWUgPT0gJy8nKQorCQkJCWx2X25hbWUrKzsKKwkJCWlmICghKHZnbmFtZSA9IGV4dHJhY3RfdmduYW1lKGNtZCwgdmduYW1lKSkpIHsKKwkJCQlpZiAocmV0X21heCA8IEVDTURfRkFJTEVEKSB7CisJCQkJCXN0YWNrOworCQkJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKCFkZXZfZGlyX2ZvdW5kICYmCisJCQkgICAodmduYW1lX2RlZiA9IF9kZWZhdWx0X3ZnbmFtZShjbWQpKSkKKwkJCXZnbmFtZSA9IHZnbmFtZV9kZWY7CisJCWVsc2UKKwkJCWx2X25hbWUgPSBOVUxMOworCisJCWlmICghc3RyX2xpc3RfYWRkKGNtZC0+bWVtLCBhcmdfdmduYW1lcywKKwkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKCFsdl9uYW1lKSB7CisJCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgYXJnX2x2bmFtZXMsCisJCQkJCSAgZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHZnbmFtZSkpKSB7CisJCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZnbHZfc3ogPSBzdHJsZW4odmduYW1lKSArIHN0cmxlbihsdl9uYW1lKSArIDI7CisJCQlpZiAoISh2Z2x2ID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgdmdsdl9zeikpIHx8CisJCQkgICAgZG1fc25wcmludGYodmdsdiwgdmdsdl9zeiwgIiVzLyVzIiwgdmduYW1lLCBsdl9uYW1lKSA8IDApIHsKKwkJCQlsb2dfZXJyb3IoInZnL2x2IHN0cmluZyBhbGxvYyBmYWlsZWQuIik7CisJCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQkJfQorCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ19sdm5hbWVzLCB2Z2x2KSkgeworCQkJCWxvZ19lcnJvcigic3RybGlzdCBhbGxvY2F0aW9uIGZhaWxlZC4iKTsKKwkJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0X21heDsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19sdl92Z25hbWVpZF9saXN0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1aW50MzJfdCByZWFkX2ZsYWdzLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKnZnbmFtZWlkc190b19wcm9jZXNzLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ192Z25hbWVzLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ19sdm5hbWVzLAorCQkJCSAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ190YWdzLAorCQkJCSAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBwcm9jZXNzX3NpbmdsZV9sdl9mbl90IHByb2Nlc3Nfc2luZ2xlX2x2KQoreworCWxvZ19yZXBvcnRfdCBzYXZlZF9sb2dfcmVwb3J0X3N0YXRlID0gbG9nX2dldF9yZXBvcnRfc3RhdGUoKTsKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgdmduYW1laWRfbGlzdCAqdmdubDsKKwlzdHJ1Y3QgZG1fc3RyX2xpc3QgKnNsOworCXN0cnVjdCBkbV9saXN0ICp0YWdzX2FyZzsKKwlzdHJ1Y3QgZG1fbGlzdCBsdm5hbWVzOworCXVpbnQzMl90IGxvY2tkX3N0YXRlID0gMDsKKwljb25zdCBjaGFyICp2Z19uYW1lOworCWNvbnN0IGNoYXIgKnZnX3V1aWQ7CisJY29uc3QgY2hhciAqdmduOworCWNvbnN0IGNoYXIgKmx2bjsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWludCByZXQ7CisJaW50IHNraXA7CisJaW50IG5vdGZvdW5kOworCWludCBhbHJlYWR5X2xvY2tlZDsKKwlpbnQgZG9fcmVwb3J0X3JldF9jb2RlID0gMTsKKworCWxvZ19zZXRfcmVwb3J0X29iamVjdF90eXBlKExPR19SRVBPUlRfT0JKRUNUX1RZUEVfVkcpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZnbmwsIHZnbmFtZWlkc190b19wcm9jZXNzKSB7CisJCXZnX25hbWUgPSB2Z25sLT52Z19uYW1lOworCQl2Z191dWlkID0gdmdubC0+dmdpZDsKKwkJc2tpcCA9IDA7CisJCW5vdGZvdW5kID0gMDsKKworCQl1dWlkWzBdID0gJ1wwJzsKKwkJaWYgKHZnX3V1aWQgJiYgIWlkX3dyaXRlX2Zvcm1hdCgoY29uc3Qgc3RydWN0IGlkKil2Z191dWlkLCB1dWlkLCBzaXplb2YodXVpZCkpKQorCQkJc3RhY2s7CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKHZnX25hbWUsIHV1aWQpOworCisJCWlmIChzaWdpbnRfY2F1Z2h0KCkpIHsKKwkJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJCWdvdG9fb3V0OworCQl9CisKKwkJLyoKKwkJICogYXJnX2x2bmFtZXMgY29udGFpbnMgc29tZSBlbGVtZW50cyB0aGF0IGFyZSBqdXN0ICJ2Z25hbWUiCisJCSAqIHdoaWNoIG1lYW5zIHByb2Nlc3MgYWxsIGx2cyBpbiB0aGUgdmcuICBPdGhlciBlbGVtZW50cworCQkgKiBhcmUgInZnbmFtZS9sdm5hbWUiIHdoaWNoIG1lYW5zIHByb2Nlc3Mgb25seSB0aGUgc2VsZWN0CisJCSAqIGx2cyBpbiB0aGUgdmcuCisJCSAqLworCQl0YWdzX2FyZyA9IGFyZ190YWdzOworCQlkbV9saXN0X2luaXQoJmx2bmFtZXMpOwkvKiBMVnMgdG8gYmUgcHJvY2Vzc2VkIGluIHRoaXMgVkcgKi8KKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2wsIGFyZ19sdm5hbWVzKSB7CisJCQl2Z24gPSBzbC0+c3RyOworCQkJbHZuID0gc3RyY2hyKHZnbiwgJy8nKTsKKworCQkJaWYgKCFsdm4gJiYgIXN0cmNtcCh2Z24sIHZnX25hbWUpKSB7CisJCQkJLyogUHJvY2VzcyBhbGwgTFZzIGluIHRoaXMgVkcgKi8KKwkJCQl0YWdzX2FyZyA9IE5VTEw7CisJCQkJZG1fbGlzdF9pbml0KCZsdm5hbWVzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKGx2biAmJiAhc3RybmNtcCh2Z24sIHZnX25hbWUsIHN0cmxlbih2Z19uYW1lKSkgJiYKKwkJCSAgICBzdHJsZW4odmdfbmFtZSkgPT0gKHNpemVfdCkgKGx2biAtIHZnbikpIHsKKwkJCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgJmx2bmFtZXMsCisJCQkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBsdm4gKyAxKSkpIHsKKwkJCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlByb2Nlc3NpbmcgVkcgJXMgJXMiLCB2Z19uYW1lLCB2Z191dWlkID8gdXVpZCA6ICIiKTsKKworCQlpZiAoIWxvY2tkX3ZnKGNtZCwgdmdfbmFtZSwgTlVMTCwgMCwgJmxvY2tkX3N0YXRlKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXRfbWF4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYWxyZWFkeV9sb2NrZWQgPSBsdm1jYWNoZV92Z25hbWVfaXNfbG9ja2VkKHZnX25hbWUpOworCisJCXZnID0gdmdfcmVhZChjbWQsIHZnX25hbWUsIHZnX3V1aWQsIHJlYWRfZmxhZ3MsIGxvY2tkX3N0YXRlKTsKKwkJaWYgKF9pZ25vcmVfdmcodmcsIHZnX25hbWUsIGFyZ192Z25hbWVzLCByZWFkX2ZsYWdzLCAmc2tpcCwgJm5vdGZvdW5kKSkgeworCQkJc3RhY2s7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldF9tYXgpOworCQkJZ290byBlbmR2ZzsKKwkJfQorCQlpZiAoc2tpcCB8fCBub3Rmb3VuZCkKKwkJCWdvdG8gZW5kdmc7CisKKwkJcmV0ID0gcHJvY2Vzc19lYWNoX2x2X2luX3ZnKGNtZCwgdmcsICZsdm5hbWVzLCB0YWdzX2FyZywgMCwKKwkJCQkJICAgIGhhbmRsZSwgcHJvY2Vzc19zaW5nbGVfbHYpOworCQlpZiAocmV0ICE9IEVDTURfUFJPQ0VTU0VEKQorCQkJc3RhY2s7CisJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0KTsKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCisJCWlmICghYWxyZWFkeV9sb2NrZWQpCisJCQl1bmxvY2tfdmcoY21kLCB2ZywgdmdfbmFtZSk7CitlbmR2ZzoKKwkJcmVsZWFzZV92Zyh2Zyk7CisJCWlmICghbG9ja2RfdmcoY21kLCB2Z19uYW1lLCAidW4iLCAwLCAmbG9ja2Rfc3RhdGUpKQorCQkJc3RhY2s7CisJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9uYW1lX2FuZF9pZChOVUxMLCBOVUxMKTsKKwl9CisJZG9fcmVwb3J0X3JldF9jb2RlID0gMDsKK291dDoKKwlpZiAoZG9fcmVwb3J0X3JldF9jb2RlKQorCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldF9tYXgpOworCWxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShzYXZlZF9sb2dfcmVwb3J0X3N0YXRlKTsKKwlyZXR1cm4gcmV0X21heDsKK30KKworLyoKKyAqIENhbGwgcHJvY2Vzc19zaW5nbGVfbHYoKSBmb3IgZWFjaCBMViBzZWxlY3RlZCBieSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAqLworaW50IHByb2Nlc3NfZWFjaF9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwKKwkJICAgIGNvbnN0IGNoYXIgKm9uZV92Z25hbWUsIGNvbnN0IGNoYXIgKm9uZV9sdm5hbWUsCisJCSAgICB1aW50MzJfdCByZWFkX2ZsYWdzLAorCQkgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICBwcm9jZXNzX3NpbmdsZV9sdl9mbl90IHByb2Nlc3Nfc2luZ2xlX2x2KQoreworCWxvZ19yZXBvcnRfdCBzYXZlZF9sb2dfcmVwb3J0X3N0YXRlID0gbG9nX2dldF9yZXBvcnRfc3RhdGUoKTsKKwlpbnQgaGFuZGxlX3N1cHBsaWVkID0gaGFuZGxlICE9IE5VTEw7CisJc3RydWN0IGRtX2xpc3QgYXJnX3RhZ3M7CQkvKiBzdHJfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IGFyZ192Z25hbWVzOwkJLyogc3RyX2xpc3QgKi8KKwlzdHJ1Y3QgZG1fbGlzdCBhcmdfbHZuYW1lczsJCS8qIHN0cl9saXN0ICovCisJc3RydWN0IGRtX2xpc3QgdmduYW1laWRzX29uX3N5c3RlbTsJLyogdmduYW1laWRfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IHZnbmFtZWlkc190b19wcm9jZXNzOwkvKiB2Z25hbWVpZF9saXN0ICovCisJaW50IGVuYWJsZV9hbGxfdmdzID0gKGNtZC0+Y29tbWFuZC0+ZmxhZ3MgJiBBTExfVkdTX0lTX0RFRkFVTFQpOworCWludCBwcm9jZXNzX2FsbF92Z3Nfb25fc3lzdGVtID0gMDsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWludCByZXQ7CisKKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfdHlwZShMT0dfUkVQT1JUX09CSkVDVF9UWVBFX0xWKTsKKworCS8qIERpc2FibGUgZXJyb3IgaW4gdmdfcmVhZCBzbyB3ZSBjYW4gcHJpbnQgaXQgZnJvbSBpZ25vcmVfdmcuICovCisJY21kLT52Z19yZWFkX3ByaW50X2FjY2Vzc19lcnJvciA9IDA7CisKKwlkbV9saXN0X2luaXQoJmFyZ190YWdzKTsKKwlkbV9saXN0X2luaXQoJmFyZ192Z25hbWVzKTsKKwlkbV9saXN0X2luaXQoJmFyZ19sdm5hbWVzKTsKKwlkbV9saXN0X2luaXQoJnZnbmFtZWlkc19vbl9zeXN0ZW0pOworCWRtX2xpc3RfaW5pdCgmdmduYW1laWRzX3RvX3Byb2Nlc3MpOworCisJLyoKKwkgKiBGaW5kIGFueSBMVnMsIFZHcyBvciB0YWdzIGV4cGxpY2l0bHkgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKwkgKi8KKwlpZiAoKHJldCA9IF9nZXRfYXJnX2x2bmFtZXMoY21kLCBhcmdjLCBhcmd2LCBvbmVfdmduYW1lLCBvbmVfbHZuYW1lLCAmYXJnX3ZnbmFtZXMsICZhcmdfbHZuYW1lcywgJmFyZ190YWdzKSAhPSBFQ01EX1BST0NFU1NFRCkpIHsKKwkJcmV0X21heCA9IHJldDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKCFoYW5kbGUgJiYgIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKSB7CisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKGhhbmRsZS0+aW50ZXJuYWxfcmVwb3J0X2Zvcl9zZWxlY3QgJiYgIWhhbmRsZS0+c2VsZWN0aW9uX2hhbmRsZSAmJgorCSAgICAhaW5pdF9zZWxlY3Rpb25faGFuZGxlKGNtZCwgaGFuZGxlLCBMVlMpKSB7CisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIGFsbCBWR3Mgb24gdGhlIHN5c3RlbSB3aGVuOgorCSAqIC4gdGFncyBhcmUgc3BlY2lmaWVkIGFuZCBhbGwgVkdzIG5lZWQgdG8gYmUgcmVhZCB0bworCSAqICAgbG9vayBmb3IgbWF0Y2hpbmcgdGFncy4KKwkgKiAuIG5vIFZHIG5hbWVzIGFyZSBzcGVjaWZpZWQgYW5kIHRoZSBjb21tYW5kIGRlZmF1bHRzCisJICogICB0byBwcm9jZXNzaW5nIGFsbCBWR3Mgd2hlbiBub25lIGFyZSBzcGVjaWZpZWQuCisJICogLiBubyBWRyBuYW1lcyBhcmUgc3BlY2lmaWVkIGFuZCB0aGUgc2VsZWN0IG9wdGlvbiBuZWVkcworCSAqICAgcmVzb2x2aW5nLgorCSAqLworCWlmICghZG1fbGlzdF9lbXB0eSgmYXJnX3RhZ3MpKQorCQlwcm9jZXNzX2FsbF92Z3Nfb25fc3lzdGVtID0gMTsKKwllbHNlIGlmIChkbV9saXN0X2VtcHR5KCZhcmdfdmduYW1lcykgJiYgZW5hYmxlX2FsbF92Z3MpCisJCXByb2Nlc3NfYWxsX3Znc19vbl9zeXN0ZW0gPSAxOworCWVsc2UgaWYgKGRtX2xpc3RfZW1wdHkoJmFyZ192Z25hbWVzKSAmJiBoYW5kbGUtPmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0KQorCQlwcm9jZXNzX2FsbF92Z3Nfb25fc3lzdGVtID0gMTsKKworCS8qCisJICogTmVlZGVkIGZvciBhIGN1cnJlbnQgbGlzdGluZyBvZiB0aGUgZ2xvYmFsIFZHIG5hbWVzcGFjZS4KKwkgKi8KKwlpZiAocHJvY2Vzc19hbGxfdmdzX29uX3N5c3RlbSAmJiAhbG9ja2RfZ2woY21kLCAic2giLCAwKSkgeworCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG9fb3V0OworCX0KKworCS8qCisJICogQSBsaXN0IG9mIGFsbCBWR3Mgb24gdGhlIHN5c3RlbSBpcyBuZWVkZWQgd2hlbjoKKwkgKiAuIHByb2Nlc3NpbmcgYWxsIFZHcyBvbiB0aGUgc3lzdGVtCisJICogLiBBIFZHIG5hbWUgaXMgc3BlY2lmaWVkIHdoaWNoIG1heSByZWZlciB0byBvbmUKKwkgKiAgIG9mIG11bHRpcGxlIFZHcyBvbiB0aGUgc3lzdGVtIHdpdGggdGhhdCBuYW1lLgorCSAqLworCWxvZ19kZWJ1ZygiR2V0IGxpc3Qgb2YgVkdzIG9uIHN5c3RlbSIpOworCisJaWYgKCFnZXRfdmduYW1laWRzKGNtZCwgJnZnbmFtZWlkc19vbl9zeXN0ZW0sIE5VTEwsIDApKSB7CisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJZ290b19vdXQ7CisJfQorCisJaWYgKCFkbV9saXN0X2VtcHR5KCZhcmdfdmduYW1lcykpIHsKKwkJLyogVGhpcyBtYXkgcmVtb3ZlIGVudHJpZXMgZnJvbSBhcmdfdmduYW1lcyBvciB2Z25hbWVpZHNfb25fc3lzdGVtLiAqLworCQlyZXQgPSBfcmVzb2x2ZV9kdXBsaWNhdGVfdmduYW1lcyhjbWQsICZhcmdfdmduYW1lcywgJnZnbmFtZWlkc19vbl9zeXN0ZW0pOworCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCXJldF9tYXggPSByZXQ7CisJCWlmIChkbV9saXN0X2VtcHR5KCZhcmdfdmduYW1lcykgJiYgZG1fbGlzdF9lbXB0eSgmYXJnX3RhZ3MpKSB7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChkbV9saXN0X2VtcHR5KCZhcmdfdmduYW1lcykgJiYgZG1fbGlzdF9lbXB0eSgmdmduYW1laWRzX29uX3N5c3RlbSkpIHsKKwkJLyogRklYTUUgU2hvdWxkIGJlIGxvZ19wcmludCwgYnV0IHN1cHByZXNzZWQgZm9yIHJlcG9ydGluZyBjbWRzICovCisJCWxvZ192ZXJib3NlKCJObyB2b2x1bWUgZ3JvdXBzIGZvdW5kLiIpOworCQlyZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkbV9saXN0X2VtcHR5KCZhcmdfdmduYW1lcykpCisJCXJlYWRfZmxhZ3MgfD0gUkVBRF9PS19OT1RGT1VORDsKKworCS8qCisJICogV2hlbiBwcm9jZXNzaW5nIGFsbCBWR3MsIHZnbmFtZWlkc19vbl9zeXN0ZW0gc2ltcGx5IGJlY29tZXMKKwkgKiB2Z25hbWVpZHNfdG9fcHJvY2Vzcy4KKwkgKiBXaGVuIHByb2Nlc3Npbmcgb25seSBzcGVjaWZpZWQgVkdzLCB0aGVuIGZvciBlYWNoIGl0ZW0gaW4KKwkgKiBhcmdfdmduYW1lcywgbW92ZSB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBmcm9tCisJICogdmduYW1laWRzX29uX3N5c3RlbSB0byB2Z25hbWVpZHNfdG9fcHJvY2Vzcy4KKwkgKi8KKwlpZiAocHJvY2Vzc19hbGxfdmdzX29uX3N5c3RlbSkKKwkJZG1fbGlzdF9zcGxpY2UoJnZnbmFtZWlkc190b19wcm9jZXNzLCAmdmduYW1laWRzX29uX3N5c3RlbSk7CisJZWxzZQorCQlfY2hvb3NlX3Znc190b19wcm9jZXNzKGNtZCwgJmFyZ192Z25hbWVzLCAmdmduYW1laWRzX29uX3N5c3RlbSwgJnZnbmFtZWlkc190b19wcm9jZXNzKTsKKworCXJldCA9IF9wcm9jZXNzX2x2X3ZnbmFtZWlkX2xpc3QoY21kLCByZWFkX2ZsYWdzLCAmdmduYW1laWRzX3RvX3Byb2Nlc3MsICZhcmdfdmduYW1lcywgJmFyZ19sdm5hbWVzLAorCQkJCQkmYXJnX3RhZ3MsIGhhbmRsZSwgcHJvY2Vzc19zaW5nbGVfbHYpOworCisJaWYgKHJldCA+IHJldF9tYXgpCisJCXJldF9tYXggPSByZXQ7CitvdXQ6CisJaWYgKCFoYW5kbGVfc3VwcGxpZWQpCisJCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCisJbG9nX3Jlc3RvcmVfcmVwb3J0X3N0YXRlKHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUpOworCXJldHVybiByZXRfbWF4OworfQorCitzdGF0aWMgaW50IF9nZXRfYXJnX3B2bmFtZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBkbV9saXN0ICphcmdfcHZuYW1lcywKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX3RhZ3MpCit7CisJaW50IG9wdCA9IDA7CisJY2hhciAqYXRfc2lnbiwgKnRhZ25hbWU7CisJY2hhciAqYXJnX25hbWU7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKworCWZvciAoOyBvcHQgPCBhcmdjOyBvcHQrKykgeworCQlhcmdfbmFtZSA9IGFyZ3Zbb3B0XTsKKworCQlkbV91bmVzY2FwZV9jb2xvbnNfYW5kX2F0X3NpZ25zKGFyZ19uYW1lLCBOVUxMLCAmYXRfc2lnbik7CisJCWlmIChhdF9zaWduICYmIChhdF9zaWduID09IGFyZ19uYW1lKSkgeworCQkJdGFnbmFtZSA9IGF0X3NpZ24gKyAxOworCisJCQlpZiAoIXZhbGlkYXRlX3RhZyh0YWduYW1lKSkgeworCQkJCWxvZ19lcnJvcigiU2tpcHBpbmcgaW52YWxpZCB0YWcgJXMuIiwgdGFnbmFtZSk7CisJCQkJaWYgKHJldF9tYXggPCBFSU5WQUxJRF9DTURfTElORSkKKwkJCQkJcmV0X21heCA9IEVJTlZBTElEX0NNRF9MSU5FOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJfbGlzdF9hZGQoY21kLT5tZW0sIGFyZ190YWdzLAorCQkJCQkgIGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB0YWduYW1lKSkpIHsKKwkJCQlsb2dfZXJyb3IoInN0cmxpc3QgYWxsb2NhdGlvbiBmYWlsZWQuIik7CisJCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cl9saXN0X2FkZChjbWQtPm1lbSwgYXJnX3B2bmFtZXMsCisJCQkJICBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgYXJnX25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJsaXN0IGFsbG9jYXRpb24gZmFpbGVkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisJfQorCisJcmV0dXJuIHJldF9tYXg7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9hcmdfZGV2aWNlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX3B2bmFtZXMsCisJCQkgICAgc3RydWN0IGRtX2xpc3QgKmFyZ19kZXZpY2VzKQoreworCXN0cnVjdCBkbV9zdHJfbGlzdCAqc2w7CisJc3RydWN0IGRldmljZV9pZF9saXN0ICpkaWw7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhzbCwgYXJnX3B2bmFtZXMpIHsKKwkJaWYgKCEoZGlsID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpkaWwpKSkpIHsKKwkJCWxvZ19lcnJvcigiZGV2aWNlX2lkX2xpc3QgYWxsb2MgZmFpbGVkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKCEoZGlsLT5kZXYgPSBkZXZfY2FjaGVfZ2V0KHNsLT5zdHIsIGNtZC0+ZmlsdGVyKSkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgZGV2aWNlIGZvciBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiLiIsIHNsLT5zdHIpOworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQl9IGVsc2UgeworCQkJc3RybmNweShkaWwtPnB2aWQsIGRpbC0+ZGV2LT5wdmlkLCBJRF9MRU4pOworCQkJZG1fbGlzdF9hZGQoYXJnX2RldmljZXMsICZkaWwtPmxpc3QpOworCQl9CisJfQorCisJcmV0dXJuIHJldF9tYXg7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9hbGxfZGV2aWNlcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGRtX2xpc3QgKmFsbF9kZXZpY2VzKQoreworCXN0cnVjdCBkZXZfaXRlciAqaXRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZV9pZF9saXN0ICpkaWw7CisJaW50IHIgPSBFQ01EX0ZBSUxFRDsKKworCWxvZ19kZWJ1ZygiR2V0dGluZyBsaXN0IG9mIGFsbCBkZXZpY2VzIik7CisKKwlsdm1jYWNoZV9zZWVkX2luZm9zX2Zyb21fbHZtZXRhZChjbWQpOworCisJaWYgKCEoaXRlciA9IGRldl9pdGVyX2NyZWF0ZShjbWQtPmZ1bGxfZmlsdGVyLCAxKSkpIHsKKwkJbG9nX2Vycm9yKCJkZXZfaXRlciBjcmVhdGlvbiBmYWlsZWQuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwl3aGlsZSAoKGRldiA9IGRldl9pdGVyX2dldChpdGVyKSkpIHsKKwkJaWYgKCEoZGlsID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpkaWwpKSkpIHsKKwkJCWxvZ19lcnJvcigiZGV2aWNlX2lkX2xpc3QgYWxsb2MgZmFpbGVkLiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdHJuY3B5KGRpbC0+cHZpZCwgZGV2LT5wdmlkLCBJRF9MRU4pOworCQlkaWwtPmRldiA9IGRldjsKKwkJZG1fbGlzdF9hZGQoYWxsX2RldmljZXMsICZkaWwtPmxpc3QpOworCX0KKworCXIgPSBFQ01EX1BST0NFU1NFRDsKK291dDoKKwlkZXZfaXRlcl9kZXN0cm95KGl0ZXIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9kZXZpY2VfbGlzdF9yZW1vdmUoc3RydWN0IGRtX2xpc3QgKmRldmljZXMsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkaWwsIGRldmljZXMpIHsKKwkJaWYgKGRpbC0+ZGV2ID09IGRldikgeworCQkJZG1fbGlzdF9kZWwoJmRpbC0+bGlzdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9pZF9saXN0ICpfZGV2aWNlX2xpc3RfZmluZF9kZXYoc3RydWN0IGRtX2xpc3QgKmRldmljZXMsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbDsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhkaWwsIGRldmljZXMpIHsKKwkJaWYgKGRpbC0+ZGV2ID09IGRldikKKwkJCXJldHVybiBkaWw7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX2RldmljZV9saXN0X2NvcHkoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICpzcmMsIHN0cnVjdCBkbV9saXN0ICpkc3QpCit7CisJc3RydWN0IGRldmljZV9pZF9saXN0ICpkaWw7CisJc3RydWN0IGRldmljZV9pZF9saXN0ICpkaWxfbmV3OworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRpbCwgc3JjKSB7CisJCWlmICghKGRpbF9uZXcgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKmRpbF9uZXcpKSkpIHsKKwkJCWxvZ19lcnJvcigiZGV2aWNlX2lkX2xpc3QgYWxsb2MgZmFpbGVkLiIpOworCQkJcmV0dXJuIEVDTURfRkFJTEVEOworCQl9CisKKwkJZGlsX25ldy0+ZGV2ID0gZGlsLT5kZXY7CisJCXN0cm5jcHkoZGlsX25ldy0+cHZpZCwgZGlsLT5wdmlkLCBJRF9MRU4pOworCQlkbV9saXN0X2FkZChkc3QsICZkaWxfbmV3LT5saXN0KTsKKwl9CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKKy8qCisgKiBGb3IgZWFjaCBkZXZpY2UgaW4gYXJnX2RldmljZXMgb3IgYWxsX2RldmljZXMgdGhhdCBoYXMgYSBwdmlkLCBhZGQgYSBjb3B5IG9mCisgKiB0aGF0IGRldmljZSB0byBhcmdfbWlzc2VkLiAgQWxsIFBWcyAoZGV2aWNlcyB3aXRoIGEgcHZpZCkgc2hvdWxkIGhhdmUgYmVlbgorICogZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBhbGwgVkdzIChpbmNsdWRpbmcgb3JwaGFuIFZHcykuICBCdXQsIHNvbWUgbWF5IGhhdmUKKyAqIGJlZW4gbWlzc2VkIGlmIFZHcyB3ZXJlIGNoYW5naW5nIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYQorICogbGlzdCBvZiBQVnMgdGhhdCBzdGlsbCByZW1haW4gaW4gdGhlIGdpdmVuIGxpc3QsIGkuZS4gd2VyZSBtaXNzZWQgdGhlIGZpcnN0CisgKiB0aW1lLiAgQSBzZWNvbmQgaXRlcmF0aW9uIHRocm91Z2ggVkdzIGNhbiBsb29rIGZvciB0aGVzZSBleHBsaWNpdGx5LgorICogKGFyZ19kZXZpY2VzIGlzIHVzZWQgaWYgc3BlY2lmaWMgUFZzIGFyZSBiZWluZyBwcm9jZXNzZWQ7IGFsbF9kZXZpY2VzIGlzCisgKiB1c2VkIGlmIGFsbCBkZXZzIGFyZSBiZWluZyBwcm9jZXNzZWQpCisgKi8KK3N0YXRpYyBpbnQgX2dldF9taXNzZWRfcHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgc3RydWN0IGRtX2xpc3QgKmRldmljZXMsCisJCQkgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX21pc3NlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbDsKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbF9taXNzZWQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGlsLCBkZXZpY2VzKSB7CisJCWlmICghZGlsLT5wdmlkWzBdKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZGlsX21pc3NlZCA9IGRtX3Bvb2xfYWxsb2MoY21kLT5tZW0sIHNpemVvZigqZGlsX21pc3NlZCkpKSkgeworCQkJbG9nX2Vycm9yKCJkZXZpY2VfaWRfbGlzdCBhbGxvYyBmYWlsZWQuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKworCQlkaWxfbWlzc2VkLT5kZXYgPSBkaWwtPmRldjsKKwkJc3RybmNweShkaWxfbWlzc2VkLT5wdmlkLCBkaWwtPnB2aWQsIElEX0xFTik7CisJCWRtX2xpc3RfYWRkKGFyZ19taXNzZWQsICZkaWxfbWlzc2VkLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX3Byb2Nlc3NfZGV2aWNlX2xpc3Qoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBkbV9saXN0ICphbGxfZGV2aWNlcywKKwkJCQlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCQlwcm9jZXNzX3NpbmdsZV9wdl9mbl90IHByb2Nlc3Nfc2luZ2xlX3B2KQoreworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgcHZfZHVtbXk7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IGRldmljZV9pZF9saXN0ICpkaWw7CisJaW50IHJldF9tYXggPSBFQ01EX1BST0NFU1NFRDsKKwlpbnQgcmV0ID0gMDsKKworCWxvZ19kZWJ1ZygiUHJvY2Vzc2luZyBkZXZpY2VzIHRoYXQgYXJlIG5vdCBQVnMiKTsKKworCS8qCisJICogUHJldGVuZCB0aGF0IGVhY2ggZGV2aWNlIGlzIGEgUFYgd2l0aCBkdW1teSB2YWx1ZXMuCisJICogRklYTUUgRm9ybWFsaXNlIHRoaXMgZXh0ZW5zaW9uIG9yIGZpbmQgYW4gYWx0ZXJuYXRpdmUuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRpbCwgYWxsX2RldmljZXMpIHsKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCQltZW1zZXQoJnB2X2R1bW15LCAwLCBzaXplb2YocHZfZHVtbXkpKTsKKwkJZG1fbGlzdF9pbml0KCZwdl9kdW1teS50YWdzKTsKKwkJZG1fbGlzdF9pbml0KCZwdl9kdW1teS5zZWdtZW50cyk7CisJCXB2X2R1bW15LmRldiA9IGRpbC0+ZGV2OworCQlwdiA9ICZwdl9kdW1teTsKKworCQlsb2dfdmVyeV92ZXJib3NlKCJQcm9jZXNzaW5nIGRldmljZSAlcy4iLCBkZXZfbmFtZShkaWwtPmRldikpOworCisJCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3B2KGNtZCwgTlVMTCwgcHYsIGhhbmRsZSk7CisKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCX0KKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19kdXBsaWNhdGVfcHZzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgc3RydWN0IGRtX2xpc3QgKmFsbF9kZXZpY2VzLAorCQkJCSAgc3RydWN0IGRtX2xpc3QgKmFyZ19kZXZpY2VzLAorCQkJCSAgaW50IHByb2Nlc3NfYWxsX2RldmljZXMsCisJCQkJICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIHByb2Nlc3Nfc2luZ2xlX3B2X2ZuX3QgcHJvY2Vzc19zaW5nbGVfcHYpCit7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSBwdl9kdW1teTsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdjsKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbDsKKwlzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmw7CisJc3RydWN0IGRtX2xpc3QgdW51c2VkX2R1cGxpY2F0ZV9kZXZzOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnID0gTlVMTDsKKwljb25zdCBjaGFyICp2Z25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnZnaWQgPSBOVUxMOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldCA9IDA7CisKKwlkbV9saXN0X2luaXQoJnVudXNlZF9kdXBsaWNhdGVfZGV2cyk7CisKKwlpZiAoIWx2bWNhY2hlX2dldF91bnVzZWRfZHVwbGljYXRlX2RldnMoY21kLCAmdW51c2VkX2R1cGxpY2F0ZV9kZXZzKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRldmwsICZ1bnVzZWRfZHVwbGljYXRlX2RldnMpIHsKKwkJLyogRHVwbGljYXRlcyBhcmUgZGlzcGxheWVkIGlmIC1hIGlzIHVzZWQgb3IgdGhlIGRldiBpcyBuYW1lZCBhcyBhbiBhcmcuICovCisKKwkJX2RldmljZV9saXN0X3JlbW92ZShhbGxfZGV2aWNlcywgZGV2bC0+ZGV2KTsKKworCQlpZiAoIXByb2Nlc3NfYWxsX2RldmljZXMgJiYgZG1fbGlzdF9lbXB0eShhcmdfZGV2aWNlcykpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRpbCA9IF9kZXZpY2VfbGlzdF9maW5kX2RldihhcmdfZGV2aWNlcywgZGV2bC0+ZGV2KSkpCisJCQlfZGV2aWNlX2xpc3RfcmVtb3ZlKGFyZ19kZXZpY2VzLCBkZXZsLT5kZXYpOworCisJCWlmICghcHJvY2Vzc19hbGxfZGV2aWNlcyAmJiAhZGlsKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoY21kLT5jb21tYW5kLT5mbGFncyAmIEVOQUJMRV9EVVBMSUNBVEVfREVWUykpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBVc2UgdGhlIGNhY2hlZCBWRyBmcm9tIHRoZSBwcmVmZXJyZWQgZGV2aWNlIGZvciB0aGUgUFYsCisJCSAqIHRoZSB2ZyBpcyBvbmx5IHVzZWQgdG8gZGlzcGxheSB0aGUgVkcgbmFtZS4KKwkJICoKKwkJICogVGhpcyBWRyBmcm9tIGx2bWNhY2hlIHdhcyBub3QgcmVhZCBmcm9tIHRoZSBkdXBsaWNhdGUKKwkJICogZGV2IGJlaW5nIHByb2Nlc3NlZCBoZXJlLCBidXQgZnJvbSB0aGUgcHJlZmVycmVkIGRldgorCQkgKiBpbiBsdm1jYWNoZS4KKwkJICoKKwkJICogV2hlbiBhIGR1cGxpY2F0ZSBQViBpcyBkaXNwbGF5ZWQsIHRoZSByZXBvcnRpbmcgZmllbGRzCisJCSAqIHRoYXQgY29tZSBmcm9tIHRoZSBWRyBtZXRhZGF0YSBhcmUgbm90IHNob3duLCBiZWNhdXNlCisJCSAqIHRoZSBkZXYgaXMgbm90IGEgcGFydCBvZiB0aGUgVkcsIHRoZSBkZXYgZm9yIHRoZQorCQkgKiBwcmVmZXJyZWQgUFYgaXMgKGFsc28gdGhlIFZHIG1ldGFkYXRhIGluIGx2bWNhY2hlIGlzCisJCSAqIG5vdCBmcm9tIHRoZSBkdXBsaWNhdGUgZGV2LCBidXQgZnJvbSB0aGUgcHJlZmVycmVkIGRldikuCisJCSAqLworCisJCWxvZ192ZXJ5X3ZlcmJvc2UoIlByb2Nlc3NpbmcgZHVwbGljYXRlIGRldmljZSAlcy4iLCBkZXZfbmFtZShkZXZsLT5kZXYpKTsKKworCQkvKgorCQkgKiBEb24ndCBwYXNzIGRldiB0byBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZCBiZWNhdXNlIHdlIGxvb2tpbmcKKwkJICogZm9yIHRoZSBjaG9zZW4vcHJlZmVycmVkIGRldiBmb3IgdGhpcyBwdmlkLgorCQkgKi8KKwkJaW5mbyA9IGx2bWNhY2hlX2luZm9fZnJvbV9wdmlkKGRldmwtPmRldi0+cHZpZCwgTlVMTCwgMCk7CisJCWlmIChpbmZvKQorCQkJdmduYW1lID0gbHZtY2FjaGVfdmduYW1lX2Zyb21faW5mbyhpbmZvKTsKKwkJaWYgKHZnbmFtZSkKKwkJCXZnaWQgPSBsdm1jYWNoZV92Z2lkX2Zyb21fdmduYW1lKGNtZCwgdmduYW1lKTsKKwkJaWYgKHZnaWQpCisJCQl2ZyA9IGx2bWNhY2hlX2dldF92ZyhjbWQsIHZnbmFtZSwgdmdpZCwgMCk7CisKKwkJbWVtc2V0KCZwdl9kdW1teSwgMCwgc2l6ZW9mKHB2X2R1bW15KSk7CisJCWRtX2xpc3RfaW5pdCgmcHZfZHVtbXkudGFncyk7CisJCWRtX2xpc3RfaW5pdCgmcHZfZHVtbXkuc2VnbWVudHMpOworCQlwdl9kdW1teS5kZXYgPSBkZXZsLT5kZXY7CisJCXB2X2R1bW15LmZtdCA9IGx2bWNhY2hlX2ZtdF9mcm9tX2luZm8oaW5mbyk7CisJCXB2ID0gJnB2X2R1bW15OworCisJCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3B2KGNtZCwgdmcsIHB2LCBoYW5kbGUpOworCisJCWlmICh2ZykKKwkJCXJlbGVhc2VfdmcodmcpOworCisJCWlmIChyZXQgPiByZXRfbWF4KQorCQkJcmV0X21heCA9IHJldDsKKworCQlpZiAoc2lnaW50X2NhdWdodCgpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0KKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworc3RhdGljIGludCBfcHJvY2Vzc19wdnNfaW5fdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxfZGV2aWNlcywKKwkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICphcmdfZGV2aWNlcywKKwkJCSAgICAgIHN0cnVjdCBkbV9saXN0ICphcmdfdGFncywKKwkJCSAgICAgIGludCBwcm9jZXNzX2FsbF9wdnMsCisJCQkgICAgICBpbnQgcHJvY2Vzc19hbGxfZGV2aWNlcywKKwkJCSAgICAgIGludCBza2lwLAorCQkJICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgICBwcm9jZXNzX3NpbmdsZV9wdl9mbl90IHByb2Nlc3Nfc2luZ2xlX3B2KQoreworCWxvZ19yZXBvcnRfdCBzYXZlZF9sb2dfcmVwb3J0X3N0YXRlID0gbG9nX2dldF9yZXBvcnRfc3RhdGUoKTsKKwljaGFyIHB2X3V1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwljaGFyIHZnX3V1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlpbnQgaGFuZGxlX3N1cHBsaWVkID0gaGFuZGxlICE9IE5VTEw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKwlzdHJ1Y3QgZGV2aWNlX2lkX2xpc3QgKmRpbDsKKwljb25zdCBjaGFyICpwdl9uYW1lOworCWludCBwcm9jZXNzX3B2OworCWludCBkb19yZXBvcnRfcmV0X2NvZGUgPSAxOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldCA9IDA7CisKKwlsb2dfc2V0X3JlcG9ydF9vYmplY3RfdHlwZShMT0dfUkVQT1JUX09CSkVDVF9UWVBFX1BWKTsKKworCXZnX3V1aWRbMF0gPSAnXDAnOworCWlmICghaWRfd3JpdGVfZm9ybWF0KCZ2Zy0+aWQsIHZnX3V1aWQsIHNpemVvZih2Z191dWlkKSkpCisJCXN0YWNrOworCisJaWYgKCFoYW5kbGUgJiYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwlpZiAoaGFuZGxlLT5pbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdCAmJiAhaGFuZGxlLT5zZWxlY3Rpb25faGFuZGxlICYmCisJICAgICFpbml0X3NlbGVjdGlvbl9oYW5kbGUoY21kLCBoYW5kbGUsIFBWUykpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwlpZiAoIWlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpCisJCWxvZ19zZXRfcmVwb3J0X29iamVjdF9ncm91cF9hbmRfZ3JvdXBfaWQodmctPm5hbWUsIHZnX3V1aWQpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJcHYgPSBwdmwtPnB2OworCQlwdl9uYW1lID0gcHZfZGV2X25hbWUocHYpOworCQlwdl91dWlkWzBdPSdcMCc7CisJCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdi0+aWQsIHB2X3V1aWQsIHNpemVvZihwdl91dWlkKSkpCisJCQlzdGFjazsKKworCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQocHZfbmFtZSwgcHZfdXVpZCk7CisKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkgeworCQkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQkJZ290b19vdXQ7CisJCX0KKworCQlwcm9jZXNzX3B2ID0gcHJvY2Vzc19hbGxfcHZzOworCisJCS8qIFJlbW92ZSBlYWNoIGFyZ19kZXZpY2VzIGVudHJ5IGFzIGl0IGlzIHByb2Nlc3NlZC4gKi8KKworCQlpZiAoIXByb2Nlc3NfcHYgJiYgIWRtX2xpc3RfZW1wdHkoYXJnX2RldmljZXMpICYmCisJCSAgICAoZGlsID0gX2RldmljZV9saXN0X2ZpbmRfZGV2KGFyZ19kZXZpY2VzLCBwdi0+ZGV2KSkpIHsKKwkJCXByb2Nlc3NfcHYgPSAxOworCQkJX2RldmljZV9saXN0X3JlbW92ZShhcmdfZGV2aWNlcywgZGlsLT5kZXYpOworCQl9CisKKwkJaWYgKCFwcm9jZXNzX3B2ICYmICFkbV9saXN0X2VtcHR5KGFyZ190YWdzKSAmJgorCQkgICAgc3RyX2xpc3RfbWF0Y2hfbGlzdChhcmdfdGFncywgJnB2LT50YWdzLCBOVUxMKSkKKwkJCXByb2Nlc3NfcHYgPSAxOworCisJCXByb2Nlc3NfcHYgPSBwcm9jZXNzX3B2ICYmIHNlbGVjdF9tYXRjaF9wdihjbWQsIGhhbmRsZSwgdmcsIHB2KSAmJiBfc2VsZWN0X21hdGNoZXMoaGFuZGxlKTsKKworCQlpZiAocHJvY2Vzc19wdikgeworCQkJaWYgKHNraXApCisJCQkJbG9nX3ZlcmJvc2UoIlNraXBwaW5nIFBWICVzIGluIFZHICVzLiIsIHB2X25hbWUsIHZnLT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlsb2dfdmVyeV92ZXJib3NlKCJQcm9jZXNzaW5nIFBWICVzIGluIFZHICVzLiIsIHB2X25hbWUsIHZnLT5uYW1lKTsKKworCQkJX2RldmljZV9saXN0X3JlbW92ZShhbGxfZGV2aWNlcywgcHYtPmRldik7CisKKwkJCS8qCisJCQkgKiBwdi0+ZGV2IHNob3VsZCBiZSBmb3VuZCBpbiBhbGxfZGV2aWNlcyB1bmxlc3MgaXQncyBhCisJCQkgKiBjYXNlIG9mIGEgIm1pc3NpbmcgZGV2aWNlIi4gIFByZXZpb3VzbHkgdGhlcmUgaGF2ZQorCQkJICogYmVlbiBjYXNlcyB3aGVyZSB3ZSBuZWVkZWQgdG8gc2tpcCBwcm9jZXNzaW5nIHRoZSBQVgorCQkJICogaWYgcHYtPmRldiB3YXMgbm90IGZvdW5kIGluIGFsbF9kZXZpY2VzIHRvIGF2b2lkCisJCQkgKiBwcm9jZXNzaW5nIGEgUFYgdHdpY2UsIGkuZS4gd2hlbiB0aGUgUFYgaGFkIG5vIE1EQXMKKwkJCSAqIGl0IHdvdWxkIGJlIHNlZW4gb25jZSBpbiBpdHMgcmVhbCBWRyBhbmQgYWdhaW4KKwkJCSAqIHdyb25nbHkgaW4gdGhlIG9ycGhhbiBWRy4gIFRoaXMgbm8gbG9uZ2VyIGhhcHBlbnMuCisJCQkgKi8KKworCQkJaWYgKCFza2lwKSB7CisJCQkJcmV0ID0gcHJvY2Vzc19zaW5nbGVfcHYoY21kLCB2ZywgcHYsIGhhbmRsZSk7CisJCQkJaWYgKHJldCAhPSBFQ01EX1BST0NFU1NFRCkKKwkJCQkJc3RhY2s7CisJCQkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXQpOworCQkJCWlmIChyZXQgPiByZXRfbWF4KQorCQkJCQlyZXRfbWF4ID0gcmV0OworCQkJfQorCQl9CisKKwkJLyoKKwkJICogV2hlbiBwcm9jZXNzaW5nIG9ubHkgc3BlY2lmaWMgUFZzLCB3ZSBjYW4gcXVpdCBvbmNlIHRoZXkndmUgYWxsIGJlZW4gZm91bmQuCisJIAkgKi8KKwkJaWYgKCFwcm9jZXNzX2FsbF9wdnMgJiYgZG1fbGlzdF9lbXB0eShhcmdfdGFncykgJiYgZG1fbGlzdF9lbXB0eShhcmdfZGV2aWNlcykpCisJCQlicmVhazsKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKE5VTEwsIE5VTEwpOworCX0KKwlkb19yZXBvcnRfcmV0X2NvZGUgPSAwOworb3V0OgorCWlmIChkb19yZXBvcnRfcmV0X2NvZGUpCisJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0X21heCk7CisJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKE5VTEwsIE5VTEwpOworCWxvZ19zZXRfcmVwb3J0X29iamVjdF9ncm91cF9hbmRfZ3JvdXBfaWQoTlVMTCwgTlVMTCk7CisJaWYgKCFoYW5kbGVfc3VwcGxpZWQpCisJCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCWxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShzYXZlZF9sb2dfcmVwb3J0X3N0YXRlKTsKKworCXJldHVybiByZXRfbWF4OworfQorCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIGFsbCBQVnMgaW4gZWFjaCBsaXN0ZWQgVkcuICBQcm9jZXNzIGEgUFYgaWYKKyAqIGl0cyBkZXYgb3IgdGFnIG1hdGNoZXMgYXJnX2RldmljZXMgb3IgYXJnX3RhZ3MuICBJZiBib3RoCisgKiBhcmdfZGV2aWNlcyBhbmQgYXJnX3RhZ3MgYXJlIGVtcHR5LCB0aGVuIHByb2Nlc3MgYWxsIFBWcy4KKyAqIE5vIFBWIHNob3VsZCBiZSBwcm9jZXNzZWQgbW9yZSB0aGFuIG9uY2UuCisgKgorICogRWFjaCBQViBpcyByZW1vdmVkIGZyb20gYXJnX2RldmljZXMgYW5kIGFsbF9kZXZpY2VzIHdoZW4gaXQgaXMKKyAqIHByb2Nlc3NlZC4gIEFueSBuYW1lcyByZW1haW5pbmcgaW4gYXJnX2RldmljZXMgd2VyZSBub3QgZm91bmQsIGFuZAorICogc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IuICBBbnkgZGV2aWNlcyByZW1haW5pbmcgaW4gYWxsX2RldmljZXMgd2VyZQorICogbm90IGZvdW5kIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NfZGV2aWNlX2xpc3QoKS4KKyAqLworc3RhdGljIGludCBfcHJvY2Vzc19wdnNfaW5fdmdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCB1aW50MzJfdCByZWFkX2ZsYWdzLAorCQkJICAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxfdmduYW1laWRzLAorCQkJICAgICAgIHN0cnVjdCBkbV9saXN0ICphbGxfZGV2aWNlcywKKwkJCSAgICAgICBzdHJ1Y3QgZG1fbGlzdCAqYXJnX2RldmljZXMsCisJCQkgICAgICAgc3RydWN0IGRtX2xpc3QgKmFyZ190YWdzLAorCQkJICAgICAgIGludCBwcm9jZXNzX2FsbF9wdnMsCisJCQkgICAgICAgaW50IHByb2Nlc3NfYWxsX2RldmljZXMsCisJCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgICAgcHJvY2Vzc19zaW5nbGVfcHZfZm5fdCBwcm9jZXNzX3NpbmdsZV9wdikKK3sKKwlsb2dfcmVwb3J0X3Qgc2F2ZWRfbG9nX3JlcG9ydF9zdGF0ZSA9IGxvZ19nZXRfcmVwb3J0X3N0YXRlKCk7CisJY2hhciB1dWlkWzY0XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmc7CisJc3RydWN0IHZnbmFtZWlkX2xpc3QgKnZnbmw7CisJY29uc3QgY2hhciAqdmdfbmFtZTsKKwljb25zdCBjaGFyICp2Z191dWlkOworCXVpbnQzMl90IGxvY2tkX3N0YXRlID0gMDsKKwlpbnQgcmV0X21heCA9IEVDTURfUFJPQ0VTU0VEOworCWludCByZXQ7CisJaW50IHNraXA7CisJaW50IG5vdGZvdW5kOworCWludCBhbHJlYWR5X2xvY2tlZDsKKwlpbnQgZG9fcmVwb3J0X3JldF9jb2RlID0gMTsKKworCWxvZ19zZXRfcmVwb3J0X29iamVjdF90eXBlKExPR19SRVBPUlRfT0JKRUNUX1RZUEVfVkcpOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZnbmwsIGFsbF92Z25hbWVpZHMpIHsKKwkJdmdfbmFtZSA9IHZnbmwtPnZnX25hbWU7CisJCXZnX3V1aWQgPSB2Z25sLT52Z2lkOworCQlza2lwID0gMDsKKwkJbm90Zm91bmQgPSAwOworCisJCXV1aWRbMF0gPSAnXDAnOworCQlpZiAoaXNfb3JwaGFuX3ZnKHZnX25hbWUpKSB7CisJCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfdHlwZShMT0dfUkVQT1JUX09CSkVDVF9UWVBFX09SUEhBTik7CisJCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQodmdfbmFtZSArIHNpemVvZihWR19PUlBIQU5TKSwgdXVpZCk7CisJCX0gZWxzZSB7CisJCQlpZiAodmdfdXVpZCAmJiAhaWRfd3JpdGVfZm9ybWF0KChjb25zdCBzdHJ1Y3QgaWQqKXZnX3V1aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCQkJc3RhY2s7CisJCQlsb2dfc2V0X3JlcG9ydF9vYmplY3RfbmFtZV9hbmRfaWQodmdfbmFtZSwgdXVpZCk7CisJCX0KKworCQlpZiAoc2lnaW50X2NhdWdodCgpKSB7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvX291dDsKKwkJfQorCisJCWlmICghbG9ja2RfdmcoY21kLCB2Z19uYW1lLCBOVUxMLCAwLCAmbG9ja2Rfc3RhdGUpKSB7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlyZXBvcnRfbG9nX3JldF9jb2RlKHJldF9tYXgpOworCQkJY29udGludWU7CisJCX0KKworCQlsb2dfZGVidWcoIlByb2Nlc3NpbmcgUFZzIGluIFZHICVzIiwgdmdfbmFtZSk7CisKKwkJYWxyZWFkeV9sb2NrZWQgPSBsdm1jYWNoZV92Z25hbWVfaXNfbG9ja2VkKHZnX25hbWUpOworCisJCXZnID0gdmdfcmVhZChjbWQsIHZnX25hbWUsIHZnX3V1aWQsIHJlYWRfZmxhZ3MsIGxvY2tkX3N0YXRlKTsKKwkJaWYgKF9pZ25vcmVfdmcodmcsIHZnX25hbWUsIE5VTEwsIHJlYWRfZmxhZ3MsICZza2lwLCAmbm90Zm91bmQpKSB7CisJCQlzdGFjazsKKwkJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwkJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0X21heCk7CisJCQlpZiAoIXNraXApCisJCQkJZ290byBlbmR2ZzsKKwkJCS8qIERyb3AgdGhyb3VnaCB0byBlbGltaW5hdGUgYSBjbHVzdGVyZWQgVkcncyBQVnMgZnJvbSB0aGUgZGV2aWNlcyBsaXN0ICovCisJCX0KKwkJaWYgKG5vdGZvdW5kKQorCQkJZ290byBlbmR2ZzsKKwkJCisJCS8qCisJCSAqIERvbid0IGNvbnRpbnVlIHdoZW4gc2tpcCBpcyBzZXQsIGJlY2F1c2Ugd2UgbmVlZCB0byByZW1vdmUKKwkJICogdmctPnB2cyBlbnRyaWVzIGZyb20gZGV2aWNlcyBsaXN0LgorCQkgKi8KKwkJCisJCXJldCA9IF9wcm9jZXNzX3B2c19pbl92ZyhjbWQsIHZnLCBhbGxfZGV2aWNlcywgYXJnX2RldmljZXMsIGFyZ190YWdzLAorCQkJCQkgcHJvY2Vzc19hbGxfcHZzLCBwcm9jZXNzX2FsbF9kZXZpY2VzLCBza2lwLAorCQkJCQkgaGFuZGxlLCBwcm9jZXNzX3NpbmdsZV9wdik7CisJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCQlzdGFjazsKKwkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXQpOworCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCXJldF9tYXggPSByZXQ7CisKKwkJaWYgKCFza2lwICYmICFhbHJlYWR5X2xvY2tlZCkKKwkJCXVubG9ja192ZyhjbWQsIHZnLCB2Zy0+bmFtZSk7CitlbmR2ZzoKKwkJcmVsZWFzZV92Zyh2Zyk7CisJCWlmICghbG9ja2RfdmcoY21kLCB2Z19uYW1lLCAidW4iLCAwLCAmbG9ja2Rfc3RhdGUpKQorCQkJc3RhY2s7CisKKwkJLyogUXVpdCBlYXJseSB3aGVuIHBvc3NpYmxlLiAqLworCQlpZiAoIXByb2Nlc3NfYWxsX3B2cyAmJiBkbV9saXN0X2VtcHR5KGFyZ190YWdzKSAmJiBkbV9saXN0X2VtcHR5KGFyZ19kZXZpY2VzKSkgeworCQkJZG9fcmVwb3J0X3JldF9jb2RlID0gMDsKKwkJCWdvdG9fb3V0OworCQl9CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKE5VTEwsIE5VTEwpOworCX0KKwlkb19yZXBvcnRfcmV0X2NvZGUgPSAwOworb3V0OgorCWlmIChkb19yZXBvcnRfcmV0X2NvZGUpCisJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0X21heCk7CisJbG9nX3Jlc3RvcmVfcmVwb3J0X3N0YXRlKHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUpOworCXJldHVybiByZXRfbWF4OworfQorCitpbnQgcHJvY2Vzc19lYWNoX3B2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkgICAgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpvbmx5X3RoaXNfdmduYW1lLAorCQkgICAgaW50IGFsbF9pc19zZXQsIHVpbnQzMl90IHJlYWRfZmxhZ3MsCisJCSAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJICAgIHByb2Nlc3Nfc2luZ2xlX3B2X2ZuX3QgcHJvY2Vzc19zaW5nbGVfcHYpCit7CisJbG9nX3JlcG9ydF90IHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUgPSBsb2dfZ2V0X3JlcG9ydF9zdGF0ZSgpOworCXN0cnVjdCBkbV9saXN0IGFyZ190YWdzOwkvKiBzdHJfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IGFyZ19wdm5hbWVzOwkvKiBzdHJfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IGFyZ19kZXZpY2VzOwkvKiBkZXZpY2VfaWRfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IGFyZ19taXNzZWQ7CS8qIGRldmljZV9pZF9saXN0ICovCisJc3RydWN0IGRtX2xpc3QgYWxsX3ZnbmFtZWlkczsJLyogdmduYW1laWRfbGlzdCAqLworCXN0cnVjdCBkbV9saXN0IGFsbF9kZXZpY2VzOwkvKiBkZXZpY2VfaWRfbGlzdCAqLworCXN0cnVjdCBkZXZpY2VfaWRfbGlzdCAqZGlsOworCWludCBwcm9jZXNzX2FsbF9wdnM7CisJaW50IHByb2Nlc3NfYWxsX2RldmljZXM7CisJaW50IG9ycGhhbnNfbG9ja2VkOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldDsKKworCWxvZ19zZXRfcmVwb3J0X29iamVjdF90eXBlKExPR19SRVBPUlRfT0JKRUNUX1RZUEVfUFYpOworCWxvZ19kZWJ1ZygiUHJvY2Vzc2luZyBlYWNoIFBWIik7CisKKwkvKgorCSAqIFdoZW4gcHJvY2Vzc2luZyBhIHNwZWNpZmljIFZHIG5hbWUsIHdhcm4gaWYgaXQncyBpbmNvbnNpc3RlbnQgYW5kCisJICogcHJpbnQgYW4gZXJyb3IgaWYgaXQncyBub3QgZm91bmQuICBPdGhlcndpc2Ugd2UncmUgcHJvY2Vzc2luZyBhbGwKKwkgKiBWR3MsIGluIHdoaWNoIGNhc2UgdGhlIGNvbW1hbmQgZG9lc24ndCBjYXJlIGlmIHRoZSBWRyBpcyBpbmNvbnNpc2VudAorCSAqIG9yIG5vdCBmb3VuZDsgaXQganVzdCB3YW50cyB0byBza2lwIHRoYXQgVkcuICAoSXQgbWF5IGJlIG5vdCBmb3VuZAorCSAqIGlmIGl0IHdhcyByZW1vdmVkIGJldHdlZW4gY3JlYXRpbmcgdGhlIGxpc3Qgb2YgYWxsIFZHcyBhbmQgdGhlbgorCSAqIHByb2Nlc3NpbmcgZWFjaCBWRy4KKwkgKi8KKwlpZiAob25seV90aGlzX3ZnbmFtZSkKKwkJcmVhZF9mbGFncyB8PSBSRUFEX1dBUk5fSU5DT05TSVNURU5UOworCWVsc2UKKwkJcmVhZF9mbGFncyB8PSBSRUFEX09LX05PVEZPVU5EOworCisJLyogRGlzYWJsZSBlcnJvciBpbiB2Z19yZWFkIHNvIHdlIGNhbiBwcmludCBpdCBmcm9tIGlnbm9yZV92Zy4gKi8KKwljbWQtPnZnX3JlYWRfcHJpbnRfYWNjZXNzX2Vycm9yID0gMDsKKworCWRtX2xpc3RfaW5pdCgmYXJnX3RhZ3MpOworCWRtX2xpc3RfaW5pdCgmYXJnX3B2bmFtZXMpOworCWRtX2xpc3RfaW5pdCgmYXJnX2RldmljZXMpOworCWRtX2xpc3RfaW5pdCgmYXJnX21pc3NlZCk7CisJZG1fbGlzdF9pbml0KCZhbGxfdmduYW1laWRzKTsKKwlkbV9saXN0X2luaXQoJmFsbF9kZXZpY2VzKTsKKworCS8qCisJICogQ3JlYXRlIHR3byBsaXN0cyBmcm9tIGFyZ3Y6CisJICogYXJnX3B2bmFtZXM6IHB2cyBleHBsaWNpdGx5IG5hbWVkIGluIGFyZ3YKKwkgKiBhcmdfdGFnczogdGFncyBleHBsaWNpdGx5IG5hbWVkIGluIGFyZ3YKKwkgKgorCSAqIFRoZW4gY29udmVydCBhcmdfcHZuYW1lcywgd2hpY2ggYXJlIGZyZWUtZm9ybSwgdXNlci1zcGVjaWZpZWQsCisJICogbmFtZXMvcGF0aHMgaW50byBhcmdfZGV2aWNlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXRjaCBiZWxvdy4KKwkgKi8KKwlpZiAoKHJldCA9IF9nZXRfYXJnX3B2bmFtZXMoY21kLCBhcmdjLCBhcmd2LCAmYXJnX3B2bmFtZXMsICZhcmdfdGFncykpICE9IEVDTURfUFJPQ0VTU0VEKSB7CisJCXJldF9tYXggPSByZXQ7CisJCWdvdG9fb3V0OworCX0KKworCWlmICgoY21kLT5jb21tYW5kLT5mbGFncyAmIERJU0FMTE9XX1RBR19BUkdTKSAmJiAhZG1fbGlzdF9lbXB0eSgmYXJnX3RhZ3MpKSB7CisJCWxvZ19lcnJvcigiVGFncyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgY29tbWFuZC4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCW9ycGhhbnNfbG9ja2VkID0gbHZtY2FjaGVfdmduYW1lX2lzX2xvY2tlZChWR19PUlBIQU5TKTsKKworCXByb2Nlc3NfYWxsX3B2cyA9IGRtX2xpc3RfZW1wdHkoJmFyZ19wdm5hbWVzKSAmJiBkbV9saXN0X2VtcHR5KCZhcmdfdGFncyk7CisKKwlwcm9jZXNzX2FsbF9kZXZpY2VzID0gcHJvY2Vzc19hbGxfcHZzICYmIChjbWQtPmNvbW1hbmQtPmZsYWdzICYgRU5BQkxFX0FMTF9ERVZTKSAmJiBhbGxfaXNfc2V0OworCisJLyogTmVlZGVkIGZvciBhIGN1cnJlbnQgbGlzdGluZyBvZiB0aGUgZ2xvYmFsIFZHIG5hbWVzcGFjZS4gKi8KKwlpZiAoIW9ubHlfdGhpc192Z25hbWUgJiYgIWxvY2tkX2dsKGNtZCwgInNoIiwgMCkpIHsKKwkJcmV0X21heCA9IEVDTURfRkFJTEVEOworCQlnb3RvX291dDsKKwl9CisKKwkvKgorCSAqIFRoaXMgZnVsbCBzY2FuIHdvdWxkIGJlIGRvbmUgYnkgX2dldF9hbGxfZGV2aWNlcygpIGlmCisJICogaXQgd2VyZSBub3QgZG9uZSBoZXJlIGZpcnN0LiAgSXQncyBjYWxsZWQgaGVyZSBmaXJzdAorCSAqIHNvIHRoYXQgZ2V0X3ZnbmFtZWlkcygpIHdpbGwgbG9vayBhdCBhbnkgbmV3IGRldmljZXMuCisJICogV2hlbiBvcnBoYW5zIGlzIGFscmVhZHkgbG9ja2VkLCB0aGVzZSBzdGVwcyBhcmUgZG9uZQorCSAqIGJlZm9yZSBwcm9jZXNzX2VhY2hfcHYgaXMgY2FsbGVkLgorCSAqLworCWlmICghdHJ1c3RfY2FjaGUoKSAmJiAhb3JwaGFuc19sb2NrZWQpIHsKKwkJbG9nX2RlYnVnKCJTY2FubmluZyBmb3IgYXZhaWxhYmxlIGRldmljZXMiKTsKKwkJbHZtY2FjaGVfZGVzdHJveShjbWQsIDEsIDApOworCQlkZXZfY2FjaGVfZnVsbF9zY2FuKGNtZC0+ZnVsbF9maWx0ZXIpOworCX0KKworCWlmICghZ2V0X3ZnbmFtZWlkcyhjbWQsICZhbGxfdmduYW1laWRzLCBvbmx5X3RoaXNfdmduYW1lLCAxKSkgeworCQlyZXRfbWF4ID0gcmV0OworCQlnb3RvX291dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gcHJvY2VzcyBhbGwgZGV2aWNlcyAobm90IGp1c3QgUFZzKSwgdGhlbiBhbGwgUFZzCisJICogZnJvbSBhbGwgVkdzIGFyZSBwcm9jZXNzZWQgZmlyc3QsIHJlbW92aW5nIHRoZW0gZnJvbSBhbGxfZGV2aWNlcy4gIFRoZW4KKwkgKiBhbnkgZGV2cyByZW1haW5pbmcgaW4gYWxsX2RldmljZXMgYXJlIHByb2Nlc3NlZC4KKwkgKi8KKwlpZiAoKHJldCA9IF9nZXRfYWxsX2RldmljZXMoY21kLCAmYWxsX2RldmljZXMpICE9IEVDTURfUFJPQ0VTU0VEKSkgeworCQlyZXRfbWF4ID0gcmV0OworCQlnb3RvX291dDsKKwl9CisKKwlpZiAoKHJldCA9IF9nZXRfYXJnX2RldmljZXMoY21kLCAmYXJnX3B2bmFtZXMsICZhcmdfZGV2aWNlcykpICE9IEVDTURfUFJPQ0VTU0VEKQorCQkvKiBnZXRfYXJnX2RldmljZXMgcmVwb3J0cyB0aGUgZXJyb3IgZm9yIGFueSBQViBuYW1lcyBub3QgZm91bmQuICovCisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKworCXJldCA9IF9wcm9jZXNzX3B2c19pbl92Z3MoY21kLCByZWFkX2ZsYWdzLCAmYWxsX3ZnbmFtZWlkcywgJmFsbF9kZXZpY2VzLAorCQkJCSAgJmFyZ19kZXZpY2VzLCAmYXJnX3RhZ3MsCisJCQkJICBwcm9jZXNzX2FsbF9wdnMsIHByb2Nlc3NfYWxsX2RldmljZXMsCisJCQkJICBoYW5kbGUsIHByb2Nlc3Nfc2luZ2xlX3B2KTsKKwlpZiAocmV0ICE9IEVDTURfUFJPQ0VTU0VEKQorCQlzdGFjazsKKwlpZiAocmV0ID4gcmV0X21heCkKKwkJcmV0X21heCA9IHJldDsKKworCS8qCisJICogUHJvY2VzcyB0aGUgbGlzdCBvZiB1bnVzZWQgZHVwbGljYXRlIGRldnMgc28gdGhleSBjYW4gYmUgc2hvd24gYnkKKwkgKiByZXBvcnQvZGlzcGxheSBjb21tYW5kcy4gIFRoZXNlIGFyZSB0aGUgZGV2aWNlcyB0aGF0IHdlcmUgbm90IGNob3NlbgorCSAqIHRvIGJlIHVzZWQgaW4gbHZtY2FjaGUgYmVjYXVzZSBhbm90aGVyIGRldmljZSB3aXRoIHRoZSBzYW1lIFBWSUQgd2FzCisJICogcHJlZmVycmVkLiAgVGhlIHVudXNlZCBkdXBsaWNhdGUgZGV2cyBhcmUgbm90IHNlZW4gYnkKKwkgKiBfcHJvY2Vzc19wdnNfaW5fdmdzLCB3aGljaCBvbmx5IHNlZXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgZm9yIHRoZQorCSAqIFBWSUQuCisJICoKKwkgKiBUaGUgbWFpbiBwdXJwb3NlIGluIHJlcG9ydGluZy9kaXNwbGF5aW5nIHRoZSB1bnVzZWQgZHVwbGljYXRlIFBWcworCSAqIGhlcmUgaXMgc28gdGhhdCB0aGV5IGRvIG5vdCBhcHBlYXIgdG8gYmUgdW51c2VkL2ZyZWUgZGV2aWNlcyBvcgorCSAqIG9ycGhhbnMuCisJICoKKwkgKiBXZSBkbyBub3QgYWxsb3cgbW9kaWZ5aW5nIHRoZSB1bnVzZWQgZHVwbGljYXRlIFBWcy4gIFRvIG1vZGlmeSBhCisJICogbm9uLXByZWZlcnJlZCBkdXBsaWNhdGUgUFYsIGUuZy4gcHZjaGFuZ2UgLXUsIGEgZmlsdGVyIG5lZWRzIHRvIGJlCisJICogdXNlZCB3aXRoIHRoZSBjb21tYW5kIHRvIGV4Y2x1ZGUgdGhlIG90aGVyIGRldmljZXMgd2l0aCB0aGUgc2FtZQorCSAqIFBWSUQuICBUaGlzIHJlc3VsdHMgaW4gdGhlIGNvbW1hbmQgc2VlaW5nIG9ubHkgdGhlIG9uZSBkZXZpY2Ugd2l0aAorCSAqIHRoZSBQVklEIGFuZCBhbGxvd3MgaXQgdG8gYmUgY2hhbmdlZC4gIChJZiB0aGUgZHVwbGljYXRlcyBhY3R1YWxseQorCSAqIHJlcHJlc2VudCB0aGUgc2FtZSB1bmRlcmx5aW5nIHN0b3JhZ2UsIHRoZXNlIHByZWNhdXRpb25zIGFyZQorCSAqIHVubmVjZXNzYXJ5LCBidXQgbHZtIGNhbid0IHRlbGwgd2hlbiB0aGUgZHVwbGljYXRlcyBhcmUgZGlmZmVyZW50CisJICogcGF0aHMgdG8gdGhlIHNhbWUgc3RvcmFnZSBvciBkaWZmZXJlbnQgdW5kZXJseWluZyBzdG9yYWdlLikKKwkgKgorCSAqIEV2ZW4gdGhlIHByZWZlcnJlZCBkdXBsaWNhdGUgUFYgaW4gbHZtY2FjaGUgaXMgbGltaXR0ZWQgZnJvbSBiZWluZworCSAqIG1vZGlmaWVkIChieSBhbGxvd19jaGFuZ2VzX3dpdGhfZHVwbGljYXRlX3B2cyBzZXR0aW5nKSwgYmVjYXVzZSBsdm0KKwkgKiBjYW5ub3QgYmUgc3VyZSB0aGF0IHRoZSBwcmVmZXJyZWQgZHVwbGljYXRlIGRldmljZSBpcyB0aGUgY29ycmVjdCBvbmUsCisJICogZS5nLiBpZiBhIFZHIGhhcyB0d28gUFZzLCBhbmQgYm90aCBQVnMgYXJlIGNsb25lZCwgbHZtIG1pZ2h0IHByZWZlcgorCSAqIG9uZSBvZiB0aGUgb3JpZ2luYWwgUFZzIGFuZCBvbmUgb2YgdGhlIGNsb25lZCBQVnMsIHBhaXJpbmcgdGhlbQorCSAqIHRvZ2V0aGVyIGFzIHRoZSBWRy4gIEFueSBjaGFuZ2VzIG9uIHRoZSBWRyBvciBQVnMgaW4gdGhhdCBzdGF0ZSB3b3VsZAorCSAqIGVuZCB1cCBjaGFuZ2luZyBvbmUgb2YgdGhlIG9yaWdpbmFsIFBWcyBhbmQgb25lIG9mIHRoZSBjbG9uZWQgUFZzLgorCSAqCisJICogdmdpbXBvcnRjbG9uZSBvZiB0aGUgdHdvIGNsb25lZCBQVnMgY2hhbmdlcyB0aGVpciBQViBVVUlEcyBhbmQgZ2l2ZXMKKwkgKiB0aGVtIGEgbmV3IFZHIG5hbWUuCisJICovCisKKwlyZXQgPSBfcHJvY2Vzc19kdXBsaWNhdGVfcHZzKGNtZCwgJmFsbF9kZXZpY2VzLCAmYXJnX2RldmljZXMsIHByb2Nlc3NfYWxsX2RldmljZXMsCisJCQkJICAgICBoYW5kbGUsIHByb2Nlc3Nfc2luZ2xlX3B2KTsKKwlpZiAocmV0ICE9IEVDTURfUFJPQ0VTU0VEKQorCQlzdGFjazsKKwlpZiAocmV0ID4gcmV0X21heCkKKwkJcmV0X21heCA9IHJldDsKKworCS8qCisJICogSWYgdGhlIG9ycGhhbnMgbG9jayB3YXMgaGVsZCwgdGhlcmUgc2hvdWxkbid0IGJlIG1pc3NlZCBkZXZpY2VzLiAgSWYKKwkgKiB0aGVyZSB3ZXJlLCB3ZSBjYW5ub3QgY2xlYXIgdGhlIGNhY2hlIHdoaWxlIGhvbGRpbmcgdGhlIG9ycGhhbnMgbG9jaworCSAqIGFueXdheS4KKwkgKi8KKwlpZiAob3JwaGFuc19sb2NrZWQpCisJCWdvdG8gc2tpcF9taXNzZWQ7CisKKwkvKgorCSAqIFNvbWUgUFZzIG1heSBoYXZlIGJlZW4gbWlzc2VkIGJ5IHRoZSBmaXJzdCBzZWFyY2ggaWYgYW5vdGhlciBjb21tYW5kCisJICogbW92ZWQgdGhlbSBhdCB0aGUgc2FtZSB0aW1lLiAgUmVwZWF0IHRoZSBzZWFyY2ggZm9yIG9ubHkgdGhlCisJICogc3BlY2lmaWMgUFZzIG1pc3NlZC4gIGx2bWNhY2hlIG5lZWRzIGNsZWFyaW5nIGZvciBhIGZyZXNoIHNlYXJjaC4KKwkgKgorCSAqIElmIG1pc3NlZCBQVnMgYXJlIGZvdW5kIGluIHRoaXMgcmVwZWF0ZWQgc2VhcmNoLCB0aGV5IGFyZSByZW1vdmVkCisJICogZnJvbSB0aGUgYXJnX21pc3NlZCBsaXN0LCBidXQgdGhleSBhbHNvIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQorCSAqIGFyZ19kZXZpY2VzIGxpc3QsIG90aGVyd2lzZSB0aGUgY2hlY2sgYXQgdGhlIGVuZCB3aWxsIHByb2R1Y2UgYW4KKwkgKiBlcnJvciwgdGhpbmtpbmcgdGhleSB3ZXJlbid0IGZvdW5kLiAgVGhpcyBpcyB0aGUgcmVhc29uIGZvciBzYXZpbmcKKwkgKiBhbmQgY29tcGFyaW5nIHRoZSBvcmlnaW5hbCBhcmdfbWlzc2VkIGxpc3QuCisJICovCisJaWYgKCFwcm9jZXNzX2FsbF9wdnMpCisJCV9nZXRfbWlzc2VkX3B2cyhjbWQsICZhcmdfZGV2aWNlcywgJmFyZ19taXNzZWQpOworCWVsc2UKKwkJX2dldF9taXNzZWRfcHZzKGNtZCwgJmFsbF9kZXZpY2VzLCAmYXJnX21pc3NlZCk7CisKKwlpZiAoIWRtX2xpc3RfZW1wdHkoJmFyZ19taXNzZWQpKSB7CisJCXN0cnVjdCBkbV9saXN0IGFyZ19taXNzZWRfb3JpZzsKKworCQlkbV9saXN0X2luaXQoJmFyZ19taXNzZWRfb3JpZyk7CisJCV9kZXZpY2VfbGlzdF9jb3B5KGNtZCwgJmFyZ19taXNzZWQsICZhcmdfbWlzc2VkX29yaWcpOworCisJCWxvZ192ZXJib3NlKCJTb21lIFBWcyB3ZXJlIG5vdCBmb3VuZCBpbiBmaXJzdCBzZWFyY2gsIHJldHJ5aW5nLiIpOworCisJCWx2bWNhY2hlX2Rlc3Ryb3koY21kLCAwLCAwKTsKKwkJaWYgKCFsdm1jYWNoZV9pbml0KCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRhbGl6ZSBsdm0gY2FjaGUuIik7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsdm1jYWNoZV9zZWVkX2luZm9zX2Zyb21fbHZtZXRhZChjbWQpOworCisJCXJldCA9IF9wcm9jZXNzX3B2c19pbl92Z3MoY21kLCByZWFkX2ZsYWdzLCAmYWxsX3ZnbmFtZWlkcywgJmFsbF9kZXZpY2VzLAorCQkJCQkgICZhcmdfbWlzc2VkLCAmYXJnX3RhZ3MsIDAsIDAsCisJCQkJCSAgaGFuZGxlLCBwcm9jZXNzX3NpbmdsZV9wdik7CisJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCQlzdGFjazsKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCisJCS8qIERldmljZXMgcmVtb3ZlZCBmcm9tIGFyZ19taXNzZWQgYXJlIHJlbW92ZWQgZnJvbSBhcmdfZGV2aWNlcy4gKi8KKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGRpbCwgJmFyZ19taXNzZWRfb3JpZykgeworCQkJaWYgKCFfZGV2aWNlX2xpc3RfZmluZF9kZXYoJmFyZ19taXNzZWQsIGRpbC0+ZGV2KSkKKwkJCQlfZGV2aWNlX2xpc3RfcmVtb3ZlKCZhcmdfZGV2aWNlcywgZGlsLT5kZXYpOworCQl9CisJfQorCitza2lwX21pc3NlZDoKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoZGlsLCAmYXJnX2RldmljZXMpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gZmluZCBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiLiIsIGRldl9uYW1lKGRpbC0+ZGV2KSk7CisJCXJldF9tYXggPSBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoIXByb2Nlc3NfYWxsX2RldmljZXMpCisJCWdvdG8gb3V0OworCisJcmV0ID0gX3Byb2Nlc3NfZGV2aWNlX2xpc3QoY21kLCAmYWxsX2RldmljZXMsIGhhbmRsZSwgcHJvY2Vzc19zaW5nbGVfcHYpOworCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCXN0YWNrOworCWlmIChyZXQgPiByZXRfbWF4KQorCQlyZXRfbWF4ID0gcmV0Oworb3V0OgorCWxvZ19yZXN0b3JlX3JlcG9ydF9zdGF0ZShzYXZlZF9sb2dfcmVwb3J0X3N0YXRlKTsKKwlyZXR1cm4gcmV0X21heDsKK30KKworaW50IHByb2Nlc3NfZWFjaF9wdl9pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICBwcm9jZXNzX3NpbmdsZV9wdl9mbl90IHByb2Nlc3Nfc2luZ2xlX3B2KQoreworCWxvZ19yZXBvcnRfdCBzYXZlZF9sb2dfcmVwb3J0X3N0YXRlID0gbG9nX2dldF9yZXBvcnRfc3RhdGUoKTsKKwljaGFyIHB2X3V1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwljaGFyIHZnX3V1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlpbnQgd2hvbGVfc2VsZWN0ZWQgPSAwOworCWludCByZXRfbWF4ID0gRUNNRF9QUk9DRVNTRUQ7CisJaW50IHJldDsKKwlpbnQgZG9fcmVwb3J0X3JldF9jb2RlID0gMTsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCisJbG9nX3NldF9yZXBvcnRfb2JqZWN0X3R5cGUoTE9HX1JFUE9SVF9PQkpFQ1RfVFlQRV9QVik7CisKKwl2Z191dWlkWzBdID0gJ1wwJzsKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmdmctPmlkLCB2Z191dWlkLCBzaXplb2YodmdfdXVpZCkpKQorCQlzdGFjazsKKworCWlmICghaXNfb3JwaGFuX3ZnKHZnLT5uYW1lKSkKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X2dyb3VwX2FuZF9ncm91cF9pZCh2Zy0+bmFtZSwgdmdfdXVpZCk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlwdl91dWlkWzBdID0gJ1wwJzsKKwkJaWYgKCFpZF93cml0ZV9mb3JtYXQoJnB2bC0+cHYtPmlkLCBwdl91dWlkLCBzaXplb2YocHZfdXVpZCkpKQorCQkJc3RhY2s7CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKHB2X2Rldl9uYW1lKHB2bC0+cHYpLCBwdl91dWlkKTsKKworCQlpZiAoc2lnaW50X2NhdWdodCgpKSB7CisJCQlyZXRfbWF4ID0gRUNNRF9GQUlMRUQ7CisJCQlnb3RvX291dDsKKwkJfQorCisJCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3B2KGNtZCwgdmcsIHB2bC0+cHYsIGhhbmRsZSk7CisJCV91cGRhdGVfc2VsZWN0aW9uX3Jlc3VsdChoYW5kbGUsICZ3aG9sZV9zZWxlY3RlZCk7CisJCWlmIChyZXQgIT0gRUNNRF9QUk9DRVNTRUQpCisJCQlzdGFjazsKKwkJcmVwb3J0X2xvZ19yZXRfY29kZShyZXQpOworCQlpZiAocmV0ID4gcmV0X21heCkKKwkJCXJldF9tYXggPSByZXQ7CisKKwkJbG9nX3NldF9yZXBvcnRfb2JqZWN0X25hbWVfYW5kX2lkKE5VTEwsIE5VTEwpOworCX0KKworCV9zZXRfZmluYWxfc2VsZWN0aW9uX3Jlc3VsdChoYW5kbGUsIHdob2xlX3NlbGVjdGVkKTsKKwlkb19yZXBvcnRfcmV0X2NvZGUgPSAwOworb3V0OgorCWlmIChkb19yZXBvcnRfcmV0X2NvZGUpCisJCXJlcG9ydF9sb2dfcmV0X2NvZGUocmV0X21heCk7CisJbG9nX3Jlc3RvcmVfcmVwb3J0X3N0YXRlKHNhdmVkX2xvZ19yZXBvcnRfc3RhdGUpOworCXJldHVybiByZXRfbWF4OworfQorCitpbnQgbHZyZW1vdmVfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJLyoKKwkgKiBTaW5nbGUgZm9yY2UgaXMgZXF1aXZhbGVudCB0byBzaW5nbGUgLS15ZXMKKwkgKiBFdmVuIG11bHRpcGxlIC0teWVzIGFyZSBlcXVpdmFsZW50IHRvIHNpbmdsZSAtLWZvcmNlCisJICogV2hlbiB3ZSByZXF1aXJlIC1mZiBpdCBjYW5ub3QgYmUgcmVwbGFjZWQgd2l0aCAtZiAteQorCSAqLworCWZvcmNlX3QgZm9yY2UgPSAoZm9yY2VfdCkgYXJnX2NvdW50KGNtZCwgZm9yY2VfQVJHKQorCQk/IDogKGFyZ19pc19zZXQoY21kLCB5ZXNfQVJHKSA/IERPTlRfUFJPTVBUIDogUFJPTVBUKTsKKworCWlmICghbHZfcmVtb3ZlX3dpdGhfZGVwZW5kZW5jaWVzKGNtZCwgbHYsIGZvcmNlLCAwKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitpbnQgcHZjcmVhdGVfcGFyYW1zX2Zyb21fYXJncyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHApCit7CisJcHAtPnllcyA9IGFyZ19jb3VudChjbWQsIHllc19BUkcpOworCXBwLT5mb3JjZSA9IChmb3JjZV90KSBhcmdfY291bnQoY21kLCBmb3JjZV9BUkcpOworCisJaWYgKGFyZ19pbnRfdmFsdWUoY21kLCBsYWJlbHNlY3Rvcl9BUkcsIDApID49IExBQkVMX1NDQU5fU0VDVE9SUykgeworCQlsb2dfZXJyb3IoImxhYmVsc2VjdG9yIG11c3QgYmUgbGVzcyB0aGFuICVsdS4iLAorCQkJICBMQUJFTF9TQ0FOX1NFQ1RPUlMpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlwcC0+cHZhLmxhYmVsX3NlY3RvciA9IGFyZ19pbnQ2NF92YWx1ZShjbWQsIGxhYmVsc2VjdG9yX0FSRywKKwkJCQkJCSAgREVGQVVMVF9MQUJFTFNFQ1RPUik7CisJfQorCisJaWYgKCEoY21kLT5mbXQtPmZlYXR1cmVzICYgRk1UX01EQVMpICYmCisJICAgIChhcmdfaXNfc2V0KGNtZCwgcHZtZXRhZGF0YWNvcGllc19BUkcpIHx8CisJICAgICBhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFzaXplX0FSRykgICB8fAorCSAgICAgYXJnX2lzX3NldChjbWQsIGRhdGFhbGlnbm1lbnRfQVJHKSAgfHwKKwkgICAgIGFyZ19pc19zZXQoY21kLCBkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRykpKSB7CisJCWxvZ19lcnJvcigiTWV0YWRhdGEgYW5kIGRhdGEgYWxpZ25tZW50IHBhcmFtZXRlcnMgb25seSAiCisJCQkgICJhcHBseSB0byB0ZXh0IGZvcm1hdC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCEoY21kLT5mbXQtPmZlYXR1cmVzICYgRk1UX0JBUykgJiYKKwkgICAgYXJnX2lzX3NldChjbWQsIGJvb3Rsb2FkZXJhcmVhc2l6ZV9BUkcpKSB7CisJCWxvZ19lcnJvcigiQm9vdGxvYWRlciBhcmVhIHBhcmFtZXRlcnMgb25seSAiCisJCQkgICJhcHBseSB0byB0ZXh0IGZvcm1hdC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBtZXRhZGF0YWlnbm9yZV9BUkcpKQorCQlwcC0+cHZhLm1ldGFkYXRhaWdub3JlID0gYXJnX2ludF92YWx1ZShjbWQsIG1ldGFkYXRhaWdub3JlX0FSRywKKwkJCQkJCSAgIERFRkFVTFRfUFZNRVRBREFUQUlHTk9SRSk7CisJZWxzZQorCQlwcC0+cHZhLm1ldGFkYXRhaWdub3JlID0gZmluZF9jb25maWdfdHJlZV9ib29sKGNtZCwgbWV0YWRhdGFfcHZtZXRhZGF0YWlnbm9yZV9DRkcsIE5VTEwpOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBwdm1ldGFkYXRhY29waWVzX0FSRykgJiYKKwkgICAgIWFyZ19pbnRfdmFsdWUoY21kLCBwdm1ldGFkYXRhY29waWVzX0FSRywgLTEpICYmCisJICAgIHBwLT5wdmEubWV0YWRhdGFpZ25vcmUpIHsKKwkJbG9nX2Vycm9yKCJtZXRhZGF0YWlnbm9yZSBvbmx5IGFwcGxpZXMgdG8gbWV0YWRhdGFjb3BpZXMgPiAwIik7CisJCXJldHVybiAwOworCX0KKworCXBwLT56ZXJvID0gYXJnX2ludF92YWx1ZShjbWQsIHplcm9fQVJHLCAxKTsKKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIGRhdGFhbGlnbm1lbnRfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCB2b2x1bWUgZGF0YSBhbGlnbm1lbnQgbWF5IG5vdCBiZSBuZWdhdGl2ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBwLT5wdmEuZGF0YV9hbGlnbm1lbnQgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgZGF0YWFsaWdubWVudF9BUkcsIFVJTlQ2NF9DKDApKTsKKworCWlmIChwcC0+cHZhLmRhdGFfYWxpZ25tZW50ID4gVUlOVDMyX01BWCkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSBkYXRhIGFsaWdubWVudCBpcyB0b28gYmlnLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lIGRhdGEgYWxpZ25tZW50IG9mZnNldCBtYXkgbm90IGJlIG5lZ2F0aXZlIik7CisJCXJldHVybiAwOworCX0KKwlwcC0+cHZhLmRhdGFfYWxpZ25tZW50X29mZnNldCA9IGFyZ191aW50NjRfdmFsdWUoY21kLCBkYXRhYWxpZ25tZW50b2Zmc2V0X0FSRywgVUlOVDY0X0MoMCkpOworCisJaWYgKHBwLT5wdmEuZGF0YV9hbGlnbm1lbnRfb2Zmc2V0ID4gVUlOVDMyX01BWCkgeworCQlsb2dfZXJyb3IoIlBoeXNpY2FsIHZvbHVtZSBkYXRhIGFsaWdubWVudCBvZmZzZXQgaXMgdG9vIGJpZy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChwcC0+cHZhLmRhdGFfYWxpZ25tZW50ICsgcHAtPnB2YS5kYXRhX2FsaWdubWVudF9vZmZzZXQpICYmCisJICAgIChwcC0+cHZhLnBlX3N0YXJ0ICE9IFBWX1BFX1NUQVJUX0NBTEMpKSB7CisJCWlmICgocHAtPnB2YS5kYXRhX2FsaWdubWVudCA/IHBwLT5wdmEucGVfc3RhcnQgJSBwcC0+cHZhLmRhdGFfYWxpZ25tZW50IDogcHAtPnB2YS5wZV9zdGFydCkgIT0gcHAtPnB2YS5kYXRhX2FsaWdubWVudF9vZmZzZXQpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBJZ25vcmluZyBkYXRhIGFsaWdubWVudCAlcyIKKwkJCQkgIiBpbmNvbXBhdGlibGUgd2l0aCByZXN0b3JlZCBwZV9zdGFydCB2YWx1ZSAlcykiLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBwcC0+cHZhLmRhdGFfYWxpZ25tZW50ICsgcHAtPnB2YS5kYXRhX2FsaWdubWVudF9vZmZzZXQpLAorCQkJCSBkaXNwbGF5X3NpemUoY21kLCBwcC0+cHZhLnBlX3N0YXJ0KSk7CisJCQlwcC0+cHZhLmRhdGFfYWxpZ25tZW50ID0gMDsKKwkJCXBwLT5wdmEuZGF0YV9hbGlnbm1lbnRfb2Zmc2V0ID0gMDsKKwkJfQorCX0KKworCWlmIChhcmdfc2lnbl92YWx1ZShjbWQsIG1ldGFkYXRhc2l6ZV9BUkcsIFNJR05fTk9ORSkgPT0gU0lHTl9NSU5VUykgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhIHNpemUgbWF5IG5vdCBiZSBuZWdhdGl2ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZ19zaWduX3ZhbHVlKGNtZCwgYm9vdGxvYWRlcmFyZWFzaXplX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCWxvZ19lcnJvcigiQm9vdGxvYWRlciBhcmVhIHNpemUgbWF5IG5vdCBiZSBuZWdhdGl2ZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHAtPnB2YS5wdm1ldGFkYXRhc2l6ZSA9IGFyZ191aW50NjRfdmFsdWUoY21kLCBtZXRhZGF0YXNpemVfQVJHLCBVSU5UNjRfQygwKSk7CisJaWYgKCFwcC0+cHZhLnB2bWV0YWRhdGFzaXplKQorCQlwcC0+cHZhLnB2bWV0YWRhdGFzaXplID0gZmluZF9jb25maWdfdHJlZV9pbnQoY21kLCBtZXRhZGF0YV9wdm1ldGFkYXRhc2l6ZV9DRkcsIE5VTEwpOworCisJcHAtPnB2YS5wdm1ldGFkYXRhY29waWVzID0gYXJnX2ludF92YWx1ZShjbWQsIHB2bWV0YWRhdGFjb3BpZXNfQVJHLCAtMSk7CisJaWYgKHBwLT5wdmEucHZtZXRhZGF0YWNvcGllcyA8IDApCisJCXBwLT5wdmEucHZtZXRhZGF0YWNvcGllcyA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgbWV0YWRhdGFfcHZtZXRhZGF0YWNvcGllc19DRkcsIE5VTEwpOworCisJaWYgKHBwLT5wdmEucHZtZXRhZGF0YWNvcGllcyA+IDIpIHsKKwkJbG9nX2Vycm9yKCJNZXRhZGF0YWNvcGllcyBtYXkgb25seSBiZSAwLCAxIG9yIDIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHAtPnB2YS5iYV9zaXplID0gYXJnX3VpbnQ2NF92YWx1ZShjbWQsIGJvb3Rsb2FkZXJhcmVhc2l6ZV9BUkcsIHBwLT5wdmEuYmFfc2l6ZSk7CisKKwlyZXR1cm4gMTsKK30KKworZW51bSB7CisJUFJPTVBUX1BWQ1JFQVRFX1BWX0lOX1ZHID0gMSwKKwlQUk9NUFRfUFZSRU1PVkVfUFZfSU5fVkcgPSAyLAorfTsKKworZW51bSB7CisJUFJPTVBUX0FOU1dFUl9OTyA9IDEsCisJUFJPTVBUX0FOU1dFUl9ZRVMgPSAyCit9OworCisvKgorICogV2hlbiBhIHByb21wdCBlbnRyeSBpcyBjcmVhdGVkLCBzYXZlIGFueSBzdHJpbmdzIG9yIGluZm8KKyAqIGluIHRoaXMgc3RydWN0IHRoYXQgYXJlIG5lZWRlZCBmb3IgdGhlIHByb21wdCBtZXNzYWdlcy4KKyAqIFRoZSBWRy9QViBzdHJ1Y3RzIGFyZSBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlIHByb21wdAorICogaXMgcnVuLgorICovCitzdHJ1Y3QgcHZjcmVhdGVfcHJvbXB0IHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXVpbnQzMl90IHR5cGU7CisJY29uc3QgY2hhciAqcHZfbmFtZTsKKwljb25zdCBjaGFyICp2Z19uYW1lOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgYW5zd2VyOworCXVuc2lnbmVkIGFib3J0X2NvbW1hbmQgOiAxOworCXVuc2lnbmVkIHZnX25hbWVfdW5rbm93biA6IDE7Cit9OworCitzdHJ1Y3QgcHZjcmVhdGVfZGV2aWNlIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNoYXIgcHZpZFtJRF9MRU4gKyAxXTsKKwljb25zdCBjaGFyICp2Z19uYW1lOworCWludCB3aXBlZDsKKwl1bnNpZ25lZCBpc19ub3RfcHYgOiAxOyAgICAgLyogZGV2aWNlIGlzIG5vdCBhIFBWICovCisJdW5zaWduZWQgaXNfb3JwaGFuX3B2IDogMTsgIC8qIGRldmljZSBpcyBhbiBvcnBoYW4gUFYgKi8KKwl1bnNpZ25lZCBpc192Z19wdiA6IDE7ICAgICAgLyogZGV2aWNlIGlzIGEgUFYgdXNlZCBpbiBhIFZHICovCisJdW5zaWduZWQgaXNfdXNlZF91bmtub3duX3B2IDogMTsgLyogZGV2aWNlIGlzIGEgUFYgdXNlZCBpbiBhbiB1bmtub3duIFZHICovCit9OworCisvKgorICogSWYgYSBQViBpcyBpbiBhIFZHLCBhbmQgcHZjcmVhdGUgb3IgcHZyZW1vdmUgaXMgcnVuIG9uIGl0OgorICoKKyAqIHB2Y3JlYXRlfHB2cmVtb3ZlIC1mICAgICAgOiBmYWlscworICogcHZjcmVhdGV8cHZyZW1vdmUgLXkgICAgICA6IGZhaWxzCisgKiBwdmNyZWF0ZXxwdnJlbW92ZSAtZiAteSAgIDogZmFpbHMKKyAqIHB2Y3JlYXRlfHB2cmVtb3ZlIC1mZiAgICAgOiBnZXQgeS9uIHByb21wdAorICogcHZjcmVhdGV8cHZyZW1vdmUgLWZmIC15ICA6IHN1Y2NlZWRzCisgKgorICogRklYTUU6IHRoZXJlIGFyZSBhIGxvdCBvZiB2YXJpb3VzIHBocmFzaW5ncyB1c2VkIGRlcGVuZGluZyBvbiB0aGUKKyAqIGNvbW1hbmQgYW5kIHNwZWNpZmljIGNhc2UuICBGaW5kIHNvbWUgc2ltaWxhciB3YXkgdG8gcGhyYXNlIHRoZXNlLgorICovCisKK3N0YXRpYyB2b2lkIF9jaGVja19wdmNyZWF0ZV9wcm9tcHQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHAsCisJCQkJICAgc3RydWN0IHB2Y3JlYXRlX3Byb21wdCAqcHJvbXB0LAorCQkJCSAgIGludCBhc2spCit7CisJY29uc3QgY2hhciAqdmduYW1lID0gcHJvbXB0LT52Z19uYW1lID8gcHJvbXB0LT52Z19uYW1lIDogIjx1bmtub3duPiI7CisJY29uc3QgY2hhciAqcHZuYW1lID0gcHJvbXB0LT5wdl9uYW1lOworCisJLyogVGhlIFZHIG5hbWUgY2FuIGJlIHVua25vd24gd2hlbiB0aGUgUFYgaXMgdXNlZCBidXQgbWV0YWRhdGEgaXMgbm90IGF2YWlsYWJsZSAqLworCisJaWYgKHByb21wdC0+dHlwZSA9PSBQUk9NUFRfUFZDUkVBVEVfUFZfSU5fVkcpIHsKKwkJaWYgKHBwLT5mb3JjZSAhPSBET05UX1BST01QVF9PVkVSUklERSkgeworCQkJcHJvbXB0LT5hbnN3ZXIgPSBQUk9NUFRfQU5TV0VSX05POworCisJCQlpZiAocHJvbXB0LT52Z19uYW1lX3Vua25vd24pIHsKKwkJCQlsb2dfZXJyb3IoIlBWICVzIGlzIHVzZWQgYnkgYSBWRyBidXQgaXRzIG1ldGFkYXRhIGlzIG1pc3NpbmcuIiwgcHZuYW1lKTsKKwkJCQlsb2dfZXJyb3IoIkNhbid0IGluaXRpYWxpemUgUFYgJyVzJyB3aXRob3V0IC1mZi4iLCBwdm5hbWUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmRfbmFtZShjbWQpLCAicHZjcmVhdGUiKSkgeworCQkJCWxvZ19lcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIG9mIHZvbHVtZSBncm91cCBcIiVzXCIgd2l0aG91dCAtZmYiLCBwdm5hbWUsIHZnbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZ19lcnJvcigiUGh5c2ljYWwgdm9sdW1lICclcycgaXMgYWxyZWFkeSBpbiB2b2x1bWUgZ3JvdXAgJyVzJyIsIHB2bmFtZSwgdmduYW1lKTsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBhZGQgcGh5c2ljYWwgdm9sdW1lICclcycgdG8gdm9sdW1lIGdyb3VwICclcyciLCBwdm5hbWUsIHZnbmFtZSk7CisJCQl9CisJCX0gZWxzZSBpZiAocHAtPnllcykgeworCQkJcHJvbXB0LT5hbnN3ZXIgPSBQUk9NUFRfQU5TV0VSX1lFUzsKKwkJfSBlbHNlIGlmIChhc2spIHsKKwkJCWlmICh5ZXNfbm9fcHJvbXB0KCJSZWFsbHkgSU5JVElBTElaRSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIG9mIHZvbHVtZSBncm91cCBcIiVzXCIgW3kvbl0/ICIsIHB2bmFtZSwgdmduYW1lKSA9PSAnbicpIHsKKwkJCQlwcm9tcHQtPmFuc3dlciA9IFBST01QVF9BTlNXRVJfTk87CisJCQkJbG9nX2Vycm9yKCIlczogcGh5c2ljYWwgdm9sdW1lIG5vdCBpbml0aWFsaXplZCIsIHB2bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXByb21wdC0+YW5zd2VyID0gUFJPTVBUX0FOU1dFUl9ZRVM7CisJCQkJbG9nX3dhcm4oIldBUk5JTkc6IEZvcmNpbmcgcGh5c2ljYWwgdm9sdW1lIGNyZWF0aW9uIG9uICVzIG9mIHZvbHVtZSBncm91cCBcIiVzXCIiLCBwdm5hbWUsIHZnbmFtZSk7CisJCQl9CisJCX0KKworCX0gZWxzZSBpZiAocHJvbXB0LT50eXBlID09IFBST01QVF9QVlJFTU9WRV9QVl9JTl9WRykgeworCQlpZiAocHAtPmZvcmNlICE9IERPTlRfUFJPTVBUX09WRVJSSURFKSB7CisJCQlwcm9tcHQtPmFuc3dlciA9IFBST01QVF9BTlNXRVJfTk87CisKKwkJCWlmIChwcm9tcHQtPnZnX25hbWVfdW5rbm93bikKKwkJCQlsb2dfZXJyb3IoIlBWICVzIGlzIHVzZWQgYnkgYSBWRyBidXQgaXRzIG1ldGFkYXRhIGlzIG1pc3NpbmcuIiwgcHZuYW1lKTsKKwkJCWVsc2UKKwkJCQlsb2dfZXJyb3IoIlBWICVzIGlzIHVzZWQgYnkgVkcgJXMgc28gcGxlYXNlIHVzZSB2Z3JlZHVjZSBmaXJzdC4iLCBwdm5hbWUsIHZnbmFtZSk7CisJCQlsb2dfZXJyb3IoIihJZiB5b3UgYXJlIGNlcnRhaW4geW91IG5lZWQgcHZyZW1vdmUsIHRoZW4gY29uZmlybSBieSB1c2luZyAtLWZvcmNlIHR3aWNlLikiKTsKKwkJfSBlbHNlIGlmIChwcC0+eWVzKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgaXMgdXNlZCBieSBWRyAlcyIsIHB2bmFtZSwgdmduYW1lKTsKKwkJCXByb21wdC0+YW5zd2VyID0gUFJPTVBUX0FOU1dFUl9ZRVM7CisJCX0gZWxzZSBpZiAoYXNrKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgaXMgdXNlZCBieSBWRyAlcyIsIHB2bmFtZSwgdmduYW1lKTsKKwkJCWlmICh5ZXNfbm9fcHJvbXB0KCJSZWFsbHkgV0lQRSBMQUJFTFMgZnJvbSBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIG9mIHZvbHVtZSBncm91cCBcIiVzXCIgW3kvbl0/ICIsIHB2bmFtZSwgdmduYW1lKSA9PSAnbicpIHsKKwkJCQlwcm9tcHQtPmFuc3dlciA9IFBST01QVF9BTlNXRVJfTk87CisJCQkJbG9nX2Vycm9yKCIlczogcGh5c2ljYWwgdm9sdW1lIGxhYmVsIG5vdCByZW1vdmVkIiwgcHZuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvbXB0LT5hbnN3ZXIgPSBQUk9NUFRfQU5TV0VSX1lFUzsKKwkJCX0KKwkJfQorCisJCWlmICgocHJvbXB0LT5hbnN3ZXIgPT0gUFJPTVBUX0FOU1dFUl9ZRVMpICYmIChwcC0+Zm9yY2UgPT0gRE9OVF9QUk9NUFRfT1ZFUlJJREUpKQorCQkJbG9nX3dhcm4oIldBUk5JTkc6IFdpcGluZyBwaHlzaWNhbCB2b2x1bWUgbGFiZWwgZnJvbSAlcyBvZiB2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgcHZuYW1lLCB2Z25hbWUpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwdmNyZWF0ZV9kZXZpY2UgKl9wdmNyZWF0ZV9saXN0X2ZpbmRfZGV2KHN0cnVjdCBkbV9saXN0ICpkZXZpY2VzLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB2Y3JlYXRlX2RldmljZSAqcGQ7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGQsIGRldmljZXMpIHsKKwkJaWYgKHBkLT5kZXYgPT0gZGV2KQorCQkJcmV0dXJuIHBkOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHB2Y3JlYXRlX2RldmljZSAqX3B2Y3JlYXRlX2xpc3RfZmluZF9uYW1lKHN0cnVjdCBkbV9saXN0ICpkZXZpY2VzLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwdmNyZWF0ZV9kZXZpY2UgKnBkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBkLCBkZXZpY2VzKSB7CisJCWlmICghc3RyY21wKHBkLT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBwZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZGVjaWRlcyB0aGF0IGEgYXJnX2RldmljZXMgZW50cnkgY2Fubm90IGJlIHVzZWQsIGJ1dCB0aGUKKyAqIGNvbW1hbmQgbWlnaHQgYmUgYWJsZSB0byBjb250aW51ZSB3aXRob3V0IGl0LCB0aGVuIGl0IG1vdmVzIHRoYXQgZW50cnkgZnJvbQorICogYXJnX2RldmljZXMgdG8gYXJnX2ZhaWwuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBkZWNpZGVzIHRoYXQgYW4gYXJnX2RldmljZXMgZW50cnkgY291bGQgYmUgdXNlZCAocG9zc2libHkKKyAqIHJlcXVpcmluZyBhIHByb21wdCksIHRoZW4gaXQgbW92ZXMgdGhlIGVudHJ5IGZyb20gYXJnX2RldmljZXMgdG8gYXJnX3Byb2Nlc3MuCisgKgorICogQW55IGFyZ19kZXZpY2VzIGVudHJpZXMgdGhhdCBhcmUgbm90IG1vdmVkIHRvIGFyZ19mYWlsIG9yIGFyZ19wcm9jZXNzIHdlcmUKKyAqIG5vdCBmb3VuZC4gIFRoZSBjYWxsZXIgd2lsbCBkZWNpZGUgaWYgdGhlIGNvbW1hbmQgY2FuIGNvbnRpbnVlIGlmIGFueQorICogYXJnX2RldmljZXMgZW50cmllcyB3ZXJlIG5vdCBmb3VuZCwgb3IgaWYgYW55IHdlcmUgbW92ZWQgdG8gYXJnX2ZhaWwuCisgKgorICogVGhpcyBjaGVjayBkb2VzIG5vdCBuZWVkIHRvIGxvb2sgYXQgUFZzIGluIGZvcmVpZ24sIHNoYXJlZCBvciBjbHVzdGVyZWQgVkdzLgorICogSWYgcHZjcmVhdGUvdmdjcmVhdGUvdmdleHRlbmQgc3BlY2lmaWVzIGEgZGV2aWNlIGluIGEKKyAqIGZvcmVpZ24vc2hhcmVkL2NsdXN0ZXJlZCBWRywgdGhhdCBWRyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmdW5jdGlvbiwKKyAqIGFuZCB0aGUgYXJnIHdpbGwgYmUgcmVwb3J0ZWQgYXMgbm90IGZvdW5kLgorICovCitzdGF0aWMgaW50IF9wdmNyZWF0ZV9jaGVja19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHAgPSAoc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IHB2Y3JlYXRlX2RldmljZSAqcGQ7CisJc3RydWN0IHB2Y3JlYXRlX3Byb21wdCAqcHJvbXB0OworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoIXB2LT5kZXYpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBDaGVjayBpZiBvbmUgb2YgdGhlIGNvbW1hbmQgYXJncyBpbiBhcmdfZGV2aWNlcworCSAqIG1hdGNoZXMgdGhpcyBkZXZpY2UuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBkLCAmcHAtPmFyZ19kZXZpY2VzKSB7CisJCWlmIChwZC0+ZGV2ICE9IHB2LT5kZXYpCisJCQljb250aW51ZTsKKworCQlpZiAocHYtPmRldi0+cHZpZFswXSkKKwkJCXN0cm5jcHkocGQtPnB2aWQsIHB2LT5kZXYtPnB2aWQsIElEX0xFTik7CisJCWZvdW5kID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdXVpZCBzcGVjaWZpZWQgZm9yIHRoZSBuZXcgUFYgaXMgdXNlZCBieSBhbm90aGVyIFBWLgorCSAqLworCWlmICghZm91bmQgJiYgcHYtPmRldiAmJiBwcC0+dXVpZF9zdHIgJiYgaWRfZXF1YWwoJnB2LT5pZCwgJnBwLT5wdmEuaWQpKSB7CisJCWxvZ19lcnJvcigiVVVJRCAlcyBhbHJlYWR5IGluIHVzZSBvbiBcIiVzXCIuIiwgcHAtPnV1aWRfc3RyLCBwdl9kZXZfbmFtZShwdikpOworCQlwcC0+Y2hlY2tfZmFpbGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIDE7CisKKwlsb2dfZGVidWcoIkNoZWNraW5nIHB2Y3JlYXRlIGFyZyAlcyB3aGljaCBoYXMgZXhpc3RpbmcgUFZJRDogJS4zMnMuIiwKKwkJICBwdl9kZXZfbmFtZShwdiksIHB2LT5kZXYtPnB2aWRbMF0gPyBwdi0+ZGV2LT5wdmlkIDogIjxub25lPiIpOworCisJLyoKKwkgKiBUaGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHRoZSBkZXZpY2UgYmVsb25ncyB0byBhbiBNRCBhcnJheS4KKwkgKi8KKwlpZiAoIWRldl90ZXN0X2V4Y2wocHYtPmRldikpIHsKKwkJLyogRklYTUUgRGV0ZWN0IHdoZXRoZXIgZGV2aWNlLW1hcHBlciBpdHNlbGYgaXMgc3RpbGwgdXNpbmcgaXQgKi8KKwkJbG9nX2Vycm9yKCJDYW4ndCBvcGVuICVzIGV4Y2x1c2l2ZWx5LiAgTW91bnRlZCBmaWxlc3lzdGVtPyIsCisJCQkgIHB2X2Rldl9uYW1lKHB2KSk7CisJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIERvbid0IGFsbG93IHVzaW5nIGEgZGV2aWNlIHdpdGggZHVwbGljYXRlcy4KKwkgKi8KKwlpZiAobHZtY2FjaGVfcHZpZF9pbl91bmNob3Nlbl9kdXBsaWNhdGVzKHBkLT5kZXYtPnB2aWQpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IHVzZSBkZXZpY2UgJXMgd2l0aCBkdXBsaWNhdGVzLiIsIHBkLT5uYW1lKTsKKwkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogV2hhdCBraW5kIG9mIGRldmljZSBpcyB0aGlzOiBhbiBvcnBoYW4gUFYsIGFuIHVuaW5pdGlhbGl6ZWQvdW51c2VkCisJICogZGV2aWNlLCBhIFBWIHVzZWQgaW4gYSBWRy4KKwkgKi8KKwlpZiAodmcgJiYgIWlzX29ycGhhbl92Zyh2Zy0+bmFtZSkpIHsKKwkJLyogRGV2aWNlIGlzIGEgUFYgdXNlZCBpbiBhIFZHLiAqLworCQlsb2dfZGVidWcoIkZvdW5kIHB2Y3JlYXRlIGFyZyAlczogcHYgaXMgdXNlZCBpbiAlcy4iLCBwZC0+bmFtZSwgdmctPm5hbWUpOworCQlwZC0+aXNfdmdfcHYgPSAxOworCQlwZC0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Zy0+bmFtZSk7CisJfSBlbHNlIGlmICh2ZyAmJiBpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCWlmIChpc191c2VkX3B2KHB2KSkgeworCQkJLyogRGV2aWNlIGlzIHVzZWQgaW4gYW4gdW5rbm93biBWRy4gKi8KKwkJCWxvZ19kZWJ1ZygiRm91bmQgcHZjcmVhdGUgYXJnICVzOiBQViBpcyB1c2VkIGluIHVua25vd24gVkcuIiwgcGQtPm5hbWUpOworCQkJcGQtPmlzX3VzZWRfdW5rbm93bl9wdiA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBEZXZpY2UgaXMgYW4gb3JwaGFuIFBWLiAqLworCQkJbG9nX2RlYnVnKCJGb3VuZCBwdmNyZWF0ZSBhcmcgJXM6IFBWIGlzIG9ycGhhbiBpbiAlcy4iLCBwZC0+bmFtZSwgdmctPm5hbWUpOworCQkJcGQtPmlzX29ycGhhbl9wdiA9IDE7CisJCX0KKworCQlpZiAoIXN0cmNtcCh2Zy0+bmFtZSwgRk1UX0xWTTFfT1JQSEFOX1ZHX05BTUUpKQorCQkJcHAtPm9ycGhhbl92Z19uYW1lID0gRk1UX0xWTTFfT1JQSEFOX1ZHX05BTUU7CisJCWVsc2UKKwkJCXBwLT5vcnBoYW5fdmdfbmFtZSA9IEZNVF9URVhUX09SUEhBTl9WR19OQU1FOworCX0gZWxzZSB7CisJCWxvZ19kZWJ1ZygiRm91bmQgcHZjcmVhdGUgYXJnICVzOiBkZXZpY2UgaXMgbm90IGEgUFYuIiwgcGQtPm5hbWUpOworCQkvKiBEZXZpY2UgaXMgbm90IGEgUFYuICovCisJCXBkLT5pc19ub3RfcHYgPSAxOworCX0KKworCS8qCisJICogcHZjcmVhdGUgaXMgYmVpbmcgcnVuIG9uIHRoaXMgZGV2aWNlLCBhbmQgaXQncyBub3QgYSBQViwKKwkgKiBvciBpcyBhbiBvcnBoYW4gUFYuICBOZWl0aGVyIGNhc2UgcmVxdWlyZXMgYSBwcm9tcHQuCisJICovCisJaWYgKHBkLT5pc19vcnBoYW5fcHYgfHwgcGQtPmlzX25vdF9wdikgeworCQlwZC0+ZGV2ID0gcHYtPmRldjsKKwkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX3Byb2Nlc3MsICZwZC0+bGlzdCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogcHZjcmVhdGUgaXMgYmVpbmcgcnVuIG9uIHRoaXMgZGV2aWNlLCBidXQgdGhlIGRldmljZSBpcyBhbHJlYWR5CisJICogYSBQViBpbiBhIFZHLiAgQSBwcm9tcHQgb3IgZm9yY2Ugb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBpdC4KKwkgKi8KKwlpZiAoIShwcm9tcHQgPSBkbV9wb29sX3phbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpwcm9tcHQpKSkpIHsKKwkJbG9nX2Vycm9yKCJwcm9tcHQgYWxsb2MgZmFpbGVkLiIpOworCQlwcC0+Y2hlY2tfZmFpbGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCXByb21wdC0+ZGV2ID0gcGQtPmRldjsKKwlwcm9tcHQtPnR5cGUgPSBQUk9NUFRfUFZDUkVBVEVfUFZfSU5fVkc7CisJcHJvbXB0LT5wdl9uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHBkLT5uYW1lKTsKKworCWlmIChwZC0+aXNfdXNlZF91bmtub3duX3B2KQorCQlwcm9tcHQtPnZnX25hbWVfdW5rbm93biA9IDE7CisJZWxzZQorCQlwcm9tcHQtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmctPm5hbWUpOworCWRtX2xpc3RfYWRkKCZwcC0+cHJvbXB0cywgJnByb21wdC0+bGlzdCk7CisKKwlwZC0+ZGV2ID0gcHYtPmRldjsKKwlkbV9saXN0X21vdmUoJnBwLT5hcmdfcHJvY2VzcywgJnBkLT5saXN0KTsKKworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyByZXBlYXRzIHRoZSBmaXJzdCBjaGVjayAtLSBkZXZpY2VzIHNob3VsZCBiZSBmb3VuZCwgYW5kIHNob3VsZCBub3QgaGF2ZQorICogY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgY2hlY2suICBJZiB0aGV5IHdlcmUgY2hhbmdlZC91c2VkIHdoaWxlIHRoZSBvcnBoYW5zCisgKiBsb2NrIHdhcyBub3QgaGVsZCAoZHVyaW5nIHByb21wdGluZyksIHRoZW4gdGhleSBjYW4ndCBiZSB1c2VkIGFueSBtb3JlIGFuZAorICogYXJlIG1vdmVkIHRvIGFyZ19mYWlsLiAgSWYgdGhleSBhcmUgbm90IGZvdW5kIGJ5IHRoaXMgbG9vcCwgdGhhdCBhbHNvCisgKiBkaXNxdWFsaWZpZXMgdGhlbSBmcm9tIGJlaW5nIHVzZWQuICBFYWNoIGFyZ19jb25maXJtIGVudHJ5IHRoYXQncyBmb3VuZCBhbmQKKyAqIGlzIG9rLCBpcyBtb3ZlZCB0byBhcmdfcHJvY2Vzcy4gIFRob3NlIG5vdCBmb3VuZCB3aWxsIHJlbWFpbiBpbiBhcmdfY29uZmlybS4KKyAqCisgKiBUaGlzIGNoZWNrIGRvZXMgbm90IG5lZWQgdG8gbG9vayBpbiBmb3JlaWduL3NoYXJlZC9jbHVzdGVyZWQgVkdzLiAgSWYgYQorICogZGV2aWNlIGZyb20gYXJnX2NvbmZpcm0gd2FzIHVzZWQgaW4gYSBmb3JlaWduL3NoYXJlZC9jbHVzdGVyZWQgVkcgZHVyaW5nIHRoZQorICogcHJvbXB0cywgdGhlbiBpdCB3aWxsIG5vdCBiZSBmb3VuZCBkdXJpbmcgdGhpcyBjaGVjay4KKyAqLworCitzdGF0aWMgaW50IF9wdl9jb25maXJtX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCA9IChzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlzdHJ1Y3QgcHZjcmVhdGVfZGV2aWNlICpwZDsKKwlpbnQgZm91bmQgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBkLCAmcHAtPmFyZ19jb25maXJtKSB7CisJCWlmIChwZC0+ZGV2ICE9IHB2LT5kZXYpCisJCQljb250aW51ZTsKKwkJZm91bmQgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMTsKKworCS8qIFJlcGVhdCB0aGUgc2FtZSBmcm9tIGNoZWNrX3NpbmdsZS4gKi8KKwlpZiAoIWRldl90ZXN0X2V4Y2wocHYtPmRldikpIHsKKwkJLyogRklYTUUgRGV0ZWN0IHdoZXRoZXIgZGV2aWNlLW1hcHBlciBpdHNlbGYgaXMgc3RpbGwgdXNpbmcgaXQgKi8KKwkJbG9nX2Vycm9yKCJDYW4ndCBvcGVuICVzIGV4Y2x1c2l2ZWx5LiAgTW91bnRlZCBmaWxlc3lzdGVtPyIsCisJCQkgIHB2X2Rldl9uYW1lKHB2KSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFdoYXQga2luZCBvZiBkZXZpY2UgaXMgdGhpczogYW4gb3JwaGFuIFBWLCBhbiB1bmluaXRpYWxpemVkL3VudXNlZAorCSAqIGRldmljZSwgYSBQViB1c2VkIGluIGEgVkcuCisJICovCisJaWYgKHZnICYmICFpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCS8qIERldmljZSBpcyBhIFBWIHVzZWQgaW4gYSBWRy4gKi8KKworCQlpZiAocGQtPmlzX29ycGhhbl9wdiB8fCBwZC0+aXNfbm90X3B2IHx8IHBkLT5pc191c2VkX3Vua25vd25fcHYpIHsKKwkJCS8qIEluIGNoZWNrX3NpbmdsZSBpdCB3YXMgYW4gb3JwaGFuIG9yIHVudXNlZC4gKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChwZC0+aXNfdmdfcHYgJiYgcGQtPnZnX25hbWUgJiYgc3RyY21wKHBkLT52Z19uYW1lLCB2Zy0+bmFtZSkpIHsKKwkJCS8qIEluIGNoZWNrX3NpbmdsZSBpdCB3YXMgaW4gYSBkaWZmZXJlbnQgVkcuICovCisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgaWYgKGlzX29ycGhhbihwdikpIHsKKwkJLyogRGV2aWNlIGlzIGFuIG9ycGhhbiBQVi4gKi8KKworCQlpZiAocGQtPmlzX25vdF9wdikgeworCQkJLyogSW4gY2hlY2tfc2luZ2xlIGl0IHdhcyBub3QgYSBQVi4gKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChwZC0+aXNfdmdfcHYpIHsKKwkJCS8qIEluIGNoZWNrX3NpbmdsZSBpdCB3YXMgaW4gYSBWRy4gKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChpc191c2VkX3B2KHB2KSAhPSBwZC0+aXNfdXNlZF91bmtub3duX3B2KSB7CisJCQkvKiBJbiBjaGVja19zaW5nbGUgaXQgd2FzIGRpZmZlcmVudC4gKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERldmljZSBpcyBub3QgYSBQVi4gKi8KKwkJaWYgKHBkLT5pc19vcnBoYW5fcHYgfHwgcGQtPmlzX3VzZWRfdW5rbm93bl9wdikgeworCQkJLyogSW4gY2hlY2tfc2luZ2xlIGl0IHdhcyBhbiBvcnBoYW4gUFYuICovCisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAocGQtPmlzX3ZnX3B2KSB7CisJCQkvKiBJbiBjaGVja19zaW5nbGUgaXQgd2FzIGluIGEgVkcuICovCisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBEZXZpY2UgaXMgdW5jaGFuZ2VkIGZyb20gY2hlY2tfc2luZ2xlLiAqLworCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19wcm9jZXNzLCAmcGQtPmxpc3QpOworCisJcmV0dXJuIDE7CisKK2ZhaWw6CisJbG9nX2Vycm9yKCJDYW5ub3QgdXNlIGRldmljZSAlczogaXQgY2hhbmdlZCBkdXJpbmcgcHJvbXB0LiIsIHBkLT5uYW1lKTsKKwlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wdnJlbW92ZV9jaGVja19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqcHAgPSAoc3RydWN0IHB2Y3JlYXRlX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IHB2Y3JlYXRlX2RldmljZSAqcGQ7CisJc3RydWN0IHB2Y3JlYXRlX3Byb21wdCAqcHJvbXB0OworCXN0cnVjdCBsYWJlbCAqbGFiZWw7CisJaW50IGZvdW5kID0gMDsKKworCWlmICghcHYtPmRldikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIENoZWNrIGlmIG9uZSBvZiB0aGUgY29tbWFuZCBhcmdzIGluIGFyZ19kZXZpY2VzCisJICogbWF0Y2hlcyB0aGlzIGRldmljZS4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGQsICZwcC0+YXJnX2RldmljZXMpIHsKKwkJaWYgKHBkLT5kZXYgIT0gcHYtPmRldikKKwkJCWNvbnRpbnVlOworCisJCWlmIChwdi0+ZGV2LT5wdmlkWzBdKQorCQkJc3RybmNweShwZC0+cHZpZCwgcHYtPmRldi0+cHZpZCwgSURfTEVOKTsKKwkJZm91bmQgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMTsKKworCWxvZ19kZWJ1ZygiQ2hlY2tpbmcgZGV2aWNlICVzIGZvciBwdnJlbW92ZSAlLjMycy4iLAorCQkgIHB2X2Rldl9uYW1lKHB2KSwgcHYtPmRldi0+cHZpZFswXSA/IHB2LT5kZXYtPnB2aWQgOiAiIik7CisKKwkvKgorCSAqIFRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgdGhlIGRldmljZSBiZWxvbmdzIHRvIGFuIE1EIGFycmF5LgorCSAqLworCWlmICghZGV2X3Rlc3RfZXhjbChwdi0+ZGV2KSkgeworCQkvKiBGSVhNRSBEZXRlY3Qgd2hldGhlciBkZXZpY2UtbWFwcGVyIGl0c2VsZiBpcyBzdGlsbCB1c2luZyBpdCAqLworCQlsb2dfZXJyb3IoIkNhbid0IG9wZW4gJXMgZXhjbHVzaXZlbHkuICBNb3VudGVkIGZpbGVzeXN0ZW0/IiwKKwkJCSAgcHZfZGV2X25hbWUocHYpKTsKKwkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogSXMgdGhlcmUgYSBwdiBoZXJlIGFscmVhZHk/CisJICogSWYgbm90LCB0aGlzIGlzIGFuIGVycm9yIHVubGVzcyB5b3UgdXNlZCAtZi4KKwkgKi8KKwlpZiAoIWxhYmVsX3JlYWQocGQtPmRldiwgJmxhYmVsLCAwKSkgeworCQlpZiAocHAtPmZvcmNlKSB7CisJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfcHJvY2VzcywgJnBkLT5saXN0KTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJbG9nX2Vycm9yKCJObyBQViBsYWJlbCBmb3VuZCBvbiAlcy4iLCBwZC0+bmFtZSk7CisJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyoKKwkgKiBXaGF0IGtpbmQgb2YgZGV2aWNlIGlzIHRoaXM6IGFuIG9ycGhhbiBQViwgYW4gdW5pbml0aWFsaXplZC91bnVzZWQKKwkgKiBkZXZpY2UsIGEgUFYgdXNlZCBpbiBhIFZHLgorCSAqLworCisJaWYgKHZnICYmICFpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCS8qIERldmljZSBpcyBhIFBWIHVzZWQgaW4gYSBWRy4gKi8KKwkJbG9nX2RlYnVnKCJGb3VuZCBwdnJlbW92ZSBhcmcgJXM6IHB2IGlzIHVzZWQgaW4gJXMuIiwgcGQtPm5hbWUsIHZnLT5uYW1lKTsKKwkJcGQtPmlzX3ZnX3B2ID0gMTsKKwkJcGQtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmctPm5hbWUpOworCisJfSBlbHNlIGlmICh2ZyAmJiBpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCWlmIChpc191c2VkX3B2KHB2KSkgeworCQkJLyogRGV2aWNlIGlzIHVzZWQgaW4gYW4gdW5rbm93biBWRy4gKi8KKwkJCWxvZ19kZWJ1ZygiRm91bmQgcHZyZW1vdmUgYXJnICVzOiBwdiBpcyB1c2VkIGluIHVua25vd24gVkcuIiwgcGQtPm5hbWUpOworCQkJcGQtPmlzX3VzZWRfdW5rbm93bl9wdiA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBEZXZpY2UgaXMgYW4gb3JwaGFuIFBWLiAqLworCQkJbG9nX2RlYnVnKCJGb3VuZCBwdnJlbW92ZSBhcmcgJXM6IHB2IGlzIG9ycGhhbiBpbiAlcy4iLCBwZC0+bmFtZSwgdmctPm5hbWUpOworCQkJcGQtPmlzX29ycGhhbl9wdiA9IDE7CisJCX0KKworCQlpZiAoIXN0cmNtcCh2Zy0+bmFtZSwgRk1UX0xWTTFfT1JQSEFOX1ZHX05BTUUpKQorCQkJcHAtPm9ycGhhbl92Z19uYW1lID0gRk1UX0xWTTFfT1JQSEFOX1ZHX05BTUU7CisJCWVsc2UKKwkJCXBwLT5vcnBoYW5fdmdfbmFtZSA9IEZNVF9URVhUX09SUEhBTl9WR19OQU1FOworCX0gZWxzZSB7CisJCWxvZ19kZWJ1ZygiRm91bmQgcHZyZW1vdmUgYXJnICVzOiBkZXZpY2UgaXMgbm90IGEgUFYuIiwgcGQtPm5hbWUpOworCQkvKiBEZXZpY2UgaXMgbm90IGEgUFYuICovCisJCXBkLT5pc19ub3RfcHYgPSAxOworCX0KKworCWlmIChwZC0+aXNfbm90X3B2KSB7CisJCXBkLT5kZXYgPSBwdi0+ZGV2OworCQlsb2dfZXJyb3IoIk5vIFBWIGZvdW5kIG9uIGRldmljZSAlcy4iLCBwZC0+bmFtZSk7CisJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIHB2cmVtb3ZlIGlzIGJlaW5nIHJ1biBvbiB0aGlzIGRldmljZSwgYW5kIGl0J3Mgbm90IGEgUFYsCisJICogb3IgaXMgYW4gb3JwaGFuIFBWLiAgTmVpdGhlciBjYXNlIHJlcXVpcmVzIGEgcHJvbXB0LgorCSAqLworCWlmIChwZC0+aXNfb3JwaGFuX3B2KSB7CisJCXBkLT5kZXYgPSBwdi0+ZGV2OworCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfcHJvY2VzcywgJnBkLT5saXN0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBwdnJlbW92ZSBpcyBiZWluZyBydW4gb24gdGhpcyBkZXZpY2UsIGJ1dCB0aGUgZGV2aWNlIGlzIGluIGEgVkcuCisJICogQSBwcm9tcHQgb3IgZm9yY2Ugb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBpdC4KKwkgKi8KKworCWlmICghKHByb21wdCA9IGRtX3Bvb2xfemFsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnByb21wdCkpKSkgeworCQlsb2dfZXJyb3IoInByb21wdCBhbGxvYyBmYWlsZWQuIik7CisJCXBwLT5jaGVja19mYWlsZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJcHJvbXB0LT5kZXYgPSBwZC0+ZGV2OworCXByb21wdC0+cHZfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCBwZC0+bmFtZSk7CisJaWYgKHBkLT5pc191c2VkX3Vua25vd25fcHYpCisJCXByb21wdC0+dmdfbmFtZV91bmtub3duID0gMTsKKwllbHNlCisJCXByb21wdC0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Zy0+bmFtZSk7CisJcHJvbXB0LT50eXBlID0gUFJPTVBUX1BWUkVNT1ZFX1BWX0lOX1ZHOworCWRtX2xpc3RfYWRkKCZwcC0+cHJvbXB0cywgJnByb21wdC0+bGlzdCk7CisKKwlwZC0+ZGV2ID0gcHYtPmRldjsKKwlkbV9saXN0X21vdmUoJnBwLT5hcmdfcHJvY2VzcywgJnBkLT5saXN0KTsKKworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBjYW4gYmUgdXNlZCBieSBwdmNyZWF0ZSwgdmdjcmVhdGUgYW5kIHZnZXh0ZW5kIHRvIGNyZWF0ZSBQVnMuICBUaGUKKyAqIGNhbGxlcnMgbmVlZCB0byBzZXQgdXAgdGhlIHB2Y3JlYXRlX2VhY2hfcGFyYW1zIHN0cnVjdHVyZSBiYXNlZCBvbiBjb21tYW5kCisgKiBsaW5lIGFyZ3MuICBUaGlzIGluY2x1ZGVzIHRoZSBwdl9uYW1lcyBmaWVsZCB3aGljaCBzcGVjaWZpZXMgdGhlIGRldmljZXMgdG8KKyAqIGNyZWF0ZSBQVnMgb24uCisgKgorICogVGhpcyB1c2VzIHByb2Nlc3NfZWFjaF9wdigpIGFuZCBzaG91bGQgYmUgY2FsbGVkIGZyb20gYSBoaWdoIGxldmVsIGluIHRoZQorICogY29tbWFuZCAtLSB0aGUgc2FtZSBsZXZlbCBhdCB3aGljaCBvdGhlciBpbnN0YW5jZXMgb2YgcHJvY2Vzc19lYWNoIGFyZQorICogY2FsbGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIChmYWlsZWQpIGlmIHRoZSBjYWxsZXIgcmVxdWlyZXMgYWxsIHNwZWNpZmllZAorICogZGV2aWNlcyB0byBiZSBjcmVhdGVkLCBhbmQgYW55IG9mIHRob3NlIGRldmljZXMgYXJlIG5vdCBmb3VuZCwgb3IgYW55IG9mCisgKiB0aGVtIGNhbm5vdCBiZSBjcmVhdGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIChzdWNjZXNzKSBpZiB0aGUgY2FsbGVyIHJlcXVpcmVzIGFsbCBzcGVjaWZpZWQKKyAqIGRldmljZXMgdG8gYmUgY3JlYXRlZCwgYW5kIGFsbCBhcmUgY3JlYXRlZCwgb3IgaWYgdGhlIGNhbGxlciBkb2VzIG5vdAorICogcmVxdWlyZSBhbGwgc3BlY2lmaWVkIGRldmljZXMgdG8gYmUgY3JlYXRlZCBhbmQgb25lIG9yIG1vcmUgd2VyZSBjcmVhdGVkLgorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgKHN1Y2Nlc3MpLCBpdCByZXR1cm5zIHRvIHRoZSBjYWxsZXIgd2l0aCB0aGUKKyAqIFZHX09SUEhBTlMgd3JpdGUgbG9jayBoZWxkLgorICovCisKK2ludCBwdmNyZWF0ZV9lYWNoX2RldmljZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCSBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCkKK3sKKwlzdHJ1Y3QgcHZjcmVhdGVfZGV2aWNlICpwZCwgKnBkMjsKKwlzdHJ1Y3QgcHZjcmVhdGVfcHJvbXB0ICpwcm9tcHQsICpwcm9tcHQyOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKm9ycGhhbl92ZzsKKwlzdHJ1Y3QgbHZtY2FjaGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZG1fbGlzdCByZW1vdmVfZHVwbGljYXRlczsKKwlzdHJ1Y3QgZG1fbGlzdCBhcmdfc29ydDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBwdl9saXN0ICp2Z3B2bDsKKwljb25zdCBjaGFyICpwdl9uYW1lOworCWludCBjb25zaXN0ZW50ID0gMDsKKwlpbnQgbXVzdF91c2VfYWxsID0gKGNtZC0+Y29tbWFuZC0+ZmxhZ3MgJiBNVVNUX1VTRV9BTExfQVJHUyk7CisJaW50IGZvdW5kOworCWludCBpOworCisJc2V0X3B2X25vdGlmeShjbWQpOworCisJZG1fbGlzdF9pbml0KCZyZW1vdmVfZHVwbGljYXRlcyk7CisJZG1fbGlzdF9pbml0KCZhcmdfc29ydCk7CisKKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSBwcDsKKworCS8qCisJICogQ3JlYXRlIGEgbGlzdCBlbnRyeSBmb3IgZWFjaCBuYW1lIGFyZy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHAtPnB2X2NvdW50OyBpKyspIHsKKwkJZG1fdW5lc2NhcGVfY29sb25zX2FuZF9hdF9zaWducyhwcC0+cHZfbmFtZXNbaV0sIE5VTEwsIE5VTEwpOworCisJCXB2X25hbWUgPSBwcC0+cHZfbmFtZXNbaV07CisKKwkJaWYgKCEocGQgPSBkbV9wb29sX3phbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpwZCkpKSkgeworCQkJbG9nX2Vycm9yKCJhbGxvYyBmYWlsZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghKHBkLT5uYW1lID0gZG1fcG9vbF9zdHJkdXAoY21kLT5tZW0sIHB2X25hbWUpKSkgeworCQkJbG9nX2Vycm9yKCJzdHJkdXAgZmFpbGVkLiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkbV9saXN0X2FkZCgmcHAtPmFyZ19kZXZpY2VzLCAmcGQtPmxpc3QpOworCX0KKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBob2xkcyB0aGUgb3JwaGFucyBsb2NrIHdoaWxlIHJlYWRpbmcgVkdzIHRvIGxvb2sgZm9yCisJICogZGV2aWNlcy4gIFRoaXMgbWVhbnMgdGhlIG9ycGhhbnMgbG9jayBpcyBoZWxkIHdoaWxlIFZHIGxvY2tzIGFyZQorCSAqIGFjcXVpcmVkLCB3aGljaCBpcyBhZ2FpbnN0IGx2bWNhY2hlIGxvY2sgb3JkZXJpbmcgcnVsZXMsIHNvIGRpc2FibGUKKwkgKiB0aGUgbHZtY2FjaGUgbG9jayBvcmRlcmluZyBjaGVja3MuCisJICovCisJbHZtY2FjaGVfbG9ja19vcmRlcmluZygwKTsKKworCS8qCisJICogQ2xlYXIgdGhlIGNhY2hlIGJlZm9yZSBhY3F1aXJpbmcgdGhlIG9ycGhhbiBsb2NrLiAgKENsZWFyaW5nIHRoZQorCSAqIGNhY2hlIHdpdGggbG9ja3MgaGVsZCBpcyBhbiBlcnJvci4pICBXZSB3YW50IHRoZSBvcnBoYW4gbG9jaworCSAqIGFjcXVpcmVkIGJlZm9yZSBwcm9jZXNzX2VhY2hfcHYuICBJZiB0aGUgb3JwaGFuIGxvY2sgaXMgbm90IGhlbGQKKwkgKiB3aGVuIHByb2Nlc3NfZWFjaF9wdiBpcyBjYWxsZWQsIHRoZW4gcHJvY2Vzc19lYWNoX3B2IGNsZWFycyB0aGUKKwkgKiBjYWNoZS4KKwkgKi8KKwlsdm1jYWNoZV9kZXN0cm95KGNtZCwgMSwgMCk7CisKKwkvKgorCSAqIElmIG5vIHByb21wdHMgcmVxdWlyZSBhIHVzZXIgcmVzcG9uc2UsIHRoaXMgb3JwaGFuIGxvY2sgaXMgaGVsZAorCSAqIHRocm91Z2hvdXQsIGFuZCBwdmNyZWF0ZV9lYWNoX2RldmljZSgpIHJldHVybnMgd2l0aCBpdCBoZWxkIHNvIHRoYXQKKwkgKiB2Z2NyZWF0ZS92Z2V4dGVuZCB1c2UgdGhlIFBWcyBjcmVhdGVkIGhlcmUgdG8gYWRkIHRvIGEgVkcuCisJICovCisJaWYgKCFsb2NrX3ZvbChjbWQsIFZHX09SUEhBTlMsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3Igb3JwaGFuIFBWcy4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X2NhY2hlX2Z1bGxfc2NhbihjbWQtPmZ1bGxfZmlsdGVyKTsKKworCS8qCisJICogVHJhbnNsYXRlIGFyZyBuYW1lcyBpbnRvIHN0cnVjdCBkZXZpY2Uncy4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGQsICZwcC0+YXJnX2RldmljZXMpCisJCXBkLT5kZXYgPSBkZXZfY2FjaGVfZ2V0KHBkLT5uYW1lLCBjbWQtPmZ1bGxfZmlsdGVyKTsKKworCS8qCisJICogVXNlIHByb2Nlc3NfZWFjaF9wdiB0byBzZWFyY2ggYWxsIGV4aXN0aW5nIFBWcyBhbmQgZGV2aWNlcy4KKwkgKgorCSAqIFRoaXMgaXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5IHRvIHVzZSBwcm9jZXNzX2VhY2hfcHYsIGJlY2F1c2UgdGhlCisJICogY29tbWFuZCBhcmdzIChhcmdfZGV2aWNlcykgYXJlIG5vdCBiZWluZyBwcm9jZXNzZWQgZGlyZWN0bHkgYnkKKwkgKiBwcm9jZXNzX2VhY2hfcHYgKGFyZ2MgYW5kIGFyZ3YgYXJlIG5vdCBwYXNzZWQpLiAgSW5zdGVhZCwKKwkgKiBwcm9jZXNzX2VhY2hfcHYgaXMgcHJvY2Vzc2luZyBhbGwgZXhpc3RpbmcgUFZzIGFuZCBkZXZpY2VzLCBhbmQgdGhlCisJICogc2luZ2xlIGZ1bmN0aW9uIGlzIG1hdGNoaW5nIGVhY2ggb2YgdGhvc2UgYWdhaW5zdCB0aGUgY29tbWFuZCBhcmdzCisJICogKGFyZ19kZXZpY2VzKS4KKwkgKgorCSAqIElmIGFuIGFyZ19kZXZpY2VzIGVudHJ5IGlzIGZvdW5kIGR1cmluZyBwcm9jZXNzX2VhY2hfcHYsIGl0J3MgbW92ZWQKKwkgKiB0byBhcmdfcHJvY2VzcyBpZiBpdCBjYW4gYmUgdXNlZCwgb3IgYXJnX2ZhaWwgaWYgaXQgY2Fubm90IGJlIHVzZWQuCisJICogSWYgaXQncyBhZGRlZCB0byBhcmdfcHJvY2VzcyBidXQgbmVlZHMgYSBwcm9tcHQgb3IgZm9yY2Ugb3B0aW9uLCB0aGVuCisJICogYSBjb3JyZXNwb25kaW5nIHByb21wdCBlbnRyeSBpcyBhZGRlZCB0byBwcC0+cHJvbXB0cy4KKwkgKi8KKwlwcm9jZXNzX2VhY2hfcHYoY21kLCAwLCBOVUxMLCBOVUxMLCAxLCAwLCBoYW5kbGUsCisJCQlwcC0+aXNfcmVtb3ZlID8gX3B2cmVtb3ZlX2NoZWNrX3NpbmdsZSA6IF9wdmNyZWF0ZV9jaGVja19zaW5nbGUpOworCisJLyoKKwkgKiBBIGZhdGFsIGVycm9yIHdhcyBmb3VuZCB3aGlsZSBjaGVja2luZy4KKwkgKi8KKwlpZiAocHAtPmNoZWNrX2ZhaWxlZCkKKwkJZ290b19iYWQ7CisKKwkvKgorCSAqIFNwZWNpYWwgY2FzZTogcHZyZW1vdmUgLWZmIGlzIGFsbG93ZWQgdG8gY2xlYXIgYSBkdXBsaWNhdGUgZGV2aWNlIGluCisJICogdGhlIHVuY2hvc2VuIGR1cGxpY2F0ZXMgbGlzdC4gIFBWcyBpbiB0aGUgdW5jaG9zZW4gZHVwbGljYXRlcyBsaXN0CisJICogd29uJ3QgYmUgZm91bmQgYnkgbm9ybWFsIHByb2Nlc3NfZWFjaCBzZWFyY2hlcyAtLSB0aGV5IGFyZSBub3QgaW4KKwkgKiBsdm1jYWNoZSBhbmQgY2FuJ3QgYmUgcHJvY2Vzc2VkIG5vcm1hbGx5LiAgV2Ugc2F2ZSB0aGVtIGhlcmUgYW5kCisJICogZXJhc2UgdGhlbSBiZWxvdyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIG5vcm1hbCBwcm9jZXNzaW5nIGNvZGUuCisJICovCisJaWYgKHBwLT5pc19yZW1vdmUgJiYgKHBwLT5mb3JjZSA9PSBET05UX1BST01QVF9PVkVSUklERSkgJiYKKwkgICAhZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19kZXZpY2VzKSAmJiBsdm1jYWNoZV9mb3VuZF9kdXBsaWNhdGVfcHZzKCkpIHsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUocGQsIHBkMiwgJnBwLT5hcmdfZGV2aWNlcykgeworCQkJaWYgKGx2bWNhY2hlX2Rldl9pc191bmNob3Nlbl9kdXBsaWNhdGUocGQtPmRldikpIHsKKwkJCQlsb2dfZGVidWcoIkZvdW5kIHB2cmVtb3ZlIGFyZyAlczogZGV2aWNlIGlzIGEgZHVwbGljYXRlLiIsIHBkLT5uYW1lKTsKKwkJCQlkbV9saXN0X21vdmUoJnJlbW92ZV9kdXBsaWNhdGVzLCAmcGQtPmxpc3QpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBhbGwgYXJnX2RldmljZXMgd2VyZSBmb3VuZCBieSBwcm9jZXNzX2VhY2hfcHYuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHBkLCAmcHAtPmFyZ19kZXZpY2VzKQorCQlsb2dfZXJyb3IoIkRldmljZSAlcyBub3QgZm91bmQgKG9yIGlnbm9yZWQgYnkgZmlsdGVyaW5nKS4iLCBwZC0+bmFtZSk7CisKKwkvKgorCSAqIENhbiB0aGUgY29tbWFuZCBjb250aW51ZSBpZiBzb21lIHNwZWNpZmllZCBkZXZpY2VzIHdlcmUgbm90IGZvdW5kPworCSAqLworCWlmICghZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19kZXZpY2VzKSAmJiBtdXN0X3VzZV9hbGwpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBDYW4gdGhlIGNvbW1hbmQgY29udGludWUgaWYgc29tZSBzcGVjaWZpZWQgZGV2aWNlcyBjYW5ub3QgYmUgdXNlZD8KKwkgKi8KKwlpZiAoIWRtX2xpc3RfZW1wdHkoJnBwLT5hcmdfZmFpbCkgJiYgbXVzdF91c2VfYWxsKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogVGhlIGNvbW1hbmQgY2Fubm90IGNvbnRpbnVlIGlmIHRoZXJlIGFyZSBubyBkZXZpY2VzIHRvIHByb2Nlc3MuCisJICovCisJaWYgKGRtX2xpc3RfZW1wdHkoJnBwLT5hcmdfcHJvY2VzcykgJiYgZG1fbGlzdF9lbXB0eSgmcmVtb3ZlX2R1cGxpY2F0ZXMpKSB7CisJCWxvZ19kZWJ1ZygiTm8gZGV2aWNlcyB0byBwcm9jZXNzLiIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIENsZWFyIGFueSBwcm9tcHRzIHRoYXQgaGF2ZSBhbnN3ZXJzIHdpdGhvdXQgYXNraW5nIHRoZSB1c2VyLiAKKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwcm9tcHQsIHByb21wdDIsICZwcC0+cHJvbXB0cykgeworCQlfY2hlY2tfcHZjcmVhdGVfcHJvbXB0KGNtZCwgcHAsIHByb21wdCwgMCk7CisKKwkJc3dpdGNoIChwcm9tcHQtPmFuc3dlcikgeworCQljYXNlIFBST01QVF9BTlNXRVJfWUVTOgorCQkJLyogVGhlIFBWIGNhbiBiZSB1c2VkLCBsZWF2ZSBpdCBvbiBhcmdfcHJvY2Vzcy4gKi8KKwkJCWRtX2xpc3RfZGVsKCZwcm9tcHQtPmxpc3QpOworCQkJYnJlYWs7CisJCWNhc2UgUFJPTVBUX0FOU1dFUl9OTzoKKwkJCS8qIFRoZSBQViBjYW5ub3QgYmUgdXNlZCwgcmVtb3ZlIGl0IGZyb20gYXJnX3Byb2Nlc3MuICovCisJCQlpZiAoKHBkID0gX3B2Y3JlYXRlX2xpc3RfZmluZF9kZXYoJnBwLT5hcmdfcHJvY2VzcywgcHJvbXB0LT5kZXYpKSkKKwkJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCWRtX2xpc3RfZGVsKCZwcm9tcHQtPmxpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWRtX2xpc3RfZW1wdHkoJnBwLT5hcmdfZmFpbCkgJiYgbXVzdF91c2VfYWxsKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogSWYgbm8gcmVtYWluaW5nIHByb21wdHMgbmVlZCBhIHVzZXIgcmVzcG9uc2UsIHRoZW4ga2VlcCBvcnBoYW5zCisJICogbG9ja2VkIGFuZCBnbyBkaXJlY3RseSB0byB0aGUgY3JlYXRlIHN0ZXBzLiAKKwkgKi8KKwlpZiAoZG1fbGlzdF9lbXB0eSgmcHAtPnByb21wdHMpKQorCQlnb3RvIGRvX2NvbW1hbmQ7CisKKwkvKgorCSAqIFByb21wdHMgcmVxdWlyZSBhc2tpbmcgdGhlIHVzZXIsIHNvIHJlbGVhc2UgdGhlIG9ycGhhbnMgbG9jaywgYXNrCisJICogdGhlIHF1ZXN0aW9ucywgcmVhY3F1aXJlIHRoZSBvcnBoYW5zIGxvY2ssIHZlcmlmeSB0aGF0IHRoZSBQVnMgd2VyZQorCSAqIG5vdCB1c2VkIGR1cmluZyB0aGUgcXVlc3Rpb25zLCB0aGVuIGRvIHRoZSBjcmVhdGUgc3RlcHMuCisJICovCisJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgVkdfT1JQSEFOUyk7CisKKwkvKgorCSAqIFByb2Nlc3MgcHJvbXB0cyB0aGF0IHJlcXVpcmUgYXNraW5nIHRoZSB1c2VyLiAgVGhlIG9ycGhhbnMgbG9jayBpcworCSAqIG5vdCBoZWxkLCBzbyB0aGVyZSdzIG5vIGhhcm0gaW4gd2FpdGluZyBmb3IgYSB1c2VyIHRvIHJlc3BvbmQuCisJICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zX3NhZmUocHJvbXB0LCBwcm9tcHQyLCAmcHAtPnByb21wdHMpIHsKKwkJX2NoZWNrX3B2Y3JlYXRlX3Byb21wdChjbWQsIHBwLCBwcm9tcHQsIDEpOworCisJCXN3aXRjaCAocHJvbXB0LT5hbnN3ZXIpIHsKKwkJY2FzZSBQUk9NUFRfQU5TV0VSX1lFUzoKKwkJCS8qIFRoZSBQViBjYW4gYmUgdXNlZCwgbGVhdmUgaXQgb24gYXJnX3Byb2Nlc3MuICovCisJCQlkbV9saXN0X2RlbCgmcHJvbXB0LT5saXN0KTsKKwkJCWJyZWFrOworCQljYXNlIFBST01QVF9BTlNXRVJfTk86CisJCQkvKiBUaGUgUFYgY2Fubm90IGJlIHVzZWQsIHJlbW92ZSBpdCBmcm9tIGFyZ19wcm9jZXNzLiAqLworCQkJaWYgKChwZCA9IF9wdmNyZWF0ZV9saXN0X2ZpbmRfZGV2KCZwcC0+YXJnX3Byb2Nlc3MsIHByb21wdC0+ZGV2KSkpCisJCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCQlkbV9saXN0X2RlbCgmcHJvbXB0LT5saXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFkbV9saXN0X2VtcHR5KCZwcC0+YXJnX2ZhaWwpICYmIG11c3RfdXNlX2FsbCkKKwkJCWdvdG9fb3V0OworCisJCWlmIChzaWdpbnRfY2F1Z2h0KCkpCisJCQlnb3RvX291dDsKKworCQlpZiAocHJvbXB0LT5hYm9ydF9jb21tYW5kKQorCQkJZ290b19vdXQ7CisJfQorCisJLyoKKwkgKiBDbGVhciB0aGUgY2FjaGUsIHJlYWNxdWlyZSB0aGUgb3JwaGFucyB3cml0ZSBsb2NrLCB0aGVuIGNoZWNrIGFnYWluCisJICogdGhhdCB0aGUgZGV2aWNlcyBjYW4gc3RpbGwgYmUgdXNlZC4gIElmIHRoZSBzZWNvbmQgbG9vcCBmaW5kcyB0aGVtCisJICogY2hhbmdlZCwgb3IgY2FuJ3QgZmluZCB0aGVtIGFueSBtb3JlLCB0aGVuIHRoZXkgYXJlbid0IHVzZWQuCisJICogQ2xlYXIgdGhlIGNhY2hlIGhlcmUgYmVmb3JlIGxvY2tpbmcgb3JwaGFucywgc2luY2UgaXQgd29uJ3QgYmUKKwkgKiBkb25lIGJ5IHByb2Nlc3NfZWFjaF9wdiB3aXRoIG9ycGhhbnMgYWxyZWFkeSBsb2NrZWQuCisJICovCisJbHZtY2FjaGVfZGVzdHJveShjbWQsIDEsIDApOworCisJaWYgKCFsb2NrX3ZvbChjbWQsIFZHX09SUEhBTlMsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3Igb3JwaGFuIFBWcy4iKTsKKwkJZ290b19vdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgZGV2aWNlIGFyZ3MgYmVnYW4gb24gdGhlIGFyZ19kZXZpY2VzIGxpc3QsIHRoZW4gdGhlIGZpcnN0IGNoZWNrCisJICogbG9vcCBtb3ZlZCB0aG9zZSBlbnRyaWVzIHRvIGFyZ19wcm9jZXNzIGFzIHRoZXkgd2VyZSBmb3VuZC4gIERldmljZXMKKwkgKiBub3QgZm91bmQgZHVyaW5nIHRoZSBmaXJzdCBsb29wIGFyZSBub3QgYmVpbmcgdXNlZCwgYW5kIHJlbWFpbiBvbgorCSAqIGFyZ19kZXZpY2VzLgorCSAqIAorCSAqIE5vdywgdGhlIGFyZ19wcm9jZXNzIGVudHJpZXMgYXJlIG1vdmVkIHRvIGFyZ19jb25maXJtLCBhbmQgdGhlIHNlY29uZAorCSAqIGNoZWNrIGxvb3AgbW92ZXMgdGhlbSBiYWNrIHRvIGFyZ19wcm9jZXNzIGFzIHRoZXkgYXJlIGZvdW5kIGFuZCBhcmUKKwkgKiB1bmNoYW5nZWQuICBMaWtlIHRoZSBmaXJzdCBsb29wLCB0aGUgc2Vjb25kIGxvb3AgbW92ZXMgYW4gZW50cnkgdG8KKwkgKiBhcmdfZmFpbCBpZiBpdCBjYW5ub3QgYmUgdXNlZC4gIEFmdGVyIHRoZSBzZWNvbmQgbG9vcCwgYW55IGRldmljZXMKKwkgKiByZW1haW5pbmcgb24gYXJnX2NvbmZpcm0gd2VyZSBub3QgZm91bmQgYW5kIGFyZSBub3QgdXNlZC4KKwkgKi8KKwlkbV9saXN0X3NwbGljZSgmcHAtPmFyZ19jb25maXJtLCAmcHAtPmFyZ19wcm9jZXNzKTsKKworCXByb2Nlc3NfZWFjaF9wdihjbWQsIDAsIE5VTEwsIE5VTEwsIDEsIDAsIGhhbmRsZSwgX3B2X2NvbmZpcm1fc2luZ2xlKTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwZCwgJnBwLT5hcmdfY29uZmlybSkKKwkJbG9nX2Vycm9yKCJEZXZpY2UgJXMgbm90IGZvdW5kIChvciBpZ25vcmVkIGJ5IGZpbHRlcmluZykuIiwgcGQtPm5hbWUpOworCisJLyogU29tZSBkZXZpY2VzIHdlcmUgbm90IGZvdW5kIGR1cmluZyB0aGUgc2Vjb25kIGNoZWNrLiAqLworCWlmICghZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19jb25maXJtKSAmJiBtdXN0X3VzZV9hbGwpCisJCWdvdG9fYmFkOworCisJLyogU29tZSBkZXZpY2VzIGNoYW5nZWQgZHVyaW5nIHRoZSBzZWNvbmQgY2hlY2suICovCisJaWYgKCFkbV9saXN0X2VtcHR5KCZwcC0+YXJnX2ZhaWwpICYmIG11c3RfdXNlX2FsbCkKKwkJZ290b19iYWQ7CisKKwlpZiAoZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19wcm9jZXNzKSkgeworCQlsb2dfZGVidWcoIk5vIGRldmljZXMgdG8gcHJvY2Vzcy4iKTsKKwkJZ290b19iYWQ7CisJfQorCitkb19jb21tYW5kOgorCisJLyoKKwkgKiBSZW9yZGVyIGFyZ19wcm9jZXNzIGVudHJpZXMgdG8gbWF0Y2ggdGhlIG9yaWdpbmFsIG9yZGVyIG9mIGFyZ3MuCisJICovCisJZG1fbGlzdF9zcGxpY2UoJmFyZ19zb3J0LCAmcHAtPmFyZ19wcm9jZXNzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHAtPnB2X2NvdW50OyBpKyspIHsKKwkJaWYgKChwZCA9IF9wdmNyZWF0ZV9saXN0X2ZpbmRfbmFtZSgmYXJnX3NvcnQsIHBwLT5wdl9uYW1lc1tpXSkpKQorCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX3Byb2Nlc3MsICZwZC0+bGlzdCk7CisJfQorCisJaWYgKHBwLT5pc19yZW1vdmUpCisJCWRtX2xpc3Rfc3BsaWNlKCZwcC0+YXJnX3JlbW92ZSwgJnBwLT5hcmdfcHJvY2Vzcyk7CisJZWxzZQorCQlkbV9saXN0X3NwbGljZSgmcHAtPmFyZ19jcmVhdGUsICZwcC0+YXJnX3Byb2Nlc3MpOworCisJLyoKKwkgKiBXaXBlIHNpZ25hdHVyZXMgb24gZGV2aWNlcyBiZWluZyBjcmVhdGVkLgorCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHBkLCBwZDIsICZwcC0+YXJnX2NyZWF0ZSkgeworCQlsb2dfdmVyYm9zZSgiV2lwaW5nIHNpZ25hdHVyZXMgb24gbmV3IFBWICVzLiIsIHBkLT5uYW1lKTsKKworCQlpZiAoIXdpcGVfa25vd25fc2lnbmF0dXJlcyhjbWQsIHBkLT5kZXYsIHBkLT5uYW1lLCBUWVBFX0xWTTFfTUVNQkVSIHwgVFlQRV9MVk0yX01FTUJFUiwKKwkJCQkJICAgIDAsIHBwLT55ZXMsIHBwLT5mb3JjZSwgJnBkLT53aXBlZCkpIHsKKwkJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQl9CisKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkKKwkJCWdvdG9fYmFkOworCX0KKworCWlmICghZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19mYWlsKSAmJiBtdXN0X3VzZV9hbGwpCisJCWdvdG9fYmFkOworCisJLyoKKwkgKiBGaW5kIGV4aXN0aW5nIG9ycGhhbiBQVnMgdGhhdCB2Z2NyZWF0ZSBvciB2Z2V4dGVuZCB3YW50IHRvIHVzZS4KKwkgKiAicHJlc2VydmVfZXhpc3RpbmciIG1lYW5zIHRoYXQgdGhlIGNvbW1hbmQgd2FudHMgdG8gdXNlIGV4aXN0aW5nIFBWcworCSAqIGFuZCBub3QgcmVjcmVhdGUgYSBuZXcgUFYgb24gdG9wIG9mIGFuIGV4aXN0aW5nIFBWLgorCSAqLworCWlmIChwcC0+cHJlc2VydmVfZXhpc3RpbmcgJiYgcHAtPm9ycGhhbl92Z19uYW1lKSB7CisJCWxvZ19kZWJ1ZygiVXNpbmcgZXhpc3Rpbmcgb3JwaGFuIFBWcyBpbiAlcy4iLCBwcC0+b3JwaGFuX3ZnX25hbWUpOworCisJCWlmICghKG9ycGhhbl92ZyA9IHZnX3JlYWRfaW50ZXJuYWwoY21kLCBwcC0+b3JwaGFuX3ZnX25hbWUsIE5VTEwsIDAsICZjb25zaXN0ZW50KSkpIHsKKwkJCWxvZ19lcnJvcigiQ2Fubm90IHJlYWQgb3JwaGFucyBWRyAlcy4iLCBwcC0+b3JwaGFuX3ZnX25hbWUpOworCQkJZ290b19iYWQ7CisJCX0KKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwZCwgcGQyLCAmcHAtPmFyZ19jcmVhdGUpIHsKKwkJCWlmICghcGQtPmlzX29ycGhhbl9wdikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEocHZsID0gZG1fcG9vbF9hbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCpwdmwpKSkpIHsKKwkJCQlsb2dfZXJyb3IoImFsbG9jIHB2bCBmYWlsZWQuIik7CisJCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWZvdW5kID0gMDsKKwkJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh2Z3B2bCwgJm9ycGhhbl92Zy0+cHZzKSB7CisJCQkJaWYgKHZncHZsLT5wdi0+ZGV2ID09IHBkLT5kZXYpIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmb3VuZCkgeworCQkJCWxvZ19kZWJ1ZygiVXNpbmcgZXhpc3Rpbmcgb3JwaGFuIFBWICVzLiIsIHB2X2Rldl9uYW1lKHZncHZsLT5wdikpOworCQkJCXB2bC0+cHYgPSB2Z3B2bC0+cHY7CisJCQkJZG1fbGlzdF9hZGQoJnBwLT5wdnMsICZwdmwtPmxpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIFBWICVzIiwgcGQtPm5hbWUpOworCQkJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgUFZzIG9uIGRldmljZXMuICBFaXRoZXIgY3JlYXRlIGEgbmV3IFBWIG9uIHRvcCBvZiBhbiBleGlzdGluZworCSAqIG9uZSAoZS5nLiBmb3IgcHZjcmVhdGUpLCBvciBjcmVhdGUgYSBuZXcgUFYgb24gYSBkZXZpY2UgdGhhdCBpcyBub3QKKwkgKiBhIFBWLgorCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtc19zYWZlKHBkLCBwZDIsICZwcC0+YXJnX2NyZWF0ZSkgeworCQkvKiBVc2luZyBleGlzdGluZyBvcnBoYW4gUFZzIGlzIGNvdmVyZWQgYWJvdmUuICovCisJCWlmIChwcC0+cHJlc2VydmVfZXhpc3RpbmcgJiYgcGQtPmlzX29ycGhhbl9wdikKKwkJCWNvbnRpbnVlOworCisJCWlmICghZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19mYWlsKSAmJiBtdXN0X3VzZV9hbGwpCisJCQlicmVhazsKKworCQlpZiAoIShwdmwgPSBkbV9wb29sX2FsbG9jKGNtZC0+bWVtLCBzaXplb2YoKnB2bCkpKSkgeworCQkJbG9nX2Vycm9yKCJhbGxvYyBwdmwgZmFpbGVkLiIpOworCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXB2X25hbWUgPSBwZC0+bmFtZTsKKworCQlsb2dfZGVidWcoIkNyZWF0aW5nIGEgbmV3IFBWIG9uICVzLiIsIHB2X25hbWUpOworCisJCWlmICghKHB2ID0gcHZfY3JlYXRlKGNtZCwgcGQtPmRldiwgJnBwLT5wdmEpKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc2V0dXAgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIi4iLCBwdl9uYW1lKTsKKwkJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQkJY29udGludWU7CisJCX0KKworCQlsb2dfdmVyYm9zZSgiU2V0IHVwIHBoeXNpY2FsIHZvbHVtZSBmb3IgXCIlc1wiIHdpdGggJSIgUFJJdTY0CisJCQkgICAgIiBhdmFpbGFibGUgc2VjdG9ycy4iLCBwdl9uYW1lLCBwdl9zaXplKHB2KSk7CisKKwkJaWYgKCFsYWJlbF9yZW1vdmUocHYtPmRldikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwgb24gJXMuIiwgcHZfbmFtZSk7CisJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBwLT56ZXJvKSB7CisJCQlsb2dfdmVyYm9zZSgiWmVyb2luZyBzdGFydCBvZiBkZXZpY2UgJXMuIiwgcHZfbmFtZSk7CisKKwkJCWlmICghZGV2X29wZW5fcXVpZXQocHYtPmRldikpIHsKKwkJCQlsb2dfZXJyb3IoIiVzIG5vdCBvcGVuZWQ6IGRldmljZSBub3QgemVyb2VkLiIsIHB2X25hbWUpOworCQkJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIWRldl9zZXQocHYtPmRldiwgVUlOVDY0X0MoMCksIChzaXplX3QpIDIwNDgsIDApKSB7CisJCQkJbG9nX2Vycm9yKCIlcyBub3Qgd2lwZWQ6IGFib3J0aW5nLiIsIHB2X25hbWUpOworCQkJCWlmICghZGV2X2Nsb3NlKHB2LT5kZXYpKQorCQkJCQlzdGFjazsKKwkJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghZGV2X2Nsb3NlKHB2LT5kZXYpKQorCQkJCXN0YWNrOworCQl9CisKKwkJbG9nX3ZlcmJvc2UoIldyaXRpbmcgcGh5c2ljYWwgdm9sdW1lIGRhdGEgdG8gZGlzayBcIiVzXCIuIiwgcHZfbmFtZSk7CisKKwkJaWYgKCFwdl93cml0ZShjbWQsIHB2LCAwKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgdm9sdW1lIFwiJXNcIi4iLCBwdl9uYW1lKTsKKwkJCWRtX2xpc3RfbW92ZSgmcHAtPmFyZ19mYWlsLCAmcGQtPmxpc3QpOworCQkJY29udGludWU7CisJCX0KKworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiUGh5c2ljYWwgdm9sdW1lIFwiJXNcIiBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorCQkJCQlwdl9uYW1lKTsKKworCQlwdmwtPnB2ID0gcHY7CisJCWRtX2xpc3RfYWRkKCZwcC0+cHZzLCAmcHZsLT5saXN0KTsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSBQVnMgZnJvbSBkZXZpY2VzIGZvciBwdnJlbW92ZS4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwZCwgcGQyLCAmcHAtPmFyZ19yZW1vdmUpIHsKKwkJaWYgKCFsYWJlbF9yZW1vdmUocGQtPmRldikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwocykgb24gJXMuIiwgcGQtPm5hbWUpOworCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8gPSBsdm1jYWNoZV9pbmZvX2Zyb21fcHZpZChwZC0+cHZpZCwgcGQtPmRldiwgMCk7CisJCWlmIChpbmZvKQorCQkJbHZtY2FjaGVfZGVsKGluZm8pOworCisJCWlmICghbHZtZXRhZF9wdl9nb25lX2J5X2RldihwZC0+ZGV2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVtb3ZlIFBWICVzIGZyb20gbHZtZXRhZC4iLCBwZC0+bmFtZSk7CisJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkxhYmVscyBvbiBwaHlzaWNhbCB2b2x1bWUgXCIlc1wiIHN1Y2Nlc3NmdWxseSB3aXBlZC4iLAorCQkJCQlwZC0+bmFtZSk7CisJfQorCisJLyoKKwkgKiBTcGVjaWFsIGNhc2U6IHB2cmVtb3ZlIGR1cGxpY2F0ZSBQVnMgKGFsc28gc2VlIGFib3ZlKS4KKwkgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwZCwgcGQyLCAmcmVtb3ZlX2R1cGxpY2F0ZXMpIHsKKwkJaWYgKCFsYWJlbF9yZW1vdmUocGQtPmRldikpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdpcGUgZXhpc3RpbmcgbGFiZWwocykgb24gJXMuIiwgcGQtPm5hbWUpOworCQkJZG1fbGlzdF9tb3ZlKCZwcC0+YXJnX2ZhaWwsICZwZC0+bGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghbHZtZXRhZF9wdl9nb25lX2J5X2RldihwZC0+ZGV2KSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gcmVtb3ZlIFBWICVzIGZyb20gbHZtZXRhZC4iLCBwZC0+bmFtZSk7CisJCQlkbV9saXN0X21vdmUoJnBwLT5hcmdfZmFpbCwgJnBkLT5saXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbHZtY2FjaGVfcmVtb3ZlX3VuY2hvc2VuX2R1cGxpY2F0ZShwZC0+ZGV2KTsKKworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiTGFiZWxzIG9uIHBoeXNpY2FsIHZvbHVtZSBcIiVzXCIgc3VjY2Vzc2Z1bGx5IHdpcGVkLiIsCisJCQkJCXBkLT5uYW1lKTsKKwl9CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocGQsICZwcC0+YXJnX2ZhaWwpCisJCWxvZ19kZWJ1ZygiJXM6IGNvbW1hbmQgZmFpbGVkIGZvciAlcy4iLAorCQkJICBjbWQtPmNvbW1hbmQtPm5hbWUsIHBkLT5uYW1lKTsKKworCWlmICghZG1fbGlzdF9lbXB0eSgmcHAtPmFyZ19mYWlsKSkKKwkJZ290b19iYWQ7CisKKwkvKgorCSAqIFJldHVybnMgd2l0aCBWR19PUlBIQU5TIHdyaXRlIGxvY2sgaGVsZCBiZWNhdXNlIHZnY3JlYXRlIGFuZAorCSAqIHZnZXh0ZW5kIHdhbnQgdG8gdXNlIHRoZSBuZXdseSBjcmVhdGVkIFBWcy4KKwkgKi8KKwlyZXR1cm4gMTsKKworYmFkOgorCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworb3V0OgorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS90b29scy90b29sbGliLmggYi90b29scy90b29sbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlN2Y3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2xsaWIuaApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVE9PTExJQl9ICisjZGVmaW5lIF9MVk1fVE9PTExJQl9ICisKKyNpbmNsdWRlICJtZXRhZGF0YS1leHBvcnRlZC5oIgorI2luY2x1ZGUgInJlcG9ydC5oIgorCitpbnQgYmVjb21lX2RhZW1vbihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IHNraXBfbHZtKTsKKworLyoKKyAqIFRoZSAic3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlIiBpcyB1c2VkIGFzIGEgaGFuZGxlIGZvciBwcm9jZXNzaW5nCisgKiBmdW5jdGlvbnMgKHByb2Nlc3NfZWFjaF8qIGFuZCByZWxhdGVkKS4KKyAqCisgKiBUaGUgImN1c3RvbV9oYW5kbGUiIGlzIGFueSBoYW5kbGUgdXNlZCB0byBwYXNzIGN1c3RvbSBkYXRhIGludG8KKyAqIHByb2Nlc3NfZWFjaF8qIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGUgImludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0PTAiIG1ha2VzIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8KKyAqIHNraXAgY2hlY2tpbmcgdGhlIHJlcG9ydC9zZWxlY3Rpb24gY3JpdGVyaWEgKGlmIGdpdmVuIG9uIGNtZCBsaW5lKQorICogYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9uIG9uIHRoZSBpdGVtLgorICoKKyAqIFRoZSAic2VsZWN0aW9uX2hhbmRsZSIgaXMgb25seSB1c2VkIGlmICJpbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdD0xIi4KKyAqCisgKiBTb21lIGltcG9ydGFudCBub3RlcyBhYm91dCBzZWxlY3Rpb246CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbiBjYXNlIHdlJ3JlIHByb2Nlc3NpbmcgZm9yIGRpc3BsYXksIHRoZSBzZWxlY3Rpb24gaXMgZGlyZWN0bHkKKyAqIGEgcGFydCBvZiByZXBvcnRpbmcgZm9yIHRoZSBkaXNwbGF5IG9uIG91dHB1dCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgKiByZXBvcnQgdGhlIGl0ZW0gaW4gbWVtb3J5IHRvIGdldCB0aGUgc2VsZWN0aW9uIHJlc3VsdCwgdGhlbiBkcm9wcGluZworICogdGhlIHJlcG9ydCBhbmQgdGhlbiByZXBvcnRpbmcgdGhlIHNhbWUgdGhpbmcgYWdhaW4gZm9yIGl0IHRvIGJlCisgKiBkaXNwbGF5ZWQgb24gb3V0cHV0LgorICogRm9yIGV4YW1wbGUsIGNvbXBhcmUgdGhlc2UgY29kZSBwYXRoczoKKyAqCisgKiAgIC0gd2hlbiByZXBvcnRpbmcgZm9yIGRpc3BsYXkgb24gb3V0cHV0OgorICogICAgICBfcmVwb3J0IC0+IHByb2Nlc3NfZWFjaF8qIC0+IC4uLiAtPiBkbV9yZXBvcnRfb2JqZWN0CisgKiAgICAgIChIZXJlIHRoZSBkbV9yZXBvcnRfb2JqZWN0IGRvZXMgYm90aCBzZWxlY3Rpb24gYW5kCisgKiAgICAgICByZXBvcnRpbmcgZm9yIGRpc3BsYXkgb24gb3V0cHV0LikKKyAqCisgKiAgIC0gZm9yIGFueSBvdGhlciBwcm9jZXNzaW5nIGFuZCByZXBvcnRpbmcgZm9yIHNlbGVjdGlvbjoKKyAqICAgICAgcHJvY2Vzc19lYWNoXyogLT4gX3NlbGVjdF9tYXRjaF8qIC0+IC4uLiAtPiBkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IChzZWxlY3Rpb24gcmVzdWx0KSAtLT4gLi4uCisgKiAgICAgIChIZXJlIHRoZSBkbV9yZXBvcnRfb2JqZWN0X2lzX3NlbGVjdGVkIGp1c3QgZ2V0cworICogICAgICAgdGhlIHNlbGVjdGlvbiByZXN1bHQgYW5kIGl0IGRyb3BzIHJlcG9ydGluZyBidWZmZXIKKyAqICAgICAgIGltbWVkaWF0ZWx5LiBUaGVuIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gcmVzdWx0LAorICogICAgICAgdGhlIHByb2Nlc3NfZWFjaF8qIGFjdGlvbiBvbiB0aGUgaXRlbSBpcyBleGVjdXRlZAorICogICAgICAgb3Igbm90Li4uKQorICoKKyAqIFNpbXBseSwgd2Ugd2FudCB0byBhdm9pZCB0aGlzIGRvdWJsZSByZXBvcnRpbmcgd2hlbiByZXBvcnRpbmcKKyAqIGZvciBkaXNwbGF5IG9uIG91dHB1dDoKKyAqICAgICBfcmVwb3J0IC0+IHByb2Nlc3NfZWFjaF8qIC0+IF9zZWxlY3RfbWF0Y2hfKiAtPiAuLi4gLT4gZG1fcmVwb3J0X29iamVjdF9pc19zZWxlY3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IChzZWxlY3Rpb24gcmVzdWx0KSAtPiBkbV9yZXBvcnRfb2JqZWN0CisgKgorICogU28gd2hlbmV2ZXIgdGhlIHByb2Nlc3NpbmcgYWN0aW9uIGlzICJ0byBkaXNwbGF5IGl0ZW0gb24gb3V0cHV0IiwgdXNlCisgKiAiaW50ZXJuYWxfcmVwb3J0X2Zvcl9zZWxlY3Q9MCIgYXMgcmVwb3J0L3NlbGVjdGlvbiBpcyBhbHJlYWR5CisgKiBhIHBhcnQgb2YgdGhhdCByZXBvcnRpbmcgZm9yIGRpc3BsYXkgKGRtX3JlcG9ydF9vYmplY3QpLgorICovCitzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgeworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqcGFyZW50OworCWludCBpbnRlcm5hbF9yZXBvcnRfZm9yX3NlbGVjdDsKKwlpbnQgaW5jbHVkZV9oaXN0b3JpY2FsX2x2czsKKwlzdHJ1Y3Qgc2VsZWN0aW9uX2hhbmRsZSAqc2VsZWN0aW9uX2hhbmRsZTsKKwlkbV9yZXBvcnRfZ3JvdXBfdHlwZV90IHJlcG9ydF9ncm91cF90eXBlOworCXN0cnVjdCBkbV9yZXBvcnRfZ3JvdXAgKnJlcG9ydF9ncm91cDsKKwlzdHJ1Y3QgZG1fcmVwb3J0ICpsb2dfcmg7CisJaW50IGxvZ19vbmx5OworCWxvZ19yZXBvcnRfdCBzYXZlZF9sb2dfcmVwb3J0X3N0YXRlOworCXZvaWQgKmN1c3RvbV9oYW5kbGU7Cit9OworCit0eXBlZGVmIGludCAoKnByb2Nlc3Nfc2luZ2xlX3ZnX2ZuX3QpIChzdHJ1Y3QgY21kX2NvbnRleHQgKiBjbWQsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKiB2ZywKKwkJCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpOwordHlwZWRlZiBpbnQgKCpwcm9jZXNzX3NpbmdsZV9wdl9mbl90KSAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJCSAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpOwordHlwZWRlZiBpbnQgKCpwcm9jZXNzX3NpbmdsZV9sYWJlbF9mbl90KSAoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgc3RydWN0IGxhYmVsICpsYWJlbCwKKwkJCQkJICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCAoKnByb2Nlc3Nfc2luZ2xlX2x2X2ZuX3QpIChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkJICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCAoKnByb2Nlc3Nfc2luZ2xlX3NlZ19mbl90KSAoc3RydWN0IGNtZF9jb250ZXh0ICogY21kLAorCQkJCQlzdHJ1Y3QgbHZfc2VnbWVudCAqIHNlZywKKwkJCQkJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpOwordHlwZWRlZiBpbnQgKCpwcm9jZXNzX3NpbmdsZV9wdnNlZ19mbl90KSAoc3RydWN0IGNtZF9jb250ZXh0ICogY21kLAorCQkJCQkgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKiB2ZywKKwkJCQkJICBzdHJ1Y3QgcHZfc2VnbWVudCAqIHB2c2VnLAorCQkJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKTsKKworaW50IHByb2Nlc3NfZWFjaF92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCSAgICBjb25zdCBjaGFyICpvbmVfdmduYW1lLAorCQkgICAgc3RydWN0IGRtX2xpc3QgKnVzZV92Z25hbWVzLAorCQkgICAgdWludDMyX3QgZmxhZ3MsCisJCSAgICBpbnQgaW5jbHVkZV9pbnRlcm5hbCwKKwkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgcHJvY2Vzc19zaW5nbGVfdmdfZm5fdCBwcm9jZXNzX3NpbmdsZV92Zyk7CisKK2ludCBwcm9jZXNzX2VhY2hfcHYoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJICAgIGludCBhbGxfaXNfc2V0LCB1aW50MzJfdCByZWFkX2ZsYWdzLAorCQkgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICBwcm9jZXNzX3NpbmdsZV9wdl9mbl90IHByb2Nlc3Nfc2luZ2xlX3B2KTsKKworaW50IHByb2Nlc3NfZWFjaF9sYWJlbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgICBwcm9jZXNzX3NpbmdsZV9sYWJlbF9mbl90IHByb2Nlc3Nfc2luZ2xlX2xhYmVsKTsKKworaW50IHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX3B2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LAorCQkJICAgICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgIHByb2Nlc3Nfc2luZ2xlX3B2c2VnX2ZuX3QgcHJvY2Vzc19zaW5nbGVfcHZzZWcpOworCitpbnQgcHJvY2Vzc19lYWNoX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCSAgICBjb25zdCBjaGFyICpvbmVfdmduYW1lLCBjb25zdCBjaGFyICpvbmVfbHZuYW1lLAorCQkgICAgdWludDMyX3QgZmxhZ3MsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgcHJvY2Vzc19zaW5nbGVfbHZfZm5fdCBwcm9jZXNzX3NpbmdsZV9sdik7CisKKworaW50IHByb2Nlc3NfZWFjaF9zZWdtZW50X2luX2x2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCQkgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgICAgcHJvY2Vzc19zaW5nbGVfc2VnX2ZuX3QgcHJvY2Vzc19zaW5nbGVfc2VnKTsKKworaW50IHByb2Nlc3NfZWFjaF9wdl9pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICBwcm9jZXNzX3NpbmdsZV9wdl9mbl90IHByb2Nlc3Nfc2luZ2xlX3B2KTsKKworCitpbnQgcHJvY2Vzc19lYWNoX2x2X2luX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgc3RydWN0IGRtX2xpc3QgKmFyZ19sdm5hbWVzLCBjb25zdCBzdHJ1Y3QgZG1fbGlzdCAqdGFnc2wsCisJCQkgIGludCBzdG9wX29uX2Vycm9yLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJCSAgcHJvY2Vzc19zaW5nbGVfbHZfZm5fdCBwcm9jZXNzX3NpbmdsZV9sdik7CisKK3N0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpwYXJlbnRfaGFuZGxlKTsKK2ludCBpbml0X3NlbGVjdGlvbl9oYW5kbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkJICByZXBvcnRfdHlwZV90IGluaXRpYWxfcmVwb3J0X3R5cGUpOwordm9pZCBkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSk7CisKK2ludCBzZWxlY3RfbWF0Y2hfdmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHNlbGVjdF9tYXRjaF9sdihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUsCisJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdik7CitpbnQgc2VsZWN0X21hdGNoX3B2KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSwKKwkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcGh5c2ljYWxfdm9sdW1lICpwdik7CisKK2NvbnN0IGNoYXIgKmV4dHJhY3RfdmduYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpsdl9uYW1lKTsKK2NvbnN0IGNoYXIgKnNraXBfZGV2X2RpcihzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSB1bnNpZ25lZCAqZGV2X2Rpcl9mb3VuZCk7CisKK2ludCBwdmNyZWF0ZV9wYXJhbXNfZnJvbV9hcmdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCk7CitpbnQgcHZjcmVhdGVfZWFjaF9kZXZpY2Uoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlLCBzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCk7CisKKy8qCisgKiBCdWlsZHMgYSBsaXN0IG9mIHB2J3MgZnJvbSB0aGUgbmFtZXMgaW4gYXJndi4gIFVzZWQgaW4KKyAqIGx2Y3JlYXRlL2V4dGVuZC4KKyAqLworc3RydWN0IGRtX2xpc3QgKmNyZWF0ZV9wdl9saXN0KHN0cnVjdCBkbV9wb29sICptZW0sIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBpbnQgYXJnYywKKwkJCSAgICBjaGFyICoqYXJndiwgaW50IGFsbG9jYXRhYmxlX29ubHkpOworCitzdHJ1Y3QgZG1fbGlzdCAqY2xvbmVfcHZfbGlzdChzdHJ1Y3QgZG1fcG9vbCAqbWVtLCBzdHJ1Y3QgZG1fbGlzdCAqcHZzKTsKKworaW50IHZnY3JlYXRlX3BhcmFtc19zZXRfZGVmYXVsdHMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIHN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgKnZwX2RlZiwKKwkJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpOworaW50IHZnY3JlYXRlX3BhcmFtc19zZXRfZnJvbV9hcmdzKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSAgc3RydWN0IHZnY3JlYXRlX3BhcmFtcyAqdnBfbmV3LAorCQkJCSAgc3RydWN0IHZnY3JlYXRlX3BhcmFtcyAqdnBfZGVmKTsKK2ludCBsdl9jaGFuZ2VfYWN0aXZhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsCisJCSAgICAgICBhY3RpdmF0aW9uX2NoYW5nZV90IGFjdGl2YXRlKTsKK2ludCBsdl9yZWZyZXNoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKK2ludCB2Z19yZWZyZXNoX3Zpc2libGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKTsKK3ZvaWQgbHZfc3Bhd25fYmFja2dyb3VuZF9wb2xsaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJCSBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2KTsKKworaW50IGdldF9hY3RpdmF0aW9uX21vbml0b3JpbmdfbW9kZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBpbnQgKm1vbml0b3JpbmdfbW9kZSk7CisKK2ludCBnZXRfcG9vbF9wYXJhbXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCSAgICBjb25zdCBzdHJ1Y3Qgc2VnbWVudF90eXBlICpzZWd0eXBlLAorCQkgICAgaW50ICpwYXNzZWRfYXJncywKKwkJICAgIHVpbnQ2NF90ICpwb29sX21ldGFkYXRhX3NpemUsCisJCSAgICBpbnQgKnBvb2xfbWV0YWRhdGFfc3BhcmUsCisJCSAgICB1aW50MzJfdCAqY2h1bmtfc2l6ZSwKKwkJICAgIHRoaW5fZGlzY2FyZHNfdCAqZGlzY2FyZHMsCisJCSAgICBpbnQgKnplcm8pOworCitpbnQgZ2V0X3N0cmlwZV9wYXJhbXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHVpbnQzMl90ICpzdHJpcGVzLAorCQkgICAgICB1aW50MzJfdCAqc3RyaXBlX3NpemUpOworCitpbnQgZ2V0X2NhY2hlX3BhcmFtcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJICAgICBjYWNoZV9tb2RlX3QgKmNhY2hlX21vZGUsCisJCSAgICAgY29uc3QgY2hhciAqKm5hbWUsCisJCSAgICAgc3RydWN0IGRtX2NvbmZpZ190cmVlICoqc2V0dGluZ3MpOworCitpbnQgY2hhbmdlX3RhZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJICAgICAgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCBpbnQgYXJnKTsKKworaW50IGdldF9hbmRfdmFsaWRhdGVfbWFqb3JfbWlub3IoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJIGNvbnN0IHN0cnVjdCBmb3JtYXRfdHlwZSAqZm10LAorCQkJCSBpbnQzMl90ICptYWpvciwgaW50MzJfdCAqbWlub3IpOworCitpbnQgdmFsaWRhdGVfbHZuYW1lX3BhcmFtKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICoqdmdfbmFtZSwKKwkJCSAgY29uc3QgY2hhciAqKmx2X25hbWUpOworaW50IHZhbGlkYXRlX3Jlc3RyaWN0ZWRfbHZuYW1lX3BhcmFtKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICoqdmdfbmFtZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKipsdl9uYW1lKTsKKworaW50IGx2cmVtb3ZlX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xzLmggYi90b29scy90b29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDIyNGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29scy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9MVk1fVE9PTFNfSAorI2RlZmluZSBfTFZNX1RPT0xTX0gKKworI2luY2x1ZGUgInRvb2wuaCIKKworI2luY2x1ZGUgImx2bS1sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJhY3RpdmF0ZS5oIgorI2luY2x1ZGUgImFyY2hpdmVyLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm1ldGFkLmgiCisjaW5jbHVkZSAibHZtbG9ja2QuaCIKKyNpbmNsdWRlICJsdm0tdmVyc2lvbi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRlZmF1bHRzLmgiCisjaW5jbHVkZSAiZGV2LWNhY2hlLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAiZGlzcGxheS5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgIm1ldGFkYXRhLWV4cG9ydGVkLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgImx2bS1leGVjLmgiCisjaW5jbHVkZSAibHZtLWZpbGUuaCIKKyNpbmNsdWRlICJsdm0tc2lnbmFsLmgiCisjaW5jbHVkZSAibHZtLXN0cmluZy5oIgorI2luY2x1ZGUgInNlZ3R5cGUuaCIKKyNpbmNsdWRlICJzdHJfbGlzdC5oIgorI2luY2x1ZGUgInRvb2xjb250ZXh0LmgiCisjaW5jbHVkZSAidG9vbGxpYi5oIgorI2luY2x1ZGUgImx2bW5vdGlmeS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2RlZmluZSBDTURfTEVOIDI1NgorI2RlZmluZSBNQVhfQVJHUyA2NAorCisvKiBjb21tYW5kIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBpbnQgKCpjb21tYW5kX2ZuKSAoc3RydWN0IGNtZF9jb250ZXh0ICogY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjZGVmaW5lIHh4KGEsIGIuLi4pIGludCBhKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworI2luY2x1ZGUgImNvbW1hbmRzLmgiCisjdW5kZWYgeHgKKworLyogZGVmaW5lIHRoZSBlbnVtcyBmb3IgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyAqLworZW51bSB7CisjZGVmaW5lIGFyZyhhLCBiLCBjLCBkLCBlLCBmKSBhICwKKyNpbmNsdWRlICJhcmdzLmgiCisjdW5kZWYgYXJnCit9OworCisjZGVmaW5lIEFSR19DT1VOVEFCTEUgMHgwMDAwMDAwMQkvKiBFLmcuIC12dnZ2ICovCisjZGVmaW5lIEFSR19HUk9VUEFCTEUgMHgwMDAwMDAwMgkvKiBFLmcuIC0tYWRkdGFnICovCisKK3N0cnVjdCBhcmdfdmFsdWVzIHsKKwl1bnNpZ25lZCBjb3VudDsKKwljaGFyICp2YWx1ZTsKKwlpbnQzMl90IGlfdmFsdWU7CisJdWludDMyX3QgdWlfdmFsdWU7CisJaW50NjRfdCBpNjRfdmFsdWU7CisJdWludDY0X3QgdWk2NF92YWx1ZTsKKwlzaWduX3Qgc2lnbjsKKwlwZXJjZW50X3R5cGVfdCBwZXJjZW50OworLyoJdm9pZCAqcHRyOyAvLyBDdXJyZW50bHkgbm90IHVzZWQuICovCit9OworCisvKiBhIGdsb2JhbCB0YWJsZSBvZiBwb3NzaWJsZSBhcmd1bWVudHMgKi8KK3N0cnVjdCBhcmdfcHJvcHMgeworCWNvbnN0IGNoYXIgc2hvcnRfYXJnOworCWNoYXIgX3BhZGRpbmdbN107CisJY29uc3QgY2hhciAqbG9uZ19hcmc7CisKKwlpbnQgKCpmbikgKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IHByaW87Cit9OworCitzdHJ1Y3QgYXJnX3ZhbHVlX2dyb3VwX2xpc3QgeworICAgICAgICBzdHJ1Y3QgZG1fbGlzdCBsaXN0OworICAgICAgICBzdHJ1Y3QgYXJnX3ZhbHVlcyBhcmdfdmFsdWVzWzBdOworCXVpbnQzMl90IHByaW87Cit9OworCisjZGVmaW5lIENBQ0hFX1ZHTUVUQURBVEEJMHgwMDAwMDAwMQorI2RlZmluZSBQRVJNSVRURURfUkVBRF9PTkxZIAkweDAwMDAwMDAyCisvKiBQcm9jZXNzIGFsbCBWR3MgaWYgbm9uZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KKyNkZWZpbmUgQUxMX1ZHU19JU19ERUZBVUxUCTB4MDAwMDAwMDQKKy8qIFByb2Nlc3MgYWxsIGRldmljZXMgd2l0aCAtLWFsbCBpZiBub25lIGFyZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KKyNkZWZpbmUgRU5BQkxFX0FMTF9ERVZTCQkweDAwMDAwMDA4CQorLyogQ29tbWFuZCBtYXkgdHJ5IHRvIGludGVycHJldCBhIHZnbmFtZSBhcmcgYXMgYSB1dWlkLiAqLworI2RlZmluZSBBTExPV19VVUlEX0FTX05BTUUJMHgwMDAwMDAxMAorLyogQ29tbWFuZCBuZWVkcyBhIHNoYXJlZCBsb2NrIG9uIGEgVkc7IGl0IG9ubHkgcmVhZHMgdGhlIFZHLiAqLworI2RlZmluZSBMT0NLRF9WR19TSAkJMHgwMDAwMDAyMAorLyogQ29tbWFuZCBkb2VzIG5vdCBwcm9jZXNzIGFueSBtZXRhZGF0YS4gKi8KKyNkZWZpbmUgTk9fTUVUQURBVEFfUFJPQ0VTU0lORwkweDAwMDAwMDQwCisvKiBDb21tYW5kIHdhbnRzIHRvIHNjYW4gZm9yIG5ldyBkZXZpY2VzIGFuZCBmb3JjZSBsYWJlbHMgdG8gYmUgcmVhZCBmcm9tIHRoZW0gYWxsLiAqLworI2RlZmluZSBSRVFVSVJFU19GVUxMX0xBQkVMX1NDQU4gMHgwMDAwMDA4MAorLyogQ29tbWFuZCBtdXN0IHVzZSBhbGwgc3BlY2lmaWVkIGFyZyBuYW1lcyBhbmQgZmFpbCBpZiBhbGwgY2Fubm90IGJlIHVzZWQuICovCisjZGVmaW5lIE1VU1RfVVNFX0FMTF9BUkdTICAgICAgICAweDAwMDAwMTAwCisvKiBDb21tYW5kIHdhbnRzIHRvIGNvbnRyb2wgdGhlIGRldmljZSBzY2FuIGZvciBsdm1ldGFkIGl0c2VsZi4gKi8KKyNkZWZpbmUgTk9fTFZNRVRBRF9BVVRPU0NBTiAgICAgIDB4MDAwMDAyMDAKKy8qIENvbW1hbmQgc2hvdWxkIHByb2Nlc3MgdW51c2VkIGR1cGxpY2F0ZSBkZXZpY2VzLiAqLworI2RlZmluZSBFTkFCTEVfRFVQTElDQVRFX0RFVlMgICAgMHgwMDAwMDQwMAorLyogQ29tbWFuZCBkb2VzIG5vdCBhY2NlcHQgdGFncyBhcyBhcmdzLiAqLworI2RlZmluZSBESVNBTExPV19UQUdfQVJHUyAgICAgICAgMHgwMDAwMDgwMAorIAorLyogYSByZWdpc3RlciBvZiB0aGUgbHZtIGNvbW1hbmRzICovCitzdHJ1Y3QgY29tbWFuZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjOworCWNvbnN0IGNoYXIgKnVzYWdlOworCWNvbW1hbmRfZm4gZm47CisKKwl1bnNpZ25lZCBmbGFnczsKKworCWludCBudW1fYXJnczsKKwlpbnQgKnZhbGlkX2FyZ3M7Cit9OworCit2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiB0aGUgYXJndW1lbnQgdmVyaWZ5L25vcm1hbGlzZSBmdW5jdGlvbnMgKi8KK2ludCB5ZXNfbm9fYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IGFjdGl2YXRpb25fYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IGNhY2hlbW9kZV9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgZGlzY2FyZHNfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IG1pcnJvcmxvZ19hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgc2l6ZV9rYl9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgc2l6ZV9tYl9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgc2l6ZV9tYl9hcmdfd2l0aF9wZXJjZW50KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IGludF9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgaW50X2FyZ193aXRoX3NpZ24oc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgaW50X2FyZ193aXRoX3NpZ25fYW5kX3BlcmNlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgbWFqb3JfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IG1pbm9yX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KTsKK2ludCBzdHJpbmdfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IHRhZ19hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgcGVybWlzc2lvbl9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgbWV0YWRhdGF0eXBlX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KTsKK2ludCB1bml0c19hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgc2VndHlwZV9hcmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCBhcmdfdmFsdWVzICphdik7CitpbnQgYWxsb2NfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IGxvY2t0eXBlX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KTsKK2ludCByZWFkYWhlYWRfYXJnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYpOworaW50IG1ldGFkYXRhY29waWVzX2FyZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgc3RydWN0IGFyZ192YWx1ZXMgKmF2KTsKKworLyogd2UgdXNlIHRoZSBlbnVtcyB0byBhY2Nlc3MgdGhlIHN3aXRjaGVzICovCit1bnNpZ25lZCBhcmdfY291bnQoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhKTsKK3Vuc2lnbmVkIGFyZ19pc19zZXQoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhKTsKK2ludCBhcmdfZnJvbV9saXN0X2lzX3NldChjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZXJyX2ZvdW5kLCAuLi4pOworaW50IGFyZ19vdXRzaWRlX2xpc3RfaXNfc2V0KGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICplcnJfZm91bmQsIC4uLik7CitpbnQgYXJnX2Zyb21fbGlzdF9pc19uZWdhdGl2ZShjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZXJyX2ZvdW5kLCAuLi4pOworaW50IGFyZ19mcm9tX2xpc3RfaXNfemVybyhjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqZXJyX2ZvdW5kLCAuLi4pOworY29uc3QgY2hhciAqYXJnX2xvbmdfb3B0aW9uX25hbWUoaW50IGEpOworY29uc3QgY2hhciAqYXJnX3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSk7Citjb25zdCBjaGFyICphcmdfc3RyX3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgY2hhciAqZGVmKTsKK2ludDMyX3QgYXJnX2ludF92YWx1ZShjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGEsIGNvbnN0IGludDMyX3QgZGVmKTsKK2ludDMyX3QgZmlyc3RfZ3JvdXBlZF9hcmdfaW50X3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgaW50MzJfdCBkZWYpOwordWludDMyX3QgYXJnX3VpbnRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCB1aW50MzJfdCBkZWYpOworaW50NjRfdCBhcmdfaW50NjRfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCBpbnQ2NF90IGRlZik7Cit1aW50NjRfdCBhcmdfdWludDY0X3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3QgdWludDY0X3QgZGVmKTsKK2NvbnN0IHZvaWQgKmFyZ19wdHJfdmFsdWUoY29uc3Qgc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhLCBjb25zdCB2b2lkICpkZWYpOworc2lnbl90IGFyZ19zaWduX3ZhbHVlKGNvbnN0IHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYSwgY29uc3Qgc2lnbl90IGRlZik7CitwZXJjZW50X3R5cGVfdCBhcmdfcGVyY2VudF92YWx1ZShjb25zdCBzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGEsIGNvbnN0IHBlcmNlbnRfdHlwZV90IGRlZik7CitpbnQgYXJnX2NvdW50X2luY3JlbWVudChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGEpOworCit1bnNpZ25lZCBncm91cGVkX2FyZ19jb3VudChjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhKTsKK3Vuc2lnbmVkIGdyb3VwZWRfYXJnX2lzX3NldChjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhKTsKK2NvbnN0IGNoYXIgKmdyb3VwZWRfYXJnX3N0cl92YWx1ZShjb25zdCBzdHJ1Y3QgYXJnX3ZhbHVlcyAqYXYsIGludCBhLCBjb25zdCBjaGFyICpkZWYpOworaW50MzJfdCBncm91cGVkX2FyZ19pbnRfdmFsdWUoY29uc3Qgc3RydWN0IGFyZ192YWx1ZXMgKmF2LCBpbnQgYSwgY29uc3QgaW50MzJfdCBkZWYpOyAKKworY29uc3QgY2hhciAqY29tbWFuZF9uYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKTsKKworaW50IHB2bW92ZV9wb2xsKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICpwdl9uYW1lLCBjb25zdCBjaGFyICp1dWlkLAorCQljb25zdCBjaGFyICp2Z19uYW1lLCBjb25zdCBjaGFyICpsdl9uYW1lLCB1bnNpZ25lZCBiYWNrZ3JvdW5kKTsKK2ludCBsdmNvbnZlcnRfcG9sbChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgdW5zaWduZWQgYmFja2dyb3VuZCk7CisKK2ludCBtaXJyb3JfcmVtb3ZlX21pc3Npbmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYsIGludCBmb3JjZSk7CisKKworaW50IHZnY2hhbmdlX2FjdGl2YXRlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJICAgICAgIGFjdGl2YXRpb25fY2hhbmdlX3QgYWN0aXZhdGUpOworCitpbnQgdmdjaGFuZ2VfYmFja2dyb3VuZF9wb2xsaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdjZmdiYWNrdXAuYyBiL3Rvb2xzL3ZnY2ZnYmFja3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0YzNhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZnY2ZnYmFja3VwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIGNoYXIgKl9leHBhbmRfZmlsZW5hbWUoY29uc3QgY2hhciAqdGVtcGxhdGUsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICAgICBjaGFyICoqbGFzdF9maWxlbmFtZSkKK3sKKwljaGFyICpmaWxlbmFtZTsKKworCWlmIChzZWN1cml0eV9sZXZlbCgpKQorCQlyZXR1cm4gZG1fc3RyZHVwKHRlbXBsYXRlKTsKKworCWlmICghKGZpbGVuYW1lID0gZG1fbWFsbG9jKFBBVEhfTUFYKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZW5hbWUuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkbV9zbnByaW50ZihmaWxlbmFtZSwgUEFUSF9NQVgsIHRlbXBsYXRlLCB2Z19uYW1lKSA8IDApIHsKKwkJbG9nX2Vycm9yKCJFcnJvciBwcm9jZXNzaW5nIGZpbGVuYW1lIHRlbXBsYXRlICVzIiwKKwkJCSAgIHRlbXBsYXRlKTsKKwkJZG1fZnJlZShmaWxlbmFtZSk7CQorCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCpsYXN0X2ZpbGVuYW1lICYmICFzdHJuY21wKCpsYXN0X2ZpbGVuYW1lLCBmaWxlbmFtZSwgUEFUSF9NQVgpKSB7CisJCWxvZ19lcnJvcigiVkdzIG11c3QgYmUgYmFja2VkIHVwIGludG8gZGlmZmVyZW50IGZpbGVzLiAiCisJCQkgICJVc2UgJSVzIGluIGZpbGVuYW1lIGZvciBWRyBuYW1lLiIpOworCQlkbV9mcmVlKGZpbGVuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG1fZnJlZSgqbGFzdF9maWxlbmFtZSk7CisJKmxhc3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKKworCXJldHVybiBmaWxlbmFtZTsKK30KKworc3RhdGljIGludCB2Z19iYWNrdXBfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCWNoYXIgKipsYXN0X2ZpbGVuYW1lID0gKGNoYXIgKiopaGFuZGxlLT5jdXN0b21faGFuZGxlOworCWNoYXIgKmZpbGVuYW1lOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBmaWxlX0FSRykpIHsKKwkJaWYgKCEoZmlsZW5hbWUgPSBfZXhwYW5kX2ZpbGVuYW1lKGFyZ192YWx1ZShjbWQsIGZpbGVfQVJHKSwKKwkJCQkJCSAgdmctPm5hbWUsIGxhc3RfZmlsZW5hbWUpKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCQlpZiAoIWJhY2t1cF90b19maWxlKGZpbGVuYW1lLCB2Zy0+Y21kLT5jbWRfbGluZSwgdmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0gZWxzZSB7CisJCWlmICh2Z19yZWFkX2Vycm9yKHZnKSA9PSBGQUlMRURfSU5DT05TSVNURU5UKSB7CisJCQlsb2dfZXJyb3IoIk5vIGJhY2t1cCB0YWtlbjogc3BlY2lmeSBmaWxlbmFtZSB3aXRoIC1mICIKKwkJCQkgICJ0byBiYWNrdXAgYW4gaW5jb25zaXN0ZW50IFZHIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKworCQkvKiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJhY2t1cCBjb2RlICovCisJCWJhY2t1cF9lbmFibGUoY21kLCAxKTsJLyogZm9yY2UgYSBiYWNrdXAgKi8KKwkJaWYgKCFiYWNrdXAodmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0KKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBiYWNrZWQgdXAuIiwgdmdfbmFtZSk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCB2Z2NmZ2JhY2t1cChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXQ7CisJY2hhciAqbGFzdF9maWxlbmFtZSA9IE5VTEw7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCisJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb2Nlc3NpbmcgaGFuZGxlLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJmxhc3RfZmlsZW5hbWU7CisKKwlpbml0X3B2bW92ZSgxKTsKKworCXJldCA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsIFJFQURfQUxMT1dfSU5DT05TSVNURU5ULCAwLAorCQkJICAgICAgaGFuZGxlLCAmdmdfYmFja3VwX3NpbmdsZSk7CisKKwlkbV9mcmVlKGxhc3RfZmlsZW5hbWUpOworCisJaW5pdF9wdm1vdmUoMCk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdjZmdyZXN0b3JlLmMgYi90b29scy92Z2NmZ3Jlc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWEyYWRkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdjZmdyZXN0b3JlLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKyNpbmNsdWRlICJsdm1ldGFkLWNsaWVudC5oIgorCitpbnQgdmdjZmdyZXN0b3JlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqdmdfbmFtZSA9IE5VTEw7CisJaW50IGx2bWV0YWRfcmVzY2FuID0gMDsKKwlpbnQgcmV0OworCisJaWYgKGFyZ2MgPT0gMSkgeworCQl2Z19uYW1lID0gc2tpcF9kZXZfZGlyKGNtZCwgYXJndlswXSwgTlVMTCk7CisJCWlmICghdmFsaWRhdGVfbmFtZSh2Z19uYW1lKSkgeworCQkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgbmFtZSBcIiVzXCIgaXMgaW52YWxpZCIsIHZnX25hbWUpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisJfSBlbHNlIGlmICghKGFyZ19pc19zZXQoY21kLCBsaXN0X0FSRykgJiYgYXJnX2lzX3NldChjbWQsIGZpbGVfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2Ugc3BlY2lmeSBhICpzaW5nbGUqIHZvbHVtZSBncm91cCB0byByZXN0b3JlLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJLyoKKwkgKiBGSVhNRTogb3ZlcmxvYWRpbmcgdGhlIC1sIGFyZyBmb3Igbm93IHRvIGRpc3BsYXkgYQorCSAqIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcyBmb3IgYSBwYXJ0aWN1bGFyIHZnCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBsaXN0X0FSRykpIHsKKwkJaWYgKCEoYXJnX2lzX3NldChjbWQsZmlsZV9BUkcpID8KKwkJCSAgICBhcmNoaXZlX2Rpc3BsYXlfZmlsZShjbWQsCisJCQkJYXJnX3N0cl92YWx1ZShjbWQsIGZpbGVfQVJHLCAiIikpIDoKKwkJCSAgICBhcmNoaXZlX2Rpc3BsYXkoY21kLCB2Z19uYW1lKSkpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCX0KKworCS8qCisJICogbHZtZXRhZCBkb2VzIG5vdCBoYW5kbGUgYSBWRyBiZWluZyByZXN0b3JlZCwgd2hpY2ggd291bGQgcmVxdWlyZQorCSAqIHZnX3JlbW92ZSBvZiB0aGUgZXhpc3RpbmcgVkcsIHRoZW4gdmdfdXBkYXRlIG9mIHRoZSByZXN0b3JlZCBWRy4gIEEKKwkgKiBjb21tYW5kIGZhaWx1cmUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGV4aXN0aW5nIFZHIGZyb20gbHZtZXRhZCB3b3VsZAorCSAqIG5vdCBiZSBlYXNpbHkgcmVjb3ZlcmVkIGZyb20uICBTbywgZGlzYWJsZSB0aGUgbHZtZXRhZCBjYWNoZSBiZWZvcmUKKwkgKiBkb2luZyB0aGUgcmVzdG9yZS4gIEFmdGVyIHRoZSBWRyBpcyByZXN0b3JlZCBvbiBkaXNrLCByZXNjYW4KKwkgKiBtZXRhZGF0YSBmcm9tIGRpc2sgdG8gcG9wdWxhdGUgbHZtZXRhZCBmcm9tIHNjcmF0Y2ggd2hpY2ggd2lsbCBwaWNrCisJICogdXAgdGhlIFZHIHRoYXQgd2FzIHJlc3RvcmVkIG9uIGRpc2suCisJICovCisKKwlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJbHZtZXRhZF9zZXRfZGlzYWJsZWQoY21kLCBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX1ZHUkVTVE9SRSk7CisJCWx2bWV0YWRfZGlzY29ubmVjdCgpOworCQlsdm1ldGFkX3Jlc2NhbiA9IDE7CisJfQorCisJaWYgKCFsb2NrX3ZvbChjbWQsIHZnX25hbWUsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gbG9jayB2b2x1bWUgZ3JvdXAgJXMiLCB2Z19uYW1lKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWlmICghbG9ja192b2woY21kLCBWR19PUlBIQU5TLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGxvY2sgb3JwaGFucyIpOworCQl1bmxvY2tfdmcoY21kLCBOVUxMLCB2Z19uYW1lKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWNtZC0+aGFuZGxlc191bmtub3duX3NlZ21lbnRzID0gMTsKKworCWlmICghKGFyZ19pc19zZXQoY21kLCBmaWxlX0FSRykgPworCSAgICAgIGJhY2t1cF9yZXN0b3JlX2Zyb21fZmlsZShjbWQsIHZnX25hbWUsCisJCQkJICAgICAgIGFyZ19zdHJfdmFsdWUoY21kLCBmaWxlX0FSRywgIiIpLAorCQkJCSAgICAgICBhcmdfY291bnQoY21kLCBmb3JjZV9sb25nX0FSRykpIDoKKwkgICAgICBiYWNrdXBfcmVzdG9yZShjbWQsIHZnX25hbWUsIGFyZ19jb3VudChjbWQsIGZvcmNlX2xvbmdfQVJHKSkpKSB7CisJCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCQl1bmxvY2tfdmcoY21kLCBOVUxMLCB2Z19uYW1lKTsKKwkJbG9nX2Vycm9yKCJSZXN0b3JlIGZhaWxlZC4iKTsKKwkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCWdvdG8gcmVzY2FuOworCX0KKworCXJldCA9IEVDTURfUFJPQ0VTU0VEOworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSZXN0b3JlZCB2b2x1bWUgZ3JvdXAgJXMiLCB2Z19uYW1lKTsKKworCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCXVubG9ja192ZyhjbWQsIE5VTEwsIHZnX25hbWUpOworcmVzY2FuOgorCWlmIChsdm1ldGFkX3Jlc2NhbikgeworCQlpZiAoIWx2bWV0YWRfY29ubmVjdChjbWQpKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIGNvbm5lY3QgdG8gbHZtZXRhZC4iKTsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBVcGRhdGUgbHZtZXRhZCB3aXRoIHB2c2NhbiAtLWNhY2hlLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFyZWZyZXNoX2ZpbHRlcnMoY21kKSkKKwkJCXN0YWNrOworCQlpZiAoIWx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKGNtZCwgMSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBGYWlsZWQgdG8gc2NhbiBkZXZpY2VzLiIpOworCQkJbG9nX3dhcm4oIldBUk5JTkc6IFVwZGF0ZSBsdm1ldGFkIHdpdGggcHZzY2FuIC0tY2FjaGUuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdjaGFuZ2UuYyBiL3Rvb2xzL3ZnY2hhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZjMzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZnY2hhbmdlLmMKQEAgLTAsMCArMSwxMjY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0cnVjdCB2Z2NoYW5nZV9wYXJhbXMgeworCWludCBsb2NrX3N0YXJ0X2NvdW50OworCXVuc2lnbmVkIGludCBsb2NrX3N0YXJ0X3NhbmxvY2sgOiAxOworfTsKKworLyoKKyAqIEluY3JlbWVudHMgKmNvdW50IGJ5IHRoZSBudW1iZXIgb2YgX25ld18gbW9uaXRvcmVkIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgX21vbml0b3JfbHZzX2luX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLAorCQkJICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIGludCByZWcsIGludCAqY291bnQpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCWludCByID0gMTsKKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCWx2ID0gbHZsLT5sdjsKKworCQlpZiAoIWx2X2luZm8oY21kLCBsdiwgbHZfaXNfdGhpbl9wb29sKGx2KSA/IDEgOiAwLAorCQkJICAgICBOVUxMLCAwLCAwKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBGSVhNRTogTmVlZCB0byBjb25zaWRlciBhbGwgY2FzZXMuLi4gUFZNT1ZFLCBldGMKKwkJICovCisJCWlmIChsdl9pc19wdm1vdmUobHYpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFtb25pdG9yX2Rldl9mb3JfZXZlbnRzKGNtZCwgbHYsIDAsIHJlZykpIHsKKwkJCXIgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkoKmNvdW50KSsrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9wb2xsX2x2c19pbl92ZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlzdHJ1Y3QgbHZpbmZvIGluZm87CisJaW50IGx2X2FjdGl2ZTsKKwlpbnQgY291bnQgPSAwOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJbHYgPSBsdmwtPmx2OworCisJCWlmICghbHZfaW5mbyhjbWQsIGx2LCAwLCAmaW5mbywgMCwgMCkpCisJCQlsdl9hY3RpdmUgPSAwOworCQllbHNlCisJCQlsdl9hY3RpdmUgPSBpbmZvLmV4aXN0czsKKworCQlpZiAobHZfYWN0aXZlICYmCisJCSAgICAobHZfaXNfcHZtb3ZlKGx2KSB8fCBsdl9pc19jb252ZXJ0aW5nKGx2KSB8fCBsdl9pc19tZXJnaW5nKGx2KSkpIHsKKwkJCWx2X3NwYXduX2JhY2tncm91bmRfcG9sbGluZyhjbWQsIGx2KTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwkvKgorCSAqIHJldHVybnMgdGhlIG51bWJlciBvZiBwb2xsZWQgZGV2aWNlcworCSAqIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgbHYgaXMgYWxyZWFkeSBiZWluZyBwb2xsZWQKKwkgKi8KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBfYWN0aXZhdGVfbHZzX2luX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICAgICBhY3RpdmF0aW9uX2NoYW5nZV90IGFjdGl2YXRlKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlpbnQgY291bnQgPSAwLCBleHBlY3RlZF9jb3VudCA9IDAsIHIgPSAxOworCisJc2lnaW50X2FsbG93KCk7CisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJaWYgKHNpZ2ludF9jYXVnaHQoKSkKKwkJCXJldHVybl8wOworCisJCWx2ID0gbHZsLT5sdjsKKworCQlpZiAoIWx2X2lzX3Zpc2libGUobHYpKQorCQkJY29udGludWU7CisKKwkJLyogSWYgTFYgaXMgc3BhcnNlLCBhY3RpdmF0ZSBvcmlnaW4gaW5zdGVhZCAqLworCQlpZiAobHZfaXNfY293KGx2KSAmJiBsdl9pc192aXJ0dWFsX29yaWdpbihvcmlnaW5fZnJvbV9jb3cobHYpKSkKKwkJCWx2ID0gb3JpZ2luX2Zyb21fY293KGx2KTsKKworCQkvKiBPbmx5IHJlcXVlc3QgYWN0aXZhdGlvbiBvZiBzbmFwc2hvdCBvcmlnaW4gZGV2aWNlcyAqLworCQlpZiAoKGx2LT5zdGF0dXMgJiBTTkFQU0hPVCkgfHwgbHZfaXNfY293KGx2KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE9ubHkgcmVxdWVzdCBhY3RpdmF0aW9uIG9mIG1pcnJvciBMViAqLworCQlpZiAoKGx2LT5zdGF0dXMgJiBNSVJST1JfSU1BR0UpIHx8IChsdi0+c3RhdHVzICYgTUlSUk9SX0xPRykpCisJCQljb250aW51ZTsKKworCQkvKiBPbmx5IHJlcXVlc3QgYWN0aXZhdGlvbiBvZiB0aGUgZmlyc3QgcmVwbGljYXRvci1kZXYgTFYgKi8KKwkJLyogQXZvaWRzIHJldHJ5IHdpdGggYWxsIGhlYWRzIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCQlpZiAobHZfaXNfcmVwbGljYXRvcl9kZXYobHYpICYmIChsdiAhPSBmaXJzdF9yZXBsaWNhdG9yX2RldihsdikpKQorCQkJY29udGludWU7CisKKwkJaWYgKGx2X2FjdGl2YXRpb25fc2tpcChsdiwgYWN0aXZhdGUsIGFyZ19pc19zZXQoY21kLCBpZ25vcmVhY3RpdmF0aW9uc2tpcF9BUkcpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoYWN0aXZhdGUgPT0gQ0hBTkdFX0FBWSkgJiYKKwkJICAgICFsdl9wYXNzZXNfYXV0b19hY3RpdmF0aW9uX2ZpbHRlcihjbWQsIGx2KSkKKwkJCWNvbnRpbnVlOworCisJCWV4cGVjdGVkX2NvdW50Kys7CisKKwkJaWYgKCFsdl9jaGFuZ2VfYWN0aXZhdGUoY21kLCBsdiwgYWN0aXZhdGUpKSB7CisJCQlpZiAoIWx2X2lzX2FjdGl2ZV9leGNsdXNpdmVfcmVtb3RlbHkobHYpKQorCQkJCXN0YWNrOworCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgTFYgaXMgYWN0aXZlIGV4Y2x1c2l2ZSByZW1vdGVseSwKKwkJCQkgKiB0aGVuIGlnbm9yZSBpdCBoZXJlCisJCQkJICovCisJCQkJbG9nX3ZlcmJvc2UoIiVzLyVzIGlzIGV4Y2x1c2l2ZWx5IGFjdGl2ZSBvbiIKKwkJCQkJICAgICIgYSByZW1vdGUgbm9kZSIsIHZnLT5uYW1lLCBsdi0+bmFtZSk7CisJCQkJZXhwZWN0ZWRfY291bnQtLTsgLyogbm90IGFjY291bnRlZCAqLworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQljb3VudCsrOworCX0KKworCXNpZ2ludF9yZXN0b3JlKCk7CisKKwkvKiBXYWl0IHVudGlsIGRldmljZXMgYXJlIGF2YWlsYWJsZSAqLworCWlmICghc3luY19sb2NhbF9kZXZfbmFtZXModmctPmNtZCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3luYyBsb2NhbCBkZXZpY2VzIGZvciBWRyAlcy4iLCB2Zy0+bmFtZSk7CisJCXIgPSAwOworCX0KKworCWlmIChleHBlY3RlZF9jb3VudCkKKwkJbG9nX3ZlcmJvc2UoIiVzICVkIGxvZ2ljYWwgdm9sdW1lcyBpbiB2b2x1bWUgZ3JvdXAgJXMiLAorCQkJICAgIGlzX2NoYW5nZV9hY3RpdmF0aW5nKGFjdGl2YXRlKSA/CisJCQkgICAgIkFjdGl2YXRlZCIgOiAiRGVhY3RpdmF0ZWQiLCBjb3VudCwgdmctPm5hbWUpOworCisJcmV0dXJuIChleHBlY3RlZF9jb3VudCAhPSBjb3VudCkgPyAwIDogcjsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfbW9uaXRvcmluZyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaW50IHIgPSAxOworCWludCBtb25pdG9yZWQgPSAwOworCisJaWYgKGx2c19pbl92Z19hY3RpdmF0ZWQodmcpICYmCisJICAgIGRtZXZlbnRkX21vbml0b3JfbW9kZSgpICE9IERNRVZFTlREX01PTklUT1JfSUdOT1JFKSB7CisJCWlmICghX21vbml0b3JfbHZzX2luX3ZnKGNtZCwgdmcsIGRtZXZlbnRkX21vbml0b3JfbW9kZSgpLCAmbW9uaXRvcmVkKSkKKwkJCXIgPSAwOworCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiJWQgbG9naWNhbCB2b2x1bWUocykgaW4gdm9sdW1lIGdyb3VwICIKKwkJCQkJIlwiJXNcIiAlc21vbml0b3JlZCIsCisJCQkJCW1vbml0b3JlZCwgdmctPm5hbWUsIChkbWV2ZW50ZF9tb25pdG9yX21vZGUoKSkgPyAiIiA6ICJ1biIpOworCX0KKworCXJldHVybiByOworfQorCitpbnQgdmdjaGFuZ2VfYmFja2dyb3VuZF9wb2xsaW5nKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlpbnQgcG9sbGVkOworCisJaWYgKGx2c19pbl92Z19hY3RpdmF0ZWQodmcpICYmIGJhY2tncm91bmRfcG9sbGluZygpKSB7CisJICAgICAgICBwb2xsZWQgPSBfcG9sbF9sdnNfaW5fdmcoY21kLCB2Zyk7CisJCWlmIChwb2xsZWQpCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiQmFja2dyb3VuZCBwb2xsaW5nIHN0YXJ0ZWQgZm9yICVkIGxvZ2ljYWwgdm9sdW1lKHMpICIKKwkJCQkJCSJpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIiwKKwkJCQkJCXBvbGxlZCwgdmctPm5hbWUpOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdmdjaGFuZ2VfYWN0aXZhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkgICAgICBhY3RpdmF0aW9uX2NoYW5nZV90IGFjdGl2YXRlKQoreworCWludCBsdl9vcGVuLCBhY3RpdmUsIG1vbml0b3JlZCA9IDAsIHIgPSAxOworCWNvbnN0IHN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IGRvX2FjdGl2YXRlID0gaXNfY2hhbmdlX2FjdGl2YXRpbmcoYWN0aXZhdGUpOworCisJLyoKKwkgKiBXZSBjYW4gZ2V0IGhlcmUgaW4gdGhlIG9kZCBjYXNlIHdoZXJlIGFuIExWIGlzIGFscmVhZHkgYWN0aXZlIGluCisJICogYSBmb3JlaWduIFZHLCB3aGljaCBhbGxvd3MgdGhlIFZHIHRvIGJlIGFjY2Vzc2VkIGJ5IHZnY2hhbmdlIC1hCisJICogc28gdGhlIExWIGNhbiBiZSBkZWFjdGl2YXRlZC4KKwkgKi8KKwlpZiAodmctPnN5c3RlbV9pZCAmJiB2Zy0+c3lzdGVtX2lkWzBdICYmCisJICAgIGNtZC0+c3lzdGVtX2lkICYmIGNtZC0+c3lzdGVtX2lkWzBdICYmCisJICAgIHN0cmNtcCh2Zy0+c3lzdGVtX2lkLCBjbWQtPnN5c3RlbV9pZCkgJiYKKwkgICAgZG9fYWN0aXZhdGUpIHsKKwkJbG9nX2Vycm9yKCJDYW5ub3QgYWN0aXZhdGUgTFZzIGluIGEgZm9yZWlnbiBWRy4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCS8qCisJICogU2FmZSwgc2luY2Ugd2UgbmV2ZXIgd3JpdGUgb3V0IG5ldyBtZXRhZGF0YSBoZXJlLiBSZXF1aXJlZCBmb3IKKwkgKiBwYXJ0aWFsIGFjdGl2YXRpb24gdG8gd29yay4KKwkgKi8KKyAgICAgICAgY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKworCS8qIEZJWE1FOiBGb3JjZSBhcmd1bWVudCB0byBkZWFjdGl2YXRlIHRoZW0/ICovCisJaWYgKCFkb19hY3RpdmF0ZSAmJiAobHZfb3BlbiA9IGx2c19pbl92Z19vcGVuZWQodmcpKSkgeworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykKKwkJCWlmIChsdl9pc192aXNpYmxlKGx2bC0+bHYpICYmCisJCQkgICAgIWx2X2NoZWNrX25vdF9pbl91c2UobHZsLT5sdiwgMSkpIHsKKwkJCQlsb2dfZXJyb3IoIkNhbid0IGRlYWN0aXZhdGUgdm9sdW1lIGdyb3VwIFwiJXNcIiB3aXRoICVkIG9wZW4gIgorCQkJCQkgICJsb2dpY2FsIHZvbHVtZShzKSIsIHZnLT5uYW1lLCBsdl9vcGVuKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwl9CisKKwkvKiBGSVhNRSBNb3ZlIGludG8gbGlicmFyeSB3aGVyZSBjbHZtZCBjYW4gdXNlIGl0ICovCisJaWYgKGRvX2FjdGl2YXRlKQorCQljaGVja19jdXJyZW50X2JhY2t1cCh2Zyk7CisKKwlpZiAoZG9fYWN0aXZhdGUgJiYgKGFjdGl2ZSA9IGx2c19pbl92Z19hY3RpdmF0ZWQodmcpKSkgeworCQlsb2dfdmVyYm9zZSgiJWQgbG9naWNhbCB2b2x1bWUocykgaW4gdm9sdW1lIGdyb3VwIFwiJXNcIiAiCisJCQkgICAgImFscmVhZHkgYWN0aXZlIiwgYWN0aXZlLCB2Zy0+bmFtZSk7CisJCWlmIChkbWV2ZW50ZF9tb25pdG9yX21vZGUoKSAhPSBETUVWRU5URF9NT05JVE9SX0lHTk9SRSkgeworCQkJaWYgKCFfbW9uaXRvcl9sdnNfaW5fdmcoY21kLCB2ZywgZG1ldmVudGRfbW9uaXRvcl9tb2RlKCksICZtb25pdG9yZWQpKQorCQkJCXIgPSAwOworCQkJbG9nX3ZlcmJvc2UoIiVkIGV4aXN0aW5nIGxvZ2ljYWwgdm9sdW1lKHMpIGluIHZvbHVtZSAiCisJCQkJICAgICJncm91cCBcIiVzXCIgJXNtb25pdG9yZWQiLAorCQkJCSAgICBtb25pdG9yZWQsIHZnLT5uYW1lLAorCQkJCSAgICBkbWV2ZW50ZF9tb25pdG9yX21vZGUoKSA/ICIiIDogInVuIik7CisJCX0KKwl9CisKKwlpZiAoIV9hY3RpdmF0ZV9sdnNfaW5fdmcoY21kLCB2ZywgYWN0aXZhdGUpKSB7CisJCXN0YWNrOworCQlyID0gMDsKKwl9CisKKwkvKiBQcmludCBtZXNzYWdlIG9ubHkgaWYgdGhlcmUgd2FzIG5vdCBmb3VuZCBhIG1pc3NpbmcgVkcgKi8KKwlpZiAoIXZnLT5jbWRfbWlzc2luZ192Z3MpCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCIlZCBsb2dpY2FsIHZvbHVtZShzKSBpbiB2b2x1bWUgZ3JvdXAgXCIlc1wiIG5vdyBhY3RpdmUiLAorCQkJCQlsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSwgdmctPm5hbWUpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF92Z2NoYW5nZV9yZWZyZXNoKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlsb2dfdmVyYm9zZSgiUmVmcmVzaGluZyB2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgdmctPm5hbWUpOworCisJaWYgKCF2Z19yZWZyZXNoX3Zpc2libGUoY21kLCB2ZykpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX2FsbG9jKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlhbGxvY19wb2xpY3lfdCBhbGxvYzsKKworCWFsbG9jID0gKGFsbG9jX3BvbGljeV90KSBhcmdfdWludF92YWx1ZShjbWQsIGFsbG9jX0FSRywgQUxMT0NfTk9STUFMKTsKKworCS8qIEZJWE1FOiBtYWtlIGNvbnNpc3RlbnQgd2l0aCB2Z19zZXRfYWxsb2NfcG9saWN5KCkgKi8KKwlpZiAoYWxsb2MgPT0gdmctPmFsbG9jKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIGFsbG9jYXRpb24gcG9saWN5IGlzIGFscmVhZHkgJXMiLAorCQkJICBnZXRfYWxsb2Nfc3RyaW5nKHZnLT5hbGxvYykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZnX3NldF9hbGxvY19wb2xpY3kodmcsIGFsbG9jKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfcmVzaXplYWJsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlpbnQgcmVzaXplYWJsZSA9IGFyZ19pbnRfdmFsdWUoY21kLCByZXNpemVhYmxlX0FSRywgMCk7CisKKwlpZiAocmVzaXplYWJsZSAmJiB2Z19pc19yZXNpemVhYmxlKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgYWxyZWFkeSByZXNpemVhYmxlIiwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJlc2l6ZWFibGUgJiYgIXZnX2lzX3Jlc2l6ZWFibGUodmcpKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IG5vdCByZXNpemVhYmxlIiwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVzaXplYWJsZSkKKwkJdmctPnN0YXR1cyB8PSBSRVNJWkVBQkxFX1ZHOworCWVsc2UKKwkJdmctPnN0YXR1cyAmPSB+UkVTSVpFQUJMRV9WRzsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z2NoYW5nZV9jbHVzdGVyZWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJaW50IGNsdXN0ZXJlZCA9IGFyZ19pbnRfdmFsdWUoY21kLCBjbHVzdGVyZWRfQVJHLCAwKTsKKwljb25zdCBjaGFyICpsb2NrX3R5cGUgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgbG9ja3R5cGVfQVJHLCBOVUxMKTsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCXN0cnVjdCBsdl9zZWdtZW50ICptaXJyb3Jfc2VnOworCisJaWYgKGZpbmRfY29uZmlnX3RyZWVfYm9vbChjbWQsIGdsb2JhbF91c2VfbHZtbG9ja2RfQ0ZHLCBOVUxMKSkgeworCQlsb2dfZXJyb3IoImx2bWxvY2tkIHJlcXVpcmVzIHVzaW5nIHRoZSB2Z2NoYW5nZSAtLWxvY2stdHlwZSBvcHRpb24uIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsb2NrX3R5cGUgJiYgIXN0cmNtcChsb2NrX3R5cGUsICJjbHZtIikpCisJCWNsdXN0ZXJlZCA9IDE7CisKKwlpZiAoY2x1c3RlcmVkICYmIHZnX2lzX2NsdXN0ZXJlZCh2ZykpIHsKKwkJaWYgKHZnLT5zeXN0ZW1faWQgJiYgKnZnLT5zeXN0ZW1faWQpCisJCQlsb2dfd2FybigiV0FSTklORzogQ2xlYXJpbmcgaW52YWxpZCBzeXN0ZW0gSUQgJXMgZnJvbSB2b2x1bWUgZ3JvdXAgJXMuIiwKKwkJCQkgdmctPnN5c3RlbV9pZCwgdmctPm5hbWUpOworCQllbHNlIHsKKwkJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IGNsdXN0ZXJlZCIsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFjbHVzdGVyZWQgJiYgIXZnX2lzX2NsdXN0ZXJlZCh2ZykpIHsKKwkJaWYgKCghdmctPnN5c3RlbV9pZCB8fCAhKnZnLT5zeXN0ZW1faWQpICYmIGNtZC0+c3lzdGVtX2lkICYmICpjbWQtPnN5c3RlbV9pZCkKKwkJCWxvZ193YXJuKCJTZXR0aW5nIG1pc3Npbmcgc3lzdGVtIElEIG9uIFZvbHVtZSBHcm91cCAlcyB0byAlcy4iLAorCQkJCSB2Zy0+bmFtZSwgY21kLT5zeXN0ZW1faWQpOworCQllbHNlIHsKKwkJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBpcyBhbHJlYWR5IG5vdCBjbHVzdGVyZWQiLAorCQkJCSAgdmctPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoY2x1c3RlcmVkICYmICFhcmdfaXNfc2V0KGNtZCwgeWVzX0FSRykpIHsKKwkJaWYgKCFjbHZtZF9pc19ydW5uaW5nKCkpIHsKKwkJCWlmICh5ZXNfbm9fcHJvbXB0KCJMVk0gY2x1c3RlciBkYWVtb24gKGNsdm1kKSBpcyBub3QgcnVubmluZy4gIgorCQkJCQkgICJNYWtlIHZvbHVtZSBncm91cCBcIiVzXCIgY2x1c3RlcmVkICIKKwkJCQkJICAiYW55d2F5PyBbeS9uXTogIiwgdmctPm5hbWUpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiTm8gdm9sdW1lIGdyb3VwcyBjaGFuZ2VkLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCX0gZWxzZSBpZiAoIWxvY2tpbmdfaXNfY2x1c3RlcmVkKCkgJiYKKwkJCSAgICh5ZXNfbm9fcHJvbXB0KCJMVk0gbG9ja2luZyB0eXBlIGlzIG5vdCBjbHVzdGVyZWQuICIKKwkJCQkJICAiTWFrZSB2b2x1bWUgZ3JvdXAgXCIlc1wiIGNsdXN0ZXJlZCAiCisJCQkJCSAgImFueXdheT8gW3kvbl06ICIsIHZnLT5uYW1lKSA9PSAnbicpKSB7CisJCQlsb2dfZXJyb3IoIk5vIHZvbHVtZSBncm91cHMgY2hhbmdlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisjaWZkZWYgQ01JUlJPUl9SRUdJT05fQ09VTlRfTElNSVQKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJCWlmICghbHZfaXNfbWlycm9yKGx2bC0+bHYpKQorCQkJCWNvbnRpbnVlOworCQkJbWlycm9yX3NlZyA9IGZpcnN0X3NlZyhsdmwtPmx2KTsKKwkJCWlmICgobHZsLT5sdi0+c2l6ZSAvIG1pcnJvcl9zZWctPnJlZ2lvbl9zaXplKSA+CisJCQkgICAgQ01JUlJPUl9SRUdJT05fQ09VTlRfTElNSVQpIHsKKwkJCQlsb2dfZXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIGNsdXN0ZXJlZCBtb2RlOiIKKwkJCQkJICAiIE1pcnJvciByZWdpb24gc2l6ZSBvZiAlcyBpcyB0b28gc21hbGwuIiwKKwkJCQkJICB2Zy0+bmFtZSwgbHZsLT5sdi0+bmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKworCWlmICghdmdfc2V0X3N5c3RlbV9pZCh2ZywgY2x1c3RlcmVkID8gTlVMTCA6IGNtZC0+c3lzdGVtX2lkKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXZnX3NldF9jbHVzdGVyZWQodmcsIGNsdXN0ZXJlZCkpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX2xvZ2ljYWx2b2x1bWUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJdWludDMyX3QgbWF4X2x2ID0gYXJnX3VpbnRfdmFsdWUoY21kLCBsb2dpY2Fsdm9sdW1lX0FSRywgMCk7CisKKwlpZiAoIXZnX3NldF9tYXhfbHYodmcsIG1heF9sdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX3BoeXNpY2Fsdm9sdW1lcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXVpbnQzMl90IG1heF9wdiA9IGFyZ191aW50X3ZhbHVlKGNtZCwgbWF4cGh5c2ljYWx2b2x1bWVzX0FSRywgMCk7CisKKwlpZiAoIXZnX3NldF9tYXhfcHYodmcsIG1heF9wdikpCisJCXJldHVybl8wOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX3Blc2l6ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJdWludDMyX3QgZXh0ZW50X3NpemU7CisKKwlpZiAoYXJnX3VpbnQ2NF92YWx1ZShjbWQsIHBoeXNpY2FsZXh0ZW50c2l6ZV9BUkcsIDApID4gTUFYX0VYVEVOVF9TSVpFKSB7CisJCWxvZ193YXJuKCJQaHlzaWNhbCBleHRlbnQgc2l6ZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gJXMuIiwKKwkJCSBkaXNwbGF5X3NpemUoY21kLCAodWludDY0X3QpIE1BWF9FWFRFTlRfU0laRSkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlleHRlbnRfc2l6ZSA9IGFyZ191aW50X3ZhbHVlKGNtZCwgcGh5c2ljYWxleHRlbnRzaXplX0FSRywgMCk7CisJLyogRklYTUU6IHJlbW92ZSBjaGVjayAtIHJlZHVuZGFudCB3aXRoIHZnX2NoYW5nZV9wZXNpemUgKi8KKwlpZiAoZXh0ZW50X3NpemUgPT0gdmctPmV4dGVudF9zaXplKSB7CisJCWxvZ193YXJuKCJQaHlzaWNhbCBleHRlbnQgc2l6ZSBvZiBWRyAlcyBpcyBhbHJlYWR5ICVzLiIsCisJCQkgdmctPm5hbWUsIGRpc3BsYXlfc2l6ZShjbWQsICh1aW50NjRfdCkgZXh0ZW50X3NpemUpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCF2Z19zZXRfZXh0ZW50X3NpemUodmcsIGV4dGVudF9zaXplKSkKKwkJcmV0dXJuXzA7CisKKwlpZiAoIXZnX2NoZWNrX3B2X2Rldl9ibG9ja19zaXplcyh2ZykpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gY2hhbmdlIHBoeXNpY2FsIGV4dGVudCBzaXplIGZvciBWRyAlcy4iLAorCQkJICAgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfYWRkdGFnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gY2hhbmdlX3RhZyhjbWQsIHZnLCBOVUxMLCBOVUxMLCBhZGR0YWdfQVJHKTsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfZGVsdGFnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlyZXR1cm4gY2hhbmdlX3RhZyhjbWQsIHZnLCBOVUxMLCBOVUxMLCBkZWx0YWdfQVJHKTsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfdXVpZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCSAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJc3RydWN0IGx2X2xpc3QgKmx2bDsKKworCWlmIChsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBoYXMgYWN0aXZlIGxvZ2ljYWwgdm9sdW1lcyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlkX2NyZWF0ZSgmdmctPmlkKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSBuZXcgcmFuZG9tIFVVSUQgZm9yIFZHICVzLiIsCisJCQkgIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJbWVtY3B5KCZsdmwtPmx2LT5sdmlkLCAmdmctPmlkLCBzaXplb2YodmctPmlkKSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX21ldGFkYXRhX2NvcGllcyhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXVpbnQzMl90IG1kYV9jb3BpZXMgPSBhcmdfdWludF92YWx1ZShjbWQsIHZnbWV0YWRhdGFjb3BpZXNfQVJHLCBERUZBVUxUX1ZHTUVUQURBVEFDT1BJRVMpOworCisJaWYgKG1kYV9jb3BpZXMgPT0gdmdfbWRhX2NvcGllcyh2ZykpIHsKKwkJaWYgKHZnX21kYV9jb3BpZXModmcpID09IFZHTUVUQURBVEFDT1BJRVNfVU5NQU5BR0VEKQorCQkJbG9nX3dhcm4oIk51bWJlciBvZiBtZXRhZGF0YSBjb3BpZXMgZm9yIFZHICVzIGlzIGFscmVhZHkgdW5tYW5hZ2VkLiIsCisJCQkJIHZnLT5uYW1lKTsKKwkJZWxzZQorCQkJbG9nX3dhcm4oIk51bWJlciBvZiBtZXRhZGF0YSBjb3BpZXMgZm9yIFZHICVzIGlzIGFscmVhZHkgJXUuIiwKKwkJCQkgdmctPm5hbWUsIG1kYV9jb3BpZXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIXZnX3NldF9tZGFfY29waWVzKHZnLCBtZGFfY29waWVzKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfcHJvZmlsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY29uc3QgY2hhciAqb2xkX3Byb2ZpbGVfbmFtZSwgKm5ld19wcm9maWxlX25hbWU7CisJc3RydWN0IHByb2ZpbGUgKm5ld19wcm9maWxlOworCisJb2xkX3Byb2ZpbGVfbmFtZSA9IHZnLT5wcm9maWxlID8gdmctPnByb2ZpbGUtPm5hbWUgOiAiKG5vIHByb2ZpbGUpIjsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgZGV0YWNocHJvZmlsZV9BUkcpKSB7CisJCW5ld19wcm9maWxlX25hbWUgPSAiKG5vIHByb2ZpbGUpIjsKKwkJdmctPnByb2ZpbGUgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmIChhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykpCisJCQluZXdfcHJvZmlsZV9uYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIG1ldGFkYXRhcHJvZmlsZV9BUkcsIE5VTEwpOworCQllbHNlCisJCQluZXdfcHJvZmlsZV9uYW1lID0gYXJnX3N0cl92YWx1ZShjbWQsIHByb2ZpbGVfQVJHLCBOVUxMKTsKKwkJaWYgKCEobmV3X3Byb2ZpbGUgPSBhZGRfcHJvZmlsZShjbWQsIG5ld19wcm9maWxlX25hbWUsIENPTkZJR19QUk9GSUxFX01FVEFEQVRBKSkpCisJCQlyZXR1cm5fMDsKKwkJdmctPnByb2ZpbGUgPSBuZXdfcHJvZmlsZTsKKwl9CisKKwlsb2dfdmVyYm9zZSgiQ2hhbmdpbmcgY29uZmlndXJhdGlvbiBwcm9maWxlIGZvciBWRyAlczogJXMgLT4gJXMuIiwKKwkJICAgIHZnLT5uYW1lLCBvbGRfcHJvZmlsZV9uYW1lLCBuZXdfcHJvZmlsZV9uYW1lKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z2NoYW5nZV9sb2NrdHlwZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCWNvbnN0IGNoYXIgKmxvY2tfdHlwZSA9IGFyZ19zdHJfdmFsdWUoY21kLCBsb2NrdHlwZV9BUkcsIE5VTEwpOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlpbnQgbHZfbG9ja19jb3VudCA9IDA7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBzcGVjaWFsL2ZvcmNlZCBleGNlcHRpb24gdG8gY2hhbmdlIHRoZSBsb2NrIHR5cGUgdG8gbm9uZS4KKwkgKiBJdCdzIG5lZWRlZCBmb3IgcmVjb3ZlcnkgY2FzZXMgYW5kIHNraXBzIHRoZSBub3JtYWwgc3RlcHMgb2YgdW5kb2luZworCSAqIHRoZSBjdXJyZW50IGxvY2sgdHlwZS4gIEl0J3MgYSB3YXkgdG8gZm9yY2libHkgZ2V0IGFjY2VzcyB0byBhIFZHCisJICogd2hlbiB0aGUgbm9ybWFsIGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgbm90IHdvcmtpbmcuCisJICoKKwkgKiBJdCBpZ25vcmVzOiB0aGUgY3VycmVudCBsdm0gbG9ja2luZyBjb25maWcsIGx2bWxvY2tkLCB0aGUgc3RhdGUgb2YKKwkgKiB0aGUgdmcgb24gb3RoZXIgaG9zdHMsIGV0Yy4gIEl0IGlzIG1lYW50IHRvIGp1c3QgcmVtb3ZlIGFueSBsb2NraW5nCisJICogcmVsYXRlZCBtZXRhZGF0YSBmcm9tIHRoZSBWRyAoY2x1c3Rlci9sb2NrX3R5cGUgZmxhZ3MsIGxvY2tfdHlwZSwKKwkgKiBsb2NrX2FyZ3MpLgorCSAqCisJICogVGhpcyBjYW4gYmUgbmVjZXNzYXJ5IHdoZW4gbWFudWFsbHkgcmVjb3ZlcmluZyBmcm9tIGNlcnRhaW4gZmFpbHVyZXMuCisJICogZS5nLiB3aGVuIGEgcHYgaXMgbG9zdCBjb250YWluaW5nIHRoZSBsdm1sb2NrIGx2IChob2xkaW5nIHNhbmxvY2sKKwkgKiBsZWFzZXMpLCB0aGUgdmcgbG9ja190eXBlIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gbm9uZSwgYW5kIHRoZW4KKwkgKiBiYWNrIHRvIHNhbmxvY2ssIHdoaWNoIHJlY3JlYXRlcyB0aGUgbHZtbG9jayBsdiBhbmQgbGVhc2VzLgorCSAqLworCWlmICghc3RyY21wKGxvY2tfdHlwZSwgIm5vbmUiKSAmJiBhcmdfaXNfc2V0KGNtZCwgZm9yY2VfQVJHKSkgeworCQlpZiAoeWVzX25vX3Byb21wdCgiRm9yY2libHkgY2hhbmdlIFZHICVzIGxvY2sgdHlwZSB0byBub25lPyBbeS9uXTogIiwgdmctPm5hbWUpID09ICduJykgeworCQkJbG9nX2Vycm9yKCJWRyBsb2NrIHR5cGUgbm90IGNoYW5nZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZnLT5zdGF0dXMgJj0gfkNMVVNURVJFRDsKKwkJdmctPmxvY2tfdHlwZSA9ICJub25lIjsKKwkJdmctPmxvY2tfYXJncyA9IE5VTEw7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpCisJCQlsdmwtPmx2LT5sb2NrX2FyZ3MgPSBOVUxMOworCisJCXJldHVybiAxOworCX0KKworCWlmICghdmctPmxvY2tfdHlwZSkgeworCQlpZiAodmdfaXNfY2x1c3RlcmVkKHZnKSkKKwkJCXZnLT5sb2NrX3R5cGUgPSAiY2x2bSI7CisJCWVsc2UKKwkJCXZnLT5sb2NrX3R5cGUgPSAibm9uZSI7CisJfQorCisJaWYgKCFzdHJjbXAodmctPmxvY2tfdHlwZSwgbG9ja190eXBlKSkgeworCQlsb2dfd2FybigiTmV3IGxvY2sgdHlwZSAlcyBtYXRjaGVzIHRoZSBjdXJyZW50IGxvY2sgdHlwZSAlcy4iLAorCQkJIGxvY2tfdHlwZSwgdmctPmxvY2tfdHlwZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpICYmIGlzX2xvY2tkX3R5cGUobG9ja190eXBlKSkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgbG9jayB0eXBlIGRpcmVjdGx5IGZyb20gXCIlc1wiIHRvIFwiJXNcIi4iLAorCQkJICB2Zy0+bG9ja190eXBlLCBsb2NrX3R5cGUpOworCQlsb2dfZXJyb3IoIkZpcnN0IGNoYW5nZSBsb2NrIHR5cGUgdG8gXCJub25lXCIsIHRoZW4gdG8gXCIlc1wiLiIsCisJCQkgIGxvY2tfdHlwZSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2hlbiBsdm0gaXMgY3VycmVudGx5IHVzaW5nIGNsdm0sIHRoaXMgZnVuY3Rpb24gaXMganVzdCBhbiBhbHRlcm5hdGl2ZQorCSAqIHRvIHZnY2hhbmdlIC1je3ksbn0sIGFuZCBjYW46CisJICogLSBjaGFuZ2Ugbm9uZSB0byBjbHZtCisJICogLSBjaGFuZ2UgY2x2bSB0byBub25lCisJICogLSBpdCBDQU5OT1QgY2hhbmdlIHRvIG9yIGZyb20gYSBsb2NrZCB0eXBlCisJICovCisJaWYgKGxvY2tpbmdfaXNfY2x1c3RlcmVkKCkpIHsKKwkJaWYgKGlzX2xvY2tkX3R5cGUobG9ja190eXBlKSkgeworCQkJbG9nX2Vycm9yKCJDaGFuZ2luZyB0byBsb2NrIHR5cGUgJXMgcmVxdWlyZXMgbHZtbG9ja2QuIiwgbG9ja190eXBlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIF92Z2NoYW5nZV9jbHVzdGVyZWQoY21kLCB2Zyk7CisJfQorCisJLyoKKwkgKiBXaGVuIGx2bSBpcyBjdXJyZW50bHkgdXNpbmcgbHZtbG9ja2QsIHRoaXMgZnVuY3Rpb24gY2FuOgorCSAqIC0gY2hhbmdlIG5vbmUgdG8gbG9ja2QgdHlwZQorCSAqIC0gY2hhbmdlIG5vbmUgdG8gY2x2bSAod2l0aCB3YXJuaW5nIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIHVzZSBpdCkKKwkgKiAtIGNoYW5nZSBsb2NrZCB0eXBlIHRvIG5vbmUKKwkgKiAtIGNoYW5nZSBsb2NrZCB0eXBlIHRvIGNsdm0gKHdpdGggd2FybmluZyBhYm91dCBub3QgYmVpbmcgYWJsZSB0byB1c2UgaXQpCisJICogLSBjaGFuZ2UgY2x2bSB0byBub25lCisJICogLSBjaGFuZ2UgY2x2bSB0byBsb2NrZCB0eXBlCisJICovCisKKwlpZiAobHZzX2luX3ZnX2FjdGl2YXRlZCh2ZykpIHsKKwkJbG9nX2Vycm9yKCJDaGFuZ2luZyBWRyAlcyBsb2NrIHR5cGUgbm90IGFsbG93ZWQgd2l0aCBhY3RpdmUgTFZzIiwKKwkJCSAgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBub25lIHRvIGNsdm0gKi8KKwlpZiAoIXN0cmNtcCh2Zy0+bG9ja190eXBlLCAibm9uZSIpICYmICFzdHJjbXAobG9ja190eXBlLCAiY2x2bSIpKSB7CisJCWxvZ193YXJuKCJOZXcgY2x2bSBsb2NrIHR5cGUgd2lsbCBub3QgYmUgdXNhYmxlIHdpdGggbHZtbG9ja2QuIik7CisJCXZnLT5zdGF0dXMgfD0gQ0xVU1RFUkVEOworCQl2Zy0+bG9ja190eXBlID0gImNsdm0iOyAvKiB0aGlzIGlzIG9wdGlvbmFsICovCisJCXJldHVybiAxOworCX0KKworCS8qIGNsdm0gdG8gbm9uZSAqLworCWlmICghc3RyY21wKHZnLT5sb2NrX3R5cGUsICJjbHZtIikgJiYgIXN0cmNtcChsb2NrX3R5cGUsICJub25lIikpIHsKKwkJdmctPnN0YXR1cyAmPSB+Q0xVU1RFUkVEOworCQl2Zy0+bG9ja190eXBlID0gIm5vbmUiOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjbHZtIHRvIC4uLiwgZmlyc3QgdW5kbyBjbHZtICovCisJaWYgKCFzdHJjbXAodmctPmxvY2tfdHlwZSwgImNsdm0iKSkgeworCQl2Zy0+c3RhdHVzICY9IH5DTFVTVEVSRUQ7CisJfQorCisJLyoKKwkgKiBsb2NrZCB0eXBlIHRvIC4uLiwgZmlyc3QgdW5kbyBsb2NrZCB0eXBlCisJICovCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJaWYgKCFsb2NrZF9mcmVlX3ZnX2JlZm9yZShjbWQsIHZnLCAxKSkKKwkJCXJldHVybiAwOworCisJCWxvY2tkX2ZyZWVfdmdfZmluYWwoY21kLCB2Zyk7CisKKwkJdmctPnN0YXR1cyAmPSB+Q0xVU1RFUkVEOworCQl2Zy0+bG9ja190eXBlID0gIm5vbmUiOworCQl2Zy0+bG9ja19hcmdzID0gTlVMTDsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykKKwkJCWx2bC0+bHYtPmxvY2tfYXJncyA9IE5VTEw7CisJfQorCisJLyogLi4uIHRvIGNsdm0gKi8KKwlpZiAoIXN0cmNtcChsb2NrX3R5cGUsICJjbHZtIikpIHsKKwkJbG9nX3dhcm4oIk5ldyBjbHZtIGxvY2sgdHlwZSB3aWxsIG5vdCBiZSB1c2FibGUgd2l0aCBsdm1sb2NrZC4iKTsKKwkJdmctPnN0YXR1cyB8PSBDTFVTVEVSRUQ7CisJCXZnLT5sb2NrX3R5cGUgPSAiY2x2bSI7IC8qIHRoaXMgaXMgb3B0aW9uYWwgKi8KKwkJdmctPnN5c3RlbV9pZCA9IE5VTEw7CisJCXJldHVybiAxOworCX0KKworCS8qIC4uLiB0byBsb2NrZCB0eXBlICovCisJaWYgKGlzX2xvY2tkX3R5cGUobG9ja190eXBlKSkgeworCQkvKgorCQkgKiBGb3IgbG9ja190eXBlIGRsbSwgbG9ja2RfaW5pdF92ZygpIHdpbGwgZG8gYSBzaW5nbGUKKwkJICogdmdfd3JpdGUoKSB0aGF0IHNldHMgbG9ja190eXBlLCBzZXRzIGxvY2tfYXJncywgY2xlYXJzCisJCSAqIHN5c3RlbV9pZCwgYW5kIHNldHMgYWxsIExWIGxvY2tfYXJncyB0byBkbG0uCisJCSAqIEZvciBsb2NrX3R5cGUgc2FubG9jaywgbG9ja2RfaW5pdF92ZygpIG5lZWRzIHRvIGtub3cKKwkJICogaG93IG1hbnkgTFYgbG9ja3MgYXJlIG5lZWRlZCBzbyB0aGF0IGl0IGNhbiBtYWtlIHRoZQorCQkgKiBzYW5sb2NrIGx2IGxhcmdlIGVub3VnaC4KKwkJICovCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCQlsdiA9IGx2bC0+bHY7CisKKwkJCWlmIChsb2NrZF9sdl91c2VzX2xvY2sobHYpKSB7CisJCQkJbHZfbG9ja19jb3VudCsrOworCisJCQkJaWYgKCFzdHJjbXAobG9ja190eXBlLCAiZGxtIikpCisJCQkJCWx2LT5sb2NrX2FyZ3MgPSAiZGxtIjsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFNlZSBiZWxvdy4gIFdlIGNhbm5vdCBzZXQgdmFsaWQgTFYgbG9ja19hcmdzIHVudGlsIHN0YWdlIDEKKwkJICogb2YgdGhlIGNoYW5nZSBpcyBkb25lLCBzbyB3ZSBuZWVkIHRvIHNraXAgdGhlIHZhbGlkYXRpb24gb2YKKwkJICogdGhlIGxvY2tfYXJncyBkdXJpbmcgc3RhZ2UgMS4KKwkJICovCisJCWlmICghc3RyY21wKGxvY2tfdHlwZSwgInNhbmxvY2siKSkKKwkJCXZnLT5za2lwX3ZhbGlkYXRlX2xvY2tfYXJncyA9IDE7CisKKwkJdmctPnN5c3RlbV9pZCA9IE5VTEw7CisKKwkJaWYgKCFsb2NrZF9pbml0X3ZnKGNtZCwgdmcsIGxvY2tfdHlwZSwgbHZfbG9ja19jb3VudCkpIHsKKwkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgbG9jayBhcmdzIGZvciBsb2NrIHR5cGUgJXMiLCBsb2NrX3R5cGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBGb3IgbG9ja190eXBlIHNhbmxvY2ssIHRoZXJlIG11c3QgYmUgbXVsdGlwbGUgc3RlcHMKKwkJICogYmVjYXVzZSB0aGUgVkcgbmVlZHMgYW4gYWN0aXZlIGx2bWxvY2sgTFYgYmVmb3JlCisJCSAqIExWIGxvY2sgYXJlYXMgY2FuIGJlIGFsbG9jYXRlZCwgd2hpY2ggbXVzdCBiZSBkb25lCisJCSAqIGJlZm9yZSBMViBsb2NrX2FyZ3MgYXJlIHdyaXR0ZW4uICBTbywgdGhlIExWIGxvY2tfYXJncworCQkgKiByZW1haW4gdW5zZXQgZHVyaW5nIHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgY29udmVyc2lvbi4KKwkJICoKKwkJICogU3RhZ2UgMToKKwkJICogbG9ja2RfaW5pdF92ZygpIGNyZWF0ZXMgYW5kIGFjdGl2YXRlcyB0aGUgbHZtbG9jayBMViwKKwkJICogdGhlbiBzZXRzIGxvY2tfdHlwZSwgc2V0cyBsb2NrX2FyZ3MsIGFuZCBjbGVhcnMgc3lzdGVtX2lkLgorCQkgKgorCQkgKiBTdGFnZSAyOgorCQkgKiBXZSBnZXQgaGVyZSwgYW5kIGNhbiBub3cgc2V0IExWIGxvY2tfYXJncy4gIFRoaXMgdXNlcworCQkgKiB0aGUgc3RhbmRhcmQgY29kZSBwYXRoIGZvciBhbGxvY2F0aW5nIExWIGxvY2tzIGluCisJCSAqIHZnX3dyaXRlKCkgYnkgc2V0dGluZyBMViBsb2NrX2FyZ3MgdG8gInBlbmRpbmciLAorCQkgKiB3aGljaCB0ZWxscyB2Z193cml0ZSgpIHRvIGNhbGwgbG9ja2RfaW5pdF9sdigpCisJCSAqIGFuZCBzZXRzIHRoZSBsdi0+bG9ja19hcmdzIHZhbHVlIGJlZm9yZSB3cml0aW5nIHRoZSBWRy4KKwkJICovCisJCWlmICghc3RyY21wKGxvY2tfdHlwZSwgInNhbmxvY2siKSkgeworCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJCQlsdiA9IGx2bC0+bHY7CisJCQkJaWYgKGxvY2tkX2x2X3VzZXNfbG9jayhsdikpCisJCQkJCWx2LT5sb2NrX2FyZ3MgPSAicGVuZGluZyI7CisJCQl9CisKKwkJCXZnLT5za2lwX3ZhbGlkYXRlX2xvY2tfYXJncyA9IDA7CisJCX0KKworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiAuLi4gdG8gbm9uZSAqLworCWlmICghc3RyY21wKGxvY2tfdHlwZSwgIm5vbmUiKSkgeworCQl2Zy0+bG9ja190eXBlID0gTlVMTDsKKwkJdmctPnN5c3RlbV9pZCA9IGNtZC0+c3lzdGVtX2lkID8gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCBjbWQtPnN5c3RlbV9pZCkgOiBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwlsb2dfZXJyb3IoIkNhbm5vdCBjaGFuZ2UgdG8gdW5rbm93biBsb2NrIHR5cGUgJXMiLCBsb2NrX3R5cGUpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSBsb2NhbCBob3N0IGlzIGFsbG93ZWQgdG8gdXNlIHRoZQorICogVkcuICBFaXRoZXIgdGhlIFZHIGhhcyBubyBzeXN0ZW1faWQsIG9yIHRoZSBWRyBhbmQgaG9zdCBoYXZlIG1hdGNoaW5nCisgKiBzeXN0ZW1faWRzLCBvciB0aGUgaG9zdCBoYXMgdGhlIFZHJ3MgY3VycmVudCBzeXN0ZW1faWQgaW4gaXRzCisgKiBleHRyYV9zeXN0ZW1faWRzIGxpc3QuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgc3lzdGVtX2lkCisgKiBvZiBhIGZvcmVpZ24gVkcgKFZHIG93bmVkIGJ5IGFub3RoZXIgaG9zdCkuCisgKi8KK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX3N5c3RlbV9pZChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJY29uc3QgY2hhciAqc3lzdGVtX2lkOworCWNvbnN0IGNoYXIgKnN5c3RlbV9pZF9hcmdfc3RyID0gYXJnX3N0cl92YWx1ZShjbWQsIHN5c3RlbWlkX0FSRywgTlVMTCk7CisKKwkvKiBGSVhNRSBNZXJnZSB3aXRoIHZnX3NldF9zeXN0ZW1faWQoKSAqLworCWlmIChzeXN0ZW1pZF9vbl9wdnModmcpKSB7CisJCWxvZ19lcnJvcigiTWV0YWRhdGEgZm9ybWF0ICVzIGRvZXMgbm90IHN1cHBvcnQgdGhpcyB0eXBlIG9mIHN5c3RlbSBJRC4iLAorCQkJICB2Zy0+ZmlkLT5mbXQtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzeXN0ZW1faWQgPSBzeXN0ZW1faWRfZnJvbV9zdHJpbmcoY21kLCBzeXN0ZW1faWRfYXJnX3N0cikpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNldCBzeXN0ZW0gSUQuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZnLT5zeXN0ZW1faWQsIHN5c3RlbV9pZCkpIHsKKwkJbG9nX2Vycm9yKCJWb2x1bWUgR3JvdXAgc3lzdGVtIElEIGlzIGFscmVhZHkgXCIlc1wiLiIsIHZnLT5zeXN0ZW1faWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISpzeXN0ZW1faWQgJiYgY21kLT5zeXN0ZW1faWQgJiYgc3RyY21wKHN5c3RlbV9pZCwgY21kLT5zeXN0ZW1faWQpKSB7CisJCWxvZ193YXJuKCJXQVJOSU5HOiBSZW1vdmluZyB0aGUgc3lzdGVtIElEIGFsbG93cyB1bnNhZmUgYWNjZXNzIGZyb20gb3RoZXIgaG9zdHMuIik7CisKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgeWVzX0FSRykgJiYKKwkJICAgIHllc19ub19wcm9tcHQoIlJlbW92ZSBzeXN0ZW0gSUQgJXMgZnJvbSB2b2x1bWUgZ3JvdXAgJXM/IFt5L25dOiAiLAorCQkJCSAgdmctPnN5c3RlbV9pZCwgdmctPm5hbWUpID09ICduJykgeworCQkJbG9nX2Vycm9yKCJTeXN0ZW0gSUQgb2Ygdm9sdW1lIGdyb3VwICVzIG5vdCBjaGFuZ2VkLiIsIHZnLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCpzeXN0ZW1faWQgJiYgKCFjbWQtPnN5c3RlbV9pZCB8fCBzdHJjbXAoc3lzdGVtX2lkLCBjbWQtPnN5c3RlbV9pZCkpKSB7CisJCWlmIChsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQkJbG9nX2Vycm9yKCJMb2dpY2FsIFZvbHVtZXMgaW4gVkcgJXMgbXVzdCBiZSBkZWFjdGl2YXRlZCBiZWZvcmUgc3lzdGVtIElEIGNhbiBiZSBjaGFuZ2VkLiIsCisJCQkJICB2Zy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChjbWQtPnN5c3RlbV9pZCkKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBSZXF1ZXN0ZWQgc3lzdGVtIElEICVzIGRvZXMgbm90IG1hdGNoIGxvY2FsIHN5c3RlbSBJRCAlcy4iLAorCQkJCSBzeXN0ZW1faWQsIGNtZC0+c3lzdGVtX2lkID8gOiAiIik7CisJCWVsc2UKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBObyBsb2NhbCBzeXN0ZW0gSUQgaXMgc2V0LiIpOworCQlsb2dfd2FybigiV0FSTklORzogVm9sdW1lIGdyb3VwICVzIG1pZ2h0IGJlY29tZSBpbmFjY2Vzc2libGUgZnJvbSB0aGlzIG1hY2hpbmUuIiwKKwkJCSB2Zy0+bmFtZSk7CisKKwkJaWYgKCFhcmdfaXNfc2V0KGNtZCwgeWVzX0FSRykgJiYKKwkJICAgIHllc19ub19wcm9tcHQoIlNldCBmb3JlaWduIHN5c3RlbSBJRCAlcyBvbiB2b2x1bWUgZ3JvdXAgJXM/IFt5L25dOiAiLAorCQkJCSAgc3lzdGVtX2lkLCB2Zy0+bmFtZSkgPT0gJ24nKSB7CisJCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCAlcyBzeXN0ZW0gSUQgbm90IGNoYW5nZWQuIiwgdmctPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlsb2dfdmVyYm9zZSgiQ2hhbmdpbmcgc3lzdGVtIElEIGZvciBWRyAlcyBmcm9tIFwiJXNcIiB0byBcIiVzXCIuIiwKKwkJICAgIHZnLT5uYW1lLCB2Zy0+c3lzdGVtX2lkLCBzeXN0ZW1faWQpOworCisJdmctPnN5c3RlbV9pZCA9IHN5c3RlbV9pZDsKKwkKKwlpZiAodmctPmx2bTFfc3lzdGVtX2lkKQorCQkqdmctPmx2bTFfc3lzdGVtX2lkID0gJ1wwJzsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9wYXNzZXNfbG9ja19zdGFydF9maWx0ZXIoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCQkgICAgIGNvbnN0IGludCBjZmdfaWQpCit7CisJY29uc3Qgc3RydWN0IGRtX2NvbmZpZ19ub2RlICpjbjsKKwljb25zdCBzdHJ1Y3QgZG1fY29uZmlnX3ZhbHVlICpjdjsKKwljb25zdCBjaGFyICpzdHI7CisKKwkvKiB1bmRlZmluZWQgbGlzdCBtZWFucyBubyByZXN0cmljdGlvbnMsIGFsbCB2ZyBuYW1lcyBwYXNzICovCisKKwljbiA9IGZpbmRfY29uZmlnX3RyZWVfYXJyYXkoY21kLCBjZmdfaWQsIE5VTEwpOworCWlmICghY24pCisJCXJldHVybiAxOworCisJLyogd2l0aCBhIGRlZmluZWQgbGlzdCwgdGhlIHZnIG5hbWUgbXVzdCBiZSBpbmNsdWRlZCB0byBwYXNzICovCisKKwlmb3IgKGN2ID0gY24tPnY7IGN2OyBjdiA9IGN2LT5uZXh0KSB7CisJCWlmIChjdi0+dHlwZSA9PSBETV9DRkdfRU1QVFlfQVJSQVkpCisJCQlicmVhazsKKwkJaWYgKGN2LT50eXBlICE9IERNX0NGR19TVFJJTkcpIHsKKwkJCWxvZ19lcnJvcigiSWdub3JpbmcgaW52YWxpZCBzdHJpbmcgaW4gbG9ja19zdGFydCBsaXN0Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlzdHIgPSBjdi0+di5zdHI7CisJCWlmICghKnN0cikgeworCQkJbG9nX2Vycm9yKCJJZ25vcmluZyBlbXB0eSBzdHJpbmcgaW4gY29uZmlnIGZpbGUiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogaWdub3JpbmcgdGFncyBmb3Igbm93ICovCisKKwkJaWYgKCFzdHJjbXAoc3RyLCB2Zy0+bmFtZSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfdmdjaGFuZ2VfbG9ja19zdGFydChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJc3RydWN0IHZnY2hhbmdlX3BhcmFtcyAqdnApCit7CisJY29uc3QgY2hhciAqc3RhcnRfb3B0ID0gYXJnX3N0cl92YWx1ZShjbWQsIGxvY2tvcHRfQVJHLCBOVUxMKTsKKwlpbnQgYXV0b19vcHQgPSAwOworCWludCByOworCisJaWYgKCFpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKQorCQlyZXR1cm4gMTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgZm9yY2VfQVJHKSkKKwkJZ290byBkb19zdGFydDsKKworCS8qCisJICogUmVjb2duaXplIGJvdGggImF1dG8iIGFuZCAiYXV0b25vd2FpdCIgb3B0aW9ucy4KKwkgKiBBbnkgd2FpdGluZyBpcyBkb25lIGF0IHRoZSBlbmQgb2YgdmdjaGFuZ2UuCisJICovCisJaWYgKHN0YXJ0X29wdCAmJiAhc3RybmNtcChzdGFydF9vcHQsICJhdXRvIiwgNCkpCisJCWF1dG9fb3B0ID0gMTsKKworCWlmICghX3Bhc3Nlc19sb2NrX3N0YXJ0X2ZpbHRlcihjbWQsIHZnLCBhY3RpdmF0aW9uX2xvY2tfc3RhcnRfbGlzdF9DRkcpKSB7CisJCWxvZ192ZXJib3NlKCJOb3Qgc3RhcnRpbmcgJXMgc2luY2UgaXQgZG9lcyBub3QgcGFzcyBsb2NrX3N0YXJ0X2xpc3QiLCB2Zy0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChhdXRvX29wdCAmJiAhX3Bhc3Nlc19sb2NrX3N0YXJ0X2ZpbHRlcihjbWQsIHZnLCBhY3RpdmF0aW9uX2F1dG9fbG9ja19zdGFydF9saXN0X0NGRykpIHsKKwkJbG9nX3ZlcmJvc2UoIk5vdCBzdGFydGluZyAlcyBzaW5jZSBpdCBkb2VzIG5vdCBwYXNzIGF1dG9fbG9ja19zdGFydF9saXN0IiwgdmctPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKK2RvX3N0YXJ0OgorCXIgPSBsb2NrZF9zdGFydF92ZyhjbWQsIHZnLCAwKTsKKworCWlmIChyKQorCQl2cC0+bG9ja19zdGFydF9jb3VudCsrOworCWlmICghc3RyY21wKHZnLT5sb2NrX3R5cGUsICJzYW5sb2NrIikpCisJCXZwLT5sb2NrX3N0YXJ0X3NhbmxvY2sgPSAxOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX3ZnY2hhbmdlX2xvY2tfc3RvcChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcpCit7CisJcmV0dXJuIGxvY2tkX3N0b3BfdmcoY21kLCB2Zyk7Cit9CisKK3N0YXRpYyBpbnQgdmdjaGFuZ2Vfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdmdjaGFuZ2VfcGFyYW1zICp2cCA9IChzdHJ1Y3QgdmdjaGFuZ2VfcGFyYW1zICopaGFuZGxlLT5jdXN0b21faGFuZGxlOworCWludCByZXQgPSBFQ01EX1BST0NFU1NFRDsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJaW50IGFyZzsKKwkJaW50ICgqZm4pKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zyk7CisJfSBfdmdjaGFuZ2VfYXJnc1tdID0geworCQl7IGxvZ2ljYWx2b2x1bWVfQVJHLCAmX3ZnY2hhbmdlX2xvZ2ljYWx2b2x1bWUgfSwKKwkJeyBtYXhwaHlzaWNhbHZvbHVtZXNfQVJHLCAmX3ZnY2hhbmdlX3BoeXNpY2Fsdm9sdW1lcyB9LAorCQl7IHJlc2l6ZWFibGVfQVJHLCAmX3ZnY2hhbmdlX3Jlc2l6ZWFibGUgfSwKKwkJeyBkZWx0YWdfQVJHLCAmX3ZnY2hhbmdlX2RlbHRhZyB9LAorCQl7IGFkZHRhZ19BUkcsICZfdmdjaGFuZ2VfYWRkdGFnIH0sCisJCXsgcGh5c2ljYWxleHRlbnRzaXplX0FSRywgJl92Z2NoYW5nZV9wZXNpemUgfSwKKwkJeyB1dWlkX0FSRywgJl92Z2NoYW5nZV91dWlkIH0sCisJCXsgYWxsb2NfQVJHLCAmX3ZnY2hhbmdlX2FsbG9jIH0sCisJCXsgY2x1c3RlcmVkX0FSRywgJl92Z2NoYW5nZV9jbHVzdGVyZWQgfSwKKwkJeyB2Z21ldGFkYXRhY29waWVzX0FSRywgJl92Z2NoYW5nZV9tZXRhZGF0YV9jb3BpZXMgfSwKKwkJeyBtZXRhZGF0YXByb2ZpbGVfQVJHLCAmX3ZnY2hhbmdlX3Byb2ZpbGUgfSwKKwkJeyBwcm9maWxlX0FSRywgJl92Z2NoYW5nZV9wcm9maWxlIH0sCisJCXsgZGV0YWNocHJvZmlsZV9BUkcsICZfdmdjaGFuZ2VfcHJvZmlsZSB9LAorCQl7IGxvY2t0eXBlX0FSRywgJl92Z2NoYW5nZV9sb2NrdHlwZSB9LAorCQl7IHN5c3RlbWlkX0FSRywgJl92Z2NoYW5nZV9zeXN0ZW1faWQgfSwKKwl9OworCisJaWYgKHZnX2lzX2V4cG9ydGVkKHZnKSAmJgorCSAgICAhKGFyZ19pc19zZXQoY21kLCBsb2Nrc3RvcF9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBsb2Nrc3RhcnRfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIGV4cG9ydGVkIiwgdmdfbmFtZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwkvKgorCSAqIEZJWE1FOiBERUZBVUxUX0JBQ0tHUk9VTkRfUE9MTElORyBzaG91bGQgYmUgInVuc3BlY2lmaWVkIi4KKwkgKiBJZiAtLXBvbGwgaXMgZXhwbGljaXRseSBwcm92aWRlZCB1c2UgaXQ7IG90aGVyd2lzZSBwb2xsaW5nCisJICogc2hvdWxkIG9ubHkgYmUgc3RhcnRlZCBpZiB0aGUgTFYgaXMgbm90IGFscmVhZHkgYWN0aXZlLiBTbzoKKwkgKiAxKSBjaGFuZ2UgdGhlIGFjdGl2YXRpb24gY29kZSB0byBzYXkgaWYgdGhlIExWIHdhcyBhY3R1YWxseSBhY3RpdmF0ZWQKKwkgKiAyKSBtYWtlIHBvbGxpbmcgb2YgYW4gTFYgdGlnaHRseSBjb3VwbGVkIHdpdGggTFYgYWN0aXZhdGlvbgorCSAqCisJICogRG8gbm90IGluaXRpYXRlIGFueSBwb2xsaW5nIGlmIC0tc3lzaW5pdCBvcHRpb24gaXMgdXNlZC4KKwkgKi8KKwlpbml0X2JhY2tncm91bmRfcG9sbGluZyhhcmdfaXNfc2V0KGNtZCwgc3lzaW5pdF9BUkcpID8gMCA6CisJCQkJCQlhcmdfaW50X3ZhbHVlKGNtZCwgcG9sbF9BUkcsCisJCQkJCQlERUZBVUxUX0JBQ0tHUk9VTkRfUE9MTElORykpOworCisJZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUoX3ZnY2hhbmdlX2FyZ3MpOyArK2kpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBfdmdjaGFuZ2VfYXJnc1tpXS5hcmcpKSB7CisJCQlpZiAoIWFyY2hpdmUodmcpKQorCQkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJCWlmICghX3ZnY2hhbmdlX2FyZ3NbaV0uZm4oY21kLCB2ZykpCisJCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQl9CisJfQorCisJaWYgKHZnX2lzX2FyY2hpdmVkKHZnKSkgeworCQlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCQliYWNrdXAodmcpOworCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkIiwgdmctPm5hbWUpOworCisJCS8qIEZJWE1FOiBmaXggY2x2bWQgYnVnIGFuZCB0YWtlIERMTSBsb2NrIGZvciBub24gY2x1c3RlcmVkIFZHcy4gKi8KKwkJaWYgKGFyZ19pc19zZXQoY21kLCBjbHVzdGVyZWRfQVJHKSAmJgorCQkgICAgdmdfaXNfY2x1c3RlcmVkKHZnKSAmJiAvKiBqdXN0IHN3aXRjaGVkIHRvIGNsdXN0ZXJlZCAqLworCQkgICAgbG9ja2luZ19pc19jbHVzdGVyZWQoKSAmJgorCQkgICAgbG9ja2luZ19zdXBwb3J0c19yZW1vdGVfcXVlcmllcygpKQorCQkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJCQlpZiAoKGx2X2xvY2tfaG9sZGVyKGx2bC0+bHYpICE9IGx2bC0+bHYpIHx8CisJCQkJICAgICFsdl9pc19hY3RpdmUobHZsLT5sdikpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKCFhY3RpdmF0ZV9sdl9leGNsX2xvY2FsKGNtZCwgbHZsLT5sdikgfHwKKwkJCQkgICAgIWx2X2lzX2FjdGl2ZV9leGNsdXNpdmVfbG9jYWxseShsdmwtPmx2KSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbid0IHJlYWN0aXZlIGxvZ2ljYWwgdm9sdW1lICVzLCAiCisJCQkJCQkgICJwbGVhc2UgZml4IG1hbnVhbGx5LiIsCisJCQkJCQkgIGRpc3BsYXlfbHZuYW1lKGx2bC0+bHYpKTsKKwkJCQkJcmV0ID0gRUNNRF9GQUlMRUQ7CisJCQkJfQorCisJCQkJaWYgKGx2X2lzX21pcnJvcihsdmwtPmx2KSkKKwkJCQkJLyogR2l2ZSBoaW50IGZvciBjbHVzdGVyZWQgbWlycm9yaW5nICovCisJCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJGb3IgY2x1c3RlcmVkIG1pcnJvcmluZyBvZiAlcyAiCisJCQkJCQkJCSJkZWFjdGl2YXRpb24gYW5kIGFjdGl2YXRpb24gaXMgbmVlZGVkLiIsCisJCQkJCQkJCWRpc3BsYXlfbHZuYW1lKGx2bC0+bHYpKTsKKwkJCX0KKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykpIHsKKwkJaWYgKCF2Z2NoYW5nZV9hY3RpdmF0ZShjbWQsIHZnLCAoYWN0aXZhdGlvbl9jaGFuZ2VfdCkKKwkJCQkgICAgICAgYXJnX3VpbnRfdmFsdWUoY21kLCBhY3RpdmF0ZV9BUkcsIENIQU5HRV9BWSkpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcmVmcmVzaF9BUkcpKSB7CisJCS8qIHJlZnJlc2hlcyB0aGUgdmlzaWJsZSBMVnMgKHdoaWNoIHN0YXJ0cyBwb2xsaW5nKSAqLworCQlpZiAoIV92Z2NoYW5nZV9yZWZyZXNoKGNtZCwgdmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0KKworCWlmICghYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykgJiYKKwkgICAgIWFyZ19pc19zZXQoY21kLCByZWZyZXNoX0FSRykgJiYKKwkgICAgYXJnX2lzX3NldChjbWQsIG1vbml0b3JfQVJHKSkgeworCQkvKiAtYXkqIHdpbGwgaGF2ZSBhbHJlYWR5IGRvbmUgbW9uaXRvcmluZyBjaGFuZ2VzICovCisJCWlmICghX3ZnY2hhbmdlX21vbml0b3JpbmcoY21kLCB2ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCFhcmdfaXNfc2V0KGNtZCwgcmVmcmVzaF9BUkcpICYmCisJICAgICF2Z2NoYW5nZV9iYWNrZ3JvdW5kX3BvbGxpbmcoY21kLCB2ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGxvY2tzdGFydF9BUkcpKSB7CisJCWlmICghX3ZnY2hhbmdlX2xvY2tfc3RhcnQoY21kLCB2ZywgdnApKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIGxvY2tzdG9wX0FSRykpIHsKKwkJaWYgKCFfdmdjaGFuZ2VfbG9ja19zdG9wKGNtZCwgdmcpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCX0KKworICAgICAgICByZXR1cm4gcmV0OworfQorCisvKgorICogdmdjaGFuZ2UgY2FuIGRvIGRpZmZlcmVudCB0aGluZ3MgdGhhdCByZXF1aXJlIGRpZmZlcmVudAorICogbG9ja2luZywgc28gbG9vayBhdCBlYWNoIG9mIHRob3NlIHRoaW5ncyBoZXJlLgorICoKKyAqIFNldCB1cCBvdmVycmlkZXMgZm9yIHRoZSBkZWZhdWx0IFZHIGxvY2tpbmcgZm9yIHZhcmlvdXMgc3BlY2lhbCBjYXNlcy4KKyAqIFRoZSBWRyBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgaW4gcHJvY2Vzc19lYWNoX3ZnLgorICoKKyAqIEFjcXVpcmUgdGhlIGdsIGxvY2sgYWNjb3JkaW5nIHRvIHdoaWNoIGtpbmQgb2YgdmdjaGFuZ2UgY29tbWFuZCB0aGlzIGlzLgorICovCisKK3N0YXRpYyBpbnQgX2xvY2tkX3ZnY2hhbmdlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogVGhlIGRlZmF1bHQgdmcgbG9jayBtb2RlIGlzIGV4LCBidXQgdGhlc2Ugb3B0aW9ucyBvbmx5IG5lZWQgc2guICovCisKKwlpZiAoIWx2bWxvY2tkX3VzZSgpICYmIGFyZ19pc19zZXQoY21kLCBsb2NrdHlwZV9BUkcpKSB7CisJCWxvZ19lcnJvcigiVXNpbmcgbG9jayB0eXBlIHJlcXVpcmVzIGx2bWxvY2tkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWx2bWxvY2tkX3VzZSgpICYmIChhcmdfaXNfc2V0KGNtZCwgbG9ja3N0YXJ0X0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGxvY2tzdG9wX0FSRykpKSB7CisJCWxvZ19lcnJvcigiVXNpbmcgbG9jayBzdGFydCBhbmQgbG9jayBzdG9wIHJlcXVpcmVzIGx2bWxvY2tkLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKSkgeworCQljbWQtPmxvY2tkX3ZnX2RlZmF1bHRfc2ggPSAxOworCQkvKiBBbGxvdyBkZWFjdGl2YXRpbmcgaWYgbG9ja3MgZmFpbC4gKi8KKwkJaWYgKGlzX2NoYW5nZV9hY3RpdmF0aW5nKChhY3RpdmF0aW9uX2NoYW5nZV90KWFyZ191aW50X3ZhbHVlKGNtZCwgYWN0aXZhdGVfQVJHLCBDSEFOR0VfQVkpKSkKKwkJCWNtZC0+bG9ja2RfdmdfZW5mb3JjZV9zaCA9IDE7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBsb2Nrc3RvcF9BUkcpKQorCQljbWQtPmxvY2tkX3ZnX2RlZmF1bHRfc2ggPSAxOworCisJLyoKKwkgKiBTdGFydGluZyBsb2Nrc3BhY2VzLiAgRm9yIFZHcyBub3QgeWV0IHN0YXJ0ZWQsIGxvY2tzIGFyZSBub3QKKwkgKiBhdmFpbGFibGUgdG8gYWNxdWlyZSwgYW5kIGZvciBWR3MgYWxyZWFkeSBzdGFydGVkLCB0aGVyZSdzIG5vdGhpbmcKKwkgKiB0byBkbywgc28gZGlzYWJsZSBWRyBsb2Nrcy4gIFRyeSB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jayBzaCB0bworCSAqIHZhbGlkYXRlIHRoZSBjYWNoZSAoaWYgbm8gZ2wgaXMgYXZhaWxhYmxlLCBsb2NrZF9nbCB3aWxsIGZvcmNlIGEKKwkgKiBjYWNoZSB2YWxpZGF0aW9uKS4gIElmIHRoZSBnbG9iYWwgbG9jayBpcyBhdmFpbGFibGUsIGl0IGNhbiBiZQorCSAqIGJlbmZpY2lhbCB0byBob2xkIHNoIHRvIHNlcmlhbGl6ZSBsb2NrLXN0YXJ0IHdpdGggdmdyZW1vdmUgb2YgdGhlCisJICogc2FtZSBWRyBmcm9tIGFub3RoZXIgaG9zdC4KKwkgKi8KKwlpZiAoYXJnX2lzX3NldChjbWQsIGxvY2tzdGFydF9BUkcpKSB7CisJCWNtZC0+bG9ja2RfdmdfZGlzYWJsZSA9IDE7CisKKwkJaWYgKCFsb2NrZF9nbChjbWQsICJzaCIsIDApKQorCQkJbG9nX2RlYnVnKCJObyBnbG9iYWwgbG9jayBmb3IgbG9jayBzdGFydCIpOworCisJCS8qIERpc2FibGUgdGhlIGxvY2tkX2dsIGluIHByb2Nlc3NfZWFjaF92Zy4gKi8KKwkJY21kLT5sb2NrZF9nbF9kaXNhYmxlID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBDaGFuZ2luZyBzeXN0ZW1faWQgb3IgbG9ja190eXBlIG11c3Qgb25seSBiZSBkb25lIG9uIGV4cGxpY2l0bHkKKwkgKiBuYW1lZCB2Z3MuCisJICovCisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHN5c3RlbWlkX0FSRykgfHwgYXJnX2lzX3NldChjbWQsIGxvY2t0eXBlX0FSRykpCisJCWNtZC0+Y29tbWFuZC0+ZmxhZ3MgJj0gfkFMTF9WR1NfSVNfREVGQVVMVDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgc3lzdGVtaWRfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgbG9ja3R5cGVfQVJHKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRha2luZyB0aGUgZ2xvYmFsIGxvY2sgaXMKKwkJICogbm90IG5lZWRlZCB0byBwcm90ZWN0IGdsb2JhbCBzdGF0ZSwgYmVjYXVzZSB0aGUgY2hhbmdlIGlzCisJCSAqIG9ubHkgdG8gYW4gZXhpc3RpbmcgVkcuICBCdXQsIHRha2luZyB0aGUgZ2xvYmFsIGxvY2sgZXggaXMKKwkJICogaGVscGZ1bCBpbiB0aGlzIGNhc2UgdG8gdHJpZ2dlciBhIGdsb2JhbCBjYWNoZSB2YWxpZGF0aW9uCisJCSAqIG9uIG90aGVyIGhvc3RzLCB0byBjYXVzZSB0aGVtIHRvIHNlZSB0aGUgbmV3IHN5c3RlbV9pZCBvcgorCQkgKiBsb2NrX3R5cGUuCisJCSAqLworCQlpZiAoIWxvY2tkX2dsKGNtZCwgImV4IiwgTERHTF9VUERBVEVfTkFNRVMpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCB2Z2NoYW5nZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlOworCXN0cnVjdCB2Z2NoYW5nZV9wYXJhbXMgdnAgPSB7IDAgfTsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJaW50IHJldDsKKworCWludCBub3VwZGF0ZSA9CisJCWFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCBsb2Nrc3RhcnRfQVJHKSB8fAorCQlhcmdfaXNfc2V0KGNtZCwgbG9ja3N0b3BfQVJHKSB8fAorCQlhcmdfaXNfc2V0KGNtZCwgbW9uaXRvcl9BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCBwb2xsX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKTsKKworCWludCB1cGRhdGVfcGFydGlhbF9zYWZlID0KKwkJYXJnX2lzX3NldChjbWQsIGRlbHRhZ19BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCBhZGR0YWdfQVJHKSB8fAorCQlhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIHByb2ZpbGVfQVJHKSB8fAorCQlhcmdfaXNfc2V0KGNtZCwgZGV0YWNocHJvZmlsZV9BUkcpOworCisJaW50IHVwZGF0ZV9wYXJ0aWFsX3Vuc2FmZSA9CisJCWFyZ19pc19zZXQoY21kLCBsb2dpY2Fsdm9sdW1lX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCByZXNpemVhYmxlX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIHV1aWRfQVJHKSB8fAorCQlhcmdfaXNfc2V0KGNtZCwgcGh5c2ljYWxleHRlbnRzaXplX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIGNsdXN0ZXJlZF9BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCBhbGxvY19BUkcpIHx8CisJCWFyZ19pc19zZXQoY21kLCB2Z21ldGFkYXRhY29waWVzX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIGxvY2t0eXBlX0FSRykgfHwKKwkJYXJnX2lzX3NldChjbWQsIHN5c3RlbWlkX0FSRyk7CisKKwlpbnQgdXBkYXRlID0gdXBkYXRlX3BhcnRpYWxfc2FmZSB8fCB1cGRhdGVfcGFydGlhbF91bnNhZmU7CisKKwlpZiAoIXVwZGF0ZSAmJiAhbm91cGRhdGUpIHsKKwkJbG9nX2Vycm9yKCJOZWVkIG9uZSBvciBtb3JlIGNvbW1hbmQgb3B0aW9ucy4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmICgoYXJnX2lzX3NldChjbWQsIHByb2ZpbGVfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFwcm9maWxlX0FSRykpICYmCisJICAgICBhcmdfaXNfc2V0KGNtZCwgZGV0YWNocHJvZmlsZV9BUkcpKSB7CisJCWxvZ19lcnJvcigiT25seSBvbmUgb2YgLS1tZXRhZGF0YXByb2ZpbGUgYW5kIC0tZGV0YWNocHJvZmlsZSBwZXJtaXR0ZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykgJiYgYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKSkgeworCQlsb2dfZXJyb3IoIk9ubHkgb25lIG9mIC1hIGFuZCAtLXJlZnJlc2ggcGVybWl0dGVkLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKChhcmdfaXNfc2V0KGNtZCwgaWdub3JlbG9ja2luZ2ZhaWx1cmVfQVJHKSB8fAorCSAgICAgYXJnX2lzX3NldChjbWQsIHN5c2luaXRfQVJHKSkgJiYgdXBkYXRlKSB7CisJCWxvZ19lcnJvcigiT25seSAtYSBwZXJtaXR0ZWQgd2l0aCAtLWlnbm9yZWxvY2tpbmdmYWlsdXJlIGFuZCAtLXN5c2luaXQiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYWN0aXZhdGVfQVJHKSAmJgorCSAgICAoYXJnX2lzX3NldChjbWQsIG1vbml0b3JfQVJHKSB8fCBhcmdfaXNfc2V0KGNtZCwgcG9sbF9BUkcpKSkgeworCQlpZiAoIWlzX2NoYW5nZV9hY3RpdmF0aW5nKChhY3RpdmF0aW9uX2NoYW5nZV90KSBhcmdfdWludF92YWx1ZShjbWQsIGFjdGl2YXRlX0FSRywgMCkpKSB7CisJCQlsb2dfZXJyb3IoIk9ubHkgLWF5KiBhbGxvd2VkIHdpdGggLS1tb25pdG9yIG9yIC0tcG9sbC4iKTsKKwkJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwkJfQorCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcG9sbF9BUkcpICYmIGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPbmx5IG9uZSBvZiAtLXBvbGwgYW5kIC0tc3lzaW5pdCBwZXJtaXR0ZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2YXRlX0FSRykgJiYKKwkgICAgYXJnX2lzX3NldChjbWQsIGF1dG9iYWNrdXBfQVJHKSkgeworCQlsb2dfZXJyb3IoIi1BIG9wdGlvbiBub3QgbmVjZXNzYXJ5IHdpdGggLWEgb3B0aW9uIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcpICYmCisJICAgIGFyZ19zaWduX3ZhbHVlKGNtZCwgbWF4cGh5c2ljYWx2b2x1bWVzX0FSRywgU0lHTl9OT05FKSA9PSBTSUdOX01JTlVTKSB7CisJCWxvZ19lcnJvcigiTWF4UGh5c2ljYWxWb2x1bWVzIG1heSBub3QgYmUgbmVnYXRpdmUiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcGh5c2ljYWxleHRlbnRzaXplX0FSRykgJiYKKwkgICAgYXJnX3NpZ25fdmFsdWUoY21kLCBwaHlzaWNhbGV4dGVudHNpemVfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJbG9nX2Vycm9yKCJQaHlzaWNhbCBleHRlbnQgc2l6ZSBtYXkgbm90IGJlIG5lZ2F0aXZlIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwkvKgorCSAqIElmIC0tc3lzaW5pdCAtYWF5IGlzIHVzZWQgYW5kIGF0IHRoZSBzYW1lIHRpbWUgbHZtZXRhZCBpcyB1c2VkLAorCSAqIHdlIHdhbnQgdG8gcmVseSBvbiBhdXRvYWN0aXZhdGlvbiB0byB0YWtlIHBsYWNlLiBBbHNvLCB3ZQorCSAqIG5lZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgaGVyZSBhcyBsdm1ldGFkIHNlcnZpY2UgZG9lcworCSAqIG5vdCBuZWV0IHRvIGJlIHJ1bm5pbmcgYXQgdGhpcyBtb21lbnQgeWV0IC0gaXQgY291bGQgYmUKKwkgKiBqdXN0IHRvbyBlYXJseSBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uIHRpbWUuCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBzeXNpbml0X0FSRykgJiYgKGFyZ191aW50X3ZhbHVlKGNtZCwgYWN0aXZhdGVfQVJHLCAwKSA9PSBDSEFOR0VfQUFZKSkgeworCQlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBsdm1ldGFkIGlzIGFjdGl2ZSwgc2tpcHBpbmcgZGlyZWN0IGFjdGl2YXRpb24gZHVyaW5nIHN5c2luaXQiKTsKKwkJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwkJfQorCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgY2x1c3RlcmVkX0FSRykgJiYgIWFyZ2MgJiYgIWFyZ19pc19zZXQoY21kLCB5ZXNfQVJHKSAmJgorCSAgICAoeWVzX25vX3Byb21wdCgiQ2hhbmdlIGNsdXN0ZXJlZCBwcm9wZXJ0eSBvZiBhbGwgdm9sdW1lcyBncm91cHM/IFt5L25dOiAiKSA9PSAnbicpKSB7CisJCWxvZ19lcnJvcigiTm8gdm9sdW1lIGdyb3VwcyBjaGFuZ2VkLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCF1cGRhdGUgfHwgIXVwZGF0ZV9wYXJ0aWFsX3Vuc2FmZSkKKwkJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKworCS8qCisJICogSW5jbHVkZSBmb3JlaWduIFZHcyB0aGF0IGNvbnRhaW4gYWN0aXZlIExWcy4KKwkgKiBUaGF0IHNob3VsZG4ndCBoYXBwZW4gaW4gZ2VuZXJhbCwgYnV0IGlmIGl0IGRvZXMgYnkgc29tZQorCSAqIG1pc3Rha2UsIHRoZW4gd2Ugd2FudCB0byBhbGxvdyB0aG9zZSBMVnMgdG8gYmUgZGVhY3RpdmF0ZWQuCisJICovCisJaWYgKGFyZ19pc19zZXQoY21kLCBhY3RpdmF0ZV9BUkcpKQorCQljbWQtPmluY2x1ZGVfYWN0aXZlX2ZvcmVpZ25fdmdzID0gMTsKKworCWlmICghX2xvY2tkX3ZnY2hhbmdlKGNtZCwgYXJnYywgYXJndikpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCWlmICh1cGRhdGUpCisJCWZsYWdzIHw9IFJFQURfRk9SX1VQREFURTsKKwlpZiAoYXJnX2lzX3NldChjbWQsIGxvY2tzdGFydF9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCBsb2Nrc3RvcF9BUkcpKQorCQlmbGFncyB8PSBSRUFEX0FMTE9XX0VYUE9SVEVEOworCisJaWYgKCEoaGFuZGxlID0gaW5pdF9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIE5VTEwpKSkgeworCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIHByb2Nlc3NpbmcgaGFuZGxlLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaGFuZGxlLT5jdXN0b21faGFuZGxlID0gJnZwOworCisJcmV0ID0gcHJvY2Vzc19lYWNoX3ZnKGNtZCwgYXJnYywgYXJndiwgTlVMTCwgTlVMTCwgZmxhZ3MsIDAsIGhhbmRsZSwgJnZnY2hhbmdlX3NpbmdsZSk7CisKKwkvKiBXYWl0IGZvciBsb2NrLXN0YXJ0IG9wcyB0aGF0IHdlcmUgaW5pdGlhdGVkIGluIHZnY2hhbmdlX2xvY2tzdGFydC4gKi8KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbG9ja3N0YXJ0X0FSRykgJiYgdnAubG9ja19zdGFydF9jb3VudCkgeworCQljb25zdCBjaGFyICpzdGFydF9vcHQgPSBhcmdfc3RyX3ZhbHVlKGNtZCwgbG9ja29wdF9BUkcsIE5VTEwpOworCisJCWlmICghbG9ja2RfZ2woY21kLCAidW4iLCAwKSkKKwkJCXN0YWNrOworCisJCWlmICghc3RhcnRfb3B0IHx8ICFzdHJjbXAoc3RhcnRfb3B0LCAiYXV0byIpKSB7CisJCQlpZiAodnAubG9ja19zdGFydF9zYW5sb2NrKQorCQkJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJTdGFydGluZyBsb2NraW5nLiAgV2FpdGluZyBmb3Igc2FubG9jayBtYXkgdGFrZSAyMCBzZWMgdG8gMyBtaW4uLi4iKTsKKwkJCWVsc2UKKwkJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU3RhcnRpbmcgbG9ja2luZy4gIFdhaXRpbmcgdW50aWwgbG9ja3MgYXJlIHJlYWR5Li4uIik7CisJCQlsb2NrZF9zdGFydF93YWl0KGNtZCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChzdGFydF9vcHQsICJub3dhaXQiKSB8fCAhc3RyY21wKHN0YXJ0X29wdCwgImF1dG9ub3dhaXQiKSkgeworCQkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlN0YXJ0aW5nIGxvY2tpbmcuICBWRyBjYW4gb25seSBiZSByZWFkIHVudGlsIGxvY2tzIGFyZSByZWFkeS4iKTsKKwkJfQorCX0KKworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy92Z2NrLmMgYi90b29scy92Z2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiYzlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZnY2suYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0YXRpYyBpbnQgdmdja19zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgICBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICAgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCSAgICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoIXZnX2NoZWNrX3N0YXR1cyh2ZywgRVhQT1JURURfVkcpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlpZiAoIXZnX3ZhbGlkYXRlKHZnKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKHZnX21pc3NpbmdfcHZfY291bnQodmcpKSB7CisJCWxvZ19lcnJvcigiVGhlIHZvbHVtZSBncm91cCBpcyBtaXNzaW5nICVkIHBoeXNpY2FsIHZvbHVtZXMuIiwKKwkJCSAgdmdfbWlzc2luZ19wdl9jb3VudCh2ZykpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitpbnQgdmdjayhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWx2bWV0YWRfbWFrZV91bnVzZWQoY21kKTsKKwlyZXR1cm4gcHJvY2Vzc19lYWNoX3ZnKGNtZCwgYXJnYywgYXJndiwgTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCwKKwkJCSAgICAgICAmdmdja19zaW5nbGUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdjb252ZXJ0LmMgYi90b29scy92Z2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjI4YmEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdjb252ZXJ0LmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIGludCB2Z2NvbnZlcnRfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBwdl9jcmVhdGVfYXJncyBwdmEgPSB7IDAgfTsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2OworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGx2aW5mbyBpbmZvOworCWludCBhY3RpdmUgPSAwOworCisJaWYgKCF2Z19jaGVja19zdGF0dXModmcsIExWTV9XUklURSB8IEVYUE9SVEVEX1ZHKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKHZnLT5maWQtPmZtdCA9PSBjbWQtPmZtdCkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgYWxyZWFkeSB1c2VzIGZvcm1hdCAlcyIsCisJCQkgIHZnX25hbWUsIGNtZC0+Zm10LT5uYW1lKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWlmIChjbWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfTURBUykgeworCQlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBtZXRhZGF0YXNpemVfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJCWxvZ19lcnJvcigiTWV0YWRhdGEgc2l6ZSBtYXkgbm90IGJlIG5lZ2F0aXZlIik7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKworCQlwdmEucHZtZXRhZGF0YXNpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgbWV0YWRhdGFzaXplX0FSRywgVUlOVDY0X0MoMCkpOworCQlpZiAoIXB2YS5wdm1ldGFkYXRhc2l6ZSkKKwkJCXB2YS5wdm1ldGFkYXRhc2l6ZSA9IGZpbmRfY29uZmlnX3RyZWVfaW50KGNtZCwgbWV0YWRhdGFfcHZtZXRhZGF0YXNpemVfQ0ZHLCBOVUxMKTsKKworCQlwdmEucHZtZXRhZGF0YWNvcGllcyA9IGFyZ19pbnRfdmFsdWUoY21kLCBwdm1ldGFkYXRhY29waWVzX0FSRywgLTEpOworCQlpZiAocHZhLnB2bWV0YWRhdGFjb3BpZXMgPCAwKQorCQkJcHZhLnB2bWV0YWRhdGFjb3BpZXMgPSBmaW5kX2NvbmZpZ190cmVlX2ludChjbWQsIG1ldGFkYXRhX3B2bWV0YWRhdGFjb3BpZXNfQ0ZHLCBOVUxMKTsKKwl9CisKKwlpZiAoY21kLT5mbXQtPmZlYXR1cmVzICYgRk1UX0JBUykgeworCQlpZiAoYXJnX3NpZ25fdmFsdWUoY21kLCBib290bG9hZGVyYXJlYXNpemVfQVJHLCBTSUdOX05PTkUpID09IFNJR05fTUlOVVMpIHsKKwkJCWxvZ19lcnJvcigiQm9vdGxvYWRlciBhcmVhIHNpemUgbWF5IG5vdCBiZSBuZWdhdGl2ZSIpOworCQkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCQl9CisKKwkJcHZhLmJhX3NpemUgPSBhcmdfdWludDY0X3ZhbHVlKGNtZCwgYm9vdGxvYWRlcmFyZWFzaXplX0FSRywgVUlOVDY0X0MoMCkpOworCX0KKworCWlmICghdmdfY2hlY2tfbmV3X2V4dGVudF9zaXplKGNtZC0+Zm10LCB2Zy0+ZXh0ZW50X3NpemUpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlpZiAoIWFyY2hpdmUodmcpKSB7CisJCWxvZ19lcnJvcigiQXJjaGl2ZSBvZiBcIiVzXCIgbWV0YWRhdGEgZmFpbGVkLiIsIHZnX25hbWUpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyogU2V0IFBWL0xWIGxpbWl0IGlmIGNvbnZlcnRpbmcgZnJvbSB1bmxpbWl0ZWQgbWV0YWRhdGEgZm9ybWF0ICovCisJaWYgKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfVU5MSU1JVEVEX1ZPTFMgJiYKKwkgICAgIShjbWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfVU5MSU1JVEVEX1ZPTFMpKSB7CisJCWlmICghdmctPm1heF9sdikKKwkJCXZnLT5tYXhfbHYgPSAyNTU7CisJCWlmICghdmctPm1heF9wdikKKwkJCXZnLT5tYXhfcHYgPSAyNTU7CisJfQorCisJLyogSWYgY29udmVydGluZyB0byByZXN0cmljdGVkIGx2aWQsIGNoZWNrIGlmIGx2aWQgaXMgY29tcGF0aWJsZSAqLworCWlmICghKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfUkVTVFJJQ1RFRF9MVklEUykgJiYKKwkgICAgY21kLT5mbXQtPmZlYXR1cmVzICYgRk1UX1JFU1RSSUNURURfTFZJRFMpCisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKQorCQkJaWYgKCFsdmlkX2luX3Jlc3RyaWN0ZWRfcmFuZ2UoJmx2bC0+bHYtPmx2aWQpKSB7CisJCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBsdmlkIGZvcm1hdCBpcyIKKwkJCQkJICAiIGluY29tcGF0aWJsZSB3aXRoIHJlcXVlc3RlZCIKKwkJCQkJICAiIG1ldGFkYXRhIGZvcm1hdC4iLCBsdmwtPmx2LT5uYW1lKTsKKwkJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCQl9CisKKwkvKiBOZXctc3R5bGUgc3lzdGVtIElEIHN1cHBvcnRlZD8gKi8gCisJaWYgKHZnLT5zeXN0ZW1faWQgJiYgKnZnLT5zeXN0ZW1faWQgJiYgKGNtZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9TWVNURU1JRF9PTl9QVlMpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgVkcgJXMgd2hpbGUgaXQgaGFzIGEgc3lzdGVtIElEIHNldCAoJXMpLiIsIHZnLT5uYW1lLAorCQkJICB2Zy0+c3lzdGVtX2lkKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCS8qIEF0dGVtcHQgdG8gY2hhbmdlIGFueSBMVklEcyB0aGF0IGFyZSB0b28gYmlnICovCisJaWYgKGNtZC0+Zm10LT5mZWF0dXJlcyAmIEZNVF9SRVNUUklDVEVEX0xWSURTKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwsICZ2Zy0+bHZzKSB7CisJCQlsdiA9IGx2bC0+bHY7CisJCQlpZiAobHYtPnN0YXR1cyAmIFNOQVBTSE9UKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGx2bnVtX2Zyb21fbHZpZCgmbHYtPmx2aWQpIDwgTUFYX1JFU1RSSUNURURfTFZTKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGx2X2luZm8oY21kLCBsdiwgMCwgJmluZm8sIDAsIDApICYmIGluZm8uZXhpc3RzKSB7CisJCQkJbG9nX2Vycm9yKCJMb2dpY2FsIHZvbHVtZSAlcyBtdXN0IGJlICIKKwkJCQkJICAiZGVhY3RpdmF0ZWQgYmVmb3JlIGNvbnZlcnNpb24uIiwKKwkJCQkJICAgbHYtPm5hbWUpOworCQkJCWFjdGl2ZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbHZpZF9mcm9tX2x2bnVtKCZsdi0+bHZpZCwgJmx2LT52Zy0+aWQsIGZpbmRfZnJlZV9sdm51bShsdikpOworCisJCX0KKwl9CisKKwlpZiAoYWN0aXZlKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwkvKiBGSVhNRSBDYWNoZSB0aGUgbGFiZWwgZm9ybWF0IGNoYW5nZSBzbyB3ZSBkb24ndCBoYXZlIHRvIHNraXAgdGhpcyAqLworCWlmICh0ZXN0X21vZGUoKSkgeworCQlsb2dfdmVyYm9zZSgiVGVzdCBtb2RlOiBTa2lwcGluZyBtZXRhZGF0YSB3cml0aW5nIGZvciBWRyAlcyBpbiIKKwkJCSAgICAiIGZvcm1hdCAlcyIsIHZnX25hbWUsIGNtZC0+Zm10LT5uYW1lKTsKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCX0KKworCWxvZ192ZXJib3NlKCJXcml0aW5nIG1ldGFkYXRhIGZvciBWRyAlcyB1c2luZyBmb3JtYXQgJXMiLCB2Z19uYW1lLAorCQkgICAgY21kLT5mbXQtPm5hbWUpOworCisJaWYgKCFiYWNrdXBfcmVzdG9yZV92ZyhjbWQsIHZnLCAxLCAmcHZhKSkgeworCQlsb2dfZXJyb3IoIkNvbnZlcnNpb24gZmFpbGVkIGZvciB2b2x1bWUgZ3JvdXAgJXMuIiwgdmdfbmFtZSk7CisJCWxvZ19lcnJvcigiVXNlIHB2Y3JlYXRlIGFuZCB2Z2NmZ3Jlc3RvcmUgdG8gcmVwYWlyIGZyb20gIgorCQkJICAiYXJjaGl2ZWQgbWV0YWRhdGEuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZvbHVtZSBncm91cCAlcyBzdWNjZXNzZnVsbHkgY29udmVydGVkIiwgdmdfbmFtZSk7CisKKwliYWNrdXAodmcpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitpbnQgdmdjb252ZXJ0KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKCFhcmdjKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGVudGVyIHZvbHVtZSBncm91cChzKSIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBtZXRhZGF0YXR5cGVfQVJHKSAmJiBsdm1ldGFkX3VzZWQoKSkgeworCQlsb2dfZXJyb3IoImx2bWV0YWQgbXVzdCBiZSBkaXNhYmxlZCB0byBjaGFuZ2UgbWV0YWRhdGEgdHlwZXMuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2ludF92YWx1ZShjbWQsIGxhYmVsc2VjdG9yX0FSRywgMCkgPj0gTEFCRUxfU0NBTl9TRUNUT1JTKSB7CisJCWxvZ19lcnJvcigibGFiZWxzZWN0b3IgbXVzdCBiZSBsZXNzIHRoYW4gJWx1IiwKKwkJCSAgTEFCRUxfU0NBTl9TRUNUT1JTKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFjb3BpZXNfQVJHKSkgeworCQlsb2dfZXJyb3IoIkludmFsaWQgb3B0aW9uIC0tbWV0YWRhdGFjb3BpZXMsICIKKwkJCSAgInVzZSAtLXB2bWV0YWRhdGFjb3BpZXMgaW5zdGVhZC4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKwlpZiAoIShjbWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfTURBUykgJiYKKwkgICAgKGFyZ19pc19zZXQoY21kLCBwdm1ldGFkYXRhY29waWVzX0FSRykgfHwKKwkgICAgIGFyZ19pc19zZXQoY21kLCBtZXRhZGF0YXNpemVfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCJNZXRhZGF0YSBwYXJhbWV0ZXJzIG9ubHkgYXBwbHkgdG8gdGV4dCBmb3JtYXQiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgcHZtZXRhZGF0YWNvcGllc19BUkcpICYmCisJICAgIGFyZ19pbnRfdmFsdWUoY21kLCBwdm1ldGFkYXRhY29waWVzX0FSRywgLTEpID4gMikgeworCQlsb2dfZXJyb3IoIk1ldGFkYXRhY29waWVzIG1heSBvbmx5IGJlIDAsIDEgb3IgMiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKCEoY21kLT5mbXQtPmZlYXR1cmVzICYgRk1UX0JBUykgJiYKKwkJYXJnX2lzX3NldChjbWQsIGJvb3Rsb2FkZXJhcmVhc2l6ZV9BUkcpKSB7CisJCWxvZ19lcnJvcigiQm9vdGxvYWRlciBhcmVhIHBhcmFtZXRlcnMgb25seSBhcHBseSB0byB0ZXh0IGZvcm1hdCIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJcmV0dXJuIHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsIFJFQURfRk9SX1VQREFURSwgMCwgTlVMTCwKKwkJCSAgICAgICAmdmdjb252ZXJ0X3NpbmdsZSk7Cit9CmRpZmYgLS1naXQgYS90b29scy92Z2NyZWF0ZS5jIGIvdG9vbHMvdmdjcmVhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBjMzYzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdjcmVhdGUuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitpbnQgdmdjcmVhdGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZTsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zIHBwOworCXN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgdnBfbmV3OworCXN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgdnBfZGVmOworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnOworCWNvbnN0IGNoYXIgKnRhZzsKKwljb25zdCBjaGFyICpjbHVzdGVyZWRfbWVzc2FnZSA9ICIiOworCWNoYXIgKnZnX25hbWU7CisJc3RydWN0IGFyZ192YWx1ZV9ncm91cF9saXN0ICpjdXJyZW50X2dyb3VwOworCXVpbnQzMl90IHJjOworCisJaWYgKCFhcmdjKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIHByb3ZpZGUgdm9sdW1lIGdyb3VwIG5hbWUgYW5kICIKKwkJCSAgInBoeXNpY2FsIHZvbHVtZXMiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCXZnX25hbWUgPSBhcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisKKwlwdmNyZWF0ZV9wYXJhbXNfc2V0X2RlZmF1bHRzKCZwcCk7CisKKwlpZiAoIXB2Y3JlYXRlX3BhcmFtc19mcm9tX2FyZ3MoY21kLCAmcHApKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlwcC5wdl9jb3VudCA9IGFyZ2M7CisJcHAucHZfbmFtZXMgPSBhcmd2OworCisJLyogRG9uJ3QgY3JlYXRlIGEgbmV3IFBWIG9uIHRvcCBvZiBhbiBleGlzdGluZyBQViBsaWtlIHB2Y3JlYXRlIGRvZXMuICovCisJcHAucHJlc2VydmVfZXhpc3RpbmcgPSAxOworCisJaWYgKCF2Z2NyZWF0ZV9wYXJhbXNfc2V0X2RlZmF1bHRzKGNtZCwgJnZwX2RlZiwgTlVMTCkpCisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl2cF9kZWYudmdfbmFtZSA9IHZnX25hbWU7CisJaWYgKCF2Z2NyZWF0ZV9wYXJhbXNfc2V0X2Zyb21fYXJncyhjbWQsICZ2cF9uZXcsICZ2cF9kZWYpKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlpZiAoIXZnY3JlYXRlX3BhcmFtc192YWxpZGF0ZShjbWQsICZ2cF9uZXcpKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwkvKgorCSAqIE5lZWRlZCB0byBjaGFuZ2UgdGhlIGdsb2JhbCBWRyBuYW1lc3BhY2UsCisJICogYW5kIHRvIGNoYW5nZSB0aGUgc2V0IG9mIG9ycGhhbiBQVnMuCisJICovCisJaWYgKCFsb2NrZF9nbF9jcmVhdGUoY21kLCAiZXgiLCB2cF9uZXcubG9ja190eXBlKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisKKwlsdm1jYWNoZV9zZWVkX2luZm9zX2Zyb21fbHZtZXRhZChjbWQpOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgVkcgbmFtZSBhbHJlYWR5IGV4aXN0cy4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisJICogY3JlYXRpbmcgUFZzIG9uIGFueSBvZiB0aGUgZGV2aWNlcy4KKwkgKi8KKwlpZiAoKHJjID0gdmdfbG9ja19uZXduYW1lKGNtZCwgdnBfbmV3LnZnX25hbWUpKSAhPSBTVUNDRVNTKSB7CisJCWlmIChyYyA9PSBGQUlMRURfRVhJU1QpCisJCQlsb2dfZXJyb3IoIkEgdm9sdW1lIGdyb3VwIGNhbGxlZCAlcyBhbHJlYWR5IGV4aXN0cy4iLCB2cF9uZXcudmdfbmFtZSk7CisJCWVsc2UKKwkJCWxvZ19lcnJvcigiQ2FuJ3QgZ2V0IGxvY2sgZm9yICVzLiIsIHZwX25ldy52Z19uYW1lKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCS8qCisJICogRklYTUU6IHdlIGhhdmUgdG8gdW5sb2NrL3JlbG9jayB0aGUgbmV3IFZHIG5hbWUgYXJvdW5kIHRoZSBwdmNyZWF0ZQorCSAqIHN0ZXAgYmVjYXVzZSBwdmNyZWF0ZSBuZWVkcyB0byBkZXN0cm95IGx2bWNhY2hlLCB3aGljaCBkb2Vzbid0IGFsbG93CisJICogYW55IGxvY2tzIHRvIGJlIGhlbGQuICBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IHJlYXNvbiB0byByZXF1aXJlIHRoaXMKKwkgKiBWRyBsb2NrIHRvIGJlIHJlbGVhc2VkLCBzbyB0aGUgbHZtY2FjaGUgZGVzdHJveSBydWxlIGFib3V0IGxvY2tzCisJICogc2VlbXMgdG8gYmUgdW53YXJyYW50ZWQgaGVyZS4KKwkgKi8KKwl1bmxvY2tfdmcoY21kLCBOVUxMLCB2cF9uZXcudmdfbmFtZSk7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoIXB2Y3JlYXRlX2VhY2hfZGV2aWNlKGNtZCwgaGFuZGxlLCAmcHApKSB7CisJCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJfQorCisJLyogUmVsb2NrIHRoZSBuZXcgVkcgbmFtZSwgc2VlIGNvbW1lbnQgYWJvdmUuICovCisJaWYgKCFsb2NrX3ZvbChjbWQsIHZwX25ldy52Z19uYW1lLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBwdmNyZWF0ZV9lYWNoX2RldmljZSByZXR1cm5zIHdpdGggdGhlIFZHX09SUEhBTlMgd3JpdGUgbG9jayBoZWxkLAorCSAqIHdoaWNoIHdhcyB1c2VkIHRvIGRvIHB2Y3JlYXRlLiAgTm93IHRvIGNyZWF0ZSB0aGUgVkcgdXNpbmcgdGhvc2UKKwkgKiBQVnMsIHRoZSBWRyBsb2NrIHdpbGwgYmUgdGFrZW4gKHdpdGggdGhlIG9ycGhhbiBsb2NrIGFscmVhZHkgaGVsZC4pCisJICovCisKKwlpZiAoISh2ZyA9IHZnX2NyZWF0ZShjbWQsIHZwX25ldy52Z19uYW1lKSkpCisJCWdvdG9fYmFkOworCisJaWYgKHZnLT5maWQtPmZtdC0+ZmVhdHVyZXMgJiBGTVRfQ09ORklHX1BST0ZJTEUpCisJCXZnLT5wcm9maWxlID0gdmctPmNtZC0+cHJvZmlsZV9wYXJhbXMtPmdsb2JhbF9tZXRhZGF0YV9wcm9maWxlOworCisJaWYgKCF2Z19zZXRfZXh0ZW50X3NpemUodmcsIHZwX25ldy5leHRlbnRfc2l6ZSkgfHwKKwkgICAgIXZnX3NldF9tYXhfbHYodmcsIHZwX25ldy5tYXhfbHYpIHx8CisJICAgICF2Z19zZXRfbWF4X3B2KHZnLCB2cF9uZXcubWF4X3B2KSB8fAorCSAgICAhdmdfc2V0X2FsbG9jX3BvbGljeSh2ZywgdnBfbmV3LmFsbG9jKSB8fAorCSAgICAhdmdfc2V0X2NsdXN0ZXJlZCh2ZywgdnBfbmV3LmNsdXN0ZXJlZCkgfHwKKwkgICAgIXZnX3NldF9zeXN0ZW1faWQodmcsIHZwX25ldy5zeXN0ZW1faWQpIHx8CisJICAgICF2Z19zZXRfbWRhX2NvcGllcyh2ZywgdnBfbmV3LnZnbWV0YWRhdGFjb3BpZXMpKQorCQlnb3RvX2JhZDsKKworCS8qIGF0dGFjaCB0aGUgcHYncyAqLworCWlmICghdmdfZXh0ZW5kX2VhY2hfcHYodmcsICZwcCkpCisJCWdvdG9fYmFkOworCisJaWYgKHZwX25ldy5tYXhfbHYgIT0gdmctPm1heF9sdikKKwkJbG9nX3dhcm4oIldBUk5JTkc6IFNldHRpbmcgbWF4bG9naWNhbHZvbHVtZXMgdG8gJWQgIgorCQkJICIoMCBtZWFucyB1bmxpbWl0ZWQpIiwgdmctPm1heF9sdik7CisKKwlpZiAodnBfbmV3Lm1heF9wdiAhPSB2Zy0+bWF4X3B2KQorCQlsb2dfd2FybigiV0FSTklORzogU2V0dGluZyBtYXhwaHlzaWNhbHZvbHVtZXMgdG8gJWQgIgorCQkJICIoMCBtZWFucyB1bmxpbWl0ZWQpIiwgdmctPm1heF9wdik7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFkZHRhZ19BUkcpKSB7CisJCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhjdXJyZW50X2dyb3VwLCAmY21kLT5hcmdfdmFsdWVfZ3JvdXBzKSB7CisJCQlpZiAoIWdyb3VwZWRfYXJnX2lzX3NldChjdXJyZW50X2dyb3VwLT5hcmdfdmFsdWVzLCBhZGR0YWdfQVJHKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEodGFnID0gZ3JvdXBlZF9hcmdfc3RyX3ZhbHVlKGN1cnJlbnRfZ3JvdXAtPmFyZ192YWx1ZXMsIGFkZHRhZ19BUkcsIE5VTEwpKSkgeworCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdldCB0YWciKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKworCQkJaWYgKCF2Z19jaGFuZ2VfdGFnKHZnLCB0YWcsIDEpKQorCQkJCWdvdG9fYmFkOworCQl9CisJfQorCisJaWYgKHZnX2lzX2NsdXN0ZXJlZCh2ZykpCisJCWNsdXN0ZXJlZF9tZXNzYWdlID0gIkNsdXN0ZXJlZCAiOworCWVsc2UgaWYgKGxvY2tpbmdfaXNfY2x1c3RlcmVkKCkpCisJCWNsdXN0ZXJlZF9tZXNzYWdlID0gIk5vbi1jbHVzdGVyZWQgIjsKKworCWlmICghYXJjaGl2ZSh2ZykpCisJCWdvdG9fYmFkOworCisJLyogU3RvcmUgVkcgb24gZGlzayhzKSAqLworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKQorCQlnb3RvX2JhZDsKKworCS8qCisJICogVGhlIFZHIGlzIGluaXRpYWxseSB3cml0dGVuIHdpdGhvdXQgbG9ja190eXBlIHNldCwgaS5lLiBpdCBzdGFydHMgYXMKKwkgKiBhIGxvY2FsIFZHLiAgbG9ja2RfaW5pdF92ZygpIHRoZW4gd3JpdGVzIHRoZSBWRyBhIHNlY29uZCB0aW1lIHdpdGgKKwkgKiBib3RoIGxvY2tfdHlwZSBhbmQgbG9ja19hcmdzIHNldC4KKwkgKi8KKwlpZiAoIWxvY2tkX2luaXRfdmcoY21kLCB2ZywgdnBfbmV3LmxvY2tfdHlwZSwgMCkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBsb2NrIGFyZ3MgZm9yIGxvY2sgdHlwZSAlcyIsCisJCQkgIHZwX25ldy5sb2NrX3R5cGUpOworCQl2Z19yZW1vdmVfcHZzKHZnKTsKKwkJdmdfcmVtb3ZlX2RpcmVjdCh2Zyk7CisJCWdvdG9fYmFkOworCX0KKworCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCXVubG9ja192ZyhjbWQsIHZnLCB2cF9uZXcudmdfbmFtZSk7CisKKwliYWNrdXAodmcpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzJWNvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQlcyVzIiwKKwkJCQljbHVzdGVyZWRfbWVzc2FnZSwgKmNsdXN0ZXJlZF9tZXNzYWdlID8gJ3YnIDogJ1YnLCB2Zy0+bmFtZSwKKwkJCQl2Zy0+c3lzdGVtX2lkID8gIiB3aXRoIHN5c3RlbSBJRCAiIDogIiIsIHZnLT5zeXN0ZW1faWQgPyA6ICIiKTsKKworCS8qCisJICogU3RhcnQgdGhlIFZHIGxvY2tzcGFjZSBiZWNhdXNlIGl0IHdpbGwgbGlrZWx5IGJlIHVzZWQgcmlnaHQgYXdheS4KKwkgKiBPcHRpb25hbGx5IHdhaXQgZm9yIHRoZSBzdGFydCB0byBjb21wbGV0ZSBzbyB0aGUgVkcgY2FuIGJlIGZ1bGx5CisJICogdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgY29tcGxldGVzIChvdGhlcndpc2UsIHRoZSBWRyBjYW4gb25seSBiZQorCSAqIHJlYWQgd2l0aG91dCBsb2NrcyB1bnRpbCB0aGUgbG9ja3NwYWNlIGlzIGRvbmUgc3RhcnRpbmcuKQorCSAqLworCWlmIChpc19sb2NrZF90eXBlKHZnLT5sb2NrX3R5cGUpKSB7CisJCWNvbnN0IGNoYXIgKnN0YXJ0X29wdCA9IGFyZ19zdHJfdmFsdWUoY21kLCBsb2Nrb3B0X0FSRywgTlVMTCk7CisKKwkJaWYgKCFsb2NrZF9zdGFydF92ZyhjbWQsIHZnLCAxKSkgeworCQkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gc3RhcnQgbG9ja2luZyIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlsb2NrZF9nbChjbWQsICJ1biIsIDApOworCisJCWlmICghc3RhcnRfb3B0IHx8ICFzdHJjbXAoc3RhcnRfb3B0LCAid2FpdCIpKSB7CisJCQkvKiBJdCBpcyBPSyBpZiB0aGUgdXNlciBkb2VzIEN0cmwtQyB0byBjYW5jZWwgdGhlIHdhaXQuICovCisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU3RhcnRpbmcgbG9ja2luZy4gIFdhaXRpbmcgdW50aWwgbG9ja3MgYXJlIHJlYWR5Li4uIik7CisJCQlsb2NrZF9zdGFydF93YWl0KGNtZCk7CisKKwkJfSBlbHNlIGlmICghc3RyY21wKHN0YXJ0X29wdCwgIm5vd2FpdCIpKSB7CisJCQlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiU3RhcnRpbmcgbG9ja2luZy4gIFZHIGlzIHJlYWQtb25seSB1bnRpbCBsb2NrcyBhcmUgcmVhZHkuIik7CisJCX0KKworCX0KK291dDoKKwlyZWxlYXNlX3ZnKHZnKTsKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKK2JhZDoKKwl1bmxvY2tfdmcoY21kLCB2ZywgdnBfbmV3LnZnX25hbWUpOworCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCXJlbGVhc2VfdmcodmcpOworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCXJldHVybiBFQ01EX0ZBSUxFRDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3ZnZGlzcGxheS5jIGIvdG9vbHMvdmdkaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiMmU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZnZGlzcGxheS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0YXRpYyBpbnQgdmdkaXNwbGF5X3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFjdGl2ZXZvbHVtZWdyb3Vwc19BUkcpICYmICFsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb2xvbl9BUkcpKSB7CisJCXZnZGlzcGxheV9jb2xvbnModmcpOworCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBzaG9ydF9BUkcpKSB7CisJCXZnZGlzcGxheV9zaG9ydCh2Zyk7CisJCXJldHVybiBFQ01EX1BST0NFU1NFRDsKKwl9CisKKwl2Z2Rpc3BsYXlfZnVsbCh2Zyk7CS8qIHdhcyB2Z19zaG93ICovCisKKwlpZiAoYXJnX2lzX3NldChjbWQsIHZlcmJvc2VfQVJHKSkgeworCQl2Z2Rpc3BsYXlfZXh0ZW50cyh2Zyk7CisKKwkJcHJvY2Vzc19lYWNoX2x2X2luX3ZnKGNtZCwgdmcsIE5VTEwsIE5VTEwsIDAsIE5VTEwsCisJCQkJICAgICAgKHByb2Nlc3Nfc2luZ2xlX2x2X2ZuX3QpbHZkaXNwbGF5X2Z1bGwpOworCisJCWxvZ19wcmludCgiLS0tIFBoeXNpY2FsIHZvbHVtZXMgLS0tIik7CisJCXByb2Nlc3NfZWFjaF9wdl9pbl92ZyhjbWQsIHZnLCBOVUxMLAorCQkJCSAgICAgIChwcm9jZXNzX3NpbmdsZV9wdl9mbl90KXB2ZGlzcGxheV9zaG9ydCk7CisJfQorCisJY2hlY2tfY3VycmVudF9iYWNrdXAodmcpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworfQorCitpbnQgdmdkaXNwbGF5KHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ19pc19zZXQoY21kLCBjb2x1bW5zX0FSRykpIHsKKwkJaWYgKGFyZ19pc19zZXQoY21kLCBjb2xvbl9BUkcpIHx8CisJCSAgICBhcmdfaXNfc2V0KGNtZCwgYWN0aXZldm9sdW1lZ3JvdXBzX0FSRykgfHwKKwkJICAgIGFyZ19pc19zZXQoY21kLCBzaG9ydF9BUkcpKSB7CisJCQlsb2dfZXJyb3IoIkluY29tcGF0aWJsZSBvcHRpb25zIHNlbGVjdGVkIik7CisJCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJCX0KKwkJcmV0dXJuIHZncyhjbWQsIGFyZ2MsIGFyZ3YpOworCX0gZWxzZSBpZiAoYXJnX2lzX3NldChjbWQsIGFsaWduZWRfQVJHKSB8fAorCQkgICBhcmdfaXNfc2V0KGNtZCwgYmluYXJ5X0FSRykgfHwKKwkJICAgYXJnX2lzX3NldChjbWQsIG5vaGVhZGluZ3NfQVJHKSB8fAorCQkgICBhcmdfaXNfc2V0KGNtZCwgb3B0aW9uc19BUkcpIHx8CisJCSAgIGFyZ19pc19zZXQoY21kLCBzZXBhcmF0b3JfQVJHKSB8fAorCQkgICBhcmdfaXNfc2V0KGNtZCwgc29ydF9BUkcpIHx8IGFyZ19pc19zZXQoY21kLCB1bmJ1ZmZlcmVkX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJJbmNvbXBhdGlibGUgb3B0aW9ucyBzZWxlY3RlZCIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBjb2xvbl9BUkcpICYmIGFyZ19pc19zZXQoY21kLCBzaG9ydF9BUkcpKSB7CisJCWxvZ19lcnJvcigiT3B0aW9uIC1jIGlzIG5vdCBhbGxvd2VkIHdpdGggb3B0aW9uIC1zIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnYyAmJiBhcmdfaXNfc2V0KGNtZCwgYWN0aXZldm9sdW1lZ3JvdXBzX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPcHRpb24gLUEgaXMgbm90IGFsbG93ZWQgd2l0aCB2b2x1bWUgZ3JvdXAgbmFtZXMiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworLyoqKioqKioqKiBGSVhNRTogRG8gd2l0aG91dCB0aGlzIC0gb3IgZWxzZSAyKCspIHBhc3NlcyEKKwkgICBGaWd1cmUgb3V0IGxvbmdlc3Qgdm9sdW1lIGdyb3VwIG5hbWUKKwlmb3IgKGMgPSBvcHQ7IG9wdCA8IGFyZ2M7IG9wdCsrKSB7CisJCWxlbiA9IHN0cmxlbihhcmd2W29wdF0pOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCW1heF9sZW4gPSBsZW47CisJfQorKioqKioqKioqKi8KKworCXJldHVybiBwcm9jZXNzX2VhY2hfdmcoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLCAwLCAwLCBOVUxMLAorCQkJICAgICAgIHZnZGlzcGxheV9zaW5nbGUpOworCisvKioqKioqKiogRklYTUUgTmVlZCB0byBjb3VudCBudW1iZXIgcHJvY2Vzc2VkCisJICBBZGQgdGhpcyB0byBwcm9jZXNzX2VhY2hfdmcgaWYgYXJnX2lzX3NldChjbWQsYWN0aXZldm9sdW1lZ3JvdXBzX0FSRykgPworCisJaWYgKG9wdCA9PSBhcmdjKSB7CisJCWxvZ19wcmludCgibm8gIik7CisJCWlmIChhcmdfaXNfc2V0KGNtZCxhY3RpdmV2b2x1bWVncm91cHNfQVJHKSkKKwkJCXByaW50ZigiYWN0aXZlICIpOworCQlwcmludGYoInZvbHVtZSBncm91cHMgZm91bmRcblxuIik7CisJCXJldHVybiBMVk1fRV9OT19WRzsKKwl9CisqKioqKioqKioqKiovCit9CmRpZmYgLS1naXQgYS90b29scy92Z2V4cG9ydC5jIGIvdG9vbHMvdmdleHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNmODE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdleHBvcnQuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisKK3N0YXRpYyBpbnQgdmdleHBvcnRfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgY29uc3QgY2hhciAqdmdfbmFtZSwKKwkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bDsKKworCWlmIChsdnNfaW5fdmdfYWN0aXZhdGVkKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgaGFzIGFjdGl2ZSBsb2dpY2FsIHZvbHVtZXMiLAorCQkJICB2Z19uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJc3RydWN0IGx2X2xpc3QgKmx2bDsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpIHsKKwkJCWlmICghbG9ja2RfbHZfdXNlc19sb2NrKGx2bC0+bHYpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWxvY2tkX2x2KGNtZCwgbHZsLT5sdiwgImV4IiwgMCkpIHsKKwkJCQlsb2dfZXJyb3IoIkxWICVzLyVzIG11c3QgYmUgaW5hY3RpdmUgb24gYWxsIGhvc3RzIGJlZm9yZSB2Z2V4cG9ydC4iLAorCQkJCQkgIHZnLT5uYW1lLCBkaXNwbGF5X2x2bmFtZShsdmwtPmx2KSk7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCWlmICghbG9ja2RfbHYoY21kLCBsdmwtPmx2LCAidW4iLCAwKSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJZ290b19iYWQ7CisKKwl2Zy0+c3RhdHVzIHw9IEVYUE9SVEVEX1ZHOworCXZnLT5zeXN0ZW1faWQgPSBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpCisJCXB2bC0+cHYtPnN0YXR1cyB8PSBFWFBPUlRFRF9WRzsKKworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKQorCQlnb3RvX2JhZDsKKworCWJhY2t1cCh2Zyk7CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVm9sdW1lIGdyb3VwIFwiJXNcIiBzdWNjZXNzZnVsbHkgZXhwb3J0ZWQiLCB2Zy0+bmFtZSk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisKK2JhZDoKKwlyZXR1cm4gRUNNRF9GQUlMRUQ7Cit9CisKK2ludCB2Z2V4cG9ydChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmICghYXJnYyAmJiAhYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpICYmICFhcmdfaXNfc2V0KGNtZCwgc2VsZWN0X0FSRykpIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2Ugc3VwcGx5IHZvbHVtZSBncm91cHMgb3IgdXNlIC0tc2VsZWN0IGZvciBzZWxlY3Rpb24gb3IgdXNlIC1hIGZvciBhbGwuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGFsbF9BUkcpICYmIChhcmdjIHx8IGFyZ19pc19zZXQoY21kLCBzZWxlY3RfQVJHKSkpIHsKKwkJbG9nX2Vycm9yKCJObyBhcmd1bWVudHMgcGVybWl0dGVkIHdoZW4gdXNpbmcgLWEgZm9yIGFsbC4iKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCXJldHVybiBwcm9jZXNzX2VhY2hfdmcoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCBOVUxMLCBSRUFEX0ZPUl9VUERBVEUsIDAsIE5VTEwsCisJCQkgICAgICAgJnZnZXhwb3J0X3NpbmdsZSk7Cit9CmRpZmYgLS1naXQgYS90b29scy92Z2V4dGVuZC5jIGIvdG9vbHMvdmdleHRlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDRkZmYwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdleHRlbmQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdHJ1Y3QgdmdleHRlbmRfcGFyYW1zIHsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zIHBwOworfTsKKworc3RhdGljIGludCBfcmVzdG9yZV9wdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywgY29uc3QgY2hhciAqcHZfbmFtZSkKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsID0gTlVMTDsKKwlwdmwgPSBmaW5kX3B2X2luX3ZnKHZnLCBwdl9uYW1lKTsKKwlpZiAoIXB2bCkgeworCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgbm90IGZvdW5kIGluIFZHICVzIiwgcHZfbmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShwdmwtPnB2LT5zdGF0dXMgJiBNSVNTSU5HX1BWKSkgeworCQlsb2dfd2FybigiV0FSTklORzogUFYgJXMgd2FzIG5vdCBtaXNzaW5nIGluIFZHICVzIiwgcHZfbmFtZSwgdmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXB2bC0+cHYtPmRldikgeworCQlsb2dfd2FybigiV0FSTklORzogVGhlIFBWICVzIGlzIHN0aWxsIG1pc3NpbmcuIiwgcHZfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXB2bC0+cHYtPnN0YXR1cyAmPSB+TUlTU0lOR19QVjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdleHRlbmRfcmVzdG9yZW1pc3Npbmcoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJICAgIGNvbnN0IGNoYXIgKnZnX25hbWUsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLAorCQkJCSAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdmdleHRlbmRfcGFyYW1zICp2cCA9IChzdHJ1Y3QgdmdleHRlbmRfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCA9ICZ2cC0+cHA7CisJaW50IGZpeGVkID0gMDsKKwlpbnQgaTsKKworCWlmICghYXJjaGl2ZSh2ZykpCisJCXJldHVybl8wOworCisJZm9yIChpID0gMDsgaSA8IHBwLT5wdl9jb3VudDsgaSsrKQorCQlpZiAoX3Jlc3RvcmVfcHYodmcsIHBwLT5wdl9uYW1lc1tpXSkpCisJCQlmaXhlZCsrOworCisJaWYgKCFmaXhlZCkgeworCQlsb2dfZXJyb3IoIk5vIFBWIGhhcyBiZWVuIHJlc3RvcmVkLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCWJhY2t1cCh2Zyk7CisKKwlsb2dfcHJpbnRfdW5sZXNzX3NpbGVudCgiVm9sdW1lIGdyb3VwIFwiJXNcIiBzdWNjZXNzZnVsbHkgZXh0ZW5kZWQiLCB2Z19uYW1lKTsKKworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworc3RhdGljIGludCBfdmdleHRlbmRfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkJICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdmdleHRlbmRfcGFyYW1zICp2cCA9IChzdHJ1Y3QgdmdleHRlbmRfcGFyYW1zICopIGhhbmRsZS0+Y3VzdG9tX2hhbmRsZTsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCA9ICZ2cC0+cHA7CisJdWludDMyX3QgbWRhX2NvcGllczsKKwl1aW50MzJfdCBtZGFfdXNlZDsKKwlpbnQgcmV0ID0gRUNNRF9GQUlMRUQ7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1ldGFkYXRhaWdub3JlX0FSRykgJiYKKwkgICAgKHBwLT5mb3JjZSA9PSBQUk9NUFQpICYmICFwcC0+eWVzICYmCisJICAgICh2Z19tZGFfY29waWVzKHZnKSAhPSBWR01FVEFEQVRBQ09QSUVTX1VOTUFOQUdFRCkgJiYKKwkgICAgKHllc19ub19wcm9tcHQoIk92ZXJyaWRlIHByZWZlcnJlZCBudW1iZXIgb2YgY29waWVzIG9mIFZHICVzIG1ldGFkYXRhPyBbeS9uXTogIiwgdmdfbmFtZSkgPT0gJ24nKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCAlcyBub3QgY2hhbmdlZCIsIHZnX25hbWUpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCF2Z19leHRlbmRfZWFjaF9wdih2ZywgcHApKQorCQlnb3RvX291dDsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWV0YWRhdGFpZ25vcmVfQVJHKSkgeworCQltZGFfY29waWVzID0gdmdfbWRhX2NvcGllcyh2Zyk7CisJCW1kYV91c2VkID0gdmdfbWRhX3VzZWRfY291bnQodmcpOworCisJCWlmICgobWRhX2NvcGllcyAhPSBWR01FVEFEQVRBQ09QSUVTX1VOTUFOQUdFRCkgJiYKKwkJICAgIChtZGFfY29waWVzICE9IG1kYV91c2VkKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IENoYW5naW5nIHByZWZlcnJlZCBudW1iZXIgb2YgY29waWVzIG9mIFZHICVzIG1ldGFkYXRhIGZyb20gJSJQUkl1MzIiIHRvICUiUFJJdTMyLAorCQkJCSB2Z19uYW1lLCBtZGFfY29waWVzLCBtZGFfdXNlZCk7CisJCQl2Z19zZXRfbWRhX2NvcGllcyh2ZywgbWRhX3VzZWQpOworCQl9CisJfQorCisJbG9nX3ZlcmJvc2UoIlZvbHVtZSBncm91cCBcIiVzXCIgd2lsbCBiZSBleHRlbmRlZCBieSAlZCBuZXcgcGh5c2ljYWwgdm9sdW1lcyIsIHZnX25hbWUsIHBwLT5wdl9jb3VudCk7CisKKwlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJZ290b19vdXQ7CisKKwliYWNrdXAodmcpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGV4dGVuZGVkIiwgdmdfbmFtZSk7CisJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IHZnZXh0ZW5kKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGU7CisJc3RydWN0IHZnZXh0ZW5kX3BhcmFtcyB2cDsKKwlzdHJ1Y3QgcHZjcmVhdGVfcGFyYW1zICpwcCA9ICZ2cC5wcDsKKwl1bnNpZ25lZCByZXN0b3JlbWlzc2luZyA9IGFyZ19pc19zZXQoY21kLCByZXN0b3JlbWlzc2luZ19BUkcpOworCWNvbnN0IGNoYXIgKnZnX25hbWU7CisJaW50IHJldDsKKworCWlmICghYXJnYykgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBlbnRlciB2b2x1bWUgZ3JvdXAgbmFtZSBhbmQgIgorCQkJICAicGh5c2ljYWwgdm9sdW1lKHMpIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG1ldGFkYXRhY29waWVzX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJJbnZhbGlkIG9wdGlvbiAtLW1ldGFkYXRhY29waWVzLCAiCisJCQkgICJ1c2UgLS1wdm1ldGFkYXRhY29waWVzIGluc3RlYWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwl2Z19uYW1lID0gc2tpcF9kZXZfZGlyKGNtZCwgYXJndlswXSwgTlVMTCk7CisJYXJnYy0tOworCWFyZ3YrKzsKKworCXB2Y3JlYXRlX3BhcmFtc19zZXRfZGVmYXVsdHMocHApOworCisJaWYgKCFwdmNyZWF0ZV9wYXJhbXNfZnJvbV9hcmdzKGNtZCwgcHApKQorCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisKKwlwcC0+cHZfY291bnQgPSBhcmdjOworCXBwLT5wdl9uYW1lcyA9IGFyZ3Y7CisKKwkvKiBEb24ndCBjcmVhdGUgYSBuZXcgUFYgb24gdG9wIG9mIGFuIGV4aXN0aW5nIFBWIGxpa2UgcHZjcmVhdGUgZG9lcy4gKi8KKwlwcC0+cHJlc2VydmVfZXhpc3RpbmcgPSAxOworCisJLyogcHZjcmVhdGUgd2l0aGluIHZnZXh0ZW5kIGNhbm5vdCBiZSBmb3JjZWQuICovCisJcHAtPmZvcmNlID0gMDsKKworCS8qCisJICogTmVlZGVkIHRvIGNoYW5nZSB0aGUgc2V0IG9mIG9ycGhhbiBQVnMuCisJICogKGRpc2FibGUgYWZ0ZXJ3YXJkIHRvIHByZXZlbnQgcHJvY2Vzc19lYWNoX3B2IGZyb20gZG9pbmcKKwkgKiBhIHNoYXJlZCBnbG9iYWwgbG9jayBzaW5jZSBpdCdzIGFscmVhZHkgYWNxdWlyZWQgaXQgZXguKQorCSAqLworCWlmICghbG9ja2RfZ2woY21kLCAiZXgiLCAwKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisKKwlpZiAoIShoYW5kbGUgPSBpbml0X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgTlVMTCkpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvY2Vzc2luZyBoYW5kbGUuIik7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoIXJlc3RvcmVtaXNzaW5nKSB7CisJCWlmICghcHZjcmVhdGVfZWFjaF9kZXZpY2UoY21kLCBoYW5kbGUsIHBwKSkgeworCQkJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCX0KKwl9CisKKwkvKgorCSAqIHB2Y3JlYXRlX2VhY2hfZGV2aWNlIHJldHVybnMgd2l0aCB0aGUgVkdfT1JQSEFOUyB3cml0ZSBsb2NrIGhlbGQsCisJICogd2hpY2ggd2FzIHVzZWQgdG8gZG8gcHZjcmVhdGUuICBOb3cgdG8gY3JlYXRlIHRoZSBWRyB1c2luZyB0aG9zZQorCSAqIFBWcywgdGhlIFZHIGxvY2sgd2lsbCBiZSB0YWtlbiAod2l0aCB0aGUgb3JwaGFuIGxvY2sgYWxyZWFkeSBoZWxkLikKKwkgKi8KKworCS8qCisJICogSXQgaXMgYWx3YXlzIG9rIHRvIGFkZCBuZXcgUFZzIHRvIGEgVkcgLSBldmVuIGlmIHRoZXJlIGFyZQorCSAqIG1pc3NpbmcgUFZzLiAgTm8gTFZzIGFyZSBhZmZlY3RlZCBieSB0aGlzIG9wZXJhdGlvbiwgYnV0CisJICogcmVwYWlyIHByb2Nlc3NlcyAtIHBhcnRpY3VsYXJseSBmb3IgUkFJRCBzZWd0eXBlcyAtIGNhbgorCSAqIGJlIGZhY2lsaXRhdGVkLgorCSAqLworCWNtZC0+aGFuZGxlc19taXNzaW5nX3B2cyA9IDE7CisKKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSAmdnA7CisKKwlyZXQgPSBwcm9jZXNzX2VhY2hfdmcoY21kLCAwLCBOVUxMLCB2Z19uYW1lLCBOVUxMLAorCQkJICAgICAgUkVBRF9GT1JfVVBEQVRFLCAwLCBoYW5kbGUsCisJCQkgICAgICByZXN0b3JlbWlzc2luZyA/ICZfdmdleHRlbmRfcmVzdG9yZW1pc3NpbmcgOiAmX3ZnZXh0ZW5kX3NpbmdsZSk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKworCWlmICghcmVzdG9yZW1pc3NpbmcpCisJCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX09SUEhBTlMpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy92Z2ltcG9ydC5jIGIvdG9vbHMvdmdpbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2VlY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdpbXBvcnQuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IHZnaW1wb3J0X3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCSAgIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCXN0cnVjdCBwdl9saXN0ICpwdmw7CisJc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHY7CisKKwlpZiAoIXZnX2lzX2V4cG9ydGVkKHZnKSkgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgbm90IGV4cG9ydGVkIiwgdmdfbmFtZSk7CisJCWdvdG8gYmFkOworCX0KKworCWlmICh2Z19zdGF0dXModmcpICYgUEFSVElBTF9WRykgeworCQlsb2dfZXJyb3IoIlZvbHVtZSBncm91cCBcIiVzXCIgaXMgcGFydGlhbGx5IG1pc3NpbmciLCB2Z19uYW1lKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJZ290b19iYWQ7CisKKwl2Zy0+c3RhdHVzICY9IH5FWFBPUlRFRF9WRzsKKworCWlmICghaXNfbG9ja2RfdHlwZSh2Zy0+bG9ja190eXBlKSkKKwkJdmctPnN5c3RlbV9pZCA9IGNtZC0+c3lzdGVtX2lkID8gZG1fcG9vbF9zdHJkdXAodmctPnZnbWVtLCBjbWQtPnN5c3RlbV9pZCkgOiBOVUxMOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJcHYgPSBwdmwtPnB2OworCQlwdi0+c3RhdHVzICY9IH5FWFBPUlRFRF9WRzsKKwl9CisKKwlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkKKwkJZ290b19iYWQ7CisKKwliYWNrdXAodmcpOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkIiwgdmctPm5hbWUpOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCitiYWQ6CisJcmV0dXJuIEVDTURfRkFJTEVEOworfQorCitpbnQgdmdpbXBvcnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworCisJaWYgKCFhcmdjICYmICFhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykgJiYgIWFyZ19pc19zZXQoY21kLCBzZWxlY3RfQVJHKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBzdXBwbHkgdm9sdW1lIGdyb3VwcyBvciAtUyBmb3Igc2VsZWN0aW9uIG9yIHVzZSAtYSBmb3IgYWxsLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSAmJiAoYXJnYyB8fCBhcmdfaXNfc2V0KGNtZCwgc2VsZWN0X0FSRykpKSB7CisJCWxvZ19lcnJvcigiTm8gYXJndW1lbnRzIHBlcm1pdHRlZCB3aGVuIHVzaW5nIC1hIGZvciBhbGwuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIGZvcmNlX0FSRykpIHsKKwkJLyoKKwkJICogVGhlIHZvbHVtZSBncm91cCBjYW5ub3QgYmUgcmVwYWlyZWQgdW5sZXNzIGl0IGlzIGZpcnN0CisJCSAqIGltcG9ydGVkLiAgSWYgd2UgZG9uJ3QgYWxsb3cgdGhlIHVzZXIgYSB3YXkgdG8gaW1wb3J0IHRoZQorCQkgKiBWRyB3aGlsZSBpdCBpcyAncGFydGlhbCcsIHRoZW4gd2Ugd2lsbCBoYXZlIGNyZWF0ZWQgYQorCQkgKiBjaXJjdWxhciBkZXBlbmRlbmN5LgorCQkgKgorCQkgKiBUaGUgcmVhc29uIHdlIGRvbid0IGp1c3Qgc2ltcGx5IHNldCAnaGFuZGxlc19taXNzaW5nX3B2cycKKwkJICogYnkgZGVmYXVsdCBpcyB0aGF0IHdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgY2FzZQorCQkgKiB3aGVyZSB0aGUgdXNlciBzaW1wbHkgZm9yZ290IHRvIG1vdmUgb25lIG9yIG1vcmUgZGlza3MgaW4KKwkJICogdGhlIFZHIGJlZm9yZSBydW5uaW5nICd2Z2ltcG9ydCcuCisJCSAqLworCQlsb2dfd2FybigiV0FSTklORzogVm9sdW1lIGdyb3VwcyB3aXRoIG1pc3NpbmcgUFZzIHdpbGwgYmUgaW1wb3J0ZWQgd2l0aCAtLWZvcmNlLiIpOworCQljbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMgPSAxOworCX0KKworCS8qCisJICogUmVzY2FuIGRldmljZXMgYW5kIHVwZGF0ZSBsdm1ldGFkLiAgbHZtZXRhZCBtYXkgaG9sZCBhIGNvcHkgb2YgdGhlCisJICogVkcgZnJvbSBiZWZvcmUgaXQgd2FzIGV4cG9ydGVkLCBpZiBpdCB3YXMgZXhwb3J0ZWQgYnkgYW5vdGhlciBob3N0LgorCSAqIFdlIG5lZWQgdG8gcmVyZWFkIGl0IHRvIHNlZSB0aGF0IGl0J3MgYmVlbiBleHBvcnRlZCBiZWZvcmUgd2UgY2FuCisJICogaW1wb3J0IGl0LgorCSAqLworCWlmIChsdm1ldGFkX3VzZWQoKSkgeworCQlpZiAoIWx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKGNtZCwgMSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNhY2hlIHVwZGF0ZSBmYWlsZWQuIik7CisJCQlsdm1ldGFkX21ha2VfdW51c2VkKGNtZCk7CisJCX0KKworCQlpZiAobHZtZXRhZF91c2VkKCkgJiYgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSAlcy4iLCByZWFzb24pOworCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQl9CisJfQorCisJcmV0dXJuIHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsCisJCQkgICAgICAgUkVBRF9GT1JfVVBEQVRFIHwgUkVBRF9BTExPV19FWFBPUlRFRCwKKwkJCSAgICAgICAwLCBOVUxMLAorCQkJICAgICAgICZ2Z2ltcG9ydF9zaW5nbGUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdpbXBvcnRjbG9uZS5jIGIvdG9vbHMvdmdpbXBvcnRjbG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjNhN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy92Z2ltcG9ydGNsb25lLmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuMS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInRvb2xzLmgiCisjaW5jbHVkZSAibHZtY2FjaGUuaCIKKyNpbmNsdWRlICJsdm1ldGFkLWNsaWVudC5oIgorI2luY2x1ZGUgImZpbHRlci5oIgorCitzdHJ1Y3QgdmdpbXBvcnRjbG9uZV9wYXJhbXMgeworCXVuc2lnbmVkIGRvbmU7CisJdW5zaWduZWQgdG90YWw7CisKKwlpbnQgaW1wb3J0X3ZnOworCWludCBmb3VuZF9hcmdzOworCXN0cnVjdCBkbV9saXN0IGFyZ19pbXBvcnQ7CisJY29uc3QgY2hhciAqYmFzZV92Z25hbWU7CisJY29uc3QgY2hhciAqb2xkX3ZnbmFtZTsKKwljb25zdCBjaGFyICpuZXdfdmduYW1lOworfTsKKworc3RydWN0IHZnaW1wb3J0Y2xvbmVfZGV2aWNlIHsKKwlzdHJ1Y3QgZG1fbGlzdCBsaXN0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBmb3VuZF9pbl92ZyA6IDE7Cit9OworCitzdGF0aWMgaW50IF92Z2ltcG9ydGNsb25lX3B2X3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkJICAgIHN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2LCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdmdpbXBvcnRjbG9uZV9wYXJhbXMgKnZwID0gKHN0cnVjdCB2Z2ltcG9ydGNsb25lX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IHZnaW1wb3J0Y2xvbmVfZGV2aWNlICp2ZDsKKworCWlmICh2ZyAmJiBpc19vcnBoYW5fdmcodmctPm5hbWUpKSB7CisJCWxvZ19lcnJvcigiQ2Fubm90IGltcG9ydCBjbG9uZSBvZiBvcnBoYW4gUFYgJXMuIiwgZGV2X25hbWUocHYtPmRldikpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKCEodmQgPSBkbV9wb29sX3phbGxvYyhjbWQtPm1lbSwgc2l6ZW9mKCp2ZCkpKSkgeworCQlsb2dfZXJyb3IoImFsbG9jIGZhaWxlZC4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCXZkLT5kZXYgPSBwdi0+ZGV2OworCWRtX2xpc3RfYWRkKCZ2cC0+YXJnX2ltcG9ydCwgJnZkLT5saXN0KTsKKworCWxvZ19kZWJ1ZygidmdpbXBvcnRjbG9uZSBkZXYgJXMgVkcgJXMgZm91bmQgdG8gaW1wb3J0IiwKKwkJICBkZXZfbmFtZSh2ZC0+ZGV2KSwgdmcgPyB2Zy0+bmFtZSA6ICI8bm9uZT4iKTsKKworCXZwLT5mb3VuZF9hcmdzKys7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX3ZnaW1wb3J0Y2xvbmVfdmdfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBjb25zdCBjaGFyICp2Z19uYW1lLAorCQkgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSkKK3sKKwljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3QgdmdpbXBvcnRjbG9uZV9wYXJhbXMgKnZwID0gKHN0cnVjdCB2Z2ltcG9ydGNsb25lX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisJc3RydWN0IHZnaW1wb3J0Y2xvbmVfZGV2aWNlICp2ZDsKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsLCAqbmV3X3B2bDsKKwlzdHJ1Y3QgbHZfbGlzdCAqbHZsOworCWludCBkZXZzX3VzZWRfZm9yX2x2ID0gMDsKKwlpbnQgZm91bmQ7CisKKwlpZiAodmdfaXNfZXhwb3J0ZWQodmcpICYmICF2cC0+aW1wb3J0X3ZnKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaXMgZXhwb3J0ZWQsIHVzZSB0aGUgLS1pbXBvcnQgb3B0aW9uLiIsIHZnLT5uYW1lKTsKKwkJZ290b19iYWQ7CisJfQorCisJaWYgKHZnX3N0YXR1cyh2ZykgJiBQQVJUSUFMX1ZHKSB7CisJCWxvZ19lcnJvcigiVkcgJXMgaXMgcGFydGlhbCwgaXQgbXVzdCBiZSBjb21wbGV0ZS4iLCB2Zy0+bmFtZSk7CisJCWdvdG9fYmFkOworCX0KKworCS8qCisJICogTi5CLiBsdnNfaW5fdmdfYWN0aXZhdGVkKCkgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkaXN0aW5ndWlzaAorCSAqIGJldHdlZW4gTFZzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgb3JpZ2luYWwgVkcgdnMgdGhlIGNsb25lZCBWRworCSAqIHRoYXQncyBiZWluZyBpbXBvcnRlZCwgc28gY2hlY2sgREVWX1VTRURfRk9SX0xWLgorCSAqLworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhwdmwsICZ2Zy0+cHZzKSB7CisJCWlmIChwdmwtPnB2LT5kZXYtPmZsYWdzICYgREVWX1VTRURfRk9SX0xWKSB7CisJCQlsb2dfZXJyb3IoIkRldmljZSAlcyBoYXMgYWN0aXZlIExWcywgZGVhY3RpdmF0ZSBmaXJzdC4iLCBkZXZfbmFtZShwdmwtPnB2LT5kZXYpKTsKKwkJCWRldnNfdXNlZF9mb3JfbHYrKzsKKwkJfQorCX0KKworCWlmIChkZXZzX3VzZWRfZm9yX2x2KQorCQlnb3RvX2JhZDsKKworCS8qCisJICogVGhlIGFyZ19pbXBvcnQgbGlzdCBtdXN0IG1hdGNoIHRoZSBQVnMgaW4gVkcuCisJICovCisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMocHZsLCAmdmctPnB2cykgeworCQlmb3VuZCA9IDA7CisKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZkLCAmdnAtPmFyZ19pbXBvcnQpIHsKKwkJCWlmIChwdmwtPnB2LT5kZXYgIT0gdmQtPmRldikKKwkJCQljb250aW51ZTsKKwkJCXZkLT5mb3VuZF9pbl92ZyA9IDE7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCWlmICghaWRfd3JpdGVfZm9ybWF0KCZwdmwtPnB2LT5pZCwgdXVpZCwgc2l6ZW9mKHV1aWQpKSkKKwkJCQlnb3RvX2JhZDsKKworCQkJLyogYWxsIFBWcyBpbiB0aGUgVkcgbXVzdCBiZSBpbXBvcnRlZCB0b2dldGhlciwgcHZsIGlzIG1pc3NpbmcgZnJvbSBhcmdzLiAqLworCQkJbG9nX2Vycm9yKCJQViB3aXRoIFVVSUQgJXMgaXMgcGFydCBvZiBWRyAlcywgYnV0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGV2aWNlcyB0byBpbXBvcnQuIiwKKwkJCQkgICB1dWlkLCB2Zy0+bmFtZSk7CisJCQlsb2dfZXJyb3IoIkFsbCBQVnMgaW4gdGhlIFZHIG11c3QgYmUgaW1wb3J0ZWQgdG9nZXRoZXIuIik7CisJCQlnb3RvX2JhZDsKKwkJfQorCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh2ZCwgJnZwLT5hcmdfaW1wb3J0KSB7CisJCWlmICghdmQtPmZvdW5kX2luX3ZnKSB7CisJCQkvKiBkZXZpY2UgYXJnIGlzIG5vdCBpbiB0aGUgVkcuICovCisJCQlsb2dfZXJyb3IoIkRldmljZSAlcyB3YXMgbm90IGZvdW5kIGluIFZHICVzLiIsIGRldl9uYW1lKHZkLT5kZXYpLCB2Zy0+bmFtZSk7CisJCQlsb2dfZXJyb3IoIlRoZSBkZXZpY2VzIHRvIGltcG9ydCBtdXN0IG1hdGNoIHRoZSBkZXZpY2VzIGluIHRoZSBWRy4iKTsKKwkJCWdvdG9fYmFkOworCQl9CisJfQorCisJLyoKKwkgKiBXcml0ZSBjaGFuZ2VzLgorCSAqLworCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKHZwLT5pbXBvcnRfdmcpCisJCXZnLT5zdGF0dXMgJj0gfkVYUE9SVEVEX1ZHOworCisJaWYgKCFpZF9jcmVhdGUoJnZnLT5pZCkpCisJCWdvdG9fYmFkOworCisJLyogTG93IGxldmVsIHZnX3dyaXRlIGNvZGUgbmVlZHMgb2xkX25hbWUgdG8gYmUgc2V0ISAqLworCXZnLT5vbGRfbmFtZSA9IHZnLT5uYW1lOworCisJaWYgKCEodmctPm5hbWUgPSBkbV9wb29sX3N0cmR1cCh2Zy0+dmdtZW0sIHZwLT5uZXdfdmduYW1lKSkpCisJCWdvdG9fYmFkOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKCEobmV3X3B2bCA9IGRtX3Bvb2xfemFsbG9jKHZnLT52Z21lbSwgc2l6ZW9mKCpuZXdfcHZsKSkpKQorCQkJZ290b19iYWQ7CisKKwkJbmV3X3B2bC0+cHYgPSBwdmwtPnB2OworCisJCWlmICghKHB2bC0+cHYtPnZnX25hbWUgPSBkbV9wb29sX3N0cmR1cCh2Zy0+dmdtZW0sIHZwLT5uZXdfdmduYW1lKSkpCisJCQlnb3RvX2JhZDsKKworCQlpZiAodnAtPmltcG9ydF92ZykKKwkJCW5ld19wdmwtPnB2LT5zdGF0dXMgJj0gfkVYUE9SVEVEX1ZHOworCisJCS8qIExvdyBsZXZlbCBwdl93cml0ZSBjb2RlIG5lZWRzIG9sZF9pZCB0byBiZSBzZXQhICovCisJCW1lbWNweSgmbmV3X3B2bC0+cHYtPm9sZF9pZCwgJm5ld19wdmwtPnB2LT5pZCwgc2l6ZW9mKG5ld19wdmwtPnB2LT5pZCkpOworCisJCWlmICghaWRfY3JlYXRlKCZuZXdfcHZsLT5wdi0+aWQpKQorCQkJZ290b19iYWQ7CisKKwkJZG1fbGlzdF9hZGQoJnZnLT5wdl93cml0ZV9saXN0LCAmbmV3X3B2bC0+bGlzdCk7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpCisJCW1lbWNweSgmbHZsLT5sdi0+bHZpZCwgJnZnLT5pZCwgc2l6ZW9mKHZnLT5pZCkpOworCisJaWYgKCF2Z193cml0ZSh2ZykgfHwgIXZnX2NvbW1pdCh2ZykpCisJCWdvdG9fYmFkOworCisJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworYmFkOgorCXJldHVybiBFQ01EX0ZBSUxFRDsKK30KKworaW50IHZnaW1wb3J0Y2xvbmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdmdpbXBvcnRjbG9uZV9wYXJhbXMgdnAgPSB7IDAgfTsKKwlzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IGRtX2xpc3QgdmduYW1laWRzX29uX3N5c3RlbTsgICAgIC8qIHZnbmFtZWlkX2xpc3QgKi8KKwlzdHJ1Y3QgdmduYW1laWRfbGlzdCAqdmdubDsKKwlzdHJ1Y3QgdmdpbXBvcnRjbG9uZV9kZXZpY2UgKnZkOworCXN0cnVjdCBsdm1jYWNoZV9pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKnZnbmFtZTsKKwljaGFyIGJhc2VfdmduYW1lW05BTUVfTEVOXSA9IHsgMCB9OworCWNoYXIgdG1wX3ZnbmFtZVtOQU1FX0xFTl0gPSB7IDAgfTsKKwl1bnNpZ25lZCBpbnQgdmduYW1lX2NvdW50OworCWludCBsdm1ldGFkX3Jlc2NhbiA9IDA7CisJaW50IHJldCA9IEVDTURfRkFJTEVEOworCisJaWYgKCFhcmdjKSB7CisJCWxvZ19lcnJvcigiUFYgbmFtZXMgcmVxdWlyZWQuIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlkbV9saXN0X2luaXQoJnZnbmFtZWlkc19vbl9zeXN0ZW0pOworCWRtX2xpc3RfaW5pdCgmdnAuYXJnX2ltcG9ydCk7CisKKwlzZXRfcHZfbm90aWZ5KGNtZCk7CisKKwl2cC5pbXBvcnRfdmcgPSBhcmdfaXNfc2V0KGNtZCwgaW1wb3J0X0FSRyk7CisKKwlpZiAobHZtZXRhZF91c2VkKCkpIHsKKwkJbHZtZXRhZF9zZXRfZGlzYWJsZWQoY21kLCBMVk1FVEFEX0RJU0FCTEVfUkVBU09OX0RVUExJQ0FURVMpOworCQlsdm1ldGFkX2Rpc2Nvbm5lY3QoKTsKKwkJbHZtZXRhZF9yZXNjYW4gPSAxOworCX0KKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSAmdnA7CisKKwlpZiAoIWxvY2tfdm9sKGNtZCwgVkdfR0xPQkFMLCBMQ0tfVkdfV1JJVEUsIE5VTEwpKSB7CisJCWxvZ19lcnJvcigiVW5hYmxlIHRvIG9idGFpbiBnbG9iYWwgbG9jay4iKTsKKwkJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoIWxvY2tkX2dsKGNtZCwgImV4IiwgMCkpCisJCWdvdG9fb3V0OworCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisKKwkvKgorCSAqIEZpbmQgdGhlIGRldmljZXMgYmVpbmcgaW1wb3J0ZWQgd2hpY2ggYXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJICogVGhleSBtYXkgYmUgaW4gdGhlIGxpc3Qgb2YgdW5jaG9zZW4gZHVwbGljYXRlcy4KKwkgKi8KKworCWxvZ19kZWJ1ZygiRmluZGluZyBkZXZpY2VzIHRvIGltcG9ydC4iKTsKKwljbWQtPmNvbW1hbmQtPmZsYWdzIHw9IEVOQUJMRV9EVVBMSUNBVEVfREVWUzsKKwlwcm9jZXNzX2VhY2hfcHYoY21kLCBhcmdjLCBhcmd2LCBOVUxMLCAwLCBSRUFEX0FMTE9XX0VYUE9SVEVELCBoYW5kbGUsIF92Z2ltcG9ydGNsb25lX3B2X3NpbmdsZSk7CisKKwlpZiAodnAuZm91bmRfYXJncyAhPSBhcmdjKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGZpbmQgYWxsIGRldmljZXMuIik7CisJCWdvdG9fb3V0OworCX0KKworCS8qCisJICogRmluZCB0aGUgVkcgbmFtZSBvZiB0aGUgUFZzIGJlaW5nIGltcG9ydGVkLCBzYXZlIGFzIG9sZF92Z25hbWUuCisJICogTi5CLiBJZiB2ZC0+ZGV2IGlzIGEgZHVwbGljYXRlLCB0aGVuIGl0IG1heSBub3QgbWF0Y2ggaW5mby0+ZGV2LgorCSAqLworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHZkLCAmdnAuYXJnX2ltcG9ydCkgeworCQlpZiAoIShpbmZvID0gbHZtY2FjaGVfaW5mb19mcm9tX3B2aWQodmQtPmRldi0+cHZpZCwgTlVMTCwgMCkpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIFBWSUQgZm9yIGRldmljZSAlcyBpbiBsdm1jYWNoZS4iLCBkZXZfbmFtZSh2ZC0+ZGV2KSk7CisJCQlnb3RvX291dDsKKwkJfQorCisJCWlmICghKHZnbmFtZSA9IGx2bWNhY2hlX3ZnbmFtZV9mcm9tX2luZm8oaW5mbykpKSB7CisJCQlsb2dfZXJyb3IoIkZhaWxlZCB0byBmaW5kIFZHIG5hbWUgZm9yIGRldmljZSAlcyBpbiBsdm1jYWNoZS4iLCBkZXZfbmFtZSh2ZC0+ZGV2KSk7CisJCQlnb3RvX291dDsKKwkJfQorCisJCWlmICghdnAub2xkX3ZnbmFtZSkgeworCQkJaWYgKCEodnAub2xkX3ZnbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z25hbWUpKSkKKwkJCQlnb3RvX291dDsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAodnAub2xkX3ZnbmFtZSwgdmduYW1lKSkgeworCQkJCWxvZ19lcnJvcigiRGV2aWNlcyBtdXN0IGJlIGZyb20gdGhlIHNhbWUgVkcuIik7CisJCQkJZ290b19vdXQ7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFBpY2sgYSBuZXcgVkcgbmFtZSwgc2F2ZSBhcyBuZXdfdmduYW1lLiAgVGhlIG5ldyBuYW1lIGJlZ2lucyB3aXRoCisJICogdGhlIGJhc2V2Z25hbWUgb3Igb2xkX3ZnbmFtZSwgcGx1cyBhICRpIHN1ZmZpeCwgaWYgbmVjZXNzYXJ5LCB0bworCSAqIG1ha2UgaXQgdW5pcXVlLiAgVGhpcyByZXF1aXJlcyBjb21wYXJpbmcgdGhlIG9sZF92Z25hbWUgd2l0aCBhbGwgdGhlCisJICogVkcgbmFtZXMgb24gdGhlIHN5c3RlbS4KKwkgKi8KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgYmFzZXZnbmFtZV9BUkcpKSB7CisJCXNucHJpbnRmKGJhc2VfdmduYW1lLCBzaXplb2YoYmFzZV92Z25hbWUpIC0gMSwgIiVzIiwgYXJnX3N0cl92YWx1ZShjbWQsIGJhc2V2Z25hbWVfQVJHLCAiIikpOworCQltZW1jcHkodG1wX3ZnbmFtZSwgYmFzZV92Z25hbWUsIE5BTUVfTEVOKTsKKwkJdmduYW1lX2NvdW50ID0gMDsKKwl9IGVsc2UgeworCQlzbnByaW50ZihiYXNlX3ZnbmFtZSwgc2l6ZW9mKGJhc2VfdmduYW1lKSAtIDEsICIlcyIsIHZwLm9sZF92Z25hbWUpOworCQlzbnByaW50Zih0bXBfdmduYW1lLCBzaXplb2YodG1wX3ZnbmFtZSkgLSAxLCAiJXMxIiwgdnAub2xkX3ZnbmFtZSk7CisJCXZnbmFtZV9jb3VudCA9IDE7CisJfQorCisJaWYgKCFnZXRfdmduYW1laWRzKGNtZCwgJnZnbmFtZWlkc19vbl9zeXN0ZW0sIE5VTEwsIDApKQorCQlnb3RvX291dDsKKworcmV0cnlfbmFtZToKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXModmdubCwgJnZnbmFtZWlkc19vbl9zeXN0ZW0pIHsKKwkJaWYgKCFzdHJjbXAodmdubC0+dmdfbmFtZSwgdG1wX3ZnbmFtZSkpIHsKKwkJCXZnbmFtZV9jb3VudCsrOworCQkJc25wcmludGYodG1wX3ZnbmFtZSwgc2l6ZW9mKHRtcF92Z25hbWUpIC0gMSwgIiVzJXUiLCBiYXNlX3ZnbmFtZSwgdmduYW1lX2NvdW50KTsKKwkJCWdvdG8gcmV0cnlfbmFtZTsKKwkJfQorCX0KKworCWlmICghKHZwLm5ld192Z25hbWUgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdG1wX3ZnbmFtZSkpKQorCQlnb3RvX291dDsKKwlsb2dfZGVidWcoIlVzaW5nIG5ldyBWRyBuYW1lICVzLiIsIHZwLm5ld192Z25hbWUpOworCisJLyoKKwkgKiBDcmVhdGUgYSBkZXZpY2UgZmlsdGVyIHNvIHRoYXQgd2UgYXJlIG9ubHkgd29ya2luZyB3aXRoIHRoZSBkZXZpY2VzCisJICogaW4gYXJnX2ltcG9ydC4gIFdpdGggdGhlIG9yaWdpbmFsIGRldnMgaGlkZGVuICh0aGF0IGFyZ19pbXBvcnQgd2VyZQorCSAqIGNsb25lZCBmcm9tKSwgd2UgY2FuIHJlYWQgYW5kIHdyaXRlIHRoZSBjbG9uZWQgUFZzIGFuZCBWRyB3aXRob3V0CisJICogdG91Y2hpbmcgdGhlIG9yaWdpbmFsIFBWcy9WRy4KKwkgKi8KKworCWluaXRfaW50ZXJuYWxfZmlsdGVyaW5nKDEpOworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyh2ZCwgJnZwLmFyZ19pbXBvcnQpCisJCWludGVybmFsX2ZpbHRlcl9hbGxvdyhjbWQtPm1lbSwgdmQtPmRldik7CisJbHZtY2FjaGVfZGVzdHJveShjbWQsIDEsIDApOworCWRldl9jYWNoZV9mdWxsX3NjYW4oY21kLT5mdWxsX2ZpbHRlcik7CisKKwlsb2dfZGVidWcoIkNoYW5naW5nIFZHICVzIHRvICVzLiIsIHZwLm9sZF92Z25hbWUsIHZwLm5ld192Z25hbWUpOworCisJLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGUgbmV3IG5hbWUgY29tZXMgYmVmb3JlIHRoZSBvbGQgaW4gbG9jayBvcmRlci4gKi8KKwlsdm1jYWNoZV9sb2NrX29yZGVyaW5nKDApOworCisJaWYgKCFsb2NrX3ZvbChjbWQsIHZwLm5ld192Z25hbWUsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3IgbmV3IFZHIG5hbWUgJXMiLCB2cC5uZXdfdmduYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcHJvY2Vzc19lYWNoX3ZnKGNtZCwgMCwgTlVMTCwgdnAub2xkX3ZnbmFtZSwgTlVMTCwgUkVBRF9GT1JfVVBEQVRFIHwgUkVBRF9BTExPV19FWFBPUlRFRCwgMCwgaGFuZGxlLCBfdmdpbXBvcnRjbG9uZV92Z19zaW5nbGUpOworCisJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgdnAubmV3X3ZnbmFtZSk7CitvdXQ6CisJdW5sb2NrX3ZnKGNtZCwgTlVMTCwgVkdfR0xPQkFMKTsKKwlpbnRlcm5hbF9maWx0ZXJfY2xlYXIoKTsKKwlpbml0X2ludGVybmFsX2ZpbHRlcmluZygwKTsKKwlsdm1jYWNoZV9sb2NrX29yZGVyaW5nKDEpOworCWRlc3Ryb3lfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBoYW5kbGUpOworCisJLyogRW5hYmxlIGx2bWV0YWQgYWdhaW4gaWYgbm8gZHVwbGljYXRlcyBhcmUgbGVmdC4gKi8KKwlpZiAobHZtZXRhZF9yZXNjYW4pIHsKKwkJaWYgKCFsdm1ldGFkX2Nvbm5lY3QoY21kKSkgeworCQkJbG9nX3dhcm4oIldBUk5JTkc6IEZhaWxlZCB0byBjb25uZWN0IHRvIGx2bWV0YWQuIik7CisJCQlsb2dfd2FybigiV0FSTklORzogVXBkYXRlIGx2bWV0YWQgd2l0aCBwdnNjYW4gLS1jYWNoZS4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoIXJlZnJlc2hfZmlsdGVycyhjbWQpKQorCQkJc3RhY2s7CisKKwkJaWYgKCFsdm1ldGFkX3B2c2Nhbl9hbGxfZGV2cyhjbWQsIDEpKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogRmFpbGVkIHRvIHNjYW4gZGV2aWNlcy4iKTsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBVcGRhdGUgbHZtZXRhZCB3aXRoIHB2c2NhbiAtLWNhY2hlLiIpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdtZXJnZS5jIGIvdG9vbHMvdmdtZXJnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWU0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy92Z21lcmdlLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKl92Z21lcmdlX3ZnX3JlYWQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICAgY29uc3QgY2hhciAqdmdfbmFtZSkKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZzsKKwlsb2dfdmVyYm9zZSgiQ2hlY2tpbmcgZm9yIHZvbHVtZSBncm91cCBcIiVzXCIiLCB2Z19uYW1lKTsKKwl2ZyA9IHZnX3JlYWRfZm9yX3VwZGF0ZShjbWQsIHZnX25hbWUsIE5VTEwsIDAsIDApOworCWlmICh2Z19yZWFkX2Vycm9yKHZnKSkgeworCQlyZWxlYXNlX3ZnKHZnKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGlzX2xvY2tkX3R5cGUodmctPmxvY2tfdHlwZSkpIHsKKwkJbG9nX2Vycm9yKCJ2Z21lcmdlIG5vdCBhbGxvd2VkIGZvciBsb2NrX3R5cGUgJXMiLCB2Zy0+bG9ja190eXBlKTsKKwkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmcsIHZnX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gdmc7Cit9CisKKy8qIFNlbGVjdCBiaWdnZXIgcG9vbCBtZXRhZGF0YSBzcGFyZSB2b2x1bWUgKi8KK3N0YXRpYyBpbnQgX3ZnbWVyZ2Vfc2VsZWN0X3Bvb2xfbWV0YWRhdGFfc3BhcmUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsCisJCQkJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190bywKKwkJCQkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20pCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqc3ZnOworCisJaWYgKCF2Z190by0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdiB8fAorCSAgICAhdmdfZnJvbS0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdikKKwkJcmV0dXJuIDE7IC8qIG5vIHByb2JsZW0gKi8KKworCS8qIERyb3Agc21hbGxlciBwb29sIG1ldGFkYXRhIHNwYXJlICovCisJc3ZnID0gKHZnX3RvLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2LT5sZV9jb3VudCA8CisJICAgICAgIHZnX2Zyb20tPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYtPmxlX2NvdW50KSA/IHZnX3RvIDogdmdfZnJvbTsKKwl2Z19yZW1vdmVfcG9vbF9tZXRhZGF0YV9zcGFyZShzdmcpOworCisJLyogUmUtdGVzdCBsdiBuYW1lIGNvbXBhdGliaWxpdHkgKi8KKwlpZiAoIXZnc19hcmVfY29tcGF0aWJsZShjbWQsIHZnX2Zyb20sIHZnX3RvKSkKKwkJcmV0dXJuXzA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfdmdtZXJnZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWVfdG8sCisJCQkgICBjb25zdCBjaGFyICp2Z19uYW1lX2Zyb20pCit7CisJc3RydWN0IHB2X2xpc3QgKnB2bCwgKnRwdmw7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8sICp2Z19mcm9tOworCXN0cnVjdCBsdl9saXN0ICpsdmwxLCAqbHZsMjsKKwlpbnQgciA9IEVDTURfRkFJTEVEOworCWludCBsb2NrX3ZnX2Zyb21fZmlyc3QgPSAwOworCisJaWYgKCFzdHJjbXAodmdfbmFtZV90bywgdmdfbmFtZV9mcm9tKSkgeworCQlsb2dfZXJyb3IoIkR1cGxpY2F0ZSB2b2x1bWUgZ3JvdXAgbmFtZSBcIiVzXCIiLCB2Z19uYW1lX2Zyb20pOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKHN0cmNtcCh2Z19uYW1lX3RvLCB2Z19uYW1lX2Zyb20pID4gMCkKKwkJbG9ja192Z19mcm9tX2ZpcnN0ID0gMTsKKworCWlmIChsb2NrX3ZnX2Zyb21fZmlyc3QpIHsKKwkJaWYgKCEodmdfZnJvbSA9IF92Z21lcmdlX3ZnX3JlYWQoY21kLCB2Z19uYW1lX2Zyb20pKSkKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJaWYgKCEodmdfdG8gPSBfdmdtZXJnZV92Z19yZWFkKGNtZCwgdmdfbmFtZV90bykpKSB7CisJCQl1bmxvY2tfYW5kX3JlbGVhc2VfdmcoY21kLCB2Z19mcm9tLCB2Z19uYW1lX2Zyb20pOworCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCEodmdfdG8gPSBfdmdtZXJnZV92Z19yZWFkKGNtZCwgdmdfbmFtZV90bykpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJCWlmICghKHZnX2Zyb20gPSBfdmdtZXJnZV92Z19yZWFkKGNtZCwgdmdfbmFtZV9mcm9tKSkpIHsKKwkJCXVubG9ja19hbmRfcmVsZWFzZV92ZyhjbWQsIHZnX3RvLCB2Z19uYW1lX3RvKTsKKwkJCXJldHVybl9FQ01EX0ZBSUxFRDsKKwkJfQorCX0KKworCWlmICghdmdzX2FyZV9jb21wYXRpYmxlKGNtZCwgdmdfZnJvbSwgdmdfdG8pKQorCQlnb3RvX2JhZDsKKworCS8qIEZJWE1FIExpc3QgYXJnOiB2Z19zaG93X3dpdGhfcHZfYW5kX2x2KHZnX3RvKTsgKi8KKworCWlmICghYXJjaGl2ZSh2Z19mcm9tKSB8fCAhYXJjaGl2ZSh2Z190bykpCisJCWdvdG9fYmFkOworCisJaWYgKCFkcm9wX2NhY2hlZF9tZXRhZGF0YSh2Z19mcm9tKSkKKwkJc3RhY2s7CisKKwlpZiAoIV92Z21lcmdlX3NlbGVjdF9wb29sX21ldGFkYXRhX3NwYXJlKGNtZCwgdmdfdG8sIHZnX2Zyb20pKQorCQlnb3RvX2JhZDsKKworCS8qIE1lcmdlIHZvbHVtZSBncm91cHMgKi8KKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXNfc2FmZShwdmwsIHRwdmwsICZ2Z19mcm9tLT5wdnMpIHsKKwkJZGVsX3B2bF9mcm9tX3Zncyh2Z19mcm9tLCBwdmwpOworCQlhZGRfcHZsX3RvX3Zncyh2Z190bywgcHZsKTsKKwkJcHZsLT5wdi0+dmdfbmFtZSA9IGRtX3Bvb2xfc3RyZHVwKGNtZC0+bWVtLCB2Z190by0+bmFtZSk7CisJfQorCisJLyogRml4IHVwIExWSURzICovCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bDEsICZ2Z190by0+bHZzKSB7CisJCXVuaW9uIGx2aWQgKmx2aWQxID0gJmx2bDEtPmx2LT5sdmlkOworCQljaGFyIHV1aWRbNjRdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsMiwgJnZnX2Zyb20tPmx2cykgeworCQkJdW5pb24gbHZpZCAqbHZpZDIgPSAmbHZsMi0+bHYtPmx2aWQ7CisKKwkJCWlmIChpZF9lcXVhbCgmbHZpZDEtPmlkWzFdLCAmbHZpZDItPmlkWzFdKSkgeworCQkJCWlmICghaWRfY3JlYXRlKCZsdmlkMi0+aWRbMV0pKSB7CisJCQkJCWxvZ19lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyAiCisJCQkJCQkgICJyYW5kb20gTFZJRCBmb3IgJXMiLAorCQkJCQkJICBsdmwyLT5sdi0+bmFtZSk7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCQlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmbHZpZDItPmlkWzFdLCB1dWlkLAorCQkJCQkJICAgICBzaXplb2YodXVpZCkpKQorCQkJCQlnb3RvX2JhZDsKKworCQkJCWxvZ192ZXJib3NlKCJDaGFuZ2VkIExWSUQgZm9yICVzIHRvICVzIiwKKwkJCQkJICAgIGx2bDItPmx2LT5uYW1lLCB1dWlkKTsKKwkJCX0KKwkJfQorCX0KKworCWRtX2xpc3RfaXRlcmF0ZV9pdGVtcyhsdmwxLCAmdmdfZnJvbS0+bHZzKSB7CisJCWx2bDEtPmx2LT52ZyA9IHZnX3RvOworCQlsdmwxLT5sdi0+bHZpZC5pZFswXSA9IGx2bDEtPmx2LT52Zy0+aWQ7CisJfQorCisJd2hpbGUgKCFkbV9saXN0X2VtcHR5KCZ2Z19mcm9tLT5sdnMpKSB7CisJCXN0cnVjdCBkbV9saXN0ICpsdmggPSB2Z19mcm9tLT5sdnMubjsKKworCQlkbV9saXN0X21vdmUoJnZnX3RvLT5sdnMsIGx2aCk7CisJfQorCisJd2hpbGUgKCFkbV9saXN0X2VtcHR5KCZ2Z19mcm9tLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZSkpIHsKKwkJc3RydWN0IGRtX2xpc3QgKm1kYWggPSB2Z19mcm9tLT5maWQtPm1ldGFkYXRhX2FyZWFzX2luX3VzZS5uOworCisJCWRtX2xpc3RfbW92ZSgmdmdfdG8tPmZpZC0+bWV0YWRhdGFfYXJlYXNfaW5fdXNlLCBtZGFoKTsKKwl9CisKKwl3aGlsZSAoIWRtX2xpc3RfZW1wdHkoJnZnX2Zyb20tPmZpZC0+bWV0YWRhdGFfYXJlYXNfaWdub3JlZCkpIHsKKwkJc3RydWN0IGRtX2xpc3QgKm1kYWggPSB2Z19mcm9tLT5maWQtPm1ldGFkYXRhX2FyZWFzX2lnbm9yZWQubjsKKworCQlkbV9saXN0X21vdmUoJnZnX3RvLT5maWQtPm1ldGFkYXRhX2FyZWFzX2lnbm9yZWQsIG1kYWgpOworCX0KKworCWlmICghdmdfdG8tPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHYpCisJCXZnX3RvLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2ID0KKwkJCXZnX2Zyb20tPnBvb2xfbWV0YWRhdGFfc3BhcmVfbHY7CisKKwl2Z190by0+ZXh0ZW50X2NvdW50ICs9IHZnX2Zyb20tPmV4dGVudF9jb3VudDsKKwl2Z190by0+ZnJlZV9jb3VudCArPSB2Z19mcm9tLT5mcmVlX2NvdW50OworCisJLyogc3RvcmUgaXQgb24gZGlza3MgKi8KKwlsb2dfdmVyYm9zZSgiV3JpdGluZyBvdXQgdXBkYXRlZCB2b2x1bWUgZ3JvdXAiKTsKKwlpZiAoIXZnX3dyaXRlKHZnX3RvKSB8fCAhdmdfY29tbWl0KHZnX3RvKSkKKwkJZ290b19iYWQ7CisKKwkvKiBGSVhNRSBSZW1vdmUgL2Rldi92Z2Zyb20gKi8KKworCWJhY2t1cCh2Z190byk7CisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IG1lcmdlZCBpbnRvIFwiJXNcIiIsCisJCQkJdmdfZnJvbS0+bmFtZSwgdmdfdG8tPm5hbWUpOworCXIgPSBFQ01EX1BST0NFU1NFRDsKK2JhZDoKKwkvKgorCSAqIE5vdGU6IGFzIHZnX3RvIGlzIHJlZmVyZW5jaW5nIG1vdmVkIGVsZW1lbnRzIGZyb20gdmdfZnJvbQorCSAqIHRoZSBvcmRlciBvZiByZWxlYXNlX3ZnIGNhbGxzIGlzIG1hbmRhdG9yeS4KKwkgKi8KKwl1bmxvY2tfYW5kX3JlbGVhc2VfdmcoY21kLCB2Z190bywgdmdfbmFtZV90byk7CisJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmdfZnJvbSwgdmdfbmFtZV9mcm9tKTsKKworCXJldHVybiByOworfQorCitpbnQgdmdtZXJnZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnZnX25hbWVfdG8sICp2Z19uYW1lX2Zyb207CisJaW50IG9wdCA9IDA7CisJaW50IHJldCA9IDAsIHJldF9tYXggPSAwOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGVudGVyIDIgb3IgbW9yZSB2b2x1bWUgZ3JvdXBzIHRvIG1lcmdlIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwkvKiBOZWVkZWQgY2hhbmdlIHRoZSBnbG9iYWwgVkcgbmFtZXNwYWNlLiAqLworCWlmICghbG9ja2RfZ2woY21kLCAiZXgiLCBMREdMX1VQREFURV9OQU1FUykpCisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKworCXZnX25hbWVfdG8gPSBza2lwX2Rldl9kaXIoY21kLCBhcmd2WzBdLCBOVUxMKTsKKwlhcmdjLS07CisJYXJndisrOworCisJZm9yICg7IG9wdCA8IGFyZ2M7IG9wdCsrKSB7CisJCXZnX25hbWVfZnJvbSA9IHNraXBfZGV2X2RpcihjbWQsIGFyZ3Zbb3B0XSwgTlVMTCk7CisKKwkJcmV0ID0gX3ZnbWVyZ2Vfc2luZ2xlKGNtZCwgdmdfbmFtZV90bywgdmdfbmFtZV9mcm9tKTsKKwkJaWYgKHJldCA+IHJldF9tYXgpCisJCQlyZXRfbWF4ID0gcmV0OworCX0KKworCXJldHVybiByZXRfbWF4OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdta25vZGVzLmMgYi90b29scy92Z21rbm9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTc0ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdta25vZGVzLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IF92Z21rbm9kZXNfc2luZ2xlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LAorCQkJICAgICBzdHJ1Y3QgcHJvY2Vzc2luZ19oYW5kbGUgKmhhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlpZiAoYXJnX2lzX3NldChjbWQsIHJlZnJlc2hfQVJHKSAmJiBsdl9pc192aXNpYmxlKGx2KSkKKwkJaWYgKCFsdl9yZWZyZXNoKGNtZCwgbHYpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCFsdl9ta25vZGVzKGNtZCwgbHYpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCB2Z21rbm9kZXMoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoIWx2X21rbm9kZXMoY21kLCBOVUxMKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJcmV0dXJuIHByb2Nlc3NfZWFjaF9sdihjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsIExDS19WR19SRUFELCBOVUxMLCAmX3ZnbWtub2Rlc19zaW5nbGUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdyZWR1Y2UuYyBiL3Rvb2xzL3ZncmVkdWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ZjUwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZncmVkdWNlLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RydWN0IHZncmVkdWNlX3BhcmFtcyB7CisJaW50IGZvcmNlOworCWludCBmaXhlZDsKKwlpbnQgYWxyZWFkeV9jb25zaXN0ZW50OworfTsKKworc3RhdGljIGludCBfcmVtb3ZlX3B2KHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnLCBzdHJ1Y3QgcHZfbGlzdCAqcHZsLCBpbnQgc2lsZW50KQoreworCWNoYXIgdXVpZFs2NF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisJaWYgKHZnLT5wdl9jb3VudCA9PSAxKSB7CisJCWxvZ19lcnJvcigiVm9sdW1lIEdyb3VwcyBtdXN0IGFsd2F5cyBjb250YWluIGF0IGxlYXN0IG9uZSBQViIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlkX3dyaXRlX2Zvcm1hdCgmcHZsLT5wdi0+aWQsIHV1aWQsIHNpemVvZih1dWlkKSkpCisJCXJldHVybl8wOworCisJbG9nX3ZlcmJvc2UoIlJlbW92aW5nIFBWIHdpdGggVVVJRCAlcyBmcm9tIFZHICVzIiwgdXVpZCwgdmctPm5hbWUpOworCisJaWYgKHB2bC0+cHYtPnBlX2FsbG9jX2NvdW50KSB7CisJCWlmICghc2lsZW50KQorCQkJbG9nX2Vycm9yKCJMVnMgc3RpbGwgcHJlc2VudCBvbiBQViB3aXRoIFVVSUQgJXM6ICIKKwkJCQkgICJDYW4ndCByZW1vdmUgZnJvbSBWRyAlcyIsIHV1aWQsIHZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmctPmZyZWVfY291bnQgLT0gcHZsLT5wdi0+cGVfY291bnQ7CisJdmctPmV4dGVudF9jb3VudCAtPSBwdmwtPnB2LT5wZV9jb3VudDsKKwlkZWxfcHZsX2Zyb21fdmdzKHZnLCBwdmwpOworCWZyZWVfcHZfZmlkKHB2bC0+cHYpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnNvbGlkYXRlX3ZnKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgcHZfbGlzdCAqcHZsOworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJaW50IHIgPSAxOworCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKGx2bCwgJnZnLT5sdnMpCisJCWlmIChsdl9pc19wYXJ0aWFsKGx2bC0+bHYpKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogUGFydGlhbCBMViAlcyBuZWVkcyB0byBiZSByZXBhaXJlZCAiCisJCQkJICJvciByZW1vdmVkLiAiLCBsdmwtPmx2LT5uYW1lKTsKKwkJCXIgPSAwOworCQl9CisKKwlpZiAoIXIpIHsKKwkJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKwkJbG9nX2Vycm9yKCJUaGVyZSBhcmUgc3RpbGwgcGFydGlhbCBMVnMgaW4gVkcgJXMuIiwgdmctPm5hbWUpOworCQlsb2dfZXJyb3IoIlRvIHJlbW92ZSB0aGVtIHVuY29uZGl0aW9uYWxseSB1c2U6IHZncmVkdWNlIC0tcmVtb3ZlbWlzc2luZyAtLWZvcmNlLiIpOworCQlsb2dfd2FybigiUHJvY2VlZGluZyB0byByZW1vdmUgZW1wdHkgbWlzc2luZyBQVnMuIik7CisJfQorCisJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHB2bCwgJnZnLT5wdnMpIHsKKwkJaWYgKHB2bC0+cHYtPmRldiAmJiAhaXNfbWlzc2luZ19wdihwdmwtPnB2KSkKKwkJCWNvbnRpbnVlOworCQlpZiAociAmJiAhX3JlbW92ZV9wdih2ZywgcHZsLCAwKSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9tYWtlX3ZnX2NvbnNpc3RlbnQoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnKQoreworCXN0cnVjdCBsdl9saXN0ICpsdmw7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKworCWNtZC0+cGFydGlhbF9hY3RpdmF0aW9uID0gMTsKKworIHJlc3RhcnQ6CisJdmdfbWFya19wYXJ0aWFsX2x2cyh2ZywgMSk7CisKKwlkbV9saXN0X2l0ZXJhdGVfaXRlbXMobHZsLCAmdmctPmx2cykgeworCQlsdiA9IGx2bC0+bHY7CisKKwkJLyogQXJlIGFueSBzZWdtZW50cyBvZiB0aGlzIExWIG9uIG1pc3NpbmcgUFZzPyAqLworCQlpZiAobHZfaXNfcGFydGlhbChsdikpIHsKKwkJCWlmIChzZWdfaXNfcmFpZChmaXJzdF9zZWcobHYpKSkgeworCQkJCWlmICghbHZfcmFpZF9yZW1vdmVfbWlzc2luZyhsdikpCisJCQkJCXJldHVybl8wOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKworCQkJaWYgKGx2X2lzX21pcnJvcihsdikpIHsKKwkJCQlpZiAoIW1pcnJvcl9yZW1vdmVfbWlzc2luZyhjbWQsIGx2LCAxKSkKKwkJCQkJcmV0dXJuXzA7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCisJCQlpZiAoYXJnX2lzX3NldChjbWQsIG1pcnJvcnNvbmx5X0FSRykgJiYgIWx2X2lzX21pcnJvcmVkKGx2KSkgeworCQkJCWxvZ19lcnJvcigiTm9uLW1pcnJvci1pbWFnZSBMViAlcyBmb3VuZDogY2FuJ3QgcmVtb3ZlLiIsIGx2LT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFsdl9pc192aXNpYmxlKGx2KSkKKwkJCQljb250aW51ZTsKKwkJCWxvZ193YXJuKCJSZW1vdmluZyBwYXJ0aWFsIExWICVzLiIsIGx2LT5uYW1lKTsKKwkJCWlmICghbHZfcmVtb3ZlX3dpdGhfZGVwZW5kZW5jaWVzKGNtZCwgbHYsIERPTlRfUFJPTVBULCAwKSkKKwkJCQlyZXR1cm5fMDsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKworCV9jb25zb2xpZGF0ZV92ZyhjbWQsIHZnKTsKKworCXJldHVybiAxOworfQorCisvKiBPciB0YWtlIHB2X25hbWUgaW5zdGVhZD8gKi8KK3N0YXRpYyBpbnQgX3ZncmVkdWNlX3NpbmdsZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgICAgc3RydWN0IHBoeXNpY2FsX3ZvbHVtZSAqcHYsCisJCQkgICAgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJaW50IHI7CisKKwlpZiAoIXZnX2NoZWNrX3N0YXR1cyh2ZywgRVhQT1JURURfVkcgfCBMVk1fV1JJVEUgfCBSRVNJWkVBQkxFX1ZHKSkKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCisJciA9IHZncmVkdWNlX3NpbmdsZShjbWQsIHZnLCBwdiwgMSk7CisJaWYgKCFyKQorCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX3ZncmVkdWNlX3JlcGFpcl9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Zywgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHZncmVkdWNlX3BhcmFtcyAqdnAgPSAoc3RydWN0IHZncmVkdWNlX3BhcmFtcyAqKSBoYW5kbGUtPmN1c3RvbV9oYW5kbGU7CisKKwlpZiAoIXZnX21pc3NpbmdfcHZfY291bnQodmcpKSB7CisJCXZwLT5hbHJlYWR5X2NvbnNpc3RlbnQgPSAxOworCQlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7CisJfQorCisJaWYgKCFhcmNoaXZlKHZnKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKHZwLT5mb3JjZSkgeworCQlpZiAoIV9tYWtlX3ZnX2NvbnNpc3RlbnQoY21kLCB2ZykpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCXZwLT5maXhlZCA9IDE7CisJfSBlbHNlCisJCXZwLT5maXhlZCA9IF9jb25zb2xpZGF0ZV92ZyhjbWQsIHZnKTsKKworCWlmICghdmdfd3JpdGUodmcpIHx8ICF2Z19jb21taXQodmcpKSB7CisJCWxvZ19lcnJvcigiRmFpbGVkIHRvIHdyaXRlIG91dCBhIGNvbnNpc3RlbnQgVkcgZm9yICVzIiwgdmdfbmFtZSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwliYWNrdXAodmcpOworCXJldHVybiBFQ01EX1BST0NFU1NFRDsKK30KKworaW50IHZncmVkdWNlKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGU7CisJc3RydWN0IHZncmVkdWNlX3BhcmFtcyB2cCA9IHsgMCB9OworCWNvbnN0IGNoYXIgKnZnX25hbWU7CisJaW50IHJlcGFpcmluZyA9IGFyZ19pc19zZXQoY21kLCByZW1vdmVtaXNzaW5nX0FSRyk7CisJaW50IHNhdmVkX2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyA9IGlnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcygpOworCWludCByZXQ7CisKKwlpZiAoIWFyZ2MgJiYgIXJlcGFpcmluZykgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBnaXZlIHZvbHVtZSBncm91cCBuYW1lIGFuZCAiCisJCQkgICJwaHlzaWNhbCB2b2x1bWUgcGF0aHMiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKwkKKwlpZiAoIWFyZ2MpIHsgLyogcmVwYWlyaW5nICovCisJCWxvZ19lcnJvcigiUGxlYXNlIGdpdmUgdm9sdW1lIGdyb3VwIG5hbWUiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWlycm9yc29ubHlfQVJHKSAmJiAhcmVwYWlyaW5nKSB7CisJCWxvZ19lcnJvcigiLS1taXJyb3Jzb25seSByZXF1aXJlcyAtLXJlbW92ZW1pc3NpbmciKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdjID09IDEgJiYgIWFyZ19pc19zZXQoY21kLCBhbGxfQVJHKSAmJiAhcmVwYWlyaW5nKSB7CisJCWxvZ19lcnJvcigiUGxlYXNlIGVudGVyIHBoeXNpY2FsIHZvbHVtZSBwYXRocyBvciBvcHRpb24gLWEiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdjID4gMSAmJiBhcmdfaXNfc2V0KGNtZCwgYWxsX0FSRykpIHsKKwkJbG9nX2Vycm9yKCJPcHRpb24gLWEgYW5kIHBoeXNpY2FsIHZvbHVtZSBwYXRocyBtdXR1YWxseSAiCisJCQkgICJleGNsdXNpdmUiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCWlmIChhcmdjID4gMSAmJiByZXBhaXJpbmcpIHsKKwkJbG9nX2Vycm9yKCJQbGVhc2Ugb25seSBzcGVjaWZ5IHRoZSB2b2x1bWUgZ3JvdXAiKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCXZnX25hbWUgPSBza2lwX2Rldl9kaXIoY21kLCBhcmd2WzBdLCBOVUxMKTsKKwlhcmd2Kys7CisJYXJnYy0tOworCisJLyogTmVlZGVkIHRvIGNoYW5nZSB0aGUgc2V0IG9mIG9ycGhhbiBQVnMuICovCisJaWYgKCFsb2NrZF9nbChjbWQsICJleCIsIDApKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJY21kLT5sb2NrZF9nbF9kaXNhYmxlID0gMTsKKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKwloYW5kbGUtPmN1c3RvbV9oYW5kbGUgPSAmdnA7CisKKwlpZiAoIXJlcGFpcmluZykgeworCQkvKiBGSVhNRTogUGFzcyBwcml2YXRlIHN0cnVjdCB0aHJvdWdoIHRvIGFsbCB0aGVzZSBmdW5jdGlvbnMgKi8KKwkJLyogYW5kIHVwZGF0ZSBpbiBiYXRjaCBhZnRlcndhcmRzPyAqLworCQlyZXQgPSBwcm9jZXNzX2VhY2hfcHYoY21kLCBhcmdjLCBhcmd2LCB2Z19uYW1lLCAwLCBSRUFEX0ZPUl9VUERBVEUsIGhhbmRsZSwgX3ZncmVkdWNlX3NpbmdsZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVkcgcmVwYWlyIChyZW1vdmVtaXNzaW5nKQorCSAqLworCisJdnAuZm9yY2UgPSBhcmdfY291bnQoY21kLCBmb3JjZV9BUkcpOworCisJY21kLT5oYW5kbGVzX21pc3NpbmdfcHZzID0gMTsKKworCWluaXRfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKDEpOworCisJcHJvY2Vzc19lYWNoX3ZnKGNtZCwgMCwgTlVMTCwgdmdfbmFtZSwgTlVMTCwKKwkJCVJFQURfRk9SX1VQREFURSB8IFJFQURfQUxMT1dfRVhQT1JURUQsCisJCQkwLCBoYW5kbGUsICZfdmdyZWR1Y2VfcmVwYWlyX3NpbmdsZSk7CisKKwlpZiAodnAuYWxyZWFkeV9jb25zaXN0ZW50KSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJWb2x1bWUgZ3JvdXAgXCIlc1wiIGlzIGFscmVhZHkgY29uc2lzdGVudCIsIHZnX25hbWUpOworCQlyZXQgPSBFQ01EX1BST0NFU1NFRDsKKwl9IGVsc2UgaWYgKHZwLmZpeGVkKSB7CisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJXcm90ZSBvdXQgY29uc2lzdGVudCB2b2x1bWUgZ3JvdXAgJXMiLCB2Z19uYW1lKTsKKwkJcmV0ID0gRUNNRF9QUk9DRVNTRUQ7CisJfSBlbHNlCisJCXJldCA9IEVDTURfRkFJTEVEOworb3V0OgorCWluaXRfaWdub3JlX3N1c3BlbmRlZF9kZXZpY2VzKHNhdmVkX2lnbm9yZV9zdXNwZW5kZWRfZGV2aWNlcyk7CisJZGVzdHJveV9wcm9jZXNzaW5nX2hhbmRsZShjbWQsIGhhbmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdmdyZW1vdmUuYyBiL3Rvb2xzL3ZncmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYTJmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3ZncmVtb3ZlLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxNCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIGludCB2Z3JlbW92ZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZywKKwkJCSAgIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQoreworCS8qCisJICogVGhvdWdoIHZncmVtb3ZlIG9wZXJhdGVzIHBlciBWRyBieSBkZWZpbml0aW9uLCBpbnRlcm5hbGx5LCBpdAorCSAqIGFjdHVhbGx5IG1lYW5zIGl0ZXJhdGluZyBvdmVyIGVhY2ggTFYgaXQgY29udGFpbnMgdG8gZG8gdGhlIHJlbW92ZS4KKwkgKgorCSAqIFVzZSBwcm9jZXNzaW5nIGhhbmRsZSB3aXRoIHZvaWRfaGFuZGxlLmludGVybmFsX3JlcG9ydF9mb3Jfc2VsZWN0PTAKKwkgKiBmb3IgdGhlIHByb2Nlc3NfZWFjaF9sdl9pbl92ZyB0aGF0IGlzIGNhbGxlZCBsYXRlciBpbiB0aGlzIGZuLgorCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSBpbnRlcm5hbCBzZWxlY3Rpb24gZm9yIHByb2Nlc3NfZWFjaF9sdl9pbl92ZworCSAqIGhlcmUgYXMgc2VsZWN0aW9uIGlzIGFscmVhZHkgZG9uZSBieSBwcm9jZXNzX2VhY2hfdmcgd2hpY2ggY2FsbHMKKwkgKiB2Z3JlbW92ZV9zaW5nbGUuIE90aGVyd2lzZSBzZWxlY3Rpb24gd291bGQgYmUgZG9uZSBwZXItTFYgYW5kCisJICogbm90IHBlci1WRyBhcyB3ZSBpbnRlbmQhCisJICovCisJc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlIHZvaWRfaGFuZGxlID0gezB9OworCisJLyoKKwkgKiBTaW5nbGUgZm9yY2UgaXMgZXF1aXZhbGVudCB0byBzaW5sZSAtLXllcworCSAqIEV2ZW4gbXVsdGlwbGUgLS15ZXMgYXJlIGVxdWl2YWxlbnQgdG8gc2luZ2xlIC0tZm9yY2UKKwkgKiBXaGVuIHdlIHJlcXVpcmUgLWZmIGl0IGNhbm5vdCBiZSByZXBsYWNlcyB3aXRoIC1mIC15CisJICovCisJZm9yY2VfdCBmb3JjZSA9IChmb3JjZV90KSBhcmdfY291bnQoY21kLCBmb3JjZV9BUkcpCisJCT8gOiAoYXJnX2lzX3NldChjbWQsIHllc19BUkcpID8gRE9OVF9QUk9NUFQgOiBQUk9NUFQpOworCXVuc2lnbmVkIGx2X2NvdW50LCBtaXNzaW5nOworCWludCByZXQ7CisKKwlpZiAoIXZnX2NoZWNrX3N0YXR1cyh2ZywgRVhQT1JURURfVkcpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlsdl9jb3VudCA9IHZnX3Zpc2libGVfbHZzKHZnKTsKKworCWlmIChsdl9jb3VudCkgeworCQlpZiAoZm9yY2UgPT0gUFJPTVBUKSB7CisJCQlpZiAoKG1pc3NpbmcgPSB2Z19taXNzaW5nX3B2X2NvdW50KHZnKSkpCisJCQkJbG9nX3dhcm4oIldBUk5JTkc6ICVkIHBoeXNpY2FsIHZvbHVtZXMgYXJlIGN1cnJlbnRseSBtaXNzaW5nICIKKwkJCQkJICJmcm9tIHRoZSBzeXN0ZW0uIiwgbWlzc2luZyk7CisJCQlpZiAoeWVzX25vX3Byb21wdCgiRG8geW91IHJlYWxseSB3YW50IHRvIHJlbW92ZSB2b2x1bWUgIgorCQkJCQkgICJncm91cCBcIiVzXCIgY29udGFpbmluZyAldSAiCisJCQkJCSAgImxvZ2ljYWwgdm9sdW1lcz8gW3kvbl06ICIsCisJCQkJCSAgdmdfbmFtZSwgbHZfY291bnQpID09ICduJykgeworCQkJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBub3QgcmVtb3ZlZCIsIHZnX25hbWUpOworCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJCX0KKwkJfQorCisJCWlmICgocmV0ID0gcHJvY2Vzc19lYWNoX2x2X2luX3ZnKGNtZCwgdmcsIE5VTEwsIE5VTEwsIDEsICZ2b2lkX2hhbmRsZSwKKwkJCQkJCSAocHJvY2Vzc19zaW5nbGVfbHZfZm5fdClsdnJlbW92ZV9zaW5nbGUpKSAhPSBFQ01EX1BST0NFU1NFRCkgeworCQkJc3RhY2s7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKCFsb2NrZF9mcmVlX3ZnX2JlZm9yZShjbWQsIHZnLCAwKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCFmb3JjZSAmJiAhdmdfcmVtb3ZlX2NoZWNrKHZnKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJdmdfcmVtb3ZlX3B2cyh2Zyk7CisKKwlpZiAoIXZnX3JlbW92ZSh2ZykpCisJCXJldHVybl9FQ01EX0ZBSUxFRDsKKworCWxvY2tkX2ZyZWVfdmdfZmluYWwoY21kLCB2Zyk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKK2ludCB2Z3JlbW92ZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXQ7CisKKwlpZiAoIWFyZ2MgJiYgIWFyZ19pc19zZXQoY21kLCBzZWxlY3RfQVJHKSkgeworCQlsb2dfZXJyb3IoIlBsZWFzZSBlbnRlciBvbmUgb3IgbW9yZSB2b2x1bWUgZ3JvdXAgcGF0aHMgIgorCQkJICAib3IgdXNlIC0tc2VsZWN0IGZvciBzZWxlY3Rpb24uIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwkvKgorCSAqIE5lZWRlZCB0byBjaGFuZ2UgdGhlIGdsb2JhbCBWRyBuYW1lc3BhY2UsCisJICogYW5kIHRvIGNoYW5nZSB0aGUgc2V0IG9mIG9ycGhhbiBQVnMuCisJICovCisJaWYgKCFsb2NrZF9nbChjbWQsICJleCIsIExER0xfVVBEQVRFX05BTUVTKSkKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCisJLyoKKwkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBpZiB2Z3JlbW92ZSBpcyBnaXZlbiBhIHRhZywgaXQgY2F1c2VzCisJICogcHJvY2Vzc19lYWNoX3ZnIHRvIGRvIGxvY2tkX2dsKHNoKSB3aGVuIGdldHRpbmcgYSBsaXN0IG9mIGFsbAorCSAqIFZHIG5hbWVzLiAgV2UgZG9uJ3Qgd2FudCB0aGUgZ2wgY29udmVydGVkIHRvIHNoLCBzbyBkaXNhYmxlIGl0LgorCSAqLworCWNtZC0+bG9ja2RfZ2xfZGlzYWJsZSA9IDE7CisKKwljbWQtPmhhbmRsZXNfbWlzc2luZ19wdnMgPSAxOworCXJldCA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsCisJCQkgICAgICBSRUFEX0ZPUl9VUERBVEUsIDAsCisJCQkgICAgICBOVUxMLCAmdmdyZW1vdmVfc2luZ2xlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy92Z3JlbmFtZS5jIGIvdG9vbHMvdmdyZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNmNjNjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdyZW5hbWUuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdHJ1Y3QgdmdyZW5hbWVfcGFyYW1zIHsKKwljb25zdCBjaGFyICp2Z19uYW1lX29sZDsKKwljb25zdCBjaGFyICp2Z19uYW1lX25ldzsKKwl1bnNpZ25lZCBpbnQgb2xkX25hbWVfaXNfdXVpZCA6IDE7CisJdW5zaWduZWQgaW50IGxvY2tfdmdfb2xkX2ZpcnN0IDogMTsKKwl1bnNpZ25lZCBpbnQgdW5sb2NrX25ld19uYW1lOiAxOworfTsKKworc3RhdGljIGludCBfbG9ja19uZXdfdmdfZm9yX3JlbmFtZShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkgICBjb25zdCBjaGFyICp2Z19uYW1lX25ldykKK3sKKwlpZiAoIWxvY2tfdm9sKGNtZCwgdmdfbmFtZV9uZXcsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJDYW4ndCBnZXQgbG9jayBmb3IgJXMiLCB2Z19uYW1lX25ldyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF92Z3JlbmFtZV9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgICAgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCB2Z3JlbmFtZV9wYXJhbXMgKnZwID0gKHN0cnVjdCB2Z3JlbmFtZV9wYXJhbXMgKikgaGFuZGxlLT5jdXN0b21faGFuZGxlOworCWNoYXIgb2xkX3BhdGhbTkFNRV9MRU5dOworCWNoYXIgbmV3X3BhdGhbTkFNRV9MRU5dOworCXN0cnVjdCBpZCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKmRldl9kaXI7CisKKwkvKgorCSAqIHZnX25hbWVfb2xkIG1heSBiZSBhIFVVSUQgd2hpY2ggcHJvY2Vzc19lYWNoX3ZnCisJICogcmVwbGFjZWQgd2l0aCB0aGUgcmVhbCBWRyBuYW1lLiAgSW4gdGhhdCBjYXNlLAorCSAqIHZwLT52Z19uYW1lX29sZCB3aWxsIGJlIHRoZSBVVUlEIGFuZCB2Z19uYW1lIHdpbGwgYmUKKwkgKiB0aGUgYWN0dWFsIFZHIG5hbWUuICBDaGVjayBhZ2FpbiBpZiB0aGUgb2xkIGFuZCBuZXcKKwkgKiBuYW1lcyBtYXRjaCwgdXNpbmcgdGhlIHJlYWwgbmFtZXMuCisJICovCisJaWYgKHZwLT5vbGRfbmFtZV9pc191dWlkICYmICFzdHJjbXAodnAtPnZnX25hbWVfbmV3LCB2Z19uYW1lKSkgeworCQlsb2dfZXJyb3IoIk5ldyBWRyBuYW1lIG11c3QgZGlmZmVyIGZyb20gdGhlIG9sZCBWRyBuYW1lLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBhIFZHIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIG5ldyBWRyBuYW1lLgorCSAqCisJICogV2hlbiBub3QgdXNpbmcgbHZtZXRhZCwgaXQncyBlc3NlbnRpYWwgdGhhdCBhIGZ1bGwgc2NhbiBoYXMKKwkgKiBiZWVuIGRvbmUgdG8gZW5zdXJlIHdlIHNlZSBhbGwgZXhpc3RpbmcgVkcgbmFtZXMsIHNvIHdlCisJICogZG8gbm90IHVzZSBhbiBleGlzdGluZyBuYW1lLiAgVGhpcyBoYXMgYmVlbiBkb25lIGJ5CisJICogcHJvY2Vzc19lYWNoX3ZnIFJFUVVJUkVTX0ZVTExfTEFCRUxfU0NBTi4KKwkgKgorCSAqIChGSVhNRTogV2UgY291bGQgbG9vayBmb3IgdGhlIG5ldyBuYW1lIGluIHRoZSBsaXN0IG9mIGFsbAorCSAqIFZHcyB0aGF0IHByb2Nlc3NfZWFjaF92ZyBjcmVhdGVkLCBidXQgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MKKwkgKiB0byB0aGF0IGxpc3QgaGVyZSwgc28gd2UgaGF2ZSB0byBsb29rIGluIGx2bWNhY2hlLgorCSAqIFRoaXMgcmVxdWlyZXMgcG9wdWxhdGluZyBsdm1jYWNoZSB3aGVuIHVzaW5nIGx2bWV0YWQuKQorCSAqLworCWx2bWNhY2hlX3NlZWRfaW5mb3NfZnJvbV9sdm1ldGFkKGNtZCk7CisKKwlpZiAobHZtY2FjaGVfdmdpbmZvX2Zyb21fdmduYW1lKHZwLT52Z19uYW1lX25ldywgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJOZXcgVkcgbmFtZSBcIiVzXCIgYWxyZWFkeSBleGlzdHMiLCB2cC0+dmdfbmFtZV9uZXcpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKGlkX3JlYWRfZm9ybWF0X3RyeSgmaWQsIHZwLT52Z19uYW1lX25ldykgJiYKKwkgICAgKG5hbWUgPSBsdm1jYWNoZV92Z25hbWVfZnJvbV92Z2lkKGNtZC0+bWVtLCAoY29uc3QgY2hhciAqKSZpZCkpKSB7CisJCWxvZ19lcnJvcigiTmV3IFZHIG5hbWUgXCIlc1wiIG1hdGNoZXMgdGhlIFVVSUQgb2YgZXhpc3RpbmcgVkcgJXMiLCB2cC0+dmdfbmFtZV9uZXcsIG5hbWUpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyoKKwkgKiBMb2NrIHRoZSBvbGQgVkcgbmFtZSBmaXJzdDoKKwkgKiAuIFRoZSBvbGQgVkcgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBieSBwcm9jZXNzX2VhY2hfdmcuCisJICogLiBOb3cgbG9jayB0aGUgbmV3IFZHIG5hbWUgaGVyZSwgc2Vjb25kLgorCSAqCisJICogTG9jayB0aGUgbmV3IFZHIG5hbWUgZmlyc3Q6CisJICogLiBUaGUgbmV3IFZHIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBwcmUtbG9ja2VkIGJlbG93LAorCSAqICAgYmVmb3JlIHByb2Nlc3NfZWFjaF92ZyB3YXMgY2FsbGVkLgorCSAqIC4gcHJvY2Vzc19lYWNoX3ZnIHRoZW4gbG9ja2VkIHRoZSBvbGQgVkcgbmFtZSBzZWNvbmQuCisJICogLiBOb3RoaW5nIHRvIGRvIGhlcmUuCisJICoKKwkgKiBTcGVjaWFsIGNhc2Ugd2hlbiB0aGUgb2xkIFZHIG5hbWUgaXMgYSB1dWlkOgorCSAqIC4gVGhlIG9sZCBWRydzIHJlYWwgbmFtZSB3YXNuJ3Qga25vd24gYmVmb3JlIHByb2Nlc3NfZWFjaF92ZywKKwkgKiAgIHNvIHRoZSBjb3JyZWN0IGxvY2sgb3JkZXJpbmcgd2Fzbid0IGtub3duIGJlZm9yZWhhbmQsCisJICogICBzbyBubyBwcmUtbG9ja2luZyB3YXMgZG9uZS4KKwkgKiAuIFRoZSBvbGQgVkcncyByZWFsIG5hbWUgaGFzIGJlZW4gbG9ja2VkIGJ5IHByb2Nlc3NfZWFjaF92Zy4KKwkgKiAuIE5vdyBsb2NrIHRoZSBuZXcgVkcgbmFtZSBoZXJlLCBzZWNvbmQuCisJICogLiBTdXBwcmVzcyBsb2NrIG9yZGVyaW5nIGNoZWNrcyBiZWNhdXNlIHRoZSBsb2NrIG9yZGVyIG1heQorCSAqICAgaGF2ZSB3YW50ZWQgdGhlIG5ldyBuYW1lIGZpcnN0LCB3aGljaCB3YXNuJ3QgcG9zc2libGUgaW4KKwkgKiAgIHRoaXMgdXVpZC1mb3ItbmFtZSBjYXNlLgorCSAqLworCWlmICh2cC0+bG9ja192Z19vbGRfZmlyc3QgfHwgdnAtPm9sZF9uYW1lX2lzX3V1aWQpIHsKKwkJaWYgKHZwLT5vbGRfbmFtZV9pc191dWlkKQorCQkJbHZtY2FjaGVfbG9ja19vcmRlcmluZygwKTsKKworCQlpZiAoIV9sb2NrX25ld192Z19mb3JfcmVuYW1lKGNtZCwgdnAtPnZnX25hbWVfbmV3KSkKKwkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKworCQlsdm1jYWNoZV9sb2NrX29yZGVyaW5nKDEpOworCX0KKworCWRldl9kaXIgPSBjbWQtPmRldl9kaXI7CisKKwlpZiAoIWFyY2hpdmUodmcpKQorCQlnb3RvIGVycm9yOworCisJLyogUmVtb3ZlIHJlZmVyZW5jZXMgYmFzZWQgb24gb2xkIG5hbWUgKi8KKwlpZiAoIWRyb3BfY2FjaGVkX21ldGFkYXRhKHZnKSkKKwkJc3RhY2s7CisKKwlpZiAoIWxvY2tkX3JlbmFtZV92Z19iZWZvcmUoY21kLCB2ZykpIHsKKwkJc3RhY2s7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogQ2hhbmdlIHRoZSB2b2x1bWUgZ3JvdXAgbmFtZSAqLworCXZnX3JlbmFtZShjbWQsIHZnLCB2cC0+dmdfbmFtZV9uZXcpOworCisJLyogc3RvcmUgaXQgb24gZGlza3MgKi8KKwlsb2dfdmVyYm9zZSgiV3JpdGluZyBvdXQgdXBkYXRlZCB2b2x1bWUgZ3JvdXAiKTsKKwlpZiAoIXZnX3dyaXRlKHZnKSB8fCAhdmdfY29tbWl0KHZnKSkgeworCQlnb3RvIGVycm9yOworCX0KKworCXNwcmludGYob2xkX3BhdGgsICIlcyVzIiwgZGV2X2RpciwgdmdfbmFtZSk7CisJc3ByaW50ZihuZXdfcGF0aCwgIiVzJXMiLCBkZXZfZGlyLCB2cC0+dmdfbmFtZV9uZXcpOworCisJaWYgKGFjdGl2YXRpb24oKSAmJiBkaXJfZXhpc3RzKG9sZF9wYXRoKSkgeworCQlsb2dfdmVyYm9zZSgiUmVuYW1pbmcgXCIlc1wiIHRvIFwiJXNcIiIsIG9sZF9wYXRoLCBuZXdfcGF0aCk7CisKKwkJaWYgKHRlc3RfbW9kZSgpKQorCQkJbG9nX3ZlcmJvc2UoIlRlc3QgbW9kZTogU2tpcHBpbmcgcmVuYW1lLiIpOworCisJCWVsc2UgaWYgKGx2c19pbl92Z19hY3RpdmF0ZWQodmcpKSB7CisJCQlpZiAoIXZnX3JlZnJlc2hfdmlzaWJsZShjbWQsIHZnKSkgeworCQkJCWxvZ19lcnJvcigiUmVuYW1pbmcgXCIlc1wiIHRvIFwiJXNcIiBmYWlsZWQiLCAKKwkJCQkJb2xkX3BhdGgsIG5ld19wYXRoKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJfQorCisJbG9ja2RfcmVuYW1lX3ZnX2ZpbmFsKGNtZCwgdmcsIDEpOworCisJaWYgKCFiYWNrdXAodmcpKQorCQlzdGFjazsKKwlpZiAoIWJhY2t1cF9yZW1vdmUoY21kLCB2Z19uYW1lKSkKKwkJc3RhY2s7CisKKwl1bmxvY2tfdmcoY21kLCB2ZywgdnAtPnZnX25hbWVfbmV3KTsKKwl2cC0+dW5sb2NrX25ld19uYW1lID0gMDsKKworCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJWb2x1bWUgZ3JvdXAgXCIlc1wiIHN1Y2Nlc3NmdWxseSByZW5hbWVkIHRvIFwiJXNcIiIsCisJCQkJdnAtPnZnX25hbWVfb2xkLCB2cC0+dmdfbmFtZV9uZXcpOworCXJldHVybiAxOworCisgZXJyb3I6CisJdW5sb2NrX3ZnKGNtZCwgdmcsIHZwLT52Z19uYW1lX25ldyk7CisJdnAtPnVubG9ja19uZXdfbmFtZSA9IDA7CisKKwlsb2NrZF9yZW5hbWVfdmdfZmluYWwoY21kLCB2ZywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZncmVuYW1lKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHZncmVuYW1lX3BhcmFtcyB2cCA9IHsgMCB9OworCXN0cnVjdCBwcm9jZXNzaW5nX2hhbmRsZSAqaGFuZGxlOworCWNvbnN0IGNoYXIgKnZnX25hbWVfbmV3OworCWNvbnN0IGNoYXIgKnZnX25hbWVfb2xkOworCXN0cnVjdCBpZCBpZDsKKwlpbnQgcmV0OworCisJaWYgKGFyZ2MgIT0gMikgeworCQlsb2dfZXJyb3IoIk9sZCBhbmQgbmV3IHZvbHVtZSBncm91cCBuYW1lcyBuZWVkIHNwZWNpZnlpbmciKTsKKwkJcmV0dXJuIEVJTlZBTElEX0NNRF9MSU5FOworCX0KKworCXZnX25hbWVfb2xkID0gc2tpcF9kZXZfZGlyKGNtZCwgYXJndlswXSwgTlVMTCk7CisJdmdfbmFtZV9uZXcgPSBza2lwX2Rldl9kaXIoY21kLCBhcmd2WzFdLCBOVUxMKTsKKworCWlmICghdmFsaWRhdGVfdmdfcmVuYW1lX3BhcmFtcyhjbWQsIHZnX25hbWVfb2xkLCB2Z19uYW1lX25ldykpCisJCXJldHVybl8wOworCisJaWYgKCEodnAudmdfbmFtZV9vbGQgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmdfbmFtZV9vbGQpKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJaWYgKCEodnAudmdfbmFtZV9uZXcgPSBkbV9wb29sX3N0cmR1cChjbWQtPm1lbSwgdmdfbmFtZV9uZXcpKSkKKwkJcmV0dXJuX0VDTURfRkFJTEVEOworCisJLyogTmVlZGVkIGNoYW5nZSB0aGUgZ2xvYmFsIFZHIG5hbWVzcGFjZS4gKi8KKwlpZiAoIWxvY2tkX2dsKGNtZCwgImV4IiwgTERHTF9VUERBVEVfTkFNRVMpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwkvKgorCSAqIFNwZWNpYWwgY2FzZSB3aGVyZSB2Z19uYW1lX29sZCBtYXkgYmUgYSBVVUlEOgorCSAqIElmIHZnX25hbWVfb2xkIGlzIGEgVVVJRCwgdGhlbiBwcm9jZXNzX2VhY2ggbWF5CisJICogdHJhbnNsYXRlIGl0IHRvIGFuIGFjdHVhbCBWRyBuYW1lIHRoYXQgd2UgZG9uJ3QKKwkgKiB5ZXQga25vdy4gIFRoZSBsb2NrIG9yZGVyaW5nLCBhbmQgcHJlLWxvY2tpbmcsCisJICogbmVlZHMgdG8gYmUgZG9uZSBiYXNlZCBvbiBWRyBuYW1lcy4gIFdoZW4KKwkgKiB2Z19uYW1lX29sZCBpcyBhIFVVSUQsIGRvIG5vdCBkbyBhbnkgcHJlLWxvY2tpbmcKKwkgKiBiYXNlZCBvbiBpdCwgc2luY2UgaXQncyBsaWtlbHkgdG8gYmUgd3JvbmcsIGFuZAorCSAqIGRlZmVyIGFsbCB0aGUgbG9ja2luZyB0byB0aGUgX3NpbmdsZSBmdW5jdGlvbi4KKwkgKgorCSAqIFdoZW4gaXQncyBub3QgYSBVVUlELCB3ZSBrbm93IHRoZSB0d28gVkcgbmFtZXMsCisJICogYW5kIHdlIGNhbiBwcmUtbG9jayB0aGUgbmV3IFZHIG5hbWUgaWYgdGhlIGxvY2sKKwkgKiBvcmRlcmluZyB3YW50cyBpdCBsb2NrZWQgYmVmb3JlIHRoZSBvbGQgVkcgbmFtZQorCSAqIHdoaWNoIHdpbGwgYmUgbG9ja2VkIGJ5IHByb2Nlc3NfZWFjaC4gIElmIGxvY2sKKwkgKiBvcmRlcmluZyB3YW50cyB0aGUgb2xkIG5hbWUgbG9ja2VkIGZpcnN0LCB0aGVuCisJICogdGhlIF9zaW5nbGUgZnVuY3Rpb24gd2lsbCBsb2NrIHRoZSBuZXcgVkcgbmFtZS4KKwkgKi8KKwlpZiAoISh2cC5vbGRfbmFtZV9pc191dWlkID0gaWRfcmVhZF9mb3JtYXRfdHJ5KCZpZCwgdmdfbmFtZV9vbGQpKSkgeworCQlpZiAoc3RyY21wKHZnX25hbWVfbmV3LCB2Z19uYW1lX29sZCkgPCAwKSB7CisJCQl2cC5sb2NrX3ZnX29sZF9maXJzdCA9IDA7CisJCQl2cC51bmxvY2tfbmV3X25hbWUgPSAxOworCisJCQlpZiAoIV9sb2NrX25ld192Z19mb3JfcmVuYW1lKGNtZCwgdmdfbmFtZV9uZXcpKQorCQkJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBvbGQgVkcgaXMgbG9ja2VkIGJ5IHByb2Nlc3NfZWFjaF92Zy4gKi8KKwkJCXZwLmxvY2tfdmdfb2xkX2ZpcnN0ID0gMTsKKwkJfQorCX0KKworCWlmICghKGhhbmRsZSA9IGluaXRfcHJvY2Vzc2luZ19oYW5kbGUoY21kLCBOVUxMKSkpIHsKKwkJbG9nX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzaW5nIGhhbmRsZS4iKTsKKwkJcmV0dXJuIEVDTURfRkFJTEVEOworCX0KKworCWhhbmRsZS0+Y3VzdG9tX2hhbmRsZSA9ICZ2cDsKKworCXJldCA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIDAsIE5VTEwsIHZnX25hbWVfb2xkLCBOVUxMLAorCQkJICAgICAgUkVBRF9GT1JfVVBEQVRFIHwgUkVBRF9BTExPV19FWFBPUlRFRCwKKwkJCSAgICAgIDAsIGhhbmRsZSwgX3ZncmVuYW1lX3NpbmdsZSk7CisKKwkvKiBOZWVkZWQgaWYgcHJvY2Vzc19lYWNoX3ZnIHJldHVybnMgZXJyb3IgYmVmb3JlIGNhbGxpbmcgX3NpbmdsZS4gKi8KKwlpZiAodnAudW5sb2NrX25ld19uYW1lKQorCQl1bmxvY2tfdmcoY21kLCBOVUxMLCB2Z19uYW1lX25ldyk7CisKKwlkZXN0cm95X3Byb2Nlc3NpbmdfaGFuZGxlKGNtZCwgaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS90b29scy92Z3NjYW4uYyBiL3Rvb2xzL3Znc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWFiNzMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy92Z3NjYW4uYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLjEuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ0b29scy5oIgorCitzdGF0aWMgaW50IHZnc2Nhbl9zaW5nbGUoc3RydWN0IGNtZF9jb250ZXh0ICpjbWQsIGNvbnN0IGNoYXIgKnZnX25hbWUsCisJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsCisJCQkgc3RydWN0IHByb2Nlc3NpbmdfaGFuZGxlICpoYW5kbGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIkZvdW5kICVzdm9sdW1lIGdyb3VwIFwiJXNcIiB1c2luZyBtZXRhZGF0YSB0eXBlICVzIiwKKwkJCQl2Z19pc19leHBvcnRlZCh2ZykgPyAiZXhwb3J0ZWQgIiA6ICIiLCB2Z19uYW1lLAorCQkJCXZnLT5maWQtPmZtdC0+bmFtZSk7CisKKwljaGVja19jdXJyZW50X2JhY2t1cCh2Zyk7CisKKwlyZXR1cm4gRUNNRF9QUk9DRVNTRUQ7Cit9CisKKy8qCisgKiBUd28gbWFpbiB2Z3NjYW4gY2FzZXMgcmVsYXRlZCB0byBsdm1ldGFkIHVzYWdlOgorICogMS4gdmdzY2FuCisgKiAyLiB2Z3NjYW4gLS1jYWNoZQorICoKKyAqIDEuIFRoZSAndmdzY2FuJyBjb21tYW5kICh3aXRob3V0IC0tY2FjaGUpIG1heSBvciBtYXkgbm90IGF0dGVtcHQgdG8KKyAqIHJlcG9wdWxhdGUgdGhlIGx2bWV0YWQgY2FjaGUsIGFuZCBtYXkgb3IgbWF5IG5vdCB1c2UgdGhlIGx2bWV0YWQKKyAqIGNhY2hlIHRvIGRpc3BsYXkgVkcgaW5mbzoKKyAqCisgKiBpLiBJZiBsdm1ldGFkIGlzIGJlaW5nIHVzZWQgYW5kIGlzIGluIGEgbm9ybWFsIHN0YXRlLCB0aGVuICd2Z3NjYW4nCisgKiB3aWxsIHNpbXBseSByZWFkIGFuZCBkaXNwbGF5IFZHIGluZm8gZnJvbSB0aGUgbHZtZXRhZCBjYWNoZS4KKyAqCisgKiBpaS4gSWYgbHZtZXRhZCBpcyBub3QgYmVpbmcgdXNlZCwgJ3Znc2Nhbicgd2lsbCByZWFkIGFsbCBkZXZpY2VzIHRvCisgKiBkaXNwbGF5IHRoZSBWRyBpbmZvLgorICoKKyAqIGlpaS4gSWYgbHZtZXRhZCBpcyBiZWluZyB1c2VkLCBidXQgaGFzIGJlZW4gZGlzYWJsZWQgKGJlY2F1c2Ugb2YKKyAqIGR1cGxpY2F0ZSBkZXZzIG9yIGx2bTEgbWV0YWRhdGEpLCBvciBoYXMgYSBub24tbWF0Y2hpbmcgdG9rZW4KKyAqIChiZWNhdXNlIHRoZSBkZXZpY2UgZmlsdGVyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZXZpY2UgZmlsdGVyIGxhc3QKKyAqIHVzZWQgdG8gcG9wdWxhdGUgbHZtZXRhZCksIHRoZW4gJ3Znc2Nhbicgd2lsbCBiZWdpbiBieSByZXNjYW5uaW5nCisgKiBkZXZpY2VzIHRvIHJlcG9wdWxhdGUgbHZtZXRhZC4gIElmIGx2bWV0YWQgaXMgZW5hYmxlZCBhZnRlciB0aGUKKyAqIHJlc2NhbiwgdGhlbiAndmdzY2FuJyB3aWxsIHNpbXBseSByZWFkIGFuZCBkaXNwbGF5IFZHIGluZm8gZnJvbSB0aGUKKyAqIGx2bWV0YWQgY2FjaGUgKGxpa2UgY2FzZSBpKS4gIElmIGx2bWV0YWQgaXMgZGlzYWJsZWQgYWZ0ZXIgdGhlCisgKiByZXNjYW4sIHRoZW4gJ3Znc2Nhbicgd2lsbCByZWFkIGFsbCBkZXZpY2VzIHRvIGRpc3BsYXkgVkcgaW5mbworICogKGxpa2UgY2FzZSBpaSkuCisgKgorICogMi4gVGhlICd2Z3NjYW4gLS1jYWNoZScgY29tbWFuZCB3aWxsIGFsd2F5cyBhdHRlbXB0IHRvIHJlcG9wdWxhdGUKKyAqIHRoZSBsdm1ldGFkIGNhY2hlIGJ5IHJlc2Nhbm5pbmcgYWxsIGRldnMgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICogbHZtZXRhZCB3YXMgcHJldmlvdXNseSBkaXNhYmxlZCBvciBoYWQgYW4gdW5tYXRjaGluZyB0b2tlbi4pCisgKiBsdm1ldGFkIG1heSBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGFmdGVyIHRoZSByZXNjYW4gKGRlcGVuZGluZworICogb24gd2hldGhlciBkdXBsaWNhdGUgZGV2cyBvciBsdm0xIG1ldGFkYXRhIHdhcyBmb3VuZCkuCisgKiBJZiBlbmFibGVkLCB0aGVuIGl0IHdpbGwgc2ltcGx5IHJlYWQgYW5kIGRpc3BsYXkgVkcgaW5mbyBmcm9tIHRoZQorICogbHZtZXRhZCBjYWNoZSAobGlrZSBjYXNlIDEuaS4pLiAgSWYgZGlzYWJsZWQsIHRoZW4gaXQgd2lsbAorICogcmVhZCBhbGwgZGV2aWNlcyB0byBkaXNwbGF5IFZHIGluZm8gKGxpa2UgY2FzZSAxLmlpLikKKyAqLworCitpbnQgdmdzY2FuKHN0cnVjdCBjbWRfY29udGV4dCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKwlpbnQgbWF4cmV0LCByZXQ7CisKKwlpZiAoYXJnYykgeworCQlsb2dfZXJyb3IoIlRvbyBtYW55IHBhcmFtZXRlcnMgb24gY29tbWFuZCBsaW5lIik7CisJCXJldHVybiBFSU5WQUxJRF9DTURfTElORTsKKwl9CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG5vdGlmeWRidXNfQVJHKSkgeworCQlpZiAoIWx2bW5vdGlmeV9pc19zdXBwb3J0ZWQoKSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3Qgbm90aWZ5IGRidXM6IGx2bSBpcyBub3QgYnVpbHQgd2l0aCBkYnVzIHN1cHBvcnQuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKwkJaWYgKCFmaW5kX2NvbmZpZ190cmVlX2Jvb2woY21kLCBnbG9iYWxfbm90aWZ5X2RidXNfQ0ZHLCBOVUxMKSkgeworCQkJbG9nX2Vycm9yKCJDYW5ub3Qgbm90aWZ5IGRidXM6IG5vdGlmeV9kYnVzIGlzIGRpc2FibGVkIGluIGx2bSBjb25maWcuIik7CisJCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJCX0KKwkJc2V0X3B2X25vdGlmeShjbWQpOworCQlzZXRfdmdfbm90aWZ5KGNtZCk7CisJCXNldF9sdl9ub3RpZnkoY21kKTsKKwkJcmV0dXJuIEVDTURfUFJPQ0VTU0VEOworCX0KKworCWlmICghbG9ja192b2woY21kLCBWR19HTE9CQUwsIExDS19WR19XUklURSwgTlVMTCkpIHsKKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gb2J0YWluIGdsb2JhbCBsb2NrLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJaWYgKGNtZC0+ZmlsdGVyLT53aXBlKQorCQljbWQtPmZpbHRlci0+d2lwZShjbWQtPmZpbHRlcik7CisJbHZtY2FjaGVfZGVzdHJveShjbWQsIDEsIDApOworCisJaWYgKCFsdm1ldGFkX3VzZWQoKSAmJiBhcmdfaXNfc2V0KGNtZCwgY2FjaGVfbG9uZ19BUkcpKQorCQlsb2dfdmVyYm9zZSgiSWdub3JpbmcgdmdzY2FuIC0tY2FjaGUgY29tbWFuZCBiZWNhdXNlIGx2bWV0YWQgaXMgbm90IGluIHVzZS4iKTsKKworCWlmIChsdm1ldGFkX3VzZWQoKSAmJiAoYXJnX2lzX3NldChjbWQsIGNhY2hlX2xvbmdfQVJHKSB8fCAhbHZtZXRhZF90b2tlbl9tYXRjaGVzKGNtZCkgfHwgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSkgeworCQlpZiAobHZtZXRhZF91c2VkKCkgJiYgIWx2bWV0YWRfcHZzY2FuX2FsbF9kZXZzKGNtZCwgYXJnX2lzX3NldChjbWQsIGNhY2hlX2xvbmdfQVJHKSkpIHsKKwkJCWxvZ193YXJuKCJXQVJOSU5HOiBOb3QgdXNpbmcgbHZtZXRhZCBiZWNhdXNlIGNhY2hlIHVwZGF0ZSBmYWlsZWQuIik7CisJCQlsdm1ldGFkX21ha2VfdW51c2VkKGNtZCk7CisJCX0KKworCQlpZiAobHZtZXRhZF91c2VkKCkgJiYgbHZtZXRhZF9pc19kaXNhYmxlZChjbWQsICZyZWFzb24pKSB7CisJCQlsb2dfd2FybigiV0FSTklORzogTm90IHVzaW5nIGx2bWV0YWQgYmVjYXVzZSAlcy4iLCByZWFzb24pOworCQkJbHZtZXRhZF9tYWtlX3VudXNlZChjbWQpOworCQl9CisJfQorCisJaWYgKCFsdm1ldGFkX3VzZWQoKSkKKwkJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIlJlYWRpbmcgYWxsIHBoeXNpY2FsIHZvbHVtZXMuICBUaGlzIG1heSB0YWtlIGEgd2hpbGUuLi4iKTsKKwllbHNlCisJCWxvZ19wcmludF91bmxlc3Nfc2lsZW50KCJSZWFkaW5nIHZvbHVtZSBncm91cHMgZnJvbSBjYWNoZS4iKTsKKworCW1heHJldCA9IHByb2Nlc3NfZWFjaF92ZyhjbWQsIGFyZ2MsIGFyZ3YsIE5VTEwsIE5VTEwsIDAsIDAsIE5VTEwsICZ2Z3NjYW5fc2luZ2xlKTsKKworCWlmIChhcmdfaXNfc2V0KGNtZCwgbWtub2Rlc19BUkcpKSB7CisJCXJldCA9IHZnbWtub2RlcyhjbWQsIGFyZ2MsIGFyZ3YpOworCQlpZiAocmV0ID4gbWF4cmV0KQorCQkJbWF4cmV0ID0gcmV0OworCX0KKworCXVubG9ja192ZyhjbWQsIE5VTEwsIFZHX0dMT0JBTCk7CisJcmV0dXJuIG1heHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Znc3BsaXQuYyBiL3Rvb2xzL3Znc3BsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2MWMxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdmdzcGxpdC5jCkBAIC0wLDAgKzEsNzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDksMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4xLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidG9vbHMuaCIKKworc3RhdGljIGludCBfbHZfaXNfaW5fdmcoc3RydWN0IHZvbHVtZV9ncm91cCAqdmcsIHN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYpCit7CisJaWYgKCFsdiB8fCBsdi0+dmcgIT0gdmcpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fbGlzdCAqX2x2aF9pbl92ZyhzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2ZykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZoOworCisJZG1fbGlzdF9pdGVyYXRlKGx2aCwgJnZnLT5sdnMpCisJCWlmIChsdiA9PSBkbV9saXN0X2l0ZW0obHZoLCBzdHJ1Y3QgbHZfbGlzdCktPmx2KQorCQkJcmV0dXJuIGx2aDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9sdl90cmVlX21vdmUoc3RydWN0IGRtX2xpc3QgKmx2aCwKKwkJCSBzdHJ1Y3QgZG1fbGlzdCAqKmx2aHQsCisJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJCSBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190bykKK3sKKwl1aW50MzJfdCBzOworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBkbV9saXN0X2l0ZW0obHZoLCBzdHJ1Y3QgbHZfbGlzdCktPmx2OworCXN0cnVjdCBsdl9zZWdtZW50ICpzZWcgPSBmaXJzdF9zZWcobHYpOworCXN0cnVjdCBkbV9saXN0ICpsdmgxOworCisJLyogVXBkYXRlIHRoZSBsaXN0IHBvaW50ZXIgcmVmZXJpbmcgdG8gdGhlIGl0ZW0gbW92aW5nIHRvIEB2Z190by4gKi8KKwlpZiAobHZoID09ICpsdmh0KQorCQkqbHZodCA9IGRtX2xpc3RfbmV4dChsdmgsIGx2aCk7CisKKwlkbV9saXN0X21vdmUoJnZnX3RvLT5sdnMsIGx2aCk7CisJbHYtPnZnID0gdmdfdG87CisJbHYtPmx2aWQuaWRbMF0gPSBsdi0+dmctPmlkOworCisJaWYgKHNlZykKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQkJaWYgKHNlZ190eXBlKHNlZywgcykgPT0gQVJFQV9MViAmJiBzZWdfbHYoc2VnLCBzKSkgeworCQkJCWlmICgobHZoMSA9IF9sdmhfaW5fdmcoc2VnX2x2KHNlZywgcyksIHZnX2Zyb20pKSkgeworCQkJCQlpZiAoIV9sdl90cmVlX21vdmUobHZoMSwgbHZodCwgdmdfZnJvbSwgdmdfdG8pKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlIGlmICghX2x2aF9pbl92ZyhzZWdfbHYoc2VnLCBzKSwgdmdfdG8pKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9tb3ZlX29uZV9sdihzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z19mcm9tLAorCQkJc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8sCisJCQlzdHJ1Y3QgZG1fbGlzdCAqbHZoLAorCQkJc3RydWN0IGRtX2xpc3QgKipsdmh0KQoreworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHYgPSBkbV9saXN0X2l0ZW0obHZoLCBzdHJ1Y3QgbHZfbGlzdCktPmx2OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqcGFyZW50X2x2OworCisJaWYgKGx2X2lzX2FjdGl2ZShsdikpIHsKKwkJaWYgKChwYXJlbnRfbHYgPSBsdl9wYXJlbnQobHYpKSkKKwkJCWxvZ19lcnJvcigiTG9naWNhbCB2b2x1bWUgJXMgKHBhcnQgb2YgJXMpIG11c3QgYmUgaW5hY3RpdmUuIiwgZGlzcGxheV9sdm5hbWUobHYpLCBwYXJlbnRfbHYtPm5hbWUpOworCQllbHNlCisJCQlsb2dfZXJyb3IoIkxvZ2ljYWwgdm9sdW1lICVzIG11c3QgYmUgaW5hY3RpdmUuIiwgZGlzcGxheV9sdm5hbWUobHYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQmFpbCBvdXQsIGlmIGFueSBhbGxvY2F0aW9ucyBvZiBAbHYgYXJlIHN0aWxsIG9uIFBWcyBvZiBAdmdfZnJvbSAqLworCWlmIChsdl9pc19vbl9wdnMobHYsICZ2Z19mcm9tLT5wdnMpKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3Qgc3BsaXQgTFYgJXMgYmV0d2VlbiAiCisJCQkgICJ0d28gVm9sdW1lIEdyb3VwcyIsIGx2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFfbHZfdHJlZV9tb3ZlKGx2aCwgbHZodCwgdmdfZnJvbSwgdmdfdG8pKQorCQlyZXR1cm4gMDsKKworCS8qIE1vdmVkIHBvb2wgbWV0YWRhdGEgc3BhcmUgTFYgKi8KKwlpZiAodmdfZnJvbS0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdiA9PSBsdikgeworCQl2Z190by0+cG9vbF9tZXRhZGF0YV9zcGFyZV9sdiA9IGx2OworCQl2Z19mcm9tLT5wb29sX21ldGFkYXRhX3NwYXJlX2x2ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbW92ZV9sdnMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwgc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8pCit7CisJc3RydWN0IGRtX2xpc3QgKmx2aCwgKmx2aHQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCXN0cnVjdCBwaHlzaWNhbF92b2x1bWUgKnB2OworCXN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3dpdGg7CisJdW5zaWduZWQgczsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGx2aCwgbHZodCwgJnZnX2Zyb20tPmx2cykgeworCQlsdiA9IGRtX2xpc3RfaXRlbShsdmgsIHN0cnVjdCBsdl9saXN0KS0+bHY7CisKKwkJaWYgKChsdi0+c3RhdHVzICYgU05BUFNIT1QpKQorCQkJY29udGludWU7CisKKwkJaWYgKGx2X2lzX3JhaWQobHYpKQorCQkJY29udGludWU7CisKKwkJaWYgKGx2X2lzX21pcnJvcmVkKGx2KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsdl9pc190aGluX3Bvb2wobHYpIHx8CisJCSAgICBsdl9pc190aGluX3ZvbHVtZShsdikpCisJCQljb250aW51ZTsKKworCQlpZiAobHZfaXNfY2FjaGUobHYpIHx8IGx2X2lzX2NhY2hlX3Bvb2wobHYpKQorCQkJLyogZnVydGhlciBjaGVja3MgYnkgX21vdmVfY2FjaGUoKSAqLworCQkJY29udGludWU7CisKKwkJLyogRW5zdXJlIGFsbCB0aGUgUFZzIHVzZWQgYnkgdGhpcyBMViByZW1haW4gaW4gdGhlIHNhbWUgKi8KKwkJLyogVkcgYXMgZWFjaCBvdGhlciAqLworCQl2Z193aXRoID0gTlVMTDsKKwkJZG1fbGlzdF9pdGVyYXRlX2l0ZW1zKHNlZywgJmx2LT5zZWdtZW50cykgeworCQkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKSB7CisJCQkJLyogRklYTUUgQ2hlY2sgQVJFQV9MViB0b28gKi8KKwkJCQlpZiAoc2VnX3R5cGUoc2VnLCBzKSAhPSBBUkVBX1BWKQorCQkJCQljb250aW51ZTsKKworCQkJCXB2ID0gc2VnX3B2KHNlZywgcyk7CisJCQkJaWYgKHZnX3dpdGgpIHsKKwkJCQkJaWYgKCFwdl9pc19pbl92Zyh2Z193aXRoLCBwdikpIHsKKwkJCQkJCWxvZ19lcnJvcigiQ2FuJ3Qgc3BsaXQgTG9naWNhbCAiCisJCQkJCQkJICAiVm9sdW1lICVzIGJldHdlZW4gIgorCQkJCQkJCSAgInR3byBWb2x1bWUgR3JvdXBzIiwKKwkJCQkJCQkgIGx2LT5uYW1lKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChwdl9pc19pbl92Zyh2Z19mcm9tLCBwdikpIHsKKwkJCQkJdmdfd2l0aCA9IHZnX2Zyb207CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAocHZfaXNfaW5fdmcodmdfdG8sIHB2KSkgeworCQkJCQl2Z193aXRoID0gdmdfdG87CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlsb2dfZXJyb3IoIlBoeXNpY2FsIFZvbHVtZSAlcyBub3QgZm91bmQiLAorCQkJCQkgIHB2X2Rldl9uYW1lKHB2KSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJfQorCisJCWlmICh2Z193aXRoID09IHZnX2Zyb20pCisJCQljb250aW51ZTsKKworCQkvKiBNb3ZlIHRoaXMgTFYgKi8KKwkJaWYgKCFfbW92ZV9vbmVfbHYodmdfZnJvbSwgdmdfdG8sIGx2aCwgJmx2aHQpKQorCQkJcmV0dXJuXzA7CisJfQorCisJLyogRklYTUUgRW5zdXJlIG5vIExWcyBjb250YWluIHNlZ3MgcG9pbnRpbmcgYXQgTFZzIGluIHRoZSBvdGhlciBWRyAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBNb3ZlIHRoZSBoaWRkZW4gLyBpbnRlcm5hbCAic25hcHNob3ROIiBMVnMuZnJvbSAndmdfZnJvbScgdG8gJ3ZnX3RvJy4KKyAqLworc3RhdGljIGludCBfbW92ZV9zbmFwc2hvdHMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJCSAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvKQoreworCXN0cnVjdCBkbV9saXN0ICpsdmgsICpsdmh0OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisJc3RydWN0IGx2X3NlZ21lbnQgKnNlZzsKKwlpbnQgY293X2Zyb20gPSAwOworCWludCBvcmlnaW5fZnJvbSA9IDA7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShsdmgsIGx2aHQsICZ2Z19mcm9tLT5sdnMpIHsKKwkJbHYgPSBkbV9saXN0X2l0ZW0obHZoLCBzdHJ1Y3QgbHZfbGlzdCktPmx2OworCisJCWlmICghKGx2LT5zdGF0dXMgJiBTTkFQU0hPVCkpCisJCQljb250aW51ZTsKKworCQlkbV9saXN0X2l0ZXJhdGVfaXRlbXMoc2VnLCAmbHYtPnNlZ21lbnRzKSB7CisJCQljb3dfZnJvbSA9IF9sdl9pc19pbl92Zyh2Z19mcm9tLCBzZWctPmNvdyk7CisJCQlvcmlnaW5fZnJvbSA9IF9sdl9pc19pbl92Zyh2Z19mcm9tLCBzZWctPm9yaWdpbik7CisKKwkJCWlmIChjb3dfZnJvbSAmJiBvcmlnaW5fZnJvbSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoIWNvd19mcm9tICYmIG9yaWdpbl9mcm9tKSB8fAorCQkJICAgICAoY293X2Zyb20gJiYgIW9yaWdpbl9mcm9tKSkgeworCQkJCWxvZ19lcnJvcigiQ2FuJ3Qgc3BsaXQgc25hcHNob3QgJXMgYmV0d2VlbiIKKwkJCQkJICAiIHR3byBWb2x1bWUgR3JvdXBzIiwgc2VnLT5jb3ctPm5hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKgorCQkJICogQXQgdGhpcyBwb2ludCwgdGhlIGNvdyBhbmQgb3JpZ2luIHNob3VsZCBhbHJlYWR5IGJlCisJCQkgKiBpbiB2Z190by4KKwkJCSAqLworCQkJaWYgKF9sdl9pc19pbl92Zyh2Z190bywgc2VnLT5jb3cpICYmCisJCQkgICAgX2x2X2lzX2luX3ZnKHZnX3RvLCBzZWctPm9yaWdpbikpIHsKKwkJCQlpZiAoIV9tb3ZlX29uZV9sdih2Z19mcm9tLCB2Z190bywgbHZoLCAmbHZodCkpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfbW92ZV9taXJyb3JzKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sCisJCQkgc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8pCit7CisJc3RydWN0IGRtX2xpc3QgKmx2aCwgKmx2aHQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCAqbG9nX3NlZzsKKwl1bnNpZ25lZCBzLCBzZWdfaW4sIGxvZ19pbjsKKworCWRtX2xpc3RfaXRlcmF0ZV9zYWZlKGx2aCwgbHZodCwgJnZnX2Zyb20tPmx2cykgeworCQlsdiA9IGRtX2xpc3RfaXRlbShsdmgsIHN0cnVjdCBsdl9saXN0KS0+bHY7CisKKwkJaWYgKGx2X2lzX3JhaWQobHYpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFsdl9pc19taXJyb3JlZChsdikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUsIGlmIG5vIGFsbG9jYXRpb25zIG9uIFBWcyBvZiBAdmdfdG8gKi8KKwkJaWYgKCFsdl9pc19vbl9wdnMobHYsICZ2Z190by0+cHZzKSkKKwkJCWNvbnRpbnVlOworCisJCXNlZyA9IGZpcnN0X3NlZyhsdik7CisKKwkJc2VnX2luID0gMDsKKwkJZm9yIChzID0gMDsgcyA8IHNlZy0+YXJlYV9jb3VudDsgcysrKQorCQkJaWYgKF9sdl9pc19pbl92Zyh2Z190bywgc2VnX2x2KHNlZywgcykpKQorCQkJCXNlZ19pbisrOworCisJCWxvZ19pbiA9ICFzZWctPmxvZ19sdjsKKwkJaWYgKHNlZy0+bG9nX2x2KSB7CisJCQlsb2dfc2VnID0gZmlyc3Rfc2VnKHNlZy0+bG9nX2x2KTsKKwkJCWlmIChzZWdfaXNfbWlycm9yZWQobG9nX3NlZykpIHsKKwkJCQlsb2dfaW4gPSAxOworCisJCQkJLyogRW5zdXJlIGVhY2ggbG9nIGRldiBpcyBpbiB2Z190byAqLworCQkJCWZvciAocyA9IDA7IHMgPCBsb2dfc2VnLT5hcmVhX2NvdW50OyBzKyspCisJCQkJCWxvZ19pbiA9IGxvZ19pbiAmJgorCQkJCQkJX2x2X2lzX2luX3ZnKHZnX3RvLAorCQkJCQkJCSAgICAgc2VnX2x2KGxvZ19zZWcsIHMpKTsKKwkJCX0gZWxzZQorCQkJCWxvZ19pbiA9IF9sdl9pc19pbl92Zyh2Z190bywgc2VnLT5sb2dfbHYpOworCQl9CisKKwkJaWYgKChzZWdfaW4gJiYgc2VnX2luIDwgc2VnLT5hcmVhX2NvdW50KSB8fAorCQkgICAgKHNlZ19pbiAmJiBzZWctPmxvZ19sdiAmJiAhbG9nX2luKSB8fAorCQkgICAgKCFzZWdfaW4gJiYgc2VnLT5sb2dfbHYgJiYgbG9nX2luKSkgeworCQkJbG9nX2Vycm9yKCJDYW4ndCBzcGxpdCBtaXJyb3IgJXMgYmV0d2VlbiAiCisJCQkJICAidHdvIFZvbHVtZSBHcm91cHMiLCBsdi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChzZWdfaW4gPT0gc2VnLT5hcmVhX2NvdW50ICYmIGxvZ19pbikgeworCQkJaWYgKCFfbW92ZV9vbmVfbHYodmdfZnJvbSwgdmdfdG8sIGx2aCwgJmx2aHQpKQorCQkJCXJldHVybl8wOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgYW55IFJBSUQgTFZzIHdpdGggYWxsb2NhdGlvbnMgb24gUFZzIG9mIEB2Z190by4KKyAqCisgKiBJZiB0aGVzZSBkb24ndCBoYXZlIGFueSBhbGxvY2F0aW9ucyBvbiBQVnMgb2YgQHZnX2Zyb20sCisgKiBtb3ZlIHRoZWlyIHdob2xlIGx2IHN0YWNrIGFjcm9zcyB0byBAdmdfdG8gaW5jbHVkaW5nIHRoZQorICogdG9wLWxldmVsIFJBSUQgTFYuCisgKi8KK3N0YXRpYyBpbnQgX21vdmVfcmFpZHMoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvKQoreworCXN0cnVjdCBkbV9saXN0ICpsdmgsICpsdmh0OworCXN0cnVjdCBsb2dpY2FsX3ZvbHVtZSAqbHY7CisKKwlkbV9saXN0X2l0ZXJhdGVfc2FmZShsdmgsIGx2aHQsICZ2Z19mcm9tLT5sdnMpIHsKKwkJbHYgPSBkbV9saXN0X2l0ZW0obHZoLCBzdHJ1Y3QgbHZfbGlzdCktPmx2OworCisJCWlmICghbHZfaXNfcmFpZChsdikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUsIGlmIG5vIGFsbG9jYXRpb25zIG9uIFBWcyBvZiBAdmdfdG8gKi8KKwkJaWYgKCFsdl9pc19vbl9wdnMobHYsICZ2Z190by0+cHZzKSkKKwkJCWNvbnRpbnVlOworIAorCQkvKiBJZiBhbGxvY2F0aW9ucyBhcmUgb24gUFZzIG9mIEB2Z190byAtPiBtb3ZlIFJBSUQgTFYgc3RhY2sgYWNyb3NzICovCisJCWlmICghX21vdmVfb25lX2x2KHZnX2Zyb20sIHZnX3RvLCBsdmgsICZsdmh0KSkKKwkJCXJldHVybl8wOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9tb3ZlX3RoaW5zKHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX2Zyb20sCisJCSAgICAgICBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190bykKK3sKKwlzdHJ1Y3QgZG1fbGlzdCAqbHZoLCAqbHZodDsKKwlzdHJ1Y3QgbG9naWNhbF92b2x1bWUgKmx2LCAqZGF0YV9sdjsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUobHZoLCBsdmh0LCAmdmdfZnJvbS0+bHZzKSB7CisJCWx2ID0gZG1fbGlzdF9pdGVtKGx2aCwgc3RydWN0IGx2X2xpc3QpLT5sdjsKKworCQlpZiAobHZfaXNfdGhpbl92b2x1bWUobHYpKSB7CisJCQlzZWcgPSBmaXJzdF9zZWcobHYpOworCQkJZGF0YV9sdiA9IHNlZ19sdihmaXJzdF9zZWcoc2VnLT5wb29sX2x2KSwgMCk7CisKKwkJCS8qIElnbm9yZSwgaWYgbm8gYWxsb2NhdGlvbnMgb24gUFZzIG9mIEB2Z190byAqLworCQkJaWYgKCFsdl9pc19vbl9wdnMoZGF0YV9sdiwgJnZnX3RvLT5wdnMpIHx8CisJCQkgICAgKHNlZy0+ZXh0ZXJuYWxfbHYgJiYgIWx2X2lzX29uX3B2cyhzZWctPmV4dGVybmFsX2x2LCAmdmdfdG8tPnB2cykpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKF9sdl9pc19pbl92Zyh2Z190bywgZGF0YV9sdikgfHwKKwkJCSAgICAgX2x2X2lzX2luX3ZnKHZnX3RvLCBzZWctPmV4dGVybmFsX2x2KSkpIHsKKwkJCQlpZiAoX2x2X2lzX2luX3ZnKHZnX2Zyb20sIHNlZy0+ZXh0ZXJuYWxfbHYpIHx8CisJCQkJICAgIF9sdl9pc19pbl92Zyh2Z19mcm9tLCBkYXRhX2x2KSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbid0IHNwbGl0IGV4dGVybmFsIG9yaWdpbiAlcyAiCisJCQkJCQkgICJhbmQgcG9vbCAlcyBiZXR3ZWVuIHR3byBWb2x1bWUgR3JvdXBzLiIsCisJCQkJCQkgIHNlZy0+ZXh0ZXJuYWxfbHYtPm5hbWUsCisJCQkJCQkgIHNlZy0+cG9vbF9sdi0+bmFtZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAoIV9tb3ZlX29uZV9sdih2Z19mcm9tLCB2Z190bywgbHZoLCAmbHZodCkpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9IGVsc2UgaWYgKGx2X2lzX3RoaW5fcG9vbChsdikpIHsKKwkJCXNlZyA9IGZpcnN0X3NlZyhsdik7CisJCQlkYXRhX2x2ID0gc2VnX2x2KHNlZywgMCk7CisKKwkJCS8qIElnbm9yZSwgaWYgbm8gYWxsb2NhdGlvbnMgb24gUFZzIG9mIEB2Z190byAqLworCQkJaWYgKCFsdl9pc19vbl9wdnMoZGF0YV9sdiwgJnZnX3RvLT5wdnMpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoX2x2X2lzX2luX3ZnKHZnX3RvLCBkYXRhX2x2KSB8fAorCQkJICAgIF9sdl9pc19pbl92Zyh2Z190bywgc2VnLT5tZXRhZGF0YV9sdikpIHsKKwkJCQlpZiAoX2x2X2lzX2luX3ZnKHZnX2Zyb20sIHNlZy0+bWV0YWRhdGFfbHYpIHx8CisJCQkJICAgIF9sdl9pc19pbl92Zyh2Z19mcm9tLCBkYXRhX2x2KSkgeworCQkJCQlsb2dfZXJyb3IoIkNhbid0IHNwbGl0IHBvb2wgZGF0YSBhbmQgbWV0YWRhdGEgJXMgIgorCQkJCQkJICAiYmV0d2VlbiB0d28gVm9sdW1lIEdyb3Vwcy4iLAorCQkJCQkJICBsdi0+bmFtZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAoIV9tb3ZlX29uZV9sdih2Z19mcm9tLCB2Z190bywgbHZoLCAmbHZodCkpCisJCQkJCXJldHVybl8wOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX21vdmVfY2FjaGUoc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbSwKKwkJICAgICAgIHN0cnVjdCB2b2x1bWVfZ3JvdXAgKnZnX3RvKQoreworCWludCBpc19tb3Zpbmc7CisJc3RydWN0IGRtX2xpc3QgKmx2aCwgKmx2aHQ7CisJc3RydWN0IGxvZ2ljYWxfdm9sdW1lICpsdiwgKmRhdGEsICptZXRhLCAqb3JpZzsKKwlzdHJ1Y3QgbHZfc2VnbWVudCAqc2VnLCAqY2FjaGVfc2VnOworCisJZG1fbGlzdF9pdGVyYXRlX3NhZmUobHZoLCBsdmh0LCAmdmdfZnJvbS0+bHZzKSB7CisJCWx2ID0gZG1fbGlzdF9pdGVtKGx2aCwgc3RydWN0IGx2X2xpc3QpLT5sdjsKKwkJZGF0YSA9IG1ldGEgPSBvcmlnID0gTlVMTDsKKwkJc2VnID0gZmlyc3Rfc2VnKGx2KTsKKworCQlpZiAoIWx2X2lzX2NhY2hlKGx2KSAmJiAhbHZfaXNfY2FjaGVfcG9vbChsdikpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGSVhNRTogVGhlIGNvZGUgc2VlbXMgdG8gbW92ZSBjYWNoZSBMVnMgZmluZSwgYnV0IGl0CisJCSAqICAgICAgICBoYXNuJ3QgYmVlbiB3ZWxsIHRlc3RlZCBhbmQgaXQgY2F1c2VzIHByb2JsZW1zCisJCSAqICAgICAgICB3aGVuIGp1c3Qgc3BsaXR0aW5nIFBWcyB0aGF0IGRvbid0IGNvbnRhaW4KKwkJICogICAgICAgIGNhY2hlIExWcy4KKwkJICogV2FpdGluZyBmb3IgbmV4dCByZWxlYXNlIGJlZm9yZSBmaXhpbmcgYW5kIGVuYWJsaW5nLgorCQkgKi8KKwkJbG9nX2Vycm9yKCJVbmFibGUgdG8gc3BsaXQgVkcgd2hpbGUgaXQgY29udGFpbnMgY2FjaGUgTFZzIik7CisJCXJldHVybiAwOworCisJCS8qIE5PVFJFQUNIRUQgKi8KKworCQlpZiAobHZfaXNfY2FjaGUobHYpKSB7CisJCQlvcmlnID0gc2VnX2x2KHNlZywgMCk7CisJCQlkYXRhID0gc2VnX2x2KGZpcnN0X3NlZyhzZWctPnBvb2xfbHYpLCAwKTsKKwkJCW1ldGEgPSBmaXJzdF9zZWcoc2VnLT5wb29sX2x2KS0+bWV0YWRhdGFfbHY7CisJCQkvKiBFbnN1cmUgYWxsIGNvbXBvbmVudHMgYXJlIGNvbWluZyBhbG9uZyAqLworCQkJaXNfbW92aW5nID0gX2x2X2lzX2luX3ZnKHZnX3RvLCBvcmlnKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghZG1fbGlzdF9lbXB0eSgmc2VnLT5sdi0+c2Vnc191c2luZ190aGlzX2x2KSAmJgorCQkJICAgICEoY2FjaGVfc2VnID0gZ2V0X29ubHlfc2VnbWVudF91c2luZ190aGlzX2x2KHNlZy0+bHYpKSkKKwkJCQlyZXR1cm5fMDsKKwkJCW9yaWcgPSBzZWdfbHYoY2FjaGVfc2VnLCAwKTsKKwkJCWRhdGEgPSBzZWdfbHYoc2VnLCAwKTsKKwkJCW1ldGEgPSBzZWctPm1ldGFkYXRhX2x2OworCisJCQlpZiAoX2x2X2lzX2luX3ZnKHZnX3RvLCBkYXRhKSB8fAorCQkJICAgIF9sdl9pc19pbl92Zyh2Z190bywgbWV0YSkpCisJCQkJaXNfbW92aW5nID0gMTsKKwkJfQorCisJCWlmICghbHZfaXNfb25fcHZzKGRhdGEsICZ2Z190by0+cHZzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbHZfaXNfb25fcHZzKG1ldGEsICZ2Z190by0+cHZzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChvcmlnICYmIChfbHZfaXNfaW5fdmcodmdfdG8sIG9yaWcpICE9IGlzX21vdmluZykpIHsKKwkJCWxvZ19lcnJvcigiQ2FuJ3Qgc3BsaXQgJXMgYW5kIGl0cyBvcmlnaW4gKCVzKSIKKwkJCQkgICIgaW50byBzZXBhcmF0ZSBWR3MiLCBsdi0+bmFtZSwgb3JpZy0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChkYXRhICYmIChfbHZfaXNfaW5fdmcodmdfdG8sIGRhdGEpICE9IGlzX21vdmluZykpIHsKKwkJCWxvZ19lcnJvcigiQ2FuJ3Qgc3BsaXQgJXMgYW5kIGl0cyBjYWNoZSBwb29sIgorCQkJCSAgIiBkYXRhIExWICglcykgaW50byBzZXBhcmF0ZSBWR3MiLAorCQkJCSAgbHYtPm5hbWUsIGRhdGEtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobWV0YSAmJiAoX2x2X2lzX2luX3ZnKHZnX3RvLCBtZXRhKSAhPSBpc19tb3ZpbmcpKSB7CisJCQlsb2dfZXJyb3IoIkNhbid0IHNwbGl0ICVzIGFuZCBpdHMgY2FjaGUgcG9vbCIKKwkJCQkgICIgbWV0YWRhdGEgTFYgKCVzKSBpbnRvIHNlcGFyYXRlIFZHcyIsCisJCQkJICBsdi0+bmFtZSwgbWV0YS0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIV9tb3ZlX29uZV9sdih2Z19mcm9tLCB2Z190bywgbHZoLCAmbHZodCkpCisJCQlyZXR1cm5fMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENyZWF0ZSBvciBvcGVuIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgdmdzcGxpdCBvcGVyYXRpb24uCisgKiBSZXR1cm5zCisgKiAtIG5vbi1OVUxMOiBWRyBoYW5kbGUgdy9WRyBsb2NrIGhlbGQKKyAqIC0gTlVMTDogbm8gVkcgbG9jayBoZWxkCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm9sdW1lX2dyb3VwICpfdmdzcGxpdF90byhzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJY29uc3QgY2hhciAqdmdfbmFtZV90bywKKwkJCQkJaW50ICpleGlzdGluZ192ZykKK3sKKwlzdHJ1Y3Qgdm9sdW1lX2dyb3VwICp2Z190byA9IE5VTEw7CisKKwlsb2dfdmVyYm9zZSgiQ2hlY2tpbmcgZm9yIG5ldyB2b2x1bWUgZ3JvdXAgXCIlc1wiIiwgdmdfbmFtZV90byk7CisJLyoKKwkgKiBGaXJzdCB0cnkgdG8gY3JlYXRlIGEgbmV3IFZHLiAgSWYgd2UgY2Fubm90IGNyZWF0ZSBpdCwKKwkgKiBhbmQgd2UgZ2V0IEZBSUxFRF9FWElTVCAod2Ugd2lsbCBub3QgYmUgaG9sZGluZyBhIGxvY2spLAorCSAqIGEgVkcgbXVzdCBhbHJlYWR5IGV4aXN0IHdpdGggdGhpcyBuYW1lLiAgV2UgdGhlbiB0cnkgdG8KKwkgKiByZWFkIHRoZSBleGlzdGluZyBWRyAtIHRoZSB2Z3NwbGl0IHdpbGwgYmUgaW50byBhbiBleGlzdGluZyBWRy4KKwkgKgorCSAqIE90aGVyd2lzZSwgaWYgdGhlIGxvY2sgd2FzIHN1Y2Nlc3NmdWwsIGl0IG11c3QgYmUgdGhlIGNhc2UgdGhhdAorCSAqIHdlIG9idGFpbmVkIGEgV1JJVEUgbG9jayBhbmQgY291bGQgbm90IGZpbmQgdGhlIHZnbmFtZSBpbiB0aGUKKwkgKiBzeXN0ZW0uICBUaHVzLCB0aGUgc3BsaXQgd2lsbCBiZSBpbnRvIGEgbmV3IFZHLgorCSAqLworCXZnX3RvID0gdmdfbG9ja19hbmRfY3JlYXRlKGNtZCwgdmdfbmFtZV90byk7CisJaWYgKHZnX3JlYWRfZXJyb3IodmdfdG8pID09IEZBSUxFRF9MT0NLSU5HKSB7CisJCWxvZ19lcnJvcigiQ2FuJ3QgZ2V0IGxvY2sgZm9yICVzIiwgdmdfbmFtZV90byk7CisJCXJlbGVhc2VfdmcodmdfdG8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZnX3JlYWRfZXJyb3IodmdfdG8pID09IEZBSUxFRF9FWElTVCkgeworCQkqZXhpc3RpbmdfdmcgPSAxOworCQlyZWxlYXNlX3ZnKHZnX3RvKTsKKwkJdmdfdG8gPSB2Z19yZWFkX2Zvcl91cGRhdGUoY21kLCB2Z19uYW1lX3RvLCBOVUxMLCAwLCAwKTsKKworCQlpZiAodmdfcmVhZF9lcnJvcih2Z190bykpIHsKKwkJCXJlbGVhc2VfdmcodmdfdG8pOworCQkJcmV0dXJuX05VTEw7CisJCX0KKworCX0gZWxzZSBpZiAodmdfcmVhZF9lcnJvcih2Z190bykgPT0gU1VDQ0VTUykgeworCQkqZXhpc3RpbmdfdmcgPSAwOworCX0KKwlyZXR1cm4gdmdfdG87Cit9CisKKy8qCisgKiBPcGVuIHRoZSBzb3VyY2Ugb2YgdGhlIHZnc3BsaXQgb3BlcmF0aW9uLgorICogUmV0dXJucworICogLSBub24tTlVMTDogVkcgaGFuZGxlIHcvVkcgbG9jayBoZWxkCisgKiAtIE5VTEw6IG5vIFZHIGxvY2sgaGVsZAorICovCitzdGF0aWMgc3RydWN0IHZvbHVtZV9ncm91cCAqX3Znc3BsaXRfZnJvbShzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwKKwkJCQkJICBjb25zdCBjaGFyICp2Z19uYW1lX2Zyb20pCit7CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfZnJvbTsKKworCWxvZ192ZXJib3NlKCJDaGVja2luZyBmb3Igdm9sdW1lIGdyb3VwIFwiJXNcIiIsIHZnX25hbWVfZnJvbSk7CisKKwl2Z19mcm9tID0gdmdfcmVhZF9mb3JfdXBkYXRlKGNtZCwgdmdfbmFtZV9mcm9tLCBOVUxMLCAwLCAwKTsKKwlpZiAodmdfcmVhZF9lcnJvcih2Z19mcm9tKSkgeworCQlyZWxlYXNlX3ZnKHZnX2Zyb20pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoaXNfbG9ja2RfdHlwZSh2Z19mcm9tLT5sb2NrX3R5cGUpKSB7CisJCWxvZ19lcnJvcigidmdzcGxpdCBub3QgYWxsb3dlZCBmb3IgbG9ja190eXBlICVzIiwgdmdfZnJvbS0+bG9ja190eXBlKTsKKwkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmdfZnJvbSwgdmdfbmFtZV9mcm9tKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHZnX2Zyb207Cit9CisKKy8qCisgKiBIYXMgdGhlIHVzZXIgZ2l2ZW4gYW4gb3B0aW9uIHJlbGF0ZWQgdG8gYSBuZXcgdmcgYXMgdGhlIHNwbGl0IGRlc3RpbmF0aW9uPworICovCitzdGF0aWMgaW50IG5ld192Z19vcHRpb25fc3BlY2lmaWVkKHN0cnVjdCBjbWRfY29udGV4dCAqY21kKQoreworCXJldHVybihhcmdfaXNfc2V0KGNtZCwgY2x1c3RlcmVkX0FSRykgfHwKKwkgICAgICAgYXJnX2lzX3NldChjbWQsIGFsbG9jX0FSRykgfHwKKwkgICAgICAgYXJnX2lzX3NldChjbWQsIG1heHBoeXNpY2Fsdm9sdW1lc19BUkcpIHx8CisJICAgICAgIGFyZ19pc19zZXQoY21kLCBtYXhsb2dpY2Fsdm9sdW1lc19BUkcpIHx8CisJICAgICAgIGFyZ19pc19zZXQoY21kLCB2Z21ldGFkYXRhY29waWVzX0FSRykpOworfQorCitpbnQgdmdzcGxpdChzdHJ1Y3QgY21kX2NvbnRleHQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgdnBfbmV3OworCXN0cnVjdCB2Z2NyZWF0ZV9wYXJhbXMgdnBfZGVmOworCWNvbnN0IGNoYXIgKnZnX25hbWVfZnJvbSwgKnZnX25hbWVfdG87CisJc3RydWN0IHZvbHVtZV9ncm91cCAqdmdfdG8gPSBOVUxMLCAqdmdfZnJvbSA9IE5VTEw7CisJaW50IG9wdDsKKwlpbnQgZXhpc3RpbmdfdmcgPSAwOworCWludCByID0gRUNNRF9GQUlMRUQ7CisJY29uc3QgY2hhciAqbHZfbmFtZTsKKwlpbnQgbG9ja192Z19mcm9tX2ZpcnN0ID0gMTsKKworCWlmICgoYXJnX2lzX3NldChjbWQsIG5hbWVfQVJHKSArIGFyZ2MpIDwgMykgeworCQlsb2dfZXJyb3IoIkV4aXN0aW5nIFZHLCBuZXcgVkcgYW5kIGVpdGhlciBwaHlzaWNhbCB2b2x1bWVzICIKKwkJCSAgIm9yIGxvZ2ljYWwgdm9sdW1lIHJlcXVpcmVkLiIpOworCQlyZXR1cm4gRUlOVkFMSURfQ01EX0xJTkU7CisJfQorCisJaWYgKGFyZ19pc19zZXQoY21kLCBuYW1lX0FSRykgJiYgKGFyZ2MgPiAyKSkgeworCQlsb2dfZXJyb3IoIkEgbG9naWNhbCB2b2x1bWUgbmFtZSBjYW5ub3QgYmUgZ2l2ZW4gd2l0aCAiCisJCQkgICJwaHlzaWNhbCB2b2x1bWVzLiIpOworCQlyZXR1cm4gRUNNRF9GQUlMRUQ7CisJfQorCisJLyogTmVlZGVkIGNoYW5nZSB0aGUgZ2xvYmFsIFZHIG5hbWVzcGFjZS4gKi8KKwlpZiAoIWxvY2tkX2dsKGNtZCwgImV4IiwgTERHTF9VUERBVEVfTkFNRVMpKQorCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwlpZiAoYXJnX2lzX3NldChjbWQsIG5hbWVfQVJHKSkKKwkJbHZfbmFtZSA9IGFyZ192YWx1ZShjbWQsIG5hbWVfQVJHKTsKKwllbHNlCisJCWx2X25hbWUgPSBOVUxMOworCisJdmdfbmFtZV9mcm9tID0gc2tpcF9kZXZfZGlyKGNtZCwgYXJndlswXSwgTlVMTCk7CisJdmdfbmFtZV90byA9IHNraXBfZGV2X2RpcihjbWQsIGFyZ3ZbMV0sIE5VTEwpOworCWFyZ2MgLT0gMjsKKwlhcmd2ICs9IDI7CisKKwlpZiAoIXN0cmNtcCh2Z19uYW1lX3RvLCB2Z19uYW1lX2Zyb20pKSB7CisJCWxvZ19lcnJvcigiRHVwbGljYXRlIHZvbHVtZSBncm91cCBuYW1lIFwiJXNcIiIsIHZnX25hbWVfZnJvbSk7CisJCXJldHVybiBFQ01EX0ZBSUxFRDsKKwl9CisKKwlpZiAoc3RyY21wKHZnX25hbWVfdG8sIHZnX25hbWVfZnJvbSkgPCAwKQorCQlsb2NrX3ZnX2Zyb21fZmlyc3QgPSAwOworCisJaWYgKGxvY2tfdmdfZnJvbV9maXJzdCkgeworCQlpZiAoISh2Z19mcm9tID0gX3Znc3BsaXRfZnJvbShjbWQsIHZnX25hbWVfZnJvbSkpKQorCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQkvKgorCQkgKiBTZXQgbWV0YWRhdGEgZm9ybWF0IG9mIG9yaWdpbmFsIFZHLgorCQkgKiBOT1RFOiBXZSBtdXN0IHNldCB0aGUgZm9ybWF0IGJlZm9yZSBjYWxsaW5nIHZnX2xvY2tfYW5kX2NyZWF0ZSgpCisJCSAqIHNpbmNlIHZnX2xvY2tfYW5kX2NyZWF0ZSgpIGNhbGxzIHRoZSBwZXItZm9ybWF0IGNvbnN0cnVjdG9yLgorCQkgKi8KKwkJY21kLT5mbXQgPSB2Z19mcm9tLT5maWQtPmZtdDsKKworCQlpZiAoISh2Z190byA9IF92Z3NwbGl0X3RvKGNtZCwgdmdfbmFtZV90bywgJmV4aXN0aW5nX3ZnKSkpIHsKKwkJCXVubG9ja19hbmRfcmVsZWFzZV92ZyhjbWQsIHZnX2Zyb20sIHZnX25hbWVfZnJvbSk7CisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoISh2Z190byA9IF92Z3NwbGl0X3RvKGNtZCwgdmdfbmFtZV90bywgJmV4aXN0aW5nX3ZnKSkpCisJCQlyZXR1cm5fRUNNRF9GQUlMRUQ7CisKKwkJaWYgKCEodmdfZnJvbSA9IF92Z3NwbGl0X2Zyb20oY21kLCB2Z19uYW1lX2Zyb20pKSkgeworCQkJdW5sb2NrX2FuZF9yZWxlYXNlX3ZnKGNtZCwgdmdfdG8sIHZnX25hbWVfdG8pOworCQkJcmV0dXJuX0VDTURfRkFJTEVEOworCQl9CisKKwkJaWYgKGNtZC0+Zm10ICE9IHZnX2Zyb20tPmZpZC0+Zm10KSB7CisJCQkvKiBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qga25vdyB0aGUgdmdfZnJvbS0+ZmlkLT5mbXQgKi8KKwkJCWxvZ19lcnJvcigiVW5hYmxlIHRvIHNldCBuZXcgVkcgbWV0YWRhdGEgdHlwZSBiYXNlZCBvbiAiCisJCQkJICAic291cmNlIFZHIGZvcm1hdCAtIHVzZSAtTSBvcHRpb24uIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCWlmIChleGlzdGluZ192ZykgeworCQlpZiAobmV3X3ZnX29wdGlvbl9zcGVjaWZpZWQoY21kKSkgeworCQkJbG9nX2Vycm9yKCJWb2x1bWUgZ3JvdXAgXCIlc1wiIGV4aXN0cywgYnV0IG5ldyBWRyAiCisJCQkJICAgICJvcHRpb24gc3BlY2lmaWVkIiwgdmdfbmFtZV90byk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoIXZnc19hcmVfY29tcGF0aWJsZShjbWQsIHZnX2Zyb20sdmdfdG8pKQorCQkJZ290b19iYWQ7CisJfSBlbHNlIHsKKwkJaWYgKCF2Z2NyZWF0ZV9wYXJhbXNfc2V0X2RlZmF1bHRzKGNtZCwgJnZwX2RlZiwgdmdfZnJvbSkpIHsKKwkJCXIgPSBFSU5WQUxJRF9DTURfTElORTsKKwkJCWdvdG9fYmFkOworCQl9CisJCXZwX2RlZi52Z19uYW1lID0gdmdfbmFtZV90bzsKKwkJaWYgKCF2Z2NyZWF0ZV9wYXJhbXNfc2V0X2Zyb21fYXJncyhjbWQsICZ2cF9uZXcsICZ2cF9kZWYpKSB7CisJCQlyID0gRUlOVkFMSURfQ01EX0xJTkU7CisJCQlnb3RvX2JhZDsKKwkJfQorCisJCWlmICghdmdjcmVhdGVfcGFyYW1zX3ZhbGlkYXRlKGNtZCwgJnZwX25ldykpIHsKKwkJCXIgPSBFSU5WQUxJRF9DTURfTElORTsKKwkJCWdvdG9fYmFkOworCQl9CisKKwkJaWYgKCF2Z19zZXRfZXh0ZW50X3NpemUodmdfdG8sIHZwX25ldy5leHRlbnRfc2l6ZSkgfHwKKwkJICAgICF2Z19zZXRfbWF4X2x2KHZnX3RvLCB2cF9uZXcubWF4X2x2KSB8fAorCQkgICAgIXZnX3NldF9tYXhfcHYodmdfdG8sIHZwX25ldy5tYXhfcHYpIHx8CisJCSAgICAhdmdfc2V0X2FsbG9jX3BvbGljeSh2Z190bywgdnBfbmV3LmFsbG9jKSB8fAorCQkgICAgIXZnX3NldF9jbHVzdGVyZWQodmdfdG8sIHZwX25ldy5jbHVzdGVyZWQpIHx8CisJCSAgICAhdmdfc2V0X3N5c3RlbV9pZCh2Z190bywgdnBfbmV3LnN5c3RlbV9pZCkgfHwKKwkJICAgICF2Z19zZXRfbWRhX2NvcGllcyh2Z190bywgdnBfbmV3LnZnbWV0YWRhdGFjb3BpZXMpKQorCQkJZ290b19iYWQ7CisJfQorCisJLyogQXJjaGl2ZSB2Z19mcm9tIGJlZm9yZSBjaGFuZ2luZyBpdCAqLworCWlmICghYXJjaGl2ZSh2Z19mcm9tKSkKKwkJZ290b19iYWQ7CisKKwkvKiBNb3ZlIFBWcyBhY3Jvc3MgdG8gbmV3IHN0cnVjdHVyZSAqLworCWZvciAob3B0ID0gMDsgb3B0IDwgYXJnYzsgb3B0KyspIHsKKwkJZG1fdW5lc2NhcGVfY29sb25zX2FuZF9hdF9zaWducyhhcmd2W29wdF0sIE5VTEwsIE5VTEwpOworCQlpZiAoIW1vdmVfcHYodmdfZnJvbSwgdmdfdG8sIGFyZ3Zbb3B0XSkpCisJCQlnb3RvX2JhZDsKKwl9CisKKwkvKiBJZiBhbiBMViBnaXZlbiBvbiB0aGUgY21kbGluZSwgbW92ZSB1c2VkX2J5IFBWcyAqLworCWlmIChsdl9uYW1lICYmICFtb3ZlX3B2c191c2VkX2J5X2x2KHZnX2Zyb20sIHZnX3RvLCBsdl9uYW1lKSkKKwkJZ290b19iYWQ7CisKKwkvKgorCSAqIEZpcnN0IG1vdmUgYW55IHJlcXVpcmVkIFJBSUQgTFZzIGFjcm9zcyByZWN1cnNpdmVseS4KKwkgKiBSZWplY3QgaWYgdGhleSBnZXQgc3BsaXQgYmV0d2VlbiBWR3MuCisJICoKKwkgKiBUaGlzIG1vdmVzIHRoZSB3aG9sZSBMViBzdGFjayBhY3Jvc3MsIHRodXMgX21vdmVfbHZzKCkgYmVsb3cKKwkgKiBhaW4ndCBoaXQgYW55IG9mIHRoZWlyIE1ldGFMVnMvRGF0YUxWcyBhbnkgbW9yZSBidXQnbGwgc3RpbGwKKwkgKiB3b3JrIGZvciBhbGwgb3RoZXIgdHlwZSBzcGVjaWZpYyBtb3ZlcyBmb2xsb3dpbmcgaXQuCisJICovCisJaWYgKCEoX21vdmVfcmFpZHModmdfZnJvbSwgdmdfdG8pKSkKKwkJZ290b19iYWQ7CisKKwkvKiBNb3ZlIHJlcXVpcmVkIHN1YiBMVnMgYWNyb3NzLCBjaGVja2luZyBjb25zaXN0ZW5jeSAqLworCWlmICghKF9tb3ZlX2x2cyh2Z19mcm9tLCB2Z190bykpKQorCQlnb3RvX2JhZDsKKworCS8qIE1vdmUgcmVxdWlyZWQgbWlycm9ycyBhY3Jvc3MgKi8KKwlpZiAoIShfbW92ZV9taXJyb3JzKHZnX2Zyb20sIHZnX3RvKSkpCisJCWdvdG9fYmFkOworCisJLyogTW92ZSByZXF1aXJlZCBwb29scyBhY3Jvc3MgKi8KKwlpZiAoIShfbW92ZV90aGlucyh2Z19mcm9tLCB2Z190bykpKQorCQlnb3RvX2JhZDsKKworCS8qIE1vdmUgcmVxdWlyZWQgY2FjaGUgTFZzIGFjcm9zcyAqLworCWlmICghKF9tb3ZlX2NhY2hlKHZnX2Zyb20sIHZnX3RvKSkpCisJCWdvdG9fYmFkOworCisJLyogTW92ZSByZXF1aXJlZCBzbmFwc2hvdHMgYWNyb3NzICovCisJaWYgKCEoX21vdmVfc25hcHNob3RzKHZnX2Zyb20sIHZnX3RvKSkpCisJCWdvdG9fYmFkOworCisJLyogU3BsaXQgbWV0YWRhdGEgYXJlYXMgYW5kIGNoZWNrIGlmIGJvdGggdmdzIGhhdmUgYXQgbGVhc3Qgb25lIGFyZWEgKi8KKwlpZiAoISh2Z19zcGxpdF9tZGFzKGNtZCwgdmdfZnJvbSwgdmdfdG8pKSAmJiB2Z19mcm9tLT5wdl9jb3VudCkgeworCQlsb2dfZXJyb3IoIkNhbm5vdCBzcGxpdDogTm93aGVyZSB0byBzdG9yZSBtZXRhZGF0YSBmb3IgbmV3IFZvbHVtZSBHcm91cCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBTZXQgcHJvcGVyIG5hbWUgZm9yIGFsbCBQVnMgaW4gbmV3IFZHICovCisJaWYgKCF2Z19yZW5hbWUoY21kLCB2Z190bywgdmdfbmFtZV90bykpCisJCWdvdG9fYmFkOworCisJLyogc3RvcmUgaXQgb24gZGlza3MgKi8KKwlsb2dfdmVyYm9zZSgiV3JpdGluZyBvdXQgdXBkYXRlZCB2b2x1bWUgZ3JvdXBzIik7CisKKwkvKgorCSAqIEZpcnN0LCB3cml0ZSBvdXQgdGhlIG5ldyBWRyBhcyBFWFBPUlRFRC4gIFdlIGRvIHRoaXMgZmlyc3QgaW4gY2FzZQorCSAqIHRoZXJlIGlzIGEgY3Jhc2ggLSB3ZSB3aWxsIHN0aWxsIGhhdmUgdGhlIG5ldyBWRyBpbmZvcm1hdGlvbiwgaW4gYW4KKwkgKiBleHBvcnRlZCBzdGF0ZS4gIFJlY292ZXJ5IGFmdGVyIHRoaXMgcG9pbnQgd291bGQgaW1wb3J0aW5nIGFuZCByZW1vdmFsCisJICogb2YgdGhlIG5ldyBWRyBhbmQgcmVkb2luZyB0aGUgdmdzcGxpdC4KKwkgKiBGSVhNRTogcmVjb3ZlciBhdXRvbWF0aWNhbGx5IG9yIGluc3RydWN0IHRoZSB1c2VyPworCSAqLworCXZnX3RvLT5zdGF0dXMgfD0gRVhQT1JURURfVkc7CisKKwlpZiAoIWFyY2hpdmUodmdfdG8pKQorCQlnb3RvX2JhZDsKKworCWlmICghdmdfd3JpdGUodmdfdG8pIHx8ICF2Z19jb21taXQodmdfdG8pKQorCQlnb3RvX2JhZDsKKworCWx2bWV0YWRfdmdfdXBkYXRlX2ZpbmlzaCh2Z190byk7CisKKwliYWNrdXAodmdfdG8pOworCisJLyoKKwkgKiBOZXh0LCB3cml0ZSBvdXQgdGhlIHVwZGF0ZWQgb2xkIFZHLiAgSWYgd2UgY3Jhc2ggYWZ0ZXIgdGhpcyBwb2ludCwKKwkgKiByZWNvdmVyeSBpcyBhIHZnaW1wb3J0IG9uIHRoZSBuZXcgVkcuCisJICogRklYTUU6IHJlY292ZXIgYXV0b21hdGljYWxseSBvciBpbnN0cnVjdCB0aGUgdXNlcj8KKwkgKi8KKwlpZiAodmdfZnJvbS0+cHZfY291bnQpIHsKKwkJaWYgKCF2Z193cml0ZSh2Z19mcm9tKSB8fCAhdmdfY29tbWl0KHZnX2Zyb20pKQorCQkJZ290b19iYWQ7CisKKwkJbHZtZXRhZF92Z191cGRhdGVfZmluaXNoKHZnX2Zyb20pOworCisJCWJhY2t1cCh2Z19mcm9tKTsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHksIHJlbW92ZSB0aGUgRVhQT1JURUQgZmxhZyBmcm9tIHRoZSBuZXcgVkcgYW5kIHdyaXRlIGl0IG91dC4KKwkgKi8KKwlpZiAoIXRlc3RfbW9kZSgpKSB7CisJCXJlbGVhc2VfdmcodmdfdG8pOworCQl2Z190byA9IHZnX3JlYWRfZm9yX3VwZGF0ZShjbWQsIHZnX25hbWVfdG8sIE5VTEwsCisJCQkJCSAgIFJFQURfQUxMT1dfRVhQT1JURUQsIDApOworCQlpZiAodmdfcmVhZF9lcnJvcih2Z190bykpIHsKKwkJCWxvZ19lcnJvcigiVm9sdW1lIGdyb3VwIFwiJXNcIiBiZWNhbWUgaW5jb25zaXN0ZW50OiAiCisJCQkJICAicGxlYXNlIGZpeCBtYW51YWxseSIsIHZnX25hbWVfdG8pOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwl2Z190by0+c3RhdHVzICY9IH5FWFBPUlRFRF9WRzsKKworCWlmICghdmdfd3JpdGUodmdfdG8pIHx8ICF2Z19jb21taXQodmdfdG8pKQorCQlnb3RvX2JhZDsKKworCWx2bWV0YWRfdmdfdXBkYXRlX2ZpbmlzaCh2Z190byk7CisKKwliYWNrdXAodmdfdG8pOworCisJbG9nX3ByaW50X3VubGVzc19zaWxlbnQoIiVzIHZvbHVtZSBncm91cCBcIiVzXCIgc3VjY2Vzc2Z1bGx5IHNwbGl0IGZyb20gXCIlc1wiIiwKKwkJCQlleGlzdGluZ192ZyA/ICJFeGlzdGluZyIgOiAiTmV3IiwKKwkJCQl2Z190by0+bmFtZSwgdmdfZnJvbS0+bmFtZSk7CisKKwlyID0gRUNNRF9QUk9DRVNTRUQ7CisKK2JhZDoKKwkvKgorCSAqIHZnX3RvIHJlZmVyZW5jZXMgZWxlbWVudHMgbW92ZWQgZnJvbSB2Z19mcm9tCisJICogc28gdmdfdG8gaGFzIHRvIGJlIGZyZWVkIGZpcnN0LgorCSAqLworCXVubG9ja19hbmRfcmVsZWFzZV92ZyhjbWQsIHZnX3RvLCB2Z19uYW1lX3RvKTsKKwl1bmxvY2tfYW5kX3JlbGVhc2VfdmcoY21kLCB2Z19mcm9tLCB2Z19uYW1lX2Zyb20pOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS91ZGV2Ly5naXRpZ25vcmUgYi91ZGV2Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDc4NwotLS0gL2Rldi9udWxsCisrKyBiL3VkZXYvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDUgQEAKKzEwLWRtLnJ1bGVzCisxMS1kbS1sdm0ucnVsZXMKKzEzLWRtLWRpc2sucnVsZXMKKzY5LWRtLWx2bS1tZXRhZC5ydWxlcworOTUtZG0tbm90aWZ5LnJ1bGVzCmRpZmYgLS1naXQgYS91ZGV2LzEwLWRtLnJ1bGVzLmluIGIvdWRldi8xMC1kbS5ydWxlcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZhNTJhCi0tLSAvZGV2L251bGwKKysrIGIvdWRldi8xMC1kbS5ydWxlcy5pbgpAQCAtMCwwICsxLDE1MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorCisjIFVkZXYgcnVsZXMgZm9yIGRldmljZS1tYXBwZXIgZGV2aWNlcy4KKyMKKyMgVGhlc2UgcnVsZXMgY3JlYXRlIGEgRE0gY29udHJvbCBub2RlIGluIC9kZXYvKERNX0RJUikgZGlyZWN0b3J5LgorIyBUaGUgcnVsZXMgYWxzbyBjcmVhdGUgbm9kZXMgbmFtZWQgZG0teCAoeCBpcyBhIG51bWJlcikgaW4gL2RldgorIyBkaXJlY3RvcnkgYW5kIHN5bWxpbmtzIHRvIHRoZXNlIG5vZGVzIHdpdGggbmFtZXMgZ2l2ZW4gYnkKKyMgdGhlIGFjdHVhbCBETSBuYW1lcy4gU29tZSB1ZGV2IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisjIGZvciB1c2UgaW4gbGF0ZXIgcnVsZXM6CisjICAgRE1fTkFNRSAtIGFjdHVhbCBETSBkZXZpY2UncyBuYW1lCisjICAgRE1fVVVJRCAtIFVVSUQgc2V0IGZvciBETSBkZXZpY2UgKGJsYW5rIGlmIG5vdCBzcGVjaWZpZWQpCisjICAgRE1fU1VTUEVOREVEIC0gc3VzcGVuZGVkIHN0YXRlIG9mIERNIGRldmljZSAoMCBvciAxKQorIyAgIERNX1VERVZfUlVMRVNfVlNOIC0gRE0gdWRldiBydWxlcyB2ZXJzaW9uCisjCisjIFRoZXNlIHJ1bGVzIGNvdmVyIG9ubHkgYmFzaWMgZGV2aWNlLW1hcHBlciBmdW5jdGlvbmFsaXR5IGluIHVkZXYuCisjCisjIFZhcmlvdXMgRE0gc3Vic3lzdGVtcyBtYXkgY29udGFpbiBmdXJ0aGVyIHN1YnN5c3RlbS1zcGVjaWZpYyBydWxlcworIyBpbiAxMS1kbS08c3Vic3lzdGVtX25hbWU+LnJ1bGVzIHdoaWNoIHNob3VsZCBiZSBpbnN0YWxsZWQgdG9nZXRoZXIKKyMgd2l0aCB0aGUgRE0gc3Vic3lzdGVtIGFuZCB3aGljaCBleHRlbmQgdGhlc2UgYmFzaWMgcnVsZXMuCisjIEZvciBleGFtcGxlOgorIyAgIDExLWRtLWx2bS5ydWxlcyBmb3IgTFZNIHN1YnN5c3RlbQorIyAgIDExLWRtLW1wYXRoLnJ1bGVzIGZvciBtdWx0aXBhdGggc3Vic3lzdGVtIChzaW5jZSB2ZXJzaW9uIDAuNi4wLCByZWNvbW1lbmRlZCEpCisjCisjIEV2ZW4gbW9yZSBzcGVjaWZpYyBydWxlcyBtYXkgYmUgcmVxdWlyZWQgYnkgc3Vic3lzdGVtcyBzbyBhbHdheXMKKyMgY2hlY2sgc3Vic3lzdGVtJ3MgdXBzdHJlYW0gcmVwb3NpdG9yeSBmb3IgcmVjZW50IHNldCBvZiBydWxlcy4KKyMgQWxzbywga2VlcCBpbiBtaW5kIHRoYXQgcmVjZW50IHJ1bGVzIG1heSBhbHNvIHJlcXVpcmUgcmVjZW50CisjIHN1YnN5c3RlbS1zcGVjaWZpYyBiaW5hcmllcy4KKworS0VSTkVMPT0iZGV2aWNlLW1hcHBlciIsIE5BTUU9IihETV9ESVIpL2NvbnRyb2wiCisKK1NVQlNZU1RFTSE9ImJsb2NrIiwgR09UTz0iZG1fZW5kIgorS0VSTkVMIT0iZG0tWzAtOV0qIiwgR09UTz0iZG1fZW5kIgorKERNX0VYRUNfUlVMRSkKKworIyBEZXZpY2UgY3JlYXRlZCwgbWFqb3IgYW5kIG1pbm9yIG51bWJlciBhc3NpZ25lZCAtICJhZGQiIGV2ZW50IGdlbmVyYXRlZC4KKyMgVGFibGUgbG9hZGVkIC0gbm8gZXZlbnQgZ2VuZXJhdGVkLgorIyBEZXZpY2UgcmVzdW1lZCAob3IgcmVuYW1lZCkgLSAiY2hhbmdlIiBldmVudCBnZW5lcmF0ZWQuCisjIERldmljZSByZW1vdmVkIC0gInJlbW92ZSIgZXZlbnQgZ2VuZXJhdGVkLgorIworIyBUaGUgZG0tWCBub2RlcyBhcmUgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gb24gImFkZCIgZXZlbnQsIHdlIGNhbid0IHN1cHByZXNzCisjIHRoYXQgKHRoZSBub2RlIGlzIGNyZWF0ZWQgZXZlbiBlYXJsaWVyIHdpdGggZGV2dG1wZnMpLiBBbGwgdGhlIHN5bWxpbmtzCisjIChlLmcuIC9kZXYvbWFwcGVyKSBhcmUgY3JlYXRlZCBpbiByaWdodCB0aW1lIGFmdGVyIGEgZGV2aWNlIGhhcyBpdHMgdGFibGUKKyMgbG9hZGVkIGFuZCBpcyBwcm9wZXJseSByZXN1bWVkLiBGb3IgdGhpcyByZWFzb24sIGRpcmVjdCB1c2Ugb2YgZG0tWCBub2RlcworIyBpcyBub3QgcmVjb21tZW5kZWQuCitBQ1RJT04hPSJhZGR8Y2hhbmdlIiwgR09UTz0iZG1fZW5kIgorCisjIERlY29kZSB1ZGV2IGNvbnRyb2wgZmxhZ3MgYW5kIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXBwcm9wcmlhdGVseS4KKyMgVGhlc2UgZmxhZ3MgYXJlIGVuY29kZWQgaW4gRE1fQ09PS0lFIHZhcmlhYmxlIHRoYXQgd2FzIGludHJvZHVjZWQgaW4KKyMga2VybmVsIHZlcnNpb24gMi42LjMxLiBUaGVyZWZvcmUsIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIHdpdGgKKyMga2VybmVscyA+PSAyLjYuMzEgb25seS4gQ29va2llIGlzIG5vdCBkZWNvZGVkIGZvciByZW1vdmUgZXZlbnQuCitFTlZ7RE1fQ09PS0lFfT09Ij8qIiwgSU1QT1JUe3Byb2dyYW19PSIoRE1fRVhFQykvZG1zZXR1cCB1ZGV2ZmxhZ3MgJGVudntETV9DT09LSUV9IgorCisjIFJ1bGUgb3V0IGVhc3ktdG8tZGV0ZWN0IGluYXBwcm9wcmlhdGUgZXZlbnRzIGZpcnN0LgorRU5We0RJU0tfUk99PT0iMSIsIEdPVE89ImRtX2Rpc2FibGUiCisKKyMgVGhlcmUgaXMgbm8gY29va2llIHNldCBub3IgYW55IGZsYWdzIGVuY29kZWQgaW4gZXZlbnRzIG5vdCBvcmlnaW5hdGluZworIyBpbiBsaWJkZXZtYXBwZXIgc28gd2UgbmVlZCB0byBkZXRlY3QgdGhpcyBhbmQgdHJ5IHRvIGJlaGF2ZSBjb3JyZWN0bHkuCisjIEZvciBzdWNoIHNwdXJpb3VzIGV2ZW50cywgcmVnZW5lcmF0ZSBhbGwgZmxhZ3MgZnJvbSBjdXJyZW50IHVkZXYgZGF0YWJhc2UgY29udGVudAorIyAodGhpcyBpbmZvcm1hdGlvbiB3b3VsZCBub3JtYWxseSBiZSBpbmFjY2Vzc2libGUgZm9yIHNwdXJpb3VzIEFERCBhbmQgQ0hBTkdFIGV2ZW50cykuCitFTlZ7RE1fVURFVl9QUklNQVJZX1NPVVJDRV9GTEFHfT09IjEiLCBFTlZ7RE1fQUNUSVZBVElPTn09IjEiLCBHT1RPPSJkbV9mbGFnc19kb25lIgorSU1QT1JUe2RifT0iRE1fVURFVl9ESVNBQkxFX0RNX1JVTEVTX0ZMQUciCitJTVBPUlR7ZGJ9PSJETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUciCitJTVBPUlR7ZGJ9PSJETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHIgorSU1QT1JUe2RifT0iRE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUciCitJTVBPUlR7ZGJ9PSJETV9VREVWX0xPV19QUklPUklUWV9GTEFHIgorSU1QT1JUe2RifT0iRE1fVURFVl9ESVNBQkxFX0xJQlJBUllfRkFMTEJBQ0tfRkxBRyIKK0lNUE9SVHtkYn09IkRNX1VERVZfUFJJTUFSWV9TT1VSQ0VfRkxBRyIKK0lNUE9SVHtkYn09IkRNX1VERVZfRkxBRzciCitJTVBPUlR7ZGJ9PSJETV9VREVWX1JVTEVTX1ZTTiIKK0xBQkVMPSJkbV9mbGFnc19kb25lIgorCisjIE5vcm1hbGx5LCB3ZSBvcGVyYXRlIG9uICJjaGFuZ2UiIGV2ZW50cy4gQnV0IHdoZW4gY29sZHBsdWdnaW5nLCB0aGVyZSdzIGFuCisjICJhZGQiIGV2ZW50IHByZXNlbnQuIFdlIGhhdmUgdG8gcmVjb2duaXplIHRoaXMgYW5kIGRvIG91ciBhY3Rpb25zIGluIHRoaXMKKyMgcGFydGljdWxhciBzaXR1YXRpb24sIHRvby4gQWxzbywgd2UgZG9uJ3Qgd2FudCB0aGUgbm9kZXMgdG8gYmUgY3JlYXRlZAorIyBwcmVtYXR1cmVseSBvbiAiYWRkIiBldmVudHMgd2hpbGUgbm90IGNvbGRwbHVnZ2luZy4gV2UgY2hlY2sKKyMgRE1fVURFVl9QUklNQVJZX1NPVVJDRV9GTEFHIHRvIHNlZSBpZiB0aGUgZGV2aWNlIHdhcyBhY3RpdmF0ZWQgY29ycmVjdGx5CisjIGJlZm9yZSBhbmQgaWYgbm90LCB3ZSBpZ25vcmUgdGhlICJhZGQiIGV2ZW50IHRvdGFsbHkuIFRoaXMgd2F5IHdlIGNhbiBzdXBwb3J0CisjIHVkZXYgdHJpZ2dlcnMgZ2VuZXJhdGluZyAiYWRkIiBldmVudHMgKGUuZy4gInVkZXZhZG0gdHJpZ2dlciAtLWFjdGlvbj1hZGQiIG9yCisjICJlY2hvIGFkZCA+IC9zeXMvYmxvY2svPGRtX2RldmljZT4vdWV2ZW50IikuIFRoZSB0cmlnZ2VyIHdpdGggImFkZCIgZXZlbnQgaXMKKyMgYWxzbyB1c2VkIGF0IGJvb3QgdG8gcmVldmFsdWF0ZSB1ZGV2IHJ1bGVzIGZvciBhbGwgZXhpc3RpbmcgZGV2aWNlcyBhY3RpdmF0ZWQKKyMgYmVmb3JlIChlLmcuIGluIGluaXRyZCkuIElmIHVkZXYgaXMgdXNlZCBpbiBpbml0cmQsIHdlIHJlcXVpcmUgdGhlIHVkZXYgaW5pdAorIyBzY3JpcHQgdG8gbm90IHJlbW92ZSB0aGUgZXhpc3RpbmcgdWRldiBkYXRhYmFzZSBzbyB3ZSBjYW4gcmV1c2UgdGhlIGluZm9ybWF0aW9uCisjIHN0b3JlZCBhdCB0aGUgdGltZSBvZiBkZXZpY2UgYWN0aXZhdGlvbiBpbiB0aGUgaW5pdHJkLgorQUNUSU9OIT0iYWRkIiwgR09UTz0iZG1fbm9fY29sZHBsdWciCitFTlZ7RE1fVURFVl9SVUxFU19WU059IT0iMSIsIEVOVntETV9VREVWX1BSSU1BUllfU09VUkNFX0ZMQUd9IT0iMSIsIEdPVE89ImRtX2Rpc2FibGUiCitFTlZ7RE1fQUNUSVZBVElPTn09IjEiCitMQUJFTD0iZG1fbm9fY29sZHBsdWciCisKKyMgUHV0dGluZyBpdCB0b2dldGhlciwgZm9sbG93aW5nIHRhYmxlIGlzIHVzZWQgdG8gcmVjb2duaXplIGdlbnVpbmUgYW5kIHNwdXJpb3VzIGV2ZW50cy4KKyMgTi5CLiBTcHVyaW91cyBldmVudHMgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbiB1c2Ugb2YgdGhlIFdBVENIIHVkZXYKKyMgcnVsZSBvciBieSB0cmlnZ2VyaW5nIGFuIGV2ZW50IG1hbnVhbGx5IGJ5ICJ1ZGV2YWRtIHRyaWdnZXIiIGNhbGwKKyMgb3IgYnkgImVjaG8gPGV2ZW50X25hbWU+ID4gL3N5cy9ibG9jay9kbS1YL3VldmVudCIuCisjCisjICAgICAgICBFVkVOVCAgICAgICAgICAgICAgRE1fVURFVl9QUklNQVJZX1NPVVJDRV9GTEFHICAgRE1fQUNUSVZBVElPTgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIGFkZCBldmVudCAoZ2VudWluZSkgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgMAorIyBjaGFuZ2UgZXZlbnQgKGdlbnVpbmUpICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyMgYWRkIGV2ZW50IChzcHVyaW91cykKKyMgICB8XyBkZXYgc3RpbGwgbm90IGFjdGl2ZSAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgXF8gZGV2IGFscmVhZHkgYWN0aXZlICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgMQorIyBjaGFuZ2UgZXZlbnQgKHNwdXJpb3VzKQorIyAgIHxfIGRldiBzdGlsbCBub3QgYWN0aXZlICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICBcXyBkZXYgYWxyZWFkeSBhY3RpdmUgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAwCisKKyMgImRtIiBzeXNmcyBzdWJkaXJlY3RvcnkgaXMgYXZhaWxhYmxlIGluIG5ld2VyIHZlcnNpb25zIG9mIERNCisjIG9ubHkgKGtlcm5lbHMgPj0gMi42LjI5KS4gV2UgaGF2ZSB0byBjaGVjayBmb3IgaXRzIGV4aXN0ZW5jZQorIyBhbmQgdXNlIGRtc2V0dXAgdG9vbCBpbnN0ZWFkIHRvIGdldCB0aGUgRE0gbmFtZSwgdXVpZCBhbmQgCisjIHN1c3BlbmRlZCBzdGF0ZSBpZiB0aGUgImRtIiBzdWJkaXJlY3RvcnkgaXMgbm90IHByZXNlbnQuCisjIFRoZSAic3VzcGVuZGVkIiBpdGVtIHdhcyBhZGRlZCBldmVuIGxhdGVyIChrZXJuZWxzID49IDIuNi4zMSksCisjIHNvIHdlIGFsc28gaGF2ZSB0byBjYWxsIGRtc2V0dXAgaWYgdGhlIGtlcm5lbCB2ZXJzaW9uIHVzZWQKKyMgaXMgaW4gYmV0d2VlbiB0aGVzZSByZWxlYXNlcy4KK1RFU1Q9PSJkbSIsIEVOVntETV9OQU1FfT0iJGF0dHJ7ZG0vbmFtZX0iLCBFTlZ7RE1fVVVJRH09IiRhdHRye2RtL3V1aWR9IiwgRU5We0RNX1NVU1BFTkRFRH09IiRhdHRye2RtL3N1c3BlbmRlZH0iCitURVNUIT0iZG0iLCBJTVBPUlR7cHJvZ3JhbX09IihETV9FWEVDKS9kbXNldHVwIGluZm8gLWogJU0gLW0gJW0gLWMgLS1uYW1lcHJlZml4ZXMgLS1ub2hlYWRpbmdzIC0tcm93cyAtbyBuYW1lLHV1aWQsc3VzcGVuZGVkIgorRU5We0RNX1NVU1BFTkRFRH0hPSI/KiIsIElNUE9SVHtwcm9ncmFtfT0iKERNX0VYRUMpL2Rtc2V0dXAgaW5mbyAtaiAlTSAtbSAlbSAtYyAtLW5hbWVwcmVmaXhlcyAtLW5vaGVhZGluZ3MgLS1yb3dzIC1vIHN1c3BlbmRlZCIKKworIyBkbXNldHVwIHRvb2wgcHJvdmlkZXMgc3VzcGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGluIHRleHR1YWwKKyMgZm9ybSB3aXRoIHZhbHVlcyAiU3VzcGVuZGVkIi8iQWN0aXZlIi4gV2UgdHJhbnNsYXRlIGl0IHRvCisjIDAvMSByZXNwZWN0aXZlbHkgdG8gYmUgY29uc2lzdGVudCB3aXRoIHN5c2ZzIHZhbHVlcy4KK0VOVntETV9TVVNQRU5ERUR9PT0iQWN0aXZlIiwgRU5We0RNX1NVU1BFTkRFRH09IjAiCitFTlZ7RE1fU1VTUEVOREVEfT09IlN1c3BlbmRlZCIsIEVOVntETV9TVVNQRU5ERUR9PSIxIgorCisjIFRoaXMgdmFyaWFibGUgcHJvdmlkZXMgYSByZWxpYWJsZSB3YXkgdG8gY2hlY2sgdGhhdCBkZXZpY2UtbWFwcGVyCisjIHJ1bGVzIHdlcmUgaW5zdGFsbGVkLiBJdCBtZWFucyB0aGF0IGFsbCBuZWVkZWQgdmFyaWFibGVzIGFyZSBzZXQKKyMgYnkgdGhlc2UgcnVsZXMgZGlyZWN0bHkgc28gdGhlcmUncyBubyBuZWVkIHRvIGFjcXVpcmUgdGhlbSBhZ2FpbgorIyBsYXRlci4gT3RoZXIgcnVsZXMgY2FuIGFsdGVybmF0ZSB0aGUgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiB0aGlzCisjIGZhY3QgKGUuZy4gZmFsbGJhY2sgdG8gcnVsZXMgdGhhdCBiZWhhdmUgY29ycmVjdGx5IGV2ZW4gd2l0aG91dAorIyB0aGVzZSBydWxlcyBpbnN0YWxsZWQpLiBJdCBhbHNvIHByb3ZpZGVzIHZlcnNpb25pbmcgZm9yIGFueQorIyBwb3NzaWJsZSBmdXR1cmUgY2hhbmdlcy4KKyMgVlNOIDEgLSBvcmlnaW5hbCBydWxlcworIyBWU04gMiAtIGFkZCBzdXBwb3J0IGZvciBzeW50aGVzaXplZCBldmVudHMKK0VOVntETV9VREVWX1JVTEVTX1ZTTn09IjIiCisKK0VOVntETV9VREVWX0RJU0FCTEVfRE1fUlVMRVNfRkxBR30hPSIxIiwgRU5We0RNX05BTUV9PT0iPyoiLCBTWU1MSU5LKz0iKERNX0RJUikvJGVudntETV9OQU1FfSIKKworIyBBdm9pZCBwcm9jZXNzaW5nIGFuZCBzY2FubmluZyBhIERNIGRldmljZSBpbiB0aGUgb3RoZXIgKGZvcmVpZ24pCisjIHJ1bGVzIGlmIGl0IGlzIGluIHN1c3BlbmRlZCBzdGF0ZS4gSG93ZXZlciwgd2Ugc3RpbGwga2VlcCAnZGlzaycKKyMgYW5kICdETSBzdWJzeXN0ZW0nIHJlbGF0ZWQgcnVsZXMgZW5hYmxlZCBpbiB0aGlzIGNhc2UuCitFTlZ7RE1fU1VTUEVOREVEfT09IjEiLCBFTlZ7RE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUd9PSIxIgorCitHT1RPPSJkbV9lbmQiCisKK0xBQkVMPSJkbV9kaXNhYmxlIgorRU5We0RNX1VERVZfRElTQUJMRV9TVUJTWVNURU1fUlVMRVNfRkxBR309IjEiCitFTlZ7RE1fVURFVl9ESVNBQkxFX0RJU0tfUlVMRVNfRkxBR309IjEiCitFTlZ7RE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUd9PSIxIgorT1BUSU9OUzo9Im5vd2F0Y2giCisKK0xBQkVMPSJkbV9lbmQiCmRpZmYgLS1naXQgYS91ZGV2LzExLWRtLWx2bS5ydWxlcy5pbiBiL3VkZXYvMTEtZG0tbHZtLnJ1bGVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2I5OTEKLS0tIC9kZXYvbnVsbAorKysgYi91ZGV2LzExLWRtLWx2bS5ydWxlcy5pbgpAQCAtMCwwICsxLDU0IEBACisjIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisKKyMgVWRldiBydWxlcyBmb3IgTFZNLgorIworIyBUaGVzZSBydWxlcyBjcmVhdGUgc3ltbGlua3MgZm9yIExWTSBsb2dpY2FsIHZvbHVtZXMgaW4KKyMgL2Rldi9WRyBkaXJlY3RvcnkgKFZHIGlzIGFuIGFjdHVhbCBWRyBuYW1lKS4gU29tZSB1ZGV2CisjIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0ICh0aGV5IGNhbiBiZSB1c2VkIGluIGxhdGVyCisjIHJ1bGVzIGFzIHdlbGwpOgorIyAgIERNX0xWX05BTUUgLSBsb2dpY2FsIHZvbHVtZSBuYW1lCisjICAgRE1fVkdfTkFNRSAtIHZvbHVtZSBncm91cCBuYW1lCisjICAgRE1fTFZfTEFZRVIgLSBsb2dpY2FsIHZvbHVtZSBsYXllciAoYmxhbmsgaWYgbm90IHNldCkKKworIyAiYWRkIiBldmVudCBpcyBwcm9jZXNzZWQgb24gY29sZHBsdWcgb25seSEKK0FDVElPTiE9ImFkZHxjaGFuZ2UiLCBHT1RPPSJsdm1fZW5kIgorRU5We0RNX1VERVZfUlVMRVNfVlNOfSE9Ij8qIiwgR09UTz0ibHZtX2VuZCIKK0VOVntETV9VVUlEfSE9IkxWTS0/KiIsIEdPVE89Imx2bV9lbmQiCisKKyMgVXNlIERNIG5hbWUgYW5kIHNwbGl0IGl0IHVwIGludG8gaXRzIFZHL0xWL2xheWVyIGNvbnN0aXR1ZW50cy4KK0lNUE9SVHtwcm9ncmFtfT0iKERNX0VYRUMpL2Rtc2V0dXAgc3BsaXRuYW1lIC0tbmFtZXByZWZpeGVzIC0tbm9oZWFkaW5ncyAtLXJvd3MgJGVudntETV9OQU1FfSIKKworIyBETV9TVUJTWVNURU1fVURFVl9GTEFHMCBpcyB0aGUgJ05PU0NBTicgZmxhZyBmb3IgTFZNIHN1YnN5c3RlbS4KKyMgVGhpcyBmbGFnIGlzIHVzZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSBzZWxlY3RlZCBydWxlcyB0byBwcmV2ZW50IGFueQorIyBwcm9jZXNzaW5nIG9yIHNjYW5uaW5nIGRvbmUgb24gdGhlIExWTSB2b2x1bWUgYmVmb3JlIExWTSBoYXMgYW55IGNoYW5jZQorIyB0byB6ZXJvIGFueSBzdGFsZSBtZXRhZGF0YSBmb3VuZCB3aXRoaW4gdGhlIExWIGRhdGEgYXJlYS4gU3VjaCBzdGFsZQorIyBtZXRhZGF0YSBjb3VsZCBjYXVzZSBmYWxzZSBjbGFpbSBvZiB0aGUgTFYgZGV2aWNlLCBrZWVwaW5nIGl0IG9wZW4gZXRjLgorIworIyBJZiB0aGUgTk9TQ0FOIGZsYWcgaXMgcHJlc2VudCwgYmFja3VwIHNlbGVjdGVkIGV4aXN0aW5nIGZsYWdzIHVzZWQgdG8KKyMgZGlzYWJsZSBydWxlcywgdGhlbiBzZXQgdGhlbSBmaXJtbHkgc28gdGhvc2Ugc2VsZWN0ZWQgcnVsZXMgYXJlIHN1cmVseSBza2lwcGVkLgorIyBSZXN0b3JlIHRoZXNlIGZsYWdzIG9uY2UgdGhlIE5PU0NBTiBmbGFnIGlzIGRyb3BwZWQgKHdoaWNoIGlzIG5vcm1hbGx5IGFueQorIyB1ZXZlbnQgdGhhdCBmb2xsb3dzIGZvciB0aGlzIExWLCBldmVuIGFuIGFydGlmaWNpYWxseSBnZW5lcmF0ZWQgb25lKS4KK0VOVntETV9TVUJTWVNURU1fVURFVl9GTEFHMH09PSIxIiwgRU5We0RNX05PU0NBTn09IjEiLCBFTlZ7RE1fRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHX09MRH09IiRlbnZ7RE1fVURFVl9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUd9IiwgRU5We0RNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHfT0iMSIKK0VOVntETV9TVUJTWVNURU1fVURFVl9GTEFHMH0hPSIxIiwgSU1QT1JUe2RifT0iRE1fTk9TQ0FOIiwgSU1QT1JUe2RifT0iRE1fRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHX09MRCIKK0VOVntETV9TVUJTWVNURU1fVURFVl9GTEFHMH0hPSIxIiwgRU5We0RNX05PU0NBTn09PSIxIiwgRU5We0RNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHfT0iJGVudntETV9ESVNBQkxFX09USEVSX1JVTEVTX0ZMQUdfT0xEfSIsIFwKKwkJCQkgICBFTlZ7RE1fRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHX09MRH09IiIsIEVOVntETV9OT1NDQU59PSIiCisKK0VOVntETV9VREVWX0RJU0FCTEVfU1VCU1lTVEVNX1JVTEVTX0ZMQUd9PT0iMSIsIEdPVE89Imx2bV9lbmQiCisKK09QVElPTlMrPSJldmVudF90aW1lb3V0PTE4MCIKKworIyBEbyBub3QgY3JlYXRlIHN5bWxpbmtzIGZvciBpbmFwcHJvcHJpYXRlIHN1YmRldmljZXMuCitFTlZ7RE1fTFZfTkFNRX09PSJwdm1vdmU/Knw/Kl92b3JpZ2luIiwgR09UTz0ibHZtX2Rpc2FibGUiCitFTlZ7RE1fTFZfTEFZRVJ9PT0iPyoiLCBHT1RPPSJsdm1fZGlzYWJsZSIKKworIyBDcmVhdGUgc3ltbGlua3MgZm9yIHRvcC1sZXZlbCBkZXZpY2VzIG9ubHkuCitFTlZ7RE1fVkdfTkFNRX09PSI/KiIsIEVOVntETV9MVl9OQU1FfT09Ij8qIiwgU1lNTElOSys9IiRlbnZ7RE1fVkdfTkFNRX0vJGVudntETV9MVl9OQU1FfSIsIEdPVE89Imx2bV9lbmQiCisKK0xBQkVMPSJsdm1fZGlzYWJsZSIKK0VOVntETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHfT0iMSIKK0VOVntETV9VREVWX0RJU0FCTEVfT1RIRVJfUlVMRVNfRkxBR309IjEiCitPUFRJT05TOj0ibm93YXRjaCIKKworTEFCRUw9Imx2bV9lbmQiCmRpZmYgLS1naXQgYS91ZGV2LzEyLWRtLXBlcm1pc3Npb25zLnJ1bGVzIGIvdWRldi8xMi1kbS1wZXJtaXNzaW9ucy5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQ0YzMyCi0tLSAvZGV2L251bGwKKysrIGIvdWRldi8xMi1kbS1wZXJtaXNzaW9ucy5ydWxlcwpAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisKKyMgVWRldiBydWxlcyBmb3IgZGV2aWNlLW1hcHBlciBkZXZpY2VzLgorIworIyBUaGVzZSBydWxlcyBzZXQgcGVybWlzc2lvbnMgZm9yIERNIGRldmljZXMuCisjCisjIFRoaXMgZmlsZSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgdGVtcGxhdGUgd2hlcmUgdXNlcnMgY2FuIHB1dCB0aGVpcgorIyBvd24gZW50cmllcyBhbmQgdGhlbiBwdXQgYSBjb3B5IG9mIGl0IG1hbnVhbGx5IHRvIGEgdXN1YWwgcGxhY2Ugd2l0aAorIyB1c2VyLWVkaXRlZCB1ZGV2IHJ1bGVzICh1c3VhbGx5IC9ldGMvdWRldi9ydWxlcy5kKS4KKyMKKyMgVGhlcmUgYXJlIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB0aGF0IGNhbiBiZSB1c2VkOgorIyAgIERNX1VERVZfUlVMRVNfVlNOIC0gRE0gdWRldiBydWxlcyB2ZXJzaW9uCisjICAgRE1fTkFNRSAtIGFjdHVhbCBETSBkZXZpY2UncyBuYW1lCisjICAgRE1fVVVJRCAtIFVVSUQgc2V0IGZvciBETSBkZXZpY2UgKGJsYW5rIGlmIG5vdCBzcGVjaWZpZWQpCisjICAgRE1fU1VTUEVOREVEIC0gc3VzcGVuZGVkIHN0YXRlIG9mIERNIGRldmljZSAoMCBvciAxKQorIyAgIERNX0xWX05BTUUgLSBsb2dpY2FsIHZvbHVtZSBuYW1lIChub3Qgc2V0IGlmIExWTSBkZXZpY2Ugbm90IHByZXNlbnQpCisjICAgRE1fVkdfTkFNRSAtIHZvbHVtZSBncm91cCBuYW1lIChub3Qgc2V0IGlmIExWTSBkZXZpY2Ugbm90IHByZXNlbnQpCisjICAgRE1fTFZfTEFZRVIgLSBsb2dpY2FsIHZvbHVtZSBsYXllciAobm90IHNldCBpZiBMVk0gZGV2aWNlIG5vdCBwcmVzZW50KQorCisjICJhZGQiIGV2ZW50IGlzIHByb2Nlc3NlZCBvbiBjb2xkcGx1ZyBvbmx5IQorQUNUSU9OIT0iYWRkfGNoYW5nZSIsIEdPVE89ImRtX2VuZCIKK0VOVntETV9VREVWX1JVTEVTX1ZTTn0hPSI/KiIsIEdPVE89ImRtX2VuZCIKKworIyBBIGZldyBkZW1vbnN0cmF0aW9uYWwgZXhhbXBsZXMuLi4KKworCisjIFBMQUlOIERNIERFVklDRVMKKyMKKyMgU2V0IHBlcm1pc3Npb25zIGZvciBhIERNIGRldmljZSBuYW1lZCAnbXlfZGV2aWNlJyBleGFjdGx5CisjIEVOVntETV9OQU1FfT09Im15X2RldmljZSIsIE9XTkVSOj0icm9vdCIsIEdST1VQOj0icm9vdCIsIE1PREU6PSI2NjAiCisKKyMgU2V0IHBlcm1pc3Npb25zIGZvciBhbGwgRE0gZGV2aWNlcyBoYXZpbmcgJ01ZX1VVSUQtJyBVVUlEIHByZWZpeAorIyBFTlZ7RE1fVVVJRH09PSJNWV9VVUlELT8qIiwgT1dORVI6PSJyb290IiwgR1JPVVA6PSJyb290IiwgTU9ERTo9IjY2MCIKKworCisjIExWTSBERVZJQ0VTCisjCisjIFNldCBwZXJtaXNzaW9ucyBmb3IgYWxsIExWTSBkZXZpY2VzCisjIEVOVntETV9VVUlEfT09IkxWTS0/KiIsIE9XTkVSOj0icm9vdCIsIEdST1VQOj0icm9vdCIsIE1PREU6PSI2NjAiCisKKyMgU2V0IHBlcm1pc3Npb25zIGZvciBhbGwgZGV2aWNlcyB0aGF0IGJlbG9uZyB0byBvbmUgTFZNIFZHCisjIEVOVntETV9WR19OQU1FfT09IlZvbEdyb3VwMDAiLCBPV05FUjo9InJvb3QiLCBHUk9VUDo9InJvb3QiLCBNT0RFOj0iNjYwIgorCisjIFNldCBwZXJtaXNzaW9ucyBmb3IgYW4gTFZNIGRldmljZSB3aXRoIFZHIG5hbWVkIFZvbEdyb3VwMDAgYW5kIExWIG5hbWVkIExvZ1ZvbDAwIGV4YWN0bHkKKyMgRU5We0RNX1ZHX05BTUV9PT0iVm9sR3JvdXAwMCIsIEVOVntETV9MVl9OQU1FfT09IkxvZ1ZvbDAwIiwgT1dORVI6PSJyb290IiwgR1JPVVA6PSJyb290IiwgTU9ERTo9IjY2MCIKKworIyBTZXQgcGVybWlzc2lvbnMgZm9yIGFsbCBMVk0gZGV2aWNlcyB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBhIFZHIG5hbWVkIFZvbEdyb3VwMDAKKyMgRU5We0RNX1ZHX05BTUV9IT0iVm9sR3JvdXAwMCIsIE9XTkVSOj0icm9vdCIsIEdST1VQOj0icm9vdCIsIE1PREU6PSI2NjAiCisKKworIyBFTkNSWVBURUQgREVWSUNFUyAodXNpbmcgY3J5cHRzZXR1cCA+PSAxLjEpCisjCisjIFNldCBwZXJtaXNzaW9ucyBmb3IgYWxsIGVuY3J5cHRlZCBkZXZpY2VzIGNyZWF0ZWQgYnkgY3J5cHRzZXR1cCAocGxhaW4gZGV2aWNlcykKKyMgRU5We0RNX1VVSUR9PT0iQ1JZUFQtUExBSU4tPyoiLCBPV05FUjo9InJvb3QiLCBHUk9VUDo9InJvb3QiLCBNT0RFOj0iNjYwIgorCisjIFNldCBwZXJtaXNzaW9ucyBmb3IgYWxsIGVuY3J5cHRlZCBkZXZpY2VzIGNyZWF0ZWQgYnkgY3J5cHRzZXR1cCAoTFVLUyBleHRlbnNpb24pCisjIEVOVntETV9VVUlEfT09IkNSWVBULUxVS1MxLT8qIiwgT1dORVI6PSJyb290IiwgR1JPVVA6PSJyb290IiwgTU9ERTo9IjY2MCIKKworIyBTZXQgcGVybWlzc2lvbnMgZm9yIGFuIGVuY3J5cHRlZCBkZXZpY2UgY3JlYXRlZCBieSBjcnlwdHNldHVwIGFuZCBoYXZpbmcgYW4gZXhhY3QgbHVrcyBVVUlECisjIEVOVntETV9VVUlEfT09IkNSWVBULUxVS1MxLTIyZmNlNWM4MzEzYzQzYzY4ZDg0YjUwYTNiMGZlZTc4LT8qIiwgT1dORVI6PSJyb290IiwgR1JPVVA6PSJyb290IiwgTU9ERTo9IjY2MCIKKworCisjIE1VTFRJUEFUSCBERVZJQ0VTCisjCisjIFNldCBwZXJtaXNzaW9ucyBmb3IgYWxsIG11bHRpcGF0aCBkZXZpY2VzCisjIEVOVntETV9VVUlEfT09Im1wYXRoLT8qIiwgT1dORVI6PSJyb290IiwgR1JPVVA6PSJyb290IiwgTU9ERTo9IjY2MCIKKworIyBTZXQgcGVybWlzc2lvbnMgZm9yIGZpcnN0IHR3byBwYXJ0aXRpb25zIGNyZWF0ZWQgb24gYSBtdWx0aXBhdGggZGV2aWNlIChhbmQgZGV0ZWN0ZWQgYnkga3BhcnR4KQorIyBFTlZ7RE1fVVVJRH09PSJwYXJ0WzEtMl0tbXBhdGgtPyoiLCBPV05FUjo9InJvb3QiLCBHUk9VUDo9InJvb3QiLCBNT0RFOj0iNjYwIgorCisKKyMgLi4ueW91IGNhbiB1c2UgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBjb21wYXJpc29ucyB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyMgbGlzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICh1ZGV2IHByb3ZpZGVzIHNpbXBsZSBwYXR0ZXJuIG1hdGNoaW5nIGJ5CisjIHVzaW5nICosID8gYW5kIFtdIHRoYXQgeW91IGNhbiB1c2UsIHNlZSAnbWFuIHVkZXYnIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKworIyBTZXQgZGVmYXVsdCBwZXJtaXNzaW9ucyBmb3IgYWxsIERNIGRldmljZXMgaWYgbm90IHNldCBiZWZvcmUuCisjIE9XTkVSOj0icm9vdCIsIEdST1VQOj0icm9vdCIsIE1PREU6PSI2NjAiCisKK0xBQkVMPSJkbV9lbmQiCmRpZmYgLS1naXQgYS91ZGV2LzEzLWRtLWRpc2sucnVsZXMuaW4gYi91ZGV2LzEzLWRtLWRpc2sucnVsZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2NGRkNgotLS0gL2Rldi9udWxsCisrKyBiL3VkZXYvMTMtZG0tZGlzay5ydWxlcy5pbgpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisKKyMgVWRldiBydWxlcyBmb3IgZGV2aWNlLW1hcHBlciBkZXZpY2VzLgorIworIyBUaGVzZSBydWxlcyBjcmVhdGUgc3ltbGlua3MgaW4gL2Rldi9kaXNrIGRpcmVjdG9yeS4KKyMgU3ltbGlua3MgdGhhdCBkZXBlbmQgb24gcHJvYmluZyBmaWxlc3lzdGVtIHR5cGUsCisjIGxhYmVsIGFuZCB1dWlkIGFyZSBjcmVhdGVkIG9ubHkgaWYgdGhlIGRldmljZSBpcyBub3QKKyMgc3VzcGVuZGVkLgorCisjICJhZGQiIGV2ZW50IGlzIHByb2Nlc3NlZCBvbiBjb2xkcGx1ZyBvbmx5IQorQUNUSU9OIT0iYWRkfGNoYW5nZSIsIEdPVE89ImRtX2VuZCIKK0VOVntETV9VREVWX1JVTEVTX1ZTTn0hPSI/KiIsIEdPVE89ImRtX2VuZCIKK0VOVntETV9VREVWX0RJU0FCTEVfRElTS19SVUxFU19GTEFHfT09IjEiLCBHT1RPPSJkbV9lbmQiCisKK1NZTUxJTksrPSJkaXNrL2J5LWlkL2RtLW5hbWUtJGVudntETV9OQU1FfSIKK0VOVntETV9VVUlEfT09Ij8qIiwgU1lNTElOSys9ImRpc2svYnktaWQvZG0tdXVpZC0kZW52e0RNX1VVSUR9IgorCitFTlZ7RE1fU1VTUEVOREVEfT09IjEiLCBHT1RPPSJkbV9lbmQiCitFTlZ7RE1fTk9TQ0FOfT09IjEiLCBHT1RPPSJkbV93YXRjaCIKKworKEJMS0lEX1JVTEUpCitFTlZ7RE1fVURFVl9MT1dfUFJJT1JJVFlfRkxBR309PSIxIiwgT1BUSU9OUz0ibGlua19wcmlvcml0eT0tMTAwIgorRU5We0lEX0ZTX1VTQUdFfT09ImZpbGVzeXN0ZW18b3RoZXJ8Y3J5cHRvIiwgRU5We0lEX0ZTX1VVSURfRU5DfT09Ij8qIiwgU1lNTElOSys9ImRpc2svYnktdXVpZC8kZW52e0lEX0ZTX1VVSURfRU5DfSIKK0VOVntJRF9GU19VU0FHRX09PSJmaWxlc3lzdGVtfG90aGVyIiwgRU5We0lEX0ZTX0xBQkVMX0VOQ309PSI/KiIsIFNZTUxJTksrPSJkaXNrL2J5LWxhYmVsLyRlbnZ7SURfRlNfTEFCRUxfRU5DfSIKKworIyBBZGQgaW5vdGlmeSB3YXRjaCB0byB0cmFjayBjaGFuZ2VzIG9uIHRoaXMgZGV2aWNlLgorIyBVc2luZyB0aGUgd2F0Y2ggcnVsZSBpcyBub3Qgb3B0aW1hbCAtIGl0IGdlbmVyYXRlcyBhIGxvdCBvZiBzcHVyaW91cworIyBhbmQgdXNlbGVzcyBldmVudHMgd2hlbmV2ZXIgdGhlIGRldmljZSBvcGVuZWQgZm9yIHJlYWQtd3JpdGUgaXMgY2xvc2VkLgorIyBUaGUgYmVzdCB3b3VsZCBiZSB0byBnZW5lcmV0ZSB0aGUgZXZlbnQgZGlyZWN0bHkgaW4gdGhlIHRvb2wgY2hhbmdpbmcKKyMgcmVsZXZhbnQgaW5mb3JtYXRpb24gc28gb25seSByZWxldmFudCBldmVudHMgd2lsbCBiZSBwcm9jZXNzZWQKKyMgKGxpa2UgY3JlYXRpbmcgYSBmaWxlc3lzdGVtLCBjaGFuZ2luZyBmaWxlc3lzdGVtIGxhYmVsIGV0Yy4pLgorIworIyBCdXQgbGV0J3MgdXNlIHRoaXMgdW50aWwgd2UgaGF2ZSBzb21ldGhpbmcgYmV0dGVyLi4uCitMQUJFTD0iZG1fd2F0Y2giCitPUFRJT05TKz0id2F0Y2giCisKK0xBQkVMPSJkbV9lbmQiCmRpZmYgLS1naXQgYS91ZGV2LzY5LWRtLWx2bS1tZXRhZC5ydWxlcy5pbiBiL3VkZXYvNjktZG0tbHZtLW1ldGFkLnJ1bGVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzVmYzgKLS0tIC9kZXYvbnVsbAorKysgYi91ZGV2LzY5LWRtLWx2bS1tZXRhZC5ydWxlcy5pbgpAQCAtMCwwICsxLDkzIEBACisjIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisKKyMgVWRldiBydWxlcyBmb3IgTFZNLgorIworIyBTY2FuIGFsbCBibG9jayBkZXZpY2VzIGhhdmluZyBhIFBWIGxhYmVsIGZvciBMVk0gbWV0YWRhdGEuCisjIFN0b3JlIHRoaXMgaW5mb3JtYXRpb24gaW4gTFZNZXRhRCAodGhlIExWTSBtZXRhZGF0YSBkYWVtb24pIGFuZCBtYWludGFpbiBMVk0KKyMgbWV0YWRhdGEgc3RhdGUgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIGJ5IGF2b2lkaW5nIGZ1cnRoZXIgc2NhbnMgd2hpbGUKKyMgcnVubmluZyBzdWJzZXF1ZW50IExWTSBjb21tYW5kcyBvciB3aGlsZSB1c2luZyBsdm0yYXBwIGxpYnJhcnkuCisjIEFsc28sIG5vdGlmeSBMVk1ldGFEIGFib3V0IGFueSByZWxldmFudCBibG9jayBkZXZpY2UgcmVtb3ZhbC4KKyMKKyMgVGhpcyBydWxlIGlzIGVzc2VudGlhbCBmb3IgaGF2aW5nIHRoZSBpbmZvcm1hdGlvbiBpbiBMVk1ldGFEIHVwLXRvLWRhdGUuCisjIEl0IGFsc28gcmVxdWlyZXMgYmxraWQgdG8gYmUgY2FsbGVkIG9uIGJsb2NrIGRldmljZXMgYmVmb3JlIHNvIG9ubHkgZGV2aWNlcworIyB1c2VkIGFzIExWTSBQVnMgYXJlIHByb2Nlc3NlZCAoSURfRlNfVFlQRT0iTFZNMl9tZW1iZXIiIG9yICJMVk0xX21lbWJlciIpLgorCitTVUJTWVNURU0hPSJibG9jayIsIEdPVE89Imx2bV9lbmQiCisoTFZNX0VYRUNfUlVMRSkKKworRU5We0RNX1VERVZfRElTQUJMRV9PVEhFUl9SVUxFU19GTEFHfT09IjEiLCBHT1RPPSJsdm1fZW5kIgorCisjIElmIHRoZSBQViBsYWJlbCBnb3QgbG9zdCwgaW5mb3JtIGx2bWV0YWQgaW1tZWRpYXRlbHkuCisjIERldGVjdCB0aGUgbG9zdCBQViBsYWJlbCBieSBjb21wYXJpbmcgcHJldmlvdXMgSURfRlNfVFlQRSB2YWx1ZSB3aXRoIGN1cnJlbnQgb25lLgorRU5Wey5JRF9GU19UWVBFX05FV309IiRlbnZ7SURfRlNfVFlQRX0iCitJTVBPUlR7ZGJ9PSJJRF9GU19UWVBFIgorRU5We0lEX0ZTX1RZUEV9PT0iTFZNMl9tZW1iZXJ8TFZNMV9tZW1iZXIiLCBFTlZ7LklEX0ZTX1RZUEVfTkVXfSE9IkxWTTJfbWVtYmVyfExWTTFfbWVtYmVyIiwgRU5We0xWTV9QVl9HT05FfT0iMSIKK0VOVntJRF9GU19UWVBFfT0iJGVudnsuSURfRlNfVFlQRV9ORVd9IgorRU5We0xWTV9QVl9HT05FfT09IjEiLCBHT1RPPSJsdm1fc2NhbiIKKworIyBPbmx5IHByb2Nlc3MgZGV2aWNlcyBhbHJlYWR5IG1hcmtlZCBhcyBhIFBWIC0gdGhpcyByZXF1aXJlcyBibGtpZCB0byBiZSBjYWxsZWQgYmVmb3JlLgorRU5We0lEX0ZTX1RZUEV9IT0iTFZNMl9tZW1iZXJ8TFZNMV9tZW1iZXIiLCBHT1RPPSJsdm1fZW5kIgorRU5We0RNX01VTFRJUEFUSF9ERVZJQ0VfUEFUSH09PSIxIiwgR09UTz0ibHZtX2VuZCIKKworIyBJbmZvcm0gbHZtZXRhZCBhYm91dCBhbnkgUFYgdGhhdCBpcyBnb25lLgorQUNUSU9OPT0icmVtb3ZlIiwgR09UTz0ibHZtX3NjYW4iCisKKyMgQ3JlYXRlIC9kZXYvZGlzay9ieS1pZC9sdm0tcHYtdXVpZC08UFZfVVVJRD4gc3ltbGluayBmb3IgZWFjaCBQVgorRU5We0lEX0ZTX1VVSURfRU5DfT09Ij8qIiwgU1lNTElOSys9ImRpc2svYnktaWQvbHZtLXB2LXV1aWQtJGVudntJRF9GU19VVUlEX0VOQ30iCisKKyMgSWYgdGhlIFBWIGlzIGEgc3BlY2lhbCBkZXZpY2UgbGlzdGVkIGJlbG93LCBzY2FuIG9ubHkgaWYgdGhlIGRldmljZSBpcworIyBwcm9wZXJseSBhY3RpdmF0ZWQuIFRoZXNlIGRldmljZXMgYXJlIG5vdCB1c2FibGUgYWZ0ZXIgYW4gQUREIGV2ZW50LAorIyBidXQgdGhleSByZXF1aXJlIGFuIGV4dHJhIHNldHVwIGFuZCB0aGV5IGFyZSByZWFkeSBhZnRlciBhIENIQU5HRSBldmVudC4KKyMgQWxzbyBzdXBwb3J0IGNvbGRwbHVnZ2luZyB3aXRoIEFERCBldmVudCBidXQgb25seSBpZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkKKyMgcHJvcGVybHkgYWN0aXZhdGVkLgorIyBUaGlzIGxvZ2ljIHNob3VsZCBiZSBldmVudHVhbGx5IG1vdmVkIHRvIHJ1bGVzIHdoZXJlIHRob3NlIHBhcnRpY3VsYXIKKyMgZGV2aWNlcyBhcmUgcHJvY2Vzc2VkIHByaW1hcmlseSAoTUQgYW5kIGxvb3ApLgorCisjIERNIGRldmljZToKK0tFUk5FTCE9ImRtLVswLTldKiIsIEdPVE89Im5leHQiCitFTlZ7RE1fVURFVl9QUklNQVJZX1NPVVJDRV9GTEFHfT09IjEiLCBFTlZ7RE1fQUNUSVZBVElPTn09PSIxIiwgR09UTz0ibHZtX3NjYW4iCitHT1RPPSJsdm1fZW5kIgorCisjIE1EIGRldmljZToKK0xBQkVMPSJuZXh0IgorS0VSTkVMIT0ibWRbMC05XSoiLCBHT1RPPSJuZXh0IgorSU1QT1JUe2RifT0iTFZNX01EX1BWX0FDVElWQVRFRCIKK0FDVElPTj09ImFkZCIsIEVOVntMVk1fTURfUFZfQUNUSVZBVEVEfT09IjEiLCBHT1RPPSJsdm1fc2NhbiIKK0FDVElPTj09ImNoYW5nZSIsIEVOVntMVk1fTURfUFZfQUNUSVZBVEVEfSE9IjEiLCBURVNUPT0ibWQvYXJyYXlfc3RhdGUiLCBFTlZ7TFZNX01EX1BWX0FDVElWQVRFRH09IjEiLCBHT1RPPSJsdm1fc2NhbiIKK0FDVElPTj09ImFkZCIsIEtFUk5FTD09Im1kWzAtOV0qcFswLTldKiIsIEdPVE89Imx2bV9zY2FuIgorRU5We0xWTV9NRF9QVl9BQ1RJVkFURUR9IT0iMSIsIEVOVntTWVNURU1EX1JFQURZfT0iMCIKK0dPVE89Imx2bV9lbmQiCisKKyMgTG9vcCBkZXZpY2U6CitMQUJFTD0ibmV4dCIKK0tFUk5FTCE9Imxvb3BbMC05XSoiLCBHT1RPPSJuZXh0IgorQUNUSU9OPT0iYWRkIiwgRU5We0xWTV9MT09QX1BWX0FDVElWQVRFRH09PSIxIiwgR09UTz0ibHZtX3NjYW4iCitBQ1RJT049PSJjaGFuZ2UiLCBFTlZ7TFZNX0xPT1BfUFZfQUNUSVZBVEVEfSE9IjEiLCBURVNUPT0ibG9vcC9iYWNraW5nX2ZpbGUiLCBFTlZ7TFZNX0xPT1BfUFZfQUNUSVZBVEVEfT0iMSIsIEdPVE89Imx2bV9zY2FuIgorRU5We0xWTV9MT09QX1BWX0FDVElWQVRFRH0hPSIxIiwgRU5We1NZU1RFTURfUkVBRFl9PSIwIgorR09UTz0ibHZtX2VuZCIKKworIyBJZiB0aGUgUFYgaXMgbm90IGEgc3BlY2lhbCBkZXZpY2UgbGlzdGVkIGFib3ZlLCBzY2FuIG9ubHkgYWZ0ZXIgZGV2aWNlIGFkZGl0aW9uIChBREQgZXZlbnQpCitMQUJFTD0ibmV4dCIKK0FDVElPTiE9ImFkZCIsIEdPVE89Imx2bV9lbmQiCisKK0xBQkVMPSJsdm1fc2NhbiIKKworIyBUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgc2l0dWF0aW9ucyBpbiB3aGljaCB3ZSByZWFjaCB0aGUgTEFCRUw9Imx2bV9zY2FuIi4KKyMgTWFya2VkIGJ5IFgsIFgqIG1lYW5zIG9ubHkgaWYgdGhlIHNwZWNpYWwgZGV2IGlzIHByb3Blcmx5IHNldCB1cC4KKyMgVGhlIGFydGlmaWNpYWwgQUREIGlzIHN1cHBvcnRlZCBmb3IgY29sZHBsdWdnaW5nLiBXZSBhdm9pZCBydW5uaW5nIHRoZSBwdnNjYW4KKyMgb24gYXJ0aWZpY2lhbCBDSEFOR0Ugc28gdGhlcmUncyBubyB1bmV4cGVjdGVkIGF1dG9hY3RpdmF0aW9uIHdoZW4gV0FUQ0ggcnVsZSBmaXJlcy4KKyMgTi5CLiBNRCBhbmQgbG9vcCBuZXZlciBhY3R1YWxseSAgcmVhY2hlcyBsdm1fc2NhbiBvbiBSRU1PVkUgYXMgdGhlIFBWIGxhYmVsIGlzIGdvbmUKKyMgd2l0aGluIGEgQ0hBTkdFIGV2ZW50ICh0aGVzZSBhcmUgY2F1Z2h0IGJ5IHRoZSAiTFZNX1BWX0dPTkUiIHJ1bGUgYXQgdGhlIGJlZ2lubmluZykuCisjCisjICAgICAgICB8IHJlYWwgQUREIHwgcmVhbCBDSEFOR0UgfCBhcnRpZmljaWFsIEFERCB8IGFydGlmaWNpYWwgQ0hBTkdFIHwgUkVNT1ZFCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBETSAgICB8ICAgICAgICAgIHwgICAgICBYICAgICAgfCAgICAgICBYKiAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICBYCisjICBNRCAgICB8ICAgICAgICAgIHwgICAgICBYICAgICAgfCAgICAgICBYKiAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwKKyMgIGxvb3AgIHwgICAgICAgICAgfCAgICAgIFggICAgICB8ICAgICAgIFgqICAgICAgIHwgICAgICAgICAgICAgICAgICAgfAorIyAgb3RoZXIgfCAgICBYICAgICB8ICAgICAgICAgICAgIHwgICAgICAgWCAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgWAorRU5We1NZU1RFTURfUkVBRFl9PSIxIgorKFBWU0NBTl9SVUxFKQorCitMQUJFTD0ibHZtX2VuZCIKZGlmZiAtLWdpdCBhL3VkZXYvOTUtZG0tbm90aWZ5LnJ1bGVzLmluIGIvdWRldi85NS1kbS1ub3RpZnkucnVsZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkNTlkMwotLS0gL2Rldi9udWxsCisrKyBiL3VkZXYvOTUtZG0tbm90aWZ5LnJ1bGVzLmluCkBAIC0wLDAgKzEsMTIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKworIyBVZGV2IHJ1bGVzIGZvciBkZXZpY2UtbWFwcGVyIGRldmljZXMuCisjCisjIFRoZXNlIHJ1bGVzIGFyZSByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBhIG5vdGlmaWNhdGlvbiB0byBhIHByb2Nlc3MKKyMgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiB1ZGV2IHJ1bGVzLiBUaGUgcHJvY2VzcyBpcyBpZGVudGlmaWVkIGJ5CisjIGEgY29va2llIHZhbHVlIHNlbnQgd2l0aGluICJjaGFuZ2UiIGFuZCAicmVtb3ZlIiBldmVudHMgKHRoZSBjb29raWUKKyMgdmFsdWUgaXMgc2V0IGJlZm9yZSBieSB0aGF0IHByb2Nlc3MgZm9yIGV2ZXJ5IGFjdGlvbiByZXF1ZXN0ZWQpLgorCitFTlZ7RE1fQ09PS0lFfT09Ij8qIiwgUlVOKz0iKERNX0VYRUMpL2Rtc2V0dXAgdWRldmNvbXBsZXRlICRlbnZ7RE1fQ09PS0lFfSIKZGlmZiAtLWdpdCBhL3VkZXYvTWFrZWZpbGUuaW4gYi91ZGV2L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTY4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi91ZGV2L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvbWFrZS50bXBsCisKK0RNX1JVTEVTPTEwLWRtLnJ1bGVzIDEzLWRtLWRpc2sucnVsZXMgOTUtZG0tbm90aWZ5LnJ1bGVzCitMVk1fUlVMRVM9MTEtZG0tbHZtLnJ1bGVzCitpZmVxICgiQEJVSUxEX0xWTUVUQURAIiwgInllcyIpCitMVk1fUlVMRVMrPTY5LWRtLWx2bS1tZXRhZC5ydWxlcworZW5kaWYKKworRE1fRElSPSQoc2hlbGwgZ3JlcCAiXCNkZWZpbmUgRE1fRElSIiAkKHRvcF9zcmNkaXIpL2xpYmRtL21pc2MvZG0taW9jdGwuaCB8IGF3ayAne3ByaW50ICQkM30nKQorCitpZmVxICgiQFVERVZfUlVMRV9FWEVDX0RFVEVDVElPTkAiLCAieWVzIikKK1NCSU49XCQkZW52e0RNX1NCSU5fUEFUSH0KK0RNX0VYRUNfUlVMRT1FTlZ7RE1fU0JJTl9QQVRIfT1cIlwvc2JpblwiXFxuVEVTVCE9XCJcJCRlbnZ7RE1fU0JJTl9QQVRIfVwvZG1zZXR1cFwiLCBFTlZ7RE1fU0JJTl9QQVRIfT1cIlwvdXNyXC9zYmluXCIKK0RNX0VYRUM9XCQkZW52e0RNX1NCSU5fUEFUSH0KK0xWTV9FWEVDX1JVTEU9RU5We0xWTV9TQklOX1BBVEh9PVwiXC9zYmluXCJcXG5URVNUIT1cIlwkJGVudntMVk1fU0JJTl9QQVRIfVwvbHZtXCIsIEVOVntMVk1fU0JJTl9QQVRIfT1cIlwvdXNyXC9zYmluXCIKK0xWTV9FWEVDPVwkJGVudntMVk1fU0JJTl9QQVRIfQorZWxzZQorU0JJTj0iQHNiaW5kaXJAIgorRE1fRVhFQ19SVUxFPSIiCitETV9FWEVDPSR7U0JJTn0KK0xWTV9FWEVDX1JVTEU9IiIKK0xWTV9FWEVDPSR7U0JJTn0KK2VuZGlmCisKK2lmZXEgKCJAVURFVl9IQVNfQlVJTFRJTl9CTEtJREAiLCAieWVzIikKK0JMS0lEX1JVTEU9SU1QT1JUe2J1aWx0aW59PVwiYmxraWRcIgorZWxzZQorQkxLSURfUlVMRT1JTVBPUlR7cHJvZ3JhbX09XCIke1NCSU59XC9ibGtpZCAtbyB1ZGV2IC1wIFwkJHRlbXBub2RlXCIKK2VuZGlmCisKK2lmZXEgKCJAVURFVl9TWVNURU1EX0JBQ0tHUk9VTkRfSk9CU0AiLCAieWVzIikKK1BWU0NBTl9SVUxFPUFDVElPTlwhPVwicmVtb3ZlXCIsIEVOVntMVk1fUFZfR09ORX09PVwiMVwiLCBSVU5cKz1cIkBiaW5kaXJAL3N5c3RlbWQtcnVuICQoTFZNX0VYRUMpXC9sdm0gcHZzY2FuIC0tY2FjaGUgXCQkbWFqb3JcOlwkJG1pbm9yXCIsIEdPVE89XCJsdm1fZW5kXCJcbkVOVntTWVNURU1EX0FMSUFTfT1cIlwvZGV2XC9ibG9ja1wvXCQkbWFqb3I6XCQkbWlub3JcIlxuRU5We0lEX01PREVMfT1cIkxWTSBQViBcJCRlbnZ7SURfRlNfVVVJRF9FTkN9IG9uIFwvZGV2XC9cJCRuYW1lXCJcbkVOVntTWVNURU1EX1dBTlRTfVwrPVwibHZtMi1wdnNjYW5AXCQkbWFqb3I6XCQkbWlub3Iuc2VydmljZVwiCitlbHNlCitQVlNDQU5fUlVMRT1SVU5cK1w9XCIkKExWTV9FWEVDKS9sdm0gcHZzY2FuIC0tYmFja2dyb3VuZCAtLWNhY2hlIC0tYWN0aXZhdGUgYXkgLS1tYWpvciBcJCRtYWpvciAtLW1pbm9yIFwkJG1pbm9yXCIsIEVOVntMVk1fU0NBTk5FRH09XCIxXCIKK2VuZGlmCisKKyUucnVsZXM6ICQoc3JjZGlyKS8lLnJ1bGVzLmluCisJJChTRUQpIC1lICJzKyhETV9ESVIpKyQoRE1fRElSKSs7cysoQkxLSURfUlVMRSkrJChCTEtJRF9SVUxFKSs7cysoUFZTQ0FOX1JVTEUpKyQoUFZTQ0FOX1JVTEUpKztzKyhETV9FWEVDX1JVTEUpKyQoRE1fRVhFQ19SVUxFKSs7cysoRE1fRVhFQykrJChETV9FWEVDKSs7cysoTFZNX0VYRUNfUlVMRSkrJChMVk1fRVhFQ19SVUxFKSs7cysoTFZNX0VYRUMpKyQoTFZNX0VYRUMpKzsiICQ8ID4kQAorCislX2luc3RhbGw6ICUucnVsZXMKKwkkKElOU1RBTExfREFUQSkgLUQgJDwgJCh1ZGV2ZGlyKS8kKDxGKQorCithbGw6ICQoRE1fUlVMRVMpICQoTFZNX1JVTEVTKQorQ0xFQU5fVEFSR0VUUyA9ICQoRE1fUlVMRVMpICQoTFZNX1JVTEVTKQoraW5zdGFsbF9kZXZpY2UtbWFwcGVyOiAkKERNX1JVTEVTOi5ydWxlcz1faW5zdGFsbCkKK2luc3RhbGxfbHZtMjogJChMVk1fUlVMRVM6LnJ1bGVzPV9pbnN0YWxsKQorCitpbnN0YWxsOiBpbnN0YWxsX2x2bTIgaW5zdGFsbF9kZXZpY2UtbWFwcGVyCmRpZmYgLS1naXQgYS91bml0LXRlc3RzL2RhdGFzdHJ1Y3QvTWFrZWZpbGUuaW4gYi91bml0LXRlc3RzL2RhdGFzdHJ1Y3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwZTdhNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXQtdGVzdHMvZGF0YXN0cnVjdC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBMVk0yLgorIworIyBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyMgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKKworU09VUkNFUz1cCisJYml0c2V0X3QuYworCitUQVJHRVRTPVwKKwliaXRzZXRfdAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKKworSU5DTFVERVMgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYmRtCitETV9ERVBTID0gJCh0b3BfYnVpbGRkaXIpL2xpYmRtL2xpYmRldm1hcHBlci5zbworRE1fTElCUyA9IC1sZGV2bWFwcGVyICQoTElCUykKKworYml0c2V0X3Q6IGJpdHNldF90Lm8gJChETV9ERVBTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIGJpdHNldF90Lm8gJChETV9MSUJTKQpkaWZmIC0tZ2l0IGEvdW5pdC10ZXN0cy9kYXRhc3RydWN0L1RFU1RTIGIvdW5pdC10ZXN0cy9kYXRhc3RydWN0L1RFU1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODhmYjcKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL2RhdGFzdHJ1Y3QvVEVTVFMKQEAgLTAsMCArMSBAQAorYml0c2V0IGl0ZXJhdGlvbjokVEVTVF9UT09MIC4vYml0c2V0X3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bml0LXRlc3RzL2RhdGFzdHJ1Y3QvYml0c2V0X3QuYyBiL3VuaXQtdGVzdHMvZGF0YXN0cnVjdC9iaXRzZXRfdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL2RhdGFzdHJ1Y3QvYml0c2V0X3QuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCitlbnVtIHsKKyAgICAgICAgTlJfQklUUyA9IDEzNworfTsKKworc3RhdGljIHZvaWQgdGVzdF9nZXRfbmV4dChzdHJ1Y3QgZG1fcG9vbCAqbWVtKQoreworICAgICAgICBpbnQgaSwgaiwgbGFzdCwgZmlyc3Q7CisgICAgICAgIGRtX2JpdHNldF90IGJzID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIE5SX0JJVFMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9CSVRTOyBpKyspCisgICAgICAgICAgICAgICAgYXNzZXJ0KCFkbV9iaXQoYnMsIGkpKTsKKworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IE5SX0JJVFM7IGkgKz0gaiwgaisrKQorICAgICAgICAgICAgICAgIGRtX2JpdF9zZXQoYnMsIGkpOworCisgICAgICAgIGZpcnN0ID0gMTsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBOUl9CSVRTOyBpICs9IGosIGorKykgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRtX2JpdF9nZXRfZmlyc3QoYnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGRtX2JpdF9nZXRfbmV4dChicywgbGFzdCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQobGFzdCA9PSBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChkbV9iaXRfZ2V0X25leHQoYnMsIGxhc3QpID09IC0xKTsKK30KKworc3RhdGljIHZvaWQgYml0X2ZsaXAoZG1fYml0c2V0X3QgYnMsIGludCBiaXQpCit7CisgICAgICAgIGludCBvbGQgPSBkbV9iaXQoYnMsIGJpdCk7CisgICAgICAgIGlmIChvbGQpCisgICAgICAgICAgICAgICAgZG1fYml0X2NsZWFyKGJzLCBiaXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG1fYml0X3NldChicywgYml0KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9lcXVhbChzdHJ1Y3QgZG1fcG9vbCAqbWVtKQoreworICAgICAgICBkbV9iaXRzZXRfdCBiczEgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgTlJfQklUUyk7CisgICAgICAgIGRtX2JpdHNldF90IGJzMiA9IGRtX2JpdHNldF9jcmVhdGUobWVtLCBOUl9CSVRTKTsKKworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBOUl9CSVRTOyBpICs9IGosIGorKykgeworICAgICAgICAgICAgICAgIGRtX2JpdF9zZXQoYnMxLCBpKTsKKyAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMyKSk7CisgICAgICAgIGFzc2VydChkbV9iaXRzZXRfZXF1YWwoYnMyLCBiczEpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQklUUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYml0X2ZsaXAoYnMxLCBpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIWRtX2JpdHNldF9lcXVhbChiczEsIGJzMikpOworICAgICAgICAgICAgICAgIGFzc2VydCghZG1fYml0c2V0X2VxdWFsKGJzMiwgYnMxKSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMxKSk7IC8qIGNvbXBhcmluZyB3aXRoIHNlbGYgKi8KKyAgICAgICAgICAgICAgICBiaXRfZmxpcChiczEsIGkpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYW5kKHN0cnVjdCBkbV9wb29sICptZW0pCit7CisgICAgICAgIGRtX2JpdHNldF90IGJzMSA9IGRtX2JpdHNldF9jcmVhdGUobWVtLCBOUl9CSVRTKTsKKyAgICAgICAgZG1fYml0c2V0X3QgYnMyID0gZG1fYml0c2V0X2NyZWF0ZShtZW0sIE5SX0JJVFMpOworICAgICAgICBkbV9iaXRzZXRfdCBiczMgPSBkbV9iaXRzZXRfY3JlYXRlKG1lbSwgTlJfQklUUyk7CisKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgTlJfQklUUzsgaSArPSBqLCBqKyspIHsKKyAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMSwgaSk7CisgICAgICAgICAgICAgICAgZG1fYml0X3NldChiczIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgZG1fYml0X2FuZChiczMsIGJzMSwgYnMyKTsKKworICAgICAgICBhc3NlcnQoZG1fYml0c2V0X2VxdWFsKGJzMSwgYnMyKSk7CisgICAgICAgIGFzc2VydChkbV9iaXRzZXRfZXF1YWwoYnMxLCBiczMpKTsKKyAgICAgICAgYXNzZXJ0KGRtX2JpdHNldF9lcXVhbChiczIsIGJzMykpOworCisgICAgICAgIGRtX2JpdF9jbGVhcl9hbGwoYnMxKTsKKyAgICAgICAgZG1fYml0X2NsZWFyX2FsbChiczIpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9CSVRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAlIDIpCisgICAgICAgICAgICAgICAgICAgICAgICBkbV9iaXRfc2V0KGJzMSwgaSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZG1fYml0X3NldChiczIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgZG1fYml0X2FuZChiczMsIGJzMSwgYnMyKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5SX0JJVFM7IGkrKykKKyAgICAgICAgICAgICAgICBhc3NlcnQoIWRtX2JpdChiczMsIGkpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgICAgICB0eXBlZGVmIHZvaWQgKCp0ZXN0X2ZuKShzdHJ1Y3QgZG1fcG9vbCAqKTsKKyAgICAgICAgc3RhdGljIHRlc3RfZm4gdGVzdHNbXSA9IHsKKyAgICAgICAgICAgICAgICB0ZXN0X2dldF9uZXh0LAorICAgICAgICAgICAgICAgIHRlc3RfZXF1YWwsCisgICAgICAgICAgICAgICAgdGVzdF9hbmQKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IERNX0FSUkFZX1NJWkUodGVzdHMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZG1fcG9vbCAqbWVtID0gZG1fcG9vbF9jcmVhdGUoImJpdHNldCB0ZXN0IiwgMTAyNCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG1lbSk7CisgICAgICAgICAgICAgICAgdGVzdHNbaV0obWVtKTsKKyAgICAgICAgICAgICAgICBkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS91bml0LXRlc3RzL21tL01ha2VmaWxlLmluIGIvdW5pdC10ZXN0cy9tbS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBlMmUyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9tbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpc3RpbmEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK1NPVVJDRVM9XAorCXBvb2xfdmFsZ3JpbmRfdC5jCisKK1RBUkdFVFM9XAorCXBvb2xfdmFsZ3JpbmRfdAorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9tYWtlLnRtcGwKK0RNX0xJQlMgPSAtbGRldm1hcHBlciAkKExJQlMpCisKK3Bvb2xfdmFsZ3JpbmRfdDogcG9vbF92YWxncmluZF90Lm8KKwkkKENDKSAkKENGTEFHUykgLW8gJEAgcG9vbF92YWxncmluZF90Lm8gJChMREZMQUdTKSAkKERNX0xJQlMpCisKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvbW0vVEVTVFMgYi91bml0LXRlc3RzL21tL1RFU1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjMxNTQKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL21tL1RFU1RTCkBAIC0wLDAgKzEgQEAKK3ZhbGdyaW5kIHBvb2wgYXdhcmVuZXNzOnZhbGdyaW5kIC4vcG9vbF92YWxncmluZF90IDI+JjEgfCAuL2NoZWNrX3Jlc3VsdHMKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvbW0vY2hlY2tfcmVzdWx0cyBiL3VuaXQtdGVzdHMvbW0vY2hlY2tfcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2IwOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9tbS9jaGVja19yZXN1bHRzCkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkxLjkKKworcmVxdWlyZSAncHAnCisKK3BhdHRlcm5zID0gWworICAgICAgICAgICAgL0ludmFsaWQgcmVhZCBvZiBzaXplIDEvLAorICAgICAgICAgICAgL0ludmFsaWQgd3JpdGUgb2Ygc2l6ZSAxLywKKyAgICAgICAgICAgIC9JbnZhbGlkIHJlYWQgb2Ygc2l6ZSAxLywKKyAgICAgICAgICAgIC9zdGlsbCByZWFjaGFibGU6IFswLTksXSsgYnl0ZXMgaW4gMyBibG9ja3MvCisgICAgICAgICAgIF0KKworbGluZXMgPSBTVERJTi5yZWFkbGluZXMKK3BwIGxpbmVzCisKK3Jlc3VsdCA9IGNhdGNoKDpkb25lKSBkbworICBwYXR0ZXJucy5lYWNoIGRvIHxwYXR8CisgICAgbG9vcCBkbworICAgICAgdGhyb3coOmRvbmUsIGZhbHNlKSBpZiBsaW5lcy5zaXplID09IDAKKworICAgICAgbGluZSA9IGxpbmVzLnNoaWZ0CisgICAgICBpZiBsaW5lID1+IHBhdAorICAgICAgICBTVERFUlIucHV0cyAibWF0Y2hlZCAje3BhdH0iCisgICAgICAgIGJyZWFrOworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIHRocm93KDpkb25lLCB0cnVlKQorZW5kCisKK2V4aXQocmVzdWx0ID8gMCA6IDEpCmRpZmYgLS1naXQgYS91bml0LXRlc3RzL21tL3Bvb2xfdmFsZ3JpbmRfdC5jIGIvdW5pdC10ZXN0cy9tbS9wb29sX3ZhbGdyaW5kX3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRmMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9tbS9wb29sX3ZhbGdyaW5kX3QuYwpAQCAtMCwwICsxLDE4MSBAQAorI2luY2x1ZGUgImxpYmRldm1hcHBlci5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qCisgKiBDaGVja3MgdGhhdCB2YWxncmluZCBpcyBwaWNraW5nIHVwIHVuYWxsb2NhdGVkIHBvb2wgbWVtb3J5IGFzCisgKiB1bmluaXRpYWxpc2VkLCBldmVuIGlmIHRoZSBjaHVuayBoYXMgYmVlbiByZWN5Y2xlZC4KKyAqCisgKiAgICAgJCB2YWxncmluZCAtLXRyYWNrLW9yaWdpbnM9eWVzIC4vcG9vbF92YWxncmluZF90CisgKgorICogICAgID09NzAyMz09IE1lbWNoZWNrLCBhIG1lbW9yeSBlcnJvciBkZXRlY3RvcgorICogICAgID09NzAyMz09IENvcHlyaWdodCAoQykgMjAwMi0yMDA5LCBhbmQgR05VIEdQTCdkLCBieSBKdWxpYW4gU2V3YXJkIGV0IGFsLgorICogICAgID09NzAyMz09IFVzaW5nIFZhbGdyaW5kLTMuNi4wLlNWTi1EZWJpYW4gYW5kIExpYlZFWDsgcmVydW4gd2l0aCAtaCBmb3IgY29weXJpZ2h0IGluZm8KKyAqICAgICA9PTcwMjM9PSBDb21tYW5kOiAuL3Bvb2xfdmFsZ3JpbmRfdAorICogICAgID09NzAyMz09CisgKiAgICAgZmlyc3QgYnJhbmNoIHdvcmtlZCAoYXMgZXhwZWN0ZWQpCisgKiAgICAgPT03MDIzPT0gQ29uZGl0aW9uYWwganVtcCBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKQorICogICAgID09NzAyMz09ICAgIGF0IDB4NDAwOUFDOiBtYWluIChpbiAvaG9tZS9lanQvd29yay9sdm0yL3VuaXQtdGVzdHMvbW0vcG9vbF92YWxncmluZF90KQorICogICAgID09NzAyMz09ICBVbmluaXRpYWxpc2VkIHZhbHVlIHdhcyBjcmVhdGVkIGJ5IGEgY2xpZW50IHJlcXVlc3QKKyAqICAgICA9PTcwMjM9PSAgICBhdCAweDRFNDBDQjg6IGRtX3Bvb2xfZnJlZSAoaW4gL2hvbWUvZWp0L3dvcmsvbHZtMi9saWJkbS9pb2N0bC9saWJkZXZtYXBwZXIuc28uMS4wMikKKyAqICAgICA9PTcwMjM9PSAgICBieSAweDQwMDlBODogbWFpbiAoaW4gL2hvbWUvZWp0L3dvcmsvbHZtMi91bml0LXRlc3RzL21tL3Bvb2xfdmFsZ3JpbmRfdCkKKyAqICAgICA9PTcwMjM9PQorICogICAgIHNlY29uZCBicmFuY2ggd29ya2VkICh2YWxncmluZCBzaG91bGQgaGF2ZSBmbGFnZ2VkIHRoaXMgYXMgYW4gZXJyb3IpCisgKiAgICAgPT03MDIzPT0KKyAqICAgICA9PTcwMjM9PSBIRUFQIFNVTU1BUlk6CisgKiAgICAgPT03MDIzPT0gICAgIGluIHVzZSBhdCBleGl0OiAwIGJ5dGVzIGluIDAgYmxvY2tzCisgKiAgICAgPT03MDIzPT0gICB0b3RhbCBoZWFwIHVzYWdlOiAyIGFsbG9jcywgMiBmcmVlcywgMiwxMDQgYnl0ZXMgYWxsb2NhdGVkCisgKiAgICAgPT03MDIzPT0KKyAqICAgICA9PTcwMjM9PSBBbGwgaGVhcCBibG9ja3Mgd2VyZSBmcmVlZCAtLSBubyBsZWFrcyBhcmUgcG9zc2libGUKKyAqICAgICA9PTcwMjM9PQorICogICAgID09NzAyMz09IEZvciBjb3VudHMgb2YgZGV0ZWN0ZWQgYW5kIHN1cHByZXNzZWQgZXJyb3JzLCByZXJ1biB3aXRoOiAtdgorICogICAgID09NzAyMz09IEVSUk9SIFNVTU1BUlk6IDEgZXJyb3JzIGZyb20gMSBjb250ZXh0cyAoc3VwcHJlc3NlZDogNCBmcm9tIDQpCisgKi8KKworI2RlZmluZSBDT1VOVCAxMAorCitzdGF0aWMgdm9pZCBjaGVja19mcmVlKCkKK3sKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKmJsb2Nrc1tDT1VOVF07CisgICAgICAgIHN0cnVjdCBkbV9wb29sICpwID0gZG1fcG9vbF9jcmVhdGUoImJsYWgiLCAxMDI0KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgICAgICAgICBibG9ja3NbaV0gPSBkbV9wb29sX2FsbG9jKHAsIDM3KTsKKworICAgICAgICAvKiBjaGVjayB3ZSBjYW4gYWNjZXNzIHRoZSBsYXN0IGJsb2NrICovCisgICAgICAgIGJsb2Nrc1tDT1VOVCAtIDFdWzBdID0gJ0UnOworICAgICAgICBpZiAoYmxvY2tzW0NPVU5UIC0gMV1bMF0gPT0gJ0UnKQorICAgICAgICAgICAgICAgIHByaW50ZigiZmlyc3QgYnJhbmNoIHdvcmtlZCAoYXMgZXhwZWN0ZWQpXG4iKTsKKworICAgICAgICBkbV9wb29sX2ZyZWUocCwgYmxvY2tzWzVdKTsKKworICAgICAgICBpZiAoYmxvY2tzW0NPVU5UIC0gMV1bMF0gPT0gJ0UnKQorICAgICAgICAgICAgICAgIHByaW50Zigic2Vjb25kIGJyYW5jaCB3b3JrZWQgKHZhbGdyaW5kIHNob3VsZCBoYXZlIGZsYWdnZWQgdGhpcyBhcyBhbiBlcnJvcilcbiIpOworCisgICAgICAgIGRtX3Bvb2xfZGVzdHJveShwKTsKK30KKworLyogQ2hlY2tzIHRoYXQgZnJlZWQgY2h1bmtzIGFyZSBtYXJrZWQgTk9BQ0NFU1MgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2ZyZWUyKCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqcCA9IGRtX3Bvb2xfY3JlYXRlKCIiLCA5MDApOyAvKiA5MDAgd2lsbCBnZXQKKwkJCQkJCSAgICAgICogcm91bmRlZCB1cCB0byAxMDI0LAorCQkJCQkJICAgICAgKiAxMDI0IHdvdWxkIGhhdmUgZ290CisJCQkJCQkgICAgICAqIHJvdW5kZWQgdXAgdG8KKwkJCQkJCSAgICAgICogMjA0OCAqLworCWNoYXIgKmRhdGExLCAqZGF0YTI7CisKKwlhc3NlcnQocCk7CisJZGF0YTEgPSBkbV9wb29sX2FsbG9jKHAsIDEyMyk7CisJYXNzZXJ0KGRhdGExKTsKKworCWRhdGExID0gZG1fcG9vbF9hbGxvYyhwLCAxMDI0KTsKKwlhc3NlcnQoZGF0YTEpOworCisJZGF0YTIgPSBkbV9wb29sX2FsbG9jKHAsIDEyMyk7CisJYXNzZXJ0KGRhdGEyKTsKKworCWRhdGEyWzBdID0gJ0EnOwkJLyogc2hvdWxkIHdvcmsgZmluZSAqLworCisJZG1fcG9vbF9mcmVlKHAsIGRhdGExKTsKKworCS8qCisJICogc28gbm93IHRoZSBmaXJzdCBjaHVuayBpcyBhY3RpdmUsIHRoZSBzZWNvbmQgY2h1bmsgaGFzIGJlY29tZQorCSAqIHRoZSBmcmVlIG9uZS4KKwkgKi8KKwlkYXRhMlswXSA9ICdCJzsJCS8qIHNob3VsZCBwcm9tcHQgYW4gaW52YWxpZCB3cml0ZSBlcnJvciAqLworCisJZG1fcG9vbF9kZXN0cm95KHApOworfQorCitzdGF0aWMgdm9pZCBjaGVja19hbGlnbm1lbnQoKQoreworCS8qCisJICogUG9vbCBhbHdheXMgdHJpZXMgdG8gYWxsb2NhdGUgYmxvY2tzIHdpdGggcGFydGljdWxhciBhbGlnbm1lbnQuCisJICogU28gdGhlcmUgYXJlIHBvdGVudGlhbGx5IHNtYWxsIGdhcHMgYmV0d2VlbiBhbGxvY2F0aW9ucy4gIFRoaXMKKwkgKiB0ZXN0IGNoZWNrcyB0aGF0IHZhbGdyaW5kIGlzIHNwb3R0aW5nIGlsbGVnYWwgYWNjZXNzZXMgdG8gdGhlc2UKKwkgKiBnYXBzLgorCSAqLworCisJaW50IGksIHN1bTsKKwlzdHJ1Y3QgZG1fcG9vbCAqcCA9IGRtX3Bvb2xfY3JlYXRlKCJibGFoIiwgMTAyNCk7CisJY2hhciAqZGF0YTEsICpkYXRhMjsKKwljaGFyIGJ1ZmZlclsxNl07CisKKworCWRhdGExID0gZG1fcG9vbF9hbGxvY19hbGlnbmVkKHAsIDEsIDQpOworCWFzc2VydChkYXRhMSk7CisJZGF0YTIgPSBkbV9wb29sX2FsbG9jX2FsaWduZWQocCwgMSwgNCk7CisJYXNzZXJ0KGRhdGExKTsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlYyIsICooZGF0YTEgKyAxKSk7IC8qIGludmFsaWQgcmVhZCBzaXplIDEgKi8KKwlkbV9wb29sX2Rlc3Ryb3kocCk7Cit9CisKKy8qCisgKiBMb29raW5nIGF0IHRoZSBjb2RlIEknbSBub3Qgc3VyZSBhbGxvY2F0aW9ucyB0aGF0IGFyZSBuZWFyIHRoZSBjaHVuaworICogc2l6ZSBhcmUgd29ya2luZy4gIFNvIHRoaXMgdGVzdCBpcyB0cnlpbmcgdG8gZXhoaWJpdCBhIHNwZWNpZmljIHByb2JsZW0uCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2FsbG9jYXRpb25fbmVhcl9jaHVua19zaXplKCkKK3sKKwlpbnQgaTsKKwljaGFyICpkYXRhOworCXN0cnVjdCBkbV9wb29sICpwID0gZG1fcG9vbF9jcmVhdGUoIiIsIDkwMCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIGEgbG90IGFuZCB0aGVuIGZyZWUgZXZlcnl0aGluZyBzbyB3ZSBrbm93IHRoZXJlCisJICogaXMgYSBzcGFyZSBjaHVuay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCWRhdGEgPSBkbV9wb29sX2FsbG9jKHAsIDM3KTsKKwkJbWVtc2V0KGRhdGEsIDAsIDM3KTsKKwkJYXNzZXJ0KGRhdGEpOworCX0KKworCWRtX3Bvb2xfZW1wdHkocCk7CisKKwkvKiBub3cgd2UgYWxsb2NhdGUgc29tZXRoaW5nIGNsb3NlIHRvIHRoZSBjaHVuayBzaXplIC4uLiAqLworCWRhdGEgPSBkbV9wb29sX2FsbG9jKHAsIDEwMjApOworCWFzc2VydChkYXRhKTsKKwltZW1zZXQoZGF0YSwgMCwgMTAyMCk7CisKKwlkbV9wb29sX2Rlc3Ryb3kocCk7Cit9CisKKy8qIEZJWE1FOiB0ZXN0IHRoZSBkYmdfbWFsbG9jIGF0IGV4aXQgKHRoaXMgdGVzdCBzaG91bGQgYmUgaW4gZGJnX21hbGxvYykgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWtfZGV0ZWN0aW9uKCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZG1fcG9vbCAqcCA9IGRtX3Bvb2xfY3JlYXRlKCIiLCAxMDI0KTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlkbV9wb29sX2FsbG9jKHAsIChpICsgMSkgKiAzNyk7Cit9CisKKy8qIHdlIHNob3VsZG4ndCBnZXQgYW55IGVycm9ycyBmcm9tIHRoaXMgb25lICovCitzdGF0aWMgdm9pZCBjaGVja19vYmplY3RfZ3Jvd3RoKCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZG1fcG9vbCAqcCA9IGRtX3Bvb2xfY3JlYXRlKCIiLCAzMik7CisJY2hhciBkYXRhWzEwMF0gPSB7IDAgfTsKKwl2b2lkICpvYmo7CisKKwlkbV9wb29sX2JlZ2luX29iamVjdChwLCA0Myk7CisJZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCQlkbV9wb29sX2dyb3dfb2JqZWN0KHAsIGRhdGEsIGkpOworCW9iaiA9IGRtX3Bvb2xfZW5kX29iamVjdChwKTsKKworCWRtX3Bvb2xfZGVzdHJveShwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoZWNrX2ZyZWUoKTsKKwljaGVja19mcmVlMigpOworCWNoZWNrX2FsaWdubWVudCgpOworCWNoZWNrX2FsbG9jYXRpb25fbmVhcl9jaHVua19zaXplKCk7CisJY2hlY2tfbGVha19kZXRlY3Rpb24oKTsKKwljaGVja19vYmplY3RfZ3Jvd3RoKCk7CisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5pdC10ZXN0cy9yZWdleC9NYWtlZmlsZS5pbiBiL3VuaXQtdGVzdHMvcmVnZXgvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiN2RlZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXQtdGVzdHMvcmVnZXgvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyMKKyMgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisjIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACisKK1NPVVJDRVM9XAorCXBhcnNlX3QuYyBcCisJbWF0Y2hlcl90LmMKKworVEFSR0VUUz1cCisJcGFyc2VfdCBcCisJbWF0Y2hlcl90CisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL21ha2UudG1wbAorCitJTkNMVURFUyArPSAtSSQodG9wX3NyY2RpcikvbGliZG0KK0RNX0RFUFMgPSAkKHRvcF9idWlsZGRpcikvbGliZG0vbGliZGV2bWFwcGVyLnNvCitETV9MSUJTID0gLWxkZXZtYXBwZXIgJChMSUJTKQorCitwYXJzZV90OiBwYXJzZV90Lm8gJChETV9ERVBTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIHBhcnNlX3QubyAkKERNX0xJQlMpCisKK21hdGNoZXJfdDogbWF0Y2hlcl90Lm8gJChETV9ERVBTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIG1hdGNoZXJfdC5vICQoRE1fTElCUykKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvVEVTVFMgYi91bml0LXRlc3RzL3JlZ2V4L1RFU1RTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTc5NDIKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL3JlZ2V4L1RFU1RTCkBAIC0wLDAgKzEsMyBAQAorZGZhIG1hdGNoaW5nOiRURVNUX1RPT0wgLi9tYXRjaGVyX3QgLS1maW5nZXJwcmludCBkZXZfcGF0dGVybnMgPCBkZXZpY2VzLmxpc3QgPiBtYXRjaGVyX3Qub3V0cHV0ICYmIGRpZmYgLXUgbWF0Y2hlcl90LmV4cGVjdGVkIG1hdGNoZXJfdC5vdXRwdXQKK2RmYSBtYXRjaGluZzokVEVTVF9UT09MIC4vbWF0Y2hlcl90IC0tZmluZ2VycHJpbnQgcmFuZG9tX3JlZ2V4ZXMgPCAvZGV2L251bGwgPiBtYXRjaGVyX3Qub3V0cHV0ICYmIGRpZmYgLXUgbWF0Y2hlcl90LmV4cGVjdGVkMiBtYXRjaGVyX3Qub3V0cHV0CitkZmEgd2l0aCBub24tcHJpbnQgcmVnZXggY2hhcnM6JFRFU1RfVE9PTCAuL21hdGNoZXJfdCBub25wcmludF9yZWdleGVzIDwgbm9ucHJpbnRfaW5wdXQgPiBtYXRjaGVyX3Qub3V0cHV0ICYmIGRpZmYgLXUgbWF0Y2hlcl90LmV4cGVjdGVkMyBtYXRjaGVyX3Qub3V0cHV0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pdC10ZXN0cy9yZWdleC9kZXZfcGF0dGVybnMgYi91bml0LXRlc3RzL3JlZ2V4L2Rldl9wYXR0ZXJucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ1OWJhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9yZWdleC9kZXZfcGF0dGVybnMKQEAgLTAsMCArMSwyIEBACisibG9vcC9bMC05XSsiCisiaGRbYS1kXVswLTVdKyIKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvZGV2aWNlcy5saXN0IGIvdW5pdC10ZXN0cy9yZWdleC9kZXZpY2VzLmxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhZjMwNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXQtdGVzdHMvcmVnZXgvZGV2aWNlcy5saXN0CkBAIC0wLDAgKzEsODgwIEBACisvZGV2CisvZGV2Ly5kZXZmc2QKKy9kZXYvY3B1CisvZGV2L2NwdS9tdHJyCisvZGV2L25ldGxpbmsKKy9kZXYvbmV0bGluay9yb3V0ZQorL2Rldi9uZXRsaW5rL3NraXAKKy9kZXYvbmV0bGluay9VU0VSU09DSworL2Rldi9uZXRsaW5rL2Z3bW9uaXRvcgorL2Rldi9uZXRsaW5rL0FSUEQKKy9kZXYvbmV0bGluay9ST1VURTYKKy9kZXYvbmV0bGluay9JUDZfRlcKKy9kZXYvbmV0bGluay90YXAwCisvZGV2L25ldGxpbmsvdGFwMQorL2Rldi9uZXRsaW5rL3RhcDIKKy9kZXYvbmV0bGluay90YXAzCisvZGV2L25ldGxpbmsvdGFwNAorL2Rldi9uZXRsaW5rL3RhcDUKKy9kZXYvbmV0bGluay90YXA2CisvZGV2L25ldGxpbmsvdGFwNworL2Rldi9uZXRsaW5rL3RhcDgKKy9kZXYvbmV0bGluay90YXA5CisvZGV2L25ldGxpbmsvdGFwMTAKKy9kZXYvbmV0bGluay90YXAxMQorL2Rldi9uZXRsaW5rL3RhcDEyCisvZGV2L25ldGxpbmsvdGFwMTMKKy9kZXYvbmV0bGluay90YXAxNAorL2Rldi9uZXRsaW5rL3RhcDE1CisvZGV2L3NobQorL2Rldi9tZW0KKy9kZXYva21lbQorL2Rldi9udWxsCisvZGV2L3BvcnQKKy9kZXYvemVybworL2Rldi9mdWxsCisvZGV2L3JhbmRvbQorL2Rldi91cmFuZG9tCisvZGV2L3R0eQorL2Rldi9jb25zb2xlCisvZGV2L3ZjCisvZGV2L3ZjLzEKKy9kZXYvdmMvMgorL2Rldi92Yy8zCisvZGV2L3ZjLzQKKy9kZXYvdmMvNQorL2Rldi92Yy82CisvZGV2L3ZjLzcKKy9kZXYvdmMvOAorL2Rldi92Yy85CisvZGV2L3ZjLzEwCisvZGV2L3ZjLzExCisvZGV2L3ZjLzEyCisvZGV2L3ZjLzEzCisvZGV2L3ZjLzE0CisvZGV2L3ZjLzE1CisvZGV2L3ZjLzE2CisvZGV2L3ZjLzE3CisvZGV2L3ZjLzE4CisvZGV2L3ZjLzE5CisvZGV2L3ZjLzIwCisvZGV2L3ZjLzIxCisvZGV2L3ZjLzIyCisvZGV2L3ZjLzIzCisvZGV2L3ZjLzI0CisvZGV2L3ZjLzI1CisvZGV2L3ZjLzI2CisvZGV2L3ZjLzI3CisvZGV2L3ZjLzI4CisvZGV2L3ZjLzI5CisvZGV2L3ZjLzMwCisvZGV2L3ZjLzMxCisvZGV2L3ZjLzMyCisvZGV2L3ZjLzMzCisvZGV2L3ZjLzM0CisvZGV2L3ZjLzM1CisvZGV2L3ZjLzM2CisvZGV2L3ZjLzM3CisvZGV2L3ZjLzM4CisvZGV2L3ZjLzM5CisvZGV2L3ZjLzQwCisvZGV2L3ZjLzQxCisvZGV2L3ZjLzQyCisvZGV2L3ZjLzQzCisvZGV2L3ZjLzQ0CisvZGV2L3ZjLzQ1CisvZGV2L3ZjLzQ2CisvZGV2L3ZjLzQ3CisvZGV2L3ZjLzQ4CisvZGV2L3ZjLzQ5CisvZGV2L3ZjLzUwCisvZGV2L3ZjLzUxCisvZGV2L3ZjLzUyCisvZGV2L3ZjLzUzCisvZGV2L3ZjLzU0CisvZGV2L3ZjLzU1CisvZGV2L3ZjLzU2CisvZGV2L3ZjLzU3CisvZGV2L3ZjLzU4CisvZGV2L3ZjLzU5CisvZGV2L3ZjLzYwCisvZGV2L3ZjLzYxCisvZGV2L3ZjLzYyCisvZGV2L3ZjLzYzCisvZGV2L3ZjLzAKKy9kZXYvcHRteAorL2Rldi9taXNjCisvZGV2L21pc2MvcHNhdXgKKy9kZXYvcHR5CisvZGV2L3B0eS9tMAorL2Rldi9wdHkvbTEKKy9kZXYvcHR5L20yCisvZGV2L3B0eS9tMworL2Rldi9wdHkvbTQKKy9kZXYvcHR5L201CisvZGV2L3B0eS9tNgorL2Rldi9wdHkvbTcKKy9kZXYvcHR5L204CisvZGV2L3B0eS9tOQorL2Rldi9wdHkvbTEwCisvZGV2L3B0eS9tMTEKKy9kZXYvcHR5L20xMgorL2Rldi9wdHkvbTEzCisvZGV2L3B0eS9tMTQKKy9kZXYvcHR5L20xNQorL2Rldi9wdHkvbTE2CisvZGV2L3B0eS9tMTcKKy9kZXYvcHR5L20xOAorL2Rldi9wdHkvbTE5CisvZGV2L3B0eS9tMjAKKy9kZXYvcHR5L20yMQorL2Rldi9wdHkvbTIyCisvZGV2L3B0eS9tMjMKKy9kZXYvcHR5L20yNAorL2Rldi9wdHkvbTI1CisvZGV2L3B0eS9tMjYKKy9kZXYvcHR5L20yNworL2Rldi9wdHkvbTI4CisvZGV2L3B0eS9tMjkKKy9kZXYvcHR5L20zMAorL2Rldi9wdHkvbTMxCisvZGV2L3B0eS9tMzIKKy9kZXYvcHR5L20zMworL2Rldi9wdHkvbTM0CisvZGV2L3B0eS9tMzUKKy9kZXYvcHR5L20zNgorL2Rldi9wdHkvbTM3CisvZGV2L3B0eS9tMzgKKy9kZXYvcHR5L20zOQorL2Rldi9wdHkvbTQwCisvZGV2L3B0eS9tNDEKKy9kZXYvcHR5L200MgorL2Rldi9wdHkvbTQzCisvZGV2L3B0eS9tNDQKKy9kZXYvcHR5L200NQorL2Rldi9wdHkvbTQ2CisvZGV2L3B0eS9tNDcKKy9kZXYvcHR5L200OAorL2Rldi9wdHkvbTQ5CisvZGV2L3B0eS9tNTAKKy9kZXYvcHR5L201MQorL2Rldi9wdHkvbTUyCisvZGV2L3B0eS9tNTMKKy9kZXYvcHR5L201NAorL2Rldi9wdHkvbTU1CisvZGV2L3B0eS9tNTYKKy9kZXYvcHR5L201NworL2Rldi9wdHkvbTU4CisvZGV2L3B0eS9tNTkKKy9kZXYvcHR5L202MAorL2Rldi9wdHkvbTYxCisvZGV2L3B0eS9tNjIKKy9kZXYvcHR5L202MworL2Rldi9wdHkvbTY0CisvZGV2L3B0eS9tNjUKKy9kZXYvcHR5L202NgorL2Rldi9wdHkvbTY3CisvZGV2L3B0eS9tNjgKKy9kZXYvcHR5L202OQorL2Rldi9wdHkvbTcwCisvZGV2L3B0eS9tNzEKKy9kZXYvcHR5L203MgorL2Rldi9wdHkvbTczCisvZGV2L3B0eS9tNzQKKy9kZXYvcHR5L203NQorL2Rldi9wdHkvbTc2CisvZGV2L3B0eS9tNzcKKy9kZXYvcHR5L203OAorL2Rldi9wdHkvbTc5CisvZGV2L3B0eS9tODAKKy9kZXYvcHR5L204MQorL2Rldi9wdHkvbTgyCisvZGV2L3B0eS9tODMKKy9kZXYvcHR5L204NAorL2Rldi9wdHkvbTg1CisvZGV2L3B0eS9tODYKKy9kZXYvcHR5L204NworL2Rldi9wdHkvbTg4CisvZGV2L3B0eS9tODkKKy9kZXYvcHR5L205MAorL2Rldi9wdHkvbTkxCisvZGV2L3B0eS9tOTIKKy9kZXYvcHR5L205MworL2Rldi9wdHkvbTk0CisvZGV2L3B0eS9tOTUKKy9kZXYvcHR5L205NgorL2Rldi9wdHkvbTk3CisvZGV2L3B0eS9tOTgKKy9kZXYvcHR5L205OQorL2Rldi9wdHkvbTEwMAorL2Rldi9wdHkvbTEwMQorL2Rldi9wdHkvbTEwMgorL2Rldi9wdHkvbTEwMworL2Rldi9wdHkvbTEwNAorL2Rldi9wdHkvbTEwNQorL2Rldi9wdHkvbTEwNgorL2Rldi9wdHkvbTEwNworL2Rldi9wdHkvbTEwOAorL2Rldi9wdHkvbTEwOQorL2Rldi9wdHkvbTExMAorL2Rldi9wdHkvbTExMQorL2Rldi9wdHkvbTExMgorL2Rldi9wdHkvbTExMworL2Rldi9wdHkvbTExNAorL2Rldi9wdHkvbTExNQorL2Rldi9wdHkvbTExNgorL2Rldi9wdHkvbTExNworL2Rldi9wdHkvbTExOAorL2Rldi9wdHkvbTExOQorL2Rldi9wdHkvbTEyMAorL2Rldi9wdHkvbTEyMQorL2Rldi9wdHkvbTEyMgorL2Rldi9wdHkvbTEyMworL2Rldi9wdHkvbTEyNAorL2Rldi9wdHkvbTEyNQorL2Rldi9wdHkvbTEyNgorL2Rldi9wdHkvbTEyNworL2Rldi9wdHkvbTEyOAorL2Rldi9wdHkvbTEyOQorL2Rldi9wdHkvbTEzMAorL2Rldi9wdHkvbTEzMQorL2Rldi9wdHkvbTEzMgorL2Rldi9wdHkvbTEzMworL2Rldi9wdHkvbTEzNAorL2Rldi9wdHkvbTEzNQorL2Rldi9wdHkvbTEzNgorL2Rldi9wdHkvbTEzNworL2Rldi9wdHkvbTEzOAorL2Rldi9wdHkvbTEzOQorL2Rldi9wdHkvbTE0MAorL2Rldi9wdHkvbTE0MQorL2Rldi9wdHkvbTE0MgorL2Rldi9wdHkvbTE0MworL2Rldi9wdHkvbTE0NAorL2Rldi9wdHkvbTE0NQorL2Rldi9wdHkvbTE0NgorL2Rldi9wdHkvbTE0NworL2Rldi9wdHkvbTE0OAorL2Rldi9wdHkvbTE0OQorL2Rldi9wdHkvbTE1MAorL2Rldi9wdHkvbTE1MQorL2Rldi9wdHkvbTE1MgorL2Rldi9wdHkvbTE1MworL2Rldi9wdHkvbTE1NAorL2Rldi9wdHkvbTE1NQorL2Rldi9wdHkvbTE1NgorL2Rldi9wdHkvbTE1NworL2Rldi9wdHkvbTE1OAorL2Rldi9wdHkvbTE1OQorL2Rldi9wdHkvbTE2MAorL2Rldi9wdHkvbTE2MQorL2Rldi9wdHkvbTE2MgorL2Rldi9wdHkvbTE2MworL2Rldi9wdHkvbTE2NAorL2Rldi9wdHkvbTE2NQorL2Rldi9wdHkvbTE2NgorL2Rldi9wdHkvbTE2NworL2Rldi9wdHkvbTE2OAorL2Rldi9wdHkvbTE2OQorL2Rldi9wdHkvbTE3MAorL2Rldi9wdHkvbTE3MQorL2Rldi9wdHkvbTE3MgorL2Rldi9wdHkvbTE3MworL2Rldi9wdHkvbTE3NAorL2Rldi9wdHkvbTE3NQorL2Rldi9wdHkvbTE3NgorL2Rldi9wdHkvbTE3NworL2Rldi9wdHkvbTE3OAorL2Rldi9wdHkvbTE3OQorL2Rldi9wdHkvbTE4MAorL2Rldi9wdHkvbTE4MQorL2Rldi9wdHkvbTE4MgorL2Rldi9wdHkvbTE4MworL2Rldi9wdHkvbTE4NAorL2Rldi9wdHkvbTE4NQorL2Rldi9wdHkvbTE4NgorL2Rldi9wdHkvbTE4NworL2Rldi9wdHkvbTE4OAorL2Rldi9wdHkvbTE4OQorL2Rldi9wdHkvbTE5MAorL2Rldi9wdHkvbTE5MQorL2Rldi9wdHkvbTE5MgorL2Rldi9wdHkvbTE5MworL2Rldi9wdHkvbTE5NAorL2Rldi9wdHkvbTE5NQorL2Rldi9wdHkvbTE5NgorL2Rldi9wdHkvbTE5NworL2Rldi9wdHkvbTE5OAorL2Rldi9wdHkvbTE5OQorL2Rldi9wdHkvbTIwMAorL2Rldi9wdHkvbTIwMQorL2Rldi9wdHkvbTIwMgorL2Rldi9wdHkvbTIwMworL2Rldi9wdHkvbTIwNAorL2Rldi9wdHkvbTIwNQorL2Rldi9wdHkvbTIwNgorL2Rldi9wdHkvbTIwNworL2Rldi9wdHkvbTIwOAorL2Rldi9wdHkvbTIwOQorL2Rldi9wdHkvbTIxMAorL2Rldi9wdHkvbTIxMQorL2Rldi9wdHkvbTIxMgorL2Rldi9wdHkvbTIxMworL2Rldi9wdHkvbTIxNAorL2Rldi9wdHkvbTIxNQorL2Rldi9wdHkvbTIxNgorL2Rldi9wdHkvbTIxNworL2Rldi9wdHkvbTIxOAorL2Rldi9wdHkvbTIxOQorL2Rldi9wdHkvbTIyMAorL2Rldi9wdHkvbTIyMQorL2Rldi9wdHkvbTIyMgorL2Rldi9wdHkvbTIyMworL2Rldi9wdHkvbTIyNAorL2Rldi9wdHkvbTIyNQorL2Rldi9wdHkvbTIyNgorL2Rldi9wdHkvbTIyNworL2Rldi9wdHkvbTIyOAorL2Rldi9wdHkvbTIyOQorL2Rldi9wdHkvbTIzMAorL2Rldi9wdHkvbTIzMQorL2Rldi9wdHkvbTIzMgorL2Rldi9wdHkvbTIzMworL2Rldi9wdHkvbTIzNAorL2Rldi9wdHkvbTIzNQorL2Rldi9wdHkvbTIzNgorL2Rldi9wdHkvbTIzNworL2Rldi9wdHkvbTIzOAorL2Rldi9wdHkvbTIzOQorL2Rldi9wdHkvbTI0MAorL2Rldi9wdHkvbTI0MQorL2Rldi9wdHkvbTI0MgorL2Rldi9wdHkvbTI0MworL2Rldi9wdHkvbTI0NAorL2Rldi9wdHkvbTI0NQorL2Rldi9wdHkvbTI0NgorL2Rldi9wdHkvbTI0NworL2Rldi9wdHkvbTI0OAorL2Rldi9wdHkvbTI0OQorL2Rldi9wdHkvbTI1MAorL2Rldi9wdHkvbTI1MQorL2Rldi9wdHkvbTI1MgorL2Rldi9wdHkvbTI1MworL2Rldi9wdHkvbTI1NAorL2Rldi9wdHkvbTI1NQorL2Rldi9wdHMKKy9kZXYvcHRzLzAKKy9kZXYvcHRzLzEKKy9kZXYvcHRzLzIKKy9kZXYvcHRzLzMKKy9kZXYvcHRzLzQKKy9kZXYvcHRzLzUKKy9kZXYvcHRzLzYKKy9kZXYvcHRzLzcKKy9kZXYvdmNjCisvZGV2L3ZjYy8wCisvZGV2L3ZjYy9hCisvZGV2L3ZjYy8xCisvZGV2L3ZjYy9hMQorL2Rldi92Y2MvMgorL2Rldi92Y2MvYTIKKy9kZXYvdmNjLzMKKy9kZXYvdmNjL2EzCisvZGV2L3ZjYy81CisvZGV2L3ZjYy9hNQorL2Rldi92Y2MvNAorL2Rldi92Y2MvYTQKKy9kZXYvdmNjLzYKKy9kZXYvdmNjL2E2CisvZGV2L3ZjYy83CisvZGV2L3ZjYy9hNworL2Rldi90dHMKKy9kZXYvdHRzLzAKKy9kZXYvY3VhCisvZGV2L2N1YS8wCisvZGV2L2lkZQorL2Rldi9pZGUvaG9zdDAKKy9kZXYvaWRlL2hvc3QwL2J1czAKKy9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MAorL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAKKy9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wL2Rpc2MKKy9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wL3BhcnQxCisvZGV2L2lkZS9ob3N0MC9idXMwL3RhcmdldDAvbHVuMC9wYXJ0MgorL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDMKKy9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wL3BhcnQ0CisvZGV2L2lkZS9ob3N0MC9idXMwL3RhcmdldDAvbHVuMC9wYXJ0NQorL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQwL2x1bjAvcGFydDYKKy9kZXYvaWRlL2hvc3QwL2J1czAvdGFyZ2V0MC9sdW4wL3BhcnQ3CisvZGV2L2lkZS9ob3N0MC9idXMwL3RhcmdldDAvbHVuMC9wYXJ0OAorL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQxCisvZGV2L2lkZS9ob3N0MC9idXMwL3RhcmdldDEvbHVuMAorL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQxL2x1bjAvZGlzYworL2Rldi9pZGUvaG9zdDAvYnVzMC90YXJnZXQxL2x1bjAvcGFydDEKKy9kZXYvaWRlL2hvc3QwL2J1czEKKy9kZXYvaWRlL2hvc3QwL2J1czEvdGFyZ2V0MAorL2Rldi9pZGUvaG9zdDAvYnVzMS90YXJnZXQwL2x1bjAKKy9kZXYvaWRlL2hvc3QwL2J1czEvdGFyZ2V0MC9sdW4wL2Rpc2MKKy9kZXYvaWRlL2hvc3QwL2J1czEvdGFyZ2V0MC9sdW4wL3BhcnQxCisvZGV2L2lkZS9ob3N0MC9idXMxL3RhcmdldDEKKy9kZXYvaWRlL2hvc3QwL2J1czEvdGFyZ2V0MS9sdW4wCisvZGV2L2Rpc2NzCisvZGV2L2Rpc2NzL2Rpc2MwCisvZGV2L2Rpc2NzL2Rpc2MxCisvZGV2L2Rpc2NzL2Rpc2MyCisvZGV2L2Zsb3BweQorL2Rldi9mbG9wcHkvMHUxNDQwCisvZGV2L2Zsb3BweS8wdTE2ODAKKy9kZXYvZmxvcHB5LzB1MTcyMgorL2Rldi9mbG9wcHkvMHUxNzQzCisvZGV2L2Zsb3BweS8wdTE3NjAKKy9kZXYvZmxvcHB5LzB1MTkyMAorL2Rldi9mbG9wcHkvMHUxODQwCisvZGV2L2Zsb3BweS8wdTE2MDAKKy9kZXYvZmxvcHB5LzB1MzYwCisvZGV2L2Zsb3BweS8wdTcyMAorL2Rldi9mbG9wcHkvMHU4MjAKKy9kZXYvZmxvcHB5LzB1ODMwCisvZGV2L2Zsb3BweS8wdTEwNDAKKy9kZXYvZmxvcHB5LzB1MTEyMAorL2Rldi9mbG9wcHkvMHU4MDAKKy9kZXYvZmxvcHB5LzAKKy9kZXYvbG9vcAorL2Rldi9sb29wLzAKKy9kZXYvbG9vcC8xCisvZGV2L2xvb3AvMgorL2Rldi9sb29wLzMKKy9kZXYvbG9vcC80CisvZGV2L2xvb3AvNQorL2Rldi9sb29wLzYKKy9kZXYvbG9vcC83CisvZGV2L2Nkcm9tcworL2Rldi9zb3VuZAorL2Rldi9zb3VuZC9kc3AKKy9kZXYvc291bmQvZHNwMQorL2Rldi9zb3VuZC9taXhlcgorL2Rldi9zb3VuZC9taWRpCisvZGV2L3VzYgorL2Rldi9yb290CisvZGV2L2luaXRjdGwKKy9kZXYveGNvbnNvbGUKKy9kZXYvZmQKKy9kZXYvc3RkaW4KKy9kZXYvc3Rkb3V0CisvZGV2L3N0ZGVycgorL2Rldi9yb3V0ZQorL2Rldi9za2lwCisvZGV2L1VTRVJTT0NLCisvZGV2L2Z3bW9uaXRvcgorL2Rldi9BUlBECisvZGV2L1JPVVRFNgorL2Rldi9JUDZfRlcKKy9kZXYvdGFwMAorL2Rldi90YXAxCisvZGV2L3RhcDIKKy9kZXYvdGFwMworL2Rldi90YXA0CisvZGV2L3RhcDUKKy9kZXYvdGFwNgorL2Rldi90YXA3CisvZGV2L3RhcDgKKy9kZXYvdGFwOQorL2Rldi90YXAxMAorL2Rldi90YXAxMQorL2Rldi90YXAxMgorL2Rldi90YXAxMworL2Rldi90YXAxNAorL2Rldi90YXAxNQorL2Rldi90dHkxCisvZGV2L3R0eTIKKy9kZXYvdHR5MworL2Rldi90dHk0CisvZGV2L3R0eTUKKy9kZXYvdHR5NgorL2Rldi90dHk3CisvZGV2L3R0eTgKKy9kZXYvdHR5OQorL2Rldi90dHkxMAorL2Rldi90dHkxMQorL2Rldi90dHkxMgorL2Rldi90dHkxMworL2Rldi90dHkxNAorL2Rldi90dHkxNQorL2Rldi90dHkxNgorL2Rldi90dHkxNworL2Rldi90dHkxOAorL2Rldi90dHkxOQorL2Rldi90dHkyMAorL2Rldi90dHkyMQorL2Rldi90dHkyMgorL2Rldi90dHkyMworL2Rldi90dHkyNAorL2Rldi90dHkyNQorL2Rldi90dHkyNgorL2Rldi90dHkyNworL2Rldi90dHkyOAorL2Rldi90dHkyOQorL2Rldi90dHkzMAorL2Rldi90dHkzMQorL2Rldi90dHkzMgorL2Rldi90dHkzMworL2Rldi90dHkzNAorL2Rldi90dHkzNQorL2Rldi90dHkzNgorL2Rldi90dHkzNworL2Rldi90dHkzOAorL2Rldi90dHkzOQorL2Rldi90dHk0MAorL2Rldi90dHk0MQorL2Rldi90dHk0MgorL2Rldi90dHk0MworL2Rldi90dHk0NAorL2Rldi90dHk0NQorL2Rldi90dHk0NgorL2Rldi90dHk0NworL2Rldi90dHk0OAorL2Rldi90dHk0OQorL2Rldi90dHk1MAorL2Rldi90dHk1MQorL2Rldi90dHk1MgorL2Rldi90dHk1MworL2Rldi90dHk1NAorL2Rldi90dHk1NQorL2Rldi90dHk1NgorL2Rldi90dHk1NworL2Rldi90dHk1OAorL2Rldi90dHk1OQorL2Rldi90dHk2MAorL2Rldi90dHk2MQorL2Rldi90dHk2MgorL2Rldi90dHk2MworL2Rldi90dHkwCisvZGV2L3BzYXV4CisvZGV2L3B0eXAwCisvZGV2L3B0eXAxCisvZGV2L3B0eXAyCisvZGV2L3B0eXAzCisvZGV2L3B0eXA0CisvZGV2L3B0eXA1CisvZGV2L3B0eXA2CisvZGV2L3B0eXA3CisvZGV2L3B0eXA4CisvZGV2L3B0eXA5CisvZGV2L3B0eXBhCisvZGV2L3B0eXBiCisvZGV2L3B0eXBjCisvZGV2L3B0eXBkCisvZGV2L3B0eXBlCisvZGV2L3B0eXBmCisvZGV2L3B0eXEwCisvZGV2L3B0eXExCisvZGV2L3B0eXEyCisvZGV2L3B0eXEzCisvZGV2L3B0eXE0CisvZGV2L3B0eXE1CisvZGV2L3B0eXE2CisvZGV2L3B0eXE3CisvZGV2L3B0eXE4CisvZGV2L3B0eXE5CisvZGV2L3B0eXFhCisvZGV2L3B0eXFiCisvZGV2L3B0eXFjCisvZGV2L3B0eXFkCisvZGV2L3B0eXFlCisvZGV2L3B0eXFmCisvZGV2L3B0eXIwCisvZGV2L3B0eXIxCisvZGV2L3B0eXIyCisvZGV2L3B0eXIzCisvZGV2L3B0eXI0CisvZGV2L3B0eXI1CisvZGV2L3B0eXI2CisvZGV2L3B0eXI3CisvZGV2L3B0eXI4CisvZGV2L3B0eXI5CisvZGV2L3B0eXJhCisvZGV2L3B0eXJiCisvZGV2L3B0eXJjCisvZGV2L3B0eXJkCisvZGV2L3B0eXJlCisvZGV2L3B0eXJmCisvZGV2L3B0eXMwCisvZGV2L3B0eXMxCisvZGV2L3B0eXMyCisvZGV2L3B0eXMzCisvZGV2L3B0eXM0CisvZGV2L3B0eXM1CisvZGV2L3B0eXM2CisvZGV2L3B0eXM3CisvZGV2L3B0eXM4CisvZGV2L3B0eXM5CisvZGV2L3B0eXNhCisvZGV2L3B0eXNiCisvZGV2L3B0eXNjCisvZGV2L3B0eXNkCisvZGV2L3B0eXNlCisvZGV2L3B0eXNmCisvZGV2L3B0eXQwCisvZGV2L3B0eXQxCisvZGV2L3B0eXQyCisvZGV2L3B0eXQzCisvZGV2L3B0eXQ0CisvZGV2L3B0eXQ1CisvZGV2L3B0eXQ2CisvZGV2L3B0eXQ3CisvZGV2L3B0eXQ4CisvZGV2L3B0eXQ5CisvZGV2L3B0eXRhCisvZGV2L3B0eXRiCisvZGV2L3B0eXRjCisvZGV2L3B0eXRkCisvZGV2L3B0eXRlCisvZGV2L3B0eXRmCisvZGV2L3B0eXUwCisvZGV2L3B0eXUxCisvZGV2L3B0eXUyCisvZGV2L3B0eXUzCisvZGV2L3B0eXU0CisvZGV2L3B0eXU1CisvZGV2L3B0eXU2CisvZGV2L3B0eXU3CisvZGV2L3B0eXU4CisvZGV2L3B0eXU5CisvZGV2L3B0eXVhCisvZGV2L3B0eXViCisvZGV2L3B0eXVjCisvZGV2L3B0eXVkCisvZGV2L3B0eXVlCisvZGV2L3B0eXVmCisvZGV2L3B0eXYwCisvZGV2L3B0eXYxCisvZGV2L3B0eXYyCisvZGV2L3B0eXYzCisvZGV2L3B0eXY0CisvZGV2L3B0eXY1CisvZGV2L3B0eXY2CisvZGV2L3B0eXY3CisvZGV2L3B0eXY4CisvZGV2L3B0eXY5CisvZGV2L3B0eXZhCisvZGV2L3B0eXZiCisvZGV2L3B0eXZjCisvZGV2L3B0eXZkCisvZGV2L3B0eXZlCisvZGV2L3B0eXZmCisvZGV2L3B0eXcwCisvZGV2L3B0eXcxCisvZGV2L3B0eXcyCisvZGV2L3B0eXczCisvZGV2L3B0eXc0CisvZGV2L3B0eXc1CisvZGV2L3B0eXc2CisvZGV2L3B0eXc3CisvZGV2L3B0eXc4CisvZGV2L3B0eXc5CisvZGV2L3B0eXdhCisvZGV2L3B0eXdiCisvZGV2L3B0eXdjCisvZGV2L3B0eXdkCisvZGV2L3B0eXdlCisvZGV2L3B0eXdmCisvZGV2L3B0eXgwCisvZGV2L3B0eXgxCisvZGV2L3B0eXgyCisvZGV2L3B0eXgzCisvZGV2L3B0eXg0CisvZGV2L3B0eXg1CisvZGV2L3B0eXg2CisvZGV2L3B0eXg3CisvZGV2L3B0eXg4CisvZGV2L3B0eXg5CisvZGV2L3B0eXhhCisvZGV2L3B0eXhiCisvZGV2L3B0eXhjCisvZGV2L3B0eXhkCisvZGV2L3B0eXhlCisvZGV2L3B0eXhmCisvZGV2L3B0eXkwCisvZGV2L3B0eXkxCisvZGV2L3B0eXkyCisvZGV2L3B0eXkzCisvZGV2L3B0eXk0CisvZGV2L3B0eXk1CisvZGV2L3B0eXk2CisvZGV2L3B0eXk3CisvZGV2L3B0eXk4CisvZGV2L3B0eXk5CisvZGV2L3B0eXlhCisvZGV2L3B0eXliCisvZGV2L3B0eXljCisvZGV2L3B0eXlkCisvZGV2L3B0eXllCisvZGV2L3B0eXlmCisvZGV2L3B0eXowCisvZGV2L3B0eXoxCisvZGV2L3B0eXoyCisvZGV2L3B0eXozCisvZGV2L3B0eXo0CisvZGV2L3B0eXo1CisvZGV2L3B0eXo2CisvZGV2L3B0eXo3CisvZGV2L3B0eXo4CisvZGV2L3B0eXo5CisvZGV2L3B0eXphCisvZGV2L3B0eXpiCisvZGV2L3B0eXpjCisvZGV2L3B0eXpkCisvZGV2L3B0eXplCisvZGV2L3B0eXpmCisvZGV2L3B0eWEwCisvZGV2L3B0eWExCisvZGV2L3B0eWEyCisvZGV2L3B0eWEzCisvZGV2L3B0eWE0CisvZGV2L3B0eWE1CisvZGV2L3B0eWE2CisvZGV2L3B0eWE3CisvZGV2L3B0eWE4CisvZGV2L3B0eWE5CisvZGV2L3B0eWFhCisvZGV2L3B0eWFiCisvZGV2L3B0eWFjCisvZGV2L3B0eWFkCisvZGV2L3B0eWFlCisvZGV2L3B0eWFmCisvZGV2L3B0eWIwCisvZGV2L3B0eWIxCisvZGV2L3B0eWIyCisvZGV2L3B0eWIzCisvZGV2L3B0eWI0CisvZGV2L3B0eWI1CisvZGV2L3B0eWI2CisvZGV2L3B0eWI3CisvZGV2L3B0eWI4CisvZGV2L3B0eWI5CisvZGV2L3B0eWJhCisvZGV2L3B0eWJiCisvZGV2L3B0eWJjCisvZGV2L3B0eWJkCisvZGV2L3B0eWJlCisvZGV2L3B0eWJmCisvZGV2L3B0eWMwCisvZGV2L3B0eWMxCisvZGV2L3B0eWMyCisvZGV2L3B0eWMzCisvZGV2L3B0eWM0CisvZGV2L3B0eWM1CisvZGV2L3B0eWM2CisvZGV2L3B0eWM3CisvZGV2L3B0eWM4CisvZGV2L3B0eWM5CisvZGV2L3B0eWNhCisvZGV2L3B0eWNiCisvZGV2L3B0eWNjCisvZGV2L3B0eWNkCisvZGV2L3B0eWNlCisvZGV2L3B0eWNmCisvZGV2L3B0eWQwCisvZGV2L3B0eWQxCisvZGV2L3B0eWQyCisvZGV2L3B0eWQzCisvZGV2L3B0eWQ0CisvZGV2L3B0eWQ1CisvZGV2L3B0eWQ2CisvZGV2L3B0eWQ3CisvZGV2L3B0eWQ4CisvZGV2L3B0eWQ5CisvZGV2L3B0eWRhCisvZGV2L3B0eWRiCisvZGV2L3B0eWRjCisvZGV2L3B0eWRkCisvZGV2L3B0eWRlCisvZGV2L3B0eWRmCisvZGV2L3B0eWUwCisvZGV2L3B0eWUxCisvZGV2L3B0eWUyCisvZGV2L3B0eWUzCisvZGV2L3B0eWU0CisvZGV2L3B0eWU1CisvZGV2L3B0eWU2CisvZGV2L3B0eWU3CisvZGV2L3B0eWU4CisvZGV2L3B0eWU5CisvZGV2L3B0eWVhCisvZGV2L3B0eWViCisvZGV2L3B0eWVjCisvZGV2L3B0eWVkCisvZGV2L3B0eWVlCisvZGV2L3B0eWVmCisvZGV2L3ZjcworL2Rldi92Y3NhCisvZGV2L3ZjczEKKy9kZXYvdmNzYTEKKy9kZXYvdHR5UzAKKy9kZXYvY3VhMAorL2Rldi9oZGEKKy9kZXYvaGRhMQorL2Rldi9oZGEyCisvZGV2L2hkYTMKKy9kZXYvaGRhNAorL2Rldi9oZGE1CisvZGV2L2hkYTYKKy9kZXYvaGRhNworL2Rldi9oZGE4CisvZGV2L2hkYgorL2Rldi9oZGIxCisvZGV2L2hkYworL2Rldi9oZGMxCisvZGV2L2ZkMHUxNDQwCisvZGV2L2ZkMHUxNjgwCisvZGV2L2ZkMHUxNzIyCisvZGV2L2ZkMHUxNzQzCisvZGV2L2ZkMHUxNzYwCisvZGV2L2ZkMHUxOTIwCisvZGV2L2ZkMHUxODQwCisvZGV2L2ZkMHUxNjAwCisvZGV2L2ZkMHUzNjAKKy9kZXYvZmQwdTcyMAorL2Rldi9mZDB1ODIwCisvZGV2L2ZkMHU4MzAKKy9kZXYvZmQwdTEwNDAKKy9kZXYvZmQwdTExMjAKKy9kZXYvZmQwdTgwMAorL2Rldi9mZDAKKy9kZXYvbG9vcDAKKy9kZXYvbG9vcDEKKy9kZXYvbG9vcDIKKy9kZXYvbG9vcDMKKy9kZXYvbG9vcDQKKy9kZXYvbG9vcDUKKy9kZXYvbG9vcDYKKy9kZXYvbG9vcDcKKy9kZXYvZHNwCisvZGV2L2RzcDEKKy9kZXYvbWl4ZXIKKy9kZXYvbWlkaQorL2Rldi9sdm0KKy9kZXYvdmcwCisvZGV2L3ZnMC9ncm91cAorL2Rldi92ZzAvcGFja2FnZXMKKy9kZXYvdmcwL3Bob3RvcworL2Rldi92ZzAvbXVzaWMKKy9kZXYvbG9nCisvZGV2L01BS0VERVYKKy9kZXYvcHJpbnRlcgorL2Rldi92Y3MyCisvZGV2L3Zjc2EyCisvZGV2L3ZjczMKKy9kZXYvdmNzYTMKKy9kZXYvdmNzNQorL2Rldi92Y3NhNQorL2Rldi92Y3M0CisvZGV2L3Zjc2E0CisvZGV2L3ZjczYKKy9kZXYvdmNzYTYKKy9kZXYvbnZpZGlhMAorL2Rldi9udmlkaWExCisvZGV2L252aWRpYTIKKy9kZXYvbnZpZGlhMworL2Rldi9udmlkaWFjdGwKKy9kZXYvdmNzNworL2Rldi92Y3NhNwpkaWZmIC0tZ2l0IGEvdW5pdC10ZXN0cy9yZWdleC9tYXRjaGVyX3QuYyBiL3VuaXQtdGVzdHMvcmVnZXgvbWF0Y2hlcl90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NzVhMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXQtdGVzdHMvcmVnZXgvbWF0Y2hlcl90LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTFZNMi4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJkZXZtYXBwZXIuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworCitzdGF0aWMgaW50IF9yZWFkX3NwZWMoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqKipyZWdleCwgaW50ICpucmVnZXgpCit7CisJY2hhciBidWZmZXJbMTAyNF0sICpzdGFydCwgKnB0cjsKKwlGSUxFICpmcCA9IGZvcGVuKGZpbGUsICJyIik7CisJaW50IGFzaXplID0gMTAwOworCWNoYXIgKipyeCA9IGRtX21hbGxvYyhzaXplb2YoKnJ4KSAqIGFzaXplKTsKKwlpbnQgbnIgPSAwOworCisJaWYgKCFmcCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSxmcCkpIHsKKworCQkvKiB0cmltIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCQlmb3IgKHB0ciA9IGJ1ZmZlcjsgKnB0ciAmJiBpc3NwYWNlKChpbnQpICpwdHIpOyBwdHIrKyk7CisKKwkJaWYgKCEqcHRyIHx8ICpwdHIgPT0gJyMnKQorCQkJY29udGludWU7CisKKwkJaWYgKCpwdHIgPT0gJ1wiJykgeworCQkJcHRyKys7CisJCQlzdGFydCA9IHB0cjsKKwkJCXdoaWxlICgqcHRyICYmICpwdHIgIT0gJ1wiJykgeworCQkJCWlmICgqcHRyID09ICdcXCcpCisJCQkJCXB0cisrOworCQkJCXB0cisrOworCQkJfQorCisJCQlpZiAoISpwdHIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZvcm1hdHRpbmcgZXJyb3IgOiAiCisJCQkJCSJObyB0ZXJtaW5hdGluZyBxdW90ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXJ4W25yXSA9IGRtX21hbGxvYygocHRyIC0gc3RhcnQpICsgMSk7CisJCQlzdHJuY3B5KHJ4W25yXSwgc3RhcnQsIHB0ciAtIHN0YXJ0KTsKKwkJCXJ4W25yXVtwdHIgLSBzdGFydF0gPSAnXDAnOworCQkJbnIrKzsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBwdHIpOworCQkJZnByaW50ZihzdGRlcnIsICJGb3JtYXR0aW5nIGVycm9yIDogXCI8cmVnZXg+XCIgIgorCQkJCSI8dG9rZW5fbmFtZT5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkqcmVnZXggPSByeDsKKwkqbnJlZ2V4ID0gbnI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9mcmVlX3JlZ2V4KGNoYXIgKipyZWdleCwgaW50IG5yZWdleCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJlZ2V4OyBpKyspCisJCWRtX2ZyZWUocmVnZXhbaV0pOworCisJZG1fZnJlZShyZWdleCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zY2FuX2lucHV0KHN0cnVjdCBkbV9yZWdleCAqbSwgY2hhciAqKnJlZ2V4KQoreworCWNoYXIgYnVmZmVyWzI1Nl0sICpwdHI7CisJaW50IHI7CisKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RkaW4pKSB7CisJCWlmICgocHRyID0gc3RyY2hyKGJ1ZmZlciwgJ1xuJykpKQorCQkJKnB0ciA9ICdcMCc7CisKKwkJciA9IGRtX3JlZ2V4X21hdGNoKG0sIGJ1ZmZlcik7CisKKwkJaWYgKHIgPj0gMCkKKwkJCXByaW50ZigiJXMgOiAlc1xuIiwgYnVmZmVyLCByZWdleFtyXSk7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGRtX3Bvb2wgKm1lbTsKKwlzdHJ1Y3QgZG1fcmVnZXggKnNjYW5uZXI7CisJY2hhciAqKnJlZ2V4OworCWludCBucmVnZXg7CisJaW50IHJldCA9IDA7CisJaW50IHdhbnRfZmluZ2VyX3ByaW50ID0gMCwgaTsKKwljb25zdCBjaGFyICpwYXR0ZXJuX2ZpbGUgPSBOVUxMOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tZmluZ2VycHJpbnQiKSkKKwkJCXdhbnRfZmluZ2VyX3ByaW50ID0gMTsKKworCQllbHNlCisJCQlwYXR0ZXJuX2ZpbGUgPSBhcmd2W2ldOworCisJaWYgKCFwYXR0ZXJuX2ZpbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZSA6ICVzIFstLWZpbmdlcnByaW50XSA8cGF0dGVybl9maWxlPlxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJZG1fbG9nX2luaXRfdmVyYm9zZShfTE9HX0RFQlVHKTsKKworCWlmICghKG1lbSA9IGRtX3Bvb2xfY3JlYXRlKCJtYXRjaF9yZWdleCIsIDEwICogMTAyNCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgY3JlYXRlIHBvb2xcbiIpOworCQlyZXQgPSAyOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIV9yZWFkX3NwZWMocGF0dGVybl9maWxlLCAmcmVnZXgsICZucmVnZXgpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgcmVhZCB0aGUgbGV4IHNwZWNpZmljYXRpb25cbiIpOworCQlyZXQgPSAzOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIShzY2FubmVyID0gZG1fcmVnZXhfY3JlYXRlKG1lbSwgKGNvbnN0IGNoYXIgKiopcmVnZXgsIG5yZWdleCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgYnVpbGQgdGhlIGxleGVyXG4iKTsKKwkJcmV0ID0gNDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHdhbnRfZmluZ2VyX3ByaW50KQorCQlwcmludGYoImZpbmdlcnByaW50OiAleFxuIiwgZG1fcmVnZXhfZmluZ2VycHJpbnQoc2Nhbm5lcikpOworCV9zY2FuX2lucHV0KHNjYW5uZXIsIHJlZ2V4KTsKKwlfZnJlZV9yZWdleChyZWdleCwgbnJlZ2V4KTsKKworICAgIGVycjoKKwlkbV9wb29sX2Rlc3Ryb3kobWVtKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91bml0LXRlc3RzL3JlZ2V4L21hdGNoZXJfdC5leHBlY3RlZCBiL3VuaXQtdGVzdHMvcmVnZXgvbWF0Y2hlcl90LmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTg2YjAKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL3JlZ2V4L21hdGNoZXJfdC5leHBlY3RlZApAQCAtMCwwICsxLDE2IEBACitmaW5nZXJwcmludDogMzUyYjZjNGYKKy9kZXYvbG9vcC8wIDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC8xIDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC8yIDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC8zIDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC80IDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC81IDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC82IDogbG9vcC9bMC05XSsKKy9kZXYvbG9vcC83IDogbG9vcC9bMC05XSsKKy9kZXYvaGRhMSA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRhMiA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRhMyA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRhNCA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRhNSA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRiMSA6IGhkW2EtZF1bMC01XSsKKy9kZXYvaGRjMSA6IGhkW2EtZF1bMC01XSsKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvbWF0Y2hlcl90LmV4cGVjdGVkMiBiL3VuaXQtdGVzdHMvcmVnZXgvbWF0Y2hlcl90LmV4cGVjdGVkMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzU5OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9yZWdleC9tYXRjaGVyX3QuZXhwZWN0ZWQyCkBAIC0wLDAgKzEgQEAKK2ZpbmdlcnByaW50OiBlZWQ4Y2ViOApkaWZmIC0tZ2l0IGEvdW5pdC10ZXN0cy9yZWdleC9tYXRjaGVyX3QuZXhwZWN0ZWQzIGIvdW5pdC10ZXN0cy9yZWdleC9tYXRjaGVyX3QuZXhwZWN0ZWQzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNTYxNDkKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL3JlZ2V4L21hdGNoZXJfdC5leHBlY3RlZDMKQEAgLTAsMCArMSwzIEBACitmb2+AYmFyIDoggAorZm9vwmIgOiBmb2/CYgorgCA6IIAKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvbm9ucHJpbnRfaW5wdXQgYi91bml0LXRlc3RzL3JlZ2V4L25vbnByaW50X2lucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTE4MDcKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL3JlZ2V4L25vbnByaW50X2lucHV0CkBAIC0wLDAgKzEsNCBAQAorZm9vLmJhcgorZm9vgGJhcgorZm9vwmIKK4AKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvbm9ucHJpbnRfcmVnZXhlcyBiL3VuaXQtdGVzdHMvcmVnZXgvbm9ucHJpbnRfcmVnZXhlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY0YzIxCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdC10ZXN0cy9yZWdleC9ub25wcmludF9yZWdleGVzCkBAIC0wLDAgKzEsMyBAQAorImZvb4BiYXIiCisiZm9vwmIiCisigCIKZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvcGFyc2VfdC5jIGIvdW5pdC10ZXN0cy9yZWdleC9wYXJzZV90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXQtdGVzdHMvcmVnZXgvcGFyc2VfdC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExWTTIuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBoYWNrIC0gdXNpbmcgdW5leHBvcnRlZCBpbnRlcm5hbCBmdW5jdGlvbiAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgInJlZ2V4L3BhcnNlX3J4LmMiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK3N0YXRpYyB2b2lkIF9wcmV0dHlfcHJpbnQoc3RydWN0IHJ4X25vZGUgKnJ4LCBpbnQgZGVwdGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspCisJCXByaW50ZigiICIpOworCisJLyogZGlzcGxheSBpbmZvIGFib3V0IHRoZSBub2RlICovCisJc3dpdGNoIChyeC0+dHlwZSkgeworCWNhc2UgQ0FUOgorCQlwcmludGYoIkNhdCIpOworCQlicmVhazsKKworCWNhc2UgT1I6CisJCXByaW50ZigiT3IiKTsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVI6CisJCXByaW50ZigiU3RhciIpOworCQlicmVhazsKKworCWNhc2UgUExVUzoKKwkJcHJpbnRmKCJQbHVzIik7CisJCWJyZWFrOworCisJY2FzZSBRVUVTVDoKKwkJcHJpbnRmKCJRdWVzdCIpOworCQlicmVhazsKKworCWNhc2UgQ0hBUlNFVDoKKwkJcHJpbnRmKCJDaGFyc2V0IDogIik7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJaWYgKGRtX2JpdChyeC0+Y2hhcnNldCwgaSkgJiYgaXNwcmludChpKSkKKwkJCQlwcmludGYoIiVjIiwgKGNoYXIpIGkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIHR5cGUiKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJaWYgKHJ4LT5sZWZ0KQorCQlfcHJldHR5X3ByaW50KHJ4LT5sZWZ0LCBkZXB0aCArIDEpOworCisJaWYgKHJ4LT5yaWdodCkKKwkJX3ByZXR0eV9wcmludChyeC0+cmlnaHQsIGRlcHRoICsgMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZG1fcG9vbCAqbWVtOworCXN0cnVjdCByeF9ub2RlICpyeDsKKwlpbnQgcmVnZXhfcHJpbnQgPSAwOworCWludCBzaG93X25vZGVzID0gMDsKKwlpbnQgcmVnZXhfYXJnID0gMTsKKworCWlmIChhcmdjID09IDMgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXIiKSkgeworCQlyZWdleF9wcmludCsrOworCQlyZWdleF9hcmcrKzsKKwkJYXJnYy0tOworCX0KKworCWlmIChhcmdjID09IDMgJiYgIXN0cmNtcChhcmd2WzFdLCAiLVIiKSkgeworCQlyZWdleF9wcmludCsrOworCQlzaG93X25vZGVzKys7CisJCXJlZ2V4X2FyZysrOworCQlhcmdjLS07CisJfQorCisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlIDogJXMgWy1yXSA8cmVnZXg+XG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlkbV9sb2dfaW5pdF92ZXJib3NlKF9MT0dfREVCVUcpOworCisJaWYgKCEobWVtID0gZG1fcG9vbF9jcmVhdGUoInBhcnNlX3JlZ2V4IiwgMTAyNCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgY3JlYXRlIHBvb2xcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghKHJ4ID0gcnhfcGFyc2Vfc3RyKG1lbSwgYXJndltyZWdleF9hcmddKSkpIHsKKwkJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgcGFyc2UgcmVnZXhcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChyZWdleF9wcmludCkKKwkJX3JlZ2V4X3ByaW50KHJ4LCAwLCBzaG93X25vZGVzKTsKKwllbHNlCisJCV9wcmV0dHlfcHJpbnQocngsIDApOworCisJZG1fcG9vbF9kZXN0cm95KG1lbSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaXQtdGVzdHMvcmVnZXgvcmFuZG9tX3JlZ2V4ZXMgYi91bml0LXRlc3RzL3JlZ2V4L3JhbmRvbV9yZWdleGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTM2MmQKLS0tIC9kZXYvbnVsbAorKysgYi91bml0LXRlc3RzL3JlZ2V4L3JhbmRvbV9yZWdleGVzCkBAIC0wLDAgKzEsMTAwIEBACisiKCgoYT8pKChbVWJdKil8eikpKCgoW3FyXXxYKSspKFtRbl0qKSkpKyIKKyJbSFplanR1d10qIgorIigoQnxzKSopfCgoKChbRnZdbCkoTispKSgoW2VsXXxDKSh0SikpKT8pIgorIigoKFtNYV0/KXwodCopKSopfCgoKFtjbV1FKXwoTT8pKXwoKFtCRV1bRVZdKXwoW1FqXVtNaF0pKSkiCisiKCgoKFtid10qKXwoW0lPXSopKSgoekspKikpfCgoKHBVKXwoaXxxKSl8KCh6Pyl8KFtITF0/KSkpKSoiCisiKCgoW1B0XT8pfFtUcl0pPykoKEhxKSopIgorIltIT1hjZmdpa29zdnd4el0iCisiW0JDRUZHSE5QVFVXZmpscHJzeV0iCisiKCgoKGFEKSopfChbWG9dKykpKykoKFtIS25dKChbRXFdfFtKUV0pKEkqKSkpKikiCisiKFtMTldZZWdodl18ZSkqIgorIigoKHkoTCopKSopfCgoKFtFUF0rKShXKykpKikpKiIKKyJVKiIKKyIoKCgoUispKFd8W1FyXSkpfChbcHldKykpKykoW0xNXSopIgorIigoW0RPanhdKEQoYj8pKSl8KFtLZV0qKSkqIgorIigoKFtsc10oY3xbRlRdKSkqKShbSlNdKikpKiIKKyIoKGw/KXwoKFtHel0rKXwoRCopKSkqIgorIltBQmdqbl0iCisiKCgocXxbZGddKT8pfChbVWtdKikpKCgoW0ZsXT8pfChbUnldKykpfCgoW0lSXXxjKXwoVD8pKSkiCisiKCgoW2FuXXxQKXxbSnddKSgoYSopfChtKikpKSoiCisiKCgoKFJbaHRdKShoKykpPyl8KChbcHpdKG4/KSkrKSkrIgorIigoKChbRGNdYikoW1NwXVtJaV0pKXwoKGt8RikqKSl8W1Vpb3Z6XSkqIgorIltSZXNdKiIKKyJbWmxdfGEiCisiXltBTlpkZl0kIgorIltFbl18KCgoUSspKFUrKSkoW3B0XSopKSIKKyJbQURFSU1RVVdYWmhrbHJzdnpdIgorIigoKFMoeSopKSopfChqKikpKiIKKyJuKiIKKyJbTlVhdV0qIgorIigoKChaKikoRHxbTmRdKSl8KChbbnBdfEIpKykpfCgoW1h5XVtGaV0pKikpKyIKKyIoKChbRVpdPyl8KGRbSFJdKSkqKSgoKFtIZ118cSkoUCspKSopIgorInEiCisiKChtKil8KHB8QikpfCgoKCh4Pyl8KHQrKSkoKFtTYl1bUFhdKShPfFtITV0pKSkrKSIKKyIoKCgoQSopKHpbUlNdKSkqKXwoKCh6KykoUSopKSspKSoiCisiKCgoTSopKFtVdV0qKSkrKXxbVWtdIgorIltpbXZdIgorIltHTFNjaHR3XSgoW1l3XSgoRltEZF0pfChbVHddKykpKT8pIgorIihbTU9aal0qKShTfFtXa25yXSkiCisiKChHfHEpKilbQkhLTl0iCisiKCgoKE5XKXwoW0FvXT8pKXwoKGx8W1VWXSkrKSkrKXwoKGl8KHoqKSkqKSIKKyIoKCgoWispfChbSVJdPykpfChMKikpfChbSktRXSspKSsiCisiKFtCZGluXShTKikpKyIKKyJbSExOU1RwXSoiCisiKCgoSiopKFtCcV18W1l1XSkpKil8KFtLdl0qKSIKKyIoKCgoW0JKXXxbWnldKSh3SSkpKikoeSopKSsiCisiKCgoaEYpKyl8KEgqKSkqIgorIigoKFtRVV1bUGpdKShbR1FdPykpKyl8W1BXb10iCisiKCgoKFtjcV1bQlhdKT8pfCgoZltESV0pKikpKikoKFtHTV0qKVtTVllyXSkiCisiKChbWnRdKil8KChxeCl8KChbQlZdKykoZj8pKSkpKiIKKyJbSUxXWWhzeF0qIgorIigoW1V5XSopfFtzdl0pfChbTlNjXSopIgorIigoYyopfChbSlVmaHldPykpKyIKKyIoKChxKikoW1NvXSopKSgoKGdbanFdKShqPykpKykpKiIKKyIoKGIrKXwoKChUKykoW2Z3XVQpKT8pKSoiCisiKCgoW0RTXT8pfChbVGhdfHUpKShRKikpKiIKKyJbRktMWF18KCgoW2Z3XShMPykpKChbZ3FdKil8KE8/KSkpPykiCisiKCgoW0haXSspdSkqKXxbQVBXaWpuXSIKKyIoZSopfCgoKHY/KXwoKEorKShIYikpKT8pIgorIihlfCgodyspZikpKiIKKyJbQkVIS1BRVmRlbG5xeV0iCisiKCgoKEJ8TikocyopKXxbUnJdKSgoKGc/KXwoW3J2XSspKSspKSsiCisiKCgocyopfChLKikpKFtBUF1HKSkqIgorIltDRUxUcF0iCisiKChbRnFdPyl8KFtBbF0rKSkqIgorIigoKChyPyl8KHlbanhdKSl8KFttcF0qKSkrKXwoKEIoUyopKSopIgorIigoKFtFcV0rKXwoWVtkc10pKXwoeHwoaXxbS3VdKSkpW0lKTnJ2eV0iCisiKCgoW05PXSopW0l4XSkrKShbSmVucV0rKSIKKyIoKCgoW0hQXSopKGp8eSkpKilbWWxxdnldKSoiCisiW1BUdl0rIgorIltBSU5TWmhweF18KFtFT1laXSopIgorIihbQUJDRlF2XSopKCgoW1p4XXxoKSspfChbZWpdKikpIgorIigoKFtwcl0qKXwoKFtEcV18cCl8KEg/KSkpPykoW05SVVhtb3FdKikiCisiKChbZXJdKil8KFtteF0qKSkoKChuVikoW2FtXT8pKSspIgorIltCSFBSbHB1XSIKKyIoKCgoW0FoXXxbdHhdKXwoZXxbdXldKSk/KSgoKFtmbF0rKShbVnpdfHYpKSopKSoiCisiW0FHZG1dIgorIigoKEsqKV4oTyopJCl8KEI/KSkqIgorIigoKFtLc118W0thXSkqKXwoW0ZTVGFiXT8pKT8iCisiKChba3ddKylbZWldKSgoW0h5XSopKChbTWNdKil8KEd8ZikpKSIKKyIoKCgoZSopfChaZikpfChSfFtucV0pKSgoKFtKel12KShbUmpdKykpKykpKiIKKyIoKChhPyl8KGU/KSkoKFtVY10qKShTKykpKSoiCisiKCgoKEUrKShbTVpdPykpKyl8KCgoc3xbQXpdKXx6KSopKT8iCisiKCgoKGlbTU9dKSopfCgoTEgpKikpfCgoKEJBKXwoW0FJXSspKXxbVWddKSkqIgorIltFR0hJTGNob10qIgorIigoKFpbdnddKT8pKCh6fGcpKykpKCgoSHxVKShbaXZdUSkpfChbcXddPykpIgorIigoW2VobXJdfCgoTFtVd10pKikpKykoKGErKUkpIgorIltFS05TV1lhZ2pdKCgodnxbVFhdKXwoW1VrXSspKSopIgorIigoKFJbTW9dKXwoTyopKXwoW0ZtXXwoW3F3XSopKSkoKG0qKXwoKFN8W0tpXSk/KSkiCisiKCgoKGtQKXxjKT8pKCgoW2RvXSspfChbR2ldPykpKikpKiIKKyIoKF4oQnxXKSR8KFtXd10rKSkoW25vXSopKXwoKChbaXZdPyl8KE0qKSl8KCh4fEwpPykpIgorIltBRUdQUlNiY2Zoc3ldIgorIltXYmNmXXwoKChbTU9dPyl8KFtOVF18bSkpKChbT29dPykoW1dnXSopKSkiCisiKCgoWVopKilbUFFWZWldKSoiCisiW0dKS1l0XVtBRUdXZGVnbW50XSIKKyJeW0NERUdKS05VVllaYWdrdl0kIgorIihbRFBXYnhdKil8KCgocXxCKXwoUHx1KSkoKE1bQnFdKSopKSIKKyJbRkhJSlJUVllaZGlvcnN1dnpdKiIKKyIoW01Xb3F2el0qKXxeKGwqKSIKKyIoKChJfFtSeF0pKikoKFhbTWZdKShbWGFdTCkpKShbSGFdfChbSFldKikpIgorIigoKGx8W1NkXSkqKSgoKFtJeF0rKXwoW1hZXT8pKShaKikpKSsiCg==